initial import
diff --git a/sw/inc/acmplwrd.hxx b/sw/inc/acmplwrd.hxx
new file mode 100644
index 0000000..046c44a
--- /dev/null
+++ b/sw/inc/acmplwrd.hxx
@@ -0,0 +1,105 @@
/*************************************************************************
 *
 *  $RCSfile: acmplwrd.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:24 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _ACMPLWRD_HXX
#define _ACMPLWRD_HXX


#define _SVSTDARR_STRINGSISORTDTOR
#include <svtools/svstdarr.hxx>


class SwAutoCompleteWord
{
    SvStringsISortDtor aWordLst;
    SvPtrarr aLRULst;
    USHORT nMaxCount, nMinWrdLen;
    BOOL bLockWordLst;
public:
    SwAutoCompleteWord( USHORT nWords = 500, USHORT nMWrdLen = 10 );
    ~SwAutoCompleteWord();

    BOOL InsertWord( const String& rWord );
    BOOL RemoveWord( const String& rWord );
    BOOL SearchWord( const String& rWord, USHORT* pFndPos = 0 ) const;

    BOOL GetRange( const String& rWord, USHORT& rStt, USHORT& rEnd ) const;

    BOOL SetToTop( const String& rWord );

    USHORT Count() const { return aWordLst.Count(); }

    const String& operator[]( USHORT n ) const { return *aWordLst[ n ]; }

    BOOL IsLockWordLstLocked() const        { return bLockWordLst; }
    void SetLockWordLstLocked( BOOL bFlag ) { bLockWordLst = bFlag; }

    USHORT GetMaxCount() const              { return nMaxCount; }
    void SetMaxCount( USHORT n );

    USHORT GetMinWordLen() const                { return nMinWrdLen; }
    void SetMinWordLen( USHORT n );

    const SvStringsISortDtor& GetWordList() const { return aWordLst; }
    void CheckChangedList( const SvStringsISortDtor& rNewLst );
};


#endif
diff --git a/sw/inc/authfld.hxx b/sw/inc/authfld.hxx
new file mode 100644
index 0000000..d0d69c9
--- /dev/null
+++ b/sw/inc/authfld.hxx
@@ -0,0 +1,222 @@
/*************************************************************************
 *
 *  $RCSfile: authfld.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:24 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _AUTHFLD_HXX
#define _AUTHFLD_HXX

#ifndef _FLDBAS_HXX
#include <fldbas.hxx>
#endif
#ifndef _TOXE_HXX
#include <toxe.hxx>
#endif

class SwAuthDataArr;
/* -----------------21.09.99 13:32-------------------

 --------------------------------------------------*/
class SwAuthEntry
{
    String      aAuthFields[AUTH_FIELD_END];
    USHORT      nRefCount;
public:
    SwAuthEntry() : nRefCount(0){}
    SwAuthEntry( const SwAuthEntry& rCopy );
    BOOL            operator==(const SwAuthEntry& rComp);

    BOOL                    GetFirstAuthorField(USHORT& nPos, String& rToFill)const;
    BOOL                    GetNextAuthorField(USHORT& nPos, String& rToFill)const;
    inline const String&    GetAuthorField(ToxAuthorityField ePos)const;
    inline void             SetAuthorField(ToxAuthorityField ePos,
                                            const String& rField);

    void            AddRef()                { ++nRefCount; }
    void            RemoveRef()             { --nRefCount; }
    USHORT          GetRefCount()           { return nRefCount; }
};
/* -----------------20.10.99 16:49-------------------

 --------------------------------------------------*/
struct SwTOXSortKey
{
    ToxAuthorityField   eField;
    BOOL                bSortAscending;
    SwTOXSortKey() :
        eField(AUTH_FIELD_END),
        bSortAscending(TRUE){}
};

/* -----------------14.09.99 16:15-------------------

 --------------------------------------------------*/
class SvUShorts;
class SwAuthorityField;
class SvLongs;
class SortKeyArr;
class SwAuthorityFieldType : public SwFieldType
{
    SwDoc*          m_pDoc;
    SwAuthDataArr*  m_pDataArr;
    SvLongs*        m_pSequArr;
    SortKeyArr*     m_pSortKeyArr;
    char            m_cPrefix;
    char            m_cSuffix;
    BOOL            m_bIsSequence :1;
    BOOL            m_bSortByDocument :1;

    const SwAuthorityFieldType& operator=( const SwAuthorityFieldType& );

public:
    SwAuthorityFieldType(SwDoc* pDoc);
    SwAuthorityFieldType( const SwAuthorityFieldType& );
    ~SwAuthorityFieldType();

    virtual SwFieldType* Copy()    const;
    virtual void        Modify( SfxPoolItem *pOld, SfxPoolItem *pNew );

    inline SwDoc*   GetDoc() const                      { return m_pDoc; }
    inline void     SetDoc(SwDoc* pNewDoc)              { m_pDoc = pNewDoc; }

    void                RemoveField(long nHandle);
    long                AddField(const String& rFieldContents);
    BOOL                AddField(long nHandle);

    const SwAuthEntry*  GetEntryByHandle(long nHandle) const;

    void                GetAllEntryIdentifiers( SvStringsDtor& rToFill )const;
    const SwAuthEntry*  GetEntryByIdentifier(const String& rIdentifier)const;

    void                ChangeEntryContent(const SwAuthEntry* pNewEntry);
    // import interface
    USHORT              AppendField(const SwAuthEntry& rInsert);
    void                MergeFieldType(const SwAuthorityFieldType& rNew, SvUShorts& rMap);
    void                RemoveUnusedFields();
    long                GetHandle(USHORT nPos);
    USHORT              GetPosition(long nHandle);

    USHORT              GetEntryCount() const;
    const SwAuthEntry*  GetEntryByPosition(USHORT nPos) const;

    USHORT              GetSequencePos(long nHandle);

    BOOL                IsSequence() const      {return m_bIsSequence;}
    void                SetSequence(BOOL bSet)  {m_bIsSequence = bSet;}

    void                SetPreSuffix(char cPre, char cSuf)
                            {
                                m_cPrefix = cPre;
                                m_cSuffix = cSuf;
                            }
    char                GetPrefix() const { return m_cPrefix;}
    char                GetSuffix() const { return m_cSuffix;}

    BOOL                IsSortByDocument() const {return m_bSortByDocument;}
    void                SetSortByDocument(BOOL bSet) {m_bSortByDocument = bSet;}

    USHORT              GetSortKeyCount() const ;
    const SwTOXSortKey* GetSortKey(USHORT nIdx) const ;
    void                SetSortKeys(USHORT nKeyCount, SwTOXSortKey nKeys[]);

    //initui.cxx
    static const String&    GetAuthFieldName(ToxAuthorityField eType);
    static const String&    GetAuthTypeName(ToxAuthorityType eType);

};
/* -----------------14.09.99 16:15-------------------

 --------------------------------------------------*/
class SwAuthorityField : public SwField
{
    long    nHandle;

public:
    SwAuthorityField(SwAuthorityFieldType* pType, const String& rFieldContents);
    SwAuthorityField(SwAuthorityFieldType* pType, long nHandle);
    ~SwAuthorityField();

    const String&       GetFieldText(ToxAuthorityField eField) const;

    virtual String      Expand() const;
    virtual SwField*    Copy() const;
    virtual void        SetPar1(const String& rStr);
    virtual SwFieldType* ChgTyp( SwFieldType* );

    long                GetHandle() const       { return nHandle; }

    //import interface
    USHORT              GetHandlePosition() const;
};

// --- inlines -----------------------------------------------------------
inline const String&    SwAuthEntry::GetAuthorField(ToxAuthorityField ePos)const
{
    if(AUTH_FIELD_END > ePos)
        return aAuthFields[ePos];
    else
        return aEmptyStr;
}
inline void SwAuthEntry::SetAuthorField(ToxAuthorityField ePos, const String& rField)
{
    if(AUTH_FIELD_END > ePos)
        aAuthFields[ePos] = rField;
}

#endif

diff --git a/sw/inc/authratr.hxx b/sw/inc/authratr.hxx
new file mode 100644
index 0000000..c69d1fd
--- /dev/null
+++ b/sw/inc/authratr.hxx
@@ -0,0 +1,92 @@
/*************************************************************************
 *
 *  $RCSfile: authratr.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:24 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _AUTHRATR_HXX
#define _AUTHRATR_HXX

#ifndef _SOLAR_H
#include <tools/solar.h>
#endif

#ifndef _SV_COLOR_HXX //autogen
#include <vcl/color.hxx>
#endif

#define COL_NONE        TRGB_COLORDATA( 0x80, 0xFF, 0xFF, 0xFF )

class AuthorCharAttr
{
public:
    USHORT  nItemId;
    USHORT  nAttr;
    ULONG   nColor;

    AuthorCharAttr();

    inline BOOL operator == ( const AuthorCharAttr& rAttr ) const
    {
        return  nItemId == rAttr.nItemId && nAttr == rAttr.nAttr &&
                nColor == rAttr.nColor;
    }
};


#endif
diff --git a/sw/inc/bookmrk.hxx b/sw/inc/bookmrk.hxx
new file mode 100644
index 0000000..ade8396
--- /dev/null
+++ b/sw/inc/bookmrk.hxx
@@ -0,0 +1,177 @@
/*************************************************************************
 *
 *  $RCSfile: bookmrk.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:24 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _BOOKMRK_HXX
#define _BOOKMRK_HXX

#include "hintids.hxx"      //die Ids der Attribute, vor macitem damit die
                            //die Attribut richtig angezogen werden.
#ifndef _SFXMACITEM_HXX
#include <svtools/macitem.hxx>
#endif

#ifndef _KEYCOD_HXX //autogen
#include <vcl/keycod.hxx>
#endif
#ifndef _SO2REF_HXX //autogen
#include <so3/so2ref.hxx>
#endif
#ifndef _BKMRKE_HXX //autogen
#include <bkmrke.hxx>
#endif

#include "calbck.hxx"

#ifndef SW_DECL_SWSERVEROBJECT_DEFINED
#define SW_DECL_SWSERVEROBJECT_DEFINED
class SvPseudoObject;
SO2_DECL_REF( SwServerObject )
#endif


struct SwPosition;  // fwd Decl. wg. UI

class SwBookmark : public SwModify
{
    friend class SwDoc;         // fuers Loeschen
    friend class Sw3IoImp;      // fuers Setzen der Position(en)

    SwPosition *pPos1, *pPos2;  // wird im CTOR gesetzt, im DTOR geloescht
    SwServerObjectRef refObj;   // falls DataServer -> Pointer gesetzt

protected:
    SvxMacro    aStartMacro;
    SvxMacro    aEndMacro;
    String      aName;
    String      aShortName;
    KeyCode     aCode;
    BOOKMARK_TYPE eMarkType;

public:
    TYPEINFO();

    SwBookmark(const SwPosition& aPos);
    SwBookmark(const SwPosition& aPos,
        const KeyCode& rCode,
        const String& rName, const String& rShortName);
    // Beim Loeschen von Text werden Bookmarks mitgeloescht!
    ~SwBookmark();

    const SwPosition& GetPos() const { return *pPos1; }
    const SwPosition* GetOtherPos() const { return pPos2; }

    // nicht undofaehig
    void SetName(const String& rNewName) { aName = rNewName; }
    const String& GetName() const { return aName; }
    // nicht undofaehig
    void SetShortName(const String& rNewSName) { aShortName = rNewSName; }
    const String& GetShortName() const { return aShortName; }
    // nicht undofaehig
    void SetKeyCode(const KeyCode& rNewCode) { aCode = rNewCode; }
    const KeyCode& GetKeyCode() const { return aCode; }

    // Vergleiche auf Basis der Dokumentposition
    BOOL operator < (const SwBookmark &) const;
    BOOL operator ==(const SwBookmark &) const;
    // falls man wirklich auf gleiche Position abfragen will.
    BOOL IsEqualPos( const SwBookmark &rBM ) const;

    BOOL IsBookMark() const     { return BOOKMARK == eMarkType; }
    BOOL IsMark() const         { return MARK == eMarkType; }
    BOOL IsDDEMark() const      { return DDE_BOOKMARK == eMarkType; }
    BOOL IsUNOMark() const      { return UNO_BOOKMARK == eMarkType; }
    void SetType( BOOKMARK_TYPE eNewType )  { eMarkType = eNewType; }

    void SetStartMacro(const SvxMacro& rSt)     { aStartMacro = rSt; }
    const SvxMacro& GetStartMacro()             { return aStartMacro; }
    void SetEndMacro(const SvxMacro& rSt)       { aEndMacro = rSt; }
    const SvxMacro& GetEndMacro()               { return aEndMacro; }

        // Daten Server-Methoden
    void SetRefObject( SvPseudoObject* pObj );
    const SwServerObject* GetObject() const     {  return &refObj; }
          SwServerObject* GetObject()           {  return &refObj; }
    BOOL IsServer() const                       {  return refObj.Is(); }

private:
    // fuer METWARE:
    // es wird (vorerst) nicht kopiert und nicht zugewiesen
    SwBookmark(const SwBookmark &);
    SwBookmark &operator=(const SwBookmark &);
};

class SwMark: public SwBookmark
{
public:
    SwMark(const SwPosition& aPos,
        const KeyCode& rCode,
        const String& rName, const String& rShortName);
};

class SwUNOMark: public SwBookmark
{
public:
    SwUNOMark(const SwPosition& aPos,
        const KeyCode& rCode,
        const String& rName, const String& rShortName);
};


#endif
diff --git a/sw/inc/bparr.hxx b/sw/inc/bparr.hxx
new file mode 100644
index 0000000..365fb2d
--- /dev/null
+++ b/sw/inc/bparr.hxx
@@ -0,0 +1,164 @@
/*************************************************************************
 *
 *  $RCSfile: bparr.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:24 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _BPARR_HXX
#define _BPARR_HXX

#ifndef _SOLAR_H
#include <tools/solar.h>
#endif
#ifndef _DEBUG_HXX //autogen
#include <tools/debug.hxx>
#endif

struct BlockInfo;
class BigPtrArray;

class BigPtrEntry
{
    friend class BigPtrArray;
    BlockInfo* pBlock;
    USHORT nOffset;
protected:
    BigPtrEntry() : pBlock(0), nOffset(0) {}
    virtual ~BigPtrEntry() {}

    inline ULONG GetPos() const;
    inline BigPtrArray& GetArray() const;
};
typedef BigPtrEntry* ElementPtr;


typedef BOOL (*FnForEach)( const ElementPtr&, void* pArgs );

// 1000 Eintr„ge pro Block = etwas weniger als 4K
#define MAXENTRY 1000


// Anzahl Eintraege, die bei der Kompression frei bleiben duerfen
// dieser Wert ist fuer den Worst Case, da wir MAXBLOCK mit ca 25%
// Overhead definiert haben, reichen 80% = 800 Eintraege vollkommen aus
// Will mann voellige Kompression haben, muss eben 100 angegeben werden.

#define COMPRESSLVL 80

struct BlockInfo {                  // Block-Info:
    BigPtrArray* pBigArr;           // in diesem Array steht der Block
    ElementPtr* pData;              // Datenblock
    ULONG nStart, nEnd;             // Start- und EndIndex
    USHORT nElem;                   // Anzahl Elemente
};

class BigPtrArray
{
    BlockInfo** ppInf;              // Block-Infos
    ULONG       nSize;              // Anzahl Elemente
    USHORT      nMaxBlock;          // akt. max Anzahl Bloecke
    USHORT      nBlock;             // Anzahl Bloecke
    USHORT      nCur;               // letzter Block

    USHORT      Index2Block( ULONG ) const; // Blocksuche
    BlockInfo*  InsBlock( USHORT );         // Block einfuegen
    void        BlockDel( USHORT );         // es wurden Bloecke geloescht
    void        UpdIndex( USHORT );         // Indexe neu berechnen

protected:
    // fuelle alle Bloecke auf.
    // Der short gibt in Prozent an, wie voll die Bloecke werden sollen.
    // Der ReturnWert besagt, das irgendetwas "getan" wurde
    USHORT Compress( short = COMPRESSLVL );

public:
    BigPtrArray();
    ~BigPtrArray();

    ULONG Count() const { return nSize; }

    void Insert( const ElementPtr& r, ULONG pos );
//  void Insert( const ElementPtr* p, ULONG n, ULONG pos );
    void Remove( ULONG pos, ULONG n = 1 );
    void Move( ULONG from, ULONG to );
    void Replace( ULONG pos, const ElementPtr& r);

    ElementPtr operator[]( ULONG ) const;
    ULONG GetIndex( const ElementPtr, ULONG, ULONG ) const;
    void ForEach( FnForEach fn, void* pArgs = NULL )
    {
        ForEach( 0, nSize, fn, pArgs );
    }
    void ForEach( ULONG nStart, ULONG nEnd, FnForEach fn, void* pArgs = NULL );
};



inline ULONG BigPtrEntry::GetPos() const
{
    DBG_ASSERT( this == pBlock->pData[ nOffset ], "Element nicht im Block" );
    return pBlock->nStart + nOffset;
}

inline BigPtrArray& BigPtrEntry::GetArray() const
{
    return *pBlock->pBigArr;
}


#endif
diff --git a/sw/inc/calbck.hxx b/sw/inc/calbck.hxx
new file mode 100644
index 0000000..e84370e
--- /dev/null
+++ b/sw/inc/calbck.hxx
@@ -0,0 +1,260 @@
/*************************************************************************
 *
 *  $RCSfile: calbck.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:24 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

/*************************************************************
#* Service-Klassen
 *************************************************************/

/*
#* Aendert sich ein Attribut in einem Format, so muss diese
#* Aenderung an alle abhaengigen Formate und ueber sie an
#* alle betroffenen Nodes propagiert werden. Dabei muss
#* festgestellt werden, ob die Aenderung einen Effekt haben
#* kann, oder ob das geaenderte Attribut von dem abhaengigen
#* Format ueberdefiniert wird (so dass ohnehin der
#* Attributwert des abhaengigen Formates den geaenderten
#* Wert verdeckt). Weiterhin kann der betroffene Node
#* feststellen, ob er von dem geaenderten Attribut Gebrauch
#* macht (Beispiel: Linienabstand fuer Unterstreichung wurde
#* geaendert, das Attribut Unterstreichung wurde aber nicht
#* verwendet). So wird bei Aenderungen der minimale Aufwand
#* zum Reformatieren erkannt.
 */
#ifndef _CALBCK_HXX
#define _CALBCK_HXX

#ifndef _SOLAR_H
#include <tools/solar.h>
#endif

#ifndef _RTTI_HXX
#include <tools/rtti.hxx>
#endif

class SwModify;
class SwClientIter;
class SfxPoolItem;
class SvStream;

// ----------
// SwClient
// ----------

class SwClient
{
    friend class SwModify;
    friend class SwClientIter;

    SwClient *pLeft, *pRight;           // fuer die AVL-Sortierung
    BOOL bModifyLocked : 1;             // wird in SwModify::Modify benutzt,
                                        // eigentlich ein Member des SwModify
                                        // aber aus Platzgruenden hier.
    BOOL bInModify  : 1;                // ist in einem Modify. (Debug!!!)
    BOOL bInDocDTOR : 1;                // Doc wird zerstoert, nicht "abmelden"
    BOOL bInCache   : 1;                // Ist im BorderAttrCache des Layout,
                                        // Traegt sich dann im Modify aus!
    BOOL bInSwFntCache : 1;             // Ist im SwFont-Cache der Formatierung

protected:
    SwModify *pRegisteredIn;
    SwClient(SwModify *pToRegisterIn);

public:
    inline SwClient();
    virtual ~SwClient();
    virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);
    const SwModify* GetRegisteredIn() const { return pRegisteredIn; }

    //rtti, abgeleitete moegens gleichtun oder nicht. Wenn sie es gleichtun
    //kann ueber die Abhaengigkeitsliste eines Modify typsicher gecastet
    //werden.
    TYPEINFO();

    void LockModify()                   { bModifyLocked = TRUE;  }
    void UnlockModify()                 { bModifyLocked = FALSE; }
    void SetInCache( BOOL bNew )        { bInCache = bNew;       }
    void SetInSwFntCache( BOOL bNew )   { bInSwFntCache = bNew;  }
    int  IsModifyLocked() const         { return bModifyLocked;  }
    int  IsInDocDTOR()    const         { return bInDocDTOR;     }
    int  IsInCache()      const         { return bInCache;       }
    int  IsInSwFntCache()  const        { return bInSwFntCache;  }

        // erfrage vom Client Informationen
    virtual BOOL GetInfo( SfxPoolItem& ) const;

private:
    SwClient( const SwClient& );
    SwClient &operator=( const SwClient& );
};

inline SwClient::SwClient() :
    pLeft(0), pRight(0), pRegisteredIn(0)
{ bModifyLocked = bInModify = bInDocDTOR = bInCache = bInSwFntCache = FALSE; }


// ----------
// SwModify
// ----------

// Klasse hat eine doppelt Verkette Liste fuer die Abhaengigen.

class SwModify: public SwClient
{
    friend SvStream& operator<<( SvStream& aS, SwModify & );

    friend class SwClientIter;
    SwClient* pRoot;

    SwClient *_Remove(SwClient *pDepend);

public:
    SwModify(SwModify *pToRegisterIn );
    virtual ~SwModify();
    virtual void Modify( SfxPoolItem *pOldValue, SfxPoolItem *pNewValue );
    void Add(SwClient *pDepend);
    SwClient *Remove(SwClient *pDepend)
        {   return bInDocDTOR ?  0 : _Remove( pDepend ); }

    const SwClient* GetDepends() const  { return pRoot; }

        // erfrage vom Client Informationen
    virtual BOOL GetInfo( SfxPoolItem& ) const;

    void SetInDocDTOR() { bInDocDTOR = TRUE; }

    void CheckCaching( const USHORT nWhich );

    BOOL IsLastDepend() const
        { return pRoot && !pRoot->pLeft && !pRoot->pRight; }
};

// ----------
// SwDepend
// ----------

/*
 * Sehr sinnvolle Klasse, wenn ein Objekt von mehreren Objekten
 * abhaengig ist. Diese sollte fuer jede Abhaengigkeit ein Objekt
 * der Klasse SwDepend als Member haben.
 */
class SwDepend: public SwClient
{
private:
    SwClient *pToTell;
public:
    SwClient* GetToTell() { return pToTell; }
    virtual void Modify( SfxPoolItem *pOldValue, SfxPoolItem *pNewValue );
    SwDepend(SwClient *pTellHim, SwModify *pDepend);

        // erfrage vom Client Informationen
    virtual BOOL GetInfo( SfxPoolItem & ) const;
};


class SwClientIter
{
    friend SwClient* SwModify::_Remove(SwClient *); // fuer Ptr-Korrektur
    friend void SwModify::Add(SwClient *);          // nur fuer ASSERT !

    SwModify& rRoot;
    SwClient *pAkt, *pDelNext;
    // fuers Updaten der aller Iteratoren beim Einfuegen/Loeschen von
    // Clients, wenn der Iterator gerade draufsteht.
    SwClientIter *pNxtIter;
    TypeId aSrchId;             // fuer First/Next - suche diesen Type

public:
    SwClientIter( SwModify& );
    ~SwClientIter();

    const SwModify& GetModify() const       { return rRoot; }
          SwModify& GetModify()             { return rRoot; }

#ifndef CFRONT
    SwClient* operator++(int);  // zum Naechsten
    SwClient* operator--(int);  // zum Vorherigen
#endif
    SwClient* operator++();     // zum Naechsten
    SwClient* operator--();     // zum Vorherigen

    SwClient* GoStart();        // zum Anfang
    SwClient* GoEnd();          // zum Ende

    inline SwClient* GoRoot();      // wieder ab Root (==Start) anfangen

    SwClient* operator()() const
        { return pDelNext == pAkt ? pAkt : pDelNext; }

    int IsChanged() const { return pDelNext != pAkt; }

    SwClient* First( TypeId nType );
    SwClient* Next();
};

inline SwClient* SwClientIter::GoRoot()     // wieder ab Root anfangen
{
    pAkt = rRoot.pRoot;
    return (pDelNext = pAkt);
}



#endif
diff --git a/sw/inc/calc.hxx b/sw/inc/calc.hxx
new file mode 100644
index 0000000..b839ffe
--- /dev/null
+++ b/sw/inc/calc.hxx
@@ -0,0 +1,261 @@
/*************************************************************************
 *
 *  $RCSfile: calc.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:24 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _CALC_HXX
#define _CALC_HXX


#ifndef _SVARRAY_HXX //autogen
#include <svtools/svarray.hxx>
#endif

#ifndef __SBX_SBXVALUE //autogen
#include <svtools/sbxvar.hxx>
#endif

class CharClass;
class International;
class SwFieldType;
class SwDoc;

#define TBLSZ 47                // sollte Primzahl sein, wegen HashTable

const sal_Unicode cListDelim    = '|';

/******************************************************************************
 *                          Calculate Operations
 ******************************************************************************/
enum SwCalcOper
{
    CALC_NAME,              CALC_NUMBER,            CALC_ENDCALC,
    CALC_PLUS='+',          CALC_MINUS='-',         CALC_MUL='*',
    CALC_DIV='/',           CALC_PRINT=';',         CALC_ASSIGN='=',
    CALC_LP='(',            CALC_RP=')',            CALC_PHD='%',
    CALC_POW='^',
    CALC_LISTOP = cListDelim,
    CALC_NOT=256,           CALC_AND=257,           CALC_OR=258,
    CALC_XOR=259,           CALC_EQ=260,            CALC_NEQ=261,
    CALC_LEQ=262,           CALC_GEQ=263,           CALC_LES=264,
    CALC_GRE=265,           CALC_SUM=266,           CALC_MEAN=267,
    CALC_SQRT=268,          CALC_MIN=269,           CALC_MIN_IN=270,
    CALC_MAX=271,           CALC_MAX_IN=272,        CALC_SIN=273,
    CALC_COS=274,           CALC_TAN=275,           CALC_ASIN=276,
    CALC_ACOS=278,          CALC_ATAN=279,          CALC_TDIF=280,
    CALC_ROUND=281
};

//-- Calculate Operations Strings -----------------------------------------

extern const sal_Char __FAR_DATA sCalc_Add[];
extern const sal_Char __FAR_DATA sCalc_Sub[];
extern const sal_Char __FAR_DATA sCalc_Mul[];
extern const sal_Char __FAR_DATA sCalc_Div[];
extern const sal_Char __FAR_DATA sCalc_Phd[];
extern const sal_Char __FAR_DATA sCalc_Sqrt[];
extern const sal_Char __FAR_DATA sCalc_Pow[];
extern const sal_Char __FAR_DATA sCalc_Or[];
extern const sal_Char __FAR_DATA sCalc_Xor[];
extern const sal_Char __FAR_DATA sCalc_And[];
extern const sal_Char __FAR_DATA sCalc_Not[];
extern const sal_Char __FAR_DATA sCalc_Eq[];
extern const sal_Char __FAR_DATA sCalc_Neq[];
extern const sal_Char __FAR_DATA sCalc_Leq[];
extern const sal_Char __FAR_DATA sCalc_Geq[];
extern const sal_Char __FAR_DATA sCalc_L[];
extern const sal_Char __FAR_DATA sCalc_G[];
extern const sal_Char __FAR_DATA sCalc_Sum[];
extern const sal_Char __FAR_DATA sCalc_Mean[];
extern const sal_Char __FAR_DATA sCalc_Min[];
extern const sal_Char __FAR_DATA sCalc_Max[];
extern const sal_Char __FAR_DATA sCalc_Sin[];
extern const sal_Char __FAR_DATA sCalc_Cos[];
extern const sal_Char __FAR_DATA sCalc_Tan[];
extern const sal_Char __FAR_DATA sCalc_Asin[];
extern const sal_Char __FAR_DATA sCalc_Acos[];
extern const sal_Char __FAR_DATA sCalc_Atan[];
extern const sal_Char __FAR_DATA sCalc_Tdif[];
extern const sal_Char __FAR_DATA sCalc_Round[];

/******************************************************************************
 *                          Calculate ErrorCodes
 ******************************************************************************/
enum SwCalcError
{
    CALC_NOERR=0,
    CALC_SYNTAX,        //  Syntax Fehler
    CALC_ZERODIV,       //  Division durch Null
    CALC_BRACK,         //  Fehlerhafte Klammerung
    CALC_POWERR,        //  Ueberlauf in Quadratfunktion
    CALC_VARNFND,       //  Variable wurde nicht gefunden
    CALC_OVERFLOW,      //  Ueberlauf
    CALC_WRONGTIME      //  falsches Zeitformat
};

class SwSbxValue : public SbxValue
{
public:
    //JP 03.02.99: immer auf eine Zahl defaulten, damit auch gerechnet wird.
    //              Ansonsten wird daraus ein SbxEMPTY und damit ist nichts
    //              anzufangen.
    SwSbxValue( long n = 0 )        { PutLong( n ); }
    SwSbxValue( const double& rD )  { PutDouble( rD ); }
    SwSbxValue( const SwSbxValue& rVal ) : SbxValue( rVal ) {}
    virtual ~SwSbxValue();

    // Strings sonderbehandeln
    BOOL GetBool() const;
    // Strings sonderbehandeln
    double GetDouble() const;
    SwSbxValue& MakeDouble();
};

/******************************************************************************
 *          Calculate HashTables fuer VarTable und Operations
 ******************************************************************************/
struct SwHash
{
            SwHash( const String& rStr );
    virtual ~SwHash();
    String  aStr;
    SwHash *pNext;
};

struct SwCalcExp : public SwHash
{
    SwSbxValue  nValue;
    const SwFieldType* pFldType;

    SwCalcExp( const String& rStr, const SwSbxValue& rVal,
                const SwFieldType* pFldType = 0 );
};

SwHash* Find( const String& rSrch, SwHash** ppTable,
                USHORT nTblSize, USHORT* pPos = 0 );

void DeleteHashTable( SwHash** ppTable, USHORT nTblSize );

// falls _CalcOp != 0, dann ist das ein gueltiger Operator
struct _CalcOp;
_CalcOp* FindOperator( const String& rSearch );

/******************************************************************************
 *                               class SwCalc
 ******************************************************************************/
class SwCalc
{
    SwHash*     VarTable[ TBLSZ ];
    String      aVarName, sCurrSym;
    String      sCommand;
    SvPtrarr    aRekurStk;
    SwSbxValue  nLastLeft;
    SwSbxValue  nNumberValue;
    SwCalcExp   aErrExpr;
    xub_StrLen  nCommandPos;

    SwDoc&      rDoc;
    International* pInter;
    CharClass*  pCharClass;

    USHORT      nListPor;
    SwCalcOper  eCurrOper;
    SwCalcOper  eCurrListOper;
    SwCalcError eError;


    SwCalcOper  GetToken();
    SwSbxValue  Expr();
    SwSbxValue  Term();
    SwSbxValue  Prim();

    BOOL        ParseTime( USHORT*, USHORT*, USHORT* );

    String  GetColumnName( const String& rName );
    String  GetDBName( const String& rName );

    // dont call this methods
    SwCalc( const SwCalc& );
    SwCalc& operator=( const SwCalc& );

public:
        SwCalc( SwDoc& rD );
        ~SwCalc();

    SwSbxValue  Calculate( const String &rStr );
    String      GetStrResult( const SwSbxValue& rValue, BOOL bRound = TRUE );
    String      GetStrResult( double, BOOL bRound = TRUE );

    SwCalcExp*  VarInsert( const String& r );
    SwCalcExp*  VarLook( const String &rStr, USHORT ins = 0 );
    void        VarChange( const String& rStr, const SwSbxValue& rValue );
    void        VarChange( const String& rStr, double );
    SwHash**    GetVarTable()                       { return VarTable; }

    BOOL        Push( const VoidPtr pPtr );
    void        Pop( const VoidPtr pPtr );

    void        SetCalcError( SwCalcError eErr )    { eError = eErr; }
    BOOL        IsCalcError() const                 { return eError; }

    static FASTBOOL     Str2Double( const String& rStr, xub_StrLen& rPos,
                                    double& rVal,
                                    const International* pInter = 0 );
};

#endif
diff --git a/sw/inc/cellatr.hxx b/sw/inc/cellatr.hxx
new file mode 100644
index 0000000..e2fa5a7
--- /dev/null
+++ b/sw/inc/cellatr.hxx
@@ -0,0 +1,178 @@
/*************************************************************************
 *
 *  $RCSfile: cellatr.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:24 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _CELLATR_HXX
#define _CELLATR_HXX

#ifndef _SFXINTITEM_HXX //autogen
#include <svtools/intitem.hxx>
#endif
#ifndef _ZFORLIST_HXX //autogen
#include <svtools/zforlist.hxx>
#endif

#include "format.hxx"
#include "cellfml.hxx"


class SwTblBoxNumFormat : public SfxUInt32Item
{
    BOOL bAuto;     // automatisch vergebenes Flag
public:
    SwTblBoxNumFormat( UINT32 nFormat = NUMBERFORMAT_TEXT,
                        BOOL bAuto = FALSE );

    // "pure virtual Methoden" vom SfxPoolItem
    virtual int             operator==( const SfxPoolItem& ) const;
    virtual SfxPoolItem*    Clone( SfxItemPool* pPool = 0 ) const;
    virtual SfxPoolItem*    Create(SvStream &, USHORT nVer) const;
    virtual SvStream&       Store(SvStream &, USHORT nIVer) const;
    virtual USHORT          GetVersion( USHORT nFileVersion) const;

    inline SwTblBoxNumFormat& operator=( const SwTblBoxNumFormat& rAttr )
    {
        SetValue( rAttr.GetValue() );
        SetAutoFlag( rAttr.GetAutoFlag() );
        return *this;
    }

    BOOL GetAutoFlag() const                    { return bAuto; }
    void SetAutoFlag( BOOL bFlag = TRUE )       { bAuto = bFlag; }
};

class SwTblBoxFormula : public SfxPoolItem, public SwTableFormula
{
    SwModify* pDefinedIn;   // Modify-Object, in dem die Formel steht
                            // kann nur TablenBoxFormat sein

public:
    SwTblBoxFormula( const String& rFormula );

    // "pure virtual Methoden" vom SfxPoolItem
    virtual int             operator==( const SfxPoolItem& ) const;
    virtual SfxPoolItem*    Clone( SfxItemPool* pPool = 0 ) const;
    virtual SfxPoolItem*    Create(SvStream &, USHORT nVer) const;
    virtual SvStream&       Store(SvStream &, USHORT nIVer) const;
    virtual USHORT          GetVersion( USHORT nFileVersion) const;

    // erfrage und setze den Modify-Pointer
    inline const SwModify* GetDefinedIn() const { return pDefinedIn; }
    inline void ChgDefinedIn( const SwModify* pNew )
                                            { pDefinedIn = (SwModify*)pNew; }
    // suche den Node, in dem die Formel steht:
    //  BoxAttribut -> BoxStartNode
    virtual const SwNode* GetNodeOfFormula() const;

          SwTableBox* GetTableBox();
    const SwTableBox* GetTableBox() const
        { return ((SwTblBoxFormula*)this)->GetTableBox(); }

    // Status aendern
    void ChangeState( const SfxPoolItem* pItem );
    // berechne die Formel
    void Calc( SwTblCalcPara& rCalcPara, double& rValue );
};

class SwTblBoxValue : public SfxPoolItem
{
    double nValue;
public:
    SwTblBoxValue();
    SwTblBoxValue( const double aVal );

    // "pure virtual Methoden" vom SfxPoolItem
    virtual int             operator==( const SfxPoolItem& ) const;
    virtual SfxPoolItem*    Clone( SfxItemPool* pPool = 0 ) const;
    virtual SfxPoolItem*    Create(SvStream &, USHORT nVer) const;
    virtual SvStream&       Store(SvStream &, USHORT nIVer) const;
    virtual USHORT          GetVersion( USHORT nFileVersion) const;

    inline SwTblBoxValue& operator=( const SwTblBoxValue& rCmp )
    {
        nValue = rCmp.nValue;
        return *this;
    }

    double GetValue() const                     { return nValue; }
    void SetValue( const double nVal )          { nValue = nVal; }
};



//***************************************************************************

inline const SwTblBoxNumFormat      &SwAttrSet::GetTblBoxNumFmt(BOOL bInP) const
    {   return (const SwTblBoxNumFormat&)Get( RES_BOXATR_FORMAT,bInP); }
inline const SwTblBoxFormula        &SwAttrSet::GetTblBoxFormula(BOOL bInP) const
    {   return (const SwTblBoxFormula&)Get( RES_BOXATR_FORMULA,bInP); }
inline const SwTblBoxValue          &SwAttrSet::GetTblBoxValue(BOOL bInP) const
    {   return (const SwTblBoxValue&)Get( RES_BOXATR_VALUE, bInP); }

//***************************************************************************

inline const SwTblBoxNumFormat      &SwFmt::GetTblBoxNumFmt(BOOL bInP) const
    {   return aSet.GetTblBoxNumFmt(bInP); }
inline const SwTblBoxFormula        &SwFmt::GetTblBoxFormula(BOOL bInP) const
    {   return aSet.GetTblBoxFormula(bInP); }
inline const SwTblBoxValue          &SwFmt::GetTblBoxValue(BOOL bInP) const
    {   return aSet.GetTblBoxValue(bInP); }

#endif
diff --git a/sw/inc/cellfml.hxx b/sw/inc/cellfml.hxx
new file mode 100644
index 0000000..89d7ba9
--- /dev/null
+++ b/sw/inc/cellfml.hxx
@@ -0,0 +1,197 @@
/*************************************************************************
 *
 *  $RCSfile: cellfml.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:24 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _CELLFML_HXX
#define _CELLFML_HXX

#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif

class SwTable;
class SwNode;
class SwTableSortBoxes;
class SwSelBoxes;
class SwCalc;
class SwTableBox;
class SwTableFmlUpdate;

class SwTblCalcPara
{
    const SwTableBox* pLastTblBox;
    USHORT nStackCnt, nMaxSize;

public:
    SwTableSortBoxes *pBoxStk;  // Stack fuers erkennen von Rekursionen !
    SwCalc& rCalc;              // akt. Calculator
    const SwTable* pTbl;        // akt. Tabelle

    SwTblCalcPara( SwCalc& rCalculator, const SwTable& rTable );
    ~SwTblCalcPara();

    BOOL CalcWithStackOverflow();
    BOOL IsStackOverFlow() const        { return nMaxSize == nStackCnt; }
    BOOL IncStackCnt()                  { return nMaxSize == ++nStackCnt; }
    void DecStackCnt()                  { if( nStackCnt ) --nStackCnt; }
    void SetLastTblBox( const SwTableBox* pBox )    { pLastTblBox = pBox; }
};



class SwTableFormula
{
typedef void (SwTableFormula:: *FnScanFormel)( const SwTable&, String&,
                                            String&, String*, void* ) const;

    void BoxNmsToPtr( const SwTable&, String&, String&, String* = 0,
                        void* pPara = 0 ) const;
    void PtrToBoxNms( const SwTable&, String&, String&, String* = 0,
                        void* pPara = 0 ) const;
    void RelNmsToBoxNms( const SwTable&, String&, String&, String* = 0,
                        void* pPara = 0 ) const;
    void RelBoxNmsToPtr( const SwTable&, String&, String&, String* = 0,
                        void* pPara = 0 ) const;
    void BoxNmsToRelNm( const SwTable&, String&, String&, String* = 0,
                        void* pPara = 0 ) const;
    void _MakeFormel( const SwTable&, String&, String&, String* = 0,
                        void* pPara = 0 ) const;
    void _GetFmlBoxes( const SwTable&, String&, String&, String* = 0,
                        void* pPara = 0 ) const;
    void _HasValidBoxes( const SwTable&, String&, String&, String* = 0,
                        void* pPara = 0 ) const;
    void _SplitMergeBoxNm( const SwTable&, String&, String&, String* = 0,
                        void* pPara = 0 ) const;

    void GetBoxes( const SwTableBox& rStt, const SwTableBox& rEnd,
                    SwSelBoxes& rBoxes ) const;
    String ScanString( FnScanFormel fnFormel, const SwTable& rTbl,
                        void* = 0 ) const;

    const SwTable* FindTable( SwDoc& rDoc, const String& rNm ) const;

protected:
    enum NameType { EXTRNL_NAME, INTRNL_NAME, REL_NAME };

    String      sFormel;            // akt. Formel
    NameType    eNmType;            // akt. Darstellungs Art
    BOOL        bValidValue;        // TRUE: Formel neu berechnen

    // suche den Node, in dem die Formel steht:
    //  TextFeld    -> TextNode,
    //  BoxAttribut -> BoxStartNode
    // !!! MUSS VON JEDER ABLEITUNG UEBERLADEN WERDEN !!!
    virtual const SwNode* GetNodeOfFormula() const = 0;

    SwTableFormula( const String& rFormel );

    String MakeFormel( SwTblCalcPara& rCalcPara ) const
    {
        return ScanString( &SwTableFormula::_MakeFormel,
                            *rCalcPara.pTbl, &rCalcPara );
    }

    static USHORT GetLnPosInTbl( const SwTable& rTbl, const SwTableBox* pBox );

public:

    SwTableFormula( const SwTableFormula& rCpy )    { *this = rCpy; }
    SwTableFormula& operator=( const SwTableFormula& rCpy )
        {
                                    sFormel = rCpy.sFormel;
                                    eNmType = rCpy.eNmType;
                                    bValidValue = rCpy.bValidValue;
                                    return *this;
        }

    // erzeuge aus der internen (fuer CORE) die externe (fuer UI) Formel
    void PtrToBoxNm( const SwTable* pTbl );
    // erzeuge aus der externen (fuer UI) die interne (fuer CORE) Formel
    void BoxNmToPtr( const SwTable* pTbl );
    // erzeuge aus der externen/internen Formel die relative Formel
    void ToRelBoxNm( const SwTable* pTbl );
    // wird vorm/nach dem mergen/splitten von Tabellen rerufen
    void ToSplitMergeBoxNm( SwTableFmlUpdate& rTblUpd );

    // ist gerade eine intern Darstellung aktiv
    BOOL IsIntrnlName() const           { return eNmType == INTRNL_NAME; }
    // erfrage die akt. Darstellung der Formel
    NameType GetNameType() const        { return eNmType; }

    // erfrage/setze das Flag, ob der akt. Wert gueltig ist
    BOOL        IsValid() const             { return bValidValue; }
    inline void ChgValid( BOOL bNew )       { bValidValue = bNew; }

    const String& GetFormula() const        { return sFormel; }
    void SetFormula( const String& rNew )
        {
            sFormel = rNew;
            bValidValue = FALSE;
            eNmType = EXTRNL_NAME;
        }

    USHORT GetBoxesOfFormula( const SwTable& rTbl, SwSelBoxes& rBoxes );
    // sind alle Boxen gueltig, auf die sich die Formel bezieht?
    BOOL HasValidBoxes() const;
};



#endif
diff --git a/sw/inc/charatr.hxx b/sw/inc/charatr.hxx
new file mode 100644
index 0000000..7e65a2d
--- /dev/null
+++ b/sw/inc/charatr.hxx
@@ -0,0 +1,180 @@
/*************************************************************************
 *
 *  $RCSfile: charatr.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:24 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _CHARATR_HXX
#define _CHARATR_HXX

#include "format.hxx"
#include "hintids.hxx"      // fuer die WhichIds


/******************************************************************************
 *  Implementierung der Charakter-Attribut Methoden vom SwAttrSet
 *  AMA 12.10.94: Umstellung auf SvxItems.
 ******************************************************************************/

inline const SvxPostureItem      &SwAttrSet::GetPosture(BOOL bInP) const
    {   return (const SvxPostureItem&)Get( RES_CHRATR_POSTURE,bInP); }
inline const SvxPostureItem      &SwAttrSet::GetCJKPosture(BOOL bInP) const
    {   return (const SvxPostureItem&)Get( RES_CHRATR_CJK_POSTURE,bInP); }
inline const SvxPostureItem      &SwAttrSet::GetCTLPosture(BOOL bInP) const
    {   return (const SvxPostureItem&)Get( RES_CHRATR_CTL_POSTURE,bInP); }
inline const SvxWeightItem       &SwAttrSet::GetWeight(BOOL bInP) const
    {   return (const SvxWeightItem&)Get( RES_CHRATR_WEIGHT,bInP); }
inline const SvxWeightItem       &SwAttrSet::GetCJKWeight(BOOL bInP) const
    {   return (const SvxWeightItem&)Get( RES_CHRATR_CJK_WEIGHT,bInP); }
inline const SvxWeightItem       &SwAttrSet::GetCTLWeight(BOOL bInP) const
    {   return (const SvxWeightItem&)Get( RES_CHRATR_CTL_WEIGHT,bInP); }
inline const SvxShadowedItem     &SwAttrSet::GetShadowed(BOOL bInP) const
    {   return (const SvxShadowedItem&)Get( RES_CHRATR_SHADOWED,bInP); }
inline const SvxAutoKernItem     &SwAttrSet::GetAutoKern(BOOL bInP) const
    {   return (const SvxAutoKernItem&)Get( RES_CHRATR_AUTOKERN,bInP); }
inline const SvxWordLineModeItem     &SwAttrSet::GetWordLineMode(BOOL bInP) const
    {   return (const SvxWordLineModeItem&)Get( RES_CHRATR_WORDLINEMODE,bInP); }
inline const SvxContourItem      &SwAttrSet::GetContour(BOOL bInP) const
    {   return (const SvxContourItem&)Get( RES_CHRATR_CONTOUR,bInP); }
inline const SvxKerningItem      &SwAttrSet::GetKerning(BOOL bInP) const
    {   return (const SvxKerningItem&)Get( RES_CHRATR_KERNING,bInP); }
inline const SvxUnderlineItem    &SwAttrSet::GetUnderline(BOOL bInP) const
    {   return (const SvxUnderlineItem&)Get( RES_CHRATR_UNDERLINE,bInP); }
inline const SvxCrossedOutItem   &SwAttrSet::GetCrossedOut(BOOL bInP) const
    {   return (const SvxCrossedOutItem&)Get( RES_CHRATR_CROSSEDOUT,bInP); }
inline const SvxFontHeightItem         &SwAttrSet::GetSize(BOOL bInP) const
    {   return (const SvxFontHeightItem&)Get( RES_CHRATR_FONTSIZE,bInP); }
inline const SvxFontHeightItem         &SwAttrSet::GetCJKSize(BOOL bInP) const
    {   return (const SvxFontHeightItem&)Get( RES_CHRATR_CJK_FONTSIZE,bInP); }
inline const SvxFontHeightItem         &SwAttrSet::GetCTLSize(BOOL bInP) const
    {   return (const SvxFontHeightItem&)Get( RES_CHRATR_CTL_FONTSIZE,bInP); }
inline const SvxPropSizeItem     &SwAttrSet::GetPropSize(BOOL bInP) const
    {   return (const SvxPropSizeItem&)Get( RES_CHRATR_PROPORTIONALFONTSIZE,bInP); }
inline const SvxFontItem         &SwAttrSet::GetFont(BOOL bInP) const
    {   return (const SvxFontItem&)Get( RES_CHRATR_FONT,bInP); }
inline const SvxFontItem         &SwAttrSet::GetCJKFont(BOOL bInP) const
    {   return (const SvxFontItem&)Get( RES_CHRATR_CJK_FONT,bInP); }
inline const SvxFontItem         &SwAttrSet::GetCTLFont(BOOL bInP) const
    {   return (const SvxFontItem&)Get( RES_CHRATR_CTL_FONT,bInP); }
inline const SvxColorItem        &SwAttrSet::GetColor(BOOL bInP) const
    {   return (const SvxColorItem&)Get( RES_CHRATR_COLOR,bInP); }
inline const SvxCharSetColorItem &SwAttrSet::GetCharSetColor(BOOL bInP) const
    {   return (const SvxCharSetColorItem&)Get( RES_CHRATR_CHARSETCOLOR,bInP); }
inline const SvxLanguageItem     &SwAttrSet::GetLanguage(BOOL bInP) const
    {   return (const SvxLanguageItem&)Get( RES_CHRATR_LANGUAGE,bInP); }
inline const SvxLanguageItem     &SwAttrSet::GetCJKLanguage(BOOL bInP) const
    {   return (const SvxLanguageItem&)Get( RES_CHRATR_CJK_LANGUAGE,bInP); }
inline const SvxLanguageItem     &SwAttrSet::GetCTLLanguage(BOOL bInP) const
    {   return (const SvxLanguageItem&)Get( RES_CHRATR_CTL_LANGUAGE,bInP); }
inline const SvxEscapementItem   &SwAttrSet::GetEscapement(BOOL bInP) const
    {   return (const SvxEscapementItem&)Get( RES_CHRATR_ESCAPEMENT,bInP); }
inline const SvxCaseMapItem      &SwAttrSet::GetCaseMap(BOOL bInP) const
    {   return (const SvxCaseMapItem&)Get( RES_CHRATR_CASEMAP,bInP); }
inline const SvxNoHyphenItem     &SwAttrSet::GetNoHyphenHere(BOOL bInP) const
    {   return (const SvxNoHyphenItem&)Get( RES_CHRATR_NOHYPHEN,bInP); }
inline const SvxBlinkItem  &SwAttrSet::GetBlink(BOOL bInP) const
    {   return (const SvxBlinkItem&)Get( RES_CHRATR_BLINK,bInP); }
inline const SvxBrushItem &SwAttrSet::GetChrBackground( BOOL bInP ) const
    {   return (const SvxBrushItem&)Get( RES_CHRATR_BACKGROUND, bInP ); }

/******************************************************************************
 *  Implementierung der Charakter-Attribut Methoden vom SwFmt
 *  AMA: 12.10.94: Umstellung auf SvxItems.
 ******************************************************************************/

inline const SvxPostureItem          &SwFmt::GetPosture(BOOL bInP) const
    {   return aSet.GetPosture(bInP); }
inline const SvxWeightItem           &SwFmt::GetWeight(BOOL bInP) const
    {   return aSet.GetWeight(bInP); }
inline const SvxShadowedItem         &SwFmt::GetShadowed(BOOL bInP) const
    {   return aSet.GetShadowed(bInP); }
inline const SvxAutoKernItem         &SwFmt::GetAutoKern(BOOL bInP) const
    {   return aSet.GetAutoKern(bInP); }
inline const SvxWordLineModeItem     &SwFmt::GetWordLineMode(BOOL bInP) const
    {   return aSet.GetWordLineMode(bInP); }
inline const SvxContourItem          &SwFmt::GetContour(BOOL bInP) const
    {   return aSet.GetContour(bInP); }
inline const SvxKerningItem          &SwFmt::GetKerning(BOOL bInP) const
    {   return aSet.GetKerning(bInP); }
inline const SvxUnderlineItem        &SwFmt::GetUnderline(BOOL bInP) const
    {   return aSet.GetUnderline(bInP); }
inline const SvxCrossedOutItem       &SwFmt::GetCrossedOut(BOOL bInP) const
    {   return aSet.GetCrossedOut(bInP); }
inline const SvxFontHeightItem             &SwFmt::GetSize(BOOL bInP) const
    {   return aSet.GetSize(bInP); }
inline const SvxPropSizeItem         &SwFmt::GetPropSize(BOOL bInP) const
    {   return aSet.GetPropSize(bInP); }
inline const SvxFontItem             &SwFmt::GetFont(BOOL bInP) const
    {   return aSet.GetFont(bInP); }
inline const SvxColorItem            &SwFmt::GetColor(BOOL bInP) const
    {   return aSet.GetColor(bInP); }
inline const SvxCharSetColorItem     &SwFmt::GetCharSetColor(BOOL bInP) const
    {   return aSet.GetCharSetColor(bInP); }
inline const SvxLanguageItem         &SwFmt::GetLanguage(BOOL bInP) const
    {   return aSet.GetLanguage(bInP); }
inline const SvxEscapementItem       &SwFmt::GetEscapement(BOOL bInP) const
    {   return aSet.GetEscapement(bInP); }
inline const SvxCaseMapItem          &SwFmt::GetCaseMap(BOOL bInP) const
    {   return aSet.GetCaseMap(bInP); }
inline const SvxNoHyphenItem         &SwFmt::GetNoHyphenHere(BOOL bInP) const
    {   return aSet.GetNoHyphenHere(bInP); }
inline const SvxBlinkItem            &SwFmt::GetBlink(BOOL bInP) const
    {   return aSet.GetBlink(bInP); }
inline const SvxBrushItem            &SwFmt::GetChrBackground(BOOL bInP) const
    {   return aSet.GetChrBackground(bInP); }

#endif
diff --git a/sw/inc/charfmt.hxx b/sw/inc/charfmt.hxx
new file mode 100644
index 0000000..0209942
--- /dev/null
+++ b/sw/inc/charfmt.hxx
@@ -0,0 +1,90 @@
/*************************************************************************
 *
 *  $RCSfile: charfmt.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:24 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _CHARFMT_HXX
#define _CHARFMT_HXX

#ifndef _FORMAT_HXX
#include <format.hxx>
#endif

class SwCharFmt : public SwFmt
{
    friend class SwDoc;
    friend class SwTxtFmtColl;

    SwCharFmt( SwAttrPool& rPool, const sal_Char* pFmtName,
                SwCharFmt *pDerivedFrom )
          : SwFmt( rPool, pFmtName, aCharFmtSetRange, pDerivedFrom, RES_CHRFMT )
    {}
    SwCharFmt( SwAttrPool& rPool, const String &rFmtName,
                SwCharFmt *pDerivedFrom )
          : SwFmt( rPool, rFmtName, aCharFmtSetRange, pDerivedFrom, RES_CHRFMT )
    {}


public:
    TYPEINFO();    //Bereits in Basisklasse Client drin.
};

#endif



diff --git a/sw/inc/chpfld.hxx b/sw/inc/chpfld.hxx
new file mode 100644
index 0000000..fcca485
--- /dev/null
+++ b/sw/inc/chpfld.hxx
@@ -0,0 +1,129 @@
/*************************************************************************
 *
 *  $RCSfile: chpfld.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:24 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _CHPFLD_HXX
#define _CHPFLD_HXX

#include "fldbas.hxx"

class SwFrm;
class SwTxtNode;

#ifndef _UNOOBJ_HXX
#include <unoobj.hxx>
#endif

enum SwChapterFormat
{
    CF_BEGIN,
    CF_NUMBER = CF_BEGIN,       // nur die Kapitelnummer
    CF_TITLE,                   // nur die "Ueberschrift"
    CF_NUM_TITLE,               // Kapitelnummer und "Ueberschrift"
    CF_NUMBER_NOPREPST,         // nur die Kapitelnummer ohne Post/Prefix
    CF_NUM_NOPREPST_TITLE,      // Kapitelnummer ohne Post/Prefix und "Ueberschrift"
    CF_END
};

/*--------------------------------------------------------------------
    Beschreibung: Kapitel
 --------------------------------------------------------------------*/

class SwChapterFieldType : public SwFieldType
{
public:
    SwChapterFieldType();

    virtual SwFieldType*    Copy() const;

};



/*--------------------------------------------------------------------
    Beschreibung: Kapitelnummer
 --------------------------------------------------------------------*/
class SwChapterField : public SwField
{
    friend class SwChapterFieldType;
    BYTE nLevel;
    String sTitle, sNumber, sPre, sPost;
public:
    SwChapterField(SwChapterFieldType*, ULONG nFmt = 0);

    void ChangeExpansion( const SwFrm*, const SwTxtNode*, BOOL bSrchNum = FALSE);

    virtual String   Expand() const;
    virtual SwField* Copy() const;

    inline BYTE GetLevel() const;
    inline void SetLevel(BYTE);

    inline const String& GetNumber() const;
    inline const String& GetTitle() const;
    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );
};

inline BYTE SwChapterField::GetLevel() const    { return nLevel; }
inline void SwChapterField::SetLevel(BYTE nLev) { nLevel = nLev; }
inline const String& SwChapterField::GetNumber() const { return sNumber; }
inline const String& SwChapterField::GetTitle() const { return sTitle; }

#endif // _CHPFLD_HXX
diff --git a/sw/inc/cmdid.h b/sw/inc/cmdid.h
new file mode 100644
index 0000000..17546474
--- /dev/null
+++ b/sw/inc/cmdid.h
@@ -0,0 +1,1225 @@
/*************************************************************************
 *
 *  $RCSfile: cmdid.h,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:24 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
/******************************************************************************
Achtung: Ab sofort sind in diesem File keine C++-Kommentare (//) mehr
         erlaubt, da es von swicli.c included wird!
******************************************************************************/

#ifndef _SFX_HRC
#include <sfx2/sfx.hrc>
#endif

/* Flags die mittels des Disable-Features in den Slot-Definitionen ausgenutzt
 * werden */
#define SW_DISABLE_ON_PROTECTED_CURSOR  0x00000001
#define SW_DISABLE_ON_MAILBOX_EDITOR    0x00000002


#define FN_FILE                 SID_SW_START
#define FN_EDIT                 (SID_SW_START +  100)
#define FN_VIEW                 (SID_SW_START +  200)
#define FN_INSERT               (SID_SW_START +  300)
#define FN_FORMAT               (SID_SW_START +  400)
#define FN_EXTRA                (SID_SW_START +  600)
#define FN_WINDOW               (SID_SW_START +  700)
#define FN_HELP                 (SID_SW_START +  800)
#define FN_SELECTION            (SID_SW_START +  900)
#define FN_QUERY                (SID_SW_START + 1000)
#define FN_ENVELP               (SID_SW_START + 1050)
#define FN_PARAM                (SID_SW_START + 1100)
#define FN_STAT                 (SID_SW_START + 1180)
#define FN_PRNOPT               (SID_SW_START + 1200)
#define FN_PGPREVIEW            (SID_SW_START + 1250)
#define FN_FRAME                (SID_SW_START + 1300)
#define FN_INSERT2              (SID_SW_START + 1400)
#define FN_FORMAT2              (SID_SW_START + 1600)
#define FN_EDIT2                (SID_SW_START + 1800)
#define FN_QUERY2               (SID_SW_START + 2000)
#define FN_EXTRA2               (SID_SW_START + 2200)
#define FN_PARAM2               (SID_SW_START + 2400)

#define HELP_OFFSET                 1100
#define CMD_STR_OFFSET              2200
#define CMD_STR_OFFSET_MULTILANG    3300
#define CMDID_END                   5500

/*--------------------------------------------------------------------
    Bereich: Datei
 --------------------------------------------------------------------*/
#define FN_CLOSE_FILE           (FN_FILE + 1 )    /* Schliessen */
#define FN_LAUNCH_REGISTRY      (FN_FILE + 2 )    /* Ablage */


#define FN_NEW_GLOBAL_DOC       (FN_FILE + 4 )    /* Globaldokument erzeugen */
#define FN_NEW_FILE             (FN_FILE + 5 )    /* Neu */
#define FN_NEW_FILE_DLG         (FN_FILE + 6 )    /* Neu Dialog */
#define FN_OPEN_FILE            (FN_FILE + 7 )    /* Oeffnen */
#define FN_EDIT_FILE            (FN_FILE + 8 )    /* Oeffnen oder ToTop */

#define FN_INETFILE             (FN_FILE + 9 )    /* Internet File-Dialog */

#define FN_PRINT_FILE           (FN_FILE + 10)    /* Drucken */
#define FN_PRINT_FILE_OPTIONS   (FN_FILE + 11)    /* Drucken Optionen */
#define FN_SAVE_FILE_AS         (FN_FILE + 12)    /* Speichern unter */
#define FN_SAVE_FILE            (FN_FILE + 13)    /* Speichern */
#define FN_SETUP_PRINTER        (FN_FILE + 14)    /* Druckereinstellung */
#define FN_SETUP_PRINTER_DLG    (FN_FILE + 15)    /* Druckereinstellung */
#define FN_SHOW_PREVIEW         (FN_FILE + 16)    /* Druckbild */
#define FN_EXIT                 (FN_FILE + 17)    /* Writer beenden */
#define FN_PRINT_CFG_DLG        (FN_FILE + 18)    /* Optionen Drucken */



#define FN_SAVE_ALL             (FN_FILE + 23)    /* Alle Files speichern */
#define FN_NEW_FILE_DEFAULT     (FN_FILE + 24)    /* Neue Datei mit Standardvorlage */
#define FN_PRINT_FILE_DEFAULT   (FN_FILE + 25)    /* Drucken mit Defaults */
#define FN_LAUNCH_EQ_EDITOR     (FN_FILE + 26)    /* Formel Editor */
#define FN_CHANGE_PRINTER       (FN_FILE + 27)    /* Drucker einstellen */
#define FN_FAX_END              (FN_FILE + 29)    /* Faxen fertig, Id fuer PostMessage */

#define FN_SELECT_DATABASE      (FN_FILE + 30)    /* Selektion Datenbank */
#define FN_DOC_INFO_DLG         (FN_FILE + 31)    /* Dokumentinfo */
#define FN_DOC_MGR_DLG          (FN_FILE + 32)    /* Dokument-Manager */

#define FN_GET_DOCSTAT          (FN_FILE + 33)    /* Dokumentstatistik einzeln auslesen */


#define FN_SAVE_SELECTION       (FN_FILE + 35)    /* Selektion speichern */

#define FN_OUTLINE_TO_IMPRESS   (FN_FILE + 36)  /* Outline zu StarImpress senden */
#define FN_OUTLINE_TO_CLIPBOARD (FN_FILE + 37)  /* Outline in das Clipboad copieren */

#define FN_NEW_HTML_DOC         (FN_FILE + 40 ) /* HTML-Dokument "erzeugen" */

#define FN_APP_START            (FN_FILE + 98)  /* fuer Makro bei App.Start */
#define FN_APP_END              (FN_FILE + 99)  /* fuer Makro bei App.Ende */

/*--------------------------------------------------------------------
    Bereich: Bearbeiten
 --------------------------------------------------------------------*/
#define FN_CLEAR                (FN_EDIT + 1 )    /* Loeschen */
#define FN_COPY                 (FN_EDIT + 2 )    /* Kopieren */
#define FN_CUT                  (FN_EDIT + 3 )    /* Ausschneiden */
#define FN_EDIT_FIELD           (FN_EDIT + 4 )    /* Textbefehl bearbeiten */
#define FN_EDIT_FIELD_DLG       (FN_EDIT + 5 )    /* Textbefehl bearbeiten */
#define FN_EDIT_FILE_INFO       (FN_EDIT + 6 )    /* Dokumentinfo */
#define FN_EDIT_FILE_INFO_DLG   (FN_EDIT + 7 )    /* Dokumentinfo Dialog */
#define FN_EDIT_LINK            (FN_EDIT + 8 )    /* Verknuepfungen */
#define FN_EDIT_LINK_DLG        (FN_EDIT + 9 )    /* Verknuepfungen */
#define FN_GOTO                 (FN_EDIT + 11)    /* Gehe zu */

#define FN_PASTE                (FN_EDIT + 13)    /* Einfuegen */
#define FN_PASTESPECIAL         (FN_EDIT + 14)    /* Verknuepfung einfuegen */
#define FN_PASTESPECIAL_DLG     (FN_EDIT + 15)    /* Verknuepfung einfuegen */

#define FN_NUMBER_BULLETS       (FN_EDIT + 21)    /* Bullets */
#define FN_REPEAT               (FN_EDIT + 22)    /* Letzten Befehl wiederholen */
#define FN_EDIT_IDX_ENTRY_DLG   (FN_EDIT + 23)    /* Index-Entry bearbeiten */
#define FN_UPDATE_FIELDS        (FN_EDIT + 26)    /* Feldinhalte erneuern */
#define FN_EXECUTE_MACROFIELD   (FN_EDIT + 27)    /* Macrofeld ausfuehren */
#define FN_EDIT_FORMULA         (FN_EDIT + 28)    /* Formel in RibbonBar bearbeiten */
#define FN_CALC_TABLE           (FN_EDIT + 29)    /* Tabelle durchrechnen */

/*--------------------------------------------------------------------
    Bereich: Bullets
 --------------------------------------------------------------------*/
#define FN_NUM_BULLET_DOWN      (FN_EDIT + 30)  /* Runterstufen */
#define FN_NUM_BULLET_UP        (FN_EDIT + 31)  /* Raufstufen */
#define FN_NUM_BULLET_PREV      (FN_EDIT + 32)  /* zum vorigen Eintrag */
#define FN_NUM_BULLET_NEXT      (FN_EDIT + 33)  /* zum naechsten Eintrag */
#define FN_NUM_BULLET_MOVEUP    (FN_EDIT + 34)  /* nach oben schieben */
#define FN_NUM_BULLET_MOVEDOWN  (FN_EDIT + 35)  /* nach unten schieben */
#define FN_NUM_BULLET_NONUM     (FN_EDIT + 36)  /* Eintrag ohne Nummer */
#ifndef FN_NUM_BULLET_OFF //in SVX already
#define FN_NUM_BULLET_OFF       (FN_EDIT + 37)  /* Numerierung aus */
#endif


// schon im SVX
//#define FN_NUM_BULLET_ON      (FN_EDIT + 38)  /* Numerierung mit Bullets an */

#define FN_NUM_BULLET_OUTLINE_DOWN      (FN_EDIT + 39)  /* Runterstufen mit Unterpunkten */
#define FN_NUM_BULLET_OUTLINE_UP        (FN_EDIT + 40)  /* Raufstufen mit Unterpunkten */
#define FN_NUM_BULLET_OUTLINE_MOVEUP    (FN_EDIT + 41)  /* nach oben schieben mit Unterpunkten */
#define FN_NUM_BULLET_OUTLINE_MOVEDOWN  (FN_EDIT + 42)  /* nach unten schieben mit Unterpunkten */
#define FN_UPDATE_INPUTFIELDS           (FN_EDIT + 43)  /* Eingabefelder updaten */
// schon im SVX
//#define FN_NUM_NUMBERING_ON   (FN_EDIT + 44)  /* Numerierung an */

#define FN_NUM_OR_NONUM         (FN_EDIT + 46)  /* Nummer ein-/aus */

#define FN_GOTO_NEXT_INPUTFLD   (FN_EDIT + 47)  /* zum naechsten EingabeFeld    */
#define FN_GOTO_PREV_INPUTFLD   (FN_EDIT + 48)  /* zum vorherigen EingabeFeld   */

#define FN_REPEAT_SEARCH        (FN_EDIT + 50)  /* Suche wiederholen */
#define FN_REPEAT_REPLACE       (FN_EDIT + 51)  /* Ersetzen wiederholen */
#define FN_UPDATE_GRAFIC        (FN_EDIT + 53)  /* Grafik aendern */
#define FN_SETTAB_ATCURPOS      (FN_EDIT + 54)  /* Tab an der aktuellen Pos setzen */
#define FN_SET_LR_IND_ATCURPOS  (FN_EDIT + 55)  /* EZE und LR setzen */
#define FN_FRMCNT_TO_BODY       (FN_EDIT + 56)  /* Rahmeninhalt zu Text */
#define FN_UPDATE_TOXBASE       (FN_EDIT + 57)  /* Naechstes Verzeichnis erneuern */

#define FN_REPAGINATE           (FN_EDIT + 61)  /* Neuformatierung erzwingen */
#define FN_EDIT_FOOTNOTE        (FN_EDIT + 62)  /* Fussnote bearbeiten */

#define FN_EDIT_REGION          (FN_EDIT + 65)  /* Bereiche bearbeiten  */
#define FN_GOTO_REFERENCE       (FN_EDIT + 66)  /* Von der Refmark zur Referenz */

// schon im Svx definiert
#define FN_NEXT_BOOKMARK        (FN_EDIT + 68)  /*  */
#define FN_PREV_BOOKMARK        (FN_EDIT + 69)  /*  */

/*Navigator ToolBoxen*/
#define FN_SELECT_BOOKMARK           (FN_EDIT + 70)  /**/
#define FN_ITEM_DOWN                 (FN_EDIT + 71)  /**/
#define FN_ITEM_LEFT                 (FN_EDIT + 72)  /**/
#define FN_ITEM_RIGHT                (FN_EDIT + 73)  /**/
#define FN_ITEM_UP                   (FN_EDIT + 74)  /**/
#define FN_DOWN                      (FN_EDIT + 75)  /**/

#define FN_SELECT_FOOTER             (FN_EDIT + 77)  /**/
#define FN_SELECT_FRAME              (FN_EDIT + 78)  /**/
#define FN_SELECT_HEADER             (FN_EDIT + 79)  /**/
#define FN_PAGENUMBER                (FN_EDIT + 80)  /**/
#define FN_SELECT_AUTO_BOOKMARK      (FN_EDIT + 81)  /**/
#define FN_SELECT_FOOTNOTE           (FN_EDIT + 82)  /**/
#define FN_SELECT_SET_AUTO_BOOKMARK  (FN_EDIT + 83)  /**/
#define FN_SELECT_TABLE              (FN_EDIT + 84)  /**/
#define FN_SELECT_INDEX              (FN_EDIT + 85)  /**/
#define FN_UP                        (FN_EDIT + 86)  /**/


//#define FN_DELETE_REGION           (FN_EDIT + 89) /* Bereiche loeschen    */


#define FN_SELECT_PARA               (FN_EDIT + 97) /* Absatz selektieren */

#define FN_SELECT_CONTENT            (FN_EDIT + 99) /* Navigator - Inhaltstyp */




#define FN_UPDATE_ALL_LINKS          (FN_EDIT2 + 24) /* alle Links updaten */

#define FN_REDLINE_ON                (FN_EDIT2 + 25) /* Redlining anschalten */
#define FN_REDLINE_SHOW              (FN_EDIT2 + 26) /* Redlining anzeigen */
#define FN_REDLINE_COMMENT           (FN_EDIT2 + 27) /* Redlining kommentieren */

#define FN_UPDATE_ALL                (FN_EDIT2 + 28) /* FN_UPDATE_ALL_LINKS,
                                                        FN_UPDATE_FIELDS,
                                                        FN_UPDATE_TOX,
                                                        CalcLayout */

#define FN_REDLINE_ACCEPT            (FN_EDIT2 + 29) /* Redlining annehmen/ablehnen */
#define FN_ATTR_COLUMNS              (FN_EDIT2 + 31) /* SlotId fuer SwFmtCol */
#define FN_EDIT_CURRENT_TOX          (FN_EDIT2 + 32) /* edit current index */
#define FN_EDIT_AUTH_ENTRY_DLG       (FN_EDIT2 + 33) /* edit authorities entry*/
#define FN_UPDATE_CHARTS             (FN_EDIT2 + 34) /* update all charts */

#define FN_EDIT_HYPERLINK            (FN_EDIT2 + 35)    /* edit hyperlink */

/*--------------------------------------------------------------------
    Bereich: Bearbeiten
 --------------------------------------------------------------------*/

#define FN_REFRESH_VIEW         (FN_VIEW + 1)   /* Refresh/Redraw */
#define FN_SHOW_OUTLINE_VIEW    (FN_VIEW + 2)   /* Gliederungsansicht */

#define FN_DRAW_WRAP_DLG        (FN_VIEW + 3)   /* Draw Umlauf-Dlg */

#define FN_RULER                (FN_VIEW + 11)  /* Horizontales Lineal */

#define FN_VIEW_GRAPHIC         (FN_VIEW + 13)  /* Grafiken anzeigen */
#define FN_VIEW_BOUNDS          (FN_VIEW + 14)  /* Begrenzungen */
#define FN_VIEW_FIELDS          (FN_VIEW + 15)  /* Textbefehle */
#define FN_VLINEAL              (FN_VIEW + 16)  /* Vertikales Lineal */
#define FN_VSCROLLBAR           (FN_VIEW + 17)  /* Vertikaler Scrollbar */
#define FN_HSCROLLBAR           (FN_VIEW + 18)  /* Horizontaler Scrollbar */
#define FN_TOOLBOX_TOGGLE       (FN_VIEW + 19)  /* Toolboxinhalte umschalten */
#define FN_VIEWOPTIONS_ON       (FN_VIEW + 20)  /* Gruppe Viewoptions an */
#define FN_VIEWOPTIONS_OFF      (FN_VIEW + 21)  /* Gruppe Viewoptions aus */
#define FN_CONTROLS_ON          (FN_VIEW + 22)  /* Gruppe Bedienelemte an */
#define FN_CONTROLS_OFF         (FN_VIEW + 23)  /* Gruppe Bedienelemte aus */

#define FN_VIEW_META_CHARS      (FN_VIEW + 24)  /* Sonderzeichen anzeigen */
#define FN_VIEW_MARKS           (FN_VIEW + 25)  /* Markierungen anzeigen */
#define FN_VIEW_FIELDNAME       (FN_VIEW + 26)  /* Feldname anzeigen */
#define FN_VIEW_TABLEGRID       (FN_VIEW + 27)  /* Tabellenbegrenzungen anzeigen */

#define FN_LAUNCH_SIM           (FN_VIEW + 28)  /* StarImage starten */
#define FN_SET_PAGE             (FN_VIEW + 29)  /* Seitenvorlage am Absatz setzen */

#define FN_TOOLBOX_SWITCH       (FN_VIEW + 30)  /* Auf Textshell umschalten */


//noch mehr Navigator
#define FN_CONTENT_LB           (FN_VIEW + 32)  /**/
#define FN_SHOW_CONTENT_BOX     (FN_VIEW + 33)  /**/
#define FN_SHOW_ROOT            (FN_VIEW + 34)  /**/
#define FN_DROP_REGION          (FN_VIEW + 35)  /**/
#define FN_OUTLINE_LEVEL        (FN_VIEW + 36)  /**/

#define FN_PRINT_LAYOUT         (FN_VIEW + 37)  /* invertierter BrowseMode */

#define FN_DROP_REGION_LINK     (FN_VIEW + 38)  /**/
#define FN_DROP_REGION_COPY     (FN_VIEW + 39)  /**/

#define FN_SCROLL_NAVIGATION    (FN_VIEW + 40)  /* Navigationscontroller am Scrollbar*/
#define FN_SCROLL_NEXT_PREV     (FN_VIEW + 41)  /* arbeitet den MoveType ab */

#define FN_VIEW_HIDDEN_PARA     (FN_VIEW + 42)  /* Versteckte Absaetze */
#define FN_VIEW_SMOOTH_SCROLL   (FN_VIEW + 43)

#define FN_GLOBAL_SWITCH        (FN_VIEW + 44)  /* umschalten zw. Global und Inhalt*/
#define FN_GLOBAL_EDIT          (FN_VIEW + 45)  /* bearbeiten */
#define FN_GLOBAL_UPDATE        (FN_VIEW + 46)  /* aktualisieren */
#define FN_GLOBAL_OPEN          (FN_VIEW + 47)  /* oeffnen */
#define FN_GLOBAL_SAVE_CONTENT  (FN_VIEW + 48)  /* Inhalt der Verknuepfung mitspeichern */
#define FN_CREATE_NAVIGATION    (FN_VIEW + 49)  /* Navigations-Controller erzeugen */
#define FN_PREVIEW_PRINT_OPTIONS (FN_VIEW + 50)  /* Optionsdialog Preview drucken */
#define FN_PREVIEW_ZOOM          (FN_VIEW + 51)  /* der Tabellencontroller fuer den Zoom */

#define FN_SET_MODOPT_TBLNUMFMT  (FN_VIEW + 52) /* Zahlenerkennung in Tabellen */

/*--------------------------------------------------------------------
    Bereich: Einfuegen
 --------------------------------------------------------------------*/
// schon im Svx definiert
#define FN_INSERT_BOOKMARK      (FN_INSERT + 2 )  /* Sprungmarke einfuegen */

// schon im SVX unter der gleichen Id
//#define FN_INSERT_BREAK       (FN_INSERT + 3 )  /* Umbruch */

#define FN_INSERT_BREAK_DLG     (FN_INSERT + 4 )  /* Umbruch */
#define FN_INSERT_COLUMN_BREAK  (FN_INSERT + 5 )  /* Spaltenumbruch */
#define FN_INSERT_DATE_TIME     (FN_INSERT + 6 )  /* Datum/Uhrzeit */
#define FN_INSERT_FIELD         (FN_INSERT + 8 )  /* Textbefehl */
#define FN_CHANGE_DBFIELD       (FN_INSERT + 9 )  /* Datenbankfeld aendern */

#define FN_INSERT_CAPTION       (FN_INSERT + 10)    /* Beschriftung */
#define FN_INSERT_FOOTNOTE_DLG  (FN_INSERT + 12)    /* Dialog Fussnote */

#define FN_INSERT_REF_FIELD     (FN_INSERT + 13)  /* Refernzfeld einfuegen */

#define FN_INSERT_HYPERLINK     (FN_INSERT + 14)    /* Zeichendialog/HyperlinkPage*/

#define FN_INSERT_INDEX         (FN_INSERT + 16)    /* Stichworteintrag */
#define FN_INSERT_INDEX_DLG     (FN_INSERT + 17)    /* Stichworteintrag */
#define FN_INSERT_LINEBREAK     (FN_INSERT + 18)    /* Zeilenumbruch */

#define FN_INSERT_OBJECT        (FN_INSERT + 21)    /* Object */
#define FN_INSERT_OBJECT_DLG    (FN_INSERT + 22)    /* Object */
#define FN_INSERT_PAGEBREAK     (FN_INSERT + 23)    /* Seitenumbruch */
#define FN_INSERT_PAGENO        (FN_INSERT + 24)    /* Seitennummer */
#define FN_INSERT_PARAGRAPH     (FN_INSERT + 25)    /* Absatz */
#define FN_INSERT_RECORD        (FN_INSERT + 26)    /* Datensatz einfuegen */
#define FN_MERGE_RECORD         (FN_INSERT + 27)    /* Datensatz mischen */
#define FN_INSERT_SYMBOL        (FN_INSERT + 28)    /* Sonderzeichen */
#define FN_POSTIT               (FN_INSERT + 29)    /* PostIt einfuegen/bearbeiten */
#define FN_INSERT_TABLE         (FN_INSERT + 30)    /* Tabelle */
// schon im Svx definiert
#define FN_INSERT_COLS          (FN_INSERT + 32)    /* Spalten einfuegen */
#define FN_INSERT_FRAME_INTERACT (FN_INSERT + 33)   /* Rahmen einfuegen aktiv */
#define FN_INSERT_FRAME         (FN_INSERT + 34)    /* Rahmen einfuegen */

#define FN_INSERT_IDX_ENTRY_DLG (FN_INSERT + 35)    /* Verzeichniseintrag einfuegen */
#define FN_INSERT_FRAME_INTERACT_NOCOL (FN_INSERT + 36) /*insert interactive non column frame*/

#define FN_INSERT_SOFT_HYPHEN   (FN_INSERT + 43)    /* weicher Trenner */
#define FN_INSERT_HARD_SPACE    (FN_INSERT + 44)    /* hartes Space */
#define FN_INSERT_REGION        (FN_INSERT + 45)    /* Bereich einfuegen */



#define FN_TOOL_GROUP           (FN_INSERT + 47)    /* Objekte gruppieren */
#define FN_TOOL_UNGROUP         (FN_INSERT + 48)    /* Gruppierng aufheben */

#define FN_TOOL_ANKER           (FN_INSERT + 49)    /* Draw-Objekt umankern */
#define FN_TOOL_ANKER_PAGE      (FN_INSERT + 50)    /* Draw-Objekt an Seite verankern */
#define FN_TOOL_ANKER_PARAGRAPH (FN_INSERT + 51)    /* Draw-Objekt am Absatz verankern */
#define FN_TOOL_HIERARCHIE      (FN_INSERT + 52)    /* Hierarchie aendern */
#define FN_TOOL_VMIRROR         (FN_INSERT + 53)    /* Objekt in unteren Layer */
#define FN_TOOL_HMIRROR         (FN_INSERT + 54)    /* Objekt in oberen Layer */

//#define FN_QRY_OPEN_DB            (FN_INSERT + 55)    /* Datenbank oeffnen (Basic) */
//#define FN_QRY_DEFINE_DB      (FN_INSERT + 56)    /* Neue Datenbankdefinition anlegen (Basic) */
//#define FN_QRY_SELECT         (FN_INSERT + 57)    /* SQL-Statement angeben (Basic) */
//#define FN_QRY_TO_FIRST_REC       (FN_INSERT + 58)    /* Ersten Datensatz anwaehlen (Basic) */
//#define FN_QRY_TO_NEXT_REC        (FN_INSERT + 59)    /* Naechsten Datensatz anwaehlen (Basic) */
//#define FN_QRY_TO_REC         (FN_INSERT + 60)    /* Bestimmten Datensatz anwaehlen (Basic) */
//#define FN_QRY_GET_RECORD_ID  (FN_INSERT + 61)    /* Datensatznummer erfragen (Basic) */
//#define FN_QRY_GET_COLUMN_NUM (FN_INSERT + 62)    /* Anzahl der Spalten (Basic) */

#define FN_QRY                  (FN_INSERT + 63)    /* Datensatz einfuegen */
#define FN_QRY_MERGE            (FN_INSERT + 64)    /* Datensatz einfuegen (Serienbrief) */
#define FN_QRY_OPEN_TABLE       (FN_INSERT + 65)    /* Datenbank oeffnen (Basic) */
#define FN_TOOL_ANKER_FRAME     (FN_INSERT + 66)    /* Draw-Objekt am Rahmen verankern */
//#define FN_QRY_SWITCH             (FN_INSERT + 67)    /* Auf eine bestimmte Datenbank umschalten */

#define FN_INSERT_SIM           (FN_INSERT + 68)    /* Einfuegen StarImage */
#define FN_INSERT_SMA           (FN_INSERT + 69)    /* Einfuegen StarMath  */

#define FN_QRY_GET_COLUMN_NAME  (FN_INSERT + 70)    /* Anzahl der Spalten (Basic) */
#define FN_QRY_GET_COLUMN_TYPE  (FN_INSERT + 71)    /* Type des Datenbankfeldes ermitteln (Basic) */
#define FN_QRY_GET_COLUMN_TEXT  (FN_INSERT + 72)    /* Inhalt des aktuellen Datensatzes (Basic) */
#define FN_QRY_DEL_DEFINED_DB   (FN_INSERT + 75)    /* Datenbankdefinition loeschen (Basic) */

#define FN_DRAWTEXT_ATTR_DLG    (FN_INSERT + 76)    /* DrawText positionieren */

#define FN_QRY_APPEND_RECORD    (FN_INSERT + 77)    /* Neuen Datensatz anhaengen */
#define FN_QRY_UPDATE_RECORD    (FN_INSERT + 78)    /* Datensatzspalte aendern */
#define FN_QRY_DELETE_RECORD    (FN_INSERT + 79)    /* Datensatz loeschen */
#define FN_QRY_GET_PHYS_RECORD_ID (FN_INSERT + 80)  /* Physikalische (absolute) Datensatznummer erfragen (Basic) */

#define FN_TOOL_ANKER_CHAR       (FN_INSERT + 84)   /* DrawObject zeichengebunden */
#define FN_INSERT_HARDHYPHEN     (FN_INSERT + 85)   /* Bindestrich ohne Umbruch*/

#define FN_QRY_INSERT           (FN_INSERT + 86)    /* Datensatz-Selektion in Text einfuegen */
#define FN_QRY_MERGE_FIELD      (FN_INSERT + 87)    /* Datensatz-Selektion in Felder einfuegen */
#define FN_QRY_INSERT_FIELD     (FN_INSERT + 88)    /* Datenbankfeld einfuegen */

#define FN_INSERT_CTRL          (FN_INSERT + 89)    /* Werkzeugleistencontroller Einfuegen*/
#define FN_INSERT_OBJ_CTRL      (FN_INSERT + 90)    /* Werkzeugleistencontroller Einfuegen/Objekt*/
#define FN_INSERT_FIELD_CTRL    (FN_INSERT + 91)    /* Werkzeugleistencontroller Einfuegen/Feldbefehle*/

#define FN_INSERT_FLD_DATE      (FN_INSERT + 92)
#define FN_INSERT_FLD_TIME      (FN_INSERT + 93)
#define FN_INSERT_FLD_PGNUMBER  (FN_INSERT + 94)
#define FN_INSERT_FLD_PGCOUNT   (FN_INSERT + 95)
#define FN_INSERT_FLD_TOPIC     (FN_INSERT + 96)
#define FN_INSERT_FLD_TITLE     (FN_INSERT + 97)
#define FN_INSERT_FLD_AUTHOR    (FN_INSERT + 98)
#define FN_INSERT_FOOTNOTE      (FN_INSERT + 99)

/*--------------------------------------------------------------------
    Bereich: Einfuegen (2.Teil)
 --------------------------------------------------------------------*/

#define FN_QRY_GET_ALL_DBNAME   (FN_INSERT2 + 1)    /* Alle konfigurierten Datenabanknamen ermitteln */
#define FN_QRY_GET_DBNAME_COUNT (FN_INSERT2 + 2)    /* Anzahl aller konfigurierten Datenabanknamen */
#define FN_QRY_GET_TABLE_NAME   (FN_INSERT2 + 3)    /* Tabellenname einer Datenbank ermitteln */
#define FN_QRY_GET_TABLE_COUNT  (FN_INSERT2 + 4)    /* Anzahl aller Tabellen einer Datenbank ermitteln */

#define FN_INSERT_HEADER        (FN_INSERT2 + 5)    /* Kopfzeile im Html-mode ein/ausschalten */
#define FN_INSERT_FOOTER        (FN_INSERT2 + 6)    /* Fuázeile im Html-mode ein/ausschalten */
#define FN_SBA_BRW_UPDATE       (FN_INSERT2 + 7)    /* Datensaetze in Felder einfuegen */
#define FN_SBA_BRW_INSERT       (FN_INSERT2 + 8)    /* Datensaetze in Text einfuegen */
#define FN_SBA_BRW_MERGE        (FN_INSERT2 + 9)    /* Serienbriefdruck */
#define FN_JAVAEDIT             (FN_INSERT2 + 10)   /* Scriptfeld bearbeiten */
#define FN_INSERT_HRULER        (FN_INSERT2 + 11)   /* horiz. Grafiklinie einfuegen */
#define FN_TOOL_ANKER_AT_CHAR   (FN_INSERT2 + 12)   /* Object zeichengebunden */

#define FN_INSERT_PAGEHEADER    (FN_INSERT2 + 13)   /* Standard Kopfzeile einfuegen */
#define FN_INSERT_PAGEFOOTER    (FN_INSERT2 + 14)   /* Standard Fusszeile einfuegen */

#define FN_INSERT_ENDNOTE           (FN_INSERT2 + 18)   /* Endnote einfuegen*/
#define FN_INSERT_COLUMN_SECTION    (FN_INSERT2 + 19)   /* Spaltigen Bereich einfügen */

#define FN_INSERT_MULTI_TOX         (FN_INSERT2 + 20)   /* insert any TOX */
#define FN_INSERT_AUTH_ENTRY_DLG    (FN_INSERT2 + 21)   /* insert entry for table of authorities*/

#define FN_SECTION_APPENDNODE       (FN_INSERT2 + 22)   /* insert an Paragraph behind the current section*/

/*--------------------------------------------------------------------
    Bereich: Format
 --------------------------------------------------------------------*/

#define FN_AUTOFORMAT_APPLY     (FN_FORMAT + 1 ) /* Autoformat-Optionen anwenden */
#define FN_AUTOFORMAT_AUTO      (FN_FORMAT + 2 ) /* Autoformat waehrend der Eingabe */
#define FN_GROW_FONT_SIZE       (FN_FORMAT + 3 ) /* Groesse */
#define FN_SHRINK_FONT_SIZE     (FN_FORMAT + 4 ) /* Groesse */
#define FN_UNDERLINE_DOUBLE     (FN_FORMAT + 5 ) /* Doppelt unterstreichen */
#define FN_AUTOFORMAT_REDLINE_APPLY (FN_FORMAT + 6 ) /* Autoformat mit Redlining anwenden */
#define FN_SET_SUPER_SCRIPT     (FN_FORMAT + 11) /* Hochstellung */
#define FN_SET_SUB_SCRIPT       (FN_FORMAT + 12) /* Tiefstellung */

#define FN_SET_CASEMAP          (FN_FORMAT + 14) /* CaseMap */
#define FN_SET_LANGUAGE         (FN_FORMAT + 15) /* Sprache */
#define FN_SET_KERNING          (FN_FORMAT + 16) /* Kerning */

#define FN_INDENT_TO_TABSTOP    (FN_FORMAT + 17) /* Einrueckung auf die naechste Tabpostion */
//schon in svxids.hrc
//#define FN_SET_JUSTIFY_PARA   (FN_FORMAT + 21) /* Ausrichtung Absatz */
#define FN_FLIP_HORZ_GRAFIC     (FN_FORMAT + 25) /* Spiegeln horizontal */
#define FN_FLIP_VERT_GRAFIC     (FN_FORMAT + 26) /* Spiegeln vertikal */
#define FN_SET_LINE_SPACE       (FN_FORMAT + 27) /* Zeilenabstand parametrisiert */
#define FN_SET_ADJUST           (FN_FORMAT + 28) /* Ausrichtung parametrisiert */
#define FN_SET_LRMARGIN         (FN_FORMAT + 29) /* linker/rechter Rand */
#define FN_SET_ULMARGIN         (FN_FORMAT + 30) /* oberer/unterer Rand */
#define FN_UNINDENT_TO_TABSTOP  (FN_FORMAT + 31) /* Einrueckung auf die vorgige Tabpostion */

#define FN_SET_HYPHEN_ZONE      (FN_FORMAT + 32) /* Silbentrennung */
#define FN_SET_KEEP_TOGETHER    (FN_FORMAT + 34) /* nicht trennen */
#define FN_SET_KEEP_WITH_NEXT   (FN_FORMAT + 35) /* mit folgendem zus. */
#define FN_SET_WIDOW            (FN_FORMAT + 36) /* Widows */
#define FN_SET_ORPHAN           (FN_FORMAT + 37) /* Orphans */


#define FN_REGISTER_COLLECTION  (FN_FORMAT + 43)  /* Referenzvorlage an der Seite */
#define FN_REGISTER_MODE        (FN_FORMAT + 44)  /* Registermodus an/aus */
#define FN_NUM_FORMAT_TABLE_DLG     (FN_FORMAT + 45)  /* Zahlenformat in Tabelle */
#define FN_FORMAT_BORDER_DLG        (FN_FORMAT + 48)  /* Umrandung */
#define FN_FORMAT_PAGE_COLUMN_DLG   (FN_FORMAT + 49)  /* Spalten pro Seite */
#define FN_FORMAT_BACKGROUND_DLG    (FN_FORMAT + 50)  /* Hintergrund */
#define FN_FORMAT_PAGE              (FN_FORMAT + 51)  /* Seite */
#define FN_FORMAT_PAGE_DLG          (FN_FORMAT + 52)  /* Seite */
#define FN_FORMAT_COLUMN            (FN_FORMAT + 53)  /* Spalten */
#define FN_FORMAT_DROPCAPS          (FN_FORMAT + 54)  /* Initialien */
#define FN_FORMAT_FRAME             (FN_FORMAT + 55)  /* Rahmen */
#define FN_FORMAT_FRAME_DLG         (FN_FORMAT + 56)  /* Rahmen */
#define FN_FORMAT_GRAFIC            (FN_FORMAT + 57)  /* Grafik */
#define FN_FORMAT_GRAFIC_DLG        (FN_FORMAT + 58)  /* Grafik */
#define FN_FORMAT_TABLE             (FN_FORMAT + 59)  /* Tabelle */
#define FN_FORMAT_TABLE_DLG         (FN_FORMAT + 60)  /* Tabelle */
#define FN_FORMAT_OLE_DLG           (FN_FORMAT + 61)  /* OLE bearbeiten */

#define FN_NEW_STYLE_BY_EXAMPLE     (FN_FORMAT + 62)  /* Vorlage erzeugen by Example */
#define FN_UPDATE_STYLE_BY_EXAMPLE  (FN_FORMAT + 63)  /* Vorlage aktualisieren */
#define FN_STYLE_SHEET_FRAME_DLG    (FN_FORMAT + 64)  /* Rahmenvorlage */
#define FN_STYLE_SHEET_DOC_DLG      (FN_FORMAT + 65)  /* Dokumentvorlage */
#define FN_STYLE_SHEET_GRAFIK_DLG   (FN_FORMAT + 66)  /* Dokumentvorlage */
#define FN_FORMAT_FOOTNOTE          (FN_FORMAT + 67)  /* Fussnoten */
#define FN_FORMAT_FOOTNOTE_DLG      (FN_FORMAT + 68)  /* Fussnoten-Dialog */

// schon im Svx definiert
//#define FN_FORMAT_RESET           (FN_FORMAT + 69)  /* Format zuruecksetzen */

#define FN_FRAME_TO_TOP             (FN_FORMAT + 70)  /* Rahmen nach oben */
#define FN_FRAME_TO_BOTTOM          (FN_FORMAT + 71)  /* Rahmen nach unten */

#define FN_FRAME_NOWRAP             (FN_FORMAT + 72)  /* Rahmen kein Umlauf */
#define FN_FRAME_WRAP               (FN_FORMAT + 73)  /* Rahmen Umlauf */
#define FN_FRAME_WRAPTHRU           (FN_FORMAT + 74)  /* Rahmen Durchlauf */

#define FN_FRAME_ALIGN_HORZ_LEFT    (FN_FORMAT + 75)  /* Rahmen horz. links */
#define FN_FRAME_ALIGN_HORZ_RIGHT   (FN_FORMAT + 76)  /* Rahmen horz. rechts */
#define FN_FRAME_ALIGN_HORZ_CENTER  (FN_FORMAT + 77)  /* Rahmen horz. zentriert */
#define FN_FRAME_ALIGN_VERT_TOP     (FN_FORMAT + 78)  /* Rahmen vert. oben */
#define FN_FRAME_ALIGN_VERT_BOTTOM  (FN_FORMAT + 79)  /* Rahmen vert. unten */
#define FN_FRAME_ALIGN_VERT_CENTER  (FN_FORMAT + 80)  /* Rahmen vert. zentriert */

#define FN_SET_FRM_POSITION         (FN_FORMAT + 82)/* Rahmenposition -- " -- */
#define FN_SET_FRM_OPTIONS          (FN_FORMAT + 86)/* Rahmenoptionen -- " -- */

#define FN_SET_PAGE_STYLE           (FN_FORMAT + 93)  /* Anwenden Seitenv. */


#define FN_TABLE_REP                (FN_FORMAT + 99)  /* TableRepresentation */
#define FN_CONVERT_TEXT_TABLE       (FN_FORMAT + 100)  /* Konvertierung Text <-> Tabelle */
#define FN_TABLE_INSERT_ROW         (FN_FORMAT + 101)  /* Tabelle: Zeile einfuegen */
#define FN_TABLE_INSERT_COL         (FN_FORMAT + 102)  /* Tabelle: Spalte einfuegen */
#define FN_TABLE_DELETE_ROW         (FN_FORMAT + 103)  /* Tabelle: Zeile loeschen */
#define FN_TABLE_DELETE_COL         (FN_FORMAT + 104)  /* Tabelle: Spalte loeschen */
#define FN_TABLE_SPLIT_CELLS        (FN_FORMAT + 105)  /* Tabelle: Zellen teilen */
#define FN_TABLE_MERGE_CELLS        (FN_FORMAT + 106)  /* Tabelle: Zellen verbinden */
#define FN_TABLE_SET_ROW_HEIGHT     (FN_FORMAT + 107)  /* Tabelle: Zeilenhoehe setzen */
#define FN_TABLE_SET_COL_WIDTH      (FN_FORMAT + 108)  /* Tabelle: Spaltenbreite setzen */
#define FN_TABLE_SET_ULSPACE        (FN_FORMAT + 109)  /* Tabelle: oberen / unteren Abstand einstellen */
#define FN_OPTIMIZE_TABLE           (FN_FORMAT + 110)  /* ToolBoxItem fuer Optimierung in Tabellen  */
#define FN_TABLE_SET_SHADOW         (FN_FORMAT + 111)  /* Tabelle: Schatten einstellen */
#define FN_TABLE_GOTO_CELL          (FN_FORMAT + 112)  /* Tabelle: Zelle anspringen */
#define FN_TABLE_SELECT_ROW         (FN_FORMAT + 113)  /* Tabelle: Zeile selektieren */
#define FN_TABLE_SELECT_COL         (FN_FORMAT + 114)  /* Tabelle: Spalte selektieren */
#define FN_TABLE_SELECT_ALL         (FN_FORMAT + 115)  /* Tabelle: Tabelle selektieren */
#define FN_TABLE_SET_READ_ONLY      (FN_FORMAT + 116)  /* Tabelle: Tabelle schuetzen */
#define FN_TABLE_SET_READ_ONLY_CELLS (FN_FORMAT + 117)  /* Tabelle: Tabellezellen schuetzen */
#define FN_TABLE_UNSET_READ_ONLY_CELLS  (FN_FORMAT + 119)  /* Tabelle: Tabellezellen schuetzen aufheben */
#define FN_TABLE_HEADLINE_REPEAT    (FN_FORMAT + 120)   /* used in SwXTextTable*/
#define FN_TABLE_ADJUST_CELLS       (FN_FORMAT + 121)  /* Tabelle: Zellen anpassen */

#define FN_FRAME_UP                 (FN_FORMAT + 122)  /* Rahmen um eine Ebene nach oben */
#define FN_FRAME_DOWN               (FN_FORMAT + 123)  /* Rahmen um eine Ebene nach unten */

#define FN_TABLE_INSERT_CHART       (FN_FORMAT + 124)

#define FN_SET_FRM_LRSPACE          (FN_FORMAT + 125)  /* Rahmen Seitenabstand           */
#define FN_SET_FRM_ULSPACE          (FN_FORMAT + 126)  /* Rahmen Kopf-/Fussabstand      */
#define FN_TABLE_SET_LRSPACE        (FN_FORMAT + 127)  /* Tabelle: linker / rechter Abstand einstellen */
#define FN_TABLE_OPTIMAL_HEIGHT     (FN_FORMAT + 128)  /* Zellenhoehe optimal*/

/*--------------------------------------------------------------------
    Bereich: Seitenvorlage
 --------------------------------------------------------------------*/

#define FN_NEW_PAGE_STYLE           (FN_FORMAT + 129) /* Anlegen Seitenvorlage */
#define FN_PAGE_STYLE_SET_LR_MARGIN (FN_FORMAT + 130) /* linker / rechter Rand */
#define FN_PAGE_STYLE_SET_UL_MARGIN (FN_FORMAT + 131) /* oberer / unterer Rand */
#define FN_PAGE_STYLE_SET_PAGE      (FN_FORMAT + 134) /* linke, rechte...  */
#define FN_PAGE_STYLE_SET_PAPER_SIZE (FN_FORMAT + 135) /* Papiergroesse */
#define FN_PAGE_STYLE_SET_PAPER_BIN (FN_FORMAT + 136) /* Druckerschacht */
#define FN_PAGE_STYLE_SET_NUMBER_FORMAT (FN_FORMAT + 137) /* Numerierungsart */
#define FN_PAGE_STYLE_SET_COLS      (FN_FORMAT + 138) /* Spaltenanzahl */


/* OS: Diese Ids werden nur noch fuer die Hilfe benoetigt und sind fuer den
 Dialog durch die Ids ohne _DLG ersetzt*/
#define FN_TABLE_INSERT_COL_DLG     (FN_FORMAT + 142)  /* Tabelle: Dlg. Spalte einfuegen */
#define FN_TABLE_INSERT_ROW_DLG     (FN_FORMAT + 143)  /* Tabelle: Dlg. Zeile einfuegen */



//hier geht's weiter !
/*--------------------------------------------------------------------
    Bereich: Ribbon
 --------------------------------------------------------------------*/

#define FN_SET_BACKGROUND_COLOR     (FN_FORMAT + 150)  /* Hintergrundfarbe */

#define FN_SET_BORDER_POS           (FN_FORMAT + 152)  /* Position Umrandung */
#define FN_SET_BORDER_LINES         (FN_FORMAT + 153)  /* Linienart Umrandung */
#define FN_SET_BORDER_COLOR         (FN_FORMAT + 154)  /* Farbe Umrandung */

#define FN_FORMULA_CALC             (FN_FORMAT + 156)  /* Formelauswahl */
#define FN_FORMULA_CANCEL           (FN_FORMAT + 157)  /* Formel nicht uebernehmen */
#define FN_FORMULA_APPLY            (FN_FORMAT + 158)  /* Formel uebernehmen */

#define FN_TABLE_UNSET_READ_ONLY    (FN_FORMAT + 159)  /* Zellenschutz fuer Tab. aufheben */

#define FN_FORMULA_POSITION         (FN_FORMAT + 160)  /* Positionsanzeige */
#define FN_FORMULA_EDIT             (FN_FORMAT + 161)  /* Editfeld */


#define FN_FRAME_WRAP_IDEAL         (FN_FORMAT + 163)  /* Rahmen Idealer Umlauf */
#define FN_FRAME_WRAPTHRU_TRANSP    (FN_FORMAT + 164)  /* Rahmen Transparenter Durchlauf */

#define FN_FRAME_ALIGN_VERT_ROW_TOP     (FN_FORMAT + 165)  /* Rahmen vert. Zeile oben */
#define FN_FRAME_ALIGN_VERT_ROW_BOTTOM  (FN_FORMAT + 166)  /* Rahmen vert. Zeile unten */
#define FN_FRAME_ALIGN_VERT_ROW_CENTER  (FN_FORMAT + 167)  /* Rahmen vert. Zeile zentriert */

#define FN_FRAME_ALIGN_VERT_CHAR_TOP    (FN_FORMAT + 168)  /* Rahmen vert. Zeichen oben */
#define FN_FRAME_ALIGN_VERT_CHAR_BOTTOM (FN_FORMAT + 169)  /* Rahmen vert. Zeichen unten */
#define FN_FRAME_ALIGN_VERT_CHAR_CENTER (FN_FORMAT + 170)  /* Rahmen vert. Zeichen zentriert */

#define FN_TABLE_SET_DEF_BORDER         (FN_FORMAT + 171)  /* vordefinierte Umrandungen setzen */

#define FN_FRAME_WRAP_LEFT              (FN_FORMAT + 172)  /* Rahmen Umlauf links */
#define FN_FRAME_WRAP_RIGHT             (FN_FORMAT + 173)  /* Rahmen Umlauf links */

#define FN_TABLE_SET_ROW_AUTOHEIGHT (FN_FORMAT + 174)  /* Tabelle: Minimale automatische Zeilenhoehe setzen */


#define FN_WRAP_ANCHOR_ONLY         (FN_FORMAT + 181)  /* Umlauf nur fuer ersten Absatz */

#define FN_TABLE_BALANCE_CELLS      (FN_FORMAT + 182)  /* Spalten gleichmaessig verteilen */
#define FN_TABLE_BALANCE_ROWS       (FN_FORMAT + 183)  /* Zeilen gleichmaessig verteilen */

#define FN_FRAME_WRAP_CONTOUR       (FN_FORMAT + 184)  /* Rahmen Kunturumlauf */

#define FN_TABLE_VERT_NONE          (FN_FORMAT + 185)  /* vertikale Ausrichtung in Tabellenzellen */
#define FN_TABLE_VERT_CENTER        (FN_FORMAT + 186)  /*   -"-  */
#define FN_TABLE_VERT_BOTTOM        (FN_FORMAT + 187)  /*  -"-  */
#define FN_TABLE_SET_VERT_ALIGN     (FN_FORMAT + 188)  /*  -"-  */
#define FN_TABLE_MODE_FIX           (FN_FORMAT + 189)  /* Tabellenmodus */
#define FN_TABLE_MODE_FIX_PROP      (FN_FORMAT + 190)  /*  -"-  */
#define FN_TABLE_MODE_VARIABLE      (FN_FORMAT + 191)  /*  -"-  */

#define FN_TABLE_AUTOSUM            (FN_FORMAT + 195)  /* Autosumme*/
#define FN_SET_CONTROL_HANDLER      (FN_FORMAT + 199)  /* Macro setzen */

#define FN_IS_IMAGE                  (FN_FORMAT2 + 6)   /* Numerierung : mit Grafik?*/

#define FN_GOTO_NEXT_REGION          (FN_FORMAT2 + 9)   /* Naechsten Bereich anspringen */
#define FN_GOTO_PREV_REGION          (FN_FORMAT2 + 10)  /* Vorherigen " */

#define FN_GET_SBXCONTROL            (FN_FORMAT2 + 11)  /* SbxObject rausreichen */
#define FN_ABSTRACT_NEWDOC           (FN_FORMAT2 + 12)  /* Abstract in neuem Doc */
#define FN_ABSTRACT_STARIMPRESS      (FN_FORMAT2 + 13)  /* Abstract an StarImpress */







#define FN_NUMBER_FORMAT                    (FN_FORMAT2 + 120) /* Boxen/NumberFormatter eistellen */
#define FN_NUMBER_STANDARD                  (FN_FORMAT2 + 121)
#define FN_NUMBER_TWODEC                    (FN_FORMAT2 + 123)
#define FN_NUMBER_SCIENTIFIC                (FN_FORMAT2 + 124)
#define FN_NUMBER_DATE                      (FN_FORMAT2 + 125)
#define FN_NUMBER_TIME                      (FN_FORMAT2 + 126)
#define FN_NUMBER_CURRENCY                  (FN_FORMAT2 + 127)
#define FN_NUMBER_PERCENT                   (FN_FORMAT2 + 128)



#define FN_FRAME_CHAIN                      (FN_FORMAT2 + 136)
#define FN_FRAME_UNCHAIN                    (FN_FORMAT2 + 137)

#define FN_NUMBER_NEWSTART                  (FN_FORMAT2 + 138)
#define FN_NUMBER_NEWSTART_AT               (FN_FORMAT2 + 139)

#define FN_FRAME_MIRROR_ON_EVEN_PAGES       (FN_FORMAT2 + 140)
#define FN_GRAPHIC_MIRROR_ON_EVEN_PAGES     (FN_FORMAT2 + 141)

#define FN_TABLE_SPLIT_TABLE                (FN_FORMAT2 + 142)
#define FN_SYNC_LABELS                      (FN_FORMAT2 + 143)


#define FN_TABLE_RELATIVE_WIDTH             (FN_FORMAT2 + 147)  /* Tabelle: relative Breite - UNO */
#define FN_TABLE_WIDTH                      (FN_FORMAT2 + 148)  /* Tabelle: Breite - UNO */
#define FN_TABLE_IS_RELATIVE_WIDTH          (FN_FORMAT2 + 149)  /* Tabelle: ist Breite relativ?- UNO */

#define FN_INC_INDENT_OFFSET                (FN_FORMAT2 + 150)
#define FN_DEC_INDENT_OFFSET                (FN_FORMAT2 + 151)

#define FN_TABLE_MERGE_TABLE                (FN_FORMAT2 + 152)

/*--------------------------------------------------------------------
    Bereich: Extras
 --------------------------------------------------------------------*/

#define FN_LINE_NUMBERING_DLG       (FN_EXTRA + 2 )   /* Zeilennumerierung */
#define FN_THESAURUS_DLG            (FN_EXTRA + 3 )   /* Thesaurus */
#define FN_HYPHENATE_OPT_DLG        (FN_EXTRA + 5 )   /* Silbentrennung */
#define FN_ADD_UNKNOWN              (FN_EXTRA + 6 )   /* Woerter lernen */
#define FN_DICTIONARY_DLG           (FN_EXTRA + 8 )   /* Woerterbuecher */
#define FN_NUMBERING                (FN_EXTRA + 9 )   /* Nummerierung/Bullets */
#define FN_NUMBERING_DLG            (FN_EXTRA + 10)   /* Nummerierung/Bullets */
#define FN_NUMBERING_OUTLINE        (FN_EXTRA + 11)   /* Gliederungsnumerierung */
#define FN_NUMBERING_OUTLINE_DLG    (FN_EXTRA + 12)   /* Gliederungsnumerierung */
#define FN_SORTING_DLG              (FN_EXTRA + 14)   /* Sortieren */
#define FN_CALCULATE                (FN_EXTRA + 15)   /* Berechnen */
#define FN_GENERATE_TOC_DLG         (FN_EXTRA + 16)   /* Inhaltsverzeichnis */
#define FN_GENERATE_INDEX_DLG       (FN_EXTRA + 17)   /* Stichwortverzeichnis */
#define FN_GENERATE_DIR_DLG         (FN_EXTRA + 18)   /* Verzeichnis */
#define FN_GLOSSARY_DLG             (FN_EXTRA + 20)   /* Textbausteine */
#define FN_MACRO_CHOOSER            (FN_EXTRA + 21)   /* Makro aufnehmen */
#define FN_SPELLING_DLG             (FN_EXTRA + 22)   /* Rechtschreibung */

#define FN_PLAY_MACRO               (FN_EXTRA + 23)   /* Makro abspielen */
#define FN_LAUNCH_BASIC             (FN_EXTRA + 25)   /* Makro abspielen */
#define FN_EXPAND_GLOSSARY          (FN_EXTRA + 28)   /* Textbausteine expandieren */
#define FN_CONFIG_TOOLBOX           (FN_EXTRA + 29)   /* Konfiguration Toolbox */
#define FN_CONFIG_MENU              (FN_EXTRA + 30)   /* Konfiguration Menu */
#define FN_CONFIG_KEY               (FN_EXTRA + 31)   /* Konfiguration Tastatur */
#define FN_CHANGE_PAGENUM           (FN_EXTRA + 34)   /* Seitennummer aendern */

#define FN_MACRO_POPUP              (FN_EXTRA + 37)   /* Alle Macrofunktionen */
#define FN_BULLET                   (FN_EXTRA + 38)   /* Bullet-Liste */


//  Bereich: Gloassaries

// schon im Svx definiert

//#define FN_GET_GLOSSARY_GROUP_COUNT (FN_EXTRA + 42)     /* Anzahl der Bausteingruppen */

#define FN_AUTO_CORRECT             (FN_EXTRA + 49 )  /* Autocorrect aus Basic */
#define FN_AUTO_CORRECT_DLG         (FN_EXTRA + 50 )  /* Dialog Autocorrect */

#define FN_UPDATE_TOX               (FN_EXTRA + 53)   /* alle Verzeichnisse aktualisieren */
#define FN_UPDATE_CUR_TOX           (FN_EXTRA + 54)   /* aktuelles Verzeichnisse aktualisieren */
#define FN_REMOVE_CUR_TOX           (FN_EXTRA + 55)  /* remove the current TOX*/

#define FN_NAVIGATION_PI_GOTO_PAGE  (FN_EXTRA + 59 )  /* Seitenanwahl aus Navi-PI */


#define FN_LETTER_WIZZARD           (FN_EXTRA + 60 )
#define FN_FAX_WIZZARD              (FN_EXTRA + 61 )
#define FN_MEMO_WIZZARD             (FN_EXTRA + 62 )
#define FN_AGENDA_WIZZARD           (FN_EXTRA + 63 )

#define FN_SET_BASIC_METRIC         (FN_EXTRA + 80) /* Defaultmetrik Basic setzen */

#define FN_RESERVED_9               (FN_EXTRA + 86)   /* Platzhalter */
#define FN_RESERVED_8               (FN_EXTRA + 87)   /* Platzhalter */
#define FN_RESERVED_7               (FN_EXTRA + 88)   /* Platzhalter */
#define FN_RESERVED_6               (FN_EXTRA + 89)   /* Platzhalter */
#define FN_RESERVED_5               (FN_EXTRA + 90)   /* Platzhalter */
#define FN_RESERVED_4               (FN_EXTRA + 91)   /* Platzhalter */
#define FN_RESERVED_3               (FN_EXTRA + 92)   /* Platzhalter */
#define FN_RESERVED_2               (FN_EXTRA + 93)   /* Platzhalter */
#define FN_RESERVED_1               (FN_EXTRA + 94)   /* Platzhalter */

#define FN_COLLECTION_GROUP_CNT     (FN_EXTRA + 96)
#define FN_COLLECTION_GROUP_IDX     (FN_EXTRA + 97)
#define FN_COLL_TYPE                (FN_EXTRA + 98)   /* Typ fuer GlobalDoc-Collection*/
#define FN_COLL_ADD                 (FN_EXTRA + 99)

#define FN_COLL_TITLE               (FN_EXTRA2 + 1)  /*  Bereichsname oder Index-Title */
#define FN_SHADOWCURSOR             (FN_EXTRA2 + 4)  /* Shadow Cursor ein/ausschalten */


#define FN_VIEW_IN_FRAME            (FN_EXTRA2 + 8)  /* die View befindet sich in einem FrameDoc*/

#define FN_UNO_PARA_STYLE           (FN_EXTRA2 + 9)  // jetzt kommen diverse UNO-Ids fuer die
#define FN_UNO_PAGE_STYLE           (FN_EXTRA2 + 10)  // PropertyMap

#define FN_UNO_FRAME_STYLE          (FN_EXTRA2 + 12)
#define FN_UNO_NUM_START_VALUE      (FN_EXTRA2 + 13)
#define FN_UNO_NUM_LEVEL            (FN_EXTRA2 + 14)
#define FN_UNO_NUM_RULES            (FN_EXTRA2 + 15)
#define FN_UNO_DOCUMENT_INDEX_MARK  (FN_EXTRA2 + 16)
#define FN_UNO_DOCUMENT_INDEX       (FN_EXTRA2 + 17)
#define FN_UNO_TEXT_FIELD           (FN_EXTRA2 + 18)
#define FN_UNO_TEXT_TABLE           (FN_EXTRA2 + 19)
#define FN_UNO_CELL                 (FN_EXTRA2 + 20)
#define FN_UNO_TEXT_FRAME           (FN_EXTRA2 + 21)
#define FN_UNO_REFERENCE_MARK       (FN_EXTRA2 + 22)
#define FN_UNO_TEXT_SECTION         (FN_EXTRA2 + 23)
#define FN_UNO_FOOTNOTE             (FN_EXTRA2 + 24)
#define FN_UNO_ENDNOTE              (FN_EXTRA2 + 25)
#define FN_UNO_RANGE_COL_LABEL      (FN_EXTRA2 + 26)
#define FN_UNO_RANGE_ROW_LABEL      (FN_EXTRA2 + 27)
#define FN_UNO_TABLE_COLUMS         (FN_EXTRA2 + 28)
#define FN_UNO_TABLE_BORDER         (FN_EXTRA2 + 29)
#define FN_UNO_TABLE_COLUMN_SEPARATORS      (FN_EXTRA2 + 30)
#define FN_UNO_TABLE_COLUMN_RELATIVE_SUM    (FN_EXTRA2 + 31)
#define FN_UNO_TABLE_CELL_BACKGROUND        (FN_EXTRA2 + 32)
#define FN_UNO_ROW_HEIGHT                   (FN_EXTRA2 + 33)
#define FN_UNO_ROW_AUTO_HEIGHT              (FN_EXTRA2 + 34)
#define FN_UNO_HEADER                       (FN_EXTRA2 + 35)
#define FN_UNO_HEADER_LEFT                  (FN_EXTRA2 + 36)
#define FN_UNO_HEADER_RIGHT                 (FN_EXTRA2 + 37)
#define FN_UNO_FOOTER                       (FN_EXTRA2 + 38)
#define FN_UNO_FOOTER_LEFT                  (FN_EXTRA2 + 39)
#define FN_UNO_FOOTER_RIGHT                 (FN_EXTRA2 + 40)
#define FN_UNO_HEADER_BACKGROUND            (FN_EXTRA2 + 41)
#define FN_UNO_HEADER_BOX                   (FN_EXTRA2 + 42)
#define FN_UNO_HEADER_LR_SPACE              (FN_EXTRA2 + 43)
#define FN_UNO_HEADER_SHADOW                (FN_EXTRA2 + 44)
#define FN_UNO_FOOTER_BACKGROUND            (FN_EXTRA2 + 45)
#define FN_UNO_FOOTER_BOX                   (FN_EXTRA2 + 46)
#define FN_UNO_FOOTER_LR_SPACE              (FN_EXTRA2 + 47)
#define FN_UNO_FOOTER_SHADOW                (FN_EXTRA2 + 48)
#define FN_UNO_HEADER_BODY_DISTANCE         (FN_EXTRA2 + 49)
#define FN_UNO_HEADER_IS_DYNAMIC_DISTANCE   (FN_EXTRA2 + 50)
#define FN_UNO_FOOTER_BODY_DISTANCE         (FN_EXTRA2 + 51)
#define FN_UNO_FOOTER_IS_DYNAMIC_DISTANCE   (FN_EXTRA2 + 52)
#define FN_UNO_HEADER_SHARE_CONTENT         (FN_EXTRA2 + 53)
#define FN_UNO_FOOTER_SHARE_CONTENT         (FN_EXTRA2 + 54)
#define FN_UNO_HEADER_HEIGHT                (FN_EXTRA2 + 55)
#define FN_UNO_FOOTER_HEIGHT                (FN_EXTRA2 + 56)
#define FN_UNO_HEADER_ON                    (FN_EXTRA2 + 57)
#define FN_UNO_FOOTER_ON                    (FN_EXTRA2 + 58)
#define FN_UNO_FOLLOW_STYLE                 (FN_EXTRA2 + 59)

#define FN_API_CALL                         (FN_EXTRA2 + 60)

#define FN_UNO_IS_PHYSICAL                  (FN_EXTRA2 + 61)
#define FN_UNO_IS_AUTO_UPDATE               (FN_EXTRA2 + 62)
#define FN_UNO_DISPLAY_NAME                 (FN_EXTRA2 + 63)

#define FN_UNO_WRAP                         (FN_EXTRA2 + 64)
#define FN_UNO_ANCHOR_TYPES                 (FN_EXTRA2 + 65)
#define FN_UNO_PARA_CHAPTER_NUMBERING_LEVEL (FN_EXTRA2 + 66)
#define FN_UNO_PARA_CONDITIONAL_STYLE_NAME  (FN_EXTRA2 + 67)

#define FN_UNO_CATEGORY                     (FN_EXTRA2 + 68)
#define FN_UNO_IS_NUMBER                    (FN_EXTRA2 + 69)
#define FN_UNO_TEXT_WRAP                    (FN_EXTRA2 + 70)
#define FN_UNO_ANCHOR_TYPE                  (FN_EXTRA2 + 71)
/*--------------------------------------------------------------------
    Bereich: Fenster
 --------------------------------------------------------------------*/

#define FN_SOURCEVIEW               SID_SOURCEVIEW
/*--------------------------------------------------------------------
    Bereich: Hilfe
 --------------------------------------------------------------------*/


#define FN_LAUNCH_HELP              (FN_HELP + 1)    /* Hilfe */
#define FN_SHOW_HELP_INDEX          (FN_HELP + 2)    /* Hilfeindex */
#define FN_SHOW_KEYBOARD_HELP       (FN_HELP + 3)    /* Hilfe */
#define FN_SHOW_HELP_MANUAL         (FN_HELP + 4)    /* Hilfe */
#define FN_SHOW_UPDATE_HELP         (FN_HELP + 5)    /* Hilfe */

#define FN_BALLOON_HELP             (FN_HELP + 7)    /* Toggle Balloon Help */
#define FN_HELP_POPUP               (FN_HELP + 8)    /* Popup Help */


/*--------------------------------------------------------------------
    Bereich: Traveling & Selektion
 --------------------------------------------------------------------*/

#define FN_CHAR_LEFT                (FN_SELECTION + 1 ) /* */
#define FN_CHAR_RIGHT               (FN_SELECTION + 2 ) /* */
#define FN_LINE_UP                  (FN_SELECTION + 3 ) /* */
#define FN_LINE_DOWN                (FN_SELECTION + 4 ) /* */
#define FN_START_OF_LINE            (FN_SELECTION + 5 ) /* StartOfLine */
#define FN_END_OF_LINE              (FN_SELECTION + 6 ) /* EndOfLine */
#define FN_START_OF_DOCUMENT        (FN_SELECTION + 7 ) /* StartOfDocument */
//schon in svxids.hrc
//#define FN_END_OF_DOCUMENT            (FN_SELECTION + 8 ) /* EndOfDocument */
#define FN_START_OF_NEXT_PAGE       (FN_SELECTION + 9 ) /* StartOfNextPage ??? */
#define FN_END_OF_NEXT_PAGE         (FN_SELECTION + 10) /* ??? */
#define FN_START_OF_PREV_PAGE       (FN_SELECTION + 11) /* StartOfPrevPage ??? */
#define FN_END_OF_PREV_PAGE         (FN_SELECTION + 12) /* ??? */
#define FN_START_OF_PAGE            (FN_SELECTION + 13) /* StartOfPage */
#define FN_END_OF_PAGE              (FN_SELECTION + 14) /* EndOfPage */
#define FN_START_OF_WINDOW          (FN_SELECTION + 15) /* StartOfWindow */
#define FN_END_OF_WINDOW            (FN_SELECTION + 16) /* EndOfWindow */
#define FN_START_OF_COLUMN          (FN_SELECTION + 17) /* StartOfColumn */
#define FN_END_OF_COLUMN            (FN_SELECTION + 18) /* EndOfColumn */
#define FN_START_OF_PARA            (FN_SELECTION + 19) /* StartOfPara */
#define FN_END_OF_PARA              (FN_SELECTION + 20) /* EndOfPara */
#define FN_NEXT_WORD                (FN_SELECTION + 21) /* NextWord */
#define FN_PREV_WORD                (FN_SELECTION + 22) /* PrevWord */
#define FN_NEXT_SENT                (FN_SELECTION + 23) /* NextSentence */
#define FN_PREV_SENT                (FN_SELECTION + 24) /* PrevSentence */
#define FN_DELETE                   (FN_SELECTION + 25) /* Delete */
#define FN_BACKSPACE                (FN_SELECTION + 26) /* Backspace */
#define FN_DELETE_SENT              (FN_SELECTION + 27) /* DeleteToEndOfSentence */
#define FN_DELETE_BACK_SENT         (FN_SELECTION + 28) /* DeleteToStartOfSentence */
#define FN_DELETE_WORD              (FN_SELECTION + 29) /* DeleteToEndOfWord */
#define FN_DELETE_BACK_WORD         (FN_SELECTION + 30) /* DeleteToStartOfWord */
#define FN_DELETE_LINE              (FN_SELECTION + 31) /* DeleteToEndOfLine */
#define FN_DELETE_BACK_LINE         (FN_SELECTION + 32) /* DeleteToStartOfLine */
#define FN_DELETE_PARA              (FN_SELECTION + 33) /* DeleteToEndOfPara */
#define FN_DELETE_BACK_PARA         (FN_SELECTION + 34) /* DeleteToStartOfPara */
#define FN_DELETE_WHOLE_LINE        (FN_SELECTION + 35) /* DeleteLine ??? */
#define FN_SET_INS_MODE             (FN_SELECTION + 36) /* Einfuegemodus / Overwrite */
#define FN_PAGEUP                   (FN_SELECTION + 37) /* PageUpWithCursor */
#define FN_PAGEDOWN                 (FN_SELECTION + 38) /* PageDownWithCursor */
#define FN_SET_ADD_MODE             (FN_SELECTION + 39) /* Selektionsmodus */
#define FN_SET_EXT_MODE             (FN_SELECTION + 40) /* Selektionsmodus */
#define FN_ESCAPE                   (FN_SELECTION + 41) /* Normal */
#define FN_SHIFT_BACKSPACE          (FN_SELECTION + 42) /* wie Backspace */
#define FN_SELECT_WORD              (FN_SELECTION + 43) /* Wort selektieren */

#define FN_GOTO_NEXT_OBJ            (FN_SELECTION + 44)   /* N„chstes Objekt anspringen */
#define FN_GOTO_PREV_OBJ            (FN_SELECTION + 45)   /* Vorhergehendes Objekt anspringen */

#define FN_START_TABLE              (FN_SELECTION + 47) /* an den Anfang der Tabelle */
#define FN_END_TABLE                (FN_SELECTION + 48) /* an das Ende der Tabelle */
#define FN_NEXT_TABLE               (FN_SELECTION + 49) /* zur vorhergehenden Tabelle */
#define FN_PREV_TABLE               (FN_SELECTION + 50) /* zur naechsten Tabelle */

#define FN_START_OF_NEXT_COLUMN     (FN_SELECTION + 51) /* zum Anfang der naechsten Spalte */
#define FN_END_OF_NEXT_COLUMN       (FN_SELECTION + 52) /* zum Ende der naechsten Spalte */
#define FN_START_OF_PREV_COLUMN     (FN_SELECTION + 53) /* zum Anfang der vorhergehenden Spalte */
#define FN_END_OF_PREV_COLUMN       (FN_SELECTION + 54) /* zum Ende der vorhergehenden Spalte */

#define FN_FOOTNOTE_TO_ANCHOR       (FN_SELECTION + 55) /* aus der Fussnote zum Anchor */
#define FN_NEXT_FOOTNOTE            (FN_SELECTION + 56) /* zur naechsten Fussnote */
#define FN_PREV_FOOTNOTE            (FN_SELECTION + 57) /* zur vorhergehenden Fussnote */

#define FN_CNTNT_TO_NEXT_FRAME      (FN_SELECTION + 58) /* aus dem Inhalt zum naechsten Rahmen */
#define FN_FRAME_TO_ANCHOR          (FN_SELECTION + 59) /* vom Rahmen zum Anker */

#define FN_TO_HEADER                (FN_SELECTION + 60) /* Toggle zwischen Content und Kopfzeile */
#define FN_TO_FOOTER                (FN_SELECTION + 61) /* Toggle zwischen Content und Fusszeile */

#define FN_IDX_MARK_TO_IDX          (FN_SELECTION + 62) /* von der Verzeichnismarkierung zum Verzeichnis */





#define FN_PREV_PARA                (FN_SELECTION + 74)
#define FN_NEXT_PARA                (FN_SELECTION + 75)

#define FN_GOTO_NEXT_MARK           (FN_SELECTION + 76)   /* N„chsten Platzhalter anspringen */
#define FN_GOTO_PREV_MARK           (FN_SELECTION + 77)   /* Vorhergehenden Platzhalter anspringen */

// schon im SVX unter der gleichen Id
//#define FN_START_DOC_DIRECT           (FN_SELECTION + 78)   /* Direkt zum Dokanfang springen */
//#define FN_END_DOC_DIRECT         (FN_SELECTION + 79)   /* Direkt zum Dokanfang springen */

#define FN_NEXT_TOXMARK             (FN_SELECTION + 83)   /* zur naechsten Verz. Markierung */
#define FN_PREV_TOXMARK             (FN_SELECTION + 84)   /* zur vorherigen Verz. Markierung */
#define FN_NEXT_TBLFML              (FN_SELECTION + 85)   /* zur naechsten Tabellenformel */
#define FN_PREV_TBLFML              (FN_SELECTION + 86)   /* zur vorherigen Tabellenformel */
#define FN_NEXT_TBLFML_ERR          (FN_SELECTION + 87)   /* zur naechsten fehl. Tabellenformel */
#define FN_PREV_TBLFML_ERR          (FN_SELECTION + 88)   /* zur vorherigen fehl. Tabellenformel */


/*--------------------------------------------------------------------
    QUERY-Block
 --------------------------------------------------------------------*/



#define FN_IS_MODIFIED              (FN_QUERY +16)      /* Dokument geaendert? */
#define FN_RESET_MODIFIED           (FN_QUERY +17)      /* Geaendert-Flag zuruecksetzen */

#define FN_GET_DOC_INFO             (FN_QUERY +22)      /* Wert Dokumentinfo erfragen */
#define FN_GET_ERRNO                (FN_QUERY +26)      /* Error-Nummer abfragen */
#define FN_GET_DOCMAN_PATH          (FN_QUERY +27)      /* Pfad zu einer Gruppe im Docmgr erfragen */

#define FN_TXTATR_INET              (FN_QUERY +29)      /* INet-Attribut */
#define FN_EXECUTE_DRAG             (FN_QUERY +30)      /* D&D starten */

#define FN_GET_PRINT_AREA           (FN_QUERY +32)      /* Attribut fuer druckbaren Seitenbereich besorgen */



// #define FN_IS_START_OF_PAGE         (FN_QUERY +40)       /**/
// #define FN_IS_END_OF_PAGE           (FN_QUERY +41)       /**/

#define FN_GET_PARAGRAPH            (FN_QUERY +48)      /*  Paragraph-Object von der Textshell
                                                            an die View weiterreichen*/
// hier ist Schluss!!!


/*--------------------------------------------------------------------
    Bereich: Envelope
 --------------------------------------------------------------------*/

#define FN_ENVELOP                  (FN_ENVELP    )
#define FN_LABEL                    (FN_ENVELP + 1)
#define FN_BUSINESS_CARD            (FN_ENVELP + 2)

/*--------------------------------------------------------------------
    Bereich: Parameter
 --------------------------------------------------------------------*/

#define FN_PARAM_TABLE_COLS         (FN_PARAM)
#define FN_PARAM_TABLE_ROWS         (FN_PARAM+1)

#define FN_PARAM_SEARCH_WORDONLY    (FN_PARAM+5)
#define FN_PARAM_SEARCH_EXACT       (FN_PARAM+6)
#define FN_PARAM_SEARCH_REGEXP      (FN_PARAM+7)
#define FN_PARAM_SEARCH_BACKWARDS   (FN_PARAM+8)
#define FN_PARAM_SEARCH_FINDALL     (FN_PARAM+9)
#define FN_PARAM_SEARCH_SELECTION   (FN_PARAM+10)
#define FN_PARAM_SEARCH_TEXT        (FN_PARAM+11)
#define FN_PARAM_SEARCH_TEXTREPLACE (FN_PARAM+12)

#define FN_PARAM_PARADLGLIMITS      (FN_PARAM+15)
#define FN_PARAM_FRMMODE            (FN_PARAM+16)

#define FN_PARAM_ADDPRINTER         (FN_PARAM+18)
#define FN_PARAM_GRID               (FN_PARAM+19)
#define FN_PARAM_DOCDISP            (FN_PARAM+20)
#define FN_PARAM_ELEM               (FN_PARAM+21)
#define FN_PARAM_SWTEST             (FN_PARAM+22)

#define FN_PARAM_FTN_INFO           (FN_PARAM+23)

#define FN_PARAM_REGION_NAME            (FN_PARAM+24)
#define FN_PARAM_REGION_CONDITION       (FN_PARAM+25)
#define FN_PARAM_REGION_HIDDEN          (FN_PARAM+26)
#define FN_PARAM_REGION_PROTECT         (FN_PARAM+27)

#define FN_PARAM_INSERT_AFTER           (FN_PARAM+29)
#define FN_PARAM_FILTER                 (FN_PARAM+30)
#define FN_PARAM_INDEX_NAME             (FN_PARAM+31)
#define FN_PARAM_INDEX_OPTIONS          (FN_PARAM+32)
#define FN_PARAM_INDEX_FORMAT           (FN_PARAM+33)
#define FN_PARAM_INDEX_LEVEL            (FN_PARAM+34)
#define FN_PARAM_INDEX_TEMPLATE         (FN_PARAM+35)
#define FN_PARAM_INDEX_ALTSTR           (FN_PARAM+36)
#define FN_PARAM_INDEX_PRIMKEY          (FN_PARAM+37)
#define FN_PARAM_INDEX_SECKEY           (FN_PARAM+38)
#define FN_PARAM_WIDTH                  (FN_PARAM+39)
#define FN_PARAM_LOCATION               (FN_PARAM+40)
#define FN_PARAM_DIR                    (FN_PARAM+41)
#define FN_PARAM_COUNT                  (FN_PARAM+42)
#define FN_PARAM_COLOR                  (FN_PARAM+43)

#define FN_PARAM_TABLE_NAME             (FN_PARAM+44)
#define FN_PARAM_TABLE_WIDTH            (FN_PARAM+45)
#define FN_PARAM_TABLE_ULSPACE          (FN_PARAM+46)
#define FN_PARAM_TABLE_LRSPACE          (FN_PARAM+47)
#define FN_PARAM_TABLE_SHADOW           (FN_PARAM+48)
#define FN_PARAM_TABLE_ALIGN            (FN_PARAM+49)
#define FN_PARAM_TABLE_HEADLINE         (FN_PARAM+50)
#define FN_PARAM_TABLE_SPACE            (FN_PARAM+51)
#define FN_PARAM_TABLE_COLUMNS          (FN_PARAM+52)

#define FN_PARAM_GRF_CONNECT            (FN_PARAM+54)


#define FN_PARAM_EVENT                  (FN_PARAM+68)
#define FN_PARAM_URL                    (FN_PARAM+69)
#define FN_PARAM_GRF_REALSIZE           (FN_PARAM+70)
#define FN_PARAM_GRF_DIALOG             (FN_PARAM+71)
#define FN_PARAM_GRF_CLIENTMAP          (FN_PARAM+74) /* ClientMap */
#define FN_PARAM_GRF_SERVERMAP          (FN_PARAM+75) /* ServerMap */
#define FN_PARAM_GRF_TARGETFRAME        (FN_PARAM+76) /* TargetFrame */
#define FN_INET_FIELD_MACRO             (FN_PARAM+77) /* Id fuer URL-Feld-Macros*/

#define FN_PARAM_PRINTER                (FN_PARAM+78) /* Drucker* */
#define FN_PARAM_STDFONTS               (FN_PARAM+79) /* ConfigItem Standardfonts */

#define FN_PARAM_WRTSHELL               (FN_PARAM2) /* SwWrtShell */

#define FN_COND_COLL                    (FN_PARAM2+1) /* Item fuer bed. Vorlagen */
#define FN_PARAM_SELECTION              (FN_PARAM2+2) /* selektiertes Wort fuer Format/Zeichen/Hyperlink */

#define FN_PARAM_ACT_NUMBER             (FN_PARAM2+3) /* PointerItem die aktuelle NumRule */
#define FN_PARAM_CHILD_LEVELS           (FN_PARAM2+4) /* Werden Child-Levels benutzt ?*/

#define FN_PARAM_NUM_PRESET             (FN_PARAM2+5) /* vorgewaehlte Numerierung*/

#define FN_PARAM_HEIGHT                 (FN_PARAM2+6) /* Param fuer Hoehe */
#define FN_PARAM_DIST                   (FN_PARAM2+7) /* und Breite, wg. metrischer Umwandlung */

#define FN_PARAM_SHADOWCURSOR           (FN_PARAM2+8) /* Fuer ShadowCursor Optionen */

#define FN_PARAM_ACT_NUMLEVEL           (FN_PARAM2+9) /* BYTE-Item mit aktuellen NumLevel */

#define FN_PARAM_9                      (FN_PARAM2+10)
#define FN_PARAM_10                     (FN_PARAM2+11)

#define FN_TEXT_RANGE                   (FN_PARAM2+12) /* TextRange Property*/

#define FN_PARAM_CRSR_IN_PROTECTED      (FN_PARAM2+13) /* Cursor in geschuetzten Bereichen*/
#define FN_PARAM_TOX_TYPE               (FN_PARAM2+14) /* TOX type in tox dialog*/
#define FN_PARAM_LINK_DISPLAY_NAME      (FN_PARAM2+15) /* LinkDisplayName property*/
#define FN_PARAM_NUM_LEVEL              (FN_PARAM2+16) /* rtf filter*/
/*--------------------------------------------------------------------
    Bereich: Druckoptionen
 --------------------------------------------------------------------*/

#define FN_PRNOPT_GRAPHIC           (FN_PRNOPT + 1)
#define FN_PRNOPT_TABLE             (FN_PRNOPT + 2)
#define FN_PRNOPT_LEFT_PAGE         (FN_PRNOPT + 3)
#define FN_PRNOPT_RIGHT_PAGE        (FN_PRNOPT + 4)
#define FN_PRNOPT_REVERSE           (FN_PRNOPT + 5)
#define FN_PRNOPT_PAPER_FROM_SETUP  (FN_PRNOPT + 6)
#define FN_PRNOPT_POSTITS           (FN_PRNOPT + 8)

#define FN_PRNOPT_BEGIN  FN_PRNOPT_GRAPHIC
#define FN_PRNOPT_END    FN_PRNOPT_POSTITS

/*--------------------------------------------------------------------
    Beschreibung: Status : nicht mehr als 19!
 --------------------------------------------------------------------*/

#define FN_STAT_PAGE                (FN_STAT + 1)
#define FN_STAT_TEMPLATE            (FN_STAT + 2)
#define FN_STAT_ZOOM                (FN_STAT + 3)
#define FN_STAT_INSOVER             (FN_STAT + 4)
#define FN_STAT_SELMODE             (FN_STAT + 5)
#define FN_STAT_HYPERLINKS          (FN_STAT + 6)  /* Hyperlinks ausfuehren */
#define FN_STAT_CONTEXT             (FN_STAT + 7)
#define FN_STAT_BOOKMARK            (FN_STAT + 8)  /* Fuer Popup Bookmarks*/

/*--------------------------------------------------------------------
    Bereich: Seitenvorschau
 --------------------------------------------------------------------*/

#define FN_SHOW_TWO_PAGES           (FN_PGPREVIEW + 1)
#define FN_SHOW_FOUR_PAGES          (FN_PGPREVIEW + 2)
#define FN_PRINT_PAGEPREVIEW        (FN_PGPREVIEW + 3)

/*--------------------------------------------------------------------
    Bereich: Rahmenattribute
 --------------------------------------------------------------------*/

#define FN_OPAQUE                       (FN_FRAME + 1)
#define FN_SET_PROTECT                  (FN_FRAME + 2)
#define FN_SURROUND                     (FN_FRAME + 3)
#define FN_VERT_ORIENT                  (FN_FRAME + 4)
#define FN_HORI_ORIENT                  (FN_FRAME + 5)
#define FN_SET_FRM_NAME                 (FN_FRAME + 6)
#define FN_KEEP_ASPECT_RATIO            (FN_FRAME + 7)
#define FN_GRF_KEEP_ZOOM                (FN_FRAME + 8)

#define FN_IID_COL1                     (FN_FRAME + 13)
#define FN_IID_COL2                     (FN_FRAME + 14)
#define FN_IID_COL3                     (FN_FRAME + 15)
#define FN_IID_COLLEFT                  (FN_FRAME + 16)
#define FN_IID_COLRIGHT                 (FN_FRAME + 17)

#define FN_SET_FRM_ALT_NAME             (FN_FRAME + 18)


//Member-Ids fuer Fill/SetVariable an Items
#define         MID_STYLE       0xe0
#define         MID_PWIDTH      0xe1
#define         MID_ADJUST      0xe2
#define         MID_TDIST       0xe3
#define         MID_BDIST       0xe4
#define         MID_LINES       0xe5
#define         MID_CHARS       0xe6
#define         MID_DIST        0xe7

#define         MID_1           0xe8
#define         MID_2           0xe9
#define         MID_3           0xea
#define         MID_4           0xeb
#define         MID_5           0xec
#define         MID_6           0xed
#define         MID_7           0xee
#define         MID_8           0xef
#define         MID_9           0xf0
#define         MID_A           0xf1
#define         MID_B           0xf2
#define         MID_C           0xf3
#define         MID_D           0xf4
#define         MID_E           0xf5
#define         MID_F           0xf6
#define         MID_10          0xf7
#define         MID_11          0xf8
#define         MID_12          0xf9
#define         MID_13          0xfa

#ifndef SID_SW_DOCMAN_PATH
#define SID_SW_DOCMAN_PATH                              (SID_OFASLOTS_START +   6)
#endif

// defines fuer Event-Zuweisung per Macro
#define MAC_EVENT_MOUSEOVER         0x01            //
#define MAC_EVENT_MOUSECLICK        0x02            // Hyperlink ausloesen
#define MAC_EVENT_MOUSEOUT          0x03            //
#define MAC_EVENT_OBJECT_SELECT     0x04            // Obj. selektieren
#define MAC_EVENT_KEYINPUT_ALPHA    0x05            //
#define MAC_EVENT_KEYINPUT_NOALPHA  0x06            //
#define MAC_EVENT_FRM_RESIZE        0x07            //
#define MAC_EVENT_FRM_MOVE          0x08            //
#define MAC_EVENT_IMAGE_LOAD        0x09            //
#define MAC_EVENT_IMAGE_ABORT       0x0a            //
#define MAC_EVENT_IMAGE_ERROR       0x0b            //

diff --git a/sw/inc/comcore.hrc b/sw/inc/comcore.hrc
new file mode 100644
index 0000000..56ee86d
--- /dev/null
+++ b/sw/inc/comcore.hrc
@@ -0,0 +1,118 @@
/*************************************************************************
 *
 *  $RCSfile: comcore.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:24 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _COMCORE_HRC
#define _COMCORE_HRC

#include "rcid.hrc"

// ---------------
// die Strings
// ---------------

#define STR_COMCORE_READERROR       (RC_COMCORE_BEGIN + 0)
#define MSG_COMCORE_ASKSEARCH       (RC_COMCORE_BEGIN + 1)
#define STR_TABLE_DEFNAME           (RC_COMCORE_BEGIN + 2)
#define STR_GRAPHIC_DEFNAME         (RC_COMCORE_BEGIN + 3)
#define STR_OBJECT_DEFNAME          (RC_COMCORE_BEGIN + 4)
#define STR_FRAME_DEFNAME           (RC_COMCORE_BEGIN + 5)
#define STR_REGION_DEFNAME          (RC_COMCORE_BEGIN + 6)
#define STR_COMCORE_CANT_SHOW       (RC_COMCORE_BEGIN + 7)
#define RID_GRAPHIC_REPLACEBMP      (RC_COMCORE_BEGIN + 8)
#define RID_GRAPHIC_ERRORBMP        (RC_COMCORE_BEGIN + 9)
#define STR_NUMRULE_DEFNAME         (RC_COMCORE_BEGIN + 10)
#define STR_EMPTYPAGE               (RC_COMCORE_BEGIN + 11)
#define RID_SHELLRES_AUTOFMTSTRS    (RC_COMCORE_BEGIN + 12)
#define STR_MULT_INTERACT_HYPH_WARN (RC_COMCORE_BEGIN + 13)
#define STR_MULT_INTERACT_SPELL_WARN    (RC_COMCORE_BEGIN + 14)
#define STR_SPELL_TITLE             (RC_COMCORE_BEGIN + 15)
#define STR_HYPH_TITLE              (RC_COMCORE_BEGIN + 16)


// defines fuer die Autoformat Redline Kommentare
#define STR_AUTOFMTREDL_DEL_EMPTY_PARA          0
#define STR_AUTOFMTREDL_USE_REPLACE             1
#define STR_AUTOFMTREDL_CPTL_STT_WORD           2
#define STR_AUTOFMTREDL_CPTL_STT_SENT           3
#define STR_AUTOFMTREDL_TYPO                    4
#define STR_AUTOFMTREDL_USER_STYLE              5
#define STR_AUTOFMTREDL_BULLET                  6
#define STR_AUTOFMTREDL_UNDER                   7
#define STR_AUTOFMTREDL_BOLD                    8
#define STR_AUTOFMTREDL_FRACTION                9
#define STR_AUTOFMTREDL_DETECT_URL              10
#define STR_AUTOFMTREDL_DASH                    11
#define STR_AUTOFMTREDL_ORDINAL                 12
#define STR_AUTOFMTREDL_RIGHT_MARGIN            13
#define STR_AUTOFMTREDL_SET_TMPL_TEXT           14
#define STR_AUTOFMTREDL_SET_TMPL_INDENT         15
#define STR_AUTOFMTREDL_SET_TMPL_NEG_INDENT     16
#define STR_AUTOFMTREDL_SET_TMPL_TEXT_INDENT    17
#define STR_AUTOFMTREDL_SET_TMPL_HEADLINE       18
#define STR_AUTOFMTREDL_SET_NUMBULET            19
#define STR_AUTOFMTREDL_DEL_MORELINES           20
// !!!!!!!!!!!!!!!!!!!!!!!!!!  das Ende immer richtig setzen !!!!!!!!!!!!
#define STR_AUTOFMTREDL_END                     21


#endif



diff --git a/sw/inc/crsrsh.hxx b/sw/inc/crsrsh.hxx
new file mode 100644
index 0000000..523d8de
--- /dev/null
+++ b/sw/inc/crsrsh.hxx
@@ -0,0 +1,901 @@
/*************************************************************************
 *
 *  $RCSfile: crsrsh.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _CRSRSH_HXX
#define _CRSRSH_HXX

#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif
#ifndef _LINK_HXX //autogen
#include <tools/link.hxx>
#endif
#ifndef _RTTI_HXX //autogen
#include <tools/rtti.hxx>
#endif
#ifndef _WORDSEL_HXX //autogen
#include <svtools/wordsel.hxx>
#endif
#ifndef _COM_SUN_STAR_LINGUISTIC_XSPELLCHECKER1_HPP_
#include <com/sun/star/linguistic/XSpellChecker1.hpp>
#endif
#ifndef _COM_SUN_STAR_LINGUISTIC_XHYPHENATOR_HPP_
#include <com/sun/star/linguistic/XHyphenator.hpp>
#endif

#ifndef _SWTYPES_HXX
#include <swtypes.hxx>          // fuer SWPOSDOC
#endif
#ifndef _VIEWSH_HXX
#include <viewsh.hxx>           // fuer ViewShell
#endif
#ifndef _CALBCK_HXX
#include <calbck.hxx>           // fuer SwClient
#endif
#ifndef _CSHTYP_HXX
#include <cshtyp.hxx>           // fuer die CursorShell Typen
#endif
#ifndef _CRSTATE_HXX
#include <crstate.hxx>          // fuer die CursorMove-Staties
#endif
#ifndef _BKMRKE_HXX //autogen
#include <bkmrke.hxx>
#endif
#ifndef _TOXE_HXX
#include <toxe.hxx>             // SwTOXSearchDir
#endif

#if defined(PRODUCT) && !defined(WIN)
// fuer die Inline-Methoden
#ifndef _VISCRS_HXX
#include <viscrs.hxx>
#endif
#ifndef _NODE_HXX
#include <node.hxx>
#endif
#define CRSR_INLINE inline
#else
#define CRSR_INLINE
#endif

// einige Forward Deklarationen

class KeyCode;
class Region;
class SfxItemSet;
class SfxPoolItem;
class SpellCheck;
class SwBookmark;
class SwCntntFrm;
class SwCrsrShell;
class SwCursor;
class SwField;
class SwFieldType;
class SwFmt;
class SwFmtFld;
class SwIndex;
class SwNodeIndex;
class SwNode;
class SwNodes;
class SwPaM;
class SwSelBoxes;
class SwShellCrsr;
class SwShellTableCrsr;
class SwTableNode;
class SwTxtFmtColl;
class SwVisCrsr;
class SwTxtINetFmt;
class SwFmtINetFmt;
class SwTxtAttr;
class SwTableBox;
class SwCellFrms;
class SwTOXMark;
struct SwPosition;

class SearchParam;
class SwRedline;

// enum und struktur, um ueber die Doc-Position Informationen zu erfragen

struct SwContentAtPos
{
    enum IsAttrAtPos
    {
        SW_NOTHING      = 0x0000,
        SW_FIELD        = 0x0001,
        SW_CLICKFIELD   = 0x0002,
        SW_FTN          = 0x0004,
        SW_INETATTR     = 0x0008,
        SW_TABLEBOXFML  = 0x0010,
        SW_REDLINE      = 0x0020,
        SW_OUTLINE      = 0x0040,
        SW_TOXMARK      = 0x0080,
        SW_REFMARK      = 0x0100
#ifndef PRODUCT
        ,SW_CURR_ATTRS      = 0x4000        // nur zum Debuggen
        ,SW_TABLEBOXVALUE   = 0x8000        // nur zum Debuggen
#endif
    } eCntntAtPos;

    union {
        const SwField* pFld;
        const SfxPoolItem* pAttr;
        const SwRedline* pRedl;
    } aFnd;

    String sStr;
    const SwTxtAttr* pFndTxtAttr;

    SwContentAtPos( int eGetAtPos = 0xffff )
        : eCntntAtPos( (IsAttrAtPos)eGetAtPos )
    {
        aFnd.pFld = 0;
        pFndTxtAttr = 0;
    }

    // befindet sich der Node in einem geschuetzten Bereich?
    FASTBOOL IsInProtectSect() const;
};


// defines fuers GetCharCount
#define GETCHARCOUNT_NONE       0
#define GETCHARCOUNT_PARA       1
#define GETCHARCOUNT_SECTION    2


// ReturnWerte von SetCrsr (werden verodert)
const int   CRSR_NOERROR =  0x00,
            CRSR_POSOLD =   0x01,   // Cursor bleibt an alter Doc-Position
            CRSR_POSCHG =   0x02;   // Position vom Layout veraendert




// die Cursor - Shell
class SwCrsrShell : public ViewShell, public SwModify
{
    friend class SwCallLink;
    friend class SwVisCrsr;
    friend class SwSelPaintRects;
    friend class SwChgLinkFlag;

    //Braucht den Crsr als IntrnlCrsr.
    friend void GetTblSel( const SwCrsrShell&, SwSelBoxes& rBoxes,
                           const SwTblSearchType );
    friend BOOL GetAutoSumSel( const SwCrsrShell&, SwCellFrms& );

public:     // public, damit defaultet werden kann !!

    /* ein enum fuer den Aufruf von UpdateCrsr */
    enum CrsrFlag {
        UPDOWN      = (1 << 0),     // Up/Down auf Spalte halten
        SCROLLWIN   = (1 << 1),     // Window Scrollen
        CHKRANGE    = (1 << 2),     // ueberpruefen von ueberlappenden PaM's
        NOCALRECT   = (1 << 3),     // CharRect nicht neu berechnen
        READONLY    = (1 << 4)      // Sichtbar machen trotz Readonly
    };

private:

    SwRect  aCharRect;          // Char-SRectangle auf dem der Cursor steht
    Point   aCrsrHeight;        // Hohe&Offset von sichtbaren Cursor
    Point   aOldRBPos;          // Right/Bottom von letzter VisArea
                                // (wird im Invalidate vom Cursor benutzt)


    // um event. Macro was anhaengt auszufuehren.
    Link aFlyMacroLnk;          // Link will be called, if the Crsr is set
                                // into a fly. A macro can be then becalled
    Link aChgLnk;               // link will be called by every attribut/
                                // format changes at cursor position.
    Link aGrfArrivedLnk;        // Link calls to UI if a grafik is arrived


    SwShellCrsr* pCurCrsr;      // der aktuelle Cursor
    SwShellCrsr* pCrsrStk;      // Stack fuer den Cursor
    SwVisCrsr *pVisCrsr;        // der Sichtbare-Cursor

    SwShellTableCrsr* pTblCrsr; // Tabellen-Crsr; nur in Tabellen, wenn
                                // die Selection ueber 2 Spalten liegt

    SwNodeIndex* pBoxIdx;       // fuers erkennen der veraenderten
    SwTableBox* pBoxPtr;        // Tabellen-Zelle

    long nUpDownX;              // versuche den Cursor bei Up/Down immer in
                                // der gleichen Spalte zu bewegen
    long nLeftFrmPos;
    ULONG nAktNode;             // save CursorPos at Start-Action
    xub_StrLen nAktCntnt;
    USHORT nAktNdTyp;

    /*
     * Mit den Methoden SttCrsrMove und EndCrsrMove wird dieser Zaehler
     * Inc-/Decrementiert. Solange der Zaehler ungleich 0 ist, erfolgt
     * auf den akt. Cursor kein Update. Dadurch koennen "komplizierte"
     * Cursorbewegungen (ueber Find()) realisiert werden.
     */
    USHORT nCrsrMove;
    USHORT nBasicActionCnt;     // Actions, die vom Basic geklammert wurden
    CrsrMoveState eMvState;     // Status fuers Crsr-Travelling - GetCrsrOfst

    BOOL bHasFocus : 1;         // Shell ist in einem Window "aktiv"
    BOOL bSVCrsrVis : 1;        // SV-Cursor Un-/Sichtbar
    BOOL bChgCallFlag : 1;      // Attributaenderung innerhalb von
                                // Start- und EndAction
    BOOL bVisPortChgd : 1;      // befindet sich im VisPortChg-Aufruf
                                // (wird im Invalidate vom Cursor benutzt)

    BOOL bCallChgLnk : 1;       // Flag fuer abgeleitete Klassen:
                                // TRUE -> ChgLnk callen
                                // Zugriff nur ueber SwChgLinkFlag
    BOOL bAllProtect : 1;       // Flag fuer Bereiche
                                // TRUE -> alles geschuetzt / versteckt
    BOOL bInCMvVisportChgd : 1; // Flag fuer CrsrMoves
                                // TRUE -> die Sicht wurde verschoben
    BOOL bGCAttr : 1;           // TRUE -> es existieren nichtaufgespannte Attr.
    BOOL bIgnoreReadonly : 1;   // TRUE -> Beim naechsten EndAction trotz
                                // Readonly den Crsr sichtbar machen.
    BOOL bSelTblCells : 1;      // TRUE -> Zellen uebers InputWin selektieren
    BOOL bAutoUpdateCells : 1;  // TRUE -> Zellen werden autoformatiert
    BOOL bBasicHideCrsr : 1;    // TRUE -> HideCrsr vom Basic
    BOOL bSetCrsrInReadOnly : 1;// TRUE -> Cursor darf in ReadOnly-Bereiche


    void UpdateCrsr( USHORT eFlags
                            =SwCrsrShell::SCROLLWIN|SwCrsrShell::CHKRANGE,
                     BOOL bIdleEnd = FALSE );

    void _ParkPams( SwPaM* pDelRg, SwShellCrsr** ppDelRing );

    FASTBOOL LeftRight( BOOL, USHORT );
    FASTBOOL UpDown( BOOL, USHORT );
    FASTBOOL LRMargin( BOOL, BOOL bAPI = FALSE );
    FASTBOOL IsAtLRMargin( BOOL, BOOL bAPI = FALSE ) const;
    FASTBOOL SttEndDoc( BOOL bStt );

typedef FASTBOOL (SwCursor:: *FNCrsr)();
    FASTBOOL CallCrsrFN( FNCrsr );

    const SwRedline* _GotoRedline( USHORT nArrPos, BOOL bSelect );

protected:

    CRSR_INLINE SwMoveFnCollection* MakeFindRange( USHORT, USHORT, SwPaM* ) const;

    /*
     * Compare-Methode for the StackCursor and the current Cursor.
     * The Methods return -1, 0, 1 for lower, equal, greater. The enum
     * CrsrCompareType says which position is compared.
     */
    enum CrsrCompareType {
        StackPtStackMk,
        StackPtCurrPt,
        StackPtCurrMk,
        StackMkCurrPt,
        StackMkCurrMk,
        CurrPtCurrMk
    };
    int CompareCursor( CrsrCompareType eType ) const;

    USHORT IncBasicAction()             { return ++nBasicActionCnt; }
    USHORT DecBasicAction()             { return --nBasicActionCnt; }

    // Setzt alle PaMs in OldNode auf NewPos + Offset
    void PaMCorrAbs(const SwNodeIndex &rOldNode, const SwPosition &rNewPos,
                    const xub_StrLen nOffset = 0 );
    // Setzt alle PaMs im Bereich von [StartNode, EndNode] nach NewPos
    void PaMCorrAbs(const SwNodeIndex &rStartNode, const SwNodeIndex &rEndNode,
                    const SwPosition &rNewPos );

public:
    TYPEINFO();
    SwCrsrShell( SwDoc *pDoc,
            ::com::sun::star::uno::Reference<
                ::com::sun::star::linguistic::XSpellChecker1> xSpell,
            ::com::sun::star::uno::Reference<
                ::com::sun::star::linguistic::XHyphenator> xHyph,
            Window *pWin, SwRootFrm * = 0, const SwViewOption *pOpt = 0 );
    // verkleideter Copy-Constructor
    SwCrsrShell( SwCrsrShell* pShell, Window *pWin );
    ~SwCrsrShell();

    virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);

    // neuen Cusror erzeugen und den alten anhaengen
    SwPaM * CreateCrsr();
    // loesche den aktuellen Cursor und der folgende wird zum Aktuellen
    FASTBOOL DestroyCrsr();
    // TableCursor in normale Cursor verwandeln, Tablemode aufheben
    void TblCrsrToCursor();

    SwPaM* GetCrsr( FASTBOOL bMakeTblCrsr = TRUE ) const;
    CRSR_INLINE SwCursor* GetSwCrsr( FASTBOOL bMakeTblCrsr = TRUE ) const;
    // nur den akt. Cursor returnen
          SwShellCrsr* _GetCrsr()                       { return pCurCrsr; }
    const SwShellCrsr* _GetCrsr() const                 { return pCurCrsr; }

    // uebergebenen Cursor anzeigen - fuer UNO
    void    SetSelection(const SwPaM& rCrsr);

    // alle Cursor aus den ContentNodes entfernen und auf 0 setzen.
    // Wurde aus der FEShell hierher verschoben.
    void ParkCrsr( const SwNodeIndex &rIdx );

    // gebe den akt. Cursor-Stack zurueck.
    // ( Wird in der EditShell beim Loeschen von Inhalten benoetigt! )
    CRSR_INLINE SwPaM* GetStkCrsr() const;

    // Start der Klammerung, SV-Cursor und selektierte Bereiche hiden
    void StartAction();
    // Ende der Klammerung, SV-Cursor und selektierte Bereiche anzeigen
    void EndAction( const BOOL bIdleEnd = FALSE );

    USHORT GetBasicActionCnt() const    { return nBasicActionCnt; }

    // Basiscursortravelling
    long GetUpDownX() const             { return nUpDownX; }

    FASTBOOL Left( USHORT nCnt = 1 )    { return LeftRight( TRUE, nCnt ); }
    FASTBOOL Right( USHORT nCnt = 1 )   { return LeftRight( FALSE, nCnt ); }
    FASTBOOL Up( USHORT nCnt = 1 )      { return UpDown( TRUE, nCnt ); }
    FASTBOOL Down( USHORT nCnt = 1 )    { return UpDown( FALSE, nCnt ); }
    FASTBOOL LeftMargin()               { return LRMargin( TRUE ); }
    FASTBOOL RightMargin(BOOL bAPI = FALSE) { return LRMargin( FALSE, bAPI ); }
    FASTBOOL SttDoc()                   { return SttEndDoc( TRUE ); }
    FASTBOOL EndDoc()                   { return SttEndDoc( FALSE ); }

    FASTBOOL MovePage( SwWhichPage, SwPosPage );
    FASTBOOL MovePara( SwWhichPara, SwPosPara );
    FASTBOOL MoveSection( SwWhichSection, SwPosSection );
    FASTBOOL MoveTable( SwWhichTable, SwPosTable );
    FASTBOOL MoveColumn( SwWhichColumn, SwPosColumn );
    FASTBOOL MoveRegion( SwWhichRegion, SwPosRegion );

    // die Suchfunktionen
    ULONG Find( const SearchParam& rParam,
                SwDocPositions eStart, SwDocPositions eEnde,
                FindRanges eRng, int bReplace = FALSE );

    ULONG Find( const SwTxtFmtColl& rFmtColl,
                SwDocPositions eStart, SwDocPositions eEnde,
                FindRanges eRng, const SwTxtFmtColl* pReplFmt = 0 );

    ULONG Find( const SfxItemSet& rSet, FASTBOOL bNoCollections,
                SwDocPositions eStart, SwDocPositions eEnde,
                FindRanges eRng, const SearchParam* pTextPara = 0,
                const SfxItemSet* rReplSet = 0 );

    // Positionieren des Cursors
    // returnt
    //  CRSR_POSCHG: wenn der ob der SPoint vom Layout korrigiert wurde.
    //  CRSR_POSOLD: wenn der Crsr nicht veraendert wurde
    int SetCrsr( const Point &rPt, BOOL bOnlyText = FALSE );

    /*
     * Benachrichtung, dass der sichtbare Bereich sich geaendert
     * hat. aVisArea wird neu gesetzt, anschliessend wird
     * gescrollt. Das uebergebene Rectangle liegt auf
     * Pixelgrenzen, um Pixelfehler beim Scrollen zu vermeiden.
     */
    virtual void VisPortChgd( const SwRect & );

    /*
     * Virtuelle PaintMethode, damit die Selection nach dem Paint wieder
     * sichtbar wird.
     */
    void Paint( const Rectangle & rRect );

    // Bereiche
    CRSR_INLINE void SetMark();
    CRSR_INLINE FASTBOOL HasMark();

    void ClearMark();
    void SwapPam();
    FASTBOOL ChgCurrPam( const Point & rPt,
                     BOOL bTstOnly = TRUE,      //Nur testen, nicht setzen
                     BOOL bTstHit  = FALSE );   //Nur genaue Treffer
    void KillPams();

    // erzeuge eine Kopie vom Cursor und speicher diese im Stack
    void Push();
    /*
     *  Loescht einen Cursor (gesteuert durch bOldCrsr)
     *      - vom Stack oder    ( bOldCrsr = TRUE )
     *      - den aktuellen und der auf dem Stack stehende wird zum aktuellen
     *
     *  Return:  es war auf dem Stack noch einer vorhanden
     */
    FASTBOOL Pop( BOOL bOldCrsr = TRUE );
    /*
     * Verbinde zwei Cursor miteinander.
     * Loesche vom Stack den obersten und setzen dessen Mark im Aktuellen.
     */
    void Combine();

#if defined( PRODUCT )
    void SttCrsrMove() { ++nCrsrMove; StartAction(); }
    void EndCrsrMove( const BOOL bIdleEnd = FALSE )
            { EndAction( bIdleEnd ); --nCrsrMove; }
#else
    void SttCrsrMove();
    void EndCrsrMove( const BOOL bIdleEnd = FALSE );
#endif

    /*
     * Beim Abgeben des Focuses werden die selektierten Bereiche nicht mehr
     * angezeigt; andererseits beim Erhalten des Focuses, werden alle selek-
     * tierten Bereiche wieder angezeigt. (Bereiche muessen neu berechnet
     * werden!)
     */
    BOOL HasShFcs() const { return bHasFocus; }
    void ShLooseFcs();
    void ShGetFcs( BOOL bUpdate = TRUE );

    // Methoden zum Anzeigen bzw. Verstecken des sichtbaren Text-Cursors
    void ShowCrsr();
    void HideCrsr();
    // Methoden zum Anzeigen bzw. Verstecken der selektierten Bereiche mit
    // dem sichtbaren Cursor
    void ShowCrsrs( BOOL bCrsrVis );
    void HideCrsrs();
    // Methoden zum Anzeigen bzw. Verstecken der selektierten Bereiche mit
    // dem sichtbaren Cursor
    void BasicShowCrsrs()
        { bBasicHideCrsr = FALSE; bSVCrsrVis = TRUE; ShowCrsrs(TRUE); }
    void BasicHideCrsrs()
        { HideCrsrs(); bBasicHideCrsr = TRUE; bSVCrsrVis = FALSE; }
    FASTBOOL IsBasicHideCrsr() const { return bBasicHideCrsr; }

    // gebe den aktuellen Frame, in dem der Cursor steht, zurueck
    SwCntntFrm *GetCurrFrm( const BOOL bCalcFrm = TRUE ) const;

    //TRUE wenn der Crsr wenn der Crsr wegen Readonly gehidet ist,
    //FALSE wenn der arbeitet (trotz Readonly).
    FASTBOOL IsCrsrReadonly() const;
    // Cursor steht in etwas geschuetztem oder in die Selektion umspannt
    // etwas geschuetztes.
    FASTBOOL HasReadonlySel() const;
    // darf der Cursor in ReadOnlyBereiche?
    FASTBOOL IsReadOnlyAvailable() const { return bSetCrsrInReadOnly; }
    void SetReadOnlyAvailable( BOOL bFlag );
    FASTBOOL IsOverReadOnlyPos( const Point& rPt ) const;

    // Methoden fuer aFlyMacroLnk
    void        SetFlyMacroLnk( const Link& rLnk ) { aFlyMacroLnk = rLnk; }
    const Link& GetFlyMacroLnk() const             { return aFlyMacroLnk; }

    // Methoden geben/aendern den Link fuer die Attribut/Format-Aenderungen
    void        SetChgLnk( const Link &rLnk ) { aChgLnk = rLnk; }
    const Link& GetChgLnk() const             { return aChgLnk; }

    // Methoden geben/aendern den Link fuers "Grafik vollstaendig geladen"
    void        SetGrfArrivedLnk( const Link &rLnk ) { aGrfArrivedLnk = rLnk; }
    const Link& GetGrfArrivedLnk() const             { return aGrfArrivedLnk; }

    //ChgLink callen, innerhalb einer Action wird der Ruf verzoegert.
    void CallChgLnk();

    // Abfrage, ob der aktuelle Cursor eine Selektion aufspannt,
    // also, ob Mark gesetzt und SPoint und Mark unterschiedlich sind.
    FASTBOOL HasSelection();

    // Abfrage, ob ueberhaupt eine Selektion existiert, sprich der akt. Cursor
    // aufgespannt oder nicht der einzigste ist.
    CRSR_INLINE FASTBOOL IsSelection() const;

    // Abfrage, ob ein kompletter Absatz selektiert wurde
    FASTBOOL IsSelFullPara() const;
    // Abfrage, ob die Selektion in einem Absatz ist
    CRSR_INLINE FASTBOOL IsSelOnePara() const;

    //Sollte fuer das Clipboard der WaitPtr geschaltet werden.
    FASTBOOL ShouldWait() const;

    /*
     * liefert das SRectangle, auf dem der Cursor steht.
     */
    const SwRect &GetCharRect() const { return aCharRect; }
    /*
     * liefert zurueck, ob der Cursor sich ganz oder teilweise im
     * sichtbaren Bereich befindet.
     */
    FASTBOOL IsCrsrVisible() const { return VisArea().IsOver( GetCharRect() ); }

    // gebe die aktuelle Seitennummer zurueck:
    // TRUE:  in der der Cursor steht
    // FALSE: die am oberen Rand sichtbar ist
    void GetPageNum( USHORT &rnPhyNum, USHORT &rnVirtNum,
                     BOOL bAtCrsrPos = TRUE, const BOOL bCalcFrm = TRUE );
    // bestimme in welche Richtung "leere Seiten" behandelt werden!
    // (wird benutzt im PhyPage.. )
    USHORT GetNextPrevPageNum( BOOL bNext = TRUE );

    // setze den Cursor auf die Seite "nPage" an den Anfang
    FASTBOOL GotoPage( USHORT nPage );

    // gebe alle Dokumentseiten zurueck
    USHORT GetPageCnt();

    // Gehe zur naechsten Selection
    FASTBOOL GoNextCrsr();
    // gehe zur vorherigen Selection
    FASTBOOL GoPrevCrsr();

    // am CurCrsr.SPoint
    FASTBOOL SetBookmark( const KeyCode&, const String& rName,
                const String& rShortName, BOOKMARK_TYPE eMark  = BOOKMARK );
    FASTBOOL GotoBookmark( USHORT );    // setzt CurCrsr.SPoint
    FASTBOOL GotoBookmark( USHORT nPos, BOOL bAtStart ); //
    FASTBOOL GoNextBookmark(); // TRUE, wenn's noch eine gab
    FASTBOOL GoPrevBookmark();
    USHORT GetBookmarkCnt(BOOL bBkmrk = FALSE) const;
    SwBookmark& GetBookmark( USHORT, BOOL bBkmrk = FALSE );
    void DelBookmark( USHORT );
    void DelBookmark( const String& rName );
    USHORT FindBookmark( const String& rName );
        // erzeugt einen eindeutigen Namen. Der Name selbst muss vorgegeben
        // werden, es wird dann bei gleichen Namen nur durchnumeriert.
    void MakeUniqueBookmarkName( String& rNm );

    // aktualisiere den Crsrs, d.H. setze ihn wieder in den Content.
    // Das sollte nur aufgerufen werden, wenn der Cursor z.B. beim
    // Loeschen von Rahmen irgendwohin gesetzt wurde. Die Position
    // ergibt sich aus seiner aktuellen Position im Layout !!
    void UpdateCrsrPos();

    // returne den am akt. Cursor selektierten Text. Dieser wird mit
    // Felder etc. aufgefuellt!!
    String GetSelTxt() const;
    // gebe nur den Text ab der akt. Cursor Position zurueck (bis zum NodeEnde)
    String GetText() const;
    // retrurne die Anzahl der selektierten Zeichen.
    // Falls keine Selektion vorliegt entscheided nType was selektiert wird
    // bIntrnlChar besagt ob interne Zeichen erhalten bleiben (TRUE) oder
    // ob sie expandiert werden (z.B Felder/...)
    ULONG GetCharCount( USHORT nType, BOOL bIntrnlChrs = TRUE ) const;

    // pruefe ob vom aktuellen Crsr der SPoint/Mark in einer Tabelle stehen
    CRSR_INLINE const SwTableNode* IsCrsrInTbl( BOOL bIsPtInTbl = TRUE ) const;
    // erfrage die Document - Layout - Position vom akt. Crsr
    CRSR_INLINE Point& GetCrsrDocPos( BOOL bPoint = TRUE ) const;
    CRSR_INLINE FASTBOOL IsCrsrPtAtEnd() const;

    CRSR_INLINE const   SwPaM* GetTblCrs() const;
    CRSR_INLINE         SwPaM* GetTblCrs();

    FASTBOOL IsTblComplex() const;
    FASTBOOL IsTblComplexForChart() const;
    // erfrage die akt. TabellenSelektion als Text
    String GetBoxNms() const;

    // setze Crsr in die naechsten/vorherigen Celle
    FASTBOOL GoNextCell( BOOL bAppendLine = TRUE );
    FASTBOOL GoPrevCell();
    // gehe zu dieser Box (wenn vorhanden und in Tabelle!)
    FASTBOOL GotoTblBox( const String& rName );
    FASTBOOL GotoTable( const String& rName );

    // selectiere diese Zeile/Spalte
    FASTBOOL SelTblRow();
    FASTBOOL SelTblCol();

    // zum naechsten/vorhergehenden Punkt auf gleicher Ebene
    FASTBOOL GotoNextNum();
    FASTBOOL GotoPrevNum();

        // zu diesem Gliederungspunkt
    FASTBOOL GotoOutline( const String& rName );
        // zum naechsten/vorhergehenden oder angegebenen OultineNode
    void GotoOutline( USHORT nIdx );
        // suche die "Outline-Position" im Nodes-Array vom akt. Kaiptel
    USHORT GetOutlinePos( BYTE nLevel = UCHAR_MAX );
        // selektiere den angeben Bereich von OutlineNodes. Optional
        // inclusive der Childs. Die USHORT sind die Positionen im
        // OutlineNds-Array!! (EditShell)
    FASTBOOL MakeOutlineSel( USHORT nSttPos, USHORT nEndPos,
                        BOOL bWithChilds = FALSE );

    FASTBOOL GotoNextOutline();         // naechster Node mit Outline-Num.
    FASTBOOL GotoPrevOutline();         // vorheriger Node mit Outline-Num.

        // ist der Crsr in einer Tabelle und ist die Selection ueber
        // zwei Spalten
    FASTBOOL IsTableMode() const { return 0 != pTblCrsr; }

        // erfrage den Tabellen Crsr; ausserhalb von Tabellen immer 0
    const SwShellTableCrsr* GetTableCrsr() const { return pTblCrsr; }
    SwShellTableCrsr* GetTableCrsr() { return pTblCrsr; }
    USHORT UpdateTblSelBoxes();

    FASTBOOL GotoFtnTxt();      // springe aus dem Content zur Fussnote
    FASTBOOL GotoFtnAnchor();   // springe aus der Fussnote zum Anker
    FASTBOOL GotoNextFtnAnchor();
    FASTBOOL GotoPrevFtnAnchor();
    FASTBOOL GotoNextFtnCntnt();
    FASTBOOL GotoPrevFtnCntnt();

    FASTBOOL GotoFlyTxt();          // springe aus dem Content zum "naechsten" Rahmen
    FASTBOOL GotoFlyAnchor();       // springe aus dem Rahmen zum Anker
    FASTBOOL GotoHeaderTxt();       // springe aus dem Content zum Header
    FASTBOOL GotoFooterTxt();       // springe aus dem Content zum Footer
    // springe in den Header/Footer des angegebenen oder akt. PageDesc
    FASTBOOL SetCrsrInHdFt( USHORT nDescNo = USHRT_MAX,
                            FASTBOOL bInHeader = TRUE );
    // is point of cursor in header/footer. pbInHeader return TRUE if it is
    // in a headerframe otherwise in a footerframe
    FASTBOOL IsInHeaderFooter( FASTBOOL* pbInHeader = 0 ) const;

    // springe zum naechsten Verzeichnis [mit dem Namen]
    FASTBOOL GotoNextTOXBase( const String* = 0 );
    // springe zum vorherigen Verzeichnis [mit dem Namen]
    FASTBOOL GotoPrevTOXBase( const String* = 0 );
    FASTBOOL GotoTOXMarkBase();     // springe zum Verzeichnis vom TOXMark
    // springe zum naechsten (vorherigen) Verzeichniseintrag
    FASTBOOL GotoNxtPrvTOXMark( BOOL bNext = TRUE );
    // Zur naechsten/ vorherigen Verzeichnismarke dieses Typs traveln
    const SwTOXMark& GotoTOXMark( const SwTOXMark& rStart, SwTOXSearch eDir );

    // springe zum naechsten (vorherigen) Tabellenformel
    // optional auch nur zu kaputten Formeln springen
    FASTBOOL GotoNxtPrvTblFormula( BOOL bNext = TRUE,
                                    BOOL bOnlyErrors = FALSE );

    // springe zu dieser Refmark
    FASTBOOL GotoRefMark( const String& rRefMark, USHORT nSubType = 0,
                            USHORT nSeqNo = 0 );

    // hole vom Start/Ende der akt. Selection das nte Zeichen
    sal_Unicode GetChar( BOOL bEnd = TRUE, long nOffset = 0 );
    // erweiter die akt. Selection am Anfang/Ende um n Zeichen
    FASTBOOL ExtendSelection( BOOL bEnd = TRUE, xub_StrLen nCount = 1 );
    // setze nur den sichtbaren Cursor an die angegebene Dokument-Pos.
    // returnt FALSE: wenn der ob der SPoint vom Layout korrigiert wurde.
    // (wird zum Anzeigen von Drag&Drop/Copy-Cursor benoetigt)
    FASTBOOL SetVisCrsr( const Point &rPt );
    CRSR_INLINE void UnSetVisCrsr();

    // springe zum nachsten/vorherigen Feld des entsprechenden Types
    FASTBOOL MoveFldType( const SwFieldType* pFldType, BOOL bNext,
                                            USHORT nSubType = USHRT_MAX,
                                            USHORT nResType = USHRT_MAX );
    // springe genau zu diesem Feld
    FASTBOOL GotoFld( const SwFmtFld& rFld );

    // returne die Anzahl der Cursor im Ring (Flag besagt ob man nur
    // aufgepspannte haben will - sprich etwas selektiert ist (Basic))
    USHORT GetCrsrCnt( BOOL bAll = TRUE ) const;

    // Char Travelling - Methoden (in crstrvl1.cxx)
    FASTBOOL IsStartWord()const;
    FASTBOOL IsEndWord() const;
    FASTBOOL IsInWord() const;
    FASTBOOL GoStartWord();
    FASTBOOL GoEndWord();
    FASTBOOL GoNextWord();
    FASTBOOL GoPrevWord();
    FASTBOOL GoNextSentence();
    FASTBOOL GoPrevSentence();
    FASTBOOL SelectWord( const Point* pPt = 0 );

    // Abfrage vom CrsrTravelling Status
    CrsrMoveState GetMoveState() const { return eMvState; }

    // Position vom akt. Cursor erfragen
    FASTBOOL IsStartOfDoc() const;
    FASTBOOL IsEndOfDoc() const;
    FASTBOOL IsSttPara() const;
    FASTBOOL IsEndPara() const;
    FASTBOOL IsAtLeftMargin()   const       { return IsAtLRMargin( TRUE ); }
    FASTBOOL IsAtRightMargin(BOOL bAPI = FALSE) const   { return IsAtLRMargin( FALSE, bAPI ); }

    // loesche alle erzeugten Crsr, setze den Tabellen-Crsr und den letzten
    // Cursor auf seinen TextNode (oder StartNode?).
    // Beim naechsten ::GetCrsr werden sie wieder alle erzeugt.
    // Wird fuers Drag&Drop/ClipBorad-Paste in Tabellen benoetigt.
    FASTBOOL ParkTblCrsr();

    // erfrage die selektierte "Region" aller Cursor (fuer D&D auf Mac)
    Region GetCrsrRegion() const;

    // gibt es nicht aufgespannte Attribute?
    FASTBOOL IsGCAttr() const { return bGCAttr; }
    void    ClearGCAttr() { bGCAttr = FALSE; }
    void    UpdateAttr() {  bGCAttr = TRUE; }

    // ist das gesamte Dokument geschuetzt/versteckt?? (fuer UI,..)
    FASTBOOL IsAllProtect() const { return bAllProtect; }

#ifdef SW_CRSR_TIMER
    // setze das Flag am VisCrsr, ob dieser ueber Timer getriggert (TRUE)
    // oder direkt (FALSE) angezeigt wird. (default ist Timer getriggert)
    FASTBOOL ChgCrsrTimerFlag( BOOL bTimerOn = TRUE );
#endif

    // steht der Curor auf einem "Symbol"-Zeichen
    FASTBOOL IsInSymbolFont() const;

    BOOL BasicActionPend() const    { return nBasicActionCnt != nStartAction; }

        // springe zum benannten Bereich
    FASTBOOL GotoRegion( const String& rName );

    // zeige die aktuelle Selektion an
    virtual void MakeSelVisible();

    // setzte den Cursor auf einen NICHT geschuetzten/versteckten Node
    FASTBOOL FindValidCntntNode( BOOL bOnlyText = FALSE );

    FASTBOOL GetContentAtPos( const Point& rPt,
                            SwContentAtPos& rCntntAtPos,
                            FASTBOOL bSetCrsr = FALSE,
                            SwRect* pFldRect = 0 );

        // Attribut selelktieren
    FASTBOOL SelectTxtAttr( USHORT nWhich, BOOL bExpand = FALSE,
                            const SwTxtAttr* pAttr = 0 );
    FASTBOOL GotoINetAttr( const SwTxtINetFmt& rAttr );
    const SwFmtINetFmt* FindINetAttr( const String& rName ) const;

    FASTBOOL CheckTblBoxCntnt( const SwPosition* pPos = 0 );
    void SaveTblBoxCntnt( const SwPosition* pPos = 0 );
    void ClearTblBoxCntnt();
    FASTBOOL EndAllTblBoxEdit();

    // wird gerufen, wenn eine Tabellenselektion im UpdateCrsr erzeugt wird,
    // ohne das die UI davon etaws weiss
    virtual void NewCoreSelection();

    void SetSelTblCells( BOOL bFlag )           { bSelTblCells = bFlag; }
    BOOL IsSelTblCells() const                  { return bSelTblCells; }

    BOOL IsAutoUpdateCells() const              { return bAutoUpdateCells; }
    void SetAutoUpdateCells( BOOL bFlag )       { bAutoUpdateCells = bFlag; }

    FASTBOOL GetShadowCrsrPos( const Point& rPt, SwFillMode eFillMode,
                            SwRect& rRect, SwHoriOrient& rOrient );
    FASTBOOL SetShadowCrsrPos( const Point& rPt, SwFillMode eFillMode );

    const SwRedline* SelNextRedline();
    const SwRedline* SelPrevRedline();
    const SwRedline* GotoRedline( USHORT nArrPos, BOOL bSelect = FALSE );
};


class SwChgLinkFlag
{
    BOOL bOldFlag;
    SwCrsrShell& rCrsrShell;
    long nLeftFrmPos;
public:
    SwChgLinkFlag( SwCrsrShell& rShell );
    ~SwChgLinkFlag();
};



// Cursor Inlines:

#if defined(PRODUCT) && !defined(WIN)

inline SwMoveFnCollection* SwCrsrShell::MakeFindRange(
            USHORT nStt, USHORT nEnd, SwPaM* pPam ) const
{
    return pCurCrsr->MakeFindRange( (SwDocPositions)nStt, (SwDocPositions)nEnd, pPam );
}

inline SwCursor* SwCrsrShell::GetSwCrsr( FASTBOOL bMakeTblCrsr ) const
{
    return (SwCursor*)GetCrsr( bMakeTblCrsr );
}

inline SwPaM* SwCrsrShell::GetStkCrsr() const { return pCrsrStk; }

inline void SwCrsrShell::SetMark() { pCurCrsr->SetMark(); }

inline FASTBOOL SwCrsrShell::HasMark() { return( pCurCrsr->HasMark() ); }

inline FASTBOOL SwCrsrShell::IsSelection() const
{
    return IsTableMode() || pCurCrsr->HasMark() ||
            pCurCrsr->GetNext() != pCurCrsr;
}

inline FASTBOOL SwCrsrShell::IsSelOnePara() const
{
    return pCurCrsr == pCurCrsr->GetNext() &&
           pCurCrsr->GetPoint()->nNode == pCurCrsr->GetMark()->nNode;
}

inline const SwTableNode* SwCrsrShell::IsCrsrInTbl( BOOL bIsPtInTbl ) const
{
    return pCurCrsr->GetNode( bIsPtInTbl )->FindTableNode();
}

inline FASTBOOL SwCrsrShell::IsCrsrPtAtEnd() const
{
    return pCurCrsr->End() == pCurCrsr->GetPoint();
}

inline Point& SwCrsrShell::GetCrsrDocPos( BOOL bPoint ) const
{
    return bPoint ? pCurCrsr->GetPtPos() : pCurCrsr->GetMkPos();
}

inline const SwPaM* SwCrsrShell::GetTblCrs() const
{
    return pTblCrsr;
}

inline SwPaM* SwCrsrShell::GetTblCrs()
{
    return pTblCrsr;
}

inline void SwCrsrShell::UnSetVisCrsr()
{
    pVisCrsr->Hide();
    pVisCrsr->SetDragCrsr( FALSE );
}

#endif


#endif  // _CRSRSH_HXX
diff --git a/sw/inc/crstate.hxx b/sw/inc/crstate.hxx
new file mode 100644
index 0000000..e712b0c
--- /dev/null
+++ b/sw/inc/crstate.hxx
@@ -0,0 +1,156 @@
/*************************************************************************
 *
 *  $RCSfile: crstate.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _CRSTATE_HXX
#define _CRSTATE_HXX

#ifndef _GEN_HXX //autogen
#include <tools/gen.hxx>
#endif

#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _SWRECT_HXX
#include <swrect.hxx>
#endif

enum SwFillMode
{
    FILL_TAB,       // default, Auffuellen mit Tabulatoren
    FILL_SPACE,     // ... mit Tabulatoren und Spaces
    FILL_MARGIN,    // nur links, zentriert, rechts Ausrichten
    FILL_INDENT     // durch linken Absatzeinzug
};

struct SwFillCrsrPos
{
    SwRect aCrsr;           // Position und Groesse des Shadowcursors
    USHORT nParaCnt;        // Anzahl der einzufuegenden Absaetze
    USHORT nTabCnt;         // Anzahl der Tabs bzw. Groesse des Einzugs
    USHORT nSpaceCnt;       // Anzahl der einzufuegenden Leerzeichen
    USHORT nColumnCnt;      // Anzahl der notwendigen Spaltenumbrueche
    SwHoriOrient eOrient;   // Absatzausrichtung
    SwFillMode eMode;       // Gewuenschte Auffuellregel
    SwFillCrsrPos( SwFillMode eMd = FILL_TAB ) :
        nParaCnt( 0 ), nTabCnt( 0 ), nSpaceCnt( 0 ), nColumnCnt( 0 ),
        eOrient( HORI_NONE ), eMode( eMd )
    {}
};

// CrsrTravelling-Staties (fuer GetCrsrOfst)
enum CrsrMoveState
{
    MV_NONE,            // default
    MV_UPDOWN,          // Crsr Up/Down
    MV_RIGHTMARGIN,     // an rechten Rand
    MV_LEFTMARGIN,      // an linken Rand
    MV_SETONLYTEXT,     // mit dem Cursr nur im Text bleiben
    MV_TBLSEL           // nicht in wiederholte Headlines
};

// struct fuer spaetere Erweiterungen
struct SwCrsrMoveState
{
    SwFillCrsrPos   *pFill;     // fuer das automatische Auffuellen mit Tabs etc.
    Point aRealHeight;          // enthaelt dann die Position/Hoehe des Cursors
    CrsrMoveState eState;
    BOOL bStop          :1;
    BOOL bRealHeight    :1;     // Soll die reale Hoehe berechnet werden?
    BOOL bFieldInfo     :1;     // Sollen Felder erkannt werden?
    BOOL bPosCorr       :1;     // Point musste korrigiert werden
    BOOL bFtnNoInfo     :1;     // Fussnotennumerierung erkannt
    BOOL bExactOnly     :1;     // GetCrsrOfst nur nach Exakten Treffern
                                // suchen lassen, sprich niemals in das
                                // GetCntntPos laufen.
    BOOL bFillRet       :1;     // wird nur im FillModus temp. genutzt
    BOOL bSetInReadOnly :1;     // ReadOnlyBereiche duerfen betreten werden
    BOOL bDropIt        :1;     // dropportions allowed

    SwCrsrMoveState( CrsrMoveState eSt = MV_NONE ) :
        pFill( NULL ),
        eState( eSt ),
        bStop( FALSE ),
        bRealHeight( FALSE ),
        bFieldInfo( FALSE ),
        bPosCorr( FALSE ),
        bFtnNoInfo( FALSE ),
        bExactOnly( FALSE ),
        bSetInReadOnly( FALSE ),
        bDropIt( FALSE )
    {}
    SwCrsrMoveState( SwFillCrsrPos *pInitFill ) :
        pFill( pInitFill ),
        eState( MV_SETONLYTEXT ),
        bStop( FALSE ),
        bRealHeight( FALSE ),
        bFieldInfo( FALSE ),
        bPosCorr( FALSE ),
        bFtnNoInfo( FALSE ),
        bExactOnly( FALSE ),
        bSetInReadOnly( FALSE ),
        bDropIt( FALSE )
    {}
};


#endif


diff --git a/sw/inc/cshtyp.hxx b/sw/inc/cshtyp.hxx
new file mode 100644
index 0000000..269673e
--- /dev/null
+++ b/sw/inc/cshtyp.hxx
@@ -0,0 +1,147 @@
/*************************************************************************
 *
 *  $RCSfile: cshtyp.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _CSHTYP_HXX
#define _CSHTYP_HXX

#ifndef _SOLAR_H
#include <tools/solar.h>
#endif

class UniString;
class SwPaM;
class SwCntntFrm;
class SwLayoutFrm;

// eine Struktur fuer den SwPaM. In dieser stehen die Methoden-Pointer
// fuer das richtungsabhaengige Bewegen des Cursors.
struct SwMoveFnCollection;
typedef SwMoveFnCollection* SwMoveFn;


// Type-Definition fuer die CrsrShell
// Richtungsparameter fuer MovePage ( wird in SwCntntFrm initialisiert )
typedef SwLayoutFrm * (*SwWhichPage)( const SwLayoutFrm * );
typedef SwCntntFrm  * (*SwPosPage)( const SwLayoutFrm * );
extern SwWhichPage fnPagePrev, fnPageCurr, fnPageNext;
extern SwPosPage fnPageStart, fnPageEnd;

// Richtungsparameter fuer MovePara ( wird in SwPaM initialisiert )
typedef SwMoveFnCollection* SwPosPara;
typedef FASTBOOL (*SwWhichPara)( SwPaM&, SwPosPara );
extern SwWhichPara fnParaPrev, fnParaCurr, fnParaNext;
extern SwPosPara fnParaStart, fnParaEnd;

// Richtungsparameter fuer MoveSection
typedef SwMoveFnCollection* SwPosSection;
typedef FASTBOOL (*SwWhichSection)( SwPaM&, SwPosSection );
extern SwWhichSection fnSectionPrev, fnSectionCurr, fnSectionNext;
extern SwPosSection fnSectionStart, fnSectionEnd;

// Richtungsparameter fuer MoveTable
typedef SwMoveFnCollection* SwPosTable;
typedef FASTBOOL (*SwWhichTable)( SwPaM&, SwPosTable, FASTBOOL bInReadOnly );
extern SwWhichTable fnTablePrev, fnTableCurr, fnTableNext;
extern SwPosTable fnTableStart, fnTableEnd;

// Richtungsparameter fuer MoveColumn
typedef SwLayoutFrm * (*SwWhichColumn)( const SwLayoutFrm * );
typedef SwCntntFrm  * (*SwPosColumn)( const SwLayoutFrm * );
extern SwWhichColumn fnColumnPrev, fnColumnCurr, fnColumnNext;
extern SwPosColumn fnColumnStart, fnColumnEnd;

// Richtungsparameter fuer MoveRegion   (Bereiche!)
typedef SwMoveFnCollection* SwPosRegion;
typedef FASTBOOL (*SwWhichRegion)( SwPaM&, SwPosRegion, FASTBOOL bInReadOnly );
extern SwWhichRegion fnRegionPrev, fnRegionCurr, fnRegionNext, fnRegionCurrAndSkip;
extern SwPosRegion fnRegionStart, fnRegionEnd;



/*
 * folgende Kombinationen sind erlaubt:
 *  - suche einen im Body:                  -> FND_IN_BODY
 *  - suche alle im Body:                   -> FND_IN_BODYONLY | FND_IN_SELALL
 *  - suche in Selectionen: einen / alle    -> FND_IN_SEL  [ | FND_IN_SELALL ]
 *  - suche im nicht Body: einen / alle     -> FND_IN_OTHER [ | FND_IN_SELALL ]
 *  - suche ueberall alle:                  -> FND_IN_SELALL
 */
enum FindRanges
{
    FND_IN_BODY     = 0x00,     // suche "eins" mur im Body-Text
    FND_IN_OTHER    = 0x02,     // suche "alles" in Footer/Header/Fly...
    FND_IN_SEL      = 0x04,     // suche in Selectionen
    FND_IN_BODYONLY = 0x08,     // suche nur im Body - nur in Verbindung mit
                                // FND_IN_SELALL !!!
    FND_IN_SELALL   = 0x01      // - alle ( nur im nicht Body und Selectionen)
};


enum SwDocPositions
{
    DOCPOS_START,
    DOCPOS_CURR,
    DOCPOS_END,
    DOCPOS_OTHERSTART,
    DOCPOS_OTHEREND
};


#endif  // _CSHTYP_HXX
diff --git a/sw/inc/dbfld.hxx b/sw/inc/dbfld.hxx
new file mode 100644
index 0000000..c6fca4a
--- /dev/null
+++ b/sw/inc/dbfld.hxx
@@ -0,0 +1,366 @@
/*************************************************************************
 *
 *  $RCSfile: dbfld.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _DBFLD_HXX
#define _DBFLD_HXX

#include "fldbas.hxx"

class SwDoc;
class SwTxtFld;
class SwFrm;

/*--------------------------------------------------------------------
    Beschreibung: Datenbankfeld
 --------------------------------------------------------------------*/

class SwDBFieldType : public SwValueFieldType
{
    String aName;       // Syntax: Datenbankname.Feldname
    long   nRefCnt;

public:

    SwDBFieldType(SwDoc* pDocPtr, const String& Name, const String& rSymDBName);

    virtual const String& GetName() const;
    virtual SwFieldType*  Copy() const;

    inline void     AddRef() { nRefCnt++; }
    void            ReleaseRef();
    inline long     GetRefCount() { return nRefCnt; }

    String          GetColumnName();
    String          GetDBName();

    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );
};

/*--------------------------------------------------------------------
    Beschreibung:
    von SwFields abgeleitete Klassen. Sie ueberlagern die Expand-Funktion.
    Der Inhalt wird entsprechend dem Format, soweit vorhanden, formatiert.
 --------------------------------------------------------------------*/

class SwDBField : public SwValueField
{
    String  aContent;
    USHORT  nSubType;
    BOOL    bIsInBodyTxt    : 1;
    BOOL    bValidValue     : 1;
    BOOL    bInitialized    : 1;

public:
    SwDBField(SwDBFieldType*, ULONG nFmt = 0);
    virtual ~SwDBField();

    virtual SwFieldType*    ChgTyp( SwFieldType* );

    // Der aktuelle Text
    inline  void        SetExpansion(const String& rStr);
    virtual String      Expand() const;
    virtual SwField*    Copy() const;

    virtual USHORT      GetSubType() const;
    virtual void        SetSubType(USHORT nType);

    // Name oder Inhalt
    virtual String      GetCntnt(BOOL bName = FALSE) const;

    // fuer Berechnungen in Ausdruecken
    void                ChgValue( double d, BOOL bVal );

    // Evaluierung ueber den DBMgr String rauspulen
    void                Evaluate();

    // Evaluierung fuer Kopf und Fusszeilen
    void                ChangeExpansion( const SwFrm*, const SwTxtFld* );
    void                InitContent();
    void                InitContent(const String& rExpansion);
    String              GetOldContent();

    inline void         ChgBodyTxtFlag( BOOL bIsInBody );
    inline BOOL         IsInBodyTxt() const;

    inline BOOL         IsValidValue() const    { return bValidValue; }

    inline BOOL         IsInitialized() const   { return bInitialized; }
    inline void         ClearInitialized()      { bInitialized = FALSE; }
    inline void         SetInitialized()        { bInitialized = TRUE; }

    // Name erfragen
    virtual const String& GetPar1() const;

    // DBName
    inline String       GetDBName() const { return ((SwDBFieldType*)GetTyp())->GetDBName(); }
    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );
};

inline  void SwDBField::SetExpansion(const String& rStr)
    { aContent = rStr; }

// wird von der Formatierung abgefragt
inline BOOL SwDBField::IsInBodyTxt() const
    { return bIsInBodyTxt; }

// wird von UpdateExpFlds gesetzt (dort ist die Node-Position bekannt)
inline void SwDBField::ChgBodyTxtFlag( BOOL bIsInBody )
    { bIsInBodyTxt = bIsInBody; }

/*--------------------------------------------------------------------
    Beschreibung: Basisklasse fuer alle weiteren Datenbankfelder
 --------------------------------------------------------------------*/

class SwDBNameInfField : public SwField
{
    String  sDBName;

protected:
    const String&   GetDBName() const {return sDBName;}
    String&         GetDBName() {return sDBName;}

    SwDBNameInfField(SwFieldType* pTyp, const String& rDBName, ULONG nFmt = 0);

public:
    // DBName
    inline const String&    GetRealDBName() { return sDBName; }

    String                  GetDBName(SwDoc* pDoc);
    inline void             SetDBName(const String& rDBName) { sDBName = rDBName; }

    // Name oder Inhalt
    virtual String          GetCntnt(BOOL bName = FALSE) const;
    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );
};


/*--------------------------------------------------------------------
    Beschreibung: Datenbankfeld Naechster Satz
 --------------------------------------------------------------------*/

class SwDBNextSetFieldType : public SwFieldType
{
public:
    SwDBNextSetFieldType();

    virtual SwFieldType*    Copy() const;
};


/*--------------------------------------------------------------------
    Beschreibung: Naechsten Datensatz mit Bedingung
 --------------------------------------------------------------------*/

class SwDBNextSetField : public SwDBNameInfField
{
    String  aCond;
    BOOL    bCondValid;

public:
    SwDBNextSetField( SwDBNextSetFieldType*,
                      const String& rCond, const String& rDummy, const String& rDBName);

    virtual String          Expand() const;
    virtual SwField*        Copy() const;

    void                    Evaluate(SwDoc*);
    inline void             SetCondValid(BOOL bCond);
    inline BOOL             IsCondValid() const;

    // Condition
    virtual const String&   GetPar1() const;
    virtual void            SetPar1(const String& rStr);
    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );
};

inline BOOL SwDBNextSetField::IsCondValid() const
    { return bCondValid; }

inline void SwDBNextSetField::SetCondValid(BOOL bCond)
    { bCondValid = bCond; }

/*--------------------------------------------------------------------
    Beschreibung: Datenbankfeld Naechster Satz
 --------------------------------------------------------------------*/

class SwDBNumSetFieldType : public SwFieldType
{
public:
    SwDBNumSetFieldType();

    virtual SwFieldType*    Copy() const;
};


/*--------------------------------------------------------------------
    Beschreibung: Datensatz mit Nummer xxx
                  Die Nummer steht in nFormat
                  ! kleiner Missbrauch
 --------------------------------------------------------------------*/

class SwDBNumSetField : public SwDBNameInfField
{
    String  aCond;
    String  aPar2;
    BOOL    bCondValid;

public:
    SwDBNumSetField(SwDBNumSetFieldType*, const String& rCond, const String& rDBNum, const String& rDBName);

    virtual String          Expand() const;
    virtual SwField*        Copy() const;

    inline BOOL             IsCondValid() const;
    inline void             SetCondValid(BOOL bCond);
    void                    Evaluate(SwDoc*);

    // Condition
    virtual const String&   GetPar1() const;
    virtual void            SetPar1(const String& rStr);

    // Datensatznummer
    virtual String          GetPar2()   const;
    virtual void            SetPar2(const String& rStr);

    // Die Datensatznummer steht in nFormat !!
    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );
};

inline BOOL SwDBNumSetField::IsCondValid() const
    { return bCondValid; }

inline void SwDBNumSetField::SetCondValid(BOOL bCond)
    { bCondValid = bCond; }

/*--------------------------------------------------------------------
    Beschreibung: Datenbankname
 --------------------------------------------------------------------*/

class SwDBNameFieldType : public SwFieldType
{
        SwDoc *pDoc;
public:
    SwDBNameFieldType(SwDoc*);

    String                  Expand(ULONG) const;
    virtual SwFieldType*    Copy() const;
};

/*--------------------------------------------------------------------
    Beschreibung: Datenbankfeld
 --------------------------------------------------------------------*/

class SwDBNameField : public SwDBNameInfField
{
public:
    SwDBNameField(SwDBNameFieldType*, const String& rDBName, ULONG nFmt = 0);

    virtual String   Expand() const;
    virtual SwField* Copy() const;
    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );
};

/*--------------------------------------------------------------------
    Beschreibung: Datensatznummer
 --------------------------------------------------------------------*/

class SwDBSetNumberFieldType : public SwFieldType
{
public:
    SwDBSetNumberFieldType();

    virtual SwFieldType*    Copy() const;
};

/*--------------------------------------------------------------------
    Beschreibung: Datenbankfeld
 --------------------------------------------------------------------*/

class SwDBSetNumberField : public SwDBNameInfField
{
    long    nNumber;

public:
    SwDBSetNumberField(SwDBSetNumberFieldType*, const String& rDBName, ULONG nFmt = 0);

    virtual String  Expand() const;
    virtual         SwField* Copy() const;
    void            Evaluate(SwDoc*);

    inline long     GetSetNumber() const;
    inline void     SetSetNumber(long nNum);
    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );
};

inline long SwDBSetNumberField::GetSetNumber() const
    { return nNumber; }

inline void SwDBSetNumberField::SetSetNumber(long nNum)
    { nNumber = nNum; }


#endif // _DBFLD_HXX
diff --git a/sw/inc/dbmgr.hxx b/sw/inc/dbmgr.hxx
new file mode 100644
index 0000000..07ddffd
--- /dev/null
+++ b/sw/inc/dbmgr.hxx
@@ -0,0 +1,383 @@
/*************************************************************************
 *
 *  $RCSfile: dbmgr.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWDBMGR_HXX
#define _SWDBMGR_HXX


#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif

#ifdef REPLACE_OFADBMGR
#ifndef _SBAITEMS_HXX
#include "offmgr/sbaitems.hxx"
#endif
#ifndef _COM_SUN_STAR_UTIL_DATE_HPP_
#include <com/sun/star/util/Date.hpp>
#endif

#else

#ifndef _OFF_OFADBMGR_HXX //autogen
#include <offmgr/ofadbmgr.hxx>
#endif
#endif

#include "swtypes.hxx"  // fuer aEmptyStr

#ifdef REPLACE_OFADBMGR
#ifndef _COM_SUN_STAR_UNO_REFERENCE_H_
#include <com/sun/star/uno/Reference.h>
#endif
#ifndef _COM_SUN_STAR_UNO_SEQUENCE_H_
#include <com/sun/star/uno/Sequence.h>
#endif
#ifndef _COM_SUN_STAR_LANG_LOCALE_HPP_
#include <com/sun/star/lang/Locale.hpp>
#endif
namespace com{namespace sun{namespace star{
    namespace sdbc{
        class XConnection;
        class XStatement;
        class XDataSource;
        class XResultSet;
    }
    namespace beans{

        class XPropertySet;
    }
    namespace sdbcx{
        class XColumnsSupplier;
    }
    namespace util{
        class XNumberFormatter;
    }
}}}

struct SwDBFormatData
{
    com::sun::star::util::Date aNullDate;
    com::sun::star::uno::Reference< com::sun::star::util::XNumberFormatter> xFormatter;
    com::sun::star::lang::Locale aLocale;
};
#endif //REPLACE_OFADBMGR

class SwView;
class SwWrtShell;
class SwPrtOptions;
class SfxProgress;
class ListBox;
class Button;
class SvNumberFormatter;

// -----------------------------------------------------------------------

enum DBMgrOptions
{
    DBMGR_MERGE,            // Datensaetze in Felder
    DBMGR_INSERT,           // Datensaetze in Text
    DBMGR_MERGE_MAILMERGE,  // Serienbriefe drucken
    DBMGR_MERGE_MAILING,    // Serienbriefe als email versenden
    DBMGR_MERGE_MAILFILES   // Serienbriefe als Datei(en) speichern
};

// -----------------------------------------------------------------------

/*--------------------------------------------------------------------
     Beschreibung: (neue) Logische Datenbanken verwalten
 --------------------------------------------------------------------*/
#ifdef REPLACE_OFADBMGR
#define SW_DB_SELECT_UNKNOWN    0
#define SW_DB_SELECT_TABLE      1
#define SW_DB_SELECT_QUERY      2

struct SwDSParam
{
    String                      sDataSource;
    String                      sTableOrQuery;
    BYTE                        nTableOrQuery;
    String                      sStatement;
    com::sun::star::util::Date  aNullDate;

    ::com::sun::star::uno::Reference<com::sun::star::util::XNumberFormatter>    xFormatter;
    ::com::sun::star::uno::Reference<::com::sun::star::sdbc::XConnection>       xConnection;
    ::com::sun::star::uno::Reference<::com::sun::star::sdbc::XStatement>        xStatement;
    ::com::sun::star::uno::Reference<::com::sun::star::sdbc::XResultSet>        xResultSet;

    SbaSelectionListRef         xSelectionList;
    BOOL bScrollable;
    BOOL bSelectionList;
    BOOL bEndOfDB;
    long nSelectionIndex;

    SwDSParam(const String& rSource, const String& rTable, BYTE nType, const String& rStatement) :
        sDataSource(rSource),
        sTableOrQuery(rTable),
        nTableOrQuery(nType),
        sStatement(rStatement),
        bScrollable(FALSE),
        bSelectionList(FALSE),
        bEndOfDB(FALSE),
        nSelectionIndex(0)
        {}
};
typedef SwDSParam* SwDSParamPtr;
SV_DECL_PTRARR_DEL(SwDSParamArr, SwDSParamPtr, 0, 5)

#endif  //REPLACE_OFADBMGR

#ifdef REPLACE_OFADBMGR
class SwNewDBMgr
#else
class SwNewDBMgr : public OfaDBMgr
#endif
{
    SbaSelectionListRef pMergeList;     // Liste der fr Serienbrief selektierten Eintr„ge
    String              sEMailAddrFld;  // Mailing: Spaltenname der E-Mail Adresse
    String              sSubject;       // Mailing: Subject
    String              sAttached;      // Mailing: Attachte Files
    USHORT              nMergeType;
    BOOL                bInitDBFields : 1;  // TRUE: Datenbank an Feldern beim Mergen
    BOOL                bSingleJobs : 1;    // Einzelne Druckjobs bei Aufruf aus Basic
    BOOL                bCancel : 1;        // Serienbrief-Save abgebrochen

#ifdef REPLACE_OFADBMGR
    BOOL                bInMerge    : 1;    //merge process active
    SwDSParamArr        aDataSourceParams;

    SwDSParam*          pMergeData;

    BOOL                OpenMergeSource(const String& rDataSource,
                            const String& rDataTableOrQuery,
                            const String& rStatement,
                            const SbaSelectionListRef xSelectionList);
    SwDSParam*          FindDSData(const String& rDBName, BOOL bCreate);
#endif


    DECL_LINK( PrtCancelHdl, Button * );

    // Datensaetze als Text ins Dokument einfuegen
#ifdef REPLACE_OFADBMGR
    void ImportFromConnection( SwWrtShell* pSh);
#else
    void ImportFromConnection( SwWrtShell* pSh,
                                const SbaSelectionList* pSelList = 0 );
#endif

    // Einzelnen Datensatz als Text ins Dokument einfuegen
#ifdef REPLACE_OFADBMGR
    void ImportDBEntry(SwWrtShell* pSh);
#else
    void ImportDBEntry(SbaDBDataDef* pDef, SwWrtShell* pSh);
    BOOL    GotoNextSelectedRecord( BOOL bSyncronized );
#endif

    // Mischen von Datensaetzen in Felder, dann per email versenden
    BOOL            MergeMailing(SwWrtShell* pSh);
    // Mischen von Datensaetzen in Felder, dann als Datei abspeichern
    BOOL            MergeMailFiles(SwWrtShell* pSh);
public:
    SwNewDBMgr();
#ifdef REPLACE_OFADBMGR
    ~SwNewDBMgr();
#endif
    // Am Dokument Datenbank- Tabellenname und SQL-Select-Statement setzen
    void            ChgDBName( SwWrtShell* pSh,
#ifdef REPLACE_OFADBMGR
                        const String& rDataSource,
                        const String& rTableOrQuery,
#else
                        const String& rDBName,
#endif
                                const String& rStatement );

    // Art des aktellen Mergens. Siehe DBMgrOptions-enum
    inline USHORT   GetMergeType() const            { return nMergeType; }
    inline void     SetMergeType( USHORT nTyp )     { nMergeType = nTyp; }

    // Mischen von Datensaetzen in Felder
    BOOL            Merge(USHORT nOpt, SwWrtShell* pSh, const String& rStatement,
                        const SbaSelectionListRef pSelectionList,
#ifdef REPLACE_OFADBMGR
                        const String& rDataSource,
                        const String& rTableOrQuery,
#else
                        const String& rDBName,
#endif
                        const String *pPrinter = NULL);
    BOOL            Merge(SwWrtShell* pSh);
    // Mischen von Datensaetzen in Felder, dann drucken
    BOOL            MergePrint( SwView& rView,
                                SwPrtOptions& rOpt, SfxProgress& rProgress );
    inline SbaSelectionListRef& GetMergeList()  { return pMergeList; }

    // Datenbankfelder mit fehlendem Datenbankname initialisieren
    inline BOOL     IsInitDBFields() const  { return bInitDBFields; }
    inline void     SetInitDBFields(BOOL b) { bInitDBFields = b;    }

    // Serienbriefe einzelnd oder alle zusammen drucken/speichern
    inline BOOL     IsSingleJobs() const    { return bSingleJobs;   }
    inline void     SetSingleJobs(BOOL b)   { bSingleJobs = b;  }

    // Mailing
    // email-Daten setzen
    inline void     SetEMailColumn(const String& sColName) { sEMailAddrFld = sColName; }
    inline void     SetSubject(const String& sSbj) { sSubject = sSbj; }
    inline void     SetAttachment(const String& sAtt) { sAttached = sAtt; }


#ifdef REPLACE_OFADBMGR
    // Listbox mit allen Tabellennamen einer Datenbank fuellen
    BOOL            GetTableNames(ListBox* pListBox, const String& rDBName );
    // Listbox mit allen Spaltennamen einer Datenbanktabelle fuellen
    BOOL            GetColumnNames(ListBox* pListBox,
                        const String& rDBName, const String& rTableName, BOOL bAppend = FALSE);
    ULONG GetColumnFmt( const String& rDBName,
                        const String& rTableName,
                        const String& rColNm,
                        SvNumberFormatter* pNFmtr,
                        long nLanguage );
    sal_Int32 GetColumnType( const String& rDBName,
                          const String& rTableName,
                          const String& rColNm );

#else
    // Listbox mit allen Tabellennamen einer Datenbank fuellen
    BOOL            GetTableNames(ListBox* pListBox, String sDBName);
    // Listbox mit allen Spaltennamen einer Datenbanktabelle fuellen
    BOOL            GetColumnNames(ListBox* pListBox, String sDBName, BOOL bAppend = FALSE);
    // DB-Cursor auf einen bestimmten Datensatz stellen
    // (Ist im OfaDBMgr protected, daher hier nochmals als public fuer dbinsdlg.cxx)
    inline void GotoRecord( ULONG nIndex )
    {   OfaDBMgr::GotoRecord( FALSE, nIndex ); }

    ULONG GetColumnFmt( const String& rDBName, const String& rColNm,
                                SvNumberFormatter* pNFmtr );
    // Numberformat der Spalte ermitteln und ggfs. in den uebergebenen
    // Formatter uebertragen
    ULONG GetRealColumnFmt( const String& rColNm, ULONG nFmt,
                            SvNumberFormatter& rNFmtr );
    BOOL IsDBCaseSensitive( const String& rName ) const;
#endif

#ifdef REPLACE_OFADBMGR
    inline BOOL     IsInMerge() const   { return bInMerge; }
    void            EndMerge();

    // check if a data source is open as merge source
    BOOL            IsDataSourceOpen(const String& rDataSource, const String& rTableOrQuery)const;

    // add data source information to the data source array - was PreInitDBData
    void            AddDSData(const String& rDBName, long nSelStart, long nSelEnd);
    void            GetDSSelection(const String& sDBDesc, long& rSelStart, long& rSelEnd);

    // open the source while fields are updated - for the calculator only!
    BOOL            OpenDataSource(const String& rDataSource, const String& rTableOrQuery);
    sal_uInt32      GetSelectedRecordId(const String& rDataSource, const String& rTableOrQuery);
    BOOL            GetColumnCnt(const String& rSourceName, const String& rTableName,
                            const String& rColumnName, sal_uInt32 nAbsRecordId, long nLanguage,
                            String& rResult, double* pNumber);

    const SwDSParam* CreateDSData(const String& rDBName)
                        {return FindDSData(rDBName, TRUE);}
    const SwDSParamArr& GetDSParamArray() const {return aDataSourceParams;}


    //close all data sources - after fields were updated
    void            CloseAll(BOOL bIncludingMerge = TRUE);

    BOOL            GetMergeColumnCnt(const String& rColumnName, USHORT nLanguage,
                                String &rResult, double *pNumber, sal_uInt32 *pFormat);
    BOOL            ToNextMergeRecord();
    BOOL            ExistsNextRecord()const;
    sal_uInt32      GetSelectedRecordId();
    sal_Bool        ToRecordId(sal_Int32 nSet);

    BOOL            ShowInBeamer(const String& rDBName, const String& rTableName,
                                                BYTE nType, const String& rStatement);

    const String&   GetAddressDBName();

    static String GetDBField(
                    ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > xColumnProp,
                    const SwDBFormatData& rDBFormatData,
                    double *pNumber = NULL);

    static ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection>
            GetConnection(const String& rDataSource,
                ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDataSource>& rxSource);

    static ::com::sun::star::uno::Reference< ::com::sun::star::sdbcx::XColumnsSupplier>
            GetColumnSupplier(::com::sun::star::uno::Reference<::com::sun::star::sdbc::XConnection>,
                                    const String& rTableOrQuery,
                                    BYTE    eTableOrQuery = SW_DB_SELECT_UNKNOWN);

    static ::com::sun::star::uno::Sequence<rtl::OUString> GetExistingDatabaseNames();

#else

#endif  //REPLACE_OFADBMGR

};

#endif

diff --git a/sw/inc/dcontact.hxx b/sw/inc/dcontact.hxx
new file mode 100644
index 0000000..b91a07ef
--- /dev/null
+++ b/sw/inc/dcontact.hxx
@@ -0,0 +1,193 @@
/*************************************************************************
 *
 *  $RCSfile: dcontact.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _DCONTACT_HXX
#define _DCONTACT_HXX

#ifndef _SVDOBJ_HXX //autogen
#include <svx/svdobj.hxx>
#endif
#include "calbck.hxx"

class SfxPoolItem;
class SwFrmFmt;
class SwFlyFrmFmt;
class SwDrawFrmFmt;
class SwFlyFrm;
class SwFrm;
class SwPageFrm;
class SwVirtFlyDrawObj;
class SwFmtAnchor;
class SwFlyDrawObj;
class SwRect;

//Der Umgekehrte Weg: Sucht das Format zum angegebenen Objekt.
//Wenn das Object ein SwVirtFlyDrawObj ist so wird das Format von
//selbigem besorgt.
//Anderfalls ist es eben ein einfaches Zeichenobjekt. Diese hat einen
//UserCall und der ist Client vom gesuchten Format.
//Implementierung in dcontact.cxx
SwFrmFmt *FindFrmFmt( SdrObject *pObj );
inline const SwFrmFmt *FindFrmFmt( const SdrObject *pObj )
{   return ::FindFrmFmt( (SdrObject*)pObj ); }

//Bei Aenderungen das Objekt aus dem ContourCache entfernen.
//Implementierung in TxtFly.Cxx
void ClrContourCache( const SdrObject *pObj );

// liefert BoundRect inklusive Abstand
SwRect GetBoundRect( const SdrObject* pObj );

//Liefert den UserCall ggf. vom Gruppenobjekt
SdrObjUserCall* GetUserCall( const SdrObject* );

// liefert TRUE falls das SrdObject ein Marquee-Object (Lauftext) ist
FASTBOOL IsMarqueeTextObj( const SdrObject& rObj );

//Basisklasse fuer die folgenden KontaktObjekte (Rahmen+Zeichenobjekte)
class SwContact : public SdrObjUserCall, public SwClient
{
    SdrObject *pMasterObj;
public:
    TYPEINFO();

    //Fuer den Reader, es wir nur die Verbindung hergestellt.
    SwContact( SwFrmFmt *pToRegisterIn, SdrObject *pObj );
    SwContact( SwModify *pToRegisterIn ) : SwClient( pToRegisterIn ){}

    const SdrObject *GetMaster() const  { return pMasterObj; }
          SdrObject *GetMaster()        { return pMasterObj; }
    void SetMaster( SdrObject* pNew ){ pMasterObj = pNew; }

    virtual ~SwContact();

          SwFrmFmt  *GetFmt(){ return (SwFrmFmt*)GetRegisteredIn(); }
    const SwFrmFmt  *GetFmt() const
        { return (const SwFrmFmt*)GetRegisteredIn(); }
};

//KontactObjekt fuer die Verbindung zwischen Rahmen bzw. deren Formaten
//im StarWriter (SwClient) und den Zeichenobjekten des Drawing (SdrObjUserCall)

class SwFlyDrawContact : public SwContact
{
public:
    TYPEINFO();

    //Legt das DrawObjekt an und meldet es beim Model an.
    SwFlyDrawContact( SwFlyFrmFmt *pToRegisterIn, SdrModel *pMod );
    SwFlyDrawContact( SwFrmFmt *pToRegisterIn, SdrObject *pObj ):
        SwContact( pToRegisterIn, pObj ){}

    SwVirtFlyDrawObj *CreateNewRef( SwFlyFrm *pFly );

    // virtuelle Methoden von SwClient
    virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew );

};

//KontactObjekt fuer die Verbindung von Formaten als Repraesentanten der
//Zeichenobjekte im StarWriter (SwClient) und den Objekten selbst im Drawing
//(SdrObjUserCall).

class SwDrawContact : public SwContact
{
    SwFrm     *pAnchor;
    SwPageFrm *pPage;
public:
    TYPEINFO();

    SwDrawContact( SwFrmFmt *pToRegisterIn, SdrObject *pObj );
    virtual ~SwDrawContact();

    const SwPageFrm *GetPage() const            { return pPage; }
          SwPageFrm *GetPage()                  { return pPage; }
    const SwFrm     *GetAnchor() const          { return pAnchor; }
          SwFrm     *GetAnchor()                { return pAnchor; }
          void       ChgAnchor( SwFrm *pNew )   { pAnchor = pNew; }
          void       ChgPage  ( SwPageFrm *pNew){ pPage   = pNew; }

          void       ChkPage();     //Muss immer nach SetAnchorPos() gerufen
                                    //werden. Das Objekt haengt sich dann an
                                    //die richtige Seite.
          SwPageFrm* FindPage( const SwRect &rRect );

    //Fuegt das SdrObject in die Arrays (SwPageFrm und SwFrm) des Layouts ein.
    //Der Anker wird Anhand des Attributes SwFmtAnchor bestimmt.
    //Das Objekt wird ggf. beim alten Anker abgemeldet.
    void ConnectToLayout( const SwFmtAnchor *pAnch = 0 );
    void DisconnectFromLayout( BOOL bRemoveFromPage = TRUE );   //Abmelden beim Anker.

    // virtuelle Methoden von SwClient
    virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew );

    // virtuelle Methoden von SdrObjUserCall
    virtual void Changed(const SdrObject& rObj, SdrUserCallType eType, const Rectangle& rOldBoundRect);

    // wird von Changed() und auch vom UndoDraw benutzt, uebernimmt
    // das Notifien von Absaetzen, die ausweichen muessen
    void _Changed(const SdrObject& rObj, SdrUserCallType eType, const Rectangle* pOldBoundRect);

    //Moved alle SW-Verbindungen zu dem neuen Master.
    void ChangeMasterObject( SdrObject *pNewMaster );
};

#endif

diff --git a/sw/inc/ddefld.hxx b/sw/inc/ddefld.hxx
new file mode 100644
index 0000000..32e48f0
--- /dev/null
+++ b/sw/inc/ddefld.hxx
@@ -0,0 +1,152 @@
/*************************************************************************
 *
 *  $RCSfile: ddefld.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _DDEFLD_HXX
#define _DDEFLD_HXX

#ifndef _LNKBASE_HXX //autogen
#include <so3/lnkbase.hxx>
#endif
#include "fldbas.hxx"

class SwDoc;

/*--------------------------------------------------------------------
    Beschreibung: FieldType fuer DDE
 --------------------------------------------------------------------*/

class SwDDEFieldType : public SwFieldType
{
    String aName;
    String aExpansion;

    SvBaseLinkRef refLink;
    SwDoc* pDoc;

    USHORT nRefCnt;
    BOOL bCRLFFlag : 1;
    BOOL bDeleted : 1;

    void _RefCntChgd();
public:
    SwDDEFieldType( const String& rName, const String& rCmd,
                    USHORT = LINKUPDATE_ONCALL );
    ~SwDDEFieldType();

    const String& GetExpansion() const          { return aExpansion; }
    void SetExpansion( const String& rStr )     { aExpansion = rStr,
                                                  bCRLFFlag = FALSE; }

    virtual SwFieldType* Copy() const;
    virtual const String& GetName() const;

    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );

    String GetCmd() const;
    void SetCmd( const String& rStr );

    USHORT GetType() const          { return refLink->GetUpdateMode();  }
    void SetType( USHORT nType )    { refLink->SetUpdateMode( nType );  }

    BOOL IsDeleted() const          { return bDeleted; }
    void SetDeleted( BOOL b )       { bDeleted = b; }

    BOOL IsConnected() const        { return 0 != refLink->GetObject(); }
    void UpdateNow()                { refLink->Update(); }
    void Disconnect()               { refLink->Disconnect(); }

    const SvBaseLink& GetBaseLink() const   { return *refLink; }

    const SwDoc* GetDoc() const     { return pDoc; }
          SwDoc* GetDoc()           { return pDoc; }
    void SetDoc( SwDoc* pDoc );

    void IncRefCnt() {  if( !nRefCnt++ && pDoc ) _RefCntChgd(); }
    void DecRefCnt() {  if( !--nRefCnt && pDoc ) _RefCntChgd(); }

    void SetCRLFDelFlag( BOOL bFlag = TRUE )    { bCRLFFlag = bFlag; }
    BOOL IsCRLFDelFlag() const                  { return bCRLFFlag; }
};

/*--------------------------------------------------------------------
    Beschreibung: DDE-Feld
 --------------------------------------------------------------------*/

class SwDDEField : public SwField
{
public:
    SwDDEField(SwDDEFieldType*);
    ~SwDDEField();

    virtual String   Expand() const;
    virtual SwField* Copy() const;

    // ueber Typen Parameter ermitteln
    // Name kann nicht geaendert werden
    virtual const String& GetPar1() const;

    // Commando
    virtual String  GetPar2() const;
    virtual void    SetPar2(const String& rStr);
};


#endif // _DDEFLD_HXX
diff --git a/sw/inc/dlelstnr.hxx b/sw/inc/dlelstnr.hxx
new file mode 100644
index 0000000..02f337b
--- /dev/null
+++ b/sw/inc/dlelstnr.hxx
@@ -0,0 +1,106 @@
/*************************************************************************
 *
 *  $RCSfile: dlelstnr.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _DLELSTNR_HXX_
#define _DLELSTNR_HXX_

#include <cppuhelper/weak.hxx>

#ifndef _COM_SUN_STAR_LINGUISTIC_XDICTIONARYLIST_HPP_
#include <com/sun/star/linguistic/XDictionaryList.hpp>
#endif
#ifndef _COM_SUN_STAR_LINGUISTIC_XDICTIONARYLISTEVENTLISTENER_HPP_
#include <com/sun/star/linguistic/XDictionaryListEventListener.hpp>
#endif
#ifndef _CPPUHELPER_IMPLBASE1_HXX_
#include <cppuhelper/implbase1.hxx> // helper for implementations
#endif

///////////////////////////////////////////////////////////////////////////
// SwDicListEvtListener
// is a ::com::sun::star::linguistic::XDictionaryListEventListener that triggers spellchecking
// and hyphenation (yet to be implemented) when relevant changes to the
// dictionaries of the dictionary list were made.
//

class SwDicListEvtListener : public cppu::WeakImplHelper1
<
    ::com::sun::star::linguistic::XDictionaryListEventListener
>
{
private:
    ::com::sun::star::uno::Reference< ::com::sun::star::linguistic::XDictionaryList >   xDicList;

    // disallow use of copy-constructor and assignment operator
    SwDicListEvtListener(const SwDicListEvtListener &);
    SwDicListEvtListener & operator = (const SwDicListEvtListener &);

public:
    SwDicListEvtListener( const ::com::sun::star::uno::Reference< ::com::sun::star::linguistic::XDictionaryList >  &rxDicList );
    virtual ~SwDicListEvtListener();

    // ::com::sun::star::linguistic::XDictionaryListEventListener
    virtual void    SAL_CALL processDictionaryListEvent(const ::com::sun::star::linguistic::DictionaryListEvent& aDicListEvent) throw( ::com::sun::star::uno::RuntimeException );
};


#endif

diff --git a/sw/inc/dobjfac.hxx b/sw/inc/dobjfac.hxx
new file mode 100644
index 0000000..a7af1c3
--- /dev/null
+++ b/sw/inc/dobjfac.hxx
@@ -0,0 +1,83 @@
/*************************************************************************
 *
 *  $RCSfile: dobjfac.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _DOBJFAC_HXX
#define _DOBJFAC_HXX

#ifndef _LINK_HXX //autogen
#include <tools/link.hxx>
#endif

//-----------------------
// class SwObjectFactory
//-----------------------
class SdrObjFactory;

class SwObjectFactory
{
public:
    DECL_LINK( MakeObject, SdrObjFactory * );
};

extern SwObjectFactory aSwObjectFactory;


#endif // _DOBJFAC_HXX

diff --git a/sw/inc/doc.hxx b/sw/inc/doc.hxx
new file mode 100644
index 0000000..d26acab
--- /dev/null
+++ b/sw/inc/doc.hxx
@@ -0,0 +1,1770 @@
/*************************************************************************
 *
 *  $RCSfile: doc.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _DOC_HXX
#define _DOC_HXX

#define _SVSTDARR_STRINGSDTOR
#include <svtools/svstdarr.hxx>

#ifndef _TIMER_HXX //autogen
#include <vcl/timer.hxx>
#endif
#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _NDARR_HXX
#include <ndarr.hxx>
#endif
#ifndef _SWATRSET_HXX
#include <swatrset.hxx>
#endif
#ifndef _TOXE_HXX
#include <toxe.hxx>             // enums
#endif
#ifndef _REDLENUM_HXX
#include <redlenum.hxx>         // enums
#endif
#ifndef _BKMRKE_HXX
#include <bkmrke.hxx>
#endif
#ifndef _FLYENUM_HXX
#include <flyenum.hxx>
#endif
#ifndef _ITABENUM_HXX
#include <itabenum.hxx>
#endif

#ifndef _COM_SUN_STAR_LINGUISTIC_XSPELLCHECKER1_HPP_
#include <com/sun/star/linguistic/XSpellChecker1.hpp>
#endif
#ifndef _COM_SUN_STAR_LINGUISTIC_XHYPHENATEDWORD_HPP_
#include <com/sun/star/linguistic/XHyphenatedWord.hpp>
#endif

class SwExtTextInput;
class DateTime;
class EditFieldInfo;
class JobSetup;
class Color;
class KeyCode;
class Outliner;
class OutputDevice;
class Point;
class SbxArray;
class SdrModel;
class SdrObject;
class SdrUndoAction;
class SfxDocumentInfo;
class SfxPrinter;
class SvData;
class SvEmbeddedObjectRef;
class SvNumberFormatter;
class SvPersist;
class SvPseudoObject;
class SvStorage;
class SvStrings;
class SvStringsSort;
class SvUShorts;
class SvUShortsSort;
class SvxAutoCorrDoc;
class SvxLinkManager;
class SvxMacro;
class SvxMacroTableDtor;
class SvxBorderLine;
class SwAutoCompleteWord;
class SwAutoCorrExceptWord;
class SwBookmark;
class SwBookmarks;
class SwCalc;
class SwCellFrm;
class SwCharFmt;
class SwCharFmts;
class SwClient;
class SwConditionTxtFmtColl;
class SwCrsrShell;
class SwCursor;
class SwDBNameInfField;
class SwDocShell;
class SwDocUpdtFld;
class SwDrawFrmFmt;
class SwDrawView;
class SwEditShell;
class SwFieldType;
class SwFldTypes;
class SwFlyFrm;
class SwFlyFrmFmt;
class SwFmt;
class SwFmtCol;
class SwFmtINetFmt;
class SwFmtRefMark;
class SwFrmFmt;
class SwFrmFmts;
class SwFtnIdxs;
class SwFtnInfo;
class SwEndNoteInfo;
class SwGrfFmtColl;
class SwGrfFmtColls;
class SwLineNumberInfo;
class SwNewDBMgr;
class SwNoTxtNode;
class SwNodeIndex;
class SwNodeRange;
class SwNumRule;
class SwNumRuleTbl;
class SwPageDesc;
class SwPosFlyFrms;
class SwPagePreViewPrtData;
class SwRedline;
class SwRedlineTbl;
class SwRootFrm;
class SwSectionFmt;
class SwSectionFmts;
class SwSelBoxes;
class SwSpzFrmFmts;
class SwTOXBase;
class SwTOXBaseSection;
class SwTOXMark;
class SwTOXMarks;
class SwTOXType;
class SwTOXTypes;
class SwTabCols;
class SwTable;
class SwTableAutoFmt;
class SwTableBox;
class SwTableBoxFmt;
class SwTableFmt;
class SwTableLineFmt;
class SwTableNode;
class SwTextBlocks;
class SwTxtFld;
class SwTxtFmtColl;
class SwTxtFmtColls;
class SwURLStateChanged;
class SwUndo;
class SwUndoIds;
class SwUndoIter;
class SwUndos;
class SwUnoCrsr;
class SwUnoCrsrTbl;
class ViewShell;
class _SetGetExpFld;
class SwDrawContact;
class SwLayouter;
class SdrView;
class SdrMarkList;
class SwAuthEntry;
class SwUnoCallBack;
struct SwCallMouseEvent;
struct SwDocStat;
struct SwHash;
struct SwSortOptions;
struct SwDefTOXBase_Impl;

//PageDescriptor-Schnittstelle, Array hier wegen inlines.
typedef SwPageDesc* SwPageDescPtr;
SV_DECL_PTRARR_DEL( SwPageDescs, SwPageDescPtr, 4, 4 );

enum SwMoveFlags
{
   DOC_MOVEDEFAULT      = 0x00,
   DOC_MOVEALLFLYS      = 0x01,
   DOC_CREATEUNDOOBJ    = 0x02,
   DOC_MOVEREDLINES     = 0x04
};

#define DUMMY_PARASPACEMAX          0x04
#define DUMMY_PARASPACEMAX_AT_PAGES 0x20


#define SW_HYPH_ERROR       0
#define SW_HYPH_OK          1
#define SW_HYPH_ABORTED     2
#define SW_HYPH_CONTINUE    3

class SwDoc
{
    friend class SwReader;    // fuers Undo von Insert(SwDoc)
    friend class SwSwgReader; // Zugriff auf bDtor-Flag (wg. Loeschen v.Frames)
    friend class Sw3IoImp;    // Zugriff u.a. auf den Drawing Layer
    friend class SwCompareData; // fuers Undo vom CompareDoc

    friend void _InitCore();
    friend void _FinitCore();

    //Fuer das Loeschen der Header-/Footer-Formate
    //Implementierung und Benutzung in frmatr.cxx
    friend void DelHFFormat( SwClient *, SwFrmFmt * );

#if !( defined(PRODUCT) || defined(MAC) || defined(PM2) )
    friend class SwUndoWriter;  // fuers Schreiben der Undo/Redo-History
#endif

    //---------------- private Member --------------------------------

    // -------------------------------------------------------------------
    // die Objecte
    SwNodes     aNodes;                 // Inhalt des Dokumentes
    SwNodes     aUndoNodes;             // Inhalt fuer das Undo
    SwAttrPool  aAttrPool;              // der Attribut Pool
    SwPageDescs aPageDescs;             // PageDescriptoren
    Link        aOle2Link;              // OLE 2.0-Benachrichtigung
    AutoTimer   aIdleTimer;             // der eigene IdleTimer
    Timer       aChartTimer;            // der Timer fuers Update aller Charts
    Timer       aOLEModifiedTimer;      // Timer for update modified OLE-Objecs
    String      aDBName;                // logischer Datenbankname
    String      sSectionPasswd;         // Passwort fuer geschuetzte Bereiche
    String      sTOIAutoMarkURL;        // ::com::sun::star::util::URL of table of index AutoMark file
    SvStringsDtor aPatternNms;          // Array fuer die Namen der Dokument-Vorlagen


    // -------------------------------------------------------------------
    // die Pointer
                                //Defaultformate
    SwFrmFmt        *pDfltFrmFmt;
    SwFrmFmt        *pEmptyPageFmt;     // Format fuer die Default-Leerseite.
    SwFrmFmt        *pColumnContFmt;    // Format fuer Spaltencontainer
    SwCharFmt       *pDfltCharFmt;
    SwTxtFmtColl    *pDfltTxtFmtColl;   // Defaultformatcollections
    SwGrfFmtColl    *pDfltGrfFmtColl;

    SwFrmFmts       *pFrmFmtTbl;        // Formattabellen
    SwCharFmts      *pCharFmtTbl;
    SwSpzFrmFmts    *pSpzFrmFmtTbl;
    SwSectionFmts   *pSectionFmtTbl;
    SwFrmFmts       *pTblFrmFmtTbl;     // spz. fuer Tabellen
    SwTxtFmtColls   *pTxtFmtCollTbl;    // FormatCollections
    SwGrfFmtColls   *pGrfFmtCollTbl;

    SwBookmarks     *pBookmarkTbl;      //Bookmarks

    SwTOXTypes      *pTOXTypes;         // Verzeichnisse
    SwDefTOXBase_Impl * pDefTOXBases;   // defaults of SwTOXBase's

    SwRootFrm       *pLayout;           // Rootframe des spezifischen Layouts.
    SdrModel        *pDrawModel;        // StarView Drawing

    SwUndos         *pUndos;            // Undo/Redo History

    SwDocUpdtFld    *pUpdtFlds;         // Struktur zum Field-Update
    SwFldTypes      *pFldTypes;         // Feldtypen
    SwNewDBMgr      *pNewDBMgr;         // Pointer auf den neuen DBMgr fuer
                                        // Evaluierung der DB-Fields
    SfxPrinter      *pPrt;

    SwDoc           *pGlossaryDoc;      // Pointer auf das Glossary-Dokument. Dieses

    SwNumRule       *pOutlineRule;
    SwFtnInfo       *pFtnInfo;
    SwEndNoteInfo   *pEndNoteInfo;
    SwLineNumberInfo *pLineNumberInfo;
    SwFtnIdxs       *pFtnIdxs;
    SwDocStat       *pDocStat;          // Statistic Informationen
    SfxDocumentInfo *pSwgInfo;          // Dokumentinformationen
    SvxMacroTableDtor *pMacroTable;     // Tabelle der dokumentglobalen Macros

    SwDocShell      *pDocShell;         // Ptr auf die SfxDocShell vom Doc
    SvEmbeddedObjectRef* pDocShRef;     // fuers Kopieren von OLE-Nodes (wenn keine
                                        // DocShell gesetzt ist, muss dieser
                                        // Ref-Pointer gesetzt sein!!!!)
    SvxLinkManager  *pLinkMgr;          // Liste von Verknuepften (Grafiken/DDE/OLE)

    SwAutoCorrExceptWord *pACEWord;     // fuer die automatische Uebernahme von
                                        // autokorrigierten Woertern, die "zurueck"
                                        // verbessert werden
    SwURLStateChanged *pURLStateChgd;   // SfxClient fuer Aenderungen in der
                                        // INetHistory
    SvNumberFormatter *pNumberFormatter;    // NumFormatter fuer die Tabellen/Felder
    SwNumRuleTbl    *pNumRuleTbl;           // Liste aller benannten NumRules
    SwRedlineTbl    *pRedlineTbl;           // Liste aller Redlines
    String          *pAutoFmtRedlnComment;  // Kommentar fuer Redlines, die
                                        // uebers Autoformat eingefuegt werden
    SwUnoCrsrTbl    *pUnoCrsrTbl;

    SwPagePreViewPrtData *pPgPViewPrtData;      // Einzuege/Abstaende fuers
                                        // Drucken der Seitenansicht
    SwPaM           *pExtInputRing;

    SwLayouter      *pLayouter;     // ::com::sun::star::frame::Controller for complex layout formatting
                                    // like footnote/endnote in sections

    SwUnoCallBack   *pUnoCallBack;
    // -------------------------------------------------------------------
    // sonstige
    sal_uInt16  nUndoPos;               // akt. Undo-InsertPosition (fuers Redo!)
    sal_uInt16  nUndoSavePos;           // Position im Undo-Array, ab der das Doc
                                    // nicht als modifiziert gilt
    sal_uInt16  nUndoCnt;               // Anzahl von Undo Aktionen
    sal_uInt16  nUndoSttEnd;            // != 0 -> innerhalb einer Klammerung

    sal_uInt16 nAutoFmtRedlnCommentNo;  // SeqNo fuers UI-seitige zusammenfassen
                                    // von AutoFmt-Redlines. Wird vom SwAutoFmt
                                    // verwaltet!
    sal_uInt16  nLinkUpdMode;           // UpdateMode fuer Links
    sal_uInt16  nFldUpdMode;            // Mode fuer Felder/Charts automatisch aktualisieren

    SwRedlineMode eRedlineMode;     // aktueller Redline Modus

    sal_Int8    nLinkCt;            // wieviele kennen das Dokument
    sal_Int8    nLockExpFld;        // Wenn != 0 hat UpdateExpFlds() keine Wirkung

    sal_Int8    nHeaven;            // LayerIds, Heaven == ueber dem Dokument
    sal_Int8    nHell;              //           Hell   == unter dem Dokument
    sal_Int8    nControls;          //           Controls == ganz oben

    sal_Bool    bGlossDoc       : 1;    //TRUE: ist ein Textbaustein Dokument
    sal_Bool    bModified       : 1;    //TRUE: Dokument ist veraendert
    sal_Bool    bDtor           : 1;    //TRUE: ist im SwDoc DTOR
                                        // leider auch temporaer von
                                        // SwSwgReader::InLayout(), wenn fehlerhafte
                                        //Frames geloescht werden muessen
    sal_Bool    bUndo           : 1;    // TRUE: Undo eingeschaltet
    sal_Bool    bGroupUndo      : 1;    // TRUE: Undos werden gruppiert
    sal_Bool    bPageNums       : 1;    // TRUE: es gibt virtuelle Seitennummern
    sal_Bool    bLoaded         : 1;    // TRUE: ein geladenes Doc
    sal_Bool    bUpdateExpFld   : 1;    // TRUE: Expression-Felder updaten
    sal_Bool    bNewDoc         : 1;    // TRUE: neues Doc
    sal_Bool    bNewFldLst      : 1;    // TRUE: Felder-Liste neu aufbauen
    sal_Bool    bCopyIsMove     : 1;    // TRUE: Copy ist ein verstecktes Move
    sal_Bool    bNoDrawUndoObj  : 1;    // TRUE: keine DrawUndoObjecte speichern
    sal_Bool    bVisibleLinks   : 1;    // TRUE: Links werden sichtbar eingefuegt
    sal_Bool    bBrowseMode     : 1;    // TRUE: Dokument im BrowseModus anzeigen
    sal_Bool    bInReading      : 1;    // TRUE: Dokument wird gerade gelesen
    sal_Bool    bUpdateTOX      : 1;    // TRUE: nach Dokument laden die TOX Updaten
    sal_Bool    bInLoadAsynchron: 1;    // TRUE: Dokument wird gerade asynchron geladen
    sal_Bool    bHTMLMode       : 1;    // TRUE: Dokument ist im HTMLMode
    sal_Bool    bHeadInBrowse   : 1;    // TRUE: Header sind im BrowseMode aktiviert
    sal_Bool    bFootInBrowse   : 1;    // TRUE: Footer sind im BrowseMode aktiviert
    sal_Bool    bFrmBeepEnabled : 1;    // TRUE: Frames beepen wenn der Inhalt zu gross wird
    sal_Bool    bInCallModified : 1;    // TRUE: im Set/Reset-Modified Link
    sal_Bool    bIsGlobalDoc    : 1;    // TRUE: es ist ein GlobalDokument
    sal_Bool    bGlblDocSaveLinks : 1;  // TRUE: im GlobalDoc. gelinkte Sect. mit speichern
    sal_Bool    bIsLabelDoc     : 1;    // TRUE: es ist ein Etiketten-Dokument
    sal_Bool    bIsAutoFmtRedline : 1;  // TRUE: die Redlines werden vom Autoformat aufgezeichnet
    sal_Bool    bOLEPrtNotifyPending:1; // TRUE: Printer  ist geaendert und beim
                                    //       Erzeugen der ::com::sun::star::sdbcx::View ist eine Benachrichtigung
                                    //       der OLE-Objekte PrtOLENotify() notwendig.
    sal_Bool    bAllOLENotify       :1; // True: Benachrichtigung aller Objekte ist notwendig
    sal_Bool    bIsRedlineMove : 1;     // True: die Redlines werden in/aus der Section verschoben
    sal_Bool    bInsOnlyTxtGlssry : 1;  // True: insert 'only text' glossary into doc
    sal_Bool    bContains_MSVBasic : 1; // True: MS-VBasic exist is in our storage
    sal_Bool    bPurgeOLE : 1;          // TRUE: Purge OLE-Objects

    // -------------------------------------------------------------------
    // static - Members
    static SvStringsDtor    *pTextNmArray,          // Array fuer alle
                            *pListsNmArray,         // Pool-Vorlagen-Namen
                            *pExtraNmArray,
                            *pRegisterNmArray,
                            *pDocNmArray,
                            *pHTMLNmArray;
    static SvStringsDtor    *pFrmFmtNmArray,
                            *pChrFmtNmArray,
                            *pHTMLChrFmtNmArray;
    static SvStringsDtor    *pPageDescNmArray;
    static SvStringsDtor    *pNumRuleNmArray;

    static SwAutoCompleteWord *pACmpltWords;    // Liste aller Worte fuers AutoComplete
    static sal_uInt16 nUndoActions;     // anzahl von Undo ::com::sun::star::chaos::Action

    // -------------------------------------------------------------------
    // Dummies Members fuers FileFormat
    String sDummy1;             // Dummy-Member.
    String sDummy2;
    sal_uInt32  n32Dummy1;
    sal_uInt32  n32Dummy2;
    sal_Int8   n8Dummy1;
    sal_Int8   n8Dummy2;


    //---------------- private Methoden ------------------------------

    void AppendUndo(SwUndo*);   // interne Verkuerzung fuer Insert am Ende
    void ClearRedo();           // loescht alle UndoObjecte von nUndoPos
                                // bis zum Ende des Undo-Arrays
    sal_Bool DelUndoObj( sal_uInt16 nEnde  );   // loescht alle UndoObjecte vom Anfang
                                        // bis zum angegebenen Ende
    DECL_LINK( AddDrawUndo, SdrUndoAction * );
                                        // DrawModel
    void DrawNotifyUndoHdl();   // wegen CLOOKs
    void DrawSetRefDevice();    // wegen CLOOKs

        // nur fuer den internen Gebrauch deshalb privat.
        // Kopieren eines Bereiches im oder in ein anderes Dokument !
        // Die Position darf nicht im Bereich liegen !!
    sal_Bool _Copy( SwPaM&, SwPosition&,
                sal_Bool MakeNewFrms = sal_True, SwPaM* pCpyRng = 0 ) const;    // in ndcopy.cxx

    SwFlyFrmFmt* _MakeFlySection( const SwPosition& rAnchPos,
                                const SwCntntNode& rNode, RndStdIds eRequestId,
                                const SfxItemSet* pFlyAttrSet,
                                SwFrmFmt* = 0 );

    SwFlyFrmFmt* _InsNoTxtNode( const SwPosition&rPos, SwNoTxtNode*,
                                const SfxItemSet* pFlyAttrSet,
                                const SfxItemSet* pGrfAttrSet,
                                SwFrmFmt* = 0 );

    void _CopyFlyInFly( const SwNodeRange& rRg, const SwNodeIndex& rSttIdx,
                        sal_Bool bCopyFlyAtFly = sal_False ) const; // steht im ndcopy.cxx
    sal_Bool SetFlyFrmAnchor( SwFrmFmt& rFlyFmt, SfxItemSet& rSet, sal_Bool bNewFrms );

    typedef SwFmt* (SwDoc:: *FNCopyFmt)( const String&, SwFmt* );
    SwFmt* CopyFmt( const SwFmt& rFmt, const SvPtrarr& rFmtArr,
                        FNCopyFmt fnCopyFmt, const SwFmt& rDfltFmt );
    void CopyFmtArr( const SvPtrarr& rSourceArr, SvPtrarr& rDestArr,
                        FNCopyFmt fnCopyFmt, SwFmt& rDfltFmt );
    void _CopyPageDescHeaderFooter( sal_Bool bCpyHeader,
                                const SwFrmFmt& rSrcFmt, SwFrmFmt& rDestFmt );
    SwFmt* FindFmtByName( const SvPtrarr& rFmtArr,
                                    const String& rName ) const;
    SfxPrinter* _GetPrt() const;
    void        PrtDataChanged();   //Printer oder JobSetup geandert, es muss
                                    //fuer entsprechende Invalidierungen und
                                    //Benachrichtigungen gesorgt werden.

    static SvStringsDtor* NewNmArray( SvStringsDtor*&, sal_uInt16 nStt, sal_uInt16 nEnd );
    SvStringsDtor* NewTextNmArray() const;
    SvStringsDtor* NewListsNmArray() const;
    SvStringsDtor* NewExtraNmArray() const;
    SvStringsDtor* NewRegisterNmArray() const;
    SvStringsDtor* NewDocNmArray() const;
    SvStringsDtor* NewHTMLNmArray() const;
    SvStringsDtor* NewFrmFmtNmArray() const;
    SvStringsDtor* NewChrFmtNmArray() const;
    SvStringsDtor* NewHTMLChrFmtNmArray() const;
    SvStringsDtor* NewPageDescNmArray() const;
    SvStringsDtor* NewNumRuleNmArray() const;


    // gcc: aFtnInfo::CopyCtor ist private, also muessen wir uns auch schuetzen
    SwDoc( const SwDoc &);

    //wird nur von SwSwgReader::InlayoutFrames() verwendet!
    inline void SetInDtor( sal_Bool b ) { bDtor = b; }

    // fuer Felder:
    void _InitFieldTypes();     // wird vom CTOR gerufen!!
    void _MakeFldList( int eMode );
    void RenameUserFld( const String& rOldName, const String& rNewName,
                        String& rFormel );
    // Datenbankfelder:
    void UpdateDBNumFlds( SwDBNameInfField& rDBFld, SwCalc& rCalc );
    void AddUsedDBToList( SvStringsDtor& rDBNameList,
                          const SvStringsDtor& rUsedDBNames );
    void AddUsedDBToList( SvStringsDtor& rDBNameList, const String& rDBName );
    sal_Bool IsNameInArray( const SvStringsDtor& rOldNames, const String& rName );
    void GetAllDBNames( SvStringsDtor& rAllDBNames );
    void ReplaceUsedDBs( const SvStringsDtor& rUsedDBNames,
                        const String& rNewName, String& rFormel );
    SvStringsDtor& FindUsedDBs( const SvStringsDtor& rAllDBNames,
                                const String& rFormel,
                                SvStringsDtor& rUsedDBNames );

    void InitDrawModel();
    void ReleaseDrawModel();

    void _CreateNumberFormatter();

    sal_Bool _UnProtectTblCells( SwTable& rTbl );

    // erzeuge Anhand der vorgebenen Collection Teildokumente
    // falls keine angegeben ist, nehme die Kapitelvorlage der 1. Ebene
    sal_Bool SplitDoc( sal_uInt16 eDocType, const String& rPath,
                        const SwTxtFmtColl* pSplitColl );

    // Charts der angegebenen Tabelle updaten
    void _UpdateCharts( const SwTable& rTbl, ViewShell& rVSh ) const;

    // unser eigener 'IdlTimer' ruft folgende Methode
    DECL_LINK( DoIdleJobs, Timer * );
    // der CharTimer ruft diese Methode
    DECL_LINK( DoUpdateAllCharts, Timer * );
    DECL_LINK( DoUpdateModifiedOLE, Timer * );

public:
    SwDoc();
    ~SwDoc();

          SwNodes& GetNodes()                   { return aNodes; }
    const SwNodes& GetNodes() const             { return aNodes; }

    DECL_STATIC_LINK( SwDoc, BackgroundDone, SvxBrushItem *);
    DECL_LINK(CalcFieldValueHdl, EditFieldInfo*);

    // Links un-/sichtbar in LinkManager einfuegen (gelinkte Bereiche)
    sal_Bool IsVisibleLinks() const                  { return bVisibleLinks; }
    void SetVisibleLinks( sal_Bool bFlag )           { bVisibleLinks = bFlag; }

          SvxLinkManager& GetLinkManager()       { return *pLinkMgr; }
    const SvxLinkManager& GetLinkManager() const { return *pLinkMgr; }

        // erfrage das spezifische Layout
    const SwRootFrm* GetRootFrm() const { return pLayout; }
          SwRootFrm* GetRootFrm()       { return pLayout; }
        // der alte muss !! von der Shell geloescht werden !!
    void SetRootFrm( SwRootFrm* pNew )  { pLayout = pNew; }

    void StartIdleTimer()               { aIdleTimer.Start(); }
    void StopIdleTimer()                { aIdleTimer.Stop();  }
    sal_Bool IsIdleTimerActive() const  { return aIdleTimer.IsActive(); }

    sal_Bool IsOLEPrtNotifyPending() const  { return bOLEPrtNotifyPending; }
    void SetOLEPrtNotifyPending()       { bOLEPrtNotifyPending = sal_True; }
    void PrtOLENotify( sal_Bool bAll ); //Alle oder nur Markierte

    sal_Bool IsPurgeOLE() const             { return bPurgeOLE; }
    void SetPurgeOLE( sal_Bool bFlag )      { bPurgeOLE = bFlag; }

        // das Dokument im Browse-Modus anzeigen
    void SetBrowseMode( sal_Bool bFlag = sal_True )     { bBrowseMode = bFlag; }
    sal_Bool IsBrowseMode() const                       { return bBrowseMode; }
    void SetHTMLMode( sal_Bool bFlag = sal_True )       { bHTMLMode = bFlag; }
    sal_Bool IsHTMLMode() const                         { return bHTMLMode; }
    void SetHeadInBrowse( sal_Bool bFlag = sal_True )   { bHeadInBrowse = bFlag; }
    sal_Bool IsHeadInBrowse() const                     { return bHeadInBrowse; }
    void SetFootInBrowse( sal_Bool bFlag = sal_True )   { bFootInBrowse = bFlag; }
    sal_Bool IsFootInBrowse() const                     { return bFootInBrowse; }
    void SetFrmBeepEnabled( sal_Bool bFlag = sal_True ) { bFrmBeepEnabled = bFlag; }
    sal_Bool IsFrmBeepEnabled() const                   { return bFrmBeepEnabled; }

    void SetGlobalDoc( sal_Bool bFlag = sal_True )      { bIsGlobalDoc = bFlag; }
    sal_Bool IsGlobalDoc() const                        { return bIsGlobalDoc; }
    void SetGlblDocSaveLinks( sal_Bool bFlag=sal_True ) { bGlblDocSaveLinks = bFlag; }
    sal_Bool IsGlblDocSaveLinks() const                 { return bGlblDocSaveLinks; }

    void SetLabelDoc( sal_Bool bFlag = sal_True )       { bIsLabelDoc = bFlag; }
    sal_Bool IsLabelDoc() const                         { return bIsLabelDoc; }

    sal_uInt16 GetLinkUpdMode() const;
    void SetLinkUpdMode( sal_uInt16 nMode )             { nLinkUpdMode = nMode; }
    // nur fuer den Writer, weil dieser das richtige Enum schreiben muss!
    sal_uInt16 _GetLinkUpdMode() const                  { return nLinkUpdMode; }

    inline sal_Bool IsInDtor() const { return bDtor; }

    // SS fuer das Drawing, Model und LayerId's
    const SdrModel* GetDrawModel() const    { return pDrawModel; }
          SdrModel* GetDrawModel()          { return pDrawModel; }
    sal_Int8 GetHeavenId() const            { return nHeaven; }
    sal_Int8 GetHellId() const              { return nHell;   }
    sal_Int8 GetControlsId() const          { return nControls;   }

    // liefert zu allen fliegenden Rahmen die Position im Dokument.
    // Wird ein Pam-Pointer uebergeben, muessen die absatzgebundenen
    // FlyFrames von der ::com::sun::star::awt::Selection vollstaendig umschlossen sein
    // ( Start < Pos < End ) !!!
    // (wird fuer die Writer benoetigt)
    void GetAllFlyFmts( SwPosFlyFrms& rPosFlyFmts, const SwPaM* = 0,
                        sal_Bool bDrawAlso = sal_False ) const;

        // dokumentglobale Macros
    sal_Bool HasGlobalMacro(sal_uInt16 nEvent) const;
    const SvxMacro& GetGlobalMacro(sal_uInt16 nEvent) const;
    void SetGlobalMacro(sal_uInt16 nEvent, const SvxMacro&);
    sal_Bool DelGlobalMacro(sal_uInt16 nEvent);
    const SvxMacroTableDtor& GetMacroTable() const { return *pMacroTable; }

    // Fussnoten Informationen
    const SwFtnInfo& GetFtnInfo() const         { return *pFtnInfo; }
    void SetFtnInfo(const SwFtnInfo& rInfo);
    const SwEndNoteInfo& GetEndNoteInfo() const { return *pEndNoteInfo; }
    void SetEndNoteInfo(const SwEndNoteInfo& rInfo);

    // Zeilennummerierung
    const SwLineNumberInfo& GetLineNumberInfo() const { return *pLineNumberInfo; }
    void SetLineNumberInfo(const SwLineNumberInfo& rInfo);

          SwFtnIdxs& GetFtnIdxs()       { return *pFtnIdxs; }
    const SwFtnIdxs& GetFtnIdxs() const { return *pFtnIdxs; }
    // Fussnoten im Bereich aendern
    sal_Bool SetCurFtn( const SwPaM& rPam, const String& rNumStr,
                        sal_uInt16 nNumber, sal_Bool bIsEndNote );

    // wegen swrtf.cxx und define private public, jetzt hier
    SwFlyFrmFmt  *MakeFlyFrmFmt (const String &rFmtName, SwFrmFmt *pDerivedFrom);
    SwDrawFrmFmt *MakeDrawFrmFmt(const String &rFmtName, SwFrmFmt *pDerivedFrom);

          SwLayouter* GetLayouter()       { return pLayouter; }
    const SwLayouter* GetLayouter() const { return pLayouter; }
    void SetLayouter( SwLayouter* pNew )  { pLayouter = pNew; }

    ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >
            Spell(SwPaM&, ::com::sun::star::uno::Reference<
                    ::com::sun::star::linguistic::XSpellChecker1 > &,
                    sal_uInt16* pPageCnt, sal_uInt16* pPageSt ) const;
    ::com::sun::star::uno::Reference< ::com::sun::star::linguistic::XHyphenatedWord >
        Hyphenate( SwPaM *pPam, const Point &rCrsrPos,
                       sal_uInt16* pPageCnt, sal_uInt16* pPageSt );

    const SwBookmarks& GetBookmarks() const { return *pBookmarkTbl; }
    SwBookmark* MakeBookmark( const SwPaM& rPaM, const KeyCode&,
            const String& rName, const String& rShortName, BOOKMARK_TYPE eMark = BOOKMARK);
    void DelBookmark( sal_uInt16 nPos );
    void DelBookmark( const String& rName );
    sal_uInt16 FindBookmark( const String& rName );
        // erzeugt einen eindeutigen Namen. Der Name selbst muss vorgegeben
        // werden, es wird dann bei gleichen Namen nur durchnumeriert.
    void MakeUniqueBookmarkName( String& rNm );
    // Anzahl der ::com::sun::star::text::Bookmarks, gfs. nur "echte"
    sal_uInt16 GetBookmarkCnt(sal_Bool bBkmrk = sal_False) const;
    SwBookmark& GetBookmark( sal_uInt16, sal_Bool bBkmrk = sal_False);

    // Textbaustein Dokument?
    void SetGlossDoc( sal_Bool bGlssDc = sal_True ) { bGlossDoc = bGlssDc; }
    sal_Bool IsGlossDoc() const                 { return bGlossDoc; }
    sal_Bool IsInsOnlyTextGlossary() const      { return bInsOnlyTxtGlssry; }

    //Bei Formataenderungen muss das zu Fuss gerufen werden!
    void SetModified();
    void ResetModified();
    sal_Bool IsModified() const { return bModified; }   //Dokumentaenderungen?

    sal_Bool IsInCallModified() const       { return bInCallModified; }
    void SetUndoNoResetModified()       { nUndoSavePos = USHRT_MAX; }
    sal_Bool IsUndoNoResetModified() const  { return USHRT_MAX == nUndoSavePos; }

        //Die neuen (hoffentlich bestaendigen) Schnittstellen fuer alles,
        //was mit dem Layout zu tun hat.
    SwFrmFmt *MakeLayoutFmt( RndStdIds eRequest,
                             SwFrmFmt* = 0,
                             const SfxItemSet* pSet = 0 );
        // JP 08.05.98: fuer Flys muss jetzt diese Schnittstelle benutzt
        //              werden. pAnchorPos muss gesetzt sein, wenn keine
        //              Seitenbindung vorliegt UND der ::com::sun::star::chaos::Anchor nicht schon
        //              im FlySet/FrmFmt mit gueltiger CntntPos gesetzt ist
    SwFlyFrmFmt* MakeFlySection( RndStdIds eAnchorType,
                                const SwPosition* pAnchorPos,
                                const SfxItemSet* pSet = 0,
                                SwFrmFmt *pParent = 0 );
    SwFlyFrmFmt* MakeFlyAndMove( const SwPaM& rPam, const SfxItemSet& rSet,
                                const SwSelBoxes* pSelBoxes = 0,
                                SwFrmFmt *pParent = 0 );

    void      DelLayoutFmt( SwFrmFmt *pFmt );
    SwFrmFmt *CopyLayoutFmt( const SwFrmFmt& rSrc,
                            const SwFmtAnchor& rNewAnchor,
                            sal_Bool bSetTxtFlyAtt = sal_True, sal_Bool bMakeFrms = sal_True );
    void CopyWithFlyInFly( const SwNodeRange& rRg,
                            const SwNodeIndex& rInsPos,
                            sal_Bool bMakeNewFrms = sal_True,
                            sal_Bool bDelRedlines = sal_True,
                            sal_Bool bCopyFlyAtFly = sal_False ) const;
    sal_Bool IsInHeaderFooter( const SwNodeIndex& rIdx ) const;

    sal_Bool SetFlyFrmAttr( SwFrmFmt& rFlyFmt, SfxItemSet& rSet );
    sal_Bool SetFrmFmtToFly( SwFrmFmt& rFlyFmt, SwFrmFmt& rNewFmt,
                        SfxItemSet* pSet = 0, sal_Bool bKeepOrient = sal_False );

    // Abstakt fuellen
    void Summary( SwDoc* pExtDoc, sal_uInt8 nLevel, sal_uInt8 nPara, sal_Bool bImpress );

    /* Verwaltet SwDoc::nLinkCt, sollte (paarig!) von allen benutzt werden,
     * die einen Pointer auf dieses Dokument halten, denn wenn Remove() 0
     * liefert, wird das Dokument zerstoert! Oder anders: Jeder bei dem
     * Remove() 0 liefert, muss das Dokument zerstoeren.
     */
    sal_Int8 AddLink()                  { return nLinkCt++; }
    sal_Int8 RemoveLink()               { return nLinkCt ? --nLinkCt : nLinkCt; }
    sal_Int8 GetLinkCnt() const         { return nLinkCt; }

        // UndoHistory am Dokument pflegen
        // bei Save, SaveAs, Create wird UndoHistory zurueckgesetzt ???
    void DoUndo(sal_Bool bUn = sal_True) { bUndo = bUn; }
    sal_Bool DoesUndo() const { return bUndo; }
        // Zusammenfassen von Kontinuierlichen Insert/Delete/Overwrite von
        // Charaktern. Default ist ::com::sun::star::sdbcx::Group-Undo.
    void DoGroupUndo(sal_Bool bUn = sal_True) { bGroupUndo = bUn; }
    sal_Bool DoesGroupUndo() const { return bGroupUndo; }

        // macht rueckgaengig:
        // 0 letzte Aktion, sonst Aktionen bis zum Start der Klammerung nUndoId
        // In rUndoRange wird der restaurierte Bereich gesetzt.
    sal_Bool Undo( SwUndoIter& );
        // setzt Undoklammerung auf, nUndoId kommt von der UI-Seite
    sal_uInt16 StartUndo( sal_uInt16 nUndoId = 0 );
        // schliesst Klammerung der nUndoId
    sal_uInt16 EndUndo( sal_uInt16 nUndoId = 0 );
        // loescht die gesamten UndoObjecte ( fuer Methoden die am Nodes
        // Array drehen ohne entsprechendes Undo !!)
    void DelAllUndoObj();
        // liefert die Id der letzten undofaehigen Aktion zurueck
        // oder USHRT_MAX
        // fuellt ggf. VARARR mit ::com::sun::star::sdbcx::User-UndoIds
    sal_uInt16 GetUndoIds( String* pStr = 0, SwUndoIds *pUndoIds = 0) const;
        // gibt es Klammerung mit der Id?
    sal_Bool HasUndoId(sal_uInt16 nId) const;
        // die drei folgenden Methoden werden beim Undo und nur dort
        // benoetigt. Sollten sonst nicht aufgerufen werden.
    const SwNodes* GetUndoNds() const { return &aUndoNodes; }

        // bei einstufigem Undo muss die History und das Undo-Array geloescht
        // werden. Dabei ist aber zu beachten, das nur vollstaendige Gruppen
        // geloescht werden koennen.
        // Sind beide FLAGS auf sal_False, kann erfragt werden, ob sich in der
        // History eine offene Gruppe befindet. ( return = sal_True )
        // bDelHisory = sal_True:   loesche die Undo-History
        // bDelUndoNds = sal_True: loesche das Undo-Nodes-Arary
    sal_Bool DelUndoGroups( sal_Bool bDelUndoNds=sal_True, sal_Bool bDelHistory=sal_True );
    SwUndo* RemoveLastUndo( sal_uInt16 nUndoId );

        // abfragen/setzen der Anzahl von wiederherstellbaren Undo-Actions
    static sal_uInt16 GetUndoActionCount()              { return nUndoActions; }
    static void SetUndoActionCount( sal_uInt16 nNew )   { nUndoActions = nNew; }

        // Redo
        // wiederholt
    sal_Bool Redo( SwUndoIter& );
        // liefert die Id der letzten Redofaehigen Aktion zurueck
        // fuellt ggf. VARARR mit RedoIds
    sal_uInt16 GetRedoIds( String* pStr = 0, SwUndoIds *pRedoIds = 0) const;

        // Repeat
        // wiederholt
    sal_Bool Repeat( SwUndoIter&, sal_uInt16 nRepeatCnt = 1 );
        // liefert die Id der letzten Repeatfaehigen Aktion zurueck
        // fuellt ggf. VARARR mit RedoIds
    sal_uInt16 GetRepeatIds( String* pStr = 0, SwUndoIds *pRedoIds = 0) const;

    /* Felder */
    const SwFldTypes *GetFldTypes() const { return pFldTypes; }
    SwFieldType *InsertFldType(const SwFieldType &);
    SwFieldType *GetSysFldType( const sal_uInt16 eWhich ) const;
    SwFieldType* GetFldType(sal_uInt16 nResId, const String& rName) const;
    void RemoveFldType(sal_uInt16 nFld);
    void UpdateFlds( SfxPoolItem* pNewHt = 0, sal_Bool bCloseDB = sal_False );
    void InsDeletedFldType( SwFieldType & );
    sal_Bool RenameUserFields(const String& rOldName, const String& rNewName);

        // rufe das Update der Expression Felder auf; alle Ausdruecke werden
        // neu berechnet.
    void UpdateRefFlds( SfxPoolItem* pHt = 0);
    void UpdateTblFlds( SfxPoolItem* pHt = 0);
    void UpdateExpFlds( SwTxtFld* pFld = 0, sal_Bool bUpdateRefFlds = sal_True );
    void UpdateUsrFlds();
    void UpdatePageFlds( SfxPoolItem* );
    void LockExpFlds()                  { ++nLockExpFld; }
    void UnlockExpFlds()                { if( nLockExpFld ) --nLockExpFld; }
    sal_Bool IsExpFldsLocked() const        { return 0 != nLockExpFld; }
    SwDocUpdtFld& GetUpdtFlds() const   { return *pUpdtFlds; }
    sal_Bool SetFieldsDirty( sal_Bool b, const SwNode* pChk = 0, sal_uInt32 nLen = 0 );

    void SetFixFields( sal_Bool bOnlyTimeDate = sal_False,
                        const DateTime* pNewDateTime = 0 );

    sal_uInt16 GetFldUpdateFlags() const;
    void SetFldUpdateFlags( sal_uInt16 eMode )          { nFldUpdMode = eMode; }
    // nur fuer den Writer, weil dieser das richtige Enum schreiben muss!
    sal_uInt16 _GetFldUpdateFlags() const               { return nFldUpdMode; }

    void ChangeAuthorityData(const SwAuthEntry* pNewData);

    // Zustaende ueber Ladezustand
    // frueher DocInfo
    //
    sal_Bool IsPageNums() const                         { return bPageNums;     }
    sal_Bool IsLoaded() const                           { return bLoaded;       }
    sal_Bool IsUpdateExpFld() const                     { return bUpdateExpFld; }
    sal_Bool IsNewDoc() const                           { return bNewDoc;       }

    void SetPageNums(sal_Bool b = sal_True)                 { bPageNums = b;        }
    void SetNewDoc(sal_Bool b = sal_True)                   { bNewDoc = b;          }
    void SetUpdateExpFldStat(sal_Bool b = sal_True)         { bUpdateExpFld = b;    }
    void SetLoaded(sal_Bool b = sal_True)                   { bLoaded = b;          }

        // Setze im Calculator alle SetExpresion Felder, die bis zur
        // angegebenen Position (Node [ + ::com::sun::star::ucb::Content]) gueltig sind. Es kann
        // eine erzeugte Liste aller Felder mit uebergegeben werden.
        // (ist die Adresse != 0, und der Pointer == 0 wird eine neue
        // Liste returnt.)
    void FldsToCalc( SwCalc& rCalc, sal_uInt32 nLastNd = ULONG_MAX,
                    sal_uInt16 nLastCntnt = USHRT_MAX );
    void FldsToCalc( SwCalc& rCalc, const _SetGetExpFld& rToThisFld );
    void FldsToExpand( SwHash**& ppTbl, sal_uInt16& rTblSize,
                        const _SetGetExpFld& rToThisFld );
    sal_Bool IsNewFldLst() const { return bNewFldLst; }
    void SetNewFldLst( sal_Bool bFlag = sal_True ) { bNewFldLst = bFlag; }
    void InsDelFldInFldLst( sal_Bool bIns, const SwTxtFld& rFld );

    /*  Datenbank &&  DB-Manager */
    void SetNewDBMgr( SwNewDBMgr* pNewMgr )     { pNewDBMgr = pNewMgr; }
    SwNewDBMgr* GetNewDBMgr() const             { return pNewDBMgr; }
    void ChangeDBFields( const SvStringsDtor& rOldNames,
                        const String& rNewName );
    void SetInitDBFields(sal_Bool b);
    // Von Feldern verwendete Datenbanken herausfinden
    void GetAllUsedDB( SvStringsDtor& rDBNameList,
                       const SvStringsDtor* pAllDBNames = 0 );

    void ChgDBName( const String& rNewName );
    String GetDBName();
    const String& GetDBDesc();
    const String& _GetDBDesc() const { return aDBName; }


        // Kopieren eines Bereiches im oder in ein anderes Dokument !
        // Die Position kann auch im Bereich liegen !!
    sal_Bool Copy( SwPaM&, SwPosition& ) const; // in ndcopy.cxx

        // Loesche die Section, in der der Node steht.
    void DeleteSection( SwNode *pNode );

    sal_Bool Delete( SwPaM& );              //loeschen eines Bereiches
    sal_Bool DelFullPara( SwPaM& );         //loeschen gesamter Absaetze
    sal_Bool DeleteAndJoin( SwPaM& );       //komplett loeschen eines Bereiches

    sal_Bool Move( SwPaM&, SwPosition&, SwMoveFlags = DOC_MOVEDEFAULT ); //verschieben eines Bereiches
    sal_Bool Move( SwNodeRange&, SwNodeIndex&,
                SwMoveFlags = DOC_MOVEDEFAULT );  // verschieben ganzer Nodes
    sal_Bool MoveAndJoin( SwPaM&, SwPosition&, SwMoveFlags = DOC_MOVEDEFAULT ); //verschieben eines Bereiches
        //Ueberschreiben eines einzelnen Zeichens. rRg.Start() bezeichnet
        //den Node und die Position in dem Node, an der eingefuegt wird,
    sal_Bool Overwrite( const SwPaM &rRg, sal_Unicode c );
        //Ueberschreiben eines Strings in einem bestehenden Textnode.
    sal_Bool Overwrite(const SwPaM &rRg, const String& rStr );
        //Einfuegen eines einzelnen Zeichens. rRg.Start() bezeichnet
        //den Node und die Position in dem Node, an der eingefuegt wird.
    sal_Bool Insert(const SwPaM &rRg, sal_Unicode c );
        //Einfuegen eines Strings in einen bestehenden
        //Textnode. Der Text wird kopiert.
    sal_Bool Insert( const SwPaM &rRg, const String &,
                     sal_Bool bHintExpand = sal_True );

        //Einfuegen einer Grafik, Formel. Die XXXX werden kopiert.
    SwFlyFrmFmt* Insert(const SwPaM &rRg,
                        const String& rGrfName,
                        const String& rFltName,
                        const Graphic* pGraphic = 0,
                        const SfxItemSet* pFlyAttrSet = 0,
                        const SfxItemSet* pGrfAttrSet = 0,
                        SwFrmFmt* = 0 );
        // austauschen einer Grafik (mit Undo)
    void ReRead( SwPaM&, const String& rGrfName, const String& rFltName,
                const Graphic* pGraphic );

        //Einfuegen eines DrawObjectes. Das Object muss bereits im DrawModel
        // angemeldet sein.
    SwDrawFrmFmt* Insert( const SwPaM &rRg,
                          SdrObject& rDrawObj,
                          const SfxItemSet* pFlyAttrSet = 0,
                          SwFrmFmt* = 0 );
    String GetUniqueGrfName() const;

        //Einfuegen von OLE-Objecten.
    SwFlyFrmFmt* Insert( const SwPaM &rRg, SvInPlaceObject *,
                        const SfxItemSet* pFlyAttrSet = 0,
                        const SfxItemSet* pGrfAttrSet = 0,
                        SwFrmFmt* = 0 );
    String GetUniqueOLEName() const;

    void GrfToOle( const SwPaM &rRg, SvInPlaceObject * );
    void OleToGrf( const SwPaM &rRg, const Graphic *pGrf );

    // ein bischen wa fuer die benannten FlyFrames
    String GetUniqueFrameName() const;
    void SetFlyName( SwFlyFrmFmt& rFmt, const String& rName );
    const SwFlyFrmFmt* FindFlyByName( const String& rName, sal_Int8 nNdTyp = 0 ) const;

    void GetGrfNms( const SwFlyFrmFmt& rFmt, String* pGrfName,
                    String* pFltName ) const;

    // setze bei allen Flys ohne Namen einen gueltigen (Wird von den Readern
    // nach dem Einlesen gerufen )
    void SetAllUniqueFlyNames();

        //Aufspalten eines Nodes an rPos (nur fuer den TxtNode implementiert)
    sal_Bool SplitNode(const SwPosition &rPos, sal_Bool bChkTableStart = sal_False );
    sal_Bool AppendTxtNode( SwPosition& rPos ); // nicht const!

    // Ersetz einen selektierten Bereich in einem TextNode mit dem
    // String. Ist fuers Suchen&Ersetzen gedacht.
    // bRegExpRplc - ersetze Tabs (\\t) und setze den gefundenen String
    //               ein ( nicht \& )
    //              z.B.: Fnd: "zzz", Repl: "xx\t\\t..&..\&"
    //                      --> "xx\t<Tab>..zzz..&"
    sal_Bool Replace( SwPaM& rPam, const String& rNewStr,
                    sal_Bool bRegExpRplc = sal_False );

    /*
     * Einfuegen eines Attributs. Erstreckt sich rRg ueber
     * mehrere Nodes, wird das Attribut aufgespaltet, sofern
     * dieses Sinn macht. Nodes, in denen dieses Attribut keinen
     * Sinn macht, werden ignoriert.  In vollstaendig in der
     * Selektion eingeschlossenen Nodes wird das Attribut zu
     * harter Formatierung, in den anderen (Text-)Nodes wird das
     * Attribut in das Attributearray eingefuegt. Bei einem
     * Zeichenattribut wird ein "leerer" Hint eingefuegt,
     * wenn keine Selektion
     * vorliegt; andernfalls wird das Attribut als harte
     * Formatierung dem durch rRg.Start() bezeichneten Node
     * hinzugefuegt.  Wenn das Attribut nicht eingefuegt werden
     * konnte, liefert die Methode sal_False.
     */
    sal_Bool Insert( const SwPaM &rRg, const SfxPoolItem&, sal_uInt16 nFlags = 0  );
    sal_Bool Insert( const SwPaM &rRg, const SfxItemSet&, sal_uInt16 nFlags = 0 );

        //Zuruecksetzen der Attribute; es werden alle TxtHints und bei
        //vollstaendiger Selektion harte Formatierung (AUTO-Formate) entfernt
    void ResetAttr(const SwPaM &rRg, sal_Bool bTxtAttr = sal_True,
                        const SvUShortsSort* = 0 );
    void RstTxtAttr(const SwPaM &rRg, BOOL bInclRefToxMark = FALSE );

        // Setze das Attribut im angegebenen Format. Ist Undo aktiv, wird
        // das alte in die Undo-History aufgenommen
    void SetAttr( const SfxPoolItem&, SwFmt& );
    void SetAttr( const SfxItemSet&, SwFmt& );

        // Setze das Attribut als neues default Attribut in diesem Dokument.
        // Ist Undo aktiv, wird das alte in die Undo-History aufgenommen
    void SetDefault( const SfxPoolItem& );
    void SetDefault( const SfxItemSet& );

    // Erfrage das Default Attribut in diesem Dokument.
    const SfxPoolItem& GetDefault( sal_uInt16 nFmtHint ) const;
    // TextAttribute nicht mehr aufspannen lassen
    sal_Bool DontExpandFmt( const SwPosition& rPos, sal_Bool bFlag = sal_True );

    /* Formate */
    const SwFrmFmts* GetFrmFmts() const     { return pFrmFmtTbl; }
          SwFrmFmts* GetFrmFmts()           { return pFrmFmtTbl; }
    const SwCharFmts* GetCharFmts() const   { return pCharFmtTbl;}

    /* LayoutFormate (Rahmen, DrawObjecte), mal const mal nicht */
    const SwSpzFrmFmts* GetSpzFrmFmts() const   { return pSpzFrmFmtTbl; }
          SwSpzFrmFmts* GetSpzFrmFmts()         { return pSpzFrmFmtTbl; }

    const SwFrmFmt *GetDfltFrmFmt() const   { return pDfltFrmFmt; }
          SwFrmFmt *GetDfltFrmFmt()         { return pDfltFrmFmt; }
    const SwFrmFmt *GetEmptyPageFmt() const { return pEmptyPageFmt; }
          SwFrmFmt *GetEmptyPageFmt()       { return pEmptyPageFmt; }
    const SwFrmFmt *GetColumnContFmt() const{ return pColumnContFmt; }
          SwFrmFmt *GetColumnContFmt()      { return pColumnContFmt; }
    const SwCharFmt *GetDfltCharFmt() const { return pDfltCharFmt;}
          SwCharFmt *GetDfltCharFmt()       { return pDfltCharFmt;}

    SwFrmFmt  *MakeFrmFmt(const String &rFmtName, SwFrmFmt *pDerivedFrom);
    void       DelFrmFmt( SwFrmFmt *pFmt );
    SwFrmFmt* FindFrmFmtByName( const String& rName ) const
        {   return (SwFrmFmt*)FindFmtByName( (SvPtrarr&)*pFrmFmtTbl, rName ); }
    SwFrmFmt* FindSpzFrmFmtByName( const String& rName ) const
        {   return (SwFrmFmt*)FindFmtByName( (SvPtrarr&)*pSpzFrmFmtTbl, rName ); }

    SwCharFmt *MakeCharFmt(const String &rFmtName, SwCharFmt *pDerivedFrom);
    void       DelCharFmt(sal_uInt16 nFmt);
    void       DelCharFmt(SwCharFmt* pFmt);
    SwCharFmt* FindCharFmtByName( const String& rName ) const
        {   return (SwCharFmt*)FindFmtByName( (SvPtrarr&)*pCharFmtTbl, rName ); }

    /* Formatcollections (Vorlagen) */
    // TXT
    const SwTxtFmtColl* GetDfltTxtFmtColl() const { return pDfltTxtFmtColl; }
    const SwTxtFmtColls *GetTxtFmtColls() const { return pTxtFmtCollTbl; }
    SwTxtFmtColl *MakeTxtFmtColl( const String &rFmtName,
                                  SwTxtFmtColl *pDerivedFrom );
    SwConditionTxtFmtColl* MakeCondTxtFmtColl( const String &rFmtName,
                                               SwTxtFmtColl *pDerivedFrom );
    void DelTxtFmtColl(sal_uInt16 nFmt);
    void DelTxtFmtColl( SwTxtFmtColl* pColl );
    sal_Bool SetTxtFmtColl( const SwPaM &rRg, SwTxtFmtColl *pFmt,
                        sal_Bool bReset = sal_True);
    SwTxtFmtColl* FindTxtFmtCollByName( const String& rName ) const
        {   return (SwTxtFmtColl*)FindFmtByName( (SvPtrarr&)*pTxtFmtCollTbl, rName ); }

        // GRF
    const SwGrfFmtColl* GetDfltGrfFmtColl() const   { return pDfltGrfFmtColl; }
    const SwGrfFmtColls *GetGrfFmtColls() const     { return pGrfFmtCollTbl; }
    SwGrfFmtColl *MakeGrfFmtColl(const String &rFmtName,
                                    SwGrfFmtColl *pDerivedFrom);
    void DelGrfFmtColl(sal_uInt16 nFmt);
    void DelGrfFmtColl( SwGrfFmtColl* pColl );
    SwGrfFmtColl* FindGrfFmtCollByName( const String& rName ) const
        {   return (SwGrfFmtColl*)FindFmtByName( (SvPtrarr&)*pGrfFmtCollTbl, rName ); }

        // Tabellen-Formate
    const SwFrmFmts* GetTblFrmFmts() const  { return pTblFrmFmtTbl; }
          SwFrmFmts* GetTblFrmFmts()        { return pTblFrmFmtTbl; }
    sal_uInt16 GetTblFrmFmtCount( sal_Bool bUsed ) const;
    SwFrmFmt& GetTblFrmFmt(sal_uInt16 nFmt, sal_Bool bUsed ) const;
    SwTableFmt* MakeTblFrmFmt(const String &rFmtName, SwFrmFmt *pDerivedFrom);
    void        DelTblFrmFmt( SwTableFmt* pFmt );
    SwTableFmt* FindTblFmtByName( const String& rName, sal_Bool bAll = sal_False ) const;

    //Rahmenzugriff
    //iterieren ueber Flys - fuer Basic-Collections
    sal_uInt16 GetFlyCount(FlyCntType eType = FLYCNTTYPE_ALL) const;
    SwFrmFmt* GetFlyNum(sal_uInt16 nIdx, FlyCntType eType = FLYCNTTYPE_ALL);


    // kopiere die Formate in die eigenen Arrays und returne diese
    SwFrmFmt  *CopyFrmFmt ( const SwFrmFmt& );
    SwCharFmt *CopyCharFmt( const SwCharFmt& );
    SwTxtFmtColl* CopyTxtColl( const SwTxtFmtColl& rColl );
    SwGrfFmtColl* CopyGrfColl( const SwGrfFmtColl& rColl );

        // ersetze alle Formate mit denen aus rSource
    void ReplaceStyles( SwDoc& rSource );

        // Gebe die "Auto-Collection" mit der Id zurueck. Existiert
        // sie noch nicht, dann erzuege sie
        // Ist der String-Pointer definiert, dann erfrage nur die
        // Beschreibung der Attribute, !! es legt keine Vorlage an !!
    SwTxtFmtColl* GetTxtCollFromPool( sal_uInt16 nId, String* pDescription = 0,
        SfxItemPresentation ePres = SFX_ITEM_PRESENTATION_COMPLETE,
        SfxMapUnit eCoreMetric = SFX_MAPUNIT_TWIP,
        SfxMapUnit ePresMetric = SFX_MAPUNIT_TWIP );
        // return das geforderte automatische  Format - Basis-Klasse !
    SwFmt* GetFmtFromPool( sal_uInt16 nId, String* pDescription = 0,
        SfxItemPresentation ePres = SFX_ITEM_PRESENTATION_COMPLETE,
        SfxMapUnit eCoreMetric = SFX_MAPUNIT_TWIP,
        SfxMapUnit ePresMetric = SFX_MAPUNIT_TWIP );
        // returne das geforderte automatische Format
    SwFrmFmt* GetFrmFmtFromPool( sal_uInt16 nId, String* pDescription = 0 )
        { return (SwFrmFmt*)GetFmtFromPool( nId, pDescription ); }
    SwCharFmt* GetCharFmtFromPool( sal_uInt16 nId, String* pDescription = 0 )
        { return (SwCharFmt*)GetFmtFromPool( nId, pDescription ); }
        // returne die geforderte automatische Seiten-Vorlage
    SwPageDesc* GetPageDescFromPool( sal_uInt16 nId, String* pDescription = 0,
        SfxItemPresentation ePres = SFX_ITEM_PRESENTATION_COMPLETE,
        SfxMapUnit eCoreMetric = SFX_MAPUNIT_TWIP,
        SfxMapUnit ePresMetric = SFX_MAPUNIT_TWIP );
    SwNumRule* GetNumRuleFromPool( sal_uInt16 nId, String* pDescription = 0,
        SfxItemPresentation ePres = SFX_ITEM_PRESENTATION_COMPLETE,
        SfxMapUnit eCoreMetric = SFX_MAPUNIT_TWIP,
        SfxMapUnit ePresMetric = SFX_MAPUNIT_TWIP );

        // pruefe, ob diese "Auto-Collection" in Dokument schon/noch
        // benutzt wird
    sal_Bool IsPoolTxtCollUsed( sal_uInt16 nId ) const;
    sal_Bool IsPoolFmtUsed( sal_uInt16 nId ) const;
    sal_Bool IsPoolPageDescUsed( sal_uInt16 nId ) const;
    sal_Bool IsPoolNumRuleUsed( sal_uInt16 nId ) const;

    // erfrage ob die Absatz-/Zeichen-/Rahmen-/Seiten - Vorlage benutzt wird
    sal_Bool IsUsed( const SwModify& ) const;
    sal_Bool IsUsed( const SwNumRule& ) const;

        // ist der Name ein Pool-Vorlagen-Name, returne seine ID,
        // sonst USHRT_MAX
    sal_uInt16 GetPoolId( const String& rName, SwGetPoolIdFromName ) const;

    const SvStringsDtor& GetTextNmArray() const
        { return pTextNmArray ? *pTextNmArray : *NewTextNmArray(); }
    const SvStringsDtor& GetListsNmArray() const
        { return pListsNmArray ? *pListsNmArray : *NewListsNmArray(); }
    const SvStringsDtor& GetExtraNmArray() const
        { return pExtraNmArray ? *pExtraNmArray : *NewExtraNmArray(); }
    const SvStringsDtor& GetRegisterNmArray() const
        { return pRegisterNmArray ? *pRegisterNmArray : *NewRegisterNmArray(); }
    const SvStringsDtor& GetDocNmArray() const
        { return pDocNmArray ? *pDocNmArray : *NewDocNmArray(); }
    const SvStringsDtor& GetHTMLNmArray() const
        { return pHTMLNmArray ? *pHTMLNmArray : *NewHTMLNmArray(); }
    const SvStringsDtor& GetFrmFmtNmArray() const
        { return pFrmFmtNmArray ? *pFrmFmtNmArray : *NewFrmFmtNmArray(); }
    const SvStringsDtor& GetChrFmtNmArray() const
        { return pChrFmtNmArray ? *pChrFmtNmArray : *NewChrFmtNmArray(); }
    const SvStringsDtor& GetHTMLChrFmtNmArray() const
        { return pHTMLChrFmtNmArray ? *pHTMLChrFmtNmArray : *NewHTMLChrFmtNmArray(); }
    const SvStringsDtor& GetPageDescNmArray() const
        { return pPageDescNmArray ? *pPageDescNmArray : *NewPageDescNmArray(); }
    const SvStringsDtor& GetNumRuleNmArray() const
        { return pNumRuleNmArray ? *pNumRuleNmArray : *NewNumRuleNmArray(); }

        // erfrage zu einer PoolId den Namen (steht im poolfmt.cxx)
    static String& GetPoolNm( sal_uInt16 nId, String& rFillNm );

        // setze den Namen der neu geladenen Dokument-Vorlage
    sal_uInt16 SetDocPattern( const String& rPatternName );
        // gebe die Anzahl von geladenen Dok-VorlagenNamen zurueck.
        // !! Die nicht mehr benutzten sind 0-Pointer !!
    sal_uInt16 GetDocPatternCnt() const { return aPatternNms.Count(); }
        // gebe den Dok-VorlagenNamen zurueck. !!! Kann auch 0 sein !!!
    String* GetDocPattern( sal_uInt16 nPos ) const { return aPatternNms[nPos]; }
    // loeche die nicht mehr benutzten Pattern-Namen aus dem Array.

    // alle nicht mehr referenzierten Namen werden durch 0-Pointer
    // ersetzt. Diese Positionen koennen wieder vergeben werden.
    void ReOrgPatternHelpIds();


        // Loesche alle nicht referenzierten FeldTypen
    void GCFieldTypes();                // impl. in docfld.cxx

        // akt. Dokument mit Textbausteindokument verbinden/erfragen
    void SetGlossaryDoc( SwDoc* pDoc ) { pGlossaryDoc = pDoc; }
    SwDoc* GetGlossaryDoc() const { return pGlossaryDoc; }
        // jetzt mit einem verkappten Reader/Writer/Dokument

    // travel over PaM Ring
    sal_Bool InsertGlossary( SwTextBlocks& rBlock, const String& rEntry,
                        SwPaM& rPaM, SwCrsrShell* pShell = 0);

    String GetCurWord(SwPaM&);

    //  JobSetup und Freunde
    SfxPrinter* GetPrt( sal_Bool bCreate ) const
        { if( !bCreate || pPrt ) return pPrt; else return _GetPrt(); }
    SfxPrinter* GetPrt() const { return pPrt; }
    inline void _SetPrt( SfxPrinter *pP )   { pPrt = pP; }
    void        SetPrt( SfxPrinter *pP );
    const JobSetup* GetJobsetup() const;
    void        SetJobsetup( const JobSetup& rJobSetup );

        // Dokument - Info
            // legt sie auf jedenfall an!
    const SfxDocumentInfo* GetInfo();
            // kann auch 0 sein !!!
    const SfxDocumentInfo* GetpInfo() const { return pSwgInfo; }

        // setze ueber die DocShell in den entsp. Storage-Stream. Hier wird
        // jetzt die DocInfo verwaltet. Fuer die Felder ist am Doc eine Kopie
        // der Info, um einen schnellen Zugriff zu ermoeglichen.
        // (impl. in docsh2.cxx)
    void SetInfo( const SfxDocumentInfo& rInfo );
        // die DocInfo hat siche geaendert (Notify ueber die DocShell)
        // stosse die entsp. Felder zum Updaten an.
    void DocInfoChgd( const SfxDocumentInfo& rInfo );

        //  Dokument - Statistics
    inline const SwDocStat  &GetDocStat() const { return *pDocStat; }
    void SetDocStat( const SwDocStat& rStat );
    void UpdateDocStat( SwDocStat& rStat, sal_uInt16 nNumPages );

        //PageDescriptor-Schnittstelle
    sal_uInt16 GetPageDescCnt() const { return aPageDescs.Count(); }
    const SwPageDesc& GetPageDesc( sal_uInt16 i ) const { return *aPageDescs[i]; }
    SwPageDesc* FindPageDescByName( const String& rName,
                                    sal_uInt16* pPos = 0 ) const;

        // kopiere den gesamten PageDesc - ueber Dokumentgrenzen und "tief"!
        // optional kann das kopieren der PoolFmtId, -HlpId verhindert werden
    void CopyPageDesc( const SwPageDesc& rSrcDesc, SwPageDesc& rDstDesc,
                        sal_Bool bCopyPoolIds = sal_True );

        // kopiere die Kopzeile (mit dem Inhalt!) aus dem SrcFmt
        // ins DestFmt ( auch ueber Doc grenzen hinaus!)
    void CopyHeader( const SwFrmFmt& rSrcFmt, SwFrmFmt& rDestFmt )
        { _CopyPageDescHeaderFooter( sal_True, rSrcFmt, rDestFmt ); }
        // kopiere die Fusszeile (mit dem Inhalt!) aus dem SrcFmt
        // ins DestFmt ( auch ueber Doc grenzen hinaus!)
    void CopyFooter( const SwFrmFmt& rSrcFmt, SwFrmFmt& rDestFmt )
        { _CopyPageDescHeaderFooter( sal_False, rSrcFmt, rDestFmt ); }

        //fuer Reader
    SwPageDesc& _GetPageDesc( sal_uInt16 i ) const { return *aPageDescs[i]; }
    void ChgPageDesc( sal_uInt16 i, const SwPageDesc& );
    void DelPageDesc( sal_uInt16 i );
    sal_uInt16 MakePageDesc( const String &rName, const SwPageDesc* pCpy = 0 );

        // Methoden fuer die Verzeichnisse:
        // - Verzeichnismarke einfuegen loeschen travel
    sal_uInt16 GetCurTOXMark( const SwPosition& rPos, SwTOXMarks& ) const;
    void Delete( SwTOXMark* pTOXMark );
    const SwTOXMark& GotoTOXMark( const SwTOXMark& rCurTOXMark,
                                SwTOXSearch eDir, sal_Bool bInReadOnly );

        // - Verzeichnis einfuegen, und bei Bedarf erneuern
    const SwTOXBaseSection* InsertTableOf( const SwPosition& rPos,
                                            const SwTOXBase& rTOX,
                                            const SfxItemSet* pSet = 0,
                                            sal_Bool bExpand = sal_False );
    const SwTOXBaseSection* InsertTableOf( sal_uInt32 nSttNd, sal_uInt32 nEndNd,
                                            const SwTOXBase& rTOX,
                                            const SfxItemSet* pSet = 0                                          );
    const SwTOXBase* GetCurTOX( const SwPosition& rPos ) const;
    const SwAttrSet& GetTOXBaseAttrSet(const SwTOXBase& rTOX) const;

    sal_Bool DeleteTOX( const SwTOXBase& rTOXBase, sal_Bool bDelNodes = sal_False );
    String GetUniqueTOXBaseName( const SwTOXType& rType,
                                const String* pChkStr = 0 ) const;

    sal_Bool SetTOXBaseName(const SwTOXBase& rTOXBase, const String& rName);
    void SetTOXBaseProtection(const SwTOXBase& rTOXBase, sal_Bool bProtect);

    // nach einlesen einer Datei alle Verzeichnisse updaten
    void SetUpdateTOX( sal_Bool bFlag = sal_True )      { bUpdateTOX = bFlag; }
    sal_Bool IsUpdateTOX() const                    { return bUpdateTOX; }

    const String&   GetTOIAutoMarkURL() const {return sTOIAutoMarkURL;}
    void            SetTOIAutoMarkURL(const String& rSet)  {sTOIAutoMarkURL = rSet;}
    void            ApplyAutoMark();

    sal_Bool IsInReading() const                    { return bInReading; }

    // - Verzeichnis-Typen verwalten
    sal_uInt16 GetTOXTypeCount( TOXTypes eTyp ) const;
    const SwTOXType* GetTOXType( TOXTypes eTyp, sal_uInt16 nId ) const;
    sal_Bool DeleteTOXType( TOXTypes eTyp, sal_uInt16 nId );
    const SwTOXType* InsertTOXType( const SwTOXType& rTyp );
    const SwTOXTypes& GetTOXTypes() const { return *pTOXTypes; }

    const SwTOXBase*    GetDefaultTOXBase( TOXTypes eTyp, sal_Bool bCreate = sal_False );
    void                SetDefaultTOXBase(const SwTOXBase& rBase);

    // - Schluessel fuer die Indexverwaltung
    sal_uInt16 GetTOIKeys( SwTOIKeyType eTyp, SvStringsSort& rArr ) const;

    // Sortieren Tabellen Text
    sal_Bool SortTbl(const SwSelBoxes& rBoxes, const SwSortOptions&);
    sal_Bool SortText(const SwPaM&, const SwSortOptions&);

        // korrigiere die im Dokument angemeldeten SwPosition-Objecte,
        // wie z.B. die ::com::sun::star::text::Bookmarks oder die Verzeichnisse.
        // JP 22.06.95: ist bMoveCrsr gesetzt, verschiebe auch die Crsr

        // Setzt alles in rOldNode auf rNewPos + Offset
    void CorrAbs( const SwNodeIndex& rOldNode, const SwPosition& rNewPos,
                    const xub_StrLen nOffset = 0, sal_Bool bMoveCrsr = sal_False );
        // Setzt alles im Bereich von [rStartNode, rEndNode] nach rNewPos
    void CorrAbs( const SwNodeIndex& rStartNode, const SwNodeIndex& rEndNode,
                    const SwPosition& rNewPos, sal_Bool bMoveCrsr = sal_False );
        // Setzt alles im Bereich von rRange nach rNewPos
    void CorrAbs( const SwPaM& rRange, const SwPosition& rNewPos,
                    sal_Bool bMoveCrsr = sal_False );
        // Setzt alles in rOldNode auf relative Pos
    void CorrRel( const SwNodeIndex& rOldNode, const SwPosition& rNewPos,
                    const xub_StrLen nOffset = 0, sal_Bool bMoveCrsr = sal_False );

        // GliederungsRegeln erfragen / setzen
    const SwNumRule* GetOutlineNumRule() const { return pOutlineRule; }
    void SetOutlineNumRule( const SwNumRule& rRule );
    // Gliederung - hoch-/runterstufen
    sal_Bool OutlineUpDown( const SwPaM& rPam, short nOffset = 1 );
    // Gliederung - hoch-/runtermoven
    sal_Bool MoveOutlinePara( const SwPaM& rPam, short nOffset = 1);
        // zu diesem Gliederungspunkt
    sal_Bool GotoOutline( SwPosition& rPos, const String& rName ) const;
    // die Aenderungen an den Gliederungsvorlagen in die OutlineRule uebernehmen
    void SetOutlineLSpace( sal_uInt8 nLevel, short nFirstLnOfst, sal_uInt16 nLSpace );

        // setzt, wenn noch keine Numerierung, sonst wird geaendert
        // arbeitet mit alten und neuen Regeln, nur Differenzen aktualisieren
    void SetNumRule( const SwPaM&, const SwNumRule&,
                                        sal_Bool bSetAbsLSpace = sal_True );
        // ab hier neu starten lassen oder den Start wieder aufheben
    void SetNumRuleStart( const SwPosition& rPos, sal_Bool bFlag = sal_True );
    void SetNodeNumStart( const SwPosition& rPos, sal_uInt16 nStt = USHRT_MAX );

    SwNumRule* GetCurrNumRule( const SwPosition& rPos ) const;
    SwNumRuleTbl& GetNumRuleTbl() { return *pNumRuleTbl; }
    const SwNumRuleTbl& GetNumRuleTbl() const { return *pNumRuleTbl; }
    sal_uInt16 MakeNumRule( const String &rName, const SwNumRule* pCpy = 0 );
    sal_uInt16 FindNumRule( const String& rName ) const;
    SwNumRule* FindNumRulePtr( const String& rName ) const;
    // loeschen geht nur, wenn die ::com::sun::star::chaos::Rule niemand benutzt!
    sal_Bool DelNumRule( const String& rName );
    String GetUniqueNumRuleName( const String* pChkStr = 0, sal_Bool bAutoNum = sal_True ) const;
    void UpdateNumRule( const String& rName, sal_uInt32 nUpdPos );
    void UpdateNumRule();   // alle invaliden Updaten
    void ChgNumRuleFmts( const SwNumRule& rRule );
    sal_Bool ReplaceNumRule( const SwPosition& rPos, const String& rOldRule,
                        const String& rNewRule );

        // zum naechsten/vorhergehenden Punkt auf gleicher Ebene
    sal_Bool GotoNextNum( SwPosition&, sal_Bool bOverUpper = sal_True,
                        sal_uInt8* pUpper = 0, sal_uInt8* pLower = 0 );
    sal_Bool GotoPrevNum( SwPosition&, sal_Bool bOverUpper = sal_True,
                        sal_uInt8* pUpper = 0, sal_uInt8* pLower = 0 );

        // Absaetze ohne Numerierung, aber mit Einzuegen
    sal_Bool NoNum( const SwPaM& );
        // Loeschen, Splitten der Aufzaehlungsliste
    sal_Bool DelNumRules( const SwPaM& );
        // Hoch-/Runterstufen
    sal_Bool NumUpDown( const SwPaM&, sal_Bool bDown = sal_True );
        // Bewegt selektierte Absaetze (nicht nur Numerierungen)
        // entsprechend des Offsets. (negativ: zum Doc-Anf.)
    sal_Bool MoveParagraph( const SwPaM&, long nOffset = 1, sal_Bool bIsOutlMv = sal_False );
        // No-/Numerierung ueber Delete/Backspace ein/abschalten
    sal_Bool NumOrNoNum( const SwNodeIndex& rIdx, sal_Bool bDel = sal_False,
                    sal_Bool bOutline = sal_False );
        // Animation der Grafiken stoppen
    void StopNumRuleAnimations( OutputDevice* );

        // fuege eine neue Tabelle auf der Position rPos ein. (es
        // wird vor dem Node eingefuegt !!)
        //JP 28.10.96:
        //  fuer AutoFormat bei der Eingabe: dann muessen die Spalten
        //  auf die vordefinierten Breite gesetzt werden. Im Array stehen die
        //  Positionen der Spalten!! (nicht deren Breite!)
    const SwTable* InsertTable( const SwPosition& rPos, sal_uInt16 nRows,
                                sal_uInt16 nCols, SwHoriOrient eAdjust,
                                sal_uInt16 nInsert = HEADLINE_NO_BORDER,
                                const SwTableAutoFmt* pTAFmt = 0,
                                const SvUShorts* pColArr = 0 );

        // steht der Index in einer Tabelle, dann returne den TableNode sonst 0
                 SwTableNode* IsIdxInTbl( const SwNodeIndex& rIdx );
    inline const SwTableNode* IsIdxInTbl( const SwNodeIndex& rIdx ) const;

        // erzeuge aus dem makierten Bereich eine ausgeglichene Tabelle
    const SwTable* TextToTable( const SwPaM& rRange, sal_Unicode cCh,
                                SwHoriOrient eAdjust,
                                sal_uInt16 nInsert = HEADLINE_NO_BORDER,
                                const SwTableAutoFmt* = 0 );
        // erzeuge aus der Tabelle wieder normalen Text
    sal_Bool TableToText( const SwTableNode* pTblNd, sal_Unicode cCh );
        // einfuegen von Spalten/Zeilen in der Tabelle
    sal_Bool InsertCol( const SwCursor& rCursor,
                    sal_uInt16 nCnt = 1, sal_Bool bBehind = sal_True );
    sal_Bool InsertCol( const SwSelBoxes& rBoxes,
                    sal_uInt16 nCnt = 1, sal_Bool bBehind = sal_True );
    sal_Bool InsertRow( const SwCursor& rCursor,
                    sal_uInt16 nCnt = 1, sal_Bool bBehind = sal_True );
    sal_Bool InsertRow( const SwSelBoxes& rBoxes,
                    sal_uInt16 nCnt = 1, sal_Bool bBehind = sal_True );
        // loeschen von Spalten/Zeilen in der Tabelle
    sal_Bool DeleteRowCol( const SwSelBoxes& rBoxes );
    sal_Bool DeleteRow( const SwCursor& rCursor );
    sal_Bool DeleteCol( const SwCursor& rCursor );
        // teilen / zusammenfassen von Boxen in der Tabelle
    sal_Bool SplitTbl( const SwSelBoxes& rBoxes, sal_Bool bVert = sal_True, sal_uInt16 nCnt=1 );
        // returnt den enum TableMergeErr
    sal_uInt16 MergeTbl( SwPaM& rPam );
    String GetUniqueTblName() const;
    sal_Bool IsInsTblFormatNum() const;
    sal_Bool IsInsTblChangeNumFormat() const;
    sal_Bool IsInsTblAlignNum() const;

        // aus der FEShell wg.. Undo und bModified
    void GetTabCols( SwTabCols &rFill, const SwCursor* pCrsr,
                    const SwCellFrm* pBoxFrm = 0 ) const;
    void SetTabCols( const SwTabCols &rNew, sal_Bool bCurRowOnly,
                    const SwCursor* pCrsr, const SwCellFrm* pBoxFrm = 0 );

    // Direktzugriff fuer Uno
    void SetTabCols(SwTable& rTab, const SwTabCols &rNew, SwTabCols &rOld,
                                    const SwTableBox *pStart, sal_Bool bCurRowOnly);

    void SetHeadlineRepeat( SwTable &rTable, sal_Bool bSet );
        // AutoFormat fuer die Tabelle/TabellenSelection
    sal_Bool SetTableAutoFmt( const SwSelBoxes& rBoxes, const SwTableAutoFmt& rNew );
        // Erfrage wie attributiert ist
    sal_Bool GetTableAutoFmt( const SwSelBoxes& rBoxes, SwTableAutoFmt& rGet );
        // setze das TabelleAttribut Undo auf:
    void AppendUndoForAttrTable( const SwTable& rTbl );
        // setze die Spalten/Zeilen/ZTellen Breite/Hoehe
    sal_Bool SetColRowWidthHeight( SwTableBox& rAktBox, sal_uInt16 eType,
                                SwTwips nAbsDiff, SwTwips nRelDiff );
    SwTableBoxFmt* MakeTableBoxFmt();
    SwTableLineFmt* MakeTableLineFmt();
    // teste ob die Box ein numerischen Wert darstellt und aender dann ggfs.
    // das Format der Box
    void ChkBoxNumFmt( SwTableBox& rAktBox, sal_Bool bCallUpdate );
    void SetTblBoxFormulaAttrs( SwTableBox& rBox, const SfxItemSet& rSet );
    void ClearBoxNumAttrs( const SwNodeIndex& rNode );

    sal_Bool CopyTblInTbl( const SwTable& rSrcTable, SwTable& rDestTbl,
                        const SwNodeIndex& rBoxIdx );
    sal_Bool InsCopyOfTbl( SwPosition& rInsPos, const SwSelBoxes& rBoxes,
                        const SwTable* pCpyTbl = 0, sal_Bool bCpyName = sal_False,
                        sal_Bool bCorrPos = sal_False );

    sal_Bool UnProtectCells( const String& rTblName );
    sal_Bool UnProtectCells( const SwSelBoxes& rBoxes );
    sal_Bool UnProtectTbls( const SwPaM& rPam );
    sal_Bool HasTblAnyProtection( const SwPosition* pPos,
                              const String* pTblName = 0,
                              sal_Bool* pFullTblProtection = 0 );

    // Tabelle an der Position in der GrundLine aufsplitten, sprich eine
    // neue Tabelle erzeugen.
    sal_Bool SplitTable( const SwPosition& rPos, sal_uInt16 eMode = 0,
                        sal_Bool bCalcNewSize = sal_False );
    // und die Umkehrung davon. rPos muss in der Tabelle stehen, die bestehen
    // bleibt. Das Flag besagt ob die aktuelle mit der davor oder dahinter
    // stehenden vereint wird.
    sal_Bool MergeTable( const SwPosition& rPos, sal_Bool bWithPrev = sal_True,
                        sal_uInt16 nMode = 0 );

    // Raeume die Umrandung innerhalb der Tabelle ein wenig auf (doppelte
    // an einer Kante erkennen und beseitigen)
    sal_Bool GCTableBorder( const SwPosition& rPos );
    // Charts der angegebenen Tabelle zum Update bewegen
    void UpdateCharts( const String &rName ) const;
    // update all charts, for that exists any table
    void UpdateAllCharts()          { DoUpdateAllCharts( 0 ); }
    // Tabelle wird umbenannt und aktualisiert die Charts
    void SetTableName( SwFrmFmt& rTblFmt, const String &rNewName );

    // returne zum Namen die im Doc gesetzte Referenz
    const SwFmtRefMark* GetRefMark( const String& rName ) const;
    // returne die RefMark per Index - fuer Uno
    const SwFmtRefMark* GetRefMark( sal_uInt16 nIndex ) const;
    // returne die Namen aller im Doc gesetzten Referenzen.
    //  Ist der ArrayPointer 0 dann returne nur, ob im Doc. eine RefMark
    //  gesetzt ist
    sal_uInt16 GetRefMarks( SvStringsDtor* = 0 ) const;

    //Einfuegen einer Beschriftung - falls ein FlyFormat erzeugt wird, so
    // returne dieses.
    SwFlyFrmFmt* InsertLabel( const SwLabelType eType, const String &rTxt,
                    const sal_Bool bBefore, const sal_uInt16 nId, const sal_uInt32 nIdx,
                    const sal_Bool bCpyBrd = sal_True );
    SwFlyFrmFmt* InsertDrawLabel( const String &rTxt, const sal_uInt16 nId,
                                  SdrObject& rObj );

    // erfrage den Attribut Pool
    const SwAttrPool& GetAttrPool() const   { return aAttrPool; }
          SwAttrPool& GetAttrPool()         { return aAttrPool; }

    // suche ueber das Layout eine EditShell und ggfs. eine ViewShell
    SwEditShell* GetEditShell( ViewShell** ppSh = 0 ) const;

    // OLE 2.0-Benachrichtung
    inline       void  SetOle2Link(const Link& rLink) {aOle2Link = rLink;}
    inline const Link& GetOle2Link() const {return aOle2Link;}

    // SS fuer Bereiche
    SwSection* Insert( const SwPaM& rRange, const SwSection& rNew,
                        const SfxItemSet* pAttr = 0, sal_Bool bUpdate = sal_True );
    sal_uInt16 IsInsRegionAvailable( const SwPaM& rRange,
                                const SwNode** ppSttNd = 0 ) const;
    SwSection* GetCurrSection( const SwPosition& rPos ) const;
    SwSectionFmts& GetSections() { return *pSectionFmtTbl; }
    const SwSectionFmts& GetSections() const { return *pSectionFmtTbl; }
    SwSectionFmt *MakeSectionFmt( SwSectionFmt *pDerivedFrom );
    void DelSectionFmt( SwSectionFmt *pFmt, sal_Bool bDelNodes = sal_False );
    void ChgSection( sal_uInt16 nSect, const SwSection&, const SfxItemSet* = 0 );
    String GetUniqueSectionName( const String* pChkStr = 0 ) const;

        // Passwort fuer geschuetzte Bereiche erfragen/setzen
    void ChgSectionPasswd( const String& sNew );
    const String& GetSectionPasswd() const { return sSectionPasswd; }

    // Pointer auf die SfxDocShell vom Doc, kann 0 sein !!!
          SwDocShell* GetDocShell()         { return pDocShell; }
    const SwDocShell* GetDocShell() const   { return pDocShell; }
    void SetDocShell( SwDocShell* pDSh );

    // falls beim Kopieren von OLE-Nodes eine DocShell angelegt werden muss,
    // dann MUSS der Ref-Pointer besetzt sein!!!!
    SvEmbeddedObjectRef* GetRefForDocShell()            { return pDocShRef; }
    void SetRefForDocShell( SvEmbeddedObjectRef* p )    { pDocShRef = p; }

        // fuer die TextBausteine - diese habe nur ein SvPersist zur
        // Verfuegung
         SvPersist* GetPersist() const;
    void SetPersist( SvPersist* );

    // Pointer auf den Storage des SfxDocShells, kann 0 sein !!!
    SvStorage* GetDocStorage();

        // abfrage/setze Flag, ob das Dokument im asynchronen Laden ist
    sal_Bool IsInLoadAsynchron() const              { return bInLoadAsynchron; }
    void SetInLoadAsynchron( sal_Bool bFlag )       { bInLoadAsynchron = bFlag; }

    // SS fuers Linken von Dokumentteilen
    sal_Bool GetData( const String& rItem, SvData& rData ) const;
    sal_Bool ChangeData( const String& rItem, const SvData& rData );
    SvPseudoObject* CreateHotLink( const String& rItem );
    // erzeuge um das zu Servende Object eine Selektion
    sal_Bool SelectServerObj( const String& rStr, SwPaM*& rpPam,
                            SwNodeRange*& rpRange ) const;
    // erfage alle zu servendenen Objecte
    sal_uInt16 GetServerObjects( SvStrings& rStrArr ) const;

    // fuer Drag&Move: ( z.B. RefMarks "verschieben" erlauben )
    sal_Bool IsCopyIsMove() const               { return bCopyIsMove; }
    void SetCopyIsMove( sal_Bool bFlag )        { bCopyIsMove = bFlag; }

    // fuers Draw-Undo: Aktionen auf Flys wollen wir selbst behandeln
    sal_Bool IsNoDrawUndoObj() const            { return bNoDrawUndoObj; }
    void SetNoDrawUndoObj( sal_Bool bFlag )     { bNoDrawUndoObj = bFlag; }
    SwDrawContact* GroupSelection( SdrView& );
    void UnGroupSelection( SdrView& );
    sal_Bool DeleteSelection( SwDrawView& );

    // Invalidiert OnlineSpell-WrongListen
    void SpellItAgainSam( sal_Bool bInvalid, sal_Bool bOnlyWrong );
    void InvalidateAutoCompleteFlag();

    SdrModel* _MakeDrawModel();
    inline SdrModel* MakeDrawModel()
    { return GetDrawModel() ? GetDrawModel() : _MakeDrawModel(); }
    void SetCalcFieldValueHdl(Outliner* pOutliner);

    // erfrage ob die ::com::sun::star::util::URL besucht war. Uebers Doc, falls nur ein ::com::sun::star::text::Bookmark
    // angegeben ist. Dann muss der Doc. Name davor gesetzt werden!
    sal_Bool IsVisitedURL( const String& rURL ) const;

    // speicher die akt. Werte fuer die automatische Aufnahme von Ausnahmen
    // in die Autokorrektur
    void SetAutoCorrExceptWord( SwAutoCorrExceptWord* pNew );
    SwAutoCorrExceptWord* GetAutoCorrExceptWord()       { return pACEWord; }

    const SwFmtINetFmt* FindINetAttr( const String& rName ) const;

    // rufe ins dunkle Basic, mit evt. Return String
    sal_Bool ExecMacro( const SvxMacro& rMacro, String* pRet = 0, SbxArray* pArgs = 0 );
    // rufe ins dunkle Basic/JavaScript
    sal_uInt16 CallEvent( sal_uInt16 nEvent, const SwCallMouseEvent& rCallEvent,
                        sal_Bool bChkPtr = sal_False, SbxArray* pArgs = 0,
                        const Link* pCallBack = 0 );

    // linken Rand ueber Objectleiste einstellen (aenhlich dem Stufen von
    // Numerierungen), optional kann man "um" den Offset stufen oder "auf"
    // die Position gestuft werden (bModulus = sal_True)
    void MoveLeftMargin( const SwPaM& rPam, sal_Bool bRight = sal_True,
                        sal_Bool bModulus = sal_True );

    // Numberformatter erfragen
    inline       SvNumberFormatter* GetNumberFormatter( sal_Bool bCreate = sal_True );
    inline const SvNumberFormatter* GetNumberFormatter( sal_Bool bCreate = sal_True ) const;

    // loesche den nicht sichtbaren ::com::sun::star::ucb::Content aus dem Document, wie z.B.:
    // versteckte Bereiche, versteckte Absaetze
    sal_Bool RemoveInvisibleContent();
    // embedded alle lokalen Links (Bereiche/Grafiken)
    sal_Bool EmbedAllLinks();
    // erzeuge Anhand der vorgebenen Collection Teildokumente
    // falls keine angegeben ist, nehme die Kapitelvorlage der 1. Ebene
    sal_Bool GenerateGlobalDoc( const String& rPath,
                                const SwTxtFmtColl* pSplitColl = 0 );
    sal_Bool GenerateHTMLDoc( const String& rPath,
                                const SwTxtFmtColl* pSplitColl = 0 );


    // alles fuers Redlining
    SwRedlineMode GetRedlineMode() const { return eRedlineMode; }
    sal_Bool IsRedlineOn() const { return ::IsRedlineOn( eRedlineMode ); }
    sal_Bool IsIgnoreRedline() const { return REDLINE_IGNORE & eRedlineMode; }
    void SetRedlineMode_intern( sal_uInt16 eMode ) { eRedlineMode = (SwRedlineMode)eMode; }
    void SetRedlineMode( sal_uInt16 eMode );

    const SwRedlineTbl& GetRedlineTbl() const { return *pRedlineTbl; }
    sal_Bool AppendRedline( SwRedline* pPtr, sal_Bool bCallDelete = sal_True );
    sal_Bool SplitRedline( const SwPaM& rPam );
    sal_Bool DeleteRedline( const SwPaM& rPam, sal_Bool bSaveInUndo = sal_True,
                        sal_uInt16 nDelType = USHRT_MAX );
    sal_Bool DeleteRedline( const SwStartNode& rSection, sal_Bool bSaveInUndo = sal_True,
                        sal_uInt16 nDelType = USHRT_MAX );
    void DeleteRedline( sal_uInt16 nPos );
    sal_uInt16 GetRedlinePos( const SwNode& rNd, sal_uInt16 nType = USHRT_MAX ) const;
    void CompressRedlines();
    const SwRedline* GetRedline( const SwPosition& rPos,
                                sal_uInt16* pFndPos = 0 ) const;

    sal_Bool IsRedlineMove() const              { return bIsRedlineMove; }
    void SetRedlineMove( sal_Bool bFlag )       { bIsRedlineMove = bFlag; }

    sal_Bool AcceptRedline( sal_uInt16 nPos, sal_Bool bCallDelete = sal_True );
    sal_Bool AcceptRedline( const SwPaM& rPam, sal_Bool bCallDelete = sal_True );
    sal_Bool RejectRedline( sal_uInt16 nPos, sal_Bool bCallDelete = sal_True );
    sal_Bool RejectRedline( const SwPaM& rPam, sal_Bool bCallDelete = sal_True );
    const SwRedline* SelNextRedline( SwPaM& rPam ) const;
    const SwRedline* SelPrevRedline( SwPaM& rPam ) const;

    // alle Redline invalidieren, die Darstellung hat sich geaendert
    void UpdateRedlineAttr();
    // legt gegebenenfalls einen neuen Author an
    sal_uInt16 GetRedlineAuthor();
    // fuer die Reader usw. - neuen Author in die Tabelle eintragen
    sal_uInt16 InsertRedlineAuthor( const String& );
    // Kommentar am Redline an der Position setzen
    sal_Bool SetRedlineComment( const SwPaM& rPam, const String& rS );

    //  vergleiche zwei Dokument miteinander
    long CompareDoc( const SwDoc& rDoc );
    // merge zweier Dokumente
    long MergeDoc( const SwDoc& rDoc );
    // setze Kommentar-Text fuers Redline, das dann per AppendRedline
    // hereinkommt. Wird vom Autoformat benutzt. 0-Pointer setzt den Modus
    // wieder zurueck. Die SequenceNummer ist fuers UI-seitige zusammen-
    // fassen von Redlines.
    void SetAutoFmtRedlineComment( const String* pTxt, sal_uInt16 nSeqNo = 0 );

    sal_Bool IsAutoFmtRedline() const           { return bIsAutoFmtRedline; }
    void SetAutoFmtRedline( sal_Bool bFlag )    { bIsAutoFmtRedline = bFlag; }

    // fuer AutoFormat: mit Undo/Redlining - Behandlung
    void SetTxtFmtCollByAutoFmt( const SwPosition& rPos, sal_uInt16 nPoolId,
                                const SfxItemSet* pSet = 0 );
    void SetFmtItemByAutoFmt( const SwPaM& rPam, const SfxPoolItem& );

    // !!!NUR fuer die SW-Textblocks!! beachtet kein LAYOUT!!!
    void ClearDoc();        // loescht den gesamten Inhalt.

    // erfrage / setze die Daten fuer die PagePreView
    const SwPagePreViewPrtData* GetPreViewPrtData() const { return pPgPViewPrtData; }
    // wenn der Pointer == 0 ist, dann wird im Doc der Pointer zerstoert,
    // ansonsten wird das Object kopiert.
    // Der Pointer geht NICHT in den Besitz des Doc's!!
    void SetPreViewPrtData( const SwPagePreViewPrtData* pData );

    // update all modified OLE-Objects. The modification is called over the
    // StarOne - Interface              --> Bug 67026
    void SetOLEObjModified()
    {   if( GetRootFrm() ) aOLEModifiedTimer.Start(); }

    // -------------------- Uno - Schnittstellen ---------------------------
    const SwUnoCrsrTbl& GetUnoCrsrTbl() const       { return *pUnoCrsrTbl; }
    SwUnoCrsr* CreateUnoCrsr( const SwPosition& rPos, sal_Bool bTblCrsr = sal_False );
    // -------------------- Uno - Schnittstellen ---------------------------

    // -------------------- FeShell - Schnittstellen -----------------------
    // !!!!! diese gehen immer davon aus, das ein Layout existiert  !!!!
    sal_Bool ChgAnchor( const SdrMarkList &rMrkList, int eAnchorId,
                        sal_Bool bSameOnly, sal_Bool bPosCorr );

    void SetRowHeight( const SwCursor& rCursor, const SwFmtFrmSize &rNew );
    void GetRowHeight( const SwCursor& rCursor, SwFmtFrmSize *& rpSz ) const;
    sal_Bool BalanceRowHeight( const SwCursor& rCursor, sal_Bool bTstOnly = sal_True );
    void SetRowBackground( const SwCursor& rCursor, const SvxBrushItem &rNew );
    sal_Bool GetRowBackground( const SwCursor& rCursor, SvxBrushItem &rToFill ) const;
    void SetTabBorders( const SwCursor& rCursor, const SfxItemSet& rSet );
    void SetTabLineStyle( const SwCursor& rCursor,
                          const Color* pColor, sal_Bool bSetLine,
                          const SvxBorderLine* pBorderLine );
    void GetTabBorders( const SwCursor& rCursor, SfxItemSet& rSet ) const;
    void SetBoxAttr( const SwCursor& rCursor, const SfxPoolItem &rNew );
    sal_Bool GetBoxBackground( const SwCursor& rCursor, SvxBrushItem &rToFill ) const;
    void SetBoxAlign( const SwCursor& rCursor, sal_uInt16 nAlign );
    sal_uInt16 GetBoxAlign( const SwCursor& rCursor ) const;
    void AdjustCellWidth( const SwCursor& rCursor, sal_Bool bBalance = sal_False );

    int Chainable( const SwFrmFmt &rSource, const SwFrmFmt &rDest );
    int Chain( SwFrmFmt &rSource, const SwFrmFmt &rDest );
    void Unchain( SwFrmFmt &rFmt );

    // fuers Copy/Move aus der FrmShell
    SdrObject* CloneSdrObj( const SdrObject&, sal_Bool bMoveWithinDoc = sal_False,
                            sal_Bool bInsInPage = sal_True );

    //
    // -------------------- FeShell - Schnittstellen Ende ------------------


    // Schnittstelle fuer die TextInputDaten - ( fuer die Texteingabe
    // von japanischen/chinesischen Zeichen)
    SwExtTextInput* CreateExtTextInput( const SwPaM& rPam );
    void DeleteExtTextInput( SwExtTextInput* pDel );
    SwExtTextInput* GetExtTextInput( const SwNode& rNd,
                                xub_StrLen nCntntPos = STRING_NOTFOUND) const;

    // Schnistelle fuer den Zugriff auf die AutoComplete-Liste
    static SwAutoCompleteWord& GetAutoCompleteWords() { return *pACmpltWords; }

    sal_Bool ContainsMSVBasic() const           { return bContains_MSVBasic; }
    void SetContainsMSVBasic( sal_Bool bFlag )  { bContains_MSVBasic = bFlag; }

    // ------------------- Zugriff auf Dummy-Member --------------------

    sal_Bool IsParaSpaceMax() const { return n8Dummy1 & DUMMY_PARASPACEMAX; }
    sal_Bool IsParaSpaceMaxAtPages() const { return n8Dummy1 & DUMMY_PARASPACEMAX_AT_PAGES; }
    void SetParaSpaceMax( sal_Bool bNew, sal_Bool bAtPages )
    {
        if( bNew ) n8Dummy1 |= DUMMY_PARASPACEMAX; else n8Dummy1 &= ~DUMMY_PARASPACEMAX;
        if( bAtPages ) n8Dummy1 |= DUMMY_PARASPACEMAX_AT_PAGES; else n8Dummy1 &= ~DUMMY_PARASPACEMAX_AT_PAGES;
    }

    void SetULongDummy1( sal_uInt32 n ) { n32Dummy1 = n; }
    void SetULongDummy2( sal_uInt32 n ) { n32Dummy2 = n; }
    void SetByteDummy1( sal_Int8 n ) { n8Dummy1 = n; }
    void SetByteDummy2( sal_Int8 n ) { n8Dummy2 = n; }
    void SetStringDummy1( const String& r ) { sDummy1 = r; }
    void SetStringDummy2( const String& r ) { sDummy2 = r; }
    sal_uInt32 GetULongDummy1() const { return n32Dummy1; }
    sal_uInt32 GetULongDummy2() const { return n32Dummy2; }
    sal_Int8 GetByteDummy1() const { return n8Dummy1; }
    sal_Int8 GetByteDummy2() const { return n8Dummy2; }
    const String& GetStringDummy1() const { return sDummy1; }
    const String& GetStringDummy2() const { return sDummy2; }

    // call back for API wrapper
    SwModify*   GetUnoCallBack() const;
};


// Diese Methode wird im Dtor vom SwDoc gerufen und loescht den Cache
// der Konturobjekte
void ClrContourCache();


//------------------ inline impl. ---------------------------------

inline const SwTableNode* SwDoc::IsIdxInTbl( const SwNodeIndex& rIdx ) const
{
    return ((SwDoc*)this)->IsIdxInTbl( rIdx );
}

inline SvNumberFormatter* SwDoc::GetNumberFormatter( sal_Bool bCreate )
{
    if( bCreate && !pNumberFormatter )
        _CreateNumberFormatter();
    return pNumberFormatter;
}

inline const SvNumberFormatter* SwDoc::GetNumberFormatter( sal_Bool bCreate ) const
{
    return ((SwDoc*)this)->GetNumberFormatter( bCreate );
}


// ist das NodesArray das normale vom Doc? (nicht das UndoNds, .. )
// Implementierung steht hier, weil man dazu Doc kennen muss!
inline sal_Bool SwNodes::IsDocNodes() const
{
    return this == &pMyDoc->GetNodes();
}



#endif  //_DOC_HXX
diff --git a/sw/inc/docary.hxx b/sw/inc/docary.hxx
new file mode 100644
index 0000000..d904c90
--- /dev/null
+++ b/sw/inc/docary.hxx
@@ -0,0 +1,166 @@
/*************************************************************************
 *
 *  $RCSfile: docary.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _DOCARY_HXX
#define _DOCARY_HXX

class SwFieldType;
class SwFrmFmt;
class SwCharFmt;
class SwBookmark;
class SwTOXType;
class SwUndo;
class SwSectionFmt;
class SwNumRule;
class SwRedline;
class SwUnoCrsr;
class SwOLENode;

#ifndef _SWTYPES_HXX //autogen
#include <swtypes.hxx>
#endif

#ifndef _SVARRAY_HXX //autogen
#include <svtools/svarray.hxx>
#endif

typedef SwFieldType* SwFldTypePtr;
#define GROW_FLDTYPES   16

//PageDescriptor-Schnittstelle
//typedef SwPageDesc * SwPageDescPtr;
//SV_DECL_PTRARR_DEL(SwPageDescs, SwPageDescPtr,1,1);

typedef SwFrmFmt* SwFrmFmtPtr;
SV_DECL_PTRARR_DEL(SwFrmFmts,SwFrmFmtPtr,4,4)

//Spezifische Frameformate (Rahmen, DrawObjecte)
SV_DECL_PTRARR_DEL(SwSpzFrmFmts,SwFrmFmtPtr,0,4)

typedef SwCharFmt* SwCharFmtPtr;
SV_DECL_PTRARR_DEL(SwCharFmts,SwCharFmtPtr,4,4)

SV_DECL_PTRARR_DEL( SwFldTypes, SwFldTypePtr, INIT_FLDTYPES, GROW_FLDTYPES )

//Bookmarks (nach Dokumentpositionen sortiertes Array)
typedef SwBookmark* SwBookmarkPtr;
SV_DECL_PTRARR_SORT(SwBookmarks, SwBookmarkPtr,0,1)

typedef SwTOXType* SwTOXTypePtr;
SV_DECL_PTRARR_DEL( SwTOXTypes, SwTOXTypePtr, 0, 1 )

// Undo
#define INIT_UNDOS 5
#define GROW_UNDOS 5
// Das Array der Undo-History
typedef SwUndo* SwUndoPtr;
SV_DECL_PTRARR_DEL( SwUndos, SwUndoPtr, INIT_UNDOS, GROW_UNDOS )

typedef SwSectionFmt* SwSectionFmtPtr;
SV_DECL_PTRARR_DEL(SwSectionFmts,SwSectionFmtPtr,0,4)


typedef SwNumRule* SwNumRulePtr;
SV_DECL_PTRARR_DEL( SwNumRuleTbl, SwNumRulePtr, 0, 5 )

typedef SwRedline* SwRedlinePtr;
SV_DECL_PTRARR_SORT_DEL( _SwRedlineTbl, SwRedlinePtr, 0, 16 )

class SwRedlineTbl : private _SwRedlineTbl
{
public:
    SwRedlineTbl( BYTE nSize = 0, BYTE nG = 16 )
        : _SwRedlineTbl( nSize, nG ) {}
    ~SwRedlineTbl() {}

    BOOL SavePtrInArr( SwRedlinePtr p ) { return _SwRedlineTbl::Insert( p ); }

    BOOL Insert( SwRedlinePtr& p, BOOL bIns = TRUE );
    BOOL Insert( SwRedlinePtr& p, USHORT& rInsPos, BOOL bIns = TRUE );
    BOOL InsertWithValidRanges( SwRedlinePtr& p, USHORT* pInsPos = 0 );

    void Remove( USHORT nP, USHORT nL = 1 );
    void DeleteAndDestroy( USHORT nP, USHORT nL=1 );

    // suche den naechsten oder vorherigen Redline mit dergleichen Seq.No
    // Mit dem Lookahead kann die Suche eingeschraenkt werden. 0 oder
    // USHRT_MAX suchen im gesamten Array.
    USHORT FindNextOfSeqNo( USHORT nSttPos, USHORT nLookahead = 20 ) const;
    USHORT FindPrevOfSeqNo( USHORT nSttPos, USHORT nLookahead = 20 ) const;
    USHORT FindNextSeqNo( USHORT nSeqNo, USHORT nSttPos,
                            USHORT nLookahead = 20 ) const;
    USHORT FindPrevSeqNo( USHORT nSeqNo, USHORT nSttPos,
                            USHORT nLookahead = 20 ) const;

    _SwRedlineTbl::Count;
    _SwRedlineTbl::operator[];
    _SwRedlineTbl::GetObject;
    _SwRedlineTbl::Seek_Entry;
    _SwRedlineTbl::GetPos;
};

typedef SwUnoCrsr* SwUnoCrsrPtr;
SV_DECL_PTRARR_DEL( SwUnoCrsrTbl, SwUnoCrsrPtr, 0, 4 )

typedef SwOLENode* SwOLENodePtr;
SV_DECL_PTRARR(SwOLENodes,SwOLENodePtr,16,16)


#endif  //_DOCARY_HXX
diff --git a/sw/inc/docfac.hxx b/sw/inc/docfac.hxx
new file mode 100644
index 0000000..d738883
--- /dev/null
+++ b/sw/inc/docfac.hxx
@@ -0,0 +1,85 @@
/*************************************************************************
 *
 *  $RCSfile: docfac.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _DOCFAC_HXX
#define _DOCFAC_HXX

#ifndef _SOLAR_H
#include <tools/solar.h>
#endif

class SwDoc;

class SwDocFac
{
protected:
    SwDoc* pDoc;

public:
    SwDocFac( SwDoc *pDoc = 0 );
    ~SwDocFac();

    // Das Dokument ist nach dem Aufruf von Read(..) angelegt
    SwDoc*  GetDoc();
    ULONG   Count() const;
};

#endif

diff --git a/sw/inc/docsh.hxx b/sw/inc/docsh.hxx
new file mode 100644
index 0000000..9c6af7b
--- /dev/null
+++ b/sw/inc/docsh.hxx
@@ -0,0 +1,303 @@
/*************************************************************************
 *
 *  $RCSfile: docsh.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWDOCSH_HXX
#define _SWDOCSH_HXX

#ifndef _TIMER_HXX //autogen
#include <vcl/timer.hxx>
#endif
#ifndef _SFX_OBJFAC_HXX //autogen
#include <sfx2/docfac.hxx>
#endif
#ifndef _SFX_INTERNO_HXX //autogen
#include <sfx2/interno.hxx>
#endif

#ifndef _SFX_OBJSH_HXX //autogen
#include <sfx2/objsh.hxx>
#endif
#ifndef SW_SWDLL_HXX
#include <swdll.hxx>
#endif
#include "shellid.hxx"

class   SwDoc;
class   Sw3Io;
class   SfxDocumentInfoDialog;
class   SfxStyleSheetBasePool;
class   FontList;
class   SwView;
class   SwWrtShell;
class   SwFEShell;
class   Reader;
class   SwReader;
class   SwCrsrShell;
class   SwSrcView;
class   SfxFileDialog;
class   PushButton;
class   FixedText;
class   SwPaM;

class SwDocShell: public SfxObjectShell, public SfxInPlaceObject,
                  public SfxListener
{
    SwDoc*                  pDoc;           // Document
    Sw3Io*                  pIo;            // Reader / Writer
    SfxStyleSheetBasePool*  pBasePool;      // Durchreiche fuer Formate
    FontList*               pFontList;      // aktuelle FontListe

    // Nix geht ohne die WrtShell (historische Gruende)
    // RuekwaertsPointer auf die View (historische Gruende)
    // Dieser gilt solange bis im Activate ein neuer gesetzt wird
    // oder dieser im Dtor der View geloescht wird
    //
    SwView*                 pView;
    SwWrtShell*             pWrtShell;

    Timer                   aFinishedTimer; // Timer fuers ueberpriefen der
                                            // Grafik-Links. Sind alle da,
                                            // dann ist Doc voll. geladen

    SvPersistRef            xOLEChildList;  // fuers RemoveOLEObjects

    // Methoden fuer den Zugriff aufs Doc
    void                    AddLink();
    void                    RemoveLink();

    // Hint abfangen fuer DocInfo
    virtual void            Notify( SfxBroadcaster& rBC, const SfxHint& rHint );

    // FileIO
    virtual BOOL            InitNew(SvStorage* pNewStor);
    virtual BOOL            Load(SvStorage* pStor);
    virtual BOOL            LoadFrom(SvStorage* pStor);
    virtual BOOL            ConvertFrom( SfxMedium &rMedium );
    virtual void            HandsOff();
    virtual BOOL            SaveAs(SvStorage * pNewStor );
    virtual BOOL            ConvertTo(SfxMedium &rMedium );
    virtual BOOL            SaveCompleted(SvStorage * pNewStor );
    virtual USHORT          PrepareClose( BOOL bUI = TRUE, BOOL bForBrowsing = FALSE );

    // DocInfo dem Doc melden
    //
    virtual SfxDocumentInfoDialog* CreateDocumentInfoDialog(
                                    Window *pParent, const SfxItemSet &);
    // Template-Btn
    Window*                 AddTemplateBtn(SfxFileDialog* pFileDlg);

    // OLE-Geraffel
    virtual void            Draw( OutputDevice*, const JobSetup&, USHORT);

    // Methoden fuer StyleSheets
    USHORT                  Edit( const String &rName, const String& rParent, USHORT nFamily,
                                    USHORT nMask, BOOL bNew,
                                    BOOL bColumn = FALSE,
                                    SwWrtShell* pActShell = 0,
                                    BOOL bBasic = FALSE );
    USHORT                  Delete(const String &rName, USHORT nFamily);
    USHORT                  ApplyStyles(const String &rName, USHORT nFamily, SwWrtShell* pShell = 0,
                                        USHORT nMode = 0 );
    USHORT                  DoWaterCan( const String &rName, USHORT nFamily);
    USHORT                  UpdateStyle(const String &rName, USHORT nFamily, SwWrtShell* pShell = 0);
    USHORT                  MakeByExample(const String &rName,
                                            USHORT nFamily, USHORT nMask, SwWrtShell* pShell = 0);

    void                    InitDraw();
    void                    SubInitNew();   // fuer InitNew und HtmlSourceModus
    inline void             SetWrtShell(SwWrtShell* pShell)
                                { pWrtShell = pShell; }

    void                    RemoveOLEObjects();

    DECL_STATIC_LINK( SwDocShell, IsLoadFinished, void* );
    DECL_LINK( SelTemplateHdl, PushButton * );

public:

    // aber selbst implementieren
    SFX_DECL_INTERFACE(SW_DOCSHELL);
    SFX_DECL_OBJECTFACTORY_DLL(SwDocShell, SW_DLL());
    TYPEINFO();

    static SfxInterface *_GetInterface() { return _GetInterfaceImpl(); }

    //Das Doc wird fuer SO-Datenaustausch benoetigt!
    SwDocShell(SfxObjectCreateMode eMode = SFX_CREATE_MODE_EMBEDDED);
    SwDocShell( SwDoc *pDoc, SfxObjectCreateMode eMode = SFX_CREATE_MODE_STANDARD );
    ~SwDocShell();

    // OLE 2.0-Benachrichtigung
    DECL_LINK( Ole2ModifiedHdl, void * );

    // OLE-Geraffel
    virtual void      SetVisArea( const Rectangle &rRect );
    virtual Rectangle GetVisArea( USHORT nAspect ) const;
    virtual Printer  *GetDocumentPrinter();
    virtual void      OnDocumentPrinterChanged( Printer * pNewPrinter );
    virtual ULONG     GetMiscStatus() const;

    virtual void            PrepareReload();
    virtual void            SetModified( BOOL = TRUE );

    // Dispatcher
    void                    Execute(SfxRequest &);
    void                    ExecStyleSheet(SfxRequest&);
    void                    ExecDB(SfxRequest&);

    void                    GetState(SfxItemSet &);
    void                    StateAlways(SfxItemSet &);
    void                    StateStyleSheet(SfxItemSet&, SwWrtShell* pSh = 0 );

    // Doc rausreichen aber VORSICHT
    inline SwDoc*           GetDoc() { return pDoc; }
    void                    UpdateFontList();
    void                    UpdateChildWindows();

    // DocumentInfo neu setzen
    BOOL                    SetDocumentInfo(const SfxDocumentInfo& rInfo);

    // globaler IO
    virtual BOOL            Save();

    // fuer VorlagenPI
    virtual SfxStyleSheetBasePool*  GetStyleSheetPool();

    // Fuer Organizer
    virtual BOOL Insert(SfxObjectShell &rSource,
                        USHORT  nSourceIdx1,
                        USHORT  nSourceIdx2,
                        USHORT  nSourceIdx3,
                        USHORT& nIdx1,
                        USHORT& nIdx2,
                        USHORT& nIdx3,
                        USHORT& nRemovedIdx);

    virtual BOOL Remove(USHORT nIdx1,
                        USHORT nIdx2 = INDEX_IGNORE,
                        USHORT nIdx3 = INDEX_IGNORE);

    virtual Bitmap      GetStyleFamilyBitmap( SfxStyleFamily eFamily );

    // View setzen fuer Aktionen ueber Shell
    void          SetView(SwView* pVw);
    const SwView *GetView() const { return pView; }

    // Zugriff auf die zur SwView gehoerige SwWrtShell
          SwWrtShell *GetWrtShell()       { return pWrtShell; }
    const SwWrtShell *GetWrtShell() const { return pWrtShell; }

    // fuer die Core - die kennt die DocShell aber keine WrtShell!
          SwFEShell *GetFEShell();
    const SwFEShell *GetFEShell() const
                { return ((SwDocShell*)this)->GetFEShell(); }


    // Fuer Einfuegen Dokument
    Reader* StartConvertFrom(SfxMedium& rMedium, SwReader** ppRdr,
                            SwCrsrShell* pCrsrSh = 0, SwPaM* pPaM = 0);

    // Anforderung der pIo-Struktur fuer den Zugriff auf Substorages
    // und Streams
    Sw3Io* GetIoSystem() { return pIo; }

    virtual long DdeGetData( const String& rItem, SvData& rData );
    virtual long DdeSetData( const String& rItem, const SvData& rData );
    virtual SvPseudoObject* DdeCreateHotLink( const String& rItem );
    virtual void        FillClass( SvGlobalName * pClassName,
                                   ULONG * pClipFormat,
                                   String * pAppName,
                                   String * pLongUserName,
                                   String * pUserName,
                                   long nVersion = SOFFICE_FILEFORMAT_NOW ) const;
    virtual void    FillRegInfo( SvEmbeddedRegistryInfo * );

    virtual SvDataMemberObjectRef CreateSnapshot();

    virtual void LoadStyles( SfxObjectShell& rSource );

    // Seitenvorlagedialog anzeigen, ggf. auf Spaltenpage
    void    FormatPage( const String& rPage,
                        BOOL bColumn = FALSE,
                        SwWrtShell*     pActShell = 0 );

    // Timer starten fuers ueberpruefen der Grafik-Links. Sind alle
    // vollstaendig geladen, dann ist das Doc fertig
    void StartLoadFinishedTimer();

    // eine Uebertragung wird abgebrochen (wird aus dem SFX gerufen)
    virtual void CancelTransfers();

    // Doc aus Html-Source neu laden
    void    ReloadFromHtml( const String& rStreamName, SwSrcView* pSrcView );

    // embedded alle lokalen Links (Bereiche/Grafiken)
    BOOL EmbedAllLinks();

    //Activate wait cursor for all windows of this document
    //Optionally all dispatcher could be Locked
    //Usually locking should be done using the class: SwWaitObject!
    void EnterWait( BOOL bLockDispatcher );
    void LeaveWait( BOOL bLockDispatcher );

    void    ToggleBrowserMode(BOOL bOn, SwView* pView = 0);
};

#endif
diff --git a/sw/inc/docstat.hxx b/sw/inc/docstat.hxx
new file mode 100644
index 0000000..4581e70
--- /dev/null
+++ b/sw/inc/docstat.hxx
@@ -0,0 +1,90 @@
/*************************************************************************
 *
 *  $RCSfile: docstat.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _DOCSTAT_HXX
#define _DOCSTAT_HXX

#ifndef _SOLAR_H
#include <tools/solar.h>
#endif

///////////////////////////////////////////////////////////////////////////
// PRODUCT: struct SwInternStat ist nur fuer CORE Interne Statistics und
//          hat nichts in einer ProductVersion zu suchen.
///////////////////////////////////////////////////////////////////////////

struct SwInternStat;

struct SwDocStat
{
    USHORT          nTbl;
    USHORT          nGrf;
    USHORT          nOLE;
    ULONG           nPage;
    ULONG           nPara;
    ULONG           nWord;
    ULONG           nChar;
    BOOL            bModified;
    SwInternStat*   pInternStat;
    SwDocStat();
    void Reset();
};

#endif
diff --git a/sw/inc/docstyle.hxx b/sw/inc/docstyle.hxx
new file mode 100644
index 0000000..709dda4
--- /dev/null
+++ b/sw/inc/docstyle.hxx
@@ -0,0 +1,261 @@
/*************************************************************************
 *
 *  $RCSfile: docstyle.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _DOCSTYLE_HXX
#define _DOCSTYLE_HXX

#ifndef _SVSTDARR_HXX
#define _SVSTDARR_STRINGSDTOR
#include <svtools/svstdarr.hxx>
#endif

#ifndef _SFXSTYLE_HXX //autogen
#include <svtools/style.hxx>
#endif

#ifndef _SFXITEMSET_HXX //autogen
#include <svtools/itemset.hxx>
#endif

class SwDoc;
class SwDocStyleSheetPool;
class SwPageDesc;
class SwCharFmt;
class SwTxtFmtColl;
class SwFrmFmt;
class SwNumRule;

/*--------------------------------------------------------------------
    Beschreibung:   Lokale Hilfsklasse
 --------------------------------------------------------------------*/
class SwPoolFmtList : public SvStringsDtor
{
public:
    SwPoolFmtList() {}
    void Append( char cChar, const String& rStr );
    void Erase();
};


/*--------------------------------------------------------------------
    Beschreibung:   temp. StyleSheet
 --------------------------------------------------------------------*/
class SwDocStyleSheet : public SfxStyleSheetBase
{
    friend class SwDocStyleSheetPool;
    friend class SwStyleSheetIterator;

    SwCharFmt*          pCharFmt;
    SwTxtFmtColl*       pColl;
    SwFrmFmt*           pFrmFmt;
    const SwPageDesc*   pDesc;
    const SwNumRule*    pNumRule;

    SwDoc&              rDoc;
    SfxItemSet          aCoreSet;

    BOOL                bPhysical;


    // leere Huelse zum richtigen StyleSheet (Core) machen
    void                Create();

    // den StyleSheet mit Daten fuellen
    enum FillStyleType {
        FillOnlyName,
        FillAllInfo,
        FillPhysical
    };
    BOOL                FillStyleSheet( FillStyleType eFType );


public:
    SwDocStyleSheet( SwDoc&                 rDoc,
                     const String&          rName,
                     SwDocStyleSheetPool&   rPool,
                     SfxStyleFamily         eFam,
                     USHORT                 nMask);

    SwDocStyleSheet( const SwDocStyleSheet& );
    virtual ~SwDocStyleSheet();

    void                    Reset();

    void                    SetMask(USHORT nMsk)            { nMask = nMsk;     }
    void                    SetFamily(SfxStyleFamily eFam)  { nFamily = eFam;   }

    BOOL                    IsPhysical() const              { return bPhysical; }
    void                    SetPhysical(BOOL bPhys);

    void                    SetItemSet(const SfxItemSet& rSet);

    virtual SfxItemSet&     GetItemSet();
    virtual const String&   GetParent() const;
    virtual const String&   GetFollow() const;

    virtual ULONG GetHelpId( String& rFile );
    virtual void SetHelpId( const String& r, ULONG nId );

    // Vorbelegen der member ohne physikalischen Zugriff
    // wird vom StyleSheetPool benutzt
    //
    void                    PresetName(const String& rName)  { aName   = rName; }
    void                    PresetNameAndFamily(const String& rName);
    void                    PresetParent(const String& rName){ aParent = rName; }
    void                    PresetFollow(const String& rName){ aFollow = rName; }

    virtual BOOL            SetName( const String& rStr);
    virtual BOOL            SetParent( const String& rStr);
    virtual BOOL            SetFollow( const String& rStr);

    virtual BOOL            HasFollowSupport() const;
    virtual BOOL            HasParentSupport() const;
    virtual BOOL            HasClearParentSupport() const;
    virtual String          GetDescription();
    virtual String          GetDescription(SfxMapUnit eUnit);

    SwCharFmt*              GetCharFmt();
    SwTxtFmtColl*           GetCollection();
    SwFrmFmt*               GetFrmFmt();
    const SwPageDesc*       GetPageDesc();
    const SwNumRule*        GetNumRule();
    void                    SetNumRule(const SwNumRule& rRule);

    virtual BOOL            IsUsed() const;
};

/*--------------------------------------------------------------------
    Beschreibung:   Iterator fuer den Pool
 --------------------------------------------------------------------*/

class SwStyleSheetIterator : public SfxStyleSheetIterator, public SfxListener
{
    SwDocStyleSheet     aIterSheet;
    SwDocStyleSheet     aStyleSheet;
    SwPoolFmtList       aLst;
    USHORT              nLastPos;
    BOOL                bFirstCalled;

    void                AppendStyleList(const SvStringsDtor& rLst,
                                        BOOL    bUsed,
                                        USHORT  nSection,
                                        char    cType);

public:
    SwStyleSheetIterator( SwDocStyleSheetPool* pBase,
                          SfxStyleFamily eFam, USHORT n=0xFFFF );
    virtual ~SwStyleSheetIterator();

    virtual USHORT Count();
    virtual SfxStyleSheetBase *operator[](USHORT nIdx);
    virtual SfxStyleSheetBase* First();
    virtual SfxStyleSheetBase* Next();
#ifndef ENABLEUNICODE
    virtual SfxStyleSheetBase* Find(const String& rStr);
#else
    virtual SfxStyleSheetBase* Find(const UniString& rStr);
#endif

    virtual void Notify( SfxBroadcaster&, const SfxHint& );
};

/*--------------------------------------------------------------------
    Beschreibung:   Pool fuer
 --------------------------------------------------------------------*/

class SwDocStyleSheetPool : public SfxStyleSheetBasePool
{
    SwDocStyleSheet     aStyleSheet;
    SwDoc&              rDoc;
    BOOL                bOrganizer : 1;     // TRUE: fuer den Organizer


    virtual SfxStyleSheetBase* Create( const String&, SfxStyleFamily, USHORT nMask);
    virtual SfxStyleSheetBase* Create( const SfxStyleSheetBase& );
public:
    SwDocStyleSheetPool( SwDoc&, BOOL bOrganizer = FALSE );
    virtual ~SwDocStyleSheetPool();

    virtual void Replace( SfxStyleSheetBase& rSource,
                          SfxStyleSheetBase& rTarget );
    virtual SfxStyleSheetBase& Make(const String&, SfxStyleFamily, USHORT nMask, USHORT nPos = 0xffff);
    virtual SfxStyleSheetBase* Find( const String&, SfxStyleFamily eFam,
                                    USHORT n=0xFFFF );
    virtual BOOL SetParent( SfxStyleFamily eFam, const String &rStyle,
                            const String &rParent );

    virtual void Erase( SfxStyleSheetBase* pStyle);
    void    SetItemSet(const SfxItemSet& rSet) { aStyleSheet.SetItemSet(rSet); }

    void    SetOrganizerMode( BOOL bMode )  { bOrganizer = bMode; }
    BOOL    IsOrganizerMode() const         { return bOrganizer; }

    virtual SfxStyleSheetIterator* CreateIterator( SfxStyleFamily,
                                                    USHORT nMask );

    SwDoc& GetDoc() const { return rDoc; }

    //Fuer die daemlicheren Compiler
private:
    SwDocStyleSheetPool( const SwDocStyleSheetPool& );
};


#endif
diff --git a/sw/inc/docufld.hxx b/sw/inc/docufld.hxx
new file mode 100644
index 0000000..516ebb2
--- /dev/null
+++ b/sw/inc/docufld.hxx
@@ -0,0 +1,818 @@
/*************************************************************************
 *
 *  $RCSfile: docufld.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _DOCUFLD_HXX
#define _DOCUFLD_HXX

#ifndef _DATE_HXX //autogen
#include <tools/date.hxx>
#endif

#include "fldbas.hxx"
#include "numrule.hxx"

class _SetGetExpFlds;
class SwTxtFld;
class SwFrm;

enum SwAuthorFormat
{
    AF_BEGIN,
    AF_NAME = AF_BEGIN,
    AF_SHORTCUT,
    AF_END,
    AF_FIXED = 0x8000
};

/*--------------------------------------------------------------------
    Beschreibung: Untertyp der Dokumentstatistik
 --------------------------------------------------------------------*/

enum SwDocStatSubType
{
    DS_BEGIN,
    DS_PAGE = DS_BEGIN,
    DS_PARA,
    DS_WORD,
    DS_CHAR,
    DS_TBL,
    DS_GRF,
    DS_OLE,
    DS_END
};

enum SwDocInfoSubType
{
    DI_SUBTYPE_BEGIN,
    DI_TITEL = DI_SUBTYPE_BEGIN,
    DI_THEMA,
    DI_KEYS,
    DI_COMMENT,
    DI_INFO1,
    DI_INFO2,
    DI_INFO3,
    DI_INFO4,
    DI_CREATE,
    DI_CHANGE,
    DI_PRINT,
    DI_DOCNO,
    DI_EDIT,
    DI_SUBTYPE_END
};

enum SwDocInfoExtSubType
{
    DI_SUB_AUTHOR   = 0x0100,
    DI_SUB_TIME     = 0x0200,
    DI_SUB_DATE     = 0x0300,
    DI_SUB_FIXED    = 0x1000
};

enum RegInfoFormat  // Nur noch zum laden alter Dokumente!!!
{
    RF_AUTHOR,
    RF_TIME,
    RF_DATE,
    RF_ALL
};

enum SwPageNumSubType
{
    PG_RANDOM,
    PG_NEXT,
    PG_PREV
};

enum SwExtUserSubType
{
    EU_COMPANY      /*EU_FIRMA*/,
    EU_FIRSTNAME    /*EU_VORNAME*/,
    EU_NAME         /*EU_NAME*/,
    EU_SHORTCUT     /*EU_ABK*/,
    EU_STREET       /*EU_STRASSE*/,
    EU_COUNTRY      /*EU_LAND*/,
    EU_ZIP          /*EU_PLZ*/,
    EU_CITY         /*EU_ORT*/,
    EU_TITLE        /*EU_TITEL*/,
    EU_POSITION     /*EU_POS*/,
    EU_PHONE_PRIVATE /*EU_TELPRIV*/,
    EU_PHONE_COMPANY /*EU_TELFIRMA*/,
    EU_FAX,
    EU_EMAIL,
    EU_STATE,
    EU_FATHERSNAME,
    EU_APARTMENT
};

enum SwJumpEditFormat
{
    JE_FMT_TEXT,
    JE_FMT_TABLE,
    JE_FMT_FRAME,
    JE_FMT_GRAPHIC,
    JE_FMT_OLE
};

/*--------------------------------------------------------------------
    Beschreibung: Seitennummer
 --------------------------------------------------------------------*/

class SwPageNumberFieldType : public SwFieldType
{
    SvxExtNumType   eNumFormat;
    USHORT          nNum, nMax;
    BOOL            bVirtuell;

public:
    SwPageNumberFieldType();

    String& Expand( ULONG nFmt, short nOff, const String&, String& rRet ) const;
    void ChangeExpansion( SwDoc* pDoc, USHORT nNum, USHORT nMax,
                            BOOL bVirtPageNum, const SvxExtNumType* pNumFmt = 0 );
    inline SvxExtNumType GetNumFormat() const { return eNumFormat; }
    virtual SwFieldType* Copy() const;
};

/*--------------------------------------------------------------------
    Beschreibung: Seitennummerierung
 --------------------------------------------------------------------*/

class SwPageNumberField : public SwField
{
    String  sUserStr;
    USHORT  nSubType;
    short   nOffset;

public:
    SwPageNumberField(SwPageNumberFieldType*, USHORT nSub = PG_RANDOM,
                      ULONG nFmt = 0, short nOff = 0);

    virtual String      Expand() const;
    virtual SwField*    Copy() const;

    virtual String      GetPar2() const;
    virtual void        SetPar2(const String& rStr);

    virtual USHORT      GetSubType() const;
    // virtual void        SetSubType(USHORT nSub); // OM: entfernt, da unbenoetigt und gefaehrlich
    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );

    const String& GetUserString() const         { return sUserStr; }
    void SetUserString( const String& rS )      { sUserStr = rS; }
};

/*--------------------------------------------------------------------
    Beschreibung: Autoren
 --------------------------------------------------------------------*/

class SwAuthorFieldType : public SwFieldType
{
    SwDoc *pDoc;
public:
    SwAuthorFieldType(SwDoc*);

    String                  Expand(ULONG) const;
    virtual SwFieldType*    Copy() const;
};

/*--------------------------------------------------------------------
    Beschreibung: AutorenFeld
 --------------------------------------------------------------------*/

class SwAuthorField : public SwField
{
    String  aContent;

public:
    SwAuthorField(SwAuthorFieldType*, ULONG nFmt = 0);

    virtual String      Expand() const;
    virtual SwField*    Copy() const;

    inline void         SetExpansion(const String& rStr) { aContent = rStr; }
    inline const String& GetContent() const { return aContent; }

    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );
};

/*--------------------------------------------------------------------
    Beschreibung: Filename
 --------------------------------------------------------------------*/

class SwFileNameFieldType : public SwFieldType
{
    SwDoc *pDoc;
public:
    SwFileNameFieldType(SwDoc*);

    String                  Expand(ULONG) const;
    virtual SwFieldType*    Copy() const;
};

/*--------------------------------------------------------------------
    Beschreibung: FileName
 --------------------------------------------------------------------*/

class SwFileNameField : public SwField
{
    String aContent;

public:
    SwFileNameField(SwFileNameFieldType*, ULONG nFmt = 0);

    virtual String      Expand() const;
    virtual SwField*    Copy() const;

    inline void         SetExpansion(const String& rStr) { aContent = rStr; }
    inline const String& GetContent() const { return aContent; }

    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );
};

/*--------------------------------------------------------------------
    Beschreibung: TemplName
 --------------------------------------------------------------------*/

class SwTemplNameFieldType : public SwFieldType
{
    SwDoc *pDoc;
public:
    SwTemplNameFieldType(SwDoc*);

    String                  Expand(ULONG) const;
    virtual SwFieldType*    Copy() const;
};

/*--------------------------------------------------------------------
    Beschreibung: TemplName
 --------------------------------------------------------------------*/

class SwTemplNameField : public SwField
{
public:
    SwTemplNameField(SwTemplNameFieldType*, ULONG nFmt = 0);

    virtual String      Expand() const;
    virtual SwField*    Copy() const;
    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );
};


/*--------------------------------------------------------------------
    Beschreibung: Docstatistik
 --------------------------------------------------------------------*/

class SwDocStatFieldType : public SwFieldType
{
    SwDoc*          pDoc;
    SvxExtNumType   eNumFormat;

public:
    SwDocStatFieldType(SwDoc*);
    String                  Expand(USHORT nSubType, ULONG nFmt) const;
    virtual SwFieldType*    Copy() const;

    inline SvxExtNumType    GetNumFormat() const        { return eNumFormat; }
    inline void             SetNumFormat( SvxExtNumType eFmt )  { eNumFormat = eFmt; }
};

/*--------------------------------------------------------------------
    Beschreibung: Dokumentstatistik
 --------------------------------------------------------------------*/

class SwDocStatField : public SwField
{
    USHORT nSubType;

public:
    SwDocStatField( SwDocStatFieldType*,
                    USHORT nSubType = 0, ULONG nFmt = 0);

    void ChangeExpansion( const SwFrm* pFrm );

    virtual String      Expand() const;
    virtual SwField*    Copy() const;

    virtual USHORT      GetSubType() const;
    virtual void        SetSubType(USHORT nSub);
    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );
};

/*--------------------------------------------------------------------
    Beschreibung: versteckter Text
 --------------------------------------------------------------------*/

class SwHiddenTxtFieldType : public SwFieldType
{
    BOOL bHidden;
public:
    SwHiddenTxtFieldType(BOOL bSetHidden = TRUE);

    virtual SwFieldType*    Copy() const;

    void                    SetHiddenFlag( BOOL bSetHidden = TRUE );
    inline BOOL             GetHiddenFlag() const { return bHidden; }
};

/*--------------------------------------------------------------------
    Beschreibung: Versteckter Text
 --------------------------------------------------------------------*/

class SwHiddenTxtField : public SwField
{
    String  aTRUETxt;           // Text wenn Bedingung TRUE
    String  aFALSETxt;          // Wenn Bedingung falsch
    String  aContent;           // Ausgewerteter DB-Text

    String  aCond;              // Bedingung
    USHORT  nSubType;

    BOOL    bCanToggle : 1;     // kann das Feld einzeln getoggelt werden?
    BOOL    bIsHidden  : 1;     // ist es nicht sichtbar?
    BOOL    bValid     : 1;     // DB-Feld evaluiert?

public:
    SwHiddenTxtField( SwHiddenTxtFieldType*,
                     BOOL   bConditional,
                     const  String& rCond,
                     const  String& rTxt,
                     BOOL   bHidden  = FALSE,
                     USHORT nSubType = TYP_HIDDENTXTFLD);

    SwHiddenTxtField( SwHiddenTxtFieldType*,
                      const String& rCond,
                      const String& rTrue,
                      const String& rFalse,
                      USHORT nSubType = TYP_HIDDENTXTFLD);

    virtual String      GetCntnt(BOOL bName = FALSE) const;
    virtual String      Expand() const;
    virtual SwField*    Copy() const;

    void                Evaluate(SwDoc*);

    inline void         SetValue(BOOL bHidden)  { bIsHidden = bHidden; }
    inline BOOL         GetValue() const        { return bIsHidden;    }
    inline BOOL         IsConditional() const   { return bCanToggle;   }
    inline BOOL         IsValid() const         { return bValid;       }
    String              GetColumnName(const String& rName);
    String              GetDBName(const String& rName, SwDoc *pDoc);

    // Condition
    virtual void        SetPar1(const String& rStr);
    virtual const String& GetPar1() const;

    // True/False - String
    virtual void        SetPar2(const String& rStr);
    virtual String      GetPar2() const;


    virtual USHORT      GetSubType() const;
    // virtual void        SetSubType(USHORT nSub); // OM: entfernt, da unbenoetigt und gefaehrlich
    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );
};

/*--------------------------------------------------------------------
    Beschreibung: Feld das zu einer Leerzeile (ohne Hoehe) expandiert
 --------------------------------------------------------------------*/

class SwHiddenParaFieldType : public SwFieldType
{
public:
    SwHiddenParaFieldType();

    virtual SwFieldType*    Copy() const;
};

/*--------------------------------------------------------------------
    Beschreibung: Versteckter Absatz
 --------------------------------------------------------------------*/

class SwHiddenParaField : public SwField
{
    String              aCond;
    BOOL                bIsHidden:1;
public:
    // Direkte Eingabe alten Wert loeschen
    SwHiddenParaField(SwHiddenParaFieldType*, const String& rCond);

    virtual String      Expand() const;
    virtual SwField*    Copy() const;

    void                SetHidden(BOOL bHidden)     { bIsHidden = bHidden; }
    BOOL                IsHidden() const            { return bIsHidden;    }

    // Bedingung erfragen/setzen
    virtual const String& GetPar1() const;
    virtual void        SetPar1(const String& rStr);
    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );
};

/*--------------------------------------------------------------------
    Beschreibung: Macro ausfuehren
 --------------------------------------------------------------------*/

class SwMacroFieldType : public SwFieldType
{
    SwDoc* pDoc;

public:
    SwMacroFieldType(SwDoc*);

    virtual SwFieldType*    Copy() const;
};

/*--------------------------------------------------------------------
    Beschreibung: Macrofeld
 --------------------------------------------------------------------*/

class SwMacroField : public SwField
{
    String  aMacro;
    String  aText;

public:
    // Direkte Eingabe alten Wert loeschen
    SwMacroField( SwMacroFieldType*, const String& rLibAndName,
                  const String& rTxt);

    inline const String& GetMacro() const { return aMacro; }
    String           GetLibName() const;
    String           GetMacroName() const;

    virtual String   GetCntnt(BOOL bName = FALSE) const;
    virtual String   Expand() const;
    virtual SwField* Copy() const;

    // Library und FileName
    virtual const String& GetPar1() const;
    virtual void    SetPar1(const String& rStr);

    // Macrotext
    virtual String  GetPar2() const;
    virtual void    SetPar2(const String& rStr);
    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );
};


/*--------------------------------------------------------------------
    Beschreibung: PostIts
 --------------------------------------------------------------------*/

class SwPostItFieldType : public SwFieldType
{
public:
    SwPostItFieldType();

    virtual SwFieldType*    Copy() const;
};

/*--------------------------------------------------------------------
    Beschreibung: PostIt
 --------------------------------------------------------------------*/

class SwPostItField : public SwField
{
    String  sTxt;       // die Anmerkung
    String  sAuthor;    // der Author
    Date    aDate;      // Datum ??/Zeit?? der Anmerkung

public:
    SwPostItField( SwPostItFieldType*,
                   const String& rAuthor, const String& rTxt, const Date& rDate);

    virtual String          Expand() const;
    virtual SwField*        Copy() const;

    inline const Date&      GetDate() const                 { return aDate; }
    inline void             SetDate( const Date& rDate )    { aDate = rDate;}

    // Author
    virtual const String&   GetPar1() const;
    virtual void            SetPar1(const String& rStr);

    // Text
    virtual String          GetPar2() const;
    virtual void            SetPar2(const String& rStr);
    const String&           GetTxt() const { return sTxt; }

    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );
};

/*--------------------------------------------------------------------
    Beschreibung: DokumentInfo
 --------------------------------------------------------------------*/

class SwDocInfoFieldType : public SwValueFieldType
{
public:
    SwDocInfoFieldType(SwDoc* pDc);

    String                  Expand(USHORT nSubType, ULONG nFormat, USHORT nLang) const;
    virtual SwFieldType*    Copy() const;
};

class SwDocInfoField : public SwValueField
{
    USHORT  nSubType;
    String  aContent;

public:
    SwDocInfoField(SwDocInfoFieldType*, USHORT nSub, ULONG nFmt=0);

    virtual void            SetSubType(USHORT);
    virtual USHORT          GetSubType() const;
    virtual void            SetLanguage(USHORT nLng);
    virtual String          Expand() const;
    virtual String          GetCntnt(BOOL bName = FALSE) const;
    virtual SwField*        Copy() const;

    inline void             SetExpansion(const String& rStr) { aContent = rStr; }
    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );
};

/*--------------------------------------------------------------------
    Beschreibung: erweiterte Benutzereinstellung
 --------------------------------------------------------------------*/


class SwExtUserFieldType : public SwFieldType
{
    String aData;
public:
    SwExtUserFieldType();

    inline const String&    GetData() const                 { return aData; }
    inline void             SetData(const String& rStr)     { aData = rStr; }

    String                  Expand(USHORT nSubType, ULONG nFormat) const;
    virtual SwFieldType*    Copy() const;
};

class SwExtUserField : public SwField
{
    String  aContent;
    USHORT  nType;

public:
    SwExtUserField(SwExtUserFieldType*, USHORT nSub, ULONG nFmt=0);

    virtual String      Expand() const;
    virtual SwField*    Copy() const;

    virtual USHORT      GetSubType() const;
    virtual void        SetSubType(USHORT nSub);

    inline void         SetExpansion(const String& rStr) { aContent = rStr; }
    inline const String& GetContent() const { return aContent; }

    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );
};


/*--------------------------------------------------------------------
    Beschreibung: Relatives Seitennummern - Feld
 --------------------------------------------------------------------*/

class SwRefPageSetFieldType : public SwFieldType
{
public:
    SwRefPageSetFieldType();

    virtual SwFieldType*    Copy() const;
    // ueberlagert, weil es nichts zum Updaten gibt!
    virtual void            Modify( SfxPoolItem *, SfxPoolItem * );
};

/*--------------------------------------------------------------------
    Beschreibung: Relative Seitennummerierung
 --------------------------------------------------------------------*/

class SwRefPageSetField : public SwField
{
    short   nOffset;
    BOOL    bOn;

public:
    SwRefPageSetField( SwRefPageSetFieldType*, short nOff = 0,
                        BOOL bOn = TRUE );

    virtual String      Expand() const;
    virtual SwField*    Copy() const;

    virtual String  GetPar2() const;
    virtual void    SetPar2(const String& rStr);

    BOOL IsOn() const               { return bOn; }
    void SetOn( BOOL bFlag )        { bOn = bFlag; }

    short GetOffset() const         { return nOffset; }
    void SetOffset( short nOff )    { nOffset = nOff; }
    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );
};

/*--------------------------------------------------------------------
    Beschreibung: relatives Seitennummern - Abfrage Feld
 --------------------------------------------------------------------*/

class SwRefPageGetFieldType : public SwFieldType
{
    SwDoc*          pDoc;
    SvxExtNumType   eNumFormat;

    void UpdateField( SwTxtFld* pTxtFld, _SetGetExpFlds& rSetList );

public:
    SwRefPageGetFieldType( SwDoc* pDoc );
    virtual SwFieldType*    Copy() const;

    // ueberlagert, um alle RefPageGet-Felder zu updaten
    virtual void Modify( SfxPoolItem *, SfxPoolItem * );
    USHORT MakeSetList( _SetGetExpFlds& rTmpLst );

    SvxExtNumType   GetNumFormat() const            { return eNumFormat; }
    void            SetNumFormat( SvxExtNumType eFmt )  { eNumFormat = eFmt; }
    SwDoc*  GetDoc() const                  { return pDoc; }
};

/*--------------------------------------------------------------------
    Beschreibung: Relative Seitennummerierung Abfragen
 --------------------------------------------------------------------*/

class SwRefPageGetField : public SwField
{
    String sTxt;
public:
    SwRefPageGetField( SwRefPageGetFieldType*, ULONG nFmt );

    virtual String      Expand() const;
    virtual SwField*    Copy() const;

    void SetText( const String& rTxt )      { sTxt = rTxt; }
    const String& GetText() const           { return sTxt; }

    void ChangeExpansion( const SwFrm* pFrm, const SwTxtFld* pFld );
    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );
};

/*--------------------------------------------------------------------
    Beschreibung: Feld zum Anspringen und Editieren
 --------------------------------------------------------------------*/

class SwJumpEditFieldType : public SwFieldType
{
    SwDoc* pDoc;
    SwDepend aDep;

public:
    SwJumpEditFieldType( SwDoc* pDoc );
    virtual SwFieldType*    Copy() const;

          SwDoc* GetDoc()               { return pDoc; }
    const SwDoc* GetDoc() const         { return pDoc; }

    SwCharFmt* GetCharFmt();
};

class SwJumpEditField : public SwField
{
    String sTxt, sHelp;
public:
    SwJumpEditField( SwJumpEditFieldType*, ULONG nFormat,
                    const String& sText, const String& sHelp );

    virtual String      Expand() const;
    virtual SwField*    Copy() const;

    // Platzhalter-Text
    virtual const String& GetPar1() const;
    virtual void    SetPar1(const String& rStr);

    // HinweisText
    virtual String  GetPar2() const;
    virtual void    SetPar2(const String& rStr);

    SwCharFmt* GetCharFmt() const
        { return ((SwJumpEditFieldType*)GetTyp())->GetCharFmt(); }
    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );
};

/*--------------------------------------------------------------------
    Beschreibung: PostIts
 --------------------------------------------------------------------*/

class SwScriptFieldType : public SwFieldType
{
    SwDoc* pDoc;
public:
    SwScriptFieldType( SwDoc* pDoc );

    virtual SwFieldType*    Copy() const;
};

/*--------------------------------------------------------------------
    Beschreibung: PostIt
 --------------------------------------------------------------------*/

class SwScriptField : public SwField
{
    String  sType;      // Type von Code (Java/VBScript/...)
    String  sCode;      // der Code als Text
                        // der Code als JavaCode ?

    BOOL    bCodeURL;   // Code enthaelt URL eines Scripts

public:
    SwScriptField( SwScriptFieldType*, const String& rType,
                   const String& rCode, BOOL bURL=FALSE );

    virtual String          Expand() const;
    virtual SwField*        Copy() const;

    // Type
    virtual const String&   GetPar1() const;
    virtual void            SetPar1(const String& rStr);
    // Text
    virtual String          GetPar2() const;
    virtual void            SetPar2(const String& rStr);
    const String&           GetCode() const { return sCode; }

    BOOL                    IsCodeURL() const { return bCodeURL; }
    void                    SetCodeURL( BOOL bURL ) { bCodeURL = bURL; }
    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );
};


#endif // _DOCUFLD_HXX
diff --git a/sw/inc/dpage.hxx b/sw/inc/dpage.hxx
new file mode 100644
index 0000000..e865bac
--- /dev/null
+++ b/sw/inc/dpage.hxx
@@ -0,0 +1,100 @@
/*************************************************************************
 *
 *  $RCSfile: dpage.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _DPAGE_HXX
#define _DPAGE_HXX

#ifndef _FM_FMPAGE_HXX
#include <svx/fmpage.hxx>
#endif

#ifndef _SVDOBJ_HXX
#include <svx/svdobj.hxx>
#endif

class SdrPageGridFrameList;
class SwDrawDocument;

class SwDPage : public FmFormPage, public SdrObjUserCall
{
    SdrPageGridFrameList *pGridLst;

public:
    SwDPage(SwDrawDocument& rNewModel, BOOL bMasterPage=FALSE);
    ~SwDPage();

    virtual Point GetOffset() const;
    virtual SdrObject* ReplaceObject( SdrObject* pNewObj, ULONG nObjNum );

    virtual void    RequestBasic();

    virtual const SdrPageGridFrameList* GetGridFrameList(const SdrPageView* pPV,
                                    const Rectangle *pRect) const;

    virtual String GetLinkData( const String& rLinkName );
    virtual void SetLinkData( const String& rLinkName, const String& rLinkData );

    BOOL RequestHelp( Window* pWindow, SdrView* pView, const HelpEvent& rEvt );
};

#endif     // _DPAGE_HXX



diff --git a/sw/inc/edglbldc.hxx b/sw/inc/edglbldc.hxx
new file mode 100644
index 0000000..9b1047b
--- /dev/null
+++ b/sw/inc/edglbldc.hxx
@@ -0,0 +1,113 @@
/*************************************************************************
 *
 *  $RCSfile: edglbldc.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _EDGLBLDC_HXX
#define _EDGLBLDC_HXX

#ifndef _SVARRAY_HXX //autogen
#include <svtools/svarray.hxx>
#endif

class SwSection;
class SwTOXBase;
class SwTOXBaseSection;

enum GlobalDocContentType {
    GLBLDOC_UNKNOWN,
    GLBLDOC_TOXBASE,
    GLBLDOC_SECTION
};

class SwGlblDocContent
{
    GlobalDocContentType eType;
    ULONG nDocPos;
    union {
        const SwTOXBase* pTOX;
        const SwSection* pSect;
    } PTR;

public:
    SwGlblDocContent( ULONG nPos );
    SwGlblDocContent( const SwTOXBaseSection* pTOX );
    SwGlblDocContent( const SwSection* pSect );

    // Inhalte abfragen
    GlobalDocContentType GetType() const { return eType; }
    const SwSection* GetSection() const
                            { return GLBLDOC_SECTION == eType ? PTR.pSect : 0; }
    const SwTOXBase* GetTOX() const
                            { return GLBLDOC_TOXBASE == eType ? PTR.pTOX : 0; }
    ULONG GetDocPos() const { return nDocPos; }

    // fuers Sortieren
    inline int operator==( const SwGlblDocContent& rCmp )
        {   return GetDocPos() == rCmp.GetDocPos(); }
    inline int operator<( const SwGlblDocContent& rCmp )
        {   return GetDocPos() < rCmp.GetDocPos(); }
};


typedef SwGlblDocContent* SwGlblDocContentPtr;
SV_DECL_PTRARR_SORT_DEL( SwGlblDocContents, SwGlblDocContentPtr, 10, 10 );



#endif
diff --git a/sw/inc/edimp.hxx b/sw/inc/edimp.hxx
new file mode 100644
index 0000000..2b463ad
--- /dev/null
+++ b/sw/inc/edimp.hxx
@@ -0,0 +1,124 @@
/*************************************************************************
 *
 *  $RCSfile: edimp.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _EDIMP_HXX
#define _EDIMP_HXX

#include "crsrsh.hxx"
#include "doc.hxx"
#include "viscrs.hxx"

/*
 * MACROS um ueber alle Bereiche zu iterieren
 */
#define PCURCRSR (_pStartCrsr)

#define FOREACHPAM_START(pCURSH) \
    {\
        SwPaM *_pStartCrsr = (pCURSH)->GetCrsr(), *__pStartCrsr = _pStartCrsr; \
        do {

#define FOREACHPAM_END() \
        } while( (_pStartCrsr=(SwPaM *)_pStartCrsr->GetNext()) != __pStartCrsr ); \
    }


#define FOREACHCURSOR_START(pCURSH) \
    {\
        SwShellCrsr *_pStartCrsr = *(pCURSH)->GetSwCrsr(), *__pStartCrsr = _pStartCrsr; \
        do {

#define FOREACHCURSOR_END() \
        } while( (_pStartCrsr=*(SwCursor*)_pStartCrsr->GetNext()) != __pStartCrsr ); \
    }


struct SwPamRange
{
    ULONG nStart, nEnd;

    SwPamRange() : nStart( 0 ), nEnd( 0 )   {}
    SwPamRange( ULONG nS, ULONG nE ) : nStart( nS ), nEnd( nE ) {}

    BOOL operator==( const SwPamRange& rRg )
        { return nStart == rRg.nStart ? TRUE : FALSE; }
    BOOL operator<( const SwPamRange& rRg )
        { return nStart < rRg.nStart ? TRUE : FALSE; }
};

SV_DECL_VARARR_SORT( _SwPamRanges, SwPamRange, 0, 1 )

class SwPamRanges : private _SwPamRanges
{
public:
    SwPamRanges( const SwPaM& rRing );

    void Insert( const SwNodeIndex& rIdx1, const SwNodeIndex& rIdx2 );
    SwPaM& SetPam( USHORT nArrPos, SwPaM& rPam );

    USHORT Count() const
                {   return _SwPamRanges::Count(); }
    SwPamRange operator[]( USHORT nPos ) const
                { return _SwPamRanges::operator[](nPos); }
};


#endif
diff --git a/sw/inc/editsh.hxx b/sw/inc/editsh.hxx
new file mode 100644
index 0000000..652aa39
--- /dev/null
+++ b/sw/inc/editsh.hxx
@@ -0,0 +1,956 @@
/*************************************************************************
 *
 *  $RCSfile: editsh.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _EDITSH_HXX
#define _EDITSH_HXX

#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif
#ifndef _SVARRAY_HXX //autogen
#include <svtools/svarray.hxx>
#endif
#ifndef _SV_FONT_HXX //autogen
#include <vcl/font.hxx>
#endif
#ifndef _SVXSWAFOPT_HXX
#include <svx/swafopt.hxx>
#endif
#ifndef _CRSRSH_HXX
#include <crsrsh.hxx>   // fuer Basisklasse
#endif
#ifndef _ITABENUM_HXX
#include <itabenum.hxx>
#endif
#ifndef _COM_SUN_STAR_LINGUISTIC_XSPELLALTERNATIVES_HPP_
#include <com/sun/star/linguistic/XSpellAlternatives.hpp>
#endif
#ifndef _COM_SUN_STAR_LINGUISTIC_XSPELLCHECKER1_HPP_
#include <com/sun/star/linguistic/XSpellChecker1.hpp>
#endif
#ifndef _COM_SUN_STAR_LINGUISTIC_XHYPHENATOR_HPP_
#include <com/sun/star/linguistic/XHyphenator.hpp>
#endif

class PolyPolygon;
class SwDoc;
class DateTime;
class CommandExtTextInputData;

class SvNumberFormatter;
class SfxPoolItem;
class SfxItemSet;
class SvxLinkManager;
class SvxAutoCorrect;

class SwField;          // fuer Felder
class SwFieldType;
class SwDDEFieldType;
class SwNewDBMgr;

struct SwDocStat;
class SfxDocumentInfo;
class SvStringsDtor;
class SvStringsSort;
class SwAutoCompleteWord;

class SwFmtRefMark;
class SwFmtCol;
class SwNumRule;        // Numerierung
class SwNodeNum;        // Numerierung
class SwUndoIds;        // fuer Undo
class SwTxtFmtColl;
#ifdef USED
class SwGrfFmt;
class SwGrfFmtColl;
#endif
class SwGrfNode;
class SwFlyFrmFmt;

class SwFrmFmt;         // fuer GetTxtNodeFmts()
class SwCharFmt;
class SwExtTextInput;
class SwTxtNode;        // fuer IsNotMakeTxtNode
class SwRootFrm;        // fuer CTOR
class Graphic;          // fuer GetGraphic
class GraphicObject;    // fuer GetGraphicObj
class SwFmtINetFmt;     // InsertURL
class SvInPlaceObjectRef;
class SvInPlaceObject;
class SwTable;
class SwTextBlocks;     // fuer GlossaryRW
class SwBlockExceptList;
class SwFmtFtn;
class SpellCheck;
class SwSection;
class SwSectionFmt;
class SwTOXMarks;
class SwTOXBase;
class SwTOXType;
class SwTableAutoFmt;
class SwPageDesc;
class SchMemChart;
class Font;
class SwTxtINetFmt;
class SwSeqFldList;
class SwGlblDocContent;
class SwGlblDocContents;
class SwRedline;
class SwRedlineData;
class SwFtnInfo;
class SwEndNoteInfo;
class SwLineNumberInfo;
class SwAttrSet;
class SwAuthEntry;

#define GETSELTXT_PARABRK_TO_BLANK      0
#define GETSELTXT_PARABRK_KEEP          1
#define GETSELTXT_PARABRK_TO_ONLYCR     2

/****************************************************************
 *  zum Abfragen der INet-Attribute fuer den Navigator
 ****************************************************************/
struct SwGetINetAttr
{
    String sText;
    const SwTxtINetFmt& rINetAttr;

    SwGetINetAttr( const String& rTxt, const SwTxtINetFmt& rAttr )
        : sText( rTxt ), rINetAttr( rAttr )
    {}
};
SV_DECL_PTRARR_DEL( SwGetINetAttrs, SwGetINetAttr*, 0, 5 )

/****************************************************************
 *  Typen der Inhaltsformen
 ****************************************************************/
#define CNT_TXT 0x0001
#define CNT_GRF 0x0002
#define CNT_OLE 0x0010
/* Teste einen USHORT auf eine bestimmte Inhaltsform */
#define CNT_HasTxt(USH) ((USH)&CNT_TXT)
#define CNT_HasGrf(USH) ((USH)&CNT_GRF)
#define CNT_HasOLE(USH) ((USH)&CNT_OLE)

class SwEditShell: public SwCrsrShell
{
    static SvxSwAutoFmtFlags* pAutoFmtFlags;

    // fuer die privaten Methoden DelRange und die vom AutoCorrect
    friend class SwAutoFormat;
    friend void _InitCore();
    friend void _FinitCore();
    // fuer die PamCorrAbs/-Rel Methoden
    friend class SwUndo;

    SfxPoolItem& _GetChrFmt( SfxPoolItem& ) const;

    /*
     * liefert einen Pointer auf einen SwGrfNode; dieser wird von
     * GetGraphic() und GetGraphicSize() verwendet.
     */
    SwGrfNode *_GetGrfNode() const ;

    void DeleteSel( SwPaM& rPam, BOOL* pUndo = 0 );

    void _SetSectionAttr( SwSectionFmt& rSectFmt, const SfxItemSet& rSet );

public:
    // Editieren (immer auf allen selektierten Bereichen)
    void Insert( sal_Unicode );
    void Insert( const String &);
    void Overwrite( const String & );

    // Ersetz einen selektierten Bereich in einem TextNode mit dem
    // String. Ist fuers Suchen&Ersetzen gedacht.
    // bRegExpRplc - ersetze Tabs (\\t) und setze den gefundenen String
    //               ein ( nicht \& )
    //              z.B.: Fnd: "zzz", Repl: "xx\t\\t..&..\&"
    //                      --> "xx\t<Tab>..zzz..&"
    BOOL Replace( const String& rNewStr, BOOL bRegExpRplc = FALSE );

    // loescht den Inhalt aller Bereiche;
    // werden ganze Nodes selektiert, werden die Nodes geloescht
    long Delete();

    // Voellig private Methode. Nur fuer JOE's-Wizzards
    BOOL DelFullPara();

    // loesche den nicht sichtbaren Content aus dem Document, wie z.B.:
    // versteckte Bereiche, versteckte Absaetze
    BOOL RemoveInvisibleContent();

    // embedded alle lokalen Links (Bereiche/Grafiken)
    BOOL EmbedAllLinks();
    USHORT GetLinkUpdMode(BOOL bDocSettings = FALSE) const;
    void SetLinkUpdMode( USHORT nMode );

    // verschiebe den Inhalt aller Bereiche an die akt. Cursor-Position
    long Move();

    // kopiere den Inhalt aller Bereiche an die akt. Cursor-Position
    // in die angegebene Shell
    long Copy( SwEditShell* pDestShell = 0 );

    // fuers Kopieren uebers ClipBoard:
    //  wird Tabelle in Tabelle kopiert, verschiebe aus dieser dann
    //  alle Cursor. Copy und Paste muss aufgrund der FlyFrames in
    //  der FEShell stehen!
    // kopiere alle Selectionen und das Doc
    //JP 21.10.96: und fuer die SVX-Autokorrektur
    BOOL _CopySelToDoc( SwDoc* pInsDoc, SwNodeIndex* pNdInsPos = 0 );

    long SplitNode( BOOL bAutoFormat = FALSE, BOOL bCheckTableStart = TRUE );
    void AutoFmtBySplitNode();

    // ist der Cursor in einem INetAttribut, dann wird das komplett
    // geloescht; inclusive des Hinweistextes (wird beim Drag&Drop gebraucht)
    BOOL DelINetAttrWithText();

    // ist der Cursor am Ende einer Zeichenvorlage, an der das DontExpand-Flag
    // noch nicht gesetzt ist, wird dies gesetzt ( => return TRUE; )
    BOOL DontExpandFmt();

    // Anwenden / Entfernen von Attributen
    // liefert Attribute im angeforderten AttributSet. Wenn nicht eindeutig
    // steht im Set ein DONT_CARE !!
    BOOL GetAttr( SfxItemSet& ) const;
    void SetAttr( const SfxPoolItem&, USHORT nFlags = 0 );
    void SetAttr( const SfxItemSet&, USHORT nFlags = 0 );

    // Setze das Attribut als neues default Attribut im Dokument.
    void SetDefault( const SfxPoolItem& );

    // Erfrage das Default Attribut vom Dokument.
    const SfxPoolItem& GetDefault( USHORT nFmtHint ) const;

    void ResetAttr();
    void GCAttr();

    // FrameFormate
    SwFrmFmt* FindFrmFmtByName( const String& rName ) const;

    // TABLE
    USHORT GetTblFrmFmtCount( BOOL bUsed = FALSE ) const;
    SwFrmFmt& GetTblFrmFmt(USHORT nFmt, BOOL bUsed = FALSE ) const;
    String GetUniqueTblName() const;

    // CHAR
    USHORT GetCharFmtCount() const;
    SwCharFmt& GetCharFmt(USHORT nFmt) const;
    SwCharFmt* GetCurCharFmt() const;
    void FillByEx(SwCharFmt*, BOOL bReset = FALSE);
    SwCharFmt* MakeCharFmt( const String& rName, SwCharFmt* pDerivedFrom = 0 );
    SwCharFmt* FindCharFmtByName( const String& rName ) const;


    /* Formatcollections, neu */
    /* GetXXXCount() liefert die Anzahl der im Dokument vorhandenen XXX
     * GetXXX(i)     liefert das i-te XXX (ERR_RAISE bei Ueberindizierung!)
     * DelXXX(i)     loescht das i-te XXX (ERR_RAISE bei Ueberindizierung!)
     * GetCurXXX()   liefert das am Cursor oder in den Bereichen
     *               geltende XXX (0, wenn nicht eindeutig!)
     * SetXXX()      setzt am Cursor oder in den Bereichen das XXX
     * MakeXXX()     macht ein XXX, abgeleitet vom pDerivedFrom
     */

    // TXT
    SwTxtFmtColl& GetDfltTxtFmtColl() const;
    USHORT GetTxtFmtCollCount() const;
    SwTxtFmtColl& GetTxtFmtColl( USHORT nTxtFmtColl) const;
    SwTxtFmtColl* GetCurTxtFmtColl() const;
    void SetTxtFmtColl(SwTxtFmtColl*);
    SwTxtFmtColl *MakeTxtFmtColl(const String &rFmtCollName,
        SwTxtFmtColl *pDerivedFrom = 0);
    void FillByEx(SwTxtFmtColl*, BOOL bReset = FALSE);
    SwTxtFmtColl* FindTxtFmtCollByName( const String& rName ) const;
#ifdef USED
    // GRF
    USHORT GetGrfFmtCollCount() const;
    SwGrfFmtColl& GetGrfFmtColl( USHORT nGrfFmtColl) const;
    void DelGrfFmtColl(USHORT nFmt);
    SwGrfFmtColl* GetCurGrfFmtColl() const;
    void SetGrfFmtColl(SwGrfFmtColl*);
    SwGrfFmtColl *MakeGrfFmtColl(const String &rFmtCollName,
        SwGrfFmtColl *pDerivedFrom = 0);
    SwGrfFmtColl* FindGrfFmtCollByName( const String& rName ) const;
#endif

        // Gebe die "Auto-Collection" mit der Id zurueck. Existiert
        // sie noch nicht, dann erzuege sie
    SwTxtFmtColl* GetTxtCollFromPool( USHORT nId );
        // return das geforderte automatische  Format - Basis-Klasse !
    SwFmt* GetFmtFromPool( USHORT nId );
        // returne die geforderte automatische Seiten-Vorlage
    SwPageDesc* GetPageDescFromPool( USHORT nId );
        // returne die geforderte automatische NumRule
    SwNumRule* GetNumRuleFromPool( USHORT nId );

    // erfrage ob die Absatz-/Zeichen-/Rahmen-/Seiten - Vorlage benutzt wird
    BOOL IsUsed( const SwModify& ) const;
    BOOL IsUsed( const SwNumRule& ) const;
        // ist der Name ein Pool-Vorlagen-Name, returne seine ID,
        // sonst USHRT_MAX
    USHORT GetPoolId( const String& rName, SwGetPoolIdFromName eFlag ) const;

    const SvStringsDtor& GetChrFmtNmArray() const;
    const SvStringsDtor& GetHTMLChrFmtNmArray() const;

        // returne das geforderte automatische Format
    SwFrmFmt* GetFrmFmtFromPool( USHORT nId )
        { return (SwFrmFmt*)SwEditShell::GetFmtFromPool( nId ); }
    SwCharFmt* GetCharFmtFromPool( USHORT nId )
        { return (SwCharFmt*)SwEditShell::GetFmtFromPool( nId ); }

    // Felder
    void Insert(SwField&);
    SwField* GetCurFld() const;

    void UpdateFlds( SwField & );       // ein einzelnes Feld

    USHORT GetFldTypeCount(USHORT nResId = USHRT_MAX, BOOL bUsed = FALSE) const;
    SwFieldType* GetFldType(USHORT nId, USHORT nResId = USHRT_MAX, BOOL bUsed = FALSE) const;
    SwFieldType* GetFldType(USHORT nResId, const String& rName) const;

    void RemoveFldType(USHORT nId, USHORT nResId = USHRT_MAX);
    void RemoveFldType(USHORT nResId, const String& rName);
    BOOL RenameUserFields(const String& rOldName, const String& rNewName);

    void FieldToText( SwFieldType* pType );

    void ChangeAuthorityData(const SwAuthEntry* pNewData);

    // Datenbankinfo
    String GetDBName() const;
    const String& GetDBDesc() const;
    void ChgDBName(const String& rNewName);
    void ChangeDBFields( const SvStringsDtor& rOldNames,
                         const String& rNewName );
    void GetAllUsedDB( SvStringsDtor& rDBNameList,
                        SvStringsDtor* pAllDBNames = 0 );

    void UpdateExpFlds(BOOL bCloseDB = FALSE);// nur alle ExpressionFelder updaten
    void SetFixFields( BOOL bOnlyTimeDate = FALSE,
                        const DateTime* pNewDateTime = 0 );
    void LockExpFlds();
    void UnlockExpFlds();
    BOOL IsExpFldsLocked() const;

    USHORT GetFldUpdateFlags(BOOL bDocSettings = FALSE) const;
    void SetFldUpdateFlags( USHORT eFlags );

    // fuer die Evaluierung der DBFelder (neuer DB-Manager)
    SwNewDBMgr* GetNewDBMgr() const;

    SwFieldType* InsertFldType(const SwFieldType &);

    // Aenderungen am Dokument?
    BOOL IsModified() const;
    void SetModified();
    void ResetModified();
    void SetUndoNoResetModified();

    // Dokument - Statistics
    void UpdateDocStat( SwDocStat& rStat );

    // Dokument - Info
    const SfxDocumentInfo* GetInfo() const;

    // Verzeichnismarke einfuegen loeschen
    void    Insert(const SwTOXMark& rMark);
    void    DeleteTOXMark(SwTOXMark* pMark);

    // Alle Markierungen am aktuellen SPoint ermitteln
    USHORT  GetCurTOXMarks(SwTOXMarks& rMarks) const ;

    // Verzeichnis einfuegen, und bei Bedarf erneuern
    void                InsertTableOf(const SwTOXBase& rTOX,
                                        const SfxItemSet* pSet = 0);
    BOOL                UpdateTableOf(const SwTOXBase& rTOX,
                                        const SfxItemSet* pSet = 0);
    const SwTOXBase*    GetCurTOX() const;
    const SwAttrSet&    GetTOXBaseAttrSet(const SwTOXBase& rTOX) const;
    const SwTOXBase*    GetDefaultTOXBase( TOXTypes eTyp, BOOL bCreate = FALSE );
    void                SetDefaultTOXBase(const SwTOXBase& rBase);

    BOOL                IsTOXBaseReadonly(const SwTOXBase& rTOXBase) const;
    void                SetTOXBaseReadonly(const SwTOXBase& rTOXBase, BOOL bReadonly);

    USHORT              GetTOXCount() const;
    const SwTOXBase*    GetTOX( USHORT nPos ) const;
    BOOL                DeleteTOX( const SwTOXBase& rTOXBase, BOOL bDelNodes = FALSE );
    BOOL                DeleteCurTOX();

    String GetUniqueTOXBaseName( const SwTOXType& rType,
                                const String* pChkStr = 0 ) const;

    BOOL SetTOXBaseName(const SwTOXBase& rTOXBase, const String& rName);
    void SetTOXBaseProtection(const SwTOXBase& rTOXBase, BOOL bProtect);

    // nach einlesen einer Datei alle Verzeichnisse updaten
    void SetUpdateTOX( BOOL bFlag = TRUE );
    BOOL IsUpdateTOX() const;

    // Verzeichnis-Typen verwalten
    USHORT              GetTOXTypeCount(TOXTypes eTyp) const;
    const SwTOXType*    GetTOXType(TOXTypes eTyp, USHORT nId) const;
    void                InsertTOXType(const SwTOXType& rTyp);

    //AutoMark file
    const String&   GetTOIAutoMarkURL() const;
    void            SetTOIAutoMarkURL(const String& rSet);
    void            ApplyAutoMark();

    // Schluessel fuer die Indexverwaltung
    USHORT GetTOIKeys( SwTOIKeyType eTyp, SvStringsSort& rArr ) const;

    void SetOutlineNumRule(const SwNumRule&);
    const SwNumRule* GetOutlineNumRule() const;
    // Gliederung - hoch-/runterstufen
    BOOL OutlineUpDown( short nOffset = 1 );
    // Gliederung - hoch-/runtermoven
    BOOL MoveOutlinePara( short nOffset = 1);
    // Outlines and SubOutline are protected ?
    BOOL IsProtectedOutlinePara() const;

    // Numerierung Aufzaehlunglisten
    // liefert Regelwerk der aktuellen Aufzaehlung (FALSE sonst)
    const SwNumRule* GetCurNumRule() const;
    // setzt, wenn noch keine Numerierung, sonst wird geaendert
    // arbeitet mit alten und neuen Regeln, nur Differenzen aktualisieren
    void SetCurNumRule(const SwNumRule&);
    // Absaetze ohne Numerierung, aber mit Einzuegen
    BOOL NoNum();
    // Loeschen, Splitten der Aufzaehlungsliste
    BOOL DelNumRules();
    // Hoch-/Runterstufen
    BOOL NumUpDown( BOOL bDown = TRUE );
    // Hoch-/Runtermoven sowohl innerhalb als auch ausserhalb von Numerierungen
    BOOL MoveParagraph( long nOffset = 1);
    BOOL MoveNumParas( BOOL bUpperLower, BOOL bUpperLeft );
    // No-/Numerierung ueber Delete/Backspace ein/abschalten
    BOOL NumOrNoNum( BOOL bDelete = FALSE, BOOL bChkStart = TRUE,
                        BOOL bOutline = FALSE );
    BOOL IsNoNum( BOOL bChkStart = TRUE, BOOL bOutline = FALSE ) const;
    // returne den Num-Level des Nodes, in dem sich der Point vom
    // Cursor befindet. Return kann sein :
    // - NO_NUMBERING, 0..MAXLEVEL-1, NO_NUMLEVEL .. NO_NUMLEVEL|MAXLEVEL-1
    BYTE GetNumLevel( BOOL* pHasChilds = 0 ) const;
    String GetUniqueNumRuleName( const String* pChkStr = 0, BOOL bAutoNum = TRUE ) const;
    void ChgNumRuleFmts( const SwNumRule& rRule );
    // setze und erfrage, ob an aktueller PointPos eine Numerierung mit
    // dem StartFlag startet
    void SetNumRuleStart( BOOL bFlag = TRUE );
    BOOL IsNumRuleStart() const;
    void SetNodeNumStart( USHORT nStt = USHRT_MAX );
    USHORT IsNodeNumStart() const;
    BOOL ReplaceNumRule( const String& rOldRule, const String& rNewRule );

    // Undo
    // UndoHistory am Dokument pflegen
    // bei Save, SaveAs, Create wird UndoHistory zurueckgesetzt ???
    void DoUndo( BOOL bOn = TRUE );
    BOOL DoesUndo() const;
    void DoGroupUndo( BOOL bUn = TRUE );
    BOOL DoesGroupUndo() const;
    void DelAllUndoObj();

    // macht rueckgaengig:
    // setzt Undoklammerung auf, liefert nUndoId der Klammerung
    USHORT StartUndo( USHORT nUndoId = 0 );
    // schliesst Klammerung der nUndoId, nicht vom UI benutzt
    USHORT EndUndo( USHORT nUndoId = 0 );
    // liefert die Id der letzten undofaehigen Aktion zurueck
    // fuellt ggf. VARARR mit User-UndoIds
    USHORT GetUndoIds( String* pUndoStr = 0, SwUndoIds *pUndoIds = 0) const;

        // abfragen/setzen der Anzahl von wiederherstellbaren Undo-Actions
    static USHORT GetUndoActionCount();
    static void SetUndoActionCount( USHORT nNew );

    // Redo
    // liefert die Id der letzten Redofaehigen Aktion zurueck
    // fuellt ggf. VARARR mit RedoIds
    USHORT GetRedoIds( String* pRedoStr = 0, SwUndoIds *pRedoIds = 0) const;

    // Repeat
    // liefert die Id der letzten Repeatfaehigen Aktion zurueck
    // fuellt ggf. VARARR mit RedoIds
    USHORT GetRepeatIds( String* pRepeatStr = 0, SwUndoIds *pRedoIds = 0) const;

    // 0 letzte Aktion, sonst Aktionen bis zum Start der Klammerung nUndoId
    // mit KillPaMs, ClearMark
    BOOL Undo(USHORT nUndoId = 0);
    // wiederholt
    USHORT Repeat( USHORT nCount );
    // wiederholt
    USHORT Redo();
#ifdef USED
    // Aktionen klammern
    void StartAction();
    void EndAction();
#endif
    // fuer alle Sichten auf dieses Dokument
    void StartAllAction();
    void EndAllAction();

    //Damit Start-/EndActions aufgesetzt werden koennen.
    void CalcLayout();

    // Inhaltsform bestimmen, holen, liefert Type am CurCrsr->SPoint
    USHORT GetCntType() const;
    BOOL HasOtherCnt() const; // gibt es Rahmen, Fussnoten, ...

    /* Anwenden der ViewOptions mit Start-/EndAction */
    inline void ApplyViewOptions( const SwViewOption &rOpt );

    // Text innerhalb der Selektion erfragen
    // Returnwert liefert FALSE, wenn der selektierte Bereich
    // zu gross ist, um in den Stringpuffer kopiert zu werden
    // oder andere Fehler auftreten
    BOOL GetSelectedText( String &rBuf,
                        int nHndlParaBreak = GETSELTXT_PARABRK_TO_BLANK );

    /*
     * liefert eine Graphic, wenn CurCrsr->Point() auf einen
     * SwGrfNode zeigt (und Mark nicht gesetzt ist oder auf die
     * gleiche Graphic zeigt), sonst gibt's was auf die Finger
     */
    const Graphic &GetGraphic( BOOL bWait = TRUE ) const;
    const GraphicObject &GetGraphicObj() const;
    BOOL IsGrfSwapOut( BOOL bOnlyLinked = FALSE ) const;
    USHORT GetGraphicType() const;

    const PolyPolygon *GetGraphicPolygon() const;
    void SetGraphicPolygon( const PolyPolygon *pPoly );

    /*
     * liefert die Groesse einer Graphic in Twips, wenn der Cursor
     * auf einer Graphic steht; BOOL liefert FALSE, wenn s.o.
     */
    BOOL GetGrfSize(Size&) const;
    /*
     * liefert den Namen und den Filter einer Graphic, wenn der Cursor
     * auf einer Graphic steht, sonst gibt's was auf die Finger!
     * Ist ein String-Ptr != 0 dann returne den entsp. Namen
     */
    void GetGrfNms( String* pGrfName, String* pFltName,
                    const SwFlyFrmFmt* = 0 ) const;
    /*
     * erneutes Einlesen, falls Graphic nicht Ok ist. Die
     * aktuelle wird durch die neue ersetzt.
     */
    void ReRead( const String& rGrfName, const String& rFltName,
                  const Graphic* pGraphic = 0 );

    // alternativen Text einer Grafik/OLe-Objectes abfragen/setzen
    const String& GetAlternateText() const;
    void SetAlternateText( const String& rTxt );

    //eindeutige Identifikation des Objektes (fuer ImageMapDlg)
    void    *GetIMapInventor() const;
    Graphic GetIMapGraphic( BOOL bWait = TRUE ) const; //liefert eine Graphic fuer alle Flys!
    const SwFlyFrmFmt* FindFlyByName( const String& rName, BYTE nNdTyp = 0 ) const;

    //liefert ein ClientObject, wenn CurCrsr->Point() auf einen
    //SwOLENode zeigt (und Mark nicht gesetzt ist oder auf das
    //gleiche ClientObject zeigt), sonst gibt's was auf die
    //Finger.
    SvInPlaceObjectRef GetOLEObj() const;
    //Gibt es ein OleObject mit diesem Namen (SwFmt)?
    BOOL HasOLEObj( const String &rName ) const;

    //Liefert den Pointer auf die Daten des Chart, indem sich der Crsr
    //befindet.
    void SetChartName( const String &rName );
    // returne den ChartNamen - vom Crsr oder vom uebergebenen OLE-Object
    // reurnt aEmptyStr wenn nicht gefunden wurde
    const String& GetChartName( SvInPlaceObject* pObj = 0 );
    //Sucht die Tabelle und liefert ein mit den Daten der Tabelle gefuelltes
    //pData. Wenn pData 0 ist wird eines angelegt.
    void UpdateChartData( const String &rName, SchMemChart *&pData );
    //Updaten der Inhalte aller Charts zu der Tabelle mit dem angegeben Namen
    void UpdateCharts( const String &rName );

    //  aktuelles Wort erfragen
    String GetCurWord();

    // Textbaustein aus dem Textbausteindokument in
    // das aktuelle Dokument, Vorlagen nur wenn es nicht schon gibt
    void InsertGlossary( SwTextBlocks& rGlossary, const String& );
    // aktuelle Selektion zum Textbaustein machen und ins
    // Textbausteindokument einfuegen, einschliesslich Vorlagen
    USHORT MakeGlossary( SwTextBlocks& rToFill, const String& rName,
                         const String& rShortName, BOOL bSaveRelFile = FALSE,
                         BOOL bSaveRelNet = FALSE, const String* pOnlyTxt=0 );
    // speicher den gesamten Inhalt des Docs als Textbaustein
    USHORT SaveGlossaryDoc( SwTextBlocks& rGlossary, const String& rName,
                            const String& rShortName,
                            BOOL bSaveRelFile = FALSE,
                            BOOL bSaveRelNet = FALSE,
                            BOOL bOnlyTxt = FALSE );

    // Linguistik
    // Selektionen sichern
    void HyphStart( SwDocPositions eStart, SwDocPositions eEnde );
    // Selektionen wiederherstellen
    void HyphEnd();
    ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface>
                HyphContinue( USHORT* pPageCnt, USHORT* pPageSt );
    ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface>
                SpellContinue( USHORT* pPageCnt, USHORT* pPageSt );
    // zu trennendes Wort ignorieren
    void HyphIgnore();

    // zum Einfuegen des SoftHyphens, Position ist der Offset
    // innerhalb des getrennten Wortes.
    void InsertSoftHyph( const xub_StrLen nHyphPos );

    //Tabelle
    const SwTable& InsertTable(USHORT nRows, USHORT nCols,
                                SwHoriOrient = HORI_FULL,
                                USHORT nInsert = ALL_TBL_INS_ATTR,
                                const SwTableAutoFmt* pTAFmt = 0 );
    void InsertDDETable( SwDDEFieldType* pDDEType,
                            USHORT nRows, USHORT nCols,
                            SwHoriOrient eAdj = HORI_FULL,
                            USHORT nInsert = HEADLINE_NO_BORDER );
    void UpdateTable();
    void SetTableName( SwFrmFmt& rTblFmt, const String &rNewName );

    SwFrmFmt *GetTableFmt();
    BOOL TextToTable( sal_Unicode cCh, SwHoriOrient eAdj = HORI_FULL,
                        USHORT nInsert = ALL_TBL_INS_ATTR,
                        const SwTableAutoFmt* pTAFmt = 0 );
    BOOL TableToText( sal_Unicode cCh );
    FASTBOOL IsTextToTableAvailable() const;

    BOOL GetTblBoxFormulaAttrs( SfxItemSet& rSet ) const;
    void SetTblBoxFormulaAttrs( const SfxItemSet& rSet );

    BOOL IsTableBoxTextFormat() const;
    // Change Modus erfragen/setzen
    USHORT GetTblChgMode() const;
    void SetTblChgMode( USHORT eMode );

    // Zellenbreiten ueber Min/Max Berechnung an Tabellenbreite anpassen
    void OptimizeTblBoxWidthMinMax();
    // Tabelle an der Cursor Position aufsplitten
    BOOL SplitTable( USHORT eMode );
    // Tabellen verbinden
    // CanMerge kann feststellen, ob Prev oder Next moeglich ist. Wird
    // der Pointer pChkNxtPrv uebergeben, wird festgestellt in welche
    // Richtung es moeglich ist.
    BOOL CanMergeTable( BOOL bWithPrev = TRUE, BOOL* pChkNxtPrv = 0 ) const;
    BOOL MergeTable( BOOL bWithPrev = TRUE, USHORT nMode = 0 );

    // Selektionen sichern
    void SpellStart( SwDocPositions eStart, SwDocPositions eEnde,
                        SwDocPositions eCurr );
    // Selektionen wiederherstellen
    void SpellEnd();

    // Is spelling active somewhere else?
    BOOL HasSpellIter() const;
    // Is hyphenation active somewhere else?
    BOOL HasHyphIter() const;

    ::com::sun::star::uno::Reference< ::com::sun::star::linguistic::XSpellAlternatives>
            GetCorrection( const Point* pPt );

    void SetLinguRange( SwDocPositions eStart, SwDocPositions eEnde );

    // returne zum Namen die im Doc gesetzte Referenz
    const SwFmtRefMark* GetRefMark( const String& rName ) const;
    // returne die Namen aller im Doc gesetzten Referenzen
    //  Ist der ArrayPointer 0 dann returne nur, ob im Doc. eine RefMark
    //  gesetzt ist
    USHORT GetRefMarks( SvStringsDtor* = 0 ) const;

    // rufe die Autokorrektur auf
    void AutoCorrect( SvxAutoCorrect& rACorr, BOOL bInsertMode = TRUE,
                        sal_Unicode cChar = ' ' );
    BOOL GetPrevAutoCorrWord( SvxAutoCorrect& rACorr, String& rWord );

    // dann setze nach entsprechenden Regeln unsere Vorlagen
    void AutoFormat( const SvxSwAutoFmtFlags* pAFlags = 0 );

    static SvxSwAutoFmtFlags* GetAutoFmtFlags();
    static void SetAutoFmtFlags(SvxSwAutoFmtFlags *);

    // errechnet die Selektion
    String Calculate();

    BOOL InsertURL( const SwFmtINetFmt& rFmt, const String& rStr, BOOL bKeepSelection = FALSE );
    USHORT GetINetAttrs( SwGetINetAttrs& rArr );

    //SS Fuer holen/ersetzen DropCap-Inhalt
    String GetDropTxt( const USHORT nChars ) const;
    void   ReplaceDropTxt( const String &rStr );

    // Abfrage von Oultine Informationen:
    USHORT GetOutlineCnt() const;

    BYTE GetOutlineLevel( USHORT nIdx ) const;
    // mit exp. Felder und KapitelNummern
    String GetOutlineText( USHORT nIdx, BOOL bWithNum = TRUE ) const;
    // die Nummer
    const SwNodeNum* GetOutlineNum( USHORT nIdx ) const;

    // darf verschoben werden?
    BOOL IsOutlineMovable( USHORT nIdx ) const;

    USHORT GetLineCount( BOOL bActPos = TRUE );

    // erfrage und setze den Fussnoten-Text/Nummer. Set.. auf akt. SSelection!
    BOOL GetCurFtn( SwFmtFtn* pToFillFtn = 0 );
    BOOL SetCurFtn( const SwFmtFtn& rFillFtn );
    BOOL HasFtns( BOOL bEndNotes = FALSE ) const;
//z.Zt nicht benoetigt  USHORT GetFtnCnt( BOOL bEndNotes = FALSE ) const;
        // gebe Liste aller Fussnoten und deren Anfangstexte
    USHORT GetSeqFtnList( SwSeqFldList& rList, BOOL bEndNotes = FALSE );

    // SS fuer Bereiche
    const SwSection* InsertSection( const SwSection& rNew,
                                    const SfxItemSet* = 0 );
    BOOL IsInsRegionAvailable() const;
    const SwSection* GetCurrSection() const;
    // liefert wie GetCurrSection() den aktuellen Bereich, allerdings geht diese Funktion
    // ueber die Frames und erwischt dabei auch den Bereich, wenn der Cursor in einer
    // Fussnote steht, deren Referenz in einem spaltigen Bereich steckt.
    // Wenn man bOutOfTab setzt, wird der Bereich gesucht,
    // der die Tabelle umfasst, nicht etwa ein innerer.
    const SwSection* GetAnySection( BOOL bOutOfTab = FALSE ) const;

    USHORT GetSectionFmtCount() const;
    USHORT GetSectionFmtPos( const SwSectionFmt& ) const;
    const SwSectionFmt& GetSectionFmt(USHORT nFmt) const;
    void DelSectionFmt( USHORT nFmt );
    void ChgSection( USHORT nSect, const SwSection&, const SfxItemSet* = 0 );
    BOOL IsAnySectionInDoc( BOOL bChkReadOnly = FALSE,
                            BOOL bChkHidden = FALSE,
                            BOOL BChkTOX = FALSE ) const;
        // Passwort fuer geschuetzte Bereiche erfragen/setzen
    void ChgSectionPasswd( const String& sNew );
    const String& GetSectionPasswd() const;
    String GetUniqueSectionName( const String* pChkStr = 0 ) const;

    //Attribute setzen
    void SetSectionAttr(const SfxItemSet& rSet, SwSectionFmt* pSectFmt = 0);

    // search inside the cursor selection for full selected sections.
    // if any part of section in the selection return 0.
    // if more than one in the selection return the count
    USHORT GetFullSelectedSectionCount() const;

    BOOL AppendNodeInSection();
    int CanInsertNodeAtEndOfSection() const;

    // Optimierung UI
    void SetNewDoc(BOOL bNew = TRUE);

          SvxLinkManager& GetLinkManager();
    inline const SvxLinkManager& GetLinkManager() const;

    // linken Rand ueber Objectleiste einstellen (aenhlich dem Stufen von
    // Numerierungen), optional kann man "um" den Offset stufen oder "auf"
    // die Position gestuft werden (bModulus = TRUE)
    BOOL IsMoveLeftMargin( BOOL bRight = TRUE, BOOL bModulus = TRUE ) const;
    void MoveLeftMargin( BOOL bRight = TRUE, BOOL bModulus = TRUE );

    // Numberformatter vom Doc erfragen
          SvNumberFormatter* GetNumberFormatter();
    const SvNumberFormatter* GetNumberFormatter() const
    {   return ((SwEditShell*)this)->GetNumberFormatter();  }

    // Extrakt fuellen
    void Summary( SwDoc* pExtDoc, BYTE nLevel, BYTE nPara, BOOL bImpress );

    // Schnitstellen fuers GlobalDokument
    void SetGlobalDoc( BOOL bFlag = TRUE );
    BOOL IsGlobalDoc() const;
    void SetGlblDocSaveLinks( BOOL bFlag = TRUE );
    BOOL IsGlblDocSaveLinks() const;
    USHORT GetGlobalDocContent( SwGlblDocContents& rArr ) const;
    BOOL InsertGlobalDocContent( const SwGlblDocContent& rPos,
                                 const SwSection& rNew );
    BOOL InsertGlobalDocContent( const SwGlblDocContent& rPos,
                                 const SwTOXBase& rTOX );
    BOOL InsertGlobalDocContent( const SwGlblDocContent& rPos );
    BOOL DeleteGlobalDocContent( const SwGlblDocContents& rArr,
                                USHORT nPos );
    BOOL MoveGlobalDocContent( const SwGlblDocContents& rArr ,
                                USHORT nFromPos, USHORT nToPos,
                                USHORT nNewPos );
    BOOL GotoGlobalDocContent( const SwGlblDocContent& rPos );
    // erzeuge Anhand der vorgebenen Collection Teildokumente
    // falls keine angegeben ist, nehme die Kapitelvorlage der 1. Ebene
    BOOL GenerateGlobalDoc( const String& rPath,
                                const SwTxtFmtColl* pSplitColl = 0 );
    BOOL GenerateHTMLDoc( const String& rPath,
                                const SwTxtFmtColl* pSplitColl = 0 );

    // alles fuers Redlining
    USHORT GetRedlineMode() const;
    void SetRedlineMode( USHORT eMode );
    BOOL IsRedlineOn() const;
    USHORT GetRedlineCount() const;
    const SwRedline& GetRedline( USHORT nPos ) const;
    BOOL AcceptRedline( USHORT nPos );
    BOOL AcceptRedline();
    BOOL RejectRedline( USHORT nPos );
    BOOL RejectRedline();
    // suche das Redline zu diesem Data und returne die Pos im Array
    // USHRT_MAX wird returnt, falls nicht vorhanden
    USHORT FindRedlineOfData( const SwRedlineData& ) const;

    // Kommentar am Redline an der Position setzen
    BOOL SetRedlineComment( const String& rS );
    const SwRedline* GetCurrRedline() const;

    // Redline Anzeigeattribute wurden geaendert, Views updaten
    void UpdateRedlineAttr();

    //  vergleiche zwei Dokument mit einander
    long CompareDoc( const SwDoc& rDoc );
    // merge zweier Dokumente
    long MergeDoc( const SwDoc& rDoc );

    // Dokumentglobale Fussnoteneigenschaften
    const SwFtnInfo& GetFtnInfo() const;
    void  SetFtnInfo(const SwFtnInfo& rInfo);
    const SwEndNoteInfo& GetEndNoteInfo() const;
    void  SetEndNoteInfo(const SwEndNoteInfo& rInfo);

    //Einstellungen fuer Zeilennummierung
    const SwLineNumberInfo &GetLineNumberInfo() const;
    void  SetLineNumberInfo( const SwLineNumberInfo& rInfo);

    // Etiketten: Bereiche synchronisieren
    void SetLabelDoc( BOOL bFlag = TRUE );
    BOOL IsLabelDoc() const;

    // Schnittstelle fuer die TextInputDaten - ( fuer die Texteingabe
    // von japanischen/chinesischen Zeichen)
    SwExtTextInput* CreateExtTextInput();
    void DeleteExtTextInput( SwExtTextInput* pDel = 0, BOOL bInsText = TRUE );
    SwExtTextInput* GetExtTextInput() const;
    void SetExtTextInputData( const CommandExtTextInputData& );

    // Schnistelle fuer den Zugriff auf die AutoComplete-Liste
    static SwAutoCompleteWord& GetAutoCompleteWords();

    // ctor/dtor
    SwEditShell( SwDoc*,
                ::com::sun::star::uno::Reference<
                    ::com::sun::star::linguistic::XSpellChecker1 >,
                ::com::sun::star::uno::Reference<
                    ::com::sun::star::linguistic::XHyphenator >, Window*,
                 SwRootFrm* = 0, const SwViewOption *pOpt = 0 );
    // verkleideter Copy-Constructor
    SwEditShell( SwEditShell*, Window* );
    ~SwEditShell();

private:
    // fuer METWARE:
    // es wird nicht kopiert und nicht zugewiesen
    SwEditShell(const SwEditShell &);
    const SwEditShell &operator=(const SwEditShell &);
};

inline void SwEditShell::ApplyViewOptions( const SwViewOption &rOpt )
{
    SwCrsrShell::StartAction();
    ViewShell::ApplyViewOptions( rOpt );
    SwEditShell::EndAction();
}

inline const SvxLinkManager& SwEditShell::GetLinkManager() const
{   return ((SwEditShell*)this)->GetLinkManager();  }

/*
 * Klasse fuer den automatisierten Aufruf von Start- und
 * EndAction();
 */
class SwActKontext {
    SwEditShell *pSh;
public:
    SwActKontext(SwEditShell *pShell);
    ~SwActKontext();
};

#define ACT_KONTEXT(x)  SwActKontext _aActKontext_(x)

/*
 * Klasse fuer den automatisierten Aufruf von Start- und
 * EndCrsrMove();
 */
class SwMvKontext {
    SwEditShell *pSh;
public:
    SwMvKontext(SwEditShell *pShell );
    ~SwMvKontext();
};

#define MV_KONTEXT(x)   SwMvKontext _aMvKontext_(x)



#endif
diff --git a/sw/inc/errhdl.hxx b/sw/inc/errhdl.hxx
new file mode 100644
index 0000000..23fdf06
--- /dev/null
+++ b/sw/inc/errhdl.hxx
@@ -0,0 +1,129 @@
/*************************************************************************
 *
 *  $RCSfile: errhdl.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _ERRHDL_HXX
#define _ERRHDL_HXX

#ifndef PRODUCT

#ifndef _SOLAR_H
#include <tools/solar.h>
#endif
#ifndef _SAL_TYPES_H_
#include <sal/types.h>
#endif
extern BOOL bAssert;                // TRUE, wenn eine ASSERT-Box hochkam

// -----------------------------------------------------------------------
// Ausgabe einer Fehlermeldung inkl. Dateiname und Zeilennummer
// wo der Fehler auftrat.
// Die Funktion darf nicht direkt benutzt werden!
// -----------------------------------------------------------------------
extern void AssertFail( const sal_Char*, const sal_Char*, USHORT );
extern void AssertFail( USHORT, const sal_Char*, USHORT );

#ifdef WIN
//MSC (7.0) machts nur mit static, ZTC in inlines nur ohne...
#define ASSERT( cond, message ) \
    if( !(cond) ) { \
        static const char __FAR_DATA _pErrorText[] = #message; \
        static const char __FAR_DATA _pFileName[]  = __FILE__; \
       ::AssertFail( _pErrorText, _pFileName, __LINE__ ); \
    }
#else
#define ASSERT( cond, message ) \
    if( !(cond) ) { \
        const char   *_pErrorText = #message; \
        const char   *_pFileName  = __FILE__; \
       ::AssertFail( _pErrorText, _pFileName, __LINE__ ); \
    }
#endif

// -----------------------------------------------------------------------
// Prueft ob die angegebene Bedingung wahr ist, wenn nicht wird eine
// Fehlermeldung die ueber die ID Identifiziert wird, ausgegeben.
// -----------------------------------------------------------------------
#ifdef WIN
//MSC (7.0) machts nur mit static, ZTC in inlines nur ohne...
#define ASSERT_ID( cond, id )   \
    if( !(cond) ) { \
        static const char __FAR_DATA _pFileName[]  = __FILE__;  \
       ::AssertFail( (USHORT)id, _pFileName, __LINE__ );    \
    }
#else
#define ASSERT_ID( cond, id ) \
    if( !(cond) ) { \
        const char   *_pFileName  = __FILE__; \
       ::AssertFail( (USHORT)id, _pFileName, __LINE__ ); \
    }
#endif

// -----------------------------------------------------------------------
// Beim Bilden der Produktversion werden alle Debug-Utilities automatisch
// ignoriert
// -----------------------------------------------------------------------
#else
#define ASSERT( cond, message )     ;
#define ASSERT_ID( cond, id )       ;
#endif // PRODUCT



#endif
diff --git a/sw/inc/error.h b/sw/inc/error.h
new file mode 100644
index 0000000..fd093a5
--- /dev/null
+++ b/sw/inc/error.h
@@ -0,0 +1,84 @@
/*************************************************************************
 *
 *  $RCSfile: error.h,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _SWERROR_H
#define _SWERROR_H

#define ERR_SWGBASE 25000

/*** Error Codes **********************************************************/
#define ERR_VAR_IDX                 (ERR_SWGBASE+ 0)
#define ERR_OUTOFSCOPE              (ERR_SWGBASE+ 1)

/* Error Codes fuer Numerierungsregeln */
#define ERR_NUMLEVEL                (ERR_SWGBASE+ 2)

/* Error Codes fuer TxtNode */
#define ERR_NOHINTS                 (ERR_SWGBASE+ 3)

// von _START bis _END sind in der COREDL.DLL entsprechende Strings
// abgelegt, die erfragt werden koennen.
#define ERR_SWGMSG_START            (ERR_VAR_IDX)
#define ERR_SWGMSG_END              (ERR_NOHINTS)



#endif
diff --git a/sw/inc/expfld.hxx b/sw/inc/expfld.hxx
new file mode 100644
index 0000000..274553e
--- /dev/null
+++ b/sw/inc/expfld.hxx
@@ -0,0 +1,470 @@
/*************************************************************************
 *
 *  $RCSfile: expfld.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _EXPFLD_HXX
#define _EXPFLD_HXX

#ifndef _SVARRAY_HXX //autogen
#include <svtools/svarray.hxx>
#endif

#ifndef _FLDBAS_HXX
#include <fldbas.hxx>
#endif
#ifndef _CELLFML_HXX
#include <cellfml.hxx>
#endif

class SfxPoolItem;
class SwTxtNode;
class SwCalc;
class SwFrm;
struct SwPosition;
class SwTxtFld;
class SwTableSortBoxes;
class SwDoc;
class SwTable;
class SwFmtFld;

// Vorwaertsdeklaration: besorge den "Body-TextNode", fuer Exp.Fld in Fly's
//                      Header/Footers/Footnodes
const SwTxtNode* GetBodyTxtNode( const SwDoc& pDoc, SwPosition& rPos,
                                 const SwFrm& rFrm );
// Wandlung Address -> Adressen
void ReplacePoint(String& sTmpName);

struct _SeqFldLstElem
{
    String sDlgEntry;
    USHORT nSeqNo;

    _SeqFldLstElem( const String& rStr, USHORT nNo )
        : sDlgEntry( rStr ), nSeqNo( nNo )
    {}
};
SV_DECL_PTRARR_DEL( _SwSeqFldList, _SeqFldLstElem*, 10, 10 )

class SwSeqFldList : public _SwSeqFldList
{
public:
    SwSeqFldList()  : _SwSeqFldList( 10, 10 ) {}

    BOOL InsertSort( _SeqFldLstElem* );
    BOOL SeekEntry( const _SeqFldLstElem& , USHORT* pPos = 0 );
};

/*--------------------------------------------------------------------
    Beschreibung: Ausdruck
 --------------------------------------------------------------------*/

class SwGetExpFieldType : public SwValueFieldType
{
public:
        SwGetExpFieldType(SwDoc* pDoc);
        virtual SwFieldType*    Copy() const;

        // ueberlagert, weil das Get-Field nicht veraendert werden kann
        // und dann auch nicht aktualisiert werden muss. Aktualisierung
        // erfolgt beim Aendern von Set-Werten !

        virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew );
};

/*--------------------------------------------------------------------
    Beschreibung: GetExperession
 --------------------------------------------------------------------*/

class SwGetExpField : public SwFormulaField
{
    String          sExpand;
    BOOL            bIsInBodyTxt;
    USHORT          nSubType;

public:
    SwGetExpField( SwGetExpFieldType*, const String& rFormel,
                   USHORT nSubType = GSE_EXPR, ULONG nFmt = 0);

    virtual void                SetValue( const double& rVal );
    virtual void                SetLanguage(USHORT nLng);

    virtual String              Expand() const;
    virtual SwField*            Copy() const;

    inline const String&        GetExpStr() const;
    inline void                 ChgExpStr(const String& rExpand);

    // wird von der Formatierung abgefragt
    inline BOOL                 IsInBodyTxt() const;
    // wird von UpdateExpFlds gesetzt (dort ist die Node-Position bekannt)
    inline void                 ChgBodyTxtFlag( BOOL bIsInBody );
    // fuer Felder in Header/Footer/Footnotes/Flys:
    // (wird nur von der Formatierung aufgerufen!!)
    void                        ChangeExpansion( const SwFrm&, const SwTxtFld& );

    virtual String              GetCntnt(BOOL bName = FALSE) const;

    // Die Formel aendern
    virtual String              GetPar2() const;
    virtual void                SetPar2(const String& rStr);

    virtual USHORT              GetSubType() const;
    virtual void                SetSubType(USHORT nType);
    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );

    static USHORT       GetReferenceTextPos( const SwFmtFld& rFmt, SwDoc& rDoc);
};

inline void SwGetExpField::ChgExpStr(const String& rExpand)
    { sExpand = rExpand;}

inline const String& SwGetExpField::GetExpStr() const
    { return sExpand;   }

// wird von der Formatierung abgefragt
inline BOOL SwGetExpField::IsInBodyTxt() const
    { return bIsInBodyTxt; }

// wird von UpdateExpFlds gesetzt (dort ist die Node-Position bekannt)
inline void SwGetExpField::ChgBodyTxtFlag( BOOL bIsInBody )
    { bIsInBodyTxt = bIsInBody; }


/*--------------------------------------------------------------------
    Beschreibung: Ausdruck setzen
 --------------------------------------------------------------------*/

class SwSetExpField;

class SwSetExpFieldType : public SwValueFieldType
{
    String      sName;
    const SwNode* pOutlChgNd;
    sal_Unicode cDelim;
    USHORT      nType;
    BYTE        nLevel;
    BOOL        bDeleted;

public:
    SwSetExpFieldType( SwDoc* pDoc, const String& rName,
                        USHORT nType = GSE_EXPR );
    virtual SwFieldType*    Copy() const;
    virtual const String&   GetName() const;

    inline void             SetType(USHORT nTyp);
    inline USHORT           GetType() const;

    void                    SetSeqFormat(ULONG nFormat);
    ULONG                   GetSeqFormat();

    BOOL                    IsDeleted() const       { return bDeleted; }
    void                    SetDeleted( BOOL b )    { bDeleted = b; }

    // ueberlagert, weil das Set-Field selbst dafuer sorgt, das
    // es aktualisiert wird.
    virtual void            Modify( SfxPoolItem *pOld, SfxPoolItem *pNew );
    inline const String&    GetSetRefName() const;

    USHORT SetSeqRefNo( SwSetExpField& rFld );

    USHORT GetSeqFldList( SwSeqFldList& rList );
    String MakeSeqName( USHORT nSeqNo );

    // Seqencefelder ggfs. Kapitelweise numerieren
    sal_Unicode GetDelimiter() const        { return cDelim; }
    void SetDelimiter( sal_Unicode c )      { cDelim = c; }
    BYTE GetOutlineLvl() const              { return nLevel; }
    void SetOutlineLvl( BYTE n )            { nLevel = n; }
    void SetChapter( SwSetExpField& rFld, const SwNode& rNd );
    // Member nur fuers SwDoc::UpdateExpFld - wird nur waehrend der Laufzeit
    // von SequencefeldTypen benoetigt!!!
    const SwNode* GetOutlineChgNd() const   { return pOutlChgNd; }
    void SetOutlineChgNd( const SwNode* p ) { pOutlChgNd = p; }

    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );
};

inline void SwSetExpFieldType::SetType( USHORT nTyp )
{
        nType = nTyp;
        EnableFormat( !(nType & (GSE_SEQ|GSE_STRING)));
}

inline USHORT SwSetExpFieldType::GetType() const
    { return nType;   }

inline const String& SwSetExpFieldType::GetSetRefName() const
    { return sName; }


/*--------------------------------------------------------------------
    Beschreibung: Ausdruck
 --------------------------------------------------------------------*/

class SwSetExpField : public SwFormulaField
{
    String          sExpand;
    String          aPText;
    String          aSeqText;
    BOOL            bInput;
    USHORT          nSeqNo;
    USHORT          nSubType;

public:
    SwSetExpField(SwSetExpFieldType*, const String& rFormel, ULONG nFmt = 0);

    virtual void                SetValue( const double& rVal );

    virtual String              Expand() const;
    virtual SwField*            Copy() const;

    inline const String&        GetExpStr() const;

    inline void                 ChgExpStr( const String& rExpand );

    inline void                 SetPromptText(const String& rStr);
    inline const                String& GetPromptText() const;

    inline void                 SetInputFlag(BOOL bInp);
    inline BOOL                 GetInputFlag() const;

    inline void                 SetSeqText(const String& rStr);
    inline const                String& GetSeqText() const;

    virtual String              GetCntnt(BOOL bName = FALSE) const;
    virtual USHORT              GetSubType() const;
    virtual void                SetSubType(USHORT nType);

    inline BOOL                 IsSequenceFld() const;

    // fuer SequenceFelder - logische Nummer
    inline void                 SetSeqNumber( USHORT n )    { nSeqNo = n; }
    inline USHORT               GetSeqNumber() const        { return nSeqNo; }

    // Der Name nur erfragen
    virtual const String&       GetPar1()   const;

    // Die Formel
    virtual String              GetPar2()   const;
    virtual void                SetPar2(const String& rStr);
    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );
};

inline const String& SwSetExpField::GetExpStr() const
    { return sExpand;       }

inline void SwSetExpField::ChgExpStr( const String& rExpand )
    { sExpand = rExpand;    }

inline void  SwSetExpField::SetPromptText(const String& rStr)
    { aPText = rStr;        }

inline const String& SwSetExpField::GetPromptText() const
    { return aPText;        }

inline void  SwSetExpField::SetSeqText(const String& rStr)
    { aSeqText = rStr;          }

inline const String& SwSetExpField::GetSeqText() const
    { return aSeqText;          }

inline void SwSetExpField::SetInputFlag(BOOL bInp)
    { bInput = bInp; }

inline BOOL SwSetExpField::GetInputFlag() const
    { return bInput; }

inline BOOL SwSetExpField::IsSequenceFld() const
    { return 0 != (GSE_SEQ & ((SwSetExpFieldType*)GetTyp())->GetType()); }

/*--------------------------------------------------------------------
    Beschreibung: Eingabe im Text/Variable setzen
 --------------------------------------------------------------------*/

class SwInputFieldType : public SwFieldType
{
    SwDoc* pDoc;
public:
    SwInputFieldType( SwDoc* pDoc );

    virtual SwFieldType* Copy() const;

    SwDoc* GetDoc() const { return pDoc; }
};

/*--------------------------------------------------------------------
    Beschreibung: Eingabefeld
 --------------------------------------------------------------------*/

class SwInputField : public SwField
{
    String  aContent;
    String  aPText;
    USHORT  nSubType;
public:
    // Direkte Eingabe ueber Dialog alten Wert loeschen
    SwInputField(SwInputFieldType*, const String& rContent ,
                 const String& rPrompt, USHORT nSubType = 0,
                 ULONG nFmt = 0);

    virtual String          GetCntnt(BOOL bName = FALSE) const;
    virtual String          Expand() const;
    virtual SwField*        Copy() const;

    // Content
    virtual const String&   GetPar1() const;
    virtual void            SetPar1(const String& rStr);

    // aPromptText
    virtual String          GetPar2() const;
    virtual void            SetPar2(const String& rStr);

    virtual USHORT          GetSubType() const;
    virtual void            SetSubType(USHORT nSub);
    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );
};

/*--------------------------------------------------------------------
    Beschreibung: Sortieren der Eingabefelder
 --------------------------------------------------------------------*/

class SwInputFieldList
{
public:
    SwInputFieldList( SwEditShell* pShell, FASTBOOL bBuildTmpLst = FALSE );
    ~SwInputFieldList();

    USHORT      Count() const;
    SwField*    GetField(USHORT nId);

    void        GotoFieldPos(USHORT nId);
    void        PushCrsr();
    void        PopCrsr();

    // vergleiche TmpLst mit akt Feldern. Alle neue kommen in die SortLst
    // damit sie geupdatet werden koennen. Returnt die Anzahl.
    // (Fuer Textbausteine: nur seine Input-Felder aktualisieren)
    USHORT      BuildSortLst();

    // Alle unselektierten Felder aus Liste entfernen
    void        RemoveUnselectedFlds();

private:
    SwEditShell*    pSh;
    _SetGetExpFlds* pSrtLst;
    SvPtrarr        aTmpLst;
};

/*--------------------------------------------------------------------
    Beschreibung: Tabellen-Formelfeld
                  (Implementierung steht in tblcalc.cxx)
 --------------------------------------------------------------------*/

class SwTblFieldType : public SwValueFieldType
{
public:
    SwTblFieldType(SwDoc* pDocPtr);
    virtual SwFieldType* Copy() const;
};


// MSC will den hier nicht
//typedef void (SwField:: *FnScanFormel)( const SwTable&, String&,
//                                   String&, String* = 0, void* = 0 );


class SwTblField : public SwValueField, public SwTableFormula
{
    String      sExpand;
    USHORT      nSubType;

    // suche den TextNode, in dem das Feld steht
    virtual const SwNode* GetNodeOfFormula() const;

public:
    SwTblField( SwTblFieldType*, const String& rFormel,
                USHORT nSubType = 0, ULONG nFmt = 0);

    virtual void        SetValue( const double& rVal );
    virtual USHORT      GetSubType() const;
    virtual void        SetSubType(USHORT nType);
    virtual String      Expand() const;
    virtual SwField*    Copy() const;

    const String&       GetExpStr() const               { return sExpand; }
    void                ChgExpStr(const String& rStr)   { sExpand = rStr; }

    // berechne sich selbst
    void                CalcField( SwTblCalcPara& rCalcPara );

    virtual String      GetCntnt(BOOL bName = FALSE) const;

    // Die Formel
    virtual String      GetPar2()   const;
    virtual void        SetPar2(const String& rStr);
    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );
};


#endif // _EXPFLD_HXX
diff --git a/sw/inc/extinput.hxx b/sw/inc/extinput.hxx
new file mode 100644
index 0000000..4f79b7a
--- /dev/null
+++ b/sw/inc/extinput.hxx
@@ -0,0 +1,95 @@
/*************************************************************************
 *
 *  $RCSfile: extinput.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _EXTINPUT_HXX
#define _EXTINPUT_HXX

#ifndef _SVSTDARR_HXX
#define _SVSTDARR_USHORTS
#include <svtools/svstdarr.hxx>
#endif
#ifndef _PAM_HXX
#include <pam.hxx>
#endif

class CommandExtTextInputData;
class CommandExtTextInputPosData;
class Font;

class SwExtTextInput : public SwPaM
{
    SvUShorts aAttrs;
    BOOL bInsText;
public:
    SwExtTextInput( const SwPaM& rPam, Ring* pRing = 0 );
    virtual ~SwExtTextInput();

    void SetInputData( const CommandExtTextInputData& rData );
    Rectangle* GetPosInputData( const CommandExtTextInputPosData& rFill,
                                const Point* pLayPos = 0 ) const;
    void InvalidateRange();
    void SetFontForPos( USHORT nPos, Font& rFont );
    const SvUShorts& GetAttrs() const               { return aAttrs; }
    BOOL IsInsText() const              { return bInsText; }
    void SetInsText( BOOL bFlag )       { bInsText = bFlag; }
};

#endif  //_EXTINPUT_HXX

diff --git a/sw/inc/fchrfmt.hxx b/sw/inc/fchrfmt.hxx
new file mode 100644
index 0000000..91b6548
--- /dev/null
+++ b/sw/inc/fchrfmt.hxx
@@ -0,0 +1,119 @@
/*************************************************************************
 *
 *  $RCSfile: fchrfmt.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FCHRFMT_HXX
#define _FCHRFMT_HXX


#ifndef _SFXPOOLITEM_HXX //autogen
#include <svtools/poolitem.hxx>
#endif
#ifndef _CALBCK_HXX //autogen
#include <calbck.hxx>
#endif
#ifndef _FORMAT_HXX //autogen
#include <format.hxx>
#endif

class SwCharFmt;
class International;

// ATT_CHARFMT *********************************************


class SwFmtCharFmt: public SfxPoolItem, public SwClient
{
    friend class SwTxtCharFmt;
    SwTxtCharFmt* pTxtAttr;     // mein TextAttribut
public:
    SwFmtCharFmt( SwCharFmt *pFmt );
    SwFmtCharFmt( const SwFmtCharFmt& rAttr );
    ~SwFmtCharFmt();        // fuer SEXPORT
    TYPEINFO();

    // "pure virtual Methoden" vom SfxPoolItem
    virtual int             operator==( const SfxPoolItem& ) const;
    virtual SfxPoolItem*    Clone( SfxItemPool* pPool = 0 ) const;
    virtual SfxPoolItem*    Create(SvStream &, USHORT nVer) const;
    virtual SvStream&       Store(SvStream &, USHORT nIVer ) const;
    virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres,
                                    SfxMapUnit eCoreMetric,
                                    SfxMapUnit ePresMetric,
                                    String &rText,
                                    const International*    pIntl = 0 ) const;

    virtual BOOL             QueryValue( com::sun::star::uno::Any& rVal, BYTE nMemberId = 0 ) const;
    virtual BOOL             PutValue( const com::sun::star::uno::Any& rVal, BYTE nMemberId = 0 );
    //
    // XML import cannot be done using importXML, because the SwCharFmt's
    // name must be adjusted according to the pool id and access to the SwDoc
    // is required.
    virtual BOOL        exportXML( NAMESPACE_RTL(OUString)& rValue, USHORT,
                                   const SvXMLUnitConverter& ) const;

    // an das SwTxtCharFmt weiterleiten (vom SwClient)
    virtual void    Modify( SfxPoolItem*, SfxPoolItem* );
    virtual BOOL    GetInfo( SfxPoolItem& rInfo ) const;

    void SetCharFmt( SwFmt* pFmt ) { pFmt->Add(this); }
    SwCharFmt* GetCharFmt() const { return (SwCharFmt*)GetRegisteredIn(); }
};
#endif

diff --git a/sw/inc/fesh.hxx b/sw/inc/fesh.hxx
new file mode 100644
index 0000000..7117003
--- /dev/null
+++ b/sw/inc/fesh.hxx
@@ -0,0 +1,654 @@
/*************************************************************************
 *
 *  $RCSfile: fesh.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FESH_HXX
#define _FESH_HXX

#ifndef _EDITSH_HXX
#include <editsh.hxx>
#endif
#ifndef _ORNTENUM_HXX
#include <orntenum.hxx>
#endif
#ifndef _FLYENUM_HXX
#include <flyenum.hxx>
#endif
#ifndef _COM_SUN_STAR_LINGUISTIC_XSPELLCHECKER1_HPP_
#include <com/sun/star/linguistic/XSpellChecker1.hpp>
#endif
#ifndef _COM_SUN_STAR_LINGUISTIC_XHYPHENATOR_HPP_
#include <com/sun/star/linguistic/XHyphenator.hpp>
#endif

class SwFlyFrm;
class SvEmbeddedObject;
class SwTabCols;
class SvEmbeddedObjectRef;
class SvInPlaceObject;
class SvxBrushItem;
class SwTableAutoFmt;
class SwFrm;
class SwTabFrm;
class SwFmtFrmSize;
class SvxBorderLine;
class SvStorageStream;
class SdrObject;
class Color;
class Outliner;
class SotDataObject;
class SdrViewUserMarker;
class SwFrmFmt;
struct SwSortOptions;

enum FrmType
{
    //Fuer GetFrmType() und GetSelFrmType(). Der Return-Wert ist eine
    //Veroderung.
    FRMTYPE_NONE    = 0,
    FRMTYPE_PAGE    = 1,
    FRMTYPE_HEADER  = 2,
    FRMTYPE_FOOTER  = 4,
    FRMTYPE_BODY    = 8,
    FRMTYPE_COLUMN  = 16,
    FRMTYPE_TABLE   = 32,
    FRMTYPE_FLY_FREE    = 64,
    FRMTYPE_FLY_ATCNT   = 128,
    FRMTYPE_FLY_INCNT   = 256,
    FRMTYPE_FOOTNOTE    = 512,
    FRMTYPE_FTNPAGE     = 1024,
    FRMTYPE_FLY_ANY     = 2048,
    FRMTYPE_DRAWOBJ     = 4096,
    FRMTYPE_COLSECT     = 8192,
    FRMTYPE_COLSECTOUTTAB = 16384
};

#define FRMTYPE_ANYCOLSECT ( FRMTYPE_COLSECT | FRMTYPE_COLSECTOUTTAB )

enum DrawObjType
{
    DRAW_ANY,
    DRAW_CONTROL,
    DRAW_SIMPLE
};

enum FlyProtectType
{
     FLYPROTECT_CONTENT     = 1,        // kann verodert werden!
     FLYPROTECT_SIZE        = 2,
     FLYPROTECT_POS         = 4,
     FLYPROTECT_PARENT      = 8,        // nur Parents untersuchen
     FLYPROTECT_FIXED       = 16        // nur nicht aufhebbarer Schutz
                                        // z.B. durch OLE-Server, gilt auch
                                        // fuer Dialog
};

enum ObjCntType     //Fuer das Ermitteln des Cntnts per Positon (D&D)
{
    OBJCNT_NONE,
    OBJCNT_FLY,
    OBJCNT_GRF,
    OBJCNT_OLE,
    OBJCNT_SIMPLE,
    OBJCNT_CONTROL,
    OBJCNT_URLBUTTON,

    OBJCNT_GROUPOBJ,
    OBJCNT_DONTCARE     // nicht bestimmbar - unterschiedliche Objecte selektiert
};

//fuer GetAnyCurRect
enum CurRectType
{
    RECT_PAGE,                  //Rect der aktuellen Seite.
    RECT_PAGE_CALC,             //... Seite wird ggf. Formatiert
    RECT_PAGE_PRT,              //Rect der aktuellen PrtArea der Seite
    RECT_FRM,                   //Rect des aktuellen Rahmen
    RECT_FLY_EMBEDDED,          //Rect des aktuellen FlyFrm
    RECT_FLY_PRT_EMBEDDED,      //Rect der PrtArea des FlyFrm
    RECT_SECTION,               //Rect des aktuellen Bereichs
    RECT_OUTTABSECTION,         //Rect des aktuellen Bereichs,
                                // aber ausserhalb der Tabelle
    RECT_SECTION_PRT,           //Rect der aktuellen PrtArea des Bereichs
    RECT_OUTTABSECTION_PRT,     //Rect der aktuellen PrtArea des Bereichs,
                                // aber ausserhalb der Tabelle
    RECT_HEADERFOOTER,          //Rect des aktuellen Headers/Footer
    RECT_HEADERFOOTER_PRT       //Rect der PrtArea des aktuellen Headers/Footers
};

struct SwGetCurColNumPara
{
    const SwFrmFmt* pFrmFmt;
    const SwRect* pPrtRect, *pFrmRect;
    SwGetCurColNumPara() : pFrmFmt( 0 ), pPrtRect( 0 ), pFrmRect( 0 ) {}
};

#define SW_PASTESDR_INSERT      1
#define SW_PASTESDR_REPLACE     2
#define SW_PASTESDR_SETATTR     3


class SwFEShell : public SwEditShell
{
    SdrViewUserMarker *pChainFrom,
                      *pChainTo;

    SwFlyFrm *FindFlyFrm() const;
    SwFlyFrm *FindFlyFrm( const SvEmbeddedObject *pObj ) const;

    BOOL GotoFly( BOOL bNext, FlyCntType eType = FLYCNTTYPE_ALL );

    //Actions fuer alle Shells beenden und ChangeLink rufen.
    void EndAllActionAndCall();

    void Scroll( const Point &rPt );

    void ChangeOpaque( BYTE nLayerId );

    void GetStartEndCell( SwLayoutFrm *&prStart, SwLayoutFrm *&prEnd );

    const SwFrm *GetBox( const Point &rPt ) const;

    //0 == in keiner Spalte
    USHORT _GetCurColNum( const SwFrm *pFrm,
                          SwGetCurColNumPara* pPara ) const;

    void _GetTabCols( SwTabCols &rToFill, const SwFrm *pBox ) const;

    BOOL ImpEndCreate();

    ObjCntType GetObjCntType( const SdrObject& rObj ) const;

    // Methoden fuers kopieren von DrawObjecten
    BOOL CopyDrawSel( SwFEShell* pDestShell, const Point& rSttPt,
                                const Point& rInsPt, BOOL bIsMove );

public:
    TYPEINFO();
    SwFEShell( SwDoc *pDoc,
            ::com::sun::star::uno::Reference<
                ::com::sun::star::linguistic::XSpellChecker1 > &xSpell,
            ::com::sun::star::uno::Reference<
                ::com::sun::star::linguistic::XHyphenator > &xHyph,
               Window *pWin,
               SwRootFrm *pMaster = 0, const SwViewOption *pOpt = 0 );
    SwFEShell( SwEditShell *pShell, Window *pWin );
    ~SwFEShell();

    // Copy und Paste Methoden fuer das interne Clipboard
    BOOL Copy( SwDoc* pClpDoc, const String* pNewClpTxt = 0 );
    BOOL Paste( SwDoc* pClpDoc );
    // Copy-Methode fuer Drag&Drop
    BOOL Copy( SwFEShell*, const Point& rSttPt, const Point& rInsPt,
                BOOL bIsMove = FALSE );

    void SelectFlyFrm( SwFlyFrm& rFrm, BOOL bNew = FALSE );

    // befindet sich der selektierte Rahmen innerhalb eines anderen?
    const SwFrmFmt* IsFlyInFly();
    // Innerhalb eines des sichtbaren Ankers?
    Rectangle *IsAnchorAtPos( const Point &rPt ) const;

//SS fuer DrawObjekte und Rahmen-----------------------------

    //Wenn ein Objekt angegeben wurde, so wird genau diese Markiert (anstatt
    //ueber die Position zu suchen.
    BOOL SelectObj( const Point& rSelPt, BOOL bAddSelect = FALSE,
                    BOOL bEnterGroup = FALSE, SdrObject *pObj = 0 );
    void DelSelectedObj();

    //Selektion nach oben unten bewegen (Z-Order).
    //TRUE  == ganz nach oben/unten
    //FALSE == einen ueberholen
    void SelectionToTop   ( BOOL bTop = TRUE );
    void SelectionToBottom( BOOL bBottom = TRUE );

    short GetLayerId() const;   //1 Heaven, 0 Hell, -1 Uneindeutig
    void  SelectionToHeaven();  //Ueber dem Dokument
    void  SelectionToHell();    //Unter dem Dokument

    // folgende zwei Methoden returnen den enum SdrHdlKind, um sich ein
    // includen von SVDRAW.HXX zu ersparen als int deklariert.
    int IsObjSelectable( const Point& rPt );
    int IsInsideSelectedObj( const Point& rPt );

    //Returnwerte siehe oben FrmType.
    //pPt: Crsr bzw. DocPos; bStopAtFly: Bei Flys anhalten oder ueber den Anchor weitergehen
    // Obgleich (0,TRUE) eine Art Standard ist, sind die Parameter nicht defaultet, damit
    // bei jeder Benutzung insbesondere das bStopAtFly bewusst genutzt wird.
    USHORT GetFrmType( const Point *pPt, BOOL bStopAtFly ) const;
    USHORT GetSelFrmType() const;               //Selektion (Drawing)

    ObjCntType GetObjCntType( const Point &rPt, SdrObject *&rpObj ) const;
    ObjCntType GetObjCntTypeOfSelection( SdrObject** ppObj = 0 ) const;

    //Zum Anpassen der PosAttr bei Ankerwechseln.
    SwRect  GetObjRect() const;
    //Zum Verschieben von Flys mit der Tastatur
    SwRect  GetFlyRect() const;
    void CalcBoundRect( SwRect &rRect, RndStdIds nAnchorId,
                        SwRelationOrient eRelOrient = FRAME,
                        BOOL bMirror = FALSE,
                        Point* pRef = NULL,
                        Size* pPercent = NULL ) const;

    // Groesse von Drawobjekten setzen
    void SetObjRect( const SwRect& rRect );

    long BeginDrag( const Point *pPt, BOOL bProp );
    long Drag     ( const Point *pPt, BOOL bProp );
    long EndDrag  ( const Point *pPt, BOOL bProp );
    void BreakDrag();

    //Methoden fuer die Statuszeile.
    Point GetAnchorObjDiff() const; //Abstand zum Anker
    Point GetObjAbsPos()     const; //Absolute Position
    Size  GetObjSize()       const; //Groesse, ggf. die umschliessende

    //SS fuer die BriefUmschlaege: hole alle Seitengebundenen Objekte
    //und setze diese auf eine neue Seite.
    void GetPageObjs( SvPtrarr& rFillArr );
    void SetPageObjsNewPage( SvPtrarr& rFillArr, int nOffset = 1 );

    // zeige die aktuelle Selektion an ( ggfs. den Rahmen/DrawObject)
    virtual void MakeSelVisible();

    // returne das FrmFmt von dem evt. unter dem Point stehenden Object.
    // Das Object wird nicht selektiert!
    const SwFrmFmt* GetFmtFromObj( const Point& rPt, SwRect** pRectToFill = 0 ) const;
    // returns a format too, if the point is over the text of any fly
    const SwFrmFmt* GetFmtFromAnyObj( const Point& rPt ) const;

    //Welcher Schutz ist am selektierten Objekt gesetzt?
    BYTE IsSelObjProtected( FlyProtectType eType ) const;

    //Liefert neben der Grafik in rName bei gelinkten Grafiken den Namen mit
    //Pfad und sonst den Grafiknamen. rbLink ist TRU bei gelinkten Grafiken.
    const Graphic *GetGrfAtPos( const Point &rDocPos,
                                String &rName, BOOL &rbLink ) const;

//SS fuer Rahmen --------------------------------------------

    BOOL IsFrmSelected() const;
    BOOL GetFlyFrmAttr( SfxItemSet &rSet ) const;
    BOOL SetFlyFrmAttr( SfxItemSet &rSet );
    BOOL ResetFlyFrmAttr( USHORT nWhich, const SfxItemSet* pSet = 0 );
    const SwFrmFmt *NewFlyFrm( const SfxItemSet &rSet, BOOL bAnchValid = FALSE,
                         SwFrmFmt *pParent = 0 );
    void SetFlyPos( const Point &rAbsPos);
    Point FindAnchorPos( const Point &rAbsPos, BOOL bMoveIt = FALSE );

    SwFrmFmt* GetCurFrmFmt() const; //Wenn Rahmen, dann Rahmenvorlage, sonst 0
    void SetFrmFmt( SwFrmFmt *pFmt, BOOL bKeepOrient = FALSE, Point* pDocPos = 0 ); //Wenn Rahmen, dann Rahmenvorlage setzen

    // finde/loeschen den Fly, in dem der Cursor steht
    SwFrmFmt* WizzardGetFly();
    BOOL WizzardDelFly();

    //Selebstaendiges selektieren von Flys
    BOOL GotoNextFly(FlyCntType eType = FLYCNTTYPE_ALL)
                                { return GotoFly( TRUE, eType ); }
    BOOL GotoPrevFly(FlyCntType eType = FLYCNTTYPE_ALL)
                                { return GotoFly( FALSE, eType); }

    //iterieren ueber Flys - fuer Basic-Collections
    USHORT GetFlyCount(FlyCntType eType = FLYCNTTYPE_ALL) const;
    const SwFrmFmt* GetFlyNum(USHORT nIdx, FlyCntType eType = FLYCNTTYPE_ALL) const;

    //Wenn ein fly selectiert ist, zieht er den Crsr in den ersten CntntFrm
    const SwFrmFmt* SelFlyGrabCrsr();

    //Get FlyFrameFormat; fuer UI Macro Anbindung an Flys
    const SwFrmFmt* GetFlyFrmFmt() const;

    //OLE, Server fordert neue Groesse an, die gewuenschten Werte werden
    //als Rahmenattribute eingestellt. Wenn die Werte nicht erlaubt sind,
    //so wird von der Formatierung geclippt und eine Scalierung eingestellt.
    //siehe CalcAndSetScale().
    void RequestObjectResize( const SwRect &rRect, SvEmbeddedObject *pIPObj );

    //Der Client fuer das OleObject muss bezueglich der Scalierung auf dem
    //neuesten Stand gehalten werden. Impl in der WrtShell.
    //Wird ein Pointer auf eine Size uebergeben, so ist diese die aktuelle
    //Core-Groesse des Objectes. Anderfalls wird die Groesse per GetCurFlyRect()
    //besorgt.
    virtual void CalcAndSetScale( SvEmbeddedObjectRef xIPObj,
                                  const SwRect *pFlyPrtRect = 0,
                                  const SwRect *pFlyFrmRect = 0 ) = 0;

    //Objekte mit ActivateWhenVisible werden beim Paint Connected.
    //gerufen von notxtfrm::Paint, impl in wrtsh
    virtual void ConnectObj( SvInPlaceObjectRef xIPObj, const SwRect &rPrt,
                             const SwRect &rFrm ) = 0;

    //Sichbaren Bereich auf das Object setzen, wenn es noch nicht sichtbar ist.
    void MakeObjVisible( const SvEmbeddedObject *pIPObj ) const;

    // setze am selektierten FlyFrame einen Namen
    void SetFlyName( const String& rName );
    const String& GetFlyName() const;

    // erezeuge eindeutige Namen fuer Rahmen
    String GetUniqueGrfName() const;
    String GetUniqueOLEName() const;
    String GetUniqueFrameName() const;

    // springe zum benannten Rahmen (Grafik/OLE)
    BOOL GotoFly( const String& rName, FlyCntType eType = FLYCNTTYPE_ALL,
                    BOOL bSelFrame = TRUE );
    // steht an der Position eine Grafik mit einer URL ?
    const SwFrmFmt* IsURLGrfAtPos( const Point& rPt, String* pURL = 0,
                                    String *pTargetFrameName = 0,
                                    String *pURLDescription = 0 ) const;

    //Fuer das Chain wird immer der durch das Format spezifizierte Fly
    //mit dem durch den Point getroffenen verbunden.
    //In rRect wird das Rect des Flys geliefert (fuer Highlight desselben)
    int Chainable( SwRect &rRect, const SwFrmFmt &rSource, const Point &rPt ) const;
    int Chain( SwFrmFmt &rSource, const Point &rPt );
    void Unchain( SwFrmFmt &rFmt );
    void HideChainMarker();
    void SetChainMarker();

    Size GetGraphicDefaultSize() const;

//SS fuer DrawObjekte ---------------------

    //Temporaer um Bug zu umgehen.
    void CheckUnboundObjects();

    //Achtung: Uneindeutikeiten bei Mehrfachselektionen.
    BOOL GetObjAttr( SfxItemSet &rSet ) const;
    BOOL SetObjAttr( const SfxItemSet &rSet );

    BOOL GotoObj( BOOL bNext, DrawObjType eType = DRAW_ANY);

    ULONG ControlCount() const;
    BOOL  GotoControl( ULONG nIndex );

    //Setzen vom DragMode (z.B. Rotate), tut nix bei Rahmenselektion.
    void SetDragMode( UINT16 eSdrDragMode );

    USHORT IsObjSelected() const;   //Liefert gleich die Anzahl der Objekte,
                                    //zaehlt aber nicht die Objekte in Gruppen.

    void EndTextEdit();             //Loescht ggf. das Objekt.

    //Ankertyp des selektierten Objektes, -1 bei Uneindeutigkeit oder
    //Rahmenselektion; FLY_PAGE bzw. FLY_AT_CNTNT aus frmatr.hxx sonst.
    short GetAnchorId() const;

    //Erzeugen von DrawObjekten, beim Begin wird der Objekttyp mitgegeben.
    //Beim End kann ein Cmd mitgegeben werden, hier ist ggf.
    //SDRCREATE_RESTRAINTEND fuer Ende oder SDRCREATE_NEXTPOINT fuer ein
    //Polygon relevant. Nach dem RESTRAINTEND ist das Objekt erzeugt und
    //selektiert.
    //Mit BreakCreate wird der Vorgang abgebrochen, dann ist kein Objekt
    //mehr selektiert.
    BOOL BeginCreate( UINT16 eSdrObjectKind, const Point &rPos );
    BOOL BeginCreate( UINT16 eSdrObjectKind, UINT32 eObjInventor, const Point &);
    void MoveCreate ( const Point &rPos );
    BOOL EndCreate  ( UINT16 eSdrCreateCmd );
    void BreakCreate();
    BOOL IsDrawCreate() const;

    // Funktionen fr Rubberbox, um Draw-Objekte zu selektieren
    BOOL BeginMark( const Point &rPos );
    void MoveMark ( const Point &rPos );
    BOOL EndMark  ();
    void BreakMark();

    //Gruppe erzeugen, aufloesen, nix bei Rahmenselektion.
    BOOL IsGroupSelected();     //Kann auch eine Mischselektion sein!
    void GroupSelection();      //Hinterher ist die Gruppe selektiert.
    void UnGroupSelection();    //Die Einzelobjekte sind Selektiert
                                //Es koennen noch immer Gruppen dabei sein.

    BOOL IsGroupAllowed() const;

    void MirrorSelection( BOOL bHorizontal );   //Bei FALSE Vertikal

    //Umankern. erlaubt sind: FLY_PAGE und FLY_AT_CNTNT des enum RndStdIds aus
    //frmatr.hxx. Hier kein enum wg. Abhaengigkeiten
    //Der BOOL ist nur fuer internen Gebrauch! Anker wird nur - anhand der
    //aktuellen Dokumentposition - neu gesetzt aber nicht umgesetzt.
    void ChgAnchor( int eAnchorId, BOOL bSameOnly = FALSE,
                                   BOOL bPosCorr = TRUE );

    // hole die selectierten DrawObj als Grafik (MetaFile/Bitmap)
    // Return-Wert besagt ob konvertiert wurde!!
    BOOL GetDrawObjGraphic( ULONG nFmt, Graphic& rGrf ) const;

    void Paste( SvStorageStream& rStm, USHORT nAction, const Point* pPt = 0 );
    BOOL Paste( const Graphic &rGrf );
    BOOL Paste( SotDataObject& rObj, const Point& rPt );

    BOOL IsAlignPossible() const;
    void SetCalcFieldValueHdl(Outliner* pOutliner);

        //Einfuegen eines DrawObjectes. Das Object muss bereits im DrawModel
        // angemeldet sein.
    void Insert( SdrObject& rDrawObj, const SfxItemSet* pFlyAttrSet = 0,
                SwFrmFmt* = 0, const Point* = 0 );

    BOOL ReplaceSdrObj( const String& rGrfName, const String& rFltName,
                        const Graphic* pGrf = 0 );

//------------------------------------------

    //Auskunft ueber naechstliegenden Inhalt zum uebergebenen Point
    Point GetCntntPos( const Point& rPoint, BOOL bNext ) const;

    //Layout-Selektion Hiden/Zeigen und aufruf an die CrsrSh weiterreichen.
    void ShLooseFcs();
    void ShGetFcs( BOOL bUpdate = TRUE );

    //PageDescriptor-Schnittstelle
    void   ChgCurPageDesc( const SwPageDesc& );
    USHORT GetCurPageDesc( const BOOL bCalcFrm = TRUE ) const;
    USHORT GetPageDescCnt() const;
    SwPageDesc* FindPageDescByName( const String& rName,
                                    BOOL bGetFromPool = FALSE,
                                    USHORT* pPos = 0 );

    const SwPageDesc& GetPageDesc( USHORT i ) const;
    void  ChgPageDesc( USHORT i, const SwPageDesc& );
    // if inside all selection only one PageDesc, return this.
    // Otherwise return 0 pointer
    const SwPageDesc* GetSelectedPageDescs() const;

    const SwRect& GetAnyCurRect( CurRectType eType,
                                 const Point* pPt = 0,
                                 const SvEmbeddedObject *pObj = 0 ) const;

    //Seitennummer der Seite in der der Point liegt, 0 wenn keine
    //getroffen ist.
    USHORT GetPageNumber( const Point &rPoint ) const;
    BOOL GetPageNumber( long nYPos, BOOL bAtCrsrPos, USHORT& rPhyNum, USHORT& rVirtNum, String &rDisplay ) const;


    void Insert(const String& rGrfName,
                const String& rFltName,
                const Graphic* pGraphic = 0,
                const SfxItemSet* pFlyAttrSet = 0,
                const SfxItemSet* pGrfAttrSet = 0,
                SwFrmFmt* = 0 );

    void Insert(SvInPlaceObject *,
                const SfxItemSet* pFlyAttrSet = 0,
                const SfxItemSet* pGrfAttrSet = 0,
                SwFrmFmt* = 0 );

    void GrfToOle( SvInPlaceObject * );
    void OleToGrf( const Graphic *pGrf );

    //Attribute der Tabelle besorgen/setzen.
    void GetTblAttr( SfxItemSet & ) const;
    void SetTblAttr( const SfxItemSet & );

    //Tabelle vollstaendig selektiert?
    BOOL HasWholeTabSelection() const;
    //Ist der Inhalt einer Tabellenzelle oder mindestens eine Tabellenzelle
    //vollstaendig selektiert ist
    BOOL HasBoxSelection() const;

    BOOL InsertRow( USHORT nCnt, BOOL bBehind );
    BOOL InsertCol( USHORT nCnt, BOOL bBehind );  // 0 == am Ende
    BOOL DeleteCol();
    BOOL DeleteRow();

    BOOL DeleteTblSel();        //Aktuelle Selektion, ggf. die ganze Tabelle.

    USHORT MergeTab();          //Merged selektierte Tabellenteile zusammen
                                //Fehler ueber enum zurueck
    BOOL SplitTab( BOOL nVert = TRUE, USHORT nCnt = 1); //Zelle Vertikal oder
                                                        //Horizontal s plitten.
    BOOL Sort(const SwSortOptions&);    //Sortieren.

    void SetRowHeight( const SwFmtFrmSize &rSz );
    //Der Pointer muss vom Aufrufer zerstoert werden wenn != 0
    void GetRowHeight( SwFmtFrmSize *&rpSz ) const;

    void   SetBoxAlign( USHORT nOrient );
    USHORT GetBoxAlign() const;         //USHRT_MAX fuer uneindeutig!

    //Ausgleichen der Zeilenhoehen. Mit bTstOnly festellen ob mehr als eine
    //Zeile markiert ist.
    BOOL BalanceRowHeight( BOOL bTstOnly );

    void SetTabBorders( const SfxItemSet& rSet );
    void GetTabBorders(       SfxItemSet& rSet) const;
    void SetTabLineStyle(const Color* pColor, BOOL bSetLine = FALSE, const SvxBorderLine* pBorderLine = NULL);

    void SetTabBackground( const SvxBrushItem &rNew );
    void GetTabBackground( SvxBrushItem &rToFill ) const;

    void SetBoxBackground( const SvxBrushItem &rNew );
    BOOL GetBoxBackground( SvxBrushItem &rToFill ) const; //FALSE uneindeutig

    void SetRowBackground( const SvxBrushItem &rNew );
    BOOL GetRowBackground( SvxBrushItem &rToFill ) const; //FALSE uneindeutig

    BOOL IsMouseTabCol( const Point &rPt ) const;
    void GetMouseTabCols( SwTabCols &ToFill, const Point &rPt ) const;
    void SetMouseTabCols( const SwTabCols &rNew, BOOL bCurRowOnly,
                          const Point &rPt );
    void GetTabCols( SwTabCols &rToFill ) const; //Spalten- und Randinfo.
    void SetTabCols( const SwTabCols &rNew, BOOL bCurRowOnly = TRUE );

    void ProtectCells();    //Falls eine Tabselektion besteht, wird sie ver-
                            // nichtet, wenn der Cursor nicht in Readonly darf
    void UnProtectCells();  // auf die Tabellenselektin
    void UnProtectCells( const String& rTblName );  // diese Tabelle
    void UnProtectTbls();   //bei allen Tabellen in der Selektion den Schutz aufheben
    BOOL HasTblAnyProtection( const String* pTblName = 0,
                                BOOL* pFullTblProtection = 0 );

    void SetHeadlineRepeat( BOOL bSet );//TRUE: Headline soll widerholt werden.
    BOOL IsHeadlineRepeat() const;
    BOOL IsInRepeatedHeadline() const;
    BOOL IsInHeadline() const;

    //Stellt die Breiten der Zellen so ein, dass der Inhalt moeglichst
    //nicht umgebrochen werden muss.
    //bBalance sorgt fuer einen Ausgleich der markierten Spalten.
    void AdjustCellWidth( BOOL bBalance = FALSE );
    //Nicht erlaubt, wenn nur  leere Zellen selektiert sind.
    BOOL IsAdjustCellWidthAllowed( BOOL bBalance = FALSE ) const;

    //Ausgleich der Zellenbreiten, mit bTstOnly feststellen, ob mehr als
    //eine Zelle markiert ist.
    BOOL BalanceCellWidth( BOOL bTstOnly );

        // AutoFormat fuer die Tabelle/TabellenSelection
    BOOL SetTableAutoFmt( const SwTableAutoFmt& rNew );
        // Erfrage wie attributiert ist
    BOOL GetTableAutoFmt( SwTableAutoFmt& rGet );
        // aender eine  Zellenbreite/-Hoehe/Spaltenbreite/Zeilenhoehe
    BOOL SetColRowWidthHeight( USHORT eType, USHORT nDiff = 283 );
        // Autosumme
    BOOL GetAutoSum( String& rFml ) const;

    //Phy:  Tatsaechliche Seitenanzahl.
    //Virt: Vom User evtl. gesetzten Offset mit einbeziehen.
    USHORT  GetPhyPageNum();
    USHORT  GetVirtPageNum( const BOOL bCalcFrm = TRUE );

    // Setzt an der aktuellen Postion einen neuen Page Offset
    void SetNewPageOffset( USHORT nOffset );
    void SetPageOffset( USHORT nOffset );   //Aendert den letzten Page Offset
    USHORT GetPageOffset() const;           //Liefert den letzten Page Offset

    //SS fuer Beschriftungen
    void InsertLabel( const SwLabelType eType, const String &rTxt,
                      const BOOL bBefore, const USHORT nId,
                      const BOOL bCpyBrd = TRUE );

    //Das Lineal will auch noch etwas von uns wissen.
    USHORT GetCurColNum( SwGetCurColNumPara* pPara = 0 ) const; //0 == in keiner Spalte
    USHORT GetCurMouseColNum( const Point &rPt,
                            SwGetCurColNumPara* pPara = 0 ) const;
    USHORT GetCurTabColNum() const;     //0 == in keiner Tabelle
    USHORT GetCurMouseTabColNum( const Point &rPt ) const;
    USHORT GetCurOutColNum( SwGetCurColNumPara* pPara = 0 ) const;  // aktuelle aeussere Spalte
    // Die Breite des aktuellen Bereichs fuer Spaltendialog
    long GetSectionWidth( SwFmt& rFmt ) const;
};

#endif
diff --git a/sw/inc/fldbas.hxx b/sw/inc/fldbas.hxx
new file mode 100644
index 0000000..a60f82c
--- /dev/null
+++ b/sw/inc/fldbas.hxx
@@ -0,0 +1,522 @@
/*************************************************************************
 *
 *  $RCSfile: fldbas.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FLDBAS_HXX
#define _FLDBAS_HXX

#ifndef FIELDIDS_ONLY       // SWG-Testreader!!

#ifndef _LANG_HXX //autogen
#include <tools/lang.hxx>
#endif
#ifndef _DEBUG_HXX //autogen
#include <tools/debug.hxx>
#endif
#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif
#include "calbck.hxx"

#ifndef _COM_SUN_STAR_UNO_ANY_HXX_
#include <com/sun/star/uno/Any.hxx>
#endif

class SwDoc;
class Date;
class Time;
class _SetGetExpFlds;
class SwEditShell;
class SvStringsDtor;
namespace com{namespace star { namespace sun {namespace uno{ class Any;}}}}
class SvNumberFormatter;

#endif      // FIELDIDS_ONLY

/*--------------------------------------------------------------------
    Beschreibung:   die ID's fuer die Feldtypen
 --------------------------------------------------------------------*/

enum RES_FIELDS
{
// Fuer die alten Dokumente muessen die Field-Which IDS erhalten bleiben !!!!
    RES_FIELDS_BEGIN,
    RES_DBFLD = RES_FIELDS_BEGIN,
    RES_USERFLD,
    RES_FILENAMEFLD,
    RES_DBNAMEFLD,
    RES_DATEFLD,
    RES_TIMEFLD,
    RES_PAGENUMBERFLD,
    RES_AUTHORFLD,
    RES_CHAPTERFLD,
    RES_DOCSTATFLD,
    RES_GETEXPFLD,
    RES_SETEXPFLD,
    RES_GETREFFLD,
    RES_HIDDENTXTFLD,
    RES_POSTITFLD,
    RES_FIXDATEFLD,
    RES_FIXTIMEFLD,
    RES_REGFLD,
    RES_VARREGFLD,
    RES_SETREFFLD,
    RES_INPUTFLD,
    RES_MACROFLD,
    RES_DDEFLD,
    RES_TABLEFLD,
    RES_HIDDENPARAFLD,
    RES_DOCINFOFLD,
    RES_TEMPLNAMEFLD,
    RES_DBNEXTSETFLD,
    RES_DBNUMSETFLD,
    RES_DBSETNUMBERFLD,
    RES_EXTUSERFLD,
    RES_REFPAGESETFLD,
    RES_REFPAGEGETFLD,
    RES_INTERNETFLD,
    RES_JUMPEDITFLD,
    RES_SCRIPTFLD,
    RES_DATETIMEFLD,
    RES_AUTHORITY,  //Table of authorities
    RES_FIELDS_END
};

/*--------------------------------------------------------------------
    Beschreibung: Liste der FieldTypes am UI
 --------------------------------------------------------------------*/

enum SwFldTypesEnum
{
    TYP_BEGIN,
    TYP_DATEFLD = TYP_BEGIN,    // 0
    TYP_TIMEFLD,
    TYP_FILENAMEFLD,
    TYP_DBNAMEFLD,
    TYP_CHAPTERFLD,
    TYP_PAGENUMBERFLD,
    TYP_DOCSTATFLD,
    TYP_AUTHORFLD,
    TYP_SETFLD,
    TYP_GETFLD,
    TYP_FORMELFLD,              // 10
    TYP_HIDDENTXTFLD,
    TYP_SETREFFLD,
    TYP_GETREFFLD,
    TYP_DDEFLD,
    TYP_MACROFLD,
    TYP_INPUTFLD,
    TYP_HIDDENPARAFLD,
    TYP_DOCINFOFLD,
    TYP_DBFLD,
    TYP_USERFLD,                // 20
    TYP_POSTITFLD,
    TYP_TEMPLNAMEFLD,
    TYP_SEQFLD,
    TYP_DBNEXTSETFLD,
    TYP_DBNUMSETFLD,
    TYP_DBSETNUMBERFLD,
    TYP_CONDTXTFLD,
    TYP_NEXTPAGEFLD,
    TYP_PREVPAGEFLD,
    TYP_EXTUSERFLD,             // 30
    TYP_FIXDATEFLD,
    TYP_FIXTIMEFLD,
    TYP_SETINPFLD,
    TYP_USRINPFLD,
    TYP_SETREFPAGEFLD,
    TYP_GETREFPAGEFLD,
    TYP_INTERNETFLD,
    TYP_JUMPEDITFLD,
    TYP_SCRIPTFLD,              // 40
    TYP_AUTHORITY,
    TYP_END
};


enum SwFileNameFormat
{
    FF_BEGIN,
    FF_NAME = FF_BEGIN,
    FF_PATHNAME,
    FF_PATH,
    FF_NAME_NOEXT,
    FF_UI_NAME,
    FF_UI_RANGE,
    FF_END,
    FF_FIXED = 0x8000
};

enum SwVarFormat
{
    VVF_CMD         = 0x0010,   // Kommando anzeigen
    VVF_INVISIBLE   = 0x0040,   // unsichtbar
    VVF_XXP         = 0x0400,   // 1234%
    VVF_XX_XXP      = 0x0800,   // 1.234,56%
    VVF_CLEAR       = 0x000f,

// ab hier neue Formate
    VVF_SYS         = 0x2000,   //Zahlenformat aus der Systemeinstellung
    VVF_X           = 0x2100,   // 1234
    VVF_X_X         = 0x2200,   // 1234,5
    VVF_X_XX        = 0x2300,   // 1245,56
    VVF_XX_X        = 0x2400,   // 1.234,5
    VVF_XX_XX       = 0x2500,   // 1.234,56
    VVF_XX_XXX      = 0x2600,   // 1.234,567
    VVF_SYS_CUR     = 0x2700,   // W„hrungsformat aus der Systemeinstellung
    VVF_CUR_X       = 0x2800,   // DM 1234
    VVF_CUR_XX_XX   = 0x2900,   // DM 1234,56 DM 1234,00
    VVF_CUR_XX_X0   = 0x2a00,   // DM 1234,56 DM 1234,--
    VVF_X_CUR       = 0x2b00,   // 1234 DM
    VVF_XX_XX_CUR   = 0x2c00,   // 1234,56 DM 1234,00 DM
    VVF_XX_X0_CUR   = 0x2d00,    // 1234,56 DM 1234,-- DM
// Kompatibilitaet:
    VF_CMD          = VVF_CMD,
    VF_INVISIBLE    = VVF_INVISIBLE,
    VF_XXP          = VVF_XXP,
    VF_XX_XXP       = VVF_XX_XXP,
    VF_VISIBLE      = VVF_SYS,
    VF_XX           = VVF_X,
    VF_XX_XX        = VVF_XX_XX,
    VF_XX_XX_CUR    = VVF_SYS_CUR,
    VF_CLEAR        = VVF_CLEAR

};

enum SwGetSetExpType
{
    GSE_STRING      = 0x0001,   // String
    GSE_EXPR        = 0x0002,   // Expression
    GSE_INP         = 0x0004,   // InputField
    GSE_SEQ         = 0x0008,   // Sequence
    GSE_FORMULA     = 0x0010    // Formel
};

enum SwExtendedSubType
{
    SUB_CMD         = 0x0100,   // Kommando anzeigen
    SUB_INVISIBLE   = 0x0200,   // unsichtbar
    SUB_OWN_FMT     = 0x0400    // SwDBField: Uebernimmt Formatierung nicht
                                // aus Datenbank
};

enum SwInputFieldSubType
{
    INP_TXT     = 0x01,
    INP_USR     = 0x02,
    INP_VAR     = 0x03
};


enum SwUserType
{
    UF_STRING   = 0x01,
    UF_EXPR     = 0x02
};

enum SwDateTimeSubType
{
    FIXEDFLD = 1,
    DATEFLD  = 2,
    TIMEFLD  = 4
};

#ifndef FIELDIDS_ONLY       // SWG-Testreader!!


extern USHORT __FAR_DATA aTypeTab[];

/*--------------------------------------------------------------------
    Beschreibung: Allgemeine Tools
 --------------------------------------------------------------------*/

String  GetResult(double nVal, ULONG nNumFmt, USHORT nLang = LANGUAGE_SYSTEM);
void    SetErrorStr(const String& rStr);
//String    ExpandDate(const Date& rDate, ULONG nFmt, USHORT nLang);
//String    ExpandTime(const Time& rTime, ULONG nFmt, USHORT nLang);
String  FormatNumber(USHORT nNum, ULONG nFormat);

/*--------------------------------------------------------------------
    Beschreibung:   Instanzen von SwFields und Abgeleiteten kommen 0-n mal vor.
                    Zu jeder Klasse SwFields existiert
                    1 Instanz der zugehoerigen Typenklasse
                    Basisklasse aller Feldtypen ist SwFieldType
 --------------------------------------------------------------------*/
class SwFldNames;

DBG_NAMEEX(SwFieldType);

class SwFieldType : public SwModify
{
    USHORT nWhich;

    friend void _FinitUI();     // um den Pointer zu loeschen!
    static  SvStringsDtor*  pFldNames;

    static void _GetFldName();          // legt die FldNames an, fldmgr.cxx!
protected:
    SwFieldType( USHORT nWhichId );

public:

#ifndef PRODUCT
    virtual ~SwFieldType();
#endif
    static  const String&   GetTypeStr( USHORT nTypeId );

    // nur in abgeleiteten Klassen
    virtual const String&   GetName() const;
    virtual SwFieldType*    Copy()    const = 0;
    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );

            USHORT          Which() const { return nWhich; }

    inline  void            UpdateFlds() const;

    static inline SvStringsDtor* GetFldNames();
};

inline void SwFieldType::UpdateFlds() const
{
    ((SwFieldType*)this)->Modify( 0, 0 );
}

/*--------------------------------------------------------------------
    Beschreibung:  Basisklasse aller Felder.
                   Ueber Which wird der Typ des Feldes abgefragt.
                   Ueber Expand() wird der expandierte Inhalt
                   des Feldes in Erfahrung gebracht.
 --------------------------------------------------------------------*/

class SwField
{
    USHORT              nLang;  // Immer ueber SetLanguage aendern!
    ULONG               nFormat;

    SwFieldType*        pType;
protected:
    void                SetFormat(ULONG nSet) {nFormat = nSet;}

    SwField(SwFieldType* pTyp, ULONG nFmt = 0, USHORT nLang = LANGUAGE_SYSTEM);
public:
    virtual             ~SwField();

    // Typ feststellen
    inline SwFieldType* GetTyp() const;

    // neuen Typ setzen (wird fuer das Kopieren zwischen Dokumenten benutzt)
    virtual SwFieldType* ChgTyp( SwFieldType* );

    // Expandierung fuer die Anzeige
    virtual String      Expand() const = 0;

    // liefert den Namen oder den Inhalt
    virtual String      GetCntnt(BOOL bName = FALSE) const;
    virtual SwField*    Copy() const = 0;

    // ResId
    USHORT              Which() const
#ifdef PRODUCT
        { return pType->Which(); }
#else
        ;       // in fldbas.cxx implementiert
#endif

    // TYP_ID
            USHORT      GetTypeId() const;
    static  USHORT      GetResId(USHORT nTypeId, BOOL& bAmbigous);
    virtual USHORT      GetSubType() const;
    virtual void        SetSubType(USHORT);

    // Sprache an der Feldposition
    inline USHORT       GetLanguage() const;
    virtual void        SetLanguage(USHORT nLng);

    // Parameter fuer Dialog und BASIC erfragen
    inline ULONG        GetFormat() const;
    virtual const String& GetPar1() const;
    virtual String      GetPar2()   const;

    virtual String      GetFormula() const;

    virtual void        ChangeFormat(ULONG n);
    virtual void        SetPar1(const String& rStr);
    virtual void        SetPar2(const String& rStr);

    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );
    // hat das Feld eine Action auf dem ClickHandler ? (z.B. INetFelder,..)
    FASTBOOL            HasClickHdl() const;
    // ist es ein Fix-Feld?
    FASTBOOL            IsFixed() const;
};

inline SwFieldType* SwField::GetTyp() const
    { return pType;     }

inline ULONG SwField::GetFormat() const
    { return nFormat;   }

inline USHORT SwField::GetLanguage() const
    { return nLang;     }

/*--------------------------------------------------------------------
    Beschreibung:   Felder mit Values, die ueber der Numberformatter
                    formatiert werden muessen
 --------------------------------------------------------------------*/

class SwValueFieldType : public SwFieldType
{
    SwDoc*  pDoc;
    BOOL    bUseFormat; // Numberformatter verwenden

protected:
    SwValueFieldType( SwDoc* pDocPtr, USHORT nWhichId );
    SwValueFieldType( const SwValueFieldType& rTyp );

public:
    inline SwDoc*   GetDoc() const                      { return pDoc; }
    inline void     SetDoc(SwDoc* pNewDoc)              { pDoc = pNewDoc; }

    inline BOOL     UseFormat() const                   { return bUseFormat; }
    inline void     EnableFormat(BOOL bFormat = TRUE)   { bUseFormat = bFormat; }

    String          ExpandValue(const double& rVal, ULONG nFmt, USHORT nLng=0) const;
    void            DoubleToString(String &rValue, const double &rVal, LanguageType eLng) const;
    void            DoubleToString(String &rValue, const double &rVal, ULONG nFmt) const;
};

class SwValueField : public SwField
{
    double fValue;
//  String sExpand;

protected:
    SwValueField( SwValueFieldType* pFldType, ULONG nFmt = 0, USHORT nLang = LANGUAGE_SYSTEM, const double fVal = 0.0 );
    SwValueField( const SwValueField& rFld );

public:
    virtual SwFieldType*    ChgTyp( SwFieldType* );
    virtual void            SetLanguage(USHORT nLng);
//  os: wozu war das denn da?
//  virtual void            ChangeFormat(ULONG n);

    inline SwDoc*           GetDoc() const          { return ((SwValueFieldType*)GetTyp())->GetDoc(); }

    virtual double          GetValue() const;
    virtual void            SetValue( const double& rVal );

    inline String   ExpandValue(const double& rVal, ULONG nFmt, USHORT nLng=0) const
        { return ((SwValueFieldType*)GetTyp())->ExpandValue(rVal, nFmt, nLng); }

    static ULONG            GetSystemFormat(SvNumberFormatter* pFormatter, ULONG nFmt);
};

class SwFormulaField : public SwValueField
{
    String sFormula;

protected:
    SwFormulaField( SwValueFieldType* pFldType, ULONG nFmt = 0, const double fVal = 0.0 );
    SwFormulaField( const SwFormulaField& rFld );

public:
    virtual String          GetFormula() const;
    void                    SetFormula(const String& rStr);

    void                    SetExpandedFormula(const String& rStr);
    String                  GetExpandedFormula() const;

};


/*--------------------------------------------------------------------
    Beschreibung:   Sortierung von Felder nach der Position
 --------------------------------------------------------------------*/
class SwFieldList
{
public:
    SwFieldList(SwEditShell* pShell);
    ~SwFieldList();

    // Felder eines bestimmten Typen aufnehmen
    void        InsertFields(USHORT nTypeId, const String* pName=0);

    USHORT      Count() const;

    SwField*    GetLastField() const;
    SwField*    GetNextField() const;

private:
    SwEditShell*    pSh;
    _SetGetExpFlds* pSrtLst;
};

inline SvStringsDtor* SwFieldType::GetFldNames()
{
    if( !SwFieldType::pFldNames )
        SwFieldType::_GetFldName();
    return SwFieldType::pFldNames;
}

#endif  // FIELDIDS_ONLY


#endif // _FLDBAS_HXX
diff --git a/sw/inc/flddat.hxx b/sw/inc/flddat.hxx
new file mode 100644
index 0000000..660e8ef
--- /dev/null
+++ b/sw/inc/flddat.hxx
@@ -0,0 +1,180 @@
/*************************************************************************
 *
 *  $RCSfile: flddat.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _FLDDAT_HXX
#define _FLDDAT_HXX

#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif

#include "fldbas.hxx"

/*--------------------------------------------------------------------
    Beschreibung: Formate
 --------------------------------------------------------------------*/

enum SwDateFormat
{
    DF_BEGIN,
    //neue Formate:
    DFF_SSYS = DF_BEGIN,
    DFF_LSYS ,
    DFF_DMY ,
    DFF_DMYY ,
    DFF_DMMY ,
    DFF_DMMYY,
    DFF_DMMMY ,
    DFF_DMMMYY,
    DFF_DDMMY ,
    DFF_DDMMMY ,
    DFF_DDMMMYY ,
    DFF_DDDMMMY ,
    DFF_DDDMMMYY ,
    DFF_MY ,
    DFF_MD ,
    DFF_YMD ,
    DFF_YYMD ,
    DF_END ,
//  Kompatibilitaet:
    DF_SSYS     = DFF_SSYS,
    DF_LSYS     = DFF_LSYS,
    DF_SHORT    = DFF_DMY,
    DF_SCENT    = DFF_DMYY,
    DF_LMON     = DFF_DMMYY,
    DF_LMONTH   = DFF_DMMMYY,
    DF_LDAYMON  = DFF_DDMMMYY,
    DF_LDAYMONTH= DFF_DDDMMMYY
};

enum SwTimeFormat
{
    TF_BEGIN,
    TF_SYSTEM=TF_BEGIN,
    TF_SSMM_24,
    TF_SSMM_12,
    TF_END
};

enum SwTimeSubFormat
{
    TIME_FIX,
    TIME_VAR
};

enum SwDateSubFormat
{
    DATE_FIX,
    DATE_VAR
};

/*--------------------------------------------------------------------
    Beschreibung: Datum/Uhrzeitfeld
 --------------------------------------------------------------------*/

class SwDateTimeFieldType : public SwValueFieldType
{
public:
        SwDateTimeFieldType(SwDoc* pDoc);

        virtual SwFieldType*    Copy() const;
};

/*--------------------------------------------------------------------
    Beschreibung: Datum/Uhrzeitfeld
 --------------------------------------------------------------------*/

class SwDateTimeField : public SwValueField
{
        USHORT              nSubType;
        long                nOffset;    // Offset in Minuten

public:
        SwDateTimeField(SwDateTimeFieldType* pType, USHORT nSubType = DATEFLD,
                    ULONG nFmt = 0, USHORT nLng = 0);

        virtual USHORT          GetSubType() const;
        virtual void            SetSubType(USHORT nSub);

        virtual double          GetValue() const;

        virtual void            SetPar2(const String& rStr);
        virtual String          GetPar2() const;

        inline BOOL             IsDate() const
                                { return (nSubType & DATEFLD) != 0; }

        inline void             SetOffset(long nMinutes)    { nOffset = nMinutes; }
        inline long             GetOffset() const           { return nOffset; }

        ULONG                   GetDate(BOOL bUseOffset = FALSE) const;
        ULONG                   GetTime(BOOL bUseOffset = FALSE) const;
        void                    SetDateTime(ULONG nDate, ULONG nTime);
        static double           GetDateTime(SwDoc* pDoc, ULONG nDate, ULONG nTime);

        virtual String          Expand() const;
        virtual SwField*        Copy() const;

    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );
};

#endif // _FLDDAT_HXX
diff --git a/sw/inc/fldinit.hxx b/sw/inc/fldinit.hxx
new file mode 100644
index 0000000..b2003c6
--- /dev/null
+++ b/sw/inc/fldinit.hxx
@@ -0,0 +1,72 @@
/*************************************************************************
 *
 *  $RCSfile: fldinit.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FLDINIT_HXX
#define _FLDINIT_HXX

/*--------------------------------------------------------------------
    Beschreibung: Tabelle aller FeldInfos
 --------------------------------------------------------------------*/

void InitFieldInfo();
void FinitFieldInfo();


#endif // _FLDINIT_HXX
diff --git a/sw/inc/fldupde.hxx b/sw/inc/fldupde.hxx
new file mode 100644
index 0000000..c491f8f
--- /dev/null
+++ b/sw/inc/fldupde.hxx
@@ -0,0 +1,73 @@
/*************************************************************************
 *
 *  $RCSfile: fldupde.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FLDUPDE_HXX
#define _FLDUPDE_HXX

enum SwFldUpdateFlags
{
    AUTOUPD_OFF,
    AUTOUPD_FIELD_ONLY,
    AUTOUPD_FIELD_AND_CHARTS,
    AUTOUPD_GLOBALSETTING
};


#endif
diff --git a/sw/inc/flyenum.hxx b/sw/inc/flyenum.hxx
new file mode 100644
index 0000000..85056f0
--- /dev/null
+++ b/sw/inc/flyenum.hxx
@@ -0,0 +1,89 @@
/*************************************************************************
 *
 *  $RCSfile: flyenum.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _FLYENUM_HXX
#define _FLYENUM_HXX

enum FlyCntType
{
     FLYCNTTYPE_ALL = 0,
     FLYCNTTYPE_FRM,
     FLYCNTTYPE_GRF,
     FLYCNTTYPE_OLE

};

//Returnwerte fuer Chainable und Chain
#define SW_CHAIN_OK             0
#define SW_CHAIN_NOT_EMPTY      1       //Nur leere Frames duerfen connected werden
#define SW_CHAIN_IS_IN_CHAIN    2       //Destination ist bereits in einer chain
#define SW_CHAIN_WRONG_AREA     3       //Destination steht in einer nicht erlaubten
                                        //Section (Kopf-/Fusszeile)
#define SW_CHAIN_NOT_FOUND      4       //Destination und/oder Source nicht gefunden
#define SW_CHAIN_SOURCE_CHAINED 5       //Source hat bereits einen Follow
#define SW_CHAIN_SELF           6       //Sich selbst zu verketten  ist
                                        //natuerlich nicht erleubt.



#endif


diff --git a/sw/inc/flypos.hxx b/sw/inc/flypos.hxx
new file mode 100644
index 0000000..75d8ed7
--- /dev/null
+++ b/sw/inc/flypos.hxx
@@ -0,0 +1,97 @@
/*************************************************************************
 *
 *  $RCSfile: flypos.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FLYPOS_HXX
#define _FLYPOS_HXX


#ifndef _SVARRAY_HXX //autogen
#include <svtools/svarray.hxx>
#endif

class SwCntntNode;
class ViewShell;
class SwFrmFmt;
class SwNodeIndex;

// Struktur zum Erfragen der akt. freifliegenden Rahmen am Dokument.
class SwPosFlyFrm
{
    const SwFrmFmt* pFrmFmt;    // das FlyFrmFmt
//  SwPosition* pPos;           // Position in den ContentNode
    SwNodeIndex* pNdIdx;        // es reicht ein Index auf den Node
    UINT32 nOrdNum;
public:
    SwPosFlyFrm( const SwNodeIndex& , const SwFrmFmt*, USHORT nArrPos );
    virtual ~SwPosFlyFrm(); // virtual fuer die Writer (DLL !!)

    // operatoren fuer das Sort-Array
    BOOL operator==( const SwPosFlyFrm& );
    BOOL operator<( const SwPosFlyFrm& );

    const SwFrmFmt& GetFmt() const { return *pFrmFmt; }
    const SwNodeIndex& GetNdIndex() const { return *pNdIdx; }
    UINT32 GetOrdNum() const { return nOrdNum; }
};

typedef SwPosFlyFrm* SwPosFlyFrmPtr;
SV_DECL_PTRARR_SORT( SwPosFlyFrms, SwPosFlyFrmPtr, 0, 40 )

#endif _FLYPOS_HXX
diff --git a/sw/inc/fmtanchr.hxx b/sw/inc/fmtanchr.hxx
new file mode 100644
index 0000000..d52d41d
--- /dev/null
+++ b/sw/inc/fmtanchr.hxx
@@ -0,0 +1,130 @@
/*************************************************************************
 *
 *  $RCSfile: fmtanchr.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FMTANCHR_HXX
#define _FMTANCHR_HXX

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _SWTYPES_HXX //autogen
#include <swtypes.hxx>
#endif
#ifndef _FORMAT_HXX //autogen
#include <format.hxx>
#endif
#ifndef _SFXPOOLITEM_HXX //autogen
#include <svtools/poolitem.hxx>
#endif

struct SwPosition;
class International;
#define IVER_FMTANCHOR_LONGIDX ((USHORT)1)

//FlyAnchor, Anker des Freifliegenden Rahmen ----

class SwFmtAnchor: public SfxPoolItem
{
    SwPosition *pCntntAnchor;   //0 Fuer Seitengebundene Rahmen.
                                //Index fuer Absatzgebundene Rahmen.
                                //Position fuer Zeichengebundene Rahmen
    RndStdIds  nAnchorId;
    USHORT     nPageNum;        //Seitennummer bei Seitengeb. Rahmen.

public:
    SwFmtAnchor( RndStdIds eRnd = FLY_PAGE, USHORT nPageNum = 0 );
    SwFmtAnchor( const SwFmtAnchor &rCpy );
    ~SwFmtAnchor();

    //  Zuweisungsoperator
    SwFmtAnchor &operator=( const SwFmtAnchor& );

    // "pure virtual Methoden" vom SfxPoolItem
    virtual int             operator==( const SfxPoolItem& ) const;
    virtual SfxPoolItem*    Clone( SfxItemPool* pPool = 0 ) const;
    virtual SfxPoolItem*    Create(SvStream &, USHORT nVer) const;
    virtual SvStream&       Store(SvStream &, USHORT nIVer) const;
    virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres,
                                    SfxMapUnit eCoreMetric,
                                    SfxMapUnit ePresMetric,
                                    String &rText,
                                    const International*    pIntl = 0 ) const;
    virtual USHORT          GetVersion( USHORT nFFVer ) const;

    virtual BOOL             QueryValue( com::sun::star::uno::Any& rVal, BYTE nMemberId = 0 ) const;
    virtual BOOL             PutValue( const com::sun::star::uno::Any& rVal, BYTE nMemberId = 0 );

    RndStdIds GetAnchorId() const { return nAnchorId; }
    USHORT GetPageNum() const { return nPageNum; }
    const SwPosition *GetCntntAnchor() const { return pCntntAnchor; }

    void SetPageNum( USHORT nNew ) { nPageNum = nNew; }

    void SetType( RndStdIds nRndId ) { nAnchorId = nRndId; }
    void SetAnchor( const SwPosition *pPos );
};

inline const SwFmtAnchor &SwAttrSet::GetAnchor(BOOL bInP) const
    { return (const SwFmtAnchor&)Get( RES_ANCHOR,bInP); }

inline const SwFmtAnchor &SwFmt::GetAnchor(BOOL bInP) const
    { return aSet.GetAnchor(bInP); }
#endif

diff --git a/sw/inc/fmtclbl.hxx b/sw/inc/fmtclbl.hxx
new file mode 100644
index 0000000..7d938d6
--- /dev/null
+++ b/sw/inc/fmtclbl.hxx
@@ -0,0 +1,102 @@
/*************************************************************************
 *
 *  $RCSfile: fmtclbl.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FMTCLBL_HXX
#define _FMTCLBL_HXX


#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _FORMAT_HXX //autogen
#include <format.hxx>
#endif

class International;

class SwFmtNoBalancedColumns : public SfxBoolItem
{
public:
    SwFmtNoBalancedColumns( BOOL bFlag = FALSE )
        : SfxBoolItem( RES_COLUMNBALANCE, bFlag ) {}

    // "pure virtual Methoden" vom SfxPoolItem
    virtual SfxPoolItem*    Clone( SfxItemPool *pPool = 0 ) const;
    virtual SfxPoolItem*    Create(SvStream &, USHORT) const;
    virtual SvStream&       Store(SvStream &, USHORT nItemVersion ) const;
/*  virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres,
                                    SfxMapUnit eCoreMetric,
                                    SfxMapUnit ePresMetric,
                                    String &rText,
                                    const International*    pIntl = 0 ) const;
*/  virtual USHORT           GetVersion( USHORT nFFVer ) const;
};

inline const SwFmtNoBalancedColumns &SwAttrSet::GetBalancedColumns(BOOL bInP) const
    { return (const SwFmtNoBalancedColumns&)Get( RES_COLUMNBALANCE, bInP ); }

inline const SwFmtNoBalancedColumns &SwFmt::GetBalancedColumns(BOOL bInP) const
    { return aSet.GetBalancedColumns( bInP ); }

#endif

diff --git a/sw/inc/fmtclds.hxx b/sw/inc/fmtclds.hxx
new file mode 100644
index 0000000..1a3f719
--- /dev/null
+++ b/sw/inc/fmtclds.hxx
@@ -0,0 +1,222 @@
/*************************************************************************
 *
 *  $RCSfile: fmtclds.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FMTCLDS_HXX
#define _FMTCLDS_HXX

#ifndef _SV_COLOR_HXX
#include <vcl/color.hxx>
#endif
#ifndef _SFXPOOLITEM_HXX //autogen
#include <svtools/poolitem.hxx>
#endif
#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _FORMAT_HXX //autogen
#include <format.hxx>
#endif

//Der ColumnDescriptor --------------------------

class SwColumn
{
    USHORT nWish;   //Wunschbreite incl. Raender.
                    //Verhaelt sich proportional zum Verhaeltniss:
                    //Wunschbreite der Umgebung / aktuelle Breite der Spalte
    USHORT nUpper;  //Oberer Rand
    USHORT nLower;  //Unterer Rand
    USHORT nLeft;   //Linker Rand
    USHORT nRight;  //Rechter Rand

public:
    SwColumn();

    BOOL operator==( const SwColumn & );


    void SetWishWidth( USHORT nNew ) { nWish  = nNew; }
    void SetUpper( USHORT  nNew ) { nUpper = nNew; }
    void SetLower( USHORT  nNew ) { nLower = nNew; }
    void SetLeft ( USHORT  nNew ) { nLeft  = nNew; }
    void SetRight( USHORT  nNew ) { nRight = nNew; }

    USHORT GetWishWidth() const { return nWish;  }
    USHORT GetUpper() const { return nUpper; }
    USHORT GetLower() const { return nLower; }
    USHORT GetLeft () const { return nLeft; }
    USHORT GetRight() const { return nRight; }
};

typedef SwColumn* SwColumnPtr;
SV_DECL_PTRARR_DEL( SwColumns, SwColumnPtr, 0, 2 );

enum SwColLineAdj
{
    COLADJ_NONE,
    COLADJ_TOP,
    COLADJ_CENTER,
    COLADJ_BOTTOM
};

class SwFmtCol : public SfxPoolItem
{
//  Pen      aPen;          //Pen fuer die Linine zwischen den Spalten
    ULONG   nLineWidth;     //width of the separator line
    Color   aLineColor;     //color of the separator line

    BYTE     nLineHeight;   //Prozentuale Hoehe der Linien
                            //(Relativ zu der Hoehe der Spalten incl. UL).
    SwColLineAdj eAdj;      //Linie wird oben, mittig oder unten ausgerichtet.

    SwColumns   aColumns;   //Informationen fuer die einzelnen Spalten.
    USHORT      nWidth;     //Gesamtwunschbreite aller Spalten.

    BOOL bOrtho;            //Nur wenn dieses Flag gesetzt ist wird beim setzen
                            //der GutterWidth eine 'optische Verteilung'
                            //vorgenommen.
                            //Es muss zurueckgesetzt werden wenn an den
                            //Spaltenbreiten bzw. den Raendern gedreht wird.
                            //Wenn es wieder gesetzt wird wird automatisch neu
                            //gemischt (optisch verteilt).
                            //Das Flag ist initial gesetzt.

    void Calc( USHORT nGutterWidth, USHORT nAct );

public:
    SwFmtCol();
    SwFmtCol( const SwFmtCol& );
    ~SwFmtCol();

    SwFmtCol& operator=( const SwFmtCol& );

    // "pure virtual Methoden" vom SfxPoolItem
    virtual int             operator==( const SfxPoolItem& ) const;
    virtual SfxPoolItem*    Clone( SfxItemPool* pPool = 0 ) const;
    virtual SfxPoolItem*    Create(SvStream &, USHORT nVer) const;
    virtual SvStream&       Store(SvStream &, USHORT nIVer) const;
    virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres,
                                    SfxMapUnit eCoreMetric,
                                    SfxMapUnit ePresMetric,
                                    String &rText,
                                    const International* pIntl = 0 ) const;

    virtual BOOL             QueryValue( com::sun::star::uno::Any& rVal, BYTE nMemberId = 0 ) const;
    virtual BOOL             PutValue( const com::sun::star::uno::Any& rVal, BYTE nMemberId = 0 );

    const SwColumns &GetColumns() const { return aColumns; }
          SwColumns &GetColumns()       { return aColumns; }
    USHORT           GetNumCols() const { return aColumns.Count(); }
//  const Pen&       GetLinePen() const { return aPen; }
    ULONG           GetLineWidth() const  { return nLineWidth;}
    const Color&    GetLineColor() const { return aLineColor;}


    SwColLineAdj     GetLineAdj() const { return eAdj; }
    BOOL             IsOrtho()    const { return bOrtho; }
    USHORT           GetWishWidth() const { return nWidth; }
    BYTE             GetLineHeight()const { return nLineHeight; }

    //Return USHRT_MAX wenn uneindeutig.
    //Return die kleinste Breite wenn bMin True ist.
    USHORT GetGutterWidth( BOOL bMin = FALSE ) const;

//  void SetLinePen( const Pen& rNew )  { aPen = rNew; }
    void SetLineWidth(ULONG nWidth)         { nLineWidth = nWidth;}
    void SetLineColor(const Color& rCol )   { aLineColor = rCol;}
    void SetLineHeight( BYTE nNew )     { nLineHeight = nNew; }
    void SetLineAdj( SwColLineAdj eNew ){ eAdj = eNew; }
    void SetWishWidth( USHORT nNew )    { nWidth = nNew; }

    //Mit dieser Funktion koennen die Spalten (immer wieder) initialisert
    //werden. Das Ortho Flag wird automatisch gesetzt.
    void Init( USHORT nNumCols, USHORT nGutterWidth, USHORT nAct );

    //Stellt die Raender fuer die Spalten in aColumns ein.
    //Wenn das Flag bOrtho gesetzt ist, werden die Spalten neu optisch
    //verteilt. Ist das Flag nicht gesetzt werden die Spaltenbreiten nicht
    //veraendert und die Raender werden einfach eingestellt.
    void SetGutterWidth( USHORT nNew, USHORT nAct );

    //Verteilt ebenfalls automatisch neu wenn das Flag gesetzt wird;
    //nur dann wird auch der zweite Param. benoetigt und beachtet.
    void SetOrtho( BOOL bNew, USHORT nGutterWidth, USHORT nAct );

    //Fuer den Reader
    void _SetOrtho( BOOL bNew ) { bOrtho = bNew; }

    //Berechnet die aktuelle Breite der Spalte nCol.
    //Das Verhaeltniss von Wunschbreite der Spalte zum Returnwert ist
    //proportional zum Verhaeltniss des Gesamtwunschwertes zu nAct.
    USHORT CalcColWidth( USHORT nCol, USHORT nAct ) const;

    //Wie oben, aber es wir die Breite der PrtArea - also das was fuer
    //den Anwender die Spalte ist - geliefert.
    USHORT CalcPrtColWidth( USHORT nCol, USHORT nAct ) const;
};

inline const SwFmtCol &SwAttrSet::GetCol(BOOL bInP) const
    { return (const SwFmtCol&)Get( RES_COL,bInP); }

inline const SwFmtCol &SwFmt::GetCol(BOOL bInP) const
    { return aSet.GetCol(bInP); }

#endif

diff --git a/sw/inc/fmtcnct.hxx b/sw/inc/fmtcnct.hxx
new file mode 100644
index 0000000..df18bed
--- /dev/null
+++ b/sw/inc/fmtcnct.hxx
@@ -0,0 +1,133 @@
/*************************************************************************
 *
 *  $RCSfile: fmtcnct.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FMTCNCT_HXX
#define _FMTCNCT_HXX

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _SFXPOOLITEM_HXX //autogen
#include <svtools/poolitem.hxx>
#endif

#ifndef _FORMAT_HXX //autogen
#include <format.hxx>
#endif
#ifndef _CALBCK_HXX //autogen
#include <calbck.hxx>
#endif


class SwFlyFrmFmt;
class International;

//Verbindung (Textfluss) zwischen zwei FlyFrms

class SwFmtChain: public SfxPoolItem
{
    SwClient aPrev, //Vorgaenger (SwFlyFrmFmt), wenn es diesen gibt.
             aNext; //Nachfolger (SwFlyFrmFmt), wenn es diesen gibt.


public:
    SwFmtChain() : SfxPoolItem( RES_CHAIN ) {}
    SwFmtChain( const SwFmtChain &rCpy );

    inline SwFmtChain &operator=( const SwFmtChain& );

    // "pure virtual Methoden" vom SfxPoolItem
    virtual int             operator==( const SfxPoolItem& ) const;
    virtual SfxPoolItem*    Clone( SfxItemPool* pPool = 0 ) const;
    virtual SfxPoolItem*    Create(SvStream &, USHORT nVer) const;
    virtual SvStream&       Store(SvStream &, USHORT nIVer) const;
    virtual USHORT          GetVersion( USHORT nFFVer ) const;
    virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres,
                                    SfxMapUnit eCoreMetric,
                                    SfxMapUnit ePresMetric,
                                    String &rText,
                                    const International*    pIntl = 0 ) const;

    virtual BOOL             QueryValue( com::sun::star::uno::Any& rVal, BYTE nMemberId = 0 ) const;

    SwFlyFrmFmt* GetPrev() const { return (SwFlyFrmFmt*)aPrev.GetRegisteredIn(); }
    SwFlyFrmFmt* GetNext() const { return (SwFlyFrmFmt*)aNext.GetRegisteredIn(); }


    void SetPrev( SwFlyFrmFmt *pFmt );
    void SetNext( SwFlyFrmFmt *pFmt );
};

SwFmtChain &SwFmtChain::operator=( const SwFmtChain &rCpy )
{
    SetPrev( rCpy.GetPrev() );
    SetNext( rCpy.GetNext() );
    return *this;
}


inline const SwFmtChain &SwAttrSet::GetChain(BOOL bInP) const
    { return (const SwFmtChain&)Get( RES_CHAIN,bInP); }

inline const SwFmtChain &SwFmt::GetChain(BOOL bInP) const
    { return aSet.GetChain(bInP); }

#endif

diff --git a/sw/inc/fmtcntnt.hxx b/sw/inc/fmtcntnt.hxx
new file mode 100644
index 0000000..45b00d9
--- /dev/null
+++ b/sw/inc/fmtcntnt.hxx
@@ -0,0 +1,108 @@
/*************************************************************************
 *
 *  $RCSfile: fmtcntnt.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:25 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FMTCNTNT_HXX
#define _FMTCNTNT_HXX

#ifndef _SFXPOOLITEM_HXX //autogen
#include <svtools/poolitem.hxx>
#endif
#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _FORMAT_HXX //autogen
#include <format.hxx>
#endif

class SwNodeIndex;
class SwStartNode;

//Cntnt, Inhalt des Frame (Header, Footer, Fly) ----

class SwFmtCntnt: public SfxPoolItem
{
    SwNodeIndex *pStartNode;

    SwFmtCntnt &operator=( const SwFmtCntnt & ); //Kopieren verboten

public:
//  SwFmtCntnt( const SwNodeIndex *pStartNodeIdx = 0 );
    SwFmtCntnt( const SwStartNode* pStartNode = 0 );
    SwFmtCntnt( const SwFmtCntnt &rCpy );
    ~SwFmtCntnt();

    // "pure virtual Methoden" vom SfxPoolItem
    virtual int             operator==( const SfxPoolItem& ) const;
    virtual SfxPoolItem*    Clone( SfxItemPool* pPool = 0 ) const;
    virtual SfxPoolItem*    Create(SvStream &, USHORT nVer) const;
    virtual SvStream&       Store(SvStream &, USHORT nIVer) const;

    const SwNodeIndex *GetCntntIdx() const { return pStartNode; }
    void SetNewCntntIdx( const SwNodeIndex *pIdx );
};

inline const SwFmtCntnt &SwAttrSet::GetCntnt(BOOL bInP) const
    { return (const SwFmtCntnt&)Get( RES_CNTNT,bInP); }

inline const SwFmtCntnt &SwFmt::GetCntnt(BOOL bInP) const
    { return aSet.GetCntnt(bInP); }

#endif

diff --git a/sw/inc/fmtcol.hxx b/sw/inc/fmtcol.hxx
new file mode 100644
index 0000000..57e67b9
--- /dev/null
+++ b/sw/inc/fmtcol.hxx
@@ -0,0 +1,301 @@
/*************************************************************************
 *
 *  $RCSfile: fmtcol.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FMTCOL_HXX
#define _FMTCOL_HXX

#ifndef _SVARRAY_HXX //autogen
#include <svtools/svarray.hxx>
#endif

#ifndef _FORMAT_HXX
#include <format.hxx>
#endif
#ifndef _SWTYPES_HXX
#include <swtypes.hxx>      // fuer MAXLEVEL
#endif

class SwDoc;        // fuer friend

class SwFmtColl : public SwFmt
{
protected:
    SwFmtColl( SwAttrPool& rPool, const sal_Char* pFmtName,
                const USHORT* pWhichRanges, SwFmtColl* pDerFrom,
                USHORT nFmtWhich )
          : SwFmt( rPool, pFmtName, pWhichRanges, pDerFrom, nFmtWhich )
    { SetAuto( FALSE ); }

    SwFmtColl( SwAttrPool& rPool, const String &rFmtName,
                const USHORT* pWhichRanges, SwFmtColl* pDerFrom,
                USHORT nFmtWhich )
          : SwFmt( rPool, rFmtName, pWhichRanges, pDerFrom, nFmtWhich )
    { SetAuto( FALSE ); }


private:
    // erstmal wird nicht kopiert und nicht zugewiesen
    SwFmtColl(const SwFmtColl & );
    const SwFmtColl &operator=(const SwFmtColl &);
};


class SwTxtFmtColl: public SwFmtColl
{
    friend class SwDoc;
protected:
    BYTE nOutlineLevel;
    SwTxtFmtColl *pNextTxtFmtColl;

    SwTxtFmtColl( SwAttrPool& rPool, const sal_Char* pFmtCollName,
                    SwTxtFmtColl* pDerFrom = 0,
                    USHORT nFmtWh = RES_TXTFMTCOLL )
        : SwFmtColl( rPool, pFmtCollName, aTxtFmtCollSetRange,
                        pDerFrom, nFmtWh ),
        nOutlineLevel( NO_NUMBERING ),
        pNextTxtFmtColl( this )
    {}

    SwTxtFmtColl( SwAttrPool& rPool, const String &rFmtCollName,
                    SwTxtFmtColl* pDerFrom = 0,
                    USHORT nFmtWh = RES_TXTFMTCOLL )
        : SwFmtColl( rPool, rFmtCollName, aTxtFmtCollSetRange,
                        pDerFrom, nFmtWh ),
        nOutlineLevel( NO_NUMBERING ),
        pNextTxtFmtColl( this )
    {}

public:

    // zum "abfischen" von UL-/LR-/FontHeight Aenderungen
    virtual void Modify( SfxPoolItem*, SfxPoolItem* );

    TYPEINFO();     //Bereits in Basisklasse Client drin.

    inline void SetOutlineLevel( BYTE );
    inline BYTE GetOutlineLevel() const { return nOutlineLevel; }

    inline void SetNextTxtFmtColl(SwTxtFmtColl& rNext);
    SwTxtFmtColl& GetNextTxtFmtColl() const { return *pNextTxtFmtColl; }

    BOOL IsAtDocNodeSet() const;

/*----------------- JP 09.08.94 17:36 -------------------
 wird die Funktionalitaet von Zeichenvorlagen an Absatzvorlagen
 ueberhaupt benoetigt ??

 Wenn, ja dann muessen im TextNode und hier in der TxtCollection ein 2.
 Attset fuer die Char-Attribute angelegt werden; damit die Vererbung
 und der Zugriff auf die gesetzen Attribute richtig funktioniert!!

    virtual BOOL SetDerivedFrom( SwFmtColl* pDerFrom = 0 );

    inline SwCharFmt* GetCharFmt() const;
    inline BOOL IsCharFmtSet() const;
    void SetCharFmt(SwCharFmt *);
    void ResetCharFmt();
inline BOOL SwTxtFmtColl::IsCharFmtSet() const
{
    return aCharDepend.GetRegisteredIn() ? TRUE : FALSE;
}
inline SwCharFmt* SwTxtFmtColl::GetCharFmt() const
{
    return (SwCharFmt*)aCharDepend.GetRegisteredIn();
}
--------------------------------------------------*/
};

typedef SwTxtFmtColl* SwTxtFmtCollPtr;
SV_DECL_PTRARR(SwTxtFmtColls,SwTxtFmtCollPtr,2,4)


class SwGrfFmtColl: public SwFmtColl
{
    friend class SwDoc;
protected:
    SwGrfFmtColl( SwAttrPool& rPool, const sal_Char* pFmtCollName,
                    SwGrfFmtColl* pDerFrom = 0 )
        : SwFmtColl( rPool, pFmtCollName, aGrfFmtCollSetRange,
                    pDerFrom, RES_GRFFMTCOLL )
    {}

    SwGrfFmtColl( SwAttrPool& rPool, const String &rFmtCollName,
                    SwGrfFmtColl* pDerFrom = 0 )
        : SwFmtColl( rPool, rFmtCollName, aGrfFmtCollSetRange,
                    pDerFrom, RES_GRFFMTCOLL )
    {}

public:
    TYPEINFO();     //Bereits in Basisklasse Client drin.
};

typedef SwGrfFmtColl* SwGrfFmtCollPtr;
SV_DECL_PTRARR(SwGrfFmtColls,SwGrfFmtCollPtr,2,4)



//FEATURE::CONDCOLL
// --------- Bedingte Vorlagen -------------------------------

enum Master_CollConditions
{
    PARA_IN_LIST        = 0x0001,
    PARA_IN_OUTLINE     = 0x0002,
    PARA_IN_FRAME       = 0x0004,
    PARA_IN_TABLEHEAD   = 0x0008,
    PARA_IN_TABLEBODY   = 0x0010,
    PARA_IN_SECTION     = 0x0020,
    PARA_IN_FOOTENOTE   = 0x0040,
    PARA_IN_FOOTER      = 0x0080,
    PARA_IN_HEADER      = 0x0100,
    PARA_IN_ENDNOTE     = 0x0200,
    // ...
    USRFLD_EXPRESSION   = (int)0x8000
};


class SwCollCondition : public SwClient
{
    ULONG nCondition;
    union
    {
        ULONG nSubCondition;
        String* pFldExpression;
    } aSubCondition;

public:
    TYPEINFO();     //Bereits in Basisklasse Client drin.


    SwCollCondition( SwTxtFmtColl* pColl, ULONG nMasterCond,
                    ULONG nSubCond = 0 );
    SwCollCondition( SwTxtFmtColl* pColl, ULONG nMasterCond,
                    const String& rSubExp );
    SwCollCondition( const SwCollCondition& rCpy );

    virtual ~SwCollCondition();

    int operator==( const SwCollCondition& rCmp ) const;
    int operator!=( const SwCollCondition& rCmp ) const
                            { return ! (*this == rCmp); }

    ULONG GetCondition() const      { return nCondition; }
    ULONG GetSubCondition() const   { return aSubCondition.nSubCondition; }
    const String* GetFldExpression() const
                                    { return aSubCondition.pFldExpression; }

    void SetCondition( ULONG nCond, ULONG nSubCond );
    SwTxtFmtColl* GetTxtFmtColl() const     { return (SwTxtFmtColl*)GetRegisteredIn(); }
};


typedef SwCollCondition* SwCollConditionPtr;
SV_DECL_PTRARR_DEL( SwFmtCollConditions, SwCollConditionPtr, 0, 5 );

class SwConditionTxtFmtColl : public SwTxtFmtColl
{
    friend class SwDoc;
protected:
    SwFmtCollConditions aCondColls;

    SwConditionTxtFmtColl( SwAttrPool& rPool, const sal_Char* pFmtCollName,
                            SwTxtFmtColl* pDerFrom = 0 )
        : SwTxtFmtColl( rPool, pFmtCollName, pDerFrom, RES_CONDTXTFMTCOLL )
    {}
    SwConditionTxtFmtColl( SwAttrPool& rPool, const String &rFmtCollName,
                            SwTxtFmtColl* pDerFrom = 0 )
        : SwTxtFmtColl( rPool, rFmtCollName, pDerFrom, RES_CONDTXTFMTCOLL )
    {}

public:
    TYPEINFO();     //Bereits in Basisklasse Client drin.

    virtual ~SwConditionTxtFmtColl();

    // zum "abfischen" von Aenderungen
//  virtual void Modify( SfxPoolItem*, SfxPoolItem* );

    const SwCollCondition* HasCondition( const SwCollCondition& rCond ) const;
    const SwFmtCollConditions& GetCondColls() const     { return aCondColls; }
    void InsertCondition( const SwCollCondition& rCond );
    BOOL RemoveCondition( const SwCollCondition& rCond );

    void SetConditions( const SwFmtCollConditions& );
};

//FEATURE::CONDCOLL

// ------------- Inline Implementierungen --------------------

inline void SwTxtFmtColl::SetNextTxtFmtColl( SwTxtFmtColl& rNext )
{
    pNextTxtFmtColl = &rNext;
}

inline void SwTxtFmtColl::SetOutlineLevel( BYTE nLevel )
{
    ASSERT( nLevel < MAXLEVEL || nLevel == NO_NUMBERING ,
                            "SwTxtFmtColl: Level too low" );
    nOutlineLevel = nLevel;
}


#endif

diff --git a/sw/inc/fmteiro.hxx b/sw/inc/fmteiro.hxx
new file mode 100644
index 0000000..1ffdeeb
--- /dev/null
+++ b/sw/inc/fmteiro.hxx
@@ -0,0 +1,102 @@
/*************************************************************************
 *
 *  $RCSfile: fmteiro.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FMTEIRO_HXX
#define _FMTEIRO_HXX


#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _FORMAT_HXX //autogen
#include <format.hxx>
#endif

class International;

class SwFmtEditInReadonly : public SfxBoolItem
{
public:
    SwFmtEditInReadonly( USHORT nId = RES_EDIT_IN_READONLY,
                     BOOL bPrt = FALSE ) : SfxBoolItem( nId, bPrt ) {}

    // "pure virtual Methoden" vom SfxPoolItem
    virtual SfxPoolItem*    Clone( SfxItemPool *pPool = 0 ) const;
    virtual SfxPoolItem*    Create(SvStream &, USHORT) const;
    virtual SvStream&       Store(SvStream &, USHORT nItemVersion ) const;
    virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres,
                                    SfxMapUnit eCoreMetric,
                                    SfxMapUnit ePresMetric,
                                    String &rText,
                                    const International*    pIntl = 0 ) const;
    virtual USHORT           GetVersion( USHORT nFFVer ) const;
};

inline const SwFmtEditInReadonly &SwAttrSet::GetEditInReadonly(BOOL bInP) const
    { return (const SwFmtEditInReadonly&)Get( RES_EDIT_IN_READONLY,bInP); }

inline const SwFmtEditInReadonly &SwFmt::GetEditInReadonly(BOOL bInP) const
    { return aSet.GetEditInReadonly(bInP); }

#endif

diff --git a/sw/inc/fmtflcnt.hxx b/sw/inc/fmtflcnt.hxx
new file mode 100644
index 0000000..3a494ac
--- /dev/null
+++ b/sw/inc/fmtflcnt.hxx
@@ -0,0 +1,98 @@
/*************************************************************************
 *
 *  $RCSfile: fmtflcnt.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FMTFLCNT_HXX
#define _FMTFLCNT_HXX


#ifndef _SFXPOOLITEM_HXX //autogen
#include <svtools/poolitem.hxx>
#endif

class SwFrmFmt;
// ATT_FLYCNT *******************************************************

class SwFmtFlyCnt : public SfxPoolItem
{
    friend class SwTxtFlyCnt;
    SwTxtFlyCnt* pTxtAttr;      // mein TextAttribut
    SwFrmFmt* pFmt;             // mein Fly/DrawFrame-Format
    // geschuetzter CopyCtor
    SwFmtFlyCnt& operator=(const SwFmtFlyCnt& rFlyCnt);

public:
    SwFmtFlyCnt( SwFrmFmt *pFrmFmt );
    // "pure virtual Methoden" vom SfxPoolItem
    virtual int             operator==( const SfxPoolItem& ) const;
    virtual SfxPoolItem*    Clone( SfxItemPool* pPool = 0 ) const;
    virtual SfxPoolItem*    Create(SvStream &, USHORT nVer) const;
    virtual SvStream&       Store(SvStream &, USHORT nIVer) const;

    inline SwFrmFmt *GetFrmFmt() const { return pFmt; }
    // fuer Undo: loesche "logisch" das FlyFrmFormat, wird sich im
    //          Undo-Object gemerkt.
    inline void SetFlyFmt( SwFrmFmt* pNew = 0 )   { pFmt = pNew; }

    const SwTxtFlyCnt *GetTxtFlyCnt() const { return pTxtAttr; }
          SwTxtFlyCnt *GetTxtFlyCnt()       { return pTxtAttr; }
};

#endif

diff --git a/sw/inc/fmtfld.hxx b/sw/inc/fmtfld.hxx
new file mode 100644
index 0000000..ecd0932
--- /dev/null
+++ b/sw/inc/fmtfld.hxx
@@ -0,0 +1,114 @@
/*************************************************************************
 *
 *  $RCSfile: fmtfld.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FMTFLD_HXX
#define _FMTFLD_HXX


#ifndef _SFXPOOLITEM_HXX //autogen
#include <svtools/poolitem.hxx>
#endif
#ifndef _CALBCK_HXX //autogen
#include <calbck.hxx>
#endif

class SwField;
// ATT_FLD ***********************************

class SwFmtFld : public SfxPoolItem, public SwClient
{
    friend class SwTxtFld;
    friend void _InitCore();

    SwField *pField;
    SwTxtFld* pTxtAttr;     // mein TextAttribut
    SwFmtFld();             // das default-Attibut

    // geschuetzter CopyCtor
    SwFmtFld& operator=(const SwFmtFld& rFld);
public:
    TYPEINFO();

    SwFmtFld( const SwField &rFld );
    SwFmtFld( const SwFmtFld& rAttr );
    ~SwFmtFld();

    // "pure virtual Methoden" vom SfxPoolItem
    virtual int             operator==( const SfxPoolItem& ) const;
    virtual SfxPoolItem*    Clone( SfxItemPool* pPool = 0 ) const;
    virtual SfxPoolItem*    Create(SvStream &, USHORT nVer) const;
    virtual SvStream&       Store(SvStream &, USHORT nIVer) const;

    virtual void Modify( SfxPoolItem* pOld, SfxPoolItem* pNew );
    virtual BOOL GetInfo( SfxPoolItem& rInfo ) const;

    const SwField *GetFld() const   { return pField; }
    SwField *GetFld()               { return pField; }

    const SwTxtFld *GetTxtFld() const   { return pTxtAttr; }
    SwTxtFld *GetTxtFld()               { return pTxtAttr; }

    BOOL IsFldInDoc() const;
    BOOL IsProtect() const;
};


#endif

diff --git a/sw/inc/fmtfordr.hxx b/sw/inc/fmtfordr.hxx
new file mode 100644
index 0000000..98dde73
--- /dev/null
+++ b/sw/inc/fmtfordr.hxx
@@ -0,0 +1,115 @@
/*************************************************************************
 *
 *  $RCSfile: fmtfordr.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FMTFORDR_HXX
#define _FMTFORDR_HXX

#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _FORMAT_HXX //autogen
#include <format.hxx>
#endif

//Die FillOrder ---------------------------------

enum SwFillOrder
{
    SW_FILL_ORDER_BEGIN,
    ATT_TOP_DOWN = SW_FILL_ORDER_BEGIN,
    ATT_BOTTOM_UP,
    ATT_LEFT_TO_RIGHT,
    ATT_RIGHT_TO_LEFT,
    SW_FILL_ORDER_END
};

class SwFmtFillOrder: public SfxEnumItem
{
public:
    SwFmtFillOrder( SwFillOrder = ATT_TOP_DOWN );
    inline SwFmtFillOrder &operator=( const SwFmtFillOrder &rCpy );

    // "pure virtual Methoden" vom SfxPoolItem
    virtual SfxPoolItem*    Clone( SfxItemPool *pPool = 0 ) const;
    virtual SfxPoolItem*    Create(SvStream &, USHORT nVer) const;
    virtual SvStream&       Store(SvStream &, USHORT nIVer) const;
    virtual USHORT          GetValueCount() const;

    const SwFillOrder GetFillOrder() const { return SwFillOrder(GetValue()); }
    void  SetFillOrder( const SwFillOrder eNew ) { SetValue( USHORT(eNew) ); }
};

inline SwFmtFillOrder &SwFmtFillOrder::operator=( const SwFmtFillOrder &rCpy )
{
    SetValue( rCpy.GetValue() );
    return *this;
}

inline const SwFmtFillOrder &SwAttrSet::GetFillOrder(BOOL bInP) const
    { return (const SwFmtFillOrder&)Get( RES_FILL_ORDER,bInP); }

inline const SwFmtFillOrder &SwFmt::GetFillOrder(BOOL bInP) const
    { return aSet.GetFillOrder(bInP); }

#endif

diff --git a/sw/inc/fmtfsize.hxx b/sw/inc/fmtfsize.hxx
new file mode 100644
index 0000000..d52461d3
--- /dev/null
+++ b/sw/inc/fmtfsize.hxx
@@ -0,0 +1,166 @@
/*************************************************************************
 *
 *  $RCSfile: fmtfsize.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FMTFSIZE_HXX
#define _FMTFSIZE_HXX

#ifndef _GEN_HXX //autogen
#include <tools/gen.hxx>
#endif
#ifndef _SFXPOOLITEM_HXX //autogen
#include <svtools/poolitem.hxx>
#endif
#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _SWTYPES_HXX //autogen
#include <swtypes.hxx>
#endif
#ifndef _FORMAT_HXX //autogen
#include <format.hxx>
#endif

class International;

//Die Framesize ---------------------------------

enum SwFrmSize
{
    ATT_VAR_SIZE,       //Frm ist in der Var-Richtung variabel
    ATT_FIX_SIZE,       //Frm ist in der Var-Richtung unbeweglich
    ATT_MIN_SIZE        //Der Wert in der Var-Richtung beschreibt eine
                        //Minimalgroesse, die nicht unter- wohl aber
                        //ueberschritten werden kann.
};

class SwFmtFrmSize: public SfxPoolItem
{
    Size      aSize;
    SwFrmSize eFrmSize;
    BYTE      nWidthPercent;    //Fuer Tabellen kann die Breite in Prozent
    BYTE      nHeightPercent;   //angegeben sein.
                                //Fuer Rahmen koennen Hoehe und/oder Breite
                                //in Prozent angegeben sein. Wenn nur eine
                                //der Angaben in Prozent angeben ist, kann
                                //durch den ausgezeichneten Wert 0xFF in der
                                //anderen Prozentangabe bestimmt werden, das
                                //sich diese Richtung proportional zur anderen
                                //verhaelt. Basis fuer die Umrechnung sind fuer
                                //diesen Fall die Angaben in der Size.
                                //Die Prozentwerte beziehen sich immer auf die
                                //Umgebung in der das Objekt steht (PrtArea)
                                //Auf die Bildschirmbreite abzueglich Raender
                                //in der BrowseView wenn die Umgebung die Seite
                                //ist.
public:
    SwFmtFrmSize( SwFrmSize eSize = ATT_VAR_SIZE,
                  SwTwips nWidth = 0, SwTwips nHeight = 0 );
    SwFmtFrmSize& operator=( const SwFmtFrmSize& rCpy );

    // "pure virtual Methoden" vom SfxPoolItem
    virtual int             operator==( const SfxPoolItem& ) const;
    virtual SfxPoolItem*    Clone( SfxItemPool *pPool = 0 ) const;
    virtual SfxPoolItem*    Create(SvStream &, USHORT nVer) const;
    virtual SvStream&       Store(SvStream &, USHORT nIVer ) const;
    virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres,
                                    SfxMapUnit eCoreMetric,
                                    SfxMapUnit ePresMetric,
                                    String &rText,
                                    const International*    pIntl = 0 ) const;
    virtual BOOL             QueryValue( com::sun::star::uno::Any& rVal, BYTE nMemberId = 0 ) const;
    virtual BOOL             PutValue( const com::sun::star::uno::Any& rVal, BYTE nMemberId = 0 );
    virtual USHORT           GetVersion( USHORT nFFVer ) const;

    SwFrmSize GetSizeType() const { return eFrmSize; }
    void SetSizeType( SwFrmSize eSize ) { eFrmSize = eSize; }

    const Size& GetSize() const { return aSize; }
          void  SetSize( const Size &rNew ) { aSize = rNew; }

    SwTwips GetHeight() const { return aSize.Height(); }
    SwTwips GetWidth()  const { return aSize.Width();  }
    void    SetHeight( const SwTwips nNew ) { aSize.Height() = nNew; }
    void    SetWidth ( const SwTwips nNew ) { aSize.Width()  = nNew; }

    BYTE    GetHeightPercent() const{ return nHeightPercent; }
    BYTE    GetWidthPercent() const { return nWidthPercent;  }
    void    SetHeightPercent( BYTE n ) { nHeightPercent = n; }
    void    SetWidthPercent ( BYTE n ) { nWidthPercent  = n; }

    // Umrechnung der Groesse zwischen SW31/SW40
    Size    GetSizeConvertedToSw31( const SvxLRSpaceItem *pLRSpace,
                                    const SvxULSpaceItem *pULSpace ) const;
    Size    GetSizeConvertedFromSw31( const SvxLRSpaceItem *pLRSpace,
                                      const SvxULSpaceItem *pULSpace ) const;

    virtual BOOL        importXML( const NAMESPACE_RTL(OUString)& rValue,USHORT,
                                   const SvXMLUnitConverter& rUnitConv );
    virtual BOOL        exportXML( NAMESPACE_RTL(OUString)& rValue, USHORT,
                                   const SvXMLUnitConverter& rUnitConv ) const;
};

inline const SwFmtFrmSize &SwAttrSet::GetFrmSize(BOOL bInP) const
    { return (const SwFmtFrmSize&)Get( RES_FRM_SIZE,bInP); }

inline const SwFmtFrmSize &SwFmt::GetFrmSize(BOOL bInP) const
    { return aSet.GetFrmSize(bInP); }

#endif

diff --git a/sw/inc/fmtftn.hxx b/sw/inc/fmtftn.hxx
new file mode 100644
index 0000000..45d8432
--- /dev/null
+++ b/sw/inc/fmtftn.hxx
@@ -0,0 +1,121 @@
/*************************************************************************
 *
 *  $RCSfile: fmtftn.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FMTFTN_HXX
#define _FMTFTN_HXX


#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif
#ifndef _SFXPOOLITEM_HXX //autogen
#include <svtools/poolitem.hxx>
#endif

class SwDoc;

// ATT_FTN **********************************************************

class SwFmtFtn: public SfxPoolItem
{
    friend class SwTxtFtn;
    SwTxtFtn* pTxtAttr;     //mein TextAttribut
    String  aNumber;        //Benutzerdefinierte 'Nummer'
    USHORT  nNumber;        //Automatische Nummerierung
    BOOL    bEndNote;       //Ist es eine Endnote?

    // geschuetzter CopyCtor
    SwFmtFtn& operator=(const SwFmtFtn& rFtn);
    SwFmtFtn( const SwFmtFtn& );

public:
    SwFmtFtn( BOOL bEndNote = FALSE );
    ~SwFmtFtn();

    // "pure virtual Methoden" vom SfxPoolItem
    virtual int             operator==( const SfxPoolItem& ) const;
    virtual SfxPoolItem*    Clone( SfxItemPool* pPool = 0 ) const;
    virtual SfxPoolItem*    Create(SvStream &, USHORT nVer) const;
    virtual SvStream&       Store(SvStream &, USHORT nIVer) const;
    virtual USHORT          GetVersion( USHORT nFFVer ) const;

    const String &GetNumStr() const { return aNumber; }
    const USHORT &GetNumber() const { return nNumber; }
          BOOL    IsEndNote() const { return bEndNote;}

    void SetNumStr( const String& rStr )    { aNumber = rStr; }
    void SetNumber( USHORT nNo )            { nNumber = nNo; }
    void SetEndNote( BOOL b );

    void SetNumber( const SwFmtFtn& rFtn )
        { nNumber = rFtn.nNumber; aNumber = rFtn.aNumber; }

    const SwTxtFtn *GetTxtFtn() const   { return pTxtAttr; }
          SwTxtFtn *GetTxtFtn()         { return pTxtAttr; }

    void GetFtnText( String& rStr ) const;

    // returnt den anzuzeigenden String der Fuss-/Endnote
    String GetViewNumStr( const SwDoc& rDoc, BOOL bInclStrs = FALSE ) const;
};


#endif

diff --git a/sw/inc/fmtftntx.hxx b/sw/inc/fmtftntx.hxx
new file mode 100644
index 0000000..4547809
--- /dev/null
+++ b/sw/inc/fmtftntx.hxx
@@ -0,0 +1,183 @@
/*************************************************************************
 *
 *  $RCSfile: fmtftntx.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FMTFTNTX_HXX
#define _FMTFTNTX_HXX

#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _FORMAT_HXX //autogen
#include <format.hxx>
#endif
#ifndef _NUMRULE_HXX
#include <numrule.hxx>
#endif


enum SwFtnEndPosEnum
{
    FTNEND_ATPGORDOCEND,                // at page or document end
    FTNEND_ATTXTEND,                    // at end of the current text end
    FTNEND_ATTXTEND_OWNNUMSEQ,          // -""- and with own number sequence
    FTNEND_ATTXTEND_OWNNUMANDFMT,       // -""- and with onw numberformat
    FTNEND_ATTXTEND_END
};


class SwFmtFtnEndAtTxtEnd : public SfxEnumItem
{
    String      sPrefix;
    String      sSuffix;
    SwNumType   aFmt;
    USHORT      nOffset;

protected:
    SwFmtFtnEndAtTxtEnd( USHORT nWhich, SwFtnEndPosEnum ePos )
        : SfxEnumItem( nWhich, ePos ), nOffset( 0 )
    {}
    SwFmtFtnEndAtTxtEnd( const SwFmtFtnEndAtTxtEnd& rAttr )
        : SfxEnumItem( rAttr ), nOffset( rAttr.nOffset ), aFmt( rAttr.aFmt ),
        sPrefix( rAttr.sPrefix ), sSuffix( rAttr.sSuffix )
    {}

public:
    virtual USHORT          GetValueCount() const;
    virtual SfxPoolItem*    Create(SvStream &, USHORT nVer ) const;
    virtual SvStream&       Store(SvStream &, USHORT nIVer) const;
    virtual USHORT          GetVersion( USHORT nFFVer ) const;

    virtual int             operator==( const SfxPoolItem& ) const;

    virtual BOOL             QueryValue( com::sun::star::uno::Any& rVal, BYTE nMemberId = 0 ) const;
    virtual BOOL             PutValue( const com::sun::star::uno::Any& rVal, BYTE nMemberId = 0 );

// will be used at time??
//  void                    FillVariable( SbxVariable &rVar,
//                                        SfxMapUnit eCoreMetric,
//                                        SfxMapUnit eUserMetric ) const;
//  virtual SfxArgumentError SetVariable( const SbxVariable &rVal,
//                                        SfxMapUnit eCoreMetric,
//                                        SfxMapUnit eUserMetric );
    virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres,
                                    SfxMapUnit eCoreMetric,
                                    SfxMapUnit ePresMetric,
                                    String &rText,
                                    const International* pIntl = 0 ) const;

    inline BOOL IsAtEnd() const { return FTNEND_ATPGORDOCEND != GetValue(); }

    SwFmtFtnEndAtTxtEnd & operator=( const SwFmtFtnEndAtTxtEnd & rAttr );

    SvxExtNumType GetNumType() const        { return aFmt.eType; }
    void SetNumType( SvxExtNumType eType )  { aFmt.eType = eType; }

    const SwNumType& GetSwNumType() const   { return aFmt; }

    USHORT GetOffset() const                { return nOffset; }
    void SetOffset( USHORT nOff )           { nOffset = nOff; }

    const String& GetPrefix() const         { return sPrefix; }
    void SetPrefix(const String& rSet)      { sPrefix = rSet; }

    const String& GetSuffix() const         { return sSuffix; }
    void SetSuffix(const String& rSet)      { sSuffix = rSet; }
};

class SwFmtFtnAtTxtEnd : public SwFmtFtnEndAtTxtEnd
{
public:
    SwFmtFtnAtTxtEnd( SwFtnEndPosEnum ePos = FTNEND_ATPGORDOCEND )
        : SwFmtFtnEndAtTxtEnd( RES_FTN_AT_TXTEND, ePos )
    {}

    virtual SfxPoolItem* Clone( SfxItemPool *pPool = 0 ) const;
};

class SwFmtEndAtTxtEnd : public SwFmtFtnEndAtTxtEnd
{
public:
    SwFmtEndAtTxtEnd( SwFtnEndPosEnum ePos = FTNEND_ATPGORDOCEND )
        : SwFmtFtnEndAtTxtEnd( RES_END_AT_TXTEND, ePos )
    {
        SetNumType( SVX_NUM_ROMAN_LOWER );
    }

    virtual SfxPoolItem* Clone( SfxItemPool *pPool = 0 ) const;
};



inline const SwFmtFtnAtTxtEnd &SwAttrSet::GetFtnAtTxtEnd(BOOL bInP) const
    { return (const SwFmtFtnAtTxtEnd&)Get( RES_FTN_AT_TXTEND, bInP); }
inline const SwFmtEndAtTxtEnd &SwAttrSet::GetEndAtTxtEnd(BOOL bInP) const
    { return (const SwFmtEndAtTxtEnd&)Get( RES_END_AT_TXTEND, bInP); }


inline const SwFmtFtnAtTxtEnd &SwFmt::GetFtnAtTxtEnd(BOOL bInP) const
    { return aSet.GetFtnAtTxtEnd(bInP); }
inline const SwFmtEndAtTxtEnd &SwFmt::GetEndAtTxtEnd(BOOL bInP) const
    { return aSet.GetEndAtTxtEnd(bInP); }

#endif

diff --git a/sw/inc/fmthbsh.hxx b/sw/inc/fmthbsh.hxx
new file mode 100644
index 0000000..2a9e5f0
--- /dev/null
+++ b/sw/inc/fmthbsh.hxx
@@ -0,0 +1,112 @@
/*************************************************************************
 *
 *  $RCSfile: fmthbsh.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FMTHBSH_HXX
#define _FMTHBSH_HXX


#ifndef _SFXPOOLITEM_HXX //autogen
#include <svtools/poolitem.hxx>
#endif

// ATT_SOFTHYPH ******************************
// Attribut fuer benutzerdefinierte Trennstellen.

class SwFmtSoftHyph : public SfxPoolItem
{
public:
    SwFmtSoftHyph();

    // "pure virtual Methoden" vom SfxPoolItem
    virtual int             operator==( const SfxPoolItem& ) const;
    virtual SfxPoolItem*    Clone( SfxItemPool* pPool = 0 ) const;
    virtual SfxPoolItem*    Create(SvStream &, USHORT nVer) const;
    virtual SvStream&       Store(SvStream &, USHORT nIVer) const;

    inline SwFmtSoftHyph& operator=(const SwFmtSoftHyph& rSH) {
            return *this;
        }
};

// ATT_HARDBLANK ******************************
// Attribut fuer geschuetzte Leerzeichen.

class SwFmtHardBlank : public SfxPoolItem
{
    sal_Unicode cChar;
public:
    SwFmtHardBlank( sal_Unicode cCh, BOOL bCheck = TRUE );

    // "pure virtual Methoden" vom SfxPoolItem
    virtual int             operator==( const SfxPoolItem& ) const;
    virtual SfxPoolItem*    Clone( SfxItemPool* pPool = 0 ) const;
    virtual SfxPoolItem*    Create(SvStream &, USHORT nVer) const;
    virtual SvStream&       Store(SvStream &, USHORT nIVer) const;

    virtual USHORT           GetVersion( USHORT nFFVer ) const;

    inline sal_Unicode GetChar() const { return cChar; }
    inline SwFmtHardBlank& operator=(const SwFmtHardBlank& rHB)
    { cChar = rHB.GetChar(); return *this; }
};


#endif

diff --git a/sw/inc/fmthdft.hxx b/sw/inc/fmthdft.hxx
new file mode 100644
index 0000000..9cbd226
--- /dev/null
+++ b/sw/inc/fmthdft.hxx
@@ -0,0 +1,160 @@
/*************************************************************************
 *
 *  $RCSfile: fmthdft.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FMTHDFT_HXX
#define _FMTHDFT_HXX

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _FORMAT_HXX //autogen
#include <format.hxx>
#endif
#ifndef _SFXPOOLITEM_HXX //autogen
#include <svtools/poolitem.hxx>
#endif
#ifndef _CALBCK_HXX //autogen
#include <calbck.hxx>
#endif

class SwFrmFmt;
class International;


//Kopfzeile, fuer Seitenformate
//Client von FrmFmt das den Header beschreibt.

class SwFmtHeader: public SfxPoolItem, public SwClient
{
    BOOL bActive;       //Nur zur Steuerung (Erzeugung des Inhaltes)

public:
    SwFmtHeader( BOOL bOn = FALSE );
    SwFmtHeader( SwFrmFmt *pHeaderFmt );
    SwFmtHeader( const SwFmtHeader &rCpy );
    ~SwFmtHeader();
    SwFmtHeader& operator=( const SwFmtHeader &rCpy );

    TYPEINFO();

    // "pure virtual Methoden" vom SfxPoolItem
    virtual int             operator==( const SfxPoolItem& ) const;
    virtual SfxPoolItem*    Clone( SfxItemPool* pPool = 0 ) const;
    virtual SfxPoolItem*    Create(SvStream &, USHORT nVer) const;
    virtual SvStream&       Store(SvStream &, USHORT nIVer) const;
    virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres,
                                    SfxMapUnit eCoreMetric,
                                    SfxMapUnit ePresMetric,
                                    String &rText,
                                    const International*    pIntl = 0 ) const;

    const SwFrmFmt *GetHeaderFmt() const { return (SwFrmFmt*)pRegisteredIn; }
          SwFrmFmt *GetHeaderFmt()       { return (SwFrmFmt*)pRegisteredIn; }

    BOOL IsActive() const { return bActive; }
    void SetActive( BOOL bNew = TRUE ) { bActive = bNew; }
};

//Fusszeile, fuer Seitenformate
//Client von FrmFmt das den Footer beschreibt.

class SwFmtFooter: public SfxPoolItem, public SwClient
{
    BOOL bActive;       //Nur zur Steuerung (Erzeugung des Inhaltes)

public:
    SwFmtFooter( BOOL bOn = FALSE );
    SwFmtFooter( SwFrmFmt *pFooterFmt );
    SwFmtFooter( const SwFmtFooter &rCpy );
    ~SwFmtFooter();
    SwFmtFooter& operator=( const SwFmtFooter &rCpy );

    TYPEINFO();

    // "pure virtual Methoden" vom SfxPoolItem
    virtual int             operator==( const SfxPoolItem& ) const;
    virtual SfxPoolItem*    Clone( SfxItemPool* pPool = 0 ) const;
    virtual SfxPoolItem*    Create(SvStream &, USHORT nVer) const;
    virtual SvStream&       Store(SvStream &, USHORT nIVer) const;
    virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres,
                                    SfxMapUnit eCoreMetric,
                                    SfxMapUnit ePresMetric,
                                    String &rText,
                                    const International*    pIntl = 0 ) const;

    const SwFrmFmt *GetFooterFmt() const { return (SwFrmFmt*)pRegisteredIn; }
          SwFrmFmt *GetFooterFmt()       { return (SwFrmFmt*)pRegisteredIn; }

    BOOL IsActive() const { return bActive; }
    void SetActive( BOOL bNew = TRUE ) { bActive = bNew; }
};

inline const SwFmtHeader &SwAttrSet::GetHeader(BOOL bInP) const
    { return (const SwFmtHeader&)Get( RES_HEADER,bInP); }
inline const SwFmtFooter &SwAttrSet::GetFooter(BOOL bInP) const
    { return (const SwFmtFooter&)Get( RES_FOOTER,bInP); }

inline const SwFmtHeader &SwFmt::GetHeader(BOOL bInP) const
    { return aSet.GetHeader(bInP); }
inline const SwFmtFooter &SwFmt::GetFooter(BOOL bInP) const
    { return aSet.GetFooter(bInP); }

#endif

diff --git a/sw/inc/fmtinfmt.hxx b/sw/inc/fmtinfmt.hxx
new file mode 100644
index 0000000..752866c
--- /dev/null
+++ b/sw/inc/fmtinfmt.hxx
@@ -0,0 +1,148 @@
/*************************************************************************
 *
 *  $RCSfile: fmtinfmt.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FMTINFMT_HXX
#define _FMTINFMT_HXX


#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif
#ifndef _SFXPOOLITEM_HXX
#include <svtools/poolitem.hxx>
#endif

class SvxMacro;
class SvxMacroTableDtor;
class International;
// ATT_INETFMT *********************************************

class SwFmtINetFmt: public SfxPoolItem
{
    friend class SwTxtINetFmt;

    String aURL;                    // die URL
    String aTargetFrame;            // in diesen Frame soll die URL
    String aINetFmt;
    String aVisitedFmt;
    String aName;                   // Name des Links
    SvxMacroTableDtor* pMacroTbl;
    SwTxtINetFmt* pTxtAttr;         // mein TextAttribut
    USHORT nINetId;
    USHORT nVisitedId;
public:
    SwFmtINetFmt( const String& rURL, const String& rTarget );
    SwFmtINetFmt( const SwFmtINetFmt& rAttr );
    virtual ~SwFmtINetFmt();

    // "pure virtual Methoden" vom SfxPoolItem
    virtual int             operator==( const SfxPoolItem& ) const;
    virtual SfxPoolItem*    Clone( SfxItemPool* pPool = 0 ) const;
    virtual SfxPoolItem*    Create(SvStream &, USHORT nVer) const;
    virtual SvStream&       Store(SvStream &, USHORT nIVer) const;
    virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres,
                                    SfxMapUnit eCoreMetric,
                                    SfxMapUnit ePresMetric,
                                    String &rText,
                                    const International* pIntl = 0 ) const;

    virtual BOOL            QueryValue( com::sun::star::uno::Any& rVal,
                                        BYTE nMemberId = 0 ) const;
    virtual BOOL            PutValue( const com::sun::star::uno::Any& rVal,
                                        BYTE nMemberId = 0 );

    virtual USHORT           GetVersion( USHORT nFFVer ) const;

    const SwTxtINetFmt* GetTxtINetFmt() const   { return pTxtAttr; }
    SwTxtINetFmt* GetTxtINetFmt()               { return pTxtAttr; }

    const String& GetValue() const          { return aURL; }
    void SetValue( const String& rS )       { aURL = rS; }

    const String& GetName() const           { return aName; }
    void SetName( const String& rNm )       { aName = rNm; }

    const String& GetTargetFrame() const    { return aTargetFrame; }
    void SetTargetFrame( const String& rNm ){ aTargetFrame = rNm; }

    const String& GetINetFmt() const        { return aINetFmt; }
    void SetINetFmt( const String& rNm )    { aINetFmt = rNm; }

    const String& GetVisitedFmt() const     { return aVisitedFmt; }
    void SetVisitedFmt( const String& rNm ) { aVisitedFmt = rNm; }

    USHORT GetINetFmtId() const             { return nINetId; }
    void SetINetFmtId( USHORT nNew )        { nINetId = nNew; }

    USHORT GetVisitedFmtId() const          { return nVisitedId; }
    void SetVisitedFmtId( USHORT nNew )     { nVisitedId = nNew; }

    // setze eine neue oder loesche die akt. MakroTabelle
    void SetMacroTbl( const SvxMacroTableDtor* pTbl = 0 );
    const SvxMacroTableDtor* GetMacroTbl() const    { return pMacroTbl; }

    // setze / erfrage ein Makro
    void SetMacro( USHORT nEvent, const SvxMacro& rMacro );
    const SvxMacro* GetMacro( USHORT nEvent ) const;
};


#endif

diff --git a/sw/inc/fmtline.hxx b/sw/inc/fmtline.hxx
new file mode 100644
index 0000000..cb7ec34
--- /dev/null
+++ b/sw/inc/fmtline.hxx
@@ -0,0 +1,113 @@
/*************************************************************************
 *
 *  $RCSfile: fmtline.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef SW_FMTLINE_HXX
#define SW_FMTLINE_HXX


#ifndef _SFXPOOLITEM_HXX //autogen
#include <svtools/poolitem.hxx>
#endif
#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _FORMAT_HXX //autogen
#include <format.hxx>
#endif
class International;

class SwFmtLineNumber: public SfxPoolItem
{
    ULONG nStartValue   :24; //Startwert fuer den Absatz, 0 == kein Startwert
    ULONG bCountLines   :1;  //Zeilen des Absatzes sollen mitgezaehlt werden.

public:
    SwFmtLineNumber();
    ~SwFmtLineNumber();

    // "pure virtual Methoden" vom SfxPoolItem
    virtual int             operator==( const SfxPoolItem& ) const;
    virtual SfxPoolItem*    Clone( SfxItemPool* pPool = 0 ) const;
    virtual SfxPoolItem*    Create(SvStream &, USHORT nVer) const;
    virtual SvStream&       Store(SvStream &, USHORT nIVer) const;
    virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres,
                                    SfxMapUnit eCoreMetric,
                                    SfxMapUnit ePresMetric,
                                    String &rText,
                                    const International*    pIntl = 0 ) const;
    virtual USHORT           GetVersion( USHORT nFFVer ) const;
    virtual BOOL             QueryValue( com::sun::star::uno::Any& rVal, BYTE nMemberId = 0 ) const;
    virtual BOOL             PutValue( const com::sun::star::uno::Any& rVal, BYTE nMemberId = 0 );

    ULONG GetStartValue() const { return nStartValue; }
    BOOL  IsCount()       const { return bCountLines != 0; }

    void SetStartValue( ULONG nNew ) { nStartValue = nNew; }
    void SetCountLines( BOOL b )     { bCountLines = b;    }
};

inline const SwFmtLineNumber &SwAttrSet::GetLineNumber(BOOL bInP) const
    { return (const SwFmtLineNumber&)Get( RES_LINENUMBER,bInP); }

inline const SwFmtLineNumber &SwFmt::GetLineNumber(BOOL bInP) const
    { return aSet.GetLineNumber(bInP); }

#endif

diff --git a/sw/inc/fmtlsplt.hxx b/sw/inc/fmtlsplt.hxx
new file mode 100644
index 0000000..22228c5
--- /dev/null
+++ b/sw/inc/fmtlsplt.hxx
@@ -0,0 +1,104 @@
/*************************************************************************
 *
 *  $RCSfile: fmtlsplt.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FMTTSPLT_HXX
#define _FMTTSPLT_HXX

#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _FORMAT_HXX //autogen
#include <format.hxx>
#endif
class International;

class SwFmtLayoutSplit : public SfxBoolItem
{
public:
    SwFmtLayoutSplit( BOOL bSplit = TRUE ) : SfxBoolItem( RES_LAYOUT_SPLIT, bSplit ) {}

    // "pure virtual Methoden" vom SfxPoolItem
    virtual SfxPoolItem*    Clone( SfxItemPool *pPool = 0 ) const;
    virtual SfxPoolItem*    Create(SvStream &, USHORT) const;
    virtual SvStream&       Store(SvStream &, USHORT nItemVersion ) const;
    virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres,
                                    SfxMapUnit eCoreMetric,
                                    SfxMapUnit ePresMetric,
                                    String &rText,
                                    const International*    pIntl = 0 ) const;
    virtual USHORT           GetVersion( USHORT nFFVer ) const;

    virtual BOOL        importXML( const NAMESPACE_RTL(OUString)& rValue,USHORT,
                                   const SvXMLUnitConverter& rUnitConv );
    virtual BOOL        exportXML( NAMESPACE_RTL(OUString)& rValue, USHORT,
                                   const SvXMLUnitConverter& rUnitConv ) const;
};

inline const SwFmtLayoutSplit &SwAttrSet::GetLayoutSplit(BOOL bInP) const
    { return (const SwFmtLayoutSplit&)Get( RES_LAYOUT_SPLIT,bInP); }

inline const SwFmtLayoutSplit &SwFmt::GetLayoutSplit(BOOL bInP) const
    { return aSet.GetLayoutSplit(bInP); }

#endif

diff --git a/sw/inc/fmtornt.hxx b/sw/inc/fmtornt.hxx
new file mode 100644
index 0000000..64b4245
--- /dev/null
+++ b/sw/inc/fmtornt.hxx
@@ -0,0 +1,206 @@
/*************************************************************************
 *
 *  $RCSfile: fmtornt.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FMTORNT_HXX
#define _FMTORNT_HXX

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _SWTYPES_HXX //autogen
#include <swtypes.hxx>
#endif
#ifndef _FORMAT_HXX //autogen
#include <format.hxx>
#endif
#ifndef _SFXPOOLITEM_HXX //autogen
#include <svtools/poolitem.hxx>
#endif
#ifndef _ORNTENUM_HXX
#include <orntenum.hxx>
#endif

class International;

#define IVER_VERTORIENT_REL ((USHORT)0x0001)

class SwFmtVertOrient: public SfxPoolItem
{
    SwTwips          nYPos; //Enthaelt _immer_ die aktuelle RelPos.
    SwVertOrient     eOrient;
    SwRelationOrient eRelation;
public:
    TYPEINFO();
    SwFmtVertOrient( SwTwips nY = 0, SwVertOrient eVert = VERT_NONE,
                     SwRelationOrient eRel = PRTAREA );
    inline SwFmtVertOrient &operator=( const SwFmtVertOrient &rCpy );

    // "pure virtual Methoden" vom SfxPoolItem
    virtual int             operator==( const SfxPoolItem& ) const;
    virtual SfxPoolItem*    Clone( SfxItemPool* pPool = 0 ) const;
    virtual SfxPoolItem*    Create(SvStream &, USHORT nVer) const;
    virtual SvStream&       Store(SvStream &, USHORT nIVer) const;
    virtual USHORT          GetVersion( USHORT nFFVer ) const;
    virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres,
                                    SfxMapUnit eCoreMetric,
                                    SfxMapUnit ePresMetric,
                                    String &rText,
                                    const International*    pIntl = 0 ) const;
    virtual BOOL             QueryValue( com::sun::star::uno::Any& rVal, BYTE nMemberId = 0 ) const;
    virtual BOOL             PutValue( const com::sun::star::uno::Any& rVal, BYTE nMemberId = 0 );

    SwVertOrient GetVertOrient() const { return eOrient; }
    SwRelationOrient GetRelationOrient() const { return eRelation; }
    void   SetVertOrient( SwVertOrient eNew ) { eOrient = eNew; }
    void   SetRelationOrient( SwRelationOrient eNew ) { eRelation = eNew; }

    SwTwips GetPos() const { return nYPos; }
    void    SetPos( SwTwips nNew ) { nYPos = nNew; }

    SwTwips GetPosConvertedToSw31( const SvxULSpaceItem *pULSpace ) const;
    SwTwips GetPosConvertedFromSw31( const SvxULSpaceItem *pULSpace ) const;

    virtual BOOL        importXML( const NAMESPACE_RTL(OUString)& rValue,USHORT,
                                   const SvXMLUnitConverter& rUnitConv );
    virtual BOOL        exportXML( NAMESPACE_RTL(OUString)& rValue, USHORT,
                                   const SvXMLUnitConverter& rUnitConv ) const;
};

//SwFmtHoriOrient, wie und woran orientiert --
//  sich der FlyFrm in der Hoizontalen ----------

#define IVER_HORIORIENT_TOGGLE ((USHORT)0x0001)
#define IVER_HORIORIENT_REL ((USHORT)0x0002)

class SwFmtHoriOrient: public SfxPoolItem
{
    SwTwips          nXPos; //Enthaelt _immer_ die aktuelle RelPos.
    SwHoriOrient     eOrient;
    SwRelationOrient eRelation;
    BOOL             bPosToggle : 1; // auf geraden Seiten Position spiegeln
public:
    TYPEINFO();
    SwFmtHoriOrient( SwTwips nX = 0, SwHoriOrient eHori = HORI_NONE,
        SwRelationOrient eRel = PRTAREA, BOOL bPos = FALSE );
    inline SwFmtHoriOrient &operator=( const SwFmtHoriOrient &rCpy );

    // "pure virtual Methoden" vom SfxPoolItem
    virtual int             operator==( const SfxPoolItem& ) const;
    virtual SfxPoolItem*    Clone( SfxItemPool* pPool = 0 ) const;
    virtual SfxPoolItem*    Create(SvStream &, USHORT nVer) const;
    virtual SvStream&       Store(SvStream &, USHORT nIVer) const;
    virtual USHORT          GetVersion( USHORT nFFVer ) const;
    virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres,
                                    SfxMapUnit eCoreMetric,
                                    SfxMapUnit ePresMetric,
                                    String &rText,
                                    const International*    pIntl = 0 ) const;
    virtual BOOL             QueryValue( com::sun::star::uno::Any& rVal, BYTE nMemberId = 0 ) const;
    virtual BOOL             PutValue( const com::sun::star::uno::Any& rVal, BYTE nMemberId = 0 );

    SwHoriOrient GetHoriOrient() const { return eOrient; }
    SwRelationOrient GetRelationOrient() const { return eRelation; }
    void SetHoriOrient( SwHoriOrient eNew ) { eOrient = eNew; }
    void SetRelationOrient( SwRelationOrient eNew ) { eRelation = eNew; }

    SwTwips GetPos() const { return nXPos; }
    void    SetPos( SwTwips nNew ) { nXPos = nNew; }

    SwTwips GetPosConvertedToSw31( const SvxLRSpaceItem *pLRSpace ) const;
    SwTwips GetPosConvertedFromSw31( const SvxLRSpaceItem *pLRSpace ) const;

    BOOL IsPosToggle() const { return bPosToggle; }
    void SetPosToggle( BOOL bNew ) { bPosToggle = bNew; }

    virtual BOOL        importXML( const NAMESPACE_RTL(OUString)& rValue,USHORT,
                                   const SvXMLUnitConverter& rUnitConv );
    virtual BOOL        exportXML( NAMESPACE_RTL(OUString)& rValue, USHORT,
                                   const SvXMLUnitConverter& rUnitConv ) const;
};

inline SwFmtVertOrient &SwFmtVertOrient::operator=( const SwFmtVertOrient &rCpy )
{
    nYPos = rCpy.GetPos();
    eOrient = rCpy.GetVertOrient();
    eRelation = rCpy.GetRelationOrient();
    return *this;
}
inline SwFmtHoriOrient &SwFmtHoriOrient::operator=( const SwFmtHoriOrient &rCpy )
{
    nXPos = rCpy.GetPos();
    eOrient = rCpy.GetHoriOrient();
    eRelation = rCpy.GetRelationOrient();
    bPosToggle = rCpy.IsPosToggle();
    return *this;
}

inline const SwFmtVertOrient &SwAttrSet::GetVertOrient(BOOL bInP) const
    { return (const SwFmtVertOrient&)Get( RES_VERT_ORIENT,bInP); }
inline const SwFmtHoriOrient &SwAttrSet::GetHoriOrient(BOOL bInP) const
    { return (const SwFmtHoriOrient&)Get( RES_HORI_ORIENT,bInP); }

inline const SwFmtVertOrient &SwFmt::GetVertOrient(BOOL bInP) const
    { return aSet.GetVertOrient(bInP); }
inline const SwFmtHoriOrient &SwFmt::GetHoriOrient(BOOL bInP) const
    { return aSet.GetHoriOrient(bInP); }


#endif

diff --git a/sw/inc/fmtpdsc.hxx b/sw/inc/fmtpdsc.hxx
new file mode 100644
index 0000000..d8353ea33
--- /dev/null
+++ b/sw/inc/fmtpdsc.hxx
@@ -0,0 +1,150 @@
/*************************************************************************
 *
 *  $RCSfile: fmtpdsc.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FMTPDSC_HXX
#define _FMTPDSC_HXX


#ifndef _SFXPOOLITEM_HXX //autogen
#include <svtools/poolitem.hxx>
#endif
#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _FORMAT_HXX //autogen
#include <format.hxx>
#endif
#ifndef _CALBCK_HXX //autogen
#include <calbck.hxx>
#endif

class SwPageDesc;
class SwHistory;
class SwPaM;
class International;

//Pagedescriptor
//Client vom SwPageDesc der durch das Attribut "beschrieben" wird.

#define IVER_FMTPAGEDESC_NOAUTO ((USHORT)0x0001)
#define IVER_FMTPAGEDESC_LONGPAGE   ((USHORT)0x0002)

class SwFmtPageDesc : public SfxPoolItem, public SwClient
{
    // diese "Doc"-Funktion ist friend, um nach dem kopieren das
    // Auto-Flag setzen zu koennen !!
    friend BOOL InsAttr( SwDoc*, const SwPaM &, const SfxItemSet&, USHORT,
                        SwHistory* );
    USHORT nNumOffset;          // Seitennummer Offset
    USHORT nDescNameIdx;        // SW3-Reader: Stringpool-Index des Vorlagennamens
    SwModify* pDefinedIn;       // Verweis auf das Objekt, in dem das
                                // Attribut gesetzt wurde (CntntNode/Format)

public:
    SwFmtPageDesc( const SwPageDesc *pDesc = 0 );
    SwFmtPageDesc( const SwFmtPageDesc &rCpy );
    SwFmtPageDesc &operator=( const SwFmtPageDesc &rCpy );
    ~SwFmtPageDesc();

    TYPEINFO();

    // "pure virtual Methoden" vom SfxPoolItem
    virtual int             operator==( const SfxPoolItem& ) const;
    virtual SfxPoolItem*    Clone( SfxItemPool* pPool = 0 ) const;
    virtual SfxPoolItem*    Create(SvStream &, USHORT nVer) const;
    virtual SvStream&       Store(SvStream &, USHORT nIVer) const;
    virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres,
                                    SfxMapUnit eCoreMetric,
                                    SfxMapUnit ePresMetric,
                                    String &rText,
                                    const International*    pIntl = 0 ) const;
    virtual USHORT          GetVersion( USHORT nFFVer ) const;
    virtual BOOL             QueryValue( com::sun::star::uno::Any& rVal, BYTE nMemberId = 0 ) const;
    virtual BOOL             PutValue( const com::sun::star::uno::Any& rVal, BYTE nMemberId = 0 );

    virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew );

          SwPageDesc *GetPageDesc() { return (SwPageDesc*)GetRegisteredIn(); }
    const SwPageDesc *GetPageDesc() const { return (SwPageDesc*)GetRegisteredIn(); }

    USHORT  GetNumOffset() const        { return nNumOffset; }
    void    SetNumOffset( USHORT nNum ) { nNumOffset = nNum; }

    // erfrage/setze, wo drin das Attribut verankert ist
    inline const SwModify* GetDefinedIn() const { return pDefinedIn; }
    void ChgDefinedIn( const SwModify* pNew ) { pDefinedIn = (SwModify*)pNew; }

    // fuer den SW3-Reader:
    USHORT GetDescNameIdx() const { return nDescNameIdx; }
    void SetDescNameIdx( USHORT n ) { nDescNameIdx = n;  }
    //
    // this item must be ignored while comparing item sets during XML export
    virtual BOOL        equalsXML( const SfxPoolItem& ) const;
};

inline const SwFmtPageDesc &SwAttrSet::GetPageDesc(BOOL bInP) const
    { return (const SwFmtPageDesc&)Get( RES_PAGEDESC,bInP); }

inline const SwFmtPageDesc &SwFmt::GetPageDesc(BOOL bInP) const
    { return aSet.GetPageDesc(bInP); }


#endif

diff --git a/sw/inc/fmtrfmrk.hxx b/sw/inc/fmtrfmrk.hxx
new file mode 100644
index 0000000..4886aab
--- /dev/null
+++ b/sw/inc/fmtrfmrk.hxx
@@ -0,0 +1,102 @@
/*************************************************************************
 *
 *  $RCSfile: fmtrfmrk.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FMTRFMRK_HXX
#define _FMTRFMRK_HXX


#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif
#ifndef _SFXPOOLITEM_HXX //autogen
#include <svtools/poolitem.hxx>
#endif

// ATT_REFMARK *******************************************************

class SwFmtRefMark : public SfxPoolItem
{
    friend class SwTxtRefMark;
    SwTxtRefMark* pTxtAttr;     // mein TextAttribut

    // geschuetzter CopyCtor
    SwFmtRefMark& operator=(const SwFmtRefMark& rRefMark);
    String aRefName;

public:
    SwFmtRefMark( const String& rTxt );
    SwFmtRefMark( const SwFmtRefMark& rRefMark );
    ~SwFmtRefMark( );

    // "pure virtual Methoden" vom SfxPoolItem
    virtual int             operator==( const SfxPoolItem& ) const;
    virtual SfxPoolItem*    Clone( SfxItemPool* pPool = 0 ) const;
    virtual SfxPoolItem*    Create(SvStream &, USHORT nVer) const;
    virtual SvStream&       Store(SvStream &, USHORT nIVer) const;

    const SwTxtRefMark *GetTxtRefMark() const   { return pTxtAttr; }
    SwTxtRefMark *GetTxtRefMark()               { return pTxtAttr; }

    inline       String &GetRefName()       { return aRefName; }
    inline const String &GetRefName() const { return aRefName; }
};

#endif

diff --git a/sw/inc/fmtsrnd.hxx b/sw/inc/fmtsrnd.hxx
new file mode 100644
index 0000000..2e63188
--- /dev/null
+++ b/sw/inc/fmtsrnd.hxx
@@ -0,0 +1,142 @@
/*************************************************************************
 *
 *  $RCSfile: fmtsrnd.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FMTSRND_HXX
#define _FMTSRND_HXX

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _FORMAT_HXX //autogen
#include <format.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif

class International;

//SwFmtSurround, wie soll sich der ---------------
//  Dokumentinhalt unter dem Rahmen verhalten ---

enum SwSurround {
    SURROUND_BEGIN,
    SURROUND_NONE = SURROUND_BEGIN,
    SURROUND_THROUGHT,
    SURROUND_PARALLEL,
    SURROUND_IDEAL,
    SURROUND_LEFT,
    SURROUND_RIGHT,
    SURROUND_END
};

class SwFmtSurround: public SfxEnumItem
{
    BOOL    bAnchorOnly :1;
    BOOL    bContour    :1;
    BOOL    bOutside    :1;
public:
    SwFmtSurround( SwSurround eNew = SURROUND_PARALLEL );
    SwFmtSurround( const SwFmtSurround & );
    inline SwFmtSurround &operator=( const SwFmtSurround &rCpy );

    // "pure virtual Methoden" vom SfxPoolItem
    virtual int             operator==( const SfxPoolItem& ) const;
    virtual SfxPoolItem*    Clone( SfxItemPool* pPool = 0 ) const;
    virtual SfxPoolItem*    Create(SvStream &, USHORT nVer) const;
    virtual SvStream&       Store(SvStream &, USHORT nIVer) const;
    virtual USHORT          GetValueCount() const;
    virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres,
                                    SfxMapUnit eCoreMetric,
                                    SfxMapUnit ePresMetric,
                                    String &rText,
                                    const International*    pIntl = 0 ) const;
    virtual USHORT          GetVersion( USHORT nFFVer ) const;
    virtual BOOL             QueryValue( com::sun::star::uno::Any& rVal, BYTE nMemberId = 0 ) const;
    virtual BOOL             PutValue( const com::sun::star::uno::Any& rVal, BYTE nMemberId = 0 );


    SwSurround GetSurround()const { return SwSurround( GetValue() ); }
    BOOL    IsAnchorOnly()  const { return bAnchorOnly; }
    BOOL    IsContour()     const { return bContour; }
    BOOL    IsOutside()     const { return bOutside; }
    void    SetSurround  ( SwSurround eNew ){ SfxEnumItem::SetValue( USHORT( eNew ) ); }
    void    SetAnchorOnly( BOOL bNew )      { bAnchorOnly = bNew; }
    void    SetContour( BOOL bNew )         { bContour = bNew; }
    void    SetOutside( BOOL bNew )         { bOutside = bNew; }
};

inline SwFmtSurround &SwFmtSurround::operator=( const SwFmtSurround &rCpy )
{
    bAnchorOnly = rCpy.IsAnchorOnly();
    bContour = rCpy.IsContour();
    bOutside = rCpy.IsOutside();
    SfxEnumItem::SetValue( rCpy.GetValue() );
    return *this;
}

inline const SwFmtSurround &SwAttrSet::GetSurround(BOOL bInP) const
    { return (const SwFmtSurround&)Get( RES_SURROUND,bInP); }

inline const SwFmtSurround &SwFmt::GetSurround(BOOL bInP) const
    { return aSet.GetSurround(bInP); }

#endif

diff --git a/sw/inc/fmturl.hxx b/sw/inc/fmturl.hxx
new file mode 100644
index 0000000..07cf314
--- /dev/null
+++ b/sw/inc/fmturl.hxx
@@ -0,0 +1,131 @@
/*************************************************************************
 *
 *  $RCSfile: fmturl.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FMTURL_HXX
#define _FMTURL_HXX


#ifndef _SFXPOOLITEM_HXX //autogen
#include <svtools/poolitem.hxx>
#endif
#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _FORMAT_HXX //autogen
#include <format.hxx>
#endif

class ImageMap;
class International;

// URL, ServerMap und ClientMap

class SwFmtURL: public SfxPoolItem
{
    String    sTargetFrameName; // in diesen Frame soll die URL
    String    sURL;             //Einfache URL
    String    sName;            // Name des Anchors
    ImageMap *pMap;             //ClientSide Images

    BOOL      bIsServerMap;     //mit der URL eine ServerSideImageMap

    SwFmtURL& operator=( const SwFmtURL& );

public:
    SwFmtURL();
    SwFmtURL( const SwFmtURL& );
    ~SwFmtURL();

    // "pure virtual Methoden" vom SfxPoolItem
    virtual int             operator==( const SfxPoolItem& ) const;
    virtual SfxPoolItem*    Clone( SfxItemPool* pPool = 0 ) const;
    virtual SfxPoolItem*    Create(SvStream &, USHORT nVer) const;
    virtual SvStream&       Store(SvStream &, USHORT nIVer) const;
    virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres,
                                    SfxMapUnit eCoreMetric,
                                    SfxMapUnit ePresMetric,
                                    String &rText,
                                    const International*    pIntl = 0 ) const;
    virtual USHORT          GetVersion( USHORT nFFVer ) const;
    virtual BOOL             QueryValue( com::sun::star::uno::Any& rVal, BYTE nMemberId = 0 ) const;
    virtual BOOL             PutValue( const com::sun::star::uno::Any& rVal, BYTE nMemberId = 0 );

    void SetTargetFrameName( const String& rStr ) { sTargetFrameName = rStr; }
    void SetURL( const String &rURL, BOOL bServerMap );
    void SetMap( const ImageMap *pM );  //Pointer wird kopiert!

    const String   &GetTargetFrameName()const { return sTargetFrameName; }
    const String   &GetURL()            const { return sURL; }
          BOOL      IsServerMap()       const { return bIsServerMap; }
    const ImageMap *GetMap()            const { return pMap; }
          ImageMap *GetMap()                  { return pMap; }

    const String& GetName() const           { return sName; }
    void SetName( const String& rNm )       { sName = rNm; }
};

inline const SwFmtURL &SwAttrSet::GetURL(BOOL bInP) const
    { return (const SwFmtURL&)Get( RES_URL,bInP); }

inline const SwFmtURL &SwFmt::GetURL(BOOL bInP) const
    { return aSet.GetURL(bInP); }

#endif

diff --git a/sw/inc/format.hxx b/sw/inc/format.hxx
new file mode 100644
index 0000000..b31111c
--- /dev/null
+++ b/sw/inc/format.hxx
@@ -0,0 +1,371 @@
/*************************************************************************
 *
 *  $RCSfile: format.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FORMAT_HXX
#define _FORMAT_HXX


#ifndef  _SOLAR_H
#include <tools/solar.h>
#endif

#ifndef _ERRHDL_HXX
#include <errhdl.hxx>       // fuer ASSERT
#endif
#ifndef _SWATRSET_HXX
#include <swatrset.hxx>     // fuer SfxItemPool/-Set, Attr forward decl.
#endif
#ifndef _CALBCK_HXX
#include <calbck.hxx>       // fuer SwModify
#endif
#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

class SwDoc;

class SwFmt : public SwModify
{
    friend class SwSwgReader;
    friend class SwSwgWriter;

    String aFmtName;
    SwAttrSet aSet;

    USHORT nWhichId;
    USHORT nFmtId;          // Format-ID fuer Lesen/Schreiben
    USHORT nPoolFmtId;      // Id-fuer "automatich" erzeugte Formate
                            // (ist keine harte Attributierung !!)
    USHORT nPoolHelpId;     // HelpId fuer diese Pool-Vorlage
    BYTE nPoolHlpFileId;    // FilePos ans Doc auf die Vorlagen-Hilfen
    BOOL   bWritten : 1;    // TRUE: bereits geschrieben
    BOOL   bAutoFmt : 1;    // FALSE: es handelt sich um eine Vorlage
                            // ist dflt immer auf TRUE !
    BOOL   bFmtInDTOR : 1;  // TRUE: das Format wird geloscht. Damit man in
                            // der FmtChg-Message das erkennen kann!!!
    BOOL   bAutoUpdateFmt : 1;  // TRUE: am Format werden die Attribute
                            // eines kompletten Absatzes gesetzt (UI-seitig!)
    BOOL   bLayerFmt : 1;   // nur fuer SwFrmFmt ( LAYER_IMPL )


protected:
    SwFmt( SwAttrPool& rPool, const sal_Char* pFmtNm,
            const USHORT* pWhichRanges, SwFmt *pDrvdFrm, USHORT nFmtWhich );
    SwFmt( SwAttrPool& rPool, const String &rFmtNm, const USHORT* pWhichRanges,
            SwFmt *pDrvdFrm, USHORT nFmtWhich );
    SwFmt( SwAttrPool& rPool, const String &rFmtNm, USHORT nWhich1,
            USHORT nWhich2, SwFmt *pDrvdFrm, USHORT nFmtWhich );
    SwFmt( const SwFmt& rFmt );

public:
    TYPEINFO();     //Bereits in Basisklasse Client drin.

    virtual ~SwFmt();
    SwFmt &operator=(const SwFmt&);

    // fuer die Abfrage der Writer-Funktionen
    USHORT Which() const { return nWhichId; }

    virtual void Modify( SfxPoolItem* pOldValue, SfxPoolItem* pNewValue );
        // erfrage vom Format Informationen
    virtual BOOL GetInfo( SfxPoolItem& ) const;

    // kopiere Attribute; auch ueber Dokumentgrenzen hinweg
    void CopyAttrs( const SwFmt&, BOOL bReplace=TRUE );

    // loesche alle Attribute, die nicht in rFmt stehen
    void DelDiffs( const SfxItemSet& rSet );
    void DelDiffs( const SwFmt& rFmt ) { DelDiffs( rFmt.GetAttrSet() ); }

    // Umhaengen des Formats (0 = Default)
    BOOL SetDerivedFrom(SwFmt *pDerivedFrom = 0);

    // Ist bInParents FALSE,
    // wird nur in diesem Format nach dem Attribut gesucht.
    inline const SfxPoolItem& GetAttr( USHORT nWhich,
                                        BOOL bInParents = TRUE ) const;
    inline SfxItemState GetItemState( USHORT nWhich, BOOL bSrchInParent = TRUE,
                                    const SfxPoolItem **ppItem = 0 ) const;
    BOOL SetAttr( const SfxPoolItem& );
    BOOL SetAttr( const SfxItemSet& rSet );

    // Nimmt den Hint mit nWhich aus dem Delta-Array
    BOOL ResetAttr( USHORT nWhich1, USHORT nWhich2 = 0 );

    // Nimmt alle Hints aus dem Delta-Array,
    // liefert die Anzahl der geloeschten Hints
    USHORT ResetAllAttr();

    inline SwFmt* DerivedFrom() const { return (SwFmt*)pRegisteredIn; }
    inline BOOL IsDefault() const { return DerivedFrom() == 0; }

    inline const String& GetName() const        { return aFmtName; }
    inline void SetName( const String& rNewName );
    inline void SetName( const sal_Char* pNewName );

    // zur Abfrage des Attribute Arrays
    inline const SwAttrSet& GetAttrSet() const { return aSet; }

    // Das Doc wird jetzt am SwAttrPool gesetzt. Dadurch hat man es immer
    // im Zugriff.
    const SwDoc *GetDoc() const         { return aSet.GetDoc(); }
          SwDoc *GetDoc()               { return aSet.GetDoc(); }

    // erfragen und setzen der Poolvorlagen-Id's
    USHORT GetPoolFmtId() const { return nPoolFmtId; }
    void SetPoolFmtId( USHORT nId ) { nPoolFmtId = nId; }

    // erfragen und setzen der Hilfe-Id's fuer die Document-Vorlagen
    USHORT GetPoolHelpId() const { return nPoolHelpId; }
    void SetPoolHelpId( USHORT nId ) { nPoolHelpId = nId; }
    BYTE GetPoolHlpFileId() const { return nPoolHlpFileId; }
    void SetPoolHlpFileId( BYTE nId ) { nPoolHlpFileId = nId; }
    // erfrage die Attribut-Beschreibung, returnt den reingereichten String
    void GetPresentation( SfxItemPresentation ePres,
        SfxMapUnit eCoreMetric, SfxMapUnit ePresMetric, String &rText ) const
        { aSet.GetPresentation( ePres, eCoreMetric, ePresMetric, rText ); }
    // Das Format-ID fuer Lesen/Schreiben:
    USHORT GetFmtId() const  { return nFmtId;    }
    void   SetWritten()      { bWritten = TRUE;  }
    void   ResetWritten()    { bWritten = FALSE; }
    BOOL   IsWritten() const { return bWritten;  }

    // Abfragen/Setzen vom AutoFmt-Flag
    BOOL IsAuto() const                 { return bAutoFmt; }
    void SetAuto( BOOL bNew = FALSE )   { bAutoFmt = bNew; }

    // Abfragen/Setzen vom bAutoUpdateFmt-Flag
    BOOL IsAutoUpdateFmt() const                { return bAutoUpdateFmt; }
    void SetAutoUpdateFmt( BOOL bNew = TRUE )   { bAutoUpdateFmt = bNew; }

    BOOL IsFmtInDTOR() const { return bFmtInDTOR; }

    BOOL IsLayerFmt() const { return bLayerFmt; }
    void SetLayerFmt( BOOL bNew ) { bLayerFmt = bNew; }

    BOOL IsFrmFmt() const { return nWhichId == RES_FLYFRMFMT ||
                                   nWhichId == RES_DRAWFRMFMT||
                                   nWhichId == RES_FRMFMT; }

    // GetMethoden: das Bool gibt an, ob nur im Set (FALSE) oder auch in
    //              den Parents gesucht werden soll. Wird nichts gefunden,
    //              wird das deflt. Attribut returnt.
    // Charakter-Attribute  - impl. steht im charatr.hxx
    // AMA 12.10.94: Umstellung von SwFmt... auf Svx...
    inline const SvxPostureItem      &GetPosture( BOOL = TRUE ) const;
    inline const SvxWeightItem       &GetWeight( BOOL = TRUE ) const;
    inline const SvxShadowedItem     &GetShadowed( BOOL = TRUE ) const;
    inline const SvxAutoKernItem     &GetAutoKern( BOOL = TRUE ) const;
    inline const SvxWordLineModeItem &GetWordLineMode( BOOL = TRUE ) const;
    inline const SvxContourItem      &GetContour( BOOL = TRUE ) const;
    inline const SvxKerningItem      &GetKerning( BOOL = TRUE ) const;
    inline const SvxUnderlineItem    &GetUnderline( BOOL = TRUE ) const;
    inline const SvxCrossedOutItem   &GetCrossedOut( BOOL = TRUE ) const;
    inline const SvxFontHeightItem   &GetSize( BOOL = TRUE ) const;
    inline const SvxPropSizeItem     &GetPropSize( BOOL = TRUE ) const;
    inline const SvxFontItem         &GetFont( BOOL = TRUE ) const;
    inline const SvxColorItem        &GetColor( BOOL = TRUE ) const;
    inline const SvxCharSetColorItem &GetCharSetColor( BOOL = TRUE ) const;
    inline const SvxLanguageItem     &GetLanguage( BOOL = TRUE ) const;
    inline const SvxEscapementItem   &GetEscapement( BOOL = TRUE ) const;
    inline const SvxCaseMapItem      &GetCaseMap( BOOL = TRUE ) const;
    inline const SvxNoHyphenItem     &GetNoHyphenHere( BOOL = TRUE ) const;
    inline const SvxBlinkItem        &GetBlink( BOOL = TRUE ) const;
    inline const SvxBrushItem        &GetChrBackground( BOOL = TRUE ) const;

    inline const SvxFontItem         &GetCJKFont( BOOL = TRUE ) const;
    inline const SvxFontHeightItem   &GetCJKSize( BOOL = TRUE ) const;
    inline const SvxLanguageItem     &GetCJKLanguage( BOOL = TRUE ) const;
    inline const SvxPostureItem      &GetCJKPosture( BOOL = TRUE ) const;
    inline const SvxWeightItem       &GetCJKWeight( BOOL = TRUE ) const;
    inline const SvxFontItem         &GetCTLFont( BOOL = TRUE ) const;
    inline const SvxFontHeightItem   &GetCTLSize( BOOL = TRUE ) const;
    inline const SvxLanguageItem     &GetCTLLanguage( BOOL = TRUE ) const;
    inline const SvxPostureItem      &GetCTLPosture( BOOL = TRUE ) const;
    inline const SvxWeightItem       &GetCTLWeight( BOOL = TRUE ) const;
    inline const SfxBoolItem         &GetWritingDirection( BOOL = TRUE ) const;

    // Frame-Attribute  - impl. steht im frmatr.hxx,
    // fuer LINUX, SINIX, HPUX auch in gcc_outl.cxx
#if ( defined GCC && defined C272 && \
      ( defined LINUX || defined SINIX || defined HPUX ))
    const SwFmtFillOrder        &GetFillOrder( BOOL = TRUE ) const;
    const SwFmtFrmSize          &GetFrmSize( BOOL = TRUE ) const;
    const SwFmtHeader           &GetHeader( BOOL = TRUE ) const;
    const SwFmtFooter           &GetFooter( BOOL = TRUE ) const;
    const SwFmtSurround         &GetSurround( BOOL = TRUE ) const;
    const SwFmtHoriOrient       &GetHoriOrient( BOOL = TRUE ) const;
    const SwFmtAnchor           &GetAnchor( BOOL = TRUE ) const;
    const SwFmtCol              &GetCol( BOOL = TRUE ) const;
#endif
#if ( defined GCC && defined C272 && defined HPUX )
    const SvxPaperBinItem       &GetPaperBin( BOOL = TRUE ) const;
    const SvxLRSpaceItem        &GetLRSpace( BOOL = TRUE ) const;
    const SvxULSpaceItem        &GetULSpace( BOOL = TRUE ) const;
    const SwFmtCntnt            &GetCntnt( BOOL = TRUE ) const;
    const SvxPrintItem          &GetPrint( BOOL = TRUE ) const;
    const SvxOpaqueItem         &GetOpaque( BOOL = TRUE ) const;
    const SvxProtectItem        &GetProtect( BOOL = TRUE ) const;
    const SwFmtVertOrient       &GetVertOrient( BOOL = TRUE ) const;
    const SvxBoxItem            &GetBox( BOOL = TRUE ) const;
    const SvxFmtKeepItem        &GetKeep( BOOL = TRUE ) const;
    const SvxBrushItem          &GetBackground( BOOL = TRUE ) const;
    const SvxShadowItem         &GetShadow( BOOL = TRUE ) const;
    const SwFmtPageDesc         &GetPageDesc( BOOL = TRUE ) const;
    const SvxFmtBreakItem       &GetBreak( BOOL = TRUE ) const;
    const SvxMacroItem          &GetMacro( BOOL = TRUE ) const;
    const SwFmtURL              &GetURL( BOOL = TRUE ) const;
#endif
#if !( defined GCC && defined C272 && \
       ( defined LINUX || defined SINIX || defined HPUX ))
    inline const SwFmtFillOrder         &GetFillOrder( BOOL = TRUE ) const;
    inline const SwFmtFrmSize           &GetFrmSize( BOOL = TRUE ) const;
    inline const SwFmtHeader            &GetHeader( BOOL = TRUE ) const;
    inline const SwFmtFooter            &GetFooter( BOOL = TRUE ) const;
    inline const SwFmtSurround          &GetSurround( BOOL = TRUE ) const;
    inline const SwFmtHoriOrient        &GetHoriOrient( BOOL = TRUE ) const;
    inline const SwFmtAnchor            &GetAnchor( BOOL = TRUE ) const;
    inline const SwFmtCol               &GetCol( BOOL = TRUE ) const;
#endif
#if !( defined GCC && defined C272 && defined HPUX )
    inline const SvxPaperBinItem        &GetPaperBin( BOOL = TRUE ) const;
    inline const SvxLRSpaceItem         &GetLRSpace( BOOL = TRUE ) const;
    inline const SvxULSpaceItem         &GetULSpace( BOOL = TRUE ) const;
    inline const SwFmtCntnt             &GetCntnt( BOOL = TRUE ) const;
    inline const SvxPrintItem           &GetPrint( BOOL = TRUE ) const;
    inline const SvxOpaqueItem          &GetOpaque( BOOL = TRUE ) const;
    inline const SvxProtectItem         &GetProtect( BOOL = TRUE ) const;
    inline const SwFmtVertOrient        &GetVertOrient( BOOL = TRUE ) const;
    inline const SvxBoxItem             &GetBox( BOOL = TRUE ) const;
    inline const SvxFmtKeepItem         &GetKeep( BOOL = TRUE ) const;
    inline const SvxBrushItem           &GetBackground( BOOL = TRUE ) const;
    inline const SvxShadowItem          &GetShadow( BOOL = TRUE ) const;
    inline const SwFmtPageDesc          &GetPageDesc( BOOL = TRUE ) const;
    inline const SvxFmtBreakItem        &GetBreak( BOOL = TRUE ) const;
    inline const SvxMacroItem           &GetMacro( BOOL = TRUE ) const;
    inline const SwFmtURL               &GetURL( BOOL = TRUE ) const;
    inline const SwFmtEditInReadonly    &GetEditInReadonly( BOOL = TRUE ) const;
    inline const SwFmtLayoutSplit       &GetLayoutSplit( BOOL = TRUE ) const;
    inline const SwFmtChain             &GetChain( BOOL = TRUE ) const;
    inline const SwFmtLineNumber        &GetLineNumber( BOOL = TRUE ) const;
    inline const SwFmtFtnAtTxtEnd       &GetFtnAtTxtEnd( BOOL = TRUE ) const;
    inline const SwFmtEndAtTxtEnd       &GetEndAtTxtEnd( BOOL = TRUE ) const;
    inline const SwFmtNoBalancedColumns &GetBalancedColumns( BOOL = TRUE ) const;
#endif

    // Grafik-Attribute - impl. steht im grfatr.hxx
    inline const SwMirrorGrf            &GetMirrorGrf( BOOL = TRUE ) const;
    inline const SwCropGrf              &GetCropGrf( BOOL = TRUE ) const;
    inline const SwRotationGrf          &GetRotationGrf(BOOL = TRUE ) const;
    inline const SwLuminanceGrf         &GetLuminanceGrf(BOOL = TRUE ) const;
    inline const SwContrastGrf          &GetContrastGrf(BOOL = TRUE ) const;
    inline const SwChannelRGrf          &GetChannelRGrf(BOOL = TRUE ) const;
    inline const SwChannelGGrf          &GetChannelGGrf(BOOL = TRUE ) const;
    inline const SwChannelBGrf          &GetChannelBGrf(BOOL = TRUE ) const;
    inline const SwGammaGrf             &GetGammaGrf(BOOL = TRUE ) const;
    inline const SwInvertGrf            &GetInvertGrf(BOOL = TRUE ) const;
    inline const SwTransparencyGrf      &GetTransparencyGrf(BOOL = TRUE ) const;
    inline const SwDrawModeGrf          &GetDrawModeGrf(BOOL = TRUE ) const;

    // Paragraph-Attribute  - impl. steht im paratr.hxx
    inline const SvxLineSpacingItem     &GetLineSpacing( BOOL = TRUE ) const;
    inline const SvxAdjustItem          &GetAdjust( BOOL = TRUE ) const;
    inline const SvxFmtSplitItem        &GetSplit( BOOL = TRUE ) const;
    inline const SwRegisterItem         &GetRegister( BOOL = TRUE ) const;
    inline const SwNumRuleItem          &GetNumRule( BOOL = TRUE ) const;
    inline const SvxWidowsItem          &GetWidows( BOOL = TRUE ) const;
    inline const SvxOrphansItem         &GetOrphans( BOOL = TRUE ) const;
    inline const SvxTabStopItem         &GetTabStops( BOOL = TRUE ) const;
    inline const SvxHyphenZoneItem      &GetHyphenZone( BOOL = TRUE ) const;
    inline const SwFmtDrop              &GetDrop( BOOL = TRUE ) const;

    // TabellenBox-Attribute    - impl. steht im cellatr.hxx
    inline const SwTblBoxNumFormat      &GetTblBoxNumFmt( BOOL = TRUE ) const;
    inline const SwTblBoxFormula        &GetTblBoxFormula( BOOL = TRUE ) const;
    inline const SwTblBoxValue          &GetTblBoxValue( BOOL = TRUE ) const;
};

// --------------- Inline Implementierungen ------------------------

inline const SfxPoolItem& SwFmt::GetAttr( USHORT nWhich,
                                        BOOL bInParents ) const
{
    return aSet.Get( nWhich, bInParents );
}

inline void SwFmt::SetName( const String& rNewName )
{
    ASSERT(!IsDefault(), "SetName: Defaultformat" );
    aFmtName = rNewName;
}
inline void SwFmt::SetName( const sal_Char* pNewName )
{
    ASSERT(!IsDefault(), "SetName: Defaultformat" );
    aFmtName.AssignAscii( pNewName );
}

inline SfxItemState SwFmt::GetItemState( USHORT nWhich, BOOL bSrchInParent,
                                        const SfxPoolItem **ppItem ) const
{
    return aSet.GetItemState( nWhich, bSrchInParent, ppItem );
}


#endif // _FORMAT_HXX
diff --git a/sw/inc/frmatr.hxx b/sw/inc/frmatr.hxx
new file mode 100644
index 0000000..f6b8450
--- /dev/null
+++ b/sw/inc/frmatr.hxx
@@ -0,0 +1,136 @@
/*************************************************************************
 *
 *  $RCSfile: frmatr.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FRMATR_HXX
#define _FRMATR_HXX

#include "hintids.hxx"      //die Ids der Attribute, vor frmitems damit die
#include "format.hxx"       //fuer Implementierung der inlines

//------------------------ Inlines ---------------------------------


/******************************************************************************
 *  Implementierung der FrameAttribut Methoden vom SwAttrSet
 ******************************************************************************/

inline const SvxPaperBinItem &SwAttrSet::GetPaperBin(BOOL bInP) const
    { return (const SvxPaperBinItem&)Get( RES_PAPER_BIN,bInP); }
inline const SvxLRSpaceItem &SwAttrSet::GetLRSpace(BOOL bInP) const
    { return (const SvxLRSpaceItem&)Get( RES_LR_SPACE,bInP); }
inline const SvxULSpaceItem &SwAttrSet::GetULSpace(BOOL bInP) const
    { return (const SvxULSpaceItem&)Get( RES_UL_SPACE,bInP); }
inline const SvxPrintItem &SwAttrSet::GetPrint(BOOL bInP) const
    { return (const SvxPrintItem&)Get( RES_PRINT,bInP); }
inline const SvxOpaqueItem &SwAttrSet::GetOpaque(BOOL bInP) const
    { return (const SvxOpaqueItem&)Get( RES_OPAQUE,bInP); }
inline const SvxProtectItem &SwAttrSet::GetProtect(BOOL bInP) const
    { return (const SvxProtectItem&)Get( RES_PROTECT,bInP); }
inline const SvxBoxItem &SwAttrSet::GetBox(BOOL bInP) const
    { return (const SvxBoxItem&)Get( RES_BOX,bInP); }
inline const SvxFmtKeepItem &SwAttrSet::GetKeep(BOOL bInP) const
    { return (const SvxFmtKeepItem&)Get( RES_KEEP,bInP); }
inline const SvxBrushItem &SwAttrSet::GetBackground(BOOL bInP) const
    { return (const SvxBrushItem&)Get( RES_BACKGROUND,bInP); }
inline const SvxShadowItem &SwAttrSet::GetShadow(BOOL bInP) const
    { return (const SvxShadowItem&)Get( RES_SHADOW,bInP); }
inline const SvxFmtBreakItem &SwAttrSet::GetBreak(BOOL bInP) const
    { return (const SvxFmtBreakItem&)Get( RES_BREAK,bInP); }
inline const SvxMacroItem &SwAttrSet::GetMacro(BOOL bInP) const
    { return (const SvxMacroItem&)Get( RES_FRMMACRO,bInP); }


/******************************************************************************
 *  Implementierung der FrameAttribut Methoden vom SwFmt
 ******************************************************************************/

// impl. fuer LINUX, SINIX, HPUX auch in gcc_outl.cxx
#if !( defined GCC && defined C272 && \
       ( defined LINUX || defined SINIX || defined HPUX ))
#endif
#if !( defined GCC && defined C272 && defined HPUX )
inline const SvxPaperBinItem &SwFmt::GetPaperBin(BOOL bInP) const
    { return aSet.GetPaperBin(bInP); }
inline const SvxLRSpaceItem &SwFmt::GetLRSpace(BOOL bInP) const
    { return aSet.GetLRSpace(bInP); }
inline const SvxULSpaceItem &SwFmt::GetULSpace(BOOL bInP) const
    { return aSet.GetULSpace(bInP); }
inline const SvxPrintItem &SwFmt::GetPrint(BOOL bInP) const
    { return aSet.GetPrint(bInP); }
inline const SvxOpaqueItem &SwFmt::GetOpaque(BOOL bInP) const
    { return aSet.GetOpaque(bInP); }
inline const SvxProtectItem &SwFmt::GetProtect(BOOL bInP) const
    { return aSet.GetProtect(bInP); }
inline const SvxBoxItem &SwFmt::GetBox(BOOL bInP) const
    { return aSet.GetBox(bInP); }
inline const SvxFmtKeepItem &SwFmt::GetKeep(BOOL bInP) const
    { return aSet.GetKeep(bInP); }
inline const SvxBrushItem &SwFmt::GetBackground(BOOL bInP) const
    { return aSet.GetBackground(bInP); }
inline const SvxShadowItem &SwFmt::GetShadow(BOOL bInP) const
    { return aSet.GetShadow(bInP); }
inline const SvxFmtBreakItem &SwFmt::GetBreak(BOOL bInP) const
    { return aSet.GetBreak(bInP); }
inline const SvxMacroItem &SwFmt::GetMacro(BOOL bInP) const
    { return aSet.GetMacro(bInP); }
#endif


#endif //_FRMATR_HXX
diff --git a/sw/inc/frmfmt.hxx b/sw/inc/frmfmt.hxx
new file mode 100644
index 0000000..ed22cfe
--- /dev/null
+++ b/sw/inc/frmfmt.hxx
@@ -0,0 +1,227 @@
/*************************************************************************
 *
 *  $RCSfile: frmfmt.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FRMFMT_HXX
#define _FRMFMT_HXX

#ifndef _FORMAT_HXX
#include <format.hxx>
#endif

class SwDrawContact;
class SwFlyFrm;
class Graphic;
class Point;
class ImageMap;
class IMapObject;
class SwRect;
class SwContact;
class SdrObject;

class SwFrmFmt: public SwFmt
{
    friend class SwDoc;
    friend class SwPageDesc;    //darf den protected CTor rufen.
    friend class SwSwgReader;   // der SW2-Reader auch!
    friend class Sw3IoImp;      // der SW3-Reader auch!

protected:
    SwFrmFmt( SwAttrPool& rPool, const sal_Char* pFmtNm,
                SwFrmFmt *pDrvdFrm, USHORT nFmtWhich = RES_FRMFMT,
                const USHORT* pWhichRange = 0 )
          : SwFmt( rPool, pFmtNm, (pWhichRange ? pWhichRange : aFrmFmtSetRange),
                pDrvdFrm, nFmtWhich )
    {}

    SwFrmFmt( SwAttrPool& rPool, const String &rFmtNm,
                SwFrmFmt *pDrvdFrm, USHORT nFmtWhich = RES_FRMFMT,
                const USHORT* pWhichRange = 0 )
          : SwFmt( rPool, rFmtNm, (pWhichRange ? pWhichRange : aFrmFmtSetRange),
                pDrvdFrm, nFmtWhich )
    {}

public:
    TYPEINFO();     //Bereits in Basisklasse Client drin.

    //Vernichtet alle Frms in aDepend (Frms werden per PTR_CAST erkannt).
    virtual void DelFrms();

    //Erzeugt die Ansichten
    virtual void MakeFrms();

    virtual Graphic MakeGraphic( ImageMap* pMap = NULL );

    virtual void Modify( SfxPoolItem* pOldValue, SfxPoolItem* pNewValue );

    // returnt das IMapObject, das an dem Format (Fly), in der ImageMap
    // an der Point Position definiert ist.
    //  rPoint - teste auf der DocPosition
    //  pFly - optionaler FlyFrame, falls der schon bekannt ist.
    IMapObject* GetIMapObject( const Point& rPoint,
                                const SwFlyFrm *pFly = 0 ) const;

    // Gibt die tatsaechlche Groesse des Frames zurueck bzw. ein leeres
    // Rechteck, wenn kein Layout existiert. Wird pPoint angegeben, dann
    // wird der am dichtesten liegende Frame gesucht.
    SwRect FindLayoutRect( const BOOL bPrtArea = FALSE,
                            const Point* pPoint = 0,
                            const BOOL bCalcFrm = FALSE ) const;

    // Sucht das SdrObject. Der SdrObjUserCall ist Client vom Format.
    // Der UserCall kennt sein SdrObject.
          SwContact *FindContactObj();
    const SwContact *FindContactObj() const
        { return ((SwFrmFmt*)this)->FindContactObj(); }

    // returns the SdrObject, that ist connected to the ContactObject.
    // Only DrawFrmFmts are connected to the "real SdrObject". FlyFrmFmts
    // are connected to a Master and all FlyFrms has the "real SdrObject".
    // "Real SdrObject" has position and a Z-order.
          SdrObject *FindSdrObject();
    const SdrObject *FindSdrObject() const
        { return ((SwFrmFmt*)this)->FindSdrObject(); }

          SdrObject *FindRealSdrObject();
    const SdrObject *FindRealSdrObject() const
        { return ((SwFrmFmt*)this)->FindRealSdrObject(); }

    BOOL IsLowerOf( const SwFrmFmt& rFmt ) const;

    DECL_FIXEDMEMPOOL_NEWDEL(SwFrmFmt)
};

//Das FlyFrame-Format ------------------------------

class SwFlyFrmFmt: public SwFrmFmt
{
    friend class SwDoc;

    //Beide nicht vorhanden.
    SwFlyFrmFmt( const SwFlyFrmFmt &rCpy );
    SwFlyFrmFmt &operator=( const SwFlyFrmFmt &rCpy );

protected:
    SwFlyFrmFmt( SwAttrPool& rPool, const sal_Char* pFmtNm,
                    SwFrmFmt *pDrvdFrm )
        : SwFrmFmt( rPool, pFmtNm, pDrvdFrm, RES_FLYFRMFMT )
    {}
    SwFlyFrmFmt( SwAttrPool& rPool, const String &rFmtNm,
                    SwFrmFmt *pDrvdFrm )
        : SwFrmFmt( rPool, rFmtNm, pDrvdFrm, RES_FLYFRMFMT )
    {}

public:
    TYPEINFO();
    ~SwFlyFrmFmt();

    //Erzeugt die Ansichten
    virtual void MakeFrms();

    SwFlyFrm* GetFrm( const Point* pDocPos = 0,
                        const BOOL bCalcFrm = FALSE ) const;

    virtual Graphic MakeGraphic( ImageMap* pMap = NULL );

    virtual BOOL GetInfo( SfxPoolItem& rInfo ) const;

    DECL_FIXEDMEMPOOL_NEWDEL(SwFlyFrmFmt)
};

//Das DrawFrame-Format -----------------------------

class SwDrawFrmFmt: public SwFrmFmt
{
    friend class SwDoc;

    //Beide nicht vorhanden.
    SwDrawFrmFmt( const SwDrawFrmFmt &rCpy );
    SwDrawFrmFmt &operator=( const SwDrawFrmFmt &rCpy );

protected:
    SwDrawFrmFmt( SwAttrPool& rPool, const sal_Char* pFmtNm,
                    SwFrmFmt *pDrvdFrm )
        : SwFrmFmt( rPool, pFmtNm, pDrvdFrm, RES_DRAWFRMFMT )
    {}
    SwDrawFrmFmt( SwAttrPool& rPool, const String &rFmtNm,
                    SwFrmFmt *pDrvdFrm )
        : SwFrmFmt( rPool, rFmtNm, pDrvdFrm, RES_DRAWFRMFMT )
    {}

public:
    TYPEINFO();
    ~SwDrawFrmFmt();

    //DrawObjecte werden aus den Arrays am Layout entfernt. Die DrawObjecte
    //werden als geloescht gekennzeichnet.
    virtual void DelFrms();

    //Anmelden der DrawObjecte in den Arrays am Layout. Loeschkennzeichen
    //werden zurueckgesetzt.
    virtual void MakeFrms();

    virtual Graphic MakeGraphic( ImageMap* pMap = NULL );


    DECL_FIXEDMEMPOOL_NEWDEL(SwDrawFrmFmt);
};


#endif

diff --git a/sw/inc/ftnidx.hxx b/sw/inc/ftnidx.hxx
new file mode 100644
index 0000000..bd75a59
--- /dev/null
+++ b/sw/inc/ftnidx.hxx
@@ -0,0 +1,114 @@
/*************************************************************************
 *
 *  $RCSfile: ftnidx.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FTNIDX_HXX
#define _FTNIDX_HXX


#define _SVSTDARR_USHORTS
#include <svtools/svstdarr.hxx>

class SwTxtFtn;
class SwNodeIndex;
class SwSectionNode;

// ueberall, wo der NodeIndex gebraucht wird, werden die hier fehlenden
// Headerfiles schon includes. Darum hier nur als define und nicht als
// inline Methode (spart Compile-Zeit)
#define _SwTxtFtn_GetIndex( pFIdx ) (pFIdx->GetTxtNode().GetIndex())


typedef SwTxtFtn* SwTxtFtnPtr;
SV_DECL_PTRARR_SORT( _SwFtnIdxs, SwTxtFtnPtr, 0, 10 )

class SwFtnIdxs : public _SwFtnIdxs
{
public:
    SwFtnIdxs() {}

    void UpdateFtn( SwNodeIndex& rStt );    // ab Pos. alle Updaten
    void UpdateAllFtn();                    // alle Fussnoten updaten
    void UpdateFtnInSections();

    SwTxtFtn* SeekEntry( const SwNodeIndex& rIdx, USHORT* pPos = 0 ) const;
};


class SwUpdFtnEndNtAtEnd
{
    SvPtrarr aFtnSects, aEndSects;
    SvUShorts aFtnNums, aEndNums;

public:
    SwUpdFtnEndNtAtEnd() : aFtnSects( 0, 4 ), aEndSects( 0, 4 ),
                           aFtnNums( 0, 4 ), aEndNums( 0, 4 )
        {}

    static const SwSectionNode* FindSectNdWithEndAttr(
                                            const SwTxtFtn& rTxtFtn );

    USHORT GetNumber( const SwTxtFtn& rTxtFtn, const SwSectionNode& rNd );
    USHORT ChkNumber( const SwTxtFtn& rTxtFtn );
};



#endif // _FTNIDX_HXX

diff --git a/sw/inc/ftninfo.hxx b/sw/inc/ftninfo.hxx
new file mode 100644
index 0000000..d826773
--- /dev/null
+++ b/sw/inc/ftninfo.hxx
@@ -0,0 +1,146 @@
/*************************************************************************
 *
 *  $RCSfile: ftninfo.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FTNINFO_HXX
#define _FTNINFO_HXX

#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif

#include "numrule.hxx"

class SwTxtFmtColl;
class SwPageDesc;

class SwEndNoteInfo : public SwClient
{
    SwDepend    aPageDescDep;
    SwDepend    aCharFmtDep, aAnchorCharFmtDep;
    String      sPrefix;
    String      sSuffix;
protected:
    BOOL      bEndNote;
public:
    SwNumType aFmt;
    USHORT    nFtnOffset;

    void        ChgPageDesc( SwPageDesc *pDesc );
    SwPageDesc *GetPageDesc( SwDoc &rDoc ) const;
    SwClient   *GetPageDescDep() const { return (SwClient*)&aPageDescDep; }

    void SetFtnTxtColl(SwTxtFmtColl& rColl);
    SwTxtFmtColl* GetFtnTxtColl() const { return  (SwTxtFmtColl*) GetRegisteredIn(); } // kann 0 sein

    SwCharFmt* GetCharFmt(SwDoc &rDoc) const;
    void SetCharFmt( SwCharFmt* );
    SwClient   *GetCharFmtDep() const { return (SwClient*)&aCharFmtDep; }

    SwCharFmt* GetAnchorCharFmt(SwDoc &rDoc) const;
    void SetAnchorCharFmt( SwCharFmt* );
    SwClient   *GetAnchorCharFmtDep() const { return (SwClient*)&aAnchorCharFmtDep; }

    virtual void Modify( SfxPoolItem* pOld, SfxPoolItem* pNew );

    SwEndNoteInfo & operator=(const SwEndNoteInfo&);
    BOOL operator==( const SwEndNoteInfo &rInf ) const;

    SwEndNoteInfo( SwTxtFmtColl *pTxtColl = 0);
    SwEndNoteInfo(const SwEndNoteInfo&);

    const String& GetPrefix() const         { return sPrefix; }
    const String& GetSuffix() const         { return sSuffix; }

    void SetPrefix(const String& rSet)      { sPrefix = rSet; }
    void SetSuffix(const String& rSet)      { sSuffix = rSet; }

    BOOL IsEndNoteInfo() const              { return bEndNote; }
};

enum SwFtnPos
{
    //Derzeit nur PAGE und CHAPTER. CHAPTER == Dokumentendenoten.
    FTNPOS_PAGE = 1,
    FTNPOS_CHAPTER = 8
};

enum SwFtnNum
{
    FTNNUM_PAGE, FTNNUM_CHAPTER, FTNNUM_DOC
};

class SwFtnInfo: public SwEndNoteInfo
{
public:
    String    aQuoVadis;
    String    aErgoSum;
    SwFtnPos  ePos;
    SwFtnNum  eNum;


    SwFtnInfo& operator=(const SwFtnInfo&);
    BOOL operator==( const SwFtnInfo &rInf ) const;

    SwFtnInfo(SwTxtFmtColl* pTxtColl = 0);
    SwFtnInfo(const SwFtnInfo&);
};


#endif
diff --git a/sw/inc/globals.hrc b/sw/inc/globals.hrc
new file mode 100644
index 0000000..3d54169
--- /dev/null
+++ b/sw/inc/globals.hrc
@@ -0,0 +1,323 @@
/*************************************************************************
 *
 *  $RCSfile: globals.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _GLOBALS_HRC
#define _GLOBALS_HRC


// Versions-Definition wie in solar.h und swtypes.hxx
//#define SW_FILEFORMAT_40 3580

#include "rcid.hrc"

// STRINGS -----------------------------------------------------------

#define STR_DLLNOTFOUND             (RC_GLOBALS_BEGIN + 0)
#define STR_FMT_STD                 (RC_GLOBALS_BEGIN + 1)
#define STR_LOAD_GLOBAL_DOC         (RC_GLOBALS_BEGIN + 2)

#define STR_SEPARATOR               (RC_GLOBALS_BEGIN + 4)


#define STR_BASIC_IMPORT            (RC_GLOBALS_BEGIN + 5)
#define STR_BASIC_BEGIN             (RC_GLOBALS_BEGIN + 6)
#define STR_BASIC_END               (RC_GLOBALS_BEGIN + 7)
#define STR_BASIC_REC_LIB           (RC_GLOBALS_BEGIN + 8)
#define STR_TEMPLATE_WILDCARD       (RC_GLOBALS_BEGIN + 9)
#define STR_DOC_STAT                (RC_GLOBALS_BEGIN + 10)

#define STR_PAGE                    (RC_GLOBALS_BEGIN + 14)

//EventStrings

#define STR_EVENT_OBJECT_SELECT      ( RC_GLOBALS_BEGIN + 17 )
#define STR_EVENT_START_INS_GLOSSARY ( RC_GLOBALS_BEGIN + 18 )
#define STR_EVENT_END_INS_GLOSSARY   ( RC_GLOBALS_BEGIN + 19 )
#define STR_EVENT_MOUSEOVER_OBJECT   ( RC_GLOBALS_BEGIN + 20 )
#define STR_EVENT_MOUSECLICK_OBJECT  ( RC_GLOBALS_BEGIN + 21 )
#define STR_EVENT_MOUSEOUT_OBJECT    ( RC_GLOBALS_BEGIN + 22 )
#define STR_EVENT_IMAGE_LOAD         ( RC_GLOBALS_BEGIN + 23 )
#define STR_EVENT_IMAGE_ABORT        ( RC_GLOBALS_BEGIN + 24 )
#define STR_EVENT_IMAGE_ERROR        ( RC_GLOBALS_BEGIN + 25 )
#define STR_EVENT_FRM_KEYINPUT_A     ( RC_GLOBALS_BEGIN + 26 )
#define STR_EVENT_FRM_KEYINPUT_NOA   ( RC_GLOBALS_BEGIN + 27 )
#define STR_EVENT_FRM_RESIZE         ( RC_GLOBALS_BEGIN + 28 )
#define STR_EVENT_FRM_MOVE           ( RC_GLOBALS_BEGIN + 29 )

// Strings fuer Rahmenausrichtungen im Popup
#define STR_TOP_BASE                (RC_GLOBALS_BEGIN + 30)
#define STR_BOTTOM_BASE             (RC_GLOBALS_BEGIN + 31)
#define STR_CENTER_BASE             (RC_GLOBALS_BEGIN + 32)
#define STR_TOP                     (RC_GLOBALS_BEGIN + 33)
#define STR_BOTTOM                  (RC_GLOBALS_BEGIN + 34)
#define STR_CENTER_HORI             (RC_GLOBALS_BEGIN + 35)
#define STR_CENTER_VERT             (RC_GLOBALS_BEGIN + 36)

#define STR_LOAD_HTML_DOC           (RC_GLOBALS_BEGIN + 37)

#define STR_AUTH                    (RC_GLOBALS_BEGIN + 38)
#define STR_TBL                     (RC_GLOBALS_BEGIN + 39)
#define STR_TOO                     (RC_GLOBALS_BEGIN + 40)
#define STR_TOILL                   (RC_GLOBALS_BEGIN + 41)

// BITMAPS -----------------------------------------------------------

#define RES_TABL                    (RC_GLOBALS_BEGIN + 1)
#define RES_TABR                    (RC_GLOBALS_BEGIN + 2)
#define RES_TABD                    (RC_GLOBALS_BEGIN + 3)
#define RES_TABC                    (RC_GLOBALS_BEGIN + 4)

// DIALOGE -----------------------------------------------------------

#define DLG_LISTBOX                 (RC_GLOBALS_BEGIN + 1)
#define DLG_THESAURUS               (RC_GLOBALS_BEGIN + 2)
#define DLG_SPECIAL                 (RC_GLOBALS_BEGIN + 3)

// QUERYBOX ---------------------------------------------------------

#define DLG_WRAP                    (RC_GLOBALS_BEGIN + 4)
#define DLG_BODY                    (RC_GLOBALS_BEGIN + 5)
#define DLG_PRT_FIELDNAME           (RC_GLOBALS_BEGIN + 6)

// INFOBOX ------------------------------------------------------------

#define ERR_CLPBRD_READ             (RC_GLOBALS_BEGIN + 1)
#define ERR_CLPBRD_WRITE            (RC_GLOBALS_BEGIN + 2)
#define MSG_ERROR_PASSWD            (RC_GLOBALS_BEGIN + 3)


// ACC ---------------------------------------------------------------

#define FN_CHAR_LEFT_SEL            (RC_GLOBALS_BEGIN + 1)   //
#define FN_CHAR_RIGHT_SEL           (RC_GLOBALS_BEGIN + 2)   //
#define FN_LINE_UP_SEL              (RC_GLOBALS_BEGIN + 3)   //
#define FN_LINE_DOWN_SEL            (RC_GLOBALS_BEGIN + 4)   //
#define FN_START_OF_LINE_SEL        (RC_GLOBALS_BEGIN + 5)   // StartOfLine
#define FN_END_OF_LINE_SEL          (RC_GLOBALS_BEGIN + 6)   // EndOfLine
#define FN_START_OF_DOCUMENT_SEL    (RC_GLOBALS_BEGIN + 7)   // StartOfDocument
#define FN_END_OF_DOCUMENT_SEL      (RC_GLOBALS_BEGIN + 8)   // EndOfDocument
#define FN_START_OF_NEXT_PAGE_SEL   (RC_GLOBALS_BEGIN + 9)   // StartOfNextPage ???
#define FN_END_OF_NEXT_PAGE_SEL     (RC_GLOBALS_BEGIN + 10)   // ???
#define FN_START_OF_PREV_PAGE_SEL   (RC_GLOBALS_BEGIN + 11)   // StartOfPrevPage ???
#define FN_END_OF_PREV_PAGE_SEL     (RC_GLOBALS_BEGIN + 12)   // ???
#define FN_START_OF_PAGE_SEL        (RC_GLOBALS_BEGIN + 13)   // StartOfPage
#define FN_END_OF_PAGE_SEL          (RC_GLOBALS_BEGIN + 14)   // EndOfPage
#define FN_START_OF_WINDOW_SEL      (RC_GLOBALS_BEGIN + 15)   // StartOfWindow
#define FN_END_OF_WINDOW_SEL        (RC_GLOBALS_BEGIN + 16)   // EndOfWindow
#define FN_START_OF_COLUMN_SEL      (RC_GLOBALS_BEGIN + 17)   // StartOfColumn
#define FN_END_OF_COLUMN_SEL        (RC_GLOBALS_BEGIN + 18)   // EndOfColumn
#define FN_START_OF_PARA_SEL        (RC_GLOBALS_BEGIN + 19)   // StartOfPara
#define FN_END_OF_PARA_SEL          (RC_GLOBALS_BEGIN + 20)   // EndOfPara
#define FN_NEXT_WORD_SEL            (RC_GLOBALS_BEGIN + 21)   // NextWord
#define FN_PREV_WORD_SEL            (RC_GLOBALS_BEGIN + 22)   // PrevWord
#define FN_NEXT_SENT_SEL            (RC_GLOBALS_BEGIN + 23)   // NextSentence
#define FN_PREV_SENT_SEL            (RC_GLOBALS_BEGIN + 24)   // PrevSentence

#define FN_START_OF_NEXT_COLUMN_SEL (RC_GLOBALS_BEGIN + 25)
#define FN_END_OF_NEXT_COLUMN_SEL   (RC_GLOBALS_BEGIN + 26)
#define FN_START_OF_PREV_COLUMN_SEL (RC_GLOBALS_BEGIN + 27)
#define FN_END_OF_PREV_COLUMN_SEL   (RC_GLOBALS_BEGIN + 28)
#define FN_PAGEUP_SEL               (RC_GLOBALS_BEGIN + 29)
#define FN_PAGEDOWN_SEL             (RC_GLOBALS_BEGIN + 30)

// TABPAGES -----------------------------------------------------------

#define TP_PAGE_STD                 (RC_GLOBALS_BEGIN +  1)
#define TP_PAGE_EXT                 (RC_GLOBALS_BEGIN +  2)

#define TP_PARA_STD                 (RC_GLOBALS_BEGIN +  3)
#define TP_PARA_EXT                 (RC_GLOBALS_BEGIN +  4)

#define TP_FRAME_STD                (RC_GLOBALS_BEGIN +  5)
#define TP_FRAME_EXT                (RC_GLOBALS_BEGIN +  6)

#define TP_CHAR_STD                 (RC_GLOBALS_BEGIN +  7)
#define TP_CHAR_EXT                 (RC_GLOBALS_BEGIN +  8)

#define TP_TABULATOR                (RC_GLOBALS_BEGIN +  9)
#define TP_DROPCAPS                 (RC_GLOBALS_BEGIN +  10)
#define TP_BACKGROUND               (RC_GLOBALS_BEGIN +  11)
#define TP_BORDER                   (RC_GLOBALS_BEGIN +  12)
#define TP_COLUMN                   (RC_GLOBALS_BEGIN +  13)

#define TP_DOC_STAT                 (RC_GLOBALS_BEGIN +  15)

#define TP_HEADER_PAGE              (RC_GLOBALS_BEGIN +  16)
#define TP_FOOTER_PAGE              (RC_GLOBALS_BEGIN +  17)
#define TP_FOOTNOTE_PAGE            (RC_GLOBALS_BEGIN +  18)

#define TP_OPTGENERAL_PAGE          (RC_GLOBALS_BEGIN +  19) //Sfx-Seiten
#define TP_OPTSAVE_PAGE             (RC_GLOBALS_BEGIN +  20)
#define TP_OPTPATH_PAGE             (RC_GLOBALS_BEGIN +  21)
#define TP_OPTSPELL_PAGE            (RC_GLOBALS_BEGIN +  22)
 //Sw-Seiten
#define SW_EDIT_OPTIONS_TDLG        (RC_GLOBALS_BEGIN +  23)
#define SW_BROWSER_OPTIONS_TDLG     (RC_GLOBALS_BEGIN +  24)
#define TP_OPTTEST_PAGE             (RC_GLOBALS_BEGIN +  25)
#define TP_OPTPRINT_PAGE            (RC_GLOBALS_BEGIN +  26)
#define TP_OPTCOLOR_PAGE            (RC_GLOBALS_BEGIN +  27)

#define SW_OPTIONS_TDLG             (RC_GLOBALS_BEGIN +  28)
#define SW_OPTIONS_TDLG_ELEM        (RC_GLOBALS_BEGIN +  29)
#define SW_OPTIONS_TDLG_PRINT       (RC_GLOBALS_BEGIN +  30)

#define TP_FRM_STD                  (RC_GLOBALS_BEGIN +  31)

#define TP_OPTGRID_PAGE             (RC_GLOBALS_BEGIN +  33)

#define TP_FORMAT_TABLE             (RC_GLOBALS_BEGIN +  34)
#define TP_GRF_EXT                  (RC_GLOBALS_BEGIN +  35)

#define DLG_FRM_STD                 (RC_GLOBALS_BEGIN +  36)
#define DLG_FRM_GRF                 (RC_GLOBALS_BEGIN +  37)
#define DLG_FRM_OLE                 (RC_GLOBALS_BEGIN +  38)

#define RID_INPUT_TOOLBOX           (RC_GLOBALS_BEGIN +  39)

#define TP_MACRO_ASSIGN             (RC_GLOBALS_BEGIN +  40)
#define TP_FRM_URL                  (RC_GLOBALS_BEGIN +  42)
#define TP_CHAR_URL                 (RC_GLOBALS_BEGIN +  43)

#define TP_LAYOUT_OPT               (RC_GLOBALS_BEGIN +  44)
#define TP_CONTENT_OPT              (RC_GLOBALS_BEGIN +  45)
#define TP_HTML_OPT                 (RC_GLOBALS_BEGIN +  46)
#define TP_STD_FONT                 (RC_GLOBALS_BEGIN +  47)
#define TP_CONDCOLL                 (RC_GLOBALS_BEGIN +  48)

#define TP_FRM_WRAP                 (RC_GLOBALS_BEGIN +  49)
#define TP_FRM_ADD                  (RC_GLOBALS_BEGIN +  51)

#define TP_TABLE_TEXTFLOW           (RC_GLOBALS_BEGIN +  52)

#define TP_AUTOFMT_BY_INPUT         (RC_GLOBALS_BEGIN +  53)
#define TP_AUTOFMT_APPLY            (RC_GLOBALS_BEGIN +  54)

#define TP_PARA_ALIGN               (RC_GLOBALS_BEGIN +  55)
#define TP_OPTTABLE_PAGE            (RC_GLOBALS_BEGIN +  56)

#define TP_NUMBER                   (RC_GLOBALS_BEGIN +  57)

#define DLG_NUM_BULLET              (RC_GLOBALS_BEGIN +  58)
#define TP_PICK_SINGLE_NUM          (RC_GLOBALS_BEGIN +  59)
#define TP_PICK_BULLET              (RC_GLOBALS_BEGIN +  60)
#define TP_PICK_NUM                 (RC_GLOBALS_BEGIN +  61)
#define TP_PICK_BMP                 (RC_GLOBALS_BEGIN +  62)
#define TP_OPTSRCVIEW               (RC_GLOBALS_BEGIN +  63)

#define TP_FLD_DB                   (RC_GLOBALS_BEGIN +  64)
#define TP_FLD_DOKINF               (RC_GLOBALS_BEGIN +  65)
#define TP_FLD_VAR                  (RC_GLOBALS_BEGIN +  66)
#define TP_FLD_DOK                  (RC_GLOBALS_BEGIN +  67)
#define TP_FLD_FUNC                 (RC_GLOBALS_BEGIN +  68)
#define TP_FLD_REF                  (RC_GLOBALS_BEGIN +  69)

#define TP_OPTSHDWCRSR              (RC_GLOBALS_BEGIN +  70)
#define TP_NUM_OPTIONS              (RC_GLOBALS_BEGIN +  71)
#define TP_NUM_POSITION             (RC_GLOBALS_BEGIN +  72)
#define TP_NUMPARA                  (RC_GLOBALS_BEGIN +  73)

#define TP_REDLINE_OPT              (RC_GLOBALS_BEGIN +  74)

#define TP_LINENUMBERING            (RC_GLOBALS_BEGIN +  75)
#define TP_OUTLINE_NUM              (RC_GLOBALS_BEGIN +  76)

#define TP_OPTINSERT_PAGE           (RC_GLOBALS_BEGIN +  77)
#define TP_OPTCAPTION_PAGE          (RC_GLOBALS_BEGIN +  78)
#define DLG_SVXTEST_NUM_BULLET      (RC_GLOBALS_BEGIN +  79)
#define TP_OPTLOAD_PAGE             (RC_GLOBALS_BEGIN +  80)
#define TP_INSERT_TOX               (RC_GLOBALS_BEGIN +  81)
#define TP_TOX_FORM_ENTRY           (RC_GLOBALS_BEGIN +  82)
#define TP_TOX_FORM_STYLES          (RC_GLOBALS_BEGIN +  83)
#define DLG_INSERT_TOX_TABDLG       (RC_GLOBALS_BEGIN +  84)
#define TP_INSERT_SECTION           (RC_GLOBALS_BEGIN +  85)
#define DLG_INSERT_SECTION          (RC_GLOBALS_BEGIN +  86)
#define DLG_SECTION_PROPERTIES      (RC_GLOBALS_BEGIN +  87)
#define DLG_RENAME_XNAMED           (RC_GLOBALS_BEGIN +  88)
#define DLG_MULTI_TOX               (RC_GLOBALS_BEGIN +  89)
#define TP_TOX_SELECT               (RC_GLOBALS_BEGIN +  90)
#define TP_TOX_ENTRY                (RC_GLOBALS_BEGIN +  91)
#define TP_TOX_STYLES               (RC_GLOBALS_BEGIN +  92)
#define TP_VISITING_CARDS           (RC_GLOBALS_BEGIN +  93)
#define DLG_ADD_IDX_STYLES          (RC_GLOBALS_BEGIN +  94)
#define TP_PRIVATE_DATA             (RC_GLOBALS_BEGIN +  95)
#define TP_BUSINESS_DATA            (RC_GLOBALS_BEGIN +  96)
#define TP_SECTION_FTNENDNOTES      (RC_GLOBALS_BEGIN +  97)

// Kontext-Menues (Format-Menue) --------------------------------------------

#define MN_OBJECTMENU_TEXT          (RC_GLOBALS_BEGIN + 1)
#define MN_OBJECTMENU_LIST          (RC_GLOBALS_BEGIN + 2)
#define MN_OBJECTMENU_TABLE         (RC_GLOBALS_BEGIN + 3)
#define MN_OBJECTMENU_FRAME         (RC_GLOBALS_BEGIN + 4)
#define MN_OBJECTMENU_GRAFIK        (RC_GLOBALS_BEGIN + 5)
#define MN_OBJECTMENU_DRAW          (RC_GLOBALS_BEGIN + 6)
#define MN_OBJECTMENU_DRWTXT        (RC_GLOBALS_BEGIN + 7)
#define MN_OBJECTMENU_OLE           (RC_GLOBALS_BEGIN + 8)
#define MN_OBJECTMENU_DRAWCONTROL   (RC_GLOBALS_BEGIN + 9)
#define MN_OBJECTMENU_DRAWFORM      (RC_GLOBALS_BEGIN + 10)


#if STR_DOC_STAT > RC_GLOBALS_END
#error Resource-Id Ueberlauf in #file, #line
#endif


#endif // _GLOBALS_HRC
diff --git a/sw/inc/globdoc.hxx b/sw/inc/globdoc.hxx
new file mode 100644
index 0000000..87218b6
--- /dev/null
+++ b/sw/inc/globdoc.hxx
@@ -0,0 +1,92 @@
/*************************************************************************
 *
 *  $RCSfile: globdoc.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWGLOBDOCSH_HXX
#define _SWGLOBDOCSH_HXX

#ifndef SW_SWDLL_HXX
#include <swdll.hxx>
#endif
#include "docsh.hxx"

class SwGlobalDocShell : public SwDocShell
{
public:

    SFX_DECL_OBJECTFACTORY_DLL(SwGlobalDocShell, SW_DLL());
    TYPEINFO();

    SwGlobalDocShell(SfxObjectCreateMode eMode = SFX_CREATE_MODE_EMBEDDED);
    ~SwGlobalDocShell();

    // Anforderung der pIo-Struktur fuer den Zugriff auf Substorages
    // und Streams
    virtual void    FillRegInfo( SvEmbeddedRegistryInfo * );

    virtual void    FillClass( SvGlobalName * pClassName,
                                   ULONG * pClipFormat,
                                   String * pAppName,
                                   String * pLongUserName,
                                   String * pUserName,
                                   long nVersion = SOFFICE_FILEFORMAT_NOW ) const;
};

#endif

diff --git a/sw/inc/grfatr.hxx b/sw/inc/grfatr.hxx
new file mode 100644
index 0000000..0dd9934
--- /dev/null
+++ b/sw/inc/grfatr.hxx
@@ -0,0 +1,431 @@
/*************************************************************************
 *
 *  $RCSfile: grfatr.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _GRFATR_HXX
#define _GRFATR_HXX

#ifndef _HINTIDS_HXX
#include <hintids.hxx>      // fuer die WhichIds
#endif

#ifndef _SV_GEN_HXX
#include <tools/gen.hxx>
#endif
#ifndef _SFXENUMITEM_HXX
#include <svtools/eitem.hxx>
#endif
#ifndef _SFXINTITEM_HXX
#include <svtools/intitem.hxx>
#endif
#ifndef _SVX_GRFCROP_HXX
#include <svx/grfcrop.hxx>
#endif

#ifndef _SWATRSET_HXX
#include <swatrset.hxx>     // fuer inlines
#endif
#ifndef _FORMAT_HXX
#include <format.hxx>       // fuer inlines
#endif

/******************************************************************************
 *  class SwMirrorGrf
 ******************************************************************************/

enum GRFMIRROR
{
RES_GRFMIRROR_BEGIN,
    RES_DONT_MIRROR_GRF = RES_GRFMIRROR_BEGIN,
    RES_MIRROR_GRF_VERT,
    RES_MIRROR_GRF_HOR,
    RES_MIRROR_GRF_BOTH,
RES_GRFMIRROR_END
};

class SwMirrorGrf : public SfxEnumItem
{
    BOOL bGrfToggle; // auf geraden Seiten Grafiken spiegeln

public:
    SwMirrorGrf( USHORT nMiro = RES_DONT_MIRROR_GRF )
        : SfxEnumItem( RES_GRFATR_MIRRORGRF, nMiro ), bGrfToggle( sal_False )
    {}
    SwMirrorGrf::SwMirrorGrf( const SwMirrorGrf &rMirrorGrf )
        : SfxEnumItem( RES_GRFATR_MIRRORGRF, rMirrorGrf.GetValue()),
        bGrfToggle( rMirrorGrf.IsGrfToggle() )
    {}

    // pure virtual-Methoden von SfxPoolItem
    virtual SfxPoolItem* Clone( SfxItemPool *pPool = 0 ) const;

    // pure virtual-Methiden von SfxEnumItem
    virtual USHORT          GetValueCount() const;
    virtual USHORT          GetVersion( USHORT nFFVer ) const;
    virtual SfxPoolItem*    Create(SvStream &, USHORT nVer ) const;
    virtual SvStream&       Store(SvStream &, USHORT nIVer) const;
    virtual int             operator==( const SfxPoolItem& ) const;
    virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres,
                                    SfxMapUnit eCoreMetric,
                                    SfxMapUnit ePresMetric,
                                    String &rText,
                                    const International*    pIntl = 0 ) const;

    virtual BOOL             QueryValue( com::sun::star::uno::Any& rVal,
                                        BYTE nMemberId = 0 ) const;
    virtual BOOL             PutValue( const com::sun::star::uno::Any& rVal,
                                        BYTE nMemberId = 0 );

    inline SwMirrorGrf& operator=( const SwMirrorGrf& rMirrorGrf )
        {
            SfxEnumItem::SetValue( rMirrorGrf.GetValue() );
            bGrfToggle = rMirrorGrf.IsGrfToggle();
            return *this;
        }

    inline BOOL IsGrfToggle() const         { return bGrfToggle; }
    inline void SetGrfToggle( BOOL bNew )   { bGrfToggle = bNew; }
};


/******************************************************************************
 *  class SwAttrCropGrf
 ******************************************************************************/

class SwCropGrf : public SvxGrfCrop
{
public:
    TYPEINFO();
    SwCropGrf();
    SwCropGrf(  sal_Int32 nLeft,    sal_Int32 nRight,
                sal_Int32 nTop,     sal_Int32 nBottom );

    // "pure virtual Methoden" vom SfxPoolItem
    virtual SfxPoolItem*        Clone( SfxItemPool *pPool = 0 ) const;
    virtual USHORT              GetVersion( USHORT nFileVersion ) const;
};

class SwRotationGrf : public SfxUInt16Item
{
    Size aUnrotatedSize;
public:
    SwRotationGrf( sal_Int16 nVal = 0 )
        : SfxUInt16Item( RES_GRFATR_ROTATION, nVal )
    {}
    SwRotationGrf( sal_Int16 nVal, const Size& rSz )
        : SfxUInt16Item( RES_GRFATR_ROTATION, nVal ), aUnrotatedSize( rSz )
    {}

    // pure virtual-Methiden from SfxInt16Item
    virtual SfxPoolItem* Clone( SfxItemPool *pPool = 0 ) const;
    virtual USHORT       GetVersion( USHORT nFFVer ) const;
    virtual SfxPoolItem*    Create(SvStream &, USHORT nVer ) const;
    virtual SvStream&       Store(SvStream &, USHORT nIVer) const;
    virtual int             operator==( const SfxPoolItem& ) const;
    virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres,
                                    SfxMapUnit eCoreMetric,
                                    SfxMapUnit ePresMetric,
                                    String &rText,
                                    const International* pIntl = 0 ) const;
    virtual BOOL             QueryValue( com::sun::star::uno::Any& rVal,
                                            BYTE nMemberId = 0 ) const;
    virtual BOOL             PutValue( const com::sun::star::uno::Any& rVal,
                                            BYTE nMemberId = 0 );

    void SetUnrotatedSize( const Size& rSz )        { aUnrotatedSize = rSz; }
    const Size& GetUnrotatedSize() const            { return aUnrotatedSize; }
};

class SwLuminanceGrf : public SfxInt16Item
{
public:
    SwLuminanceGrf( sal_Int16 nVal = 0 )
        : SfxInt16Item( RES_GRFATR_LUMINANCE, nVal )
    {}

    // pure virtual-Methiden from SfxInt16Item
    virtual SfxPoolItem* Clone( SfxItemPool *pPool = 0 ) const;
    virtual USHORT       GetVersion( USHORT nFFVer ) const;
    virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres,
                                    SfxMapUnit eCoreMetric,
                                    SfxMapUnit ePresMetric,
                                    String &rText,
                                    const International* pIntl = 0 ) const;
};

class SwContrastGrf : public SfxInt16Item
{
public:
    SwContrastGrf( sal_Int16 nVal = 0 )
        : SfxInt16Item( RES_GRFATR_CONTRAST, nVal )
    {}

    // pure virtual-Methiden from SfxInt16Item
    virtual SfxPoolItem* Clone( SfxItemPool *pPool = 0 ) const;
    virtual USHORT       GetVersion( USHORT nFFVer ) const;
    virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres,
                                    SfxMapUnit eCoreMetric,
                                    SfxMapUnit ePresMetric,
                                    String &rText,
                                    const International* pIntl = 0 ) const;
};

class SwChannelGrf : public SfxInt16Item
{
protected:
    SwChannelGrf( sal_Int16 nVal, USHORT nWhich )
        : SfxInt16Item( nWhich, nVal )
    {}

public:
    // pure virtual-Methiden from SfxInt16Item
    virtual USHORT          GetVersion( USHORT nFFVer ) const;
    virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres,
                                    SfxMapUnit eCoreMetric,
                                    SfxMapUnit ePresMetric,
                                    String &rText,
                                    const International* pIntl = 0 ) const;
};

class SwChannelRGrf : public SwChannelGrf
{
public:
    SwChannelRGrf( sal_Int16 nVal = 0 )
        : SwChannelGrf( nVal, RES_GRFATR_CHANNELR )
    {}
    virtual SfxPoolItem* Clone( SfxItemPool *pPool = 0 ) const;
};
class SwChannelGGrf : public SwChannelGrf
{
public:
    SwChannelGGrf( sal_Int16 nVal = 0 )
        : SwChannelGrf( nVal, RES_GRFATR_CHANNELG )
    {}
    virtual SfxPoolItem* Clone( SfxItemPool *pPool = 0 ) const;
};
class SwChannelBGrf : public SwChannelGrf
{
public:
    SwChannelBGrf( sal_Int16 nVal = 0 )
        : SwChannelGrf( nVal, RES_GRFATR_CHANNELB )
    {}
    virtual SfxPoolItem* Clone( SfxItemPool *pPool = 0 ) const;
};

class SwGammaGrf : public SfxPoolItem
{
    double nValue;
public:
    TYPEINFO();
    SwGammaGrf() : SfxPoolItem( RES_GRFATR_GAMMA ), nValue( 1.0 )
    {}

    SwGammaGrf( const double& rVal )
        : SfxPoolItem( RES_GRFATR_GAMMA ), nValue( rVal )
    {}

    inline SwGammaGrf& operator=( const SwGammaGrf& rCopy )
        {
            SetValue( rCopy.GetValue() );
            return *this;
        }

    // pure virtual-Methiden von SfxEnumItem
    virtual SfxPoolItem*    Clone( SfxItemPool *pPool = 0 ) const;
    virtual USHORT          GetVersion( USHORT nFFVer ) const;
    virtual SfxPoolItem*    Create(SvStream &, USHORT nVer ) const;
    virtual SvStream&       Store(SvStream &, USHORT nIVer) const;
    virtual int             operator==( const SfxPoolItem& ) const;
    virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres,
                                    SfxMapUnit eCoreMetric,
                                    SfxMapUnit ePresMetric,
                                    String &rText,
                                    const International* pIntl = 0 ) const;

    virtual BOOL             QueryValue( com::sun::star::uno::Any& rVal,
                                            BYTE nMemberId = 0 ) const;
    virtual BOOL             PutValue( const com::sun::star::uno::Any& rVal,
                                            BYTE nMemberId = 0 );


    const double& GetValue() const              { return nValue; }
    void SetValue( const double& rVal )         { nValue = rVal; }
};

class SwInvertGrf: public SfxBoolItem
{
public:
    SwInvertGrf( sal_Bool bVal = sal_False )
        : SfxBoolItem( RES_GRFATR_INVERT, bVal )
    {}

    // pure virtual-Methiden from SfxInt16Item
    virtual SfxPoolItem* Clone( SfxItemPool *pPool = 0 ) const;
    virtual USHORT       GetVersion( USHORT nFFVer ) const;
    virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres,
                                    SfxMapUnit eCoreMetric,
                                    SfxMapUnit ePresMetric,
                                    String &rText,
                                    const International* pIntl = 0 ) const;
};

class SwTransparencyGrf : public SfxByteItem
{
public:
    SwTransparencyGrf( sal_Int8 nVal = 0 )
        : SfxByteItem( RES_GRFATR_TRANSPARENCY, nVal )
    {}

    // pure virtual-Methiden from SfxInt16Item
    virtual SfxPoolItem* Clone( SfxItemPool *pPool = 0 ) const;
    virtual USHORT       GetVersion( USHORT nFFVer ) const;
    virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres,
                                    SfxMapUnit eCoreMetric,
                                    SfxMapUnit ePresMetric,
                                    String &rText,
                                    const International* pIntl = 0 ) const;
};

class SwDrawModeGrf : public SfxEnumItem
{
public:
    SwDrawModeGrf( USHORT nMode = 0 )
        : SfxEnumItem( RES_GRFATR_DRAWMODE, nMode )
    {}

    // pure virtual-Methoden von SfxPoolItem
    virtual SfxPoolItem*    Clone( SfxItemPool *pPool = 0 ) const;

    // pure virtual-Methiden von SfxEnumItem
    virtual USHORT          GetValueCount() const;
    virtual USHORT          GetVersion( USHORT nFFVer ) const;
    virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres,
                                    SfxMapUnit eCoreMetric,
                                    SfxMapUnit ePresMetric,
                                    String &rText,
                                    const International*    pIntl = 0 ) const;

    virtual BOOL            QueryValue( com::sun::star::uno::Any& rVal,
                                        BYTE nMemberId = 0 ) const;
    virtual BOOL            PutValue( const com::sun::star::uno::Any& rVal,
                                        BYTE nMemberId = 0 );
};



/******************************************************************************
 *  Implementierung der GrafikAttribut Methoden vom SwAttrSet
 ******************************************************************************/

inline const SwMirrorGrf &SwAttrSet::GetMirrorGrf(BOOL bInP) const
    { return (const SwMirrorGrf&)Get( RES_GRFATR_MIRRORGRF,bInP); }
inline const SwCropGrf   &SwAttrSet::GetCropGrf(BOOL bInP) const
    { return (const SwCropGrf&)Get( RES_GRFATR_CROPGRF,bInP); }
inline const SwRotationGrf &SwAttrSet::GetRotationGrf(BOOL bInP) const
    { return (const SwRotationGrf&)Get( RES_GRFATR_ROTATION,bInP); }
inline const SwLuminanceGrf &SwAttrSet::GetLuminanceGrf(BOOL bInP) const
    { return (const SwLuminanceGrf&)Get( RES_GRFATR_LUMINANCE,bInP); }
inline const SwContrastGrf &SwAttrSet::GetContrastGrf(BOOL bInP) const
    { return (const SwContrastGrf&)Get( RES_GRFATR_CONTRAST,bInP); }
inline const SwChannelRGrf &SwAttrSet::GetChannelRGrf(BOOL bInP) const
    { return (const SwChannelRGrf&)Get( RES_GRFATR_CHANNELR,bInP); }
inline const SwChannelGGrf &SwAttrSet::GetChannelGGrf(BOOL bInP) const
    { return (const SwChannelGGrf&)Get( RES_GRFATR_CHANNELG,bInP); }
inline const SwChannelBGrf &SwAttrSet::GetChannelBGrf(BOOL bInP) const
    { return (const SwChannelBGrf&)Get( RES_GRFATR_CHANNELB,bInP); }
inline const SwGammaGrf &SwAttrSet::GetGammaGrf(BOOL bInP) const
    { return (const SwGammaGrf&)Get( RES_GRFATR_GAMMA,bInP); }
inline const SwInvertGrf &SwAttrSet::GetInvertGrf(BOOL bInP) const
    { return (const SwInvertGrf&)Get( RES_GRFATR_INVERT,bInP); }
inline const SwTransparencyGrf &SwAttrSet::GetTransparencyGrf(BOOL bInP) const
    { return (const SwTransparencyGrf&)Get( RES_GRFATR_TRANSPARENCY,bInP); }
inline const SwDrawModeGrf      &SwAttrSet::GetDrawModeGrf(BOOL bInP) const
    { return (const SwDrawModeGrf&)Get( RES_GRFATR_DRAWMODE,bInP); }

/******************************************************************************
 *  Implementierung der GrafikAttribut Methoden vom SwFmt
 ******************************************************************************/

inline const SwMirrorGrf &SwFmt::GetMirrorGrf(BOOL bInP) const
    { return aSet.GetMirrorGrf(bInP); }
inline const SwCropGrf   &SwFmt::GetCropGrf(BOOL bInP) const
    { return aSet.GetCropGrf(bInP); }
inline const SwRotationGrf &SwFmt::GetRotationGrf(BOOL bInP) const
    { return aSet.GetRotationGrf(bInP); }
inline const SwLuminanceGrf &SwFmt::GetLuminanceGrf(BOOL bInP) const
    { return aSet.GetLuminanceGrf( bInP); }
inline const SwContrastGrf &SwFmt::GetContrastGrf(BOOL bInP) const
    { return aSet.GetContrastGrf( bInP); }
inline const SwChannelRGrf &SwFmt::GetChannelRGrf(BOOL bInP) const
    { return aSet.GetChannelRGrf( bInP); }
inline const SwChannelGGrf &SwFmt::GetChannelGGrf(BOOL bInP) const
    { return aSet.GetChannelGGrf( bInP); }
inline const SwChannelBGrf &SwFmt::GetChannelBGrf(BOOL bInP) const
    { return aSet.GetChannelBGrf( bInP); }
inline const SwGammaGrf &SwFmt::GetGammaGrf(BOOL bInP) const
    { return aSet.GetGammaGrf( bInP); }
inline const SwInvertGrf &SwFmt::GetInvertGrf(BOOL bInP) const
    { return aSet.GetInvertGrf( bInP); }
inline const SwTransparencyGrf &SwFmt::GetTransparencyGrf(BOOL bInP) const
    { return aSet.GetTransparencyGrf( bInP); }
inline const SwDrawModeGrf &SwFmt::GetDrawModeGrf(BOOL bInP) const
    { return aSet.GetDrawModeGrf(bInP); }


#endif  // _GRFATR_HXX
diff --git a/sw/inc/helpid.h b/sw/inc/helpid.h
new file mode 100644
index 0000000..51d80db
--- /dev/null
+++ b/sw/inc/helpid.h
@@ -0,0 +1,876 @@
/*************************************************************************
 *
 *  $RCSfile: helpid.h,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _SOLAR_HRC
#include <svtools/solar.hrc>
#endif

#define HID_BASE                    HID_APP_START

#define HID_BIB_BASE                (HID_BASE +  1)
#define HID_DBSEL                   (HID_BASE +  2)
#define HID_DBEDIT                  (HID_BASE +  3)
#define HID_PRINT_OPTION            (HID_BASE +  4)
#define HID_MERGE_PRINTMONITOR      (HID_BASE +  5)
#define HID_FLD_INPUT               (HID_BASE +  6)
#define HID_CONFIG_MISC             (HID_BASE +  7)
#define HID_CONFIG_PATH             (HID_BASE +  8)
#define HID_CONFIG_TB               (HID_BASE +  9)
#define HID_PG_FOOTNOTE             (HID_BASE + 10)
#define HID_FORMAT_GRAPHIC          (HID_BASE + 11)
#define HID_FILTERSTATUS            (HID_BASE + 12)
#define HID_DOCINFO_EDT             (HID_BASE + 13)
#define HID_DBLOGON                 (HID_BASE + 14)
#define HID_MAC_ASSIGN              (HID_BASE + 15)
#define HID_CONFIG_MN               (HID_BASE + 16)
#define HID_PAPERSIZE               (HID_BASE + 17)
#define HID_PASSWD                  (HID_BASE + 18)
#define HID_SPELLING_OPTIONS        (HID_BASE + 19)
#define HID_HYPHENATE_OPTIONS       (HID_BASE + 20)
#define HID_FORMAT_COLUMN           (HID_BASE + 21)
#define HID_CONFIG_SAVE             (HID_BASE + 22)
#define HID_NUM_NAMES               (HID_BASE + 23)
#define HID_SYMBOL_SELECT           (HID_BASE + 24)
#define HID_CONFIG_KY               (HID_BASE + 25)
#define HID_LINKEDIT                (HID_BASE + 26)
#define HID_GRAPHIC_PREVIEW         (HID_BASE + 28)
#define HID_DICTIONARY              (HID_BASE + 29)
#define HID_SET_STYLE               (HID_BASE + 30)
#define HID_RIBBONBAR               (HID_BASE + 31)
#define HID_STATUSLINE              (HID_BASE + 32)
#define HID_DOCBAR                  (HID_BASE + 33)
#define HID_VRULER                  (HID_BASE + 34)
#define HID_MAKRO_WINDOW            (HID_BASE + 35)
#define HID_ENVELOP_FORMAT          (HID_BASE + 37)
#define HID_ENVELOP_PRINTER         (HID_BASE + 38)

#define HID_HEADER_FOOTER_DLG       (HID_BASE + 39)
#define HID_GRID_DLG                (HID_BASE + 40)
#define HID_USER_ADDRESS_DLG        (HID_BASE + 41)
#define HID_SELECT_FAX_DLG          (HID_BASE + 42)

#define HID_LABEL_FORMAT            (HID_BASE + 43)
#define HID_BRSORT                  (HID_BASE + 44)
#define HID_BRSEEK                  (HID_BASE + 45)
#define HID_BRCFG                   (HID_BASE + 46)

#define HID_FORMEDT_CONTENT         (HID_BASE + 47)
#define HID_FORMEDT_USER            (HID_BASE + 48)
#define HID_FORMEDT_INDEX           (HID_BASE + 49)

#define HID_SCRL_PAGEUP             (HID_BASE + 50)
#define HID_SCRL_PAGEDOWN           (HID_BASE + 51)

#define HID_DRAW_WIN                (HID_BASE + 52)
#define HID_EDIT_WIN                (HID_BASE + 53)

#define HID_INSERT_CTRL             (HID_BASE + 54) // TbxControl Einfuegen
#define HID_INSERT_OBJ_CTRL         (HID_BASE + 55)
#define HID_INSERT_FIELD_CTRL       (HID_BASE + 56)

#define HID_SOURCEVIEW              (HID_BASE + 57)
#define HID_TBL_OPT_CTRL            (HID_BASE + 58)
#define HID_AUTOFORMAT_CLB          (HID_BASE + 59)

#define HID_SCRL_NAVI               (HID_BASE + 60)
#define HID_NAVI_DRAG_HYP           (HID_BASE + 61)
#define HID_NAVI_DRAG_LINK          (HID_BASE + 62)
#define HID_NAVI_DRAG_COPY          (HID_BASE + 63)
#define HID_NAVI_OUTLINES           (HID_BASE + 64)

#define HID_AUTOFORMAT_EXEC         (HID_BASE + 65)
#define HID_AUTOFORMAT_CLOSE        (HID_BASE + 66)

#define HID_PAGEPREVIEW             (HID_BASE + 67)
#define HID_SOURCE_EDITWIN          (HID_BASE + 68)

// Dialog Help-IDs **********************************************************

#define HID_CONVERT_FROM            (HID_BASE + 200)
#define HID_CONVERT_TO              (HID_BASE + 201)
#define HID_EDIT_POSTIT             (HID_BASE + 202)
#define HID_INSERT_CHART            (HID_BASE + 203)
#define HID_PAGE_PREVIEW            (HID_BASE + 204)
#define HID_INSERT_HYPERLINK        (HID_BASE + 205)
#define HID_NAVIGATOR_TREELIST      (HID_BASE + 206)
#define HID_DLG_CAPTION             (HID_BASE + 207)
#define HID_DLG_GLOSS_DECIDE        (HID_BASE + 208)
#define HID_NAVIGATOR_TOOLBOX       (HID_BASE + 209)
#define HID_NAVIGATOR_LISTBOX       (HID_BASE + 210)
#define HID_NUM_BULLET_DLG          (HID_BASE + 211)
#define HID_VS_SINGLENUM            (HID_BASE + 212)
#define HID_VS_NUM                  (HID_BASE + 213)
#define HID_VS_BULLET               (HID_BASE + 214)
#define HID_VS_NUMBMP               (HID_BASE + 215)
#define HID_VS_RULER                (HID_BASE + 216)
#define HID_RULER_DIALOG            (HID_BASE + 217)
#define HID_INSERT_ABSTRACT         (HID_BASE + 218)
#define HID_NAVI_TBX1               (HID_BASE + 219)
#define HID_NAVI_TBX2               (HID_BASE + 220)
#define HID_NAVI_TBX3               (HID_BASE + 221)
#define HID_NAVI_TBX4               (HID_BASE + 222)
#define HID_NAVI_TBX5               (HID_BASE + 223)
#define HID_NAVI_TBX6               (HID_BASE + 224)
#define HID_NAVI_TBX7               (HID_BASE + 225)
#define HID_NAVI_TBX8               (HID_BASE + 226)
#define HID_NAVI_TBX9               (HID_BASE + 227)
#define HID_NAVI_TBX10              (HID_BASE + 228)
#define HID_NAVI_TBX11              (HID_BASE + 229)
#define HID_NAVI_TBX12              (HID_BASE + 230)
#define HID_NAVI_TBX13              (HID_BASE + 231)
#define HID_NAVI_TBX14              (HID_BASE + 232)
#define HID_NAVI_TBX15              (HID_BASE + 233)
#define HID_NAVI_VS                 (HID_BASE + 234)
#define HID_NUM_FORMAT_BTN          (HID_BASE + 235)
#define HID_PPREV_ZOOM              (HID_BASE + 236)
#define HID_NAVI_TBX16              (HID_BASE + 237)
#define HID_LTEMPL_TEXT             (HID_BASE + 238)
#define HID_LTEMPL_FRAME            (HID_BASE + 239)
#define HID_LTEMPL_PAGE             (HID_BASE + 240)
#define HID_LTEMPL_OVERRIDE         (HID_BASE + 241)
#define HID_LTEMPL_TEMPLATES        (HID_BASE + 242)
#define HID_NAVI_TBX17              (HID_BASE + 243)
#define HID_NAVI_TBX18              (HID_BASE + 244)
#define HID_NAVI_TBX19              (HID_BASE + 245)
#define HID_NAVI_TBX20              (HID_BASE + 246)
#define HID_NAVI_TBX21              (HID_BASE + 247)
#define HID_NAVI_TBX22              (HID_BASE + 248)
#define HID_NAVI_TBX23              (HID_BASE + 249)
#define HID_NAVI_TBX24              (HID_BASE + 250)
#define HID_NAVIGATOR_GLOBAL_TOOLBOX (HID_BASE + 251)
#define HID_NAVIGATOR_GLOB_TREELIST (HID_BASE + 252)
#define HID_GLOS_GROUP_TREE         (HID_BASE + 253)
#define HID_GLBLTREE_UPDATE         (HID_BASE + 254)
#define HID_GLBLTREE_INSERT         (HID_BASE + 255)
#define HID_GLBLTREE_EDIT           (HID_BASE + 256)
#define HID_GLBLTREE_DEL            (HID_BASE + 257)
#define HID_GLBLTREE_INS_IDX        (HID_BASE + 258)
#define HID_GLBLTREE_INS_CNTIDX     (HID_BASE + 259)
#define HID_GLBLTREE_INS_USRIDX     (HID_BASE + 260)
#define HID_GLBLTREE_INS_FILE       (HID_BASE + 261)
#define HID_GLBLTREE_INS_NEW_FILE   (HID_BASE + 262)
#define HID_GLBLTREE_INS_TEXT       (HID_BASE + 263)
#define HID_GLBLTREE_UPD_SEL        (HID_BASE + 264)
#define HID_GLBLTREE_UPD_IDX        (HID_BASE + 265)
#define HID_GLBLTREE_UPD_LINK       (HID_BASE + 266)
#define HID_GLBLTREEUPD_ALL         (HID_BASE + 267)
#define HID_NUM_OUTL_NAMED_NUMS     (HID_BASE + 268)
#define HID_NUM_OUTL_NUM_SAVEAS     (HID_BASE + 269)
#define HID_NUM_NAMED_NUMS          (HID_BASE + 270)
#define HID_NUM_NUM_SAVEAS          (HID_BASE + 271)
#define HID_NUM_STD_NUMBER          (HID_BASE + 272)
#define HID_NUM_DEL_NUMBER          (HID_BASE + 273)
#define HID_NUM_STD_BULLET          (HID_BASE + 274)
#define HID_NUM_DEL_BULLET          (HID_BASE + 275)
#define HID_NAVI_CONTENT            (HID_BASE + 276)
#define HID_NAVI_GLOBAL             (HID_BASE + 277)
#define HID_LTEMPL_NUMBERING        (HID_BASE + 278)
#define HID_FLDVAR_APPLY            (HID_BASE + 279)
#define HID_FLDVAR_DELETE           (HID_BASE + 280)
#define HID_FLDEDT_ADDRESS          (HID_BASE + 281)
#define HID_SORT_ACTION             (HID_BASE + 282)
#define HID_SORT_AUTHOR             (HID_BASE + 283)
#define HID_SORT_DATE               (HID_BASE + 284)
#define HID_SORT_COMMENT            (HID_BASE + 285)
#define HID_SW_SORT_POSITION        (HID_BASE + 286)
#define HID_SYNC_BTN                (HID_BASE + 287)
#define HID_EDIT_COMMENT            (HID_BASE + 288)
#define HID_SEL_TEMPLATE            (HID_BASE + 289)
#define HID_DLG_SEQUENCE_OPTION     (HID_BASE + 290)
#define HID_DLG_FLDEDT_NEXT         (HID_BASE + 291)
#define HID_DLG_FLDEDT_PREV         (HID_BASE + 292)
#define HID_DLG_FLDEDT_ADDRESS      (HID_BASE + 293)
#define HID_DLG_PRV_PRT_OPTIONS     (HID_BASE + 294)

#define HID_FILEDLG_CHARDLG         (HID_BASE + 295)
#define HID_FILEDLG_LOADTEMPLATE    (HID_BASE + 296)
#define HID_FILEDLG_ROMENU          (HID_BASE + 297)
#define HID_FILEDLG_MAILMRGE1       (HID_BASE + 298)
#define HID_FILEDLG_MAILMRGE2       (HID_BASE + 299)
#define HID_FILEDLG_FRMPAGE         (HID_BASE + 300)
#define HID_FILEDLG_SRCVIEW         (HID_BASE + 301)
#define HID_FILEDLG_WIZDOKU         (HID_BASE + 302)
#define HID_PREVIEW_ZOOM            (HID_BASE + 303)

#define HID_REDLINE_AUTOFMT_ACCEPT  (HID_BASE + 304)
#define HID_MULTI_TOX_DLG           (HID_BASE + 305)
#define HID_ASCII_FILTER            (HID_BASE + 306)

// TabPage Help-IDs *********************************************************

#define HID_DROPCAPS                (HID_BASE + 400)
#define HID_FRM_EXT                 (HID_BASE + 401)
#define HID_FRM_STD                 (HID_BASE + 402)
#define HID_GRF_EXT                 (HID_BASE + 403)
#define HID_COLUMN                  (HID_BASE + 404)
#define HID_DOC_STAT                (HID_BASE + 405)
#define HID_MACROASSIGN             (HID_BASE + 406)
#define HID_FOOTNOTE_PAGE           (HID_BASE + 407)
#define HID_OPTDOCDISP_PAGE         (HID_BASE + 408)
#define HID_OPTGRID_PAGE            (HID_BASE + 409)
#define HID_OPTTEST_PAGE            (HID_BASE + 410)
#define HID_OPTPRINT_PAGE           (HID_BASE + 411)
#define HID_FORMAT_TABLE            (HID_BASE + 412)
#define HID_TABLE_COLUMN            (HID_BASE + 413)
#define HID_LAB_LAB                 (HID_BASE + 414)
#define HID_LAB_PRT                 (HID_BASE + 415)
#define HID_ENV_PRT                 (HID_BASE + 416)
#define HID_LAB_FMT                 (HID_BASE + 417)
#define HID_ENV_ENV                 (HID_BASE + 418)
#define HID_ENV_FMT                 (HID_BASE + 419)
#define HID_FRM_URL                 (HID_BASE + 421)
#define HID_CHAR_URL                (HID_BASE + 422)
#define HID_CONTENT_OPT             (HID_BASE + 423)
#define HID_LAYOUT_OPT              (HID_BASE + 424)
#define HID_STD_FONT                (HID_BASE + 425)
#define HID_COND_COLL               (HID_BASE + 426)
#define HID_FRM_ADD                 (HID_BASE + 427)
#define HID_TABLE_TEXTFLOW          (HID_BASE + 428)
#define HID_AUTOFMT_BY_INPUT        (HID_BASE + 429)
#define HID_AUTOFMT_APPLY           (HID_BASE + 430)
#define HID_OPTTABLE_PAGE           (HID_BASE + 431)
#define HID_PICK_SINGLE_NUM         (HID_BASE + 432)
#define HID_PICK_BULLET             (HID_BASE + 433)
#define HID_PICK_NUM                (HID_BASE + 434)
#define HID_PICK_BMP                (HID_BASE + 435)
#define HID_OPTSRCVIEW              (HID_BASE + 436)
#define HID_FLD_DB                  (HID_BASE + 437)
#define HID_FLD_DOKINF              (HID_BASE + 438)
#define HID_FLD_VAR                 (HID_BASE + 439)
#define HID_FLD_DOK                 (HID_BASE + 440)
#define HID_FLD_FUNC                (HID_BASE + 441)
#define HID_FLD_REF                 (HID_BASE + 442)
#define HID_OPTSHDWCRSR             (HID_BASE + 443)
#define HID_NUM_OPTIONS             (HID_BASE + 444)
#define HID_NUM_POSITION            (HID_BASE + 445)
#define HID_NUMPARA                 (HID_BASE + 446)
#define HID_FOOTNOTE_OPTIONS        (HID_BASE + 447)
#define HID_ENDNOTE_OPTIONS         (HID_BASE + 448)
#define HID_REDLINE_OPT             (HID_BASE + 449)
#define HID_LINENUMBERING           (HID_BASE + 450)
#define HID_REDLINE_ACCEPT          (HID_BASE + 451)
#define HID_EDIT_FLD_DB             (HID_BASE + 452)
#define HID_EDIT_FLD_DOKINF         (HID_BASE + 453)
#define HID_EDIT_FLD_VAR            (HID_BASE + 454)
#define HID_EDIT_FLD_DOK            (HID_BASE + 455)
#define HID_EDIT_FLD_FUNC           (HID_BASE + 456)
#define HID_EDIT_FLD_REF            (HID_BASE + 457)
#define HID_REDLINE_CTRL            (HID_BASE + 458)
#define HID_TP_OUTLINE_NUM          (HID_BASE + 459)
#define HID_OPTINSERT_PAGE          (HID_BASE + 460)
#define HID_OPTCAPTION_PAGE         (HID_BASE + 461)
#define HID_OPTLOAD_PAGE            (HID_BASE + 462)
#define HID_INSERT_TOX_PAGE         (HID_BASE + 463)
#define HID_TOX_FORM_ENTRY_PAGE     (HID_BASE + 464)
#define HID_TOX_FORM_STYLES_PAGE    (HID_BASE + 465)
#define HID_INSERT_TOX_TABDLG       (HID_BASE + 466)
#define HID_INSERT_SECTION_PAGE     (HID_BASE + 467)
#define HID_INSERT_SECTION_DLG      (HID_BASE + 468)
#define HID_SECTION_PROPERTIES_DLG  (HID_BASE + 469)
#define HID_RENAME_XNAMED           (HID_BASE + 470)
#define HID_TP_TOX_SELECT           (HID_BASE + 471)
#define HID_TP_TOX_ENTRY            (HID_BASE + 472)
#define HID_TOX_STYLES_PAGE         (HID_BASE + 473)
#define HID_TP_VISITING_CARDS       (HID_BASE + 474)
#define HID_DLG_ADD_IDX_STYLES      (HID_BASE + 475)
#define HID_ADD_STYLES_TLB          (HID_BASE + 476)
#define HID_OLE_CHECKLB             (HID_BASE + 477)
#define HID_DLG_CREATE_AUTH_ENTRY   (HID_BASE + 478)
#define HID_TP_PRIVATE_DATA         (HID_BASE + 479)
#define HID_TP_BUSINESS_DATA        (HID_BASE + 480)
#define HID_SECTION_FTNENDNOTES_PAGE (HID_BASE + 481)


// AutoPilot Help-IDs *********************************************************

#define HID_LETTER_PAGE1            (HID_BASE + 501)
#define HID_LETTER_PAGE2            (HID_BASE + 502)
#define HID_LETTER_PAGE3            (HID_BASE + 503)
#define HID_LETTER_PAGE4            (HID_BASE + 504)
#define HID_LETTER_PAGE5            (HID_BASE + 505)
#define HID_LETTER_PAGE6            (HID_BASE + 506)
#define HID_LETTER_PAGE7            (HID_BASE + 507)
#define HID_LETTER_PAGE8            (HID_BASE + 508)
#define HID_LETTER_PAGE9            (HID_BASE + 509)

#define HID_FAX_PAGE1               (HID_BASE + 511)
#define HID_FAX_PAGE2               (HID_BASE + 512)
#define HID_FAX_PAGE3               (HID_BASE + 513)
#define HID_FAX_PAGE4               (HID_BASE + 514)
#define HID_FAX_PAGE5               (HID_BASE + 515)
#define HID_FAX_PAGE6               (HID_BASE + 516)
#define HID_FAX_PAGE7               (HID_BASE + 517)
#define HID_FAX_PAGE8               (HID_BASE + 518)

#define HID_MEMO_PAGE1              (HID_BASE + 521)
#define HID_MEMO_PAGE2              (HID_BASE + 522)
#define HID_MEMO_PAGE3              (HID_BASE + 523)
#define HID_MEMO_PAGE4              (HID_BASE + 524)
#define HID_MEMO_PAGE5              (HID_BASE + 525)

#define HID_AGENDA_PAGE1            (HID_BASE + 531)
#define HID_AGENDA_PAGE2            (HID_BASE + 532)
#define HID_AGENDA_PAGE3            (HID_BASE + 533)
#define HID_AGENDA_PAGE4            (HID_BASE + 534)
#define HID_AGENDA_PAGE5            (HID_BASE + 535)
#define HID_AGENDA_PAGE6            (HID_BASE + 536)

#define HID_AUTOPILOT_NEXT          (HID_BASE + 537)
#define HID_AUTOPILOT_PREV          (HID_BASE + 538)
#define HID_AUTOPILOT_OK            (HID_BASE + 539)

// HelpIds fuers Menue *****************************************************

#define HID_MN_SUB_TBLROW           (HID_BASE + 600)
#define HID_MN_SUB_TBLCOL           (HID_BASE + 601)
#define HID_MN_SUB_AUTOFORMAT       (HID_BASE + 602)
#define HID_MN_SUB_TOOLBAR          (HID_BASE + 603)
#define HID_MN_SUB_FIELD            (HID_BASE + 604)
#define HID_MN_SUB_GRAPHIC          (HID_BASE + 605)
#define HID_MN_SUB_TEMPLATES        (HID_BASE + 606)
#define HID_MN_SUB_ARRANGE          (HID_BASE + 607)
#define HID_MN_SUB_SPELLING         (HID_BASE + 608)
#define HID_MN_SUB_UPDATE           (HID_BASE + 609)
#define HID_MN_SUB_MIRROR           (HID_BASE + 610)
#define HID_MN_SUB_ALIGN            (HID_BASE + 611)
#define HID_MN_SUB_OPTIONS          (HID_BASE + 612)

#define HID_MN_CALC_PHD             (HID_BASE + 613)
#define HID_MN_CALC_SQRT            (HID_BASE + 614)
#define HID_MN_CALC_OR              (HID_BASE + 615)
#define HID_MN_CALC_XOR             (HID_BASE + 616)
#define HID_MN_CALC_AND             (HID_BASE + 617)
#define HID_MN_CALC_NOT             (HID_BASE + 618)
#define HID_MN_CALC_EQ              (HID_BASE + 619)
#define HID_MN_CALC_NEQ             (HID_BASE + 620)
#define HID_MN_CALC_LEQ             (HID_BASE + 621)
#define HID_MN_CALC_GEQ             (HID_BASE + 622)
#define HID_MN_CALC_LES             (HID_BASE + 623)
#define HID_MN_CALC_GRE             (HID_BASE + 624)
#define HID_MN_CALC_SUM             (HID_BASE + 625)
#define HID_MN_CALC_MEAN            (HID_BASE + 626)
#define HID_MN_CALC_MIN             (HID_BASE + 627)
#define HID_MN_CALC_MAX             (HID_BASE + 628)
#define HID_MN_CALC_SIN             (HID_BASE + 629)
#define HID_MN_CALC_COS             (HID_BASE + 630)
#define HID_MN_CALC_TAN             (HID_BASE + 631)
#define HID_MN_CALC_ASIN            (HID_BASE + 632)
#define HID_MN_CALC_ACOS            (HID_BASE + 633)
#define HID_MN_CALC_ATAN            (HID_BASE + 634)
#define HID_MN_CALC_POW             (HID_BASE + 635)
#define HID_MN_CALC_LISTSEP         (HID_BASE + 636)
#define HID_MN_POP_OPS              (HID_BASE + 637)
#define HID_MN_POP_STATISTICS       (HID_BASE + 638)
#define HID_MN_POP_FUNC             (HID_BASE + 639)
#define HID_MN_RSC_END              (HID_BASE + 640)
#define HID_MN_CALC_ROUND           (HID_BASE + 641)

#define HID_MN_READONLY_DOWNLOAD                (HID_BASE + 643)
#define HID_MN_READONLY_CREATEGRAPHIKLINK       (HID_BASE + 644)
#define HID_MN_READONLY_SAVEGRAPHIC             (HID_BASE + 645)
#define HID_MN_READONLY_GRAPHICTOGALLERY        (HID_BASE + 646)
#define HID_MN_READONLY_TOGALLERYLINK           (HID_BASE + 647)
#define HID_MN_READONLY_TOGALLERYCOPY           (HID_BASE + 648)
#define HID_MN_READONLY_SAVEBACKGROUND          (HID_BASE + 649)
#define HID_MN_READONLY_BACKGROUNDTOGALLERY     (HID_BASE + 650)
#define HID_MN_READONLY_COPYLINK                (HID_BASE + 651)
#define HID_MN_READONLY_COPYGRAPHIC             (HID_BASE + 652)
#define HID_MN_READONLY_LOADGRAPHIC             (HID_BASE + 653)
#define HID_MN_READONLY_GRAPHICOFF              (HID_BASE + 654)
#define HID_MN_READONLY_PLUGINOFF               (HID_BASE + 655)

#define HID_MD_GLOS_DEFINE          (HID_BASE + 656)
#define HID_MD_GLOS_REPLACE         (HID_BASE + 657)
#define HID_MD_GLOS_RENAME          (HID_BASE + 658)
#define HID_MD_GLOS_DELETE          (HID_BASE + 659)
#define HID_MD_GLOS_EDIT            (HID_BASE + 660)
#define HID_MD_GLOS_MACRO           (HID_BASE + 661)
#define HID_LINGU_ADD_WORD          (HID_BASE + 662)
#define HID_LINGU_IGNORE_WORD       (HID_BASE + 663)
#define HID_LINGU_SPELLING_DLG      (HID_BASE + 664)
#define HID_LINGU_AUTOCORR          (HID_BASE + 665)
#define HID_LINGU_REPLACE           (HID_BASE + 666)
#define HID_MD_GLOS_CATEGORY        (HID_BASE + 667)
#define HID_REGION_TREE             (HID_BASE + 668)
#define HID_LINGU_WORD_LANGUAGE     (HID_BASE + 669)
#define HID_LINGU_PARA_LANGUAGE     (HID_BASE + 670)
#define HID_MD_GLOS_DEFINE_TEXT     (HID_BASE + 671)
#define HID_DLG_PASSWD_SECTION      (HID_BASE + 672)
#define HID_MD_COPY_TO_CLIPBOARD    (HID_BASE + 673)
#define HID_MD_GLOS_IMPORT          (HID_BASE + 674)

// Weiter Help-IDs **********************************************************

#define HID_CLOSE_FILE              (HID_BASE + 1001)
#define HID_LAUNCH_REGISTRY         (HID_BASE + 1002)
#define HID_MERGE_FILE              (HID_BASE + 1003)
#define HID_MERGE_FILE_DLG          (HID_BASE + 1004)
#define HID_NEW_FILE                (HID_BASE + 1005)
#define HID_OPEN_FILE               (HID_BASE + 1007)
#define HID_OPEN_LASTVERSION        (HID_BASE + 1009)
#define HID_PRINT_FILE              (HID_BASE + 1010)
#define HID_PRINT_FILE_OPTIONS      (HID_BASE + 1011)
#define HID_SAVE_FILE_AS            (HID_BASE + 1012)
#define HID_SAVE_FILE               (HID_BASE + 1013)
#define HID_SETUP_PRINTER_DLG       (HID_BASE + 1015)
#define HID_EXIT                    (HID_BASE + 1017)
#define HID_CREATE_DOCUMENT         (HID_BASE + 1019)
#define HID_DOCSTAT_DLG             (HID_BASE + 1020)
#define HID_LOAD_TEMPLATE_DLG       (HID_BASE + 1021)
#define HID_SAVE_ALL                (HID_BASE + 1023)
#define HID_NEW_FILE_DEFAULT        (HID_BASE + 1024)
#define HID_PRINT_FILE_DEFAULT      (HID_BASE + 1025)
#define HID_FAX                     (HID_BASE + 1028)
#define HID_SELECT_DATABASE         (HID_BASE + 1030)
#define HID_DOC_INFO_DLG            (HID_BASE + 1031)
#define HID_DOC_MGR_DLG             (HID_BASE + 1032)
#define HID_OPTCAPTION_CLB          (HID_BASE + 1033)

#define HID_COPY                    (HID_BASE + 1102)
#define HID_CUT                     (HID_BASE + 1103)
#define HID_EDIT_FIELD              (HID_BASE + 1104)
#define HID_EDIT_FILE_INFO_DLG      (HID_BASE + 1107)
#define HID_EDIT_LINK_DLG           (HID_BASE + 1109)
#define HID_EDIT_OBJECT             (HID_BASE + 1110)
#define HID_GOTO                    (HID_BASE + 1111)
#define HID_SET_FIELD_VALUE         (HID_BASE + 1112)
#define HID_PASTE                   (HID_BASE + 1113)
#define HID_REDO                    (HID_BASE + 1116)
#define HID_SEARCH                  (HID_BASE + 1117)
#define HID_REPLACE                 (HID_BASE + 1118)
#define HID_SELECT_ALL              (HID_BASE + 1119)
#define HID_UNDO                    (HID_BASE + 1120)
#define HID_REPEAT                  (HID_BASE + 1122)
#define HID_BUFFER_UPDATE           (HID_BASE + 1124)
#define HID_UPDATE_FIELDS           (HID_BASE + 1126)
#define HID_EXECUTE_MACROFIELD      (HID_BASE + 1127)
#define HID_EDIT_FORMULA            (HID_BASE + 1128)
#define HID_CALC_TABLE              (HID_BASE + 1129)
#define HID_NUM_BULLET_DOWN         (HID_BASE + 1130)
#define HID_NUM_BULLET_UP           (HID_BASE + 1131)
#define HID_NUM_BULLET_PREV         (HID_BASE + 1132)
#define HID_NUM_BULLET_NEXT         (HID_BASE + 1133)
#define HID_NUM_BULLET_MOVEUP       (HID_BASE + 1134)
#define HID_NUM_BULLET_MOVEDOWN     (HID_BASE + 1135)
#define HID_NUM_BULLET_NONUM        (HID_BASE + 1136)
#define HID_NUM_BULLET_OFF          (HID_BASE + 1137)
#define HID_NUM_BULLET_ON           (HID_BASE + 1138)
#define HID_NUM_BULLET_OUTLINE_DOWN (HID_BASE + 1139)
#define HID_NUM_BULLET_OUTLINE_UP   (HID_BASE + 1140)
#define HID_NUM_BULLET_OUTLINE_MOVEUP   (HID_BASE + 1141)
#define HID_NUM_BULLET_OUTLINE_MOVEDOWN (HID_BASE + 1142)
#define HID_UPDATE_INPUTFIELDS      (HID_BASE + 1143)
#define HID_NUM_NUMBERING_ON        (HID_BASE + 1144)
#define HID_REPEAT_SEARCH           (HID_BASE + 1150)
#define HID_REPAGINATE              (HID_BASE + 1161)

#define HID_REFRESH_VIEW            (HID_BASE + 1201)
#define HID_RIBBON                  (HID_BASE + 1210)
#define HID_RULER                   (HID_BASE + 1211)
#define HID_STATUSBAR               (HID_BASE + 1212)
#define HID_TOOLBOX                 (HID_BASE + 1213)
#define HID_VIEW_BOUNDS             (HID_BASE + 1214)
#define HID_VIEW_FIELDS             (HID_BASE + 1215)
#define HID_VLINEAL                 (HID_BASE + 1216)
#define HID_VSCROLLBAR              (HID_BASE + 1217)
#define HID_HSCROLLBAR              (HID_BASE + 1218)
#define HID_VIEW_META_CHARS         (HID_BASE + 1224)
#define HID_VIEW_MARKS              (HID_BASE + 1225)
#define HID_VIEW_FIELDNAME          (HID_BASE + 1226)
#define HID_VIEW_TABLEGRID          (HID_BASE + 1227)
#define HID_ZOOM                    (HID_BASE + 1231)

#define HID_DELETE_BOOKMARK         (HID_BASE + 1301)
#define HID_INSERT_BREAK            (HID_BASE + 1303)
#define HID_INSERT_COLUMN_BREAK     (HID_BASE + 1305)
#define HID_INSERT_FILE             (HID_BASE + 1309)
#define HID_INSERT_FOOTNOTE         (HID_BASE + 1311)
#define HID_INSERT_GRAFIC           (HID_BASE + 1315)
#define HID_INSERT_LINEBREAK        (HID_BASE + 1318)
#define HID_INSERT_MERGEFIELD_DLG   (HID_BASE + 1320)
#define HID_INSERT_OBJECT_DLG       (HID_BASE + 1322)
#define HID_INSERT_PAGEBREAK        (HID_BASE + 1323)
#define HID_INSERT_RECORD           (HID_BASE + 1326)
#define HID_MERGE_RECORD            (HID_BASE + 1327)
#define HID_INSERT_SYMBOL           (HID_BASE + 1328)
#define HID_INSERT_STRING           (HID_BASE + 1331)
#define HID_INSERT_COLS             (HID_BASE + 1332)
#define HID_INSERT_FRAME_INTERACT   (HID_BASE + 1333)
#define HID_INSERT_FRAME            (HID_BASE + 1334)
#define HID_INSERT_IDX_ENTRY        (HID_BASE + 1340)
#define HID_INSERT_USERIDX_ENTRY    (HID_BASE + 1341)
#define HID_INSERT_CNTNTIDX_ENTRY   (HID_BASE + 1342)
#define HID_INSERT_SOFT_HYPHEN      (HID_BASE + 1350)
#define HID_INSERT_HARD_SPACE       (HID_BASE + 1351)

#define HID_SET_FONT                (HID_BASE + 1401)
#define HID_SET_FONT_SIZE           (HID_BASE + 1402)
#define HID_GROW_FONT_SIZE          (HID_BASE + 1403)
#define HID_SHRINK_FONT_SIZE        (HID_BASE + 1404)
#define HID_SET_BOLD                (HID_BASE + 1405)
#define HID_SET_ITALIC              (HID_BASE + 1406)
#define HID_SET_SHADOW              (HID_BASE + 1407)
#define HID_SET_OUTLINE             (HID_BASE + 1408)
#define HID_SET_UNDERLINE           (HID_BASE + 1409)
#define HID_SET_STRIKEOUT           (HID_BASE + 1410)
#define HID_SET_SUPER_SCRIPT        (HID_BASE + 1411)
#define HID_SET_SUB_SCRIPT          (HID_BASE + 1412)
#define HID_SET_COLOR               (HID_BASE + 1413)
#define HID_SET_CASEMAP             (HID_BASE + 1414)
#define HID_SET_LANGUAGE            (HID_BASE + 1415)
#define HID_SET_KERNING             (HID_BASE + 1416)
#define HID_INDENT_TO_TABSTOP       (HID_BASE + 1417)
#define HID_SET_LEFT_PARA           (HID_BASE + 1418)
#define HID_SET_RIGHT_PARA          (HID_BASE + 1419)
#define HID_SET_CENTER_PARA         (HID_BASE + 1420)
#define HID_SET_JUSTIFY_PARA        (HID_BASE + 1421)
#define HID_SET_LINE_SPACE_1        (HID_BASE + 1422)
#define HID_SET_LINE_SPACE_15       (HID_BASE + 1423)
#define HID_SET_LINE_SPACE_2        (HID_BASE + 1424)
#define HID_FLIP_HORZ_GRAFIC        (HID_BASE + 1425)
#define HID_FLIP_VERT_GRAFIC        (HID_BASE + 1426)
#define HID_SET_ADJUST              (HID_BASE + 1428)
#define HID_SET_LRMARGIN            (HID_BASE + 1429)
#define HID_SET_ULMARGIN            (HID_BASE + 1430)
#define HID_UNINDENT_TO_TABSTOP     (HID_BASE + 1431)
#define HID_SET_HYPHEN_ZONE         (HID_BASE + 1432)
#define HID_SET_PAGE_BREAK          (HID_BASE + 1433)
#define HID_SET_KEEP_TOGETHER       (HID_BASE + 1434)
#define HID_SET_WIDOW               (HID_BASE + 1436)
#define HID_SET_ORPHAN              (HID_BASE + 1437)
#define HID_FORMAT_SHADOW           (HID_BASE + 1438)
#define HID_FORMAT_BORDER           (HID_BASE + 1439)
#define HID_FORMAT_CHAR_DLG         (HID_BASE + 1441)
#define HID_FORMAT_PARA_DLG         (HID_BASE + 1443)
#define HID_FORMAT_TAB              (HID_BASE + 1444)
#define HID_FORMAT_TAB_DLG          (HID_BASE + 1445)
#define HID_FORMAT_BORDER_DLG       (HID_BASE + 1447)
#define HID_FORMAT_BACKGROUND       (HID_BASE + 1448)
#define HID_FORMAT_BACKGROUND_DLG   (HID_BASE + 1450)
#define HID_FORMAT_PAGE             (HID_BASE + 1451)
#define HID_FORMAT_PAGE_DLG         (HID_BASE + 1452)
#define HID_FORMAT_DROPCAPS         (HID_BASE + 1454)
#define HID_FORMAT_FRAME_DLG        (HID_BASE + 1456)
#define HID_FORMAT_GRAFIC_DLG       (HID_BASE + 1458)
#define HID_FORMAT_TABLE_DLG        (HID_BASE + 1460)
#define HID_NEW_STYLE_BY_EXAMPLE    (HID_BASE + 1462)
#define HID_UPDATE_STYLE_BY_EXAMPLE (HID_BASE + 1463)
#define HID_STYLE_SHEET_FRAME_DLG   (HID_BASE + 1464)
#define HID_STYLE_SHEET_DOC_DLG     (HID_BASE + 1465)
#define HID_FORMAT_RESET            (HID_BASE + 1469)
#define HID_FRAME_TO_TOP            (HID_BASE + 1470)
#define HID_FRAME_TO_BOTTOM         (HID_BASE + 1471)
#define HID_FRAME_NOWRAP            (HID_BASE + 1472)
#define HID_FRAME_WRAP              (HID_BASE + 1473)
#define HID_FRAME_WRAPTHRU          (HID_BASE + 1474)
#define HID_FRAME_ALIGN_HORZ_LEFT   (HID_BASE + 1475)
#define HID_FRAME_ALIGN_HORZ_RIGHT  (HID_BASE + 1476)
#define HID_FRAME_ALIGN_HORZ_CENTER (HID_BASE + 1477)
#define HID_FRAME_ALIGN_VERT_TOP    (HID_BASE + 1478)
#define HID_FRAME_ALIGN_VERT_BOTTOM (HID_BASE + 1479)
#define HID_FRAME_ALIGN_VERT_CENTER (HID_BASE + 1480)
#define HID_SET_FRM_SIZE            (HID_BASE + 1481)
#define HID_SET_FRM_POSITION        (HID_BASE + 1482)
#define HID_SET_FRM_ANCHOR          (HID_BASE + 1483)
#define HID_SET_FRM_WRAP            (HID_BASE + 1484)
#define HID_SET_FRM_DIST            (HID_BASE + 1485)
#define HID_SET_FRM_OPTIONS         (HID_BASE + 1486)
#define HID_SET_GRF_MIRROR          (HID_BASE + 1488)
#define HID_SET_TABLE_WIDTH         (HID_BASE + 1489)
#define HID_SET_TABLE_ALIGN         (HID_BASE + 1490)
#define HID_SET_CHAR_STYLE          (HID_BASE + 1491)
#define HID_SET_PARA_STYLE          (HID_BASE + 1492)
#define HID_SET_PAGE_STYLE          (HID_BASE + 1493)
#define HID_SET_FRM_MACRO           (HID_BASE + 1494)
#define HID_SET_FRM_COLUMNS         (HID_BASE + 1495)
#define HID_SET_FRM_COLUMN_WIDTH    (HID_BASE + 1496)
#define HID_UPDATE_STYLES_DIRECT    (HID_BASE + 1497)

#define HID_TABLE_INSERT_ROW        (HID_BASE + 1501)
#define HID_TABLE_DELETE_ROW        (HID_BASE + 1503)
#define HID_TABLE_DELETE_COL        (HID_BASE + 1504)
#define HID_TABLE_MERGE_CELLS       (HID_BASE + 1506)
#define HID_AUTOFMT_TABLE           (HID_BASE + 1507)
#define HID_SWDLG_STRINPUT          (HID_BASE + 1508)
#define HID_TABLE_SET_ULSPACE       (HID_BASE + 1509)
#define HID_TABLE_SET_GRID          (HID_BASE + 1510)
#define HID_TABLE_SET_SHADOW        (HID_BASE + 1511)
#define HID_TABLE_SELECT_ROW        (HID_BASE + 1513)
#define HID_TABLE_SELECT_COL        (HID_BASE + 1514)
#define HID_TABLE_SELECT_ALL        (HID_BASE + 1515)
#define HID_TABLE_SET_READ_ONLY_CELLS   (HID_BASE + 1517)
#define HID_TABLE_UNSET_READ_ONLY_CELLS (HID_BASE + 1519)
#define HID_PAGE_STYLE_SET_COLS     (HID_BASE + 1538)
#define HID_SET_PROP_LINE_SPACE     (HID_BASE + 1540)
#define HID_SET_ABS_LINE_SPACE      (HID_BASE + 1541)

#define HID_SPELLING_DLG            (HID_BASE + 1601)
#define HID_THESAURUS_DLG           (HID_BASE + 1604)
#define HID_HYPHENATE_OPT_DLG       (HID_BASE + 1607)
#define HID_SORTING                 (HID_BASE + 1613)
#define HID_SORTING_DLG             (HID_BASE + 1614)
#define HID_CALCULATE               (HID_BASE + 1615)
#define HID_RECORD_MACRO_DLG        (HID_BASE + 1622)
#define HID_PLAY_MACRO_DLG          (HID_BASE + 1624)
#define HID_CONFIG_DLG              (HID_BASE + 1627)
#define HID_EXPAND_GLOSSARY         (HID_BASE + 1628)
#define HID_RENAME_GLOSSARY         (HID_BASE + 1629)
#define HID_CONFIG_MENU             (HID_BASE + 1630)
#define HID_CONFIG_KEY              (HID_BASE + 1631)
#define HID_ASSIGN_LOCAL_MACRO_DLG  (HID_BASE + 1632)
#define HID_COMPILE_MACRO           (HID_BASE + 1633)
#define HID_CONFIG_VIEWOPTIONS      (HID_BASE + 1635)
#define HID_CONFIG_COLORS           (HID_BASE + 1636)
#define HID_INSERT_GLOSSARY         (HID_BASE + 1640)
#define HID_AUTO_CORRECT            (HID_BASE + 1649)
#define HID_AUTO_CORRECT_DLG        (HID_BASE + 1650)
#define HID_HELP_PI                 (HID_BASE + 1655)
#define HID_NAVIGATION_PI           (HID_BASE + 1656)
#define HID_TEMPLATE_PI             (HID_BASE + 1657)
#define HID_ADDR_PI                 (HID_BASE + 1658)
#define HID_NAVIGATION_PI_GOTO_PAGE (HID_BASE + 1659)
#define HID_LETTER_WIZZARD          (HID_BASE + 1660)
#define HID_FAX_WIZZARD             (HID_BASE + 1661)
#define HID_MEMO_WIZZARD            (HID_BASE + 1662)
#define HID_AGENDA_WIZZARD          (HID_BASE + 1663)

#define HID_NEW_WINDOW              (HID_BASE + 1701)
#define HID_ARRANGE_ALL_WIN         (HID_BASE + 1702)
#define HID_ARRANGE_CASCADE_WIN     (HID_BASE + 1703)
#define HID_ARRANGE_HORZ_WIN        (HID_BASE + 1704)
#define HID_ARRANGE_VERT_WIN        (HID_BASE + 1705)

#define HID_SHOW_HELP_INDEX         (HID_BASE + 1802)
#define HID_SHOW_KEYBOARD_HELP      (HID_BASE + 1803)
#define HID_SHOW_HELP_MANUAL        (HID_BASE + 1804)
#define HID_SHOW_UPDATE_HELP        (HID_BASE + 1805)

#define HID_CHAR_LEFT               (HID_BASE + 1901)
#define HID_CHAR_RIGHT              (HID_BASE + 1902)
#define HID_LINE_UP                 (HID_BASE + 1903)
#define HID_LINE_DOWN               (HID_BASE + 1904)
#define HID_START_OF_LINE           (HID_BASE + 1905)
#define HID_END_OF_LINE             (HID_BASE + 1906)
#define HID_START_OF_DOCUMENT       (HID_BASE + 1907)
#define HID_END_OF_DOCUMENT         (HID_BASE + 1908)
#define HID_START_OF_NEXT_PAGE      (HID_BASE + 1909)
#define HID_END_OF_NEXT_PAGE        (HID_BASE + 1910)
#define HID_START_OF_PREV_PAGE      (HID_BASE + 1911)
#define HID_END_OF_PREV_PAGE        (HID_BASE + 1912)
#define HID_START_OF_PAGE           (HID_BASE + 1913)
#define HID_END_OF_PAGE             (HID_BASE + 1914)
#define HID_START_OF_COLUMN         (HID_BASE + 1917)
#define HID_END_OF_COLUMN           (HID_BASE + 1918)
#define HID_START_OF_PARA           (HID_BASE + 1919)
#define HID_END_OF_PARA             (HID_BASE + 1920)
#define HID_NEXT_WORD               (HID_BASE + 1921)
#define HID_PREV_WORD               (HID_BASE + 1922)
#define HID_NEXT_SENT               (HID_BASE + 1923)
#define HID_PREV_SENT               (HID_BASE + 1924)
#define HID_DELETE                  (HID_BASE + 1925)
#define HID_BACKSPACE               (HID_BASE + 1926)
#define HID_DELETE_SENT             (HID_BASE + 1927)
#define HID_DELETE_BACK_SENT        (HID_BASE + 1928)
#define HID_DELETE_WORD             (HID_BASE + 1929)
#define HID_DELETE_BACK_WORD        (HID_BASE + 1930)
#define HID_DELETE_LINE             (HID_BASE + 1931)
#define HID_DELETE_BACK_LINE        (HID_BASE + 1932)
#define HID_DELETE_PARA             (HID_BASE + 1933)
#define HID_DELETE_BACK_PARA        (HID_BASE + 1934)
#define HID_DELETE_WHOLE_LINE       (HID_BASE + 1935)
#define HID_SET_INS_MODE            (HID_BASE + 1936)
#define HID_PAGEUP                  (HID_BASE + 1937)
#define HID_PAGEDOWN                (HID_BASE + 1938)
#define HID_SET_ADD_MODE            (HID_BASE + 1939)
#define HID_SET_EXT_MODE            (HID_BASE + 1940)
#define HID_ESCAPE                  (HID_BASE + 1941)
#define HID_SELECT_WORD             (HID_BASE + 1943)
#define HID_START_TABLE             (HID_BASE + 1947)
#define HID_END_TABLE               (HID_BASE + 1948)
#define HID_NEXT_TABLE              (HID_BASE + 1949)
#define HID_PREV_TABLE              (HID_BASE + 1950)
#define HID_START_OF_NEXT_COLUMN    (HID_BASE + 1951)
#define HID_END_OF_NEXT_COLUMN      (HID_BASE + 1952)
#define HID_START_OF_PREV_COLUMN    (HID_BASE + 1953)
#define HID_END_OF_PREV_COLUMN      (HID_BASE + 1954)
#define HID_FOOTNOTE_TO_ANCHOR      (HID_BASE + 1955)
#define HID_NEXT_FOOTNOTE           (HID_BASE + 1956)
#define HID_PREV_FOOTNOTE           (HID_BASE + 1957)
#define HID_CNTNT_TO_NEXT_FRAME     (HID_BASE + 1958)
#define HID_FRAME_TO_ANCHOR         (HID_BASE + 1959)
#define HID_TO_HEADER               (HID_BASE + 1960)
#define HID_TO_FOOTER               (HID_BASE + 1961)
#define HID_IDX_MARK_TO_IDX         (HID_BASE + 1962)

#define HID_ENVELOP                 (HID_BASE + 2050)
#define HID_LABEL                   (HID_BASE + 2051)
#define HID_ENVELOP_PRINT           (HID_BASE + 2052)

#define HID_NAVIGATION_IMGBTN       (HID_BASE + 2054)
#define HID_ENVELOP_INSERT          (HID_BASE + 2055)

#define HID_WEBTOOLS_TOOLBOX        (HID_BASE + 2056)
#define HID_WEBTEXT_TOOLBOX         (HID_BASE + 2057)
#define HID_WEBFRAME_TOOLBOX        (HID_BASE + 2058)
#define HID_TEXT_TOOLBOX            (HID_BASE + 2059)
#define HID_TABLE_TOOLBOX           (HID_BASE + 2060)
#define HID_FRAME_TOOLBOX           (HID_BASE + 2061)
#define HID_GRAFIK_TOOLBOX          (HID_BASE + 2062)
#define HID_OLE_TOOLBOX             (HID_BASE + 2063)
#define HID_DRAW_TOOLBOX            (HID_BASE + 2064)
#define HID_BEZIER_TOOLBOX          (HID_BASE + 2066)
#define HID_DRAW_TEXT_TOOLBOX       (HID_BASE + 2067)
#define HID_NUM_TOOLBOX             (HID_BASE + 2068)
#define HID_TOOLS_TOOLBOX           (HID_BASE + 2069)
#define HID_SRCVIEW_TOOLBOX         (HID_BASE + 2070)

#define HID_LABEL_INSERT            (HID_BASE + 2071)
#define HID_CALC_TOOLBOX            (HID_BASE + 2072)
#define HID_PVIEW_TOOLBOX           (HID_BASE + 2073)

#define HID_FIELD_INSERT            (HID_BASE + 2074)
#define HID_FIELD_CLOSE             (HID_BASE + 2075)

#define HID_COND_COLL_TABLIST       (HID_BASE + 2076)

#define HID_DB_SELECTION_TLB        (HID_BASE + 2077)
#define HID_FIELD_DINF_TYPE         (HID_BASE + 2078)

#define HID_DRAWFORM_TOOLBOX        (HID_BASE + 2079)
#define HID_SELECT_TEMPLATE         (HID_BASE + 2080)

#define HID_AP_INSERT_DB_SEL        (HID_BASE + 2081)
#define HID_WEBGRAPHIC_TOOLBOX      (HID_BASE + 2082)
#define HID_OUTLINE_FORM            (HID_BASE + 2083)
#define HID_NUM_RESET               (HID_BASE + 2084)

#define HID_AUTOFORMAT_REJECT       (HID_BASE + 2085)
#define HID_AUTOFORMAT_ACCEPT       (HID_BASE + 2086)
#define HID_AUTOFORMAT_EDIT_CHG     (HID_BASE + 2087)

//insert index/entries/Pattern buttons and edits
#define HID_TOX_ENTRY_BUTTON        (HID_BASE + 2088)
#define HID_TOX_ENTRY_EDIT          (HID_BASE + 2089)

#define HID_DLG_NEW_USER_IDX        (HID_BASE + 2090)
#define HID_INSERT_IDX_MRK_OK       (HID_BASE + 2091)
#define HID_INSERT_IDX_MRK_CLOSE    (HID_BASE + 2092)
#define HID_INSERT_AUTH_MRK_OK      (HID_BASE + 2093)
#define HID_INSERT_AUTH_MRK_CLOSE   (HID_BASE + 2094)
#define HID_INSERT_IDX_MRK_DELETE       (HID_BASE + 2095)
#define HID_INSERT_IDX_MRK_NEW          (HID_BASE + 2096)
#define HID_INSERT_IDX_MRK_PREV         (HID_BASE + 2097)
#define HID_INSERT_IDX_MRK_PREV_SAME    (HID_BASE + 2098)
#define HID_INSERT_IDX_MRK_NEXT         (HID_BASE + 2099)
#define HID_INSERT_IDX_MRK_NEXT_SAME    (HID_BASE + 2100)
#define HID_INSERT_IDX_MRK_TYPE         (HID_BASE + 2101)
#define HID_INSERT_IDX_MRK_ENTRY        (HID_BASE + 2102)
#define HID_INSERT_IDX_MRK_PRIM_KEY     (HID_BASE + 2103)
#define HID_INSERT_IDX_MRK_SEC_KEY      (HID_BASE + 2104)
#define HID_INSERT_IDX_MRK_LEVEL        (HID_BASE + 2105)
#define HID_INSERT_IDX_MRK_MAIN_ENTRY   (HID_BASE + 2106)
#define HID_INSERT_IDX_MRK_APPLY_ALL    (HID_BASE + 2107)
#define HID_INSERT_AUTH_MRK_ENTRY           (HID_BASE + 2108)
#define HID_INSERT_AUTH_MRK_CREATE_ENTRY    (HID_BASE + 2109)
#define HID_INSERT_AUTH_MRK_EDIT_ENTRY      (HID_BASE + 2110)
#define HID_TOKEN_WINDOW                    (HID_BASE + 2111)

#define HID_AUTH_FIELD_IDENTIFIER        (HID_BASE + 2112  )
#define HID_AUTH_FIELD_AUTHORITY_TYPE    (HID_BASE + 2113  )
#define HID_AUTH_FIELD_ADDRESS           (HID_BASE + 2114  )
#define HID_AUTH_FIELD_ANNOTE            (HID_BASE + 2115  )
#define HID_AUTH_FIELD_AUTHOR            (HID_BASE + 2116  )
#define HID_AUTH_FIELD_BOOKTITLE         (HID_BASE + 2117  )
#define HID_AUTH_FIELD_CHAPTER           (HID_BASE + 2118  )
#define HID_AUTH_FIELD_EDITION           (HID_BASE + 2119  )
#define HID_AUTH_FIELD_EDITOR            (HID_BASE + 2120  )
#define HID_AUTH_FIELD_HOWPUBLISHED      (HID_BASE + 2121  )
#define HID_AUTH_FIELD_INSTITUTION       (HID_BASE + 2122  )
#define HID_AUTH_FIELD_JOURNAL           (HID_BASE + 2123  )
#define HID_AUTH_FIELD_MONTH             (HID_BASE + 2124  )
#define HID_AUTH_FIELD_NOTE              (HID_BASE + 2125  )
#define HID_AUTH_FIELD_NUMBER            (HID_BASE + 2126  )
#define HID_AUTH_FIELD_ORGANIZATIONS     (HID_BASE + 2127  )
#define HID_AUTH_FIELD_PAGES             (HID_BASE + 2128  )
#define HID_AUTH_FIELD_PUBLISHER         (HID_BASE + 2129  )
#define HID_AUTH_FIELD_SCHOOL            (HID_BASE + 2130  )
#define HID_AUTH_FIELD_SERIES            (HID_BASE + 2131  )
#define HID_AUTH_FIELD_TITLE             (HID_BASE + 2132  )
#define HID_AUTH_FIELD_REPORT_TYPE       (HID_BASE + 2133  )
#define HID_AUTH_FIELD_VOLUME            (HID_BASE + 2134  )
#define HID_AUTH_FIELD_YEAR              (HID_BASE + 2135  )
#define HID_AUTH_FIELD_URL               (HID_BASE + 2136  )
#define HID_AUTH_FIELD_CUSTOM1           (HID_BASE + 2137  )
#define HID_AUTH_FIELD_CUSTOM2           (HID_BASE + 2138  )
#define HID_AUTH_FIELD_CUSTOM3           (HID_BASE + 2139  )
#define HID_AUTH_FIELD_CUSTOM4           (HID_BASE + 2140  )
#define HID_AUTH_FIELD_CUSTOM5           (HID_BASE + 2141  )
#define HID_AUTH_FIELD_ISBN              (HID_BASE + 2142  )

#define HID_AUTH_MARK_DLG_FROM_COMP_RB   (HID_BASE + 2143  )
#define HID_AUTH_MARK_DLG_FROM_DOC_RB    (HID_BASE + 2144  )
#define HID_AUTH_MARK_DLG_ID_LISTBOX     (HID_BASE + 2145  )

#define HID_INSERT_INDEX_ENTRY_LEVEL_LB  (HID_BASE + 2146  )
#define HID_INSERT_IDX_MRK_SRCH_CASESENSITIVE   (HID_BASE + 2147 )
#define HID_INSERT_IDX_MRK_SRCH_WORDONLY        (HID_BASE + 2148 )
#define HID_DLG_CREATE_AUTOMARK                 (HID_BASE + 2149 )
#define HID_BUSINESS_CARD_CONTENT               (HID_BASE + 2150 )
diff --git a/sw/inc/hintids.hxx b/sw/inc/hintids.hxx
new file mode 100644
index 0000000..6d77b7a
--- /dev/null
+++ b/sw/inc/hintids.hxx
@@ -0,0 +1,475 @@
/*************************************************************************
 *
 *  $RCSfile: hintids.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _HINTIDS_HXX
#define _HINTIDS_HXX

#ifndef _SOLAR_H
#include <tools/solar.h>        // fuer __FAR_DATA
#endif
#ifndef _SAL_TYPES_H_
#include <sal/types.h>          // for sal_Unicode
#endif

// fuer SwTxtHints ohne Endindex wird folgendes Zeichen eingefuegt:
//JP 24.05.00: for the new UniCode Version:
#define CH_TXTATR_BREAKWORD     ((sal_Unicode)0x01)
#define CH_TXTATR_INWORD        ((sal_Unicode)0x02)


/*
 * Hier kommen erst mal die enums fuer die Hints
 */

#define HINT_BEGIN  1

#define POOLATTR_BEGIN      HINT_BEGIN
#define POOLATTR_END        RES_UNKNOWNATR_END

// Bereiche fuer die Id's der einzelnen Format-Attribute
// die Which-Werte fuer die Charakter-Format Attribute
enum RES_CHRATR
{
RES_CHRATR_BEGIN = HINT_BEGIN,
    RES_CHRATR_CASEMAP = RES_CHRATR_BEGIN,  //  1
    RES_CHRATR_CHARSETCOLOR,                //  2
    RES_CHRATR_COLOR,                       //  3
    RES_CHRATR_CONTOUR,                     //  4
    RES_CHRATR_CROSSEDOUT,                  //  5
    RES_CHRATR_ESCAPEMENT,                  //  6
    RES_CHRATR_FONT,                        //  7
    RES_CHRATR_FONTSIZE,                    //  8
    RES_CHRATR_KERNING,                     //  9
    RES_CHRATR_LANGUAGE,                    // 10
    RES_CHRATR_POSTURE,                     // 11
    RES_CHRATR_PROPORTIONALFONTSIZE,        // 12
    RES_CHRATR_SHADOWED,                    // 13
    RES_CHRATR_UNDERLINE,                   // 14
    RES_CHRATR_WEIGHT,                      // 15
    RES_CHRATR_WORDLINEMODE,                // 16
    RES_CHRATR_AUTOKERN,                    // 17
    RES_CHRATR_BLINK,                       // 18
    RES_CHRATR_NOHYPHEN,                    // 19
    RES_CHRATR_NOLINEBREAK,                 // 20
    RES_CHRATR_BACKGROUND,                  // 21
    RES_CHRATR_CJK_FONT,                    // 22
    RES_CHRATR_CJK_FONTSIZE,                // 23
    RES_CHRATR_CJK_LANGUAGE,                // 24
    RES_CHRATR_CJK_POSTURE,                 // 25
    RES_CHRATR_CJK_WEIGHT,                  // 26
    RES_CHRATR_CTL_FONT,                    // 27
    RES_CHRATR_CTL_FONTSIZE,                // 28
    RES_CHRATR_CTL_LANGUAGE,                // 29
    RES_CHRATR_CTL_POSTURE,                 // 30
    RES_CHRATR_CTL_WEIGHT,                  // 31
    RES_CHRATR_WRITING_DIRECTION,           // 32
    RES_CHRATR_DUMMY2,                      // 33
    RES_CHRATR_DUMMY3,                      // 34
    RES_CHRATR_DUMMY4,                      // 35
    RES_CHRATR_DUMMY5,                      // 36
    RES_CHRATR_DUMMY1,                      // 37
RES_CHRATR_END
};

// diese Attribute stehen nur im SwpAttr-Array vom TextNode
enum RES_TXTATR
{
RES_TXTATR_BEGIN = RES_CHRATR_END,

// alle TextAttribute mit einem Ende
// JP 12.07.96: die Ids RES_TXTATR_NOLINEBREAK und RES_TXTATR_NOHYPHEN
//              wanderten in den Bereich der CharAttr. Die Ids selbst muessen
//              aber als Dummies noch erhalten bleiben. Der SwG-/Sw3 Reader
//              merkt sich die Ids immer als Offset zum Start der Gruppe!!!
// Aus dem RES_TXTATR_NOLINEBREAK ist jetzt RES_TXTATR_INETFMT geworden.
RES_TXTATR_WITHEND_BEGIN = RES_TXTATR_BEGIN ,
    RES_TXTATR_INETFMT = RES_TXTATR_WITHEND_BEGIN,  // 38
    RES_TXTATR_DUMMY4,                              // 39
    RES_TXTATR_REFMARK,                             // 40
    RES_TXTATR_TOXMARK,                             // 41
    RES_TXTATR_CHARFMT,                             // 42
    RES_TXTATR_TWO_LINES,                           // 43
    RES_TXTATR_CJK_RUBY,                            // 44
    RES_TXTATR_UNKNOWN_CONTAINER,                   // 45
    RES_TXTATR_DUMMY5,                              // 46
    RES_TXTATR_DUMMY6,                              // 47
RES_TXTATR_WITHEND_END,

// alle TextAttribute ohne ein Ende
RES_TXTATR_NOEND_BEGIN = RES_TXTATR_WITHEND_END,
    RES_TXTATR_FIELD = RES_TXTATR_NOEND_BEGIN,      // 48
    RES_TXTATR_FLYCNT,                              // 49
    RES_TXTATR_FTN,                                 // 50
    RES_TXTATR_SOFTHYPH,                            // 51
    RES_TXTATR_HARDBLANK,                           // 52
    RES_TXTATR_DUMMY1,                              // 53
    RES_TXTATR_DUMMY2,                              // 54
RES_TXTATR_NOEND_END,
RES_TXTATR_END = RES_TXTATR_NOEND_END
};

enum RES_PARATR
{
RES_PARATR_BEGIN = RES_TXTATR_END,
    RES_PARATR_LINESPACING = RES_PARATR_BEGIN,      // 55
    RES_PARATR_ADJUST,                              // 56
    RES_PARATR_SPLIT,                               // 57
    RES_PARATR_ORPHANS,                             // 58
    RES_PARATR_WIDOWS,                              // 59
    RES_PARATR_TABSTOP,                             // 60
    RES_PARATR_HYPHENZONE,                          // 61
    RES_PARATR_DROP,                                // 62
    RES_PARATR_REGISTER,                            // 63
    RES_PARATR_NUMRULE,                             // 64
    RES_PARATR_DUMMY2,                              // 65
RES_PARATR_END
};


enum RES_FRMATR
{
RES_FRMATR_BEGIN = RES_PARATR_END,
    RES_FILL_ORDER = RES_FRMATR_BEGIN,              // 66
    RES_FRM_SIZE,                                   // 67
    RES_PAPER_BIN,                                  // 68
    RES_LR_SPACE,                                   // 69
    RES_UL_SPACE,                                   // 70
    RES_PAGEDESC,                                   // 71
    RES_BREAK,                                      // 72
    RES_CNTNT,                                      // 73
    RES_HEADER,                                     // 74
    RES_FOOTER,                                     // 75
    RES_PRINT,                                      // 76
    RES_OPAQUE,                                     // 77
    RES_PROTECT,                                    // 78
    RES_SURROUND,                                   // 79
    RES_VERT_ORIENT,                                // 80
    RES_HORI_ORIENT,                                // 81
    RES_ANCHOR,                                     // 82
    RES_BACKGROUND,                                 // 83
    RES_BOX,                                        // 84
    RES_SHADOW,                                     // 85
    RES_FRMMACRO,                                   // 86
    RES_COL,                                        // 87
    RES_KEEP,                                       // 88
    RES_URL,                                        // 89
    RES_EDIT_IN_READONLY,                           // 90
    RES_LAYOUT_SPLIT,                               // 91
    RES_CHAIN,                                      // 92
    RES_FRMATR_DUMMY2,                              // 93
    RES_LINENUMBER  ,                               // 94
    RES_FTN_AT_TXTEND,                              // 95
    RES_END_AT_TXTEND,                              // 96
    RES_COLUMNBALANCE,                              // 97
    RES_FRMATR_DUMMY7,                              // 98
    RES_FRMATR_DUMMY8,                              // 99
    RES_FRMATR_DUMMY9,                              // 100
RES_FRMATR_END
};

enum RES_GRFATR
{
RES_GRFATR_BEGIN = RES_FRMATR_END,
    RES_GRFATR_MIRRORGRF = RES_GRFATR_BEGIN,        // 101
    RES_GRFATR_CROPGRF,                             // 102

    RES_GRFATR_ROTATION,                            // 103
    RES_GRFATR_LUMINANCE,                           // 104
    RES_GRFATR_CONTRAST,                            // 105
    RES_GRFATR_CHANNELR,                            // 106
    RES_GRFATR_CHANNELG,                            // 107
    RES_GRFATR_CHANNELB,                            // 108
    RES_GRFATR_GAMMA,                               // 109
    RES_GRFATR_INVERT,                              // 110
    RES_GRFATR_TRANSPARENCY,                        // 111
    RES_GRFATR_DRAWMODE,                            // 112

    RES_GRFATR_DUMMY1,                              // 113
    RES_GRFATR_DUMMY2,                              // 114
    RES_GRFATR_DUMMY3,                              // 115
    RES_GRFATR_DUMMY4,                              // 116
    RES_GRFATR_DUMMY5,                              // 117
RES_GRFATR_END
};

enum RES_BOXATR
{
RES_BOXATR_BEGIN = RES_GRFATR_END,
    RES_BOXATR_FORMAT = RES_BOXATR_BEGIN,           // 118
    RES_BOXATR_FORMULA,                             // 119
    RES_BOXATR_VALUE,                               // 120
RES_BOXATR_END
};

enum RES_UNKNOWNATR
{
RES_UNKNOWNATR_BEGIN = RES_BOXATR_END,
    RES_UNKNOWNATR_CONTAINER = RES_UNKNOWNATR_BEGIN,        // 121
RES_UNKNOWNATR_END
};



// ID-s fuer die Formate
enum RES_FMT
{
RES_FMT_BEGIN = RES_UNKNOWNATR_END,
    RES_CHRFMT = RES_FMT_BEGIN,
    RES_FRMFMT,
    RES_FLYFRMFMT,
    RES_TXTFMTCOLL,
    RES_GRFFMTCOLL,
    RES_DRAWFRMFMT,
    RES_CONDTXTFMTCOLL,
RES_FMT_END
};

// die ID's fuer Messages in den Formaten
enum RES_MSG
{
RES_MSG_BEGIN = RES_FMT_END,
    RES_OBJECTDYING = RES_MSG_BEGIN,
    RES_FMT_CHG,
    RES_ATTRSET_CHG,
    RES_FRM_SIZECHG,
    RES_TXTATR_FLDCHG,
    RES_TXTATR_EMPTYCHG,
    RES_INS_CHR,
    RES_INS_TXT,
    RES_DEL_CHR,
    RES_DEL_TXT,
    RES_UPDATE_ATTR,
    RES_PAGEDESC_FTNINFO,
    RES_REFMARKFLD_UPDATE,
    RES_DOCPOS_UPDATE,
    RES_TABLEFML_UPDATE,
    RES_UPDATEDDETBL,
    RES_TBLHEADLINECHG,
    RES_AUTOFMT_DOCNODE,
    RES_REPAINT,
    RES_DOC_DTOR,
    RES_SECTION_HIDDEN,
    RES_SECTION_NOT_HIDDEN,
    RES_GRAPHIC_ARRIVED,
    RES_GRAPHIC_PIECE_ARRIVED,
    RES_HIDDENPARA_PRINT,
    RES_CONDCOLL_CONDCHG,
    RES_VIRTPAGENUM_INFO,
    RES_GETNUMNODES,
    RES_GETLOWERNUMLEVEL,
    RES_RESET_FMTWRITTEN,
    RES_REMOVE_UNO_OBJECT,
    RES_GRF_REREAD_AND_INCACHE,
    RES_SECTION_RESETHIDDENFLAG,
    RES_FINDNEARESTNODE,
    RES_CONTENT_VISIBLE,
    RES_FOOTNOTE_DELETED,
    RES_REFMARK_DELETED,
    RES_MSG_DUMMY7,
    RES_MSG_DUMMY8,
    RES_MSG_DUMMY9,
RES_MSG_END
};


// eine ID fuer den RTF-Reader. Die Stylesheets werden wie
// Attribute behandelt, d.H. es gibt ein StyleSheet Attribut. Um
// nicht mit anderen Which()-Werten zu kollidieren, ist der Wert
// hier mit aufgefuehrt. (Auch das Hilfesystem definiert neue
// Attribute !!)
enum RES_FLTRATTR
{
RES_FLTRATTR_BEGIN = RES_MSG_END,
    RES_FLTR_STYLESHEET = RES_FLTRATTR_BEGIN,
    RES_FLTR_BOOKMARK,
    RES_FLTR_ANCHOR,
    RES_FLTR_BORDER,
    RES_FLTR_NUMRULE,
    RES_FLTR_NUMRULE_NUM,
    RES_FLTR_SDR_ANCHOR,
    RES_FLTR_TOX,
    RES_FLTR_SECTION,
    RES_FLTR_REDLINE,
RES_FLTRATTR_END
};

#define RES_TBX_DUMMY RES_FLTRATTR_END + 1

#define HINT_END RES_TBX_DUMMY

// Fehler-Erkennung !!
#define INVALID_HINT HINT_END
#define RES_WHICHHINT_END HINT_END


/*
 * hole aus der statischen Default-Attribut Tabelle ueber den Which-Wert
 * das entsprechende default Attribut.
 * Ist keines vorhanden, returnt ein 0-Pointer !!!
 *
 * Diese Funktion ist im Init.CXX implementiert. Damit die Formate darauf
 * zugreifen koennen, ist sie hier als extern deklariert.
 * Im PRODUCT ist das Teil inline.
 */
class SfxPoolItem;
struct SfxItemInfo;
typedef SfxPoolItem* SwDfltAttrTab[ POOLATTR_END - POOLATTR_BEGIN  ];

extern SwDfltAttrTab __FAR_DATA aAttrTab;
extern SfxItemInfo   __FAR_DATA aSlotTab[];


#ifndef PRODUCT
const SfxPoolItem* GetDfltAttr( USHORT nWhich );
#else
inline const SfxPoolItem* GetDfltAttr( USHORT nWhich )
{
    return aAttrTab[ nWhich - POOLATTR_BEGIN ];
}
#endif

// return for the given TextAttribut without an end the correct character.
// This function returns
//      CH_TXTATR_BREAKWORD for Textattribut which breaks a word (default)
//      CH_TXTATR_INWORD    for Textattribut which dont breaks a word
class SwTxtAttr;
sal_Unicode GetCharOfTxtAttr( const SwTxtAttr& rAttr );

// alle Sets stehen im init.cxx

// AttrSet-Range fuer die 3 Break-Attribute
extern USHORT __FAR_DATA aBreakSetRange[];
// AttrSet-Range fuer die TxtFmtColl
extern USHORT __FAR_DATA aTxtFmtCollSetRange[];
// AttrSet-Range fuer die GrfFmtColl
extern USHORT __FAR_DATA aGrfFmtCollSetRange[];
// AttrSet-Range fuer die TextNode
extern USHORT __FAR_DATA aTxtNodeSetRange[];
// AttrSet-Range fuer die NoTxtNode
extern USHORT __FAR_DATA aNoTxtNodeSetRange[];
// AttrSet-Range fuer die SwTable
extern USHORT __FAR_DATA aTableSetRange[];
// AttrSet-Range fuer die SwTableLine
extern USHORT __FAR_DATA aTableLineSetRange[];
// AttrSet-Range fuer die SwTableBox
extern USHORT __FAR_DATA aTableBoxSetRange[];
// AttrSet-Range fuer die SwFrmFmt
extern USHORT __FAR_DATA aFrmFmtSetRange[];
// AttrSet-Range fuer die SwCharFmt
extern USHORT __FAR_DATA aCharFmtSetRange[];
// AttrSet-Range fuer die SwPageDescFmt
extern USHORT __FAR_DATA aPgFrmFmtSetRange[];

// check if ID is InRange of AttrSet-Ids
BOOL IsInRange( const USHORT* pRange, const USHORT nId );



#define ITEMID_FONT         RES_CHRATR_FONT
#define ITEMID_POSTURE      RES_CHRATR_POSTURE
#define ITEMID_WEIGHT       RES_CHRATR_WEIGHT
#define ITEMID_SHADOWED     RES_CHRATR_SHADOWED
#define ITEMID_AUTOKERN     RES_CHRATR_AUTOKERN
#define ITEMID_CONTOUR      RES_CHRATR_CONTOUR
#define ITEMID_CROSSEDOUT   RES_CHRATR_CROSSEDOUT
#define ITEMID_UNDERLINE    RES_CHRATR_UNDERLINE
#define ITEMID_FONTHEIGHT   RES_CHRATR_FONTSIZE
#define ITEMID_PROPSIZE     RES_CHRATR_PROPORTIONALFONTSIZE
#define ITEMID_COLOR        RES_CHRATR_COLOR
#define ITEMID_CHARSETCOLOR RES_CHRATR_CHARSETCOLOR
#define ITEMID_KERNING      RES_CHRATR_KERNING
#define ITEMID_CASEMAP      RES_CHRATR_CASEMAP
#define ITEMID_LANGUAGE     RES_CHRATR_LANGUAGE
#define ITEMID_ESCAPEMENT   RES_CHRATR_ESCAPEMENT
#define ITEMID_BLINK        RES_CHRATR_BLINK
#define ITEMID_NOHYPHENHERE RES_CHRATR_NOHYPHEN
#define ITEMID_NOLINEBREAK  RES_CHRATR_NOLINEBREAK
#define ITEMID_WORDLINEMODE RES_CHRATR_WORDLINEMODE

//Defines fuer die ehemaligen FrmAttribute, die jetzt in frmitems.hxx
//von svx zu finden sind.
#define ITEMID_PAPERBIN     RES_PAPER_BIN
#define ITEMID_LRSPACE      RES_LR_SPACE
#define ITEMID_ULSPACE      RES_UL_SPACE
#define ITEMID_PRINT        RES_PRINT
#define ITEMID_OPAQUE       RES_OPAQUE
#define ITEMID_PROTECT      RES_PROTECT
#define ITEMID_BRUSH        RES_BACKGROUND
#define ITEMID_BOX          RES_BOX
#define ITEMID_SHADOW       RES_SHADOW
#define ITEMID_MACRO        RES_FRMMACRO
#define ITEMID_FMTKEEP      RES_KEEP
#define ITEMID_FMTBREAK     RES_BREAK

//Defines fuer die ehemaligen ParAttribute, die jetzt in paraitem.hxx
//bzw. tabsitem.hxx von svx zu finden sind.

#define ITEMID_LINESPACING  RES_PARATR_LINESPACING
#define ITEMID_ADJUST       RES_PARATR_ADJUST
#define ITEMID_FMTSPLIT     RES_PARATR_SPLIT
#define ITEMID_WIDOWS       RES_PARATR_WIDOWS
#define ITEMID_ORPHANS      RES_PARATR_ORPHANS
#define ITEMID_TABSTOP      RES_PARATR_TABSTOP
#define ITEMID_HYPHENZONE   RES_PARATR_HYPHENZONE

//Defines fuer die ehemaligen GrfAttribute, die jetzt im svx zu finden sind.
#define ITEMID_GRF_CROP     RES_GRFATR_CROPGRF

#endif
diff --git a/sw/inc/hints.hxx b/sw/inc/hints.hxx
new file mode 100644
index 0000000..458017f
--- /dev/null
+++ b/sw/inc/hints.hxx
@@ -0,0 +1,328 @@
/*************************************************************************
 *
 *  $RCSfile: hints.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _HINTS_HXX
#define _HINTS_HXX

#ifndef _TABLE_HXX //autogen
#include <tools/table.hxx>
#endif
#ifndef _SWATRSET_HXX
#include <swatrset.hxx>
#endif

class SwFmt;
class OutputDevice;
class SwTable;
class SwNode;
class SwNodes;
class SwCntntNode;
class SwPageFrm;
class SwFrm;
class SwTxtNode;
class SwHistory;

// Basis-Klasse fuer alle Message-Hints:
//  "Overhead" vom SfxPoolItem wird hier behandelt
class SwMsgPoolItem : public SfxPoolItem
{
public:
    SwMsgPoolItem( USHORT nWhich );

    // "Overhead" vom SfxPoolItem
    virtual int             operator==( const SfxPoolItem& ) const;
    virtual SfxPoolItem*    Clone( SfxItemPool* pPool = 0 ) const;
};


// ---------------------------------------
// SwPtrMsgPoolItem (altes SwObjectDying!)
// ---------------------------------------

class SwPtrMsgPoolItem : public SwMsgPoolItem
{
public:
    void * pObject;

    SwPtrMsgPoolItem( USHORT nId, void * pObj )
        : SwMsgPoolItem( nId ), pObject( pObj )
    {}
};



/*
 * SwFmtChg wird verschickt, wenn ein Format gegen ein anderes
 * Format ausgewechselt worden ist. Es werden immer 2. Hints verschickt,
 * das alte und neue Format.
 */
class SwFmtChg: public SwMsgPoolItem
{
public:
    SwFmt *pChangedFmt;
    SwFmtChg( SwFmt *pFmt );
};


class SwInsChr: public SwMsgPoolItem
{
public:
    xub_StrLen nPos;

    SwInsChr( USHORT nP );
};

class SwInsTxt: public SwMsgPoolItem
{
public:
    xub_StrLen nPos;
    xub_StrLen nLen;

    SwInsTxt( xub_StrLen nP, xub_StrLen nL );
};

class SwDelChr: public SwMsgPoolItem
{
public:
    xub_StrLen nPos;

    SwDelChr( xub_StrLen nP );
};

class SwDelTxt: public SwMsgPoolItem
{
public:
    xub_StrLen nStart;
    xub_StrLen nLen;

    SwDelTxt( xub_StrLen nS, xub_StrLen nL );
};

class SwUpdateAttr: public SwMsgPoolItem
{
public:
    xub_StrLen nStart;
    xub_StrLen nEnd;
    USHORT nWhichAttr;
    SwUpdateAttr( xub_StrLen nS, xub_StrLen nE, USHORT nW );
};


// SwRefMarkFldUpdate wird verschickt, wenn sich die ReferenzMarkierungen
// Updaten sollen. Um Seiten-/KapitelNummer feststellen zu koennen, muss
// der akt. Frame befragt werden. Dafuer wird das akt. OutputDevice benoetigt.
class SwRefMarkFldUpdate : public SwMsgPoolItem
{
public:
    const OutputDevice* pOut;       // Pointer auf das aktuelle Output-Device
    SwRefMarkFldUpdate( const OutputDevice* );
};

// SwDocPosUpdate wird verschickt, um zu signalisieren, dass nur die
// Frames ab oder bis zu einer bestimmten dokument-globalen Position
// geupdated werden brauchen. Zur Zeit wird dies nur beim Updaten
// von Seitennummernfeldern benoetigt.

class SwDocPosUpdate : public SwMsgPoolItem
{
public:
    const long nDocPos;
    SwDocPosUpdate( const long nDocPos );
};

// SwTableFmlUpdate wird verschickt, wenn sich die Tabelle neu berechnen soll
// JP 16.02.99: oder wenn die Tabelle selbst gemergt oder gesplittet wird
enum TableFmlUpdtFlags { TBL_CALC = 0,
                         TBL_BOXNAME,
                         TBL_BOXPTR,
                         TBL_RELBOXNAME,
                         TBL_MERGETBL,
                         TBL_SPLITTBL
                       };
class SwTableFmlUpdate : public SwMsgPoolItem
{
public:
    const SwTable* pTbl;        // Pointer auf die zu aktuelle Tabelle
    union {
        const SwTable* pDelTbl;     // Merge: Ptr auf die zu loeschende Tabelle
        const String* pNewTblNm;    // Split: der Name der neuen Tabelle
    } DATA;
    SwHistory* pHistory;
    USHORT nSplitLine;          // Split: ab dieser BaseLine wird gespl.
    TableFmlUpdtFlags eFlags;
    BOOL bModified : 1;
    BOOL bBehindSplitLine : 1;

    SwTableFmlUpdate( const SwTable* );
};


class SwAutoFmtGetDocNode: public SwMsgPoolItem
{
public:
    const SwCntntNode* pCntntNode;
    const SwNodes* pNodes;

    SwAutoFmtGetDocNode( const SwNodes* pNds );
};

/*
 * SwAttrSetChg wird verschicht, wenn sich in dem SwAttrSet rTheChgdSet
 * etwas veraendert hat. Es werden immer 2. Hints
 * verschickt, die alten und neuen Items in dem rTheChgdSet.
 */
class SwAttrSetChg: public SwMsgPoolItem
{
    BOOL bDelSet;
    SwAttrSet* pChgSet;             // was sich veraendert hat
    const SwAttrSet* pTheChgdSet;   // wird nur zum Vergleichen gebraucht !!
public:
    SwAttrSetChg( const SwAttrSet& rTheSet, SwAttrSet& rSet );
    SwAttrSetChg( const SwAttrSetChg& );
    ~SwAttrSetChg();

    // was sich veraendert hat
    const SwAttrSet* GetChgSet() const  { return pChgSet; }
          SwAttrSet* GetChgSet()        { return pChgSet; }

    // wo es sich geaendert hat
    const SwAttrSet* GetTheChgdSet() const  { return pTheChgdSet; }

    SfxItemState GetItemState( USHORT nWhich, BOOL bSrchInParent = TRUE,
                               const SfxPoolItem **ppItem = 0 ) const
    {   return pChgSet->GetItemState( nWhich, bSrchInParent, ppItem ); }

    USHORT Count() const { return pChgSet->Count(); }
    void ClearItem( USHORT nWhich = 0 )
#ifdef PRODUCT
    { pChgSet->ClearItem( nWhich ); }
#else
        ;
#endif
};

class SwCondCollCondChg: public SwMsgPoolItem
{
public:
    SwFmt *pChangedFmt;
    SwCondCollCondChg( SwFmt *pFmt );
};

class SwVirtPageNumInfo: public SwMsgPoolItem
{
    const SwPageFrm *pPage;
    const SwPageFrm *pOrigPage;
    const SwFrm     *pFrm;      //An einem Absatz/Tabelle koennen mehrere
                                //Attribute sitzen. Der Frame muss dann
                                //muss dann letztlich bei bestimmen
                                //welches Attribut gilt und um welche physikalische
                                //Seite es sich handelt.
public:
    SwVirtPageNumInfo( const SwPageFrm *pPg );

    const SwPageFrm *GetPage()          { return pPage;    }
    const SwPageFrm *GetOrigPage()      { return pOrigPage;}
    const SwFrm *GetFrm()               { return pFrm; }
    void  SetInfo( const SwPageFrm *pPg,
                   const SwFrm *pF  )   { pFrm = pF, pPage = pPg; }
};


DECLARE_TABLE( SwTxtNodeTable, SwTxtNode* )

class SwNumRuleInfo : public SwMsgPoolItem
{
    SwTxtNodeTable aList;
    const String& rName;
public:
    SwNumRuleInfo( const String& rRuleName );

    const String& GetName() const { return rName; }
    void AddNode( SwTxtNode& rNd );

    // erzeuge die Liste aller Nodes der NumRule in dem angegebenem Doc
    // Der Code steht im docnum.cxx
    void MakeList( SwDoc& rDoc );
    SwTxtNodeTable& GetList() const { return (SwTxtNodeTable&)aList; }
};

class SwNRuleLowerLevel : public SwMsgPoolItem
{
    const String& rName;
    BYTE nLvl;
public:
    SwNRuleLowerLevel( const String& rRuleName, BYTE nLevel );

    const String& GetName() const { return rName; }
    BYTE GetLevel() const { return nLvl; }
};

class SwFindNearestNode : public SwMsgPoolItem
{
    const SwNode *pNd, *pFnd;
public:
    SwFindNearestNode( const SwNode& rNd );
    void CheckNode( const SwNode& rNd );

    const SwNode* GetFoundNode() const      { return pFnd; }
};


#endif
diff --git a/sw/inc/htmltbl.hxx b/sw/inc/htmltbl.hxx
new file mode 100644
index 0000000..656e11c
--- /dev/null
+++ b/sw/inc/htmltbl.hxx
@@ -0,0 +1,530 @@
/*************************************************************************
 *
 *  $RCSfile: htmltbl.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _HTMLTBL_HXX
#define _HTMLTBL_HXX


#ifndef _TIMER_HXX //autogen
#include <vcl/timer.hxx>
#endif

#ifndef _SVX_SVXENUM_HXX //autogen
#include <svx/svxenum.hxx>
#endif

#include "swtypes.hxx"
#include "node.hxx"     // Fuer SwStartNode


class SwTableBox;
class SwTable;
class SwHTMLTableLayout;
class SwDoc;
class SwFrmFmt;

#define HTMLTABLE_RESIZE_NOW (ULONG_MAX)

class SwHTMLTableLayoutCnts
{
    SwHTMLTableLayoutCnts *pNext;   // der naechste Inhalt

    // von den beiden naechsten Pointern darf nur einer gesetzt sein!
    SwTableBox *pBox;           // ein Box
    SwHTMLTableLayout *pTable;  // eine "Tabelle in der Tabelle"

    // Beim ersten Durchlauf gibt es noch keine Boxen. Es wird dann
    // pStartNode anstelle von pBox verwendet.
    const SwStartNode *pStartNode;

    // Die folgenden Zahler geben an, wie oft ein Pass bereits fuer diesen
    // Inhalt durchgefuehrt wurde. Dazu werden sie mit einer Soll-Vorgabe
    // verglichen. Wird 255 erreicht laufen sie bei 0 weiter. So wird
    // eine Reinitialisierung bei jedem Resize vermieden.
    BYTE nPass1Done;            // Wieoft wurde Pass 1 aufgerufen?
    BYTE nWidthSet;             // Wieoft wurde die Breite gesetzt?

    BOOL bNoBreakTag;       // <NOBR>-Tag ueber gesamten Inhalt

public:

    SwHTMLTableLayoutCnts( const SwStartNode* pSttNd, SwHTMLTableLayout* pTab,
                           BOOL bNoBreakTag, SwHTMLTableLayoutCnts* pNxt );

    ~SwHTMLTableLayoutCnts();

    void SetTableBox( SwTableBox *pBx ) { pBox = pBx; }
    SwTableBox *GetTableBox() const { return pBox; }

    SwHTMLTableLayout *GetTable() const { return pTable; }

    const SwStartNode *GetStartNode() const;

    // Ermitteln des naechsten Knotens
    SwHTMLTableLayoutCnts *GetNext() const { return pNext; }

    void SetWidthSet( BYTE nRef ) { nWidthSet = nRef; }
    BOOL IsWidthSet( BYTE nRef ) const { return nRef==nWidthSet; }

    void SetPass1Done( BYTE nRef ) { nPass1Done = nRef; }
    BOOL IsPass1Done( BYTE nRef ) const { return nRef==nPass1Done; }

    BOOL HasNoBreakTag() const { return bNoBreakTag; }
};

/*  */

class SwHTMLTableLayoutCell
{
    SwHTMLTableLayoutCnts *pContents;       // der Inhalt der Zelle

    USHORT nRowSpan;    // ROWSPAN der Zelle
    USHORT nColSpan;    // COLSPAN der Zelle
    USHORT nWidthOption;// angegebene Breite der Zelle in Twip oder %

    BOOL bPrcWidthOption : 1;// nWidth ist %-Angabe
    BOOL bNoWrapOption : 1; // NOWRAP-Option

public:

    SwHTMLTableLayoutCell( SwHTMLTableLayoutCnts *pCnts,
                         USHORT nRSpan, USHORT nCSpan,
                         USHORT nWidthOpt, BOOL bPrcWdthOpt,
                         BOOL nNWrapOpt );

    ~SwHTMLTableLayoutCell();

    // Setzen/Ermitteln des Inhalts einer Zelle
    void SetContents( SwHTMLTableLayoutCnts *pCnts ) { pContents = pCnts; }
    SwHTMLTableLayoutCnts *GetContents() const { return pContents; }

    inline void SetProtected();

    // ROWSPAN/COLSPAN der Zelle Setzen/Ermitteln
    void SetRowSpan( USHORT nRSpan ) { nRowSpan = nRSpan; }
    USHORT GetRowSpan() const { return nRowSpan; }
    USHORT GetColSpan() const { return nColSpan; }

    USHORT GetWidthOption() const { return nWidthOption; }
    BOOL IsPrcWidthOption() const { return bPrcWidthOption; }

    BOOL HasNoWrapOption() const { return bNoWrapOption; }
};

/*  */

class SwHTMLTableLayoutColumn
{
    // Zwischenwerte von AutoLayoutPass1
    ULONG nMinNoAlign, nMaxNoAlign, nAbsMinNoAlign;

    // Ergebnisse von AutoLayoutPass1
    ULONG nMin, nMax;

    // Ergibnisse von Pass 2
    USHORT nAbsColWidth;                // in Twips
    USHORT nRelColWidth;                // in Twips bzw. relativ zu USHRT_MAX

    USHORT nWidthOption;                // Optionen von <COL> oder <TD>/<TH>

    BOOL bRelWidthOption : 1;
    BOOL bLeftBorder : 1;

public:

    SwHTMLTableLayoutColumn( USHORT nColWidthOpt, BOOL bRelColWidthOpt,
                             BOOL bLBorder );

    ~SwHTMLTableLayoutColumn() {}

    inline void MergeCellWidthOption( USHORT nWidth, BOOL bPrc );
    inline void SetWidthOption( USHORT nWidth, BOOL bRelWidth, BOOL bTest );

    USHORT GetWidthOption() const { return nWidthOption; }
    BOOL IsRelWidthOption() const { return bRelWidthOption; }

    inline void MergeMinMaxNoAlign( ULONG nMin, ULONG nMax, ULONG nAbsMin );
    ULONG GetMinNoAlign() const { return nMinNoAlign; }
    ULONG GetMaxNoAlign() const { return nMaxNoAlign; }
    ULONG GetAbsMinNoAlign() const { return nAbsMinNoAlign; }
    inline void ClearPass1Info( BOOL bWidthOpt );

    inline void SetMinMax( ULONG nMin, ULONG nMax );
    void SetMax( ULONG nVal ) { nMax = nVal; }
    void AddToMin( ULONG nVal ) { nMin += nVal; }
    void AddToMax( ULONG nVal ) { nMax += nVal; }
    ULONG GetMin() const { return nMin; }
    ULONG GetMax() const { return nMax; }

    void SetAbsColWidth( USHORT nWidth ) { nAbsColWidth = nWidth; }
    USHORT GetAbsColWidth() const { return nAbsColWidth; }

    void SetRelColWidth( USHORT nWidth ) { nRelColWidth = nWidth; }
    USHORT GetRelColWidth() const { return nRelColWidth; }

    BOOL HasLeftBorder() const { return bLeftBorder; }
};

/*  */

class SwHTMLTableLayout
{
    Timer aResizeTimer;             // Timer fuer DelayedResize

    SwHTMLTableLayoutColumn **aColumns;
    SwHTMLTableLayoutCell **aCells;

    const SwTable *pSwTable;        // die SwTable (nur Top-Table)
    SwTableBox *pLeftFillerBox;     // linke Filler-Zelle (nur Tab in Tab)
    SwTableBox *pRightFillerBox;    // rechte Filler-Zelle (nur Tab-in Tab)

    ULONG nMin;                     // minimale Breite der Tabelle (Twips)
    ULONG nMax;                     // maximale Breite der Tabelle (Twips)

    USHORT nRows;                   // Anzahl Zeilen
    USHORT nCols;                   // Anzahl Spalten

    USHORT nLeftMargin;             // Abstand zum linken Rand (aus Absatz)
    USHORT nRightMargin;            // Abstand zum rechten Rand (aus Absatz)

    USHORT nInhAbsLeftSpace;        // von umgebender Zelle geerbter Abstand,
    USHORT nInhAbsRightSpace;       // der Zellen zugeschlagen wurde

    USHORT nRelLeftFill;            // relative Breiten der Zellen zur
    USHORT nRelRightFill;           // Ausrichtung von Tabellen in Tabellen

    USHORT nRelTabWidth;            // Die relative Breite der Tabelle

    USHORT nWidthOption;            // die Breite der Tabelle (in Twip oder %)
    USHORT nCellPadding;            // Abstand zum Inhalt (in Twip)
    USHORT nCellSpacing;            // Absatnd zwischen Zellen (in Twip)
    USHORT nBorder;                 // Dicke der ausseren Umrandung bzw.
                                    // Platz, den Netscape hierfuer einrechnet.

    USHORT nLeftBorderWidth;
    USHORT nRightBorderWidth;
    USHORT nInhLeftBorderWidth;
    USHORT nInhRightBorderWidth;
    USHORT nBorderWidth;

    USHORT nDelayedResizeAbsAvail;  // Param fuer's verzoegerte Resize
    USHORT nLastResizeAbsAvail;

    BYTE nPass1Done;                // Vorgabe-Werte fuer die einzelen
    BYTE nWidthSet;                 // Schleifen-Durchlauefe

    SvxAdjust eTableAdjust;         // Die Ausrichtung der Tabelle

    BOOL bColsOption : 1;           // Tabelle besitzt eine COLS-Option
    BOOL bColTags : 1;              // Tabelle besitzt COL/COLGRP-Tags
    BOOL bPrcWidthOption : 1;       // Breite ist eine %-Angabe
    BOOL bUseRelWidth : 1;          // SwTable bekommt relative Breite

    BOOL bMustResize : 1;           // Tabelle muss in der Breite ang. werden
    BOOL bExportable : 1;           // Layout kann zum Export genutzt werden
    BOOL bBordersChanged : 1;       // Umrandung wurde geaendert
    BOOL bMayBeInFlyFrame : 1;      // Die Tabelle koennte im Rahmen sein

    BOOL bDelayedResizeRecalc : 1;  // Param fuer's verzoegerte Resize
    BOOL bMustNotResize : 1;        // Die Tabelle darf nicht reseized werden
    BOOL bMustNotRecalc : 1;        // Tabelle darf nicht an Inhalt angepasst
                                    // werden

//  USHORT GetLeftBorderWidth( USHORT nCol ) const;
//  USHORT GetRightBorderWidth( USHORT nCol, USHORT nColSpan ) const;

    void AddBorderWidth( ULONG &rMin, ULONG &rMax, ULONG& rAbsMin,
                         USHORT nCol, USHORT nColSpan,
                         BOOL bSwBorders=TRUE ) const;
    void SetBoxWidth( SwTableBox *pBox, USHORT nCol, USHORT nColSpan ) const;

    const SwStartNode *GetAnyBoxStartNode() const;
    SwFrmFmt *FindFlyFrmFmt() const;
    const SwDoc *GetDoc() const { return GetAnyBoxStartNode()->GetDoc(); }

    void ClearPass1Info() { nMin = nMax = 0; }

    void _Resize( USHORT nAbsAvail, BOOL bRecalc=FALSE );

    DECL_STATIC_LINK( SwHTMLTableLayout, DelayedResize_Impl, void* );

public:

    SwHTMLTableLayout( const SwTable *pSwTbl,
                       USHORT nRows, USHORT nCols, BOOL bColsOpt, BOOL ColTgs,
                       USHORT nWidth, BOOL bPrcWidth, USHORT nBorderOpt,
                       USHORT nCellPad, USHORT nCellSp, SvxAdjust eAdjust,
                       USHORT nLMargin, USHORT nRMargin, USHORT nBWidth,
                       USHORT nLeftBWidth, USHORT nRightBWidth,
                       USHORT nInhLeftBWidth, USHORT nInhRightBWidth );

    ~SwHTMLTableLayout();

    USHORT GetLeftCellSpace( USHORT nCol, USHORT nColSpan,
                             BOOL bSwBorders=TRUE ) const;
    USHORT GetRightCellSpace( USHORT nCol, USHORT nColSpan,
                              BOOL bSwBorders=TRUE ) const;
    inline USHORT GetInhCellSpace( USHORT nCol, USHORT nColSpan ) const;

    inline void SetInhBorderWidths( USHORT nLeft, USHORT nRight );


    void GetAvail( USHORT nCol, USHORT nColSpan, USHORT& rAbsAvail,
                   USHORT& rRelAvail ) const;

    void AutoLayoutPass1();
    void AutoLayoutPass2( USHORT nAbsAvail, USHORT nRelAvail,
                          USHORT nAbsLeftSpace, USHORT nAbsRightSpace,
                          USHORT nParentInhSpace );
    void SetWidths( BOOL bCallPass2=FALSE, USHORT nAbsAvail=0,
                    USHORT nRelAvail=0, USHORT nAbsLeftSpace=0,
                    USHORT nAbsRightSpace=0,
                    USHORT nParentInhSpace=0 );

    inline SwHTMLTableLayoutColumn *GetColumn( USHORT nCol ) const;
    inline void SetColumn( SwHTMLTableLayoutColumn *pCol, USHORT nCol );

    inline SwHTMLTableLayoutCell *GetCell( USHORT nRow, USHORT nCol ) const;
    inline void SetCell( SwHTMLTableLayoutCell *pCell, USHORT nRow, USHORT nCol );

    void SetLeftFillerBox( SwTableBox *pBox ) { pLeftFillerBox = pBox; }
    void SetRightFillerBox( SwTableBox *pBox ) { pRightFillerBox = pBox; }

    ULONG GetMin() const { return nMin; }
    ULONG GetMax() const { return nMax; }
    USHORT GetRelLeftFill() const { return nRelLeftFill; }
    USHORT GetRelRightFill() const { return nRelRightFill; }

    inline long GetBrowseWidthMin() const;

    BOOL HasColsOption() const { return bColsOption; }
    BOOL HasColTags() const { return bColTags; }

    BOOL IsTopTable() const  { return pSwTable != 0; }

    void SetMustResize( BOOL bSet ) { bMustResize = bSet; }
    void SetMustNotResize( BOOL bSet ) { bMustNotResize = bSet; }
    void SetMustNotRecalc( BOOL bSet ) { bMustNotRecalc = bSet; }

    // Neueberechnung der Tabellenbreiten fuer die uebergebene verfuegbare
    // Breite.
    // - Wenn bRecalc gesetzt ist, werden auch der Inhalt der Boxen
    //   zur Berechnung herangezogen.
    //   neu berechnet.
    // - Wenn bForce gesetzt ist, wird die Tabelle auch neu berechnet, wenn
    //   dies mit SetMustNotResize unterdrueckt werden soll.
    // - Wenn nDelay>0 wird die Berechnung entsprechend verzoegert.
    //   Innerhalb der Verzeoegerung auftretende Resize-Aufrufe werden
    //   ignoriert, die Verzeogerung wird aber ggf. uebernommen.
    // - Wenn nDelay==HTMLTABLE_RESIZE_NOW ist, wird sofort Resized und
    //   eventuell noch asstehende Resize-Aufrufe werden nicht mehr
    //   ausgefuehrt.
    // - Der Rueckgabewert gibt an, ob sich die Tabelle geaendert hat.
    BOOL Resize( USHORT nAbsAvail, BOOL bRecalc=FALSE, BOOL bForce=FALSE,
                 ULONG nDelay=0 );

    void BordersChanged( USHORT nAbsAvail, BOOL bRecalc=FALSE );

    // Ermitteln der verfuegbaren Breite. Das geht nur, wenn ein Layout
    // oder eine ViewShell vorhanden ist. Sonst wird 0 zurueckgegeben.
    // (Wird vom HTML-Filter benoetigt, da der nicht an das Layout kommt.)
    static USHORT GetBrowseWidth( const SwDoc& rDoc );
    static USHORT GetBrowseWidthByVisArea( const SwDoc& rDoc );

    // Ermitteln der verfuegbaren Breite uber den Tabellen-Frame
    USHORT GetBrowseWidthByTabFrm( const SwTabFrm& rTabFrm ) const;

    // Ermitteln der verfuegbaren Breite uber den Tabellen-Frame oder
    // das statische GetBrowseWidth, wenn kein Layout existiert.
    USHORT GetBrowseWidthByTable( const SwDoc& rDoc ) const;

    // Fuer Export
    USHORT GetWidthOption() const { return nWidthOption; }
    BOOL   HasPrcWidthOption() const { return bPrcWidthOption; }

    USHORT GetCellPadding() const { return nCellPadding; }
    USHORT GetCellSpacing() const { return nCellSpacing; }
    USHORT GetBorder() const { return nBorder; }

    USHORT GetRowCount() const { return nRows; }
    USHORT GetColCount() const { return nCols; }

    void SetExportable( BOOL bSet ) { bExportable = bSet; }
    BOOL IsExportable() const { return bExportable; }

    BOOL HaveBordersChanged() const { return bBordersChanged; }

    void SetMayBeInFlyFrame( BOOL bSet ) { bMayBeInFlyFrame = bSet; }
    BOOL MayBeInFlyFrame() const { return bMayBeInFlyFrame; }
};

/*  */

inline void SwHTMLTableLayoutCell::SetProtected()
{
    nRowSpan = 1;
    nColSpan = 1;

    pContents = 0;
}

/*  */

inline void SwHTMLTableLayoutColumn::MergeMinMaxNoAlign( ULONG nMin,
    ULONG nMax, ULONG nAbsMin )
{
    if( nMin > nMinNoAlign )
        nMinNoAlign = nMin;
    if( nMax > nMaxNoAlign )
        nMaxNoAlign = nMax;
    if( nAbsMin > nAbsMinNoAlign )
        nAbsMinNoAlign = nAbsMin;
}

inline void SwHTMLTableLayoutColumn::ClearPass1Info( BOOL bWidthOpt )
{
    nMinNoAlign = nMaxNoAlign = nAbsMinNoAlign = MINLAY;
    nMin = nMax = 0;
    if( bWidthOpt )
    {
        nWidthOption = 0;
        bRelWidthOption = FALSE;
    }
}

inline void SwHTMLTableLayoutColumn::MergeCellWidthOption(
    USHORT nWidth, BOOL bRel )
{
    if( !nWidthOption ||
        (bRel==bRelWidthOption && nWidthOption < nWidth) )
    {
        nWidthOption = nWidth;
        bRelWidthOption = bRel;
    }
}

inline void SwHTMLTableLayoutColumn::SetMinMax( ULONG nMn, ULONG nMx )
{
    nMin = nMn;
    nMax = nMx;
}

/*  */

inline USHORT SwHTMLTableLayout::GetInhCellSpace( USHORT nCol,
                                                  USHORT nColSpan ) const
{
    USHORT nSpace = 0;
    if( nCol==0 )
        nSpace += nInhAbsLeftSpace;
    if( nCol+nColSpan==nCols )
        nSpace += nInhAbsRightSpace;

    return nSpace;
}

inline SwHTMLTableLayoutColumn *SwHTMLTableLayout::GetColumn( USHORT nCol ) const
{
    return aColumns[nCol];
}

inline void SwHTMLTableLayoutColumn::SetWidthOption(
    USHORT nWidth, BOOL bRelWidth, BOOL bTest )
{
    if( bTest && bRelWidthOption==bRelWidth )
    {
        if( nWidth > nWidthOption )
            nWidthOption = nWidth;
    }
    else
        nWidthOption = nWidth;
    bRelWidthOption = bRelWidth;
}

inline void SwHTMLTableLayout::SetColumn( SwHTMLTableLayoutColumn *pCol, USHORT nCol )
{
    aColumns[nCol] = pCol;
}

inline SwHTMLTableLayoutCell *SwHTMLTableLayout::GetCell( USHORT nRow, USHORT nCol ) const
{
    return aCells[nRow*nCols+nCol];
}

inline void SwHTMLTableLayout::SetCell( SwHTMLTableLayoutCell *pCell,
                               USHORT nRow, USHORT nCol )
{
    aCells[nRow*nCols+nCol] = pCell;
}

inline long SwHTMLTableLayout::GetBrowseWidthMin() const
{
    return (long)( (!nWidthOption || bPrcWidthOption) ? nMin : nRelTabWidth );
}

void SwHTMLTableLayout::SetInhBorderWidths( USHORT nLeft, USHORT nRight )
{
    nInhLeftBorderWidth = nLeft;
    nInhRightBorderWidth = nRight;
}


#endif
diff --git a/sw/inc/index.hxx b/sw/inc/index.hxx
new file mode 100644
index 0000000..ec1cff8
--- /dev/null
+++ b/sw/inc/index.hxx
@@ -0,0 +1,318 @@
/*************************************************************************
 *
 *  $RCSfile: index.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _INDEX_HXX
#define _INDEX_HXX

#include <limits.h>

#ifndef _SOLAR_H
#include <tools/solar.h>
#endif

#ifndef _RTTI_HXX
#include <tools/rtti.hxx>               // for RTTI of SwIndexReg
#endif
#ifndef _STRING_HXX
#include <tools/string.hxx>             // for xub_StrLen
#endif

#define INVALID_INDEX STRING_NOTFOUND

// Maximale Anzahl von Indizies im IndexArray (zum Abtesten auf Ueberlaeufe)
class SwIndex;
class SwIndexReg;

#ifdef PRODUCT
#define INLINE inline
#else
#define INLINE
#endif

class SwIndex
{
    friend class SwIndexReg;

#ifndef PRODUCT
    static int nSerial;
    int MySerial;
#endif

    xub_StrLen  nIndex;
    SwIndexReg* pArray;
    SwIndex *pNext, *pPrev;

    SwIndex& ChgValue( const SwIndex& rIdx, xub_StrLen nNewValue );
    void Remove();                  // Ausketten

public:
    SwIndex( SwIndexReg * pReg, xub_StrLen nIdx = 0 );
    SwIndex( const SwIndex & );
    SwIndex( const SwIndex &, short nDiff );
    ~SwIndex() { Remove(); }

    INLINE xub_StrLen operator++();
    INLINE xub_StrLen operator--();
#ifndef CFRONT
    INLINE xub_StrLen operator++(int);
    INLINE xub_StrLen operator--(int);
#endif

    INLINE xub_StrLen operator+=( xub_StrLen );
    INLINE xub_StrLen operator-=( xub_StrLen );
    INLINE xub_StrLen operator+=( const SwIndex& );
    INLINE xub_StrLen operator-=( const SwIndex& );

    INLINE BOOL operator<( const SwIndex& ) const;
    INLINE BOOL operator<=( const SwIndex& ) const;
    INLINE BOOL operator>( const SwIndex& ) const;
    INLINE BOOL operator>=( const SwIndex& ) const;
    BOOL operator==( const SwIndex& rSwIndex ) const
    { return (nIndex == rSwIndex.nIndex) &&  (pArray == rSwIndex.pArray); }

    BOOL operator!=( const SwIndex& rSwIndex ) const
    { return (nIndex != rSwIndex.nIndex) ||  (pArray != rSwIndex.pArray); }

    BOOL operator<( xub_StrLen nWert ) const    { return nIndex <  nWert; }
    BOOL operator<=( xub_StrLen nWert ) const   { return nIndex <= nWert; }
    BOOL operator>( xub_StrLen nWert ) const    { return nIndex >  nWert; }
    BOOL operator>=( xub_StrLen nWert ) const   { return nIndex >= nWert; }
    BOOL operator==( xub_StrLen nWert ) const   { return nIndex == nWert; }
    BOOL operator!=( xub_StrLen nWert ) const   { return nIndex != nWert; }

    INLINE SwIndex& operator=( xub_StrLen );
    SwIndex& operator=( const SwIndex & );

    // gebe den Wert vom Index als xub_StrLen zurueck
    xub_StrLen GetIndex() const { return nIndex; }

    // ermoeglicht Zuweisungen ohne Erzeugen eines temporaeren
    // Objektes
    SwIndex &Assign(SwIndexReg *,xub_StrLen);

        // Herausgabe des Pointers auf das IndexArray,
        // (fuers RTTI am SwIndexReg)
    const SwIndexReg* GetIdxReg() const { return pArray; }
};

#undef INLINE

class SwIndexReg
{
    friend class SwIndex;
    const SwIndex *pFirst, *pLast, *pMiddle;

    // ein globales Array, in das Indizies verschoben werden, die mal
    // temporaer "ausgelagert" werden muessen; oder die zum Zeitpunkt des
    // anlegens kein gueltiges Array kennen (SwPaM/SwPosition!)
    friend void _InitCore();
    friend void _FinitCore();
    static SwIndexReg* pEmptyIndexArray;

protected:
    virtual void Update( const SwIndex & aPos, xub_StrLen nLen,
                        BOOL bNegativ = FALSE );

    void ChkArr();

    BOOL HasAnyIndex() const { return 0 != pFirst; }

    // fuer das Move am RegArray:
    void MoveIdx( const SwIndex& rOldPos, const SwIndex& rNewPos );

public:
    SwIndexReg();
#ifndef PRODUCT
    ~SwIndexReg();
#endif

    // rtti, abgeleitete moegens gleichtun oder nicht. Wenn sie es gleichtun
    // kann ueber das SwIndexReg typsicher gecastet werden.
    TYPEINFO();

    void SetDefMiddle( const SwIndex* pIdx ) { pMiddle = pIdx; }
    void MoveTo( SwIndexReg& rArr );
};


#ifdef PRODUCT

inline xub_StrLen SwIndex::operator++()
{
    return ChgValue( *this, nIndex+1 ).nIndex;
}
inline xub_StrLen SwIndex::operator--()
{
    return ChgValue( *this, nIndex-1 ).nIndex;
}
#ifndef CFRONT
inline xub_StrLen SwIndex::operator++(int)
{
    xub_StrLen nOldIndex = nIndex;
    ChgValue( *this, nIndex+1 );
    return nOldIndex;
}
inline xub_StrLen SwIndex::operator--(int)
{
    xub_StrLen nOldIndex = nIndex;
    ChgValue( *this, nIndex-1 );
    return nOldIndex;
}
#endif

inline xub_StrLen SwIndex::operator+=( xub_StrLen nWert )
{
    return ChgValue( *this, nIndex + nWert ).nIndex;
}
inline xub_StrLen SwIndex::operator-=( xub_StrLen nWert )
{
    return ChgValue( *this, nIndex - nWert ).nIndex;
}
inline xub_StrLen SwIndex::operator+=( const  SwIndex& rIndex )
{
    return ChgValue( *this, nIndex + rIndex.nIndex ).nIndex;
}
inline xub_StrLen SwIndex::operator-=( const SwIndex& rIndex )
{
    return ChgValue( *this, nIndex - rIndex.nIndex ).nIndex;
}

inline BOOL SwIndex::operator<( const SwIndex& rIndex ) const
{
    return nIndex < rIndex.nIndex;
}
inline BOOL SwIndex::operator<=( const SwIndex& rIndex ) const
{
    return nIndex <= rIndex.nIndex;
}
inline BOOL SwIndex::operator>( const SwIndex& rIndex ) const
{
    return nIndex > rIndex.nIndex;
}
inline BOOL SwIndex::operator>=( const SwIndex& rIndex ) const
{
    return nIndex >= rIndex.nIndex;
}
inline SwIndex& SwIndex::operator=( xub_StrLen nWert )
{
    if( nIndex != nWert )
        ChgValue( *this, nWert );
    return *this;
}

// PRODUCT
#endif


/******************************************************************

    Source Code Control System - Header

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/inc/index.hxx,v 1.1.1.1 2000-09-18 17:14:26 hr Exp $

    Source Code Control System - Update

    $Log: not supported by cvs2svn $
    Revision 1.67  2000/09/18 16:03:22  willem.vandorp
    OpenOffice header added.

    Revision 1.66  2000/09/08 13:24:17  willem.vandorp
    Header and footer replaced

    Revision 1.65  2000/04/12 13:53:23  jp
    Unicode changes

    Revision 1.64  1999/02/25 08:20:48  JP
    Task #62314#: Asynchrone DDE-Links/-Requests


      Rev 1.63   25 Feb 1999 09:20:48   JP
   Task #62314#: Asynchrone DDE-Links/-Requests

      Rev 1.62   27 Nov 1997 09:20:28   JP
   neu: SwIndexReg::MoveTo - move alle Indiezies aus einem Array ins andere

      Rev 1.61   11 Nov 1997 20:36:48   JP
   SwIndexReg CTOR/DTOR jetzt public

      Rev 1.60   10 Oct 1997 14:03:20   JP
   SwRange wird nicht mehr benoetigt

      Rev 1.59   09 Oct 1997 15:11:50   JP
   Umstellung NodeIndex/-Array/BigPtrArray

      Rev 1.58   07 Aug 1997 14:41:26   OM
   Headerfile-Umstellung

      Rev 1.57   18 Jul 1997 12:21:20   MA
   includes

      Rev 1.56   08 Nov 1995 15:47:10   MA
   opt: operatoren entfernt

      Rev 1.55   25 Jun 1995 16:49:20   JP
   Unter Windows nun auch den neuen Index

      Rev 1.54   09 May 1995 08:44:28   KH
   #ifdef MAC -> #ifdef CFRONT

*******************************************************************/

#endif
diff --git a/sw/inc/inetfld.hxx b/sw/inc/inetfld.hxx
new file mode 100644
index 0000000..aa6db67
--- /dev/null
+++ b/sw/inc/inetfld.hxx
@@ -0,0 +1,142 @@
/*************************************************************************
 *
 *  $RCSfile: inetfld.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _INETFLD_HXX
#define _INETFLD_HXX


#include "fldbas.hxx"

class SvxMacro;
class SvxMacroTableDtor;
class SwINetField;
class SwCharFmt;
class SwDoc;

/*--------------------------------------------------------------------
    Beschreibung: InterNet-FieldType -> Lade Document mit der URL
 --------------------------------------------------------------------*/

class SwINetFieldType : public SwFieldType
{
    SwDepend aNormalFmt;
    SwDepend aVisitFmt;
    SwDoc* pDoc;

public:
    SwINetFieldType( SwDoc* pDoc );

    virtual SwFieldType*    Copy() const;

    SwCharFmt*              GetCharFmt( const SwINetField& rFld );

    SwDoc* GetDoc() const   { return pDoc; }
};

/*--------------------------------------------------------------------
    Beschreibung: InterNet-Field -> Lade Document mit der URL
 --------------------------------------------------------------------*/

class SwINetField : public SwField
{
    friend class SwINetFieldType;

    String  sTargetFrameName;   // in diesen Frame soll die URL
    String  sURL;
    String  sText;
    SvxMacroTableDtor* pMacroTbl;

public:
    // Direkte Eingabe alten Wert loeschen
    SwINetField( SwINetFieldType* pTyp, USHORT nFmt,
                  const String& rURL, const String& rText );
    virtual ~SwINetField();

    virtual String   GetCntnt(BOOL bName = FALSE) const;
    virtual String   Expand() const;
    virtual SwField* Copy() const;

    // URL
    virtual const String& GetPar1() const;
    virtual void    SetPar1(const String& rStr);

    // HinweisText
    virtual String  GetPar2() const;
    virtual void    SetPar2(const String& rStr);

    // das ist das akt. Zeichenformat
          SwCharFmt* GetCharFmt();
    const SwCharFmt* GetCharFmt() const
            { return ((SwINetField*)this)->GetCharFmt(); }

    const String& GetTargetFrameName() const        { return sTargetFrameName; }
    void SetTargetFrameName( const String& rNm )    { sTargetFrameName = rNm; }

    // setze eine neue oder loesche die akt. MakroTabelle
    void SetMacroTbl( const SvxMacroTableDtor* pTbl = 0 );
    const SvxMacroTableDtor* GetMacroTbl() const    { return pMacroTbl; }

    // setze / erfrage ein Makro
    void SetMacro( USHORT nEvent, const SvxMacro& rMacro );
    const SvxMacro* GetMacro( USHORT nEvent ) const;
};


#endif // _INETFLD_HXX
diff --git a/sw/inc/init.hxx b/sw/inc/init.hxx
new file mode 100644
index 0000000..00a9c81
--- /dev/null
+++ b/sw/inc/init.hxx
@@ -0,0 +1,78 @@
/*************************************************************************
 *
 *  $RCSfile: init.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _INIT_HXX
#define _INIT_HXX

void _InitCore();   // bastyp/init.cxx
void _FinitCore();

void _InitFilter(); // basflt/fltini.cxx
void _FinitFilter();

// layout/frame.cxx
void _FrmInit();

// text/txtfrm.cxx
void _TextInit();
void _TextFinit();


#endif
diff --git a/sw/inc/io.hxx b/sw/inc/io.hxx
new file mode 100644
index 0000000..570a43e
--- /dev/null
+++ b/sw/inc/io.hxx
@@ -0,0 +1,221 @@
/*************************************************************************
 *
 *  $RCSfile: io.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
// eigene Klasse fuer IO, die die systemunabhaengige Darstellung
// uebernimmt (bytes dreht, Character konvertiert)
// das Schreiben erfolgt aus Effizienzgruenden binaer
#ifndef _IO_HXX
#define _IO_HXX

#ifndef MAC
#ifdef UNX
#include <unistd.h>
#else
#include <io.h>
#endif
#else
#include <mac_start.h>      // wegen fcntl und sv
#endif

#include <fcntl.h>

#ifndef MAC
#include <sys/types.h>
#include <sys/stat.h>
#else
#include <mac_end.h>
#endif


#ifndef _KEYCOD_HXX //autogen
#include <vcl/keycod.hxx>
#endif

#ifndef _STREAM_HXX //autogen
#include <tools/stream.hxx>
#endif

/*$
class BinaryFile {
    int fd;
public:
    enum IO_OpenMode {
        BF_READ = O_RDONLY,
        BF_WRITE = O_RDWR,
        BF_CREATE = O_CREAT,
        BF_TRUNC = O_TRUNC
    };
        // ctor oeffnet File im BinearMode, dtor schliesst es
    BinaryFile(const String &, int eOpenMode);
    ~BinaryFile();
    BOOL Ok() const {
        return -1 != fd;
    }
    operator int() const { return fd; }
};
*/

class SwIOin {
private:
        SvFileStream aStr; //$ ifstream
public:
    // Stream wird im entsprechenden Mode erzeugt.
    SwIOin(const String &rFilename, StreamMode nMode =
                                    STREAM_READ | STREAM_NOCREATE );

    SwIOin& operator>>(char& val);
    SwIOin& operator>>(unsigned char& val);
    SwIOin& operator>>(char* val);
    SwIOin& operator>>(unsigned char* val);
    SwIOin& operator>>(short& val);
    SwIOin& operator>>(unsigned short& val);
    SwIOin& operator>>(long& val);
    SwIOin& operator>>(unsigned long& val);
    String ReadString();
    KeyCode ReadKeyCode();
    // kann erweitert werden fuer weitere Arrays von
    // Basistypen; nLen ist die Anzahl der Elemente
    SwIOin& Read(char *buf, unsigned nLen);

    int operator!() { return aStr.GetError() != SVSTREAM_OK; }
        SvFileStream &operator()() {
        return aStr;
    }
};

class SwIOout {
private:
    void _write(const char *buf, unsigned size);
    SvFileStream aStr; //$ ofstream
public:
    // Stream wird im entsprechenden Mode erzeugt.
    SwIOout( const String &rFilename, StreamMode nMode =
                                      STREAM_WRITE | STREAM_NOCREATE );
    SwIOout& operator<<(char val);
    SwIOout& operator<<(unsigned char val);
    SwIOout& operator<<(char* val);
    SwIOout& operator<<(unsigned char* val);
    SwIOout& operator<<(short val);
    SwIOout& operator<<(unsigned short val);
    SwIOout& operator<<(long val);
    SwIOout& operator<<(unsigned long val);
    SwIOout& operator<<(const String &);
    SwIOout& operator<<(const KeyCode &);
    // kann erweitert werden fuer weitere Arrays von
    // Basistypen; nLen ist die Anzahl der Elemente
    SwIOout& Write(const char *buf, unsigned nLen);

    int operator!() { return aStr.GetError() != SVSTREAM_OK; }
    SvFileStream &operator()() {
        return aStr;
    }
};


class SwIOinout {
private:
    SvFileStream aStr; //$ fstream

public:
    // Stream wird im entsprechenden Mode erzeugt.
    SwIOinout(const String &rFilename, StreamMode nMode =
                                       STREAM_READWRITE  | STREAM_NOCREATE );

    SwIOinout& operator>>(char& val);
    SwIOinout& operator>>(unsigned char& val);
    SwIOinout& operator>>(char* val);
    SwIOinout& operator>>(unsigned char* val);
    SwIOinout& operator>>(short& val);
    SwIOinout& operator>>(unsigned short& val);
    SwIOinout& operator>>(long& val);
    SwIOinout& operator>>(unsigned long& val);
    String ReadString();
    KeyCode ReadKeyCode();
    // kann erweitert werden fuer weitere Arrays von
    // Basistypen; nLen ist die Anzahl der Elemente
    SwIOinout& Read(char *buf, unsigned nLen);
    SwIOinout& Read(unsigned short *buf, unsigned nLen );

    SwIOinout& operator<<(char val);
    SwIOinout& operator<<(unsigned char val);
    SwIOinout& operator<<(char* val);
    SwIOinout& operator<<(unsigned char* val);
    SwIOinout& operator<<(short val);
    SwIOinout& operator<<(unsigned short val);
    SwIOinout& operator<<(long val);
    SwIOinout& operator<<(unsigned long val);
    SwIOinout& operator<<(const String &);
    SwIOinout& operator<<(const KeyCode &);
    // kann erweitert werden fuer weitere Arrays von
    // Basistypen; nLen ist die Anzahl der Elemente
    SwIOinout& Write(const char *buf, unsigned nLen);

    int operator!() { return aStr.GetError() != SVSTREAM_OK; }
        SvFileStream &operator()() {
        return aStr;
    }

    BOOL Ok();
};



#endif

diff --git a/sw/inc/itabenum.hxx b/sw/inc/itabenum.hxx
new file mode 100644
index 0000000..92406bda
--- /dev/null
+++ b/sw/inc/itabenum.hxx
@@ -0,0 +1,77 @@
/*************************************************************************
 *
 *  $RCSfile: itabenum.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:26 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _ITABENUM_HXX
#define _ITABENUM_HXX

enum SwTableInsMode
{
    DEFAULT_BORDER     = 0x01,
    HEADLINE           = 0x02,
    REPEAT             = 0x04,
    HEADLINE_REPEAT    = 0x06,  // Headline + Repeat
    SPLIT_LAYOUT       = 0x08,
    HEADLINE_NO_BORDER = HEADLINE_REPEAT|SPLIT_LAYOUT,
    ALL_TBL_INS_ATTR   = DEFAULT_BORDER|HEADLINE_REPEAT|SPLIT_LAYOUT
};


#endif

diff --git a/sw/inc/lineinfo.hxx b/sw/inc/lineinfo.hxx
new file mode 100644
index 0000000..4622bec6
--- /dev/null
+++ b/sw/inc/lineinfo.hxx
@@ -0,0 +1,144 @@
/*************************************************************************
 *
 *  $RCSfile: lineinfo.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:27 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef SW_LINEINFO_HXX
#define SW_LINEINFO_HXX


#ifndef _CALBCK_HXX
#include "calbck.hxx"
#endif
#ifndef _NUMRULE_HXX
#include "numrule.hxx"
#endif

class SwCharFmt;
class SwDoc;

enum LineNumberPosition
{
    LINENUMBER_POS_LEFT,
    LINENUMBER_POS_RIGHT,
    LINENUMBER_POS_INSIDE,
    LINENUMBER_POS_OUTSIDE
};

class SwLineNumberInfo : public SwClient //purpose of derivation from SwClient:
                                         //character style for displaying the numbers.
{
    SwNumType           aType;              //e.g. roman linenumbers
    String              aDivider;           //String for aditional interval (vert. lines user defined)
    USHORT              nPosFromLeft;       //Position for paint
    USHORT              nCountBy;           //Paint only for every n line
    USHORT              nDividerCountBy;    //Interval for display of an user defined
                                            //string every n lines
    LineNumberPosition  ePos;               //Where should the display occur (number and divicer)
    BOOL                bPaintLineNumbers;  //Should anything be displayed?
    BOOL                bCountBlankLines;   //Count empty lines?
    BOOL                bCountInFlys;       //Count also within FlyFrames?
    BOOL                bRestartEachPage;   //Restart counting at the first paragraph of each page
                                            //(even on follows when paragraphs are splitted)

public:
    SwLineNumberInfo();
    SwLineNumberInfo(const SwLineNumberInfo&);

    SwLineNumberInfo& operator=(const SwLineNumberInfo&);
    BOOL operator==( const SwLineNumberInfo& rInf ) const;

    SwCharFmt *GetCharFmt(SwDoc &rDoc) const;
    void SetCharFmt( SwCharFmt* );

    const SwNumType &GetNumType() const             { return aType; }
    void             SetNumType( SwNumType aNew )   { aType = aNew; }

    const String &GetDivider() const    { return aDivider; }
    void SetDivider( const String &r )  { aDivider = r; }
    USHORT GetDividerCountBy() const    { return nDividerCountBy; }
    void SetDividerCountBy( USHORT n )  { nDividerCountBy = n; }

    USHORT GetPosFromLeft() const       { return nPosFromLeft; }
    void   SetPosFromLeft( USHORT n)    { nPosFromLeft = n;    }

    USHORT GetCountBy() const           { return nCountBy; }
    void   SetCountBy( USHORT n)        { nCountBy = n;    }

    LineNumberPosition GetPos() const   { return ePos; }
    void SetPos( LineNumberPosition eP ){ ePos = eP;   }

    BOOL   IsPaintLineNumbers() const   { return bPaintLineNumbers; }
    void   SetPaintLineNumbers( BOOL b ){ bPaintLineNumbers = b;    }

    BOOL   IsCountBlankLines() const    { return bCountBlankLines;  }
    void   SetCountBlankLines( BOOL b ) { bCountBlankLines = b;     }

    BOOL   IsCountInFlys() const        { return bCountInFlys;      }
    void   SetCountInFlys( BOOL b )     { bCountInFlys = b;         }

    BOOL   IsRestartEachPage() const    { return bRestartEachPage;  }
    void   SetRestartEachPage( BOOL b ) { bRestartEachPage = b;     }

    virtual void Modify( SfxPoolItem*, SfxPoolItem* );
};



#endif

diff --git a/sw/inc/linkenum.hxx b/sw/inc/linkenum.hxx
new file mode 100644
index 0000000..ea15f28
--- /dev/null
+++ b/sw/inc/linkenum.hxx
@@ -0,0 +1,73 @@
/*************************************************************************
 *
 *  $RCSfile: linkenum.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:27 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _LINKENUM_HXX
#define _LINKENUM_HXX

enum UpdateLinks
{
    NEVER,
    MANUAL,
    AUTOMATIC,
    GLOBALSETTING
};

#endif

diff --git a/sw/inc/mdiexp.hxx b/sw/inc/mdiexp.hxx
new file mode 100644
index 0000000..b9e3ee9
--- /dev/null
+++ b/sw/inc/mdiexp.hxx
@@ -0,0 +1,118 @@
/*************************************************************************
 *
 *  $RCSfile: mdiexp.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:27 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _MDIEXP_HXX
#define _MDIEXP_HXX

#ifndef _SOLAR_H
#include <tools/solar.h>
#endif

class UniString;
class SwRect;
class Size;
class Dialog;
class ViewShell;
class SwDoc;
class SwDocShell;
class SfxObjectShell;
class SfxFrame;

extern void ScrollMDI(ViewShell* pVwSh, const SwRect &, USHORT nRangeX, USHORT nRangeY);
extern BOOL IsScrollMDI(ViewShell* pVwSh, const SwRect &);
extern void SizeNotify(ViewShell* pVwSh, const Size &);

//Update der Statusleiste, waehrend einer Action.
extern void PageNumNotify( ViewShell* pVwSh,
                            USHORT nPhyNum,
                            USHORT nVirtNum,
                           const UniString& rPg );

enum FlyMode { FLY_DRAG_START, FLY_DRAG, FLY_DRAG_END };
extern void FrameNotify( ViewShell* pVwSh, FlyMode eMode = FLY_DRAG );

void StartProgress     ( USHORT nMessId, long nStartVal, long nEndVal, SwDocShell *pDocSh = 0 );
void EndProgress       ( SwDocShell *pDocSh = 0 );
void SetProgressState  ( long nPosition, SwDocShell *pDocShell );
void SetProgressText   ( USHORT nMessId, SwDocShell *pDocShell );
void RescheduleProgress( SwDocShell *pDocShell );

void EnableCmdInterface(BOOL bEnable = TRUE);

Dialog* GetSearchDialog();

void RepaintPagePreview( ViewShell* pVwSh, const SwRect& rRect );

//paintfrm.cxx
void RemoveFromBackgroundCache( const SfxObjectShell &rDocSh, FASTBOOL bFreeze );

//grfcache.cxx
// alle QuickDraw-Bitmaps loeschen (pDoc = 0) oder alle des speziellen Docs
void DelAllGrfCacheEntries( SwDoc* pDoc = 0 );

extern void JavaScriptScrollMDI( SfxFrame* pFrame, INT32 nX, INT32 nY );

// ChgMode fuer Tabellen aus der Konfiguration lesen
USHORT GetTblChgDefaultMode();

BOOL JumpToSwMark( ViewShell* pVwSh, const UniString& rMark );


#endif
diff --git a/sw/inc/ndarr.hxx b/sw/inc/ndarr.hxx
new file mode 100644
index 0000000..c695837
--- /dev/null
+++ b/sw/inc/ndarr.hxx
@@ -0,0 +1,353 @@
/*************************************************************************
 *
 *  $RCSfile: ndarr.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:27 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _NDARR_HXX
#define _NDARR_HXX

#ifndef _SVARRAY_HXX //autogen
#include <svtools/svarray.hxx>
#endif

#ifndef _BPARR_HXX
#include <bparr.hxx>
#endif
#ifndef _NDTYP_HXX
#include <ndtyp.hxx>
#endif

class Graphic;
class UniString;
class SvInPlaceObject;
class SwAttrSet;
class SwCntntFrm;
class SwCntntNode;
class SwDoc;
class SwGrfFmtColl;
class SwGrfNode;
class SwHistory;
class SwNode;
class SwNodeIndex;
class SwNodeRange;
class SwOLENode;
class SwOutlineNodes;
class SwPaM;
class SwSection;
class SwSectionFmt;
class SwSectionNode;
class SwStartNode;
class SwTableBoxFmt;
class SwTableFmt;
class SwTableLine;
class SwTableLineFmt;
class SwTableNode;
class SwTblToTxtSaves;
class SwTxtFmtColl;
class SwTxtNode;
class SwUndoInsNum;
class SwUndoTblToTxt;
class SwUndoTxtToTbl;
struct SwPosition;


// --------------------
// class SwNodes
// --------------------

typedef SwNode * SwNodePtr;
typedef BOOL (*FnForEach_SwNodes)( const SwNodePtr&, void* pArgs );

SV_DECL_PTRARR_SORT( SwOutlineNodes, SwNodePtr, 0, 10 )

class SwNodes: private BigPtrArray
{
    friend class SwDoc;
    friend class SwNode;
    friend class SwNodeIndex;

    SwNodePtr operator[]( USHORT n ) const;
    SwNodePtr operator[]( int n ) const;

    SwNodeIndex* pRoot;                 // Liste aller Indizies auf Nodes

    void Insert( const SwNodePtr pNode, const SwNodeIndex& rPos );
    void Insert( const SwNodePtr pNode, ULONG nPos);
//  void Remove( const SwNodeIndex& rPos, USHORT nLen = 1 );
//  void Remove( ULONG nPos, USHORT nLen = 1 );
//  BOOL Move( const SwIndex & rOldPos, const SwIndex & rNewPos );


    SwDoc* pMyDoc;                      // in diesem Doc ist das Nodes-Array

    SwNode *pEndOfPostIts, *pEndOfInserts,  // das sind die festen Bereiche
           *pEndOfAutotext, *pEndOfRedlines,
           *pEndOfContent;

    SwOutlineNodes* pOutlineNds;        // Array aller GliederiungsNodes

    BOOL bInNodesDel : 1;               // falls rekursiv aufgerufen wird
                                        // Num/Outline nicht aktualisierem
    BOOL bInDelUpdOutl : 1;             // Flags fuers aktualisieren von Outl.
    BOOL bInDelUpdNum : 1;              // Flags fuers aktualisieren von Outl.

    // fuer dier Verwaltung der Indizies
    void RegisterIndex( SwNodeIndex& rIdx );
    void DeRegisterIndex( SwNodeIndex& rIdx );
    void RemoveNode( ULONG nDelPos, ULONG nLen, FASTBOOL bDel );

    // Aktionen auf die Nodes
    void SectionUpDown( const SwNodeIndex & aStart, const SwNodeIndex & aEnd );
    void DelNodes( const SwNodeIndex& rStart, ULONG nCnt = 1 );

    void ChgNode( SwNodeIndex& rDelPos, ULONG nSize,
                  SwNodeIndex& rInsPos, BOOL bNewFrms );

    void UpdtOutlineIdx( const SwNode& );   // Update ab Node alle OutlineNodes

    void _CopyNodes( const SwNodeRange&, const SwNodeIndex&,
                    BOOL bNewFrms = TRUE, BOOL bTblInsDummyNode = FALSE ) const;
    void _DelDummyNodes( const SwNodeRange& rRg );

protected:
    SwNodes( SwDoc* pDoc );

public:
    ~SwNodes();

    SwNodePtr operator[]( ULONG n ) const
        { return (SwNodePtr)BigPtrArray::operator[] ( n ); }

//JP 29.09.97: impl. steht im ndindex.hxx - sollte moeglichst bald auf die
//              neue Schnittstelle angepasst werden
    inline SwNodePtr operator[]( const SwNodeIndex& rIdx ) const;

    ULONG Count() const { return BigPtrArray::Count(); }
    void ForEach( FnForEach_SwNodes fnForEach, void* pArgs = 0 )
    {
        BigPtrArray::ForEach( 0, BigPtrArray::Count(),
                                (FnForEach) fnForEach, pArgs );
    }
    void ForEach( ULONG nStt, ULONG nEnd, FnForEach_SwNodes fnForEach, void* pArgs = 0 )
    {
        BigPtrArray::ForEach( nStt, nEnd, (FnForEach) fnForEach, pArgs );
    }
    void ForEach( const SwNodeIndex& rStart, const SwNodeIndex& rEnd,
                    FnForEach_SwNodes fnForEach, void* pArgs = 0 );

    // eine noch leere Section
    SwNode& GetEndOfPostIts() const     { return *pEndOfPostIts; }
    // Section fuer alle Fussnoten
    SwNode& GetEndOfInserts() const     { return *pEndOfInserts; }
    // Section fuer alle Flys/Header/Footers
    SwNode& GetEndOfAutotext() const    { return *pEndOfAutotext; }
    // Section fuer alle Redlines
    SwNode& GetEndOfRedlines() const    { return *pEndOfRedlines; }
    // das ist der letzte EndNode einer SonderSection. Hier nach kommt nur
    // noch die normale ContentSection (also der BodyText)
    SwNode& GetEndOfExtras() const      { return *pEndOfRedlines; }
    // die normale ContentSection (also der BodyText)
    SwNode& GetEndOfContent() const     { return *pEndOfContent; }

    // ist das NodesArray das normale vom Doc? (nicht das UndoNds, .. )
    // Implementierung steht im doc.hxx (weil man dazu Doc kennen muss) !
    inline BOOL IsDocNodes() const;

    USHORT GetSectionLevel(const SwNodeIndex &rIndex) const;
    void Delete(const SwNodeIndex &rPos, ULONG nNodes = 1);

    BOOL _MoveNodes( const SwNodeRange&, SwNodes& rNodes, const SwNodeIndex&,
                BOOL bNewFrms = TRUE );
    void Move( SwPaM&, SwPosition&, SwNodes& rNodes, BOOL bSplitNd=TRUE );

    void _Copy( const SwNodeRange& rRg, const SwNodeIndex& rInsPos,
                BOOL bNewFrms = TRUE ) const
        {   _CopyNodes( rRg, rInsPos, bNewFrms ); }

    void SectionUp( SwNodeRange *);
    void SectionDown( SwNodeRange *pRange, SwStartNodeType = SwNormalStartNode );

    BOOL CheckNodesRange( const SwNodeIndex& rStt, const SwNodeIndex& rEnd ) const;

    void GoStartOfSection(SwNodeIndex *) const;
    void GoEndOfSection(SwNodeIndex *) const;

    SwCntntNode* GoNext(SwNodeIndex *) const;
    SwCntntNode* GoPrevious(SwNodeIndex *) const;

    //Gehe zum naechsten/vorherigen Cntnt/Tabellennode, fuer den
    //es LayoutFrames gibt, dabei Kopf-/Fusszeilen/Rahmen etc. nicht verlassen
    SwNode* GoNextWithFrm(SwNodeIndex *) const;
    SwNode* GoPreviousWithFrm(SwNodeIndex *) const;

    // zum naechsten Content-Node, der nicht geschuetzt oder versteckt ist
    // (beides auf FALSE ==> GoNext/GoPrevious!!!)
    SwCntntNode* GoNextSection( SwNodeIndex *, int bSkipHidden  = TRUE,
                                           int bSkipProtect = TRUE ) const;
    SwCntntNode* GoPrevSection( SwNodeIndex *, int bSkipHidden  = TRUE,
                                           int bSkipProtect = TRUE ) const;

    // erzeuge ein leere Section von Start und EndNode. Darf nur gerufen
    // werden, wenn eine neue Section mit Inhalt erzeugt werden soll.
    // Zum Beispiel bei den Filtern/Undo/...
    SwStartNode* MakeEmptySection( const SwNodeIndex& rIdx,
                                    SwStartNodeType = SwNormalStartNode );

    SwCntntFrm *MakeFrm(const SwNodeIndex &rIndex);

    // die Impl. von "Make...Node" stehen in den angegebenen .ccx-Files
    SwTxtNode *MakeTxtNode( const SwNodeIndex & rWhere,
                            SwTxtFmtColl *pColl,
                            SwAttrSet* pAutoAttr = 0 ); // in ndtxt.cxx
    SwStartNode* MakeTextSection( const SwNodeIndex & rWhere,
                            SwStartNodeType eSttNdTyp,
                            SwTxtFmtColl *pColl,
                            SwAttrSet* pAutoAttr = 0 );

    SwGrfNode *MakeGrfNode( const SwNodeIndex & rWhere,
                            const UniString& rGrfName,
                            const UniString& rFltName,
                            const Graphic* pGraphic,
                            SwGrfFmtColl *pColl,
                            SwAttrSet* pAutoAttr = 0,
                            BOOL bDelayed = FALSE );    // in ndgrf.cxx

    SwOLENode *MakeOLENode( const SwNodeIndex & rWhere,
                            SvInPlaceObject *pObj,
                            SwGrfFmtColl *pColl,
                            SwAttrSet* pAutoAttr = 0 ); // in ndole.cxx
    SwOLENode *MakeOLENode( const SwNodeIndex & rWhere,
                            UniString &rName,
                            SwGrfFmtColl *pColl,
                            SwAttrSet* pAutoAttr = 0 ); // in ndole.cxx

        // Array aller GliederiungsNodes;
    const SwOutlineNodes& GetOutLineNds() const { return *pOutlineNds; }
        // ab einem bestimmten TextNode alle Updaten
    void UpdateOutlineNode( const SwNode&, BYTE nOldLevel, BYTE nNewLevel );
        // alle Nodes Updaten - Rule/Format-Aenderung
    void UpdateOutlineNodes();

        // fuege die Nodes fuer die Tabelle ein
        // wenn Lines angegeben, erzeuge die Matrix aus Lines & Boxen
        // ansonsten nur die Anzahl von Boxen.
    SwTableNode* InsertTable( const SwNodeIndex& rNdIdx,
                        USHORT nBoxes, SwTxtFmtColl* pCntntTxtColl,
                        USHORT nLines=0, SwTxtFmtColl* pHeadlineTxtColl=0 );
        // erzeuge aus dem makierten Bereich eine ausgeglichene Tabelle
    SwTableNode* TextToTable( const SwNodeRange& rRange, sal_Unicode cCh,
                                SwTableFmt* pTblFmt,
                                SwTableLineFmt* pLineFmt,
                                SwTableBoxFmt* pBoxFmt,
                                SwTxtFmtColl* pTxtColl,
                                SwUndoTxtToTbl* pUndo = 0 );
        // erzeuge aus der Tabelle wieder normalen Text
    BOOL TableToText( const SwNodeRange& rRange, sal_Unicode cCh,
                        SwUndoTblToTxt* = 0 );
        // steht im untbl.cxx und darf nur vom Undoobject gerufen werden
    SwTableNode* UndoTableToText( ULONG nStt, ULONG nEnd,
                        const SwTblToTxtSaves& rSavedData );

        // fuege in der Line, vor der InsPos eine neue Box ein. Das Format
        // wird von der nachfolgenden (vorhergenden;wenn an Ende) genommen
        // in der Line muss schon eine Box vorhanden sein !
    BOOL InsBoxen( SwTableNode*, SwTableLine*, SwTableBoxFmt*,
                        // Formate fuer den TextNode der Box
                        SwTxtFmtColl*, SwAttrSet* pAutoAttr,
                        USHORT nInsPos, USHORT nCnt = 1 );
        // Splittet eine Tabelle in der Grund-Zeile, in der der Index steht.
        // Alle GrundZeilen dahinter wandern in eine neue Tabelle/-Node.
        // Ist das Flag bCalcNewSize auf TRUE, wird fuer beide neuen Tabellen
        // die neue SSize aus dem Max der Boxen errechnet; vorrausgesetzt,
        // die SSize ist "absolut" gesetzt (LONG_MAX)
        // (Wird zur Zeit nur fuer den RTF-Parser benoetigt)
    SwTableNode* SplitTable( const SwNodeIndex& rPos, BOOL bAfter = TRUE,
                                BOOL bCalcNewSize = FALSE );
        // fuegt 2 Tabellen, die hintereinander stehen, wieder zusammen
    BOOL MergeTable( const SwNodeIndex& rPos, BOOL bWithPrev = TRUE,
                    USHORT nMode = 0, SwHistory* pHistory = 0 );

        // fuege eine neue SwSection ein
    SwSectionNode* InsertSection( const SwNodeIndex& rNdIdx,
                                SwSectionFmt& rSectionFmt,
                                const SwSection&,
                                const SwNodeIndex* pEnde,
                                BOOL bInsAtStart = TRUE,
                                BOOL bCreateFrms = TRUE );

        // in welchem Doc steht das Nodes-Array ?
            SwDoc* GetDoc()         { return pMyDoc; }
    const   SwDoc* GetDoc() const   { return pMyDoc; }

        // suche den vorhergehenden [/nachfolgenden ] ContentNode oder
        // TabellenNode mit Frames. Wird kein Ende angeben, dann wird mit
        // dem FrameIndex begonnen; ansonsten, wird mit dem vor rFrmIdx und
        // dem hintern pEnd die Suche gestartet. Sollte kein gueltiger Node
        // gefunden werden, wird 0 returnt. rFrmIdx zeigt auf dem Node mit
        // Frames
    SwNode* FindPrvNxtFrmNode( SwNodeIndex& rFrmIdx,
                                const SwNode* pEnd = 0 ) const;
private:
    // privater Constructor, weil nie kopiert werden darf !!
    SwNodes( const SwNodes & rNodes );
};



#endif
diff --git a/sw/inc/ndgrf.hxx b/sw/inc/ndgrf.hxx
new file mode 100644
index 0000000..36bea7f
--- /dev/null
+++ b/sw/inc/ndgrf.hxx
@@ -0,0 +1,373 @@
/*************************************************************************
 *
 *  $RCSfile: ndgrf.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:27 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _NDGRF_HXX
#define _NDGRF_HXX


#ifndef _LNKBASE_HXX //autogen
#include <so3/lnkbase.hxx>
#endif
#ifndef _GRFMGR_HXX //autogen
#include <goodies/grfmgr.hxx>
#endif
#ifndef _NDNOTXT_HXX
#include <ndnotxt.hxx>
#endif

class SwGrfFmtColl;
class SwDoc;
class GraphicAttr;

// Code for the new GraphicObject
#ifdef USE_GRFOBJECT

// --------------------
// SwGrfNode
// --------------------
class SwGrfNode: public SwNoTxtNode
{
    friend class SwNodes;
    friend class SwGrfFrm;

    GraphicObject aGrfObj;
    SvBaseLinkRef refLink;      // falls Grafik nur als Link, dann Pointer gesetzt
    Size nGrfSize;
    String aStrmName;           // SW3: Name des Storage-Streams fuer Embedded
    String aNewStrmName;        // SW3: name des Storage-Streams bei SaveAs
    String aLowResGrf;          // HTML: LowRes Grafik (Ersatzdarstellung bis
                                //      die normale (HighRes) geladen ist.

    BOOL bTransparentFlagValid  :1;
    BOOL bInSwapIn              :1;
    BOOL bGrafikArrived         :1;
    BOOL bChgTwipSize           :1;
    BOOL bLoadLowResGrf         :1;
    BOOL bFrameInPaint          :1; //Um Start-/EndActions im Paint (ueber
                                    //SwapIn zu verhindern.
    BOOL bScaleImageMap         :1; //Image-Map in SetTwipSize skalieren

    SwGrfNode( const SwNodeIndex& rWhere,
               const String& rGrfName, const String& rFltName,
               const Graphic* pGraphic,
               SwGrfFmtColl* pGrfColl,
               SwAttrSet* pAutoAttr = 0 );
    // Ctor fuer Einlesen (SW/G) ohne Grafik
    SwGrfNode( const SwNodeIndex& rWhere,
               const String& rGrfName, const String& rFltName,
               SwGrfFmtColl* pGrfColl,
               SwAttrSet* pAutoAttr = 0 );

    void InsertLink( const String& rGrfName, const String& rFltName );
    void DelStreamName();

    DECL_LINK( SwapGraphic, GraphicObject* );

public:
    virtual ~SwGrfNode();

    const Graphic&          GetGrf() const      { return aGrfObj.GetGraphic(); }
    const GraphicObject&    GetGrfObj() const   { return aGrfObj; }
          GraphicObject&    GetGrfObj()         { return aGrfObj; }

    virtual SwCntntNode *SplitNode( const SwPosition & );

    virtual Size GetTwipSize() const;
#ifndef _FESHVIEW_ONLY_INLINE_NEEDED
    void SetTwipSize( const Size& rSz );

    inline BOOL IsTransparent() const           { return aGrfObj.IsTransparent(); }

    inline BOOL IsAnimated() const              { return aGrfObj.IsAnimated(); }

    inline BOOL IsChgTwipSize() const           { return bChgTwipSize; }
    inline void SetChgTwipSize( BOOL b )        { bChgTwipSize = b; }

    inline BOOL IsGrafikArrived() const         { return bGrafikArrived; }
    inline void SetGrafikArrived( BOOL b )      { bGrafikArrived = b; }

    inline BOOL IsFrameInPaint() const          { return bFrameInPaint; }
    inline void SetFrameInPaint( BOOL b )       { bFrameInPaint = b; }

    inline BOOL IsScaleImageMap() const         { return bScaleImageMap; }
    inline void SetScaleImageMap( BOOL b )      { bScaleImageMap = b; }

    // alles fuers Laden der LowRes-Grafiken
    inline BOOL IsLoadLowResGrf() const         { return bLoadLowResGrf; }
    inline void SetLoadLowResGrf( BOOL b )      { bLoadLowResGrf = b; }
    const String& GetLowResGrfName() const      { return aLowResGrf; }
    void SetLowResGrfName( const String& r )    { aLowResGrf = r; }
#endif
        // steht in ndcopy.cxx
    virtual SwCntntNode* MakeCopy( SwDoc*, const SwNodeIndex& ) const;
        // erneutes Einlesen, falls Graphic nicht Ok ist. Die
        // aktuelle wird durch die neue ersetzt.
#ifndef _FESHVIEW_ONLY_INLINE_NEEDED
    BOOL ReRead( const String& rGrfName, const String& rFltName,
                  const Graphic* pGraphic = 0, BOOL bModify = TRUE );
        // Laden der Grafik unmittelbar vor der Anzeige
    short SwapIn( BOOL bWaitForData = FALSE );
        // Entfernen der Grafik, um Speicher freizugeben
    short SwapOut();
        // Schreiben der Grafik
    BOOL StoreGraphics( SvStorage* pDocStg = NULL );
        // Zugriff auf den Storage-Streamnamen
    const String& GetStreamName() const;
    void SetStreamName( const String& r ) { aStrmName = r; }
    void SaveCompleted( BOOL bClear );
#endif

        // Der Grafik sagen, dass sich der Node im Undobereich befindet
    virtual BOOL SavePersistentData();
    virtual BOOL RestorePersistentData();

#ifndef _FESHVIEW_ONLY_INLINE_NEEDED
        // Abfrage der Link-Daten
    BOOL IsGrfLink() const                  { return refLink.Is(); }
    inline BOOL IsLinkedFile() const;
    inline BOOL IsLinkedDDE() const;
    SvBaseLinkRef GetLink() const               { return refLink; }
    BOOL GetFileFilterNms( String* pFileNm, String* pFilterNm ) const;
    void ReleaseLink();

        // Prioritaet beim Laden der Grafik setzen. Geht nur, wenn der Link
        // ein FileObject gesetzt hat
    void SetTransferPriority( USHORT nPrio );

    // Skalieren einer Image-Map: Die Image-Map wird um den Faktor
    // zwischen Grafik-Groesse und Rahmen-Groesse vergroessert/verkleinert
    void ScaleImageMap();

    // returns the with our graphic attributes filled Graphic-Attr-Structure
    GraphicAttr& GetGraphicAttr( GraphicAttr&, const SwFrm* pFrm ) const;

#endif
};

/*  */
#else
// USE_GRFOBJECT

// --------------------
// SwGrfNode
// --------------------
class SwGrfNode: public SwNoTxtNode
{
    friend class SwNodes;
    friend class SwGrfFrm;
    friend class SwGraphicAccess;

    Graphic aGraphic;
    SvBaseLinkRef refLink;      // falls Grafik nur als Link, dann Pointer gesetzt
    Size nGrfSize;
    String aStrmName;           // SW3: Name des Storage-Streams fuer Embedded
    String aNewStrmName;        // SW3: name des Storage-Streams bei SaveAs
    String aLowResGrf;          // HTML: LowRes Grafik (Ersatzdarstellung bis
                                //      die normale (HighRes) geladen ist.

    const void *pCchMagic;      // "MagicNumber" innerhalb des Grafikcaches
    USHORT nCchIndex;           // Index im Grafikcache

    BOOL bTransparentFlagValid  :1;
    BOOL bIsTransparent         :1;
    BOOL bInSwapIn              :1;
    BOOL bGrafikArrived         :1;
    BOOL bChgTwipSize           :1;
    BOOL bLoadLowResGrf         :1;
    BOOL bFrameInPaint          :1; //Um Start-/EndActions im Paint (ueber
                                    //SwapIn zu verhindern.
    BOOL bScaleImageMap         :1; //Image-Map in SetTwipSize skalieren

    SwGrfNode( const SwNodeIndex& rWhere,
               const String& rGrfName, const String& rFltName,
               const Graphic* pGraphic,
               SwGrfFmtColl* pGrfColl,
               SwAttrSet* pAutoAttr = 0 );
    // Ctor fuer Einlesen (SW/G) ohne Grafik
    SwGrfNode( const SwNodeIndex& rWhere,
               const String& rGrfName, const String& rFltName,
               SwGrfFmtColl* pGrfColl,
               SwAttrSet* pAutoAttr = 0 );

    void InsertLink( const String& rGrfName, const String& rFltName );
    void DelStreamName();

    void Impl_IsTransparent();

public:
    ~SwGrfNode();

    const Graphic& GetGrf() const  { return aGraphic; }

    virtual SwCntntNode *SplitNode( const SwPosition & );

    virtual Size GetTwipSize() const;
#ifndef _FESHVIEW_ONLY_INLINE_NEEDED
    void SetTwipSize( const Size& rSz );

    inline BOOL IsTransparent() const;
    inline void InvalidateTransparentFlag() { bTransparentFlagValid = FALSE; }
    inline void SetTransparent( BOOL bFlag )
        { bIsTransparent = bFlag, bTransparentFlagValid = TRUE; }

    inline BOOL IsChgTwipSize() const           { return bChgTwipSize; }
    inline void SetChgTwipSize( BOOL b )        { bChgTwipSize = b; }

    inline BOOL IsGrafikArrived() const         { return bGrafikArrived; }
    inline void SetGrafikArrived( BOOL b )      { bGrafikArrived = b; }

    inline BOOL IsFrameInPaint() const          { return bFrameInPaint; }
    inline void SetFrameInPaint( BOOL b )       { bFrameInPaint = b; }

    inline BOOL IsScaleImageMap() const         { return bScaleImageMap; }
    inline void SetScaleImageMap( BOOL b )      { bScaleImageMap = b; }

    inline void SetCacheFlags( const void* p, USHORT nIdx = 0 )
        {   pCchMagic = p;  nCchIndex = nIdx;   }
    void ClearQBmpCache();
    inline BOOL HasMagicId() const              { return 0 != pCchMagic; }

    // alles fuers Laden der LowRes-Grafiken
    inline BOOL IsLoadLowResGrf() const         { return bLoadLowResGrf; }
    inline void SetLoadLowResGrf( BOOL b )      { bLoadLowResGrf = b; }
    const String& GetLowResGrfName() const      { return aLowResGrf; }
    void SetLowResGrfName( const String& r )    { aLowResGrf = r; }
#endif
        // steht in ndcopy.cxx
    virtual SwCntntNode* MakeCopy( SwDoc*, const SwNodeIndex& ) const;
        // erneutes Einlesen, falls Graphic nicht Ok ist. Die
        // aktuelle wird durch die neue ersetzt.
#ifndef _FESHVIEW_ONLY_INLINE_NEEDED
    BOOL ReRead( const String& rGrfName, const String& rFltName,
                  const Graphic* pGraphic = 0, BOOL bModify = TRUE );
        // Laden der Grafik unmittelbar vor der Anzeige
    short SwapIn( BOOL bWaitForData = FALSE );
        // Entfernen der Grafik, um Speicher freizugeben
    short SwapOut();
        // Schreiben der Grafik
    BOOL StoreGraphics( SvStorage* pDocStg = NULL );
        // Zugriff auf den Storage-Streamnamen
    const String& GetStreamName() const;
    void SetStreamName( const String& r ) { aStrmName = r; }
    void SaveCompleted( BOOL bClear );
#endif

        // Der Grafik sagen, dass sich der Node im Undobereich befindet
    virtual BOOL SavePersistentData();
    virtual BOOL RestorePersistentData();

#ifndef _FESHVIEW_ONLY_INLINE_NEEDED
        // Abfrage der Link-Daten
    BOOL IsGrfLink() const                  { return refLink.Is(); }
    inline BOOL IsLinkedFile() const;
    inline BOOL IsLinkedDDE() const;
    SvBaseLinkRef GetLink() const               { return refLink; }
    BOOL GetFileFilterNms( String* pFileNm, String* pFilterNm ) const;
    void ReleaseLink();

        // Prioritaet beim Laden der Grafik setzen. Geht nur, wenn der Link
        // ein FileObject gesetzt hat
    void SetTransferPriority( USHORT nPrio );

    // Skalieren einer Image-Map: Die Image-Map wird um den Faktor
    // zwischen Grafik-Groesse und Rahmen-Groesse vergroessert/verkleinert
    void ScaleImageMap();
#endif
};

#ifndef _FESHVIEW_ONLY_INLINE_NEEDED
inline BOOL SwGrfNode::IsTransparent() const
{
    if ( !bTransparentFlagValid )
        ((SwGrfNode*)this)->Impl_IsTransparent();
    return bIsTransparent;
}
// fuer den Zugriff auf die CacheDaten
BOOL FindGrfSizeFromCache( const String& rGrfName, Size& rGrfSz );
#endif

/*  */
#endif
// USE_GRFOBJECT

// ----------------------------------------------------------------------
// Inline Metoden aus Node.hxx - erst hier ist der TxtNode bekannt !!
inline       SwGrfNode   *SwNode::GetGrfNode()
{
     return ND_GRFNODE == nNodeType ? (SwGrfNode*)this : 0;
}
inline const SwGrfNode   *SwNode::GetGrfNode() const
{
     return ND_GRFNODE == nNodeType ? (const SwGrfNode*)this : 0;
}

#ifndef _FESHVIEW_ONLY_INLINE_NEEDED
inline BOOL SwGrfNode::IsLinkedFile() const
{
    return refLink.Is() && OBJECT_CLIENT_GRF == refLink->GetObjType();
}
inline BOOL SwGrfNode::IsLinkedDDE() const
{
    return refLink.Is() && OBJECT_CLIENT_DDE == refLink->GetObjType();
}
#endif


#endif
diff --git a/sw/inc/ndhints.hxx b/sw/inc/ndhints.hxx
new file mode 100644
index 0000000..abd81a8
--- /dev/null
+++ b/sw/inc/ndhints.hxx
@@ -0,0 +1,260 @@
/*************************************************************************
 *
 *  $RCSfile: ndhints.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:27 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _NDHINTS_HXX
#define _NDHINTS_HXX


#ifndef _SVARRAY_HXX //autogen
#include <svtools/svarray.hxx>
#endif

#ifndef _SVMEMPOOL_HXX //autogen
#include <tools/mempool.hxx>
#endif

#include "numrule.hxx"

class SwTxtNode;
class SwRegHistory;                 // steht im RolBck.hxx
class SwTxtAttr;

/*
 * Ableitung der Klasse SwpHints ueber den Umweg ueber SwpHts, da
 * lediglich die Klasse SwTxtNode Attribute einfuegen und
 * loeschen koennen soll. Anderen Klassen wie den Frames steht
 * lediglich ein lesender Zugriff ueber den Index-Operator zur
 * Verfuegung.
 * Groesse beim Anlegen gleich 1, weil nur dann ein Array erzeug wird, wenn
 * auch ein Hint eingefuegt wird.
 */

/*************************************************************************
 *                      class SwpHtStart/End
 *************************************************************************/

SV_DECL_PTRARR_SORT(SwpHtStart,SwTxtAttr*,1,1)
SV_DECL_PTRARR_SORT(SwpHtEnd,SwTxtAttr*,1,1)

/*************************************************************************
 *                      class SwpHintsArr
 *************************************************************************/

// Das neue Hintsarray:
class SwpHintsArr : private SwpHtStart
{

protected:
    SwpHtEnd aHtEnd;

public:
    void Insert( const SwTxtAttr *pHt );
    void Delete( const SwTxtAttr *pHt );
    void DeleteAtPos( const USHORT nPosInStart );
    BOOL Resort();
    SwTxtAttr *Cut( const USHORT nPosInStart );

    inline const SwTxtAttr *GetStart( const USHORT nPos ) const { return (*this)[nPos]; }
    inline const SwTxtAttr *GetEnd( const USHORT nPos ) const { return aHtEnd[nPos]; }
    inline SwTxtAttr *GetStart( const USHORT nPos ) { return GetHt(nPos); }
    inline SwTxtAttr *GetEnd( const USHORT nPos ) { return aHtEnd[nPos]; }
    inline USHORT GetEndCount() const { return aHtEnd.Count(); }
    inline USHORT GetStartCount() const { return Count(); }
    inline USHORT GetStartOf( const SwTxtAttr *pHt ) const;
    inline USHORT GetEndOf( const SwTxtAttr *pHt ) const;
    inline USHORT GetPos( const SwTxtAttr *pHt ) const
//  OS: in svmem.hxx wird fuer TCPP GetPos ohne const gerufen
#ifdef TCPP
        { return SwpHtStart::GetPos( (SwTxtAttr *)pHt ); }
#else
        { return SwpHtStart::GetPos( pHt ); }
#endif

#ifdef USED
    // Der Zugriffsoperator soll bald nur noch const sein!
    inline SwTxtAttr *operator[]( const USHORT nIdx ) { return SwpHtStart::operator[](nIdx); }
#endif


    inline SwTxtAttr *GetHt( const USHORT nIdx ) { return SwpHtStart::operator[](nIdx); }
    inline const SwTxtAttr *operator[]( const USHORT nIdx )const
        { return SwpHtStart::operator[](nIdx); }
    inline USHORT Count() const { return SwpHtStart::Count(); }

    // Methoden vom PtrArr weiterreichen, wird fuer Node::_Cut benoetigt
    const SwTxtAttr** GetData() const  { return SwpHtStart::GetData(); }

#ifndef PRODUCT
    BOOL Check() const;
#endif
};

/*************************************************************************
 *                      class SwpHints
 *************************************************************************/

// Die public-Schnittstelle zum Node hin
class SwpHints: public SwpHintsArr
{
private:
    SwRegHistory* pHistory;
    // Numerierung
    BOOL    bVis    :1;  // HiddenParaFld
    BOOL    bFntChg :1;  // Fontwechsel
    BOOL    bFtn    :1;  // Fussnoten
    BOOL    bInSplitNode: 1;    // TRUE: der Node ist im Split und die Frames
                                // werden verschoben!
    BOOL    bDDEFlds : 1;       // es sind DDE-Felder am TextNode vorhanden
    BOOL    bCalcVis : 1; // bVis ist invalid, CalcVisibleFlag() rufen

    BOOL Resort( const USHORT nPos );
    // loescht Hints, die keinen Zustaendigkeitsbereich mehr haben
    void ClearDummies( SwTxtNode &rNode );
    // Forget signalisiert, dass es ueberfluessig ist, das Attribut einzu-
    // fuegen, da es keinen Zustaendigkeitsbereich haette.
    BOOL Forget( const USHORT i, const USHORT nWhich,
                 const xub_StrLen nStrt, const xub_StrLen nEnd );
    // Merge verschmilzt aneinanderreichende Hints mit gleichen Attributen
    // und gleichen Werten, falls nichts dagegen spricht, d.h. wenn dadurch
    // keine Ueberlappungen mit gleichartigen Attr. entstehen,
    // Ist der Rueckgabewert TRUE, so wurde verschmolzen und dabei u.a. auch
    // ein Resort ausgeloest.
    BOOL Merge( SwTxtNode &rNode );
    // Haelt ein neues Attribut in pHistory fest.
    void NoteInHistory( SwTxtAttr *pAttr, const BOOL bNew = FALSE );

    void CalcFlags( );

    // die Delete Methoden duerfen nur vom TextNode gerufen werden !!
    // Dieser sorgt dafuer, das bei Attributen ohne Ende auch das
    // entsp. Zeichen entfernt wird !!
    friend class SwTxtNode;
    void DeleteAtPos( const USHORT nPos );
    // Ist der Hint schon bekannt, dann suche die Position und loesche ihn.
    // Ist er nicht im Array, so gibt es ein ASSERT !!
    void Delete( SwTxtAttr* pTxtHt );

public:
    inline BOOL CanBeDeleted() const { return !Count(); }

    // damit das SwDoc::Undo ueber alle Attributaenderungen informiert
    // wird, gibt es hier einen Pointer auf die History. Nur wenn dieser
    // != 0 ist, muessen alle Attributaenderungen "gemeldet" werden.
    void Register( SwRegHistory* pHist ) { pHistory = pHist; }
    void DeRegister() { Register(0); }

    void Insert( SwTxtAttr *pHt, SwTxtNode &rNode, USHORT nMode = 0 );

    USHORT GetLang( const xub_StrLen nBegin, const xub_StrLen nLen) const;
    inline void SetCalcVisible(){ bCalcVis = TRUE; }
    inline void SetVisible( const BOOL bNew )  { bVis = bNew; }
    inline BOOL IsVisible() const
        { if( bCalcVis ) ((SwpHints*)this)->CalcVisibleFlag(); return bVis; }
    inline BOOL HasFntChg() const { return bFntChg; }
    inline BOOL HasFtn() const { return bFtn; }
    inline BOOL IsInSplitNode() const { return bInSplitNode; }
    inline BOOL HasDDEFld() const { return bDDEFlds; }

    // Konstruktor  (wird im nur einmal benutzt!)
    SwpHints()
    {
        pHistory = 0;
        bFntChg = bVis = TRUE;
        bDDEFlds = bFtn = bInSplitNode = bCalcVis = FALSE;
    }

    // Berechnung von bVis, return-Wert TRUE bei Aenderung
    BOOL CalcVisibleFlag();

    DECL_FIXEDMEMPOOL_NEWDEL(SwpHints)
};

// Ausgabeoperator fuer die Texthints
SvStream &operator<<(SvStream &aS, const SwpHints &rHints); //$ ostream

/*************************************************************************
 *                       Inline-Implementationen
 *************************************************************************/

inline USHORT SwpHintsArr::GetStartOf( const SwTxtAttr *pHt ) const
{
    USHORT nPos;
    if( !Seek_Entry( pHt, &nPos ) )
        nPos = USHRT_MAX;
    return nPos;
}

inline USHORT SwpHintsArr::GetEndOf( const SwTxtAttr *pHt ) const
{
    USHORT nPos;
    if( !aHtEnd.Seek_Entry( pHt, &nPos ) )
        nPos = USHRT_MAX;
    return nPos;
}

inline SwTxtAttr *SwpHintsArr::Cut( const USHORT nPosInStart )
{
    SwTxtAttr *pHt = GetHt(nPosInStart);
    DeleteAtPos( nPosInStart );
    return pHt;
}


#endif
diff --git a/sw/inc/ndindex.hxx b/sw/inc/ndindex.hxx
new file mode 100644
index 0000000..d4eaf6a
--- /dev/null
+++ b/sw/inc/ndindex.hxx
@@ -0,0 +1,312 @@
/*************************************************************************
 *
 *  $RCSfile: ndindex.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:27 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _NDINDEX_HXX
#define _NDINDEX_HXX

#include <limits.h>
#ifndef _SOLAR_H
#include <tools/solar.h>
#endif

#include "node.hxx"
#include "ndarr.hxx"

class SwNode;
class SwNodes;

class SwNodeIndex
{
    friend void SwNodes::RegisterIndex( SwNodeIndex& );
    friend void SwNodes::DeRegisterIndex( SwNodeIndex& );
    friend void SwNodes::RemoveNode( ULONG, ULONG, FASTBOOL );

#ifndef PRODUCT
    static int nSerial;
    int MySerial;
#endif

    SwNode* pNd;
    SwNodeIndex *pNext, *pPrev;

    void Remove();                  // Ausketten

    // diese sind nicht erlaubt!
    SwNodeIndex( SwNodes& rNds, USHORT nIdx );
    SwNodeIndex( SwNodes& rNds, int nIdx );

public:
    SwNodeIndex( SwNodes& rNds, ULONG nIdx = 0 );
    SwNodeIndex( const SwNodeIndex &, long nDiff = 0 );
    SwNodeIndex( const SwNode&, long nDiff = 0 );
    ~SwNodeIndex() { Remove(); }

    inline ULONG operator++();
    inline ULONG operator--();
#ifndef CFRONT
    inline ULONG operator++(int);
    inline ULONG operator--(int);
#endif

    inline ULONG operator+=( ULONG );
    inline ULONG operator-=( ULONG );
    inline ULONG operator+=( const  SwNodeIndex& );
    inline ULONG operator-=( const SwNodeIndex& );

    inline BOOL operator< ( const SwNodeIndex& ) const;
    inline BOOL operator<=( const SwNodeIndex& ) const;
    inline BOOL operator> ( const SwNodeIndex& ) const;
    inline BOOL operator>=( const SwNodeIndex& ) const;
    inline BOOL operator==( const SwNodeIndex& ) const;
    inline BOOL operator!=( const SwNodeIndex& ) const;

    inline BOOL operator< ( ULONG nWert ) const;
    inline BOOL operator<=( ULONG nWert ) const;
    inline BOOL operator> ( ULONG nWert ) const;
    inline BOOL operator>=( ULONG nWert ) const;
    inline BOOL operator==( ULONG nWert ) const;
    inline BOOL operator!=( ULONG nWert ) const;

    inline SwNodeIndex& operator=( ULONG );
           SwNodeIndex& operator=( const SwNodeIndex& );
           SwNodeIndex& operator=( const SwNode& );

    // gebe den Wert vom Index als ULONG zurueck
    inline ULONG GetIndex() const;

    // ermoeglicht Zuweisungen ohne Erzeugen eines temporaeren Objektes
    SwNodeIndex& Assign( SwNodes& rNds, ULONG );
    SwNodeIndex& Assign( const SwNode& rNd, long nOffset = 0 );

        // Herausgabe des Pointers auf das NodesArray,
    inline const SwNodes& GetNodes() const;
    inline       SwNodes& GetNodes();

    SwNode& GetNode() const { return *pNd; }
};

/*
 * SwRange
 */
class SwNodeRange
{
public:
    SwNodeIndex aStart;
    SwNodeIndex aEnd;

    SwNodeRange( const SwNodeIndex &rS, const SwNodeIndex &rE );
    SwNodeRange( const SwNodeRange &rRange );

    SwNodeRange( SwNodes& rArr, ULONG nSttIdx = 0, ULONG nEndIdx = 0 );
    SwNodeRange( const SwNodeIndex& rS, long nSttDiff,
                 const SwNodeIndex& rE, long nEndDiff = 0 );
    SwNodeRange( const SwNode& rS, long nSttDiff,
                 const SwNode& rE, long nEndDiff = 0 );
};




// fuer die inlines wird aber der node.hxx benoetigt. Dieses braucht aber
// auch wieder dieses. Also alle Inlines, die auf pNd zugreifen werden
// hier implementiert.

inline ULONG SwNodeIndex::GetIndex() const
{
    return pNd->GetIndex();
}
inline const SwNodes& SwNodeIndex::GetNodes() const
{
    return pNd->GetNodes();
}
inline SwNodes& SwNodeIndex::GetNodes()
{
    return pNd->GetNodes();
}
inline BOOL SwNodeIndex::operator< ( ULONG nWert ) const
{
    return pNd->GetIndex() < nWert;
}
inline BOOL SwNodeIndex::operator<=( ULONG nWert ) const
{
    return pNd->GetIndex() <= nWert;
}
inline BOOL SwNodeIndex::operator> ( ULONG nWert ) const
{
    return pNd->GetIndex() > nWert;
}
inline BOOL SwNodeIndex::operator>=( ULONG nWert ) const
{
    return pNd->GetIndex() >= nWert;
}
inline BOOL SwNodeIndex::operator==( ULONG nWert ) const
{
    return pNd->GetIndex() == nWert;
}
inline BOOL SwNodeIndex::operator!=( ULONG nWert ) const
{
    return pNd->GetIndex() != nWert;
}
inline BOOL SwNodeIndex::operator<( const SwNodeIndex& rIndex ) const
{
    return pNd->GetIndex() < rIndex.GetIndex();
}
inline BOOL SwNodeIndex::operator<=( const SwNodeIndex& rIndex ) const
{
    return pNd->GetIndex() <= rIndex.GetIndex();
}
inline BOOL SwNodeIndex::operator>( const SwNodeIndex& rIndex ) const
{
    return pNd->GetIndex() > rIndex.GetIndex();
}
inline BOOL SwNodeIndex::operator>=( const SwNodeIndex& rIndex ) const
{
    return pNd->GetIndex() >= rIndex.GetIndex();
}
inline BOOL SwNodeIndex::operator==( const SwNodeIndex& rIdx ) const
{
    return pNd == rIdx.pNd;
}
inline BOOL SwNodeIndex::operator!=( const SwNodeIndex& rIdx ) const
{
    return pNd != rIdx.pNd;
}

inline ULONG SwNodeIndex::operator++()
{
    return ( pNd = GetNodes()[ pNd->GetIndex()+1 ] )->GetIndex();
}
inline ULONG SwNodeIndex::operator--()
{
    return ( pNd = GetNodes()[ pNd->GetIndex()-1 ] )->GetIndex();
}
#ifndef CFRONT
inline ULONG SwNodeIndex::operator++(int)
{
    ULONG nOldIndex = pNd->GetIndex();
    pNd = GetNodes()[ nOldIndex + 1 ];
    return nOldIndex;
}
inline ULONG SwNodeIndex::operator--(int)
{
    ULONG nOldIndex = pNd->GetIndex();
    pNd = GetNodes()[ nOldIndex - 1 ];
    return nOldIndex;
}
#endif

inline ULONG SwNodeIndex::operator+=( ULONG nWert )
{
    return ( pNd = GetNodes()[ pNd->GetIndex() + nWert ] )->GetIndex();
}
inline ULONG SwNodeIndex::operator-=( ULONG nWert )
{
    return ( pNd = GetNodes()[ pNd->GetIndex() - nWert ] )->GetIndex();
}
inline ULONG SwNodeIndex::operator+=( const  SwNodeIndex& rIndex )
{
    return ( pNd = GetNodes()[ pNd->GetIndex() + rIndex.GetIndex() ] )->GetIndex();
}
inline ULONG SwNodeIndex::operator-=( const SwNodeIndex& rIndex )
{
    return ( pNd = GetNodes()[ pNd->GetIndex() - rIndex.GetIndex() ] )->GetIndex();
}

inline SwNodeIndex& SwNodeIndex::operator=( ULONG nWert )
{
    pNd = GetNodes()[ nWert ];
    return *this;
}



//JP 29.09.97: impl. steht im ndindex.hxx - sollte moeglichst bald auf die
//              neue Schnittstelle angepasst werden
inline SwNode* SwNodes::operator[]( const SwNodeIndex& rIdx ) const
{
    return &rIdx.GetNode();
}


/******************************************************************

    Source Code Control System - Header

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/inc/ndindex.hxx,v 1.1.1.1 2000-09-18 17:14:27 hr Exp $

    Source Code Control System - Update

    $Log: not supported by cvs2svn $
    Revision 1.3  2000/09/18 16:03:23  willem.vandorp
    OpenOffice header added.

    Revision 1.2  2000/09/08 13:24:18  willem.vandorp
    Header and footer replaced

    Revision 1.1  1997/10/09 13:12:34  JP
    Umstellung NodeIndex/-Array/BigPtrArray


      Rev 1.0   09 Oct 1997 15:12:34   JP
   Umstellung NodeIndex/-Array/BigPtrArray

*******************************************************************/

#endif
diff --git a/sw/inc/ndnotxt.hxx b/sw/inc/ndnotxt.hxx
new file mode 100644
index 0000000..523dd39
--- /dev/null
+++ b/sw/inc/ndnotxt.hxx
@@ -0,0 +1,133 @@
/*************************************************************************
 *
 *  $RCSfile: ndnotxt.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:27 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _NDNOTXT_HXX
#define _NDNOTXT_HXX

#include "node.hxx"

class PolyPolygon;

// --------------------
// SwNoTxtNode
// --------------------

class SwNoTxtNode : public SwCntntNode
{
    friend class SwNodes;
    friend class SwNoTxtFrm;

    String aAlternateText;      // alternativer Text  (HTML)

    PolyPolygon *pContour;      // Polygon fuer Konturumlauf

    // erzeugt fuer alle Ableitungen einen AttrSet mit Bereichen
    // fuer Frame- und Grafik-Attributen (wird nur vom SwCntntNode gerufen)
    virtual void NewAttrSet( SwAttrPool& );

    SwNoTxtNode( const SwNoTxtNode& );              //nicht erlaubt
    SwNoTxtNode &operator=( const SwNoTxtNode& );   //nicht erlaubt

protected:
    SwNoTxtNode( const SwNodeIndex &rWhere, const BYTE nNdType,
                SwGrfFmtColl *pGrColl, SwAttrSet* pAutoAttr = 0 );

public:
    ~SwNoTxtNode();

    virtual SwCntntFrm *MakeFrm();

    inline SwGrfFmtColl *GetGrfColl() const;

    virtual Size GetTwipSize() const = 0;

    virtual BOOL SavePersistentData();
    virtual BOOL RestorePersistentData();

    // alternativen Text abfragen/setzen
    const String& GetAlternateText() const      { return aAlternateText; }
    void SetAlternateText( const String& rTxt ) { aAlternateText = rTxt; }

    void               SetContour( const PolyPolygon *pPoly );
    const PolyPolygon *HasContour() const { return pContour; }
    void               GetContour( PolyPolygon &rPoly ) const;
    void               CreateContour();

    //Besorgt die Graphic, mit SwapIn fuer GrfNode, per GetData fuer OLE.
    Graphic GetGraphic() const;
};

inline SwGrfFmtColl* SwNoTxtNode::GetGrfColl() const
{
    return (SwGrfFmtColl*)GetRegisteredIn();
}

// Inline Metoden aus Node.hxx - erst hier ist der TxtNode bekannt !!
inline SwNoTxtNode *SwNode::GetNoTxtNode()
{
    return ND_NOTXTNODE & nNodeType ? (SwNoTxtNode*)this : 0;
}
inline const SwNoTxtNode *SwNode::GetNoTxtNode() const
{
    return ND_NOTXTNODE & nNodeType ? (const SwNoTxtNode*)this : 0;
}


#endif  // _NDNOTXT_HXX
diff --git a/sw/inc/ndole.hxx b/sw/inc/ndole.hxx
new file mode 100644
index 0000000..7a00e88
--- /dev/null
+++ b/sw/inc/ndole.hxx
@@ -0,0 +1,217 @@
/*************************************************************************
 *
 *  $RCSfile: ndole.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:27 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _NDOLE_HXX
#define _NDOLE_HXX

#ifndef _SWBASLNK_HXX
#include <swbaslnk.hxx>     // fuer SwBaseLink
#endif
#ifndef _NDNOTXT_HXX
#include <ndnotxt.hxx>
#endif

class SwGrfFmtColl;
class SwDoc;
class SvInPlaceObjectRef;
class SvInPlaceObject;
class SwOLENode;
class SwOLELink;
class SwOLELRUCache;


class SwOLEObj
{
    friend class SwOLENode;

    static SwOLELRUCache* pOLELRU_Cache;

    const SwOLENode* pOLENd;
    SvBaseLinkRef refLink;      // falls Object nur als Link, dann Pointer gesetzt

    //Entweder Ref oder Name sind bekannt, wenn nur der Name bekannt ist, wird
    //dir Ref bei Anforderung durch GetOleRef() vom Sfx besorgt.
    SvInPlaceObjectRef *pOLERef;    //new/delete, damit so2.hxx wegfaellt.
    String aName;

    SwOLEObj( const SwOLEObj& rObj );   //nicht erlaubt.
    SwOLEObj();

    void SetNode( SwOLENode* pNode );

public:
    SwOLEObj( SvInPlaceObject *pObj );
    SwOLEObj( const String &rName );
    ~SwOLEObj();

    // OLE-Object aus dem "Speicher" entfernen
    void Unload();
    BOOL RemovedFromLRU();

#ifndef _FESHVIEW_ONLY_INLINE_NEEDED
    SvInPlaceObjectRef GetOleRef();
    const String &GetName() const { return aName; }

    BOOL IsOleRef() const;  //Damit das Objekt nicht unnoetig geladen werden muss.

    BOOL IsOLELink() const              { return refLink.Is(); }
    inline SwOLELink* GetLink() const;
    inline void SetLink( SwOLELink* pLink );
    void ReleaseLink();

#endif
};


// --------------------
// SwOLENode
// --------------------

struct SwPersistentOleData;

class SwOLENode: public SwNoTxtNode
{
    friend class SwNodes;
    SwOLEObj aOLEObj;
    SwPersistentOleData* pSavedData;
    String sChartTblName;       // bei Chart Objecten: Name der ref. Tabelle
    BOOL   bOLESizeInvalid;     //Soll beim SwDoc::PrtOLENotify beruecksichtig
                                //werden (zum Beispiel kopiert). Ist nicht
                                //Persistent.

    SwOLENode(  const SwNodeIndex &rWhere,
                SvInPlaceObject *,
                SwGrfFmtColl *pGrfColl,
                SwAttrSet* pAutoAttr = 0 );

    SwOLENode(  const SwNodeIndex &rWhere,
                const String &rName,
                SwGrfFmtColl *pGrfColl,
                SwAttrSet* pAutoAttr = 0 );

    // aOLEObj besitzt einen privaten Copy-CTOR, wir brauchen auch einen:
    SwOLENode( const SwOLENode & );

public:
    const SwOLEObj& GetOLEObj() const { return aOLEObj; }
          SwOLEObj& GetOLEObj()       { return aOLEObj; }

    virtual SwCntntNode *SplitNode( const SwPosition & );
        // steht in ndcopy.cxx
    virtual SwCntntNode* MakeCopy( SwDoc*, const SwNodeIndex& ) const;

    virtual Size GetTwipSize() const;

    virtual BOOL SavePersistentData();
    virtual BOOL RestorePersistentData();

    BOOL IsInGlobalDocSection() const;
    BOOL IsOLEObjectDeleted() const;

    BOOL IsOLESizeInvalid() const   { return bOLESizeInvalid; }
    void SetOLESizeInvalid( BOOL b ){ bOLESizeInvalid = b; }

    // OLE-Object aus dem "Speicher" entfernen
    inline void Unload() { aOLEObj.Unload(); }

#ifndef _FESHVIEW_ONLY_INLINE_NEEDED
    const String& GetChartTblName() const       { return sChartTblName; }
    void SetChartTblName( const String& rNm )   { sChartTblName = rNm; }
#endif
};

// --------------------
// SwOLELink
// --------------------

class SwOLELink : public SwBaseLink
{
    friend class Sw3IoImp;
    void SetCacheObj( SvEmbeddedObject * pObj )
        {   SvBaseLink::SetCacheObj( pObj ); }

public:
    SwOLELink( SwOLENode& rNode, SvPseudoObject* pObj )
        : SwBaseLink( aEmptyStr, OBJECT_CLIENT_OLE_CACHE, pObj, &rNode )
        {}

    SwOLELink( SwOLENode& rNode )
        : SwBaseLink( 0, 0, &rNode )
        {}
};


// Inline Metoden aus Node.hxx - erst hier ist der TxtNode bekannt !!
inline SwOLENode *SwNode::GetOLENode()
{
     return ND_OLENODE == nNodeType ? (SwOLENode*)this : 0;
}
inline const SwOLENode *SwNode::GetOLENode() const
{
     return ND_OLENODE == nNodeType ? (const SwOLENode*)this : 0;
}

#ifndef _FESHVIEW_ONLY_INLINE_NEEDED
inline SwOLELink* SwOLEObj::GetLink() const       { return (SwOLELink*)&refLink; }
inline void SwOLEObj::SetLink( SwOLELink* pLink ) { refLink = pLink; }
#endif

#endif  // _NDOLE_HXX

diff --git a/sw/inc/ndtxt.hxx b/sw/inc/ndtxt.hxx
new file mode 100644
index 0000000..19794a0
--- /dev/null
+++ b/sw/inc/ndtxt.hxx
@@ -0,0 +1,377 @@
/*************************************************************************
 *
 *  $RCSfile: ndtxt.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:27 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _NDTXT_HXX
#define _NDTXT_HXX

#ifndef _NODE_HXX
#include <node.hxx>
#endif
#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _NDHINTS_HXX
#include <ndhints.hxx>
#endif
#ifndef _ERRHDL_HXX
#include <errhdl.hxx>
#endif

class SwNumRules;
class SwTxtFmtColl;
class SwCntntFrm;
class SwTxtFld;          // Fuer GetTxtFld()
class SwAttrSet;

struct SwSpellArgs;     // fuer Spell()
class SwInterHyphInfo;  // Hyphenate(), splargs.hxx
class SwWrongList;      // fuer OnlineSpelling
class SwNodeNum;
class OutputDevice;

// Konstanten fuer das Text-Insert:
#define INS_DEFAULT         0x0000 // keine Extras
#define INS_EMPTYEXPAND     0x0001 // leere Hints beim Einfuegen aufspannen
#define INS_NOHINTEXPAND    0x0002 // Hints an der InsPos nicht aufspannen


// --------------------
// SwTxtNode
// --------------------
class SwTxtNode: public SwCntntNode
{
    // fuer das Erzeugen des ersten TextNode
    friend class SwDoc;         // CTOR und AppendTxtNode()
    friend class SwNodes;
    friend class SwTxtFrm;
    friend void SwpHints::Insert( SwTxtAttr*, SwTxtNode&, USHORT );

    //Kann 0 sein, nur dann nicht 0 wenn harte Attribute drin stehen.
    //Also niemals direkt zugreifen!
    SwpHints    *pSwpHints;
    SwWrongList *pWrong;    // Rechtschreibfehler nach Online-Spelling
    SwNodeNum   *pNdNum;    // Numerierung fuer diesen Absatz
    SwNodeNum   *pNdOutl;   // Outline fuer diesen Absatz
    XubString   aText;

    SwTxtNode( const SwNodeIndex &rWhere, SwTxtFmtColl *pTxtColl,
                SwAttrSet* pAutoAttr = 0 );

    // Kopiert die Attribute an nStart nach pDest.
    void CopyAttr( SwTxtNode *pDest, const xub_StrLen nStart, const xub_StrLen nOldPos);

    SwTxtNode* _MakeNewTxtNode( const SwNodeIndex&, BOOL bNext = TRUE,
                                BOOL bChgFollow = TRUE );

    void    _Cut( SwTxtNode *pDest, const SwIndex &rDestStart,
                  const SwIndex &rStart, xub_StrLen nLen, BOOL bUpdate = TRUE );

    SwTxtAttr* MakeTxtAttr( const SfxPoolItem& rNew, xub_StrLen nStt, xub_StrLen nEnd,
                            BOOL bPool = TRUE );

    // Verlagere alles umfassende harte Attribute in den AttrSet des Absatzes
    void MoveTxtAttr_To_AttrSet();  // wird von SplitNode gerufen.

    // lege den spz. AttrSet an
    virtual void NewAttrSet( SwAttrPool& );

    void Replace0xFF( XubString& rTxt, xub_StrLen& rTxtStt,
                        xub_StrLen nEndPos, BOOL bExpandFlds ) const;

public:
    const String& GetTxt() const { return aText; }

    // Zugriff auf SwpHints
    inline       SwpHints &GetSwpHints();
    inline const SwpHints &GetSwpHints() const;
    inline       SwpHints *GetpSwpHints() { return pSwpHints; }
    inline const SwpHints *GetpSwpHints() const { return pSwpHints; }
    void         SetWrong( SwWrongList *pNew );
    inline       SwWrongList *GetWrong() { return pWrong; }
    inline const SwWrongList *GetWrong() const { return pWrong; }
    inline BOOL  HasHints() const { return pSwpHints ? TRUE : FALSE; }
    inline       SwpHints &GetOrCreateSwpHints();

    virtual ~SwTxtNode();

    virtual xub_StrLen Len() const;

    // steht in itratr
    void GetMinMaxSize( ULONG nIndex, ULONG& rMin, ULONG &rMax, ULONG &rAbs,
                        OutputDevice* pOut = 0 ) const;

    /*
     * Einfuegen anderer Datentypen durch Erzeugen eines
     * temporaeren Strings.
     */
    SwTxtNode&  Insert( xub_Unicode c, const SwIndex &rIdx );
    SwTxtNode&  Insert( const XubString &rStr, const SwIndex &rIdx,
                        const USHORT nMode = INS_DEFAULT );

    SwTxtNode&  Erase( const SwIndex &rIdx, xub_StrLen nCount = STRING_LEN,
                       const USHORT nMode = INS_DEFAULT );

    // Aktionen auf Attributen
    // loesche alle TextAttribute die als Attribut im Set vorhanden sind
    // (Set-Pointer != 0 ) oder alle deren Which-Wert mit nWhich mappen
    // oder wenn Which = 0, alle.
    void    RstAttr( const SwIndex &rIdx, xub_StrLen nLen, USHORT nWhich = 0,
                    const SfxItemSet* pSet = 0, BOOL bInclRefToxMark = FALSE );
    void    GCAttr();

    // loesche das Text-Attribut (muss beim Pool abgemeldet werden!)
    void    DestroyAttr( SwTxtAttr* pAttr );

    // loesche alle Attribute aus dem SwpHintsArray.
    void    ClearSwpHintsArr( int bDelAll = TRUE, int bDelFields = TRUE );

    // uebernehme den Pointer auf das Text-Attribut
    BOOL    Insert( SwTxtAttr *pAttr, USHORT nMode = 0 );
    // lege ein neues TextAttribut an und fuege es ins SwpHints-Array ein
    // returne den neuen Pointer (oder 0 bei Fehlern)!
    SwTxtAttr* Insert( const SfxPoolItem& rAttr,
                        xub_StrLen nStt, xub_StrLen nEnd, USHORT nMode = 0 );

    // setze diese Attribute am TextNode. Wird der gesamte Bereich umspannt,
    // dann setze sie nur im AutoAttrSet (SwCntntNode:: SetAttr)
    BOOL SetAttr( const SfxItemSet& rSet,
                    xub_StrLen nStt, xub_StrLen nEnd, USHORT nMode = 0 );
    // erfrage die Attribute vom TextNode ueber den Bereich
    BOOL GetAttr( SfxItemSet& rSet, xub_StrLen nStt, xub_StrLen nEnd,
                    BOOL bOnlyTxtAttr  = FALSE,
                    BOOL bGetFromChrFmt = TRUE ) const;

    // uebertrage Attribute eines AttrSets ( AutoFmt ) in das SwpHintsArray
    void FmtToTxtAttr( SwTxtNode* pNd );

    // loeschen eines einzelnen Attributes (fuer SwUndoAttr)
    // ( nur das Attribut loeschen, dass mit Which,Start und End oder
    //   mit pTxtHint identisch ist (es gibt nur ein gueltiges))
    //  AUSNAHME: ToxMarks !!!
    void    Delete( USHORT nTxtWhich, xub_StrLen nStart, xub_StrLen nEnd = 0 );
    void    Delete( SwTxtAttr * pTxtAttr, BOOL bThisOnly = FALSE );

    // Aktionen auf Text und Attributen
    void    Copy(SwTxtNode *pDest, const SwIndex &rStart, USHORT nLen);
    void    Copy(SwTxtNode *pDest, const SwIndex &rDestStart,
                const SwIndex &rStart, xub_StrLen nLen);
    void    Cut(SwTxtNode *pDest, const SwIndex &rStart, xub_StrLen nLen);
    inline void Cut(SwTxtNode *pDest, const SwIndex &rDestStart,
                    const SwIndex &rStart, xub_StrLen nLen);
    // ersetze im String an Position nIdx das Zeichen
    void Replace( const SwIndex& rStart, xub_Unicode cCh );
    void Replace( const SwIndex& rStart, xub_StrLen nLen, const XubString& rText );

    // virtuelle Methoden aus dem CntntNode
    virtual SwCntntFrm *MakeFrm();
    virtual SwCntntNode *SplitNode( const SwPosition & );
    virtual SwCntntNode *JoinNext();
    virtual SwCntntNode *JoinPrev();

    SwCntntNode *AppendNode( const SwPosition & );

    // setze ggf. das DontExpand-Flag an INet bzw. Zeichenvorlagen
    BOOL DontExpandFmt( const SwIndex& rIdx, BOOL bFlag = TRUE,
                        BOOL bFmtToTxtAttributes = TRUE );

    // gebe das vorgegebene Attribut, welches an der TextPosition (rIdx)
    // gesetzt ist zurueck. Gibt es keines, returne 0-Pointer
    // gesetzt heisst: Start <= rIdx < End
    SwTxtAttr *GetTxtAttr( const SwIndex& rIdx, USHORT nWhichHt,
                           BOOL bExpand = FALSE ) const;

    // Diese Methode liefert nur Textattribute auf der Position nIdx
    // zurueck, die kein EndIdx besitzen und denselben Which besitzen.
    // Ueblicherweise steht an dieser Position ein CH_TXTATR.
    // Bei RES_TXTATR_END entfaellt die Pruefung auf den Which-Wert.
    SwTxtAttr *GetTxtAttr( const xub_StrLen nIdx,
                           const USHORT nWhichHt = RES_TXTATR_END ) const;

    SwTxtFld  *GetTxtFld( const SwIndex& rIdx )
        { return (SwTxtFld *)GetTxtAttr( rIdx, RES_TXTATR_FIELD ); }

    // Aktuelles Wort zurueckliefern
    XubString GetCurWord(xub_StrLen);
    USHORT Spell(SwSpellArgs*);

    inline SwTxtFmtColl *GetTxtColl() const;
    virtual SwFmtColl *ChgFmtColl( SwFmtColl* );
    void _ChgTxtCollUpdateNum( const SwTxtFmtColl* pOld,
                                const SwTxtFmtColl* pNew );

    // kopiere die Collection mit allen Autoformaten zum Dest-Node
    // dieser kann auch in einem anderen Dokument stehen!
    // (Methode steht im ndcopy.cxx!!)
    void CopyCollFmt( SwTxtNode& rDestNd );

    // Numerierung
    const SwNodeNum* UpdateNum( const SwNodeNum& );
    const SwNumRule *GetNumRule() const;
    const SwNodeNum* GetNum() const             { return pNdNum; }
    // OutlineNumerierung
    const SwNodeNum* UpdateOutlineNum( const SwNodeNum& );
    const SwNodeNum* GetOutlineNum() const      { return pNdOutl; }
    void NumRuleChgd();                 // Frames benachrichtigen
    XubString GetNumString() const;     // returnt Outline oder Num - String
    long GetLeftMarginWithNum( BOOL bTxtLeft = FALSE ) const;
    BOOL GetFirstLineOfsWithNum( short& rFirstOffset ) const;

    USHORT GetLang( const xub_StrLen nBegin, const xub_StrLen nLen = 0) const;
        // steht in ndcopy.cxx
    BOOL IsSymbol( const xub_StrLen nBegin ) const; // steht in itratr.cxx
    virtual SwCntntNode* MakeCopy( SwDoc*, const SwNodeIndex& ) const;

    // interaktive Trennung: wir finden den TxtFrm und rufen sein CalcHyph
    BOOL Hyphenate( SwInterHyphInfo &rHyphInf );
    void DelSoftHyph( const xub_StrLen nStart, const xub_StrLen nEnd );

    // Liefert einen String mit expandierten Feldern zurueck
    //   opt. die Kapitel/Nummer-String zurueck
    XubString GetExpandTxt( const xub_StrLen nIdx = 0,
                         const xub_StrLen nLen = STRING_LEN,
                         const BOOL bWithNum = FALSE ) const;
    BOOL GetExpandTxt( SwTxtNode& rDestNd, const SwIndex* pDestIdx = 0,
                        xub_StrLen nIdx = 0, xub_StrLen nLen = STRING_LEN,
                       BOOL bWithNum = FALSE ) const;
    XubString GetRedlineTxt( xub_StrLen nIdx = 0,
                          xub_StrLen nLen = STRING_LEN,
                          BOOL bExpandFlds = FALSE,
                          BOOL bWithNum = FALSE ) const;
    //Liefert fuer die Initalfunktion tatsaechliche Anzahl der Initialzeichen
    //bei nWishLen == 0 die des ersten Wortes
    USHORT GetDropLen( USHORT nWishLen) const;

    // Berechnung des Visible-Flags
    inline BOOL CalcVisibleFlag()
        { if(pSwpHints) return pSwpHints->CalcVisibleFlag(); return FALSE; }
    // Setzen des CalcVisible-Flags
    inline void SetCalcVisible(){ if(pSwpHints) pSwpHints->SetCalcVisible(); }

    // Ist der Absatz sichtbar
    inline BOOL IsVisible() const
        { return pSwpHints ? pSwpHints->IsVisible() : TRUE; }

    // Besitzt der Absatz Fussnoten?
    inline BOOL HasFtn() const {return pSwpHints ? pSwpHints->HasFtn() : FALSE;}

    inline SwTxtAttr* MakeTmpTxtAttr( const SfxPoolItem& rNew )
        { return MakeTxtAttr( rNew, 0, 0, FALSE ); }

    TYPEINFO(); // fuer rtti

    // fuers Umhaengen der TxtFmtCollections (Outline-Nummerierung!!)
    virtual void Modify( SfxPoolItem*, SfxPoolItem* );
//  virtual BOOL GetInfo( SfxPoolItem& ) const;

    // aus SwIndexReg
    virtual void Update( const SwIndex & aPos, USHORT xub_StrLen,
                        BOOL bNegativ = FALSE );

    FASTBOOL IsInSymbolFont( USHORT xub_StrLen ) const;

    DECL_FIXEDMEMPOOL_NEWDEL(SwTxtNode)
};

//-----------------------------------------------------------------------------

inline SwpHints &SwTxtNode::GetSwpHints()
{
    ASSERT_ID( pSwpHints, ERR_NOHINTS);
    return *pSwpHints;
}
inline const SwpHints &SwTxtNode::GetSwpHints() const
{
    ASSERT_ID( pSwpHints, ERR_NOHINTS);
    return *pSwpHints;
}

inline SwpHints& SwTxtNode::GetOrCreateSwpHints()
{
    if( !pSwpHints )
        pSwpHints = new SwpHints;
    return *pSwpHints;
}

inline SwTxtFmtColl* SwTxtNode::GetTxtColl() const
{
    return (SwTxtFmtColl*)GetRegisteredIn();
}

// fuer den IBM-Compiler nicht inlinen wg. 42876
#ifndef ICC
// Inline Metoden aus Node.hxx - erst hier ist der TxtNode bekannt !!
inline       SwTxtNode   *SwNode::GetTxtNode()
{
     return ND_TEXTNODE == nNodeType ? (SwTxtNode*)this : 0;
}
inline const SwTxtNode   *SwNode::GetTxtNode() const
{
     return ND_TEXTNODE == nNodeType ? (const SwTxtNode*)this : 0;
}

#endif
inline void SwTxtNode::Cut(SwTxtNode *pDest, const SwIndex &rDestStart,
                            const SwIndex &rStart, xub_StrLen nLen)
{
    _Cut( pDest, rDestStart, rStart, nLen, TRUE );
}


#endif
diff --git a/sw/inc/ndtyp.hxx b/sw/inc/ndtyp.hxx
new file mode 100644
index 0000000..5133cad
--- /dev/null
+++ b/sw/inc/ndtyp.hxx
@@ -0,0 +1,105 @@
/*************************************************************************
 *
 *  $RCSfile: ndtyp.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:27 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _NDTYP_HXX
#define _NDTYP_HXX

#ifndef _SOLAR_H
#include <tools/solar.h>
#endif

// Ids fuer die verschiedenden Nodes; in der Basisklasse steht der Member,
// der angibt, um was fuer einen es sich handelt
const BYTE ND_ENDNODE       = 0x01;
const BYTE ND_STARTNODE     = 0x02;
const BYTE ND_TABLENODE     = 0x06;
const BYTE ND_TEXTNODE      = 0x08;
const BYTE ND_GRFNODE       = 0x10;
const BYTE ND_OLENODE       = 0x20;

const BYTE ND_CONTENTNODE   = 0x38; // ContentNode (eines von den 3 Bits)
const BYTE ND_NOTXTNODE     = 0x30; // NoTxtNode (eines von den 2 Bits)

const BYTE ND_SECTIONNODE   = 0x42;
// nur fuer internen Gebrauch!!
const BYTE ND_SECTIONDUMMY  = 0x40; //(ND_SECTIONNODE & ~ND_STARTNODE);

// spezielle Types der StartNodes, die keine Ableitungen sind, aber
// "Bereiche" zusammenhalten.
enum SwStartNodeType
{
    SwNormalStartNode = 0,
    SwTableBoxStartNode,
    SwFlyStartNode,
    SwFootnoteStartNode,
    SwHeaderStartNode,
    SwFooterStartNode
};

// is the node the first and/or last node of a section?
// This information is used for the export filters. Our layout never have a
// distance before or after if the node is the first or last in a section.
const BYTE ND_HAS_PREV_LAYNODE = 0x01;
const BYTE ND_HAS_NEXT_LAYNODE = 0x02;



#endif
diff --git a/sw/inc/newhdl.hxx b/sw/inc/newhdl.hxx
new file mode 100644
index 0000000..ac0ecdf
--- /dev/null
+++ b/sw/inc/newhdl.hxx
@@ -0,0 +1,108 @@
/*************************************************************************
 *
 *  $RCSfile: newhdl.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:27 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _NEWHDL_HXX
#define _NEWHDL_HXX

#ifndef _LINK_HXX //autogen
#include <tools/link.hxx>
#endif

#include "errhdl.hxx"       // hier kommt auch swtypes rein, was ich brauche

// ----------------------------------------------------------------------------

extern void SW_NEW_HDL();

class SwNewHdl
{
        friend void SW_NEW_HDL();
private:
        char*           pWarnMem;
        char*           pExceptMem;
        Link            aWarnLnk;
        Link            aErrLnk;
public:
        void    SetWarnLnk( const Link &rLink );
        void    SetErrLnk( const Link &rLink );

        BOOL    TryWarnMem();

        BOOL    Flush_WarnMem();
        BOOL    Flush_ExceptMem();

        SwNewHdl();
        ~SwNewHdl();
};

/******************************************************************************
 *  INLINE
 ******************************************************************************/
inline void SwNewHdl::SetWarnLnk( const Link &rLink )
{
    aWarnLnk = rLink;
}

inline void SwNewHdl::SetErrLnk( const Link &rLink )
{
    aErrLnk = rLink;
}

#endif
diff --git a/sw/inc/node.hxx b/sw/inc/node.hxx
new file mode 100644
index 0000000..a9eb658
--- /dev/null
+++ b/sw/inc/node.hxx
@@ -0,0 +1,726 @@
/*************************************************************************
 *
 *  $RCSfile: node.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:27 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _NODE_HXX
#define _NODE_HXX


#ifndef _SVMEMPOOL_HXX //autogen
#include <tools/mempool.hxx>
#endif
#ifndef _GEN_HXX //autogen
#include <tools/gen.hxx>
#endif

#ifndef _NDARR_HXX
#include <ndarr.hxx>
#endif
#ifndef _NDTYP_HXX
#include <ndtyp.hxx>
#endif
#ifndef _INDEX_HXX
#include <index.hxx>
#endif
#ifndef _FMTCOL_HXX
#include <fmtcol.hxx>
#endif

// ---------------------
// forward Deklarationen
// ---------------------

class SvUShorts;
class SwCntntFrm;
class SwCntntNode;
class SwDoc;
class SwEndNode;
class SwFrm;
class SwFrmFmt;
class SwGrfNode;
class SwNoTxtNode;
class SwNodeIndex;
class SwNodeRange;
class SwOLENode;
class SwRect;
class SwSection;
class SwSectionFmt;
class SwSectionNode;
class SwStartNode;
class SwTabFrm;
class SwTable;
class SwTableNode;
class SwTableBox;
class SwTxtNode;
class SwPageDesc;
class ViewShell;
struct SwPosition;

// --------------------
// class SwNode
// --------------------
class SwNode : private /* public*/ BigPtrEntry
{
    friend class SwNodes;

    BYTE nNodeType;
    BOOL bWrongDirty : 1;       // Ist das Wrong-Feld auf invalid? (nur TxtNodes)
    BOOL bACmplWrdDirty : 1;    // die ACompl-Liste muss angepasst werden (erstmal nur TxtNodes)

    // JP 28.03.96
    // fuer Textnodes: Stufungslevel der Autoformatierung. Ist erstmal hier
    //                  gelandet, weil noch Bits frei sind
    BYTE nAFmtNumLvl : 3;
    BYTE nSetNumLSpace : 1;     // fuer Numerierung: TRUE Einzug setzen

protected:
    SwStartNode* pStartOfSection;

    SwNode( const SwNodeIndex &rWhere, const BYTE nNodeId );

    // fuer den initialen StartNode
    SwNode( SwNodes& rNodes, ULONG nPos, const BYTE nNodeId );

public:
    virtual ~SwNode();

    USHORT GetSectionLevel() const;
    inline ULONG StartOfSectionIndex() const;
    inline const SwStartNode* StartOfSectionNode() const;
    inline       SwStartNode* StartOfSectionNode();
    inline ULONG EndOfSectionIndex() const;
    inline const SwEndNode* EndOfSectionNode() const;
    inline       SwEndNode* EndOfSectionNode();

    inline const BOOL IsWrongDirty() const      { return bWrongDirty; }
    inline void SetWrongDirty( BOOL bNew )      { bWrongDirty = bNew; }

    inline const BOOL IsAutoCompleteWordDirty() const   { return bACmplWrdDirty; }
    inline void SetAutoCompleteWordDirty( BOOL bNew )   { bACmplWrdDirty = bNew; }

    inline const BYTE GetAutoFmtLvl() const     { return nAFmtNumLvl; }
    inline void SetAutoFmtLvl( BYTE nVal )      { nAFmtNumLvl = nVal; }

    inline const BOOL IsSetNumLSpace() const    { return 0 != nSetNumLSpace; }
    inline void SetNumLSpace( BOOL bFlag )      { nSetNumLSpace = bFlag ? 1 : 0; }

    BYTE    GetNodeType() const { return nNodeType; }

    inline       SwStartNode *GetStartNode();
    inline const SwStartNode *GetStartNode() const;
    inline       SwCntntNode *GetCntntNode();
    inline const SwCntntNode *GetCntntNode() const;
    inline       SwEndNode   *GetEndNode();
    inline const SwEndNode   *GetEndNode() const;
#ifndef  ICC
    inline
#endif
    SwTxtNode   *GetTxtNode();

#ifndef  ICC
    inline
#endif
    const SwTxtNode   *GetTxtNode() const;
#ifndef COMPACT
    inline       SwOLENode   *GetOLENode();
    inline const SwOLENode   *GetOLENode() const;
    inline       SwNoTxtNode *GetNoTxtNode();
    inline const SwNoTxtNode *GetNoTxtNode() const;
    inline       SwGrfNode   *GetGrfNode();
    inline const SwGrfNode   *GetGrfNode() const;
#endif
    inline       SwTableNode *GetTableNode();
    inline const SwTableNode *GetTableNode() const;
    inline       SwSectionNode *GetSectionNode();
    inline const SwSectionNode *GetSectionNode() const;

    inline BOOL IsStartNode() const;
    inline BOOL IsCntntNode() const;
    inline BOOL IsEndNode() const;
    inline BOOL IsTxtNode() const;
    inline BOOL IsTableNode() const;
    inline BOOL IsSectionNode() const;
#ifndef COMPACT
    inline BOOL IsOLENode() const;
    inline BOOL IsNoTxtNode() const;
    inline BOOL IsGrfNode() const;
#endif

    // suche den TabellenNode, in dem dieser steht. Wenn in keiner
    // Tabelle wird 0 returnt.
                    SwTableNode *FindTableNode();
    inline const    SwTableNode *FindTableNode() const;

    // suche den SectionNode, in dem dieser steht. Wenn es in keiner
    // Section steht wird 0 returnt.
                    SwSectionNode *FindSectionNode();
    inline  const   SwSectionNode *FindSectionNode() const;

    const   SwStartNode *FindStartNode() const  { return pStartOfSection; }
            SwStartNode *FindStartNode()        { return pStartOfSection; }

    SwStartNode* FindSttNodeByType( SwStartNodeType eTyp );
    inline const SwStartNode* FindSttNodeByType( SwStartNodeType eTyp ) const;

    const SwStartNode* FindTableBoxStartNode() const
                        { return FindSttNodeByType( SwTableBoxStartNode ); }
    const SwStartNode* FindFlyStartNode() const
                        { return FindSttNodeByType( SwFlyStartNode ); }
    const SwStartNode* FindFootnoteStartNode() const
                        { return FindSttNodeByType( SwFootnoteStartNode ); }
    const SwStartNode* FindHeaderStartNode() const
                        { return FindSttNodeByType( SwHeaderStartNode ); }
    const SwStartNode* FindFooterStartNode() const
                        { return FindSttNodeByType( SwFooterStartNode ); }

        // in welchem Nodes-Array/Doc steht der Node ?
    inline        SwNodes& GetNodes();
    inline const  SwNodes& GetNodes() const;
    inline          SwDoc* GetDoc();
    inline const    SwDoc* GetDoc() const;

    // liegt der Node im Sichtbarenbereich der Shell ?
    BOOL IsVisible( ViewShell* pSh = 0 ) const;
    // befindet sich der Node in einem geschuetzten Bereich?
    BOOL IsInProtectSect() const;
    // befindet sich der Node in irgendetwas geschuetzten ?
    // (Bereich/Rahmen/Tabellenzellen/... incl. des Ankers bei
    //  Rahmen/Fussnoten/..)
    BOOL IsProtect() const;
    // suche den PageDesc, mit dem dieser Node formatiert ist. Wenn das
    // Layout vorhanden ist wird ueber das gesucht, ansonsten gibt es nur
    // die harte Tour ueber die Nodes nach vorne suchen!!
    const SwPageDesc* FindPageDesc( BOOL bCalcLay ) const;

    // falls der Node in einem Fly steht, dann wird das entsprechende Format
    // returnt
    SwFrmFmt* GetFlyFmt() const;

    // liefert das Format, an dem die LayoutFrames des StartNodes registriert sind,
    // wird von SwSectionNode::MakeFrms benutzt
    const SwFrmFmt* GetFrmFmt() const;

    // falls der Node in einer Tabelle steht, dann wird die entsprechende
    // TabellenBox returnt
    SwTableBox* GetTblBox() const;

    inline ULONG GetIndex() const { return GetPos(); }

    const SwTxtNode* FindOutlineNodeOfLevel( BYTE nLvl ) const;

    BYTE HasPrevNextLayNode() const;
    BOOL HasPrevLayNode() const
        { return 0 != (ND_HAS_PREV_LAYNODE & HasPrevNextLayNode()); }
    BOOL HasNextLayNode() const
        { return 0 != (ND_HAS_NEXT_LAYNODE & HasPrevNextLayNode()); }

private:
    // privater Constructor, weil nie kopiert werden darf !!
    SwNode( const SwNode & rNodes );
};

// --------------------
// class SwStartNode
// --------------------
class SwStartNode: public SwNode
{
    friend class SwNode;
    friend class SwNodes;
    friend class SwEndNode;     // um theEndOfSection zu setzen !!

    SwEndNode* pEndOfSection;
    SwStartNodeType eSttNdTyp;

    // fuer den initialen StartNode
    SwStartNode( SwNodes& rNodes, ULONG nPos );

protected:
    SwStartNode( const SwNodeIndex &rWhere,
                 const BYTE nNodeType = ND_STARTNODE,
                 SwStartNodeType = SwNormalStartNode );
public:
    DECL_FIXEDMEMPOOL_NEWDEL(SwStartNode)

    SwStartNodeType GetStartNodeType() const        { return eSttNdTyp; }

    // an alle ContentNodes der Section das ChkCondColl rufen
    void CheckSectionCondColl() const;

private:
    // privater Constructor, weil nie kopiert werden darf !!
    SwStartNode( const SwStartNode & rNode );
};


// --------------------
// class SwEndNode
// --------------------
class SwEndNode : public SwNode
{
    friend class SwNodes;
    friend class SwTableNode;       // um seinen EndNode anlegen zukoennen
    friend class SwSectionNode;     // um seinen EndNode anlegen zukoennen

    // fuer den initialen StartNode
    SwEndNode( SwNodes& rNodes, ULONG nPos, SwStartNode& rSttNd );

protected:
    SwEndNode( const SwNodeIndex &rWhere, SwStartNode& rSttNd );

    DECL_FIXEDMEMPOOL_NEWDEL(SwEndNode)

private:
    // privater Constructor, weil nie kopiert werden darf !!
    SwEndNode( const SwEndNode & rNode );
};


// --------------------
// SwCntntNode
// --------------------
class SwCntntNode: public SwModify, public SwNode, public SwIndexReg
{
    // Der Reader darf NewAttrSet() aufrufen!
    friend class SwSwgReader;
    friend class Sw3IoImp;

//FEATURE::CONDCOLL
    SwDepend* pCondColl;
//FEATURE::CONDCOLL

protected:
    SwCntntNode( const SwNodeIndex &rWhere, const BYTE nNodeType,
                SwFmtColl *pFmtColl );
    virtual ~SwCntntNode();

    // Attribut-Set fuer alle AUTO-Attribute eines CntntNodes
    //  ( z.B: TxtNode oder NoTxtNode
    SwAttrSet *pAttrSet;
    // lasse von den entsprechenden Nodes die spz. AttrSets anlegen
    virtual void NewAttrSet( SwAttrPool& ) = 0;

public:
    TYPEINFO();     //Bereits in Basisklasse Client drin.

    virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);

    virtual SwCntntFrm *MakeFrm() = 0;
    virtual SwCntntNode *SplitNode(const SwPosition & ) = 0;
    virtual SwCntntNode *JoinNext();
    virtual SwCntntNode *JoinPrev();
    // koennen 2 Nodes zusammengefasst werden ?
    // in pIdx kann die 2. Position returnt werden.
    int CanJoinNext( SwNodeIndex* pIdx =0 ) const;
    int CanJoinPrev( SwNodeIndex* pIdx =0 ) const;

    void MakeStartIndex( SwIndex * pIdx )   { pIdx->Assign( this, 0 ); }
    void MakeEndIndex( SwIndex * pIdx )     { pIdx->Assign( this, Len() ); }

    BOOL GoNext(SwIndex *) const;
    BOOL GoPrevious(SwIndex *) const;

    SwCntntFrm *GetFrm( const Point* pDocPos = 0,
                        const SwPosition *pPos = 0,
                        const BOOL bCalcFrm = TRUE ) const;
    // Gibt die tatsaechlcheGroesse des Frames zurueck bzw. ein leeres
    // Rechteck, wenn kein Layout existiert.
    // Wird fuer die Export Filter benoetigt.
    SwRect FindLayoutRect( const BOOL bPrtArea = FALSE,
                            const Point* pPoint = 0,
                            const BOOL bCalcFrm = FALSE  ) const;
    SwRect FindPageFrmRect( const BOOL bPrtArea = FALSE,
                            const Point* pPoint = 0,
                            const BOOL bCalcFrm = FALSE  ) const;
    /*
     * Methode erzeugt fuer den angegebenen Node alle Ansichten vom
     * Dokument. Die erzeugten Contentframes werden in das entsprechende
     * Layout gehaengt.
     */
    void MakeFrms( SwCntntNode& rNode );
    /*
     * Methode loescht fuer den Node alle Ansichten vom
     * Dokument. Die Contentframes werden aus dem entsprechenden
     * Layout ausgehaengt.
     */
    void DelFrms();

    /*
     * liefert die Anzahl der Elemente des Inhalts des Nodes;
     * Default ist 1, Unterschiede gibt es beim TextNode und beim
     * Formelnode.
     */
    virtual xub_StrLen Len() const;

    virtual SwCntntNode* MakeCopy( SwDoc*, const SwNodeIndex& ) const = 0;
        // erfrage vom Client Informationen
    virtual BOOL GetInfo( SfxPoolItem& ) const;

    // SS fuer die PoolItems: (Harte-(Fmt)Attrbutierung)

    // Ist bInParent FALSE, wird nur in diesem Node nach dem Attribut gesucht.
    const SfxPoolItem& GetAttr( USHORT nWhich, BOOL bInParent=TRUE ) const;
    BOOL GetAttr( SfxItemSet& rSet, BOOL bInParent=TRUE ) const;
    BOOL SetAttr( const SfxPoolItem& );
    BOOL SetAttr( const SfxItemSet& rSet );
    BOOL ResetAttr( USHORT nWhich1, USHORT nWhich2 = 0 );
    BOOL ResetAttr( const SvUShorts& rWhichArr );
    USHORT ResetAllAttr();
    // liefert das Attribut, das nicht ueber die bedingte Vorlage kommt!
    const SfxPoolItem* GetNoCondAttr( USHORT nWhich, BOOL bInParents ) const;

    // hat der Node schon eigene Auto-Attribute ?
    // Zugriff auf SwAttrSet
    inline       SwAttrSet &GetSwAttrSet();
    inline const SwAttrSet &GetSwAttrSet() const;
    inline       SwAttrSet *GetpSwAttrSet() { return pAttrSet; }
    inline const SwAttrSet *GetpSwAttrSet() const { return pAttrSet; }
    inline BOOL  HasSwAttrSet() const { return pAttrSet ? TRUE : FALSE; }

    virtual SwFmtColl* ChgFmtColl( SwFmtColl* );
    SwFmtColl* GetFmtColl() const { return (SwFmtColl*)GetRegisteredIn(); }

//FEATURE::CONDCOLL
    inline SwFmtColl& GetAnyFmtColl() const;
    void SetCondFmtColl( SwFmtColl* );
    inline SwFmtColl* GetCondFmtColl() const;

    BOOL IsAnyCondition( SwCollCondition& rTmp ) const;
    void ChkCondColl();
//FEATURE::CONDCOLL

    // invalidiert die am Node gesetzte NumRule. Diese wird
    // spaetestend in EndAction einer Shell geupdatet
    BOOL InvalidateNumRule();

private:
    // privater Constructor, weil nie kopiert werden darf !!
    SwCntntNode( const SwCntntNode & rNode );
};



//---------
// SwTableNode
//---------
class SwTableNode : public SwStartNode
{
    friend class SwNodes;
    SwTable* pTable;
protected:
    virtual ~SwTableNode();

public:
    SwTableNode( const SwNodeIndex & );

    const SwTable& GetTable() const { return *pTable; }
    SwTable& GetTable() { return *pTable; }
    SwTabFrm *MakeFrm();

    //Legt die Frms fuer den TableNode (also die TabFrms) an.
    void MakeFrms( SwNodeIndex* pIdxBehind );

    //Methode loescht fuer den Node alle Ansichten vom
    //Dokument. Die Contentframes werden aus dem entsprechenden
    //Layout ausgehaengt.
    void DelFrms();

    //Methode erzeugt fuer den vorhergehenden Node alle Ansichten vom
    //Dokument. Die erzeugten Contentframes werden in das entsprechende
    //Layout gehaengt.
    void MakeFrms( const SwNodeIndex & rIdx );

    SwTableNode* MakeCopy( SwDoc*, const SwNodeIndex& ) const;
    void SetNewTable( SwTable* , BOOL bNewFrames=TRUE );

private:
    // privater Constructor, weil nie kopiert werden darf !!
    SwTableNode( const SwTableNode & rNode );
};


//---------
// SwSectionNode
//---------
class SwSectionNode : public SwStartNode
{
    friend class SwNodes;
    SwSection* pSection;
protected:
    virtual ~SwSectionNode();

public:
    SwSectionNode( const SwNodeIndex&, SwSectionFmt& rFmt );

    const SwSection& GetSection() const { return *pSection; }
    SwSection& GetSection() { return *pSection; }

    // setze ein neues SectionObject. Erstmal nur gedacht fuer die
    // neuen VerzeichnisSections. Der geht ueber in den Besitz des Nodes!
    void SetNewSection( SwSection* pNewSection );

    SwFrm *MakeFrm();

    //Legt die Frms fuer den SectionNode (also die SectionFrms) an.
    //Im Defaultfall wird bis die Frames bis zum Ende des Bereichs angelegt,
    //uebergibt man einen weiteren NodeIndex pEnd, so wird bis zu diesem
    //ein MakeFrms gerufen, genutzt wird dies von TableToText
    void MakeFrms( SwNodeIndex* pIdxBehind, SwNodeIndex* pEnd = NULL );

    //Methode loescht fuer den Node alle Ansichten vom
    //Dokument. Die Contentframes werden aus dem entsprechenden
    //Layout ausgehaengt.
    void DelFrms();

    //Methode erzeugt fuer den vorhergehenden Node alle Ansichten vom
    //Dokument. Die erzeugten Contentframes werden in das entsprechende
    //Layout gehaengt.
    void MakeFrms( const SwNodeIndex & rIdx );

    SwSectionNode* MakeCopy( SwDoc*, const SwNodeIndex& ) const;

    // setze den Verweis im Format der Section auf sich selbst
    void NodesArrChgd();

    // ueberprueft bei _nicht_ versteckten Bereichen, ob es Inhalt gibt, der
    // _nicht_ in einem versteckten (Unter-)Bereich liegt
    BOOL IsCntntHidden() const;

private:
    // privater Constructor, weil nie kopiert werden darf !!
    SwSectionNode( const SwSection& rNode );
};



// ---------------------- einige Inline Methoden ----------------------
inline       SwEndNode   *SwNode::GetEndNode()
{
     return ND_ENDNODE == nNodeType ? (SwEndNode*)this : 0;
}
inline const SwEndNode   *SwNode::GetEndNode() const
{
     return ND_ENDNODE == nNodeType ? (const SwEndNode*)this : 0;
}
inline       SwStartNode *SwNode::GetStartNode()
{
     return ND_STARTNODE & nNodeType ? (SwStartNode*)this : 0;
}
inline const SwStartNode *SwNode::GetStartNode() const
{
     return ND_STARTNODE & nNodeType ? (const SwStartNode*)this : 0;
}
inline       SwTableNode *SwNode::GetTableNode()
{
     return ND_TABLENODE == nNodeType ? (SwTableNode*)this : 0;
}
inline const SwTableNode *SwNode::GetTableNode() const
{
     return ND_TABLENODE == nNodeType ? (const SwTableNode*)this : 0;
}
inline       SwSectionNode *SwNode::GetSectionNode()
{
     return ND_SECTIONNODE == nNodeType ? (SwSectionNode*)this : 0;
}
inline const SwSectionNode *SwNode::GetSectionNode() const
{
     return ND_SECTIONNODE == nNodeType ? (const SwSectionNode*)this : 0;
}
inline       SwCntntNode *SwNode::GetCntntNode()
{
     return ND_CONTENTNODE & nNodeType ? (SwCntntNode*)this : 0;
}
inline const SwCntntNode *SwNode::GetCntntNode() const
{
     return ND_CONTENTNODE & nNodeType ? (const SwCntntNode*)this : 0;
}


inline BOOL SwNode::IsStartNode() const
{
    return ND_STARTNODE & nNodeType  ? TRUE : FALSE;
}
inline BOOL SwNode::IsCntntNode() const
{
    return ND_CONTENTNODE & nNodeType  ? TRUE : FALSE;
}
inline BOOL SwNode::IsEndNode() const
{
    return ND_ENDNODE == nNodeType  ? TRUE : FALSE;
}
inline BOOL SwNode::IsTxtNode() const
{
    return ND_TEXTNODE == nNodeType  ? TRUE : FALSE;
}
inline BOOL SwNode::IsTableNode() const
{
    return ND_TABLENODE == nNodeType  ? TRUE : FALSE;
}
inline BOOL SwNode::IsSectionNode() const
{
    return ND_SECTIONNODE == nNodeType  ? TRUE : FALSE;
}
#ifndef COMPACT
inline BOOL SwNode::IsNoTxtNode() const
{
    return ND_NOTXTNODE & nNodeType  ? TRUE : FALSE;
}
inline BOOL SwNode::IsOLENode() const
{
    return ND_OLENODE == nNodeType  ? TRUE : FALSE;
}
inline BOOL SwNode::IsGrfNode() const
{
    return ND_GRFNODE == nNodeType  ? TRUE : FALSE;
}
#endif

inline const SwStartNode* SwNode::FindSttNodeByType( SwStartNodeType eTyp ) const
{
    return ((SwNode*)this)->FindSttNodeByType( eTyp );
}
inline const SwTableNode* SwNode::FindTableNode() const
{
    return ((SwNode*)this)->FindTableNode();
}
inline const SwSectionNode* SwNode::FindSectionNode() const
{
    return ((SwNode*)this)->FindSectionNode();
}
inline ULONG SwNode::StartOfSectionIndex() const
{
    return pStartOfSection->GetIndex();
}
inline const SwStartNode* SwNode::StartOfSectionNode() const
{
    return pStartOfSection;
}
inline SwStartNode* SwNode::StartOfSectionNode()
{
    return pStartOfSection;
}
inline ULONG SwNode::EndOfSectionIndex() const
{
    const SwStartNode* pStNd = IsStartNode() ? (SwStartNode*)this : pStartOfSection;
    return pStNd->pEndOfSection->GetIndex();
}
inline const SwEndNode* SwNode::EndOfSectionNode() const
{
    const SwStartNode* pStNd = IsStartNode() ? (SwStartNode*)this : pStartOfSection;
    return pStNd->pEndOfSection;
}
inline SwEndNode* SwNode::EndOfSectionNode()
{
    SwStartNode* pStNd = IsStartNode() ? (SwStartNode*)this : pStartOfSection;
    return pStNd->pEndOfSection;
}

inline SwNodes& SwNode::GetNodes()
{
    return (SwNodes&)GetArray();
}
inline const SwNodes& SwNode::GetNodes() const
{
    return (SwNodes&)GetArray();
}

inline SwDoc* SwNode::GetDoc()
{
    return GetNodes().GetDoc();
}
inline const SwDoc* SwNode::GetDoc() const
{
    return GetNodes().GetDoc();
}

inline SwFmtColl* SwCntntNode::GetCondFmtColl() const
{
    return pCondColl ? (SwFmtColl*)pCondColl->GetRegisteredIn() : 0;
}


inline SwFmtColl& SwCntntNode::GetAnyFmtColl() const
{
    return pCondColl && pCondColl->GetRegisteredIn()
                ? *(SwFmtColl*)pCondColl->GetRegisteredIn()
                : *(SwFmtColl*)GetRegisteredIn();
}

inline SwAttrSet& SwCntntNode::GetSwAttrSet()
{
    return pAttrSet ? ( (SwAttrSet &) ( *pAttrSet ) )
                    : ( (SwAttrSet &) ( GetAnyFmtColl().GetAttrSet() ) );
}
inline const SwAttrSet& SwCntntNode::GetSwAttrSet() const
{
    return pAttrSet ? ( (SwAttrSet &) ( *pAttrSet ) )
                    : ( (SwAttrSet &) ( GetAnyFmtColl().GetAttrSet() ) );
}
//FEATURE::CONDCOLL

inline const SfxPoolItem& SwCntntNode::GetAttr( USHORT nWhich,
                                                BOOL bInParents ) const
{
    return GetSwAttrSet().Get( nWhich, bInParents );
}




#endif
diff --git a/sw/inc/numrule.hxx b/sw/inc/numrule.hxx
new file mode 100644
index 0000000..cd0ba88
--- /dev/null
+++ b/sw/inc/numrule.hxx
@@ -0,0 +1,422 @@
/*************************************************************************
 *
 *  $RCSfile: numrule.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:27 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _NUMRULE_HXX
#define _NUMRULE_HXX


#ifndef _LINK_HXX //autogen
#include <tools/link.hxx>
#endif
#ifndef _SV_GEN_HXX //autogen wg. Size
#include <tools/gen.hxx>
#endif
#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif
#ifndef _SVX_SVXENUM_HXX //autogen
#include <svx/svxenum.hxx>
#endif

#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _CALBCK_HXX
#include <calbck.hxx>
#endif
#ifndef _ERRHDL_HXX
#include <errhdl.hxx>       // Fuer die inline-ASSERTs
#endif
#ifndef _SWERROR_H
#include <error.h>          // Fuer die inline-ASSERTs
#endif


class Font;
class SvxBrushItem;
class SvxNumberFormat;
class SvxNumRule;
class SwCharFmt;
class SwDoc;
class SwFmtVertOrient;
class SwNodeNum;
class SwTxtNode;

extern char __FAR_DATA sOutlineStr[];   // SWG-Filter

const sal_Unicode cBulletChar   = 0xF000 + 149; // Charakter fuer Aufzaehlungen

inline BYTE GetRealLevel( const BYTE nLvl )
{
    return nLvl & (NO_NUMLEVEL - 1);
}

class SwNumType
{
    void GetRomanStr( ULONG nNo, String& rStr ) const;
    void GetCharStr( ULONG nNo, String& rStr ) const;
    void GetCharStrN( ULONG nNo, String& rStr ) const;
public:
        /* Reihenfolge der Elemente des enums ist fuer die
         * UI-Seite interesssant -- bitte nicht ohne trifftigen
         * Grund und Nachricht an die UI-Seite aendern.
         */
    SvxExtNumType     eType;

    SwNumType() { eType = SVX_NUM_ARABIC; }
    SwNumType( const SwNumType& rType ) : eType( rType.eType ) {}

    String GetNumStr( ULONG nNo ) const;
};


class SwNumFmt : public SwClient, public SwNumType
{
    String      aPrefix;                // vorangestellter Text
    String      aPostfix;               // nachfolgender Text

    // bei eType == USER_BITMAP ist folgendes ganz interessant
    Size        aGrfSize;
    SvxBrushItem* pGrfBrush;
    SwFmtVertOrient* pVertOrient;
    // bei eType == CHAR_SPECIAL ist folgendes ganz interessant
    Font*       pBulletFont;            // Pointer auf den BulletFont

    SvxAdjust   eNumAdjust;             // Ausrichtung (Links/rechts/zent.)
    short       nFirstLineOffset;       // Abstand zwischen Linken Rand und Text
    short       nLSpace;                // relativer linker Rand
    USHORT      nAbsLSpace;             // absoluter linker Rand
    USHORT      nCharTextOffset;        // Abstand zwischen Zeichen und Text
    USHORT      nStart;                 // Startwert fuer die Nummer

    BYTE        nInclUpperLevel;        // wieviele Levels
    sal_Unicode cBullet;                // das Bullet Char
    BOOL        bRelLSpace : 1;         // LSpace als relative Angabe (UI)

    void UpdateNumNodes( SwDoc* pDoc );
    DECL_STATIC_LINK( SwNumFmt, GraphicArrived, void * );

public:
    SwNumFmt();
    SwNumFmt( const SwNumFmt& );
    SwNumFmt( const SvxNumberFormat&, SwDoc* pDoc);
    SvxNumberFormat MakeSvxFormat() const;
    virtual ~SwNumFmt();

    SwNumFmt& operator=( const SwNumFmt& );
    BOOL operator==( const SwNumFmt& ) const;
    BOOL operator!=( const SwNumFmt& r ) const { return !(*this == r); }

    SwCharFmt* GetCharFmt() const { return (SwCharFmt*)pRegisteredIn; }
    void SetCharFmt( SwCharFmt* );
    virtual void Modify( SfxPoolItem* pOld, SfxPoolItem* pNew );

    // ist der Font* == 0, wird der Font nicht gewechselt
    void SetBulletFont(const Font*);
    const Font* GetBulletFont() const           { return pBulletFont; }

    sal_Unicode GetBulletChar() const           { return cBullet; }
    void SetBulletChar( sal_Unicode c )         { cBullet = c; }

//------
// ALT
    BOOL IsInclUpperLevel() const               { return 1 < nInclUpperLevel; }
    void SetInclUpperLevel( BOOL b )            { nInclUpperLevel = b ? MAXLEVEL : 1; }
// ALT
//------
    BYTE GetUpperLevel() const                  { return nInclUpperLevel; }
    void SetUpperLevel( BYTE nValue )           { nInclUpperLevel = nValue; }

    BOOL IsRelLSpace() const                    { return bRelLSpace; }
    void SetRelLSpace( BOOL b )                 { bRelLSpace = b; }

    SvxAdjust GetAdjust() const                 { return eNumAdjust; }
    void SetAdjust( SvxAdjust eAdj )            { eNumAdjust = eAdj; }

    short GetLSpace() const                     { return nLSpace; }
    void SetLSpace( short n )                   { nLSpace = n; }

    USHORT GetAbsLSpace() const                 { return nAbsLSpace; }
    void SetAbsLSpace( USHORT n )               { nAbsLSpace = n; }

    short GetFirstLineOffset() const            { return nFirstLineOffset; }
    void SetFirstLineOffset( short n )          { nFirstLineOffset = n; }

    USHORT GetCharTextOffset() const            { return nCharTextOffset; }
    void SetCharTextOffset( USHORT n )          { nCharTextOffset = n; }

    USHORT GetStartValue() const                { return nStart; }
    void SetStartValue( USHORT n )              { nStart = n; }

    const String& GetPrefix() const             { return aPrefix; }
    void SetPrefix( const String& rS )          { aPrefix = rS; }

    const String& GetPostfix() const            { return aPostfix; }
    void SetPostfix( const String& rS )         { aPostfix = rS; }

    const SvxBrushItem* GetGrfBrush() const     { return pGrfBrush; }
    const SwFmtVertOrient* GetGrfOrient() const { return pVertOrient; }
    const Size& GetGrfSize() const              { return aGrfSize; }
    void SetGrfBrush( const SvxBrushItem* pGrfBr, const Size* pSz,
                        const SwFmtVertOrient* pVOrient );
    void SetGraphic( const String& rName );
    // Graphic ggfs. reinswappen
    const Graphic* GetGraphic() const;
    // kann fuer das Format ein Text erzeugt werden?
    inline BOOL IsTxtFmt() const;
};


enum SwNumRuleType { OUTLINE_RULE = 0, NUM_RULE = 1, RULE_END = 2 };
class SwNumRule
{
    friend void _FinitCore();

    static SwNumFmt* aBaseFmts [ RULE_END ][ MAXLEVEL ];
    static USHORT aDefNumIndents[ MAXLEVEL ];
    static USHORT nRefCount;
    static Font* pDefBulletFont;
    static char* pDefOutlineName;

    SwNumFmt* aFmts[ MAXLEVEL ];
    String sName;
    SwNumRuleType eRuleType;
    USHORT nPoolFmtId;      // Id-fuer "automatich" erzeugte NumRules
    USHORT nPoolHelpId;     // HelpId fuer diese Pool-Vorlage
    BYTE nPoolHlpFileId;    // FilePos ans Doc auf die Vorlagen-Hilfen
    BOOL bAutoRuleFlag : 1;
    BOOL bInvalidRuleFlag : 1;
    BOOL bContinusNum : 1;  // Fortlaufende Numerierung - ohne Ebenen
    BOOL bAbsSpaces : 1;    // die Ebenen repraesentieren absol. Einzuege

    static void _MakeDefBulletFont();

public:
    SwNumRule( const String& rNm, SwNumRuleType = NUM_RULE,
                BOOL bAutoFlg = TRUE );

    SwNumRule( const SwNumRule& );
    ~SwNumRule();

    SwNumRule& operator=( const SwNumRule& );
    BOOL operator==( const SwNumRule& ) const;
    BOOL operator!=( const SwNumRule& r ) const { return !(*this == r); }

    inline const SwNumFmt* GetNumFmt( USHORT i ) const;
    inline const SwNumFmt& Get( USHORT i ) const;
    void Set( USHORT i, const SwNumFmt* );
    void Set( USHORT i, const SwNumFmt& );

    String MakeNumString( const SwNodeNum&, BOOL bInclStrings = TRUE,
                            BOOL bOnlyArabic = FALSE ) const;

    inline unsigned char GetBulletChar( const SwNodeNum& ) const;
    inline const Font* GetBulletFont( const SwNodeNum& ) const;
    static inline const Font& GetDefBulletFont();

    static char* GetOutlineRuleName() { return pDefOutlineName; }

    static inline USHORT GetNumIndent( BYTE nLvl );
    static inline USHORT GetBullIndent( BYTE nLvl );

    SwNumRuleType GetRuleType() const           { return eRuleType; }
    void SetRuleType( SwNumRuleType eNew )      { eRuleType = eNew;
                                                  bInvalidRuleFlag = TRUE; }

    // eine Art Copy-Constructor, damit die Num-Formate auch an den
    // richtigen CharFormaten eines Dokumentes haengen !!
    // (Kopiert die NumFormate und returnt sich selbst)
    SwNumRule& CopyNumRule( SwDoc*, const SwNumRule& );

    // testet ob die CharFormate aus dem angegeben Doc sind und kopiert
    // die gegebenfalls
    void CheckCharFmts( SwDoc* pDoc );

    // test ob der Einzug von dieser Numerierung kommt.
    BOOL IsRuleLSpace( SwTxtNode& rNd ) const;

    const String& GetName() const       { return sName; }
    void SetName( const String& rNm )   { sName = rNm; }

    BOOL IsAutoRule() const             { return bAutoRuleFlag; }
    void SetAutoRule( BOOL bFlag )      { bAutoRuleFlag = bFlag; }

    BOOL IsInvalidRule() const          { return bInvalidRuleFlag; }
    void SetInvalidRule( BOOL bFlag )   { bInvalidRuleFlag = bFlag; }

    BOOL IsContinusNum() const          { return bContinusNum; }
    void SetContinusNum( BOOL bFlag )   { bContinusNum = bFlag; }

    BOOL IsAbsSpaces() const            { return bAbsSpaces; }
    void SetAbsSpaces( BOOL bFlag )     { bAbsSpaces = bFlag; }

    // erfragen und setzen der Poolvorlagen-Id's
    USHORT GetPoolFmtId() const         { return nPoolFmtId; }
    void SetPoolFmtId( USHORT nId )     { nPoolFmtId = nId; }

    // erfragen und setzen der Hilfe-Id's fuer die Document-Vorlagen
    USHORT GetPoolHelpId() const        { return nPoolHelpId; }
    void SetPoolHelpId( USHORT nId )    { nPoolHelpId = nId; }
    BYTE GetPoolHlpFileId() const       { return nPoolHlpFileId; }
    void SetPoolHlpFileId( BYTE nId )   { nPoolHlpFileId = nId; }

    void        SetSvxRule(const SvxNumRule&, SwDoc* pDoc);
    SvxNumRule  MakeSvxNumRule() const;
};


class SwNodeNum
{
    USHORT nLevelVal[ MAXLEVEL ];       // Nummern aller Levels
    USHORT nSetValue;                   // vorgegeben Nummer
    BYTE nMyLevel;                      // akt. Level
    BOOL bStartNum;                     // Numerierung neu starten

public:
    inline SwNodeNum( BYTE nLevel = NO_NUM, USHORT nSetVal = USHRT_MAX );
    inline SwNodeNum& operator=( const SwNodeNum& rCpy );

    BOOL operator==( const SwNodeNum& ) const;

    BYTE GetLevel() const                   { return nMyLevel; }
    void SetLevel( BYTE nVal )              { nMyLevel = nVal; }

    BOOL IsStart() const                    { return bStartNum; }
    void SetStart( BOOL bFlag = TRUE )      { bStartNum = bFlag; }

    USHORT GetSetValue() const              { return nSetValue; }
    void SetSetValue( USHORT nVal )         { nSetValue = nVal; }

    const USHORT* GetLevelVal() const       { return nLevelVal; }
          USHORT* GetLevelVal()             { return nLevelVal; }
};




// ------------ inline Methoden ----------------------------

inline BOOL SwNumFmt::IsTxtFmt() const
{
    return SVX_NUM_NUMBER_NONE != eType &&
           SVX_NUM_CHAR_SPECIAL != eType &&
           SVX_NUM_BITMAP != eType;
}

inline const SwNumFmt& SwNumRule::Get( USHORT i ) const
{
    ASSERT_ID( i < MAXLEVEL && eRuleType < RULE_END, ERR_NUMLEVEL);
    return aFmts[ i ] ? *aFmts[ i ]
                      : *aBaseFmts[ eRuleType ][ i ];
}

inline const SwNumFmt* SwNumRule::GetNumFmt( USHORT i ) const
{
    ASSERT_ID( i < MAXLEVEL && eRuleType < RULE_END, ERR_NUMLEVEL);
    return aFmts[ i ];
}

inline const Font& SwNumRule::GetDefBulletFont()
{
    if( !pDefBulletFont )
        SwNumRule::_MakeDefBulletFont();
    return *pDefBulletFont;
}

inline USHORT SwNumRule::GetNumIndent( BYTE nLvl )
{
    ASSERT( MAXLEVEL > nLvl, "NumLevel is out of range" );
    return aDefNumIndents[ nLvl ];
}
inline USHORT SwNumRule::GetBullIndent( BYTE nLvl )
{
    ASSERT( MAXLEVEL > nLvl, "NumLevel is out of range" );
    return aDefNumIndents[ nLvl ];
}

inline unsigned char SwNumRule::GetBulletChar( const SwNodeNum& rNum ) const
{
    return Get( rNum.GetLevel() & ~NO_NUMLEVEL ).GetBulletChar();
}
inline const Font* SwNumRule::GetBulletFont( const SwNodeNum& rNum ) const
{
    return Get( rNum.GetLevel() & ~NO_NUMLEVEL ).GetBulletFont();
}



SwNodeNum::SwNodeNum( BYTE nLevel, USHORT nSetVal )
    : nMyLevel( nLevel ), nSetValue( nSetVal ), bStartNum( FALSE )
{
    memset( nLevelVal, 0, sizeof( nLevelVal ) );
}

inline SwNodeNum& SwNodeNum::operator=( const SwNodeNum& rCpy )
{
    nSetValue = rCpy.nSetValue;
    nMyLevel = rCpy.nMyLevel;
    bStartNum = rCpy.bStartNum;

    memcpy( nLevelVal, rCpy.nLevelVal, sizeof( nLevelVal ) );
    return *this;
}


#endif  // _NUMRULE_HXX
diff --git a/sw/inc/pagedesc.hxx b/sw/inc/pagedesc.hxx
new file mode 100644
index 0000000..4684ceb
--- /dev/null
+++ b/sw/inc/pagedesc.hxx
@@ -0,0 +1,348 @@
/*************************************************************************
 *
 *  $RCSfile: pagedesc.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:27 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _PAGEDESC_HXX
#define _PAGEDESC_HXX

#ifndef _FRACT_HXX
#include <tools/fract.hxx>
#endif

#ifndef _TOOLS_COLOR_HXX
#include <tools/color.hxx>
#endif
#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif
#ifndef _SWTYPES_HXX
#include <swtypes.hxx>  //fuer SwTwips
#endif
#ifndef _FRMFMT_HXX
#include <frmfmt.hxx>
#endif
#ifndef _NUMRULE_HXX
#include <numrule.hxx>
#endif

class SfxPoolItem;
class SwTxtFmtColl;
class SwNode;

//Adjustierung der Trennlinie.
enum SwFtnAdj
{
    FTNADJ_LEFT,
    FTNADJ_CENTER,
    FTNADJ_RIGHT
};

//Fussnoteninformationen
class SwPageFtnInfo
{
    SwTwips     nMaxHeight;     //Maximalraum auf der Seite.
//  Pen         aPen;           //Pen fuer Trennstrich.
    ULONG       nLineWidth;     //width of separator line
    Color       aLineColor;     //color of the separator line
    Fraction    aWidth;         //Prozentuale Breite des Trennstriches.
    SwFtnAdj    eAdj;           //Ausrichtung des Trennstriches.
    SwTwips     nTopDist;       //Abstand zwischen Body und Trennstrich.
    SwTwips     nBottomDist;    //Abstand zwischen Trennstrich und 1. Fussnote.
public:
    SwTwips     GetHeight() const       { return nMaxHeight; }
    ULONG           GetLineWidth() const { return nLineWidth; }
    const Color&    GetLineColor() const { return aLineColor;}
//  const Pen&  GetPen()    const       { return aPen; }
    const Fraction& GetWidth() const    { return aWidth; }
    SwFtnAdj    GetAdj()    const       { return eAdj; }
    SwTwips     GetTopDist()const       { return nTopDist; }
    SwTwips     GetBottomDist() const   { return nBottomDist; }

    void SetHeight( SwTwips  nNew )     { nMaxHeight = nNew; }
//  void SetPen   ( const Pen& rNew )   { aPen = rNew; }
    void SetLineWidth(ULONG nSet  )     { nLineWidth = nSet; }
    void SetLineColor(const Color& rCol )  { aLineColor = rCol;}
    void SetWidth( const Fraction &rNew){ aWidth = rNew; }
    void SetAdj   ( SwFtnAdj eNew )     { eAdj = eNew; }
    void SetTopDist   ( SwTwips nNew )  { nTopDist = nNew; }
    void SetBottomDist( SwTwips nNew )  { nBottomDist = nNew; }

    SwPageFtnInfo();
    SwPageFtnInfo( const SwPageFtnInfo& );
    SwPageFtnInfo& operator=( const SwPageFtnInfo& );

    BOOL operator ==( const SwPageFtnInfo& ) const;
};

/*
 * Verwendung des UseOnPage (eUse) und der FrmFmt'e
 *
 *  RIGHT   - aMaster nur fuer rechte Seiten, linke  Seiten immer leer.
 *  LEFT    - aLeft fuer linke  Seiten, rechte Seiten immer leer.
 *            aLeft ist eine Kopie des Master.
 *  ALL     - aMaster fuer rechte Seiten, aLeft fuer Linke Seiten.
 *            aLeft ist eine Kopie des Master.
 *  MIRROR  - aMaster fuer rechte Seiten, aLeft fuer linke Seiten.
 *            aLeft ist eine Kopie des Master, Raender sind gespiegelt.
 *
 * UI dreht auschliesslich am Master! aLeft wird beim Chg am Dokument
 * enstprechend dem eUse eingestellt.
 *
 * Damit es die Filter etwas einfacher haben werden weitere Werte im
 * eUse untergebracht:
 *
 * HEADERSHARE - Headerinhalt auf beiden Seiten gleich
 * FOOTERSHARE - Footerinhalt auf beiden Seiten gleich
 *
 * Die Werte werden bei den entsprechenden Get-/Set-Methden ausmaskiert.
 * Zugriff auf das volle eUse inclusive der Header-Footer information
 * per ReadUseOn(), WriteUseOn() (fuer Filter und CopyCTor)!
 *
 * Die FrmFormate fuer Header/Footer werden anhand der Attribute fuer
 * Header/Footer vom UI am Master eingestellt (Hoehe, Raender, Hintergrund...);
 * Header/Footer fuer die Linke Seite werden entsprechen kopiert bzw.
 * gespielt (Chg am Dokument).
 * Das jew. Attribut fuer den Inhalt wird automatisch beim Chg am
 * Dokument versorgt (entsprechen den SHARE-informationen werden Inhalte
 * erzeugt bzw. entfernt).
 *
 */

enum UseOnPage
{   PD_NONE           = 0x0000, //for internal use only.
    PD_LEFT           = 0x0001,
    PD_RIGHT          = 0x0002,
    PD_ALL            = 0x0003,
    PD_MIRROR         = 0x0007,
    PD_HEADERSHARE    = 0x0040,
    PD_FOOTERSHARE    = 0x0080,
    PD_NOHEADERSHARE  = 0x00BF, //for internal use only
    PD_NOFOOTERSHARE  = 0x007F  //for internal use only
};

class SwPageDesc : public SwModify
{
    friend class SwDoc;

    //nicht (mehr) implementiert.
    SwPageDesc& operator=( const SwPageDesc& );

    String      aDescName;
    SwNumType   aNumType;
    SwFrmFmt    aMaster;
    SwFrmFmt    aLeft;
    SwDepend    aDepend;    // wg. Registerhaltigkeit
    SwPageDesc *pFollow;
    USHORT      nRegHeight; // Zeilenabstand und Fontascent der Vorlage
    USHORT      nRegAscent; // fuer die Registerhaltigkeit
    UseOnPage   eUse;
    BOOL        bLandscape;

    //Fussnoteninformationen
    SwPageFtnInfo aFtnInfo;

    //Wird zum Spiegeln vom Chg (Doc) gerufen.
    //Kein Abgleich an anderer Stelle.
    void Mirror();

    SwPageDesc(const String&, SwFrmFmt*, SwDoc *pDc );
public:
    const String &GetName() const { return aDescName; }
          void    SetName( const String& rNewName ) { aDescName = rNewName; }

    BOOL GetLandscape() const { return bLandscape; }
    void SetLandscape( BOOL bNew ) { bLandscape = bNew; }

    const SwNumType &GetNumType() const { return aNumType; }
          void       SetNumType( const SwNumType& rNew ) { aNumType = rNew; }

    const SwPageFtnInfo &GetFtnInfo() const { return aFtnInfo; }
          SwPageFtnInfo &GetFtnInfo()       { return aFtnInfo; }
    void  SetFtnInfo( const SwPageFtnInfo &rNew ) { aFtnInfo = rNew; }

    inline BOOL IsHeaderShared() const;
    inline BOOL IsFooterShared() const;
    inline void ChgHeaderShare( BOOL bNew );
    inline void ChgFooterShare( BOOL bNew );

    inline void      SetUseOn( UseOnPage eNew );
    inline UseOnPage GetUseOn() const;

    void      WriteUseOn( UseOnPage eNew ) { eUse = eNew; }
    UseOnPage ReadUseOn () const { return eUse; }

          SwFrmFmt &GetMaster() { return aMaster; }
          SwFrmFmt &GetLeft()   { return aLeft; }
    const SwFrmFmt &GetMaster() const { return aMaster; }
    const SwFrmFmt &GetLeft()   const { return aLeft; }

    //Mit den folgenden Methoden besorgt sich das Layout ein Format
    //um eine Seite erzeugen zu koennen
    inline SwFrmFmt *GetRightFmt();
    inline const SwFrmFmt *GetRightFmt() const;
    inline SwFrmFmt *GetLeftFmt();
    inline const SwFrmFmt *GetLeftFmt() const;

    USHORT GetRegHeight() const { return nRegHeight; }
    USHORT GetRegAscent() const { return nRegAscent; }
    void SetRegHeight( USHORT nNew ){ nRegHeight = nNew; }
    void SetRegAscent( USHORT nNew ){ nRegAscent = nNew; }

    inline void SetFollow( const SwPageDesc* pNew );
    const SwPageDesc* GetFollow() const { return pFollow; }
          SwPageDesc* GetFollow() { return pFollow; }

    void SetRegisterFmtColl( const SwTxtFmtColl* rFmt );
    const SwTxtFmtColl* GetRegisterFmtColl() const;
    virtual void Modify( SfxPoolItem *pOldValue, SfxPoolItem *pNewValue );
    void RegisterChange();

    // erfragen und setzen der PoolFormat-Id
    USHORT GetPoolFmtId() const         { return aMaster.GetPoolFmtId(); }
    void SetPoolFmtId( USHORT nId )     { aMaster.SetPoolFmtId( nId ); }
    USHORT GetPoolHelpId() const        { return aMaster.GetPoolHelpId(); }
    void SetPoolHelpId( USHORT nId )    { aMaster.SetPoolHelpId( nId ); }
    BYTE GetPoolHlpFileId() const       { return aMaster.GetPoolHlpFileId(); }
    void SetPoolHlpFileId( BYTE nId )   { aMaster.SetPoolHlpFileId( nId ); }
    // erfrage die Attribut-Beschreibung, returnt den reingereichten String
    void GetPresentation( SfxItemPresentation ePres,
        SfxMapUnit eCoreMetric, SfxMapUnit ePresMetric, String &rText ) const;

        // erfrage vom Client Informationen
    virtual BOOL GetInfo( SfxPoolItem& ) const;

    const SwFrmFmt* GetPageFmtOfNode( const SwNode& rNd,
                                    BOOL bCheckForThisPgDc = TRUE ) const;
    BOOL IsFollowNextPageOfNode( const SwNode& rNd ) const;

    SwPageDesc( const SwPageDesc& );
    ~SwPageDesc();
};

inline void SwPageDesc::SetFollow( const SwPageDesc* pNew )
{
    pFollow = pNew ? (SwPageDesc*)pNew : this;
}

inline BOOL SwPageDesc::IsHeaderShared() const
{
    return eUse & PD_HEADERSHARE ? TRUE : FALSE;
}
inline BOOL SwPageDesc::IsFooterShared() const
{
    return eUse & PD_FOOTERSHARE ? TRUE : FALSE;
}
inline void SwPageDesc::ChgHeaderShare( BOOL bNew )
{
    if ( bNew )
        eUse = (UseOnPage) (eUse | PD_HEADERSHARE);
        // (USHORT&)eUse |= (USHORT)PD_HEADERSHARE;
    else
        eUse = (UseOnPage) (eUse & PD_NOHEADERSHARE);
        // (USHORT&)eUse &= (USHORT)PD_NOHEADERSHARE;
}
inline void SwPageDesc::ChgFooterShare( BOOL bNew )
{
    if ( bNew )
        eUse = (UseOnPage) (eUse | PD_FOOTERSHARE);
        // (USHORT&)eUse |= (USHORT)PD_FOOTERSHARE;
    else
        eUse = (UseOnPage) (eUse & PD_NOFOOTERSHARE);
        // (USHORT&)eUse &= (USHORT)PD_NOFOOTERSHARE;
}
inline void SwPageDesc::SetUseOn( UseOnPage eNew )
{
    UseOnPage eTmp = PD_NONE;
    if ( eUse & PD_HEADERSHARE )
        eTmp = PD_HEADERSHARE;
        // (USHORT&)eTmp |= (USHORT)PD_HEADERSHARE;
    if ( eUse & PD_FOOTERSHARE )
        eTmp = (UseOnPage) (eTmp | PD_FOOTERSHARE);
        // (USHORT&)eTmp |= (USHORT)PD_FOOTERSHARE;
    eUse = (UseOnPage) (eTmp | eNew);
    // (USHORT&)eUse = eTmp | eNew;
}
inline UseOnPage SwPageDesc::GetUseOn() const
{
    UseOnPage eRet = eUse;
    eRet = (UseOnPage) (eRet & PD_NOHEADERSHARE);
    // (USHORT&)eRet &= (USHORT)PD_NOHEADERSHARE;
    eRet = (UseOnPage) (eRet & PD_NOFOOTERSHARE);
    // (USHORT&)eRet &= (USHORT)PD_NOFOOTERSHARE;
    return eRet;
}

inline SwFrmFmt *SwPageDesc::GetRightFmt()
{
    return PD_RIGHT & eUse ? &aMaster : 0;
}
inline const SwFrmFmt *SwPageDesc::GetRightFmt() const
{
    return PD_RIGHT & eUse ? &aMaster : 0;
}
inline SwFrmFmt *SwPageDesc::GetLeftFmt()
{
    return PD_LEFT & eUse ? &aLeft : 0;
}
inline const SwFrmFmt *SwPageDesc::GetLeftFmt() const
{
    return PD_LEFT & eUse ? &aLeft : 0;
}

#endif  //_PAGEDESC_HXX
diff --git a/sw/inc/pageiter.hxx b/sw/inc/pageiter.hxx
new file mode 100644
index 0000000..bc6c8a5
--- /dev/null
+++ b/sw/inc/pageiter.hxx
@@ -0,0 +1,89 @@
/*************************************************************************
 *
 *  $RCSfile: pageiter.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:27 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _PAGEITER_HXX
#define _PAGEITER_HXX

#ifndef _SOLAR_H
#include <tools/solar.h>
#endif

class SwDoc;
class SwPageFrm;
struct SwPosition;
class SwPageDesc;

class SwPageIter {
    const SwDoc &rPDoc;
    const SwPageFrm *pPage;

public:
    SwPageIter( const SwDoc &rDoc, const SwPosition &rStartPos );

    BOOL IsEnd() const { return 0 == pPage; }
    BOOL NextPage();
    const SwPageDesc* GetPageDesc() const;
    BOOL Seek( const SwPosition &rPos );
    BOOL GetPosition( SwPosition &rPos ) const;
};


#endif

diff --git a/sw/inc/pam.hxx b/sw/inc/pam.hxx
new file mode 100644
index 0000000..c0959fb
--- /dev/null
+++ b/sw/inc/pam.hxx
@@ -0,0 +1,269 @@
/*************************************************************************
 *
 *  $RCSfile: pam.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:27 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _PAM_HXX
#define _PAM_HXX

#include <stddef.h>         // fuer MemPool
#ifndef _GEN_HXX //autogen
#include <tools/gen.hxx>
#endif
#ifndef _SVMEMPOOL_HXX //autogen
#include <tools/mempool.hxx>
#endif

#ifndef _CSHTYP_HXX
#include <cshtyp.hxx>       // fuer die Funktions-Definitionen
#endif
#ifndef _RING_HXX
#include <ring.hxx>         // Superklasse
#endif
#ifndef _INDEX_HXX
#include <index.hxx>        // fuer SwIndex
#endif
#ifndef _NDINDEX_HXX
#include <ndindex.hxx>      // fuer SwNodeIndex
#endif


class SwFmt;
class SfxPoolItem;
class SfxItemSet;
class SwDoc;
class SwNode;
class SwCntntNode;
class SearchParam;
class SearchText;
class SwNodes;
class SwPaM;


struct SwPosition
{
    SwNodeIndex nNode;
    SwIndex nContent;

    SwPosition( const SwNode& rNode );
    SwPosition( const SwNodeIndex &rNode );
    SwPosition( const SwNodeIndex &rNode, const SwIndex &rCntnt );
    SwPosition( const SwPosition & );

    SwPosition &operator=(const SwPosition &);

    FASTBOOL operator < (const SwPosition &) const;
    FASTBOOL operator > (const SwPosition &) const;
    FASTBOOL operator <=(const SwPosition &) const;
    FASTBOOL operator >=(const SwPosition &) const;
    FASTBOOL operator ==(const SwPosition &) const;
    FASTBOOL operator !=(const SwPosition &) const;
};


// das Ergebnis eines Positions Vergleiches
enum SwComparePosition {
    POS_BEFORE,             // Pos1 liegt vor Pos2
    POS_BEHIND,             // Pos1 liegt hinter Pos2
    POS_INSIDE,             // Pos1 liegt vollstaendig in Pos2
    POS_OUTSIDE,            // Pos2 liegt vollstaendig in Pos1
    POS_EQUAL,              // Pos1 ist genauso gross wie Pos2
    POS_OVERLAP_BEFORE,     // Pos1 ueberlappt Pos2 am Anfang
    POS_OVERLAP_BEHIND      // Pos1 ueberlappt Pos2 am Ende
};
SwComparePosition ComparePosition(
            const SwPosition& rStt1, const SwPosition& rEnd1,
            const SwPosition& rStt2, const SwPosition& rEnd2 );


// SwPointAndMark / SwPaM
struct SwMoveFnCollection;
typedef SwMoveFnCollection* SwMoveFn;
extern SwMoveFn fnMoveForward, fnMoveBackward;

typedef FASTBOOL (*SwGoInDoc)( SwPaM& rPam, SwMoveFn fnMove );
extern SwGoInDoc fnGoDoc, fnGoSection, fnGoNode, fnGoCntnt;

void _InitPam();

class SwPaM : public Ring
{
    friend class SwTxtFrm;
    friend FASTBOOL GoInDoc( SwPaM&, SwMoveFn );
    friend FASTBOOL GoInNode( SwPaM&, SwMoveFn );
    friend FASTBOOL GoInCntnt( SwPaM&, SwMoveFn );
    friend FASTBOOL GoPrevPara( SwPaM&, SwPosPara );
    friend FASTBOOL GoCurrPara( SwPaM&, SwPosPara );
    friend FASTBOOL GoNextPara( SwPaM&, SwPosPara );
    friend FASTBOOL GoPrevSection( SwPaM&, SwPosSection );
    friend FASTBOOL GoCurrSection( SwPaM&, SwPosSection );
    friend FASTBOOL GoNextSection( SwPaM&, SwPosSection );

    SwPosition aBound1;
    SwPosition aBound2;
    SwPosition *pPoint;
    SwPosition *pMark;

    SwPaM* MakeRegion( SwMoveFn fnMove, const SwPaM * pOrigRg = 0 );

public:
    SwPaM( const SwPosition& rPos, SwPaM* pRing = 0 );
    SwPaM( const SwPosition& rMk, const SwPosition& rPt, SwPaM* pRing = 0 );
    SwPaM( SwPaM & );
    SwPaM( const SwNodeIndex& rMk, const SwNodeIndex& rPt,
           long nMkOffset = 0, long nPtOffset = 0, SwPaM* pRing = 0 );
    SwPaM( const SwNode& rMk, const SwNode& rPt,
           long nMkOffset = 0, long nPtOffset = 0, SwPaM* pRing = 0 );
    SwPaM(  const SwNodeIndex& rMk, xub_StrLen nMkCntnt,
            const SwNodeIndex& rPt, xub_StrLen nPtCntnt, SwPaM* pRing = 0 );
    SwPaM(  const SwNode& rMk, xub_StrLen nMkCntnt,
            const SwNode& rPt, xub_StrLen nPtCntnt, SwPaM* pRing = 0 );
    SwPaM( const SwNode& rNd, xub_StrLen nCntnt = 0, SwPaM* pRing = 0 );
    SwPaM( const SwNodeIndex& rNd, xub_StrLen nCntnt = 0, SwPaM* pRing = 0 );
    virtual ~SwPaM();

    // Bewegen des Cursors
    FASTBOOL Move( SwMoveFn fnMove = fnMoveForward,
                    SwGoInDoc fnGo = fnGoCntnt );

    // Suchen
    BYTE Find(  const SearchParam& rParam, SearchText& rSTxt,
                SwMoveFn fnMove = fnMoveForward,
                const SwPaM *pPam =0, FASTBOOL bInReadOnly = FALSE);
    FASTBOOL Find(  const SwFmt& rFmt,
                SwMoveFn fnMove = fnMoveForward,
                const SwPaM *pPam =0, FASTBOOL bInReadOnly = FALSE);
    FASTBOOL Find(  const SfxPoolItem& rAttr, FASTBOOL bValue = TRUE,
                SwMoveFn fnMove = fnMoveForward,
                const SwPaM *pPam =0, FASTBOOL bInReadOnly = FALSE );
    FASTBOOL Find(  const SfxItemSet& rAttr, FASTBOOL bNoColls = FALSE,
                SwMoveFn fnMove = fnMoveForward,
                const SwPaM *pPam =0, FASTBOOL bInReadOnly = FALSE );

    virtual void SetMark();
    void DeleteMark() { pMark = pPoint; }
#ifdef PRODUCT
    void Exchange()
    {
        if(pPoint != pMark)
        {
            SwPosition *pTmp = pPoint;
            pPoint = pMark;
            pMark = pTmp;
        }
    }
#else
    void Exchange();
#endif
    /*
     * Undokumented Feature: Liefert zurueck, ob das Pam ueber
     * eine Selektion verfuegt oder nicht. Definition einer
     * Selektion: Point und Mark zeigen auf unterschiedliche
     * Puffer.
     */
    FASTBOOL HasMark() const { return pPoint == pMark? FALSE : TRUE; }

    const SwPosition *GetPoint() const { return pPoint; }
          SwPosition *GetPoint()       { return pPoint; }
    const SwPosition *GetMark()  const { return pMark; }
          SwPosition *GetMark()        { return pMark; }

    const SwPosition *Start() const
                    { return (*pPoint) <= (*pMark)? pPoint: pMark; }
          SwPosition *Start()
                    { return (*pPoint) <= (*pMark)? pPoint: pMark; }
    const SwPosition *End()   const
                    { return (*pPoint) > (*pMark)? pPoint: pMark; }
          SwPosition *End()
                    { return (*pPoint) > (*pMark)? pPoint: pMark; }

    SwPaM& operator=( SwPaM & );

    // erfrage vom SwPaM den aktuellen Node/ContentNode am SPoint / Mark
    SwNode* GetNode( BOOL bPoint = TRUE ) const
    {
        return &( bPoint ? pPoint->nNode : pMark->nNode ).GetNode();
    }
    SwCntntNode* GetCntntNode( BOOL bPoint = TRUE ) const
    {
        return ( bPoint ? pPoint->nNode : pMark->nNode ).GetNode().GetCntntNode();
    }

    // erfrage vom SwPaM das Dokument, in dem er angemeldet ist
    SwDoc* GetDoc() const { return pPoint->nNode.GetNode().GetDoc(); }
    SwPosition& GetBound( BOOL bOne = TRUE )
    {   return bOne ? aBound1 : aBound2; }
    const SwPosition& GetBound( BOOL bOne = TRUE ) const
    {   return bOne ? aBound1 : aBound2; }

    // erfrage die Seitennummer auf der der Cursor steht
    USHORT GetPageNum( BOOL bAtPoint = TRUE, const Point* pLayPos = 0 );

    // steht in etwas geschuetztem oder in die Selektion umspannt
    // etwas geschuetztes.
    FASTBOOL HasReadonlySel() const;

    DECL_FIXEDMEMPOOL_NEWDEL(SwPaM)
};


FASTBOOL CheckNodesRange( const SwNodeIndex&, const SwNodeIndex&, FASTBOOL );
FASTBOOL GoInCntnt( SwPaM & rPam, SwMoveFn fnMove );


#endif  // _PAM_HXX
diff --git a/sw/inc/paratr.hxx b/sw/inc/paratr.hxx
new file mode 100644
index 0000000..28fd563
--- /dev/null
+++ b/sw/inc/paratr.hxx
@@ -0,0 +1,285 @@
/*************************************************************************
 *
 *  $RCSfile: paratr.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:27 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _PARATR_HXX
#define _PARATR_HXX

#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#include "hintids.hxx"
#include "calbck.hxx"
#include "swatrset.hxx"
#include "format.hxx"
#include "swtypes.hxx"

class SwCharFmt;
class International;

/*************************************************************************
|*    class     SwFmtDrop
*************************************************************************/

#define DROP_WHOLEWORD ((USHORT)0x0001)

//Wenn ein SwFmtDrop Client ist, so ist dies das CharFmt welches den Font fuer
//die DropCaps beschreibt. Ist es kein Client, so wird von der Formatierung
//das CharFmt des Absatzes benutzt.
//Wird das CharFmt verandert, so wird diese Aenderung ueber das Modify des
//SwFmtDrop an die Absatze propagiert.
class SwFmtDrop: public SfxPoolItem, public SwClient
{
    SwModify* pDefinedIn;   // Modify-Object, in dem der DropCaps steht
                            // kann nur TxtFmtCollection/TxtNode sein
    USHORT nDistance;   // Abstand zum Textbeginn
    USHORT nReadFmt;    // fuer den Sw3-Reader: CharFormat-Id (Pool laden!)
    BYTE   nLines;       // Anzahl der Zeilen
    BYTE   nChars;       // Anzahl der Zeichen
    BOOL   bWholeWord;   // Erstes Wort als Initialen
public:
    TYPEINFO(); //Bereits in der Basisklasse SwClient

    SwFmtDrop();
    SwFmtDrop( const SwFmtDrop & );
    ~SwFmtDrop();

    // "pure virtual Methoden" vom SfxPoolItem
    virtual int             operator==( const SfxPoolItem& ) const;
    virtual SfxPoolItem*    Clone( SfxItemPool* pPool = 0 ) const;
    virtual SfxPoolItem*    Create(SvStream &, USHORT nVer) const;
    virtual SvStream&       Store(SvStream &, USHORT nIVer) const;
    virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres,
                                    SfxMapUnit eCoreMetric,
                                    SfxMapUnit ePresMetric,
                                    String &rText,
                                    const International*    pIntl = 0) const;
    virtual BOOL             QueryValue( com::sun::star::uno::Any& rVal, BYTE nMemberId = 0 ) const;
    virtual BOOL             PutValue( const com::sun::star::uno::Any& rVal, BYTE nMemberId = 0 );
    virtual USHORT           GetVersion( USHORT nFFVer ) const;

    inline BYTE GetLines() const { return nLines; }
    inline BYTE &GetLines() { return nLines; }

    inline BYTE GetChars() const { return nChars; }
    inline BYTE &GetChars() { return nChars; }

    inline BOOL GetWholeWord() const { return bWholeWord; }
    inline BYTE &GetWholeWord() { return bWholeWord; }

    inline USHORT GetDistance() const { return nDistance; }
    inline USHORT &GetDistance() { return nDistance; }

    // fuer den Sw3-Reader: CharFormat-Id (Pool laden!)
    inline USHORT GetReadFmt() const        { return nReadFmt; }
    inline void SetReadFmt( USHORT n )      { nReadFmt = n; }

    inline const SwCharFmt *GetCharFmt() const { return (SwCharFmt*)pRegisteredIn; }
    inline SwCharFmt *GetCharFmt()       { return (SwCharFmt*)pRegisteredIn; }
    void SetCharFmt( SwCharFmt *pNew );
    virtual void Modify( SfxPoolItem*, SfxPoolItem* );
        // erfrage vom Client Informationen
    virtual BOOL GetInfo( SfxPoolItem& ) const;

    // erfrage und setze den Modify-Pointer
    inline const SwModify* GetDefinedIn() const { return pDefinedIn; }
    inline void ChgDefinedIn( const SwModify* pNew )
    { pDefinedIn = (SwModify*)pNew; }

    // this item must be ignored while comparing item sets during XML export
    virtual BOOL        equalsXML( const SfxPoolItem& ) const;
};

class SwRegisterItem : public SfxBoolItem
{
public:
    TYPEINFO();

    inline SwRegisterItem( const BOOL bRegister = FALSE );
    inline SwRegisterItem& operator=( const SwRegisterItem& rRegister );

    // "pure virtual Methoden" vom SfxPoolItem
    virtual SfxPoolItem*    Clone( SfxItemPool *pPool = 0 ) const;
    virtual SfxPoolItem*    Create( SvStream&, USHORT ) const;
    virtual SvStream&       Store( SvStream&, USHORT nIVer ) const;
    virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres,
                                    SfxMapUnit eCoreMetric,
                                    SfxMapUnit ePresMetric,
                                    String &rText,
                                    const International*    pIntl = 0 ) const;
    virtual USHORT           GetVersion( USHORT nFFVer ) const;

    virtual BOOL        importXML( const NAMESPACE_RTL(OUString)& rValue,USHORT,
                                   const SvXMLUnitConverter& rUnitConv );
    virtual BOOL        exportXML( NAMESPACE_RTL(OUString)& rValue, USHORT,
                                   const SvXMLUnitConverter& rUnitConv ) const;
};

inline SwRegisterItem::SwRegisterItem( const BOOL bRegister ) :
    SfxBoolItem( RES_PARATR_REGISTER, bRegister )
{}

inline SwRegisterItem& SwRegisterItem::operator=(
    const SwRegisterItem& rRegister )
{
    SetValue( rRegister.GetValue() );
    return *this;
}

class SwNumRuleItem : public SfxStringItem
{
    SwModify* pDefinedIn;   // Modify-Object, in dem das NumRule steht
                            // kann nur TxtFmtCollection/TxtNode sein
public:
    TYPEINFO();

    SwNumRuleItem()
        : SfxStringItem( RES_PARATR_NUMRULE, aEmptyStr ), pDefinedIn(0) {}

    SwNumRuleItem( const String& rRuleName )
        : SfxStringItem( RES_PARATR_NUMRULE, rRuleName ), pDefinedIn(0) {}

    SwNumRuleItem( const SwNumRuleItem& rCpy )
        : SfxStringItem( RES_PARATR_NUMRULE, rCpy.GetValue() ), pDefinedIn(0) {}


    SwNumRuleItem& operator=( const SwNumRuleItem& rCpy )
    { SetValue( rCpy.GetValue() ); pDefinedIn=0; return *this; }

    // "pure virtual Methoden" vom SfxPoolItem
    virtual int             operator==( const SfxPoolItem& ) const;
    virtual SfxPoolItem*    Clone( SfxItemPool *pPool = 0 ) const;
    virtual SfxPoolItem*    Create( SvStream&, USHORT ) const;
    virtual SvStream&       Store( SvStream&, USHORT nIVer ) const;
    virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres,
                                    SfxMapUnit eCoreMetric,
                                    SfxMapUnit ePresMetric,
                                    String &rText,
                                    const International*    pIntl = 0 ) const;
    virtual USHORT           GetVersion( USHORT nFFVer ) const;

    virtual BOOL             QueryValue( com::sun::star::uno::Any& rVal, BYTE nMemberId ) const;
    virtual BOOL             PutValue( const com::sun::star::uno::Any& rVal, BYTE nMemberId );

    // this item must be ignored while comparing item sets during XML export
    virtual BOOL        equalsXML( const SfxPoolItem& ) const;

    // erfrage und setze den Modify-Pointer
    inline const SwModify* GetDefinedIn() const { return pDefinedIn; }
    inline void ChgDefinedIn( const SwModify* pNew )
    { pDefinedIn = (SwModify*)pNew; }
};



/******************************************************************************
 *  Implementierung der Paragraph-Attribut Methoden vom SwAttrSet
 ******************************************************************************/

inline const SvxLineSpacingItem &SwAttrSet::GetLineSpacing(BOOL bInP) const
    {   return (const SvxLineSpacingItem&)Get( RES_PARATR_LINESPACING,bInP); }
inline const SvxAdjustItem &SwAttrSet::GetAdjust(BOOL bInP) const
    {   return (const SvxAdjustItem&)Get( RES_PARATR_ADJUST,bInP); }
inline const SvxFmtSplitItem &SwAttrSet::GetSplit(BOOL bInP) const
    {   return (const SvxFmtSplitItem&)Get( RES_PARATR_SPLIT,bInP); }
inline const SwRegisterItem &SwAttrSet::GetRegister(BOOL bInP) const
    {   return (const SwRegisterItem&)Get( RES_PARATR_REGISTER,bInP); }
inline const SvxWidowsItem &SwAttrSet::GetWidows(BOOL bInP) const
    {   return (const SvxWidowsItem&)Get( RES_PARATR_WIDOWS,bInP); }
inline const SvxOrphansItem &SwAttrSet::GetOrphans(BOOL bInP) const
    {   return (const SvxOrphansItem&)Get( RES_PARATR_ORPHANS,bInP); }
inline const SvxTabStopItem &SwAttrSet::GetTabStops(BOOL bInP) const
    {   return (const SvxTabStopItem&)Get( RES_PARATR_TABSTOP,bInP); }
inline const SvxHyphenZoneItem &SwAttrSet::GetHyphenZone(BOOL bInP) const
    {   return (const SvxHyphenZoneItem&)Get(RES_PARATR_HYPHENZONE,bInP); }
inline const SwFmtDrop &SwAttrSet::GetDrop(BOOL bInP) const
    {   return (const SwFmtDrop&)Get(RES_PARATR_DROP,bInP); }
inline const SwNumRuleItem &SwAttrSet::GetNumRule(BOOL bInP) const
    {   return (const SwNumRuleItem&)Get(RES_PARATR_NUMRULE,bInP); }

/******************************************************************************
 *  Implementierung der Paragraph-Attribut Methoden vom SwFmt
 ******************************************************************************/

inline const SvxLineSpacingItem &SwFmt::GetLineSpacing(BOOL bInP) const
    {   return aSet.GetLineSpacing(bInP); }
inline const SvxAdjustItem &SwFmt::GetAdjust(BOOL bInP) const
    {   return aSet.GetAdjust(bInP); }
inline const SvxFmtSplitItem &SwFmt::GetSplit(BOOL bInP) const
    {   return aSet.GetSplit(bInP); }
inline const SwRegisterItem &SwFmt::GetRegister(BOOL bInP) const
    {   return aSet.GetRegister(bInP); }
inline const SvxWidowsItem &SwFmt::GetWidows(BOOL bInP) const
    {   return aSet.GetWidows(bInP); }
inline const SvxOrphansItem &SwFmt::GetOrphans(BOOL bInP) const
    {   return aSet.GetOrphans(bInP); }
inline const SvxTabStopItem &SwFmt::GetTabStops(BOOL bInP) const
    {   return aSet.GetTabStops(bInP); }
inline const SvxHyphenZoneItem &SwFmt::GetHyphenZone(BOOL bInP) const
    {   return aSet.GetHyphenZone(bInP); }
inline const SwFmtDrop &SwFmt::GetDrop(BOOL bInP) const
    {   return aSet.GetDrop(bInP); }
inline const SwNumRuleItem &SwFmt::GetNumRule(BOOL bInP) const
    {   return aSet.GetNumRule(bInP); }


#endif
diff --git a/sw/inc/poolfmt.awk b/sw/inc/poolfmt.awk
new file mode 100644
index 0000000..810d714
--- /dev/null
+++ b/sw/inc/poolfmt.awk
@@ -0,0 +1,73 @@
#*************************************************************************
#*
#*    $Workfile:        dbgxtor.awk
#*
#*    Ersterstellung    JP  05.10.95
#*    Letzte Aenderung  $Author: hr $ $Date: 2000-09-18 17:14:27 $
#*    $Revision: 1.1.1.1 $
#*
#*    $Logfile:   T:/sw/inc/poolfmt.awv  $
#*
#*    Copyright (c) 1990-1996, STAR DIVISION
#*
#*************************************************************************

#
# Dieses awk-script generiert ein cxx-file, das alle PoolIds der Vorlage dumpt.
# wird fuer den HelpPI gebraucht.
# Aufruf:  awk -f poolid.awk poolfmt.hxx > poolid.cxx
#          cl poolid.cxx
#          poolid.exe > ???.hrc
#

function Header() {
    print "// This is an outputfile of an awk-script: $Workfile:   poolfmt.awk  $"
    print "#include <solar.h> "
    print
    print  "#include <stdio.h>"
    print  "#include <stdlib.h>"
    print
    print  "#pragma hdrstop"
    print
    print "#include <iostream.hxx> "
    print "#include \"poolfmt.hxx\""
    print
}

function Main() {
	print
    print  "void main( int , char *[] ) {"
    sStr = "#define"
    print  "    int nSize = (sizeof(ppPoolIds) / sizeof(PoolFmtIds)) - 1;"
    print  "    for( int n = 0; n < nSize; n++ )"
    print  "        printf( \"" sStr " %s\\t%8d\\n\", ppPoolIds[ n ].pStr, ppPoolIds[ n ].nId );"
    print  "}"
}

function TableHead() {
	print
    print "struct PoolFmtIds { int nId; const char* pStr; };"
    print "static PoolFmtIds ppPoolIds[] = {"
}

function TableTail() {
    print  " 0, \"\" };"
    print
}

BEGIN {
    Header();
    TableHead();
}

/^[ \t]*RES_/ && !index( $1, "_BEGIN" ) && !index( $1, "_END" ) && !index( $1, "_POOL_" ) {
    sStr = $1;
	split( $1, sStr, "," );
    print  "    " sStr[1] ", \"" sStr[1] "\","
}

END {
    TableTail();
    Main();
}

diff --git a/sw/inc/poolfmt.hrc b/sw/inc/poolfmt.hrc
new file mode 100644
index 0000000..285f40e
--- /dev/null
+++ b/sw/inc/poolfmt.hrc
@@ -0,0 +1,533 @@
/*************************************************************************
 *
 *  $RCSfile: poolfmt.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:27 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _POOLFMT_HRC
#define _POOLFMT_HRC

#include "rcid.hrc"

// ---------------
// die Formate
// ---------------

// Zeichenvorlagen:
#define STR_POOLCHR_FOOTNOTE            (RC_POOLCHRFMT_BEGIN+  0)
#define STR_POOLCHR_PAGENO              (RC_POOLCHRFMT_BEGIN+  1)
#define STR_POOLCHR_LABEL               (RC_POOLCHRFMT_BEGIN+  2)
#define STR_POOLCHR_DROPCAPS            (RC_POOLCHRFMT_BEGIN+  3)
#define STR_POOLCHR_NUM_LEVEL           (RC_POOLCHRFMT_BEGIN+  4)
#define STR_POOLCHR_BUL_LEVEL           (RC_POOLCHRFMT_BEGIN+  5)
#define STR_POOLCHR_INET_NORMAL         (RC_POOLCHRFMT_BEGIN+  6)
#define STR_POOLCHR_INET_VISIT          (RC_POOLCHRFMT_BEGIN+  7)
#define STR_POOLCHR_JUMPEDIT            (RC_POOLCHRFMT_BEGIN+  8)
#define STR_POOLCHR_TOXJUMP             (RC_POOLCHRFMT_BEGIN+  9)
#define STR_POOLCHR_ENDNOTE             (RC_POOLCHRFMT_BEGIN+ 10)
#define STR_POOLCHR_LINENUM             (RC_POOLCHRFMT_BEGIN+ 11)
#define STR_POOLCHR_IDX_MAIN_ENTRY      (RC_POOLCHRFMT_BEGIN+ 12)
#define STR_POOLCHR_FOOTNOTE_ANCHOR     (RC_POOLCHRFMT_BEGIN+ 13)
#define STR_POOLCHR_ENDNOTE_ANCHOR      (RC_POOLCHRFMT_BEGIN+ 14)

#define STR_POOLCHR_HTML_EMPHASIS       (RC_POOLCHRFMT_HTML_BEGIN+  0)
#define STR_POOLCHR_HTML_CITIATION      (RC_POOLCHRFMT_HTML_BEGIN+  1)
#define STR_POOLCHR_HTML_STRONG         (RC_POOLCHRFMT_HTML_BEGIN+  2)
#define STR_POOLCHR_HTML_CODE           (RC_POOLCHRFMT_HTML_BEGIN+  3)
#define STR_POOLCHR_HTML_SAMPLE         (RC_POOLCHRFMT_HTML_BEGIN+  4)
#define STR_POOLCHR_HTML_KEYBOARD       (RC_POOLCHRFMT_HTML_BEGIN+  5)
#define STR_POOLCHR_HTML_VARIABLE       (RC_POOLCHRFMT_HTML_BEGIN+  6)
#define STR_POOLCHR_HTML_DEFINSTANCE    (RC_POOLCHRFMT_HTML_BEGIN+  7)
#define STR_POOLCHR_HTML_TELETYPE       (RC_POOLCHRFMT_HTML_BEGIN+  8)

#define STR_POOLCHR_PRGM_FOOTNOTE           (RC_POOLCHRFMT_PRGM_BEGIN +  0)
#define STR_POOLCHR_PRGM_PAGENO             (RC_POOLCHRFMT_PRGM_BEGIN +  1)
#define STR_POOLCHR_PRGM_LABEL              (RC_POOLCHRFMT_PRGM_BEGIN +  2)
#define STR_POOLCHR_PRGM_DROPCAPS           (RC_POOLCHRFMT_PRGM_BEGIN +  3)
#define STR_POOLCHR_PRGM_NUM_LEVEL          (RC_POOLCHRFMT_PRGM_BEGIN +  4)
#define STR_POOLCHR_PRGM_BUL_LEVEL          (RC_POOLCHRFMT_PRGM_BEGIN +  5)
#define STR_POOLCHR_PRGM_INET_NORMAL        (RC_POOLCHRFMT_PRGM_BEGIN +  6)
#define STR_POOLCHR_PRGM_INET_VISIT         (RC_POOLCHRFMT_PRGM_BEGIN +  7)
#define STR_POOLCHR_PRGM_JUMPEDIT           (RC_POOLCHRFMT_PRGM_BEGIN +  8)
#define STR_POOLCHR_PRGM_TOXJUMP            (RC_POOLCHRFMT_PRGM_BEGIN +  9)
#define STR_POOLCHR_PRGM_ENDNOTE            (RC_POOLCHRFMT_PRGM_BEGIN + 10)
#define STR_POOLCHR_PRGM_LINENUM            (RC_POOLCHRFMT_PRGM_BEGIN + 11)
#define STR_POOLCHR_PRGM_IDX_MAIN_ENTRY     (RC_POOLCHRFMT_PRGM_BEGIN + 12)
#define STR_POOLCHR_PRGM_FOOTNOTE_ANCHOR    (RC_POOLCHRFMT_PRGM_BEGIN + 13)
#define STR_POOLCHR_PRGM_ENDNOTE_ANCHOR     (RC_POOLCHRFMT_PRGM_BEGIN + 14)

#define STR_POOLCHR_PRGM_CURRENT_END        STR_POOLCHR_PRGM_ENDNOTE_ANCHOR


#define STR_POOLCHR_PRGM_HTML_EMPHASIS      (RC_POOLCHRFMT_PRGM_HTML_BEGIN +  0)
#define STR_POOLCHR_PRGM_HTML_CITIATION     (RC_POOLCHRFMT_PRGM_HTML_BEGIN +  1)
#define STR_POOLCHR_PRGM_HTML_STRONG        (RC_POOLCHRFMT_PRGM_HTML_BEGIN +  2)
#define STR_POOLCHR_PRGM_HTML_CODE          (RC_POOLCHRFMT_PRGM_HTML_BEGIN +  3)
#define STR_POOLCHR_PRGM_HTML_SAMPLE        (RC_POOLCHRFMT_PRGM_HTML_BEGIN +  4)
#define STR_POOLCHR_PRGM_HTML_KEYBOARD      (RC_POOLCHRFMT_PRGM_HTML_BEGIN +  5)
#define STR_POOLCHR_PRGM_HTML_VARIABLE      (RC_POOLCHRFMT_PRGM_HTML_BEGIN +  6)
#define STR_POOLCHR_PRGM_HTML_DEFINSTANCE   (RC_POOLCHRFMT_PRGM_HTML_BEGIN +  7)
#define STR_POOLCHR_PRGM_HTML_TELETYPE      (RC_POOLCHRFMT_PRGM_HTML_BEGIN +  8)

#define STR_POOLCHR_PRGM_HTML_CURRENT_END   STR_POOLCHR_PRGM_HTML_TELETYPE

// Rahmen-Vorlagen:
#define STR_POOLFRM_FRAME               (RC_POOLFRMFMT_BEGIN+  0)
#define STR_POOLFRM_GRAPHIC             (RC_POOLFRMFMT_BEGIN+  1)
#define STR_POOLFRM_OLE                 (RC_POOLFRMFMT_BEGIN+  2)
#define STR_POOLFRM_FORMEL              (RC_POOLFRMFMT_BEGIN+  3)
#define STR_POOLFRM_MARGINAL            (RC_POOLFRMFMT_BEGIN+  4)
#define STR_POOLFRM_WATERSIGN           (RC_POOLFRMFMT_BEGIN+  5)
#define STR_POOLFRM_LABEL               (RC_POOLFRMFMT_BEGIN+  6)

#define STR_POOLFRM_PRGM_FRAME              (RC_POOLFRMFMT_PRGM_BEGIN+  0)
#define STR_POOLFRM_PRGM_GRAPHIC            (RC_POOLFRMFMT_PRGM_BEGIN+  1)
#define STR_POOLFRM_PRGM_OLE                (RC_POOLFRMFMT_PRGM_BEGIN+  2)
#define STR_POOLFRM_PRGM_FORMEL             (RC_POOLFRMFMT_PRGM_BEGIN+  3)
#define STR_POOLFRM_PRGM_MARGINAL           (RC_POOLFRMFMT_PRGM_BEGIN+  4)
#define STR_POOLFRM_PRGM_WATERSIGN          (RC_POOLFRMFMT_PRGM_BEGIN+  5)
#define STR_POOLFRM_PRGM_LABEL              (RC_POOLFRMFMT_PRGM_BEGIN+  6)

// ---------------
// die Vorlagen
// ---------------
// Gruppe Text
#define STR_POOLCOLL_STANDARD           (RC_POOLCOLL_TEXT_BEGIN+  0)
#define STR_POOLCOLL_TEXT               (RC_POOLCOLL_TEXT_BEGIN+  1)
#define STR_POOLCOLL_TEXT_IDENT         (RC_POOLCOLL_TEXT_BEGIN+  2)
#define STR_POOLCOLL_TEXT_NEGIDENT      (RC_POOLCOLL_TEXT_BEGIN+  3)
#define STR_POOLCOLL_TEXT_MOVE          (RC_POOLCOLL_TEXT_BEGIN+  4)
#define STR_POOLCOLL_GREETING           (RC_POOLCOLL_TEXT_BEGIN+  5)
#define STR_POOLCOLL_SIGNATURE          (RC_POOLCOLL_TEXT_BEGIN+  6)
#define STR_POOLCOLL_CONFRONTATION      (RC_POOLCOLL_TEXT_BEGIN+  7)
#define STR_POOLCOLL_MARGINAL           (RC_POOLCOLL_TEXT_BEGIN+  8)

    // Untergruppierung Ueberschriften
#define STR_POOLCOLL_HEADLINE_BASE      (RC_POOLCOLL_TEXT_BEGIN+  9)
#define STR_POOLCOLL_HEADLINE1          (RC_POOLCOLL_TEXT_BEGIN+ 10)
#define STR_POOLCOLL_HEADLINE2          (RC_POOLCOLL_TEXT_BEGIN+ 11)
#define STR_POOLCOLL_HEADLINE3          (RC_POOLCOLL_TEXT_BEGIN+ 12)
#define STR_POOLCOLL_HEADLINE4          (RC_POOLCOLL_TEXT_BEGIN+ 13)
#define STR_POOLCOLL_HEADLINE5          (RC_POOLCOLL_TEXT_BEGIN+ 14)
#define STR_POOLCOLL_HEADLINE6          (RC_POOLCOLL_TEXT_BEGIN+ 15)
#define STR_POOLCOLL_HEADLINE7          (RC_POOLCOLL_TEXT_BEGIN+ 16)
#define STR_POOLCOLL_HEADLINE8          (RC_POOLCOLL_TEXT_BEGIN+ 17)
#define STR_POOLCOLL_HEADLINE9          (RC_POOLCOLL_TEXT_BEGIN+ 18)
#define STR_POOLCOLL_HEADLINE10         (RC_POOLCOLL_TEXT_BEGIN+ 19)

// Gruppe Listen
#define STR_POOLCOLL_NUMBUL_BASE        (RC_POOLCOLL_LISTS_BEGIN+  0)
    // Untergruppe Nummerierung
#define STR_POOLCOLL_NUM_LEVEL1S        (RC_POOLCOLL_LISTS_BEGIN+  1)
#define STR_POOLCOLL_NUM_LEVEL1         (RC_POOLCOLL_LISTS_BEGIN+  2)
#define STR_POOLCOLL_NUM_LEVEL1E        (RC_POOLCOLL_LISTS_BEGIN+  3)
#define STR_POOLCOLL_NUM_NONUM1         (RC_POOLCOLL_LISTS_BEGIN+  4)
#define STR_POOLCOLL_NUM_LEVEL2S        (RC_POOLCOLL_LISTS_BEGIN+  5)
#define STR_POOLCOLL_NUM_LEVEL2         (RC_POOLCOLL_LISTS_BEGIN+  6)
#define STR_POOLCOLL_NUM_LEVEL2E        (RC_POOLCOLL_LISTS_BEGIN+  7)
#define STR_POOLCOLL_NUM_NONUM2         (RC_POOLCOLL_LISTS_BEGIN+  8)
#define STR_POOLCOLL_NUM_LEVEL3S        (RC_POOLCOLL_LISTS_BEGIN+  9)
#define STR_POOLCOLL_NUM_LEVEL3         (RC_POOLCOLL_LISTS_BEGIN+ 10)
#define STR_POOLCOLL_NUM_LEVEL3E        (RC_POOLCOLL_LISTS_BEGIN+ 11)
#define STR_POOLCOLL_NUM_NONUM3         (RC_POOLCOLL_LISTS_BEGIN+ 12)
#define STR_POOLCOLL_NUM_LEVEL4S        (RC_POOLCOLL_LISTS_BEGIN+ 13)
#define STR_POOLCOLL_NUM_LEVEL4         (RC_POOLCOLL_LISTS_BEGIN+ 14)
#define STR_POOLCOLL_NUM_LEVEL4E        (RC_POOLCOLL_LISTS_BEGIN+ 15)
#define STR_POOLCOLL_NUM_NONUM4         (RC_POOLCOLL_LISTS_BEGIN+ 16)
#define STR_POOLCOLL_NUM_LEVEL5S        (RC_POOLCOLL_LISTS_BEGIN+ 17)
#define STR_POOLCOLL_NUM_LEVEL5         (RC_POOLCOLL_LISTS_BEGIN+ 18)
#define STR_POOLCOLL_NUM_LEVEL5E        (RC_POOLCOLL_LISTS_BEGIN+ 19)
#define STR_POOLCOLL_NUM_NONUM5         (RC_POOLCOLL_LISTS_BEGIN+ 20)

    // Untergruppe Aufzaehlung
#define STR_POOLCOLL_BUL_LEVEL1S        (RC_POOLCOLL_LISTS_BEGIN+ 21)
#define STR_POOLCOLL_BUL_LEVEL1         (RC_POOLCOLL_LISTS_BEGIN+ 22)
#define STR_POOLCOLL_BUL_LEVEL1E        (RC_POOLCOLL_LISTS_BEGIN+ 23)
#define STR_POOLCOLL_BUL_NONUM1         (RC_POOLCOLL_LISTS_BEGIN+ 24)
#define STR_POOLCOLL_BUL_LEVEL2S        (RC_POOLCOLL_LISTS_BEGIN+ 25)
#define STR_POOLCOLL_BUL_LEVEL2         (RC_POOLCOLL_LISTS_BEGIN+ 26)
#define STR_POOLCOLL_BUL_LEVEL2E        (RC_POOLCOLL_LISTS_BEGIN+ 27)
#define STR_POOLCOLL_BUL_NONUM2         (RC_POOLCOLL_LISTS_BEGIN+ 28)
#define STR_POOLCOLL_BUL_LEVEL3S        (RC_POOLCOLL_LISTS_BEGIN+ 29)
#define STR_POOLCOLL_BUL_LEVEL3         (RC_POOLCOLL_LISTS_BEGIN+ 30)
#define STR_POOLCOLL_BUL_LEVEL3E        (RC_POOLCOLL_LISTS_BEGIN+ 31)
#define STR_POOLCOLL_BUL_NONUM3         (RC_POOLCOLL_LISTS_BEGIN+ 32)
#define STR_POOLCOLL_BUL_LEVEL4S        (RC_POOLCOLL_LISTS_BEGIN+ 33)
#define STR_POOLCOLL_BUL_LEVEL4         (RC_POOLCOLL_LISTS_BEGIN+ 34)
#define STR_POOLCOLL_BUL_LEVEL4E        (RC_POOLCOLL_LISTS_BEGIN+ 35)
#define STR_POOLCOLL_BUL_NONUM4         (RC_POOLCOLL_LISTS_BEGIN+ 36)
#define STR_POOLCOLL_BUL_LEVEL5S        (RC_POOLCOLL_LISTS_BEGIN+ 37)
#define STR_POOLCOLL_BUL_LEVEL5         (RC_POOLCOLL_LISTS_BEGIN+ 38)
#define STR_POOLCOLL_BUL_LEVEL5E        (RC_POOLCOLL_LISTS_BEGIN+ 39)
#define STR_POOLCOLL_BUL_NONUM5         (RC_POOLCOLL_LISTS_BEGIN+ 40)

// Sonderbereiche
    // Untergruppe Header
#define STR_POOLCOLL_HEADER             (RC_POOLCOLL_EXTRA_BEGIN+  0)
#define STR_POOLCOLL_HEADERL            (RC_POOLCOLL_EXTRA_BEGIN+  1)
#define STR_POOLCOLL_HEADERR            (RC_POOLCOLL_EXTRA_BEGIN+  2)

    // Untergruppe Footer
#define STR_POOLCOLL_FOOTER             (RC_POOLCOLL_EXTRA_BEGIN+  3)
#define STR_POOLCOLL_FOOTERL            (RC_POOLCOLL_EXTRA_BEGIN+  4)
#define STR_POOLCOLL_FOOTERR            (RC_POOLCOLL_EXTRA_BEGIN+  5)

    // Untergruppe Tabelle
#define STR_POOLCOLL_TABLE              (RC_POOLCOLL_EXTRA_BEGIN+  6)
#define STR_POOLCOLL_TABLE_HDLN         (RC_POOLCOLL_EXTRA_BEGIN+  7)

    // Untergruppe Labels
#define STR_POOLCOLL_LABEL              (RC_POOLCOLL_EXTRA_BEGIN+  8)
#define STR_POOLCOLL_LABEL_ABB          (RC_POOLCOLL_EXTRA_BEGIN+  9)
#define STR_POOLCOLL_LABEL_TABLE        (RC_POOLCOLL_EXTRA_BEGIN+ 10)
#define STR_POOLCOLL_LABEL_FRAME        (RC_POOLCOLL_EXTRA_BEGIN+ 11)

    // sonstiges
#define STR_POOLCOLL_FRAME              (RC_POOLCOLL_EXTRA_BEGIN+ 12)
#define STR_POOLCOLL_FOOTNOTE           (RC_POOLCOLL_EXTRA_BEGIN+ 13)
#define STR_POOLCOLL_JAKETADRESS        (RC_POOLCOLL_EXTRA_BEGIN+ 14)
#define STR_POOLCOLL_SENDADRESS         (RC_POOLCOLL_EXTRA_BEGIN+ 15)
#define STR_POOLCOLL_ENDNOTE            (RC_POOLCOLL_EXTRA_BEGIN+ 16)

#define STR_POOLCOLL_LABEL_DRAWING      (RC_POOLCOLL_EXTRA_BEGIN+ 17)

// Gruppe Verzeichnisse
#define STR_POOLCOLL_REGISTER_BASE      (RC_POOLCOLL_REGISTER_BEGIN+  0)
    // Untergruppe Index-Verzeichnisse
#define STR_POOLCOLL_TOX_IDXH           (RC_POOLCOLL_REGISTER_BEGIN+  1)
#define STR_POOLCOLL_TOX_IDX1           (RC_POOLCOLL_REGISTER_BEGIN+  2)
#define STR_POOLCOLL_TOX_IDX2           (RC_POOLCOLL_REGISTER_BEGIN+  3)
#define STR_POOLCOLL_TOX_IDX3           (RC_POOLCOLL_REGISTER_BEGIN+  4)
#define STR_POOLCOLL_TOX_IDXBREAK       (RC_POOLCOLL_REGISTER_BEGIN+  5)

    // Untergruppe Inhalts-Verzeichnisse
#define STR_POOLCOLL_TOX_CNTNTH         (RC_POOLCOLL_REGISTER_BEGIN+  6)
#define STR_POOLCOLL_TOX_CNTNT1         (RC_POOLCOLL_REGISTER_BEGIN+  7)
#define STR_POOLCOLL_TOX_CNTNT2         (RC_POOLCOLL_REGISTER_BEGIN+  8)
#define STR_POOLCOLL_TOX_CNTNT3         (RC_POOLCOLL_REGISTER_BEGIN+  9)
#define STR_POOLCOLL_TOX_CNTNT4         (RC_POOLCOLL_REGISTER_BEGIN+ 10)
#define STR_POOLCOLL_TOX_CNTNT5         (RC_POOLCOLL_REGISTER_BEGIN+ 11)

    // Untergruppe Benutzer-Verzeichnisse:
#define STR_POOLCOLL_TOX_USERH          (RC_POOLCOLL_REGISTER_BEGIN+ 12)
#define STR_POOLCOLL_TOX_USER1          (RC_POOLCOLL_REGISTER_BEGIN+ 13)
#define STR_POOLCOLL_TOX_USER2          (RC_POOLCOLL_REGISTER_BEGIN+ 14)
#define STR_POOLCOLL_TOX_USER3          (RC_POOLCOLL_REGISTER_BEGIN+ 15)
#define STR_POOLCOLL_TOX_USER4          (RC_POOLCOLL_REGISTER_BEGIN+ 16)
#define STR_POOLCOLL_TOX_USER5          (RC_POOLCOLL_REGISTER_BEGIN+ 17)

    // Untergruppe Inhalts-Verzeichnisse mehr Ebenen 5 - 10
#define STR_POOLCOLL_TOX_CNTNT6         (RC_POOLCOLL_REGISTER_BEGIN+ 18)
#define STR_POOLCOLL_TOX_CNTNT7         (RC_POOLCOLL_REGISTER_BEGIN+ 19)
#define STR_POOLCOLL_TOX_CNTNT8         (RC_POOLCOLL_REGISTER_BEGIN+ 20)
#define STR_POOLCOLL_TOX_CNTNT9         (RC_POOLCOLL_REGISTER_BEGIN+ 21)
#define STR_POOLCOLL_TOX_CNTNT10        (RC_POOLCOLL_REGISTER_BEGIN+ 22)

// illustrations index
#define STR_POOLCOLL_TOX_ILLUSH         (RC_POOLCOLL_REGISTER_BEGIN+ 23)
#define STR_POOLCOLL_TOX_ILLUS1         (RC_POOLCOLL_REGISTER_BEGIN+ 24)

//  object index
#define STR_POOLCOLL_TOX_OBJECTH        (RC_POOLCOLL_REGISTER_BEGIN+ 25)
#define STR_POOLCOLL_TOX_OBJECT1        (RC_POOLCOLL_REGISTER_BEGIN+ 26)

//  tables index
#define STR_POOLCOLL_TOX_TABLESH        (RC_POOLCOLL_REGISTER_BEGIN+ 27)
#define STR_POOLCOLL_TOX_TABLES1        (RC_POOLCOLL_REGISTER_BEGIN+ 28)

//  index of authorities
#define STR_POOLCOLL_TOX_AUTHORITIESH   (RC_POOLCOLL_REGISTER_BEGIN+ 29)
#define STR_POOLCOLL_TOX_AUTHORITIES1   (RC_POOLCOLL_REGISTER_BEGIN+ 30)

    // Untergruppe Benutzer-Verzeichnisse mehr Ebenen 5 - 10
#define STR_POOLCOLL_TOX_USER6          (RC_POOLCOLL_REGISTER_BEGIN+ 31)
#define STR_POOLCOLL_TOX_USER7          (RC_POOLCOLL_REGISTER_BEGIN+ 32)
#define STR_POOLCOLL_TOX_USER8          (RC_POOLCOLL_REGISTER_BEGIN+ 33)
#define STR_POOLCOLL_TOX_USER9          (RC_POOLCOLL_REGISTER_BEGIN+ 34)
#define STR_POOLCOLL_TOX_USER10         (RC_POOLCOLL_REGISTER_BEGIN+ 35)


// Gruppe Kapitel/Dokument
#define STR_POOLCOLL_DOC_TITEL          (RC_POOLCOLL_DOC_BEGIN+ 0)
#define STR_POOLCOLL_DOC_SUBTITEL       (RC_POOLCOLL_DOC_BEGIN+ 1)

// Gruppe HTML-Vorlagen
#define STR_POOLCOLL_HTML_BLOCKQUOTE    (RC_POOLCOLL_HTML_BEGIN+  0)
#define STR_POOLCOLL_HTML_PRE           (RC_POOLCOLL_HTML_BEGIN+  1)
#define STR_POOLCOLL_HTML_HR            (RC_POOLCOLL_HTML_BEGIN+  2)
#define STR_POOLCOLL_HTML_DD            (RC_POOLCOLL_HTML_BEGIN+  3)
#define STR_POOLCOLL_HTML_DT            (RC_POOLCOLL_HTML_BEGIN+  4)

// programmatic names of para styles

// Gruppe Text
#define STR_POCO_PRGM_STANDARD          (RC_POOLCOLL_PRGM_TEXT_BEGIN+  0)
#define STR_POCO_PRGM_TEXT              (RC_POOLCOLL_PRGM_TEXT_BEGIN+  1)
#define STR_POCO_PRGM_TEXT_IDENT        (RC_POOLCOLL_PRGM_TEXT_BEGIN+  2)
#define STR_POCO_PRGM_TEXT_NEGIDENT     (RC_POOLCOLL_PRGM_TEXT_BEGIN+  3)
#define STR_POCO_PRGM_TEXT_MOVE         (RC_POOLCOLL_PRGM_TEXT_BEGIN+  4)
#define STR_POCO_PRGM_GREETING          (RC_POOLCOLL_PRGM_TEXT_BEGIN+  5)
#define STR_POCO_PRGM_SIGNATURE         (RC_POOLCOLL_PRGM_TEXT_BEGIN+  6)
#define STR_POCO_PRGM_CONFRONTATION     (RC_POOLCOLL_PRGM_TEXT_BEGIN+  7)
#define STR_POCO_PRGM_MARGINAL          (RC_POOLCOLL_PRGM_TEXT_BEGIN+  8)

    // Untergruppierung Ueberschriften
#define STR_POCO_PRGM_HEADLINE_BASE     (RC_POOLCOLL_PRGM_TEXT_BEGIN+  9)
#define STR_POCO_PRGM_HEADLINE1         (RC_POOLCOLL_PRGM_TEXT_BEGIN+ 10)
#define STR_POCO_PRGM_HEADLINE2         (RC_POOLCOLL_PRGM_TEXT_BEGIN+ 11)
#define STR_POCO_PRGM_HEADLINE3         (RC_POOLCOLL_PRGM_TEXT_BEGIN+ 12)
#define STR_POCO_PRGM_HEADLINE4         (RC_POOLCOLL_PRGM_TEXT_BEGIN+ 13)
#define STR_POCO_PRGM_HEADLINE5         (RC_POOLCOLL_PRGM_TEXT_BEGIN+ 14)
#define STR_POCO_PRGM_HEADLINE6         (RC_POOLCOLL_PRGM_TEXT_BEGIN+ 15)
#define STR_POCO_PRGM_HEADLINE7         (RC_POOLCOLL_PRGM_TEXT_BEGIN+ 16)
#define STR_POCO_PRGM_HEADLINE8         (RC_POOLCOLL_PRGM_TEXT_BEGIN+ 17)
#define STR_POCO_PRGM_HEADLINE9         (RC_POOLCOLL_PRGM_TEXT_BEGIN+ 18)
#define STR_POCO_PRGM_HEADLINE10        (RC_POOLCOLL_PRGM_TEXT_BEGIN+ 19)

// Gruppe Listen
#define STR_POCO_PRGM_NUMBUL_BASE       (RC_POOLCOLL_PRGM_LISTS_BEGIN+  0)
    // Untergruppe Nummerierung
#define STR_POCO_PRGM_NUM_LEVEL1S       (RC_POOLCOLL_PRGM_LISTS_BEGIN+  1)
#define STR_POCO_PRGM_NUM_LEVEL1            (RC_POOLCOLL_PRGM_LISTS_BEGIN+  2)
#define STR_POCO_PRGM_NUM_LEVEL1E       (RC_POOLCOLL_PRGM_LISTS_BEGIN+  3)
#define STR_POCO_PRGM_NUM_NONUM1            (RC_POOLCOLL_PRGM_LISTS_BEGIN+  4)
#define STR_POCO_PRGM_NUM_LEVEL2S       (RC_POOLCOLL_PRGM_LISTS_BEGIN+  5)
#define STR_POCO_PRGM_NUM_LEVEL2            (RC_POOLCOLL_PRGM_LISTS_BEGIN+  6)
#define STR_POCO_PRGM_NUM_LEVEL2E       (RC_POOLCOLL_PRGM_LISTS_BEGIN+  7)
#define STR_POCO_PRGM_NUM_NONUM2            (RC_POOLCOLL_PRGM_LISTS_BEGIN+  8)
#define STR_POCO_PRGM_NUM_LEVEL3S       (RC_POOLCOLL_PRGM_LISTS_BEGIN+  9)
#define STR_POCO_PRGM_NUM_LEVEL3            (RC_POOLCOLL_PRGM_LISTS_BEGIN+ 10)
#define STR_POCO_PRGM_NUM_LEVEL3E       (RC_POOLCOLL_PRGM_LISTS_BEGIN+ 11)
#define STR_POCO_PRGM_NUM_NONUM3            (RC_POOLCOLL_PRGM_LISTS_BEGIN+ 12)
#define STR_POCO_PRGM_NUM_LEVEL4S       (RC_POOLCOLL_PRGM_LISTS_BEGIN+ 13)
#define STR_POCO_PRGM_NUM_LEVEL4            (RC_POOLCOLL_PRGM_LISTS_BEGIN+ 14)
#define STR_POCO_PRGM_NUM_LEVEL4E       (RC_POOLCOLL_PRGM_LISTS_BEGIN+ 15)
#define STR_POCO_PRGM_NUM_NONUM4            (RC_POOLCOLL_PRGM_LISTS_BEGIN+ 16)
#define STR_POCO_PRGM_NUM_LEVEL5S       (RC_POOLCOLL_PRGM_LISTS_BEGIN+ 17)
#define STR_POCO_PRGM_NUM_LEVEL5            (RC_POOLCOLL_PRGM_LISTS_BEGIN+ 18)
#define STR_POCO_PRGM_NUM_LEVEL5E       (RC_POOLCOLL_PRGM_LISTS_BEGIN+ 19)
#define STR_POCO_PRGM_NUM_NONUM5            (RC_POOLCOLL_PRGM_LISTS_BEGIN+ 20)

    // Untergruppe Aufzaehlung
#define STR_POCO_PRGM_BUL_LEVEL1S       (RC_POOLCOLL_PRGM_LISTS_BEGIN+ 21)
#define STR_POCO_PRGM_BUL_LEVEL1            (RC_POOLCOLL_PRGM_LISTS_BEGIN+ 22)
#define STR_POCO_PRGM_BUL_LEVEL1E       (RC_POOLCOLL_PRGM_LISTS_BEGIN+ 23)
#define STR_POCO_PRGM_BUL_NONUM1            (RC_POOLCOLL_PRGM_LISTS_BEGIN+ 24)
#define STR_POCO_PRGM_BUL_LEVEL2S       (RC_POOLCOLL_PRGM_LISTS_BEGIN+ 25)
#define STR_POCO_PRGM_BUL_LEVEL2            (RC_POOLCOLL_PRGM_LISTS_BEGIN+ 26)
#define STR_POCO_PRGM_BUL_LEVEL2E       (RC_POOLCOLL_PRGM_LISTS_BEGIN+ 27)
#define STR_POCO_PRGM_BUL_NONUM2            (RC_POOLCOLL_PRGM_LISTS_BEGIN+ 28)
#define STR_POCO_PRGM_BUL_LEVEL3S       (RC_POOLCOLL_PRGM_LISTS_BEGIN+ 29)
#define STR_POCO_PRGM_BUL_LEVEL3            (RC_POOLCOLL_PRGM_LISTS_BEGIN+ 30)
#define STR_POCO_PRGM_BUL_LEVEL3E       (RC_POOLCOLL_PRGM_LISTS_BEGIN+ 31)
#define STR_POCO_PRGM_BUL_NONUM3            (RC_POOLCOLL_PRGM_LISTS_BEGIN+ 32)
#define STR_POCO_PRGM_BUL_LEVEL4S       (RC_POOLCOLL_PRGM_LISTS_BEGIN+ 33)
#define STR_POCO_PRGM_BUL_LEVEL4            (RC_POOLCOLL_PRGM_LISTS_BEGIN+ 34)
#define STR_POCO_PRGM_BUL_LEVEL4E       (RC_POOLCOLL_PRGM_LISTS_BEGIN+ 35)
#define STR_POCO_PRGM_BUL_NONUM4            (RC_POOLCOLL_PRGM_LISTS_BEGIN+ 36)
#define STR_POCO_PRGM_BUL_LEVEL5S       (RC_POOLCOLL_PRGM_LISTS_BEGIN+ 37)
#define STR_POCO_PRGM_BUL_LEVEL5            (RC_POOLCOLL_PRGM_LISTS_BEGIN+ 38)
#define STR_POCO_PRGM_BUL_LEVEL5E       (RC_POOLCOLL_PRGM_LISTS_BEGIN+ 39)
#define STR_POCO_PRGM_BUL_NONUM5            (RC_POOLCOLL_PRGM_LISTS_BEGIN+ 40)

// Sonderbereiche
    // Untergruppe Header
#define STR_POCO_PRGM_HEADER                (RC_POOLCOLL_PRGM_EXTRA_BEGIN+  0)
#define STR_POCO_PRGM_HEADERL           (RC_POOLCOLL_PRGM_EXTRA_BEGIN+  1)
#define STR_POCO_PRGM_HEADERR           (RC_POOLCOLL_PRGM_EXTRA_BEGIN+  2)

    // Untergruppe Footer
#define STR_POCO_PRGM_FOOTER                (RC_POOLCOLL_PRGM_EXTRA_BEGIN+  3)
#define STR_POCO_PRGM_FOOTERL           (RC_POOLCOLL_PRGM_EXTRA_BEGIN+  4)
#define STR_POCO_PRGM_FOOTERR           (RC_POOLCOLL_PRGM_EXTRA_BEGIN+  5)

    // Untergruppe Tabelle
#define STR_POCO_PRGM_TABLE             (RC_POOLCOLL_PRGM_EXTRA_BEGIN+  6)
#define STR_POCO_PRGM_TABLE_HDLN            (RC_POOLCOLL_PRGM_EXTRA_BEGIN+  7)

    // Untergruppe Labels
#define STR_POCO_PRGM_LABEL             (RC_POOLCOLL_PRGM_EXTRA_BEGIN+  8)
#define STR_POCO_PRGM_LABEL_ABB         (RC_POOLCOLL_PRGM_EXTRA_BEGIN+  9)
#define STR_POCO_PRGM_LABEL_TABLE       (RC_POOLCOLL_PRGM_EXTRA_BEGIN+ 10)
#define STR_POCO_PRGM_LABEL_FRAME       (RC_POOLCOLL_PRGM_EXTRA_BEGIN+ 11)

    // sonstiges
#define STR_POCO_PRGM_FRAME             (RC_POOLCOLL_PRGM_EXTRA_BEGIN+ 12)
#define STR_POCO_PRGM_FOOTNOTE          (RC_POOLCOLL_PRGM_EXTRA_BEGIN+ 13)
#define STR_POCO_PRGM_JAKETADRESS       (RC_POOLCOLL_PRGM_EXTRA_BEGIN+ 14)
#define STR_POCO_PRGM_SENDADRESS            (RC_POOLCOLL_PRGM_EXTRA_BEGIN+ 15)
#define STR_POCO_PRGM_ENDNOTE           (RC_POOLCOLL_PRGM_EXTRA_BEGIN+ 16)

#define STR_POCO_PRGM_LABEL_DRAWING     (RC_POOLCOLL_PRGM_EXTRA_BEGIN+ 17)

// Gruppe Verzeichnisse
#define STR_POCO_PRGM_REGISTER_BASE     (RC_POOLCOLL_PRGM_REGISTER_BEGIN+  0)
    // Untergruppe Index-Verzeichnisse
#define STR_POCO_PRGM_TOX_IDXH          (RC_POOLCOLL_PRGM_REGISTER_BEGIN+  1)
#define STR_POCO_PRGM_TOX_IDX1          (RC_POOLCOLL_PRGM_REGISTER_BEGIN+  2)
#define STR_POCO_PRGM_TOX_IDX2          (RC_POOLCOLL_PRGM_REGISTER_BEGIN+  3)
#define STR_POCO_PRGM_TOX_IDX3          (RC_POOLCOLL_PRGM_REGISTER_BEGIN+  4)
#define STR_POCO_PRGM_TOX_IDXBREAK          (RC_POOLCOLL_PRGM_REGISTER_BEGIN+  5)

    // Untergruppe Inhalts-Verzeichnisse
#define STR_POCO_PRGM_TOX_CNTNTH            (RC_POOLCOLL_PRGM_REGISTER_BEGIN+  6)
#define STR_POCO_PRGM_TOX_CNTNT1            (RC_POOLCOLL_PRGM_REGISTER_BEGIN+  7)
#define STR_POCO_PRGM_TOX_CNTNT2            (RC_POOLCOLL_PRGM_REGISTER_BEGIN+  8)
#define STR_POCO_PRGM_TOX_CNTNT3            (RC_POOLCOLL_PRGM_REGISTER_BEGIN+  9)
#define STR_POCO_PRGM_TOX_CNTNT4            (RC_POOLCOLL_PRGM_REGISTER_BEGIN+ 10)
#define STR_POCO_PRGM_TOX_CNTNT5            (RC_POOLCOLL_PRGM_REGISTER_BEGIN+ 11)

    // Untergruppe Benutzer-Verzeichnisse:
#define STR_POCO_PRGM_TOX_USERH         (RC_POOLCOLL_PRGM_REGISTER_BEGIN+ 12)
#define STR_POCO_PRGM_TOX_USER1         (RC_POOLCOLL_PRGM_REGISTER_BEGIN+ 13)
#define STR_POCO_PRGM_TOX_USER2         (RC_POOLCOLL_PRGM_REGISTER_BEGIN+ 14)
#define STR_POCO_PRGM_TOX_USER3         (RC_POOLCOLL_PRGM_REGISTER_BEGIN+ 15)
#define STR_POCO_PRGM_TOX_USER4         (RC_POOLCOLL_PRGM_REGISTER_BEGIN+ 16)
#define STR_POCO_PRGM_TOX_USER5         (RC_POOLCOLL_PRGM_REGISTER_BEGIN+ 17)

    // Untergruppe Inhalts-Verzeichnisse mehr Ebenen 5 - 10
#define STR_POCO_PRGM_TOX_CNTNT6            (RC_POOLCOLL_PRGM_REGISTER_BEGIN+ 18)
#define STR_POCO_PRGM_TOX_CNTNT7            (RC_POOLCOLL_PRGM_REGISTER_BEGIN+ 19)
#define STR_POCO_PRGM_TOX_CNTNT8            (RC_POOLCOLL_PRGM_REGISTER_BEGIN+ 20)
#define STR_POCO_PRGM_TOX_CNTNT9            (RC_POOLCOLL_PRGM_REGISTER_BEGIN+ 21)
#define STR_POCO_PRGM_TOX_CNTNT10       (RC_POOLCOLL_PRGM_REGISTER_BEGIN+ 22)

// illustrations index
#define STR_POCO_PRGM_TOX_ILLUSH            (RC_POOLCOLL_PRGM_REGISTER_BEGIN+ 23)
#define STR_POCO_PRGM_TOX_ILLUS1         (RC_POOLCOLL_PRGM_REGISTER_BEGIN+ 24)

//  object index
#define STR_POCO_PRGM_TOX_OBJECTH       (RC_POOLCOLL_PRGM_REGISTER_BEGIN+ 25)
#define STR_POCO_PRGM_TOX_OBJECT1        (RC_POOLCOLL_PRGM_REGISTER_BEGIN+ 26)

//  tables index
#define STR_POCO_PRGM_TOX_TABLESH       (RC_POOLCOLL_PRGM_REGISTER_BEGIN+ 27)
#define STR_POCO_PRGM_TOX_TABLES1        (RC_POOLCOLL_PRGM_REGISTER_BEGIN+ 28)

//  index of authorities
#define STR_POCO_PRGM_TOX_AUTHORITIESH  (RC_POOLCOLL_PRGM_REGISTER_BEGIN+ 29)
#define STR_POCO_PRGM_TOX_AUTHORITIES1   (RC_POOLCOLL_PRGM_REGISTER_BEGIN+ 30)

    // Untergruppe Benutzer-Verzeichnisse mehr Ebenen 5 - 10
#define STR_POCO_PRGM_TOX_USER6         (RC_POOLCOLL_PRGM_REGISTER_BEGIN+ 31)
#define STR_POCO_PRGM_TOX_USER7         (RC_POOLCOLL_PRGM_REGISTER_BEGIN+ 32)
#define STR_POCO_PRGM_TOX_USER8         (RC_POOLCOLL_PRGM_REGISTER_BEGIN+ 33)
#define STR_POCO_PRGM_TOX_USER9         (RC_POOLCOLL_PRGM_REGISTER_BEGIN+ 34)
#define STR_POCO_PRGM_TOX_USER10        (RC_POOLCOLL_PRGM_REGISTER_BEGIN+ 35)


// Gruppe Kapitel/Dokument
#define STR_POCO_PRGM_DOC_TITEL         (RC_POOLCOLL_PRGM_DOC_BEGIN+ 0)
#define STR_POCO_PRGM_DOC_SUBTITEL      (RC_POOLCOLL_PRGM_DOC_BEGIN+ 1)

// Gruppe HTML-Vorlagen
#define STR_POCO_PRGM_HTML_BLOCKQUOTE   (RC_POOLCOLL_PRGM_HTML_BEGIN+  0)
#define STR_POCO_PRGM_HTML_PRE          (RC_POOLCOLL_PRGM_HTML_BEGIN+  1)
#define STR_POCO_PRGM_HTML_HR           (RC_POOLCOLL_PRGM_HTML_BEGIN+  2)
#define STR_POCO_PRGM_HTML_DD           (RC_POOLCOLL_PRGM_HTML_BEGIN+  3)
#define STR_POCO_PRGM_HTML_DT           (RC_POOLCOLL_PRGM_HTML_BEGIN+  4)


//-----------------
// Page styles
//-----------------
#define STR_POOLPAGE_STANDARD           (RC_POOLPAGEDESC_BEGIN+  0)
#define STR_POOLPAGE_FIRST              (RC_POOLPAGEDESC_BEGIN+  1)
#define STR_POOLPAGE_LEFT               (RC_POOLPAGEDESC_BEGIN+  2)
#define STR_POOLPAGE_RIGHT              (RC_POOLPAGEDESC_BEGIN+  3)
#define STR_POOLPAGE_JAKET              (RC_POOLPAGEDESC_BEGIN+  4)
#define STR_POOLPAGE_REGISTER           (RC_POOLPAGEDESC_BEGIN+  5)
#define STR_POOLPAGE_HTML               (RC_POOLPAGEDESC_BEGIN+  6)
#define STR_POOLPAGE_FOOTNOTE           (RC_POOLPAGEDESC_BEGIN+  7)
#define STR_POOLPAGE_ENDNOTE            (RC_POOLPAGEDESC_BEGIN+  8)

#define STR_POOLPAGE_PRGM_STANDARD          (RC_POOLPAGEDESC_PRGM_BEGIN+  0)
#define STR_POOLPAGE_PRGM_FIRST             (RC_POOLPAGEDESC_PRGM_BEGIN+  1)
#define STR_POOLPAGE_PRGM_LEFT              (RC_POOLPAGEDESC_PRGM_BEGIN+  2)
#define STR_POOLPAGE_PRGM_RIGHT             (RC_POOLPAGEDESC_PRGM_BEGIN+  3)
#define STR_POOLPAGE_PRGM_JAKET             (RC_POOLPAGEDESC_PRGM_BEGIN+  4)
#define STR_POOLPAGE_PRGM_REGISTER          (RC_POOLPAGEDESC_PRGM_BEGIN+  5)
#define STR_POOLPAGE_PRGM_HTML              (RC_POOLPAGEDESC_PRGM_BEGIN+  6)
#define STR_POOLPAGE_PRGM_FOOTNOTE          (RC_POOLPAGEDESC_PRGM_BEGIN+  7)
#define STR_POOLPAGE_PRGM_ENDNOTE           (RC_POOLPAGEDESC_PRGM_BEGIN+  8)

//-----------------
// Numbering styles
//-----------------
#define STR_POOLNUMRULE_NUM1                (RC_POOLNUMRULE_BEGIN+  0)
#define STR_POOLNUMRULE_NUM2                (RC_POOLNUMRULE_BEGIN+  1)
#define STR_POOLNUMRULE_NUM3                (RC_POOLNUMRULE_BEGIN+  2)
#define STR_POOLNUMRULE_NUM4                (RC_POOLNUMRULE_BEGIN+  3)
#define STR_POOLNUMRULE_NUM5                (RC_POOLNUMRULE_BEGIN+  4)
#define STR_POOLNUMRULE_BUL1                (RC_POOLNUMRULE_BEGIN+  5)
#define STR_POOLNUMRULE_BUL2                (RC_POOLNUMRULE_BEGIN+  6)
#define STR_POOLNUMRULE_BUL3                (RC_POOLNUMRULE_BEGIN+  7)
#define STR_POOLNUMRULE_BUL4                (RC_POOLNUMRULE_BEGIN+  8)
#define STR_POOLNUMRULE_BUL5                (RC_POOLNUMRULE_BEGIN+  9)

#define STR_POOLNUMRULE_PRGM_NUM1               (RC_POOLNUMRULE_PRGM_BEGIN+  0)
#define STR_POOLNUMRULE_PRGM_NUM2               (RC_POOLNUMRULE_PRGM_BEGIN+  1)
#define STR_POOLNUMRULE_PRGM_NUM3               (RC_POOLNUMRULE_PRGM_BEGIN+  2)
#define STR_POOLNUMRULE_PRGM_NUM4               (RC_POOLNUMRULE_PRGM_BEGIN+  3)
#define STR_POOLNUMRULE_PRGM_NUM5               (RC_POOLNUMRULE_PRGM_BEGIN+  4)
#define STR_POOLNUMRULE_PRGM_BUL1               (RC_POOLNUMRULE_PRGM_BEGIN+  5)
#define STR_POOLNUMRULE_PRGM_BUL2               (RC_POOLNUMRULE_PRGM_BEGIN+  6)
#define STR_POOLNUMRULE_PRGM_BUL3               (RC_POOLNUMRULE_PRGM_BEGIN+  7)
#define STR_POOLNUMRULE_PRGM_BUL4               (RC_POOLNUMRULE_PRGM_BEGIN+  8)
#define STR_POOLNUMRULE_PRGM_BUL5               (RC_POOLNUMRULE_PRGM_BEGIN+  9)

#endif
diff --git a/sw/inc/poolfmt.hxx b/sw/inc/poolfmt.hxx
new file mode 100644
index 0000000..a4b31cf
--- /dev/null
+++ b/sw/inc/poolfmt.hxx
@@ -0,0 +1,478 @@
/*************************************************************************
 *
 *  $RCSfile: poolfmt.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:27 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _POOLFMT_HXX
#define _POOLFMT_HXX

#include <limits.h>

#ifndef _SOLAR_H
#include <tools/solar.h>
#endif

// POOLCOLL-IDs:
// +----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
// !User!    Bereich    ! 0 !               Offset                  !
// +----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
//
//  Bereich:                        1 - Text
//                                  2 - Listen
//                                  3 - Sonderbereiche
//                                  4 - Verzeichnisse
//                                  5 - Kapitel / Dokument
//                                  6 - HTML-Vorlagen

// Andere IDs:
// +----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
// !User!    Bereich    ! 1 !           Offset                      !
// +----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
// Bereich:                         0 - Zeichenvorlagen
//                                  1 - Frame-Vorlagen
//                                  2 - Seitenvorlagen
//                                  3 - Absatzformate (?)
//                                  4 - Grafikformate (?)

// Fr alle IDs gilt:
// Herkunft:                        0 -Pool
//                                  1 -Benutzer
// Offset:                          innerhalb der Gruppe


// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//
// ACHTUNG: neue ID's koennen nur noch am Ende der jeweiligen Gruppe
//          zugefuegt werden. Diese Id's werden vom Reader/Writer ge-
//          lesen und geschrieben. Diese kennen nur den Offset zum Start
//
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

// Maske fuer Erkennung von COLLPOOL-Ids:

const USHORT POOLGRP_NOCOLLID       =  (1 << 10);

// POLLCOLL-Gruppen:

const USHORT USER_FMT               =  (1 << 15);
const USHORT POOL_FMT               =  (0 << 15);

const USHORT COLL_TEXT_BITS         =  (1 << 11);
const USHORT COLL_LISTS_BITS        =  (2 << 11);
const USHORT COLL_EXTRA_BITS        =  (3 << 11);
const USHORT COLL_REGISTER_BITS     =  (4 << 11);
const USHORT COLL_DOC_BITS          =  (5 << 11);
const USHORT COLL_HTML_BITS         =  (6 << 11);
const USHORT COLL_GET_RANGE_BITS    = (15 << 11);

// Sonstige Gruppen:

const USHORT POOLGRP_CHARFMT        = (0 << 11) + POOLGRP_NOCOLLID;
const USHORT POOLGRP_FRAMEFMT       = (1 << 11) + POOLGRP_NOCOLLID;
const USHORT POOLGRP_PAGEDESC       = (2 << 11) + POOLGRP_NOCOLLID;
const USHORT POOLGRP_NUMRULE        = (3 << 11) + POOLGRP_NOCOLLID;
//const USHORT POOLGRP_GRFFMT           = (4 << 11) + POOLGRP_NOCOLLID; // ?

// fuer Erkennung ob Benutzer-Vorlage oder nicht:
const USHORT POOL_IDUSER_FMT =
        USHRT_MAX & ~(COLL_GET_RANGE_BITS + POOLGRP_NOCOLLID);

inline BOOL IsPoolUserFmt( USHORT nId )
{
    return POOL_IDUSER_FMT ==
                (nId & ~(COLL_GET_RANGE_BITS + POOLGRP_NOCOLLID))
        ? TRUE : FALSE;
}


// ID-s fuer die Bereiche
enum RES_POOLFMT
{
RES_POOLFMT_BEGIN = 1,  // HIER GEHT'S LOS !!!
RES_POOL_CHRFMT = RES_POOLFMT_BEGIN,
RES_POOL_FRMFMT,
RES_POOL_TXTCOLL,
RES_POOL_PAGEFMT,

RES_POOL_PARFMT,    // ???
RES_POOL_GRFFMT,    // ???
RES_POOLFMT_END
};

// Bereiche fuer die Id's der einzelnen Formate

// die Id's fuer die Zeichen-Vorlagen
enum RES_POOL_CHRFMT_TYPE
{
RES_POOLCHR_BEGIN = POOLGRP_CHARFMT,
RES_POOLCHR_NORMAL_BEGIN = POOLGRP_CHARFMT,

RES_POOLCHR_FOOTNOTE = RES_POOLCHR_NORMAL_BEGIN,    // Fussnote
RES_POOLCHR_PAGENO,                                 // Seiten/Feld
RES_POOLCHR_LABEL,                                  // Beschriftung
RES_POOLCHR_DROPCAPS,                               // Initialienzeichen
RES_POOLCHR_NUM_LEVEL,                              // Nummerierungszeichen
RES_POOLCHR_BUL_LEVEL,                              // Aufzaehlungszeichen

RES_POOLCHR_INET_NORMAL,                            // Internet normal
RES_POOLCHR_INET_VISIT,                             // Internet besucht
RES_POOLCHR_JUMPEDIT,                               // Platzhalter
RES_POOLCHR_TOXJUMP,                                // Sprung aus Verzeichnis
RES_POOLCHR_ENDNOTE,                                // Endnote
RES_POOLCHR_LINENUM,                                // Zeilennummerierung
RES_POOLCHR_IDX_MAIN_ENTRY,                         // main entry in indexes
RES_POOLCHR_FOOTNOTE_ANCHOR,                        // Fussnotenanker
RES_POOLCHR_ENDNOTE_ANCHOR,                         // Endnotenanker

RES_POOLCHR_NORMAL_END,

RES_POOLCHR_HTML_BEGIN = RES_POOLCHR_BEGIN + 50,    // HTML-Vorlagen
RES_POOLCHR_HTML_EMPHASIS= RES_POOLCHR_HTML_BEGIN,
RES_POOLCHR_HTML_CITIATION,
RES_POOLCHR_HTML_STRONG,
RES_POOLCHR_HTML_CODE,
RES_POOLCHR_HTML_SAMPLE,
RES_POOLCHR_HTML_KEYBOARD,
RES_POOLCHR_HTML_VARIABLE,
RES_POOLCHR_HTML_DEFINSTANCE,
RES_POOLCHR_HTML_TELETYPE,
RES_POOLCHR_HTML_END,

RES_POOLCHR_END = RES_POOLCHR_HTML_END
};


// die Id's fuer die Rahmen-Vorlagen
enum RES_POOL_FRMFMT_TYPE
{
RES_POOLFRM_BEGIN = POOLGRP_FRAMEFMT,

RES_POOLFRM_FRAME = RES_POOLFRM_BEGIN,              // Rahmen
RES_POOLFRM_GRAPHIC,                                // Graphic
RES_POOLFRM_OLE,                                    // OLE
RES_POOLFRM_FORMEL,                                 // Formeln
RES_POOLFRM_MARGINAL,                               // Marginalen
RES_POOLFRM_WATERSIGN,                              // Wasserzeichen
RES_POOLFRM_LABEL,                                  // Etikette

RES_POOLFRM_END
};

// die Id's fuer die Seiten-Vorlagen
enum RES_POOL_PAGEFMT_TYPE
{
RES_POOLPAGE_BEGIN = POOLGRP_PAGEDESC,

RES_POOLPAGE_STANDARD = RES_POOLPAGE_BEGIN,         // Standard-Seite
RES_POOLPAGE_FIRST,                                 // Erste Seite
RES_POOLPAGE_LEFT,                                  // Linke Seite
RES_POOLPAGE_RIGHT,                                 // Rechte Seite
RES_POOLPAGE_JAKET,                                 // Umschlag
RES_POOLPAGE_REGISTER,                              // Verzeichnis
RES_POOLPAGE_HTML,                                  // HTML
RES_POOLPAGE_FOOTNOTE,                              // Fussnote bei Dokumentende
RES_POOLPAGE_ENDNOTE,                               // Endnotensseite

RES_POOLPAGE_END
};

// die Id's fuer die NumRule-Vorlagen
enum RES_POOL_NUMRULE_TYPE
{
RES_POOLNUMRULE_BEGIN = POOLGRP_NUMRULE,
RES_POOLNUMRULE_NUM1 = RES_POOLNUMRULE_BEGIN,       // NumRule Numerierung 1
RES_POOLNUMRULE_NUM2,                               // NumRule Numerierung 2
RES_POOLNUMRULE_NUM3,                               // NumRule Numerierung 3
RES_POOLNUMRULE_NUM4,                               // NumRule Numerierung 4
RES_POOLNUMRULE_NUM5,                               // NumRule Numerierung 5
RES_POOLNUMRULE_BUL1,                               // NumRule Bullets 1
RES_POOLNUMRULE_BUL2,                               // NumRule Bullets 2
RES_POOLNUMRULE_BUL3,                               // NumRule Bullets 3
RES_POOLNUMRULE_BUL4,                               // NumRule Bullets 4
RES_POOLNUMRULE_BUL5,                               // NumRule Bullets 5
RES_POOLNUMRULE_END
};

// die Id's fuer die Absatz-Vorlagen
enum RES_POOL_COLLFMT_TYPE
{
// Gruppe Text
RES_POOLCOLL_TEXT_BEGIN = COLL_TEXT_BITS,

RES_POOLCOLL_STANDARD = RES_POOLCOLL_TEXT_BEGIN,        // Standard
RES_POOLCOLL_TEXT,                                      // Textkoerper
RES_POOLCOLL_TEXT_IDENT,                                // Textkoerper Einzug
RES_POOLCOLL_TEXT_NEGIDENT,                             // Textkoerper neg. Einzug
RES_POOLCOLL_TEXT_MOVE,                                 // Textkoerper Einrueckung
RES_POOLCOLL_GREETING,                                  // Grussformel
RES_POOLCOLL_SIGNATURE,                                 // Unterschrift
RES_POOLCOLL_CONFRONTATION,                             // Gegenueberstellung
RES_POOLCOLL_MARGINAL,                                  // Marginalie

    // Untergruppierung Ueberschriften
RES_POOLCOLL_HEADLINE_BASE,                             // Basis-Ueberschrift
RES_POOLCOLL_HEADLINE1,                                 // Ueberschrift 1
RES_POOLCOLL_HEADLINE2,                                 // Ueberschrift 2
RES_POOLCOLL_HEADLINE3,                                 // Ueberschrift 3
RES_POOLCOLL_HEADLINE4,                                 // Ueberschrift 4
RES_POOLCOLL_HEADLINE5,                                 // Ueberschrift 5
RES_POOLCOLL_HEADLINE6,                                 // Ueberschrift 6
RES_POOLCOLL_HEADLINE7,                                 // Ueberschrift 7
RES_POOLCOLL_HEADLINE8,                                 // Ueberschrift 8
RES_POOLCOLL_HEADLINE9,                                 // Ueberschrift 9
RES_POOLCOLL_HEADLINE10,                                // Ueberschrift 10

RES_POOLCOLL_TEXT_END,


// Gruppe Listen
RES_POOLCOLL_LISTS_BEGIN = COLL_LISTS_BITS,

RES_POOLCOLL_NUMBUL_BASE = RES_POOLCOLL_LISTS_BEGIN,    // Basis-Liste

    // Untergruppe Nummerierung
RES_POOLCOLL_NUM_LEVEL1S,                               // Start Level1
RES_POOLCOLL_NUM_LEVEL1,                                // 1. Level
RES_POOLCOLL_NUM_LEVEL1E,                               // Ende Level1
RES_POOLCOLL_NUM_NONUM1,                                // keine Nummerierung
RES_POOLCOLL_NUM_LEVEL2S,                               // Start 2. Level
RES_POOLCOLL_NUM_LEVEL2,                                // 2. Level
RES_POOLCOLL_NUM_LEVEL2E,                               // Ende 2. Level
RES_POOLCOLL_NUM_NONUM2,                                // keine Nummerierung
RES_POOLCOLL_NUM_LEVEL3S,                               // Start 3. Level
RES_POOLCOLL_NUM_LEVEL3,                                // 3. Level
RES_POOLCOLL_NUM_LEVEL3E,                               // Ende 3. Level
RES_POOLCOLL_NUM_NONUM3,                                // keine Nummerierung
RES_POOLCOLL_NUM_LEVEL4S,                               // Start 4. Level
RES_POOLCOLL_NUM_LEVEL4,                                // 4. Level
RES_POOLCOLL_NUM_LEVEL4E,                               // Ende 4. Level
RES_POOLCOLL_NUM_NONUM4,                                // keine Nummerierung
RES_POOLCOLL_NUM_LEVEL5S,                               // Start 5. Level
RES_POOLCOLL_NUM_LEVEL5,                                // 5. Level
RES_POOLCOLL_NUM_LEVEL5E,                               // Ende 5. Level
RES_POOLCOLL_NUM_NONUM5,                                // keine Nummerierung

    // Untergruppe Aufzaehlung
RES_POOLCOLL_BUL_LEVEL1S,                               // Start Level1
RES_POOLCOLL_BUL_LEVEL1,                                // 1. Level
RES_POOLCOLL_BUL_LEVEL1E,                               // Ende Level1
RES_POOLCOLL_BUL_NONUM1,                                // keine Nummerierung
RES_POOLCOLL_BUL_LEVEL2S,                               // Start 2. Level
RES_POOLCOLL_BUL_LEVEL2,                                // 2. Level
RES_POOLCOLL_BUL_LEVEL2E,                               // Ende 2. Level
RES_POOLCOLL_BUL_NONUM2,                                // keine Nummerierung
RES_POOLCOLL_BUL_LEVEL3S,                               // Start 3. Level
RES_POOLCOLL_BUL_LEVEL3,                                // 3. Level
RES_POOLCOLL_BUL_LEVEL3E,                               // Ende 3. Level
RES_POOLCOLL_BUL_NONUM3,                                // keine Nummerierung
RES_POOLCOLL_BUL_LEVEL4S,                               // Start 4. Level
RES_POOLCOLL_BUL_LEVEL4,                                // 4. Level
RES_POOLCOLL_BUL_LEVEL4E,                               // Ende 4. Level
RES_POOLCOLL_BUL_NONUM4,                                // keine Nummerierung
RES_POOLCOLL_BUL_LEVEL5S,                               // Start 5. Level
RES_POOLCOLL_BUL_LEVEL5,                                // 5. Level
RES_POOLCOLL_BUL_LEVEL5E,                               // Ende 5. Level
RES_POOLCOLL_BUL_NONUM5,                                // keine Nummerierung

RES_POOLCOLL_LISTS_END,


// Sonderbereiche
RES_POOLCOLL_EXTRA_BEGIN = COLL_EXTRA_BITS,

    // Untergruppe Header
RES_POOLCOLL_HEADER = RES_POOLCOLL_EXTRA_BEGIN,         // Header Left&Right
RES_POOLCOLL_HEADERL,                                   // Header Left
RES_POOLCOLL_HEADERR,                                   // Header Right

    // Untergruppe Footer
RES_POOLCOLL_FOOTER,                                    // Footer Left&Right
RES_POOLCOLL_FOOTERL,                                   // Footer Left
RES_POOLCOLL_FOOTERR,                                   // Footer Right

    // Untergruppe Tabelle
RES_POOLCOLL_TABLE,                                     // Tabelle "Inhalt"
RES_POOLCOLL_TABLE_HDLN,                                // Tabellen-Headline


    // Untergruppe Beschriftung
RES_POOLCOLL_LABEL,                                     // Beschriftung-Basis
RES_POOLCOLL_LABEL_ABB,                                 // Beschriftung-Abbildung
RES_POOLCOLL_LABEL_TABLE,                               // Beschriftung-Tabelle
RES_POOLCOLL_LABEL_FRAME,                               // Beschriftung-Rahmen

    // sonstiges
RES_POOLCOLL_FRAME,                                     // Rahmen
RES_POOLCOLL_FOOTNOTE,                                  // Fussnoten
RES_POOLCOLL_JAKETADRESS,                               // UmschlagAdresse
RES_POOLCOLL_SENDADRESS,                                // AbsenderAdresse
RES_POOLCOLL_ENDNOTE,                                   // Endnoten

RES_POOLCOLL_LABEL_DRAWING,                             // Beschriftung-Zeichen-Objekte
RES_POOLCOLL_EXTRA_END,


// Gruppe Verzeichnisse
RES_POOLCOLL_REGISTER_BEGIN = COLL_REGISTER_BITS,

RES_POOLCOLL_REGISTER_BASE = RES_POOLCOLL_REGISTER_BEGIN,   // Basis-Verzeichnis

    // Untergruppe Index-Verzeichnisse
RES_POOLCOLL_TOX_IDXH,                                  // Header
RES_POOLCOLL_TOX_IDX1,                                  // 1. Ebene
RES_POOLCOLL_TOX_IDX2,                                  // 2. Ebene
RES_POOLCOLL_TOX_IDX3,                                  // 3. Ebene
RES_POOLCOLL_TOX_IDXBREAK,                              // Trenner

    // Untergruppe Inhalts-Verzeichnisse
RES_POOLCOLL_TOX_CNTNTH,                                // Header
RES_POOLCOLL_TOX_CNTNT1,                                // 1. Ebene
RES_POOLCOLL_TOX_CNTNT2,                                // 2. Ebene
RES_POOLCOLL_TOX_CNTNT3,                                // 3. Ebene
RES_POOLCOLL_TOX_CNTNT4,                                // 4. Ebene
RES_POOLCOLL_TOX_CNTNT5,                                // 5. Ebene

    // Untergruppe Benutzer-Verzeichnisse:
RES_POOLCOLL_TOX_USERH,                                 // Header
RES_POOLCOLL_TOX_USER1,                                 // 1. Ebene
RES_POOLCOLL_TOX_USER2,                                 // 2. Ebene
RES_POOLCOLL_TOX_USER3,                                 // 3. Ebene
RES_POOLCOLL_TOX_USER4,                                 // 4. Ebene
RES_POOLCOLL_TOX_USER5,                                 // 5. Ebene


RES_POOLCOLL_TOX_CNTNT6,                                // Inhalt 6. Ebene
RES_POOLCOLL_TOX_CNTNT7,                                // Inhalt 7. Ebene
RES_POOLCOLL_TOX_CNTNT8,                                // Inhalt 8. Ebene
RES_POOLCOLL_TOX_CNTNT9,                                // Inhalt 9. Ebene
RES_POOLCOLL_TOX_CNTNT10,                               // Inhalt 10. Ebene

// illustrations index
RES_POOLCOLL_TOX_ILLUSH,                                    // illustrations header
RES_POOLCOLL_TOX_ILLUS1,                                 // illustrations all levels

//  object index
RES_POOLCOLL_TOX_OBJECTH,                               // objects header
RES_POOLCOLL_TOX_OBJECT1,                                // objects all levels

//  tables index
RES_POOLCOLL_TOX_TABLESH,                               // tables header
RES_POOLCOLL_TOX_TABLES1,                                // tables all levels

//  index of authorities
RES_POOLCOLL_TOX_AUTHORITIESH,                          // authorities header
RES_POOLCOLL_TOX_AUTHORITIES1,                           // authorities all levels

// user index 6..10
RES_POOLCOLL_TOX_USER6,                                 // level 6
RES_POOLCOLL_TOX_USER7,                                 // level 7
RES_POOLCOLL_TOX_USER8,                                 // level 8
RES_POOLCOLL_TOX_USER9,                                 // level 9
RES_POOLCOLL_TOX_USER10,                                // level 10

RES_POOLCOLL_REGISTER_END,


// Gruppe Kapitel/Dokument
RES_POOLCOLL_DOC_BEGIN = COLL_DOC_BITS,

RES_POOLCOLL_DOC_TITEL = RES_POOLCOLL_DOC_BEGIN,        // Doc. Titel
RES_POOLCOLL_DOC_SUBTITEL,                              // Doc. UnterTitel

RES_POOLCOLL_DOC_END,

// Gruppe HTML-Vorlagen
RES_POOLCOLL_HTML_BEGIN = COLL_HTML_BITS,

RES_POOLCOLL_HTML_BLOCKQUOTE = RES_POOLCOLL_HTML_BEGIN,
RES_POOLCOLL_HTML_PRE,
RES_POOLCOLL_HTML_HR,
RES_POOLCOLL_HTML_DD,
RES_POOLCOLL_HTML_DT,

RES_POOLCOLL_HTML_END

// Ende der Textformat-Vorlagen Sammlung
};



// erfrage den definierten Parent zu einer POOL-Id
//  returnt:    0           -> Standard
//              USHRT_MAX   -> kein Parent
//              sonst       -> den Parent
USHORT GetPoolParent( USHORT nId );

// erfrage zu einer PoolId den Namen (steht im poolfmt.cxx)
class String;
String& GetDocPoolNm( USHORT nId, String& rFillNm );

inline BOOL IsConditionalByPoolId(USHORT nId)
    {
        return RES_POOLCOLL_TEXT == nId;
    }
// die Id's fuer die Grafik-Formate
/*enum RES_POOL_GRFFMT_TYPE
{
RES_POOLGRF_BEGIN = RES_POOLPAR_END,
RES_POOLGRF_1 = RES_POOLGRF_BEGIN,
RES_POOLGRF_END
};
*/

#endif
diff --git a/sw/inc/pvprtdat.hxx b/sw/inc/pvprtdat.hxx
new file mode 100644
index 0000000..91f784a
--- /dev/null
+++ b/sw/inc/pvprtdat.hxx
@@ -0,0 +1,120 @@
/*************************************************************************
 *
 *  $RCSfile: pvprtdat.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:27 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _PVPRTDAT_HXX
#define _PVPRTDAT_HXX


#ifndef _SOLAR_H
#include <tools/solar.h>
#endif

class SwPagePreViewPrtData
{
    ULONG nLeftSpace, nRightSpace, nTopSpace, nBottomSpace,
            nHorzSpace, nVertSpace;
    BYTE nRow, nCol;
    BOOL bLandscape : 1;
    BOOL bStretch : 1;
public:
    SwPagePreViewPrtData()
        : nLeftSpace(0), nRightSpace(0), nTopSpace(0), nBottomSpace(0),
            nHorzSpace(0), nVertSpace(0), nRow(1), nCol(1),
            bLandscape(0),bStretch(0)
    {}

    ULONG GetLeftSpace() const          { return nLeftSpace; }
    void SetLeftSpace( ULONG n )        { nLeftSpace = n; }

    ULONG GetRightSpace() const         { return nRightSpace; }
    void SetRightSpace( ULONG n )       { nRightSpace = n; }

    ULONG GetTopSpace() const           { return nTopSpace; }
    void SetTopSpace( ULONG n )         { nTopSpace = n; }

    ULONG GetBottomSpace() const        { return nBottomSpace; }
    void SetBottomSpace( ULONG n )      { nBottomSpace = n; }

    ULONG GetHorzSpace() const          { return nHorzSpace; }
    void SetHorzSpace( ULONG n )        { nHorzSpace = n; }

    ULONG GetVertSpace() const          { return nVertSpace; }
    void SetVertSpace( ULONG n )        { nVertSpace = n; }

    BYTE GetRow() const                 { return nRow; }
    void SetRow(BYTE n )                { nRow = n; }

    BYTE GetCol() const                 { return nCol; }
    void SetCol( BYTE n )               { nCol = n; }

    BOOL GetLandscape() const           { return bLandscape; }
    void SetLandscape( BOOL b )         { bLandscape = b; }

    // JP 19.08.98: wird zur Zeit nicht ausgewertet, weil der Font sich
    //              nicht enstprechend stretch laesst.
    BOOL GetStretch() const             { return bStretch; }
    void SetStretch( BOOL b )           { bStretch = b; }
};


#endif


diff --git a/sw/inc/rcid.hrc b/sw/inc/rcid.hrc
new file mode 100644
index 0000000..11faf7e
--- /dev/null
+++ b/sw/inc/rcid.hrc
@@ -0,0 +1,316 @@
/*************************************************************************
 *
 *  $RCSfile: rcid.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:27 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _RDIC_HRC
#define _RDIC_HRC

#ifndef _SFXSIDS_HRC //autogen
#include <sfx2/sfxsids.hrc>
#endif

// ----------------------------------------------------------------
// Bereiche fuer die UI-Verzeichnisse
// ----------------------------------------------------------------

#define RC_BASE                     RID_SW_START    // aus solar.hrc

#define RC_APP                      RC_BASE
#define RC_DIALOG                   (RC_BASE + 200)
#define RC_DOCVW                    (RC_BASE + 300)
#define RC_WEB                      (RC_BASE + 400)
#define RC_GLOBDOC                  (RC_BASE + 500)
#define RC_VIEW                     (RC_BASE + 600)
#define RC_CHRDLG                   (RC_BASE + 700)
#define RC_RIBBAR                   (RC_BASE + 720)
#define RC_GLOBALS                  (RC_BASE + 820)
#define RC_FMTUI                    (RC_BASE + 920)
#define RC_FRMDLG                   (RC_BASE + 1000)
#define RC_FLDDLG                   (RC_BASE + 1100)
#define RC_UTLUI                    (RC_BASE + 1250)
#define RC_ATTR                     (RC_BASE + 1350)
#define RC_TABLE                    (RC_BASE + 1450)
#define RC_CONFIG                   (RC_BASE + 1550)
#define RC_MISC                     (RC_BASE + 1650)
#define RC_WRTSH                    (RC_BASE + 1750)
#define RC_INDEX                    (RC_BASE + 1950)
#define RC_DBUI                     (RC_BASE + 2050)
#define RC_DOCHDL                   (RC_BASE + 2150)
#define RC_POOLCHRFMT               (RC_BASE + 2250)
#define RC_POOLHTMLCHRFMT           (RC_BASE + 2290)
#define RC_POOLFRMFMT               (RC_BASE + 2330)
#define RC_POOLTXTCOLL              (RC_BASE + 2360)
#define RC_POOLPAGEDESC             (RC_BASE + 2550)
#define RC_POOLNUMRULE              (RC_BASE + 2650)
#define RC_ENVELP                   (RC_BASE + 2750)
#define RC_STATLIN_STR              (RC_BASE + 2850)
#define RC_COMMON_CORE              (RC_BASE + 2950)
#define RC_WIZARD                   (RC_BASE + 3050)
#define RC_POPUPS                   (RC_BASE + 3150)
#define RC_SHELLS                   (RC_BASE + 3250)
#define RC_CFGITEMS                 (RC_BASE + 3350)
#define RC_LINGU                    (RC_BASE + 3450)
#define RC_POOLCHRFMT_PRGM          (RC_BASE + 3550)
#define RC_POOLHTMLCHRFMT_PRGM      (RC_BASE + 3590)
#define RC_POOLFRMFMT_PRGM          (RC_BASE + 3630)
#define RC_POOLTXTCOLL_PRGM         (RC_BASE + 3660)
#define RC_POOLPAGEDESC_PRGM        (RC_BASE + 3850)
#define RC_POOLNUMRULE_PRGM         (RC_BASE + 3900)

/*--------------------------------------------------------------------
    Beschreibung:   Bereiche ausspannen
 --------------------------------------------------------------------*/

// App-Verzeichnis
#define RC_APP_BEGIN                RC_APP
#define RC_APP_END                  (RC_APP_BEGIN + 199)



// Dialog-Verzeichnis
#define RC_DIALOG_BEGIN             RC_DIALOG
#define RC_DIALOG_END               (RC_DIALOG_BEGIN + 99)

// Editwin & Co
#define RC_DOCVW_BEGIN              RC_DOCVW
#define RC_DOCVW_END                (RC_DOCVW_BEGIN + 99)

// SW/Web
#define RC_WEB_BEGIN                RC_WEB
#define RC_WEB_END                  (RC_WEB_BEGIN + 199)

//Globaldocument
#define RC_GLOBDOC_BEGIN            RC_GLOBDOC
#define RC_GLOBDOC_END              (RC_GLOBDOC_BEGIN + 99)

// UI-View
#define RC_VIEW_BEGIN               RC_VIEW
#define RC_VIEW_END                 (RC_VIEW_BEGIN + 99)

// Zeichen Absatz Tab-Dialog
#define RC_CHRDLG_BEGIN             RC_CHRDLG
#define RC_CHRDLG_END               (RC_CHRDLG_BEGIN + 9)

// Unsere Shell
#define RC_WRTSH_BEGIN              RC_WRTSH
#define RC_WRTSH_END                (RC_WRTSH_BEGIN + 199)

// Verzeichnisse
#define RC_INDEX_BEGIN              RC_INDEX
#define RC_INDEX_END                (RC_INDEX + 99)

//
#define RC_RIBBAR_BEGIN             RC_RIBBAR
#define RC_RIBBAR_END               (RC_RIBBAR_BEGIN + 99)

// globale Ressourcen
#define RC_GLOBALS_BEGIN            RC_GLOBALS
#define RC_GLOBALS_END              (RC_GLOBALS_BEGIN + 99)

// Format-Vorlagen
#define RC_FMTUI_BEGIN              RC_FMTUI
#define RC_FMTUI_END                (RC_FMTUI_BEGIN + 69)


// Grafik Dialoge
#define RC_GRFDLG_BEGIN             RC_GRFDLG
#define RC_GRFDLG_END               (RC_GRFDLG_BEGIN + 99)

// ????
#define RC_FSTDLG_BEGIN             RC_FSTDLG
#define RC_FSTDLG_END               (RC_FSTDLG_BEGIN + 99)

// Rahmen Dialoge
#define RC_FRMDLG_BEGIN             RC_FRMDLG
#define RC_FRMDLG_END               (RC_FRMDLG_BEGIN + 99)

// Feld Dialoge
#define RC_FLDDLG_BEGIN             RC_FLDDLG
#define RC_FLDDLG_END               (RC_FLDDLG_BEGIN + 149)

// Utilities UI
#define RC_UTLUI_BEGIN              RC_UTLUI
#define RC_UTLUI_END                (RC_UTLUI + 99)

// Utilities UI-Attribute
#define RC_ATTR_BEGIN               RC_ATTR
#define RC_ATTR_END                 (RC_ATTR + 99)

// Tabellen
#define RC_TABLE_BEGIN              RC_TABLE
#define RC_TABLE_END                (RC_TABLE + 99)

// Konfiguration
#define RC_CONFIG_BEGIN             RC_CONFIG
#define RC_CONFIG_END               (RC_CONFIG + 99)


// Verschiedenes
#define RC_MISC_BEGIN               RC_MISC
#define RC_MISC_END                 (RC_MISC + 99)

// DBMgr
#define RC_DBUI_BEGIN               RC_DBUI
#define RC_DBUI_END                 (RC_DBUI + 99)

// Der Rest der Imp-Klassen
#define RC_DOCHDL_BEGIN             RC_DOCHDL
#define RC_DOCHDL_END               (RC_DOCHDL + 99)

// Zeichenvorlagen
#define RC_POOLCHRFMT_BEGIN         RC_POOLCHRFMT
#define RC_POOLCHRFMT_END           (RC_POOLCHRFMT + 29)
#define RC_POOLCHRFMT_HTML_BEGIN    RC_POOLHTMLCHRFMT
#define RC_POOLCHRFMT_HTML_END      (RC_POOLHTMLCHRFMT+ 30)

#define RC_POOLCHRFMT_PRGM_BEGIN         RC_POOLCHRFMT_PRGM
#define RC_POOLCHRFMT_PRGM_END           (RC_POOLCHRFMT_PRGM + 29)
#define RC_POOLCHRFMT_PRGM_HTML_BEGIN    RC_POOLHTMLCHRFMT_PRGM
#define RC_POOLCHRFMT_PRGM_HTML_END      (RC_POOLHTMLCHRFMT_PRGM+ 30)

// Rahmenvorlagen
#define RC_POOLFRMFMT_BEGIN         RC_POOLFRMFMT
#define RC_POOLFRMFMT_END           (RC_POOLFRMFMT + 20)

#define RC_POOLFRMFMT_PRGM_BEGIN    RC_POOLFRMFMT_PRGM
#define RC_POOLFRMFMT_PRGM_END      (RC_POOLFRMFMT_PRGM + 20)

// Collections
#define RC_POOLTXTCOLL_BEGIN        RC_POOLTXTCOLL

#define RC_POOLCOLL_TEXT_BEGIN      RC_POOLTXTCOLL
#define RC_POOLCOLL_TEXT_END        (RC_POOLTXTCOLL + 19)
#define RC_POOLCOLL_LISTS_BEGIN     (RC_POOLTXTCOLL + 20)
#define RC_POOLCOLL_LISTS_END       (RC_POOLTXTCOLL + 69)
#define RC_POOLCOLL_EXTRA_BEGIN     (RC_POOLTXTCOLL + 70)
#define RC_POOLCOLL_EXTRA_END       (RC_POOLTXTCOLL + 89)
#define RC_POOLCOLL_REGISTER_BEGIN  (RC_POOLTXTCOLL + 90)
#define RC_POOLCOLL_REGISTER_END    (RC_POOLTXTCOLL + 119)
#define RC_POOLCOLL_DOC_BEGIN       (RC_POOLTXTCOLL + 130)
#define RC_POOLCOLL_DOC_END         (RC_POOLTXTCOLL + 139)
#define RC_POOLCOLL_HTML_BEGIN      (RC_POOLTXTCOLL + 140)
#define RC_POOLCOLL_HTML_END        (RC_POOLTXTCOLL + 169)

#define RC_POOLTXTCOLL_END          RC_POOLCOLL_HTML_END

#define RC_POOLCOLL_PRGM_PRGM__BEGIN    RC_POOLTXTCOLL_PRGM

#define RC_POOLCOLL_PRGM_TEXT_BEGIN     RC_POOLTXTCOLL_PRGM
#define RC_POOLCOLL_PRGM_TEXT_END       (RC_POOLTXTCOLL_PRGM + 19)
#define RC_POOLCOLL_PRGM_LISTS_BEGIN    (RC_POOLTXTCOLL_PRGM + 20)
#define RC_POOLCOLL_PRGM_LISTS_END      (RC_POOLTXTCOLL_PRGM + 69)
#define RC_POOLCOLL_PRGM_EXTRA_BEGIN    (RC_POOLTXTCOLL_PRGM + 70)
#define RC_POOLCOLL_PRGM_EXTRA_END      (RC_POOLTXTCOLL_PRGM + 89)
#define RC_POOLCOLL_PRGM_REGISTER_BEGIN (RC_POOLTXTCOLL_PRGM + 90)
#define RC_POOLCOLL_PRGM_REGISTER_END   (RC_POOLTXTCOLL_PRGM + 119)
#define RC_POOLCOLL_PRGM_DOC_BEGIN      (RC_POOLTXTCOLL_PRGM + 130)
#define RC_POOLCOLL_PRGM_DOC_END        (RC_POOLTXTCOLL_PRGM + 139)
#define RC_POOLCOLL_PRGM_HTML_BEGIN     (RC_POOLTXTCOLL_PRGM + 140)
#define RC_POOLCOLL_PRGM_HTML_END       (RC_POOLTXTCOLL_PRGM + 169)

#define RC_POOLTXTCOLL_PRGM__END          RC_POOLCOLL_PRGM_HTML_END

// Poolvorlagen Seite
#define RC_POOLPAGEDESC_BEGIN       RC_POOLPAGEDESC
#define RC_POOLPAGEDESC_END         (RC_POOLPAGEDESC + 10)

#define RC_POOLPAGEDESC_PRGM_BEGIN        RC_POOLPAGEDESC_PRGM
#define RC_POOLPAGEDESC_PRGM_END         (RC_POOLPAGEDESC_PRGM + 10)

// Poolvorlagen Numerierung
#define RC_POOLNUMRULE_BEGIN        RC_POOLNUMRULE
#define RC_POOLNUMRULE_END          (RC_POOLNUMRULE + 10)

#define RC_POOLNUMRULE_PRGM_BEGIN         RC_POOLNUMRULE_PRGM
#define RC_POOLNUMRULE_PRGM_END          (RC_POOLNUMRULE_PRGM + 10)

// Envelp-Verzeichnis
#define RC_ENVELP_BEGIN             (RC_ENVELP     )
#define RC_ENVELP_END               (RC_ENVELP + 99)

// Statuszeile mit Laufbalken
#define RC_STATLIN_STR_BEGIN        (RC_STATLIN_STR)
#define RC_STATLIN_STR_END          (RC_STATLIN_STR + 49)

// Gemeinsame Core-Strings
#define RC_COMCORE_BEGIN            (RC_COMMON_CORE)
#define RC_COMCORE_END              (RC_COMMON_CORE + 49)

// Wizzards
#define RC_WIZARD_BEGIN             RC_WIZARD
#define RC_WIZARD_END               (RC_WIZARD + 99)

// Shell-Verzeichnis
#define RC_SHELLS_BEGIN             RC_SHELLS
#define RC_SHELLS_END               (RC_SHELLS + 99)

// PopUpMenu's
#define RC_POPUPS_BEGIN             RC_POPUPS
#define RC_POPUPS_END               (RC_POPUPS + 99)

// Strings fuer ConfigItems in div. Verzeichnissen
#define RC_CFGITEMS_BEGIN           RC_CFGITEMS
#define RC_CFGITEMS_END             (RC_CFGITEMS + 99)

// Lingu
#define RC_LINGU_BEGIN          RC_LINGU
#define RC_LINGU_END                    (RC_LINGU + 99)


#endif
diff --git a/sw/inc/redline.hxx b/sw/inc/redline.hxx
new file mode 100644
index 0000000..51b54f0
--- /dev/null
+++ b/sw/inc/redline.hxx
@@ -0,0 +1,312 @@
/*************************************************************************
 *
 *  $RCSfile: redline.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:27 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _REDLINE_HXX
#define _REDLINE_HXX

#ifndef _DATETIME_HXX //autogen
#include <tools/datetime.hxx>
#endif
#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif

#ifndef _PAM_HXX
#include "pam.hxx"
#endif
#ifndef _REDLENUM_HXX
#include "redlenum.hxx"         // enums
#endif

class SfxItemSet;

class SwRedlineExtraData
{
    SwRedlineExtraData( const SwRedlineExtraData& );
    SwRedlineExtraData& operator=( const SwRedlineExtraData& );

protected:
    SwRedlineExtraData() {}

public:
    virtual ~SwRedlineExtraData();
    virtual SwRedlineExtraData* CreateNew() const = 0;

    virtual void Accept( SwPaM& rPam ) const;
    virtual void Reject( SwPaM& rPam ) const;
    virtual int operator == ( const SwRedlineExtraData& ) const;
};

class SwRedlineExtraData_FmtColl : public SwRedlineExtraData
{
    String sFmtNm;
    SfxItemSet* pSet;
    USHORT nPoolId;
public:
    SwRedlineExtraData_FmtColl( const String& rColl, USHORT nPoolFmtId,
                                const SfxItemSet* pSet = 0 );
    virtual ~SwRedlineExtraData_FmtColl();
    virtual SwRedlineExtraData* CreateNew() const;
    virtual void Reject( SwPaM& rPam ) const;
    virtual int operator == ( const SwRedlineExtraData& ) const;

    void SetItemSet( const SfxItemSet& rSet );
};

class SwRedlineExtraData_Format : public SwRedlineExtraData
{
    USHORT nWhich;
public:
    SwRedlineExtraData_Format( USHORT nWhich );
    virtual SwRedlineExtraData* CreateNew() const;
    virtual void Reject( SwPaM& rPam ) const;
    virtual int operator == ( const SwRedlineExtraData& ) const;
};


class SwRedlineData
{
    friend class SwRedline;
    SwRedlineData* pNext;       // Verweis auf weitere Daten
    SwRedlineExtraData* pExtraData;

    String sComment;
    DateTime aStamp;
    SwRedlineType eType;
    USHORT nAuthor, nSeqNo;

public:
    SwRedlineData( SwRedlineType eT, USHORT nAut );
    SwRedlineData( const SwRedlineData& rCpy, BOOL bCpyNext = TRUE );

    // fuer sw3io: pNext/pExtraData gehen in eigenen Besitz ueber!
    SwRedlineData( SwRedlineType eT, USHORT nAut, const DateTime& rDT,
                   const String& rCmnt, SwRedlineData* pNxt,
                    SwRedlineExtraData* pExtraData = 0 );

    ~SwRedlineData();

    int operator==( const SwRedlineData& rCmp ) const
        {
            return nAuthor == rCmp.nAuthor &&
                    eType == rCmp.eType &&
                    sComment == rCmp.sComment &&
                    (( !pNext && !rCmp.pNext ) ||
                        ( pNext && rCmp.pNext && *pNext == *rCmp.pNext )) &&
                    (( !pExtraData && !rCmp.pExtraData ) ||
                        ( pExtraData && rCmp.pExtraData &&
                            *pExtraData == *rCmp.pExtraData ));
        }
    int operator!=( const SwRedlineData& rCmp ) const
        {   return !operator==( rCmp ); }

    SwRedlineType GetType() const
        { return SwRedlineType( eType & REDLINE_NO_FLAG_MASK); }
    SwRedlineType GetRealType() const       { return eType; }
    USHORT GetAuthor() const                { return nAuthor; }
    const String& GetComment() const        { return sComment; }
    const DateTime& GetTimeStamp() const    { return aStamp; }
    inline const SwRedlineData* Next() const{ return pNext; }

    void SetTimeStamp( const DateTime& rDT)
        { aStamp = rDT; aStamp.SetSec( 0 ); aStamp.Set100Sec( 0 ); }
    void SetComment( const String& rS )     { sComment = rS; }
    void SetAutoFmtFlag()
        { eType = SwRedlineType( eType | REDLINE_FORM_AUTOFMT ); }
    int CanCombine( const SwRedlineData& rCmp ) const
        {
            return nAuthor == rCmp.nAuthor &&
                    eType == rCmp.eType &&
                    sComment == rCmp.sComment &&
                    GetTimeStamp() == rCmp.GetTimeStamp() &&
                    (( !pNext && !rCmp.pNext ) ||
                        ( pNext && rCmp.pNext &&
                        pNext->CanCombine( *rCmp.pNext ))) &&
                    (( !pExtraData && !rCmp.pExtraData ) ||
                        ( pExtraData && rCmp.pExtraData &&
                            *pExtraData == *rCmp.pExtraData ));
        }

    // ExtraData wird kopiert, der Pointer geht also NICHT in den Besitz
    // des RedlineObjectes!
    void SetExtraData( const SwRedlineExtraData* pData );
    const SwRedlineExtraData* GetExtraData() const { return pExtraData; }

    // fuers UI-seitige zusammenfassen von Redline-Actionen. Wird z.Z. nur
    // fuers Autoformat mit Redline benoetigt. Der Wert != 0 bedeutet dabei,
    // das es noch weitere geben kann!
    USHORT GetSeqNo() const                     { return nSeqNo; }
    void SetSeqNo( USHORT nNo )                 { nSeqNo = nNo; }
};


class SwRedline : public SwPaM
{
    SwRedlineData* pRedlineData;
    SwNodeIndex* pCntntSect;
    BOOL bDelLastPara : 1;
    BOOL bIsLastParaDelete : 1;
    BOOL bIsVisible : 1;

    void MoveToSection();
    void CopyToSection();
    void DelCopyOfSection();
    void MoveFromSection();

public:
    SwRedline( SwRedlineType eType, const SwPaM& rPam );
    SwRedline( SwRedlineType eTyp, const SwPosition& rPos );
    SwRedline( const SwRedlineData& rData, const SwPaM& rPam );
    SwRedline( const SwRedlineData& rData, const SwPosition& rPos );
    // fuer sw3io: pData geht in eigenen Besitz ueber!
    SwRedline( SwRedlineData* pData, const SwPosition& rPos, BOOL bVsbl,
               BOOL bDelLP, BOOL bIsPD ) :
        SwPaM( rPos ), pCntntSect( 0 ), pRedlineData( pData ),
        bIsVisible( bVsbl ), bDelLastPara( bDelLP ), bIsLastParaDelete( bIsPD )
    {}
    SwRedline( const SwRedline& );
    virtual ~SwRedline();

    SwNodeIndex* GetContentIdx() const { return pCntntSect; }
    // fuers Undo
    void SetContentIdx( const SwNodeIndex* );

    BOOL IsVisible() const { return bIsVisible; }
    BOOL IsDelLastPara() const { return bDelLastPara; }
    BOOL IsLastParaDelete() const { return bIsLastParaDelete; }

    // das BOOL besagt, ob nach dem setzen der Pos kein Bereich mehr
    // aufgespannt ist. -> TRUE, ansonten Bereich und FALSE
    void SetStart( const SwPosition& rPos, SwPosition* pSttPtr = 0 )
    {
        if( !pSttPtr ) pSttPtr = Start();
        *pSttPtr = rPos;
    }
    void SetEnd( const SwPosition& rPos, SwPosition* pEndPtr = 0 )
    {
        if( !pEndPtr ) pEndPtr = End();
        *pEndPtr = rPos;
    }
    // liegt eine gueltige Selektion vor?
    BOOL HasValidRange() const;

    USHORT GetAuthor() const { return pRedlineData->GetAuthor(); }
    const DateTime& GetTimeStamp() const { return pRedlineData->GetTimeStamp(); }
    SwRedlineType GetType() const { return pRedlineData->GetType(); }
    SwRedlineType GetRealType() const { return pRedlineData->GetRealType(); }
    const SwRedlineData& GetRedlineData() const { return *pRedlineData; }
    int operator==( const SwRedlineData& rCmp ) const
        { return *pRedlineData == rCmp; }
    int operator!=( const SwRedlineData& rCmp ) const
        { return *pRedlineData != rCmp; }
    void SetAutoFmtFlag()               { pRedlineData->SetAutoFmtFlag(); }

    USHORT GetStackCount() const;
    USHORT GetAuthor( USHORT nPos ) const;
    const String& GetAuthorString( USHORT nPos = 0 ) const;
    const DateTime& GetTimeStamp( USHORT nPos ) const;
    SwRedlineType GetRealType( USHORT nPos ) const;
    SwRedlineType GetType( USHORT nPos ) const
        { return SwRedlineType( GetRealType( nPos ) & REDLINE_NO_FLAG_MASK); }
    const String& GetComment( USHORT nPos ) const;

    const String& GetComment() const    { return pRedlineData->GetComment(); }
    void SetComment( const String& rS ) { pRedlineData->SetComment( rS ); }

    // ExtraData wird kopiert, der Pointer geht also NICHT in den Besitz
    // des RedlineObjectes!
    void SetExtraData( const SwRedlineExtraData* pData )
        { pRedlineData->SetExtraData( pData ); }
    const SwRedlineExtraData* GetExtraData() const
        { return pRedlineData->GetExtraData(); }

    // fuers UI-seitige zusammenfassen von Redline-Actionen. Wird z.Z. nur
    // fuers Autoformat mit Redline benoetigt. Der Wert != 0 bedeutet dabei,
    // das es noch weitere geben kann!
    USHORT GetSeqNo() const             { return pRedlineData->GetSeqNo(); }
    void SetSeqNo( USHORT nNo )         { pRedlineData->SetSeqNo( nNo ); }

    // Beim Hide/ShowOriginal wird 2 mal ueber die Liste gelaufen, damit
    //  die Del-Redlines per Copy und Delete versteckt werden. Beim Move
    //  wird sonst die Attributierung falsch behandelt.
    // Alle anderen Aufrufer muessen immer 0 angeben.
    void CallDisplayFunc( USHORT nLoop = 0 );
    void Show( USHORT nLoop = 0 );
    void Hide( USHORT nLoop = 0 );
    void ShowOriginal( USHORT nLoop = 0 );

    void InvalidateRange();     // das Layout anstossen

    BOOL IsOwnRedline( const SwRedline& rRedl ) const
        { return GetAuthor() == rRedl.GetAuthor(); }
    BOOL CanCombine( const SwRedline& rRedl ) const;

    void PushData( const SwRedline& rRedl, BOOL bOwnAsNext = TRUE );
    BOOL PopData();

    int operator==( const SwRedline& ) const;
    int operator<( const SwRedline& ) const;
};





#endif
diff --git a/sw/inc/redlnaut.hxx b/sw/inc/redlnaut.hxx
new file mode 100644
index 0000000..1930c1f
--- /dev/null
+++ b/sw/inc/redlnaut.hxx
@@ -0,0 +1,106 @@
/*************************************************************************
 *
 *  $RCSfile: redlnaut.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:27 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _REDLNAUT_HXX
#define _REDLNAUT_HXX

#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif
#ifndef _SV_COLOR_HXX //autogen
#include <vcl/color.hxx>
#endif

#include "swtypes.hxx"

class SfxItemSet;

class SwRedlineAuthor
{
    String sAuthor;
    Color aChgLineColor;
    SfxItemSet *pInsAttrSet, *pDelAttrSet, *pFmtAttrSet;
    SwHoriOrient eChgLineOrient;
    BYTE cDelChar;
public:
    SwRedlineAuthor( SwAttrPool& rPool, const String& );
    SwRedlineAuthor( const SwRedlineAuthor& );
    ~SwRedlineAuthor();

    SwRedlineAuthor& operator=( const SwRedlineAuthor& );

    const String& GetAuthor() const { return sAuthor; }

    SfxItemSet& GetInsAttrSet() const { return *pInsAttrSet; }
    SfxItemSet& GetDelAttrSet() const { return *pDelAttrSet; }
    SfxItemSet& GetFmtAttrSet() const { return *pFmtAttrSet; }

    const Color& GetChgLineColor() const { return aChgLineColor; }
    void SetChgLineColor( const Color& rCol ) { aChgLineColor = rCol; }

    SwHoriOrient GetChgLineOrient() const { return eChgLineOrient; }
    void SetChgLineOrient( SwHoriOrient eVal ) { eChgLineOrient = eVal; }

    BYTE GetDelChar() const { return cDelChar; }
    void SetDelChar( BYTE cCh = 0 ) { cDelChar = cCh; }
};


#endif
diff --git a/sw/inc/reffld.hxx b/sw/inc/reffld.hxx
new file mode 100644
index 0000000..f48af6c
--- /dev/null
+++ b/sw/inc/reffld.hxx
@@ -0,0 +1,162 @@
/*************************************************************************
 *
 *  $RCSfile: reffld.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:27 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _REFFLD_HXX
#define _REFFLD_HXX

#ifndef _FLDBAS_HXX
#include <fldbas.hxx>
#endif

class SfxPoolItem;
class SwDoc;
class SwTxtAttr;
class SwTxtNode;

enum REFERENCESUBTYPE
{
    REF_SETREFATTR = 0,
    REF_SEQUENCEFLD,
    REF_BOOKMARK,
    REF_OUTLINE,
    REF_FOOTNOTE,
    REF_ENDNOTE
};

enum REFERENCEMARK
{
    REF_BEGIN,
    REF_PAGE = REF_BEGIN,
    REF_CHAPTER,
    REF_CONTENT,
    REF_UPDOWN,
    REF_PAGE_PGDESC,
    REF_ONLYNUMBER,
    REF_ONLYCAPTION,
    REF_ONLYSEQNO,
    REF_END
};


/*--------------------------------------------------------------------
    Beschreibung: Referenz holen
 --------------------------------------------------------------------*/

class SwGetRefFieldType : public SwFieldType
{
    SwDoc* pDoc;
public:
    SwGetRefFieldType(SwDoc* pDoc );
    virtual SwFieldType*    Copy() const;

    SwDoc*                  GetDoc() const { return pDoc; }
    // ueberlagert, um alle Ref-Felder zu updaten
    virtual void Modify( SfxPoolItem *, SfxPoolItem * );

    void MergeWithOtherDoc( SwDoc& rDestDoc );

    static SwTxtNode* FindAnchor( SwDoc* pDoc, const String& rRefMark,
                                        USHORT nSubType, USHORT nSeqNo,
                                        USHORT* pStt, USHORT* pEnd = 0 );
};

/*--------------------------------------------------------------------
    Beschreibung: Referenzfeld
 --------------------------------------------------------------------*/

class SwGetRefField : public SwField
{
    String sSetRefName;
    String sTxt;
    USHORT nSubType;
    USHORT nSeqNo;
public:
    SwGetRefField( SwGetRefFieldType*, const String& rSetRef,
                    USHORT nSubType, USHORT nSeqNo, ULONG nFmt );

    virtual String      GetCntnt(BOOL bName = FALSE) const;
    virtual String      Expand() const;
    virtual SwField*    Copy() const;

    const String&       GetSetRefName() const { return sSetRefName; }

    void                UpdateField();
    void                SetExpand( const String& rStr ) { sTxt = rStr; }

    // SubType erfragen/setzen
    virtual USHORT      GetSubType() const;
    virtual void        SetSubType( USHORT n );

    // SequenceNo erfragen/setzen (nur fuer REF_SEQUENCEFLD interressant)
    USHORT              GetSeqNo() const        { return nSeqNo; }
    void                SetSeqNo( USHORT n )    { nSeqNo = n; }

    // Name der Referenz
    virtual const String& GetPar1() const;
    virtual void        SetPar1(const String& rStr);

    virtual String      GetPar2() const;
    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );
};


#endif // _REFFLD_HXX

diff --git a/sw/inc/ring.hxx b/sw/inc/ring.hxx
new file mode 100644
index 0000000..750c7ec
--- /dev/null
+++ b/sw/inc/ring.hxx
@@ -0,0 +1,82 @@
/*************************************************************************
 *
 *  $RCSfile: ring.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:27 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _RING_HXX
#define _RING_HXX

class Ring
{
    Ring *pNext;
    Ring* pPrev;    // zur Optimierung, damit das ein/ausketten schneller geht!

protected:
    Ring()          { pNext = this; pPrev = this; }
    Ring( Ring * );
public:
    virtual ~Ring();
    void MoveTo( Ring *pDestRing );
    void MoveRingTo( Ring *pDestRing );

    Ring* GetNext() const       { return pNext; }
    Ring* GetPrev() const       { return pPrev; }
};


#endif
diff --git a/sw/inc/rolbck.hxx b/sw/inc/rolbck.hxx
new file mode 100644
index 0000000..434d3ed
--- /dev/null
+++ b/sw/inc/rolbck.hxx
@@ -0,0 +1,433 @@
/*************************************************************************
 *
 *  $RCSfile: rolbck.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:27 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _ROLBCK_HXX
#define _ROLBCK_HXX

#ifndef _SOLAR_H
#include <tools/solar.h>
#endif
#ifndef _SVSTDARR_HXX
#define _SVSTDARR_USHORTS
#define _SVSTDARR_USHORTSSORT
#include <svtools/svstdarr.hxx>
#endif

#ifndef _SFXITEMSET_HXX
#include <svtools/itemset.hxx>
#endif

//Nur die History anziehen, um das docnew.cxx gegen die CLOOK's zu behaupten.

class SwDoc;
class SwFmt;
class SwFmtColl;
class SwHstryHint;
class SwBookmark;
class SwTxtAttr;
class SfxPoolItem;
class SwTxtNode;
class SwCntntNode;
class SwUndoSaveSection;
class SwTxtFtn;
class SwTxtFlyCnt;
class SwUndoDelLayFmt;
class SwFlyFrmFmt;
class SwFmtFld;
class SwTxtFld;
class SwFieldType;
class SwTxtTOXMark;
class SwTxtRefMark;
class SwFrmFmt;
class SwNodeIndex;
class SwpHints;
class SwFmtChain;
class SwNode;

#ifndef ROLBCK_HISTORY_ONLY

#ifndef _TOX_HXX
#include <tox.hxx>
#endif

#ifndef PRODUCT
class Writer;
#define OUT_HSTR_HINT( name )   \
    friend Writer& OutUndo_Hstr_ ## name( Writer&, const SwHstryHint& );
#else
#define OUT_HSTR_HINT( name )
#endif

enum HISTORY_HINT {
    HSTRY_SETFMTHNT,
    HSTRY_RESETFMTHNT,
    HSTRY_SETTXTHNT,
    HSTRY_SETTXTFLDHNT,
    HSTRY_SETREFMARKHNT,
    HSTRY_SETTOXMARKHNT,
    HSTRY_RESETTXTHNT,
    HSTRY_SETFTNHNT,
    HSTRY_CHGFMTCOLL,
    HSTRY_FLYCNT,
    HSTRY_BOOKMARK,
    HSTRY_SETATTRSET,
    HSTRY_RESETATTRSET,
    HSTRY_CHGFLYANCHOR,
    HSTRY_CHGFLYCHAIN,
    HSTRY_END
};
class SwHstryHint
{
    HISTORY_HINT eWhichId;
public:
    SwHstryHint( HISTORY_HINT eWh ) : eWhichId( eWh ) {}
    virtual ~SwHstryHint() {}       // jetzt inline
    virtual void SetInDoc( SwDoc* pDoc, BOOL bTmpSet ) = 0;
    HISTORY_HINT Which() const                  { return eWhichId; }
};

class SwSetFmtHint : public SwHstryHint
{
    SfxPoolItem* pAttr;
    ULONG nNode;
    USHORT nSetStt;
    BYTE nNumLvl;
    BOOL bNumStt;
public:
    SwSetFmtHint( const SfxPoolItem* pFmtHt, ULONG nNode );
    virtual ~SwSetFmtHint();
    virtual void SetInDoc( SwDoc* pDoc, BOOL bTmpSet );
    OUT_HSTR_HINT(SetFmtHnt)
};

class SwResetFmtHint : public SwHstryHint
{
    ULONG nNode;
    USHORT nWhich;
public:
    SwResetFmtHint( const SfxPoolItem* pFmtHt, ULONG nNode );
    virtual void SetInDoc( SwDoc* pDoc, BOOL bTmpSet );
    OUT_HSTR_HINT(ResetFmtHnt)
};

class SwSetTxtHint : public SwHstryHint
{
    SfxPoolItem *pAttr;
    ULONG nNode;
    xub_StrLen nStart, nEnd;
public:
    SwSetTxtHint( /*const*/ SwTxtAttr* pTxtHt, ULONG nNode );
    virtual ~SwSetTxtHint();
    virtual void SetInDoc( SwDoc* pDoc, BOOL bTmpSet );
    OUT_HSTR_HINT(SetTxtHnt)
};

class SwSetTxtFldHint : public SwHstryHint
{
    SwFmtFld* pFld;
    SwFieldType* pFldType;
    ULONG nNode;
    xub_StrLen nPos;
    USHORT nFldWhich;
public:
    SwSetTxtFldHint( SwTxtFld* pTxtFld, ULONG nNode );
    virtual ~SwSetTxtFldHint();
    virtual void SetInDoc( SwDoc* pDoc, BOOL bTmpSet );
    OUT_HSTR_HINT(SetTxtFldHnt)
};

class SwSetRefMarkHint : public SwHstryHint
{
    String aRefName;
    ULONG nNode;
    xub_StrLen nStart, nEnd;
public:
    SwSetRefMarkHint( SwTxtRefMark* pTxtHt, ULONG nNode );
    virtual void SetInDoc( SwDoc* pDoc, BOOL bTmpSet );
    OUT_HSTR_HINT(SetRefMarkHnt)
};

class SwSetTOXMarkHint : public SwHstryHint
{
    String aTOXName;
    TOXTypes eTOXTypes;
    SwTOXMark aTOXMark;
    ULONG nNode;
    xub_StrLen nStart, nEnd;
public:
    SwSetTOXMarkHint( SwTxtTOXMark* pTxtHt, ULONG nNode );
    virtual void SetInDoc( SwDoc* pDoc, BOOL bTmpSet );
    int IsEqual( const SwTOXMark& rCmp ) const;
    OUT_HSTR_HINT(SetToxMarkHnt)
};

class SwResetTxtHint : public SwHstryHint
{
    ULONG nNode;
    xub_StrLen nStart, nEnd;
    USHORT nAttr;
public:
    SwResetTxtHint( USHORT nWhich, xub_StrLen nStt, xub_StrLen nEnd, ULONG nNode );
    virtual void SetInDoc( SwDoc* pDoc, BOOL bTmpSet );

    USHORT GetWhich() const         { return nAttr; }
    ULONG GetNode() const           { return nNode; }
    xub_StrLen GetCntnt() const     { return nStart; }
    OUT_HSTR_HINT(ResetTxtHnt)
};

class SwSetFtnHint : public SwHstryHint
{
    String aFtnStr;
    SwUndoSaveSection* pUndo;
    ULONG nNode;
    xub_StrLen nStart;
    BOOL   bEndNote;
public:
    SwSetFtnHint( SwTxtFtn* pTxtFtn, ULONG nNode );
    SwSetFtnHint( const SwTxtFtn& );
    ~SwSetFtnHint();
    virtual void SetInDoc( SwDoc* pDoc, BOOL bTmpSet );

    const SwUndoSaveSection* GetUndoObj() const { return pUndo; }
          SwUndoSaveSection* GetUndoObj()       { return pUndo; }
    OUT_HSTR_HINT(SetFtnHnt)
};

class SwChgFmtColl : public SwHstryHint
{
    const SwFmtColl* pColl;
    ULONG nNode;
    USHORT nSetStt;
    BYTE nNdWhich, nNumLvl;
    BOOL bNumStt;
public:
    SwChgFmtColl( const SwFmtColl* pColl, ULONG nNode, BYTE nNodeWhich );
    virtual void SetInDoc( SwDoc* pDoc, BOOL bTmpSet );
    OUT_HSTR_HINT(ChgFmtColl)
};

class SwHstryTxtFlyCnt : public SwHstryHint
{
    SwUndoDelLayFmt* pUndo;
public:
    SwHstryTxtFlyCnt( SwTxtFlyCnt* pTxtFly );       // fuer Zeichengebundene
    SwHstryTxtFlyCnt( SwFlyFrmFmt* pFlyFmt );       // fuer Absatzgebundene
    ~SwHstryTxtFlyCnt();
    virtual void SetInDoc( SwDoc* pDoc, BOOL bTmpSet );
    SwUndoDelLayFmt* GetUDelLFmt() { return pUndo; }
    OUT_HSTR_HINT(FlyCnt)
};

class SwHstryBookmark : public SwHstryHint
{
    String aName, aShortName;
    ULONG nNode1, nNode2;
    xub_StrLen nCntnt1, nCntnt2;
    USHORT nKeyCode;
    BYTE nTyp;
public:
    enum { BKMK_POS = 1, BKMK_OTHERPOS = 2 };
    SwHstryBookmark( const SwBookmark&, BYTE nTyp );
    virtual void SetInDoc( SwDoc* pDoc, BOOL bTmpSet );
    OUT_HSTR_HINT(Bookmark)

    BOOL IsEqualBookmark( const SwBookmark& );
};

class SwHstrySetAttrSet : public SwHstryHint
{
    SfxItemSet aOldSet;
    SvUShorts aResetArr;
    ULONG nNode;
    USHORT nSetStt;
    BYTE nNumLvl;
    BOOL bNumStt;
public:
    SwHstrySetAttrSet( const SfxItemSet& rSet, ULONG nNode,
                        const SvUShortsSort& rSetArr );
    virtual void SetInDoc( SwDoc* pDoc, BOOL bTmpSet );
    OUT_HSTR_HINT(SetAttrSet)
};


class SwHstryResetAttrSet : public SwHstryHint
{
    ULONG nNode;
    xub_StrLen nStart, nEnd;
    SvUShorts aArr;
public:
    SwHstryResetAttrSet( const SfxItemSet& rSet, ULONG nNode,
                        xub_StrLen nStt = STRING_MAXLEN,
                        xub_StrLen nEnd = STRING_MAXLEN );
    virtual void SetInDoc( SwDoc* pDoc, BOOL bTmpSet );

    const SvUShorts& GetArr() const     { return aArr; }
    ULONG GetNode() const               { return nNode; }
    xub_StrLen GetCntnt() const         { return nStart; }
    OUT_HSTR_HINT(ResetAttrSet)
};

class SwHstryChgFlyAnchor : public SwHstryHint
{
    SwFrmFmt* pFmt;
    ULONG nOldPos;
    xub_StrLen nOldCnt;
public:
    SwHstryChgFlyAnchor( const SwFrmFmt& rFmt );
    virtual void SetInDoc( SwDoc* pDoc, BOOL bTmpSet );
};

class SwHstryChgFlyChain : public SwHstryHint
{
    SwFlyFrmFmt *pPrevFmt, *pNextFmt, *pFlyFmt;
public:
    SwHstryChgFlyChain( const SwFlyFrmFmt& rFmt, const SwFmtChain& rAttr );
    virtual void SetInDoc( SwDoc* pDoc, BOOL bTmpSet );
};


#endif

typedef SwHstryHint* SwHstryHintPtr;
SV_DECL_PTRARR_DEL( SwpHstry, SwHstryHintPtr, 0, 2 )
class SwHistory : private SwpHstry
{
    friend class SwDoc;     // eig. darf nur SwDoc::DelUndoObj zugreifen
    friend class SwUndoWriter;  // fuer den Undo/Redo-Writer
    friend class SwRegHistory;  // fuer Insert, von Histoy-Attributen

    USHORT nEndDiff;
public:
    SwHistory( USHORT nInitSz = 0, USHORT nGrowSz = 2 );
    ~SwHistory();
    // loesche die History ab Start bis zum Ende
    void Delete( USHORT nStart = 0 );
    // alle Objecte zwischen nStart und Array-Ende aufrufen und loeschen
    BOOL Rollback( SwDoc* pDoc, USHORT nStart = 0 );
    // alle Objecte zwischen nStart und temporaeren Ende aufrufen und
    // den Start als temporaeres Ende speichern
    BOOL TmpRollback( SwDoc* pDoc, USHORT nStart, BOOL ToFirst = TRUE );

    void Add( const SfxPoolItem* pOldValue, const SfxPoolItem* pNewValue,
                ULONG nNodeIdx );
    void Add( const SwTxtAttr* pTxtHt, ULONG nNodeIdx,
                BOOL bNewAttr = TRUE );
    void Add( const SwFmtColl*, ULONG nNodeIdx, BYTE nWhichNd );
    void Add( const SwFmt*, ULONG nNodeIdx, BYTE nWhichNd );
    void Add( const SwBookmark&, BYTE );
    void Add( const SwFrmFmt& rFmt );
    void Add( const SwFlyFrmFmt&, USHORT& rSetPos );
    void Add( const SwTxtFtn& );

    USHORT Count() const { return SwpHstry::Count(); }
    USHORT GetTmpEnd() const { return SwpHstry::Count() - nEndDiff; }
    USHORT SetTmpEnd( USHORT nTmpEnd );     // returne alten Wert
    SwHstryHint* operator[]( USHORT nPos ) const { return SwpHstry::operator[](nPos); }

    // fuer SwUndoDelete::Undo/Redo
    void Move( USHORT nPos, SwHistory *pIns,
                USHORT nStart = 0, USHORT nEnd = USHRT_MAX )
    {
        SwpHstry::Insert( pIns, nPos, nStart, nEnd );
        SwpHstry* pDel = pIns;
        pDel->Remove( nStart,  nEnd == USHRT_MAX
                                    ? pDel->Count() - nStart
                                    : nEnd );
    }

        // Hilfs-Methoden zum Sichern von Attributen in der History.
        // Wird von UndoKlasse benutzt (Delete/Overwrite/Inserts)
    void CopyAttr( const SwpHints* pHts, ULONG nNodeIdx, xub_StrLen nStt,
                    xub_StrLen nEnd, BOOL bFields );
    void CopyFmtAttr( const SfxItemSet& rSet, ULONG nNodeIdx );
};

#ifndef ROLBCK_HISTORY_ONLY

class SwRegHistory : public SwClient
{
    SvUShortsSort aSetWhichIds;
    SwHistory* pHstry;
    const SwCntntNode * pNode;
    ULONG nNodeIdx;

    void _MakeSetWhichIds();
public:
    SwRegHistory( SwHistory* pHst );
    SwRegHistory( SwTxtNode* pTxtNd, SwTxtAttr* pTxtHt,
                    USHORT nFlags, SwHistory* pHst );
    SwRegHistory( SwTxtNode* pTxtNode, const SfxItemSet& rSet,
                xub_StrLen nStart, xub_StrLen nEnd, USHORT nFlags,
                SwHistory* pHst );
    SwRegHistory( const SwNode& rNd, SwHistory* pHst );
    SwRegHistory( SwModify* pRegIn, const SwNode& rNd, SwHistory* pHst );

    virtual void Modify( SfxPoolItem* pOld, SfxPoolItem* pNew );
    void Add( SwTxtAttr* pHt, const BOOL bNew = FALSE );

    void RegisterInModify( SwModify* pRegIn, const SwNode& rNd );
};

#endif


#endif // _ROLBCK_HXX

diff --git a/sw/inc/section.hxx b/sw/inc/section.hxx
new file mode 100644
index 0000000..21ce689
--- /dev/null
+++ b/sw/inc/section.hxx
@@ -0,0 +1,444 @@
/*************************************************************************
 *
 *  $RCSfile: section.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:27 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _SECTION_HXX
#define _SECTION_HXX


#ifndef _LNKBASE_HXX //autogen
#include <so3/lnkbase.hxx>
#endif
#ifndef _RTTI_HXX //autogen
#include <tools/rtti.hxx>
#endif
#ifndef _SVARRAY_HXX //autogen
#include <svtools/svarray.hxx>
#endif
#ifndef _SO2REF_HXX //autogen
#include <so3/so2ref.hxx>
#endif
#ifndef _FRMFMT_HXX
#include <frmfmt.hxx>
#endif

// Forward Deklaration
class SwSectionFmt;
class SwDoc;
class SwSection;
class SwTOXBase;

#ifndef SW_DECL_SWSERVEROBJECT_DEFINED
#define SW_DECL_SWSERVEROBJECT_DEFINED
class SvPseudoObject;
SO2_DECL_REF( SwServerObject )
#endif

SV_DECL_PTRARR( SwSections, SwSection*, 0, 4 )

enum SectionType { CONTENT_SECTION,
                    TOX_HEADER_SECTION,
                    TOX_CONTENT_SECTION,
                    DDE_LINK_SECTION    = OBJECT_CLIENT_DDE,
                    FILE_LINK_SECTION   = OBJECT_CLIENT_FILE
/*
// verbleiben noch:
    OBJECT_CLIENT_SO            = 0x80,
    OBJECT_CLIENT_OLE           = 0x82,
    OBJECT_CLIENT_OLE_CACHE     = 0x83,
*/
                    };

enum LinkCreateType
{
    CREATE_NONE,            // nichts weiter tun
    CREATE_CONNECT,         // Link gleich connecten
    CREATE_UPDATE           // Link connecten und updaten
};


class SwSection : public SwClient
{
    // damit beim Anlegen/Loeschen von Frames das Flag richtig gepflegt wird!
    friend class SwSectionNode;
    // the "read CTOR" of SwSectionFrm have to change the Hiddenflag
    friend class SwSectionFrm;

    String sSectionNm;
    String sCondition;          // erstmal, vielleicht auch mal ein Feld ??
    String sLinkFileName, sLinkFilePassWd;

    SwServerObjectRef refObj;   // falls DataServer -> Pointer gesetzt
    SvBaseLinkRef refLink;

    SectionType eType;

    BOOL bProtectFlag : 1;      // Flags fuer schnelle Abfragen, wird ueber
                                // Attribut im Format gesetzt
    BOOL bHiddenFlag : 1;       // Flag: Absaetze versteckt ?
    BOOL bHidden : 1;           // alle Absaetze nicht sichtbar ?
    BOOL bCondHiddenFlag : 1;   // Hiddenflag fuer die Bedingung ?
    BOOL bConnectFlag : 1;      // Flag: "Verbindung zum Server" vorhanden?


    void _SetHiddenFlag( int bHidden, int bCondition );
    void _SetProtectFlag( int bFlag ) { bProtectFlag = bFlag; }

    int _IsProtect() const;

public:
    TYPEINFO();     // rtti

    SwSection( SectionType eType, const String& rName,
                SwSectionFmt* pFmt = 0 );
    ~SwSection();

    // kopiere nur die Daten der Section!
    // Ableitung bleibt (beim Left) erhalten.
    SwSection& operator=( const SwSection& );
    int operator==( const SwSection& rCmp ) const;

    const String& GetName() const           { return sSectionNm; }
    void SetName( const String& rName )     { sSectionNm = rName; }
    const SectionType GetType() const       { return eType; }
    void SetType( SectionType eNew )        { eType = eNew; }

    SwSectionFmt* GetFmt()          { return (SwSectionFmt*)pRegisteredIn; }
    SwSectionFmt* GetFmt() const    { return (SwSectionFmt*)pRegisteredIn; }

    virtual void Modify( SfxPoolItem* pOld, SfxPoolItem* pNew );

    // setze die Hidden/Protected -> gesamten Baum updaten !
    // (Attribute/Flags werden gesetzt/erfragt)
    int IsHidden() const { return bHidden; }
    int IsProtect() const { return GetFmt() ? _IsProtect()
                                            : IsProtectFlag(); }

    void SetHidden( int bFlag = TRUE );
    void SetProtect( int bFlag = TRUE );

    // erfrage die internen Flags (Zustand inklusive Parents nicht, was
    // aktuell an der Section gesetzt ist!!)
    int IsHiddenFlag() const { return bHiddenFlag; }
    int IsProtectFlag() const { return bProtectFlag; }

    void SetCondHidden( int bFlag = TRUE );
    int IsCondHidden() const { return bCondHiddenFlag; }
    // erfrage (auch ueber die Parents), ob diese Section versteckt sein soll.
    int CalcHiddenFlag() const;


    inline SwSection* GetParent() const;

    // setze/erfrage die Bedingung
    const String& GetCondition() const          { return sCondition; }
    void SetCondition( const String& rNew )     { sCondition = rNew; }

    // setze/erfrage den gelinkten FileNamen
    const String& GetLinkFileName() const;
    void SetLinkFileName( const String& rNew, const String* pPassWd = 0 );
    // Passwort des gelinkten Files (nur waehrend der Laufzeit gueltig!)
    const String& GetLinkFilePassWd() const         { return sLinkFilePassWd; }
    void SetLinkFilePassWd( const String& rS )      { sLinkFilePassWd = rS; }

    // Daten Server-Methoden
    void SetRefObject( SvPseudoObject* pObj );
    const SwServerObject* GetObject() const     {  return &refObj; }
          SwServerObject* GetObject()           {  return &refObj; }
    BOOL IsServer() const                       {  return refObj.Is(); }

    // Methoden fuer gelinkte Bereiche
    USHORT GetUpdateType() const        { return refLink->GetUpdateMode();  }
    void SetUpdateType( USHORT nType )  { refLink->SetUpdateMode( nType );  }

    BOOL IsConnected() const        { return refLink.Is(); }
    void UpdateNow()                { refLink->Update(); }
    void Disconnect()               { refLink->Disconnect(); }

    const SvBaseLink& GetBaseLink() const   { return *refLink; }

    void CreateLink( LinkCreateType eType );

    void MakeChildLinksVisible( const SwSectionNode& rSectNd );

    BOOL IsLinkType() const
        { return DDE_LINK_SECTION == eType || FILE_LINK_SECTION == eType; }

    // Flags fuer UI - Verbindung geklappt?
    BOOL IsConnectFlag() const                  { return bConnectFlag; }
    void SetConnectFlag( BOOL bFlag = TRUE )    { bConnectFlag = bFlag; }

    // return the TOX base class if the section is a TOX section
    const SwTOXBase* GetTOXBase() const;

private:
    // privater Constructor, weil nie kopiert werden darf !!
    SwSection( const SwSection& );
};


enum SectionSort { SORTSECT_NOT, SORTSECT_NAME, SORTSECT_POS };

class SwSectionFmt : public SwFrmFmt
{
    friend class SwDoc;
    SwSection* _GetSection() const;
    void UpdateParent();        // Parent wurde veraendert

protected:
    SwSectionFmt( SwSectionFmt* pDrvdFrm, SwDoc *pDoc );

public:
    TYPEINFO();     //Bereits in Basisklasse Client drin.
    ~SwSectionFmt();

    //Vernichtet alle Frms in aDepend (Frms werden per PTR_CAST erkannt).
    virtual void DelFrms();

    //Erzeugt die Ansichten
    virtual void MakeFrms();

    virtual void Modify( SfxPoolItem* pOld, SfxPoolItem* pNew );
        // erfrage vom Format Informationen
    virtual BOOL GetInfo( SfxPoolItem& ) const;

    SwSection* GetSection() const { return (SwSection*)_GetSection(); }
    inline SwSectionFmt* GetParent() const;
    inline SwSection* GetParentSection() const;

    // alle Sections, die von dieser abgeleitet sind
    //  - sortiert nach : Name oder Position oder unsortiert
    //  - alle oder nur die, die sich im normalten Nodes-Array befinden
    USHORT GetChildSections( SwSections& rArr,
                            SectionSort eSort = SORTSECT_NOT,
                            int bAllSections = TRUE ) const;

    // erfrage, ob sich die Section im Nodes-Array oder UndoNodes-Array
    // befindet.
    int IsInNodesArr() const;

          SwSectionNode* GetSectionNode( BOOL bAlways = FALSE );
    const SwSectionNode* GetSectionNode( BOOL bAlways = FALSE ) const
    {   return ((SwSectionFmt*)this)->GetSectionNode( bAlways ); }

    // ist die Section eine gueltige fuers GlobalDocument?
    const SwSection* GetGlobalDocSection() const;
};

// -------------- inlines ---------------------------------

inline SwSection* SwSection::GetParent() const
{
    register SwSectionFmt* pFmt = GetFmt();
    register SwSection* pRet = 0;
    if( pFmt )
        pRet = pFmt->GetParentSection();
    return pRet;
}

inline SwSectionFmt* SwSectionFmt::GetParent() const
{
    register SwSectionFmt* pRet = 0;
    if( GetRegisteredIn() )
        pRet = PTR_CAST( SwSectionFmt, GetRegisteredIn() );
    return pRet;
}

inline SwSection* SwSectionFmt::GetParentSection() const
{
    register SwSectionFmt* pParent = GetParent();
    register SwSection* pRet = 0;
    if( pParent )
        pRet = pParent->_GetSection();
    return pRet;
}

/*************************************************************************

      $Log: not supported by cvs2svn $
      Revision 1.40  2000/09/18 16:03:26  willem.vandorp
      OpenOffice header added.

      Revision 1.39  2000/09/08 13:24:23  willem.vandorp
      Header and footer replaced

      Revision 1.38  2000/04/19 15:41:58  jp
      Unicode changes

      Revision 1.37  2000/02/11 14:26:27  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.36  1999/11/18 17:52:28  jp
      new: GetTOXBase

      Revision 1.35  1999/07/27 18:20:18  JP
      replace class SwTOXBaseRange with SwTOXBaseSection - TOX use now SwSections


      Rev 1.34   27 Jul 1999 20:20:18   JP
   replace class SwTOXBaseRange with SwTOXBaseSection - TOX use now SwSections

      Rev 1.33   23 Jul 1999 15:53:40   JP
   Bug #67465#: SwSectionFrm CTOR have to change the hiddenflag

      Rev 1.32   21 Jun 1999 10:08:44   JP
   new enums for new TOXs

      Rev 1.31   25 Mar 1999 21:20:34   JP
   Bug #63929#: autom. erzeugen von Tabs im Inhaltsverzeichnis

      Rev 1.30   29 Oct 1998 14:26:18   JP
   Task #58637#: neu Is-/SetConnectFlag

      Rev 1.29   26 Oct 1998 17:29:44   JP
   Bug #54342#: Section merkt sich das Passwort der Datei

      Rev 1.28   12 Jun 1998 14:33:16   JP
   Bug #51097#: im DTOR des SectionFormates ggfs. die ChildLinks sichbar machen

      Rev 1.27   27 Apr 1998 21:16:44   JP
   Set-/SetCondition: Flag fuers Convertieren entfernt

      Rev 1.26   04 Aug 1997 16:43:06   MH
   chg: header

      Rev 1.25   23 Jun 1997 15:44:16   JP
   neu: GetGlobalDocSection

      Rev 1.24   13 Jun 1997 14:54:10   JP
   neu: CalcHiddenFlag

      Rev 1.23   29 Oct 1996 16:17:58   MA
   includes

      Rev 1.22   16 Oct 1996 16:31:22   JP
   unbenutzte Methoden entfernt

      Rev 1.21   10 Jul 1996 17:58:54   OM
   LocalizeDBName in Expfld verschoben

      Rev 1.20   10 Jul 1996 17:49:02   OM
   LocalizeDBName in Expfld verschoben

      Rev 1.19   25 Jun 1996 12:24:14   MA
   headerfiles

      Rev 1.18   11 Jun 1996 16:56:56   JP
   GetLinkFileName: nicht mehr als Inline muessen ggfs. auf den Link zugreifen

      Rev 1.17   24 May 1996 15:42:14   OM
   Bedingungen in Bereichen wandeln

      Rev 1.16   07 Mar 1996 18:11:16   JP
   IsConnect - auf Is() abfragen

      Rev 1.15   12 Feb 1996 18:16:18   JP
   Erweiterung: gelinkte Bereiche

      Rev 1.14   08 Feb 1996 19:14:26   JP
   Erweiterung fuer gelinkte Bereiche

      Rev 1.13   30 Nov 1995 12:54:36   JP
   _SetHiddenFlag - beide Flags ueber geben (Hidden&CondHidden)

      Rev 1.12   08 Nov 1995 10:03:06   OS
   ChangeCondition => SetCondition

      Rev 1.11   11 Jul 1995 18:39:46   JP
   neu: GetSectionNode, Set-/IsCondHidden - Bedingung auswerten

      Rev 1.10   29 Jun 1995 21:11:06   JP
   Section mit Servier-Funktionalitaet

      Rev 1.9   19 Jun 1995 16:45:16   MA
   Umbau fuer daemliche Compiler

      Rev 1.8   14 Jun 1995 16:07:46   JP
   inline vor den inline Methoden

      Rev 1.7   06 Apr 1995 12:42:24   JP
   neu: Member & Methoden fuer den 'gelinkten' Filenamen

      Rev 1.6   23 Feb 1995 17:38:46   JP
   neu: SetName - setze neuen Namen an der Section

      Rev 1.5   03 Feb 1995 18:17:30   JP
   IsProtect jetzt inline

      Rev 1.4   01 Feb 1995 10:52:32   JP
   neu: erfrage/setze Bedingung

      Rev 1.3   26 Jan 1995 18:47:56   JP
   GetChildSection: erweitert fuer UI

      Rev 1.2   26 Jan 1995 11:35:18   JP
   SectionNode als friend der Section - zum Pfegen des HiddenFlags

      Rev 1.1   24 Jan 1995 20:03:12   JP
   neu: IsInNodesArr - abfrage, ob Section nicht im UndoNodes-Array steht

      Rev 1.0   18 Jan 1995 19:22:58   JP
   Initial revision.

*************************************************************************/

#endif
    //_SECTION_HXX

diff --git a/sw/inc/segdefs.hxx b/sw/inc/segdefs.hxx
new file mode 100644
index 0000000..5cd2ae7
--- /dev/null
+++ b/sw/inc/segdefs.hxx
@@ -0,0 +1,61 @@
/*************************************************************************
 *
 *  $RCSfile: segdefs.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:27 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#include "segdefs_.hxx"
diff --git a/sw/inc/segdefs_.hxx b/sw/inc/segdefs_.hxx
new file mode 100644
index 0000000..0b3e6e3
--- /dev/null
+++ b/sw/inc/segdefs_.hxx
@@ -0,0 +1,60 @@
/*************************************************************************
 *
 *  $RCSfile: segdefs_.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:27 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
diff --git a/sw/inc/shellid.hxx b/sw/inc/shellid.hxx
new file mode 100644
index 0000000..e6a9a32
--- /dev/null
+++ b/sw/inc/shellid.hxx
@@ -0,0 +1,106 @@
/*************************************************************************
 *
 *  $RCSfile: shellid.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:27 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SHELLID_HXX
#define _SHELLID_HXX

#ifndef _SFX_SHELL_HXX //autogen
#include <sfx2/shell.hxx>
#endif

/*--------------------------------------------------------------------
    Beschreibung:   Mapping fuer UI-Parameter
 --------------------------------------------------------------------*/

#define SW_BASESHELL            (SFX_INTERFACE_SW_START + 1)
#define SW_TEXTSHELL            (SFX_INTERFACE_SW_START + 2)
#define SW_LISTSHELL            (SFX_INTERFACE_SW_START + 3)
#define SW_TABSHELL             (SFX_INTERFACE_SW_START + 4)
#define SW_FRAMESHELL           (SFX_INTERFACE_SW_START + 5)
#define SW_GRFSHELL             (SFX_INTERFACE_SW_START + 6)
#define SW_OLESHELL             (SFX_INTERFACE_SW_START + 7)
#define SW_DRAWSHELL            (SFX_INTERFACE_SW_START + 8)
#define SW_DRWTXTSHELL          (SFX_INTERFACE_SW_START + 9)

#define SW_INTERFACE_MODULE     (SFX_INTERFACE_SW_START + 10)
#define SW_DOCSHELL             (SFX_INTERFACE_SW_START + 11)
#define SW_VIEWSHELL            (SFX_INTERFACE_SW_START + 12)
#define SW_PAGEPREVIEW          (SFX_INTERFACE_SW_START + 13)
#define SW_GLOSDOCSHELL         (SFX_INTERFACE_SW_START + 14)
#define SW_SRC_VIEWSHELL        (SFX_INTERFACE_SW_START + 15)

#define SW_BEZIERSHELL          (SFX_INTERFACE_SW_START + 16)
#define SW_DRAWBASESHELL        (SFX_INTERFACE_SW_START + 17)
#define SW_DRAWFORMSHELL        (SFX_INTERFACE_SW_START + 18)

#define SW_WEBDOCSHELL          (SFX_INTERFACE_SW_START + 19)
#define SW_WEBVIEWSHELL         (SFX_INTERFACE_SW_START + 20)
#define SW_WEBBASESHELL         (SFX_INTERFACE_SW_START + 21)
#define SW_WEBTEXTSHELL         (SFX_INTERFACE_SW_START + 22)
#define SW_WEBFRAMESHELL        (SFX_INTERFACE_SW_START + 23)
#define SW_WEBGLOSDOCSHELL      (SFX_INTERFACE_SW_START + 24)
#define SW_WEBLISTSHELL         (SFX_INTERFACE_SW_START + 25)
#define SW_WEBTABSHELL          (SFX_INTERFACE_SW_START + 26)
#define SW_WEBGRFSHELL          (SFX_INTERFACE_SW_START + 27)
#define SW_WEBOLESHELL          (SFX_INTERFACE_SW_START + 28)
#define SW_WEBDRAWBASESHELL     (SFX_INTERFACE_SW_START + 29)
#define SW_WEBDRAWFORMSHELL     (SFX_INTERFACE_SW_START + 30)

#endif // _UIPARAM_HXX
diff --git a/sw/inc/shellio.hxx b/sw/inc/shellio.hxx
new file mode 100644
index 0000000..3fe1e47
--- /dev/null
+++ b/sw/inc/shellio.hxx
@@ -0,0 +1,696 @@
/*************************************************************************
 *
 *  $RCSfile: shellio.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:27 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SHELLIO_HXX
#define _SHELLIO_HXX

#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif
#ifndef _DATE_HXX //autogen
#include <tools/date.hxx>
#endif
#ifndef _TIME_HXX //autogen
#include <tools/time.hxx>
#endif
#ifndef _DATETIME_HXX //autogen
#include <tools/datetime.hxx>
#endif
#ifndef _REF_HXX //autogen
#include <tools/ref.hxx>
#endif
#ifndef _SOT_FORMATS_HXX //autogen
#include <sot/formats.hxx>
#endif

#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _DOCFAC_HXX
#include <docfac.hxx>   // SwDocFac
#endif

// einige Forward - Deklarationen
class SfxFactoryFilterContainer;
class SfxFilter;
class SfxItemPool;
class SfxItemSet;
class SfxMedium;
class SvPtrarr;
class SvStorage;
class SvStorageStreamRef;
class SvStream;
class SvStringsSortDtor;
class SvxFontItem;
class SvxMacroTableDtor;
class Sw3Io;
class SwCntntNode;
class SwCrsrShell;
class SwDoc;
class SwPaM;
class SwTextBlocks;
struct SwPosition;
struct Writer_Impl;

// ab so vielen chars wird ein mit einem ASCII/W4W-Reader eingelesener
// Absatz zwangsweise umgebrochen. Muss immer groesser als 200 sein !!!
#define MAX_ASCII_PARA 10000


class SwAsciiOptions
{
    String sFont;
    rtl_TextEncoding eCharSet;
    USHORT nLanguage;
    LineEnd eCRLF_Flag;

public:

    const String& GetFontName() const { return sFont; }
    void SetFontName( const String& rFont ) { sFont = rFont; }

    rtl_TextEncoding GetCharSet() const { return eCharSet; }
    void SetCharSet( rtl_TextEncoding nVal ) { eCharSet = nVal; }

    USHORT GetLanguage() const { return nLanguage; }
    void SetLanguage( USHORT nVal ) { nLanguage = nVal; }

    LineEnd GetParaFlags() const { return eCRLF_Flag; }
    void SetParaFlags( LineEnd eVal ) { eCRLF_Flag = eVal; }

    void Reset()
    {
        sFont.Erase();
        eCRLF_Flag = GetSystemLineEnd();
        eCharSet = ::gsl_getSystemTextEncoding();
        nLanguage = 0;
    }
    // for the automatic conversion (mail/news/...)
    void ReadUserData( const String& );
    void WriteUserData( String& );

    SwAsciiOptions() { Reset(); }
};

/**************** SwReader/Reader ************************/
// Basisklasse der moeglichen Optionen fuer einen speziellen Reader
class Reader;
// Ruft den Reader mit seinen Optionen, Dokument, Cursor etc.
class SwReader;
// SwRead ist der Pointer auf die Read-Optionen-Basisklasse
typedef Reader *SwRead;

class SwgReaderOption
{
    SwAsciiOptions aASCIIOpts;
    union
    {
        BOOL bFmtsOnly;
        struct
        {
            BOOL bFrmFmts: 1;
            BOOL bPageDescs: 1;
            BOOL bTxtFmts: 1;
            BOOL bNumRules: 1;
            BOOL bMerge:1;
        }  Fmts;
    } What;

public:
    void ResetAllFmtsOnly() { What.bFmtsOnly = 0; }
    void SetAllFmtsOnly() { What.bFmtsOnly = (BOOL)0xff; }
    BOOL IsFmtsOnly() const { return What.bFmtsOnly; }

    BOOL IsFrmFmts() const { return What.Fmts.bFrmFmts; }
    void SetFrmFmts( const BOOL bNew) { What.Fmts.bFrmFmts = bNew; }

    BOOL IsPageDescs() const { return What.Fmts.bPageDescs; }
    void SetPageDescs( const BOOL bNew) { What.Fmts.bPageDescs = bNew; }

    BOOL IsTxtFmts() const { return What.Fmts.bTxtFmts; }
    void SetTxtFmts( const BOOL bNew) { What.Fmts.bTxtFmts = bNew; }

    BOOL IsNumRules() const { return What.Fmts.bNumRules; }
    void SetNumRules( const BOOL bNew) { What.Fmts.bNumRules = bNew; }

    BOOL IsMerge() const { return What.Fmts.bMerge; }
    void SetMerge( const BOOL bNew ) { What.Fmts.bMerge = bNew; }

    const SwAsciiOptions& GetASCIIOpts() const { return aASCIIOpts; }
    void SetASCIIOpts( const SwAsciiOptions& rOpts ) { aASCIIOpts = rOpts; }
    void ResetASCIIOpts() { aASCIIOpts.Reset(); }

    SwgReaderOption()
    {   ResetAllFmtsOnly(); aASCIIOpts.Reset(); }
};

class SwReader: public SwDocFac
{
    SvStream* pStrm;
    SvStorage* pStg;
    SfxMedium* pMedium;     // wer ein Medium haben will (W4W)

    SwPaM* pCrsr;
    String aFileName;

public:
    /*
     * Initiales Einlesen. Dokument wird erst beim Read(..) angelegt.
     * JP 25.04.95: oder falls es mitgegeben wird, in dieses.
     *              Sonderfall fuer Load mit Sw3Reader
     */
    SwReader( SvStream&, const String& rFilename, SwDoc *pDoc = 0 );
    SwReader( SvStorage&, const String& rFilename, SwDoc *pDoc = 0 );
    SwReader( SfxMedium&, const String& rFilename, SwDoc *pDoc = 0 );
    /*
     * In ein existierendes Dokument einlesen, Dokument und
     * Position im Dokument werden aus dem SwPaM uebernommen.
     */
    SwReader( SvStream&, const String& rFilename, SwPaM& );
    SwReader( SvStorage&, const String& rFilename, SwPaM& );
    SwReader( SfxMedium&, const String& rFilename, SwPaM& );

    /*
     * Nur SwReader::Read(...) ist die Export-Schnittstelle!!!
     */
    BOOL NeedsPasswd( const Reader& );
    BOOL CheckPasswd( const String&, const Reader& );
    ULONG Read( const Reader& );

    // ask for glossaries
    BOOL HasGlossaries( const Reader& );
    BOOL ReadGlossaries( const Reader&, SwTextBlocks&, BOOL bSaveRelFiles );
};



/*  */
/****************  SPEZIELLE Reader ************************/

// spezielle - Reader koennen beides sein !! (Excel, W4W, .. )
#define SW_STREAM_READER    1
#define SW_STORAGE_READER   2

class Reader
{
    friend class SwReader;
    SwDoc* pTemplate;
    String aTemplateNm;
    Date aDStamp;
    Time aTStamp;
    DateTime aChkDateTime;

protected:
    SvStream* pStrm;
    SvStorage* pStg;
    SfxMedium* pMedium;     // wer ein Medium haben will (W4W)

    SwgReaderOption aOpt;
    BOOL bInsertMode : 1;
    BOOL bTmplBrowseMode : 1;
    BOOL bReadUTF8: 1;      // Stream als UTF-8 interpretieren

public:
    Reader();
    virtual ~Reader();

    virtual int GetReaderType();
    SwgReaderOption& GetReaderOpt() { return aOpt; }

    virtual void SetFltName( const String& rFltNm );
    static void SetNoOutlineNum( SwDoc& rDoc );

    // den Item-Set eines Frm-Formats an das alte Format anpassen
    static void ResetFrmFmtAttrs( SfxItemSet &rFrmSet );

    // die Rahmen-/Grafik-/OLE-Vorlagen an das alte Format (ohne
    // Umrandung etc.) anpassen
    static void ResetFrmFmts( SwDoc& rDoc );

    // Die Filter-Vorlage laden, setzen und wieder freigeben
    SwDoc* GetTemplateDoc();
    BOOL SetTemplate( SwDoc& rDoc );
    void ClearTemplate();
    void SetTemplateName( const String& rDir );
    void MakeHTMLDummyTemplateDoc();

    BOOL IsReadUTF8() const { return bReadUTF8; }
    void SetReadUTF8( BOOL bSet ) { bReadUTF8 = bSet; }

    virtual BOOL HasGlossaries() const;
    virtual BOOL ReadGlossaries( SwTextBlocks&, BOOL bSaveRelFiles ) const;

private:
    virtual ULONG Read(SwDoc &,SwPaM &,const String &)=0;

    // alle die die Streams / Storages nicht geoeffnet brauchen,
    // muessen die Methode ueberladen (W4W!!)
    virtual int SetStrmStgPtr();
};

class RtfReader: public Reader
{
    virtual ULONG Read( SwDoc &,SwPaM &,const String &);
};


class AsciiReader: public Reader
{
    friend class SwReader;
    virtual ULONG Read( SwDoc &,SwPaM &,const String &);
public:
    AsciiReader(): Reader() {}

    virtual void SetFltName( const String& rFltNm );
};

class SwgReader: public Reader
{
    virtual ULONG Read( SwDoc &,SwPaM &,const String &);
};

class StgReader : public Reader
{
    String aFltName;

protected:
    ULONG OpenMainStream( SvStorageStreamRef& rRef, USHORT& rBuffSize );

public:
    virtual int GetReaderType();
    const String& GetFltName() { return aFltName; }
    virtual void SetFltName( const String& r );
};


class Sw3Reader : public StgReader
{
    Sw3Io* pIO;
    virtual ULONG Read( SwDoc &,SwPaM &,const String &);
public:
    Sw3Reader() : pIO( 0 ) {}

          Sw3Io* GetSw3Io()                 { return pIO; }
    const Sw3Io* GetSw3Io() const           { return pIO; }
          void   SetSw3Io( Sw3Io* pIo )     { pIO = pIo; }
};

/*  */
////////////////////////////////////////////////////////////////////////////

// Der uebergebene Stream muss dynamisch angelegt werden und
// vor dem Loeschen der Instanz per Stream() angefordert
// und geloescht werden!

class SwImpBlocks;

class SwTextBlocks
{
    friend class Sw2TextBlocks;
    friend class Sw3IoImp;
    SwImpBlocks* pImp;
    ULONG        nErr;

public:
    SwTextBlocks( const String& );
    SwTextBlocks( SvStorage& );
    ~SwTextBlocks();

    void Flush(){}

    SwDoc* GetDoc();
    void   ClearDoc();                  // Doc-Inhalt loeschen
    const  String& GetName();
    void   SetName( const String& );
    ULONG GetError() const { return nErr; }

    BOOL   IsOld() const;
    ULONG  ConvertToNew();              // Textbausteine konvertieren

    USHORT GetCount() const;                        // Anzahl Textbausteine ermitteln
    USHORT GetIndex( const String& ) const;         // Index fuer Kurznamen ermitteln
    USHORT GetLongIndex( const String& ) const;     //Index fuer Langnamen ermitteln
    const  String& GetShortName( USHORT ) const;    // Kurzname fuer Index zurueck
    const  String& GetLongName( USHORT ) const;     // Langname fuer Index zurueck

    BOOL   Delete( USHORT );            // Loeschen
    USHORT Rename( USHORT, const String*, const String* ); // Umbenennen
    ULONG  CopyBlock( SwTextBlocks& rSource, String& rSrcShort,
                                    const String& rLong ); // Block kopieren

    BOOL   BeginGetDoc( USHORT );           // Textbaustein einlesen
    void   EndGetDoc();                     // Textbaustein wieder loslassen

    BOOL   BeginPutDoc( const String&, const String& ); // Speichern Beginn
    USHORT PutDoc();                                // Speichern Ende

    const String& GetText( USHORT );                // Textinhalt einlesen
    USHORT PutText( const String&, const String&, const String& ); // Speichern( Kurzn., Text)

    BOOL IsOnlyTextBlock( USHORT ) const;
    BOOL IsOnlyTextBlock( const String& rShort ) const;

    const String& GetFileName() const;      // Dateiname von pImp
    BOOL IsReadOnly() const;                // ReadOnly-Flag von pImp

    BOOL GetMacroTable( USHORT nIdx, SvxMacroTableDtor& rMacroTbl );

    String GetValidShortCut( const String& rLong,
                             BOOL bCheckInBlock = FALSE ) const;

    BOOL StartPutMuchBlockEntries();
    void EndPutMuchBlockEntries();
};


extern void _InitFilter();
extern void _FinitFilter();
extern SwRead ReadRtf, ReadAscii, ReadSwg, ReadSw3, ReadHTML, ReadXML;

extern BOOL SetHTMLTemplate( SwDoc &rDoc ); //Fuer Vorlagen aus HTML.vor laden shellio.cxx


/*  */
/////////////////////////////////////////////////////////////////////////////

/*
 * Schreiben, Writer
 */


/* Basis-Klasse aller Writer */

class Writer : public SvRefBase
{
    SwAsciiOptions aAscOpts;

    void _AddFontItem( SfxItemPool& rPool, const SvxFontItem& rFont );

protected:
    Writer_Impl* pImpl;

    SvStream* pStrm;
    SwPaM* pOrigPam;            // der letze zu bearbeitende Pam
    const String* pOrigFileName;

    void ResetWriter();
    BOOL CopyNextPam( SwPaM ** );

    void PutNumFmtFontsInAttrPool();
    void PutEditEngFontsInAttrPool();

    virtual ULONG WriteStream() = 0;

public:
    SwDoc* pDoc;
    SwPaM* pCurPam;
    BOOL bWriteAll : 1;
    BOOL bShowProgress : 1;
    BOOL bWriteClipboardDoc : 1;
    BOOL bWriteOnlyFirstTable : 1;
    BOOL bASCII_ParaAsCR : 1;
    BOOL bASCII_ParaAsBlanc : 1;
    BOOL bASCII_NoLastLineEnd : 1;
    BOOL bUCS2_WithStartChar : 1;

    Writer();
    virtual ~Writer();

    virtual ULONG Write( SwPaM&, SfxMedium&, const String* = 0 );
            ULONG Write( SwPaM&, SvStream&,  const String* = 0 );
    virtual ULONG Write( SwPaM&, SvStorage&, const String* = 0 );

    virtual void SetPasswd( const String& );
    virtual void SetVersion( const String&, long );
    virtual BOOL IsStgWriter() const;
    virtual BOOL IsSw3Writer() const;

    BOOL ShowProgress() const                   { return bShowProgress; }
    void SetShowProgress( BOOL bFlag = FALSE )  { bShowProgress = bFlag; }

    const String* GetOrigFileName() const       { return pOrigFileName; }

    const SwAsciiOptions& GetAsciiOptions() const { return aAscOpts; }
    void SetAsciiOptions( const SwAsciiOptions& rOpt ) { aAscOpts = rOpt; }

    // suche die naechste Bookmark-Position aus der Bookmark-Tabelle
    USHORT FindPos_Bkmk( const SwPosition& rPos ) const;
    // build a bookmark table, which is sort by the node position. The
    // OtherPos of the bookmarks also inserted.
    void CreateBookmarkTbl();
    // search alle Bookmarks in the range and return it in the Array
    USHORT GetBookmarks( const SwCntntNode& rNd,
                        xub_StrLen nStt, xub_StrLen nEnd,
                        SvPtrarr& rArr );

    // lege einen neuen PaM an der Position an
    SwPaM* NewSwPaM( SwDoc & rDoc, ULONG nStartIdx, ULONG nEndIdx,
                                    BOOL bNodesArray = TRUE ) const;

    // kopiere ggfs. eine lokale Datei ins Internet
    BOOL CopyLocalFileToINet( String& rFileNm, BOOL bFileToFile=FALSE );

    // Stream-spezifische Routinen, im Storage-Writer NICHT VERWENDEN!

    // Optimierung der Ausgabe auf den Stream.
    SvStream& OutLong( SvStream& rStrm, long nVal );
    SvStream& OutULong( SvStream& rStrm, ULONG nVal );

    // Hex-Zahl ausgeben, default ist 2.stellige Zahl
    SvStream& OutHex( SvStream& rStrm, ULONG nHex, BYTE nLen = 2 );
    // 4-st. Hex-Zahl ausgeben
    inline SvStream& OutHex4( SvStream& rStrm, USHORT nHex )
        {   return OutHex( rStrm, nHex, 4 ); }
    // 8-st. Hex-Zahl ausgeben
    inline SvStream& OutHex8( SvStream& rStrm, ULONG nHex )
        {   return OutHex( rStrm, nHex, 8 ); }

    inline SvStream& OutHex( USHORT nHex, BYTE nLen = 2 )      { return OutHex( Strm(), nHex, nLen ); }
    inline SvStream& OutHex4( USHORT nHex )     { return OutHex( Strm(), nHex, 4 ); }
    inline SvStream& OutHex8( ULONG nHex )      { return OutHex( Strm(), nHex, 8 ); }
    inline SvStream& OutLong( long nVal )       { return OutLong( Strm(), nVal ); }
    inline SvStream& OutULong( ULONG nVal )     { return OutULong( Strm(), nVal ); }

    void SetStrm( SvStream& rStrm ) { pStrm = &rStrm; }
#ifdef PRODUCT
    SvStream& Strm() { return *pStrm; }
#else
    SvStream& Strm();
#endif
};

#ifndef SW_DECL_WRITER_DEFINED
#define SW_DECL_WRITER_DEFINED
SV_DECL_REF(Writer)
#endif
SV_IMPL_REF(Writer)

// Basisklasse fuer alle Storage-Writer

class StgWriter : public Writer
{
protected:
    String aFltName;
    SvStorage* pStg;

    // Fehler beim Aufruf erzeugen
    virtual ULONG WriteStream();
    virtual ULONG WriteStorage() = 0;

public:
    StgWriter() : Writer(), pStg( 0 ) {}

    virtual BOOL IsStgWriter() const;
    virtual ULONG Write( SwPaM&, SvStorage&, const String* = 0 );

    SvStorage& GetStorage() const       { return *pStg; }
    const String& GetFltName() const    { return aFltName; }
    void SetFltName( const String& r )  { aFltName = r; }
};

class Sw3Writer : public StgWriter
{
    Sw3Io* pIO;
    BOOL bSaveAs : 1;

    virtual ULONG WriteStorage();

public:
    Sw3Writer() : pIO( 0 ), bSaveAs( FALSE ) {}

          Sw3Io* GetSw3Io()                 { return pIO; }
    const Sw3Io* GetSw3Io() const           { return pIO; }
    void SetSw3Io( Sw3Io* pIo, BOOL bSvAs = FALSE )
        { pIO = pIo; bSaveAs = bSvAs; }

    virtual BOOL IsSw3Writer() const;
};



// Schnittstellenklasse fuer den allgemeinen Zugriff auf die
// speziellen Writer

class SwWriter
{
    SvStream* pStrm;
    SvStorage* pStg;
    SfxMedium* pMedium;

    SwPaM* pOutPam;
    SwCrsrShell *pShell;
    SwDoc &rDoc;
    BOOL bWriteAll;

public:
    ULONG Write( WriterRef& rxWriter, const String* = 0);

    SwWriter( SvStream&, SwCrsrShell &,BOOL bWriteAll = FALSE );
    SwWriter( SvStream&, SwDoc & );
    SwWriter( SvStream&, SwPaM &, BOOL bWriteAll = FALSE );

//  SwWriter( SvStorage&, SwCrsrShell &,BOOL bWriteAll = FALSE );
    SwWriter( SvStorage&, SwDoc & );
//  SwWriter( SvStorage&, SwPaM&, BOOL bWriteAll = FALSE );

    SwWriter( SfxMedium&, SwCrsrShell &,BOOL bWriteAll = FALSE );
    SwWriter( SfxMedium&, SwDoc & );
//  SwWriter( SfxMedium&, SwPaM&, BOOL bWriteAll = FALSE );
};


/*  */
/////////////////////////////////////////////////////////////////////////////

void GetRTFWriter( const String&, WriterRef& );
void GetASCWriter( const String&, WriterRef& );
void GetSw3Writer( const String&, WriterRef& );
void GetHTMLWriter( const String&, WriterRef& );
void GetXMLWriter( const String&, WriterRef& );

// Die folgende Klasse ist ein Wrappe fuer die Basic-I/O-Funktionen
// des Writer 3.0. Alles ist statisch. Alle u.a. Filternamen sind die
// Writer-internen Namen, d.h. die namen, die in INSTALL.INI vor dem
// Gleichheitszeichen stehen, z.b. SWG oder ASCII.

class SwIoSystem
{
public:
        // suche ueber den Filtertext den Filtereintrag
    static const SfxFilter* GetFilterOfFilterTxt( const String& rFilterNm,
                                const SfxFactoryFilterContainer* pCnt = 0 );
        // suche ueber den internen FormatNamen den Filtereintrag
    static const SfxFilter* GetFilterOfFormat( const String& rFormat,
                                const SfxFactoryFilterContainer* pCnt = 0 );

    // Feststellen des zu verwendenden Filters fuer die uebergebene
    // Datei. Der Filtername wird zurueckgeliefert. Konnte kein Filter
    // zurueckgeliefert werden, wird der Name des ASCII-Filters geliefert!
    static const SfxFilter* GetFileFilter( const String& rFileName,
                                            const String& rPrefFltName,
                                            SfxMedium* pMedium = 0 );

        // Feststellen ob das File in dem vorgegebenen Format vorliegt.
        // Z.z werden nur unsere eigene Filter unterstuetzt!!
    static FASTBOOL IsFileFilter( SfxMedium& rMedium, const String& rFmtName,
                                    const SfxFilter** ppFlt = 0 );

    static FASTBOOL IsValidStgFilter( SvStorage& , const SfxFilter& );

    // gebe einen bestimmten Reader zurueck
    static Reader* GetReader( const String& rFltName );
    // gebe einen bestimmten Writer zurueck
    static void GetWriter( const String& rFltName, WriterRef& xWrt );

    static const String GetSubStorageName( const SfxFilter& rFltr );
};


// ----------------------------------
// diese Filter sind immer vorhanden und koennen ueber die
// Formatnamen gesucht werden. Alle anderen Filter sind nur intern
// bekannt. Die UI-Seite benutzt die GetReader()/GetWriter() -Funktionen,
// um die speziellen zu erhalten.

extern sal_Char __FAR_DATA FILTER_SWG[];    // SWG-Filter
extern sal_Char __FAR_DATA FILTER_RTF[];    // RTF-Filter
extern sal_Char*           FILTER_ANSI;     // Ascii-Filter mit Default-CodeSet
extern sal_Char __FAR_DATA FILTER_BAS[];    // StarBasic (identisch mit ANSI)
extern sal_Char __FAR_DATA FILTER_W4W[];    // W4W-Filter
extern sal_Char __FAR_DATA FILTER_WW8[];    // WinWord 97-Filter
extern sal_Char __FAR_DATA FILTER_SW3[];    // SW3-Storage Filter
extern sal_Char __FAR_DATA FILTER_SW4[];    // SW4-Storage Filter
extern sal_Char __FAR_DATA FILTER_SW4[];    // SW4-Storage Filter
extern sal_Char __FAR_DATA FILTER_SW5[];    // SW5-Storage Filter
extern sal_Char __FAR_DATA FILTER_SWGV[];   // SWG-Vorlagen Filter
extern sal_Char __FAR_DATA FILTER_SW3V[];   // SW3-Storage Vorlagen Filter
extern sal_Char __FAR_DATA FILTER_SW4V[];   // SW4-Storage Vorlagen Filter
extern sal_Char __FAR_DATA FILTER_SW5V[];   // SW5-Storage Vorlagen Filter
extern sal_Char __FAR_DATA FILTER_SWW4V[];  // SW/Web Storage Vorlagen Filter
extern sal_Char __FAR_DATA FILTER_SWW5V[];  // SW/Web Storage Vorlagen Filter
extern sal_Char __FAR_DATA FILTER_TEXT_DLG[];   // text filter with encoding dialog
extern sal_Char __FAR_DATA FILTER_XML[];    // XML filter


// gebe einen gueltigen temp-Filenamen zurueck
String GetTmpFileName();


#endif
diff --git a/sw/inc/shellres.hxx b/sw/inc/shellres.hxx
new file mode 100644
index 0000000..97fdb8c
--- /dev/null
+++ b/sw/inc/shellres.hxx
@@ -0,0 +1,139 @@
/*************************************************************************
 *
 *  $RCSfile: shellres.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:27 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SHELLRES_HXX
#define _SHELLRES_HXX


#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif

#ifndef _BITMAP_HXX //autogen
#include <vcl/bitmap.hxx>
#endif

#ifndef _SVSTDARR_HXX
#define _SVSTDARR_STRINGSDTOR
#include <svtools/svstdarr.hxx>
#endif

struct ShellResource : public Resource
{

    String          aPostItAuthor;
    String          aPostItPage;
    String          aPostItLine;

    // Calc Fehlerstrings
    String          aCalc_Syntax;
    String          aCalc_ZeroDiv;
    String          aCalc_Brack;
    String          aCalc_Pow;
    String          aCalc_VarNFnd;
    String          aCalc_Overflow;
    String          aCalc_WrongTime;
    String          aCalc_Default;
    String          aCalc_Error;

    // fuers GetRefFeld - oben/unten
    String          aGetRefFld_Up, aGetRefFld_Down;
    // fuer dynamisches Menu - String "alle"
    String          aStrAllPageHeadFoot;
    // fuer einige Listboxen - String "keine"
    String          aStrNone;
    // fuer Felder, die Fixiert sind
    String          aFixedStr;

    //names of TOXs
    String          aTOXIndexName;
    String          aTOXUserName;
    String          aTOXContentName;
    String          aTOXIllustrationsName;
    String          aTOXObjectsName;
    String          aTOXTablesName;
    String          aTOXAuthoritiesName;

    SvStringsDtor   aDocInfoLst;

    // Fly-Anker Bmps
//  Bitmap          aAnchorBmp;
//  Bitmap          aDragAnchorBmp;

    // die AutoFormat-Redline-Kommentare
    inline const SvStringsDtor& GetAutoFmtNameLst() const;

    ShellResource();
    ~ShellResource();

private:
    void _GetAutoFmtNameLst() const;
    SvStringsDtor   *pAutoFmtNameLst;
};

inline const SvStringsDtor& ShellResource::GetAutoFmtNameLst() const
{
    if( !pAutoFmtNameLst )
        _GetAutoFmtNameLst();
    return *pAutoFmtNameLst;
}


#endif //_SHELLRES_HXX
diff --git a/sw/inc/sortopt.hxx b/sw/inc/sortopt.hxx
new file mode 100644
index 0000000..f971c5e
--- /dev/null
+++ b/sw/inc/sortopt.hxx
@@ -0,0 +1,101 @@
/*************************************************************************
 *
 *  $RCSfile: sortopt.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:28 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SORTOPT_HXX
#define _SORTOPT_HXX


#ifndef _SVARRAY_HXX //autogen
#include <svtools/svarray.hxx>
#endif

enum SwSortKeyType      { SRT_APLHANUM, SRT_NUMERIC     };
enum SwSortOrder        { SRT_ASCENDING, SRT_DESCENDING };
enum SwSortDirection    { SRT_COLUMNS, SRT_ROWS         };

/*--------------------------------------------------------------------
    Beschreibung: SortierSchluessel
 --------------------------------------------------------------------*/
struct SwSortKey
{
    SwSortKey();
    SwSortKey(USHORT nId, SwSortKeyType eTyp, SwSortOrder eOrder);
    SwSortKey(const SwSortKey& rOld);

    USHORT          nColumnId;
    SwSortKeyType   eSortKeyType;
    SwSortOrder     eSortOrder;
};

SV_DECL_PTRARR(SwSortKeys, SwSortKey*, 3, 1)

struct SwSortOptions
{
    SwSortOptions();
    ~SwSortOptions();
    SwSortOptions(const SwSortOptions& rOpt);

    BOOL            bTable;
    char            nDeli;
    SwSortDirection eDirection;
    SwSortKeys      aKeys;
};

#endif  // _SORTOPT_HXX
diff --git a/sw/inc/statstr.hrc b/sw/inc/statstr.hrc
new file mode 100644
index 0000000..8ed1814
--- /dev/null
+++ b/sw/inc/statstr.hrc
@@ -0,0 +1,88 @@
/*************************************************************************
 *
 *  $RCSfile: statstr.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:28 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _STATSTR_HRC
#define _STATSTR_HRC

#include "rcid.hrc"

#define STR_STATSTR_W4WREAD         (RC_STATLIN_STR + 0)
#define STR_STATSTR_W4WWRITE        (RC_STATLIN_STR + 1)
#define STR_STATSTR_SWGREAD         (RC_STATLIN_STR + 2)
#define STR_STATSTR_SWGWRITE        (RC_STATLIN_STR + 3)
#define STR_STATSTR_REFORMAT        (RC_STATLIN_STR + 4)
#define STR_STATSTR_AUTOFORMAT      (RC_STATLIN_STR + 5)
#define STR_STATSTR_IMPGRF          (RC_STATLIN_STR + 6)
#define STR_STATSTR_SEARCH          (RC_STATLIN_STR + 7)
#define STR_STATSTR_FORMAT          (RC_STATLIN_STR + 8)
#define STR_STATSTR_PRINT           (RC_STATLIN_STR + 9)
#define STR_STATSTR_LAYOUTINIT      (RC_STATLIN_STR + 10)
#define STR_STATSTR_LETTER          (RC_STATLIN_STR + 11)
#define STR_STATSTR_SPELL           (RC_STATLIN_STR + 12)
#define STR_STATSTR_HYPHEN          (RC_STATLIN_STR + 13)
#define STR_STATSTR_TOX_INSERT      (RC_STATLIN_STR + 14)
#define STR_STATSTR_TOX_UPDATE      (RC_STATLIN_STR + 15)
#define STR_STATSTR_SUMMARY         (RC_STATLIN_STR + 16)
#define STR_STATSTR_SWGPRTOLENOTIFY (RC_STATLIN_STR + 17)

#endif



diff --git a/sw/inc/sw.mk b/sw/inc/sw.mk
new file mode 100644
index 0000000..990a504
--- /dev/null
+++ b/sw/inc/sw.mk
@@ -0,0 +1,150 @@
#*************************************************************************
#
#   $RCSfile: sw.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:28 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

# CDEFS=$(CDEFS) -DXXX

# Bereiche aktivieren

#CDEFS+=-DXML_CORE_API
CDEFS+=-DNUM_RELSPACE

# use the new GrahicObject - the old code with our own GraphicCache will be removed
# if all the new code runs correct.
CDEFS+=-DUSE_GRFOBJECT
USE_GRFOBJECT=TRUE

# MakeDepn nicht das segdefs.hxx und die PCHs auswerten lassen
# PCHs werden nur in den ..._1st Verzeichnissen aufgenommen
EXCDEPN=segdefs.hxx
EXCDEPNPCH=core_pch.hxx;filt_pch.hxx;ui_pch.hxx
MKDEPFLAGS+=-E:$(EXCDEPN);$(EXCDEPNPCH)

.IF "$(GUI)" == "WIN" || "$(GUI)" == "WNT" || "$(GUI)" == "OS2"
CDEFS+=-DSBASIC
.ENDIF

.IF "$(GUI)" == "WIN"
CDEFS+=-DOLE -DOLE2
.ENDIF

.IF "$(compact)" != ""
CDEFS+=-DCOMPACT
.ENDIF

.IF "$(debug)" != ""
DB=cv
.ENDIF

.IF "$(prjpch)" != ""
CDEFS+=-DPRECOMPILED
.ENDIF


# ------------------------------------------------------------------
# alte defines fuer die Sourcen
# ------------------------------------------------------------------

.IF "$(GUI)" == "WIN"
CDEFS+=-DW30
.ENDIF

.IF "$(GUI)" == "OS2"
CDEFS+=-DPM2 -DPM20
RSCFLAGS+=-DPM2 -DPM20
.IF "$(debug)" != ""
# fuer OS/2 und debug groessere Pages
LIBFLAGS=/C /P512
.ENDIF
.ENDIF

.IF "$(COM)" == "BLC"
CDEFS+=-DTCPP
.ENDIF

.IF "$(COM)" == "STC"
CDEFS+=-DZTC
.ENDIF

.IF "$(COM)" == "ICC"
CDEFS+=-DCSET
.ENDIF


# ------------------------------------------------------------------------
# WINMSCI Compiler
# ------------------------------------------------------------------------
.IF "$(GUI)$(COM)" == "WINMSC"

.IF "$(optimize)" != ""
CFLAGS+=-OV9
.ENDIF

# kein -GEfs wegen dann fehlender inlinings
CFLAGSOBJGUIST=-Alfd -GA -GEd

.ENDIF # WINMSCI
# ------------------------------------------------------------------------

# ------------------------------------------------------------------------
# add uno headers to inlude path
# ------------------------------------------------------------------------
INCPRE+=$(SOLARINCDIR)$/offuh
diff --git a/sw/inc/swacorr.hxx b/sw/inc/swacorr.hxx
new file mode 100644
index 0000000..7c86df4
--- /dev/null
+++ b/sw/inc/swacorr.hxx
@@ -0,0 +1,91 @@
/*************************************************************************
 *
 *  $RCSfile: swacorr.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:28 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWACORR_HXX
#define _SWACORR_HXX

#ifndef _MySVXACORR_HXX //autogen
#include <svx/svxacorr.hxx>
#endif


class SwAutoCorrect : public SvxAutoCorrect
{
protected:
    //  - return den Ersetzungstext (nur fuer SWG-Format, alle anderen
    //      koennen aus der Wortliste herausgeholt werden!)
    //      rShort ist der Stream-Name - gecryptet!
    virtual BOOL GetLongText( SvStorage&, const String& rShort, String& rLong );
    //  - Text mit Attributierung (kann nur der SWG - SWG-Format!)
    //      rShort ist der Stream-Name - gecryptet!
    virtual BOOL PutText( SvStorage&, const String& rShort, SfxObjectShell& ,
                            String& );

public:
    TYPEINFO();

    SwAutoCorrect( const String& rAutocorrFile );
    SwAutoCorrect( const SvxAutoCorrect& rACorr );
    virtual ~SwAutoCorrect();
};


#endif

diff --git a/sw/inc/swatrset.hxx b/sw/inc/swatrset.hxx
new file mode 100644
index 0000000..792efce
--- /dev/null
+++ b/sw/inc/swatrset.hxx
@@ -0,0 +1,382 @@
/*************************************************************************
 *
 *  $RCSfile: swatrset.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:28 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWATRSET_HXX
#define _SWATRSET_HXX

#ifndef _SOLAR_H
#include <tools/solar.h>
#endif

#ifndef _SVMEMPOOL_HXX //autogen
#include <tools/mempool.hxx>
#endif
#ifndef _SFXITEMSET_HXX //autogen
#include <svtools/itemset.hxx>
#endif
#ifndef _SFXITEMPOOL_HXX //autogen
#include <svtools/itempool.hxx>
#endif
class SwModify;
class SwDoc;

class SfxBoolItem;
class SvxPostureItem;
class SvxWeightItem;
class SvxShadowedItem;
class SvxAutoKernItem;
class SvxWordLineModeItem;
class SvxContourItem;
class SvxKerningItem;
class SvxUnderlineItem;
class SvxCrossedOutItem;
class SvxFontHeightItem;
class SvxPropSizeItem;
class SvxFontItem;
class SvxColorItem;
class SvxCharSetColorItem;
class SvxLanguageItem;
class SvxEscapementItem;
class SvxCaseMapItem;
class SvxNoHyphenItem;
class SvxBlinkItem;

// Frame-Attribute
class SwFmtFillOrder;
class SwFmtFrmSize;
class SvxPaperBinItem;
class SvxLRSpaceItem;
class SvxULSpaceItem;
class SwFmtCntnt;
class SwFmtHeader;
class SwFmtFooter;
class SvxPrintItem;
class SvxOpaqueItem;
class SvxProtectItem;
class SwFmtSurround;
class SwFmtVertOrient;
class SwFmtHoriOrient;
class SwFmtAnchor;
class SvxBoxItem;
class SvxBrushItem;
class SvxShadowItem;
class SwFmtPageDesc;
class SvxFmtBreakItem;
class SwFmtCol;
class SvxMacroItem;
class SvxFmtKeepItem;
class SwFmtURL;
class SwFmtLineNumber;
class SwFmtEditInReadonly;
class SwFmtLayoutSplit;
class SwFmtChain;
class SwFmtFtnAtTxtEnd;
class SwFmtEndAtTxtEnd;
class SwFmtNoBalancedColumns;

// Grafik-Attribute
class SwMirrorGrf;
class SwCropGrf;
class SwRotationGrf;
class SwLuminanceGrf;
class SwContrastGrf;
class SwChannelRGrf;
class SwChannelGGrf;
class SwChannelBGrf;
class SwGammaGrf;
class SwInvertGrf;
class SwTransparencyGrf;
class SwDrawModeGrf;

// Paragraph-Attribute
class SvxLineSpacingItem;
class SvxAdjustItem;
class SvxFmtSplitItem;
class SwRegisterItem;
class SwNumRuleItem;
class SvxWidowsItem;
class SvxOrphansItem;
class SvxTabStopItem;
class SvxHyphenZoneItem;
class SwFmtDrop;

// TabellenBox-Attribute
class SwTblBoxNumFormat;
class SwTblBoxFormula;
class SwTblBoxValue;


class SwAttrPool : public SfxItemPool
{
    friend void _InitCore();            // fuers anlegen/zerstoeren der
    friend void _FinitCore();           // Versionsmaps
    static USHORT* pVersionMap1;
    static USHORT* pVersionMap2;
    static USHORT* pVersionMap3;

    SwDoc* pDoc;

public:
    SwAttrPool( SwDoc* pDoc );

          SwDoc* GetDoc()           { return pDoc; }
    const SwDoc* GetDoc() const     { return pDoc; }

    static USHORT* GetVersionMap1() { return pVersionMap1; }
    static USHORT* GetVersionMap2() { return pVersionMap2; }
    static USHORT* GetVersionMap3() { return pVersionMap3; }
};


class SwAttrSet : public SfxItemSet
{
    // Pointer fuers Modify-System
    SwAttrSet *pOldSet, *pNewSet;

    // Notification-Callback
    virtual void Changed( const SfxPoolItem& rOld, const SfxPoolItem& rNew );

    void PutChgd( const SfxPoolItem& rI ) { SfxItemSet::PutDirect( rI ); }
public:
    SwAttrSet( SwAttrPool&, USHORT nWhich1, USHORT nWhich2 );
    SwAttrSet( SwAttrPool&, const USHORT* nWhichPairTable );
    SwAttrSet( const SwAttrSet& );

    int Put_BC( const SfxPoolItem& rAttr, SwAttrSet* pOld, SwAttrSet* pNew );
    int Put_BC( const SfxItemSet& rSet, SwAttrSet* pOld, SwAttrSet* pNew );

    // ein Item oder einen Bereich loeschen
    USHORT ClearItem_BC( USHORT nWhich, SwAttrSet* pOld, SwAttrSet* pNew );
    USHORT ClearItem_BC( USHORT nWhich1, USHORT nWhich2,
                        SwAttrSet* pOld = 0, SwAttrSet* pNew = 0 );

    int Intersect_BC( const SfxItemSet& rSet, SwAttrSet* pOld, SwAttrSet* pNew );
    int Differentiate_BC( const SfxItemSet& rSet, SwAttrSet* pOld, SwAttrSet* pNew );
    int MergeValues_BC( const SfxItemSet& rSet, SwAttrSet* pOld, SwAttrSet* pNew );

    void GetPresentation( SfxItemPresentation ePres,
        SfxMapUnit eCoreMetric, SfxMapUnit ePresMetric, String &rText ) const;

    SwAttrPool* GetPool() const { return (SwAttrPool*)SfxItemSet::GetPool(); }

    // kopiere die Attribute ggfs. ueber Dokumentgrenzen
    void CopyToModify( SwModify& rMod ) const;

    // ----------------------------------------------------------------
    // Sonderbehandlung fuer einige Attribute
    // Setze den Modify-Pointer (alten pDefinedIn) bei folgenden Attributen:
    //  - SwFmtDropCaps
    //  - SwFmtPageDesc
    // (Wird beim Einfuegen in Formate/Nodes gerufen)
    void SetModifyAtAttr( const SwModify* pModify );

    // Das Doc wird jetzt am SwAttrPool gesetzt. Dadurch hat man es immer
    // im Zugriff.
    const SwDoc *GetDoc() const { return GetPool()->GetDoc(); }
          SwDoc *GetDoc()       { return GetPool()->GetDoc(); }

    // GetMethoden: das Bool gibt an, ob nur im Set (FALSE) oder auch in
    //              den Parents gesucht werden soll. Wird nichts gefunden,
    //              wird das deflt. Attribut returnt.
    // Charakter-Attribute  - impl. steht im charatr.hxx
    // AMA 12.10.94: Umstellung von SwFmt... auf Svx...
    inline const SvxPostureItem         &GetPosture( BOOL = TRUE ) const;
    inline const SvxWeightItem          &GetWeight( BOOL = TRUE ) const;
    inline const SvxShadowedItem        &GetShadowed( BOOL = TRUE ) const;
    inline const SvxAutoKernItem        &GetAutoKern( BOOL = TRUE ) const;
    inline const SvxWordLineModeItem    &GetWordLineMode( BOOL = TRUE ) const;
    inline const SvxContourItem         &GetContour( BOOL = TRUE ) const;
    inline const SvxKerningItem         &GetKerning( BOOL = TRUE ) const;
    inline const SvxUnderlineItem       &GetUnderline( BOOL = TRUE ) const;
    inline const SvxCrossedOutItem      &GetCrossedOut( BOOL = TRUE ) const;
    inline const SvxFontHeightItem      &GetSize( BOOL = TRUE ) const;
    inline const SvxPropSizeItem        &GetPropSize( BOOL = TRUE ) const;
    inline const SvxFontItem            &GetFont( BOOL = TRUE ) const;
    inline const SvxColorItem           &GetColor( BOOL = TRUE ) const;
    inline const SvxCharSetColorItem    &GetCharSetColor( BOOL = TRUE ) const;
    inline const SvxLanguageItem        &GetLanguage( BOOL = TRUE ) const;
    inline const SvxEscapementItem      &GetEscapement( BOOL = TRUE ) const;
    inline const SvxCaseMapItem         &GetCaseMap( BOOL = TRUE ) const;
    inline const SvxNoHyphenItem        &GetNoHyphenHere( BOOL = TRUE ) const;
    inline const SvxBlinkItem           &GetBlink( BOOL = TRUE ) const;
    inline const SvxBrushItem           &GetChrBackground( BOOL = TRUE ) const;
    inline const SvxFontItem            &GetCJKFont( BOOL = TRUE ) const;
    inline const SvxFontHeightItem      &GetCJKSize( BOOL = TRUE ) const;
    inline const SvxLanguageItem        &GetCJKLanguage( BOOL = TRUE ) const;
    inline const SvxPostureItem         &GetCJKPosture( BOOL = TRUE ) const;
    inline const SvxWeightItem          &GetCJKWeight( BOOL = TRUE ) const;
    inline const SvxFontItem            &GetCTLFont( BOOL = TRUE ) const;
    inline const SvxFontHeightItem      &GetCTLSize( BOOL = TRUE ) const;
    inline const SvxLanguageItem        &GetCTLLanguage( BOOL = TRUE ) const;
    inline const SvxPostureItem         &GetCTLPosture( BOOL = TRUE ) const;
    inline const SvxWeightItem          &GetCTLWeight( BOOL = TRUE ) const;
    inline const SfxBoolItem            &GetWritingDirection( BOOL = TRUE ) const;

    // Frame-Attribute  - impl. steht im frmatr.hxx
    inline const SwFmtFillOrder         &GetFillOrder( BOOL = TRUE ) const;
    inline const SwFmtFrmSize           &GetFrmSize( BOOL = TRUE ) const;
    inline const SvxPaperBinItem        &GetPaperBin( BOOL = TRUE ) const;
    inline const SvxLRSpaceItem         &GetLRSpace( BOOL = TRUE ) const;
    inline const SvxULSpaceItem         &GetULSpace( BOOL = TRUE ) const;
    inline const SwFmtCntnt             &GetCntnt( BOOL = TRUE ) const;
    inline const SwFmtHeader            &GetHeader( BOOL = TRUE ) const;
    inline const SwFmtFooter            &GetFooter( BOOL = TRUE ) const;
    inline const SvxPrintItem           &GetPrint( BOOL = TRUE ) const;
    inline const SvxOpaqueItem          &GetOpaque( BOOL = TRUE ) const;
    inline const SvxProtectItem         &GetProtect( BOOL = TRUE ) const;
    inline const SwFmtSurround          &GetSurround( BOOL = TRUE ) const;
    inline const SwFmtVertOrient        &GetVertOrient( BOOL = TRUE ) const;
    inline const SwFmtHoriOrient        &GetHoriOrient( BOOL = TRUE ) const;
    inline const SwFmtAnchor            &GetAnchor( BOOL = TRUE ) const;
    inline const SvxBoxItem             &GetBox( BOOL = TRUE ) const;
    inline const SvxFmtKeepItem         &GetKeep( BOOL = TRUE ) const;
    inline const SvxBrushItem           &GetBackground( BOOL = TRUE ) const;
    inline const SvxShadowItem          &GetShadow( BOOL = TRUE ) const;
    inline const SwFmtPageDesc          &GetPageDesc( BOOL = TRUE ) const;
    inline const SvxFmtBreakItem        &GetBreak( BOOL = TRUE ) const;
    inline const SwFmtCol               &GetCol( BOOL = TRUE ) const;
    inline const SvxMacroItem           &GetMacro( BOOL = TRUE ) const;
    inline const SwFmtURL               &GetURL( BOOL = TRUE ) const;
    inline const SwFmtEditInReadonly    &GetEditInReadonly( BOOL = TRUE ) const;
    inline const SwFmtLayoutSplit       &GetLayoutSplit( BOOL = TRUE ) const;
    inline const SwFmtChain             &GetChain( BOOL = TRUE ) const;
    inline const SwFmtLineNumber        &GetLineNumber( BOOL = TRUE ) const;
    inline const SwFmtFtnAtTxtEnd       &GetFtnAtTxtEnd( BOOL = TRUE ) const;
    inline const SwFmtEndAtTxtEnd       &GetEndAtTxtEnd( BOOL = TRUE ) const;
    inline const SwFmtNoBalancedColumns &GetBalancedColumns( BOOL = TRUE ) const;

    // Grafik-Attribute - impl. steht im grfatr.hxx
    inline const SwMirrorGrf            &GetMirrorGrf( BOOL = TRUE ) const;
    inline const SwCropGrf              &GetCropGrf( BOOL = TRUE ) const;
    inline const SwRotationGrf          &GetRotationGrf(BOOL = TRUE ) const;
    inline const SwLuminanceGrf         &GetLuminanceGrf(BOOL = TRUE ) const;
    inline const SwContrastGrf          &GetContrastGrf(BOOL = TRUE ) const;
    inline const SwChannelRGrf          &GetChannelRGrf(BOOL = TRUE ) const;
    inline const SwChannelGGrf          &GetChannelGGrf(BOOL = TRUE ) const;
    inline const SwChannelBGrf          &GetChannelBGrf(BOOL = TRUE ) const;
    inline const SwGammaGrf             &GetGammaGrf(BOOL = TRUE ) const;
    inline const SwInvertGrf            &GetInvertGrf(BOOL = TRUE ) const;
    inline const SwTransparencyGrf      &GetTransparencyGrf(BOOL = TRUE ) const;
    inline const SwDrawModeGrf          &GetDrawModeGrf(BOOL = TRUE ) const;

    // Paragraph-Attribute  - impl. steht im paratr.hxx
    inline const SvxLineSpacingItem     &GetLineSpacing( BOOL = TRUE ) const;
    inline const SvxAdjustItem          &GetAdjust( BOOL = TRUE ) const;
    inline const SvxFmtSplitItem        &GetSplit( BOOL = TRUE ) const;
    inline const SwRegisterItem         &GetRegister( BOOL = TRUE ) const;
    inline const SwNumRuleItem          &GetNumRule( BOOL = TRUE ) const;
    inline const SvxWidowsItem          &GetWidows( BOOL = TRUE ) const;
    inline const SvxOrphansItem         &GetOrphans( BOOL = TRUE ) const;
    inline const SvxTabStopItem         &GetTabStops( BOOL = TRUE ) const;
    inline const SvxHyphenZoneItem      &GetHyphenZone( BOOL = TRUE ) const;
    inline const SwFmtDrop              &GetDrop( BOOL = TRUE ) const;

    // TabellenBox-Attribute    - impl. steht im cellatr.hxx
    inline const SwTblBoxNumFormat      &GetTblBoxNumFmt( BOOL = TRUE ) const;
    inline const SwTblBoxFormula        &GetTblBoxFormula( BOOL = TRUE ) const;
    inline const SwTblBoxValue          &GetTblBoxValue( BOOL = TRUE ) const;

    DECL_FIXEDMEMPOOL_NEWDEL(SwAttrSet)
};


/*************************************************************************

      $Log: not supported by cvs2svn $
      Revision 1.48  2000/09/18 16:03:29  willem.vandorp
      OpenOffice header added.

      Revision 1.47  2000/09/08 13:24:27  willem.vandorp
      Header and footer replaced

      Revision 1.46  2000/07/31 19:23:08  jp
      new attributes for CJK/CTL and graphic

      Revision 1.45  2000/05/26 07:08:20  os
      old SW Basic API Slots removed

      Revision 1.44  2000/01/03 18:19:55  jp
      Bug #71411#: new attribut

      Revision 1.43  1999/09/07 14:33:46  ama
      New #66878#: EndOfTxt-Items for footnotes and endnotes

      Revision 1.42  1999/03/19 12:33:58  OS
      #63701# unbenutztes Break-Attribut aus den Sections entfernt


      Rev 1.41   19 Mar 1999 13:33:58   OS
   #63701# unbenutztes Break-Attribut aus den Sections entfernt

      Rev 1.40   05 Feb 1999 17:42:26   JP
   Task #61467#: Attrset ueber Dokumentgrenzen kopieren, dabei PageDesc/Numrule mit erzeugen

      Rev 1.39   28 Jan 1999 18:11:48   JP
   Task #57749#: Undo von Bereichs-Attributen (Spalten, Hintergr...)

      Rev 1.38   04 Feb 1998 14:09:20   MA
   new: SwFmtLineNumber

      Rev 1.37   15 Dec 1997 16:23:40   AMA
   New: SwSectItem: Soll der uebergeordnete Bereich aufgebrochen werden?

*************************************************************************/
    // #ifndef _SWATRSET_HXX
#endif
diff --git a/sw/inc/swbaslnk.hxx b/sw/inc/swbaslnk.hxx
new file mode 100644
index 0000000..34aed058
--- /dev/null
+++ b/sw/inc/swbaslnk.hxx
@@ -0,0 +1,127 @@
/*************************************************************************
 *
 *  $RCSfile: swbaslnk.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:28 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWBASLNK_HXX
#define _SWBASLNK_HXX


#ifndef _LNKBASE_HXX //autogen
#include <so3/lnkbase.hxx>
#endif

class SwNode;
class SwCntntNode;
class SwNodeIndex;

class SwBaseLink : public SvBaseLink
{
    SwCntntNode* pCntntNode;
    BOOL bSwapIn : 1;
    BOOL bNoDataFlag : 1;
    BOOL bIgnoreDataChanged : 1;

protected:
    SwBaseLink() {}

    SwBaseLink( const String& rNm, USHORT nObjectType, SvPseudoObject* pObj,
                 SwCntntNode* pNode = 0 )
        : SvBaseLink( rNm, nObjectType, pObj ), pCntntNode( pNode ),
        bSwapIn( FALSE ), bNoDataFlag( FALSE ), bIgnoreDataChanged( FALSE )
    {}

public:
    TYPEINFO();

    SwBaseLink( USHORT nMode, USHORT nFormat, SwCntntNode* pNode = 0 )
        : SvBaseLink( nMode, nFormat ), pCntntNode( pNode ),
        bSwapIn( FALSE ), bNoDataFlag( FALSE ), bIgnoreDataChanged( FALSE )
    {}
    virtual ~SwBaseLink();

    virtual void DataChanged( SvData& rData );
    virtual void Closed();

    virtual const SwNode* GetAnchor() const;

    SwCntntNode *GetCntntNode() { return pCntntNode; }

    // nur fuer Grafiken
    FASTBOOL SwapIn( BOOL bWaitForData = FALSE, BOOL bNativFormat = FALSE );

    FASTBOOL IsShowQuickDrawBmp() const;                // nur fuer Grafiken

    FASTBOOL Connect() { return 0 != SvBaseLink::GetRealObject(); }
    SvLinkName* GetCacheName() const { return SvBaseLink::GetCacheName(); }

    // nur fuer Grafik-Links ( zum Umschalten zwischen DDE / Grf-Link)
    void SetObjType( USHORT nType ) { SvBaseLink::SetObjType( nType ); }

    BOOL IsRecursion( const SwBaseLink* pChkLnk ) const;
    virtual BOOL IsInRange( ULONG nSttNd, ULONG nEndNd, xub_StrLen nStt = 0,
                            xub_StrLen nEnd = STRING_NOTFOUND ) const;

    void SetNoDataFlag()    { bNoDataFlag = TRUE; }
    BOOL ChkNoDataFlag()    { return bNoDataFlag ? !(bNoDataFlag = FALSE) : FALSE; }
    BOOL IsNoDataFlag() const           { return bNoDataFlag; }
};


#endif

diff --git a/sw/inc/swcrsr.hxx b/sw/inc/swcrsr.hxx
new file mode 100644
index 0000000..b87b94d
--- /dev/null
+++ b/sw/inc/swcrsr.hxx
@@ -0,0 +1,348 @@
/*************************************************************************
 *
 *  $RCSfile: swcrsr.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:28 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWCRSR_HXX
#define _SWCRSR_HXX

#ifndef _WORDSEL_HXX //autogen
#include <svtools/wordsel.hxx>
#endif
#ifndef _PAM_HXX //autogen
#include <pam.hxx>
#endif
#ifndef _TBLSEL_HXX //autogen
#include <tblsel.hxx>
#endif
#ifndef _CSHTYP_HXX //autogen
#include <cshtyp.hxx>
#endif


class SwShellCrsr;
class SwShellTableCrsr;
class SwTableCursor;
class SwUnoCrsr;
class SwUnoTableCrsr;
struct _SwCursor_SavePos;

// ein Basis-Struktur fuer die Parameter der Find-Methoden
// return - Werte vom Found-Aufruf.
const int FIND_NOT_FOUND    = 0;
const int FIND_FOUND        = 1;
const int FIND_NO_RING      = 2;

struct SwFindParas
{
    virtual int Find( SwPaM*, SwMoveFn, const SwPaM*, FASTBOOL ) = 0;
    virtual int IsReplaceMode() const = 0;
};

enum SwCursorSelOverFlags
{
    SELOVER_NONE                = 0x00,
    SELOVER_CHECKNODESSECTION   = 0x01,
    SELOVER_TOGGLE              = 0x02,
    SELOVER_ENABLEREVDIREKTION  = 0x04,
    SELOVER_CHANGEPOS           = 0x08
};

class SwCursor : public SwPaM
{
    friend class SwCrsrSaveState;

    _SwCursor_SavePos* pSavePos;

    ULONG FindAll( SwFindParas& , SwDocPositions, SwDocPositions, FindRanges );

protected:
    virtual _SwCursor_SavePos* CreateNewSavePos() const;
    void SaveState();
    void RestoreState();

    const _SwCursor_SavePos* GetSavePos() const { return pSavePos; }

public:
    SwCursor( const SwPosition &rPos, SwPaM* pRing = 0 );
    SwCursor( SwCursor& );
    virtual ~SwCursor();

    virtual SwCursor* Create( SwPaM* pRing = 0 ) const;

    virtual operator SwShellCrsr* ();
    virtual operator SwShellTableCrsr* ();
    virtual operator SwTableCursor* ();
    virtual operator SwUnoCrsr* ();
    virtual operator SwUnoTableCrsr* ();

    inline operator const SwShellCrsr* () const;
    inline operator const SwShellTableCrsr* () const;
    inline operator const SwTableCursor* () const;
    inline operator const SwUnoCrsr* () const;
    inline operator const SwUnoTableCrsr* () const;

    virtual FASTBOOL MaxReplaceArived();
    virtual void SaveTblBoxCntnt( const SwPosition* pPos = 0 );

    void FillFindPos( SwDocPositions ePos, SwPosition& rPos ) const;
    SwMoveFnCollection* MakeFindRange( SwDocPositions, SwDocPositions,
                                        SwPaM* ) const;

    ULONG Find( const SearchParam& rParam,
                SwDocPositions nStart, SwDocPositions nEnde,
                FindRanges = FND_IN_BODY,
                int bReplace = FALSE );

    ULONG Find( const SwTxtFmtColl& rFmtColl,
                SwDocPositions nStart, SwDocPositions nEnde,
                FindRanges = FND_IN_BODY,
                const SwTxtFmtColl* pReplFmt = 0 );

    ULONG Find( const SfxItemSet& rSet, FASTBOOL bNoCollections,
                SwDocPositions nStart, SwDocPositions nEnde,
                FindRanges = FND_IN_BODY,
                const SearchParam* pTextPara = 0,
                const SfxItemSet* rReplSet = 0 );

/*  int IsWordFNC( FNIsWord fnIsWord ) const;
    int GoWordFNC( FNGoWord fnGoWord );
    FASTBOOL IsStartWord()const { return IsWordFNC( WordSelection::IsStartWord ); }
    FASTBOOL IsEndWord() const  { return IsWordFNC( WordSelection::IsEndWord ); }
    FASTBOOL IsInWord() const   { return IsWordFNC( WordSelection::IsInWord ); }
    FASTBOOL GoStartWord()  { return GoWordFNC( WordSelection::GoStartWord ); }
    FASTBOOL GoEndWord()    { return GoWordFNC( WordSelection::GoEndWord ); }
    FASTBOOL GoNextWord()   { return GoWordFNC( WordSelection::GoNextWord ); }
    FASTBOOL GoPrevWord()   { return GoWordFNC( WordSelection::GoPrevWord ); }
*/
    FASTBOOL IsStartWord()const;
    FASTBOOL IsEndWord() const;
    FASTBOOL IsInWord() const;
    FASTBOOL GoStartWord();
    FASTBOOL GoEndWord();
    FASTBOOL GoNextWord();
    FASTBOOL GoPrevWord();
    FASTBOOL SelectWord( const Point* pPt = 0 );

    enum SentenceMoveType
    {
        NEXT_SENT,
        PREV_SENT,
        START_SENT,
        END_SENT
    };
    FASTBOOL GoSentence(SentenceMoveType eMoveType);
    FASTBOOL GoNextSentence(){return GoSentence(NEXT_SENT);}
    FASTBOOL GoPrevSentence(){return GoSentence(PREV_SENT);}

    FASTBOOL LeftRight( BOOL bLeft, USHORT nCnt = 1 );
    FASTBOOL UpDown( BOOL bUp, USHORT nCnt = 1,
                    Point* pPt = 0, long nUpDownX = 0 );
    FASTBOOL LeftRightMargin( BOOL bLeftMargin, BOOL bAPI = FALSE );
    FASTBOOL IsAtLeftRightMargin( BOOL bLeftMargin, BOOL bAPI = FALSE ) const;
    FASTBOOL SttEndDoc( BOOL bSttDoc );
    FASTBOOL GoPrevNextCell( BOOL bNext, USHORT nCnt );

    FASTBOOL Left( USHORT nCnt = 1 )    { return LeftRight( TRUE, nCnt ); }
    FASTBOOL Right( USHORT nCnt = 1 )   { return LeftRight( FALSE, nCnt ); }
    FASTBOOL Up( USHORT nCnt = 1 )      { return UpDown( TRUE, nCnt ); }
    FASTBOOL Down( USHORT nCnt = 1 )    { return UpDown( FALSE, nCnt ); }
    FASTBOOL LeftMargin()               { return LeftRightMargin( TRUE ); }
    FASTBOOL RightMargin()              { return LeftRightMargin( FALSE ); }
    FASTBOOL SttDoc()                   { return SttEndDoc( TRUE ); }
    FASTBOOL EndDoc()                   { return SttEndDoc( FALSE ); }
    FASTBOOL GoNextCell( USHORT nCnt = 1 )  { return GoPrevNextCell( TRUE, nCnt ); }
    FASTBOOL GoPrevCell( USHORT nCnt = 1 )  { return GoPrevNextCell( FALSE, nCnt ); }
    FASTBOOL GotoTable( const String& rName );
    FASTBOOL GotoTblBox( const String& rName );
    FASTBOOL GotoRegion( const String& rName );
    FASTBOOL GotoFtnAnchor();
    FASTBOOL GotoFtnTxt();
    FASTBOOL GotoNextFtnAnchor();
    FASTBOOL GotoPrevFtnAnchor();
    FASTBOOL GotoNextFtnCntnt();
    FASTBOOL GotoPrevFtnCntnt();

    FASTBOOL MovePara( SwWhichPara, SwPosPara );
    FASTBOOL MoveSection( SwWhichSection, SwPosSection );
    FASTBOOL MoveTable( SwWhichTable, SwPosTable );
    FASTBOOL MoveRegion( SwWhichRegion, SwPosRegion );


    // gibt es eine Selection vom Content in die Tabelle
    // Return Wert gibt an, ob der Crsr auf der alten Position verbleibt
    virtual FASTBOOL IsSelOvr( int eFlags =
                                ( SELOVER_CHECKNODESSECTION |
                                  SELOVER_TOGGLE | SELOVER_CHANGEPOS ));
    virtual FASTBOOL IsInProtectTable( FASTBOOL bMove = FALSE,
                                        FASTBOOL bChgCrsr = TRUE );
    FASTBOOL IsNoCntnt() const;

    void RestoreSavePos();      // Point auf die SavePos setzen

    // TRUE: an die Position kann der Cursor gesetzt werden
    virtual FASTBOOL IsAtValidPos( BOOL bPoint = TRUE ) const;

    // darf der Cursor in ReadOnlyBereiche?
    FASTBOOL IsReadOnlyAvailable() const;

    DECL_FIXEDMEMPOOL_NEWDEL( SwCursor )
};


class SwCrsrSaveState
{
    SwCursor& rCrsr;
public:
    SwCrsrSaveState( SwCursor& rC ) : rCrsr( rC ) { rC.SaveState(); }
    ~SwCrsrSaveState() { rCrsr.RestoreState(); }
};

struct _SwCursor_SavePos
{
    ULONG nNode;
    xub_StrLen nCntnt;
    _SwCursor_SavePos* pNext;

    _SwCursor_SavePos( const SwCursor& rCrsr )
        : nNode( rCrsr.GetPoint()->nNode.GetIndex() ),
        nCntnt( rCrsr.GetPoint()->nContent.GetIndex() ),
        pNext( 0 )
    {}
    virtual ~_SwCursor_SavePos() {}
};



class SwTableCursor : public virtual SwCursor
{

protected:
    ULONG nTblPtNd, nTblMkNd;
    xub_StrLen nTblPtCnt, nTblMkCnt;
    SwSelBoxes aSelBoxes;
    BOOL bChg : 1;
    BOOL bParked : 1;       // Tabellen-Cursor wurde geparkt

public:
    SwTableCursor( const SwPosition &rPos, SwPaM* pRing = 0 );
    SwTableCursor( SwTableCursor& );
    virtual ~SwTableCursor();

    virtual operator SwTableCursor* ();

    void InsertBox( const SwTableBox& rTblBox );
    void DeleteBox( USHORT nPos ) { aSelBoxes.Remove( nPos ); bChg = TRUE; }
    USHORT GetBoxesCount() const { return aSelBoxes.Count(); }
    const SwSelBoxes& GetBoxes() const { return aSelBoxes; }

        // Baut fuer alle Boxen die Cursor auf
    SwCursor* MakeBoxSels( SwCursor* pAktCrsr );
        // sind irgendwelche Boxen mit einem Schutz versehen?
    FASTBOOL HasReadOnlyBoxSel() const;

        // wurde der TabelleCursor veraendert ? Wenn ja speicher gleich
        // die neuen Werte.
    FASTBOOL IsCrsrMovedUpdt();
        // wurde der TabelleCursor veraendert ?
    FASTBOOL IsCrsrMoved() const
    {
        return  nTblMkNd != GetMark()->nNode.GetIndex() ||
                nTblPtNd != GetPoint()->nNode.GetIndex() ||
                nTblMkCnt != GetMark()->nContent.GetIndex() ||
                nTblPtCnt != GetPoint()->nContent.GetIndex();
    }

    FASTBOOL IsChgd() const { return bChg; }

    // Parke den Tabellen-Cursor auf dem StartNode der Boxen.
    void ParkCrsr();

};


// --------------------------- inline Methoden ----------------------

inline SwCursor::operator const SwShellCrsr* () const
{
    return (SwShellCrsr*)*((SwCursor*)this);
}

inline SwCursor::operator const SwShellTableCrsr* () const
{
    return (SwShellTableCrsr*)*((SwCursor*)this);
}

inline SwCursor::operator const SwTableCursor* () const
{
    return (SwTableCursor*)*((SwCursor*)this);
}

inline SwCursor::operator const SwUnoCrsr* () const
{
    return (SwUnoCrsr*)*((SwCursor*)this);
}

inline SwCursor::operator const SwUnoTableCrsr* () const
{
    return (SwUnoTableCrsr*)*((SwCursor*)this);
}


#endif

diff --git a/sw/inc/swddetbl.hxx b/sw/inc/swddetbl.hxx
new file mode 100644
index 0000000..e26727a
--- /dev/null
+++ b/sw/inc/swddetbl.hxx
@@ -0,0 +1,94 @@
/*************************************************************************
 *
 *  $RCSfile: swddetbl.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:28 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWDDETBL_HXX
#define _SWDDETBL_HXX

#include "swtable.hxx"

class SwDDEFieldType;

class SwDDETable : public SwTable
{
    SwDepend aDepend;
public:
    TYPEINFO();
    // Constructor movet alle Lines/Boxen aus der SwTable zu sich.
    // Die SwTable ist danach Leer und muss geloescht werden.
    SwDDETable( SwTable& rTable, SwDDEFieldType* pDDEType );
    ~SwDDETable();

    void Modify( SfxPoolItem*, SfxPoolItem* );
    void ChangeContent();
    BOOL  NoDDETable();

    SwDDEFieldType* GetDDEFldType();
    inline const SwDDEFieldType* GetDDEFldType() const;
};


// ----------- Inlines -----------------------------

inline const SwDDEFieldType* SwDDETable::GetDDEFldType() const
{
    return ((SwDDETable*)this)->GetDDEFldType();
}

#endif
diff --git a/sw/inc/swdll.hxx b/sw/inc/swdll.hxx
new file mode 100644
index 0000000..bdabfea
--- /dev/null
+++ b/sw/inc/swdll.hxx
@@ -0,0 +1,171 @@
/*************************************************************************
 *
 *  $RCSfile: swdll.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:28 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef SW_SWDLL_HXX
#define SW_SWDLL_HXX

class ResMgr;
class SvFactory;
class SotFactory;
class StatusBar;

class SfxMedium;
class SfxFilter;

#ifndef _SFXDEFS_HXX //autogen
#include <sfx2/sfxdefs.hxx>
#endif
#ifndef _SFXMODULE_HXX //autogen
#include <sfx2/module.hxx>
#endif

//#include <sal/types.h>

//-------------------------------------------------------------------------

class SwDLL

/*  [Description]

    This class is a wrapper for a Load-On-Demand-DLL. One instance
    per SfxApplication will be created for the runtime of
    SfxApplication-subclass::Main().

    Remember: Do export this class! It is used by the application.
*/

{

    static void RegisterFactories();
    static void RegisterInterfaces();
    static void RegisterControls();
public:
                    // Ctor/Dtor must be linked to the application
                    SwDLL();
                    ~SwDLL();

                    // static-init/exit-code must be linked to the application
    static void     LibInit();  // called from SfxApplication-subclass::Init()
    static void     LibExit();  // called from SfxApplication-subclass::Exit()
    static void     PreExit();  // muss vor LibExit gerufen werden

                    // DLL-init/exit-code must be linked to the DLL only
    static void     Init();     // called directly after loading the DLL
    static void     Exit();     // called directly befor unloading the DLL


    static void     FillStatusBar(StatusBar &rBar);

    static ULONG    DetectFilter( SfxMedium& rMedium, const SfxFilter** ppFilter,
                                    SfxFilterFlags nMust, SfxFilterFlags nDont );
    static ULONG    GlobDetectFilter( SfxMedium& rMedium, const SfxFilter** ppFilter,
                                    SfxFilterFlags nMust, SfxFilterFlags nDont );

    static sal_Bool RegisterFrameLoaders( void* pServiceManager, void* pRegistryKey );
    static void*    CreateFrameLoader( const sal_Char* pImplementationName, void* pServiceManager, void *pRegistryKey );
};

//-------------------------------------------------------------------------

class SwModuleDummy : public SfxModule

/*  [Description]

    This tricky class keeps pointers to the SvFactories while
    the DLL isn`t loaded. A pointer to the one instance is available
    through SXX_MOD() (shared-lib-app-data).
*/

{
public:
    virtual ~SwModuleDummy();
    TYPEINFO();
                    // SvFactory name convention:
                    // 'p' + SfxObjectShell-subclass + 'Factory'
    SotFactory*     pSwDocShellFactory;
    SotFactory*     pSwWebDocShellFactory;
    SotFactory*     pSwGlobalDocShellFactory;

                    SwModuleDummy( ResMgr *pResMgr, BOOL bDummy,
                                    SotFactory* pFact,
                                    SotFactory* pWebFact,
                                    SotFactory* pGlobalFact )
                    :   SfxModule(pResMgr, bDummy,
                                (SfxObjectFactory*)pFact,
                                (SfxObjectFactory*)pWebFact,
                                (SfxObjectFactory*)pGlobalFact, 0L),
                        pSwDocShellFactory( pFact ),
                        pSwWebDocShellFactory( pWebFact ),
                        pSwGlobalDocShellFactory( pGlobalFact )
                    {}

    virtual SfxModule* Load();

    static SvGlobalName GetID(USHORT nFileFormat);
    static USHORT       HasID(const SvGlobalName& rName);
};

//-------------------------------------------------------------------------

#define SW_DLL() ( *(SwModuleDummy**) GetAppData(SHL_WRITER) )

#endif

diff --git a/sw/inc/swerror.h b/sw/inc/swerror.h
new file mode 100644
index 0000000..36656092
--- /dev/null
+++ b/sw/inc/swerror.h
@@ -0,0 +1,151 @@
/*************************************************************************
 *
 *  $RCSfile: swerror.h,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:28 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _SWSWERROR_H
#define _SWSWERROR_H

#ifndef _ERRCODE_HXX
#include <tools/errcode.hxx>
#endif

#define ERROR_SW_BASE           (ERRCODE_AREA_SW)
#define ERROR_SW_READ_BASE      (ERROR_SW_BASE | ERRCODE_CLASS_READ)
#define ERROR_SW_WRITE_BASE     (ERROR_SW_BASE | ERRCODE_CLASS_WRITE)

#define WARN_SW_BASE            (ERRCODE_AREA_SW | ERRCODE_WARNING_MASK)
#define WARN_SW_READ_BASE       (WARN_SW_BASE | ERRCODE_CLASS_READ )
#define WARN_SW_WRITE_BASE      (WARN_SW_BASE | ERRCODE_CLASS_WRITE )


// Import Fehler
#define ERR_SWG_FILE_FORMAT_ERROR       (ERROR_SW_READ_BASE | 1 )
#define ERR_SWG_READ_ERROR              (ERROR_SW_READ_BASE | 2 )

#define ERR_SW6_INPUT_FILE              (ERROR_SW_READ_BASE | 4 )
#define ERR_SW6_NOWRITER_FILE           (ERROR_SW_READ_BASE | 5 )
#define ERR_SW6_UNEXPECTED_EOF          (ERROR_SW_READ_BASE | 6 )
#define ERR_SW6_PASSWD                  (ERROR_SW_READ_BASE | 7 )

#define ERR_WW6_NO_WW6_FILE_ERR         (ERROR_SW_READ_BASE | 8 )
#define ERR_WW6_FASTSAVE_ERR            (ERROR_SW_READ_BASE | 9 )

#define ERR_W4W_WRITE_TMP_ERROR         (ERROR_SW_READ_BASE | 10 )
#define ERR_EXCLOT_WRONG_RANGE          (ERROR_SW_READ_BASE | 11 )

#define ERR_FORMAT_ROWCOL               (ERROR_SW_READ_BASE | 12)

#define ERR_SWG_NEW_VERSION             (ERROR_SW_READ_BASE | 13)
#define ERR_WW8_NO_WW8_FILE_ERR         (ERROR_SW_READ_BASE | 14)

// Export Fehler
#define ERR_SWG_WRITE_ERROR             (ERROR_SW_WRITE_BASE | 30 )
#define ERR_SWG_OLD_GLOSSARY            (ERROR_SW_WRITE_BASE | 31 )
#define ERR_SWG_CANNOT_WRITE            (ERROR_SW_WRITE_BASE | 32 )
#define ERR_W4W_READ_TMP_ERROR          (ERROR_SW_WRITE_BASE | 33 )
#define ERR_SWG_LARGE_DOC_ERROR         (ERROR_SW_WRITE_BASE | 34 )

// Import/Export Fehler
#define ERR_SWG_INTERNAL_ERROR          (ERROR_SW_BASE  | 50 )

#define ERR_W4W_MEM                     (ERROR_SW_BASE  | 51 )
#define ERR_W4W_WRITE_FULL              (ERROR_SW_BASE  | 52 )
#define ERR_W4W_INTERNAL_ERROR          (ERROR_SW_BASE  | 53 )
#define ERR_W4W_DLL_ERROR               (ERROR_SW_BASE  | 54 )

#define ERR_TXTBLOCK_NEWFILE_ERROR      (ERROR_SW_BASE|ERRCODE_CLASS_LOCKING | 55 )

// weitere Fehler und Fehlerklassen
#define ERR_AUTOPATH_ERROR              (ERROR_SW_BASE|ERRCODE_CLASS_PATH | 55 )
#define ERR_TBLSPLIT_ERROR              (ERROR_SW_BASE|ERRCODE_CLASS_NONE| 56 )
#define ERR_TBLINSCOL_ERROR             (ERROR_SW_BASE|ERRCODE_CLASS_NONE| 57 )
#define ERR_TBLDDECHG_ERROR             (ERROR_SW_BASE|ERRCODE_CLASS_NONE| 58 )

// ----- Warnings ---------------------------

// Import - Warnings
#define WARN_SWG_NO_DRAWINGS            (WARN_SW_READ_BASE | 70 )
#define WARN_WW6_FASTSAVE_ERR           (WARN_SW_READ_BASE | 71 )

// Import & Export - Warnings
#define WARN_SWG_FEATURES_LOST          (WARN_SW_BASE | 72 )
#define WARN_SWG_OLE                    (WARN_SW_BASE | 73 )
#define WARN_SWG_POOR_LOAD              (WARN_SW_BASE | 74 )

// Export warnings
#define WARN_SWG_HTML_NO_MACROS         (WARN_SW_WRITE_BASE |75)

#ifndef __RSC

inline FASTBOOL IsWarning( ULONG nErr )
{
    return 0 != ( nErr & ERRCODE_WARNING_MASK & nErr );
}

inline FASTBOOL IsError( ULONG nErr )
{
    return nErr && 0 == ( ERRCODE_WARNING_MASK & nErr );
}

#endif


#endif

diff --git a/sw/inc/swevent.hxx b/sw/inc/swevent.hxx
new file mode 100644
index 0000000..2dc79cb
--- /dev/null
+++ b/sw/inc/swevent.hxx
@@ -0,0 +1,151 @@
/*************************************************************************
 *
 *  $RCSfile: swevent.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:28 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _SWEVENT_HXX
#define _SWEVENT_HXX

// #include *****************************************************************

#ifndef _SOLAR_H
#include <tools/solar.h>
#endif

#ifndef _SFX_HRC
#include <sfx2/sfx.hrc>
#endif

#define     SW_EVENT_OBJECT_SELECT        ( EVENT_APP_START + 0 )
#define     SW_EVENT_START_INS_GLOSSARY   ( EVENT_APP_START + 1 )
#define     SW_EVENT_END_INS_GLOSSARY     ( EVENT_APP_START + 2 )
#define     SW_EVENT_MAIL_MERGE           ( EVENT_APP_START + 3 )
#define     SW_EVENT_FRM_KEYINPUT_ALPHA   ( EVENT_APP_START + 4 )
#define     SW_EVENT_FRM_KEYINPUT_NOALPHA ( EVENT_APP_START + 5 )
#define     SW_EVENT_FRM_RESIZE           ( EVENT_APP_START + 6 )
#define     SW_EVENT_FRM_MOVE             ( EVENT_APP_START + 7 )
#define     SW_EVENT_PAGE_COUNT           ( EVENT_APP_START + 8 )


class SwFrmFmt;
class SwFmtINetFmt;
class IMapObject;

// enum fuer Objecte die Events ins Basic oder in JavaScript Callen
enum SwCallEventObjectType
{
    EVENT_OBJECT_NONE = 0,          // Null ist garnichts
    EVENT_OBJECT_IMAGE,
    EVENT_OBJECT_INETATTR,
    EVENT_OBJECT_URLITEM,
    EVENT_OBJECT_IMAGEMAP
};

// structur fuer den Austausch zwischen UI/CORE

struct SwCallMouseEvent
{
    SwCallEventObjectType eType;
    union
    {
        // EVENT_OBJECT_IMAGE/EVENT_OBJECT_URLITEM
        const SwFrmFmt* pFmt;

        // EVENT_OBJECT_INETATTR
        const SwFmtINetFmt* pINetAttr;

        // EVENT_OBJECT_IMAGEMAP
        struct
        {
            const SwFrmFmt* pFmt;
            const IMapObject* pIMapObj;
        } IMAP;
    } PTR;

    SwCallMouseEvent()
        : eType( EVENT_OBJECT_NONE )
        { PTR.pFmt = 0; PTR.IMAP.pIMapObj = 0; }

    void Set( SwCallEventObjectType eTyp, const SwFrmFmt* pFmt )
        { eType = eTyp; PTR.pFmt = pFmt; PTR.IMAP.pIMapObj = 0; }

    void Set( const SwFrmFmt* pFmt, const IMapObject* pIMapObj )
        { eType = EVENT_OBJECT_IMAGEMAP; PTR.pFmt = pFmt; PTR.IMAP.pIMapObj = pIMapObj; }

    void Set( const SwFmtINetFmt* pINetAttr )
        { eType = EVENT_OBJECT_INETATTR; PTR.pINetAttr = pINetAttr; PTR.IMAP.pIMapObj = 0; }

    int operator==( const SwCallMouseEvent& rEvent ) const
        {
            return eType == rEvent.eType &&
                    PTR.pFmt == rEvent.PTR.pFmt &&
                    PTR.IMAP.pIMapObj == rEvent.PTR.IMAP.pIMapObj;
        }
    int operator!=( const SwCallMouseEvent& rEvent ) const
        {   return !( *this == rEvent );    }

    void Clear()
        { eType = EVENT_OBJECT_NONE; PTR.pFmt = 0; PTR.IMAP.pIMapObj = 0; }

    BOOL HasEvent() const { return EVENT_OBJECT_NONE != eType; }
};


#endif

diff --git a/sw/inc/swgstr.hxx b/sw/inc/swgstr.hxx
new file mode 100644
index 0000000..0887529
--- /dev/null
+++ b/sw/inc/swgstr.hxx
@@ -0,0 +1,190 @@
/*************************************************************************
 *
 *  $RCSfile: swgstr.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:28 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _SWGSTR_HXX
#define _SWGSTR_HXX

#ifndef _STREAM_HXX //autogen
#include <tools/stream.hxx>
#endif

typedef long long3;                     // Zur Dokumentation: 3-byte-Longs

#define MAX_BEGIN 64                    // Maximale Blockschachtelung
#define PASSWDLEN 16                    // Maximale Passwortlaenge

// Neue Version mit SvStreams

// Passwort- und Codierungs-Funktionalitaet

class swcrypter {
protected:
    sal_Char   cPasswd[ PASSWDLEN ];    // Passwort-Puffer
    BOOL   bPasswd;                     // TRUE wenn mit Passwort
    void   encode( sal_Char*, USHORT ); // Puffer codieren/decodieren
public:
    swcrypter();
    BOOL setpasswd( const String& );    // Passwort setzen
    void copypasswd( const sal_Char* ); // Passwort direkt setzen
    const sal_Char* getpasswd() { return cPasswd; }
};

// Reader/Writer-Stream-Basisklasse mit Pufferverwaltung fuer Texte
// und Spezial-I/O fuer 3-Byte-Longs

class swstreambase : public swcrypter {
protected:
    SvStream* pStrm;                    // eigentlicher Stream
    sal_Char*  pBuf;                        // Zwischenpuffer
    USHORT nBuflen;                     // Laenge des Zwischenpuffers
    short  nLong;                       // Long-Laenge (3 oder 4)
    BOOL   bTempStrm;                   // TRUE: Stream loeschen
    void   checkbuf( USHORT );          // Testen der Pufferlaenge

    swstreambase( SvStream& );

    swstreambase( const swstreambase& );
    int operator=( const swstreambase& );
public:
    ~swstreambase();
    SvStream& Strm()                    { return *pStrm; }
    void clear();                       // Puffer loeschen
    sal_Char* GetBuf()                  { return pBuf; }

    // Zusatzfunktionen zur I/O von LONGs als 3-Byte-Zahlen

    void long3()                        { nLong = 3; }
    void long4()                        { nLong = 4; }

    void sync( swstreambase& r )        { pStrm->Seek( r.tell() ); }

    // Alias- und Hilfsfunktionen

    void seek( long nPos )              { pStrm->Seek( nPos );  }
    long tell()                         { return pStrm->Tell(); }
    long filesize();                    // Dateigroesse
    void flush()                        { pStrm->Flush(); }

    void setbad();
    int good()                          { return ( pStrm->GetError() == SVSTREAM_OK ); }
    int bad()                           { return ( pStrm->GetError() != SVSTREAM_OK ); }
    int operator!()                     { return ( pStrm->GetError() != SVSTREAM_OK ); }
    int eof()                           { return pStrm->IsEof(); }

    BYTE get();
    void get( void* p, USHORT n )       { pStrm->Read( (sal_Char*) p, n ); }

    inline swstreambase& operator>>( sal_Char& );
    inline swstreambase& operator>>( BYTE& );
    inline swstreambase& operator>>( short& );
    inline swstreambase& operator>>( USHORT& );
           swstreambase& operator>>( long& );
    inline swstreambase& operator>>( ULONG& );
};

inline swstreambase& swstreambase::operator>>( sal_Char& c )
{
    *pStrm >> c; return *this;
}

inline swstreambase& swstreambase::operator>>( BYTE& c )
{
    *pStrm >> c; return *this;
}

inline swstreambase& swstreambase::operator>>( short& c )
{
    *pStrm >> c; return *this;
}

inline swstreambase& swstreambase::operator>>( USHORT& c )
{
    *pStrm >> c; return *this;
}

inline swstreambase& swstreambase::operator>>( ULONG& c )
{
    return *this >> (long&) c;
}

class swistream : public swstreambase {
    BYTE   cType;                       // Record-Typ
    ULONG  nOffset;                     // Record-Offset-Portion
public:
    swistream( SvStream& );

    BYTE peek();                        // 1 Byte testen
    BYTE next();                        // Blockstart
    BYTE cur() { return cType; }        // aktueller Block
    BYTE skipnext();                    // Record ueberspringen
    void undonext();                    // next() rueckgaengig machen
    long getskip()                      { return nOffset; }
    void skip( long = -1L );            // Block ueberspringen
    sal_Char* text();                   // Textstring lesen (nach BEGIN)
    long size();                        // aktuelle Record-Laenge

private:
    swistream( const swistream& );
    int operator=( const swistream& );
};


#endif
diff --git a/sw/inc/swhints.hxx b/sw/inc/swhints.hxx
new file mode 100644
index 0000000..721857b
--- /dev/null
+++ b/sw/inc/swhints.hxx
@@ -0,0 +1,72 @@
/*************************************************************************
 *
 *  $RCSfile: swhints.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:28 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef SW_HINTS_HXX
#define SW_HINTS_HXX

#ifndef _SFXSMPLHINT_HXX //autogen
#include <svtools/smplhint.hxx>
#endif

#define SW_BROADCASTID_START            SFX_HINT_USER00
#define SW_BROADCAST_DRAWVIEWS_CREATED  SW_BROADCASTID_START


#endif
diff --git a/sw/inc/swmodule.hxx b/sw/inc/swmodule.hxx
new file mode 100644
index 0000000..5fecd2c
--- /dev/null
+++ b/sw/inc/swmodule.hxx
@@ -0,0 +1,303 @@
/*************************************************************************
 *
 *  $RCSfile: swmodule.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:28 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWMODULE_HXX
#define _SWMODULE_HXX


#ifndef _LINK_HXX //autogen
#include <tools/link.hxx>
#endif
#ifndef _SFXMODULE_HXX //autogen
#include <sfx2/module.hxx>
#endif

#ifndef _SFXLSTNER_HXX //autogen
#include <svtools/lstner.hxx>
#endif
#ifndef SW_SWDLL_HXX
#include <swdll.hxx>
#endif
#include "shellid.hxx"
#ifndef _STRING_HXX
#include <tools/string.hxx>
#endif
#ifndef _COM_SUN_STAR_LINGUISTIC_XDICTIONARYLISTEVENTLISTENER_HPP_
#include <com/sun/star/linguistic/XDictionaryListEventListener.hpp>
#endif

class SvStringsDtor;
class Color;
class AuthorCharAttr;
class SfxItemSet;
class SfxRequest;
class SfxErrorHandler;
class SwSrcViewConfig;
class SwModuleOptions;
class SwMasterUsrPref;
class SwViewOption;
class SwView;
class SwWrtShell;
class SwPrintOptions;
class SwAutoFmtOpt;
class SwChapterNumRules;
class SwStdFontConfig;
class SwNavigationConfig;
class SwDataExchange;
class SwToolbarConfigItem;
class SwAttrPool;
#define VIEWOPT_DEST_VIEW       0
#define VIEWOPT_DEST_TEXT       1
#define VIEWOPT_DEST_WEB        2
#define VIEWOPT_DEST_VIEW_ONLY  3 //ViewOptions werden nur an der ::com::sun::star::sdbcx::View, nicht an der Appl. gesetzt

namespace com{ namespace sun{ namespace star{ namespace scanner{
    class XScannerManager;
}}}}

class SwModule: public SwModuleDummy , public SfxListener
{
    String              sActAuthor;

    // ConfigItems
    SwSrcViewConfig*    pSrcViewConfig;
    SwModuleOptions*    pModuleConfig;
    SwMasterUsrPref*    pUsrPref;
    SwMasterUsrPref*    pWebUsrPref;
    SwPrintOptions*     pPrtOpt;
    SwPrintOptions*     pWebPrtOpt;
    SwChapterNumRules*  pChapterNumRules;
    SwStdFontConfig*    pStdFontConfig;
    SwNavigationConfig* pNavigationConfig;
    SwToolbarConfigItem*pToolbarConfig;     //fr gestackte Toolbars, welche
    SwToolbarConfigItem*pWebToolbarConfig;  //war sichtbar?

    SfxErrorHandler*    pErrorHdl;

    SwAttrPool          *pAttrPool;

    // Die aktuelle ::com::sun::star::sdbcx::View wird hier gehalten um nicht ueber
    // GetActiveView arbeiten zu muessen
    // Die ::com::sun::star::sdbcx::View ist solange gueltig bis Sie im Activate
    // zerstoert oder ausgetauscht wird
    SwView*             pView;

    // Liste aller Redline-Autoren
    SvStringsDtor*      pAuthorNames;

    // DictionaryList listener to trigger spellchecking or hyphenation
    ::com::sun::star::uno::Reference< ::com::sun::star::linguistic::XDictionaryListEventListener >  xDicListEvtListener;
    ::com::sun::star::uno::Reference< ::com::sun::star::scanner::XScannerManager >                  m_xScannerManager;

    sal_Bool                bAuthorInitialised : 1;
    sal_Bool                bEmbeddedLoadSave : 1;

    virtual void    FillStatusBar( StatusBar& );

    // Hint abfangen fuer DocInfo
    virtual void        Notify( SfxBroadcaster& rBC, const SfxHint& rHint );

protected:
    // Briefumschlaege, Etiketten
    void                InsertEnv();
    void                InsertLab(sal_Bool bLabel);

public:
    TYPEINFO();
    SFX_DECL_INTERFACE(SW_INTERFACE_MODULE);

    // dieser Ctor nur fuer SW-Dll
    SwModule( SvFactory* pFact,
                SvFactory* pWebFact,
                    SvFactory* pGlobalFact );
    // dieser Ctor nur fuer Web-Dll
    SwModule( SvFactory* pWebFact );

    ~SwModule();

    virtual SfxModule* Load();

    // ::com::sun::star::sdbcx::View setzen nur fuer internen Gebrauch,
    // aus techn. Gruenden public
    //
    inline  void        SetView(SwView* pVw) { pView = pVw; }
    inline  SwView*     GetView() { return pView; }

    //Die Handler fuer die Slots
    void                StateOther(SfxItemSet &);   // andere
    void                StateViewOptions(SfxItemSet &);
    void                StateIsView(SfxItemSet &);

    void                ExecOther(SfxRequest &);    // Felder, Formel ..
    void                ExecViewOptions(SfxRequest &);
    void                ExecWizzard(SfxRequest &);
    void                ExecDB(SfxRequest &);       // DBManager

    // Benutzereinstellungen modifizieren
    const SwMasterUsrPref *GetUsrPref(sal_Bool bWeb);
    const SwViewOption* GetViewOption(sal_Bool bWeb);
    void                MakeUsrPref( SwViewOption &rToFill, sal_Bool bWeb ) const;
    void                ApplyUsrPref(const SwViewOption &, SwView*,
                                     sal_uInt16 nDest = VIEWOPT_DEST_VIEW );

    // ConfigItems erzeugen
    SwSrcViewConfig*    GetSourceViewConfig();
    SwModuleOptions*    GetModuleConfig()       { return pModuleConfig;}
    SwPrintOptions*     GetPrtOptions(sal_Bool bWeb);
    SwChapterNumRules*  GetChapterNumRules();
    SwStdFontConfig*    GetStdFontConfig()      { return pStdFontConfig; }
    SwNavigationConfig* GetNavigationConfig();
    SwToolbarConfigItem*GetToolbarConfig()      { return pToolbarConfig;    }
    SwToolbarConfigItem*GetWebToolbarConfig()   { return pWebToolbarConfig; }

    // UNO
//  virtual Reflection* GetReflection( UsrUik aUIK );

    // Ueber Sichten iterieren
    static SwView*      GetFirstView();
    static SwView*      GetNextView(SwView*);

    sal_Bool IsEmbeddedLoadSave() const         { return bEmbeddedLoadSave; }
    void SetEmbeddedLoadSave( sal_Bool bFlag )  { bEmbeddedLoadSave = bFlag; }


    // Public Data
    //
    SwDataExchange*     pClipboard;
    SwDataExchange*     pDragDrop;

    void ShowDBObj(SwWrtShell& rShell, const String& rDBName, sal_Bool bShowError = sal_False);

    // Tabellenmodi
    sal_Bool                IsInsTblFormatNum(sal_Bool bHTML) const;
    sal_Bool                IsInsTblChangeNumFormat(sal_Bool bHTML) const;
    sal_Bool                IsInsTblAlignNum(sal_Bool bHTML) const;

    // Redlining
    sal_uInt16              GetRedlineAuthor();
    sal_uInt16              GetRedlineAuthorCount();
    const String&       GetRedlineAuthor(sal_uInt16 nPos);
    sal_uInt16              InsertRedlineAuthor(const String& rAuthor);

    void                GetInsertAuthorAttr(sal_uInt16 nAuthor, SfxItemSet &rSet);
    void                GetDeletedAuthorAttr(sal_uInt16 nAuthor, SfxItemSet &rSet);
    void                GetFormatAuthorAttr(sal_uInt16 nAuthor, SfxItemSet &rSet);

    const AuthorCharAttr&   GetInsertAuthorAttr() const;
    const AuthorCharAttr&   GetDeletedAuthorAttr() const;
    const AuthorCharAttr&   GetFormatAuthorAttr() const;

    sal_uInt16              GetRedlineMarkPos();
    const Color&        GetRedlineMarkColor();

    // returne den definierten DocStat - WordDelimiter
    const String&       GetDocStatWordDelim() const;

    // Durchreichen der Metric von der ModuleConfig (fuer HTML-Export)
    sal_uInt16 GetMetric( sal_Bool bWeb ) const;

    // Update-Stati durchreichen
    sal_uInt16 GetLinkUpdMode( sal_Bool bWeb ) const;
    sal_uInt16 GetFldUpdateFlags( sal_Bool bWeb ) const;

    //virtuelle Methoden fuer den Optionendialog
    virtual SfxItemSet*  CreateItemSet( sal_uInt16 nId );
    virtual void         ApplyItemSet( sal_uInt16 nId, const SfxItemSet& rSet );
    virtual SfxTabPage*  CreateTabPage( sal_uInt16 nId, Window* pParent, const SfxItemSet& rSet );

    //hier wird der Pool angelegt und an der SfxShell gesetzt
    void    InitAttrPool();
    //Pool loeschen bevor es zu spaet ist
    void    RemoveAttrPool();

    // Invalidiert ggf. OnlineSpell-WrongListen
    void    CheckSpellChanges( sal_Bool bOnlineSpelling,
                    sal_Bool bIsSpellWrongAgain, sal_Bool bIsSpellAllAgain );

    inline ::com::sun::star::uno::Reference< ::com::sun::star::linguistic::XDictionaryListEventListener >   GetDicListEvtListener();
    inline void SetDicListEvtListener(::com::sun::star::uno::Reference< ::com::sun::star::linguistic::XDictionaryListEventListener >  xLstnr);

    ::com::sun::star::uno::Reference< ::com::sun::star::scanner::XScannerManager >  GetScannerManager() const {return m_xScannerManager;}

};


inline ::com::sun::star::uno::Reference< ::com::sun::star::linguistic::XDictionaryListEventListener >   SwModule::GetDicListEvtListener()
{
    return xDicListEvtListener;
}

inline void SwModule::SetDicListEvtListener(::com::sun::star::uno::Reference< ::com::sun::star::linguistic::XDictionaryListEventListener >  xLstnr)
{
    xDicListEvtListener = xLstnr;
}


/*-----------------08.07.97 10.33-------------------
    Zugriff auf das SwModule, die ::com::sun::star::sdbcx::View und die Shell
--------------------------------------------------*/

#define SW_MOD() ( *(SwModule**) GetAppData(SHL_WRITER))
SwView*     GetActiveView();
SwWrtShell* GetActiveWrtShell();



#endif
diff --git a/sw/inc/swpre.mk b/sw/inc/swpre.mk
new file mode 100644
index 0000000..55cb472
--- /dev/null
+++ b/sw/inc/swpre.mk
@@ -0,0 +1,85 @@
#*************************************************************************
#
#   $RCSfile: swpre.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:28 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************


#======================================================================
# standardmaessig mit Optimierung, muss explizit mit nopt=t ausgeschaltet
# werden, wenn nicht gewuenscht
#----------------------------------------------------------------------

.IF "$(nopt)"!="" || "$(NOPT)"!=""
nopt=true
NOPT=TRUE
optimize=
OPTIMIZE=
.ELSE
.IF "$(debug)$(DEBUG)"==""
optimize=true
OPTIMIZE=TRUE
.ENDIF
.ENDIF

# falls dependencies auf s:\solver\... erstellt werden sollen
# MKDEPENDSOLVER=YES
PROJECTPCH4DLL=TRUE


diff --git a/sw/inc/swprtopt.hxx b/sw/inc/swprtopt.hxx
new file mode 100644
index 0000000..7128fd1e
--- /dev/null
+++ b/sw/inc/swprtopt.hxx
@@ -0,0 +1,131 @@
/*************************************************************************
 *
 *  $RCSfile: swprtopt.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:28 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _SWPRTOPT_HXX
#define _SWPRTOPT_HXX

#ifndef _SV_MULTISEL_HXX //autogen
#include <tools/multisel.hxx>
#endif

#define POSTITS_NONE    0
#define POSTITS_ONLY    1
#define POSTITS_ENDDOC  2
#define POSTITS_ENDPAGE 3

class SwPrtOptions
{
    USHORT nJobNo;
    String sJobName;

public:
    SwPrtOptions( const String& rJobName ) : aOffset( Point(0,0) ),
        nMergeCnt( 0 ), nMergeAct( 0 ), sJobName( rJobName ),
        nJobNo( 1 )
    {}

    const String& MakeNextJobName();        // steht in vprint.cxx
    const String& GetJobName() const    { return sJobName; }

#if defined(TCPP)
    // seit neuestem (SV 223) kann der keinen mehr generieren
    inline  SwPrtOptions(const SwPrtOptions& rNew) {*this = rNew;}
#endif

    MultiSelection  aMulti;
    Point  aOffset;
    ULONG  nMergeCnt;           // Anzahl der Serienbriefe
    ULONG  nMergeAct;           // Aktueller Serienbriefnr.
    USHORT nCopyCount;
    USHORT nPrintPostIts;
    BOOL   bPrintGraph,         //Grafiken/OLE Drucken
           bPrintTable,         //Tabellen Drucken
           bPrintDraw,          //Zeichenobjekte Drucken
           bPrintControl,       //Controls Drucken
           bPrintLeftPage,
           bPrintRightPage,
           bPrintReverse,
           bPaperFromSetup,
           bCollate,
           bPrintSelection,     // Markierung drucken
           bPrintPageBackground,
           bPrintBlackFont,
           bSinglePrtJobs,
           bJobStartet;
};


#endif //_SWPRTOPT_HXX















diff --git a/sw/inc/swrect.hxx b/sw/inc/swrect.hxx
new file mode 100644
index 0000000..1abad52
--- /dev/null
+++ b/sw/inc/swrect.hxx
@@ -0,0 +1,370 @@
/*************************************************************************
 *
 *  $RCSfile: swrect.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:28 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWRECT_HXX
#define _SWRECT_HXX

#include "errhdl.hxx"

#ifndef _GEN_HXX //autogen
#include <tools/gen.hxx>
#endif
class SvStream;


class SwRect
{
    long nX;
    long nY;
    long nWidth;
    long nHeight;

public:
    inline SwRect();
    inline SwRect( const SwRect &rRect );
    inline SwRect( const Point& rLT, const Size&  rSize );
    inline SwRect( const Point& rLT, const Point& rRB );
    inline SwRect( long X, long Y, long Width, long Height );

        //SV-SS z.B. SwRect( pWin->GetClipRect() );
    SwRect( const Rectangle &rRect );

    //Set-Methoden
    inline void Chg( const Point& rNP, const Size &rNS );
    inline void Pos(  const Point& rNew );
    inline void Pos( const long nNewX, const long nNewY );
    inline void SSize( const Size&  rNew  );
    inline void SSize( const long nHeight, const long nWidth );
    inline void Width(  long nNew );
    inline void Height( long nNew );
    inline void Left( const long nLeft );
    inline void Right( const long nRight );
    inline void Top( const long nTop );
    inline void Bottom( const long nBottom );

    //Get-Methoden
    inline const Point &Pos()  const;
    inline const Size  &SSize() const;
    inline long Width()  const;
    inline long Height() const;
    inline long Left()   const;
    inline long Right()  const;
    inline long Top()    const;
    inline long Bottom() const;

    //Damit Layoutseitig per Memberpointer auf die Member von Pos und SSize
    //zugegriffen werden kann.
    inline Point &Pos();
    inline Size  &SSize();

    Point Center() const;

    void Justify();

           SwRect &Union( const SwRect& rRect );
           SwRect &Intersection( const SwRect& rRect );
   //Wie Intersection nur wird davon ausgegangen, dass die Rects ueberlappen!
           SwRect &_Intersection( const SwRect &rRect );
    inline SwRect  GetUnion( const SwRect& rRect ) const;
    inline SwRect  GetIntersection( const SwRect& rRect ) const;

           BOOL IsInside( const Point& rPOINT ) const;
           BOOL IsNear(const Point& rPoint, long nTolerance ) const;
           BOOL IsInside( const SwRect& rRect ) const;
           BOOL IsOver( const SwRect& rRect ) const;
    inline BOOL HasArea() const;
    inline BOOL IsEmpty() const;
    inline void Clear();

    inline SwRect &operator = ( const SwRect &rRect );

    inline BOOL operator == ( const SwRect& rRect ) const;
    inline BOOL operator != ( const SwRect& rRect ) const;

    inline SwRect &operator+=( const Point &rPt );
    inline SwRect &operator-=( const Point &rPt );

    inline SwRect &operator+=( const Size &rSz );
    inline SwRect &operator-=( const Size &rSz );

    //SV-SS z.B. pWin->DrawRect( aSwRect.SVRect() );
    inline Rectangle  SVRect() const;

    //Zortech wuerde hier fehlerhaften Code erzeugen.
//  inline operator SRectangle()  const;
//  inline operator Rectangle() const { return Rectangle( aPos, aSize ); }

    // Ausgabeoperator fuer die Debugging-Gemeinde
    friend SvStream &operator<<( SvStream &rStream, const SwRect &rRect );
};

// Implementation in in swrect.cxx
extern SvStream &operator<<( SvStream &rStream, const SwRect &rRect );



//---------------------------------- Set-Methoden
inline void SwRect::Chg( const Point& rNP, const Size &rNS )
{
    nX      = rNP.X();      nY      = rNP.Y();
    nWidth  = rNS.Width();  nHeight = rNS.Height();
}
inline void SwRect::Pos(  const Point& rNew )
{
    nX = rNew.X(); nY = rNew.Y();
}
inline void SwRect::Pos( const long nNewX, const long nNewY )
{
    nX = nNewX; nY = nNewY;
}
inline void SwRect::SSize( const Size&  rNew  )
{
    nWidth = rNew.Width(); nHeight = rNew.Height();
}
inline void SwRect::SSize( const long nNewHeight, const long nNewWidth )
{
    nWidth = nNewWidth; nHeight = nNewHeight;
}
inline void SwRect::Width(  long nNew )
{
    nWidth = nNew;
}
inline void SwRect::Height( long nNew )
{
    nHeight = nNew;
}
inline void SwRect::Left( const long nLeft )
{
    nWidth += nX - nLeft;
    nX = nLeft;
}
inline void SwRect::Right( const long nRight )
{
    nWidth = nRight - nX + 1;
}
inline void SwRect::Top( const long nTop )
{
    nHeight += nY - nTop;
    nY = nTop;
}
inline void SwRect::Bottom( const long nBottom )
{
    nHeight = nBottom - nY + 1;
}

//----------------------------------- Get-Methoden
inline const Point &SwRect::Pos()  const
{
    return *(Point*)(&nX);
}
inline Point &SwRect::Pos()
{
    return *(Point*)(&nX);
}
inline const Size  &SwRect::SSize() const
{
    return *(Size*)(&nWidth);
}
inline Size  &SwRect::SSize()
{
    return *(Size*)(&nWidth);
}
inline long SwRect::Width()  const
{
    return nWidth;
}
inline long SwRect::Height() const
{
    return nHeight;
}
inline long SwRect::Left()   const
{
    return nX;
}
inline long SwRect::Right()  const
{
    return nWidth ? nX + nWidth - 1 : nX;
}
inline long SwRect::Top()    const
{
    return nY;
}
inline long SwRect::Bottom() const
{
    return nHeight ? nY + nHeight - 1 : nY;
}

//----------------------------------- operatoren
inline SwRect &SwRect::operator = ( const SwRect &rRect )
{
    nX = rRect.Left();
    nY = rRect.Top();
    nWidth  = rRect.Width();
    nHeight = rRect.Height();
    return *this;
}
inline BOOL SwRect::operator == ( const SwRect& rRect ) const
{
    return (nX      == rRect.Left()  &&
            nY      == rRect.Top()   &&
            nWidth  == rRect.Width() &&
            nHeight == rRect.Height());
}
inline BOOL SwRect::operator != ( const SwRect& rRect ) const
{
    return (nX      != rRect.Left()  ||
            nY      != rRect.Top()   ||
            nWidth  != rRect.Width() ||
            nHeight != rRect.Height());
}

inline SwRect &SwRect::operator+=( const Point &rPt )
{
    nX += rPt.X(); nY += rPt.Y();
    return *this;
}
inline SwRect &SwRect::operator-=( const Point &rPt )
{
    nX -= rPt.X(); nY -= rPt.Y();
    return *this;
}

inline SwRect &SwRect::operator+=( const Size &rSz )
{
    nWidth += rSz.Width(); nHeight += rSz.Height();
    return *this;
}
inline SwRect &SwRect::operator-=( const Size &rSz )
{
    nWidth -= rSz.Width(); nHeight -= rSz.Height();
    return *this;
}


//--------------------------- Sonstiges
inline Rectangle SwRect::SVRect() const
{
    ASSERT( nWidth && nHeight, "SVRect() ohne Widht oder Height" );
    return Rectangle( nX, nY,
                      nX + nWidth - 1,      //Right()
                      nY + nHeight - 1 );   //Bottom()
}

inline SwRect SwRect::GetUnion( const SwRect& rRect ) const
{
    return SwRect( *this ).Union( rRect );
}
inline SwRect SwRect::GetIntersection( const SwRect& rRect ) const
{
    return SwRect( *this ).Intersection( rRect );
}

inline BOOL SwRect::HasArea() const
{
    return nHeight && nWidth;
}
inline BOOL SwRect::IsEmpty() const
{
    return !(nHeight && nWidth);
}
inline void SwRect::Clear()
{
    nX = nY = nWidth = nHeight = 0;
}

//-------------------------- CToren
inline SwRect::SwRect() :
    nX( 0 ),
    nY( 0 ),
    nWidth ( 0 ),
    nHeight( 0 )
{
}
inline SwRect::SwRect( const SwRect &rRect ) :
    nX( rRect.Left() ),
    nY( rRect.Top()  ),
    nWidth ( rRect.Width()  ),
    nHeight( rRect.Height() )
{
}
inline SwRect::SwRect( const Point& rLT, const Size&  rSize ) :
    nX( rLT.X() ),
    nY( rLT.Y() ),
    nWidth ( rSize.Width() ),
    nHeight( rSize.Height())
{
}
inline SwRect::SwRect( const Point& rLT, const Point& rRB ) :
    nX( rLT.X() ),
    nY( rLT.Y() ),
    nWidth ( rRB.X() - rLT.X() + 1 ),
    nHeight( rRB.Y() - rLT.Y() + 1 )
{
}
inline SwRect::SwRect( long X, long Y, long Width, long Height ) :
    nX( X ),
    nY( Y ),
    nWidth ( Width ),
    nHeight( Height )
{
}


#endif  //_SWRECT_HXX
diff --git a/sw/inc/swregion.hxx b/sw/inc/swregion.hxx
new file mode 100644
index 0000000..ac61ff81
--- /dev/null
+++ b/sw/inc/swregion.hxx
@@ -0,0 +1,93 @@
/*************************************************************************
 *
 *  $RCSfile: swregion.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:28 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWREGION_HXX
#define _SWREGION_HXX

#ifndef _SVARRAY_HXX //autogen
#include <svtools/svarray.hxx>
#endif

#include "swrect.hxx"

SV_DECL_VARARR( SwRects, SwRect, 20, 8 );

class SwRegionRects : public SwRects
{
    SwRect aOrigin; // die Kopie des StartRects

    inline void InsertRect( const SwRect &rRect, const USHORT nPos, FASTBOOL &rDel);

public:
    SwRegionRects( const SwRect& rStartRect, USHORT nInit = 20,
                                             USHORT nGrow = 8 );
    // Zum Ausstanzen aus aOrigin.
    void operator-=( const SwRect& rRect );

    // Aus Loechern werden Flaechen, aus Flaechen werden Loecher.
    void Invert();
    // Benachbarte Rechtecke zusammenfassen.
    void Compress( BOOL bFuzzy = TRUE );

    inline const SwRect &GetOrigin() const { return aOrigin; }
    inline void ChangeOrigin( const SwRect &rRect ) { aOrigin = rRect; }
};

#endif  //_SWREGION_HXX
diff --git a/sw/inc/swserv.hxx b/sw/inc/swserv.hxx
new file mode 100644
index 0000000..5e5a511
--- /dev/null
+++ b/sw/inc/swserv.hxx
@@ -0,0 +1,129 @@
/*************************************************************************
 *
 *  $RCSfile: swserv.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:28 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _SWSERV_HXX
#define _SWSERV_HXX

#ifndef _PSEUDO_HXX //autogen
#include <so3/pseudo.hxx>
#endif

class SwBookmark;
class SwSectionNode;
class SwBaseLink;
class SwTableNode;
struct SwPosition;
class SwPaM;

class SwServerObject : public SvPseudoObject
{
protected:
    enum ServerModes { BOOKMARK_SERVER, TABLE_SERVER, SECTION_SERVER, NONE_SERVER } eType;
    union {
        SwBookmark* pBkmk;
        SwTableNode* pTblNd;
        SwSectionNode* pSectNd;
    } CNTNT_TYPE;

    SwServerObject();

public:
    SwServerObject( SwBookmark& rBookmark )
        : eType( BOOKMARK_SERVER )
    {
        CNTNT_TYPE.pBkmk = &rBookmark;
    }
    SwServerObject( SwTableNode& rTableNd )
        : eType( TABLE_SERVER )
    {
        CNTNT_TYPE.pTblNd = &rTableNd;
    }
    SwServerObject( SwSectionNode& rSectNd )
        : eType( SECTION_SERVER )
    {
        CNTNT_TYPE.pSectNd = &rSectNd;
    }
    virtual ~SwServerObject();

    virtual BOOL GetData( SvData* );
    virtual BOOL ChangeData( SvData& );

    ULONG GetSelectorCount() const
        { return SvPseudoObject::GetSelectorCount(); }

    virtual void SendDataChanged( const SwPosition& rPos );
    virtual void SendDataChanged( const SwPaM& rRange );

    BOOL IsLinkInServer( const SwBaseLink* ) const;

    void SetNoServer()
        {  CNTNT_TYPE.pBkmk = 0, eType = NONE_SERVER; }
};

#ifndef SW_DECL_SWSERVEROBJECT_DEFINED
#define SW_DECL_SWSERVEROBJECT_DEFINED
class SvPseudoObject;
SO2_DECL_REF( SwServerObject )
#endif


#endif  // _SWSERV_HXX

diff --git a/sw/inc/swstyle.h b/sw/inc/swstyle.h
new file mode 100644
index 0000000..cc80cf1
--- /dev/null
+++ b/sw/inc/swstyle.h
@@ -0,0 +1,75 @@
/*************************************************************************
 *
 *  $RCSfile: swstyle.h,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:28 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWSTYLE_H
#define _SWSTYLE_H


#define SWSTYLEBIT_TEXT           0x0001
#define SWSTYLEBIT_CHAPTER        0x0002
#define SWSTYLEBIT_LIST           0x0004
#define SWSTYLEBIT_IDX            0x0008
#define SWSTYLEBIT_EXTRA          0x0010
#define SWSTYLEBIT_HTML           0x0020
#define SWSTYLEBIT_CONDCOLL       0x0040


#endif

diff --git a/sw/inc/swtable.hxx b/sw/inc/swtable.hxx
new file mode 100644
index 0000000..23ea03e
--- /dev/null
+++ b/sw/inc/swtable.hxx
@@ -0,0 +1,393 @@
/*************************************************************************
 *
 *  $RCSfile: swtable.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:28 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWTABLE_HXX
#define _SWTABLE_HXX

#ifndef _SVMEMPOOL_HXX //autogen
#include <tools/mempool.hxx>
#endif
#ifndef _SO2REF_HXX //autogen
#include <so3/so2ref.hxx>
#endif
#ifndef _SVARRAY_HXX //autogen
#include <svtools/svarray.hxx>
#endif
#ifndef _TBLENUM_HXX
#include <tblenum.hxx>
#endif
#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _CALBCK_HXX
#include <calbck.hxx>
#endif
#ifndef _SWRECT_HXX
#include <swrect.hxx>
#endif

#ifdef PRODUCT
#ifndef _NODE_HXX
#include <node.hxx>         // fuer StartNode->GetMyIndex
#endif
#else
class SwStartNode;
#endif

class Color;
class SwFrmFmt;
class SwTableFmt;
class SwTableLineFmt;
class SwTableBoxFmt;
class SwHTMLTableLayout;
class SwTableLine;
class SwTableBox;
class SwTableNode;
class SwTabCols;
class SwDoc;
class SwSelBoxes;
class SwTblCalcPara;
class SwChartLines;
struct SwPosition;
class SwNodeIndex;
class SfxPoolItem;
class SchMemChart;
class SwUndoTblMerge;
class SwUndo;
class SwTableBox_Impl;
class SwUndoTblCpyTbl;

#ifndef SW_DECL_SWSERVEROBJECT_DEFINED
#define SW_DECL_SWSERVEROBJECT_DEFINED
class SvPseudoObject;
SO2_DECL_REF( SwServerObject )
#endif

SV_DECL_PTRARR_DEL(SwTableLines, SwTableLine*, 10, 20);
SV_DECL_PTRARR_DEL(SwTableBoxes, SwTableBox*, 25, 50);

// speicher die Inhaltstragenden Box-Pointer zusaetzlich in einem
// sortierten Array (fuers rechnen in der Tabelle)
typedef SwTableBox* SwTableBoxPtr;
SV_DECL_PTRARR_SORT( SwTableSortBoxes, SwTableBoxPtr, 25, 50 );

class SwTable: public SwClient           //Client vom FrmFmt
{
protected:
    SwTableLines aLines;
    SwTableSortBoxes aSortCntBoxes;
    SwServerObjectRef refObj;   // falls DataServer -> Pointer gesetzt

    SwHTMLTableLayout *pHTMLLayout;

//SOLL das fuer jede Tabelle einstellbar sein?
    TblChgMode   eTblChgMode;

    USHORT       nGrfsThatResize;   // Anzahl der Grfs, die beim HTML-Import
                                    // noch ein Resize der Tbl. anstossen

    BOOL         bModifyLocked  :1;
    BOOL         bHeadlineRepeat:1;

    BOOL IsModifyLocked(){ return bModifyLocked;}

public:
    TYPEINFO();

    SwTable( SwTableFmt* );
    SwTable( const SwTable& rTable );       // kein Copy der Lines !!
    ~SwTable();

    SwHTMLTableLayout *GetHTMLTableLayout() { return pHTMLLayout; }
    const SwHTMLTableLayout *GetHTMLTableLayout() const { return pHTMLLayout; }
    void SetHTMLTableLayout( SwHTMLTableLayout *p );    //Eigentumsuebergang!

    USHORT IncGrfsThatResize() { return ++nGrfsThatResize; }
    USHORT DecGrfsThatResize() { return nGrfsThatResize ? --nGrfsThatResize : 0; }

    void LockModify()   { bModifyLocked = TRUE; }   //Muessen _immer_ paarig
    void UnlockModify() { bModifyLocked = FALSE;}   //benutzt werden!

    BOOL IsHeadlineRepeat() const { return bHeadlineRepeat; }
    void SetHeadlineRepeat( BOOL bSet ) { bHeadlineRepeat = bSet; }

          SwTableLines &GetTabLines() { return aLines; }
    const SwTableLines &GetTabLines() const { return aLines; }

    SwFrmFmt* GetFrmFmt()       { return (SwFrmFmt*)pRegisteredIn; }
    SwFrmFmt* GetFrmFmt() const { return (SwFrmFmt*)pRegisteredIn; }

    virtual void Modify( SfxPoolItem* pOld, SfxPoolItem* pNew );

    void GetTabCols( SwTabCols &rToFill, const SwTableBox *pStart,
                     FASTBOOL bHidden = FALSE ) const;
    void SetTabCols( const SwTabCols &rNew, SwTabCols &rOld,
                     const SwTableBox *pStart, BOOL bCurRowOnly );

    BOOL InsertCol( SwDoc*, const SwSelBoxes& rBoxes,
                    USHORT nCnt = 1, BOOL bBehind = TRUE );
    BOOL InsertRow( SwDoc*, const SwSelBoxes& rBoxes,
                    USHORT nCnt = 1, BOOL bBehind = TRUE );
    BOOL AppendRow( SwDoc* pDoc, USHORT nCnt = 1 );
    BOOL DeleteSel( SwDoc*, const SwSelBoxes& rBoxes, SwUndo* pUndo = 0,
                            const BOOL bDelMakeFrms = TRUE,
                            const BOOL bCorrBorder = TRUE );
    BOOL SplitRow( SwDoc* pDoc, const SwSelBoxes& rBoxes, USHORT nCnt=1 );
    BOOL SplitCol( SwDoc* pDoc, const SwSelBoxes& rBoxes, USHORT nCnt=1 );
    BOOL Merge( SwDoc* pDoc, const SwSelBoxes& rBoxes,
                SwTableBox* pMergeBox, SwUndoTblMerge* = 0 );

          SwTableSortBoxes& GetTabSortBoxes()       { return aSortCntBoxes; }
    const SwTableSortBoxes& GetTabSortBoxes() const { return aSortCntBoxes; }

        // gebe den Zellnamen zu der angebenen Row/Col zurueck. Das ist
        // nur fuer ausgeglichene Tabellen interessant, weil diese keine
        // "Sub"Boxen kennen. Es wird z.B. aus (0,0) ein "A1".
    static String GetBoxName( USHORT nRow, USHORT nCol );
        // lese die 1. Nummer und loesche sie aus dem String
        // (wird von GetTblBox und SwTblFld benutzt)
    static USHORT _GetBoxNum( String& rStr, BOOL bFirst = FALSE );
        // suche die Inhaltstragende Box mit dem Namen
    const SwTableBox* GetTblBox( const String& rName ) const;
        // kopiere die selektierten Boxen in ein anderes Dokument.
    BOOL MakeCopy( SwDoc*, const SwPosition&, const SwSelBoxes&,
                    BOOL bCpyNds = TRUE, BOOL bCpyName = FALSE ) const;
        // kopiere die Tabelle in diese. (die Logik steht im TBLRWCL.CXX)
    BOOL InsTable( const SwTable& rCpyTbl, const SwNodeIndex&,
                    SwUndoTblCpyTbl* pUndo = 0 );
    BOOL InsTable( const SwTable& rCpyTbl, const SwSelBoxes&,
                    SwUndoTblCpyTbl* pUndo = 0 );
        // kopiere die Headline (mit Inhalt!) der Tabelle in eine andere
    BOOL CopyHeadlineIntoTable( SwTableNode& rTblNd );

        // erfrage die Box, dessen Start-Index auf nBoxStt steht
          SwTableBox* GetTblBox( ULONG nSttIdx );
    const SwTableBox* GetTblBox( ULONG nSttIdx ) const
                        {   return ((SwTable*)this)->GetTblBox( nSttIdx );  }

    // returnt TRUE wenn sich in der Tabelle Verschachtelungen befinden
    BOOL IsTblComplex() const;

    //returnt TRUE wenn die Tabelle oder Selektion ausgeglichen ist
    BOOL IsTblComplexForChart( const String& rSel,
                                SwChartLines* pGetCLines = 0  ) const;

    // suche alle Inhaltstragenden-Boxen der Grundline in der diese Box
    // steht. rBoxes auch als Return-Wert, um es gleich weiter zu benutzen
    //JP 31.01.97: bToTop = TRUE -> hoch bis zur Grundline,
    //                      FALSE-> sonst nur die Line der Box
    SwSelBoxes& SelLineFromBox( const SwTableBox* pBox,
                            SwSelBoxes& rBoxes, BOOL bToTop = TRUE ) const;
        // erfrage vom Client Informationen
    virtual BOOL GetInfo( SfxPoolItem& ) const;

        // suche im Format nach der angemeldeten Tabelle
    static SwTable* FindTable( SwFrmFmt* pFmt );

        // Struktur ein wenig aufraeumen
    void GCLines();
        // BorderLine ein wenig aufraeumen
    void GCBorderLines();

    SwTableNode* GetTableNode() const;

        // Daten Server-Methoden
    void SetRefObject( SvPseudoObject* );
    const SwServerObject* GetObject() const     {  return &refObj; }
          SwServerObject* GetObject()           {  return &refObj; }
    BOOL IsServer() const                       {  return refObj.Is(); }

    //Daten fuer das Chart fuellen.
    SchMemChart *UpdateData( SchMemChart *pData,
                            const String* pSelection = 0 ) const;

    TblChgMode GetTblChgMode() const        { return eTblChgMode; }
    void SetTblChgMode( TblChgMode eMode )  { eTblChgMode = eMode; }

    BOOL SetColWidth( SwTableBox& rAktBox, USHORT eType,
                        SwTwips nAbsDiff, SwTwips nRelDiff, SwUndo** ppUndo );
    BOOL SetRowHeight( SwTableBox& rAktBox, USHORT eType,
                        SwTwips nAbsDiff, SwTwips nRelDiff, SwUndo** ppUndo );
};

class SwTableLine: public SwClient      // Client vom FrmFmt
{
    SwTableBoxes aBoxes;
    SwTableBox *pUpper;

public:
    TYPEINFO();

    SwTableLine( SwTableLineFmt*, USHORT nBoxes, SwTableBox *pUp );
    ~SwTableLine();

          SwTableBoxes &GetTabBoxes() { return aBoxes; }
    const SwTableBoxes &GetTabBoxes() const { return aBoxes; }

          SwTableBox *GetUpper() { return pUpper; }
    const SwTableBox *GetUpper() const { return pUpper; }
    void SetUpper( SwTableBox *pNew ) { pUpper = pNew; }


    SwFrmFmt* GetFrmFmt()       { return (SwFrmFmt*)pRegisteredIn; }
    SwFrmFmt* GetFrmFmt() const { return (SwFrmFmt*)pRegisteredIn; }

    //Macht ein eingenes FrmFmt wenn noch mehr Lines von ihm abhaengen.
    SwFrmFmt* ClaimFrmFmt();
    void ChgFrmFmt( SwTableLineFmt* pNewFmt );

    // suche nach der naechsten/vorherigen Box mit Inhalt
    SwTableBox* FindNextBox( const SwTable&, const SwTableBox* =0,
                            BOOL bOvrTblLns=TRUE ) const;
    SwTableBox* FindPreviousBox( const SwTable&, const SwTableBox* =0,
                            BOOL bOvrTblLns=TRUE ) const;

    SwRect GetLineRect( const BOOL bPrtArea = FALSE ) const;
};

class SwTableBox: public SwClient       //Client vom FrmFmt
{
    friend class SwNodes;           // um den Index umzusetzen !
    friend void DelBoxNode(SwTableSortBoxes&);  // um den StartNode* zu loeschen !
    friend class SwXMLTableContext;

    //nicht (mehr) implementiert.
    SwTableBox( const SwTableBox & );

    SwTableLines aLines;
    const SwStartNode * pSttNd;
    SwTableLine *pUpper;
    SwTableBox_Impl* pImpl;

    SwTableBox &operator=( const SwTableBox &); //gibts nicht.
    // falls das Format schon Formeln/Values enthaelt, muss ein neues
    // fuer die neue Box erzeugt werden.
    SwTableBoxFmt* CheckBoxFmt( SwTableBoxFmt* );

public:
    TYPEINFO();

    SwTableBox( SwTableBoxFmt*, USHORT nLines, SwTableLine *pUp = 0 );
    SwTableBox( SwTableBoxFmt*, const SwStartNode&, SwTableLine *pUp = 0 );
    SwTableBox( SwTableBoxFmt*, const SwNodeIndex&, SwTableLine *pUp = 0 );
    ~SwTableBox();

          SwTableLines &GetTabLines() { return aLines; }
    const SwTableLines &GetTabLines() const { return aLines; }

          SwTableLine *GetUpper() { return pUpper; }
    const SwTableLine *GetUpper() const { return pUpper; }
    void SetUpper( SwTableLine *pNew ) { pUpper = pNew; }

    SwFrmFmt* GetFrmFmt()       { return (SwFrmFmt*)pRegisteredIn; }
    SwFrmFmt* GetFrmFmt() const { return (SwFrmFmt*)pRegisteredIn; }

    //Macht ein eingenes FrmFmt wenn noch mehr Boxen von ihm abhaengen.
    SwFrmFmt* ClaimFrmFmt();
    void ChgFrmFmt( SwTableBoxFmt *pNewFmt );

    const SwStartNode *GetSttNd() const { return pSttNd; }
    ULONG GetSttIdx() const
#ifdef PRODUCT
        { return pSttNd ? pSttNd->GetIndex() : 0; }
#else
        ;
#endif

    // suche nach der naechsten/vorherigen Box mit Inhalt
    SwTableBox* FindNextBox( const SwTable&, const SwTableBox* =0,
                            BOOL bOvrTblLns=TRUE ) const;
    SwTableBox* FindPreviousBox( const SwTable&, const SwTableBox* =0,
                            BOOL bOvrTblLns=TRUE ) const;
    // gebe den Namen dieser Box zurueck. Dieser wird dynamisch bestimmt
    // und ergibt sich aus der Position in den Lines/Boxen/Tabelle
    String GetName() const;
    // gebe den "Wert" der Box zurueck (fuers rechnen in der Tabelle)
    double GetValue( SwTblCalcPara& rPara ) const;

    BOOL IsInHeadline( const SwTable* pTbl = 0 ) const;

    // enthaelt die Box Inhalt, der als Nummer formatiert werden kann?
    BOOL HasNumCntnt( double& rNum, ULONG& rFmtIndex,
                    BOOL& rIsEmptyTxtNd ) const;
    ULONG IsValidNumTxtNd( BOOL bCheckAttr = TRUE ) const;
    // teste ob der BoxInhalt mit der Nummer uebereinstimmt, wenn eine
    // Tabellenformel gesetzt ist. (fuers Redo des Change vom NumFormat!)
    BOOL IsNumberChanged() const;

    // ist das eine FormelBox oder eine Box mit numerischen Inhalt (AutoSum)
    // Was es ist, besagt der ReturnWert - die WhichId des Attributes
    // Leere Boxen haben den ReturnWert USHRT_MAX !!
    USHORT IsFormulaOrValueBox() const;

    // fuers Laden - tauscht bei Value Zellen den Inhalt aus, falls sie
    // fuer die Sprache System formatiert sind.
    void ChgByLanguageSystem();

    DECL_FIXEDMEMPOOL_NEWDEL(SwTableBox)

    // zugriff auf interne Daten - z.Z. benutzt fuer den NumFormatter
    inline const Color* GetSaveUserColor()  const;
    inline const Color* GetSaveNumFmtColor() const;
    inline void SetSaveUserColor(const Color* p );
    inline void SetSaveNumFmtColor( const Color* p );
};

#endif  //_SWTABLE_HXX
diff --git a/sw/inc/swtblfmt.hxx b/sw/inc/swtblfmt.hxx
new file mode 100644
index 0000000..559db74
--- /dev/null
+++ b/sw/inc/swtblfmt.hxx
@@ -0,0 +1,135 @@
/*************************************************************************
 *
 *  $RCSfile: swtblfmt.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:28 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWTBLFMT_HXX
#define _SWTBLFMT_HXX

#ifndef _FRMFMT_HXX
#include <frmfmt.hxx>
#endif

class SwDoc;

class SwTableFmt : public SwFrmFmt
{
    friend class SwDoc;

protected:
    SwTableFmt( SwAttrPool& rPool, const sal_Char* pFmtNm,
                    SwFrmFmt *pDrvdFrm )
        : SwFrmFmt( rPool, pFmtNm, pDrvdFrm, RES_FRMFMT, aTableSetRange )
    {}
    SwTableFmt( SwAttrPool& rPool, const String &rFmtNm,
                    SwFrmFmt *pDrvdFrm )
        : SwFrmFmt( rPool, rFmtNm, pDrvdFrm, RES_FRMFMT, aTableSetRange )
    {}


public:
    TYPEINFO();     //Bereits in Basisklasse Client drin.

    DECL_FIXEDMEMPOOL_NEWDEL(SwTableFmt)
};

class SwTableLineFmt : public SwFrmFmt
{
    friend class SwDoc;

protected:
    SwTableLineFmt( SwAttrPool& rPool, const sal_Char* pFmtNm,
                    SwFrmFmt *pDrvdFrm )
        : SwFrmFmt( rPool, pFmtNm, pDrvdFrm, RES_FRMFMT, aTableLineSetRange )
    {}
    SwTableLineFmt( SwAttrPool& rPool, const String &rFmtNm,
                    SwFrmFmt *pDrvdFrm )
        : SwFrmFmt( rPool, rFmtNm, pDrvdFrm, RES_FRMFMT, aTableLineSetRange )
    {}

public:
    TYPEINFO();     //Bereits in Basisklasse Client drin.

    DECL_FIXEDMEMPOOL_NEWDEL(SwTableLineFmt)
};

class SwTableBoxFmt : public SwFrmFmt
{
    friend class SwDoc;

protected:
    SwTableBoxFmt( SwAttrPool& rPool, const sal_Char* pFmtNm,
                    SwFrmFmt *pDrvdFrm )
        : SwFrmFmt( rPool, pFmtNm, pDrvdFrm, RES_FRMFMT, aTableBoxSetRange )
    {}
    SwTableBoxFmt( SwAttrPool& rPool, const String &rFmtNm,
                    SwFrmFmt *pDrvdFrm )
        : SwFrmFmt( rPool, rFmtNm, pDrvdFrm, RES_FRMFMT, aTableBoxSetRange )
    {}

public:
    TYPEINFO();     //Bereits in Basisklasse Client drin.

    // zum Erkennen von Veraenderungen (haupts. TableBoxAttribute)
    virtual void Modify( SfxPoolItem* pOldValue, SfxPoolItem* pNewValue );

    DECL_FIXEDMEMPOOL_NEWDEL(SwTableBoxFmt)
};


#endif
diff --git a/sw/inc/swtypes.hxx b/sw/inc/swtypes.hxx
new file mode 100644
index 0000000..7feecac
--- /dev/null
+++ b/sw/inc/swtypes.hxx
@@ -0,0 +1,298 @@
/*************************************************************************
 *
 *  $RCSfile: swtypes.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:28 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWTYPES_HXX
#define _SWTYPES_HXX

#ifndef _SOLAR_H
#include <tools/solar.h>
#endif
#include <limits.h>     //fuer LONG_MAX

#ifdef PM20
#include <stdlib.h>
#endif
#ifndef _COM_SUN_STAR_UNO_REFERENCE_H_
#include <com/sun/star/uno/Reference.h>
#endif
#ifndef _HORIORNT_HXX
#include <horiornt.hxx>
#endif

// wenn das hier geaendert wird, dann auch im globals.hrc aendern!!!
//#define SW_FILEFORMAT_40 SOFFICE_FILEFORMAT_40

namespace com{namespace sun{namespace star{
    namespace linguistic{
        class XDictionaryList;
        class XSpellChecker1;
        class XHyphenator;
        class XThesaurus;
    }
    namespace beans{
        class XPropertySet;
    }
}}}
class Size;
class MapMode;
class ResMgr;
class UniString;
class ByteString;
class SwPathFinder;
class Graphic;
class OutputDevice;
class CharClass;

typedef long SwTwips;
#define INVALID_TWIPS   LONG_MAX
#define TWIPS_MAX       (LONG_MAX - 1)

#define MM50   283  // 1/2 cm in TWIPS

#define MINFLY 23   //Minimalgroesse fuer FlyFrms
#define MINLAY 23   //Minimalgroesse anderer Frms

// Default-Spaltenabstand zweier Textspalten entspricht 0.3 cm
#define DEF_GUTTER_WIDTH (MM50 / 5 * 3)

//Minimale Distance (Abstand zum Text) fuer das BorderAttribut, damit
//die aligned'en Linien nicht geplaettet werden.
//28 Twips == 0,4mm
#define MIN_BORDER_DIST 28

    /* minimaler Dokmentrand */
const SwTwips lMinBorder = 1134;

//Die Wiesenbreite links neben und ueber dem Dokument.
//Die halbe Wiesenbreite ist der Abstand zwischen den Seiten.
#define DOCUMENTBORDER 568L

//initiale UndoActionCount
#define UNDO_ACTION_COUNT 20

// Konstante Strings
extern UniString aEmptyStr;         // ""
extern ByteString aEmptyByteStr;    // ""
extern UniString aDotStr;           // '.'

extern const sal_Char* __FAR_DATA pDefWordDelim;     // alle Worttrenner
extern const sal_Char* __FAR_DATA pGlosExt;         // def. Ext. fuer AutoText in glosdoc.cxx


//Zum Einfuegen von Beschriftungen (wie bzw. wo soll eingefuegt werden).
//Hier weil ein eigenes hxx nicht lohnt und es sonst nirgendwo so recht
//hinpasst.
enum SwLabelType
{
    LTYPE_TABLE,    //Beschriftung einer Tabelle
    LTYPE_OBJECT,   //Beschriftung von Grafik oder OLE
    LTYPE_FLY,      //Beschriftung eines (Text-)Rahmens
    LTYPE_DRAW      //Beschriftung eines Zeichen-Objektes
};


const BYTE OLD_MAXLEVEL = 5;
const BYTE MAXLEVEL = 10;       //Ehemals numrule.hxx
const BYTE NO_NUM       = 200;  //Ehemals numrule.hxx
const BYTE NO_NUMBERING = 201;  //Ehemals numrule.hxx
const BYTE NO_INIT      = 202;  //Ehemals numrule.hxx

// fuer Absaetze mit NO_NUM aber auf unterschiedlichen Leveln
// DAMIT entfaellt das NO_NUM !!!!
const BYTE NO_NUMLEVEL  = 0x20; // wird mit den Levels verodert


/*
 * Nette Funktionen als MACRO oder inline
 */

/* ein KiloByte sind 1024 Byte */
#define KB 1024

#define SET_CURR_SHELL( shell ) CurrShell aCurr( shell )

// pPathFinder wird von der UI initialisiert. Die Klasse liefert alle
// benoetigten Pfade.
extern SwPathFinder *pPathFinder;

// Werte fuer die Einzuege an der Nummerierung und BulletListe
// (fuer die weiteren Ebenen sind die Werte mit den Ebenen+1 zu
//  multiplizieren; Ebenen 0..4 !!!)
const USHORT lBullIndent = 567 / 2;
const short lBullFirstLineOffset = -567 / 2;
const USHORT lNumIndent = 567 / 2;
const short lNumFirstLineOffset = -567 / 2;


    // Enum um am Doc abzufragen, ob es sich bei dem Namen um einem
    // aus unserem Pool handelt.
enum SwGetPoolIdFromName
{
    GET_POOLID_TXTCOLL  = 0x01,
    GET_POOLID_CHRFMT   = 0x02,
    GET_POOLID_FRMFMT   = 0x04,
    GET_POOLID_PAGEDESC = 0x08,
    GET_POOLID_NUMRULE  = 0x10
};

// Anzahl der SystemField-Types vom SwDoc
#define INIT_FLDTYPES   30
// Anzahl der vordefinierten Seq-Feldtypen. Es handelt sich dabei
// immer um die letzen Felder vor INIT_FLDTYPES
#define INIT_SEQ_FLDTYPES   4

//Die ehemaligen Rendevouz-Ids leben weiter:
//Es gibt Ids fuer die Anker (SwFmtAnchor) und ein paar weitere die nur fuer
//Schnittstellen Bedeutung haben (SwDoc).
enum RndStdIds
{
    FLY_AT_CNTNT,       //Absatzgebundener Rahmen
    FLY_IN_CNTNT,       //Zeichengebundener Rahmen
    FLY_PAGE,           //Seitengebundener Rahmen
    FLY_AT_FLY,         //Rahmengebundener Rahmen ( LAYER_IMPL )
    FLY_AUTO_CNTNT,     //Automatisch positionierter, absatzgebundener Rahmen
                        //Der Rest wird nur fuer SS benutzt.
    RND_STD_HEADER,
    RND_STD_FOOTER,
    RND_STD_HEADERL,
    RND_STD_HEADERR,
    RND_STD_FOOTERL,
    RND_STD_FOOTERR,

    RND_DRAW_OBJECT     // ein Draw-Object !! nur fuer die SwDoc-Schnittstelle!
};


extern ResMgr* pSwResMgr;           // steht in swapp0.cxx
#define SW_RES(i)       ResId(i,pSwResMgr)
#define SW_RESSTR(i)    UniString(ResId(i,pSwResMgr))

#if defined( WIN ) || defined( WNT ) || defined( PM2 )
#define DDE_AVAILABLE
#endif

// SpellChecker, Hyphenator kommen aus der OFA.
//
::com::sun::star::uno::Reference<
    ::com::sun::star::linguistic::XSpellChecker1 >  GetSpellChecker();
::com::sun::star::uno::Reference<
    ::com::sun::star::linguistic::XHyphenator >     GetHyphenator();
::com::sun::star::uno::Reference<
    ::com::sun::star::linguistic::XThesaurus >      GetThesaurus();
::com::sun::star::uno::Reference<
    ::com::sun::star::linguistic::XDictionaryList > GetDictionaryList();
::com::sun::star::uno::Reference<
    ::com::sun::star::beans::XPropertySet >         GetLinguPropertySet();

// reutns the twip size of this graphic
Size GetGraphicSizeTwip( const Graphic&, OutputDevice* pOutDev );


// Seperator fuer Sprunge im Dokument auf verschiedene Inhalttype
const sal_Unicode cMarkSeperator = '|';
extern const sal_Char* __FAR_DATA pMarkToTable;             // Strings stehen
extern const sal_Char* __FAR_DATA pMarkToFrame;             // im Init.cxx
extern const sal_Char* __FAR_DATA pMarkToRegion;
extern const sal_Char* __FAR_DATA pMarkToOutline;
extern const sal_Char* __FAR_DATA pMarkToText;
extern const sal_Char* __FAR_DATA pMarkToGraphic;
extern const sal_Char* __FAR_DATA pMarkToOLE;

#ifndef DB_DELIM                            // Ist in OFA definiert!!!
#define DB_DELIM ((sal_Unicode)0xff)        // Datenbank <-> Tabellen-Trenner
#endif


enum SetAttrMode
{
    SETATTR_DEFAULT         = 0x0000,   // default
    SETATTR_DONTEXPAND      = 0x0001,   // TextAttribute nicht weiter expand.
    SETATTR_DONTREPLACE     = 0x0002,   // kein anderes TextAttrib verdraengen

    SETATTR_NOTXTATRCHR     = 0x0004,   // bei Attr ohne Ende kein 0xFF einfuegen
    SETATTR_NOHINTADJUST    = 0x0008,   // keine Zusammenfassung von Bereichen.
    SETATTR_NOFORMATATTR    = 0x0010,   // nicht zum FormatAttribut umwandeln
    SETATTR_DONTCHGNUMRULE  = 0x0020    // nicht die NumRule veraendern
};

//Umrechnung Twip<-> 1/100 mm fuer UNO

#define TWIP_TO_MM100(TWIP)     ((TWIP) >= 0 ? (((TWIP)*127L+36L)/72L) : (((TWIP)*127L-36L)/72L))
#define MM100_TO_TWIP(MM100)    ((MM100) >= 0 ? (((MM100)*72L+63L)/127L) : (((MM100)*72L-63L)/127L))

#define SW_ISPRINTABLE( c ) ( c >= ' ' && 127 != c )

#ifndef SW_CONSTASCII_DECL
#define SW_CONSTASCII_DECL( n, s ) n[sizeof(s)]
#endif
#ifndef SW_CONSTASCII_DEF
#define SW_CONSTASCII_DEF( n, s ) n[sizeof(s)] = s
#endif


#define CHAR_HARDBLANK      ((sal_Unicode)0x00A0)
#define CHAR_HARDHYPHEN     ((sal_Unicode)0x2011)
#define CHAR_SOFTHYPHEN     ((sal_Unicode)0x00AD)

// returns the APP - CharClass instance - used for all ToUpper/ToLower/...
CharClass& GetAppCharClass();


#endif
diff --git a/sw/inc/swundo.hxx b/sw/inc/swundo.hxx
new file mode 100644
index 0000000..1ee581e
--- /dev/null
+++ b/sw/inc/swundo.hxx
@@ -0,0 +1,197 @@
/*************************************************************************
 *
 *  $RCSfile: swundo.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:28 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWUNDO_HXX
#define _SWUNDO_HXX

// die Ids fuer StdAktionen
enum SwUndoStdId
{
    UNDO_STD_BEGIN = 1,
    UNDO_START = UNDO_STD_BEGIN,            //  1
    UNDO_END,                               //  2
        REPEAT_START,               // alle UndoIds zwischen REPEAT_START und
                                    // REPEAT_END sind Repeat-Faehig !!
    UNDO_DELETE = REPEAT_START,             //  3
    UNDO_INSERT,                            //  4
    UNDO_OVERWRITE,                         //  5
    UNDO_SPLITNODE,                         //  6
    UNDO_INSATTR,                           //  7
    UNDO_SETFMTCOLL,                        //  8
    UNDO_RESETATTR,                         //  9
    UNDO_INSFMTATTR,                        // 10
    UNDO_INSDOKUMENT,                       // 11
    UNDO_COPY,                              // 12
    UNDO_INSTABLE,                          // 13
    UNDO_TABLETOTEXT,                       // 14
    UNDO_TEXTTOTABLE,                       // 15
    UNDO_SORT_TXT,                          // 16
    UNDO_INSLAYFMT,                         // 17
    UNDO_TABLEHEADLINE,                     // 18
    UNDO_INSSECTION,                        // 19
    UNDO_OUTLINE_LR,                        // 20
    UNDO_OUTLINE_UD,                        // 21
    UNDO_INSNUM,                            // 22
    UNDO_NUMUPDOWN,                         // 23
    UNDO_MOVENUM,                           // 24
    UNDO_INSDRAWFMT,                        // 25
    UNDO_NUMORNONUM,                        // 26
    UNDO_INC_LEFTMARGIN,                    // 27
    UNDO_DEC_LEFTMARGIN,                    // 28
    UNDO_INSERTLABEL,                       // 29
    UNDO_SETNUMRULESTART,                   // 30
    UNDO_CHGFTN,                            // 31
    UNDO_REDLINE,                           // 32
    UNDO_ACCEPT_REDLINE,                    // 33
    UNDO_REJECT_REDLINE,                    // 34
    UNDO_SPLIT_TABLE,                       // 35
    UNDO_DONTEXPAND,                        // 36
    UNDO_AUTOCORRECT,                       // 37
    UNDO_MERGE_TABLE,                       // 38

    UNDO_REPEAT_DUMMY_3,                    // 39
    UNDO_REPEAT_DUMMY_4,                    // 40
    UNDO_REPEAT_DUMMY_5,                    // 41
    UNDO_REPEAT_DUMMY_6,                    // 42
    UNDO_REPEAT_DUMMY_7,                    // 43
    UNDO_REPEAT_DUMMY_8,                    // 44
    UNDO_REPEAT_DUMMY_9,                    // 45
    REPEAT_END,

    UNDO_MOVE = REPEAT_END,                 // 46
    UNDO_INSGLOSSARY,                       // 47
    UNDO_DELBOOKMARK,                       // 48
    UNDO_INSBOOKMARK,                       // 49
    UNDO_SORT_TBL,                          // 50
    UNDO_DELLAYFMT,                         // 51
    UNDO_AUTOFORMAT,                        // 52
    UNDO_REPLACE,                           // 53
    UNDO_DELSECTION,                        // 54
    UNDO_CHGSECTION,                        // 55
    UNDO_CHGSECTIONPASSWD,                  // 56
    UNDO_SETDEFTATTR,                       // 57
    UNDO_DELNUM,                            // 58
    UNDO_DRAWUNDO,                          // 59
    UNDO_DRAWGROUP,                         // 60
    UNDO_DRAWUNGROUP,                       // 61
    UNDO_DRAWDELETE,                        // 62
    UNDO_REREAD,                            // 63
    UNDO_DELGRF,                            // 64
    UNDO_DELOLE,                            // 65
    UNDO_TABLE_ATTR,                        // 66
    UNDO_TABLE_AUTOFMT,                     // 67
    UNDO_TABLE_INSCOL,                      // 68
    UNDO_TABLE_INSROW,                      // 69
    UNDO_TABLE_DELBOX,                      // 70
    UNDO_TABLE_SPLIT,                       // 71
    UNDO_TABLE_MERGE,                       // 72
    UNDO_TBLNUMFMT,                         // 73
    UNDO_INSTOX,                            // 74
    UNDO_CLEARTOXRANGE,                     // 75
    UNDO_TBLCPYTBL,                         // 76
    UNDO_CPYTBL,                            // 77
    UNDO_INS_FROM_SHADOWCRSR,               // 78
    UNDO_CHAINE,                            // 79
    UNDO_UNCHAIN,                           // 80
    UNDO_FTNINFO,                           // 81
    UNDO_ENDNOTEINFO,                       // 82
    UNDO_COMPAREDOC,                        // 83
    UNDO_SETFLYFRMFMT,                      // 84

    UNDO_DUMMY_1,                           // 85
    UNDO_DUMMY_2,                           // 86
    UNDO_DUMMY_3,                           // 87
    UNDO_DUMMY_4,                           // 88
    UNDO_DUMMY_5,                           // 89
    UNDO_DUMMY_6,                           // 90
    UNDO_DUMMY_7,                           // 91
    UNDO_DUMMY_8,                           // 92
    UNDO_DUMMY_9,                           // 93
    UNDO_STD_END                            // 94
};


/* MA: 24. May. 97, zur Zeit nicht verwendet.
#define INIT_UNDOIDS 2
#define GROW_UNDOIDS 2
// Das Array der verwendeten Undo-Ids
SV_DECL_VARARR( SwUndoIds, USHORT, INIT_UNDOIDS, GROW_UNDOIDS )
*/

// Undo-Ids fuer die UI-Seite
enum SwUIUndoIds
{
    UIUNDO_REPLACE             =  UNDO_STD_END,
    UIUNDO_INSERT_PAGE_BREAK,
    UIUNDO_INSERT_COLUMN_BREAK,
    UIUNDO_PLAY_MACRO,
    UIUNDO_INSERT_ENVELOPE,
    UIUNDO_DRAG_AND_COPY,
    UIUNDO_DRAG_AND_MOVE,
    UIUNDO_INSERT_RULER,
    UIUNDO_INSERT_CHART,
    UIUNDO_INSERT_FOOTNOTE,
    UIUNDO_INSERT_URLBTN,
    UIUNDO_INSERT_URLTXT,
    UIUNDO_DELETE_INVISIBLECNTNT
};


#endif
diff --git a/sw/inc/swurl.hxx b/sw/inc/swurl.hxx
new file mode 100644
index 0000000..0b107d3
--- /dev/null
+++ b/sw/inc/swurl.hxx
@@ -0,0 +1,84 @@
/*************************************************************************
 *
 *  $RCSfile: swurl.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:28 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWURL_HXX
#define _SWURL_HXX

#ifndef _SOLAR_H
#include <tools/solar.h>
#endif


class UniString;
class ViewShell;

#define URLLOAD_NOFILTER            0x0000
#define URLLOAD_DOWNLOADFILTER      0x0001
#define URLLOAD_CHOOSEFILTER        0x0002
#define URLLOAD_NEWVIEW             0x8000


void LoadURL( const UniString& rName, ViewShell* pSh,
              USHORT nFilter = URLLOAD_NOFILTER,
              const UniString *pTargetFrameName = 0 );



#endif
diff --git a/sw/inc/swwait.hxx b/sw/inc/swwait.hxx
new file mode 100644
index 0000000..73e0093
--- /dev/null
+++ b/sw/inc/swwait.hxx
@@ -0,0 +1,79 @@
/*************************************************************************
 *
 *  $RCSfile: swwait.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:28 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWWAIT_HXX
#define _SWWAIT_HXX

#ifndef _SOLAR_H
#include <tools/solar.h>
#endif

class SwDocShell;

class SwWait
{
    SwDocShell &rDoc;
    BOOL        bLock;
public:
    SwWait( SwDocShell &rDocShell, BOOL bLockDispatcher );
    ~SwWait();
};

#endif
diff --git a/sw/inc/tabcol.hxx b/sw/inc/tabcol.hxx
new file mode 100644
index 0000000..0110e27
--- /dev/null
+++ b/sw/inc/tabcol.hxx
@@ -0,0 +1,121 @@
/*************************************************************************
 *
 *  $RCSfile: tabcol.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:28 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _TABCOL_HXX
#define _TABCOL_HXX

#ifndef _SVSTDARR_HXX
#define _SVSTDARR_LONGS
#define _SVSTDARR_BOOLS
#include <svtools/svstdarr.hxx>
#endif

class SwTabCols : public SvLongs
{
    long nLeftMin,      //Linker aeusserer Rand (Bezugspunkt) in
                        //Dokumentkordinaten.
                        //Alle anderen Werte relativ zu diesem Punkt!
            nLeft,      //Linker Rand der Tabelle.
           nRight,      //Rechter Rand der Tabelle.
           nRightMax;   //Maximaler rechter Rand der Tabelle.



    SvBools aHidden;    //Fuer jeden Eintrag ein Flag, Hidden oder nicht.
                        //Wenn das Flag Hidden TRUE ist liegt der Spalten-
                        //trenner nicht in der aktuellen Zeile; er muss
                        //mit gepflegt werden, darf aber nicht angezeigt
                        //werden.

public:
    SwTabCols( USHORT nSize = 0 );
    SwTabCols( const SwTabCols& );
    SwTabCols &operator=( const SwTabCols& );
    BOOL operator==( const SwTabCols& rCmp ) const;

    BOOL IsHidden( USHORT nPos ) const         { return aHidden[nPos]; }
    void SetHidden( USHORT nPos, BOOL bValue ) { aHidden[nPos] = bValue; }
    inline void InsertHidden( USHORT nPos, BOOL bValue );
    inline void DeleteHidden( USHORT nPos, USHORT nAnz = 1 );

    //fuer den CopyCTor
    const SvBools& GetHidden() const { return aHidden; }

    long GetLeftMin() const { return nLeftMin; }
    long GetLeft()  const { return nLeft;    }
    long GetRight() const { return nRight;   }
    long GetRightMax()const { return nRightMax;}

    void SetLeftMin ( long nNew )   { nLeftMin = nNew; }
    void SetLeft    ( long nNew )   { nLeft = nNew;    }
    void SetRight   ( long nNew )   { nRight = nNew;   }
    void SetRightMax( long nNew )   { nRightMax = nNew;}
};

inline void SwTabCols::InsertHidden( USHORT nPos, BOOL bValue )
{
    aHidden.Insert( bValue, nPos );
}
inline void SwTabCols::DeleteHidden( USHORT nPos, USHORT nAnz )
{
    aHidden.Remove( nPos, nAnz );
}

#endif  //_TABCOL_HXX
diff --git a/sw/inc/tblafmt.hxx b/sw/inc/tblafmt.hxx
new file mode 100644
index 0000000..c0decd5
--- /dev/null
+++ b/sw/inc/tblafmt.hxx
@@ -0,0 +1,383 @@
/*************************************************************************
 *
 *  $RCSfile: tblafmt.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:28 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _TBLAFMT_HXX
#define _TBLAFMT_HXX

/*************************************************************************
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

JP 20.07.95:

    Die akt. Struktur der Autoformatierung darf nicht mehr veraendert werden.
    Diese wird durch unterschiedlichen Code vom StartWriter und vom StarCalc
    eingelesen/geschrieben.
    Sollte sich doch mal eine Aenderung nicht vermeiden lassen, dann auf
    jedenfall in beiden Applikationen aendern.

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
**************************************************************************/

#ifndef _SVARRAY_HXX //autogen
#include <svtools/svarray.hxx>
#endif

#include "hintids.hxx"          //_immmer_ vor den solar-items!

#define ITEMID_HORJUSTIFY   0
#define ITEMID_VERJUSTIFY   0
#define ITEMID_ORIENTATION  0
#define ITEMID_MARGIN       0

#ifndef _SVX_ALGITEM_HXX //autogen
#include <svx/algitem.hxx>
#endif
#ifndef _SVX_FONTITEM_HXX //autogen
#include <svx/fontitem.hxx>
#endif
#ifndef _SVX_FHGTITEM_HXX //autogen
#include <svx/fhgtitem.hxx>
#endif
#ifndef _SVX_WGHTITEM_HXX //autogen
#include <svx/wghtitem.hxx>
#endif
#ifndef _SVX_POSTITEM_HXX //autogen
#include <svx/postitem.hxx>
#endif
#ifndef _SVX_UDLNITEM_HXX //autogen
#include <svx/udlnitem.hxx>
#endif
#ifndef _SVX_CRSDITEM_HXX //autogen
#include <svx/crsditem.hxx>
#endif
#ifndef _SVX_CNTRTITEM_HXX //autogen
#include <svx/cntritem.hxx>
#endif
#ifndef _SVX_SHDDITEM_HXX //autogen
#include <svx/shdditem.hxx>
#endif
#ifndef _SVX_COLRITEM_HXX //autogen
#include <svx/colritem.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _SVX_ADJITEM_HXX //autogen
#include <svx/adjitem.hxx>
#endif
#ifndef _SVX_ROTMODIT_HXX //autogen
#include <svx/rotmodit.hxx>
#endif
#ifndef _SFXINTITEM_HXX //autogen
#include <svtools/intitem.hxx>
#endif

struct SwAfVersions;

class SvNumberFormatter;

class SwBoxAutoFmt
{
    // gemeinsamer Teil von StarCalc und StarWriter
    SvxFontItem         aFont;

    SvxFontHeightItem   aHeight;
    SvxWeightItem       aWeight;
    SvxPostureItem      aPosture;
    SvxUnderlineItem    aUnderline;
    SvxCrossedOutItem   aCrossedOut;
    SvxContourItem      aContour;
    SvxShadowedItem     aShadowed;
    SvxColorItem        aColor;
    SvxBoxItem          aBox;
    SvxBrushItem        aBackground;

    // StarWriter spezifisches
    SvxAdjustItem       aAdjust;

    // StarCalc spezifisches
    SvxHorJustifyItem   aHorJustify;
    SvxVerJustifyItem   aVerJustify;
    SvxOrientationItem  aOrientation;
    SvxMarginItem       aMargin;
    SfxBoolItem         aLinebreak;
    SfxInt32Item        aRotateAngle;
    SvxRotateModeItem   aRotateMode;

        // und als letzes das Zahlenformat fuer die Box
    String              sNumFmtString;
    LanguageType        eSysLanguage, eNumFmtLanguage;

public:
    SwBoxAutoFmt();
    SwBoxAutoFmt( const SwBoxAutoFmt& rNew );
    ~SwBoxAutoFmt();

    int operator==( const SwBoxAutoFmt& rCmp ) const;
    SwBoxAutoFmt& operator=( const SwBoxAutoFmt& rNew );

    // die Get-Methoden
    const SvxFontItem       &GetFont() const        { return aFont; }
    const SvxFontHeightItem &GetHeight() const      { return aHeight; }
    const SvxWeightItem     &GetWeight() const      { return aWeight; }
    const SvxPostureItem    &GetPosture() const     { return aPosture; }
    const SvxUnderlineItem  &GetUnderline() const   { return aUnderline; }
    const SvxCrossedOutItem &GetCrossedOut() const  { return aCrossedOut; }
    const SvxContourItem    &GetContour() const     { return aContour; }
    const SvxShadowedItem   &GetShadowed() const    { return aShadowed; }
    const SvxColorItem      &GetColor() const       { return aColor; }
    const SvxAdjustItem     &GetAdjust() const      { return aAdjust; }
    const SvxBoxItem        &GetBox() const         { return aBox; }
    const SvxBrushItem      &GetBackground() const  { return aBackground; }
    void GetValueFormat( String& rFmt, LanguageType& rLng, LanguageType& rSys ) const
        { rFmt = sNumFmtString; rLng = eNumFmtLanguage; rSys = eSysLanguage; }

    // die SetMethoden
    void SetFont( const SvxFontItem& rNew )             { aFont = rNew; }
    void SetHeight( const SvxFontHeightItem& rNew )     { aHeight = rNew; }
    void SetWeight( const SvxWeightItem& rNew )         { aWeight = rNew; }
    void SetPosture( const SvxPostureItem& rNew )       { aPosture = rNew; }
    void SetUnderline( const SvxUnderlineItem& rNew )   { aUnderline = rNew; }
    void SetCrossedOut( const SvxCrossedOutItem& rNew ) { aCrossedOut = rNew; }
    void SetContour( const SvxContourItem& rNew )       { aContour = rNew; }
    void SetShadowed( const SvxShadowedItem& rNew )     { aShadowed = rNew; }
    void SetColor( const SvxColorItem& rNew )           { aColor = rNew; }
    void SetAdjust( const SvxAdjustItem& rNew )
        {
            aAdjust.SetAdjust( rNew.GetAdjust() );
            aAdjust.SetOneWord( rNew.GetOneWord() );
            aAdjust.SetLastBlock( rNew.GetLastBlock() );
        }
    void SetBox( const SvxBoxItem& rNew )               { aBox = rNew; }
    void SetBackground( const SvxBrushItem& rNew )      { aBackground = rNew; }
    void SetValueFormat( const String& rFmt, LanguageType eLng, LanguageType eSys )
        { sNumFmtString = rFmt; eNumFmtLanguage = eLng; eSysLanguage = eSys; }

    BOOL Load( SvStream& rStream, const SwAfVersions& rVersions, USHORT nVer );
    BOOL Save( SvStream& rStream ) const;
    BOOL SaveVerionNo( SvStream& rStream ) const;

#ifdef READ_OLDVERS
    // lade alte Version
    BOOL LoadOld( SvStream& rStream, USHORT aLoadVer[] );
#endif
};

class SwTableAutoFmt
{
    friend void _FinitCore();       // zum Zerstoeren des dflt. Pointers
    static SwBoxAutoFmt* pDfltBoxAutoFmt;

    String aName;
    USHORT nStrResId;
    BOOL bInclFont : 1;
    BOOL bInclJustify : 1;
    BOOL bInclFrame : 1;
    BOOL bInclBackground : 1;
    BOOL bInclValueFormat : 1;

    // StarCalc Spezifisches
    BOOL bInclWidthHeight : 1;

    SwBoxAutoFmt* aBoxAutoFmt[ 16 ];

public:
    SwTableAutoFmt( const String& rName );
    SwTableAutoFmt( const SwTableAutoFmt& rNew );
    ~SwTableAutoFmt();

    SwTableAutoFmt& operator=( const SwTableAutoFmt& rNew );

    void SetBoxFmt( const SwBoxAutoFmt& rNew, BYTE nPos );
    const SwBoxAutoFmt& GetBoxFmt( BYTE nPos ) const;

    void SetName( const String& rNew ) { aName = rNew; nStrResId = USHRT_MAX; }
    const String& GetName() const { return aName; }

    enum UpdateFlags { UPDATE_CHAR = 1, UPDATE_BOX = 2, UPDATE_ALL = 3 };
    SwBoxAutoFmt& UpdateFromSet( BYTE nPos, const SfxItemSet& rSet,
                                UpdateFlags eFlags, SvNumberFormatter* );
    void UpdateToSet( BYTE nPos, SfxItemSet& rSet, UpdateFlags eFlags,
                        SvNumberFormatter* ) const ;

    BOOL IsFont() const         { return bInclFont; }
    BOOL IsJustify() const      { return bInclJustify; }
    BOOL IsFrame() const        { return bInclFrame; }
    BOOL IsBackground() const   { return bInclBackground; }
    BOOL IsValueFormat() const  { return bInclValueFormat; }
    BOOL IsWidthHeight() const  { return bInclWidthHeight; }

    void SetFont( const BOOL bNew )         { bInclFont = bNew; }
    void SetJustify( const  BOOL bNew )     { bInclJustify = bNew; }
    void SetFrame( const BOOL bNew )        { bInclFrame = bNew; }
    void SetBackground( const BOOL bNew )   { bInclBackground = bNew; }
    void SetValueFormat( const BOOL bNew )  { bInclValueFormat = bNew; }
    void SetWidthHeight( const BOOL bNew )  { bInclWidthHeight = bNew; }

    BOOL Load( SvStream& rStream, const SwAfVersions& );
    BOOL Save( SvStream& rStream ) const;

#ifdef READ_OLDVERS
    // lade alte Version
    BOOL LoadOld( SvStream& rStream, USHORT aLoadVer[] );
#endif
};
typedef SwTableAutoFmt* SwTableAutoFmtPtr ;

SV_DECL_PTRARR_DEL( _SwTableAutoFmtTbl, SwTableAutoFmtPtr, 1, 5 )

class SwTableAutoFmtTbl : public _SwTableAutoFmtTbl
{
    BOOL Load( SvStream& rStream );
    BOOL Save( SvStream& rStream ) const;
public:
    SwTableAutoFmtTbl();

    BOOL Load();
    BOOL Save() const;
};



/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/inc/tblafmt.hxx,v 1.1.1.1 2000-09-18 17:14:28 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.22  2000/09/18 16:03:31  willem.vandorp
      OpenOffice header added.

      Revision 1.21  2000/09/08 13:24:29  willem.vandorp
      Header and footer replaced

      Revision 1.20  1999/10/11 15:23:51  jp
      TableautoFormatnames with resource ids

      Revision 1.19  1998/09/29 08:12:48  NN
      #53381# bei Zahlformat Systemsprache beim Erzeugen mitspeichern


      Rev 1.18   29 Sep 1998 10:12:48   NN
   #53381# bei Zahlformat Systemsprache beim Erzeugen mitspeichern

      Rev 1.17   15 Sep 1998 21:23:02   ER
   #47738# gedrehter Text in Tabellen-AutoFormat

      Rev 1.16   02 Jun 1998 10:35:02   JP
   TabellenAutoFormat: Load/Save ohne Stream - erzeugen diesen selbst

      Rev 1.15   14 May 1998 15:16:48   JP
   neu: Numberformat vom Boxen unterstuetzen

      Rev 1.14   12 May 1998 23:34:52   JP
   neu: Zuweisungsoperator fuer SwTableAutoFmt

      Rev 1.13   04 Sep 1997 09:02:58   MA
   includes

      Rev 1.12   09 Aug 1997 12:45:06   OS
   paraitem/frmitems/textitem aufgeteilt

      Rev 1.11   07 Aug 1997 14:43:12   OM
   Headerfile-Umstellung

      Rev 1.10   24 Jun 1996 18:35:28   MA
   includes

      Rev 1.9   13 Dec 1995 09:55:02   MA
   opt: Bessere Defaults fuer Arrays

      Rev 1.8   11 Dec 1995 13:38:48   HJS
   anpassung fuer unix

      Rev 1.7   30 Nov 1995 20:22:30   JP
   DefaultTblAutoFmt erst auf Bedarf anlegen

      Rev 1.6   31 Jul 1995 10:17:50   AMA
   International-Umstellung wg. Update 253

      Rev 1.5   20 Jul 1995 19:39:48   JP
   Aederung fuer gemeinsamen Import/Export der Tabellen-Autoformatierung von Calc/Writer

      Rev 1.4   10 Jun 1995 16:05:20   JP
   Save/Load nochmals umgestellt

      Rev 1.3   10 Jun 1995 12:51:26   JP
   SwBoxAutoFmt::Load - Load-Version mit geben

      Rev 1.2   06 Mar 1995 05:07:02   JP
   Load & Save als Dummy

      Rev 1.1   04 Mar 1995 20:42:22   JP
   Adjust nachgetragen

      Rev 1.0   04 Mar 1995 15:46:14   JP
   Initial revision.

*************************************************************************/
    // #ifndef _...
#endif
diff --git a/sw/inc/tblenum.hxx b/sw/inc/tblenum.hxx
new file mode 100644
index 0000000..bd08f50
--- /dev/null
+++ b/sw/inc/tblenum.hxx
@@ -0,0 +1,111 @@
/*************************************************************************
 *
 *  $RCSfile: tblenum.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:28 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _TBLENUM_HXX
#define _TBLENUM_HXX

//fuers aendern der Tabellen/Spalten/Zeilen Breiten/Hoehen
enum TblChgWidthHeightType
{
    WH_COL_LEFT,
    WH_COL_RIGHT,
    WH_ROW_TOP,
    WH_ROW_BOTTOM,
    WH_CELL_LEFT,
    WH_CELL_RIGHT,
    WH_CELL_TOP,
    WH_CELL_BOTTOM,


    // folgende koennen hinein verodert werden
    WH_FLAG_INSDEL  = 0x4000,           // Insert/Del-Modus: das Bigger-Flag
                                        // besagt was passiert:
                                        // bBigger -> Box wird entfernt
                                        // !bBigger-> Box wird eingefuegt
    WH_FLAG_BIGGER  = 0x8000            // Box wird groesser -> sonst kleiner
};

enum TblChgMode
{
    TBLFIX_CHGABS,          // Tabelle feste Breite, den Nachbar andern
    TBLFIX_CHGPROP,         // Tabelle feste Breite, alle Nachbarn aendern
    TBLVAR_CHGABS           // Tabelle variable, alle Nachbarn aendern
};


enum SplitTbl_HeadlineOption
{
    HEADLINE_NONE = 0,          // lasse alles wie es ist
    HEADLINE_BORDERCOPY,        // von der davor obere Line der vorhergehen Line
    HEADLINE_CNTNTCOPY,         // kopiere die 1. Line komplett mit Inhalt
    HEADLINE_BOXATTRCOPY,       // kopiere von der 1. Line die Box Attribute
    HEADLINE_BOXATRCOLLCOPY     // kopiere von der 1. Line die Box Attribute
                                // und die Absatzvorlagen
};

enum TableMergeErr
{
    TBLMERGE_OK,
    TBLMERGE_NOSELECTION,
    TBLMERGE_TOOCOMPLEX
};


#endif
diff --git a/sw/inc/tblsel.hxx b/sw/inc/tblsel.hxx
new file mode 100644
index 0000000..e9c471c
--- /dev/null
+++ b/sw/inc/tblsel.hxx
@@ -0,0 +1,269 @@
/*************************************************************************
 *
 *  $RCSfile: tblsel.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:28 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _TBLSEL_HXX
#define _TBLSEL_HXX

#ifndef _SVARRAY_HXX //autogen
#include <svtools/svarray.hxx>
#endif

#ifndef _SWTABLE_HXX
#include <swtable.hxx>
#endif
#ifndef _SWRECT_HXX
#include <swrect.hxx>
#endif

class SwCrsrShell;
class SwCursor;
class SwTableCursor;
class SwFrm;
class SwTabFrm;
class SwTableBox;
class SwTableLine;
class SwLayoutFrm;
class SwPaM;
class SwNode;
class SwTable;
class SwUndoTblMerge;
class SwCellFrm;

SV_DECL_PTRARR( SwCellFrms, SwCellFrm*, 16, 16 )
SV_DECL_PTRARR_SORT( SwSelBoxes, SwTableBoxPtr, 10, 20 )


//Sucht alle Boxen zusammen, die in der Tabelle selektiert sind.
//Je nach enum-Parameter wird die Selektion in der angegebenen Richtung
//erweitert.
//Die Boxen werden ueber das Layout zusammengsucht, es wird auch bei
//aufgespaltenen Tabellen korrekt gearbeitet (siehe: MakeSelUnions()).
enum SwTblSearchType
{
    TBLSEARCH_NONE      = 0x1,       // keine Erweiterung
    TBLSEARCH_ROW       = 0x2,       // erweiter auf Zeilen
    TBLSEARCH_COL       = 0x3,       // erweiter auf Spalten

    // als Flag zu den anderen Werten!!
    TBLSEARCH_PROTECT           = 0x8,      // auch geschuetzte Boxen einsammeln
    TBLSEARCH_NO_UNION_CORRECT  = 0x10      // die zusammenges. Union nicht korrigieren
};

void GetTblSel( const SwCrsrShell& rShell, SwSelBoxes& rBoxes,
                const SwTblSearchType = TBLSEARCH_NONE );

void GetTblSel( const SwCursor& rCrsr, SwSelBoxes& rBoxes,
                const SwTblSearchType = TBLSEARCH_NONE );

//wie vor, jedoch wird nicht von der Selektion sondern von den
//Start- EndFrms ausgegangen.
void GetTblSel( const SwLayoutFrm* pStart, const SwLayoutFrm* pEnd,
                SwSelBoxes& rBoxes, const SwTblSearchType = TBLSEARCH_NONE );

// Desgleichen nocheinmal direkt per PaM's
void GetTblSelCrs( const SwCrsrShell& rShell, SwSelBoxes& rBoxes );
void GetTblSelCrs( const SwTableCursor& rTblCrsr, SwSelBoxes& rBoxes );

// suche fuer eine AutoSumme die beteiligten Boxen zusammen
BOOL GetAutoSumSel( const SwCrsrShell&, SwCellFrms& );

// check if the SelBoxes contains protected Boxes
BOOL HasProtectedCells( const SwSelBoxes& rBoxes );

// teste, ob die Selektion ausgeglichen ist
SV_DECL_PTRARR( SwChartBoxes, SwTableBoxPtr, 16, 16);
SV_DECL_PTRARR_DEL( SwChartLines, SwChartBoxes*, 25, 50);

BOOL ChkChartSel( const SwNode& rSttNd, const SwNode& rEndNd,
                    SwChartLines* pGetCLines = 0 );

// teste ob die Celle in die SSelection gehoert
// (wurde eine Funktion, damit GetTblSel() und MakeTblCrsr() immer
// das "gleiche Verstaendnis" fuer die Selektion haben)
BOOL IsFrmInTblSel( const SwRect& rUnion, const SwFrm* pCell );

// bestimme die Boxen, die zusammen gefasst werden sollen.
// Dabei wird auf Layout Basis das Rechteck "angepasst". D.H. es
// werden Boxen zugefuegt wenn welche an den Seiten ueberlappen
// Zusaetzlich wird die neue Box erzeugt und mit dem entsprechenden
// Inhalt gefuellt.
void GetMergeSel( const SwPaM& rPam, SwSelBoxes& rBoxes,
                  SwTableBox** ppMergeBox, SwUndoTblMerge* pUndo = 0 );

// teste ob die selektierten Boxen ein gueltiges Merge erlauben
USHORT CheckMergeSel( const SwPaM& rPam );
USHORT CheckMergeSel( const SwSelBoxes& rBoxes );

// teste ob ein Split oder InsertCol dazu fuehrt, das eine Box
// kleiner als MINLAY wird.
BOOL CheckSplitCells( const SwCrsrShell& rShell, USHORT nDiv,
                        const SwTblSearchType = TBLSEARCH_NONE );
BOOL CheckSplitCells( const SwCursor& rCrsr, USHORT nDiv,
                        const SwTblSearchType = TBLSEARCH_NONE );

//Fuer das Arbeiten auf TabSelektion auch fuer aufgespaltene Tabellen.
class SwSelUnion
{
    SwRect   aUnion;        //Das die Sel umschliessende Rechteck.
    SwTabFrm *pTable;       //Die (Follow-)Table zu der Union.

public:
    SwSelUnion( const SwRect &rRect, SwTabFrm *pTab ) :
        aUnion( rRect ), pTable( pTab ) {}

    const SwRect&   GetUnion() const { return aUnion; }
          SwRect&   GetUnion()       { return aUnion; }
    const SwTabFrm *GetTable() const { return pTable; }
          SwTabFrm *GetTable()       { return pTable; }
};

SV_DECL_PTRARR_DEL( SwSelUnions, SwSelUnion*, 10, 20 )

//Ermittelt die von einer Tabellenselektion betroffenen Tabellen und die
//Union-Rechteckte der Selektionen - auch fuer aufgespaltene Tabellen.
//Wenn ein Parameter != TBLSEARCH_NONE uebergeben wird, so wird die
//Selektion in der angegebenen Richtung erweitert.
void MakeSelUnions( SwSelUnions&, const SwLayoutFrm *pStart,
                    const SwLayoutFrm *pEnd,
                    const SwTblSearchType = TBLSEARCH_NONE );


// -------------------------------------------------------------------
// Diese Klassen kopieren die aktuelle Tabellen-Selektion (rBoxes)
// unter Beibehaltung der Tabellen-Strubktur in eine eigene Struktur

class _FndBox;
class _FndLine;

SV_DECL_PTRARR_DEL( _FndBoxes, _FndBox*, 10, 20 )
SV_DECL_PTRARR_DEL( _FndLines, _FndLine*,10, 20 )

class _FndBox
{
    SwTableBox* pBox;
    _FndLines aLines;
    _FndLine* pUpper;

    SwTableLine *pLineBefore;   //Zum Loeschen/Restaurieren des Layouts.
    SwTableLine *pLineBehind;

public:
    _FndBox( SwTableBox* pB, _FndLine* pFL ) :
        pBox(pB), pUpper(pFL), pLineBefore( 0 ), pLineBehind( 0 ) {}

    const _FndLines&    GetLines() const    { return aLines; }
        _FndLines&      GetLines()          { return aLines; }
    const SwTableBox*   GetBox() const      { return pBox; }
        SwTableBox*     GetBox()            { return pBox; }
    const _FndLine*     GetUpper() const    { return pUpper; }
        _FndLine*       GetUpper()          { return pUpper; }

    void SetTableLines( const SwSelBoxes &rBoxes, const SwTable &rTable );
    void SetTableLines( const SwTable &rTable );
    void DelFrms ( SwTable &rTable );
    void MakeFrms( SwTable &rTable );
    void MakeNewFrms( SwTable &rTable, const USHORT nNumber,
                                       const BOOL bBehind );
    BOOL AreLinesToRestore( const SwTable &rTable ) const;

    //Auch die Charts zu der Tabelle muessen etwas von den Veraenderungen
    //mitbekommen.
    void SaveChartData( const SwTable &rTable );
    void RestoreChartData( const SwTable &rTable );
};


class _FndLine
{
    SwTableLine* pLine;
    _FndBoxes aBoxes;
    _FndBox* pUpper;
public:
    _FndLine(SwTableLine* pL, _FndBox* pFB=0) : pLine(pL), pUpper(pFB) {}
    const _FndBoxes&    GetBoxes() const    { return aBoxes; }
        _FndBoxes&      GetBoxes()          { return aBoxes; }
    const SwTableLine*  GetLine() const     { return pLine; }
        SwTableLine*    GetLine()           { return pLine; }
    const _FndBox*      GetUpper() const    { return pUpper; }
        _FndBox*        GetUpper()          { return pUpper; }

    void SetUpper( _FndBox* pUp ) { pUpper = pUp; }
};


struct _FndPara
{
    _FndBox* pFndBox;
    _FndLine* pFndLine;
    const SwSelBoxes& rBoxes;

    _FndPara( const SwSelBoxes& rBxs, _FndBox* pFB )
        : rBoxes( rBxs ), pFndBox( pFB ) {}
    _FndPara( const _FndPara& rPara, _FndBox* pFB )
        : rBoxes(rPara.rBoxes), pFndLine(rPara.pFndLine), pFndBox(pFB) {}
    _FndPara( const _FndPara& rPara, _FndLine* pFL )
        : rBoxes(rPara.rBoxes), pFndLine(pFL), pFndBox(rPara.pFndBox) {}
};

BOOL _FndBoxCopyCol( const SwTableBox*& rpBox, void* pPara );
BOOL _FndLineCopyCol( const SwTableLine*& rpLine, void* pPara );


#endif  //  _TBLSEL_HXX
diff --git a/sw/inc/tox.hxx b/sw/inc/tox.hxx
new file mode 100644
index 0000000..d7d1aec
--- /dev/null
+++ b/sw/inc/tox.hxx
@@ -0,0 +1,702 @@
/*************************************************************************
 *
 *  $RCSfile: tox.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:28 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _TOX_HXX
#define _TOX_HXX

#ifndef _SVARRAY_HXX //autogen
#include <svtools/svarray.hxx>
#endif

#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif

#ifndef _SFXPOOLITEM_HXX //autogen
#include <svtools/poolitem.hxx>
#endif

#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _TOXE_HXX
#include <toxe.hxx>
#endif
#ifndef _CALBCK_HXX
#include <calbck.hxx>
#endif
#ifndef _ERRHDL_HXX
#include <errhdl.hxx>
#endif

class SwTOXType;
class SwTOXMark;
class SwTxtTOXMark;
class SwDoc;

SV_DECL_PTRARR(SwTOXMarks, SwTOXMark*, 0, 10)

/*--------------------------------------------------------------------
     Beschreibung:  Eintrag fuer Inhaltsverzeichnis oder Benutzerverz.
 --------------------------------------------------------------------*/

#define IVER_TOXMARK_STRPOOL ((USHORT)1)
#define IVER_TOXMARK_NEWTOX ((USHORT)2)

class SwTOXMark : public SfxPoolItem, public SwClient
{
    friend void _InitCore();
    friend class SwTxtTOXMark;

    String aAltText;    // Der Text des Eintrages ist unterschiedlich
    String aPrimaryKey, aSecondaryKey;

    SwTxtTOXMark* pTxtAttr;

    USHORT  nLevel;
    BOOL    bAutoGenerated : 1;     // generated using a concordance file
    BOOL    bMainEntry : 1;         // main entry emphasized by character style


    SwTOXMark();                    // for crete the dflt. atr. in _InitCore

public:
    TYPEINFO();   // fuers rtti

    SwTOXMark( const SwTOXType* pTyp );
    SwTOXMark( const SwTOXMark& rCopy );
    virtual ~SwTOXMark();

    // "pure virtual Methoden" vom SfxPoolItem
    virtual int             operator==( const SfxPoolItem& ) const;
    virtual SfxPoolItem*    Clone( SfxItemPool* pPool = 0 ) const;
    virtual SfxPoolItem*    Create(SvStream &, USHORT nVer) const;
    virtual SvStream&       Store(SvStream &, USHORT nIVer) const;
    virtual USHORT          GetVersion( USHORT nFFVer ) const;

    SwTOXMark&              operator=( const SwTOXMark& rCopy );
    String                  GetText() const;

    inline BOOL             IsAlternativeText() const;
    inline const String&    GetAlternativeText() const;

    inline void             SetAlternativeText( const String& rAlt );

    // Inhalts-/Benutzerverzeichnis - spezifisch
    inline void             SetLevel(USHORT nLevel);
    inline USHORT           GetLevel() const;

    // Index - spezifisch
    inline void             SetPrimaryKey(const String& rStr );
    inline void             SetSecondaryKey(const String& rStr);
    inline const String&    GetPrimaryKey() const;
    inline const String&    GetSecondaryKey() const;

    BOOL                    IsAutoGenerated() const {return bAutoGenerated;}
    void                    SetAutoGenerated(BOOL bSet) {bAutoGenerated = bSet;}

    BOOL                    IsMainEntry() const {return bMainEntry;}
    void                    SetMainEntry(BOOL bSet) { bMainEntry = bSet;}

    inline const SwTOXType*    GetTOXType() const;

    const SwTxtTOXMark* GetTxtTOXMark() const   { return pTxtAttr; }
          SwTxtTOXMark* GetTxtTOXMark()         { return pTxtAttr; }
};

/*--------------------------------------------------------------------
     Beschreibung:  Typen einzelner Verzeichnisse
 --------------------------------------------------------------------*/

class SwTOXType : public SwModify
{
public:
    SwTOXType(TOXTypes eTyp, const String& aName);
    SwTOXType(const SwTOXType& rCopy);

    inline  const String&   GetTypeName() const;
    void                    SetTypeName(const String& rName);
    inline TOXTypes         GetType() const;

private:
    String          aName;
    TOXTypes        eType;
};

/*--------------------------------------------------------------------
     Beschreibung:  Muster fuer Zeilen eines Verzeichnisses
 --------------------------------------------------------------------*/

#define FORM_TITLE              0
#define FORM_ALPHA_DELIMITTER   1
#define FORM_PRIMARY_KEY        2
#define FORM_SECONDARY_KEY      3
#define FORM_ENTRY              4

/*
 Pattern structure

 <E#> - entry number                    <E# CharStyleName,PoolId>
 <ET> - entry text                      <ET CharStyleName,PoolId>
 <E>  - entry text and number           <E CharStyleName,PoolId>
 <T>  - tab stop                        <T,,Position,Adjust>
 <C>  - chapter info n = {0, 1, 2, 3, 4 } values of SwChapterFormat <C CharStyleName,PoolId>
 <TX> - text token                      <X CharStyleName,PoolId, TOX_STYLE_DELIMITERTextContentTOX_STYLE_DELIMITER>
 <#>  - Page number                     <# CharStyleName,PoolId>
 <LS> - Link start                      <LS>
 <LE> - Link end                        <LE>
 <A00> - Authority entry field          <A02 CharStyleName, PoolId>
 */

// These enum values are stored and must not change!
enum FormTokenType
{
    TOKEN_ENTRY_NO,
    TOKEN_ENTRY_TEXT,
    TOKEN_ENTRY,
    TOKEN_TAB_STOP,
    TOKEN_TEXT,
    TOKEN_PAGE_NUMS,
    TOKEN_CHAPTER_INFO,
    TOKEN_LINK_START,
    TOKEN_LINK_END,
    TOKEN_AUTHORITY,
    TOKEN_END
};

struct SwFormToken
{
    String          sText;
    String          sCharStyleName;
    SwTwips         nTabStopPosition;
    FormTokenType   eTokenType;
    USHORT          nPoolId;
    USHORT          eTabAlign;
    USHORT          nChapterFormat;     //SwChapterFormat;
    USHORT          nAuthorityField;    //enum ToxAuthorityField
    sal_Unicode     cTabFillChar;

    SwFormToken(FormTokenType eType ) :
        eTokenType(eType),
        nTabStopPosition(ULONG_MAX),
        nPoolId(USHRT_MAX),
        eTabAlign(0 /*SVX_TAB_ADJUST_LEFT*/),
        cTabFillChar(' '),
        nChapterFormat(0 /*CF_NUMBER*/),
        nAuthorityField(0)/*AUTH_FIELD_IDENTIFIER*/{}

    String GetString() const;
};

class SwFormTokenEnumerator
{
    String sPattern;
    xub_StrLen nCurPatternPos;
    xub_StrLen nCurPatternLen;

    FormTokenType _SearchNextToken( xub_StrLen nStt, xub_StrLen& rEnd,
                                    xub_StrLen* pTokenLen = 0 ) const;
    SwFormToken BuildToken( FormTokenType, xub_StrLen ) const;

public:
    SwFormTokenEnumerator( const String& rPattern );
    BOOL            HasNextToken() const
        { return nCurPatternPos + nCurPatternLen < sPattern.Len(); }

    SwFormToken     GetNextToken();
    SwFormToken     GetCurToken() const;

    FormTokenType   GetCurTokenType();
    FormTokenType   GetNextTokenType();
    FormTokenType   GetPrevTokenType();
    void            RemoveCurToken();
    void            InsertToken( const SwFormToken& rToken );
    const String&   GetPattern() const      { return sPattern; }
};

class SwForm
{
    String  aPattern[ AUTH_TYPE_END + 1 ];
    String  aTemplate[ AUTH_TYPE_END + 1 ];
    USHORT  nType, nFormMaxLevel;
    //USHORT    nFirstTabPos; -> Value in tab token
//  BOOL    bHasFirstTabPos : 1;
    BOOL    bGenerateTabPos : 1;
    BOOL    bIsRelTabPos : 1;
    BOOL    bCommaSeparated : 1;

public:
    SwForm( USHORT nType = TOX_CONTENT );
    SwForm( const SwForm& rForm );

    SwForm& operator=( const SwForm& rForm );

    inline void             SetTemplate(USHORT nLevel, const String& rName);
    inline const String&    GetTemplate(USHORT nLevel) const;

    inline void             SetPattern(USHORT nLevel, const String& rName);
    inline const String&    GetPattern(USHORT nLevel) const;

    //convert pattern string from old to new format or vice versa
    static String           ConvertPatternTo51(const String& rSource);
    static String           ConvertPatternFrom51(const String& rSource, TOXTypes eType);

    // fill tab stop positions from template to pattern
    void                    AdjustTabStops(SwDoc& rDoc);

    SwFormTokenEnumerator   CreateTokenEnumerator(USHORT nLevel) const
        {return SwFormTokenEnumerator(GetPattern(nLevel));}

    inline USHORT   GetTOXType() const;
    inline USHORT   GetFormMax() const;

    USHORT GetFirstTabPos() const  ;    //{ return nFirstTabPos; }
    void SetFirstTabPos( USHORT n );    //{ nFirstTabPos = n; }

    BOOL IsFirstTabPosFlag() const  ;   //{ return bHasFirstTabPos; }
    void SetFirstTabPosFlag( BOOL b );  //{ bHasFirstTabPos = b; }

    BOOL IsGenerateTabPos() const       { return bGenerateTabPos; }
    void SetGenerateTabPos( BOOL b )    { bGenerateTabPos = b; }

    BOOL IsRelTabPos() const    {   return bIsRelTabPos; }
    void SetRelTabPos( BOOL b ) {   bIsRelTabPos = b;       }

    BOOL IsCommaSeparated() const       { return bCommaSeparated;}
    void SetCommaSeparated( BOOL b)     { bCommaSeparated = b;}

    static USHORT GetFormMaxLevel( USHORT nType );

    static const sal_Char*  aFormEntry;             // <E>
    static BYTE nFormEntryLen;                      // 3 Zeichen
    static const sal_Char*  aFormTab;               // <T>
    static BYTE nFormTabLen;                        // 3 Zeichen
    static const sal_Char*  aFormPageNums;          // <P>
    static BYTE nFormPageNumsLen;                   // 3 Zeichen
    static const sal_Char* aFormLinkStt;            // <LS>
    static BYTE nFormLinkSttLen;                    // 4 Zeichen
    static const sal_Char* aFormLinkEnd;            // <LE>
    static BYTE nFormLinkEndLen;                    // 4 Zeichen
    static const sal_Char*  aFormEntryNum;          // <E#>
    static BYTE nFormEntryNumLen;                   // 4 Zeichen
    static const sal_Char*  aFormEntryTxt;          // <ET>
    static BYTE nFormEntryTxtLen;                   // 4 Zeichen
    static const sal_Char*  aFormChapterMark;       // <C>
    static BYTE nFormChapterMarkLen;                // 3 Zeichen
    static const sal_Char*  aFormText;              // <TX>
    static BYTE nFormTextLen;                       // 4 Zeichen
    static const sal_Char*  aFormAuth;              // <Axx> xx - decimal enum value
    static BYTE nFormAuthLen;                       // 3 chars
};

/*--------------------------------------------------------------------
     Beschreibung: Inhalte aus denen Verzeichnisse generiert werden
 --------------------------------------------------------------------*/

enum SwTOXElement
{
    TOX_MARK            = 1,
    TOX_OUTLINELEVEL    = 2,
    TOX_TEMPLATE        = 4,
    TOX_OLE             = 8,
    TOX_TABLE           = 16,
    TOX_GRAPHIC         = 32,
    TOX_FRAME           = 64,
    TOX_SEQUENCE        = 128
};

enum SwTOIOptions
{
    TOI_SAME_ENTRY          = 1,
    TOI_FF                  = 2,
    TOI_CASE_SENSITIVE      = 4,
    TOI_KEY_AS_ENTRY        = 8,
    TOI_ALPHA_DELIMITTER    = 16,
    TOI_DASH                = 32,
    TOI_INITIAL_CAPS        = 64
};

//which part of the caption is to be displayed
enum SwCaptionDisplay
{
    CAPTION_COMPLETE,
    CAPTION_NUMBER,
    CAPTION_TEXT
};

enum SwTOOElements
{
    TOO_MATH        = 0x01,
    TOO_CHART       = 0x02,
    TOO_IMAGE       = 0x04,
    TOO_CALC        = 0x08,
    TOO_DRAW_IMPRESS= 0x10,
//  TOO_IMPRESS     = 0x20,

    TOO_OTHER       = 0x80
};

#define TOX_STYLE_DELIMITER ((sal_Unicode)0x01)     //JP 19.07.00: use a control char

/*--------------------------------------------------------------------
     Beschreibung:  Klasse aller  Verzeichnisse
 --------------------------------------------------------------------*/

class SwTOXBase : public SwClient
{
    // not implemented
    SwTOXBase&          operator=(const SwTOXBase& rSource);

//protected:

    SwForm      aForm;              // Aussehen  der Eintragzeile
    String      aName;              // unique name
    String      aTitle;             // Der Verzeichnistitel

    String      sMainEntryCharStyle; // name of the character style applied to main index entries

    String      aStyleNames[MAXLEVEL]; // (additional) style names TOX_CONTENT, TOX_USER
    String      sSequenceName;      // FieldTypeName of a caption sequence

    union {
        USHORT      nLevel;             // Gliederungsebenen beachten
        USHORT      nOptions;           // Optionen fuer Index
    } aData;

    USHORT      nCreateType;        // Quellen aus dem das Verzeichnis generiert wird
    USHORT      nOLEOptions;        // OLE sources
    SwCaptionDisplay eCaptionDisplay;   //
    BOOL        bProtected : 1;         // index protected ?
    BOOL        bFromChapter : 1;       // create from chapter or document
    BOOL        bFromObjectNames : 1;   // create a table or object index
                                    // from the names rather than the caption
    BOOL        bLevelFromChapter : 1; // User index: get the level from the source chapter
public:
    SwTOXBase( const SwTOXType* pTyp, const SwForm& rForm,
               USHORT nCreaType, const String& rTitle );
    SwTOXBase( const SwTOXBase& rCopy, SwDoc* pDoc = 0 );
    virtual ~SwTOXBase();

    virtual BOOL GetInfo( SfxPoolItem& rInfo ) const;

    // a kind of CopyCtor - check if the TOXBase is at TOXType of the doc.
    // If not, so create it an copy all other used things. The return is this
    SwTOXBase& CopyTOXBase( SwDoc*, const SwTOXBase& );

    const SwTOXType*    GetTOXType() const; //

    USHORT              GetCreateType() const;      // Aus Inhaltsformen generieren

    const String&       GetTOXName() const {return aName;}
    void                SetTOXName(const String& rSet) {aName = rSet;}

    const String&       GetTitle() const;           // Titel des Verzeichnisses
    const String&       GetTypeName() const;        // Name des Verzeichnisses
    const SwForm&       GetTOXForm() const;         // Aussehen der Zeile

    void                SetCreate(USHORT);
    void                SetTitle(const String& rTitle);
    void                SetTOXForm(const SwForm& rForm);

    TOXTypes            GetType() const;

    const String&       GetMainEntryCharStyle() const {return sMainEntryCharStyle;}
    void                SetMainEntryCharStyle(const String& rSet)  {sMainEntryCharStyle = rSet;}

    // Inhaltsverzeichnis - spezifisch
    inline void             SetLevel(USHORT);                   // Gliederungsebene beachten
    inline USHORT           GetLevel() const;

    // Index - spezifisch
    inline USHORT           GetOptions() const;                 // Optionen fuer Index
    inline void             SetOptions(USHORT nOpt);

    // index of objects
    USHORT      GetOLEOptions() const {return nOLEOptions;}
    void        SetOLEOptions(USHORT nOpt) {nOLEOptions = nOpt;}

    // index of objects

    // Benutzerverzeichnis - spezifisch
    inline void             SetTemplateName(const String& rName); // Absatzlayout beachten
    inline String           GetTemplateName() const;

    const String&           GetStyleNames(USHORT nLevel) const
                                {
                                DBG_ASSERT( nLevel < MAXLEVEL, "Which level?");
                                return aStyleNames[nLevel];
                                }
    void                    SetStyleNames(const String& rSet, USHORT nLevel)
                                {
                                DBG_ASSERT( nLevel < MAXLEVEL, "Which level?");
                                aStyleNames[nLevel] = rSet;
                                }
    BOOL                    HasAnyStyleNames() const;

    BOOL                    IsFromChapter() const { return bFromChapter;}
    void                    SetFromChapter(BOOL bSet) { bFromChapter = bSet;}

    BOOL                    IsFromObjectNames() const {return bFromObjectNames;}
    void                    SetFromObjectNames(BOOL bSet) {bFromObjectNames = bSet;}

    BOOL                    IsLevelFromChapter() const {return bLevelFromChapter;}
    void                    SetLevelFromChapter(BOOL bSet) {bLevelFromChapter = bSet;}

    BOOL                    IsProtected() const { return bProtected; }
    void                    SetProtected(BOOL bSet) { bProtected = bSet; }

    const String&           GetSequenceName() const {return sSequenceName;}
    void                    SetSequenceName(const String& rSet) {sSequenceName = rSet;}

    SwCaptionDisplay        GetCaptionDisplay() const { return eCaptionDisplay;}
    void                    SetCaptionDisplay(SwCaptionDisplay eSet) {eCaptionDisplay = eSet;}

    BOOL                    IsTOXBaseInReadonly() const;

    const SfxItemSet*       GetAttrSet() const;
    void                    SetAttrSet( const SfxItemSet& );

    static const String&    GetTOXName(TOXTypes eType);           // toxmgr.cxx

};


/*--------------------------------------------------------------------
     Beschreibung:  Inlines
 --------------------------------------------------------------------*/

//
//SwTOXMark
//
inline const String& SwTOXMark::GetAlternativeText() const
    {   return aAltText;    }

inline const SwTOXType* SwTOXMark::GetTOXType() const
    { return (SwTOXType*)GetRegisteredIn(); }

inline BOOL SwTOXMark::IsAlternativeText() const
    { return aAltText.Len() > 0; }

inline void SwTOXMark::SetAlternativeText(const String& rAlt)
{
    aAltText = rAlt;
}

inline void SwTOXMark::SetLevel( USHORT nLvl )
{
    ASSERT( !GetTOXType() || GetTOXType()->GetType() != TOX_INDEX, "Falscher Feldtyp");
    nLevel = nLvl;
}

inline void SwTOXMark::SetPrimaryKey( const String& rKey )
{
    ASSERT(GetTOXType()->GetType() == TOX_INDEX, "Falscher Feldtyp");
    aPrimaryKey = rKey;
}

inline void SwTOXMark::SetSecondaryKey( const String& rKey )
{
    ASSERT(GetTOXType()->GetType() == TOX_INDEX, "Falscher Feldtyp");
    aSecondaryKey = rKey;
}

inline USHORT SwTOXMark::GetLevel() const
{
    ASSERT( !GetTOXType() || GetTOXType()->GetType() != TOX_INDEX, "Falscher Feldtyp");
    return nLevel;
}

inline const String& SwTOXMark::GetPrimaryKey() const
{
    ASSERT(GetTOXType()->GetType() == TOX_INDEX, "Falscher Feldtyp");
    return aPrimaryKey;
}

inline const String& SwTOXMark::GetSecondaryKey() const
{
    ASSERT(GetTOXType()->GetType() == TOX_INDEX, "Falscher Feldtyp");
    return aSecondaryKey;
}


//
//SwForm
//
inline void SwForm::SetTemplate(USHORT nLevel, const String& rName)
{
    ASSERT(nLevel < GetFormMax(), "Index >= FORM_MAX");
    aTemplate[nLevel] = rName;
}

inline void SwForm::SetPattern(USHORT nLevel, const String& rName)
{
    ASSERT(nLevel < GetFormMax(), "Index >= FORM_MAX");
    aPattern[nLevel] = rName;
}

inline const String& SwForm::GetPattern(USHORT nLevel) const
{
    ASSERT(nLevel < GetFormMax(), "Index >= FORM_MAX");
    return aPattern[nLevel];
}

inline const String& SwForm::GetTemplate(USHORT nLevel) const
{
    ASSERT(nLevel < GetFormMax(), "Index >= FORM_MAX");
    return aTemplate[nLevel];
}

inline USHORT SwForm::GetTOXType() const
{
    return nType;
}

inline USHORT SwForm::GetFormMax() const
{
    return nFormMaxLevel;
}


//
//SwTOXType
//
inline const String& SwTOXType::GetTypeName() const
    {   return aName;   }

inline void SwTOXType::SetTypeName(const String& rName)
    {   aName = rName;  }

inline TOXTypes SwTOXType::GetType() const
    {   return eType;   }

//
// SwTOXBase
//
inline const SwTOXType* SwTOXBase::GetTOXType() const
    { return (SwTOXType*)GetRegisteredIn(); }

inline USHORT SwTOXBase::GetCreateType() const
    { return nCreateType; }

inline const String& SwTOXBase::GetTitle() const
    { return aTitle; }

inline const String& SwTOXBase::GetTypeName() const
    { return GetTOXType()->GetTypeName();  }

inline const SwForm& SwTOXBase::GetTOXForm() const
    { return aForm; }

inline void SwTOXBase::SetCreate(USHORT nCreate)
    { nCreateType = nCreate; }

inline void SwTOXBase::SetTitle(const String& rTitle)
    {   aTitle = rTitle; }

inline void SwTOXBase::SetTOXForm(const SwForm& rForm)
    {  aForm = rForm; }

inline TOXTypes SwTOXBase::GetType() const
    { return GetTOXType()->GetType(); }

inline void SwTOXBase::SetLevel(USHORT nLev)
{
    ASSERT(GetTOXType()->GetType() != TOX_INDEX, "Falscher Feldtyp");
    aData.nLevel = nLev;
}

inline USHORT SwTOXBase::GetLevel() const
{
    ASSERT(GetTOXType()->GetType() != TOX_INDEX, "Falscher Feldtyp");
    return aData.nLevel;
}

inline void SwTOXBase::SetTemplateName(const String& rName)
{
//  ASSERT(GetTOXType()->GetType() == TOX_USER, "Falscher Feldtyp");
//  ASSERT(aData.pTemplateName, "pTemplateName == 0");
//  (*aData.pTemplateName) = rName;
    DBG_WARNING("SwTOXBase::SetTemplateName obsolete")
    aStyleNames[0] = rName;

}

inline String SwTOXBase::GetTemplateName() const
{
//  ASSERT(GetTOXType()->GetType() == TOX_USER, "Falscher Feldtyp");
//  return *aData.pTemplateName;
    DBG_WARNING("SwTOXBase::GetTemplateName obsolete")
    return aStyleNames[0].GetToken(0, TOX_STYLE_DELIMITER);
}

inline USHORT SwTOXBase::GetOptions() const
{
    ASSERT(GetTOXType()->GetType() == TOX_INDEX, "Falscher Feldtyp");
    return aData.nOptions;
}

inline void SwTOXBase::SetOptions(USHORT nOpt)
{
    ASSERT(GetTOXType()->GetType() == TOX_INDEX, "Falscher Feldtyp");
    aData.nOptions = nOpt;
}


#endif  // _TOX_HXX
diff --git a/sw/inc/toxe.hxx b/sw/inc/toxe.hxx
new file mode 100644
index 0000000..6a8c8be
--- /dev/null
+++ b/sw/inc/toxe.hxx
@@ -0,0 +1,159 @@
/*************************************************************************
 *
 *  $RCSfile: toxe.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:28 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _TOXE_HXX
#define _TOXE_HXX

enum SwTOXSearch
{
    TOX_NXT,
    TOX_PRV,
    TOX_SAME_NXT,
    TOX_SAME_PRV
};

enum SwTOIKeyType
{
    TOI_PRIMARY,
    TOI_SECONDARY
};

enum TOXTypes
{
    TOX_INDEX,
    TOX_USER,
    TOX_CONTENT,
    TOX_ILLUSTRATIONS,
    TOX_OBJECTS,
    TOX_TABLES,
    TOX_AUTHORITIES
};
// this enum contains all types of sources
enum ToxAuthorityType
{
    //BiBTeX - fields
    AUTH_TYPE_ARTICLE,
    AUTH_TYPE_BOOK,
    AUTH_TYPE_BOOKLET,
    AUTH_TYPE_CONFERENCE,
    AUTH_TYPE_INBOOK,
    AUTH_TYPE_INCOLLECTION,
    AUTH_TYPE_INPROCEEDINGS,
    AUTH_TYPE_JOURNAL,
    AUTH_TYPE_MANUAL,
    AUTH_TYPE_MASTERSTHESIS,
    AUTH_TYPE_MISC,
    AUTH_TYPE_PHDTHESIS,
    AUTH_TYPE_PROCEEDINGS,
    AUTH_TYPE_TECHREPORT,
    AUTH_TYPE_UNPUBLISHED,
    //additional types
    AUTH_TYPE_EMAIL,
    AUTH_TYPE_WWW,
    AUTH_TYPE_CUSTOM1,
    AUTH_TYPE_CUSTOM2,
    AUTH_TYPE_CUSTOM3,
    AUTH_TYPE_CUSTOM4,
    AUTH_TYPE_CUSTOM5,
    AUTH_TYPE_END
};

//this enum contains the fields of an authority entry
enum ToxAuthorityField
{
    AUTH_FIELD_IDENTIFIER,
    AUTH_FIELD_AUTHORITY_TYPE, //ToxAuthorityType
    //BibTex types
    AUTH_FIELD_ADDRESS,
    AUTH_FIELD_ANNOTE,
    AUTH_FIELD_AUTHOR,
    AUTH_FIELD_BOOKTITLE,
    AUTH_FIELD_CHAPTER,
    AUTH_FIELD_EDITION,
    AUTH_FIELD_EDITOR,
    AUTH_FIELD_HOWPUBLISHED,
    AUTH_FIELD_INSTITUTION,
    AUTH_FIELD_JOURNAL,
//  AUTH_FIELD_KEY, // BiBTeX - Field
    AUTH_FIELD_MONTH,
    AUTH_FIELD_NOTE,
    AUTH_FIELD_NUMBER,
    AUTH_FIELD_ORGANIZATIONS,
    AUTH_FIELD_PAGES,
    AUTH_FIELD_PUBLISHER,
    AUTH_FIELD_SCHOOL,
    AUTH_FIELD_SERIES,
    AUTH_FIELD_TITLE,
    AUTH_FIELD_REPORT_TYPE,
    AUTH_FIELD_VOLUME,
    AUTH_FIELD_YEAR,
    //additional types
    AUTH_FIELD_URL,
    AUTH_FIELD_CUSTOM1,
    AUTH_FIELD_CUSTOM2,
    AUTH_FIELD_CUSTOM3,
    AUTH_FIELD_CUSTOM4,
    AUTH_FIELD_CUSTOM5,
    AUTH_FIELD_ISBN,
    AUTH_FIELD_END
};


#endif
diff --git a/sw/inc/toxinit.hxx b/sw/inc/toxinit.hxx
new file mode 100644
index 0000000..25128fa
--- /dev/null
+++ b/sw/inc/toxinit.hxx
@@ -0,0 +1,71 @@
/*************************************************************************
 *
 *  $RCSfile: toxinit.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:28 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _TOXINIT_HXX
#define _TOXINIT_HXX

class UniString;

void SetTOUTableStr(const UniString& rStr);
void SetTOUGraphicStr(const UniString& rStr);
void SetTOUOLEStr(const UniString& rStr);


#endif // _TOXINIT_HXX
diff --git a/sw/inc/txatbase.hxx b/sw/inc/txatbase.hxx
new file mode 100644
index 0000000..81909ed
--- /dev/null
+++ b/sw/inc/txatbase.hxx
@@ -0,0 +1,482 @@
/*************************************************************************
 *
 *  $RCSfile: txatbase.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:28 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _TXATBASE_HXX
#define _TXATBASE_HXX

#ifndef _SOLAR_H
#include <tools/solar.h>
#endif
#ifndef _SFXPOOLITEM_HXX //autogen
#include <svtools/poolitem.hxx>
#endif
#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _ERRHDL_HXX
#include <errhdl.hxx>
#endif
#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif

class SwFont;
class SfxItemPool;

class SvxBrushItem;
class SvxFontItem;
class SvxPostureItem;
class SvxWeightItem;
class SvxUnderlineItem;
class SvxFontHeightItem;
class SvxPropSizeItem;
class SvxShadowedItem;
class SvxAutoKernItem;
class SvxWordLineModeItem;
class SvxContourItem;
class SvxCrossedOutItem;
class SvxColorItem;
class SvxCharSetColorItem;
class SvXMLAttrContainerItem;

class SwFmtCharFmt;
class SwFmtINetFmt;

class SvxKerningItem;
class SvxCaseMapItem;
class SvxLanguageItem;
class SvxEscapementItem;
class SvxBlinkItem;
class SvxNoHyphenItem;

class SwFmtSoftHyph;
class SwFmtHardBlank;
class SwFmtFld;
class SwFmtFtn;
class SwFmtFlyCnt;
class SwTOXMark;
class SwFmtRefMark;

class SwTxtAttr
{
    const SfxPoolItem* pAttr;
    xub_StrLen nStart;
    BOOL bDontExpand    : 1;

protected:
    SwTxtAttr( const SfxPoolItem& rAttr, xub_StrLen nStart );

public:
    virtual ~SwTxtAttr();

    // RemoveFromPool muss immer vorm DTOR Aufruf erfolgen!!
    void RemoveFromPool( SfxItemPool& rPool );

    // Start Position erfragen
                  xub_StrLen* GetStart()        { return &nStart; }
            const xub_StrLen* GetStart() const  { return &nStart; }

    // End Position erfragen
    virtual      xub_StrLen* GetEnd();
    inline const xub_StrLen* GetEnd() const;
    inline const xub_StrLen* GetAnyEnd() const;

    BOOL DontExpand() const             { return bDontExpand; }
    void SetDontExpand( BOOL bNew )     { bDontExpand = bNew; }

    inline const SfxPoolItem& GetAttr() const;
    inline USHORT Which() const { return GetAttr().Which(); }

    virtual int         operator==( const SwTxtAttr& ) const;

    virtual void ChgFnt( SwFont * );
    virtual void RstFnt( SwFont * );

    virtual void ChgTxtAttr( SwTxtAttr & );
    virtual void RstTxtAttr( SwTxtAttr & );

    inline const SvxFontItem            &GetFont() const;
    inline const SvxPostureItem         &GetPosture() const;
    inline const SvxWeightItem          &GetWeight() const;
    inline const SvxUnderlineItem       &GetUnderline() const;
    inline const SvxFontHeightItem      &GetFontSize() const;
    inline const SvxPropSizeItem        &GetPropSize() const;
    inline const SvxShadowedItem        &GetShadowed() const;
    inline const SvxAutoKernItem        &GetAutoKern() const;
    inline const SvxWordLineModeItem    &GetWordLineMode() const;
    inline const SvxContourItem         &GetContour() const;
    inline const SvxCrossedOutItem      &GetCrossedOut() const;
    inline const SvxColorItem           &GetColor() const;
    inline const SvxCharSetColorItem    &GetCharSetColor() const;
    inline const SwFmtCharFmt           &GetCharFmt() const;
    inline const SvxKerningItem         &GetKerning() const;
    inline const SvxCaseMapItem         &GetCaseMap() const;
    inline const SvxLanguageItem        &GetLanguage() const;
    inline const SvxEscapementItem      &GetEscapement() const;
    inline const SvxBlinkItem           &GetBlink() const;
    inline const SvxBrushItem           &GetChrBackground() const;
    inline const SvxNoHyphenItem        &GetNoHyphenHere() const;
    inline const SwFmtSoftHyph          &GetSoftHyph() const;
    inline const SwFmtHardBlank         &GetHardBlank() const;
    inline const SwFmtFld               &GetFld() const;
    inline const SwFmtFtn               &GetFtn() const;
    inline const SwFmtFlyCnt            &GetFlyCnt() const;
    inline const SwTOXMark              &GetTOXMark() const;
    inline const SwFmtRefMark           &GetRefMark() const;
    inline const SwFmtINetFmt           &GetINetFmt() const;
    inline const SvXMLAttrContainerItem &GetXMLAttrContainer() const;

private:
    SwTxtAttr( const SwTxtAttr& );
    SwTxtAttr& operator=( const SwTxtAttr& );
};

class SwTxtAttrEnd : public SwTxtAttr
{
protected:
    xub_StrLen nEnd;
    SwTxtAttrEnd( const SfxPoolItem& rAttr, USHORT nStart, USHORT nEnd );

public:

    virtual xub_StrLen* GetEnd();
};


// --------------- Inline Implementierungen ------------------------

inline const xub_StrLen* SwTxtAttr::GetEnd() const
{
    return ((SwTxtAttr*)this)->GetEnd();
}

inline const xub_StrLen* SwTxtAttr::GetAnyEnd() const
{
    const xub_StrLen* pEnd = GetEnd();
    return pEnd ? pEnd : &nStart;
}

inline const SfxPoolItem& SwTxtAttr::GetAttr() const
{
    ASSERT( pAttr, "wo ist mein Attribut?" );
    return *pAttr;
}

inline const SvxFontItem& SwTxtAttr::GetFont() const
{
    ASSERT( pAttr && pAttr->Which() == RES_CHRATR_FONT, "Falsche Abfrage" );
    return (const SvxFontItem&)*pAttr;
}

inline const SvxPostureItem& SwTxtAttr::GetPosture() const
{
    ASSERT( pAttr && pAttr->Which() == RES_CHRATR_POSTURE, "Falsche Abfrage" );
    return (const SvxPostureItem&)*pAttr;
}

inline const SvxWeightItem& SwTxtAttr::GetWeight() const
{
    ASSERT( pAttr && pAttr->Which() == RES_CHRATR_WEIGHT, "Falsche Abfrage" );
    return (const SvxWeightItem&)*pAttr;
}

inline const SvxUnderlineItem& SwTxtAttr::GetUnderline() const
{
    ASSERT( pAttr && pAttr->Which() == RES_CHRATR_UNDERLINE, "Falsche Abfrage" );
    return (const SvxUnderlineItem&)*pAttr;
}

inline const SvxFontHeightItem& SwTxtAttr::GetFontSize() const
{
    ASSERT( pAttr && pAttr->Which() == RES_CHRATR_FONTSIZE, "Falsche Abfrage" );
    return (const SvxFontHeightItem&)*pAttr;
}

inline const SvxPropSizeItem& SwTxtAttr::GetPropSize() const
{
    ASSERT( pAttr && pAttr->Which() == RES_CHRATR_PROPORTIONALFONTSIZE, "Falsche Abfrage" );
    return (const SvxPropSizeItem&)*pAttr;
}

inline const SvxShadowedItem& SwTxtAttr::GetShadowed() const
{
    ASSERT( pAttr && pAttr->Which() == RES_CHRATR_SHADOWED, "Falsche Abfrage" );
    return (const SvxShadowedItem&)*pAttr;
}

inline const SvxAutoKernItem& SwTxtAttr::GetAutoKern() const
{
    ASSERT( pAttr && pAttr->Which() == RES_CHRATR_AUTOKERN, "Falsche Abfrage" );
    return (const SvxAutoKernItem&)*pAttr;
}

inline const SvxWordLineModeItem& SwTxtAttr::GetWordLineMode() const
{
    ASSERT( pAttr && pAttr->Which() == RES_CHRATR_WORDLINEMODE, "Falsche Abfrage" );
    return (const SvxWordLineModeItem&)*pAttr;
}

inline const SvxContourItem& SwTxtAttr::GetContour() const
{
    ASSERT( pAttr && pAttr->Which() == RES_CHRATR_CONTOUR, "Falsche Abfrage" );
    return (const SvxContourItem&)*pAttr;
}

inline const SvxCrossedOutItem& SwTxtAttr::GetCrossedOut() const
{
    ASSERT( pAttr && pAttr->Which() == RES_CHRATR_CROSSEDOUT, "Falsche Abfrage" );
    return (const SvxCrossedOutItem&)*pAttr;
}

inline const SvxColorItem& SwTxtAttr::GetColor() const
{
    ASSERT( pAttr && pAttr->Which() == RES_CHRATR_COLOR, "Falsche Abfrage" );
    return (const SvxColorItem&)*pAttr;
}

inline const SvxCharSetColorItem& SwTxtAttr::GetCharSetColor() const
{
    ASSERT( pAttr && pAttr->Which() == RES_CHRATR_CHARSETCOLOR, "Falsche Abfrage" );
    return (const SvxCharSetColorItem&)*pAttr;
}

inline const SwFmtCharFmt& SwTxtAttr::GetCharFmt() const
{
    ASSERT( pAttr && pAttr->Which() == RES_TXTATR_CHARFMT, "Falsche Abfrage" );
    return (const SwFmtCharFmt&)*pAttr;
}

inline const SvxKerningItem& SwTxtAttr::GetKerning() const
{
    ASSERT( pAttr && pAttr->Which() == RES_CHRATR_KERNING, "Falsche Abfrage" );
    return (const SvxKerningItem&)*pAttr;
}

inline const SvxCaseMapItem& SwTxtAttr::GetCaseMap() const
{
    ASSERT( pAttr && pAttr->Which() == RES_CHRATR_CASEMAP, "Falsche Abfrage" );
    return (const SvxCaseMapItem&)*pAttr;
}

inline const SvxLanguageItem& SwTxtAttr::GetLanguage() const
{
    ASSERT( pAttr && pAttr->Which() == RES_CHRATR_LANGUAGE, "Falsche Abfrage" );
    return (const SvxLanguageItem&)*pAttr;
}

inline const SvxEscapementItem& SwTxtAttr::GetEscapement() const
{
    ASSERT( pAttr && pAttr->Which() == RES_CHRATR_ESCAPEMENT, "Falsche Abfrage" );
    return (const SvxEscapementItem&)*pAttr;
}

inline const SvxBlinkItem& SwTxtAttr::GetBlink() const
{
    ASSERT( pAttr && pAttr->Which() == RES_CHRATR_BLINK, "Falsche Abfrage" );
    return (const SvxBlinkItem&)*pAttr;
}

inline const SvxBrushItem& SwTxtAttr::GetChrBackground() const
{
    ASSERT( pAttr && pAttr->Which() == RES_CHRATR_BACKGROUND, "Falsche Abfrage" );
    return (const SvxBrushItem&)*pAttr;
}

inline const SvxNoHyphenItem& SwTxtAttr::GetNoHyphenHere() const
{
    ASSERT( pAttr && pAttr->Which() == RES_CHRATR_NOHYPHEN, "Falsche Abfrage" );
    return (const SvxNoHyphenItem&)*pAttr;
}

inline const SwFmtSoftHyph& SwTxtAttr::GetSoftHyph() const
{
    ASSERT( pAttr && pAttr->Which() == RES_TXTATR_SOFTHYPH, "Falsche Abfrage" );
    return (const SwFmtSoftHyph&)*pAttr;
}

inline const SwFmtHardBlank& SwTxtAttr::GetHardBlank() const
{
    ASSERT( pAttr && pAttr->Which() == RES_TXTATR_HARDBLANK, "Falsche Abfrage" );
    return (const SwFmtHardBlank&)*pAttr;
}

inline const SwFmtFld& SwTxtAttr::GetFld() const
{
    ASSERT( pAttr && pAttr->Which() == RES_TXTATR_FIELD, "Falsche Abfrage" );
    return (const SwFmtFld&)*pAttr;
}

inline const SwFmtFtn& SwTxtAttr::GetFtn() const
{
    ASSERT( pAttr && pAttr->Which() == RES_TXTATR_FTN, "Falsche Abfrage" );
    return (const SwFmtFtn&)*pAttr;
}

inline const SwFmtFlyCnt& SwTxtAttr::GetFlyCnt() const
{
    ASSERT( pAttr && pAttr->Which() == RES_TXTATR_FLYCNT, "Falsche Abfrage" );
    return (const SwFmtFlyCnt&)*pAttr;
}

inline const SwTOXMark& SwTxtAttr::GetTOXMark() const
{
    ASSERT( pAttr && pAttr->Which() == RES_TXTATR_TOXMARK, "Falsche Abfrage" );
    return (const SwTOXMark&)*pAttr;
}

inline const SwFmtRefMark& SwTxtAttr::GetRefMark() const
{
    ASSERT( pAttr && pAttr->Which() == RES_TXTATR_REFMARK, "Falsche Abfrage" );
    return (const SwFmtRefMark&)*pAttr;
}

inline const SwFmtINetFmt& SwTxtAttr::GetINetFmt() const
{
    ASSERT( pAttr && pAttr->Which() == RES_TXTATR_INETFMT, "Falsche Abfrage" );
    return (const SwFmtINetFmt&)*pAttr;
}

inline const SvXMLAttrContainerItem& SwTxtAttr::GetXMLAttrContainer() const
{
    ASSERT( pAttr && pAttr->Which() == RES_UNKNOWNATR_CONTAINER,
            "Falsche Abfrage" );
    return (const SvXMLAttrContainerItem&)*pAttr;
}

/*************************************************************************

      $Log: not supported by cvs2svn $
      Revision 1.23  2000/09/18 16:03:31  willem.vandorp
      OpenOffice header added.

      Revision 1.22  2000/09/08 13:24:29  willem.vandorp
      Header and footer replaced

      Revision 1.21  2000/05/10 12:47:25  ama
      Unicode changes

      Revision 1.20  1999/12/07 21:09:51  jp
      Task #70258#: textattr for XMLAttrContainer

      Revision 1.19  1998/01/23 16:39:36  AMA
      New: Redlining + Zeichenattribute


      Rev 1.18   23 Jan 1998 17:39:36   AMA
   New: Redlining + Zeichenattribute

      Rev 1.17   04 Aug 1997 16:43:08   MH
   chg: header

      Rev 1.16   27 Sep 1996 14:21:12   JP
   bDontExpand Flag in die TxtAttr-Basisklasse verschoben

      Rev 1.15   17 Sep 1996 19:16:44   HJS
   add: forward

      Rev 1.14   17 Sep 1996 16:51:12   AMA
   Chg: Zeichenhintergrund als Zeichenattribut

      Rev 1.13   02 Aug 1996 14:50:20   AMA
   New: INet-Felder werden zu attributiertem Text.

      Rev 1.12   15 Jul 1996 17:16:24   AMA
   Umbau: NoBlink -> Blink TXTATR -> CHRATR ...

      Rev 1.11   04 Jul 1996 16:33:46   AMA
   New: Aus dem NoLinebreak wird ein NoBlink-Attribut

      Rev 1.10   24 Jun 1996 18:37:26   MA
   includes

      Rev 1.9   08 Aug 1995 17:23:26   AMA
   Umbau: GetPresentation statt GetValueText

      Rev 1.8   19 Jun 1995 16:50:54   MA
   Umbau fuer daemliche Compiler

      Rev 1.7   27 Jan 1995 17:39:36   AMA
   Neues Textattribut: SvxAutoKernItem

      Rev 1.6   06 Jan 1995 18:42:36   AMA
   SEXPORT wg. DLL

      Rev 1.5   02 Nov 1994 12:18:16   AMA
   Reimport Absatzattr. als Svx (paraitem.hxx)
   SvxSizeItem->SvxFontHeight (textitem.hxx)

      Rev 1.4   14 Oct 1994 14:18:34   AMA
   Umstellung auf SvxItems

      Rev 1.3   07 Sep 1994 17:45:02   SWG
   Umstellung Attribute

      Rev 1.2   29 Aug 1994 19:30:38   JP
   DTOR muss virtual sein.

      Rev 1.1   29 Aug 1994 10:02:48   JP
   Ist der Return-Wert eine Referenz, muss auch dereferenziert werden!

      Rev 1.0   25 Aug 1994 16:54:32   JP
   Umstellung Attribute (von SwHint -> SfxPoolItem)

*************************************************************************/
    // #ifndef _TXATBASE_HXX
#endif
diff --git a/sw/inc/txtatr.hxx b/sw/inc/txtatr.hxx
new file mode 100644
index 0000000..8a7e293
--- /dev/null
+++ b/sw/inc/txtatr.hxx
@@ -0,0 +1,427 @@
/*************************************************************************
 *
 *  $RCSfile: txtatr.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:29 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _TXTATR_HXX
#define _TXTATR_HXX

#ifndef _SV_GEN_HXX
#include <tools/gen.hxx>
#endif
#ifndef _TOOLS_COLOR_HXX
#include <tools/color.hxx>
#endif
#ifndef _LANG_HXX
#include <tools/lang.hxx>
#endif
#ifndef _SV_FONTTYPE_HXX //autogen
#include <vcl/fonttype.hxx>
#endif
#ifndef _SVX_SVXENUM_HXX //autogen
#include <svx/svxenum.hxx>
#endif

#ifndef _TXATBASE_HXX
#include <txatbase.hxx>     // SwTxtAttr/SwTxtAttrEnd
#endif

class SwTxtNode;    // fuer SwTxtFld
class SvxFont;
class SwCharSetCol;

// ATT_FONT ***********************************************************

class SwTxtFont: public SwTxtAttrEnd
{
    // Hier werden die alten Werte aus dem Font bei ChgFnt() gemerkt.
    FontFamily ePrevFamily;
    FontPitch ePrevPitch;
    CharSet ePrevCharSet;
    String aPrevName;
    String aPrevStyleName;
public:
    SwTxtFont( const SvxFontItem& rAttr, xub_StrLen nStart, xub_StrLen nEnd );
    ~SwTxtFont( );

    virtual void ChgFnt(SwFont *);
    virtual void RstFnt(SwFont *);
    virtual void ChgTxtAttr( SwTxtAttr & );
    virtual void RstTxtAttr( SwTxtAttr & );
};

// ATT_POSTURE ***********************************************************

class SwTxtPosture : public SwTxtAttrEnd
{
    FontItalic ePrevPosture;
public:
    SwTxtPosture( const SvxPostureItem& rAttr, xub_StrLen nStart, xub_StrLen nEnd );

    virtual void ChgFnt(SwFont *);
    virtual void RstFnt(SwFont *);
    virtual void ChgTxtAttr( SwTxtAttr & );
    virtual void RstTxtAttr( SwTxtAttr & );
};

// ATT_WEIGHT ************************************************************

class SwTxtWeight : public SwTxtAttrEnd
{
    // Hier merkt es sich das SV-Attribut Weight aus dem Font.
    FontWeight ePrevWeight;
public:
    SwTxtWeight( const SvxWeightItem& rAttr, xub_StrLen nStart, xub_StrLen nEnd );

    virtual void ChgFnt(SwFont *);
    virtual void RstFnt(SwFont *);
    virtual void ChgTxtAttr( SwTxtAttr & );
    virtual void RstTxtAttr( SwTxtAttr & );
};

// ATT_SHADOWED **********************************************************

class SwTxtShadowed : public SwTxtAttrEnd
{
    BOOL bPrevShadow;
public:
    SwTxtShadowed( const SvxShadowedItem& rAttr, xub_StrLen nStart, xub_StrLen nEnd );

    virtual void ChgFnt(SwFont *);
    virtual void RstFnt(SwFont *);
    virtual void ChgTxtAttr( SwTxtAttr & );
    virtual void RstTxtAttr( SwTxtAttr & );
};

// ATT_AUTOKERN **********************************************************

class SwTxtAutoKern : public SwTxtAttrEnd
{
    BOOL bPrevAutoKern;
public:
    SwTxtAutoKern( const SvxAutoKernItem& rAttr, xub_StrLen nStart, xub_StrLen nEnd );

    virtual void ChgFnt(SwFont *);
    virtual void RstFnt(SwFont *);
};

// ATT_WORDLINEMODE **********************************************************

class SwTxtWordLineMode : public SwTxtAttrEnd
{
    BOOL bPrevWordLineMode;
public:
    SwTxtWordLineMode( const SvxWordLineModeItem& rAttr, xub_StrLen nStart, xub_StrLen nEnd );

    virtual void ChgFnt(SwFont *);
    virtual void RstFnt(SwFont *);
    virtual void ChgTxtAttr( SwTxtAttr & );
    virtual void RstTxtAttr( SwTxtAttr & );
};

// ATT_CONTOUR ***********************************************************

class SwTxtContour : public SwTxtAttrEnd
{
    BOOL bPrevContour;
public:
    SwTxtContour( const SvxContourItem& rAttr, xub_StrLen nStart, xub_StrLen nEnd );

    virtual void ChgFnt(SwFont *);
    virtual void RstFnt(SwFont *);
    virtual void ChgTxtAttr( SwTxtAttr & );
    virtual void RstTxtAttr( SwTxtAttr & );
};

// ATT_CROSSEDOUT ********************************************************

class SwTxtCrossedOut : public SwTxtAttrEnd
{
    FontStrikeout ePrevCrossedOut;
public:
    SwTxtCrossedOut( const SvxCrossedOutItem& rAttr, xub_StrLen nStart, xub_StrLen nEnd );

    virtual void ChgFnt(SwFont *);
    virtual void RstFnt(SwFont *);
    virtual void ChgTxtAttr( SwTxtAttr & );
    virtual void RstTxtAttr( SwTxtAttr & );
};

// ATT_UNDERLINE *********************************************************

class SwTxtUnderline : public SwTxtAttrEnd
{
    FontUnderline ePrevUnderline;
public:
    SwTxtUnderline( const SvxUnderlineItem& rAttr, xub_StrLen nStart, xub_StrLen nEnd );

    virtual void ChgFnt(SwFont *);
    virtual void RstFnt(SwFont *);
    virtual void ChgTxtAttr( SwTxtAttr & );
    virtual void RstTxtAttr( SwTxtAttr & );
};

// ATT_SIZE **************************************************************

class SwTxtSize : public SwTxtAttrEnd
{
    Size aPrevSize;
public:
    SwTxtSize( const SvxFontHeightItem& rAttr, xub_StrLen nStart, xub_StrLen nEnd );

    virtual void ChgFnt(SwFont *);
    virtual void RstFnt(SwFont *);
    virtual void ChgTxtAttr( SwTxtAttr & );
    virtual void RstTxtAttr( SwTxtAttr & );
};

// ATT_COLOR *************************************************************

class SwTxtColor : public SwTxtAttrEnd
{
    friend class SwTxtCharSetColor;
    Color aPrevColor;
public:
    SwTxtColor( const SvxColorItem& rAttr, xub_StrLen nStart, xub_StrLen nEnd );

    virtual void ChgFnt(SwFont *);
    virtual void RstFnt(SwFont *);
    virtual void ChgTxtAttr( SwTxtAttr & );
    virtual void RstTxtAttr( SwTxtAttr & );
};

// ATT_CHARSETCOLOR ******************************************************

class SwTxtCharSetColor : public SwTxtAttrEnd
{
    SwCharSetCol *pPrevCharSetCol;
public:
    SwTxtCharSetColor( const SvxCharSetColorItem& rAttr, xub_StrLen nStart, xub_StrLen nEnd );
    ~SwTxtCharSetColor();
    virtual void ChgFnt(SwFont *);
    virtual void RstFnt(SwFont *);
    virtual void ChgTxtAttr( SwTxtAttr & );
    virtual void RstTxtAttr( SwTxtAttr & );
};

// ATT_CHARFMT *********************************************

class SwTxtCharFmt : public SwTxtAttrEnd
{
    SvxFont* pPrevFont;
    const void* pFontNo;
    SwTxtNode* pMyTxtNd;
    Color* pPrevColor;
    USHORT nFntIndex;
    BOOL bPrevNoHyph    : 1;
    BOOL bPrevBlink     : 1;
    BOOL bPrevURL       : 1;
    BOOL bColor         : 1;

public:
    SwTxtCharFmt( const SwFmtCharFmt& rAttr, xub_StrLen nStart, xub_StrLen nEnd );
    ~SwTxtCharFmt( );

    virtual void ChgFnt(SwFont *);
    virtual void RstFnt(SwFont *);

    // werden vom SwFmtCharFmt hierher weitergeleitet
    virtual void Modify( SfxPoolItem*, SfxPoolItem* );    // SwClient
    virtual BOOL GetInfo( SfxPoolItem& rInfo ) const;

    // erfrage und setze den TxtNode Pointer
    inline const SwTxtNode& GetTxtNode() const;
    void ChgTxtNode( const SwTxtNode* pNew ) { pMyTxtNd = (SwTxtNode*)pNew; }

};


// ATT_KERNING ***********************************************************

class SwTxtKerning : public SwTxtAttrEnd
{
    short nPrevKern;
public:
    SwTxtKerning( const SvxKerningItem& rAttr, xub_StrLen nStart, xub_StrLen nEnd );

    virtual void ChgFnt(SwFont *);
    virtual void RstFnt(SwFont *);
    virtual void ChgTxtAttr( SwTxtAttr & );
    virtual void RstTxtAttr( SwTxtAttr & );
};

// ATT_CASEMAP ***********************************************************

class SwTxtCaseMap : public SwTxtAttrEnd
{
    SvxCaseMap ePrevCaseMap;
public:
    SwTxtCaseMap( const SvxCaseMapItem& rAttr, xub_StrLen nStart, xub_StrLen nEnd );

    virtual void ChgFnt(SwFont *);
    virtual void RstFnt(SwFont *);
    virtual void ChgTxtAttr( SwTxtAttr & );
    virtual void RstTxtAttr( SwTxtAttr & );
};

// ATT_LANGUAGE **********************************************************

class SwTxtLanguage : public SwTxtAttrEnd
{
    LanguageType ePrevLang;
public:
    SwTxtLanguage( const SvxLanguageItem& rAttr, xub_StrLen nStart, xub_StrLen nEnd );

    virtual void ChgFnt(SwFont *);
    virtual void RstFnt(SwFont *);
};


// ATT_ESCAPEMENT ********************************************************

class SwTxtEscapement : public SwTxtAttrEnd
{
    short   nPrevEsc;
    BYTE    nPrevPropr;

public:
    SwTxtEscapement( const SvxEscapementItem& rAttr, xub_StrLen nStart, xub_StrLen nEnd );

    virtual void ChgFnt(SwFont *);
    virtual void RstFnt(SwFont *);
    virtual void ChgTxtAttr( SwTxtAttr & );
    virtual void RstTxtAttr( SwTxtAttr & );
};

// ATT_BLINK ***********************

class SwTxtBlink : public SwTxtAttrEnd
{
    BOOL bPrev;
public:
    SwTxtBlink( const SvxBlinkItem& rAttr,
                        xub_StrLen nStart, xub_StrLen nEnd );

    virtual void ChgFnt(SwFont *);
    virtual void RstFnt(SwFont *);
    virtual void ChgTxtAttr( SwTxtAttr & );
    virtual void RstTxtAttr( SwTxtAttr & );
};

// ATT_BACKGROUND ***********************

class SwTxtBackground : public SwTxtAttrEnd
{
    Color *pPrevColor;
public:
    SwTxtBackground( const SvxBrushItem& rAttr,
                        xub_StrLen nStart, xub_StrLen nEnd );
    ~SwTxtBackground();
    virtual void ChgFnt(SwFont *);
    virtual void RstFnt(SwFont *);
    virtual void ChgTxtAttr( SwTxtAttr & );
    virtual void RstTxtAttr( SwTxtAttr & );
};

// ATT_NOHYPHENHERE **************************

class SwTxtNoHyphenHere : public SwTxtAttrEnd
{
    BOOL bPrev;
public:
    SwTxtNoHyphenHere( const SvxNoHyphenItem& rAttr,
                        xub_StrLen nStart, xub_StrLen nEnd );

    virtual void ChgFnt(SwFont *);
    virtual void RstFnt(SwFont *);
};

// ATT_HARDBLANK ******************************

class SwTxtHardBlank : public SwTxtAttr
{
    sal_Unicode cChar;
public:
    SwTxtHardBlank( const SwFmtHardBlank& rAttr, xub_StrLen nStart );
    inline sal_Unicode GetChar() const  { return cChar; }
};


// ATT_XNLCONTAINERITEM ******************************

class SwTxtXMLAttrContainer : public SwTxtAttrEnd
{
public:
    SwTxtXMLAttrContainer( const SvXMLAttrContainerItem& rAttr,
                        xub_StrLen nStart, xub_StrLen nEnd );
};



// --------------- Inline Implementierungen ------------------------


inline const SwTxtNode& SwTxtCharFmt::GetTxtNode() const
{
    ASSERT( pMyTxtNd, "SwTxtCharFmt:: wo ist mein TextNode?" );
    return *pMyTxtNd;
}



#endif
diff --git a/sw/inc/txtflcnt.hxx b/sw/inc/txtflcnt.hxx
new file mode 100644
index 0000000..334735e
--- /dev/null
+++ b/sw/inc/txtflcnt.hxx
@@ -0,0 +1,104 @@
/*************************************************************************
 *
 *  $RCSfile: txtflcnt.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:29 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _TXTFLCNT_HXX
#define _TXTFLCNT_HXX

#ifndef _TXATBASE_HXX //autogen
#include <txatbase.hxx>
#endif

class SwFlyInCntFrm;
class SwFrm;
class SwTxtNode;
class SwDoc;

// SWTXT_FLYCNT ********************************
// Attribut fuer zeilengebundene Frames (ohne Endindex)

class SwTxtFlyCnt : public SwTxtAttr
{
    SwFlyInCntFrm  *_GetFlyFrm( const SwFrm *pCurrFrm );

public:
    SwTxtFlyCnt( const SwFmtFlyCnt& rAttr, xub_StrLen nStart );

    // Setzt den Anker im pFmt und
    void    SetAnchor( const SwTxtNode *pNode );

    inline        SwFlyInCntFrm  *GetFlyFrm( const SwFrm *pCurrFrm );
    inline const  SwFlyInCntFrm  *GetFlyFrm( const SwFrm *pCurrFrm ) const;

    // erzeugt sich ein neues FlyFrameFormat
    void CopyFlyFmt( SwDoc* pDoc );
};

inline SwFlyInCntFrm *SwTxtFlyCnt::GetFlyFrm( const SwFrm *pCurrFrm )
{
    return _GetFlyFrm( pCurrFrm );
}

inline const SwFlyInCntFrm *SwTxtFlyCnt::GetFlyFrm( const SwFrm *pCurrFrm ) const
{
    return ((SwTxtFlyCnt*)this)->_GetFlyFrm( pCurrFrm );
}

#endif

diff --git a/sw/inc/txtfld.hxx b/sw/inc/txtfld.hxx
new file mode 100644
index 0000000..4e73a9a
--- /dev/null
+++ b/sw/inc/txtfld.hxx
@@ -0,0 +1,106 @@
/*************************************************************************
 *
 *  $RCSfile: txtfld.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:29 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _TXTFLD_HXX
#define _TXTFLD_HXX

#ifndef _TXATBASE_HXX //autogen
#include <txatbase.hxx>
#endif
#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif

class SwTxtNode;

// ATT_FLD ***********************************

class SwTxtFld : public SwTxtAttr
{
    String     aExpand;
    SwTxtNode  *pMyTxtNd;
public:
    SwTxtFld( const SwFmtFld& rAttr, xub_StrLen nStart );
    ~SwTxtFld();

    void CopyFld( SwTxtFld *pDest ) const;
    void Expand();
    inline void ExpandAlways();

    // erfrage und setze den TxtNode Pointer
    const SwTxtNode* GetpTxtNode() const { return pMyTxtNd; }
    inline const SwTxtNode& GetTxtNode() const;
    void ChgTxtNode( const SwTxtNode* pNew ) { pMyTxtNd = (SwTxtNode*)pNew; }
};

inline const SwTxtNode& SwTxtFld::GetTxtNode() const
{
    ASSERT( pMyTxtNd, "SwTxtFld:: wo ist mein TextNode?" );
    return *pMyTxtNd;
}

inline void SwTxtFld::ExpandAlways()
{
    aExpand += ' ';
    Expand();
}

#endif

diff --git a/sw/inc/txtftn.hxx b/sw/inc/txtftn.hxx
new file mode 100644
index 0000000..c04d0e2
--- /dev/null
+++ b/sw/inc/txtftn.hxx
@@ -0,0 +1,121 @@
/*************************************************************************
 *
 *  $RCSfile: txtftn.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:29 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _TXTFTN_HXX
#define _TXTFTN_HXX

#ifndef _TXATBASE_HXX //autogen
#include <txatbase.hxx>
#endif

class SwNodeIndex;
class SwTxtNode;
class SwNodes;
class SwDoc;

// ATT_FTN **********************************************************

class SwTxtFtn : public SwTxtAttr
{
    SwNodeIndex *pStartNode;
    SwTxtNode* pMyTxtNd;
    USHORT nSeqNo;

    // Zuweisung und Copy-Ctor sind nicht erlaubt.
    SwTxtFtn& operator=( const SwTxtFtn &rTxtFtn );
    SwTxtFtn( const SwTxtFtn &rTxtFtn );

public:
    SwTxtFtn( const SwFmtFtn& rAttr, xub_StrLen nStart );
    ~SwTxtFtn();

    inline SwNodeIndex *GetStartNode() const { return pStartNode; }
    void SetStartNode( const SwNodeIndex *pNode, BOOL bDelNodes = TRUE );
    void SetNumber( const USHORT nNumber, const String* = 0 );
    void CopyFtn( SwTxtFtn *pDest );

    // erfrage und setze den TxtNode Pointer
    inline const SwTxtNode& GetTxtNode() const;
    void ChgTxtNode( const SwTxtNode* pNew ) { pMyTxtNd = (SwTxtNode*)pNew; }

        // lege eine neue leere TextSection fuer diese Fussnote an
    void MakeNewTextSection( SwNodes& rNodes );

        // loesche die FtnFrame aus der Seite
    void DelFrms();
        // bedingten Absatzvorlagen checken
    void CheckCondColl();

        // fuer die Querverweise auf Fussnoten
    USHORT SetSeqRefNo();
    void SetSeqNo( USHORT n )               { nSeqNo = n; } // fuer die Reader
    USHORT GetSeqRefNo() const              { return nSeqNo; }

    static void SetUniqueSeqRefNo( SwDoc& rDoc );
};

inline const SwTxtNode& SwTxtFtn::GetTxtNode() const
{
    ASSERT( pMyTxtNd, "SwTxtFtn:: wo ist mein TextNode?" );
    return *pMyTxtNd;
}

#endif

diff --git a/sw/inc/txtinet.hxx b/sw/inc/txtinet.hxx
new file mode 100644
index 0000000..a39d7fd
--- /dev/null
+++ b/sw/inc/txtinet.hxx
@@ -0,0 +1,127 @@
/*************************************************************************
 *
 *  $RCSfile: txtinet.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:29 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _TXTINET_HXX
#define _TXTINET_HXX

#ifndef _TXATBASE_HXX //autogen
#include <txatbase.hxx>
#endif
#ifndef _CALBCK_HXX //autogen
#include <calbck.hxx>
#endif

class SvxFont;
class SwTxtNode;
class SwCharFmt;
class Color;

// ATT_INETFMT *********************************************

class SwTxtINetFmt : public SwTxtAttrEnd, public SwClient
{
    SvxFont* pPrevFont;
    Color* pPrevBackColor;
    SwTxtNode* pMyTxtNd;
    const void* pFontNo;
    USHORT nFntIndex;
    BOOL bPrevNoHyph    : 1;
    BOOL bPrevBlink     : 1;
    BOOL bPrevURL       : 1;
    BOOL bVisited       : 1; // Besuchter Link?
    BOOL bValidVis      : 1; // Ist das bVisited-Flag gueltig?
    BOOL bColor         : 1;

public:
    SwTxtINetFmt( const SwFmtINetFmt& rAttr, xub_StrLen nStart, xub_StrLen nEnd );
    virtual ~SwTxtINetFmt();
    TYPEINFO();

    virtual void ChgFnt(SwFont *);
    virtual void RstFnt(SwFont *);

    virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);
    virtual BOOL GetInfo( SfxPoolItem& rInfo ) const;

    // erfrage und setze den TxtNode Pointer
    const SwTxtNode* GetpTxtNode() const { return pMyTxtNd; }
    inline const SwTxtNode& GetTxtNode() const;
    void ChgTxtNode( const SwTxtNode* pNew ) { pMyTxtNd = (SwTxtNode*)pNew; }

          SwCharFmt* GetCharFmt();
    const SwCharFmt* GetCharFmt() const
            { return ((SwTxtINetFmt*)this)->GetCharFmt(); }

    const BOOL IsVisited() const { return bVisited; }
    void SetVisited( BOOL bNew ) { bVisited = bNew; }

    const BOOL IsValidVis() const { return bValidVis; }
    void SetValidVis( BOOL bNew ) { bValidVis = bNew; }

    BOOL IsProtect() const;
};
inline const SwTxtNode& SwTxtINetFmt::GetTxtNode() const
{
    ASSERT( pMyTxtNd, "SwTxtINetFmt:: wo ist mein TextNode?" );
    return *pMyTxtNd;
}

#endif

diff --git a/sw/inc/txtrfmrk.hxx b/sw/inc/txtrfmrk.hxx
new file mode 100644
index 0000000..52e6ea8
--- /dev/null
+++ b/sw/inc/txtrfmrk.hxx
@@ -0,0 +1,98 @@
/*************************************************************************
 *
 *  $RCSfile: txtrfmrk.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:29 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _TXTRFMRK_HXX
#define _TXTRFMRK_HXX

#ifndef _TXATBASE_HXX //autogen
#include <txatbase.hxx>
#endif

class SwTxtNode;

// SWTXT_REFMARK *************************************
// Attribut fuer Inhalts-/Positions-Referenzen im Text

class SwTxtRefMark : public SwTxtAttrEnd
{
    SwTxtNode* pMyTxtNd;
    USHORT* pEnd;       // fuer InhaltsReferenz / PositionRef. ohne Ende
public:
    SwTxtRefMark( const SwFmtRefMark& rAttr,
                    xub_StrLen nStart, xub_StrLen * pEnd = 0 );

    virtual xub_StrLen *GetEnd();                   // SwTxtAttr
    inline const xub_StrLen* GetEnd() const { return pEnd; }

    virtual void ChgFnt(SwFont *);              // SwTxtAttr
    virtual void RstFnt(SwFont *);              // SwTxtAttr

    // erfrage und setze den TxtNode Pointer
    inline const SwTxtNode& GetTxtNode() const;
    void ChgTxtNode( const SwTxtNode* pNew ) { pMyTxtNd = (SwTxtNode*)pNew; }
};
inline const SwTxtNode& SwTxtRefMark::GetTxtNode() const
{
    ASSERT( pMyTxtNd, "SwTxtRefMark:: wo ist mein TextNode?" );
    return *pMyTxtNd;
}

#endif

diff --git a/sw/inc/txttxmrk.hxx b/sw/inc/txttxmrk.hxx
new file mode 100644
index 0000000..a65fa3c
--- /dev/null
+++ b/sw/inc/txttxmrk.hxx
@@ -0,0 +1,104 @@
/*************************************************************************
 *
 *  $RCSfile: txttxmrk.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:29 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _TXTTXMRK_HXX
#define _TXTTXMRK_HXX

#ifndef _TXATBASE_HXX //autogen
#include <txatbase.hxx>
#endif

class SwTxtNode;
class SwDoc;

// SWTXT_TOXMARK *******************************
// Attribut fuer die Verzeichnisse

class SwTxtTOXMark : public SwTxtAttrEnd
{
    xub_StrLen* pEnd;       // wenn AlternativText vom SwTOXMark dann 0 !!
    SwTxtNode* pMyTxtNd;
public:
    SwTxtTOXMark( const SwTOXMark& rAttr,
                    xub_StrLen nStart, xub_StrLen * pEnd = 0 );
    virtual ~SwTxtTOXMark();

    virtual xub_StrLen *GetEnd();                   // SwTxtAttr
    inline const xub_StrLen* GetEnd() const { return pEnd; }

    virtual void ChgFnt(SwFont *);              // SwTxtAttr
    virtual void RstFnt(SwFont *);              // SwTxtAttr

    void CopyTOXMark( SwDoc* pDestDoc );

    // erfrage und setze den TxtNode Pointer
    inline const SwTxtNode* GetpTxtNd() const { return pMyTxtNd; }
    inline const SwTxtNode& GetTxtNode() const;
    void ChgTxtNode( const SwTxtNode* pNew ) { pMyTxtNd = (SwTxtNode*)pNew; }
};

inline const SwTxtNode& SwTxtTOXMark::GetTxtNode() const
{
    ASSERT( pMyTxtNd, "SwTxtTOXMark:: wo ist mein TextNode?" );
    return *pMyTxtNd;
}

#endif

diff --git a/sw/inc/undobj.hxx b/sw/inc/undobj.hxx
new file mode 100644
index 0000000..6064c63
--- /dev/null
+++ b/sw/inc/undobj.hxx
@@ -0,0 +1,1624 @@
/*************************************************************************
 *
 *  $RCSfile: undobj.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:29 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _UNDOBJ_HXX
#define _UNDOBJ_HXX

#ifndef _SVMEMPOOL_HXX //autogen
#include <tools/mempool.hxx>
#endif
#ifndef _SVSTDARR_HXX
#define _SVSTDARR_USHORTS
#define _SVSTDARR_ULONGS
#define _SVSTDARR_BOOLS
#define _SVSTDARR_BYTES
#define _SVSTDARR_USHORTSSORT
#include <svtools/svstdarr.hxx>
#endif
#ifndef _SFXITEMSET_HXX //autogen
#include <svtools/itemset.hxx>
#endif
#ifndef _NUMRULE_HXX
#include <numrule.hxx>
#endif
#ifndef _REDLENUM_HXX
#include <redlenum.hxx>
#endif

class SwUndoIter;
class SwHistory;

class SwIndex;
class SwPaM;
struct SwPosition;
class SwDoc;
class SwNodes;
class SwFmt;
class SwFmtColl;
class SwTxtFmtColl;
class SwTxtNode;
class SwpHints;
class SwBookmark;
class SwTableNode;
class SwTable;
class SwTableBox;
struct SwSortOptions;
class SwFrmFmt;
class SwHstryBookmark;
class SwSection;
class SwSectionFmt;
class SvxTabStopItem;
class SwNumSection;
class SwDDEFieldType;
class Graphic;
class SwGrfNode;
class SwUndos;
class SwUndoRange;
class SwFtnInfo;
class SwEndNoteInfo;
class SwNodeIndex;
class SwNodeRange;

struct SwUndoGroupObjImpl;
class SdrMarkList;
class SdrObject;
class SdrObjGroup;
class SdrUndoAction;
class SwDrawFrmFmt;
class _SaveTable;
class SwTableAutoFmt;
class SwSelBoxes;
class SwTableSortBoxes;
class SwUndoSaveSections;
class SwUndoMoves;
class SwStartNode;
class _SaveFlyArr;
class SwTblToTxtSaves;
class SwRedlineData;
class SwRedlineSaveData;
class SwRedline;

#ifndef PRODUCT
class Writer;
class SwUndo;
#define OUT_UNDOBJ( name )  \
    friend Writer& OutUndo_ ## name( Writer&, const SwUndo& );
#else
#define OUT_UNDOBJ( name )
#endif


typedef SwRedlineSaveData* SwRedlineSaveDataPtr;
SV_DECL_PTRARR_DEL( SwRedlineSaveDatas, SwRedlineSaveDataPtr, 8, 8 )

class SwUndo
{
    USHORT nId;
    USHORT nOrigRedlineMode;
protected:
    void RemoveIdxFromSection( SwDoc&, ULONG nSttIdx, ULONG* pEndIdx = 0 );
    void RemoveIdxFromRange( SwPaM& rPam, BOOL bMoveNext );
    void RemoveIdxRel( ULONG, const SwPosition& );

    void SetId( USHORT nNew ) { nId = nNew; }

    static BOOL CanRedlineGroup( SwRedlineSaveDatas& rCurr,
                                const SwRedlineSaveDatas& rCheck,
                                BOOL bCurrIsEnd );
public:
    SwUndo( USHORT nI ) { nId = nI; nOrigRedlineMode = REDLINE_NONE; }
    virtual ~SwUndo();

    USHORT GetId() const { return nId; }
    virtual void Undo( SwUndoIter& ) = 0;
    virtual void Redo( SwUndoIter& ) = 0;
    virtual void Repeat( SwUndoIter& );

        // das UndoObject merkt sich, welcher Mode eingeschaltet war.
        // In Undo/Redo/Repeat wird dann immer auf diesen zurueck geschaltet
    USHORT GetRedlineMode() const { return nOrigRedlineMode; }
    void SetRedlineMode( USHORT eMode ) { nOrigRedlineMode = eMode; }

        // sicher und setze die RedlineDaten
    static BOOL FillSaveData( const SwPaM& rRange, SwRedlineSaveDatas& rSData,
                            BOOL bDelRange = TRUE, BOOL bCopyNext = TRUE );
    static BOOL FillSaveDataForFmt( const SwPaM& , SwRedlineSaveDatas& );
    static void SetSaveData( SwDoc& rDoc, const SwRedlineSaveDatas& rSData );
    static BOOL HasHiddenRedlines( const SwRedlineSaveDatas& rSData );
};


// diese Klasse muss in ein Undo-Object vererbt werden, wenn dieses Inhalt
// fuers Redo/Undo ... speichert
class SwUndoSaveCntnt
{
protected:

    SwHistory* pHistory;

    // wird fuer das loeschen von Inhalt benoetigt. Fuer das ReDo werden
    // Inhalte in das UndoNodesArray verschoben. Diese Methoden fuegen
    // am Ende eines TextNodes ein Trenner fuer die Attribute. Damit werden
    // Attribute nicht expandiert.
    // MoveTo..     verschiebt aus dem NodesArray in das UndoNodesArray
    // MoveFrom..   verschiebt aus dem UndoNodesArray in das NodesArray
    void MoveToUndoNds( SwPaM& rPam,
                        SwNodeIndex* pNodeIdx = 0, SwIndex* pCntIdx = 0,
                        ULONG* pEndNdIdx = 0, xub_StrLen * pEndCntIdx = 0 );
    void MoveFromUndoNds( SwDoc& rDoc, ULONG nNodeIdx, xub_StrLen nCntntIdx,
                          SwPosition& rInsPos,
                          ULONG* pEndNdIdx = 0, xub_StrLen * pEndCntIdx = 0 );

    // diese beiden Methoden bewegen den SPoint vom Pam zurueck/vor. Damit
    // kann fuer ein Undo/Redo ein Bereich aufgespannt werden. (Der
    // SPoint liegt dann vor dem manipuliertem Bereich !!)
    // Das Flag gibt an, ob noch vorm SPoint Inhalt steht.
    BOOL MovePtBackward( SwPaM& rPam );
    void MovePtForward( SwPaM& rPam, BOOL bMvBkwrd );

    // vor dem Move ins UndoNodes-Array muss dafuer gesorgt werden, das
    // die Inhaltstragenden Attribute aus dem Nodes-Array entfernt werden.
    enum DelCntntType{  DELCNT_FTN = 0x01,
                        DELCNT_FLY = 0x02,
                        DELCNT_TOC = 0x04,
                        DELCNT_BKM = 0x08,
                        DELCNT_ALL = 0x0F,
                        DELCNT_CHKNOCNTNT = 0x80    // nur den NodeIndex beachten
                    };
    void DelCntntIndex( const SwPosition& pMark, const SwPosition& pPoint,
                        DelCntntType nDelCntntType = DELCNT_ALL );

public:
    SwUndoSaveCntnt();
    ~SwUndoSaveCntnt();
    OUT_UNDOBJ( SaveCntnt )
};


// sicher eine vollstaendige Section im Nodes-Array
class SwUndoSaveSection : private SwUndoSaveCntnt
{
    SwNodeIndex *pMvStt;
    SwRedlineSaveDatas* pRedlSaveData;
    ULONG nMvLen;           // Index ins UndoNodes-Array
    ULONG nStartPos;

protected:
    SwNodeIndex* GetMvSttIdx() const { return pMvStt; }
    ULONG GetMvNodeCnt() const { return nMvLen; }

public:
    SwUndoSaveSection();
    ~SwUndoSaveSection();

    void SaveSection( SwDoc* pDoc, const SwNodeIndex& rSttIdx );
    void SaveSection( SwDoc* pDoc, const SwNodeRange& rRange );
    void RestoreSection( SwDoc* pDoc, SwNodeIndex* pIdx, USHORT nSectType );
    void RestoreSection( SwDoc* pDoc, const SwNodeIndex& rInsPos );

    const SwHistory* GetHistory() const { return pHistory; }
          SwHistory* GetHistory()       { return pHistory; }
    OUT_UNDOBJ( SaveSection )
};


// Diese Klasse speichert den Pam als USHORT's und kann diese wieder zu
// einem PaM zusammensetzen
class SwUndRng
{
public:
    ULONG nSttNode, nEndNode;
    xub_StrLen nSttCntnt, nEndCntnt;

    SwUndRng();
    SwUndRng( const SwPaM& );

    void SetValues( const SwPaM& rPam );
    void SetPaM( SwPaM&, BOOL bCorrToCntnt = FALSE ) const;
    void SetPaM( SwUndoIter&, BOOL bCorrToCntnt = FALSE ) const;
};


class SwUndoStart: public SwUndo
{
    // Um innerhalb von Undo zuerkennen, wann ein Start vorliegt, gibt
    // GetId() immer die UNDO_START zurueck. Die UserId kann ueber
    // GetUserId() erfragt werden.
    USHORT nUserId;
    // fuer die "Verpointerung" von Start- und End-Undos
    USHORT nEndOffset;
public:
    SwUndoStart( USHORT nId );
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    virtual void Repeat( SwUndoIter& );
    USHORT GetUserId() const { return nUserId; }
    // Setzen vom End-Undo-Offset geschieht im Doc::EndUndo
    USHORT GetEndOffset() const { return nEndOffset; }
    void SetEndOffset( USHORT n ) { nEndOffset = n; }
    OUT_UNDOBJ( Start )
};

class SwUndoEnd: public SwUndo
{
    // Um innerhalb von Undo zuerkennen, wann ein Ende vorliegt, gibt
    // GetId() immer die UNDO_END zurueck. Die UserId kann ueber
    // GetUserId() erfragt werden.
    USHORT nUserId;
    // fuer die "Verpointerung" von Start- und End-Undos
    USHORT nSttOffset;
public:
    SwUndoEnd( USHORT nId );
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    virtual void Repeat( SwUndoIter& );
    USHORT GetUserId() const { return nUserId; }
    // Setzen vom Start-Undo-Offset geschieht im Doc::EndUndo
    USHORT GetSttOffset() const { return nSttOffset; }
    void SetSttOffset( USHORT n ) { nSttOffset = n; }
    OUT_UNDOBJ( End )
};

class SwUndoInsert: public SwUndo, private SwUndoSaveCntnt
{
    SwPosition *pPos;                   // Inhalt fuers Redo
    String* pTxt;
    SwRedlineData* pRedlData;
    ULONG nNode;
    xub_StrLen nCntnt, nLen;
    BOOL bIsWordDelim : 1;
    BOOL bIsAppend : 1;

    friend class SwDoc;     // eigentlich nur SwDoc::Insert( String )
    BOOL CanGrouping( sal_Unicode cIns );
    BOOL CanGrouping( const SwPosition& rPos );

public:
    SwUndoInsert( const SwNodeIndex& rNode, xub_StrLen nCntnt, xub_StrLen nLen,
                  BOOL bWDelim = TRUE );
    SwUndoInsert( const SwNodeIndex& rNode );
    virtual ~SwUndoInsert();
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    virtual void Repeat( SwUndoIter& );

    BOOL CanGrouping( const SwPosition&, sal_Unicode cIns );
    OUT_UNDOBJ( Insert )

    DECL_FIXEDMEMPOOL_NEWDEL(SwUndoInsert)
};


class SwUndoDelete: public SwUndo, private SwUndRng, private SwUndoSaveCntnt
{
    SwNodeIndex* pMvStt;            // Position der Nodes im UndoNodes-Array
    String *pSttStr, *pEndStr;
    SwRedlineData* pRedlData;
    SwRedlineSaveDatas* pRedlSaveData;

    ULONG nNode;
    ULONG nNdDiff;              // Differenz von Nodes vor-nach Delete
    ULONG nSectDiff;            // Diff. von Nodes vor/nach Move mit SectionNodes
    USHORT nSetPos;

    BOOL bGroup : 1;    // TRUE: ist schon eine Gruppe; wird in CanGrouping() ausgwertet !!
    BOOL bBackSp : 1;   // TRUE: wenn Gruppierung und der Inhalt davor geloescht wird
    BOOL bJoinNext: 1;  // TRUE: wenn der Bereich von Oben nach unten geht
    BOOL bSectNdFnd : 1;    // TRUE: Sonderbehandlung fuer SectionNodes
    BOOL bMvAroundSectNd :1;// TRUE: Sonderbehandlung fuer SectionNodes
    BOOL bTblDelLastNd : 1; // TRUE: TextNode hinter der Tabelle einf./loeschen
    BOOL bDelFullPara : 1;  // TRUE: gesamte Nodes wurden geloescht
    BOOL bResetPgDesc : 1;  // TRUE: am nachfolgenden Node das PgDsc zuruecksetzen
    BOOL bResetPgBrk : 1;   // TRUE: am nachfolgenden Node das PgBreak zuruecksetzen

    BOOL SaveCntnt( const SwPosition* pStt, const SwPosition* pEnd,
                    SwTxtNode* pSttTxtNd, SwTxtNode* pEndTxtNd );
public:
    SwUndoDelete( SwPaM&, BOOL bFullPara = FALSE );
    virtual ~SwUndoDelete();
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    virtual void Repeat( SwUndoIter& );
    BOOL CanGrouping( SwDoc*, const SwPaM& );

    void SetTblDelLastNd()      { bTblDelLastNd = TRUE; }

    // fuer die PageDesc/PageBreak Attribute einer Tabelle
    void SetPgBrkFlags( BOOL bPageBreak, BOOL bPageDesc )
        { bResetPgDesc = bPageDesc; bResetPgBrk = bPageBreak; }

    OUT_UNDOBJ( Delete )

    DECL_FIXEDMEMPOOL_NEWDEL(SwUndoDelete)
};


class SwUndoOverwrite: public SwUndo, private SwUndoSaveCntnt
{
    String aDelStr, aInsStr;
    SwRedlineSaveDatas* pRedlSaveData;
    ULONG nSttNode;
    xub_StrLen nSttCntnt;
    BOOL bInsChar : 1;      // kein Overwrite mehr; sondern Insert
    BOOL bGroup : 1;        // TRUE: ist schon eine Gruppe; wird in
                            //       CanGrouping() ausgwertet !!
public:
    SwUndoOverwrite( SwDoc*, SwPosition&, sal_Unicode cIns );
    virtual ~SwUndoOverwrite();
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    virtual void Repeat( SwUndoIter& );
    BOOL CanGrouping( SwDoc*, SwPosition&, sal_Unicode cIns );
    OUT_UNDOBJ( Overwrite )
};


class SwUndoSplitNode: public SwUndo
{
    SwHistory* pHistory;
    SwRedlineData* pRedlData;
    ULONG nNode;
    xub_StrLen nCntnt;
    BOOL bTblFlag : 1;
    BOOL bChkTblStt : 1;
public:
    SwUndoSplitNode( SwDoc* pDoc, const SwPosition& rPos, BOOL bChkTbl );
    virtual ~SwUndoSplitNode();
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    virtual void Repeat( SwUndoIter& );
    void SetTblFlag()       { bTblFlag = TRUE; }
    OUT_UNDOBJ( SplitNode )
};


class SwUndoMove : public SwUndo, private SwUndRng, private SwUndoSaveCntnt
{
    // nDest.. - Bereich, in den verschoben wurde (nach dem Move!)
    // nIns.. - Position, von der verschoben wurde und wieder die neue InsPos. ist
    // nMv.. Position auf die verschoben wird (vor dem Move!) ; fuers REDO
    ULONG nDestSttNode, nDestEndNode, nInsPosNode, nMvDestNode;
    xub_StrLen nDestSttCntnt, nDestEndCntnt, nInsPosCntnt, nMvDestCntnt;

    USHORT nFtnStt;         // StartPos der Fussnoten in der History

    BOOL bJoinNext : 1,
         bJoinPrev : 1,
         bMoveRange : 1;

    void DelFtn( const SwPaM& );
public:
    SwUndoMove( const SwPaM&, const SwPosition& );
    SwUndoMove( SwDoc* pDoc, const SwNodeRange&, const SwNodeIndex& );
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    // setze den Destination-Bereich nach dem Verschieben.
    void SetDestRange( const SwPaM&, const SwPosition&, BOOL, BOOL );
    void SetDestRange( const SwNodeIndex& rStt, const SwNodeIndex& rEnd,
                        const SwNodeIndex& rInsPos );

    BOOL IsMoveRange() const        { return bMoveRange; }
    ULONG GetEndNode() const        { return nEndNode; }
    ULONG GetDestSttNode() const    { return nDestSttNode; }
    xub_StrLen GetDestSttCntnt() const  { return nDestSttCntnt; }
    void AddTblMrgFlyHstry( SwHistory& rHstr );

    OUT_UNDOBJ( Move )
};


class SwUndoAttr : public SwUndo, private SwUndRng
{
    SfxItemSet aSet;                // Attribute fuers Redo
    SwHistory* pHistory;            // History fuers Undo
    SwRedlineData* pRedlData;       // Redlining
    SwRedlineSaveDatas* pRedlSaveData;
    ULONG nNdIdx;                   // fuers Redlining - Offset
    USHORT nInsFlags;               // Einfuege Flags

    void RemoveIdx( SwDoc& rDoc );
public:
    SwUndoAttr( const SwPaM&, const SfxItemSet&, USHORT nFlags = 0  );
    SwUndoAttr( const SwPaM&, const SfxPoolItem&, USHORT nFlags = 0 );
    virtual ~SwUndoAttr();
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    virtual void Repeat( SwUndoIter& );
    SwHistory* GetHistory() { return pHistory; }
    void SaveRedlineData( const SwPaM& rPam, BOOL bInsCntnt );

    OUT_UNDOBJ( InsAttr )
};

class SwUndoRstAttr : public SwUndo, private SwUndRng
{
    SwHistory* pHistory;
    SvUShortsSort aIds;
    USHORT nFmtId;                  // Format-Id fuer das Redo
public:
    SwUndoRstAttr( const SwPaM&, USHORT nFmtId );
    SwUndoRstAttr( const SwDoc&, const SwPosition&, USHORT nWhichId );
    virtual ~SwUndoRstAttr();
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    virtual void Repeat( SwUndoIter& );
    void SetAttrs( const SvUShortsSort& rArr );
    SwHistory* GetHistory() { return pHistory; }
    OUT_UNDOBJ( ResetAttr )
};


class SwUndoFmtAttr : public SwUndo
{
    friend class SwUndoDefaultAttr;
    SwFmt* pFmt;
    SfxItemSet* pOldSet;            // die alten Attribute
    ULONG nNode;
    USHORT nFmtWhich;
    BOOL bSaveDrawPt;

    int IsFmtInDoc( SwDoc* );       // ist das Attribut-Format noch im Doc ?
    void SaveFlyAnchor( BOOL bSaveDrawPt = FALSE );
    void RestoreFlyAnchor( SwUndoIter& rIter );
    void Init();

public:
    // meldet sich im Format an und sichert sich die alten Attribute
    SwUndoFmtAttr( const SfxItemSet& rOldSet, SwFmt& rFmt,
                    BOOL bSaveDrawPt = TRUE );
    SwUndoFmtAttr( const SfxPoolItem& rItem, SwFmt& rFmt,
                    BOOL bSaveDrawPt = TRUE );
    virtual ~SwUndoFmtAttr();
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    virtual void Repeat( SwUndoIter& );
    OUT_UNDOBJ( InsFmtAttr )

    void PutAttr( const SfxPoolItem& rItem );
    SwFmt* GetFmt( SwDoc& rDoc );       // prueft, ob es noch im Doc ist!
};

class SwUndoDontExpandFmt : public SwUndo
{
    ULONG nNode;
    xub_StrLen nCntnt;
public:
    SwUndoDontExpandFmt( const SwPosition& rPos );
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    virtual void Repeat( SwUndoIter& );
};

// Hilfs-Klasse, um die geaenderten Sets zu "empfangen"
struct _UndoFmtAttr : public SwClient
{
    SwUndoFmtAttr* pUndo;
    BOOL bSaveDrawPt;

    _UndoFmtAttr( SwFmt& rFmt, BOOL bSaveDrawPt = TRUE );
    virtual void Modify( SfxPoolItem*, SfxPoolItem* );
};


class SwUndoFmtColl : public SwUndo, private SwUndRng
{
    SwHistory* pHistory;
    SwFmtColl* pFmtColl;
public:
    SwUndoFmtColl( const SwPaM&, SwFmtColl* );
    virtual ~SwUndoFmtColl();
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    virtual void Repeat( SwUndoIter& );
    SwHistory* GetHistory() { return pHistory; }
    OUT_UNDOBJ( SetFmtColl )
};


class SwUndoMoveLeftMargin : public SwUndo, private SwUndRng
{
    SwHistory* pHistory;
    BOOL bModulus;
public:
    SwUndoMoveLeftMargin( const SwPaM&, BOOL bRight, BOOL bModulus );
    virtual ~SwUndoMoveLeftMargin();
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    virtual void Repeat( SwUndoIter& );
    SwHistory* GetHistory() { return pHistory; }
    OUT_UNDOBJ( MoveLeftMargin )
};

// Basis-Klasse fuer Insert von Dokument, Glossaries und Kopieren
class SwUndoInserts : public SwUndo, public SwUndRng, private SwUndoSaveCntnt
{
    SwTxtFmtColl *pTxtFmtColl, *pLastNdColl;
    SvPtrarr* pFrmFmts;
    SwUndos* pFlyUndos;
    SwRedlineData* pRedlData;
    BOOL bSttWasTxtNd;
protected:
    ULONG nNdDiff;
    SwPosition *pPos;                   // Inhalt fuers Redo
    USHORT nSetPos;                     // Start in der History-Liste

    SwUndoInserts( USHORT nUndoId, const SwPaM& );
public:
    virtual ~SwUndoInserts();

    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    virtual void Repeat( SwUndoIter& );
    // setze den Destination-Bereich nach dem Einlesen.
    void SetInsertRange( const SwPaM&, BOOL bScanFlys = TRUE,
                        BOOL bSttWasTxtNd = TRUE );
    OUT_UNDOBJ( Inserts )
};

class SwUndoInsDoc : public SwUndoInserts
{
public:
    SwUndoInsDoc( const SwPaM& );
    OUT_UNDOBJ( InsDoc )
};

class SwUndoCpyDoc : public SwUndoInserts
{
public:
    SwUndoCpyDoc( const SwPaM& );
    OUT_UNDOBJ( Copy )
};

class SwUndoInsTbl : public SwUndo
{
    String sTblNm;
    SwDDEFieldType* pDDEFldType;
    SvUShorts* pColWidth;
    SwRedlineData*  pRedlData;
    SwTableAutoFmt* pAutoFmt;
    ULONG nSttNode;
    USHORT nRows, nCols;
    USHORT nAdjust;
    USHORT nInsTblFlags;

public:
    SwUndoInsTbl( const SwPosition&, USHORT nCols, USHORT nRows,
                    USHORT eAdjust, USHORT nInsert,
                    const SwTableAutoFmt* pTAFmt, const SvUShorts* pColArr );
    virtual ~SwUndoInsTbl();
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    virtual void Repeat( SwUndoIter& );
    OUT_UNDOBJ( InsTable )
};

class SwUndoTxtToTbl : public SwUndo, public SwUndRng
{
    String sTblNm;
    SvULongs* pDelBoxes;
    SwTableAutoFmt* pAutoFmt;
    SwHistory* pHistory;
    sal_Unicode cTrenner;
    USHORT nAdjust;
    USHORT nInsTblFlags;
    BOOL bSplitEnd : 1;

public:
    SwUndoTxtToTbl( const SwPaM&, sal_Unicode , USHORT, USHORT nInsert,
                    const SwTableAutoFmt* pAFmt );
    virtual ~SwUndoTxtToTbl();

    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    virtual void Repeat( SwUndoIter& );

    SwHistory& GetHistory();        // wird ggfs. angelegt
    void AddFillBox( const SwTableBox& rBox );
    OUT_UNDOBJ( TextToTable )
};

class SwUndoTblToTxt : public SwUndo
{
    String sTblNm;
    SwDDEFieldType* pDDEFldType;
    _SaveTable* pTblSave;
    SwTblToTxtSaves* pBoxSaves;
    SwHistory* pHistory;
    ULONG nSttNd, nEndNd;
    USHORT nAdjust;
    sal_Unicode cTrenner;
    BOOL bCheckNumFmt : 1;
    BOOL bHdlnRpt : 1;

public:
    SwUndoTblToTxt( const SwTable& rTbl, sal_Unicode cCh );
    virtual ~SwUndoTblToTxt();
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    virtual void Repeat( SwUndoIter& );

    void SetRange( const SwNodeRange& );
    void AddBoxPos( SwDoc& rDoc, ULONG nNdIdx,
                    xub_StrLen nCntntIdx = STRING_MAXLEN);
    OUT_UNDOBJ( TableToText )
};

class SwUndoAttrTbl : public SwUndo
{
    ULONG nSttNode;
    _SaveTable* pSaveTbl;
    BOOL bClearTabCol : 1;
public:
    SwUndoAttrTbl( const SwTableNode& rTblNd, BOOL bClearTabCols = FALSE );
    virtual ~SwUndoAttrTbl();
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    OUT_UNDOBJ( SetTableAttr )
};

class SwUndoTblAutoFmt : public SwUndo
{
    ULONG nSttNode;
    _SaveTable* pSaveTbl;
    SwUndos* pUndos;
    BOOL bSaveCntntAttr;

    void UndoRedo( BOOL bUndo, SwUndoIter& rUndoIter );

public:
    SwUndoTblAutoFmt( const SwTableNode& rTblNd, const SwTableAutoFmt& );
    virtual ~SwUndoTblAutoFmt();
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    void SaveBoxCntnt( const SwTableBox& rBox );
    OUT_UNDOBJ( TableAutoFmt )
};

class SwUndoTblNdsChg : public SwUndo
{
    _SaveTable* pSaveTbl;
    SvULongs aBoxes;

    union {
        SvULongs* pNewSttNds;
        SwUndoSaveSections* pDelSects;
    } Ptrs;
    SvBools aMvBoxes;       // fuers SplitRow (aufgeteilte Nodes einer Box)

    ULONG nSttNode, nCurrBox;
    USHORT nCount, nRelDiff, nAbsDiff, nSetColType;
    BOOL bFlag;
public:
    SwUndoTblNdsChg( USHORT UndoId,
                    const SwSelBoxes& rBoxes,
                    const SwTableNode& rTblNd,
                    USHORT nCnt, BOOL bFlg );

    // fuer SetColWidth
    SwUndoTblNdsChg( USHORT UndoId, const SwSelBoxes& rBoxes,
                    const SwTableNode& rTblNd );

    virtual ~SwUndoTblNdsChg();
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );

    void SaveNewBoxes( const SwTableNode& rTblNd, const SwTableSortBoxes& rOld );
    void SaveNewBoxes( const SwTableNode& rTblNd, const SwTableSortBoxes& rOld,
                       const SwSelBoxes& rBoxes, const SvULongs& rNodeCnts );
    void SaveSection( SwStartNode* pSttNd );

    void SetColWidthParam( ULONG nBoxIdx, USHORT nMode, USHORT nType,
                            SwTwips nAbsDif, SwTwips nRelDif )
    {
        nCurrBox = nBoxIdx;
        nCount = nMode;
        nSetColType = nType;
        nAbsDiff = (USHORT)nAbsDif;
        nRelDiff = (USHORT)nRelDif;
    }
    OUT_UNDOBJ( TblNodesChg )
};

class SwUndoTblMerge : public SwUndo, private SwUndRng
{
    ULONG nTblNode;
    _SaveTable* pSaveTbl;
    SvULongs aBoxes, aNewSttNds;
    SwUndoMoves* pMoves;
    SwHistory* pHistory;

public:
    SwUndoTblMerge( const SwPaM& rTblSel );
    virtual ~SwUndoTblMerge();
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );

    void MoveBoxCntnt( SwPaM& rPam, SwPosition& rPos, const _SaveFlyArr& );
    void MoveBoxCntnt( SwDoc* pDoc, SwNodeRange& rRg, SwNodeIndex& rPos );

    void SetSelBoxes( const SwSelBoxes& rBoxes );

    void AddNewBox( ULONG nSttNdIdx )
        { aNewSttNds.Insert( nSttNdIdx, aNewSttNds.Count() ); }

    void SaveCollection( const SwTableBox& rBox );

    OUT_UNDOBJ( TblMerge )
};


class SwUndoTblNumFmt : public SwUndo
{
    SfxItemSet *pBoxSet;
    SwHistory* pHistory;
    String aStr, aNewFml;

    ULONG nFmtIdx, nNewFmtIdx;
    double fNum, fNewNum;
    ULONG nNode;

    BOOL bNewFmt : 1;
    BOOL bNewFml : 1;
    BOOL bNewValue : 1;

public:
    SwUndoTblNumFmt( const SwTableBox& rBox, const SfxItemSet* pNewSet = 0 );
    virtual ~SwUndoTblNumFmt();
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );

    void SetNumFmt( ULONG nNewFmtIdx, const double& rNewNumber )
            { nFmtIdx = nNewFmtIdx; fNum = rNewNumber; }
    void SetBox( const SwTableBox& rBox );
    OUT_UNDOBJ( TblNumFmt )
};

class _UndoTblCpyTbl_Entries;

class SwUndoTblCpyTbl : public SwUndo
{
    _UndoTblCpyTbl_Entries* pArr;
    SwUndoTblNdsChg* pInsRowUndo;
public:
    SwUndoTblCpyTbl();
    virtual ~SwUndoTblCpyTbl();
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );

    void AddBoxBefore( const SwTableBox& rBox, BOOL bDelCntnt );
    void AddBoxAfter( const SwTableBox& rBox, BOOL bDelCntnt );

    BOOL IsEmpty() const;
    BOOL InsertRow( SwTable& rTbl, const SwSelBoxes& rBoxes, USHORT nCnt );
    OUT_UNDOBJ( TblCpyTbl )
};

class SwUndoCpyTbl : public SwUndo
{
    SwUndoDelete* pDel;
    ULONG nTblNode;
public:
    SwUndoCpyTbl();
    virtual ~SwUndoCpyTbl();
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );

    void SetTableSttIdx( ULONG nIdx )           { nTblNode = nIdx; }
    OUT_UNDOBJ( CpyTbl )
};

class SwUndoSplitTbl : public SwUndo
{
    ULONG nTblNode, nOffset;
    _SaveTable* pSavTbl;
    SwHistory* pHistory;
    USHORT nMode, nFmlEnd;
    BOOL bCalcNewSize;
public:
    SwUndoSplitTbl( const SwTableNode& rTblNd, USHORT nMode, BOOL bCalcNewSize );
    virtual ~SwUndoSplitTbl();
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    virtual void Repeat( SwUndoIter& );

    void SetTblNodeOffset( ULONG nIdx )     { nOffset = nIdx - nTblNode; }
    SwHistory* GetHistory()                 { return pHistory; }
    void SaveFormula( SwHistory& rHistory );
};

class SwUndoMergeTbl : public SwUndo
{
    String aName;
    ULONG nTblNode;
    _SaveTable* pSavTbl, *pSavHdl;
    SwHistory* pHistory;
    USHORT nMode;
    BOOL bWithPrev;
public:
    SwUndoMergeTbl( const SwTableNode& rTblNd, const SwTableNode& rDelTblNd,
                    BOOL bWithPrev, USHORT nMode );
    virtual ~SwUndoMergeTbl();
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    virtual void Repeat( SwUndoIter& );

    SwHistory* GetHistory()                 { return pHistory; }
    void SaveFormula( SwHistory& rHistory );
};


class SwUndoBookmark : public SwUndo
{
    SwHstryBookmark* pHBookmark;
protected:
    SwUndoBookmark( USHORT nUndoId, const SwBookmark& );

    void SetInDoc( SwDoc* );
    void ResetInDoc( SwDoc* );

public:
    virtual ~SwUndoBookmark();
};


class SwUndoDelBookmark : public SwUndoBookmark
{
public:
    SwUndoDelBookmark( const SwBookmark& );
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    OUT_UNDOBJ( DelBookmark )
};

class SwUndoInsBookmark : public SwUndoBookmark
{
public:
    SwUndoInsBookmark( const SwBookmark& );
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    OUT_UNDOBJ( InsBookmark )
};


/*--------------------------------------------------------------------
    Beschreibung: Undo auf Sorting
 --------------------------------------------------------------------*/

struct SwSortUndoElement
{
    union {
        struct {
            ULONG nKenn;
            ULONG nSource, nTarget;
        } TXT;
        struct {
            String *pSource, *pTarget;
        } TBL;
    } SORT_TXT_TBL;

    SwSortUndoElement( const String& aS, const String& aT )
    {
        SORT_TXT_TBL.TBL.pSource = new String( aS );
        SORT_TXT_TBL.TBL.pTarget = new String( aT );
    }
    SwSortUndoElement( ULONG nS, ULONG nT )
    {
        SORT_TXT_TBL.TXT.nSource = nS;
        SORT_TXT_TBL.TXT.nTarget = nT;
        SORT_TXT_TBL.TXT.nKenn   = 0xffffffff;
    }
    ~SwSortUndoElement();
};

SV_DECL_PTRARR_DEL(SwSortList, SwSortUndoElement*, 10,30)
SV_DECL_PTRARR(SwUndoSortList, SwNodeIndex*, 10,30)

class SwUndoSort : public SwUndo, private SwUndRng
{
    SwSortOptions*  pSortOpt;       // die Optionen mit den Sortier-Kriterien
    SwSortList      aSortList;
    SwUndoAttrTbl*  pUndoTblAttr;
    SwRedlineData*  pRedlData;
    ULONG           nTblNd;

    void RemoveIdx( SwPaM& rPam );
public:
    SwUndoSort( const SwPaM&, const SwSortOptions& );
    SwUndoSort( ULONG nStt, ULONG nEnd, const SwTableNode&,
                const SwSortOptions&, BOOL bSaveTable );
    virtual ~SwUndoSort();

    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    virtual void Repeat( SwUndoIter& );

    void Insert( const String& rOrgPos, const String& rNewPos );
    void Insert( ULONG nOrgPos, ULONG nNewPos );

    OUT_UNDOBJ( Sort )
};



//--------------------------------------------------------------------

class SwUndoFlyBase : public SwUndo, private SwUndoSaveSection
{
protected:
    SwFrmFmt* pFrmFmt;                  // das gespeicherte FlyFormat
    ULONG nNdPgPos;
    xub_StrLen nCntPos;                 // Seite/am Absatz/im Absatz
    USHORT nRndId;
    BOOL bDelFmt;                       // loesche das gespeicherte Format

    void InsFly( SwUndoIter&, BOOL bShowSel = TRUE );
    void DelFly( SwDoc* );

    SwUndoFlyBase( SwFrmFmt* pFormat, USHORT nUndoId );

    SwNodeIndex* GetMvSttIdx() const { return SwUndoSaveSection::GetMvSttIdx(); }
    ULONG GetMvNodeCnt() const { return SwUndoSaveSection::GetMvNodeCnt(); }

public:
    virtual ~SwUndoFlyBase();

    virtual void Undo( SwUndoIter& ) = 0;
    virtual void Redo( SwUndoIter& ) = 0;
    OUT_UNDOBJ( FlyBase )
};

class SwUndoInsLayFmt : public SwUndoFlyBase
{
public:
    SwUndoInsLayFmt( SwFrmFmt* pFormat );

    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    virtual void Repeat( SwUndoIter& );
    OUT_UNDOBJ( InsLayFmt )
};

class SwUndoDelLayFmt : public SwUndoFlyBase
{
    BOOL bShowSelFrm;
public:
    SwUndoDelLayFmt( SwFrmFmt* pFormat );

    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    void Redo();        // Schnittstelle fuers Rollback

    void ChgShowSel( BOOL bNew ) { bShowSelFrm = bNew; }
    BOOL GetShowSel() const { return bShowSelFrm; }
    OUT_UNDOBJ( DelLayFmt )
};


class SwUndoSetFlyFmt : public SwUndo, public SwClient
{
    SwFrmFmt* pFrmFmt;                  // das gespeicherte FlyFormat
    SwFrmFmt* pOldFmt;                  // die alte Fly Vorlage
    SwFrmFmt* pNewFmt;                  // die neue Fly Vorlage
    SfxItemSet* pItemSet;               // die zurueck-/ gesetzten Attribute
    ULONG nOldNode, nNewNode;
    xub_StrLen nOldCntnt, nNewCntnt;
    USHORT nOldAnchorTyp, nNewAnchorTyp;
    BOOL bAnchorChgd;

    void PutAttr( USHORT nWhich, const SfxPoolItem* pItem );
    void Modify( SfxPoolItem*, SfxPoolItem* );
    void GetAnchor( SwFmtAnchor& rAnhor, ULONG nNode, xub_StrLen nCntnt );

public:
    SwUndoSetFlyFmt( SwFrmFmt& rFlyFmt, SwFrmFmt& rNewFrmFmt );
    virtual ~SwUndoSetFlyFmt();

    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
};

//--------------------------------------------------------------------

class _UnReplaceData;
SV_DECL_PTRARR_DEL( _UnReplaceDatas, _UnReplaceData*, 10, 25 );

class SwUndoReplace : public SwUndo
{
    friend class SwDoc;

    BOOL bOldIterFlag;      // Status vom Undo-Iter vorm 1. Aufruf
    USHORT nAktPos;         // fuer GetUndoRange und Undo/Redo
    _UnReplaceDatas aArr;
    SwRedlineData* pRedlData;

public:
    SwUndoReplace();
    virtual ~SwUndoReplace();
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );

    void AddEntry( const SwPaM& rPam, const String& rInsert, BOOL bRegExp );
    void SetEntryEnd( const SwPaM& rPam );

    BOOL IsFull() const
        { return ((USHRT_MAX / sizeof( void* )) - 50 ) < aArr.Count(); }

    OUT_UNDOBJ( Replace )
};


//--------------------------------------------------------------------


class SwUndoTblHeadline : public SwUndo
{
    ULONG nTblNd;
    BOOL bOldHeadline;
public:
    SwUndoTblHeadline( const SwTable&, BOOL bOldHdl );
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    virtual void Repeat( SwUndoIter& );
    OUT_UNDOBJ( SwUndoTblHeadline )
};


//------------ Undo von Insert-/Delete-Sections ----------------------

class SwUndoInsSection : public SwUndo, private SwUndRng
{
    SwHistory* pHistory;
    SwSection* pSection;
    SwRedlineData* pRedlData;
    SfxItemSet* pAttr;
    ULONG nSectNodePos;
    BOOL bSplitAtStt : 1;
    BOOL bSplitAtEnd : 1;
    BOOL bUpdateFtn : 1;

    void Join( SwDoc& rDoc, ULONG nNode );

public:
    SwUndoInsSection( const SwPaM&, const SwSection&,
                        const SfxItemSet* pSet );
    virtual ~SwUndoInsSection();
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    virtual void Repeat( SwUndoIter& );
    OUT_UNDOBJ( SwUndoInsSection )

    void SetSectNdPos( ULONG nPos )         { nSectNodePos = nPos; }
    void SaveSplitNode( SwTxtNode* pTxtNd, BOOL bAtStt );
    void SetUpdtFtnFlag( BOOL bFlag )       { bUpdateFtn = bFlag; }
};

class SwUndoDelSection : public SwUndo
{
    ULONG nSttNd, nEndNd;
    SwSection* pSection;
    SfxItemSet* pAttr;
public:
    SwUndoDelSection( const SwSectionFmt& );
    virtual ~SwUndoDelSection();
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    OUT_UNDOBJ( SwUndoDelSection )
};

class SwUndoChgSection : public SwUndo
{
    ULONG nSttNd;
    SwSection* pSection;
    SfxItemSet* pAttr;
    BOOL bOnlyAttrChgd;
public:
    SwUndoChgSection( const SwSectionFmt&, BOOL bOnlyAttrChgd );
    virtual ~SwUndoChgSection();
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    OUT_UNDOBJ( SwUndoChgSection )
};

class SwUndoChgSectPsswd : public SwUndo
{
    String sPasswd;
public:
    SwUndoChgSectPsswd( const String& rOld );
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    OUT_UNDOBJ( SwUndoChgSectPsswd )
};

//------------ Undo von verschieben/stufen von Gliederung ----------------

class SwUndoOutlineLeftRight : public SwUndo, private SwUndRng
{
    short nOffset;
public:
    SwUndoOutlineLeftRight( const SwPaM& rPam, short nOffset );
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    virtual void Repeat( SwUndoIter& );
    OUT_UNDOBJ( SwUndoOutlineLeftRight )
};

//--------------------------------------------------------------------

class SwUndoDefaultAttr : public SwUndo
{
    SfxItemSet* pOldSet;            // die alten Attribute
    SvxTabStopItem* pTabStop;
public:
    // meldet sich im Format an und sichert sich die alten Attribute
    SwUndoDefaultAttr( const SfxItemSet& rOldSet );
    virtual ~SwUndoDefaultAttr();
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    OUT_UNDOBJ( DefaultAttr )
};

//--------------------------------------------------------------------
// ---------- Undo fuer Numerierung ----------------------------------

class SwUndoInsNum : public SwUndo, private SwUndRng
{
    SwNumRule aNumRule;
    SwHistory* pHistory;
    ULONG nSttSet;
    SwNumRule* pOldNumRule;
    String sReplaceRule;
    USHORT nLRSavePos;
public:
    SwUndoInsNum( const SwPaM& rPam, const SwNumRule& rRule );
    SwUndoInsNum( const SwNumRule& rOldRule, const SwNumRule& rNewRule );
    SwUndoInsNum( const SwPosition& rPos, const SwNumRule& rRule,
                            const String& rReplaceRule );
    virtual ~SwUndoInsNum();
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    virtual void Repeat( SwUndoIter& );

    SwHistory* GetHistory();        // wird ggfs. neu angelegt!
    void SetSttNum( ULONG nNdIdx ) { nSttSet = nNdIdx; }
    void SaveOldNumRule( const SwNumRule& rOld );

    void SetLRSpaceEndPos();

    OUT_UNDOBJ( InsNum )
};

class SwUndoDelNum : public SwUndo, private SwUndRng
{
    SvULongs aNodeIdx;
    SvBytes aLevels;
    SvBools aRstLRSpaces;
    SwHistory* pHistory;
public:
    SwUndoDelNum( const SwPaM& rPam );
    virtual ~SwUndoDelNum();
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    virtual void Repeat( SwUndoIter& );

    void AddNode( const SwTxtNode& rNd, BOOL bResetLRSpace );
    SwHistory* GetHistory() { return pHistory; }

    OUT_UNDOBJ( DelNum )
};

class SwUndoMoveNum : public SwUndo, private SwUndRng
{
    ULONG nNewStt;
    long nOffset;
public:
    SwUndoMoveNum( const SwPaM& rPam, long nOffset, BOOL bIsOutlMv = FALSE );
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    virtual void Repeat( SwUndoIter& );
    void SetStartNode( ULONG nValue ) { nNewStt = nValue; }
    OUT_UNDOBJ( MoveNum )
};

class SwUndoNumUpDown : public SwUndo, private SwUndRng
{
    short nOffset;
public:
    SwUndoNumUpDown( const SwPaM& rPam, short nOffset );
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    virtual void Repeat( SwUndoIter& );
    OUT_UNDOBJ( NumUpDown )
};

class SwUndoNumOrNoNum : public SwUndo
{
    ULONG nIdx;
    BOOL bDel : 1;
    BOOL bOutline : 1;
public:
    SwUndoNumOrNoNum( const SwNodeIndex& rIdx, BOOL bDelete, BOOL bOutline );
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    virtual void Repeat( SwUndoIter& );
    OUT_UNDOBJ( NumOrNoNum )
};

class SwUndoNumRuleStart : public SwUndo
{
    ULONG nIdx;
    USHORT nOldStt, nNewStt;
    BOOL bSetSttValue : 1;
    BOOL bFlag : 1;
public:
    SwUndoNumRuleStart( const SwPosition& rPos, BOOL bDelete );
    SwUndoNumRuleStart( const SwPosition& rPos, USHORT nStt );
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    virtual void Repeat( SwUndoIter& );
    OUT_UNDOBJ( NumRuleStart )
};

//--------------------------------------------------------------------
// ---------- Undo fuer DrawObjecte ----------------------------------

class SwSdrUndo : public SwUndo
{
    SdrUndoAction* pSdrUndo;
    SdrMarkList* pMarkList; // MarkList for all selected SdrObjects
public:
    SwSdrUndo( SdrUndoAction* , const SdrMarkList* pMarkList );
    virtual ~SwSdrUndo();
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );

    String GetComment() const;
};

class SwUndoDrawGroup : public SwUndo
{
    SwUndoGroupObjImpl* pObjArr;
    USHORT nSize;
    BOOL bDelFmt;

public:
    SwUndoDrawGroup( USHORT nCnt );
    virtual ~SwUndoDrawGroup();
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );

    void AddObj( USHORT nPos, SwDrawFrmFmt*, SdrObject* );
    void SetGroupFmt( SwDrawFrmFmt* );
};

class SwUndoDrawUnGroup : public SwUndo
{
    SwUndoGroupObjImpl* pObjArr;
    USHORT nSize;
    BOOL bDelFmt;

public:
    SwUndoDrawUnGroup( SdrObjGroup* );
    virtual ~SwUndoDrawUnGroup();
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );

    void AddObj( USHORT nPos, SwDrawFrmFmt* );
};

class SwUndoDrawDelete : public SwUndo
{
    SwUndoGroupObjImpl* pObjArr;
    USHORT nSize;
    BOOL bDelFmt;

public:
    SwUndoDrawDelete( USHORT nCnt );
    virtual ~SwUndoDrawDelete();
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );

    void AddObj( USHORT nPos, SwDrawFrmFmt*, SdrObject* );
};

//--------------------------------------------------------------------

class SwUndoReRead : public SwUndo
{
    Graphic *pGrf;
    String *pNm, *pFltr;
    ULONG nPos;
    USHORT nMirr;

    void SaveGraphicData( const SwGrfNode& );
    void SetAndSave( SwUndoIter& );

public:
    SwUndoReRead( const SwPaM& rPam, const SwGrfNode& pGrfNd );
    virtual ~SwUndoReRead();

    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
};

//--------------------------------------------------------------------

class SwUndoInsertLabel : public SwUndo
{
    union {
        struct {
            // fuer NoTxtFrms
            SwUndoInsLayFmt* pUndoFly;
            SwUndoFmtAttr* pUndoAttr;
        } OBJECT;
        struct {
            // fuer Tabelle/TextRahmen
            SwUndoDelete* pUndoInsNd;
            ULONG nNode;
        } NODE;
    };

    String sText;
    Point aPos;                 // fuer Zeichen-Objekte
    USHORT nFldId;
    SwLabelType eType;
    BYTE nLayerId;              // fuer Zeichen-Objekte
    BOOL bBefore        :1;
    BOOL bUndoKeep      :1;
    BOOL bCpyBrd        :1;

public:
    SwUndoInsertLabel( const SwLabelType eTyp, const String &rText,
                        const BOOL bBefore, const USHORT nId,
                        const BOOL bCpyBrd );
    virtual ~SwUndoInsertLabel();

    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    virtual void Repeat( SwUndoIter& );

    void SetNodePos( ULONG nNd )
        { if( LTYPE_OBJECT != eType ) NODE.nNode = nNd; }

    void SetUndoKeep()  { bUndoKeep = TRUE; }
    void SetFlys( SwFrmFmt& rOldFly, SfxItemSet& rChgSet, SwFrmFmt& rNewFly );
    void SetDrawObj( const Point& rPos, BYTE nLayerId );
};

//--------------------------------------------------------------------

class SwUndoChgFtn : public SwUndo, private SwUndRng
{
    SwHistory* pHistory;
    String sTxt;
    USHORT nNo;
    BOOL bEndNote;
public:
    SwUndoChgFtn( const SwPaM& rRange, const String& rTxt,
                    USHORT nNum, BOOL bIsEndNote );
    virtual ~SwUndoChgFtn();

    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
    virtual void Repeat( SwUndoIter& );

    SwHistory* GetHistory() { return pHistory; }
};

class SwUndoFtnInfo : public SwUndo
{
    SwFtnInfo *pFtnInfo;

public:
    SwUndoFtnInfo( const SwFtnInfo &rInfo );
    virtual ~SwUndoFtnInfo();

    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
};

class SwUndoEndNoteInfo : public SwUndo
{
    SwEndNoteInfo *pEndNoteInfo;

public:
    SwUndoEndNoteInfo( const SwEndNoteInfo &rInfo );
    virtual ~SwUndoEndNoteInfo();

    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
};


//--------------------------------------------------------------------

class SwUndoRedline : public SwUndo, public SwUndRng
{
protected:
    SwRedlineData* pRedlData;
    SwRedlineSaveDatas* pRedlSaveData;
    USHORT nUserId;
    BOOL bHiddenRedlines;

    virtual void _Undo( SwUndoIter& );
    virtual void _Redo( SwUndoIter& );

public:
    SwUndoRedline( USHORT nUserId, const SwPaM& rRange );
    virtual ~SwUndoRedline();
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );

    USHORT GetUserId() const { return nUserId; }
    USHORT GetRedlSaveCount() const
        { return pRedlSaveData ? pRedlSaveData->Count() : 0; }
};

class SwUndoRedlineDelete : public SwUndoRedline
{
    BOOL bCanGroup : 1;
    BOOL bIsDelim : 1;
    BOOL bIsBackspace : 1;

    virtual void _Undo( SwUndoIter& );
    virtual void _Redo( SwUndoIter& );

public:
    SwUndoRedlineDelete( const SwPaM& rRange, USHORT nUserId = 0 );

    BOOL CanGrouping( const SwUndoRedlineDelete& rPrev );
};

class SwUndoRedlineSort : public SwUndoRedline
{
    SwSortOptions* pOpt;
    ULONG nSaveEndNode, nOffset;
    xub_StrLen nSaveEndCntnt;

    virtual void _Undo( SwUndoIter& );
    virtual void _Redo( SwUndoIter& );

public:
    SwUndoRedlineSort( const SwPaM& rRange, const SwSortOptions& rOpt );
    virtual ~SwUndoRedlineSort();
    virtual void Repeat( SwUndoIter& );

    void SetSaveRange( const SwPaM& rRange );
    void SetOffset( const SwNodeIndex& rIdx );
};

class SwUndoAcceptRedline : public SwUndoRedline
{
    virtual void _Redo( SwUndoIter& );
public:
    SwUndoAcceptRedline( const SwPaM& rRange );
    virtual void Repeat( SwUndoIter& );
};

class SwUndoRejectRedline : public SwUndoRedline
{
    virtual void _Redo( SwUndoIter& );
public:
    SwUndoRejectRedline( const SwPaM& rRange );
    virtual void Repeat( SwUndoIter& );
};

//--------------------------------------------------------------------

class SwUndoCompDoc : public SwUndo, public SwUndRng
{
    SwRedlineData* pRedlData;
    SwUndoDelete* pUnDel;
    SwRedlineSaveDatas* pRedlSaveData;
    BOOL bInsert;
public:
    SwUndoCompDoc( const SwPaM& rRg, BOOL bIns );
    SwUndoCompDoc( const SwRedline& rRedl );

    virtual ~SwUndoCompDoc();
    virtual void Undo( SwUndoIter& );
    virtual void Redo( SwUndoIter& );
};


//--------------------------------------------------------------------

// Object der als Iterator durch die Undo-Liste laeuft, bis die
// letze oder die angegebene Klammerung/Id erreicht ist.

class SwUndoIter
{
    friend class SwDoc;     // um im SwDoc::Undo  bWeiter zu stezen
    friend void SwUndoEnd::Undo( SwUndoIter& );
    friend void SwUndoStart::Undo( SwUndoIter& );
    friend void SwUndoEnd::Redo( SwUndoIter& );
    friend void SwUndoStart::Redo( SwUndoIter& );
    friend void SwUndoEnd::Repeat( SwUndoIter& );
    friend void SwUndoStart::Repeat( SwUndoIter& );
    friend void SwUndoReplace::Undo( SwUndoIter& );
    friend void SwUndoReplace::Redo( SwUndoIter& );

    USHORT nUndoId;
    USHORT nEndCnt;
    BOOL bWeiter : 1;
    BOOL bUpdateAttr : 1;   // Setze das GCAttr an der CursorShell

public:
    SwPaM * pAktPam;        // Member fuer das Undo
    SwUndo* pLastUndoObj;   // fuers Redo, das vorherige UndoObj.
    SwFrmFmt* pSelFmt;      // ggfs. das Format Rahmen/Object-Selektionen
    SdrMarkList* pMarkList; // MarkList for all selected SdrObjects

    SwUndoIter( SwPaM * pPam, USHORT nId = 0 );

    BOOL IsNextUndo() const             { return bWeiter; }
    BOOL IsUpdateAttr() const           { return bUpdateAttr; }
    void SetUpdateAttr( BOOL bNew )     { bUpdateAttr = bNew; }

    inline SwDoc& GetDoc() const;
    USHORT GetId() const    { return nUndoId; }
    USHORT GetLastUndoId() const
        { return  pLastUndoObj ? pLastUndoObj->GetId() : 0 ; }
    void ClearSelections()  { pSelFmt = 0; pMarkList = 0; }
};




#endif
diff --git a/sw/inc/unoatxt.hxx b/sw/inc/unoatxt.hxx
new file mode 100644
index 0000000..dd68f25
--- /dev/null
+++ b/sw/inc/unoatxt.hxx
@@ -0,0 +1,277 @@
/*************************************************************************
 *
 *  $RCSfile: unoatxt.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:29 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _UNOATXT_HXX
#define _UNOATXT_HXX

#ifndef _COM_SUN_STAR_TEXT_XAUTOTEXTGROUP_HPP_
#include <com/sun/star/text/XAutoTextGroup.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XAUTOTEXTENTRY_HPP_
#include <com/sun/star/text/XAutoTextEntry.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XAUTOTEXTCONTAINER_HPP_
#include <com/sun/star/text/XAutoTextContainer.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXT_HPP_
#include <com/sun/star/text/XText.hpp>
#endif
#ifndef _COM_SUN_STAR_LANG_XSERVICEINFO_HPP_
#include <com/sun/star/lang/XServiceInfo.hpp>
#endif
#ifndef _COM_SUN_STAR_LANG_XUNOTUNNEL_HPP_
#include <com/sun/star/lang/XUnoTunnel.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XNAMED_HPP_
#include <com/sun/star/container/XNamed.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XINDEXACCESS_HPP_
#include <com/sun/star/container/XIndexAccess.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
#include <com/sun/star/beans/XPropertySet.hpp>
#endif
#ifndef _COM_SUN_STAR_LANG_XMULTISERVICEFACTORY_HPP_
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#endif
#ifndef _SFX_ITEMPROP_HXX
#include <svtools/itemprop.hxx>
#endif
#ifndef _CPPUHELPER_IMPLBASE3_HXX_
#include <cppuhelper/implbase3.hxx> // helper for implementations
#endif
#ifndef _CPPUHELPER_IMPLBASE4_HXX_
#include <cppuhelper/implbase4.hxx> // helper for implementations
#endif

#ifndef _CPPUHELPER_IMPLBASE6_HXX_
#include <cppuhelper/implbase6.hxx> // helper for implementations
#endif


class SwTextBlocks;
class SwGlossaries;
class SwDoc;
/******************************************************************************
 *
 ******************************************************************************/
::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >
    SAL_CALL SwXAutoTextContainer_CreateInstance(
        const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > & );

class SwXAutoTextContainer : public cppu::WeakImplHelper3
<
    ::com::sun::star::text::XAutoTextContainer,
    ::com::sun::star::lang::XServiceInfo,
    ::com::sun::star::container::XIndexAccess
>
{
    SwGlossaries *pGlossaries;
public:
    SwXAutoTextContainer();
    virtual ~SwXAutoTextContainer();

    //XIndexAccess
    virtual sal_Int32 SAL_CALL getCount(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getByIndex(sal_Int32 nIndex) throw( ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );

    //XNameAccess
    virtual ::com::sun::star::uno::Any SAL_CALL getByName(const rtl::OUString& Name)  throw( ::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getElementNames(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual sal_Bool SAL_CALL hasByName(const rtl::OUString& Name) throw( ::com::sun::star::uno::RuntimeException );

    //XElementAccess
    virtual ::com::sun::star::uno::Type SAL_CALL getElementType(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL hasElements(  ) throw(::com::sun::star::uno::RuntimeException);

    //XAutoTextContainer
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XAutoTextGroup >  SAL_CALL insertNewByName(const rtl::OUString& aGroupName) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::container::ElementExistException, ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL removeByName(const rtl::OUString& aGroupName) throw( ::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException );

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );
};

/* -----------------26.05.98 15:55-------------------
 *
 * --------------------------------------------------*/
class SwXAutoTextGroup : public cppu::WeakImplHelper6
<
    ::com::sun::star::text::XAutoTextGroup,
    ::com::sun::star::beans::XPropertySet,
    ::com::sun::star::lang::XServiceInfo,
    ::com::sun::star::container::XIndexAccess,
    ::com::sun::star::container::XNamed,
    ::com::sun::star::lang::XUnoTunnel
>
{
    SfxItemPropertySet      aPropSet;
    SwGlossaries*           pGlossaries;
    rtl::OUString                   sName;
    String                  sGroupName;

public:
        SwXAutoTextGroup(const rtl::OUString& rName, SwGlossaries*  pGloss/*SwTextBlocks* pGroup*/);
        virtual ~SwXAutoTextGroup();


    static const ::com::sun::star::uno::Sequence< sal_Int8 > & getUnoTunnelId();

    //XUnoTunnel
    virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& aIdentifier ) throw(::com::sun::star::uno::RuntimeException);

    //XAutoTextGroup
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getTitles(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL renameByName(const rtl::OUString& aElementName, const rtl::OUString& aNewElementName, const rtl::OUString& aNewElementTitle) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::container::ElementExistException, ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XAutoTextEntry >  SAL_CALL insertNewByName(const rtl::OUString& aName, const rtl::OUString& aTitle, const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xTextRange) throw( ::com::sun::star::container::ElementExistException, ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL removeByName(const rtl::OUString& aEntryName) throw( ::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException );

    //XNamed
    virtual rtl::OUString SAL_CALL getName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL setName(const rtl::OUString& Name_) throw( ::com::sun::star::uno::RuntimeException );

    //XIndexAccess
    virtual sal_Int32 SAL_CALL getCount(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getByIndex(sal_Int32 nIndex) throw( ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );

    //XNameAccess
    virtual ::com::sun::star::uno::Any SAL_CALL getByName(const rtl::OUString& Name)  throw( ::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getElementNames(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual sal_Bool SAL_CALL hasByName(const rtl::OUString& Name) throw( ::com::sun::star::uno::RuntimeException );

    //XElementAccess
    virtual ::com::sun::star::uno::Type SAL_CALL getElementType(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL hasElements(  ) throw(::com::sun::star::uno::RuntimeException);

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    //XPropertySet
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removePropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //
    void    Invalidate();
};

/* -----------------17.06.98 12:03-------------------
 *
 * --------------------------------------------------*/
class SwXAutoTextEntry : public cppu::WeakImplHelper4
<
    ::com::sun::star::text::XAutoTextEntry,
    ::com::sun::star::lang::XServiceInfo,
    ::com::sun::star::lang::XUnoTunnel,
    ::com::sun::star::text::XText
>
{
    SwGlossaries*   pGlossaries;
    String          sGroupName;
    String          sEntryName;

public:
    SwXAutoTextEntry(SwGlossaries* , const String& rGroupName, const String& rEntryName);
    virtual ~SwXAutoTextEntry();

    static const ::com::sun::star::uno::Sequence< sal_Int8 > & getUnoTunnelId();

    //XUnoTunnel
    virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& aIdentifier ) throw(::com::sun::star::uno::RuntimeException);

    //XText
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextCursor >  SAL_CALL createTextCursor(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextCursor >  SAL_CALL createTextCursorByRange(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & aTextPosition) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL insertString(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xRange, const rtl::OUString& aString, BOOL bAbsorb) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL insertControlCharacter(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xRange, sal_Int16 nControlCharacter, BOOL bAbsorb) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL insertTextContent(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xRange, const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextContent > & xContent, BOOL bAbsorb) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL removeTextContent(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextContent > & xContent) throw( ::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException);

    //XTextRange
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XText >  SAL_CALL getText(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > SAL_CALL  getStart(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > SAL_CALL   getEnd(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual rtl::OUString SAL_CALL  getString(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL  setString(const rtl::OUString& aString) throw( ::com::sun::star::uno::RuntimeException );

    //XAutoTextEntry
    virtual void    SAL_CALL applyTo(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xRange)throw( ::com::sun::star::uno::RuntimeException );

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    void    Invalidate() {pGlossaries = 0;}
    const String&   GetGroupName() {return sGroupName;}
    const String&   GetEntryName() {return sEntryName;}

};
#endif


diff --git a/sw/inc/unocoll.hxx b/sw/inc/unocoll.hxx
new file mode 100644
index 0000000..7a2ccd1
--- /dev/null
+++ b/sw/inc/unocoll.hxx
@@ -0,0 +1,562 @@
/*************************************************************************
 *
 *  $RCSfile: unocoll.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:29 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _UNOCOLL_HXX
#define _UNOCOLL_HXX

#ifndef _SOLAR_H
#include <tools/solar.h>
#endif
#ifndef _FLYENUM_HXX //autogen
#include <flyenum.hxx>
#endif
#ifndef _SV_TIMER_HXX
#include <vcl/timer.hxx>
#endif
#ifndef _COM_SUN_STAR_UTIL_XPROTECTABLE_HPP_
#include <com/sun/star/util/XProtectable.hpp>
#endif
#ifndef _COM_SUN_STAR_LANG_XSERVICEINFO_HPP_
#include <com/sun/star/lang/XServiceInfo.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XNAMEACCESS_HPP_
#include <com/sun/star/container/XNameAccess.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XINDEXACCESS_HPP_
#include <com/sun/star/container/XIndexAccess.hpp>
#endif
#ifndef _STRING_HXX
#include <tools/string.hxx>
#endif

#ifndef _CPPUHELPER_IMPLBASE2_HXX_
#include <cppuhelper/implbase2.hxx> // helper for implementations
#endif
#ifndef _CPPUHELPER_IMPLBASE3_HXX_
#include <cppuhelper/implbase3.hxx> // helper for implementations
#endif
#ifndef _CPPUHELPER_IMPLBASE4_HXX_
#include <cppuhelper/implbase4.hxx> // helper for implementations
#endif
/***************************************************
 ***************************************************
 *
 ***************************************************/
class SwDoc;
class SwFrmFmt;
namespace com{namespace sun {namespace star {namespace text
{
    class XTextTable;
    class XTextSection;
    class XFootnote;
}}}}
class SwXFrame;
class SwFrmFmt;
class SwFmtFtn;
class XBookmark;
class SwXReferenceMark;
class SwSectionFmt;
class SwBookmark;
class SwFmtRefMark;
class SwXReferenceMark;
class SwXBookmark;
/*-----------------11.03.98 11:19-------------------

--------------------------------------------------*/
class SwUnoCollection
{
    sal_Bool    bObjectValid;
    SwDoc*  pDoc;

    public:
        SwUnoCollection(SwDoc* p) :
            pDoc(p),
            bObjectValid(sal_True){}

    virtual void                Invalidate();
    sal_Bool                        IsValid() const {return bObjectValid;}


    SwDoc*          GetDoc() const {return pDoc;}
};

/******************************************************************************
 *
 ******************************************************************************/
#define SW_SERVICE_TYPE_TEXTTABLE                       0   //
#define SW_SERVICE_TYPE_TEXTFRAME                       1   //
#define SW_SERVICE_TYPE_GRAPHIC                         2
#define SW_SERVICE_TYPE_OLE                             3
#define SW_SERVICE_TYPE_BOOKMARK                        4
#define SW_SERVICE_TYPE_FOOTNOTE                        5
#define SW_SERVICE_TYPE_ENDNOTE                         6
#define SW_SERVICE_TYPE_INDEXMARK                       7 // Stichwortverzeichniseintrag
#define SW_SERVICE_TYPE_INDEX                           8 // Stichwortverzeichnis
#define SW_SERVICE_REFERENCE_MARK                       9
#define SW_SERVICE_STYLE_CHARACTER_STYLE                10
#define SW_SERVICE_STYLE_PARAGRAPH_STYLE                11
#define SW_SERVICE_STYLE_FRAME_STYLE                    12
#define SW_SERVICE_STYLE_PAGE_STYLE                     13
#define SW_SERVICE_STYLE_NUMBERING_STYLE                14
#define SW_SERVICE_CONTENT_INDEX_MARK                   15
#define SW_SERVICE_CONTENT_INDEX                        16
#define SW_SERVICE_USER_INDEX_MARK                      17
#define SW_SERVICE_USER_INDEX                           18
#define SW_SERVICE_TEXT_SECTION                         19
#define SW_SERVICE_FIELDTYPE_DATETIME                   20
#define SW_SERVICE_FIELDTYPE_USER                       21
#define SW_SERVICE_FIELDTYPE_SET_EXP                    22
#define SW_SERVICE_FIELDTYPE_GET_EXP                    23
#define SW_SERVICE_FIELDTYPE_FILE_NAME                  24
#define SW_SERVICE_FIELDTYPE_PAGE_NUM                   25
#define SW_SERVICE_FIELDTYPE_AUTHOR                     26
#define SW_SERVICE_FIELDTYPE_CHAPTER                    27
#define SW_SERVICE_FIELDTYPE_DUMMY_0                    28
#define SW_SERVICE_FIELDTYPE_GET_REFERENCE              29
#define SW_SERVICE_FIELDTYPE_CONDITIONED_TEXT           30
#define SW_SERVICE_FIELDTYPE_ANNOTATION                 31
#define SW_SERVICE_FIELDTYPE_INPUT                      32
#define SW_SERVICE_FIELDTYPE_MACRO                      33
#define SW_SERVICE_FIELDTYPE_DDE                        34
#define SW_SERVICE_FIELDTYPE_HIDDEN_PARA                35
#define SW_SERVICE_FIELDTYPE_DOC_INFO                   36
#define SW_SERVICE_FIELDTYPE_TEMPLATE_NAME              37
#define SW_SERVICE_FIELDTYPE_USER_EXT                   38
#define SW_SERVICE_FIELDTYPE_REF_PAGE_SET               39
#define SW_SERVICE_FIELDTYPE_REF_PAGE_GET               40
#define SW_SERVICE_FIELDTYPE_JUMP_EDIT                  41
#define SW_SERVICE_FIELDTYPE_SCRIPT                     42
#define SW_SERVICE_FIELDTYPE_DATABASE_NEXT_SET          43
#define SW_SERVICE_FIELDTYPE_DATABASE_NUM_SET           44
#define SW_SERVICE_FIELDTYPE_DATABASE_SET_NUM           45
#define SW_SERVICE_FIELDTYPE_DATABASE                   46
#define SW_SERVICE_FIELDTYPE_DATABASE_NAME              47
#define SW_SERVICE_FIELDTYPE_TABLEFIELD                 48
#define SW_SERVICE_FIELDTYPE_PAGE_COUNT                 49
#define SW_SERVICE_FIELDTYPE_PARAGRAPH_COUNT            50
#define SW_SERVICE_FIELDTYPE_WORD_COUNT                 51
#define SW_SERVICE_FIELDTYPE_CHARACTER_COUNT            52
#define SW_SERVICE_FIELDTYPE_TABLE_COUNT                53
#define SW_SERVICE_FIELDTYPE_GRAPHIC_OBJECT_COUNT       54
#define SW_SERVICE_FIELDTYPE_EMBEDDED_OBJECT_COUNT      55
#define SW_SERVICE_FIELDTYPE_DOCINFO_CHANGE_AUTHOR      56
#define SW_SERVICE_FIELDTYPE_DOCINFO_CHANGE_DATE_TIME   57
#define SW_SERVICE_FIELDTYPE_DOCINFO_EDIT_TIME          58
#define SW_SERVICE_FIELDTYPE_DOCINFO_DESCRIPTION        59
#define SW_SERVICE_FIELDTYPE_DOCINFO_CREATE_AUTHOR      60
#define SW_SERVICE_FIELDTYPE_DOCINFO_CREATE_DATE_TIME   61
#define SW_SERVICE_FIELDTYPE_DOCINFO_INFO_0             62
#define SW_SERVICE_FIELDTYPE_DOCINFO_INFO_1             63
#define SW_SERVICE_FIELDTYPE_DOCINFO_INFO_2             64
#define SW_SERVICE_FIELDTYPE_DOCINFO_INFO_3             65
#define SW_SERVICE_FIELDTYPE_DOCINFO_PRINT_AUTHOR       66
#define SW_SERVICE_FIELDTYPE_DOCINFO_PRINT_DATE_TIME    67
#define SW_SERVICE_FIELDTYPE_DOCINFO_KEY_WORDS          68
#define SW_SERVICE_FIELDTYPE_DOCINFO_SUBJECT            69
#define SW_SERVICE_FIELDTYPE_DOCINFO_TITLE              70
#define SW_SERVICE_FIELDTYPE_DOCINFO_REVISION           71
#define SW_SERVICE_FIELDTYPE_DUMMY_1                    72
#define SW_SERVICE_FIELDTYPE_DUMMY_2                    73
#define SW_SERVICE_FIELDTYPE_DUMMY_3                    74
#define SW_SERVICE_FIELDTYPE_DUMMY_4                    75
#define SW_SERVICE_FIELDTYPE_DUMMY_5                    76
#define SW_SERVICE_FIELDTYPE_DUMMY_6                    77
#define SW_SERVICE_FIELDTYPE_DUMMY_7                    78
#define SW_SERVICE_FIELDTYPE_DUMMY_8                    79
#define SW_SERVICE_FIELDMASTER_USER                     80
#define SW_SERVICE_FIELDMASTER_DDE                      81
#define SW_SERVICE_FIELDMASTER_SET_EXP                  82
#define SW_SERVICE_FIELDMASTER_DATABASE                 83
#define SW_SERVICE_FIELDMASTER_DUMMY1                   84
#define SW_SERVICE_FIELDMASTER_DUMMY2                   85
#define SW_SERVICE_FIELDMASTER_DUMMY3                   86
#define SW_SERVICE_FIELDMASTER_DUMMY4                   87
#define SW_SERVICE_FIELDMASTER_DUMMY5                   88
#define SW_SERVICE_INDEX_ILLUSTRATIONS                  89
#define SW_SERVICE_INDEX_OBJECTS                        90
#define SW_SERVICE_INDEX_TABLES                         91
#define SW_SERVICE_INDEX_BIBLIOGRAPHY                   92
#define SW_SERVICE_PARAGRAPH                            93
#define SW_SERVICE_FIELDTYPE_INPUT_USER                 94
#define SW_SERVICE_FIELDTYPE_HIDDEN_TEXT                95
#define SW_SERVICE_STYLE_CONDITIONAL_PARAGRAPH_STYLE    96
#define SW_SERVICE_NUMBERING_RULES                      97

#define SW_SERVICE_LAST                 SW_SERVICE_NUMBERING_RULES


#define SW_SERVICE_INVALID          USHRT_MAX

class SwXServiceProvider
{
public:
    static rtl::OUString        GetProviderName(sal_uInt16 nObjectType);
    static sal_uInt16           GetProviderType(const rtl::OUString& rServiceName);
    static ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >        MakeInstance(sal_uInt16 nObjectType, SwDoc* pDoc);
    static ::com::sun::star::uno::Sequence<rtl::OUString>   GetAllServiceNames();

};
/*-----------------11.12.97 09:38-------------------

--------------------------------------------------*/
typedef
cppu::WeakImplHelper3
<
    ::com::sun::star::container::XNameAccess,
    ::com::sun::star::container::XIndexAccess,
    ::com::sun::star::lang::XServiceInfo
>
SwCollectionBaseClass;
class SwXTextTables : public SwCollectionBaseClass,
    public SwUnoCollection
{
public:
    SwXTextTables(SwDoc* pDoc);
    virtual ~SwXTextTables();

    //XIndexAccess
    virtual sal_Int32 SAL_CALL getCount(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getByIndex(sal_Int32 nIndex) throw( ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );

    //XNameAccess
    virtual ::com::sun::star::uno::Any SAL_CALL getByName(const rtl::OUString& Name)  throw( ::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getElementNames(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual sal_Bool SAL_CALL hasByName(const rtl::OUString& Name) throw( ::com::sun::star::uno::RuntimeException );

    //XElementAccess
    virtual ::com::sun::star::uno::Type SAL_CALL getElementType(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL hasElements(  ) throw(::com::sun::star::uno::RuntimeException);

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    static ::com::sun::star::text::XTextTable*          GetObject( SwFrmFmt& rFmt );
};

/*-----------------11.12.97 10:14-------------------

--------------------------------------------------*/
class SwXFrames : public SwCollectionBaseClass,
    public SwUnoCollection
{
    const FlyCntType    eType;
protected:

    SwXFrame*           GetFrmByName( const String& rName );
    SwXFrame*           GetFrmByIndex( sal_Int32 nIndex );

    void                RemoveFrame(const rtl::OUString& rName, FlyCntType eType);

public:
        SwXFrames(SwDoc* pDoc, FlyCntType eSet);
        virtual ~SwXFrames();

    //XIndexAccess
    virtual sal_Int32 SAL_CALL getCount(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Any SAL_CALL getByIndex(sal_Int32 nIndex) throw( ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );

    //XNameAccess
    virtual ::com::sun::star::uno::Any SAL_CALL getByName(const rtl::OUString& Name) throw( ::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getElementNames(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual sal_Bool SAL_CALL hasByName(const rtl::OUString& Name) throw( ::com::sun::star::uno::RuntimeException );

    //XElementAccess
    virtual ::com::sun::star::uno::Type SAL_CALL getElementType(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL hasElements(  ) throw(::com::sun::star::uno::RuntimeException);

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    FlyCntType          GetType()const{return eType;}
    static SwXFrame*    GetObject( SwFrmFmt& rFmt, FlyCntType eType );

};

/*-----------------20.02.98 10:51-------------------

--------------------------------------------------*/
class SwXTextFrames : public SwXFrames
{
public:
    SwXTextFrames(SwDoc* pDoc);
    virtual ~SwXTextFrames();

//  SMART_UNO_DECLARATION( SwXTextFrames, UsrObject );

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

};

/*-----------------20.02.98 10:55-------------------

--------------------------------------------------*/
class SwXTextGraphicObjects : public SwXFrames
{
public:
        SwXTextGraphicObjects(SwDoc* pDoc);
        virtual ~SwXTextGraphicObjects();

//  SMART_UNO_DECLARATION( SwXTextGraphicObjects, UsrObject );

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

};

/*-----------------20.02.98 10:57-------------------

--------------------------------------------------*/
class SwXTextEmbeddedObjects :  public SwXFrames
{

public:
    SwXTextEmbeddedObjects(SwDoc* pDoc);
    virtual ~SwXTextEmbeddedObjects();

//  SMART_UNO_DECLARATION( SwXTextEmbeddedObjects, UsrObject );

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

};

/*-----------------12.02.98 07:58-------------------

--------------------------------------------------*/
class SwXTextSections : public cppu::WeakImplHelper4
<
        ::com::sun::star::container::XNameAccess,
        ::com::sun::star::lang::XServiceInfo,
        ::com::sun::star::container::XIndexAccess,
        ::com::sun::star::util::XProtectable
>,
        public SwUnoCollection
{
    Timer   aWrongPasswdTimer;
    sal_uInt16  nWrongPasswd;
    DECL_LINK(WrongPasswordTimerHdl, Timer*);
public:
    SwXTextSections(SwDoc* pDoc);
    virtual ~SwXTextSections();

    //XIndexAccess
    virtual sal_Int32 SAL_CALL getCount(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Any SAL_CALL getByIndex(sal_Int32 nIndex) throw( ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );

    //XNameAccess
    virtual ::com::sun::star::uno::Any SAL_CALL getByName(const rtl::OUString& Name) throw( ::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getElementNames(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual sal_Bool SAL_CALL hasByName(const rtl::OUString& Name) throw( ::com::sun::star::uno::RuntimeException );

    //XElementAccess
    virtual ::com::sun::star::uno::Type SAL_CALL getElementType(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL hasElements(  ) throw(::com::sun::star::uno::RuntimeException);

    //XProtectable
    virtual void SAL_CALL protect(const rtl::OUString& aPassword) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL unprotect(const rtl::OUString& aPassword) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );
    virtual sal_Bool SAL_CALL isProtected(void) throw( ::com::sun::star::uno::RuntimeException );

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    static ::com::sun::star::text::XTextSection*        GetObject( SwSectionFmt& rFmt );
};
/*-----------------12.02.98 07:51-------------------

--------------------------------------------------*/
class SwXBookmarks : public SwCollectionBaseClass,
    public SwUnoCollection
{
public:
    SwXBookmarks(SwDoc* pDoc);
    virtual ~SwXBookmarks();

    //XIndexAccess
    virtual sal_Int32 SAL_CALL getCount(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Any SAL_CALL getByIndex(sal_Int32 nIndex) throw( ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );

    //XNameAccess
    virtual ::com::sun::star::uno::Any SAL_CALL getByName(const rtl::OUString& Name) throw( ::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getElementNames(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual sal_Bool SAL_CALL hasByName(const rtl::OUString& Name) throw( ::com::sun::star::uno::RuntimeException );

    //XElementAccess
    virtual ::com::sun::star::uno::Type SAL_CALL getElementType(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL hasElements(  ) throw(::com::sun::star::uno::RuntimeException);

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    static SwXBookmark*     GetObject( SwBookmark& rBkm, SwDoc* pDoc );
};

/*-----------------12.02.98 08:01-------------------

--------------------------------------------------*/
typedef
cppu::WeakImplHelper2
<
    ::com::sun::star::container::XIndexAccess,
    ::com::sun::star::lang::XServiceInfo
>
SwSimpleIndexAccessBaseClass;
class SwXFootnotes : public SwSimpleIndexAccessBaseClass,
    public SwUnoCollection
{
    sal_Bool                bEndnote;

public:
    SwXFootnotes(sal_Bool bEnd, SwDoc* pDoc);
    virtual ~SwXFootnotes();

    //XIndexAccess
    virtual sal_Int32 SAL_CALL SAL_CALL getCount(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Any SAL_CALL getByIndex(sal_Int32 nIndex) throw( ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );

    //XElementAccess
    virtual ::com::sun::star::uno::Type SAL_CALL getElementType(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL hasElements(  ) throw(::com::sun::star::uno::RuntimeException);

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    static ::com::sun::star::uno::Reference< ::com::sun::star::text::XFootnote> GetObject( SwDoc& rDoc, const SwFmtFtn& rFmt );
};

/* -----------------27.08.98 13:10-------------------
 *
 * --------------------------------------------------*/
class SwXReferenceMarks : public SwCollectionBaseClass,
    public SwUnoCollection
{
public:
    SwXReferenceMarks(SwDoc* pDoc);
    virtual ~SwXReferenceMarks();

    //XIndexAccess
    virtual sal_Int32 SAL_CALL getCount(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Any SAL_CALL getByIndex(sal_Int32 nIndex) throw( ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );

    //XNameAccess
    virtual ::com::sun::star::uno::Any SAL_CALL getByName(const rtl::OUString& Name) throw( ::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getElementNames(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual sal_Bool SAL_CALL hasByName(const rtl::OUString& Name) throw( ::com::sun::star::uno::RuntimeException );

    //XElementAccess
    virtual ::com::sun::star::uno::Type SAL_CALL getElementType(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL hasElements(  ) throw(::com::sun::star::uno::RuntimeException);

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    static SwXReferenceMark* GetObject( SwDoc* pDoc, const SwFmtRefMark* pMark );
};

/* -----------------01.09.98 14:06-------------------
 *
 * --------------------------------------------------*/
class SwXRedlines : public SwSimpleIndexAccessBaseClass,
    public SwUnoCollection
{
public:
    SwXRedlines(SwDoc* pDoc);
    virtual ~SwXRedlines();

    //XIndexAccess
    virtual sal_Int32 SAL_CALL getCount(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Any SAL_CALL getByIndex(sal_Int32 nIndex) throw( ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );

    //XElementAccess
    virtual ::com::sun::star::uno::Type SAL_CALL getElementType(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL hasElements(  ) throw(::com::sun::star::uno::RuntimeException);

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

};
#endif






diff --git a/sw/inc/unocrsr.hxx b/sw/inc/unocrsr.hxx
new file mode 100644
index 0000000..558d664
--- /dev/null
+++ b/sw/inc/unocrsr.hxx
@@ -0,0 +1,124 @@
/*************************************************************************
 *
 *  $RCSfile: unocrsr.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:29 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _UNOCRSR_HXX
#define _UNOCRSR_HXX

#include "swcrsr.hxx"
#include "calbck.hxx"


class SwUnoCrsr : public virtual SwCursor, public SwModify
{
    BOOL bRemainInSection;
public:
    SwUnoCrsr( const SwPosition &rPos, SwPaM* pRing = 0 );
    SwUnoCrsr( SwUnoCrsr& );
    virtual ~SwUnoCrsr();

    virtual operator SwUnoCrsr* ();

//  virtual SwCursor* Create( SwPaM* pRing = 0 ) const;

    // gibt es eine Selection vom Content in die Tabelle
    // Return Wert gibt an, ob der Crsr auf der alten Position verbleibt
    virtual FASTBOOL IsSelOvr( int eFlags =
                                ( SELOVER_CHECKNODESSECTION |
                                  SELOVER_TOGGLE | SELOVER_CHANGEPOS ));

    BOOL IsRemainInSection() const          { return bRemainInSection; }
    void SetRemainInSection( BOOL bFlag )   { bRemainInSection = bFlag; }

    DECL_FIXEDMEMPOOL_NEWDEL( SwUnoCrsr )
};



class SwUnoTableCrsr : public virtual SwUnoCrsr, public virtual SwTableCursor
{
    // die Selection hat die gleiche Reihenfolge wie die
    // TabellenBoxen. D.h., wird aus dem einen Array an einer Position
    // etwas geloescht, dann muss es auch im anderen erfolgen!!
    SwCursor aTblSel;

public:
    SwUnoTableCrsr( const SwPosition& rPos );
    virtual ~SwUnoTableCrsr();

//  virtual SwCursor* Create( SwPaM* pRing = 0 ) const;

    virtual operator SwUnoCrsr* ();
    virtual operator SwUnoTableCrsr* ();
    virtual operator SwTableCursor* ();

    // gibt es eine Selection vom Content in die Tabelle
    // Return Wert gibt an, ob der Crsr auf der alten Position verbleibt
    virtual FASTBOOL IsSelOvr( int eFlags =
                                ( SELOVER_CHECKNODESSECTION |
                                  SELOVER_TOGGLE | SELOVER_CHANGEPOS ));

    void MakeBoxSels();
          SwCursor& GetSelRing()            { return aTblSel; }
    const SwCursor& GetSelRing() const      { return aTblSel; }
};



#endif
diff --git a/sw/inc/unodraw.hxx b/sw/inc/unodraw.hxx
new file mode 100644
index 0000000..00d50c2
--- /dev/null
+++ b/sw/inc/unodraw.hxx
@@ -0,0 +1,248 @@
/*************************************************************************
 *
 *  $RCSfile: unodraw.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:29 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _UNODRAW_HXX
#define _UNODRAW_HXX

#ifndef _SVX_FMDPAGE_HXX //autogen
#include <svx/fmdpage.hxx>
#endif
#ifndef _CALBCK_HXX //autogen
#include <calbck.hxx>
#endif
#ifndef _FRMFMT_HXX //autogen
#include <frmfmt.hxx>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXTCONTENT_HPP_
#include <com/sun/star/text/XTextContent.hpp>
#endif
#ifndef _COM_SUN_STAR_DRAWING_XSHAPE_HPP_
#include <com/sun/star/drawing/XShape.hpp>
#endif
#ifndef _COM_SUN_STAR_LANG_XUNOTUNNEL_HPP_
#include <com/sun/star/lang/XUnoTunnel.hpp>
#endif
#ifndef _CPPUHELPER_IMPLBASE3_HXX_
#include <cppuhelper/implbase3.hxx> // helper for implementations
#endif
#ifndef _CPPUHELPER_IMPLBASE4_HXX_
#include <cppuhelper/implbase4.hxx> // helper for implementations
#endif
#ifndef _SFX_ITEMPROP_HXX
#include <svtools/itemprop.hxx>
#endif

class SdrMarkList;
class SdrView;
class SwDoc;
/******************************************************************************
 *
 ******************************************************************************/
class SwFmDrawPage : public SvxFmDrawPage
{
    SdrPageView*        pPageView;
protected:

    // Erzeugen eines SdrObjects anhand einer Description. Kann von
    // abgeleiteten Klassen dazu benutzt werden, eigene ::com::sun::star::drawing::Shapes zu
    // unterstuetzen (z.B. Controls)
    virtual SdrObject *_CreateSdrObject( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > & xShape );

    // Die folgende Methode wird gerufen, wenn ein SvxShape-Objekt angelegt
    // werden soll. abgeleitete Klassen koennen hier eine Ableitung oder
    // ein ein SvxShape aggregierendes Objekt anlegen.
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >  _CreateShape( SdrObject *pObj ) const;


public:
    SwFmDrawPage( SdrPage* pPage );
    virtual ~SwFmDrawPage();

    const SdrMarkList&  PreGroup(const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes > & xShapes);
    void                PreUnGroup(const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapeGroup >   xShapeGroup);
//  void                PostGroup(); ?? wird es noch gebraucht ??

    SdrView*            GetDrawView() {return pView;}
    SdrPageView*        GetPageView();
    void                RemovePageView();
    ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >       GetInterface( SdrObject* pObj );
};

/* -----------------09.12.98 08:57-------------------
 *
 * --------------------------------------------------*/
typedef cppu::WeakAggImplHelper3
<
    ::com::sun::star::drawing::XDrawPage,
    ::com::sun::star::lang::XServiceInfo,
    ::com::sun::star::drawing::XShapeGrouper
>
SwXDrawPageBaseClass;
class SwXDrawPage : public SwXDrawPageBaseClass
{
    SwDoc*          pDoc;
    ::com::sun::star::uno::Reference< ::com::sun::star::uno::XAggregation >     xPageAgg;
    SwFmDrawPage*   pDrawPage;
public:
    SwXDrawPage(SwDoc* pDoc);
    ~SwXDrawPage();

    virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type& aType ) throw(::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes(  ) throw(::com::sun::star::uno::RuntimeException);

    //XIndexAccess
    virtual sal_Int32 SAL_CALL getCount(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Any SAL_CALL getByIndex(sal_Int32 nIndex) throw( ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );

    //XElementAccess
    virtual ::com::sun::star::uno::Type SAL_CALL getElementType(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL hasElements(  ) throw(::com::sun::star::uno::RuntimeException);

    //XShapes
    virtual void SAL_CALL add(const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > & xShape) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL remove(const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > & xShape) throw( ::com::sun::star::uno::RuntimeException );

    //XShapeGrouper
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapeGroup >  SAL_CALL group(const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes > & xShapes) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL ungroup(const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapeGroup > & aGroup) throw( ::com::sun::star::uno::RuntimeException );

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    SwFmDrawPage*   GetSvxPage();
    void    Invalidate() {pDoc = 0;}
};
/* -----------------22.01.99 10:20-------------------
 *
 * --------------------------------------------------*/
class SwShapeDescriptor_Impl;
typedef
cppu::WeakAggImplHelper4
<
    ::com::sun::star::beans::XPropertySet,
    ::com::sun::star::text::XTextContent,
    ::com::sun::star::lang::XServiceInfo,
    ::com::sun::star::lang::XUnoTunnel
>
SwXShapeBaseClass;
class SwXShape : public SwXShapeBaseClass,
    public SwClient
{
    friend class SwHTMLImageWatcher;
    friend class SwHTMLParser;

    ::com::sun::star::uno::Reference< ::com::sun::star::uno::XAggregation >                 xShapeAgg;
    SfxItemPropertySet          aPropSet;
    const SfxItemPropertyMap*   _pMap;

    SwShapeDescriptor_Impl*     pImpl;

    sal_Bool                        m_bDescriptor;

    SwFrmFmt*               GetFrmFmt() const { return (SwFrmFmt*)GetRegisteredIn(); }

    SvxShape*               GetSvxShape();
public:
    SwXShape(::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > & xShape);
    virtual ~SwXShape();

    TYPEINFO();
    static const ::com::sun::star::uno::Sequence< sal_Int8 > & getUnoTunnelId();
    virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type& aType ) throw(::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes(  ) throw(::com::sun::star::uno::RuntimeException);

    //XUnoTunnel
    virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& aIdentifier ) throw(::com::sun::star::uno::RuntimeException);


    //XPropertySet
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removePropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //XTextContent
    virtual void SAL_CALL attach(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xTextRange) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange >  SAL_CALL getAnchor(void) throw( ::com::sun::star::uno::RuntimeException );

    //XComponent
    virtual void SAL_CALL dispose(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL addEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > & aListener) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL removeEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > & aListener) throw( ::com::sun::star::uno::RuntimeException );

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    //SwClient
    virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);

    SwShapeDescriptor_Impl*     GetDescImpl() {return pImpl;}
    ::com::sun::star::uno::Reference< ::com::sun::star::uno::XAggregation >                 GetAggregationInterface() {return xShapeAgg;}
};
#endif


diff --git a/sw/inc/unofield.hxx b/sw/inc/unofield.hxx
new file mode 100644
index 0000000..74897d9
--- /dev/null
+++ b/sw/inc/unofield.hxx
@@ -0,0 +1,331 @@
/*************************************************************************
 *
 *  $RCSfile: unofield.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:29 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _UNOFIELD_HXX
#define _UNOFIELD_HXX

#ifndef _COM_SUN_STAR_TEXT_XDEPENDENTTEXTFIELD_HPP_
#include <com/sun/star/text/XDependentTextField.hpp>
#endif
#ifndef _COM_SUN_STAR_UTIL_XREFRESHABLE_HPP_
#include <com/sun/star/util/XRefreshable.hpp>
#endif
#ifndef _CALBCK_HXX //autogen
#include <calbck.hxx>
#endif
#ifndef _UNOOBJ_HXX
#include <unoobj.hxx>
#endif
#ifndef _UNOCOLL_HXX
#include <unocoll.hxx>
#endif

class SwFieldType;
class SwDoc;
class SwFmtFld;
class SwField;
/* -----------------04.12.98 12:49-------------------
 *
 * --------------------------------------------------*/
class SwXFieldMaster : public cppu::WeakImplHelper4
<
    ::com::sun::star::beans::XPropertySet,
    ::com::sun::star::lang::XServiceInfo,
    ::com::sun::star::lang::XUnoTunnel,
    ::com::sun::star::lang::XComponent
>,
    public SwClient
{
    SwEventListenerContainer    aLstnrCntnr;
    sal_uInt16                      nResTypeId;
    SwDoc*                      m_pDoc;

    sal_Bool                        m_bIsDescriptor;

    String                      sParam1;    //Content / Database / NumberingSeparator
    String                      sParam2;    // -    /DataTablename
    String                      sParam3;    // -    /DataFieldName
    double                      fParam1;    // Value / -
    sal_Int8                    nParam1;    // ChapterNumberingLevel
    sal_Bool                    bParam1;    // IsExpression

public:
// automatisch auskommentiert - [getImplementation] - Wird von OWeakObject nicht weiter unterstützt!
//  // fuer getImplementation() und fuer den ServiceProvider

    SwXFieldMaster(SwDoc* pDoc, sal_uInt16 nResId);
    SwXFieldMaster(SwFieldType& rType, SwDoc* pDoc);
    virtual ~SwXFieldMaster();

    TYPEINFO();

    static const ::com::sun::star::uno::Sequence< sal_Int8 > & getUnoTunnelId();

    //XUnoTunnel
    virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& aIdentifier ) throw(::com::sun::star::uno::RuntimeException);

    //XPropertySet
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removePropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //XComponent
    virtual void SAL_CALL dispose(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL addEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > & aListener) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL removeEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > & aListener) throw( ::com::sun::star::uno::RuntimeException );

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    //SwClient
    virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);

    SwFieldType* GetFldType() const { return (SwFieldType*)GetRegisteredIn(); }
    SwDoc*      GetDoc() {return m_pDoc;}

    sal_Bool        IsDescriptor()const  {return m_bIsDescriptor;}
    sal_uInt16      GetResId() const {return nResTypeId;}
};

/* -----------------04.12.98 12:49-------------------
 *
 * --------------------------------------------------*/
struct SwFieldProperties_Impl;
class SwXTextField : public cppu::WeakImplHelper4
<
    ::com::sun::star::text::XDependentTextField,
    ::com::sun::star::lang::XServiceInfo,
    ::com::sun::star::beans::XPropertySet,
    ::com::sun::star::lang::XUnoTunnel
>,
            public SwClient
{
    SwEventListenerContainer    aLstnrCntnr;
    const SwFmtFld*             pFmtFld;
    SwDoc*                      m_pDoc;

    sal_Bool                        m_bIsDescriptor;
    sal_uInt16                      m_nServiceId;
    SwFieldProperties_Impl*     m_pProps;
    String                      m_sTypeName;


    SwFieldType* GetFldType() const { return (SwFieldType*)GetRegisteredIn(); }
    SwDoc*       GetDoc() {return m_pDoc;}
public:
    SwXTextField(sal_uInt16 nServiceId);
    SwXTextField(const SwFmtFld& rFmt, SwDoc* pDoc);
    virtual ~SwXTextField();

    TYPEINFO();

    static const ::com::sun::star::uno::Sequence< sal_Int8 > & getUnoTunnelId();

    //XUnoTunnel
    virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& aIdentifier ) throw(::com::sun::star::uno::RuntimeException);

    //XDependentTextField
    virtual void SAL_CALL attachTextFieldMaster(const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & xFieldMaster) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >  SAL_CALL getTextFieldMaster(void) throw( ::com::sun::star::uno::RuntimeException );

    //XTextField
    virtual rtl::OUString SAL_CALL getPresentation(sal_Bool bShowCommand) throw( ::com::sun::star::uno::RuntimeException );

    //XTextContent
    virtual void SAL_CALL attach(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xTextRange) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange >  SAL_CALL getAnchor(void) throw( ::com::sun::star::uno::RuntimeException );

    //XComponent
    virtual void SAL_CALL dispose(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL addEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > & aListener) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL removeEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > & aListener) throw( ::com::sun::star::uno::RuntimeException );

    //XPropertySet
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removePropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    //SwClient
    virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);

    void attachToRange(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xTextRange)throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );

    const SwField*      GetField() const;
    const SwFmtFld*     GetFldFmt(){return GetField() ? pFmtFld : 0; };
};
/* -----------------21.12.98 10:26-------------------
 *
 * --------------------------------------------------*/
typedef
cppu::WeakImplHelper2
<
    ::com::sun::star::container::XNameAccess,
    ::com::sun::star::lang::XServiceInfo
>
SwXTextFieldMastersBaseClass;
class SwXTextFieldMasters : public SwXTextFieldMastersBaseClass,
    public SwUnoCollection
{
public:
    SwXTextFieldMasters(SwDoc* pDoc);
    virtual ~SwXTextFieldMasters();

    //XNameAccess
    virtual ::com::sun::star::uno::Any SAL_CALL getByName(const rtl::OUString& Name) throw( ::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getElementNames(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual sal_Bool SAL_CALL hasByName(const rtl::OUString& Name) throw( ::com::sun::star::uno::RuntimeException );

    //XElementAccess
    virtual ::com::sun::star::uno::Type SAL_CALL getElementType(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL hasElements(  ) throw(::com::sun::star::uno::RuntimeException);

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );
};

/* -----------------21.12.98 10:26-------------------
 *
 * --------------------------------------------------*/
typedef
cppu::WeakImplHelper3
<
    ::com::sun::star::container::XEnumerationAccess,
    ::com::sun::star::lang::XServiceInfo,
    ::com::sun::star::util::XRefreshable
>
SwXTextFieldTypesBaseClass;
class SwXTextFieldTypes : public SwXTextFieldTypesBaseClass,
        public SwUnoCollection
{
public:
    SwXTextFieldTypes(SwDoc* pDoc);
    virtual ~SwXTextFieldTypes();

    //XEnumerationAccess
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration >  SAL_CALL createEnumeration(void) throw( ::com::sun::star::uno::RuntimeException );

    //XElementAccess
    virtual ::com::sun::star::uno::Type SAL_CALL getElementType(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL hasElements(  ) throw(::com::sun::star::uno::RuntimeException);

    // ::com::sun::star::util::XRefreshable
    virtual void SAL_CALL refresh(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addRefreshListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XRefreshListener >& l ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeRefreshListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XRefreshListener >& l ) throw(::com::sun::star::uno::RuntimeException);

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );
};

/* -----------------21.12.98 14:49-------------------
 *
 * --------------------------------------------------*/
class SwXFieldEnumeration : public cppu::WeakImplHelper2
<
    ::com::sun::star::container::XEnumeration,
    ::com::sun::star::lang::XServiceInfo
>,
    public SwClient
{
    SwDoc* pDoc;
    const SwFieldType*      pLastFieldType;
    const SwFieldType*      pNextFieldType;
    const SwFmtFld*         pLastFieldFmt;
    const SwFmtFld*         pNextFieldFmt;

public:
    SwXFieldEnumeration(SwDoc* pDoc);
    virtual ~SwXFieldEnumeration();

    //XEnumeration
    virtual BOOL SAL_CALL hasMoreElements(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Any SAL_CALL nextElement(void) throw( ::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    //SwClient
    virtual void        Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);
};
#endif



diff --git a/sw/inc/unoframe.hxx b/sw/inc/unoframe.hxx
new file mode 100644
index 0000000..fff9dd4
--- /dev/null
+++ b/sw/inc/unoframe.hxx
@@ -0,0 +1,363 @@
/*************************************************************************
 *
 *  $RCSfile: unoframe.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:29 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _UNOFRAME_HXX
#define _UNOFRAME_HXX

#ifndef _UNOOBJ_HXX
#include <unoobj.hxx>
#endif
#ifndef _SFX_OBJSH_HXX
#include <sfx2/objsh.hxx>
#endif
#ifndef _COM_SUN_STAR_DOCUMENT_XEMBEDDEDOBJECTSUPPLIER_HPP_
#include <com/sun/star/document/XEmbeddedObjectSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXTEMBEDDEDOBJECT_HPP_
#include <com/sun/star/text/XTextEmbeddedObject.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXTFRAME_HPP_
#include <com/sun/star/text/XTextFrame.hpp>
#endif
#ifndef _COM_SUN_STAR_DRAWING_XSHAPE_HPP_
#include <com/sun/star/drawing/XShape.hpp>
#endif
#ifndef _COM_SUN_STAR_UTIL_XMODIFYLISTENER_HPP_
#include <com/sun/star/util/XModifyListener.hpp>
#endif
#ifndef _COM_SUN_STAR_FRAME_XMODEL_HPP_
#include <com/sun/star/frame/XModel.hpp>
#endif

/*-----------------12.02.98 11:21-------------------

--------------------------------------------------*/
class BaseFrameProperties_Impl;
class SwXFrame : public cppu::WeakImplHelper6
<
    ::com::sun::star::lang::XServiceInfo,
    ::com::sun::star::beans::XPropertySet,
    ::com::sun::star::beans::XPropertyState,
    ::com::sun::star::drawing::XShape,
    ::com::sun::star::container::XNamed,
    ::com::sun::star::lang::XUnoTunnel
>,
    public SwClient
{
    SwEventListenerContainer        aLstnrCntnr;
    SfxItemPropertySet              aPropSet;
    const SfxItemPropertyMap*       _pMap;

    const FlyCntType                eType;

    // Descriptor-interface
    BaseFrameProperties_Impl*       pProps;
    sal_Bool                        bIsDescriptor;
    String                          sName;

public:
    SwXFrame();
    SwXFrame(FlyCntType eSet,
                const SfxItemPropertyMap*   pMap); //Descriptor-If
    SwXFrame(SwFrmFmt& rFrmFmt, FlyCntType eSet,
                const SfxItemPropertyMap*   pMap);
    virtual ~SwXFrame();

    static const ::com::sun::star::uno::Sequence< sal_Int8 > & getUnoTunnelId();

    //XUnoTunnel
    virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& aIdentifier ) throw(::com::sun::star::uno::RuntimeException);

    TYPEINFO();

    //XNamed
    virtual rtl::OUString SAL_CALL getName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL setName(const rtl::OUString& Name_) throw( ::com::sun::star::uno::RuntimeException );

    //XPropertySet
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removePropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

     //XPropertyState
    virtual ::com::sun::star::beans::PropertyState SAL_CALL getPropertyState( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyState > SAL_CALL getPropertyStates( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aPropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyToDefault( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyDefault( const ::rtl::OUString& aPropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

   //XShape
    virtual ::com::sun::star::awt::Point SAL_CALL getPosition(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPosition( const ::com::sun::star::awt::Point& aPosition ) throw(::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::awt::Size SAL_CALL getSize(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setSize( const ::com::sun::star::awt::Size& aSize ) throw(::com::sun::star::beans::PropertyVetoException, ::com::sun::star::uno::RuntimeException);

    //XShapeDescriptor
    virtual rtl::OUString SAL_CALL getShapeType(void) throw( ::com::sun::star::uno::RuntimeException );

    //Basisimplementierung
    //XComponent
    virtual void SAL_CALL dispose(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& xListener ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& aListener ) throw(::com::sun::star::uno::RuntimeException);

    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange >  SAL_CALL getAnchor(void) throw( ::com::sun::star::uno::RuntimeException );

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    //SwClient
    virtual void    Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);

    void attachToRange(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xTextRange)throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );

    SwFrmFmt*       GetFrmFmt() const { return (SwFrmFmt*)GetRegisteredIn(); }
    FlyCntType      GetFlyCntType()const {return eType;}

    sal_Bool            IsDescriptor() const {return bIsDescriptor;}
    void            ResetDescriptor();
};
/*-----------------20.02.98 11:28-------------------

--------------------------------------------------*/
typedef cppu::WeakImplHelper2
<
    ::com::sun::star::text::XTextFrame,
    ::com::sun::star::container::XEnumerationAccess
>
SwXTextFrameBaseClass;

class SwXTextFrame : public SwXTextFrameBaseClass,
    public SwXText,
    public SwXFrame
{
    const SfxItemPropertyMap*   _pMap;

protected:
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextCursor >         createCursor();
public:
    SwXTextFrame();
    SwXTextFrame(SwFrmFmt& rFmt);
    virtual ~SwXTextFrame();

    virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type& aType ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL acquire(  ) throw();
    virtual void SAL_CALL release(  ) throw();

    //XTypeProvider
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId(  ) throw(::com::sun::star::uno::RuntimeException);

    //XTextFrame
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XText >  SAL_CALL getText(void) throw( ::com::sun::star::uno::RuntimeException );

    //XText
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextCursor >  SAL_CALL createTextCursor(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextCursor >  SAL_CALL createTextCursorByRange(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & aTextPosition) throw( ::com::sun::star::uno::RuntimeException );

    //XEnumerationAccess - frueher XParagraphEnumerationAccess
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration >  SAL_CALL createEnumeration(void) throw( ::com::sun::star::uno::RuntimeException );

    //XElementAccess
    virtual ::com::sun::star::uno::Type SAL_CALL getElementType(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL hasElements(  ) throw(::com::sun::star::uno::RuntimeException);

    //XTextContent
    virtual void SAL_CALL attach( const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange >& xTextRange ) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > SAL_CALL getAnchor(  ) throw(::com::sun::star::uno::RuntimeException);

    //XComponent
    virtual void SAL_CALL dispose(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& xListener ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& aListener ) throw(::com::sun::star::uno::RuntimeException);

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    void * SAL_CALL operator new( size_t ) throw();
    void SAL_CALL operator delete( void * ) throw();
};
/*-----------------20.02.98 11:28-------------------

--------------------------------------------------*/
typedef cppu::WeakImplHelper1
<
    ::com::sun::star::text::XTextContent
>
SwXTextGraphicObjectBaseClass;
class SwXTextGraphicObject : public SwXTextGraphicObjectBaseClass,
                            public SwXFrame
{
public:
    SwXTextGraphicObject();
    SwXTextGraphicObject(SwFrmFmt& rFmt);
    virtual ~SwXTextGraphicObject();

    virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type& aType ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL acquire(  ) throw();
    virtual void SAL_CALL release(  ) throw();

    //XTypeProvider
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId(  ) throw(::com::sun::star::uno::RuntimeException);

    //XTextContent
    virtual void SAL_CALL attach(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xTextRange) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange >  SAL_CALL getAnchor(void) throw( ::com::sun::star::uno::RuntimeException );

    //XComponent
    virtual void SAL_CALL dispose(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL addEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > & aListener) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL removeEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > & aListener) throw( ::com::sun::star::uno::RuntimeException );

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    void * SAL_CALL operator new( size_t ) throw();
    void SAL_CALL operator delete( void * ) throw();
};
/*-----------------20.02.98 11:28-------------------

--------------------------------------------------*/
typedef cppu::WeakImplHelper2
<
    ::com::sun::star::text::XTextEmbeddedObject,
    ::com::sun::star::document::XEmbeddedObjectSupplier
>SwXTextEmbeddedObjectBaseClass;

class SwXTextEmbeddedObject : public SwXTextEmbeddedObjectBaseClass,
                                public SwXFrame
{
public:
    SwXTextEmbeddedObject();
    SwXTextEmbeddedObject(SwFrmFmt& rFmt);
    virtual ~SwXTextEmbeddedObject();

    virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type& aType ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL acquire(  ) throw();
    virtual void SAL_CALL release(  ) throw();

    //XTypeProvider
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId(  ) throw(::com::sun::star::uno::RuntimeException);

    //XTextContent
    virtual void SAL_CALL attach(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xTextRange) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange >  SAL_CALL getAnchor(void) throw( ::com::sun::star::uno::RuntimeException );

    //XComponent
    virtual void SAL_CALL dispose(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL addEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > & aListener) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL removeEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > & aListener) throw( ::com::sun::star::uno::RuntimeException );

    //XEmbeddedObjectSupplier,
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent >  SAL_CALL getEmbeddedObject(void) throw( ::com::sun::star::uno::RuntimeException );

    //XEmbeddedObject
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL getObject(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setObject( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& xObject ) throw(::com::sun::star::uno::RuntimeException);

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    void * SAL_CALL operator new( size_t ) throw();
    void SAL_CALL operator delete( void * ) throw();
};



class SwXOLEListener : public cppu::WeakImplHelper1
<
    ::com::sun::star::util::XModifyListener
>,
    public SwClient
{
    SvPtrarr aFmts;
     ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > GetModel( const SwFmt& rFmt, SwOLENode** ppNd = 0 ) const;
    SfxObjectShell* GetObjShell( const SwFmt& rFmt,
                                    SwOLENode** ppNd = 0 ) const;
    sal_uInt16 FindEntry( const ::com::sun::star::lang::EventObject& Source, SwOLENode** ppNd = 0 );
public:

// ::com::sun::star::lang::XEventListener
    virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw(::com::sun::star::uno::RuntimeException);

// ::com::sun::star::util::XModifyListener
    virtual void SAL_CALL modified( const ::com::sun::star::lang::EventObject& aEvent ) throw(::com::sun::star::uno::RuntimeException);

    sal_Bool AddOLEFmt( SwFrmFmt& rFmt );
    void Modify( SfxPoolItem*, SfxPoolItem* );
};



#endif

diff --git a/sw/inc/unoidx.hxx b/sw/inc/unoidx.hxx
new file mode 100644
index 0000000..ec211a0
--- /dev/null
+++ b/sw/inc/unoidx.hxx
@@ -0,0 +1,366 @@
/*************************************************************************
 *
 *  $RCSfile: unoidx.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:29 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _UNOIDX_HXX
#define _UNOIDX_HXX

#ifndef _COM_SUN_STAR_TEXT_XDOCUMENTINDEXMARK_HPP_
#include <com/sun/star/text/XDocumentIndexMark.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XDOCUMENTINDEX_HPP_
#include <com/sun/star/text/XDocumentIndex.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XINDEXREPLACE_HPP_
#include <com/sun/star/container/XIndexReplace.hpp>
#endif
#ifndef _UNOOBJ_HXX
#include <unoobj.hxx>
#endif
#ifndef _UNOCOLL_HXX
#include <unocoll.hxx>
#endif
#ifndef _TOXE_HXX
#include <toxe.hxx>
#endif
class SwTOXBaseSection;
class SwTOXMark;
class SwTOXType;
/* -----------------07.12.98 10:08-------------------
 *
 * --------------------------------------------------*/
class SwDocIdxProperties_Impl;
class SwXIndexStyleAccess_Impl;
class SwXIndexTokenAccess_Impl;

class SwXDocumentIndex : public cppu::WeakImplHelper5
<
    ::com::sun::star::text::XDocumentIndex,
    ::com::sun::star::lang::XServiceInfo,
    ::com::sun::star::beans::XPropertySet,
    ::com::sun::star::container::XNamed,
    ::com::sun::star::lang::XUnoTunnel
>,
    public SwClient
{
    friend class SwXIndexStyleAccess_Impl;
    friend class SwXIndexTokenAccess_Impl;

    SwEventListenerContainer    aLstnrCntnr;
    const SfxItemPropertyMap*   _pMap;
    SwDoc*                      m_pDoc;
    const SwTOXBaseSection*     pBase;
    TOXTypes                    eTOXType;

    //Descriptor-Interface
    sal_Bool                    bIsDescriptor;
    SwDocIdxProperties_Impl*    pProps;

    SwXIndexStyleAccess_Impl*   pStyleAccess;
    SwXIndexTokenAccess_Impl*   pTokenAccess;

    SwSectionFmt*   GetFmt()const {return (SwSectionFmt*)GetRegisteredIn();}

    sal_Bool                            IsDescriptor() const {return bIsDescriptor;}
    const SwDocIdxProperties_Impl*  GetProperties_Impl() const { return pProps;}
    SwDocIdxProperties_Impl*        GetProperties_Impl() { return pProps;}
    TOXTypes                        GetTOXType() const {return eTOXType;}

    SwXIndexStyleAccess_Impl*   GetStyleAccess() const {return pStyleAccess;}
    void                        SetStyleAccess(SwXIndexStyleAccess_Impl* pSet)
                                        {pStyleAccess = pSet;}

    SwXIndexTokenAccess_Impl*   GetTokenAccess() const {return pTokenAccess;}
    void                        SetTokenAccess(SwXIndexTokenAccess_Impl* pSet)
                                        {pTokenAccess = pSet;}
public:
    SwXDocumentIndex(const SwTOXBaseSection* = 0, SwDoc* = 0);
    //Descriptor-Ctor
    SwXDocumentIndex(TOXTypes eToxType, SwDoc& rDoc);
    virtual ~SwXDocumentIndex();

    static const ::com::sun::star::uno::Sequence< sal_Int8 > & getUnoTunnelId();

    //XUnoTunnel
    virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& aIdentifier ) throw(::com::sun::star::uno::RuntimeException);

    //XDocumentIndex
    virtual ::rtl::OUString SAL_CALL getServiceName(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL update(  ) throw(::com::sun::star::uno::RuntimeException);

    //XPropertySet
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removePropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //XTextContent
    virtual void SAL_CALL attach(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xTextRange) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange >  SAL_CALL getAnchor(void) throw( ::com::sun::star::uno::RuntimeException );

    //XComponent
    virtual void SAL_CALL dispose(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL addEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > & aListener) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL removeEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > & aListener) throw( ::com::sun::star::uno::RuntimeException );

    //XNamed
    virtual rtl::OUString SAL_CALL getName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL setName(const rtl::OUString& Name_) throw( ::com::sun::star::uno::RuntimeException );

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    //SwClient
    virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);

    void attachToRange(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xTextRange)throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );
};
/* -----------------07.12.98 10:08-------------------
 *
 * --------------------------------------------------*/
class SwXDocumentIndexMark : public cppu::WeakImplHelper4
<
    ::com::sun::star::text::XDocumentIndexMark,
    ::com::sun::star::lang::XServiceInfo,
    ::com::sun::star::beans::XPropertySet,
    ::com::sun::star::lang::XUnoTunnel
>,
        public SwClient
{
    SwEventListenerContainer    aLstnrCntnr;
    SwDoc*                      m_pDoc;
    const SwTOXMark*            m_pTOXMark;
    const SfxItemPropertyMap*   _pMap;

    sal_Bool                        bIsDescriptor;
    TOXTypes                    eType;
    sal_uInt16                      nLevel;
    String                      sAltText;
    String                      sPrimaryKey;
    String                      sSecondaryKey;
    String                      sUserIndexName;

    void                InitMap(TOXTypes eToxType);
public:
    SwXDocumentIndexMark(TOXTypes eToxType);
    SwXDocumentIndexMark(const SwTOXType* pType,
                        const SwTOXMark* pMark,
                        SwDoc* pDc);
    virtual ~SwXDocumentIndexMark();

    TYPEINFO();

    static const ::com::sun::star::uno::Sequence< sal_Int8 > & getUnoTunnelId();

    //XUnoTunnel
    virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& aIdentifier ) throw(::com::sun::star::uno::RuntimeException);

    virtual rtl::OUString SAL_CALL getMarkEntry(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL setMarkEntry(const rtl::OUString& aIndexEntry) throw( ::com::sun::star::uno::RuntimeException );

    //XTextContent
    virtual void SAL_CALL attach(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xTextRange) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange >  SAL_CALL getAnchor(void) throw( ::com::sun::star::uno::RuntimeException );

    //XComponent
    virtual void SAL_CALL dispose(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL addEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > & aListener) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL removeEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > & aListener) throw( ::com::sun::star::uno::RuntimeException );

    //XPropertySet
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removePropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    //SwClient
    virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);

    void attachToRange(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xTextRange)throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );

    SwTOXType*          GetTOXType() const {return (SwTOXType*)GetRegisteredIn();}
    const SwTOXMark*    GetTOXMark() const {return m_pTOXMark;}

    static SwXDocumentIndexMark*    GetObject(SwTOXType* pType, const SwTOXMark* pMark,
                                                SwDoc* pDoc);
};
/* -----------------05.05.99 12:27-------------------
 *
 * --------------------------------------------------*/

class SwXDocumentIndexes : public SwCollectionBaseClass,
    public SwUnoCollection
{
public:
    SwXDocumentIndexes(SwDoc* pDoc);
    virtual ~SwXDocumentIndexes();

//  SMART_UNO_DECLARATION( SwXDocumentIndexes, UsrObject );

// automatisch auskommentiert - [getIdlClass or queryInterface] - Bitte XTypeProvider benutzen!
//  virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::reflection::XIdlClass >  >     getIdlClasses(void)

//                                          throw( ::com::sun::star::uno::RuntimeException );
// automatisch auskommentiert - [getIdlClass or queryInterface] - Bitte XTypeProvider benutzen!
//  virtual sal_Bool            queryInterface( ::com::sun::star::uno::Uik aUik, ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >  & rOut );


    //XNameAccess
    virtual ::com::sun::star::uno::Any SAL_CALL getByName(const rtl::OUString& Name) throw( ::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getElementNames(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual sal_Bool SAL_CALL hasByName(const rtl::OUString& Name) throw( ::com::sun::star::uno::RuntimeException );

    //XIndexAccess
    virtual sal_Int32 SAL_CALL getCount(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Any SAL_CALL getByIndex(sal_Int32 nIndex) throw( ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );

    //XElementAccess
    virtual ::com::sun::star::uno::Type SAL_CALL getElementType(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL hasElements(  ) throw(::com::sun::star::uno::RuntimeException);

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

};
/* -----------------13.09.99 16:39-------------------

 --------------------------------------------------*/
class SwXIndexStyleAccess_Impl : public cppu::WeakImplHelper2
<
    ::com::sun::star::container::XIndexReplace,
    ::com::sun::star::lang::XServiceInfo
>
{
    SwXDocumentIndex&   rParent;
    ::com::sun::star::uno::Reference< ::com::sun::star::text::XDocumentIndex >  xParent;
public:
    SwXIndexStyleAccess_Impl(SwXDocumentIndex& rParentIdx);
    virtual ~SwXIndexStyleAccess_Impl();

    //XIndexReplace
    virtual void SAL_CALL replaceByIndex( sal_Int32 Index, const ::com::sun::star::uno::Any& Element ) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //XIndexAccess
    virtual sal_Int32 SAL_CALL getCount(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Any SAL_CALL getByIndex(sal_Int32 nIndex) throw( ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );

    //XElementAccess
    virtual ::com::sun::star::uno::Type SAL_CALL getElementType(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL hasElements(  ) throw(::com::sun::star::uno::RuntimeException);

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

};

/* -----------------13.09.99 16:39-------------------

 --------------------------------------------------*/
class SwXIndexTokenAccess_Impl : public cppu::WeakImplHelper2
<
    ::com::sun::star::container::XIndexReplace,
    ::com::sun::star::lang::XServiceInfo
>
{
    SwXDocumentIndex&   rParent;
    ::com::sun::star::uno::Reference< ::com::sun::star::text::XDocumentIndex >  xParent;
    sal_Int32               nCount;
public:
    SwXIndexTokenAccess_Impl(SwXDocumentIndex& rParentIdx);
    virtual ~SwXIndexTokenAccess_Impl();


    //XIndexReplace
    virtual void SAL_CALL replaceByIndex( sal_Int32 Index, const ::com::sun::star::uno::Any& Element ) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //XIndexAccess
    virtual sal_Int32 SAL_CALL getCount(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Any SAL_CALL getByIndex(sal_Int32 nIndex) throw( ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );

    //XElementAccess
    virtual ::com::sun::star::uno::Type SAL_CALL getElementType(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL hasElements(  ) throw(::com::sun::star::uno::RuntimeException);

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

};

#endif


diff --git a/sw/inc/unomap.hxx b/sw/inc/unomap.hxx
new file mode 100644
index 0000000..5259c1c
--- /dev/null
+++ b/sw/inc/unomap.hxx
@@ -0,0 +1,290 @@
/*************************************************************************
 *
 *  $RCSfile: unomap.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:29 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _UNOMAP_HXX
#define _UNOMAP_HXX

#ifndef _SFX_ITEMPROP_HXX //autogen
#include <svtools/itemprop.hxx>
#endif

#define PROPERTY_NONE 0

#define PROPERTY_MAP_TEXT_CURSOR            0
#define PROPERTY_MAP_CHAR_STYLE             1
#define PROPERTY_MAP_PARA_STYLE             2
#define PROPERTY_MAP_FRAME_STYLE            3
#define PROPERTY_MAP_PAGE_STYLE             4
#define PROPERTY_MAP_NUM_STYLE              5
#define PROPERTY_MAP_SECTION                6
#define PROPERTY_MAP_TEXT_TABLE             7
#define PROPERTY_MAP_TABLE_CELL             8
#define PROPERTY_MAP_TABLE_RANGE            9
#define PROPERTY_MAP_TEXT_SEARCH            10
#define PROPERTY_MAP_TEXT_FRAME             11
#define PROPERTY_MAP_TEXT_GRAPHIC           12
#define PROPERTY_MAP_TEXT_SHAPE             13
#define PROPERTY_MAP_INDEX_USER             14
#define PROPERTY_MAP_INDEX_CNTNT            15
#define PROPERTY_MAP_INDEX_IDX              16
#define PROPERTY_MAP_USER_MARK              17
#define PROPERTY_MAP_CNTIDX_MARK            18
#define PROPERTY_MAP_INDEX_MARK             19
#define PROPERTY_MAP_TEXT_TABLE_ROW         20
#define PROPERTY_MAP_TEXT_SHAPE_DESCRIPTOR  21
#define PROPERTY_MAP_TEXT_TABLE_CURSOR      22
#define PROPERTY_MAP_BOOKMARK               23
#define PROPERTY_MAP_PARAGRAPH_EXTENSIONS   24
#define PROPERTY_MAP_INDEX_ILLUSTRATIONS    25
#define PROPERTY_MAP_INDEX_OBJECTS          26
#define PROPERTY_MAP_INDEX_TABLES           27
#define PROPERTY_MAP_BIBLIOGRAPHY           28
#define PROPERTY_MAP_TEXT_DOCUMENT          29
#define PROPERTY_MAP_LINK_TARGET            30
#define PROPERTY_MAP_AUTO_TEXT_GROUP        31
#define PROPERTY_MAP_PRINT_SETTINGS         32
#define PROPERTY_MAP_VIEW_SETTINGS          33
#define PROPERTY_MAP_TEXTPORTION_EXTENSIONS 34
#define PROPERTY_MAP_FOOTNOTE               35
#define PROPERTY_MAP_END                    36

#define PROPERTY_SET_CHAR_STYLE             1
#define PROPERTY_SET_PARA_STYLE             2
#define PROPERTY_SET_FRAME_STYLE            3
#define PROPERTY_SET_PAGE_STYLE             4
#define PROPERTY_SET_NUM_STYLE              5

//S&E
#define WID_WORDS                0
#define WID_BACKWARDS            1
#define WID_REGULAR_EXPRESSION   2
#define WID_CASE_SENSITIVE       3
#define WID_IN_SELECTION         4
#define WID_STYLES               5
#define WID_SIMILARITY           6
#define WID_SIMILARITY_RELAX     7
#define WID_SIMILARITY_EXCHANGE  8
#define WID_SIMILARITY_ADD       9
#define WID_SIMILARITY_REMOVE    10
#define WID_SEARCH_ALL           11

//Sections
#define WID_SECT_CONDITION      0
#define WID_SECT_DDE_TYPE       1
#define WID_SECT_DDE_FILE       2
#define WID_SECT_DDE_ELEMENT    3
#define WID_SECT_LINK           4
#define WID_SECT_VISIBLE        5
#define WID_SECT_PROTECTED      6
#define WID_SECT_REGION         7

//Verzeichnisse
#define WID_PRIMARY_KEY                         1000
#define WID_SECONDARY_KEY                       1001
#define WID_ALT_TEXT                            1002
#define WID_IDX_TITLE                           1003
#define WID_LEVEL                               1004
#define WID_CREATE_FROM_MARKS                   1005
#define WID_CREATE_FROM_OUTLINE                 1006
//#define WID_PARAGRAPH_STYLE_NAMES               1007
#define WID_CREATE_FROM_CHAPTER                 1008
#define WID_CREATE_FROM_LABELS                  1009
#define WID_PROTECTED                           1000
#define WID_USE_ALPHABETICAL_SEPARATORS         1010
#define WID_USE_KEY_AS_ENTRY                    1011
#define WID_USE_COMBINED_ENTRIES                1012
#define WID_IS_CASE_SENSITIVE                   1013
#define WID_USE_P_P                             1014
#define WID_USE_DASH                            1015
#define WID_USE_UPPER_CASE                      1016
#define WID_INDEX_AUTO_MARK_FILE_U_R_L          1017
#define WID_LABEL_CATEGORY                      1018
#define WID_LABEL_DISPLAY_TYPE                  1019
#define WID_USE_LEVEL_FROM_SOURCE               1020
#define WID_LEVEL_FORMAT                        1021
#define WID_LEVEL_PARAGRAPH_STYLES              1022
#define WID_RECALC_TAB_STOPS                    1023
//#define WID_???                               1024
#define WID_MAIN_ENTRY_CHARACTER_STYLE_NAME     1025
#define WID_CREATE_FROM_TABLES                  1026
#define WID_CREATE_FROM_TEXT_FRAMES             1027
#define WID_CREATE_FROM_GRAPHIC_OBJECTS         1028
#define WID_CREATE_FROM_EMBEDDED_OBJECTS        1029
#define WID_CREATE_FROM_STAR_MATH               1030
#define WID_CREATE_FROM_STAR_IMAGE              1031
#define WID_CREATE_FROM_STAR_CHART              1032
#define WID_CREATE_FROM_STAR_CALC               1033
#define WID_CREATE_FROM_STAR_DRAW               1034
#define WID_CREATE_FROM_OTHER_EMBEDDED_OBJECTS  1035
#define WID_USER_IDX_NAME                       1036
#define WID_PARA_HEAD                           1037
#define WID_PARA_SEP                            1038
#define WID_PARA_LEV1                           1039
#define WID_PARA_LEV2                           1040
#define WID_PARA_LEV3                           1041
#define WID_PARA_LEV4                           1042
#define WID_PARA_LEV5                           1043
#define WID_PARA_LEV6                           1044
#define WID_PARA_LEV7                           1045
#define WID_PARA_LEV8                           1046
#define WID_PARA_LEV9                           1047
#define WID_PARA_LEV10                          1048
#define WID_IS_COMMA_SEPARATED                  1049

//text document
#define WID_DOC_CHAR_COUNT                      1000
#define WID_DOC_PARA_COUNT                      1001
#define WID_DOC_WORD_COUNT                      1002
#define WID_DOC_WORD_SEPARATOR                  1003
#define WID_DOC_CHANGES_SHOW                    1004
#define WID_DOC_CHANGES_RECORD                  1005
#define WID_DOC_AUTO_MARK_URL                   1006

//AutoText
#define WID_GROUP_PATH                          0
#define WID_GROUP_TITLE                         1

//ViewSettings
#define WID_VIEWSET_HRULER                  0
#define WID_VIEWSET_VRULER                  1
#define WID_VIEWSET_HSCROLL                 2
#define WID_VIEWSET_VSCROLL                 3
#define WID_VIEWSET_GRAPHICS                4
#define WID_VIEWSET_TABLES                  5
#define WID_VIEWSET_DRAWINGS                6
#define WID_VIEWSET_FIELD_COMMANDS          7
#define WID_VIEWSET_ANNOTATIONS             8
#define WID_VIEWSET_INDEX_MARK_BACKGROUND   9
#define WID_VIEWSET_FOOTNOTE_BACKGROUND     10
#define WID_VIEWSET_TEXT_FIELD_BACKGROUND   11
#define WID_VIEWSET_PARA_BREAKS             12
#define WID_VIEWSET_SOFT_HYPHENS            13
#define WID_VIEWSET_SPACES                  14
#define WID_VIEWSET_PROTECTED_SPACES        15
#define WID_VIEWSET_TABSTOPS                16
#define WID_VIEWSET_BREAKS                  17
#define WID_VIEWSET_HIDDEN_TEXT             18
#define WID_VIEWSET_HIDDEN_PARAGRAPHS       19
#define WID_VIEWSET_TABLE_BOUNDARIES        20
#define WID_VIEWSET_TEXT_BOUNDARIES         21
#define WID_VIEWSET_SMOOTH_SCROLLING        22
#define WID_VIEWSET_SOLID_MARK_HANDLES      23
#define WID_VIEWSET_ZOOM                    24
#define WID_VIEWSET_ZOOM_TYPE               25
#define WID_VIEWSET_ONLINE_LAYOUT           26

//PrintSettings
#define WID_PRTSET_LEFT_PAGES           0
#define WID_PRTSET_RIGHT_PAGES          1
#define WID_PRTSET_REVERSED             2
#define WID_PRTSET_PROSPECT             3
#define WID_PRTSET_GRAPHICS             4
#define WID_PRTSET_TABLES               5
#define WID_PRTSET_DRAWINGS             6
#define WID_PRTSET_CONTROLS             7
#define WID_PRTSET_PAGE_BACKGROUND      8
#define WID_PRTSET_BLACK_FONTS          9
#define WID_PRTSET_ANNOTATION_MODE      10

//NumberingRules
#define WID_IS_AUTOMATIC                0
#define WID_CONTINUOUS                  1
#define WID_RULE_NAME                   2
#define WID_IS_ABS_MARGINS              3

/* -----------------04.07.98 11:41-------------------
 *
 * --------------------------------------------------*/
class SwItemPropertySet : public SfxItemPropertySet
{
protected:
    virtual sal_Bool            FillItem(SfxItemSet& rSet, sal_uInt16 nWhich, sal_Bool bGetProperty) const;
public:
    SwItemPropertySet( const SfxItemPropertyMap *pMap ) :
        SfxItemPropertySet( pMap ){}
};
/* -----------------04.07.98 11:41-------------------
 *
 * --------------------------------------------------*/
class SwUnoPropertyMapProvider
{
    SfxItemPropertyMap* aMapArr[PROPERTY_MAP_END];

    SfxItemPropertySet* pCharStyleMap;
    SfxItemPropertySet* pParaStyleMap;
    SfxItemPropertySet* pFrameStyleMap;
    SfxItemPropertySet* pPageStyleMap;
    SfxItemPropertySet* pNumStyleMap;

    void            Sort(sal_uInt16 nId);
public:
    SwUnoPropertyMapProvider();
    ~SwUnoPropertyMapProvider();

    const SfxItemPropertyMap*       GetPropertyMap(sal_uInt16 PropertyId);

    SfxItemPropertySet&             GetPropertySet(sal_Int8 nPropSetId);
};

extern SwUnoPropertyMapProvider aSwMapProvider;

#endif


diff --git a/sw/inc/unomid.h b/sw/inc/unomid.h
new file mode 100644
index 0000000..ee45b74
--- /dev/null
+++ b/sw/inc/unomid.h
@@ -0,0 +1,124 @@
/*************************************************************************
 *
 *  $RCSfile: unomid.h,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:29 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef SW_UNOMID_HXX
#define SW_UNOMID_HXX


#define MID_MIRROR_VERT                         0
#define MID_MIRROR_HORZ                         1
#define MID_MIRROR_HORZ_PAGETOGGLE              2

#define MID_PAGEDESC_PAGEDESCNAME               0
#define MID_PAGEDESC_PAGENUMOFFSET              1

#define MID_SURROUND_SURROUNDTYPE               0
#define MID_SURROUND_ANCHORONLY                 1
#define MID_SURROUND_CONTOUR                    2
#define MID_SURROUND_CONTOUROUTSIDE             3

#define MID_VERTORIENT_ORIENT                   0
#define MID_VERTORIENT_RELATION                 1
#define MID_VERTORIENT_POSITION                 2

#define MID_HORIORIENT_ORIENT                   0
#define MID_HORIORIENT_RELATION                 1
#define MID_HORIORIENT_POSITION                 2
#define MID_HORIORIENT_PAGETOGGLE               3

#define MID_ANCHOR_ANCHORTYPE                   0
#define MID_ANCHOR_PAGENUM                      1

#define MID_URL_HYPERLINKFORMAT                 0
#define MID_URL_HYPERLINKNAME                   1
#define MID_URL_CLIENTMAP                       2
#define MID_URL_SERVERMAP                       3
#define MID_URL_URL                             4
#define MID_URL_TARGET                          5
#define MID_URL_VISITED_FMT                     6
#define MID_URL_UNVISITED_FMT                   7

#define MID_CHAIN_PREVNAME                      0
#define MID_CHAIN_NEXTNAME                      1

#define MID_LINENUMBER_COUNT                    0
#define MID_LINENUMBER_STARTVALUE               1

#define MID_DROPCAP_FORMAT                      0
#define MID_DROPCAP_WHOLE_WORD                  1
#define MID_DROPCAP_CHAR_STYLE_NAME             2

#define MID_FRMSIZE_SIZE                        0
#define MID_FRMSIZE_REL_HEIGHT                  1
#define MID_FRMSIZE_REL_WIDTH                   2
#define MID_FRMSIZE_IS_SYNC_REL_SIZE            3
#define MID_FRMSIZE_WIDTH                       4
#define MID_FRMSIZE_HEIGHT                      5
#define MID_FRMSIZE_SIZE_TYPE                   6
#define MID_FRMSIZE_IS_AUTO_HEIGHT              7
/* XML only */
#define MID_FRMSIZE_MIN_HEIGHT                  8
#define MID_FRMSIZE_FIX_HEIGHT                  9
#define MID_FRMSIZE_COL_WIDTH                   10
#define MID_FRMSIZE_REL_COL_WIDTH               11

#define MID_COLUMNS                             0
#define MID_COLUMN_SEPARATOR_LINE               1
#endif
diff --git a/sw/inc/unomod.hxx b/sw/inc/unomod.hxx
new file mode 100644
index 0000000..771004c
--- /dev/null
+++ b/sw/inc/unomod.hxx
@@ -0,0 +1,223 @@
/*************************************************************************
 *
 *  $RCSfile: unomod.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:29 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _UNOMOD_HXX
#define _UNOMOD_HXX

#ifndef _COM_SUN_STAR_TEXT_XMODULE_HPP_
#include <com/sun/star/text/XModule.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
#include <com/sun/star/beans/XPropertySet.hpp>
#endif
#ifndef _COM_SUN_STAR_VIEW_XPRINTSETTINGSSUPPLIER_HPP_
#include <com/sun/star/view/XPrintSettingsSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_VIEW_XVIEWSETTINGSSUPPLIER_HPP_
#include <com/sun/star/view/XViewSettingsSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_LANG_XSERVICEINFO_HPP_
#include <com/sun/star/lang/XServiceInfo.hpp>
#endif
#ifndef _COM_SUN_STAR_LANG_XMULTISERVICEFACTORY_HPP_
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#endif
#ifndef _CPPUHELPER_IMPLBASE2_HXX_
#include <cppuhelper/implbase2.hxx> // helper for implementations
#endif
#ifndef _CPPUHELPER_IMPLBASE4_HXX_
#include <cppuhelper/implbase4.hxx> // helper for implementations
#endif

struct SfxItemPropertyMap;
class SwView;
/******************************************************************************
 *
 ******************************************************************************/
/*-----------------15.03.98 13:21-------------------

--------------------------------------------------*/

::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >  SAL_CALL SwXModule_CreateInstance(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > & );

class SwXModule : public cppu::WeakImplHelper4
<
    ::com::sun::star::text::XModule,
    ::com::sun::star::view::XViewSettingsSupplier,
    ::com::sun::star::view::XPrintSettingsSupplier,
    ::com::sun::star::lang::XServiceInfo
>
{

    ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > *     pxViewSettings;
    ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > *     pxPrintSettings;

public:
    SwXModule();
    virtual ~SwXModule();

    //XViewSettings
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >  SAL_CALL getViewSettings(void) throw( ::com::sun::star::uno::RuntimeException );

    //XPrintSettings
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >  SAL_CALL getPrintSettings(void) throw( ::com::sun::star::uno::RuntimeException );

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual sal_Bool SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );
};

/*-----------------15.03.98 13:21-------------------

--------------------------------------------------*/
class SwXPrintSettings : public cppu::WeakImplHelper2
<
    ::com::sun::star::beans::XPropertySet,
    ::com::sun::star::lang::XServiceInfo
>
{
    const   SfxItemPropertyMap*     _pMap;
    sal_Bool                        bWeb            : 1;
public:
    SwXPrintSettings(sal_Bool bWeb);
    virtual ~SwXPrintSettings();

    //XPropertySet
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removePropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual sal_Bool SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

};
/*-----------------15.03.98 13:21-------------------

--------------------------------------------------*/
class SwXViewSettings : public cppu::WeakImplHelper2
<
    ::com::sun::star::beans::XPropertySet,
    ::com::sun::star::lang::XServiceInfo
>
{
    const SfxItemPropertyMap*   _pMap;
    SwView*                     pView;
    sal_Bool                    bObjectValid    : 1;
    sal_Bool                    bWeb            : 1;
public:
    SwXViewSettings(sal_Bool bWeb, SwView*  pView);
    virtual ~SwXViewSettings();

    //XPropertySet
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removePropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual sal_Bool SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    sal_Bool    IsValid() const {return bObjectValid;}
    void    Invalidate() {bObjectValid = sal_False;}
};
/* -----------------24.09.98 10:47-------------------
 *
 * --------------------------------------------------*/
/*class SwXTerminateListener : public ::com::sun::star::frame::XTerminateListener,
                                public UsrObject
{
public:
    SwXTerminateListener();
    virtual ~SwXTerminateListener();

    SMART_UNO_DECLARATION( SwXTerminateListener, UsrObject );

    virtual UString                 getClassName();
// automatisch auskommentiert - [getIdlClass or queryInterface] - Bitte XTypeProvider benutzen!
//  virtual ::com::sun::star::uno::XInterface *         queryInterface( ::com::sun::star::uno::Uik aUik);

// automatisch auskommentiert - [getIdlClass or queryInterface] - Bitte XTypeProvider benutzen!
//  virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::reflection::XIdlClass > >  getIdlClasses(void);


    //XTerminateListener
    virtual void queryTermination(const ::com::sun::star::lang::EventObject& aEvent);
    virtual void notifyTermination(const ::com::sun::star::lang::EventObject& aEvent);

    //XEventListener
    virtual void disposing(const ::com::sun::star::lang::EventObject& Source);
};

*/
#endif


diff --git a/sw/inc/unoobj.hxx b/sw/inc/unoobj.hxx
new file mode 100644
index 0000000..98594a3
--- /dev/null
+++ b/sw/inc/unoobj.hxx
@@ -0,0 +1,1483 @@
/*************************************************************************
 *
 *  $RCSfile: unoobj.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:29 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _UNOOBJ_HXX
#define _UNOOBJ_HXX

#ifndef _SFX_ITEMPROP_HXX
#include <svtools/itemprop.hxx>
#endif
#ifndef _CALBCK_HXX //autogen
#include <calbck.hxx>
#endif
#ifndef _FRMFMT_HXX //autogen
#include <frmfmt.hxx>
#endif
#ifndef _FLYENUM_HXX //autogen
#include <flyenum.hxx>
#endif
#ifndef _FLDBAS_HXX //autogen
#include <fldbas.hxx>
#endif
#ifndef _FMTCNTNT_HXX //autogen
#include <fmtcntnt.hxx>
#endif
#ifndef _PAM_HXX //autogen
#include <pam.hxx>
#endif
#ifndef _TOXE_HXX
#include <toxe.hxx>
#endif
#ifndef _SORTOPT_HXX //autogen
#include <sortopt.hxx>
#endif
#ifndef _COM_SUN_STAR_DOCUMENT_XDOCUMENTINSERTABLE_HPP_
#include <com/sun/star/document/XDocumentInsertable.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXTCURSOR_HPP_
#include <com/sun/star/text/XTextCursor.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XWORDCURSOR_HPP_
#include <com/sun/star/text/XWordCursor.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XPARAGRAPHCURSOR_HPP_
#include <com/sun/star/text/XParagraphCursor.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XSENTENCECURSOR_HPP_
#include <com/sun/star/text/XSentenceCursor.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XFOOTNOTE_HPP_
#include <com/sun/star/text/XFootnote.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXTSECTION_HPP_
#include <com/sun/star/text/XTextSection.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXTFIELD_HPP_
#include <com/sun/star/text/XTextField.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXTRANGE_HPP_
#include <com/sun/star/text/XTextRange.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXT_HPP_
#include <com/sun/star/text/XText.hpp>
#endif
#ifndef _COM_SUN_STAR_UTIL_XSORTABLE_HPP_
#include <com/sun/star/util/XSortable.hpp>
#endif
#ifndef _COM_SUN_STAR_LANG_XSERVICEINFO_HPP_
#include <com/sun/star/lang/XServiceInfo.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XENUMERATIONACCESS_HPP_
#include <com/sun/star/container/XEnumerationAccess.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XCONTENTENUMERATIONACCESS_HPP_
#include <com/sun/star/container/XContentEnumerationAccess.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XINDEXACCESS_HPP_
#include <com/sun/star/container/XIndexAccess.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XNAMED_HPP_
#include <com/sun/star/container/XNamed.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
#include <com/sun/star/beans/XPropertySet.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSTATE_HPP_
#include <com/sun/star/beans/XPropertyState.hpp>
#endif
#ifndef _COM_SUN_STAR_LANG_XUNOTUNNEL_HPP_
#include <com/sun/star/lang/XUnoTunnel.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXTRANGECOMPARE_HPP_
#include <com/sun/star/text/XTextRangeCompare.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XRELATIVETEXTCONTENTINSERT_HPP_
#include <com/sun/star/text/XRelativeTextContentInsert.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XRELATIVETEXTCONTENTREMOVE_HPP_
#include <com/sun/star/text/XRelativeTextContentRemove.hpp>
#endif
#ifndef _CPPUHELPER_WEAK_HXX_
#include <cppuhelper/weak.hxx>
#endif
#ifndef _CPPUHELPER_FACTORY_HXX_
#include <cppuhelper/factory.hxx>   // helper for factories
#endif
#ifndef _CPPUHELPER_IMPLBASE2_HXX_
#include <cppuhelper/implbase2.hxx> // helper for implementations
#endif
#ifndef _CPPUHELPER_IMPLBASE3_HXX_
#include <cppuhelper/implbase3.hxx> // helper for implementations
#endif
#ifndef _CPPUHELPER_IMPLBASE4_HXX_
#include <cppuhelper/implbase4.hxx> // helper for implementations
#endif
#ifndef _CPPUHELPER_IMPLBASE5_HXX_
#include <cppuhelper/implbase5.hxx> // helper for implementations
#endif
#ifndef _CPPUHELPER_IMPLBASE6_HXX_
#include <cppuhelper/implbase6.hxx> // helper for implementations
#endif
#ifndef _CPPUHELPER_IMPLBASE8_HXX_
#include <cppuhelper/implbase8.hxx> // helper for implementations
#endif
#ifndef _CPPUHELPER_IMPLBASE10_HXX_
#include <cppuhelper/implbase10.hxx>    // helper for implementations
#endif

#define C2U(cChar) rtl::OUString::createFromAscii(cChar)
#define C2S(cChar) UniString::CreateFromAscii(cChar)

class SwUnoCrsr;
class SwBookmark;
class SwFmtFtn;
class SwFmtFld;
class SwFmtRefMark;
class SwEvtLstnrArray;
class GetCurTxtFmtColl;
/* -----------------29.04.98 07:35-------------------
 *
 * --------------------------------------------------*/
enum CursorType
{
    CURSOR_INVALID,
    CURSOR_BODY,
    CURSOR_FRAME,
    CURSOR_TBLTEXT,
    CURSOR_FOOTNOTE,
    CURSOR_HEADER,
    CURSOR_FOOTER,
    CURSOR_ALL          // fuer Search&Replace
};

/* -----------------29.04.98 07:35-------------------
 *
 * --------------------------------------------------*/
#define PUNOPAM (_pStartCrsr)

#define FOREACHUNOPAM_START(pCrsr) \
    {\
        SwPaM *_pStartCrsr = pCrsr, *__pStartCrsr = _pStartCrsr; \
        do {

#define FOREACHUNOPAM_END() \
        } while( (_pStartCrsr=(SwPaM *)_pStartCrsr->GetNext()) != __pStartCrsr ); \
    }

/* -----------------26.06.98 16:18-------------------
 *
 * --------------------------------------------------*/
SwPageDesc* GetPageDescByName_Impl(SwDoc& rDoc, const String& rName);
::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange >  CreateTextRangeFromPosition(SwDoc* pDoc,
                        const SwPosition& rPos, const SwPosition* pMark);

::com::sun::star::uno::Sequence< sal_Int8 > CreateUnoTunnelId();

/* -----------------29.04.98 07:35-------------------
 *
 * --------------------------------------------------*/
class SwUnoInternalPaM : public SwPaM
{
    SwUnoInternalPaM( const SwUnoInternalPaM& );
public:
    SwUnoInternalPaM(SwDoc& rDoc);
    ~SwUnoInternalPaM();

    SwUnoInternalPaM&   operator=(const SwPaM& rPaM);
};

/*-----------------04.03.98 11:54-------------------
    Start/EndAction oder Start/EndAllAction
--------------------------------------------------*/
class UnoActionContext
{
        SwDoc*      pDoc;
    public:
        UnoActionContext(SwDoc* pDoc);
        ~UnoActionContext();

        void InvalidateDocument() {pDoc = 0;}
};
/* -----------------07.07.98 12:03-------------------
 *  Actions kurzfristig unterbrechen
 * --------------------------------------------------*/
class UnoActionRemoveContext
{
        SwDoc*      pDoc;
    public:
        UnoActionRemoveContext(SwDoc* pDoc);
        ~UnoActionRemoveContext();
};

/******************************************************************************
 *
 ******************************************************************************/
typedef com::sun::star::uno::Reference< com::sun::star::text::XTextRange > * XTextRangeRefPtr;
SV_DECL_PTRARR(XTextRangeArr, XTextRangeRefPtr, 4, 4);

void ClientModify(SwClient* pClient, SfxPoolItem *pOld, SfxPoolItem *pNew);

/* -----------------22.04.99 11:18-------------------
 *  Verwaltung der EventListener
 * --------------------------------------------------*/
class SwEventListenerContainer
{
    SwEvtLstnrArray*                            pListenerArr;
     ::com::sun::star::uno::XInterface*         pxParent;
    public:
        SwEventListenerContainer( ::com::sun::star::uno::XInterface* pxParent);
        ~SwEventListenerContainer();

        void    AddListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > & rxListener);
        BOOL    RemoveListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > & rxListener);
        void    Disposing();
};
/* -----------------03.12.98 12:22-------------------
 *
 * --------------------------------------------------*/
class SwXTextRange;
class SwXTextCursor;
class SwXText : public ::com::sun::star::text::XText,
                ::com::sun::star::lang::XTypeProvider,
                ::com::sun::star::text::XTextRangeCompare,
                ::com::sun::star::text::XRelativeTextContentInsert,
                ::com::sun::star::text::XRelativeTextContentRemove

{
    SwDoc*              pDoc;
    BOOL                bObjectValid;
    CursorType          eCrsrType;
protected:
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextCursor >         createCursor();

public:
                SwXText(SwDoc* pDc, CursorType eType) :
                        pDoc(pDc),bObjectValid(0 != pDc), eCrsrType(eType){}
    virtual     ~SwXText();

    const SwDoc*            GetDoc()const {return pDoc;}
    SwDoc*                  GetDoc()    {return pDoc;}

    // wenn ein SwXText attached wird, wird das Doc gesetzt
    void                    SetDoc(SwDoc* pDc)
                                {DBG_ASSERT(!pDoc || !pDc, "Doc schon gesetzt?")
                                    pDoc = pDc;
                                    bObjectValid = 0 != pDc;
                                }
    virtual     ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type& aType ) throw(::com::sun::star::uno::RuntimeException);

    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes(  ) throw(::com::sun::star::uno::RuntimeException);

    //XText
    virtual void SAL_CALL insertString(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xRange, const rtl::OUString& aString, BOOL bAbsorb) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL insertControlCharacter(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xRange, sal_Int16 nControlCharacter, BOOL bAbsorb) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL insertTextContent(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xRange, const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextContent > & xContent, BOOL bAbsorb) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL removeTextContent(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextContent > & xContent) throw( ::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException);

    //XTextRange
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XText >  SAL_CALL getText(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > SAL_CALL  getStart(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > SAL_CALL   getEnd(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual rtl::OUString SAL_CALL  getString(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL  setString(const rtl::OUString& aString) throw( ::com::sun::star::uno::RuntimeException );

    //XTextRangeCompare
    sal_Int16 SAL_CALL compareRegionStarts( const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange >& xR1, const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange >& xR2 ) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
    sal_Int16 SAL_CALL compareRegionEnds( const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange >& xR1, const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange >& xR2 ) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);

    //XRelativeTextContentInsert
    virtual void SAL_CALL insertTextContentBefore(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextContent>& xNewContent, const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextContent>& xSuccessor) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL insertTextContentAfter(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextContent>& xNewContent, const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextContent>& xPredecessor) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);

    //XRelativeTextContentRemove
    virtual void SAL_CALL removeTextContentBefore(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextContent>& xSuccessor) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeTextContentAfter(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextContent>& xPredecessor) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);

    //
    INT16   ComparePositions(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange>& xPos1, const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange>& xPos2) throw (com::sun::star::lang::IllegalArgumentException, com::sun::star::uno::RuntimeException);
    BOOL    CheckForOwnMember(const SwXTextRange* pRange1, const SwXTextCursor* pCursor1)throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
    //
    void            Invalidate() {bObjectValid = sal_False;}
    BOOL            IsValid()const {return bObjectValid;}

    CursorType      GetTextType() {return eCrsrType;}
};

/* -----------------03.12.98 12:16-------------------
 *
 * --------------------------------------------------*/
class SwXTextCursor : public cppu::WeakImplHelper10
<
    ::com::sun::star::text::XSentenceCursor,
    ::com::sun::star::text::XWordCursor,
    ::com::sun::star::text::XParagraphCursor,
    ::com::sun::star::beans::XPropertySet,
    ::com::sun::star::beans::XPropertyState,
    ::com::sun::star::document::XDocumentInsertable,
    ::com::sun::star::lang::XServiceInfo,
    ::com::sun::star::lang::XUnoTunnel,
    ::com::sun::star::util::XSortable,
    ::com::sun::star::container::XContentEnumerationAccess
>,
    public SwClient
{
    SwEventListenerContainer    aLstnrCntnr;
    SfxItemPropertySet          aPropSet;
    ::com::sun::star::uno::Reference< ::com::sun::star::text::XText >                   xParentText;
    SwSortOptions*              pLastSortOptions;

    CursorType                  eType;

    void    DeleteAndInsert(const String& rText);

public:
    SwXTextCursor(::com::sun::star::uno::Reference< ::com::sun::star::text::XText >  xParent, const SwPosition& rPos,
                    CursorType eSet, SwDoc* pDoc, const SwPosition* pMark = 0);
    SwXTextCursor(::com::sun::star::uno::Reference< ::com::sun::star::text::XText >  xParent, SwUnoCrsr* pSourceCrsr, CursorType eSet = CURSOR_ALL);
    //invalid Cursor!
    SwXTextCursor(SwXText* pParent = 0);
    virtual ~SwXTextCursor();

    static const ::com::sun::star::uno::Sequence< sal_Int8 > & getUnoTunnelId();

    //XUnoTunnel
    virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& aIdentifier ) throw(::com::sun::star::uno::RuntimeException);

    //XTextCursor - neu
    virtual void SAL_CALL collapseToStart(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL collapseToEnd(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual BOOL SAL_CALL isCollapsed(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual BOOL SAL_CALL goLeft( sal_Int16 nCount, BOOL bExpand ) throw(::com::sun::star::uno::RuntimeException);
    virtual BOOL SAL_CALL goRight( sal_Int16 nCount, BOOL bExpand ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL gotoStart( BOOL bExpand ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL gotoEnd( BOOL bExpand ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL gotoRange( const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange >& xRange, BOOL bExpand ) throw(::com::sun::star::uno::RuntimeException);

    //XWordCursor - neu
    virtual BOOL SAL_CALL isStartOfWord(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual BOOL SAL_CALL isEndOfWord(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual BOOL SAL_CALL gotoNextWord( BOOL bExpand ) throw(::com::sun::star::uno::RuntimeException);
    virtual BOOL SAL_CALL gotoPreviousWord( BOOL bExpand ) throw(::com::sun::star::uno::RuntimeException);
    virtual BOOL SAL_CALL gotoEndOfWord( BOOL bExpand ) throw(::com::sun::star::uno::RuntimeException);
    virtual BOOL SAL_CALL gotoStartOfWord( BOOL bExpand ) throw(::com::sun::star::uno::RuntimeException);

    //XSentenceCursor - neu
    virtual BOOL SAL_CALL isStartOfSentence(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual BOOL SAL_CALL isEndOfSentence(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual BOOL SAL_CALL gotoNextSentence( BOOL Expand ) throw(::com::sun::star::uno::RuntimeException);
    virtual BOOL SAL_CALL gotoPreviousSentence( BOOL Expand ) throw(::com::sun::star::uno::RuntimeException);
    virtual BOOL SAL_CALL gotoStartOfSentence( BOOL Expand ) throw(::com::sun::star::uno::RuntimeException);
    virtual BOOL SAL_CALL gotoEndOfSentence( BOOL Expand ) throw(::com::sun::star::uno::RuntimeException);

    //XLineCursor - alt
//  virtual BOOL goDown(sal_uInt16 nCount, BOOL Expand);
//    virtual BOOL goUp(sal_uInt16 nCount, BOOL Expand);
//    virtual BOOL isAtStartOfLine(void);
//    virtual BOOL isAtEndOfLine(void);
//    virtual void gotoEndOfLine(BOOL Expand);
//    virtual void gotoStartOfLine(BOOL Expand);

    //ParagraphCursor - neu
    virtual BOOL SAL_CALL isStartOfParagraph(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL isEndOfParagraph(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL gotoStartOfParagraph(BOOL Expand) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL gotoEndOfParagraph(BOOL Expand) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL gotoNextParagraph(BOOL Expand) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL gotoPreviousParagraph(BOOL Expand) throw( ::com::sun::star::uno::RuntimeException );

    //XTextRange
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XText >  SAL_CALL getText(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > SAL_CALL  getStart(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > SAL_CALL   getEnd(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual rtl::OUString SAL_CALL  getString(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL  setString(const rtl::OUString& aString) throw( ::com::sun::star::uno::RuntimeException );

    //XPropertySet
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removePropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //XPropertyState
    virtual ::com::sun::star::beans::PropertyState SAL_CALL getPropertyState( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyState > SAL_CALL getPropertyStates( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aPropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyToDefault( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyDefault( const ::rtl::OUString& aPropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

     static void SwXTextCursor::SetPropertyValue(   SwPaM& rPaM, const SfxItemPropertySet& rPropSet, const rtl::OUString& rPropertyName, const ::com::sun::star::uno::Any& aValue)      throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
     static ::com::sun::star::uno::Any  SwXTextCursor::GetPropertyValue(    SwPaM& rPaM, const SfxItemPropertySet& rPropSet, const ::rtl::OUString& rPropertyName) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
     static ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyState > SwXTextCursor::GetPropertyStates( SwPaM& rPaM, SfxItemPropertySet& rPropSet,      const ::com::sun::star::uno::Sequence< ::rtl::OUString >& PropertyNames)            throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException);
     static ::com::sun::star::beans::PropertyState SwXTextCursor::GetPropertyState( SwPaM& rPaM, SfxItemPropertySet& rPropSet, const ::rtl::OUString& rPropertyName)        throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException);
     static void SwXTextCursor::SetPropertyToDefault( SwPaM& rPaM, const SfxItemPropertySet& rPropSet,  const rtl::OUString& rPropertyName) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException);
    static ::com::sun::star::uno::Any  SwXTextCursor::GetPropertyDefault( SwPaM& rPaM, const SfxItemPropertySet& rPropSet,  const ::rtl::OUString& rPropertyName)   throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //XPropertySetCloner - alt
//    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >  cloneProperties(void);
//    virtual void applyProperties(const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & PropertySet);

    //XDocumentInsertable - neu
    virtual void SAL_CALL insertDocumentFromURL(const rtl::OUString& rURL, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& aOptions) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException );

    //XAutoTextInsertable - alt
//  virtual void insertAutoTextEntry(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XAutoTextEntry > & ::com::sun::star::text::AutoTextEntry);

    //XSortable - neu
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > SAL_CALL createSortDescriptor(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL sort(const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& xDescriptor) throw( ::com::sun::star::uno::RuntimeException );

    //XContentEnumerationAccess
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration >  SAL_CALL createContentEnumeration(const rtl::OUString& aServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getAvailableServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    //SwClient
    virtual void        Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);

    const SwPaM*        GetPaM() const;
    const SwDoc*        GetDoc()const;
    SwDoc*              GetDoc();
    SwUnoCrsr*          GetCrsr(){return (SwUnoCrsr*)GetRegisteredIn();}
    const SwUnoCrsr*    GetCrsr()const{return (SwUnoCrsr*)GetRegisteredIn();}

    static void         SetCrsrAttr(SwPaM& rPam, const SfxItemSet& rSet, BOOL bTableMode = sal_False);
    static void         GetCrsrAttr(SwPaM& rPam, SfxItemSet& rSet, BOOL bCurrentAttrOnly = FALSE);
    static void         getTextFromPam(SwPaM& aCrsr, rtl::OUString& rBuffer);
    static SwFmtColl*   GetCurTxtFmtColl(SwPaM& rPam, BOOL bConditional);

    static void         SelectPam(SwPaM& rCrsr, sal_Bool bExpand);
    static void         SetString(SwUnoCrsr& rUnoCrsr, const rtl::OUString& rString);
};

/*-----------------20.03.98 07:47-------------------

--------------------------------------------------*/
/* das wird zunaechst nicht gebraucht - bisher fuer den XPropertySetCloner
class SwXPropertySet : public ::com::sun::star::beans::XPropertySet,
                        public UsrObject
{
    ::com::sun::star::uno::Sequence<::com::sun::star::uno::Any>*        pAny;
    ::com::sun::star::uno::Sequence< Property >*    pInfo;

public:
    // Eigentumsuebergang der Pointer!
    SwXPropertySet( ::com::sun::star::uno::Sequence<::com::sun::star::uno::Any>*        pAny,
                    ::com::sun::star::uno::Sequence<Property>*  pInfo );
    virtual ~SwXPropertySet();

    SMART_UNO_DECLARATION( SwXPropertySet, UsrObject );

    //XPropertySet
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removePropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

};
/*-----------------20.03.98 08:26-------------------

--------------------------------------------------*/
/* das wird zunaechst nicht gebraucht - bisher fuer den XPropertySetCloner

class SwXPropertySetInfo: public ::com::sun::star::beans::XPropertySetInfo, UsrObject
{
    ::com::sun::star::uno::Sequence< Property >*        pSeq;

public:
    SwXPropertySetInfo( const ::com::sun::star::uno::Sequence<Property>& rInfo );
    virtual ~SwXPropertySetInfo();

    SMART_UNO_DECLARATION( SwXPropertySetInfo, UsrObject );

    virtual ::com::sun::star::uno::Sequence< Property > getProperties(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual Property getPropertyByName(const rtl::OUString& Name) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL hasPropertyByName(const rtl::OUString& Name) throw( ::com::sun::star::uno::RuntimeException );
};

/*-----------------20.02.98 08:45-------------------

--------------------------------------------------*/
typedef
cppu::WeakImplHelper5
<
    ::com::sun::star::text::XTextContent,
    ::com::sun::star::beans::XPropertySet,
    ::com::sun::star::lang::XServiceInfo,
    ::com::sun::star::container::XNamed,
    ::com::sun::star::lang::XUnoTunnel
>
SwRefBookmarkBaseClass;
class SwXBookmark : public SwRefBookmarkBaseClass,
    public SwClient
{
    SwEventListenerContainer    aLstnrCntnr;
    SwDoc*                      pDoc;
    String                      m_aName;
    BOOL                        bIsDescriptor;

public:
        SwXBookmark(SwBookmark* pBkm = 0, SwDoc* pDoc = 0);
        virtual ~SwXBookmark();
    TYPEINFO();

    static const ::com::sun::star::uno::Sequence< sal_Int8 > & getUnoTunnelId();

    //XUnoTunnel
    virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& aIdentifier ) throw(::com::sun::star::uno::RuntimeException);

    //XTextContent
    virtual void SAL_CALL attach(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xTextRange) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > SAL_CALL getAnchor(  ) throw(::com::sun::star::uno::RuntimeException);

    //XComponent
    virtual void SAL_CALL dispose(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL addEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > & aListener) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL removeEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > & aListener) throw( ::com::sun::star::uno::RuntimeException );

    //XNamed
    virtual rtl::OUString SAL_CALL getName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL setName(const rtl::OUString& Name_) throw( ::com::sun::star::uno::RuntimeException );

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    //XPropertySet
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removePropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    void attachToRange(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xTextRange)throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );

    //SwClient
    virtual void    Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);

    SwBookmark*     GetBookmark() const { return (SwBookmark*)GetRegisteredIn(); }
    SwDoc*          GetDoc(){return pDoc;}
};

/*-----------------23.02.98 10:45-------------------

--------------------------------------------------*/

typedef cppu::WeakAggImplHelper2
<
    ::com::sun::star::container::XEnumerationAccess,
    ::com::sun::star::lang::XServiceInfo
> SwXBodyTextBaseClass;
class SwXBodyText : public SwXBodyTextBaseClass,
                    public SwXText
{
public:
    SwXBodyText(SwDoc* pDoc);
    virtual ~SwXBodyText();

    virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type& aType ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL acquire(  ) throw(){OWeakObject::acquire();}
    virtual void SAL_CALL release(  ) throw(){OWeakObject::release();}

    //XAggregation
    virtual ::com::sun::star::uno::Any SAL_CALL queryAggregation( const ::com::sun::star::uno::Type& aType ) throw(::com::sun::star::uno::RuntimeException);

    //XTypeProvider
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId(  ) throw(::com::sun::star::uno::RuntimeException);

    //XText
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextCursor >  SAL_CALL createTextCursor(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextCursor >  SAL_CALL createTextCursorByRange(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & aTextPosition) throw( ::com::sun::star::uno::RuntimeException );

    //XEnumerationAccess - frueher XParagraphEnumerationAccess
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration >  SAL_CALL createEnumeration(void) throw( ::com::sun::star::uno::RuntimeException );

    //XElementAccess
    virtual ::com::sun::star::uno::Type SAL_CALL getElementType(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL hasElements(  ) throw(::com::sun::star::uno::RuntimeException);

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextCursor >  CreateTextCursor(BOOL bIgnoreTables = sal_False);
};
/*-----------------23.02.98 12:05-------------------

--------------------------------------------------*/
class SwXTextRange : public cppu::WeakImplHelper6
<
    ::com::sun::star::text::XTextRange,
    ::com::sun::star::lang::XUnoTunnel,
    ::com::sun::star::lang::XServiceInfo,
    ::com::sun::star::container::XContentEnumerationAccess,
    ::com::sun::star::beans::XPropertySet,
    ::com::sun::star::beans::XPropertyState
>,
                        public SwClient
{
    friend class SwXText;
    enum RangePosition
    {
        RANGE_IN_TEXT, // 'normaler' ::com::sun::star::text::TextRange
        RANGE_IN_FRAME,// TextPosition wurde mit einem Rahmen angelegt, der kein Uno-Objekt besitzt
        RANGE_IN_CELL, // TextPosition wurde mit einer Zelle angelegt, die kein Uno-Objekt besitzt
        RANGE_IS_TABLE, // Anker einer Tabelle
        RANGE_INVALID  // von NewInstance erzeugt
    } eRangePosition;

    SwDoc*              pDoc;
    SwTableBox*         pBox;
    const SwStartNode*  pBoxStartNode;
    SwDepend            aObjectDepend; //Format der Tabelle oder des Rahmens anmelden
    SfxItemPropertySet  aPropSet;
    //SwDepend  aFrameDepend;
    ::com::sun::star::uno::Reference< ::com::sun::star::text::XText >   xParentText;


    void    _CreateNewBookmark(SwPaM& rPam);
    //TODO: new exception type for protected content
    void    DeleteAndInsert(const String& rText) throw( ::com::sun::star::uno::RuntimeException );

public:
    SwXTextRange();
    SwXTextRange(SwPaM& rPam, const ::com::sun::star::uno::Reference< ::com::sun::star::text::XText > & rxParent);
    SwXTextRange(SwFrmFmt& rFmt, SwPaM& rPam);
    SwXTextRange(SwFrmFmt& rTblFmt, SwTableBox& rTblBox, SwPaM& rPam);
    SwXTextRange(SwFrmFmt& rTblFmt, const SwStartNode& rStartNode, SwPaM& rPam);
    SwXTextRange(SwFrmFmt& rTblFmt);

    virtual ~SwXTextRange();
    TYPEINFO();

    static const ::com::sun::star::uno::Sequence< sal_Int8 > & getUnoTunnelId();

    //XUnoTunnel
    virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& aIdentifier ) throw(::com::sun::star::uno::RuntimeException);

    //XTextRange
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XText >  SAL_CALL getText(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > SAL_CALL  getStart(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > SAL_CALL   getEnd(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual rtl::OUString SAL_CALL  getString(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL  setString(const rtl::OUString& aString) throw( ::com::sun::star::uno::RuntimeException );

    //XContentEnumerationAccess
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration >  SAL_CALL createContentEnumeration(const rtl::OUString& aServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getAvailableServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    //XPropertySet
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removePropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //XPropertyState
    virtual ::com::sun::star::beans::PropertyState SAL_CALL getPropertyState( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyState > SAL_CALL getPropertyStates( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aPropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyToDefault( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyDefault( const ::rtl::OUString& aPropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //SwClient
    virtual void        Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);

    BOOL                GetPositions(SwPaM& rToFill) const;
    const SwDoc*        GetDoc()const {return pDoc;}
    SwDoc*              GetDoc(){return pDoc;}

    SwBookmark* GetBookmark() const { return (SwBookmark*)GetRegisteredIn(); }

    static  BOOL        XTextRangeToSwPaM( SwUnoInternalPaM& rToFill,
                                const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xTextRange);
};

/* -----------------15.05.98 08:29-------------------
 *
 * --------------------------------------------------*/
typedef cppu::WeakImplHelper3
<
    ::com::sun::star::container::XIndexAccess,
    ::com::sun::star::lang::XUnoTunnel,
    ::com::sun::star::lang::XServiceInfo
>
SwXTextRangesBaseClass;
class SwXTextRanges : public SwXTextRangesBaseClass,
    public SwClient
{
    XTextRangeArr*      pRangeArr;
    ::com::sun::star::uno::Reference< ::com::sun::star::text::XText >           xParentText;
    XTextRangeArr*      GetRangesArray();
    SwUnoCrsr*          GetCrsr() const { return (SwUnoCrsr*)GetRegisteredIn(); }
public:
    SwXTextRanges();
    SwXTextRanges( SwUnoCrsr* pCrsr, ::com::sun::star::uno::Reference< ::com::sun::star::text::XText >  xParent);
    SwXTextRanges(SwPaM* pCrsr);
    virtual ~SwXTextRanges();

    static const ::com::sun::star::uno::Sequence< sal_Int8 > & getUnoTunnelId();

    //XUnoTunnel
    virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& aIdentifier ) throw(::com::sun::star::uno::RuntimeException);


    //XIndexAccess
    virtual sal_Int32 SAL_CALL getCount(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Any SAL_CALL getByIndex(sal_Int32 nIndex) throw( ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );

    //XElementAccess
    virtual ::com::sun::star::uno::Type SAL_CALL getElementType(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL hasElements(  ) throw(::com::sun::star::uno::RuntimeException);

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    //SwClient
    virtual void        Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);
    const SwUnoCrsr*    GetCursor() const { return (const SwUnoCrsr*)GetRegisteredIn(); }
};

/*-----------------09.03.98 13:57-------------------

--------------------------------------------------*/
struct SwTextSectionProperties_Impl;
class SwXTextSection : public cppu::WeakImplHelper5
<
    ::com::sun::star::text::XTextSection,
    ::com::sun::star::beans::XPropertySet,
    ::com::sun::star::lang::XServiceInfo,
    ::com::sun::star::container::XNamed,
    ::com::sun::star::lang::XUnoTunnel
>,
    public SwClient
{
    SwEventListenerContainer        aLstnrCntnr;
    SfxItemPropertySet              aPropSet;

    BOOL                            m_bIsDescriptor;
    String                          m_sName;
    SwTextSectionProperties_Impl*   pProps;
public:
    SwXTextSection(SwSectionFmt* pFmt = 0);
    virtual ~SwXTextSection();

    static const ::com::sun::star::uno::Sequence< sal_Int8 > & getUnoTunnelId();

    //XUnoTunnel
    virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& aIdentifier ) throw(::com::sun::star::uno::RuntimeException);

    TYPEINFO();

    //XTextSection
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextSection >  SAL_CALL getParentSection(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextSection >  > SAL_CALL getChildSections(void) throw( ::com::sun::star::uno::RuntimeException );

    //XTextContent
    virtual void SAL_CALL attach(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xTextRange) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > SAL_CALL getAnchor(  ) throw(::com::sun::star::uno::RuntimeException);

    //XComponent
    virtual void SAL_CALL dispose(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL addEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > & aListener) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL removeEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > & aListener) throw( ::com::sun::star::uno::RuntimeException );

    //XPropertySet
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removePropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //XNamed
    virtual rtl::OUString SAL_CALL getName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL setName(const rtl::OUString& Name_) throw( ::com::sun::star::uno::RuntimeException );

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    //SwClient
    virtual void    Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);

    void attachToRange(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xTextRange)throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );

    SwSectionFmt*   GetFmt()const {return (SwSectionFmt*)GetRegisteredIn();}
    static SwXTextSection* GetImplementation(::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface> xRef );
};
/*-----------------12.02.98 08:01-------------------

--------------------------------------------------*/
typedef
cppu::WeakImplHelper5
<
    ::com::sun::star::text::XFootnote,
    ::com::sun::star::lang::XServiceInfo,
    ::com::sun::star::container::XEnumerationAccess,
    ::com::sun::star::beans::XPropertySet,
    ::com::sun::star::lang::XUnoTunnel
>
SwXFootnoteBaseClass;
class SwXFootnote : public SwXFootnoteBaseClass,
    public SwXText,
    public SwClient
{
    friend class SwXFootnotes;

    SwEventListenerContainer    aLstnrCntnr;
    const SwFmtFtn*             pFmtFtn;
    BOOL                        m_bIsDescriptor;
    String                      m_sLabel;
    BOOL                        m_bIsEndnote;

protected:
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextCursor >         createCursor();
public:
    SwXFootnote(BOOL bEndnote);
    SwXFootnote(SwDoc* pDoc, const SwFmtFtn& rFmt);
    virtual ~SwXFootnote();

    TYPEINFO();

    static const ::com::sun::star::uno::Sequence< sal_Int8 > & getUnoTunnelId();

    //XUnoTunnel
    virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& aIdentifier ) throw(::com::sun::star::uno::RuntimeException);

    virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type& aType ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL acquire(  ) throw(){SwXFootnoteBaseClass::acquire();}
    virtual void SAL_CALL release(  ) throw(){SwXFootnoteBaseClass::release();}

    //XTypeProvider
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId(  ) throw(::com::sun::star::uno::RuntimeException);

    //XFootnote
    virtual rtl::OUString SAL_CALL getLabel(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL setLabel(const rtl::OUString& aLabel) throw( ::com::sun::star::uno::RuntimeException );

    //XTextContent
    virtual void SAL_CALL attach(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xTextRange) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > SAL_CALL getAnchor(  ) throw(::com::sun::star::uno::RuntimeException);

    //XComponent
    virtual void SAL_CALL dispose(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL addEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > & aListener) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL removeEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > & aListener) throw( ::com::sun::star::uno::RuntimeException );

    //XText
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextCursor >  SAL_CALL createTextCursor(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextCursor >  SAL_CALL createTextCursorByRange(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & aTextPosition) throw( ::com::sun::star::uno::RuntimeException );

    //XEnumerationAccess - frueher XParagraphEnumerationAccess
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration >  SAL_CALL createEnumeration(void) throw( ::com::sun::star::uno::RuntimeException );

    //XElementAccess
    virtual ::com::sun::star::uno::Type SAL_CALL getElementType(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL hasElements(  ) throw(::com::sun::star::uno::RuntimeException);

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    //XPropertySet
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removePropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //SwClient
    virtual void    Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);

    void attachToRange(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xTextRange)throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );

    const SwFmtFtn* FindFmt() const;
    void            Invalidate();
};

/*-----------------07.04.98 08:10-------------------

--------------------------------------------------*/
class SwXParagraphEnumeration : public cppu::WeakImplHelper2
<
    ::com::sun::star::container::XEnumeration,
    ::com::sun::star::lang::XServiceInfo
>,
    public SwClient
{
    ::com::sun::star::uno::Reference< ::com::sun::star::text::XText >           xParentText;

    BOOL                bFirstParagraph;
    SwUnoCrsr*          GetCrsr(){return (SwUnoCrsr*)GetRegisteredIn();}
    CursorType          eCursorType;
public:
    SwXParagraphEnumeration(SwXText* pParent, SwPosition& rPos, CursorType eType);
    SwXParagraphEnumeration(SwXText* pParent, SwUnoCrsr* pCrsr, CursorType eType);
    virtual ~SwXParagraphEnumeration();


    //XEnumeration
    virtual BOOL SAL_CALL hasMoreElements(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Any SAL_CALL nextElement(void) throw( ::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    //SwClient
    virtual void            Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);
};
/*-----------------07.04.98 08:15-------------------

--------------------------------------------------*/
SV_DECL_PTRARR(SwDependArr, SwDepend*, 2, 2);
class SwXParagraph : public cppu::WeakImplHelper8
<
    ::com::sun::star::text::XTextRange,
    ::com::sun::star::beans::XPropertySet,
    ::com::sun::star::lang::XServiceInfo,
    ::com::sun::star::lang::XUnoTunnel,
    ::com::sun::star::beans::XPropertyState,
    ::com::sun::star::container::XEnumerationAccess,
    ::com::sun::star::text::XTextContent,
    ::com::sun::star::container::XContentEnumerationAccess
>,
    public SwClient
{
    SwEventListenerContainer    aLstnrCntnr;
    SfxItemPropertySet          aPropSet;
    ::com::sun::star::uno::Reference< ::com::sun::star::text::XText >                   xParentText;
    rtl::OUString               m_sText;
    BOOL                        m_bIsDescriptor;

    SwUnoCrsr*              GetCrsr(){return (SwUnoCrsr*)GetRegisteredIn();}
public:
    SwXParagraph();
    SwXParagraph(SwXText* pParent, SwUnoCrsr* pCrsr);
    virtual ~SwXParagraph();

    static const ::com::sun::star::uno::Sequence< sal_Int8 > & getUnoTunnelId();

    //XUnoTunnel
    virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& aIdentifier ) throw(::com::sun::star::uno::RuntimeException);

    //XPropertySet
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removePropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //XPropertyState
    virtual ::com::sun::star::beans::PropertyState SAL_CALL getPropertyState( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyState > SAL_CALL getPropertyStates( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aPropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyToDefault( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyDefault( const ::rtl::OUString& aPropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //XTextContent
    virtual void SAL_CALL attach(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xTextRange) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > SAL_CALL getAnchor(  ) throw(::com::sun::star::uno::RuntimeException);

    //XComponent
    virtual void SAL_CALL dispose(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL addEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > & aListener) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL removeEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > & aListener) throw( ::com::sun::star::uno::RuntimeException );

    //XEnumerationAccess - war XTextPortionEnumerationAccess
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration >  SAL_CALL createEnumeration(void) throw( ::com::sun::star::uno::RuntimeException );

    //XElementAccess
    virtual ::com::sun::star::uno::Type SAL_CALL getElementType(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL hasElements(  ) throw(::com::sun::star::uno::RuntimeException);

    //XTextRange
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XText >  SAL_CALL getText(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > SAL_CALL  getStart(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > SAL_CALL   getEnd(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual rtl::OUString SAL_CALL  getString(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL  setString(const rtl::OUString& aString) throw( ::com::sun::star::uno::RuntimeException );

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    //XContentEnumerationAccess
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration >  SAL_CALL createContentEnumeration(const rtl::OUString& aServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getAvailableServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    //SwClient
    virtual void    Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);

    BOOL            IsDescriptor() const {return m_bIsDescriptor;}

    static BOOL getDefaultTextContentValue(::com::sun::star::uno::Any& rAny,
        const rtl::OUString& rPropertyName, USHORT nWID = 0);
    static SwXParagraph* GetImplementation(::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface> xRef );
    //falls es mal als Service erzeugt werden kann
    //void attachToRange(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xTextRange)throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );
    void attachToText(SwXText* pParent, SwUnoCrsr* pCrsr);
};
/* -----------------23.03.99 12:57-------------------
 *
 * --------------------------------------------------*/
#define PARAFRAME_PORTION_PARAGRAPH     0
#define PARAFRAME_PORTION_CHAR          1
#define PARAFRAME_PORTION_TEXTRANGE     2

class SwXParaFrameEnumeration : public cppu::WeakImplHelper2
<
    ::com::sun::star::container::XEnumeration,
    ::com::sun::star::lang::XServiceInfo
>,
    public SwClient
{
    ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextContent >  xNextObject;  //hasMoreElements legt das Objekt schon an
    SwDependArr     aFrameArr;      //wird im Ctor gefuellt

    SwUnoCrsr*      GetCrsr(){return (SwUnoCrsr*)GetRegisteredIn();}
    BOOL            CreateNextObject();
    void            FillFrame(SwUnoCrsr& rUnoCrsr);
public:
    SwXParaFrameEnumeration(const SwUnoCrsr& rUnoCrsr, sal_uInt8 nParaFrameMode, SwFrmFmt* pFmt = 0);
    ~SwXParaFrameEnumeration();

    //XEnumeration
    virtual BOOL SAL_CALL hasMoreElements(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Any SAL_CALL nextElement(void) throw( ::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    //SwClient
    virtual void    Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);
};
/* -----------------29.05.98 14:42-------------------
 *
 * --------------------------------------------------*/

class SwXTextPortionEnumeration : public cppu::WeakImplHelper3
<
    ::com::sun::star::container::XEnumeration,
    ::com::sun::star::lang::XServiceInfo,
    ::com::sun::star::lang::XUnoTunnel
>,
    public SwClient
{
    XTextRangeArr       aPortionArr;    //all portions are created in the ctor
    SwDependArr         aFrameArr;      //wird im Ctor gefuellt - mit am Zeichen gebundenen Rahmen
    ::com::sun::star::uno::Reference< ::com::sun::star::text::XText >           xParent;
    BOOL                bAtEnd;
    BOOL                bFirstPortion;


    SwUnoCrsr*          GetCrsr() const { return (SwUnoCrsr*)GetRegisteredIn(); }
    SwXTextPortionEnumeration();
    void                CreatePortions();
public:
    SwXTextPortionEnumeration(SwPaM& rParaCrsr,
            ::com::sun::star::uno::Reference< ::com::sun::star::text::XText >  xParent);
    virtual ~SwXTextPortionEnumeration();

    static const ::com::sun::star::uno::Sequence< sal_Int8 > & getUnoTunnelId();

    //XUnoTunnel
    virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& aIdentifier ) throw(::com::sun::star::uno::RuntimeException);

    //XEnumeration
    virtual BOOL SAL_CALL hasMoreElements(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Any SAL_CALL nextElement(void) throw( ::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    //SwClient
    virtual void        Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);
};

/* -----------------29.05.98 14:42-------------------
 *  Keine Anmeldung am Feld - Das Feld muss am Cursor stehen
 * --------------------------------------------------*/
enum SwTextPortionType
{
    PORTION_TEXT,
    PORTION_FIELD,
    PORTION_FRAME,
    PORTION_FOOTNOTE,
    PORTION_CONTROL_CHAR,
    PORTION_REFMARK_START,
    PORTION_REFMARK_END,
    PORTION_TOXMARK_START,
    PORTION_TOXMARK_END,
    PORTION_BOOKMARK_START,
    PORTION_BOOKMARK_END
};

class SwXTextPortion : public cppu::WeakImplHelper6
<
    ::com::sun::star::beans::XPropertySet,
    ::com::sun::star::text::XTextRange,
    ::com::sun::star::text::XTextField,
    ::com::sun::star::beans::XPropertyState,
    ::com::sun::star::container::XContentEnumerationAccess,
    ::com::sun::star::lang::XServiceInfo
>,
    public SwClient
{
    SwEventListenerContainer    aLstnrCntnr;
    SfxItemPropertySet          aPropSet;
    ::com::sun::star::uno::Reference< ::com::sun::star::text::XText >                   xParentText;
    ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextContent >    xRefMark;
    ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextContent >    xTOXMark;
    ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextContent >    xBookmark;
    ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextContent >    xFootnote;
    const SwFmtFld*             pFmtFld;
    SwDepend                    aFrameDepend;
    SwFrmFmt*                   pFrameFmt;
    SwTextPortionType           ePortionType;
    sal_Int16                   nControlChar;

    BOOL                        bIsCollapsed;

    SwFmtFld*           GetFldFmt(BOOL bInit = sal_False);
    SwUnoCrsr*          GetCrsr() const { return (SwUnoCrsr*)GetRegisteredIn(); }
public:
    SwXTextPortion(const SwUnoCrsr* pPortionCrsr, ::com::sun::star::uno::Reference< ::com::sun::star::text::XText >  xParent, SwTextPortionType eType   );
    SwXTextPortion(const SwUnoCrsr* pPortionCrsr, ::com::sun::star::uno::Reference< ::com::sun::star::text::XText >  xParent, SwFrmFmt& rFmt );
    virtual ~SwXTextPortion();

    //XTextRange
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XText >  SAL_CALL getText(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > SAL_CALL  getStart(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > SAL_CALL   getEnd(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual rtl::OUString SAL_CALL  getString(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL  setString(const rtl::OUString& aString) throw( ::com::sun::star::uno::RuntimeException );

    //XPropertySet
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removePropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //XPropertyState
    virtual ::com::sun::star::beans::PropertyState SAL_CALL getPropertyState( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyState > SAL_CALL getPropertyStates( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aPropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyToDefault( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyDefault( const ::rtl::OUString& aPropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //XTextField
    virtual rtl::OUString SAL_CALL getPresentation(BOOL bShowCommand) throw( ::com::sun::star::uno::RuntimeException );

    //XTextContent
    virtual void SAL_CALL attach(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xTextRange) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > SAL_CALL getAnchor(  ) throw(::com::sun::star::uno::RuntimeException);

    //XComponent
    virtual void SAL_CALL dispose(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL addEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > & aListener) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL removeEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > & aListener) throw( ::com::sun::star::uno::RuntimeException );

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    //XContentEnumerationAccess
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration >  SAL_CALL createContentEnumeration(const rtl::OUString& aServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getAvailableServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    //SwClient
    virtual void                Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);

    void                SetRefMark( ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextContent >  xMark)
                            {xRefMark = xMark;}

    void                SetTOXMark( ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextContent >  xMark)
                            {xTOXMark = xMark;}

    void                SetBookmark( ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextContent >  xMark)
                            {xBookmark = xMark;}

    void                SetFootnote( ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextContent >  xMark)
                            {xFootnote = xMark;}

    void                SetControlChar(sal_Int16 nSet) {nControlChar = nSet;}

    void                SetIsCollapsed(BOOL bSet) { bIsCollapsed = bSet;}

    //falls es mal als service erzeugt werden kann
    //void attachToRange(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xTextRange)throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );
};
/* -----------------29.09.98 09:01-------------------
 *
 * --------------------------------------------------*/
/* os: 04.12.98 11:40 hier gibt es noch keine sinnvolle Definition
#define MAX_SORT_FIELDS 3 // das ist eher willkuerlich (wie im Dialog)
class SwXTextSortDescriptor : public XTextSortDescriptor,
                                public UsrObject
{
    SwSortOptions   aSortOptions;
    BOOL            bUseHeader;
public:
    SwXTextSortDescriptor(BOOL bUsedInTable);
    virtual ~SwXTextSortDescriptor();

    //XTextSortDescriptor
    virtual sal_Unicode getTextColumnSeparator(void) const;
    virtual void setTextColumnSeparator(sal_Unicode TextColumnSeparator_);

    //XSortDescriptor
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::util::SortField > getSortFields(void) const;
    virtual void setSortFields(const ::com::sun::star::uno::Sequence< ::com::sun::star::util::SortField >& SortFields_);
    virtual sal_uInt16 getMaxFieldCount(void) const;
    virtual ColumnsOrRows getOrientation(void) const;
    virtual void setOrientation(ColumnsOrRows Orientation_);
    virtual BOOL getUseHeader(void) const;
    virtual void setUseHeader(BOOL UseHeader_);

    const SwSortOptions&    GetSortOptions() const {return aSortOptions;}
    void                    SetSortOptions(const SwSortOptions& rSortOpt);
};
*/
/* -----------------25.08.98 11:02-------------------
 *
 * --------------------------------------------------*/
typedef
cppu::WeakImplHelper2
<
    ::com::sun::star::lang::XServiceInfo,
    ::com::sun::star::container::XEnumerationAccess
>
SwXHeadFootTextBaseClass;
class SwXHeadFootText : public SwXHeadFootTextBaseClass,
    public SwXText,
    public SwClient
{
    SwFrmFmt*           GetFmt() const { return (SwFrmFmt*)GetRegisteredIn(); }
    BOOL                bIsHeader;
protected:
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextCursor >         createCursor();
public:
    SwXHeadFootText(SwFrmFmt& rHeadFootFmt, BOOL bHeader);
    ~SwXHeadFootText();

    TYPEINFO();

    virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type& aType ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL acquire(  ) throw(){SwXHeadFootTextBaseClass::acquire();}
    virtual void SAL_CALL release(  ) throw(){SwXHeadFootTextBaseClass::release();}

    //XTypeProvider
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId(  ) throw(::com::sun::star::uno::RuntimeException);

    //XText
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextCursor >  SAL_CALL createTextCursor(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextCursor >  SAL_CALL createTextCursorByRange(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & aTextPosition) throw( ::com::sun::star::uno::RuntimeException );

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    //XEnumerationAccess - frueher XParagraphEnumerationAccess
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration >  SAL_CALL createEnumeration(void) throw( ::com::sun::star::uno::RuntimeException );

    //XElementAccess
    virtual ::com::sun::star::uno::Type SAL_CALL getElementType(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL hasElements(  ) throw(::com::sun::star::uno::RuntimeException);

    //SwClient
    virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);
};
/* -----------------27.08.98 15:11-------------------
 *
 * --------------------------------------------------*/
class SwXReferenceMark : public SwRefBookmarkBaseClass,
    public SwClient
{
    SwEventListenerContainer    aLstnrCntnr;
    SwDoc*                      pDoc;
    const SwFmtRefMark*         pMark;
    String                      sMarkName;
    BOOL                        m_bIsDescriptor;

    BOOL    IsValid() const {return 0 != GetRegisteredIn();}
    void    InsertRefMark(SwPaM& rPam, SwDoc* pDoc);
public:
    SwXReferenceMark(SwDoc* pDoc, const SwFmtRefMark* pMark);
    ~SwXReferenceMark();

    TYPEINFO();

    static const ::com::sun::star::uno::Sequence< sal_Int8 > & getUnoTunnelId();

    //XUnoTunnel
    virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& aIdentifier ) throw(::com::sun::star::uno::RuntimeException);

    //XTextContent
    virtual void SAL_CALL attach(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xTextRange) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > SAL_CALL getAnchor(  ) throw(::com::sun::star::uno::RuntimeException);

    //XComponent
    virtual void SAL_CALL dispose(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL addEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > & aListener) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL removeEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > & aListener) throw( ::com::sun::star::uno::RuntimeException );

    //XNamed
    virtual rtl::OUString SAL_CALL getName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL setName(const rtl::OUString& Name_) throw( ::com::sun::star::uno::RuntimeException );

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    //XPropertySet
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removePropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //SwClient
    virtual void    Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);

    void attachToRange(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xTextRange)throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );

    const SwFmtRefMark* GetMark()const {return pMark;}
    const String&       GetMarkName() const {return sMarkName;}
    SwDoc*              GetDoc() const{return pDoc;}
    void                Invalidate();
};
/* -----------------01.09.98 16:09-------------------
 *
 * --------------------------------------------------*/
// os: 04.12.98 11:44 - keine Definition
//class SwXRedline : public XRedline,
/*
class SwXRedline : public XRedline,
                    public UsrObject,
                        public SwClient
{
    SwDoc*              pDoc;
    const SwRedline*    pRedline;

    BOOL                IsValid() const;
public:
    SwXRedline(SwDoc* pDoc, const SwRedline* pRedline);
    virtual ~SwXRedline();

    //XRedline
    virtual sal_uInt16 getActionType(void) const;
    virtual rtl::OUString getAuthor(void) const;
    virtual ::com::sun::star::util::DateTime getCreationDateTime(void) const;
    virtual rtl::OUString getDescription(void) const;
    virtual void setDescription(const rtl::OUString& Description_);

    //SwClient
    virtual void    Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);
};


*/
#endif


diff --git a/sw/inc/unoprnms.hxx b/sw/inc/unoprnms.hxx
new file mode 100644
index 0000000..b50df4f
--- /dev/null
+++ b/sw/inc/unoprnms.hxx
@@ -0,0 +1,536 @@
/*************************************************************************
 *
 *  $RCSfile: unoprnms.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:29 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _UNOPRNMS_HXX
#define _UNOPRNMS_HXX


#ifndef _SAL_TYPES_H_
#include <sal/types.h>
#endif
#ifndef _SOLAR_H
#include <tools/solar.h>
#endif

struct SwPropNameLen
{
    const char*                         pName;
    USHORT                              nNameLen;
    SwPropNameLen(const char* pString, USHORT nLen) :
        pName(pString),
        nNameLen(nLen){}

    operator const char*()const {return pName;}
};
#define SW_PROP_NAME(aPropName) aPropName.pName, aPropName.nNameLen

extern const SwPropNameLen  __FAR_DATA  UNO_NAME_FOLLOW_STYLE;

//extern const sal_Char* __FAR_DATA UNO_NAME_FOLLOW_STYLE                       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_IS_PHYSICAL                      ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_IS_AUTO_UPDATE                       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_DISPLAY_NAME                     ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHAR_FONT_NAME                       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHAR_FONT_STYLE_NAME               ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHAR_FONT_FAMILY                   ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHAR_FONT_CHAR_SET                 ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHAR_FONT_PITCH                    ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_GRAPHIC_URL                   ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_GRAPHIC_FILTER                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_HEADER_GRAPHIC_URL                 ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_HEADER_GRAPHIC_FILTER              ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FOOTER_GRAPHIC_URL                 ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FOOTER_GRAPHIC_FILTER              ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_BACK_GRAPHIC_URL                   ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_BACK_GRAPHIC_FILTER                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_BACK_GRAPHIC_LOCATION            ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_BACK_GRAPHIC_BITMAP                  ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_GRAPHIC_URL                          ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_GRAPHIC_FILTER                       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_GRAPHIC_LOCATION                     ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_GRAPHIC_SIZE                         ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_GRAPHIC_BITMAP                   ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_BULLET_FONT                      ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_GRAPHIC_LOCATION            ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_HEADER_GRAPHIC_LOCATION              ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FOOTER_GRAPHIC_LOCATION              ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_LEFT_PARA_MARGIN                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_RIGHT_PARA_MARGIN               ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_LEFT_MARGIN                 ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_RIGHT_MARGIN            ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_LEFT_MARGIN_RELATIVE    ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_RIGHT_MARGIN_RELATIVE   ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_FIRST_LINE_INDENT       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_FIRST_LINE_INDENT_RELATIVE  ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_IS_HYPHENATION                    ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_HYPHENATION_MAX_LEADING_CHARS       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_HYPHENATION_MAX_TRAILING_CHARS    ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_HYPHENATION_MAX_HYPHENS           ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_LEFT_MARGIN                      ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_RIGHT_MARGIN                     ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_HEADER_LEFT_MARGIN           ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_HEADER_RIGHT_MARGIN          ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FOOTER_LEFT_MARGIN           ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FOOTER_RIGHT_MARGIN          ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_TEXT_RANGE                       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_NAME                         ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_NUMBERING_ALIGNMENT          ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_BULLET_FONT_NAME               ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_BULLET_ID                      ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHAR_STYLE_NAME                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_ANCHOR_CHAR_STYLE_NAME                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SUFFIX                         ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PREFIX                         ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARENT_NUMBERING               ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_START_WITH                       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHAR_POSTURE                   ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHAR_WEIGHT                      ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHAR_AUTO_KERNING                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHAR_UNDERLINE                       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHAR_ESCAPEMENT                      ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHAR_CASE_MAP                        ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHAR_SHADOWED                        ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHAR_STRIKEOUT                   ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHAR_CROSSED_OUT                     ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHAR_NO_HYPHENATION                  ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHAR_AUTO_ESCAPEMENT                 ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHAR_HEIGHT                          ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHAR_PROP_FONT_HEIGHT              ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHAR_DIFF_FONT_HEIGHT              ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHAR_ESCAPEMENT_HEIGHT             ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHAR_COLOR                       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHAR_FLASH                           ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHAR_KERNING                     ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHAR_LOCALE                          ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHAR_BACK_COLOR                  ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHAR_TRANSPARENT_BACKGROUND      ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_LINE_SPACING                    ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_TOP_MARGIN              ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_BOTTOM_MARGIN             ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_TOP_MARGIN_RELATIVE     ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_BOTTOM_MARGIN_RELATIVE    ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_EXPAND_SINGLE_WORD        ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_END_NOTICE                       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_EMBEDDED_OBJECTS                 ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_ALPHABETICAL_SEPARATORS        ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_BACKGROUND_COLOR               ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_BEGIN_NOTICE                   ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CASE_SENSITIVE                 ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FRAME_STYLE_NAME               ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_NUMBERING_STYLE_NAME         ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_NUMBERING_LEVEL                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_NUMBERING_START_VALUE            ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_NUMBERING_IS_NUMBER          ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_COMBINE_ENTRIES                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_COUNT_LINES_IN_FRAMES          ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_DDE_COMMAND_TYPE               ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_DDE_COMMAND_FILE               ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_DDE_COMMAND_ELEMENT            ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_IS_AUTOMATIC_UPDATE          ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_DEFAULT_TABSTOP_DISTANCE       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_DISTANCE                       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_DROP_CAP_FORMAT              ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_DROP_CAP_WHOLE_WORD            ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_DROP_CAP_CHAR_STYLE_NAME       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FILE_LINK                      ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_GRAPHIC                        ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_GRAPHICS                       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_IS_PROTECTED                   ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_KEY_AS_ENTRY                   ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_KEEP_TOGETHER             ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_KEEP_TOGETHER                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_LANDSCAPE                      ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_LINE_SEPARATOR                 ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_MARKS                          ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_NUMBER_POSITION                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_OUTLINES                       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PAGE_STYLE_NAME                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PAGE_STYLE_LAYOUT              ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_STYLES                    ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_ADJUST                  ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_REGISTER_MODE_ACTIVE      ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_STYLE_NAME                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_LAST_LINE_ADJUST        ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_LINE_NUMBER_COUNT               ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_LINE_NUMBER_START_VALUE         ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_BACK_COLOR                       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_BACK_COLOR              ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_WIDOWS                  ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_ORPHANS                   ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_TRANSPARENT_BACKGROUND    ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_POSITION_END_OF_DOC            ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_POSITION_PROTECTED             ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_ALTERNATIVE_TEXT               ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PRIMARY_KEY                    ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PRINT_TABLES                   ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PRINT_GRAPHICS                 ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PRINT_REVERSED                 ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PRINT_PROSPECT                 ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PRINT_CONTROLS                 ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PRINT_DRAWINGS                 ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PRING_RIGHT_PAGES              ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PRINT_BLACK_FONTS              ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PRINTER_PAPER_TRAY             ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PRINT_PAGE_BACKGROUND          ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PRINT_ANNOTATION_MODE          ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_REGISTER_MODE_ACTIVE           ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_RELATIVE_WIDTH                 ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_RELATIVE_HEIGHT                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_REPEAT_HEADLINE                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SEARCH_STYLES                  ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SEARCH_BACKWARDS               ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SEARCH_SIMILARITY              ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SEARCH_IN_SELECTION            ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SEARCH_CASE_SENSITIVE          ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SEARCH_SIMILARITY_ADD          ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SEARCH_SIMILARITY_RELAX        ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SEARCH_SIMILARITY_REMOVE       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SEARCH_REGULAR_EXPRESSION      ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SEARCH_SIMILARITY_EXCHANGE     ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SECONDARY_KEY                  ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SEPARATOR_LINE_DISTANCE        ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SHOW_BREAKS                    ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SHOW_SPACES                    ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SHOW_TABLES                    ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SHOW_GRAPHICS                  ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SHOW_DRAWINGS                  ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SHOW_TABSTOPS                  ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SHOW_VERT_RULER                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SHOW_PARA_BREAKS               ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SHOW_HIDDEN_TEXT               ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SHOW_ANNOTATIONS               ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SHOW_SOFT_HYPHENS              ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SHOW_VERT_SCROLL_BAR           ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SHOW_HORI_SCROLL_BAR           ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SHOW_FIELD_COMMANDS            ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SHOW_TEXT_BOUNDARIES           ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SHOW_PROTECTED_SPACES          ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SHOW_TABLE_BOUNDARIES          ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SHOW_HIDDEN_PARAGRAPHS         ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SHOW_INDEX_MARK_BACKGROUND     ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SHOW_FOOTNOTE_BACKGROUND       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SHOW_TEXT_FIELD_BACKGROUND     ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SIZE_RELATIVE                  ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SIZE_PROTECTED                 ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SMOOTH_SCROLLING               ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SOLID_MARK_HANDLES             ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_TABLES                         ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_TEXT_FRAMES                    ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_TEXT_COLUMNS                   ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_TRANSPARENT_BACKGROUND         ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_USE_PP                         ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_USER_METRIC                    ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_ANCHOR_TYPE                  ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_ANCHOR_TYPES                 ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_ANCHOR_PAGE_NO                   ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_AUTHOR                       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_BREAK_TYPE                   ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHAIN_NEXT_NAME              ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHAIN_PREV_NAME              ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHAPTER_FORMAT               ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CLIENT_MAP                       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CONDITION                        ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CONTENT                      ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHAR_CONTOURED                   ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CONTOUR_OUTSIDE              ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CONTENT_PROTECTED                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_COUNT_EMPTY_LINES                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_DATA_BASE_NAME                   ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_DATA_TABLE_NAME              ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_DATA_COLUMN_NAME             ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_IS_DATA_BASE_FORMAT          ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_DATE                         ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_DATETIME                         ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_IS_DATE                      ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_EDIT_IN_READONLY             ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FALSE_CONTENT                    ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FILE_FORMAT                  ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_IS_FIXED                         ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FOOTNOTE_COUNTING                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FORMULA                      ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FRAME_NAME                   ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_GRAPHIC_NAME                   ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FULL_NAME                    ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_HEIGHT                           ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_IS_AUTO_HEIGHT                   ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SIZE_TYPE                        ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_HINT                         ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_HORI_ORIENT                  ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_HORI_MIRRORED                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_HORI_ORIENT_RELATION             ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_HORI_ORIENT_POSITION             ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_HYPER_LINK_U_R_L                 ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_HYPER_LINK_TARGET            ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_HYPER_LINK_NAME              ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_INFO_TYPE                        ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_INFO_FORMAT                  ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_IS_INPUT                     ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_LEVEL                            ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_LINE_INTERVAL                    ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_LINK_REGION                  ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_MACRO                            ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_MIRROR_PAGE_TOGGLE           ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SPLIT                        ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_SPLIT                       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_NUMBER_FORMAT                    ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_NUMBERING_TYPE                   ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_NUMBERING_RULES              ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_OFFSET                       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_ON                           ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_OPAQUE                       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PAGE_TOGGLE                  ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PAGE_DESC_NAME               ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PAGE_NUMBER_OFFSET               ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PLACEHOLDER                  ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PLACEHOLDER_TYPE             ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PRINT                        ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PRINT_LEFT_PAGES             ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_REFERENCE_FIELD_PART           ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_REFERENCE_FIELD_SOURCE         ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_REGISTER_PARAGRAPH_STYLE     ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SCRIPT_TYPE                  ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SEARCH_ALL                       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SEARCH_WORDS                 ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SEQUENCE_VALUE                   ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SERVER_MAP                       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SET_NUMBER                   ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SHADOW_FORMAT                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SHOW_HORI_RULER              ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SIZE                         ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_ACTUAL_SIZE                      ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SOURCE_NAME                  ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_START_AT                     ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_STATISTIC_TYPE_ID                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SUB_TYPE                     ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SURROUND                     ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_IS_EXPRESSION                    ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_IS_SHOW_FORMULA              ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_TEXT_WRAP                        ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SURROUND_CONTOUR                 ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SURROUND_ANCHORONLY          ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_TABLE_NAME                     ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_TABSTOPS                         ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_TITLE                            ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_TOP_MARGIN                       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_BOTTOM_MARGIN                    ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_TRUE_CONTENT                     ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_URL_CONTENT                      ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_USERTEXT                     ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_USER_DATA_TYPE                   ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_VALUE                            ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_VARIABLE_NAME                    ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_VARIABLE_SUBTYPE             ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_VERT_ORIENT                  ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_VERT_MIRRORED                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_VERT_ORIENT_POSITION             ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_VERT_ORIENT_RELATION             ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_IS_VISIBLE                       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_WIDTH                            ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_WORD_MODE                    ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_GRAPHIC_CROP                 ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHARACTER_FORMAT_NONE          ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_TEXT_POSITION                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_DOCUMENT_INDEX_MARK          ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_DOCUMENT_INDEX                 ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_TEXT_FIELD                     ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_BOOKMARK                       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_TEXT_TABLE                     ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CELL                           ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_TEXT_FRAME                     ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_REFERENCE_MARK                 ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_TEXT_SECTION                   ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FOOTNOTE                       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_ENDNOTE                          ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHART_ROW_AS_LABEL               ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHART_COLUMN_AS_LABEL          ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_TABLE_COLUMS                 ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_LEFT_BORDER                  ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_RIGHT_BORDER                 ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_TOP_BORDER                       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_BOTTOM_BORDER                  ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_BORDER_DISTANCE                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_LEFT_BORDER_DISTANCE         ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_RIGHT_BORDER_DISTANCE            ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_TOP_BORDER_DISTANCE          ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_BOTTOM_BORDER_DISTANCE           ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_TABLE_BORDER                     ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_TABLE_COLUMN_SEPARATORS      ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_TABLE_COLUMN_RELATIVE_SUM        ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_HEADER_TEXT                      ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_HEADER_TEXT_LEFT               ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_HEADER_TEXT_RIGHT              ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FOOTER_TEXT                    ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FOOTER_TEXT_LEFT               ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FOOTER_TEXT_RIGHT              ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_HEADER_BACK_COLOR                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_HEADER_GRAPHIC                 ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_HEADER_TRANSPARENT_BACKGROUND  ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_HEADER_LEFT_BORDER               ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_HEADER_RIGHT_BORDER          ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_HEADER_TOP_BORDER                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_HEADER_BOTTOM_BORDER           ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_HEADER_BORDER_DISTANCE         ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_HEADER_SHADOW_FORMAT             ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_HEADER_BODY_DISTANCE         ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_HEADER_IS_DYNAMIC_DISTANCE     ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_HEADER_SHARE_CONTENT           ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_HEADER_HEIGHT                  ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_HEADER_ON                        ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FOOTER_BACK_COLOR                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FOOTER_GRAPHIC                 ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FOOTER_TRANSPARENT_BACKGROUND  ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FOOTER_LEFT_BORDER               ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FOOTER_RIGHT_BORDER          ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FOOTER_TOP_BORDER                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FOOTER_BOTTOM_BORDER           ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FOOTER_BORDER_DISTANCE         ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FOOTER_SHADOW_FORMAT             ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FOOTER_BODY_DISTANCE         ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FOOTER_IS_DYNAMIC_DISTANCE     ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FOOTER_SHARE_CONTENT         ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FOOTER_HEIGHT                  ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FOOTER_ON                        ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_OVERWRITE_STYLES               ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_LOAD_NUMBERING_STYLES          ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_LOAD_PAGE_STYLES               ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_LOAD_FRAME_STYLES              ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_LOAD_TEXT_STYLES               ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FILE_NAME                        ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FILTER_NAME                  ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FILTER_OPTION                    ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PASSWORD                     ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_COPY_COUNT                     ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_COLLATE                      ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SORT                         ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PAGES                            ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FIRST_LINE_OFFSET                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SYMBOL_TEXT_DISTANCE           ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_USER_INDEX_NAME                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_REVISION                       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_UNVISITED_CHAR_STYLE_NAME      ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_VISITED_CHAR_STYLE_NAME        ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARAGRAPH_COUNT              ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_WORD_COUNT                     ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_WORD_SEPARATOR                 ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHARACTER_COUNT                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_ZOOM_VALUE                     ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_ZOOM_TYPE                        ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CREATE_FROM_MARKS                  ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CREATE_FROM_OUTLINE                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARAGRAPH_STYLE_NAMES              ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CREATE_FROM_CHAPTER                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CREATE_FROM_LABELS                 ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_USE_ALPHABETICAL_SEPARATORS        ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_USE_KEY_AS_ENTRY                   ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_USE_COMBINED_ENTRIES               ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_IS_CASE_SENSITIVE                  ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_USE_P_P                            ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_USE_DASH                           ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_USE_UPPER_CASE                     ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_LABEL_CATEGORY                     ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_LABEL_DISPLAY_TYPE                 ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_USE_LEVEL_FROM_SOURCE              ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_LEVEL_FORMAT                       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_LEVEL_PARAGRAPH_STYLES             ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_RECALC_TAB_STOPS                   ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_MAIN_ENTRY_CHARACTER_STYLE_NAME    ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CREATE_FROM_TABLES                 ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CREATE_FROM_TEXT_FRAMES            ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CREATE_FROM_GRAPHIC_OBJECTS        ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CREATE_FROM_EMBEDDED_OBJECTS       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CREATE_FROM_STAR_MATH              ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CREATE_FROM_STAR_IMAGE             ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CREATE_FROM_STAR_CHART             ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CREATE_FROM_STAR_CALC              ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CREATE_FROM_STAR_DRAW              ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CREATE_FROM_OTHER_EMBEDDED_OBJECTS ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_INDEX_AUTO_MARK_FILE_U_R_L           ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_IS_COMMA_SEPARATED                   ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SHOW_CHANGES                       ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_RECORD_CHANGES                     ;
extern const SwPropNameLen __FAR_DATA UNO_LINK_DISPLAY_NAME                       ;
extern const SwPropNameLen __FAR_DATA UNO_LINK_DISPLAY_BITMAP                     ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_HEADING_STYLE_NAME                   ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SHOW_ONLINE_LAYOUT                   ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_USER_DEFINED_ATTRIBUTES          ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_USER_DEFINED_ATTRIBUTES     ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHAR_USER_DEFINED_ATTRIBUTES     ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_FILE_PATH                            ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_CHAPTER_NUMBERING_LEVEL     ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_PARA_CONDITIONAL_STYLE_NAME        ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CHAPTER_NUMBERING_LEVEL            ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_NUMBERING_SEPARATOR                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_IS_CONTINUOUS_NUMBERING            ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_IS_AUTOMATIC                     ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_IS_ABSOLUTE_MARGINS              ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CATEGORY                         ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_DEPENDENT_TEXT_FIELDS                ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CURRENT_PRESENTATION             ;
extern const SwPropNameLen __FAR_DATA UNO_NAME_ADJUST                           ;

extern const SwPropNameLen __FAR_DATA UNO_NAME_TEXT_PORTION_TYPE;
extern const SwPropNameLen __FAR_DATA UNO_NAME_CONTROL_CHARACTER;
extern const SwPropNameLen __FAR_DATA UNO_NAME_IS_COLLAPSED;
extern const SwPropNameLen __FAR_DATA UNO_NAME_IS_START;
extern const SwPropNameLen __FAR_DATA UNO_NAME_SEQUENCE_NUMBER;
extern const SwPropNameLen __FAR_DATA UNO_NAME_REFERENCE_ID;
#endif


diff --git a/sw/inc/unosett.hxx b/sw/inc/unosett.hxx
new file mode 100644
index 0000000..deebd8f
--- /dev/null
+++ b/sw/inc/unosett.hxx
@@ -0,0 +1,326 @@
/*************************************************************************
 *
 *  $RCSfile: unosett.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:29 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _UNOSETT_HXX
#define _UNOSETT_HXX

#include <swtypes.hxx>
#ifndef _CALBCK_HXX //autogen
#include <calbck.hxx>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXTCOLUMNS_HPP_
#include <com/sun/star/text/XTextColumns.hpp>
#endif
#ifndef _COM_SUN_STAR_LANG_XSERVICEINFO_HPP_
#include <com/sun/star/lang/XServiceInfo.hpp>
#endif
#ifndef _COM_SUN_STAR_LANG_XUNOTUNNEL_HPP_
#include <com/sun/star/lang/XUnoTunnel.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XINDEXREPLACE_HPP_
#include <com/sun/star/container/XIndexReplace.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
#include <com/sun/star/beans/XPropertySet.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_PROPERTYVALUE_HPP_
#include <com/sun/star/beans/PropertyValue.hpp>
#endif
#ifndef _CPPUHELPER_IMPLBASE2_HXX_
#include <cppuhelper/implbase2.hxx> // helper for implementations
#endif
#ifndef _CPPUHELPER_IMPLBASE4_HXX_
#include <cppuhelper/implbase4.hxx> // helper for implementations
#endif
#ifndef _STRING_HXX
#include <tools/string.hxx>
#endif

class SwDoc;
class SwFmtCol;
class SwDocShell;
class SwNumRule;
struct SfxItemPropertyMap;

/******************************************************************************
 *
 ******************************************************************************/
/* -----------------04.05.98 12:28-------------------
 *
 * --------------------------------------------------*/
class SwXFootnoteProperties : public cppu::WeakAggImplHelper2
<
    ::com::sun::star::beans::XPropertySet,
    ::com::sun::star::lang::XServiceInfo
>
{
    SwDoc*                      pDoc;
    const SfxItemPropertyMap*   _pMap;

public:
    SwXFootnoteProperties(SwDoc* pDoc);
    virtual ~SwXFootnoteProperties();

    //XPropertySet
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removePropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    void            Invalidate() {pDoc = 0;}
};

/* -----------------04.05.98 12:28-------------------
 *
 * --------------------------------------------------*/
class SwXEndnoteProperties : public cppu::WeakAggImplHelper2
<
    ::com::sun::star::beans::XPropertySet,
    ::com::sun::star::lang::XServiceInfo
>
{
    SwDoc*                      pDoc;
    const SfxItemPropertyMap*   _pMap;

public:
    SwXEndnoteProperties(SwDoc* pDoc);
    virtual ~SwXEndnoteProperties();

    //XPropertySet
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removePropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    void            Invalidate() {pDoc = 0;}
};

/* -----------------04.05.98 12:28-------------------
 *
 * --------------------------------------------------*/
class SwXLineNumberingProperties : public cppu::WeakAggImplHelper2
<
    ::com::sun::star::beans::XPropertySet,
    ::com::sun::star::lang::XServiceInfo
>
{
    SwDoc*                      pDoc;
    const SfxItemPropertyMap*   _pMap;
public:
    SwXLineNumberingProperties(SwDoc* pDoc);
    virtual ~SwXLineNumberingProperties();

    //XPropertySet
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removePropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    void            Invalidate() {pDoc = 0;}
};

/* -----------------25.05.98 08:21-------------------
 *
 * --------------------------------------------------*/
class SwXNumberingRules : public cppu::WeakAggImplHelper4
<
    ::com::sun::star::container::XIndexReplace,
    ::com::sun::star::lang::XUnoTunnel,
    ::com::sun::star::beans::XPropertySet,
    ::com::sun::star::lang::XServiceInfo
>,
    public SwClient
{
    String                      sNewCharStyleNames[MAXLEVEL];
    String                      sNewBulletFontNames[MAXLEVEL];
    String                      sCreatedNumRuleName; //connects to a numbering in SwDoc
    SwDoc*                      pDoc; // wird nur fuers anmelden gebraucht
    SwDocShell*                 pDocShell; //nur, wenn als ChapterNumbering verwendet
    SwNumRule*                  pNumRule;
    const SfxItemPropertyMap*   _pMap;

    static String               sInvalidStyle;

public:
    SwXNumberingRules();
    SwXNumberingRules(SwDocShell& rDocSh);  // chapter numbering
    SwXNumberingRules(const SwNumRule& rRule); // NumRule for paragraphs, numbering styles
    SwXNumberingRules(SwDoc& rDoc); //create a new instance
    SwXNumberingRules(SwDoc& rDoc, const String& rName); //XML import
    virtual ~SwXNumberingRules();

    static const ::com::sun::star::uno::Sequence< sal_Int8 > & SwXNumberingRules::getUnoTunnelId();

    virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& aIdentifier ) throw(::com::sun::star::uno::RuntimeException);


    //XIndexReplace
    virtual void SAL_CALL replaceByIndex( sal_Int32 Index, const ::com::sun::star::uno::Any& Element ) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //XIndexAccess
    virtual sal_Int32 SAL_CALL getCount(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getByIndex(sal_Int32 nIndex) throw( ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );

    //XElementAccess
    virtual ::com::sun::star::uno::Type SAL_CALL getElementType(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL hasElements(  ) throw(::com::sun::star::uno::RuntimeException);

    //XPropertySet
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removePropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue> getNumberingRuleByIndex(const SwNumRule& rNumRule, sal_Int32 nIndex)const;
    void setNumberingRuleByIndex(SwNumRule& rNumRule,
                                const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue>& rProperties, sal_Int32 nIndex)
                                throw( ::com::sun::star::uno::RuntimeException, ::com::sun::star::lang::IllegalArgumentException );

    //SwClient
    virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);

    const String*           GetNewCharStyleNames() const {return sNewCharStyleNames;}
    const String*           GetBulletFontNames() const {return sNewBulletFontNames;}
    const SwNumRule*        GetNumRule() {return pNumRule;}

    static const String&    GetInvalidStyle();
    void    Invalidate()    {pDocShell = 0;}
};
/*-----------------12.02.98 08:27-------------------

--------------------------------------------------*/
class SwXChapterNumbering : public SwXNumberingRules
{
public:
    SwXChapterNumbering(SwDocShell& rDocSh);
    virtual ~SwXChapterNumbering();

    void    Invalidate() {SwXNumberingRules::Invalidate();}

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

};

/* -----------------27.05.98 15:44-------------------
 *
 * --------------------------------------------------*/
class SwXTextColumns : public cppu::WeakAggImplHelper2
<
    ::com::sun::star::text::XTextColumns,
    ::com::sun::star::lang::XServiceInfo
>
{
    sal_uInt32                  nReference;
    ::com::sun::star::uno::Sequence< ::com::sun::star::text::TextColumn>    aTextColumns;

public:
    SwXTextColumns(const SwFmtCol& rFmtCol);
    virtual ~SwXTextColumns();

    //XTextColumns
    virtual sal_Int32 SAL_CALL getReferenceValue(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Int16 SAL_CALL getColumnCount(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setColumnCount( sal_Int16 nColumns ) throw(::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::text::TextColumn > SAL_CALL getColumns(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setColumns( const ::com::sun::star::uno::Sequence< ::com::sun::star::text::TextColumn >& Columns ) throw(::com::sun::star::uno::RuntimeException);

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );
};
#endif


diff --git a/sw/inc/unosrch.hxx b/sw/inc/unosrch.hxx
new file mode 100644
index 0000000..d45ca31
--- /dev/null
+++ b/sw/inc/unosrch.hxx
@@ -0,0 +1,171 @@
/*************************************************************************
 *
 *  $RCSfile: unosrch.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:29 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _UNOSRCH_HXX
#define _UNOSRCH_HXX

#ifndef _COM_SUN_STAR_UTIL_XPROPERTYREPLACE_HPP_
#include <com/sun/star/util/XPropertyReplace.hpp>
#endif
#ifndef _COM_SUN_STAR_LANG_XSERVICEINFO_HPP_
#include <com/sun/star/lang/XServiceInfo.hpp>
#endif
#ifndef _COM_SUN_STAR_LANG_XUNOTUNNEL_HPP_
#include <com/sun/star/lang/XUnoTunnel.hpp>
#endif
#ifndef _CPPUHELPER_IMPLBASE3_HXX_
#include <cppuhelper/implbase3.hxx> // helper for implementations
#endif
#ifndef _STRING_HXX
#include <tools/string.hxx>
#endif

/******************************************************************************
 *
 ******************************************************************************/
struct SfxItemPropertyMap;
class SwXTextDocument;
class SwSearchProperties_Impl;
class SfxItemSet;
/*-----------------19.12.97 12:58-------------------

--------------------------------------------------*/
class SwXTextSearch : public cppu::WeakImplHelper3
<
    ::com::sun::star::util::XPropertyReplace,
    ::com::sun::star::lang::XServiceInfo,
    ::com::sun::star::lang::XUnoTunnel
>
{
    friend class SwXTextDocument;

    String                  sSearchText;
    String                  sReplaceText;

    SwSearchProperties_Impl*    pSearchProperties;
    SwSearchProperties_Impl*    pReplaceProperties;


    const SfxItemPropertyMap*   _pMap;
    sal_Bool                    bAll  : 1;
    sal_Bool                    bWord : 1;
    sal_Bool                    bBack : 1;
    sal_Bool                    bExpr : 1;
    sal_Bool                    bCase : 1;
//  sal_Bool                    bInSel: 1;  // wie geht Suchen in Selektionen?
    sal_Bool                    bStyles:1;
    sal_Bool                    bSimilarity : 1;
    sal_Bool                    bLevRelax       :1;
    sal_Int16                   nLevExchange;
    sal_Int16                   nLevAdd;
    sal_Int16                   nLevRemove;

    sal_Bool                    bIsValueSearch :1;

public:
    SwXTextSearch();
    virtual ~SwXTextSearch();


    static const ::com::sun::star::uno::Sequence< sal_Int8 > & getUnoTunnelId();

    //XUnoTunnel
    virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& aIdentifier ) throw(::com::sun::star::uno::RuntimeException);

    //XSearchDescriptor
    virtual ::rtl::OUString SAL_CALL getSearchString(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setSearchString( const ::rtl::OUString& aString ) throw(::com::sun::star::uno::RuntimeException);

    //XReplaceDescriptor
    virtual ::rtl::OUString SAL_CALL getReplaceString(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL setReplaceString(const ::rtl::OUString& aReplaceString) throw( ::com::sun::star::uno::RuntimeException );

    //XPropertySet
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removePropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //XPropertyReplace
    virtual sal_Bool SAL_CALL getValueSearch(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL setValueSearch(sal_Bool ValueSearch_) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue > SAL_CALL getSearchAttributes(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL setSearchAttributes(const ::com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue >& aSearchAttribs) throw( ::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue > SAL_CALL getReplaceAttributes(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL setReplaceAttributes(const ::com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue >& aSearchAttribs) throw( ::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );

    //XServiceInfo
    virtual ::rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const ::rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    void    FillSearchItemSet(SfxItemSet& rSet) const;
    void    FillReplaceItemSet(SfxItemSet& rSet) const;

    sal_Bool    HasSearchAttributes() const;
    sal_Bool    HasReplaceAttributes() const;

};

#endif

diff --git a/sw/inc/unostyle.hxx b/sw/inc/unostyle.hxx
new file mode 100644
index 0000000..8cc7da5
--- /dev/null
+++ b/sw/inc/unostyle.hxx
@@ -0,0 +1,324 @@
/*************************************************************************
 *
 *  $RCSfile: unostyle.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:29 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _UNOSTYLE_HXX
#define _UNOSTYLE_HXX

#ifndef _SFXSTYLE_HXX //autogen
#include <svtools/style.hxx>
#endif
#ifndef _SFXLSTNER_HXX //autogen
#include <svtools/lstner.hxx>
#endif
#ifndef _UNOCOLL_HXX
#include <unocoll.hxx>
#endif
#ifndef _UNOMAP_HXX
#include <unomap.hxx>
#endif
#ifndef _COM_SUN_STAR_STYLE_XSTYLE_HPP_
#include <com/sun/star/style/XStyle.hpp>
#endif
#ifndef _COM_SUN_STAR_LANG_XUNOTUNNEL_HPP_
#include <com/sun/star/lang/XUnoTunnel.hpp>
#endif
#ifndef _COM_SUN_STAR_STYLE_XSTYLELOADER_HPP_
#include <com/sun/star/style/XStyleLoader.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XNAMECONTAINER_HPP_
#include <com/sun/star/container/XNameContainer.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
#include <com/sun/star/beans/XPropertySet.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSTATE_HPP_
#include <com/sun/star/beans/XPropertyState.hpp>
#endif
#ifndef _CPPUHELPER_IMPLBASE5_HXX_
#include <cppuhelper/implbase5.hxx> // helper for implementations
#endif

class SwDocShell;
struct SfxItemPropertyMap;
class SwXStyle;
class SwStyleProperties_Impl;
class SwStartNode;
/******************************************************************************
 *
 ******************************************************************************/
/*-----------------12.02.98 08:27-------------------

--------------------------------------------------*/
class SwXStyleFamilies :  public cppu::WeakImplHelper4
<
    ::com::sun::star::container::XIndexAccess,
    ::com::sun::star::container::XNameAccess,
    ::com::sun::star::lang::XServiceInfo,
    ::com::sun::star::style::XStyleLoader
>,
    public SwUnoCollection
{
    SwDocShell*         pDocShell;

    ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer > *   pxCharStyles;
    ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer > *   pxParaStyles;
    ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer > *   pxFrameStyles;
    ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer > *   pxPageStyles;
    ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer > *   pxNumberingStyles;

    sal_Bool                bLoadStyleText      : 1;
    sal_Bool                bLoadStyleFrame     : 1;
    sal_Bool                bLoadStylePage      : 1;
    sal_Bool                bLoadStyleOverwrite : 1;
    sal_Bool                bLoadStyleNumbering : 1;

public:
    SwXStyleFamilies(SwDocShell& rDocShell);
    virtual ~SwXStyleFamilies();

    //XNameAccess
    virtual ::com::sun::star::uno::Any SAL_CALL getByName(const rtl::OUString& Name) throw( ::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getElementNames(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual sal_Bool SAL_CALL hasByName(const rtl::OUString& Name) throw( ::com::sun::star::uno::RuntimeException );

    //XIndexAccess
    virtual sal_Int32 SAL_CALL getCount(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Any SAL_CALL getByIndex(sal_Int32 nIndex) throw( ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );

    //XElementAccess
    virtual ::com::sun::star::uno::Type SAL_CALL getElementType(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL hasElements(  ) throw(::com::sun::star::uno::RuntimeException);

    //XStyleLoader
    virtual void SAL_CALL loadStylesFromURL(const rtl::OUString& rURL, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& aOptions) throw( ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > SAL_CALL getStyleLoaderOptions(void) throw( ::com::sun::star::uno::RuntimeException );


    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    static const String&    GetProgrammaticName(const String& rUIName, SfxStyleFamily eFamily);
    static const String&    GetUIName(const String& rProgrammaticName, SfxStyleFamily eFamily);
};

/* -----------------26.05.98 10:56-------------------
 *
 * --------------------------------------------------*/
class SwXStyleFamily : public cppu::WeakImplHelper3
<
    ::com::sun::star::container::XNameContainer,
    ::com::sun::star::lang::XServiceInfo,
    ::com::sun::star::container::XIndexAccess
>,
    public SfxListener
{
    SfxStyleFamily              eFamily;        // Familie
    SfxStyleSheetBasePool*      pBasePool;
//  const SfxItemPropertyMap*   _pPropMap;
    SwDocShell*                 pDocShell;

    SwXStyle*               _FindStyle(const String& rStyleName) const;
public:
    SwXStyleFamily(SwDocShell* pDocShell, sal_uInt16 nFamily);
    ~SwXStyleFamily();

    //XIndexAccess
    virtual sal_Int32 SAL_CALL getCount(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Any SAL_CALL getByIndex(sal_Int32 nIndex) throw( ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );

    //XElementAccess
    virtual ::com::sun::star::uno::Type SAL_CALL SAL_CALL getElementType(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL SAL_CALL hasElements(  ) throw(::com::sun::star::uno::RuntimeException);

    //XNameAccess
    virtual ::com::sun::star::uno::Any SAL_CALL getByName(const rtl::OUString& Name) throw( ::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getElementNames(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual sal_Bool SAL_CALL hasByName(const rtl::OUString& Name) throw( ::com::sun::star::uno::RuntimeException );

    //XNameContainer
    virtual void SAL_CALL insertByName(const rtl::OUString& Name, const ::com::sun::star::uno::Any& Element) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::container::ElementExistException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL replaceByName(const rtl::OUString& Name, const ::com::sun::star::uno::Any& Element) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL removeByName(const rtl::OUString& Name) throw( ::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );

   //SfxListener
    virtual void        Notify( SfxBroadcaster& rBC, const SfxHint& rHint );

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );
};
/* -----------------20.05.98 09:51-------------------
 *
 * --------------------------------------------------*/
class SwXStyle : public cppu::WeakImplHelper5
<
    ::com::sun::star::style::XStyle,
    ::com::sun::star::beans::XPropertySet,
    ::com::sun::star::lang::XServiceInfo,
    ::com::sun::star::lang::XUnoTunnel,
    ::com::sun::star::beans::XPropertyState
>,
        public SfxListener
{
    friend class SwXStyleFamily;
    SwDoc*                  m_pDoc;
    String                  sStyleName;
    SfxStyleSheetBasePool*  pBasePool;
    SfxStyleFamily          eFamily;    // fuer Notify

    sal_Bool                    bIsDescriptor  : 1;
    sal_Bool                    bIsConditional : 1;
    String                  sParentStyleName;
    SwStyleProperties_Impl* pPropImpl;

    void    ApplyDescriptorProperties();
protected:
    void    Invalidate();

    const SfxStyleSheetBasePool*    GetBasePool() const {return pBasePool;}
    SfxStyleSheetBasePool*  GetBasePool() {return pBasePool;}

    void                SetStyleName(const String& rSet){ sStyleName = rSet;}
public:
    SwXStyle(SfxStyleFamily eFam = SFX_STYLE_FAMILY_PARA, BOOL bConditional = FALSE);
    SwXStyle(SfxStyleSheetBasePool& rPool, SfxStyleFamily eFam,
                                SwDoc*  pDoc,
                                const String& rStyleName);//,
                                    //const SfxItemPropertyMap* _pMap);
    ~SwXStyle();

    TYPEINFO();

    static const ::com::sun::star::uno::Sequence< sal_Int8 > & getUnoTunnelId();

    //XUnoTunnel
    virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& aIdentifier ) throw(::com::sun::star::uno::RuntimeException);

    //XNamed
    virtual rtl::OUString SAL_CALL getName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL setName(const rtl::OUString& Name_) throw( ::com::sun::star::uno::RuntimeException );

    //XStyle
    virtual sal_Bool SAL_CALL isUserDefined(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual sal_Bool SAL_CALL isInUse(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual rtl::OUString SAL_CALL getParentStyle(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL setParentStyle(const rtl::OUString& aParentStyle) throw( ::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException );

    //XPropertySet
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removePropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //XPropertyState
    virtual ::com::sun::star::beans::PropertyState SAL_CALL getPropertyState( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyState > SAL_CALL getPropertyStates( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aPropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyToDefault( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyDefault( const ::rtl::OUString& aPropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    //SfxListener
    virtual void        Notify( SfxBroadcaster& rBC, const SfxHint& rHint );

    const String&       GetStyleName() const { return sStyleName;}
    SfxStyleFamily      GetFamily() const {return eFamily;}

    sal_Bool                IsDescriptor() const {return bIsDescriptor;}
    sal_Bool                IsConditional() const { return bIsConditional;}
    const String&       GetParentStyleName() const { return sParentStyleName;}
    void                SetDoc(SwDoc* pDc, SfxStyleSheetBasePool*   pPool)
                            {
                                bIsDescriptor = sal_False; m_pDoc = pDc;
                                pBasePool = pPool;
                                StartListening(*pBasePool);
                            }
};

/* -----------------24.08.98 16:04-------------------
 *
 * --------------------------------------------------*/
class SwXPageStyle : public SwXStyle
{
    SwDocShell*     pDocShell;
public:
    SwXPageStyle(SfxStyleSheetBasePool& rPool, SwDocShell* pDocSh, SfxStyleFamily eFam,
                                const String& rStyleName);//,
                                    //const SfxItemPropertyMap* _pMap);
    SwXPageStyle(SwDocShell* pDocSh);
    ~SwXPageStyle();

    virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    const SwStartNode* GetStartNode(sal_Bool bHeader, sal_Bool bLeft);
};
#endif


diff --git a/sw/inc/unotbl.hxx b/sw/inc/unotbl.hxx
new file mode 100644
index 0000000..01cb546
--- /dev/null
+++ b/sw/inc/unotbl.hxx
@@ -0,0 +1,584 @@
/*************************************************************************
 *
 *  $RCSfile: unotbl.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:29 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _UNOTBL_HXX
#define _UNOTBL_HXX

#ifndef _UNOOBJ_HXX
#include <unoobj.hxx>
#endif
#ifndef _COM_SUN_STAR_CHART_XCHARTDATA_HPP_
#include <com/sun/star/chart/XChartData.hpp>
#endif
#ifndef _COM_SUN_STAR_CHART_XCHARTDATAARRAY_HPP_
#include <com/sun/star/chart/XChartDataArray.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXTTABLECURSOR_HPP_
#include <com/sun/star/text/XTextTableCursor.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXTTABLE_HPP_
#include <com/sun/star/text/XTextTable.hpp>
#endif
#ifndef _COM_SUN_STAR_TABLE_XCELLRANGE_HPP_
#include <com/sun/star/table/XCellRange.hpp>
#endif
#ifndef _COM_SUN_STAR_TABLE_XAUTOFORMATTABLE_HPP_
#include <com/sun/star/table/XAutoFormattable.hpp>
#endif

#ifndef _CPPUHELPER_IMPLBASE9_HXX_
#include <cppuhelper/implbase9.hxx> // helper for implementations
#endif
#ifndef _CPPUHELPER_IMPLBASE8_HXX_
#include <cppuhelper/implbase8.hxx> // helper for implementations
#endif
#ifndef _CPPUHELPER_IMPLBASE5_HXX_
#include <cppuhelper/implbase5.hxx> // helper for implementations
#endif

class SwTableBoxFmt;
class SwTableLine;
class SwTableCursor;
class SwTableBoxFmt;
class SwTableLine;
class SwTableCursor;

typedef
cppu::WeakImplHelper4
<
    ::com::sun::star::table::XCell,
    ::com::sun::star::lang::XServiceInfo,
    ::com::sun::star::beans::XPropertySet,
    ::com::sun::star::container::XEnumerationAccess
>
SwXCellBaseClass;
class SwXCell : public SwXCellBaseClass,
    public SwXText,
    public SwClient
{
    SfxItemPropertySet      aPropSet;
    const String            sCellName;  //kann auch leer sein!
    SwTableBox*             pBox;       // only set in non-XML import
    const SwStartNode*      pStartNode; // only set in XML import

    SwFrmFmt* GetFrmFmt() const { return (SwFrmFmt*)GetRegisteredIn(); }

protected:
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextCursor >         createCursor();
    sal_Bool                            IsValid();
public:
    SwXCell(SwFrmFmt* pTblFmt, SwTableBox* pBox, const String& rCellName);
    SwXCell(SwFrmFmt* pTblFmt, const SwStartNode& rStartNode); // XML import interface
    virtual ~SwXCell();

    TYPEINFO();

    virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type& aType ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL acquire(  ) throw();
    virtual void SAL_CALL release(  ) throw();

    //XTypeProvider
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId(  ) throw(::com::sun::star::uno::RuntimeException);

    //XCell
    virtual ::rtl::OUString SAL_CALL getFormula(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setFormula( const ::rtl::OUString& aFormula ) throw(::com::sun::star::uno::RuntimeException);
    virtual double SAL_CALL getValue(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setValue( double nValue ) throw(::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::table::CellContentType SAL_CALL getType(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Int32 SAL_CALL getError(  ) throw(::com::sun::star::uno::RuntimeException);

    //XText
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextCursor >  SAL_CALL createTextCursor(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextCursor >  SAL_CALL createTextCursorByRange(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & aTextPosition) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL  setString(const rtl::OUString& aString) throw( ::com::sun::star::uno::RuntimeException );

    //XPropertySet
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removePropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    //SwClient
    virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);

    //XEnumerationAccess - frueher XParagraphEnumerationAccess
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration >  SAL_CALL createEnumeration(void) throw( ::com::sun::star::uno::RuntimeException );

    //XElementAccess
    virtual ::com::sun::star::uno::Type SAL_CALL getElementType(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL hasElements(  ) throw(::com::sun::star::uno::RuntimeException);

    const SwTableBox*   GetTblBox()const {return pBox;}
    static SwXCell*     CreateXCell(SwFrmFmt* pTblFmt, SwTableBox* pBox, const String* pCellName = 0);
    static SwTableBox*  FindBox(SwTable* pTable, SwTableBox* pBox);
};
/* -----------------27.06.98 15:40-------------------
 *
 * --------------------------------------------------*/
class SwXTextTableRow : public cppu::WeakImplHelper2
<
    ::com::sun::star::beans::XPropertySet,
    ::com::sun::star::lang::XServiceInfo
>,
    public SwClient
{
    SfxItemPropertySet      aPropSet;
    SwTableLine*            pLine;

    SwFrmFmt* GetFrmFmt() const { return (SwFrmFmt*)GetRegisteredIn(); }
public:
    SwXTextTableRow(SwFrmFmt* pFmt, SwTableLine* pLine);
    virtual ~SwXTextTableRow();

    TYPEINFO();

    //XPropertySet
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removePropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    //SwClient
    virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);

    const SwTableLine*  GetTblRow() const {return pLine;}
    static SwTableLine* FindLine(SwTable* pTable, SwTableLine* pLine);
};
/* -----------------20.07.98 13:03-------------------
 *
 * --------------------------------------------------*/
class SwXTextTableCursor : public cppu::WeakImplHelper3
<
    ::com::sun::star::text::XTextTableCursor,
    ::com::sun::star::lang::XServiceInfo,
    ::com::sun::star::beans::XPropertySet
>,
    public SwClient
{
    SwDepend                aCrsrDepend;
    SfxItemPropertySet      aPropSet;

    SwFrmFmt*       GetFrmFmt() const { return (SwFrmFmt*)GetRegisteredIn(); }
    SwUnoCrsr*      GetCrsr() const { return (SwUnoCrsr*)aCrsrDepend.GetRegisteredIn(); }

public:
    SwXTextTableCursor(SwFrmFmt* pFmt, SwTableBox* pBox);
    SwXTextTableCursor(SwFrmFmt& rTableFmt,
                        const SwTableCursor* pTableSelection);
    virtual ~SwXTextTableCursor();

    //XTextTableCursor
    virtual ::rtl::OUString SAL_CALL getRangeName(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL gotoCellByName( const ::rtl::OUString& aCellName, sal_Bool bExpand ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL goLeft( sal_Int16 nCount, sal_Bool bExpand ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL goRight( sal_Int16 nCount, sal_Bool bExpand ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL goUp( sal_Int16 nCount, sal_Bool bExpand ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL goDown( sal_Int16 nCount, sal_Bool bExpand ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL gotoStart( sal_Bool bExpand ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL gotoEnd( sal_Bool bExpand ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL mergeRange(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL splitRange( sal_Int16 Count, sal_Bool Horizontal ) throw(::com::sun::star::uno::RuntimeException);

    //XPropertySet
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removePropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    //SwClient
    virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);
};

/*-----------------11.12.97 09:38-------------------

--------------------------------------------------*/
struct SwRangeDescriptor
{
    sal_uInt16 nTop;
    sal_uInt16 nBottom;
    sal_uInt16 nLeft;
    sal_uInt16 nRight;
};

class SwTableProperties_Impl;
class SwXTextTable : public cppu::WeakImplHelper9
<
    ::com::sun::star::text::XTextTable,
    ::com::sun::star::lang::XServiceInfo,
    ::com::sun::star::table::XCellRange,
    ::com::sun::star::chart::XChartDataArray,
    ::com::sun::star::beans::XPropertySet,
    ::com::sun::star::container::XNamed,
    ::com::sun::star::table::XAutoFormattable,
    ::com::sun::star::util::XSortable,
    ::com::sun::star::lang::XUnoTunnel
>,
    public SwClient
{
    SwEventListenerContainer    aLstnrCntnr;
    SfxItemPropertySet          aPropSet;
    const SfxItemPropertyMap*   _pMap;
    SwSortOptions*              pLastSortOptions;

    // Descriptor-interface
    SwTableProperties_Impl*     pTableProps;
    String                      m_sTableName;
    sal_Bool                        bIsDescriptor;
    unsigned short              nRows;
    unsigned short              nColumns;


    sal_Bool                        bFirstRowAsLabel    :1;
    sal_Bool                        bFirstColumnAsLabel :1;

public:
    SwXTextTable();
    SwXTextTable(SwFrmFmt& rFrmFmt);
    virtual ~SwXTextTable();

    static const ::com::sun::star::uno::Sequence< sal_Int8 > & getUnoTunnelId();

    //XUnoTunnel
    virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& aIdentifier ) throw(::com::sun::star::uno::RuntimeException);

    TYPEINFO();

    //XTextTable
    virtual void SAL_CALL initialize( sal_Int32 nRows, sal_Int32 nColumns ) throw(::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::table::XTableRows > SAL_CALL getRows(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::table::XTableColumns > SAL_CALL getColumns(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::table::XCell > SAL_CALL getCellByName( const ::rtl::OUString& aCellName ) throw(::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getCellNames(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextTableCursor > SAL_CALL createCursorByCellName( const ::rtl::OUString& aCellName ) throw(::com::sun::star::uno::RuntimeException);

    //XTextContent
    virtual void SAL_CALL attach(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xTextRange) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > SAL_CALL getAnchor(  ) throw(::com::sun::star::uno::RuntimeException);

    //XComponent
    virtual void SAL_CALL dispose(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL addEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > & aListener) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL removeEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > & aListener) throw( ::com::sun::star::uno::RuntimeException );


    //XCellRange
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::table::XCell > SAL_CALL getCellByPosition( sal_Int32 nColumn, sal_Int32 nRow ) throw(::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::table::XCellRange > SAL_CALL getCellRangeByPosition( sal_Int32 nLeft, sal_Int32 nTop, sal_Int32 nRight, sal_Int32 nBottom ) throw(::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::table::XCellRange > SAL_CALL getCellRangeByName( const ::rtl::OUString& aRange ) throw(::com::sun::star::uno::RuntimeException);

    //XChartDataArray
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< double > > SAL_CALL getData(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setData( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< double > >& aData ) throw(::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getRowDescriptions(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setRowDescriptions( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aRowDescriptions ) throw(::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getColumnDescriptions(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setColumnDescriptions( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aColumnDescriptions ) throw(::com::sun::star::uno::RuntimeException);

    //XChartData
    virtual void SAL_CALL addChartDataChangeEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::chart::XChartDataChangeEventListener >& aListener ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeChartDataChangeEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::chart::XChartDataChangeEventListener >& aListener ) throw(::com::sun::star::uno::RuntimeException);
    virtual double SAL_CALL getNotANumber(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL isNotANumber( double nNumber ) throw(::com::sun::star::uno::RuntimeException);

    //XSortable
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > SAL_CALL createSortDescriptor(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL sort(const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& xDescriptor) throw( ::com::sun::star::uno::RuntimeException );

    //XAutoFormattable
    virtual void SAL_CALL autoFormat(const rtl::OUString& aName) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );

    //XPropertySet
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removePropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //XNamed
    virtual rtl::OUString SAL_CALL getName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL setName(const rtl::OUString& Name_) throw( ::com::sun::star::uno::RuntimeException );

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    void attachToRange(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xTextRange)throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );

    sal_uInt16          getRowCount(void);
    sal_uInt16          getColumnCount(void);
    ::com::sun::star::uno::Reference< ::com::sun::star::table::XCellRange >     GetRangeByName(SwFrmFmt* pFmt, SwTable* pTable,
                        const String& sTLName, const String& sBRName,
                        SwRangeDescriptor& rDesc);

    //SwClient
    virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);

    SwFrmFmt* GetFrmFmt() const { return (SwFrmFmt*)GetRegisteredIn(); }

    static SwXTextTable* GetImplementation(::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface> xRef );
};

/* -----------------27.04.98 16:41-------------------
 *
 * --------------------------------------------------*/
class SwXCellRange : public cppu::WeakImplHelper6
<
    ::com::sun::star::table::XCellRange,
    ::com::sun::star::lang::XServiceInfo,
    ::com::sun::star::lang::XUnoTunnel,
    ::com::sun::star::beans::XPropertySet,
    ::com::sun::star::chart::XChartDataArray,
    ::com::sun::star::util::XSortable
>,
    public SwClient
{
    SwDepend                    aCursorDepend; //the cursor is removed after the doc has been removed

    SwRangeDescriptor           aRgDesc;
    SfxItemPropertySet          aPropSet;

    SwUnoCrsr*                  pTblCrsr;
    SwSortOptions*              pLastSortOptions;
    const SfxItemPropertyMap*   _pMap;

    sal_Bool                        bFirstRowAsLabel    :1;
    sal_Bool                        bFirstColumnAsLabel :1;

public:
    SwXCellRange();
    SwXCellRange(SwUnoCrsr* pCrsr, SwFrmFmt& rFrmFmt, SwRangeDescriptor& rDesc);
    ~SwXCellRange();

    TYPEINFO();

    static const ::com::sun::star::uno::Sequence< sal_Int8 > & getUnoTunnelId();

    //XUnoTunnel
    virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& aIdentifier ) throw(::com::sun::star::uno::RuntimeException);


    //XCellRange
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::table::XCell > SAL_CALL getCellByPosition( sal_Int32 nColumn, sal_Int32 nRow ) throw(::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::table::XCellRange > SAL_CALL getCellRangeByPosition( sal_Int32 nLeft, sal_Int32 nTop, sal_Int32 nRight, sal_Int32 nBottom ) throw(::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::table::XCellRange > SAL_CALL getCellRangeByName( const ::rtl::OUString& aRange ) throw(::com::sun::star::uno::RuntimeException);

    //XPropertySet
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removePropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //XChartData
    virtual void SAL_CALL addChartDataChangeEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::chart::XChartDataChangeEventListener >& aListener ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeChartDataChangeEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::chart::XChartDataChangeEventListener >& aListener ) throw(::com::sun::star::uno::RuntimeException);
    virtual double SAL_CALL getNotANumber(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL isNotANumber( double nNumber ) throw(::com::sun::star::uno::RuntimeException);

    //XChartDataArray
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< double > > SAL_CALL getData(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setData( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< double > >& aData ) throw(::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getRowDescriptions(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setRowDescriptions( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aRowDescriptions ) throw(::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getColumnDescriptions(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setColumnDescriptions( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aColumnDescriptions ) throw(::com::sun::star::uno::RuntimeException);

    //XSortable
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > SAL_CALL createSortDescriptor(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL sort(const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& xDescriptor) throw( ::com::sun::star::uno::RuntimeException );

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    //SwClient
    virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);

    SwFrmFmt*   GetFrmFmt() const { return (SwFrmFmt*)GetRegisteredIn(); }
    sal_uInt16      getRowCount(void);
    sal_uInt16      getColumnCount(void);
};
/* -----------------03.02.99 07:31-------------------
 *
 * --------------------------------------------------*/
class SwXTableRows : public cppu::WeakImplHelper2
<
    ::com::sun::star::table::XTableRows,
    ::com::sun::star::lang::XServiceInfo
>,
    public SwClient

{
    SwFrmFmt* GetFrmFmt() const { return (SwFrmFmt*)GetRegisteredIn(); }
public:
    SwXTableRows(SwFrmFmt& rFrmFmt);
    virtual ~SwXTableRows();

// automatisch auskommentiert - [getIdlClass or queryInterface] - Bitte XTypeProvider benutzen!
//  virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::reflection::XIdlClass >  > getIdlClasses(void) throw( ::com::sun::star::uno::RuntimeException );

// automatisch auskommentiert - [getIdlClass or queryInterface] - Bitte XTypeProvider benutzen!
//  virtual sal_Bool        queryInterface( ::com::sun::star::uno::Uik aUik, ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >  & rOut );

//  SMART_UNO_DECLARATION( SwXTableRows, UsrObject );

    //XIndexAccess
    virtual sal_Int32 SAL_CALL getCount(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Any SAL_CALL getByIndex(sal_Int32 nIndex) throw( ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );

    //XElementAccess
    virtual ::com::sun::star::uno::Type SAL_CALL getElementType(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL hasElements(  ) throw(::com::sun::star::uno::RuntimeException);

    //XTableRows
    virtual void SAL_CALL insertByIndex(sal_Int32 nIndex, sal_Int32 nCount) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL removeByIndex(sal_Int32 nIndex, sal_Int32 nCount) throw( ::com::sun::star::uno::RuntimeException );

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    //SwClient
    virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);
};

/* -----------------03.02.99 07:31-------------------
 *
 * --------------------------------------------------*/
class SwXTableColumns : public cppu::WeakImplHelper2
<
    ::com::sun::star::table::XTableColumns,
    ::com::sun::star::lang::XServiceInfo
>,
    public SwClient

{
    SwFrmFmt* GetFrmFmt() const { return (SwFrmFmt*)GetRegisteredIn(); }
public:
    SwXTableColumns(SwFrmFmt& rFrmFmt);
    virtual ~SwXTableColumns();

// automatisch auskommentiert - [getIdlClass or queryInterface] - Bitte XTypeProvider benutzen!
//  virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::reflection::XIdlClass >  > getIdlClasses(void) throw( ::com::sun::star::uno::RuntimeException );

// automatisch auskommentiert - [getIdlClass or queryInterface] - Bitte XTypeProvider benutzen!
//  virtual sal_Bool        queryInterface( ::com::sun::star::uno::Uik aUik, ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >  & rOut );

//  SMART_UNO_DECLARATION( SwXTableColumns, UsrObject );

    //XIndexAccess
    virtual sal_Int32 SAL_CALL getCount(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Any SAL_CALL getByIndex(sal_Int32 nIndex) throw( ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );

    //XElementAccess
    virtual ::com::sun::star::uno::Type SAL_CALL getElementType(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL hasElements(  ) throw(::com::sun::star::uno::RuntimeException);

    //XTableColumns
    virtual void SAL_CALL insertByIndex(sal_Int32 nIndex, sal_Int32 nCount) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL removeByIndex(sal_Int32 nIndex, sal_Int32 nCount) throw( ::com::sun::star::uno::RuntimeException );

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    //SwClient
    virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);
};

#endif




diff --git a/sw/inc/usrfld.hxx b/sw/inc/usrfld.hxx
new file mode 100644
index 0000000..7868ce7
--- /dev/null
+++ b/sw/inc/usrfld.hxx
@@ -0,0 +1,166 @@
/*************************************************************************
 *
 *  $RCSfile: usrfld.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:29 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _USRFLD_HXX
#define _USRFLD_HXX

#include "fldbas.hxx"

class SfxPoolItem;
class SwCalc;
class SwDoc;

/*--------------------------------------------------------------------
    Beschreibung: Benutzerfelder
 --------------------------------------------------------------------*/

class SwUserFieldType : public SwValueFieldType
{
    BOOL    bValidValue : 1;
    BOOL    bDeleted : 1;
    double  nValue;
    String  aName;
    String  aContent;
    USHORT  nType;

public:
    SwUserFieldType( SwDoc* pDocPtr, const String& );

    virtual const String&   GetName() const;
    virtual SwFieldType*    Copy() const;

    String                  Expand(ULONG nFmt, USHORT nSubType, USHORT nLng);

    String                  GetContent( ULONG nFmt = 0 );
           void             SetContent( const String& rStr, ULONG nFmt = 0 );
           void             CtrlSetContent( const String& rStr );

    inline BOOL             IsValid() const;
    inline void             ChgValid( BOOL bNew );

    virtual void            Modify( SfxPoolItem* pOld, SfxPoolItem* pNew );

           double           GetValue(SwCalc& rCalc);    // Member nValue neu berrechnen
    inline double           GetValue() const;
    inline void             SetValue(const double nVal);

    inline USHORT           GetType() const;
    inline void             SetType(USHORT);

    BOOL                    IsDeleted() const       { return bDeleted; }
    void                    SetDeleted( BOOL b )    { bDeleted = b; }

    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );
};

inline BOOL SwUserFieldType::IsValid() const
    { return bValidValue; }

inline void SwUserFieldType::ChgValid( BOOL bNew )
    { bValidValue = bNew; }

inline double SwUserFieldType::GetValue() const
    { return nValue; }

inline void SwUserFieldType::SetValue(const double nVal)
    { nValue = nVal; }

inline USHORT SwUserFieldType::GetType() const
    { return nType; }

inline void SwUserFieldType::SetType(USHORT nSub)
{
    nType = nSub;
    EnableFormat(!(nSub & GSE_STRING));
}

/*--------------------------------------------------------------------
    Beschreibung: Benutzerfelder
 --------------------------------------------------------------------*/

class SwUserField : public SwValueField
{
    USHORT  nSubType;

public:
    SwUserField(SwUserFieldType*, USHORT nSub = 0, ULONG nFmt = 0);

    virtual USHORT          GetSubType() const;
    virtual void            SetSubType(USHORT nSub);

    virtual double          GetValue() const;
    virtual void            SetValue( const double& rVal );

    virtual String          Expand() const;
    virtual SwField*        Copy() const;
    virtual String          GetCntnt(BOOL bName = FALSE) const;

    // Name kann nicht geaendert werden
    virtual const String&   GetPar1() const;

    // Inhalt
    virtual String          GetPar2() const;
    virtual void            SetPar2(const String& rStr);
    virtual BOOL        QueryValue( com::sun::star::uno::Any& rVal, const String& rProperty ) const;
    virtual BOOL        PutValue( const com::sun::star::uno::Any& rVal, const String& rProperty );
};

#endif // _USRFLD_HXX
diff --git a/sw/inc/viewopt.hxx b/sw/inc/viewopt.hxx
new file mode 100644
index 0000000..73acc02
--- /dev/null
+++ b/sw/inc/viewopt.hxx
@@ -0,0 +1,602 @@
/*************************************************************************
 *
 *  $RCSfile: viewopt.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:29 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _VIEWOPT_HXX
#define _VIEWOPT_HXX

#ifndef _GEN_HXX //autogen
#include <tools/gen.hxx>
#endif
#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif
#ifndef _SV_COLOR_HXX //autogen
#include <vcl/color.hxx>
#endif
#include "authratr.hxx"

class SwRect;
class Window;
class OutputDevice;
class ViewShell;
class SwDocShell;

#define VIEWOPT_1_IDLE          0x00000001L
#define VIEWOPT_1_TAB           0x00000002L
#define VIEWOPT_1_BLANK         0x00000004L
#define VIEWOPT_1_HARDBLANK     0x00000008L
#define VIEWOPT_1_PARAGRAPH     0x00000010L
#define VIEWOPT_1_LINEBREAK     0x00000020L
#define VIEWOPT_1_PAGEBREAK     0x00000040L
#define VIEWOPT_1_COLUMNBREAK   0x00000080L
#define VIEWOPT_1_SOFTHYPH      0x00000100L
#define VIEWOPT_1_TOX           0x00000200L
#define VIEWOPT_1_REF           0x00000400L
#define VIEWOPT_1_FLDNAME       0x00000800L
#define VIEWOPT_1_FIELD         0x00001000L
#define VIEWOPT_1_FOOTNOTE      0x00002000L
#define VIEWOPT_1_POSTITS       0x00004000L
#define VIEWOPT_1_HIDDEN        0x00008000L
#define VIEWOPT_1_SUBSLINES     0x00010000L
#define VIEWOPT_1_GRAPHIC       0x00020000L
#define VIEWOPT_1_TABLE         0x00040000L
#define VIEWOPT_1_DRAW          0x00080000L
#define VIEWOPT_1_CONTROL       0x00100000L
#define VIEWOPT_1_SUBSTABLE     0x00200000L
#define VIEWOPT_1_CROSSHAIR     0x00400000L
#define VIEWOPT_1_SNAP          0x00800000L
#define VIEWOPT_1_SYNCHRONIZE   0x01000000L
#define VIEWOPT_1_GRIDVISIBLE   0x02000000L
#define VIEWOPT_1_ONLINESPELL   0x04000000L
#define VIEWOPT_1_HIDESPELL     0x08000000L
#define VIEWOPT_1_RESERVED1     0x10000000L
#define VIEWOPT_1_VIEWMETACHARS 0x20000000L
#define VIEWOPT_1_PAGEBACK      0x40000000L
#define VIEWOPT_1_SOLIDMARKHDL  0x80000000L

#define VIEWOPT_CORE2_BLACKFONT         0x00000001L
#define VIEWOPT_CORE2_HIDDENPARA        0x00000002L
#define VIEWOPT_CORE2_SMOOTHSCROLL      0x00000004L
#define VIEWOPT_CORE2_CRSR_IN_PROT      0x00000008L
#define VIEWOPT_CORE2_SECTION_BOUNDS    0x00000010L
#define VIEWOPT_CORE2_INDEX_BACKGROUND  0x00000020L
#define VIEWOPT_CORE2_BIGMARKHDL        0x00000040L

#define VIEWOPT_2_TOOLBOX           0x00000001L
#define VIEWOPT_2_TOOLBOXTEXT       0x00000002L
#define VIEWOPT_2_TOOLBOXBITMAP     0x00000004L
#define VIEWOPT_2_TOOLBOXBOTH       0x00000008L
#define VIEWOPT_2_TOOLBOXLEFT       0x00000010L
#define VIEWOPT_2_TOOLBOXRIGHT      0x00000020L
#define VIEWOPT_2_TOOLBOXTOP        0x00000040L
#define VIEWOPT_2_TOOLBOXBOTTOM     0x00000080L
#define VIEWOPT_2_UNUSED1           0x00000100L
#define VIEWOPT_2_RIBBONBAR         0x00000200L
#define VIEWOPT_2_TABWIN            0x00000400L
#define VIEWOPT_2_VSCROLLBAR        0x00000800L
#define VIEWOPT_2_HSCROLLBAR        0x00001000L
#define VIEWOPT_2_STATUSLINE        0x00002000L
#define VIEWOPT_2_VLIN              0x00004000L
#define VIEWOPT_2_SVLOOK            0x00008000L
#define VIEWOPT_2_MODIFIED          0x00010000L
#define VIEWOPT_2_KEEPASPECTRATIO   0x00020000L
#define VIEWOPT_2_GRFKEEPZOOM       0x00040000L
#define VIEWOPT_2_EXECHYPERLINKS    0x00080000L
#define VIEWOPT_2_RESERVED2         0x00100000L
#define VIEWOPT_2_RESERVED3         0x00200000L
#define VIEWOPT_2_RESERVED4         0x00400000L
#define VIEWOPT_2_PRTFORMAT         0x00800000L
#define VIEWOPT_2_SHADOWCRSR        0x01000000L

//Tabellenhintergrund
#define TBL_DEST_CELL   0
#define TBL_DEST_ROW    1
#define TBL_DEST_TBL    2

// Implementierung in core/text/txtpaint.cxx
extern void SyncVout( const OutputDevice *pOut );

class SwViewOption
{
protected:
    static USHORT   nPixelTwips;// 1 Pixel == ? Twips

    String          sSymbolFont;        // Symbolzeichensatz
    UINT32          nCoreOptions;       // Bits fuer die ViewShell
    UINT32          nCore2Options;      // Bits fuer die ViewShell
    UINT32          nUIOptions;         // UI-Bits
    Color           aRetoucheColor;     // DefaultBackground fuer BrowseView
    Color           aShdwCrsrCol;       // Farbe fuer den ShadowCrsr
    Color           aIdxBackgrndCol;    // color of index background
    Size            aSnapSize;          // Beschreibt hori. wie vert. Snap
    short           nDivisionX;         // Rasterunterteilung
    short           nDivisionY;
    BYTE            nPagePrevRow;       // Page Preview Row/Columns
    BYTE            nPagePrevCol;       // Page Preview Row/Columns
    BYTE            nShdwCrsrFillMode;  // FillMode fuer den ShadowCrsr
    BOOL            bReadonly : 1;      // Readonly-Doc
    BOOL            bStarOneSetting : 1;// prevent from UI automatics (no scrollbars in readonly documents)

    // Maszstab
    USHORT          nZoom;              // Angaben in Prozent
    BYTE            eZoom;              // 'enum' fuer Zoom
    BYTE            nTblDest;           // Ziel fuer Tabellenhintergrund

#ifndef PRODUCT
    // korrespondieren zu den Angaben in ui/config/cfgvw.src
    BOOL  bTest1        :1;     // Test-Flag  "Layout not loading"
    BOOL  bTest2        :1;     // Test-Flag  "WYSIWYG++"
    BOOL  bTest3        :1;     // Test-Flag  ""
    BOOL  bTest4        :1;     // Test-Flag  "WYSIWYG debug"
    BOOL  bTest5        :1;     // Test-Flag  "No idle format"
    BOOL  bTest6        :1;     // Test-Flag  "No screen adj"
    BOOL  bTest7        :1;     // Test-Flag  "win format"
    BOOL  bTest8        :1;     // Test-Flag  ""
    static BOOL  bTest9;    // Test-Flag  "DrawingLayerNotLoading"
    BOOL  bTest10       :1;     // Test-Flag  "Format by Input"
#endif

public:
            SwViewOption();                     // CTOR
            SwViewOption(const SwViewOption&);  //
            ~SwViewOption();                    //

    void   Init( Window *pWin );        // Initialisierung der statischen Daten

    USHORT GetPixelTwips() const { return nPixelTwips; }

    inline UINT32   GetCoreOptions() const {return nCoreOptions;}
    inline UINT32   GetUIOptions()   const {return nUIOptions;}
    inline void     SetUIOptions( const SwViewOption& );

/*---------------------------------------------------------------------------
    Optionen aus nCoreOptions
----------------------------------------------------------------------------*/

    inline BOOL IsIdle() const
        { return nCoreOptions & VIEWOPT_1_IDLE ? TRUE : FALSE; }
    inline void SetIdle( BOOL b )
        { (b != 0) ? (nCoreOptions |= VIEWOPT_1_IDLE ) : ( nCoreOptions &= ~VIEWOPT_1_IDLE); }

    inline BOOL IsTab(BOOL bHard = FALSE) const
                    {   return !bReadonly && (nCoreOptions & VIEWOPT_1_TAB) &&
                            ((nCoreOptions & VIEWOPT_1_VIEWMETACHARS)||bHard)
                                    ? TRUE : FALSE; }
    inline void SetTab( BOOL b )        {
        (b != 0) ? (nCoreOptions |= VIEWOPT_1_TAB ) : ( nCoreOptions &= ~VIEWOPT_1_TAB); }
           void PaintTab( OutputDevice *pOut, const SwRect &rRect ) const;


    inline BOOL IsBlank(BOOL bHard = FALSE) const
                    { return !bReadonly && (nCoreOptions & VIEWOPT_1_BLANK) &&
                            ((nCoreOptions & VIEWOPT_1_VIEWMETACHARS)||bHard)
                                    ? TRUE : FALSE; }
    inline void SetBlank( BOOL b )
        { (b != 0) ? (nCoreOptions |= VIEWOPT_1_BLANK ) : ( nCoreOptions &= ~VIEWOPT_1_BLANK); }

    inline BOOL IsHardBlank() const
                    { return !bReadonly && nCoreOptions & VIEWOPT_1_HARDBLANK ? TRUE : FALSE; }
    inline void SetHardBlank( BOOL b )
        { (b != 0) ? (nCoreOptions |= VIEWOPT_1_HARDBLANK ) : ( nCoreOptions &= ~VIEWOPT_1_HARDBLANK); }

    inline BOOL IsParagraph(BOOL bHard = FALSE) const
                    {   return !bReadonly && (nCoreOptions & VIEWOPT_1_PARAGRAPH) &&
                            ((nCoreOptions & VIEWOPT_1_VIEWMETACHARS)||bHard)
                                    ? TRUE : FALSE; }
    inline void SetParagraph( BOOL b )
        { (b != 0) ? (nCoreOptions |= VIEWOPT_1_PARAGRAPH ) : ( nCoreOptions &= ~VIEWOPT_1_PARAGRAPH); }

    inline BOOL IsLineBreak(BOOL bHard = FALSE) const
                    {   return !bReadonly && (nCoreOptions & VIEWOPT_1_LINEBREAK) &&
                            ((nCoreOptions & VIEWOPT_1_VIEWMETACHARS)||bHard)
                                    ? TRUE : FALSE; }
    inline void SetLineBreak( BOOL b )
        { (b != 0) ? (nCoreOptions |= VIEWOPT_1_LINEBREAK ) : ( nCoreOptions &= ~VIEWOPT_1_LINEBREAK); }
        void PaintLineBreak( OutputDevice *pOut, const SwRect &rRect ) const;
    USHORT GetLineBreakWidth( const OutputDevice *pOut = 0 ) const;

    inline BOOL IsPageBreak() const     { return !bReadonly && (nCoreOptions & VIEWOPT_1_PAGEBREAK) ? TRUE : FALSE; }
    inline void SetPageBreak( BOOL b )
        { (b != 0) ? (nCoreOptions |= VIEWOPT_1_PAGEBREAK ) : ( nCoreOptions &= ~VIEWOPT_1_PAGEBREAK); }

    inline BOOL IsColumnBreak() const   { return !bReadonly && (nCoreOptions & VIEWOPT_1_COLUMNBREAK) ? TRUE : FALSE; }
    inline void SetColumnBreak( BOOL b)
        { (b != 0) ? (nCoreOptions |= VIEWOPT_1_COLUMNBREAK ) : ( nCoreOptions &= ~VIEWOPT_1_COLUMNBREAK); }

    inline BOOL IsSoftHyph() const
                    { return !bReadonly && (nCoreOptions & VIEWOPT_1_SOFTHYPH) ? TRUE : FALSE; }
    inline void SetSoftHyph( BOOL b )
        { (b != 0) ? (nCoreOptions |= VIEWOPT_1_SOFTHYPH ) : ( nCoreOptions &= ~VIEWOPT_1_SOFTHYPH); }

    inline BOOL IsTox() const
                        { return !bReadonly && (nCoreOptions & VIEWOPT_1_TOX) ? TRUE : FALSE; }
    inline void SetTox( BOOL b )
        { (b != 0) ? (nCoreOptions |= VIEWOPT_1_TOX ) : ( nCoreOptions &= ~VIEWOPT_1_TOX); }

    inline BOOL IsRef() const           { return !bReadonly && (nCoreOptions & VIEWOPT_1_REF) ? TRUE : FALSE; }
    inline void SetRef( BOOL b )
        { (b != 0) ? (nCoreOptions |= VIEWOPT_1_REF ) : ( nCoreOptions &= ~VIEWOPT_1_REF); }

    inline BOOL IsFldName() const       { return !bReadonly && (nCoreOptions & VIEWOPT_1_FLDNAME) ? TRUE : FALSE; }
    inline void SetFldName( BOOL b )
        { (b != 0) ? (nCoreOptions |= VIEWOPT_1_FLDNAME ) : ( nCoreOptions &= ~VIEWOPT_1_FLDNAME); }

    inline BOOL IsField() const
                    { return !bReadonly && (nCoreOptions & VIEWOPT_1_FIELD) ? TRUE : FALSE; }
    inline void SetField( BOOL b )
        { (b != 0) ? (nCoreOptions |= VIEWOPT_1_FIELD ) : ( nCoreOptions &= ~VIEWOPT_1_FIELD); }

    inline BOOL IsFootNote() const
                    { return !bReadonly && (nCoreOptions & VIEWOPT_1_FOOTNOTE) ? TRUE : FALSE; }
    inline void SetFootNote( BOOL b )
        { (b != 0) ? (nCoreOptions |= VIEWOPT_1_FOOTNOTE) : ( nCoreOptions &= ~VIEWOPT_1_FOOTNOTE); }

    inline BOOL IsPostIts() const
        { return !bReadonly && (nCoreOptions & VIEWOPT_1_POSTITS) ? TRUE : FALSE; }
    inline void SetPostIts( BOOL b )
        { (b != 0) ? (nCoreOptions |= VIEWOPT_1_POSTITS ) : ( nCoreOptions &= ~VIEWOPT_1_POSTITS); }
           void PaintPostIts( OutputDevice *pOut, const SwRect &rRect,
                              long nCol ) const;
           USHORT GetPostItsWidth( const OutputDevice *pOut = 0 ) const;

    inline BOOL IsHidden() const
        { return !bReadonly && (nCoreOptions & VIEWOPT_1_HIDDEN) ? TRUE : FALSE; }
    inline void SetHidden( BOOL b )
        { (b != 0) ? (nCoreOptions |= VIEWOPT_1_HIDDEN ) : ( nCoreOptions &= ~VIEWOPT_1_HIDDEN); }

    inline BOOL IsSubsLines() const
        { return !bReadonly && (nCoreOptions & VIEWOPT_1_SUBSLINES) ? TRUE : FALSE; }
    inline void SetSubsLines( BOOL b )
        { (b != 0) ? (nCoreOptions |= VIEWOPT_1_SUBSLINES ) : ( nCoreOptions &= ~VIEWOPT_1_SUBSLINES); }

    inline BOOL IsGraphic() const
        { return nCoreOptions & VIEWOPT_1_GRAPHIC ? TRUE : FALSE; }
    inline void SetGraphic( BOOL b )
        { (b != 0) ? (nCoreOptions |= VIEWOPT_1_GRAPHIC ) : ( nCoreOptions &= ~VIEWOPT_1_GRAPHIC); }

    inline BOOL IsPageBack() const
        { return nCoreOptions & VIEWOPT_1_PAGEBACK ? TRUE : FALSE; }
    inline void SetPageBack( BOOL b )
        { (b != 0) ? (nCoreOptions |= VIEWOPT_1_PAGEBACK) : ( nCoreOptions &= ~VIEWOPT_1_PAGEBACK); }

    inline BOOL IsSolidMarkHdl() const
        { return nCoreOptions & VIEWOPT_1_SOLIDMARKHDL ? TRUE : FALSE; }
    inline void SetSolidMarkHdl( BOOL b )
        { (b != 0) ? (nCoreOptions |= VIEWOPT_1_SOLIDMARKHDL) : ( nCoreOptions &= ~VIEWOPT_1_SOLIDMARKHDL); }

    inline BOOL IsBigMarkHdl() const
        { return nCore2Options & VIEWOPT_CORE2_BIGMARKHDL ? TRUE : FALSE;}
    inline void SetBigMarkHdl(BOOL b)
        { (b != 0) ? (nCore2Options |=  VIEWOPT_CORE2_BIGMARKHDL ) : (nCore2Options &=  ~VIEWOPT_CORE2_BIGMARKHDL);}

    inline BOOL IsTable() const
        { return nCoreOptions & VIEWOPT_1_TABLE ? TRUE : FALSE; }
    inline void SetTable( BOOL b )
        { (b != 0) ? (nCoreOptions |= VIEWOPT_1_TABLE ) : ( nCoreOptions &= ~VIEWOPT_1_TABLE); }

    inline BOOL IsDraw() const
        { return nCoreOptions & VIEWOPT_1_DRAW ? TRUE : FALSE; }
    inline void SetDraw( BOOL b )
        { (b != 0) ? (nCoreOptions |= VIEWOPT_1_DRAW ) : ( nCoreOptions &= ~VIEWOPT_1_DRAW); }

    inline BOOL IsControl() const
        { return nCoreOptions & VIEWOPT_1_CONTROL ? TRUE : FALSE; }
    inline void SetControl( BOOL b )
        { (b != 0) ? (nCoreOptions |= VIEWOPT_1_CONTROL ) : ( nCoreOptions &= ~VIEWOPT_1_CONTROL); }

    inline BOOL IsSubsTable() const
        { return !bReadonly && (nCoreOptions & VIEWOPT_1_SUBSTABLE) ? TRUE : FALSE; }
    inline void SetSubsTable( BOOL b )
        { (b != 0) ? (nCoreOptions |= VIEWOPT_1_SUBSTABLE ) : ( nCoreOptions &= ~VIEWOPT_1_SUBSTABLE); }

    inline BOOL IsSnap() const
        { return nCoreOptions & VIEWOPT_1_SNAP ? TRUE : FALSE; }
    inline void SetSnap( BOOL b )
        { (b != 0) ? (nCoreOptions |= VIEWOPT_1_SNAP ) : ( nCoreOptions &= ~VIEWOPT_1_SNAP); }

    inline void SetSnapSize( Size &rSz ){ aSnapSize = rSz; }
    inline const Size &GetSnapSize() const { return aSnapSize; }

    inline BOOL IsGridVisible() const
        { return !bReadonly && (nCoreOptions & VIEWOPT_1_GRIDVISIBLE) ? TRUE : FALSE; }
    inline void SetGridVisible( BOOL b )
        { (b != 0) ? (nCoreOptions |= VIEWOPT_1_GRIDVISIBLE ) : ( nCoreOptions &= ~VIEWOPT_1_GRIDVISIBLE); }

    inline BOOL IsOnlineSpell() const
        { return !bReadonly && (nCoreOptions & VIEWOPT_1_ONLINESPELL) ? TRUE : FALSE; }
    inline void SetOnlineSpell( BOOL b )
        { (b != 0) ? (nCoreOptions |= VIEWOPT_1_ONLINESPELL ) : ( nCoreOptions &= ~VIEWOPT_1_ONLINESPELL); }

    inline BOOL IsHideSpell() const
        { return nCoreOptions & VIEWOPT_1_HIDESPELL ? TRUE : FALSE; }
    inline void SetHideSpell( BOOL b )
        { (b != 0) ? (nCoreOptions |= VIEWOPT_1_HIDESPELL ) : ( nCoreOptions &= ~VIEWOPT_1_HIDESPELL); }

    inline BOOL IsViewMetaChars() const
        { return !bReadonly && (nCoreOptions & VIEWOPT_1_VIEWMETACHARS) ? TRUE : FALSE; }
    inline void SetViewMetaChars( BOOL b)
        { (b != 0) ? (nCoreOptions |= VIEWOPT_1_VIEWMETACHARS ) : ( nCoreOptions &= ~VIEWOPT_1_VIEWMETACHARS); }

    inline BOOL IsSynchronize() const
        {  return nCoreOptions & VIEWOPT_1_SYNCHRONIZE ? TRUE : FALSE;}
    inline void SetSynchronize( BOOL b )
        { (b != 0) ? (nCoreOptions |= VIEWOPT_1_SYNCHRONIZE ) : ( nCoreOptions &= ~VIEWOPT_1_SYNCHRONIZE); }

    inline BOOL IsCrossHair() const
        { return nCoreOptions & VIEWOPT_1_CROSSHAIR ? TRUE : FALSE; }
    inline void SetCrossHair( BOOL b )
        { (b != 0) ? (nCoreOptions |= VIEWOPT_1_CROSSHAIR ) : ( nCoreOptions &= ~VIEWOPT_1_CROSSHAIR); }

/*---------------------------------------------------------------------------
    Optionen aus nCore2Options
----------------------------------------------------------------------------*/
    inline BOOL IsBlackFont() const
        {return nCore2Options & VIEWOPT_CORE2_BLACKFONT ? TRUE : FALSE;}

    inline void SetBlackFont(BOOL b)
        { (b != 0) ? (nCore2Options |= VIEWOPT_CORE2_BLACKFONT) : (nCore2Options &= ~VIEWOPT_CORE2_BLACKFONT);}

    inline BOOL IsShowHiddenPara() const
        {return nCore2Options & VIEWOPT_CORE2_HIDDENPARA ? TRUE : FALSE;}

    inline void SetShowHiddenPara(BOOL b)
        { (b != 0) ? (nCore2Options |= VIEWOPT_CORE2_HIDDENPARA) : (nCore2Options &= ~VIEWOPT_CORE2_HIDDENPARA);}

    inline BOOL IsSmoothScroll() const
        {return nCore2Options & VIEWOPT_CORE2_SMOOTHSCROLL ? TRUE : FALSE;}

    inline void SetSmoothScroll(BOOL b)
        { (b != 0) ? (nCore2Options |= VIEWOPT_CORE2_SMOOTHSCROLL) : (nCore2Options &= ~VIEWOPT_CORE2_SMOOTHSCROLL);}

    inline BOOL IsCursorInProtectedArea() const
        {return nCore2Options & VIEWOPT_CORE2_CRSR_IN_PROT ? TRUE : FALSE;}

    inline void SetCursorInProtectedArea(BOOL b)
        { (b != 0) ? (nCore2Options |= VIEWOPT_CORE2_CRSR_IN_PROT) : (nCore2Options &= ~VIEWOPT_CORE2_CRSR_IN_PROT);}

    inline BOOL IsSectionBounds() const
        {return !bReadonly && (nCore2Options & VIEWOPT_CORE2_SECTION_BOUNDS) ? TRUE : FALSE;}

    inline void SetSectionBounds(BOOL b)
        { (b != 0) ? (nCore2Options |= VIEWOPT_CORE2_SECTION_BOUNDS) : (nCore2Options &= ~VIEWOPT_CORE2_SECTION_BOUNDS);}

    inline BOOL IsIndexBackground() const
        {return nCore2Options & VIEWOPT_CORE2_INDEX_BACKGROUND ? TRUE : FALSE;}

    inline void SetIndexBackground(BOOL b)
        { (b != 0) ? (nCore2Options |= VIEWOPT_CORE2_INDEX_BACKGROUND) : (nCore2Options &= ~VIEWOPT_CORE2_INDEX_BACKGROUND);}



/*---------------------------------------------------------------------------

----------------------------------------------------------------------------*/


    inline short GetDivisionX() const   { return nDivisionX; }
    inline void  SetDivisionX( short n ){ nDivisionX = n; }
    inline short GetDivisionY() const   { return nDivisionY; }
    inline void  SetDivisionY( short n ){ nDivisionY = n; }

    inline BYTE  GetPagePrevRow() const   { return nPagePrevRow; }
    inline void  SetPagePrevRow( BYTE n ) { nPagePrevRow = n; }
    inline BYTE  GetPagePrevCol() const   { return nPagePrevCol; }
    inline void  SetPagePrevCol( BYTE n ) { nPagePrevCol = n; }
    BOOL         IsReadonly() const { return bReadonly; }
    void         SetReadonly(BOOL bSet) { bReadonly = bSet; }

    BOOL IsAutoCompleteWords() const;


#ifndef PRODUCT
    // korrespondieren zu den Angaben in ui/config/cfgvw.src
    inline BOOL IsTest1() const     { return bTest1; }
    inline void SetTest1( BOOL b )  { bTest1 = b; }
    inline BOOL IsTest2() const     { return bTest2; }
    inline void SetTest2( BOOL b )  { bTest2 = b; }
    inline BOOL IsTest3() const     { return bTest3; }
    inline void SetTest3( BOOL b )  { bTest3 = b; }
    inline BOOL IsTest4() const     { return bTest4; }
    inline void SetTest4( BOOL b )  { bTest4 = b; }
    inline BOOL IsTest5() const     { return bTest5; }
    inline void SetTest5( BOOL b )  { bTest5 = b; }
    inline BOOL IsTest6() const     { return bTest6; }
    inline void SetTest6( BOOL b )  { bTest6 = b; }
    inline BOOL IsTest7() const     { return bTest7; }
    inline void SetTest7( BOOL b )  { bTest7 = b; }
    inline BOOL IsTest8() const     { return bTest8; }
    inline void SetTest8( BOOL b )  { bTest8 = b; }
    static inline BOOL IsTest9()            { return bTest9; }
    static inline void SetTest9( BOOL b )   { bTest9 = b; }
    inline BOOL IsTest10() const    { return bTest10; }
    inline void SetTest10( BOOL b ) { bTest10 = b; }
#endif

    inline USHORT GetZoom() const    { return nZoom; }
    inline void   SetZoom( USHORT n ){ nZoom = n; }

    void DrawRect( OutputDevice* pOut, const SwRect &rRect, long nCol ) const;
    void DrawRectPrinter( OutputDevice* pOut, const SwRect& rRect ) const;

    SwViewOption& operator=( const SwViewOption &rOpt );
    // Vergleichsmethoden
    BOOL IsEqualFlags ( const SwViewOption &rOpt ) const;
    inline BOOL operator==( const SwViewOption &rOpt ) const;


/*---------------------------------------------------------------------------
    Optionen aus nUIOptions
----------------------------------------------------------------------------*/

    BOOL    IsViewToolbox()    const
        { return nUIOptions & VIEWOPT_2_TOOLBOX ? TRUE : FALSE;   }
    BOOL    IsViewRibbonBar()  const
        { return nUIOptions & VIEWOPT_2_RIBBONBAR ? TRUE : FALSE; }
    BOOL    IsViewVScrollBar() const
        { return nUIOptions & VIEWOPT_2_VSCROLLBAR ? TRUE : FALSE;    }
    BOOL    IsViewHScrollBar() const
        { return nUIOptions & VIEWOPT_2_HSCROLLBAR ? TRUE : FALSE;    }
    BOOL    IsViewSVLook()     const
        { return nUIOptions & VIEWOPT_2_SVLOOK ? TRUE : FALSE;    }
    BOOL    IsKeepRatio()      const
        { return nUIOptions & VIEWOPT_2_KEEPASPECTRATIO ? TRUE : FALSE;   }
    BOOL    IsGrfKeepZoom()    const
        { return nUIOptions & VIEWOPT_2_GRFKEEPZOOM ? TRUE : FALSE;   }
    BOOL    IsExecHyperlinks() const
        { return nUIOptions & VIEWOPT_2_EXECHYPERLINKS ? TRUE : FALSE; }
    BOOL    IsPrtFormat() const
        { return nUIOptions & VIEWOPT_2_PRTFORMAT ? TRUE : FALSE; }

    BYTE    GetZoomType()      const { return eZoom;              }

    BYTE    GetTblDest() const    { return nTblDest; }

    void   SetViewToolbox   (BOOL b)
        { b ? (nUIOptions |= VIEWOPT_2_TOOLBOX ) : ( nUIOptions &= ~VIEWOPT_2_TOOLBOX); }
    void   SetViewRibbonBar (BOOL b)
        { b ? (nUIOptions |= VIEWOPT_2_RIBBONBAR ) : ( nUIOptions &= ~VIEWOPT_2_RIBBONBAR); }
    void   SetViewVScrollBar(BOOL b)
        { b ? (nUIOptions |= VIEWOPT_2_VSCROLLBAR ) : ( nUIOptions &= ~VIEWOPT_2_VSCROLLBAR); }
    void   SetViewHScrollBar(BOOL b)
        { b ? (nUIOptions |= VIEWOPT_2_HSCROLLBAR ) : ( nUIOptions &= ~VIEWOPT_2_HSCROLLBAR); }
    void   SetViewSVLook    (BOOL b)
        { b ? (nUIOptions |= VIEWOPT_2_SVLOOK ) : ( nUIOptions &= ~VIEWOPT_2_SVLOOK); }
    void   SetKeepRatio     (BOOL b)
        { b ? (nUIOptions |= VIEWOPT_2_KEEPASPECTRATIO ) : ( nUIOptions &= ~VIEWOPT_2_KEEPASPECTRATIO); }
    void   SetGrfKeepZoom   (BOOL b)
        { b ? (nUIOptions |= VIEWOPT_2_GRFKEEPZOOM ) : ( nUIOptions &= ~VIEWOPT_2_GRFKEEPZOOM); }
    void SetExecHyperlinks( BOOL b)
        { b ? (nUIOptions |= VIEWOPT_2_EXECHYPERLINKS) : (nUIOptions &= ~VIEWOPT_2_EXECHYPERLINKS); }
    void SetPrtFormat( BOOL b)
        { b ? (nUIOptions |= VIEWOPT_2_PRTFORMAT) : (nUIOptions &= ~VIEWOPT_2_PRTFORMAT); }

    void            SetZoomType     (BYTE nZoom){ eZoom = nZoom;    }
    void            SetTblDest( BYTE nNew )     { nTblDest = nNew;  }

    const String&   GetSymbolFont() const {return sSymbolFont;}
    void            SetSymbolFont(const String& sSet) {sSymbolFont = sSet;}

    const Color&    GetRetoucheColor() const        { return aRetoucheColor;}
    void            SetRetoucheColor(const Color&r) { aRetoucheColor = r;   }

    inline BOOL     IsViewTabwin()     const;
    inline BOOL     IsViewVLin()       const;
    inline void     SetViewTabwin   (BOOL b);
    inline void     SetViewVLin     (BOOL b);

    // ShadowCursor ein schalten/abfragen/Farbe setzen/Modus setzen
    BOOL    IsShadowCursor()    const
        { return nUIOptions & VIEWOPT_2_SHADOWCRSR ? TRUE : FALSE;   }
    void   SetShadowCursor(BOOL b)
        { b ? (nUIOptions |= VIEWOPT_2_SHADOWCRSR ) : ( nUIOptions &= ~VIEWOPT_2_SHADOWCRSR); }

    BOOL            IsStarOneSetting() const {return bStarOneSetting; }
    void            SetStarOneSetting(BOOL bSet) {bStarOneSetting = bSet; }

    const Color&    GetShdwCrsrColor() const { return aShdwCrsrCol; }
    void            SetShdwCrsrColor( const Color& rCol ) { aShdwCrsrCol = rCol; };

    BYTE            GetShdwCrsrFillMode() const { return nShdwCrsrFillMode; }
    void            SetShdwCrsrFillMode( BYTE nMode ) { nShdwCrsrFillMode = nMode; };

    const Color&    GetIndexBackgrndColor() const { return aIdxBackgrndCol;}
    void            SetIndexBackgrndColor(const Color& rCol) {aIdxBackgrndCol = rCol;}
};


inline BOOL SwViewOption::operator==( const SwViewOption &rOpt ) const
{
    return IsEqualFlags( rOpt ) && nZoom == rOpt.GetZoom();
}

inline void SwViewOption::SetUIOptions( const SwViewOption& rVOpt )
{
    nUIOptions = rVOpt.nUIOptions;
    nTblDest = rVOpt.nTblDest;
    nShdwCrsrFillMode = rVOpt.nShdwCrsrFillMode;
    aShdwCrsrCol = rVOpt.aShdwCrsrCol;
}

inline BOOL SwViewOption::IsViewTabwin() const
{
    return !bReadonly && (nUIOptions & VIEWOPT_2_TABWIN) ? TRUE : FALSE;
}

inline BOOL SwViewOption::IsViewVLin() const
{
    return !bReadonly && (nUIOptions & VIEWOPT_2_VLIN) ? TRUE : FALSE;
}

inline void SwViewOption::SetViewTabwin(BOOL b)
{
    b ? (nUIOptions |= VIEWOPT_2_TABWIN ) : ( nUIOptions &= ~VIEWOPT_2_TABWIN);
}

inline void SwViewOption::SetViewVLin(BOOL b)
{
    b ? (nUIOptions |= VIEWOPT_2_VLIN ) : ( nUIOptions &= ~VIEWOPT_2_VLIN);
}


// Hilfsfunktion zur Ermittlung der HTML-Faehigkeiten
USHORT      GetHtmlMode(const SwDocShell*);


#endif
diff --git a/sw/inc/viewsh.hxx b/sw/inc/viewsh.hxx
new file mode 100644
index 0000000..afca768
--- /dev/null
+++ b/sw/inc/viewsh.hxx
@@ -0,0 +1,490 @@
/*************************************************************************
 *
 *  $RCSfile: viewsh.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:29 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _VIEWSH_HXX
#define _VIEWSH_HXX

#ifndef _RTTI_HXX //autogen
#include <tools/rtti.hxx>
#endif
#ifndef _SVARRAY_HXX //autogen
#include <svtools/svarray.hxx>
#endif


#include "swtypes.hxx"
#include "ring.hxx"
#include "swrect.hxx"
#include "errhdl.hxx"

class SwDoc;
class SfxPrinter;
class SfxProgress;
class SwRootFrm;
class SwNodes;
class SdrView;
class SfxItemPool;
class SfxViewShell;

#ifndef _COM_SUN_STAR_LINGUISTIC_XSPELLALTERNATIVES_HPP_
#include <com/sun/star/linguistic/XSpellAlternatives.hpp>
#endif
#ifndef _COM_SUN_STAR_LINGUISTIC_SPELLFAILURE_HPP_
#include <com/sun/star/linguistic/SpellFailure.hpp>
#endif
#ifndef _COM_SUN_STAR_LINGUISTIC_XSPELLCHECKER1_HPP_
#include <com/sun/star/linguistic/XSpellChecker1.hpp>
#endif
#ifndef _COM_SUN_STAR_LINGUISTIC_XALTERNATIVESPELLING_HPP_
#include <com/sun/star/linguistic/XAlternativeSpelling.hpp>
#endif
#ifndef _COM_SUN_STAR_LINGUISTIC_XPOSSIBLEHYPHENSSUPPLIER_HPP_
#include <com/sun/star/linguistic/XPossibleHyphensSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_LINGUISTIC_XHYPHENATOR_HPP_
#include <com/sun/star/linguistic/XHyphenator.hpp>
#endif
#ifndef _COM_SUN_STAR_LINGUISTIC_XPOSSIBLEHYPHENS_HPP_
#include <com/sun/star/linguistic/XPossibleHyphens.hpp>
#endif
#ifndef _COM_SUN_STAR_LINGUISTIC_XHYPHENATEDWORD_HPP_
#include <com/sun/star/linguistic/XHyphenatedWord.hpp>
#endif


class SwViewOption;
class SwViewImp;
class SwPrtOptions;
class SwPagePreViewPrtData;
class Window;
class OutputDevice;
class SwLayIdle;
struct ShellResource;
class SwRegionRects;
class SwFrm;

//JP 19.07.98: - Bug 52312
// define fuer Flags, die im CTOR oder den darunter liegenden Schichten
// benoetigt werden.
// Zur Zeit wird fuer die DrawPage das PreView Flag benoetigt
#define VSHELLFLAG_ISPREVIEW            ((long)0x1)

class ViewShell: public Ring
{
    friend void SetOutDev( ViewShell *pSh, OutputDevice *pOut );
    friend void SetOutDevAndWin( ViewShell *pSh, OutputDevice *pOut,
                                 Window *pWin, sal_uInt16 nZoom );

    friend class SwViewImp;
    friend class SwLayIdle;

    //Umsetzen der SwVisArea, damit vor dem Drucken sauber formatiert
    //werden kann.
    friend void SetSwVisArea( ViewShell *pSh, const SwRect & );

    static sal_Bool bLstAct;            // sal_True wenn Das EndAction der letzten Shell
                                    // laeuft; also die EndActions der
                                    // anderen Shells auf das Dokument
                                    // abgearbeitet sind.

    SfxViewShell *pSfxViewShell;
    SwViewImp    *pImp;             //Core-Interna der ViewShell.
                                    //Der Pointer ist niemals 0.

    Window       *pWin;              //Ist 0, wenn gedruckt wird.
    OutputDevice *pOut;              //Fuer alle Ausgaben. Kann sein:
                                     //Window, Printer, VirtDev, ...
    OutputDevice *pRef;              //Formatierreferenzdevice, soll zum
    // Formatieren benutzt werden, wenn gesetzt (Prospekt+Seitenvorschaudruck)
    ::com::sun::star::uno::Reference<
        ::com::sun::star::linguistic::XSpellChecker1 >  xSpell;
    ::com::sun::star::uno::Reference<
        ::com::sun::star::linguistic::XHyphenator > xHyph;
    SwViewOption *pOpt;

    Point         aPrtOffst;         //Ofst fuer den Printer,
                                     //nicht bedruckbarer Rand.

     Size         aBrowseBorder;    //Rand fuer Framedokumente
    SwRect        aInvalidRect;

    sal_Bool  bDocSizeChgd     :1;  //Fuer DocChgNotify(): Neue DocGroesse bei
                                //EndAction an das DocMDI melden.
    sal_Bool  bPaintWorks      :1;  //Normal Painten wenn sal_True,
                                //Paint merken wenn sal_False
    sal_Bool  bPaintInProgress :1;  //Kein zweifaches Paint durchlassen.
    sal_Bool  bViewLocked      :1;  //Lockt den sichtbaren Bereich,
                                //MakeVisible laeuft dann in's leere.
    sal_Bool  bInEndAction     :1;  //Fiese unstaende vermeiden, siehe viewsh.cxx
    sal_Bool  bPreView         :1;  //Ist sal_True wenns eine PreView-ViewShell ist.
    sal_Bool  bFrameView       :1;  //sal_True wenn es ein (HTML-)Frame ist.
    sal_Bool  bEnableSmooth    :1;  //Disable des SmoothScroll z.B. fuer
                                //Drag der Scrollbars.
    sal_Bool  bEndActionByVirDev:1; //Paints aus der EndAction immer ueber virtuelles
                                //Device (etwa beim Browsen)

    //Initialisierung, wird von den verschiedenen Konstruktoren gerufen.
    void Init( const SwViewOption *pNewOpt );

    inline void ResetInvalidRect();

    void SetSubsLines();

    void Reformat();            //Invalidert das ges. Layout (ApplyViewOption)

    void PaintDesktop( const SwRect & );        // sammeln der Werte fuers
                                                // Malen der Wiese und rufen
    // PaintDesktop gesplittet, dieser Teil wird auch von PreViewPage benutzt
    void _PaintDesktop( const SwRegionRects &rRegion );

    sal_Bool CheckInvalidForPaint( const SwRect & );//Direkt Paint oder lieber
                                                //eine Aktion ausloesen.

    void Scroll();  //Scrollen wenn sich aus der LayAction Scrollmoeglichkeiten
                    //ergaben.

    void PrepareForPrint( const SwPrtOptions &rOptions );

    void ImplApplyViewOptions( const SwViewOption &rOpt );

protected:
    SwDoc                   *pDoc;          //Das Dokument, niemals 0
    SwRect                  aVisArea;       //Die moderne Ausfuerung der VisArea
    static ShellResource*   pShellRes;      // Resourcen fuer die Shell
    static Window*          pCareWindow;    // diesem Fenster ausweichen

    sal_uInt16 nStartAction; //ist != 0 wenn mindestens eine ::com::sun::star::chaos::Action laeuft
    sal_uInt16 nLockPaint;   //ist != 0 wenn das Paint gelocked ist.

public:
    TYPEINFO();

          SwViewImp *Imp() { return pImp; }
    const SwViewImp *Imp() const { return pImp; }

    const SwNodes& GetNodes() const;

    SfxPrinter*     GetPrt( sal_Bool bCreate = sal_False ) const;
    void            InitPrt( SfxPrinter * );    //Nach Druckerwechsel, vom Doc

    //Klammerung von zusammengehoerenden Aktionen.
    inline void StartAction();
           void ImplStartAction();
    inline void EndAction( const sal_Bool bIdleEnd = sal_False );
           void ImplEndAction( const sal_Bool bIdleEnd = sal_False );
    sal_uInt16 ActionCount() const { return nStartAction; }
    sal_Bool ActionPend() const { return nStartAction != 0; }
    sal_Bool IsInEndAction() const { return bInEndAction; }

    void SetEndActionByVirDev( sal_Bool b ) { bEndActionByVirDev = b; }
    sal_Bool IsEndActionByVirDev()          { return bEndActionByVirDev; }

    //  Per UNO wird am RootFrame fuer alle shells der ActionCount kurzfristig
    //  auf Null gesetzt und wieder restauriert
    void    SetRestoreActions(sal_uInt16 nSet);
    sal_uInt16  GetRestoreActions() const;

    inline sal_Bool HasInvalidRect() const { return aInvalidRect.HasArea(); }
    void ChgHyphenation() { Reformat(); }

    //Methoden fuer Paint- und Scrollrects, die auf allen Shells im
    //Ring arbeiten.
    sal_Bool AddPaintRect( const SwRect &rRect );
    void AddScrollRect( const SwFrm *pFrm, const SwRect &rRect, long nOffs );
    void SetNoNextScroll();

    void InvalidateWindows( const SwRect &rRect );
    virtual void Paint(const Rectangle &rRect);
    sal_Bool IsPaintInProgress() const { return bPaintInProgress; }

    //Benachrichtung, dass sich der sichtbare Bereich geaendert hat.
    //VisArea wird neu gesetzt, anschliessend wird gescrollt.
    //Das uebergebene Rect liegt auf Pixelgrenzen,
    //um Pixelfehler beim Scrollen zu vermeiden.
    virtual void VisPortChgd( const SwRect & );
    sal_Bool SmoothScroll( long lXDiff, long lYDiff, const Rectangle* );//Browser
    void EnableSmooth( sal_Bool b ) { bEnableSmooth = b; }

    const SwRect &VisArea() const { return aVisArea; }
        //Es wird, wenn notwendig, soweit gescrollt, dass das
        //uebergebene Rect im sichtbaren Ausschnitt liegt.
    void MakeVisible( const SwRect & );

    //Bei naechster Gelegenheit die neue Dokuemntgroesse an das UI weiterreichen.
    void SizeChgNotify(const Size &);
    void UISizeNotify();            //Das weiterreichen der aktuellen groesse.

    Point GetPagePos( sal_uInt16 nPageNum ) const;

    sal_uInt16 GetNumPages();   //Anzahl der aktuellen Seiten Layout erfragen.

    //Invalidierung der ersten Sichtbaren Seite fuer alle Shells im Ring.
    void SetFirstVisPageInvalid();

    SwRootFrm   *GetLayout() const;
    sal_Bool         IsNewLayout() const; //Wurde das Layout geladen oder neu
                                      //erzeugt?

 Size GetDocSize() const;// erfrage die Groesse des Dokuments

    void CalcLayout();  //Durchformatierung des Layouts erzwingen.

    SwDoc *GetDoc() const { return pDoc; }  //niemals 0.

    //'Drei' OutputDevices sind relevant:
    //Der Drucker (am Dokument). Er bestimmt immer die FontMetriken.
    //Das Window, gibt es nur wenn nicht gerade gedruckt wird.
    //Das OutputDevice. Auf diesem Device finden grunds„tzlich alle
    //Ausgaben statt. Der Pointer zeigt auf das Window, den Drucker oder
    //auch mal ein VirtualDevice (z.B. Refresh der Scrollrects).
    inline OutputDevice *GetOut()    const { return pOut; }
    inline Window       *GetWin()    const { return pWin; }

    inline OutputDevice *GetReferenzDevice() const { return pRef; }
    inline void SetReferenzDevice( OutputDevice* pNew ) { pRef = pNew; }
    static inline sal_Bool IsLstEndAction() { return ViewShell::bLstAct; }

    // Setzt Drucker fuer ALLE Sichten im Ring; einschl. Invalidierungen
    void SetPrt(SfxPrinter *);

    //Andern alle PageDescriptoren
    void   ChgAllPageOrientation( sal_uInt16 eOri );
    void   ChgAllPageSize( Size &rSz );

    //Druckauftrag abwickeln.
    sal_Bool Prt( SwPrtOptions& rOptions, SfxProgress& rProgress );
    //"Drucken" fuer OLE 2.0
    static void PrtOle2( SwDoc *pDoc, const SwViewOption *pOpt,
                         OutputDevice* pOleOut, const Rectangle& rRect );

    //Wird intern fuer die Shell gerufen die Druckt. Formatiert die Seiten.
    void CalcPagesForPrint( sal_uInt16 nMax, SfxProgress* pProgress = 0,
        const String* pStr = NULL, sal_uInt32 nMergeAct = 0, sal_uInt32 nMergeCnt = 0 );

    //All about fields.
    void UpdateFlds(sal_Bool bCloseDB = sal_False);
    sal_Bool IsAnyFieldInDoc() const;
    // update all charts, for that exists any table
    void UpdateAllCharts();
    sal_Bool HasCharts() const;

    // Sollen Absatzabstaende addiert oder maximiert werden?
    sal_Bool IsParaSpaceMax() const;
    sal_Bool IsParaSpaceMaxAtPages() const;
    void SetParaSpaceMax( sal_Bool bNew, sal_Bool bAtPages );

    //Ruft den Idle-Formatierer des Layouts
    void LayoutIdle();

    // Linguistik
    inline ::com::sun::star::uno::Reference<
        ::com::sun::star::linguistic::XSpellChecker1 >
            GetSpellChecker() const { return xSpell; }
    inline ::com::sun::star::uno::Reference<
        ::com::sun::star::linguistic::XHyphenator >
            GetHyphenator() const { return xHyph; }

    inline const SwViewOption *GetViewOptions() const { return pOpt; }
           void  ApplyViewOptions( const SwViewOption &rOpt );
           void  SetUIOptions( const SwViewOption &rOpt );
           void  SetReadonlyOption(sal_Bool bSet);   // Readonly-Bit d. ViewOptions setzen
           void  SetPrtFormatOption(sal_Bool bSet);  // PrtFormat-Bit d. ViewOptions setzen

    static void           SetShellRes( ShellResource* pRes ) { pShellRes = pRes; }
    static ShellResource* GetShellRes() { return pShellRes; }

    static void           SetCareWin( Window* pNew ) { pCareWindow = pNew; }
    static Window*        GetCareWin()
                        { return pCareWindow ? pCareWindow : CareChildWin(); }
    static Window*        CareChildWin();

    inline SfxViewShell   *GetSfxViewShell() { return pSfxViewShell; }
    inline void           SetSfxViewShell(SfxViewShell *pNew) { pSfxViewShell = pNew; }

    // Selektion der Draw ::com::sun::star::script::Engine geaendert
    virtual void DrawSelChanged(SdrView*);

    // SS fuer Seitenvorschau anzeigen
    void PreViewPage( const Rectangle& rRect, sal_uInt16 nRowCol,
                      sal_uInt16 nSttPage, const Size& rPageSize );
    void RepaintCoreRect( const SwRect& rRect, sal_uInt16 nRowCol,
                            sal_uInt16 nSttPage, const Size& rPageSize );
    // und jetzt mal auf den Drucker
    void PrintPreViewPage( SwPrtOptions& rOptions, sal_uInt16 nRowCol,
                           SfxProgress& rProgress,
                           const SwPagePreViewPrtData* = 0 );
     Size GetPagePreViewPrtMaxSize() const;
    //  errechnen & MapMode setzen
    sal_uInt16 CalcPreViewPage( const Size& rWinWidth, sal_uInt16& nRowCol,
                            sal_uInt16 nSttPage, Size& rPageSize,
                            sal_uInt16& rVirtPageNo );
    sal_Bool IsPreViewDocPos( Point& rDocPt, sal_uInt16 nRowCol, sal_uInt16 nSttPage,
                            const Size& rMaxSize );

    // Prospekt-Format drucken
    void PrintProspect( SwPrtOptions&, SfxProgress& );

    sal_Bool IsViewLocked() const { return bViewLocked; }
    void LockView( sal_Bool b )   { bViewLocked = b;    }

    inline void LockPaint();
           void ImplLockPaint();
    inline void UnlockPaint( sal_Bool bVirDev = sal_False );
           void ImplUnlockPaint( sal_Bool bVirDev );
           sal_Bool IsPaintLocked() const { return nLockPaint != 0; }

    // Abfragen/Erzeugen DrawView + PageView
    const sal_Bool HasDrawView() const;
    void MakeDrawView();

    //DrawView darf u.U. am UI benutzt werden.
          SdrView *GetDrawView();
    const SdrView *GetDrawView() const { return ((ViewShell*)this)->GetDrawView(); }

    //sorge dafuer, das auf jedenfall die MarkListe aktuell ist (Bug 57153)
    SdrView *GetDrawViewWithValidMarkList();

    // erfrage den Attribut Pool
    inline const SfxItemPool& GetAttrPool() const;
                 SfxItemPool& GetAttrPool();

    sal_Bool IsPreView() const { return bPreView; }

    sal_Bool IsFrameView()  const { return bFrameView; }
    void SetFrameView( const Size& rBrowseBorder )
        { bFrameView = sal_True; aBrowseBorder = rBrowseBorder; }

    //Nimmt die notwendigen Invalidierungen vor,
    //wenn sich der BrowdseModus aendert, bBrowseChgd == sal_True
    //oder, im BrowseModus, wenn sich die Groessenverhaeltnisse
    //aendern (bBrowseChgd == sal_False)
    void CheckBrowseView( FASTBOOL bBrowseChgd );

    //Damit in der UI nicht ueberall das dochxx includet werden muss
    sal_Bool IsBrowseMode() const;

    sal_Bool IsHeadInBrowse() const;
    void SetHeadInBrowse( sal_Bool bOn = sal_True );
    sal_Bool IsFootInBrowse() const;
    void SetFootInBrowse( sal_Bool bOn = sal_True );

    const Size& GetBrowseBorder() const{ return aBrowseBorder; }
    void SetBrowseBorder( const Size& rNew );

    ViewShell( ViewShell*, Window *pWin = 0, OutputDevice *pOut = 0,
                long nFlags = 0 );
    ViewShell( SwDoc *pDoc,
               ::com::sun::star::uno::Reference<
                       ::com::sun::star::linguistic::XSpellChecker1 >  xSpell,
               ::com::sun::star::uno::Reference<
                       ::com::sun::star::linguistic::XHyphenator >  xHyph,
               Window *pWin,
               const SwViewOption *pOpt = 0, OutputDevice *pOut = 0,
               long nFlags = 0 );
    virtual ~ViewShell();

};

//---- class CurrShell verwaltet den globalen ShellPointer -------------------

class CurrShell
{
public:
    ViewShell *pPrev;
    SwRootFrm *pRoot;

    CurrShell( ViewShell *pNew );
    ~CurrShell();
};

inline void ViewShell::ResetInvalidRect()
{
    aInvalidRect.Clear();
}
inline void ViewShell::StartAction()
{
    if ( !nStartAction++ )
        ImplStartAction();
}
inline void ViewShell::EndAction( const sal_Bool bIdleEnd )
{
    if( 0 == (nStartAction - 1) )
        ImplEndAction( bIdleEnd );
    --nStartAction;
}

inline void ViewShell::LockPaint()
{
    if ( !nLockPaint++ )
        ImplLockPaint();
}
inline void ViewShell::UnlockPaint( sal_Bool bVirDev )
{
    if ( 0 == --nLockPaint )
        ImplUnlockPaint( bVirDev );
}
inline const SfxItemPool& ViewShell::GetAttrPool() const
{
    return ((ViewShell*)this)->GetAttrPool();
}



#endif //_VIEWSH_HXX
diff --git a/sw/inc/viscrs.hxx b/sw/inc/viscrs.hxx
new file mode 100644
index 0000000..688a5ac
--- /dev/null
+++ b/sw/inc/viscrs.hxx
@@ -0,0 +1,249 @@
/*************************************************************************
 *
 *  $RCSfile: viscrs.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:29 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _VISCRS_HXX
#define _VISCRS_HXX

#ifndef _CURSOR_HXX //autogen
#include <vcl/cursor.hxx>
#endif
#include "swcrsr.hxx"
#include "swrect.hxx"
#include "swregion.hxx"

class SwCrsrShell;
class SwShellCrsr;
class Window;


// --------  Ab hier Klassen / Methoden fuer den nicht Text-Cursor ------

class SwVisCrsr
#ifdef SW_CRSR_TIMER
                : private Timer
#endif
{
    friend void _InitCore();
    friend void _FinitCore();

    BOOL bIsVisible : 1;
    BOOL bIsDragCrsr : 1;

#ifdef SW_CRSR_TIMER
    BOOL bTimerOn : 1;
#endif

    Cursor aTxtCrsr;
    const SwCrsrShell* pCrsrShell;

#ifdef SW_CRSR_TIMER
    virtual void Timeout();
#endif
    void _SetPosAndShow();

public:
    SwVisCrsr( const SwCrsrShell * pCShell );
    ~SwVisCrsr();

    void Show();
    void Hide();

    FASTBOOL IsVisible() const { return bIsVisible; }
    FASTBOOL IsDragCrsr() const { return bIsDragCrsr; }
    void SetDragCrsr( BOOL bFlag = TRUE ) { bIsDragCrsr = bFlag; }

#ifdef SW_CRSR_TIMER
    FASTBOOL ChgTimerFlag( BOOL bTimerOn = TRUE );
#endif
};


// ------ Ab hier Klassen / Methoden fuer die Selectionen -------

class SwSelPaintRects : public SwRects
{
    friend void _InitCore();
    friend void _FinitCore();

    static long nPixPtX, nPixPtY;
    static MapMode *pMapMode;

    // die Shell
    const SwCrsrShell* pCShell;

    void Paint( const SwRect& rRect );

    virtual void Paint( const Rectangle& rRect );
    virtual void FillRects() = 0;

public:
    SwSelPaintRects( const SwCrsrShell& rCSh );
    ~SwSelPaintRects();

    void Show();
    void Hide();
    void Invalidate( const SwRect& rRect );

    const SwCrsrShell* GetShell() const { return pCShell; }
    // check current MapMode of the shell and set possibly the static members.
    // Optional set the parameters pX, pY
    static void Get1PixelInLogic( const ViewShell& rSh,
                                    long* pX = 0, long* pY = 0 );
};


class SwShellCrsr : public virtual SwCursor, public SwSelPaintRects
{
    // Dokument-Positionen der Start/End-Charakter einer SSelection
    Point aMkPt, aPtPt;
    const SwPosition* pPt;      // fuer Zuordung vom GetPoint() zum aPtPt

    virtual void FillRects();   // fuer Table- und normalen Crsr

public:
    SwShellCrsr( const SwCrsrShell& rCrsrSh, const SwPosition &rPos );
    SwShellCrsr( const SwCrsrShell& rCrsrSh, const SwPosition &rPos,
                    const Point& rPtPos, SwPaM* pRing = 0 );
    SwShellCrsr( SwShellCrsr& );
    virtual ~SwShellCrsr();

    virtual operator SwShellCrsr* ();

    void Show();            // Update und zeige alle Selektionen an
    void Hide();            // verstecke alle Selektionen
    void Invalidate( const SwRect& rRect );

    const Point& GetPtPos() const   { return( SwPaM::GetPoint() == pPt ? aPtPt : aMkPt ); }
          Point& GetPtPos()         { return( SwPaM::GetPoint() == pPt ? aPtPt : aMkPt ); }
    const Point& GetMkPos() const   { return( SwPaM::GetMark() == pPt ? aPtPt : aMkPt ); }
          Point& GetMkPos()         { return( SwPaM::GetMark() == pPt ? aPtPt : aMkPt ); }
    const Point& GetSttPos() const  { return( SwPaM::Start() == pPt ? aPtPt : aMkPt ); }
          Point& GetSttPos()        { return( SwPaM::Start() == pPt ? aPtPt : aMkPt ); }
    const Point& GetEndPos() const  { return( SwPaM::End() == pPt ? aPtPt : aMkPt ); }
          Point& GetEndPos()        { return( SwPaM::End() == pPt ? aPtPt : aMkPt ); }

    virtual void SetMark();

    virtual SwCursor* Create( SwPaM* pRing = 0 ) const;

    virtual FASTBOOL MaxReplaceArived();
    virtual void SaveTblBoxCntnt( const SwPosition* pPos = 0 );

    FASTBOOL UpDown( BOOL bUp, USHORT nCnt = 1 );

    // TRUE: an die Position kann der Cursor gesetzt werden
    virtual FASTBOOL IsAtValidPos( BOOL bPoint = TRUE ) const;

#ifndef PRODUCT
// JP 05.03.98: zum Testen des UNO-Crsr Verhaltens hier die Implementierung
//              am sichtbaren Cursor
    virtual FASTBOOL IsSelOvr( int eFlags =
                                ( SELOVER_CHECKNODESSECTION |
                                  SELOVER_TOGGLE | SELOVER_CHANGEPOS ));
#endif

    DECL_FIXEDMEMPOOL_NEWDEL( SwShellCrsr )
};



class SwShellTableCrsr : public virtual SwShellCrsr, public virtual SwTableCursor
{
    // die Selection hat die gleiche Reihenfolge wie die
    // TabellenBoxen. D.h., wird aus dem einen Array an einer Position
    // etwas geloescht, dann muss es auch im anderen erfolgen!!


public:
    SwShellTableCrsr( const SwCrsrShell& rCrsrSh, const SwPosition& rPos );
    SwShellTableCrsr( const SwCrsrShell& rCrsrSh,
                    const SwPosition &rMkPos, const Point& rMkPt,
                    const SwPosition &rPtPos, const Point& rPtPt );
    virtual ~SwShellTableCrsr();

    virtual operator SwShellTableCrsr* ();

    virtual void FillRects();   // fuer Table- und normalen Crsr

    // Pruefe, ob sich der SPoint innerhalb der Tabellen-SSelection befindet
    FASTBOOL IsInside( const Point& rPt ) const;

    virtual void SetMark();
    virtual SwCursor* Create( SwPaM* pRing = 0 ) const;
    virtual operator SwShellCrsr* ();
    virtual operator SwTableCursor* ();
    virtual FASTBOOL MaxReplaceArived();
    virtual void SaveTblBoxCntnt( const SwPosition* pPos = 0 );

    // TRUE: an die Position kann der Cursor gesetzt werden
    virtual FASTBOOL IsAtValidPos( BOOL bPoint = TRUE ) const;

#ifndef PRODUCT
// JP 05.03.98: zum Testen des UNO-Crsr Verhaltens hier die Implementierung
//              am sichtbaren Cursor
    virtual FASTBOOL IsSelOvr( int eFlags =
                                ( SELOVER_CHECKNODESSECTION |
                                  SELOVER_TOGGLE | SELOVER_CHANGEPOS ));
#endif
};



#endif  // _VISCRS_HXX
diff --git a/sw/inc/wdocsh.hxx b/sw/inc/wdocsh.hxx
new file mode 100644
index 0000000..5c53b9f
--- /dev/null
+++ b/sw/inc/wdocsh.hxx
@@ -0,0 +1,100 @@
/*************************************************************************
 *
 *  $RCSfile: wdocsh.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:29 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWWDOCSH_HXX
#define _SWWDOCSH_HXX

#include "docsh.hxx"
#ifndef SW_SWDLL_HXX
#include <swdll.hxx>
#endif

class SwWebDocShell: public SwDocShell
{
    USHORT      nSourcePara;    // aktive Zeile in der SourceView
public:

    // aber selbst implementieren
    SFX_DECL_INTERFACE(SW_WEBDOCSHELL);
    SFX_DECL_OBJECTFACTORY_DLL(SwWebDocShell, SW_DLL());
    TYPEINFO();

    SwWebDocShell(SfxObjectCreateMode eMode = SFX_CREATE_MODE_EMBEDDED);
    ~SwWebDocShell();

    // Anforderung der pIo-Struktur fuer den Zugriff auf Substorages
    // und Streams
    virtual void    FillRegInfo( SvEmbeddedRegistryInfo * );

    virtual void        FillClass( SvGlobalName * pClassName,
                                   ULONG * pClipFormat,
                                   String * pAppName,
                                   String * pLongUserName,
                                   String * pUserName,
                                   long nVersion = SOFFICE_FILEFORMAT_NOW ) const;
    USHORT      GetSourcePara()const
                            {return nSourcePara;}
    void        SetSourcePara(USHORT nSet)
                            {nSourcePara = nSet;}
};

#endif


diff --git a/sw/prj/d.lst b/sw/prj/d.lst
new file mode 100644
index 0000000..a66aee0
--- /dev/null
+++ b/sw/prj/d.lst
@@ -0,0 +1,66 @@
..\inc\sw.lst %_DEST%\inc%_EXT%\sw.lst
..\inc\swinter.h %_DEST%\ODK\inc%_EXT%\swinter.h
..\inc\orntenum.hxx %_DEST%\inc%_EXT%\sw\orntenum.hxx
..\inc\horiornt.hxx %_DEST%\inc%_EXT%\sw\horiornt.hxx
..\%__SRC%\inc\swinter.h %_DEST%\ODK\inc%_EXT%\swinter.h
..\%__SRC%\misc\swinter.c %_DEST%\ODK\src%_EXT%\swinter.c
..\%__SRC%\bin\sweb.res %_DEST%\bin%_EXT%\sweb.res
..\%__SRC%\bin\*.ex$ %_DEST%\bin%_EXT%
..\xml\*.xml %_DEST%\xml\*.xml
touch: ..\%__SRC%\misc\sw.hid %_DEST%\bin%_EXT%\sw.hid
..\%__SRC%\bin\soffice.pdb %_DEST%\bin%_EXT%\soffice.pdb
..\%__SRC%\bin\swslots.tlb %_DEST%\bin%_EXT%\swslots.tlb
..\%__SRC%\bin\wswslots.tlb %_DEST%\bin%_EXT%\wswslots.tlb
..\%__SRC%\bin\sw%upd%*.dll %_DEST%\bin%_EXT%\sw%upd%*.dll
..\%__SRC%\bin\sw%upd%*.res %_DEST%\bin%_EXT%\sw%upd%*.res
..\%__SRC%\bin\sw%upd%*.res %_DEST%\bin%_EXT%\sw%upd%*.res
..\%__SRC%\lib\swinter.lib %_DEST%\lib%_EXT%\swinter.lib
..\%__SRC%\lib\swinter.lib %_DEST%\ODK\lib%_EXT%\swinter.lib
..\%__SRC%\misc\sw.csv %_DEST%\inc%_EXT%\sw.csv
..\%__SRC%\lib\swlib.lib %_DEST%\lib%_EXT%\swlib.lib
..\%__SRC%\slb\lib*.* %_DEST%\lib%_EXT%\lib*.*
..\%__SRC%\lib\lib*.* %_DEST%\lib%_EXT%\lib*.*
..\inc\swdll.hxx %_DEST%\inc%_EXT%\swdll.hxx
..\%__SRC%\lib\swweblib.lib %_DEST%\lib%_EXT%\swweblib.lib
mkdir: %_DEST%\idl\sw
hedabu: ..\unoidl\sw\swmap.idl %_DEST%\idl%_EXT%\sw\swmap.idl
hedabu: ..\unoidl\sw\swtxtdoc.idl %_DEST%\idl%_EXT%\sw\swtxtdoc.idl
hedabu: ..\unoidl\sw\swdoccol.idl %_DEST%\idl%_EXT%\sw\swdoccol.idl
hedabu: ..\unoidl\sw\swtxview.idl %_DEST%\idl%_EXT%\sw\swtxview.idl
hedabu: ..\unoidl\sw\swtxtsel.idl %_DEST%\idl%_EXT%\sw\swtxtsel.idl
hedabu: ..\unoidl\sw\swtxtbl.idl %_DEST%\idl%_EXT%\sw\swtxtbl.idl
hedabu: ..\unoidl\sw\swobject.idl %_DEST%\idl%_EXT%\sw\swobject.idl
hedabu: ..\unoidl\sw\swtxfld.idl %_DEST%\idl%_EXT%\sw\swtxfld.idl
hedabu: ..\unoidl\sw\swtype.idl %_DEST%\idl%_EXT%\sw\swtype.idl
hedabu: ..\unoidl\sw\swservc.idl %_DEST%\idl%_EXT%\sw\swservc.idl
hedabu: ..\unoidl\sw\swmod.idl %_DEST%\idl%_EXT%\sw\swmod.idl
mkdir: %_DEST%\inc\%_EXT%\sw
mkdir: %_DEST%\inc\%_EXT%\uno
mkdir: %_DEST%\inc\%_EXT%\uno\one
hedabu: ..\inc\swwebdll.hxx %_DEST%\inc%_EXT%\sw\swwebdll.hxx
hedabu: ..\inc\swdll.hxx %_DEST%\inc%_EXT%\sw\swdll.hxx
hedabu: ..\inc\swinter.h %_DEST%\inc%_EXT%\sw\swinter.h
hedabu: ..\%__SRC%\inc\sw\swobject.hxx %_DEST%\inc%_EXT%\sw\swobject.hxx
hedabu: ..\%__SRC%\inc\sw\swtxtbl.hxx %_DEST%\inc%_EXT%\sw\swtxtbl.hxx
hedabu: ..\%__SRC%\inc\sw\swtxfld.hxx %_DEST%\inc%_EXT%\sw\swtxfld.hxx
hedabu: ..\%__SRC%\inc\sw\swdoccol.hxx %_DEST%\inc%_EXT%\sw\swdoccol.hxx
hedabu: ..\%__SRC%\inc\sw\swtxtdoc.hxx %_DEST%\inc%_EXT%\sw\swtxtdoc.hxx
hedabu: ..\%__SRC%\inc\sw\swtype.hxx %_DEST%\inc%_EXT%\sw\swtype.hxx
hedabu: ..\%__SRC%\inc\sw\swtxtsel.hxx %_DEST%\inc%_EXT%\sw\swtxtsel.hxx
hedabu: ..\%__SRC%\inc\sw\swtxview.hxx %_DEST%\inc%_EXT%\sw\swtxview.hxx
hedabu: ..\%__SRC%\inc\sw\swservc.hxx %_DEST%\inc%_EXT%\sw\swservc.hxx
hedabu: ..\%__SRC%\inc\sw\swmod.hxx %_DEST%\inc%_EXT%\sw\swmod.hxx
hedabu: ..\%__SRC%\inc\sw\swobject.h %_DEST%\inc%_EXT%\uno\one\swobject.h
hedabu: ..\%__SRC%\inc\sw\swtxtbl.h %_DEST%\inc%_EXT%\uno\one\swtxtbl.h
hedabu: ..\%__SRC%\inc\sw\swtxfld.h %_DEST%\inc%_EXT%\uno\one\swtxfld.h
hedabu: ..\%__SRC%\inc\sw\swdoccol.h %_DEST%\inc%_EXT%\uno\one\swdoccol.h
hedabu: ..\%__SRC%\inc\sw\swtxtdoc.h %_DEST%\inc%_EXT%\uno\one\swtxtdoc.h
hedabu: ..\%__SRC%\inc\sw\swtype.h %_DEST%\inc%_EXT%\uno\one\swtype.h
hedabu: ..\%__SRC%\inc\sw\swtxtsel.h %_DEST%\inc%_EXT%\uno\one\swtxtsel.h
hedabu: ..\%__SRC%\inc\sw\swtxview.h %_DEST%\inc%_EXT%\uno\one\swtxview.h
hedabu: ..\%__SRC%\inc\sw\swservc.h %_DEST%\inc%_EXT%\uno\one\swservc.h
hedabu: ..\%__SRC%\inc\sw\swmod.h %_DEST%\inc%_EXT%\uno\one\swmod.h

mkdir: %_DEST%\ucr\sw
..\%__SRC%\ucr\*.ucr %_DEST%\ucr%_EXT%\sw\*.ucr

diff --git a/sw/sdi/_basesh.sdi b/sw/sdi/_basesh.sdi
new file mode 100644
index 0000000..090f21a
--- /dev/null
+++ b/sw/sdi/_basesh.sdi
@@ -0,0 +1,636 @@
/*-----------------------------------------------------------------------

    $Workfile:   _BASESH.SDI  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/_basesh.sdi,v 1.1.1.1 2000-09-18 17:14:29 hr Exp $

    Beschreibung:   interface Base - gemeinsame Basisfunktionalitaet
                    fuer SW und SW/WEB

    (c) Copyright 1997 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/

interface BaseTextSelection : Selection
[
    Automation = FALSE;
]
{
    SID_DELETE  // status(final|play)
    [
        ExecMethod = ExecDelete ;
        StateMethod = GetState ;
        FastCall = FALSE ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_BACKSPACE  // status(final|play)
    [
        ExecMethod = ExecDelete ;
        StateMethod = GetState ;
        FastCall = FALSE ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_SHIFT_BACKSPACE // status()
    [
        ExecMethod = ExecDelete ;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_UNDO // status(final|play)
    [
        ExecMethod = ExecUndo ;
        StateMethod = StateUndo ;
    ]

    SID_REDO // status(final|play)
    [
        ExecMethod = ExecUndo ;
        StateMethod = StateUndo ;
    ]

    SID_REPEAT // status()
    [
        ExecMethod = ExecUndo ;
        StateMethod = StateUndo ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_CUT // status(final|play)
    [
        ExecMethod = ExecClpbrd ;
        StateMethod = StateClpbrd ;
        Volatile;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_COPY   // status(final|play)
    [
        ExecMethod = ExecClpbrd ;
        StateMethod = StateClpbrd ;
        Volatile;
    ]

    SID_PASTE  // status(final|play)
    [
        ExecMethod = ExecClpbrd ;
        StateMethod = StateClpbrd ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_PASTESPECIAL  // status(final|play)
    [
        ExecMethod = ExecClpbrd ;
        StateMethod = StateClpbrd ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_REPAGINATE  // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
    ]

    FN_CHANGE_DBFIELD
    [
        ExecMethod = ExecField ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_SBA_BRW_UPDATE
    [
        StateMethod = GetState;
        ExecMethod = ExecDB;
        Export = FALSE
    ]

    SID_SBA_BRW_INSERT
    [
        StateMethod = GetState;
        ExecMethod = ExecDB;
        Export = FALSE
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_SBA_BRW_MERGE
    [
        StateMethod = GetState;
        ExecMethod = ExecDB;
        Export = FALSE
    ]

    FN_UPDATE_FIELDS // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
    ]

    FN_UPDATE_CHARTS // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
    FN_UPDATE_ALL // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
    ]

    FN_UPDATE_INPUTFIELDS  // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
    ]

    FN_FRAME_TO_ANCHOR // status()
    [
        /*OS: Datentypen unvertraeglich ?? */
        ExecMethod = Execute ;
        StateMethod = NoState ;
    ]

    FN_GOTO_NEXT_OBJ // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
    ]

    FN_GOTO_PREV_OBJ // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
    ]

    FN_GOTO_NEXT_MARK // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
    ]

    FN_GOTO_PREV_MARK  // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
    ]

    FN_PREV_BOOKMARK // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
    ]

    FN_NEXT_BOOKMARK // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
    ]

    SID_GALLERY_FORMATS // status()
    [
        Export = FALSE ;
        ExecMethod = Execute ;
    ]

    SID_GALLERY_ENABLE_ADDCOPY
    [
        Export = FALSE;
        StateMethod = GetState;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_BACKGROUND_COLOR // status()
    [
        ExecMethod = ExecBckCol ;
        StateMethod = GetBckColState ;
        Cachable , AutoUpdate ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_EDIT_REGION // status(final|play)
    [
        ExecMethod = EditRegionDialog ;
        StateMethod = GetState ;
    ]

    FN_INSERT_REGION // status(final|play)
    [
        ExecMethod = InsertRegionDialog ;
        StateMethod = GetState;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_INSERT_COLUMN_SECTION // status()
    [
        ExecMethod = InsertRegionDialog;
        StateMethod = GetState;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SfxVoidItem PageDialog FN_FORMAT_PAGE_DLG ( )  // status(final|play)
    [
        ExecMethod = ExecDlg ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_FORMAT_PAGE_COLUMN_DLG  // status(final|play)
    [
        ExecMethod = ExecDlg ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_CONVERT_TEXT_TABLE // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_FORMAT_BORDER_DLG // status(final|play)
    [
        ExecMethod = ExecDlg ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_ATTR_BORDER_INNER // status()
    [
        StateMethod = GetBorderState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

/*  SID_ATTR_BORDER_OUTER // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetBorderState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
*/
    FN_FORMAT_BACKGROUND_DLG  // status(final|play)
    [
        ExecMethod = ExecDlg ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SfxBoolItem StyleWatercanMode SID_STYLE_WATERCAN // status()
    [
        SfxUInt16Item WatercanStyleModeOnOff
        (
            SfxStringItem Param SID_STYLE_WATERCAN ,
            SfxUInt16Item Family SID_STYLE_FAMILY
        ) ;
        ExecMethod = Execute ;
        StateMethod = StateStyle ;
        GroupId = GID_TEMPLATE ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_STYLE_UPDATE_BY_EXAMPLE // status()
    [
        ExecMethod = Execute ;
        StateMethod = StateStyle ;
    ]

    SID_STYLE_NEW_BY_EXAMPLE // status(fina|play)
    [
        ExecMethod = Execute ;
        StateMethod = StateStyle ;
        FastCall = TRUE; // fuer Macroausfuehrung!
    ]
    SID_STYLE_APPLY // status(fina|play)
    [
        ExecMethod = Execute ;
        StateMethod = StateStyle ;
        FastCall = TRUE;// fuer Macroausfuehrung!
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_STYLE_FAMILY1 // status(fina|play)
    [
        StateMethod = StateStyle ;
    ]

    SID_STYLE_FAMILY2 // status(fina|play)
    [
        StateMethod = StateStyle ;
    ]

    SID_STYLE_FAMILY3 // status(fina|play)
    [
        StateMethod = StateStyle ;
    ]

    SID_STYLE_FAMILY4 // status(fina|play)
    [
        StateMethod = StateStyle ;
    ]

    SID_STYLE_FAMILY5 // status(fina|play)
    [
        StateMethod = StateStyle ;
    ]

     //OS: Selection.Escape gibt es zusaetzlich zu Window.Escape

    FN_ESCAPE // status(final|play|rec)
    [
        ExecMethod = Execute ;
    ]

    SID_IMAP
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        Toggle = FALSE;
    ]

    SID_IMAP_EXEC
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
// Methode fuer Rahmen und Objekte
    FN_TOOL_ANKER
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_TOOL_ANKER_PARAGRAPH
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_TOOL_ANKER_CHAR
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_TOOL_ANKER_AT_CHAR
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_TOOL_ANKER_FRAME
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_UPDATE_ALL_LINKS // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]

/*-----------------22.01.97 09.41-------------------
// ab hier immer Export = FALSE
--------------------------------------------------*/

    FN_FRAME_WRAP   // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
        Export = FALSE;
    ]

    FN_FRAME_WRAP_IDEAL // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
        Export = FALSE;
    ]

    FN_FRAME_NOWRAP   // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
        Export = FALSE;
    ]

    FN_FRAME_WRAPTHRU   // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
        Export = FALSE;
    ]

    FN_FRAME_WRAPTHRU_TRANSP // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
        Export = FALSE;
    ]

    FN_FRAME_WRAP_CONTOUR // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
        Export = FALSE;
    ]

    FN_WRAP_ANCHOR_ONLY // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
        Export = FALSE;
    ]

    FN_FRAME_WRAP_LEFT // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
        Export = FALSE;
    ]

    FN_FRAME_WRAP_RIGHT // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
        Export = FALSE;
    ]



    SID_GALLERY_BG_BRUSH
    [
        ExecMethod = ExecuteGallery;
        StateMethod = GetGalleryState;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
        Export = FALSE;
    ]
    SID_ATTR_BORDER_SHADOW // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.46  2000/05/30 10:12:26  os
    unused slots removed

    Revision 1.45  2000/05/26 07:06:15  os
    old SW Basic API Slots removed

    Revision 1.44  2000/05/10 12:00:08  os
    Basic API removed

    Revision 1.43  1999/10/20 16:36:53  jp
    Bug #68106#: new slot for update all charts in a document

    Revision 1.42  1999/05/27 11:20:10  OS
    Einf?gen/Bearbeiten von Spalten ueberarbeitet


      Rev 1.41   27 May 1999 13:20:10   OS
   Einf?gen/Bearbeiten von Spalten ueberarbeitet

      Rev 1.40   15 Apr 1999 12:05:52   OS
   #64766# SID_IMAP: Toggle = FALSE;

      Rev 1.39   23 Mar 1999 12:15:30   MA
   #63806# ConfigName und HelpText entfernt

      Rev 1.38   12 Feb 1999 13:28:02   MA
   #61262# Zusaetzliche hidden functions in den Toolbars

      Rev 1.37   26 Jan 1999 14:21:38   OS
   #61140# neuer Slot fuer Felder-Update

      Rev 1.36   12 Nov 1998 17:29:12   MA
   #58677# Disable Flag

      Rev 1.35   11 Jun 1998 13:02:54   OM
   #49467# Rahmen in Inhalt-protecteten Parents nicht bearbeiten

      Rev 1.34   23 Apr 1998 12:29:24   OS
   PageLeft/Right/Top/BottomMargin #49761#

      Rev 1.33   25 Feb 1998 19:16:00   MA
   Aktualisieren erweitert

      Rev 1.32   29 Jan 1998 15:00:22   OM
   Am Zeichen verankern

      Rev 1.31   22 Jan 1998 17:40:30   OS
   SID_BACKGROUND_PATTERN entsorgt

      Rev 1.30   20 Nov 1997 14:02:42   OS
   StyleNew/UpdateByExample: FastCall wg. Basic #45671#

      Rev 1.29   11 Nov 1997 13:17:18   JP
   neu: NumRule-Vorlagen

      Rev 1.28   03 Sep 1997 09:30:54   MBA
   Interior in SVX

      Rev 1.27   02 Sep 1997 10:58:52   JP
   neu: UpdateAllLinks - uebers Basic alle Links updaten

      Rev 1.26   28 Aug 1997 12:38:32   MBA
   Neue Interface-Namen

      Rev 1.25   06 Aug 1997 13:38:42   OS
   ShowCursor geht wieder #42017#,#41945#

      Rev 1.24   25 Jul 1997 11:27:52   AMA
   Opt: GroupId und ConfigName aufgeraeumt

      Rev 1.23   23 Jul 1997 16:05:14   AMA
   Opt: ConfigName etc. aufgeraeumt

      Rev 1.22   18 Jul 1997 09:38:06   OM
   Fkts nicht exportieren

      Rev 1.21   16 Jul 1997 11:30:10   OM
   sid_gallery entfernt

      Rev 1.20   14 Jul 1997 14:37:12   OS
   Ableitung _Base:_Object #41369#

      Rev 1.19   08 Jul 1997 15:10:36   OS
   FN_SHOW_CURSOR

      Rev 1.18   01 Jul 1997 13:45:56   OS
   Inhalte aus dem Basic einfuegen

      Rev 1.17   27 Jun 1997 16:21:58   OS
   SID_JUMPTOMARK von der View an die BaseShell

      Rev 1.16   26 Jun 1997 09:44:48   OM
   Basic: Datenbank in Feldbefehlen ersetzen

      Rev 1.15   19 Jun 1997 13:32:22   MA
   State fuer galler

      Rev 1.14   17 Jun 1997 14:54:38   OM
   Methoden fuer ersetzen von Userfeldern

      Rev 1.13   13 Jun 1997 13:18:52   OM
   Benutzer- und Expression-Felder per Basic loeschen

      Rev 1.12   12 Jun 1997 15:32:34   JP
   Feld-Slots aus der TextShell in die BaseShell verschoben

      Rev 1.11   24 Apr 1997 14:40:00   JP
   neu: SetFixDateTimFields

      Rev 1.10   22 Apr 1997 14:03:42   OS
   Is/SetRegionPassword

      Rev 1.9   17 Apr 1997 15:44:14   AMA
   New: Rahmengebundene Rahmen

      Rev 1.8   15 Apr 1997 12:00:30   OS
   Bedingung der Bereiche setzen/lesen

      Rev 1.7   14 Apr 1997 16:10:16   OS
   Flags und Link der Bereiche setzen/erfragen

      Rev 1.6   22 Feb 1997 15:11:58   OS
   neue Slots: Actions setzen/ruecksetzen

      Rev 1.5   13 Feb 1997 22:57:38   MA
   Datenbankfunktionalitaet wieder hergestellt

      Rev 1.4   13 Feb 1997 09:54:20   MA
   unnoetige und falsche Texte entfernt

      Rev 1.3   12 Feb 1997 16:56:52   OM
   Datenbankslots ueber Baseshell rufen

      Rev 1.2   06 Feb 1997 13:48:20   MA
   new: Gallery-Background

      Rev 1.1   27 Jan 1997 16:37:44   OS
   Web-Slots aus den allg. interfaces raus

      Rev 1.0   23 Jan 1997 08:14:08   OS
   Initial revision.


------------------------------------------------------------------------*/


diff --git a/sw/sdi/_beziers.sdi b/sw/sdi/_beziers.sdi
new file mode 100644
index 0000000..a3275c3
--- /dev/null
+++ b/sw/sdi/_beziers.sdi
@@ -0,0 +1,141 @@
/*------------------------------------------------------------------------

    $Workfile:   _beziers.sdi  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/_beziers.sdi,v 1.1.1.1 2000-09-18 17:14:29 hr Exp $

    Beschreibung:   Basis-interface fuer Bezier

    (c) Copyright 1989 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/

interface _Bezier : Base
[ Automation = FALSE; ]
{
    SID_DELETE
    [
        ExecMethod = Execute ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_BACKSPACE
    [
        ExecMethod = Execute ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_ESCAPE // api:
    [
        ExecMethod = Execute;
    ]

    SID_BEZIER_MOVE
    [
        Export = FALSE;
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_BEZIER_INSERT
    [
        Export = FALSE;
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_BEZIER_DELETE
    [
        Export = FALSE;
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_BEZIER_CUTLINE
    [
        Export = FALSE;
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_BEZIER_CONVERT
    [
        Export = FALSE;
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_BEZIER_EDGE
    [
        Export = FALSE;
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_BEZIER_SMOOTH
    [
        Export = FALSE;
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_BEZIER_SYMMTR
    [
        Export = FALSE;
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_BEZIER_CLOSE
    [
        Export = FALSE;
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_BEZIER_ELIMINATE_POINTS
    [
        Export = FALSE;
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.5  1998/11/12 16:28:52  MA
    #58677# Disable Flag


      Rev 1.4   12 Nov 1998 17:28:52   MA
   #58677# Disable Flag

      Rev 1.3   16 Jul 1997 16:47:26   OM
   Einige Basic-Fkts nicht exportieren

      Rev 1.2   16 Jun 1997 15:29:08   OM
   GPF behoben: Backspace wie Delete behandeln

      Rev 1.1   13 Feb 1997 09:54:08   MA
   unnoetige und falsche Texte entfernt

      Rev 1.0   23 Jan 1997 14:45:12   OS
   Initial revision.


------------------------------------------------------------------------*/




diff --git a/sw/sdi/_docsh.sdi b/sw/sdi/_docsh.sdi
new file mode 100644
index 0000000..c378324
--- /dev/null
+++ b/sw/sdi/_docsh.sdi
@@ -0,0 +1,166 @@
/*------------------------------------------------------------------------

    $Workfile:   _docsh.sdi  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/_docsh.sdi,v 1.1.1.1 2000-09-18 17:14:29 hr Exp $

    Beschreibung:   interface __Document enthaelt gemeinsame Slots fuer
                    SwDocShell und SwWebDocShell

    (c) Copyright 1997 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/

interface BaseTextDocument : OfficeDocument
[
    Automation = FALSE;
]
{
    SID_PRINTPREVIEW
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]

    FN_AUTO_CORRECT_DLG
    [
        ExecMethod = Execute ;
    ]

    SID_STYLE_NEW
    [
        ExecMethod = ExecStyleSheet ;
        StateMethod = NoState ;
    ]

    SID_STYLE_EDIT
    [
        ExecMethod = ExecStyleSheet ;
        StateMethod = NoState ;
    ]

    SID_STYLE_DELETE
    [
        ExecMethod = ExecStyleSheet ;
        StateMethod = NoState ;
    ]

    SID_TEMPLATE_LOAD
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
    ]

    SID_GET_COLORTABLE
    [
        ExecMethod = Execute ;
    ]

    SID_SPELLCHECKER_CHANGED
    [
        ExecMethod = Execute ;
    ]

    SID_MAIL_PREPAREEXPORT
    [
        ExecMethod = Execute ;
    ]

     //No Export
    SID_STYLE_FAMILY1
    [
        Export = FALSE ;
        StateMethod = StateStyleSheet ;
    ]

    SID_STYLE_FAMILY2
    [
        Export = FALSE ;
        StateMethod = StateStyleSheet ;
    ]

    SID_STYLE_FAMILY3
    [
        Export = FALSE ;
        StateMethod = StateStyleSheet ;
    ]

    SID_STYLE_FAMILY4
    [
        Export = FALSE ;
        StateMethod = StateStyleSheet ;
    ]
    SID_STYLE_FAMILY5
    [
        Export = FALSE ;
        StateMethod = StateStyleSheet ;
    ]


    SID_ATTR_YEAR2000
    [
        ExecMethod = Execute ;
        StateMethod = GetState;
    ]
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.17  2000/05/26 07:06:15  os
    old SW Basic API Slots removed

    Revision 1.16  1999/09/10 12:16:20  jp
    AutoCorrectDialog: dont disable by protected cursor

    Revision 1.15  1999/02/02 07:41:38  OS
    #61027# zweistellige Jahreszahlen


      Rev 1.14   02 Feb 1999 08:41:38   OS
   #61027# zweistellige Jahreszahlen

      Rev 1.13   12 Nov 1998 17:29:28   MA
   #58677# Disable Flag

      Rev 1.12   28 May 1998 17:39:56   OM
   Zahlenformat per Basic ermitteln

      Rev 1.11   13 May 1998 14:58:30   OM
   Autokorrektur/Autoformat umgestaltet und zusammengefasst

      Rev 1.10   24 Apr 1998 15:03:12   OM
   Seitenvorschau auch im Html-Mode

      Rev 1.9   17 Apr 1998 17:13:10   OM
   PageCount-Event per Macro setzen: Vorbereitungen

      Rev 1.8   11 Nov 1997 13:17:18   JP
   neu: NumRule-Vorlagen

      Rev 1.7   04 Sep 1997 13:36:52   MBA
   Document von OfficeDocument abgeleitet

      Rev 1.6   28 Aug 1997 12:51:22   MBA
   Neue Interface-Namen

      Rev 1.5   05 Jul 1997 09:42:06   OS
   Macro und Script an Rahmenvorlagen setzen/lesen

      Rev 1.4   17 Jun 1997 13:24:38   JP
   neu: Execute vom Slot SID_MAIL_PREPAREEXPORT

      Rev 1.3   06 Mar 1997 08:43:20   OS
   SID_SPELLCHECKER_CHANGED

      Rev 1.2   13 Feb 1997 09:54:06   MA
   unnoetige und falsche Texte entfernt

      Rev 1.1   30 Jan 1997 15:28:18   OS
   SourceView nur noch fuer den Sw/Web

      Rev 1.0   23 Jan 1997 08:14:08   OS
   Initial revision.

------------------------------------------------------------------------*/

diff --git a/sw/sdi/_drwbase.sdi b/sw/sdi/_drwbase.sdi
new file mode 100644
index 0000000..9600b95
--- /dev/null
+++ b/sw/sdi/_drwbase.sdi
@@ -0,0 +1,164 @@
/*-----------------------------------------------------------------------

    $Workfile:   _drwbase.sdi  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/_drwbase.sdi,v 1.1.1.1 2000-09-18 17:14:29 hr Exp $

    Beschreibung:   Basis-interface _DrawBase

    (c) Copyright 1997 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/

interface BaseTextDrawBase : Selection
[
    Automation = FALSE;
]
{
    FN_DRAW_WRAP_DLG
    [
        ExecMethod = Execute;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_ATTR_TRANSFORM
    [
        ExecMethod = Execute;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_GROUP
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_UNGROUP
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_ENTER_GROUP
    [
        AutoUpdate = TRUE ,
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]

    SID_LEAVE_GROUP
    [
        AutoUpdate = TRUE ,
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]

    SID_FRAME_TO_TOP
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_FRAME_TO_BOTTOM
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_FRAME_UP
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_FRAME_DOWN
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_DELETE
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        FastCall = FALSE ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_BACKSPACE
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        FastCall = FALSE ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_STYLE_CATALOG  // ole(no) api(play/rec)
    [
        StateMethod = StateDisableItems ;
    ]
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.15  2000/05/26 07:06:15  os
    old SW Basic API Slots removed

    Revision 1.14  1999/03/23 11:16:30  MA
    #63806# ConfigName und HelpText entfernt


      Rev 1.13   23 Mar 1999 12:16:30   MA
   #63806# ConfigName und HelpText entfernt

      Rev 1.12   12 Nov 1998 17:28:34   MA
   #58677# Disable Flag

      Rev 1.11   06 Jul 1998 18:10:54   OM
   AutoUpdate fuer Enter/Leave Group

      Rev 1.10   12 Jun 1998 16:09:52   OM
   Gruppierung betreten/verlassen

      Rev 1.9   11 Jun 1998 16:13:46   OM
   Gruppierungsmenue

      Rev 1.8   11 Jun 1998 13:02:54   OM
   #49467# Rahmen in Inhalt-protecteten Parents nicht bearbeiten

      Rev 1.7   10 Jun 1998 11:20:44   OM
   Hell/Heaven nicht in FormShell

      Rev 1.6   09 Jun 1998 15:37:06   OM
   VC-Controls entfernt

      Rev 1.5   15 Apr 1998 15:33:00   OM
   #49467 Objekte innerhalb von geschuetzten Rahmen duerfen nicht veraendert werden

      Rev 1.4   28 Aug 1997 12:55:08   MBA
   Neue Interface-Namen

      Rev 1.3   16 Jun 1997 15:29:50   OM
   GPF behoben: Backspace wie Delete behandeln

      Rev 1.2   12 Mar 1997 10:25:26   OS
   IsControl muss an die DrawBaseShell !

      Rev 1.1   13 Feb 1997 09:54:18   MA
   unnoetige und falsche Texte entfernt

      Rev 1.0   23 Jan 1997 14:46:22   OS
   Initial revision.

------------------------------------------------------------------------*/


diff --git a/sw/sdi/_formsh.sdi b/sw/sdi/_formsh.sdi
new file mode 100644
index 0000000..0d7125f
--- /dev/null
+++ b/sw/sdi/_formsh.sdi
@@ -0,0 +1,38 @@
interface BaseTextDrawForm : Selection
[
    Automation = FALSE;
]
{
    SID_HYPERLINK_SETLINK
    [
        ExecMethod = Execute ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_HYPERLINK_GETLINK
    [
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.4  1998/11/26 14:19:08  MA
    #59896# Raster usw jetzt an der Application


      Rev 1.3   26 Nov 1998 15:19:08   MA
   #59896# Raster usw jetzt an der Application

      Rev 1.2   12 Nov 1998 17:29:28   MA
   #58677# Disable Flag

      Rev 1.1   02 Nov 1998 09:23:02   MA
   #58294# Slots fuer Raster, alte Formslots entsorgt

      Rev 1.0   11 Mar 1998 17:14:04   OM
   DB-FormShell

------------------------------------------------------------------------*/

diff --git a/sw/sdi/_frmsh.sdi b/sw/sdi/_frmsh.sdi
new file mode 100644
index 0000000..90fc3d7
--- /dev/null
+++ b/sw/sdi/_frmsh.sdi
@@ -0,0 +1,292 @@
/*------------------------------------------------------------------------

    $Workfile:   _frmsh.sdi  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/_frmsh.sdi,v 1.1.1.1 2000-09-18 17:14:30 hr Exp $

    Beschreibung:   Basis-interface fuer Frame

    (c) Copyright 1997 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/

interface BaseTextFrame : Selection
[
    Automation = FALSE;
]
{
    FN_FRAME_TO_ANCHOR  // status()
    [
        /*OS: Datentypen unvertraeglich ?? */
        ExecMethod = Execute ;
        StateMethod = NoState ;
    ]

    FN_FRAME_ALIGN_VERT_CENTER // status(play|final)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_FRAME_ALIGN_VERT_BOTTOM  // status(play|final)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_FRAME_ALIGN_VERT_TOP   // status(play|final)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_FRAME_ALIGN_VERT_ROW_CENTER  // status(play|final)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_FRAME_ALIGN_VERT_ROW_BOTTOM // status(play|final)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_FRAME_ALIGN_VERT_ROW_TOP  // status(play|final)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_FRAME_ALIGN_VERT_CHAR_CENTER // status(play|final)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_FRAME_ALIGN_VERT_CHAR_BOTTOM  // status(play|final)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_FRAME_ALIGN_VERT_CHAR_TOP  // status(play|final)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_FRAME_ALIGN_HORZ_CENTER  // status(play|final)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_FRAME_ALIGN_HORZ_RIGHT // status(play|final)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_FRAME_ALIGN_HORZ_LEFT // status(play|final)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]


    SID_FRAME_TO_TOP // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_FRAME_TO_BOTTOM  // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]


    FN_FRAME_UP  // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_FRAME_DOWN // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_ATTR_ULSPACE // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_ATTR_LRSPACE // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        GroupId = GID_FRAME;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_FORMAT_FRAME_DLG   // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_FRAME_LINESTYLE // status()
    [
        ExecMethod = ExecFrameStyle ;
        StateMethod = GetLineStyleState ;
        Export = FALSE; //#44439#
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_FRAME_LINECOLOR // status(final|play)
    [
        ExecMethod = ExecFrameStyle ;
        StateMethod = GetLineStyleState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    /*****************************************************

 Abfragefunktionen fuer ImageMaps

 ****************************************************/

//
// Slots ohne Export

    FN_INSERT_FRAME
    [
        ExecMethod = Execute ;
        StateMethod = StateInsert ;
        Export = False;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_ATTR_BORDER // status()
    [
        ExecMethod = ExecFrameStyle ;
        StateMethod = GetLineStyleState ;
        GroupId = GID_FRAME;
        Export = False;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_HYPERLINK_SETLINK  // status()
    [
        ExecMethod = Execute ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_HYPERLINK_GETLINK  // status()
    [
        StateMethod = GetState ;
    ]

    FN_FRAME_MIRROR_ON_EVEN_PAGES // status(final|play|rec)
    [
        ExecMethod = Execute ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
}


/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.21  2000/08/15 13:50:56  os
    #77616# re-enable border in SwFrameShell

    Revision 1.20  2000/05/26 07:06:15  os
    old SW Basic API Slots removed

    Revision 1.19  2000/05/10 12:00:08  os
    Basic API removed

    Revision 1.18  1999/03/23 11:16:28  MA
    #63806# ConfigName und HelpText entfernt


      Rev 1.17   23 Mar 1999 12:16:28   MA
   #63806# ConfigName und HelpText entfernt

      Rev 1.16   29 Jan 1999 17:15:22   JP
   Task #58423#: Reports mit Bildern aus der Datenbank

      Rev 1.15   12 Nov 1998 17:29:08   MA
   #58677# Disable Flag

      Rev 1.14   11 Jun 1998 13:02:54   OM
   #49467# Rahmen in Inhalt-protecteten Parents nicht bearbeiten

      Rev 1.13   15 May 1998 16:21:34   OM
   #49467# Geschtzte Rahmen nicht bearbeiten

      Rev 1.12   10 Feb 1998 15:06:06   OM
   Spiegeln

      Rev 1.11   22 Jan 1998 17:40:30   OS
   SID_BACKGROUND_PATTERN entsorgt

      Rev 1.10   08 Oct 1997 13:30:52   OS
   SID_FRAME_LINESTYLE funktioniert nicht ueber die API #44439#

      Rev 1.9   28 Aug 1997 12:38:24   MBA
   Neue Interface-Namen

      Rev 1.8   28 Jul 1997 16:46:42   OM
   #42111#Neue Statusmethode fuer Hyperlinkleiste

      Rev 1.7   23 Jul 1997 15:19:12   AMA
   Opt: ConfigName etc. aufgeraeumt

      Rev 1.6   26 May 1997 14:12:12   OS
   StateMethod fuer SwFmtSurround

      Rev 1.5   15 May 1997 12:31:22   OS
   Printable und Opaque am Frame

      Rev 1.4   22 Apr 1997 18:46:52   JP
    neu: GetSelText/SetText

      Rev 1.3   16 Apr 1997 16:22:28   OS
   Kontur und erster Absatz per Basic

      Rev 1.2   13 Feb 1997 09:54:08   MA
   unnoetige und falsche Texte entfernt

      Rev 1.1   23 Jan 1997 16:09:06   OS
   interface _Frame mit Automation = FALSE

      Rev 1.0   23 Jan 1997 14:46:02   OS
   Initial revision.

------------------------------------------------------------------------*/


diff --git a/sw/sdi/_grfsh.sdi b/sw/sdi/_grfsh.sdi
new file mode 100644
index 0000000..2df8b81
--- /dev/null
+++ b/sw/sdi/_grfsh.sdi
@@ -0,0 +1,153 @@
/*------------------------------------------------------------------------

    $Workfile:   _grfsh.sdi  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/_grfsh.sdi,v 1.1.1.1 2000-09-18 17:14:30 hr Exp $

    Beschreibung:   interface _Graphic

    (c) Copyright 1997 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/

interface BaseTextGraphic : Selection
[
    Automation = FALSE;
]
{
    FN_FLIP_VERT_GRAFIC  // status(final|play)
    [
        ExecMethod = ExecAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_FLIP_HORZ_GRAFIC  // status(final|play)
    [
        ExecMethod = ExecAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_FORMAT_GRAFIC_DLG // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_INSERT_GRAPHIC // zeigt auf FN_FORMAT_GRAFIC_DLG
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_SIM_START   // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_GRAPHIC_MIRROR_ON_EVEN_PAGES // status(final|play|rec)
    [
        ExecMethod = Execute ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_ATTR_GRAF_LUMINANCE // status(final|play|rec)
    [
        ExecMethod = ExecAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_GRAF_CONTRAST  // status(final|play|rec)
    [
        ExecMethod = ExecAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_GRAF_RED   // status(final|play|rec)
    [
        ExecMethod = ExecAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_GRAF_GREEN // status(final|play|rec)
    [
        ExecMethod = ExecAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_GRAF_BLUE  // status(final|play|rec)
    [
        ExecMethod = ExecAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_GRAF_GAMMA // status(final|play|rec)
    [
        ExecMethod = ExecAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_GRAF_TRANSPARENCE  // status(final|play|rec)
    [
        ExecMethod = ExecAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_GRAF_INVERT    // status(final|play|rec)
    [
        ExecMethod = ExecAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_GRAF_MODE  // status(final|play|rec)
    [
        ExecMethod = ExecAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.10  2000/07/31 19:23:40  jp
    new attributes for CJK/CTL and graphic

    Revision 1.9  2000/05/26 07:06:15  os
    old SW Basic API Slots removed

    Revision 1.8  1999/03/23 11:16:28  MA
    #63806# ConfigName und HelpText entfernt


      Rev 1.7   23 Mar 1999 12:16:28   MA
   #63806# ConfigName und HelpText entfernt

      Rev 1.6   12 Nov 1998 17:29:06   MA
   #58677# Disable Flag

      Rev 1.5   11 Jun 1998 13:02:54   OM
   #49467# Rahmen in Inhalt-protecteten Parents nicht bearbeiten

      Rev 1.4   10 Feb 1998 15:06:06   OM
   Spiegeln

      Rev 1.3   28 Aug 1997 12:38:14   MBA
   Neue Interface-Namen

      Rev 1.2   28 Jul 1997 16:46:40   OM
   #42111#Neue Statusmethode fuer Hyperlinkleiste

      Rev 1.1   13 Feb 1997 09:54:18   MA
   unnoetige und falsche Texte entfernt

      Rev 1.0   31 Jan 1997 13:26:24   OS
   Initial revision.

------------------------------------------------------------------------*/

diff --git a/sw/sdi/_listsh.sdi b/sw/sdi/_listsh.sdi
new file mode 100644
index 0000000..6d26a93
--- /dev/null
+++ b/sw/sdi/_listsh.sdi
@@ -0,0 +1,103 @@
/*------------------------------------------------------------------------

    $Workfile:   _listsh.sdi  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/_listsh.sdi,v 1.1.1.1 2000-09-18 17:14:30 hr Exp $

    Beschreibung:   Basis-interface _List

    (c) Copyright 1997 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/

interface BaseTextList : Selection
[
    Automation = FALSE
]
{
    FN_NUMBER_NEWSTART // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_NUM_BULLET_DOWN // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_NUM_BULLET_NEXT // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_NUM_BULLET_NONUM // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_NUM_BULLET_OFF // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]


    FN_NUM_BULLET_OUTLINE_DOWN  // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_NUM_BULLET_OUTLINE_MOVEDOWN // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_NUM_BULLET_OUTLINE_MOVEUP // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_NUM_BULLET_OUTLINE_UP   // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_NUM_BULLET_PREV  // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_NUM_BULLET_UP // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_NUM_OR_NONUM // status(play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
}

diff --git a/sw/sdi/_olesh.sdi b/sw/sdi/_olesh.sdi
new file mode 100644
index 0000000..14085aa
--- /dev/null
+++ b/sw/sdi/_olesh.sdi
@@ -0,0 +1,46 @@
/*------------------------------------------------------------------------

    $Workfile:   _olesh.sdi  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/_olesh.sdi,v 1.1.1.1 2000-09-18 17:14:30 hr Exp $

    Beschreibung:   gemeinsames interface _OleObject

    (c) Copyright 1997 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/

interface BaseTextOLEObject : Selection
[
    Automation = FALSE;
]
{
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.6  2000/05/26 07:06:15  os
    old SW Basic API Slots removed

    Revision 1.5  2000/05/10 12:00:08  os
    Basic API removed

    Revision 1.4  1998/11/12 16:28:52  MA
    #58677# Disable Flag


      Rev 1.3   12 Nov 1998 17:28:52   MA
   #58677# Disable Flag

      Rev 1.2   28 Aug 1997 12:52:24   MBA
   Neue Interface-Namen

      Rev 1.1   13 Feb 1997 09:54:08   MA
   unnoetige und falsche Texte entfernt

      Rev 1.0   31 Jan 1997 13:26:48   OS
   Initial revision.

------------------------------------------------------------------------*/

diff --git a/sw/sdi/_tabsh.sdi b/sw/sdi/_tabsh.sdi
new file mode 100644
index 0000000..bac8dc2
--- /dev/null
+++ b/sw/sdi/_tabsh.sdi
@@ -0,0 +1,409 @@
/*------------------------------------------------------------------------

    $Workfile:   _tabsh.sdi  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/_tabsh.sdi,v 1.1.1.1 2000-09-18 17:14:30 hr Exp $

    Beschreibung:   Basis-interface _Table

    (c) Copyright 1997 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/

interface BaseTextTable : Selection
[
    Automation = FALSE;
]
{

    FN_FORMAT_TABLE_DLG   // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
    ]

    FN_NUM_FORMAT_TABLE_DLG   // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
    ]

    FN_CALC_TABLE // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
    ]

    FN_TABLE_AUTOSUM // status()
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
    ]


    FN_TABLE_VERT_NONE
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_TABLE_VERT_CENTER
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_TABLE_VERT_BOTTOM
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_TABLE_SET_COL_WIDTH // status( final|play )
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_ULSPACE // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_ATTR_LRSPACE // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        GroupId = GID_TABLE;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_TABLE_DELETE_COL  // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_TABLE_DELETE_ROW  // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_END_TABLE  // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
    ]

    FN_START_TABLE  // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
    ]

    FN_TABLE_INSERT_COL // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_TABLE_INSERT_COL_DLG  // status(final|play)
    [
        Export = FALSE ;
        ExecMethod = Execute ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_TABLE_INSERT_ROW // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_TABLE_INSERT_ROW_DLG  // status(final|play)
    [
        Export = FALSE ;
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_TABLE_MERGE_CELLS  // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_OPTIMIZE_TABLE
    [
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_TABLE_ADJUST_CELLS  // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_TABLE_BALANCE_CELLS  // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_TABLE_BALANCE_ROWS  // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_TABLE_SELECT_ALL // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
    ]

    FN_TABLE_SELECT_COL   // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
    ]

    FN_TABLE_SELECT_ROW  // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
    ]


    FN_TABLE_SET_ROW_HEIGHT // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_TABLE_OPTIMAL_HEIGHT // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_TABLE_SPLIT_CELLS // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_TABLE_SPLIT_TABLE // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_TABLE_MERGE_TABLE // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_TABLE_UNSET_READ_ONLY_CELLS // status()
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
    ]

    SID_AUTOFORMAT // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SvxBoxItem BorderStyle SID_ATTR_BORDER // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetFrmBorderState ;
        GroupId = GID_TABLE;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_FRAME_LINESTYLE // status()
    [
        ExecMethod = ExecTableStyle ;
        StateMethod = GetLineStyleState ;
        Export = FALSE; //#44439#
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_FRAME_LINECOLOR // status(play)
    [
        ExecMethod = ExecTableStyle ;
        StateMethod = GetLineStyleState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_TABLE_MODE_FIX
    [
        ExecMethod = Execute;
        StateMethod = GetState;
    ]

    FN_TABLE_MODE_FIX_PROP
    [
        ExecMethod = Execute;
        StateMethod = GetState;
    ]

    FN_TABLE_MODE_VARIABLE
    [
        ExecMethod = Execute;
        StateMethod = GetState;
    ]

    FN_NUMBER_FORMAT
    [
        ExecMethod = ExecNumberFormat;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_NUMBER_STANDARD
    [
        ExecMethod = ExecNumberFormat;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_NUMBER_TWODEC
    [
        ExecMethod = ExecNumberFormat;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_NUMBER_SCIENTIFIC
    [
        ExecMethod = ExecNumberFormat;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_NUMBER_DATE
    [
        ExecMethod = ExecNumberFormat;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_NUMBER_TIME
    [
        ExecMethod = ExecNumberFormat;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_NUMBER_CURRENCY
    [
        ExecMethod = ExecNumberFormat;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_NUMBER_PERCENT
    [
        ExecMethod = ExecNumberFormat;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
// Slots ohne Export

    FN_INSERT_TABLE
    [
        Export = FALSE ;
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]


}
/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.20  2000/07/03 20:00:41  jp
    Bug #70403#: dont delete protected cells

    Revision 1.19  2000/05/26 07:06:15  os
    old SW Basic API Slots removed

    Revision 1.18  1999/03/23 11:15:24  MA
    #63806# ConfigName und HelpText entfernt


      Rev 1.17   23 Mar 1999 12:15:24   MA
   #63806# ConfigName und HelpText entfernt

      Rev 1.16   17 Feb 1999 21:11:06   JP
   Task #61764#: neu: Tabellen zusammenfassen

      Rev 1.15   12 Nov 1998 17:29:12   MA
   #58677# Disable Flag

      Rev 1.14   18 Mar 1998 19:43:52   MA
   State fuer Split

      Rev 1.13   25 Feb 1998 12:52:10   MA
   new: SplitTable

      Rev 1.12   08 Oct 1997 13:30:52   OS
   SID_FRAME_LINESTYLE funktioniert nicht ueber die API #44439#

      Rev 1.11   28 Aug 1997 12:50:02   MBA
   Neue Interface-Namen

      Rev 1.10   25 Jul 1997 11:29:00   AMA
   Opt: GroupId und ConfigName aufgeraeumt

      Rev 1.9   16 Jun 1997 17:38:24   MA
   fix: State fuer InsertRowDialog

      Rev 1.8   16 Jun 1997 09:25:22   MA
   #40610# State fuer InsertRow

      Rev 1.7   20 May 1997 21:30:22   JP
   neu: Tabellenformel uebers Basic setzen

      Rev 1.6   14 May 1997 10:56:52   JP
   neue Slots fuer die TabShell

      Rev 1.5   15 Mar 1997 21:04:56   JP
   neuer Slot fuer DB-Reports

      Rev 1.4   18 Feb 1997 16:57:16   OS
   AutoSum

      Rev 1.3   14 Feb 1997 18:10:00   OM
   Zahlenformat-Dlg

      Rev 1.2   13 Feb 1997 09:54:08   MA
   unnoetige und falsche Texte entfernt

      Rev 1.1   27 Jan 1997 16:38:18   OS
   Web-Slots aus den allg. interfaces raus

      Rev 1.0   23 Jan 1997 14:44:06   OS
   Initial revision.

------------------------------------------------------------------------*/

diff --git a/sw/sdi/_textsh.sdi b/sw/sdi/_textsh.sdi
new file mode 100644
index 0000000..ad52194
--- /dev/null
+++ b/sw/sdi/_textsh.sdi
@@ -0,0 +1,1262 @@
/*------------------------------------------------------------------------

    $Workfile:   _textsh.sdi  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/_textsh.sdi,v 1.1.1.1 2000-09-18 17:14:30 hr Exp $

    Beschreibung:   Basis-interfaces fuer Text

    (c) Copyright 1997 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/

interface BaseText : Selection
[
    Automation = FALSE;
]
{
    SID_INSERTDOC // status(final|play|rec)
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_INSERT_BOOKMARK // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_NUM_BULLET_MOVEDOWN // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_NUM_BULLET_MOVEUP // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_EDIT_FORMULA // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_INSERT_SYMBOL // status(final|play|rec)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_INSERT_PAGEHEADER    // status(final|play|rec)
    [
        StateMethod = GetState ;
        Export = FALSE;
    ]
    FN_INSERT_PAGEFOOTER    // status(final|play|rec)
    [
        StateMethod = GetState ;
        Export = FALSE;
    ]

     //--------------------------------------------------------------------------
    FN_INSERT_SOFT_HYPHEN // status(final|play)
    [
        ExecMethod = ExecInsert ;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_INSERT_HARDHYPHEN // status()
    [
        ExecMethod = ExecInsert ;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_INSERT_HARD_SPACE // status(final|play)
    [
        ExecMethod = ExecInsert ;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_INSERT_BREAK // status(final|play)
    [
        ExecMethod = ExecInsert ;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_INSERT_PAGEBREAK // status(final|play)
    [
        ExecMethod = ExecInsert ;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SfxVoidItem InsertLinebreak FN_INSERT_LINEBREAK ( )  // status(final|play)
    [
        ExecMethod = ExecInsert ;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_INSERT_COLUMN_BREAK // status(final|play)
    [
        ExecMethod = ExecInsert ;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_INSERT_BREAK_DLG // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_INSERT_GRAPHIC // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_INSERT_HRULER // status()
    [
        ExecMethod = ExecInsert ;
        StateMethod = StateInsert ;
    ]
    SID_INSERT_DIAGRAM // status(final|play)
    [
        ExecMethod = ExecInsert ;
        StateMethod = StateInsert ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_INSERT_SOUND
    [
        ExecMethod = ExecInsert ;
        StateMethod = StateInsert ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_INSERT_VIDEO
    [
        ExecMethod = ExecInsert ;
        StateMethod = StateInsert ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_INSERT_SMA // status(final|play)
    [
        ExecMethod = ExecInsert ;
        StateMethod = StateInsert ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_INSERT_SIM // status(final|play)
    [
        ExecMethod = ExecInsert ;
        StateMethod = StateInsert ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_INSERT_FLOATINGFRAME // status()
    [
        ExecMethod = ExecInsert ;
        StateMethod = StateInsert ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SfxVoidItem InsertObject SID_INSERT_OBJECT ( )  // status(final|play)
    [
        ExecMethod = ExecInsert ;
        StateMethod = StateInsert ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SfxVoidItem InsertPlugin SID_INSERT_PLUGIN ( )  // status(final|play)
    [
        ExecMethod = ExecInsert ;
        StateMethod = StateInsert ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SfxVoidItem InsertApplet SID_INSERT_APPLET ( )  // status(final|play)
    [
        ExecMethod = ExecInsert ;
        StateMethod = StateInsert ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_INSERT_TABLE // status(final|play)
    [
        ExecMethod = ExecInsert ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_HYPERLINK_SETLINK // status()
    [
        ExecMethod = ExecInsert ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_HYPERLINK_GETLINK // status()
    [
        StateMethod = StateInsert ;
    ]
    FN_INSERT_HYPERLINK // status()
    [
        ExecMethod = Execute ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_HYPERLINK_DIALOG
    [
        ExecMethod = Execute ;
        StateMethod = GetState;
    ]
    FN_EDIT_HYPERLINK
    [
        ExecMethod = Execute ;
        StateMethod = GetState;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_TABLE_UNSET_READ_ONLY // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_DELETE_SENT // status(final|play)
    [
        ExecMethod = ExecDelete ;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_DELETE_BACK_SENT // status(final|play)
    [
        ExecMethod = ExecDelete ;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_DELETE_WORD // status(final|play)
    [
        ExecMethod = ExecDelete ;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_DELETE_BACK_WORD // status(final|play)
    [
        ExecMethod = ExecDelete ;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SfxVoidItem DelToEndOfLine FN_DELETE_LINE ( )  // status(final|play)
    [
        ExecMethod = ExecDelete ;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_DELETE_BACK_LINE // status(final|play)
    [
        ExecMethod = ExecDelete ;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_DELETE_PARA // status(final|play)
    [
        ExecMethod = ExecDelete ;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_DELETE_BACK_PARA // status(final|play)
    [
        ExecMethod = ExecDelete ;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_DELETE_WHOLE_LINE // status(final|play)
    [
        ExecMethod = ExecDelete ;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_CHAR_LEFT // status(final|play)
    [
        ExecMethod = ExecBasicMove ;
        StateMethod = NoState ;
    ]
    FN_CHAR_RIGHT // status(final|play)
    [
        ExecMethod = ExecBasicMove ;
        StateMethod = NoState ;
    ]
    FN_LINE_UP // status(final|play)
    [
        ExecMethod = ExecBasicMove ;
        StateMethod = NoState ;
    ]
    FN_LINE_DOWN // status(final|play)
    [
        ExecMethod = ExecBasicMove ;
        StateMethod = NoState ;
    ]
    FN_SELECT_WORD // status(final|play)
    [
        ExecMethod = ExecMove ;
        StateMethod = NoState ;
    ]
    SID_SELECTALL // status(final|play)
    [
        ExecMethod = ExecMove ;
        StateMethod = NoState ;
    ]
     //
     // Goto - Methoden
     //
    FN_CNTNT_TO_NEXT_FRAME // status(final|play)
    [
        ExecMethod = ExecMoveMisc ;
        StateMethod = NoState ;
    ]
    FN_START_OF_COLUMN // status(final|play)
    [
        ExecMethod = ExecMoveCol ;
        StateMethod = NoState ;
    ]
    FN_END_OF_COLUMN // status(final|play)
    [
        ExecMethod = ExecMoveCol ;
        StateMethod = NoState ;
    ]
    FN_START_OF_NEXT_COLUMN // status(final|play)
    [
        ExecMethod = ExecMoveCol ;
        StateMethod = NoState ;
    ]
    FN_END_OF_NEXT_COLUMN // status(final|play)
    [
        ExecMethod = ExecMoveCol ;
        StateMethod = NoState ;
    ]
    FN_START_OF_PREV_COLUMN // status(final|play)
    [
        ExecMethod = ExecMoveCol ;
        StateMethod = NoState ;
    ]
    FN_END_OF_PREV_COLUMN // status(final|play)
    [
        ExecMethod = ExecMoveCol ;
        StateMethod = NoState ;
    ]
    FN_TO_HEADER // status(final|play)
    [
        ExecMethod = ExecMoveMisc ;
        StateMethod = NoState ;
    ]
    FN_TO_FOOTER // status(final|play)
    [
        ExecMethod = ExecMoveMisc ;
        StateMethod = NoState ;
    ]
    FN_PREV_TABLE // status(final|play)
    [
        ExecMethod = ExecMoveMisc ;
        StateMethod = NoState ;
    ]
    FN_NEXT_TABLE // status(final|play)
    [
        ExecMethod = ExecMoveMisc ;
        StateMethod = NoState ;
    ]
    FN_GOTO_PREV_REGION
    [
        ExecMethod = ExecMoveMisc ;
        StateMethod = NoState ;
    ]
    FN_GOTO_NEXT_REGION
    [
        ExecMethod = ExecMoveMisc ;
        StateMethod = NoState ;
    ]
    FN_NEXT_WORD // status(final|play)
    [
        ExecMethod = ExecMoveLingu ;
        StateMethod = NoState ;
    ]
    FN_START_OF_PARA // status(final|play)
    [
        ExecMethod = ExecMoveLingu ;
        StateMethod = NoState ;
    ]
    FN_END_OF_PARA // status(final|play)
    [
        ExecMethod = ExecMoveLingu ;
        StateMethod = NoState ;
    ]
    FN_PREV_PARA // status(final)
    [
        ExecMethod = ExecMoveLingu ;
        StateMethod = NoState ;
    ]
    FN_NEXT_PARA // status(final)
    [
        ExecMethod = ExecMoveLingu ;
        StateMethod = NoState ;
    ]
    FN_PREV_WORD // status(final|play)
    [
        ExecMethod = ExecMoveLingu ;
        StateMethod = NoState ;
    ]
    FN_NEXT_SENT // status(final|play)
    [
        ExecMethod = ExecMoveLingu ;
        StateMethod = NoState ;
    ]
    FN_PREV_SENT // status(final|play)
    [
        ExecMethod = ExecMoveLingu ;
        StateMethod = NoState ;
    ]
    FN_START_OF_NEXT_PAGE // status(final|play)
    [
        ExecMethod = ExecMovePage ;
        StateMethod = NoState ;
    ]
    FN_END_OF_NEXT_PAGE // status(final|play)
    [
        ExecMethod = ExecMovePage ;
        StateMethod = NoState ;
    ]
    FN_START_OF_PREV_PAGE // status(final|play)
    [
        ExecMethod = ExecMovePage ;
        StateMethod = NoState ;
    ]
    FN_END_OF_PREV_PAGE // status(final|play)
    [
        ExecMethod = ExecMovePage ;
        StateMethod = NoState ;
    ]
    FN_START_OF_PAGE // status(final|play)
    [
        ExecMethod = ExecMovePage ;
        StateMethod = NoState ;
    ]
    FN_END_OF_PAGE // status(final|play)
    [
        ExecMethod = ExecMovePage ;
        StateMethod = NoState ;
    ]
    FN_START_OF_LINE // status(final|play)
    [
        ExecMethod = ExecMove ;
        StateMethod = NoState ;
    ]
    FN_END_OF_LINE // status(final|play)
    [
        ExecMethod = ExecMove ;
        StateMethod = NoState ;
    ]
    FN_START_OF_DOCUMENT // status(final|play)
    [
        ExecMethod = ExecMove ;
        StateMethod = NoState ;
    ]
    FN_END_OF_DOCUMENT // status(final|play)
    [
        ExecMethod = ExecMove ;
        StateMethod = NoState ;
    ]
    FN_NEXT_TOXMARK  // status(final|play)
    [
        ExecMethod = ExecMoveMisc;
        StateMethod = NoState ;
    ]

    FN_PREV_TOXMARK  // status(final|play)
    [
        ExecMethod = ExecMoveMisc;
        StateMethod = NoState ;
    ]

    FN_NEXT_TBLFML  // status(final|play)
    [
        ExecMethod = ExecMoveMisc;
        StateMethod = NoState ;
    ]

    FN_PREV_TBLFML  // status(final|play)
    [
        ExecMethod = ExecMoveMisc;
        StateMethod = NoState ;
    ]

    FN_NEXT_TBLFML_ERR  // status(final|play)
    [
        ExecMethod = ExecMoveMisc;
        StateMethod = NoState ;
    ]

    FN_PREV_TBLFML_ERR  // status(final|play)
    [
        ExecMethod = ExecMoveMisc;
        StateMethod = NoState ;
    ]


     //
     // Get - Properties
     //
    FN_AUTOFORMAT_AUTO // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_AUTOFORMAT_APPLY // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_AUTOFORMAT_REDLINE_APPLY // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_AUTO_CORRECT // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SfxVoidItem SortDialog FN_SORTING_DLG ( )  // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SfxVoidItem ChapterNumberingDialog FN_NUMBERING_OUTLINE_DLG ( )  // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
    ]
    FN_CALCULATE // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_FORMAT_RESET // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_GOTO_REFERENCE // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
     //Parameter kann noch nicht aufgezeichnet werden
    FN_NUM_NUMBERING_ON // status(final|play)
    [
        ExecMethod = ExecEnterNum ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_NUMBER_BULLETS // status(final|play)
    [
        ExecMethod = ExecEnterNum ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_NUM_BULLET_ON // status(final|play)
    [
        ExecMethod = ExecEnterNum ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_INSERT_FRAME // status(final|play)
    [
        ExecMethod = ExecInsert ;
        StateMethod = StateInsert ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_FORMAT_COLUMN // status()
    [
        ExecMethod = ExecInsert ;
        StateMethod = StateInsert ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_SECTION_APPENDNODE // status()
    [
        ExecMethod = ExecInsert ;
        StateMethod = StateInsert ;
    ]
    FN_INSERT_FOOTNOTE // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    /*-----------------24.01.97 07.33-------------------
    Fussnoten - Befehle
--------------------------------------------------*/

    FN_INSERT_ENDNOTE // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_FORMAT_FOOTNOTE_DLG // status()
    [
        ExecMethod = Execute ;
    ]
    FN_FOOTNOTE_TO_ANCHOR // status(final|play)
    [
        ExecMethod = ExecMoveMisc ;
        StateMethod = NoState ;
    ]
    FN_NEXT_FOOTNOTE // status(final|play)
    [
        ExecMethod = ExecMoveMisc ;
        StateMethod = NoState ;
    ]
    FN_PREV_FOOTNOTE // status(final|play)
    [
        ExecMethod = ExecMoveMisc ;
        StateMethod = NoState ;
    ]

    FN_INSERT_FOOTNOTE_DLG // status(final|play|rec)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    /*-----------------24.01.97 07.34-------------------
    Ende Fussnoten
    --------------------------------------------------*/
    FN_INSERT_FIELD // status(final|play)
    [
        ExecMethod = ExecField ;
        StateMethod = StateField ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
        AutoUpdate ;
    ]
    FN_INSERT_REF_FIELD
    [
        ExecMethod = ExecField ;
        StateMethod = StateField ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
        AutoUpdate ;
    ]
    FN_INSERT_FIELD_CTRL
    [
        ExecMethod = ExecField ;
        StateMethod = StateField ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
        Export = FALSE ;
    ]
     //--------------------------------------------------------------------------
    FN_INSERT_FLD_PGNUMBER
    [
        ExecMethod = ExecField ;
        StateMethod = StateField ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
        ReadOnlyDoc = FALSE ;
    ]
    FN_INSERT_FLD_PGCOUNT
    [
        ExecMethod = ExecField ;
        StateMethod = StateField ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
        ReadOnlyDoc = FALSE ;
    ]

    FN_INSERT_FLD_TITLE
    [
        ExecMethod = ExecField ;
        StateMethod = StateField ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
        ReadOnlyDoc = FALSE ;
    ]
    FN_INSERT_FLD_DATE
    [
        ExecMethod = ExecField ;
        StateMethod = StateField ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
     //--------------------------------------------------------------------------
    FN_INSERT_FLD_TIME
    [
        ExecMethod = ExecField ;
        StateMethod = StateField ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
     //--------------------------------------------------------------------------
    FN_INSERT_FLD_AUTHOR
    [
        ExecMethod = ExecField ;
        StateMethod = StateField ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_GOTO_NEXT_INPUTFLD // status(final|play)
    [
        ExecMethod = ExecField ;
        StateMethod = NoState ;
    ]
    FN_GOTO_PREV_INPUTFLD // status(final|play)
    [
        ExecMethod = ExecField ;
        StateMethod = NoState ;
    ]
    FN_EXECUTE_MACROFIELD // status()
    [
        Export = FALSE ;
        ExecMethod = ExecField ;
        StateMethod = StateField ;
    ]
    FN_EDIT_FIELD // status(final|play)
    [
        ExecMethod = ExecField ;
        StateMethod = StateField ;
    ]
    FN_GLOSSARY_DLG // status()
    [
        ExecMethod = ExecGlossary ;
        StateMethod = GetState ;
    ]
    FN_EXPAND_GLOSSARY // status(final|play)
    [
        ExecMethod = ExecGlossary ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_POSTIT // status(final|play)
    [
        ExecMethod = ExecField ;
        StateMethod = StateField;
    ]
    FN_REDLINE_COMMENT // status(play)
    [
        ExecMethod = ExecField ;
        StateMethod = StateField ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR|SW_DISABLE_ON_MAILBOX_EDITOR";
    ]
    FN_JAVAEDIT // status(final|play)
    [
        ExecMethod = ExecField ;
        StateMethod = StateField;
    ]
     // Slots mit Export = FALSE
     //Slots ohne Export
    FN_CHAR_LEFT_SEL
    [
        ExecMethod = ExecBasicMove ;
        StateMethod = NoState ;
        Export = FALSE ;
    ]
    FN_CHAR_RIGHT_SEL
    [
        ExecMethod = ExecBasicMove ;
        StateMethod = NoState ;
        Export = FALSE ;
    ]
    FN_LINE_UP_SEL
    [
        ExecMethod = ExecBasicMove ;
        StateMethod = NoState ;
        Export = FALSE ;
    ]
    FN_LINE_DOWN_SEL
    [
        ExecMethod = ExecBasicMove;
        StateMethod = NoState ;
        Export = FALSE ;
    ]
    FN_START_OF_NEXT_PAGE_SEL
    [
        ExecMethod = ExecMovePage;
        StateMethod = NoState ;
        Export = FALSE ;
    ]
    FN_END_OF_NEXT_PAGE_SEL
    [
        ExecMethod = ExecMovePage ;
        StateMethod = NoState ;
        Export = FALSE ;
    ]
    FN_START_OF_PREV_PAGE_SEL
    [
        ExecMethod = ExecMovePage ;
        StateMethod = NoState ;
        Export = FALSE ;
    ]
    FN_END_OF_PREV_PAGE_SEL
    [
        ExecMethod = ExecMovePage ;
        StateMethod = NoState ;
        Export = FALSE ;
    ]
    FN_START_OF_PAGE_SEL
    [
        ExecMethod = ExecMovePage ;
        StateMethod = NoState ;
        Export = FALSE ;
    ]
    FN_END_OF_PAGE_SEL
    [
        ExecMethod = ExecMovePage ;
        StateMethod = NoState ;
        Export = FALSE ;
    ]
    FN_NEXT_WORD_SEL
    [
        ExecMethod = ExecMoveLingu ;
        StateMethod = NoState ;
        Export = FALSE ;
    ]
    FN_START_OF_PARA_SEL
    [
        ExecMethod = ExecMoveLingu ;
        StateMethod = NoState ;
        Export = FALSE ;
    ]
    FN_END_OF_PARA_SEL
    [
        ExecMethod = ExecMoveLingu ;
        StateMethod = NoState ;
        Export = FALSE ;
    ]
    FN_PREV_WORD_SEL
    [
        ExecMethod = ExecMoveLingu ;
        StateMethod = NoState ;
        Export = FALSE ;
    ]
    FN_NEXT_SENT_SEL
    [
        ExecMethod = ExecMoveLingu ;
        StateMethod = NoState ;
        Export = FALSE ;
    ]
    FN_START_OF_LINE_SEL
    [
        ExecMethod = ExecMove ;
        StateMethod = NoState ;
        Export = FALSE ;
    ]
    FN_END_OF_LINE_SEL
    [
        ExecMethod = ExecMove ;
        StateMethod = NoState ;
        Export = FALSE ;
    ]
    FN_START_OF_DOCUMENT_SEL
    [
        ExecMethod = ExecMove ;
        StateMethod = NoState ;
        Export = FALSE ;
    ]
    FN_END_OF_DOCUMENT_SEL
    [
        ExecMethod = ExecMove ;
        StateMethod = NoState ;
        Export = FALSE ;
    ]
    FN_PREV_SENT_SEL
    [
        ExecMethod = ExecMoveLingu ;
        StateMethod = NoState ;
        Export = FALSE ;
    ]
    FN_QRY_INSERT
    [
        ExecMethod = ExecDB ;
        StateMethod = NoState ;
        Export = FALSE ;
    ]
    FN_QRY_MERGE_FIELD
    [
        ExecMethod = ExecDB ;
        StateMethod = NoState ;
        Export = FALSE ;
    ]
    FN_QRY_INSERT_FIELD
    [
        ExecMethod = ExecDB ;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
        Export = FALSE ;
    ]
    SID_ATTR_PARA_ADJUST_LEFT
    [
        ExecMethod = ExecParaAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
        Export = FALSE ;
    ]
    SID_ATTR_PARA_ADJUST_RIGHT
    [
        ExecMethod = ExecParaAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
        Export = FALSE ;
    ]
    SID_ATTR_PARA_ADJUST_CENTER
    [
        ExecMethod = ExecParaAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
        Export = FALSE ;
    ]
    SID_ATTR_PARA_ADJUST_BLOCK
    [
        ExecMethod = ExecParaAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
        Export = FALSE ;
    ]
    SID_ATTR_PARA_LINESPACE_10
    [
        ExecMethod = ExecParaAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
        Export = FALSE ;
    ]
    SID_ATTR_PARA_LINESPACE_15
    [
        ExecMethod = ExecParaAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
        Export = FALSE ;
    ]
    SID_ATTR_PARA_LINESPACE_20
    [
        ExecMethod = ExecParaAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
        Export = FALSE ;
    ]
    SID_ATTR_PARA_ADJUST // status(final|play)
    [
         //          (0=links, 1=rechts, 2=block, 3=zentriert, )"
        ExecMethod = ExecParaAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_PARA_LINESPACE // status(final|play)
    [
         // SvxLineSpace        LineSpace       MID_LINESPACE;
         // UINT16              LineHeight      MID_HEIGHT;     // % or direct
         // SvxInterLineSpace   InterLineSpace  MID_INTER_LINESPACE;
         // INT16               InterSpace      MID_INTER_SPACE;
        ExecMethod = ExecParaAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_PARA_SPLIT // status(final|play)
    [
        ExecMethod = ExecCharButtonAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_PARA_KEEP // status(final|play)
    [
        ExecMethod = ExecCharButtonAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_PARA_WIDOWS // status(final|play)
    [
        ExecMethod = ExecCharButtonAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_PARA_ORPHANS // status(final|play)
    [
        ExecMethod = ExecCharButtonAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_PARA_PAGEBREAK // status(final|play)
    [
        ExecMethod = ExecParaAttrArgs ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_PARA_MODEL // status(final|play)
    [
        ExecMethod = ExecParaAttrArgs ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_PARA_DLG // status(final|play)
    [
        ExecMethod = Execute ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_SELECT_PARA // status(final|play)
    [
        ExecMethod = Execute ;
    ]
    SID_DEC_INDENT
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_INC_INDENT
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_DEC_INDENT_OFFSET
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_INC_INDENT_OFFSET
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_FORMAT_DROPCAPS // status(final|play)
    [
        ExecMethod = ExecParaAttrArgs ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_PARA_HYPHENZONE // status(final|play)
    [
        ExecMethod = ExecCharButtonAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_CHAR_FONT // status(final|play)
    [
        ExecMethod = ExecTxtCtrl ;
        StateMethod = GetTxtCtrlState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_CHAR_FONTHEIGHT // status(final|play)
    [
        ExecMethod = ExecTxtCtrl ;
        StateMethod = GetTxtCtrlState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_CHAR_COLOR_BACKGROUND // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_CHAR_COLOR_BACKGROUND_EXT // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_CHAR_COLOR_EXT // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_CHAR_COLOR2
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_CHAR_COLOR // status(final|play)
    [
        ExecMethod = ExecTxtCtrl ;
        StateMethod = GetTxtCtrlState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_CHAR_WEIGHT // status(final|play)
    [
        ExecMethod = ExecCharButtonAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_CHAR_POSTURE // status(final|play)
    [
        ExecMethod = ExecCharButtonAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_CHAR_UNDERLINE // status(final|play)
    [
        ExecMethod = ExecCharButtonAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_FLASH // status(final|play)
    [
        ExecMethod = ExecCharButtonAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_CHAR_STRIKEOUT // status(final|play)
    [
        ExecMethod = ExecCharButtonAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_UNDERLINE_DOUBLE // status(final|play)
    [
        ExecMethod = ExecCharAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_CHAR_CONTOUR // status(final|play)
    [
        ExecMethod = ExecCharButtonAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_CHAR_SHADOWED // status(final|play)
    [
        ExecMethod = ExecCharButtonAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_CHAR_AUTOKERN // // status(final|play)
    [
        ExecMethod = ExecCharButtonAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_CHAR_ESCAPEMENT // status(final|play)
    [
        ExecMethod = ExecCharButtonAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_SET_SUPER_SCRIPT
    [
        ExecMethod = ExecCharAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_SET_SUB_SCRIPT
    [
        ExecMethod = ExecCharAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_CHAR_CASEMAP // status(final|play)
    [
        ExecMethod = ExecCharButtonAttr ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_CHAR_LANGUAGE // status(final|play)
    [
        ExecMethod = ExecCharAttrArgs ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_CHAR_KERNING // status(final|play)
    [
        ExecMethod = ExecCharAttrArgs ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_CHAR_DLG // status(final|play)
    [
        ExecMethod = Execute ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_CHAR_WORDLINEMODE // status(final|play)
    [
        ExecMethod = ExecCharAttrArgs ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_GROW_FONT_SIZE // status(final|play)
    [
        ExecMethod = ExecCharAttrArgs ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_SHRINK_FONT_SIZE // status(final|play)
    [
        ExecMethod = ExecCharAttrArgs ;
        StateMethod = GetAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
}  //ende interface text


/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.76  2000/06/20 14:47:51  os
    #70060# less occurences of columns in HTML

    Revision 1.75  2000/06/20 11:47:28  os
    #76287# ExecuteMethod name corrected

    Revision 1.74  2000/05/26 07:06:16  os
    old SW Basic API Slots removed

    Revision 1.73  2000/05/10 12:00:08  os
    Basic API removed

    Revision 1.72  2000/02/22 14:49:18  os
    #72894# footnote option dialog in HTML documents

    Revision 1.71  2000/02/10 11:57:08  os
    #72894# fields pageno, pagecount, title and insert footnote enabled in SW/Web

    Revision 1.70  2000/01/06 07:34:05  os
    #71436# mail merge dialog: execute via status method disposed

    Revision 1.69  2000/01/03 08:35:56  os
    #71278# edit hyperlink slot

    Revision 1.68  1999/10/11 20:08:39  jp
    Bug #68496#: append paragraph behind a section

    Revision 1.67  1999/07/26 08:00:40  OS
    #58419# insert Sound and Vidoo


      Rev 1.66   26 Jul 1999 10:00:40   OS
   #58419# insert Sound and Vidoo

      Rev 1.65   23 Jun 1999 11:57:00   JP
   Bug #43028# disableflaf for edit in mailbody

      Rev 1.64   27 May 1999 13:20:14   OS
   Einf?gen/Bearbeiten von Spalten ueberarbeitet

      Rev 1.63   19 Apr 1999 13:43:44   OS
   #64780# Notizen und Scripts in geschuetzten Bereichen

      Rev 1.62   23 Mar 1999 12:16:30   MA
   #63806# ConfigName und HelpText entfernt

      Rev 1.61   01 Mar 1999 16:23:02   MA
   #62490# Altlast entfernt (Drucken und Briefumschlaege/Etiketten und Datenbank)

      Rev 1.60   29 Jan 1999 17:15:38   JP
   Task #58423#: Reports mit Bildern aus der Datenbank

      Rev 1.59   22 Jan 1999 11:54:32   JP
   Task #58677#: Crsr in Readonly Bereichen zulassen

      Rev 1.58   15 Jan 1999 15:47:14   JP
   Bug #60203#: MoveLeftMargin - optional um Betrag verschieben

      Rev 1.57   14 Jan 1999 15:47:20   JP
   Bug #60794#: Fehlererkennung beim Tabellenrechnen und anspringen von Formeln

      Rev 1.56   12 Nov 1998 17:28:50   MA
   #58677# Disable Flag

      Rev 1.55   21 Oct 1998 16:12:48   OM
   #58157# Querverweise einfuegen

------------------------------------------------------------------------*/

diff --git a/sw/sdi/_viewsh.sdi b/sw/sdi/_viewsh.sdi
new file mode 100644
index 0000000..2c05679
--- /dev/null
+++ b/sw/sdi/_viewsh.sdi
@@ -0,0 +1,683 @@
/*------------------------------------------------------------------------

    $Workfile:   _VIEWSH.SDI  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/_viewsh.sdi,v 1.1.1.1 2000-09-18 17:14:30 hr Exp $

    Beschreibung:   allgemeine interfaces fuer View

    (c) Copyright 1997 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/


interface BaseTextEditView : View
[
    Automation = FALSE;
]
{
    FN_REFRESH_VIEW // status(final|play)
    [
        ExecMethod = Execute ;
    ]
    FN_PAGEUP // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
    FN_PAGEUP_SEL // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
    SID_UNDO // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
    SID_CLEARHISTORY // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
    SID_CREATE_SW_DRAWVIEW
    [
        ExecMethod = Execute;
    ]
    FN_PAGEDOWN // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
    FN_PAGEDOWN_SEL // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
    FN_NAVIGATION_PI_GOTO_PAGE // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
    ]
    FN_SCROLL_NAVIGATION
    [
        ExecMethod = NoExec ;
        StateMethod = NoState ;
    ]
    FN_SCROLL_NEXT_PREV
    [
        ExecMethod = Execute;
    ]
    FN_SET_PAGE_STYLE // status(final|play)
    [
        ExecMethod = ExecColl ;
    ]
    SID_OBJECT_SELECT
    [
        ExecMethod = ExecDraw ;
        StateMethod = GetDrawState ;
    ]
    SID_SHOW_HIDDEN // status()
    [
        Export = FALSE ;
        ExecMethod = ExecDraw ;
    ]
    SID_SHOW_FORMS // status()
    [
        ExecMethod = ExecDraw ;
        StateMethod = GetDrawState ;
    ]
    FN_REDLINE_ON // status()
    [
        ExecMethod = Execute;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_MAILBOX_EDITOR";
    ]
    FN_REDLINE_SHOW // status()
    [
        ExecMethod = Execute;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_MAILBOX_EDITOR";
    ]
    FN_REDLINE_ACCEPT // status(play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_MAILBOX_EDITOR";
    ]
    SID_DOCUMENT_COMPARE // status(play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_MAILBOX_EDITOR";
    ]
    SID_DOCUMENT_MERGE // status(play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_MAILBOX_EDITOR";
    ]
    FN_ESCAPE // status(final|play|rec)
    [
        ExecMethod = Execute ;
    ]
    FN_FAX // status(final|play)
    [
        ExecMethod = ExecutePrint ;
    ]
    SID_PRINTDOC // status(final|play)
    [
        ExecMethod = ExecutePrint ;
        StateMethod = GetState ;
    ]
    SID_PRINTDOCDIRECT // status(final|play)
    [
        ExecMethod = ExecutePrint ;
        StateMethod = GetState ;
    ]
    SID_ATTR_LRSPACE
    [
        ExecMethod = ExecTabWin ;
        StateMethod = StateTabWin ;
        GroupId = GID_EDIT ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_ULSPACE
    [
        ExecMethod = ExecTabWin ;
        StateMethod = StateTabWin ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_LONG_LRSPACE // status()
    [
        ExecMethod = ExecTabWin ;
        StateMethod = StateTabWin ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_LONG_ULSPACE // status()
    [
        ExecMethod = ExecTabWin ;
        StateMethod = StateTabWin ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_PARA_LRSPACE // status()
    [
        ExecMethod = ExecTabWin ;
        StateMethod = StateTabWin ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_RULER_BORDERS // status()
    [
        ExecMethod = ExecTabWin ;
        StateMethod = StateTabWin ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_RULER_PAGE_POS // status()
    [
        ExecMethod = NoExec ;
        StateMethod = StateTabWin ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_RULER_LR_MIN_MAX // status()
    [
        StateMethod = StateTabWin ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_RULER_PROTECT // status()
    [
        StateMethod = StateTabWin ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_EDIT_LINK_DLG // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_LINE_NUMBERING_DLG // status()
    [
        ExecMethod = Execute;
    ]
    FN_UPDATE_TOX // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        MenuConfig , AccelConfig , ToolBoxConfig ;

    ]
    FN_UPDATE_CUR_TOX // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
    FN_EDIT_CURRENT_TOX // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
    SID_TWAIN_SELECT
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
    SID_TWAIN_TRANSFER
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
     //---------------------------------------------------------------------
     //Ab hier Statusleiste
    FN_STAT_PAGE // status()
    [
        ExecMethod = ExecuteStatusLine ;
        StateMethod = StateStatusLine ;
    ]
    FN_STAT_BOOKMARK // status()
    [
        ExecMethod = ExecuteStatusLine ;
    ]
    FN_STAT_HYPERLINKS // status()
    [
        ExecMethod = ExecuteStatusLine ;
        StateMethod = StateStatusLine ;
    ]
    FN_STAT_TEMPLATE // status(final|play)
    [
        ExecMethod = ExecuteStatusLine ;
        StateMethod = StateStatusLine ;
    ]
    FN_STAT_SELMODE // status(final|play)
    [
         //Aktueller Selektionsmode: 0 == Normal, 2 == Ergaenzen, 1 == Erweitern
        ExecMethod = ExecuteStatusLine ;
        StateMethod = StateStatusLine ;
    ]
    FN_SET_ADD_MODE // status()
    [
        ExecMethod = ExecuteStatusLine ;
        StateMethod = NoState ;
    ]
    FN_SET_EXT_MODE // status()
    [
        ExecMethod = ExecuteStatusLine ;
        StateMethod = NoState ;
    ]
    SID_ATTR_ZOOM // status(final|play)
    [
        ExecMethod = ExecuteStatusLine ;
        StateMethod = StateStatusLine ;
    ]
    SID_ATTR_INSERT // status(final|play|rec)
    [
        ExecMethod = ExecuteStatusLine ;
        StateMethod = StateStatusLine ;
    ]
    SID_ATTR_SIZE // status()
    [
        ExecMethod = ExecuteStatusLine ;
        StateMethod = StateStatusLine ;
    ]
    SID_ATTR_POSITION // status()
    [
        StateMethod = StateStatusLine ;
    ]
    SID_TABLE_CELL // status()
    [
        StateMethod = StateStatusLine ;
    ]
     //----------------------------------------------
     //End mit Statusleiste
     //----------------------------------------------
    SID_ATTR_BORDER_SHADOW // status()
    [
        ExecMethod = Execute ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    /****************************************************/
    /*                                                  */
    /*       Properties Seitenformat                    */
    /*                                                  */
    /****************************************************/
    SID_ATTR_PAGE // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
    SID_ATTR_PAGE_SIZE // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
    SID_ATTR_PAGE_MAXSIZE // status()
    [
        Export = FALSE ;
        ExecMethod = Execute ;
    ]
    SID_ATTR_PAGE_PAPERBIN // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
    FN_THESAURUS_DLG // status(final|play)
    [
        ExecMethod = ExecLingu ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_SPELLING_DLG // status(final|play)
    [
        ExecMethod = ExecLingu ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_ADD_UNKNOWN // status(final|play)
    [
        ExecMethod = ExecLingu ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    /*
    suchen und ersetzen
*/


    SID_SEARCH_ITEM // status()
    [
        ExecMethod = ExecSearch ;
        StateMethod = StateSearch ;
        Export = FALSE;
    ]
    FN_REPEAT_SEARCH // status(final|play)
    [
        ExecMethod = ExecSearch ;
    ]
    FID_SEARCH_NOW // status()
    [
        ExecMethod = ExecSearch ;
    ]
    SID_SEARCH_OPTIONS // status()
    [
        StateMethod = StateSearch ;
    ]
    FID_SEARCH_SEARCHSET // status()
    [
        ExecMethod = ExecSearch ;
    ]
    FID_SEARCH_REPLACESET // status()
    [
        ExecMethod = ExecSearch ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_TABSTOP // status()
    [
        ExecMethod = ExecTabWin ;
        StateMethod = StateTabWin ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    // ab hier Export = FALSE;
    FID_SEARCH_ON // status()
    [
        ExecMethod = ExecSearch ;
        Export = FALSE;
    ]
    FID_SEARCH_OFF // status()
    [
        ExecMethod = ExecSearch ;
        Export = FALSE;
    ]
    FN_INSERT_CTRL
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        Export = FALSE;
   ]

    SID_ATTR_DEFTABSTOP
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        Export = FALSE;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_LANGUAGE
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        Export = FALSE;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SfxVoidItem JumpToMark SID_JUMPTOMARK

    (
            SfxStringItem Bookmark SID_JUMPTOMARK
    ) // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
        FastCall , Cachable ;
    ]

    FN_SYNC_LABELS  // status(play)
    [
        ExecMethod = Execute ;
    ]
    SID_ATTR_BRUSH // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
}

interface GlobalContents : Collection
[   uuid = "1FD80520-F517-11d0-AC9B-008029E867C6"; ]
{
    UINT16  Type    FN_COLL_TYPE
    (
        UINT16  Position        FN_COLL_TYPE
    )
    [
    ]

    // Bereichsname, Index-Titel oder Leerstring
    String  Title FN_COLL_TITLE
    (
        UINT16  Position        FN_COLL_TITLE
    )
    [
    ]
    // ohne FileName wird ein TextBereich an der Position eingefuegt
    BOOL    InsertDocument  FN_COLL_ADD
    (
        UINT16  Position        FN_COLL_ADD,
        UINT16  FileName        FN_PARAM_1
    )
    [
    ]

}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.71  2000/05/29 14:33:20  os
    OfaDBMgr Basic methods removed

    Revision 1.70  2000/05/26 07:06:16  os
    old SW Basic API Slots removed

    Revision 1.69  2000/05/23 12:05:06  os
    SvxTabStopItem is back

    Revision 1.68  2000/05/10 12:00:08  os
    Basic API removed

    Revision 1.67  2000/01/21 13:33:27  tl
    #70503# GetState method added for FN_THESAURUS_DLG

    Revision 1.66  1999/09/10 08:51:39  jp
    LineNumberDialog: dont disable by protected cursor

    Revision 1.65  1999/06/23 09:57:02  JP
    Bug #43028# disableflaf for edit in mailbody


      Rev 1.64   23 Jun 1999 11:57:02   JP
   Bug #43028# disableflaf for edit in mailbody

      Rev 1.63   09 Jun 1999 12:32:02   OS
   #66578# new slot: FN_EDIT_CURENT_TOX

      Rev 1.62   23 Mar 1999 12:15:28   MA
   #63806# ConfigName und HelpText entfernt

      Rev 1.61   27 Jan 1999 13:40:36   JP
   Bug #59688#: bei GlobalDokumenten gibts kein vergeleichen oder zusammenfuehren

      Rev 1.60   18 Nov 1998 15:07:26   OM
   #59280# FormController Create Modes verlassen

      Rev 1.59   18 Nov 1998 12:58:26   OM
   #58385# DrawView ueber Slot anziehen

      Rev 1.58   12 Nov 1998 17:29:26   MA
   #58677# Disable Flag

      Rev 1.57   11 Jul 1998 12:28:56   MA
   chg: State fuer scrollbody

      Rev 1.56   01 Jul 1998 12:55:56   JP
   FN_DOCUMENT - Ids entfernt, werden vom SFX geliefert

      Rev 1.55   28 Jun 1998 12:49:32   MA
   Mail_Scrollbody

      Rev 1.54   12 Jun 1998 16:09:52   OM
   Gruppierung betreten/verlassen

      Rev 1.53   09 Jun 1998 15:37:06   OM
   VC-Controls entfernt

      Rev 1.52   16 Mar 1998 11:02:44   OM
   Labels: Statusmethode entfernt

      Rev 1.51   15 Mar 1998 14:10:48   OM
   Synchron-Button

      Rev 1.50   13 Mar 1998 08:32:26   OS
   SID_NEWWINDOW nicht mehr ueberladen

      Rev 1.49   04 Mar 1998 14:17:04   OM
   Dokument Merge/Compare

      Rev 1.48   03 Mar 1998 10:41:24   OM
   Redline-Browser

      Rev 1.47   26 Feb 1998 11:54:30   OM
   Redline accept/reject

      Rev 1.46   18 Feb 1998 18:54:58   OM
   Zeilennumerierung

      Rev 1.45   03 Feb 1998 15:26:28   OM
   Redlining

      Rev 1.44   10 Dec 1997 11:27:30   OS
   JumpToMark: Parameter heisst jetzt Bookmark wie im SFX

      Rev 1.43   18 Nov 1997 14:30:08   OM
   Sba-Umstellung 372

      Rev 1.42   10 Oct 1997 14:22:12   OS
   Search/ReplaceAttributes von Object abgeleitet

      Rev 1.41   03 Sep 1997 09:33:54   MBA
   OLEObjects in SVX

      Rev 1.40   02 Sep 1997 08:05:08   OS
   ParaKeepTogether und PageStyle aus den SearchAttributes entfernt #43032#
   FN_KILL_SELECTION entfernt #43143#

      Rev 1.39   28 Aug 1997 12:43:50   MBA
   Neue Interface-Namen

      Rev 1.38   15 Aug 1997 11:26:04   OM
   Draw- und Controlslots Bereichsumstellung

      Rev 1.37   28 Jul 1997 17:00:38   OM
   Basic: ExpandTableName

      Rev 1.36   25 Jul 1997 11:32:46   AMA
   Opt: GroupId und ConfigName aufgeraeumt

      Rev 1.35   23 Jul 1997 16:18:10   AMA
   Opt: ConfigName etc. aufgeraeumt

      Rev 1.34   18 Jul 1997 09:37:30   OM
   Fkts nicht exportieren

      Rev 1.33   14 Jul 1997 14:36:10   OS
   SearchItem nicht mehr exportiert, stattdessen SearchSettings auch in der SourceView

      Rev 1.32   14 Jul 1997 11:45:52   OM
   Basic: QuoteTableName

      Rev 1.31   07 Jul 1997 09:32:00   OS
   Collection fuer GlobalDoc

      Rev 1.30   27 Jun 1997 16:22:42   OM
   DB-Basic: DatabaseDelimiter

      Rev 1.29   27 Jun 1997 16:22:00   OS
   SID_JUMPTOMARK von der View an die BaseShell

      Rev 1.28   26 Jun 1997 13:30:16   AMA
   New: AddWord mit Window-Handle + Automatisches Aufnehmen unbekannter Woerter

      Rev 1.27   19 Jun 1997 11:41:48   OM
   Basic: IsTableReadonly, QuoteIdentifier

      Rev 1.26   17 Jun 1997 15:42:04   MA
   DrawTxtShell nicht von BaseShell ableiten + Opts

      Rev 1.25   22 Apr 1997 09:52:12   OS
   GroupCount und GroupObject an der ControlsCollection

      Rev 1.24   19 Apr 1997 09:30:02   OS
   Save in der SourceView reagiert >normal<

      Rev 1.23   15 Apr 1997 10:32:02   OM
   Neu: GetDatabaseLimits

      Rev 1.22   14 Apr 1997 16:05:14   OS
   neu: SearchAttributes und ReplaceAttributes

      Rev 1.21   25 Mar 1997 15:49:44   OS
   SourceView: Clipboard u. Undo-Redo ueber Slots

      Rev 1.20   21 Mar 1997 11:24:16   OM
   Neue DB-Basic Befehle

      Rev 1.19   11 Mar 1997 16:06:36   OS
   MN_TOOLBOX_SWITCH entfernt

      Rev 1.18   11 Mar 1997 07:51:06   OS
   Set/ResetLocks

      Rev 1.17   23 Feb 1997 22:17:18   OM
   Feld-Controller an Textshell verschoben

      Rev 1.16   23 Feb 1997 15:20:06   OM
   UpdateWholeRecord

      Rev 1.15   23 Feb 1997 14:34:24   OM
   Neuer Datenbankslot

      Rev 1.14   22 Feb 1997 20:29:22   OM
   FormatColumnValue

      Rev 1.13   21 Feb 1997 18:44:16   OM
   GetSubType

      Rev 1.12   21 Feb 1997 17:47:06   OS
   FN_SCROLL_NEXT_PREV

      Rev 1.11   20 Feb 1997 16:52:32   OM
   Neuer Datenbankslot

      Rev 1.10   19 Feb 1997 16:50:38   OM
   GetTableColumns

      Rev 1.9   19 Feb 1997 16:10:58   OS
   Slot fuer Navigationscontroller

      Rev 1.8   17 Feb 1997 17:06:32   OM
   Neue Datenbankslots

      Rev 1.7   17 Feb 1997 17:04:46   OM
   Neue Datenbankslots

      Rev 1.6   16 Feb 1997 15:23:40   OM
   DB-Manager an Ofa verschoben

      Rev 1.5   15 Feb 1997 15:25:00   OM
   Field-Controller nochmal eingetragen

      Rev 1.4   13 Feb 1997 09:54:08   MA
   unnoetige und falsche Texte entfernt

      Rev 1.3   06 Feb 1997 14:33:38   OM
   Popup-Controller fuer Feldbefehle einfuegen

      Rev 1.2   28 Jan 1997 16:36:58   OS
   DrawSelect nicht im WebWriter

      Rev 1.1   27 Jan 1997 16:37:46   OS
   Web-Slots aus den allg. interfaces raus

      Rev 1.0   23 Jan 1997 08:14:36   OS
   Initial revision.

------------------------------------------------------------------------*/

diff --git a/sw/sdi/basesh.sdi b/sw/sdi/basesh.sdi
new file mode 100644
index 0000000..d11b170
--- /dev/null
+++ b/sw/sdi/basesh.sdi
@@ -0,0 +1,111 @@
/*-----------------------------------------------------------------------

    $Workfile:   BASESH.SDI  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/basesh.sdi,v 1.1.1.1 2000-09-18 17:14:30 hr Exp $

    Beschreibung:   IDL - File SwBaseShell fuer Sw3

    (c) Copyright 1989 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/

interface TextSelection : BaseTextSelection
[
    uuid = "F23BA0A8-73A0-11d0-89CA-008029E4B0B1"
]
{
    // hier sollen die Slots eingefuegt werden, die vom StarWriter/WEB
    // nicht unterstuetzt werden

    FN_TOOL_ANKER_PAGE
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_CONTOUR_DLG
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_CONTOUR_EXEC
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

}  // end interface Base


shell SwBaseShell
{
        import TextSelection[Automation];
}
/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.119  2000/05/10 12:00:09  os
    Basic API removed

    Revision 1.118  1999/01/19 13:58:20  OS
    #60964# UniqueId fuer TextSelection - BaseShell kann eigenstaendig auftreten


      Rev 1.117   19 Jan 1999 14:58:20   OS
   #60964# UniqueId fuer TextSelection - BaseShell kann eigenstaendig auftreten

      Rev 1.116   12 Nov 1998 17:29:06   MA
   #58677# Disable Flag

      Rev 1.115   28 Aug 1997 12:51:52   MBA
   Neue Interface-Namen

      Rev 1.114   13 Feb 1997 12:45:08   MA
   unnoetige Texte entfernt

      Rev 1.113   12 Feb 1997 12:09:02   MA
   Kontur bearbeiten

      Rev 1.112   27 Jan 1997 16:37:42   OS
   Web-Slots aus den allg. interfaces raus

      Rev 1.111   23 Jan 1997 08:35:44   OS
   Ableitung von _Base

      Rev 1.110   21 Jan 1997 08:22:16   OS
   unpassende Slots aus interface Interior herausgeschoben

      Rev 1.109   18 Dec 1996 12:15:28   OM
   Slot fuer Konturumfluss im Draw-Menue

      Rev 1.108   29 Nov 1996 15:55:32   OS
   FN_TOOL_ANKER in der BaseShell

      Rev 1.107   28 Nov 1996 18:36:24   OS
   AccelConfig nachgetragen

      Rev 1.106   14 Nov 1996 08:06:54   SWG
   _TEMPLATE_ -> _STYLE_

      Rev 1.105   07 Nov 1996 16:17:52   OS
   Wrap- und Anker-Methoden an die BaseShell

      Rev 1.104   26 Sep 1996 19:14:00   OS
   Statusmethode fuer FNINSERT_REGION

      Rev 1.103   21 Sep 1996 17:36:22   OS
   Sot-Umstellung beendet

      Rev 1.102   19 Sep 1996 11:29:48   OM
   Kommentar geaendert

      Rev 1.101   18 Sep 1996 19:06:10   OS
   Para/Char/-Style wird wieder exportiert

------------------------------------------------------------------------*/

diff --git a/sw/sdi/beziersh.sdi b/sw/sdi/beziersh.sdi
new file mode 100644
index 0000000..af73ae6
--- /dev/null
+++ b/sw/sdi/beziersh.sdi
@@ -0,0 +1,155 @@
/*------------------------------------------------------------------------

    $Workfile:   beziersh.sdi  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/beziersh.sdi,v 1.1.1.1 2000-09-18 17:14:30 hr Exp $

    Beschreibung:   IDL - File SwBezierShell fuer Sw4

    (c) Copyright 1989 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/

interface TextBezier : TextSelection
[
    uuid = "68EF7EA0-6876-11D0-A887-008029E86826" ]
{
    SID_DELETE
    [
        ExecMethod = Execute ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_BACKSPACE
    [
        ExecMethod = Execute ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_ESCAPE // api:
    [
        ExecMethod = Execute;
    ]

    SID_BEZIER_MOVE
    [
        Export = FALSE;
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_BEZIER_INSERT
    [
        Export = FALSE;
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_BEZIER_DELETE
    [
        Export = FALSE;
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_BEZIER_CUTLINE
    [
        Export = FALSE;
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_BEZIER_CONVERT
    [
        Export = FALSE;
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_BEZIER_EDGE
    [
        Export = FALSE;
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_BEZIER_SMOOTH
    [
        Export = FALSE;
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_BEZIER_SYMMTR
    [
        Export = FALSE;
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_BEZIER_CLOSE
    [
        Export = FALSE;
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_BEZIER_ELIMINATE_POINTS
    [
        Export = FALSE;
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
}

shell SwBezierShell: SwBaseShell
{
    import TextBezier[Automation];
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.9  1998/11/12 16:28:52  MA
    #58677# Disable Flag


      Rev 1.8   12 Nov 1998 17:28:52   MA
   #58677# Disable Flag

      Rev 1.7   11 Jul 1998 12:47:56   OM
   #51754# BezierShell ist von SwBaseShell abgeleitet

      Rev 1.6   08 Sep 1997 12:54:08   MBA
   Bezier von DrawBase abgeleitet

      Rev 1.5   28 Aug 1997 12:52:06   MBA
   Neue Interface-Namen

      Rev 1.4   13 Feb 1997 12:44:42   MA
   unnoetige Texte entfernt

      Rev 1.3   23 Jan 1997 14:33:24   OS
   Ableitung von _Bezier

      Rev 1.2   16 Jan 1997 16:50:34   OM
   Escape an Bezier-Shell

      Rev 1.1   13 Jan 1997 16:01:42   OM
   Bezier-Punkte loeschen

      Rev 1.0   08 Jan 1997 12:40:12   OM
   Initial revision.

------------------------------------------------------------------------*/

diff --git a/sw/sdi/docsh.sdi b/sw/sdi/docsh.sdi
new file mode 100644
index 0000000..dcc79c6
--- /dev/null
+++ b/sw/sdi/docsh.sdi
@@ -0,0 +1,142 @@
/*------------------------------------------------------------------------

    $Workfile:   docsh.sdi  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/docsh.sdi,v 1.1.1.1 2000-09-18 17:14:30 hr Exp $

    Beschreibung:   IDL - File DocShell fuer Sw3

    (c) Copyright 1995 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/

interface TextDocument : BaseTextDocument
[
    uuid = "0D960120-111C-101D-9757-6E74207A7520"
]
{
    // Slots, die nicht in der WebDocShell gebraucht werden

    FN_OUTLINE_TO_IMPRESS
    [
        ExecMethod = Execute;
        StateMethod = GetState;
    ]

    FN_OUTLINE_TO_CLIPBOARD
    [
        ExecMethod = Execute;
        StateMethod = GetState;
    ]
    FN_ABSTRACT_STARIMPRESS
    [
        ExecMethod = Execute;
        StateMethod = GetState;
    ]
    FN_ABSTRACT_NEWDOC
    [
        ExecMethod = Execute;
        StateMethod = GetState;
    ]
    FN_NEW_GLOBAL_DOC
    [
        ExecMethod = Execute;
        StateMethod = GetState;
    ]
    FN_NEW_HTML_DOC
    [
        ExecMethod = Execute;
        StateMethod = GetState;
    ]

    SID_BROWSER_MODE
    [
        ExecMethod = Execute;
        StateMethod = GetState;
    ]
}

shell SwDocShell : SfxObjectShell
{
    import TextDocument[Automation];
}

shell SwGlosDocShell : SwDocShell
{
    import TextDocument[Automation];

    SID_SAVEDOC  // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
}
/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.87  1999/03/23 11:16:28  MA
    #63806# ConfigName und HelpText entfernt


      Rev 1.86   23 Mar 1999 12:16:28   MA
   #63806# ConfigName und HelpText entfernt

      Rev 1.85   24 Apr 1998 15:03:12   OM
   Seitenvorschau auch im Html-Mode

      Rev 1.84   17 Mar 1998 15:41:28   JP
   neu: NewHTMLDoc - aequivalent zum NewGlobalDoc

      Rev 1.83   28 Aug 1997 12:50:12   MBA
   Neue Interface-Namen

      Rev 1.82   25 Jul 1997 11:28:26   AMA
   Opt: GroupId und ConfigName aufgeraeumt

      Rev 1.81   27 Jun 1997 13:38:06   OM
   Globaldokument erzeugen

      Rev 1.80   16 Jun 1997 13:08:16   MA
   #40731# falsches Exportverbot entfernt

      Rev 1.79   09 Jun 1997 14:27:08   MA
   chg: Browse-Flag nur noch am Doc

      Rev 1.78   26 Mar 1997 11:32:04   OS
   GlosDocShell muss Document importieren

      Rev 1.77   22 Feb 1997 15:14:04   OS
   Abstract erzeugen

      Rev 1.76   16 Feb 1997 15:19:52   MA
   new: OutlineToClipboard und OutlineToImpress

      Rev 1.75   13 Feb 1997 12:45:04   MA
   unnoetige Texte entfernt

      Rev 1.74   23 Jan 1997 08:36:26   OS
   Ableitung von __Document

      Rev 1.73   10 Dec 1996 16:51:42   OS
   neu: SID_GET_COLORTABLE

      Rev 1.72   14 Nov 1996 19:11:10   OS
   SID_TEMPLATE_LOAD wieder aktiviert

      Rev 1.71   14 Nov 1996 08:06:48   SWG
   _TEMPLATE_ -> _STYLE_

      Rev 1.70   08 Oct 1996 16:45:04   OS
   neu: Sourceview

      Rev 1.69   01 Oct 1996 13:03:14   AMA
   Fix: SID_TEMPLATE_DELETE wieder aktiviert.

      Rev 1.68   21 Sep 1996 17:35:38   OS
   Sot-Umstellung beendet

      Rev 1.67   18 Sep 1996 17:36:56   OS
   LoadStyles wieder vollstaendig

------------------------------------------------------------------------*/

diff --git a/sw/sdi/drawsh.sdi b/sw/sdi/drawsh.sdi
new file mode 100644
index 0000000..b994998
--- /dev/null
+++ b/sw/sdi/drawsh.sdi
@@ -0,0 +1,317 @@
interface TextDraw : TextDrawBase
[
    uuid = "626DE480-111A-101D-9757-6E74207A7520"
]
{
    SID_ATTR_LINEEND_STYLE
    [
        SlotType = SfxBoolItem ;
        ExecMethod = ExecDrawAttrArgs ;
        StateMethod = DisableState ;
        Export = FALSE;
    ]

    SID_ATTR_LINE_STYLE
    [
        Export = FALSE;
        ExecMethod = ExecDrawAttrArgs ;
        StateMethod = GetDrawAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_ATTR_LINE_DASH
    [
        ExecMethod = ExecDrawAttrArgs ;
        StateMethod = GetDrawAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_ATTR_LINE_WIDTH
    [
        ExecMethod = ExecDrawAttrArgs ;
        StateMethod = GetDrawAttrState ;
        Export = FALSE;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_ATTR_LINE_COLOR
    [
        Export = FALSE;
        ExecMethod = ExecDrawAttrArgs ;
        StateMethod = GetDrawAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_ATTR_FILL_STYLE
    [
        Export = FALSE;
        ExecMethod = ExecDrawAttrArgs ;
        StateMethod = GetDrawAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_ATTR_FILL_COLOR
    [
        Export = FALSE;
        ExecMethod = ExecDrawAttrArgs ;
        StateMethod = GetDrawAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_ATTR_FILL_GRADIENT
    [
        Export = FALSE;
        ExecMethod = ExecDrawAttrArgs ;
        StateMethod = GetDrawAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_ATTR_FILL_HATCH
    [
        Export = FALSE;
        ExecMethod = ExecDrawAttrArgs ;
        StateMethod = GetDrawAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_ATTR_FILL_BITMAP
    [
        Export = FALSE;
        ExecMethod = ExecDrawAttrArgs ;
        StateMethod = GetDrawAttrState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_ATTRIBUTES_LINE
    [
        ExecMethod = ExecDrawDlg ;
        StateMethod = DisableState ;
    ]

    SID_ATTRIBUTES_AREA
    [
        ExecMethod = ExecDrawDlg ;
        StateMethod = DisableState ;
    ]

    FN_DRAWTEXT_ATTR_DLG
    [
        ExecMethod = ExecDrawDlg ;
        StateMethod = DisableState ;
    ]

    FN_TOOL_HMIRROR
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_TOOL_VMIRROR
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_OBJECT_ROTATE
    [
        Export = FALSE;
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_BEZIER_EDIT
    [
        Export = FALSE;
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_FONTWORK
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_OBJECT_HELL
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_OBJECT_HEAVEN
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_TOOL_HIERARCHIE
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
}

shell SwDrawShell : SwDrawBaseShell
{
        import TextDraw [Automation];

     // no export

    SID_FORMTEXT_STYLE
    [
        ExecMethod = ExecFormText ;
        StateMethod = GetFormTextState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]


    SID_FORMTEXT_ADJUST
    [
        ExecMethod = ExecFormText ;
        StateMethod = GetFormTextState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]


    SID_FORMTEXT_DISTANCE
    [
        ExecMethod = ExecFormText ;
        StateMethod = GetFormTextState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]


    SID_FORMTEXT_START
    [
        ExecMethod = ExecFormText ;
        StateMethod = GetFormTextState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_FORMTEXT_MIRROR
    [
        ExecMethod = ExecFormText ;
        StateMethod = GetFormTextState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]


    SID_FORMTEXT_HIDEFORM
    [
        ExecMethod = ExecFormText ;
        StateMethod = GetFormTextState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_FORMTEXT_OUTLINE
    [
        ExecMethod = ExecFormText ;
        StateMethod = GetFormTextState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_FORMTEXT_SHDWXVAL
    [
        ExecMethod = ExecFormText ;
        StateMethod = GetFormTextState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_FORMTEXT_SHADOW
    [
        ExecMethod = ExecFormText ;
        StateMethod = GetFormTextState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_FORMTEXT_SHDWCOLOR
    [
        ExecMethod = ExecFormText ;
        StateMethod = GetFormTextState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_FORMTEXT_SHDWYVAL
    [
        ExecMethod = ExecFormText ;
        StateMethod = GetFormTextState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_FORMTEXT_STDFORM
    [
        ExecMethod = ExecFormText ;
        StateMethod = GetFormTextState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.77  1999/05/07 12:57:58  JP
    Bug #66007#: LineEndStyle wieder mit einer Execute-Methode


      Rev 1.76   07 May 1999 14:57:58   JP
   Bug #66007#: LineEndStyle wieder mit einer Execute-Methode

      Rev 1.75   12 Nov 1998 17:28:38   MA
   #58677# Disable Flag

      Rev 1.74   10 Jun 1998 11:20:44   OM
   Hell/Heaven nicht in FormShell

      Rev 1.73   28 Aug 1997 12:39:08   MBA
   Neue Interface-Namen

      Rev 1.72   18 Jul 1997 09:37:22   OM
   Fkts nicht exportieren

      Rev 1.71   16 Jul 1997 16:47:26   OM
   Einige Basic-Fkts nicht exportieren

      Rev 1.70   13 Feb 1997 12:44:48   MA
   unnoetige Texte entfernt

      Rev 1.69   23 Jan 1997 10:49:22   OM
   Neue Shells: Control- und DrawBaseShell

      Rev 1.68   22 Jan 1997 11:18:24   OM
   Neue Shells: DrawBaseShell und DrawControlShell

      Rev 1.67   13 Jan 1997 16:01:42   OM
   Bezier-Punkte loeschen

      Rev 1.66   08 Jan 1997 12:40:30   OM
   Slots in Bezier-Shell verschoben

      Rev 1.65   13 Dec 1996 12:24:30   OM
   Slots fuer Bezier-Fkts

      Rev 1.64   11 Dec 1996 12:03:46   OM
   Bezier-Controller

      Rev 1.63   29 Nov 1996 15:55:34   OS
   FN_TOOL_ANKER in der BaseShell

      Rev 1.62   18 Nov 1996 13:39:20   MA
   chg: State fuer align

      Rev 1.61   14 Nov 1996 08:06:50   SWG
   _TEMPLATE_ -> _STYLE_

      Rev 1.60   07 Nov 1996 16:17:22   OS
   Anker-Methoden an die BaseShell

------------------------------------------------------------------------*/


diff --git a/sw/sdi/drwbassh.sdi b/sw/sdi/drwbassh.sdi
new file mode 100644
index 0000000..433db34
--- /dev/null
+++ b/sw/sdi/drwbassh.sdi
@@ -0,0 +1,60 @@
/*-----------------------------------------------------------------------

    $Workfile:   drwbassh.sdi  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/drwbassh.sdi,v 1.1.1.1 2000-09-18 17:14:30 hr Exp $

    Beschreibung:   IDL - File SwDrawBaseShell

    (c) Copyright 1989 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/

interface TextDrawBase : BaseTextDrawBase
[
    Automation = FALSE;
]
{
    import TextSelection;
}

shell SwDrawBaseShell: SwBaseShell
{
        import TextDrawBase[Automation];

    SID_OBJECT_ALIGN
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.6  1998/11/12 16:28:34  MA
    #58677# Disable Flag


      Rev 1.5   12 Nov 1998 17:28:34   MA
   #58677# Disable Flag

      Rev 1.4   28 Aug 1997 12:56:24   MBA
   Neue Interface-Namen

      Rev 1.3   13 Feb 1997 12:44:46   MA
   unnoetige Texte entfernt

      Rev 1.2   23 Jan 1997 14:39:02   OS
   Ableitung von _DrawBase

      Rev 1.1   23 Jan 1997 10:49:24   OM
   Neue Shells: Control- und DrawBaseShell

      Rev 1.0   22 Jan 1997 11:18:06   OM
   Initial revision.

------------------------------------------------------------------------*/


diff --git a/sw/sdi/drwtxtsh.sdi b/sw/sdi/drwtxtsh.sdi
new file mode 100644
index 0000000..523b30b
--- /dev/null
+++ b/sw/sdi/drwtxtsh.sdi
@@ -0,0 +1,452 @@
/*------------------------------------------------------------------------

    $Workfile:   drwtxtsh.sdi  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/drwtxtsh.sdi,v 1.1.1.1 2000-09-18 17:14:30 hr Exp $

    Beschreibung:   IDL - File DrawTextshell fuer Sw3

    (c) Copyright 1989 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/

interface TextDrawText : Selection
[
    uuid = "CA0C4280-293D-11D1-89CB-008029E4B0B1"
]
{
    SID_SELECTALL  // api:
    [
        ExecMethod = ExecDraw ;
        StateMethod = NoState ;
    ]

    SfxVoidItem Cut SID_CUT ( )  // api:
    [
        ExecMethod = ExecClpbrd ;
        StateMethod = StateClpbrd ;
        Volatile ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_COPY // api:
    [
        ExecMethod = ExecClpbrd ;
        StateMethod = StateClpbrd ;
        Volatile ;
    ]

    SID_PASTE   // api:
    [
        ExecMethod = ExecClpbrd ;
        StateMethod = StateClpbrd ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_PASTESPECIAL  // api:
    [
        StateMethod = StateClpbrd ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_ESCAPE // api:
    [
        ExecMethod = ExecDraw ;
    ]

    SID_UNDO // api:
    [
        ExecMethod = ExecUndo ;
        StateMethod = StateUndo ;

        ToolBoxConfig , MenuConfig , AccelConfig , PlugComm ;
    ]

    SID_REDO // api:
    [
        ExecMethod = ExecUndo ;
        StateMethod = StateUndo ;
    ]

    SID_REPEAT // api:
    [
        ExecMethod = ExecUndo ;
        StateMethod = StateUndo ;
    ]

    FN_FORMAT_RESET  // api:
    [
        ExecMethod = ExecDraw ;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_INSERT_SYMBOL // api:
    [
        ExecMethod = ExecDraw ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]


    SID_ATTR_CHAR_WEIGHT // api:
    [
        ExecMethod = Execute ;
        StateMethod = GetDrawTxtCtrlState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_ATTR_CHAR_POSTURE // api:
    [
        ExecMethod = Execute ;
        StateMethod = GetDrawTxtCtrlState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_ATTR_CHAR_UNDERLINE // api:
    [
        ExecMethod = Execute ;
        StateMethod = GetDrawTxtCtrlState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_ATTR_CHAR_CONTOUR
    [
        ExecMethod = Execute ;
        StateMethod = GetDrawTxtCtrlState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_ATTR_CHAR_SHADOWED
    [
        ExecMethod = Execute ;
        StateMethod = GetDrawTxtCtrlState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_ATTR_CHAR_STRIKEOUT
    [
        ExecMethod = Execute ;
        StateMethod = GetDrawTxtCtrlState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_ATTR_PARA_ADJUST_LEFT // api:
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_ATTR_PARA_ADJUST_CENTER // api:
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_ATTR_PARA_ADJUST_RIGHT // api:
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_ATTR_PARA_ADJUST_BLOCK // api:
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_ATTR_PARA_LINESPACE_10 // api:
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_ATTR_PARA_LINESPACE_15 // api:
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_ATTR_PARA_LINESPACE_20 // api:
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_CHAR_DLG  // api:
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_PARA_DLG // api:
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_SET_SUPER_SCRIPT
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_SET_SUB_SCRIPT
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_FONTWORK  // api:
    [
        ExecMethod = ExecFontWork ;
        StateMethod = StateFontWork ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]


    SID_FORMTEXT_STYLE // api:
    [
        ExecMethod = ExecFormText ;
        StateMethod = GetFormTextState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_FORMTEXT_ADJUST  // api:
    [
        ExecMethod = ExecFormText ;
        StateMethod = GetFormTextState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_FORMTEXT_DISTANCE // api:
    [
        ExecMethod = ExecFormText ;
        StateMethod = GetFormTextState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_FORMTEXT_START  // api:
    [
        ExecMethod = ExecFormText ;
        StateMethod = GetFormTextState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]


    SID_FORMTEXT_MIRROR // api:
    [
        ExecMethod = ExecFormText ;
        StateMethod = GetFormTextState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]


    SID_FORMTEXT_HIDEFORM   // api:
    [
        ExecMethod = ExecFormText ;
        StateMethod = GetFormTextState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_FORMTEXT_OUTLINE // api:
    [
        ExecMethod = ExecFormText ;
        StateMethod = GetFormTextState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_FORMTEXT_SHADOW  // api:
    [
        ExecMethod = ExecFormText ;
        StateMethod = GetFormTextState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_FORMTEXT_SHDWCOLOR // api:
    [
        ExecMethod = ExecFormText ;
        StateMethod = GetFormTextState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_FORMTEXT_SHDWXVAL  // api:
    [
        ExecMethod = ExecFormText ;
        StateMethod = GetFormTextState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_FORMTEXT_SHDWYVAL  // api:
    [
        ExecMethod = ExecFormText ;
        StateMethod = GetFormTextState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_FORMTEXT_STDFORM // api:
    [
        ExecMethod = ExecFormText ;
        StateMethod = GetFormTextState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_THESAURUS_DLG // api:
    [
        ExecMethod = ExecDrawLingu ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_SPELLING_DLG  // api:
    [
        ExecMethod = ExecDrawLingu ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_DRAWTEXT_ATTR_DLG
    [
        ExecMethod = ExecDraw ;
        StateMethod = NoState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_STYLE_CATALOG  // ole(no) api(play/rec)
    [
        StateMethod = StateDisableItems ;
    ]

    SID_AUTOSPELL_CHECK
    [
        ExecMethod = Execute;
        StateMethod = GetDrawTxtCtrlState
    ]

    SID_AUTOSPELL_MARKOFF
    [
        ExecMethod = Execute;
        StateMethod = GetDrawTxtCtrlState
    ]

    SID_SEARCH_DLG
    [
        StateMethod = StateDisableItems
    ]

    SID_HYPERLINK_SETLINK  // status()
    [
        ExecMethod = Execute ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_HYPERLINK_GETLINK // status()
    [
        StateMethod = StateInsert ;
    ]
}

interface TextDrawFont : Object
[ uuid = "074C35E0-11EF-101D-9757-6E74207A7520"; ]
{
    SID_ATTR_CHAR_FONT // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetDrawTxtCtrlState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_ATTR_CHAR_FONTHEIGHT // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetDrawTxtCtrlState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_ATTR_CHAR_COLOR // api:
    [
        ExecMethod = Execute ;
        StateMethod = GetDrawTxtCtrlState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]


}



shell SwDrawTextShell
{
        import TextDrawText[Automation];
        import TextDrawFont ".DrawFont";
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.72  2000/05/26 07:06:16  os
    old SW Basic API Slots removed

    Revision 1.71  2000/05/10 12:00:09  os
    Basic API removed

    Revision 1.70  2000/01/21 13:33:54  tl
    #70503# GetState method added for FN_THESAURUS_DLG

    Revision 1.69  1999/03/23 11:16:26  MA
    #63806# ConfigName und HelpText entfernt


      Rev 1.68   23 Mar 1999 12:16:26   MA
   #63806# ConfigName und HelpText entfernt

      Rev 1.67   12 Nov 1998 17:28:36   MA
   #58677# Disable Flag

      Rev 1.66   17 Sep 1997 13:09:54   OM
   Editierbare Links in DrawText-Objekten

      Rev 1.65   09 Sep 1997 18:04:54   MBA
   DrawTextShell war nicht exportiert

      Rev 1.64   28 Aug 1997 12:53:42   MBA
   Neue Interface-Namen

      Rev 1.63   19 Jun 1997 13:54:18   OS
   doppelten DrawText vermieden

      Rev 1.62   17 Jun 1997 15:42:06   MA
   DrawTxtShell nicht von BaseShell ableiten + Opts

      Rev 1.61   13 Feb 1997 12:44:48   MA
   unnoetige Texte entfernt

      Rev 1.60   23 Jan 1997 14:32:28   OS
   Ableitung von _DrawText

      Rev 1.59   13 Dec 1996 16:37:54   OS
   Autospell fuer aktives DrawTextObject

      Rev 1.58   22 Nov 1996 14:51:40   OS
   FN_SET_JUSTIFY_PARA -> SID_ATTR_PARA_ADJUST_BLOCK

      Rev 1.57   14 Nov 1996 08:06:52   SWG
   _TEMPLATE_ -> _STYLE_

      Rev 1.56   21 Sep 1996 17:36:30   OS
   Sot-Umstellung beendet

      Rev 1.55   16 Sep 1996 10:25:12   MBA
   FontDialog RecordPerItem

------------------------------------------------------------------------*/

diff --git a/sw/sdi/formsh.sdi b/sw/sdi/formsh.sdi
new file mode 100644
index 0000000..daab58b
--- /dev/null
+++ b/sw/sdi/formsh.sdi
@@ -0,0 +1,25 @@
interface TextDrawForm: BaseTextDrawForm
[
    uuid = "1D396B40-B8CC-11d1-AB80-006097B418C2"
]
{
    import TextDrawBase;
}

shell SwDrawFormShell : SwDrawBaseShell
{
    import TextDrawForm[Automation];
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.1  1998/03/11 16:14:00  OM
    DB-FormShell


      Rev 1.0   11 Mar 1998 17:14:00   OM
   DB-FormShell

------------------------------------------------------------------------*/

diff --git a/sw/sdi/frmsh.sdi b/sw/sdi/frmsh.sdi
new file mode 100644
index 0000000..6ad8aec
--- /dev/null
+++ b/sw/sdi/frmsh.sdi
@@ -0,0 +1,83 @@
/*------------------------------------------------------------------------

    $Workfile:   frmsh.sdi  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/frmsh.sdi,v 1.1.1.1 2000-09-18 17:14:30 hr Exp $

    Beschreibung:   IDL - File FrameShell fuer Sw3

    (c) Copyright 1995 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/

interface TextFrame : BaseTextFrame
[
    uuid = "564CBAA0-111A-101D-9757-6E74207A7520"
]
{
    import TextSelection;
}

 //=========================================================================

shell SwFrameShell : SwBaseShell
{
    import TextFrame[Automation];

    FN_FRAME_CHAIN
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_FRAME_UNCHAIN
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.86  1998/11/12 16:29:08  MA
    #58677# Disable Flag


      Rev 1.85   12 Nov 1998 17:29:08   MA
   #58677# Disable Flag

      Rev 1.84   05 Nov 1997 11:49:44   MA
   chain

      Rev 1.83   28 Aug 1997 12:50:20   MBA
   Neue Interface-Namen

      Rev 1.82   13 Feb 1997 12:45:02   MA
   unnoetige Texte entfernt

      Rev 1.81   23 Jan 1997 14:30:30   OS
   Ableitung von _Frame

      Rev 1.80   07 Nov 1996 16:17:06   OS
   Wrap-Methoden an die Baseshell

      Rev 1.79   21 Sep 1996 17:35:42   OS
   Sot-Umstellung beendet

      Rev 1.78   18 Sep 1996 10:35:46   OM
   Umlauf: Nur Anker

      Rev 1.77   10 Sep 1996 16:39:16   OS
   Slotvereinheitlichung zu, 1.

      Rev 1.76   20 Aug 1996 17:27:28   HJS
   eu...

      Rev 1.75   17 Jul 1996 07:31:30   OS
   ReadOnlyDoc - Flag

------------------------------------------------------------------------*/

diff --git a/sw/sdi/grfsh.sdi b/sw/sdi/grfsh.sdi
new file mode 100644
index 0000000..3662d6d
--- /dev/null
+++ b/sw/sdi/grfsh.sdi
@@ -0,0 +1,64 @@
/*------------------------------------------------------------------------

    $Workfile:   GRFSH.IDL  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/grfsh.sdi,v 1.1.1.1 2000-09-18 17:14:30 hr Exp $

    Beschreibung:   IDL - File GrafShell fuer Sw3

    (c) Copyright 1989 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/


interface TextGraphic : BaseTextGraphic
[
    uuid = "1885FE00-111C-101D-9757-6E74207A7520"
]
{
}

 //=========================================================================

shell SwGrfShell : SwBaseShell

{
    import TextGraphic[Automation];
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.45  2000/08/08 13:42:51  os
    #77423# separate graphic shell

    Revision 1.44  1997/08/28 10:55:24  MBA
    Neue Interface-Namen


      Rev 1.43   28 Aug 1997 12:55:24   MBA
   Neue Interface-Namen

      Rev 1.42   13 Feb 1997 12:45:04   MA
   unnoetige Texte entfernt

      Rev 1.41   31 Jan 1997 13:25:22   OS
   von _Graphic abgeleitet

      Rev 1.40   01 Oct 1996 16:52:26   OM
   Hyperlinks editieren

      Rev 1.39   21 Sep 1996 17:35:40   OS
   Sot-Umstellung beendet

      Rev 1.38   20 Aug 1996 17:27:00   HJS
   eu...

      Rev 1.37   17 Jul 1996 07:31:30   OS
   ReadOnlyDoc - Flag

      Rev 1.36   05 Jul 1996 13:38:50   OS
   neue Properities: GrfLinkName, GrfLinkFilterName

------------------------------------------------------------------------*/

diff --git a/sw/sdi/listsh.sdi b/sw/sdi/listsh.sdi
new file mode 100644
index 0000000..a1cea8f
--- /dev/null
+++ b/sw/sdi/listsh.sdi
@@ -0,0 +1,60 @@
/*------------------------------------------------------------------------

    $Workfile:   listSH.IDL  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/listsh.sdi,v 1.1.1.1 2000-09-18 17:14:30 hr Exp $

    Beschreibung:   IDL - File SwBaseShell fuer Sw3

    (c) Copyright 1989 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/

interface TextList : BaseTextList
[
    uuid = "509E9100-111A-101D-9757-6E74207A7520"
]
{
    import TextSelection;
}

 //=========================================================================

shell SwListShell : SwBaseShell
{
        import TextList[Automation];
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.31  1997/08/28 10:51:34  MBA
    Neue Interface-Namen


      Rev 1.30   28 Aug 1997 12:51:34   MBA
   Neue Interface-Namen

      Rev 1.29   13 Feb 1997 12:44:52   MA
   unnoetige Texte entfernt

      Rev 1.28   23 Jan 1997 14:31:54   OS
   Ableitung von _List

      Rev 1.27   21 Sep 1996 17:36:34   OS
   Sot-Umstellung beendet

      Rev 1.26   20 Aug 1996 17:27:42   HJS
   eu...

      Rev 1.25   17 Jul 1996 07:31:26   OS
   ReadOnlyDoc - Flag

      Rev 1.24   13 May 1996 11:40:30   OS
   Ableitung List : Base

      Rev 1.23   28 Mar 1996 14:20:32   OS
   neu: NumberOrNoNumber

------------------------------------------------------------------------*/

diff --git a/sw/sdi/makefile.mk b/sw/sdi/makefile.mk
new file mode 100644
index 0000000..4506f71
--- /dev/null
+++ b/sw/sdi/makefile.mk
@@ -0,0 +1,178 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:30 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

# wx mktyplib nur unter Windows aufrufbar
# VMB.386 und WXSRVR.EXE muessen geladen sein! (n:\mscwini\bin)

PRJ=..

PRJNAME=sw
TARGET=swslots

# --- Settings -----------------------------------------------------

SVSDIINC=$(PRJ)$/source$/ui$/inc

.INCLUDE :  $(PRJ)$/inc$/swpre.mk
.INCLUDE :  settings.mk
.INCLUDE :  $(PRJ)$/inc$/sw.mk


SDINAME=$(TARGET)
SDIEXPORT=swnew
SIDHRCNAME=swslots.hrc

# --- Files --------------------------------------------------------

SVSDIDEPEND= \
        $(SOLARINCXDIR)$/ofa.ilb \
        switems.sdi\
        swnew.sdi\
        swriter.sdi\
        _docsh.sdi\
        docsh.sdi\
        wdocsh.sdi\
        wrtapp.sdi\
        _basesh.sdi\
        basesh.sdi\
        _textsh.sdi\
        textsh.sdi\
        wtextsh.sdi\
        _drwbase.sdi\
        drwbassh.sdi\
        wdrwbase.sdi\
        formsh.sdi\
        _formsh.sdi\
        wformsh.sdi\
        drawsh.sdi\
        drwtxtsh.sdi\
        _listsh.sdi\
        listsh.sdi\
        wlistsh.sdi\
        _frmsh.sdi\
        frmsh.sdi\
        wfrmsh.sdi\
        _tabsh.sdi\
        tabsh.sdi\
        wtabsh.sdi\
        _grfsh.sdi\
        grfsh.sdi\
        wgrfsh.sdi\
        _olesh.sdi\
        olesh.sdi\
        wolesh.sdi\
        beziersh.sdi\
        _viewsh.sdi\
        viewsh.sdi\
        wviewsh.sdi\
        swslots.hrc \
        $(INC)$/globals.hrc \
        $(INC)$/cmdid.h

SRCFILES= \
    swslots.src

# --- Targets -------------------------------------------------------

.IF "$(depend)" == ""

TLBLIST+=\
    $(BIN)$/$(SDINAME).tlb

ALL: \
    ALLTAR \
    $(TLBLIST)

.ENDIF

.INCLUDE :  target.mk

.IF "$(GUIBASE)$(VCL)"=="WIN"
$(BIN)$/$(SDINAME).tlb: \
        $(MISCX)$/$(SDINAME).odl
    rscpp -I.;$(SVSDIINC);$(INC) -DSOLAR_VERSION=$(solar_version) $(MISC)$/$(SDINAME).odl $(MISC)$/$(SDINAME).odx
.IF "$(GUI)"=="WIN"
    wx /w /a mktyplib /nocpp /o $(MISC)$/$(SDINAME).err /tlb $(BIN)$/$(SDINAME).tlb $(MISC)$/$(SDINAME).odx
.ELSE
    mktyplib /win32 /nocpp /o $(MISC)$/$(SDINAME).err /tlb $(BIN)$/$(SDINAME).tlb $(MISC)$/$(SDINAME).odx
.ENDIF
    +type $(MISC)$/$(SDINAME).err
.ELSE
$(BIN)$/$(SDINAME).tlb:
    @echo nix
.ENDIF

.IF "$(GUIBASE)$(VCL)"=="WIN"
$(BIN)$/$(SDI2NAME).tlb: \
        $(MISCX)$/$(SDI2NAME).odl
    rscpp -I.;$(SVSDIINC);$(INC) -DSOLAR_VERSION=$(solar_version) $(MISC)$/$(SDI2NAME).odl $(MISC)$/$(SDI2NAME).odx
.IF "$(GUI)"=="WIN"
    wx mktyplib /nocpp /o $(MISC)$/$(SDI2NAME).err /tlb $(BIN)$/$(SDI2NAME).tlb $(MISC)$/$(SDI2NAME).odx
.ELSE
    mktyplib /win32 /nocpp /o $(MISC)$/$(SDI2NAME).err /tlb $(BIN)$/$(SDI2NAME).tlb $(MISC)$/$(SDI2NAME).odx
.ENDIF
    +type $(MISC)$/$(SDI2NAME).err
.ELSE
$(BIN)$/$(SDI2NAME).tlb:
    @echo nix
.ENDIF

diff --git a/sw/sdi/olesh.sdi b/sw/sdi/olesh.sdi
new file mode 100644
index 0000000..a1d5087
--- /dev/null
+++ b/sw/sdi/olesh.sdi
@@ -0,0 +1,76 @@
/*------------------------------------------------------------------------

    $Workfile:   OLESH.IDL  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/olesh.sdi,v 1.1.1.1 2000-09-18 17:14:30 hr Exp $

    Beschreibung:   IDL - File SwBaseShell fuer Sw3

    (c) Copyright 1989 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/

interface TextOLEObject : BaseTextOLEObject
[
    uuid = "B156B300-39FC-101D-9757-C667E8298000"
]
{
    import TextFrame;
}

shell SwOleShell: SwFrameShell
{
    import TextOLEObject[Automation];
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.16  1997/09/10 06:56:54  OS
    OLE importiert Frame


      Rev 1.15   10 Sep 1997 08:56:54   OS
   OLE importiert Frame

      Rev 1.14   28 Aug 1997 12:53:24   MBA
   Neue Interface-Namen

      Rev 1.13   13 Feb 1997 12:44:42   MA
   unnoetige Texte entfernt

      Rev 1.12   31 Jan 1997 13:25:46   OS
   von _OleObject abgeleitet

      Rev 1.11   21 Sep 1996 17:35:42   OS
   Sot-Umstellung beendet

      Rev 1.10   17 Jul 1996 07:31:32   OS
   ReadOnlyDoc - Flag

      Rev 1.9   08 Jul 1996 16:59:06   HJS
   uebersetzung

      Rev 1.8   22 Mar 1996 16:01:16   OS
   status fuer neue Funktionen nachgetragen

      Rev 1.7   08 Feb 1996 16:26:20   OM
   OLE-Objekte wieder vertikal zentrieren

      Rev 1.6   06 Feb 1996 15:16:06   OS
   neu: Activate/Deactivate fuer Objekte

      Rev 1.5   26 Jan 1996 10:56:30   OS
   neu: Interface Object, um Ole-Object herauszureichen

      Rev 1.4   28 Nov 1995 15:39:06   OS
   dummy slot

      Rev 1.3   11 Oct 1995 12:26:58   MA
   Bestimme -> Setze

      Rev 1.2   28 Aug 1995 15:43:36   MA
   Renovierung: IDL, Shells, Textshell-Doktrin aufgegeben

------------------------------------------------------------------------*/

diff --git a/sw/sdi/swinterf.c b/sw/sdi/swinterf.c
new file mode 100644
index 0000000..36010f0
--- /dev/null
+++ b/sw/sdi/swinterf.c
@@ -0,0 +1,283 @@
/*************************************************************************
 *
 *  $RCSfile: swinterf.c,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:30 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include <stdio.h>

#include <svinterf.h>
#include <cmdid.h>

static char pEmpty[] = "";

extern void *pSvClient;

/* WRITER */
short SwInsertDocument (void *pHandle,
                        const char *pFileName,
                        const char *pFilter)
{
    return 0;
}

/**************************************************************************/

/* WRITER */
short SwDeleteTableColumns (void *pHandle)
{
    if (SvIPCIsConnected())
        return pIPCCallShortFunction(SvIPCGetClient(),FN_TABLE_DELETE_COL | 0x10000,
                                     pHandle,0,pEmpty);
    return 0;
}

/* WRITER */
short SwDeleteTableRows (void *pHandle)
{
    if (SvIPCIsConnected())
        return pIPCCallShortFunction(SvIPCGetClient(),FN_TABLE_DELETE_ROW | 0x10000,
                                     pHandle,0,pEmpty);
    return 0;
}

/* WRITER */
short SwGotoStartOfTable (void *pHandle)
{
    if (SvIPCIsConnected())
        return pIPCCallShortFunction(SvIPCGetClient(),FN_START_TABLE | 0x10000,
                                     pHandle,0,pEmpty);
    return 0;
}

/* WRITER */
short SwGotoEndOfTable   (void *pHandle)
{
    if (SvIPCIsConnected())
        return pIPCCallShortFunction(SvIPCGetClient(),FN_END_TABLE | 0x10000,
                                     pHandle,0,pEmpty);
    return 0;
}

/* WRITER */
short SwGotoNextTable    (void *pHandle)
{
    return 0;
}

/* WRITER */
short SwGotoPrevTable   (void *pHandle)
{
    return 0;
}

/* WRITER */
short SwSelectTableRow    (void *pHandle)
{
    if (SvIPCIsConnected())
        return pIPCCallShortFunction(SvIPCGetClient(),FN_TABLE_SELECT_ROW | 0x10000,
                                     pHandle,0,pEmpty);
    return 0;
}

/* WRITER */
short SwSelectTableColumn (void *pHandle)
{
    if (SvIPCIsConnected())
        return pIPCCallShortFunction(SvIPCGetClient(),FN_TABLE_SELECT_COL | 0x10000,
                                     pHandle,0,pEmpty);
    return 0;
}

/* WRITER */
short SwTableSelect       (void *pHandle)
{
    if (SvIPCIsConnected())
        return pIPCCallShortFunction(SvIPCGetClient(),FN_TABLE_SELECT_ALL | 0x10000,
                                     pHandle,0,pEmpty);
    return 0;
}

/* WRITER */
short SwInsertTable (void *pHandle, const char *pName,
                     unsigned short nRow, unsigned short nColumn)
{
    if (SvIPCIsConnected())
        return pIPCCallShortFunction(SvIPCGetClient(),FN_INSERT_TABLE | 0x10000,
                                     pHandle,0,"hh",nRow,nColumn);
    return 0;

}

/**************************************************************************/

/* WRITER */
short SwCharLeft(void *pHandle, unsigned short nCount, unsigned short bSelect)
{
    if (SvIPCIsConnected())
        return pIPCCallShortFunction(SvIPCGetClient(),FN_CHAR_LEFT | 0x10000,
                                     pHandle,0,"hb",nCount,bSelect);
    return 0;
}

/* WRITER */
short SwCharRight(void *pHandle, unsigned short nCount, unsigned short bSelect)
{
    if (SvIPCIsConnected())
        return pIPCCallShortFunction(SvIPCGetClient(),FN_CHAR_RIGHT | 0x10000,
                                     pHandle,0,"hb",nCount,bSelect);
    return 0;
}

/* WRITER */
short SwLineUp(void *pHandle, unsigned short nCount, unsigned short bSelect)
{
    if (SvIPCIsConnected())
        return pIPCCallShortFunction(SvIPCGetClient(),FN_LINE_UP | 0x10000,
                                     pHandle,0,"hb",nCount,bSelect);
    return 0;
}

/* WRITER */
short SwLineDown(void *pHandle, unsigned short nCount, unsigned short bSelect)
{
    if (SvIPCIsConnected())
        return pIPCCallShortFunction(SvIPCGetClient(),FN_LINE_DOWN | 0x10000,
                                     pHandle,0,"hb",nCount,bSelect);
    return 0;
}

/**************************************************************************/

/* WRITER */
const char *SwGetSelectedText(void *pHandle)
{
    if (SvIPCIsConnected())
        return pIPCCallStringFunction(SvIPCGetClient(),FN_GET_SELECTED_TEXT,
                                      pHandle,0,pEmpty);
    return NULL;
}

/* WRITER */
short SwInsertString(void *pHandle,const char *pString)
{
    if (SvIPCIsConnected())
        return pIPCCallShortFunction(SvIPCGetClient(),FN_INSERT_STRING | 0x10000,
                                     pHandle,0,"s",pString);
    return 0;
}

/* WRITER */
extern short SwInsertLineBreak(void *pHandle)
{
    if (SvIPCIsConnected())
        return pIPCCallShortFunction(SvIPCGetClient(),FN_INSERT_LINEBREAK | 0x10000,
                                     pHandle,0,pEmpty);
    return 0;
}

/**************************************************************************/

/* WRITER */
short SwDelLeft (void *pHandle)
{
    if (SvIPCIsConnected())
        return pIPCCallShortFunction(SvIPCGetClient(),FN_BACKSPACE | 0x10000,
                                     pHandle,0,pEmpty);
    return 0;
}

/* WRITER */
short SwDelRight (void *pHandle)
{
    if (SvIPCIsConnected())
        return pIPCCallShortFunction(SvIPCGetClient(),FN_DELETE | 0x10000,
                                     pHandle,0,pEmpty);
    return 0;
}

/* WRITER */
short SwDelLine (void *pHandle)
{
    if (SvIPCIsConnected())
        return pIPCCallShortFunction(SvIPCGetClient(),FN_DELETE_WHOLE_LINE | 0x10000,
                                     pHandle,0,pEmpty);
    return 0;
}

/**************************************************************************/

/* WRITER */
short SwCharDlg(void *pHandle)
{
    if (SvIPCIsConnected())
        return pIPCCallShortFunction(SvIPCGetClient(),FN_FORMAT_CHAR_DLG | 0x10000,
                                     pHandle,0,pEmpty);
    return 0;
}

/* WRITER */
short SwParagrDlg(void *pHandle)
{
    if (SvIPCIsConnected())
        return pIPCCallShortFunction(SvIPCGetClient(),FN_FORMAT_PARA_DLG | 0x10000,
                                     pHandle,0,pEmpty);
    return 0;
}


diff --git a/sw/sdi/switems.sdi b/sw/sdi/switems.sdi
new file mode 100644
index 0000000..976e0d9
--- /dev/null
+++ b/sw/sdi/switems.sdi
@@ -0,0 +1,205 @@
enum SwHoriOrient
{
    HORI_NONE,
    HORI_RIGHT,
    HORI_CENTER,
    HORI_LEFT,
    HORI_INSIDE,
    HORI_OUTSIDE,
    HORI_FULL
};
enum SwRelationOrient
{
    FRAME,
    PRTAREA
};

enum SwVertOrient
{
    VERT_NONE,
    VERT_TOP,
    VERT_CENTER,
    VERT_BOTTOM,
    VERT_LINE_TOP,
    VERT_LINE_CENTER,
    VERT_LINE_BOTTOM
};

enum SwSurround
{
    SURROUND_BEGIN,
    SURROUND_THROUGHT,
    SURROUND_PARALLEL,
    SURROUND_DYNAMIC,
    SURROUND_LEFT,
    SURROUND_RIGHT,
    SURROUND_END
};

struct FmtHoriOrient
{
    INT32               XPos            MID_1;
    SwHoriOrient        HorzOrientation MID_2;
    SwRelationOrient    HorzRelation    MID_3;
};

item FmtHoriOrient SwFmtHoriOrient;

struct FmtVertOrient
{
    INT32               YPos            MID_1;
    SwVertOrient        VertOrientation MID_2;
    SwRelationOrient    VertRelation    MID_3;
};
item FmtVertOrient SwFmtVertOrient;

struct FmtFrmSize
{
    UINT32  Width           MID_WIDTH;
    UINT32  Height          MID_HEIGHT;
    BYTE    WidthPercent    MID_1;
    BYTE    HeightPercent   MID_2;
};
item FmtFrmSize SwFmtFrmSize;

struct Drop
{
    BYTE    Lines       MID_LINES;
    BYTE    Count       MID_CHARS;
    UINT16  Distance    MID_DIST;
};
item Drop SwFmtDrop;

struct SwDocDisplay
{
    BOOL    ParagraphEnd        MID_1;
    BOOL    Tab                 MID_2;
    BOOL    Space               MID_3;
    BOOL    NonbreakingSpace    MID_4;
    BOOL    SoftHyphen          MID_5;
    BOOL    HiddenText          MID_6;
    BOOL    ManualBreak         MID_7;
    BOOL    IndexEntry          MID_8;
    BOOL    FootnoteBackground  MID_9;
    BOOL    Field               MID_A;
    BOOL    Table               MID_B;
    BOOL    Graphic             MID_C;
    BOOL    Drawing             MID_D;
    BOOL    FieldName           MID_E;
    BOOL    Notes               MID_F;
    BOOL    ShowHiddenPara      MID_10;
}


item SwDocDisplay SwDocDisplayItem;

struct SwElem
{
    BOOL    HorzScrollbar   MID_1;
    BOOL    VertScrollbar   MID_2;
    BOOL    HorzRuler       MID_3;
    BOOL    VertRuler       MID_4;
    BOOL    TableBounds     MID_5;
    BOOL    Crosshair       MID_6;
    BOOL    Bounds          MID_7;
    BOOL    StatusLine      MID_8;
    BOOL    SolidHandles    MID_9;
    BOOL    SmoothScroll    MID_A;
}

item SwElem SwElemItem;

struct SwPrintOpt
{
        BOOL            PrintGraphic        MID_1;
        BOOL            PrintTable          MID_2;
        BOOL            PrintDrawing        MID_3;
        BOOL            PrintLeftPage       MID_4;
        BOOL            PrintRightPage      MID_5;
        BOOL            PrintControl        MID_6;
        BOOL            PrintReverse        MID_7;
        BOOL            PaperFromSetup      MID_8;
        String          FaxName             MID_9;
        UINT16          PrintAnnotations    MID_A;
        BOOL            PrintProspect       MID_B;
        BOOL            PrintBackground     MID_C;
        BOOL            PrintBlackFont      MID_D;

}
item SwPrintOpt SwAddPrinterItem;

struct SwPageFtnInfo
{

    INT32   FtnHeight           MID_1;
    INT32   FtnPenWidth         MID_2;
    INT32   FtnTopDistance      MID_3;
    INT32   FtnBottomDistance   MID_4;
    INT16   FtnWidth            MID_5;   // in Prozent
    INT16   FtnAdjust           MID_6;
    INT16   FtnPenStyle         MID_7;
};
item SwPageFtnInfo SwPageFtnInfoItem;

item String     SvxBoxInfoItem; //! Dummy


//umdefiniert wg. doppelter Benutzung

struct SwPageLRSpace
{
    UINT16      PageLeftMargin      MID_LEFT_MARGIN;        // % or direct
    UINT16      PageRightMargin     MID_RIGHT_MARGIN;       // % or direct
};
item SwPageLRSpace SwPageLRSpaceItem;

struct SwPageULSpace
{
    UINT16              PageTopMargin           MID_UPPER;  // % or direct
    UINT16              PageBottomMargin        MID_LOWER;  // % or direct
};
item SwPageULSpace SwPageULSpaceItem


struct SwGraphicSize
{
    UINT32  GraphicWidth        MID_WIDTH;
    UINT32  GraphicHeight       MID_HEIGHT;
};
item SwGraphicSize SwGraphicSizeItem;

struct CropGrf
{
    INT32   Left    MID_1;
    INT32   Right   MID_2;
    INT32   Top     MID_3;
    INT32   Bottom  MID_4;
};
item CropGrf SwCropGrf;

struct INetFmt
{
    String      URL             MID_1;
    String      TargetFrame     MID_2;
    String      VisitedFmt      MID_3;
    String      UnvisitedFmt    MID_4;
};
item INetFmt SwFmtINetFmt;

struct FmtSurround
{
    SwSurround      Surround    MID_1;
    BOOL            AnchorOnly  MID_3;
    BOOL            Contour     MID_4;
    BOOL            Outside     MID_5
};

item FmtSurround    SwFmtSurround;

struct SwShadowCursor
{
    BOOL            ShadowCursor        MID_1;
    BYTE            ShadowCursorMode    MID_2;
    INT32           ShadowCursorColor   MID_3;
};
item SwShadowCursor SwShadowCursorItem;
diff --git a/sw/sdi/swpatch.txt b/sw/sdi/swpatch.txt
new file mode 100644
index 0000000..2628f81
--- /dev/null
+++ b/sw/sdi/swpatch.txt
@@ -0,0 +1,19 @@
swinter.h:

unsigned char SYSCALL SwDocumentGetIsPrinting( C_Object ObjHdl );


swinter.c:

unsigned char SYSCALL SwDocumentGetIsPrinting( C_Object ObjHdl )
{
    if( SvIPCIsConnected() )
    {
        return (unsigned char) pIPCCallFunction( SvIPCGetClient(), 136598,
             ObjHdl , 1, NULL );
    }
    return 0;
}

#pragma code_seg("swinter2","CODE")

diff --git a/sw/sdi/swriter.sdi b/sw/sdi/swriter.sdi
new file mode 100644
index 0000000..104cee5
--- /dev/null
+++ b/sw/sdi/swriter.sdi
@@ -0,0 +1,8432 @@
//--------------------------------------------------------------------------
SfxBoolItem GotoPrevObject FN_GOTO_PREV_OBJ
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem PrintPagePreView FN_PRINT_PAGEPREVIEW
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_VIEW;
]

//--------------------------------------------------------------------------
SfxBoolItem AcceptRedlining FN_REDLINE_ACCEPT
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxVoidItem CommentRedlining FN_REDLINE_COMMENT
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem JumpToFooter FN_TO_FOOTER
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem SbaInsert FN_QRY_INSERT
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = FALSE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_DATA;
]

//--------------------------------------------------------------------------
SfxBoolItem GotoNextWrongTableFormula FN_NEXT_TBLFML_ERR
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem BulletsAndNumberingDialog FN_NUMBER_BULLETS
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_ENUMERATION;
]

//--------------------------------------------------------------------------
SfxBoolItem JumpToPrevTable FN_PREV_TABLE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxBoolItem GotoPrevTableFormula FN_PREV_TBLFML
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem WordLeftSel FN_PREV_WORD_SEL
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxBoolItem JumpToPrevFootnote FN_PREV_FOOTNOTE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxBoolItem VRuler FN_VLINEAL

[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_VIEW;
]

//--------------------------------------------------------------------------
SfxBoolItem GoToPrevSentence FN_PREV_SENT
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem PreviewPrintOptions FN_PREVIEW_PRINT_OPTIONS
()
[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_DOC;
]

//--------------------------------------------------------------------------
SfxVoidItem EndOfDocumentSel FN_END_OF_DOCUMENT_SEL
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxBoolItem GotoPrevWrongTableFormula FN_PREV_TBLFML_ERR
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertNeutralParagraph FN_NUM_BULLET_NONUM
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_ENUMERATION;
]

//--------------------------------------------------------------------------
SfxBoolItem GoToPrevWord FN_PREV_WORD
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem PageStyleApply FN_SET_PAGE_STYLE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem AlignCharBottom FN_FRAME_ALIGN_VERT_CHAR_BOTTOM
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* status: */
    SlotType = SfxStringItem

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FRAME;
]

//--------------------------------------------------------------------------
SfxVoidItem Repaginate FN_REPAGINATE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxBoolItem ShowHiddenParagraphs FN_VIEW_HIDDEN_PARA

[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = TRUE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_OPTIONS;
]

//--------------------------------------------------------------------------
SfxVoidItem SetMultiSelection FN_SET_ADD_MODE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxVoidItem FormatGroup FN_TOOL_GROUP
()
[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem ShowTwoPages FN_SHOW_TWO_PAGES
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_VIEW;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertAuthoritiesEntry FN_INSERT_AUTH_ENTRY_DLG
()
[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = TRUE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxBoolItem SuperScript FN_SET_SUPER_SCRIPT

[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxBoolItem ShadowCursor FN_SHADOWCURSOR

[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = TRUE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_OPTIONS;
]

//--------------------------------------------------------------------------
SfxVoidItem ShiftBackspace FN_SHIFT_BACKSPACE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxVoidItem GotoPrevSentenceSel FN_PREV_SENT_SEL
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxBoolItem Ruler FN_RULER

[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Volatile,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = TRUE,
    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_VIEW;
]

//--------------------------------------------------------------------------
SfxVoidItem EditCurIndex FN_EDIT_CURRENT_TOX
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxBoolItem ShowRedlining FN_REDLINE_SHOW
()
[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = TRUE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_VIEW;
]

//--------------------------------------------------------------------------
SfxVoidItem Refresh FN_REFRESH_VIEW
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_VIEW;
]

//--------------------------------------------------------------------------
SfxBoolItem ScrollNavigation FN_SCROLL_NAVIGATION

[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = FALSE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_VIEW;
]

//--------------------------------------------------------------------------
SfxVoidItem ScrollNextPrev FN_SCROLL_NEXT_PREV
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = FALSE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem SelectText FN_SELECT_PARA
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxVoidItem EntireColumn FN_TABLE_SELECT_COL
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_TABLE;
]

//--------------------------------------------------------------------------
SfxVoidItem SwMailMerge FN_SBA_BRW_MERGE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = FALSE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_DATA;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertFrame FN_INSERT_FRAME
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* status: */
    SlotType = SfxUInt16Item

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem Remove FN_NUM_BULLET_OFF
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_ENUMERATION;
]

//--------------------------------------------------------------------------
SfxVoidItem JumpDownThisLevel FN_NUM_BULLET_NEXT
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_ENUMERATION;
]

//--------------------------------------------------------------------------
SfxVoidItem SelectWord FN_SELECT_WORD
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxBoolItem JumpToNextBookmark FN_NEXT_BOOKMARK
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxBoolItem GoToNextWord FN_NEXT_WORD
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem WordRightSel FN_NEXT_WORD_SEL
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem IncrementSubLevels FN_NUM_BULLET_OUTLINE_UP
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_ENUMERATION;
]

//--------------------------------------------------------------------------
SfxVoidItem IncrementIndentValue FN_INC_INDENT_OFFSET
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem IncrementLevel FN_NUM_BULLET_UP
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_ENUMERATION;
]

//--------------------------------------------------------------------------
SfxBoolItem ViewBounds FN_VIEW_BOUNDS

[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Volatile,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_VIEW;
]

//--------------------------------------------------------------------------
SfxVoidItem MoveDownSubItems FN_NUM_BULLET_OUTLINE_MOVEDOWN
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_ENUMERATION;
]

//--------------------------------------------------------------------------
SfxVoidItem MoveUpSubItems FN_NUM_BULLET_OUTLINE_MOVEUP
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_ENUMERATION;
]

//--------------------------------------------------------------------------
SfxBoolItem JumpToNextFootnote FN_NEXT_FOOTNOTE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxBoolItem GoToNextPara FN_NEXT_PARA
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem GotoPage FN_NAVIGATION_PI_GOTO_PAGE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxBoolItem NewGlobalDoc FN_NEW_GLOBAL_DOC
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_APPLICATION;
]

//--------------------------------------------------------------------------
SfxBoolItem NumberingStart FN_NUMBER_NEWSTART

[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = TRUE,
    Container = FALSE,
    Asynchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_ENUMERATION;
]

//--------------------------------------------------------------------------
SfxBoolItem GotoNextTableFormula FN_NEXT_TBLFML
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem MergeDialog FN_QRY_MERGE
()
[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = TRUE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_DOCUMENT;
]

//--------------------------------------------------------------------------
SfxBoolItem GotoNextIndexMark FN_NEXT_TOXMARK
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxBoolItem GoToStartOfLine FN_START_OF_LINE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem GotoNextSentenceSel FN_NEXT_SENT_SEL
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxBoolItem JumpToNextTable FN_NEXT_TABLE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem EndOfParaSel FN_END_OF_PARA_SEL
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem SendOutlineToStarImpress FN_OUTLINE_TO_IMPRESS
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_DOCUMENT;
]

//--------------------------------------------------------------------------
SfxVoidItem PageDown FN_PAGEDOWN
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem JumpToFootnoteOrAnchor FN_FOOTNOTE_TO_ANCHOR
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem ObjectMirrorVertical FN_TOOL_VMIRROR
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxUInt16Item OptimizeTable FN_OPTIMIZE_TABLE

[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_TABLE;
]

//--------------------------------------------------------------------------
SfxInt16Item PasteSpecial FN_PASTESPECIAL
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Volatile,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertAnnotation FN_POSTIT
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxBoolItem GoToNextSentence FN_NEXT_SENT
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem AlignLeft FN_FRAME_ALIGN_HORZ_LEFT
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FRAME;
]

//--------------------------------------------------------------------------
SfxVoidItem DelToEndOfWord FN_DELETE_WORD
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxVoidItem PageUpSel FN_PAGEUP_SEL
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem NumberFormatDate FN_NUMBER_DATE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem PageDownSel FN_PAGEDOWN_SEL
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem TableNumberFormatDialog FN_NUM_FORMAT_TABLE_DLG
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem ShowFourPages FN_SHOW_FOUR_PAGES
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_VIEW;
]

//--------------------------------------------------------------------------
SfxVoidItem GoToEndOfPage FN_END_OF_PAGE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem NumberFormatStandard FN_NUMBER_STANDARD
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertDateField FN_INSERT_FLD_DATE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem NumberFormatDecimal FN_NUMBER_TWODEC
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem GoToStartOfPage FN_START_OF_PAGE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem NumberFormatPercent FN_NUMBER_PERCENT
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem NumberFormatScientific FN_NUMBER_SCIENTIFIC
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem GoToStartOfNextColumn FN_START_OF_NEXT_COLUMN
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem SetAnchorToFrame FN_TOOL_ANKER_FRAME
()
[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* status: */
    SlotType = SfxBoolItem

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem SbaInsertField FN_QRY_INSERT_FIELD
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = FALSE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_DATA;
]

//--------------------------------------------------------------------------
SvxColorItem BackColor SID_ATTR_CHAR_COLOR_BACKGROUND

[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = FALSE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem ToggleAnchorType FN_TOOL_ANKER
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* status: */
    SlotType = SfxUInt16Item

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem SetAnchorAtChar FN_TOOL_ANKER_AT_CHAR
()
[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* status: */
    SlotType = SfxBoolItem

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem ObjectMirrorHorizontal FN_TOOL_HMIRROR
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem FormatUngroup FN_TOOL_UNGROUP
()
[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem ChapterNumberingDialog FN_NUMBERING_OUTLINE_DLG
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_OPTIONS;
]

//--------------------------------------------------------------------------
SfxVoidItem SetAnchorToPara FN_TOOL_ANKER_PARAGRAPH
()
[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* status: */
    SlotType = SfxBoolItem

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem FootnoteDialog FN_FORMAT_FOOTNOTE_DLG
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem ToggleObjectLayer FN_TOOL_HIERARCHIE
()
[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem ResetTableProtection FN_TABLE_UNSET_READ_ONLY
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_TABLE;
]

//--------------------------------------------------------------------------
SfxVoidItem UnsetCellsReadOnly FN_TABLE_UNSET_READ_ONLY_CELLS
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_TABLE;
]

//--------------------------------------------------------------------------
SfxBoolItem GoToStartOfPara FN_START_OF_PARA
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem SetRowHeight FN_TABLE_SET_ROW_HEIGHT
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_TABLE;
]

//--------------------------------------------------------------------------
SfxVoidItem MergeCells FN_TABLE_MERGE_CELLS
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_TABLE;
]

//--------------------------------------------------------------------------
SfxVoidItem ThesaurusDialog FN_THESAURUS_DLG
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_OPTIONS;
]

//--------------------------------------------------------------------------
SfxVoidItem SetExtSelection FN_SET_EXT_MODE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxVoidItem JumpToHeader FN_TO_HEADER
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertPageCountField FN_INSERT_FLD_PGCOUNT
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxBoolItem CellVertCenter FN_TABLE_VERT_CENTER

[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_TABLE;
]

//--------------------------------------------------------------------------
SfxBoolItem CellVertTop FN_TABLE_VERT_NONE

[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_TABLE;
]

//--------------------------------------------------------------------------
SfxBoolItem TableBoundaries FN_VIEW_TABLEGRID

[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_VIEW;
]

//--------------------------------------------------------------------------
SfxBoolItem GotoNextObject FN_GOTO_NEXT_OBJ
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxBoolItem VScroll FN_VSCROLLBAR

[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_VIEW;
]

//--------------------------------------------------------------------------
SfxBoolItem GoUp FN_LINE_UP
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxBoolItem Marks FN_VIEW_MARKS

[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_VIEW;
]

//--------------------------------------------------------------------------
SfxBoolItem ControlCodes FN_VIEW_META_CHARS

[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_VIEW;
]

//--------------------------------------------------------------------------
SvxColorItem FontColor SID_ATTR_CHAR_COLOR2

[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = FALSE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxUInt16Item HtmlMode SID_HTML_MODE

[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = TRUE,
    /* config: */
    AccelConfig = FALSE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_VIEW;
]

//--------------------------------------------------------------------------
SfxVoidItem LoadStyles SID_TEMPLATE_LOAD
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxBoolItem WrapAnchorOnly FN_WRAP_ANCHOR_ONLY
()
[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FRAME;
]

//--------------------------------------------------------------------------
SfxStringItem StateZoom FN_STAT_ZOOM
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = FALSE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxBoolItem CharColorExt SID_ATTR_CHAR_COLOR_EXT

[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = TRUE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = FALSE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem UpdateFields FN_UPDATE_FIELDS
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxVoidItem MoveDown FN_NUM_BULLET_MOVEDOWN
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxBoolItem UnderlineDouble FN_UNDERLINE_DOUBLE

[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = TRUE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxBoolItem WrapIdeal FN_FRAME_WRAP_IDEAL
()
[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FRAME;
]

//--------------------------------------------------------------------------
SfxVoidItem UpdateAllLinks FN_UPDATE_ALL_LINKS
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxVoidItem Hyphenate FN_HYPHENATE_OPT_DLG
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = TRUE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_OPTIONS;
]

//--------------------------------------------------------------------------
SfxVoidItem UnhainFrames FN_FRAME_UNCHAIN

[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = FALSE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FRAME;
]

//--------------------------------------------------------------------------
SfxBoolItem CharBackgroundExt SID_ATTR_CHAR_COLOR_BACKGROUND_EXT

[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = TRUE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = FALSE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem UpdateAllIndexes FN_UPDATE_TOX
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxVoidItem ExecuteMacroField FN_EXECUTE_MACROFIELD
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Volatile,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_MACRO;
]

//--------------------------------------------------------------------------
SfxBoolItem Fieldnames FN_VIEW_FIELDNAME

[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_VIEW;
]

//--------------------------------------------------------------------------
SfxVoidItem StartOfParaSel FN_START_OF_PARA_SEL
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem GoToStartOfPrevColumn FN_START_OF_PREV_COLUMN
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem AutoFormatRedlineApply FN_AUTOFORMAT_REDLINE_APPLY
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertMultiIndex FN_INSERT_MULTI_TOX
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Volatile,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem GoToEndOfColumn FN_END_OF_COLUMN
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem StateBookmark FN_STAT_BOOKMARK
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = FALSE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_INTERN;
]

//--------------------------------------------------------------------------
SfxVoidItem PageUp FN_PAGEUP
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxStringItem StatePageNumber FN_STAT_PAGE

[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Volatile,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = FALSE,
    MenuConfig = FALSE,
    StatusBarConfig = TRUE,
    ToolBoxConfig = FALSE,
    GroupId = GID_VIEW;
]

//--------------------------------------------------------------------------
SfxBoolItem WrapThroughTransparent FN_FRAME_WRAPTHRU_TRANSP
()
[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FRAME;
]

//--------------------------------------------------------------------------
SfxVoidItem GoToStartOfPrevPageSel FN_START_OF_PREV_PAGE_SEL
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem GoToStart FN_START_TABLE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem GoToStartOfColumn FN_START_OF_COLUMN
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxBoolItem InsertHeader FN_INSERT_HEADER

[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = TRUE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem SortDialog FN_SORTING_DLG
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_DATA;
]

//--------------------------------------------------------------------------
SfxBoolItem GoRight FN_CHAR_RIGHT
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem Spelling FN_SPELLING_DLG
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_OPTIONS;
]

//--------------------------------------------------------------------------
SfxVoidItem StartAutoCorrect FN_AUTO_CORRECT
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_OPTIONS;
]

//--------------------------------------------------------------------------
SfxVoidItem GoToStartOfNextPage FN_START_OF_NEXT_PAGE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem GoToStartOfNextPageSel FN_START_OF_NEXT_PAGE_SEL
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem StartOfDocumentSel FN_START_OF_DOCUMENT_SEL
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxBoolItem WrapContour FN_FRAME_WRAP_CONTOUR
()
[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FRAME;
]

//--------------------------------------------------------------------------
SfxVoidItem StartOfLineSel FN_START_OF_LINE_SEL
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxBoolItem Fields FN_VIEW_FIELDS

[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_VIEW;
]

//--------------------------------------------------------------------------
SfxVoidItem TableModeFix FN_TABLE_MODE_FIX
()
[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* status: */
    SlotType = SfxBoolItem

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_TABLE;
]

//--------------------------------------------------------------------------
SfxVoidItem TableModeFixProp FN_TABLE_MODE_FIX_PROP
()
[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* status: */
    SlotType = SfxBoolItem

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_TABLE;
]

//--------------------------------------------------------------------------
SfxVoidItem SetOptimalColumnWidth FN_TABLE_ADJUST_CELLS
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Volatile,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_TABLE;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertRowDialog FN_TABLE_INSERT_ROW_DLG
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = FALSE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_TABLE;
]

//--------------------------------------------------------------------------
SfxVoidItem DelToStartOfPara FN_DELETE_BACK_PARA
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxBoolItem Sourceview FN_SOURCEVIEW

[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = TRUE,
    Container = FALSE,
    Asynchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_VIEW;
]

//--------------------------------------------------------------------------
SfxVoidItem SetColumnWidth FN_TABLE_SET_COL_WIDTH
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = FALSE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_TABLE;
]

//--------------------------------------------------------------------------
SfxVoidItem Protect FN_TABLE_SET_READ_ONLY_CELLS
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_TABLE;
]

//--------------------------------------------------------------------------
SfxVoidItem SetOptimalRowHeight FN_TABLE_OPTIMAL_HEIGHT
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_TABLE;
]

//--------------------------------------------------------------------------
SfxVoidItem Select FN_TABLE_SELECT_ALL
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_TABLE;
]

//--------------------------------------------------------------------------
SfxBoolItem GotoNextPlacemarker FN_GOTO_NEXT_MARK
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem AutoSum FN_TABLE_AUTOSUM
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_TABLE;
]

//--------------------------------------------------------------------------
SfxVoidItem AlignTop FN_FRAME_ALIGN_VERT_TOP
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* status: */
    SlotType = SfxStringItem

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FRAME;
]

//--------------------------------------------------------------------------
SfxUInt16Item SelectionMode FN_STAT_SELMODE

[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Volatile,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = FALSE,
    MenuConfig = FALSE,
    StatusBarConfig = TRUE,
    ToolBoxConfig = FALSE,
    GroupId = GID_VIEW;
]

//--------------------------------------------------------------------------
SfxStringItem PageStyleName FN_STAT_TEMPLATE

[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = TRUE,
    /* config: */
    AccelConfig = FALSE,
    MenuConfig = FALSE,
    StatusBarConfig = TRUE,
    ToolBoxConfig = FALSE,
    GroupId = GID_VIEW;
]

//--------------------------------------------------------------------------
SfxBoolItem SynchronizeLabelsDlg FN_SYNC_LABELS
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = FALSE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxVoidItem FormatColumns FN_FORMAT_COLUMN
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem CalculateSel FN_CALCULATE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_OPTIONS;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertRows FN_TABLE_INSERT_ROW
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = FALSE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_TABLE;
]

//--------------------------------------------------------------------------
SfxVoidItem DistributeRows FN_TABLE_BALANCE_ROWS
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_TABLE;
]

//--------------------------------------------------------------------------
SfxVoidItem DeleteColumns FN_TABLE_DELETE_COL
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_TABLE;
]

//--------------------------------------------------------------------------
SfxVoidItem EntireRow FN_TABLE_SELECT_ROW
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_TABLE;
]

//--------------------------------------------------------------------------
SfxVoidItem TextAttributes FN_DRAWTEXT_ATTR_DLG
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxBoolItem MergeTable FN_TABLE_MERGE_TABLE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_TABLE;
]

//--------------------------------------------------------------------------
SfxVoidItem FootnoteDialog FN_EDIT_FOOTNOTE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertReferenzField FN_INSERT_REF_FIELD
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem DelLine FN_DELETE_WHOLE_LINE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxVoidItem TextWrap FN_DRAW_WRAP_DLG
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem JumpToEndOfDoc FN_END_DOC_DIRECT
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem PageDialog FN_FORMAT_PAGE_DLG
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxBoolItem GoToEndOfDoc FN_END_OF_DOCUMENT
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertFormula FN_EDIT_FORMULA
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem LinkDialog FN_EDIT_LINK_DLG
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxVoidItem ObjectForwardOne FN_FRAME_DOWN
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertColumnBreak FN_INSERT_COLUMN_BREAK
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxBoolItem GoLeft FN_CHAR_LEFT
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem Backspace FN_BACKSPACE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxVoidItem Calc FN_CALC_TABLE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_TABLE;
]

//--------------------------------------------------------------------------
SfxVoidItem ChangeDatabaseField FN_CHANGE_DBFIELD
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Volatile,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_DATA;
]

//--------------------------------------------------------------------------
SfxVoidItem UpdateInputFields FN_UPDATE_INPUTFIELDS
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxVoidItem ConvertTableText FN_CONVERT_TEXT_TABLE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_OPTIONS;
]

//--------------------------------------------------------------------------
SfxBoolItem RepeatSearch FN_REPEAT_SEARCH
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxVoidItem CharLeftSel FN_CHAR_LEFT_SEL
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem SetAnchorToPage FN_TOOL_ANKER_PAGE
()
[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* status: */
    SlotType = SfxBoolItem

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem CharRightSel FN_CHAR_RIGHT_SEL
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxBoolItem PrintLayout FN_PRINT_LAYOUT

[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Volatile,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_VIEW;
]

//--------------------------------------------------------------------------
SfxBoolItem ExpandGlossary FN_EXPAND_GLOSSARY
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxVoidItem TableDialog FN_FORMAT_TABLE_DLG
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_TABLE;
]

//--------------------------------------------------------------------------
SfxVoidItem GoToEndOfNextColumn FN_END_OF_NEXT_COLUMN
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem DecrementIndentValue FN_DEC_INDENT_OFFSET
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertEnvelop FN_ENVELOP
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem BorderDialog FN_FORMAT_BORDER_DLG
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SwFmtDrop FormatDropcap FN_FORMAT_DROPCAPS

[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem UpdateCurIndex FN_UPDATE_CUR_TOX

[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxVoidItem FlipVertical FN_FLIP_VERT_GRAFIC
()
[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxBoolItem GoToEndOfPara FN_END_OF_PARA
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem BackgroundDialog FN_FORMAT_BACKGROUND_DLG
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertObject FN_INSERT_OBJECT_DLG
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem GoToEndOfNextPageSel FN_END_OF_NEXT_PAGE_SEL
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxBoolItem NumberOrNoNumber FN_NUM_OR_NONUM

[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_ENUMERATION;
]

//--------------------------------------------------------------------------
SfxBoolItem GoToEndOfLine FN_END_OF_LINE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem EndOfLineSel FN_END_OF_LINE_SEL
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem GoToEndOfPrevColumn FN_END_OF_PREV_COLUMN
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem GoToEndOfPrevPage FN_END_OF_PREV_PAGE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxBoolItem InsertField FN_INSERT_FIELD

[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxBoolItem GoDown FN_LINE_DOWN
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem GoToEndOfPageSel FN_END_OF_PAGE_SEL
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem GoToEndOfNextPage FN_END_OF_NEXT_PAGE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem DelToStartOfLine FN_DELETE_BACK_LINE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxVoidItem DelToStartOfSentence FN_DELETE_BACK_SENT
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxVoidItem DelToStartOfWord FN_DELETE_BACK_WORD
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxVoidItem DecrementSubLevels FN_NUM_BULLET_OUTLINE_DOWN
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_ENUMERATION;
]

//--------------------------------------------------------------------------
SfxVoidItem SplitTable FN_TABLE_SPLIT_TABLE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_TABLE;
]

//--------------------------------------------------------------------------
SfxVoidItem MoveUp FN_NUM_BULLET_MOVEUP
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxVoidItem TableModeVariable FN_TABLE_MODE_VARIABLE
()
[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* status: */
    SlotType = SfxBoolItem

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_TABLE;
]

//--------------------------------------------------------------------------
SfxVoidItem Escape FN_ESCAPE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxVoidItem NumberFormatTime FN_NUMBER_TIME
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem DelToEndOfLine FN_DELETE_LINE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertLabels FN_LABEL
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem DelToEndOfSentence FN_DELETE_SENT
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxVoidItem PreviewZoom FN_PREVIEW_ZOOM
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* status: */
    SlotType = SfxUInt16Item

    /* config: */
    AccelConfig = FALSE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_VIEW;
]

//--------------------------------------------------------------------------
SfxVoidItem GoToStartOfPageSel FN_START_OF_PAGE_SEL
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxBoolItem JumpToNextFrame FN_CNTNT_TO_NEXT_FRAME
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem DeleteRows FN_TABLE_DELETE_ROW
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_TABLE;
]

//--------------------------------------------------------------------------
SfxVoidItem FlipHorizontal FN_FLIP_HORZ_GRAFIC
()
[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxBoolItem GoToPrevPara FN_PREV_PARA
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem SetAnchorToChar FN_TOOL_ANKER_CHAR
()
[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* status: */
    SlotType = SfxBoolItem

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem LineUpSel FN_LINE_UP_SEL
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxBoolItem CellVertBottom FN_TABLE_VERT_BOTTOM

[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_TABLE;
]

//--------------------------------------------------------------------------
SfxVoidItem GoToStartOfPrevPage FN_START_OF_PREV_PAGE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem EditRegion FN_EDIT_REGION
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxVoidItem DataBaseBrowser FN_QRY
()
[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = TRUE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_DATA;
]

//--------------------------------------------------------------------------
SfxVoidItem GoToEndOfPrevPageSel FN_END_OF_PREV_PAGE_SEL
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertFrameInteract FN_INSERT_FRAME_INTERACT_NOCOL
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = FALSE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem AlignVerticalRowCenter FN_FRAME_ALIGN_VERT_ROW_CENTER
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* status: */
    SlotType = SfxStringItem

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FRAME;
]

//--------------------------------------------------------------------------
SfxBoolItem TableNumberRecognition FN_SET_MODOPT_TBLNUMFMT

[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_VIEW;
]

//--------------------------------------------------------------------------
SfxVoidItem EditHyperlink FN_EDIT_HYPERLINK
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem AutoCorrectDialog FN_AUTO_CORRECT_DLG
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_OPTIONS;
]

//--------------------------------------------------------------------------
SfxVoidItem AutoFormatApply FN_AUTOFORMAT_APPLY
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxBoolItem OnlineAutoFormat FN_AUTOFORMAT_AUTO

[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = TRUE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem CreateAbstract FN_ABSTRACT_NEWDOC
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_DOCUMENT;
]

//--------------------------------------------------------------------------
SfxVoidItem SendAbstractToStarImpress FN_ABSTRACT_STARIMPRESS
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_DOCUMENT;
]

//--------------------------------------------------------------------------
SfxVoidItem JumpToStartOfDoc FN_START_DOC_DIRECT
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertIndexesEntry FN_INSERT_IDX_ENTRY_DLG
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem IndexEntryDialog FN_EDIT_IDX_ENTRY_DLG
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxStringItem InsertColumnSection FN_INSERT_COLUMN_SECTION
(SfxUInt16Item Columns FN_INSERT_COLUMN_SECTION)
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* status: */
    SlotType = SfxUInt16Item

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertColumns FN_TABLE_INSERT_COL
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = FALSE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_TABLE;
]

//--------------------------------------------------------------------------
SfxBoolItem ActivateRedlining FN_REDLINE_ON
()
[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = TRUE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxVoidItem RemoveTableOf FN_REMOVE_CUR_TOX
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxBoolItem AppendParaBehindTheSection FN_SECTION_APPENDNODE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxBoolItem ExecHyperlinks FN_STAT_HYPERLINKS

[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = FALSE,
    MenuConfig = FALSE,
    StatusBarConfig = TRUE,
    ToolBoxConfig = FALSE,
    GroupId = GID_VIEW;
]

//--------------------------------------------------------------------------
SfxVoidItem AuthoritiesEntryDialog FN_EDIT_AUTH_ENTRY_DLG
()
[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxVoidItem Shrink FN_SHRINK_FONT_SIZE
()
[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertBusinessCard FN_BUSINESS_CARD
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertPageNumberField FN_INSERT_FLD_PGNUMBER
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertTimeField FN_INSERT_FLD_TIME
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertBookmark FN_INSERT_BOOKMARK
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertAuthorField FN_INSERT_FLD_AUTHOR
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertColumnDialog FN_TABLE_INSERT_COL_DLG
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = FALSE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_TABLE;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertFootnoteDirect FN_INSERT_FOOTNOTE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertFootnote FN_INSERT_FOOTNOTE_DLG
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem SplitCell FN_TABLE_SPLIT_CELLS
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_TABLE;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertTopicField FN_INSERT_FLD_TOPIC
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxBoolItem InsertGraphicRuler FN_INSERT_HRULER
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxBoolItem InsertFooter FN_INSERT_FOOTER

[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = TRUE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertPara FN_INSERT_BREAK
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertBreak FN_INSERT_BREAK_DLG
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem DecrementLevel FN_NUM_BULLET_DOWN
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_ENUMERATION;
]

//--------------------------------------------------------------------------
SfxVoidItem IndexMarkToIndex FN_IDX_MARK_TO_IDX
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxStringItem NumberFormat FN_NUMBER_FORMAT

[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = FALSE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertEndnoteDirect FN_INSERT_ENDNOTE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem SbaMerge FN_QRY_MERGE_FIELD
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = FALSE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_DATA;
]

//--------------------------------------------------------------------------
SfxBoolItem InsertFieldCtrl FN_INSERT_FIELD_CTRL

[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = TRUE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = FALSE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem NumberFormatCurrency FN_NUMBER_CURRENCY
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxBoolItem NewHtmlDoc FN_NEW_HTML_DOC
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_APPLICATION;
]

//--------------------------------------------------------------------------
SfxUInt16Item InsertCtrl FN_INSERT_CTRL

[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = FALSE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertObjectStarMath FN_INSERT_SMA
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxBoolItem JumpToPrevBookmark FN_PREV_BOOKMARK
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertSymbol FN_INSERT_SYMBOL
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxBoolItem GoToStartOfDoc FN_START_OF_DOCUMENT
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_VIEW;
]

//--------------------------------------------------------------------------
SfxStringItem InsertRegion FN_INSERT_REGION
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertObjectStarImage FN_INSERT_SIM
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem LineDownSel FN_LINE_DOWN_SEL
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem LineNumberingDialog FN_LINE_NUMBERING_DLG
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem SwBrwInsert FN_SBA_BRW_INSERT
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = FALSE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_DATA;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertTable FN_INSERT_TABLE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* status: */
    SlotType = SfxUInt16Item

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertScript FN_JAVAEDIT
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem CreateSWDrawView SID_CREATE_SW_DRAWVIEW
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = FALSE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertHyperlinkDlg FN_INSERT_HYPERLINK
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertLinebreak FN_INSERT_LINEBREAK
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertNonBreakingSpace FN_INSERT_HARD_SPACE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertHardHyphen FN_INSERT_HARDHYPHEN
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxUInt16Item PageOffset FN_CHANGE_PAGENUM
[
    SfxVoidItem PageOffsetDialog(SfxUInt16Item nOffset FN_CHANGE_PAGENUM);

    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_OPTIONS;
]

//--------------------------------------------------------------------------
SfxObjectItem InsertPageFooter FN_INSERT_PAGEFOOTER

[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = FALSE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxObjectItem InsertPageHeader FN_INSERT_PAGEHEADER

[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = FALSE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem FieldDialog FN_EDIT_FIELD
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Volatile,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxUInt16Item InsertObjCtrl FN_INSERT_OBJ_CTRL

[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = FALSE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxBoolItem SubScript FN_SET_SUB_SCRIPT

[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertPagebreak FN_INSERT_PAGEBREAK
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem AlignCharTop FN_FRAME_ALIGN_VERT_CHAR_TOP
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* status: */
    SlotType = SfxStringItem

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FRAME;
]

//--------------------------------------------------------------------------
SfxVoidItem AlignRowBottom FN_FRAME_ALIGN_VERT_ROW_BOTTOM
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* status: */
    SlotType = SfxStringItem

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FRAME;
]

//--------------------------------------------------------------------------
SfxVoidItem SwUpdate FN_SBA_BRW_UPDATE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = FALSE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_DATA;
]

//--------------------------------------------------------------------------
SfxVoidItem DelToEndOfPara FN_DELETE_PARA
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertCaptionDialog FN_INSERT_CAPTION
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem AlignVerticalCharCenter FN_FRAME_ALIGN_VERT_CHAR_CENTER
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* status: */
    SlotType = SfxStringItem

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FRAME;
]

//--------------------------------------------------------------------------
SfxVoidItem SendOutlineToClipboard FN_OUTLINE_TO_CLIPBOARD
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_DOCUMENT;
]

//--------------------------------------------------------------------------
SfxBoolItem MirrorOnEvenPages FN_FRAME_MIRROR_ON_EVEN_PAGES
()
[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* status: */
    SlotType = SfxBoolItem

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxBoolItem WrapOff FN_FRAME_NOWRAP
()
[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = TRUE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FRAME;
]

//--------------------------------------------------------------------------
SfxVoidItem AlignRowTop FN_FRAME_ALIGN_VERT_ROW_TOP
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* status: */
    SlotType = SfxStringItem

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FRAME;
]

//--------------------------------------------------------------------------
SfxVoidItem AddAllUnknownWords FN_ADD_UNKNOWN
()
[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = TRUE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_OPTIONS;
]

//--------------------------------------------------------------------------
SfxBoolItem ChainFrames FN_FRAME_CHAIN

[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = TRUE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = FALSE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FRAME;
]

//--------------------------------------------------------------------------
SfxVoidItem Grow FN_GROW_FONT_SIZE
()
[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem ResetAttributes FN_FORMAT_RESET
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertSoftHyphen FN_INSERT_SOFT_HYPHEN
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem FrameDialog FN_FORMAT_FRAME_DLG
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FRAME;
]

//--------------------------------------------------------------------------
SfxVoidItem GraphicDialog FN_FORMAT_GRAFIC_DLG
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_GRAPHIC;
]

//--------------------------------------------------------------------------
SfxVoidItem AlignRight FN_FRAME_ALIGN_HORZ_RIGHT
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FRAME;
]

//--------------------------------------------------------------------------
SfxVoidItem AlignBottom FN_FRAME_ALIGN_VERT_BOTTOM
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* status: */
    SlotType = SfxStringItem

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FRAME;
]

//--------------------------------------------------------------------------
SfxVoidItem AlignVerticalCenter FN_FRAME_ALIGN_VERT_CENTER
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* status: */
    SlotType = SfxStringItem

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FRAME;
]

//--------------------------------------------------------------------------
SfxVoidItem JumpUpThisLevel FN_NUM_BULLET_PREV
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_ENUMERATION;
]

//--------------------------------------------------------------------------
SfxVoidItem AlignHorizontalCenter FN_FRAME_ALIGN_HORZ_CENTER
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FRAME;
]

//--------------------------------------------------------------------------
SfxVoidItem GoToEnd FN_END_TABLE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = FALSE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = FALSE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxBoolItem JumpToNextRegion FN_GOTO_NEXT_REGION
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxBoolItem GotoPrevInputField FN_GOTO_PREV_INPUTFLD
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxBoolItem GotoPrevPlacemarker FN_GOTO_PREV_MARK
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxBoolItem WrapOn FN_FRAME_WRAP
()
[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FRAME;
]

//--------------------------------------------------------------------------
SfxVoidItem PageColumnDialog FN_FORMAT_PAGE_COLUMN_DLG
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxBoolItem GotoPrevIndexMark FN_PREV_TOXMARK
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxBoolItem MirrorGraphicOnEvenPages FN_GRAPHIC_MIRROR_ON_EVEN_PAGES
()
[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* status: */
    SlotType = SfxBoolItem

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertFrameInteract FN_INSERT_FRAME_INTERACT
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* status: */
    SlotType = SfxUInt16Item

    /* config: */
    AccelConfig = FALSE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxBoolItem HScroll FN_HSCROLLBAR

[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_VIEW;
]

//--------------------------------------------------------------------------
SfxVoidItem UpdateCharts FN_UPDATE_CHARTS
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxBoolItem JumpToPrevRegion FN_GOTO_PREV_REGION
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem JumpToReference FN_GOTO_REFERENCE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxVoidItem DistributeColumns FN_TABLE_BALANCE_CELLS
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_TABLE;
]

//--------------------------------------------------------------------------
SfxVoidItem UpdateAll FN_UPDATE_ALL
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxVoidItem GoToAnchor FN_FRAME_TO_ANCHOR
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FRAME;
]

//--------------------------------------------------------------------------
SfxBoolItem Graphic FN_VIEW_GRAPHIC

[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    Readonly = FALSE,
    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_VIEW;
]

//--------------------------------------------------------------------------
SfxVoidItem ObjectBackOne FN_FRAME_UP
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FORMAT;
]

//--------------------------------------------------------------------------
SfxVoidItem InsertTitleField FN_INSERT_FLD_TITLE
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_INSERT;
]

//--------------------------------------------------------------------------
SfxVoidItem EditGlossary FN_GLOSSARY_DLG
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = TRUE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Asynchron;

    /* status: */
    SlotType = SfxBoolItem

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_EDIT;
]

//--------------------------------------------------------------------------
SfxBoolItem GotoNextInputField FN_GOTO_NEXT_INPUTFLD
()
[
    /* flags: */
    AutoUpdate = FALSE,
    Cachable = Cachable,
    FastCall = TRUE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = TRUE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_NAVIGATOR;
]

//--------------------------------------------------------------------------
SfxBoolItem WrapLeft FN_FRAME_WRAP_LEFT
()
[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FRAME;
]

//--------------------------------------------------------------------------
SfxBoolItem WrapRight FN_FRAME_WRAP_RIGHT
()
[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FRAME;
]

//--------------------------------------------------------------------------
SfxBoolItem WrapThrough FN_FRAME_WRAPTHRU
()
[
    /* flags: */
    AutoUpdate = TRUE,
    Cachable = Cachable,
    FastCall = FALSE,
    HasCoreId = FALSE,
    HasDialog = FALSE,
    ReadOnlyDoc = FALSE,
    Toggle = FALSE,
    Container = FALSE,
    Synchron;

    /* config: */
    AccelConfig = TRUE,
    MenuConfig = TRUE,
    StatusBarConfig = FALSE,
    ToolBoxConfig = TRUE,
    GroupId = GID_FRAME;
]

diff --git a/sw/sdi/swslots.hrc b/sw/sdi/swslots.hrc
new file mode 100644
index 0000000..cb4ec51
--- /dev/null
+++ b/sw/sdi/swslots.hrc
@@ -0,0 +1,68 @@
/*************************************************************************
 *
 *  $RCSfile: swslots.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:30 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#include <svx/dialogs.hrc>
#include <basctl/basicide.hrc>
#include <offmgr/sba.hrc>
#include <svx/svxids.hrc>
#include <offmgr/ofaids.hrc>
#include "globals.hrc"
#include "cmdid.h"

diff --git a/sw/sdi/swslots.sdi b/sw/sdi/swslots.sdi
new file mode 100644
index 0000000..e7f3ff6
--- /dev/null
+++ b/sw/sdi/swslots.sdi
@@ -0,0 +1,166 @@
/*------------------------------------------------------------------------

    $Workfile:   SWSLOTS.SDI  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/swslots.sdi,v 1.1.1.1 2000-09-18 17:14:30 hr Exp $

    Beschreibung:   Main - IDL - File fuer Sw3

    (c) Copyright 1989 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/

import "ofa.ilb"

module
"9F76B581-23DD-101C-80B6-000024021835"
"A1810F00-23DE-101C-80B6-000024021835"
StarWriter
[
HelpText( "StarWriter Application" )
SlotIdFile( "swslots.hrc" )
TypeLibFile( "swslots.tlb" )
ModulePrefix( "Sw" )
]
{
    item String SfxTemplateItem;
    item String SvxColumnItem;
    item String SvxLineItem;
    item String SfxSetItem;

    item String TbxDummyItem;

    item String SvxBoxItem;

    item String XFillAttrSetItem;
    item String XFillBitmapItem;
    item String XFillColorItem;
    item String XFillGradientItem;
    item String XFillHatchItem;
    item String XFillStyleItem;
    item String XLineAttrSetItem;
    item String XLineColorItem;
    item String XLineDashItem;
    item String XLineEndItem;
    item String XLineEndWidthItem;
    item String XLineEndCenterItem;
    item String XLineStartItem;
    item String XLineStartWidthItem;
    item String XLineStartCenterItem;
    item String XLineStyleItem;
    item String XLineWidthItem;

    enum Language
    {
        LANGUAGE_DONTKNOW,
        LANGUAGE_SYSTEM
    };
    item Language SvxLanguageItem;

    include "switems.sdi"
    include "swnew.sdi"
    include "swriter.sdi"

    include "_docsh.sdi"
    include "docsh.sdi"
    include "wdocsh.sdi"

    include "wrtapp.sdi"

    include "_basesh.sdi"
    include "basesh.sdi"

    include "_textsh.sdi"
    include "textsh.sdi"
    include "wtextsh.sdi"

    include "_drwbase.sdi"
    include "drwbassh.sdi"
    include "wdrwbase.sdi"

    include "_formsh.sdi"
    include "formsh.sdi"
    include "wformsh.sdi"

    include "drawsh.sdi"
    include "drwtxtsh.sdi"

    include "_listsh.sdi"
    include "listsh.sdi"
    include "wlistsh.sdi"

    include "_frmsh.sdi"
    include "frmsh.sdi"
    include "wfrmsh.sdi"

    include "_tabsh.sdi"
    include "tabsh.sdi"
    include "wtabsh.sdi"

    include "_grfsh.sdi"
    include "grfsh.sdi"
    include "wgrfsh.sdi"

    include "_olesh.sdi"
    include "olesh.sdi"
    include "wolesh.sdi"

    include "beziersh.sdi"

    include "_viewsh.sdi"
    include "viewsh.sdi"
    include "wviewsh.sdi"
}
/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.38  2000/02/01 09:45:00  os
    #72282# SwWebBaseShell removed

    Revision 1.37  1998/06/09 13:37:10  OM
    VC-Controls entfernt


      Rev 1.36   09 Jun 1998 15:37:10   OM
   VC-Controls entfernt

      Rev 1.35   08 Jun 1998 18:08:30   OM
   Forms im HTML-Mode

      Rev 1.34   11 Mar 1998 17:14:00   OM
   DB-FormShell

      Rev 1.33   07 Mar 1998 11:31:22   OS
   idl->sdi - funktioniert aber nicht!

      Rev 1.32   28 Aug 1997 12:37:00   MBA
   Text+HTML in eine IDL

      Rev 1.31   13 Feb 1997 12:45:06   MA
   unnoetige Texte entfernt

      Rev 1.30   31 Jan 1997 13:24:10   OS
   neu: _/wgrfsh _/wolesh

      Rev 1.29   23 Jan 1997 15:41:42   OS
   +_textsh.idl

      Rev 1.28   23 Jan 1997 14:39:50   OS
   Umstellung fuer StarWriter/Web

      Rev 1.27   23 Jan 1997 08:37:16   OS
   neue files fuer Basis-interfaces

      Rev 1.26   22 Jan 1997 11:18:24   OM
   Neue Shells: DrawBaseShell und DrawControlShell

      Rev 1.25   08 Jan 1997 12:39:46   OM
   Neu: Bezier-Shell

      Rev 1.24   27 Sep 1996 09:44:56   OS
   swnew.idl vor swriter.idl

      Rev 1.23   19 Sep 1996 10:53:52   OS
   neuese File: swnew.idl fuer neue Slots

------------------------------------------------------------------------*/
diff --git a/sw/sdi/swslots.src b/sw/sdi/swslots.src
new file mode 100644
index 0000000..a861219
--- /dev/null
+++ b/sw/sdi/swslots.src
@@ -0,0 +1,8925 @@
/*************************************************************************
 *
 *  $RCSfile: swslots.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:30 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#include "cmdid.h"
#include "offmgr/ofaids.hrc"
#include "globals.hrc"

SfxSlotInfo FN_ABSTRACT_NEWDOC
{
    SlotName = "Dokument aus Abstrakt";
    SlotName [ english ] =  "Dokument aus Abstrakt";
    SlotName[ english_us ] = "Document From Abstract";
    SlotName[ portuguese ] = "Documento a partir de Abstracto";
    SlotName[ russian ] = "Äîêóìåíò èç ïðîñìîòðà";
    SlotName[ dutch ] = "Document van extract";
    SlotName[ french ] = "Document d'après synthèse";
    SlotName[ spanish ] = "Documento desde extracto";
    SlotName[ italian ] = "Crea documento dal sunto";
    SlotName[ danish ] = "Dokument fra abstract";
    SlotName[ swedish ] = "Dokument ur utdrag";
    SlotName[ polish ] = "Dokument z Abstraktu";
    SlotName[ portuguese_brazilian ] = "CreateAbstract";
    SlotName[ japanese ] = "±³Äײ݂©‚ç‚Ì•¶‘";
    SlotName[ chinese_simplified ] = "ÎĵµÀ´×ÔÕªÒª";
    SlotName[ chinese_traditional ] = "¤å¥ó±qºK­n";
    SlotName[ arabic ] = "ãÓÊäÏ ãä ÇáÊáÎíÕ";
    SlotName[ dutch ] = "Document van extract";
    SlotName[ chinese_simplified ] = "ÎĵµÀ´×ÔÕªÒª";
    SlotName[ greek ] = "¸ããñáöá áðü Abstract";
    SlotName[ korean ] = "¿ä¾àÀ¸·ÎºÎÅÍ ¹®¼­";
    SlotName[ turkish ] = "Belge özeti çýkar";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_ABSTRACT_STARIMPRESS
{
    SlotName = "Präsentation aus Abstrakt";
    SlotName [ english ] =  "Präsentation aus Abstrakt";
    SlotName[ english_us ] = "Presentation from Abstract";
    SlotName[ portuguese ] = "Apresentação a partir do Abstracto";
    SlotName[ russian ] = "Ïðåçåíòàöèÿ èç ïðîñìîòðà";
    SlotName[ dutch ] = "Presentatie uit extract";
    SlotName[ french ] = "Présentation d'après synthèse";
    SlotName[ spanish ] = "Presentación desde extracto";
    SlotName[ italian ] = "Presentazione dal sunto";
    SlotName[ danish ] = "Præsentation fra abstract";
    SlotName[ swedish ] = "Presentation från Utdrag";
    SlotName[ polish ] = "Prezentacja z Abstraktu";
    SlotName[ portuguese_brazilian ] = "SendAbstractToStarOffice Impress";
    SlotName[ japanese ] = "±³Äײ݂©‚ç‚ÌÌßÚ¾ÞÝð¼®Ý";
    SlotName[ chinese_simplified ] = "ÑÝʾÎĸåÀ´×ÔÕªÒª";
    SlotName[ chinese_traditional ] = "²³ø±qºK­n";
    SlotName[ arabic ] = "ÚÑÖ ÊÞÏíãí ãä ÇáÊáÎíÕ";
    SlotName[ dutch ] = "Presentatie uit extract";
    SlotName[ chinese_simplified ] = "ÑÝʾÎĸåÀ´×ÔÕªÒª";
    SlotName[ greek ] = "Ðáñïõóßáóç áðü Abstract";
    SlotName[ korean ] = "¿ä¾ÇÀ¸·ÎºÎÅÍ ÇÁ¸®Á¨Å×À̼Ç";
    SlotName[ turkish ] = "Sunu özeti çýkar";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_ADD_UNKNOWN
{
    SlotName = "Unbekannte Wörter aufnehmen";
    SlotName [ english ] =  "Unbekannte Wörter aufnehmen";
    SlotName[ english_us ] = "Add Unknown Words";
    SlotName[ portuguese ] = "Adicionar palavras desconhecidas";
    SlotName[ russian ] = "Äîáàâèòü íåçíàêîìûå ñëîâà";
    SlotName[ dutch ] = "Onbekende woorden opnemen";
    SlotName[ french ] = "Ajouter mots inconnus";
    SlotName[ spanish ] = "Aceptar palabras desconocidas";
    SlotName[ italian ] = "Preleva le parole sconosciute";
    SlotName[ danish ] = "Tilføj alle ukendte ord";
    SlotName[ swedish ] = "Lägg till okända ord";
    SlotName[ polish ] = "Do³¹cz nieznane s³owa";
    SlotName[ portuguese_brazilian ] = "AddAllUnknownWords";
    SlotName[ japanese ] = "Ž«‘‚ɒljÁ";
    SlotName[ chinese_simplified ] = "ÌíÈë²»Ã÷µÄ×Ö";
    SlotName[ chinese_traditional ] = "¥[¤J¤£©úªº¦r";
    SlotName[ arabic ] = "ÅÖÇÝÉ ÇáßáãÇÊ ÇáÛíÑ ãÚÑæÝÉ";
    SlotName[ dutch ] = "Onbekende woorden opnemen";
    SlotName[ chinese_simplified ] = "ÌíÈë²»Ã÷µÄ×Ö";
    SlotName[ greek ] = "Ðñüóèåóç Üãíùóôùí ëÝîåùí";
    SlotName[ korean ] = "¾Ë·ÁÁöÁö¾ÊÀº ´Ü¾î Ãß°¡";
    SlotName[ turkish ] = "Bilinmeyen sözcükler ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_AUTO_CORRECT
{
    SlotName = "AutoKorrektur";
    SlotName [ english ] =  "AutoKorrektur";
    SlotName[ english_us ] = "AutoCorrect";
    SlotName[ portuguese ] = "AutoCorrecção";
    SlotName[ russian ] = "Àâòîçàìåíà";
    SlotName[ dutch ] = "AutoCorrectie";
    SlotName[ french ] = "AutoCorrection";
    SlotName[ spanish ] = "AutoCorrección";
    SlotName[ italian ] = "Correzione automatica";
    SlotName[ danish ] = "AutoKorrektur";
    SlotName[ swedish ] = "AutoKorrigering";
    SlotName[ polish ] = "Autokorekta";
    SlotName[ portuguese_brazilian ] = "StartAutoCorrect";
    SlotName[ japanese ] = "µ°ÄºÚ¸Ä";
    SlotName[ chinese_simplified ] = "×Ô¶¯¸üÕý";
    SlotName[ chinese_traditional ] = "¦Û°Ê®Õ¥¿";
    SlotName[ arabic ] = "ÊÕÍíÍ ÊáÞÇÆí";
    SlotName[ dutch ] = "AutoCorrectie";
    SlotName[ chinese_simplified ] = "×Ô¶¯¸üÕý";
    SlotName[ greek ] = "ÁõôïÄéüñèùóç";
    SlotName[ korean ] = "ÀÚµ¿ °íħ";
    SlotName[ turkish ] = "Otomatik düzeltme";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_AUTO_CORRECT_DLG
{
    SlotName = "AutoKorrektur bearbeiten";
    SlotName [ english ] =  "AutoKorrektur bearbeiten";
    SlotName[ english_us ] = "Edit AutoCorrect";
    SlotName[ portuguese ] = "Editar AutoCorrecção";
    SlotName[ russian ] = "Ïðàâêà àâòîçàìåíû";
    SlotName[ dutch ] = "AutoCorrectie bewerken";
    SlotName[ french ] = "Modifier AutoCorrection";
    SlotName[ spanish ] = "Editar AutoCorrección";
    SlotName[ italian ] = "Modifica correzione automatica";
    SlotName[ danish ] = "Rediger AutoKorrektur";
    SlotName[ swedish ] = "Redigera AutoKorrigering";
    SlotName[ polish ] = "Edytuj autokorektê";
    SlotName[ portuguese_brazilian ] = "ToolsAutoCorrect";
    SlotName[ japanese ] = "µ°ÄºÚ¸Ä‚̕ҏW";
    SlotName[ chinese_simplified ] = "±à¼­×Ô¶¯¸üÕý";
    SlotName[ chinese_traditional ] = "½s¿è¦Û°Ê®Õ¥¿";
    SlotName[ arabic ] = "ÊÍÑíÑ ÇáÊÕÍíÍ ÇáÊáÞÇÆí";
    SlotName[ dutch ] = "AutoCorrectie bewerken";
    SlotName[ chinese_simplified ] = "±à¼­×Ô¶¯¸üÕý";
    SlotName[ greek ] = "Åðåîåñãáóßá ÁõôïÄéüñèùóç";
    SlotName[ korean ] = "ÀÚµ¿ °íħ ÆÄÀÏ ¼öÁ¤";
    SlotName[ turkish ] = "Otomatik düzelt dosyasýný düzenle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_AUTOFORMAT_APPLY
{
    SlotName = "AutoFormat-Optionen anwenden";
    SlotName [ english ] =  "AutoFormat-Optionen anwenden";
    SlotName[ english_us ] = "Apply AutoFormat Options";
    SlotName[ portuguese ] = "Aplicar opções de AutoFormato";
    SlotName[ russian ] = "Ïðèìåíèòü ïàðàìåòðû àâòîôîðìàòà";
    SlotName[ dutch ] = "AutoOpmaak-opties toepassen";
    SlotName[ french ] = "Utiliser les options de l'AutoFormat";
    SlotName[ spanish ] = "Aplicar opciones AutoFormato";
    SlotName[ italian ] = "Applica le opzioni di AutoFormat";
    SlotName[ danish ] = "Anvend AutoFormat-indstillinger";
    SlotName[ swedish ] = "Använd AutoFormat";
    SlotName[ polish ] = "U¿yj opcji autoformatowania";
    SlotName[ portuguese_brazilian ] = "AutoFormatApply";
    SlotName[ japanese ] = "µ°ÄÌ«°Ï¯Ä‚̵Ìß¼®Ý‚ð“K—p";
    SlotName[ chinese_simplified ] = "²ÉÓÃ×Ô¶¯¸ñʽѡÏî";
    SlotName[ chinese_traditional ] = "¨Ï¥Î¦Û°Ê®æ¦¡¿ï¶µ";
    SlotName[ arabic ] = "ÇÓÊÎÏÇã ÎíÇÑÇÊ AutoFormat";
    SlotName[ dutch ] = "AutoOpmaak-opties toepassen";
    SlotName[ chinese_simplified ] = "²ÉÓÃ×Ô¶¯¸ñʽѡÏî";
    SlotName[ greek ] = "ÅöáñìïãÞ åðéëïãþí ÁõôïÌïñöïðïßçóçò";
    SlotName[ korean ] = "ÀÚµ¿ ¼­½Ä ¿É¼Ç Àû¿ë";
    SlotName[ turkish ] = "Otomatik formatlama seçeneklerini uygula";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_AUTOFORMAT_AUTO
{
    SlotName = "AutoFormat";
    SlotName [ english ] =  "AutoFormat";
    SlotName[ english_us ] = "AutoFormat";
    SlotName[ portuguese ] = "AutoFormato";
    SlotName[ russian ] = "Àâòîôîðìàò";
    SlotName[ dutch ] = "AutoOpmaak";
    SlotName[ french ] = "AutoFormat";
    SlotName[ spanish ] = "AutoFormato";
    SlotName[ italian ] = "Foramttazione automatica";
    SlotName[ danish ] = "AutoFormat";
    SlotName[ swedish ] = "AutoFormat";
    SlotName[ polish ] = "Autoformatowanie";
    SlotName[ japanese ] = "µ°ÄÌ«°Ï¯Ä";
    SlotName[ chinese_simplified ] = "×Ô¶¯¸ñʽ";
    SlotName[ chinese_traditional ] = "¦Û°Ê®æ¦¡";
    SlotName[ arabic ] = "ÊäÓíÞ ÊáÞÇÆí";
    SlotName[ dutch ] = "AutoOpmaak";
    SlotName[ chinese_simplified ] = "×Ô¶¯¸ñʽ";
    SlotName[ greek ] = "ÁõôïÌïñöïðïßçóç";
    SlotName[ korean ] = "ÀÚµ¿ ¼­½Ä";
    SlotName[ turkish ] = "Otomatik formatlama";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_AUTOFORMAT_REDLINE_APPLY
{
    SlotName = "AutoFormat-Optionen anwenden und Änderungen bestätigen";
    SlotName [ english ] =  "AutoFormat-Optionen anwenden und Änderungen bestätigen";
    SlotName[ english_us ] = "Apply AutoFormat Options and confirm Changes";
    SlotName[ portuguese ] = "Aplicar opções de AutoFormato e confirmar modificações";
    SlotName[ russian ] = "Ïðèìåíèòü ïàðàìåòðû àâòîôîðìàòà è ïîäòâåðäèòü èçìåíåíèÿ";
    SlotName[ dutch ] = "AutoOpmaak-opties toepassen en wijzigingen bevestigen";
    SlotName[ french ] = "Utiliser les options d'AutoFormat et confirmer les modifications";
    SlotName[ spanish ] = "AutoFormato-Aplicar opciones y confirmar modificaciones";
    SlotName[ italian ] = "Applica le opzioni della Formattazione automatica e conferma le modifiche";
    SlotName[ danish ] = "Anvend AutoFormat-indstillinger og bekræft ændringer";
    SlotName[ swedish ] = "Använd AutoFormat-alternativ och bekräfta ändringar";
    SlotName[ polish ] = "Zastosuj opcje autoformatowania i potwierdŸ zmiany";
    SlotName[ portuguese_brazilian ] = "AutoFormatRedlineApply";
    SlotName[ japanese ] = "µ°ÄÌ«°Ï¯Ä‚̵Ìß¼®Ý‚ð“K—p‚µ‚ĕύX‚ðŠm”F";
    SlotName[ chinese_simplified ] = "ʹÓÃ×Ô¶¯¸ñʽѡÏȷ¶¨¸ü¸Ä";
    SlotName[ chinese_traditional ] = "¨Ï¥Î¦Û°Ê®æ¦¡¿ï¶µ¨Ã½T©wÅܧó";
    SlotName[ arabic ] = "ÇÓÊÎÏÇã ÎíÇÑÇÊ AutoFormat æÊÃßíÏ ÇáÊÛííÑÇÊ";
    SlotName[ dutch ] = "AutoOpmaak-opties toepassen en wijzigingen bevestigen";
    SlotName[ chinese_simplified ] = "ʹÓÃ×Ô¶¯¸ñʽѡÏȷ¶¨¸ü¸Ä";
    SlotName[ greek ] = "ÅöáñìïãÞ åðéëïãþí ÁõôïÌïñöïðïßçóçò êáé åðéâåâáßùóç áëëáãþí";
    SlotName[ korean ] = "ÀÚµ¿ ¼­½Ä ¿É¼Ç°ú º¯°æÈ®ÀÎ Àû¿ë";
    SlotName[ turkish ] = "Otomatik formatlama seçeneklerini uygula ve deðiþiklikleri onayla";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_BACKSPACE
{
    SlotName = "Rückschritt";
    SlotName [ english ] =  "Rückschritt";
    SlotName[ english_us ] = "Backspace";
    SlotName[ portuguese ] = "Retroceder";
    SlotName[ russian ] = "Âîçâðàò";
    SlotName[ dutch ] = "Backspace";
    SlotName[ french ] = "Ret. Arr.";
    SlotName[ spanish ] = "Retroceder";
    SlotName[ italian ] = "Backspace";
    SlotName[ danish ] = "Tilbage";
    SlotName[ swedish ] = "Backsteg";
    SlotName[ polish ] = "Cofnij";
    SlotName[ portuguese_brazilian ] = "Backspace";
    SlotName[ japanese ] = "ÊÞ¯¸½Íß°½";
    SlotName[ chinese_simplified ] = "Í˸ñ";
    SlotName[ chinese_traditional ] = "ºM®ø©R¥O";
    SlotName[ arabic ] = "ÊÑÇÌÚ";
    SlotName[ dutch ] = "Backspace";
    SlotName[ chinese_simplified ] = "Í˸ñ";
    SlotName[ language_user1 ] = " ";
    SlotName[ greek ] = "Backspace";
    SlotName[ korean ] = "¹é ½ºÆäÀ̽º";
    SlotName[ turkish ] = "Geri al";
};
SfxSlotInfo FN_CALC_TABLE
{
    SlotName = "Tabelle berechnen";
    SlotName [ english ] =  "Tabelle berechnen";
    SlotName[ english_us ] = "Calculate Table";
    SlotName[ portuguese ] = "Calcular tabela";
    SlotName[ russian ] = "Âû÷èñëèòü òàáëèöó";
    SlotName[ dutch ] = "Tabel berekenen";
    SlotName[ french ] = "Calculer le tableau";
    SlotName[ spanish ] = "Calcular tabla";
    SlotName[ italian ] = "Calcola tabella";
    SlotName[ danish ] = "Beregn tabel";
    SlotName[ swedish ] = "Beräkna tabell";
    SlotName[ polish ] = "Oblicz tabelê";
    SlotName[ portuguese_brazilian ] = "CalculateTable";
    SlotName[ japanese ] = "•\\‚ÌŒvŽZ";
    SlotName[ chinese_simplified ] = "ÔËË㹤×÷±í";
    SlotName[ chinese_traditional ] = "¹Bºâ¤u§@ªí";
    SlotName[ arabic ] = "ÍÓÇÈ ÌÏæá";
    SlotName[ dutch ] = "Tabel berekenen";
    SlotName[ chinese_simplified ] = "ÔËË㹤×÷±í";
    SlotName[ language_user1 ] = " ";
    SlotName[ greek ] = "Õðïëïãéóìüò ðßíáêá";
    SlotName[ korean ] = "Ç¥ °è»ê";
    SlotName[ turkish ] = "Tabloyu hesapla";
};
SfxSlotInfo FN_CALCULATE
{
    SlotName = "Auswahl berechnen";
    SlotName [ english ] =  "Auswahl berechnen";
    SlotName[ english_us ] = "Calculate Selection";
    SlotName[ portuguese ] = "Calcular selecção";
    SlotName[ russian ] = "Âû÷èñëèòü âûäåëåííîå";
    SlotName[ dutch ] = "Selectie berekenen";
    SlotName[ french ] = "Calculer sélection";
    SlotName[ spanish ] = "Calcular selección";
    SlotName[ italian ] = "Calcola selezione";
    SlotName[ danish ] = "Beregn markering";
    SlotName[ swedish ] = "Beräkna urval";
    SlotName[ polish ] = "Oblicz selekcjê";
    SlotName[ portuguese_brazilian ] = "CalculateSel";
    SlotName[ japanese ] = "‘I‘ð”͈͂̌vŽZ";
    SlotName[ chinese_simplified ] = "ÔËËãÑ¡¶¨ÇøÓò";
    SlotName[ chinese_traditional ] = "¹Bºâ¿ï¨ú°Ï°ì";
    SlotName[ arabic ] = "ÍÓÇÈ ÇáÊÍÏíÏ";
    SlotName[ dutch ] = "Selectie berekenen";
    SlotName[ chinese_simplified ] = "ÔËËãÑ¡¶¨ÇøÓò";
    SlotName[ greek ] = "Õðïëïãïóìüò åðéëïãÞò";
    SlotName[ korean ] = "¼±Åà °è»ê";
    SlotName[ turkish ] = "Seçimi hesapla";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_CHANGE_DBFIELD
{
    SlotName = "Datenbank ändern";
    SlotName [ english ] =  "Datenbank ändern";
    SlotName[ english_us ] = "Change Database";
    SlotName[ portuguese ] = "Alterar base de dados";
    SlotName[ russian ] = "Èçìåíèòü áàçó äàííûõ";
    SlotName[ dutch ] = "Database veranderen";
    SlotName[ french ] = "Modifier base de données";
    SlotName[ spanish ] = "Modificar base de datos";
    SlotName[ italian ] = "Cambia database";
    SlotName[ danish ] = "Modificer database";
    SlotName[ swedish ] = "Ändra databas";
    SlotName[ polish ] = "Zmieñ bazê danych";
    SlotName[ portuguese_brazilian ] = "InsertDatabaseModify";
    SlotName[ japanese ] = "ÃÞ°ÀÍÞ°½‚̕ύX";
    SlotName[ chinese_simplified ] = "ÐÞ¸ÄÊý¾Ý¿â";
    SlotName[ chinese_traditional ] = "­×§ï¸ê®Æ®w";
    SlotName[ arabic ] = "ÊÚÏíá ÞÇÚÏÉ ÇáÈíÇäÇÊ";
    SlotName[ dutch ] = "Database veranderen";
    SlotName[ chinese_simplified ] = "ÐÞ¸ÄÊý¾Ý¿â";
    SlotName[ greek ] = "ÁëëáãÞ âÜóçò äåäïìåíþí";
    SlotName[ korean ] = "µ¥ÀÌÅͺ£À̽º ¼öÁ¤";
    SlotName[ turkish ] = "Veritabanýný düzenle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_CHANGE_PAGENUM
{
    SlotName = "Seitennummer";
    SlotName [ english ] =  "Seitennummer";
    SlotName[ english_us ] = "Page Number";
    SlotName[ portuguese ] = "Número de página";
    SlotName[ russian ] = "Íîìåð ñòðàíèöû";
    SlotName[ dutch ] = "Paginanummer";
    SlotName[ french ] = "Numéro de page";
    SlotName[ spanish ] = "Número de página";
    SlotName[ italian ] = "Numeri di pagina";
    SlotName[ danish ] = "Sidetal";
    SlotName[ swedish ] = "Sidnummer";
    SlotName[ polish ] = "Numer strony";
    SlotName[ portuguese_brazilian ] = "ToolsPageNumber";
    SlotName[ japanese ] = "Íß°¼Þ”ԍ†";
    SlotName[ chinese_simplified ] = "Ò³Âë";
    SlotName[ chinese_traditional ] = "­¶½X";
    SlotName[ arabic ] = "ÑÞã ÇáÕÝÍÉ";
    SlotName[ dutch ] = "Paginanummer";
    SlotName[ chinese_simplified ] = "Ò³Âë";
    SlotName[ greek ] = "Áñéèìüò óåëßäáò";
    SlotName[ korean ] = "ÆäÀÌÁö ¹øÈ£";
    SlotName[ turkish ] = "Sayfa numarasý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_CHAR_LEFT
{
    SlotName = "Zeichen links";
    SlotName [ english ] =  "Zeichen links";
    SlotName[ english_us ] = "To Character Left";
    SlotName[ portuguese ] = "Carácter à esquerda";
    SlotName[ russian ] = "Çíàê ñëåâà";
    SlotName[ dutch ] = "Teken links";
    SlotName[ french ] = "Caractère à gauche";
    SlotName[ spanish ] = "Carácter a la izquierda";
    SlotName[ italian ] = "Carattere sinistro";
    SlotName[ danish ] = "Tegn til venstre";
    SlotName[ swedish ] = "Tecken till vänster";
    SlotName[ polish ] = "Znak z lewej strony";
    SlotName[ portuguese_brazilian ] = "GoLeft";
    SlotName[ japanese ] = "•¶Žš‚̍¶";
    SlotName[ chinese_simplified ] = "תµ½×Ö·û×ó¶Ë";
    SlotName[ chinese_traditional ] = "Âà¨ì¦r¤¸­ººÝ";
    SlotName[ arabic ] = "ÍÑÝ ááÎáÝ";
    SlotName[ dutch ] = "Teken links";
    SlotName[ chinese_simplified ] = "תµ½×Ö·û×ó¶Ë";
    SlotName[ greek ] = "×áñáêôÞñáò áñéóôåñÜ";
    SlotName[ korean ] = "¹®ÀÚ ¿ÞÂÊÀ¸·Î";
    SlotName[ turkish ] = "Soldaki karakter";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_CHAR_LEFT_SEL
{
    SlotName = "Zeichen links selektieren";
    SlotName [ english ] =  "Zeichen links selektieren";
    SlotName[ english_us ] = "Select Character Left";
    SlotName[ portuguese ] = "Seleccionar carácter à esquerda";
    SlotName[ russian ] = "Âûäåëèòü çíàê ñëåâà";
    SlotName[ dutch ] = "Tekens links selecteren";
    SlotName[ french ] = "Sélect. caratère à gauche";
    SlotName[ spanish ] = "Seleccionar carácter a la izquierda";
    SlotName[ italian ] = "Seleziona carattere sinistro";
    SlotName[ danish ] = "Marker tegn til venstre";
    SlotName[ swedish ] = "Markera tecken till vänster";
    SlotName[ polish ] = "Zaznacz znak z lewej strony";
    SlotName[ portuguese_brazilian ] = "CharLeftMark";
    SlotName[ japanese ] = "•¶Žš‚̍¶‚ð‘I‘ð";
    SlotName[ chinese_simplified ] = "×óÏòÑ¡Ôñ×Ö·û";
    SlotName[ chinese_traditional ] = "¥ª¦V¿ï¾Ü¦r¤¸";
    SlotName[ arabic ] = "ÊÍÏíÏ ÇáÍÑÝ ÇáÓÇÈÞ";
    SlotName[ dutch ] = "Tekens links selecteren";
    SlotName[ chinese_simplified ] = "×óÏòÑ¡Ôñ×Ö·û";
    SlotName[ greek ] = "ÅðéëïãÞ áñéóôåñïý ÷áñáêôÞñá";
    SlotName[ korean ] = "¹®ÀÚ ¿ÞÂÊ ¼±ÅÃ";
    SlotName[ turkish ] = "Soldaki karakteri seç";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_CHAR_RIGHT
{
    SlotName = "Zeichen rechts";
    SlotName [ english ] =  "Zeichen rechts";
    SlotName[ english_us ] = "Go Right";
    SlotName[ portuguese ] = "Carácter à direita";
    SlotName[ russian ] = "Çíàê ñïðàâà";
    SlotName[ dutch ] = "Teken rechts";
    SlotName[ french ] = "Caractère à droite";
    SlotName[ spanish ] = "Carácter a la derecha";
    SlotName[ italian ] = "Carattere a destra";
    SlotName[ danish ] = "Tegn til højre";
    SlotName[ swedish ] = "Tecken till höger";
    SlotName[ polish ] = "Znaki z prawej strony";
    SlotName[ portuguese_brazilian ] = "GoRight";
    SlotName[ japanese ] = "•¶Žš‚̉E";
    SlotName[ chinese_simplified ] = "×Ö·ûÏòÓÒ";
    SlotName[ chinese_traditional ] = "¦r¤¸¦V¥k";
    SlotName[ arabic ] = "ÃÍÑÝ Åáì Çáíãíä";
    SlotName[ dutch ] = "Teken rechts";
    SlotName[ chinese_simplified ] = "×Ö·ûÏòÓÒ";
    SlotName[ greek ] = "×áñáêôÞñáò äåîéÜ";
    SlotName[ korean ] = "¿À¸¥ÂÊÀ¸·Î °¡±â";
    SlotName[ turkish ] = "Saðdaki karakter";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_CHAR_RIGHT_SEL
{
    SlotName = "Zeichen rechts selektieren";
    SlotName [ english ] =  "Zeichen rechts selektieren";
    SlotName[ english_us ] = "Select Character Right";
    SlotName[ portuguese ] = "Seleccionar carácter à direita";
    SlotName[ russian ] = "Âûäåëèòü çíàê ñïðàâà";
    SlotName[ dutch ] = "Teken rechts selecteren";
    SlotName[ french ] = "Sélect. caractère à droite";
    SlotName[ spanish ] = "Seleccionar carácter a la derecha";
    SlotName[ italian ] = "Seleziona carattere destro";
    SlotName[ danish ] = "Marker tegn til højre";
    SlotName[ swedish ] = "Markera tecken till höger";
    SlotName[ polish ] = "Zaznacz znak z prawej strony";
    SlotName[ portuguese_brazilian ] = "CharRightMark";
    SlotName[ japanese ] = "•¶Žš‚̉E‚ð‘I‘ð";
    SlotName[ chinese_simplified ] = "ÓÒÏòÑ¡Ôñ×Ö·û";
    SlotName[ chinese_traditional ] = "¦V¥k¿ï¾Ü¦r¤¸";
    SlotName[ arabic ] = "ÊÍÏíÏ ÇáÍÑÝ ÇáÊÇáí";
    SlotName[ dutch ] = "Teken rechts selecteren";
    SlotName[ chinese_simplified ] = "ÓÒÏòÑ¡Ôñ×Ö·û";
    SlotName[ greek ] = "ÅðéëïãÞ äåîéïý ÷áñáêôÞñá";
    SlotName[ korean ] = "¹®ÀÚ ¿À¸¥ÂÊ ¼±ÅÃ";
    SlotName[ turkish ] = "Saðdaki karakteri seç";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_CNTNT_TO_NEXT_FRAME
{
    SlotName = "Zum nächsten Rahmen";
    SlotName [ english ] =  "Zum nächsten Rahmen";
    SlotName[ english_us ] = "To Next Frame";
    SlotName[ portuguese ] = "Moldura seguinte";
    SlotName[ russian ] = "Äî ñëåäóþùåé ðàìêè";
    SlotName[ dutch ] = "Naar het volgende kader";
    SlotName[ french ] = "Cadre suivant";
    SlotName[ spanish ] = "Ir al marco siguiente";
    SlotName[ italian ] = "Alla cornice successiva";
    SlotName[ danish ] = "Til næste ramme";
    SlotName[ swedish ] = "Till nästa ram";
    SlotName[ polish ] = "Do nastêpnej ramki";
    SlotName[ portuguese_brazilian ] = "ContentsToNextFrame";
    SlotName[ japanese ] = "ŽŸ‚̘g‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÏÂÒ»¸ö¿ò";
    SlotName[ chinese_traditional ] = "Âà¨ì¤U¤@­Ó®Ø";
    SlotName[ arabic ] = "Åáì ÇáÅØÇÑ ÇáÊÇáí";
    SlotName[ dutch ] = "Naar het volgende kader";
    SlotName[ chinese_simplified ] = "תµ½ÏÂÒ»¸ö¿ò";
    SlotName[ greek ] = "Åðüìåíï ðëáßóéï";
    SlotName[ korean ] = "´ÙÀº ÇÁ·¹ÀÓÀ¸·Î";
    SlotName[ turkish ] = "Sonraki çerçeveye git";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_CONVERT_TEXT_TABLE
{
    SlotName = "Konvertiere Tabelle/Text";
    SlotName [ english ] =  "Konvertiere Tabelle/Text";
    SlotName[ english_us ] = "Convert Table/Text";
    SlotName[ portuguese ] = "Converter Tabela/Texto";
    SlotName[ russian ] = "Ïðåîáðàçîâàòü òàáëèöó â òåêñò";
    SlotName[ dutch ] = "Converteer tabel/tekst";
    SlotName[ french ] = "Conversion tableau/texte";
    SlotName[ spanish ] = "ConvertirTabla/Texto";
    SlotName[ italian ] = "Converti tabella/testo";
    SlotName[ danish ] = "Konverter tabel/tekst";
    SlotName[ swedish ] = "Konvertera tabell/text";
    SlotName[ polish ] = "Konwertuj tabelê/tekst";
    SlotName[ portuguese_brazilian ] = "ConvertTableText";
    SlotName[ japanese ] = "•\\/÷½Ä‚̕ϊ·";
    SlotName[ chinese_simplified ] = "ת»» ±í¸ñ/Îı¾";
    SlotName[ chinese_traditional ] = "Âà´«¦¨ªí®æ/¤å¦r";
    SlotName[ arabic ] = "ÊÍæíá ÌÏæá/äÕ";
    SlotName[ dutch ] = "Converteer tabel/tekst";
    SlotName[ chinese_simplified ] = "ת»» ±í¸ñ/Îı¾";
    SlotName[ greek ] = "ÌåôáôñïðÞ ðßíáêá/êåßìåíï";
    SlotName[ korean ] = "Ç¥/ÅØ½ºÆ® º¯È¯";
    SlotName[ turkish ] = "Tablo/metin dönüþtür";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_DEC_INDENT_OFFSET
{
    SlotName = "Einzug um Betrag vermindern";
    SlotName [ english ] =  "Einzug um Betrag vermindern";
    SlotName[ english_us ] = "Decrement Indent Value";
    SlotName[ portuguese ] = "Diminuir avanço de texto";
    SlotName[ russian ] = "Óìåíüøèòü îòñóï ñîãëàñíî çíà÷åíèÿ";
    SlotName[ dutch ] = "Inspringing om getal verkleinen";
    SlotName[ french ] = "Diminuer le retrait de";
    SlotName[ spanish ] = "Disminuir sangría en";
    SlotName[ italian ] = "Riduci rientro valore";
    SlotName[ danish ] = "Formindsk indrykning om værdi";
    SlotName[ swedish ] = "Minska indrag med enhet";
    SlotName[ polish ] = "Zmniejsz wciêcie o wartoœæ";
    SlotName[ portuguese_brazilian ] = "DecrementIndentValue";
    SlotName[ japanese ] = "²ÝÃÞÝĂ̒l‚ðŒ¸‚ç‚·";
    SlotName[ chinese_simplified ] = "¼õÉÙËõ½øÖµ";
    SlotName[ chinese_traditional ] = "´î¤ÖÁY±Æ­È";
    SlotName[ arabic ] = "ÅäÞÇÕ ãÞÏÇÑ ÇáÅÒÇÍÉ";
    SlotName[ dutch ] = "Inspringing om getal verkleinen";
    SlotName[ chinese_simplified ] = "¼õÉÙËõ½øÖµ";
    SlotName[ greek ] = "Ìåßùóç åóï÷Þò êáôÜ ôçí ôéìÞ";
    SlotName[ korean ] = "µé¿©¾²±â °ª  °¨¼Ò";
    SlotName[ turkish ] = "Girintiyi küçült";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_DELETE_BACK_LINE
{
    SlotName = "Bis Zeilenanfang löschen";
    SlotName [ english ] =  "Bis Zeilenanfang löschen";
    SlotName[ english_us ] = "Delete to Start of Line";
    SlotName[ portuguese ] = "Eliminar até ao início da linha";
    SlotName[ russian ] = "Âûäåëèòü äî íà÷àëà ñòðîêè";
    SlotName[ dutch ] = "Tot regelbegin wissen";
    SlotName[ french ] = "Supprimer jusq'au début de la ligne";
    SlotName[ spanish ] = "Eliminar hasta el comienzo de la línea";
    SlotName[ italian ] = "Cancella fino all'inzio della riga";
    SlotName[ danish ] = "Slet til begyndelsen af rækken";
    SlotName[ swedish ] = "Radera till början av rad";
    SlotName[ polish ] = "Usuñ do pocz¹tku wiersza";
    SlotName[ portuguese_brazilian ] = "DelToStartOfLine";
    SlotName[ japanese ] = "s“ª‚܂ō폜";
    SlotName[ chinese_simplified ] = "ɾ³ýÖÁÐÐÊ×";
    SlotName[ chinese_traditional ] = "§R°£¦Ü¦æ­º";
    SlotName[ arabic ] = "ÍÐÝ ÍÊì ÈÏÇíÉ ÇáÓØÑ";
    SlotName[ dutch ] = "Tot regelbegin wissen";
    SlotName[ chinese_simplified ] = "ɾ³ýÖÁÐÐÊ×";
    SlotName[ greek ] = "ÄéáãñáöÞ åþò ôçí áñ÷Þ ôçò ãñáììÞò";
    SlotName[ korean ] = "ÁÙ ½ÃÀÛ¿¡ »èÁ¦";
    SlotName[ turkish ] = "Satýr baþýna kadar sil";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_DELETE_BACK_PARA
{
    SlotName = "Bis Absatzanfang löschen";
    SlotName [ english ] =  "Bis Absatzanfang löschen";
    SlotName[ english_us ] = "Delete to Start of Paragraph";
    SlotName[ portuguese ] = "Eliminar até ao início do parágrafo";
    SlotName[ russian ] = "Óäàëèòü äî íà÷àëà àáçàöà";
    SlotName[ dutch ] = "Tot aan begin alinea wissen";
    SlotName[ french ] = "Supprimer jusqu'au début du paragraphe";
    SlotName[ spanish ] = "Eliminar hasta el comienzo del párrafo";
    SlotName[ italian ] = "Cancella fino alla fine del paragrafo";
    SlotName[ danish ] = "Slet til begyndelsen af afsnittet";
    SlotName[ swedish ] = "Radera till början av stycke";
    SlotName[ polish ] = "Usuñ do pocz¹tku akapitu";
    SlotName[ portuguese_brazilian ] = "DelToStartOfParagraph";
    SlotName[ japanese ] = "’i—Ž“ª‚܂ō폜";
    SlotName[ chinese_simplified ] = "ɾ³ýÖÁ¶ÎÂäÊ×¶Ë";
    SlotName[ chinese_traditional ] = "§R°£¦Ü¬q¸¨­ººÝ";
    SlotName[ arabic ] = "ÍÐÝ ÍÊì ÈÏÇíÉ ÇáÝÞÑÉ";
    SlotName[ dutch ] = "Tot aan begin alinea wissen";
    SlotName[ chinese_simplified ] = "ɾ³ýÖÁ¶ÎÂäÊ×¶Ë";
    SlotName[ greek ] = "ÄéáãñáöÞ åþò ôçí áñ÷Þ ôçò ðáñáãñÜöïõ";
    SlotName[ korean ] = "´Ü¶ôÀÇ ½ÃÀÛ¿¡ »èÁ¦";
    SlotName[ turkish ] = "Paragraf baþýna kadar sil";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_DELETE_BACK_SENT
{
    SlotName = "Bis Satzanfang löschen";
    SlotName [ english ] =  "Bis Satzanfang löschen";
    SlotName[ english_us ] = "Delete to Start of Sentence";
    SlotName[ portuguese ] = "Eliminar até ao início da frase";
    SlotName[ russian ] = "Óäàëèòü äî íà÷àëà ñòðàíèöû";
    SlotName[ dutch ] = "Tot aan begin van de zin wissen";
    SlotName[ french ] = "Suppr. jusqu'au début de la page";
    SlotName[ spanish ] = "Eliminar hasta el comienzo de la frase";
    SlotName[ italian ] = "Cancella fino all'inizio della frase";
    SlotName[ danish ] = "Slet til begyndelsen af sætningen";
    SlotName[ swedish ] = "Radera till början av meningen";
    SlotName[ polish ] = "Usuñ do pocz¹tku zdania";
    SlotName[ portuguese_brazilian ] = "DelToStartOfSentence";
    SlotName[ japanese ] = "•¶“ª‚܂ō폜";
    SlotName[ chinese_simplified ] = "ɾ³ýÖÁ¾äÊ×";
    SlotName[ chinese_traditional ] = "§R°£¦Ü¬q¸¨­ººÝ";
    SlotName[ arabic ] = "ÍÐÝ ÍÊì ÈÏÇíÉ ÇáÌãáÉ";
    SlotName[ dutch ] = "Tot aan begin van de zin wissen";
    SlotName[ chinese_simplified ] = "ɾ³ýÖÁ¾äÊ×";
    SlotName[ greek ] = "ÄéáãñáöÞ åþò ôçí áñ÷Þ ôçò ðñüôáóçò";
    SlotName[ korean ] = "¹®ÀåÀÇ ½ÃÀÛ¿¡ »èÁ¦";
    SlotName[ turkish ] = "Cümle baþýna kadar sil";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_DELETE_BACK_WORD
{
    SlotName = "Bis Wortanfang löschen";
    SlotName [ english ] =  "Bis Wortanfang löschen";
    SlotName[ english_us ] = "Delete to Start of Word";
    SlotName[ portuguese ] = "Eliminar até ao início da palavra";
    SlotName[ russian ] = "Óäàëèòü äî íà÷àëà ñëîâà";
    SlotName[ dutch ] = "Tot aan woordbegin wissen";
    SlotName[ french ] = "Supprimer jusqu'au début du mot";
    SlotName[ spanish ] = "Eliminar hasta el comienzo de la palabra";
    SlotName[ italian ] = "Cancella fino all'inizio della parola";
    SlotName[ danish ] = "Slet til begyndelsen af ordet";
    SlotName[ swedish ] = "Radera till början av ord";
    SlotName[ polish ] = "Usuñ do pocz¹tku s³owa";
    SlotName[ portuguese_brazilian ] = "DelToStartOfWord";
    SlotName[ japanese ] = "Œê“ª‚܂ō폜";
    SlotName[ chinese_simplified ] = "ɾ³ýÖÁ×ÖÊ×";
    SlotName[ chinese_traditional ] = "§R°£¦Ü¦r­º";
    SlotName[ arabic ] = "ÍÐÝ ÍÊì ÈÏÇíÉ ÇáßáãÉ";
    SlotName[ dutch ] = "Tot aan woordbegin wissen";
    SlotName[ chinese_simplified ] = "ɾ³ýÖÁ×ÖÊ×";
    SlotName[ greek ] = "ÄéáãñáöÞ åþò ôçí áñ÷Þ ôçò ëÝîçò";
    SlotName[ korean ] = "´Ü¾îÀÇ ½ÃÀÛ¿¡ »èÁ¦";
    SlotName[ turkish ] = "Sözcük baþýna kadar sil";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_DELETE_LINE
{
    SlotName = "Bis Zeilenende löschen";
    SlotName [ english ] =  "Bis Zeilenende löschen";
    SlotName[ english_us ] = "Delete to End of Line";
    SlotName[ portuguese ] = "Eliminar até ao fim da linha";
    SlotName[ russian ] = "Óäàëèòü äî êîíöà ñòðîêè";
    SlotName[ dutch ] = "Tot regeleinde wissen";
    SlotName[ french ] = "Suppr. jusqu'à la fin de la ligne";
    SlotName[ spanish ] = "Eliminar hasta el final de la línea";
    SlotName[ italian ] = "Cancella fino a fine riga";
    SlotName[ danish ] = "Slet til slutningen af rækken";
    SlotName[ swedish ] = "Radera till radslut";
    SlotName[ polish ] = "Usuñ do koñca wiersza";
    SlotName[ portuguese_brazilian ] = "DelToEndOfLine";
    SlotName[ japanese ] = "s––‚܂ō폜";
    SlotName[ chinese_simplified ] = "ɾ³ýÖÁÐÐÄ©";
    SlotName[ chinese_traditional ] = "§R°£¦Ü¦æ¥½";
    SlotName[ arabic ] = "ÍÐÝ ÍÊì äåÇíÉ ÇáÓØÑ";
    SlotName[ dutch ] = "Tot regeleinde wissen";
    SlotName[ chinese_simplified ] = "ɾ³ýÖÁÐÐÄ©";
    SlotName[ greek ] = "ÄéáãñáöÞ åþò ôï ôÝëïò ôçò ãñáììÞò";
    SlotName[ korean ] = "ÁÙÀÇ ³¡¿¡ »èÁ¦";
    SlotName[ turkish ] = "Satýr sonuna kadar sil";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_DELETE_PARA
{
    SlotName = "Bis Absatzende löschen";
    SlotName [ english ] =  "Bis Absatzende löschen";
    SlotName[ english_us ] = "Delete to End of Paragraph";
    SlotName[ portuguese ] = "Eliminar até ao fim do parágrafo";
    SlotName[ russian ] = "Óäàëèòü äî êîíöà àáçàöà";
    SlotName[ dutch ] = "Tot aan einde alinea wissen";
    SlotName[ french ] = "Suppr. jusqu'à la fin du paragraphe";
    SlotName[ spanish ] = "Eliminar hasta el final del párrafo";
    SlotName[ italian ] = "Cancella fino alla fine del paragrafo";
    SlotName[ danish ] = "Slet til slutningen af afsnittet";
    SlotName[ swedish ] = "Radera till slutet av stycket";
    SlotName[ polish ] = "Usuñ do koñca akapitu";
    SlotName[ portuguese_brazilian ] = "DelToEndOfParagraph";
    SlotName[ japanese ] = "’i—Ž––‚܂ō폜";
    SlotName[ chinese_simplified ] = "ɾ³ýÖÁ¶ÎÂäβ¶Ë";
    SlotName[ chinese_traditional ] = "§R°£¦Ü¬q¸¨§ÀºÝ";
    SlotName[ arabic ] = "ÍÐÝ ÍÊì äåÇíÉ ÇáÝÞÑÉ";
    SlotName[ dutch ] = "Tot aan einde alinea wissen";
    SlotName[ chinese_simplified ] = "ɾ³ýÖÁ¶ÎÂäβ¶Ë";
    SlotName[ greek ] = "ÄéáãñáöÞ åþò ôï ôÝëïò ôçò ðáñáãñÜöïõ";
    SlotName[ korean ] = "´Ü¶ôÀÇ ³¡¿¡ »èÁ¦";
    SlotName[ turkish ] = "Paragraf sonuna kadar sil";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_DELETE_SENT
{
    SlotName = "Bis Satzende löschen";
    SlotName [ english ] =  "Bis Satzende löschen";
    SlotName[ english_us ] = "Delete to End of Sentence";
    SlotName[ portuguese ] = "Eliminar até ao fim da frase";
    SlotName[ russian ] = "Óäàëèòü äî êîíöà ïðåäëîæåíèÿ";
    SlotName[ dutch ] = "Tot aan einde zin wissen";
    SlotName[ french ] = "Supprimer jusqu'à la fin de la phrase";
    SlotName[ spanish ] = "Eliminar hasta el final de la frase";
    SlotName[ italian ] = "Cancella fino alla fine della riga";
    SlotName[ danish ] = "Slet til slutningen af sætningen";
    SlotName[ swedish ] = "Radera till slutet av mening";
    SlotName[ polish ] = "Usuñ do koñca zdania";
    SlotName[ portuguese_brazilian ] = "DelToEndOfSentence";
    SlotName[ japanese ] = "•¶––‚܂ō폜";
    SlotName[ chinese_simplified ] = "ɾ³ýÖÁ¾äÄ©";
    SlotName[ chinese_traditional ] = "§R°£¦Ü¥y¥½";
    SlotName[ arabic ] = "ÍÐÝ ÍÊì äåÇíÉ ÇáÌãáÉ";
    SlotName[ dutch ] = "Tot aan einde zin wissen";
    SlotName[ chinese_simplified ] = "ɾ³ýÖÁ¾äÄ©";
    SlotName[ greek ] = "ÄéáãñáöÞ åþò ôï ôÝëïò ôçò ðñüôáóçò";
    SlotName[ korean ] = "¹®ÀåÀÇ ³¡¿¡ »èÁ¦";
    SlotName[ turkish ] = "Cümle sonuna kadar sil";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_DELETE_WHOLE_LINE
{
    SlotName = "Zeile löschen";
    SlotName [ english ] =  "Zeile löschen";
    SlotName[ english_us ] = "Delete Row";
    SlotName[ portuguese ] = "Eliminar linha";
    SlotName[ russian ] = "Óäàëèòü ñòðîêó";
    SlotName[ dutch ] = "Rij wissen";
    SlotName[ french ] = "Supprimer la ligne";
    SlotName[ spanish ] = "Eliminar línea";
    SlotName[ italian ] = "Elimina riga";
    SlotName[ danish ] = "Slet rækken";
    SlotName[ swedish ] = "Radera rad";
    SlotName[ polish ] = "Usuñ wiersz";
    SlotName[ portuguese_brazilian ] = "DeleteLine";
    SlotName[ japanese ] = "s‚̍폜";
    SlotName[ chinese_simplified ] = "ɾ³ýÐÐ";
    SlotName[ chinese_traditional ] = "§R°£¦æ";
    SlotName[ arabic ] = "ÍÐÝ ÕÝ";
    SlotName[ dutch ] = "Rij wissen";
    SlotName[ chinese_simplified ] = "ɾ³ýÐÐ";
    SlotName[ greek ] = "ÄéáãñáöÞ ãñáììÞò";
    SlotName[ korean ] = "¿­ »èÁ¦";
    SlotName[ turkish ] = "Satýrý sil";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_DELETE_WORD
{
    SlotName = "Bis Wortende löschen";
    SlotName [ english ] =  "Bis Wortende löschen";
    SlotName[ english_us ] = "Delete to End of Word";
    SlotName[ portuguese ] = "Eliminar até ao fim da palavra";
    SlotName[ russian ] = "Óäàëèòü äî êîíöà ñëîâà";
    SlotName[ dutch ] = "Tot aan woordeinde wissen";
    SlotName[ french ] = "Supprimer jusqu'à la fin du mot";
    SlotName[ spanish ] = "Eliminar hasta el final de la palabra";
    SlotName[ italian ] = "Cancella fino alla fine della pagina";
    SlotName[ danish ] = "Slet til slutningen af ordet";
    SlotName[ swedish ] = "Radera till slutet av ord";
    SlotName[ polish ] = "Usuñ do koñca s³owa";
    SlotName[ portuguese_brazilian ] = "DelToEndOfWord";
    SlotName[ japanese ] = "Œê––‚܂ō폜";
    SlotName[ chinese_simplified ] = "ɾ³ýÖÁ×ÖÄ©";
    SlotName[ chinese_traditional ] = "§R°£¦Ü¦r¥½";
    SlotName[ arabic ] = "ÍÐÝ ÍÊì äåÇíÉ ÇáßáãÉ";
    SlotName[ dutch ] = "Tot aan woordeinde wissen";
    SlotName[ chinese_simplified ] = "ɾ³ýÖÁ×ÖÄ©";
    SlotName[ greek ] = "ÄéáãñáöÞ åþò ôï ôÝëïò ôçò ëÝîåùò";
    SlotName[ korean ] = "´Ü¾îÀÇ ³¡¿¡ »èÁ¦";
    SlotName[ turkish ] = "Sözcük sonuna kadar sil";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_DRAW_WRAP_DLG
{
    SlotName = "Textumlauf";
    SlotName [ english ] =  "Textumlauf";
    SlotName[ english_us ] = "Text Wrap";
    SlotName[ portuguese ] = "Ajustar texto";
    SlotName[ russian ] = "Îáòåêàíèå òåêñòîì";
    SlotName[ dutch ] = "Tekstomloop";
    SlotName[ french ] = "Habillage";
    SlotName[ spanish ] = "Ajuste de texto";
    SlotName[ italian ] = "Scorrimento testo";
    SlotName[ danish ] = "Tekstombrydning";
    SlotName[ swedish ] = "Textanpassning";
    SlotName[ polish ] = "Obieg tekstu";
    SlotName[ portuguese_brazilian ] = "FormatWrap";
    SlotName[ japanese ] = "÷½Ä‚̐܂è•Ô‚µ";
    SlotName[ chinese_simplified ] = "ÎÄ×Ö»·ÈÆ";
    SlotName[ chinese_traditional ] = "´«¦æ";
    SlotName[ arabic ] = "ÇáÊÝÇÝ ÇáäÕ";
    SlotName[ dutch ] = "Tekstomloop";
    SlotName[ chinese_simplified ] = "ÎÄ×Ö»·ÈÆ";
    SlotName[ greek ] = "Áíáäßðëùóç êåéìÝíïõ";
    SlotName[ korean ] = "ÅØ½ºÆ® ¼øÈ¯";
    SlotName[ turkish ] = "Metin daðýlýmý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_DRAWTEXT_ATTR_DLG
{
    SlotName = "Textattribute";
    SlotName [ english ] =  "Textattribute";
    SlotName[ english_us ] = "Text Attributes";
    SlotName[ portuguese ] = "Atributos de texto";
    SlotName[ russian ] = "Òåêñòîâûå àòðèáóòû";
    SlotName[ dutch ] = "Tekstattributen";
    SlotName[ french ] = "Attributs de texte";
    SlotName[ spanish ] = "Atributos de texto";
    SlotName[ italian ] = "Attributi di testo";
    SlotName[ danish ] = "Tekstattributter";
    SlotName[ swedish ] = "Textattribut";
    SlotName[ polish ] = "Atrybuty tekstu";
    SlotName[ portuguese_brazilian ] = "FormatText";
    SlotName[ japanese ] = "÷½Ä‚Ì‘®«";
    SlotName[ chinese_simplified ] = "ÎÄ×ÖÊôÐÔ";
    SlotName[ chinese_traditional ] = "¤å¦rÄÝ©Ê";
    SlotName[ arabic ] = "ÓãÇÊ ÇáäÕ";
    SlotName[ dutch ] = "Tekstattributen";
    SlotName[ chinese_simplified ] = "ÎÄ×ÖÊôÐÔ";
    SlotName[ greek ] = "×áñáêôçñéóôéêÜ êåéìÝíïõ";
    SlotName[ korean ] = "ÅØ½ºÆ® ¼Ó¼º";
    SlotName[ turkish ] = "Metin öznitelikleri";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_EDIT_FIELD
{
    SlotName = "Feldbefehl";
    SlotName [ english ] =  "Feldbefehl";
    SlotName[ english_us ] = "Fields";
    SlotName[ portuguese ] = "Campos";
    SlotName[ russian ] = "Ïîëå";
    SlotName[ dutch ] = "Veldopdracht";
    SlotName[ french ] = "Instruction de champ";
    SlotName[ spanish ] = "Código de campo";
    SlotName[ italian ] = "Comando di campo";
    SlotName[ danish ] = "Felt";
    SlotName[ swedish ] = "Fältkommando";
    SlotName[ polish ] = "Pola";
    SlotName[ portuguese_brazilian ] = "EditFieldCommand";
    SlotName[ japanese ] = "̨°ÙÄÞ";
    SlotName[ chinese_simplified ] = "×Ö¶ÎÖ¸Áî";
    SlotName[ chinese_traditional ] = "Äæ¦ì«ü¥O";
    SlotName[ arabic ] = "ÍÞá";
    SlotName[ dutch ] = "Veldopdracht";
    SlotName[ chinese_simplified ] = "×Ö¶ÎÖ¸Áî";
    SlotName[ greek ] = "ÅíôïëÞ ðåäßïõ";
    SlotName[ korean ] = "Çʵå";
    SlotName[ turkish ] = "Alan öðesi";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_EDIT_FOOTNOTE
{
    SlotName = "Fußnote";
    SlotName [ english ] =  "Fußnote";
    SlotName[ english_us ] = "Footnote";
    SlotName[ portuguese ] = "Nota de rodapé";
    SlotName[ russian ] = "Ñíîñêà";
    SlotName[ dutch ] = "Voetnoot";
    SlotName[ french ] = "Note de bas de page";
    SlotName[ spanish ] = "Nota al pie";
    SlotName[ italian ] = "Nota a piè pagina";
    SlotName[ danish ] = "Fodnote";
    SlotName[ swedish ] = "Fotnot";
    SlotName[ polish ] = "Przypis dolny";
    SlotName[ portuguese_brazilian ] = "EditFootnotes";
    SlotName[ japanese ] = "‹r’";
    SlotName[ chinese_simplified ] = "×¢½Å";
    SlotName[ chinese_traditional ] = "µù¸}";
    SlotName[ arabic ] = "ÍÇÔíÉ ÓÝáíÉ";
    SlotName[ dutch ] = "Voetnoot";
    SlotName[ chinese_simplified ] = "×¢½Å";
    SlotName[ greek ] = "Õðïóçìåßùóç";
    SlotName[ korean ] = "¹Ù´Ú±Û";
    SlotName[ turkish ] = "Dipnot";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_EDIT_FORMULA
{
    SlotName = "Formel einfügen";
    SlotName [ english ] =  "Formel einfügen";
    SlotName[ english_us ] = "Insert Formula";
    SlotName[ portuguese ] = "Inserir fórmula";
    SlotName[ russian ] = "Âñòàâèòü ôîðìóëó";
    SlotName[ dutch ] = "Formule invoegen";
    SlotName[ french ] = "Insérer une formule";
    SlotName[ spanish ] = "Insertar fórmula";
    SlotName[ italian ] = "Inserisci formula";
    SlotName[ danish ] = "Indsæt formel";
    SlotName[ swedish ] = "Infoga formel";
    SlotName[ polish ] = "Wstaw formu³ê";
    SlotName[ portuguese_brazilian ] = "InsertFormula";
    SlotName[ japanese ] = "”Ž®‚Ì‘}“ü";
    SlotName[ chinese_simplified ] = "²åÈ빫ʽ";
    SlotName[ chinese_traditional ] = "´¡¤J¤½¦¡";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÕíÛÉ";
    SlotName[ dutch ] = "Formule invoegen";
    SlotName[ chinese_simplified ] = "²åÈ빫ʽ";
    SlotName[ greek ] = "ÅéóáãùãÞ ôýðïõ";
    SlotName[ korean ] = "¼ö½Ä »ðÀÔ";
    SlotName[ turkish ] = "Formül ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_EDIT_IDX_ENTRY_DLG
{
    SlotName = "Verzeichniseintrag";
    SlotName [ english ] =  "Verzeichniseintrag";
    SlotName[ english_us ] = "Index Entry";
    SlotName[ portuguese ] = "Registo de índice";
    SlotName[ russian ] = "Ýëåìåíò óêàçàòåëÿ";
    SlotName[ dutch ] = "Indexitem";
    SlotName[ french ] = "Entrée d'index";
    SlotName[ spanish ] = "Entrada del índice";
    SlotName[ italian ] = "Voce di indice";
    SlotName[ danish ] = "Indekselement";
    SlotName[ swedish ] = "Förteckningspost";
    SlotName[ polish ] = "Wpis w indeksie";
    SlotName[ portuguese_brazilian ] = "EditIndexEntry";
    SlotName[ japanese ] = "õˆø€–Ú";
    SlotName[ chinese_simplified ] = "Ŀ¼ÌõÄ¿";
    SlotName[ chinese_traditional ] = "¥Ø¿ý±ø¥Ø";
    SlotName[ arabic ] = "ÅÏÎÇá ÝåÑÓí";
    SlotName[ dutch ] = "Indexitem";
    SlotName[ chinese_simplified ] = "Ŀ¼ÌõÄ¿";
    SlotName[ greek ] = "Êáôá÷þñéóç åõñåôçñßïõ";
    SlotName[ korean ] = "»öÀÎ Ç׸ñ";
    SlotName[ turkish ] = "Dizin giriþi";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_EDIT_LINK_DLG
{
    SlotName = "Verknüpfungen";
    SlotName [ english ] =  "Verknüpfungen";
    SlotName[ english_us ] = "Links";
    SlotName[ portuguese ] = "Ligações";
    SlotName[ russian ] = "Ññûëêè";
    SlotName[ dutch ] = "Koppelingen";
    SlotName[ french ] = "Liens";
    SlotName[ spanish ] = "Vínculos";
    SlotName[ italian ] = "Collegamenti";
    SlotName[ danish ] = "Kæder";
    SlotName[ swedish ] = "Länkar";
    SlotName[ polish ] = "£¹cza";
    SlotName[ portuguese_brazilian ] = "EditLink";
    SlotName[ japanese ] = "ØÝ¸‚̐ݒè";
    SlotName[ chinese_simplified ] = "Á´½Ó";
    SlotName[ chinese_traditional ] = "±¶®|";
    SlotName[ arabic ] = "ãæÇÞÚ ãÑÊÈØÉ";
    SlotName[ dutch ] = "Koppelingen";
    SlotName[ chinese_simplified ] = "Á´½Ó";
    SlotName[ language_user1 ] = " ";
    SlotName[ greek ] = "ÓõíäÝóåéò";
    SlotName[ korean ] = "¿¬°á";
    SlotName[ turkish ] = "Baðlantýlar";
};
SfxSlotInfo FN_EDIT_REGION
{
    SlotName = "Bereiche";
    SlotName [ english ] =  "Bereiche";
    SlotName[ english_us ] = "Sections";
    SlotName[ portuguese ] = "Categorias";
    SlotName[ russian ] = "Ðàçäåëû";
    SlotName[ dutch ] = "Bereiken";
    SlotName[ french ] = "Sections";
    SlotName[ spanish ] = "Areas";
    SlotName[ italian ] = "Sezioni";
    SlotName[ danish ] = "Områder";
    SlotName[ swedish ] = "Områden";
    SlotName[ polish ] = "Sekcje";
    SlotName[ portuguese_brazilian ] = "EditSection";
    SlotName[ japanese ] = "”͈Í";
    SlotName[ chinese_simplified ] = "ÇøÓò";
    SlotName[ chinese_traditional ] = "°Ï°ì";
    SlotName[ arabic ] = "äØÇÞÇÊ";
    SlotName[ dutch ] = "Bereiken";
    SlotName[ chinese_simplified ] = "ÇøÓò";
    SlotName[ greek ] = "Åíüôçôåò";
    SlotName[ korean ] = "±¸¿ª";
    SlotName[ turkish ] = "Bölüm";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_END_DOC_DIRECT
{
    SlotName = "Direkt zum Dokumentende";
    SlotName [ english ] =  "Direkt zum Dokumentende";
    SlotName[ english_us ] = "Directly to Document End";
    SlotName[ portuguese ] = "Ir para fim do documento";
    SlotName[ russian ] = "Íåïîñðåäñòâåííî äî êîíöà äîêóìåíòà";
    SlotName[ dutch ] = "Direct naar documenteinde";
    SlotName[ french ] = "À la fin du document";
    SlotName[ spanish ] = "Final del documento";
    SlotName[ italian ] = "Direttamente alla fine del documento";
    SlotName[ danish ] = "Direkte til dokumentets slutning";
    SlotName[ swedish ] = "Direkt till slutet av dokumentet";
    SlotName[ polish ] = "Bezpoœrednio na koniec dokumentu";
    SlotName[ portuguese_brazilian ] = "EndOfDoc";
    SlotName[ japanese ] = "’¼Ú•¶‘––‚Ö";
    SlotName[ chinese_simplified ] = "Ö±½Óתµ½ÎĵµÎ²¶Ë";
    SlotName[ chinese_traditional ] = "ª½±µÂà¨ì¤å¥ó§ÀºÝ";
    SlotName[ arabic ] = "ãÈÇÔÑÉ ÍÊì äåÇíÉ ÇáãÓÊäÏ";
    SlotName[ dutch ] = "Direct naar documenteinde";
    SlotName[ chinese_simplified ] = "Ö±½Óתµ½ÎĵµÎ²¶Ë";
    SlotName[ language_user1 ] = " ";
    SlotName[ greek ] = "Áð åõèåßáò ðñïò ôï ôÝëïò ôïõ åããñÜöïõ";
    SlotName[ korean ] = "¹®¼­³¡¿¡ ¹Ù·Î";
    SlotName[ turkish ] = "Doðrudan belge sonuna";
};
SfxSlotInfo FN_END_OF_COLUMN
{
    SlotName = "Zum Spaltenende";
    SlotName [ english ] =  "Zum Spaltenende";
    SlotName[ english_us ] = "To Column End";
    SlotName[ portuguese ] = "Ir para fim da coluna";
    SlotName[ russian ] = "Äî êîíöà ñòîëáöà";
    SlotName[ dutch ] = "Naar kolomeinde";
    SlotName[ french ] = "Aller à la fin de la colonne";
    SlotName[ spanish ] = "Ir al final de la columna";
    SlotName[ italian ] = "Alla fine della colonna";
    SlotName[ danish ] = "Til kolonnens slutning";
    SlotName[ swedish ] = "Till slutet av kolumnen";
    SlotName[ polish ] = "Do koñca kolumny";
    SlotName[ portuguese_brazilian ] = "GoToEndOfColumn";
    SlotName[ japanese ] = "—ñ‚Ì––‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÁÐβ";
    SlotName[ chinese_traditional ] = "Âà¨ìÄæ§À";
    SlotName[ arabic ] = "Åáì äåÇíÉ ÇáÚãæÏ";
    SlotName[ dutch ] = "Naar kolomeinde";
    SlotName[ chinese_simplified ] = "תµ½ÁÐβ";
    SlotName[ greek ] = "Ðñïò ôï ôÝëïò ôçò óôÞëçò";
    SlotName[ korean ] = "¿­ ³¡À¸·Î";
    SlotName[ turkish ] = "Sütun sonu";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_END_OF_DOCUMENT
{
    SlotName = "Zum Dokumentende";
    SlotName [ english ] =  "Zum Dokumentende";
    SlotName[ english_us ] = "To Document End";
    SlotName[ portuguese ] = "Ir para fim do documento";
    SlotName[ russian ] = "Ê êîíöó äîêóìåíòà";
    SlotName[ dutch ] = "Naar einde document";
    SlotName[ french ] = "À la fin du document";
    SlotName[ spanish ] = "Ir al final del documento";
    SlotName[ italian ] = "Alla fine del documento";
    SlotName[ danish ] = "Til dokumentets slutning";
    SlotName[ swedish ] = "Till slutet av dokumentet";
    SlotName[ polish ] = "Do koñca dokumentu";
    SlotName[ portuguese_brazilian ] = "GoToEndOfDoc";
    SlotName[ japanese ] = "•¶‘––‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÎĵµÎ²¶Ë";
    SlotName[ chinese_traditional ] = "Âà¨ì¤å¥ó§ÀºÝ";
    SlotName[ arabic ] = "Åáì äåÇíÉ ÇáãÓÊäÏ";
    SlotName[ dutch ] = "Naar einde document";
    SlotName[ chinese_simplified ] = "תµ½ÎĵµÎ²¶Ë";
    SlotName[ greek ] = "Ðñïò ôï ôÝëïò ôïõ åããñÜöïõ";
    SlotName[ korean ] = "¹®¼­ ³¡À¸·Î";
    SlotName[ turkish ] = "Belge sonu";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_END_OF_DOCUMENT_SEL
{
    SlotName = "Bis Dokumentende selektieren";
    SlotName [ english ] =  "Bis Dokumentende selektieren";
    SlotName[ english_us ] = "Select to Document End";
    SlotName[ portuguese ] = "Seleccionar até fim do documento";
    SlotName[ russian ] = "Âûäåëèòü äî êîíöà äîêóìåíòà";
    SlotName[ dutch ] = "Tot aan einde document selecteren";
    SlotName[ french ] = "Sélectionner jusqu'à la fin du document";
    SlotName[ spanish ] = "Seleccionar hasta el final del documento";
    SlotName[ italian ] = "Seleziona fino alla fine del documento";
    SlotName[ danish ] = "Marker til dokumentets slutning";
    SlotName[ swedish ] = "Markera till slutet av dokumentet";
    SlotName[ polish ] = "Zaznacz do koñca dokumentu";
    SlotName[ portuguese_brazilian ] = "EndOfDocumentSel";
    SlotName[ japanese ] = "•¶‘––‚܂őI‘ð";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁÎĵµÎ²¶Ë";
    SlotName[ chinese_traditional ] = "¿ï¨ú¦Ü¤å¥ó§ÀºÝ";
    SlotName[ arabic ] = "ÊÍÏíÏ ÍÊì äåÇíÉ ÇáãÓÊäÏ";
    SlotName[ dutch ] = "Tot aan einde document selecteren";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁÎĵµÎ²¶Ë";
    SlotName[ greek ] = "ÅðéëïãÞ åþò ôÝëïò åããñÜöïõ";
    SlotName[ korean ] = "¹®¼­ ³¡¿¡ ¼±ÅÃ";
    SlotName[ turkish ] = "Belge sonuna kadar seç";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_END_OF_LINE
{
    SlotName = "Zum Zeilenende";
    SlotName [ english ] =  "Zum Zeilenende";
    SlotName[ english_us ] = "To End of Line";
    SlotName[ portuguese ] = "Ir para fim da linha";
    SlotName[ russian ] = "Äî êîíöà ñòðîêè";
    SlotName[ dutch ] = "Naar einde regel";
    SlotName[ french ] = "A la fin de la ligne";
    SlotName[ spanish ] = "Ir al final de la línea";
    SlotName[ italian ] = "Alla fine della riga";
    SlotName[ danish ] = "Til rækkens slutning";
    SlotName[ swedish ] = "Till slutet av raden";
    SlotName[ polish ] = "Do koñca wiersza";
    SlotName[ portuguese_brazilian ] = "GoToEndOfLine";
    SlotName[ japanese ] = "s––‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÐÐÄ©";
    SlotName[ chinese_traditional ] = "Âà¨ì¦æ¥½";
    SlotName[ arabic ] = "Åáì äåÇíÉ ÇáÓØÑ";
    SlotName[ dutch ] = "Naar einde regel";
    SlotName[ chinese_simplified ] = "תµ½ÐÐÄ©";
    SlotName[ greek ] = "Ðñïò ôï ôÝëïò ôçò ãñáììÞò";
    SlotName[ korean ] = "¼±ÀÇ ³¡À¸·Î";
    SlotName[ turkish ] = "Satýr sonu";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_END_OF_LINE_SEL
{
    SlotName = "Bis Zeilenende selektieren";
    SlotName [ english ] =  "Bis Zeilenende selektieren";
    SlotName[ english_us ] = "Select to End of Line";
    SlotName[ portuguese ] = "Seleccionar até fim da linha";
    SlotName[ russian ] = "Âûäåëèòü äî êîíöà ñòðîêè";
    SlotName[ dutch ] = "Tot aan regeleinde selecteren";
    SlotName[ french ] = "Sélect. jusqu'à la fin de la ligne";
    SlotName[ spanish ] = "Seleccionar hasta el final de la línea";
    SlotName[ italian ] = "Seleziona fino alla fine della linea";
    SlotName[ danish ] = "Marker til rækkens slutning";
    SlotName[ swedish ] = "Markera till slutet av raden";
    SlotName[ polish ] = "Zaznacz do koñca wiersza";
    SlotName[ portuguese_brazilian ] = "EndOfLineSel";
    SlotName[ japanese ] = "s––‚܂őI‘ð";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁÐÐÄ©";
    SlotName[ chinese_traditional ] = "¦Ü¦æ¥½";
    SlotName[ arabic ] = "ÊÍÏíÏ ÍÊì äåÇíÉ ÇáÓØÑ";
    SlotName[ dutch ] = "Tot aan regeleinde selecteren";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁÐÐÄ©";
    SlotName[ greek ] = "ÅðéëïãÞ åþò ôÝëïò ãñáììÞò";
    SlotName[ korean ] = "¼±Àdz¡ ¼±ÅÃ";
    SlotName[ turkish ] = "Satýr sonuna kadara seç";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_END_OF_NEXT_COLUMN
{
    SlotName = "Zum Ende nächster Spalte";
    SlotName [ english ] =  "Zum Ende nächster Spalte";
    SlotName[ english_us ] = "To End of Next Column";
    SlotName[ portuguese ] = "Ir para fim da coluna seguinte";
    SlotName[ russian ] = "Äî êîíöà ñëåäóþùåãî ñòîëáöà";
    SlotName[ dutch ] = "Naar einde volgende kolom";
    SlotName[ french ] = "A la fin de la colonne suivante";
    SlotName[ spanish ] = "Ir al final de la columna siguiente";
    SlotName[ italian ] = "Alla fine della colonna successiva";
    SlotName[ danish ] = "TIl næste kolonnes slutning";
    SlotName[ swedish ] = "Till slutet av nästa kolumn";
    SlotName[ polish ] = "Do koñca nastêpnej kolumny";
    SlotName[ portuguese_brazilian ] = "GoToEndOfNextColumn";
    SlotName[ japanese ] = "ŽŸ‚Ì—ñ‚Ì––‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÏÂÒ»ÁеÄβ¶Ë";
    SlotName[ chinese_traditional ] = "Âà¨ì¤U¤@Äæ§À";
    SlotName[ arabic ] = "Åáì äåÇíÉ ÇáÚãæÏ ÇáÊÇáí";
    SlotName[ dutch ] = "Naar einde volgende kolom";
    SlotName[ chinese_simplified ] = "תµ½ÏÂÒ»ÁеÄβ¶Ë";
    SlotName[ greek ] = "Ðñïò ôÝëïò åðüìåíçò óôÞëçò";
    SlotName[ korean ] = "´ÙÀ½ ¿­ÀÇ ³¡À¸·Î";
    SlotName[ turkish ] = "Sonraki sütun sonu";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_END_OF_NEXT_PAGE
{
    SlotName = "Zum Ende nächster Seite";
    SlotName [ english ] =  "Zum Ende nächster Seite";
    SlotName[ english_us ] = "To End of Next Page";
    SlotName[ portuguese ] = "Ir para fim da página seguinte";
    SlotName[ russian ] = "Äî êîíöà ñëåäóþùåé ñòðàíèöû";
    SlotName[ dutch ] = "Naar einde volgende pagina";
    SlotName[ french ] = "À la fin de la page suivante";
    SlotName[ spanish ] = "Ir al final de la página siguiente";
    SlotName[ italian ] = "Alla fine dell pagina successiva";
    SlotName[ danish ] = "Til næste sides slutning";
    SlotName[ swedish ] = "Till slutet av nästa sida";
    SlotName[ polish ] = "Do koñca nastêpnej strony";
    SlotName[ portuguese_brazilian ] = "GoToEndOfNextPage";
    SlotName[ japanese ] = "ŽŸ‚ÌÍß°¼Þ––‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÏÂһҳβ¶Ë";
    SlotName[ chinese_traditional ] = "Âà¨ì¤U¤@­¶§À";
    SlotName[ arabic ] = "Åáì äåÇíÉ ÇáÕÝÍÉ ÇáÊÇáíÉ";
    SlotName[ dutch ] = "Naar einde volgende pagina";
    SlotName[ chinese_simplified ] = "תµ½ÏÂһҳβ¶Ë";
    SlotName[ greek ] = "Ðñïò ôÝëïò åðüìåíçò óåëßäáò";
    SlotName[ korean ] = "´ÙÀ½ ÆäÀÌÁöÀÇ ³¡À¸·Î";
    SlotName[ turkish ] = "Sonraki sayfanýn sonu";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_END_OF_NEXT_PAGE_SEL
{
    SlotName = "Bis Ende nächster Seite selektieren";
    SlotName [ english ] =  "Bis Ende nächster Seite selektieren";
    SlotName[ english_us ] = "Select to End of Next Page";
    SlotName[ portuguese ] = "Seleccionar até fim da página seguinte";
    SlotName[ russian ] = "Âûäåëèòü äî êîíöà ñëåäóþùåé ñòðàíèöû";
    SlotName[ dutch ] = "Tot aan einde volgende pagina selecteren";
    SlotName[ french ] = "Sélect. jusqu'à la fin de la page suivante";
    SlotName[ spanish ] = "Seleccionar hasta el final de la página siguiente";
    SlotName[ italian ] = "Seleziona fino alla fine della pagina successiva";
    SlotName[ danish ] = "Marker til næste sides slutning";
    SlotName[ swedish ] = "Markera till slutet av nästa sida";
    SlotName[ polish ] = "Zaznacz do koñca nastêpnej strony";
    SlotName[ portuguese_brazilian ] = "GoToEndOfNextPageSel";
    SlotName[ japanese ] = "ŽŸ‚ÌÍß°¼Þ––‚܂őI‘ð";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁÏÂÒ»Ò³µÄβ¶Ë";
    SlotName[ chinese_traditional ] = "¿ï¨ú¦Ü¤U¤@­¶§À";
    SlotName[ arabic ] = "ÊÍÏíÏ ÍÊì äåÇíÉ ÇáÕÝÍÉ ÇáÊÇáíÉ";
    SlotName[ dutch ] = "Tot aan einde volgende pagina selecteren";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁÏÂÒ»Ò³µÄβ¶Ë";
    SlotName[ greek ] = "ÅðéëïãÞ åþò ôÝëïò åðüìåíçò óåëßäáò";
    SlotName[ korean ] = "´ÙÀ½ÆäÀÌÁö ³¡ ¼±ÅÃ";
    SlotName[ turkish ] = "Sonraki sayfanýn sonuna kadar seç";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_END_OF_PAGE
{
    SlotName = "Zum Seitenende";
    SlotName [ english ] =  "Zum Seitenende";
    SlotName[ english_us ] = "To Page End";
    SlotName[ portuguese ] = "Ir para fim da página";
    SlotName[ russian ] = "Äî êîíöà ñòðàíèöû";
    SlotName[ dutch ] = "Naar paginaeinde";
    SlotName[ french ] = "Aller jusqu'à la fin de la page";
    SlotName[ spanish ] = "Ir al final de la página";
    SlotName[ italian ] = "Alla fine della pagina";
    SlotName[ danish ] = "Til sidens slutning";
    SlotName[ swedish ] = "Till slutet av sidan";
    SlotName[ polish ] = "Do koñca strony";
    SlotName[ portuguese_brazilian ] = "GoToEndOfPage";
    SlotName[ japanese ] = "Íß°¼Þ––‚Ö";
    SlotName[ chinese_simplified ] = "תµ½Ò³ÃæÎ²¶Ë";
    SlotName[ chinese_traditional ] = "Âà¨ì­¶§À";
    SlotName[ arabic ] = "Åáì äåÇíÉ ÇáÕÝÍÉ";
    SlotName[ dutch ] = "Naar paginaeinde";
    SlotName[ chinese_simplified ] = "תµ½Ò³ÃæÎ²¶Ë";
    SlotName[ greek ] = "Ðñïò ôï ôÝëïò ôçò óåëßäáò";
    SlotName[ korean ] = "ÆäÀÌÁöÀÇ ³¡À¸·Î";
    SlotName[ turkish ] = "Sayfa sonu";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_END_OF_PAGE_SEL
{
    SlotName = "Bis Seitenende selektieren";
    SlotName [ english ] =  "Bis Seitenende selektieren";
    SlotName[ english_us ] = "Select to Page End";
    SlotName[ portuguese ] = "Seleccionar até fim da página";
    SlotName[ russian ] = "Âûäåëèòü äî êîíöà ñòðàíèöû";
    SlotName[ dutch ] = "Tot aan paginaeinde selecteren";
    SlotName[ french ] = "Sélect. jusqu'à la fin de la page";
    SlotName[ spanish ] = "Seleccionar hasta el final de la página";
    SlotName[ italian ] = "Seleziona fino alla fine della pagina";
    SlotName[ danish ] = "Marker til sidens slutning";
    SlotName[ swedish ] = "Markera till slutet av sidan";
    SlotName[ polish ] = "Zaznacz do koñca strony";
    SlotName[ portuguese_brazilian ] = "GoToEndOfPageSel";
    SlotName[ japanese ] = "Íß°¼Þ––‚܂őI‘ð";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁÒ³ÃæÎ²¶Ë";
    SlotName[ chinese_traditional ] = "¿ï¨ú¦Ü­¶§À";
    SlotName[ arabic ] = "ÊÍÏíÏ ÍÊì äåÇíÉ ÇáÕÝÍÉ";
    SlotName[ dutch ] = "Tot aan paginaeinde selecteren";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁÒ³ÃæÎ²¶Ë";
    SlotName[ greek ] = "ÅðéëïãÞ åþò ôÝëïò óåëßäáò";
    SlotName[ korean ] = "ÆäÀÌÁö ³¡ ¼±ÅÃ";
    SlotName[ turkish ] = "Sayfa sonuna kadar seç";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_END_OF_PARA
{
    SlotName = "Zum Absatzende";
    SlotName [ english ] =  "Zum Absatzende";
    SlotName[ english_us ] = "To Paragraph End";
    SlotName[ portuguese ] = "Para o fim do parágrafo";
    SlotName[ russian ] = "Äî êîíöà àáçàöà";
    SlotName[ dutch ] = "Naar einde alinea";
    SlotName[ french ] = "A la fin du paragraphe";
    SlotName[ spanish ] = "Ir al final del párrafo";
    SlotName[ italian ] = "Alla fine del paragrafo";
    SlotName[ danish ] = "Til afsnittets slutning";
    SlotName[ swedish ] = "Till slutet av stycket";
    SlotName[ polish ] = "Do koñca akapitu";
    SlotName[ portuguese_brazilian ] = "GoToEndOfPara";
    SlotName[ japanese ] = "’i—Ž––‚Ö";
    SlotName[ chinese_simplified ] = "תµ½¶ÎÂäβ¶Ë";
    SlotName[ chinese_traditional ] = "Âà¨ì¬q¸¨§ÀºÝ";
    SlotName[ arabic ] = "Åáì äåÇíÉ ÇáÝÞÑÉ";
    SlotName[ dutch ] = "Naar einde alinea";
    SlotName[ chinese_simplified ] = "תµ½¶ÎÂäβ¶Ë";
    SlotName[ greek ] = "Ðñïò ôï ôÝëïò ôçò ðáñáãñÜöïõ";
    SlotName[ korean ] = "´Ü¶ôÀÇ ³¡À¸·Î";
    SlotName[ turkish ] = "Paragraf sonu";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_END_OF_PARA_SEL
{
    SlotName = "Bis Absatzende selektieren";
    SlotName [ english ] =  "Bis Absatzende selektieren";
    SlotName[ english_us ] = "Select to Paragraph End";
    SlotName[ portuguese ] = "Seleccionar até fim do parágrafo";
    SlotName[ russian ] = "Âûäåëèòü äî êîíöà àáçàöà";
    SlotName[ dutch ] = "Tot aan einde alinea selecteren";
    SlotName[ french ] = "Sélect. jusqu'à la fin du paragraphe";
    SlotName[ spanish ] = "Seleccionar hasta final del párrafo";
    SlotName[ italian ] = "Seleziona fino alla fine del paragrafo";
    SlotName[ danish ] = "Marker til afsnittets slutning";
    SlotName[ swedish ] = "Markera till slutet av stycket";
    SlotName[ polish ] = "Zaznacz do koñca akapitu";
    SlotName[ portuguese_brazilian ] = "EndOfParaSel";
    SlotName[ japanese ] = "’i—Ž––‚܂őI‘ð";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁ¶ÎÂäβ¶Ë";
    SlotName[ chinese_traditional ] = "¿ï¨ú¦Ü¬q¸¨§ÀºÝ";
    SlotName[ arabic ] = "ÊÍÏíÏ ÍÊì äåÇíÉ ÇáÝÞÑÉ";
    SlotName[ dutch ] = "Tot aan einde alinea selecteren";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁ¶ÎÂäβ¶Ë";
    SlotName[ greek ] = "ÅðéëïãÞ åþò ôÝëïò ðáñáãñÜöïõ";
    SlotName[ korean ] = "´Ü¶ôÀÇ ³¡ ¼±ÅÃ";
    SlotName[ turkish ] = "Paragraf sonuna kadar seç";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_END_OF_PREV_COLUMN
{
    SlotName = "Zur vorherigen Spalte";
    SlotName [ english ] =  "Zur vorherigen Spalte";
    SlotName[ english_us ] = "To Previous Column";
    SlotName[ portuguese ] = "Ir para coluna anterior";
    SlotName[ russian ] = "Äî ïðåäûäóùåãî ñòîëáöà";
    SlotName[ dutch ] = "Naar vorige kolom";
    SlotName[ french ] = "A la colonne précédente";
    SlotName[ spanish ] = "Ir a la columna anterior";
    SlotName[ italian ] = "Alla colonna precedente";
    SlotName[ danish ] = "Til forrige kolonne";
    SlotName[ swedish ] = "Till föregående kolumn";
    SlotName[ polish ] = "Do poprzedniej kolumny";
    SlotName[ portuguese_brazilian ] = "GoToEndOfPrevColumn";
    SlotName[ japanese ] = "‘O‚Ì—ñ‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÉÏÒ»ÁÐ";
    SlotName[ chinese_traditional ] = "Âà¨ì¤W¤@Äæ";
    SlotName[ arabic ] = "Åáì ÇáÚãæÏ ÇáÓÇÈÞ";
    SlotName[ dutch ] = "Naar vorige kolom";
    SlotName[ chinese_simplified ] = "תµ½ÉÏÒ»ÁÐ";
    SlotName[ greek ] = "Ðñïò ôçí ðñïçãïýìåíç óôÞëç";
    SlotName[ korean ] = "ÀÌÀü ¿­À¸·Î";
    SlotName[ turkish ] = "Önceki sütuna";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_END_OF_PREV_PAGE
{
    SlotName = "Zum Ende vorheriger Seite";
    SlotName [ english ] =  "Zum Ende vorheriger Seite";
    SlotName[ english_us ] = "To End of Previous Page";
    SlotName[ portuguese ] = "Ir para fim da página anterior";
    SlotName[ russian ] = "Äî êîíöà ïðåäûäóùåé ñòðàíèöû";
    SlotName[ dutch ] = "Naar einde vorige pagina";
    SlotName[ french ] = "Aller à la fin de la page précédente";
    SlotName[ spanish ] = "Ir al final de la página anterior";
    SlotName[ italian ] = "Alla fine della pagina precedente";
    SlotName[ danish ] = "Til forrige sides slutning";
    SlotName[ swedish ] = "Till slutet av föregående sidan";
    SlotName[ polish ] = "Do koñca poprzedniej strony";
    SlotName[ portuguese_brazilian ] = "GoToEndOfPrevPage";
    SlotName[ japanese ] = "‘O‚ÌÍß°¼Þ––‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÉÏһҳβ¶Ë";
    SlotName[ chinese_traditional ] = "Âà¨ì¤W¤@­¶§À";
    SlotName[ arabic ] = "Åáì äåÇíÉ ÇáÕÝÍÉ ÇáÓÇÈÞÉ";
    SlotName[ dutch ] = "Naar einde vorige pagina";
    SlotName[ chinese_simplified ] = "תµ½ÉÏһҳβ¶Ë";
    SlotName[ greek ] = "Ðñïò ôÝëïò ðñïçãïýìåíçò óåëßäáò";
    SlotName[ korean ] = "ÀÌÀü ÆäÀÌÁö ³¡À¸·Î";
    SlotName[ turkish ] = "Öneki sayfanýn sonuna";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_END_OF_PREV_PAGE_SEL
{
    SlotName = "Bis Ende vorheriger Seite selektieren";
    SlotName [ english ] =  "Bis Ende vorheriger Seite selektieren";
    SlotName[ english_us ] = "Select to End of Previous Page";
    SlotName[ portuguese ] = "Seleccionar até fim da página anterior";
    SlotName[ russian ] = "Âûäåëèòü äî êîíöà ïðåäûäóùåé ñòðàíèöû";
    SlotName[ dutch ] = "Tot aan einde vorige pagina selecteren";
    SlotName[ french ] = "Sélect. jusqu'à la fin de la page précédente";
    SlotName[ spanish ] = "Seleccionar hasta el final de la página anterior";
    SlotName[ italian ] = "Fino alla fine della pagina precedente";
    SlotName[ danish ] = "Marker til forrige sides slutning";
    SlotName[ swedish ] = "Markera till slutet av föregående sidan";
    SlotName[ polish ] = "Zaznacz do koñca poprzedniej strony";
    SlotName[ portuguese_brazilian ] = "GoToEndOfPrevPageSel";
    SlotName[ japanese ] = "‘O‚ÌÍß°¼Þ––‚܂őI‘ð";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁÉÏһҳβ¶Ë";
    SlotName[ chinese_traditional ] = "¿ï¨ú¦Ü¤W¤@­¶§À";
    SlotName[ arabic ] = "ÊÍÏíÏ ÍÊì äåÇíÉ ÇáÕÝÍÉ ÇáÓÇÈÞÉ";
    SlotName[ dutch ] = "Tot aan einde vorige pagina selecteren";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁÉÏһҳβ¶Ë";
    SlotName[ greek ] = "ÅðéëïãÞ åþò ôÝëïò ðñïçãïýìåíçò óåëßäáò";
    SlotName[ korean ] = "ÀÌÀü ÆäÀÌÁö ³¡ ¼±ÅÃ";
    SlotName[ turkish ] = "Önceki sayfanýn sonuna kadar seç";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_END_TABLE
{
    SlotName = "Zum Tabellenende";
    SlotName [ english ] =  "Zum Tabellenende";
    SlotName[ english_us ] = "To Table End";
    SlotName[ portuguese ] = "Ir para fim da tabela";
    SlotName[ russian ] = "Äî êîíöà òàáëèöû";
    SlotName[ dutch ] = "Naar tabeleinde";
    SlotName[ french ] = "A la fin du tableau";
    SlotName[ spanish ] = "Ir al final de la tabla";
    SlotName[ italian ] = "Alla fine della tabella";
    SlotName[ danish ] = "Til tabellens slutning";
    SlotName[ swedish ] = "Till slutet av tabell";
    SlotName[ polish ] = "Do koñca tabeli";
    SlotName[ portuguese_brazilian ] = "GoToTableEnd";
    SlotName[ japanese ] = "•\\––‚Ö";
    SlotName[ chinese_simplified ] = "תµ½±í¸ñβ¶Ë";
    SlotName[ chinese_traditional ] = "Âà¨ìªí®æ§ÀºÝ";
    SlotName[ arabic ] = "Åáì äåÇíÉ ÇáÌÏæá";
    SlotName[ dutch ] = "Naar tabeleinde";
    SlotName[ chinese_simplified ] = "תµ½±í¸ñβ¶Ë";
    SlotName[ greek ] = "Ðñïò ôï ôÝëïò ôïõ ðßíáêá";
    SlotName[ korean ] = "Ç¥ ³¡À¸·Î";
    SlotName[ turkish ] = "Tablo sonu";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_ENVELOP
{
    SlotName = "Briefumschlag einfügen";
    SlotName [ english ] =  "Briefumschlag einfügen";
    SlotName[ english_us ] = "Insert Envelope";
    SlotName[ portuguese ] = "Inserir envelope";
    SlotName[ russian ] = "Âñòàâèòü êîíâåðò";
    SlotName[ dutch ] = "Envelop invoegen";
    SlotName[ french ] = "Insérer une enveloppe";
    SlotName[ spanish ] = "Insertar sobre";
    SlotName[ italian ] = "Inserisci busta";
    SlotName[ danish ] = "Indsæt konvolut";
    SlotName[ swedish ] = "Infoga kuvert";
    SlotName[ polish ] = "Wstaw kopertê";
    SlotName[ portuguese_brazilian ] = "InsertEnvelope";
    SlotName[ japanese ] = "••“›‚Ì‘}“ü";
    SlotName[ chinese_simplified ] = "²åÈëÐÅ·â";
    SlotName[ chinese_traditional ] = "´¡¤J«H«Ê";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÙÑÝ";
    SlotName[ dutch ] = "Envelop invoegen";
    SlotName[ chinese_simplified ] = "²åÈëÐÅ·â";
    SlotName[ greek ] = "ÅéóáãùãÞ öáêÝëïõ";
    SlotName[ korean ] = "ºÀÅõ »ðÀÔ";
    SlotName[ turkish ] = "Zarf ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_ESCAPE
{
    SlotName = "Abbrechen";
    SlotName [ english ] =  "Abbrechen";
    SlotName[ english_us ] = "Cancel";
    SlotName[ portuguese ] = "Cancelar";
    SlotName[ russian ] = "Îòìåíà";
    SlotName[ dutch ] = "Annuleren";
    SlotName[ french ] = "Annuler";
    SlotName[ spanish ] = "Cancelar";
    SlotName[ italian ] = "Escape";
    SlotName[ danish ] = "Annuller";
    SlotName[ swedish ] = "Avbryt";
    SlotName[ polish ] = "Anuluj";
    SlotName[ portuguese_brazilian ] = "Cancel";
    SlotName[ japanese ] = "·¬Ý¾Ù";
    SlotName[ chinese_simplified ] = "È¡Ïû";
    SlotName[ chinese_traditional ] = "¨ú®ø";
    SlotName[ arabic ] = "ÅáÛÇÁ ÇáÃãÑ";
    SlotName[ dutch ] = "Annuleren";
    SlotName[ chinese_simplified ] = "È¡Ïû";
    SlotName[ greek ] = "Áêýñùóç";
    SlotName[ korean ] = "Ãë¼Ò";
    SlotName[ turkish ] = "Ýptal";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_EXECUTE_MACROFIELD
{
    SlotName = "Makrofeld ausführen";
    SlotName [ english ] =  "Makrofeld ausführen";
    SlotName[ english_us ] = "Run Macro Field";
    SlotName[ portuguese ] = "Executar campo da macro";
    SlotName[ russian ] = "Âûïîëíèòü ïîëå ìàêðîñà";
    SlotName[ dutch ] = "Macroveld uitvoeren";
    SlotName[ french ] = "Exécuter le champ de macro";
    SlotName[ spanish ] = "Ejecutar Campo de macro";
    SlotName[ italian ] = "Esegui un campo macro";
    SlotName[ danish ] = "Udfør makrofelt";
    SlotName[ swedish ] = "Utför makrofält";
    SlotName[ polish ] = "Wykonaj pole makro";
    SlotName[ portuguese_brazilian ] = "ExecuteMacroField";
    SlotName[ japanese ] = "Ï¸Û Ì¨°ÙÄނ̎Às";
    SlotName[ chinese_simplified ] = "Ö´Ðкê×Ö¶Î";
    SlotName[ chinese_traditional ] = "°õ¦æ¥¨¶°Äæ¦ì";
    SlotName[ arabic ] = "ÊäÝíÐ ÍÞá ãÇßÑæ";
    SlotName[ dutch ] = "Macroveld uitvoeren";
    SlotName[ chinese_simplified ] = "Ö´Ðкê×Ö¶Î";
    SlotName[ greek ] = "ÅêôÝëåóç ðåäßïõ ìáêñïåíôïëÞò";
    SlotName[ korean ] = "¸ÅÅ©·Î ÇÊµå ½ÇÇà";
    SlotName[ turkish ] = "Makro alanýný çalýþtýr";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_EXPAND_GLOSSARY
{
    SlotName = "AutoText-Eintrag ausführen";
    SlotName [ english ] =  "AutoText-Eintrag ausführen";
    SlotName[ english_us ] = "Run AutoText Entry";
    SlotName[ portuguese ] = "Executar entrada do AutoTexto";
    SlotName[ russian ] = "Âûïîëíèòü çàïèñü àâòîòåêñòà";
    SlotName[ dutch ] = "AutoTekst-item uitvoeren";
    SlotName[ french ] = "Exécuter entrée AutoTexte";
    SlotName[ spanish ] = "Ejecutar entrada AutoTexto";
    SlotName[ italian ] = "Esegui digitazione testo automatico";
    SlotName[ danish ] = "Udfør Autoekst-element";
    SlotName[ swedish ] = "Utför AutoText-post";
    SlotName[ polish ] = "Wykonaj wpis autotekstu";
    SlotName[ portuguese_brazilian ] = "AutoTextEntryRun";
    SlotName[ japanese ] = "“ü—ÍŽx‰‡‚ÌŽÀs";
    SlotName[ chinese_simplified ] = "Ö´ÐÐ×Ô¶¯Í¼Îļ¯ÌõÄ¿";
    SlotName[ chinese_traditional ] = "°õ¦æ¦Û°Ê¹Ï¤å¶°¶µ¥Ø";
    SlotName[ arabic ] = "ÊäÝíÐ ÇáÅÏÎÇá ÇáÊáÞÇÆí ááäÕ";
    SlotName[ dutch ] = "AutoTekst-item uitvoeren";
    SlotName[ chinese_simplified ] = "Ö´ÐÐ×Ô¶¯Í¼Îļ¯ÌõÄ¿";
    SlotName[ greek ] = "ÅêôÝëåóç êáôá÷þñéóçò ÁõôïÊåéìÝíïõ";
    SlotName[ korean ] = "ÀÚµ¿ ÅØ½ºÆ® Ç׸ñ ½ÇÇà";
    SlotName[ turkish ] = "Otomatik metin giriþini uygula";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FLIP_HORZ_GRAFIC
{
    SlotName = "Horizontal spiegeln";
    SlotName [ english ] =  "Horizontal spiegeln";
    SlotName[ english_us ] = "Flip Horizontal";
    SlotName[ portuguese ] = "Reflectir na horizontal";
    SlotName[ russian ] = "Îòîáðàçèòü ïî ãîðèçîíòàëè";
    SlotName[ dutch ] = "Horizontaal spiegelen";
    SlotName[ french ] = "Refléter horizontalement";
    SlotName[ spanish ] = "Reflejar horizontal";
    SlotName[ italian ] = "Rispecchia orizzontalmente";
    SlotName[ danish ] = "Spejlvend vandret";
    SlotName[ swedish ] = "Spegla horisontellt";
    SlotName[ polish ] = "Przerzuæ w poziomie";
    SlotName[ portuguese_brazilian ] = "GraphicFlipHorizontal";
    SlotName[ japanese ] = "ã‰º”½“]";
    SlotName[ chinese_simplified ] = "ˮƽ·½Ïò·´Ó³";
    SlotName[ chinese_traditional ] = "¤ô¥­¤Ï¬M";
    SlotName[ arabic ] = "ÇäÚßÇÓ ÃÝÞí";
    SlotName[ dutch ] = "Horizontaal spiegelen";
    SlotName[ chinese_simplified ] = "ˮƽ·½Ïò·´Ó³";
    SlotName[ language_user1 ] = " ";
    SlotName[ greek ] = "Ïñéæüíôéá áíáóôñïöÞ";
    SlotName[ korean ] = "¼öÆòÀ¸·Î ´ëĪ";
    SlotName[ turkish ] = "Yatay yansýt";
};
SfxSlotInfo FN_FLIP_VERT_GRAFIC
{
    SlotName = "Vertikal spiegeln";
    SlotName [ english ] =  "Vertikal spiegeln";
    SlotName[ english_us ] = "Flip Vertical";
    SlotName[ portuguese ] = "Reflectir na vertical";
    SlotName[ russian ] = "Îòîáðàçèòü ïî âåðòèêàëè";
    SlotName[ dutch ] = "Verticaal spiegelen";
    SlotName[ french ] = "Refléter verticalement";
    SlotName[ spanish ] = "Reflejar verticalmente";
    SlotName[ italian ] = "Rispecchia verticalmente";
    SlotName[ danish ] = "Spejlvend lodret";
    SlotName[ swedish ] = "Spegla vertikalt";
    SlotName[ polish ] = "Przerzuæ w pionie";
    SlotName[ portuguese_brazilian ] = "FlipImageVertical";
    SlotName[ japanese ] = "¶‰E”½“]";
    SlotName[ chinese_simplified ] = "´¹Ö±·´Ó³";
    SlotName[ chinese_traditional ] = "««ª½¤Ï¬M";
    SlotName[ arabic ] = "ÇäÚßÇÓ ÑÃÓí";
    SlotName[ dutch ] = "Verticaal spiegelen";
    SlotName[ chinese_simplified ] = "´¹Ö±·´Ó³";
    SlotName[ greek ] = "ÊÜèåôç áíáóôñïöÞ";
    SlotName[ korean ] = "¼öÁ÷À¸·Î ´ëĪ";
    SlotName[ turkish ] = "Dikey yansýt";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FOOTNOTE_TO_ANCHOR
{
    SlotName = "Zu Fußnote/Anker";
    SlotName [ english ] =  "Zu Fußnote/Anker";
    SlotName[ english_us ] = "To Footnote Anchor";
    SlotName[ portuguese ] = "Ir para nota de rodapé/âncora";
    SlotName[ russian ] = "Äî ñíîñêè/ïðèâÿçêè";
    SlotName[ dutch ] = "Naar voetnoot/anker";
    SlotName[ french ] = "À la note d.b.d. page/l'appel de note";
    SlotName[ spanish ] = "Ir a la nota al pie/Ancla";
    SlotName[ italian ] = "Alla nota a piè pagina/richiamo";
    SlotName[ danish ] = "Til fodnote/anker";
    SlotName[ swedish ] = "Till fotnot/ankare";
    SlotName[ polish ] = "Do przypisu dolnego/kotwicy";
    SlotName[ portuguese_brazilian ] = "GoToFootnoteOrAnchor";
    SlotName[ japanese ] = "‹r’/±Ý¶°‚Ö";
    SlotName[ chinese_simplified ] = "תµ½×¢½Å/±ê¼Ç";
    SlotName[ chinese_traditional ] = "Âà¨ìµù¸}/¼Ð¸¹";
    SlotName[ arabic ] = "Åáì ÇáÍÇÔíÉ ÇáÓÝáíÉ/ÇáÅÑÓÇÁ";
    SlotName[ dutch ] = "Naar voetnoot/anker";
    SlotName[ chinese_simplified ] = "תµ½×¢½Å/±ê¼Ç";
    SlotName[ greek ] = "Ðñïò Õðïóçìåßùóç/Áãêýñùóç";
    SlotName[ korean ] = "¹Ù´Ú±Û °íÁ¤ À§Ä¡·Î";
    SlotName[ turkish ] = "Dipnot/sabitleyici";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FORMAT_BACKGROUND_DLG
{
    SlotName = "Hintergrund";
    SlotName [ english ] =  "Hintergrund";
    SlotName[ english_us ] = "Background";
    SlotName[ portuguese ] = "Plano de fundo";
    SlotName[ russian ] = "Ôîí";
    SlotName[ dutch ] = "Achtergrond";
    SlotName[ french ] = "Arrière-plan";
    SlotName[ spanish ] = "Fondo";
    SlotName[ italian ] = "Sfondo";
    SlotName[ danish ] = "Baggrund";
    SlotName[ swedish ] = "Bakgrund";
    SlotName[ polish ] = "T³o";
    SlotName[ portuguese_brazilian ] = "Background";
    SlotName[ japanese ] = "”wŒi";
    SlotName[ chinese_simplified ] = "±³¾°";
    SlotName[ chinese_traditional ] = "­I´º";
    SlotName[ arabic ] = "ÇáÎáÝíÉ";
    SlotName[ dutch ] = "Achtergrond";
    SlotName[ chinese_simplified ] = "±³¾°";
    SlotName[ greek ] = "Öüíôï";
    SlotName[ korean ] = "¹è°æ";
    SlotName[ turkish ] = "Artalan";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FORMAT_BORDER_DLG
{
    SlotName = "Umrandung";
    SlotName [ english ] =  "Umrandung";
    SlotName[ english_us ] = "Borders";
    SlotName[ portuguese ] = "Contornos";
    SlotName[ russian ] = "Îáðàìëåíèå";
    SlotName[ dutch ] = "Omranding";
    SlotName[ french ] = "Bordure";
    SlotName[ spanish ] = "Borde";
    SlotName[ italian ] = "Bordo";
    SlotName[ danish ] = "Ramme";
    SlotName[ swedish ] = "Inramning";
    SlotName[ polish ] = "Obramowanie";
    SlotName[ portuguese_brazilian ] = "Borders";
    SlotName[ japanese ] = "ŠO˜g";
    SlotName[ chinese_simplified ] = "±ß¿ò";
    SlotName[ chinese_traditional ] = "Ã䮨";
    SlotName[ arabic ] = "ÍÏæÏ";
    SlotName[ dutch ] = "Omranding";
    SlotName[ chinese_simplified ] = "±ß¿ò";
    SlotName[ greek ] = "Ðåñßãñáììá";
    SlotName[ korean ] = "°æ°è¼±";
    SlotName[ turkish ] = "Kenarlýk";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FORMAT_DROPCAPS
{
    SlotName = "Initialien";
    SlotName [ english ] =  "Initialien";
    SlotName[ english_us ] = "Drop Caps";
    SlotName[ portuguese ] = "Iniciais";
    SlotName[ russian ] = "Áóêâèöà";
    SlotName[ dutch ] = "Initialen";
    SlotName[ french ] = "Lettrines";
    SlotName[ spanish ] = "Iniciales";
    SlotName[ italian ] = "Capolettera";
    SlotName[ danish ] = "Initialer";
    SlotName[ swedish ] = "Anfangsbokstäver";
    SlotName[ polish ] = "Inicja³y";
    SlotName[ portuguese_brazilian ] = "FormatInitial";
    SlotName[ japanese ] = "ÄÞÛ¯Ìß·¬¯Ìß";
    SlotName[ chinese_simplified ] = "µ¥´ÊÊ××Öĸ´óд";
    SlotName[ chinese_traditional ] = "¦r­º¤j¼g";
    SlotName[ arabic ] = "ÇáÃÍÑÝ ÇáÇÓÊåáÇáíÉ";
    SlotName[ dutch ] = "Initialen";
    SlotName[ chinese_simplified ] = "µ¥´ÊÊ××Öĸ´óд";
    SlotName[ language_user1 ] = " ";
    SlotName[ greek ] = "Áñ÷ßãñáììá";
    SlotName[ korean ] = "´ë¹®ÀÚ ³õ±â";
    SlotName[ turkish ] = "Baþharfler";
};
SfxSlotInfo FN_FORMAT_FOOTNOTE_DLG
{
    SlotName = "Fußnoten";
    SlotName [ english ] =  "Fußnoten";
    SlotName[ english_us ] = "Footnotes";
    SlotName[ portuguese ] = "Notas de rodapé";
    SlotName[ russian ] = "Ñíîñêè";
    SlotName[ dutch ] = "Voetnoten";
    SlotName[ french ] = "Notes de bas de page";
    SlotName[ spanish ] = "Notas al pie";
    SlotName[ italian ] = "Note a piè pagina";
    SlotName[ danish ] = "Fodnoter";
    SlotName[ swedish ] = "Fotnoter";
    SlotName[ polish ] = "Przypisy";
    SlotName[ portuguese_brazilian ] = "ToolsFootnote";
    SlotName[ japanese ] = "‹r’";
    SlotName[ chinese_simplified ] = "×¢½Å";
    SlotName[ chinese_traditional ] = "µù¸}";
    SlotName[ arabic ] = "ÍæÇÔí ÓÝáíÉ";
    SlotName[ dutch ] = "Voetnoten";
    SlotName[ chinese_simplified ] = "×¢½Å";
    SlotName[ greek ] = "Õðïóçìåéþóåéò";
    SlotName[ korean ] = "¹Ù´Ú±Û";
    SlotName[ turkish ] = "Dipnot";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FORMAT_FRAME_DLG
{
    SlotName = "Rahmen Eigenschaften";
    SlotName [ english ] =  "Rahmen Eigenschaften";
    SlotName[ english_us ] = "Frame Properties";
    SlotName[ portuguese ] = "Propriedades da moldura";
    SlotName[ russian ] = "Ñâîéñòâà ðàìêè";
    SlotName[ dutch ] = "Kadereigenschappen";
    SlotName[ french ] = "Propriétés du cadre";
    SlotName[ spanish ] = "Propiedades del marco";
    SlotName[ italian ] = "Proprietà cornice";
    SlotName[ danish ] = "Ramme-egenskaber";
    SlotName[ swedish ] = "Ram egenskaper";
    SlotName[ polish ] = "Edytuj ramkê";
    SlotName[ portuguese_brazilian ] = "FormatFrame";
    SlotName[ japanese ] = "˜g‚ÌÌßÛÊßè";
    SlotName[ chinese_simplified ] = "Îı¾¿òÊôÐÔ";
    SlotName[ chinese_traditional ] = "¤å¦r¤è¶ôÄÝ©Ê";
    SlotName[ arabic ] = "ÎÕÇÆÕ ÇáÅØÇÑ";
    SlotName[ dutch ] = "Kadereigenschappen";
    SlotName[ chinese_simplified ] = "Îı¾¿òÊôÐÔ";
    SlotName[ greek ] = "Éäéüôçôåò ðëáéóßïõ";
    SlotName[ korean ] = "ÇÁ·¹ÀÓ µî·ÏÁ¤º¸";
    SlotName[ turkish ] = "Çerçeve özellikleri";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FORMAT_GRAFIC_DLG
{
    SlotName = "Grafik bearbeiten";
    SlotName [ english ] =  "Grafik bearbeiten";
    SlotName[ english_us ] = "Edit Graphics";
    SlotName[ portuguese ] = "Editar imagem";
    SlotName[ russian ] = "Ïðàâêà ðèñóíêà";
    SlotName[ dutch ] = "Afbeelding bewerken";
    SlotName[ french ] = "Éditer une image";
    SlotName[ spanish ] = "Editar imagen";
    SlotName[ italian ] = "Modifica immagine";
    SlotName[ danish ] = "Rediger billede";
    SlotName[ swedish ] = "Redigera grafik";
    SlotName[ polish ] = "Edytuj grafikê";
    SlotName[ portuguese_brazilian ] = "FormatGraphics";
    SlotName[ japanese ] = "}‚̕ҏW";
    SlotName[ chinese_simplified ] = "±à¼­Í¼ÐÎ";
    SlotName[ chinese_traditional ] = "½s¿è¹Ï¤ù";
    SlotName[ arabic ] = "ÊÍÑíÑ ÕæÑÉ";
    SlotName[ dutch ] = "Afbeelding bewerken";
    SlotName[ chinese_simplified ] = "±à¼­Í¼ÐÎ";
    SlotName[ greek ] = "Åðåîåñãáóßá ãñáöéêïý";
    SlotName[ korean ] = "±×·¡ÇÈ ÆíÁý";
    SlotName[ turkish ] = "Grafik düzenle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FORMAT_PAGE_COLUMN_DLG
{
    SlotName = "Seitenspalten";
    SlotName [ english ] =  "Seitenspalten";
    SlotName[ english_us ] = "Page Columns";
    SlotName[ portuguese ] = "Colunas de página";
    SlotName[ russian ] = "Êîëîíêè ñòðàíèöû";
    SlotName[ dutch ] = "Paginakolommen";
    SlotName[ french ] = "Colonnes de page";
    SlotName[ spanish ] = "Columnas de la página";
    SlotName[ italian ] = "Colonne pagina";
    SlotName[ danish ] = "Sidekolonner";
    SlotName[ swedish ] = "Sidkolumner";
    SlotName[ polish ] = "Kolumny na stronie";
    SlotName[ portuguese_brazilian ] = "FormatPageColumn";
    SlotName[ japanese ] = "’i‘g‚Ý";
    SlotName[ chinese_simplified ] = "Ò³ÃæÀ¸";
    SlotName[ chinese_traditional ] = "­¶­±Äæ";
    SlotName[ arabic ] = "ÃÚãÏÉ ÇáÕÝÍÉ";
    SlotName[ dutch ] = "Paginakolommen";
    SlotName[ chinese_simplified ] = "Ò³ÃæÀ¸";
    SlotName[ greek ] = "ÓôÞëåò óåëßäáò";
    SlotName[ korean ] = "ÆäÀÌÁö ¿­";
    SlotName[ turkish ] = "Sayfa sütunlarý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FORMAT_PAGE_DLG
{
    SlotName = "Seiteneinstellungen";
    SlotName [ english ] =  "Seiteneinstellungen";
    SlotName[ english_us ] = "Page Settings";
    SlotName[ portuguese ] = "Configurar página";
    SlotName[ russian ] = "Íàñòðîéêè ñòðàíèöû";
    SlotName[ dutch ] = "Pagina-instellingen";
    SlotName[ french ] = "Paramètres de page";
    SlotName[ spanish ] = "Configuración de página";
    SlotName[ italian ] = "Impostazioni di pagina";
    SlotName[ danish ] = "Sideopsætning";
    SlotName[ swedish ] = "Sidinställningar";
    SlotName[ polish ] = "Ustawienia strony";
    SlotName[ portuguese_brazilian ] = "FormatPage";
    SlotName[ japanese ] = "Íß°¼ÞÝ’è";
    SlotName[ chinese_simplified ] = "Ò³ÃæÉ趨";
    SlotName[ chinese_traditional ] = "³]©w­¶­±";
    SlotName[ arabic ] = "ÅÚÏÇÏÇÊ ÇáÕÝÍÉ";
    SlotName[ dutch ] = "Pagina-instellingen";
    SlotName[ chinese_simplified ] = "Ò³ÃæÉ趨";
    SlotName[ greek ] = "Äéáìüñöùóç óåëßäáò";
    SlotName[ korean ] = "ÆäÀÌÁö ¼³Á¤";
    SlotName[ turkish ] = "Sayfa yapýsý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FORMAT_RESET
{
    SlotName = "Zeichenattribute zurücksetzen";
    SlotName [ english ] =  "Zeichenattribute zurücksetzen";
    SlotName[ english_us ] = "Reset Font Attributes";
    SlotName[ portuguese ] = "Repor atributos dos caracteres";
    SlotName[ russian ] = "Âîññòàíîâèòü àòðèáóòû øðèôòà";
    SlotName[ dutch ] = "Tekenattributen terugzetten";
    SlotName[ french ] = "Restaurer les attributs de caractères";
    SlotName[ spanish ] = "Restablecer fuentes";
    SlotName[ italian ] = "Ripristina attributi carattere";
    SlotName[ danish ] = "Nulstil tegnattributter";
    SlotName[ swedish ] = "Återställ teckenattribut";
    SlotName[ polish ] = "Zresetuj atrybuty znaków";
    SlotName[ portuguese_brazilian ] = "DefaultFont";
    SlotName[ japanese ] = "•¶Žš‘®«‚Ìؾ¯Ä";
    SlotName[ chinese_simplified ] = "ÖØÉè×Ö·ûÊôÐÔ";
    SlotName[ chinese_traditional ] = "­«³]¦r¤¸ÄÝ©Ê";
    SlotName[ arabic ] = "ÅÚÇÏÉ ÊÚííä ÓãÇÊ ÇáÎØæØ";
    SlotName[ dutch ] = "Tekenattributen terugzetten";
    SlotName[ chinese_simplified ] = "ÖØÉè×Ö·ûÊôÐÔ";
    SlotName[ language_user1 ] = " ";
    SlotName[ greek ] = "ÅðáíáöïñÜ éäéïôÞôùí ÷áñáêôÞñùí";
    SlotName[ korean ] = "±Û²Ã ¼Ó¼º ¿ø·¡´ë·Î";
    SlotName[ turkish ] = "Yazýtipi öznitelikleri";
};
SfxSlotInfo FN_FORMAT_TABLE_DLG
{
    SlotName = "Tabelle bearbeiten";
    SlotName [ english ] =  "Tabelle bearbeiten";
    SlotName[ english_us ] = "Edit Table";
    SlotName[ portuguese ] = "Editar tabela";
    SlotName[ russian ] = "Ïðàâêà òàáëèöû";
    SlotName[ dutch ] = "Tabel bewerken";
    SlotName[ french ] = "Éditer le tableau";
    SlotName[ spanish ] = "Editar tabla";
    SlotName[ italian ] = "Modifica tabella";
    SlotName[ danish ] = "Rediger tabel";
    SlotName[ swedish ] = "Redigera tabell";
    SlotName[ polish ] = "Edytuj tabelê";
    SlotName[ portuguese_brazilian ] = "FormatTable";
    SlotName[ japanese ] = "•\\‚̕ҏW";
    SlotName[ chinese_simplified ] = "±à¼­±í¸ñ";
    SlotName[ chinese_traditional ] = "½s¿èªí®æ";
    SlotName[ arabic ] = "ÊÍÑíÑ ÌÏæá";
    SlotName[ dutch ] = "Tabel bewerken";
    SlotName[ chinese_simplified ] = "±à¼­±í¸ñ";
    SlotName[ greek ] = "Åðåîåñãáóßá ðßíáêá";
    SlotName[ korean ] = "Ç¥ ÆíÁý";
    SlotName[ turkish ] = "Tablo düzenle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FRAME_ALIGN_HORZ_CENTER
{
    SlotName = "Horizontal zentrieren";
    SlotName [ english ] =  "Horizontal zentrieren";
    SlotName[ english_us ] = "Center Horizontal";
    SlotName[ portuguese ] = "Centrar horizontalmente";
    SlotName[ russian ] = "Öåíòðèðîâàòü ïî ãîðèçîíòàëè";
    SlotName[ dutch ] = "Horizontaal centreren";
    SlotName[ french ] = "Centrer horizontalement";
    SlotName[ spanish ] = "Centrar horizontalmente";
    SlotName[ italian ] = "Allinea orizzontale";
    SlotName[ danish ] = "Centrer vandret";
    SlotName[ swedish ] = "Centrera horisontellt";
    SlotName[ polish ] = "Wyœrodkuj poziomo";
    SlotName[ portuguese_brazilian ] = "PositionFrameCenteredHorizontal";
    SlotName[ japanese ] = "’†‰›‘µ‚¦(¶‰E)";
    SlotName[ chinese_simplified ] = "ˮƽ·½Ïò¾ÓÖÐ";
    SlotName[ chinese_traditional ] = "¤ô¥­¸m¤¤";
    SlotName[ arabic ] = "ÊæÓíØ ÃÝÞí";
    SlotName[ dutch ] = "Horizontaal centreren";
    SlotName[ chinese_simplified ] = "ˮƽ·½Ïò¾ÓÖÐ";
    SlotName[ greek ] = "ÊåíôñÜñéóìá ïñéæïíôßùò";
    SlotName[ korean ] = "°¡¿îµ¥ °¡·Î";
    SlotName[ turkish ] = "Yatay ortala";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FRAME_ALIGN_HORZ_LEFT
{
    SlotName = "Links anordnen";
    SlotName [ english ] =  "Links anordnen";
    SlotName[ english_us ] = "Align Left";
    SlotName[ portuguese ] = "Alinhar à esquerda";
    SlotName[ russian ] = "Âûðîâíÿòü ïî ëåâîìó êðàþ";
    SlotName[ dutch ] = "Links positioneren";
    SlotName[ french ] = "Aligner à gauche";
    SlotName[ spanish ] = "Alinear a la izquierda";
    SlotName[ italian ] = "Disponi a sinistra";
    SlotName[ danish ] = "Placer til venstre";
    SlotName[ swedish ] = "Placera till vänster";
    SlotName[ polish ] = "Wyrównaj do lewej";
    SlotName[ portuguese_brazilian ] = "PositionFrameLeft";
    SlotName[ japanese ] = "¶‘µ‚¦";
    SlotName[ chinese_simplified ] = "Ïò×ó¶ÔÆë";
    SlotName[ chinese_traditional ] = "¦V¥ª¹ï»ô";
    SlotName[ arabic ] = "ãÍÇÐÇÉ Åáì ÇáíÓÇÑ";
    SlotName[ dutch ] = "Links positioneren";
    SlotName[ chinese_simplified ] = "Ïò×ó¶ÔÆë";
    SlotName[ greek ] = "Óôïß÷éóç áñéóôåñÜ";
    SlotName[ korean ] = "¿ÞÂÊ ¸ÂÃã";
    SlotName[ turkish ] = "Sola hizala";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FRAME_ALIGN_HORZ_RIGHT
{
    SlotName = "Rechts anordnen";
    SlotName [ english ] =  "Rechts anordnen";
    SlotName[ english_us ] = "Align Right";
    SlotName[ portuguese ] = "Alinhar à direita";
    SlotName[ russian ] = "Âûðîâíÿòü ïî ïðàâîìó êðàþ";
    SlotName[ dutch ] = "Rechts positioneren";
    SlotName[ french ] = "Aligner à droite";
    SlotName[ spanish ] = "Alinear a la derecha";
    SlotName[ italian ] = "Disponi a destra";
    SlotName[ danish ] = "Placer til højre";
    SlotName[ swedish ] = "Placera till höger";
    SlotName[ polish ] = "Wyrównaj do prawej";
    SlotName[ portuguese_brazilian ] = "PositionFrameRight";
    SlotName[ japanese ] = "‰E‘µ‚¦";
    SlotName[ chinese_simplified ] = "ÏòÓÒ¶ÔÆë";
    SlotName[ chinese_traditional ] = "¦V¥k¹ï»ô";
    SlotName[ arabic ] = "ãÍÇÐÇÉ Åáì Çáíãíä";
    SlotName[ dutch ] = "Rechts positioneren";
    SlotName[ chinese_simplified ] = "ÏòÓÒ¶ÔÆë";
    SlotName[ greek ] = "Óôïß÷éóç äåîéÜ";
    SlotName[ korean ] = "¿À¸¥ÂÊ ¸ÂÃã";
    SlotName[ turkish ] = "Saða hizala";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FRAME_ALIGN_VERT_BOTTOM
{
    SlotName = "Unten anordnen";
    SlotName [ english ] =  "Unten anordnen";
    SlotName[ english_us ] = "Align Bottom";
    SlotName[ portuguese ] = "Alinhar em baixo";
    SlotName[ russian ] = "Âûðîâíÿòü ïî íèæíåìó êðàþ";
    SlotName[ dutch ] = "Beneden positioneren";
    SlotName[ french ] = "Aligner en bas";
    SlotName[ spanish ] = "Alinear abajo";
    SlotName[ italian ] = "Disponi in basso";
    SlotName[ danish ] = "Placer nederst";
    SlotName[ swedish ] = "Placera vid underkant";
    SlotName[ polish ] = "Wyrównaj do do³u";
    SlotName[ portuguese_brazilian ] = "PositionFrameBottom";
    SlotName[ japanese ] = "‰º‘µ‚¦";
    SlotName[ chinese_simplified ] = "ÏòÏÂ¶ÔÆë";
    SlotName[ chinese_traditional ] = "¦V¤U¹ï»ô";
    SlotName[ arabic ] = "ãÍÇÐÇÉ Åáì ÃÓÝá";
    SlotName[ dutch ] = "Beneden positioneren";
    SlotName[ chinese_simplified ] = "ÏòÏÂ¶ÔÆë";
    SlotName[ greek ] = "Óôïß÷éóç êÜôù";
    SlotName[ korean ] = "¾Æ·¡ ¸ÂÃã";
    SlotName[ turkish ] = "Aþaðý hizala";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FRAME_ALIGN_VERT_CENTER
{
    SlotName = "Vertikal mittig anordnen";
    SlotName [ english ] =  "Vertikal mittig anordnen";
    SlotName[ english_us ] = "Align Vertical Center";
    SlotName[ portuguese ] = "Alinhar na vertical ao centro";
    SlotName[ russian ] = "Âûðîâíÿòü ïî âåðòèêàëè â öåíòðå";
    SlotName[ dutch ] = "Verticaal gecentreerd positioneren";
    SlotName[ french ] = "Aligner verticalement au centre";
    SlotName[ spanish ] = "Alinear al centro vertical";
    SlotName[ italian ] = "Disponi al centro verticalmente";
    SlotName[ danish ] = "Juster vandret centreret";
    SlotName[ swedish ] = "Placera vertikalt centrerat";
    SlotName[ polish ] = "Wyrównaj pionowo do œrodka";
    SlotName[ portuguese_brazilian ] = "PositionFrameVerticalCenter";
    SlotName[ japanese ] = "’†‰›‘µ‚¦(ã‰ºj";
    SlotName[ chinese_simplified ] = "´¹Ö±¾ÓÖÐ¶ÔÆë";
    SlotName[ chinese_traditional ] = "««ª½¸m¤¤¹ï»ô";
    SlotName[ arabic ] = "ãÍÇÐÇÉ ãÑßÒíÉ ÑÃÓíÉ";
    SlotName[ dutch ] = "Verticaal gecentreerd positioneren";
    SlotName[ chinese_simplified ] = "´¹Ö±¾ÓÖÐ¶ÔÆë";
    SlotName[ greek ] = "Êáôáêüñõöç êåíôñáñéóìÝíç óôïß÷éóç";
    SlotName[ korean ] = "¼¼·Î Áß¾Ó¿¡ ¸ÂÃã";
    SlotName[ turkish ] = "Dikey ortaya hizala";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FRAME_ALIGN_VERT_CHAR_BOTTOM
{
    SlotName = "Am Zeichen unten anordnen";
    SlotName [ english ] =  "Am Zeichen unten anordnen";
    SlotName[ english_us ] = "Align to Bottom of Character";
    SlotName[ portuguese ] = "Alinhar abaixo do carácter";
    SlotName[ russian ] = "Âûðîâíÿòü ïî çíàêó ñíèçó";
    SlotName[ dutch ] = "Onder aan teken positioneren";
    SlotName[ french ] = "Aligner au caractère en bas";
    SlotName[ spanish ] = "Alinear debajo del carácter";
    SlotName[ italian ] = "Allinea al carattere in basso";
    SlotName[ danish ] = "Juster til tegn forneden";
    SlotName[ swedish ] = "Placera vid tecknets underkant";
    SlotName[ polish ] = "Wyrównaj do znaku na dole";
    SlotName[ portuguese_brazilian ] = "PositionFrameCharBottom";
    SlotName[ japanese ] = "‰º‘µ‚¦(•¶Žš)";
    SlotName[ chinese_simplified ] = "Ïò×Ö·ûµ×²¿¶ÔÆë";
    SlotName[ chinese_traditional ] = "¦V¤U©M¦r¤¸¹ï»ô";
    SlotName[ arabic ] = "ãÍÇÐÇÉ Åáì ÃÓÝá ÇáÃÍÑÝ";
    SlotName[ dutch ] = "Onder aan teken positioneren";
    SlotName[ chinese_simplified ] = "Ïò×Ö·ûµ×²¿¶ÔÆë";
    SlotName[ greek ] = "Óôïß÷éóç ùò ðñïò ÷áñáêôÞñá êÜôù";
    SlotName[ korean ] = "¹®ÀÚÀÇ ¾Æ·¡¿¡ ¸ÂÃã";
    SlotName[ turkish ] = "Karakterin alt kenarý ile hizala";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FRAME_ALIGN_VERT_CHAR_CENTER
{
    SlotName = "Am Zeichen vertikal mittig anordnen";
    SlotName [ english ] =  "Am Zeichen vertikal mittig anordnen";
    SlotName[ english_us ] = "Align to Vertical Center of Character";
    SlotName[ portuguese ] = "Alinhar na vertical ao centro do carácter";
    SlotName[ russian ] = "Âûðîâíÿòü ïî çíàêó âåðòèêàëüíî â öåíòðå";
    SlotName[ dutch ] = "Verticaal gecentreerd positioneren aan teken";
    SlotName[ french ] = "Aligner au milieu vertical du caractère";
    SlotName[ spanish ] = "Alinear al centro vertical del carácter";
    SlotName[ italian ] = "Allinea al carattere verticalmente al centro";
    SlotName[ danish ] = "Juster til tegn lodret centreret";
    SlotName[ swedish ] = "Placera vertikalt centrerat till tecknet";
    SlotName[ polish ] = "Umieœæ przy znaku pionowo w œrodku";
    SlotName[ portuguese_brazilian ] = "PositionFrameVerticalCharCenter";
    SlotName[ japanese ] = "’†‰›‘µ‚¦(•¶Žš¥ã‰º)";
    SlotName[ chinese_simplified ] = "´¹Ö±¾ÓÖкÍ×Ö·û¶ÔÆë";
    SlotName[ chinese_traditional ] = "««ª½¸m¤¤©M¦r¤¸¹ï»ô";
    SlotName[ arabic ] = "ãÍÇÐÇÉ ÑÃÓíÉ ãÑßÒíÉ ÈÇáäÓÈÉ ááÃÍÑÝ";
    SlotName[ dutch ] = "Verticaal gecentreerd positioneren aan teken";
    SlotName[ chinese_simplified ] = "´¹Ö±¾ÓÖкÍ×Ö·û¶ÔÆë";
    SlotName[ greek ] = "Êáôáêüñõöç êåíôñáñéóìÝíç óôïß÷éóç ùò ðñïò ÷áñáêôÞñá";
    SlotName[ korean ] = "¹®ÀÚÀÇ ¼¼·Î °¡¿îµ¥ ¸ÂÃã";
    SlotName[ turkish ] = "Karaktere göre dikey ortalayarak hizala";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FRAME_ALIGN_VERT_CHAR_TOP
{
    SlotName = "Am Zeichen oben anordnen";
    SlotName [ english ] =  "Am Zeichen oben anordnen";
    SlotName[ english_us ] = "Align to Top of Character";
    SlotName[ portuguese ] = "Alinhar acima do carácter";
    SlotName[ russian ] = "Âûðîâíÿòü ïî çíàêó ñâåðõó";
    SlotName[ dutch ] = "Boven aan teken positioneren";
    SlotName[ french ] = "Aligner au caractère en haut";
    SlotName[ spanish ] = "Alinear encima del carácter";
    SlotName[ italian ] = "Allinea al carattere in alto";
    SlotName[ danish ] = "Juster til tegn foroven";
    SlotName[ swedish ] = "Placera vid tecknets överkant";
    SlotName[ polish ] = "Wyrównaj do znaku w górze";
    SlotName[ portuguese_brazilian ] = "PositionFrameCharTop";
    SlotName[ japanese ] = "ã‘µ‚¦(•¶Žš)";
    SlotName[ chinese_simplified ] = "ºÍ×Ö·ûÉϲ¿¶ÔÆë";
    SlotName[ chinese_traditional ] = "¦V¤W©M¦r¤¸¹ï»ô";
    SlotName[ arabic ] = "ãÍÇÐÇÉ Åáì ÃÚáì ÇáÃÍÑÝ";
    SlotName[ dutch ] = "Boven aan teken positioneren";
    SlotName[ chinese_simplified ] = "ºÍ×Ö·ûÉϲ¿¶ÔÆë";
    SlotName[ greek ] = "Óôïß÷éóç ùò ðñïò ÷áñáêôÞñá Üíù";
    SlotName[ korean ] = "¹®ÀÚÀÇ À§¿¡ ¸ÂÃã";
    SlotName[ turkish ] = "Karakterin üst kenarý ile hizala";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FRAME_ALIGN_VERT_ROW_BOTTOM
{
    SlotName = "An Zeile unten anordnen";
    SlotName [ english ] =  "An Zeile unten anordnen";
    SlotName[ english_us ] = "Align to Bottom of Line";
    SlotName[ portuguese ] = "Alinhar na linha inferior";
    SlotName[ russian ] = "Âûðîâíÿòü ïî ñòðîêå ñíèçó";
    SlotName[ dutch ] = "Onder aan regel positioneren";
    SlotName[ french ] = "Aligner en bas de la ligne";
    SlotName[ spanish ] = "Alinear debajo de la línea";
    SlotName[ italian ] = "Allinea alla riga in basso";
    SlotName[ danish ] = "Juster til række forneden";
    SlotName[ swedish ] = "Placera vid radens underkant";
    SlotName[ polish ] = "Wyrównaj do wiersza w dole";
    SlotName[ portuguese_brazilian ] = "PositionFrameRowBottom";
    SlotName[ japanese ] = "‰º‘µ‚¦(sj";
    SlotName[ chinese_simplified ] = "ºÍÐеĵײ¿¶ÔÆë";
    SlotName[ chinese_traditional ] = "©M¤U¤@¦æ¹ï»ô";
    SlotName[ arabic ] = "ãÍÇÐÇÉ Åáì ÃÓÝá ÇáÓØÑ";
    SlotName[ dutch ] = "Onder aan regel positioneren";
    SlotName[ chinese_simplified ] = "ºÍÐеĵײ¿¶ÔÆë";
    SlotName[ greek ] = "Óôïß÷éóç ùò ðñïò ãñáììÞ êÜôù";
    SlotName[ korean ] = "¼±ÀÇ ¹Ø¿¡ ¸ÂÃã";
    SlotName[ turkish ] = "Satýrýn alt kenarý ile hizala";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FRAME_ALIGN_VERT_ROW_CENTER
{
    SlotName = "An Zeile vertikal mittig anordnen";
    SlotName [ english ] =  "An Zeile vertikal mittig anordnen";
    SlotName[ english_us ] = "Align to Vertical Center of Line";
    SlotName[ portuguese ] = "Centrar objecto verticalmente na linha";
    SlotName[ russian ] = "Âûðîâíÿòü ïî ñòðîêå âåðòèêàëüíî â öåíòðå";
    SlotName[ dutch ] = "Verticaal gecentreerd positioneren aan regel";
    SlotName[ french ] = "Aligner au milieu vertical de la ligne";
    SlotName[ spanish ] = "Alinear centro vertical línea";
    SlotName[ italian ] = "Allinea alla riga verticale al centro";
    SlotName[ danish ] = "Juster til række lodret centreret";
    SlotName[ swedish ] = "Placera vertikalt centrerat på raden";
    SlotName[ polish ] = "Umieœæ przy wierszu pionowo w œrodku";
    SlotName[ portuguese_brazilian ] = "PositionFrameVerticalRowCenter";
    SlotName[ japanese ] = "’†‰›‘µ‚¦(s¥ã‰ºj";
    SlotName[ chinese_simplified ] = "´¹Ö±¾ÓÖкÍÐÐ¶ÔÆë";
    SlotName[ chinese_traditional ] = "««ª½¸m¤¤©M¦æ¹ï»ô";
    SlotName[ arabic ] = "ãÍÇÐÇÉ ÑÃÓíÉ ãÑßÒíÉ ÈÇáäÓÈÉ ááÓØÑ";
    SlotName[ dutch ] = "Verticaal gecentreerd positioneren aan regel";
    SlotName[ chinese_simplified ] = "´¹Ö±¾ÓÖкÍÐÐ¶ÔÆë";
    SlotName[ greek ] = "Êáôáêüñõöç êåíôñáñéóìÝíç óôïß÷éóç ùò ðñïò ãñáììÞ";
    SlotName[ korean ] = "¼±ÀÇ ¼¼·Î °¡¿îµ¥ ¸ÂÃã";
    SlotName[ turkish ] = "Satýra göre dikey ortalayarak hizala";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FRAME_ALIGN_VERT_ROW_TOP
{
    SlotName = "An Zeile oben anordnen";
    SlotName [ english ] =  "An Zeile oben anordnen";
    SlotName[ english_us ] = "Align to Top of Line";
    SlotName[ portuguese ] = "Alinhar na linha superior";
    SlotName[ russian ] = "Âûðîâíÿòü ïî ñòðîêå ñâåðõó";
    SlotName[ dutch ] = "Boven aan regel positioneren";
    SlotName[ french ] = "Aligner en haut de la ligne";
    SlotName[ spanish ] = "Alinear encima de la línea";
    SlotName[ italian ] = "Allinea alla riga in alto";
    SlotName[ danish ] = "Juster til række foroven";
    SlotName[ swedish ] = "Placera vid radens överkant";
    SlotName[ polish ] = "Wyrównaj do wiersza w dole";
    SlotName[ portuguese_brazilian ] = "PositionFrameRowTop";
    SlotName[ japanese ] = "ã‘µ‚¦(s)";
    SlotName[ chinese_simplified ] = "ºÍÐеÄÉÏ·½¶ÔÆë";
    SlotName[ chinese_traditional ] = "¦V¤W©M¦æ¹ï»ô";
    SlotName[ arabic ] = "ãÍÇÐÇÉ Åáì ÃÚáì ÇáÓØÑ";
    SlotName[ dutch ] = "Boven aan regel positioneren";
    SlotName[ chinese_simplified ] = "ºÍÐеÄÉÏ·½¶ÔÆë";
    SlotName[ greek ] = "Óôïß÷éóç ùò ðñïò ãñáììÞ Üíù";
    SlotName[ korean ] = "¼±ÀÇ À§¿¡ ¸ÂÃã";
    SlotName[ turkish ] = "Satýrýn üst kenarý ile hizala";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FRAME_ALIGN_VERT_TOP
{
    SlotName = "Oben anordnen";
    SlotName [ english ] =  "Oben anordnen";
    SlotName[ english_us ] = "Align Top";
    SlotName[ portuguese ] = "Alinhar em cima";
    SlotName[ russian ] = "Âûðîâíÿòü ïî âåðõíåìó êðàþ";
    SlotName[ dutch ] = "Boven positioneren";
    SlotName[ french ] = "Aligner en haut";
    SlotName[ spanish ] = "Alinear arriba";
    SlotName[ italian ] = "Disponi in alto";
    SlotName[ danish ] = "Placer øverst";
    SlotName[ swedish ] = "Placera vid överkant";
    SlotName[ polish ] = "Wyrównaj do góry";
    SlotName[ portuguese_brazilian ] = "PositionFrameTop";
    SlotName[ japanese ] = "ã‘µ‚¦";
    SlotName[ chinese_simplified ] = "ÏòÉÏ¶ÔÆë";
    SlotName[ chinese_traditional ] = "¦V¤W¹ï»ô";
    SlotName[ arabic ] = "ãÍÇÐÇÉ Åáì ÃÚáì";
    SlotName[ dutch ] = "Boven positioneren";
    SlotName[ chinese_simplified ] = "ÏòÉÏ¶ÔÆë";
    SlotName[ greek ] = "Óôïß÷éóç ðÜíù";
    SlotName[ korean ] = "À§ ¸ÂÃã";
    SlotName[ turkish ] = "Yukarý hizala";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FRAME_CHAIN
{
    SlotName = "Verketten";
    SlotName [ english ] =  "Verketten";
    SlotName[ english_us ] = "Link Frames";
    SlotName[ portuguese ] = "Ligar molduras";
    SlotName[ russian ] = "Ñöåïëåíèå";
    SlotName[ dutch ] = "Koppelen";
    SlotName[ french ] = "Enchaîner";
    SlotName[ spanish ] = "Vincular marcos";
    SlotName[ italian ] = "Concatena";
    SlotName[ danish ] = "Kæd";
    SlotName[ swedish ] = "Kedja";
    SlotName[ polish ] = "Po³¹cz";
    SlotName[ portuguese_brazilian ] = "ChainFrames";
    SlotName[ japanese ] = "÷½ÄÎÞ¯¸½‚̘AŒ‹";
    SlotName[ chinese_simplified ] = "Á¬½Ó";
    SlotName[ chinese_traditional ] = "³sµ²";
    SlotName[ arabic ] = "ÑÈØ";
    SlotName[ dutch ] = "Koppelen";
    SlotName[ chinese_simplified ] = "Á¬½Ó";
    SlotName[ greek ] = "Óýíäåóç";
    SlotName[ korean ] = "ÇÁ·¹ÀÓ ¿¬°á";
    SlotName[ turkish ] = "Baðla";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FRAME_DOWN
{
    SlotName = "Nach hinten";
    SlotName [ english ] =  "Nach hinten";
    SlotName[ english_us ] = "Send Backward";
    SlotName[ portuguese ] = "Para trás";
    SlotName[ russian ] = "Íàçàä";
    SlotName[ dutch ] = "Naar achteren";
    SlotName[ french ] = "Vers l'arrière";
    SlotName[ spanish ] = "Hacia atrás";
    SlotName[ italian ] = "Indietro";
    SlotName[ danish ] = "Flyt bagud";
    SlotName[ swedish ] = "Bakåt";
    SlotName[ polish ] = "Do ty³u";
    SlotName[ portuguese_brazilian ] = "ObjectBackOne";
    SlotName[ japanese ] = "Œã‚ë‚Ö";
    SlotName[ chinese_simplified ] = "ºóÖÃ";
    SlotName[ chinese_traditional ] = "«á¸m";
    SlotName[ arabic ] = "ÅÑÓÇá ÎáÝÇð";
    SlotName[ dutch ] = "Naar achteren";
    SlotName[ chinese_simplified ] = "ºóÖÃ";
    SlotName[ greek ] = "Ðßóù";
    SlotName[ korean ] = "µÚ·Î º¸³»±â";
    SlotName[ turkish ] = "Geriye gönder";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FRAME_MIRROR_ON_EVEN_PAGES
{
    SlotName = "Auf geraden Seiten spiegeln";
    SlotName [ english ] =  "Auf geraden Seiten spiegeln";
    SlotName[ english_us ] = "Mirror Object on Even Pages";
    SlotName[ portuguese ] = "Reflectir nas páginas pares";
    SlotName[ russian ] = "Îòîáðàçèòü íà ÷åòíûõ ñòðàíèöàõ";
    SlotName[ dutch ] = "Op even pagina's spiegelen";
    SlotName[ french ] = "Refléter sur les pages paires";
    SlotName[ spanish ] = "Reflejar objeto en páginas pares";
    SlotName[ italian ] = "Rispecchia sulle pagine pari";
    SlotName[ danish ] = "Spejlvend på lige sider";
    SlotName[ swedish ] = "Spegla på jämna sidor";
    SlotName[ polish ] = "Przerzuæ na parzystych stronach";
    SlotName[ portuguese_brazilian ] = "MirrorOnEvenPages";
    SlotName[ japanese ] = "‹ô”Íß°¼Þ‚É”½“]";
    SlotName[ chinese_simplified ] = "·´Ó³µ½Å¼ÊýÒ³Ãæ";
    SlotName[ chinese_traditional ] = "¤Ï¬M¨ì°¸¼Æ­¶­±";
    SlotName[ arabic ] = "ÇäÚßÇÓ Úáì ÇáÕÝÍÇÊ ÇáÒæÌíÉ";
    SlotName[ dutch ] = "Op even pagina's spiegelen";
    SlotName[ chinese_simplified ] = "·´Ó³µ½Å¼ÊýÒ³Ãæ";
    SlotName[ greek ] = "Êáôïðôñéóìüò óå ìïíÝò óåëßäåò";
    SlotName[ korean ] = "¦¼ö ÆäÀÌÁö¿¡¼­ ´ëĪ";
    SlotName[ turkish ] = "Çift numaralý sayfalarda yansýt";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FRAME_NOWRAP
{
    SlotName = "Umlauf aus";
    SlotName [ english ] =  "Umlauf aus";
    SlotName[ english_us ] = "Wrap Off";
    SlotName[ portuguese ] = "Desactivar ajuste";
    SlotName[ russian ] = "Îòêë. îáòåêàíèå";
    SlotName[ dutch ] = "Omloop uit";
    SlotName[ french ] = "Pas d'adaptation";
    SlotName[ spanish ] = "Desactivar Ajuste";
    SlotName[ italian ] = "Scorrimento off";
    SlotName[ danish ] = "Deaktiver ombrydning";
    SlotName[ swedish ] = "Textanpassning av";
    SlotName[ polish ] = "Wy³¹cz obieg";
    SlotName[ portuguese_brazilian ] = "FrameWrapOff";
    SlotName[ japanese ] = "Ü‚è•Ô‚µ@µÌ";
    SlotName[ chinese_simplified ] = "²»Ê¹Óû·ÈÆ";
    SlotName[ chinese_traditional ] = "¤£¨Ï¥ÎÀô¶´«¦æ";
    SlotName[ arabic ] = "ÅíÞÇÝ ÇáÇáÊÝÇÝ";
    SlotName[ dutch ] = "Omloop uit";
    SlotName[ chinese_simplified ] = "²»Ê¹Óû·ÈÆ";
    SlotName[ greek ] = "Áðåíåñãïðïßçóç áíáäßðëùóçò";
    SlotName[ korean ] = "¼øÈ¯ ÇØÁ¦";
    SlotName[ turkish ] = "Metin daðýlýmý kapalý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FRAME_TO_ANCHOR
{
    SlotName = "Setze Cursor auf Anker";
    SlotName [ english ] =  "Setze Cursor auf Anker";
    SlotName[ english_us ] = "Set Cursor To Anchor";
    SlotName[ portuguese ] = "Colocar cursor sobre a âncora";
    SlotName[ russian ] = "Óñòàíîâèòü êóðñîð ê ïðèâÿçêå";
    SlotName[ dutch ] = "Zet cursor op anker";
    SlotName[ french ] = "Positionne curseur sur l'ancre";
    SlotName[ spanish ] = "Colocar cursor sobre ancla";
    SlotName[ italian ] = "Porta cursore all'ancoraggio";
    SlotName[ danish ] = "Sæt markør på anker";
    SlotName[ swedish ] = "Sätt markören på ankaret";
    SlotName[ polish ] = "Ustaw kursor na kotwicy";
    SlotName[ portuguese_brazilian ] = "SetCursorToAnchor";
    SlotName[ japanese ] = "¶°¿Ù‚ð±Ý¶°‚ɐݒu";
    SlotName[ chinese_simplified ] = "Öùâ±êÓÚ±ê¼Ç´¦";
    SlotName[ chinese_traditional ] = "¥ú¼ÐÂà¨ì¼Ð¸¹";
    SlotName[ arabic ] = "æÖÚ ÇáãÄÔÑ Úáì ÇáÅÑÓÇÁ";
    SlotName[ dutch ] = "Zet cursor op anker";
    SlotName[ chinese_simplified ] = "Öùâ±êÓÚ±ê¼Ç´¦";
    SlotName[ greek ] = "ÔïðïèÝôçóç äåßêôç óå áãêýñùóç";
    SlotName[ korean ] = "Ä¿¼­ °íÁ¤ ¼³Á¤";
    SlotName[ turkish ] = "Ýmleci, sabitleyici üzerine yerleþtir";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FRAME_UNCHAIN
{
    SlotName = "Verkettung lösen";
    SlotName [ english ] =  "Verkettung lösen";
    SlotName[ english_us ] = "Unlink Frames";
    SlotName[ portuguese ] = "Desligar molduras";
    SlotName[ russian ] = "Îòìåíèòü ñöåïëåíèå";
    SlotName[ dutch ] = "Koppeling verwijderen";
    SlotName[ french ] = "Libérer l'enchaînement";
    SlotName[ spanish ] = "Eliminar vínculo";
    SlotName[ italian ] = "Annulla concatenazione";
    SlotName[ danish ] = "Ophæv kæder";
    SlotName[ swedish ] = "Lösgör sammanfogning";
    SlotName[ polish ] = "Roz³¹cz ramki";
    SlotName[ portuguese_brazilian ] = "UnhainFrames";
    SlotName[ japanese ] = "÷½ÄÎÞ¯¸½˜AŒ‹‚̉ðœ";
    SlotName[ chinese_simplified ] = "½â¿ªÁ¬½Ó";
    SlotName[ chinese_traditional ] = "§R°£³sµ²";
    SlotName[ arabic ] = "Ýß ÇáÊÑÇÈØ";
    SlotName[ dutch ] = "Koppeling verwijderen";
    SlotName[ chinese_simplified ] = "½â¿ªÁ¬½Ó";
    SlotName[ greek ] = "ÊáôÜñãçóç óýíäåóçò";
    SlotName[ korean ] = "ÇÁ·¹ÀÓ ¿¬°áÁß´Ü";
    SlotName[ turkish ] = "Baðlamayý çöz";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FRAME_UP
{
    SlotName = "Nach vorn";
    SlotName [ english ] =  "Nach vorn";
    SlotName[ english_us ] = "Bring Forward";
    SlotName[ portuguese ] = "Para a frente";
    SlotName[ russian ] = "Âïåðåä";
    SlotName[ dutch ] = "Naar voren";
    SlotName[ french ] = "Vers l'avant";
    SlotName[ spanish ] = "Hacia adelante";
    SlotName[ italian ] = "In avanti";
    SlotName[ danish ] = "Flyt fremad";
    SlotName[ swedish ] = "Framåt";
    SlotName[ polish ] = "Do przodu";
    SlotName[ portuguese_brazilian ] = "ObjectForwardOne";
    SlotName[ japanese ] = "‘O‚Ö";
    SlotName[ chinese_simplified ] = "ǰÖÃ";
    SlotName[ chinese_traditional ] = "«e¸m";
    SlotName[ arabic ] = "ÅÍÖÇÑ ÃãÇãÇð";
    SlotName[ dutch ] = "Naar voren";
    SlotName[ chinese_simplified ] = "ǰÖÃ";
    SlotName[ greek ] = "Ðñïò ôá åìðñüò";
    SlotName[ korean ] = "¾ÕÀ¸·Î °¡Á®¿À±â";
    SlotName[ turkish ] = "Öne al";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FRAME_WRAP
{
    SlotName = "Umlauf ein";
    SlotName [ english ] =  "Umlauf ein";
    SlotName[ english_us ] = "Wrap On";
    SlotName[ portuguese ] = "Activar ajuste";
    SlotName[ russian ] = "Âêë. îáòåêàíèå";
    SlotName[ dutch ] = "Omloop in";
    SlotName[ french ] = "Adaptation du texte";
    SlotName[ spanish ] = "Activar Ajuste";
    SlotName[ italian ] = "Scorrimento on";
    SlotName[ danish ] = "Aktiver ombrydning";
    SlotName[ swedish ] = "Textanpassning på";
    SlotName[ polish ] = "W³¹cz obieg";
    SlotName[ portuguese_brazilian ] = "FrameWrapOn";
    SlotName[ japanese ] = "Ü‚è•Ô‚µ µÝ";
    SlotName[ chinese_simplified ] = "ʹÓû·ÈÆ";
    SlotName[ chinese_traditional ] = "¨Ï¥Î´«¦æ";
    SlotName[ arabic ] = "ÊÔÛíá ÇáÇáÊÝÇÝ";
    SlotName[ dutch ] = "Omloop in";
    SlotName[ chinese_simplified ] = "ʹÓû·ÈÆ";
    SlotName[ greek ] = "Åíåñãïðïßçóç áíáäßðëùóçò";
    SlotName[ korean ] = "¼øÈ¯ Àû¿ë";
    SlotName[ turkish ] = "Metin daðýlýmý açýk";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FRAME_WRAP_CONTOUR
{
    SlotName = "Konturumlauf ein";
    SlotName [ english ] =  "Konturumlauf ein";
    SlotName[ english_us ] = "Wrap Contour On";
    SlotName[ portuguese ] = "Activar contornos";
    SlotName[ russian ] = "Âêë. îáòåêàíèå ïî êîíòóðó";
    SlotName[ dutch ] = "Contouromloop aan";
    SlotName[ french ] = "Mode Contour";
    SlotName[ spanish ] = "Contorno";
    SlotName[ italian ] = "Scorrimento sul contorno on";
    SlotName[ danish ] = "Aktiver konturombrydning";
    SlotName[ swedish ] = "Konturanpassning på";
    SlotName[ polish ] = "W³¹cz obieg konturu";
    SlotName[ portuguese_brazilian ] = "WrapContour";
    SlotName[ japanese ] = "—ÖŠsÜ‚è•Ô‚µ µÝ";
    SlotName[ chinese_simplified ] = "ÏÔʾÂÖÀª»·ÈÆ";
    SlotName[ chinese_traditional ] = "Åã¥Ü½ü¹øÀô¶";
    SlotName[ arabic ] = "ÊÔÛíá ÇáÊÝÇÝ ÇáÍÏæÏ ÇáÎÇÑÌíÉ";
    SlotName[ dutch ] = "Contouromloop aan";
    SlotName[ chinese_simplified ] = "ÏÔʾÂÖÀª»·ÈÆ";
    SlotName[ greek ] = "Ìå áíáäßðëùóç ðåñéãñÜììáôïò";
    SlotName[ korean ] = "À±°û ¼øÈ¯ Àû¿ë";
    SlotName[ turkish ] = "Kontur açýk";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FRAME_WRAP_IDEAL
{
    SlotName = "Umlauf dynamisch";
    SlotName [ english ] =  "Umlauf dynamisch";
    SlotName[ english_us ] = "Wrap Optimal";
    SlotName[ portuguese ] = "Ajuste dinâmico";
    SlotName[ russian ] = "Îáòåêàíèå îïòèìàëüíî";
    SlotName[ dutch ] = "Omloop dynamisch";
    SlotName[ french ] = "Adaptation dynamique";
    SlotName[ spanish ] = "Ajuste dinámico";
    SlotName[ italian ] = "Scorrimento dinamico";
    SlotName[ danish ] = "Dynamisk ombrydning";
    SlotName[ swedish ] = "Dynamisk textanpassning";
    SlotName[ polish ] = "Obieg dynamiczny";
    SlotName[ portuguese_brazilian ] = "FrameWrapIdeal";
    SlotName[ japanese ] = "“®“I‚Ȑ܂è•Ô‚µ";
    SlotName[ chinese_simplified ] = "×î¼Ñ»·ÈÆ";
    SlotName[ chinese_traditional ] = "¦Û°ÊÀô¶´«¦æ";
    SlotName[ arabic ] = "ÇáÊÝÇÝ ÏíäÇãíßí";
    SlotName[ dutch ] = "Omloop dynamisch";
    SlotName[ chinese_simplified ] = "×î¼Ñ»·ÈÆ";
    SlotName[ language_user1 ] = " ";
    SlotName[ greek ] = "ÄõíáìéêÞ áíáäßðëùóç";
    SlotName[ korean ] = "ÃÖÀû ¼øÈ¯";
    SlotName[ turkish ] = "Dinamik metin daðýlýmý";
};
SfxSlotInfo FN_FRAME_WRAP_LEFT
{
    SlotName = "Umlauf links";
    SlotName [ english ] =  "Umlauf links";
    SlotName[ english_us ] = "Wrap Left";
    SlotName[ portuguese ] = "Ajuste à esquerda";
    SlotName[ russian ] = "Îáòåêàíèå ñëåâà";
    SlotName[ dutch ] = "Omloop links";
    SlotName[ french ] = "Adaptation à gauche";
    SlotName[ spanish ] = "Ajuste izquierda";
    SlotName[ italian ] = "Scorrimento a sinistra";
    SlotName[ danish ] = "Ombrydning til venstre";
    SlotName[ swedish ] = "Textanpassning vänster";
    SlotName[ polish ] = "Obieg z lewej";
    SlotName[ portuguese_brazilian ] = "WrapLeft";
    SlotName[ japanese ] = "Ü‚è•Ô‚µ ¶";
    SlotName[ chinese_simplified ] = "×óÏò»·ÈÆ";
    SlotName[ chinese_traditional ] = "¥ª¦V´«¦æ";
    SlotName[ arabic ] = "ÇáÊÝÇÝ Åáì ÇáíÓÇÑ";
    SlotName[ dutch ] = "Omloop links";
    SlotName[ chinese_simplified ] = "×óÏò»·ÈÆ";
    SlotName[ greek ] = "Áíáäßðëùóç áñéóôåñÜ";
    SlotName[ korean ] = "¿ÞÂÊ ¼øÈ¯";
    SlotName[ turkish ] = "Sol metin daðýlýmý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FRAME_WRAP_RIGHT
{
    SlotName = "Umlauf rechts";
    SlotName [ english ] =  "Umlauf rechts";
    SlotName[ english_us ] = "Wrap Right";
    SlotName[ portuguese ] = "Ajuste à direita";
    SlotName[ russian ] = "Îáòåêàíèå ñïðàâà";
    SlotName[ dutch ] = "Omloop rechts";
    SlotName[ french ] = "Adaptation à droite";
    SlotName[ spanish ] = "Ajuste derecha";
    SlotName[ italian ] = "Scorrimento a destra";
    SlotName[ danish ] = "Ombrydning til højre";
    SlotName[ swedish ] = "Textanpassning höger";
    SlotName[ polish ] = "Obieg z prawej";
    SlotName[ portuguese_brazilian ] = "WrapRight";
    SlotName[ japanese ] = "Ü‚è•Ô‚µ ‰E";
    SlotName[ chinese_simplified ] = "ÓÒÏò»·ÈÆ";
    SlotName[ chinese_traditional ] = "¥k¦V´«¦æ";
    SlotName[ arabic ] = "ÇáÊÝÇÝ Åáì Çáíãíä";
    SlotName[ dutch ] = "Omloop rechts";
    SlotName[ chinese_simplified ] = "ÓÒÏò»·ÈÆ";
    SlotName[ greek ] = "Áíáäßðëùóç äåîéÜ";
    SlotName[ korean ] = "¿À¸¥ÂÊ ¼øÈ¯";
    SlotName[ turkish ] = "Sað metin daðýlýmý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FRAME_WRAPTHRU
{
    SlotName = "Durchlauf";
    SlotName [ english ] =  "Durchlauf";
    SlotName[ english_us ] = "Wrap Through";
    SlotName[ portuguese ] = "Através do objecto";
    SlotName[ russian ] = "Ñêâîçíîå îáòåêàíèå";
    SlotName[ dutch ] = "Doorloop";
    SlotName[ french ] = "À travers";
    SlotName[ spanish ] = "Continuo";
    SlotName[ italian ] = "Attraverso";
    SlotName[ danish ] = "Gennemgående";
    SlotName[ swedish ] = "Textgenomflöde";
    SlotName[ polish ] = "Przep³yw tekstu";
    SlotName[ portuguese_brazilian ] = "FrameWrapThrough";
    SlotName[ japanese ] = "Ü‚è•Ô‚µ‚È‚µ";
    SlotName[ chinese_simplified ] = "¹á´©";
    SlotName[ chinese_traditional ] = "¤£Àô¶";
    SlotName[ arabic ] = "ÚÈÑ";
    SlotName[ dutch ] = "Doorloop";
    SlotName[ chinese_simplified ] = "¹á´©";
    SlotName[ greek ] = "Äéá ìÝóïõ";
    SlotName[ korean ] = "Àüü ¼øÈ¯";
    SlotName[ turkish ] = "Metin arkasýna gönder";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FRAME_WRAPTHRU_TRANSP
{
    SlotName = "Durchlauf transparent";
    SlotName [ english ] =  "Durchlauf transparent";
    SlotName[ english_us ] = "Wrap Transparent";
    SlotName[ portuguese ] = "Ajuste contínuo transparente";
    SlotName[ russian ] = "Ïðîçðà÷íîå ñêâîçíîå îáòåêàíèå";
    SlotName[ dutch ] = "Doorloop transparant";
    SlotName[ french ] = "À l'arrière-plan transparent";
    SlotName[ spanish ] = "Continuo transparente";
    SlotName[ italian ] = "Attraversa trasparente";
    SlotName[ danish ] = "Transparent gennemgående";
    SlotName[ swedish ] = "Tranparent textgenomflöde";
    SlotName[ polish ] = "Przezroczysty przep³yw tekstu";
    SlotName[ portuguese_brazilian ] = "FrameWrapThroughTransparent";
    SlotName[ japanese ] = "”wŒi‚Æ‚µ‚Ä";
    SlotName[ chinese_simplified ] = "͸Ã÷¹á´©";
    SlotName[ chinese_traditional ] = "¤£Àô¶³z©ú";
    SlotName[ arabic ] = "ÇáÊÝÇÝ ÔÝÇÝ";
    SlotName[ dutch ] = "Doorloop transparant";
    SlotName[ chinese_simplified ] = "͸Ã÷¹á´©";
    SlotName[ greek ] = "Áíáäßðëùóç äéáöáíÝò";
    SlotName[ korean ] = "Åõ¸í ¼øÈ¯";
    SlotName[ turkish ] = "Metin arkasýna gönder (saydam)";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_GLOSSARY_DLG
{
    SlotName = "Autotext bearbeiten";
    SlotName [ english ] =  "Autotext bearbeiten";
    SlotName[ english_us ] = "Edit AutoText";
    SlotName[ portuguese ] = "Editar AutoTexto";
    SlotName[ russian ] = "Ïðàâêà Àâòîòåêñòà";
    SlotName[ dutch ] = "AutoTekst bewerken";
    SlotName[ french ] = "Éditer l'AutoTexte";
    SlotName[ spanish ] = "Editar AutoTexto";
    SlotName[ italian ] = "Modifica testo automatico";
    SlotName[ danish ] = "Rediger AutoTekst";
    SlotName[ swedish ] = "Redigera AutoText";
    SlotName[ polish ] = "Edytuj autotekst";
    SlotName[ portuguese_brazilian ] = "EditAutoText";
    SlotName[ japanese ] = "“ü—ÍŽx‰‡‚ŕҏW";
    SlotName[ chinese_simplified ] = "±à¼­×Ô¶¯Í¼Îļ¯";
    SlotName[ chinese_traditional ] = "½s¿è¦Û°Ê¹Ï¤å¶°";
    SlotName[ arabic ] = "ÊÍÑíÑ ÇáäÕ ÇáÊáÞÇÆí";
    SlotName[ dutch ] = "AutoTekst bewerken";
    SlotName[ chinese_simplified ] = "±à¼­×Ô¶¯Í¼Îļ¯";
    SlotName[ greek ] = "ÁõôïÊåßìåíï";
    SlotName[ korean ] = "ÀÚµ¿ ÅØ½ºÆ®";
    SlotName[ turkish ] = "Otomatik metni düzenle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_GOTO_NEXT_INPUTFLD
{
    SlotName = "Zum nächsten Eingabefeld";
    SlotName [ english ] =  "Zum nächsten Eingabefeld";
    SlotName[ english_us ] = "To Next Input Field";
    SlotName[ portuguese ] = "Ir para campo de entrada seguinte";
    SlotName[ russian ] = "Ïåðåéòè ê ñëåäóþùåìó ïîëþ ââîäà";
    SlotName[ dutch ] = "Naar volgend invoerveld";
    SlotName[ french ] = "Au champ de saisie suivant";
    SlotName[ spanish ] = "Ir al campo de entrada siguiente";
    SlotName[ italian ] = "Al campo di digitazione successivo";
    SlotName[ danish ] = "Til næste input-felt";
    SlotName[ swedish ] = "Till nästa inmatningsfält";
    SlotName[ polish ] = "Do nastêpnego pola wprowadzania";
    SlotName[ portuguese_brazilian ] = "GotoNextInputField";
    SlotName[ japanese ] = "ŽŸ‚Ì“ü—ÍÎÞ¯¸½‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÏÂÒ»¸öÊäÈë×Ö¶Î";
    SlotName[ chinese_traditional ] = "Âà¨ì¤U¤@­Ó¿é¤JÄæ¦ì";
    SlotName[ arabic ] = "Åáì ÍÞá ÇáÅÏÎÇá ÇáÊÇáí";
    SlotName[ dutch ] = "Naar volgend invoerveld";
    SlotName[ chinese_simplified ] = "תµ½ÏÂÒ»¸öÊäÈë×Ö¶Î";
    SlotName[ greek ] = "Ðñïò ôï åðüìåíï ðåäßï åéóáãùãÞò";
    SlotName[ korean ] = "´ÙÀ½ ÀÔ·Â Çʵå·Î";
    SlotName[ turkish ] = "Sonraki giriþ alaný";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_GOTO_NEXT_MARK
{
    SlotName = "Zum nächsten Platzhalter";
    SlotName [ english ] =  "Zum nächsten Platzhalter";
    SlotName[ english_us ] = "To Next Placeholder";
    SlotName[ portuguese ] = "Marcador de posição seguinte";
    SlotName[ russian ] = "Ïåðåéòè ê ñëåäóþùåìó ìåñòîçàïîëíèòåëþ";
    SlotName[ dutch ] = "Naar volgende plaatsvervanger";
    SlotName[ french ] = "Au substituant suivant";
    SlotName[ spanish ] = "Ir al comodín siguiente";
    SlotName[ italian ] = "Al segnaposto successivo";
    SlotName[ danish ] = "Til næste pladsholder";
    SlotName[ swedish ] = "Till nästa platshållare";
    SlotName[ polish ] = "Do nastêpnego znaku- wype³niacza";
    SlotName[ portuguese_brazilian ] = "GotoNextPlacemarker";
    SlotName[ japanese ] = "ŽŸ‚ÌÌßÚ°½ÎÙÀނÖ";
    SlotName[ chinese_simplified ] = "תµ½ÏÂÒ»¸öͨÅä·û";
    SlotName[ chinese_traditional ] = "Âà¨ì¤U¤@­Ó³q°t²Å";
    SlotName[ arabic ] = "Åáì ÇáÚäÕÑ ÇáäÇÆÈ ÇáÊÇáí";
    SlotName[ dutch ] = "Naar volgende plaatsvervanger";
    SlotName[ chinese_simplified ] = "תµ½ÏÂÒ»¸öͨÅä·û";
    SlotName[ greek ] = "Ðñïò ôï åðüìåíï óýìâïëï êñÜôçóçò èÝóçò";
    SlotName[ korean ] = "´ÙÀ½ °³Ã¼Æ²·Î";
    SlotName[ turkish ] = "Sonraki genel arama karakteri";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_GOTO_NEXT_OBJ
{
    SlotName = "Zum nächsten Objekt";
    SlotName [ english ] =  "Zum nächsten Objekt";
    SlotName[ english_us ] = "To Next Object";
    SlotName[ portuguese ] = "Ir para objecto seguinte";
    SlotName[ russian ] = "Äî ñëåäóþùåãî îáúåêòà";
    SlotName[ dutch ] = "Naar volgend object";
    SlotName[ french ] = "A l'objet suivant";
    SlotName[ spanish ] = "Ir al objeto siguiente";
    SlotName[ italian ] = "All'oggetto successivo";
    SlotName[ danish ] = "Til næste objekt";
    SlotName[ swedish ] = "Till nästa objekt";
    SlotName[ polish ] = "Do nastêpnego obiektu";
    SlotName[ portuguese_brazilian ] = "GotoNextObject";
    SlotName[ japanese ] = "ŽŸ‚̵ÌÞ¼Þª¸Ä‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÏÂÒ»¸ö¶ÔÏó";
    SlotName[ chinese_traditional ] = "Âà¨ì¤U¤@­Óª«¥ó";
    SlotName[ arabic ] = "Åáì ÇáßÇÆä ÇáÊÇáí";
    SlotName[ dutch ] = "Naar volgend object";
    SlotName[ chinese_simplified ] = "תµ½ÏÂÒ»¸ö¶ÔÏó";
    SlotName[ greek ] = "Åðüìåíï áíôéêåßìåíï";
    SlotName[ korean ] = "´ÙÀ½ °³Ã¼·Î";
    SlotName[ turkish ] = "Sonraki nesne";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_GOTO_NEXT_REGION
{
    SlotName = "Zum nächsten Bereich";
    SlotName [ english ] =  "Zum nächsten Bereich";
    SlotName[ english_us ] = "To Next Section";
    SlotName[ portuguese ] = "Secção seguinte";
    SlotName[ russian ] = "Äî ñëåäóþùåãî ðàçäåëà";
    SlotName[ dutch ] = "Naar volgend bereik";
    SlotName[ french ] = "A la section suivante";
    SlotName[ spanish ] = "A la área siguiente";
    SlotName[ italian ] = "All'area successiva";
    SlotName[ danish ] = "Til næste område";
    SlotName[ swedish ] = "Till nästa område";
    SlotName[ polish ] = "Do nastêpnego obszaru";
    SlotName[ portuguese_brazilian ] = "JumpToNextRegion";
    SlotName[ japanese ] = "ŽŸ‚̗̈æ‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÏÂÒ»ÇøÓò";
    SlotName[ chinese_traditional ] = "Âà¨ì¤U¤@°Ï°ì";
    SlotName[ arabic ] = "Åáì ÇáäØÇÞ ÇáÊÇáí";
    SlotName[ dutch ] = "Naar volgend bereik";
    SlotName[ chinese_simplified ] = "תµ½ÏÂÒ»ÇøÓò";
    SlotName[ greek ] = "Åðüìåíç åíüôçôá";
    SlotName[ korean ] = "´ÙÀ½ ±¸¿ªÀ¸·Î";
    SlotName[ turkish ] = "Sonraki bölüm";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_GOTO_PREV_INPUTFLD
{
    SlotName = "Zum vorherigen Eingabefeld";
    SlotName [ english ] =  "Zum vorherigen Eingabefeld";
    SlotName[ english_us ] = "To Previous Input Field";
    SlotName[ portuguese ] = "Ir para campo de entrada anterior";
    SlotName[ russian ] = "Äî ïðåäûäóùåãî ïîëÿ ââîäà";
    SlotName[ dutch ] = "Naar vorig invoerveld";
    SlotName[ french ] = "Au champ de saisie précédent";
    SlotName[ spanish ] = "Ir al campo de entrada anterior";
    SlotName[ italian ] = "Al campo di digitazione precedente";
    SlotName[ danish ] = "Til forrige input-felt";
    SlotName[ swedish ] = "Till föregående inmatningsfält";
    SlotName[ polish ] = "Do poprzedniego pola wprowadzania";
    SlotName[ portuguese_brazilian ] = "GoToPrevInputField";
    SlotName[ japanese ] = "‘O‚Ì“ü—ÍÎÞ¯¸½‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÉÏÒ»¸öÊäÈë×Ö¶Î";
    SlotName[ chinese_traditional ] = "Âà¨ì¤W¤@¿é¤JÄæ¦ì";
    SlotName[ arabic ] = "Åáì ÍÞá ÇáÅÏÎÇá ÇáÓÇÈÞ";
    SlotName[ dutch ] = "Naar vorig invoerveld";
    SlotName[ chinese_simplified ] = "תµ½ÉÏÒ»¸öÊäÈë×Ö¶Î";
    SlotName[ greek ] = "Ðñïò ôï ðñïçãïýìåíï ðåäßï åéóáãùãÞò";
    SlotName[ korean ] = "ÀÌÀü ÀÔ·Â Çʵå·Î";
    SlotName[ turkish ] = "Önceki giriþ alaný";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_GOTO_PREV_MARK
{
    SlotName = "Zum vorherigen Platzhalter";
    SlotName [ english ] =  "Zum vorherigen Platzhalter";
    SlotName[ english_us ] = "To Previous Placeholder";
    SlotName[ portuguese ] = "Marcador de posição anterior";
    SlotName[ russian ] = "Äî ïðåäûäóùåãî ìåñòîçàïîëíèòåëÿ";
    SlotName[ dutch ] = "Naar vorige plaatsvervanger";
    SlotName[ french ] = "Au substituant précédent";
    SlotName[ spanish ] = "Ir al comodín anterior";
    SlotName[ italian ] = "Al segnaposto precedente";
    SlotName[ danish ] = "Til forrige pladsholder";
    SlotName[ swedish ] = "Till föregående platshållare";
    SlotName[ polish ] = "Do poprzedniego znaku-wype³niacza";
    SlotName[ portuguese_brazilian ] = "GoToPrevPlacemarker";
    SlotName[ japanese ] = "‘O‚ÌÌßÚ°½ÎÙÀނÖ";
    SlotName[ chinese_simplified ] = "תµ½ÉÏÒ»¸öͨÅä·û";
    SlotName[ chinese_traditional ] = "Âà¨ì¤W¤@­Ó³q°t²Å";
    SlotName[ arabic ] = "Åáì ÇáÚäÕÑ ÇáäÇÆÈ ÇáÓÇÈÞ";
    SlotName[ dutch ] = "Naar vorige plaatsvervanger";
    SlotName[ chinese_simplified ] = "תµ½ÉÏÒ»¸öͨÅä·û";
    SlotName[ greek ] = "Ðñïò ôï ðñïçãïýìåíï óýìâïëï êñÜôçóçò èÝóçò";
    SlotName[ korean ] = "ÀÌÀü °³Ã¼Æ²·Î";
    SlotName[ turkish ] = "Önceki  genel arama karakteri";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_GOTO_PREV_OBJ
{
    SlotName = "Zum vorherigen Objekt";
    SlotName [ english ] =  "Zum vorherigen Objekt";
    SlotName[ english_us ] = "To Previous Object";
    SlotName[ portuguese ] = "Ir para objecto anterior";
    SlotName[ russian ] = "Äî ïðåäûäóùåãî îáúåêòà";
    SlotName[ dutch ] = "Naar vorig object";
    SlotName[ french ] = "Aller à l'objet précédent";
    SlotName[ spanish ] = "Ir al objeto anterior";
    SlotName[ italian ] = "All'oggetto precedente";
    SlotName[ danish ] = "Til forrige objekt";
    SlotName[ swedish ] = "Till föregående objekt";
    SlotName[ polish ] = "Do poprzedniego objektu";
    SlotName[ portuguese_brazilian ] = "GoToPrevObject";
    SlotName[ japanese ] = "‘O‚̵ÌÞ¼Þª¸Ä‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÉÏÒ»¸ö¶ÔÏó";
    SlotName[ chinese_traditional ] = "Âà¨ì¤W¤@­Óª«¥ó";
    SlotName[ arabic ] = "Åáì ÇáßÇÆä ÇáÓÇÈÞ";
    SlotName[ dutch ] = "Naar vorig object";
    SlotName[ chinese_simplified ] = "תµ½ÉÏÒ»¸ö¶ÔÏó";
    SlotName[ greek ] = "Ðñïçãïýìåíï áíôéêåßìåíï";
    SlotName[ korean ] = "ÀÌÀü °³Ã¼·Î";
    SlotName[ turkish ] = "Önceki nesne";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_GOTO_PREV_REGION
{
    SlotName = "Zum vorherigen Bereich";
    SlotName [ english ] =  "Zum vorherigen Bereich";
    SlotName[ english_us ] = "To Previous Section";
    SlotName[ portuguese ] = "Secção anterior";
    SlotName[ russian ] = "Äî ïðåäûäóùåãî ðàçäåëà";
    SlotName[ dutch ] = "Naar vorige bereik";
    SlotName[ french ] = "A la section précédente";
    SlotName[ spanish ] = "Ir al área anterior";
    SlotName[ italian ] = "All'area precedente";
    SlotName[ danish ] = "Til forrige område";
    SlotName[ swedish ] = "Till föregående område";
    SlotName[ polish ] = "Do nastêpnego obszaru";
    SlotName[ portuguese_brazilian ] = "JumpToPrevRegion";
    SlotName[ japanese ] = "‘O‚̗̈æ‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÉÏÒ»¸öÇøÓò";
    SlotName[ chinese_traditional ] = "Âà¨ì¤W¤@­Ó°Ï°ì";
    SlotName[ arabic ] = "Åáì ÇáäØÇÞ ÇáÓÇÈÞ";
    SlotName[ dutch ] = "Naar vorige bereik";
    SlotName[ chinese_simplified ] = "תµ½ÉÏÒ»¸öÇøÓò";
    SlotName[ greek ] = "Ðñïçãïýìåíç åíüôçôá";
    SlotName[ korean ] = "ÀÌÀü ±¸¿ªÀ¸·Î";
    SlotName[ turkish ] = "Önceki alan";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_GOTO_REFERENCE
{
    SlotName = "Zur Referenz";
    SlotName [ english ] =  "Zur Referenz";
    SlotName[ english_us ] = "To Reference";
    SlotName[ portuguese ] = "Ir para referência";
    SlotName[ russian ] = "Äî ññûëêè";
    SlotName[ dutch ] = "Bij verwijzing";
    SlotName[ french ] = "A la référence";
    SlotName[ spanish ] = "Ir a la referencia";
    SlotName[ italian ] = "Al riferimento";
    SlotName[ danish ] = "Til reference";
    SlotName[ swedish ] = "Till referens";
    SlotName[ polish ] = "Do odwo³ania";
    SlotName[ portuguese_brazilian ] = "GoToReference";
    SlotName[ japanese ] = "ŽQÆ‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÒýÓÃ";
    SlotName[ chinese_traditional ] = "Âà¨ì°Ñ·Ó";
    SlotName[ arabic ] = "Åáì ÇáãÑÌÚ";
    SlotName[ dutch ] = "Bij verwijzing";
    SlotName[ chinese_simplified ] = "תµ½ÒýÓÃ";
    SlotName[ greek ] = "Ðñïò áíáöïñÜ";
    SlotName[ korean ] = "ÂüÁ¶·Î";
    SlotName[ turkish ] = "Referans";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_GRAPHIC_MIRROR_ON_EVEN_PAGES
{
    SlotName = "Grafik auf geraden Seiten spiegeln";
    SlotName [ english ] =  "Grafik auf geraden Seiten spiegeln";
    SlotName[ english_us ] = "Flip Graphics on Even Pages";
    SlotName[ portuguese ] = "Reflectir imagem nas páginas pares";
    SlotName[ russian ] = "Îòîáðàçèòü îáúåêòû íà ÷åòíûõ ñòðàíèöàõ";
    SlotName[ dutch ] = "Afbeeldingen op even pagina's spiegelen";
    SlotName[ french ] = "Refléter l'image sur les pages paires";
    SlotName[ spanish ] = "Reflejar imagen en las páginas pares";
    SlotName[ italian ] = "Rispecchia le immagini sulle pagine pari";
    SlotName[ danish ] = "Spejlvend grafik på lige sider";
    SlotName[ swedish ] = "Spegla grafik på jämna sidor";
    SlotName[ polish ] = "Przerzuæ grafikê na nieparzystych stronach";
    SlotName[ portuguese_brazilian ] = "MirrorGraphicOnEvenPages";
    SlotName[ japanese ] = "¸Þ×̨¯¸‚ð‹ô”Íß°¼Þ‚É”½“]";
    SlotName[ chinese_simplified ] = "ͼÐη´Ó³µ½Å¼ÊýÒ³Ãæ";
    SlotName[ chinese_traditional ] = "¹Ï¤ù¤Ï¬M¨ì°¸¼Æ­¶­±";
    SlotName[ arabic ] = "ÇäÚßÇÓ ÇáÕæÑÉ Úáì ÇáÕÝÍÇÊ ÇáÒæÌíÉ";
    SlotName[ dutch ] = "Afbeeldingen op even pagina's spiegelen";
    SlotName[ chinese_simplified ] = "ͼÐη´Ó³µ½Å¼ÊýÒ³Ãæ";
    SlotName[ language_user1 ] = " ";
    SlotName[ greek ] = "ÁíáóôñïöÞ ãñáöéêïý óôéò Üñôéåò óåëßäåò";
    SlotName[ korean ] = "¦¼ö ÆäÀÌÁö»óÀÇ ±×·¡ÇÈ ´ëĪ";
    SlotName[ turkish ] = "Grafiði çift sayýlý sayfalarda yansýt";
};
SfxSlotInfo FN_GROW_FONT_SIZE
{
    SlotName = "Zeichen vergrößern";
    SlotName [ english ] =  "Zeichen vergrößern";
    SlotName[ english_us ] = "Increase Font";
    SlotName[ portuguese ] = "Aumentar caracteres";
    SlotName[ russian ] = "Óâåëè÷èòü øðèôò";
    SlotName[ dutch ] = "Tekens vergroten";
    SlotName[ french ] = "Agrandir caractère";
    SlotName[ spanish ] = "Aumentar fuente";
    SlotName[ italian ] = "Ingrandisci carattere";
    SlotName[ danish ] = "Forstør tegn";
    SlotName[ swedish ] = "Förstora tecken";
    SlotName[ polish ] = "Powiêksz znaki";
    SlotName[ portuguese_brazilian ] = "IncreaseFontSize";
    SlotName[ japanese ] = "•¶Žš‚ÌŠg‘å";
    SlotName[ chinese_simplified ] = "·Å´ó×Ö·û";
    SlotName[ chinese_traditional ] = "©ñ¤j¦r¤¸";
    SlotName[ arabic ] = "ÊßÈíÑ ÇáÎØ";
    SlotName[ dutch ] = "Tekens vergroten";
    SlotName[ chinese_simplified ] = "·Å´ó×Ö·û";
    SlotName[ greek ] = "ÌåãÝíèõóç ÷áñáêôÞñùí";
    SlotName[ korean ] = "±Û²Ã Å©°Ô";
    SlotName[ turkish ] = "Kürükteri büyüt";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_HSCROLLBAR
{
    SlotName = "Horizontal rollen";
    SlotName [ english ] =  "Horizontal rollen";
    SlotName[ english_us ] = "Scroll Horizontal";
    SlotName[ portuguese ] = "Deslocamento horizontal";
    SlotName[ russian ] = "Ïðîêðóòèòü ïî ãîðèçîíòàëè";
    SlotName[ dutch ] = "Horizontaal scrollen";
    SlotName[ french ] = "Défilement horizontal";
    SlotName[ spanish ] = "Desplazamiento Horizontal";
    SlotName[ italian ] = "Scorrimento orizzontale";
    SlotName[ danish ] = "Rull vandret";
    SlotName[ swedish ] = "Rulla horisontellt";
    SlotName[ polish ] = "Przesuwaj poziomo";
    SlotName[ portuguese_brazilian ] = "ViewHScroll";
    SlotName[ japanese ] = "…•½½¸Û°Ù";
    SlotName[ chinese_simplified ] = "ˮƽ·½Ïò¹ö¶¯";
    SlotName[ chinese_traditional ] = "¤ô¥­ºu°Ê";
    SlotName[ arabic ] = "ÊÍÑíß ÇáÕÝÍÉ ÃÝÞíÇð";
    SlotName[ dutch ] = "Horizontaal scrollen";
    SlotName[ chinese_simplified ] = "ˮƽ·½Ïò¹ö¶¯";
    SlotName[ greek ] = "Ïñéæüíôéá êýëéóç";
    SlotName[ korean ] = "¼öÆò ½ºÅ©·Ñ";
    SlotName[ turkish ] = "Yatay kaydýr";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_HYPHENATE_OPT_DLG
{
    SlotName = "Silbentrennung";
    SlotName [ english ] =  "Silbentrennung";
    SlotName[ english_us ] = "Hyphenation";
    SlotName[ portuguese ] = "Divisão silábica";
    SlotName[ russian ] = "Ðàññòàíîâêà ïåðåíîñîâ";
    SlotName[ dutch ] = "Woordafbreking";
    SlotName[ french ] = "Coupure de mots";
    SlotName[ spanish ] = "Separación silábica";
    SlotName[ italian ] = "Sillabazione";
    SlotName[ danish ] = "Orddeling";
    SlotName[ swedish ] = "Avstavning";
    SlotName[ polish ] = "Dzielenie wyrazów";
    SlotName[ portuguese_brazilian ] = "Hyphenate";
    SlotName[ japanese ] = "ʲÌȰ¼®Ý";
    SlotName[ chinese_simplified ] = "Á¬×Ö·û";
    SlotName[ chinese_traditional ] = "³s¦r²Å";
    SlotName[ arabic ] = "ÝÕá ÇáãÞÇØÚ";
    SlotName[ dutch ] = "Woordafbreking";
    SlotName[ chinese_simplified ] = "Á¬×Ö·û";
    SlotName[ greek ] = "Óõëëáâéóìüò";
    SlotName[ korean ] = "ÇÏÀÌÇÂ";
    SlotName[ turkish ] = "Heceleme";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_IDX_MARK_TO_IDX
{
    SlotName = "Indexmarke zum Index";
    SlotName [ english ] =  "Indexmarke zum Index";
    SlotName[ english_us ] = "Index Mark to Index";
    SlotName[ portuguese ] = "Marca de índice para o Índice";
    SlotName[ russian ] = "Ìåòêà èíäåêñà äëÿ èíäåêñà";
    SlotName[ dutch ] = "Indexwijzer naar index";
    SlotName[ french ] = "Marque d'index à l'index";
    SlotName[ spanish ] = "Marca de índice al índice";
    SlotName[ italian ] = "Contrassegnno per l'indice";
    SlotName[ danish ] = "Indeksmarkering til indeks";
    SlotName[ swedish ] = "Indexmärke till index";
    SlotName[ polish ] = "Znacznik indeksu do indeksu";
    SlotName[ portuguese_brazilian ] = "IndexMarkToIndex";
    SlotName[ japanese ] = "²ÝÃÞ¯¸½Ï°¸‚ðõˆø€–Ú‚Ö";
    SlotName[ chinese_simplified ] = "Ö¸ÏòË÷ÒýµÄË÷Òý±ê¼Ç";
    SlotName[ chinese_traditional ] = "«ü¦V¯Á¤Þªº¯Á¤Þ¼Ð°O";
    SlotName[ arabic ] = "ÚáÇãÉ ÇáÝåÑÓ Åáì ÇáÝåÑÓ";
    SlotName[ dutch ] = "Indexwijzer naar index";
    SlotName[ chinese_simplified ] = "Ö¸ÏòË÷ÒýµÄË÷Òý±ê¼Ç";
    SlotName[ greek ] = "ÓçìÜäé åõñåôçñßïõ ðñïò åõñåôÞñéï";
    SlotName[ korean ] = "»öÀο¡ »öÀΠǥ½Ã";
    SlotName[ turkish ] = "Dizin için dizin iþareti";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INC_INDENT_OFFSET
{
    SlotName = "Einzug um Betrag erhöhen";
    SlotName [ english ] =  "Einzug um Betrag erhöhen";
    SlotName[ english_us ] = "Increment Indent Value";
    SlotName[ portuguese ] = "Aumentar avanço de texto";
    SlotName[ russian ] = "Óâåëè÷èòü îòñóï ñîãëàñíî çíà÷åíèÿ";
    SlotName[ dutch ] = "Inspringing om getal vergroten";
    SlotName[ french ] = "Augmenter le retrait de";
    SlotName[ spanish ] = "Incrementar sangría en";
    SlotName[ italian ] = "Aumenta rientro valore";
    SlotName[ danish ] = "Forøg indrykning om værdi";
    SlotName[ swedish ] = "Öka indrag med enhet";
    SlotName[ polish ] = "Zwiêksz wciêcie o wartoœæ";
    SlotName[ portuguese_brazilian ] = "IncrementIndentValue";
    SlotName[ japanese ] = "²ÝÃÞÝĂ̒l‚𑝂₷";
    SlotName[ chinese_simplified ] = "À©´óËõ½øÖµ";
    SlotName[ chinese_traditional ] = "ÂX¤jÁY±Æ­È";
    SlotName[ arabic ] = "ÒíÇÏÉ ãÞÏÇÑ ÇáÅÒÇÍÉ";
    SlotName[ dutch ] = "Inspringing om getal vergroten";
    SlotName[ chinese_simplified ] = "À©´óËõ½øÖµ";
    SlotName[ greek ] = "Áýîçóç åóï÷Þò êáôÜ ôçí ôéìÞ";
    SlotName[ korean ] = "µé¿©¾²±â °ª Áõ°¡";
    SlotName[ turkish ] = "Girintiyi büyüt";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_BOOKMARK
{
    SlotName = "Textmarke einfügen";
    SlotName [ english ] =  "Textmarke einfügen";
    SlotName[ english_us ] = "Insert Bookmark";
    SlotName[ portuguese ] = "Inserir marcador de texto";
    SlotName[ russian ] = "Âñòàâèòü çàêëàäêó";
    SlotName[ dutch ] = "Tekstmarkering invoegen";
    SlotName[ french ] = "Insérer un repère de texte";
    SlotName[ spanish ] = "Insertar marca";
    SlotName[ italian ] = "Inserisci segnalibro";
    SlotName[ danish ] = "Indsæt tekstmarkering";
    SlotName[ swedish ] = "Infoga bokmärke";
    SlotName[ polish ] = "Wstaw zak³adkê";
    SlotName[ portuguese_brazilian ] = "InsertBookmark";
    SlotName[ japanese ] = "÷½Äϰ¸‚Ì‘}“ü";
    SlotName[ chinese_simplified ] = "²åÈëÊéÇ©";
    SlotName[ chinese_traditional ] = "´¡¤J¤º¤å¼ÐÅÒ";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÅÔÇÑÉ ãÑÌÚíÉ";
    SlotName[ dutch ] = "Tekstmarkering invoegen";
    SlotName[ chinese_simplified ] = "²åÈëÊéÇ©";
    SlotName[ greek ] = "ÅéóáãùãÞ óåëéäïäåßêôç";
    SlotName[ korean ] = "Ã¥ °¥ÇÇ »ðÀÔ";
    SlotName[ turkish ] = "Metin iþareti ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_BREAK
{
    SlotName = "Absatz einfügen";
    SlotName [ english ] =  "Absatz einfügen";
    SlotName[ english_us ] = "Insert Paragraph";
    SlotName[ portuguese ] = "Inserir parágrafo";
    SlotName[ russian ] = "Âñòàâèòü àáçàö";
    SlotName[ dutch ] = "Alinea invoegen";
    SlotName[ french ] = "Insérer un paragraphe";
    SlotName[ spanish ] = "Insertar párrafo";
    SlotName[ italian ] = "Inserisci paragrafo";
    SlotName[ danish ] = "Indsæt afsnit";
    SlotName[ swedish ] = "Infoga stycke";
    SlotName[ polish ] = "Wstaw akapit";
    SlotName[ portuguese_brazilian ] = "InsertParagraph";
    SlotName[ japanese ] = "’i—Ž‚Ì‘}“ü";
    SlotName[ chinese_simplified ] = "²åÈë¶ÎÂä";
    SlotName[ chinese_traditional ] = "´¡¤J¬q¸¨";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÝÞÑÉ";
    SlotName[ dutch ] = "Alinea invoegen";
    SlotName[ chinese_simplified ] = "²åÈë¶ÎÂä";
    SlotName[ greek ] = "ÅéóáãùãÞ ðáñáãñÜöïõ";
    SlotName[ korean ] = "´Ü¶ô »ðÀÔ";
    SlotName[ turkish ] = "Paragraf ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_BREAK_DLG
{
    SlotName = "Manuellen Umbruch einfügen";
    SlotName [ english ] =  "Manuellen Umbruch einfügen";
    SlotName[ english_us ] = "Insert Manual Break";
    SlotName[ portuguese ] = "Inserir quebra manual";
    SlotName[ russian ] = "Âñòàâèòü âðó÷íóþ ðàçðûâ";
    SlotName[ dutch ] = "Handmatig einde invoegen";
    SlotName[ french ] = "Insérer un renvoi à la ligne manuel";
    SlotName[ spanish ] = "Insertar un salto manual";
    SlotName[ italian ] = "Inserisci interruzione manuale";
    SlotName[ danish ] = "Indsæt manuelt skift";
    SlotName[ swedish ] = "Infoga manuell brytning";
    SlotName[ polish ] = "Wstaw rêczny podzia³";
    SlotName[ portuguese_brazilian ] = "InsertBreak";
    SlotName[ japanese ] = "”CˆÓ‰üÍß°¼Þ‚Ì‘}“ü";
    SlotName[ chinese_simplified ] = "²åÈëÊÖ¹¤»»Ðзû";
    SlotName[ chinese_traditional ] = "´¡¤J¤â¤u´«¦æ²Å";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÝÇÕá íÏæí";
    SlotName[ dutch ] = "Handmatig einde invoegen";
    SlotName[ chinese_simplified ] = "²åÈëÊÖ¹¤»»Ðзû";
    SlotName[ greek ] = "ÅéóáãùãÞ ÷åéñïêßíçôçò áëëáãÞò";
    SlotName[ korean ] = "¼öµ¿ ³ª´©±â »ðÀÔ";
    SlotName[ turkish ] = "Manüel kesme ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_CAPTION
{
    SlotName = "Beschriftung einfügen";
    SlotName [ english ] =  "Beschriftung einfügen";
    SlotName[ english_us ] = "Insert Caption";
    SlotName[ portuguese ] = "Inserir legenda";
    SlotName[ russian ] = "Âñòàâèòü íàçâàíèå";
    SlotName[ dutch ] = "Bijschrift invoegen";
    SlotName[ french ] = "Insérer une légende";
    SlotName[ spanish ] = "Insertar etiqueta";
    SlotName[ italian ] = "Inserisci dicitura";
    SlotName[ danish ] = "Indsæt billedtekst";
    SlotName[ swedish ] = "Infoga bildtext";
    SlotName[ polish ] = "Wstaw opis";
    SlotName[ portuguese_brazilian ] = "InsertCaption";
    SlotName[ japanese ] = "×ÍÞق̑}“ü";
    SlotName[ chinese_simplified ] = "²åÈë±êÌâ";
    SlotName[ chinese_traditional ] = "´¡¤J¼ÐÃD";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÊÓãíÉ ÊæÖíÍíÉ";
    SlotName[ dutch ] = "Bijschrift invoegen";
    SlotName[ chinese_simplified ] = "²åÈë±êÌâ";
    SlotName[ greek ] = "ÅéóáãùãÞ ëåæÜíôáò";
    SlotName[ korean ] = "ĸ¼Ç »ðÀÔ";
    SlotName[ turkish ] = "Resim yazýsý ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_COLUMN_BREAK
{
    SlotName = "Spaltenwechsel einfügen";
    SlotName [ english ] =  "Spaltenwechsel einfügen";
    SlotName[ english_us ] = "Insert Column Break";
    SlotName[ portuguese ] = "Inserir quebra de coluna";
    SlotName[ russian ] = "Âñòàâèòü ðàçðûâ êîëîíêè";
    SlotName[ dutch ] = "Kolomeinde invoegen";
    SlotName[ french ] = "Insérer un saut de colonne";
    SlotName[ spanish ] = "Insertar cambio de columnas";
    SlotName[ italian ] = "Inserisci cambio colonna";
    SlotName[ danish ] = "Indsæt spalteskift";
    SlotName[ swedish ] = "Infoga kolumnbrytning";
    SlotName[ polish ] = "Wstaw podzia³ kolumn";
    SlotName[ portuguese_brazilian ] = "InsertColumnBreak";
    SlotName[ japanese ] = "‰ü—ñ‚Ì‘}“ü";
    SlotName[ chinese_simplified ] = "²åÈë·ÖÀ¸·û";
    SlotName[ chinese_traditional ] = "´¡¤J¤ÀÄæ²Å";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÝÇÕá ÃÚãÏÉ";
    SlotName[ dutch ] = "Kolomeinde invoegen";
    SlotName[ chinese_simplified ] = "²åÈë·ÖÀ¸·û";
    SlotName[ greek ] = "ÅéóáãùãÞ áëëáãÞò óôÞëçò";
    SlotName[ korean ] = "¿­ ³ª´©±â »ðÀÔ";
    SlotName[ turkish ] = "Sütun sonu ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_CTRL
{
    SlotName = "Einfügen";
    SlotName [ english ] =  "Einfügen";
    SlotName[ english_us ] = "Insert";
    SlotName[ portuguese ] = "Inserir";
    SlotName[ russian ] = "Âñòàâèòü";
    SlotName[ dutch ] = "Invoegen";
    SlotName[ french ] = "Insérer";
    SlotName[ spanish ] = "Insertar";
    SlotName[ italian ] = "Inserisci";
    SlotName[ danish ] = "Indsæt";
    SlotName[ swedish ] = "Infoga";
    SlotName[ polish ] = "Wstaw";
    SlotName[ portuguese_brazilian ] = "InsertCtrl";
    SlotName[ japanese ] = "‘}“ü";
    SlotName[ chinese_simplified ] = "²åÈë";
    SlotName[ chinese_traditional ] = "´¡¤J";
    SlotName[ arabic ] = "ÅÏÑÇÌ";
    SlotName[ dutch ] = "Invoegen";
    SlotName[ chinese_simplified ] = "²åÈë";
    SlotName[ greek ] = "ÅéóáãùãÞ";
    SlotName[ korean ] = "»ðÀÔ";
    SlotName[ turkish ] = "Ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_ENDNOTE
{
    SlotName = "Endnote direkt einfügen";
    SlotName [ english ] =  "Endnote direkt einfügen";
    SlotName[ english_us ] = "Insert Endnote Directly";
    SlotName[ portuguese ] = "Inserir nota final directamente";
    SlotName[ russian ] = "Âñòàâèòü íåïîñðåäñòâåííî êîíöåâóþ ñíîñêó";
    SlotName[ dutch ] = "Eindnoot direct invoegen";
    SlotName[ french ] = "Insérer directement une note de fin";
    SlotName[ spanish ] = "Insertar nota final directamente";
    SlotName[ italian ] = "Inserisci direttamente nota di chiusura";
    SlotName[ danish ] = "Indsæt slutnote direkte";
    SlotName[ swedish ] = "Infoga slutnot direkt";
    SlotName[ polish ] = "Wstaw bezpoœrednio przypis koñcowy";
    SlotName[ portuguese_brazilian ] = "InsertEndnoteDirect";
    SlotName[ japanese ] = "•¶––‹r’‚𒼐ڑ}“ü";
    SlotName[ chinese_simplified ] = "Ö±½Ó²åÈëβע";
    SlotName[ chinese_traditional ] = "ª½±µ´¡¤J§Àª`";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÊÚáíÞ ÎÊÇãí ãÈÇÔÑÉ";
    SlotName[ dutch ] = "Eindnoot direct invoegen";
    SlotName[ chinese_simplified ] = "Ö±½Ó²åÈëβע";
    SlotName[ greek ] = "Áð åõèåßáò åéóáãùãÞ óçìåßùóçò ôÝëïõò";
    SlotName[ korean ] = "¹ÌÁÖ Á÷Á¢ »ðÀÔ";
    SlotName[ turkish ] = "Sonnotu doðrudan ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_FIELD
{
    SlotName = "Feldbefehl einfügen";
    SlotName [ english ] =  "Feldbefehl einfügen";
    SlotName[ english_us ] = "Insert Fields";
    SlotName[ portuguese ] = "Inserir código de campo";
    SlotName[ russian ] = "Âñòàâèòü ïîëå";
    SlotName[ dutch ] = "Veldopdracht invoegen";
    SlotName[ french ] = "Insérer une instruction de champ";
    SlotName[ spanish ] = "Insertar código de campo";
    SlotName[ italian ] = "Inserisci comando di campo";
    SlotName[ danish ] = "Indsæt felt";
    SlotName[ swedish ] = "Infoga fältkommando";
    SlotName[ polish ] = "Wstaw pola";
    SlotName[ portuguese_brazilian ] = "InsertFieldCode";
    SlotName[ japanese ] = "̨°ÙÄނ̑}“ü";
    SlotName[ chinese_simplified ] = "²åÈë×Ö¶ÎÖ¸Áî";
    SlotName[ chinese_traditional ] = "´¡¤JÄæ¦ì«ü¥O";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÍÞæá";
    SlotName[ dutch ] = "Veldopdracht invoegen";
    SlotName[ chinese_simplified ] = "²åÈë×Ö¶ÎÖ¸Áî";
    SlotName[ greek ] = "ÅéóáãùãÞ åíôïëÞò ðåäßïõ";
    SlotName[ korean ] = "ÇÊµå »ðÀÔ";
    SlotName[ turkish ] = "Alan öðesi ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_FIELD_CTRL
{
    SlotName = "Feldbefehle einfügen";
    SlotName [ english ] =  "Feldbefehle einfügen";
    SlotName[ english_us ] = "Insert Fields";
    SlotName[ portuguese ] = "Inserir campos";
    SlotName[ russian ] = "Âñòàâèòü ïîëå";
    SlotName[ dutch ] = "Veldopdrachten invoegen";
    SlotName[ french ] = "Insérer des instructions de champ";
    SlotName[ spanish ] = "Insertar códigos de campo";
    SlotName[ italian ] = "Inserisci comandi di campo";
    SlotName[ danish ] = "Indsæt felter";
    SlotName[ swedish ] = "Infoga fältkommandon";
    SlotName[ polish ] = "Wstaw pola";
    SlotName[ portuguese_brazilian ] = "InsertFieldCtrl";
    SlotName[ japanese ] = "̨°ÙÄނ̑}“ü";
    SlotName[ chinese_simplified ] = "²åÈë×Ö¶ÎÖ¸Áî";
    SlotName[ chinese_traditional ] = "´¡¤JÄæ¦ì«ü¥O";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÍÞæá";
    SlotName[ dutch ] = "Veldopdrachten invoegen";
    SlotName[ chinese_simplified ] = "²åÈë×Ö¶ÎÖ¸Áî";
    SlotName[ greek ] = "ÅéóáãùãÞ åíôïëÞò ðåäßïõ";
    SlotName[ korean ] = "ÇÊµå »ðÀÔ";
    SlotName[ turkish ] = "Alan öðeleri ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_FLD_AUTHOR
{
    SlotName = "Autorenfeld einfügen";
    SlotName [ english ] =  "Autorenfeld einfügen";
    SlotName[ english_us ] = "Insert Author Field";
    SlotName[ portuguese ] = "Inserir campo de autor";
    SlotName[ russian ] = "Âñòàâèòü ïîëå àâòîðà";
    SlotName[ dutch ] = "Auteurveld invoegen";
    SlotName[ french ] = "Insérer un champ d'auteur";
    SlotName[ spanish ] = "Insertar campo para autor";
    SlotName[ italian ] = "Inserisci campo autore";
    SlotName[ danish ] = "Indsæt forfatterfelt";
    SlotName[ swedish ] = "Infoga författarfält";
    SlotName[ polish ] = "Wstaw pole autora";
    SlotName[ portuguese_brazilian ] = "InsertAuthorField";
    SlotName[ japanese ] = "ì¬ŽǪ̀°ÙÄނ̑}“ü";
    SlotName[ chinese_simplified ] = "²åÈë×÷ÕßÀ¸";
    SlotName[ chinese_traditional ] = "´¡¤J§@ªÌ¿é¤JÄæ";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÍÞá ãÄáÝ";
    SlotName[ dutch ] = "Auteurveld invoegen";
    SlotName[ chinese_simplified ] = "²åÈë×÷ÕßÀ¸";
    SlotName[ greek ] = "ÅéóáãùãÞ ðåäßï óõããñáöÝá";
    SlotName[ korean ] = "¸¸µçÀÌ ÇÊµå »ðÀÔ";
    SlotName[ turkish ] = "Yazan adý alaný ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_FLD_DATE
{
    SlotName = "Datum einfügen";
    SlotName [ english ] =  "Datum einfügen";
    SlotName[ english_us ] = "Insert Date";
    SlotName[ portuguese ] = "Inserir data";
    SlotName[ russian ] = "Âñòàâèòü äàòó";
    SlotName[ dutch ] = "Datum invoegen";
    SlotName[ french ] = "Date";
    SlotName[ spanish ] = "Insertar fecha";
    SlotName[ italian ] = "Inserisci data";
    SlotName[ danish ] = "Indsæt dato";
    SlotName[ swedish ] = "Infoga datum";
    SlotName[ polish ] = "Wstaw datê";
    SlotName[ portuguese_brazilian ] = "Date";
    SlotName[ japanese ] = "“ú•t‚Ì‘}“ü";
    SlotName[ chinese_simplified ] = "²åÈëÈÕÆÚ";
    SlotName[ chinese_traditional ] = "´¡¤J¤é´Á";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÇáÊÇÑíÎ";
    SlotName[ dutch ] = "Datum invoegen";
    SlotName[ chinese_simplified ] = "²åÈëÈÕÆÚ";
    SlotName[ greek ] = "ÅéóáãùãÞ çìåñïìçíßáò";
    SlotName[ korean ] = "³¯Â¥ »ðÀÔ";
    SlotName[ turkish ] = "Tarih ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_FLD_PGCOUNT
{
    SlotName = "Seitenanzahl einfügen";
    SlotName [ english ] =  "Seitenanzahl einfügen";
    SlotName[ english_us ] = "Insert Page Count";
    SlotName[ portuguese ] = "Contar páginas";
    SlotName[ russian ] = "Âñòàâèòü êîëè÷åñòâî ñòðàíèö";
    SlotName[ dutch ] = "Pagina-aantal invoegen";
    SlotName[ french ] = "Insérer le nombre de pages";
    SlotName[ spanish ] = "Insertar contador de páginas";
    SlotName[ italian ] = "Inserisci numero di pagine";
    SlotName[ danish ] = "Indsæt sideantal";
    SlotName[ swedish ] = "Infoga sidantal";
    SlotName[ polish ] = "Wstaw liczbê stron";
    SlotName[ portuguese_brazilian ] = "Page Count";
    SlotName[ japanese ] = "Íß-¼Þ”‚Ì‘}“ü";
    SlotName[ chinese_simplified ] = "²åÈëÒ³Êý";
    SlotName[ chinese_traditional ] = "´¡¤J­¶¼Æ";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÚÏÏ ÇáÕÝÍÇÊ";
    SlotName[ dutch ] = "Pagina-aantal invoegen";
    SlotName[ chinese_simplified ] = "²åÈëÒ³Êý";
    SlotName[ greek ] = "ÅéóáãùãÞ óõíïëéêïý áñéèìïý óåëéäþí";
    SlotName[ korean ] = "ÆäÀÌÁö Ä«¿îÆ® »ðÀÔ";
    SlotName[ turkish ] = "Sayfa sayýsý ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_FLD_PGNUMBER
{
    SlotName = "Seitennummer einfügen";
    SlotName [ english ] =  "Seitennummer einfügen";
    SlotName[ english_us ] = "Insert Page Number";
    SlotName[ portuguese ] = "Inserir número de página";
    SlotName[ russian ] = "Âñòàâèòü íîìåðà ñòðàíèö";
    SlotName[ dutch ] = "Paginanummer invoegen";
    SlotName[ french ] = "Insérer numéro de page";
    SlotName[ spanish ] = "Insertar número de página";
    SlotName[ italian ] = "Inserisci numero di pagina";
    SlotName[ danish ] = "Indsæt sidetal";
    SlotName[ swedish ] = "Infoga sidnummer";
    SlotName[ polish ] = "Wstaw numer strony";
    SlotName[ portuguese_brazilian ] = "PageNumber";
    SlotName[ japanese ] = "Íß°¼Þ”ԍ†‚Ì‘}“ü";
    SlotName[ chinese_simplified ] = "²åÈëÒ³Âë";
    SlotName[ chinese_traditional ] = "´¡¤J­¶½X";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÃÑÞÇã ÇáÕÝÍÇÊ";
    SlotName[ dutch ] = "Paginanummer invoegen";
    SlotName[ chinese_simplified ] = "²åÈëÒ³Âë";
    SlotName[ greek ] = "ÅéóáãùãÞ áñéèìïý óåëßäáò";
    SlotName[ korean ] = "ÆäÀÌÁö ¹øÈ£ »ðÀÔ";
    SlotName[ turkish ] = "Sayfa numarasý ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_FLD_TIME
{
    SlotName = "Uhrzeit einfügen";
    SlotName [ english ] =  "Uhrzeit einfügen";
    SlotName[ english_us ] = "Insert Time";
    SlotName[ portuguese ] = "Hora";
    SlotName[ russian ] = "Âñòàâèòü âðåìÿ";
    SlotName[ dutch ] = "Tijd invoegen";
    SlotName[ french ] = "Heure";
    SlotName[ spanish ] = "Insertar hora";
    SlotName[ italian ] = "Inserisci orario";
    SlotName[ danish ] = "Indsæt klokkeslæt";
    SlotName[ swedish ] = "Infoga klockslag";
    SlotName[ polish ] = "Wstaw godzinê";
    SlotName[ portuguese_brazilian ] = "Time";
    SlotName[ japanese ] = "Žž‚Ì‘}“ü";
    SlotName[ chinese_simplified ] = "²åÈëʱ¼ä";
    SlotName[ chinese_traditional ] = "´¡¤J®É¶¡";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÇáæÞÊ";
    SlotName[ dutch ] = "Tijd invoegen";
    SlotName[ chinese_simplified ] = "²åÈëʱ¼ä";
    SlotName[ greek ] = "ÅéóáãùãÞ þñáò";
    SlotName[ korean ] = "½Ã°£ »ðÀÔ";
    SlotName[ turkish ] = "Saat ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_FLD_TITLE
{
    SlotName = "Dokumenttitel einfügen";
    SlotName [ english ] =  "Dokumenttitel einfügen";
    SlotName[ english_us ] = "Insert Document Title";
    SlotName[ portuguese ] = "Inserir título do documento";
    SlotName[ russian ] = "Âñòàâèòü çàãîëîâîê äîêóìåíòà";
    SlotName[ dutch ] = "Documenttitel invoegen";
    SlotName[ french ] = "Insérer un titre de document";
    SlotName[ spanish ] = "Insertar título de documento";
    SlotName[ italian ] = "Inserisci titolo di documento";
    SlotName[ danish ] = "Indsæt dokumenttitel";
    SlotName[ swedish ] = "Infoga dokumentrubrik";
    SlotName[ polish ] = "Wstaw tytu³ dokumentu";
    SlotName[ portuguese_brazilian ] = "DocumentTitle";
    SlotName[ japanese ] = "ÄÞ·­ÒÝÄÀ²Äق̑}“ü";
    SlotName[ chinese_simplified ] = "²åÈëÎĵµ±êÌâ";
    SlotName[ chinese_traditional ] = "´¡¤J¤å¥ó¼ÐÃD";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÚäæÇä ÇáãÓÊäÏ";
    SlotName[ dutch ] = "Documenttitel invoegen";
    SlotName[ chinese_simplified ] = "²åÈëÎĵµ±êÌâ";
    SlotName[ greek ] = "ÅéóáãùãÞ ôßôëïõ åããñÜöïõ";
    SlotName[ korean ] = "¹®¼­ Á¦¸ñ »ðÀÔ";
    SlotName[ turkish ] = "Belge baþlýðý ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_FLD_TOPIC
{
    SlotName = "Thema einfügen";
    SlotName [ english ] =  "Thema einfügen";
    SlotName[ english_us ] = "Insert Subject";
    SlotName[ portuguese ] = "Inserir assunto";
    SlotName[ russian ] = "Âñòàâèòü òåìó";
    SlotName[ dutch ] = "Onderwerp invoegen";
    SlotName[ french ] = "Insérer l'objet";
    SlotName[ spanish ] = "Insertar tema";
    SlotName[ italian ] = "Inserisci argomento";
    SlotName[ danish ] = "Indsæt emne";
    SlotName[ swedish ] = "Infoga ämne";
    SlotName[ polish ] = "Wstaw temat";
    SlotName[ portuguese_brazilian ] = "Topic";
    SlotName[ japanese ] = "Œ–¼‚Ì‘}“ü";
    SlotName[ chinese_simplified ] = "²åÈëÖ÷Ìâ";
    SlotName[ chinese_traditional ] = "´¡¤J¥DÃD";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÇáãæÖæÚ";
    SlotName[ dutch ] = "Onderwerp invoegen";
    SlotName[ chinese_simplified ] = "²åÈëÖ÷Ìâ";
    SlotName[ greek ] = "ÅéóáãùãÞ èÝìáôïò";
    SlotName[ korean ] = "ÁÖÁ¦ »ðÀÔ";
    SlotName[ turkish ] = "Konu ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_FOOTER
{
    SlotName = "Fußzeile einfügen";
    SlotName [ english ] =  "Fußzeile einfügen";
    SlotName[ english_us ] = "Insert Footer";
    SlotName[ portuguese ] = "Inserir rodapé";
    SlotName[ russian ] = "Âñòàâèòü íèæíèé êîëîíòèòóë";
    SlotName[ dutch ] = "Voettekst invoegen";
    SlotName[ french ] = "Insérer un pied de page";
    SlotName[ spanish ] = "Insertar pie de página";
    SlotName[ italian ] = "Inserisci piè di pagina";
    SlotName[ danish ] = "Indsæt sidefod";
    SlotName[ swedish ] = "Infoga sidfot";
    SlotName[ polish ] = "Wstaw stopkê";
    SlotName[ portuguese_brazilian ] = "InsertFooter";
    SlotName[ japanese ] = "̯À‚Ì‘}“ü";
    SlotName[ chinese_simplified ] = "²åÈëÒ³½Å";
    SlotName[ chinese_traditional ] = "´¡¤Jµù¸}";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÊÐííá ÕÝÍÉ";
    SlotName[ dutch ] = "Voettekst invoegen";
    SlotName[ chinese_simplified ] = "²åÈëÒ³½Å";
    SlotName[ greek ] = "ÅéóáãùãÞ õðïóÝëéäïõ";
    SlotName[ korean ] = "¹Ù´Ú±Û »ðÀÔ";
    SlotName[ turkish ] = "Altbilgi ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_FOOTNOTE
{
    SlotName = "Fußnote direkt einfügen";
    SlotName [ english ] =  "Fußnote direkt einfügen";
    SlotName[ english_us ] = "Insert Footnote Directly";
    SlotName[ portuguese ] = "Inserir nota de rodapé, directamente";
    SlotName[ russian ] = "Âñòàâèòü íåïîñðåäñòâåííî ñíîñêó";
    SlotName[ dutch ] = "Voetnoot direct invoegen";
    SlotName[ french ] = "Insérer directement une note de bas de page";
    SlotName[ spanish ] = "Insertar nota al pie, directo";
    SlotName[ italian ] = "Inserisci nota a piè pagina direttamente";
    SlotName[ danish ] = "Indsæt sidefod direkte";
    SlotName[ swedish ] = "Infoga fotnot direkt";
    SlotName[ polish ] = "Wstaw bezpoœrednio przypis dolny";
    SlotName[ portuguese_brazilian ] = "InsertFootnoteDirect";
    SlotName[ japanese ] = "‹r’‚Ì’¼Ú‘}“ü";
    SlotName[ chinese_simplified ] = "Ö±½Ó²åÈë×¢½Å";
    SlotName[ chinese_traditional ] = "ª½±µ´¡¤Jµù¸}";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÍÇÔíÉ ÓÝáíÉ ãÈÇÔÑÉ";
    SlotName[ dutch ] = "Voetnoot direct invoegen";
    SlotName[ chinese_simplified ] = "Ö±½Ó²åÈë×¢½Å";
    SlotName[ greek ] = "Áð åõèåßáò åéóáãùãÞ õðïóçìåßùóçò";
    SlotName[ korean ] = "°¢ÁÖ Á÷Á¢ »ðÀÔ";
    SlotName[ turkish ] = "Dipnotu doðrudan ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_FOOTNOTE_DLG
{
    SlotName = "Fußnote einfügen";
    SlotName [ english ] =  "Fußnote einfügen";
    SlotName[ english_us ] = "Insert Footnote";
    SlotName[ portuguese ] = "Inserir nota de rodapé";
    SlotName[ russian ] = "Âñòàâèòü ñíîñêó";
    SlotName[ dutch ] = "Voetnoot invoegen";
    SlotName[ french ] = "Insérer une note de bas de page";
    SlotName[ spanish ] = "Insertar nota al pie";
    SlotName[ italian ] = "Inserisci nota a piè pagina";
    SlotName[ danish ] = "Indsæt fodnote";
    SlotName[ swedish ] = "Infoga fotnot";
    SlotName[ polish ] = "Wstaw przypis dolny";
    SlotName[ portuguese_brazilian ] = "InsertFootnote";
    SlotName[ japanese ] = "‹r’‚Ì‘}“ü";
    SlotName[ chinese_simplified ] = "²åÈë×¢½Å";
    SlotName[ chinese_traditional ] = "´¡¤Jµù¸}";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÍÇÔíÉ ÓÝáíÉ";
    SlotName[ dutch ] = "Voetnoot invoegen";
    SlotName[ chinese_simplified ] = "²åÈë×¢½Å";
    SlotName[ greek ] = "ÅéóáãùãÞ õðïóçìåßùóçò";
    SlotName[ korean ] = "°¢ÁÖ »ðÀÔ";
    SlotName[ turkish ] = "Dipnot ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_FRAME
{
    SlotName = "Rahmen einfügen";
    SlotName [ english ] =  "Rahmen einfügen";
    SlotName[ english_us ] = "Insert Frame";
    SlotName[ portuguese ] = "Inserir moldura";
    SlotName[ russian ] = "Âñòàâèòü ðàìêó";
    SlotName[ dutch ] = "Kader invoegen";
    SlotName[ french ] = "Insérer un cadre";
    SlotName[ spanish ] = "Insertar marco";
    SlotName[ italian ] = "Inserisci cornice";
    SlotName[ danish ] = "Indsæt ramme";
    SlotName[ swedish ] = "Infoga ram";
    SlotName[ polish ] = "Wstaw ramkê";
    SlotName[ portuguese_brazilian ] = "InsertFrame";
    SlotName[ japanese ] = "˜g‚Ì‘}“ü";
    SlotName[ chinese_simplified ] = "²åÈë¿ò";
    SlotName[ chinese_traditional ] = "´¡¤J¤å¦r¤è¶ô";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÅØÇÑ";
    SlotName[ dutch ] = "Kader invoegen";
    SlotName[ chinese_simplified ] = "²åÈë¿ò";
    SlotName[ greek ] = "ÅéóáãùãÞ ðëáéóßïõ";
    SlotName[ korean ] = "ÇÁ·¹ÀÓ »ðÀÔ";
    SlotName[ turkish ] = "Çerçeve ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_FRAME_INTERACT_NOCOL
{
    SlotName = "Einspaltigen Rahmen manuell einfügen";
    SlotName [ english ] =  "Insert single column frame manually";
    SlotName[ english_us ] = "Insert single-column frame manually";
    SlotName[ portuguese ] = "Inserir moldura de um coluna manualmente";
    SlotName[ russian ] = "Insert single column frame manually";
    SlotName[ greek ] = "×åéñïêßíçôç åéóáãùãÞ ìïíüóôõëïõ ðëáéóßïõ";
    SlotName[ dutch ] = "Eenkoloms kader handmatig invoegen";
    SlotName[ french ] = "Insertion manuelle d'un cadre à une colonne";
    SlotName[ spanish ] = "Insert single column frame manually";
    SlotName[ italian ] = "Insert single column frame manually";
    SlotName[ danish ] = "Indsæt enkelt-kolonne ramme manuelt";
    SlotName[ swedish ] = "Insert single column frame manually";
    SlotName[ polish ] = "Wstaw rêcznie ramkê z jedn¹ kolumn¹";
    SlotName[ portuguese_brazilian ] = "Insert single column frame manually";
    SlotName[ japanese ] = "‚P—ñ˜g‚ðŽè“®‚Å‘}“ü";
    SlotName[ korean ] = "Insert single column frame manually";
    SlotName[ chinese_simplified ] = "ÊÖ¹¤²åÈëµ¥À¸Ê½¿ò";
    SlotName[ chinese_traditional ] = "¤â¤u´¡¤J³æÄæ¤å¦r®Ø¡C";
    SlotName[ turkish ] = "Insert single column frame manually";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÅØÇÑ ãßæä ãä ÚãæÏ æÇÍÏ íÏæíÇð";
};
SfxSlotInfo FN_INSERT_FRAME_INTERACT
{
    SlotName = "Rahmen manuell einfügen";
    SlotName [ english ] =  "Rahmen manuell einfügen";
    SlotName[ english_us ] = "Insert Frame Manually";
    SlotName[ portuguese ] = "Inserir moldura manualmente";
    SlotName[ russian ] = "Âñòàâèòü ðàìêó âðó÷íóþ";
    SlotName[ dutch ] = "Kader handmatig invoegen";
    SlotName[ french ] = "Insérer un cadre";
    SlotName[ spanish ] = "Insertar marco manualmente";
    SlotName[ italian ] = "Inserisci cornice manualmente";
    SlotName[ danish ] = "Indsæt ramme manuelt";
    SlotName[ swedish ] = "Infoga ram manuellt";
    SlotName[ polish ] = "Wstaw rêcznie ramkê";
    SlotName[ portuguese_brazilian ] = "InsertFrameInteract";
    SlotName[ japanese ] = "˜g‚ðŽè“®‚Å‘}“ü";
    SlotName[ chinese_simplified ] = "ÊÖ¹¤²åÈë¿ò";
    SlotName[ chinese_traditional ] = "´¡¤J¤å¦r¤è¶ô";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÅØÇÑ íÏæíÇð";
    SlotName[ dutch ] = "Kader handmatig invoegen";
    SlotName[ chinese_simplified ] = "ÊÖ¹¤²åÈë¿ò";
    SlotName[ greek ] = "×åéñïêßíçôç åéóáãùãÞ ðëáéóßïõ";
    SlotName[ korean ] = "ÇÁ·¹ÀÓ ¼öµ¿ »ðÀÔ";
    SlotName[ turkish ] = "Çerçeveyi manuel olarak ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_HARD_SPACE
{
    SlotName = "Geschütztes Leerzeichen einfügen";
    SlotName [ english ] =  "Geschütztes Leerzeichen einfügen";
    SlotName[ english_us ] = "Insert Non-Breaking Space";
    SlotName[ portuguese ] = "Inserir um espaço não separável";
    SlotName[ russian ] = "Âñòàâèòü çàùèùåííûé ïðîáåë";
    SlotName[ dutch ] = "Harde spatie invoegen";
    SlotName[ french ] = "Insérer un espace protégé";
    SlotName[ spanish ] = "Insertar espacio protegido";
    SlotName[ italian ] = "Inserisci spazio protetto";
    SlotName[ danish ] = "Indsæt hårdt mellemrum";
    SlotName[ swedish ] = "Infoga skyddat blanksteg";
    SlotName[ polish ] = "Wstaw spacjê nie rozdzielaj¹c¹";
    SlotName[ portuguese_brazilian ] = "InsertNonBreakingSpace";
    SlotName[ japanese ] = "•ÛŒì½Íß°½‚Ì‘}“ü";
    SlotName[ chinese_simplified ] = "²åÈë¿Õ¸ñ×Ö·û";
    SlotName[ chinese_traditional ] = "´¡¤J«OÅ@ªºªÅ®æ¦r¤¸";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÍÑÝ ãÓÇÝÉ ãÍãí";
    SlotName[ dutch ] = "Harde spatie invoegen";
    SlotName[ chinese_simplified ] = "²åÈë¿Õ¸ñ×Ö·û";
    SlotName[ greek ] = "ÐñïóèÞêç ðñïóôáôåõüìåíïõ êåíïý";
    SlotName[ korean ] = "ÁÙ ¹Ù²ÞÇÏÁö ¾Ê´Â °ø¹é »ðÀÔ";
    SlotName[ turkish ] = "Satýr sonu olmayan boþluk ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_HARDHYPHEN
{
    SlotName = "Geschützen Trenner einfügen";
    SlotName [ english ] =  "Geschützen Trenner einfügen";
    SlotName[ english_us ] = "Insert Hard Hyphen";
    SlotName[ portuguese ] = "Inserir hífen não separável";
    SlotName[ russian ] = "Âñòàâèòü æåñòêèå ïåðåíîñû";
    SlotName[ dutch ] = "Vast scheidingsteken invoegen";
    SlotName[ french ] = "Insérer une coupure de mot manuelle";
    SlotName[ spanish ] = "Insertar guión protegido";
    SlotName[ italian ] = "Inserisci sillabazione protetta";
    SlotName[ danish ] = "Indsæt hård bindestreg";
    SlotName[ swedish ] = "Infoga hårda bindestreck";
    SlotName[ polish ] = "Wstaw twardy znak podzia³u";
    SlotName[ portuguese_brazilian ] = "InsertHardHyphen";
    SlotName[ japanese ] = "•ÛŒìʲÌȰ¼®Ý‚Ì‘}“ü";
    SlotName[ chinese_simplified ] = "²åÈëÁ¬×Ö·û";
    SlotName[ chinese_traditional ] = "´¡¤J«OÅ@ªº³s¦r²Å";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÔÑØÉ ÝÇÕáÉ ãÍãíÉ";
    SlotName[ dutch ] = "Vast scheidingsteken invoegen";
    SlotName[ chinese_simplified ] = "²åÈëÁ¬×Ö·û";
    SlotName[ greek ] = "ÐñïóèÞêç Ýíôïíïõ äéá÷ùñéóôéêïý";
    SlotName[ korean ] = "°íÁ¤ ÇÏÀÌÇ »ðÀÔ";
    SlotName[ turkish ] = "Bölünemez tire ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_HEADER
{
    SlotName = "Kopfzeile einfügen";
    SlotName [ english ] =  "Kopfzeile einfügen";
    SlotName[ english_us ] = "Insert Header";
    SlotName[ portuguese ] = "Inserir cabeçalho";
    SlotName[ russian ] = "Âñòàâèòü âåðõíèé êîëîíòèòóë";
    SlotName[ dutch ] = "Koptekst invoegen";
    SlotName[ french ] = "Insérer un en-tête";
    SlotName[ spanish ] = "Insertar encabezamiento";
    SlotName[ italian ] = "Inserisci riga d'intestazione ";
    SlotName[ danish ] = "Indsæt sidehoved";
    SlotName[ swedish ] = "Infoga sidhuvud";
    SlotName[ polish ] = "Wstaw nag³ówek";
    SlotName[ portuguese_brazilian ] = "InsertHeader";
    SlotName[ japanese ] = "ͯÀނ̑}“ü";
    SlotName[ chinese_simplified ] = "²åÈëҳü";
    SlotName[ chinese_traditional ] = "´¡¤J­¶­º";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÑÃÓ ÕÝÍÉ";
    SlotName[ dutch ] = "Koptekst invoegen";
    SlotName[ chinese_simplified ] = "²åÈëҳü";
    SlotName[ greek ] = "ÅéóáãùãÞ êåöáëßäáò";
    SlotName[ korean ] = "¸Ó¸®±Û »ðÀÔ";
    SlotName[ turkish ] = "Üstbilgi ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_HRULER
{
    SlotName = "Horizontale Linie einfügen";
    SlotName [ english ] =  "Horizontale Linie einfügen";
    SlotName[ english_us ] = "Insert Horizontal Ruler";
    SlotName[ portuguese ] = "Inserir linha horizontal";
    SlotName[ russian ] = "Âñòàâèòü ãîðèçîíòàëüíóþ ëèíèþ";
    SlotName[ dutch ] = "Horizontale lijn invoegen";
    SlotName[ french ] = "Insérer une ligne horizontale";
    SlotName[ spanish ] = "Insertar líneas horizontales";
    SlotName[ italian ] = "Inserisci linea orizzontale";
    SlotName[ danish ] = "Indsæt vandret linje";
    SlotName[ swedish ] = "Infoga horisontell linje";
    SlotName[ polish ] = "Wstaw liniê poziom¹";
    SlotName[ portuguese_brazilian ] = "InsertGraphicRuler";
    SlotName[ japanese ] = "…•½ü‚Ì‘}“ü";
    SlotName[ chinese_simplified ] = "²åÈëˮƽÏß";
    SlotName[ chinese_traditional ] = "´¡¤J¤ô¥­½u";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÎØ ÃÝÞí";
    SlotName[ dutch ] = "Horizontale lijn invoegen";
    SlotName[ chinese_simplified ] = "²åÈëˮƽÏß";
    SlotName[ greek ] = "ÅéóáãùãÞ ïñéæüíôéáò ãñáììÞò";
    SlotName[ korean ] = "¼öÆò ´«±ÝÀÚ »ðÀÔ";
    SlotName[ turkish ] = "Yatay ayýrma çizgisi ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_HYPERLINK
{
    SlotName = "Hyperlink einfügen";
    SlotName [ english ] =  "Hyperlink einfügen";
    SlotName[ english_us ] = "Insert Hyperlink";
    SlotName[ portuguese ] = "Inserir hiperligação";
    SlotName[ russian ] = "Âñòàâèòü ãèïåðññûëêó";
    SlotName[ dutch ] = "Hyperlink invoegen";
    SlotName[ french ] = "Insérer un hyperlien";
    SlotName[ spanish ] = "Insertar hiperenlace";
    SlotName[ italian ] = "Inserisci Hyperlink";
    SlotName[ danish ] = "Indsæt hyperlink";
    SlotName[ swedish ] = "Infoga hyperlänk";
    SlotName[ polish ] = "Wstaw hiper³¹cze";
    SlotName[ portuguese_brazilian ] = "InsertHyperlinkDlg";
    SlotName[ japanese ] = "ʲÊß°ØÝ¸‚Ì‘}“ü";
    SlotName[ chinese_simplified ] = "²åÈ볬Á´½Ó";
    SlotName[ chinese_traditional ] = "´¡¤J¶W³sµ²";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÇÑÊÈÇØ ÊÔÚÈí";
    SlotName[ dutch ] = "Hyperlink invoegen";
    SlotName[ chinese_simplified ] = "²åÈ볬Á´½Ó";
    SlotName[ greek ] = "ÅéóáãùãÞ õðåñóýíäåóçò";
    SlotName[ korean ] = "ÇÏÀÌÆÛ¸µÅ© »ðÀÔ";
    SlotName[ turkish ] = "Hyperlink ekle";
};
SfxSlotInfo FN_INSERT_IDX_ENTRY_DLG
{
    SlotName = "Indexmarkierung einfügen";
    SlotName [ english ] =  "Indexmarkierung einfügen";
    SlotName[ english_us ] = "Insert Index Marker";
    SlotName[ portuguese ] = "Inserir marcador do índice";
    SlotName[ russian ] = "Âñòàâèòü ìåòêó óêàçàòåëÿ";
    SlotName[ dutch ] = "Indexmarkering invoegen";
    SlotName[ french ] = "Insérer une marque d'index";
    SlotName[ spanish ] = "Insertar marca en el índice";
    SlotName[ italian ] = "Inserisci contrassegno indice";
    SlotName[ danish ] = "Indsæt indeksmarkering";
    SlotName[ swedish ] = "Infoga indexmarkering";
    SlotName[ polish ] = "Wstaw znacznik indeksu";
    SlotName[ portuguese_brazilian ] = "InsertIndexEntry";
    SlotName[ japanese ] = "²ÝÃÞ¯¸½Ï°¶°‚Ì‘}“ü";
    SlotName[ chinese_simplified ] = "²åÈëË÷Òý±ê¼Ç";
    SlotName[ chinese_traditional ] = "´¡¤J¯Á¤Þ¿ï¨ú";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÊÍÏíÏ ÝåÑÓí";
    SlotName[ dutch ] = "Indexmarkering invoegen";
    SlotName[ chinese_simplified ] = "²åÈëË÷Òý±ê¼Ç";
    SlotName[ greek ] = "ÅéóáãùãÞ óçìÜäé åõñåôçñßïõ";
    SlotName[ korean ] = "À妽º ¼±ÅÃÇ¥½Ã »ðÀÔ";
    SlotName[ turkish ] = "Dizin belirteci ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_LINEBREAK
{
    SlotName = "Manuellen Zeilenumbruch einfügen";
    SlotName [ english ] =  "Manuellen Zeilenumbruch einfügen";
    SlotName[ english_us ] = "Insert Manual Row Break";
    SlotName[ portuguese ] = "Inserir quebra de linha manual";
    SlotName[ russian ] = "Âñòàâèòü âðó÷íóþ ðàçðûâ ñòðîêè";
    SlotName[ dutch ] = "Handmatig regeleinde invoegen";
    SlotName[ french ] = "Insérer un renvoi à la ligne manuel";
    SlotName[ spanish ] = "Insertar salto de línea manual";
    SlotName[ italian ] = "Inserisci interruzione manuale riga";
    SlotName[ danish ] = "Indsæt manuelt linjeskift";
    SlotName[ swedish ] = "Infoga manuell radbrytning";
    SlotName[ polish ] = "Wstaw rêczny podzia³ wierszy";
    SlotName[ portuguese_brazilian ] = "InsertManualLineBreak";
    SlotName[ japanese ] = "Žè“®‰üs‚Ì‘}“ü";
    SlotName[ chinese_simplified ] = "ÊÖ¹¤²åÈë»»Ðзû";
    SlotName[ chinese_traditional ] = "¤â¤u´¡¤J´«¦æ²Å";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÝÇÕá ÃÓØÑ íÏæí";
    SlotName[ dutch ] = "Handmatig regeleinde invoegen";
    SlotName[ chinese_simplified ] = "ÊÖ¹¤²åÈë»»Ðзû";
    SlotName[ greek ] = "ÅéóáãùãÞ ÷åéñïêßíçôçò áëëáãÞò ãñáììÞò";
    SlotName[ korean ] = "¼öµ¿ Çà ³ª´©±â »ðÀÔ";
    SlotName[ turkish ] = "Manüel satýr sonu ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_OBJ_CTRL
{
    SlotName = "Objekte einfügen";
    SlotName [ english ] =  "Objekte einfügen";
    SlotName[ english_us ] = "Insert Objects";
    SlotName[ portuguese ] = "Inserir objectos";
    SlotName[ russian ] = "Âñòàâèòü îáúåêòû";
    SlotName[ dutch ] = "Objecten invoegen";
    SlotName[ french ] = "Insérer des objets";
    SlotName[ spanish ] = "Insertar objetos";
    SlotName[ italian ] = "Inserisci oggetti";
    SlotName[ danish ] = "Indsæt objekt";
    SlotName[ swedish ] = "Infoga objekt";
    SlotName[ polish ] = "Wstaw obiekty";
    SlotName[ portuguese_brazilian ] = "InsertObjCtrl";
    SlotName[ japanese ] = "µÌÞ¼Þª¸Ä‚Ì‘}“ü";
    SlotName[ chinese_simplified ] = "²åÈë¶ÔÏó";
    SlotName[ chinese_traditional ] = "´¡¤Jª«¥ó";
    SlotName[ arabic ] = "ÅÏÑÇÌ ßÇÆäÇÊ";
    SlotName[ dutch ] = "Objecten invoegen";
    SlotName[ chinese_simplified ] = "²åÈë¶ÔÏó";
    SlotName[ greek ] = "ÅéóáãùãÞ áíôéêåéìÝíùí";
    SlotName[ korean ] = "°³Ã¼ »ðÀÔ";
    SlotName[ turkish ] = "Nesne ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_OBJECT_DLG
{
    SlotName = "Weitere Objekte einfügen";
    SlotName [ english ] =  "Weitere Objekte einfügen";
    SlotName[ english_us ] = "Insert Other Objects";
    SlotName[ portuguese ] = "Inserir outros objectos";
    SlotName[ russian ] = "Âñòàâèòü äîïîëíèòåëüíûå îáúåêòû";
    SlotName[ dutch ] = "Andere objecten invoegen";
    SlotName[ french ] = "Insérer d'autres objets";
    SlotName[ spanish ] = "Insertar otros objetos";
    SlotName[ italian ] = "Inserisci ulteriori oggetti";
    SlotName[ danish ] = "Indsæt flere objekter";
    SlotName[ swedish ] = "Infoga andra objekt";
    SlotName[ polish ] = "Wstaw dalsze obiekty";
    SlotName[ portuguese_brazilian ] = "InsertObject";
    SlotName[ japanese ] = "‚Ù‚©‚̵ÌÞ¼Þª¸Ä‚Ì‘}“ü";
    SlotName[ chinese_simplified ] = "²åÈëÆäËü¶ÔÏó";
    SlotName[ chinese_traditional ] = "´¡¤J¨ä¥¦ª«¥ó";
    SlotName[ arabic ] = "ÅÏÑÇÌ ßÇÆäÇÊ ÃÎÑì";
    SlotName[ dutch ] = "Andere objecten invoegen";
    SlotName[ chinese_simplified ] = "²åÈëÆäËü¶ÔÏó";
    SlotName[ greek ] = "ÐñïóèÞêç Üëëùí áíôéêåéìÝíùí";
    SlotName[ korean ] = "´Ù¸¥ °³Ã¼ »ðÀÔ";
    SlotName[ turkish ] = "Baþka nesne ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_PAGEBREAK
{
    SlotName = "Manuellen Seitenwechsel einfügen";
    SlotName [ english ] =  "Manuellen Seitenwechsel einfügen";
    SlotName[ english_us ] = "Insert Manual Page Break";
    SlotName[ portuguese ] = "Inserir quebra de página manual";
    SlotName[ russian ] = "Âñòàâèòü âðó÷íóþ ðàçðûâ ñòðàíèöû";
    SlotName[ dutch ] = "Handmatig pagina-einde invoegen";
    SlotName[ french ] = "Insérer un saut de page manuel";
    SlotName[ spanish ] = "Insertar un salto de página manual";
    SlotName[ italian ] = "Inserisci cambio pagina manuale";
    SlotName[ danish ] = "Indsæt manuelt sideskift";
    SlotName[ swedish ] = "Infoga manuell sidbrytning";
    SlotName[ polish ] = "Wstaw rêczne ³amanie stron";
    SlotName[ portuguese_brazilian ] = "InsertManualPageBreak";
    SlotName[ japanese ] = "”CˆÓ‰üÍß°¼Þ‚Ì‘}“ü";
    SlotName[ chinese_simplified ] = "ÊÖ¹¤²åÈë»»Ò³·û";
    SlotName[ chinese_traditional ] = "¤â¤u´¡¤J´«­¶²Å";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÝÇÕá ÕÝÍÇÊ íÏæí";
    SlotName[ dutch ] = "Handmatig pagina-einde invoegen";
    SlotName[ chinese_simplified ] = "ÊÖ¹¤²åÈë»»Ò³·û";
    SlotName[ greek ] = "ÅéóáãùãÞ ÷åéñïêßíçôçò áëëáãÞò óåëßäáò";
    SlotName[ korean ] = "ÆäÀÌÁö ³ª´©±â »ðÀÔ";
    SlotName[ turkish ] = "Manüel sayfa sonu ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_PAGEFOOTER
{
    SlotName = "Fußzeile einfügen";
    SlotName [ english ] =  "Fußzeile einfügen";
    SlotName[ english_us ] = "Insert Footer";
    SlotName[ portuguese ] = "Inserir rodapé";
    SlotName[ russian ] = "Âñòàâèòü íèæíèé êîëîíòèòóë";
    SlotName[ dutch ] = "Voettekst invoegen";
    SlotName[ french ] = "Insérer un pied de page";
    SlotName[ spanish ] = "Insertar pie de página";
    SlotName[ italian ] = "Inserisci piè di pagina";
    SlotName[ danish ] = "Indsæt sidefod";
    SlotName[ swedish ] = "Infoga sidfot";
    SlotName[ polish ] = "Wstaw stopkê";
    SlotName[ portuguese_brazilian ] = "InsertPageFooter";
    SlotName[ japanese ] = "̯À‚Ì‘}“ü";
    SlotName[ chinese_simplified ] = "²åÈëÒ³½Å";
    SlotName[ chinese_traditional ] = "´¡¤J­¶¸}";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÊÐííá ÕÝÍÉ";
    SlotName[ dutch ] = "Voettekst invoegen";
    SlotName[ chinese_simplified ] = "²åÈëÒ³½Å";
    SlotName[ greek ] = "ÅéóáãùãÞ õðïóÝëéäïõ";
    SlotName[ korean ] = "¹Ù´Ú±Û »ðÀÔ";
    SlotName[ turkish ] = "Altbilgi ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_PAGEHEADER
{
    SlotName = "Kopfzeile einfügen";
    SlotName [ english ] =  "Kopfzeile einfügen";
    SlotName[ english_us ] = "Insert Header";
    SlotName[ portuguese ] = "Inserir cabeçalho";
    SlotName[ russian ] = "Âñòàâèòü âåðõíèé êîëîíòèòóë";
    SlotName[ dutch ] = "Koptekst invoegen";
    SlotName[ french ] = "Insérer un en-tête";
    SlotName[ spanish ] = "Insertar encabezamiento";
    SlotName[ italian ] = "Inserisci riga d'intestazione";
    SlotName[ danish ] = "Indsæt sidehoved";
    SlotName[ swedish ] = "Infoga sidhuvud";
    SlotName[ polish ] = "Wstaw nag³ówek";
    SlotName[ portuguese_brazilian ] = "InsertPageHeader";
    SlotName[ japanese ] = "ͯÀނ̑}“ü";
    SlotName[ chinese_simplified ] = "²åÈëҳü";
    SlotName[ chinese_traditional ] = "´¡¤J­¶­º";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÑÃÓ ÕÝÍÉ";
    SlotName[ dutch ] = "Koptekst invoegen";
    SlotName[ chinese_simplified ] = "²åÈëҳü";
    SlotName[ greek ] = "ÅéóáãùãÞ êåöáëßäáò";
    SlotName[ korean ] = "¸Ó¸®±Û »ðÀÔ";
    SlotName[ turkish ] = "Üstbilgi ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_REF_FIELD
{
    SlotName = "Querverweis einfügen";
    SlotName [ english ] =  "Querverweis einfügen";
    SlotName[ english_us ] = "Insert Field Reference";
    SlotName[ portuguese ] = "Inserir referência";
    SlotName[ russian ] = "Âñòàâèòü ïåðåêðåñòíóþ ññûëêó";
    SlotName[ dutch ] = "Kruisverwijzing invoegen";
    SlotName[ french ] = "Insérer un renvoi";
    SlotName[ spanish ] = "Insertar campo referencia";
    SlotName[ italian ] = "Inserisci riferimento incrociato";
    SlotName[ danish ] = "Indsæt krydshenvisning";
    SlotName[ swedish ] = "Infoga korshänvisning";
    SlotName[ polish ] = "Wstaw odsy³acz";
    SlotName[ portuguese_brazilian ] = "InsertReferenzField";
    SlotName[ japanese ] = "ŽQÆÌ¨°ÙÄނ̑}“ü";
    SlotName[ chinese_simplified ] = "²åÈë²ÎÕÕ";
    SlotName[ chinese_traditional ] = "´¡¤JÄæ¦ì°Ñ·Ó";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÅÓäÇÏÇÊ ÊÑÇÝÞíÉ";
    SlotName[ dutch ] = "Kruisverwijzing invoegen";
    SlotName[ chinese_simplified ] = "²åÈë²ÎÕÕ";
    SlotName[ greek ] = "ÅéóáãùãÞ ðáñáðïìðÞ ðåäßïõ";
    SlotName[ korean ] = "Çʵå ÂüÁ¶ »ðÀÔ";
    SlotName[ turkish ] = "Çapraz baþvuru alaný ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_REGION
{
    SlotName = "Bereich einfügen";
    SlotName [ english ] =  "Bereich einfügen";
    SlotName[ english_us ] = "Insert Section";
    SlotName[ portuguese ] = "Inserir secção";
    SlotName[ russian ] = "Âñòàâèòü îáëàñòü";
    SlotName[ dutch ] = "Bereik invoegen";
    SlotName[ french ] = "Insérer une section";
    SlotName[ spanish ] = "Insertar área";
    SlotName[ italian ] = "Inserisci area";
    SlotName[ danish ] = "Indsæt område";
    SlotName[ swedish ] = "Infoga område";
    SlotName[ polish ] = "Wstaw obszar";
    SlotName[ portuguese_brazilian ] = "InsertRegion";
    SlotName[ japanese ] = "¾¸¼®Ý‚Ì‘}“ü";
    SlotName[ chinese_simplified ] = "²åÈëÇøÓò";
    SlotName[ chinese_traditional ] = "´¡¤J°Ï°ì";
    SlotName[ arabic ] = "ÅÏÑÇÌ äØÇÞ";
    SlotName[ dutch ] = "Bereik invoegen";
    SlotName[ chinese_simplified ] = "²åÈëÇøÓò";
    SlotName[ greek ] = "ÅéóáãùãÞ åíüôçôáò";
    SlotName[ korean ] = "±¸¿ª »ðÀÔ";
    SlotName[ turkish ] = "Bölüm ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_SIM
{
    SlotName = "Aus Bildbearbeitung einfügen";
    SlotName [ english ] =  "Aus Bildbearbeitung einfügen";
    SlotName[ english_us ] = "Insert from Image Editor";
    SlotName[ portuguese ] = "Inserir imagem";
    SlotName[ russian ] = "Âñòàâèòü èç ðåäàêòîðà èçîáðàæåíèÿ";
    SlotName[ dutch ] = "Uit afbeeldingsbewerking invoegen";
    SlotName[ french ] = "Insérer à partir de l'éditeur d'image";
    SlotName[ spanish ] = "Insertar desde la edición de imágenes";
    SlotName[ italian ] = "Inserisci da elaboratore immagini";
    SlotName[ danish ] = "Indsæt fra billedredigeringen";
    SlotName[ swedish ] = "Infoga från bildredigering";
    SlotName[ polish ] = "Wstaw z edytora obrazów";
    SlotName[ portuguese_brazilian ] = "InsertObjectStarOffice Image";
    SlotName[ japanese ] = "²Ò°¼Þݸނ©‚ç‚Ì‘}“ü";
    SlotName[ chinese_simplified ] = "´ÓͼÏñ±à¼­Æ÷²åÈë";
    SlotName[ chinese_traditional ] = "±q¤pµe®a´¡¤J";
    SlotName[ arabic ] = "ÅÏÑÇÌ ãä ãÍÑÑ ÇáÕæÑ";
    SlotName[ dutch ] = "Uit afbeeldingsbewerking invoegen";
    SlotName[ chinese_simplified ] = "´ÓͼÏñ±à¼­Æ÷²åÈë";
    SlotName[ greek ] = "ÅéóáãùãÞ áðü ôçí åðåîåñãáóßá åéêüíáò";
    SlotName[ korean ] = "À̹ÌÁö ÆíÁý±â·ÎºÎÅÍ °¡Á®¿À±â";
    SlotName[ turkish ] = "Görüntü düzenleyiciden ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_SMA
{
    SlotName = "StarOffice Math Objekt einfügen";
    SlotName [ english ] =  "Insert StarOffice Math object";
    SlotName[ english_us ] = "Insert StarOffice Math object";
    SlotName[ portuguese ] = "Inserir objecto do StarOffice Math";
    SlotName[ russian ] = "Âñòàâèòü îáúåêò StarOffice Math";
    SlotName[ dutch ] = "StarOffice Math-object invoegen";
    SlotName[ french ] = "Insérer un objet StarOffice Math";
    SlotName[ spanish ] = "Insertar objeto StarOffice Math";
    SlotName[ italian ] = "Inserisci oggetto StarOffice Math";
    SlotName[ danish ] = "Indsæt StarOffice Math-objekt";
    SlotName[ swedish ] = "Infoga StarOffice Math-objekt";
    SlotName[ polish ] = "Wstaw obiekt StarOffice Math";
    SlotName[ portuguese_brazilian ] = "InsertObjectStarOffice Math";
    SlotName[ japanese ] = "StarOffice Math µÌÞ¼Þª¸Ä‚Ì‘}“ü";
    SlotName[ chinese_simplified ] = "²åÈë StarOffice Math ¶ÔÏó";
    SlotName[ chinese_traditional ] = "´¡¤J StarOffice Math ª«¥ó";
    SlotName[ arabic ] = "ÅÏÑÇÌ ßÇÆä StarOffice Math ";
    SlotName[ dutch ] = "StarOffice Math-object invoegen";
    SlotName[ chinese_simplified ] = "²åÈë StarOffice Math ¶ÔÏó";
    SlotName[ greek ] = "ÅéóáãùãÞ áíôéêåéìÝíïõ StarOffice Math";
    SlotName[ korean ] = "¼ö½Ä »ðÀÔ";
    SlotName[ turkish ] = "StarMath nesnesi ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_SOFT_HYPHEN
{
    SlotName = "Weichen Trenner einfügen";
    SlotName [ english ] =  "Weichen Trenner einfügen";
    SlotName[ english_us ] = "Insert Soft Hyphen";
    SlotName[ portuguese ] = "Inserir hífen opcional";
    SlotName[ russian ] = "Âñòàâêà ìÿãêèõ ïåðåíîñîâ";
    SlotName[ dutch ] = "Zacht scheidingsteken invoegen";
    SlotName[ french ] = "Insérer une coupure automatique";
    SlotName[ spanish ] = "Insertar guión opcional";
    SlotName[ italian ] = "Inserisci trattino morbido";
    SlotName[ danish ] = "Indsæt blød bindestreg";
    SlotName[ swedish ] = "Infoga mjuka bindestreck";
    SlotName[ polish ] = "Wstaw miêkki znak podzia³u";
    SlotName[ portuguese_brazilian ] = "InsertSoftHyphen";
    SlotName[ japanese ] = "—áŠO‚ÌʲÌ݂ð‘}“ü";
    SlotName[ chinese_simplified ] = "²åÈëÈíÐÔÁ¬×Ö·û";
    SlotName[ chinese_traditional ] = "´¡¤J³n©Ê³s¦r²Å";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÝÇÕáÉ ÇÎÊíÇÑíÉ";
    SlotName[ dutch ] = "Zacht scheidingsteken invoegen";
    SlotName[ chinese_simplified ] = "²åÈëÈíÐÔÁ¬×Ö·û";
    SlotName[ greek ] = "ÐñïóèÞêç Þðéïõ äéá÷ùñéóôéêïý";
    SlotName[ korean ] = "ÀÓÀÇ ÁöÁ¤ ÇÏÀÌÇ »ðÀÔ";
    SlotName[ turkish ] = "Tire ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_SYMBOL
{
    SlotName = "Sonderzeichen einfügen ";
    SlotName [ english ] =  "Sonderzeichen einfügen ";
    SlotName[ english_us ] = "Insert Special Character ";
    SlotName[ portuguese ] = "Inserir símbolo ";
    SlotName[ russian ] = "Âñòàâèòü ñèìâîë ";
    SlotName[ dutch ] = "Speciale tekens invoegen  ";
    SlotName[ french ] = "Insérer des caractères spéciaux ";
    SlotName[ spanish ] = "Insertar símbolo ";
    SlotName[ italian ] = "Inserisci carattere speciale ";
    SlotName[ danish ] = "Indsæt specialtegn ";
    SlotName[ swedish ] = "Infoga specialtecken  ";
    SlotName[ polish ] = "Wstaw znak specjalny   ";
    SlotName[ portuguese_brazilian ] = "InsertSymbol ";
    SlotName[ japanese ] = "“ÁŽê•¶Žš‚Ì‘}“ü ";
    SlotName[ chinese_simplified ] = "²åÈëÌØÊâ×Ö·û ";
    SlotName[ chinese_traditional ] = "´¡¤J¯S®í¦r¤¸ ";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÑãæÒ ÎÇÕÉ ";
    SlotName[ dutch ] = "Speciale tekens invoegen  ";
    SlotName[ chinese_simplified ] = "²åÈëÌØÊâ×Ö·û ";
    SlotName[ greek ] = "ÅéóáãùãÞ åéäéêïý ÷áñáêôÞñá ";
    SlotName[ korean ] = "Ư¼ö¹®ÀÚ »ðÀÔ ";
    SlotName[ turkish ] = "Özel karakter ekle ";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_TABLE
{
    SlotName = "Tabelle einfügen";
    SlotName [ english ] =  "Tabelle einfügen";
    SlotName[ english_us ] = "Insert Table";
    SlotName[ portuguese ] = "Inserir tabela";
    SlotName[ russian ] = "Âñòàâèòü òàáëèöó";
    SlotName[ dutch ] = "Tabel invoegen";
    SlotName[ french ] = "Insérer un tableau";
    SlotName[ spanish ] = "Insertar tabla";
    SlotName[ italian ] = "Inserisci tabella";
    SlotName[ danish ] = "Indsæt tabel";
    SlotName[ swedish ] = "Infoga tabell";
    SlotName[ polish ] = "Wstaw tabelê";
    SlotName[ portuguese_brazilian ] = "InsertTable";
    SlotName[ japanese ] = "•\\‚Ì‘}“ü";
    SlotName[ chinese_simplified ] = "²åÈë±í¸ñ";
    SlotName[ chinese_traditional ] = "´¡¤Jªí®æ";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÌÏæá";
    SlotName[ dutch ] = "Tabel invoegen";
    SlotName[ chinese_simplified ] = "²åÈë±í¸ñ";
    SlotName[ greek ] = "ÅéóáãùãÞ ðßíáêá";
    SlotName[ korean ] = "Ç¥»ðÀÔ";
    SlotName[ turkish ] = "Tablo ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_JAVAEDIT
{
    SlotName = "Script einfügen";
    SlotName [ english ] =  "Script einfügen";
    SlotName[ english_us ] = "Insert Script";
    SlotName[ portuguese ] = "Inserir Script";
    SlotName[ russian ] = "Âñòàâèòü Script";
    SlotName[ dutch ] = "Script invoegen";
    SlotName[ french ] = "Insérer un script";
    SlotName[ spanish ] = "Insertar script";
    SlotName[ italian ] = "Inserisci script";
    SlotName[ danish ] = "Indsæt script";
    SlotName[ swedish ] = "Infoga skript";
    SlotName[ polish ] = "Wstaw Script";
    SlotName[ portuguese_brazilian ] = "InsertScript";
    SlotName[ japanese ] = "½¸ØÌßĂ̑}“ü";
    SlotName[ chinese_simplified ] = "²åÈë½Å±¾";
    SlotName[ chinese_traditional ] = "´¡¤J©R¥O½Z";
    SlotName[ arabic ] = "ÅÏÑÇÌ Script";
    SlotName[ dutch ] = "Script invoegen";
    SlotName[ chinese_simplified ] = "²åÈë½Å±¾";
    SlotName[ greek ] = "ÅéóáãùãÞ äÝóìçò åíåñãåéþí";
    SlotName[ korean ] = "½ºÅ©¸³Æ® »ðÀÔ";
    SlotName[ turkish ] = "Komut dizisi ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_LABEL
{
    SlotName = "Etiketten einfügen";
    SlotName [ english ] =  "Etiketten einfügen";
    SlotName[ english_us ] = "Insert Labels";
    SlotName[ portuguese ] = "Inserir rótulos";
    SlotName[ russian ] = "Âñòàâèòü íàêëåéêè";
    SlotName[ dutch ] = "Etiketten invoegen";
    SlotName[ french ] = "Insérer des étiquettes";
    SlotName[ spanish ] = "Insertar etiquetas";
    SlotName[ italian ] = "Inserisci etichette";
    SlotName[ danish ] = "Indsæt etiketter";
    SlotName[ swedish ] = "Infoga etiketter";
    SlotName[ polish ] = "Dodaj etykietê";
    SlotName[ portuguese_brazilian ] = "InsertLabels";
    SlotName[ japanese ] = "×ÍÞق̑}“ü";
    SlotName[ chinese_simplified ] = "²åÈë±êÇ©";
    SlotName[ chinese_traditional ] = "´¡¤J¶K¼Ð";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÈØÇÞÇÊ ÚäæäÉ";
    SlotName[ dutch ] = "Etiketten invoegen";
    SlotName[ chinese_simplified ] = "²åÈë±êÇ©";
    SlotName[ greek ] = "ÅéóáãùãÞ åôéêÝôáò";
    SlotName[ korean ] = "¶óº§ »ðÀÔ";
    SlotName[ turkish ] = "Etiket ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_BUSINESS_CARD
{
    SlotName = "Visitenkarten einfügen";
    SlotName [ english ] =  "Insert business cards";
    SlotName[ english_us ] = "Insert business cards";
    SlotName[ portuguese ] = "Inserir cartões de visita";
    SlotName[ russian ] = "Âñòàâèòü âèçèòíûå êàðòî÷êè";
    SlotName[ greek ] = "ÐñïóèÞêç êáñôþí ðáñïõóßáóçò";
    SlotName[ dutch ] = "Visitekaartjes invoegen";
    SlotName[ french ] = "Insérer des cartes de visite";
    SlotName[ spanish ] = "Insertar tarjetas de visita";
    SlotName[ italian ] = "Inserisci biglietti da visita";
    SlotName[ danish ] = "Indsæt visitkort";
    SlotName[ swedish ] = "Infoga visitkort";
    SlotName[ polish ] = "Dodaj wizytówki";
    SlotName[ portuguese_brazilian ] = "Insert business cards";
    SlotName[ japanese ] = "–¼Žh‚Ì‘}“ü";
    SlotName[ korean ] = "¸íÇÔ »ðÀÔ";
    SlotName[ chinese_simplified ] = "²åÈëÃûƬ";
    SlotName[ chinese_traditional ] = "´¡¤J¦W¤ù";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÈØÇÞÇÊ ÇáÒíÇÑÉ";
    SlotName[ turkish ] = "Kartvizit ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_LINE_DOWN
{
    SlotName = "Zur Zeile unten";
    SlotName [ english ] =  "Zur Zeile unten";
    SlotName[ english_us ] = "To Line Below";
    SlotName[ portuguese ] = "Ir para a linha inferior";
    SlotName[ russian ] = "Äî íèæíåé ñòðîêè";
    SlotName[ dutch ] = "Naar regel beneden";
    SlotName[ french ] = "A la ligne inférieure";
    SlotName[ spanish ] = "Ir a la línea de abajo";
    SlotName[ italian ] = "Alla riga in basso";
    SlotName[ danish ] = "Til række forneden";
    SlotName[ swedish ] = "Till raden under";
    SlotName[ polish ] = "Do wiersza na dole";
    SlotName[ portuguese_brazilian ] = "GoDown";
    SlotName[ japanese ] = "s‚̉º‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÏÂÃæµÄÐÐ";
    SlotName[ chinese_traditional ] = "Âà¨ì¤U¤@¦æ";
    SlotName[ arabic ] = "Åáì ÇáÓØÑ ÇáÃÓÝá";
    SlotName[ dutch ] = "Naar regel beneden";
    SlotName[ chinese_simplified ] = "תµ½ÏÂÃæµÄÐÐ";
    SlotName[ greek ] = "Ðñïò ãñáììÞ êÜôù";
    SlotName[ korean ] = "¶óÀÎ ¾Æ·¡¿¡";
    SlotName[ turkish ] = "Alttaki satýr";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_LINE_DOWN_SEL
{
    SlotName = "Bis Zeile unten selektieren";
    SlotName [ english ] =  "Bis Zeile unten selektieren";
    SlotName[ english_us ] = "Select Down";
    SlotName[ portuguese ] = "Seleccionar até à linha inferior";
    SlotName[ russian ] = "Âûäåëèòü äî íèæíåé ñòðîêè";
    SlotName[ dutch ] = "Tot regel beneden selecteren";
    SlotName[ french ] = "Sélect. vers le bas";
    SlotName[ spanish ] = "Seleccionar hasta la línea de abajo";
    SlotName[ italian ] = "Seleziona fino alla riga in basso";
    SlotName[ danish ] = "Marker til række forneden";
    SlotName[ swedish ] = "Markera till raden under";
    SlotName[ polish ] = "Zaznacz do wiersza na dole";
    SlotName[ portuguese_brazilian ] = "LineDownSel";
    SlotName[ japanese ] = "s‚̉º‚܂őI‘ð";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁÏÂÃæµÄÐÐ";
    SlotName[ chinese_traditional ] = "¿ï¨ú¦Ü¤U¤@¦æ";
    SlotName[ arabic ] = "ÊÍÏíÏ ÍÊì ÇáÓØÑ ÇáÃÓÝá";
    SlotName[ dutch ] = "Tot regel beneden selecteren";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁÏÂÃæµÄÐÐ";
    SlotName[ greek ] = "ÅðéëïãÞ Ýùò ôç ãñáììÞ êÜôù";
    SlotName[ korean ] = "¾Æ·¡ ¼±ÅÃ";
    SlotName[ turkish ] = "Alttaki satýra kadar seç";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_LINE_NUMBERING_DLG
{
    SlotName = "Zeilennummerierung einstellen";
    SlotName [ english ] =  "Zeilennumerierung einstellen";
    SlotName[ english_us ] = "Set Line Numbering";
    SlotName[ portuguese ] = "Definir numeração de linhas";
    SlotName[ russian ] = "Íàñòðîéêà íóìåðàöèè ñòðîê";
    SlotName[ dutch ] = "Regelnummering instellen";
    SlotName[ french ] = "Paramétrer la numérotation des lignes";
    SlotName[ spanish ] = "Definir numeración de líneas";
    SlotName[ italian ] = "Imposta numerazione linee";
    SlotName[ danish ] = "Indstil linjenummerering";
    SlotName[ swedish ] = "Ställ in radnumrering";
    SlotName[ polish ] = "Ustaw numeracjê wierszy";
    SlotName[ portuguese_brazilian ] = "LineNumberingDialog";
    SlotName[ japanese ] = "s‚̔ԍ†•t‚¯‚̐ݒè";
    SlotName[ chinese_simplified ] = "É趨ÐбàºÅ";
    SlotName[ chinese_traditional ] = "³]©w¦æ½s¸¹";
    SlotName[ arabic ] = "ÊÚííä ÊÑÞíã ÇáÃÓØÑ";
    SlotName[ dutch ] = "Regelnummering instellen";
    SlotName[ chinese_simplified ] = "É趨ÐбàºÅ";
    SlotName[ greek ] = "Êáèïñéóìüò áñßèìçóçò ãñáììþí";
    SlotName[ korean ] = "¼± ¹øÈ£¸Å±â±â ¼³Á¤";
    SlotName[ turkish ] = "Satýr numaralarýný ayarla";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_LINE_UP
{
    SlotName = "Zur Zeile oben";
    SlotName [ english ] =  "Zur Zeile oben";
    SlotName[ english_us ] = "To Top Line";
    SlotName[ portuguese ] = "Ir para a linha superior";
    SlotName[ russian ] = "Äî âåðõíåé ñòðîêè";
    SlotName[ dutch ] = "Naar regel boven";
    SlotName[ french ] = "Aller à la ligne supérieure";
    SlotName[ spanish ] = "Ir a la línea de arriba";
    SlotName[ italian ] = "Alla riga superiore";
    SlotName[ danish ] = "Til række foroven";
    SlotName[ swedish ] = "Till raden över";
    SlotName[ polish ] = "Do górnego wiersza";
    SlotName[ portuguese_brazilian ] = "GoUp";
    SlotName[ japanese ] = "s‚̏ã‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÐÐÉÏ·½";
    SlotName[ chinese_traditional ] = "Âà¨ì¤W¤@¦æ";
    SlotName[ arabic ] = "Åáì ÇáÓØÑ ÇáÃÚáì";
    SlotName[ dutch ] = "Naar regel boven";
    SlotName[ chinese_simplified ] = "תµ½ÐÐÉÏ·½";
    SlotName[ greek ] = "Ðñïò ôçí ãñáììÞ Üíù";
    SlotName[ korean ] = "À­ÁÙ·Î";
    SlotName[ turkish ] = "Üsttteki satýr";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_LINE_UP_SEL
{
    SlotName = "Bis Zeile oben selektieren";
    SlotName [ english ] =  "Bis Zeile oben selektieren";
    SlotName[ english_us ] = "Select to Top Line";
    SlotName[ portuguese ] = "Seleccionar até à linha superior";
    SlotName[ russian ] = "Âûäåëèòü äî âåðõíåé ñòðîêè";
    SlotName[ dutch ] = "Tot aan bovenste regel selecteren";
    SlotName[ french ] = "Sélect. jusqu'à la ligne supérieure";
    SlotName[ spanish ] = "Seleccionar hasta línea de arriba";
    SlotName[ italian ] = "Seleziona fino alla riga superiore";
    SlotName[ danish ] = "Marker til række foroven";
    SlotName[ swedish ] = "Markera till raden över";
    SlotName[ polish ] = "Zaznacz do wiersza w górze";
    SlotName[ portuguese_brazilian ] = "LineUpSel";
    SlotName[ japanese ] = "s‚̏ã‚܂őI‘ð";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁÐеÄÉÏ·½";
    SlotName[ chinese_traditional ] = "¿ï¨ú¦Ü¤W¤@¦æ";
    SlotName[ arabic ] = "ÊÍÏíÏ ÍÊì ÇáÓØÑ ÇáÃÚáì";
    SlotName[ dutch ] = "Tot aan bovenste regel selecteren";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁÐеÄÉÏ·½";
    SlotName[ greek ] = "ÅðéëïãÞ Ýùò ôçí ãñáììÞ Üíù";
    SlotName[ korean ] = "À­ÁÙ±îÁö ¼±ÅÃ";
    SlotName[ turkish ] = "Üstteki satýra kadar ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NAVIGATION_PI_GOTO_PAGE
{
    SlotName = "Zur Seite";
    SlotName [ english ] =  "Zur Seite";
    SlotName[ english_us ] = "To Page";
    SlotName[ portuguese ] = "Ir para página";
    SlotName[ russian ] = "Ïåðåéòè íà ñòðàíèöó";
    SlotName[ dutch ] = "Naar pagina";
    SlotName[ french ] = "Aller à la page";
    SlotName[ spanish ] = "Ir a la página";
    SlotName[ italian ] = "Alla pagina";
    SlotName[ danish ] = "Til side";
    SlotName[ swedish ] = "Till sidan";
    SlotName[ polish ] = "Do strony";
    SlotName[ portuguese_brazilian ] = "GoToPage";
    SlotName[ japanese ] = "Íß°¼Þ‚Ö";
    SlotName[ chinese_simplified ] = "תµ½Ò³Ãæ";
    SlotName[ chinese_traditional ] = "Âà¨ì­¶­±";
    SlotName[ arabic ] = "ÅáìÇáÕÝÍÉ";
    SlotName[ dutch ] = "Naar pagina";
    SlotName[ chinese_simplified ] = "תµ½Ò³Ãæ";
    SlotName[ greek ] = "Ðñïò óåëßäá";
    SlotName[ korean ] = "ÆäÀÌÁö·Î";
    SlotName[ turkish ] = "Sayfa";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NEW_GLOBAL_DOC
{
    SlotName = "Globaldokument erzeugen";
    SlotName [ english ] =  "Globaldokument erzeugen";
    SlotName[ english_us ] = "Create Master Document";
    SlotName[ portuguese ] = "Criar documento-mestre";
    SlotName[ russian ] = "Ñîçäàòü ãëàâíûé äîêóìåíò";
    SlotName[ dutch ] = "Master-document maken";
    SlotName[ french ] = "Créer document maître";
    SlotName[ spanish ] = "Crear un documento maestro";
    SlotName[ italian ] = "Crea documento master";
    SlotName[ danish ] = "Opret hoveddokument";
    SlotName[ swedish ] = "Skapa samlingsdokument";
    SlotName[ polish ] = "Utwórz dokument g³ówny";
    SlotName[ portuguese_brazilian ] = "NewGlobalDoc";
    SlotName[ japanese ] = "ϽÀ°ÄÞ·­ÒÝĂ̍쐬";
    SlotName[ chinese_simplified ] = "Éú³ÉÖ÷¿ØÎĵµ";
    SlotName[ chinese_traditional ] = "«Ø¥ß¥D±±¤å¥ó";
    SlotName[ arabic ] = "ÅäÔÇÁ ãÓÊäÏ ÔÇãá";
    SlotName[ dutch ] = "Master-document maken";
    SlotName[ chinese_simplified ] = "Éú³ÉÖ÷¿ØÎĵµ";
    SlotName[ greek ] = "Äçìéïõñãßá êýñéïõ åããñÜöïõ";
    SlotName[ korean ] = "¹®¼­ ¸¸µé±â";
    SlotName[ turkish ] = "Ana belge";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NEW_HTML_DOC
{
    SlotName = "HTML Dokument erzeugen";
    SlotName [ english ] =  "HTML Dokument erzeugen";
    SlotName[ english_us ] = "Create HTML Document";
    SlotName[ portuguese ] = "Criar documento HTML";
    SlotName[ russian ] = "Ñîçäàòü äîêóìåíò â ôîðìàòå HTML";
    SlotName[ dutch ] = "HTLM-document maken";
    SlotName[ french ] = "Créer un document HTML";
    SlotName[ spanish ] = "Crear documento HTML";
    SlotName[ italian ] = "Crea nuovo documento HTML";
    SlotName[ danish ] = "Opret HTML-dokument";
    SlotName[ swedish ] = "Skapa HTML-dokument";
    SlotName[ polish ] = "Utwórz dokument HTML";
    SlotName[ portuguese_brazilian ] = "NewHtmlDoc";
    SlotName[ japanese ] = "HTMLŒ`Ž®‚Ì•¶‘ì¬";
    SlotName[ chinese_simplified ] = "Éú³É HTML Îĵµ";
    SlotName[ chinese_traditional ] = "»s§@ HTML ¤å¥ó";
    SlotName[ arabic ] = "ÅäÔÇÁ ãÓÊäÏ HTML";
    SlotName[ dutch ] = "HTLM-document maken";
    SlotName[ chinese_simplified ] = "Éú³É HTML Îĵµ";
    SlotName[ greek ] = "Äçìéïõñãßá åããñÜöïõ HTML";
    SlotName[ korean ] = "HTML ¹®¼­ ¸¸µé±â";
    SlotName[ turkish ] = "HTML belgesi oluþtur";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NEXT_BOOKMARK
{
    SlotName = "Zur nächsten Textmarke";
    SlotName [ english ] =  "Zur nächsten Textmarke";
    SlotName[ english_us ] = "To Next Bookmark";
    SlotName[ portuguese ] = "Marcador de texto seguinte";
    SlotName[ russian ] = "Äî ñëåäóþùåé çàêëàäêè";
    SlotName[ dutch ] = "Naar volgende tekstmarkering";
    SlotName[ french ] = "Aller au repère de texte suivant";
    SlotName[ spanish ] = "Ir al marcador siguiente";
    SlotName[ italian ] = "Al segnalibro successivo";
    SlotName[ danish ] = "Til næste tekstmarkering";
    SlotName[ swedish ] = "Till nästa textmarkering";
    SlotName[ polish ] = "Do nastêpnej zak³adki";
    SlotName[ portuguese_brazilian ] = "JumpToNextBookmark";
    SlotName[ japanese ] = "ŽŸ‚Ì÷½Äϰ¸‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÏÂÒ»¸öÊéÇ©";
    SlotName[ chinese_traditional ] = "Âà¨ì¤U¤@®ÑÅÒ";
    SlotName[ arabic ] = "Åáì ÇáÅÔÇÑÉ ÇáãÑÌÚíÉ ÇáÊÇáíÉ";
    SlotName[ dutch ] = "Naar volgende tekstmarkering";
    SlotName[ chinese_simplified ] = "תµ½ÏÂÒ»¸öÊéÇ©";
    SlotName[ greek ] = "Ðñïò åðüìåíï óåëéäïäåßêôç";
    SlotName[ korean ] = "´ÙÀ½ Ã¥ °¥ÇÇ·Î";
    SlotName[ turkish ] = "Sonraki metin belirteci";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NEXT_FOOTNOTE
{
    SlotName = "Zur nächsten Fußnote";
    SlotName [ english ] =  "Zur nächsten Fußnote";
    SlotName[ english_us ] = "To Next Footnote";
    SlotName[ portuguese ] = "Ir para nota de rodapé seguinte";
    SlotName[ russian ] = "Äî ñëåäóþùåé ñíîñêè";
    SlotName[ dutch ] = "Naar volgende voetnoot";
    SlotName[ french ] = "À la note de bas de page suivante";
    SlotName[ spanish ] = "Ir a la nota al pie siguiente";
    SlotName[ italian ] = "Alla nota a piè pagina successiva";
    SlotName[ danish ] = "Til næste fodnote";
    SlotName[ swedish ] = "Till nästa fotnot";
    SlotName[ polish ] = "Do nastêpnego przypisu dolnego";
    SlotName[ portuguese_brazilian ] = "GoToNextFootnote";
    SlotName[ japanese ] = "ŽŸ‚Ì‹r’‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÏÂÒ»¸ö×¢½Å";
    SlotName[ chinese_traditional ] = "Âà¨ì¤U¤@­Óµù¸}";
    SlotName[ arabic ] = "Åáì ÇáÍÇÔíÉ ÇáÓÝáíÉ ÇáÊÇáíÉ";
    SlotName[ dutch ] = "Naar volgende voetnoot";
    SlotName[ chinese_simplified ] = "תµ½ÏÂÒ»¸ö×¢½Å";
    SlotName[ greek ] = "Ðñïò ôçí åðüìåíç õðïóçìåßùóç";
    SlotName[ korean ] = "´ÙÀ½ °¢ÁÖ·Î";
    SlotName[ turkish ] = "Sonraki altbilgi";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NEXT_PARA
{
    SlotName = "Zum nächsten Absatz";
    SlotName [ english ] =  "Zum nächsten Absatz";
    SlotName[ english_us ] = "To Next Paragraph";
    SlotName[ portuguese ] = "Parágrafo seguinte";
    SlotName[ russian ] = "Äî ñëåäóþùåãî àáçàöà";
    SlotName[ dutch ] = "Naar volgende alinea";
    SlotName[ french ] = "Au paragraphe suivant";
    SlotName[ spanish ] = "Ir al párrafo siguiente";
    SlotName[ italian ] = "Al paragrafo successivo";
    SlotName[ danish ] = "Til næste afsnit";
    SlotName[ swedish ] = "Till nästa stycke";
    SlotName[ polish ] = "Do nastêpnego akapitu";
    SlotName[ portuguese_brazilian ] = "GoToNextPara";
    SlotName[ japanese ] = "ŽŸ‚Ì’i—Ž‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÏÂÒ»¸ö¶ÎÂä";
    SlotName[ chinese_traditional ] = "Âà¨ì¤U¤@­Ó¬q¸¨";
    SlotName[ arabic ] = "Åáì ÇáÝÞÑÉ ÇáÊÇáíÉ";
    SlotName[ dutch ] = "Naar volgende alinea";
    SlotName[ chinese_simplified ] = "תµ½ÏÂÒ»¸ö¶ÎÂä";
    SlotName[ greek ] = "Ðñïò ôçí åðüìåíç ðáñÜãñáöï";
    SlotName[ korean ] = "´ÙÀ½ ´Ü¶ôÀ¸·Î";
    SlotName[ turkish ] = "Sonraki paragraf";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NEXT_SENT
{
    SlotName = "Zum nächsten Satz";
    SlotName [ english ] =  "Zum nächsten Satz";
    SlotName[ english_us ] = "To Next Sentence";
    SlotName[ portuguese ] = "Ir para frase seguinte";
    SlotName[ russian ] = "Äî ñëåäóþùåãî ïðåäëîæåíèÿ";
    SlotName[ dutch ] = "Naar volgende zin";
    SlotName[ french ] = "Aller à la phrase suivante";
    SlotName[ spanish ] = "Ir  la oración siguiente";
    SlotName[ italian ] = "Alla frase successiva";
    SlotName[ danish ] = "Til næste sætning";
    SlotName[ swedish ] = "Till nästa mening";
    SlotName[ polish ] = "Do nastêpnego zdania";
    SlotName[ portuguese_brazilian ] = "GoToNextSentence";
    SlotName[ japanese ] = "ŽŸ‚Ì•¶Í‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÏÂÒ»¸ö¾ä×Ó";
    SlotName[ chinese_traditional ] = "Âà¨ì¤U¤@­Ó¥y¤l";
    SlotName[ arabic ] = "ÍÊì ÇáÌãáÉ ÇáÊÇáíÉ";
    SlotName[ dutch ] = "Naar volgende zin";
    SlotName[ chinese_simplified ] = "תµ½ÏÂÒ»¸ö¾ä×Ó";
    SlotName[ greek ] = "Ðñïò ôçí åðüìåíç ðñüôáóç";
    SlotName[ korean ] = "´ÙÀ½ ¹®ÀåÀ¸·Î";
    SlotName[ turkish ] = "Sonraki cümle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NEXT_SENT_SEL
{
    SlotName = "Bis nächsten Satz selektieren";
    SlotName [ english ] =  "Bis nächsten Satz selektieren";
    SlotName[ english_us ] = "Select to Next Sentence";
    SlotName[ portuguese ] = "Seleccionar até frase seguinte";
    SlotName[ russian ] = "Âûäåëèòü äî ñëåäóþùåãî ïðåäëîæåíèÿ";
    SlotName[ dutch ] = "Tot aan volgende zin selecteren";
    SlotName[ french ] = "Sélect. jusqu'à la phrase suivante";
    SlotName[ spanish ] = "Seleccionar hasta frase siguiente";
    SlotName[ italian ] = "Seleziona fino alla frase successiva";
    SlotName[ danish ] = "Marker til næste sætning";
    SlotName[ swedish ] = "Markera till nästa mening";
    SlotName[ polish ] = "Zaznacz do nastêpnego zdania";
    SlotName[ portuguese_brazilian ] = "GotoNextSentenceSel";
    SlotName[ japanese ] = "ŽŸ‚Ì•¶Í‚܂őI‘ð";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁÏÂÒ»¸ö¾ä×Ó";
    SlotName[ chinese_traditional ] = "¿ï¨ú¦Ü¤U¤@¥y¤l";
    SlotName[ arabic ] = "ÊÍÏíÏ ÍÊì ÇáÌãáÉ ÇáÊÇáíÉ";
    SlotName[ dutch ] = "Tot aan volgende zin selecteren";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁÏÂÒ»¸ö¾ä×Ó";
    SlotName[ greek ] = "ÅðéëïãÞ Ýùò ôçí åðüìåíç ðñüôáóç";
    SlotName[ korean ] = "´ÙÀ½ ¹®Àå ¼±ÅÃ";
    SlotName[ turkish ] = "Sonraki cümleye kadar seç";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NEXT_TABLE
{
    SlotName = "Zur nächsten Tabelle";
    SlotName [ english ] =  "Zur nächsten Tabelle";
    SlotName[ english_us ] = "To Next Table";
    SlotName[ portuguese ] = "Ir para tabela seguinte";
    SlotName[ russian ] = "Äî ñëåäóþùåé òàáëèöû";
    SlotName[ dutch ] = "Naar volgende tabel";
    SlotName[ french ] = "Au tableau suivant";
    SlotName[ spanish ] = "Ir a la tabla siguiente";
    SlotName[ italian ] = "Alla tabella successiva";
    SlotName[ danish ] = "Til næste tabel";
    SlotName[ swedish ] = "Till nästa tabell";
    SlotName[ polish ] = "Do nastêpnej tabeli";
    SlotName[ portuguese_brazilian ] = "GoToNextTable";
    SlotName[ japanese ] = "ŽŸ‚Ì•\\‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÏÂÒ»¸ö±í¸ñ";
    SlotName[ chinese_traditional ] = "Âà¨ì¤U¤@­Óªí®æ";
    SlotName[ arabic ] = "Åáì ÇáÌÏæá ÇáÊÇáí";
    SlotName[ dutch ] = "Naar volgende tabel";
    SlotName[ chinese_simplified ] = "תµ½ÏÂÒ»¸ö±í¸ñ";
    SlotName[ greek ] = "Ðñïò ôïí åðüìåíï ðßíáêá";
    SlotName[ korean ] = "´ÙÀ½ Ç¥·Î";
    SlotName[ turkish ] = "Sonraki tablo";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NEXT_TBLFML
{
    SlotName = "Zur nächsten Tabellenformel";
    SlotName [ english ] =  "Zur nächsten Tabellenformel";
    SlotName[ english_us ] = "Go to next table formula";
    SlotName[ portuguese ] = "Fórmula de cálculo seguinte";
    SlotName[ russian ] = "Ïåðåéòè ê ñëåäóþùåé ôîðìóëå òàáëèöû";
    SlotName[ dutch ] = "Naar volgende tabelformule";
    SlotName[ french ] = "Aller à la formule de calcul suivante";
    SlotName[ spanish ] = "Ir a la próxima fórmula";
    SlotName[ italian ] = "Alla formula di tabella successiva";
    SlotName[ danish ] = "Til næste tabelformel";
    SlotName[ swedish ] = "Till nästa tabellformel";
    SlotName[ polish ] = "PrzejdŸ do nastêpnej formu³y tabeli";
    SlotName[ portuguese_brazilian ] = "GotoNextTableFormula";
    SlotName[ japanese ] = "ŽŸ‚Ì•\\‚̐”Ž®‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÏÂÒ»¸ö¹¤×÷±í¹«Ê½";
    SlotName[ chinese_traditional ] = "Âà¨ì¤U¤@­Ó¤u§@ªí¤½¦¡";
    SlotName[ arabic ] = "Åáì ÕíÛÉ ÇáÌÏæá ÇáÊÇáíÉ";
    SlotName[ dutch ] = "Naar volgende tabelformule";
    SlotName[ chinese_simplified ] = "תµ½ÏÂÒ»¸ö¹¤×÷±í¹«Ê½";
    SlotName[ greek ] = "Ðñïò ôïí åðüìåíï ôýðï ôïõ ðßíáêá";
    SlotName[ korean ] = "´ÙÀ½ Å×ÀÌºí ¼ö½ÄÀ¸·Î À̵¿";
    SlotName[ turkish ] = "Sonraki tablo formulü";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NEXT_TBLFML_ERR
{
    SlotName = "Zur nächsten fehlerhaften Tabellenformel";
    SlotName [ english ] =  "Zur nächsten fehlerhaften Tabellenformel";
    SlotName[ english_us ] = "Go to next faulty table formula";
    SlotName[ portuguese ] = "Fórmula de cálculo seguinte com defeito";
    SlotName[ russian ] = "Ïåðåéòè ê ñëåäóþùåé ôîðìóëå òàáëèöû, ñîäåðæàùåé îøèáêè";
    SlotName[ dutch ] = "Naar volgende foutieve tabelformule";
    SlotName[ french ] = "Aller à la prochaine formule de calcul erronée";
    SlotName[ spanish ] = "Ir a fórmula errónea siguiente";
    SlotName[ italian ] = "Alla formula di tabella errata successiva";
    SlotName[ danish ] = "Til næste fejlagtige tabelformel";
    SlotName[ swedish ] = "Till nästa felaktiga tabellformel";
    SlotName[ polish ] = "PrzejdŸ do nastêpnej b³êdnej formu³y tabeli";
    SlotName[ portuguese_brazilian ] = "GotoNextWrongTableFormula";
    SlotName[ japanese ] = "ŽŸ‚̐³‚µ‚­‚È‚¢•\\‚̏‘Ž®‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÏÂÒ»¸öÓдíÎóµÄ¹¤×÷±í¹«Ê½";
    SlotName[ chinese_traditional ] = "Âà¨ì¤U¤@­Ó¦³¿ù»~ªº¤u§@ªí¤½¦¡";
    SlotName[ arabic ] = "Åáì ÕíÛÉ ÇáÌÏæá ÇáÎÇØÆÉ ÇáÊÇáíÉ";
    SlotName[ dutch ] = "Naar volgende foutieve tabelformule";
    SlotName[ chinese_simplified ] = "תµ½ÏÂÒ»¸öÓдíÎóµÄ¹¤×÷±í¹«Ê½";
    SlotName[ greek ] = "Ðñïò ôïí åðüìåíï ëáíèáóìÝíï ôýðï ôïõ ðßíáêá";
    SlotName[ korean ] = "Ʋ¸° ´ÙÀ½ Å×ÀÌºí ¼ö½ÄÀ¸·Î À̵¿";
    SlotName[ turkish ] = "Sonraki hatalý tablo formulü";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NEXT_TOXMARK
{
    SlotName = "Zur nächsten Indexmarkierung";
    SlotName [ english ] =  "Zur nächsten Indexmarkierung";
    SlotName[ english_us ] = "Go to Next Index Mark";
    SlotName[ portuguese ] = "Marca seguinte do índice";
    SlotName[ russian ] = "Ïåðåéòè ê ñëåäóþùåé ìåòêå óêàçàòåëÿ";
    SlotName[ dutch ] = "Naar volgende indexmarkering";
    SlotName[ french ] = "Aller à la marque d'index suivante";
    SlotName[ spanish ] = "Ir a la marca de índice siguiente";
    SlotName[ italian ] = "Al contrassegno indice successivo";
    SlotName[ danish ] = "Til næste indeksmarkering";
    SlotName[ swedish ] = "Till nästa indexmarkering";
    SlotName[ polish ] = "PrzejdŸ do nastêpnego znacznika indeksu";
    SlotName[ portuguese_brazilian ] = "GotoNextIndexMark";
    SlotName[ japanese ] = "ŽŸ‚̲ÝÃÞ¸½Ï°¸‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÏÂÒ»¸öË÷Òý±ê¼Ç";
    SlotName[ chinese_traditional ] = "Âà¨ì¤U¤@­Ó¯Á¤Þ¼Ð°O";
    SlotName[ arabic ] = "Åáì ÇáÊÍÏíÏ ÇáÝåÑÓí ÇáÊÇáí";
    SlotName[ dutch ] = "Naar volgende indexmarkering";
    SlotName[ chinese_simplified ] = "תµ½ÏÂÒ»¸öË÷Òý±ê¼Ç";
    SlotName[ greek ] = "Ðñïò ôï åðüìåíï óçìÜäé åõñåôçñßïõ";
    SlotName[ korean ] = "´ÙÀ½ »öÀΠǥ½Ã·Î À̵¿";
    SlotName[ turkish ] = "Sonraki dizin iþareti";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NEXT_WORD
{
    SlotName = "Zum Wort rechts";
    SlotName [ english ] =  "Zum Wort rechts";
    SlotName[ english_us ] = "To Word Right";
    SlotName[ portuguese ] = "Ir para palavra à direita";
    SlotName[ russian ] = "Ê ñëîâó ñïðàâà";
    SlotName[ dutch ] = "Naar woord rechts";
    SlotName[ french ] = "Aller au mot à droite";
    SlotName[ spanish ] = "Ir a la derecha de la palabra";
    SlotName[ italian ] = "Alla parola destra";
    SlotName[ danish ] = "Til ordet til højre";
    SlotName[ swedish ] = "Till höger ord";
    SlotName[ polish ] = "Do s³owa z prawej strony";
    SlotName[ portuguese_brazilian ] = "GoToNextWord";
    SlotName[ japanese ] = "’PŒê‚̉E‘¤‚Ö";
    SlotName[ chinese_simplified ] = "תµ½×ÖµÄÓÒ·½";
    SlotName[ chinese_traditional ] = "Âà¨ì¦r­º";
    SlotName[ arabic ] = "ÍÊì íãíä ÇáßáãÉ";
    SlotName[ dutch ] = "Naar woord rechts";
    SlotName[ chinese_simplified ] = "תµ½×ÖµÄÓÒ·½";
    SlotName[ greek ] = "Ðñïò ôçí ëÝîç äåîéÜ";
    SlotName[ korean ] = "´Ü¾î ¿À¸¥ÂÊ À̵¿";
    SlotName[ turkish ] = "Saðdaki sözcük";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NEXT_WORD_SEL
{
    SlotName = "Bis Wort rechts selektieren";
    SlotName [ english ] =  "Bis Wort rechts selektieren";
    SlotName[ english_us ] = "Select to Word Right";
    SlotName[ portuguese ] = "Seleccionar até ao final da palavra";
    SlotName[ russian ] = "Âûäåëèòü äî ñëîâà ñïðàâà";
    SlotName[ dutch ] = "Tot aan woord rechts selecteren";
    SlotName[ french ] = "Sélect. jusqu'au mot à droite";
    SlotName[ spanish ] = "Seleccionar hasta el final de la palabra";
    SlotName[ italian ] = "Seleziona fino alla parola destra";
    SlotName[ danish ] = "Marker til ordet til højre";
    SlotName[ swedish ] = "Markera till höger ord";
    SlotName[ polish ] = "Zaznacz do s³owa z prawej strony";
    SlotName[ portuguese_brazilian ] = "WordRightSel";
    SlotName[ japanese ] = "’PŒê‚̉E‘¤‚܂őI‘ð";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁ×ÖµÄÓÒ·½";
    SlotName[ chinese_traditional ] = "¿ï¤¤¦Ü¦r¥½";
    SlotName[ arabic ] = "ÊÍÏíÏ ÍÊì ÇáßáãÉ ÇáÊÇáíÉ";
    SlotName[ dutch ] = "Tot aan woord rechts selecteren";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁ×ÖµÄÓÒ·½";
    SlotName[ greek ] = "ÅðéëïãÞ Ýùò ôçí ëÝîç äåîéÜ";
    SlotName[ korean ] = "´Ü¿À ¿À¸¥ÂÊ ¼±ÅÃ";
    SlotName[ turkish ] = "Saðdaki sözcüðe kadar seç";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NUM_BULLET_DOWN
{
    SlotName = "Eine Ebene runter";
    SlotName [ english ] =  "Eine Ebene runter";
    SlotName[ english_us ] = "Down One Level";
    SlotName[ portuguese ] = "Baixar um nível";
    SlotName[ russian ] = "Íà îäèí óðîâåíü âíèç";
    SlotName[ dutch ] = "Een niveau naar beneden";
    SlotName[ french ] = "Abaisser d'un niveau";
    SlotName[ spanish ] = "Bajar un nivel";
    SlotName[ italian ] = "Un livello più in alto";
    SlotName[ danish ] = "Et niveau ned";
    SlotName[ swedish ] = "En nivå nedåt";
    SlotName[ polish ] = "W dó³ jeden poziom";
    SlotName[ portuguese_brazilian ] = "BulletsAndNumberLevelDown";
    SlotName[ japanese ] = "1ÚÍÞىº‚Ö";
    SlotName[ chinese_simplified ] = "ÏòÏÂÒ»¼¶";
    SlotName[ chinese_traditional ] = "¦V¤U¤@¯Å";
    SlotName[ arabic ] = "ãÓÊæì æÇÍÏ áÃÓÝá";
    SlotName[ dutch ] = "Een niveau naar beneden";
    SlotName[ chinese_simplified ] = "ÏòÏÂÒ»¼¶";
    SlotName[ greek ] = "ÌåôáöïñÜ Ýíá åðßðåäï ÷áìçëüôåñá";
    SlotName[ korean ] = "¼öÁØ ³·Ãß±â À̵¿";
    SlotName[ turkish ] = "Bir düzey aþaðý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NUM_BULLET_MOVEDOWN
{
    SlotName = "Nach unten schieben";
    SlotName [ english ] =  "Nach unten schieben";
    SlotName[ english_us ] = "Move Down";
    SlotName[ portuguese ] = "Mover para baixo";
    SlotName[ russian ] = "Ïåðåìåñòèòü âíèç";
    SlotName[ dutch ] = "Naar beneden verplaatsen";
    SlotName[ french ] = "Déplacer vers le bas";
    SlotName[ spanish ] = "Desplazar hacia abajo";
    SlotName[ italian ] = "Sposta verso il basso";
    SlotName[ danish ] = "Flyt nedad";
    SlotName[ swedish ] = "Flytta nedåt";
    SlotName[ polish ] = "Przesuñ w dó³";
    SlotName[ portuguese_brazilian ] = "BulletsAndNumberContentOneDown";
    SlotName[ japanese ] = "‰º•û‚ÖˆÚ“®";
    SlotName[ chinese_simplified ] = "ÏòÏÂÒÆ¶¯";
    SlotName[ chinese_traditional ] = "¦V¤U²¾°Ê";
    SlotName[ arabic ] = "ÅÒÇÍÉ áÃÓÝá";
    SlotName[ dutch ] = "Naar beneden verplaatsen";
    SlotName[ chinese_simplified ] = "ÏòÏÂÒÆ¶¯";
    SlotName[ greek ] = "Ìåôáêßíçóç ðñïò ôá êÜôù";
    SlotName[ korean ] = "¾Æ·¡·Î À̵¿";
    SlotName[ turkish ] = "Aþaðý taþý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NUM_BULLET_MOVEUP
{
    SlotName = "Nach oben schieben";
    SlotName [ english ] =  "Nach oben schieben";
    SlotName[ english_us ] = "Move Up";
    SlotName[ portuguese ] = "Mover para cima";
    SlotName[ russian ] = "Ïåðåìåñòèòü ââåðõ";
    SlotName[ dutch ] = "Naar boven verplaatsen";
    SlotName[ french ] = "Déplacer vers le haut";
    SlotName[ spanish ] = "Desplazar hacia arriba";
    SlotName[ italian ] = "Sposta verso l'alto";
    SlotName[ danish ] = "Flyt opad";
    SlotName[ swedish ] = "Flytta uppåt";
    SlotName[ polish ] = "Przesuñ do góry";
    SlotName[ portuguese_brazilian ] = "BulletsAndNumberContentOneUp";
    SlotName[ japanese ] = "ã•û‚ÖˆÚ“®";
    SlotName[ chinese_simplified ] = "ÏòÉÏÒÆ¶¯";
    SlotName[ chinese_traditional ] = "¦V¤W²¾°Ê";
    SlotName[ arabic ] = "ÅÒÇÍÉ áÃÚáì";
    SlotName[ dutch ] = "Naar boven verplaatsen";
    SlotName[ chinese_simplified ] = "ÏòÉÏÒÆ¶¯";
    SlotName[ greek ] = "ÌåôáöïñÜ ðñïò ôá Üíù";
    SlotName[ korean ] = "À§·Î À̵¿";
    SlotName[ turkish ] = "Yukarý taþý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NUM_BULLET_NEXT
{
    SlotName = "Zum nächsten Absatz gleicher Ebene";
    SlotName [ english ] =  "Zum nächsten Absatz gleicher Ebene";
    SlotName[ english_us ] = "To Next Paragraph in Level";
    SlotName[ portuguese ] = "Páragrafo seguinte do mesmo nível";
    SlotName[ russian ] = "Äî ñëåäóþùåãî àáçàöà òîãî æå óðîâíÿ";
    SlotName[ dutch ] = "Naar de volgende alinea op hetzelfde niveau";
    SlotName[ french ] = "Au paragraphe suivant du même niveau";
    SlotName[ spanish ] = "Al párrafo siguiente del mismo nivel";
    SlotName[ italian ] = "Al paragrafo successivo dello stesso livello";
    SlotName[ danish ] = "Til næste afsnit samme niveau";
    SlotName[ swedish ] = "Till nästa stycke i samma nivå";
    SlotName[ polish ] = "Do nastêpnego akapitu na tym samym poziomie";
    SlotName[ portuguese_brazilian ] = "BulletsAndNumberNextNumberParagraph";
    SlotName[ japanese ] = "ŽŸ‚Ì“¯ÚÍÞق̒i—Ž‚Ö";
    SlotName[ chinese_simplified ] = "תµ½Í¬¼¶µÄÏÂÒ»¸ö¶ÎÂä";
    SlotName[ chinese_traditional ] = "Âà¨ì¦P¯Åªº¤U¤@­Ó¬q¸¨";
    SlotName[ arabic ] = "Åáì ÇáÝÞÑÉ ÇáÊÇáíÉ Ýí äÝÓ ÇáãÓÊæì";
    SlotName[ dutch ] = "Naar de volgende alinea op hetzelfde niveau";
    SlotName[ chinese_simplified ] = "תµ½Í¬¼¶µÄÏÂÒ»¸ö¶ÎÂä";
    SlotName[ greek ] = "Ðñïò åðüìåíç ðáñÜãñáöï ßäéïõ åðéðÝäïõ";
    SlotName[ korean ] = "°°Àº ·¹º§ÀÇ ´ÙÀ½ ´Ü¶ôÀ¸·Î";
    SlotName[ turkish ] = "Ayný düzeyde bulunan sonraki paragraf";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NUM_BULLET_NONUM
{
    SlotName = "Eintrag ohne Nummer einfügen";
    SlotName [ english ] =  "Eintrag ohne Nummer einfügen";
    SlotName[ english_us ] = "Insert Unnumbered Entry";
    SlotName[ portuguese ] = "Inserir entrada sem número";
    SlotName[ russian ] = "Âñòàâèòü ýëåìåíò áåç íîìåðà";
    SlotName[ dutch ] = "Item zonder nummer invoegen";
    SlotName[ french ] = "Insérer une entrée sans numéro";
    SlotName[ spanish ] = "Insertar entrada sin número";
    SlotName[ italian ] = "Inserisci voce senza numero";
    SlotName[ danish ] = "Indsæt element uden nummer";
    SlotName[ swedish ] = "Infoga post utan nummer";
    SlotName[ polish ] = "Wstaw wpis bez numeru";
    SlotName[ portuguese_brazilian ] = "BulletAndNumberWithoutNum";
    SlotName[ japanese ] = "”ԍ†‚È‚µ‚Ì“ü—Í‚ð‘}“ü";
    SlotName[ chinese_simplified ] = "²»´ø±àºÅ²åÈëÌõÄ¿";
    SlotName[ chinese_traditional ] = "¤£±a½s¸¹´¡¤J¶µ¥Ø";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÅÏÎÇá ÛíÑ ãÑÞã";
    SlotName[ dutch ] = "Item zonder nummer invoegen";
    SlotName[ chinese_simplified ] = "²»´ø±àºÅ²åÈëÌõÄ¿";
    SlotName[ greek ] = "ÅéóáãùãÞ êáôá÷þñéóçò ÷ùñßò áñßèìçóç";
    SlotName[ korean ] = "¹øÈ£ ¾ø´Â Ç׸ñ »ðÀÔ";
    SlotName[ turkish ] = "Numarasýz giriþ ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NUM_BULLET_OFF
{
    SlotName = "Nummerierung aus";
    SlotName [ english ] =  "Numerierung aus";
    SlotName[ english_us ] = "Numbering Off";
    SlotName[ portuguese ] = "Desactivar numeração";
    SlotName[ russian ] = "Âûêëþ÷èòü íóìåðàöèþ";
    SlotName[ dutch ] = "Nummering uit";
    SlotName[ french ] = "Désactiver puces ou numérotation";
    SlotName[ spanish ] = "Desactivar numeración";
    SlotName[ italian ] = "Numerazione off";
    SlotName[ danish ] = "Deaktiver nummerering";
    SlotName[ swedish ] = "Numrering av";
    SlotName[ polish ] = "Wy³¹cz numeracjê";
    SlotName[ portuguese_brazilian ] = "BulletsAndNumberOff";
    SlotName[ japanese ] = "”ԍ†•t‚¯ µÌ";
    SlotName[ chinese_simplified ] = "ÒþÈë±àºÅ";
    SlotName[ chinese_traditional ] = "Áô¤J½s¸¹";
    SlotName[ arabic ] = "ÊÑÞíã ÅíÞÇÝ";
    SlotName[ dutch ] = "Nummering uit";
    SlotName[ chinese_simplified ] = "ÒþÈë±àºÅ";
    SlotName[ greek ] = "Áðåíåñãïðïßçóç áñßèìçóçò";
    SlotName[ korean ] = "¹øÈ£ ¸Å±â±â ÁßÁö";
    SlotName[ turkish ] = "Numaralama kapalý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NUM_BULLET_OUTLINE_DOWN
{
    SlotName = "Mit Unterpunkten runter";
    SlotName [ english ] =  "Mit Unterpunkten runter";
    SlotName[ english_us ] = "Move Down with Subpoints";
    SlotName[ portuguese ] = "Baixar um nível (subníveis incluídos)";
    SlotName[ russian ] = "Ïåðåìåñòèòü ñ ïîäïóíêòàìè âíèç";
    SlotName[ dutch ] = "Met subniveaus naar beneden";
    SlotName[ french ] = "Abaisser d'un niveau (sous-points inclus)";
    SlotName[ spanish ] = "Bajar un nivel con subniveles";
    SlotName[ italian ] = "Riduci livello con sottopunti";
    SlotName[ danish ] = "Nedad med underpunkter";
    SlotName[ swedish ] = "Nedåt med undernivåer";
    SlotName[ polish ] = "Przenieœ w dó³ z podpunktami";
    SlotName[ portuguese_brazilian ] = "BulletsAndNumberDownSublevels";
    SlotName[ japanese ] = "ÚÍÞىº‚°";
    SlotName[ chinese_simplified ] = "Á¬Í¬·Ö¼¶ÏòÏÂ";
    SlotName[ chinese_traditional ] = "³s¦P¤À¯Å¦V¤U";
    SlotName[ arabic ] = "Åáì ÃÓÝá ÈÇáäÞÇØ ÇáÝÑÚíÉ";
    SlotName[ dutch ] = "Met subniveaus naar beneden";
    SlotName[ chinese_simplified ] = "Á¬Í¬·Ö¼¶ÏòÏÂ";
    SlotName[ greek ] = "Ìåôáêßíçóç êÜôù ìáæß ìå ôá õðïóçìåßá";
    SlotName[ korean ] = "¾Æ·¡Á¡À» °¡Áö°í ¹ØÀ¸·Î À̵¿";
    SlotName[ turkish ] = "Alt noktalarý ile aþaðý taþý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NUM_BULLET_OUTLINE_MOVEDOWN
{
    SlotName = "Mit Unterpunkten nach unten schieben";
    SlotName [ english ] =  "Mit Unterpunkten nach unten schieben";
    SlotName[ english_us ] = "Move Down with Subpoints";
    SlotName[ portuguese ] = "Mover para baixo com subníveis";
    SlotName[ russian ] = "Ïåðåìåñòèòü ñ ïîäïóíêòàìè âíèç";
    SlotName[ dutch ] = "Met subniveaus naar beneden verplaatsen";
    SlotName[ french ] = "Déplacer vers le bas (sous-points inclus)";
    SlotName[ spanish ] = "Desplazar hacia abajo con subniveles";
    SlotName[ italian ] = "Sposta in basso con sottopunti";
    SlotName[ danish ] = "Flyt nedad med underpunkter";
    SlotName[ swedish ] = "Flytta nedåt med undernivåer";
    SlotName[ polish ] = "Przenieœ w dó³ z podpunktami";
    SlotName[ portuguese_brazilian ] = "BulletsAndNumberContentOneDownSubItems";
    SlotName[ japanese ] = "ÚÍÞىº‚°";
    SlotName[ chinese_simplified ] = "Á¬Í¬·Ö¼¶ÏòÏÂÒÆ¶¯";
    SlotName[ chinese_traditional ] = "³s¦P¤ÀÂI¦V¤U²¾°Ê";
    SlotName[ arabic ] = "ÅÒÇÍÉ Åáì ÃÓÝá ÈÇáäÞÇØ ÇáÝÑÚíÉ";
    SlotName[ dutch ] = "Met subniveaus naar beneden verplaatsen";
    SlotName[ chinese_simplified ] = "Á¬Í¬·Ö¼¶ÏòÏÂÒÆ¶¯";
    SlotName[ greek ] = "Ìåôáêßíçóç êÜôù ìáæß ìå ôá õðïóçìåßá";
    SlotName[ korean ] = "¾Æ·¡Á¡À» °¡Áö°í ¹ØÀ¸·Î À̵¿";
    SlotName[ turkish ] = "Alt noktalarý ile aþaðý taþý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NUM_BULLET_OUTLINE_MOVEUP
{
    SlotName = "Mit Unterpunkten nach oben schieben";
    SlotName [ english ] =  "Mit Unterpunkten nach oben schieben";
    SlotName[ english_us ] = "Move Up with Subpoints";
    SlotName[ portuguese ] = "Mover para cima com subníveis";
    SlotName[ russian ] = "Ïåðåìåñòèòü ñ ïîäïóíêòàìè ââåðõ";
    SlotName[ dutch ] = "Met subniveaus naar boven verplaatsen";
    SlotName[ french ] = "Déplacer vers le haut (sous-points inclus)";
    SlotName[ spanish ] = "Desplazar hacia arriba con subniveles";
    SlotName[ italian ] = "Sposta con sottopunti verso il basso";
    SlotName[ danish ] = "Flyt opad med underpunkter";
    SlotName[ swedish ] = "Flytta uppåt med undernivåer";
    SlotName[ polish ] = "Przenieœ w górê z podpunktami";
    SlotName[ portuguese_brazilian ] = "BulletsAndNumberContentOneUpSubItems";
    SlotName[ japanese ] = "ÚÍÞىº‚°";
    SlotName[ chinese_simplified ] = "Á¬Í¬·Ö¼¶ÏòÉÏÒÆ¶¯";
    SlotName[ chinese_traditional ] = "³s¦P¤À¯Å¦V¤W²¾°Ê";
    SlotName[ arabic ] = "ÅÒÇÍÉ Åáì ÃÚáì ÈÇáäÞÇØ ÇáÝÑÚíÉ";
    SlotName[ dutch ] = "Met subniveaus naar boven verplaatsen";
    SlotName[ chinese_simplified ] = "Á¬Í¬·Ö¼¶ÏòÉÏÒÆ¶¯";
    SlotName[ greek ] = "Ìåôáêßíçóç Üíù ìáæß ìå ôá õðïóçìåßá";
    SlotName[ korean ] = "¾Æ·¡Á¡À» °¡Áö°í À§·Î À̵¿";
    SlotName[ turkish ] = "Alt noktalarý ile yukarýya taþý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NUM_BULLET_OUTLINE_UP
{
    SlotName = "Mit Unterpunkten hoch";
    SlotName [ english ] =  "Mit Unterpunkten hoch";
    SlotName[ english_us ] = "Move Up with Subpoints";
    SlotName[ portuguese ] = "Subir um nível (subpontos incluídos)";
    SlotName[ russian ] = "Ïåðåìåñòèòü ñ ïîäïóíêòàìè ââåðõ";
    SlotName[ dutch ] = "Met subniveaus naar boven";
    SlotName[ french ] = "Hausser d'un niveau (sous-points inclus)";
    SlotName[ spanish ] = "Subir un nivel con subniveles";
    SlotName[ italian ] = "In alto con sottopunti";
    SlotName[ danish ] = "Opad med underpunkter";
    SlotName[ swedish ] = "Uppåt med undernivåer";
    SlotName[ polish ] = "Przenieœ w górê z podpunktami";
    SlotName[ portuguese_brazilian ] = "BulletsAndNumberUpSubLevels";
    SlotName[ japanese ] = "ÚÍÞُグ";
    SlotName[ chinese_simplified ] = "Á¬Í¬·Ö¼¶ÏòÉÏ";
    SlotName[ chinese_traditional ] = "³s¦P¤À¯Å¦V¤W";
    SlotName[ arabic ] = "Åáì ÃÚáì ÈÇáäÞÇØ ÇáÝÑÚíÉ";
    SlotName[ dutch ] = "Met subniveaus naar boven";
    SlotName[ chinese_simplified ] = "Á¬Í¬·Ö¼¶ÏòÉÏ";
    SlotName[ greek ] = "Ìåôáêßíçóç Üíù ìáæß ìå ôá õðïóçìåßá";
    SlotName[ korean ] = "¾Æ·¡Á¡À» °¡Áö°í À§·Î À̵¿";
    SlotName[ turkish ] = "Alt noktalarý ile yukarýya taþý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NUM_BULLET_PREV
{
    SlotName = "Zum vorherigen Absatz gleicher Ebene";
    SlotName [ english ] =  "Zum vorherigen Absatz gleicher Ebene";
    SlotName[ english_us ] = "To Previous Paragraph in Level";
    SlotName[ portuguese ] = "Parágrafo anterior do mesmo nível";
    SlotName[ russian ] = "Äî ïðåäûäóùåãî àáçàöà òîãî æå óðîâíÿ";
    SlotName[ dutch ] = "Naar de vorige alinea op hetzelfde niveau";
    SlotName[ french ] = "Au paragraphe du même niveau";
    SlotName[ spanish ] = "Al párrafo anterior del mismo nivel";
    SlotName[ italian ] = "Al paragrafo precedente stesso livello";
    SlotName[ danish ] = "Til forrige afsnit samme niveau";
    SlotName[ swedish ] = "Till föregående stycke i samma nivå";
    SlotName[ polish ] = "Do poprzedniego akapitu na tym samym poziomie ";
    SlotName[ portuguese_brazilian ] = "BulletsAndNumberPrevNumberParagraph";
    SlotName[ japanese ] = "‘O‚Ì“¯ÚÍÞق̒i—Ž‚Ö";
    SlotName[ chinese_simplified ] = "תµ½Í¬¼¶µÄÉÏÒ»¸ö¶ÎÂä";
    SlotName[ chinese_traditional ] = "Âà¨ì¦P¯Åªº¤W¤@­Ó¬q¸¨";
    SlotName[ arabic ] = "Åáì ÇáÝÞÑÉ ÇáÓÇÈÞÉ Ýí äÝÓ ÇáãÓÊæì";
    SlotName[ dutch ] = "Naar de vorige alinea op hetzelfde niveau";
    SlotName[ chinese_simplified ] = "תµ½Í¬¼¶µÄÉÏÒ»¸ö¶ÎÂä";
    SlotName[ greek ] = "Ðñïçãïýìåíç ðáñÜãñáöïò ôïõ ßäéïõ åðéðÝäïõ";
    SlotName[ korean ] = "°°Àº ·¹º§ÀÇ ÀÌÀü ´Ü¶ôÀ¸·Î";
    SlotName[ turkish ] = "Ayný düzeyde bulunan önceki paragraf";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NUM_BULLET_UP
{
    SlotName = "Eine Ebene hoch";
    SlotName [ english ] =  "Eine Ebene hoch";
    SlotName[ english_us ] = "Up One Level";
    SlotName[ portuguese ] = "Subir um nível";
    SlotName[ russian ] = "Íà îäèí óðîâåíü ââåðõ";
    SlotName[ dutch ] = "Een niveau naar boven";
    SlotName[ french ] = "Hausser d'un niveau";
    SlotName[ spanish ] = "Subir un nivel";
    SlotName[ italian ] = "Un livello più in alto";
    SlotName[ danish ] = "Et niveau op";
    SlotName[ swedish ] = "En nivå uppåt";
    SlotName[ polish ] = "Do góry jeden poziom";
    SlotName[ portuguese_brazilian ] = "BuletsAndNumberLevelUp";
    SlotName[ japanese ] = "1ÚÍÞÙ ã‚Ö";
    SlotName[ chinese_simplified ] = "ÏòÉÏÒ»¼¶";
    SlotName[ chinese_traditional ] = "¦V¤W¤@¯Å";
    SlotName[ arabic ] = "ãÓÊæì æÇÍÏ áÃÚáì";
    SlotName[ dutch ] = "Een niveau naar boven";
    SlotName[ chinese_simplified ] = "ÏòÉÏÒ»¼¶";
    SlotName[ greek ] = "¸íá åðßðåäï øçëüôåñá";
    SlotName[ korean ] = "ÇÑ ·¹º§ À§·Î";
    SlotName[ turkish ] = "Bir düzey yukarý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NUM_FORMAT_TABLE_DLG
{
    SlotName = "Zahlenformat bearbeiten";
    SlotName [ english ] =  "Zahlenformat bearbeiten";
    SlotName[ english_us ] = "Edit Number Format";
    SlotName[ portuguese ] = "Formato de números";
    SlotName[ russian ] = "Ïðàâêà ÷èñëîâîãî ôîðìàòà";
    SlotName[ dutch ] = "Getalnotatie bewerken";
    SlotName[ french ] = "Modifier le format numérique";
    SlotName[ spanish ] = "Editar formato de números";
    SlotName[ italian ] = "Modifica formato numero";
    SlotName[ danish ] = "Rediger talformat";
    SlotName[ swedish ] = "Redigera talformat";
    SlotName[ polish ] = "Edytuj format liczb";
    SlotName[ portuguese_brazilian ] = "TableNumberFormatDialog";
    SlotName[ japanese ] = "”Žš‚̏‘Ž®•ҏW";
    SlotName[ chinese_simplified ] = "±à¼­Êý×Ö¸ñʽ";
    SlotName[ chinese_traditional ] = "½s¿è¼Æ¦r®æ¦¡";
    SlotName[ arabic ] = "ÊÍÑíÑ ÊäÓíÞ ÇáÃÑÞÇã";
    SlotName[ dutch ] = "Getalnotatie bewerken";
    SlotName[ chinese_simplified ] = "±à¼­Êý×Ö¸ñʽ";
    SlotName[ greek ] = "Åðåîåñãáóßá ìïñöÞò áñéèìþí";
    SlotName[ korean ] = "¼ö ¼­½Ä ÆíÁý";
    SlotName[ turkish ] = "Sayý formatýný düzenle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NUM_OR_NONUM
{
    SlotName = "Nummerierung ein/aus";
    SlotName [ english ] =  "Numerierung ein/aus";
    SlotName[ english_us ] = "Numbering On/Off";
    SlotName[ portuguese ] = "Activar/des. numeração";
    SlotName[ russian ] = "Âêë./âûêë. íóìåðàöèþ";
    SlotName[ dutch ] = "Nummering aan/uit";
    SlotName[ french ] = "(Dés)activer numérotation/puces";
    SlotName[ spanish ] = "Activar/Desact. Numeración";
    SlotName[ italian ] = "Numerazione on/off";
    SlotName[ danish ] = "Nummerering til/fra";
    SlotName[ swedish ] = "Numrering på/av";
    SlotName[ polish ] = "W³¹cz/Wy³¹cz numeracjê";
    SlotName[ portuguese_brazilian ] = "NumberOn/Off";
    SlotName[ japanese ] = "”ԍ†•t‚¯ µÝ/µÌ";
    SlotName[ chinese_simplified ] = "ÏÔʾ/ÒþÈë±àºÅ";
    SlotName[ chinese_traditional ] = "Åã¥Ü/Áô¤J½s¸¹";
    SlotName[ arabic ] = "ÅÙåÇÑ/ÅÎÝÇÁ ÇáÊÑÞíã";
    SlotName[ dutch ] = "Nummering aan/uit";
    SlotName[ chinese_simplified ] = "ÏÔʾ/ÒþÈë±àºÅ";
    SlotName[ greek ] = "Áñßèìçóç Íáé/¼÷é";
    SlotName[ korean ] = "¹øÈ£ ¸Å±â±â ÀÛµ¿/ÁßÁö";
    SlotName[ turkish ] = "Numaralama açýk/kapalý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NUMBER_BULLETS
{
    SlotName = "Nummerierung bearbeiten";
    SlotName [ english ] =  "Numerierung bearbeiten";
    SlotName[ english_us ] = "Edit Numbering";
    SlotName[ portuguese ] = "Editar numeração";
    SlotName[ russian ] = "Ïðàâêà íóìåðàöèè";
    SlotName[ dutch ] = "Nummering bewerken";
    SlotName[ french ] = "Éditer la numérotation";
    SlotName[ spanish ] = "Editar numeración";
    SlotName[ italian ] = "Modifica numerazione";
    SlotName[ danish ] = "Rediger nummerering";
    SlotName[ swedish ] = "Redigera numrering";
    SlotName[ polish ] = "Edytuj numeracjê";
    SlotName[ portuguese_brazilian ] = "ToolsBulletsAndNumbering";
    SlotName[ japanese ] = "”ԍ†•t‚¯‚̕ҏW";
    SlotName[ chinese_simplified ] = "±à¼­±àºÅ";
    SlotName[ chinese_traditional ] = "½s¿è½s¸¹";
    SlotName[ arabic ] = "ÊÍÑíÑ ÇáÊÑÞíã";
    SlotName[ dutch ] = "Nummering bewerken";
    SlotName[ chinese_simplified ] = "±à¼­±àºÅ";
    SlotName[ greek ] = "Åðåîåñãáóßá áñßèìçóçò";
    SlotName[ korean ] = "¹øÈ£ ¸Å±â±â ÆíÁý";
    SlotName[ turkish ] = "Numaralamayý düzenle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NUMBER_CURRENCY
{
    SlotName = "Zahlenformat: Währung";
    SlotName [ english ] =  "Zahlenformat: Währung";
    SlotName[ english_us ] = "Number Format: Currency";
    SlotName[ portuguese ] = "Formato numérico: moeda";
    SlotName[ russian ] = "×èñëîâîé ôîðìàò: âàëþòà";
    SlotName[ dutch ] = "Getalnotatie: valuta";
    SlotName[ french ] = "Format numérique : monnaie";
    SlotName[ spanish ] = "Formato numérico: Moneda";
    SlotName[ italian ] = "Formato numero: valuta";
    SlotName[ danish ] = "Talformat: valuta";
    SlotName[ swedish ] = "Talformat: valuta";
    SlotName[ polish ] = "Format liczb: Waluta";
    SlotName[ portuguese_brazilian ] = "NumberFormatCurrency";
    SlotName[ japanese ] = "”‚̏‘Ž® : ’ʉÝ";
    SlotName[ chinese_simplified ] = "Êý×Ö¸ñʽ£º»õ±Ò";
    SlotName[ chinese_traditional ] = "¼Æ¦r®æ¦¡¡G³f¹ô";
    SlotName[ arabic ] = "ÊäÓíÞ ÇáÃÑÞÇã: ÚãáÉ";
    SlotName[ dutch ] = "Getalnotatie: valuta";
    SlotName[ chinese_simplified ] = "Êý×Ö¸ñʽ£º»õ±Ò";
    SlotName[ greek ] = "ÌïñöÞ áñéèìïý: ÍïìéóìáôéêÞ";
    SlotName[ korean ] = "¼ö ¼­½Ä: ÅëÈ­";
    SlotName[ turkish ] = "Sayý formatý: Para birimi";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NUMBER_DATE
{
    SlotName = "Zahlenformat: Datum";
    SlotName [ english ] =  "Zahlenformat: Datum";
    SlotName[ english_us ] = "Number Format : Date";
    SlotName[ portuguese ] = "Formato numérico : data";
    SlotName[ russian ] = "×èñëîâîé ôîðìàò : äàòà";
    SlotName[ dutch ] = "Getalnotatie : datum";
    SlotName[ french ] = "Format numérique : date";
    SlotName[ spanish ] = "Formato numérico : Fecha";
    SlotName[ italian ] = "Formato numero : data";
    SlotName[ danish ] = "Talformat: dato";
    SlotName[ swedish ] = "Talformat: datum";
    SlotName[ polish ] = "Format liczb: Data";
    SlotName[ portuguese_brazilian ] = "NumberFormatDate";
    SlotName[ japanese ] = "”‚̏‘Ž® : “ú•t";
    SlotName[ chinese_simplified ] = "Êý×Ö¸ñʽ£ºÈÕÆÚ";
    SlotName[ chinese_traditional ] = "¼Æ¦r®æ¦¡¡G¤é´Á";
    SlotName[ arabic ] = "ÊäÓíÞ ÇáÃÑÞÇã: ÊÇÑíÎ";
    SlotName[ dutch ] = "Getalnotatie : datum";
    SlotName[ chinese_simplified ] = "Êý×Ö¸ñʽ£ºÈÕÆÚ";
    SlotName[ greek ] = "ÌïñöÞ áñéèìïý: Çìåñïìçíßá";
    SlotName[ korean ] = "¼ö ¼­½Ä : ³¯Â¥";
    SlotName[ turkish ] = "Sayý formatý: Tarih";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NUMBER_NEWSTART
{
    SlotName = "Nummerierung neu beginnen";
    SlotName [ english ] =  "Numerierung neu beginnen";
    SlotName[ english_us ] = "Restart Numbering";
    SlotName[ portuguese ] = "Recomeçar numeração";
    SlotName[ russian ] = "Íà÷àòü íóìåðàöèþ çàíîâî";
    SlotName[ dutch ] = "Nieuwe nummering";
    SlotName[ french ] = "Reprendre la numérotation";
    SlotName[ spanish ] = "Reiniciar numeración";
    SlotName[ italian ] = "Ricomincia numerazione";
    SlotName[ danish ] = "Start nummerering forfra";
    SlotName[ swedish ] = "Starta numrering på nytt";
    SlotName[ polish ] = "Zacznij na nowo numeracjê";
    SlotName[ portuguese_brazilian ] = "NumberingStart";
    SlotName[ japanese ] = "”ԍ†•t‚¯‚ðV‚µ‚­ŠJŽn";
    SlotName[ chinese_simplified ] = "ÖØÐ¿ªÊ¼±àºÅ";
    SlotName[ chinese_traditional ] = "­«·s½s¸¹";
    SlotName[ arabic ] = "ÅÚÇÏÉ ÈÏÁ ÇáÊÑÞíã";
    SlotName[ dutch ] = "Nieuwe nummering";
    SlotName[ chinese_simplified ] = "ÖØÐ¿ªÊ¼±àºÅ";
    SlotName[ greek ] = "Åðáíåêêßíçóç áñßèìçóçò";
    SlotName[ korean ] = "¹øÈ£ ´Ù½Ã ¸Å±â±â";
    SlotName[ turkish ] = "Numaralamayý yeniden baþlat";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NUMBER_PERCENT
{
    SlotName = "Zahlenformat: Prozent";
    SlotName [ english ] =  "Zahlenformat: Prozent";
    SlotName[ english_us ] = "Number Format: Percent";
    SlotName[ portuguese ] = "Formato numérico: percentagem";
    SlotName[ russian ] = "×èñëîâîé ôîðìàò : ïðîöåíòû";
    SlotName[ dutch ] = "Getalnotatie: procent";
    SlotName[ french ] = "Format numérique : pourcentage";
    SlotName[ spanish ] = "Formato numérico: Porciento";
    SlotName[ italian ] = "Formato numero: percentuale";
    SlotName[ danish ] = "Talformat: procent";
    SlotName[ swedish ] = "Talformat: procent";
    SlotName[ polish ] = "Format liczb: Procent";
    SlotName[ portuguese_brazilian ] = "NumberFormatPercent";
    SlotName[ japanese ] = "”‚̏‘Ž® : Êß°¾ÝÄ";
    SlotName[ chinese_simplified ] = "Êý×Ö¸ñʽ£º°Ù·Ö±È";
    SlotName[ chinese_traditional ] = "¼Æ¦r®æ¦¡¡G¦Ê¤À¤ñ";
    SlotName[ arabic ] = "ÊäÓíÞ ÇáÃÑÞÇã: Ýí ÇáãÆÉ";
    SlotName[ dutch ] = "Getalnotatie: procent";
    SlotName[ chinese_simplified ] = "Êý×Ö¸ñʽ£º°Ù·Ö±È";
    SlotName[ greek ] = "ÌïñöÞ áñéèìïý: Ðïóïóôü";
    SlotName[ korean ] = "¼ýÀÚ ¼­½Ä: ¹éºÐÀ²";
    SlotName[ turkish ] = "Sayý formatý: Yüzde";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NUMBER_SCIENTIFIC
{
    SlotName = "Zahlenformat: Exponentiell";
    SlotName [ english ] =  "Zahlenformat: Exponential";
    SlotName[ english_us ] = "Number Format: Exponential";
    SlotName[ portuguese ] = "Formato numérico: expoente";
    SlotName[ russian ] = "×èñëîâîé ôîðìàò: ýêñïîíåíöèàëüíûé";
    SlotName[ dutch ] = "Getalnotatie: exponentieel";
    SlotName[ french ] = "Format numérique : exponentiel";
    SlotName[ spanish ] = "Formato numérico: Exponencial";
    SlotName[ italian ] = "Formato numero: esponenziale";
    SlotName[ danish ] = "Talformat: eksponentiel";
    SlotName[ swedish ] = "Talformat: Exponentiellt";
    SlotName[ polish ] = "Format liczb : Wyk³adniczy";
    SlotName[ portuguese_brazilian ] = "NumberFormatExponential";
    SlotName[ japanese ] = "”‚̏‘Ž®: Žw”";
    SlotName[ chinese_simplified ] = "Êý×Ö¸ñʽ£ºÖ¸Êý";
    SlotName[ chinese_traditional ] = "¼Æ¦r®æ¦¡¡G«ü¼Æ";
    SlotName[ arabic ] = "ÊäÓíÞ ÃÑÞÇã: ÃÓí";
    SlotName[ dutch ] = "Getalnotatie: exponentieel";
    SlotName[ chinese_simplified ] = "Êý×Ö¸ñʽ£ºÖ¸Êý";
    SlotName[ greek ] = "ÌïñöÞ áñéèìïý: ÅêèåôéêÞ";
    SlotName[ korean ] = "¼ýÀÚ ¼­½Ä: Áö¼ö";
    SlotName[ turkish ] = "Sayý formatý: Üstel";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NUMBER_STANDARD
{
    SlotName = "Zahlenformat: Standard";
    SlotName [ english ] =  "Zahlenformat: Standard";
    SlotName[ language_user1 ] = " ";
    SlotName[ english_us ] = "Number Format: Standard";
    SlotName[ portuguese ] = "Formato numérico: padrão";
    SlotName[ russian ] = "×èñëîâîé ôîðìàò : ñòàíäàðò";
    SlotName[ dutch ] = "Getalnotatie: standaard";
    SlotName[ french ] = "Format numérique : standard";
    SlotName[ spanish ] = "Formato numérico: Estándar";
    SlotName[ italian ] = "Formato numero: standard";
    SlotName[ danish ] = "Talformat: standard";
    SlotName[ swedish ] = "Talformat: standard";
    SlotName[ polish ] = "Format liczb: Domyœlny";
    SlotName[ portuguese_brazilian ] = "NumberFormatStandard";
    SlotName[ japanese ] = "”‚̏‘Ž® : •W€";
    SlotName[ chinese_simplified ] = "Êý×Ö¸ñʽ£º±ê×¼";
    SlotName[ chinese_traditional ] = "¼Æ¦r®æ¦¡¡G¼Ð·Ç";
    SlotName[ arabic ] = "ÊäÓíÞ ÇáÃÑÞÇã: ÞíÇÓí";
    SlotName[ dutch ] = "Getalnotatie: standaard";
    SlotName[ chinese_simplified ] = "Êý×Ö¸ñʽ£º±ê×¼";
    SlotName[ greek ] = "ÌïñöÞ áñéèìïý: ÃåíéêÞ";
    SlotName[ korean ] = "¼ö ¼­½Ä: Ç¥ÁØ";
    SlotName[ turkish ] = "Sayý formatý: Standart";
};
SfxSlotInfo FN_NUMBER_TIME
{
    SlotName = "Zahlenformat: Zeit";
    SlotName [ english ] =  "Zahlenformat: Zeit";
    SlotName[ english_us ] = "Number Format: Time";
    SlotName[ portuguese ] = "Formato numérico: hora";
    SlotName[ russian ] = "×èñëîâîé ôîðìàò : âðåìÿ";
    SlotName[ dutch ] = "Getalnotatie: tijd";
    SlotName[ french ] = "Format numérique : horaire";
    SlotName[ spanish ] = "Formato numérico: Hora";
    SlotName[ italian ] = "Formato numero: orario";
    SlotName[ danish ] = "Talformat: klokkeslæt";
    SlotName[ swedish ] = "Talformat: tid";
    SlotName[ polish ] = "Format liczb: Czas";
    SlotName[ portuguese_brazilian ] = "NumberFormatTime";
    SlotName[ japanese ] = "”‚̏‘Ž® : Žž";
    SlotName[ chinese_simplified ] = "Êý×Ö¸ñʽ£ºÊ±¼ä";
    SlotName[ chinese_traditional ] = "¼Æ¦r®æ¦¡¡G®É¶¡";
    SlotName[ arabic ] = "ÊäÓíÞ ÇáÃÑÞÇã: æÞÊ";
    SlotName[ dutch ] = "Getalnotatie: tijd";
    SlotName[ chinese_simplified ] = "Êý×Ö¸ñʽ£ºÊ±¼ä";
    SlotName[ greek ] = "ÌïñöÞ áñéèìïý: ¿ñá";
    SlotName[ korean ] = "¼ö ¼­½Ä: ½Ã°£";
    SlotName[ turkish ] = "Sayý formatý: Saat";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_NUMBER_TWODEC
{
    SlotName = "Zahlenformat: Dezimal";
    SlotName [ english ] =  "Zahlenformat: Dezimal";
    SlotName[ english_us ] = "Number Format: Decimal";
    SlotName[ portuguese ] = "Formato numérico: decimal";
    SlotName[ russian ] = "×èñëîâîé ôîðìàò : äðîáü";
    SlotName[ dutch ] = "Getalnotatie: decimaal";
    SlotName[ french ] = "Format numérique : décimal";
    SlotName[ spanish ] = "Formato numérico: Decimal";
    SlotName[ italian ] = "Formato numero: decimale";
    SlotName[ danish ] = "Talformat: decimal";
    SlotName[ swedish ] = "Talformat: decimal";
    SlotName[ polish ] = "Format liczb: Dziesiêtny";
    SlotName[ portuguese_brazilian ] = "NumberFormatDecimal";
    SlotName[ japanese ] = "”‚̏‘Ž® : ¬”";
    SlotName[ chinese_simplified ] = "Êý×Ö¸ñʽ£ºÊ®½øÖÆ";
    SlotName[ chinese_traditional ] = "¼Æ¦r®æ¦¡¡G¤Q¶i¨î";
    SlotName[ arabic ] = "ÊäÓíÞ ÇáÃÑÞÇã: ÚÏÏ ÚÔÑí";
    SlotName[ dutch ] = "Getalnotatie: decimaal";
    SlotName[ chinese_simplified ] = "Êý×Ö¸ñʽ£ºÊ®½øÖÆ";
    SlotName[ language_user1 ] = " ";
    SlotName[ greek ] = "ÌïñöÞ áñéèìïý: ÄåêáäéêÞ";
    SlotName[ korean ] = "¼ö ¼­½Ä: ¼Ò¼ö";
    SlotName[ turkish ] = "Sayý formatý: Ondalýk";
};
SfxSlotInfo FN_NUMBERING_OUTLINE_DLG
{
    SlotName = "Kapitelnummerierung";
    SlotName [ english ] =  "Kapitelnummerierung";
    SlotName[ english_us ] = "Outline Numbering";
    SlotName[ portuguese ] = "Numeração de capítulos";
    SlotName[ russian ] = "Íóìåðàöèÿ ãëàâ";
    SlotName[ dutch ] = "Hoofdstuknummering";
    SlotName[ french ] = "Numérotation de chapitres";
    SlotName[ spanish ] = "Numeración de capítulos";
    SlotName[ italian ] = "Numerazione capitolo";
    SlotName[ danish ] = "Kapitelnummerering";
    SlotName[ swedish ] = "Kapitelnumrering";
    SlotName[ polish ] = "Numeracja rozdzia³u";
    SlotName[ portuguese_brazilian ] = "ToolsChapterNumbering";
    SlotName[ japanese ] = "Í‚̔ԍ†•t‚¯";
    SlotName[ chinese_simplified ] = "Õ±àºÅ";
    SlotName[ chinese_traditional ] = "³¹½s¸¹";
    SlotName[ arabic ] = "ÊÑÞíã ÇáÝÕæá";
    SlotName[ dutch ] = "Hoofdstuknummering";
    SlotName[ chinese_simplified ] = "Õ±àºÅ";
    SlotName[ greek ] = "Áñßèìçóç êåöáëáßùí";
    SlotName[ korean ] = "Àå ¹øÈ£¸Å±â±â";
    SlotName[ turkish ] = "Bölüm numaralamasý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_OPTIMIZE_TABLE
{
    SlotName = "Optimieren";
    SlotName [ english ] =  "Optimieren";
    SlotName[ english_us ] = "Optimize";
    SlotName[ portuguese ] = "Optimizar";
    SlotName[ russian ] = "Îïòèìèçèðîâàòü";
    SlotName[ dutch ] = "Optimeren";
    SlotName[ french ] = "Optimiser";
    SlotName[ spanish ] = "Optimar";
    SlotName[ italian ] = "Ottimizza";
    SlotName[ danish ] = "Optimer";
    SlotName[ swedish ] = "Optimera";
    SlotName[ polish ] = "Optymalizuj";
    SlotName[ portuguese_brazilian ] = "Optimize";
    SlotName[ japanese ] = "Å“K‰»‚·‚é";
    SlotName[ chinese_simplified ] = "×î¼Ñ»¯";
    SlotName[ chinese_traditional ] = "³ÌÓì¤Æ";
    SlotName[ arabic ] = "ÇáÔßá ÇáÃãËá";
    SlotName[ dutch ] = "Optimeren";
    SlotName[ chinese_simplified ] = "×î¼Ñ»¯";
    SlotName[ greek ] = "Âåëôéóôïðïßçóç";
    SlotName[ korean ] = "ÃÖÀûÈ­";
    SlotName[ turkish ] = "Optimum";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_OUTLINE_TO_CLIPBOARD
{
    SlotName = "Gliederung zum Clipboard";
    SlotName [ english ] =  "Gliederung zum Clipboard";
    SlotName[ english_us ] = "Outline to Clipboard";
    SlotName[ portuguese ] = "Esquema para  Área de Transferência";
    SlotName[ russian ] = "Ñòðóêòóðà áóôåðà îáìåíà";
    SlotName[ dutch ] = "Overzicht naar clipboard";
    SlotName[ french ] = "Plan vers le presse-papiers";
    SlotName[ spanish ] = "Esquema al portapapeles";
    SlotName[ italian ] = "Struttura negli appunti";
    SlotName[ danish ] = "Disposition til udklipsbakke";
    SlotName[ swedish ] = "Disposition till urklippet";
    SlotName[ polish ] = "Konspekt do kosza";
    SlotName[ portuguese_brazilian ] = "SendOutlineToClipboard";
    SlotName[ japanese ] = "¸Ø¯ÌßÎÞ°Äނ̱³ÄײÝ";
    SlotName[ chinese_simplified ] = "´ó¸ÙËÍÖÁ¼ôÌù°å";
    SlotName[ chinese_traditional ] = "¤jºõ°eµ¹°Å¶Kï";
    SlotName[ arabic ] = "ÇáÊÞÓíã Åáì ÇáÍÇÝÙÉ";
    SlotName[ dutch ] = "Overzicht naar clipboard";
    SlotName[ chinese_simplified ] = "´ó¸ÙËÍÖÁ¼ôÌù°å";
    SlotName[ greek ] = "ÄéÜñèñùóç ðñïò ôï Clipboard";
    SlotName[ korean ] = "Ŭ¸³º¸µå °³¿ä";
    SlotName[ turkish ] = "Anahatlarý panoya gönder";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_OUTLINE_TO_IMPRESS
{
    SlotName = "Gliederung an Präsentation";
    SlotName [ english ] =  "Gliederung an Präsentation";
    SlotName[ english_us ] = "Outline to Presentation";
    SlotName[ portuguese ] = "Esquema para apresentação";
    SlotName[ russian ] = "Ñòðóêòóðó â ïðåçåíòàöèþ";
    SlotName[ dutch ] = "Overzicht bij presentatie";
    SlotName[ french ] = "Plan vers présentation";
    SlotName[ spanish ] = "Esquema para presentación";
    SlotName[ italian ] = "Struttura da presentazione";
    SlotName[ danish ] = "Disposition til præsentation";
    SlotName[ swedish ] = "Disposition till presentation";
    SlotName[ polish ] = "Konspekt do prezentacji";
    SlotName[ portuguese_brazilian ] = "SendOutlineToStarOffice Impress";
    SlotName[ japanese ] = "ÌßÚ¾ÞÝð¼®Ý‚̱³ÄײÝ";
    SlotName[ chinese_simplified ] = "´ó¸ÙË͵½ÑÝʾÎĸå";
    SlotName[ chinese_traditional ] = "¤jºõ°e¨ì²³ø";
    SlotName[ arabic ] = "ÇáÊÞÓíã Åáì ÚÑÖ ÊÞÏíãí";
    SlotName[ dutch ] = "Overzicht bij presentatie";
    SlotName[ chinese_simplified ] = "´ó¸ÙË͵½ÑÝʾÎĸå";
    SlotName[ greek ] = "ÄéÜñèñùóç ðñïò ðáñïõóßáóç";
    SlotName[ korean ] = "ÇÁ¸®Á¨Å×ÀÌ¼Ç °³¿ä";
    SlotName[ turkish ] = "Anahatlarý sunuya aktar";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_PAGE_STYLE_SET_COLS
{
    SlotName = "Seitenvorlage: Spalten";
    SlotName [ english ] =  "Seitenvorlage: Spalten";
    SlotName[ english_us ] = "Page Style: Columns";
    SlotName[ portuguese ] = "Estilo de página: colunas";
    SlotName[ russian ] = "Ñòèëü ñòðàíèöû: êîëîíêè";
    SlotName[ dutch ] = "Pagina-opmaakprofiel: kolommen";
    SlotName[ french ] = "Style de page : colonnes";
    SlotName[ spanish ] = "Estilo de página: Columnas";
    SlotName[ italian ] = "Modello di pagina: colonne";
    SlotName[ danish ] = "Sidetypografi: kolonner";
    SlotName[ swedish ] = "Sidformatmall: Kolumner";
    SlotName[ polish ] = "Styl strony: Kolumny";
    SlotName[ portuguese_brazilian ] = "SetPageStyleCols";
    SlotName[ japanese ] = "Íß°¼Þ½À²Ù:—ñ";
    SlotName[ chinese_simplified ] = "Ò³ÃæÑùʽ£ºÁÐ";
    SlotName[ chinese_traditional ] = "­¶­±¼Ë¦¡¡G¦C";
    SlotName[ arabic ] = "ÞÇáÈ ÕÝÍÉ: ÃÚãÏÉ";
    SlotName[ dutch ] = "Pagina-opmaakprofiel: kolommen";
    SlotName[ chinese_simplified ] = "Ò³ÃæÑùʽ£ºÁÐ";
    SlotName[ greek ] = "Ðñüôõðï óåëßäáò: ÓôÞëåò";
    SlotName[ korean ] = "ÆäÀÌÁö À¯Çü: ¿­";
    SlotName[ turkish ] = "Sayfa biçimi: Sütunlar";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_PAGEDOWN
{
    SlotName = "Nächste Seite";
    SlotName [ english ] =  "Nächste Seite";
    SlotName[ english_us ] = "Next Page";
    SlotName[ portuguese ] = "Página seguinte";
    SlotName[ russian ] = "Ñäåäóþùàÿ ñòðàíèöà";
    SlotName[ dutch ] = "Volgende pagina";
    SlotName[ french ] = "Page suivante";
    SlotName[ spanish ] = "Página siguiente";
    SlotName[ italian ] = "Pagina successiva";
    SlotName[ danish ] = "Næste side";
    SlotName[ swedish ] = "Nästa sida";
    SlotName[ polish ] = "Nastêpna strona";
    SlotName[ portuguese_brazilian ] = "PageDown";
    SlotName[ japanese ] = "ŽŸ‚ÌÍß°¼Þ";
    SlotName[ chinese_simplified ] = "ÏÂÒ»Ò³";
    SlotName[ chinese_traditional ] = "¤U¤@­¶";
    SlotName[ arabic ] = "ÇáÕÝÍÉ ÇáÊÇáíÉ";
    SlotName[ dutch ] = "Volgende pagina";
    SlotName[ chinese_simplified ] = "ÏÂÒ»Ò³";
    SlotName[ greek ] = "Åðüìåíç óåëßäá";
    SlotName[ korean ] = "´ÙÀ½ ÆäÀÌÁö";
    SlotName[ turkish ] = "Sonraki sayfa";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_PAGEDOWN_SEL
{
    SlotName = "Bis nächste Seite selektieren";
    SlotName [ english ] =  "Bis nächste Seite selektieren";
    SlotName[ english_us ] = "Select to Next Page";
    SlotName[ portuguese ] = "Seleccionar até página seguinte";
    SlotName[ russian ] = "Âûäåëèòü äî ñëåäóþùåé ñòðàíèöû";
    SlotName[ dutch ] = "Tot aan volgende pagina selecteren";
    SlotName[ french ] = "Sélect. jusqu'à la page suivante";
    SlotName[ spanish ] = "Seleccionar hasta la página siguiente";
    SlotName[ italian ] = "Seleziona fino alla pagina successiva";
    SlotName[ danish ] = "Marker til næste side";
    SlotName[ swedish ] = "Markera till nästa sida";
    SlotName[ polish ] = "Zaznacz do nastêpnej strony";
    SlotName[ portuguese_brazilian ] = "PageDownSel";
    SlotName[ japanese ] = "ŽŸ‚ÌÍß°¼Þ‚܂őI‘ð";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁÏÂÒ»Ò³";
    SlotName[ chinese_traditional ] = "¿ï¨ú¦Ü¤U­¶";
    SlotName[ arabic ] = "ÊÍÏíÏ ÍÊì ÇáÕÝÍÉ ÇáÊÇáíÉ";
    SlotName[ dutch ] = "Tot aan volgende pagina selecteren";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁÏÂÒ»Ò³";
    SlotName[ greek ] = "ÅðéëïãÞ Ýùò ôçí åðüìåíç óåëßäá";
    SlotName[ korean ] = "´ÙÀ½ ÆäÀÌÁö ¼±ÅÃ";
    SlotName[ turkish ] = "Sonraki sayfaya kadar seç";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_PAGEUP
{
    SlotName = "Vorherige Seite";
    SlotName [ english ] =  "Vorherige Seite";
    SlotName[ english_us ] = "Previous Page";
    SlotName[ portuguese ] = "Página anterior";
    SlotName[ russian ] = "Ïðåäûäóùàÿ ñòðàíèöà";
    SlotName[ dutch ] = "Vorige pagina";
    SlotName[ french ] = "Page précédente";
    SlotName[ spanish ] = "Página anterior";
    SlotName[ italian ] = "Pagina precedente";
    SlotName[ danish ] = "Forrige side";
    SlotName[ swedish ] = "Föregående sida";
    SlotName[ polish ] = "Poprzednia strona";
    SlotName[ portuguese_brazilian ] = "PageUp";
    SlotName[ japanese ] = "‘O‚ÌÍß°¼Þ";
    SlotName[ chinese_simplified ] = "ÉÏÒ»Ò³";
    SlotName[ chinese_traditional ] = "¤W¤@­¶";
    SlotName[ arabic ] = "ÇáÕÝÍÉ ÇáÓÇÈÞÉ";
    SlotName[ dutch ] = "Vorige pagina";
    SlotName[ chinese_simplified ] = "ÉÏÒ»Ò³";
    SlotName[ greek ] = "Ðñïçãïýìåíç óåëßäá";
    SlotName[ korean ] = "ÀÌÀü ÆäÀÌÁö";
    SlotName[ turkish ] = "Önceki sayfa";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_PAGEUP_SEL
{
    SlotName = "Bis vorherige Seite selektieren";
    SlotName [ english ] =  "Bis vorherige Seite selektieren";
    SlotName[ english_us ] = "Select to Previous Page";
    SlotName[ portuguese ] = "Seleccionar até página anterior";
    SlotName[ russian ] = "Âûäåëèòü äî ïðåäûäóùåé ñòðàíèöû";
    SlotName[ dutch ] = "Tot aan vorige pagina selecteren";
    SlotName[ french ] = "Sélect. jusqu'à la page précédente";
    SlotName[ spanish ] = "Seleccionar hasta la página anterior";
    SlotName[ italian ] = "Seleziona fino alla pagina precedente";
    SlotName[ danish ] = "Marker til forrige side";
    SlotName[ swedish ] = "Markera till föregående sida";
    SlotName[ polish ] = "Zaznacz do poprzedniej strony";
    SlotName[ portuguese_brazilian ] = "PageUpSel";
    SlotName[ japanese ] = "‘O‚ÌÍß°¼Þ‚܂őI‘ð";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁÉÏÒ»Ò³";
    SlotName[ chinese_traditional ] = "¿ï¨ú¦Ü¤W¤@­¶";
    SlotName[ arabic ] = "ÊÍÏíÏ ÍÊì ÇáÕÝÍÉ ÇáÓÇÈÞÉ";
    SlotName[ dutch ] = "Tot aan vorige pagina selecteren";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁÉÏÒ»Ò³";
    SlotName[ greek ] = "ÅðéëïãÞ Ýùò ôçí ðñïçãïýìåíç óåëßäá";
    SlotName[ korean ] = "ÀÌÀü ÆäÀÌÁö ¼±ÅÃ";
    SlotName[ turkish ] = "Önceki sayfaya kadar seç";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_PASTESPECIAL
{
    SlotName = "Inhalte einfügen";
    SlotName [ english ] =  "Inhalte einfügen";
    SlotName[ english_us ] = "Paste Special";
    SlotName[ portuguese ] = "Colar conteúdos";
    SlotName[ russian ] = "Ñïåöèàëüíàÿ âñòàâêà";
    SlotName[ dutch ] = "Plakken speciaal";
    SlotName[ french ] = "Collage spécial";
    SlotName[ spanish ] = "Pegado especial";
    SlotName[ italian ] = "Incolla speciale";
    SlotName[ danish ] = "Indsæt indhold";
    SlotName[ swedish ] = "Klistra in innehåll";
    SlotName[ polish ] = "Wklej zawartoϾ";
    SlotName[ portuguese_brazilian ] = "PasteContents";
    SlotName[ japanese ] = "Œ`Ž®‚ð‘I‘ð‚µ‚Ä“\\‚è•t‚¯";
    SlotName[ chinese_simplified ] = "²åÈëÄÚÈÝ";
    SlotName[ chinese_traditional ] = "´¡¤J¤º®e";
    SlotName[ arabic ] = "áÕÞ ÎÇÕ";
    SlotName[ dutch ] = "Plakken speciaal";
    SlotName[ chinese_simplified ] = "²åÈëÄÚÈÝ";
    SlotName[ greek ] = "ÅéäéêÞ åðéêüëëçóç";
    SlotName[ korean ] = "¼±ÅÃÇÏ¿© ºÙ¿©³Ö±â";
    SlotName[ turkish ] = "Özel yapýþtýr";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_POSTIT
{
    SlotName = "Notiz einfügen";
    SlotName [ english ] =  "Notiz einfügen";
    SlotName[ english_us ] = "Insert Note";
    SlotName[ portuguese ] = "Inserir anotação";
    SlotName[ russian ] = "Âñòàâèòü ïðèìå÷àíèå";
    SlotName[ dutch ] = "Aantekening invoegen";
    SlotName[ french ] = "Insérer une note";
    SlotName[ spanish ] = "Insertar nota";
    SlotName[ italian ] = "Inserisci nota";
    SlotName[ danish ] = "Indsæt note";
    SlotName[ swedish ] = "Infoga anteckning";
    SlotName[ polish ] = "Wstaw notatkê";
    SlotName[ portuguese_brazilian ] = "InsertNote";
    SlotName[ japanese ] = "Òӂ̑}“ü";
    SlotName[ chinese_simplified ] = "²åÈ뱸ע";
    SlotName[ chinese_traditional ] = "´¡¤J³Æª`";
    SlotName[ arabic ] = "ÅÏÑÇÌ ãáÇÍÙÉ";
    SlotName[ dutch ] = "Aantekening invoegen";
    SlotName[ chinese_simplified ] = "²åÈ뱸ע";
    SlotName[ greek ] = "ÅéóáãùãÞ óçìåßùóçò";
    SlotName[ korean ] = "¸Þ¸ð »ðÀÔ";
    SlotName[ turkish ] = "Not ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_PREV_BOOKMARK
{
    SlotName = "Zur vorherigen Textmarke";
    SlotName [ english ] =  "Zur vorherigen Textmarke";
    SlotName[ english_us ] = "To Previous Bookmark";
    SlotName[ portuguese ] = "Ir para marcador de texto anterior";
    SlotName[ russian ] = "Äî ïðåäûäóùåé çàêëàäêè";
    SlotName[ dutch ] = "Naar vorige tekstmarkering";
    SlotName[ french ] = "Aller au repère de texte précédent";
    SlotName[ spanish ] = "Ir al marcador anterior";
    SlotName[ italian ] = "Al segnalibro precedente";
    SlotName[ danish ] = "Til forrige tekstmarkering";
    SlotName[ swedish ] = "Till föregående textmarkering";
    SlotName[ polish ] = "Do poprzedniej zak³adki";
    SlotName[ portuguese_brazilian ] = "GoToPrevBookmark";
    SlotName[ japanese ] = "‘O‚Ì÷½Äϰ¸‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÉÏÒ»¸öÊéÇ©";
    SlotName[ chinese_traditional ] = "Âà¨ì¤W¤@­Ó®ÑÅÒ";
    SlotName[ arabic ] = "Åáì ÇáÅÔÇÑÉ ÇáãÑÌÚíÉ ÇáÓÇÈÞÉ";
    SlotName[ dutch ] = "Naar vorige tekstmarkering";
    SlotName[ chinese_simplified ] = "תµ½ÉÏÒ»¸öÊéÇ©";
    SlotName[ greek ] = "Ðñïò ôïí ðñïçãïýìåíï óåëéäïäåßêôç";
    SlotName[ korean ] = "ÀÌÀü Ã¥ °¥ÇÇ·Î";
    SlotName[ turkish ] = "Önceki metin belirteci";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_PREV_FOOTNOTE
{
    SlotName = "Zur vorherigen Fußnote";
    SlotName [ english ] =  "Zur vorherigen Fußnote";
    SlotName[ english_us ] = "To Previous Footnote";
    SlotName[ portuguese ] = "Ir para nota de rodapé anterior";
    SlotName[ russian ] = "Äî ïðåäûäóùåé ñíîñêè";
    SlotName[ dutch ] = "Naar vorige voetnoot";
    SlotName[ french ] = "À la note de bas de page précédente";
    SlotName[ spanish ] = "Ir a la nota al pie anterior";
    SlotName[ italian ] = "Alla nota a piè pagina precedente";
    SlotName[ danish ] = "Til forrige fodnote";
    SlotName[ swedish ] = "Till föregående fotnot";
    SlotName[ polish ] = "Do poprzedniego przypisu dolnego";
    SlotName[ portuguese_brazilian ] = "GoToPrevFootnote";
    SlotName[ japanese ] = "‘O‚Ì‹r’‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÉÏÒ»¸ö×¢½Å";
    SlotName[ chinese_traditional ] = "Âà¨ì¤W¤@µù¸}";
    SlotName[ arabic ] = "Åáì ÇáÍÇÔíÉ ÇáÓÝáíÉ ÇáÓÇÈÞÉ";
    SlotName[ dutch ] = "Naar vorige voetnoot";
    SlotName[ chinese_simplified ] = "תµ½ÉÏÒ»¸ö×¢½Å";
    SlotName[ greek ] = "Ðñïò ôçí ðñïçãïýìåíç õðïóçìåßùóç";
    SlotName[ korean ] = "ÀÌÀü °¢ÁÖ·Î";
    SlotName[ turkish ] = "Önceki dipnot";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_PREV_PARA
{
    SlotName = "Zum vorherigen Absatz";
    SlotName [ english ] =  "Zum vorherigen Absatz";
    SlotName[ english_us ] = "To Previous Paragraph";
    SlotName[ portuguese ] = "Ir para parágrafo anterior";
    SlotName[ russian ] = "Äî ïðåäûäóùåãî àáçàöà";
    SlotName[ dutch ] = "Naar vorige alinea";
    SlotName[ french ] = "Aller au paragraphe précédent";
    SlotName[ spanish ] = "Ir al párrafo anterior";
    SlotName[ italian ] = "Al paragrafo precedente";
    SlotName[ danish ] = "Til forrige afsnit";
    SlotName[ swedish ] = "Till föregående stycke";
    SlotName[ polish ] = "Do porzedniego akapitu";
    SlotName[ portuguese_brazilian ] = "GoToPrevPara";
    SlotName[ japanese ] = "‘O‚Ì’i—Ž‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÉÏÒ»¸ö¶ÎÂä";
    SlotName[ chinese_traditional ] = "Âà¨ì¤W¤@­Ó¬q¸¨";
    SlotName[ arabic ] = "Åáì ÇáÝÞÑÉ ÇáÓÇÈÞÉ";
    SlotName[ dutch ] = "Naar vorige alinea";
    SlotName[ chinese_simplified ] = "תµ½ÉÏÒ»¸ö¶ÎÂä";
    SlotName[ greek ] = "Ðñïò ôçí ðñïçãïýìåíç ðáñÜãñáöï";
    SlotName[ korean ] = "ÀÌÀü ´Ü¶ôÀ¸·Î";
    SlotName[ turkish ] = "Önceki paragraf";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_PREV_SENT
{
    SlotName = "Zum vorherigen Satz";
    SlotName [ english ] =  "Zum vorherigen Satz";
    SlotName[ english_us ] = "To Previous Sentence";
    SlotName[ portuguese ] = "Ir para frase anterior";
    SlotName[ russian ] = "Ê ïðåäûäóùåìó ïðåäëîæåíèþ";
    SlotName[ dutch ] = "Naar vorige zin";
    SlotName[ french ] = "Aller à la phrase précédente";
    SlotName[ spanish ] = "Ir a frase anterior";
    SlotName[ italian ] = "Alla frase precedente";
    SlotName[ danish ] = "Til forrige sætning";
    SlotName[ swedish ] = "Till föregående mening";
    SlotName[ polish ] = "Do poprzedniego zdania";
    SlotName[ portuguese_brazilian ] = "GoToPrevSentence";
    SlotName[ japanese ] = "‘O‚Ì•¶Í‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÉÏÒ»¸ö¾ä×Ó";
    SlotName[ chinese_traditional ] = "Âà¨ì¤W¤@¥y¤l";
    SlotName[ arabic ] = "ÍÊì ÇáÌãáÉ ÇáÓÇÈÞÉ";
    SlotName[ dutch ] = "Naar vorige zin";
    SlotName[ chinese_simplified ] = "תµ½ÉÏÒ»¸ö¾ä×Ó";
    SlotName[ greek ] = "Ðñïò ôçí ðñïçãïýìåíç ðñüôáóç";
    SlotName[ korean ] = "ÀÌÀü ¹®ÀåÀ¸·Î";
    SlotName[ turkish ] = "Önceki cümle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_PREV_SENT_SEL
{
    SlotName = "Bis zum vorherigen Satz selektieren";
    SlotName [ english ] =  "Bis zum vorherigen Satz selektieren";
    SlotName[ english_us ] = "Select to Previous Sentence";
    SlotName[ portuguese ] = "Seleccionar até frase anterior";
    SlotName[ russian ] = "Âûäåëèòü äî ïðåäûäóùåãî ïðåäëîæåíèÿ";
    SlotName[ dutch ] = "Tot aan vorige zin selecteren";
    SlotName[ french ] = "Sélect. jusqu'à la phrase précédente";
    SlotName[ spanish ] = "Seleccionar hasta la oración anterior";
    SlotName[ italian ] = "Seleziona fino alla frase precedente";
    SlotName[ danish ] = "Marker til forrige sætning";
    SlotName[ swedish ] = "Markera till föregående mening";
    SlotName[ polish ] = "Zaznacz do poprzedniego zdania";
    SlotName[ portuguese_brazilian ] = "GoToPrevSentenceSel";
    SlotName[ japanese ] = "‘O‚Ì•¶Í‚܂őI‘ð";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁÉÏÒ»¸ö¾ä×Ó";
    SlotName[ chinese_traditional ] = "¿ï¨ú¦Ü¤W¤@­Ó¥y¤l";
    SlotName[ arabic ] = "ÊÍÏíÏ ÍÊì ÇáÌãáÉ ÇáÓÇÈÞÉ";
    SlotName[ dutch ] = "Tot aan vorige zin selecteren";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁÉÏÒ»¸ö¾ä×Ó";
    SlotName[ greek ] = "ÅðéëïãÞ Ýùò ôçí ðñïçãïýìåíç ðñüôáóç";
    SlotName[ korean ] = "ÀÌÀü ¹®Àå ¼±ÅÃ";
    SlotName[ turkish ] = "Önceki cümleye kadar seç";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_PREV_TABLE
{
    SlotName = "Zur vorherigen Tabelle";
    SlotName [ english ] =  "Zur vorherigen Tabelle";
    SlotName[ english_us ] = "To Previous Table";
    SlotName[ portuguese ] = "Tabela anterior";
    SlotName[ russian ] = "Ê ïðåäûäóùåé òàáëèöå";
    SlotName[ dutch ] = "Naar vorige tabel";
    SlotName[ french ] = "Au tableau précédent";
    SlotName[ spanish ] = "Ir a la tabla anterior";
    SlotName[ italian ] = "Alla tabella precedente";
    SlotName[ danish ] = "Til forrige tabel";
    SlotName[ swedish ] = "Till föregående tabell";
    SlotName[ polish ] = "Do poprzedniej tabeli";
    SlotName[ portuguese_brazilian ] = "JumpToPrevTable";
    SlotName[ japanese ] = "‘O‚Ì•\\‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÉÏÒ»¸ö±í¸ñ";
    SlotName[ chinese_traditional ] = "Âà¨ì¤W¤@ªí®æ";
    SlotName[ arabic ] = "Åáì ÇáÌÏæá ÇáÓÇÈÞ";
    SlotName[ dutch ] = "Naar vorige tabel";
    SlotName[ chinese_simplified ] = "תµ½ÉÏÒ»¸ö±í¸ñ";
    SlotName[ greek ] = "Ðñïò ôïí ðñïçãïýìåíï ðßíáêá";
    SlotName[ korean ] = "ÀÌÀü Ç¥·Î";
    SlotName[ turkish ] = "Önceki tablo";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_PREV_TBLFML
{
    SlotName = "Zur vorherigen Tabellenformel";
    SlotName [ english ] =  "Zur vorherigen Tabellenformel";
    SlotName[ english_us ] = "Go to previous table formula";
    SlotName[ portuguese ] = "Fórmula de cálculo anterior";
    SlotName[ russian ] = "Ïåðåéòè ê ïðåäûäóùåé ôîðìóëå òàáëèöû";
    SlotName[ dutch ] = "Naar vorige tabelformule";
    SlotName[ french ] = "Aller à la formule de calcul précédente";
    SlotName[ spanish ] = "Ir a la fórmula anterior";
    SlotName[ italian ] = "Alla formula di tabella precedente";
    SlotName[ danish ] = "Til forrige tabelformel";
    SlotName[ swedish ] = "Till föregående tabellformel";
    SlotName[ polish ] = "PrzejdŸ do nastêpnej formu³y tabeli";
    SlotName[ portuguese_brazilian ] = "GotoPrevTableFormula";
    SlotName[ japanese ] = "‘O‚̐”Ž®‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÉÏÒ»¸ö¹¤×÷±í¹«Ê½";
    SlotName[ chinese_traditional ] = "Âà¨ì¤W¤@­Ó¤u§@ªí¤½¦¡";
    SlotName[ arabic ] = "Åáì ÕíÛÉ ÇáÌÏæá ÇáÓÇÈÞÉ";
    SlotName[ dutch ] = "Naar vorige tabelformule";
    SlotName[ chinese_simplified ] = "תµ½ÉÏÒ»¸ö¹¤×÷±í¹«Ê½";
    SlotName[ greek ] = "Ðñïò ôïí ðñïçãïýìåíï ôýðï ôïõ ðßíáêá";
    SlotName[ korean ] = "ÀÌÀü Ç¥ ¼ö½ÄÀ¸·Î À̵¿";
    SlotName[ turkish ] = "Önceki tablo formulü";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_PREV_TBLFML_ERR
{
    SlotName = "Zur vorherigen fehlerhaften Tabellenformel";
    SlotName [ english ] =  "Zur vorherigen fehlerhaften Tabellenformel";
    SlotName[ english_us ] = "Go to previous faulty table formula";
    SlotName[ portuguese ] = "Fórmula de cálculo anterior com defeito";
    SlotName[ russian ] = "Ïåðåéòè ê ïðåäûäóùåé ôîðìóëå òàáëèöû, ñîäåðæàùåé îøèáêè";
    SlotName[ dutch ] = "Naar vorige foutieve tabelformule";
    SlotName[ french ] = "Aller à la formule de calcul erronée précédente";
    SlotName[ spanish ] = "Ir a fórmula errónea anterior";
    SlotName[ italian ] = "Alla formula di tabella errata precedente";
    SlotName[ danish ] = "Til forrige fejlagtige tabelformel";
    SlotName[ swedish ] = "Till föregående felaktiga tabellformel";
    SlotName[ polish ] = "PrzejdŸ do poprzedniej b³êdnej formu³y tabeli";
    SlotName[ portuguese_brazilian ] = "GotoPrevWrongTableFormula";
    SlotName[ japanese ] = "‘O‚ÌŠÔˆá‚Á‚½”Ž®‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÉÏÒ»¸öÓдíÎóµÄ¹¤×÷±í¹«Ê½";
    SlotName[ chinese_traditional ] = "Âà¨ì¤W¤@­Ó¦³¿ù»~ªº¤u§@ªí¤½¦¡";
    SlotName[ arabic ] = "Åáì ÕíÛÉ ÇáÌÏæá ÇáÎÇØÆÉ ÇáÓÇÈÞÉ";
    SlotName[ dutch ] = "Naar vorige foutieve tabelformule";
    SlotName[ chinese_simplified ] = "תµ½ÉÏÒ»¸öÓдíÎóµÄ¹¤×÷±í¹«Ê½";
    SlotName[ greek ] = "Ðñïò ôïí ðñïçãïýìåíï ëáíèáóìÝíï ôýðï ôïõ ðßíáêá";
    SlotName[ korean ] = "Ʋ¸° ÀÌÀü Ç¥ °ø½ÄÀ¸·Î À̵¿";
    SlotName[ turkish ] = "Önceki hatalý tablo formulü";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_PREV_TOXMARK
{
    SlotName = "Zur vorherigen Indexmarkierung";
    SlotName [ english ] =  "Zur vorherigen Indexmarkierung";
    SlotName[ english_us ] = "Go to Previous Index Mark";
    SlotName[ portuguese ] = "Marca anterior do índice";
    SlotName[ russian ] = "Ïåðåéòè ê ïðåäûäóùåé ìåòêå óêàçàòåëÿ";
    SlotName[ dutch ] = "Naar vorige indexmarkering";
    SlotName[ french ] = "Aller à la marque d'index précédente";
    SlotName[ spanish ] = "Ir a la marca de índice anterior";
    SlotName[ italian ] = "Al contrassegno indice precedente";
    SlotName[ danish ] = "Til forrige indeksmarkering";
    SlotName[ swedish ] = "Till föregående indexmarkering";
    SlotName[ polish ] = "PrzejdŸ do poprzedniego znacznika indeksu";
    SlotName[ portuguese_brazilian ] = "GotoPrevIndexMark";
    SlotName[ japanese ] = "‘O‚̲ÝÃÞ¯¸½Ï°¸‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÉÏÒ»¸öË÷Òý±ê¼Ç";
    SlotName[ chinese_traditional ] = "Âà¨ì¤W¤@­Ó¯Á¤Þ¼Ð°O";
    SlotName[ arabic ] = "Åáì ÇáÊÍÏíÏ ÇáÝåÑÓí ÇáÓÇÈÞ";
    SlotName[ dutch ] = "Naar vorige indexmarkering";
    SlotName[ chinese_simplified ] = "תµ½ÉÏÒ»¸öË÷Òý±ê¼Ç";
    SlotName[ greek ] = "Ðñïò ôï ðñïçãïýìåíï óçìÜäé åõñåôçñßïõ";
    SlotName[ korean ] = "ÀÌÀü »öÀΠǥ½Ã·Î °¡±â";
    SlotName[ turkish ] = "Önceki dizin belirteci";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_PREV_WORD
{
    SlotName = "Zum Wort links";
    SlotName [ english ] =  "Zum Wort links";
    SlotName[ english_us ] = "To Word Left";
    SlotName[ portuguese ] = "Ir para palavra à esquerda";
    SlotName[ russian ] = "Äî ñëîâà ñëåâà";
    SlotName[ dutch ] = "Naar woord links";
    SlotName[ french ] = "Au mot à gauche";
    SlotName[ spanish ] = "Ir a la palabra izquierda";
    SlotName[ italian ] = "Alla parola sinistra";
    SlotName[ danish ] = "Til ord til venstre";
    SlotName[ swedish ] = "Till vänster ord";
    SlotName[ polish ] = "Do s³owa po lewej stronie";
    SlotName[ portuguese_brazilian ] = "GoToPrevWord";
    SlotName[ japanese ] = "’PŒê‚̍¶‚Ö";
    SlotName[ chinese_simplified ] = "תµ½×ÖµÄ×ó·½";
    SlotName[ chinese_traditional ] = "Âà¨ì¦r­º";
    SlotName[ arabic ] = "ÍÊì íÓÇÑ ÇáßáãÉ";
    SlotName[ dutch ] = "Naar woord links";
    SlotName[ chinese_simplified ] = "תµ½×ÖµÄ×ó·½";
    SlotName[ greek ] = "ËÝîç áñéóôåñÜ";
    SlotName[ korean ] = "´Ü¾î ¿ÞÂÊÀ¸·Î";
    SlotName[ turkish ] = "Soldaki sözcük";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_PREV_WORD_SEL
{
    SlotName = "Bis Wort links selektieren";
    SlotName [ english ] =  "Bis Wort links selektieren";
    SlotName[ english_us ] = "Select to Begin of Word";
    SlotName[ portuguese ] = "Seleccionar até ao início da palavra";
    SlotName[ russian ] = "Âûäåëèòü äî ñëîâà ñëåâà";
    SlotName[ dutch ] = "Tot aan woord links selecteren";
    SlotName[ french ] = "Sélect. mot à gauche";
    SlotName[ spanish ] = "Seleccionar hasta el comienzo de la palabra";
    SlotName[ italian ] = "Seleziona fino alla parola di sinistra";
    SlotName[ danish ] = "Marker til ord til venstre";
    SlotName[ swedish ] = "Markera till vänster ord";
    SlotName[ polish ] = "Zaznacz do s³owa po lewej";
    SlotName[ portuguese_brazilian ] = "WordLeftSel";
    SlotName[ japanese ] = "’PŒê‚̍¶‚܂őI‘ð";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁ×ÖµÄ×ó·½";
    SlotName[ chinese_traditional ] = "¿ï¨ú¦Ü¦r­º";
    SlotName[ arabic ] = "ÊÍÏíÏ ÍÊì ÇáßáãÉ ÇáÓÇÈÞÉ";
    SlotName[ dutch ] = "Tot aan woord links selecteren";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁ×ÖµÄ×ó·½";
    SlotName[ language_user1 ] = " ";
    SlotName[ greek ] = "ÅðéëïãÞ Ýùò ôçí ëÝîç áñéóôåñÜ";
    SlotName[ korean ] = "´Ü¾îÀÇ ½ÃÀÛ¿¡ ¼±ÅÃ";
    SlotName[ turkish ] = "Soldaki sözcüðe kadar seç";
};
SfxSlotInfo FN_PREVIEW_PRINT_OPTIONS
{
    SlotName = "Druckoptionen Seitenansicht";
    SlotName [ english ] =  "Druckoptionen Seitenansicht";
    SlotName[ english_us ] = "Print options page view";
    SlotName[ portuguese ] = "Opções de impressão";
    SlotName[ russian ] = "Ïàðàìåòðû ïå÷àòè";
    SlotName[ dutch ] = "Printopties afdrukvoorbeeld";
    SlotName[ french ] = "Options d'impression : aperçu";
    SlotName[ spanish ] = "Opciones de impresión";
    SlotName[ italian ] = "Opzioni di stampa";
    SlotName[ danish ] = "Udskriftsindstillinger vis udskrift";
    SlotName[ swedish ] = "Utskriftsalternativ förhandsgranskning";
    SlotName[ polish ] = "Opcje drukowania Widok strony";
    SlotName[ portuguese_brazilian ] = "Printing options";
    SlotName[ japanese ] = "ÌßÚËÞ­°ˆóüµÌß¼®Ý";
    SlotName[ chinese_simplified ] = "´òÓ¡Ñ¡Ïî Ò³ÃæÊÓͼ";
    SlotName[ chinese_traditional ] = "¦C¦L¿ï¶µ ­¶­±À˵ø";
    SlotName[ arabic ] = "ÎíÇÑÇÊ ÇáØÈÇÚÉ: ãÚÇíäÉ ÇáÕÝÍÇÊ";
    SlotName[ language_user1 ] = " ";
    SlotName[ dutch ] = "Printopties afdrukvoorbeeld";
    SlotName[ chinese_simplified ] = "´òÓ¡Ñ¡Ïî Ò³ÃæÊÓͼ";
    SlotName[ greek ] = "ÅðéëïãÝò åêôýðùóçò/Ðñïåðéóêüðçóç óåëßäáò";
    SlotName[ korean ] = "Àμ⠿ɼÇ";
    SlotName[ turkish ] = "Sayfa görünümü yazdýrma seçenekleri";
};
SfxSlotInfo FN_PREVIEW_ZOOM
{
    SlotName = "Maßstab Seitenansicht";
    SlotName [ english ] =  "Zoom page view";
    SlotName[ english_us ] = "Preview Zoom";
    SlotName[ portuguese ] = "Ver Zoom";
    SlotName[ russian ] = "Ìàñøòàá";
    SlotName[ greek ] = "Êëßìáêá ðñïâïëÞò óåëßäáò";
    SlotName[ dutch ] = "Zoom afdrukvoorbeeld";
    SlotName[ french ] = "Échelle de l'aperçu";
    SlotName[ spanish ] = "Escala";
    SlotName[ italian ] = "Zoom";
    SlotName[ danish ] = "Målestok sidevisning";
    SlotName[ swedish ] = "Skala sidvy";
    SlotName[ polish ] = "Skala widoku strony";
    SlotName[ portuguese_brazilian ] = "Scale";
    SlotName[ japanese ] = "ÌßÚËÞ­°‚̽ްÑ";
    SlotName[ korean ] = "È®´ë/Ãà¼Ò";
    SlotName[ chinese_simplified ] = "Ò³ÃæÊÓͼ±ÈÀý";
    SlotName[ chinese_traditional ] = "Åã¥Ü¤ñ¨Ò ­¶­±µø¹Ï";
    SlotName[ turkish ] = "Yakýnlaþtýr";
    SlotName[ arabic ] = "ÊßÈíÑ æÊÕÛíÑ ãÚÇíäÉ ÇáÕÝÍÉ";
};
SfxSlotInfo FN_PRINT_LAYOUT
{
    SlotName = "Druck-Layout ein/aus";
    SlotName [ english ] =  "Druck-Layout ein/aus";
    SlotName[ english_us ] = "Print Layout On/Off";
    SlotName[ portuguese ] = "Configuração da impressão";
    SlotName[ russian ] = "Âêë./âûêë. ðàçìåòêó ïå÷àòè";
    SlotName[ dutch ] = "Afdruklay-out aan/uit";
    SlotName[ french ] = "Mode Mise en page d'impression";
    SlotName[ spanish ] = "Diseño de Impresión";
    SlotName[ italian ] = "Stampa layout on/off";
    SlotName[ danish ] = "Udskriftslayout til/fra";
    SlotName[ swedish ] = "Utskriftslayout på/av";
    SlotName[ polish ] = "W³¹cz/Wy³¹cz uk³ad wydruku";
    SlotName[ portuguese_brazilian ] = "PrintLayout";
    SlotName[ japanese ] = "ˆóüÚ²±³Ä µÝ/µÌ";
    SlotName[ chinese_simplified ] = "ÏÔʾ/ÒþÈë ´òÓ¡°æÊ½";
    SlotName[ chinese_traditional ] = "Åã¥Ü/Áô¤J¦C¦L-ª©¦¡";
    SlotName[ arabic ] = "ÅÙåÇÑ/ÅÎÝÇÁ ÊÎØíØ ÇáØÈÇÚÉ";
    SlotName[ dutch ] = "Afdruklay-out aan/uit";
    SlotName[ chinese_simplified ] = "ÏÔʾ/ÒþÈë ´òÓ¡°æÊ½";
    SlotName[ greek ] = "ÄéÜôáîç åêôýðùóçò Íáé/¼÷é";
    SlotName[ korean ] = "Àμ⠸ð¾ç ÀÛµ¿/ÇØÁ¦";
    SlotName[ turkish ] = "Yazdýrma düzeni açýk/kapalý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_PRINT_PAGEPREVIEW
{
    SlotName = "Seitenansicht drucken";
    SlotName [ english ] =  "Seitenansicht drucken";
    SlotName[ english_us ] = "Print page view";
    SlotName[ portuguese ] = "Imprimir previsualização";
    SlotName[ russian ] = "Ïå÷àòü";
    SlotName[ dutch ] = "Afdrukvoorbeeld drukken";
    SlotName[ french ] = "Imprimer l'aperçu";
    SlotName[ spanish ] = "Imprimir previsualización";
    SlotName[ italian ] = "Stampa anteprima pagina";
    SlotName[ danish ] = "Udskriv vist udskrift";
    SlotName[ swedish ] = "Skriv ut förhandsgranskning";
    SlotName[ polish ] = "Drukuj widok strony";
    SlotName[ portuguese_brazilian ] = "PrintPagePreview";
    SlotName[ japanese ] = "ÌßÚËÞ­°‚̈óü";
    SlotName[ chinese_simplified ] = "´òÓ¡Ò³ÃæÊÓͼ";
    SlotName[ chinese_traditional ] = "¦C¦L­¶­±À˵ø";
    SlotName[ arabic ] = "ÇáØÈÇÚÉ ÍÓÈ ÇáãÚÇíäÉ";
    SlotName[ dutch ] = "Afdrukvoorbeeld drukken";
    SlotName[ chinese_simplified ] = "´òÓ¡Ò³ÃæÊÓͼ";
    SlotName[ greek ] = "Åêôýðùóç ðñïåðéóêüðçóçò óåëßäáò";
    SlotName[ korean ] = "ÀÎ¼â ÆäÀÌÁö º¸±â";
    SlotName[ turkish ] = "Sayfa görünümünü yazdýr";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_QRY
{
    SlotName = "Datenbankmanager aufrufen";
    SlotName [ english ] =  "Datenbankmanager aufrufen";
    SlotName[ english_us ] = "Call Database Manager";
    SlotName[ portuguese ] = "Gestor da Base de Dados";
    SlotName[ russian ] = "Âûçîâ àäìèíèñòðàòîðà áàçû äàííûõ";
    SlotName[ dutch ] = "Databasemanager oproepen";
    SlotName[ french ] = "Gestionnaire de base de données";
    SlotName[ spanish ] = "Activar administrador de bases de datos";
    SlotName[ italian ] = "Richiama gestione database";
    SlotName[ danish ] = "Aktiver databasemanager";
    SlotName[ swedish ] = "Anropa databas";
    SlotName[ polish ] = "Wywo³aj mened¿era bazy danych";
    SlotName[ portuguese_brazilian ] = "InsertDatabase";
    SlotName[ japanese ] = "ÃÞ°ÀÍÞ°½ÏȰ¼Þ¬‚ÌŽÀs";
    SlotName[ chinese_simplified ] = "Æô¶¯Êý¾Ý¿â¹ÜÀí³ÌÐò";
    SlotName[ chinese_traditional ] = "±Ò°Ê¸ê®Æ®wºÞ²zµ{¦¡";
    SlotName[ arabic ] = "ãÏíÑ ÞÇÚÏÉ ÇáÈíÇäÇÊ";
    SlotName[ dutch ] = "Databasemanager oproepen";
    SlotName[ chinese_simplified ] = "Æô¶¯Êý¾Ý¿â¹ÜÀí³ÌÐò";
    SlotName[ greek ] = "Åíåñãïðïßçóç äéá÷åéñéóôÞ âÜóçò äåäïìÝíùí";
    SlotName[ korean ] = "µ¥ÀÌÅͺ£À̽º °ü¸®ÀÚ È£Ãâ";
    SlotName[ turkish ] = "Veritabaný yöneticisini çalýþtýr";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_QRY_MERGE
{
    SlotName = "Seriendruck vorbereiten";
    SlotName [ english ] =  "Seriendruck vorbereiten";
    SlotName[ english_us ] = "Prepare Mail Merge";
    SlotName[ portuguese ] = "Preparar impressão em série";
    SlotName[ russian ] = "Ïîäãîòîâêà ê ñëèÿíèþ";
    SlotName[ dutch ] = "Afdruk standaardbrief voorbereiden";
    SlotName[ french ] = "Préparer Impression en série";
    SlotName[ spanish ] = "Preparar impresión en serie";
    SlotName[ italian ] = "Prepara stampa in serie";
    SlotName[ danish ] = "Forbered brevfletning";
    SlotName[ swedish ] = "Förbered serieutskrift";
    SlotName[ polish ] = "Przygotuj druk korespondencji seryjnej";
    SlotName[ portuguese_brazilian ] = "MergeDialog";
    SlotName[ japanese ] = "·‚µž‚݈óü‚̏€”õ";
    SlotName[ chinese_simplified ] = "×¼±¸ÓʼþºÏ²¢";
    SlotName[ chinese_traditional ] = "·Ç³Æ¦X¨Ö¦C¦L";
    SlotName[ arabic ] = "ÊÌåíÒ ÇáØÈÇÚÉ ÇáãÓáÓáÉ";
    SlotName[ dutch ] = "Afdruk standaardbrief voorbereiden";
    SlotName[ chinese_simplified ] = "×¼±¸ÓʼþºÏ²¢";
    SlotName[ greek ] = "Ðñïåôïéìáóßá ãéá åêôýðùóç ìáæéêÞò áëëçëïãñáößáò";
    SlotName[ korean ] = "ÀüÀÚ¿ìÆí ÅëÇÕ Áغñ";
    SlotName[ turkish ] = "Standart mektup yazdýrmayý hazýrla";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_REDLINE_ACCEPT
{
    SlotName = "Änderungen akzeptieren oder ablehnen";
    SlotName [ english ] =  "Änderungen akzeptieren oder ablehnen";
    SlotName[ english_us ] = "Accept or Reject Changes";
    SlotName[ portuguese ] = "Aceitar ou rejeitar modificações";
    SlotName[ russian ] = "Ïðèíÿòü èëè îòêëîíèòü èñïðàâëåíèÿ";
    SlotName[ dutch ] = "Wijzigingen accepteren of weigeren";
    SlotName[ french ] = "Accepter ou rejeter les modifications";
    SlotName[ spanish ] = "Aceptar modificaciones o rechazarlas";
    SlotName[ italian ] = "Accetta o rifiuta modifiche";
    SlotName[ danish ] = "Accepter eller forkast ændringer";
    SlotName[ swedish ] = "Acceptera eller ignorera ändringar";
    SlotName[ polish ] = "Zaakceptuj albo odrzuæ zmiany";
    SlotName[ portuguese_brazilian ] = "AcceptRedlining";
    SlotName[ japanese ] = "•ύX‰ÓŠ‚ÌŠm”F";
    SlotName[ chinese_simplified ] = "½ÓÊÜ»ò¾Ü¾ø¸ü¸Ä";
    SlotName[ chinese_traditional ] = "±µ¨ü©Î©Úµ´Åܧó";
    SlotName[ arabic ] = "ÞÈæá Ãæ ÑÝÖ ÇáÊÛííÑÇÊ";
    SlotName[ dutch ] = "Wijzigingen accepteren of weigeren";
    SlotName[ chinese_simplified ] = "½ÓÊÜ»ò¾Ü¾ø¸ü¸Ä";
    SlotName[ greek ] = "Áðïäï÷Þ Þ áðüññéøç áëëáãþí";
    SlotName[ korean ] = "º¯°æ ¼ö¶ô ¶Ç´Â °ÅÀý";
    SlotName[ turkish ] = "Deðiþiklikleri kabul ya da reddet";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_REDLINE_COMMENT
{
    SlotName = "Kommentar einfügen";
    SlotName [ english ] =  "Kommentar einfügen";
    SlotName[ english_us ] = "Insert Comment";
    SlotName[ portuguese ] = "Inserir comentário";
    SlotName[ russian ] = "Âñòàâèòü êîììåíòàðèé";
    SlotName[ dutch ] = "Commentaar invoegen";
    SlotName[ french ] = "Insérer un commentaire";
    SlotName[ spanish ] = "Insertar comentario";
    SlotName[ italian ] = "Inserisci commento";
    SlotName[ danish ] = "Indsæt kommentar";
    SlotName[ swedish ] = "Infoga kommentar";
    SlotName[ polish ] = "Wstaw komentarz";
    SlotName[ portuguese_brazilian ] = "CommentRedlining";
    SlotName[ japanese ] = "ºÒÝĂ̑}“ü";
    SlotName[ chinese_simplified ] = "²åÈë×¢½â";
    SlotName[ chinese_traditional ] = "´¡¤Jª`¸Ñ";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÊÚáíÞ";
    SlotName[ dutch ] = "Commentaar invoegen";
    SlotName[ chinese_simplified ] = "²åÈë×¢½â";
    SlotName[ greek ] = "ÅéóáãùãÞ ó÷ïëßïõ";
    SlotName[ korean ] = "¼³¸í »ðÀÔ";
    SlotName[ turkish ] = "Açýklama ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_REDLINE_ON
{
    SlotName = "Überarbeiten einschalten";
    SlotName [ english ] =  "Überarbeiten einschalten";
    SlotName[ english_us ] = "Switch on Review";
    SlotName[ portuguese ] = "Traçar modificações";
    SlotName[ russian ] = "Âêë. èñïðàâëåíèÿ";
    SlotName[ dutch ] = "Opnieuw bewerken inschakelen";
    SlotName[ french ] = "Activer la retouche";
    SlotName[ spanish ] = "Activar modificaciones";
    SlotName[ italian ] = "Attiva modifiche";
    SlotName[ danish ] = "Aktiver modificering";
    SlotName[ swedish ] = "Aktivera revidering";
    SlotName[ polish ] = "W³¹cz modyfikacje";
    SlotName[ portuguese_brazilian ] = "ActivateRedlining";
    SlotName[ japanese ] = "•ύX—š—ð‚Ì‹L˜^";
    SlotName[ chinese_simplified ] = "¼¤»îÐÞ¸Ä";
    SlotName[ chinese_traditional ] = "¿E¬¡­×§ï";
    SlotName[ arabic ] = "ÊÊÈÚ ÇáÊäÞíÍ";
    SlotName[ dutch ] = "Opnieuw bewerken inschakelen";
    SlotName[ chinese_simplified ] = "¼¤»îÐÞ¸Ä";
    SlotName[ greek ] = "Åíåñãïðïßçóç åðáíåîÝôáóçò";
    SlotName[ korean ] = "¼öÁ¤ º¸¿Ï Àû¿ë";
    SlotName[ turkish ] = "Redaksiyonu çalýþtýr";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_REDLINE_SHOW
{
    SlotName = "Überarbeitung anzeigen";
    SlotName [ english ] =  "Überarbeitung anzeigen";
    SlotName[ english_us ] = "Highlight Changes";
    SlotName[ portuguese ] = "Destacar modificações";
    SlotName[ russian ] = "Âûäåëèòü èñïðàâëåíèÿ";
    SlotName[ dutch ] = "Nieuwe bewerking weergeven";
    SlotName[ french ] = "Afficher les retouches";
    SlotName[ spanish ] = "Mostrar modificaciones";
    SlotName[ italian ] = "Mostra revisione";
    SlotName[ danish ] = "Vis ændringer";
    SlotName[ swedish ] = "Visa revidering";
    SlotName[ polish ] = "Poka¿ modyfikacje";
    SlotName[ portuguese_brazilian ] = "ShowRedlining";
    SlotName[ japanese ] = "•ύX‰ÓŠ‚Ì•\\ަ";
    SlotName[ chinese_simplified ] = "ÏÔʾÐÞ¸Ä";
    SlotName[ chinese_traditional ] = "Åã¥Ü­×§ï";
    SlotName[ arabic ] = "ÅÙåÇÑ ÇáÊäÞíÍ";
    SlotName[ dutch ] = "Nieuwe bewerking weergeven";
    SlotName[ chinese_simplified ] = "ÏÔʾÐÞ¸Ä";
    SlotName[ greek ] = "ÅìöÜíéóç áëëáãþí";
    SlotName[ korean ] = "ÇÏÀ̶óÀÌÆ® º¯°æ";
    SlotName[ turkish ] = "Redaksiyonu görüntüle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_REFRESH_VIEW
{
    SlotName = "Ansicht wiederherstellen";
    SlotName [ english ] =  "Ansicht wiederherstellen";
    SlotName[ english_us ] = "Restore View";
    SlotName[ portuguese ] = "Restaurar visualização";
    SlotName[ russian ] = "Âîññòàíîâèòü ïðåäâàðèòåëüíûé ïðîñìîòð";
    SlotName[ dutch ] = "Weergave herstellen";
    SlotName[ french ] = "Restaurer l'affichage";
    SlotName[ spanish ] = "Restablecer visualización";
    SlotName[ italian ] = "Ripristina vista";
    SlotName[ danish ] = "Gendan visning";
    SlotName[ swedish ] = "Återställ vy";
    SlotName[ polish ] = "Przywróæ widok";
    SlotName[ portuguese_brazilian ] = "RestoreView";
    SlotName[ japanese ] = "•\\ަ‚Ì•œŒ³";
    SlotName[ chinese_simplified ] = "»Ö¸´ÊÓͼ";
    SlotName[ chinese_traditional ] = "«ì½ÆÀ˵ø";
    SlotName[ arabic ] = "ÇÓÊÚÇÏÉ ÇáÚÑÖ";
    SlotName[ dutch ] = "Weergave herstellen";
    SlotName[ chinese_simplified ] = "»Ö¸´ÊÓͼ";
    SlotName[ greek ] = "ÅðáíáöïñÜ ðñïâïëÞò";
    SlotName[ korean ] = "º¹±¸ º¸±â";
    SlotName[ turkish ] = "Görünümü geri getir";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_REPAGINATE
{
    SlotName = "Neuformatierung";
    SlotName [ english ] =  "Neuformatierung";
    SlotName[ english_us ] = "Repaginate";
    SlotName[ portuguese ] = "Repaginar";
    SlotName[ russian ] = "Íîâîå ôîðìàòèðîâàíèå";
    SlotName[ dutch ] = "Nieuwe opmaak";
    SlotName[ french ] = "Repaginer";
    SlotName[ spanish ] = "Reformatear";
    SlotName[ italian ] = "Reimpagina";
    SlotName[ danish ] = "Genformatering";
    SlotName[ swedish ] = "Nyformatering";
    SlotName[ polish ] = "Nowe formatowanie";
    SlotName[ portuguese_brazilian ] = "Repaginate";
    SlotName[ japanese ] = "V‹K‘Ž®Ý’è";
    SlotName[ chinese_simplified ] = "ÖØÐÂÖÆ×÷¸ñʽ";
    SlotName[ chinese_traditional ] = "­«·s¨î§@®æ¦¡";
    SlotName[ arabic ] = "ÅÚÇÏÉ ÇáÊäÓíÞ";
    SlotName[ dutch ] = "Nieuwe opmaak";
    SlotName[ chinese_simplified ] = "ÖØÐÂÖÆ×÷¸ñʽ";
    SlotName[ greek ] = "ÅðáíÜëçøç ìïñöïðïßçóçò";
    SlotName[ korean ] = "ÆäÀÌÁö ¸Å±è";
    SlotName[ turkish ] = "Yeniden formatla";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_REPEAT_SEARCH
{
    SlotName = "Suche wiederholen";
    SlotName [ english ] =  "Suche wiederholen";
    SlotName[ english_us ] = "Repeat Search";
    SlotName[ portuguese ] = "Repetir procura";
    SlotName[ russian ] = "Ïîâòîð ïîèñêà";
    SlotName[ dutch ] = "Zoeken herhalen";
    SlotName[ french ] = "Répéter la recherche";
    SlotName[ spanish ] = "Repetir búsqueda";
    SlotName[ italian ] = "Ripeti ricerca";
    SlotName[ danish ] = "Gentag søgning";
    SlotName[ swedish ] = "Upprepa sökning";
    SlotName[ polish ] = "Powtórz wyszukiwanie";
    SlotName[ portuguese_brazilian ] = "RepeatSearch";
    SlotName[ japanese ] = "ÄŒŸõ";
    SlotName[ chinese_simplified ] = "ÖØ¸´ËÑѰ";
    SlotName[ chinese_traditional ] = "­«½Æ´M§ä";
    SlotName[ arabic ] = "ÊßÑÇÑ ÇáÈÍË";
    SlotName[ dutch ] = "Zoeken herhalen";
    SlotName[ chinese_simplified ] = "ÖØ¸´ËÑѰ";
    SlotName[ greek ] = "ÅðáíÜëçøç áíáæÞôçóçò";
    SlotName[ korean ] = "ã±â ¹Ýº¹";
    SlotName[ turkish ] = "Yeniden bul";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_RULER
{
    SlotName = "Lineal ein/aus";
    SlotName [ english ] =  "Lineal ein/aus";
    SlotName[ english_us ] = "Ruler On/Off";
    SlotName[ portuguese ] = "Mostrar régua";
    SlotName[ russian ] = "Âêë./âûêë. ëèíåéêó";
    SlotName[ dutch ] = "Liniaal aan/uit";
    SlotName[ french ] = "Afficher/masquer la règle";
    SlotName[ spanish ] = "Regla";
    SlotName[ italian ] = "Righello on/off";
    SlotName[ danish ] = "Lineal til/fra";
    SlotName[ swedish ] = "Linjal på/av";
    SlotName[ polish ] = "W³¹cz/Wy³¹cz linijkê";
    SlotName[ portuguese_brazilian ] = "ViewRuler";
    SlotName[ japanese ] = "Ù°×° µÝ/µÌ";
    SlotName[ chinese_simplified ] = "ÏÔʾ/ÒþÈë±ê³ß";
    SlotName[ chinese_traditional ] = "Åã¥Ü/Áô¤J¼Ð¤Ø";
    SlotName[ arabic ] = "ÅÙåÇÑ/ÅÎÝÇÁ ÇáãÓØÑÉ";
    SlotName[ dutch ] = "Liniaal aan/uit";
    SlotName[ chinese_simplified ] = "ÏÔʾ/ÒþÈë±ê³ß";
    SlotName[ greek ] = "×Üñáêáò Íáé/¼÷é";
    SlotName[ korean ] = "´«±ÝÀÚ ÀÛµ¿/ÇØÁ¦";
    SlotName[ turkish ] = "Cetveli görüntüle/gizle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_SELECT_PARA
{
    SlotName = "Absatz selektieren";
    SlotName [ english ] =  "Absatz selektieren";
    SlotName[ english_us ] = "Select Paragraph";
    SlotName[ portuguese ] = "Seleccionar parágrafo";
    SlotName[ russian ] = "Âûäåëèòü àáçàö";
    SlotName[ dutch ] = "Alinea selecteren";
    SlotName[ french ] = "Sélectionner paragraphe";
    SlotName[ spanish ] = "Seleccionar párrafo";
    SlotName[ italian ] = "Seleziona paragrafo";
    SlotName[ danish ] = "Marker afsnit";
    SlotName[ swedish ] = "Markera stycke";
    SlotName[ polish ] = "Wybierz akapit";
    SlotName[ portuguese_brazilian ] = "ParagraphSelect";
    SlotName[ japanese ] = "’i—Ž‚Ì‘I‘ð";
    SlotName[ chinese_simplified ] = "Ñ¡ÖжÎÂä";
    SlotName[ chinese_traditional ] = "¿ï¨ú¬q¸¨";
    SlotName[ arabic ] = "ÊÍÏíÏ ÝÞÑÉ";
    SlotName[ dutch ] = "Alinea selecteren";
    SlotName[ chinese_simplified ] = "Ñ¡ÖжÎÂä";
    SlotName[ greek ] = "ÅðéëïãÞ ðáñáãñÜöïõ";
    SlotName[ korean ] = "´Ü¶ô ¼±ÅÃ";
    SlotName[ turkish ] = "Paragraf seç";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_SELECT_WORD
{
    SlotName = "Wort selektieren";
    SlotName [ english ] =  "Wort selektieren";
    SlotName[ english_us ] = "Select Word";
    SlotName[ portuguese ] = "Seleccionar palavra";
    SlotName[ russian ] = "Âûäåëèòü ñëîâî";
    SlotName[ dutch ] = "Woord selecteren";
    SlotName[ french ] = "Sélectionner mot";
    SlotName[ spanish ] = "Seleccionar palabra";
    SlotName[ italian ] = "Seleziona parola";
    SlotName[ danish ] = "Marker ord";
    SlotName[ swedish ] = "Markera ord";
    SlotName[ polish ] = "Zaznacz s³owo";
    SlotName[ portuguese_brazilian ] = "WordSelect";
    SlotName[ japanese ] = "’PŒê‚Ì‘I‘ð";
    SlotName[ chinese_simplified ] = "Ñ¡Ôñ×Ö";
    SlotName[ chinese_traditional ] = "¿ï¨ú¦r";
    SlotName[ arabic ] = "ÊÍÏíÏ ßáãÉ";
    SlotName[ dutch ] = "Woord selecteren";
    SlotName[ chinese_simplified ] = "Ñ¡Ôñ×Ö";
    SlotName[ greek ] = "ÅðéëïãÞ ëÝîçò";
    SlotName[ korean ] = "´Ü¾î ¼±ÅÃ";
    SlotName[ turkish ] = "Sözcük seç";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_SET_ADD_MODE
{
    SlotName = "Multiselektion ein";
    SlotName [ english ] =  "Multiselektion ein";
    SlotName[ english_us ] = "MultiSelection On";
    SlotName[ portuguese ] = "Multiselecção";
    SlotName[ russian ] = "Âêë. ìóëüòèâûäåëåíèå";
    SlotName[ dutch ] = "Multiselectie inschakelen";
    SlotName[ french ] = "Mode Multisélection";
    SlotName[ spanish ] = "Activar selección múltiple";
    SlotName[ italian ] = "Attiva selezione multipla";
    SlotName[ danish ] = "Aktiver multimarkering";
    SlotName[ swedish ] = "Multipel markering på";
    SlotName[ polish ] = "W³¹cz wielokrotn¹ selekcjê";
    SlotName[ portuguese_brazilian ] = "SetMultiSelection";
    SlotName[ japanese ] = "•¡”‘I‘ð@µÝ";
    SlotName[ chinese_simplified ] = "¼¤»î¶àÖØÑ¡Ôñ";
    SlotName[ chinese_traditional ] = "¿E¬¡¦h­«¿ï¨ú";
    SlotName[ arabic ] = "ÊÔÛíá ÇáÊÍÏíÏ ÇáãÊÚÏÏ";
    SlotName[ dutch ] = "Multiselectie inschakelen";
    SlotName[ chinese_simplified ] = "¼¤»î¶àÖØÑ¡Ôñ";
    SlotName[ greek ] = "Åíåñãïðïßçóç ðïëëáðëÞò åðéëïãÞò";
    SlotName[ korean ] = "´ÙÁß ¼±Åà ÀÛµ¿";
    SlotName[ turkish ] = "Çoklu seçim açýk";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_SET_EXT_MODE
{
    SlotName = "Erweiterte Selektion ein";
    SlotName [ english ] =  "Erweiterte Selektion ein";
    SlotName[ english_us ] = "Extended Selection On";
    SlotName[ portuguese ] = "Selecção extensa";
    SlotName[ russian ] = "Âêë. ðàñøèðåííîå âûäåëåíèå";
    SlotName[ dutch ] = "Uitgebreide selectie inschakelen";
    SlotName[ french ] = "Sélection étendue";
    SlotName[ spanish ] = "Activar Selección Extendida";
    SlotName[ italian ] = "Attiva selezione ampliata";
    SlotName[ danish ] = "Aktiver udvidet markering";
    SlotName[ swedish ] = "Utökad markering på";
    SlotName[ polish ] = "W³¹cz rozsz. selekcjê";
    SlotName[ portuguese_brazilian ] = "SetExtSelection";
    SlotName[ japanese ] = "Šg’£‘I‘ð µÝ";
    SlotName[ chinese_simplified ] = "¼¤»î¸ß¼¶Ñ¡Ôñ";
    SlotName[ chinese_traditional ] = "¿E¬¡¶i¶¥¿ï¨ú";
    SlotName[ arabic ] = "ÊÔÛíá ÇáÊÍÏíÏ ÇáãæÓÚ";
    SlotName[ dutch ] = "Uitgebreide selectie inschakelen";
    SlotName[ chinese_simplified ] = "¼¤»î¸ß¼¶Ñ¡Ôñ";
    SlotName[ greek ] = "Åíåñãïðïßçóç åêôåôáìÝíçò åðéëïãÞò";
    SlotName[ korean ] = "È®Àå ¼±Åà ÀÛµ¿";
    SlotName[ turkish ] = "Ayrýntýlý seçim açýk";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_SET_PAGE_STYLE
{
    SlotName = "Seitenvorlage zuweisen";
    SlotName [ english ] =  "Seitenvorlage zuweisen";
    SlotName[ english_us ] = "Apply Page Style";
    SlotName[ portuguese ] = "Aplicar estilo de página";
    SlotName[ russian ] = "Ïðèìåíèòü ñòèëè ñòðàíèöû";
    SlotName[ dutch ] = "Pagina-opmaakprofiel toewijzen";
    SlotName[ french ] = "Assigner le style de page";
    SlotName[ spanish ] = "Aplicar estilo de página";
    SlotName[ italian ] = "Assegna modello di pagina";
    SlotName[ danish ] = "Tildel sidetypografi";
    SlotName[ swedish ] = "Tilldela sidformatmall";
    SlotName[ polish ] = "Zastosuj styl strony";
    SlotName[ portuguese_brazilian ] = "ApplyPageStyle";
    SlotName[ japanese ] = "Íß°¼Þ½À²Ù‚Ì“K—p";
    SlotName[ chinese_simplified ] = "ʹÓÃÒ³ÃæÑùʽ";
    SlotName[ chinese_traditional ] = "¨Ï¥Î­¶­±¼Ë¦¡";
    SlotName[ arabic ] = "ÊÚííä ÞÇáÈ ÇáÕÝÍÉ";
    SlotName[ dutch ] = "Pagina-opmaakprofiel toewijzen";
    SlotName[ chinese_simplified ] = "ʹÓÃÒ³ÃæÑùʽ";
    SlotName[ greek ] = "ÅöáñìïãÞ ðñüôõðïõ óåëßäáò";
    SlotName[ korean ] = "ÆäÀÌÁö À¯Çü Àû¿ë";
    SlotName[ turkish ] = "Sayfa þablonu ata";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_SET_SUB_SCRIPT
{
    SlotName = "Tiefgestellt";
    SlotName [ english ] =  "Tiefgestellt";
    SlotName[ english_us ] = "Subscript";
    SlotName[ portuguese ] = "Inferior à linha";
    SlotName[ russian ] = "Íèæíèé èíäåêñ";
    SlotName[ dutch ] = "Subscript";
    SlotName[ french ] = "Indice";
    SlotName[ spanish ] = "Subíndice";
    SlotName[ italian ] = "Pedice";
    SlotName[ danish ] = "Sænket";
    SlotName[ swedish ] = "Nedsänkt";
    SlotName[ polish ] = "Indeks dolny";
    SlotName[ portuguese_brazilian ] = "Subscript";
    SlotName[ japanese ] = "‰º•t‚«";
    SlotName[ chinese_simplified ] = "챐";
    SlotName[ chinese_traditional ] = "¤U¼Ð";
    SlotName[ arabic ] = "ãäÎÝÖ";
    SlotName[ dutch ] = "Subscript";
    SlotName[ chinese_simplified ] = "챐";
    SlotName[ greek ] = "Äåßêôçò";
    SlotName[ korean ] = "¾Æ·¡ ÷ÀÚ";
    SlotName[ turkish ] = "Alt simge";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_SET_SUPER_SCRIPT
{
    SlotName = "Hochgestellt";
    SlotName [ english ] =  "Hochgestellt";
    SlotName[ english_us ] = "Superscript";
    SlotName[ portuguese ] = "Superior à linha";
    SlotName[ russian ] = "Âåðõíèé èíäåêñ";
    SlotName[ dutch ] = "Superscript";
    SlotName[ french ] = "Exposant";
    SlotName[ spanish ] = "Superíndice";
    SlotName[ italian ] = "Apice";
    SlotName[ danish ] = "Hævet";
    SlotName[ swedish ] = "Upphöjt";
    SlotName[ polish ] = "Indeks górny";
    SlotName[ portuguese_brazilian ] = "Superscript";
    SlotName[ japanese ] = "ã•t‚«";
    SlotName[ chinese_simplified ] = "Éϱê";
    SlotName[ chinese_traditional ] = "¤W¼Ð";
    SlotName[ arabic ] = "ãÑÊÝÚ";
    SlotName[ dutch ] = "Superscript";
    SlotName[ chinese_simplified ] = "Éϱê";
    SlotName[ greek ] = "ÅêèÝôçò";
    SlotName[ korean ] = "À­ ÷ÀÚ";
    SlotName[ turkish ] = "Üst simge";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_SHADOWCURSOR
{
    SlotName = "Direkt-Cursor ein/aus";
    SlotName [ english ] =  "Direkt-Cursor ein/aus";
    SlotName[ english_us ] = "Direct Cursor on/off";
    SlotName[ portuguese ] = "Activar cursor directo";
    SlotName[ russian ] = "Âêë./âûêë. ñâîáîäíûé êóðñîð";
    SlotName[ dutch ] = "Direct-cursor aan/uit";
    SlotName[ french ] = "(Dés)activer le curseur direct";
    SlotName[ spanish ] = "Activar/desactivar cursor directo";
    SlotName[ italian ] = "Cursore diretto on/off";
    SlotName[ danish ] = "Direkt-markør til/fra";
    SlotName[ swedish ] = "Direktmarkör på/av";
    SlotName[ polish ] = "W³¹cz/Wy³¹cz kursor bezpoœredni";
    SlotName[ portuguese_brazilian ] = "ShadowCursor";
    SlotName[ japanese ] = "ÀÞ²Ú¸Ä ¶°¿Ù µÝ/µÌ";
    SlotName[ chinese_simplified ] = "¼¤»î»òʧ»îÖ±½Ó¶¨Î»¹â±ê";
    SlotName[ chinese_traditional ] = "¿E¬¡©Î¥¢¬¡ª½±µ©w¦ì¥ú¼Ð";
    SlotName[ arabic ] = "ÊÔÛíá/ÅíÞÇÝ ÇáãÄÔÑ ÇáãÈÇÔÑ";
    SlotName[ dutch ] = "Direct-cursor aan/uit";
    SlotName[ chinese_simplified ] = "¼¤»î»òʧ»îÖ±½Ó¶¨Î»¹â±ê";
    SlotName[ greek ] = "¢ìåóïò äñïìÝáò Íáé/¼÷é";
    SlotName[ korean ] = "Á÷Á¢ Ä¿¼­ ÀÛµ¿/ÇØÁ¦";
    SlotName[ turkish ] = "Serbest imleç açýk/kapalý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_SHIFT_BACKSPACE
{
    SlotName = "Rückschritt";
    SlotName [ english ] =  "Rückschritt";
    SlotName[ english_us ] = "Backspace";
    SlotName[ portuguese ] = "Retrocesso";
    SlotName[ russian ] = "Âîçâðàò";
    SlotName[ dutch ] = "Backspace";
    SlotName[ french ] = "RET.ARR";
    SlotName[ spanish ] = "Retroceso";
    SlotName[ italian ] = "Backspace";
    SlotName[ danish ] = "Tilbage";
    SlotName[ swedish ] = "Backsteg";
    SlotName[ polish ] = "Wstecz";
    SlotName[ portuguese_brazilian ] = "Backspace";
    SlotName[ japanese ] = "ÊÞ¯¸½Íß°½";
    SlotName[ chinese_simplified ] = "Í˸ñ";
    SlotName[ chinese_traditional ] = "ºM®ø©R¥O";
    SlotName[ arabic ] = "ÊÑÇÌÚ";
    SlotName[ dutch ] = "Backspace";
    SlotName[ chinese_simplified ] = "Í˸ñ";
    SlotName[ greek ] = "Backspace";
    SlotName[ korean ] = "¹é ½ºÆäÀ̽º";
    SlotName[ turkish ] = "Geri al";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_SHOW_FOUR_PAGES
{
    SlotName = "Seitenansicht: vier Seiten";
    SlotName [ english ] =  "Seitenansicht: vier Seiten";
    SlotName[ english_us ] = "Page Preview: Four Pages";
    SlotName[ portuguese ] = "Ver página: quatro páginas";
    SlotName[ russian ] = "Ïðîñìîòð ñòðàíèöû:÷åòûðå ñòðàíèöû";
    SlotName[ dutch ] = "Afdrukvoorbeeld: vier pagina´s";
    SlotName[ french ] = "Aperçu : quatre pages";
    SlotName[ spanish ] = "Vista preliminar: cuatro páginas";
    SlotName[ italian ] = "Vista pagina: quattro pagine";
    SlotName[ danish ] = "Vis udskrift: fire sider";
    SlotName[ swedish ] = "Förhandsgranskning: fyra sidor";
    SlotName[ polish ] = "Podgl¹d ustawienia strony: Cztery strony";
    SlotName[ portuguese_brazilian ] = "ShowFourPages";
    SlotName[ japanese ] = "4Íß°¼Þ•\\ަ";
    SlotName[ chinese_simplified ] = "Ò³ÃæÊÓͼ£ºËÄÒ³";
    SlotName[ chinese_traditional ] = "­¶­±À˵ø¡G¥|­¶";
    SlotName[ arabic ] = "ÇáãÚÇíäÉ: ÃÑÈÚ ÕÝÍÇÊ";
    SlotName[ dutch ] = "Afdrukvoorbeeld: vier pagina´s";
    SlotName[ chinese_simplified ] = "Ò³ÃæÊÓͼ£ºËÄÒ³";
    SlotName[ greek ] = "Ðñïåðéóêüðçóç óåëßäáò: ôÝóóåñéò óåëßäåò";
    SlotName[ korean ] = "ÆäÀÌÁö ¹Ì¸®º¸±â: 4 ÆäÀÌÁö";
    SlotName[ turkish ] = "Sayfa ön izleme: Dört sayfa";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_SHOW_TWO_PAGES
{
    SlotName = "Seitenansicht: zwei Seiten";
    SlotName [ english ] =  "Seitenansicht: zwei Seiten";
    SlotName[ english_us ] = "Page Preview: Two Pages";
    SlotName[ portuguese ] = "Ver página: duas páginas";
    SlotName[ russian ] = "Ïðîñìîòð ñòðàíèöû: äâå ñòðàíèöû";
    SlotName[ dutch ] = "Afdrukvoorbeeld: twee pagina´s";
    SlotName[ french ] = "Aperçu : deux pages";
    SlotName[ spanish ] = "Vista preliminar: dos páginas";
    SlotName[ italian ] = "Vista pagina: due pagine";
    SlotName[ danish ] = "Vis udskrift: to sider";
    SlotName[ swedish ] = "Förhandsgranskning: två sidor";
    SlotName[ polish ] = "Podgl¹d ustawienia strony:Dwie strony";
    SlotName[ portuguese_brazilian ] = "ShowTwoPages";
    SlotName[ japanese ] = "2Íß°¼Þ•\\ަ";
    SlotName[ chinese_simplified ] = "Ò³ÃæÊÓͼ£ºÁ½Ò³";
    SlotName[ chinese_traditional ] = "­¶­±À˵ø¡G¨â­¶";
    SlotName[ arabic ] = "ÇáãÚÇíäÉ: ÕÝÍÊÇä";
    SlotName[ dutch ] = "Afdrukvoorbeeld: twee pagina´s";
    SlotName[ chinese_simplified ] = "Ò³ÃæÊÓͼ£ºÁ½Ò³";
    SlotName[ greek ] = "Ðñïåðéóêüðçóç óåëßäáò: Äýï óåëßäåò";
    SlotName[ korean ] = "ÆäÀÌÁö ¹Ì¸®º¸±â: 2 ÆäÀÌÁö";
    SlotName[ turkish ] = "Sayfa önizleme: Ýki sayfa";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_SHRINK_FONT_SIZE
{
    SlotName = "Zeichen verkleinern";
    SlotName [ english ] =  "Zeichen verkleinern";
    SlotName[ english_us ] = "Reduce Font";
    SlotName[ portuguese ] = "Reduzir caracteres";
    SlotName[ russian ] = "Óìåíüøèòü øðèôò";
    SlotName[ dutch ] = "Tekens verkleinen";
    SlotName[ french ] = "Réduire taille des caractères";
    SlotName[ spanish ] = "Reducir fuente";
    SlotName[ italian ] = "Riduci dim. carattere";
    SlotName[ danish ] = "Formindsk tegn";
    SlotName[ swedish ] = "Förminska tecken";
    SlotName[ polish ] = "Pomniejsz znaki";
    SlotName[ portuguese_brazilian ] = "ShrinkCharacterSize";
    SlotName[ japanese ] = "•¶Žš‚̏k¬";
    SlotName[ chinese_simplified ] = "ËõС×Ö·û";
    SlotName[ chinese_traditional ] = "ÁY¤p¦r¤¸";
    SlotName[ arabic ] = "ÊÕÛíÑ ÇáÎØ";
    SlotName[ dutch ] = "Tekens verkleinen";
    SlotName[ chinese_simplified ] = "ËõС×Ö·û";
    SlotName[ greek ] = "Óìßêñõíóç ÷áñáêôÞñùí";
    SlotName[ korean ] = "ÆùÆ® ÁÙÀ̱â";
    SlotName[ turkish ] = "Yazýtipini küçült";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_SORTING_DLG
{
    SlotName = "Sortieren";
    SlotName [ english ] =  "Sortieren";
    SlotName[ english_us ] = "Sort";
    SlotName[ portuguese ] = "Ordenar";
    SlotName[ russian ] = "Ñîðòèðîâàòü";
    SlotName[ dutch ] = "Sorteren";
    SlotName[ french ] = "Trier";
    SlotName[ spanish ] = "Ordenar";
    SlotName[ italian ] = "Ordina";
    SlotName[ danish ] = "Sorter";
    SlotName[ swedish ] = "Sortera";
    SlotName[ polish ] = "Sortuj";
    SlotName[ portuguese_brazilian ] = "ToolsSort";
    SlotName[ japanese ] = "•À‚בւ¦";
    SlotName[ chinese_simplified ] = "ÅÅÐò";
    SlotName[ chinese_traditional ] = "±Æ§Ç";
    SlotName[ arabic ] = "ÝÑÒ";
    SlotName[ dutch ] = "Sorteren";
    SlotName[ chinese_simplified ] = "ÅÅÐò";
    SlotName[ greek ] = "Ôáîéíüìçóç";
    SlotName[ korean ] = "Á¤·Ä";
    SlotName[ turkish ] = "Sýrala";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_SOURCEVIEW
{
    SlotName = "HTML-Quelltext anzeigen";
    SlotName [ english ] =  "HTML-Quelltext anzeigen";
    SlotName[ english_us ] = "Show HTML Source";
    SlotName[ portuguese ] = "Mostrar texto-fonte HTML";
    SlotName[ russian ] = "Ïîêàçàòü èñõîäíûé òåêñò HTML";
    SlotName[ dutch ] = "HTML-brontekst weergeven";
    SlotName[ french ] = "Afficher le texte source HTML";
    SlotName[ spanish ] = "Mostrar texto fuente HTML";
    SlotName[ italian ] = "Mostra testo sorgente HTML";
    SlotName[ danish ] = "Vis HTML-kildetekst";
    SlotName[ swedish ] = "Visa HTML-källtext";
    SlotName[ polish ] = "Poka¿ tekst Ÿród³owy HTML";
    SlotName[ portuguese_brazilian ] = "FileHtmlSourceText";
    SlotName[ japanese ] = "HTML¿°½‚Ì•\\ަ";
    SlotName[ chinese_simplified ] = "ÏÔʾ HTML Ô´Îı¾";
    SlotName[ chinese_traditional ] = "Åã¥Ü HTML-­ì©lÀÉ";
    SlotName[ arabic ] = "ÅÙåÇÑ ãÕÏÑ HTML";
    SlotName[ dutch ] = "HTML-brontekst weergeven";
    SlotName[ chinese_simplified ] = "ÏÔʾ HTML Ô´Îı¾";
    SlotName[ greek ] = "ÅìöÜíéóç êåéìÝíïõ ðñïÝëåõóçò HTML";
    SlotName[ korean ] = "HTML ¼Ò½º º¸À̱â";
    SlotName[ turkish ] = "HTML kaynak kodunu görüntüle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_SPELLING_DLG
{
    SlotName = "Rechtschreibung";
    SlotName [ english ] =  "Rechtschreibung";
    SlotName[ english_us ] = "Spellcheck";
    SlotName[ portuguese ] = "Ortografia";
    SlotName[ russian ] = "Ïðàâîïèñàíèå";
    SlotName[ dutch ] = "Spelling";
    SlotName[ french ] = "Orthographe";
    SlotName[ spanish ] = "Revisión ortográfica";
    SlotName[ italian ] = "Controllo ortografico ";
    SlotName[ danish ] = "Stavekontrol";
    SlotName[ swedish ] = "Rättstavning";
    SlotName[ polish ] = "Pisownia";
    SlotName[ portuguese_brazilian ] = "Spelling";
    SlotName[ japanese ] = "•¶ÍZ³";
    SlotName[ chinese_simplified ] = "Õý×Ö·¨";
    SlotName[ chinese_traditional ] = "«÷¦r";
    SlotName[ arabic ] = "ÊÏÞíÞ ÅãáÇÆí";
    SlotName[ dutch ] = "Spelling";
    SlotName[ chinese_simplified ] = "Õý×Ö·¨";
    SlotName[ greek ] = "Ïñèïãñáößá";
    SlotName[ korean ] = "¸ÂÃã¹ý";
    SlotName[ turkish ] = "Yazým";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_START_DOC_DIRECT
{
    SlotName = "Direkt zum Dokumentanfang";
    SlotName [ english ] =  "Direkt zum Dokumentanfang";
    SlotName[ english_us ] = "Directly to Document Begin";
    SlotName[ portuguese ] = "Directamente para início do documento";
    SlotName[ russian ] = "Íåïîñðåäñòâåííî äî íà÷àëà äîêóìåíòà";
    SlotName[ dutch ] = "Direct naar documentbegin";
    SlotName[ french ] = "Au début du document";
    SlotName[ spanish ] = "Directo al comienzo del documento";
    SlotName[ italian ] = "Direttamente all'inizio del documento";
    SlotName[ danish ] = "Direkte til dokumentets begyndelse";
    SlotName[ swedish ] = "Direkt till början av dokumentet";
    SlotName[ polish ] = "Bezpoœrednio do pocz¹tku dokumentu";
    SlotName[ portuguese_brazilian ] = "BeginDocument";
    SlotName[ japanese ] = "’¼Ú•¶‘‚ÌŽn‚ß‚Ö";
    SlotName[ chinese_simplified ] = "Ö±½Óתµ½ÎĵµÊ×¶Ë";
    SlotName[ chinese_traditional ] = "ª½±µÂà¨ì¤å¥ó­ººÝ";
    SlotName[ arabic ] = "Åáì ÈÏÇíÉ ÇáãÓÊäÏ ãÈÇÔÑÉ";
    SlotName[ dutch ] = "Direct naar documentbegin";
    SlotName[ chinese_simplified ] = "Ö±½Óתµ½ÎĵµÊ×¶Ë";
    SlotName[ greek ] = "Áðåõèåßáò ðñïò ôçí áñ÷Þ ôïõ åããñÜöïõ";
    SlotName[ korean ] = "¹®¼­ ½ÃÀÛ¿¡ ¹Ù·Î";
    SlotName[ turkish ] = "Doðrudan belgenin baþlangýcý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_START_OF_COLUMN
{
    SlotName = "Zum Spaltenanfang";
    SlotName [ english ] =  "Zum Spaltenanfang";
    SlotName[ english_us ] = "To Column Begin";
    SlotName[ portuguese ] = "Ir para início de coluna";
    SlotName[ russian ] = "Äî íà÷àëà ñòîëáöà";
    SlotName[ dutch ] = "Naar kolombegin";
    SlotName[ french ] = "Aller au début de la colonne";
    SlotName[ spanish ] = "Ir al comienzo de la columna";
    SlotName[ italian ] = "All'inizio della colonna";
    SlotName[ danish ] = "Til kolonnens begyndelse";
    SlotName[ swedish ] = "Till början av kolumnen";
    SlotName[ polish ] = "Do pocz¹tku kolumny";
    SlotName[ portuguese_brazilian ] = "GoToBeginOfColumn";
    SlotName[ japanese ] = "—ñ‚ÌŽn‚ß‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÁÐÊ×";
    SlotName[ chinese_traditional ] = "Âà¨ìÄæ­º";
    SlotName[ arabic ] = "Åáì ÈÏÇíÉ ÇáÚãæÏ";
    SlotName[ dutch ] = "Naar kolombegin";
    SlotName[ chinese_simplified ] = "תµ½ÁÐÊ×";
    SlotName[ greek ] = "Ðñïò ôçí áñ÷Þ ôçò óôÞëçò";
    SlotName[ korean ] = "¿­ ½ÃÀÛ¿¡";
    SlotName[ turkish ] = "Sütun baþlangýcý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_START_OF_DOCUMENT
{
    SlotName = "Zum Dokumentanfang";
    SlotName [ english ] =  "Zum Dokumentanfang";
    SlotName[ english_us ] = "To Document Begin";
    SlotName[ portuguese ] = "Ir para início do documento";
    SlotName[ russian ] = "Ê íà÷àëó äîêóìåíòà";
    SlotName[ dutch ] = "Naar begin document";
    SlotName[ french ] = "Au début du document";
    SlotName[ spanish ] = "Al comienzo del documento";
    SlotName[ italian ] = "All'inizio del documento";
    SlotName[ danish ] = "Til dokumentets begyndelse";
    SlotName[ swedish ] = "Till början av dokument";
    SlotName[ polish ] = "Do pocz¹tku dokumentu";
    SlotName[ portuguese_brazilian ] = "GoToStartOfDoc";
    SlotName[ japanese ] = "•¶‘‚ÌŽn‚ß‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÎĵµÊ×¶Ë";
    SlotName[ chinese_traditional ] = "Âà¨ì¤å¥ó­ººÝ";
    SlotName[ arabic ] = "Åáì ÈÏÇíÉ ÇáãÓÊäÏ";
    SlotName[ dutch ] = "Naar begin document";
    SlotName[ chinese_simplified ] = "תµ½ÎĵµÊ×¶Ë";
    SlotName[ greek ] = "Ðñïò ôçí áñ÷Þ ôïõ åããñÜöïõ";
    SlotName[ korean ] = "¹®¼­ÀÇ ½ÃÀÛ¿¡";
    SlotName[ turkish ] = "Belgenin baþlangýcý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_START_OF_DOCUMENT_SEL
{
    SlotName = "Bis Dokumentanfang selektieren";
    SlotName [ english ] =  "Bis Dokumentanfang selektieren";
    SlotName[ english_us ] = "Select to Document Begin";
    SlotName[ portuguese ] = "Seleccionar até início do documento";
    SlotName[ russian ] = "Âûäåëèòü äî íà÷àëà äîêóìåíòà";
    SlotName[ dutch ] = "Tot aan begin document selecteren";
    SlotName[ french ] = "Sélectionner jusqu'au début du document";
    SlotName[ spanish ] = "Seleccionar hasta el comienzo del documento";
    SlotName[ italian ] = "Seleziona fino all'inizio del documento";
    SlotName[ danish ] = "Marker til dokumentets begyndelse";
    SlotName[ swedish ] = "Markera till början av dokument";
    SlotName[ polish ] = "Zaznacz do pocz¹tku dokumentu";
    SlotName[ portuguese_brazilian ] = "BeginDocumentSel";
    SlotName[ japanese ] = "•¶‘‚ÌŽn‚߂܂őI‘ð";
    SlotName[ chinese_simplified ] = "Ñ¡ÖÐÖÁÎĵµÊ×¶Ë";
    SlotName[ chinese_traditional ] = "¿ï¨ú¦Ü¤å¥ó­ººÝ";
    SlotName[ arabic ] = "ÊÍÏíÏ ÍÊì ÈÏÇíÉ ÇáãÓÊäÏ";
    SlotName[ dutch ] = "Tot aan begin document selecteren";
    SlotName[ chinese_simplified ] = "Ñ¡ÖÐÖÁÎĵµÊ×¶Ë";
    SlotName[ greek ] = "ÅðéëïãÞ Ýùò ôçí áñ÷Þ ôïõ åããñÜöïõ";
    SlotName[ korean ] = "¹®¼­ ½ÃÀÛ¿¡ ¼±ÅÃ";
    SlotName[ turkish ] = "Belgenin baþlangýcýna kadar seç";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_START_OF_LINE
{
    SlotName = "Zum Zeilenanfang";
    SlotName [ english ] =  "Zum Zeilenanfang";
    SlotName[ english_us ] = "To Line Begin";
    SlotName[ portuguese ] = "Ir para início da linha";
    SlotName[ russian ] = "Äî íà÷àëà ñòðîêè";
    SlotName[ dutch ] = "Naar begin regel";
    SlotName[ french ] = "Aller au début de ligne";
    SlotName[ spanish ] = "Ir al comienzo de la línea";
    SlotName[ italian ] = "All'inizio riga";
    SlotName[ danish ] = "Til rækkens begyndelse";
    SlotName[ swedish ] = "Till början av rad";
    SlotName[ polish ] = "Do pocz¹tku wiersza";
    SlotName[ portuguese_brazilian ] = "GoToStartOfLine";
    SlotName[ japanese ] = "s“ª‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÐÐÊ×";
    SlotName[ chinese_traditional ] = "Âà¨ì¦æ­º";
    SlotName[ arabic ] = "Åáì ÈÏÇíÉ ÇáÓØÑ";
    SlotName[ dutch ] = "Naar begin regel";
    SlotName[ chinese_simplified ] = "תµ½ÐÐÊ×";
    SlotName[ greek ] = "Ðñïò ôçí áñ÷Þ ôçò ãñáììÞò";
    SlotName[ korean ] = "¼± ½ÃÀÛ¿¡";
    SlotName[ turkish ] = "Satýr baþý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_START_OF_LINE_SEL
{
    SlotName = "Bis Zeilenanfang selektieren";
    SlotName [ english ] =  "Bis Zeilenanfang selektieren";
    SlotName[ english_us ] = "Select to Begin of Line";
    SlotName[ portuguese ] = "Seleccionar até início da linha";
    SlotName[ russian ] = "Âûäåëèòü äî íà÷àëà ñòðîêè";
    SlotName[ dutch ] = "Tot regelbegin selecteren";
    SlotName[ french ] = "Sélect. jusqu'au début de ligne";
    SlotName[ spanish ] = "Seleccionar hasta el comienzo de la línea";
    SlotName[ italian ] = "Seleziona fino all'inizio della riga";
    SlotName[ danish ] = "Marker til rækkens begyndelse";
    SlotName[ swedish ] = "Markera till början av rad";
    SlotName[ polish ] = "Zaznacz do pocz¹tku wiersza";
    SlotName[ portuguese_brazilian ] = "BeginLineSel";
    SlotName[ japanese ] = "s“ª‚܂őI‘ð";
    SlotName[ chinese_simplified ] = "Ñ¡Ôñµ½ÐÐÊ×";
    SlotName[ chinese_traditional ] = "¿ï¾Ü¨ì¦æ­º";
    SlotName[ arabic ] = "ÊÍÏíÏ ÍÊì ÈÏÇíÉ ÇáÓØÑ";
    SlotName[ dutch ] = "Tot regelbegin selecteren";
    SlotName[ chinese_simplified ] = "Ñ¡Ôñµ½ÐÐÊ×";
    SlotName[ greek ] = "ÅðéëïãÞ Ýùò ôçí áñ÷Þ ôçò ãñáììÞò";
    SlotName[ korean ] = "¼±ÀÇ ½ÃÀÛ¿¡ ¼±ÅÃ";
    SlotName[ turkish ] = "Satýr baþýna kadar seç";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_START_OF_NEXT_COLUMN
{
    SlotName = "Zum Anfang nächste Spalte";
    SlotName [ english ] =  "Zum Anfang nächste Spalte";
    SlotName[ english_us ] = "To Begin of Next Column";
    SlotName[ portuguese ] = "Ir para início da coluna seguinte";
    SlotName[ russian ] = "Äî íà÷àëà ñëåäóþùåãî ñòîëáöà";
    SlotName[ dutch ] = "Naar begin volgende kolom";
    SlotName[ french ] = "Aller au début de la colonne suivante";
    SlotName[ spanish ] = "Ir al comienzo de la columna siguiente ";
    SlotName[ italian ] = "All'inizio della colonna successiva";
    SlotName[ danish ] = "Til næste kolonnes begyndelse";
    SlotName[ swedish ] = "Till början av nästa kolumn";
    SlotName[ polish ] = "Do pocz¹tku nastêpnej kolumny";
    SlotName[ portuguese_brazilian ] = "GoToBeginOfNextColumn";
    SlotName[ japanese ] = "ŽŸ‚Ì—ñ‚ÌŽn‚ß‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÏÂÒ»ÁеÄÊ×¶Ë";
    SlotName[ chinese_traditional ] = "Âà¨ì¤U¤@Äæ";
    SlotName[ arabic ] = "Åáì ÈÏÇíÉ ÇáÚãæÏ ÇáÊÇáí";
    SlotName[ dutch ] = "Naar begin volgende kolom";
    SlotName[ chinese_simplified ] = "תµ½ÏÂÒ»ÁеÄÊ×¶Ë";
    SlotName[ greek ] = "Ðñïò áñ÷Þ åðüìåíçò óôÞëçò";
    SlotName[ korean ] = "´ÙÀ½ ¿­¿¡ ½ÃÀÛ¿¡";
    SlotName[ turkish ] = "Sonraki sütunun baþlangýcý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_START_OF_NEXT_PAGE
{
    SlotName = "Zum Anfang nächste Seite";
    SlotName [ english ] =  "Zum Anfang nächste Seite";
    SlotName[ english_us ] = "To Begin of Next Page";
    SlotName[ portuguese ] = "Ir para início da página seguinte";
    SlotName[ russian ] = "Äî íà÷àëà ñëåäóþùåé ñòðàíèöû";
    SlotName[ dutch ] = "Naar begin volgende pagina";
    SlotName[ french ] = "Aller au début de la page suivante";
    SlotName[ spanish ] = "Ir al comienzo de la página siguiente";
    SlotName[ italian ] = "All'inizio della pagina successiva";
    SlotName[ danish ] = "Til næste sides begyndelse";
    SlotName[ swedish ] = "Till början av nästa sida";
    SlotName[ polish ] = "Na pocz¹tek nastêpnej strony";
    SlotName[ portuguese_brazilian ] = "GoToBeginOfNextPage";
    SlotName[ japanese ] = "ŽŸÍß°¼Þ‚ÌŽn‚ß‚Ö";
    SlotName[ chinese_simplified ] = "תµ½Ï¸öÒ³ÃæµÄÊ×¶Ë";
    SlotName[ chinese_traditional ] = "Âà¨ì¤U¤@­¶­º";
    SlotName[ arabic ] = "Åáì ÈÏÇíÉ ÇáÕÝÍÉ ÇáÊÇáíÉ";
    SlotName[ dutch ] = "Naar begin volgende pagina";
    SlotName[ chinese_simplified ] = "תµ½Ï¸öÒ³ÃæµÄÊ×¶Ë";
    SlotName[ greek ] = "Ðñïò ôçí áñ÷Þ ôçò åðüìåíçò óåëßäáò";
    SlotName[ korean ] = "´ÙÀ½ ÆäÀÌÁöÀÇ ½ÃÀÛ¿¡";
    SlotName[ turkish ] = "Sonraki sayfanýn baþlangýcý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_START_OF_NEXT_PAGE_SEL
{
    SlotName = "Bis Anfang nächste Seite selektieren";
    SlotName [ english ] =  "Bis Anfang nächste Seite selektieren";
    SlotName[ english_us ] = "Select to Begin of Next Page";
    SlotName[ portuguese ] = "Seleccionar até início da página seguinte";
    SlotName[ russian ] = "Âûäåëèòü äî íà÷àëà ñëåäóþùåé ñòðàíèöû";
    SlotName[ dutch ] = "Tot aan begin volgende pagina selecteren";
    SlotName[ french ] = "Sélect. jusqu'au début de la page suivante";
    SlotName[ spanish ] = "Seleccionar hasta comienzo de la página siguiente";
    SlotName[ italian ] = "Seleziona fino all'inizio della pagina successiva";
    SlotName[ danish ] = "Marker til næste sides begyndelse";
    SlotName[ swedish ] = "Markera till början av nästa sida";
    SlotName[ polish ] = "Zaznacz do pocz¹tku nastêpnej strony";
    SlotName[ portuguese_brazilian ] = "GoToBeginOfNextPageSel";
    SlotName[ japanese ] = "ŽŸÍß°¼Þ‚ÌŽn‚߂܂őI‘ð";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁÏÂÒ³Ê×¶Ë";
    SlotName[ chinese_traditional ] = "¿ï¤¤¦Ü¤U¤@­¶­º";
    SlotName[ arabic ] = "ÊÍÏíÏ ÍÊì ÈÏÇíÉ ÇáÕÝÍÉ ÇáÊÇáíÉ";
    SlotName[ dutch ] = "Tot aan begin volgende pagina selecteren";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁÏÂÒ³Ê×¶Ë";
    SlotName[ greek ] = "ÅðéëïãÞ Ýùò ôçí áñ÷Þ ôçò åðüìåíçò óåëßäáò";
    SlotName[ korean ] = "´ÙÀ½ ÆäÀÌÁö ½ÃÀÛ¿¡ ¼±ÅÃ";
    SlotName[ turkish ] = "Sonraki sayfanýn baþlangýcýna kadar seç";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_START_OF_PAGE
{
    SlotName = "Zum Seitenanfang";
    SlotName [ english ] =  "Zum Seitenanfang";
    SlotName[ english_us ] = "To Page Begin";
    SlotName[ portuguese ] = "Ir para início da página";
    SlotName[ russian ] = "Äî íà÷àëà ñòðàíèöû";
    SlotName[ dutch ] = "Naar begin pagina";
    SlotName[ french ] = "Aller au début de la page";
    SlotName[ spanish ] = "Ir al comienzo de la página";
    SlotName[ italian ] = "All'inizio pagina";
    SlotName[ danish ] = "Til sidens begyndelse";
    SlotName[ swedish ] = "Till början av sidan";
    SlotName[ polish ] = "Na pocz¹tek strony";
    SlotName[ portuguese_brazilian ] = "GoToBeginOfPage";
    SlotName[ japanese ] = "Íß°¼Þ‚ÌŽn‚ß‚Ö";
    SlotName[ chinese_simplified ] = "תµ½Ò³Ê×";
    SlotName[ chinese_traditional ] = "Âà¨ì­¶­º";
    SlotName[ arabic ] = "Åáì ÈÏÇíÉ ÇáÕÝÍÉ";
    SlotName[ dutch ] = "Naar begin pagina";
    SlotName[ chinese_simplified ] = "תµ½Ò³Ê×";
    SlotName[ greek ] = "Ðñïò ôçí áñ÷Þ ôçò óåëßäáò";
    SlotName[ korean ] = "ÆäÀÌÁö ½ÃÀÛ¿¡";
    SlotName[ turkish ] = "Sayfa baþlangýcý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_START_OF_PAGE_SEL
{
    SlotName = "Bis Seitenanfang selektieren";
    SlotName [ english ] =  "Bis Seitenanfang selektieren";
    SlotName[ english_us ] = "Select to Page Begin";
    SlotName[ portuguese ] = "Seleccionar até início da página";
    SlotName[ russian ] = "Âûäåëèòü äî íà÷àëà ñòðàíèöû";
    SlotName[ dutch ] = "Tot aan paginabegin selecteren";
    SlotName[ french ] = "Sélect. jusqu'au début de la page";
    SlotName[ spanish ] = "Seleccionar hasta el comienzo de la página";
    SlotName[ italian ] = "Seleziona fino all'inizio della pagina";
    SlotName[ danish ] = "Marker til sidens begyndelse";
    SlotName[ swedish ] = "Markera till början av sidan";
    SlotName[ polish ] = "Zaznacz do pocz¹tku strony";
    SlotName[ portuguese_brazilian ] = "GoToBeginOfPageSel";
    SlotName[ japanese ] = "Íß°¼Þ‚ÌŽn‚߂܂őI‘ð";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁÒ³Ê×";
    SlotName[ chinese_traditional ] = "¿ï¨ú¦Ü­¶­º";
    SlotName[ arabic ] = "ÊÍÏíÏ ÍÊì ÈÏÇíÉ ÇáÕÝÍÉ";
    SlotName[ dutch ] = "Tot aan paginabegin selecteren";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁÒ³Ê×";
    SlotName[ greek ] = "ÅðéëïãÞ Ýùò ôçí áñ÷Þ ôçò óåëßäáò";
    SlotName[ korean ] = "ÆäÀÌÁö ½ÃÀÛ¿¡ ¼±ÅÃ";
    SlotName[ turkish ] = "Sayfanýn baþlangýcýna kadar seç";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_START_OF_PARA
{
    SlotName = "Zum Absatzanfang";
    SlotName [ english ] =  "Zum Absatzanfang";
    SlotName[ english_us ] = "To Paragraph Begin";
    SlotName[ portuguese ] = "Ir para início do parágrafo";
    SlotName[ russian ] = "Äî íà÷àëà àáçàöà";
    SlotName[ dutch ] = "Naar begin alinea";
    SlotName[ french ] = "Au début du paragraphe";
    SlotName[ spanish ] = "Ir al comienzo del párrafo";
    SlotName[ italian ] = "All'inizio del paragrafo";
    SlotName[ danish ] = "Til afsnittets begyndelse";
    SlotName[ swedish ] = "Till början av stycket";
    SlotName[ polish ] = "Na pocz¹tek akapitu";
    SlotName[ portuguese_brazilian ] = "GoToStartOfPara";
    SlotName[ japanese ] = "’i—Ž‚ÌŽn‚ß‚Ö";
    SlotName[ chinese_simplified ] = "תµ½¶ÎÂäÊ×¶Ë";
    SlotName[ chinese_traditional ] = "Âà¨ì¬q¸¨­ººÝ";
    SlotName[ arabic ] = "Åáì ÈÏÇíÉ ÇáÝÞÑÉ";
    SlotName[ dutch ] = "Naar begin alinea";
    SlotName[ chinese_simplified ] = "תµ½¶ÎÂäÊ×¶Ë";
    SlotName[ greek ] = "Ðñïò ôçí áñ÷Þ ôçò ðáñáãñÜöïõ";
    SlotName[ korean ] = "´Ü¶ô ½ÃÀÛÀ¸·Î";
    SlotName[ turkish ] = "Paragraf baþlangýcý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_START_OF_PARA_SEL
{
    SlotName = "Bis Absatzanfang selektieren";
    SlotName [ english ] =  "Bis Absatzanfang selektieren";
    SlotName[ english_us ] = "Select to Paragraph Begin";
    SlotName[ portuguese ] = "Seleccionar até início do parágrafo";
    SlotName[ russian ] = "Âûäåëèòü äî íà÷àëà àáçàöà";
    SlotName[ dutch ] = "Tot aan begin alinea selecteren";
    SlotName[ french ] = "Sélect. jusqu'au début du paragraphe";
    SlotName[ spanish ] = "Seleccionar hasta el comienzo del párrafo";
    SlotName[ italian ] = "Selezioni fini all'inizio del parametro";
    SlotName[ danish ] = "Marker til afsnittets begyndelse";
    SlotName[ swedish ] = "Markera till början av stycke";
    SlotName[ polish ] = "Zaznacz do pocz¹tku akapitu";
    SlotName[ portuguese_brazilian ] = "BeginParagraphSel";
    SlotName[ japanese ] = "’i—Ž‚ÌŽn‚߂܂őI‘ð";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁ¶ÎÂäÊ×¶Ë";
    SlotName[ chinese_traditional ] = "¿ï¨ú¦Ü¬q¸¨­ººÝ";
    SlotName[ arabic ] = "ÊÍÏíÏ ÍÊì ÈÏÇíÉ ÇáÝÞÑÉ";
    SlotName[ dutch ] = "Tot aan begin alinea selecteren";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁ¶ÎÂäÊ×¶Ë";
    SlotName[ greek ] = "ÅðéëïãÞ Ýùò ôçí áñ÷Þ ôçò ðáñáãñÜöïõ";
    SlotName[ korean ] = "´Ü¶ô ½ÃÀÛ¿¡ ¼±ÅÃ";
    SlotName[ turkish ] = "Paragraf baþlangýcýna kadar seç";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_START_OF_PREV_COLUMN
{
    SlotName = "Zum Anfang vorheriger Spalte";
    SlotName [ english ] =  "Zum Anfang vorheriger Spalte";
    SlotName[ english_us ] = "To Begin of Previous Column";
    SlotName[ portuguese ] = "Ir para início da coluna anterior";
    SlotName[ russian ] = "Äî íà÷àëà ïðåäûäóùåãî ñòîëáöà";
    SlotName[ dutch ] = "Naar begin vorige kolom";
    SlotName[ french ] = "Au début de la colonne précédente";
    SlotName[ spanish ] = "Ir al comienzo de la columna anterior";
    SlotName[ italian ] = "All'inizio della colonna precedente";
    SlotName[ danish ] = "Til forrige kolonnes begyndelse";
    SlotName[ swedish ] = "Till början av föregående kolumn";
    SlotName[ polish ] = "Na pocz¹tek poprzedniej kolumny";
    SlotName[ portuguese_brazilian ] = "GoToBeginOfPrevColumn";
    SlotName[ japanese ] = "‘O‚Ì—ñ‚ÌŽn‚ß‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÉÏÒ»ÁÐÊ×¶Ë";
    SlotName[ chinese_traditional ] = "Âà¨ì¤W¤@Äæ­ººÝ";
    SlotName[ arabic ] = "Åáì ÈÏÇíÉ ÇáÚãæÏ ÇáÓÇÈÞ";
    SlotName[ dutch ] = "Naar begin vorige kolom";
    SlotName[ chinese_simplified ] = "תµ½ÉÏÒ»ÁÐÊ×¶Ë";
    SlotName[ greek ] = "Ðñïò ôçí áñ÷Þ ôçò ðñïçãïýìåíçò óôÞëçò";
    SlotName[ korean ] = "ÀÌÀü ¿­ÀÇ ½ÃÀÛÀ¸·Î";
    SlotName[ turkish ] = "Önceki sütunun baþlangýcý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_START_OF_PREV_PAGE
{
    SlotName = "Zum Anfang vorheriger Seite";
    SlotName [ english ] =  "Zum Anfang vorheriger Seite";
    SlotName[ english_us ] = "To Begin of Previous Page";
    SlotName[ portuguese ] = "Ir para início da página anterior";
    SlotName[ russian ] = "Äî íà÷àëà ïðåäûäóùåé ñòðàíèöû";
    SlotName[ dutch ] = "Naar begin vorige pagina";
    SlotName[ french ] = "Au début de la page précédente";
    SlotName[ spanish ] = "Ir al comienzo de página anterior";
    SlotName[ italian ] = "All'inizio della pagina precedente";
    SlotName[ danish ] = "Til forrige sides begyndelse";
    SlotName[ swedish ] = "Till början av föregående sida";
    SlotName[ polish ] = "Na pocz¹tek poprzedniej strony";
    SlotName[ portuguese_brazilian ] = "GoToBeginOfPrevPage";
    SlotName[ japanese ] = "‘OÍß°¼Þ‚ÌŽn‚ß‚Ö";
    SlotName[ chinese_simplified ] = "תµ½ÉÏÒ»Ò³Ê×¶Ë";
    SlotName[ chinese_traditional ] = "Âà¨ì¤W¤@­¶­º";
    SlotName[ arabic ] = "Åáì ÈÏÇíÉ ÇáÕÝÍÉ ÇáÓÇÈÞÉ";
    SlotName[ dutch ] = "Naar begin vorige pagina";
    SlotName[ chinese_simplified ] = "תµ½ÉÏÒ»Ò³Ê×¶Ë";
    SlotName[ greek ] = "Ðñïò áñ÷Þ ðñïçãïýìåíçò óåëßäáò";
    SlotName[ korean ] = "ÀÌÀü ÆäÀÌÁöÀÇ ½ÃÀÛÀ¸·Î";
    SlotName[ turkish ] = "Önceki sayfanýn baþlangýcý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_START_OF_PREV_PAGE_SEL
{
    SlotName = "Bis Anfang vorheriger Seite selektieren";
    SlotName [ english ] =  "Bis Anfang vorheriger Seite selektieren";
    SlotName[ english_us ] = "Select to Begin of Previous Page";
    SlotName[ portuguese ] = "Seleccionar até início da página anterior";
    SlotName[ russian ] = "Âûäåëèòü äî íà÷àëà ïðåäûäóùåé ñòðàíèöû";
    SlotName[ dutch ] = "Tot begin vorige pagina selecteren";
    SlotName[ french ] = "Sélect. jusqu'au début de la page précédente";
    SlotName[ spanish ] = "Seleccionar hasta el comienzo de la página anterior";
    SlotName[ italian ] = "Seleziona fino all'inizio della pagina precedente";
    SlotName[ danish ] = "Marker til forrige sides begyndelse";
    SlotName[ swedish ] = "Markera till början av föregående sida";
    SlotName[ polish ] = "Zaznacz do pocz¹tku poprzedniej strony";
    SlotName[ portuguese_brazilian ] = "GoToBeginOfPrevPageSel";
    SlotName[ japanese ] = "‘OÍß°¼Þ‚ÌŽn‚߂܂őI‘ð";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁÉÏÒ»Ò³Ê×¶Ë";
    SlotName[ chinese_traditional ] = "¿ï¨ú¦Ü¤W¤@­¶­º";
    SlotName[ arabic ] = "ÊÍÏíÏ ÍÊì ÈÏÇíÉ ÇáÕÝÍÉ ÇáÓÇÈÞÉ";
    SlotName[ dutch ] = "Tot begin vorige pagina selecteren";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÖÁÉÏÒ»Ò³Ê×¶Ë";
    SlotName[ greek ] = "ÅðéëïãÞ Ýùò ôçí áñ÷Þ ôçò ðñïçãïýìåíçò óåëßäáò";
    SlotName[ korean ] = "ÀÌÀü ÆäÀÌÁöÀÇ ½ÃÀÛ ¼±ÅÃ";
    SlotName[ turkish ] = "Önceki sayfanýn baþlangýcýna kadar seç";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_START_TABLE
{
    SlotName = "Zum Tabellenanfang";
    SlotName [ english ] =  "Zum Tabellenanfang";
    SlotName[ english_us ] = "To Table Begin";
    SlotName[ portuguese ] = "Ir para início da tabela";
    SlotName[ russian ] = "Äî íà÷àëà òàáëèöû";
    SlotName[ dutch ] = "Naar tabelbegin";
    SlotName[ french ] = "Au début du tableau";
    SlotName[ spanish ] = "Ir al comienzo de la tabla";
    SlotName[ italian ] = "All'inizio della tabella";
    SlotName[ danish ] = "Til tabellens begyndelse";
    SlotName[ swedish ] = "Till början av tabell";
    SlotName[ polish ] = "Na pocz¹tek tabeli";
    SlotName[ portuguese_brazilian ] = "GoToBeginOfTable";
    SlotName[ japanese ] = "•\\‚ÌŽn‚ß‚Ö";
    SlotName[ chinese_simplified ] = "תµ½±í¸ñÊ×¶Ë";
    SlotName[ chinese_traditional ] = "Âà¨ìªí®æ­ººÝ";
    SlotName[ arabic ] = "Åáì ÈÏÇíÉ ÇáÌÏæá";
    SlotName[ dutch ] = "Naar tabelbegin";
    SlotName[ chinese_simplified ] = "תµ½±í¸ñÊ×¶Ë";
    SlotName[ greek ] = "Ðñïò ôçí áñ÷Þ ôïõ ðßíáêá";
    SlotName[ korean ] = "Ç¥ ½ÃÀÛ¿¡";
    SlotName[ turkish ] = "Tablo baþlangýcý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_STAT_HYPERLINKS
{
    SlotName = "Hyperlinks aktiv";
    SlotName [ english ] =  "Hyperlinks aktiv";
    SlotName[ english_us ] = "Hyperlinks Active";
    SlotName[ portuguese ] = "Activar hiperligações";
    SlotName[ russian ] = "Àêòèâíûå ãèïåðññûëêè ";
    SlotName[ dutch ] = "Hyperlinks actief";
    SlotName[ french ] = "Activer hyperliens";
    SlotName[ spanish ] = "Activar Hiperenlaces";
    SlotName[ italian ] = "Hyperlink attivi";
    SlotName[ danish ] = "Hyperlinks aktive";
    SlotName[ swedish ] = "Hyperlänkar aktiva";
    SlotName[ polish ] = "Aktywne hiper³¹cza";
    SlotName[ portuguese_brazilian ] = "ExecHyperlinks";
    SlotName[ japanese ] = "ʲÊß°ØÝ¸ µÝ";
    SlotName[ chinese_simplified ] = "¼¤»î³¬Á´½Ó";
    SlotName[ chinese_traditional ] = "¿E¬¡¶W³sµ²";
    SlotName[ arabic ] = "ÇÑÊÈÇØÇÊ ÊÔÚÈíÉ äÔØÉ";
    SlotName[ dutch ] = "Hyperlinks actief";
    SlotName[ chinese_simplified ] = "¼¤»î³¬Á´½Ó";
    SlotName[ greek ] = "Åíåñãïðïßçóç õðåñ-óýíäåóçò";
    SlotName[ korean ] = "ÇÏÀÌÆÛ ¸µÅ© Ȱ¼ºÈ­";
    SlotName[ turkish ] = "Hyperlink'ler etkin";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_STAT_PAGE
{
    SlotName = "Seitennummer";
    SlotName [ english ] =  "Seitennummer";
    SlotName[ english_us ] = "Page Number";
    SlotName[ portuguese ] = "Número de página";
    SlotName[ russian ] = "Íîìåð ñòðàíèöû";
    SlotName[ dutch ] = "Paginanummer";
    SlotName[ french ] = "Numéro de page";
    SlotName[ spanish ] = "Número de página";
    SlotName[ italian ] = "Numero di pagina";
    SlotName[ danish ] = "Sidetal";
    SlotName[ swedish ] = "Sidnummer";
    SlotName[ polish ] = "Numer strony";
    SlotName[ portuguese_brazilian ] = "StatePageNumber";
    SlotName[ japanese ] = "Íß°¼Þ”ԍ†";
    SlotName[ chinese_simplified ] = "Ò³Âë";
    SlotName[ chinese_traditional ] = "­¶­±¸¹½X";
    SlotName[ arabic ] = "ÑÞã ÇáÕÝÍÉ";
    SlotName[ dutch ] = "Paginanummer";
    SlotName[ chinese_simplified ] = "Ò³Âë";
    SlotName[ greek ] = "Áñéèìüò óåëßäáò";
    SlotName[ korean ] = "ÆäÀÌÁö ¹øÈ£";
    SlotName[ turkish ] = "Sayfa numarasý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_STAT_SELMODE
{
    SlotName = "Selektionsmodus";
    SlotName [ english ] =  "Selektionsmodus";
    SlotName[ english_us ] = "Selection Mode";
    SlotName[ portuguese ] = "Modo de selecção";
    SlotName[ russian ] = "Ðåæèì âûäåëåíèÿ";
    SlotName[ dutch ] = "Selectiemodus";
    SlotName[ french ] = "Mode Sélection";
    SlotName[ spanish ] = "Modo Selección";
    SlotName[ italian ] = "Modo selezione";
    SlotName[ danish ] = "Udvalgsmodus";
    SlotName[ swedish ] = "Markeringsläge";
    SlotName[ polish ] = "Tryb selekcji";
    SlotName[ portuguese_brazilian ] = "SelectionMode";
    SlotName[ japanese ] = "‘I‘ðÓ°ÄÞ";
    SlotName[ chinese_simplified ] = "Ñ¡Ôñģʽ";
    SlotName[ chinese_traditional ] = "¿ï¨ú¼Ò¦¡";
    SlotName[ arabic ] = "æÖÚ ÇáÊÍÏíÏ";
    SlotName[ dutch ] = "Selectiemodus";
    SlotName[ chinese_simplified ] = "Ñ¡Ôñģʽ";
    SlotName[ greek ] = "ÊáôÜóôáóç åðéëïãÞò";
    SlotName[ korean ] = "¼±Åà ¸ðµå";
    SlotName[ turkish ] = "Seçim kipi";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_STAT_TEMPLATE
{
    SlotName = "Seitenvorlage";
    SlotName [ english ] =  "Seitenvorlage";
    SlotName[ english_us ] = "Page Style";
    SlotName[ portuguese ] = "Estilo de página";
    SlotName[ russian ] = "Ñòèëü ñòðàíèöû";
    SlotName[ dutch ] = "Pagina-opmaakprofiel";
    SlotName[ french ] = "Style de page";
    SlotName[ spanish ] = "Estilo de página";
    SlotName[ italian ] = "Modello di pagina";
    SlotName[ danish ] = "Sidetypografi";
    SlotName[ swedish ] = "Sidformatmall";
    SlotName[ polish ] = "Styl strony";
    SlotName[ portuguese_brazilian ] = "PageStyleName";
    SlotName[ japanese ] = "Íß°¼Þ½À²Ù";
    SlotName[ chinese_simplified ] = "Ò³ÃæÑùʽ";
    SlotName[ chinese_traditional ] = "­¶­±¼Ë¦¡";
    SlotName[ arabic ] = "äãØ ÕÝÍÉ";
    SlotName[ dutch ] = "Pagina-opmaakprofiel";
    SlotName[ chinese_simplified ] = "Ò³ÃæÑùʽ";
    SlotName[ greek ] = "Ðñüôõðï óåëßäáò";
    SlotName[ korean ] = "ÆäÀÌÁö À¯Çü";
    SlotName[ turkish ] = "Sayfa þablonu";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TABLE_ADJUST_CELLS
{
    SlotName = "Optimale Spaltenbreite";
    SlotName [ english ] =  "Optimale Spaltenbreite";
    SlotName[ english_us ] = "Optimal Column Width";
    SlotName[ portuguese ] = "Largura da coluna";
    SlotName[ russian ] = "Îïòèìàëüíàÿ øèðèíà ñòîëáöà";
    SlotName[ dutch ] = "Optimale kolombreedte";
    SlotName[ french ] = "Largeur de colonne optimale";
    SlotName[ spanish ] = "Ancho óptimo de columnas";
    SlotName[ italian ] = "Larghezza colonna ottimale";
    SlotName[ danish ] = "Optimal kolonnebredde";
    SlotName[ swedish ] = "Optimal kolumnbredd";
    SlotName[ polish ] = "Optymalna szerokoϾ kolumn";
    SlotName[ portuguese_brazilian ] = "TableCellsAdjust";
    SlotName[ japanese ] = "Å“K‚È—ñ‚Ì•";
    SlotName[ chinese_simplified ] = "×î¼ÑÁпí";
    SlotName[ chinese_traditional ] = "³ÌÓìÄæ¼e";
    SlotName[ arabic ] = "ÇáÚÑÖ ÇáÃãËá ááÚãæÏ";
    SlotName[ dutch ] = "Optimale kolombreedte";
    SlotName[ chinese_simplified ] = "×î¼ÑÁпí";
    SlotName[ greek ] = "ÂÝëôéóôï ðëÜôïò óôÞëçò";
    SlotName[ korean ] = "ÃÖÀûÀÇ ¿­ ³Êºñ";
    SlotName[ turkish ] = "En uygun sütun geniþliði";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TABLE_AUTOSUM
{
    SlotName = "Summe";
    SlotName [ english ] =  "Sum";
    SlotName[ english_us ] = "Sum";
    SlotName[ portuguese ] = "Soma";
    SlotName[ russian ] = "Sum";
    SlotName[ greek ] = "¢èñïéóìá";
    SlotName[ dutch ] = "Som";
    SlotName[ french ] = "Somme";
    SlotName[ spanish ] = "Sum";
    SlotName[ italian ] = "Sum";
    SlotName[ danish ] = "Sum";
    SlotName[ swedish ] = "Summa";
    SlotName[ polish ] = "Suma";
    SlotName[ portuguese_brazilian ] = "Sum";
    SlotName[ japanese ] = "µ°Ä Sum";
    SlotName[ korean ] = "Sum";
    SlotName[ chinese_simplified ] = "×ܼÆ";
    SlotName[ chinese_traditional ] = "¤p­p";
    SlotName[ turkish ] = "Sum";
    SlotName[ arabic ] = "ÇáãÌãæÚ";
};
SfxSlotInfo FN_TABLE_BALANCE_CELLS
{
    SlotName = "Spalten gleichmäßig verteilen";
    SlotName [ english ] =  "Spalten gleichmäßig verteilen";
    SlotName[ english_us ] = "Space Columns Equally";
    SlotName[ portuguese ] = "Ordenar colunas";
    SlotName[ russian ] = "Ðàñïðåäåëèòü ñòîëáöû ðàâíîìåðíî";
    SlotName[ dutch ] = "Kolommen gelijkmatig verdelen";
    SlotName[ french ] = "Espace équilibré entre les colonnes";
    SlotName[ spanish ] = "Ordenar columnas";
    SlotName[ italian ] = "Distribuisci le colonne uniformemente";
    SlotName[ danish ] = "Fordel kolonner jævnt";
    SlotName[ swedish ] = "Fördela kolumnerna jämnt";
    SlotName[ polish ] = "Roz³ó¿ równomiernie kolumny";
    SlotName[ portuguese_brazilian ] = "ArrangeColumns";
    SlotName[ japanese ] = "—ñ‚̋ϓ™•ªŠ„";
    SlotName[ chinese_simplified ] = "ƽ¾ù·ÖÅäÁпí";
    SlotName[ chinese_traditional ] = "¹ïºÙ½Õ¾ãÄæ¼e";
    SlotName[ arabic ] = "ÊæÒíÚ ÇáÃÚãÏÉ ÈÇáÊÓÇæí";
    SlotName[ dutch ] = "Kolommen gelijkmatig verdelen";
    SlotName[ chinese_simplified ] = "ƽ¾ù·ÖÅäÁпí";
    SlotName[ greek ] = "ºóç êáôáíïìÞ óôçëþí";
    SlotName[ korean ] = "¿­ °£°Ý µ¿ÀÏÇϰÔ";
    SlotName[ turkish ] = "Sütunlarý geniþliklerini eþitle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TABLE_BALANCE_ROWS
{
    SlotName = "Zeilen gleichmäßig verteilen";
    SlotName [ english ] =  "Zeilen gleichmäßig verteilen";
    SlotName[ english_us ] = "Space Rows Equally ";
    SlotName[ portuguese ] = "Ordenar linhas";
    SlotName[ russian ] = "Ðàñïðåäåëèòü ñòðîêè ðàâíîìåðíî";
    SlotName[ dutch ] = "Rijen gelijkmatig verdelen";
    SlotName[ french ] = "Espace équilibré entre les lignes";
    SlotName[ spanish ] = "Ordenar filas";
    SlotName[ italian ] = "Distribuisci le righe uniformemente";
    SlotName[ danish ] = "Fordel rækker jævnt";
    SlotName[ swedish ] = "Fördela raderna jämnt";
    SlotName[ polish ] = "Roz³ó¿ równomiernie wiersze";
    SlotName[ portuguese_brazilian ] = "ArrangeRows";
    SlotName[ japanese ] = "s‚̋ϓ™•ªŠ„";
    SlotName[ chinese_simplified ] = "ƽ¾ù·ÖÅäÐиß";
    SlotName[ chinese_traditional ] = "¹ïºÙ¦a½Õ¾ã¦æ°ª";
    SlotName[ arabic ] = "ÊæÒíÚ ÇáÕÝæÝ ÈÇáÊÓÇæí";
    SlotName[ dutch ] = "Rijen gelijkmatig verdelen";
    SlotName[ chinese_simplified ] = "ƽ¾ù·ÖÅäÐиß";
    SlotName[ greek ] = "ºóç êáôáíïìÞ ãñáììþí";
    SlotName[ korean ] = "Çà °£°Ý µ¿ÀÏÇϰÔ";
    SlotName[ turkish ] = "Satýr yüksekliklerini eþitle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TABLE_DELETE_COL
{
    SlotName = "Spalte löschen";
    SlotName [ english ] =  "Spalte löschen";
    SlotName[ english_us ] = "Delete Column";
    SlotName[ portuguese ] = "Eliminar coluna";
    SlotName[ russian ] = "Óäàëèòü ñòîëáåö";
    SlotName[ dutch ] = "Kolom wissen";
    SlotName[ french ] = "Supprimer la colonne";
    SlotName[ spanish ] = "Eliminar columna";
    SlotName[ italian ] = "Elimina colonna";
    SlotName[ danish ] = "Slet kolonne";
    SlotName[ swedish ] = "Radera kolumn";
    SlotName[ polish ] = "Usuñ kolumnê";
    SlotName[ portuguese_brazilian ] = "TableColumnsDelete";
    SlotName[ japanese ] = "—ñ‚̍폜";
    SlotName[ chinese_simplified ] = "ɾ³ýÁÐ";
    SlotName[ chinese_traditional ] = "§R°£Äæ";
    SlotName[ arabic ] = "ÍÐÝ ÚãæÏ";
    SlotName[ dutch ] = "Kolom wissen";
    SlotName[ chinese_simplified ] = "ɾ³ýÁÐ";
    SlotName[ greek ] = "ÄéáãñáöÞ óôÞëçò";
    SlotName[ korean ] = "¿­ »èÁ¦";
    SlotName[ turkish ] = "Sütunu sil";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TABLE_DELETE_ROW
{
    SlotName = "Zeile löschen";
    SlotName [ english ] =  "Zeile löschen";
    SlotName[ english_us ] = "Delete Row";
    SlotName[ portuguese ] = "Eliminar linha";
    SlotName[ russian ] = "Óäàëèòü ñòðîêó";
    SlotName[ dutch ] = "Rij wissen";
    SlotName[ french ] = "Supprimer la ligne";
    SlotName[ spanish ] = "Eliminar fila";
    SlotName[ italian ] = "Elimina riga";
    SlotName[ danish ] = "Slet række";
    SlotName[ swedish ] = "Radera rad";
    SlotName[ polish ] = "Usuñ wiersz";
    SlotName[ portuguese_brazilian ] = "TableRowDelete";
    SlotName[ japanese ] = "s‚̍폜";
    SlotName[ chinese_simplified ] = "ɾ³ýÐÐ";
    SlotName[ chinese_traditional ] = "§R°£¦æ";
    SlotName[ arabic ] = "ÍÐÝ ÕÝ";
    SlotName[ dutch ] = "Rij wissen";
    SlotName[ chinese_simplified ] = "ɾ³ýÐÐ";
    SlotName[ greek ] = "ÄéáãñáöÞ ãñáììÞò";
    SlotName[ korean ] = "Çà »èÁ¦";
    SlotName[ turkish ] = "Satýrý sil";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TABLE_INSERT_COL
{
    SlotName = "Spalte einfügen";
    SlotName [ english ] =  "Spalte einfügen";
    SlotName[ english_us ] = "Insert Columns";
    SlotName[ portuguese ] = "Inserir coluna";
    SlotName[ russian ] = "Âñòàâèòü ñòîëáåö";
    SlotName[ dutch ] = "Kolom invoegen";
    SlotName[ french ] = "Insérer une colonne";
    SlotName[ spanish ] = "Insertar columna";
    SlotName[ italian ] = "Inserisci colonna";
    SlotName[ danish ] = "Indsæt kolonne";
    SlotName[ swedish ] = "Infoga kolumn";
    SlotName[ polish ] = "Wstaw kolumnê";
    SlotName[ portuguese_brazilian ] = "TableColumnsInsert";
    SlotName[ japanese ] = "—ñ‚Ì‘}“ü";
    SlotName[ chinese_simplified ] = "²åÈëÁÐ";
    SlotName[ chinese_traditional ] = "´¡¤JÄæ";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÚãæÏ";
    SlotName[ dutch ] = "Kolom invoegen";
    SlotName[ chinese_simplified ] = "²åÈëÁÐ";
    SlotName[ greek ] = "ÅéóáãùãÞ óôÞëçò";
    SlotName[ korean ] = "¿­ »ðÀÔ";
    SlotName[ turkish ] = "Sütun ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TABLE_INSERT_ROW
{
    SlotName = "Zeile einfügen";
    SlotName [ english ] =  "Zeile einfügen";
    SlotName[ english_us ] = "Insert Rows";
    SlotName[ portuguese ] = "Inserir linha";
    SlotName[ russian ] = "Âñòàâèòü ñòðîêó";
    SlotName[ dutch ] = "Rij invoegen";
    SlotName[ french ] = "Insérer une ligne";
    SlotName[ spanish ] = "Insertar fila";
    SlotName[ italian ] = "Inserisci righe";
    SlotName[ danish ] = "Indsæt række";
    SlotName[ swedish ] = "Infoga rad";
    SlotName[ polish ] = "Wstaw wiersz";
    SlotName[ portuguese_brazilian ] = "TableRowsInsert";
    SlotName[ japanese ] = "s‚Ì‘}“ü";
    SlotName[ chinese_simplified ] = "²åÈëÐÐ";
    SlotName[ chinese_traditional ] = "´¡¤J¦C";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÕÝ";
    SlotName[ dutch ] = "Rij invoegen";
    SlotName[ chinese_simplified ] = "²åÈëÐÐ";
    SlotName[ greek ] = "ÅéóáãùãÞ ãñáììÞò";
    SlotName[ korean ] = "Çà»ðÀÔ";
    SlotName[ turkish ] = "Satýr ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TABLE_MERGE_CELLS
{
    SlotName = "Zellen verbinden";
    SlotName [ english ] =  "Zellen verbinden";
    SlotName[ english_us ] = "Merge Cells";
    SlotName[ portuguese ] = "Unir células";
    SlotName[ russian ] = "Îáúåäèíèòü ÿ÷åéêè";
    SlotName[ dutch ] = "Cellen verbinden";
    SlotName[ french ] = "Fusionner les cellules ";
    SlotName[ spanish ] = "Unir celdas";
    SlotName[ italian ] = "Collega celle";
    SlotName[ danish ] = "Flet celler";
    SlotName[ swedish ] = "Förbind celler";
    SlotName[ polish ] = "Scal komórki";
    SlotName[ portuguese_brazilian ] = "TableCellsMerge";
    SlotName[ japanese ] = "¾Ù‚ÌŒ‹‡";
    SlotName[ chinese_simplified ] = "ºÏ²¢µ¥Ôª¸ñ";
    SlotName[ chinese_traditional ] = "¦X¨ÖÀx¦s®æ";
    SlotName[ arabic ] = "ÏãÌ ÇáÎáÇíÇ";
    SlotName[ dutch ] = "Cellen verbinden";
    SlotName[ chinese_simplified ] = "ºÏ²¢µ¥Ôª¸ñ";
    SlotName[ greek ] = "¸íùóç êåëéþí";
    SlotName[ korean ] = "¼¿ º´ÇÕ";
    SlotName[ turkish ] = "Hücreleri birleþtir";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TABLE_MERGE_TABLE
{
    SlotName = "Tabelle zusammenfassen";
    SlotName [ english ] =  "Tabelle zusammenfassen";
    SlotName[ english_us ] = "Merge Table";
    SlotName[ portuguese ] = "Unir tabela";
    SlotName[ russian ] = "Îáúåäèíèòü òàáëèöó";
    SlotName[ dutch ] = "Tabel samenvatten";
    SlotName[ french ] = "Fusionner le tableau";
    SlotName[ spanish ] = "Unir tabla";
    SlotName[ italian ] = "Unisci tabella";
    SlotName[ danish ] = "Flet tabeller";
    SlotName[ swedish ] = "Sammanfatta tabell";
    SlotName[ polish ] = "Scal tabelê";
    SlotName[ portuguese_brazilian ] = "MergeTable";
    SlotName[ japanese ] = "•\\‚ÌŒ‹‡";
    SlotName[ chinese_simplified ] = "ºÏ²¢±í¸ñ";
    SlotName[ chinese_traditional ] = "¦X¨Öªí®æ";
    SlotName[ arabic ] = "ÏãÌ ÌÏæá";
    SlotName[ dutch ] = "Tabel samenvatten";
    SlotName[ chinese_simplified ] = "ºÏ²¢±í¸ñ";
    SlotName[ greek ] = "Óõã÷þíåõóç ðéíÜêùí";
    SlotName[ korean ] = "Ç¥ º´ÇÕ";
    SlotName[ turkish ] = "Tabloyu birleþtir";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TABLE_MODE_FIX
{
    SlotName = "Tabelle: fix";
    SlotName [ english ] =  "Tabelle: fix";
    SlotName[ english_us ] = "Table: Fixed";
    SlotName[ portuguese ] = "Tabela: fixa";
    SlotName[ russian ] = "Òàáëèöà : ôèêñèðîâàíàÿ";
    SlotName[ dutch ] = "Tabel: vast";
    SlotName[ french ] = "Tableau : fixe";
    SlotName[ spanish ] = "Tabla: fija";
    SlotName[ italian ] = "Tabella: fissa";
    SlotName[ danish ] = "Tabel: fast";
    SlotName[ swedish ] = "Tabell: fast";
    SlotName[ polish ] = "Tabela : sta³a";
    SlotName[ portuguese_brazilian ] = "TableModeFix";
    SlotName[ japanese ] = "•\\:ŒÅ’è";
    SlotName[ chinese_simplified ] = "±í¸ñ¹Ì¶¨";
    SlotName[ chinese_traditional ] = "ªí®æ©T©w";
    SlotName[ arabic ] = "ÌÏæá: ËÇÈÊ";
    SlotName[ dutch ] = "Tabel: vast";
    SlotName[ chinese_simplified ] = "±í¸ñ¹Ì¶¨";
    SlotName[ greek ] = "Ðßíáêáò: Óôáèåñüò";
    SlotName[ korean ] = "Ç¥:°íÁ¤µÊ";
    SlotName[ turkish ] = "Tablo: Sabit";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TABLE_MODE_FIX_PROP
{
    SlotName = "Tabelle: fix, proportional";
    SlotName [ english ] =  "Tabelle: fix, proportional";
    SlotName[ english_us ] = "Table: Fixed, Proportional";
    SlotName[ portuguese ] = "Tabela: fixa, proporcional";
    SlotName[ russian ] = "Òàáëèöà: ôèêñèðîâàííàÿ , ïðîïîðöèîíàëüíàÿ";
    SlotName[ dutch ] = "Tabel; vast, proportioneel";
    SlotName[ french ] = "Tableau : fixe, proportionnel";
    SlotName[ spanish ] = "Tabla: fija, proporcional";
    SlotName[ italian ] = "Tabella: fissa, proporzionale";
    SlotName[ danish ] = "Tabel: fast, proportional";
    SlotName[ swedish ] = "Tabell: fast, proportionell";
    SlotName[ polish ] = "Tabela : sta³a, proporcjonalna";
    SlotName[ portuguese_brazilian ] = "TableModeFixProp";
    SlotName[ japanese ] = "•\\:ŒÅ’èA”ä—á";
    SlotName[ chinese_simplified ] = "±í¸ñ¹Ì¶¨³É±ÈÀý";
    SlotName[ chinese_traditional ] = "ªí®æ©T©w¦¨¤ñ¨Ò";
    SlotName[ arabic ] = "ÌÏæá: ËÇÈÊ¡ ãÊäÇÓÈ";
    SlotName[ dutch ] = "Tabel; vast, proportioneel";
    SlotName[ chinese_simplified ] = "±í¸ñ¹Ì¶¨³É±ÈÀý";
    SlotName[ greek ] = "Ðßíáêáò: Óôáèåñüò, áíáëïãéêüò";
    SlotName[ korean ] = "Ç¥: °íÁ¤,ºñ·Ê";
    SlotName[ turkish ] = "Tablo: Sabit, orantýlý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TABLE_MODE_VARIABLE
{
    SlotName = "Tabelle: variabel";
    SlotName [ english ] =  "Tabelle: variabel";
    SlotName[ english_us ] = "Table: Variable";
    SlotName[ portuguese ] = "Tabela: variável";
    SlotName[ russian ] = "Òàáëèöà: èçìåíÿåìàÿ";
    SlotName[ dutch ] = "Tabel: variabel";
    SlotName[ french ] = "Tableau : variable";
    SlotName[ spanish ] = "Tabla: variable";
    SlotName[ italian ] = "Tabella: variabile";
    SlotName[ danish ] = "Tabel: variabel";
    SlotName[ swedish ] = "Tabell: variabel";
    SlotName[ polish ] = "Tabela: zmienna";
    SlotName[ portuguese_brazilian ] = "TableModeVariable";
    SlotName[ japanese ] = "•\\:•ϐ”";
    SlotName[ chinese_simplified ] = "±í¸ñ¿É±ä";
    SlotName[ chinese_traditional ] = "ªí®æ¥iÅÜ";
    SlotName[ arabic ] = "ÌÏæá: ãÊÛíÑ";
    SlotName[ dutch ] = "Tabel: variabel";
    SlotName[ chinese_simplified ] = "±í¸ñ¿É±ä";
    SlotName[ greek ] = "Ðßíáêáò: Ìåôáâëçôüò";
    SlotName[ korean ] = "Ç¥:º¯¼ö";
    SlotName[ turkish ] = "Tablo: Deðiþken";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TABLE_OPTIMAL_HEIGHT
{
    SlotName = "Optimale Zeilenhöhe";
    SlotName [ english ] =  "Optimale Zeilenhöhe";
    SlotName[ english_us ] = "Optimal Row Height";
    SlotName[ portuguese ] = "Altura da linha";
    SlotName[ russian ] = "Îïòèìàëüíàÿ âûñîòà ñòðîêè";
    SlotName[ dutch ] = "Optimale rijhoogte";
    SlotName[ french ] = "Hauteur de ligne optimale";
    SlotName[ spanish ] = "Altura óptima de filas";
    SlotName[ italian ] = "Altezza riga ottimale";
    SlotName[ danish ] = "Optimal rækkehøjde";
    SlotName[ swedish ] = "Optimal radhöjd";
    SlotName[ polish ] = "Optymalna wysokoϾ wierszy";
    SlotName[ portuguese_brazilian ] = "SetOptimalRowHeight";
    SlotName[ japanese ] = "Å“K‚ȍs‚̍‚‚³";
    SlotName[ chinese_simplified ] = "×î¼ÑÐиß";
    SlotName[ chinese_traditional ] = "³ÌÓìÄæ°ª";
    SlotName[ arabic ] = "ÇáÇÑÊÝÇÚ ÇáÃãËá ááÕÝ";
    SlotName[ dutch ] = "Optimale rijhoogte";
    SlotName[ chinese_simplified ] = "×î¼ÑÐиß";
    SlotName[ greek ] = "ÂÝëôéóôï ýøïò ãñáììÞò";
    SlotName[ korean ] = "ÃÖÀûÈ­µÈ Çà ³ôÀÌ";
    SlotName[ turkish ] = "En uygun satýr yüksekliði";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TABLE_SELECT_ALL
{
    SlotName = "Tabelle selektieren";
    SlotName [ english ] =  "Tabelle selektieren";
    SlotName[ english_us ] = "Select Table";
    SlotName[ portuguese ] = "Seleccionar tabela";
    SlotName[ russian ] = "Âûäåëèòü òàáëèöó";
    SlotName[ dutch ] = "Tabel selecteren";
    SlotName[ french ] = "Sélectionner tableau";
    SlotName[ spanish ] = "Seleccionar tabla";
    SlotName[ italian ] = "Seleziona tabella";
    SlotName[ danish ] = "Marker tabel";
    SlotName[ swedish ] = "Markera tabell";
    SlotName[ polish ] = "Zaznacz tabelê";
    SlotName[ portuguese_brazilian ] = "TableSelect";
    SlotName[ japanese ] = "•\\‚Ì‘I‘ð";
    SlotName[ chinese_simplified ] = "Ñ¡Ôñ±í¸ñ";
    SlotName[ chinese_traditional ] = "¿ï¨úªí®æ";
    SlotName[ arabic ] = "ÊÍÏíÏ ÌÏæá";
    SlotName[ dutch ] = "Tabel selecteren";
    SlotName[ chinese_simplified ] = "Ñ¡Ôñ±í¸ñ";
    SlotName[ greek ] = "ÅðéëïãÞ ðßíáêá";
    SlotName[ korean ] = "Ç¥ ¼±ÅÃ";
    SlotName[ turkish ] = "Tablo seç";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TABLE_SELECT_COL
{
    SlotName = "Spalte selektieren";
    SlotName [ english ] =  "Spalte selektieren";
    SlotName[ english_us ] = "Select Column";
    SlotName[ portuguese ] = "Seleccionar coluna";
    SlotName[ russian ] = "Âûäåëèòü ñòîëáåö";
    SlotName[ dutch ] = "Kolom selecteren";
    SlotName[ french ] = "Sélectionner colonne";
    SlotName[ spanish ] = "Seleccionar columna";
    SlotName[ italian ] = "Seleziona colonna";
    SlotName[ danish ] = "Marker kolonne";
    SlotName[ swedish ] = "Markera kolumn";
    SlotName[ polish ] = "Zaznacz tabelê";
    SlotName[ portuguese_brazilian ] = "TableColumnSelect";
    SlotName[ japanese ] = "—ñ‚Ì‘I‘ð";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÁÐ";
    SlotName[ chinese_traditional ] = "¿ï¨úÄæ";
    SlotName[ arabic ] = "ÊÍÏíÏ ÚãæÏ";
    SlotName[ dutch ] = "Kolom selecteren";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÁÐ";
    SlotName[ greek ] = "ÅðéëïãÞ óôÞëçò";
    SlotName[ korean ] = "¿­ ¼±ÅÃ";
    SlotName[ turkish ] = "Sütun seç";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TABLE_SELECT_ROW
{
    SlotName = "Zeile selektieren";
    SlotName [ english ] =  "Zeile selektieren";
    SlotName[ english_us ] = "Select Rows";
    SlotName[ portuguese ] = "Seleccionar linha";
    SlotName[ russian ] = "Âûäåëèòü ñòðîêó";
    SlotName[ dutch ] = "Rij selecteren";
    SlotName[ french ] = "Sélectionner ligne";
    SlotName[ spanish ] = "Selecionar fila";
    SlotName[ italian ] = "Seleziona riga";
    SlotName[ danish ] = "Marker række";
    SlotName[ swedish ] = "Markera rad";
    SlotName[ polish ] = "Wybierz wiersz";
    SlotName[ portuguese_brazilian ] = "TableRowSelect";
    SlotName[ japanese ] = "s‚Ì‘I‘ð";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÐÐ";
    SlotName[ chinese_traditional ] = "¿ï¨ú¦æ";
    SlotName[ arabic ] = "ÊÍÏíÏ ÕÝ";
    SlotName[ dutch ] = "Rij selecteren";
    SlotName[ chinese_simplified ] = "Ñ¡ÔñÐÐ";
    SlotName[ greek ] = "ÅðéëïãÞ ãñáììÞò";
    SlotName[ korean ] = "Çà ¼±ÅÃ";
    SlotName[ turkish ] = "Satýr seç";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TABLE_SET_READ_ONLY_CELLS
{
    SlotName = "Zelle schützen";
    SlotName [ english ] =  "Zelle schützen";
    SlotName[ english_us ] = "Protect Cells";
    SlotName[ portuguese ] = "Proteger célula";
    SlotName[ russian ] = "Çàùèòà ÿ÷åéêè";
    SlotName[ dutch ] = "Cel beveiligen";
    SlotName[ french ] = "Protection";
    SlotName[ spanish ] = "Proteger celda";
    SlotName[ italian ] = "Proteggi cella";
    SlotName[ danish ] = "Beskyt celle";
    SlotName[ swedish ] = "Skydda cell";
    SlotName[ polish ] = "Chroñ komórkê";
    SlotName[ portuguese_brazilian ] = "SetTableCellsRead-only";
    SlotName[ japanese ] = "¾Ù‚̕یì";
    SlotName[ chinese_simplified ] = "µ¥Ôª¸ñ±£»¤";
    SlotName[ chinese_traditional ] = "«OÅ@Àx¦s®æ";
    SlotName[ arabic ] = "ÍãÇíÉ ÇáÎáíÉ";
    SlotName[ dutch ] = "Cel beveiligen";
    SlotName[ chinese_simplified ] = "µ¥Ôª¸ñ±£»¤";
    SlotName[ greek ] = "Ðñïóôáóßá êåëéïý";
    SlotName[ korean ] = "¼¿ º¸È£";
    SlotName[ turkish ] = "Hücreyi koru";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TABLE_SET_ROW_HEIGHT
{
    SlotName = "Zeilenhöhe";
    SlotName [ english ] =  "Zeilenhöhe";
    SlotName[ english_us ] = "Row Height";
    SlotName[ portuguese ] = "Altura da linha";
    SlotName[ russian ] = "Âûñîòà ñòðîêè";
    SlotName[ dutch ] = "Rijhoogte";
    SlotName[ french ] = "Hauteur de ligne";
    SlotName[ spanish ] = "Altura de fila";
    SlotName[ italian ] = "Altezza riga";
    SlotName[ danish ] = "Rækkehøjde";
    SlotName[ swedish ] = "Radhöjd";
    SlotName[ polish ] = "WysokoϾ wierszy";
    SlotName[ portuguese_brazilian ] = "SetTableRowHeight";
    SlotName[ japanese ] = "s‚̍‚‚³";
    SlotName[ chinese_simplified ] = "Ðиß";
    SlotName[ chinese_traditional ] = "¦æ°ª";
    SlotName[ arabic ] = "ÇÑÊÝÇÚ ÇáÕÝ";
    SlotName[ dutch ] = "Rijhoogte";
    SlotName[ chinese_simplified ] = "Ðиß";
    SlotName[ greek ] = "¾øïò ãñáììÞò";
    SlotName[ korean ] = "Çà ³ôÀÌ";
    SlotName[ turkish ] = "Satýr yüksekliði";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TABLE_SPLIT_CELLS
{
    SlotName = "Zelle teilen";
    SlotName [ english ] =  "Zelle teilen";
    SlotName[ english_us ] = "Split Cells";
    SlotName[ portuguese ] = "Dividir células";
    SlotName[ russian ] = "Ðàçáèòü ÿ÷åéêè";
    SlotName[ dutch ] = "Cel splitsen";
    SlotName[ french ] = "Scinder la celulle";
    SlotName[ spanish ] = "Dividir celdas";
    SlotName[ italian ] = "Dividi celle";
    SlotName[ danish ] = "Opdel celle";
    SlotName[ swedish ] = "Dela cell";
    SlotName[ polish ] = "Podziel komórkê";
    SlotName[ portuguese_brazilian ] = "TableCellSplit";
    SlotName[ japanese ] = "¾Ù‚Ì•ªŠ„";
    SlotName[ chinese_simplified ] = "·Ö¸ôµ¥Ôª¸ñ";
    SlotName[ chinese_traditional ] = "¤À¶}Àx¦s®æ";
    SlotName[ arabic ] = "ÊÞÓíã ÇáÎáíÉ";
    SlotName[ dutch ] = "Cel splitsen";
    SlotName[ chinese_simplified ] = "·Ö¸ôµ¥Ôª¸ñ";
    SlotName[ greek ] = "Äéáßñåóç êåëéïý";
    SlotName[ korean ] = "¼¿ ³ª´©±â";
    SlotName[ turkish ] = "Hücreyi böl";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TABLE_SPLIT_TABLE
{
    SlotName = "Tabelle auftrennen";
    SlotName [ english ] =  "Tabelle auftrennen";
    SlotName[ english_us ] = "Split Table";
    SlotName[ portuguese ] = "Dividir tabela";
    SlotName[ russian ] = "Ðàçáèòü òàáëèöó";
    SlotName[ dutch ] = "Tabel splitsen";
    SlotName[ french ] = "Scinder le tableau";
    SlotName[ spanish ] = "Dividir tabla";
    SlotName[ italian ] = "Separa tabella";
    SlotName[ danish ] = "Opdel tabel";
    SlotName[ swedish ] = "Dela tabell";
    SlotName[ polish ] = "Rozdziel tabelê";
    SlotName[ portuguese_brazilian ] = "SplitTable";
    SlotName[ japanese ] = "•\\‚Ì•ªŠ„";
    SlotName[ chinese_simplified ] = "·Ö¸ô±í¸ñ";
    SlotName[ chinese_traditional ] = "¤À¶}ªí®æ";
    SlotName[ arabic ] = "ÝÕá ÇáÌÏæá";
    SlotName[ dutch ] = "Tabel splitsen";
    SlotName[ chinese_simplified ] = "·Ö¸ô±í¸ñ";
    SlotName[ greek ] = "ÄéÜóðáóç ðßíáêá";
    SlotName[ korean ] = "Ç¥ ³ª´©±â";
    SlotName[ turkish ] = "Tabloyu böl";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TABLE_UNSET_READ_ONLY
{
    SlotName = "Tabellenschutz aufheben";
    SlotName [ english ] =  "Tabellenschutz aufheben";
    SlotName[ english_us ] = "Unprotect sheet";
    SlotName[ portuguese ] = "Remover protecção";
    SlotName[ russian ] = "Ñíÿòü çàùèòó òàáëèöû";
    SlotName[ dutch ] = "Werkbladbeveiliging opheffen";
    SlotName[ french ] = "Annuler la protection du tableau";
    SlotName[ spanish ] = "Desproteger tabla";
    SlotName[ italian ] = "Disattiva protezione tabella";
    SlotName[ danish ] = "Ophæv arkbeskyttelse";
    SlotName[ swedish ] = "Upphäv tabellskydd";
    SlotName[ polish ] = "Usuñ ochronê arkusza";
    SlotName[ portuguese_brazilian ] = "ResetTableRead-Only";
    SlotName[ japanese ] = "•\\‚̕یì‚ð‰ðœ";
    SlotName[ chinese_simplified ] = "È¡Ïû±í¸ñ±£»¤";
    SlotName[ chinese_traditional ] = "¨ú®ø«OÅ@ªí®æ";
    SlotName[ arabic ] = "ÅáÛÇÁ ÍãÇíÉ ÇáÌÏæá";
    SlotName[ dutch ] = "Werkbladbeveiliging opheffen";
    SlotName[ chinese_simplified ] = "È¡Ïû±í¸ñ±£»¤";
    SlotName[ greek ] = "ÊáôÜñãçóç ðñïóôáóßáò ðßíáêá";
    SlotName[ korean ] = "º¸È£ ÇØÁ¦";
    SlotName[ turkish ] = "Tablo korumasýný kaldýr";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TABLE_UNSET_READ_ONLY_CELLS
{
    SlotName = "Zellschutz aufheben";
    SlotName [ english ] =  "Zellschutz aufheben";
    SlotName[ english_us ] = "Unprotect cells";
    SlotName[ portuguese ] = "Remover protecção da célula";
    SlotName[ russian ] = "Ñíÿòü çàùèòó ÿ÷ååê";
    SlotName[ dutch ] = "Celbeveiliging opheffen";
    SlotName[ french ] = "Annuler la protection des cellules";
    SlotName[ spanish ] = "Desproteger celdas";
    SlotName[ italian ] = "Disattiva protezione celle";
    SlotName[ danish ] = "Ophæv cellebeskyttelse";
    SlotName[ swedish ] = "Upphäv cellskydd";
    SlotName[ polish ] = "Anuluj ochronê komórek";
    SlotName[ portuguese_brazilian ] = "RemoveTableCellsReadOnly";
    SlotName[ japanese ] = "¾Ù‚̕یì‚ð‰ðœ";
    SlotName[ chinese_simplified ] = "È¡Ïûµ¥Ôª¸ñ±£»¤";
    SlotName[ chinese_traditional ] = "¨ú®ø«OÅ@Àx¦s®æ";
    SlotName[ arabic ] = "ÅÒÇáÉ ÍãÇíÉ ÇáÎáíÉ";
    SlotName[ dutch ] = "Celbeveiliging opheffen";
    SlotName[ chinese_simplified ] = "È¡Ïûµ¥Ôª¸ñ±£»¤";
    SlotName[ greek ] = "ÊáôÜñãçóç ðñïóôáóßáò êåëéþí";
    SlotName[ korean ] = "¼¿ º¸È£ ÇØÁ¦";
    SlotName[ turkish ] = "Hücre korumasýný kaldýr";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TABLE_VERT_BOTTOM
{
    SlotName = "Unten";
    SlotName [ english ] =  "Unten";
    SlotName[ english_us ] = "Bottom";
    SlotName[ portuguese ] = "Em baixo";
    SlotName[ russian ] = "Âíèçó";
    SlotName[ dutch ] = "Beneden";
    SlotName[ french ] = "En bas";
    SlotName[ spanish ] = "Abajo";
    SlotName[ italian ] = "In basso";
    SlotName[ danish ] = "Nederst";
    SlotName[ swedish ] = "Underst";
    SlotName[ polish ] = "W dole";
    SlotName[ portuguese_brazilian ] = "CellVertBottom";
    SlotName[ japanese ] = "‰º";
    SlotName[ chinese_simplified ] = "ÏÂ";
    SlotName[ chinese_traditional ] = "¤U";
    SlotName[ arabic ] = "ÃÓÝá";
    SlotName[ dutch ] = "Beneden";
    SlotName[ chinese_simplified ] = "ÏÂ";
    SlotName[ greek ] = "ÊÜôù";
    SlotName[ korean ] = "¾Æ·¡";
    SlotName[ turkish ] = "Altta";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TABLE_VERT_CENTER
{
    SlotName = "Mittig (vertikal)";
    SlotName [ english ] =  "Mittig (vertikal)";
    SlotName[ english_us ] = "Center ( vertical )";
    SlotName[ portuguese ] = "Centrado (vertical)";
    SlotName[ russian ] = "Öåíòðèðîâàòü (ïî âåðòèêàëè )  ";
    SlotName[ dutch ] = "Gecentreerd (verticaal)";
    SlotName[ french ] = "Centré (verticalement) ";
    SlotName[ spanish ] = "Centrado (vertical)";
    SlotName[ italian ] = "Centro (verticale) ";
    SlotName[ danish ] = "Centreret (lodret)";
    SlotName[ swedish ] = "Centrerad (vertikal)";
    SlotName[ polish ] = "Do œrodka ( poziomo )  ";
    SlotName[ portuguese_brazilian ] = "CellVertCenter ";
    SlotName[ japanese ] = "’†‰›(ã‰º)";
    SlotName[ chinese_simplified ] = "¾ÓÖÐ(´¹Ö±)";
    SlotName[ chinese_traditional ] = "¸m¤¤(««ª½)";
    SlotName[ arabic ] = "ÊæÓíØ (ÑÃÓí)";
    SlotName[ dutch ] = "Gecentreerd (verticaal)";
    SlotName[ chinese_simplified ] = "¾ÓÖÐ(´¹Ö±)";
    SlotName[ greek ] = "ÊåíôñáñéóìÝíá (êáôáêüñõöá)";
    SlotName[ korean ] = "°¡¿îµ¥ (¼öÁ÷ )";
    SlotName[ turkish ] = "Ortalanmýþ (dikey)";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TABLE_VERT_NONE
{
    SlotName = "Oben";
    SlotName [ english ] =  "Oben";
    SlotName[ english_us ] = "Top";
    SlotName[ portuguese ] = "Em cima";
    SlotName[ russian ] = "Ââåðõó";
    SlotName[ dutch ] = "Boven";
    SlotName[ french ] = "En haut";
    SlotName[ spanish ] = "Arriba";
    SlotName[ italian ] = "Sopra";
    SlotName[ danish ] = "Øverst";
    SlotName[ swedish ] = "Överst";
    SlotName[ polish ] = "W górze";
    SlotName[ portuguese_brazilian ] = "CellVertTop";
    SlotName[ japanese ] = "ã";
    SlotName[ chinese_simplified ] = "ÉÏ";
    SlotName[ chinese_traditional ] = "¤W";
    SlotName[ arabic ] = "ÃÚáì";
    SlotName[ dutch ] = "Boven";
    SlotName[ chinese_simplified ] = "ÉÏ";
    SlotName[ greek ] = "ÐÜíù";
    SlotName[ korean ] = "ˤ";
    SlotName[ turkish ] = "Üstte";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_THESAURUS_DLG
{
    SlotName = "Thesaurus";
    SlotName [ english ] =  "Thesaurus";
    SlotName[ english_us ] = "Thesaurus";
    SlotName[ portuguese ] = "Sinónimos";
    SlotName[ russian ] = "Òåçàóðóñ";
    SlotName[ dutch ] = "Thesaurus";
    SlotName[ french ] = "Dictionnaire des synonymes";
    SlotName[ spanish ] = "Sinónimos";
    SlotName[ italian ] = "Sinonimi";
    SlotName[ danish ] = "Synonymordbog";
    SlotName[ swedish ] = "Synonymordlista";
    SlotName[ polish ] = "Tezaurus";
    SlotName[ portuguese_brazilian ] = "ToolsThesaurus";
    SlotName[ japanese ] = "—Þ‹`ŒêŽ«“T";
    SlotName[ chinese_simplified ] = "´Êµä";
    SlotName[ chinese_traditional ] = "µü¨å";
    SlotName[ arabic ] = "ÞÇãæÓ ÇáãÑÇÏÝÇÊ";
    SlotName[ dutch ] = "Thesaurus";
    SlotName[ chinese_simplified ] = "´Êµä";
    SlotName[ greek ] = "Èçóáõñüò ëÝîåùí";
    SlotName[ korean ] = "µ¿ÀÇ¾î »çÀü";
    SlotName[ turkish ] = "Eþanlamlýlar";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TO_FOOTER
{
    SlotName = "Zur Fußzeile";
    SlotName [ english ] =  "Zur Fußzeile";
    SlotName[ english_us ] = "To Footer";
    SlotName[ portuguese ] = "Ir para rodapé";
    SlotName[ russian ] = "Äî íèæíåãî êîëîíòèòóëà";
    SlotName[ dutch ] = "Naar voettekst";
    SlotName[ french ] = "Aller au pied de page";
    SlotName[ spanish ] = "Ir al pie de página";
    SlotName[ italian ] = "Al piè di pagina";
    SlotName[ danish ] = "Til sidefod";
    SlotName[ swedish ] = "Till sidfot";
    SlotName[ polish ] = "Do stopki";
    SlotName[ portuguese_brazilian ] = "GoToFooter";
    SlotName[ japanese ] = "̯À‚Ö";
    SlotName[ chinese_simplified ] = "תµ½Ò³½Å";
    SlotName[ chinese_traditional ] = "Âà¨ì­¶§À";
    SlotName[ arabic ] = "Åáì ÊÐííá ÇáÕÝÍÉ";
    SlotName[ dutch ] = "Naar voettekst";
    SlotName[ chinese_simplified ] = "תµ½Ò³½Å";
    SlotName[ greek ] = "Ðñïò õðïóÝëéäï";
    SlotName[ korean ] = "¹Ù´Ú±Û·Î";
    SlotName[ turkish ] = "Altbilgi";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TO_HEADER
{
    SlotName = "Zur Kopfzeile";
    SlotName [ english ] =  "Zur Kopfzeile";
    SlotName[ english_us ] = "To Header";
    SlotName[ portuguese ] = "Ir para cabeçalho";
    SlotName[ russian ] = "Äî âåðõíåãî êîëîíòèòóëà";
    SlotName[ dutch ] = "Naar koptekst";
    SlotName[ french ] = "Aller à l'en-tête";
    SlotName[ spanish ] = "Ir al encabezamiento";
    SlotName[ italian ] = "Alla riga d'intestazione ";
    SlotName[ danish ] = "Til sidehoved";
    SlotName[ swedish ] = "Till sidhuvud";
    SlotName[ polish ] = "Do nag³ówka";
    SlotName[ portuguese_brazilian ] = "GoToHeader";
    SlotName[ japanese ] = "ͯÀނÖ";
    SlotName[ chinese_simplified ] = "תµ½Ò³Ã¼";
    SlotName[ chinese_traditional ] = "Âà¨ì­¶­º";
    SlotName[ arabic ] = "Åáì ÑÃÓ ÇáÕÝÍÉ";
    SlotName[ dutch ] = "Naar koptekst";
    SlotName[ chinese_simplified ] = "תµ½Ò³Ã¼";
    SlotName[ greek ] = "Ðñïò êåöáëßäá";
    SlotName[ korean ] = "¸Ó¸®±Û·Î";
    SlotName[ turkish ] = "Üstbilgi";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TOOL_ANKER
{
    SlotName = "Verankerung wechseln";
    SlotName [ english ] =  "Verankerung wechseln";
    SlotName[ english_us ] = "Change Anchor";
    SlotName[ portuguese ] = "Substituir âncora";
    SlotName[ russian ] = "Èçìåíèòü ïðèâÿçêó";
    SlotName[ dutch ] = "Verankering wisselen";
    SlotName[ french ] = "Changer d'ancrage";
    SlotName[ spanish ] = "Cambiar ancla";
    SlotName[ italian ] = "Commuta l'ancoraggio";
    SlotName[ danish ] = "Skift ankerpunkt";
    SlotName[ swedish ] = "Byt förankring";
    SlotName[ polish ] = "Wymieñ zakotwiczenie";
    SlotName[ portuguese_brazilian ] = "AnchorTypeChange";
    SlotName[ japanese ] = "±Ý¶°‚̕ύX";
    SlotName[ chinese_simplified ] = "¸ü¸ÄËø¶¨";
    SlotName[ chinese_traditional ] = "ÅܧóÂê©w";
    SlotName[ arabic ] = "ÊÛííÑ ÇáÅÑÓÇÁ";
    SlotName[ dutch ] = "Verankering wisselen";
    SlotName[ chinese_simplified ] = "¸ü¸ÄËø¶¨";
    SlotName[ greek ] = "ÁëëáãÞ áãêýñùóçò";
    SlotName[ korean ] = "°íÁ¤À§Ä¡ º¯°æ";
    SlotName[ turkish ] = "Sabitleme türünü deðiþtir";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TOOL_ANKER_AT_CHAR
{
    SlotName = "Am Zeichen verankern";
    SlotName [ english ] =  "Am Zeichen verankern";
    SlotName[ english_us ] = "Anchor to Character";
    SlotName[ portuguese ] = "Âncora no carácter";
    SlotName[ russian ] = "Ïðèâÿçàòü ê çíàêó";
    SlotName[ dutch ] = "Aan teken verankeren";
    SlotName[ french ] = "Ancrage au caractère";
    SlotName[ spanish ] = "Anclar al carácter";
    SlotName[ italian ] = "Ancora al carattere";
    SlotName[ danish ] = "Forankring til tegnet";
    SlotName[ swedish ] = "Förankra vid tecknet";
    SlotName[ polish ] = "Zakotwicz przy znaku";
    SlotName[ portuguese_brazilian ] = "Anchor at Character";
    SlotName[ japanese ] = "•¶Žš‚ɱݶ°‚·‚é";
    SlotName[ chinese_simplified ] = "±ê¼ÇÔÚ×Ö·ûÉÏ";
    SlotName[ chinese_traditional ] = "¼Ð°O¦b¦r¤¸¤W";
    SlotName[ arabic ] = "ÅÑÓÇÁ Úáì ÇáÃÍÑÝ";
    SlotName[ dutch ] = "Aan teken verankeren";
    SlotName[ chinese_simplified ] = "±ê¼ÇÔÚ×Ö·ûÉÏ";
    SlotName[ greek ] = "Áãêýñùóç óôïí ÷áñáêôÞñá";
    SlotName[ korean ] = "¹®ÀÚ¿¡ À§Ä¡°íÁ¤";
    SlotName[ turkish ] = "Karaktere sabitle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TOOL_ANKER_CHAR
{
    SlotName = "Am Zeichen verankern";
    SlotName [ english ] =  "Am Zeichen verankern";
    SlotName[ english_us ] = "Anchor to Character";
    SlotName[ portuguese ] = "Âncora no carácter";
    SlotName[ russian ] = "Ïðèâÿçàòü ê çíàêó";
    SlotName[ dutch ] = "Aan teken verankeren";
    SlotName[ french ] = "Ancrage au caractère";
    SlotName[ spanish ] = "Anclar al carácter";
    SlotName[ italian ] = "Ancora al carattere";
    SlotName[ danish ] = "Forankring til tegnet";
    SlotName[ swedish ] = "Förankra vid tecknet";
    SlotName[ polish ] = "Zakotwicz przy znaku";
    SlotName[ portuguese_brazilian ] = "SetAnchorToCharachter";
    SlotName[ japanese ] = "•¶Žš‚ɱݶ°‚·‚é";
    SlotName[ chinese_simplified ] = "Ëø¶¨ÔÚ×Ö·ûÉÏ";
    SlotName[ chinese_traditional ] = "¦b¦r¤¸§@¼Ð¸¹";
    SlotName[ arabic ] = "ÅÑÓÇÁ Úáì ÇáÃÍÑÝ";
    SlotName[ dutch ] = "Aan teken verankeren";
    SlotName[ chinese_simplified ] = "Ëø¶¨ÔÚ×Ö·ûÉÏ";
    SlotName[ greek ] = "Áãêýñùóç óôïí ÷áñáêôÞñá";
    SlotName[ korean ] = "¹®ÀÚ¿¡ À§Ä¡°íÁ¤";
    SlotName[ turkish ] = "Karaktere sabitle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TOOL_ANKER_FRAME
{
    SlotName = "Am Rahmen verankern";
    SlotName [ english ] =  "Am Rahmen verankern";
    SlotName[ english_us ] = "Anchor To Frame";
    SlotName[ portuguese ] = "Âncora na moldura";
    SlotName[ russian ] = "Ïðèâÿçàòü ê ðàìêå";
    SlotName[ dutch ] = "Aan kader verankeren";
    SlotName[ french ] = "Ancrage au cadre";
    SlotName[ spanish ] = "Anclar al marco";
    SlotName[ italian ] = "Ancora alla cornice";
    SlotName[ danish ] = "Forankring til rammen";
    SlotName[ swedish ] = "Förankra vid ramen";
    SlotName[ polish ] = "Zakotwicz przy ramce";
    SlotName[ portuguese_brazilian ] = "SetAnchorToFrame";
    SlotName[ japanese ] = "˜g‚ɱݶ°‚·‚é";
    SlotName[ chinese_simplified ] = "Ëø¶¨ÔÚ¿òÉÏ";
    SlotName[ chinese_traditional ] = "¦b®Ø¤W§@¼Ð¸¹";
    SlotName[ arabic ] = "ÅÑÓÇÁ Úáì ÇáÅØÇÑ";
    SlotName[ dutch ] = "Aan kader verankeren";
    SlotName[ chinese_simplified ] = "Ëø¶¨ÔÚ¿òÉÏ";
    SlotName[ greek ] = "Áãêýñùóç óôï ðëáßóéï";
    SlotName[ korean ] = "ÇÁ·¹ÀÓ¿¡ À§Ä¡°íÁ¤";
    SlotName[ turkish ] = "Çerçeveye sabitle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TOOL_ANKER_PAGE
{
    SlotName = "An der Seite verankern";
    SlotName [ english ] =  "An der Seite verankern";
    SlotName[ english_us ] = "Anchor To Page";
    SlotName[ portuguese ] = "Âncora na página";
    SlotName[ russian ] = "Ïðèâÿçàòü ê ñòðàíèöå";
    SlotName[ dutch ] = "Aan pagina verankeren";
    SlotName[ french ] = "Ancrage à la page";
    SlotName[ spanish ] = "Anclar a la página";
    SlotName[ italian ] = "Ancora alla pagina";
    SlotName[ danish ] = "Forankring til siden";
    SlotName[ swedish ] = "Förankra vid sidan";
    SlotName[ polish ] = "Zakotwicz przy stronie";
    SlotName[ portuguese_brazilian ] = "SetAnchorToPage";
    SlotName[ japanese ] = "Íß°¼Þ‚ɱݶ°‚·‚é";
    SlotName[ chinese_simplified ] = "Ëø¶¨ÔÚÒ³ÃæÉÏ";
    SlotName[ chinese_traditional ] = "Âê©w¦b­¶­±¤W";
    SlotName[ arabic ] = "ÅÑÓÇÁ Úáì ÇáÕÝÍÉ";
    SlotName[ dutch ] = "Aan pagina verankeren";
    SlotName[ chinese_simplified ] = "Ëø¶¨ÔÚÒ³ÃæÉÏ";
    SlotName[ greek ] = "Áãêýñùóç óôç óåëßäá";
    SlotName[ korean ] = "ÆäÀÌÁö À§Ä¡°íÁ¤";
    SlotName[ turkish ] = "Sayfaya sabitle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TOOL_ANKER_PARAGRAPH
{
    SlotName = "Am Absatz verankern";
    SlotName [ english ] =  "Am Absatz verankern";
    SlotName[ english_us ] = "Anchor To Paragraph";
    SlotName[ portuguese ] = "Âncora no parágrafo";
    SlotName[ russian ] = "Ïðèâÿçàòü ê àáçàöó";
    SlotName[ dutch ] = "Aan alinea verankeren";
    SlotName[ french ] = "Ancrage au paragraphe";
    SlotName[ spanish ] = "Anclar en el párrafo";
    SlotName[ italian ] = "Ancora al paragrafo";
    SlotName[ danish ] = "Forankring til afsnittet";
    SlotName[ swedish ] = "Förankra vid stycket";
    SlotName[ polish ] = "Zakotwicz przy akapicie";
    SlotName[ portuguese_brazilian ] = "SetAnchorToParagraph";
    SlotName[ japanese ] = "’i—Ž‚É±Ý¶°‚·‚é";
    SlotName[ chinese_simplified ] = "Ëø¶¨ÔÚ¶ÎÂäÉÏ";
    SlotName[ chinese_traditional ] = "¦b¬q¸¨¤W§@¼Ð¸¹";
    SlotName[ arabic ] = "ÅÑÓÇÁ Úáì ÇáÝÞÑÉ";
    SlotName[ dutch ] = "Aan alinea verankeren";
    SlotName[ chinese_simplified ] = "Ëø¶¨ÔÚ¶ÎÂäÉÏ";
    SlotName[ greek ] = "Áãêýñùóç óôç ðáñÜãñáöï";
    SlotName[ korean ] = "´Ü¶ô¿¡ À§Ä¡°íÁ¤";
    SlotName[ turkish ] = "Paragrafa sabitle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TOOL_GROUP
{
    SlotName = "Gruppierung";
    SlotName [ english ] =  "Gruppierung";
    SlotName[ english_us ] = "Group";
    SlotName[ portuguese ] = "Agrupar";
    SlotName[ russian ] = "Ãðóïïèðîâàíèå";
    SlotName[ dutch ] = "Groepering";
    SlotName[ french ] = "Grouper";
    SlotName[ spanish ] = "Agrupar";
    SlotName[ italian ] = "Raggruppa";
    SlotName[ danish ] = "Gruppering";
    SlotName[ swedish ] = "Gruppering";
    SlotName[ polish ] = "Zgrupowanie";
    SlotName[ portuguese_brazilian ] = "FormatGroup";
    SlotName[ japanese ] = "¸ÞÙ°Ì߉»";
    SlotName[ chinese_simplified ] = "·Ö×é";
    SlotName[ chinese_traditional ] = "¸s²Õ";
    SlotName[ arabic ] = "ÊÌãíÚ";
    SlotName[ dutch ] = "Groepering";
    SlotName[ chinese_simplified ] = "·Ö×é";
    SlotName[ greek ] = "Ïìáäïðïßçóç";
    SlotName[ korean ] = "±×·ì";
    SlotName[ turkish ] = "Grup";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TOOL_HIERARCHIE
{
    SlotName = "Lage wechseln";
    SlotName [ english ] =  "Lage wechseln";
    SlotName[ english_us ] = "Change Position";
    SlotName[ portuguese ] = "Mudar posição";
    SlotName[ russian ] = "Ñìåíèòü ïîëîæåíèå";
    SlotName[ dutch ] = "Positie veranderen";
    SlotName[ french ] = "Changer la position";
    SlotName[ spanish ] = "Cambiar posición";
    SlotName[ italian ] = "Cambia posizione";
    SlotName[ danish ] = "Modificer placering";
    SlotName[ swedish ] = "Växla läge";
    SlotName[ polish ] = "Zmieniæ po³o¿enie";
    SlotName[ portuguese_brazilian ] = "ObjectLayerChange";
    SlotName[ japanese ] = "ˆÊ’u‚̕ύX";
    SlotName[ chinese_simplified ] = "¸ü¸ÄλÖÃ";
    SlotName[ chinese_traditional ] = "Åܧó¦ì¸m";
    SlotName[ arabic ] = "ÊÛííÑ ÇáãæÖÚ";
    SlotName[ dutch ] = "Positie veranderen";
    SlotName[ chinese_simplified ] = "¸ü¸ÄλÖÃ";
    SlotName[ greek ] = "ÁëëáãÞ èÝóçò";
    SlotName[ korean ] = "À§Ä¡ º¯°æ";
    SlotName[ turkish ] = "Konum deðiþtir";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TOOL_HMIRROR
{
    SlotName = "Horizontal spiegeln";
    SlotName [ english ] =  "Horizontal spiegeln";
    SlotName[ english_us ] = "Flip Horizontal";
    SlotName[ portuguese ] = "Reflectir na horizontal";
    SlotName[ russian ] = "Îòîáðàçèòü ïî ãîðèçîíòàëè";
    SlotName[ dutch ] = "Horizontaal spiegelen";
    SlotName[ french ] = "Refléter horizontalement";
    SlotName[ spanish ] = "Reflejar horizontalmente";
    SlotName[ italian ] = "Rispecchia orizzontalmente";
    SlotName[ danish ] = "Spejlvend vandret";
    SlotName[ swedish ] = "Spegla horisontellt";
    SlotName[ polish ] = "Przerzuæ w poziomie";
    SlotName[ portuguese_brazilian ] = "ObjectFlipHorizontal";
    SlotName[ japanese ] = "ã‰º”½“]";
    SlotName[ chinese_simplified ] = "ˮƽ·½Ïò·´Ó³";
    SlotName[ chinese_traditional ] = "¤ô¥­¤Ï¬M";
    SlotName[ arabic ] = "ÇäÚßÇÓ ÃÝÞí";
    SlotName[ dutch ] = "Horizontaal spiegelen";
    SlotName[ chinese_simplified ] = "ˮƽ·½Ïò·´Ó³";
    SlotName[ greek ] = "ÁíáóôñïöÞ ïñéæüíôéá";
    SlotName[ korean ] = "¼öÆò ´ëĪ";
    SlotName[ turkish ] = "Yatay yansýt";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TOOL_UNGROUP
{
    SlotName = "Gruppierung aufheben";
    SlotName [ english ] =  "Gruppierung aufheben";
    SlotName[ english_us ] = "Ungroup";
    SlotName[ portuguese ] = "Desagrupar";
    SlotName[ russian ] = "Ðàçãðóïïèðîâàòü";
    SlotName[ dutch ] = "Groepering opheffen";
    SlotName[ french ] = "Dissocier";
    SlotName[ spanish ] = "Desagrupar";
    SlotName[ italian ] = "Sciogli gruppo";
    SlotName[ danish ] = "Ophæv gruppering";
    SlotName[ swedish ] = "Upphäv gruppering";
    SlotName[ polish ] = "Rozgrupuj";
    SlotName[ portuguese_brazilian ] = "FormatUngroup";
    SlotName[ japanese ] = "¸ÞÙ°Ì߉ðœ";
    SlotName[ chinese_simplified ] = "È¡Ïû·Ö×é";
    SlotName[ chinese_traditional ] = "¨ú®ø¸s²Õ";
    SlotName[ arabic ] = "ÅÒÇáÉ ÇáÊÌãíÚ";
    SlotName[ dutch ] = "Groepering opheffen";
    SlotName[ chinese_simplified ] = "È¡Ïû·Ö×é";
    SlotName[ greek ] = "ÊáôÜñãçóç ïìáäïðïßçóçò";
    SlotName[ korean ] = "±×·ì ÇØÃ¼";
    SlotName[ turkish ] = "Grubu çöz";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_TOOL_VMIRROR
{
    SlotName = "Vertikal spiegeln";
    SlotName [ english ] =  "Vertikal spiegeln";
    SlotName[ english_us ] = "Flip Vertical";
    SlotName[ portuguese ] = "Reflectir na vertical";
    SlotName[ russian ] = "Îòîáðàçèòü ïî âåðòèêàëè";
    SlotName[ dutch ] = "Verticaal spiegelen";
    SlotName[ french ] = "Refléter verticalement";
    SlotName[ spanish ] = "Reflejar verticalmente";
    SlotName[ italian ] = "Rispecchia verticalmente";
    SlotName[ danish ] = "Spejlvend lodret";
    SlotName[ swedish ] = "Spegla vertikalt";
    SlotName[ polish ] = "Przerzuæ w pionie";
    SlotName[ portuguese_brazilian ] = "ObjectFlipVertical";
    SlotName[ japanese ] = "¶‰E”½“]";
    SlotName[ chinese_simplified ] = "´¹Ö±·½Ïò·´Ó³";
    SlotName[ chinese_traditional ] = "««ª½¤Ï¬M";
    SlotName[ arabic ] = "ÇáÇäÚßÇÓ ÑÃÓíÇð";
    SlotName[ dutch ] = "Verticaal spiegelen";
    SlotName[ chinese_simplified ] = "´¹Ö±·½Ïò·´Ó³";
    SlotName[ greek ] = "ÁíáóôñïöÞ êáôáêüñõöá";
    SlotName[ korean ] = "¼öÁ÷ ´ëĪ";
    SlotName[ turkish ] = "Dikey yansýt";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_UNDERLINE_DOUBLE
{
    SlotName = "Doppelt unterstrichen";
    SlotName [ english ] =  "Doppelt unterstrichen";
    SlotName[ english_us ] = "Double Underline ";
    SlotName[ portuguese ] = "Sublinhado duplo";
    SlotName[ russian ] = "Äâîéíîå ïîä÷åðêèâàíèå";
    SlotName[ dutch ] = "Dubbel onderstreept";
    SlotName[ french ] = "Soulignage double";
    SlotName[ spanish ] = "Subrayado doble";
    SlotName[ italian ] = "Sottolinea doppio";
    SlotName[ danish ] = "Dobbelt understreget";
    SlotName[ swedish ] = "Dubbelt understruket";
    SlotName[ polish ] = "Podwójne podkreœlenie";
    SlotName[ portuguese_brazilian ] = "UnderlineDouble";
    SlotName[ japanese ] = "“ñd‰ºü";
    SlotName[ chinese_simplified ] = "˫ϻ®Ïß";
    SlotName[ chinese_traditional ] = "Âù¹º½u";
    SlotName[ arabic ] = "ÎØ ÊÍÊí ãÒÏæÌ";
    SlotName[ dutch ] = "Dubbel onderstreept";
    SlotName[ chinese_simplified ] = "˫ϻ®Ïß";
    SlotName[ greek ] = "ÄéðëÞ õðïãñÜììéóç";
    SlotName[ korean ] = "2Áß ¹ØÁÙ";
    SlotName[ turkish ] = "Çift çizgi";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_UPDATE_ALL
{
    SlotName = "Alles Aktualisieren";
    SlotName [ english ] =  "Alles Aktualisieren";
    SlotName[ english_us ] = "Update All";
    SlotName[ portuguese ] = "Actualizar tudo";
    SlotName[ russian ] = "Îáíîâèòü âñå";
    SlotName[ dutch ] = "Alles actualiseren";
    SlotName[ french ] = "Tout actualiser";
    SlotName[ spanish ] = "Actualizar todo";
    SlotName[ italian ] = "Aggiorna tutto";
    SlotName[ danish ] = "Opdater alt";
    SlotName[ swedish ] = "Uppdatera allt";
    SlotName[ polish ] = "Aktualizuj wszystko";
    SlotName[ portuguese_brazilian ] = "UpdateAll";
    SlotName[ japanese ] = "‚·‚ׂĂðXV";
    SlotName[ chinese_simplified ] = "È«²¿¸üÐÂ";
    SlotName[ chinese_traditional ] = "¥þ³¡§ó·s";
    SlotName[ arabic ] = "ÊÍÏíË Çáßá";
    SlotName[ dutch ] = "Alles actualiseren";
    SlotName[ chinese_simplified ] = "È«²¿¸üÐÂ";
    SlotName[ greek ] = "ÅíçìÝñùóç üëùí";
    SlotName[ korean ] = "Àüü ¾÷ µ¥ÀÌÆ®";
    SlotName[ turkish ] = "Tümünü güncelle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_UPDATE_ALL_LINKS
{
    SlotName = "Verknüpfungen aktualisieren";
    SlotName [ english ] =  "Verknüpfungen aktualisieren";
    SlotName[ english_us ] = "Update All Links";
    SlotName[ portuguese ] = "Actualizar ligações";
    SlotName[ russian ] = "Îáíîâèòü ññûëêè";
    SlotName[ dutch ] = "Koppelingen actualiseren";
    SlotName[ french ] = "Actualiser les liens";
    SlotName[ spanish ] = "Actualizar todos los vínculos";
    SlotName[ italian ] = "Aggiorna collegamenti";
    SlotName[ danish ] = "Opdater kæder";
    SlotName[ swedish ] = "Uppdatera länkar";
    SlotName[ polish ] = "Aktualizuj ³¹cza";
    SlotName[ portuguese_brazilian ] = "UpdateAllLinks";
    SlotName[ japanese ] = "ØÝ¸‚̍XV";
    SlotName[ chinese_simplified ] = "¸üÐÂÁ´½Ó";
    SlotName[ chinese_traditional ] = "§ó·s±¶®|";
    SlotName[ arabic ] = "ÊÍÏíË ßá ÇáÇÑÊÈÇØÇÊ";
    SlotName[ dutch ] = "Koppelingen actualiseren";
    SlotName[ chinese_simplified ] = "¸üÐÂÁ´½Ó";
    SlotName[ greek ] = "ÅíçìÝñùóç üëùí ôùí óõíäÝóåùí";
    SlotName[ korean ] = "¸ðµç ¿¬°á ¾÷ µ¥ÀÌÆ®";
    SlotName[ turkish ] = "Baðlantýlarý güncelle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_UPDATE_CUR_TOX
{
    SlotName = "Verzeichnis aktualisieren";
    SlotName [ english ] =  "Verzeichnis aktualisieren";
    SlotName[ english_us ] = "Update Index";
    SlotName[ portuguese ] = "Actualizar índice";
    SlotName[ russian ] = "Îáíîâèòü óêàçàòåëü";
    SlotName[ dutch ] = "Index actualiseren";
    SlotName[ french ] = "Actualiser l'index";
    SlotName[ spanish ] = "Actualizar índice";
    SlotName[ italian ] = "Aggiorna indice";
    SlotName[ danish ] = "Opdater indeks";
    SlotName[ swedish ] = "Uppdatera förteckning";
    SlotName[ polish ] = "Aktualizuj indeks";
    SlotName[ portuguese_brazilian ] = "Optimize";
    SlotName[ japanese ] = "õˆø€–ڂ̍XV";
    SlotName[ chinese_simplified ] = "¸üÐÂĿ¼";
    SlotName[ chinese_traditional ] = "§ó·s¥Ø¿ý";
    SlotName[ arabic ] = "ÊÍÏíË ÇáÝåÑÓ";
    SlotName[ dutch ] = "Index actualiseren";
    SlotName[ chinese_simplified ] = "¸üÐÂĿ¼";
    SlotName[ greek ] = "ÅíçìÝñùóç åõñåôçñßïõ";
    SlotName[ korean ] = "»öÀÎ ¾÷ µ¥ÀÌÆ®";
    SlotName[ turkish ] = "Dizini güncelle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_EDIT_CURRENT_TOX
{
    SlotName = "Verzeichnis bearbeiten";
    SlotName [ english ] =  "Edit index";
    SlotName[ english_us ] = "Edit index";
    SlotName[ portuguese ] = "Editar índice";
    SlotName[ greek ] = "Åðåîåñãáóßá åõñåôçñßïõ";
    SlotName[ dutch ] = "Index bewerken";
    SlotName[ french ] = "Modifier l'index";
    SlotName[ spanish ] = "Editar índice";
    SlotName[ swedish ] = "Redigera förteckning";
    SlotName[ russian ] = "Ïðàâêà óêàçàòåëÿ";
    SlotName[ italian ] = "Modifica indice";
    SlotName[ danish ] = "Rediger indeks";
    SlotName[ polish ] = "Edytuj indeks";
    SlotName[ portuguese_brazilian ] = "Edit index";
    SlotName[ japanese ] = "õˆø‚̕ҏW";
    SlotName[ korean ] = "»öÀÎ ÆíÁý";
    SlotName[ chinese_simplified ] = "±à¼­Ä¿Â¼";
    SlotName[ chinese_traditional ] = "½s¿è¥Ø¿ý";
    SlotName[ arabic ] = "ÊÍÑíÑ ÝåÑÓ";
    SlotName[ turkish ] = "Dizini düzenle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_UPDATE_FIELDS
{
    SlotName = "Felder aktualisieren";
    SlotName [ english ] =  "Felder aktualisieren";
    SlotName[ english_us ] = "Update Fields";
    SlotName[ portuguese ] = "Actualizar campos";
    SlotName[ russian ] = "Îáíîâèòü ïîëÿ";
    SlotName[ dutch ] = "Velden actualisern";
    SlotName[ french ] = "Actualiser les champs";
    SlotName[ spanish ] = "Actualizar campos";
    SlotName[ italian ] = "UpdateFields";
    SlotName[ danish ] = "Opdater felter";
    SlotName[ swedish ] = "Uppdatera fält";
    SlotName[ polish ] = "Aktualizuj pola";
    SlotName[ portuguese_brazilian ] = "FieldsUpdate";
    SlotName[ japanese ] = "̨°ÙÄނ̍XV";
    SlotName[ chinese_simplified ] = "¸üÐÂ×Ö¶Î";
    SlotName[ chinese_traditional ] = "§ó·sÄæ¦ì";
    SlotName[ arabic ] = "ÊÍÏíË ÇáÍÞæá";
    SlotName[ dutch ] = "Velden actualisern";
    SlotName[ chinese_simplified ] = "¸üÐÂ×Ö¶Î";
    SlotName[ greek ] = "ÅíçìÝñùóç ðåäßùí";
    SlotName[ korean ] = "ÇÊµå ¾÷ µ¥ÀÌÆ®";
    SlotName[ turkish ] = "Alanlarý güncelle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_UPDATE_INPUTFIELDS
{
    SlotName = "Eingabefelder aktualisieren";
    SlotName [ english ] =  "Eingabefelder aktualisieren";
    SlotName[ english_us ] = "Update Input Fields";
    SlotName[ portuguese ] = "Actualizar campos de entrada";
    SlotName[ russian ] = "Îáíîâèòü ïîëÿ ââîäà";
    SlotName[ dutch ] = "Invoervelden actualiseren";
    SlotName[ french ] = "Actualiser les champs de saisie";
    SlotName[ spanish ] = "Actualizar campos para entradas";
    SlotName[ italian ] = "Aggiorna caselle digitazione";
    SlotName[ danish ] = "Opdater input-felter";
    SlotName[ swedish ] = "Uppdatera inmatningsfält";
    SlotName[ polish ] = "Aktualizuj pola wprowadzania";
    SlotName[ portuguese_brazilian ] = "InputfieldsUpdate";
    SlotName[ japanese ] = "“ü—ÍÎÞ¯¸½‚̍XV";
    SlotName[ chinese_simplified ] = "¸üÐÂÊäÈë×Ö¶Î";
    SlotName[ chinese_traditional ] = "§ó·s¿é¤JÄæ¦ì";
    SlotName[ arabic ] = "ÊÍÏíË ÍÞæá ÇáÅÏÎÇá";
    SlotName[ dutch ] = "Invoervelden actualiseren";
    SlotName[ chinese_simplified ] = "¸üÐÂÊäÈë×Ö¶Î";
    SlotName[ greek ] = "ÅíçìÝñùóç ðåäßùí åéóáãùãÞò";
    SlotName[ korean ] = "ÀÔ·Â ÇÊµå ¾÷ µ¥ÀÌÆ®";
    SlotName[ turkish ] = "Giriþ alanlarýný güncelle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_UPDATE_TOX
{
    SlotName = "Verzeichnisse aktualisieren";
    SlotName [ english ] =  "Verzeichnisse aktualisieren";
    SlotName[ english_us ] = "Update Indexes";
    SlotName[ portuguese ] = "Actualizar índices";
    SlotName[ russian ] = "Îáíîâèòü óêàçàòåëè";
    SlotName[ dutch ] = "Indices actualiseren";
    SlotName[ french ] = "Actualiser les index";
    SlotName[ spanish ] = "Actualizar índices";
    SlotName[ italian ] = "Aggiorna indici";
    SlotName[ danish ] = "Opdater alle indeks";
    SlotName[ swedish ] = "Uppdatera förteckningar";
    SlotName[ polish ] = "Aktualizuj indeksy";
    SlotName[ portuguese_brazilian ] = "UpdateAllIndexes";
    SlotName[ japanese ] = "–ÚŽŸ‚ƍõˆø‚̍XV";
    SlotName[ chinese_simplified ] = "¸üÐÂĿ¼";
    SlotName[ chinese_traditional ] = "§ó·s¥Ø¿ý";
    SlotName[ arabic ] = "ÊÍÏíË ÇáÝåÇÑÓ";
    SlotName[ dutch ] = "Indices actualiseren";
    SlotName[ chinese_simplified ] = "¸üÐÂĿ¼";
    SlotName[ greek ] = "ÅíçìÝñùóç åõñåôçñßùí";
    SlotName[ korean ] = "»öÀÎ ¾÷ µ¥ÀÌÆ®";
    SlotName[ turkish ] = "Dizinleri güncelle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_VIEW_BOUNDS
{
    SlotName = "Textbegrenzungen";
    SlotName [ english ] =  "Textbegrenzungen";
    SlotName[ english_us ] = "Text Limits";
    SlotName[ portuguese ] = "Limites do texto";
    SlotName[ russian ] = "Ãðàíèöû òåêñòà";
    SlotName[ dutch ] = "Tekstbegrenzingen";
    SlotName[ french ] = "Délimitations du texte";
    SlotName[ spanish ] = "Límites del texto";
    SlotName[ italian ] = "Margini del testo";
    SlotName[ danish ] = "Tekstmargener";
    SlotName[ swedish ] = "Textbegränsningar";
    SlotName[ polish ] = "Granice tekstu";
    SlotName[ portuguese_brazilian ] = "ViewTextBounds";
    SlotName[ japanese ] = "÷½Ä‚Ì‹«ŠE";
    SlotName[ chinese_simplified ] = "ÕýÎı߽ç";
    SlotName[ chinese_traditional ] = "¤º¤åÃä¬É";
    SlotName[ arabic ] = "ÍÏæÏ ÇáäÕ";
    SlotName[ dutch ] = "Tekstbegrenzingen";
    SlotName[ chinese_simplified ] = "ÕýÎı߽ç";
    SlotName[ greek ] = "¼ñéá êåéìÝíïõ";
    SlotName[ korean ] = "ÅØ½ºÆ® °æ°è¼±";
    SlotName[ turkish ] = "Metin sýnýrlarý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_VIEW_FIELDNAME
{
    SlotName = "Feldnamen ein/aus";
    SlotName [ english ] =  "Feldnamen ein/aus";
    SlotName[ english_us ] = "Field Names On/Off";
    SlotName[ portuguese ] = "Mostrar nomes de campos";
    SlotName[ russian ] = "Âêë./Îòêë. èìåíà ïîëÿ";
    SlotName[ dutch ] = "Veldnamen aan/uit";
    SlotName[ french ] = "Afficher/masquer les noms de champ";
    SlotName[ spanish ] = "Mostrar/ocultar nombre de campos";
    SlotName[ italian ] = "Mostra/nascondi i nomi di campo ";
    SlotName[ danish ] = "Feltnavn til/fra";
    SlotName[ swedish ] = "Fältnamn på/av";
    SlotName[ polish ] = "W³¹cz/Wy³¹cz nazwy pól";
    SlotName[ portuguese_brazilian ] = "ViewFieldNames";
    SlotName[ japanese ] = "̨°ÙÄޖ¼ µÝ/µÌ";
    SlotName[ chinese_simplified ] = "ÏÔʾ/ÒþÈë×Ö¶ÎÃû³Æ";
    SlotName[ chinese_traditional ] = "Åã¥Ü/Áô¤JÄæ¦ì¦WºÙ";
    SlotName[ arabic ] = "ÅÙåÇÑ/ÅÎÝÇÁ ÃÓãÇÁ ÇáÍÞæá";
    SlotName[ dutch ] = "Veldnamen aan/uit";
    SlotName[ chinese_simplified ] = "ÏÔʾ/ÒþÈë×Ö¶ÎÃû³Æ";
    SlotName[ greek ] = "Ïíüìáôá ðåäßùí Íáé/¼÷é";
    SlotName[ korean ] = "Çʵå À̸§ ÀÛµ¿/ÇØÁ¦";
    SlotName[ turkish ] = "Alan adlarýný görüntüle/gizle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_VIEW_FIELDS
{
    SlotName = "Feldbefehle";
    SlotName [ english ] =  "Feldbefehle";
    SlotName[ english_us ] = "Fields";
    SlotName[ portuguese ] = "Códigos de campo";
    SlotName[ russian ] = "Ïîëå";
    SlotName[ dutch ] = "Veldopdrachten";
    SlotName[ french ] = "Instructions de champ";
    SlotName[ spanish ] = "Códigos de campo";
    SlotName[ italian ] = "Comandi di campo";
    SlotName[ danish ] = "Felter";
    SlotName[ swedish ] = "Fältkommandon";
    SlotName[ polish ] = "Pola";
    SlotName[ portuguese_brazilian ] = "ViewFieldCodes";
    SlotName[ japanese ] = "̨°ÙÄÞ";
    SlotName[ chinese_simplified ] = "×Ö¶ÎÖ¸Áî";
    SlotName[ chinese_traditional ] = "Äæ¦ì«ü¥O";
    SlotName[ arabic ] = "ÍÞæá";
    SlotName[ dutch ] = "Veldopdrachten";
    SlotName[ chinese_simplified ] = "×Ö¶ÎÖ¸Áî";
    SlotName[ greek ] = "ÅíôïëÝò ðåäßïõ";
    SlotName[ korean ] = "Çʵå";
    SlotName[ turkish ] = "Alan öðeleri";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_VIEW_GRAPHIC
{
    SlotName = "Grafik ein/aus";
    SlotName [ english ] =  "Graphics On/Off";
    SlotName[ english_us ] = "Graphics on/off";
    SlotName[ portuguese ] = "Mostrar/Ocultar imagem";
    SlotName[ russian ] = "Ðèñóíîê";
    SlotName[ greek ] = "Ãñáöéêü Íáé/¼÷é";
    SlotName[ dutch ] = "Afbeelding aan/uit";
    SlotName[ french ] = "Afficher/masquer les images";
    SlotName[ spanish ] = "Imagen";
    SlotName[ italian ] = "Immagine";
    SlotName[ danish ] = "Grafik til/fra";
    SlotName[ swedish ] = "Grafik på/av";
    SlotName[ polish ] = "W³¹cz/Wy³¹cz grafikê";
    SlotName[ portuguese_brazilian ] = "ViewGraphic";
    SlotName[ japanese ] = "} µÝ/µÌ";
    SlotName[ korean ] = "±×·¡ÇÈ";
    SlotName[ chinese_simplified ] = "ÏÔʾ/ÒþÈë ͼÐÎ";
    SlotName[ chinese_traditional ] = "Åã¥Ü©ÎÁô¤J¹Ï¤ù";
    SlotName[ turkish ] = "Grafik";
    SlotName[ arabic ] = "ÅÙåÇÑ/ÅÎÝÇÁ ÇáÕæÑÉ";
};
SfxSlotInfo FN_VIEW_HIDDEN_PARA
{
    SlotName = "Versteckte Absätze";
    SlotName [ english ] =  "Versteckte Absätze";
    SlotName[ english_us ] = "Hidden Paragraphs";
    SlotName[ portuguese ] = "Parágrafos ocultos";
    SlotName[ russian ] = "Ñêðûòûå àáçàöû";
    SlotName[ dutch ] = "Verborgen alinea´s";
    SlotName[ french ] = "Afficher paragraphes masqués";
    SlotName[ spanish ] = "Párrafos ocultos";
    SlotName[ italian ] = "Paragrafi nascosti";
    SlotName[ danish ] = "Skjulte afsnit";
    SlotName[ swedish ] = "Dolda stycken";
    SlotName[ polish ] = "Ukryte akapity";
    SlotName[ portuguese_brazilian ] = "ShowHiddenParagraphs";
    SlotName[ japanese ] = "‰B‚µ’i—Ž";
    SlotName[ chinese_simplified ] = "ÒþÈëµÄ¶ÎÂä";
    SlotName[ chinese_traditional ] = "Áô¤Jªº¬q¸¨";
    SlotName[ arabic ] = "ÝÞÑÇÊ ãÎÝíÉ";
    SlotName[ dutch ] = "Verborgen alinea´s";
    SlotName[ chinese_simplified ] = "ÒþÈëµÄ¶ÎÂä";
    SlotName[ greek ] = "ÊñõöÞ ðáñÜãñáöïò";
    SlotName[ korean ] = "¼û°ÜÁø ´Ü¶ô";
    SlotName[ turkish ] = "Gizli paragraflar";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_VIEW_MARKS
{
    SlotName = "Marken";
    SlotName [ english ] =  "Marken";
    SlotName[ english_us ] = "Field Shadings";
    SlotName[ portuguese ] = "Destaques";
    SlotName[ russian ] = "Ìåòêè";
    SlotName[ dutch ] = "Markeringen";
    SlotName[ french ] = "Marques";
    SlotName[ spanish ] = "Marcas";
    SlotName[ italian ] = "Selezioni";
    SlotName[ danish ] = "Markeringer";
    SlotName[ swedish ] = "Markeringar";
    SlotName[ polish ] = "Znaczniki";
    SlotName[ portuguese_brazilian ] = "ViewMarks";
    SlotName[ japanese ] = "‘I‘ð";
    SlotName[ chinese_simplified ] = "Óòµ×ÎÆ";
    SlotName[ chinese_traditional ] = "°ì©³¯¾";
    SlotName[ arabic ] = "ÚáÇãÇÊ";
    SlotName[ dutch ] = "Markeringen";
    SlotName[ chinese_simplified ] = "Óòµ×ÎÆ";
    SlotName[ greek ] = "ÓçìÜäé";
    SlotName[ korean ] = "Çʵå À½¿µ";
    SlotName[ turkish ] = "Belirteçler";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_VIEW_META_CHARS
{
    SlotName = "Steuerzeichen  ein/aus";
    SlotName [ english ] =  "Nonprinting Characters on/off";
    SlotName[ english_us ] = "Nonprinting Characters  on/off";
    SlotName[ portuguese ] = "Mostrar/Ocultar caracteres não imprimíveis";
    SlotName[ russian ] = "Íåïå÷àòàåìûå ñèìâîëû";
    SlotName[ greek ] = "Ìç åêôõðþóéìïé ÷áñáêôÞñåò Íáé/¼÷é";
    SlotName[ dutch ] = "Besturingstekens aan/uit";
    SlotName[ french ] = "Afficher/masquer les caractères non imprimables";
    SlotName[ spanish ] = "Caracteres no imprimibles";
    SlotName[ italian ] = "Caratteri non stampabili";
    SlotName[ danish ] = "Kontroltegn til/fra";
    SlotName[ swedish ] = "Styrtecken";
    SlotName[ polish ] = "W³¹cz/Wy³¹cz znaki niedrukowalne";
    SlotName[ portuguese_brazilian ] = "ViewControlCodes";
    SlotName[ japanese ] = "•ҏW‹L† µÝ/µÌ";
    SlotName[ korean ] = "ÀμâÇÒ¼ö ¾ø´Â ¹®ÀÚ";
    SlotName[ chinese_simplified ] = "ÏÔʾ/ÒþÈë ¿ØÖÆ·û";
    SlotName[ chinese_traditional ] = "Åã¥Ü©ÎÁô¤J±±¨î²Å¸¹";
    SlotName[ turkish ] = "Denetim karakterleri";
    SlotName[ arabic ] = "ÅÙåÇÑ/ÅÎÝÇÁ ÇáÃÍÑÝ ÇáÊí áÇ ÊõØÈÚ";
};
SfxSlotInfo FN_VIEW_TABLEGRID
{
    SlotName = "Tabellenbegrenzungen";
    SlotName [ english ] =  "Tabellenbegrenzungen";
    SlotName[ english_us ] = "Table Limits";
    SlotName[ portuguese ] = "Margens da tabela";
    SlotName[ russian ] = "Îãðàíè÷åíèÿ òàáëèöû";
    SlotName[ dutch ] = "Tabelbegrenzingen";
    SlotName[ french ] = "Limiteurs de tableaux";
    SlotName[ spanish ] = "Límites de la tabla";
    SlotName[ italian ] = "Limiti tabella";
    SlotName[ danish ] = "Tabelgrænser";
    SlotName[ swedish ] = "Tabellbegränsningar";
    SlotName[ polish ] = "Obramowanie tabeli";
    SlotName[ portuguese_brazilian ] = "ViewTableBoundaries";
    SlotName[ japanese ] = "•\\‚Ì‹«ŠE";
    SlotName[ chinese_simplified ] = "±í¸ñ±ß½ç";
    SlotName[ chinese_traditional ] = "ªí®æÃä¬É";
    SlotName[ arabic ] = "ÍÏæÏ ÇáÌÏæá";
    SlotName[ dutch ] = "Tabelbegrenzingen";
    SlotName[ chinese_simplified ] = "±í¸ñ±ß½ç";
    SlotName[ greek ] = "¼ñéá ðßíáêá";
    SlotName[ korean ] = "Ç¥ °æ°è¼±";
    SlotName[ turkish ] = "Tablo sýnýrlarý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_VLINEAL
{
    SlotName = "Vertikales Lineal";
    SlotName [ english ] =  "Vertikales Lineal";
    SlotName[ english_us ] = "Vertical Ruler";
    SlotName[ portuguese ] = "Mostrar régua vertical";
    SlotName[ russian ] = "Âåðòèêàëüíàÿ ëèíåéêà";
    SlotName[ dutch ] = "Verticale liniaal";
    SlotName[ french ] = "Règle verticale";
    SlotName[ spanish ] = "Regla vertical";
    SlotName[ italian ] = "Righello verticale";
    SlotName[ danish ] = "Lodret lineal";
    SlotName[ swedish ] = "Vertikal linjal";
    SlotName[ polish ] = "Pionowa linijka";
    SlotName[ portuguese_brazilian ] = "ViewVertRuler";
    SlotName[ japanese ] = "‚’¼Ù°×";
    SlotName[ chinese_simplified ] = "´¹Ö±±ê³ß";
    SlotName[ chinese_traditional ] = "««ª½¼Ð¤Ø";
    SlotName[ arabic ] = "ãÓØÑÉ ÑÃÓíÉ";
    SlotName[ dutch ] = "Verticale liniaal";
    SlotName[ chinese_simplified ] = "´¹Ö±±ê³ß";
    SlotName[ greek ] = "Êáôáêüñõöïò ÷Üñáêáò";
    SlotName[ korean ] = "¼öÁ÷ ´«±ÝÀÚ";
    SlotName[ turkish ] = "Dikey cetvel";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_VSCROLLBAR
{
    SlotName = "Vertikale Bildlaufleiste";
    SlotName [ english ] =  "Vertikale Bildlaufleiste";
    SlotName[ english_us ] = "Vertical Scroll bar";
    SlotName[ portuguese ] = "Barra de deslocamento vertical";
    SlotName[ russian ] = "Âåðòèêàëüíàÿ ïîëîñà ïðîêðóòêè";
    SlotName[ dutch ] = "Verticale schuifbalk";
    SlotName[ french ] = "Barre de défilement verticale";
    SlotName[ spanish ] = "Barra de desplazamiento vertical";
    SlotName[ italian ] = "Barra di scorrimento verticale";
    SlotName[ danish ] = "Lodret rullepanel";
    SlotName[ swedish ] = "Vertikal bildrullningslist";
    SlotName[ polish ] = "Pionowy pasek przewijania obrazu";
    SlotName[ portuguese_brazilian ] = "ViewVertScroll";
    SlotName[ japanese ] = "‚’¼½¸Û°ÙÊÞ°";
    SlotName[ chinese_simplified ] = "´¹Ö±Ïò¹ö¶¯À¸";
    SlotName[ chinese_traditional ] = "««ª½¼v¹³¨÷¶b";
    SlotName[ arabic ] = "ÔÑíØ ÊÍÑíß ÇáÕÝÍÉ ÑÃÓíÇð";
    SlotName[ dutch ] = "Verticale schuifbalk";
    SlotName[ chinese_simplified ] = "´¹Ö±Ïò¹ö¶¯À¸";
    SlotName[ greek ] = "Êáôáêüñõöç ãñáììÞ êýëéóçò";
    SlotName[ korean ] = "¼öÁ÷ ½ºÅ©·Ñ ¹Ù";
    SlotName[ turkish ] = "Dikey kaydýrma çubuðu";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_WRAP_ANCHOR_ONLY
{
    SlotName = "Umlauf erster Absatz";
    SlotName [ english ] =  "Umlauf erster Absatz";
    SlotName[ english_us ] = "Wrap First Paragraph";
    SlotName[ portuguese ] = "Ajuste do primeiro parágrafo";
    SlotName[ russian ] = "Îáòåêàíèå ïåðâîãî àáçàöà";
    SlotName[ dutch ] = "Omloop eerste alinea";
    SlotName[ french ] = "Adaptation premier paragraphe";
    SlotName[ spanish ] = "Ajuste del primer párrafo";
    SlotName[ italian ] = "Scorrimento primo paragrafo";
    SlotName[ danish ] = "Ombryd første afsnit";
    SlotName[ swedish ] = "Textanpassning första stycket";
    SlotName[ polish ] = "Obieg pierwszego akapitu";
    SlotName[ portuguese_brazilian ] = "FrameWrapAnchorOnly";
    SlotName[ japanese ] = "Å‰‚Ì’i—ނŐ܂è•Ô‚µ";
    SlotName[ chinese_simplified ] = "»·ÈƵÚÒ»¸ö¶ÎÂä";
    SlotName[ chinese_traditional ] = "²Ä¤@¬q¸¨´«¦æ";
    SlotName[ arabic ] = "ÇáÊÝÇÝ ÇáÝÞÑÉ ÇáÃæáì";
    SlotName[ dutch ] = "Omloop eerste alinea";
    SlotName[ chinese_simplified ] = "»·ÈƵÚÒ»¸ö¶ÎÂä";
    SlotName[ greek ] = "Áíáäßðëùóç ðñþôçò ðáñáãñÜöïõ";
    SlotName[ korean ] = "ù ´Ü¶ô ¼øÈ¯";
    SlotName[ turkish ] = "Ýlk paragrafta metin daðýlýmý";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo SID_ATTR_CHAR_COLOR_BACKGROUND
{
    SlotName = "Zeichenhintergrund";
    SlotName [ english ] =  "Zeichenhintergrund";
    SlotName[ english_us ] = "Highlighting";
    SlotName[ portuguese ] = "Cor de fundo dos caracteres";
    SlotName[ russian ] = "Ïîäöâåòêà";
    SlotName[ dutch ] = "Tekenachtergrond";
    SlotName[ french ] = "Trame de fond";
    SlotName[ spanish ] = "Fondo de carácter";
    SlotName[ italian ] = "Sfondo caratteri";
    SlotName[ danish ] = "Tegnbaggrund";
    SlotName[ swedish ] = "Teckenbakgrund";
    SlotName[ polish ] = "T³o znaków";
    SlotName[ portuguese_brazilian ] = "BackColor";
    SlotName[ japanese ] = "•¶Žš‚Ì”wŒi";
    SlotName[ chinese_simplified ] = "×Ö·û±³¾°";
    SlotName[ chinese_traditional ] = "¦r¤¸­I´º";
    SlotName[ arabic ] = "ÎáÝíÉ ÇáÎØ";
    SlotName[ dutch ] = "Tekenachtergrond";
    SlotName[ chinese_simplified ] = "×Ö·û±³¾°";
    SlotName[ greek ] = "Öüíôï ãñáììáôïóåéñÜò";
    SlotName[ korean ] = "°­Á¶";
    SlotName[ turkish ] = "Vurgu";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo SID_ATTR_CHAR_COLOR_BACKGROUND_EXT
{
    SlotName = "Zeichenhintergrund-Gießkanne";
    SlotName [ english ] =  "Zeichenhintergrund-Gießkanne";
    SlotName[ english_us ] = "Highlight Fill";
    SlotName[ portuguese ] = "Cor de fundo da letra";
    SlotName[ russian ] = "Ïîäöâåòêà-Çàëèâêà";
    SlotName[ dutch ] = "Tekenachtergrond gieter";
    SlotName[ french ] = "Trame de fond verseuse";
    SlotName[ spanish ] = "Fondo de carácter";
    SlotName[ italian ] = "Colore sfondo caratteri";
    SlotName[ danish ] = "Tegnbaggrund-fyld";
    SlotName[ swedish ] = "Teckenbakgrundsvattenkanna";
    SlotName[ polish ] = "T³o znaków-Polewaczka";
    SlotName[ portuguese_brazilian ] = "CharBackgroundExt";
    SlotName[ japanese ] = "•¶Žš”wŒi-…‚â‚è";
    SlotName[ chinese_simplified ] = "×Ö·û±³¾°ÌîÉ«";
    SlotName[ chinese_traditional ] = "¦r¤¸­I´º-¶ñ¦â";
    SlotName[ arabic ] = "ÊÚÈÆÉ ÎáÝíÉ ÇáÎØ";
    SlotName[ dutch ] = "Tekenachtergrond gieter";
    SlotName[ chinese_simplified ] = "×Ö·û±³¾°ÌîÉ«";
    SlotName[ greek ] = "ÐïôéóôÞñé öüíôïõ ÷áñáêôÞñùí";
    SlotName[ korean ] = "ÇÏÀ̶óÀÌÆ® ä¿ì±â";
    SlotName[ turkish ] = "Vurgu renk doldurma";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo SID_ATTR_CHAR_COLOR_EXT
{
    SlotName = "Zeichenfarbe-Gießkanne";
    SlotName [ english ] =  "Zeichenfarbe-Gießkanne";
    SlotName[ english_us ] = "Font Color Fill";
    SlotName[ portuguese ] = "Cor de preenchimento";
    SlotName[ russian ] = "Öâåò øðèôòà-Çàëèâêà";
    SlotName[ dutch ] = "Tekenkleur-gieter";
    SlotName[ french ] = "Couleur de caractère - Verseuse";
    SlotName[ spanish ] = "Color de relleno del carácter";
    SlotName[ italian ] = "Colore riempimento carattere";
    SlotName[ danish ] = "Tegnefarve-fyld";
    SlotName[ swedish ] = "Teckenfärgvattenkanna";
    SlotName[ polish ] = "Kolor znaków-Polewaczka";
    SlotName[ portuguese_brazilian ] = "CharColorExt";
    SlotName[ japanese ] = "•¶Žš‚̐F-…‚â‚è";
    SlotName[ chinese_simplified ] = "×Ö·ûÑÕÉ«ÌîÉ«";
    SlotName[ chinese_traditional ] = "¦r¤¸ÃC¦â-¶ñ¦â";
    SlotName[ arabic ] = "ÊÚÈÆÉ ÃáæÇä ÇáÎØ";
    SlotName[ dutch ] = "Tekenkleur-gieter";
    SlotName[ chinese_simplified ] = "×Ö·ûÑÕÉ«ÌîÉ«";
    SlotName[ greek ] = "ÐïôéóôÞñé ÷ñþìáôïò ÷áñáêôÞñùí";
    SlotName[ korean ] = "±Û²Ã »ö ä¿ì±â";
    SlotName[ turkish ] = "Yazýtipi rengi doldurma";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo SID_ATTR_CHAR_COLOR2
{
    SlotName = "Zeichenfarbe";
    SlotName [ english ] =  "Zeichenfarbe";
    SlotName[ english_us ] = "Font Color";
    SlotName[ portuguese ] = "Cor dos caracteres";
    SlotName[ russian ] = "Öâåò øðèôòà";
    SlotName[ dutch ] = "Tekenkleur";
    SlotName[ french ] = "Couleur de caractères";
    SlotName[ spanish ] = "Color del carácter";
    SlotName[ italian ] = "Colore carattere";
    SlotName[ danish ] = "Tegnfarve";
    SlotName[ swedish ] = "Teckenfärg";
    SlotName[ polish ] = "Kolor znaków";
    SlotName[ portuguese_brazilian ] = "FontColor";
    SlotName[ japanese ] = "Ì«ÝĂ̐F";
    SlotName[ chinese_simplified ] = "×Ö·ûÑÕÉ«";
    SlotName[ chinese_traditional ] = "¦r¤¸ÃC¦â";
    SlotName[ arabic ] = "áæä ÇáÎØ";
    SlotName[ dutch ] = "Tekenkleur";
    SlotName[ chinese_simplified ] = "×Ö·ûÑÕÉ«";
    SlotName[ greek ] = "×ñþìá ãñáììáôïóåéñÜò";
    SlotName[ korean ] = "±Û²Ã »ö";
    SlotName[ turkish ] = "Yazýtipi rengi";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo SID_TEMPLATE_LOAD
{
    SlotName = "Vorlagen laden";
    SlotName [ english ] =  "Vorlagen laden";
    SlotName[ english_us ] = "Load Template";
    SlotName[ portuguese ] = "Carregar estilos";
    SlotName[ russian ] = "Çàãðóçèòü øàáëîíû";
    SlotName[ dutch ] = "Opmaakprofielen laden";
    SlotName[ french ] = "Charger styles";
    SlotName[ spanish ] = "Cargar estilos";
    SlotName[ italian ] = "Carica modelli";
    SlotName[ danish ] = "Indlæs typografier";
    SlotName[ swedish ] = "Ladda mallar";
    SlotName[ polish ] = "£aduj style";
    SlotName[ portuguese_brazilian ] = "FormatStylesLoad";
    SlotName[ japanese ] = "½À²Ù‚̓ǂݍž‚Ý";
    SlotName[ chinese_simplified ] = "×°ÔØÑùʽ";
    SlotName[ chinese_traditional ] = "¸Ë¸ü¼Ë¦¡";
    SlotName[ arabic ] = "ÊÍãíá ÃäãÇØ";
    SlotName[ dutch ] = "Opmaakprofielen laden";
    SlotName[ chinese_simplified ] = "×°ÔØÑùʽ";
    SlotName[ greek ] = "Öüñôùóç ðñïôýðùí";
    SlotName[ korean ] = "·Îµå À¯Çü";
    SlotName[ turkish ] = "Þablonlarý yükle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_COLUMN_SECTION
{
    SlotName = "Bereich einfügen";
    SlotName [ english ] =  "Insert Section";
    SlotName[ english_us ] = "Insert Section";
    SlotName[ portuguese ] = "Inserir secção";
    SlotName[ greek ] = "ÅéóáãùãÞ åíüôçôáò";
    SlotName[ dutch ] = "Bereik invoegen";
    SlotName[ french ] = "Insérer une section";
    SlotName[ spanish ] = "Insertar área";
    SlotName[ swedish ] = "Infoga område";
    SlotName[ russian ] = "Âñòàâèòü îáëàñòü";
    SlotName[ italian ] = "Inserisci sezione";
    SlotName[ danish ] = "Indsæt område";
    SlotName[ polish ] = "Wstaw obszar";
    SlotName[ portuguese_brazilian ] = "Insert Section";
    SlotName[ japanese ] = "”͈͂̑}“ü";
    SlotName[ korean ] = "±¸¿ª »ðÀÔ";
    SlotName[ chinese_simplified ] = "²åÈëÇøÓò";
    SlotName[ chinese_traditional ] = "´¡¤J°Ï°ì";
    SlotName[ arabic ] = "ÅÏÑÇÌ äØÇÞ";
    SlotName[ turkish ] = "Bölüm ekle";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_FORMAT_COLUMN
{
    SlotName = "Spalten";
    SlotName [ english ] =  "Spalten";
    SlotName[ english_us ] = "Columns";
    SlotName[ portuguese ] = "Colunas";
    SlotName[ greek ] = "ÓôÞëåò";
    SlotName[ dutch ] = "Kolommen";
    SlotName[ french ] = "Colonnes";
    SlotName[ spanish ] = "Columnas";
    SlotName[ swedish ] = "Kolumner";
    SlotName[ russian ] = "Êîëîíêè";
    SlotName[ italian ] = "Colonne";
    SlotName[ danish ] = "Kolonner";
    SlotName[ polish ] = "Kolumny";
    SlotName[ portuguese_brazilian ] = "Spalten";
    SlotName[ japanese ] = "’i‘g‚Ý";
    SlotName[ korean ] = "¿­";
    SlotName[ chinese_simplified ] = "ÁÐ";
    SlotName[ chinese_traditional ] = "Äæ";
    SlotName[ arabic ] = "ÃÚãÏÉ";
    SlotName[ turkish ] = "Sütun";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_INSERT_MULTI_TOX
{
    SlotName = "Verzeichnis einfügen";
    SlotName [ english ] =  "Insert Table of";

    SlotName[ english_us ] = "Insert Index";
    SlotName[ portuguese ] = "Inserir índice";
    SlotName[ greek ] = "ÅéóáãùãÞ åõñåôçñßïõ";
    SlotName[ dutch ] = "Index invoegen";
    SlotName[ french ] = "Insérer un index";
    SlotName[ spanish ] = "Insertar índice";
    SlotName[ swedish ] = "Infoga förteckning";
    SlotName[ language_user1 ] = " ";
    SlotName[ russian ] = "Âñòàâèòü óêàçàòåëü";
    SlotName[ italian ] = "Inserisci indice";
    SlotName[ danish ] = "Indsæt indeks";
    SlotName[ polish ] = "Wstaw indeks";
    SlotName[ portuguese_brazilian ] = "Insert Table of";
    SlotName[ japanese ] = "õˆø‚Ì‘}“ü";
    SlotName[ korean ] = "»öÀλðÀÔ";
    SlotName[ chinese_simplified ] = "²åÈëĿ¼";
    SlotName[ chinese_traditional ] = "´¡¤J¥Ø¿ý";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÝåÑÓ";
    SlotName[ turkish ] = "Dizin ekle";
};
SfxSlotInfo FN_INSERT_AUTH_ENTRY_DLG
{
    SlotName = "Literaturverzeichniseintrag einfügen";
    SlotName [ english ] =  "Insert Authorities entry";
    SlotName[ english_us ] = "Insert Bibliography Entry";
    SlotName[ portuguese ] = "Inserir entrada bibliográfica";
    SlotName[ russian ] = "Âñòàâèòü ýëåìåíò ñïèñêà ëèòåðàòóðû";
    SlotName[ greek ] = "ÐñïóèÞêç åããñáöÞò âéâëéïãñáößáò";
    SlotName[ dutch ] = "Item voor literatuurlijst invoegen";
    SlotName[ french ] = "Insérer une entrée de bibliographie";
    SlotName[ spanish ] = "Insertar entrada de bibliografía";
    SlotName[ italian ] = "Inserisci voce bibliografica";
    SlotName[ danish ] = "Indsæt litteraturlisteelement";
    SlotName[ swedish ] = "Infoga litteraturförteckningspost";
    SlotName[ polish ] = "Dodaj wpis bibliograficzny";
    SlotName[ portuguese_brazilian ] = "Insert Authorities entry";
    SlotName[ japanese ] = "ŽQl•¶Œ£‚Ì‘}“ü";
    SlotName[ korean ] = "Âü°í¹®Çå Ç׸ñ »ðÀÔ";
    SlotName[ chinese_simplified ] = "²åÈëÎÄÏ×Ŀ¼ÌõÄ¿";
    SlotName[ chinese_traditional ] = "´¡¤J°Ñ¦Ò¤åÄm¥Ø¿ý";
    SlotName[ arabic ] = "ÅÏÑÇÌ ÅÏÎÇá Ýí ÝåÑÓ ÇáãÑÇÌÚ";
    SlotName[ turkish ] = "Kaynakça giriþi ekle";
    SlotName[ language_user1 ] = " ";
};

SfxSlotInfo FN_EDIT_AUTH_ENTRY_DLG
{
    SlotName = "Literaturverzeichniseintrag bearbeiten";
    SlotName [ english ] =  "Edit Authorities entry";
    SlotName[ english_us ] = "Edit Bibliography Entry";
    SlotName[ portuguese ] = "Editar entrada bibliográfica";
    SlotName[ russian ] = "Ïðàâêà ýëåìåíòà ñïèñêà ëèòåðàòóðû";
    SlotName[ greek ] = "Åðåîåñãáóßá åããñáöÞò âéâëéïãñáößáò";
    SlotName[ dutch ] = "Item voor literatuurlijst bewerken";
    SlotName[ french ] = "Éditer une entrée de bibliographie";
    SlotName[ spanish ] = "Editar entrada de bibliografía";
    SlotName[ italian ] = "Modifica voce bibliografica";
    SlotName[ danish ] = "Rediger litteraturlisteelement";
    SlotName[ swedish ] = "Redigera litteraturförteckningspost";
    SlotName[ polish ] = "Edytuj wpis bibliograficzny";
    SlotName[ portuguese_brazilian ] = "Edit Authorities entry";
    SlotName[ japanese ] = "ŽQl•¶Œ£•\\‚̕ҏW";
    SlotName[ korean ] = "Âü°í¹®Çå Ç׸ñÆíÁý";
    SlotName[ chinese_simplified ] = "±à¼­ÎÄÏ×Ŀ¼ÌõÄ¿";
    SlotName[ chinese_traditional ] = "½s¿è°Ñ¦Ò¤åÄm¥Ø¿ýªº±ø¥Ø";
    SlotName[ arabic ] = "ÊÍÑíÑ ÅÏÎÇá Ýí ÝåÑÓ ÇáãÑÇÌÚ";
    SlotName[ turkish ] = "Kaynakça giriþini düzenle";
    SlotName[ language_user1 ] = " ";
};

SfxSlotInfo FN_REMOVE_CUR_TOX
{
    SlotName = "Verzeichnis löschen";
    SlotName [ english ] =  "Remove index";
    SlotName[ english_us ] = "Delete index";
    SlotName[ portuguese ] = "Eliminar índice";
    SlotName[ russian ] = "Óäàëèòü óêàçàòåëü";
    SlotName[ greek ] = "ÄéáãñáöÞ åõñåôçñßïõ";
    SlotName[ dutch ] = "Index wissen";
    SlotName[ french ] = "Supprimer l'index";
    SlotName[ spanish ] = "Eliminar índice";
    SlotName[ italian ] = "Rimuovi indice";
    SlotName[ danish ] = "Slet indeks";
    SlotName[ swedish ] = "Radera förteckning";
    SlotName[ polish ] = "Usuñ ideks.";
    SlotName[ portuguese_brazilian ] = "Remove index";
    SlotName[ japanese ] = "–ÚŽŸ‚ƍõˆø‚̍폜";
    SlotName[ korean ] = "»öÀÎ Á¦°Å";
    SlotName[ chinese_simplified ] = "ɾ³ýĿ¼";
    SlotName[ chinese_traditional ] = "§R°£¥Ø¿ý";
    SlotName[ arabic ] = "ÍÐÝ ÇáÝåÑÓ";
    SlotName[ turkish ] = "Dizini sil";
    SlotName[ language_user1 ] = " ";
};
SfxSlotInfo FN_EDIT_HYPERLINK
{
    SlotName = "Hyperlink bearbeiten";
    SlotName [ english ] =  "Edit hyperlink";
    SlotName[ english_us ] = "Edit hyperlink";
    SlotName[ portuguese ] = "Editar hiperligação";
    SlotName[ russian ] = "Ïðàâêà ãèïåðññûëêè";
    SlotName[ greek ] = "Åðåîåñãáóßá õðåñ-óýíäåóçò";
    SlotName[ dutch ] = "Hyperlink bewerken";
    SlotName[ french ] = "Éditer l'hyperlien";
    SlotName[ spanish ] = "Editar hiperenlace";
    SlotName[ italian ] = "Modifica hyperlink";
    SlotName[ danish ] = "Rediger hyperlink";
    SlotName[ swedish ] = "Redigera hyperlänk";
    SlotName[ polish ] = "Edytuj hiper³¹cze";
    SlotName[ portuguese_brazilian ] = "Edit hyperlink";
    SlotName[ japanese ] = "ʲÊß°ØÝ¸‚̕ҏW";
    SlotName[ korean ] = "ÇÏÀÌÆÛ¸µÅ© ÆíÁý";
    SlotName[ chinese_simplified ] = "±à¼­³¬Á´½Ó";
    SlotName[ chinese_traditional ] = "½s¿è¶W³sµ²";
    SlotName[ arabic ] = "ÊÍÑíÑ ÇáÇÑÊÈÇØ ÇáÊÔÚÈí";
    SlotName[ turkish ] = "Hyperlink'i düzenle";
};


diff --git a/sw/sdi/tabsh.sdi b/sw/sdi/tabsh.sdi
new file mode 100644
index 0000000..a35ba2a
--- /dev/null
+++ b/sw/sdi/tabsh.sdi
@@ -0,0 +1,100 @@
/*------------------------------------------------------------------------

    $Workfile:   tabsh.sdi  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/tabsh.sdi,v 1.1.1.1 2000-09-18 17:14:30 hr Exp $

    Beschreibung:   IDL - File fuer TabShell

    (c) Copyright 1997 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/

interface TextTable : BaseTextTable
[
    uuid = "49CE7CA0-111A-101D-9757-6E74207A7520"
]
{
    // hier sollen die Slots eingefuegt werden, die vom StarWriter/WEB
    // nicht unterstuetzt werden

    import TextSelection;

   FN_TABLE_SET_READ_ONLY_CELLS // status(final|play)
    [
        ExecMethod = Execute;
        StateMethod = NoState;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
/*
    SvxFmtSplitItem TableSplit SID_ATTR_PARA_SPLIT // status(final|play)
    [
        ExecMethod = Execute;
        StateMethod = GetState;
        GroupId = GID_TABLE ;
    ]
    SvxFmtKeepItem TableKeepTogether SID_ATTR_PARA_KEEP // status(final|play)
    [
        ExecMethod = Execute;
        StateMethod = GetState;
        GroupId = GID_TABLE ;
    ]
*/
}

 //=========================================================================

shell SwTableShell : SwBaseShell

{
        import TextTable[Automation];
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.98  1998/11/12 16:29:10  MA
    #58677# Disable Flag


      Rev 1.97   12 Nov 1998 17:29:10   MA
   #58677# Disable Flag

      Rev 1.96   28 Aug 1997 12:49:52   MBA
   Neue Interface-Namen

      Rev 1.95   13 Jun 1997 16:39:58   MA
   fix: Kommentar statt if

      Rev 1.94   04 Jun 1997 13:01:04   MA
   chg: Keep und Split vorerst 'raus

      Rev 1.93   11 Apr 1997 15:55:58   MA
   new: Split+Keep

      Rev 1.92   13 Feb 1997 12:44:46   MA
   unnoetige Texte entfernt

      Rev 1.91   27 Jan 1997 16:38:16   OS
   Web-Slots aus den allg. interfaces raus

      Rev 1.90   23 Jan 1997 14:30:12   OS
   Ableitung von _Table

      Rev 1.89   18 Jan 1997 15:32:34   OS
   neu: CellName an Tabellen

      Rev 1.88   15 Jan 1997 14:56:26   MA
   chg: State fuer merge

      Rev 1.87   09 Jan 1997 15:53:46   OS
   neue Slots fuer Zellen/Spalten/Zeilen verschieben/einfuegen/loeschen

      Rev 1.86   20 Dec 1996 14:34:20   OS
   V-Alignment auch aus dem Basic

      Rev 1.85   18 Dec 1996 14:53:20   OS
   BoxAlign eingebaut

------------------------------------------------------------------------*/

diff --git a/sw/sdi/textsh.sdi b/sw/sdi/textsh.sdi
new file mode 100644
index 0000000..a78f08e
--- /dev/null
+++ b/sw/sdi/textsh.sdi
@@ -0,0 +1,214 @@
/*------------------------------------------------------------------------

    $Workfile:   TEXTSH.SDI  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/textsh.sdi,v 1.1.1.1 2000-09-18 17:14:30 hr Exp $

    Beschreibung:   IDL - File Textshell fuer Sw3

    (c) Copyright 1995 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/



/*
F23BA0A1-73A0-11d0-89CA-008029E4B0B1
F23BA0A2-73A0-11d0-89CA-008029E4B0B1
F23BA0A3-73A0-11d0-89CA-008029E4B0B1
F23BA0A4-73A0-11d0-89CA-008029E4B0B1
F23BA0A5-73A0-11d0-89CA-008029E4B0B1
F23BA0A6-73A0-11d0-89CA-008029E4B0B1
F23BA0A7-73A0-11d0-89CA-008029E4B0B1
F23BA0A8-73A0-11d0-89CA-008029E4B0B1


 */

interface Text : BaseText
[
    uuid = "1BD56200-111A-101D-9757-6E74207A7520"
]
{
    FN_INSERT_FRAME_INTERACT // status()
    [
        ExecMethod = ExecInsert ;
        StateMethod = StateInsert ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
        Cachable ;
    ]
     // hier sollen die Slots eingefuegt werden, die vom StarWriter/WEB
     // nicht unterstuetzt werden

    import TextSelection;

    /*-----------------24.01.97 08.13-------------------
    Spezielle Feldbefehle
--------------------------------------------------*/

    FN_INSERT_FLD_TOPIC
    [
        ExecMethod = ExecField ;
        StateMethod = StateField ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
        ReadOnlyDoc = FALSE ;
    ]
    /*-----------------24.01.97 08.13-------------------
    Ende Spezielle Feldbefehle
--------------------------------------------------*/

    /*-----------------24.01.97 07.36-------------------
    Verzeichnisse
--------------------------------------------------*/

    /*
enum TOXTypes
{
    TOX_INDEX,
    TOX_USER,
    TOX_CONTENT
};

 */

    FN_INSERT_IDX_ENTRY_DLG // status(final|play)
    [
        ExecMethod = ExecIdx ;
        StateMethod = GetIdxState ;
    ]

    FN_INSERT_AUTH_ENTRY_DLG
    [
        ExecMethod = ExecIdx ;
        StateMethod = GetIdxState ;
    ]
    FN_EDIT_AUTH_ENTRY_DLG
    [
        ExecMethod = ExecIdx ;
        StateMethod = GetIdxState ;
    ]
    FN_EDIT_IDX_ENTRY_DLG // status(final|play)
    [
        ExecMethod = ExecIdx ;
        StateMethod = GetIdxState ;
    ]
    FN_INSERT_MULTI_TOX // status(final|play)
    [
        ExecMethod = ExecIdx ;
        StateMethod = GetIdxState ;
    ]
    FN_REMOVE_CUR_TOX
    [
        ExecMethod = ExecIdx ;
        StateMethod = GetIdxState ;
    ]
    FN_IDX_MARK_TO_IDX // status(final|play)
    [
        ExecMethod = ExecIdx ;
    ]

    /*-----------------24.01.97 08.01-------------------
    Absatzeinstellungen
--------------------------------------------------*/

    /*-----------------24.01.97 08.01-------------------
    Ende Absatzeinstellungen
--------------------------------------------------*/

}

shell SwTextShell : SwBaseShell
{
    import Text[Automation];
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.239  2000/06/20 14:47:52  os
    #70060# less occurences of columns in HTML

    Revision 1.238  2000/05/26 07:06:19  os
    old SW Basic API Slots removed

    Revision 1.237  2000/02/22 14:49:18  os
    #72894# footnote option dialog in HTML documents

    Revision 1.236  2000/02/10 11:57:08  os
    #72894# fields pageno, pagecount, title and insert footnote enabled in SW/Web

    Revision 1.235  2000/01/13 09:20:14  os
    #71814# FN_INSERT_IDX_ENTRY allowed on protected cursor

    Revision 1.234  1999/12/10 15:16:35  os
    #70711# readonly check for index entries now in GetIdxState

    Revision 1.233  1999/10/15 11:25:59  os
    new: FN_REMOVE_TOX

    Revision 1.232  1999/09/15 13:56:36  os
    dialog for authorities

    Revision 1.231  1999/09/10 08:51:10  jp
    FormatFootnoteDialog: dont disable by protected cursor

    Revision 1.230  1999/07/30 11:14:16  OS
    indexes: check readonly in status method


      Rev 1.229   30 Jul 1999 13:14:16   OS
   indexes: check readonly in status method

      Rev 1.228   21 Jun 1999 09:56:24   OS
   extended indexes

      Rev 1.227   23 Mar 1999 12:15:10   MA
   #63806# ConfigName und HelpText entfernt

      Rev 1.226   05 Feb 1999 17:04:48   OS
   #61547# InsertEndnoteDirect

      Rev 1.225   22 Jan 1999 11:54:08   JP
   Task #58677#: Crsr in Readonly Bereichen zulassen

      Rev 1.224   12 Nov 1998 17:29:18   MA
   #58677# Disable Flag

      Rev 1.223   06 Apr 1998 09:45:00   OS
   INSERT_FRAME_INTERACT fuer manche HTML-Exports erlaubt

      Rev 1.222   28 Aug 1997 12:53:10   MBA
   Neue Interface-Namen

      Rev 1.221   25 Jul 1997 11:31:04   AMA
   Opt: GroupId und ConfigName aufgeraeumt

      Rev 1.220   13 Feb 1997 12:44:56   MA
   unnoetige Texte entfernt

      Rev 1.219   05 Feb 1997 13:26:50   OS
   Blocksatz auch wieder fuer Web

      Rev 1.218   04 Feb 1997 13:40:20   HJS
   merge 04.02.97

      Rev 1.217   28 Jan 1997 13:27:40   HJS
   merge 28.01.97

      Rev 1.216   24 Jan 1997 14:58:28   OS
   nicht-Web-Slots verschoben

      Rev 1.215   23 Jan 1997 14:31:24   OS
   Ableitung von _Text

      Rev 1.214   21 Jan 1997 12:32:40   HJS
   merge 21.01.97

      Rev 1.213   15 Jan 1997 16:05:54   OM
   Neue OLE-Dialog

      Rev 1.212   14 Jan 1997 13:43:24   JP
   SID_INC_INDENT/_DEC: StatusMethode

------------------------------------------------------------------------*/

diff --git a/sw/sdi/viewsh.sdi b/sw/sdi/viewsh.sdi
new file mode 100644
index 0000000..f074d44
--- /dev/null
+++ b/sw/sdi/viewsh.sdi
@@ -0,0 +1,305 @@
/*------------------------------------------------------------------------

    $Workfile:   viewsh.sdi  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/viewsh.sdi,v 1.1.1.1 2000-09-18 17:14:30 hr Exp $

    Beschreibung:   IDL - File ViewShell fuer Sw3

    (c) Copyright 1989 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/

interface TextInTable : Selection
[ uuid = "63C33940-69D8-101D-9757-C667E8298000" ]
{
    import Text;
        import TextTable;
}

interface ListInTable : Selection
[ uuid="7F1A6E20-69D8-101D-9757-C667E8298000" ]
{
    import Text;
        import TextList;
        import TextTable;
}

interface ListInText : Selection
[ uuid = "8A4C07E0-69D8-101D-9757-C667E8298000"]
{
    import TextList;
    import Text;
}

interface TextEditView : BaseTextEditView
[
    uuid = "09782660-111A-101D-9757-6E74207A7520"
]
{
     // Slots, die nicht in der WebDocShell gebraucht werden
    FN_INSERT_OBJ_CTRL
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        Export = FALSE ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_INSERT_CAPTION // status()
    [
        ExecMethod = ExecDlgExt ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_EDIT_FOOTNOTE // status(final|play)
    [
        ExecMethod = ExecDlgExt ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_HYPHENATE_OPT_DLG // status(final|play)
    [
        ExecMethod = ExecLingu ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_CHANGE_PAGENUM // status(final)
    [
        ExecMethod = ExecDlg ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SvxDrawToolItem DrawSelect SID_INSERT_DRAW // status()
    [
        ExecMethod = ExecDraw ;
        StateMethod = GetDrawState ;
    ]
    SfxBoolItem CreateControl SID_FM_CREATE_CONTROL // status()
    [
        ExecMethod = ExecDraw ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
}
 //=========================================================================

shell SwView : SfxViewShell

{
    import TextEditView [Automation];
//  import TextPage "Page";
//  import SearchSettings;
//  import SearchAttributes;
//  import ReplaceAttributes;
}

interface TextPrintPreview : View
[ uuid = "1622A480-111A-101D-9757-6E74207A7520" ]
{
    FN_REFRESH_VIEW // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
    FN_CHAR_LEFT // status(final|play)
    [
        ExecMethod = Execute;
        StateMethod = NoState ;
    ]
    FN_CHAR_RIGHT // status(final|play)
    [
        ExecMethod = Execute;
        StateMethod = NoState ;
    ]
    FN_LINE_UP // status(final|play)
    [
        ExecMethod = Execute;
        StateMethod = NoState ;
    ]
    FN_LINE_DOWN // status(final|play)
    [
        ExecMethod = Execute;
        StateMethod = NoState ;
    ]
    FN_PAGEUP // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
    FN_PAGEDOWN // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
    FN_START_OF_DOCUMENT // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
    FN_END_OF_DOCUMENT // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
    FN_SHOW_TWO_PAGES // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
    FN_SHOW_FOUR_PAGES // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
    FN_PREVIEW_PRINT_OPTIONS //status()
    [
        ExecMethod = Execute ;
    ]
    FN_PRINT_PAGEPREVIEW // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
    SID_PRINTDOC // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
    SID_PRINTDOCDIRECT // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
    SID_PRINTPREVIEW // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
    FN_PREVIEW_ZOOM
    [
        ExecMethod = Execute ;
    ]
    SID_UNDO // status()
    [
        StateMethod = StateUndo ;
    ]
    SID_REDO // status()
    [
        StateMethod = StateUndo ;
    ]
    SID_REPEAT // status()
    [
        StateMethod = StateUndo ;
    ]
     //---------------------------------------------------------------------
     //Ab hier Statusleiste
    FN_STAT_ZOOM // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
    SID_ATTR_ZOOM // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
    FN_STAT_PAGE // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
     //----------------------------------------------
     //End mit Statusleiste
}

 //=========================================================================

shell SwPagePreView : SfxViewShell
{
    import TextPrintPreview[Automation];
}



/*

9D84FD80-69D8-101D-9757-C667E8298000

A53B7A40-69D8-101D-9757-C667E8298000

AA3EBDE0-69D8-101D-9757-C667E8298000



  */


/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.245  2000/08/07 11:49:25  jp
    PagePreView replace the current view

    Revision 1.244  2000/05/26 07:06:19  os
    old SW Basic API Slots removed

    Revision 1.243  2000/05/10 12:00:10  os
    Basic API removed

    Revision 1.242  1998/11/12 16:28:58  MA
    #58677# Disable Flag


      Rev 1.241   12 Nov 1998 17:28:58   MA
   #58677# Disable Flag

      Rev 1.240   29 Sep 1998 14:35:18   OS
   #57281#, #57264# Zoom der Preview mit Controller, Preview-Close ueber eigenen Slot

      Rev 1.239   21 Aug 1998 15:44:10   OS
   Seitendruck PagePreview #55252#

      Rev 1.238   10 Mar 1998 14:22:38   OM
   Konstruktionsmodul fuer Forms

      Rev 1.237   30 Oct 1997 15:16:46   JP
   neu: LineUp/-Down und CharLeft/CharRight fuer PagePreView

      Rev 1.236   28 Aug 1997 12:37:34   MBA
   Neue Interface-Namen

      Rev 1.235   14 Apr 1997 16:02:58   OS
   neu: SearchAttributes und ReplaceAttributes

      Rev 1.234   24 Feb 1997 16:56:32   OM
   Silbentrennung in Draw-Objekten

      Rev 1.233   13 Feb 1997 12:44:50   MA
   unnoetige Texte entfernt

      Rev 1.232   04 Feb 1997 13:42:20   HJS
   merge 04.02.97

      Rev 1.231   30 Jan 1997 12:40:46   HJS
   quickmerge 30.01.97

      Rev 1.230   28 Jan 1997 16:37:02   OS
   DrawSelect nicht im WebWriter

      Rev 1.229   27 Jan 1997 16:37:34   OS
   Web-Slots aus den allg. interfaces raus

      Rev 1.228   23 Jan 1997 08:35:04   OS
   Ableitung von __View

      Rev 1.227   21 Jan 1997 12:31:42   HJS
   merge 21.01.97

      Rev 1.226   17 Jan 1997 13:08:24   OS
   alte Slot-defines entfernt, xxxConfig fuer FN_UPDATE_TOX

      Rev 1.225   14 Jan 1997 12:12:26   HJS
   merge 14.01.97


------------------------------------------------------------------------*/

diff --git a/sw/sdi/wbasesh.sdi b/sw/sdi/wbasesh.sdi
new file mode 100644
index 0000000..1d17dfe
--- /dev/null
+++ b/sw/sdi/wbasesh.sdi
@@ -0,0 +1,48 @@
/*-----------------------------------------------------------------------

    $Workfile:   WBASESH.IDL  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/wbasesh.sdi,v 1.1.1.1 2000-09-18 17:14:30 hr Exp $

    Beschreibung:   IDL - File SwWebBaseShell fuer StarWriter/WEB

    (c) Copyright 1997 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/

interface WebSelection : BaseTextSelection
[
    Automation = FALSE;
]
{
    // hier kommt nur dann etwas hinein, wenn es im
    // kompletten StarWriter nicht benoetigt wird
}

shell SwWebBaseShell
{
        import WebSelection[Automation];
        import Interior "Interior";
        import Shadow "Shadow";

}
/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.3  1997/08/28 10:52:44  MBA
    Neue Interface-Namen


      Rev 1.2   28 Aug 1997 12:52:44   MBA
   Neue Interface-Namen

      Rev 1.1   23 Jan 1997 14:41:16   OS
   jetzt SwWebBaseShell

      Rev 1.0   23 Jan 1997 08:41:06   OS
   Initial revision.


------------------------------------------------------------------------*/


diff --git a/sw/sdi/wbeziers.sdi b/sw/sdi/wbeziers.sdi
new file mode 100644
index 0000000..464bdc4
--- /dev/null
+++ b/sw/sdi/wbeziers.sdi
@@ -0,0 +1,38 @@
/*------------------------------------------------------------------------

    $Workfile:   wbeziers.idl  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/wbeziers.sdi,v 1.1.1.1 2000-09-18 17:14:30 hr Exp $

    Beschreibung:   IDL - File SwBezierShell fuer StarWriter/Web

    (c) Copyright 1997 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/

interface Bezier : _Bezier
[ uuid = "68EF7EA0-6876-11D0-A887-008029E86826" ]
{
}

shell SwBezierShell: SwBaseShell
{
    import Bezier[Automation];
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.2  2000/02/01 09:45:00  os
    #72282# SwWebBaseShell removed

    Revision 1.1  1997/01/23 13:48:58  OS
    Initial revision.


      Rev 1.0   23 Jan 1997 14:48:58   OS
   Initial revision.


------------------------------------------------------------------------*/

diff --git a/sw/sdi/wdocsh.sdi b/sw/sdi/wdocsh.sdi
new file mode 100644
index 0000000..a0789f7
--- /dev/null
+++ b/sw/sdi/wdocsh.sdi
@@ -0,0 +1,97 @@
/*------------------------------------------------------------------------

    $Workfile:   wdocsh.sdi  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/wdocsh.sdi,v 1.1.1.1 2000-09-18 17:14:30 hr Exp $

    Beschreibung:   SwWebDocShell

    (c) Copyright 1997 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/

interface WebDocument : BaseTextDocument
[
    uuid = "B47F0DE4-1E1F-11d1-89CA-008029E4B0B1"
]
{
    // hier nur Slots, die der vollstaendige Writer nicht braucht
    SID_SOURCEVIEW
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        Volatile = TRUE;
        Asynchron = TRUE;
    ]

    SID_HTML_MODE
    [
        StateMethod = GetState ;
    ]

    FN_PRINT_LAYOUT
    [
        ExecMethod = Execute;
        StateMethod = GetState;
    ]
}

shell SwWebDocShell : SfxObjectShell
{
        import WebDocument[Automation];
}

shell SwWebGlosDocShell : SwWebDocShell
{
    SID_SAVEDOC  // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.12  1999/03/23 11:15:06  MA
    #63806# ConfigName und HelpText entfernt


      Rev 1.11   23 Mar 1999 12:15:06   MA
   #63806# ConfigName und HelpText entfernt

      Rev 1.10   01 Oct 1997 12:03:12   OS
   SID_SOURCEVIEW im Writer immer asynchron #44269#

      Rev 1.9   28 Aug 1997 12:38:46   MBA
   Neue Interface-Namen

      Rev 1.8   06 Aug 1997 14:50:48   OS
   FN_SOURCEVIEW -> SID_SOURCEVIEW

      Rev 1.7   23 Jul 1997 16:08:00   AMA
   Opt: ConfigName etc. aufgeraeumt

      Rev 1.6   16 Jun 1997 13:08:16   MA
   #40731# falsches Exportverbot entfernt

      Rev 1.5   09 Jun 1997 14:27:16   MA
   chg: Browse-Flag nur noch am Doc

      Rev 1.4   26 May 1997 12:45:10   OS
   FN_SOURCEVIEW waehrend des Ladens disabled (Volatile)

      Rev 1.3   12 Feb 1997 11:58:44   JP
   neu: WebGlossryDocShell

      Rev 1.2   03 Feb 1997 12:04:06   OS
   SID_HTML_MODE an der WebDocShell

      Rev 1.1   30 Jan 1997 15:28:20   OS
   SourceView nur noch fuer den Sw/Web

      Rev 1.0   23 Jan 1997 08:42:06   OS
   Initial revision.

------------------------------------------------------------------------*/

diff --git a/sw/sdi/wdrwbase.sdi b/sw/sdi/wdrwbase.sdi
new file mode 100644
index 0000000..5ceadf5
--- /dev/null
+++ b/sw/sdi/wdrwbase.sdi
@@ -0,0 +1,60 @@
/*-----------------------------------------------------------------------

    $Workfile:   wdrwbase.sdi  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/wdrwbase.sdi,v 1.1.1.1 2000-09-18 17:14:30 hr Exp $

    Beschreibung:   WebDrawBaseShell

    (c) Copyright 1997 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/

interface WebDrawBase : BaseTextDrawBase
[
    Automation = FALSE;
]
{
    import BaseTextSelection;
}


shell SwWebDrawBaseShell: SwBaseShell
{
        import WebDrawBase[Automation];

    SID_OBJECT_ALIGN
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.6  2000/02/01 09:45:00  os
    #72282# SwWebBaseShell removed

    Revision 1.5  1998/11/12 16:28:52  MA
    #58677# Disable Flag


      Rev 1.4   12 Nov 1998 17:28:52   MA
   #58677# Disable Flag

      Rev 1.3   03 Sep 1997 16:51:40   MBA
   Neue Shell

      Rev 1.2   28 Aug 1997 12:37:14   MBA
   Neue Interface-Namen

      Rev 1.1   12 Feb 1997 19:00:52   MA
   unnoetige Texte

      Rev 1.0   23 Jan 1997 14:43:06   OS
   Initial revision.

------------------------------------------------------------------------*/

diff --git a/sw/sdi/wformsh.sdi b/sw/sdi/wformsh.sdi
new file mode 100644
index 0000000..75252f1
--- /dev/null
+++ b/sw/sdi/wformsh.sdi
@@ -0,0 +1,25 @@
interface WebDrawForm: BaseTextDrawForm
[
    uuid = "4bac4490-fede-11d1-abff-006097b418c2"
]
{
    import WebDrawBase;
}

shell SwWebDrawFormShell : SwWebDrawBaseShell
{
    import WebDrawForm[Automation];
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.1  1998/06/08 16:07:30  OM
    Initial revision.


      Rev 1.0   08 Jun 1998 18:07:30   OM
   Initial revision.

------------------------------------------------------------------------*/

diff --git a/sw/sdi/wfrmsh.sdi b/sw/sdi/wfrmsh.sdi
new file mode 100644
index 0000000..3450f49
--- /dev/null
+++ b/sw/sdi/wfrmsh.sdi
@@ -0,0 +1,50 @@
/*------------------------------------------------------------------------

    $Workfile:   wfrmSH.IDL  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/wfrmsh.sdi,v 1.1.1.1 2000-09-18 17:14:30 hr Exp $

    Beschreibung:   FrameShell fuer StarWriter/Web

    (c) Copyright 1997 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/

interface WebFrame : BaseTextFrame
[
    uuid = "B47F0DE6-1E1F-11d1-89CA-008029E4B0B1"
]
{
    import BaseTextSelection;
}


 //=========================================================================

shell SwWebFrameShell : SwBaseShell
{
        import WebFrame[Automation];
}


/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.4  2000/02/01 09:45:00  os
    #72282# SwWebBaseShell removed

    Revision 1.3  1997/08/28 10:51:42  MBA
    Neue Interface-Namen


      Rev 1.2   28 Aug 1997 12:51:42   MBA
   Neue Interface-Namen

      Rev 1.1   31 Jan 1997 13:24:50   OS
   SwWebFrameShell

      Rev 1.0   23 Jan 1997 14:46:46   OS
   Initial revision.

------------------------------------------------------------------------*/

diff --git a/sw/sdi/wgrfsh.sdi b/sw/sdi/wgrfsh.sdi
new file mode 100644
index 0000000..42837d3
--- /dev/null
+++ b/sw/sdi/wgrfsh.sdi
@@ -0,0 +1,49 @@
/*------------------------------------------------------------------------

    $Workfile:   WGRFSH.IDL  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/wgrfsh.sdi,v 1.1.1.1 2000-09-18 17:14:30 hr Exp $

    Beschreibung:   GraphicShell fuer StarWriter/Web

    (c) Copyright 1997 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/

interface WebGraphic : BaseTextGraphic
[
    uuid = "B47F0DEB-1E1F-11d1-89CA-008029E4B0B1"
]
{
}


 //=========================================================================

shell SwWebGrfShell : SwBaseShell
{
        import WebGraphic[Automation];
}


/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.4  2000/08/08 13:42:52  os
    #77423# separate graphic shell

    Revision 1.3  1997/09/03 14:53:42  MBA
    Neue Shell


      Rev 1.2   03 Sep 1997 16:53:42   MBA
   Neue Shell

      Rev 1.1   28 Aug 1997 12:52:56   MBA
   Neue Interface-Namen

      Rev 1.0   31 Jan 1997 13:29:24   OS
   Initial revision.

------------------------------------------------------------------------*/

diff --git a/sw/sdi/wlistsh.sdi b/sw/sdi/wlistsh.sdi
new file mode 100644
index 0000000..e205a0b
--- /dev/null
+++ b/sw/sdi/wlistsh.sdi
@@ -0,0 +1,48 @@
/*------------------------------------------------------------------------

    $Workfile:   WLISTSH.IDL  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/wlistsh.sdi,v 1.1.1.1 2000-09-18 17:14:30 hr Exp $

    Beschreibung:   IDL - File SwWebBaseShell fuer StarWriter /Web

    (c) Copyright 1989 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/

interface WebList : BaseTextList
[
    uuid = "B47F0DE3-1E1F-11d1-89CA-008029E4B0B1"
]
{
    import TextSelection;
}

 //=========================================================================

shell SwWebListShell : SwBaseShell
{
        import WebList[Automation];
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.4  2000/02/01 09:45:00  os
    #72282# SwWebBaseShell removed

    Revision 1.3  1997/09/03 14:52:36  MBA
    Neue Shell


      Rev 1.2   03 Sep 1997 16:52:36   MBA
   Neue Shell

      Rev 1.1   28 Aug 1997 12:38:04   MBA
   Neue Interface-Namen

      Rev 1.0   23 Jan 1997 14:43:32   OS
   Initial revision.

------------------------------------------------------------------------*/

diff --git a/sw/sdi/wolesh.sdi b/sw/sdi/wolesh.sdi
new file mode 100644
index 0000000..3caf840
--- /dev/null
+++ b/sw/sdi/wolesh.sdi
@@ -0,0 +1,47 @@
/*------------------------------------------------------------------------

    $Workfile:   WOLESH.IDL  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/wolesh.sdi,v 1.1.1.1 2000-09-18 17:14:30 hr Exp $

    Beschreibung:   OleShell fuer StarWriter/Web

    (c) Copyright 1997 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/

interface WebOLEObject : BaseTextOLEObject
[
    uuid = "B47F0DE2-1E1F-11d1-89CA-008029E4B0B1"
]
{
    import WebFrame;
}


 //=========================================================================

shell SwWebOleShell : SwWebFrameShell
{
        import WebOLEObject[Automation];
}


/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.3  1997/09/10 06:56:54  OS
    OLE importiert Frame


      Rev 1.2   10 Sep 1997 08:56:54   OS
   OLE importiert Frame

      Rev 1.1   28 Aug 1997 12:37:54   MBA
   Neue Interface-Namen

      Rev 1.0   31 Jan 1997 13:29:02   OS
   Initial revision.

------------------------------------------------------------------------*/

diff --git a/sw/sdi/wrtapp.sdi b/sw/sdi/wrtapp.sdi
new file mode 100644
index 0000000..25aebdb
--- /dev/null
+++ b/sw/sdi/wrtapp.sdi
@@ -0,0 +1,367 @@
/*------------------------------------------------------------------------

    $Workfile:   wrtapp.sdi  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/wrtapp.sdi,v 1.1.1.1 2000-09-18 17:14:31 hr Exp $

    Beschreibung:   IDL - File SwWriterApp - Shell fuer Sw3

    (c) Copyright 1989 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/


interface StarWriter : Module
[
    uuid ( "4BF0AA20-E6B9-101C-8A0E-040224007802" )
]
{
    FN_ENVELOP  // status(final|play)
    [
        ExecMethod = ExecOther ;
        StateMethod = StateOther ;
        DisableFlags="SW_DISABLE_ON_MAILBOX_EDITOR";
    ]

    FN_LABEL  // status(final|play)
    [
        ExecMethod = ExecOther ;
        StateMethod = StateOther ;
        DisableFlags="SW_DISABLE_ON_MAILBOX_EDITOR";
    ]
    FN_BUSINESS_CARD // status()
    [
        ExecMethod = ExecOther ;
        StateMethod = StateOther ;
        DisableFlags="SW_DISABLE_ON_MAILBOX_EDITOR";
    ]

    SID_SW_DOCMAN_PATH // status()
    [
         //     nur fuer Autopilot
        ExecMethod = ExecOther ;
        StateMethod = NoState ;
    ]

    SID_ATTR_METRIC // status(final|play)
    [
        ExecMethod = ExecOther ;
        StateMethod = StateOther ;
    ]
    SID_SW_AGENDA_WIZZARD
    [
        ExecMethod = ExecWizzard ;
        StateMethod = NoState ;
    ]
    SID_SW_FAX_WIZZARD
    [
        ExecMethod = ExecWizzard ;
        StateMethod = NoState ;
    ]
    SID_SW_LETTER_WIZZARD
    [
        ExecMethod = ExecWizzard ;
        StateMethod = NoState ;
    ]
    SID_SW_MEMO_WIZZARD
    [
        ExecMethod = ExecWizzard ;
        StateMethod = NoState ;
    ]

/*  SID_SW_EDITOPTIONS
    [
        ExecMethod = ExecOptionsDialog ;
        StateMethod = NoState ;
    ]

    SID_SW_ONLINEOPTIONS
    [
        ExecMethod = ExecOptionsDialog ;
        StateMethod = NoState ;
    ]*/

    FN_QRY   // status()
    [
        ExecMethod = ExecDB ;
        StateMethod = StateIsView ;
    ]

    FN_QRY_MERGE  // status()
    [
        ExecMethod = ExecDB ;
        StateMethod = StateIsView ;
        DisableFlags="SW_DISABLE_ON_MAILBOX_EDITOR";
    ]

    SID_ATTR_UNDO_COUNT // ole(no) api(final/play)
    [
        ExecMethod = ExecOther ;
        StateMethod = StateOther ;
    ]

    SID_AUTOSPELL_CHECK
    [
        ExecMethod = ExecViewOptions ;
        StateMethod = StateViewOptions ;
    ]

    SID_AUTOSPELL_MARKOFF
    [
        ExecMethod = ExecViewOptions ;
        StateMethod = StateViewOptions ;
    ]

    FN_SET_MODOPT_TBLNUMFMT // status()
    [
        ExecMethod = ExecOther ;
        StateMethod = StateOther ;
    ]
        //Extra/Optionen/Ansicht
        //Wird zusammen zum Property ViewSettings
    FN_VIEW_HIDDEN_PARA
    [
        ExecMethod = ExecViewOptions ;
        StateMethod = StateViewOptions ;
        Export = FALSE;
    ]

    FN_PRINT_LAYOUT
    [
        ExecMethod = ExecViewOptions ;
        StateMethod = StateViewOptions ;
        Export = FALSE;
    ]
     // alles ab hier kann weg (Export = FALSE;), wenn die vorangehenden funktionieren
    SfxBoolItem Ruler FN_RULER // status()
    [
        ExecMethod = ExecViewOptions ;
        StateMethod = StateViewOptions ;
        Export = FALSE;
        Cachable;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_VIEW_BOUNDS // status()
    [
        ExecMethod = ExecViewOptions ;
        StateMethod = StateViewOptions ;
        Export = FALSE;
        Cachable;
    ]

    FN_VIEW_GRAPHIC // status()
    [
        ExecMethod = ExecViewOptions ;
        StateMethod = StateViewOptions ;
        Export = FALSE ;
    ]

    FN_VIEW_FIELDS // status()
    [
        ExecMethod = ExecViewOptions ;
        StateMethod = StateViewOptions ;
        Export = FALSE;
    ]

    FN_VIEW_FIELDNAME // status()
    [
        ExecMethod = ExecViewOptions ;
        StateMethod = StateViewOptions ;
        Cachable ;
        Export = FALSE;
    ]

    FN_VIEW_MARKS // status()
    [
        ExecMethod = ExecViewOptions ;
        StateMethod = StateViewOptions ;
        Cachable ;
        Export = FALSE;
    ]

    FN_VIEW_META_CHARS // status()
    [
        ExecMethod = ExecViewOptions ;
        StateMethod = StateViewOptions ;
        Cachable ;
        Export = FALSE;
    ]

    FN_VIEW_TABLEGRID // status()
    [
        ExecMethod = ExecViewOptions ;
        StateMethod = StateViewOptions ;
    ]

    SID_GRID_VISIBLE
    [
        ExecMethod = ExecViewOptions;
        StateMethod = StateViewOptions ;
    ]
    SID_GRID_USE
    [
        ExecMethod = ExecViewOptions;
        StateMethod = StateViewOptions ;
    ]
    SID_HELPLINES_MOVE
    [
        ExecMethod = ExecViewOptions;
        StateMethod = StateViewOptions ;
    ]

    FN_VLINEAL // status()
    [
        ExecMethod = ExecViewOptions ;
        StateMethod = StateViewOptions ;
        Export = FALSE;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    FN_HSCROLLBAR // status()
    [
        ExecMethod = ExecViewOptions ;
        StateMethod = StateViewOptions ;
        Export = FALSE;
    ]

    FN_VSCROLLBAR // status()
    [
        ExecMethod = ExecViewOptions ;
        StateMethod = StateViewOptions ;
        Export = FALSE;
    ]

    FN_SHADOWCURSOR // status(final|play)
    [
        ExecMethod = ExecViewOptions ;
        StateMethod = StateViewOptions ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
}  //end interface Application

shell SwModule
{
    import StarWriter[Automation];
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.136  2000/05/26 07:06:20  os
    old SW Basic API Slots removed

    Revision 1.135  2000/05/10 12:00:10  os
    Basic API removed

    Revision 1.134  1999/11/30 10:19:58  jp
    Task #70259#: more entries into to the popup menus

    Revision 1.133  1999/09/28 13:17:11  os
    #67382# separate dialog for business cards

    Revision 1.132  1999/06/22 15:36:04  JP
    Bug #43028#: disableflag for edit in mailbody


      Rev 1.131   22 Jun 1999 17:36:04   JP
   Bug #43028#: disableflag for edit in mailbody

      Rev 1.130   23 Mar 1999 12:15:22   MA
   #63806# ConfigName und HelpText entfernt

      Rev 1.129   17 Feb 1999 15:06:42   OS
   #61890# Methoden fuer alte Optionsdialoge geloescht

      Rev 1.128   26 Nov 1998 15:19:08   MA
   #59896# Raster usw jetzt an der Application

      Rev 1.127   12 Nov 1998 17:29:00   MA
   #58677# Disable Flag

      Rev 1.126   26 Jan 1998 09:12:10   OS
   neu: WebViewSettings

      Rev 1.125   22 Dec 1997 17:18:54   MA
   ShadowCursor

      Rev 1.124   03 Nov 1997 16:09:42   JP
   neu: Optionen/-Page/Basic-Schnittst. fuer ShadowCursor

      Rev 1.123   28 Aug 1997 12:52:34   MBA
   Neue Interface-Namen

      Rev 1.122   11 Jun 1997 14:57:44   OS
   SpellOnline und HideSpell nicht mehr mit Exportverbot #40529#

      Rev 1.121   09 Jun 1997 14:27:20   MA
   chg: Browse-Flag nur noch am Doc

      Rev 1.120   06 Jun 1997 12:42:38   MA
   chg: versteckte Absaetze ausblenden

      Rev 1.119   30 May 1997 15:36:46   OS
   FN_CONFIG_DLG raus

      Rev 1.118   28 May 1997 08:13:48   OS
   SID_ATTR_METRIC am SwModule ausfuehren fr #40192#

      Rev 1.117   16 Feb 1997 15:23:38   OM
   DB-Manager an Ofa verschoben

      Rev 1.116   30 Jan 1997 11:01:00   OS
   neu: PRINT_LAYOUT

      Rev 1.115   27 Jan 1997 16:38:38   OS
   HtmlMode entfernt

      Rev 1.114   04 Dec 1996 14:01:32   OS
   neue Ids fuer Optionendialoge

      Rev 1.113   26 Nov 1996 19:43:42   OS
   GetDocManPath mit SID_SW_DOCMAN_PATH

      Rev 1.112   22 Nov 1996 13:03:46   OS
   neue Ids fuer Wizards

      Rev 1.111   01 Nov 1996 17:59:38   MA
   Umstellung zum Module

      Rev 1.110   27 Sep 1996 13:58:28   OS
   +StateMethod fuer FN_LABEL

      Rev 1.109   21 Sep 1996 17:36:42   OS
   Sot-Umstellung beendet

      Rev 1.108   18 Sep 1996 10:37:14   OM
   Slots entfernt

      Rev 1.107   17 Sep 1996 18:17:48   OS
   EditOptionsDialog noch nicht in swriter.idl

      Rev 1.106   16 Sep 1996 10:26:50   MBA
   Erste Anpassungen an swriter.idl

      Rev 1.105   10 Sep 1996 16:39:44   OS
   Slotvereinheitlichung zu, 1.

      Rev 1.104   31 Aug 1996 17:13:02   OS
   neue Optionendialoge

      Rev 1.103   20 Aug 1996 17:28:38   HJS
   eu...

      Rev 1.102   13 Aug 1996 12:35:16   OS
   neu: InternetDialog

      Rev 1.101   06 Aug 1996 11:09:56   OM
   Hyperlinkleiste auf bei Readonly-Doks

      Rev 1.100   29 Jul 1996 11:09:18   OS
   FN_SET_HTMLMODE -> SID_HTML_MODE

      Rev 1.99   25 Jul 1996 15:26:28   OS
   neu: FN_SET_HTMLMODE

------------------------------------------------------------------------*/

diff --git a/sw/sdi/wtabsh.sdi b/sw/sdi/wtabsh.sdi
new file mode 100644
index 0000000..e228dbe
--- /dev/null
+++ b/sw/sdi/wtabsh.sdi
@@ -0,0 +1,46 @@
/*------------------------------------------------------------------------

    $Workfile:   WTABSH.IDL  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/wtabsh.sdi,v 1.1.1.1 2000-09-18 17:14:31 hr Exp $

    Beschreibung:   IDL - File fuer TabShell StarWriter /Web

    (c) Copyright 1997 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/

interface WebTable : BaseTextTable
[ uuid = "B47F0DEC-1E1F-11d1-89CA-008029E4B0B1" ]
{
    import BaseTextSelection;
}

 //=========================================================================

shell SwWebTableShell : SwBaseShell
{
        import WebTable[Automation];
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.4  2000/02/01 09:45:00  os
    #72282# SwWebBaseShell removed

    Revision 1.3  1997/09/03 14:42:08  MBA
    Neue Shell


      Rev 1.2   03 Sep 1997 16:42:08   MBA
   Neue Shell

      Rev 1.1   28 Aug 1997 12:53:54   MBA
   Neue Interface-Namen

      Rev 1.0   23 Jan 1997 14:42:32   OS
   Initial revision.

------------------------------------------------------------------------*/

diff --git a/sw/sdi/wtextsh.sdi b/sw/sdi/wtextsh.sdi
new file mode 100644
index 0000000..880f519
--- /dev/null
+++ b/sw/sdi/wtextsh.sdi
@@ -0,0 +1,61 @@
/*------------------------------------------------------------------------

    $Workfile:   WTEXTSH.IDL  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/wtextsh.sdi,v 1.1.1.1 2000-09-18 17:14:31 hr Exp $

    Beschreibung:   IDL - File Textshell fuer StarWriter/WEB

    (c) Copyright 1997 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/


interface WebText : BaseText
[
    uuid = "B47F0DE5-1E1F-11d1-89CA-008029E4B0B1";
]
{
    FN_INSERT_FRAME_INTERACT_NOCOL
    [
        ExecMethod = ExecInsert ;
        StateMethod = StateInsert ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
        Cachable ;
    ]
    // hier sollen die Slots eingefuegt werden, die n u r vom StarWriter/WEB
    // unterstuetzt werden
    import TextSelection;
}

shell SwWebTextShell : SwBaseShell
{
    import WebText[Automation];
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.5  2000/06/20 14:47:52  os
    #70060# less occurences of columns in HTML

    Revision 1.4  2000/05/26 07:06:20  os
    old SW Basic API Slots removed

    Revision 1.3  2000/02/01 09:45:00  os
    #72282# SwWebBaseShell removed

    Revision 1.2  1997/08/28 10:39:20  MBA
    Neue Interface-Namen


      Rev 1.1   28 Aug 1997 12:39:20   MBA
   Neue Interface-Namen

      Rev 1.0   23 Jan 1997 14:41:50   OS
   WebTextShell


------------------------------------------------------------------------*/


diff --git a/sw/sdi/wviewsh.sdi b/sw/sdi/wviewsh.sdi
new file mode 100644
index 0000000..8e22b60
--- /dev/null
+++ b/sw/sdi/wviewsh.sdi
@@ -0,0 +1,223 @@
/*------------------------------------------------------------------------

    $Workfile:   wviewsh.sdi  $

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/sdi/wviewsh.sdi,v 1.1.1.1 2000-09-18 17:14:31 hr Exp $

    Beschreibung:   allgemeine interfaces fuer View

    (c) Copyright 1997 - 2000, Star Division GmbH, Hamburg

------------------------------------------------------------------------*/

interface WebTextInTable : Selection
[ uuid = "B47F0DE7-1E1F-11d1-89CA-008029E4B0B1" ]
{
    import WebText;
        import WebTable;
}

interface WebListInTable : Selection
[ uuid="B47F0DE8-1E1F-11d1-89CA-008029E4B0B1" ]
{
    import WebText;
        import WebList;
        import WebTable;
}

interface WebListInText : Selection
[ uuid = "B47F0DE9-1E1F-11d1-89CA-008029E4B0B1"]
{
    import WebList;
    import WebText;
}

interface WebEditView : BaseTextEditView
[
    uuid = "B47F0DEA-1E1F-11d1-89CA-008029E4B0B1"
]
{
    SID_DRAW_TEXT_MARQUEE // status()
    [
        ExecMethod = ExecDraw ;
        StateMethod = GetDrawState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    FN_INSERT_HEADER
    [
        ExecMethod = Execute;
        StateMethod = GetState ;
    ]
    FN_INSERT_FOOTER
    [
        ExecMethod = Execute;
        StateMethod = GetState ;
    ]
}

shell SwWebView : SfxViewShell
{
    import WebEditView [Automation];
//  import SearchSettings;
//  import TextPage "Page";
//  import SearchAttributes;
//  import ReplaceAttributes;

}

interface WebSourceView : View
[ uuid = "95069CE0-69D8-101D-9757-C667E8298000"]
{
    SID_TABLE_CELL // status()
    [
        StateMethod = GetState ;
    ]
    SID_SAVEASDOC // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
    SID_SAVEDOC // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
    SID_PRINTDOC // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
    SID_PRINTDOCDIRECT // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
    SID_ATTR_CHAR_FONT // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_ATTR_CHAR_FONTHEIGHT // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]
    SID_SEARCH_OPTIONS
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
    SID_SEARCH_ITEM
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        Export = FALSE;
    ]
    FID_SEARCH_NOW
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]
    SID_UNDO // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]

    SID_REDO // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
    ]

    SID_REPEAT // status()
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_CUT // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        Volatile;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_COPY   // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        Volatile;
    ]

    SID_PASTE  // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = GetState ;
        DisableFlags="SW_DISABLE_ON_PROTECTED_CURSOR";
    ]

    SID_SELECTALL // status(final|play)
    [
        ExecMethod = Execute ;
        StateMethod = NoState ;
    ]
}

shell SwSrcView : SfxViewShell

{
        import WebSourceView [Automation];
}



/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.12  2000/05/26 07:06:20  os
    old SW Basic API Slots removed

    Revision 1.11  2000/05/10 12:00:11  os
    Basic API removed

    Revision 1.10  1999/03/23 11:16:34  MA
    #63806# ConfigName und HelpText entfernt


      Rev 1.9   23 Mar 1999 12:16:34   MA
   #63806# ConfigName und HelpText entfernt

      Rev 1.8   12 Nov 1998 17:29:12   MA
   #58677# Disable Flag

      Rev 1.7   11 Jul 1998 15:28:30   OS
   HTML-Quelltext ins Medium der DocShell speichern #52379#

      Rev 1.6   13 Mar 1998 08:32:26   OS
   SID_NEWWINDOW nicht mehr ueberladen

      Rev 1.5   28 Aug 1997 12:52:16   MBA
   Neue Interface-Namen

      Rev 1.4   14 Apr 1997 16:03:00   OS
   neu: SearchAttributes und ReplaceAttributes

      Rev 1.3   12 Feb 1997 12:19:16   OM
   Kopf/Fusszeilen im Webmode

      Rev 1.2   11 Feb 1997 14:04:06   OM
   Lauftext im Webmode

      Rev 1.1   10 Feb 1997 17:28:50   OM
   Lauftext

      Rev 1.0   23 Jan 1997 08:41:46   OS
   Initial revision.

------------------------------------------------------------------------*/

diff --git a/sw/source/filter/ascii/ascatr.cxx b/sw/source/filter/ascii/ascatr.cxx
new file mode 100644
index 0000000..bdb0a73
--- /dev/null
+++ b/sw/source/filter/ascii/ascatr.cxx
@@ -0,0 +1,486 @@
/*************************************************************************
 *
 *  $RCSfile: ascatr.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:53 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _STREAM_HXX //autogen
#include <tools/stream.hxx>
#endif
#ifndef _SVSTDARR_HXX
#define _SVSTDARR_USHORTS
#include <svtools/svstdarr.hxx>
#endif
#ifndef _SVX_FONTITEM_HXX
#include <svx/fontitem.hxx>
#endif

#ifndef _PAM_HXX
#include <pam.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _NDTXT_HXX
#include <ndtxt.hxx>
#endif
#ifndef _WRTASC_HXX
#include <wrtasc.hxx>
#endif
#ifndef _TXATBASE_HXX
#include <txatbase.hxx>
#endif
#ifndef _FCHRFMT_HXX
#include <fchrfmt.hxx>
#endif
#ifndef _TXTFLD_HXX
#include <txtfld.hxx>
#endif
#ifndef _TXTATR_HXX
#include <txtatr.hxx>
#endif
#ifndef _FMTFTN_HXX
#include <fmtftn.hxx>
#endif
#ifndef _CHARFMT_HXX
#include <charfmt.hxx>
#endif
#ifndef _FMTFLD_HXX
#include <fmtfld.hxx>
#endif
#ifndef _FLDBAS_HXX
#include <fldbas.hxx>
#endif
#ifndef _FTNINFO_HXX //autogen
#include <ftninfo.hxx>
#endif

/*
 * Dieses File enthaelt alle Ausgabe-Funktionen des ASCII-Writers;
 * fuer alle Nodes, Attribute, Formate und Chars.
 */

void lcl_WriteString( SvStream& rOut, const String& rStr,
                      rtl_TextEncoding eSrcSet, rtl_TextEncoding eDest );

class SwASC_AttrIter
{
    SvPtrarr aTxtAtrArr;
    SvUShorts aChrSetArr;
    SwASCWriter& rWrt;
    const SwTxtNode& rNd;
    xub_StrLen nAktSwPos;
    rtl_TextEncoding eNdChrSet;

    xub_StrLen SearchNext( xub_StrLen nStartPos );
    BOOL SetCharSet( const SwTxtAttr& rTxtAttr, BOOL bStart );

public:
    SwASC_AttrIter( SwASCWriter& rWrt, const SwTxtNode& rNd, xub_StrLen nStt );

    void NextPos() { nAktSwPos = SearchNext( nAktSwPos + 1 ); }

    xub_StrLen WhereNext() const                    { return nAktSwPos; }
    rtl_TextEncoding GetNextCharSet() const;
    rtl_TextEncoding GetNodeCharSet() const     { return eNdChrSet; }

    BOOL OutAttr( xub_StrLen nSwPos, rtl_TextEncoding eChrSet );
};


SwASC_AttrIter::SwASC_AttrIter( SwASCWriter& rWr, const SwTxtNode& rTxtNd,
                                xub_StrLen nStt )
    : rWrt( rWr ), rNd( rTxtNd ), nAktSwPos( 0 ),
    aTxtAtrArr( 0, 4 ), aChrSetArr( 0, 4 )
{
    // Attributwechsel an Pos 0 wird ignoriert, da davon ausgegangen
    // wird, dass am Absatzanfang sowieso die Attribute neu ausgegeben
    // werden.
    eNdChrSet = ((SvxFontItem&)rNd.SwCntntNode::GetAttr(
                                        RES_CHRATR_FONT )).GetCharSet();
    nAktSwPos = SearchNext( nStt + 1 );
}

rtl_TextEncoding SwASC_AttrIter::GetNextCharSet() const
{
    if( aChrSetArr.Count() )
        return (rtl_TextEncoding )aChrSetArr[ aChrSetArr.Count() - 1 ];
    return eNdChrSet;
}

xub_StrLen SwASC_AttrIter::SearchNext( xub_StrLen nStartPos )
{
    register xub_StrLen nMinPos = STRING_MAXLEN;
    const SwpHints* pTxtAttrs = rNd.GetpSwpHints();
    if( pTxtAttrs )
    {
        register USHORT i;
        register xub_StrLen nPos;
        const xub_StrLen * pPos;

// kann noch optimiert werden, wenn ausgenutzt wird, dass die TxtAttrs
// nach der Anfangsposition geordnet sind. Dann muessten
// allerdings noch 2 Indices gemerkt werden
        for( i = 0; i < pTxtAttrs->Count(); i++ )
        {
            const SwTxtAttr* pHt = (*pTxtAttrs)[i];
            nPos = *pHt->GetStart();    // gibt erstes Attr-Zeichen
            pPos = pHt->GetEnd();

            if( nPos >= nStartPos && nPos <= nMinPos &&
                ( !pPos || SetCharSet( *pHt, TRUE ) ) )
                nMinPos = nPos;

            if( pPos ? ( (nPos = *pPos) >= nStartPos && nPos <= nMinPos &&
                         SetCharSet( *pHt, FALSE ) )
                     : (( ++nPos ) >= nStartPos && nPos < nMinPos) )
                nMinPos = nPos;
        }
    }
    return nMinPos;
}

BOOL SwASC_AttrIter::SetCharSet( const SwTxtAttr& rAttr, BOOL bStart )
{
    void* p = 0;
    rtl_TextEncoding eChrSet;
    const SfxPoolItem& rItem = rAttr.GetAttr();
    switch( rItem.Which() )
    {
    case RES_CHRATR_FONT:
        p = (void*)&rAttr;
        eChrSet = ((SvxFontItem&)rItem).GetCharSet();
        break;

    case RES_TXTATR_CHARFMT:
        {
            const SfxPoolItem* pItem;
            if( ((SwFmtCharFmt&)rItem).GetCharFmt() && SFX_ITEM_SET ==
                ((SwFmtCharFmt&)rItem).GetCharFmt()->GetItemState(
                    RES_CHRATR_FONT, TRUE, &pItem ))
            {
                eChrSet = ((SvxFontItem*)pItem)->GetCharSet();
                p = (void*)&rAttr;
            }
        }
        break;
    }

    if( p )
    {
        USHORT nPos;
        if( bStart )
        {
            nPos = aChrSetArr.Count();
            aChrSetArr.Insert( eChrSet, nPos );
            aTxtAtrArr.Insert( p, nPos );
        }
        else if( USHRT_MAX != ( nPos = aTxtAtrArr.GetPos( p )) )
        {
            aTxtAtrArr.Remove( nPos );
            aChrSetArr.Remove( nPos );
        }
    }
    return 0 != p;
}

BOOL SwASC_AttrIter::OutAttr( xub_StrLen nSwPos, rtl_TextEncoding eChrSet )
{
    BOOL bRet = FALSE;
    const SwpHints* pTxtAttrs = rNd.GetpSwpHints();
    if( pTxtAttrs )
    {
        register USHORT i;
        for( i = 0; i < pTxtAttrs->Count(); i++ )
        {
            const SwTxtAttr* pHt = (*pTxtAttrs)[i];
            const xub_StrLen * pEnd = pHt->GetEnd();
            if( !pEnd && nSwPos == *pHt->GetStart() )
            {
                bRet = TRUE;
                String sOut;
                switch( pHt->Which() )
                {
                case RES_TXTATR_FIELD:
                    sOut = ((SwTxtFld*)pHt)->GetFld().GetFld()->Expand();
                    break;

                case RES_TXTATR_HARDBLANK:
                    sOut = ((SwTxtHardBlank*)pHt)->GetChar();
                    break;

                case RES_TXTATR_FTN:
                    {
                        const SwFmtFtn& rFtn = pHt->GetFtn();
                        if( rFtn.GetNumStr().Len() )
                            sOut = rFtn.GetNumStr();
                        else if( rFtn.IsEndNote() )
                            sOut = rWrt.pDoc->GetEndNoteInfo().aFmt.
                                            GetNumStr( rFtn.GetNumber() );
                        else
                            sOut = rWrt.pDoc->GetFtnInfo().aFmt.
                                            GetNumStr( rFtn.GetNumber() );
                    }
                    break;
                }
                if( sOut.Len() )
                    ::lcl_WriteString( rWrt.Strm(), sOut, eChrSet,
                                        rWrt.GetAsciiOptions().GetCharSet() );
            }
            else if( nSwPos < *pHt->GetStart() )
                break;
        }
    }
    return bRet;
}


//------------------------
/* Ausgabe der Nodes */
//------------------------

static Writer& OutASC_SwTxtNode( Writer& rWrt, SwCntntNode& rNode )
{
    const SwTxtNode& rNd = (SwTxtNode&)rNode;

    xub_StrLen nStrPos = rWrt.pCurPam->GetPoint()->nContent.GetIndex();
    xub_StrLen nNodeEnde = rNd.Len(), nEnde = nNodeEnde;
    BOOL bLastNd =  rWrt.pCurPam->GetPoint()->nNode == rWrt.pCurPam->GetMark()->nNode;
    if( bLastNd )
        nEnde = rWrt.pCurPam->GetMark()->nContent.GetIndex();

    SwASC_AttrIter aAttrIter( (SwASCWriter&)rWrt, rNd, nStrPos );
    rtl_TextEncoding eChrSet = aAttrIter.GetNodeCharSet();
    rtl_TextEncoding eSet = rWrt.GetAsciiOptions().GetCharSet();

    if( !nStrPos )
        ::lcl_WriteString( rWrt.Strm(), rNd.GetNumString(), eChrSet, eSet );

    String aStr( rNd.GetTxt() );
    if( rWrt.bASCII_ParaAsBlanc )
        aStr.SearchAndReplaceAll( 0x0A, ' ' );

    do {
        xub_StrLen nNextAttr = aAttrIter.WhereNext();
        rtl_TextEncoding eNextChrSet = aAttrIter.GetNextCharSet();

        if( nNextAttr > nEnde )
            nNextAttr = nEnde;

        if( !aAttrIter.OutAttr( nStrPos, eChrSet ))
            ::lcl_WriteString( rWrt.Strm(),
                                aStr.Copy( nStrPos, nNextAttr - nStrPos ),
                                  eChrSet, eSet );
        nStrPos = nNextAttr;
        eChrSet = eNextChrSet;
        aAttrIter.NextPos();
    } while( nStrPos < nEnde );

    if( !bLastNd ||
        ( !rWrt.bWriteClipboardDoc && !rWrt.bASCII_NoLastLineEnd )
            && !nStrPos && nEnde == nNodeEnde )
        ::lcl_WriteString( rWrt.Strm(), ((SwASCWriter&)rWrt).GetLineEnd(),
                              RTL_TEXTENCODING_MS_1252, eSet );

    return rWrt;
}

void lcl_WriteString( SvStream& rStream, const String& rStr,
                      rtl_TextEncoding eSrcSet, rtl_TextEncoding eDestSet )
{
    if( rStr.Len() )
    {
        if( RTL_TEXTENCODING_UCS2 == eDestSet )
            rStream.Write( rStr.GetBuffer(), rStr.Len() * sizeof( sal_Unicode ));
        else if( RTL_TEXTENCODING_UCS4 == eDestSet )
        {
            // ????
        }
        else
        {
            ByteString sOut( rStr, eDestSet );
            rStream << sOut.GetBuffer();
        }
    }
}

/*
 * lege hier jetzt die Tabellen fuer die ASCII-Funktions-Pointer auf
 * die Ausgabe-Funktionen an.
 * Es sind lokale Strukturen, die nur innerhalb der ASCII-DLL
 * bekannt sein muessen.
 */

SwNodeFnTab aASCNodeFnTab = {
/* RES_TXTNODE  */                   OutASC_SwTxtNode,
/* RES_GRFNODE  */                   0,
/* RES_OLENODE  */                   0
};

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ascii/ascatr.cxx,v 1.1.1.1 2000-09-18 17:14:53 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.59  2000/09/18 16:04:38  willem.vandorp
      OpenOffice header added.

      Revision 1.58  2000/05/08 17:36:58  jp
      Changes for Unicode

      Revision 1.57  2000/02/11 14:36:19  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.56  1999/11/01 17:49:58  jp
      own convert from char to UNICODE char

      Revision 1.55  1999/11/01 11:11:14  jp
      call string-convert with the CharSet of the font

      Revision 1.54  1999/08/26 18:34:10  JP
      load and save Text with more options (charset/language/lineend/font)


      Rev 1.53   26 Aug 1999 20:34:10   JP
   load and save Text with more options (charset/language/lineend/font)

      Rev 1.52   27 Jun 1998 16:01:50   JP
   Writer mit neuen Flags; fuer den ASCII-Writer, etwas aufgeraeumt

      Rev 1.51   27 Jan 1998 19:37:12   HR
   Ueberfluessige Klammern weg, HPUX mag sie nicht

      Rev 1.50   25 Nov 1997 18:55:18   MA
   includes

      Rev 1.49   03 Nov 1997 14:03:46   MA
   precomp entfernt

      Rev 1.48   10 Oct 1997 12:19:46   JP
   beim Clipboard das letzte CR/LF nicht schreiben

      Rev 1.47   14 Jan 1997 08:43:32   MA
   includes

      Rev 1.46   23 Oct 1996 19:49:00   JP
   String Umstellung: [] -> GetChar()

      Rev 1.45   28 Jun 1996 13:59:08   MA
   includes

      Rev 1.44   03 Apr 1996 12:32:26   JP
   OutSwTxtNode: nur im letzten Node entscheiden, ob CRLF geschrieben wird

      Rev 1.43   26 Mar 1996 15:24:08   JP
   Bugfix: unbeannte Zeichen richtig schreiben

      Rev 1.42   13 Feb 1996 19:41:30   JP
   Bug #25428#: LineEnd von SV holen und entsp. auswerten

      Rev 1.41   31 Jan 1996 14:27:36   mk
   SINIX

      Rev 1.40   24 Nov 1995 17:24:46   OM
   PCH->PRECOMPILED

      Rev 1.39   30 Oct 1995 13:03:38   MA
   chg: ConvertUnknown direkt eingebaut.

      Rev 1.38   02 Oct 1995 13:10:48   JP
   Umstellung auf schreiben verschiedener CodeSets

      Rev 1.37   25 Oct 1994 15:10:22   MA
   PreHdr.

      Rev 1.36   21 Jul 1994 09:29:52   JP
   OutASC_SwTxtNode: fuer den ZeilenUmbruch im Translate die Laenge vom Node
       benutzen und nicht die vom String. Stehen Felder/Nummern/usw. im String
       kann es nie passen!

      Rev 1.35   04 Mar 1994 10:58:28   JP
   Translate: auf const char* casten.

      Rev 1.34   25 Feb 1994 12:54:46   JP
   schreibe mit expandierten Feldern und Numerierung

      Rev 1.33   15 Feb 1994 08:24:10   MI
   Filter ab jetzt handsegmentiert

      Rev 1.32   28 Jan 1994 11:28:36   MI
   TCOV() entfernt, SW_... nach SEG_... umbenannt

      Rev 1.31   13 Jan 1994 08:28:28   MI
   Segmentierung per #define ermoeglicht

      Rev 1.30   12 Jan 1994 11:22:46   MI
   Segmentierungs-Probleme

*************************************************************************/
diff --git a/sw/source/filter/ascii/makefile.mk b/sw/source/filter/ascii/makefile.mk
new file mode 100644
index 0000000..eb6f9e64
--- /dev/null
+++ b/sw/source/filter/ascii/makefile.mk
@@ -0,0 +1,94 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:53 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=..$/..$/..

PRJNAME=sw
TARGET=ascii

PROJECTPCH=filt_pch
PROJECTPCHSOURCE=..\filt_1st\filt_pch

# --- Settings -----------------------------------------------------

.INCLUDE :  $(PRJ)$/inc$/swpre.mk
.INCLUDE :  settings.mk
.INCLUDE :  $(PRJ)$/inc$/sw.mk

# --- Files --------------------------------------------------------

CXXFILES = \
        ascatr.cxx \
        parasc.cxx \
        wrtasc.cxx



SLOFILES =	\
        $(SLO)$/ascatr.obj \
        $(SLO)$/parasc.obj \
        $(SLO)$/wrtasc.obj

# --- Tagets -------------------------------------------------------

.INCLUDE :  target.mk

diff --git a/sw/source/filter/ascii/parasc.cxx b/sw/source/filter/ascii/parasc.cxx
new file mode 100644
index 0000000..b26616e
--- /dev/null
+++ b/sw/source/filter/ascii/parasc.cxx
@@ -0,0 +1,1180 @@
/*************************************************************************
 *
 *  $RCSfile: parasc.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:53 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PCH
#include "filt_pch.hxx"
#endif

#ifndef _STREAM_HXX //autogen
#include <tools/stream.hxx>
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _SFX_PRINTER_HXX
#include <sfx2/printer.hxx>
#endif
#ifndef _SVX_FONTITEM_HXX //autogen wg. SvxFontItem
#include <svx/fontitem.hxx>
#endif
#ifndef _SVX_LANGITEM_HXX //autogen wg. SvxLanguageItem
#include <svx/langitem.hxx>
#endif
#ifndef _SVX_BRKITEM_HXX //autogen
#include <svx/brkitem.hxx>
#endif

#ifndef _SHELLIO_HXX
#include <shellio.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _NDTXT_HXX
#include <ndtxt.hxx>
#endif
#ifndef _PAM_HXX
#include <pam.hxx>
#endif
#ifndef _FRMATR_HXX
#include <frmatr.hxx>
#endif
#ifndef _FLTINI_HXX
#include <fltini.hxx>
#endif
#ifndef _PAGEDESC_HXX
#include <pagedesc.hxx>
#endif

#ifndef _SWSWERROR_H
#include <swerror.h>
#endif
#ifndef _STATSTR_HRC
#include <statstr.hrc>          // ResId fuer Statusleiste
#endif
#ifndef _MDIEXP_HXX
#include <mdiexp.hxx>           // ...Percent()
#endif

#define ASC_BUFFLEN 4096


#ifdef ASYNCHRON

class _SvLockBytes
{
    AutoTimer aTimer;
    SvStream& rIn;

    ULONG nDataRead;
    Link aCallDataRead;

    DECL_STATIC_LINK( _SvLockBytes, DataRead, Timer* );

public:
    _SvLockBytes( SvStream& rInput, const Link& rCallBack );
    ~_SvLockBytes();

    ErrCode ReadAt( ULONG nPos, void* pArr, ULONG nCount, ULONG* pReadCnt );

    SvStream& GetStream() const         { return rIn; }
};


// client vom Standard SwPageDesc. Wird dieser geloescht, dann
// der Reader auch beendet werden!!
class SwAsynchLoader : public SvRefBase, public SwClient
{
protected:

    SwDoc* pDoc;
    SwPaM* pPam;

    BOOL bInCall;
    _SvLockBytes* pLoader;

    DECL_STATIC_LINK( SwAsynchLoader, NewData, _SvLockBytes* );

protected:
    virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew );
    virtual ~SwAsynchLoader();

    virtual ULONG NextData() = 0;

public:
    SwAsynchLoader( SvStream& rIn, const SwPaM& rCrsr );

    ULONG CallParser();
};

SV_DECL_REF(SwAsynchLoader)
SV_IMPL_REF(SwAsynchLoader)


class SwASCIIParser : public SwAsynchLoader
{
    char* pArr, *pStt, *pEnd, *pLastStt;

    long nLineLen;
    ULONG nError, nReadCnt, nFileSize;

    const SwAsciiOptions& rOpt;
    char cLastCRLF;

    virtual ULONG NextData();

protected:
    virtual ~SwASCIIParser();

public:
    SwASCIIParser( SwDoc* pD, const SwPaM& rCrsr, SvStream& rIn,
                                int bReadNewDoc, const SwAsciiOptions& rOpts);
};

SV_DECL_REF(SwASCIIParser)
SV_IMPL_REF(SwASCIIParser)


// Aufruf fuer die allg. Reader-Schnittstelle
ULONG AsciiReader::Read( SwDoc &rDoc, SwPaM &rPam, const String & )
{
    if( !pStrm )
    {
        ASSERT( !this, "ASCII-Read ohne Stream" );
        return ERR_SWG_READ_ERROR;
    }

    //JP 18.01.96: Alle Ueberschriften sind normalerweise ohne
    //              Kapitelnummer. Darum hier explizit abschalten
    //              weil das Default jetzt wieder auf AN ist.
    if( !bInsertMode )
        Reader::SetNoOutlineNum( rDoc );

    SwASCIIParserRef xParser( new SwASCIIParser( &rDoc, rPam, *pStrm,
                            !bInsertMode, eCodeSet ));
    ULONG nRet = xParser->CallParser();
    // nach dem Lesen sofort wieder defaulten
    eCodeSet = GetSystemCharSet();
    return ERRCODE_IO_PENDING == nRet ? 0 : nRet;
}


/**/

SwASCIIParser::SwASCIIParser( SwDoc* pD, const SwPaM& rCrsr, SvStream& rIn,
                                int bReadNewDoc, CharSet eSrc )
    : SwAsynchLoader( rIn, rCrsr ),
     eCodeSet( eSrc )
{
    pArr = new char [ ASC_BUFFLEN + 1 ];

    pStt = pEnd = pLastStt = pArr;

    cLastCRLF = 0;
    nLineLen = 0;
    nError = 0;
    nReadCnt = 0;

    rIn.Seek(STREAM_SEEK_TO_END);
    rIn.ResetError();

    nFileSize = rIn.Tell();
    rIn.Seek(STREAM_SEEK_TO_BEGIN);
    rIn.ResetError();

}

SwASCIIParser::~SwASCIIParser()
{
    delete pArr;
}


ULONG SwASCIIParser::NextData()
{
    SvStream& rInput = pLoader->GetStream();
    do {
        if( pStt >= pEnd )
        {
            if( pLastStt != pStt )
            {
                pDoc->Insert( *pPam, pLastStt, eCodeSet );
                pLastStt = pStt;
            }

            // lese einen neuen Block ein
            ULONG lGCount;

            if (SVSTREAM_OK != rInput.GetError() || 0 != ( nError = pLoader->
                ReadAt( nReadCnt, pArr, ASC_BUFFLEN, &lGCount )) ||
                ( rInput.IsEof() && !lGCount ))
            {
                if( ERRCODE_IO_PENDING != nError || !lGCount )
                    break;      // aus der WHILE-Schleife heraus
            }

            pEnd = pArr + lGCount;
            nReadCnt += lGCount;
            *pEnd = 0;
            pStt = pLastStt = pArr;

            ::SetProgressState( nReadCnt, pDoc->GetDocShell() );

            if( cLastCRLF )
            {
                if( ( 0x0a == *pStt && 0x0d == cLastCRLF ) ||
                    ( 0x0d == *pStt && 0x0a == cLastCRLF ))
                    pLastStt = ++pStt;
                cLastCRLF = 0;
                nLineLen = 0;
                // JP 03.04.96: das letze am Ende nehmen wir nicht
                if( !rInput.IsEof() || !(pEnd == pStt ||
                    ( !*pEnd && pEnd == pStt+1 ) ) )
                    pDoc->SplitNode( *pPam->GetPoint() );
            }
        }

        BOOL bIns = TRUE, bSplitNode = FALSE;
        switch( *pStt )
        {
        case 0:
                    pEnd = pStt;
                    bIns = FALSE;
                    break;

        case 0x0a:
                    bIns = FALSE;
                    *pStt = 0;
                    if( ++pStt == pEnd )
                        cLastCRLF = 0x0a;
                    else
                    {
                        if( 0x0d == *pStt )
                            pStt++;
                        // JP 03.04.96: das letze am Ende nehmen wir nicht
                        if( !rInput.IsEof() || !(pEnd == pStt ||
                            ( !*pEnd && pEnd == pStt+1 ) ) )
                            bSplitNode = TRUE;
                    }
                    break;

        case 0x0d:
                    bIns = FALSE;
                    *pStt = 0;
                    if( ++pStt == pEnd )
                        cLastCRLF = 0x0d;
                    else
                    {
                        if( 0x0a == *pStt )
                            pStt++;
                        // JP 03.04.96: das letze am Ende nehmen wir nicht
                        if( !rInput.IsEof() || !(pEnd == pStt ||
                            ( !*pEnd && pEnd == pStt+1 ) ) )
                            bSplitNode = TRUE;
                    }
                    break;

        case '\t':  break;

        case 0x0c:
                    {
                        // dann mal einen harten Seitenumbruch einfuegen
                        *pStt++ = 0;
                        if( nLineLen )
                            pDoc->Insert( *pPam, pLastStt, eCodeSet );
                        pDoc->SplitNode( *pPam->GetPoint() );
                        pDoc->Insert( *pPam, SvxFmtBreakItem(
                                    SVX_BREAK_PAGE_BEFORE ));
                        pLastStt = pStt;
                        nLineLen = 0;
                        bIns = FALSE;
                    }
                    break;

        case 0x1a:
                    if( nReadCnt == nFileSize && pStt+1 == pEnd )
                        *pStt = 0;
                    else
                        *pStt = '#';        // Ersatzdarstellung
                    break;

        default:

            if( (BYTE)' ' > (BYTE)*pStt )
                    // Ctrl-Zchn gefunden ersetze durch '#'
                *pStt = '#';
        }

        if( bIns )
        {
            if( ( nLineLen >= MAX_ASCII_PARA - 100 ) &&
                ( ( *pStt == ' ' ) || ( nLineLen >= MAX_ASCII_PARA - 1 ) ) )
            {
                char c = *pStt;
                *pStt = 0;
                pDoc->Insert( *pPam, pLastStt, eCodeSet );
                pDoc->SplitNode( *pPam->GetPoint() );
                pLastStt = pStt;
                nLineLen = 0;
                *pStt = c;
            }
            ++pStt;
            ++nLineLen;
        }
        else if( bSplitNode )
        {
            // es wurde ein CR/LF erkannt, also speichere den Text
            pDoc->Insert( *pPam, pLastStt, eCodeSet );
            pDoc->SplitNode( *pPam->GetPoint() );
            pLastStt = pStt;
            nLineLen = 0;
        }
    } while( TRUE );

    return nError;
}


/**/

SwAsynchLoader::SwAsynchLoader( SvStream& rIn, const SwPaM& rCrsr )
    : SwClient( 0 )
{
    bInCall = FALSE;
    pDoc = (SwDoc*)rCrsr.GetDoc();
    pPam = new SwPaM( pDoc, *rCrsr.GetPoint() );

    SwPageDesc& rDesc = pDoc->_GetPageDesc( 0 );
    rDesc.Add( this );

    pLoader = new _SvLockBytes( rIn,
            STATIC_LINK( this, SwAsynchLoader, NewData ) );
}

SwAsynchLoader::~SwAsynchLoader()
{
    delete pPam;
    delete pLoader;
}

void SwAsynchLoader::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew )
{
    switch( pOld ? pOld->Which() : pNew ? pNew->Which() : 0 )
    {
    case RES_OBJECTDYING:
        if( ((SwPtrMsgPoolItem *)pOld)->pObject == pRegisteredIn )
        {
            // dann uns selbst beenden
            pRegisteredIn->Remove( this );
            ReleaseRef();                   // ansonsten sind wir fertig!
        }
        break;
    }
}

IMPL_STATIC_LINK( SwAsynchLoader, NewData, _SvLockBytes*, p )
{
    ULONG nRet = 0;
    if( !pThis->bInCall )               // kein mehrfaches Aufrufen
    {
        pThis->bInCall = TRUE;

        BOOL bModify = pThis->pDoc->IsModified();
        nRet = pThis->NextData();
        if( !bModify )
            pThis->pDoc->ResetModified();

        if( ERRCODE_IO_PENDING != nRet )
            pThis->ReleaseRef();                    // ansonsten sind wir fertig!

        pThis->bInCall = FALSE;
    }

    return nRet;
}


ULONG SwAsynchLoader::CallParser()
{
    bInCall = TRUE;
    AddRef();
    ULONG nRet = NextData();
    if( ERRCODE_IO_PENDING != nRet )
        ReleaseRef();                   // ansonsten sind wir fertig!

    // Sind wir im Pending-Status, wird ueber den Callback "geidelt" bis
    // alles gelesen ist oder ein Fehler aufgetreten ist!

    // Was passiert dann ???

    bInCall = FALSE;
    return nRet;
}

/**/

_SvLockBytes::_SvLockBytes( SvStream& rInput, const Link& rCallback )
    : rIn( rInput ), aCallDataRead( rCallback )
{
    nDataRead = 0;

    aTimer.SetTimeout( 1000 );      // jede Sekunde 100 Zeichen lesen
    aTimer.SetTimeoutHdl( STATIC_LINK( this, _SvLockBytes, DataRead ));
    aTimer.Start();
}

_SvLockBytes::~_SvLockBytes()
{
    aTimer.Stop();
}

ErrCode _SvLockBytes::ReadAt( ULONG nPos, void* pArr, ULONG nCount,
                                ULONG* pReadCnt )
{
    ErrCode nRet = 0;
    if( nPos + nCount > nDataRead )
    {
        nCount = nDataRead - nPos;
        nRet = ERRCODE_IO_PENDING;
    }

    if( nCount )
    {
        rIn.Seek( nPos );
        *pReadCnt = rIn.Read( pArr, nCount );
    }
    else
        *pReadCnt = 0;
    return rIn.GetError() ? rIn.GetError()
                          : ( rIn.IsEof() ? 0 : nRet );
}

IMPL_STATIC_LINK( _SvLockBytes, DataRead, Timer*, pTimer )
{
    pThis->nDataRead += 100;
    pThis->aCallDataRead.Call( pThis );

    return 0;
}

/**/

#else

class SwASCIIParser
{
    SwDoc* pDoc;
    SwPaM* pPam;
    SvStream& rInput;
    sal_Char* pArr;
    const SwAsciiOptions& rOpt;
    SfxItemSet* pItemSet;
    long nFileSize;
    BOOL bNewDoc;

    void ReadChars();
    void ReadUnicode();

public:
    SwASCIIParser( SwDoc* pD, const SwPaM& rCrsr, SvStream& rIn,
                            int bReadNewDoc, const SwAsciiOptions& rOpts );
    ~SwASCIIParser();

    ULONG CallParser();
};


// Aufruf fuer die allg. Reader-Schnittstelle
ULONG AsciiReader::Read( SwDoc &rDoc, SwPaM &rPam, const String & )
{
    if( !pStrm )
    {
        ASSERT( !this, "ASCII-Read ohne Stream" );
        return ERR_SWG_READ_ERROR;
    }

    //JP 18.01.96: Alle Ueberschriften sind normalerweise ohne
    //              Kapitelnummer. Darum hier explizit abschalten
    //              weil das Default jetzt wieder auf AN ist.
    if( !bInsertMode )
        Reader::SetNoOutlineNum( rDoc );

    SwASCIIParser* pParser = new SwASCIIParser( &rDoc, rPam, *pStrm,
                                        !bInsertMode, aOpt.GetASCIIOpts() );
    ULONG nRet = pParser->CallParser();

    delete pParser;
    // after Read reset the options
    aOpt.ResetASCIIOpts();
    return nRet;
}

void AsciiReader::SetFltName( const String& rFltNm )
{
    if( 5 <= rFltNm.Len() )
    {
        SwAsciiOptions aNewOpts;
        switch( rFltNm.GetChar( 4 ) )
        {
        case 'D':   aNewOpts.SetCharSet( RTL_TEXTENCODING_IBM_850 );
                    aNewOpts.SetParaFlags( LINEEND_CRLF );
                    if( 5 < rFltNm.Len() )
                        switch( rFltNm.Copy( 5 ).ToInt32() )
                        {
                        case 437: aNewOpts.SetCharSet( RTL_TEXTENCODING_IBM_437 );  break;
                        case 850: aNewOpts.SetCharSet( RTL_TEXTENCODING_IBM_850 );  break;
                        case 860: aNewOpts.SetCharSet( RTL_TEXTENCODING_IBM_860 );  break;
                        case 861: aNewOpts.SetCharSet( RTL_TEXTENCODING_IBM_861 );  break;
                        case 863: aNewOpts.SetCharSet( RTL_TEXTENCODING_IBM_863 );  break;
                        case 865: aNewOpts.SetCharSet( RTL_TEXTENCODING_IBM_865 );  break;
                        }
                    break;

        case 'A':   aNewOpts.SetCharSet( RTL_TEXTENCODING_MS_1252 );
                    aNewOpts.SetParaFlags( LINEEND_CRLF );
                    break;
        case 'M':   aNewOpts.SetCharSet( RTL_TEXTENCODING_APPLE_ROMAN );
                    aNewOpts.SetParaFlags( LINEEND_CR );
                    break;
        case 'X':   aNewOpts.SetCharSet( RTL_TEXTENCODING_MS_1252 );
                    aNewOpts.SetParaFlags( LINEEND_LF );
                    break;

        default:
            if( rFltNm.Copy( 4 ).EqualsAscii( "_DLG" ))
            {
                // use the options
                aNewOpts = aOpt.GetASCIIOpts();
            }
        }
        aOpt.SetASCIIOpts( aNewOpts );
    }
}


SwASCIIParser::SwASCIIParser( SwDoc* pD, const SwPaM& rCrsr, SvStream& rIn,
                            int bReadNewDoc, const SwAsciiOptions& rOpts )
    : pDoc( pD ), rInput( rIn ), rOpt( rOpts ), bNewDoc( bReadNewDoc ),
    pItemSet( 0 )
{
    pPam = new SwPaM( *rCrsr.GetPoint() );
    pArr = new sal_Char [ ASC_BUFFLEN + 1 ];

    SfxItemSet aDfltSet( pDoc->GetAttrPool(),   RES_CHRATR_FONT,
                                                RES_CHRATR_LANGUAGE );

    // set defaults from the options
    if( rOpt.GetLanguage() )
    {
        aDfltSet.Put( SvxLanguageItem( (LanguageType)rOpt.GetLanguage(),
                                        RES_CHRATR_LANGUAGE ) );
    }
    if( rOpt.GetFontName().Len() )
    {
        BOOL bDelete = FALSE;
        const SfxFont* pFnt = 0;
        if( pDoc->GetPrt() )
            pFnt = pDoc->GetPrt()->GetFontByName( rOpt.GetFontName() );

        if( !pFnt )
        {
            pFnt = new SfxFont( FAMILY_DONTKNOW, rOpt.GetFontName() );
            bDelete = TRUE;
        }

        aDfltSet.Put( SvxFontItem( pFnt->GetFamily(), pFnt->GetName(),
                        aEmptyStr, pFnt->GetPitch(), pFnt->GetCharSet() ) );
    }

    if( aDfltSet.Count() )
    {
        if( bNewDoc )
            pDoc->SetDefault( aDfltSet );
        else
            pItemSet = new SfxItemSet( aDfltSet );
    }
}

SwASCIIParser::~SwASCIIParser()
{
    delete pPam;
    delete pArr;
    delete pItemSet;
}


// Aufruf des Parsers
ULONG SwASCIIParser::CallParser()
{
    rInput.Seek(STREAM_SEEK_TO_END);
    rInput.ResetError();

    nFileSize = rInput.Tell();
    rInput.Seek(STREAM_SEEK_TO_BEGIN);
    rInput.ResetError();

    ULONG nError = 0;
    ::StartProgress( STR_STATSTR_W4WREAD, 0, nFileSize, pDoc->GetDocShell() );

    SwPaM* pInsPam = 0;
    xub_StrLen nSttCntnt;
    if( !bNewDoc )
    {
        const SwNodeIndex& rTmp = pPam->GetPoint()->nNode;
        pInsPam = new SwPaM( rTmp, rTmp, 0, -1 );
        nSttCntnt = pPam->GetPoint()->nContent.GetIndex();
    }

    if( RTL_TEXTENCODING_UCS2 == rOpt.GetCharSet() )
        ReadUnicode();
    else
        ReadChars();

    if( pInsPam )
    {
        if( pItemSet )
        {
            // then set over the insert range the defined attributes
            *pInsPam->GetMark() = *pPam->GetPoint();
            pInsPam->GetPoint()->nNode++;
            SwNode* pNd = pInsPam->GetNode();
            if( pNd->IsCntntNode() )
                pInsPam->GetPoint()->nContent.Assign(
                                    (SwCntntNode*)pNd, nSttCntnt );
            else
                pInsPam->GetPoint()->nContent.Assign( 0, 0 );

            // !!!!!
            ASSERT( !this, "Have to change - hard attr. to para. style" );
            pDoc->Insert( *pInsPam, *pItemSet );

            delete pItemSet, pItemSet = 0;
        }
        delete pInsPam;
    }

    ::EndProgress( pDoc->GetDocShell() );
    return nError;
}

void SwASCIIParser::ReadChars()
{
    sal_Char *pStt = pArr, *pEnd = pArr, *pLastStt = pArr;
    long nReadCnt = 0;

    sal_Char cLastCR = 0;
    long nLineLen = 0;

    do {
        if( pStt >= pEnd )
        {
            if( pLastStt != pStt )
                pDoc->Insert( *pPam, String( pLastStt, rOpt.GetCharSet() ));

            // lese einen neuen Block ein
            ULONG lGCount;
            if (SVSTREAM_OK != rInput.GetError() ||
                ((lGCount = rInput.Read(pArr, ASC_BUFFLEN)) == 0))
                break;      // aus der WHILE-Schleife heraus

            if( lGCount == ASC_BUFFLEN )
            {
                if( RTL_TEXTENCODING_UTF8 == rOpt.GetCharSet() &&
                    0 != ( pArr[ ASC_BUFFLEN - 1 ] & 0x80 ) )
                {
                    // check the last char and skip before the start of it
                    long nBack = 0;
                    while( 0x80 == ( pArr[ ASC_BUFFLEN - 1 + nBack ] & 0xC0 ))
                        --nBack;
                    --nBack;
                    lGCount += nBack;
                    rInput.SeekRel( nBack );
                }
                else if( RTL_TEXTENCODING_UTF7 == rOpt.GetCharSet() )
                {
                    // search any char that may not be convertet
                    long nBack = 0;
                    sal_Char c;
                    while( ' ' < ( c = pArr[ ASC_BUFFLEN - 1 + nBack ] ) &&
                            '+' != c )
                        --nBack;
                    if( '+' == c )
                        --nBack;
                    lGCount += nBack;
                    rInput.SeekRel( nBack );
                }
            }

            pEnd = pArr + lGCount;
            nReadCnt += lGCount;
            *pEnd = 0;
            pStt = pLastStt = pArr;

            ::SetProgressState( nReadCnt, pDoc->GetDocShell() );

            if( cLastCR )
            {
                if( 0x0a == *pStt && 0x0d == cLastCR )
                    pLastStt = ++pStt;
                cLastCR = 0;
                nLineLen = 0;
                // JP 03.04.96: das letze am Ende nehmen wir nicht
                if( !rInput.IsEof() || !(pEnd == pStt ||
                    ( !*pEnd && pEnd == pStt+1 ) ) )
                    pDoc->SplitNode( *pPam->GetPoint() );
            }
        }

        BOOL bIns = TRUE, bSplitNode = FALSE;
        switch( *pStt )
        {
        case 0:
                    pEnd = pStt;
                    bIns = FALSE;
                    break;

        case 0x0a:  if( LINEEND_LF == rOpt.GetParaFlags() )
                    {
                        bIns = FALSE;
                        *pStt = 0;
                        ++pStt;

                        // JP 03.04.96: das letze am Ende nehmen wir nicht
                        if( !rInput.IsEof() || !(pEnd == pStt ||
                            ( !*pEnd && pEnd == pStt+1 ) ) )
                            bSplitNode = TRUE;
                    }
                    break;

        case 0x0d:  if( LINEEND_LF != rOpt.GetParaFlags() )
                    {
                        bIns = FALSE;
                        *pStt = 0;
                        ++pStt;

                        BOOL bChkSplit = FALSE;
                        if( LINEEND_CRLF == rOpt.GetParaFlags() )
                        {
                            if( pStt == pEnd )
                                cLastCR = 0x0d;
                            else if( 0x0a == *pStt )
                            {
                                ++pStt;
                                bChkSplit = TRUE;
                            }
                        }
                        else
                            bChkSplit = TRUE;

                            // JP 03.04.96: das letze am Ende nehmen wir nicht
                        if( bChkSplit && ( !rInput.IsEof() ||
                            !(pEnd == pStt || ( !*pEnd && pEnd == pStt+1 ))))
                                bSplitNode = TRUE;
                    }
                    break;

        case 0x0c:
                    {
                        // dann mal einen harten Seitenumbruch einfuegen
                        *pStt++ = 0;
                        if( nLineLen )
                        {
                            // Change to charset system!!!!
                            //rOpt.GetCharSet();
                            pDoc->Insert( *pPam, String( pLastStt,
                                                        rOpt.GetCharSet() ));
                        }
                        pDoc->SplitNode( *pPam->GetPoint() );
                        pDoc->Insert( *pPam, SvxFmtBreakItem(
                                    SVX_BREAK_PAGE_BEFORE ));
                        pLastStt = pStt;
                        nLineLen = 0;
                        bIns = FALSE;
                    }
                    break;

        case 0x1a:
                    if( nReadCnt == nFileSize && pStt+1 == pEnd )
                        *pStt = 0;
                    else
                        *pStt = '#';        // Ersatzdarstellung
                    break;

        case '\t':  break;

        default:
            if( (BYTE)' ' > (BYTE)*pStt )
                    // Ctrl-Zchn gefunden ersetze durch '#'
                *pStt = '#';
            break;
        }

        if( bIns )
        {
            if( ( nLineLen >= MAX_ASCII_PARA - 100 ) &&
                ( ( *pStt == ' ' ) || ( nLineLen >= MAX_ASCII_PARA - 1 ) ) )
            {
                sal_Char c = *pStt;
                *pStt = 0;

                // Change to charset system!!!!
                //rOpt.GetCharSet();
                pDoc->Insert( *pPam, String( pLastStt, rOpt.GetCharSet() ));

                pDoc->SplitNode( *pPam->GetPoint() );
                pLastStt = pStt;
                nLineLen = 0;
                *pStt = c;
            }
            ++pStt;
            ++nLineLen;
        }
        else if( bSplitNode )
        {
            // es wurde ein CR/LF erkannt, also speichere den Text

            // Change to charset system!!!!
            //rOpt.GetCharSet();
            pDoc->Insert( *pPam, String( pLastStt, rOpt.GetCharSet() ));

            pDoc->SplitNode( *pPam->GetPoint() );
            pLastStt = pStt;
            nLineLen = 0;
        }
    } while( TRUE );
}

void SwASCIIParser::ReadUnicode()
{
    BOOL bSwapUnicode = FALSE;
    long nReadCnt = 0;

    sal_Int16 nFlag;
    rInput >> nFlag;

    if( -2 == nFlag )
        bSwapUnicode = TRUE;                // must be swapped
    else if( -257 != nFlag )                  // notthing to do
        rInput.SeekRel( sizeof( nFlag ) );  // no tag at start

    sal_Unicode *pStt = (sal_Unicode*)pArr, *pEnd = pStt, *pLastStt = pStt;

    sal_Unicode cLastCR = 0;
    long nLineLen = 0;

    do {
        if( pStt >= pEnd )
        {
            if( pLastStt != pStt )
                pDoc->Insert( *pPam, String( pLastStt ));

            // lese einen neuen Block ein
            ULONG lGCount;
            if (SVSTREAM_OK != rInput.GetError() ||
                ((lGCount = rInput.Read(pArr, ASC_BUFFLEN)) == 0))
                break;      // aus der WHILE-Schleife heraus

            pEnd = (sal_Unicode*)(pArr + lGCount);
            nReadCnt += lGCount;
            *pEnd = 0;
            pStt = pLastStt = (sal_Unicode*)pArr;

            if( bSwapUnicode )
            {
                sal_Char* pF = pArr, *pN = pArr + 1;
                for( ULONG n = 0; n < lGCount; n += 2, pF += 2, pN += 2 )
                {
                    sal_Char c = *pF;
                    *pF = *pN;
                    *pN = c;
                }
            }

            ::SetProgressState( nReadCnt, pDoc->GetDocShell() );

            if( cLastCR )
            {
                if( 0x0a == *pStt && 0x0d == cLastCR )
                    pLastStt = ++pStt;
                cLastCR = 0;
                nLineLen = 0;
                // JP 03.04.96: das letze am Ende nehmen wir nicht
                if( !rInput.IsEof() || !(pEnd == pStt ||
                    ( !*pEnd && pEnd == pStt+1 ) ) )
                    pDoc->SplitNode( *pPam->GetPoint() );
            }
        }

        BOOL bIns = TRUE, bSplitNode = FALSE;
        switch( *pStt )
        {
        case 0:
                    pEnd = pStt;
                    bIns = FALSE;
                    break;

        case 0x0a:  if( LINEEND_LF == rOpt.GetParaFlags() )
                    {
                        bIns = FALSE;
                        *pStt = 0;
                        ++pStt;

                        // JP 03.04.96: das letze am Ende nehmen wir nicht
                        if( !rInput.IsEof() || !(pEnd == pStt ||
                            ( !*pEnd && pEnd == pStt+1 ) ) )
                            bSplitNode = TRUE;
                    }
                    break;

        case 0x0d:  if( LINEEND_LF != rOpt.GetParaFlags() )
                    {
                        bIns = FALSE;
                        *pStt = 0;
                        ++pStt;

                        BOOL bChkSplit = FALSE;
                        if( LINEEND_CRLF == rOpt.GetParaFlags() )
                        {
                            if( pStt == pEnd )
                                cLastCR = 0x0d;
                            else if( 0x0a == *pStt )
                            {
                                ++pStt;
                                bChkSplit = TRUE;
                            }
                        }
                        else
                            bChkSplit = TRUE;

                            // JP 03.04.96: das letze am Ende nehmen wir nicht
                        if( bChkSplit && ( !rInput.IsEof() ||
                            !(pEnd == pStt || ( !*pEnd && pEnd == pStt+1 ))))
                                bSplitNode = TRUE;
                    }
                    break;

        case 0x0c:
                    {
                        // dann mal einen harten Seitenumbruch einfuegen
                        *pStt++ = 0;
                        if( nLineLen )
                        {
                            // Change to charset system!!!!
                            //rOpt.GetCharSet();
                            pDoc->Insert( *pPam, String( pLastStt ));
                        }
                        pDoc->SplitNode( *pPam->GetPoint() );
                        pDoc->Insert( *pPam, SvxFmtBreakItem(
                                    SVX_BREAK_PAGE_BEFORE ));
                        pLastStt = pStt;
                        nLineLen = 0;
                        bIns = FALSE;
                    }
                    break;

        case 0x1a:
                    if( nReadCnt == nFileSize && pStt+1 == pEnd )
                        *pStt = 0;
                    else
                        *pStt = '#';        // Ersatzdarstellung
                    break;

        case '\t':  break;

        default:
            if( ' ' > *pStt )
                    // Ctrl-Zchn gefunden ersetze durch '#'
                *pStt = '#';
            break;
        }

        if( bIns )
        {
            if( ( nLineLen >= MAX_ASCII_PARA - 100 ) &&
                ( ( *pStt == ' ' ) || ( nLineLen >= MAX_ASCII_PARA - 1 ) ) )
            {
                sal_Unicode c = *pStt;
                *pStt = 0;

                // Change to charset system!!!!
                //rOpt.GetCharSet();
                pDoc->Insert( *pPam, String( pLastStt ));

                pDoc->SplitNode( *pPam->GetPoint() );
                pLastStt = pStt;
                nLineLen = 0;
                *pStt = c;
            }
            ++pStt;
            ++nLineLen;
        }
        else if( bSplitNode )
        {
            // es wurde ein CR/LF erkannt, also speichere den Text

            pDoc->Insert( *pPam, String( pLastStt ));

            pDoc->SplitNode( *pPam->GetPoint() );
            pLastStt = pStt;
            nLineLen = 0;
        }
    } while( TRUE );
}

#endif

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ascii/parasc.cxx,v 1.1.1.1 2000-09-18 17:14:53 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.25  2000/09/18 16:04:39  willem.vandorp
      OpenOffice header added.

      Revision 1.24  2000/08/04 16:25:28  jp
      read/write unicode ascii files

      Revision 1.23  2000/05/08 17:37:02  jp
      Changes for Unicode

      Revision 1.22  2000/03/16 16:42:31  kz
      chg. include to sfx2/printer

      Revision 1.21  1999/10/25 19:26:58  jp
      Bug #69048#: dont change LF to #

      Revision 1.20  1999/10/08 16:31:54  jp
      Bug #69048#: dont change tab to #

      Revision 1.19  1999/08/26 18:34:10  JP
      load and save Text with more options (charset/language/lineend/font)


      Rev 1.18   26 Aug 1999 20:34:10   JP
   load and save Text with more options (charset/language/lineend/font)

      Rev 1.17   23 Jul 1998 11:11:14   JP
   Task #52654#: Einfuegen Doc nicht mit einer CrsrShell sondern mit einen PaM

      Rev 1.16   29 Jun 1998 13:01:16   JP
   SvxFmtBreakItem ohne Flag!

      Rev 1.15   29 Apr 1998 08:17:14   MIB
   MUSS-Aenderung: SvStream::operator!() faellt weg

      Rev 1.14   27 Feb 1998 09:19:56   JP
   ObjectDying-MessageItem umbenannt

      Rev 1.13   22 Jan 1998 20:00:10   JP
   CTOR des SwPaM umgestellt

      Rev 1.12   30 Oct 1997 17:13:52   AMA
   Chg: Kein AutoFlag mehr an Break bzw. PageDesc-Attributen

      Rev 1.11   10 Oct 1997 12:20:22   JP
   Warnings vom Ueberlauf entfernt

      Rev 1.10   09 Oct 1997 14:26:02   JP
   Umstellung NodeIndex/-Array/BigPtrArray

      Rev 1.9   12 Aug 1997 10:06:46   OS
   Header-Umstellung

      Rev 1.8   07 Aug 1997 15:07:08   OM
   Headerfile-Umstellung

      Rev 1.7   06 Aug 1997 12:46:52   HJS
   includes

      Rev 1.6   13 Dec 1996 12:18:58   JP
   Bug #34482#: nach dem Lesen auf SystemCodeSet umschalten

      Rev 1.5   29 Oct 1996 12:10:24   JP
   am Doc ist das NodesArray nur noch ueber Get..() zugaenglich

      Rev 1.4   09 Oct 1996 17:58:46   MA
   Progress

      Rev 1.3   28 Jun 1996 13:59:08   MA
   includes

      Rev 1.2   02 May 1996 11:48:46   JP
   zum Testen: asynchrones Laden erweitert

      Rev 1.1   30 Apr 1996 12:09:38   JP
   Vorbereitung fuer asynchrones laden

      Rev 1.0   29 Apr 1996 18:11:00   JP
   Initial revision.

*************************************************************************/

diff --git a/sw/source/filter/ascii/wrtasc.cxx b/sw/source/filter/ascii/wrtasc.cxx
new file mode 100644
index 0000000..463c0ba
--- /dev/null
+++ b/sw/source/filter/ascii/wrtasc.cxx
@@ -0,0 +1,293 @@
/*************************************************************************
 *
 *  $RCSfile: wrtasc.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:53 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _STREAM_HXX
#include <tools/stream.hxx>
#endif

#ifndef _PAM_HXX
#include <pam.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _NDTXT_HXX
#include <ndtxt.hxx>
#endif
#ifndef _MDIEXP_HXX
#include <mdiexp.hxx>           // ...Percent()
#endif
#ifndef _DOCARY_HXX
#include <docary.hxx>
#endif
#ifndef _FMTCNTNT_HXX //autogen
#include <fmtcntnt.hxx>
#endif
#ifndef _FRMFMT_HXX //autogen
#include <frmfmt.hxx>
#endif
#ifndef _WRTASC_HXX
#include <wrtasc.hxx>
#endif

#ifndef _STATSTR_HRC
#include <statstr.hrc>          // ResId fuer Statusleiste
#endif


//-----------------------------------------------------------------

SwASCWriter::SwASCWriter( const String& rFltNm )
{
    SwAsciiOptions aNewOpts;

    switch( 5 <= rFltNm.Len() ? rFltNm.GetChar( 4 ) : 0 )
    {
    case 'D':   aNewOpts.SetCharSet( RTL_TEXTENCODING_IBM_850 );
                aNewOpts.SetParaFlags( LINEEND_CRLF );
                if( 5 < rFltNm.Len() )
                    switch( rFltNm.Copy( 5 ).ToInt32() )
                    {
                    case 437: aNewOpts.SetCharSet( RTL_TEXTENCODING_IBM_437 );  break;
                    case 850: aNewOpts.SetCharSet( RTL_TEXTENCODING_IBM_850 );  break;
                    case 860: aNewOpts.SetCharSet( RTL_TEXTENCODING_IBM_860 );  break;
                    case 861: aNewOpts.SetCharSet( RTL_TEXTENCODING_IBM_861 );  break;
                    case 863: aNewOpts.SetCharSet( RTL_TEXTENCODING_IBM_863 );  break;
                    case 865: aNewOpts.SetCharSet( RTL_TEXTENCODING_IBM_865 );  break;
                    }
                break;

    case 'A':   aNewOpts.SetCharSet( RTL_TEXTENCODING_MS_1252 );
                aNewOpts.SetParaFlags( LINEEND_CRLF );
                break;
    case 'M':   aNewOpts.SetCharSet( RTL_TEXTENCODING_APPLE_ROMAN );
                aNewOpts.SetParaFlags( LINEEND_CR );
                break;
    case 'X':   aNewOpts.SetCharSet( RTL_TEXTENCODING_MS_1252 );
                aNewOpts.SetParaFlags( LINEEND_LF );
                break;

    default:
        if( rFltNm.Copy( 4 ).EqualsAscii( "_DLG" ))
        {
            // use the options
            aNewOpts = GetAsciiOptions();
        }
    }
    SetAsciiOptions( aNewOpts );
}

SwASCWriter::~SwASCWriter() {}

ULONG SwASCWriter::WriteStream()
{
    sal_Char cLineEnd[ 3 ];
    sal_Char* pCEnd = cLineEnd;
    if( bASCII_ParaAsCR )           // falls vorgegeben ist.
        *pCEnd++ = '\015';
    else if( bASCII_ParaAsBlanc )
        *pCEnd++ = ' ';
    else
        switch( GetAsciiOptions().GetParaFlags() )
        {
        case LINEEND_CR:    *pCEnd++ = '\015'; break;
        case LINEEND_LF:    *pCEnd++ = '\012'; break;
        case LINEEND_CRLF:  *pCEnd++ = '\015', *pCEnd++ = '\012'; break;
        }
    *pCEnd = 0;

    sLineEnd.AssignAscii( cLineEnd );

    long nMaxNode = pDoc->GetNodes().Count();

    if( bShowProgress )
        ::StartProgress( STR_STATSTR_W4WWRITE, 0, nMaxNode, pDoc->GetDocShell() );

    SwPaM* pPam = pOrigPam;

    BOOL bWriteSttTag = bUCS2_WithStartChar &&
                    RTL_TEXTENCODING_UCS2 == GetAsciiOptions().GetCharSet();

    // gebe alle Bereich des Pams in das ASC-File aus.
    do {
        BOOL bTstFly = TRUE;
        while( pCurPam->GetPoint()->nNode.GetIndex() < pCurPam->GetMark()->nNode.GetIndex() ||
              (pCurPam->GetPoint()->nNode.GetIndex() == pCurPam->GetMark()->nNode.GetIndex() &&
               pCurPam->GetPoint()->nContent.GetIndex() <= pCurPam->GetMark()->nContent.GetIndex()) )
        {
            SwTxtNode* pNd = pCurPam->GetPoint()->nNode.GetNode().GetTxtNode();
            if( pNd )
            {
                // sollten nur Rahmen vorhanden sein?
                // (Moeglich, wenn Rahmen-Selektion ins Clipboard
                // gestellt wurde)
                if( bTstFly && bWriteAll &&
                    // keine Laenge
                    !pNd->GetTxt().Len() &&
                    // Rahmen vorhanden
                    pDoc->GetSpzFrmFmts()->Count() &&
                    // nur ein Node im Array
                    pDoc->GetNodes().GetEndOfExtras().GetIndex() + 3 ==
                    pDoc->GetNodes().GetEndOfContent().GetIndex() &&
                    // und genau der ist selektiert
                    pDoc->GetNodes().GetEndOfContent().GetIndex() - 1 ==
                    pCurPam->GetPoint()->nNode.GetIndex() )
                {
                    // dann den Inhalt vom Rahmen ausgeben.
                    // dieser steht immer an Position 0 !!
                    SwFrmFmt* pFmt = (*pDoc->GetSpzFrmFmts())[ 0 ];
                    const SwNodeIndex* pIdx = pFmt->GetCntnt().GetCntntIdx();
                    if( pIdx )
                    {
                        delete pCurPam;
                        pCurPam = NewSwPaM( *pDoc, pIdx->GetIndex(),
                                    pIdx->GetNode().EndOfSectionIndex() );
                        pCurPam->Exchange();
                        continue;       // while-Schleife neu aufsetzen !!
                    }
                }
                else
                {
                    if( bWriteSttTag )
                    {
                        Strm() << short(-257);
                        bWriteSttTag = FALSE;
                    }
                    Out( aASCNodeFnTab, *pNd, *this );
                }
                bTstFly = FALSE;        // eimal Testen reicht
            }

            if( !pCurPam->Move( fnMoveForward, fnGoNode ) )
                break;

            if( bShowProgress )
                ::SetProgressState( pCurPam->GetPoint()->nNode.GetIndex(),
                                    pDoc->GetDocShell() );   // Wie weit ?

        }
    } while( CopyNextPam( &pPam ) );        // bis alle Pam bearbeitet

    if( bShowProgress )
        ::EndProgress( pDoc->GetDocShell() );

    return 0;
}


void GetASCWriter( const String& rFltNm, WriterRef& xRet )
{
  xRet = new SwASCWriter( rFltNm );
}

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ascii/wrtasc.cxx,v 1.1.1.1 2000-09-18 17:14:53 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.61  2000/09/18 16:04:39  willem.vandorp
      OpenOffice header added.

      Revision 1.60  2000/08/04 16:25:32  jp
      read/write unicode ascii files

      Revision 1.59  2000/05/08 17:37:06  jp
      Changes for Unicode

      Revision 1.58  2000/03/03 16:23:14  pl
      #73771# workaround for c50 intel compiler

      Revision 1.57  1999/08/30 08:01:52  JP
      WriteStream - set lineend string


      Rev 1.56   30 Aug 1999 10:01:52   JP
   WriteStream - set lineend string

      Rev 1.55   26 Aug 1999 20:34:10   JP
   load and save Text with more options (charset/language/lineend/font)

      Rev 1.54   16 Jun 1999 19:47:26   JP
   Change interface of base class Writer

      Rev 1.53   04 May 1999 14:59:40   JP
   FilterExportklasse Writer von SvRef abgeleitet, damit sie immer zerstoert wird

      Rev 1.52   27 Jun 1998 16:01:50   JP
   Writer mit neuen Flags; fuer den ASCII-Writer, etwas aufgeraeumt

*************************************************************************/


diff --git a/sw/source/filter/ascii/wrtasc.hxx b/sw/source/filter/ascii/wrtasc.hxx
new file mode 100644
index 0000000..25fc7a0
--- /dev/null
+++ b/sw/source/filter/ascii/wrtasc.hxx
@@ -0,0 +1,90 @@
/*************************************************************************
 *
 *  $RCSfile: wrtasc.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:53 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _WRTASC_HXX
#define _WRTASC_HXX

#ifndef _SHELLIO_HXX
#include <shellio.hxx>
#endif
#ifndef _WRT_FN_HXX
#include <wrt_fn.hxx>
#endif

extern SwNodeFnTab aASCNodeFnTab;


// der ASC-Writer

class SwASCWriter : public Writer
{
    String sLineEnd;

    virtual ULONG WriteStream();

public:
    SwASCWriter( const String& rFilterName );
    virtual ~SwASCWriter();

    const String& GetLineEnd() const      { return sLineEnd; }
};


#endif  //  _WRTASC_HXX
diff --git a/sw/source/filter/html/css1atr.cxx b/sw/source/filter/html/css1atr.cxx
new file mode 100644
index 0000000..fac011d
--- /dev/null
+++ b/sw/source/filter/html/css1atr.cxx
@@ -0,0 +1,3536 @@
/*************************************************************************
 *
 *  $RCSfile: css1atr.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:55 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/


#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#define ITEMID_BOXINFO      SID_ATTR_BORDER_INNER
#include "hintids.hxx"

#ifndef _SV_SVAPP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _WRKWIN_HXX //autogen
#include <vcl/wrkwin.hxx>
#endif
#ifndef _SFX_WHITER_HXX //autogen
#include <svtools/whiter.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _SVX_UDLNITEM_HXX //autogen
#include <svx/udlnitem.hxx>
#endif
#ifndef _SVX_CRSDITEM_HXX //autogen
#include <svx/crsditem.hxx>
#endif
#ifndef _SVX_BLNKITEM_HXX //autogen
#include <svx/blnkitem.hxx>
#endif
#ifndef _SVX_CMAPITEM_HXX //autogen
#include <svx/cmapitem.hxx>
#endif
#ifndef _SVX_CMAPITEM_HXX //autogen
#include <svx/cmapitem.hxx>
#endif
#ifndef _SVX_COLRITEM_HXX //autogen
#include <svx/colritem.hxx>
#endif
#ifndef _SVX_FONTITEM_HXX //autogen
#include <svx/fontitem.hxx>
#endif
#ifndef _SVX_FHGTITEM_HXX //autogen
#include <svx/fhgtitem.hxx>
#endif
#ifndef _SVX_POSTITEM_HXX //autogen
#include <svx/postitem.hxx>
#endif
#ifndef _SVX_KERNITEM_HXX //autogen
#include <svx/kernitem.hxx>
#endif
#ifndef _SVX_WGHTITEM_HXX //autogen
#include <svx/wghtitem.hxx>
#endif
#ifndef _SVX_LSPCITEM_HXX //autogen
#include <svx/lspcitem.hxx>
#endif
#ifndef _SVX_ADJITEM_HXX //autogen
#include <svx/adjitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _SVX_BRKITEM_HXX //autogen
#include <svx/brkitem.hxx>
#endif
#ifndef _SVX_KEEPITEM_HXX //autogen
#include <svx/keepitem.hxx>
#endif
#ifndef _SVX_WIDWITEM_HXX //autogen
#include <svx/widwitem.hxx>
#endif
#ifndef _SVX_SPLTITEM_HXX //autogen
#include <svx/spltitem.hxx>
#endif
#ifndef _SVX_ORPHITEM_HXX //autogen
#include <svx/orphitem.hxx>
#endif
#ifndef _XOUTBMP_HXX //autogen
#include <svx/xoutbmp.hxx>
#endif
#ifndef _HTMLOUT_HXX //autogen
#include <svtools/htmlout.hxx>
#endif
#ifndef _HTMLKYWD_HXX
#include <svtools/htmlkywd.hxx>
#endif
#ifndef _SVX_HTMLMODE_HXX //autogen
#include <svx/htmlmode.hxx>
#endif
#ifndef SVTOOLS_URIHELPER_HXX
#include <svtools/urihelper.hxx>
#endif
#ifndef _URLOBJ_HXX //autogen
#include <tools/urlobj.hxx>
#endif
#ifndef _INTN_HXX //autogen
#include <tools/intn.hxx>
#endif
#ifndef _BIGINT_HXX //autogen
#include <tools/bigint.hxx>
#endif
#ifndef _UNOTOOLS_CHARCLASS_HXX
#include <unotools/charclass.hxx>
#endif

#ifndef _CHARFMT_HXX //autogen
#include <charfmt.hxx>
#endif
#ifndef _FMTCOL_HXX //autogen
#include <fmtcol.hxx>
#endif
#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _FMTORNT_HXX //autogen
#include <fmtornt.hxx>
#endif
#ifndef _FMTPDSC_HXX //autogen
#include <fmtpdsc.hxx>
#endif
#ifndef _FMTTSPLT_HXX //autogen
#include <fmtlsplt.hxx>
#endif
#ifndef _PAGEDESC_HXX //autogen
#include <pagedesc.hxx>
#endif
#ifndef _FMTANCHR_HXX //autogen
#include <fmtanchr.hxx>
#endif
#ifndef _DOCARY_HXX
#include <docary.hxx>
#endif
#ifndef _PAM_HXX //autogen
#include <pam.hxx>
#endif
#ifndef _VIEWSH_HXX //autogen
#include <viewsh.hxx>
#endif
#ifndef _VIEWOPT_HXX //autogen
#include <viewopt.hxx>
#endif
#ifndef _SWTABLE_HXX //autogen
#include <swtable.hxx>
#endif
// FOOTNOTES
#ifndef _FTNINFO_HXX //autogen
#include <ftninfo.hxx>
#endif
#ifndef _FTNIDX_HXX //autogen
#include <ftnidx.hxx>
#endif
#ifndef _TXTFTN_HXX //autogen
#include <txtftn.hxx>
#endif
#ifndef _FMTFTN_HXX //autogen
#include <fmtftn.hxx>
#endif
// FOOTNOTES

#ifndef _DCONTACT_HXX //autogen
#include <dcontact.hxx>
#endif

#include "doc.hxx"
#include "swerror.h"
#include "charatr.hxx"
#include "paratr.hxx"
#include "frmatr.hxx"
#include "poolfmt.hxx"
#include "fltini.hxx"
#include "css1kywd.hxx"
#include "wrthtml.hxx"
#include "htmlnum.hxx"

/*
 * um nicht immer wieder nach einem Update festzustellen, das irgendwelche
 * Hint-Ids dazugekommen sind, wird hier definiert, die Groesse der Tabelle
 * definiert und mit der akt. verglichen. Bei unterschieden wird der
 * Compiler schon meckern.
 *
 * diese Section und die dazugeherigen Tabellen muessen in folgenden Files
 * gepflegt werden: rtf\rtfatr.cxx, sw6\sw6atr.cxx, w4w\w4watr.cxx
 */
#if !defined(UNX) && !defined(MSC) && !defined(PPC) && !defined(CSET) && !defined(__MWERKS__) && !defined(WTC)

#define ATTRFNTAB_SIZE 121
#if ATTRFNTAB_SIZE != POOLATTR_END - POOLATTR_BEGIN
#error Attribut-Tabelle ist ungueltigt. Wurden neue Hint-IDs zugefuegt ??
#endif

#endif

#define HTML_HEADSPACE (12*20)

#define CSS1_BACKGROUND_ATTR    1
#define CSS1_BACKGROUND_PAGE    2
#define CSS1_BACKGROUND_TABLE   3
#define CSS1_BACKGROUND_FLY     4
#define CSS1_BACKGROUND_SECTION 5

#define CSS1_FRMSIZE_WIDTH      0x01
#define CSS1_FRMSIZE_VARHEIGHT  0x02
#define CSS1_FRMSIZE_MINHEIGHT  0x04
#define CSS1_FRMSIZE_FIXHEIGHT  0x08
#define CSS1_FRMSIZE_ANYHEIGHT  0x0e
#define CSS1_FRMSIZE_PIXEL      0x10


//-----------------------------------------------------------------------

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_rule_end, " }" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_span_tag_end, "\">" );
const sal_Char cCSS1_style_opt_end = '\"';

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sHTML_FTN_fontheight, "57%" );

extern SwAttrFnTab aCSS1AttrFnTab;

static Writer& OutCSS1_SwFmt( Writer& rWrt, const SwFmt& rFmt,
                              SwDoc *pDoc, SwDoc *pTemplate );
static Writer& OutCSS1_SwPageDesc( Writer& rWrt, const SwPageDesc& rFmt,
                                   SwDoc *pDoc, SwDoc *pTemplate,
                                   USHORT nRefPoolId, BOOL bExtRef,
                                   BOOL bPseudo=TRUE );
static Writer& OutCSS1_SwFtnInfo( Writer& rWrt, const SwEndNoteInfo& rInfo,
                                  SwDoc *pDoc, USHORT nNotes, BOOL bEndNote );
static void OutCSS1_SwFmtDropAttrs( SwHTMLWriter& rHWrt,
                                    const SwFmtDrop& rDrop );
static Writer& OutCSS1_SvxUnderl_SvxCrOut_SvxBlink( Writer& rWrt,
                    const SvxUnderlineItem *pUItem,
                    const SvxCrossedOutItem *pCOItem,
                    const SvxBlinkItem *pBItem );
static Writer& OutCSS1_SvxFontWeight( Writer& rWrt, const SfxPoolItem& rHt );
static Writer& OutCSS1_SvxPosture( Writer& rWrt, const SfxPoolItem& rHt );
static Writer& OutCSS1_SvxULSpace( Writer& rWrt, const SfxPoolItem& rHt );
static Writer& OutCSS1_SvxLRSpace( Writer& rWrt, const SfxPoolItem& rHt );
static Writer& OutCSS1_SvxULSpace_SvxLRSpace( Writer& rWrt,
                                        const SvxULSpaceItem *pULSpace,
                                        const SvxLRSpaceItem *pLRSpace );
static Writer& OutCSS1_SvxULSpace_SvxLRSpace( Writer& rWrt,
                                        const SfxItemSet& rItemSet,
                                        BOOL bDeep );
static Writer& OutCSS1_SvxBrush( Writer& rWrt, const SfxPoolItem& rHt,
                                 USHORT nMode, const String *pGrfName );
static Writer& OutCSS1_SvxBrush( Writer& rWrt, const SfxPoolItem& rHt );
static Writer& OutCSS1_SvxBox( Writer& rWrt, const SfxPoolItem& rHt );
static Writer& OutCSS1_SwFmtFrmSize( Writer& rWrt, const SfxPoolItem& rHt,
                                     USHORT nMode );
static Writer& OutCSS1_SvxFmtBreak_SwFmtPDesc_SvxFmtKeep( Writer& rWrt,
                                        const SfxItemSet& rItemSet,
                                        BOOL bDeep );
static Writer& OutCSS1_SwFmtLayoutSplit( Writer& rWrt, const SfxPoolItem& rHt );

static void ConvToHex( USHORT nHex, ByteString& rStr )
{
    sal_Char aNToABuf[] = "00";

    // Pointer an das Bufferende setzen
    sal_Char *pStr = aNToABuf + (sizeof(aNToABuf)-1);
    for( BYTE n = 0; n < 2; ++n )
    {
        *(--pStr) = (sal_Char)(nHex & 0xf ) + 48;
        if( *pStr > '9' )
            *pStr += 39;
        nHex >>= 4;
    }

    rStr.Append( aNToABuf );
}

static void GetCSS1Color( const Color& rColor, ByteString& rStr )
{
    rStr += '#';

    ConvToHex( rColor.GetRed(), rStr );
    ConvToHex( rColor.GetGreen(), rStr );
    ConvToHex( rColor.GetBlue(), rStr );
}

class SwCSS1OutMode
{
    SwHTMLWriter& rWrt;
    USHORT nOldMode;

public:

    SwCSS1OutMode( SwHTMLWriter& rHWrt, USHORT nMode, BOOL bStartFirst=TRUE,
                   const String *pSelector=0 ) :
        rWrt( rHWrt ),
        nOldMode( rHWrt.nCSS1OutMode )
    {
        rWrt.nCSS1OutMode = nMode;
        if( bStartFirst )
            rWrt.bFirstCSS1Property = TRUE;
        if( pSelector )
            rWrt.aCSS1Selector = *pSelector;
    }

    ~SwCSS1OutMode()
    {
        rWrt.nCSS1OutMode = nOldMode;
    }
};



void SwHTMLWriter::OutCSS1_Property( const sal_Char *pProp,
                                     const sal_Char *pVal,
                                     const String *pSVal )
{
    ByteString sOut;

    if( bFirstCSS1Rule && (nCSS1OutMode & CSS1_OUTMODE_RULE_ON)!=0 )
    {
        bFirstCSS1Rule = FALSE;
        OutNewLine();
        HTMLOutFuncs::Out_AsciiTag( Strm(), sHTML_style );
        OutNewLine();
        Strm() << '<' << sHTML_comment;

        IncIndentLevel();
    }

    if( bFirstCSS1Property )
    {
        switch( nCSS1OutMode & CSS1_OUTMODE_ANY_ON )
        {
        case CSS1_OUTMODE_SPAN_TAG_ON:
        case CSS1_OUTMODE_SPAN_TAG1_ON:
            if( bTagOn )
            {
                ((((sOut += '<') += sHTML_span) += ' ') += sHTML_O_style) += "=\"";
            }
            else
            {
                HTMLOutFuncs::Out_AsciiTag( Strm(), sHTML_span, FALSE );
                return;
            }
            break;

        case CSS1_OUTMODE_RULE_ON:
            {
                ByteString sTmp( aCSS1Selector, eDestEnc );
                OutNewLine();
                (sOut = sTmp) += " { ";
            }
            break;

        case CSS1_OUTMODE_STYLE_OPT_ON:
            ((sOut = ' ') += sHTML_O_style) += "=\"";
            break;
        }
        bFirstCSS1Property = FALSE;
    }
    else
    {
        sOut += "; ";
    }


    (sOut += pProp) += ": ";
    if( nCSS1OutMode & CSS1_OUTMODE_ENCODE )
    {
        // In STYLE-Optionen den String codieren
        Strm() << sOut.GetBuffer();
        sOut.Erase();
        if( pVal )
            HTMLOutFuncs::Out_String( Strm(), String::CreateFromAscii(pVal),
                                      eDestEnc );
        else if( pSVal )
            HTMLOutFuncs::Out_String( Strm(), *pSVal, eDestEnc );
    }
    else
    {
        // Im STYLE-Tag des String direct ausgeben
        if( pVal )
            sOut += pVal;
        else if( pVal )
        {
            ByteString sTmp( *pSVal, eDestEnc );
            sOut += sTmp;
        }
    }

    if( sOut.Len() )
        Strm() << sOut.GetBuffer();
}

static void AddUnitPropertyValue( long nVal, FieldUnit eUnit, ByteString& rOut )
{
    if( nVal < 0 )
    {
        // Vorzeichen extra behandeln
        nVal = -nVal;
        rOut += '-';
    }

    // Die umgerechnete Einheit ergibt sich aus (x * nMul)/(nDiv*nFac*10)
    long nMul = 1000;
    long nDiv = 1;
    long nFac = 100;
    const sal_Char *pUnit;
    switch( eUnit )
    {
    case FUNIT_100TH_MM:
        ASSERT( FUNIT_MM == eUnit, "Masseinheit wird nicht unterstuetzt" );
    case FUNIT_MM:
        // 0.01mm = 0.57twip
        nMul = 25400;   // 25.4 * 1000
        nDiv = 1440;    // 72 * 20;
        nFac = 100;
        pUnit = sCSS1_UNIT_mm;
        break;

    case FUNIT_M:
    case FUNIT_KM:
        ASSERT( FUNIT_CM == eUnit, "Masseinheit wird nicht unterstuetzt" );
    case FUNIT_CM:
#ifdef EXACT_VALUES
        // 0.001cm = 0.57twip
        nMul = 25400;   // 2.54 * 10000
        nDiv = 1440;    // 72 * 20;
        nFac = 1000;
#else
        // 0.01cm = 5.7twip (ist zwar ungenau, aber die UI ist auch ungenau)
        nMul = 2540;    // 2.54 * 1000
        nDiv = 1440;    // 72 * 20;
        nFac = 100;
#endif
        pUnit = sCSS1_UNIT_cm;
        break;

    case FUNIT_TWIP:
        ASSERT( FUNIT_POINT == eUnit, "Masseinheit wird nicht unterstuetzt" );
    case FUNIT_POINT:
#ifdef EXACT_VALUES
        // 0.01pt = 0.2twip
        nMul = 1000;
        nDiv = 20;
        nFac = 100;
#else
        // 0.1pt = 2.0twip (ist zwar ungenau, aber die UI ist auch ungenau)
        nMul = 100;
        nDiv = 20;
        nFac = 10;
#endif
        pUnit = sCSS1_UNIT_pt;
        break;

    case FUNIT_PICA:
#ifdef EXACT_VALUES
        // 0.001pc = 0.24twip
        nMul = 10000;
        nDiv = 12 * 20;
        nFac = 1000;
#else
        // 0.01pc = 2.40twip (ist zwar ungenau, aber die UI ist auch ungenau)
        nMul = 1000;
        nDiv = 240;     // 12 * 20;
        nFac = 100;
#endif
        pUnit = sCSS1_UNIT_pc;
        break;

    case FUNIT_NONE:
    case FUNIT_FOOT:
    case FUNIT_MILE:
    case FUNIT_CUSTOM:
    case FUNIT_PERCENT:
    case FUNIT_INCH:
    default:
        ASSERT( FUNIT_INCH == eUnit, "Masseinheit wird nicht unterstuetzt" );
#ifdef EXACT_VALUES
        // 0.0001in = 0.144twip
        nMul = 100000;
        nDiv = 1440;    // 72 * 20;
        nFac = 10000;
#else
        // 0.01in = 14.4twip (ist zwar ungenau, aber die UI ist auch ungenau)
        nMul = 1000;
        nDiv = 1440;    // 72 * 20;
        nFac = 100;
#endif
        pUnit = sCSS1_UNIT_inch;
        break;
    }

    long nLongVal;
    BOOL bOutLongVal = TRUE;
    if( nVal > LONG_MAX / nMul )
    {
        // Zum Unrechnen der Einheit wird ein BigInt benoetigt
#ifdef SAL_INT64_IS_STRUCT
        BigInt nBigVal( nVal );
        nBigVal *= nMul;
        nBigVal /= nDiv;
        nBigVal += 5;
        nBigVal /= 10;

        if( nBigVal.IsLong() )
        {
            // Zum Ausgeben des Wertes reicht ein long.
            nLongVal = (long)nBigVal;
        }
        else
        {
            BigInt nBigFac( nFac );
            BigInt nBig10( 10 );
            rOut += (long)(nBigVal / nBigFac);
            if( !(nBigVal % nBigFac).IsZero() )
            {
                rOut += '.';
                while( nFac > 1 && !(nBigVal % nBigFac).IsZero() )
                {
                    nFac /= 10;
                    nBigFac = nFac;
                    rOut += (int)((nBigVal / nBigFac) % nBig10 );
                }
            }
            bOutLongVal = FALSE;
        }
#else
        sal_Int64 nBigVal( nVal );
        nBigVal *= nMul;
        nBigVal /= nDiv;
        nBigVal += 5;
        nBigVal /= 10;

        if( nBigVal <= LONG_MAX )
        {
            // Zum Ausgeben des Wertes reicht ein long.
            nLongVal = (long)nBigVal;
        }
        else
        {
            rOut += ByteString::CreateFromInt64( nBigVal / (sal_Int64)nFac );
            if( (nBigVal % (sal_Int64)nFac) != 0 )
            {
                rOut += '.';
                while( nFac > 1 && (nBigVal % (sal_Int64)nFac) != 0 )
                {
                    nFac /= 10;
                    rOut += ByteString::CreateFromInt64(
                                (nBigVal / (sal_Int64)nFac) % (sal_Int64)10 );
                }
            }
            bOutLongVal = FALSE;
        }
#endif
    }
    else
    {
        nLongVal = nVal * nMul;
        nLongVal /= nDiv;
        nLongVal += 5;
        nLongVal /= 10;
    }

    if( bOutLongVal )
    {
        rOut += ByteString::CreateFromInt32( nLongVal/nFac );
        if( (nLongVal % nFac) != 0 )
        {
            rOut += '.';
            while( nFac > 1 && (nLongVal % nFac) != 0 )
            {
                nFac /= 10;
                rOut += ByteString::CreateFromInt32( (nLongVal / nFac) % 10 );
            }
        }
    }

    rOut.Append( pUnit );
}

void SwHTMLWriter::OutCSS1_UnitProperty( const sal_Char *pProp, long nVal )
{
    ByteString sOut;
    AddUnitPropertyValue( nVal, eCSS1Unit, sOut );
    OutCSS1_PropertyAscii( pProp, sOut );
}

void SwHTMLWriter::OutCSS1_PixelProperty( const sal_Char *pProp, long nVal,
                                          BOOL bVert )
{
    if( nVal && Application::GetDefaultDevice() )
    {
        Size aSz( bVert ? 0 : nVal, bVert ? nVal : 0 );
        aSz = Application::GetDefaultDevice()->LogicToPixel( aSz, MapMode( MAP_TWIP) );
        nVal = bVert ? aSz.Height() : aSz.Width();
        if( !nVal )
            nVal = 1;
    }

    ByteString sOut( ByteString::CreateFromInt32( nVal ) );
    sOut.Append( sCSS1_UNIT_px );
    OutCSS1_PropertyAscii( pProp, sOut );
}

void SwHTMLWriter::OutCSS1_SfxItemSet( const SfxItemSet& rItemSet,
                                       BOOL bDeep )
{
    // den ItemSet ausgeben, und zwar inklusive aller Attribute
    Out_SfxItemSet( aCSS1AttrFnTab, *this, rItemSet, bDeep );

    // ein par Attribute benoetigen eine Spezial-Behandlung
    const SfxPoolItem *pItem = 0;

    // Underline, CrossedOut und Blink bilden zusammen eine CSS1-Property
    // (geht natuerlich nicht bei Hints)
    if( !IsCSS1Source(CSS1_OUTMODE_HINT) )
    {
        const SvxUnderlineItem *pUnderlineItem = 0;
        if( SFX_ITEM_SET==rItemSet.GetItemState( RES_CHRATR_UNDERLINE, bDeep, &pItem ))
            pUnderlineItem = (const SvxUnderlineItem *)pItem;

        const SvxCrossedOutItem *pCrossedOutItem = 0;
        if( SFX_ITEM_SET==rItemSet.GetItemState( RES_CHRATR_CROSSEDOUT, bDeep, &pItem ))
            pCrossedOutItem = (const SvxCrossedOutItem *)pItem;

        const SvxBlinkItem *pBlinkItem = 0;
        if( SFX_ITEM_SET==rItemSet.GetItemState( RES_CHRATR_BLINK, bDeep, &pItem ))
            pBlinkItem = (const SvxBlinkItem *)pItem;

        if( pUnderlineItem || pCrossedOutItem || pBlinkItem )
            OutCSS1_SvxUnderl_SvxCrOut_SvxBlink( *this, pUnderlineItem,
                                                 pCrossedOutItem,
                                                 pBlinkItem );

        OutCSS1_SvxFmtBreak_SwFmtPDesc_SvxFmtKeep( *this, rItemSet, bDeep );
    }

    if( !bFirstCSS1Property )
    {
        // wenn eine Property als Bestandteil einer Style-Option
        // ausgegeben wurde, muss die Optiomn noch beendet werden
        ByteString sOut;
        switch( nCSS1OutMode & CSS1_OUTMODE_ANY_OFF )
        {
        case CSS1_OUTMODE_SPAN_TAG_OFF:
            sOut = sCSS1_span_tag_end;
            break;

        case CSS1_OUTMODE_STYLE_OPT_OFF:
            sOut = cCSS1_style_opt_end;
            break;

        case CSS1_OUTMODE_RULE_OFF:
            sOut = sCSS1_rule_end;
            break;
        }
        if( sOut.Len() )
            Strm() << sOut.GetBuffer();
    }
}

#if USED
void SwHTMLWriter::OutCSS1_SfxItem( USHORT nMode,
                                    const SfxPoolItem *pItem1,
                                    const SfxPoolItem *pItem2 )
{
    // den ItemSet ausgeben, und zwar inklusive aller Attribute
    nSaveMode = nCSS1OutMode;
    nCSS1OutMode = nMode;
    bFirstCSS1Property = TRUE;

    Out( aCSS1AttrFnTab, *pItem1, *this );
    if( pItem2 )
        Out( aCSS1AttrFnTab, *pItem2, *this );


    if( !bFirstCSS1Property )
    {
        // wenn eine Property als Bestandteil einer Style-Option
        // ausgegeben wurde, muss die Optiomn noch beendet werden
        ByteString sOut;
        switch( nCSS1OutMode & CSS1_OUTMODE_ANY_OFF )
        {
        case CSS1_OUTMODE_SPAN_TAG_OFF:
            sOut = sCSS1_span_tag_end;
            break;

        case CSS1_OUTMODE_STYLE_OPT_OFF:
            sOut = cCSS1_style_opt_end;
            break;

        case CSS1_OUTMODE_RULE:
            sOut = sCSS1_rule_end;
            break;
        }
        if( sOut.Len() )
            rStrm << sOut.GetBuffer();
    }

    nCSS1OutMode = nSaveMode;
}
#endif

void SwHTMLWriter::OutStyleSheet( const SwPageDesc& rPageDesc, BOOL bUsed )
{
    bFirstCSS1Rule = TRUE;

// Feature: PrintExt
    if( IsHTMLMode(HTMLMODE_PRINT_EXT) )
    {
        const SwPageDesc *pFirstPageDesc = 0;
        USHORT nFirstRefPoolId = RES_POOLPAGE_HTML;
        bCSS1IgnoreFirstPageDesc = TRUE;

        // Erstmal versuchen wir zu erraten, wie das Dokument so augebaut ist.
        // Erlaubt sind nur die Vorlagen HTML, erste Seite, linke Seite und
        // rechte Seite.
        // Eine erste Seite wird nur exportiert, wenn die erste Seite auch
        // wirklich die Vorlage "erste Seite" ist.
        // Linke und rechte Seiten werden nur exportiert, wenn diese beiden
        // Vorlagen untereinander verkettet werden.
        // Wenn andere Vorlagen verwendet werden, wird nur in sehr einfachen
        // Faellen etwas exportiert.
        const SwPageDesc *pPageDesc = &rPageDesc;
        const SwPageDesc *pFollow = rPageDesc.GetFollow();
        if( RES_POOLPAGE_FIRST == pPageDesc->GetPoolFmtId() &&
            pFollow != pPageDesc &&
            !IsPoolUserFmt( pFollow->GetPoolFmtId() ) )
        {
            // Das Dokument hat eine erste Seite
            pFirstPageDesc = pPageDesc;
            pPageDesc = pFollow;
            pFollow = pPageDesc->GetFollow();
        }
        if( pPageDesc == pFollow )
        {
            // Das Dokument ist einseitig. Egal welche Seite verwendet wird,
            // es wird kein zweiseitiges Dokument daraus gemacht.
            // Die Attributierung wird relativ zur HTML-Seitenvorlage
            // aus der HTML-Vorlage exportiert.
            OutCSS1_SwPageDesc( *this, *pPageDesc, pDoc, pTemplate,
                                RES_POOLPAGE_HTML, TRUE, FALSE );
            nFirstRefPoolId = pFollow->GetPoolFmtId();
        }
        else if( (RES_POOLPAGE_LEFT == pPageDesc->GetPoolFmtId() &&
                  RES_POOLPAGE_RIGHT == pFollow->GetPoolFmtId()) ||
                 (RES_POOLPAGE_RIGHT == pPageDesc->GetPoolFmtId() &&
                  RES_POOLPAGE_LEFT == pFollow->GetPoolFmtId()) )
        {
            // Das Dokument ist zweiseitig
            OutCSS1_SwPageDesc( *this, *pPageDesc, pDoc, pTemplate,
                                RES_POOLPAGE_HTML, TRUE );
            OutCSS1_SwPageDesc( *this, *pFollow, pDoc, pTemplate,
                                RES_POOLPAGE_HTML, TRUE );
            nFirstRefPoolId = RES_POOLPAGE_RIGHT;
            bCSS1IgnoreFirstPageDesc = FALSE;
        }
        // Alles andere bekommen wir nicht hin.

        if( pFirstPageDesc )
            OutCSS1_SwPageDesc( *this, *pFirstPageDesc, pDoc, pTemplate,
                                nFirstRefPoolId, FALSE );
    }
// /Feature: PrintExt


    // das Default-TextStyle wir nicht mit ausgegeben !!
    // das 0-Style ist das Default, wird nie ausgegeben !!
    USHORT nArrLen = pDoc->GetTxtFmtColls()->Count();
    for( USHORT i=1; i<nArrLen; i++ )
    {
        const SwTxtFmtColl* pColl = (*pDoc->GetTxtFmtColls())[i];
        if( !bUsed || pDoc->IsUsed( *pColl ) )
            OutCSS1_SwFmt( *this, *pColl, pDoc, pTemplate );
    }

    // das Default-TextStyle wir nicht mit ausgegeben !!
    nArrLen = pDoc->GetCharFmts()->Count();
    for( i=1; i<nArrLen; i++ )
    {
        const SwCharFmt *pCFmt = (*pDoc->GetCharFmts())[i];
        USHORT nPoolId = pCFmt->GetPoolFmtId();
        if( !bUsed || nPoolId == RES_POOLCHR_INET_NORMAL ||
            nPoolId == RES_POOLCHR_INET_VISIT ||
            pDoc->IsUsed( *pCFmt ) )
            OutCSS1_SwFmt( *this, *pCFmt, pDoc, pTemplate );
    }

    const SwFtnIdxs& rIdxs = pDoc->GetFtnIdxs();
    nArrLen = rIdxs.Count();
    USHORT nEnd = 0, nFtn = 0;
    for( i=0; i < nArrLen; i++ )
    {
        if( rIdxs[i]->GetFtn().IsEndNote() )
            nEnd++;
        else
            nFtn++;
    }
    OutCSS1_SwFtnInfo( *this, pDoc->GetFtnInfo(), pDoc, nFtn, FALSE );
    OutCSS1_SwFtnInfo( *this, pDoc->GetEndNoteInfo(), pDoc, nEnd, TRUE );

    if( !bFirstCSS1Rule )
    {
        DecIndentLevel();
        OutNewLine();
        Strm() << "-->";

        OutNewLine();
        HTMLOutFuncs::Out_AsciiTag( Strm(), sHTML_style, FALSE );
    }
    else
    {
        bFirstCSS1Rule = FALSE;
    }

    nDfltTopMargin = 0;
    nDfltBottomMargin = 0;
}

#ifdef OLD_MS_IE

BOOL SwHTMLWriter::IsDfltLRSpace( const SvxLRSpaceItem& rLRItem ) const
{
    // Einen linken Rand kann es durch eine Liste bereits in der
    // Umgebung geben
    USHORT nLeft = rLRItem.GetTxtLeft() - nLeftMargin;

    // Der Erstzeilen-Einzug kann den Platz fuer eine Numerierung
    // enthalten
    short nIndent = rLRItem.GetTxtFirstLineOfst() - nFirstLineIndent;

    // Wenn Spacer exportiert werden, wird ein psositiver Erstzeilen-Einzug
    // als Spacer exportiert.
    return nDfltLeftMargin == nLeft &&
           nDfltRightMargin == rLRItem.GetRight() &&
           ( (bCfgSpacer && nIndent > 0) ||
              nDfltFirstLineIndent == nIndent );
}

BOOL SwHTMLWriter::IsDfltULSpace( const SvxULSpaceItem& rULItem ) const
{
    return nDfltTopMargin == rULItem.GetUpper() &&
           nDfltBottomMargin == rULItem.GetLower();
}

#endif

//-----------------------------------------------------------------------

// wenn pPseudo gesetzt ist werden Styles-Sheets ausgegeben,
// sonst wird nur nach Token und Class fuer ein Format gesucht
USHORT SwHTMLWriter::GetCSS1Selector( const SwFmt *pFmt, ByteString& rToken,
                                      String& rClass, USHORT& rRefPoolId,
                                      String *pPseudo )
{
    USHORT nDeep = 0;
    rToken.Erase(); rClass.Erase();
    rRefPoolId = 0;
    if( pPseudo )
        pPseudo->Erase();

    BOOL bChrFmt = RES_CHRFMT==pFmt->Which();

    // Nach oben die Formate abklappern, bis man auf eine Standard-
    // oder eine HTML-Tag-Vorlage trifft
    const SwFmt *pPFmt = pFmt;
    while( pPFmt && !pPFmt->IsDefault() )
    {
        BOOL bStop = FALSE;
        USHORT nPoolId = pPFmt->GetPoolFmtId();
        if( USER_FMT & nPoolId )
        {
            // Benutzer-Vorlagen
            const String& rNm = pPFmt->GetName();
            switch( rNm.GetChar(0) )
            {
                        // nicht mehr unterstuetzt:
                        // sHTML_author
                        // sHTML_acronym
                        // sHTML_abbreviation
                        // sHTML_deletedtext
                        // sHTML_insertedtext
                        // sHTML_language
                        // sHTML_person
            case 'B':   if( !bChrFmt && rNm.EqualsAscii(sHTML_blockquote) )
                        {
                            rRefPoolId = RES_POOLCOLL_HTML_BLOCKQUOTE;
                            rToken.Assign( sHTML_blockquote );
                        }
                        break;
            case 'C':   if( bChrFmt )
                        {
                            if( rNm.EqualsAscii(sHTML_citiation) )
                            {
                                rRefPoolId = RES_POOLCHR_HTML_CITIATION;
                                rToken.Assign( sHTML_citiation );
                            }
                            else if( rNm.EqualsAscii(sHTML_code) )
                            {
                                rRefPoolId = RES_POOLCHR_HTML_CODE;
                                rToken.Assign( sHTML_code );
                            }
                        }
                        break;
            case 'D':   if( bChrFmt && rNm.EqualsAscii(sHTML_definstance) )
                        {
                            rRefPoolId = RES_POOLCHR_HTML_DEFINSTANCE;
                            rToken.Assign( sHTML_definstance);
                        }
                        else if( !bChrFmt )
                        {
                            USHORT nDefListLvl = GetDefListLvl( rNm, nPoolId );
                            // Die Vorlagen DD 1/DT 1 werden ausgegeben,
                            // aber keine von ihnen abgeleiteten Vorlagen,
                            // auch nicht DD 2/DT 2 etc.
                            if( nDefListLvl )
                            {
                                if( pPseudo &&
                                    (nDeep || (nDefListLvl & 0x0fff) > 1) )
                                {
                                    bStop = TRUE;
                                }
                                else if( nDefListLvl & HTML_DLCOLL_DD )
                                {
                                    rRefPoolId = RES_POOLCOLL_HTML_DD;
                                    rToken.Assign( sHTML_dd );
                                }
                                else
                                {
                                    rRefPoolId = RES_POOLCOLL_HTML_DT;
                                    rToken.Assign( sHTML_dt );
                                }
                            }
                        }
                        break;
            case 'E':   if( bChrFmt && rNm.EqualsAscii( sHTML_emphasis ) )
                        {
                            rRefPoolId = RES_POOLCHR_HTML_EMPHASIS;
                            rToken.Assign( sHTML_emphasis );
                        }
                        break;
            case 'H':   if( !bChrFmt && rNm.EqualsAscii( sHTML_horzrule ) )
                            // HR nicht ausgeben!
                            bStop = (nDeep==0);
                        break;
            case 'K':   if( bChrFmt && rNm.EqualsAscii( sHTML_keyboard ) )
                        {
                            rRefPoolId = RES_POOLCHR_HTML_KEYBOARD;
                            rToken.Assign( sHTML_keyboard );
                        }
                        break;
            case 'L':   if( !bChrFmt && rNm.EqualsAscii( sHTML_listing ) )
                        {
                            // Listing als PRE exportieren bzw. von
                            // PRE abgeleitete Vorlage exportieren
                            rToken.Assign( sHTML_preformtxt );
                            rRefPoolId = RES_POOLCOLL_HTML_PRE;
                            nDeep = CSS1_FMT_CMPREF;
                        }
                        break;
            case 'P':   if( !bChrFmt && rNm.EqualsAscii( sHTML_preformtxt ) )
                        {
                            rRefPoolId = RES_POOLCOLL_HTML_PRE;
                            rToken.Assign( sHTML_preformtxt );
                        }
                        break;
            case 'S':   if( bChrFmt )
                        {
                            if( rNm.EqualsAscii( sHTML_sample ) )
                            {
                                rRefPoolId = RES_POOLCHR_HTML_SAMPLE;
                                rToken.Assign( sHTML_sample );
                            }
                            else if( rNm.EqualsAscii( sHTML_strong ) )
                            {
                                rRefPoolId = RES_POOLCHR_HTML_STRONG;
                                rToken.Assign( sHTML_strong );
                            }
                        }
                        break;
            case 'T':   if( bChrFmt && rNm.EqualsAscii( sHTML_teletype ) )
                        {
                            rRefPoolId = RES_POOLCHR_HTML_TELETYPE;
                            rToken.Assign( sHTML_teletype );
                        }
                        break;
            case 'V':   if( bChrFmt && rNm.EqualsAscii( sHTML_variable ) )
                        {
                            rRefPoolId = RES_POOLCHR_HTML_VARIABLE;
                            rToken.Assign( sHTML_variable );
                        }
                        break;
            case 'X':   if( !bChrFmt && rNm.EqualsAscii( sHTML_xmp ) )
                        {
                            // XMP als PRE exportieren (aber nicht die
                            // Vorlage als Style)
                            rToken.Assign( sHTML_preformtxt );
                            rRefPoolId = RES_POOLCOLL_HTML_PRE;
                            nDeep = CSS1_FMT_CMPREF;
                        }
                        break;
            }

            // Wenn eine PoolId gesetzt ist, entspricht der Name der
            // Vorlage dem szugehoerigen Token
            ASSERT( rRefPoolId != 0 == rToken.Len() > 0,
                    "Token missing" );
        }
        else
        {
            // Pool-Vorlagen
            switch( nPoolId )
            {
            // Absatz-Vorlagen
            case RES_POOLCOLL_HEADLINE_BASE:
            case RES_POOLCOLL_STANDARD:
                // diese Vorlagen nicht ausgeben
                bStop = (nDeep==0);
                break;
            case RES_POOLCOLL_TEXT:
                rToken.Assign( sHTML_parabreak );
                break;
            case RES_POOLCOLL_HEADLINE1:
                rToken.Assign( sHTML_head1 );
                break;
            case RES_POOLCOLL_HEADLINE2:
                rToken.Assign( sHTML_head2 );
                break;
            case RES_POOLCOLL_HEADLINE3:
                rToken.Assign( sHTML_head3 );
                break;
            case RES_POOLCOLL_HEADLINE4:
                rToken.Assign( sHTML_head4 );
                break;
            case RES_POOLCOLL_HEADLINE5:
                rToken.Assign( sHTML_head5 );
                break;
            case RES_POOLCOLL_HEADLINE6:
                rToken.Assign( sHTML_head6 );
                break;
            case RES_POOLCOLL_SENDADRESS:
                rToken.Assign( sHTML_address );
                break;
            case RES_POOLCOLL_HTML_BLOCKQUOTE:
                rToken.Assign( sHTML_blockquote );
                break;
            case RES_POOLCOLL_HTML_PRE:
                rToken.Assign( sHTML_preformtxt );
                break;

            case RES_POOLCOLL_HTML_DD:
                rToken.Assign( sHTML_dd );
                break;
            case RES_POOLCOLL_HTML_DT:
                rToken.Assign( sHTML_dt );
                break;

            case RES_POOLCOLL_TABLE:
                if( pPseudo )
                {
                    rToken.Assign( sHTML_tabledata );
                    rToken.Append( ' ' );
                    rToken.Assign( sHTML_parabreak );
                }
                else
                    rToken.Assign( sHTML_parabreak );
                break;
            case RES_POOLCOLL_TABLE_HDLN:
                if( pPseudo )
                {
                    rToken.Assign( sHTML_tableheader );
                    rToken.Assign( ' ' );
                    rToken.Assign( sHTML_parabreak );
                }
                else
                    rToken.Assign( sHTML_parabreak );
                break;
            case RES_POOLCOLL_HTML_HR:
                // HR nicht ausgeben!
                bStop = (nDeep==0);
                break;
            case RES_POOLCOLL_FOOTNOTE:
                if( !nDeep )
                {
                    rToken.Assign( sHTML_parabreak );
                    rClass.AssignAscii( sHTML_sdfootnote );
                    rRefPoolId = RES_POOLCOLL_TEXT;
                    nDeep = CSS1_FMT_CMPREF;
                }
                break;
            case RES_POOLCOLL_ENDNOTE:
                if( !nDeep )
                {
                    rToken.Assign( sHTML_parabreak );
                    rClass.AssignAscii( sHTML_sdendnote );
                    rRefPoolId = RES_POOLCOLL_TEXT;
                    nDeep = CSS1_FMT_CMPREF;
                }
                break;

            // Zeichen-Vorlagen
            case RES_POOLCHR_HTML_EMPHASIS:
                rToken.Assign( sHTML_emphasis );
                break;
            case RES_POOLCHR_HTML_CITIATION:
                rToken.Assign( sHTML_citiation );
                break;
            case RES_POOLCHR_HTML_STRONG:
                rToken.Assign( sHTML_strong );
                break;
            case RES_POOLCHR_HTML_CODE:
                rToken.Assign( sHTML_code );
                break;
            case RES_POOLCHR_HTML_SAMPLE:
                rToken.Assign( sHTML_sample );
                break;
            case RES_POOLCHR_HTML_KEYBOARD:
                rToken.Assign( sHTML_keyboard );
                break;
            case RES_POOLCHR_HTML_VARIABLE:
                rToken.Assign( sHTML_variable );
                break;
            case RES_POOLCHR_HTML_DEFINSTANCE:
                rToken.Assign( sHTML_definstance );
                break;
            case RES_POOLCHR_HTML_TELETYPE:
                rToken.Assign( sHTML_teletype );
                break;

            case RES_POOLCHR_INET_NORMAL:
                if( pPseudo )
                {
                    rToken.Assign( sHTML_anchor );
                    pPseudo->AssignAscii( sCSS1_link );
                }
                break;
            case RES_POOLCHR_INET_VISIT:
                if( pPseudo )
                {
                    rToken.Assign( sHTML_anchor );
                    pPseudo->AssignAscii( sCSS1_visited );
                }
                break;
            }

            // Wenn ein Token gesetzt ist, enthaelt nPoolId die dazugehoerige
            // Vorlage
            if( rToken.Len() && !rRefPoolId )
                rRefPoolId = nPoolId;
        }

        if( rToken.Len() || bStop )
        {
            // Anhalten wenn eine HTML-Tag-Vorlage gefunden wurde
            break;
        }
        else
        {
            // sonst weitersuchen
            nDeep++;
            pPFmt = pPFmt->DerivedFrom();
        }
    }

    if( rToken.Len() )
    {
        // Es ist eine HTML-Tag-Vorlage
        if( !nDeep )
            nDeep = CSS1_FMT_ISTAG;
    }
    else
    {
        // Es ist keine HTML-Tag-Vorlage und auch keine davon abgeleitete
        nDeep = 0;
    }
    if( nDeep > 0 && nDeep < CSS1_FMT_SPECIAL )
    {
        // Wenn die Vorlage von einer HTML-Vorlage abgeleitet ist,
        // wird sie als <TOKEN>.<CLASS> exportiert, sonst als .<CLASS>.
        // <CLASS> ergibt sich aus dem Namen der Vorlage durch entfernen
        // aller Zeichen vor und inklusive dem ersten '.'
        rClass = pFmt->GetName();
        xub_StrLen nPos = rClass.Search( '.' );
        if( nPos != STRING_NOTFOUND && rClass.Len() > nPos+1 )
        {
            rClass.Erase( 0, nPos+1 );
        }

        GetAppCharClass().toLower( rClass );
        while( STRING_NOTFOUND != rClass.SearchAndReplace( '.', '-' ) )
            ;
        while( STRING_NOTFOUND != rClass.SearchAndReplace( ' ', '-' ) )
            ;
        while( STRING_NOTFOUND != rClass.SearchAndReplace( '_', '-' ) )
            ;
    }

    return nDeep;
}

static USHORT GetCSS1Selector( const SwFmt *pFmt, String& rSelector,
                               USHORT& rRefPoolId )
{
    ByteString aToken;
    String aClass;
    String aPseudo;

    USHORT nDeep = SwHTMLWriter::GetCSS1Selector( pFmt, aToken, aClass,
                                                  rRefPoolId, &aPseudo );
    if( nDeep )
    {
        if( aToken.Len() )
            rSelector = String( aToken, RTL_TEXTENCODING_ASCII_US );
        else
            rSelector.Erase();

        if( aClass.Len() )
            (rSelector += '.') += aClass;
        if( aPseudo.Len() )
            (rSelector += ':') += aPseudo;
    }

    return nDeep;
}

const SwFmt *SwHTMLWriter::GetTemplateFmt( USHORT nPoolFmtId,
                                           SwDoc *pTemplate )
{
    const SwFmt *pRefFmt = 0;

    if( pTemplate )
    {
        ASSERT( !(USER_FMT & nPoolFmtId),
                "In der Dok-Vorlage gibt es keine Benutzer-Vorlagen" );
        if( POOLGRP_NOCOLLID & nPoolFmtId )
            pRefFmt = pTemplate->GetCharFmtFromPool( nPoolFmtId );
        else
            pRefFmt = pTemplate->GetTxtCollFromPool( nPoolFmtId );
    }

    return pRefFmt;
}

const SwFmt *SwHTMLWriter::GetParentFmt( const SwFmt& rFmt, USHORT nDeep )
{
    ASSERT( nDeep != USHRT_MAX, "GetParent fuer HTML-Vorlage aufgerufen!" );
    const SwFmt *pRefFmt = 0;

    if( nDeep > 0 )
    {
        // hier wird die HTML-Tag-Vorlage, von der die Vorlage abgeleitet
        // ist als Referenz geholt
        pRefFmt = &rFmt;
        for( USHORT i=nDeep; i>0; i-- )
            pRefFmt = pRefFmt->DerivedFrom();

        if( pRefFmt && pRefFmt->IsDefault() )
            pRefFmt = 0;
    }

    return pRefFmt;
}

BOOL lcl_css1atr_equalFontItems( const SfxPoolItem& r1, const SfxPoolItem& r2 )
{
    return  ((const SvxFontItem &)r1).GetFamilyName() ==
                    ((const SvxFontItem &)r2).GetFamilyName() &&
            ((const SvxFontItem &)r1).GetFamily() ==
                    ((const SvxFontItem &)r2).GetFamily() &&
            ((const SvxFontItem &)r1).GetPitch() ==
                    ((const SvxFontItem &)r2).GetPitch();
}

void SwHTMLWriter::SubtractItemSet( SfxItemSet& rItemSet,
                                    const SfxItemSet& rRefItemSet,
                                    BOOL bSetDefaults,
                                    BOOL bClearSame )
{
    ASSERT( bSetDefaults || bClearSame,
            "SwHTMLWriter::SubtractItemSet: Bei diesen Flags passiert nix" );
    SfxItemSet aRefItemSet( *rRefItemSet.GetPool(), rRefItemSet.GetRanges() );
    aRefItemSet.Set( rRefItemSet );

    // und mit dem Attr-Set der Vorlage vergleichen
    SfxWhichIter aIter( rItemSet );
    USHORT nWhich = aIter.FirstWhich();
    while( nWhich )
    {
        const SfxPoolItem *pRefItem, *pItem;
        BOOL bItemSet = ( SFX_ITEM_SET ==
                rItemSet.GetItemState( nWhich, FALSE, &pItem) );
        BOOL bRefItemSet = ( SFX_ITEM_SET ==
                aRefItemSet.GetItemState( nWhich, FALSE, &pRefItem) );
        if( bItemSet )
        {
            if( bClearSame && bRefItemSet &&
                ( *pItem == *pRefItem ||
                  (RES_CHRATR_FONT == nWhich &&
                   lcl_css1atr_equalFontItems( *pItem, *pRefItem )) ) )
            {
                // das Attribut ist mit dem gleichen Wert in beiden
                // Vorlagen vorhanden und muss nicht ausgegeben werden
                rItemSet.ClearItem( nWhich );
            }
        }
        else
        {
            if( bSetDefaults && bRefItemSet )
            {
                // das Attribut ist nur in der Referenz vorhanden. Das
                // Default muss ggf. ausgegeben werden
                rItemSet.Put( rItemSet.GetPool()->GetDefaultItem(nWhich) );
            }
        }

        nWhich = aIter.NextWhich();
    }
}

void SwHTMLWriter::PrepareFontList( const SvxFontItem& rFontItem,
                                    String& rNames,
                                    sal_Unicode cQuote, BOOL bGeneric )
{
    rNames = aEmptyStr;
    const String& rName = rFontItem.GetFamilyName();
    BOOL bContainsKeyword = FALSE;
    if( rName.Len() )
    {
        xub_StrLen nStrPos = 0;
        while( nStrPos != STRING_NOTFOUND )
        {
            String aName = rName.GetToken( 0, ';', nStrPos );
            aName.EraseTrailingChars().EraseLeadingChars();
            if( !aName.Len() )
                continue;

            BOOL bIsKeyword = FALSE;
            switch( aName.GetChar( 0 ) )
            {
            case 'c':
            case 'C':
                bIsKeyword = aName.EqualsIgnoreCaseAscii( sCSS1_PV_cursive );
                break;

            case 'f':
            case 'F':
                bIsKeyword = aName.EqualsIgnoreCaseAscii( sCSS1_PV_fantasy );
                break;

            case 'm':
            case 'M':
                bIsKeyword = aName.EqualsIgnoreCaseAscii( sCSS1_PV_monospace );
                break;

            case 's':
            case 'S':
                bIsKeyword =
                    aName.EqualsIgnoreCaseAscii( sCSS1_PV_serif ) ||
                    aName.EqualsIgnoreCaseAscii( sCSS1_PV_sans_serif );
                break;
            }

            bContainsKeyword |= bIsKeyword;

            if( rNames.Len() )
                rNames.AppendAscii( ", " );
            if( cQuote && !bIsKeyword )
                rNames += cQuote;
            rNames += aName;
            if( cQuote && !bIsKeyword )
                rNames += cQuote;
        }
    }

    if( !bContainsKeyword && bGeneric )
    {
        const sal_Char *pStr = 0;
        switch( rFontItem.GetFamily() )
        {
        case FAMILY_ROMAN:      pStr = sCSS1_PV_serif;      break;
        case FAMILY_SWISS:      pStr = sCSS1_PV_sans_serif; break;
        case FAMILY_SCRIPT:     pStr = sCSS1_PV_cursive;    break;
        case FAMILY_DECORATIVE: pStr = sCSS1_PV_fantasy;    break;
        case FAMILY_MODERN:     pStr = sCSS1_PV_monospace;  break;
        }

        if( pStr )
        {
            if( rNames.Len() )
                rNames.AppendAscii( ", " );
            rNames.AppendAscii( pStr );
        }
    }
}

static Writer& OutCSS1_SwFmt( Writer& rWrt, const SwFmt& rFmt,
                              SwDoc *pDoc, SwDoc *pTemplate )
{
    SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;

    BOOL bCharFmt = FALSE;
    switch( rFmt.Which() )
    {
    case RES_CHRFMT:
        bCharFmt = TRUE;
        break;

    case RES_TXTFMTCOLL:
    case RES_CONDTXTFMTCOLL:
        // diese Vorlagen-Typen koennen exportiert werden
        break;

    default:
        // und diese nicht
        return rWrt;
    }

    // den Selector und die auszugebende Attr-Set-Tiefe ermitteln
    String aSelector;
    USHORT nRefPoolId = 0;
    USHORT nDeep = GetCSS1Selector( &rFmt, aSelector, nRefPoolId );
    if( !nDeep )
        return rWrt;    // von keiner HTML-Vorlage abgeleitet

    USHORT nPoolFmtId = rFmt.GetPoolFmtId();

    // Den auszugebenden Attr-Set bestimmen. Hier muessen 3 Faelle
    // unterschieden werden:
    // - HTML-Tag-Vorlagen (nDeep==USHRT_MAX):
    //   Es werden die Attrs ausgegeben
    //     - die in der Vorlage gesetzt sind, aber nicht im Original aus
    //       der HTML-Vorlage
    //     - die Default-Attrs fuer die Attrs, die im Original aus der
    //       HTML-Vorlage gesetzt sind, aber nicht in der vorliegeden Vorlage.
    // - direkt von HTML-Vorlagen abgeleitete Vorlagen (nDeep==1):
    //   Es weren nur die Attribute des Vorlagen-Item-Set ohne seine
    //   Parents ausgegeben.
    // - indirekt von HTML-Tag-Vorlagen abgeleitete Vorlagen (nDeep>1)
    //   Es werden die Attribute des Vorlagen-Item-Sets inkl. seiner Parents,
    //   aber ohne die Attribute, die in der HTML-Tag-Vorlage gesetzt sind,
    //   ausgegeben.

    // einen Item-Set mit allen Attributen aus der Vorlage anlegen
    // (ausser fuer nDeep==1)
    const SfxItemSet& rFmtItemSet = rFmt.GetAttrSet();
    SfxItemSet aItemSet( *rFmtItemSet.GetPool(), rFmtItemSet.GetRanges() );
    aItemSet.Set( rFmtItemSet, nDeep!=1 );

    BOOL bSetDefaults = TRUE, bClearSame = TRUE;
    const SwFmt *pRefFmt = 0;
    switch( nDeep )
    {
    case CSS1_FMT_ISTAG:
        pRefFmt = SwHTMLWriter::GetTemplateFmt( nRefPoolId, pTemplate );
        break;
    case CSS1_FMT_CMPREF:
        pRefFmt = SwHTMLWriter::GetTemplateFmt( nRefPoolId, pDoc );
        bClearSame = FALSE;
        break;
    default:
        pRefFmt = SwHTMLWriter::GetParentFmt( rFmt, nDeep );
        bSetDefaults = FALSE;
        break;
    }

    if( pRefFmt )
    {
        // Den Item-Set der Referenz-Vorlage (inkl. seiner Parents) vom
        // ItemSet abziehen
        SwHTMLWriter::SubtractItemSet( aItemSet, pRefFmt->GetAttrSet(),
                                       bSetDefaults, bClearSame );
        if( !bCharFmt )
        {
            const SvxULSpaceItem& rULItem = pRefFmt->GetULSpace();
            rHTMLWrt.nDfltTopMargin = rULItem.GetUpper();
            rHTMLWrt.nDfltBottomMargin = rULItem.GetLower();
        }
    }
    else if( CSS1_FMT_ISTAG==nDeep && !bCharFmt )
    {
        // die Default-Abstaende nach oben und unten setzen (fuer den
        // Fall, dass es keine Vorlage als Referenz gibt)
        rHTMLWrt.nDfltTopMargin = 0;
        rHTMLWrt.nDfltBottomMargin = HTML_PARSPACE;
        if( USER_FMT & nPoolFmtId )
        {
            // Benutzer-Vorlagen
            const String& rNm = rFmt.GetName();
            switch( rNm.GetChar(0) )
            {
            case 'D':   if( rNm.EqualsAscii("DD 1") || rNm.EqualsAscii("DT 1") )
                            rHTMLWrt.nDfltBottomMargin = 0;
                        break;
            case 'L':   if(rNm.EqualsAscii(sHTML_listing) )
                            rHTMLWrt.nDfltBottomMargin = 0;
                        break;
            case 'P':   if( rNm.EqualsAscii(sHTML_preformtxt) )
                            rHTMLWrt.nDfltBottomMargin = 0;
                        break;
            case 'X':   if( rNm.EqualsAscii(sHTML_xmp) )
                            rHTMLWrt.nDfltBottomMargin = 0;
                        break;
            }
        }
        else
        {
            // Pool-Vorlagen
            switch( nPoolFmtId )
            {
            case RES_POOLCOLL_HEADLINE1:
            case RES_POOLCOLL_HEADLINE2:
            case RES_POOLCOLL_HEADLINE3:
            case RES_POOLCOLL_HEADLINE4:
            case RES_POOLCOLL_HEADLINE5:
            case RES_POOLCOLL_HEADLINE6:
                rHTMLWrt.nDfltTopMargin = HTML_HEADSPACE;
                break;
            case RES_POOLCOLL_SENDADRESS:
            case RES_POOLCOLL_HTML_DT:
            case RES_POOLCOLL_HTML_DD:
            case RES_POOLCOLL_HTML_PRE:
                rHTMLWrt.nDfltBottomMargin = 0;
                break;
            }
        }
    }

    // wo nicht auszugeben ist ...
    if( !aItemSet.Count() )
        return rWrt;

    // jetzt die Attribute (inkl. Selektor) ausgeben
    {
        SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_RULE|CSS1_OUTMODE_TEMPLATE,
                             TRUE, &aSelector );
        rHTMLWrt.OutCSS1_SfxItemSet( aItemSet, FALSE );

        if( nPoolFmtId==RES_POOLCOLL_TEXT && !rHTMLWrt.bFirstCSS1Property )
            rHTMLWrt.bPoolCollTextModified = TRUE;
    }

    // Drop-Caps ausgeben
    const SfxPoolItem *pItem;
    if( rHTMLWrt.IsHTMLMode(HTMLMODE_DROPCAPS) &&
        SFX_ITEM_SET==aItemSet.GetItemState( RES_PARATR_DROP, FALSE, &pItem ))
    {
        String sOut( aSelector );
        sOut.Append( ':');
        sOut.AppendAscii( sCSS1_first_letter );
        SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_RULE|CSS1_OUTMODE_DROPCAP,
                             TRUE, &sOut );

        const SwFmtDrop *pDrop = (const SwFmtDrop *)pItem;

        OutCSS1_SwFmtDropAttrs( rHTMLWrt, *pDrop );
    }

    return rWrt;
}

static Writer& OutCSS1_SwPageDesc( Writer& rWrt, const SwPageDesc& rPageDesc,
                                   SwDoc *pDoc, SwDoc *pTemplate,
                                   USHORT nRefPoolId, BOOL bExtRef,
                                   BOOL bPseudo )
{
    SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;

    const SwPageDesc* pRefPageDesc = 0;
    if( !bExtRef )
        pRefPageDesc = pDoc->GetPageDescFromPool( nRefPoolId );
    else if( pTemplate )
        pRefPageDesc = pTemplate->GetPageDescFromPool( nRefPoolId );

    String aSelector( '@' );
    aSelector.AppendAscii( sCSS1_page );

    if( bPseudo )
    {
        const sal_Char *pPseudo = 0;
        switch( rPageDesc.GetPoolFmtId() )
        {
        case RES_POOLPAGE_FIRST:    pPseudo = sCSS1_first;  break;
        case RES_POOLPAGE_LEFT:     pPseudo = sCSS1_left;   break;
        case RES_POOLPAGE_RIGHT:    pPseudo = sCSS1_right;  break;
        }
        if( pPseudo )
        {
            aSelector.Append( ':' );
            aSelector.AppendAscii( pPseudo );
        }
    }

    SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_RULE_ON|CSS1_OUTMODE_TEMPLATE,
                         TRUE, &aSelector );

    // Die Groesse: Wenn sie sich nur durch das Landscape-Flag unterscheidet,
    // wird nur Portrait oder Landscape exportiert. Sonst wird die Groesse
    // exportiert.
    BOOL bRefLandscape = pRefPageDesc ? pRefPageDesc->GetLandscape() : FALSE;
    Size aRefSz;
    const Size& rSz = rPageDesc.GetMaster().GetFrmSize().GetSize();
    if( pRefPageDesc )
    {
        aRefSz = pRefPageDesc->GetMaster().GetFrmSize().GetSize();
        if( bRefLandscape != rPageDesc.GetLandscape() )
        {
            long nTmp = aRefSz.Height();
            aRefSz.Height() = aRefSz.Width();
            aRefSz.Width() = nTmp;
        }
    }

    // Boeser uebler Hack: Auf der Seiten-Tabpage gibt es leichte
    // Rundungsfehler bei der Seitengroesse. Unter anderem wegen bug
    // 25535 wird dummerweise auch noch immer Size-Item vom Dialog geputtet,
    // auch wenn man gar nichts geaendert hat. Folge: Sobald man einmal im
    // Seiten-Dialog war und ihn mit OK verlassen hat, bekommt man eine
    // neue Seitengroesse, die dann hier exportiert wuerde. Um das
    // vermeiden erlauben wir hier kleine Abweichungen.
    if( Abs( rSz.Width() - aRefSz.Width() ) <= 2 &&
        Abs( rSz.Height() - aRefSz.Height() ) <= 2 )
    {
        if( bRefLandscape != rPageDesc.GetLandscape() )
        {
            rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_size,
                rPageDesc.GetLandscape() ? sCSS1_PV_landscape
                                         : sCSS1_PV_portrait );
        }
    }
    else
    {
        ByteString sVal;
        AddUnitPropertyValue( rSz.Width(), rHTMLWrt.GetCSS1Unit(), sVal );
        sVal += ' ';
        AddUnitPropertyValue( rSz.Height(), rHTMLWrt.GetCSS1Unit(), sVal );
        rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_size, sVal );
    }

    // Die Abstand-Attribute koennen auf gwohnte Weise exportiert werden
    const SwFrmFmt &rMaster = rPageDesc.GetMaster();
    SfxItemSet aItemSet( *rMaster.GetAttrSet().GetPool(),
                         RES_LR_SPACE, RES_UL_SPACE );
    aItemSet.Set( rMaster.GetAttrSet(), TRUE );

    if( pRefPageDesc )
    {
        SwHTMLWriter::SubtractItemSet( aItemSet,
                                       pRefPageDesc->GetMaster().GetAttrSet(),
                                       TRUE );
    }

    OutCSS1_SvxULSpace_SvxLRSpace( rWrt, aItemSet, FALSE );

    // Wenn fuer einen Pseudo-Selektor keine Property ausgegeben wurde, muessen
    // wir trotzdem etwas ausgeben, damit beim Import die entsprechende
    // Vorlage angelegt wird.
    if( rHTMLWrt.bFirstCSS1Property && bPseudo )
    {
        rHTMLWrt.OutNewLine();
        ByteString sTmp( aSelector, rHTMLWrt.eDestEnc );
        rWrt.Strm() << sTmp.GetBuffer() << " {";
        rHTMLWrt.bFirstCSS1Property = FALSE;
    }

    if( !rHTMLWrt.bFirstCSS1Property )
        rWrt.Strm() << sCSS1_rule_end;

    return rWrt;
}

static Writer& OutCSS1_SwFtnInfo( Writer& rWrt, const SwEndNoteInfo& rInfo,
                                  SwDoc *pDoc, USHORT nNotes, BOOL bEndNote )
{
    SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;

    String aSelector;

    if( nNotes > 0 )
    {
        aSelector.AssignAscii( sHTML_anchor );
        aSelector.Append( '.');
        aSelector.AppendAscii( bEndNote ? sHTML_sdendnote_anc
                                        : sHTML_sdfootnote_anc );
        SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_RULE|CSS1_OUTMODE_TEMPLATE,
                             TRUE, &aSelector );
        rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_font_size,
                                        sHTML_FTN_fontheight );
        rHTMLWrt.Strm() << sCSS1_rule_end;
    }

    const SwCharFmt *pSymCharFmt = rInfo.GetCharFmt( *pDoc );
    if( pSymCharFmt )
    {
        const SfxItemSet& rFmtItemSet = pSymCharFmt->GetAttrSet();
        SfxItemSet aItemSet( *rFmtItemSet.GetPool(), rFmtItemSet.GetRanges() );
        aItemSet.Set( rFmtItemSet, TRUE );

        USHORT nPoolFmtId = pSymCharFmt->GetPoolFmtId();
        // Wenn es Fuss- bzw. Endnoten gibt, dann muessen alles Attribute
        // ausgegeben werden, damit Netscape das Dokument richtig anzeigt.
        // Anderenfalls genuegt es, die Unterschiede zur Fuss-/Endnoten
        // Vorlage rauszuschreiben.
        if( nNotes == 0 && rHTMLWrt.pTemplate )
        {
            SwFmt *pRefFmt = rHTMLWrt.pTemplate->GetCharFmtFromPool(
                        bEndNote ? RES_POOLCHR_ENDNOTE : RES_POOLCHR_FOOTNOTE );
            if( pRefFmt )
                SwHTMLWriter::SubtractItemSet( aItemSet, pRefFmt->GetAttrSet(),
                                               TRUE );
        }
        if( aItemSet.Count() )
        {
            aSelector.AssignAscii( sHTML_anchor );
            aSelector.Append( '.');
            aSelector.AppendAscii( bEndNote ? sHTML_sdendnote_sym
                                        : sHTML_sdfootnote_sym );
            SwCSS1OutMode aMode( rHTMLWrt,
                                 CSS1_OUTMODE_RULE|CSS1_OUTMODE_TEMPLATE,
                                 TRUE, &aSelector );
            rHTMLWrt.OutCSS1_SfxItemSet( aItemSet, FALSE );
        }
    }

    return rWrt;
}

Writer& OutCSS1_BodyTagStyleOpt( Writer& rWrt, const SfxItemSet& rItemSet,
                                 String aEmbBGGrfName )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;

    SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_STYLE_OPT_ON |
                                   CSS1_OUTMODE_ENCODE|CSS1_OUTMODE_BODY );


    // Es werden nur die Attribute der Seiten-Vorlage ausgegeben.
    // Die Attribute der Standard-Absatz-Vorlage werden schon beim
    // Export der Absatz-Vorlagen beruecksichtigt.

    const SfxPoolItem *pItem;
    if( SFX_ITEM_SET == rItemSet.GetItemState( RES_BACKGROUND, FALSE,
                                               &pItem ) )
    {
        OutCSS1_SvxBrush( rWrt, *pItem, CSS1_BACKGROUND_PAGE,
                          &aEmbBGGrfName );
    }

    if( SFX_ITEM_SET == rItemSet.GetItemState( RES_BOX, FALSE,
                                               &pItem ))
    {
        OutCSS1_SvxBox( rWrt, *pItem );
    }

    if( !rHTMLWrt.bFirstCSS1Property )
    {
        // wenn eine Property als Bestandteil einer Style-Option
        // ausgegeben wurde, muss die Optiomn noch beendet werden
        rWrt.Strm() << '\"';
    }

    return rWrt;
}

Writer& OutCSS1_ParaTagStyleOpt( Writer& rWrt, const SfxItemSet& rItemSet )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;

    SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_STYLE_OPT |
                                   CSS1_OUTMODE_ENCODE|CSS1_OUTMODE_PARA );
    rHTMLWrt.OutCSS1_SfxItemSet( rItemSet, FALSE );

    return rWrt;
}

Writer& OutCSS1_HintSpanTag( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;

    SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_SPAN_TAG |
                                   CSS1_OUTMODE_ENCODE|CSS1_OUTMODE_HINT );

    Out( aCSS1AttrFnTab, rHt, rWrt );

    if( !rHTMLWrt.bFirstCSS1Property  && rHTMLWrt.bTagOn )
        rWrt.Strm() << sCSS1_span_tag_end;

    return rWrt;
}

Writer& OutCSS1_HintStyleOpt( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;

    SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_STYLE_OPT_ON |
                                   CSS1_OUTMODE_ENCODE|
                                   CSS1_OUTMODE_HINT );

    Out( aCSS1AttrFnTab, rHt, rWrt );

    if( !rHTMLWrt.bFirstCSS1Property )
        rWrt.Strm() << '\"';

    return rWrt;
}

// Wrapper fuer die Ausgabe von Tabellen-Hintergruenden
Writer& OutCSS1_TableBGStyleOpt( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;

    SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_STYLE_OPT_ON |
                                   CSS1_OUTMODE_ENCODE|
                                   CSS1_OUTMODE_TABLEBOX );
    OutCSS1_SvxBrush( rWrt, rHt, CSS1_BACKGROUND_TABLE, 0 );

    if( !rHTMLWrt.bFirstCSS1Property )
        rWrt.Strm() << '\"';

    return rWrt;
}


Writer& OutCSS1_NumBulListStyleOpt( Writer& rWrt, const SwNumRule& rNumRule,
                                    BYTE nLevel )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;

    SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_STYLE_OPT |
                                   CSS1_OUTMODE_ENCODE|CSS1_OUTMODE_PARA );

    const SwNumFmt& rNumFmt = rNumRule.Get( nLevel );

    long nLSpace = rNumFmt.GetAbsLSpace();
    long nFirstLineOffset = rNumFmt.GetFirstLineOffset();
    long nDfltFirstLineOffset = HTML_NUMBUL_INDENT;
    if( nLevel > 0 )
    {
        const SwNumFmt& rPrevNumFmt = rNumRule.Get( nLevel-1 );
        nLSpace -= rPrevNumFmt.GetAbsLSpace();
        nDfltFirstLineOffset = rPrevNumFmt.GetFirstLineOffset();
    }

    if( rHTMLWrt.IsHTMLMode(HTMLMODE_LSPACE_IN_NUMBUL) &&
        nLSpace != HTML_NUMBUL_MARGINLEFT )
        rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_margin_left, nLSpace );

    if( rHTMLWrt.IsHTMLMode(HTMLMODE_FRSTLINE_IN_NUMBUL) &&
        nFirstLineOffset != nDfltFirstLineOffset )
        rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_text_indent, nFirstLineOffset );

    if( !rHTMLWrt.bFirstCSS1Property )
        rWrt.Strm() << '\"';

    return rWrt;
}

//-----------------------------------------------------------------------

void SwHTMLWriter::OutCSS1_FrmFmtOptions( const SwFrmFmt& rFrmFmt,
                                          ULONG nFrmOpts,
                                          const SdrObject *pSdrObj,
                                          const SfxItemSet *pItemSet )
{
    SwCSS1OutMode aMode( *this, CSS1_OUTMODE_STYLE_OPT_ON |
                                CSS1_OUTMODE_ENCODE|
                                CSS1_OUTMODE_FRAME );

    const SwFmtHoriOrient& rHoriOri = rFrmFmt.GetHoriOrient();
    SvxLRSpaceItem aLRItem( rFrmFmt.GetLRSpace() );
    SvxULSpaceItem aULItem( rFrmFmt.GetULSpace() );
    if( nFrmOpts & HTML_FRMOPT_S_ALIGN )
    {
        const SwFmtAnchor& rAnchor = rFrmFmt.GetAnchor();
        switch( rAnchor.GetAnchorId() )
        {
        case FLY_AT_CNTNT:
        case FLY_AUTO_CNTNT:
            if( FRAME == rHoriOri.GetRelationOrient() ||
                PRTAREA == rHoriOri.GetRelationOrient() )
            {
                if( !(nFrmOpts & HTML_FRMOPT_ALIGN) )
                {
                    // float
                    const sal_Char *pStr = HORI_RIGHT==rHoriOri.GetHoriOrient()
                            ? sCSS1_PV_right
                            : sCSS1_PV_left;
                    OutCSS1_PropertyAscii( sCSS1_P_float, pStr );
                }
                break;
            }

        case FLY_PAGE:
        case FLY_AT_FLY:
            {
                // position
                OutCSS1_PropertyAscii( sCSS1_P_position, sCSS1_PV_absolute );

                // Fuer top/left muessen die Abstaende des Rahmens von
                // der Position abgezogen werden, da sie in CSS1 noch
                // zur Position addiert werden.
                // Das funktioniert auch fuer automatisch ausgerichtete
                // Rahmen, obwohl der Abstand da ja auch im Writer noch
                // addiert wird. Denn auch in diesem Fall enthalten
                // die Orient-Attribute die korrekte Position

                // top
                long nXPos=0, nYPos=0;
                BOOL bOutXPos = FALSE, bOutYPos = FALSE;
                if( RES_DRAWFRMFMT == rFrmFmt.Which() )
                {
                    ASSERT( pSdrObj, "Kein SdrObject uebergeben. Ineffizient" );
                    if( !pSdrObj )
                        pSdrObj = rFrmFmt.FindSdrObject();
                    ASSERT( pSdrObj, "Wo ist das SdrObject" );
                    if( pSdrObj )
                    {
                        Point aPos( pSdrObj->GetRelativePos() );
                        nXPos = aPos.A();
                        nYPos = aPos.B();
                    }
                    bOutXPos = bOutYPos = TRUE;
                }
                else
                {
                    bOutXPos = REL_CHAR != rHoriOri.GetRelationOrient();
                    nXPos = HORI_NONE == rHoriOri.GetHoriOrient()
                                ? rHoriOri.GetPos() : 0;

                    const SwFmtVertOrient& rVertOri = rFrmFmt.GetVertOrient();
                    bOutYPos = REL_CHAR != rVertOri.GetRelationOrient();
                    nYPos = VERT_NONE == rVertOri.GetVertOrient()
                                 ? rVertOri.GetPos() : 0;
                }

                if( bOutYPos )
                {
                    if( IsHTMLMode( HTMLMODE_FLY_MARGINS) )
                    {
                        nYPos -= aULItem.GetUpper();
                        if( nYPos < 0 )
                        {
                            aULItem.SetUpper( (USHORT)(aULItem.GetUpper() + nYPos) );
                            nYPos = 0;
                        }
                    }

                    OutCSS1_UnitProperty( sCSS1_P_top, nYPos );
                }

                if( bOutXPos )
                {
                    // left
                    if( IsHTMLMode( HTMLMODE_FLY_MARGINS) )
                    {
                        nXPos -= aLRItem.GetLeft();
                        if( nXPos < 0 )
                        {
                            aLRItem.SetLeft( (USHORT)(aLRItem.GetLeft() + nXPos) );
                            nXPos = 0;
                        }
                    }

                    OutCSS1_UnitProperty( sCSS1_P_left, nXPos );
                }
            }
            break;
        }
    }

    // width/height
    if( nFrmOpts & HTML_FRMOPT_S_SIZE )
    {
        if( RES_DRAWFRMFMT == rFrmFmt.Which() )
        {
            ASSERT( pSdrObj, "Kein SdrObject uebergeben. Ineffizient" );
            if( !pSdrObj )
                pSdrObj = rFrmFmt.FindSdrObject();
            ASSERT( pSdrObj, "Wo ist das SdrObject" );
            if( pSdrObj )
            {
                Size aTwipSz( pSdrObj->GetLogicRect().GetSize() );
                if( nFrmOpts & HTML_FRMOPT_S_WIDTH )
                {
                    if( nFrmOpts & HTML_FRMOPT_S_PIXSIZE )
                        OutCSS1_PixelProperty( sCSS1_P_width, aTwipSz.Width(),
                                               FALSE );
                    else
                        OutCSS1_UnitProperty( sCSS1_P_width, aTwipSz.Width() );
                }
                if( nFrmOpts & HTML_FRMOPT_S_HEIGHT )
                {
                    if( nFrmOpts & HTML_FRMOPT_S_PIXSIZE )
                        OutCSS1_PixelProperty( sCSS1_P_height, aTwipSz.Height(),
                                               TRUE );
                    else
                        OutCSS1_UnitProperty( sCSS1_P_height, aTwipSz.Height() );
                }
            }
        }
        else
        {
            ASSERT( HTML_FRMOPT_ABSSIZE & nFrmOpts,
                    "Absolute Groesse wird exportiert" );
            ASSERT( HTML_FRMOPT_ANYSIZE & nFrmOpts,
                    "Jede Groesse wird exportiert" );
            USHORT nMode = 0;
            if( nFrmOpts & HTML_FRMOPT_S_WIDTH )
                nMode |= CSS1_FRMSIZE_WIDTH;
            if( nFrmOpts & HTML_FRMOPT_S_HEIGHT )
                nMode |= (CSS1_FRMSIZE_MINHEIGHT|CSS1_FRMSIZE_FIXHEIGHT);
            if( nFrmOpts & HTML_FRMOPT_S_PIXSIZE )
                nMode |= CSS1_FRMSIZE_PIXEL;

            OutCSS1_SwFmtFrmSize( *this, rFrmFmt.GetFrmSize(), nMode );
        }
    }

    const SfxItemSet& rItemSet = rFrmFmt.GetAttrSet();
    // margin-*
    if( (nFrmOpts & HTML_FRMOPT_S_SPACE) &&
        IsHTMLMode( HTMLMODE_FLY_MARGINS) )
    {
        const SvxLRSpaceItem *pLRItem = 0;
        const SvxULSpaceItem *pULItem = 0;
        if( SFX_ITEM_SET == rItemSet.GetItemState( RES_LR_SPACE, TRUE ) )
            pLRItem = &aLRItem;
        if( SFX_ITEM_SET == rItemSet.GetItemState( RES_UL_SPACE, TRUE ) )
            pULItem = &aULItem;
        if( pLRItem || pULItem )
            OutCSS1_SvxULSpace_SvxLRSpace( *this, pULItem, pLRItem );
    }

    // border
    if( nFrmOpts & HTML_FRMOPT_S_BORDER )
    {
        const SfxPoolItem* pItem;
        if( nFrmOpts & HTML_FRMOPT_S_NOBORDER )
            OutCSS1_SvxBox( *this, rFrmFmt.GetBox() );
        else if( SFX_ITEM_SET==rItemSet.GetItemState( RES_BOX, TRUE, &pItem ) )
            OutCSS1_SvxBox( *this, *pItem );
    }

    // background (wenn, dann muss auch eine Farbe ausgegeben werden)
    if( nFrmOpts & HTML_FRMOPT_S_BACKGROUND )
        OutCSS1_FrmFmtBackground( rFrmFmt );

    if( pItemSet )
        OutCSS1_SfxItemSet( *pItemSet, FALSE );

    if( !bFirstCSS1Property )
        Strm() << '\"';
}

void SwHTMLWriter::OutCSS1_TableFrmFmtOptions( const SwFrmFmt& rFrmFmt )
{
    SwCSS1OutMode aMode( *this, CSS1_OUTMODE_STYLE_OPT_ON |
                                CSS1_OUTMODE_ENCODE|
                                CSS1_OUTMODE_TABLE );

    const SfxPoolItem *pItem;
    const SfxItemSet& rItemSet = rFrmFmt.GetAttrSet();
    if( SFX_ITEM_SET==rItemSet.GetItemState( RES_BACKGROUND, FALSE, &pItem ) )
        OutCSS1_SvxBrush( *this, *pItem, CSS1_BACKGROUND_TABLE, 0 );

    if( IsHTMLMode( HTMLMODE_PRINT_EXT ) )
        OutCSS1_SvxFmtBreak_SwFmtPDesc_SvxFmtKeep( *this, rItemSet, FALSE );

    if( SFX_ITEM_SET==rItemSet.GetItemState( RES_LAYOUT_SPLIT, FALSE, &pItem ) )
        OutCSS1_SwFmtLayoutSplit( *this, *pItem );

    if( !bFirstCSS1Property )
        Strm() << '\"';
}

void SwHTMLWriter::OutCSS1_SectionFmtOptions( const SwFrmFmt& rFrmFmt )
{
    SwCSS1OutMode aMode( *this, CSS1_OUTMODE_STYLE_OPT_ON |
                                CSS1_OUTMODE_ENCODE|
                                CSS1_OUTMODE_SECTION );

    const SfxPoolItem *pItem;
    const SfxItemSet& rItemSet = rFrmFmt.GetAttrSet();
    if( SFX_ITEM_SET==rItemSet.GetItemState( RES_BACKGROUND, FALSE, &pItem ) )
        OutCSS1_SvxBrush( *this, *pItem, CSS1_BACKGROUND_SECTION, 0 );

    if( !bFirstCSS1Property )
        Strm() << '\"';
}

static BOOL OutCSS1_FrmFmtBrush( SwHTMLWriter& rWrt,
                                 const SvxBrushItem& rBrushItem )
{
    BOOL bWritten = FALSE;
    if( rBrushItem.GetColor().GetTransparency() ||
        0 != rBrushItem.GetGraphicLink() ||
        0 != rBrushItem.GetGraphicPos() )
    {
        OutCSS1_SvxBrush( rWrt, rBrushItem, CSS1_BACKGROUND_FLY, 0 );
        bWritten = TRUE;
    }
    return bWritten;
}

void SwHTMLWriter::OutCSS1_FrmFmtBackground( const SwFrmFmt& rFrmFmt )
{
    // Wenn der Rahmen selbst einen Hintergrund hat, wird der ausgegeben.
    if( OutCSS1_FrmFmtBrush( *this, rFrmFmt.GetBackground() ) )
        return;

    // Wenn der Rahmen nicht seitengebunden ist, wird sonst muss der
    // Hintergrund vom Anker betrachtet
    const SwFmtAnchor& rAnchor = rFrmFmt.GetAnchor();
    RndStdIds eAnchorId = rAnchor.GetAnchorId();
    const SwPosition *pAnchorPos = rAnchor.GetCntntAnchor();
    if( FLY_PAGE != eAnchorId && pAnchorPos )
    {
        const SwNode& rNode = pAnchorPos->nNode.GetNode();
        if( rNode.IsCntntNode() )
        {
            // Wenn der Rahmen in einem Content-Node verankert ist,
            // wird der Hintergrund von Content-Node ausgegeben, wenn
            // der einen hat.
            if( OutCSS1_FrmFmtBrush( *this,
                    rNode.GetCntntNode()->GetSwAttrSet().GetBackground()) )
                return;

            // Sonst koennen wir evtl. auch in einer Tabelle stehen
            const SwTableNode *pTableNd = rNode.FindTableNode();
            if( pTableNd )
            {
                const SwStartNode *pBoxSttNd = rNode.FindTableBoxStartNode();
                const SwTableBox *pBox =
                    pTableNd->GetTable().GetTblBox( pBoxSttNd->GetIndex() );

                // Wenn die Box einen Hintergrund hat, nehmen wir den.
                if( OutCSS1_FrmFmtBrush( *this,
                        pBox->GetFrmFmt()->GetBackground() ) )
                    return;

                // Sonst betrachten wir den der Lines
                const SwTableLine *pLine = pBox->GetUpper();
                while( pLine )
                {
                    if( OutCSS1_FrmFmtBrush( *this,
                            pLine->GetFrmFmt()->GetBackground() ) )
                        return;
                    pBox = pLine->GetUpper();
                    pLine = pBox ? pBox->GetUpper() : 0;
                }

                // Wenn da auch nichts war den der Tabelle.
                if( OutCSS1_FrmFmtBrush( *this,
                        pTableNd->GetTable().GetFrmFmt()->GetBackground() ) )
                    return;
            }

        }

        // Wenn der Anker wieder in einem Fly-Frame steht, dann
        // wird der Hintergrund des Fly-Frames ausgegeben.
        const SwFrmFmt *pFrmFmt = rNode.GetFlyFmt();
        if( pFrmFmt )
        {
            OutCSS1_FrmFmtBackground( *pFrmFmt );
            return;
        }
    }

    // Schliesslich bleibt noch der Hintergrund der Seite uebrig und als
    // letzte Rettung das Item der Config.
    ASSERT( pCurrPageDesc, "Keine Seiten-Vorlage gemerkt" );
    if( !OutCSS1_FrmFmtBrush( *this,
                              pCurrPageDesc->GetMaster().GetBackground() ) )
    {
        Color aColor( COL_WHITE );

        // Die Hintergrund-Farbe wird normalerweise nur in Browse-Mode
        // benutzt. Wir benutzen si bei einem HTML-Dokument immer und
        // bei einem Text-Dokument nur, wenn es im Browse-Mode angezeigt
        // wird.
        if( pDoc->IsHTMLMode() || pDoc->IsBrowseMode() )
        {
            ViewShell *pVSh = 0;
            pDoc->GetEditShell( &pVSh );
            if ( pVSh &&
                 COL_TRANSPARENT != pVSh->GetViewOptions()->GetRetoucheColor().GetColor())
                aColor = pVSh->GetViewOptions()->GetRetoucheColor().GetColor();
        }

        ByteString sOut;
        GetCSS1Color( aColor, sOut );
        OutCSS1_PropertyAscii( sCSS1_P_background, sOut );
    }
}

//-----------------------------------------------------------------------

static Writer& OutCSS1_SvxUnderl_SvxCrOut_SvxBlink( Writer& rWrt,
                    const SvxUnderlineItem *pUItem,
                    const SvxCrossedOutItem *pCOItem,
                    const SvxBlinkItem *pBItem )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;

    const sal_Char *pUStr = 0;
    if( pUItem )
    {
        switch( pUItem->GetUnderline() )
        {
        case UNDERLINE_NONE:
            pUStr = sCSS1_PV_none;
            break;
        case UNDERLINE_DONTKNOW:
            break;
        default:
            if( !rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
            {
                // das geht auch in HTML und muss nicht als STYLE-Option
                // und darf nicht als Hint geschrieben werden
                ASSERT( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT),
                        "Underline als Hint schreiben?" );
                pUStr = sCSS1_PV_underline;
            }
            break;
        }
    }

    const sal_Char *pCOStr = 0;
    if( pCOItem )
    {
        switch( pCOItem->GetStrikeout() )
        {
        case STRIKEOUT_DONTKNOW:
            break;
        case STRIKEOUT_NONE:
            if( !pUStr )
                pUStr = sCSS1_PV_none;
            break;
        default:
            if( !rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
            {
                // das geht auch in HTML und muss nicht als STYLE-Option
                // und darf nicht als Hint geschrieben werden
                ASSERT( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT),
                        "CrossedOut als Hint schreiben?" );
                pCOStr = sCSS1_PV_line_through;
                if( pUStr && sCSS1_PV_none == pUStr )
                    pUStr = 0;
            }
            break;
        }
    }

    const sal_Char *pBStr = 0;
    if( pBItem && rHTMLWrt.IsHTMLMode(HTMLMODE_BLINK) )
    {
        if( !pBItem->GetValue() )
        {
            if( !pUStr && !pCOStr )
                pBStr = sCSS1_PV_none;
        }
        else if( !rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
        {
            // das geht auch in HTML und muss nicht als STYLE-Option
            // und darf nicht als Hint geschrieben werden
            ASSERT( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT),
                    "Blink als Hint schreiben?" );
            pBStr = sCSS1_PV_blink;
            if( pUStr && sCSS1_PV_none == pUStr )
                pUStr = 0;
            if( pCOStr && sCSS1_PV_none == pCOStr )
                pCOStr = 0;
        }
    }

    ByteString sOut;
    if( pUStr )
        sOut.Append( pUStr );

    if( pCOStr )
    {
        if( sOut.Len() )
            sOut += ' ';

        sOut.Append( pCOStr );
    }

    if( pBStr )
    {
        if( sOut.Len() )
            sOut += ' ';

        sOut.Append( pBStr );
    }

    if( sOut.Len() )
        rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_text_decoration, sOut );

    return rWrt;
}


static Writer& OutCSS1_SvxCaseMap( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;

    if( !rHTMLWrt.IsHTMLMode(HTMLMODE_SMALL_CAPS) )
        return rWrt;

    const sal_Char *pStr = 0;
    switch( ((const SvxCaseMapItem&)rHt).GetCaseMap() )
    {
    case SVX_CASEMAP_NOT_MAPPED:    pStr = sCSS1_PV_normal;     break;
    case SVX_CASEMAP_KAPITAELCHEN:  pStr = sCSS1_PV_small_caps; break;
    }

    if( pStr )
        rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_font_variant, pStr );

    return rWrt;
}


static Writer& OutCSS1_SvxColor( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;

    // Farben muessen nicht in der Style-Option ausgegeben werden.
    if( rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) &&
        !rHTMLWrt.bCfgPreferStyles )
        return rWrt;
    ASSERT( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT),
            "Farbe wirklich als Hint ausgeben?" );

    const Color& rColor = ((const SvxColorItem&)rHt).GetValue();

    ByteString sOut;
    GetCSS1Color( rColor, sOut );

    rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_color, sOut );

    return rWrt;
}


static Writer& OutCSS1_SvxCrossedOut( Writer& rWrt, const SfxPoolItem& rHt )
{
    // Mit dieser Methode werden nur Hints ausgegeben!
    // Sonst wird OutCSS1_SvxUnderl_SvxCrOut_SvxBlink() direkt aufgerufen.

    if( ((SwHTMLWriter&)rWrt).IsCSS1Source(CSS1_OUTMODE_HINT) )
        OutCSS1_SvxUnderl_SvxCrOut_SvxBlink( rWrt, 0,
                (const SvxCrossedOutItem *)&rHt, 0 );

    return rWrt;
}

static Writer& OutCSS1_SvxFont( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;

    // Fonts muessen nicht in der Style-Option ausgegeben werden.
    if( rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
        return rWrt;

    ASSERT( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT),
            "Font wirklich als Hint ausgeben?" );

    String sOut;
    // MS IE3b1 hat mit einfachen Haekchen Probleme
    USHORT nMode = rHTMLWrt.nCSS1OutMode & CSS1_OUTMODE_ANY_ON;
    sal_Unicode cQuote = nMode == CSS1_OUTMODE_RULE_ON ? '\"' : '\'';
    SwHTMLWriter::PrepareFontList( ((const SvxFontItem&)rHt), sOut, cQuote,
                                   TRUE );

    rHTMLWrt.OutCSS1_Property( sCSS1_P_font_family, sOut );

    return rWrt;
}

static Writer& OutCSS1_SvxFontHeight( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;

    // Font-Hoehen muessen nicht in der Style-Option ausgegeben werden.
    // Fuer Drop-Caps wird ein andewres font-size ausgegeben
    if( rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) ||
        rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_DROPCAP ) )
        return rWrt;

    UINT32 nHeight = ((const SvxFontHeightItem&)rHt).GetHeight();
    if( rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT) )
    {
        // einen Hint nur dann ausgeben wenn es auch was bringt
        USHORT nSize = rHTMLWrt.GetHTMLFontSize( nHeight );
        if( rHTMLWrt.aFontHeights[nSize-1] == nHeight )
            return rWrt;
    }
    ByteString sHeight( ByteString::CreateFromInt32(
                                            (sal_Int32)(nHeight/20) ) );
    sHeight.Append( sCSS1_UNIT_pt );

    rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_font_size, sHeight );

    return rWrt;
}

static Writer& OutCSS1_SvxPosture( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;

    const sal_Char *pStr = 0;
    switch( ((const SvxPostureItem&)rHt).GetPosture() )
    {
    case ITALIC_NONE:       pStr = sCSS1_PV_normal;     break;
    case ITALIC_OBLIQUE:    pStr = sCSS1_PV_oblique;    break;
    case ITALIC_NORMAL:
        if( !rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
        {
            // das geht auch in HTML und muss nicht als STYLE-Option
            // und darf nicht als Hint geschrieben werden
            ASSERT( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT),
                    "Italic als Hint schreiben?" );
            pStr = sCSS1_PV_italic;
        }
        break;
    }

    if( pStr )
        rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_font_style, pStr );

    return rWrt;
}

static Writer& OutCSS1_SvxKerning( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;

    // Kerning-Item nur ausgeben, wenn volle Style-Untersttzung da ist
    if( !rHTMLWrt.IsHTMLMode(HTMLMODE_FULL_STYLES) )
        return rWrt;

    INT16 nValue = ((const SvxKerningItem&)rHt).GetValue();
    if( nValue )
    {
        ByteString sOut;
        if( nValue < 0 )
        {
            sOut = '-';
            nValue = -nValue;
        }

        // Breite als n.n pt
        nValue = (nValue + 1) / 2;  // 1/10pt
        sOut.Append( ByteString::CreateFromInt32( (sal_Int32)(nValue  / 10) ) );
        sOut.Append( '.' );
        sOut.Append( ByteString::CreateFromInt32( (sal_Int32)(nValue % 10) ) );
        sOut.Append( sCSS1_UNIT_pt );

        rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_letter_spacing, sOut );
    }
    else
    {
        rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_letter_spacing,
                                        sCSS1_PV_normal );
    }

    return rWrt;
}

static Writer& OutCSS1_SvxUnderline( Writer& rWrt, const SfxPoolItem& rHt )
{
    // Mit dieser Methode werden nur Hints ausgegeben!
    // Sonst wird OutCSS1_SvxUnderl_SvxCrOut_SvxBlink() direkt aufgerufen.

    if( ((SwHTMLWriter&)rWrt).IsCSS1Source(CSS1_OUTMODE_HINT) )
        OutCSS1_SvxUnderl_SvxCrOut_SvxBlink( rWrt,
                (const SvxUnderlineItem *)&rHt, 0, 0 );

    return rWrt;
}


static Writer& OutCSS1_SvxFontWeight( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;

    const sal_Char *pStr = 0;
    switch( ((const SvxWeightItem&)rHt).GetWeight() )
    {
    case WEIGHT_ULTRALIGHT: pStr = sCSS1_PV_extra_light;    break;
    case WEIGHT_LIGHT:      pStr = sCSS1_PV_light;          break;
    case WEIGHT_SEMILIGHT:  pStr = sCSS1_PV_demi_light;     break;
    case WEIGHT_NORMAL:     pStr = sCSS1_PV_medium;         break;
    case WEIGHT_SEMIBOLD:   pStr = sCSS1_PV_demi_bold;      break;
    case WEIGHT_BOLD:
        if( !rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
        {
            // das geht auch in HTML und muss nicht als STYLE-Option
            // und darf nicht als Hint geschrieben werden
            ASSERT( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT),
                    "Fett als Hint schreiben?" );
            pStr = sCSS1_PV_bold;
        }
        break;
    case WEIGHT_ULTRABOLD:  pStr = sCSS1_PV_extra_bold;     break;
    }

    if( pStr )
        rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_font_weight, pStr );

    return rWrt;
}

static Writer& OutCSS1_SvxBlink( Writer& rWrt, const SfxPoolItem& rHt )
{
    // Mit dieser Methode werden nur Hints ausgegeben!
    // Sonst wird OutCSS1_SvxUnderl_SvxCrOut_SvxBlink() direkt aufgerufen.

    if( ((SwHTMLWriter&)rWrt).IsCSS1Source(CSS1_OUTMODE_HINT) )
        OutCSS1_SvxUnderl_SvxCrOut_SvxBlink( rWrt,
                0, 0, (const SvxBlinkItem *)&rHt );

    return rWrt;
}

static Writer& OutCSS1_SvxLineSpacing( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;

    // #60393#: Netscape4 hat massive Probleme mit den Zellenhoehen
    // wenn der Zeilenabstand innerhalb einer Tabelle geaendert wird
    // und die Breite der Tabelle nicht automatisch berechnet wird
    // (also wenn eine WIDTH-Option vorhanden ist).
    if( rHTMLWrt.bOutTable && rHTMLWrt.bCfgNetscape4 )
        return rWrt;

    const SvxLineSpacingItem& rLSItem = (const SvxLineSpacingItem&)rHt;

    USHORT nHeight = 0;
    USHORT nPrcHeight = 0;
    SvxLineSpace eLineSpace = rLSItem.GetLineSpaceRule();
    switch( rLSItem.GetInterLineSpaceRule() )
    {
    case SVX_INTER_LINE_SPACE_OFF:
    case SVX_INTER_LINE_SPACE_FIX:
        {
            switch( eLineSpace )
            {
            case SVX_LINE_SPACE_MIN:
            case SVX_LINE_SPACE_FIX:
                nHeight = rLSItem.GetLineHeight();
                break;
            case SVX_LINE_SPACE_AUTO:
                nPrcHeight = 100;
                break;
            }
        }
        break;
    case SVX_INTER_LINE_SPACE_PROP:
        nPrcHeight = rLSItem.GetPropLineSpace();
        break;
    }

    if( nHeight )
        rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_line_height, (long)nHeight );
    else if( nPrcHeight )
    {
        ByteString sHeight(
                ByteString::CreateFromInt32( (sal_Int32)nPrcHeight ) );
        sHeight += '%';
        rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_line_height, sHeight );
    }

    return rWrt;

}

static Writer& OutCSS1_SvxAdjust( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;

    // Alignment in Style-Option nur ausgeben, wenn das Tag kein
    // ALIGN=xxx zulaesst
    if( rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) &&
        !rHTMLWrt.bNoAlign)
        return rWrt;

    const sal_Char* pStr = 0;
    switch( ((const SvxAdjustItem&)rHt).GetAdjust() )
    {
    case SVX_ADJUST_LEFT:   pStr = sCSS1_PV_left;       break;
    case SVX_ADJUST_RIGHT:  pStr = sCSS1_PV_right;      break;
    case SVX_ADJUST_BLOCK:  pStr = sCSS1_PV_justify;    break;
    case SVX_ADJUST_CENTER: pStr = sCSS1_PV_center;     break;
    }

    if( pStr )
        rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_text_align, pStr );

    return rWrt;
}

static Writer& OutCSS1_SvxFmtSplit( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;

    const sal_Char *pStr = ((const SvxFmtSplitItem&)rHt).GetValue()
                            ? sCSS1_PV_auto
                            : sCSS1_PV_avoid;
    rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_page_break_inside, pStr );

    return rWrt;
}

static Writer& OutCSS1_SwFmtLayoutSplit( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;

    const sal_Char *pStr = ((const SwFmtLayoutSplit&)rHt).GetValue()
                            ? sCSS1_PV_auto
                            : sCSS1_PV_avoid;
    rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_page_break_inside, pStr );

    return rWrt;
}

static Writer& OutCSS1_SvxWidows( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;

    ByteString aStr(
        ByteString::CreateFromInt32( ((const SvxWidowsItem&)rHt).GetValue() ) );
    rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_widows, aStr );

    return rWrt;
}

static Writer& OutCSS1_SvxOrphans( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;

    ByteString aStr(
       ByteString::CreateFromInt32( ((const SvxOrphansItem&)rHt).GetValue() ) );
    rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_orphans, aStr );

    return rWrt;
}

static void OutCSS1_SwFmtDropAttrs( SwHTMLWriter& rHWrt,
                                    const SwFmtDrop& rDrop )
{
    // Text fliesst rechts drumrum
    rHWrt.OutCSS1_PropertyAscii( sCSS1_P_float, sCSS1_PV_left );

    // Anzahl der Zeilen -> %-Angabe fuer Font-Hoehe!
    ByteString sOut( ByteString::CreateFromInt32( rDrop.GetLines()*100 ) );
    sOut += '%';
    rHWrt.OutCSS1_PropertyAscii( sCSS1_P_font_size, sOut );

    // Abstand zum Text = rechter Rand
    USHORT nDistance = rDrop.GetDistance();
    if( nDistance > 0 )
        rHWrt.OutCSS1_UnitProperty( sCSS1_P_margin_right, nDistance );

    const SwCharFmt *pDCCharFmt = rDrop.GetCharFmt();
    if( pDCCharFmt )
        rHWrt.OutCSS1_SfxItemSet( pDCCharFmt->GetAttrSet() );
}

static Writer& OutCSS1_SwFmtDrop( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;

    // nie als Option eines Absatzes ausgeben, sondern nur als Hints
    if( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT) )
        return rWrt;

    if( rHTMLWrt.bTagOn )
    {
        SwCSS1OutMode aMode( rHTMLWrt,
                             CSS1_OUTMODE_SPAN_TAG1_ON|CSS1_OUTMODE_ENCODE|
                             CSS1_OUTMODE_DROPCAP );

        OutCSS1_SwFmtDropAttrs( rHTMLWrt, (const SwFmtDrop&)rHt );
        // Ein "> wird schon vom aufrufenden OutCSS1_HintAsSpanTag geschrieben.
    }
    else
    {
        HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_span, FALSE );
    }

    return rWrt;
}

static Writer& OutCSS1_SwFmtFrmSize( Writer& rWrt, const SfxPoolItem& rHt,
                                     USHORT nMode )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;

    ByteString sOut;
    const SwFmtFrmSize& rFSItem = (const SwFmtFrmSize&)rHt;

    if( nMode & CSS1_FRMSIZE_WIDTH )
    {
        BYTE nPrcWidth = rFSItem.GetWidthPercent();
        if( nPrcWidth )
        {
            (sOut = ByteString::CreateFromInt32( nPrcWidth) ) += '%';
            rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_width, sOut );
        }
        else if( nMode & CSS1_FRMSIZE_PIXEL )
        {
            rHTMLWrt.OutCSS1_PixelProperty( sCSS1_P_width,
                                            rFSItem.GetSize().Width(), FALSE );
        }
        else
        {
            rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_width,
                                           rFSItem.GetSize().Width() );
        }
    }

    if( nMode & CSS1_FRMSIZE_ANYHEIGHT )
    {
        BOOL bOutHeight = FALSE;
        switch( rFSItem.GetSizeType() )
        {
        case ATT_FIX_SIZE:
            bOutHeight = (nMode & CSS1_FRMSIZE_FIXHEIGHT) != 0;
            break;
        case ATT_MIN_SIZE:
            bOutHeight = (nMode & CSS1_FRMSIZE_MINHEIGHT) != 0;
            break;
        case ATT_VAR_SIZE:
            bOutHeight = (nMode & CSS1_FRMSIZE_VARHEIGHT) != 0;
            break;
        default:
            ASSERT( bOutHeight, "Hoehe wird nicht exportiert" );
            break;
        }

        if( bOutHeight )
        {
            BYTE nPrcHeight = rFSItem.GetHeightPercent();
            if( nPrcHeight )
            {
                (sOut = ByteString::CreateFromInt32( nPrcHeight ) ) += '%';
                rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_height, sOut );
            }
            else if( nMode & CSS1_FRMSIZE_PIXEL )
            {
                rHTMLWrt.OutCSS1_PixelProperty( sCSS1_P_height,
                                                rFSItem.GetSize().Width(),
                                                TRUE );
            }
            else
            {
                rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_height,
                                               rFSItem.GetSize().Height() );
            }
        }
    }

    return rWrt;
}

static Writer& OutCSS1_SvxLRSpace( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;

    const SvxLRSpaceItem& rLRItem = (const SvxLRSpaceItem&)rHt;

    // Der Export der harten Attributierung ist unnoetig, wenn die
    // neuen Werte denen der aktuellen Vorlage entsprechen

    // Einen linken Rand kann es durch eine Liste bereits in der
    // Umgebung geben
    long nLeftMargin = (long)rLRItem.GetTxtLeft() - rHTMLWrt.nLeftMargin;
    if( rHTMLWrt.nDfltLeftMargin != nLeftMargin )
    {
        rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_margin_left, nLeftMargin );
    }

    if( rHTMLWrt.nDfltRightMargin != rLRItem.GetRight() )
    {
        rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_margin_right,
                                 (long)rLRItem.GetRight() );
    }

    // Der Erstzeilen-Einzug kann den Platz fuer eine Numerierung
    // enthalten
    long nFirstLineIndent = (long)rLRItem.GetTxtFirstLineOfst() -
        rHTMLWrt.nFirstLineIndent;
    if( rHTMLWrt.nDfltFirstLineIndent != nFirstLineIndent )
    {
        rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_text_indent,
                                     nFirstLineIndent );
    }

    return rWrt;
}

static Writer& OutCSS1_SvxULSpace( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;

    const SvxULSpaceItem& rULItem = (const SvxULSpaceItem&)rHt;

    if( rHTMLWrt.nDfltTopMargin != rULItem.GetUpper() )
    {
        rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_margin_top,
                                     (long)rULItem.GetUpper() );
    }

    if( rHTMLWrt.nDfltBottomMargin != rULItem.GetLower() )
    {
        rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_margin_bottom,
                                     (long)rULItem.GetLower() );
    }

    return rWrt;
}

static Writer& OutCSS1_SvxULSpace_SvxLRSpace( Writer& rWrt,
                                        const SvxULSpaceItem *pULItem,
                                        const SvxLRSpaceItem *pLRItem )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;

    if( pLRItem && pULItem &&
        pLRItem->GetLeft() == pLRItem->GetRight() &&
        pLRItem->GetLeft() == pULItem->GetUpper() &&
        pLRItem->GetLeft() == pULItem->GetLower() &&
        pLRItem->GetLeft() != rHTMLWrt.nDfltLeftMargin &&
        pLRItem->GetRight() != rHTMLWrt.nDfltRightMargin &&
        pULItem->GetUpper() != rHTMLWrt.nDfltTopMargin &&
        pULItem->GetLower() != rHTMLWrt.nDfltBottomMargin )
    {
        rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_margin, (long)pLRItem->GetLeft() );
    }
    else
    {
        if( pLRItem )
            OutCSS1_SvxLRSpace( rWrt, *pLRItem );
        if( pULItem )
            OutCSS1_SvxULSpace( rWrt, *pULItem );
    }

    return rWrt;
}

static Writer& OutCSS1_SvxULSpace_SvxLRSpace( Writer& rWrt,
                                        const SfxItemSet& rItemSet,
                                        BOOL bDeep )
{
    const SvxULSpaceItem *pULSpace = 0;
    const SvxLRSpaceItem *pLRSpace = 0;
    const SfxPoolItem *pItem;
    if( SFX_ITEM_SET == rItemSet.GetItemState( RES_LR_SPACE, bDeep, &pItem ) )
        pLRSpace = (const SvxLRSpaceItem *)pItem;

    if( SFX_ITEM_SET == rItemSet.GetItemState( RES_UL_SPACE, bDeep, &pItem ) )
        pULSpace = (const SvxULSpaceItem *)pItem;

    if( pLRSpace || pULSpace )
        OutCSS1_SvxULSpace_SvxLRSpace( rWrt, pULSpace, pLRSpace );

    return rWrt;
}

static Writer& OutCSS1_SvxFmtBreak_SwFmtPDesc_SvxFmtKeep( Writer& rWrt,
                                        const SvxFmtBreakItem *pBreakItem,
                                        const SwFmtPageDesc *pPDescItem,
                                        const SvxFmtKeepItem *pKeepItem )
{
    SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;

    if( !rHTMLWrt.IsHTMLMode(HTMLMODE_PRINT_EXT) )
        return rWrt;

    const sal_Char *pBreakBefore = 0;
    const sal_Char *pBreakAfter = 0;

    if( pKeepItem )
    {
        pBreakAfter = pKeepItem->GetValue() ? sCSS1_PV_avoid : sCSS1_PV_auto;
    }
    if( pBreakItem )
    {
        switch( pBreakItem->GetBreak() )
        {
        case SVX_BREAK_NONE:
            pBreakBefore = sCSS1_PV_auto;
            if( !pBreakAfter )
                pBreakAfter = sCSS1_PV_auto;
            break;

        case SVX_BREAK_PAGE_BEFORE:
            pBreakBefore = sCSS1_PV_always;
            break;

        case SVX_BREAK_PAGE_AFTER:
            pBreakAfter= sCSS1_PV_always;
            break;
        }
    }
    if( pPDescItem )
    {
        const SwPageDesc *pPDesc = pPDescItem->GetPageDesc();
        if( pPDesc )
        {
            switch( pPDesc->GetPoolFmtId() )
            {
            case RES_POOLPAGE_LEFT:     pBreakBefore = sCSS1_PV_left;   break;
            case RES_POOLPAGE_RIGHT:    pBreakBefore = sCSS1_PV_right;  break;
            default:                    pBreakBefore = sCSS1_PV_always; break;
            }
        }
        else if( !pBreakBefore )
        {
            pBreakBefore = sCSS1_PV_auto;
        }
    }

    if( pBreakBefore )
        rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_page_break_before,
                                        pBreakBefore );
    if( pBreakAfter )
        rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_page_break_after,
                                        pBreakAfter );

    return rWrt;
}

static Writer& OutCSS1_SvxFmtBreak_SwFmtPDesc_SvxFmtKeep( Writer& rWrt,
                                        const SfxItemSet& rItemSet,
                                        BOOL bDeep )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
    const SfxPoolItem *pItem;
    const SvxFmtBreakItem *pBreakItem = 0;
    if( SFX_ITEM_SET==rItemSet.GetItemState( RES_BREAK, bDeep, &pItem ))
        pBreakItem = (const SvxFmtBreakItem *)pItem;

    const SwFmtPageDesc *pPDescItem = 0;
    if( ( !rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) ||
          !rHTMLWrt.bCSS1IgnoreFirstPageDesc ||
          rHTMLWrt.pStartNdIdx->GetIndex() !=
                      rHTMLWrt.pCurPam->GetPoint()->nNode.GetIndex() ) &&
        SFX_ITEM_SET==rItemSet.GetItemState( RES_PAGEDESC, bDeep, &pItem ))
        pPDescItem = (const SwFmtPageDesc*)pItem;

    const SvxFmtKeepItem *pKeepItem = 0;
    if( SFX_ITEM_SET==rItemSet.GetItemState( RES_KEEP, bDeep, &pItem ))
        pKeepItem = (const SvxFmtKeepItem *)pItem;

    if( pBreakItem || pPDescItem || pKeepItem )
        OutCSS1_SvxFmtBreak_SwFmtPDesc_SvxFmtKeep( rWrt, pBreakItem,
                                                   pPDescItem, pKeepItem );

    return rWrt;
}

// Wrapper fuer OutCSS1_SfxItemSet etc.
static Writer& OutCSS1_SvxBrush( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;

    // Absatz-Hintergruende werden nur fuer den SW ausgegeben
    if( rHt.Which() < RES_CHRATR_END ||
        rHTMLWrt.IsHTMLMode(HTMLMODE_FULL_STYLES) )
        OutCSS1_SvxBrush( rWrt, rHt, CSS1_BACKGROUND_ATTR, 0 );

    return rWrt;
}


static Writer& OutCSS1_SvxBrush( Writer& rWrt, const SfxPoolItem& rHt,
                                 USHORT nMode, const String *pGrfName )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;

    // Das Zeichen-Attribut wird nicht ausgegeben, wenn gerade
    // Optionen ausgegeben werden
    if( rHt.Which() < RES_CHRATR_END &&
        rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
        return rWrt;

    // Erstmal ein par Werte holen
//  const Brush &rBrush = ((const SvxBrushItem &)rHt).GetBrush();
    const Color & rColor = ((const SvxBrushItem &)rHt).GetColor();
    const String *pLink = pGrfName ? pGrfName
                            : ((const SvxBrushItem &)rHt).GetGraphicLink();
    SvxGraphicPosition ePos = ((const SvxBrushItem &)rHt).GetGraphicPos();

    if( CSS1_BACKGROUND_PAGE==nMode )
    {
        // Fuer Seitenvorlagen wurde der Grafik-Name uebergeben. Es wird
        // nur ein Attribut ausgegeben, wenn die Grafik nicht gekachelt ist.
        ASSERT( pLink, "Wo ist der Grafik-Name der Seitenvorlage?" );
        if( !pLink || !pLink->Len() || GPOS_TILED==ePos )
            return rWrt;
    }

    // Erstmal die Farbe holen
    BOOL bColor = FALSE;
    BOOL bTransparent = rColor.GetTransparency() > 0;
    Color aColor;
    if( !bTransparent )
    {
        aColor = rColor;
        bColor = TRUE;
    }

    // und jetzt eine Grafik
    String sGrfNm;

    if( !pLink )
    {
        // embeddete Grafik -> WriteEmbedded schreiben
        const Graphic* pGrf = ((const SvxBrushItem &)rHt).GetGraphic();
        if( pGrf )
        {
            // Grafik als (JPG-)File speichern
            const String* pTempFileName = rHTMLWrt.GetOrigFileName();
            if(pTempFileName)
                sGrfNm = *pTempFileName;
            USHORT nErr = XOutBitmap::WriteGraphic( *pGrf, sGrfNm,
                        String::CreateFromAscii("JPG") );
            if( !nErr )     // fehlerhaft, da ist nichts auszugeben
            {
                sGrfNm = URIHelper::SmartRelToAbs( sGrfNm );
                if( rHTMLWrt.HasCId() )
                    rHTMLWrt.MakeCIdURL( sGrfNm );
                pLink = &sGrfNm;
            }
            else
            {
                rHTMLWrt.nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE;
            }
        }
    }
    else if( !pGrfName && (rHTMLWrt.bCfgCpyLinkedGrfs || rHTMLWrt.HasCId()) )
    {
        sGrfNm = *pLink;
        rWrt.CopyLocalFileToINet( sGrfNm, rHTMLWrt.HasCId() );
        if( rHTMLWrt.HasCId() )
            rHTMLWrt.MakeCIdURL( sGrfNm );
        pLink = &sGrfNm;
    }

    // In Tabellen wird nur dann etwas exportiert, wenn eine Grafik
    // existiert.
    if( CSS1_BACKGROUND_TABLE==nMode && !pLink )
        return rWrt;

    // ggf. noch die Ausrichtung der Grafik
    const sal_Char *pRepeat = 0, *pHori = 0, *pVert = 0;
    if( pLink )
    {
        if( GPOS_TILED==ePos )
        {
            pRepeat = sCSS1_PV_repeat;
        }
        else
        {
            switch( ePos )
            {
            case GPOS_LT:
            case GPOS_MT:
            case GPOS_RT:
                pHori = sCSS1_PV_top;
                break;

            case GPOS_LM:
            case GPOS_MM:
            case GPOS_RM:
                pHori = sCSS1_PV_middle;
                break;

            case GPOS_LB:
            case GPOS_MB:
            case GPOS_RB:
                pHori = sCSS1_PV_bottom;
                break;
            }

            switch( ePos )
            {
            case GPOS_LT:
            case GPOS_LM:
            case GPOS_LB:
                pVert = sCSS1_PV_left;
                break;

            case GPOS_MT:
            case GPOS_MM:
            case GPOS_MB:
                pVert = sCSS1_PV_center;
                break;

            case GPOS_RT:
            case GPOS_RM:
            case GPOS_RB:
                pVert = sCSS1_PV_right;
                break;
            }

            if( pHori || pVert )
                pRepeat = sCSS1_PV_no_repeat;
        }
    }

    // jetzt den String zusammen bauen
    String sOut;
    if( !pLink && !bColor )
    {
        // keine Farbe und kein Link, aber ein transparenter Brush
        if( bTransparent && CSS1_BACKGROUND_FLY != nMode )
            sOut.AssignAscii( sCSS1_PV_transparent );
    }
    else
    {
        if( bColor )
        {
            ByteString sTmp;
            GetCSS1Color( aColor, sTmp );
            sOut += String( sTmp, RTL_TEXTENCODING_ASCII_US );
        }

        if( pLink )
        {
            if( bColor )
                sOut += ' ';

            sOut.AppendAscii( sCSS1_url );
            sOut.Append( '(' );
            sOut.Append( INetURLObject::AbsToRel( *pLink,
                                    INetURLObject::WAS_ENCODED,
                                    INetURLObject::DECODE_WITH_CHARSET ));
            sOut.Append( ')' );

            if( pRepeat )
            {
                sOut.Append( ' ' );
                sOut.AppendAscii( pRepeat );
            }

            if( pHori )
            {
                sOut.Append( ' ' );
                sOut.AppendAscii( pHori );
            }
            if( pVert )
            {
                sOut.Append( ' ' );
                sOut.AppendAscii( pVert );
            }

            sOut.Append( ' ' );
            sOut.AppendAscii( sCSS1_PV_scroll );
        }
    }

    if( sOut.Len() )
        rHTMLWrt.OutCSS1_Property( sCSS1_P_background, sOut );

    return rWrt;
}

static void OutCSS1_SvxBorderLine( SwHTMLWriter& rHTMLWrt,
                                   const sal_Char *pProperty,
                                   const SvxBorderLine *pLine )
{
    if( !pLine )
    {
        rHTMLWrt.OutCSS1_PropertyAscii( pProperty, sCSS1_PV_none );
        return;
    }

    BOOL bDouble = FALSE;
    USHORT nWidth = pLine->GetOutWidth();
    if( pLine->GetInWidth() )
    {
        nWidth += pLine->GetDistance();
        nWidth += pLine->GetInWidth();
        bDouble = TRUE;
    }

    ByteString sOut;
    if( Application::GetDefaultDevice() &&
        nWidth <= Application::GetDefaultDevice()->PixelToLogic(
                    Size( 1, 1 ), MapMode( MAP_TWIP) ).Width() )
    {
        // Wenn die Breite kleiner ist als ein Pixel, dann als 1px
        // ausgeben, damit Netscape und IE die Linie auch darstellen.
        sOut += "1px";
    }
    else
    {
#ifdef USE_MAPMODE_MM100
        nWidth = (USHORT)((double)nWidth * (25.4/72));  // 1/100pt
#else
        nWidth *= 5;    // 1/100pt
#endif

        // Breite als n.nn pt
        sOut += ByteString::CreateFromInt32( nWidth / 100 );
        (((sOut += '.')
            += ByteString::CreateFromInt32((nWidth/10) % 10))
            += ByteString::CreateFromInt32(nWidth % 10)) += sCSS1_UNIT_pt;
    }

    // Linien-Stil: solid oder double
    ((sOut += ' ')
        += (bDouble ? sCSS1_PV_double : sCSS1_PV_solid)) += ' ';

    // und noch die Farbe
    GetCSS1Color( pLine->GetColor(), sOut );

    rHTMLWrt.OutCSS1_PropertyAscii( pProperty, sOut );
}

static Writer& OutCSS1_SvxBox( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;

    // Das Zeichen-Attribut wird nicht ausgegeben, wenn gerade
    // Optionen ausgegeben werden
    if( !rHTMLWrt.IsHTMLMode(HTMLMODE_PARA_BORDER))
        return rWrt;

    const SvxBoxItem& rBoxItem = (const SvxBoxItem&)rHt;
    const SvxBorderLine *pTop = rBoxItem.GetTop();
    const SvxBorderLine *pBottom = rBoxItem.GetBottom();
    const SvxBorderLine *pLeft = rBoxItem.GetLeft();
    const SvxBorderLine *pRight = rBoxItem.GetRight();

    if( (pTop && pBottom && pLeft && pRight &&
         *pTop == *pBottom && *pTop == *pLeft && *pTop == *pRight) ||
         (!pTop && !pBottom && !pLeft && !pRight) )
    {
        // alle Linien gesetzt und gleich oder alle Linien nicht gesetzt
        // => border : ...
        OutCSS1_SvxBorderLine( rHTMLWrt, sCSS1_P_border, pTop );
    }
    else
    {
        // sonst alle Linien individuell ausgeben
        OutCSS1_SvxBorderLine( rHTMLWrt, sCSS1_P_border_top, pTop );
        OutCSS1_SvxBorderLine( rHTMLWrt, sCSS1_P_border_bottom, pBottom );
        OutCSS1_SvxBorderLine( rHTMLWrt, sCSS1_P_border_left, pLeft );
        OutCSS1_SvxBorderLine( rHTMLWrt, sCSS1_P_border_right, pRight );
    }

    long nTopDist = pTop ? rBoxItem.GetDistance( BOX_LINE_TOP ) : 0;
    long nBottomDist = pBottom ? rBoxItem.GetDistance( BOX_LINE_BOTTOM ) : 0;
    long nLeftDist = pLeft ? rBoxItem.GetDistance( BOX_LINE_LEFT ) : 0;
    long nRightDist = pRight ? rBoxItem.GetDistance( BOX_LINE_RIGHT ) : 0;

    if( nTopDist == nBottomDist && nLeftDist == nRightDist )
    {
        ByteString sVal;
        AddUnitPropertyValue( nTopDist, rHTMLWrt.GetCSS1Unit(), sVal );
        if( nTopDist != nLeftDist )
        {
            sVal += ' ';
            AddUnitPropertyValue( nLeftDist, rHTMLWrt.GetCSS1Unit(), sVal );
        }
        rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_padding, sVal );
    }
    else
    {
        rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_padding_top, nTopDist );
        rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_padding_bottom, nBottomDist );
        rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_padding_left, nLeftDist );
        rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_padding_right, nRightDist );
    }

    return rWrt;
}

/*
 * lege hier die Tabellen fuer die HTML-Funktions-Pointer auf
 * die Ausgabe-Funktionen an.
 * Es sind lokale Strukturen, die nur innerhalb der HTML-DLL
 * bekannt sein muessen.
 */


SwAttrFnTab aCSS1AttrFnTab = {
/* RES_CHRATR_CASEMAP   */          OutCSS1_SvxCaseMap,
/* RES_CHRATR_CHARSETCOLOR  */      0,
/* RES_CHRATR_COLOR */              OutCSS1_SvxColor,
/* RES_CHRATR_CONTOUR   */          0,
/* RES_CHRATR_CROSSEDOUT    */      OutCSS1_SvxCrossedOut,
/* RES_CHRATR_ESCAPEMENT    */      0,
/* RES_CHRATR_FONT  */              OutCSS1_SvxFont,
/* RES_CHRATR_FONTSIZE  */          OutCSS1_SvxFontHeight,
/* RES_CHRATR_KERNING   */          OutCSS1_SvxKerning,
/* RES_CHRATR_LANGUAGE  */          0,
/* RES_CHRATR_POSTURE   */          OutCSS1_SvxPosture,
/* RES_CHRATR_PROPORTIONALFONTSIZE*/0,
/* RES_CHRATR_SHADOWED  */          0,
/* RES_CHRATR_UNDERLINE */          OutCSS1_SvxUnderline,
/* RES_CHRATR_WEIGHT    */          OutCSS1_SvxFontWeight,
/* RES_CHRATR_WORDLINEMODE  */      0,
/* RES_CHRATR_AUTOKERN  */          0,
/* RES_CHRATR_BLINK */              OutCSS1_SvxBlink,
/* RES_CHRATR_NOHYPHEN  */          0, // Neu: nicht trennen
/* RES_CHRATR_NOLINEBREAK */        0, // Neu: nicht umbrechen
/* RES_CHRATR_BACKGROUND */         OutCSS1_SvxBrush, // Neu: Zeichenhintergrund
/* RES_CHRATR_CJK_FONT */           0,
/* RES_CHRATR_CJK_FONTSIZE */       0,
/* RES_CHRATR_CJK_LANGUAGE */       0,
/* RES_CHRATR_CJK_POSTURE */        0,
/* RES_CHRATR_CJK_WEIGHT */         0,
/* RES_CHRATR_CTL_FONT */           0,
/* RES_CHRATR_CTL_FONTSIZE */       0,
/* RES_CHRATR_CTL_LANGUAGE */       0,
/* RES_CHRATR_CTL_POSTURE */        0,
/* RES_CHRATR_CTL_WEIGHT */         0,
/* RES_CHRATR_WRITING_DIRECTION */  0,
/* RES_CHRATR_DUMMY2 */             0,
/* RES_CHRATR_DUMMY3 */             0,
/* RES_CHRATR_DUMMY4 */             0,
/* RES_CHRATR_DUMMY5 */             0,
/* RES_CHRATR_DUMMY1 */             0, // Dummy:

/* RES_TXTATR_NOLINEBREAK   */      0,
/* RES_TXTATR_NOHYPHEN  */          0,
/* RES_TXTATR_REFMARK*/             0,
/* RES_TXTATR_TOXMARK */            0,
/* RES_TXTATR_CHARFMT   */          0,
/* RES_TXTATR_TWO_LINES */          0,
/* RES_TXTATR_CJK_RUBY */           0,
/* RES_TXTATR_UNKNOWN_CONTAINER */  0,
/* RES_TXTATR_DUMMY5 */             0,
/* RES_TXTATR_DUMMY6 */             0,

/* RES_TXTATR_FIELD */              0,
/* RES_TXTATR_FLYCNT */             0,
/* RES_TXTATR_FTN */                0,
/* RES_TXTATR_SOFTHYPH */           0,
/* RES_TXTATR_HARDBLANK*/           0,
/* RES_TXTATR_DUMMY1 */             0, // Dummy:
/* RES_TXTATR_DUMMY2 */             0, // Dummy:

/* RES_PARATR_LINESPACING   */      OutCSS1_SvxLineSpacing,
/* RES_PARATR_ADJUST    */          OutCSS1_SvxAdjust,
/* RES_PARATR_SPLIT */              OutCSS1_SvxFmtSplit,
/* RES_PARATR_WIDOWS    */          OutCSS1_SvxWidows,
/* RES_PARATR_ORPHANS   */          OutCSS1_SvxOrphans,
/* RES_PARATR_TABSTOP   */          0,
/* RES_PARATR_HYPHENZONE*/          0,
/* RES_PARATR_DROP */               OutCSS1_SwFmtDrop,
/* RES_PARATR_REGISTER */           0, // neu:  Registerhaltigkeit
/* RES_PARATR_DUMMY1 */             0, // Dummy:
/* RES_PARATR_DUMMY2 */             0, // Dummy:

/* RES_FILL_ORDER   */              0,
/* RES_FRM_SIZE */                  0,
/* RES_PAPER_BIN    */              0,
/* RES_LR_SPACE */                  OutCSS1_SvxLRSpace,
/* RES_UL_SPACE */                  OutCSS1_SvxULSpace,
/* RES_PAGEDESC */                  0,
/* RES_BREAK */                     0,
/* RES_CNTNT */                     0,
/* RES_HEADER */                    0,
/* RES_FOOTER */                    0,
/* RES_PRINT */                     0,
/* RES_OPAQUE */                    0,
/* RES_PROTECT */                   0,
/* RES_SURROUND */                  0,
/* RES_VERT_ORIENT */               0,
/* RES_HORI_ORIENT */               0,
/* RES_ANCHOR */                    0,
/* RES_BACKGROUND */                OutCSS1_SvxBrush,
/* RES_BOX  */                      OutCSS1_SvxBox,
/* RES_SHADOW */                    0,
/* RES_FRMMACRO */                  0,
/* RES_COL */                       0,
/* RES_KEEP */                      0,
/* RES_URL */                       0,
/* RES_EDIT_IN_READONLY */          0,
/* RES_LAYOUT_SPLIT */              0,
/* RES_FRMATR_DUMMY1 */             0, // Dummy:
/* RES_FRMATR_DUMMY2 */             0, // Dummy:
/* RES_FRMATR_DUMMY3 */             0, // Dummy:
/* RES_FRMATR_DUMMY4 */             0, // Dummy:
/* RES_FRMATR_DUMMY5 */             0, // Dummy:
/* RES_FRMATR_DUMMY6 */             0, // Dummy:
/* RES_FRMATR_DUMMY7 */             0, // Dummy:
/* RES_FRMATR_DUMMY8 */             0, // Dummy:
/* RES_FRMATR_DUMMY9 */             0, // Dummy:

/* RES_GRFATR_MIRRORGRF */          0,
/* RES_GRFATR_CROPGRF   */          0,
/* RES_GRFATR_ROTATION */           0,
/* RES_GRFATR_LUMINANCE */          0,
/* RES_GRFATR_CONTRAST */           0,
/* RES_GRFATR_CHANNELR */           0,
/* RES_GRFATR_CHANNELG */           0,
/* RES_GRFATR_CHANNELB */           0,
/* RES_GRFATR_GAMMA */              0,
/* RES_GRFATR_INVERT */             0,
/* RES_GRFATR_TRANSPARENCY */       0,
/* RES_GRFATR_DRWAMODE */           0,
/* RES_GRFATR_DUMMY1 */             0,
/* RES_GRFATR_DUMMY2 */             0,
/* RES_GRFATR_DUMMY3 */             0,
/* RES_GRFATR_DUMMY4 */             0,
/* RES_GRFATR_DUMMY5 */             0,

/* RES_BOXATR_FORMAT */             0,
/* RES_BOXATR_FORMULA */            0,
/* RES_BOXATR_VALUE */              0
};


/*************************************************************************

      $Log: not supported by cvs2svn $
      Revision 1.110  2000/09/18 16:04:42  willem.vandorp
      OpenOffice header added.

      Revision 1.109  2000/08/30 16:46:22  jp
      use CharClass instead of international

      Revision 1.108  2000/08/18 13:03:06  jp
      don't export escaped URLs

      Revision 1.107  2000/07/31 19:24:15  jp
      new attributes for CJK/CTL and graphic

      Revision 1.106  2000/06/26 12:55:05  os
      INetURLObject::SmartRelToAbs removed

      Revision 1.105  2000/06/26 09:51:49  jp
      must change: GetAppWindow->GetDefaultDevice

      Revision 1.104  2000/05/15 10:06:56  os
      Chg: GetOrigFileName()

      Revision 1.103  2000/04/28 14:29:10  mib
      unicode

      Revision 1.102  2000/04/10 12:20:54  mib
      unicode

      Revision 1.101  2000/03/03 15:21:00  os
      StarView remainders removed

      Revision 1.100  2000/02/11 14:36:48  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.99  1999/09/21 09:48:39  mib
      multiple text encodings

      Revision 1.98  1999/09/20 13:16:17  mib
      COL_WINDOWWORKSPACE->COL-WHITE

      Revision 1.97  1999/07/23 13:34:28  MIB
      #67578#: Export multicolumned sections as <MULTICOL>, section backgrounds


*************************************************************************/

diff --git a/sw/source/filter/html/css1kywd.cxx b/sw/source/filter/html/css1kywd.cxx
new file mode 100644
index 0000000..7a115b6
--- /dev/null
+++ b/sw/source/filter/html/css1kywd.cxx
@@ -0,0 +1,400 @@
/*************************************************************************
 *
 *  $RCSfile: css1kywd.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:55 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#include "css1kywd.hxx"

/*  */

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS_mimetype, "text/css" );

/*  */

// ein par allgemeine Strings

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_import, "import" );

// Feature: PrintExt
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_page, "page" );
//sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_media, "media" );
// /Feature: PrintExt

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_important, "important" );

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_link, "link" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_visited, "visited" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_first_letter, "first-letter" );

// Feature: PrintExt
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_left, "left" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_right, "right" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_first, "first" );
// /Feature: PrintExt

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_url, "url" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_rgb, "rgb" );

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_UNIT_pt, "pt" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_UNIT_mm, "mm" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_UNIT_cm, "cm" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_UNIT_pc, "pc" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_UNIT_inch, "in" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_UNIT_px, "px" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_UNIT_em, "em" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_UNIT_ex, "ex" );

/*  */

// Strings fuer Font-Properties

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_font_family, "font-family" );

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_serif, "serif" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_sans_serif, "sans-serif" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_cursive, "cursive" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_fantasy, "fantasy" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_monospace, "monospace" );


sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_font_style, "font-style" );

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_normal, "normal" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_italic, "italic" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_oblique, "oblique" );


sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_font_variant, "font-variant" );

//sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_normal, "normal" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_small_caps, "small-caps" );


sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_font_weight, "font-weight" );

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_extra_light, "extra-light" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_light, "light" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_demi_light, "demi-light" );
//sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_medium, "medium" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_demi_bold, "demi-bold" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_bold, "bold" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_extra_bold, "extra-bold" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_lighter, "lighter" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_bolder, "bolder" );


sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_font_size, "font-size" );

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_xx_small, "xx-small" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_x_small, "x-small" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_small, "small" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_medium, "medium" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_large, "large" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_x_large, "x-large" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_xx_large, "xx-large" );

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_larger, "larger" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_smaller, "smaller" );


sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_font, "font" );



/*  */

// Strings fuer Farb- und Hintergrund-Properties

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_color, "color" );


sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_background, "background" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_background_color, "background-color" );

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_transparent, "transparent" );

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_repeat, "repeat" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_repeat_x, "repeat-x" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_repeat_y, "repeat-y" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_no_repeat, "no-repeat" );

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_top, "top" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_middle, "middle" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_bottom, "bottom" );

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_scroll, "scroll" );


/*  */

// Strings fuer Text-Properties

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_letter_spacing, "letter-spacing" );


sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_text_decoration, "text-decoration" );

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_none, "none" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_underline, "underline" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_line_through, "line-through" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_blink, "blink" );


sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_text_align, "text-align" );

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_left, "left" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_center, "center" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_right, "right" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_justify, "justify" );


sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_text_indent, "text-indent" );


sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_line_height, "line-height" );


/*  */

// Strings fuer Box-Properties

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_margin_left, "margin-left" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_margin_right, "margin-right" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_margin_top, "margin-top" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_margin_bottom, "margin-bottom" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_margin, "margin" );

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_padding_top, "padding-top" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_padding_bottom, "padding-bottom" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_padding_left, "padding-left" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_padding_right, "padding-right" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_padding, "padding" );

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_auto, "auto" );

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_border_left_width, "border-left-width" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_border_right_width, "border-right-width" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_border_top_width, "border-top-width" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_border_bottom_width, "border-bottom-width" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_border_width, "border-width" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_border_color, "border-color" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_border_style, "border-style" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_border_left, "border-left" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_border_right, "border-right" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_border_top, "border-top" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_border_bottom, "border-bottom" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_border, "border" );

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_thin, "thin" );
//sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_medium, "medium" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_thick, "thick" );

//sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_none, "none" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_dotted, "dotted" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_dashed, "dashed" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_solid, "solid" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_double, "double" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_groove, "groove" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_ridge, "ridge" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_inset, "inset" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_outset, "outset" );

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_width, "width" );

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_height, "height" );

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_float, "float" );

/*  */

// Strings fuer Positioning

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_position, "position" );

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_absolute, "absolute" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_relative, "relative" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_static, "static" );

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_left, "left" );

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_top, "top" );

/*  */

// Feature: PrintExt

// Strings fuer Printing Extensions

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_page_break_before, "page-break-before" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_page_break_after, "page-break-after" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_page_break_inside, "page-break-inside" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_size, "size" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_widows, "widows" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_orphans, "orphans" );
//sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_P_marks, "marks" );

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_always, "always" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_avoid, "avoid" );

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_portrait, "portrait" );
sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_landscape, "landscape" );

//sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_crop, "crop" );
//sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_PV_cross, "cross" );

// /Feature: PrintExt

sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_class_abs_pos, "sd-abs-pos" );

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/html/css1kywd.cxx,v 1.1.1.1 2000-09-18 17:14:55 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.25  2000/09/18 16:04:43  willem.vandorp
      OpenOffice header added.

      Revision 1.24  2000/04/10 12:20:55  mib
      unicode

      Revision 1.23  1999/06/11 14:44:00  MIB
      Individuelle Umrandungs-Abstaende


      Rev 1.22   11 Jun 1999 16:44:00   MIB
   Individuelle Umrandungs-Abstaende

      Rev 1.21   15 Apr 1999 13:44:52   MIB
   background-color

      Rev 1.20   15 Apr 1998 14:40:44   MIB
   Zwei-seitige Printing-Extensions

      Rev 1.19   03 Apr 1998 15:11:32   MIB
   CSS1-Padding

      Rev 1.18   26 Nov 1997 19:09:04   MA
   includes

      Rev 1.17   10 Oct 1997 10:14:22   MIB
   CSS1-Printing-Ext: @page,page-break-before/after (noch kein left/right)

      Rev 1.16   30 Jul 1997 12:27:18   MIB
   absolute positioning

      Rev 1.15   02 Jul 1997 17:11:28   MIB
   neue CSS1-Border-Properties

      Rev 1.14   21 May 1997 11:11:42   MIB
   <LINK REL=STYLESHEET> zum Enbinden von externen Style-Sheets

      Rev 1.13   22 Oct 1996 10:28:38   MIB
   Umstellung von CSS1 auf Klein-Buchstaben (u.a. wegen Amaya)

      Rev 1.12   15 Oct 1996 13:35:40   MIB
   letter-spacing/Laufweite imp./exp.

      Rev 1.11   14 Oct 1996 16:42:24   MIB
   Import CSS1-Umrandung (border)

      Rev 1.10   13 Oct 1996 12:12:40   MIB
   first-letter-Pseudo-Element/DropCaps

      Rev 1.9   11 Oct 1996 16:48:00   MIB
   font-variant

      Rev 1.8   24 Sep 1996 12:47:42   MIB
   bug fix: Einheit fuer Inch ist in nicht inch

      Rev 1.7   19 Aug 1996 18:04:56   MIB
   Anpassungen an Draft vom 26.Juli 96

      Rev 1.6   12 Aug 1996 10:29:56   MIB
   Anpassungen an draft vom 26.7.96, Background-Property

      Rev 1.5   07 Aug 1996 13:21:30   MIB
   Import von color und text-decoration

      Rev 1.4   10 Jul 1996 15:41:36   MIB
   Includes fuer precompiled header gerichtet

      Rev 1.3   03 Jul 1996 16:51:48   MIB
   visited und link

      Rev 1.2   18 Jun 1996 12:19:28   MIB
   margin[-[left|right|top|bottom]]?, text-indent

      Rev 1.1   17 Jun 1996 15:57:26   MIB
   restliche Keywords fuer Font-Properties

      Rev 1.0   16 Jun 1996 14:32:30   MIB
   Initial revision.

*************************************************************************/


diff --git a/sw/source/filter/html/css1kywd.hxx b/sw/source/filter/html/css1kywd.hxx
new file mode 100644
index 0000000..3c884a5
--- /dev/null
+++ b/sw/source/filter/html/css1kywd.hxx
@@ -0,0 +1,320 @@
/*************************************************************************
 *
 *  $RCSfile: css1kywd.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:55 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _CSS1KYWD_HXX
#define _CSS1KYWD_HXX

#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif

#ifndef CSS1_CONSTASCII_DECL
#define CSS1_CONSTASCII_DECL( n, s ) n[sizeof(s)]
#endif
#ifndef CSS1_CONSTASCII_DEF
#define CSS1_CONSTASCII_DEF( n, s ) n[sizeof(s)] = s
#endif

/*  */

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS_mimetype, "text/css" );

/*  */

// ein par allgemeine Strings

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_import, "import" );

// Feature: PrintExt
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_page, "page" );
//sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_media, "media" );
// /Feature: PrintExt

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_important, "important" );

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_link, "link" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_visited, "visited" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_first_letter, "first-letter" );

// Feature: PrintExt
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_left, "left" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_right, "right" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_first, "first" );
// /Feature: PrintExt

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_url, "url" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_rgb, "rgb" );

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_UNIT_pt, "pt" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_UNIT_mm, "mm" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_UNIT_cm, "cm" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_UNIT_pc, "pc" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_UNIT_inch, "in" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_UNIT_px, "px" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_UNIT_em, "em" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_UNIT_ex, "ex" );

/*  */

// Strings fuer Font-Properties

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_font_family, "font-family" );

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_serif, "serif" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_sans_serif, "sans-serif" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_cursive, "cursive" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_fantasy, "fantasy" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_monospace, "monospace" );


extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_font_style, "font-style" );

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_normal, "normal" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_italic, "italic" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_oblique, "oblique" );


extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_font_variant, "font-variant" );

//sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_normal, "normal" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_small_caps, "small-caps" );


extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_font_weight, "font-weight" );

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_extra_light, "extra-light" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_light, "light" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_demi_light, "demi-light" );
//sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_medium, "medium" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_demi_bold, "demi-bold" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_bold, "bold" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_extra_bold, "extra-bold" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_lighter, "lighter" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_bolder, "bolder" );


extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_font_size, "font-size" );

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_xx_small, "xx-small" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_x_small, "x-small" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_small, "small" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_medium, "medium" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_large, "large" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_x_large, "x-large" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_xx_large, "xx-large" );

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_larger, "larger" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_smaller, "smaller" );


extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_font, "font" );



/*  */

// Strings fuer Farb- und Hintergrund-Properties

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_color, "color" );


extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_background, "background" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_background_color, "background-color" );

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_transparent, "transparent" );

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_repeat, "repeat" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_repeat_x, "repeat-x" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_repeat_y, "repeat-y" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_no_repeat, "no-repeat" );

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_top, "top" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_middle, "middle" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_bottom, "bottom" );

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_scroll, "scroll" );


/*  */

// Strings fuer Text-Properties

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_letter_spacing, "letter-spacing" );


extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_text_decoration, "text-decoration" );

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_none, "none" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_underline, "underline" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_line_through, "line-through" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_blink, "blink" );


extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_text_align, "text-align" );

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_left, "left" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_center, "center" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_right, "right" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_justify, "justify" );


extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_text_indent, "text-indent" );


extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_line_height, "line-height" );


/*  */

// Strings fuer Box-Properties

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_margin_left, "margin-left" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_margin_right, "margin-right" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_margin_top, "margin-top" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_margin_bottom, "margin-bottom" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_margin, "margin" );

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_padding_top, "padding-top" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_padding_bottom, "padding-bottom" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_padding_left, "padding-left" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_padding_right, "padding-right" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_padding, "padding" );

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_auto, "auto" );

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_border_left_width, "border-left-width" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_border_right_width, "border-right-width" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_border_top_width, "border-top-width" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_border_bottom_width, "border-bottom-width" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_border_width, "border-width" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_border_color, "border-color" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_border_style, "border-style" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_border_left, "border-left" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_border_right, "border-right" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_border_top, "border-top" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_border_bottom, "border-bottom" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_border, "border" );

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_thin, "thin" );
//sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_medium, "medium" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_thick, "thick" );

//sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_none, "none" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_dotted, "dotted" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_dashed, "dashed" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_solid, "solid" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_double, "double" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_groove, "groove" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_ridge, "ridge" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_inset, "inset" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_outset, "outset" );

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_width, "width" );

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_height, "height" );

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_float, "float" );

/*  */

// Strings fuer Positioning

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_position, "position" );

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_absolute, "absolute" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_relative, "relative" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_static, "static" );

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_left, "left" );

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_top, "top" );

/*  */

// Feature: PrintExt

// Strings fuer Printing Extensions

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_page_break_before, "page-break-before" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_page_break_after, "page-break-after" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_page_break_inside, "page-break-inside" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_size, "size" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_widows, "widows" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_orphans, "orphans" );
//sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_P_marks, "marks" );

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_always, "always" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_avoid, "avoid" );

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_portrait, "portrait" );
extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_landscape, "landscape" );

//sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_crop, "crop" );
//sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_PV_cross, "cross" );

// /Feature: PrintExt

extern sal_Char __FAR_DATA CSS1_CONSTASCII_DECL( sCSS1_class_abs_pos, "sd-abs-pos" );


#endif


diff --git a/sw/source/filter/html/htmlatr.cxx b/sw/source/filter/html/htmlatr.cxx
new file mode 100644
index 0000000..1d270c8
--- /dev/null
+++ b/sw/source/filter/html/htmlatr.cxx
@@ -0,0 +1,3165 @@
/*************************************************************************
 *
 *  $RCSfile: htmlatr.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:55 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/


#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#define ITEMID_BOXINFO      SID_ATTR_BORDER_INNER
#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _SV_SVAPP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _WRKWIN_HXX //autogen
#include <vcl/wrkwin.hxx>
#endif
#ifndef _URLOBJ_HXX //autogen
#include <tools/urlobj.hxx>
#endif

#ifndef _HTMLOUT_HXX //autogen
#include <svtools/htmlout.hxx>
#endif
#ifndef _HTMLKYWD_HXX
#include <svtools/htmlkywd.hxx>
#endif
#ifndef _HTMLTOKN_H
#include <svtools/htmltokn.h>
#endif
#ifndef _SFX_WHITER_HXX //autogen
#include <svtools/whiter.hxx>
#endif
#ifndef _SFXMACITEM_HXX //autogen
#include <svtools/macitem.hxx>
#endif

#ifndef _SVX_HTMLMODE_HXX
#include <svx/htmlmode.hxx>
#endif
#ifndef _SVX_ESCPITEM_HXX //autogen
#include <svx/escpitem.hxx>
#endif
#ifndef _SVX_BRKITEM_HXX //autogen
#include <svx/brkitem.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _SVX_UDLNITEM_HXX //autogen
#include <svx/udlnitem.hxx>
#endif
#ifndef _SVX_CRSDITEM_HXX //autogen
#include <svx/crsditem.hxx>
#endif
#ifndef _SVX_BLNKITEM_HXX //autogen
#include <svx/blnkitem.hxx>
#endif
#ifndef _SVX_CMAPITEM_HXX //autogen
#include <svx/cmapitem.hxx>
#endif
#ifndef _SVX_COLRITEM_HXX //autogen
#include <svx/colritem.hxx>
#endif
#ifndef _SVX_FONTITEM_HXX //autogen
#include <svx/fontitem.hxx>
#endif
#ifndef _SVX_FHGTITEM_HXX //autogen
#include <svx/fhgtitem.hxx>
#endif
#ifndef _SVX_POSTITEM_HXX //autogen
#include <svx/postitem.hxx>
#endif
#ifndef _SVX_KERNITEM_HXX //autogen
#include <svx/kernitem.hxx>
#endif
#ifndef _SVX_WGHTITEM_HXX //autogen
#include <svx/wghtitem.hxx>
#endif
#ifndef _SVX_LSPCITEM_HXX //autogen
#include <svx/lspcitem.hxx>
#endif
#ifndef _SVX_ADJITEM_HXX //autogen
#include <svx/adjitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif


#ifndef _FCHRFMT_HXX //autogen
#include <fchrfmt.hxx>
#endif
#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _FMTCLDS_HXX //autogen
#include <fmtclds.hxx>
#endif
#ifndef _FMTPDSC_HXX //autogen
#include <fmtpdsc.hxx>
#endif
#ifndef _FMTFLCNT_HXX //autogen
#include <fmtflcnt.hxx>
#endif
#ifndef _FMTINFMT_HXX //autogen
#include <fmtinfmt.hxx>
#endif
#ifndef _FMTFTN_HXX //autogen
#include <fmtftn.hxx>
#endif
#ifndef _TXATBASE_HXX //autogen
#include <txatbase.hxx>
#endif
#ifndef _FRMATR_HXX
#include <frmatr.hxx>
#endif
#ifndef _CHARFMT_HXX //autogen
#include <charfmt.hxx>
#endif
#ifndef _FMTHBSH_HXX //autogen
#include <fmthbsh.hxx>
#endif

#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _PAM_HXX
#include <pam.hxx>
#endif
#ifndef _NDTXT_HXX
#include <ndtxt.hxx>
#endif
#ifndef _SWERROR_H
#include <swerror.h>
#endif
#ifndef _PARATR_HXX
#include <paratr.hxx>
#endif

#ifndef _FMTCOL_HXX
#include <fmtcol.hxx>
#endif
#ifndef _POOLFMT_HXX
#include <poolfmt.hxx>
#endif
#ifndef _PAGEDESC_HXX
#include <pagedesc.hxx>
#endif
#ifndef _SWTABLE_HXX
#include <swtable.hxx>
#endif

#ifndef _WRTTXATR_HXX
#include <wrttxatr.hxx>
#endif
#ifndef _HTMLNUM_HXX
#include <htmlnum.hxx>
#endif
#ifndef _WRTHTML_HXX
#include <wrthtml.hxx>
#endif
#ifndef _HTMLFLY_HXX
#include <htmlfly.hxx>
#endif


/*
 * um nicht immer wieder nach einem Update festzustellen, das irgendwelche
 * Hint-Ids dazugekommen sind, wird hier definiert, die Groesse der Tabelle
 * definiert und mit der akt. verglichen. Bei unterschieden wird der
 * Compiler schon meckern.
 *
 * diese Section und die dazugeherigen Tabellen muessen in folgenden Files
 * gepflegt werden: rtf\rtfatr.cxx, sw6\sw6atr.cxx, w4w\w4watr.cxx
 */
#if !defined(UNX) && !defined(MSC) && !defined(PPC) && !defined(CSET) && !defined(__MWERKS__) && !defined(WTC)

#define ATTRFNTAB_SIZE 121
#if ATTRFNTAB_SIZE != POOLATTR_END - POOLATTR_BEGIN
#error Attribut-Tabelle ist ungueltigt. Wurden neue Hint-IDs zugefuegt ??
#endif

#ifdef FORMAT_TABELLE
// da sie nicht benutzt wird!
#define FORMATTAB_SIZE 7
#if FORMATTAB_SIZE != RES_FMT_END - RES_FMT_BEGIN
#error Format-Tabelle ist ungueltigt. Wurden neue Hint-IDs zugefuegt ??
#endif
#endif

#define NODETAB_SIZE 3
#if NODETAB_SIZE != RES_NODE_END - RES_NODE_BEGIN
#error Node-Tabelle ist ungueltigt. Wurden neue Hint-IDs zugefuegt ??
#endif

#endif

#define HTML_BULLETCHAR_DISC    34
#define HTML_BULLETCHAR_CIRCLE  38
#define HTML_BULLETCHAR_SQUARE  36

#define COLFUZZY 20

//-----------------------------------------------------------------------

HTMLOutEvent __FAR_DATA aAnchorEventTable[] =
{
    { sHTML_O_SDonclick,        sHTML_O_onclick,        SFX_EVENT_MOUSECLICK_OBJECT },
    { sHTML_O_SDonmouseover,    sHTML_O_onmouseover,    SFX_EVENT_MOUSEOVER_OBJECT  },
    { sHTML_O_SDonmouseout,     sHTML_O_onmouseout,     SFX_EVENT_MOUSEOUT_OBJECT   },
    { 0,                        0,                      0                           }
};

static Writer& OutHTML_SvxAdjust( Writer& rWrt, const SfxPoolItem& rHt );

static Writer& OutHTML_HoriSpacer( Writer& rWrt, INT16 nSize )
{
    ASSERT( nSize>0, "horizontaler SPACER mit negativem Wert?" )
    if( nSize <= 0 )
        return rWrt;

    if( Application::GetDefaultDevice() )
    {
        nSize = (INT16)Application::GetDefaultDevice()
            ->LogicToPixel( Size(nSize,0), MapMode(MAP_TWIP) ).Width();
    }

    ByteString sOut( '<' );
    (((((((((sOut += sHTML_spacer)
        += ' ') += sHTML_O_type) += '=') += sHTML_SPTYPE_horizontal)
        += ' ') += sHTML_O_size) += '=')
                        +=ByteString::CreateFromInt32(nSize)) += '>';

    rWrt.Strm() << sOut.GetBuffer();

    return rWrt;
}

USHORT SwHTMLWriter::GetDefListLvl( const String& rNm, USHORT nPoolId )
{
    if( nPoolId == RES_POOLCOLL_HTML_DD )
    {
        return 1 | HTML_DLCOLL_DD;
    }
    else if( nPoolId == RES_POOLCOLL_HTML_DT )
    {
        return 1 | HTML_DLCOLL_DT;
    }

    String sDTDD( String::CreateFromAscii(sHTML_dt) );
    sDTDD += ' ';
    if( COMPARE_EQUAL == sDTDD.CompareTo( rNm, sDTDD.Len() ) )
        // DefinitionList - term
        return (USHORT)rNm.Copy( sDTDD.Len() ).ToInt32() | HTML_DLCOLL_DT;

    sDTDD.AssignAscii( sHTML_dd );
    sDTDD += ' ';
    if( COMPARE_EQUAL == sDTDD.CompareTo( rNm, sDTDD.Len() ) )
        // DefinitionList - definition
        return (USHORT)rNm.Copy( sDTDD.Len() ).ToInt32() | HTML_DLCOLL_DD;

    return 0;
}

void SwHTMLWriter::OutAndSetDefList( USHORT nNewLvl )
{
    // eventuell muss erst mal eine Liste aufgemacht werden
    if( nDefListLvl < nNewLvl )
    {
        // entsprechend dem Level-Unterschied schreiben!
        for( USHORT i=nDefListLvl; i<nNewLvl; i++ )
        {
            if( bLFPossible )
                OutNewLine();
            HTMLOutFuncs::Out_AsciiTag( Strm(), sHTML_deflist, TRUE );
            IncIndentLevel();
            bLFPossible = TRUE;
        }
    }
    else if( nDefListLvl > nNewLvl )
    {
        for( USHORT i=nNewLvl ; i < nDefListLvl; i++ )
        {
            DecIndentLevel();
            if( bLFPossible )
                OutNewLine();
            HTMLOutFuncs::Out_AsciiTag( Strm(), sHTML_deflist, FALSE );
            bLFPossible = TRUE;
        }
    }

    nDefListLvl = nNewLvl;
}


void SwHTMLWriter::ChangeParaToken( USHORT nNew )
{
    if( nNew != nLastParaToken && HTML_PREFORMTXT_ON == nLastParaToken )
    {
        HTMLOutFuncs::Out_AsciiTag( Strm(), sHTML_preformtxt, FALSE );
        bLFPossible = TRUE;
    }
    nLastParaToken = nNew;
}

// fuer die Formate muesste eine einzige Ausgabe-Funktion genuegen !
/*
 * Formate wie folgt ausgeben:
 * - fuer Formate, fuer die es entsprechende HTML-Tags gibt wird das
 *   Tag ausgegeben
 * - fuer alle anderen wird ein Absatz-Tag <P> ausgegeben und bUserFmt
 *   gesetzt
 * - Wenn eine Absatz-Ausrichtung am uebergebenen Item-Set des Nodes
 *   oder im Item-Set des Format gesetzt ist, wird ein ALIGN=xxx ausgegeben,
 *   sofern HTML es zulaesst
 * - in jedem Fall wird harte Attributierung als STYLE-Option geschrieben.
 *   Wenn bUserFmt nicht gesetzt ist, wird nur der uebergebene Item-Set
 *   betrachtet. Sonst werden auch Attribute des Formats ausgegeben.
 */

struct SwHTMLTxtCollOutputInfo
{
    ByteString aToken;              // auszugendens End-Token
    SfxItemSet *pItemSet;       // harte Attributierung

    BOOL bInNumBulList;         // in einer Aufzaehlungs-Liste;
    BOOL bParaPossible;         // ein </P> darf zusaetzlich ausgegeben werden
    BOOL bOutPara;              // ein </P> soll ausgegeben werden
    BOOL bOutDiv;               // write a </DIV>

    SwHTMLTxtCollOutputInfo() :
        pItemSet( 0 ),
        bInNumBulList( FALSE ),
        bParaPossible( FALSE ),
        bOutPara( FALSE ),
        bOutDiv( FALSE )
    {}

    ~SwHTMLTxtCollOutputInfo();

    BOOL HasParaToken() const { return aToken.Len()==1 && aToken.GetChar(0)=='P'; }
    BOOL ShouldOutputToken() const { return bOutPara || !HasParaToken(); }
};

SwHTMLTxtCollOutputInfo::~SwHTMLTxtCollOutputInfo()
{
    delete pItemSet;
}

struct SwHTMLFmtInfo
{
    const SwFmt *pFmt;      // das Format selbst
    const SwFmt *pRefFmt;   // das Vergleichs-Format

    ByteString aToken;          // das auszugebende Token
    String aClass;          // die auszugebende Klasse

    SfxItemSet *pItemSet;   // der auszugebende Attribut-Set

    USHORT nLeftMargin;     // ein par default-Werte fuer
    USHORT nRightMargin;    // Absatz-Vorlagen
    short nFirstLineIndent;

    USHORT nTopMargin;
    USHORT nBottomMargin;

    // Konstruktor fuer einen Dummy zum Suchen
    SwHTMLFmtInfo( const SwFmt *pF ) :
        pFmt( pF ), pItemSet( 0 )
    {}


    // Konstruktor zum Erstellen der Format-Info
    SwHTMLFmtInfo( const SwFmt *pFmt, SwDoc *pDoc, SwDoc *pTemlate,
                   BOOL bOutStyles, BOOL bHardDrop=FALSE );
    ~SwHTMLFmtInfo();

    friend BOOL operator==( const SwHTMLFmtInfo& rInfo1,
                            const SwHTMLFmtInfo& rInfo2 )
    {
        return (long)rInfo1.pFmt == (long)rInfo2.pFmt;
    }

    friend BOOL operator<( const SwHTMLFmtInfo& rInfo1,
                            const SwHTMLFmtInfo& rInfo2 )
    {
        return (long)rInfo1.pFmt < (long)rInfo2.pFmt;
    }

};

SV_IMPL_OP_PTRARR_SORT( SwHTMLFmtInfos, SwHTMLFmtInfo* )

SwHTMLFmtInfo::SwHTMLFmtInfo( const SwFmt *pF, SwDoc *pDoc, SwDoc *pTemplate,
                              BOOL bOutStyles, BOOL bHardDrop ) :
    pFmt( pF ), pItemSet( 0 )
{
    USHORT nRefPoolId = 0;
    // Den Selektor des Formats holen
    USHORT nDeep = SwHTMLWriter::GetCSS1Selector( pFmt, aToken, aClass,
                                                  nRefPoolId );
    ASSERT( nDeep ? aToken.Len()>0 : aToken.Len()==0,
            "Hier stimmt doch was mit dem Token nicht!" );
    ASSERT( nDeep ? nRefPoolId : !nRefPoolId,
            "Hier stimmt doch was mit der Vergleichs-Vorlage nicht!" );

    BOOL bTxtColl = pFmt->Which() == RES_TXTFMTCOLL ||
                    pFmt->Which() == RES_CONDTXTFMTCOLL;

    const SwFmt *pRefFmt = 0;   // Vergleichs-Format
    if( nDeep != 0 )
    {
        // Es ist eine HTML-Tag-Vorlage oder die Vorlage ist von einer
        // solchen abgeleitet
        if( !bOutStyles )
        {
            // wenn keine Styles exportiert werden, muss evtl. zusaetlich
            // harte Attributierung geschrieben werden
            switch( nDeep )
            {
            case CSS1_FMT_ISTAG:
            case CSS1_FMT_CMPREF:
                // fuer HTML-Tag-Vorlagen die Unterscheide zum Original
                // (sofern verfuegbar)
                if( pTemplate )
                    pRefFmt = SwHTMLWriter::GetTemplateFmt( nRefPoolId,
                                                            pTemplate );
                break;

            default:
                // sonst die zur HTML-Tag-Vorlage des Originals oder des
                // aktuellen Doks, wenn die nicht verfuegbar ist
                if( pTemplate )
                    pRefFmt = SwHTMLWriter::GetTemplateFmt( nRefPoolId,
                                                            pTemplate );
                else
                    pRefFmt = SwHTMLWriter::GetParentFmt( *pFmt, nDeep );
                break;
            }
        }
    }
    else if( bTxtColl )
    {
        // Nicht von einer HTML-Tag-Vorlage abgeleitete Absatz-Vorlagen
        // muessen als harte Attributierung relativ zur Textkoerper-Volage
        // exportiert werden. Fuer Nicht-Styles-Export sollte die der
        // HTML-Vorlage als Referenz dienen
        if( !bOutStyles && pTemplate )
            pRefFmt = pTemplate->GetTxtCollFromPool( RES_POOLCOLL_TEXT );
        else
            pRefFmt = pDoc->GetTxtCollFromPool( RES_POOLCOLL_TEXT );
    }

    if( pRefFmt || nDeep==0 )
    {
        // wenn Unterschiede zu einer anderen Vorlage geschrieben werden
        // sollen ist harte Attributierung noetig. Fuer Vorlagen, die
        // nicht von HTML-Tag-Vorlagen abgeleitet sind, gilt das immer
        pItemSet = new SfxItemSet( *pFmt->GetAttrSet().GetPool(),
                                   pFmt->GetAttrSet().GetRanges() );

        pItemSet->Set( pFmt->GetAttrSet(), TRUE );
        if( pRefFmt )
            SwHTMLWriter::SubtractItemSet( *pItemSet, pRefFmt->GetAttrSet(), TRUE );

        // einen leeren Item-Set gleich loeschen, das spart speater
        // Arbeit
        if( !pItemSet->Count() )
        {
            delete pItemSet;
            pItemSet = 0;
        }
    }

    if( bTxtColl )
    {
        // Ggf. noch ein DropCap-Attribut uebernehmen
        if( bOutStyles && bHardDrop && nDeep != 0 )
        {
            const SfxPoolItem *pItem;
            if( SFX_ITEM_SET==pFmt->GetAttrSet().GetItemState(
                                    RES_PARATR_DROP, TRUE, &pItem ) )
            {
                BOOL bPut = TRUE;
                if( pTemplate )
                {
                    pRefFmt = SwHTMLWriter::GetTemplateFmt( nRefPoolId, pTemplate );
                    const SfxPoolItem *pRefItem;
                    BOOL bRefItemSet =
                        SFX_ITEM_SET==pRefFmt->GetAttrSet().GetItemState(
                                        RES_PARATR_DROP, TRUE, &pRefItem );
                    bPut = !bRefItemSet || *pItem!=*pRefItem;
                }
                if( bPut )
                {
                    ASSERT( !pItemSet, "Wo kommt der ItemSet her?" );
                    pItemSet = new SfxItemSet( *pFmt->GetAttrSet().GetPool(),
                                               pFmt->GetAttrSet().GetRanges() );
                    pItemSet->Put( *pItem );
                }
            }
        }


        // Die diversen default-Abstaende aus der Vorlage oder der
        // Vergleischs-Vorlage merken
        const SvxLRSpaceItem &rLRSpace =
            (pRefFmt ? pRefFmt : pFmt)->GetLRSpace();
        nLeftMargin = rLRSpace.GetTxtLeft();
        nRightMargin = rLRSpace.GetRight();
        nFirstLineIndent = rLRSpace.GetTxtFirstLineOfst();

        const SvxULSpaceItem &rULSpace =
            (pRefFmt ? pRefFmt : pFmt)->GetULSpace();
        nTopMargin = rULSpace.GetUpper();
        nBottomMargin = rULSpace.GetLower();
    }
}

SwHTMLFmtInfo::~SwHTMLFmtInfo()
{
    delete pItemSet;
}

void OutHTML_SwFmt( Writer& rWrt, const SwFmt& rFmt,
                    const SfxItemSet *pNodeItemSet,
                    SwHTMLTxtCollOutputInfo& rInfo )
{
    ASSERT( RES_CONDTXTFMTCOLL==rFmt.Which() || RES_TXTFMTCOLL==rFmt.Which(),
            "keine Absatz-Vorlage" );

    SwHTMLWriter & rHWrt = (SwHTMLWriter&)rWrt;

    // Erstmal ein par Flags ...
    USHORT nNewDefListLvl = 0;
    USHORT nNumStart = USHRT_MAX;
    BOOL bForceDL = FALSE;
    BOOL bDT = FALSE;
    rInfo.bInNumBulList = FALSE;    // Wir sind in einer Liste?
    BOOL bNumbered = FALSE;         // Der aktuelle Absatz ist numeriert
    BOOL bPara = FALSE;             // das aktuelle Token ist <P>
    rInfo.bParaPossible = FALSE;    // ein <P> darf zusaetzlich ausgegeben werden
    BOOL bNoEndTag = FALSE;         // kein End-Tag ausgeben

    rHWrt.bNoAlign = FALSE;         // kein ALIGN=... moeglich
    BOOL bNoStyle = FALSE;          // kein STYLE=... moeglich
    BYTE nBulletGrfLvl = 255;       // Die auszugebende Bullet-Grafik

    // Sind wir in einer Aufzaehlungs- oder Numerierungliste?
    const SwTxtNode* pTxtNd = rWrt.pCurPam->GetNode()->GetTxtNode();
    ULONG nPos = pTxtNd->GetIndex();

    SwHTMLNumRuleInfo aNumInfo;
    if( rHWrt.GetNextNumInfo() )
    {
        aNumInfo = *rHWrt.GetNextNumInfo();
        rHWrt.ClearNextNumInfo();
    }
    else
    {
        aNumInfo.Set( *pTxtNd );
    }

    if( aNumInfo.GetNumRule() )
    {
        rInfo.bInNumBulList = TRUE;
        nNewDefListLvl = 0;

        // ist der aktuelle Absatz numeriert?
        bNumbered = aNumInfo.IsNumbered();
        BYTE nLvl = aNumInfo.GetLevel();

        const SwNodeNum& rAktNum = *pTxtNd->GetNum();
        ASSERT( GetRealLevel( rAktNum.GetLevel() ) == nLvl,
                "Gemerkter Num-Level ist falsch" );
        ASSERT( bNumbered == ((rAktNum.GetLevel() & NO_NUMLEVEL) == 0),
                "Gemerkter Numerierungs-Zustand ist falsch" );

        if( bNumbered )
        {
            nBulletGrfLvl = nLvl; // nur veruebergehend!!!
            nNumStart = rAktNum.GetSetValue();
            DBG_ASSERT( rHWrt.nLastParaToken == 0,
                "<PRE> wurde nicht vor <LI> beendet." );
        }

#ifndef NUM_RELSPACE
        // die Absatz-Abstaende/Einzuege muessen beruecksichtigen,
        // dass wir in einer Liste sind
        rHWrt.nLeftMargin = (nLvl+1) *  HTML_NUMBUL_MARGINLEFT;

        rHWrt.nFirstLineIndent = bNumbered ? HTML_NUMBUL_INDENT : 0;
#endif
    }

    // Jetzt holen wir das Token und ggf. die Klasse
    SwHTMLFmtInfo aFmtInfo( &rFmt );
    USHORT nArrayPos;
    const SwHTMLFmtInfo *pFmtInfo;
    if( rHWrt.aTxtCollInfos.Seek_Entry( &aFmtInfo, &nArrayPos ) )
    {
        pFmtInfo = rHWrt.aTxtCollInfos[nArrayPos];
    }
    else
    {
        pFmtInfo = new SwHTMLFmtInfo( &rFmt, rWrt.pDoc, rHWrt.pTemplate,
                                      rHWrt.bCfgOutStyles,
                                      !rHWrt.IsHTMLMode(HTMLMODE_DROPCAPS) );
        rHWrt.aTxtCollInfos.C40_PTR_INSERT( SwHTMLFmtInfo, pFmtInfo );
    }

    // Jetzt wird festgelegt, was aufgrund des Tokens so moeglich ist
    USHORT nToken = 0;          // Token fuer Tag-Wechsel
    BOOL bOutNewLine = FALSE;   // nur ein LF ausgeben?
    if( pFmtInfo->aToken.Len() )
    {
        // Es ist eine HTML-Tag-Vorlage oder die Vorlage ist von einer
        // solchen abgeleitet
        rInfo.aToken = pFmtInfo->aToken;

        // der erste Buchstabe reicht meistens
        switch( rInfo.aToken.GetChar( 0 ) )
        {
        case 'A':   ASSERT( rInfo.aToken.Equals(sHTML_address),
                            "Doch kein ADDRESS?" );
                    rInfo.bParaPossible = TRUE;
                    rHWrt.bNoAlign = TRUE;
                    break;

        case 'B':   ASSERT( rInfo.aToken.Equals(sHTML_blockquote),
                            "Doch kein BLOCKQUOTE?" );
                    rInfo.bParaPossible = TRUE;
                    rHWrt.bNoAlign = TRUE;
                    break;

        case 'P':   if( rInfo.aToken.Len() == 1 )
                    {
                        bPara = TRUE;
                    }
                    else
                    {
                        ASSERT( rInfo.aToken.Equals(sHTML_preformtxt),
                                "Doch kein PRE?" );
                        if( HTML_PREFORMTXT_ON == rHWrt.nLastParaToken )
                        {
                            bOutNewLine = TRUE;
                        }
                        else
                        {
                            nToken = HTML_PREFORMTXT_ON;
                            rHWrt.bNoAlign = TRUE;
                            bNoEndTag = TRUE;
                        }
                    }
                    break;

        case 'D':   ASSERT( rInfo.aToken.Equals(sHTML_dt) ||
                            rInfo.aToken.Equals(sHTML_dd),
                            "Doch kein DD/DT?" );
                    bDT = rInfo.aToken.Equals(sHTML_dt);
                    rInfo.bParaPossible = !bDT;
                    rHWrt.bNoAlign = TRUE;
                    bForceDL = TRUE;
                    break;
        }
    }
    else
    {
        // alle Vorlagen, die nicht einem HTML-Tag entsprechen oder von
        // diesem abgeleitet sind, werden als <P> exportiert

        rInfo.aToken = sHTML_parabreak;
        bPara = TRUE;
    }

    // Falls noetig, die harte Attributierung der Vorlage uebernehmen
    if( pFmtInfo->pItemSet )
    {
        ASSERT( !rInfo.pItemSet, "Wo kommt der Item-Set her?" );
        rInfo.pItemSet = new SfxItemSet( *pFmtInfo->pItemSet );
    }

    // und noch die harte Attributierung des Absatzes dazunehmen
    if( pNodeItemSet )
    {
        if( rInfo.pItemSet )
            rInfo.pItemSet->Put( *pNodeItemSet );
        else
            rInfo.pItemSet = new SfxItemSet( *pNodeItemSet );
    }

    // den unteren Absatz-Abstand brauchen wir noch
    const SvxULSpaceItem& rULSpace =
        pNodeItemSet ? ((const SvxULSpaceItem &)pNodeItemSet->Get(RES_UL_SPACE))
                     : rFmt.GetULSpace();

    if( (rHWrt.bOutHeader &&
         rWrt.pCurPam->GetPoint()->nNode.GetIndex() ==
            rWrt.pCurPam->GetMark()->nNode.GetIndex()) ||
         rHWrt.bOutFooter )
    {
        if( rHWrt.bCfgOutStyles )
        {
            SvxULSpaceItem aULSpaceItem( rULSpace );
            if( rHWrt.bOutHeader )
                aULSpaceItem.SetLower( rHWrt.nHeaderFooterSpace );
            else
                aULSpaceItem.SetUpper( rHWrt.nHeaderFooterSpace );

            if( !rInfo.pItemSet )
                rInfo.pItemSet = new SfxItemSet(
                                    *rFmt.GetAttrSet().GetPool(),
                                    RES_UL_SPACE, RES_UL_SPACE );
            rInfo.pItemSet->Put( aULSpaceItem );
        }
        rHWrt.bOutHeader = FALSE;
        rHWrt.bOutFooter = FALSE;
    }

    if( bOutNewLine )
    {
        // nur einen Zeilen-Umbruch (ohne Einrueckung) am Absatz-Anfang
        // ausgeben
        rInfo.aToken.Erase();   // kein End-Tag ausgeben
        rWrt.Strm() << SwHTMLWriter::sNewLine;

        return;
    }


    // soll ein ALIGN=... geschrieben werden?
    const SfxPoolItem* pAdjItem = 0;
    const SfxPoolItem* pItem;

    if( rInfo.pItemSet &&
        SFX_ITEM_SET == rInfo.pItemSet->GetItemState( RES_PARATR_ADJUST,
                                                      FALSE, &pItem ) )
    {
        pAdjItem = pItem;
    }

    // Unteren Absatz-Abstand beachten ? (nie im letzen Absatz von
    // Tabellen)
    BOOL bUseParSpace = !rHWrt.bOutTable ||
                        (rWrt.pCurPam->GetPoint()->nNode.GetIndex() !=
                         rWrt.pCurPam->GetMark()->nNode.GetIndex());
    // Wenn Styles exportiert werden, wird aus eingerueckten Absaetzen
    // eine Definitions-Liste
    const SvxLRSpaceItem& rLRSpace =
        pNodeItemSet ? ((const SvxLRSpaceItem &)pNodeItemSet->Get(RES_LR_SPACE))
                     : rFmt.GetLRSpace();
    if( (!rHWrt.bCfgOutStyles || bForceDL) && !rInfo.bInNumBulList )
    {
        USHORT nLeftMargin;
        if( bForceDL )
            nLeftMargin = rLRSpace.GetTxtLeft();
        else
            nLeftMargin = rLRSpace.GetTxtLeft() > pFmtInfo->nLeftMargin
                ? rLRSpace.GetTxtLeft() - pFmtInfo->nLeftMargin
                : 0;

        nNewDefListLvl = (nLeftMargin + (rHWrt.nDefListMargin/2)) /
                         rHWrt.nDefListMargin;

        BOOL bIsNextTxtNode =
            rWrt.pDoc->GetNodes()[rWrt.pCurPam->GetPoint()->nNode.GetIndex()+1]
                     ->IsTxtNode();

        if( bForceDL && bDT )
        {
            // Statt eines DD muessen wir hier auch ein DT der Ebene
            // darueber nehmen
            nNewDefListLvl++;
        }
        else if( !nNewDefListLvl && !rHWrt.bCfgOutStyles && bPara &&
                 rULSpace.GetLower()==0 &&
                 ((bUseParSpace && bIsNextTxtNode) || rHWrt.nDefListLvl==1) &&
                 (!pAdjItem || SVX_ADJUST_LEFT==
                    ((const SvxAdjustItem *)pAdjItem)->GetAdjust()) )
        {
            // Absaetze ohne unteren Abstand als DT exportieren
            nNewDefListLvl = 1;
            bDT = TRUE;
            rInfo.bParaPossible = FALSE;
            rHWrt.bNoAlign = TRUE;
        }
    }

    if( nNewDefListLvl != rHWrt.nDefListLvl )
        rHWrt.OutAndSetDefList( nNewDefListLvl );

    // ggf. eine Aufzaehlung- oder Numerierungsliste beginnen
    if( rInfo.bInNumBulList )
    {
        ASSERT( !rHWrt.nDefListLvl, "DL in OL geht nicht!" );
        OutHTML_NumBulListStart( rHWrt, aNumInfo );

        if( bNumbered )
        {
            if( rHWrt.aBulletGrfs[nBulletGrfLvl].Len()  )
                bNumbered = FALSE;
            else
                nBulletGrfLvl = 255;
        }

#ifndef NUM_RELSPACE
        // Wenn der Ziel-Browser mit horizontalen Absatz-Abstaenden in
        // Listen nicht zurechtkommt, loeschen wir das Item.
        if( !rHWrt.IsHTMLMode( HTMLMODE_LRSPACE_IN_NUMBUL ) &&
            rInfo.pItemSet )
        {
            rInfo.pItemSet->ClearItem( RES_LR_SPACE );
        }
#endif
    }

    // Die Defaults aus der Vorlage merken, denn sie muessen nicht
    // exportiert werden
    rHWrt.nDfltLeftMargin = pFmtInfo->nLeftMargin;
    rHWrt.nDfltRightMargin = pFmtInfo->nRightMargin;
    rHWrt.nDfltFirstLineIndent = pFmtInfo->nFirstLineIndent;

#ifdef NUM_RELSPACE
    if( rInfo.bInNumBulList )
    {
        if( !rHWrt.IsHTMLMode( HTMLMODE_LSPACE_IN_NUMBUL ) )
            rHWrt.nDfltLeftMargin = rLRSpace.GetTxtLeft();

        // In Numerierungs-Listen keinen Ertzeilen-Einzug ausgeben.
        rHWrt.nFirstLineIndent = rLRSpace.GetTxtFirstLineOfst();
    }
#endif

    if( rInfo.bInNumBulList && bNumbered && bPara && !rHWrt.bCfgOutStyles )
    {
        // ein einzelnes LI hat keinen Abstand
        rHWrt.nDfltTopMargin = 0;
        rHWrt.nDfltBottomMargin = 0;
    }
    else if( rHWrt.nDefListLvl && bPara )
    {
        // ein einzelnes DD hat auch keinen Abstand
        rHWrt.nDfltTopMargin = 0;
        rHWrt.nDfltBottomMargin = 0;
    }
    else
    {
        rHWrt.nDfltTopMargin = pFmtInfo->nTopMargin;
        // #60393#: Wenn im letzten Absatz einer Tabelle der
        // untere Absatz-Abstand veraendert wird, vertut sich
        // Netscape total. Deshalb exportieren wir hier erstmal
        // nichts, indem wir den Abstand aus dem Absatz als Default
        // setzen.
        if( rHWrt.bCfgNetscape4 && !bUseParSpace )
            rHWrt.nDfltBottomMargin = rULSpace.GetLower();
        else
            rHWrt.nDfltBottomMargin = pFmtInfo->nBottomMargin;
    }

    if( rHWrt.nDefListLvl )
    {
        rHWrt.nLeftMargin =
            (rHWrt.nDefListLvl-1) * rHWrt.nDefListMargin;
    }

    if( rHWrt.bLFPossible )
        rHWrt.OutNewLine(); // Absatz-Tag in neue Zeile
    rInfo.bOutPara = FALSE;

    // das ist jetzt unser neues Token
    rHWrt.ChangeParaToken( nToken );

    BOOL bHasParSpace = bUseParSpace && rULSpace.GetLower() > 0;

    // ggf ein List-Item aufmachen
    if( rInfo.bInNumBulList && bNumbered )
    {
        ByteString sOut( '<' );
        sOut += sHTML_li;
        if( USHRT_MAX != nNumStart )
            (((sOut += ' ') += sHTML_O_value) += '=')
                += ByteString::CreateFromInt32(nNumStart);
        sOut += '>';
        rWrt.Strm() << sOut.GetBuffer();
    }

    if( rHWrt.nDefListLvl > 0 && !bForceDL )
    {
        HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), bDT ? sHTML_dt : sHTML_dd );
    }

    if( pAdjItem &&
        rHWrt.IsHTMLMode( HTMLMODE_NO_CONTROL_CENTERING ) &&
        rHWrt.HasControls() )
    {
        // #64687#: The align=... attribute does behave strange in netscape
        // if there are controls in a paragraph, because the control and
        // all text behind the control does not recognize this attribute.
        ByteString sOut( '<' );
        sOut += sHTML_division;
        rWrt.Strm() << sOut.GetBuffer();

        rHWrt.bTxtAttr = FALSE;
        rHWrt.bOutOpts = TRUE;
        OutHTML_SvxAdjust( rWrt, *pAdjItem );
        rWrt.Strm() << '>';
        pAdjItem = 0;
        rHWrt.bNoAlign = FALSE;
        rInfo.bOutDiv = TRUE;
        rHWrt.IncIndentLevel();
        rHWrt.bLFPossible = TRUE;
            rHWrt.OutNewLine();
    }

    // fuer BLOCKQUOTE, ADDRESS und DD wird noch ein Absatz-Token
    // ausgegeben, wenn,
    // - keine Styles geschrieben werden, und
    // - ein untere Abstand oder eine Absatz-Ausrichtung existiert
    ByteString aToken = rInfo.aToken;
    if( !rHWrt.bCfgOutStyles && rInfo.bParaPossible && !bPara &&
        (bHasParSpace || pAdjItem) )
    {
        HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), rInfo.aToken.GetBuffer() );
        aToken = sHTML_parabreak;
        bPara = TRUE;
        rHWrt.bNoAlign = FALSE;
        bNoStyle = FALSE;
    }

    // Ein <P> wird nur geschrieben, wenn
    // - wir in keiner OL/UL/DL sind, oder
    // - der Absatz einer OL/UL nicht numeriert ist, oder
    // - keine Styles exportiert werden und
    //      - ein unterer Abstand oder
    //      - eine Absatz-Ausrichtung existiert, ode
    // - Styles exportiert werden und,
    //      - die Textkoerper-Vorlage geaendert wurde, oder
    //      - ein Benutzer-Format exportiert wird, oder
    //      - Absatz-Attribute existieren
    if( !bPara ||
        (!rInfo.bInNumBulList && !rHWrt.nDefListLvl) ||
        (rInfo.bInNumBulList && !bNumbered) ||
        (!rHWrt.bCfgOutStyles && (bHasParSpace || pAdjItem)) ||
        (rHWrt.bCfgOutStyles /*&& rHWrt.bPoolCollTextModified*/) )
    {
        // jetzt werden Optionen ausgegeben
        rHWrt.bTxtAttr = FALSE;
        rHWrt.bOutOpts = TRUE;

        ByteString sOut( '<' );
        sOut += aToken;

        if( rHWrt.bCfgOutStyles && pFmtInfo->aClass.Len() )
        {
            ((sOut += ' ') += sHTML_O_class) += "=\"";
            rWrt.Strm() << sOut.GetBuffer();
            HTMLOutFuncs::Out_String( rWrt.Strm(), pFmtInfo->aClass,
                                      rHWrt.eDestEnc );
            sOut = '\"';
        }
        rWrt.Strm() << sOut.GetBuffer();

        // ggf. Ausrichtung ausgeben.
        if( !rHWrt.bNoAlign && pAdjItem )
            OutHTML_SvxAdjust( rWrt, *pAdjItem );

        // und nun ggf. noch die STYLE-Option
        if( rHWrt.bCfgOutStyles && rInfo.pItemSet && !bNoStyle)
        {
            OutCSS1_ParaTagStyleOpt( rWrt, *rInfo.pItemSet );
        }

        rWrt.Strm() << '>';

        // Soll ein </P> geschrieben wenrden
        rInfo.bOutPara =
            bPara &&
            ( rHWrt.bCfgOutStyles ||
                (!rHWrt.bCfgOutStyles && bHasParSpace) );

        // wenn kein End-Tag geschrieben werden soll, es loeschen
        if( bNoEndTag )
            rInfo.aToken.Erase();
    }

    // ??? Warum nicht ueber den Hint-Mechanismus ???
    if( rHWrt.IsHTMLMode(HTMLMODE_FIRSTLINE) )
    {
        const SvxLRSpaceItem& rLRSpace =
            pNodeItemSet ? ((const SvxLRSpaceItem &)pNodeItemSet->Get(RES_LR_SPACE))
                         : rFmt.GetLRSpace();
        if( rLRSpace.GetTxtFirstLineOfst() > 0 )
        {
            OutHTML_HoriSpacer( rWrt, rLRSpace.GetTxtFirstLineOfst() );
        }
    }

    if( nBulletGrfLvl != 255 )
    {
        ASSERT( aNumInfo.GetNumRule(), "Wo ist die Numerierung geblieben???" );
        ASSERT( nBulletGrfLvl < MAXLEVEL, "So viele Ebenen gibt's nicht" );
        const SwNumFmt& rNumFmt = aNumInfo.GetNumRule()->Get(nBulletGrfLvl);

        OutHTML_BulletImage( rWrt, sHTML_image, 0,
                             rHWrt.aBulletGrfs[nBulletGrfLvl],
                             rNumFmt.GetGrfSize(), rNumFmt.GetGrfOrient() );
    }

    rHWrt.GetNumInfo() = aNumInfo;

    // die Defaults zuruecksetzen
    rHWrt.nDfltLeftMargin = 0;
    rHWrt.nDfltRightMargin = 0;
    rHWrt.nDfltFirstLineIndent = 0;
    rHWrt.nDfltTopMargin = 0;
    rHWrt.nDfltBottomMargin = 0;
    rHWrt.nLeftMargin = 0;
    rHWrt.nFirstLineIndent = 0;
}

void OutHTML_SwFmtOff( Writer& rWrt, const SwHTMLTxtCollOutputInfo& rInfo )
{
    SwHTMLWriter & rHWrt = (SwHTMLWriter&)rWrt;

    // wenn es kein Token gibt haben wir auch nichts auszugeben
    if( !rInfo.aToken.Len() )
    {
        rHWrt.FillNextNumInfo();
        const SwHTMLNumRuleInfo& rNextInfo = *rHWrt.GetNextNumInfo();
        // Auch in PRE muss eine Bullet-Liste beendet werden
        if( rInfo.bInNumBulList )
        {

            const SwHTMLNumRuleInfo& rInfo = rHWrt.GetNumInfo();
            if( rNextInfo.GetNumRule() != rInfo.GetNumRule() ||
                rNextInfo.GetDepth() != rInfo.GetDepth() ||
                rNextInfo.IsNumbered() || rNextInfo.IsRestart() )
                rHWrt.ChangeParaToken( 0 );
            OutHTML_NumBulListEnd( rHWrt, rNextInfo );
        }
        else if( rNextInfo.GetNumRule() != 0 )
            rHWrt.ChangeParaToken( 0 );

        return;
    }

    if( rInfo.ShouldOutputToken() )
    {
        if( rHWrt.bLFPossible )
            rHWrt.OutNewLine( TRUE );

        // fuer BLOCKQUOTE, ADDRESS und DD wird ggf noch ein
        // Absatz-Token ausgegeben, wenn
        // - keine Styles geschrieben werden, und
        // - ein untere Abstand existiert
        if( rInfo.bParaPossible && rInfo.bOutPara )
            HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_parabreak, FALSE );

        HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), rInfo.aToken.GetBuffer(),
                                    FALSE );
        rHWrt.bLFPossible = !rInfo.aToken.Equals( sHTML_dt ) &&
                            !rInfo.aToken.Equals( sHTML_dd ) &&
                            !rInfo.aToken.Equals( sHTML_li );
    }
    if( rInfo.bOutDiv )
    {
        rHWrt.DecIndentLevel();
        if( rHWrt.bLFPossible )
            rHWrt.OutNewLine();
        HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_division, FALSE );
        rHWrt.bLFPossible = TRUE;
    }

    // ggf. eine Aufzaehlung- oder Numerierungsliste beenden
    if( rInfo.bInNumBulList )
    {
        rHWrt.FillNextNumInfo();
        OutHTML_NumBulListEnd( rHWrt, *rHWrt.GetNextNumInfo() );
    }
}


class HTMLSttEndPos
{
    xub_StrLen nStart;
    xub_StrLen nEnd;
    SfxPoolItem* pItem;

public:

    HTMLSttEndPos( const SfxPoolItem& rItem, xub_StrLen nStt, xub_StrLen nE );
    ~HTMLSttEndPos();

    const SfxPoolItem *GetItem() const { return pItem; }

    void SetStart( xub_StrLen nStt ) { nStart = nStt; }
    xub_StrLen GetStart() const { return nStart; }

    xub_StrLen GetEnd() const { return nEnd; }
    void SetEnd( xub_StrLen nE ) { nEnd = nE; }
};

HTMLSttEndPos::HTMLSttEndPos( const SfxPoolItem& rItem, xub_StrLen nStt,
                                                        xub_StrLen nE ) :
    nStart( nStt ),
    nEnd( nE ),
    pItem( rItem.Clone() )
{}

HTMLSttEndPos::~HTMLSttEndPos()
{
    delete pItem;
}

typedef HTMLSttEndPos *HTMLSttEndPosPtr;
SV_DECL_PTRARR( _HTMLEndLst, HTMLSttEndPosPtr, 5, 5 )

enum HTMLOnOffState { HTML_NOT_SUPPORTED,   // nicht unterst. Attribut
                      HTML_REAL_VALUE,      // Attribut mit Wert
                      HTML_ON_VALUE,        // Attribut entspricht On-Tag
                      HTML_OFF_VALUE,       // Attribut entspricht Off-Tag
                      HTML_CHRFMT_VALUE,    // Attribut fuer Zeichenvorlage
                      HTML_COLOR_VALUE,     // Attribut fuer Vordergrundfarbe
                      HTML_STYLE_VALUE,     // Attribut muss als Style exp.
                      HTML_DROPCAP_VALUE }; // DropCap-Attributs


class HTMLEndPosLst
{
    _HTMLEndLst aStartLst;  // nach Anfangs-Psoitionen sortierte Liste
    _HTMLEndLst aEndLst;    // nach End-Psotionen sortierte Liste

    SwDoc *pDoc;            // das aktuelle Dokument
    SwDoc* pTemplate;       // die HTML-Vorlage (oder 0)
    const Color* pDfltColor;// die Default-Vordergrund-Farbe

    ULONG nHTMLMode;
    BOOL bOutStyles : 1;    // werden Styles exportiert


    // die Position eines Items in der Start-/Ende-Liste suchen
    USHORT _FindStartPos( const HTMLSttEndPos *pPos ) const;
    USHORT _FindEndPos( const HTMLSttEndPos *pPos ) const;

    // Eine SttEndPos in die Start- und Ende-Listen eintragen bzw. aus
    // ihnen loeschen, wobei die Ende-Position bekannt ist
    void _InsertItem( HTMLSttEndPos *pPos, USHORT nEndPos );
    void _RemoveItem( USHORT nEndPos );

    // die "Art" es Attributs ermitteln
    HTMLOnOffState GetHTMLItemState( const SfxPoolItem& rItem );

    // Existiert ein bestimmtes On-Tag-Item
    BOOL ExistsOnTagItem( USHORT nWhich, xub_StrLen nPos );

    // Existiert ein Item zum ausschalten eines Attributs, das genauso
    // exportiert wird wie das uebergebene Item im gleichen Bereich?
    BOOL ExistsOffTagItem( USHORT nWhich, xub_StrLen nStartPos,
                                          xub_StrLen nEndPos );


    // das Ende eines gesplitteten Items anpassen
    void FixSplittedItem( HTMLSttEndPos *pPos, USHORT nStartPos,
                          xub_StrLen nNewEnd );

    // Ein Attribut in die Listen eintragen und ggf. aufteilen
    void InsertItem( const SfxPoolItem& rItem, xub_StrLen nStart,
                                               xub_StrLen nEnd );

    // Ein bereits vorhandenes Attribut aufteilen
    void SplitItem( const SfxPoolItem& rItem, xub_StrLen nStart,
                                              xub_StrLen nEnd );


public:

    HTMLEndPosLst( SwDoc *pDoc, SwDoc* pTemplate, const Color* pDfltColor,
                   BOOL bOutStyles, ULONG nHTMLMode );
    ~HTMLEndPosLst();

    // Ein Attribut einfuegen
    void Insert( const SfxPoolItem& rItem, xub_StrLen nStart,  xub_StrLen nEnd,
                 SwHTMLFmtInfos& rFmtInfos, BOOL bParaAttrs=FALSE );
    void Insert( const SfxItemSet& rItemSet, xub_StrLen nStart, xub_StrLen nEnd,
                 SwHTMLFmtInfos& rFmtInfos, BOOL bDeep,
                 BOOL bParaAttrs=FALSE );
    void Insert( const SwDrawFrmFmt& rFmt, xub_StrLen nPos,
                 SwHTMLFmtInfos& rFmtInfos );

    void OutStartAttrs( SwHTMLWriter& rHWrt, xub_StrLen nPos );
    void OutEndAttrs( SwHTMLWriter& rHWrt, xub_StrLen nPos );

    USHORT Count() const { return aEndLst.Count(); }

    BOOL IsHTMLMode( ULONG nMode ) const { return (nHTMLMode & nMode) != 0; }
};


USHORT HTMLEndPosLst::_FindStartPos( const HTMLSttEndPos *pPos ) const
{
    for( USHORT i=0; i<aStartLst.Count() && aStartLst[i]!=pPos;  i++ )
        ;

    ASSERT( i != aStartLst.Count(), "Item nicht in Start-Liste gefunden!" );

    return i==aStartLst.Count() ? USHRT_MAX : i;
}

USHORT HTMLEndPosLst::_FindEndPos( const HTMLSttEndPos *pPos ) const
{
    for( USHORT i=0; i<aEndLst.Count() && aEndLst[i]!=pPos;  i++ )
        ;

    ASSERT( i != aEndLst.Count(), "Item nicht in Ende-Liste gefunden" );

    return i==aEndLst.Count() ? USHRT_MAX : i;
}


void HTMLEndPosLst::_InsertItem( HTMLSttEndPos *pPos, USHORT nEndPos )
{
    // In der Start-Liste das Attribut hinter allen vorher und an
    // der gleichen Position gestarteten Attributen einfuegen
    xub_StrLen nStart = pPos->GetStart();
    for( USHORT i=0; i < aStartLst.Count() &&
                     aStartLst[i]->GetStart() <= nStart; i++ )
        ;
    aStartLst.Insert( pPos, i );

    // die Position in der Ende-Liste wurde uebergeben
    aEndLst.Insert( pPos, nEndPos );
}

void HTMLEndPosLst::_RemoveItem( USHORT nEndPos )
{
    HTMLSttEndPos *pPos = aEndLst[nEndPos];

    // jetzt Suchen wir es in der Start-Liste
    USHORT nStartPos = _FindStartPos( pPos );
    if( nStartPos != USHRT_MAX )
        aStartLst.Remove( nStartPos, 1 );

    aEndLst.Remove( nEndPos, 1 );

    delete pPos;
}

HTMLOnOffState HTMLEndPosLst::GetHTMLItemState( const SfxPoolItem& rItem )
{
    HTMLOnOffState eState = HTML_NOT_SUPPORTED;
    switch( rItem.Which() )
    {
    case RES_CHRATR_POSTURE:
        switch( ((const SvxPostureItem&)rItem).GetPosture() )
        {
        case ITALIC_NORMAL:
            eState = HTML_ON_VALUE;
            break;
        case ITALIC_NONE:
            eState = HTML_OFF_VALUE;
            break;
        default:
            if( IsHTMLMode(HTMLMODE_SOME_STYLES) )
                eState = HTML_STYLE_VALUE;
            break;
        }
        break;

    case RES_CHRATR_CROSSEDOUT:
        switch( ((const SvxCrossedOutItem&)rItem).GetStrikeout() )
        {
        case STRIKEOUT_SINGLE:
        case STRIKEOUT_DOUBLE:
            eState = HTML_ON_VALUE;
            break;
        case STRIKEOUT_NONE:
            eState = HTML_OFF_VALUE;
            break;
        }
        break;

    case RES_CHRATR_ESCAPEMENT:
        switch( (const SvxEscapement)
                        ((const SvxEscapementItem&)rItem).GetEnumValue() )
        {
        case SVX_ESCAPEMENT_SUPERSCRIPT:
        case SVX_ESCAPEMENT_SUBSCRIPT:
            eState = HTML_ON_VALUE;
            break;
        case SVX_ESCAPEMENT_OFF:
            eState = HTML_OFF_VALUE;
            break;
        }
        break;

    case RES_CHRATR_UNDERLINE:
        switch( ((const SvxUnderlineItem&)rItem).GetUnderline() )
        {
        case UNDERLINE_SINGLE:
            eState = HTML_ON_VALUE;
            break;
        case UNDERLINE_NONE:
            eState = HTML_OFF_VALUE;
            break;
        default:
            if( IsHTMLMode(HTMLMODE_SOME_STYLES) )
                eState = HTML_STYLE_VALUE;
            break;
        }
        break;

    case RES_CHRATR_WEIGHT:
        switch( ((const SvxWeightItem&)rItem).GetWeight() )
        {
        case WEIGHT_BOLD:
            eState = HTML_ON_VALUE;
            break;
        case WEIGHT_NORMAL:
            eState = HTML_OFF_VALUE;
            break;
        default:
            if( IsHTMLMode(HTMLMODE_SOME_STYLES) )
                eState = HTML_STYLE_VALUE;
            break;
        }
        break;

    case RES_CHRATR_BLINK:
        if( IsHTMLMode(HTMLMODE_BLINK) )
            eState = ((const SvxBlinkItem&)rItem).GetValue() ? HTML_ON_VALUE
                                                             : HTML_OFF_VALUE;
        break;

    case RES_CHRATR_COLOR:
        eState = HTML_COLOR_VALUE;
        break;

    case RES_CHRATR_FONT:
    case RES_CHRATR_FONTSIZE:
    case RES_TXTATR_INETFMT:
        eState = HTML_REAL_VALUE;
        break;

    case RES_TXTATR_CHARFMT:
        eState = HTML_CHRFMT_VALUE;
        break;

    case RES_CHRATR_CASEMAP:
        if( IsHTMLMode(HTMLMODE_SMALL_CAPS) )
            eState = HTML_STYLE_VALUE;

    case RES_CHRATR_KERNING:
        if( IsHTMLMode(HTMLMODE_FULL_STYLES) )
            eState = HTML_STYLE_VALUE;
        break;

    case RES_CHRATR_BACKGROUND:
        if( IsHTMLMode(HTMLMODE_SOME_STYLES) )
            eState = HTML_STYLE_VALUE;
        break;

    case RES_PARATR_DROP:
        eState = HTML_DROPCAP_VALUE;
        break;

//  default:
//      eState = HTML_NOT_SUPPORTED;
//      break;
    }

    return eState;
}

BOOL HTMLEndPosLst::ExistsOnTagItem( USHORT nWhich, xub_StrLen nPos )
{
    for( USHORT i=0; i<aStartLst.Count(); i++ )
    {
        HTMLSttEndPos *pTest = aStartLst[i];

        if( pTest->GetStart() > nPos )
        {
            // dieses uns alle folgenden Attribute beginnen spaeter
            break;
        }
        else if( pTest->GetEnd() > nPos )
        {
            // das Attribut beginnt vor oder an der aktuellen Position
            // und endet hinter ihr
            const SfxPoolItem *pItem = pTest->GetItem();
            if( pItem->Which() == nWhich &&
                HTML_ON_VALUE == GetHTMLItemState(*pItem) )
            {
                // ein On-Tag-Attibut wurde gefunden
                return TRUE;
            }
        }
    }

    return FALSE;
}

BOOL HTMLEndPosLst::ExistsOffTagItem( USHORT nWhich, xub_StrLen nStartPos,
                                      xub_StrLen nEndPos )
{
    if( nWhich != RES_CHRATR_CROSSEDOUT &&
        nWhich != RES_CHRATR_UNDERLINE &&
        nWhich != RES_CHRATR_BLINK )
    {
        return FALSE;
    }

    for( USHORT i=0; i<aStartLst.Count(); i++ )
    {
        HTMLSttEndPos *pTest = aStartLst[i];

        if( pTest->GetStart() > nStartPos )
        {
            // dieses uns alle folgenden Attribute beginnen spaeter
            break;
        }
        else if( pTest->GetStart()==nStartPos &&
                 pTest->GetEnd()==nEndPos )
        {
            // das Attribut beginnt vor oder an der aktuellen Position
            // und endet hinter ihr
            const SfxPoolItem *pItem = pTest->GetItem();
            USHORT nTstWhich = pItem->Which() ;
            if( (nTstWhich == RES_CHRATR_CROSSEDOUT ||
                 nTstWhich == RES_CHRATR_UNDERLINE ||
                 nTstWhich == RES_CHRATR_BLINK) &&
                HTML_OFF_VALUE == GetHTMLItemState(*pItem) )
            {
                // Ein Off-Tag-Attibut wurde gefunden, das genauso
                // exportiert wird, wie das aktuelle Item
                return TRUE;
            }
        }
    }

    return FALSE;
}

void HTMLEndPosLst::FixSplittedItem( HTMLSttEndPos *pPos, xub_StrLen nNewEnd,
                                     USHORT nStartPos )
{
    // die End-Position entsprechend fixen
    pPos->SetEnd( nNewEnd );

    // das Item aus der End-Liste entfernen
    USHORT nEndPos = _FindEndPos( pPos );
    if( nEndPos != USHRT_MAX )
        aEndLst.Remove( nEndPos, 1 );

    // es wird von nun an als letztes an der entsprechenden Position
    // beendet
    for( nEndPos=0; nEndPos < aEndLst.Count() &&
                    aEndLst[nEndPos]->GetEnd() <= nNewEnd; nEndPos++ )
        ;
    aEndLst.Insert( pPos, nEndPos );

    // jetzt noch die spaeter gestarteten Attribute anpassen
    for( USHORT i=nStartPos+1; i<aStartLst.Count(); i++ )
    {
        HTMLSttEndPos *pTest = aStartLst[i];
        xub_StrLen nTestEnd = pTest->GetEnd();
        if( pTest->GetStart() >= nNewEnd )
        {
            // das Test-Attribut und alle folgenden beginnen, nachdem das
            // gesplittete Attribut endet
            break;
        }
        else if( nTestEnd > nNewEnd )
        {
            // das Test-Attribut beginnt, bevor das gesplittete Attribut
            // endet und endet danach, muss also auch gesplittet werden

            // das neue Ende setzen
            pTest->SetEnd( nNewEnd );

            // das Attribut aus der End-Liste entfernen
            USHORT nEPos = _FindEndPos( pTest );
            if( nEPos != USHRT_MAX )
                aEndLst.Remove( nEPos, 1 );

            // es endet jetzt als erstes Attribut an der entsprechenden
            // Position. Diese Position in der Ende-Liste kennen wir schon.
            aEndLst.Insert(pTest, nEndPos );

            // den "Rest" des Attributs neu einfuegen
            InsertItem( *pTest->GetItem(), nNewEnd, nTestEnd );
        }
    }
}


void HTMLEndPosLst::InsertItem( const SfxPoolItem& rItem, xub_StrLen nStart,
                                                          xub_StrLen nEnd )
{
    for( USHORT i=0; i<aEndLst.Count(); i++ )
    {
        HTMLSttEndPos *pTest = aEndLst[i];
        xub_StrLen nTestEnd = pTest->GetEnd();
        if( nTestEnd <= nStart )
        {
            // das Test-Attribut endet, bevor das neue beginnt
            continue;
        }
        else if( nTestEnd < nEnd )
        {
            // das Test-Attribut endet, bevor das neue endet. Das
            // neue Attribut muss deshalb aufgesplittet werden
            _InsertItem( new HTMLSttEndPos( rItem, nStart, nTestEnd ), i );
            nStart = nTestEnd;
        }
        else
        {
            // das Test-Attribut (und alle folgenden) endet, bevor das neue
            // endet
            break;
        }
    }

    // ein Attribut muss noch eingefuegt werden
    _InsertItem( new HTMLSttEndPos( rItem, nStart, nEnd ), i );
}



void HTMLEndPosLst::SplitItem( const SfxPoolItem& rItem, xub_StrLen nStart,
                                                           xub_StrLen nEnd )
{
    USHORT nWhich = rItem.Which();

    // erstmal muessen wir die alten Items anhand der Startliste suchen
    // und die neuen Item-Bereiche festlegen

    for( USHORT i=0; i<aStartLst.Count(); i++ )
    {
        HTMLSttEndPos *pTest = aStartLst[i];
        xub_StrLen nTestStart = pTest->GetStart();
        xub_StrLen nTestEnd = pTest->GetEnd();

        if( nTestStart >= nEnd )
        {
            // dieses und alle nachfolgenden Attribute beginnen spaeter
            break;
        }
        else if( nTestEnd > nStart )
        {
            // das Test Attribut endet im zu loeschenenden Bereich
            const SfxPoolItem *pItem = pTest->GetItem();

            // nur entsprechende On-Tag Attribute muessen beruecksichtigt
            // werden
            if( pItem->Which() == nWhich &&
                HTML_ON_VALUE == GetHTMLItemState( *pItem ) )
            {
                BOOL bDelete = TRUE;

                if( nTestStart < nStart )
                {
                    // der Start des neuen Attribut entspricht
                    // dem neuen Ende des Attribts
                    FixSplittedItem( pTest, nStart, i );
                    bDelete = FALSE;
                }
                else
                {
                    // das Test-Item beginnt erst hinter dem neuen
                    // Ende des Attribts und kann deshalb komplett
                    // geloescht werden
                    aStartLst.Remove( i, 1 );
                    i--;

                    USHORT nEndPos = _FindEndPos( pTest );
                    if( nEndPos != USHRT_MAX )
                        aEndLst.Remove( nEndPos, 1 );
                }

                // ggf den zweiten Teil des gesplitteten Attribts einfuegen
                if( nTestEnd > nEnd )
                {
                    InsertItem( *pTest->GetItem(), nEnd, nTestEnd );
                }

                if( bDelete )
                    delete pTest;
            }
        }
    }
}

HTMLEndPosLst::HTMLEndPosLst( SwDoc *pD, SwDoc* pTempl,
                              const Color* pDfltCol, BOOL bStyles,
                              ULONG nMode ):
    pDoc( pD ), pTemplate( pTempl ), pDfltColor( pDfltCol ),
    bOutStyles( bStyles ), nHTMLMode( nMode )
{}

HTMLEndPosLst::~HTMLEndPosLst()
{
    ASSERT( !aStartLst.Count(), "Start-Liste im Destruktor nicht leer" );
    ASSERT( !aEndLst.Count(), "End-Liste im Destruktor nicht leer" );
}



void HTMLEndPosLst::Insert( const SfxPoolItem& rItem,
                            xub_StrLen nStart, xub_StrLen nEnd,
                            SwHTMLFmtInfos& rFmtInfos, BOOL bParaAttrs )
{
    // kein Bereich ?? dann nicht aufnehmen, wird nie wirksam !!
    if( nStart != nEnd )
    {
        BOOL bSet = FALSE, bSplit = FALSE;
        switch( GetHTMLItemState(rItem) )
        {
        case HTML_ON_VALUE:
            // das Attribut wird ausgegeben, wenn es nicht sowieso
            // schon an ist
            if( !ExistsOnTagItem( rItem.Which(), nStart ) )
                bSet = TRUE;
            break;

        case HTML_OFF_VALUE:
            // wenn das entsprechne Attribut an ist, wird es gesplittet,
            // Zusaetlich wird es aber als Style ausgegeben, wenn es nicht
            // am ganzen Absatz gesetzt ist, weil es dann ja schon mit dem
            // ABsatz-Tag ausgegeben wurde.
            if( ExistsOnTagItem( rItem.Which(), nStart ) )
                bSplit = TRUE;
            bSet = bOutStyles && !bParaAttrs &&
                   !ExistsOffTagItem( rItem.Which(), nStart, nEnd );
            break;

        case HTML_REAL_VALUE:
            // das Attribut kann immer ausgegeben werden
            bSet = TRUE;
            break;

        case HTML_STYLE_VALUE:
            // Das Attribut kann nur als CSS1 ausgegeben werden. Wenn
            // es am Absatz gesetzt ist, wurde es schon mit dem
            // Absatz-Tag ausgegeben. Einzige Ausnahme ist das
            // Zeichen-Hintergrund-Attribut. Es muss immer wie ein
            // Hint behandelt werden.
            bSet = bOutStyles &&
                   (!bParaAttrs || rItem.Which()==RES_CHRATR_BACKGROUND);
            break;

        case HTML_CHRFMT_VALUE:
            {
                ASSERT( RES_TXTATR_CHARFMT == rItem.Which(),
                        "Doch keine Zeichen-Vorlage" );
                const SwFmtCharFmt& rChrFmt = (const SwFmtCharFmt&)rItem;
                const SwCharFmt* pFmt = rChrFmt.GetCharFmt();

                const SwHTMLFmtInfo *pFmtInfo;
                SwHTMLFmtInfo aFmtInfo( pFmt );
                USHORT nPos;
                if( rFmtInfos.Seek_Entry( &aFmtInfo, &nPos ) )
                {
                    pFmtInfo = rFmtInfos[nPos];
                }
                else
                {
                    pFmtInfo = new SwHTMLFmtInfo( pFmt, pDoc, pTemplate,
                                                  bOutStyles );
                    rFmtInfos.C40_PTR_INSERT( SwHTMLFmtInfo, pFmtInfo );
                }
                if( pFmtInfo->aToken.Len() )
                {
                    // das Zeichenvorlagen-Tag muss vor den harten
                    // Attributen ausgegeben werden
                    InsertItem( rItem, nStart, nEnd );
                }
                if( pFmtInfo->pItemSet )
                {
                    Insert( *pFmtInfo->pItemSet, nStart, nEnd,
                            rFmtInfos, TRUE, bParaAttrs );
                }
            }
            break;

        case HTML_COLOR_VALUE:
            // Eine Vordergrund-Farbe als Absatz-Attribut wird nur
            // exportiert, wenn sie nicht der Default-Farbe entspricht.
            ASSERT( RES_CHRATR_COLOR == rItem.Which(),
                    "Doch keine Vordergrund-Farbe" );
            bSet = !bParaAttrs || !pDfltColor ||
                   !pDfltColor->IsRGBEqual(
                        ((const SvxColorItem&)rItem).GetValue() );
            break;

        case HTML_DROPCAP_VALUE:
            {
                ASSERT( RES_PARATR_DROP == rItem.Which(),
                        "Doch kein Drop-Cap" );
                const SwFmtDrop& rDrop = (const SwFmtDrop&)rItem;
                nEnd = nStart + rDrop.GetChars();
                if( !bOutStyles )
                {
                    // Zumindest die Attribute der Zeichenvorlage uebernehmen
                    const SwCharFmt *pCharFmt = rDrop.GetCharFmt();
                    if( pCharFmt )
                    {
                        Insert( pCharFmt->GetAttrSet(), nStart, nEnd,
                                rFmtInfos, TRUE, bParaAttrs );
                    }
                }
                else
                {
                    bSet = TRUE;
                }
            }
            break;
        }

        if( bSet )
            InsertItem( rItem, nStart, nEnd );
        if( bSplit )
            SplitItem( rItem, nStart, nEnd );
    }
}

void HTMLEndPosLst::Insert( const SfxItemSet& rItemSet,
                            xub_StrLen nStart, xub_StrLen nEnd,
                            SwHTMLFmtInfos& rFmtInfos,
                            BOOL bDeep, BOOL bParaAttrs )
{
    SfxWhichIter aIter( rItemSet );

    USHORT nWhich = aIter.FirstWhich();
    while( nWhich )
    {
        const SfxPoolItem *pItem;
        if( SFX_ITEM_SET == rItemSet.GetItemState( nWhich, bDeep, &pItem ) )
        {
            Insert( *pItem, nStart, nEnd, rFmtInfos, bParaAttrs );
        }

        nWhich = aIter.NextWhich();
    }
}

void HTMLEndPosLst::Insert( const SwDrawFrmFmt& rFmt, xub_StrLen nPos,
                            SwHTMLFmtInfos& rFmtInfos )
{
    // der Type-Cast ist nur noetig, um nicht seinetwegen
    // svdrwobt.hxx zu includem
    const SdrObject* pTextObj =
        (const SdrObject *)SwHTMLWriter::GetMarqueeTextObj( rFmt );

    if( pTextObj )
    {
        // die Edit-Engine-Attribute des Objekts als SW-Attribute holen
        // und als Hints einsortieren. Wegen der Menge der Hints werden
        // Styles hierbei nicht beruecksichtigt!
        const SfxItemSet& rFmtItemSet = rFmt.GetAttrSet();
        SfxItemSet aItemSet( *rFmtItemSet.GetPool(), RES_CHRATR_BEGIN,
                                                     RES_CHRATR_END );
        SwHTMLWriter::GetEEAttrsFromDrwObj( aItemSet, pTextObj, TRUE );
        BOOL bOutStylesOld = bOutStyles;
        bOutStyles = FALSE;
        Insert( aItemSet, nPos, nPos+1, rFmtInfos, FALSE, FALSE );
        bOutStyles = bOutStylesOld;
    }
}

void HTMLEndPosLst::OutStartAttrs( SwHTMLWriter& rHWrt, xub_StrLen nPos )
{
    rHWrt.bTagOn = TRUE;

    // die Attribute in der Start-Liste sind aufsteigend sortiert
    for( USHORT i=0; i< aStartLst.Count(); i++ )
    {
        HTMLSttEndPos *pPos = aStartLst[i];
        xub_StrLen nStart = pPos->GetStart();
        if( nStart > nPos )
        {
            // dieses und alle folgenden Attribute werden erst noch geoeffnet
            break;
        }
        else if( nStart == nPos )
        {
            // das Attribut ausgeben
            Out( aHTMLAttrFnTab, *pPos->GetItem(), rHWrt );
        }
    }
}

void HTMLEndPosLst::OutEndAttrs( SwHTMLWriter& rHWrt, xub_StrLen nPos )
{
    rHWrt.bTagOn = FALSE;

    // die Attribute in der End-Liste sind aufsteigend sortiert
    USHORT i=0;
    while( i < aEndLst.Count() )
    {
        HTMLSttEndPos *pPos = aEndLst[i];
        xub_StrLen nEnd = pPos->GetEnd();

        if( STRING_MAXLEN==nPos || nEnd == nPos )
        {
            Out( aHTMLAttrFnTab, *pPos->GetItem(), rHWrt );
            _RemoveItem( i );
        }
        else if( nEnd > nPos )
        {
            // dieses und alle folgenden Attribute werden erst spaeter beendet
            break;
        }
        else
        {
            // Das Attribut wird vor der aktuellen Position beendet. Das
            // darf nicht sein, aber wie koennen trotzdem damit umgehen
            ASSERT( nEnd >= nPos,
                    "Das Attribut sollte schon laengst beendet sein" );
            i++;
        }
    }
}


/* Ausgabe der Nodes */
Writer& OutHTML_SwTxtNode( Writer& rWrt, const SwCntntNode& rNode )
{
    SwTxtNode * pNd = &((SwTxtNode&)rNode);
    SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;

    const String& rStr = pNd->GetTxt();
    xub_StrLen nEnde = rStr.Len();

    // Besonderheit: leere Node und HR-Vorlage (horizontaler Strich)
    //              nur ein <HR> ausgeben
    USHORT nPoolId = pNd->GetAnyFmtColl().GetPoolFmtId();

    if( !nEnde && (RES_POOLCOLL_HTML_HR==nPoolId ||
                   pNd->GetAnyFmtColl().GetName().EqualsAscii( sHTML_horzrule) ) )
    {
        // dann die absatz-gebundenen Grafiken/OLE-Objekte im Absatz
        // MIB 8.7.97: Ein <PRE> spannen wir um die Linie auf. Dann stimmen
        // zwar die Abstaende nicht, aber sonst bekommen wir einen leeren
        // Absatz hinter dem <HR> und das ist noch unschoener.
        rHTMLWrt.ChangeParaToken( 0 );

        // Alle an dem Node verankerten Rahmen ausgeben
        rHTMLWrt.OutFlyFrm( rNode.GetIndex(), 0, HTML_POS_ANY );

        if( rHTMLWrt.bLFPossible )
            rHTMLWrt.OutNewLine(); // Absatz-Tag in eine neue Zeile

        rHTMLWrt.bLFPossible = TRUE;

        ByteString sOut( '<' );
        sOut += sHTML_horzrule;

        const SfxItemSet* pItemSet = pNd->GetpSwAttrSet();
        if( !pItemSet )
        {
            rWrt.Strm() << sOut.GetBuffer() << '>';
            return rHTMLWrt;
        }
        const SfxPoolItem* pItem;
        if( SFX_ITEM_SET == pItemSet->GetItemState( RES_LR_SPACE, FALSE, &pItem ))
        {
            USHORT nLeft = ((SvxLRSpaceItem*)pItem)->GetLeft();
            USHORT nRight = ((SvxLRSpaceItem*)pItem)->GetRight();
            if( nLeft || nRight )
            {
                const SwFrmFmt& rPgFmt =
                    rHTMLWrt.pDoc->GetPageDescFromPool( RES_POOLPAGE_HTML )->GetMaster();

                const SwFmtFrmSize& rSz   = rPgFmt.GetFrmSize();
                const SvxLRSpaceItem& rLR = rPgFmt.GetLRSpace();
                const SwFmtCol& rCol = rPgFmt.GetCol();

                long nPageWidth = rSz.GetWidth() - rLR.GetLeft() - rLR.GetRight();

                if( 1 < rCol.GetNumCols() )
                    nPageWidth /= rCol.GetNumCols();

                const SwTableNode* pTblNd = pNd->FindTableNode();
                if( pTblNd )
                {
                    const SwTableBox* pBox = pTblNd->GetTable().GetTblBox(
                                    pNd->StartOfSectionIndex() );
                    if( pBox )
                        nPageWidth = pBox->GetFrmFmt()->GetFrmSize().GetWidth();
                }

                ((sOut += ' ') += sHTML_O_width) += '=';
                rWrt.Strm() << sOut.GetBuffer();
                rWrt.OutULong( rHTMLWrt.ToPixel(nPageWidth-nLeft-nRight) );

                ((sOut = ' ') += sHTML_O_align) += '=';
                if( !nLeft )
                    sOut += sHTML_AL_left;
                else if( !nRight )
                    sOut += sHTML_AL_right;
                else
                    sOut += sHTML_AL_center;
            }
        }
        rWrt.Strm() << sOut.GetBuffer();
        if( SFX_ITEM_SET == pItemSet->GetItemState( RES_BOX, FALSE, &pItem ))
        {
            const SvxBoxItem* pBoxItem = (const SvxBoxItem*)pItem;
            const SvxBorderLine* pBorderLine = pBoxItem->GetBottom();
            if( pBorderLine )
            {
                USHORT nWidth = pBorderLine->GetOutWidth() +
                                pBorderLine->GetInWidth() +
                                pBorderLine->GetDistance();
                ((sOut = ' ') += sHTML_O_size) += '=';
                rWrt.Strm() << sOut.GetBuffer();
                rWrt.OutULong( rHTMLWrt.ToPixel(nWidth) );

                const Color& rBorderColor = pBorderLine->GetColor();
                if( !rBorderColor.IsRGBEqual( Color(COL_GRAY) ) )
                {
                    ((sOut = ' ') += sHTML_O_color) += '=';
                    rWrt.Strm() << sOut.GetBuffer();
                    HTMLOutFuncs::Out_Color( rWrt.Strm(), rBorderColor,
                                             rHTMLWrt.eDestEnc );
                }

                if( !pBorderLine->GetInWidth() )
                {
                    (sOut = ' ') += sHTML_O_noshade;
                    rWrt.Strm() << sOut.GetBuffer();
                }
            }
        }
        rWrt.Strm() << '>';
        return rHTMLWrt;
    }

    // Die leeren Nodes mit 2pt Font-Hoehe und der Stand-Vorlage, die
    // vor Tabellen und Bereichen eingefuegt werden, nicht exportieren,
    // Bookmarks oder absatzgebundene Grafiken aber schon.
    // MIB 21.7.97: Ausserdem auch keine leeren Tabellen-Zellen exportieren.
    if( !nEnde && (nPoolId == RES_POOLCOLL_STANDARD ||
                   nPoolId == RES_POOLCOLL_TABLE ||
                   nPoolId == RES_POOLCOLL_TABLE_HDLN) )
    {
        // Der aktuelle Node ist leer und enthaelt Standard-Vorlage ...
        const SfxPoolItem* pItem;
        const SfxItemSet *pItemSet = pNd->GetpSwAttrSet();
        if( pItemSet && pItemSet->Count() &&
            SFX_ITEM_SET == pItemSet->GetItemState( RES_CHRATR_FONTSIZE, FALSE, &pItem ) &&
            40 == ((const SvxFontHeightItem *)pItem)->GetHeight() )
        {
            // ... ausserdem ist die 2pt Schrift eingestellt ...
            ULONG nNdPos = rWrt.pCurPam->GetPoint()->nNode.GetIndex();
            const SwNode *pNextNd = rWrt.pDoc->GetNodes()[nNdPos+1];
            const SwNode *pPrevNd = rWrt.pDoc->GetNodes()[nNdPos-1];
            BOOL bStdColl = nPoolId == RES_POOLCOLL_STANDARD;
            if( ( bStdColl && (pNextNd->IsTableNode() ||
                               pNextNd->IsSectionNode()) ) ||
                ( !bStdColl && pNextNd->IsEndNode() &&
                               pPrevNd->IsStartNode() &&
                               SwTableBoxStartNode==
                                pPrevNd->GetStartNode()->GetStartNodeType() ) )
            {
                // ... und er steht vor einer Tabelle ohne einem Bereich
                rHTMLWrt.OutBookmarks();
                rHTMLWrt.bLFPossible = !rHTMLWrt.nLastParaToken;

                // Alle an dem Node verankerten Rahmen ausgeben
                rHTMLWrt.OutFlyFrm( rNode.GetIndex(), 0, HTML_POS_ANY );
                rHTMLWrt.bLFPossible = FALSE;

                return rWrt;
            }
        }
    }

    // PagePreaks uns PagDescs abfangen
    BOOL bPageBreakBehind = FALSE;
    if( rHTMLWrt.bCfgFormFeed &&
        !(rHTMLWrt.bOutTable || rHTMLWrt.GetFlyFrmFmt()) &&
        rHTMLWrt.pStartNdIdx->GetIndex() !=
        rHTMLWrt.pCurPam->GetPoint()->nNode.GetIndex() )
    {
        BOOL bPageBreakBefore = FALSE;
        const SfxPoolItem* pItem;
        const SfxItemSet* pItemSet = pNd->GetpSwAttrSet();

        if( pItemSet )
        {
            if( SFX_ITEM_SET ==
                pItemSet->GetItemState( RES_PAGEDESC, TRUE, &pItem ) &&
                ((SwFmtPageDesc *)pItem)->GetPageDesc() )
                bPageBreakBefore = TRUE;
            else if( SFX_ITEM_SET ==
                     pItemSet->GetItemState( RES_BREAK, TRUE, &pItem ) )
            {
                switch( ((SvxFmtBreakItem *)pItem)->GetBreak() )
                {
                case SVX_BREAK_PAGE_BEFORE:
                    bPageBreakBefore = TRUE;
                    break;
                case SVX_BREAK_PAGE_AFTER:
                    bPageBreakBehind = TRUE;
                    break;
                case SVX_BREAK_PAGE_BOTH:
                    bPageBreakBefore = TRUE;
                    bPageBreakBehind = TRUE;
                    break;
                }
            }
        }

        if( bPageBreakBefore )
            rWrt.Strm() << '\f';
    }

    // eventuell eine Form oeffnen
    rHTMLWrt.OutForm();

    // An dem Node "verankerte" Seitenegebunde Rahmen ausgeben
    BOOL bFlysLeft = rHTMLWrt.OutFlyFrm( rNode.GetIndex(),
                                         0, HTML_POS_PREFIX );
    // An dem Node verankerte Rahmen ausgeben, die vor dem
    // Absatz-Tag geschrieben werden sollen.
    if( bFlysLeft )
        bFlysLeft = rHTMLWrt.OutFlyFrm( rNode.GetIndex(),
                                        0, HTML_POS_BEFORE );

    if( rHTMLWrt.pCurPam->GetPoint()->nNode == rHTMLWrt.pCurPam->GetMark()->nNode )
        nEnde = rHTMLWrt.pCurPam->GetMark()->nContent.GetIndex();

    // gibt es harte Attribute, die als Optionen geschrieben werden muessen?
    rHTMLWrt.bTagOn = TRUE;

    // jetzt das Tag des Absatzes ausgeben
    const SwFmt& rFmt = pNd->GetAnyFmtColl();
    SwHTMLTxtCollOutputInfo aFmtInfo;
    BOOL bOldLFPossible = rHTMLWrt.bLFPossible;
    OutHTML_SwFmt( rWrt, rFmt, pNd->GetpSwAttrSet(), aFmtInfo );

    // Wenn vor dem Absatz-Tag keine neue Zeile aufgemacht wurde, dann
    // tun wir das jetzt
    rHTMLWrt.bLFPossible = !rHTMLWrt.nLastParaToken;
    if( !bOldLFPossible && rHTMLWrt.bLFPossible )
        rHTMLWrt.OutNewLine();


    // dann die Bookmarks (inkl. End-Tag)
    rHTMLWrt.bOutOpts = FALSE;
    rHTMLWrt.OutBookmarks();

    // jetzt ist noch mal eine gute Gelegenheit fuer ein LF, sofern es noch
    // erlaubt ist
    if( rHTMLWrt.bLFPossible &&
        rHTMLWrt.GetLineLen() >= rHTMLWrt.nWhishLineLen )
    {
        rHTMLWrt.OutNewLine();
    }
    rHTMLWrt.bLFPossible = FALSE;

    // Text, der aus einer Outline-Numerierung kommt ermitteln
    xub_StrLen nOffset = 0;
    String aOutlineTxt;
    if( pNd->GetOutlineNum() && !pNd->GetNum() )
    {
        aOutlineTxt = pNd->GetNumString();
        nOffset += aOutlineTxt.Len();
    }
    if( rHTMLWrt.pFmtFtn )
        nOffset += rHTMLWrt.GetFootEndNoteSymLen( *rHTMLWrt.pFmtFtn );

    // gibt es harte Attribute, die als Tags geschrieben werden muessen?
    HTMLEndPosLst aEndPosLst( rWrt.pDoc, rHTMLWrt.pTemplate,
                              rHTMLWrt.pDfltColor, rHTMLWrt.bCfgOutStyles,
                              rHTMLWrt.GetHTMLMode() );
    if( aFmtInfo.pItemSet )
    {
        aEndPosLst.Insert( *aFmtInfo.pItemSet, 0, nEnde + nOffset,
                           rHTMLWrt.aChrFmtInfos, FALSE, TRUE );
    }


    if( aOutlineTxt.Len() || rHTMLWrt.pFmtFtn )
    {
        // Absatz-Attribute ausgeben, damit der Text die Attribute des
        // Absatzes bekommt.
        aEndPosLst.OutStartAttrs( rHTMLWrt, 0 );

        // Theoretisch muesste man hier die Zeichen-Vorlage der Numerierung
        // beachten. Da man die ueber die UI nicht setzen kann, ignorieren
        // wir sie erstmal.

        if( aOutlineTxt.Len() )
            HTMLOutFuncs::Out_String( rWrt.Strm(), aOutlineTxt,
                                         rHTMLWrt.eDestEnc );

        if( rHTMLWrt.pFmtFtn )
        {
            rHTMLWrt.OutFootEndNoteSym( *rHTMLWrt.pFmtFtn );
            rHTMLWrt.pFmtFtn = 0;
        }
    }

    // erstmal den Start berichtigen. D.h. wird nur ein Teil vom Satz
    // ausgegeben, so muessen auch da die Attribute stimmen!!
    rHTMLWrt.bTxtAttr = TRUE;

    USHORT nAttrPos = 0;
    xub_StrLen nStrPos = rHTMLWrt.pCurPam->GetPoint()->nContent.GetIndex();
    const SwTxtAttr * pHt = 0;
    USHORT nCntAttr = pNd->HasHints() ? pNd->GetSwpHints().Count() : 0;
    if( nCntAttr && nStrPos > *( pHt = pNd->GetSwpHints()[ 0 ] )->GetStart() )
    {
        // Ok, es gibt vorher Attribute, die ausgegeben werden muessen
        do {
            aEndPosLst.OutEndAttrs( rHTMLWrt, nStrPos + nOffset );

            nAttrPos++;
            if( RES_TXTATR_FIELD == pHt->Which() )      // Felder nicht
                continue;                               // ausgeben

            if( pHt->GetEnd() )
            {
                xub_StrLen nHtEnd = *pHt->GetEnd(),
                       nHtStt = *pHt->GetStart();
                if( !rHTMLWrt.bWriteAll && nHtEnd <= nStrPos )
                    continue;

                // leere Hints am Anfang nicht beachten, oder ??
                if( nHtEnd == nHtStt )
                    continue;

                // Attribut in die Liste aufnehemen
                if( rHTMLWrt.bWriteAll )
                    aEndPosLst.Insert( pHt->GetAttr(), nHtStt + nOffset,
                                       nHtEnd + nOffset,
                                       rHTMLWrt.aChrFmtInfos );
                else
                {
                    xub_StrLen nTmpStt = nHtStt < nStrPos ? nStrPos : nHtStt;
                    xub_StrLen nTmpEnd = nHtEnd < nEnde ? nHtEnd : nEnde;
                    aEndPosLst.Insert( pHt->GetAttr(), nTmpStt + nOffset,
                                       nTmpEnd + nOffset,
                                       rHTMLWrt.aChrFmtInfos );
                }
                continue;
                // aber nicht ausgeben, das erfolgt spaeter !!
            }

        } while( nAttrPos < nCntAttr && nStrPos >
            *( pHt = pNd->GetSwpHints()[ nAttrPos ] )->GetStart() );

        // dann gebe mal alle gesammelten Attribute von der String-Pos aus
        aEndPosLst.OutEndAttrs( rHTMLWrt, nStrPos + nOffset );
        aEndPosLst.OutStartAttrs( rHTMLWrt, nStrPos + nOffset );
    }

    BOOL bWriteBreak = (HTML_PREFORMTXT_ON != rHTMLWrt.nLastParaToken);
    if( bWriteBreak && pNd->GetNum() &&
        NO_NUMBERING != pNd->GetNum()->GetLevel() )
        bWriteBreak = FALSE;

    xub_StrLen nPreSplitPos = 0;
    for( ; nStrPos < nEnde; nStrPos++ )
    {
        aEndPosLst.OutEndAttrs( rHTMLWrt, nStrPos + nOffset );

        // Die an der aktuellen Position verankerten Rahmen ausgeben
        if( bFlysLeft )
            bFlysLeft = rHTMLWrt.OutFlyFrm( rNode.GetIndex(),
                                            nStrPos, HTML_POS_INSIDE );

        BOOL bOutChar = TRUE;
        const SwTxtAttr * pTxtHt = 0;
        if( nAttrPos < nCntAttr && *pHt->GetStart() == nStrPos
            && nStrPos != nEnde )
        {
            do {
                if( pHt->GetEnd() )
                {
                    if( RES_CHRATR_KERNING == pHt->Which() &&
                        rHTMLWrt.IsHTMLMode(HTMLMODE_FIRSTLINE) &&
                        *pHt->GetEnd() - nStrPos == 1 &&
                        ' ' == rStr.GetChar(nStrPos) &&
                        ((const SvxKerningItem&)pHt->GetAttr()).GetValue() > 0 )
                    {
                        // Wenn erlaubt, wird das Ding als Spacer exportiert

                        bOutChar = FALSE;   // Space nicht ausgeben
                        bWriteBreak = FALSE;    // der Absatz ist aber auch nicht leer

                        OutHTML_HoriSpacer( rWrt,
                            ((const SvxKerningItem&)pHt->GetAttr()).GetValue() );

                        // Der Hint braucht nun doch nicht weiter
                        // beruecksichtigt werden.
                    }
                    else if( *pHt->GetEnd() != nStrPos )
                    {
                        // Hints mit Ende einsortieren, wenn sie keinen
                        // leeren Bereich aufspannen (Hints, die keinen
                        // Bereich aufspannen werden ignoriert
                        aEndPosLst.Insert( pHt->GetAttr(), nStrPos + nOffset,
                                           *pHt->GetEnd() + nOffset,
                                           rHTMLWrt.aChrFmtInfos );
                    }
                    else
                    {
#if 0
                        // leere Hinst gleich ausgeben
                        rHTMLWrt.bTagOn = TRUE;
                        Out( aHTMLAttrFnTab, pHt->GetAttr(), rHTMLWrt );
                        rHTMLWrt.bTagOn = FALSE;
                        Out( aHTMLAttrFnTab, pHt->GetAttr(), rHTMLWrt );
#endif
                    }
                }
                else
                {
                    // Hints ohne-Ende werden als letztes ausgebeben
                    ASSERT( !pTxtHt,
                            "Wieso gibt es da schon ein Attribut ohne Ende?" );
                    if( rHTMLWrt.nTxtAttrsToIgnore>0 )
                    {
                        rHTMLWrt.nTxtAttrsToIgnore--;
                    }
                    else
                    {
                        pTxtHt = pHt;
                        bWriteBreak = FALSE;    // der Absatz ist aber auch nicht leer
                    }
                    bOutChar = FALSE;       // keine 255 ausgeben
                }
            } while( ++nAttrPos < nCntAttr && nStrPos ==
                *( pHt = pNd->GetSwpHints()[ nAttrPos ] )->GetStart() );
        }

        // Manche Draw-Formate koennen auch noch Attribute mitbringen
        if( pTxtHt && RES_TXTATR_FLYCNT == pTxtHt->Which() )
        {
            const SwFrmFmt* pFrmFmt =
                ((const SwFmtFlyCnt &)pTxtHt->GetAttr()).GetFrmFmt();

            if( RES_DRAWFRMFMT == pFrmFmt->Which() )
                aEndPosLst.Insert( *((const SwDrawFrmFmt *)pFrmFmt),
                                    nStrPos + nOffset,
                                    rHTMLWrt.aChrFmtInfos );
        }

        aEndPosLst.OutEndAttrs( rHTMLWrt, nStrPos + nOffset );
        aEndPosLst.OutStartAttrs( rHTMLWrt, nStrPos + nOffset );

        if( pTxtHt )
        {
            rHTMLWrt.bLFPossible = !rHTMLWrt.nLastParaToken && nStrPos > 0 &&
                                   rStr.GetChar(nStrPos-1) == ' ';
            Out( aHTMLAttrFnTab, pTxtHt->GetAttr(), rHTMLWrt );
            rHTMLWrt.bLFPossible = FALSE;
        }

        if( bOutChar )
        {
            sal_Unicode c = rStr.GetChar( nStrPos );
            // versuche nach ungefaehr 255 Zeichen eine neue Zeile zu
            // beginnen, aber nicht in PRE und nur bei Spaces
            // MIB 15.4.99: Auf Wunsch von ST wird in Mails auch in einem
            // PRE ganz bewusst umgebrocheni (#64159#).
            if( ' '==c && (!rHTMLWrt.nLastParaToken || rHTMLWrt.HasCId()) )
            {
                xub_StrLen nLineLen;
                if( rHTMLWrt.nLastParaToken )
                    nLineLen = nStrPos - nPreSplitPos;
                else
                    nLineLen = rHTMLWrt.GetLineLen();

                xub_StrLen nWordLen = rStr.Search( ' ', nStrPos+1 );
                if( nWordLen == STRING_NOTFOUND )
                    nWordLen = nEnde;
                nWordLen -= nStrPos;

                if( nLineLen >= rHTMLWrt.nWhishLineLen ||
                    (nLineLen+nWordLen) >= rHTMLWrt.nWhishLineLen )
                {
                    rHTMLWrt.OutNewLine();
                    bOutChar = FALSE;
                    if( rHTMLWrt.nLastParaToken )
                        nPreSplitPos = nStrPos+1;
                }
            }

            if( bOutChar )
            {
                if( 0x0a == c )
                    HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_linebreak );
                else
                    HTMLOutFuncs::Out_Char( rWrt.Strm(), c, rHTMLWrt.eDestEnc );

                // Wenn das letzte Zeichen eines Absatzed ein harter
                // Zeilen-Umbruch ist brauchen wir noch ein <BR> mehr, weil
                // Netscape & Co in diesem Fall fuer den naechsten Absatz
                // nicht in die naechste Zeile gehen.
                bWriteBreak = (0x0a == c) &&
                              (HTML_PREFORMTXT_ON != rHTMLWrt.nLastParaToken);
            }
        }
    }


    BOOL bEndAttrsWritten = aEndPosLst.Count() > 0;
    aEndPosLst.OutEndAttrs( rHTMLWrt, STRING_MAXLEN );

    // Die an der letzten Position verankerten Rahmen ausgeben
    if( bFlysLeft )
        bFlysLeft = rHTMLWrt.OutFlyFrm( rNode.GetIndex(),
                                       nEnde, HTML_POS_INSIDE );
    ASSERT( !bFlysLeft, "Es wurden nicht alle Rahmen gespeichert!" );

    rHTMLWrt.bTxtAttr = FALSE;

    if( bWriteBreak )
    {
        BOOL bEndOfCell = rHTMLWrt.bOutTable &&
                         rWrt.pCurPam->GetPoint()->nNode.GetIndex() ==
                         rWrt.pCurPam->GetMark()->nNode.GetIndex();

        if( bEndOfCell && !nEnde &&
            rHTMLWrt.IsHTMLMode(HTMLMODE_NBSP_IN_TABLES) )
        {
            // Wenn der letzte Absatz einer Tabellezelle leer ist und
            // wir fuer den MS-IE exportieren, schreiben wir statt eines
            // <BR> ein &nbsp;
            rWrt.Strm() << '&' << sHTML_S_nbsp << ';';
        }
        else
        {
            HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_linebreak );
            const SvxULSpaceItem& rULSpace =
                (const SvxULSpaceItem &)pNd->GetSwAttrSet().Get(RES_UL_SPACE);
            if( rULSpace.GetLower() > 0 && !bEndOfCell &&
                !rHTMLWrt.IsHTMLMode(HTMLMODE_NO_BR_AT_PAREND) )
                HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_linebreak );
            rHTMLWrt.bLFPossible = TRUE;
        }
    }

    if( rHTMLWrt.bClearLeft || rHTMLWrt.bClearRight )
    {
        const sal_Char *pStr;
        if( rHTMLWrt.bClearLeft )
        {
            if( rHTMLWrt.bClearRight )
                pStr = sHTML_AL_all;
            else
                pStr = sHTML_AL_left;
        }
        else
            pStr = sHTML_AL_right;

        ByteString sOut( sHTML_linebreak );
        (((sOut += ' ') += sHTML_O_clear) += '=') += pStr;

        HTMLOutFuncs::Out_AsciiTag( rHTMLWrt.Strm(), sOut.GetBuffer() );
        rHTMLWrt.bClearLeft = FALSE;
        rHTMLWrt.bClearRight = FALSE;

        rHTMLWrt.bLFPossible = TRUE;
    }

    // wenn ein LF nicht schon erlaubt ist wird es erlaubt, wenn der
    // Absatz mit einem ' ' endet
    if( !rHTMLWrt.bLFPossible && !rHTMLWrt.nLastParaToken &&
        nEnde > 0 && ' ' == rStr.GetChar(nEnde-1) )
        rHTMLWrt.bLFPossible = TRUE;

    rHTMLWrt.bTagOn = FALSE;
    OutHTML_SwFmtOff( rWrt, aFmtInfo );

    // eventuell eine Form schliessen
    rHTMLWrt.OutForm( FALSE );

    if( bPageBreakBehind )
        rWrt.Strm() << '\f';

    return rHTMLWrt;
}


ULONG SwHTMLWriter::ToPixel( ULONG nVal ) const
{
    if( Application::GetDefaultDevice() && nVal )
    {
        nVal = Application::GetDefaultDevice()->LogicToPixel(
                    Size( nVal, nVal ), MapMode( MAP_TWIP ) ).Width();
        if( !nVal )     // wo ein Twip ist sollte auch ein Pixel sein
            nVal = 1;
    }
    return nVal;
}


static Writer& OutHTML_CSS1Attr( Writer& rWrt, const SfxPoolItem& rHt )
{
    // wenn gerade Hints geschrieben werden versuchen wir den Hint als
    // CSS1-Attribut zu schreiben

    if( ((SwHTMLWriter&)rWrt).bCfgOutStyles && ((SwHTMLWriter&)rWrt).bTxtAttr )
        OutCSS1_HintSpanTag( rWrt, rHt );

    return rWrt;
}


/* File CHRATR.HXX: */

static Writer& OutHTML_SvxColor( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
    if( rHTMLWrt.bOutOpts )
        return rWrt;

    const Color& rColor = ((const SvxColorItem&)rHt).GetValue();

    // die Default-Farbe nur Schreiben, wenn sie als Hint vorkommt
    //if( rHTMLWrt.bTagOn && !rHTMLWrt.bTxtAttr && rHTMLWrt.pDfltColor
    //  && rColor == *rHTMLWrt.pDfltColor )
    //  return rWrt;

    if( !rHTMLWrt.bTxtAttr && rHTMLWrt.bCfgOutStyles && rHTMLWrt.bCfgPreferStyles )
    {
        // Font-Farbe nicht als Tag schreiben, wenn Styles normalen Tags
        // vorgezogen werden
        return rWrt;
    }

    if( rHTMLWrt.bTagOn )
    {
        ByteString sOut( '<' );
        (((sOut += sHTML_font) += ' ') += sHTML_O_color) += '=';
        rWrt.Strm() << sOut.GetBuffer();
        HTMLOutFuncs::Out_Color( rWrt.Strm(), rColor ) << '>';
    }
    else
        HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_font, FALSE );

    return rWrt;
}


static Writer& OutHTML_SwPosture( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
    if( rHTMLWrt.bOutOpts )
        return rWrt;

    const FontItalic nPosture = ((const SvxPostureItem&)rHt).GetPosture();
    if( ITALIC_NORMAL == nPosture )
    {
        HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_italic, rHTMLWrt.bTagOn );
    }
    else if( rHTMLWrt.bCfgOutStyles && rHTMLWrt.bTxtAttr )
    {
        // vielleicht als CSS1-Attribut ?
        OutCSS1_HintSpanTag( rWrt, rHt );
    }

    return rWrt;
}

static Writer& OutHTML_SvxFont( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
    if( rHTMLWrt.bOutOpts )
        return rWrt;

    if( rHTMLWrt.bTagOn )
    {
        String aNames;
        SwHTMLWriter::PrepareFontList( ((const SvxFontItem&)rHt), aNames, 0,
                           rHTMLWrt.IsHTMLMode(HTMLMODE_FONT_GENERIC) );
        ByteString sOut( '<' );
        (((sOut += sHTML_font) += ' ') += sHTML_O_face) += "=\"";
        rWrt.Strm() << sOut.GetBuffer();
        HTMLOutFuncs::Out_String( rWrt.Strm(), aNames, rHTMLWrt.eDestEnc )
            << "\">";
    }
    else
        HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_font , FALSE );

    return rWrt;
}

static Writer& OutHTML_SvxFontHeight( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
    if( rHTMLWrt.bOutOpts )
        return rWrt;

    if( rHTMLWrt.bTagOn )
    {
        ByteString sOut( '<' );
        sOut += sHTML_font;

        UINT32 nHeight = ((const SvxFontHeightItem&)rHt).GetHeight();
        USHORT nSize = rHTMLWrt.GetHTMLFontSize( nHeight );
        (((sOut += ' ') += sHTML_O_size) += '=')
            += ByteString::CreateFromInt32( nSize );
        rWrt.Strm() << sOut.GetBuffer();

        if( rHTMLWrt.bCfgOutStyles && rHTMLWrt.bTxtAttr &&
            rHTMLWrt.aFontHeights[nSize-1] != nHeight )
        {
            // wenn die Groesse keiner HTML-Groesse entspricht,
            // wird sie noch zusatzlich als Style-Option exportiert
            OutCSS1_HintStyleOpt( rWrt, rHt );
        }
        rWrt.Strm() << '>';
    }
    else
    {
        HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_font, FALSE );
    }

    return rWrt;
}

static Writer& OutHTML_SwWeight( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
    if( rHTMLWrt.bOutOpts )
        return rWrt;

    const FontWeight nBold = ((const SvxWeightItem&)rHt).GetWeight();
    if( WEIGHT_BOLD == nBold )
    {
        HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_bold, rHTMLWrt.bTagOn );
    }
    else if( rHTMLWrt.bCfgOutStyles && rHTMLWrt.bTxtAttr )
    {
        // vielleicht als CSS1-Attribut ?
        OutCSS1_HintSpanTag( rWrt, rHt );
    }

    return rWrt;
}


static Writer& OutHTML_SwCrossedOut( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
    if( rHTMLWrt.bOutOpts )
        return rWrt;

    // Wegen Netscape schrieben wir hier STRIKE und nicht S raus!
    const FontStrikeout nStrike = ((const SvxCrossedOutItem&)rHt).GetStrikeout();
    if( STRIKEOUT_NONE != nStrike )
    {
        HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_strike, rHTMLWrt.bTagOn );
    }
    else if( rHTMLWrt.bCfgOutStyles && rHTMLWrt.bTxtAttr )
    {
        // vielleicht als CSS1-Attribut ?
        OutCSS1_HintSpanTag( rWrt, rHt );
    }

    return rWrt;
}


static Writer& OutHTML_SvxEscapement( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
    if( rHTMLWrt.bOutOpts )
        return rWrt;

    const SvxEscapement eEscape =
        (const SvxEscapement)((const SvxEscapementItem&)rHt).GetEnumValue();
    const sal_Char *pStr = 0;
    switch( eEscape )
    {
    case SVX_ESCAPEMENT_SUPERSCRIPT: pStr = sHTML_superscript; break;
    case SVX_ESCAPEMENT_SUBSCRIPT: pStr = sHTML_subscript; break;
    }

    if( pStr )
    {
        HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), pStr, rHTMLWrt.bTagOn );
    }
    else if( rHTMLWrt.bCfgOutStyles && rHTMLWrt.bTxtAttr )
    {
        // vielleicht als CSS1-Attribut ?
        OutCSS1_HintSpanTag( rWrt, rHt );
    }

    return rWrt;
}



static Writer& OutHTML_SwUnderline( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
    if( rHTMLWrt.bOutOpts )
        return rWrt;

    const FontUnderline eUnder = ((const SvxUnderlineItem&)rHt).GetUnderline();
    if( UNDERLINE_NONE != eUnder )
    {
        HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_underline, rHTMLWrt.bTagOn );
    }
    else if( rHTMLWrt.bCfgOutStyles && rHTMLWrt.bTxtAttr )
    {
        // vielleicht als CSS1-Attribut ?
        OutCSS1_HintSpanTag( rWrt, rHt );
    }

    return rWrt;
}


static Writer& OutHTML_SwFlyCnt( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
    SwFmtFlyCnt& rFlyCnt = (SwFmtFlyCnt&)rHt;

    const SwFrmFmt& rFmt = *rFlyCnt.GetFrmFmt();
    const SdrObject *pSdrObj = 0;

    SwHTMLFrmType eType =
        (SwHTMLFrmType)rHTMLWrt.GuessFrmType( rFmt, pSdrObj );
    BYTE nMode = aHTMLOutFrmAsCharTable[eType][rHTMLWrt.nExportMode];
    rHTMLWrt.OutFrmFmt( nMode, rFmt, pSdrObj );
    return rWrt;
}

static Writer& OutHTML_SwHardBlank( Writer& rWrt, const SfxPoolItem& rHt )
{
    HTMLOutFuncs::Out_Char( rWrt.Strm(), ((SwFmtHardBlank&)rHt).GetChar(),
                            ((SwHTMLWriter&)rWrt).eDestEnc );
    return rWrt;
}

// Das ist jetzt unser Blink-Item. Blinkend wird eingeschaltet, indem man
// das Item auf TRUE setzt!
static Writer& OutHTML_SwBlink( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
    if( rHTMLWrt.bOutOpts || !rHTMLWrt.IsHTMLMode(HTMLMODE_BLINK) )
        return rWrt;

    if( ((const SvxBlinkItem&)rHt).GetValue() )
    {
        HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_blink, rHTMLWrt.bTagOn );
    }
    else if( rHTMLWrt.bCfgOutStyles && rHTMLWrt.bTxtAttr )
    {
        // vielleicht als CSS1-Attribut ?
        OutCSS1_HintSpanTag( rWrt, rHt );
    }

    return rWrt;
}

Writer& OutHTML_INetFmt( Writer& rWrt, const SwFmtINetFmt& rINetFmt, BOOL bOn )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;

    String aURL( rINetFmt.GetValue() );
    const SvxMacroTableDtor *pMacTable = rINetFmt.GetMacroTbl();
    BOOL bEvents = pMacTable != 0 && pMacTable->Count() > 0;

    // Gibt es ueberhaupt etwas auszugeben?
    if( !aURL.Len() && !bEvents && !rINetFmt.GetName().Len() )
        return rWrt;

    // Tag aus? Dann nur ein </A> ausgeben.
    if( !bOn )
    {
        HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_anchor, FALSE );
        return rWrt;
    }

    ByteString sOut( '<' );
    sOut += sHTML_anchor;
    rWrt.Strm() << sOut.GetBuffer();

#define REL_HACK
#ifdef REL_HACK
    String sRel;
#endif

    if( aURL.Len() || bEvents )
    {
#ifdef REL_HACK
        String sTmp( aURL );
        sTmp.ToUpperAscii();
        xub_StrLen nPos = sTmp.SearchAscii( "\" REL=" );
        if( nPos!=STRING_NOTFOUND )
        {
            sRel = aURL.Copy( nPos+1 );
            aURL.Erase( nPos );
        }
#endif
        aURL.EraseLeadingChars().EraseTrailingChars();

        ((sOut = ' ') += sHTML_O_href) += "=\"";
        rWrt.Strm() << sOut.GetBuffer();
        aURL = INetURLObject::AbsToRel( aURL, INetURLObject::WAS_ENCODED,
                                        INetURLObject::DECODE_WITH_CHARSET );
        HTMLOutFuncs::Out_String( rWrt.Strm(), aURL, rHTMLWrt.eDestEnc );
        sOut = '\"';
    }
    else
        sOut.Erase();

    if( rINetFmt.GetName().Len() )
    {
        ((sOut += ' ') += sHTML_O_name) += "=\"";
        rWrt.Strm() << sOut.GetBuffer();
        HTMLOutFuncs::Out_String( rWrt.Strm(), rINetFmt.GetName(),
                                  rHTMLWrt.eDestEnc );
        sOut = '\"';
    }

    const String& rTarget = rINetFmt.GetTargetFrame();
    if( rTarget.Len() )
    {
        ((sOut += ' ') += sHTML_O_target) += "=\"";
        rWrt.Strm() << sOut.GetBuffer();
        HTMLOutFuncs::Out_String( rWrt.Strm(), rTarget, rHTMLWrt.eDestEnc );
        sOut = '\"';
    }

#ifdef REL_HACK
    if( sRel.Len() )
        sOut += ByteString( sRel, RTL_TEXTENCODING_ASCII_US );
#endif
    if( sOut.Len() )
        rWrt.Strm() << sOut.GetBuffer();

    if( bEvents )
        HTMLOutFuncs::Out_Events( rWrt.Strm(), *pMacTable, aAnchorEventTable,
                                  rHTMLWrt.bCfgStarBasic, rHTMLWrt.eDestEnc );
    rWrt.Strm() << ">";

    return rWrt;
}

static Writer& OutHTML_SwFmtINetFmt( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;

    if( rHTMLWrt.bOutOpts )
        return rWrt;

    const SwFmtINetFmt& rINetFmt = (const SwFmtINetFmt&)rHt;

    if( rHTMLWrt.bTagOn )
    {
        // ggf. ein noch offenes Attribut voruebergehend beenden
        if( rHTMLWrt.aINetFmts.Count() )
        {
            SwFmtINetFmt *pINetFmt =
                rHTMLWrt.aINetFmts[ rHTMLWrt.aINetFmts.Count()-1 ];
            OutHTML_INetFmt( rWrt, *pINetFmt, FALSE );
        }

        // jetzt das neue aufmachen
        OutHTML_INetFmt( rWrt, rINetFmt, TRUE );

        // und merken
        const SwFmtINetFmt *pINetFmt = new SwFmtINetFmt( rINetFmt );
        rHTMLWrt.aINetFmts.C40_INSERT( SwFmtINetFmt, pINetFmt,
                                       rHTMLWrt.aINetFmts.Count() );
    }
    else
    {
        // das
        OutHTML_INetFmt( rWrt, rINetFmt, FALSE );

        ASSERT( rHTMLWrt.aINetFmts.Count(), "da fehlt doch ein URL-Attribut" );
        if( rHTMLWrt.aINetFmts.Count() )
        {
            // das eigene Attribut vom Stack holen
            SwFmtINetFmt *pINetFmt =
                rHTMLWrt.aINetFmts[ rHTMLWrt.aINetFmts.Count()-1 ];

            rHTMLWrt.aINetFmts.Remove( rHTMLWrt.aINetFmts.Count()-1, 1 );
            delete pINetFmt;
        }

        if( rHTMLWrt.aINetFmts.Count() )
        {
            // es ist noch ein Attribut auf dem Stack, das wieder geoeffnet
            // werden muss
            SwFmtINetFmt *pINetFmt =
                rHTMLWrt.aINetFmts[ rHTMLWrt.aINetFmts.Count()-1 ];
            OutHTML_INetFmt( rWrt, *pINetFmt, TRUE );
        }
    }

    return rWrt;
}

static Writer& OutHTML_SwTxtCharFmt( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
    if( rHTMLWrt.bOutOpts )
        return rWrt;

    const SwFmtCharFmt& rChrFmt = (const SwFmtCharFmt&)rHt;
    const SwCharFmt* pFmt = rChrFmt.GetCharFmt();

    if( !pFmt )
    {
        return rWrt;
    }

    SwHTMLFmtInfo aFmtInfo( pFmt );
    USHORT nPos;
    if( !rHTMLWrt.aChrFmtInfos.Seek_Entry( &aFmtInfo, &nPos ) )
        return rWrt;

    const SwHTMLFmtInfo *pFmtInfo = rHTMLWrt.aChrFmtInfos[nPos];
    ASSERT( pFmtInfo, "Wieso gint es keine Infos ueber die Zeichenvorlage?" );

    if( rHTMLWrt.bTagOn )
    {
        ByteString sOut( '<' );
        if( pFmtInfo->aToken.Len() > 0 )
            sOut += pFmtInfo->aToken;
        else
            sOut += sHTML_span;
        if( rHTMLWrt.bCfgOutStyles && pFmtInfo->aClass.Len() )
        {
            ((sOut += ' ') += sHTML_O_class) += "=\"";
            rWrt.Strm() << sOut.GetBuffer();
            HTMLOutFuncs::Out_String( rWrt.Strm(), pFmtInfo->aClass,
                                          rHTMLWrt.eDestEnc );
            sOut = '\"';
        }
        sOut += '>';
        rWrt.Strm() << sOut.GetBuffer();
    }
    else
    {
        HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(),
                pFmtInfo->aToken.Len() ? pFmtInfo->aToken.GetBuffer()
                                       : sHTML_span,
                FALSE );
    }

    return rWrt;
}

static Writer& OutHTML_SvxAdjust( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
    if( !rHTMLWrt.bOutOpts || !rHTMLWrt.bTagOn )
        return  rWrt;

    SvxAdjustItem& rAdjust = (SvxAdjustItem&)rHt;
    const sal_Char* pStr = 0;
    switch( rAdjust.GetAdjust() )
    {
    case SVX_ADJUST_CENTER: pStr = sHTML_AL_center; break;
    case SVX_ADJUST_LEFT: pStr = sHTML_AL_left; break;
    case SVX_ADJUST_RIGHT: pStr = sHTML_AL_right; break;
    case SVX_ADJUST_BLOCK: pStr = sHTML_AL_justify; break;
    }
    if( pStr )
    {
        ByteString sOut( ' ' );
        ((sOut += sHTML_O_align) += '=') += pStr;
        rWrt.Strm() << sOut.GetBuffer();
    }

    return rWrt;
}

/*
 * lege hier die Tabellen fuer die HTML-Funktions-Pointer auf
 * die Ausgabe-Funktionen an.
 * Es sind lokale Strukturen, die nur innerhalb der HTML-DLL
 * bekannt sein muessen.
 */


SwAttrFnTab aHTMLAttrFnTab = {
/* RES_CHRATR_CASEMAP   */          OutHTML_CSS1Attr,
/* RES_CHRATR_CHARSETCOLOR  */      0,
/* RES_CHRATR_COLOR */              OutHTML_SvxColor,
/* RES_CHRATR_CONTOUR   */          0,
/* RES_CHRATR_CROSSEDOUT    */      OutHTML_SwCrossedOut,
/* RES_CHRATR_ESCAPEMENT    */      OutHTML_SvxEscapement,
/* RES_CHRATR_FONT  */              OutHTML_SvxFont,
/* RES_CHRATR_FONTSIZE  */          OutHTML_SvxFontHeight,
/* RES_CHRATR_KERNING   */          OutHTML_CSS1Attr,
/* RES_CHRATR_LANGUAGE  */          0,
/* RES_CHRATR_POSTURE   */          OutHTML_SwPosture,
/* RES_CHRATR_PROPORTIONALFONTSIZE*/0,
/* RES_CHRATR_SHADOWED  */          0,
/* RES_CHRATR_UNDERLINE */          OutHTML_SwUnderline,
/* RES_CHRATR_WEIGHT    */          OutHTML_SwWeight,
/* RES_CHRATR_WORDLINEMODE  */      0,
/* RES_CHRATR_AUTOKERN  */          0,
/* RES_CHRATR_BLINK */              OutHTML_SwBlink,
/* RES_CHRATR_NOHYPHEN  */          0, // Neu: nicht trennen
/* RES_CHRATR_NOLINEBREAK */        0, // Neu: nicht umbrechen
/* RES_CHRATR_BACKGROUND */         OutHTML_CSS1Attr, // Neu: Zeichenhintergrund
/* RES_CHRATR_CJK_FONT */           0,
/* RES_CHRATR_CJK_FONTSIZE */       0,
/* RES_CHRATR_CJK_LANGUAGE */       0,
/* RES_CHRATR_CJK_POSTURE */        0,
/* RES_CHRATR_CJK_WEIGHT */         0,
/* RES_CHRATR_CTL_FONT */           0,
/* RES_CHRATR_CTL_FONTSIZE */       0,
/* RES_CHRATR_CTL_LANGUAGE */       0,
/* RES_CHRATR_CTL_POSTURE */        0,
/* RES_CHRATR_CTL_WEIGHT */         0,
/* RES_CHRATR_WRITING_DIRECTION */  0,
/* RES_CHRATR_DUMMY2 */             0,
/* RES_CHRATR_DUMMY3 */             0,
/* RES_CHRATR_DUMMY4 */             0,
/* RES_CHRATR_DUMMY5 */             0,
/* RES_CHRATR_DUMMY1 */             0, // Dummy:

/* RES_TXTATR_INETFMT   */          OutHTML_SwFmtINetFmt,
/* RES_TXTATR_DUMMY4    */          0,
/* RES_TXTATR_REFMARK*/             0,
/* RES_TXTATR_TOXMARK */            0,
/* RES_TXTATR_CHARFMT   */          OutHTML_SwTxtCharFmt,
/* RES_TXTATR_TWO_LINES */          0,
/* RES_TXTATR_CJK_RUBY */           0,
/* RES_TXTATR_UNKNOWN_CONTAINER */  0,
/* RES_TXTATR_DUMMY5 */             0,
/* RES_TXTATR_DUMMY6 */             0,

/* RES_TXTATR_FIELD */              OutHTML_SwFmtFld,
/* RES_TXTATR_FLYCNT */             OutHTML_SwFlyCnt,
/* RES_TXTATR_FTN */                OutHTML_SwFmtFtn,
/* RES_TXTATR_SOFTHYPH */           0,
/* RES_TXTATR_HARDBLANK*/           OutHTML_SwHardBlank,
/* RES_TXTATR_DUMMY1 */             0, // Dummy:
/* RES_TXTATR_DUMMY2 */             0, // Dummy:

/* RES_PARATR_LINESPACING   */      0,
/* RES_PARATR_ADJUST    */          OutHTML_SvxAdjust,
/* RES_PARATR_SPLIT */              0,
/* RES_PARATR_WIDOWS    */          0,
/* RES_PARATR_ORPHANS   */          0,
/* RES_PARATR_TABSTOP   */          0,
/* RES_PARATR_HYPHENZONE*/          0,
/* RES_PARATR_DROP */               OutHTML_CSS1Attr,
/* RES_PARATR_REGISTER */           0, // neu:  Registerhaltigkeit
/* RES_PARATR_DUMMY1 */             0, // Dummy:
/* RES_PARATR_DUMMY2 */             0, // Dummy:

/* RES_FILL_ORDER   */              0,
/* RES_FRM_SIZE */                  0,
/* RES_PAPER_BIN    */              0,
/* RES_LR_SPACE */                  0,
/* RES_UL_SPACE */                  0,
/* RES_PAGEDESC */                  0,
/* RES_BREAK */                     0,
/* RES_CNTNT */                     0,
/* RES_HEADER */                    0,
/* RES_FOOTER */                    0,
/* RES_PRINT */                     0,
/* RES_OPAQUE */                    0,
/* RES_PROTECT */                   0,
/* RES_SURROUND */                  0,
/* RES_VERT_ORIENT */               0,
/* RES_HORI_ORIENT */               0,
/* RES_ANCHOR */                    0,
/* RES_BACKGROUND */                0,
/* RES_BOX  */                      0,
/* RES_SHADOW */                    0,
/* RES_FRMMACRO */                  0,
/* RES_COL */                       0,
/* RES_KEEP */                      0,
/* RES_URL */                       0,
/* RES_EDIT_IN_READONLY */          0,
/* RES_LAYOUT_SPLIT */              0,
/* RES_FRMATR_DUMMY1 */             0, // Dummy:
/* RES_FRMATR_DUMMY2 */             0, // Dummy:
/* RES_FRMATR_DUMMY3 */             0, // Dummy:
/* RES_FRMATR_DUMMY4 */             0, // Dummy:
/* RES_FRMATR_DUMMY5 */             0, // Dummy:
/* RES_FRMATR_DUMMY6 */             0, // Dummy:
/* RES_FRMATR_DUMMY7 */             0, // Dummy:
/* RES_FRMATR_DUMMY8 */             0, // Dummy:
/* RES_FRMATR_DUMMY9 */             0, // Dummy:

/* RES_GRFATR_MIRRORGRF */          0,
/* RES_GRFATR_CROPGRF   */          0,
/* RES_GRFATR_ROTATION */           0,
/* RES_GRFATR_LUMINANCE */          0,
/* RES_GRFATR_CONTRAST */           0,
/* RES_GRFATR_CHANNELR */           0,
/* RES_GRFATR_CHANNELG */           0,
/* RES_GRFATR_CHANNELB */           0,
/* RES_GRFATR_GAMMA */              0,
/* RES_GRFATR_INVERT */             0,
/* RES_GRFATR_TRANSPARENCY */       0,
/* RES_GRFATR_DRWAMODE */           0,
/* RES_GRFATR_DUMMY1 */             0,
/* RES_GRFATR_DUMMY2 */             0,
/* RES_GRFATR_DUMMY3 */             0,
/* RES_GRFATR_DUMMY4 */             0,
/* RES_GRFATR_DUMMY5 */             0,

/* RES_BOXATR_FORMAT */             0,
/* RES_BOXATR_FORMULA */            0,
/* RES_BOXATR_VALUE */              0
};




/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/html/htmlatr.cxx,v 1.1.1.1 2000-09-18 17:14:55 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.246  2000/09/18 16:04:43  willem.vandorp
      OpenOffice header added.

      Revision 1.245  2000/08/18 13:03:11  jp
      don't export escaped URLs

      Revision 1.244  2000/08/04 10:55:10  jp
      Soft-/HardHyphens & HardBlanks changed from attribute to unicode character

      Revision 1.243  2000/07/31 19:24:25  jp
      new attributes for CJK/CTL and graphic

      Revision 1.242  2000/06/26 09:51:53  jp
      must change: GetAppWindow->GetDefaultDevice

      Revision 1.241  2000/04/28 14:29:10  mib
      unicode

      Revision 1.240  2000/04/10 12:20:55  mib
      unicode

      Revision 1.239  2000/02/11 14:36:52  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.238  1999/12/08 13:50:39  jp
      Task #70258#: textattr for XMLAttrContainer

      Revision 1.237  1999/09/21 09:48:43  mib
      multiple text encodings

      Revision 1.236  1999/06/22 06:30:08  MIB
      #64687#: if a center paragraph contains controls add a div tag


      Rev 1.235   22 Jun 1999 08:30:08   MIB
   #64687#: if a center paragraph contains controls add a div tag

      Rev 1.234   10 Jun 1999 10:33:52   JP
   have to change: no AppWin from SfxApp

      Rev 1.233   09 Jun 1999 19:35:54   JP
   have to change: no cast from GetpApp to SfxApp/OffApp, SfxShell only subclass of SfxApp

      Rev 1.232   15 Apr 1999 13:25:30   MIB
   #64159#: Beim Versenden von Mails auch in PRE umbrechen

      Rev 1.231   23 Mar 1999 15:27:32   MIB
   #63049#: Relative Einzuege in Numerierungen

      Rev 1.230   17 Mar 1999 16:45:20   MIB
   #63049#: Numerierungen mit relativen Abstaenden

      Rev 1.229   18 Jan 1999 10:14:38   MIB
   #60806#: Auch bei <FONT FACE=...> generische Fontnamen exportieren

      Rev 1.228   06 Jan 1999 13:54:42   MIB
   #60393#: Fuer Nscp4 in Tabellen keine line-spacing und margin-bottom exportieren

      Rev 1.227   06 Jan 1999 10:33:38   MIB
   #60311#: In Listen fuer nicht-numerierte Absaetze keine <PRE> ausgeben

      Rev 1.226   02 Nov 1998 17:25:58   MIB
   #58480#: Fuss-/Endnoten

*************************************************************************/

diff --git a/sw/source/filter/html/htmlbas.cxx b/sw/source/filter/html/htmlbas.cxx
new file mode 100644
index 0000000..371b4691
--- /dev/null
+++ b/sw/source/filter/html/htmlbas.cxx
@@ -0,0 +1,689 @@
/*************************************************************************
 *
 *  $RCSfile: htmlbas.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:55 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#include "hintids.hxx"

#ifndef _SFXINIMGR_HXX //autogen
#include <svtools/iniman.hxx>
#endif
#define _SVSTDARR_STRINGSSORTDTOR
#include <svtools/svstdarr.hxx>
#ifndef _SBXCLASS_HXX //autogen
#include <svtools/sbx.hxx>
#endif
#ifndef _BASMGR_HXX //autogen
#include <basic/basmgr.hxx>
#endif
#ifndef _SB_SBSTAR_HXX //autogen
#include <basic/sbstar.hxx>
#endif
#ifndef _SB_SBMOD_HXX //autogen
#include <basic/sbmod.hxx>
#endif
#ifndef _SFX_EVENTCONF_HXX //autogen
#include <sfx2/evntconf.hxx>
#endif
#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif
#ifndef _HTMLOUT_HXX //autogen
#include <svtools/htmlout.hxx>
#endif
#ifndef _HTMLTOKN_H
#include <svtools/htmltokn.h>
#endif
#ifndef _HTMLKYWD_HXX
#include <svtools/htmlkywd.hxx>
#endif



#ifndef _FMTORNT_HXX //autogen
#include <fmtornt.hxx>
#endif
#ifndef _FMTFLD_HXX //autogen
#include <fmtfld.hxx>
#endif

#ifndef _SFX_OBJUNO_HXX //autogen
#include <sfx2/objuno.hxx>
#endif

#include "doc.hxx"
#include "docsh.hxx"
#include "docufld.hxx"
#include "wrthtml.hxx"
#include "swhtml.hxx"


static HTMLOutEvent __FAR_DATA aBodyEventTable[] =
{
    { sHTML_O_SDonload,     sHTML_O_onload,     SFX_EVENT_OPENDOC   },
    { sHTML_O_SDonunload,   sHTML_O_onunload,   SFX_EVENT_PREPARECLOSEDOC   },
    { sHTML_O_SDonfocus,    sHTML_O_onfocus,    SFX_EVENT_ACTIVATEDOC   },
    { sHTML_O_SDonblur,     sHTML_O_onblur,     SFX_EVENT_DEACTIVATEDOC },
    { 0,                    0,                  0                   }
};


void SwHTMLParser::NewScript()
{
    ParseScriptOptions( aScriptType, eScriptLang, aScriptURL,
                        aBasicLib, aBasicModule );

    BOOL bDownload = aScriptURL.Len();
    if( bDownload )
    {
        // Den Inhalt des Script-Tags ignorieren
        bIgnoreRawData = TRUE;
    }
}

void SwHTMLParser::EndScript()
{
    BOOL bInsIntoBasic = FALSE,
         bInsSrcIntoFld = FALSE;

    switch( eScriptLang )
    {
    case HTML_SL_STARBASIC:
        bInsIntoBasic = TRUE;
        break;
    default:
        bInsSrcIntoFld = TRUE;
        break;
    }


    bIgnoreRawData = FALSE;
    aScriptSource.ConvertLineEnd();

//  MIB 23.5.97: SGML-Kommentare brauchen nicht mehr entfernt zu werden,
//  weil JS das jetzt selber kann.
//  RemoveSGMLComment( aScriptSource, TRUE );

    // Ausser StarBasic und unbenutzem JavaScript jedes Script oder den
    // Modulnamen in einem Feld merken merken
    if( bInsSrcIntoFld )
    {
        SwScriptFieldType *pType =
            (SwScriptFieldType*)pDoc->GetSysFldType( RES_SCRIPTFLD );

        SwScriptField aFld( pType, aScriptType,
                            aScriptURL.Len() ? aScriptURL : aScriptSource,
                            aScriptURL.Len()!=0 );
        InsertAttr( SwFmtFld( aFld ) );
    }

    SwDocShell *pDocSh = pDoc->GetDocShell();
    if( aScriptSource.Len() && pDocSh &&
        bInsIntoBasic && IsNewDoc() )
    {
    // Fuer JavaScript und StarBasic noch ein Basic-Modul anlegen
        // Das Basic entfernt natuerlich weiterhin keine SGML-Kommentare
        RemoveSGMLComment( aScriptSource, TRUE );

        SFX_APP()->EnterBasicCall();

        BasicManager *pBasicMan = pDocSh->GetBasicManager();
        ASSERT( pBasicMan, "Wo ist der BasicManager?" );
        if( pBasicMan )
        {
            StarBASIC *pBasic;
            if( aBasicLib.Len() )
            {
                pBasic = pBasicMan->GetLib( aBasicLib );
                if( !pBasic )
                    pBasic = pBasicMan->CreateLib( aBasicLib );
            }
            else
                pBasic = pBasicMan->GetStdLib();

            if( pBasic )
            {
                if( !aBasicModule.Len() )
                {
                    BOOL bFound = TRUE;
                    while( bFound )
                    {
                        aBasicModule.AssignAscii( "Modul" );
                        aBasicModule += String::CreateFromInt32(
                                            (sal_Int32)(++nSBModuleCnt) );
                        bFound = (pBasic->FindModule( aBasicModule ) != 0);
                    }
                }

                SbModule *pModule =
                    pBasic->MakeModule( aBasicModule, aScriptSource );
                if( pModule )
                    pModule->Compile();
            }
        }

        SFX_APP()->LeaveBasicCall();
    }

    aScriptSource.Erase();
    aScriptType.Erase();
    aScriptURL.Erase();

    aBasicLib.Erase();
    aBasicModule.Erase();
}

void SwHTMLParser::AddScriptSource()
{
    // Hier merken wir und nur ein par Strings
    if( aToken.Len() > 2 &&
        (HTML_SL_STARBASIC==eScriptLang && aToken.GetChar( 0 ) == '\'') )
    {
        xub_StrLen nPos = STRING_NOTFOUND;
        if( !aBasicLib.Len() )
        {
            nPos = aToken.SearchAscii( sHTML_SB_library );
            if( nPos != STRING_NOTFOUND )
            {
                aBasicLib =
                    aToken.Copy( nPos + sizeof(sHTML_SB_library) - 1 );
                aBasicLib.EraseLeadingChars().EraseTrailingChars();
            }
        }

        if( !aBasicModule.Len() && nPos==STRING_NOTFOUND )
        {
            nPos = aToken.SearchAscii( sHTML_SB_module );
            if( nPos != STRING_NOTFOUND )
            {
                aBasicModule =
                    aToken.Copy( nPos + sizeof(sHTML_SB_module) - 1 );
                aBasicModule.EraseLeadingChars().EraseTrailingChars();
            }
        }

        if( nPos==STRING_NOTFOUND )
        {
            if( aScriptSource.Len() )
                aScriptSource += '\n';
            (aScriptSource += aToken);
        }
    }
    else if( aScriptSource.Len() || aToken.Len() )
    {
        // Leerzeilen am Anfang werden ignoriert
        if( aScriptSource.Len() )
        {
            aScriptSource += '\n';
        }
        else
        {
            // Wir stehen hinter dem CR/LF der Zeile davor
            nScriptStartLineNr = GetLineNr() - 1;
        }
        aScriptSource += aToken;
    }
}

void SwHTMLParser::InsertBasicDocEvent( USHORT nEvent, const String& rName,
                                        ScriptType eScrType,
                                        const String& rScrType )
{
    ASSERT( rName.Len(), "InsertBasicDocEvent() ohne Macro gerufen" );
    if( !rName.Len() )
        return;

    SwDocShell *pDocSh = pDoc->GetDocShell();
    ASSERT( pDocSh, "Wo ist die DocShell?" );
    if( !pDocSh )
        return;

    String sEvent( rName );
    sEvent.ConvertLineEnd();
    String sScriptType;
    if( EXTENDED_STYPE == eScrType )
        sScriptType = rScrType;

    SfxEventConfiguration* pECfg = SFX_APP()->GetEventConfig();
    pECfg->ConfigureEvent( nEvent, SvxMacro( sEvent, sScriptType, eScrType ),
                           pDocSh );
}

void SwHTMLWriter::OutBasic()
{
    if( !bCfgStarBasic )
        return;

    SFX_APP()->EnterBasicCall();

    BasicManager *pBasicMan = pDoc->GetDocShell()->GetBasicManager();
    ASSERT( pBasicMan, "Wo ist der Basic-Manager?" );
    //JP 17.07.96: Bug 29538 - nur das DocumentBasic schreiben
    if( !pBasicMan || pBasicMan == SFX_APP()->GetBasicManager() )
    {
        SFX_APP()->LeaveBasicCall();
        return;
    }

    // und jetzt alle StarBasic-Module und alle unbenutzen JavaSrript-Module
    // ausgeben
    for( USHORT i=0; i<pBasicMan->GetLibCount(); i++ )
    {
        StarBASIC *pBasic = pBasicMan->GetLib( i  );
        const String& rLibName = pBasic->GetName();

        SbxArray *pModules = pBasic->GetModules();
        for( USHORT j=0; j<pModules->Count(); j++ )
        {
            const SbModule *pModule = PTR_CAST( SbModule, pModules->Get(j) );
            ASSERT( pModule, "Wo ist das Modul?" );

            String sLang(
                    String::CreateFromAscii( SVX_MACRO_LANGUAGE_STARBASIC ) );
            ScriptType eType = STARBASIC;

            if( 0==i && 0==j )
            {
                OutNewLine();
                ByteString sOut( '<' );
                sOut.Append( sHTML_meta );
                sOut.Append( ' ' );
                sOut.Append( sHTML_O_httpequiv );
                  sOut.Append( "=\"" );
                sOut.Append( sHTML_META_content_script_type );
                sOut.Append( "\" " );
                sOut.Append( sHTML_O_content );
                sOut.Append( "=\"text/x-" );
                Strm() << sOut.GetBuffer();
                // Entities aren't welcome here
                ByteString sLang8( sLang, eDestEnc );
                Strm() << sLang8.GetBuffer() << "\">";
            }

            const String& rModName = pModule->GetName();
            Strm() << SwHTMLWriter::sNewLine;   // nicht einruecken!
            HTMLOutFuncs::OutScript( Strm(), pModule->GetSource(),
                                     sLang, eType, aEmptyStr,
                                     &rLibName, &rModName,
                                     eDestEnc );
        }
    }

    SFX_APP()->LeaveBasicCall();
}


void SwHTMLWriter::OutBasicBodyEvents()
{
    SwDocShell *pDocSh = pDoc->GetDocShell();
    if( !pDocSh )
        return;

    SfxEventConfiguration* pECfg = SFX_APP()->GetEventConfig();
    ASSERT( pECfg, "Wo ist die Event-Konfiguration?" );
    if( !pECfg )
        return;

    SvxMacroTableDtor *pMacTable = pECfg->GetDocEventTable( pDocSh );
    if( pMacTable && pMacTable->Count() )
        HTMLOutFuncs::Out_Events( Strm(), *pMacTable, aBodyEventTable,
                                  bCfgStarBasic, eDestEnc );
}


/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/html/htmlbas.cxx,v 1.1.1.1 2000-09-18 17:14:55 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.92  2000/09/18 16:04:43  willem.vandorp
      OpenOffice header added.

      Revision 1.91  2000/08/24 20:17:16  jp
      Bug #78047#: EndScript - no assert

      Revision 1.90  2000/05/15 10:07:15  os
      Basic removed

      Revision 1.89  2000/04/28 14:29:11  mib
      unicode

      Revision 1.88  2000/04/10 12:20:55  mib
      unicode

      Revision 1.87  2000/03/30 07:31:01  os
      UNO III

      Revision 1.86  2000/03/16 16:40:32  kz
      remove include sbjsmod.hxx

      Revision 1.85  2000/03/03 12:44:32  mib
      Removed JavaScript

      Revision 1.84  1999/11/19 16:40:19  os
      modules renamed

      Revision 1.83  1999/09/21 09:48:47  mib
      multiple text encodings

      Revision 1.82  1999/09/17 12:12:45  mib
      support of multiple and non system text encodings

      Revision 1.81  1999/04/27 14:47:32  JP
      Bug #65314#: neu: IsJavaScriptEnabled


      Rev 1.80   27 Apr 1999 16:47:32   JP
   Bug #65314#: neu: IsJavaScriptEnabled

      Rev 1.79   27 Jan 1999 09:43:32   OS
   #56371# TF_ONE51

      Rev 1.78   22 Sep 1998 13:46:50   MIB
   #56943#: Bei String-Ueberlauf im JavaScript Fehlermeldung ausgeben

      Rev 1.77   11 Sep 1998 15:04:50   MIB
   generische Events wieder fuer alle Script-Typen erlauben

      Rev 1.76   09 Sep 1998 17:58:10   MIB
   #55407#: Stat onclosedoc inprepareclodedoc fuer unload-Event benutzen

      Rev 1.75   28 Jul 1998 12:07:12   MIB
   #52559#: JavaScript-Zeilennummern

      Rev 1.74   27 Jul 1998 10:55:28   MIB
   #50320#: <SCRIPT SRC=...> wieder aktiviert

      Rev 1.73   08 Jul 1998 17:20:24   MIB
   StarScript

      Rev 1.72   04 Jul 1998 17:43:48   MIB
   StarScript in IDE, StarScript-Events

      Rev 1.71   05 May 1998 13:09:28   MIB
   Scripte aus ANSI-Zeichensetz konvertieren

      Rev 1.70   21 Apr 1998 11:21:46   RG
   String -> UString

      Rev 1.69   24 Mar 1998 12:36:18   MIB
   fix #47774#: Nur Dokument-Events exportieren

      Rev 1.68   20 Feb 1998 19:04:28   MA
   header

      Rev 1.67   20 Feb 1998 15:11:16   MIB
   include

      Rev 1.66   19 Feb 1998 16:15:02   MIB
   StarOne-TF: StarOne-Scripte

      Rev 1.65   26 Nov 1997 19:09:18   MA
   includes

      Rev 1.64   24 Nov 1997 13:49:26   TJ
   include svhtml.hxx

      Rev 1.63   21 Nov 1997 09:42:40   MIB
   fix #45422#: Dokument-Basic beim Basic-Import immer anlegen

      Rev 1.62   03 Nov 1997 14:08:42   MA
   precomp entfernt

      Rev 1.61   09 Oct 1997 14:33:50   JP
   Umstellung NodeIndex/-Array/BigPtrArray

      Rev 1.60   16 Sep 1997 11:11:56   MIB
   unbenutzte Funktionen entfernt

      Rev 1.59   12 Sep 1997 11:51:58   MIB
   fix #41136#: &(xxx);-Makros

      Rev 1.58   01 Sep 1997 13:52:46   MIB
   Zeichensetz-/Zeilenende-Konvertierung fuer Event-Optionen

      Rev 1.57   29 Aug 1997 16:50:28   OS
   DLL-Umstellung

      Rev 1.56   15 Aug 1997 12:47:48   OS
   charatr/frmatr/txtatr aufgeteilt

      Rev 1.55   11 Aug 1997 14:05:04   OM
   Headerfile-Umstellung

      Rev 1.54   07 Aug 1997 15:08:56   OM
   Headerfile-Umstellung

      Rev 1.53   15 Jul 1997 14:07:20   MIB
   fix: Scripte in System-Zeichensatz wandeln

      Rev 1.52   02 Jul 1997 10:34:40   MIB
   Assert weg

      Rev 1.51   23 May 1997 16:04:34   MIB
   Nur noch SGML-Kommentare fuer StarBASIC entfernen

      Rev 1.50   22 May 1997 11:01:30   MIB
   URL-Flag am Script-Feld

      Rev 1.49   21 May 1997 11:15:04   MIB
   fix #39768#: <SCRIPT SRC=...> zum Eibindenen externer Scripte

      Rev 1.48   02 May 1997 20:53:00   NF
   includes weil SfxApplication unbekannt!

      Rev 1.47   11 Apr 1997 14:45:14   MIB
   fix: Kein Basic/JsvaScript beim einfuegen, JAVA-Basic-IDE-Stuff entfernt

      Rev 1.46   24 Mar 1997 17:41:36   MIB
   fix #37936#: SCRIPT in SELECT erlauben, opt: OutBasic aus Goodies nutzen

      Rev 1.45   19 Mar 1997 14:43:48   MIB
   fix #37904#: Vor --> ein // exportieren

      Rev 1.44   23 Feb 1997 14:03:04   MIB
   LiveScript wie JavaScript behandeln

      Rev 1.43   20 Feb 1997 11:04:52   MIB
   fix: Script-Sourcen fuer Nicht-JS immer loeschen

      Rev 1.42   11 Feb 1997 16:14:06   HJS
   fuer segprag

      Rev 1.41   11 Feb 1997 15:53:38   MIB
   fix #35907# Basic-Source-String loeschen

      Rev 1.40   10 Feb 1997 16:50:20   JP
   Umstellung JavaScript aufrufen und FrameSet Erkennung

      Rev 1.39   30 Jan 1997 17:31:38   MIB
   kein JavaScript mehr in Basic-Module

      Rev 1.38   23 Jan 1997 15:02:52   MIB
   falsches Assert weg

      Rev 1.37   22 Jan 1997 09:27:30   MIB
   Hack fuer Erkennung von unbenutztem JavaScript richtig gemacht

      Rev 1.36   21 Jan 1997 17:48:44   MIB
   Events ueber HTMLParser ausgeben

      Rev 1.35   17 Jan 1997 16:44:08   MIB
   ONFOCUS und ONBLUR am Body-Tag exportieren

      Rev 1.34   16 Jan 1997 19:23:26   MIB
   JavaScript in Basic-Modulen, unbenutztes JavaScript erkennen

      Rev 1.33   15 Jan 1997 15:34:22   MIB
   bug fix: auch JavaScript1.1 erkennen, Script-Typ erkennung des HTMLParser nutzen

      Rev 1.32   15 Jan 1997 14:22:40   MIB
   bug fix: Ohne Medium keine JavaScript laden

      Rev 1.31   13 Jan 1997 12:17:06   MIB
   JavaScript in Basic Modulen speichern (noch nicht aktiviert)

      Rev 1.30   08 Jan 1997 21:23:00   HJS
   includes

      Rev 1.29   19 Dec 1996 11:33:56   MIB
   JavaScript nicht ausfuehren, wenn die Filter-Detection das schon getan hat

      Rev 1.28   18 Dec 1996 14:49:52   MIB
   Macro-Unstellung am SFX/Script-Unterstuetung am HTMLParser

      Rev 1.27   16 Dec 1996 16:23:36   MIB
   Bug fix: Script-Felder und Kommentare vor Tabellen

      Rev 1.26   05 Dec 1996 14:44:24   JP
   Unterscheidung von Basic/JavaScript an den SvxMacros

      Rev 1.25   04 Dec 1996 15:01:16   JP
   SW_EVENT -> SVX_EVENT/SFX_EVENT

      Rev 1.24   01 Dec 1996 07:51:02   JP
   JavaScript bis zur 347 ausgebaut (MM)

      Rev 1.23   25 Nov 1996 15:19:14   JP
   InsertBasicModul: Kommentar an Anfang bis zum ZeilenUmbruch entfernen

      Rev 1.22   23 Nov 1996 13:37:54   JP
   InsertBasicINetFmtEvent entfernt; wurde ueberfluessig

      Rev 1.21   21 Nov 1996 16:29:10   JP
   Handler an den Anchor/Images immer speichern

      Rev 1.20   20 Nov 1996 15:09:52   JP
   Java ueber Eintrag in der Ini freischalten

      Rev 1.19   19 Nov 1996 14:06:18   JP
   ImageEvents schreiben

      Rev 1.18   15 Nov 1996 18:44:20   JP
   InsertAndCreate erstmal nur zum Testen

      Rev 1.17   15 Nov 1996 18:25:06   JP
   JavaScript einfuegen und laufen lassen

      Rev 1.16   13 Nov 1996 14:50:04   JP
   neu: ScriptFeld am Doc setzen

      Rev 1.15   23 Oct 1996 19:49:00   JP
   String Umstellung: [] -> GetChar()

      Rev 1.14   09 Oct 1996 13:40:12   MIB
   Pretty-Printing: Einrueckung auf Absatz-Ebene

      Rev 1.13   19 Sep 1996 12:16:00   MIB
   StarBasic-Export-Option beachten

      Rev 1.12   02 Sep 1996 18:40:18   JP
   INetFeld entfernt

      Rev 1.11   21 Aug 1996 16:55:26   MIB
   Probleme mit dem URLATR-define behoben

      Rev 1.10   21 Aug 1996 14:59:30   MIB
   Verwendung des URLATTR-defines vervollstaenigt

      Rev 1.9   15 Aug 1996 10:10:46   MIB
   URL-Attribut exportieren

      Rev 1.8   14 Aug 1996 16:22:22   MIB
   gcc und msvc: statt *aStr nicht aStr[0] sondern aStr[(USHORT)0]

      Rev 1.7   13 Aug 1996 20:33:14   sdo
   GCC

      Rev 1.6   06 Aug 1996 12:54:44   MIB
   Umstellung INet-Felder in INet-Attribut verbereitet

      Rev 1.5   02 Aug 1996 18:41:30   MIB
   Verwendung von pFlyFmt typsicherer gemacht = bug fix fuer Draw-Formate

      Rev 1.4   19 Jul 1996 15:08:12   JP
   Bug #29538#: nur das DocBasis schreiben

      Rev 1.3   01 Jul 1996 16:45:12   JP
   statt SFX_APP pApp benutzen, DocShell muss nicht vorhanden sein (Clipboard)

      Rev 1.2   27 Jun 1996 16:41:38   MIB
   Kommentare um Basic-Source verbessert entfernen, Includes aufgeraeumt

      Rev 1.1   07 Jun 1996 12:43:10   MIB
   Macros an INetField/NoTxtNode lesen und schreiben

      Rev 1.0   30 May 1996 15:02:46   MIB
   Initial revision.



*************************************************************************/


diff --git a/sw/source/filter/html/htmlcss1.cxx b/sw/source/filter/html/htmlcss1.cxx
new file mode 100644
index 0000000..8a20f43
--- /dev/null
+++ b/sw/source/filter/html/htmlcss1.cxx
@@ -0,0 +1,2596 @@
/*************************************************************************
 *
 *  $RCSfile: htmlcss1.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:55 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/


#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#define ITEMID_FONTLIST         SID_ATTR_CHAR_FONTLIST
#include "hintids.hxx"

#ifndef _SFXITEMITER_HXX //autogen
#include <svtools/itemiter.hxx>
#endif
#ifndef _SFX_WHITER_HXX //autogen
#include <svtools/whiter.hxx>
#endif
#ifndef _INTN_HXX //autogen
#include <tools/intn.hxx>
#endif
#ifndef _SFXDOCFILE_HXX //autogen
#include <sfx2/docfile.hxx>
#endif
#ifndef _APP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _SVX_FHGTITEM_HXX //autogen
#include <svx/fhgtitem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#define ITEMID_BOXINFO      SID_ATTR_BORDER_INNER
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_FHGTITEM_HXX //autogen
#include <svx/fhgtitem.hxx>
#endif
#ifndef _SVX_FLSTITEM_HXX //autogen
#include <svx/flstitem.hxx>
#endif
#ifndef _SVX_BRKITEM_HXX //autogen
#include <svx/brkitem.hxx>
#endif
#ifndef _SVX_KEEPITEM_HXX //autogen
#include <svx/keepitem.hxx>
#endif
#ifndef _SVX_FONTITEM_HXX
#include <svx/fontitem.hxx>
#endif
#ifndef _HTMLTOKN_H
#include <svtools/htmltokn.h>
#endif
#ifndef _HTMLKYWD_HXX
#include <svtools/htmlkywd.hxx>
#endif

#ifndef _FMTPDSC_HXX //autogen
#include <fmtpdsc.hxx>
#endif
#ifndef _FMTANCHR_HXX //autogen
#include <fmtanchr.hxx>
#endif
#ifndef _FMTORNT_HXX //autogen
#include <fmtornt.hxx>
#endif
#ifndef _FMTSRND_HXX //autogen
#include <fmtsrnd.hxx>
#endif
#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _FRMATR_HXX
#include "frmatr.hxx"
#endif
#ifndef _CHARFMT_HXX //autogen
#include <charfmt.hxx>
#endif
#ifndef _DOCARY_HXX
#include <docary.hxx>
#endif


#include "doc.hxx"
#include "pam.hxx"
#include "ndtxt.hxx"
#include "poolfmt.hxx"
#include "docsh.hxx"
#include "paratr.hxx"
#include "pagedesc.hxx"
#include "css1kywd.hxx"
#include "swcss1.hxx"
#include "htmlnum.hxx"
#include "swhtml.hxx"

// Wie viele Zeilen/Zeichen sind fuer DropCaps erlaubt?
// (Gibt es vielleicht woanders entsprechende Werte?)
#define MAX_DROPCAP_LINES 9
#define MAX_DROPCAP_CHARS 9

void lcl_swcss1_setEncoding( SwFmt& rFmt, rtl_TextEncoding eEnc );

/*  */

// Implementierung des SwCSS1Parsers (eigentlich swcss1.cxx)
static struct SwCSS1ItemIds
{
    USHORT nFmtBreak;
    USHORT nFmtPageDesc;
    USHORT nFmtKeep;

    SwCSS1ItemIds() :
        nFmtBreak( RES_BREAK ),
        nFmtPageDesc( RES_PAGEDESC ),
        nFmtKeep( RES_KEEP )
    {}

} aItemIds;

void SwCSS1Parser::ChgPageDesc( const SwPageDesc *pPageDesc,
                                const SwPageDesc& rNewPageDesc )
{
    USHORT nPageDescs = pDoc->GetPageDescCnt();
    for( USHORT i=0; i<nPageDescs; i++ )
        if( pPageDesc == &(pDoc->GetPageDesc(i)) )
        {
            pDoc->ChgPageDesc( i, rNewPageDesc );
            return;
        }

    ASSERT( i<nPageDescs, "Seitenvorlage nicht gefunden" );
}

SwCSS1Parser::SwCSS1Parser( SwDoc *pD, ULONG aFHeights[7], BOOL bNewDoc ) :
    SvxCSS1Parser( pD->GetAttrPool(), MM50/2,
                   (USHORT*)&aItemIds, sizeof(aItemIds) / sizeof(USHORT) ),
    nDropCapCnt( 0 ), bIsNewDoc( bNewDoc ), pDoc( pD ),
    bBodyBGColorSet( FALSE ), bBodyBackgroundSet( FALSE ),
    bBodyTextSet( FALSE ), bBodyLinkSet( FALSE ), bBodyVLinkSet( FALSE ),
    bSetFirstPageDesc( FALSE ), bSetRightPageDesc( FALSE ),
    bTableHeaderTxtCollSet( FALSE ), bTableTxtCollSet( FALSE ),
    bLinkCharFmtsSet( FALSE )
{
    aFontHeights[0] = aFHeights[0];
    aFontHeights[1] = aFHeights[1];
    aFontHeights[2] = aFHeights[2];
    aFontHeights[3] = aFHeights[3];
    aFontHeights[4] = aFHeights[4];
    aFontHeights[5] = aFHeights[5];
    aFontHeights[6] = aFHeights[6];
}

SwCSS1Parser::~SwCSS1Parser()
{
}


/*  */

// Feature: PrintExt
BOOL SwCSS1Parser::SetFmtBreak( SfxItemSet& rItemSet,
                                const SvxCSS1PropertyInfo& rPropInfo )
{
    SvxBreak eBreak = SVX_BREAK_NONE;
    BOOL bKeep = FALSE;
    BOOL bSetKeep = FALSE, bSetBreak = FALSE, bSetPageDesc = FALSE;
    const SwPageDesc *pPageDesc = 0;
    switch( rPropInfo.ePageBreakBefore )
    {
    case SVX_CSS1_PBREAK_ALWAYS:
        eBreak = SVX_BREAK_PAGE_BEFORE;
        bSetBreak = TRUE;
        break;
    case SVX_CSS1_PBREAK_LEFT:
        pPageDesc = GetLeftPageDesc( TRUE );
        bSetPageDesc = TRUE;
        break;
    case SVX_CSS1_PBREAK_RIGHT:
        pPageDesc = GetRightPageDesc( TRUE );
        bSetPageDesc = TRUE;
        break;
    case SVX_CSS1_PBREAK_AUTO:
        bSetBreak = bSetPageDesc = TRUE;
        break;
//  case SVX_CSS1_PBREAK_AVOID:
        // Hier koennte man SvxKeepItem am Absatz davor einfuegen
//      break;
    }
    switch( rPropInfo.ePageBreakAfter )
    {
    case SVX_CSS1_PBREAK_ALWAYS:
    case SVX_CSS1_PBREAK_LEFT:
    case SVX_CSS1_PBREAK_RIGHT:
        // LEFT/RIGHT koennte man auch am Absatz davor setzen
        eBreak = SVX_BREAK_PAGE_AFTER;
        bSetBreak = TRUE;
        break;
    case SVX_CSS1_PBREAK_AUTO:
        bSetBreak = bSetKeep = bSetPageDesc = TRUE;
        break;
    case SVX_CSS1_PBREAK_AVOID:
        bKeep = bSetKeep = TRUE;
        break;
    }

    if( bSetBreak )
        rItemSet.Put( SvxFmtBreakItem( eBreak ) );
    if( bSetPageDesc )
        rItemSet.Put( SwFmtPageDesc( pPageDesc ) );
    if( bSetKeep )
        rItemSet.Put( SvxFmtKeepItem( bKeep ) );

    return bSetBreak;
}
// /Feature: PrintExt

static void SetCharFmtAttrs( SwCharFmt *pCharFmt, SfxItemSet& rItemSet )
{
    const SfxPoolItem *pItem;
    if( SFX_ITEM_SET == rItemSet.GetItemState( RES_CHRATR_FONTSIZE, FALSE, &pItem ) &&
        ((const SvxFontHeightItem *)pItem)->GetProp() != 100)
    {
        // %-Angaben beim FontHeight-Item werden nicht unterstuetzt
        rItemSet.ClearItem( RES_CHRATR_FONTSIZE );
    }

    pCharFmt->SetAttr( rItemSet );

    if( SFX_ITEM_SET == rItemSet.GetItemState( RES_BACKGROUND, FALSE, &pItem ) )
    {
        // Ein Brush-Item mit RES_BACKGROUND muss noch in eines mit
        // RES_CHRATR_BACKGROUND gewandelt werden

        SvxBrushItem aBrushItem( *(const SvxBrushItem *)pItem );
        aBrushItem.SetWhich( RES_CHRATR_BACKGROUND );
        pCharFmt->SetAttr( aBrushItem );
    }
}

void SwCSS1Parser::SetLinkCharFmts()
{
    ASSERT( !bLinkCharFmtsSet, "Aufruf von SetLinkCharFmts unnoetig" );

    SvxCSS1MapEntry *pStyleEntry =
        GetTag( String::CreateFromAscii(sHTML_anchor) );
    SwCharFmt *pUnvisited = 0, *pVisited = 0;
    if( pStyleEntry )
    {
        SfxItemSet& rItemSet = pStyleEntry->GetItemSet();
        BOOL bColorSet = (SFX_ITEM_SET==rItemSet.GetItemState(RES_CHRATR_COLOR,
                                                              FALSE));
        pUnvisited = GetCharFmtFromPool( RES_POOLCHR_INET_NORMAL );
        SetCharFmtAttrs( pUnvisited, rItemSet );
        bBodyLinkSet |= bColorSet;

        pVisited = GetCharFmtFromPool( RES_POOLCHR_INET_VISIT );
        SetCharFmtAttrs( pVisited, rItemSet );
        bBodyVLinkSet |= bColorSet;
    }

    String sTmp( String::CreateFromAscii(sHTML_anchor) );
    sTmp.Append( ':' );
    sTmp.AppendAscii( sCSS1_link );
    pStyleEntry = GetTag( sTmp );
    if( pStyleEntry )
    {
        SfxItemSet& rItemSet = pStyleEntry->GetItemSet();
        BOOL bColorSet = (SFX_ITEM_SET==rItemSet.GetItemState(RES_CHRATR_COLOR,
                                                              FALSE));
        if( !pUnvisited )
            pUnvisited = GetCharFmtFromPool( RES_POOLCHR_INET_NORMAL );
        SetCharFmtAttrs( pUnvisited, rItemSet );
        bBodyLinkSet |= bColorSet;
    }

    sTmp.AssignAscii( sHTML_anchor );
    sTmp.Assign( ':' );
    sTmp.AppendAscii( sCSS1_visited );
    pStyleEntry = GetTag( sTmp );
    if( pStyleEntry )
    {
        SfxItemSet& rItemSet = pStyleEntry->GetItemSet();
        BOOL bColorSet = (SFX_ITEM_SET==rItemSet.GetItemState(RES_CHRATR_COLOR,
                                                              FALSE));
        if( !pVisited )
            pVisited = GetCharFmtFromPool( RES_POOLCHR_INET_VISIT );
        SetCharFmtAttrs( pVisited, rItemSet );
        bBodyVLinkSet |= bColorSet;
    }

    bLinkCharFmtsSet = TRUE;
}

static void SetTxtCollAttrs( SwTxtFmtColl *pColl, SfxItemSet& rItemSet,
                             SvxCSS1PropertyInfo& rPropInfo,
                             SwCSS1Parser *pCSS1Parser )
{
    const SfxItemSet& rCollItemSet = pColl->GetAttrSet();
    const SfxPoolItem *pCollItem, *pItem;

    // linker, rechter Rand und Erstzeilen-Einzug
    if( (rPropInfo.bLeftMargin || rPropInfo.bRightMargin ||
         rPropInfo.bTextIndent) &&
        (!rPropInfo.bLeftMargin || !rPropInfo.bRightMargin ||
         !rPropInfo.bTextIndent) &&
        SFX_ITEM_SET == rCollItemSet.GetItemState(RES_LR_SPACE,TRUE,&pCollItem) &&
        SFX_ITEM_SET == rItemSet.GetItemState(RES_LR_SPACE,FALSE,&pItem) )
    {
        const SvxLRSpaceItem *pLRItem = (const SvxLRSpaceItem *)pItem;

        SvxLRSpaceItem aLRItem( *((const SvxLRSpaceItem *)pCollItem) );
        if( rPropInfo.bLeftMargin )
            aLRItem.SetTxtLeft( pLRItem->GetTxtLeft() );
        if( rPropInfo.bRightMargin )
            aLRItem.SetRight( pLRItem->GetRight() );
        if( rPropInfo.bTextIndent )
            aLRItem.SetTxtFirstLineOfst( pLRItem->GetTxtFirstLineOfst() );

        rItemSet.Put( aLRItem );
    }

    // oberer und unterer Rand
    if( (rPropInfo.bTopMargin || rPropInfo.bBottomMargin) &&
        (!rPropInfo.bTopMargin || !rPropInfo.bBottomMargin) &&
        SFX_ITEM_SET == rCollItemSet.GetItemState(RES_UL_SPACE,TRUE,
                                                  &pCollItem) &&
        SFX_ITEM_SET == rItemSet.GetItemState(RES_UL_SPACE,FALSE,&pItem) )
    {
        const SvxULSpaceItem *pULItem = (const SvxULSpaceItem *)pItem;

        SvxULSpaceItem aULItem( *((const SvxULSpaceItem *)pCollItem) );
        if( rPropInfo.bTopMargin )
            aULItem.SetUpper( pULItem->GetUpper() );
        if( rPropInfo.bBottomMargin )
            aULItem.SetLower( pULItem->GetLower() );

        rItemSet.Put( aULItem );
    }

    if( SFX_ITEM_SET == rItemSet.GetItemState( RES_CHRATR_FONTSIZE, FALSE,
                                               &pItem ) &&
        ((const SvxFontHeightItem *)pItem)->GetProp() != 100)
    {
        // %-Angaben beim FontHeight-Item werden nicht unterstuetzt
        rItemSet.ClearItem( RES_CHRATR_FONTSIZE );
    }

// Feature: PrintExt
    pCSS1Parser->SetFmtBreak( rItemSet, rPropInfo );
// /Feature: PrintExt

    pColl->SetAttr( rItemSet );
}

void SwCSS1Parser::SetTableTxtColl( BOOL bHeader )
{
    ASSERT( !(bHeader ? bTableHeaderTxtCollSet : bTableTxtCollSet),
            "Aufruf von SetTableTxtColl unnoetig" );

    USHORT nPoolId;
    String sTag;
    if( bHeader )
    {
        nPoolId = RES_POOLCOLL_TABLE_HDLN;
        sTag.AssignAscii( sHTML_tableheader );
    }
    else
    {
        nPoolId = RES_POOLCOLL_TABLE;
        sTag.AssignAscii( sHTML_tabledata );
    }

    SwTxtFmtColl *pColl = 0;

    // The following entries will never be used again and may be changed.
    SvxCSS1MapEntry *pStyleEntry = GetTag( sTag );
    if( pStyleEntry )
    {
        pColl = GetTxtFmtColl( nPoolId, aEmptyStr );
        SetTxtCollAttrs( pColl, pStyleEntry->GetItemSet(),
                         pStyleEntry->GetPropertyInfo(), this );
    }

    String sTmp( sTag );
    sTmp.Append( ' ' );
    sTmp.AppendAscii( sHTML_parabreak );
    pStyleEntry = GetTag( sTmp );
    if( pStyleEntry )
    {
        if( !pColl )
            pColl = GetTxtFmtColl( nPoolId, aEmptyStr );
        SetTxtCollAttrs( pColl, pStyleEntry->GetItemSet(),
                         pStyleEntry->GetPropertyInfo(), this );
    }

    if( bHeader )
        bTableHeaderTxtCollSet = TRUE;
    else
        bTableTxtCollSet = TRUE;
}

void SwCSS1Parser::SetPageDescAttrs( const SvxBrushItem *pBrush,
                                     SfxItemSet *pItemSet )
{
    SvxBrushItem aBrushItem;
    SvxBoxItem aBoxItem;
    BOOL bSetBrush = pBrush!=0, bSetBox = FALSE;
    if( pBrush )
        aBrushItem = *pBrush;

    if( pItemSet )
    {
        const SfxPoolItem *pItem = 0;
        if( SFX_ITEM_SET == pItemSet->GetItemState( RES_BACKGROUND, FALSE,
                                                   &pItem ) )
        {
            // ein Hintergrund wird gesetzt
            aBrushItem = *((const SvxBrushItem *)pItem);
            pItemSet->ClearItem( RES_BACKGROUND );
            bSetBrush = TRUE;
        }

        if( SFX_ITEM_SET == pItemSet->GetItemState( RES_BOX, FALSE, &pItem ) )
        {
            // eine Umrandung wird gesetzt
            aBoxItem = *((const SvxBoxItem *)pItem);
            pItemSet->ClearItem( RES_BOX );
            bSetBox = TRUE;
        }
    }

    if( bSetBrush || bSetBox )
    {
        static USHORT aPoolIds[] = { RES_POOLPAGE_HTML, RES_POOLPAGE_FIRST,
                                     RES_POOLPAGE_LEFT, RES_POOLPAGE_RIGHT };
        for( USHORT i=0; i<4; i++ )
        {
            const SwPageDesc *pPageDesc = GetPageDesc( aPoolIds[i], FALSE );
            if( pPageDesc )
            {
                SwPageDesc aNewPageDesc( *pPageDesc );
                SwFrmFmt &rMaster = aNewPageDesc.GetMaster();
                if( bSetBrush )
                    rMaster.SetAttr( aBrushItem );
                if( bSetBox )
                    rMaster.SetAttr( aBoxItem );

                ChgPageDesc( pPageDesc, aNewPageDesc );
            }
        }
    }
}

// Feature: PrintExt
void SwCSS1Parser::SetPageDescAttrs( const SwPageDesc *pPageDesc,
                                     SfxItemSet& rItemSet,
                                     const SvxCSS1PropertyInfo& rPropInfo )
{
    if( !pPageDesc )
        return;

    SwPageDesc aNewPageDesc( *pPageDesc );
    SwFrmFmt &rMaster = aNewPageDesc.GetMaster();
    const SfxItemSet& rPageItemSet = rMaster.GetAttrSet();
    const SfxPoolItem *pPageItem, *pItem;
    BOOL bChanged = FALSE;

    // linker, rechter Rand und Erstzeilen-Einzug
    if( (rPropInfo.bLeftMargin || rPropInfo.bRightMargin) &&
        SFX_ITEM_SET == rItemSet.GetItemState(RES_LR_SPACE,FALSE,&pItem) )
    {
        if( (!rPropInfo.bLeftMargin || !rPropInfo.bRightMargin) &&
            SFX_ITEM_SET == rPageItemSet.GetItemState(RES_LR_SPACE,
                                                      TRUE,&pPageItem) )
        {
            const SvxLRSpaceItem *pLRItem = (const SvxLRSpaceItem *)pItem;

            SvxLRSpaceItem aLRItem( *((const SvxLRSpaceItem *)pPageItem) );
            if( rPropInfo.bLeftMargin )
                aLRItem.SetLeft( pLRItem->GetLeft() );
            if( rPropInfo.bRightMargin )
                aLRItem.SetRight( pLRItem->GetRight() );

            rMaster.SetAttr( aLRItem );
        }
        else
        {
            rMaster.SetAttr( *pItem );
        }
        bChanged = TRUE;
    }

    // oberer und unterer Rand
    if( (rPropInfo.bTopMargin || rPropInfo.bBottomMargin) &&
        SFX_ITEM_SET == rItemSet.GetItemState(RES_UL_SPACE,FALSE,&pItem) )
    {
        if( (!rPropInfo.bTopMargin || !rPropInfo.bBottomMargin) &&
            SFX_ITEM_SET == rPageItemSet.GetItemState(RES_UL_SPACE,
                                                      TRUE,&pPageItem) )
        {
            const SvxULSpaceItem *pULItem = (const SvxULSpaceItem *)pItem;

            SvxULSpaceItem aULItem( *((const SvxULSpaceItem *)pPageItem) );
            if( rPropInfo.bTopMargin )
                aULItem.SetUpper( pULItem->GetUpper() );
            if( rPropInfo.bBottomMargin )
                aULItem.SetLower( pULItem->GetLower() );

            rMaster.SetAttr( aULItem );
        }
        else
        {
            rMaster.SetAttr( *pItem );
        }
        bChanged = TRUE;
    }

    // die Groesse
    if( rPropInfo.eSizeType != SVX_CSS1_STYPE_NONE )
    {
        if( rPropInfo.eSizeType == SVX_CSS1_STYPE_TWIP )
        {
            rMaster.SetAttr( SwFmtFrmSize( ATT_FIX_SIZE, rPropInfo.nWidth,
                                           rPropInfo.nHeight ) );
            bChanged = TRUE;
        }
        else
        {
            // Bei "size: auto|portrait|landscape" bleibt die bisherige
            // Groesse der Vorlage erhalten. Bei "landscape" und "portrait"
            // wird das Landscape-Flag gesetzt und evtl. die Breite/Hoehe
            // vertauscht.
            SwFmtFrmSize aFrmSz( rMaster.GetFrmSize() );
            BOOL bLandscape = aNewPageDesc.GetLandscape();
            if( ( bLandscape &&
                  rPropInfo.eSizeType == SVX_CSS1_STYPE_PORTRAIT ) ||
                ( !bLandscape &&
                  rPropInfo.eSizeType == SVX_CSS1_STYPE_LANDSCAPE ) )
            {
                SwTwips nTmp = aFrmSz.GetHeight();
                aFrmSz.SetHeight( aFrmSz.GetWidth() );
                aFrmSz.SetWidth( nTmp );
                rMaster.SetAttr( aFrmSz );
                aNewPageDesc.SetLandscape( !bLandscape );
                bChanged = TRUE;
            }
        }
    }

    // Geht das wirklich?
    if( SFX_ITEM_SET == rItemSet.GetItemState( RES_BACKGROUND, FALSE, &pItem ) )
    {
        // eine Umrandung wird gesetzt
        rMaster.SetAttr( *pItem );
        rItemSet.ClearItem( RES_BACKGROUND );
        bChanged = TRUE;
    }

    if( bChanged )
        ChgPageDesc( pPageDesc, aNewPageDesc );
}
// /Feature: PrintExt

const SvxBrushItem& SwCSS1Parser::GetPageDescBackground() const
{
    return pDoc->GetPageDescFromPool( RES_POOLPAGE_HTML )
               ->GetMaster().GetBackground();
}

static void GetTokenAndClass( const CSS1Selector *pSelector,
                              String& rToken, String& rClass )
{
    rToken = pSelector->GetString();
    rClass.Erase();

    if( CSS1_SELTYPE_ELEM_CLASS == pSelector->GetType() )
    {
        xub_StrLen nPos = rToken.Search( '.' );
        ASSERT( nPos != STRING_NOTFOUND, "kein Punkt in Class-Selektor???" );
        if( nPos != STRING_NOTFOUND )
        {
            rClass = rToken.Copy( nPos+1 );
            rToken.Erase( nPos );
        }
    }

    rToken.ToUpperAscii();
}

BOOL SwCSS1Parser::StyleParsed( const CSS1Selector *pSelector,
                                SfxItemSet& rItemSet,
                                SvxCSS1PropertyInfo& rPropInfo )
{
    if( !bIsNewDoc )
        return TRUE;

    CSS1SelectorType eSelType = pSelector->GetType();
    const CSS1Selector *pNext = pSelector->GetNext();

    if( CSS1_SELTYPE_ID==eSelType && !pNext )
    {
        InsertId( pSelector->GetString(), rItemSet, rPropInfo );
    }
    else if( CSS1_SELTYPE_CLASS==eSelType && !pNext )
    {
        InsertClass( pSelector->GetString(), rItemSet, rPropInfo );
    }
    else if( CSS1_SELTYPE_PAGE==eSelType )
    {
        if( !pNext ||
            (CSS1_SELTYPE_PSEUDO == pNext->GetType() &&
            (pNext->GetString().EqualsIgnoreCaseAscii(sCSS1_left) ||
             pNext->GetString().EqualsIgnoreCaseAscii(sCSS1_right) ||
             pNext->GetString().EqualsIgnoreCaseAscii(sCSS1_first)) ) )
            // || CSS1_SELTYPE_ELEMENT == pNext->GetType() )
        {
            String aName;
            if( pNext )
                aName = pNext->GetString();
            InsertPage( aName,
                        pNext != 0 /*CSS1_SELTYPE_PSEUDO == pNext->GetType()*/,
                        rItemSet, rPropInfo );
        }
    }

    if( CSS1_SELTYPE_ELEMENT != eSelType &&
        CSS1_SELTYPE_ELEM_CLASS != eSelType)
        return TRUE;

    // Token und Class zu dem Selektor holen
    String aToken, aClass;
    GetTokenAndClass( pSelector, aToken, aClass );
    int nToken = GetHTMLToken( aToken );

    // und noch ein ganz par Infos zum naechsten Element
    CSS1SelectorType eNextType = pNext ? pNext->GetType()
                                       : CSS1_SELTYPE_ELEMENT;

    // Erstmal ein par Spezialfaelle
    if( CSS1_SELTYPE_ELEMENT==eSelType )
    {
        switch( nToken )
        {
        case HTML_ANCHOR_ON:
            if( !pNext )
            {
                InsertTag( aToken, rItemSet, rPropInfo );
                return FALSE;
            }
            else if( pNext && CSS1_SELTYPE_PSEUDO == eNextType )
            {
                // vielleicht A:visited oder A:link

                String aPseudo( pNext->GetString() );
                aPseudo.ToLowerAscii();

                BOOL bInsert = FALSE;
                switch( aPseudo.GetChar( 0 ))
                {
                    case 'l':
                        if( aPseudo.EqualsAscii(sCSS1_link) )
                        {
                            bInsert = TRUE;
                        }
                        break;
                    case 'v':
                        if( aPseudo.EqualsAscii(sCSS1_visited) )
                        {
                            bInsert = TRUE;
                        }
                        break;
                }
                if( bInsert )
                {
                    String sTmp( aToken );
                    (sTmp += ':') += aPseudo;
                    InsertTag( sTmp, rItemSet, rPropInfo );
                    return FALSE;
                }
            }
            break;
        case HTML_BODY_ON:
            if( !pNext )
            {
                // BODY

                // Den Hintergrund muessen wir vor dem Setzen abfragen,
                // denn in SetPageDescAttrs wird er geloescht.
                const SfxPoolItem *pItem;
                if( SFX_ITEM_SET==rItemSet.GetItemState(RES_BACKGROUND,FALSE,&pItem) )
                {
                    const SvxBrushItem *pBrushItem =
                        (const SvxBrushItem *)pItem;

                    if( !pBrushItem->GetColor().GetTransparency() )
                        bBodyBGColorSet = TRUE;
                    if( GPOS_NONE != pBrushItem->GetGraphicPos() )
                        bBodyBackgroundSet = TRUE;
                }

                // Border and Padding
                rPropInfo.SetBoxItem( rItemSet, MIN_BORDER_DIST );

                // Ein par Attribute muessen an der Seitenvorlage gesetzt werden,
                // und zwar die, die nicht vererbt werden
                SetPageDescAttrs( 0, &rItemSet );

                // alle noch uebrigen Optionen koennen an der Standard-Vorlage
                // gesetzt werden und gelten dann automatisch als defaults
                if( SFX_ITEM_SET==rItemSet.GetItemState(RES_CHRATR_COLOR,FALSE) )
                    bBodyTextSet = TRUE;
                SetTxtCollAttrs(
                    GetTxtCollFromPool( RES_POOLCOLL_STANDARD ),
                    rItemSet, rPropInfo, this );

                return FALSE;
            }
            break;
        }
    }
    else if( CSS1_SELTYPE_ELEM_CLASS==eSelType &&  HTML_ANCHOR_ON==nToken &&
             !pNext && aClass.Len() >= 9 &&
             ('s' == aClass.GetChar(0) || 'S' == aClass.GetChar(0)) )
    {
        USHORT nPoolFmtId = 0;
        if( aClass.EqualsIgnoreCaseAscii(sHTML_sdendnote_sym) )
            nPoolFmtId = RES_POOLCHR_ENDNOTE;
        else if( aClass.EqualsIgnoreCaseAscii(sHTML_sdfootnote_sym) )
            nPoolFmtId = RES_POOLCHR_FOOTNOTE;
        if( nPoolFmtId )
        {
            SetCharFmtAttrs( GetCharFmtFromPool(nPoolFmtId), rItemSet );
            return FALSE;
        }
    }

    // Jetzt werden die Selektoren verarbeitet, die zu einer Absatz-Vorlage
    // gehoehren
    USHORT nPoolCollId = 0;
    switch( nToken )
    {
    case HTML_HEAD1_ON:
        nPoolCollId = RES_POOLCOLL_HEADLINE1;
        break;
    case HTML_HEAD2_ON:
        nPoolCollId = RES_POOLCOLL_HEADLINE2;
        break;
    case HTML_HEAD3_ON:
        nPoolCollId = RES_POOLCOLL_HEADLINE3;
        break;
    case HTML_HEAD4_ON:
        nPoolCollId = RES_POOLCOLL_HEADLINE4;
        break;
    case HTML_HEAD5_ON:
        nPoolCollId = RES_POOLCOLL_HEADLINE5;
        break;
    case HTML_HEAD6_ON:
        nPoolCollId = RES_POOLCOLL_HEADLINE6;
        break;
    case HTML_PARABREAK_ON:
        if( aClass.Len() >= 9 &&
            ('s' == aClass.GetChar(0) || 'S' == aClass.GetChar(0)) )
        {
            if( aClass.EqualsIgnoreCaseAscii(sHTML_sdendnote) )
                nPoolCollId = RES_POOLCOLL_ENDNOTE;
            else if( aClass.EqualsIgnoreCaseAscii(sHTML_sdfootnote) )
                nPoolCollId = RES_POOLCOLL_FOOTNOTE;

            if( nPoolCollId )
                aClass = aEmptyStr;
            else
                nPoolCollId = RES_POOLCOLL_TEXT;
        }
        else
        {
            nPoolCollId = RES_POOLCOLL_TEXT;
        }
        break;
    case HTML_ADDRESS_ON:
        nPoolCollId = RES_POOLCOLL_SENDADRESS;
        break;
    case HTML_BLOCKQUOTE_ON:
        nPoolCollId = RES_POOLCOLL_HTML_BLOCKQUOTE;
        break;
    case HTML_DT_ON:
        nPoolCollId = RES_POOLCOLL_HTML_DT;
        break;
    case HTML_DD_ON:
        nPoolCollId = RES_POOLCOLL_HTML_DD;
        break;
    case HTML_PREFORMTXT_ON:
        nPoolCollId = RES_POOLCOLL_HTML_PRE;
        break;
    case HTML_TABLEHEADER_ON:
    case HTML_TABLEDATA_ON:
        if( CSS1_SELTYPE_ELEMENT==eSelType && !pNext )
        {
            InsertTag( aToken, rItemSet, rPropInfo );
            return FALSE;
        }
        else if( CSS1_SELTYPE_ELEMENT==eSelType && pNext &&
                 (CSS1_SELTYPE_ELEMENT==eNextType ||
                  CSS1_SELTYPE_ELEM_CLASS==eNextType) )
        {
            // nicht TH und TD, aber TH P und TD P
            String aSubToken, aSubClass;
            GetTokenAndClass( pNext, aSubToken, aSubClass );
            if( HTML_PARABREAK_ON == GetHTMLToken( aSubToken ) )
            {
                aClass = aSubClass;
                pNext = pNext->GetNext();
                eNextType = pNext ? pNext->GetType() : CSS1_SELTYPE_ELEMENT;

                if( aClass.Len() || pNext )
                {
                    nPoolCollId =
                        HTML_TABLEHEADER_ON == nToken ? RES_POOLCOLL_TABLE_HDLN
                                                      : RES_POOLCOLL_TABLE;
                }
                else
                {
                    String sTmp( aToken );
                    sTmp += ' ';
                    sTmp.AppendAscii( sHTML_parabreak );
                    InsertTag( sTmp, rItemSet, rPropInfo );

                    return FALSE;
                }
            }
        }
        break;
    }

    if( nPoolCollId )
    {
        if( !pNext ||
            (CSS1_SELTYPE_PSEUDO==eNextType &&
#ifdef FULL_FIRST_LETTER
             pNext->GetString().EqualsIgnoreCaseAscii(sCSS1_first_letter)) )
#else
             pNext->GetString().EqualsIgnoreCaseAscii(sCSS1_first_letter) &&
             SVX_ADJUST_LEFT == rPropInfo.eFloat) )
#endif
        {
            // Entweder kein zusammengesetzter Selektor oder
            // ein X:first-line { float: left; ... }

            // Die Vorlage Suchen bzw. Anlegen
            SwTxtFmtColl *pColl = GetTxtFmtColl( nPoolCollId, aEmptyStr );
            if( aClass.Len() )
            {
                String aName( pColl->GetName() );
                AddClassName( aName, aClass );

                SwTxtFmtColl* pParentColl = pColl;
                pColl = pDoc->FindTxtFmtCollByName( aName );
                if( !pColl )
                    pColl = pDoc->MakeTxtFmtColl( aName, pParentColl );
            }
            if( !pNext )
            {
                // nur die Attribute an der Vorlage setzen
                const SfxPoolItem *pItem;
                const SvxBoxItem *pBoxItem = 0;
                if( SFX_ITEM_SET ==
                        pColl->GetAttrSet().GetItemState(RES_BOX,TRUE,&pItem) )
                    pBoxItem = (const SvxBoxItem *)pItem;
                rPropInfo.SetBoxItem( rItemSet, MIN_BORDER_DIST, pBoxItem );
                SetTxtCollAttrs( pColl, rItemSet, rPropInfo, this );
            }
            else
            {
                // ein Drop-Cap-Attribut basteln
                SwFmtDrop aDrop;
                aDrop.GetChars() = 1;

                // die Attribute in das DropCap-Attribut einfuegen
                FillDropCap( aDrop, rItemSet, &pColl->GetName() );

                // Das Attribut nur setzen, wenn float: left angegeben wurde
                // und das Initial ueber mehrere Zeilen geht. Sonst wird die
                // ggf. angelegte Zeichen-Vorlage spaeter ueber den Namen
                // gesucht und gesetzt.
                if( SVX_ADJUST_LEFT == rPropInfo.eFloat &&
                    aDrop.GetLines() > 1 )
                {
                    pColl->SetAttr( aDrop );
                }
            }

            return FALSE;
        }

        return TRUE;
    }

    // Jetzt werden die Selektoten verarbeitet, die zu einer Zechenvorlage
    // gehoehren. Zusammengesetzte gibt es hier allerdings nich nicht.
    if( pNext )
        return TRUE;

    SwCharFmt *pCFmt = GetChrFmt( nToken, aEmptyStr );
    if( pCFmt )
    {
        if( aClass.Len() )
        {
            String aName( pCFmt->GetName() );
            AddClassName( aName, aClass );
            SwCharFmt *pParentCFmt = pCFmt;

            pCFmt = pDoc->FindCharFmtByName( aName );
            if( !pCFmt )
            {
                pCFmt = pDoc->MakeCharFmt( aName, pParentCFmt );
                pCFmt->SetAuto( FALSE );
            }
        }

        SetCharFmtAttrs( pCFmt, rItemSet );
        return FALSE;
    }

    return TRUE;
}

#ifdef USED
void SwCSS1Parser::SetFmtAttrs( const SfxItemSet& rItemSet,
                                SwFmt *pChildFmt1,
                                SwFmt *pChildFmt2 )
{
    SfxItemIter aIter( rItemSet );

    const SfxItemSet& rItemSet1 = pChildFmt1->GetAttrSet();
    const SfxItemSet* pItemSet2 = pChildFmt2 ? &pChildFmt2->GetAttrSet() : 0;
    const SfxPoolItem *pPItem = aIter.FirstItem();
    while( pPItem )
    {
        // wenn das Attribut an einer der abhaengigen Vorlagen nicht gesetzt
        // ist, muss es dort explizit auf den Wrt gesetzt werden, der
        // dort bereits aus der Parent-Vorlage geerbt wird.

        USHORT nWhich = pPItem->Which();
        const SfxPoolItem *pCItem;
        if( SFX_ITEM_SET != rItemSet1.GetItemState( nWhich, FALSE, &pCItem ) )
            pChildFmt1->SetAttr( pChildFmt1->GetAttr(nWhich) );

        if( pChildFmt2 &&
            SFX_ITEM_SET != pItemSet2->GetItemState( nWhich, FALSE, &pCItem ) )
            pChildFmt2->SetAttr( pChildFmt2->GetAttr(nWhich) );

        // auf zum naechsten Item
        pPItem = aIter.NextItem();
    }
}
#endif

ULONG SwCSS1Parser::GetFontHeight( USHORT nSize ) const
{
    return aFontHeights[ nSize>6 ? 6 : nSize ];
}

const FontList *SwCSS1Parser::GetFontList() const
{
    const FontList *pFList = 0;
    SwDocShell *pDocSh = pDoc->GetDocShell();
    if( pDocSh )
    {
        const SvxFontListItem *pFListItem =
            (const SvxFontListItem *)pDocSh->GetItem(SID_ATTR_CHAR_FONTLIST);
        if( pFListItem )
            pFList = pFListItem->GetFontList();
    }

    return pFList;
}

/*  */

SwCharFmt* SwCSS1Parser::GetChrFmt( USHORT nToken, const String& rClass ) const
{
    // die entsprechende Vorlage suchen
    USHORT nPoolId = 0;
    const sal_Char* sName = 0;
    switch( nToken )
    {
    case HTML_EMPHASIS_ON:      nPoolId = RES_POOLCHR_HTML_EMPHASIS;    break;
    case HTML_CITIATION_ON:     nPoolId = RES_POOLCHR_HTML_CITIATION;   break;
    case HTML_STRONG_ON:        nPoolId = RES_POOLCHR_HTML_STRONG;      break;
    case HTML_CODE_ON:          nPoolId = RES_POOLCHR_HTML_CODE;        break;
    case HTML_SAMPLE_ON:        nPoolId = RES_POOLCHR_HTML_SAMPLE;      break;
    case HTML_KEYBOARD_ON:      nPoolId = RES_POOLCHR_HTML_KEYBOARD;    break;
    case HTML_VARIABLE_ON:      nPoolId = RES_POOLCHR_HTML_VARIABLE;    break;
    case HTML_DEFINSTANCE_ON:   nPoolId = RES_POOLCHR_HTML_DEFINSTANCE; break;
    case HTML_TELETYPE_ON:      nPoolId = RES_POOLCHR_HTML_TELETYPE;    break;

    case HTML_SHORTQUOTE_ON:    sName = sHTML_shortquote;   break;
    case HTML_LANGUAGE_ON:      sName = sHTML_language;     break;
    case HTML_AUTHOR_ON:        sName = sHTML_author;       break;
    case HTML_PERSON_ON:        sName = sHTML_person;       break;
    case HTML_ACRONYM_ON:       sName = sHTML_acronym;      break;
    case HTML_ABBREVIATION_ON:  sName = sHTML_abbreviation; break;
    case HTML_INSERTEDTEXT_ON:  sName = sHTML_insertedtext; break;
    case HTML_DELETEDTEXT_ON:   sName = sHTML_deletedtext;  break;
    }

    // die Vorlage suchen oder anlegen (geht nur mit Namen)
    if( !nPoolId && !sName )
        return 0;

    // Die Vorlage (ohne Class) suchen oder anlegen
    SwCharFmt *pCFmt = 0;
    if( nPoolId )
    {
        pCFmt = GetCharFmtFromPool( nPoolId );
    }
    else
    {
        String sCName( String::CreateFromAscii(sName) );
        pCFmt = pDoc->FindCharFmtByName( sCName );
        if( !pCFmt )
        {
            pCFmt = pDoc->MakeCharFmt( sCName, pDoc->GetDfltCharFmt() );
            pCFmt->SetAuto( FALSE );
        }
    }

    ASSERT( pCFmt, "Keine Zeichen-Vorlage???" );

    // Wenn es eine Klasse gibt, die Klassen-Vorlage suchen aber nicht
    // neu anlegen.
    if( rClass.Len() )
    {
        String aTmp( pCFmt->GetName() );
        AddClassName( aTmp, rClass );
        SwCharFmt *pClassCFmt = pDoc->FindCharFmtByName( aTmp );
        if( pClassCFmt )
        {
            pCFmt = pClassCFmt;
        }
        else
        {
            SvxCSS1MapEntry *pClass = GetClass( rClass );
            if( pClass )
            {
                pCFmt = pDoc->MakeCharFmt( aTmp, pCFmt );
                pCFmt->SetAuto( FALSE );
                SfxItemSet aItemSet( pClass->GetItemSet() );
                SetCharFmtAttrs( pCFmt, aItemSet );
            }
        }
    }

    return pCFmt;
}


/*  */

SwTxtFmtColl *SwCSS1Parser::GetTxtCollFromPool( USHORT nPoolId ) const
{
    USHORT nOldArrLen = pDoc->GetTxtFmtColls()->Count();

    SwTxtFmtColl *pColl = pDoc->GetTxtCollFromPool( nPoolId );

    if( bIsNewDoc )
    {
        USHORT nArrLen = pDoc->GetTxtFmtColls()->Count();
        for( USHORT i=nOldArrLen; i<nArrLen; i++ )
            lcl_swcss1_setEncoding( *(*pDoc->GetTxtFmtColls())[i],
                                    GetDfltEncoding() );
    }

    return pColl;
}

SwCharFmt *SwCSS1Parser::GetCharFmtFromPool( USHORT nPoolId ) const
{
    USHORT nOldArrLen = pDoc->GetCharFmts()->Count();

    SwCharFmt *pCharFmt = pDoc->GetCharFmtFromPool( nPoolId );

    if( bIsNewDoc )
    {
        USHORT nArrLen = pDoc->GetCharFmts()->Count();

        for( USHORT i=nOldArrLen; i<nArrLen; i++ )
            lcl_swcss1_setEncoding( *(*pDoc->GetCharFmts())[i],
                                    GetDfltEncoding() );
    }

    return pCharFmt;
}

SwTxtFmtColl *SwCSS1Parser::GetTxtFmtColl( USHORT nTxtColl,
                                           const String& rClass )
{
    SwTxtFmtColl* pColl = 0;

    String aClass( rClass );
    if( RES_POOLCOLL_TEXT == nTxtColl && aClass.Len() >= 9 &&
        ('s' == aClass.GetChar(0) || 'S' == aClass.GetChar(0) ) )
    {
        if( aClass.EqualsIgnoreCaseAscii(sHTML_sdendnote) )
        {
            nTxtColl = RES_POOLCOLL_ENDNOTE;
            aClass = aEmptyStr;
        }
        else if( aClass.EqualsIgnoreCaseAscii(sHTML_sdfootnote) )
        {
            nTxtColl = RES_POOLCOLL_FOOTNOTE;
            aClass = aEmptyStr;
        }
    }

    String sName;
    if( USER_FMT & nTxtColl )       // eine vom Reader angelegte
    {
        ASSERT( !this, "Wo kommt die Benutzer-Vorlage her?" );
        pColl = GetTxtCollFromPool( RES_POOLCOLL_STANDARD );
    }
    else
    {
        pColl = GetTxtCollFromPool( nTxtColl );
    }

    ASSERT( pColl, "Keine Absatz-Vorlage???" );
    if( aClass.Len() )
    {
        String aTmp( pColl->GetName() );
        AddClassName( aTmp, aClass );
        SwTxtFmtColl* pClassColl = pDoc->FindTxtFmtCollByName( aTmp );

        if( !pClassColl &&
            (nTxtColl==RES_POOLCOLL_TABLE ||
             nTxtColl==RES_POOLCOLL_TABLE_HDLN) )
        {
            // Wenn dieser Fall eintritt, dann wurde ein <TD><P CLASS=foo>
            // gelesen, aber die TD.foo Vorlage nicht gefunden. Dann muessen
            // wir P.foo nehmen, wenn es sie gibt.
            SwTxtFmtColl* pCollText =
                GetTxtCollFromPool( RES_POOLCOLL_TEXT );
            aTmp = pCollText->GetName();
            AddClassName( aTmp, aClass );
            pClassColl = pDoc->FindTxtFmtCollByName( aTmp );
        }

        if( pClassColl )
        {
            pColl = pClassColl;
        }
        else
        {
            const SvxCSS1MapEntry *pClass = GetClass( aClass );
            if( pClass )
            {
                pColl = pDoc->MakeTxtFmtColl( aTmp, pColl );
                SfxItemSet aItemSet( pClass->GetItemSet() );
                SvxCSS1PropertyInfo aPropInfo( pClass->GetPropertyInfo() );
                aPropInfo.SetBoxItem( aItemSet, MIN_BORDER_DIST );
                BOOL bPositioned = MayBePositioned( pClass->GetPropertyInfo() );
                if( bPositioned )
                    aItemSet.ClearItem( RES_BACKGROUND );
                SetTxtCollAttrs( pColl, aItemSet, aPropInfo,
                                 this );
            }
        }

    }

    if( pColl )
        lcl_swcss1_setEncoding( *pColl, GetDfltEncoding() );

    return pColl;
}

SwPageDesc *SwCSS1Parser::GetMasterPageDesc()
{
    return pDoc->GetPageDescFromPool( RES_POOLPAGE_HTML );
}

static SwPageDesc *FindPageDesc( SwDoc *pDoc, USHORT nPoolId, USHORT& rPage )
{
    USHORT nPageDescs = pDoc->GetPageDescCnt();
    for( rPage=0; rPage < nPageDescs &&
         pDoc->GetPageDesc(rPage).GetPoolFmtId() != nPoolId; rPage++ )
         ;

    return rPage < nPageDescs ? &pDoc->_GetPageDesc( rPage ) : 0;
}

const SwPageDesc *SwCSS1Parser::GetPageDesc( USHORT nPoolId, BOOL bCreate )
{
    if( RES_POOLPAGE_HTML == nPoolId )
        return pDoc->GetPageDescFromPool( RES_POOLPAGE_HTML );

    USHORT nPage;
    const SwPageDesc *pPageDesc = FindPageDesc( pDoc, nPoolId, nPage );
    if( !pPageDesc && bCreate )
    {
        // Die erste Seite wird aus der rechten Seite erzeugt, wenn es die
        // gibt.
        SwPageDesc *pMasterPageDesc = 0;
        if( RES_POOLPAGE_FIRST == nPoolId )
            pMasterPageDesc = FindPageDesc( pDoc, RES_POOLPAGE_RIGHT, nPage );
        if( !pMasterPageDesc )
            pMasterPageDesc = pDoc->GetPageDescFromPool( RES_POOLPAGE_HTML );

        // Die neue Seitenvorlage entsteht aus dem Master durch kopieren.
        SwPageDesc *pNewPageDesc = pDoc->GetPageDescFromPool( nPoolId );

        // dazu brauchen wir auch die Nummer der neuen Vorlage
        pPageDesc = FindPageDesc( pDoc, nPoolId, nPage );
        ASSERT( pPageDesc==pNewPageDesc, "Seitenvorlage nicht gefunden" );

        pDoc->CopyPageDesc( *pMasterPageDesc, *pNewPageDesc, FALSE );

        // Die Vorlagen an ihren neuen Zweck anpassen.
        const SwPageDesc *pFollow = 0;
        BOOL bSetFollowFollow = FALSE;
        switch( nPoolId )
        {
        case RES_POOLPAGE_FIRST:
            // Wenn es schon eine linke Seite gibt, dann ist das die
            // Folge-Vorlage, sonst ist es die HTML-Vorlage.
            pFollow = GetLeftPageDesc();
            if( !pFollow )
                pFollow = pMasterPageDesc;
            break;

        case RES_POOLPAGE_RIGHT:
            // Wenn die linke Vorlage schon angelegt ist, passiert hier gar
            // nichts. Sonst wird die linke Vorlage angelegt und sorgt auch
            // fuer die richtige Verkettung mit der rechten Voralge.
            GetLeftPageDesc( TRUE );
            break;

        case RES_POOLPAGE_LEFT:
            // Die rechte Vorlage wird angelegt, wenn sie noch nicht existiert.
            // Es findet aber keine Verkettung statt.
            // Wenn schon eine erste Seitenvorlage existiert, wird die linke
            // Vorlage die Folge-Vorlage der ersten Seite.
            pFollow = GetRightPageDesc( TRUE );
            bSetFollowFollow = TRUE;
            {
                const SwPageDesc *pFirstPageDesc = GetFirstPageDesc();
                if( pFirstPageDesc )
                {
                    SwPageDesc aNewFirstPageDesc( *pFirstPageDesc );
                    aNewFirstPageDesc.SetFollow( pNewPageDesc );
                    ChgPageDesc( pFirstPageDesc, aNewFirstPageDesc );
                }
            }
            break;
        }

        if( pFollow )
        {
            SwPageDesc aNewPageDesc( *pNewPageDesc );
            aNewPageDesc.SetFollow( pFollow );
            ChgPageDesc( pNewPageDesc, aNewPageDesc );

            if( bSetFollowFollow )
            {
                SwPageDesc aNewFollowPageDesc( *pFollow );
                aNewFollowPageDesc.SetFollow( pNewPageDesc );
                ChgPageDesc( pFollow, aNewFollowPageDesc );
            }
        }
        pPageDesc = pNewPageDesc;
    }

    return pPageDesc;
}


BOOL SwCSS1Parser::MayBePositioned( const SvxCSS1PropertyInfo& rPropInfo,
                                    BOOL bAutoWidth )
{
    // abs-pos
    // left/top none    auto    twip    perc
    //
    // none     Z       Z       -       -
    // auto     Z       Z       -       -
    // twip     Z       Z       S/R     -
    // perc     -       -       -       -
    //
    // - das Tag wird absolut positioniert und left/top sind beide
    //   gegeben und enthalten auch keine %-Angabe, oder
    // - das Tag soll fliessen, und
    // - es wurde eine Breite angegeben (in beiden Faellen noetig)
    return ( ( SVX_CSS1_POS_ABSOLUTE     == rPropInfo.ePosition &&
               SVX_CSS1_LTYPE_PERCENTAGE != rPropInfo.eLeftType &&
               SVX_CSS1_LTYPE_PERCENTAGE != rPropInfo.eTopType &&
              (SVX_CSS1_LTYPE_TWIP       == rPropInfo.eLeftType ||
               SVX_CSS1_LTYPE_TWIP       != rPropInfo.eTopType) ) ||
             ( SVX_ADJUST_END            != rPropInfo.eFloat  ) ) &&
           ( bAutoWidth ||
             SVX_CSS1_LTYPE_TWIP         == rPropInfo.eWidthType ||
             SVX_CSS1_LTYPE_PERCENTAGE   == rPropInfo.eWidthType );
}


/*  */

void SwCSS1Parser::AddClassName( String& rFmtName, const String& rClass )
{
    ASSERT( rClass.Len(), "Style-Klasse ohne Laenge?" );

// ??????????
//  String aTmp( rClass );
//  GetpApp()->GetAppInternational().ToLower( aTmp );

    (rFmtName += '.') += rClass;
}

/*  */

void SwCSS1Parser::FillDropCap( SwFmtDrop& rDrop,
                                SfxItemSet& rItemSet,
                                const String *pName )
{
    // die Anzahl der Zeilen entspricht in etwa einer %-Angabe
    // fuer die Hoehe (was passiert mit absoluten Hoehen???)
    BYTE nLines = 1;
    const SfxPoolItem *pItem;
    if( SFX_ITEM_SET == rItemSet.GetItemState( RES_CHRATR_FONTSIZE, FALSE, &pItem ) )
    {
        USHORT nProp = ((const SvxFontHeightItem *)pItem)->GetProp();
        nLines = (BYTE)((nProp + 50) / 100);
        if( nLines < 1 )
            nLines = 1;
        else if( nLines > MAX_DROPCAP_LINES )
            nLines = MAX_DROPCAP_LINES;

        // Nur wenn nLines>1 ist, wird das Attribut auch gesetzt. Dann
        // brauchen wir die Font-Hoehe aber auch nicht in der Zeichen-Vorlage.
        if( nLines > 1 )
            rItemSet.ClearItem( RES_CHRATR_FONTSIZE );
    }

    // Bei harter Attributierung (pName==0) koennen wir aufhoehren, wenn
    // das Initial nur ueber eine Zeile geht.
#ifdef FULL_FIRST_LETTER
    if( nLines==1 && !pName )
#else
    if( nLines==1 )
#endif
        return;

    rDrop.GetLines() = nLines;

    // ein rechter Rand wird der Abstand zum Text!
    if( SFX_ITEM_SET == rItemSet.GetItemState( RES_LR_SPACE, FALSE, &pItem ) )
    {
        rDrop.GetDistance() =
            ((const SvxLRSpaceItem *)pItem)->GetRight();
        rItemSet.ClearItem( RES_LR_SPACE );
    }

    // Fuer alle anderen Attribute eine Zeichen-Vorlage anlegen
    if( rItemSet.Count() )
    {
        SwCharFmt *pCFmt = 0;
        String aName;
        if( pName )
        {
            aName = *pName;
            AddFirstLetterExt( aName );
            pCFmt = pDoc->FindCharFmtByName( aName );
        }
        else
        {
            do
            {
                aName.AssignAscii( sCSS1_first_letter );
                aName.Append( ' ' );
                aName.Append(
                    String::CreateFromInt32( (sal_Int32)(++nDropCapCnt) ) );
            }
            while( pDoc->FindCharFmtByName(aName) );
        }

        if( !pCFmt )
        {
            pCFmt = pDoc->MakeCharFmt( aName, pDoc->GetDfltCharFmt() );
            pCFmt->SetAuto( FALSE );
        }
        SetCharFmtAttrs( pCFmt, rItemSet );

        // Die Zeichenvorlage braucht nur im Attribut gesetzt werden, wenn
        // auch das Attribut gesetzt wird.
        if( nLines > 1 )
            rDrop.SetCharFmt( pCFmt );
    }
}

/*  */

// CSS1-sezifisches des SwHTMLParsers

_HTMLAttr **SwHTMLParser::GetAttrTabEntry( USHORT nWhich )
{
    // den zu dem Item gehoehrenden Tabellen-Eintrag ermitteln ...
    _HTMLAttr **ppAttr = 0;
    switch( nWhich )
    {
    case RES_CHRATR_BLINK:
        ppAttr = &aAttrTab.pBlink;
        break;
    case RES_CHRATR_CASEMAP:
        ppAttr = &aAttrTab.pCaseMap;
        break;
    case RES_CHRATR_COLOR:
        ppAttr = &aAttrTab.pFontColor;
        break;
    case RES_CHRATR_CROSSEDOUT:
        ppAttr = &aAttrTab.pStrike;
        break;
    case RES_CHRATR_ESCAPEMENT:
        ppAttr = &aAttrTab.pEscapement;
        break;
    case RES_CHRATR_FONT:
        ppAttr = &aAttrTab.pFont;
        break;
    case RES_CHRATR_FONTSIZE:
        ppAttr = &aAttrTab.pFontHeight;
        break;
    case RES_CHRATR_KERNING:
        ppAttr = &aAttrTab.pKerning;
        break;
    case RES_CHRATR_POSTURE:
        ppAttr = &aAttrTab.pItalic;
        break;
    case RES_CHRATR_UNDERLINE:
        ppAttr = &aAttrTab.pUnderline;
        break;
    case RES_CHRATR_WEIGHT:
        ppAttr = &aAttrTab.pBold;
        break;
    case RES_CHRATR_BACKGROUND:
        ppAttr = &aAttrTab.pCharBrush;
        break;

    case RES_PARATR_LINESPACING:
        ppAttr = &aAttrTab.pLineSpacing;
        break;
    case RES_PARATR_ADJUST:
        ppAttr = &aAttrTab.pAdjust;
        break;

    case RES_LR_SPACE:
        ppAttr = &aAttrTab.pLRSpace;
        break;
    case RES_UL_SPACE:
        ppAttr = &aAttrTab.pULSpace;
        break;
    case RES_BOX:
        ppAttr = &aAttrTab.pBox;
        break;
    case RES_BACKGROUND:
        ppAttr = &aAttrTab.pBrush;
        break;
    case RES_BREAK:
        ppAttr = &aAttrTab.pBreak;
        break;
    case RES_PAGEDESC:
        ppAttr = &aAttrTab.pPageDesc;
        break;
    case RES_PARATR_SPLIT:
        ppAttr = &aAttrTab.pSplit;
        break;
    case RES_PARATR_WIDOWS:
        ppAttr = &aAttrTab.pWidows;
        break;
    case RES_PARATR_ORPHANS:
        ppAttr = &aAttrTab.pOrphans;
        break;
    case RES_KEEP:
        ppAttr = &aAttrTab.pKeep;
        break;
    }

    return ppAttr;
}

void SwHTMLParser::NewStyle()
{
    String sType;

    const HTMLOptions *pOptions = GetOptions();
    for( USHORT i = pOptions->Count(); i; )
    {
        const HTMLOption *pOption = (*pOptions)[--i];
        if( HTML_O_TYPE==pOption->GetToken() )
            sType = pOption->GetString();
    }

    bIgnoreRawData = sType.Len() &&
                     !sType.GetToken(0,';').EqualsAscii(sCSS_mimetype);
}

void SwHTMLParser::EndStyle()
{
    bIgnoreRawData = FALSE;

    if( aStyleSource.Len() )
    {
        pCSS1Parser->ParseStyleSheet( aStyleSource );
        aStyleSource.Erase();
    }
}

BOOL SwHTMLParser::FileDownload( const String& rURL,
                                 String& rStr )
{
    // View wegschmeissen (wegen Reschedule)
    ViewShell *pOldVSh = CallEndAction();
    SetSaveBaseURL();

    // Ein Medium anlegen
    SfxMedium aDLMedium( rURL, STREAM_READ | STREAM_SHARE_DENYWRITE, FALSE );
    aDLMedium.SetTransferPriority( SFX_TFPRIO_SYNCHRON );

    // Medium registrieren, damit abgebrochen werden kann
    if( pDoc->GetDocShell() )
        pDoc->GetDocShell()->RegisterTransfer( aDLMedium );

    SvStream* pStream = aDLMedium.GetInStream();
    if( pStream )
    {
        SvMemoryStream aStream;
        aStream << *pStream;

        aStream.Seek( STREAM_SEEK_TO_END );
        DBG_ASSERT( aStream.Tell() < STRING_MAXLEN,
                    "File zu lang fuer einen String, Ende abgeschnitten" );
        xub_StrLen nLen = aStream.Tell() < STRING_MAXLEN
                        ? (xub_StrLen)aStream.Tell()
                        : STRING_MAXLEN;

        rStr = String( (const sal_Char *)aStream.GetData(), nLen,
                       GetSrcEncoding() );
    }

    GetSaveAndSetOwnBaseURL();

    // wurde abgebrochen?
    if( ( pDoc->GetDocShell() && pDoc->GetDocShell()->IsAbortingImport() )
        || 1 == pDoc->GetLinkCnt() )
    {
        // wurde der Import vom SFX abgebrochen?
        eState = SVPAR_ERROR;
        pStream = 0;
    }

    // View wieder anlgen
#ifdef DEBUG
    ViewShell *pVSh =
#endif
        CallStartAction( pOldVSh );
#ifdef DEBUG
    ASSERT( pOldVSh == pVSh, "FileDownload: ViewShell wurde ausgetauscht" );
#endif

    return pStream!=0;
}

void SwHTMLParser::InsertLink()
{
    BOOL bFinishDownload = FALSE;
    if( pPendStack )
    {
        ASSERT( ShouldFinishFileDownload(),
                "Pending-Stack ohne File-Download?" );

        SwPendingStack* pTmp = pPendStack->pNext;
        delete pPendStack;
        pPendStack = pTmp;
        ASSERT( !pPendStack, "Wo kommt der Pending-Stack her?" );

        bFinishDownload = TRUE;
    }
    else
    {
        String sRel, sHRef, sType;

        const HTMLOptions *pOptions = GetOptions();
        for( USHORT i = pOptions->Count(); i; )
        {
            const HTMLOption *pOption = (*pOptions)[--i];
            switch( pOption->GetToken() )
            {
                case HTML_O_REL:
                    sRel = pOption->GetString();
                    break;
                case HTML_O_HREF:
                    ASSERT( INetURLObject::GetBaseURL() == sBaseURL,
                            "<LINK>: Base URL ist zerschossen" );
                    sHRef = INetURLObject::RelToAbs( pOption->GetString() );
                    break;
                case HTML_O_TYPE:
                    sType = pOption->GetString();
                    break;
            }
        }

        if( sHRef.Len() && sRel.EqualsIgnoreCaseAscii( "STYLESHEET" ) &&
            ( !sType.Len() ||
              sType.GetToken(0,';').EqualsAscii(sCSS_mimetype) ) )
        {
            if( GetMedium() )
            {
                // Download des Style-Source starten
                StartFileDownload( sHRef, 0, pDoc->GetDocShell() );
                if( IsParserWorking() )
                {
                    // Der Style wurde synchron geladen und wir koennen
                    // es direkt aufrufen.
                    bFinishDownload = TRUE;
                }
                else
                {
                    // Der Style wird asynchron geladen und ist erst beim
                    // naechsten Continue-Aufruf da. Wir muessen deshalb einen
                    // Pending-Stack anlegen, damit wir hierher zurueckkehren
                    pPendStack = new SwPendingStack( HTML_LINK, pPendStack );
                }
            }
            else
            {
                // File synchron holen
                String sSource;
                if( FileDownload( sHRef, sSource ) )
                    pCSS1Parser->ParseStyleSheet( sSource );
            }
        }
    }

    if( bFinishDownload )
    {
        String sSource;
        if( FinishFileDownload(sSource) && sSource.Len() )
            pCSS1Parser->ParseStyleSheet( sSource );
    }
}

BOOL SwCSS1Parser::ParseStyleSheet( const String& rIn )
{
    if( !SvxCSS1Parser::ParseStyleSheet( rIn ) )
        return FALSE;

    SwPageDesc *pMasterPageDesc =
        pDoc->GetPageDescFromPool( RES_POOLPAGE_HTML );

    SvxCSS1MapEntry *pPageEntry = GetPage( aEmptyStr, FALSE );
    if( pPageEntry )
    {
        // @page (wirkt auf alle Seiten, die es schon gibt

        SetPageDescAttrs( pMasterPageDesc, pPageEntry->GetItemSet(),
                          pPageEntry->GetPropertyInfo() );

        // Fuer alle anderen Seiten-Vorlagen, die es schon gibt,
        // muessen die Attribute auch noch gesetzt werden

        SetPageDescAttrs( GetFirstPageDesc(), pPageEntry->GetItemSet(),
                          pPageEntry->GetPropertyInfo() );
        SetPageDescAttrs( GetLeftPageDesc(), pPageEntry->GetItemSet(),
                          pPageEntry->GetPropertyInfo() );
        SetPageDescAttrs( GetRightPageDesc(), pPageEntry->GetItemSet(),
                          pPageEntry->GetPropertyInfo() );
//      if( pNamedPageDescs )
//      {
//          for( USHORT i=0; i<pNamedPageDescs->Count(); i++ )
//              SetPageDescAttrs( (*pNamedPageDescs)[i],
//                                pPageEntry->GetItemSet(),
//                                pPageEntry->GetPropertyInfo() );
//      }

    }

    pPageEntry = GetPage( String::CreateFromAscii(sCSS1_first), TRUE );
    if( pPageEntry )
    {
        SetPageDescAttrs( GetFirstPageDesc(TRUE), pPageEntry->GetItemSet(),
                          pPageEntry->GetPropertyInfo() );
        bSetFirstPageDesc = TRUE;
    }

    pPageEntry = GetPage( String::CreateFromAscii(sCSS1_right), TRUE );
    if( pPageEntry )
    {
        SetPageDescAttrs( GetRightPageDesc(TRUE), pPageEntry->GetItemSet(),
                          pPageEntry->GetPropertyInfo() );
        bSetRightPageDesc = TRUE;
    }

    pPageEntry = GetPage( String::CreateFromAscii(sCSS1_left), TRUE );
    if( pPageEntry )
        SetPageDescAttrs( GetLeftPageDesc(TRUE), pPageEntry->GetItemSet(),
                          pPageEntry->GetPropertyInfo() );

    // und jetzt noch die benannten Vorlagen
//  for( USHORT i=0; i < GetPageCount(); i++ )
//  {
//      pPageEntry = GetPage( i );
//      const String& rKey = pPageEntry->GetKey();
//      if( !rKey.Len() || rKey.GetChar(0) == ':' )
//          continue;
//
//      String aName( rKey );
//      GetpApp()->GetAppInternational().ToLower( aName );
//      USHORT nPage = pDoc->MakePageDesc( aName );
//      SwPageDesc *pPageDesc = &pDoc->_GetPageDesc( nPage );
//
//      // Die neue Seitenvorlage entsteht aus dem Master durch kopieren.
//      pDoc->CopyPageDesc( *pMasterPageDesc, *pPageDesc );
//      SetPageDescAttrs( pPageDesc, pPageEntry->GetItemSet(),
//                        pPageEntry->GetPropertyInfo() );
//
//      if( !pNamedPageDescs )
//          pNamedPageDescs = new SwHTMLPageDescs;
//      pNamedPageDescs->Insert( pPageDesc, pNamedPageDescs->Count() );
//  }

    return TRUE;
}

BOOL SwHTMLParser::ParseStyleOptions( const String &rStyle,
                                      const String &rId,
                                      const String &rClass,
                                      SfxItemSet &rItemSet,
                                      SvxCSS1PropertyInfo &rPropInfo )
{
    BOOL bRet = FALSE;

    if( rClass.Len() )
    {
        SvxCSS1MapEntry *pClass = pCSS1Parser->GetClass( rClass );
        if( pClass )
        {
            pCSS1Parser->MergeStyles( pClass->GetItemSet(),
                                      pClass->GetPropertyInfo(),
                                      rItemSet, rPropInfo, FALSE );
            bRet = TRUE;
        }
    }

    if( rId.Len() )
    {
        SvxCSS1MapEntry *pId = pCSS1Parser->GetId( rId );
        if( pId )
            pCSS1Parser->MergeStyles( pId->GetItemSet(),
                                      pId->GetPropertyInfo(),
                                      rItemSet, rPropInfo, rClass.Len()!=0 );
        rPropInfo.aId = rId;
        bRet = TRUE;
    }

    if( rStyle.Len() )
    {
        pCSS1Parser->ParseStyleOption( rStyle, rItemSet, rPropInfo );
        bRet = TRUE;
    }

    if( bRet )
        rPropInfo.SetBoxItem( rItemSet, MIN_BORDER_DIST );

    return bRet;
}

void SwHTMLParser::SetAnchorAndAdjustment( const SfxItemSet &rItemSet,
                                           const SvxCSS1PropertyInfo &rPropInfo,
                                           SfxItemSet &rFrmItemSet )
{
    SwFmtAnchor aAnchor;

    SwHoriOrient eHoriOri = HORI_NONE;
    SwVertOrient eVertOri = VERT_NONE;
    SwRelationOrient eHoriRel = FRAME;
    SwRelationOrient eVertRel = FRAME;
    SwTwips nHoriPos = 0, nVertPos = 0;
    SwSurround eSurround = SURROUND_THROUGHT;
    if( SVX_CSS1_POS_ABSOLUTE == rPropInfo.ePosition )
    {
        if( SVX_CSS1_LTYPE_TWIP == rPropInfo.eLeftType &&
            SVX_CSS1_LTYPE_TWIP == rPropInfo.eTopType )
        {
            // Absolut positionierte Objekte sind seitengebunden, wenn
            // sie nicht schon in einem Rahmen stehen und sonst
            // Rahmengebunden.
            const SwStartNode *pFlySttNd =
                pDoc->GetNodes()[pPam->GetPoint()->nNode]->FindFlyStartNode();
            if( pFlySttNd )
            {
                aAnchor.SetType( FLY_AT_FLY );
                SwPosition aPos( *pFlySttNd );
                aAnchor.SetAnchor( &aPos );
            }
            else
            {
                aAnchor.SetType( FLY_PAGE );
                aAnchor.SetPageNum( 1 );
            }
            nHoriPos = rPropInfo.nLeft;
            nVertPos = rPropInfo.nTop;
        }
        else
        {
            aAnchor.SetType( FLY_AT_CNTNT );
            aAnchor.SetAnchor( pPam->GetPoint() );
            eVertOri = VERT_TOP;
            eVertRel = REL_CHAR;
            if( SVX_CSS1_LTYPE_TWIP == rPropInfo.eLeftType )
            {
                eHoriOri = HORI_NONE;
                eHoriRel = REL_PG_FRAME;
                nHoriPos = rPropInfo.nLeft;
            }
            else
            {
                eHoriOri = HORI_LEFT;
                eHoriRel = FRAME;   // wird noch umgeschossen
            }
        }
    }
    else
    {
        // fliessende Objekte werden Absatzgebunden eingefuegt, wenn
        // der Absatz noch leer ist und sonst auto-gebunden.
        // Auto-gebundene Rahmen werden zunaechst an der Position davor
        // eingefuegt und erst spaeter verschoben.
        xub_StrLen nCntnt = pPam->GetPoint()->nContent.GetIndex();
        if( nCntnt )
        {
            aAnchor.SetType( FLY_AUTO_CNTNT );
            pPam->Move( fnMoveBackward );
            eVertOri = VERT_CHAR_BOTTOM;
            eVertRel = REL_CHAR;
        }
        else
        {
            aAnchor.SetType( FLY_AT_CNTNT );
            eVertOri = VERT_TOP;
            eVertRel = PRTAREA;
        }

        aAnchor.SetAnchor( pPam->GetPoint() );

        if( nCntnt )
            pPam->Move( fnMoveForward );

        USHORT nLeftSpace = 0, nRightSpace = 0;
        short nIndent = 0;
        GetMarginsFromContextWithNumBul( nLeftSpace, nRightSpace, nIndent );

        if( SVX_ADJUST_RIGHT==rPropInfo.eFloat )
        {
            eHoriOri = HORI_RIGHT;
            eHoriRel = nRightSpace ? PRTAREA : FRAME;
            eSurround = SURROUND_LEFT;
        }
        else
        {
            eHoriOri = HORI_LEFT;
            eHoriRel = nLeftSpace ? PRTAREA : FRAME;
            eSurround = SURROUND_RIGHT;
        }
    }
    rFrmItemSet.Put( aAnchor );

    // Absolut Positioniert mit Durchlauf
    rFrmItemSet.Put( SwFmtHoriOrient( nHoriPos, eHoriOri, eHoriRel ) );
    rFrmItemSet.Put( SwFmtVertOrient( nVertPos, eVertOri, eVertRel ) );
    rFrmItemSet.Put( SwFmtSurround( eSurround ) );
}

void SwHTMLParser::SetVarSize( SfxItemSet &rItemSet,
                               SvxCSS1PropertyInfo &rPropInfo,
                               SfxItemSet &rFrmItemSet,
                               SwTwips nDfltWidth, BYTE nDfltPrcWidth )
{
    SwFrmSize eSize = ATT_MIN_SIZE;
    SwTwips nWidth = nDfltWidth, nHeight = MINFLY;
    BYTE nPrcWidth = nDfltPrcWidth, nPrcHeight = 0;
    switch( rPropInfo.eWidthType )
    {
    case SVX_CSS1_LTYPE_PERCENTAGE:
        nPrcWidth = rPropInfo.nWidth > 0 ? (BYTE)rPropInfo.nWidth : 1;
        nWidth = MINFLY;
        break;
    case SVX_CSS1_LTYPE_TWIP:
        nWidth = rPropInfo.nWidth > MINFLY ? rPropInfo.nWidth : MINFLY;
        nPrcWidth = 0;
        break;
    }
    switch( rPropInfo.eHeightType )
    {
    case SVX_CSS1_LTYPE_PERCENTAGE:
        nPrcHeight = rPropInfo.nHeight > 0 ? (BYTE)rPropInfo.nHeight : 1;
        break;
    case SVX_CSS1_LTYPE_TWIP:
        // Netscape und MS-IE interpretieren die Hoehe regelwiedrig
        // als Mindest-Hoehe, also machwn wir das auch so.
        nHeight = rPropInfo.nHeight > MINFLY ? rPropInfo.nHeight : MINFLY;
        break;
    }

    SwFmtFrmSize aFrmSize( eSize, nWidth, nHeight );
    aFrmSize.SetWidthPercent( nPrcWidth );
    aFrmSize.SetHeightPercent( nPrcHeight );
    rFrmItemSet.Put( aFrmSize );
}

void SwHTMLParser::SetFrmFmtAttrs( SfxItemSet &rItemSet,
                                   SvxCSS1PropertyInfo &rPropInfo,
                                   USHORT nFlags,
                                   SfxItemSet &rFrmItemSet )
{
    const SfxPoolItem *pItem;
    if( (nFlags & HTML_FF_BOX) != 0 &&
        SFX_ITEM_SET==rItemSet.GetItemState( RES_BOX, TRUE, &pItem ) )
    {
        if( (nFlags & HTML_FF_PADDING) == 0 )
        {
            SvxBoxItem aBoxItem( *(const SvxBoxItem *)pItem );
            // Alle 4 Seiten gleichzeitig auf 0 setzen
            aBoxItem.SetDistance( 0 );
            rFrmItemSet.Put( aBoxItem );
        }
        else
        {
            rFrmItemSet.Put( *pItem );
        }
        rItemSet.ClearItem( RES_BOX );
    }

    if( (nFlags & HTML_FF_BACKGROUND) != 0 &&
        SFX_ITEM_SET==rItemSet.GetItemState( RES_BACKGROUND, TRUE, &pItem ) )
    {
        rFrmItemSet.Put( *pItem );
        rItemSet.ClearItem( RES_BACKGROUND );
    }
}


/*  */

_HTMLAttrContext *SwHTMLParser::PopContext( USHORT nToken, USHORT nLimit,
                                            BOOL bRemove )
{
    USHORT nPos = aContexts.Count();
    if( nPos <= nContextStMin )
        return 0;

    BOOL bFound = 0==nToken;
    if( nToken )
    {
        // Stack-Eintrag zu dem Token suchen
        while( nPos > nContextStMin )
        {
            USHORT nCntxtToken = aContexts[--nPos]->GetToken();
            if( nCntxtToken == nToken )
            {
                bFound = TRUE;
                break;
            }
            else if( nCntxtToken == nLimit ) // 0 als Token kommt nicht vor
            {
                break;
            }
        }
    }
    else
    {
        nPos--;
    }

    _HTMLAttrContext *pCntxt = 0;
    if( bFound )
    {
        pCntxt = aContexts[nPos];
        if( bRemove )
            aContexts.Remove( nPos, 1 );
    }

    return pCntxt;
}

#ifdef USED
USHORT SwHTMLParser::GetTxtFmtCollFromContext() const
{
    USHORT nPos = aContexts.Count();
    USHORT nPoolId = 0;

    while( !nPoolId && nPos>0 ) // nicht nMinStack wg. Tabellen!!!
        nPoolId = aContexts[--nPos]->GetTxtFmtColl();

    if( !nPoolId )
        nPoolId = aDfltContext.GetTxtFmtColl();

    return nPoolId;
}
#endif

BOOL SwHTMLParser::GetMarginsFromContext( USHORT& nLeft,
                                          USHORT& nRight,
                                          short& nIndent,
                                          BOOL bIgnoreTopContext ) const
{
    USHORT nPos = aContexts.Count();
    if( bIgnoreTopContext )
    {
        if( !nPos )
            return FALSE;
        else
            nPos--;
    }

    while( nPos > nContextStAttrMin )
    {
        const _HTMLAttrContext *pCntxt = aContexts[--nPos];
        if( pCntxt->IsLRSpaceChanged() )
        {
            pCntxt->GetMargins( nLeft, nRight, nIndent );
            return TRUE;
        }
    }

    return FALSE;
}

BOOL SwHTMLParser::GetMarginsFromContextWithNumBul( USHORT& nLeft,
                                                    USHORT& nRight,
                                                    short& nIndent ) const
{
    BOOL bRet = GetMarginsFromContext( nLeft, nRight, nIndent );
#ifdef NUM_RELSPACE
    const SwHTMLNumRuleInfo& rInfo = ((SwHTMLParser*)this)->GetNumInfo();
    if( rInfo.GetDepth() )
    {
        BYTE nLevel = (BYTE)( (rInfo.GetDepth() <= MAXLEVEL ? rInfo.GetDepth()
                                                            : MAXLEVEL) - 1 );
        const SwNumFmt& rNumFmt = rInfo.GetNumRule()->Get(nLevel);
        nLeft += rNumFmt.GetAbsLSpace();
        nIndent = rNumFmt.GetFirstLineOffset();
    }
#endif

    return bRet;
}

void SwHTMLParser::GetULSpaceFromContext( USHORT& nUpper,
                                          USHORT& nLower ) const
{
    USHORT nDfltColl = 0;
    String aDfltClass;

    USHORT nPos = aContexts.Count();
    while( nPos > nContextStAttrMin )
    {
        const _HTMLAttrContext *pCntxt = aContexts[--nPos];
        if( pCntxt->IsULSpaceChanged() )
        {
            pCntxt->GetULSpace( nUpper, nLower );
            return;
        }
        else if( !nDfltColl )
        {
            nDfltColl = pCntxt->GetDfltTxtFmtColl();
            if( nDfltColl )
                aDfltClass = pCntxt->GetClass();
        }
    }

    if( !nDfltColl )
        nDfltColl = RES_POOLCOLL_TEXT;

    const SwTxtFmtColl *pColl =
        pCSS1Parser->GetTxtFmtColl( nDfltColl, aDfltClass );
    const SvxULSpaceItem& rULSpace = pColl->GetULSpace();
    nUpper = rULSpace.GetUpper();
    nLower = rULSpace.GetLower();
}

void SwHTMLParser::EndContextAttrs( _HTMLAttrContext *pContext, BOOL bRemove )
{
    _HTMLAttrs &rAttrs = pContext->GetAttrs();
    for( USHORT i=0; i<rAttrs.Count(); i++ )
    {
        _HTMLAttr *pAttr = rAttrs[i];

        if( RES_PARATR_DROP==pAttr->GetItem().Which() )
        {
            // Fuer DropCaps noch die Anzahl der Zeichen anpassen. Wenn
            // es am Ende 0 sind, wird das Attribut invalidiert und dann
            // von _SetAttr gar nicht erst gesetzt.
            xub_StrLen nChars = pPam->GetPoint()->nContent.GetIndex();
            if( nChars < 1 )
                pAttr->Invalidate();
            else if( nChars > MAX_DROPCAP_CHARS )
                nChars = MAX_DROPCAP_CHARS;
            ((SwFmtDrop&)pAttr->GetItem()).GetChars() = (BYTE)nChars;
        }

        EndAttr( pAttr );
    }

    if( bRemove && rAttrs.Count() )
        rAttrs.Remove( 0, rAttrs.Count() );
}

void SwHTMLParser::InsertParaAttrs( const SfxItemSet& rItemSet )
{
    SfxItemIter aIter( rItemSet );

    const SfxPoolItem *pItem = aIter.FirstItem();
    while( pItem )
    {
        // den zu dem Item gehoehrenden Tabellen-Eintrag ermitteln ...
        USHORT nWhich = pItem->Which();
        _HTMLAttr **ppAttr = GetAttrTabEntry( nWhich );

        if( ppAttr )
        {
            NewAttr( ppAttr, *pItem );
            if( RES_PARATR_BEGIN > nWhich )
                (*ppAttr)->SetLikePara();
            aParaAttrs.Insert( *ppAttr, aParaAttrs.Count() );
            EndAttr( *ppAttr, 0, FALSE );
        }

        pItem = aIter.NextItem();
    }
}

void SwHTMLParser::AddFormatAttrs( SfxItemSet& rItemSet,
                                   const SwFmt& rFmt ) const
{
    const SfxItemSet& rFmtItemSet = rFmt.GetAttrSet();
    const SfxPoolItem *pFmtItem, *pItem;
    SfxWhichIter aIter( rItemSet );

    USHORT nWhich = aIter.FirstWhich();
    while( nWhich )
    {
        if( SFX_ITEM_SET != rItemSet.GetItemState(nWhich,FALSE,&pItem) &&
            SFX_ITEM_SET == rFmtItemSet.GetItemState(nWhich,TRUE,&pFmtItem) )
        {
                rItemSet.Put( *pFmtItem );
        }

        nWhich = aIter.NextWhich();
    }
}

void SwHTMLParser::RemoveFormatAttrs( SfxItemSet& rItemSet,
                                      const SwFmt& rFmt ) const
{
    const SfxItemSet& rFmtItemSet = rFmt.GetAttrSet();
    const SfxPoolItem *pItem;
    SfxWhichIter aIter( rItemSet );

    USHORT nWhich = aIter.FirstWhich();
    while( nWhich )
    {
        if( SFX_ITEM_SET == rItemSet.GetItemState(nWhich,FALSE,&pItem) &&
            SFX_ITEM_SET == rFmtItemSet.GetItemState(nWhich,TRUE,&pItem) )
        {
                rItemSet.ClearItem( nWhich );
        }

        nWhich = aIter.NextWhich();
    }
}

void lcl_swcss1_setEncoding( SwFmt& rFmt, rtl_TextEncoding eEnc )
{
    if( RTL_TEXTENCODING_DONTKNOW == eEnc )
        return;

    const SfxItemSet& rItemSet = rFmt.GetAttrSet();
    const SfxPoolItem *pItem;
    if( SFX_ITEM_SET == rItemSet.GetItemState( RES_CHRATR_FONT, FALSE,&pItem ) )
    {
        const SvxFontItem& rFont = *(const SvxFontItem *)pItem;
        if( RTL_TEXTENCODING_SYMBOL != rFont.GetCharSet() )
        {
            SvxFontItem aFont( rFont.GetFamily(), rFont.GetFamilyName(),
                                  rFont.GetStyleName(), rFont.GetPitch(),
                                  eEnc );
            rFmt.SetAttr( aFont );
        }
    }
}

void SwCSS1Parser::SetDfltEncoding( rtl_TextEncoding eEnc )
{
    if( eEnc != GetDfltEncoding() )
    {
        if( bIsNewDoc )
        {
            // Set new encoding as pool default
            const SvxFontItem& rDfltFont =
                (const SvxFontItem&)pDoc->GetDefault( RES_CHRATR_FONT );
            SvxFontItem aFont( rDfltFont.GetFamily(), rDfltFont.GetFamilyName(),
                               rDfltFont.GetStyleName(), rDfltFont.GetPitch(),
                               eEnc );
            pDoc->SetDefault( aFont );

            // Change all paragraph styles that do specify a font.
            USHORT nArrLen = pDoc->GetTxtFmtColls()->Count();
            for( USHORT i=1; i<nArrLen; i++ )
                lcl_swcss1_setEncoding( *(*pDoc->GetTxtFmtColls())[i], eEnc );

            // Change all character styles that do specify a font.
            nArrLen = pDoc->GetCharFmts()->Count();
            for( i=1; i<nArrLen; i++ )
                lcl_swcss1_setEncoding( *(*pDoc->GetCharFmts())[i], eEnc );
        }

        SvxCSS1Parser::SetDfltEncoding( eEnc );
    }
}

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/html/htmlcss1.cxx,v 1.1.1.1 2000-09-18 17:14:55 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.96  2000/09/18 16:04:43  willem.vandorp
      OpenOffice header added.

      Revision 1.95  2000/08/30 16:46:26  jp
      use CharClass instead of international

      Revision 1.94  2000/04/28 14:29:11  mib
      unicode

      Revision 1.93  2000/04/10 12:20:55  mib
      unicode

      Revision 1.92  2000/03/03 15:21:00  os
      StarView remainders removed

      Revision 1.91  2000/02/11 14:37:03  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.90  1999/09/17 12:12:49  mib
      support of multiple and non system text encodings

      Revision 1.89  1999/06/11 14:45:26  MIB
      Individuelle Umrandungs-Abstaende


      Rev 1.88   11 Jun 1999 16:45:26   MIB
   Individuelle Umrandungs-Abstaende

      Rev 1.87   15 Apr 1999 13:51:30   MIB
   #41833#: Styles fuer A-Tag

      Rev 1.86   08 Apr 1999 17:35:36   MIB
   #64522#: Styles fuer TD/TH auswerten

      Rev 1.85   17 Mar 1999 16:45:22   MIB
   #63049#: Numerierungen mit relativen Abstaenden

      Rev 1.84   25 Feb 1999 16:00:44   MIB
   #61949#: globale Shell entsorgt

      Rev 1.83   22 Feb 1999 08:40:26   MA
   1949globale Shell entsorgt, Shells am RootFrm

      Rev 1.82   27 Jan 1999 09:43:38   OS
   #56371# TF_ONE51

      Rev 1.81   14 Jan 1999 13:28:26   MIB
   #60776#: Festen statt minimalen Zeilen-Abstand einstellen

      Rev 1.80   11 Jan 1999 16:05:34   JP
   Bug #60765#: CopyPageDesc - ggfs die PoolIds nicht mit kopieren

      Rev 1.79   02 Nov 1998 17:28:30   MIB
   #58480#: Fuss-/Endnoten

      Rev 1.78   21 Apr 1998 13:46:10   MIB
   fix: Keine Bookmark fuer abs-pos Objekte mit ID einfuegen

      Rev 1.77   20 Apr 1998 08:43:44   MIB
   fix: @page wieder auswerten

      Rev 1.76   15 Apr 1998 14:46:48   MIB
   Zwei-seitige Printing-Extensions

      Rev 1.75   03 Apr 1998 12:18:42   MIB
   Rahmenhoehe MIN_SIZE statt VAR_SIZE

      Rev 1.74   02 Apr 1998 19:41:00   MIB
   Positionierung von spaltigen Rahmen

      Rev 1.73   27 Mar 1998 10:01:52   MIB
   direkte Positionierung von Grafiken etc.

      Rev 1.72   25 Mar 1998 12:08:16   MIB
   abs.-pos. Container angefangen

      Rev 1.71   24 Mar 1998 14:31:28   MIB
   obsolete ParseStyleOptions-Methode entfernt

      Rev 1.70   20 Mar 1998 10:42:44   MIB
   Font-Listen in Font-Attributen

      Rev 1.69   24 Feb 1998 11:31:24   MIB
   Jetzt auch HTML_LISTING und HTML_XMP vernichtet (wegen #42029#)

      Rev 1.68   20 Feb 1998 19:04:30   MA
   header

      Rev 1.67   17 Feb 1998 10:51:08   MIB
   HTML-H6 -> HEADLINE6

      Rev 1.66   19 Jan 1998 16:27:18   MIB
   Numerierungs-Umbau

      Rev 1.65   26 Nov 1997 19:09:20   MA
   includes

      Rev 1.64   17 Nov 1997 10:16:48   JP
   Umstellung Numerierung

      Rev 1.63   21 Oct 1997 09:18:06   MIB
   Seitengroesse der HTML-Vorlage als Ausgangsbasis verwenden

      Rev 1.62   20 Oct 1997 09:51:02   MIB
   Nur fuer absolute positioning benoetigten Code groesstenteils auskommentiert

      Rev 1.61   17 Oct 1997 13:20:06   MIB
   page-break-xxx auch uber STYLE/CLASS und ID-Optionen

      Rev 1.60   14 Oct 1997 14:31:22   MIB
   fix #44228#: ViewShell-Zerstoerung/Rekonstruktion ueber Clients

      Rev 1.59   10 Oct 1997 10:16:20   MIB
   CSS1-Printing-Ext: @page,page-break-before/after (noch kein left/right)

      Rev 1.58   16 Sep 1997 17:24:40   MIB
   abs. Positioning fuer Absatz-Tags

      Rev 1.57   16 Sep 1997 14:55:24   MIB
   ITEMID_BOXINFOITEM (voreubergendend) definieren

      Rev 1.56   16 Sep 1997 11:13:32   MIB
   unbenutzte Funktionen entfernt

      Rev 1.55   12 Sep 1997 11:55:22   MIB
   fix #41136#: &(xxx);-Makros, Nicht benutzen Code entfernt

      Rev 1.54   18 Aug 1997 11:36:14   OS
   includes

      Rev 1.53   15 Aug 1997 12:47:48   OS
   charatr/frmatr/txtatr aufgeteilt

      Rev 1.52   12 Aug 1997 13:47:00   OS
   Header-Umstellung

      Rev 1.51   11 Aug 1997 14:07:06   OM
   Headerfile-Umstellung

      Rev 1.50   07 Aug 1997 15:08:36   OM
   Headerfile-Umstellung

      Rev 1.49   04 Aug 1997 13:54:06   MIB
   aboslute psoitioning (fuer fast alle Zeichen-Attribute/-Vorlagen)

      Rev 1.48   31 Jul 1997 10:43:40   MIB
   absolute positioning (sehr rudimentaer, nicht freigeschaltet)

      Rev 1.47   18 Jul 1997 10:55:08   MIB
   fix #40951#: In Reschedule/DocDetected absichtlich geaenderte URLs beachten

      Rev 1.46   02 Jul 1997 10:11:40   MIB
   Transfer-Prio fuer File-Download setzen

      Rev 1.45   01 Jul 1997 08:30:50   MIB
   fix #41120#: Beim synchronen Laden (Source-View) Styles synchron laden

      Rev 1.44   16 Jun 1997 08:27:56   MIB
   CLASS/ID auch fier Tabellen

      Rev 1.43   13 Jun 1997 11:55:38   MIB
   CLASS und ID CSS1-Optionen auswerten

      Rev 1.42   21 May 1997 11:12:22   MIB
   <LINK REL=STYLESHEET> zum Enbinden von externen Style-Sheets

      Rev 1.41   23 Apr 1997 15:03:48   MIB
   fixes #39160# und #39162#: BODY-Style und Text, Fontnamen ohne Haekchen

      Rev 1.40   08 Apr 1997 11:06:48   MIB
   fix #37219#: In Tabellen-Beschriftung alles erlauben

      Rev 1.39   13 Feb 1997 13:03:26   JP
   DT1-5 und DD1-5 entfernt, es gibt nur noch DD/DT

      Rev 1.38   12 Feb 1997 10:56:00   MIB
   DL-Ebene ueber harte Attributierung

      Rev 1.37   28 Jan 1997 11:29:00   MIB
   Hart attributierte DropCaps, neue Namen fuer Class-Vorlagen

      Rev 1.36   10 Dec 1996 15:01:48   MIB
   Umstellung HTML-Vorlagen aus Pool

      Rev 1.35   09 Dec 1996 20:10:24   JP
   erstellen/modifizieren der Vorlagen entfernt, umgestellt auf die neuen PoolVorlagen

      Rev 1.34   27 Nov 1996 14:35:34   MIB
   fix #32725#: Bei harter Attr. oberern/unteren Abstand aus Vorlagen beruecks.

      Rev 1.33   26 Nov 1996 16:22:48   MIB
   keine abhaengigen Attribute mehr

      Rev 1.32   01 Nov 1996 04:37:04   MH
   aNodes -> GetNodes()

      Rev 1.31   30 Oct 1996 18:28:58   MIB
   Zeichenvorlagen fuer DropCaps nur anlegen wenn noetig

      Rev 1.30   29 Oct 1996 16:34:58   MIB
   DropCaps wieder aktiviert

      Rev 1.29   29 Oct 1996 15:35:26   MIB
   Flags fuer gesetzte/nicht-gesetzte Attribut-Werte

      Rev 1.28   28 Oct 1996 19:51:44   MIB
   CLASS an Absatzvorlagen importieren

      Rev 1.27   24 Oct 1996 17:09:56   JP
   Optimierung: Find...ByName

      Rev 1.26   23 Oct 1996 19:49:00   JP
   String Umstellung: [] -> GetChar()

      Rev 1.25   23 Oct 1996 09:33:20   MIB
   Klassen-Namen in Kleinbuchstaben wandeln

      Rev 1.24   22 Oct 1996 10:28:38   MIB
   Umstellung von CSS1 auf Klein-Buchstaben (u.a. wegen Amaya)

      Rev 1.23   21 Oct 1996 08:56:36   MIB
   CLASS fuer Zeichen-Vorlagen, STYLE am BODY-Tag

      Rev 1.22   15 Oct 1996 18:44:34   MIB
   unbenutzte Funktionen entfernt

      Rev 1.21   15 Oct 1996 17:48:34   MIB
   unbenutzte Funktionen entfernt

      Rev 1.20   15 Oct 1996 13:42:06   MIB
   letter-spacing/Laufweite imp./exp.

      Rev 1.19   14 Oct 1996 18:49:14   MIB
   Am Box-Item Abstand zur Umrandung setzen

      Rev 1.18   14 Oct 1996 16:49:54   MIB
   fix(?) #32660#: BLOCKQUOTE nicht mehr im Blocksatz ausrichten

      Rev 1.17   14 Oct 1996 16:43:02   MIB
   Import CSS1-Umrandung (border)

      Rev 1.16   13 Oct 1996 12:19:30   MIB
   first-letter-Pseudo-Element/DropCaps

      Rev 1.15   24 Sep 1996 12:49:42   MIB
   Tabellenvorlagen wieder von Textkoerper abhaengig

      Rev 1.14   20 Sep 1996 17:59:28   MIB
   Zeichen-Hintergrund-Farbe/Itemset-Optimierungen

      Rev 1.13   29 Aug 1996 14:12:20   MIB
   bug fixes: Attrs in Tabellen ausserhalb Zelle loeschen, kein Mem-Verl. bei HR

      Rev 1.12   20 Aug 1996 16:58:20   MIB
   HTML-Absatzvorlagen importieren

      Rev 1.11   14 Aug 1996 16:22:24   MIB
   gcc und msvc: statt *aStr nicht aStr[0] sondern aStr[(USHORT)0]

      Rev 1.10   13 Aug 1996 21:20:50   sdo
   GCC

      Rev 1.9   12 Aug 1996 10:33:22   MIB
   CSS1-Background-Property

      Rev 1.8   07 Aug 1996 14:41:02   MIB
   Import von color und text-decoration

      Rev 1.7   29 Jul 1996 15:57:12   MIB
   Numerierungs-Umbau: linker/rechte Raender und Erstzeilen-Einzug

      Rev 1.6   17 Jul 1996 10:35:00   MIB
   Umbau: Setzen von Absatz-Vorlagen und deren Attributen

      Rev 1.5   10 Jul 1996 15:06:20   MIB
   Includes fuer precompiled header gerichtet

      Rev 1.4   09 Jul 1996 13:31:14   MIB
   Attributierung von Textkoerper in abgleiteten Vorlagen setzen

      Rev 1.3   05 Jul 1996 11:20:18   MIB
   BLINK-Zeichenvorlage entfernt

      Rev 1.2   03 Jul 1996 16:55:36   MIB
   Zeichenvorlagen durch Styles aendern

      Rev 1.1   02 Jul 1996 19:18:28   MIB
   harte CSS1-Attributierung (noch nicht fertig)

      Rev 1.0   28 Jun 1996 18:08:52   MIB
   Initial revision.


*************************************************************************/

diff --git a/sw/source/filter/html/htmlctxt.cxx b/sw/source/filter/html/htmlctxt.cxx
new file mode 100644
index 0000000..b25d5b2
--- /dev/null
+++ b/sw/source/filter/html/htmlctxt.cxx
@@ -0,0 +1,934 @@
/*************************************************************************
 *
 *  $RCSfile: htmlctxt.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:55 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#include "hintids.hxx"
#ifndef _SFXITEMITER_HXX //autogen
#include <svtools/itemiter.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _SVX_FHGTITEM_HXX //autogen
#include <svx/fhgtitem.hxx>
#endif
#ifndef _HTMLTOKN_H
#include <svtools/htmltokn.h>
#endif

#include "doc.hxx"
#include "pam.hxx"
#include "ndtxt.hxx"
#include "shellio.hxx"
#include "paratr.hxx"
#include "htmlnum.hxx"
#include "css1kywd.hxx"
#include "swcss1.hxx"
#include "swhtml.hxx"

/*  */


class _HTMLAttrContext_SaveDoc
{
    SwHTMLNumRuleInfo aNumRuleInfo; // In Umgebung gueltige Numerierung
    SwPosition  *pPos;              // hierhin beim verlassen den
                                    // Kontexts zurueckgesprungen
    _HTMLAttrTable *pAttrTab;       // In Umgebung gueltige Attribute,
                                    // wenn Attributierung nicht
                                    // beibehalten werden soll.

    USHORT nContextStMin;           // In Umgebung gueltige Stack-
                                    // Untergrenze, wenn der Stack
                                    // geschuetzt werden soll.
    USHORT nContextStAttrMin;       // In Umgebung gueltige Stack-
                                    // Untergrenze, wenn die Attribute
                                    // nicht beibehalten werden sollen.

    BOOL bStripTrailingPara : 1;    // letzen Absatz entfernen?
    BOOL bKeepNumRules : 1;         // Numerierung beibehalten?
    BOOL bPopStack : 1;             // Stack-Elemente oberhalb des
                                    // zu schliessenden entfernen?
    BOOL bFixHeaderDist : 1;
    BOOL bFixFooterDist : 1;

public:

    _HTMLAttrContext_SaveDoc() :
        pPos( 0 ), pAttrTab( 0 ),
        nContextStMin( USHRT_MAX ), nContextStAttrMin( USHRT_MAX ),
        bStripTrailingPara( FALSE ), bKeepNumRules( FALSE ),
        bPopStack( FALSE ),
        bFixHeaderDist( FALSE ), bFixFooterDist( FALSE )
    {}

    ~_HTMLAttrContext_SaveDoc() { delete pPos; delete pAttrTab; }

    // Die Position gehoert uns, muss also angelegt und zerstoert werden
    void SetPos( const SwPosition& rPos ) { pPos = new SwPosition(rPos); }
    const SwPosition *GetPos() const { return pPos; }

    // Der Index gehoert uns nicht. Kein Anlgen und Zerstoeren.
    void SetNumInfo( const SwHTMLNumRuleInfo& rInf ) { aNumRuleInfo.Set(rInf); }
    const SwHTMLNumRuleInfo& GetNumInfo() const { return aNumRuleInfo; }

    _HTMLAttrTable *GetAttrTab( BOOL bCreate= FALSE );

    void SetContextStMin( USHORT nMin ) { nContextStMin = nMin; }
    USHORT GetContextStMin() const { return nContextStMin; }

    void SetContextStAttrMin( USHORT nMin ) { nContextStAttrMin = nMin; }
    USHORT GetContextStAttrMin() const { return nContextStAttrMin; }

    void SetStripTrailingPara( BOOL bSet ) { bStripTrailingPara = bSet; }
    BOOL GetStripTrailingPara() const { return bStripTrailingPara; }

    void SetKeepNumRules( BOOL bSet ) { bKeepNumRules = bSet; }
    BOOL GetKeepNumRules() const { return bKeepNumRules; }

    void SetFixHeaderDist( BOOL bSet ) { bFixHeaderDist = bSet; }
    BOOL GetFixHeaderDist() const { return bFixHeaderDist; }

    void SetFixFooterDist( BOOL bSet ) { bFixFooterDist = bSet; }
    BOOL GetFixFooterDist() const { return bFixFooterDist; }
};

_HTMLAttrTable *_HTMLAttrContext_SaveDoc::GetAttrTab( BOOL bCreate )
{
    if( !pAttrTab && bCreate )
    {
        pAttrTab = new _HTMLAttrTable;
        memset( pAttrTab, 0, sizeof( _HTMLAttrTable ));
    }
    return pAttrTab;
}

/*  */

_HTMLAttrContext_SaveDoc *_HTMLAttrContext::GetSaveDocContext( BOOL bCreate )
{
    if( !pSaveDocContext && bCreate )
        pSaveDocContext = new _HTMLAttrContext_SaveDoc;

    return pSaveDocContext;
}

void _HTMLAttrContext::ClearSaveDocContext()
{
    delete pSaveDocContext;
    pSaveDocContext = 0;
}

/*  */

void SwHTMLParser::SplitAttrTab( const SwPosition& rNewPos )
{
    // Hier darf es keine vorlauefigen Absatz-Attribute geben, den die
    // koennten jetzt gesetzt werden und dann sind die Zeiger ungueltig!!!
    ASSERT( !aParaAttrs.Count(),
        "Hoechste Gefahr: Es gibt noch nicht-endgueltige Absatz-Attribute" );
    if( aParaAttrs.Count() )
        aParaAttrs.Remove( 0, aParaAttrs.Count() );

    const SwNodeIndex* pOldEndPara = &pPam->GetPoint()->nNode;
    xub_StrLen nOldEndCnt = pPam->GetPoint()->nContent.GetIndex();

    const SwNodeIndex& rNewSttPara = rNewPos.nNode;
    xub_StrLen nNewSttCnt = rNewPos.nContent.GetIndex();

    BOOL bMoveBack = FALSE;

    // alle noch offenen Attribute beenden und hinter der Tabelle
    // neu aufspannen
    _HTMLAttr** pTbl = (_HTMLAttr**)&aAttrTab;
    for( USHORT nCnt = sizeof( _HTMLAttrTable ) / sizeof( _HTMLAttr* );
            nCnt--; ++pTbl )
    {
        _HTMLAttr *pAttr = *pTbl;
        while( pAttr )
        {
            _HTMLAttr *pNext = pAttr->GetNext();
            _HTMLAttr *pPrev = pAttr->GetPrev();

            USHORT nWhich = pAttr->pItem->Which();
            if( !nOldEndCnt && RES_PARATR_BEGIN <= nWhich &&
                pAttr->GetSttParaIdx() < pOldEndPara->GetIndex() )
            {
                // Das Attribut muss eine Content-Position weiter vorne
                // beendet werden
                if( !bMoveBack )
                {
                    bMoveBack = pPam->Move( fnMoveBackward );
                    nOldEndCnt = pPam->GetPoint()->nContent.GetIndex();
                }
            }
            else if( bMoveBack )
            {
                pPam->Move( fnMoveForward );
                nOldEndCnt = pPam->GetPoint()->nContent.GetIndex();
            }

            if( RES_PARATR_BEGIN <= nWhich && bMoveBack ||
                pAttr->GetSttParaIdx() < pOldEndPara->GetIndex() ||
                (pAttr->GetSttPara() == *pOldEndPara &&
                 pAttr->GetSttCnt() != nOldEndCnt) )
            {
                // Das Attribut muss gesetzt werden. Da wir
                // das Original noch brauchen, weil Zeiger auf das Attribut
                // noch in den Kontexten existieren, muessen wir es clonen.
                // Die Next-Liste geht dabei verloren, aber die
                // Previous-Liste bleibt erhalten
                _HTMLAttr *pSetAttr = pAttr->Clone( *pOldEndPara, nOldEndCnt );

                if( pNext )
                    pNext->InsertPrev( pSetAttr );
                else
                {
                    USHORT nTmp =
                        pSetAttr->bInsAtStart ? 0 : aSetAttrTab.Count();
                    aSetAttrTab.Insert( pSetAttr, nTmp );
                }
            }
            else if( pPrev )
            {
                // Wenn das Attribut nicht gesetzt vor der Tabelle
                // gesetzt werden muss, muessen der Previous-Attribute
                // trotzdem gesetzt werden.
                if( pNext )
                    pNext->InsertPrev( pPrev );
                else
                {
                    USHORT nTmp = pPrev->bInsAtStart ? 0 : aSetAttrTab.Count();
                    aSetAttrTab.Insert( pPrev, nTmp );
                }
            }

            // den Start des Attributs neu setzen
            pAttr->nSttPara = rNewSttPara;
            pAttr->nEndPara = rNewSttPara;
            pAttr->nSttCntnt = nNewSttCnt;
            pAttr->nEndCntnt = nNewSttCnt;
            pAttr->pPrev = 0;

            pAttr = pNext;
        }
    }

    if( bMoveBack )
        pPam->Move( fnMoveForward );

}

void SwHTMLParser::SaveDocContext( _HTMLAttrContext *pCntxt,
                                   USHORT nFlags,
                                   const SwPosition *pNewPos )
{
    _HTMLAttrContext_SaveDoc *pSave = pCntxt->GetSaveDocContext( TRUE );
    pSave->SetStripTrailingPara( (HTML_CNTXT_STRIP_PARA & nFlags) != 0 );
    pSave->SetKeepNumRules( (HTML_CNTXT_KEEP_NUMRULE & nFlags) != 0 );
    pSave->SetFixHeaderDist( (HTML_CNTXT_HEADER_DIST & nFlags) != 0 );
    pSave->SetFixFooterDist( (HTML_CNTXT_FOOTER_DIST & nFlags) != 0 );

    if( pNewPos )
    {
        // Wenn der PaM an eine andere Position gesetzt wird, muss
        // die Numerierung gerettet werden..
        if( !pSave->GetKeepNumRules() )
        {
            // Die Numerierung soll nicht beibehalten werden. Also muss
            // der aktuelle Zustand gerettet und die Numerierung
            // anschliessend ausgeschaltet werden.
            pSave->SetNumInfo( GetNumInfo() );
            GetNumInfo().Clear();
        }
#ifndef NUM_RELSPACE
        else if( GetNumInfo().GetNumRule() && pTable )
        {
            // Die NumRule befindet sich nicht mehr unbedingt in einem
            // zusammenhaengenden Bereich und muss deshalb vollst.
            // aktualisiert werden.
            GetNumInfo().SetUpdateWholeNum( TRUE );
        }
#endif

        if( (HTML_CNTXT_KEEP_ATTRS & nFlags) != 0 )
        {
            // Attribute an aktueller Position beenden und an neuer neu anfangen
            SplitAttrTab( *pNewPos );
        }
        else
        {
            _HTMLAttrTable *pSaveAttrTab = pSave->GetAttrTab( TRUE );
            SaveAttrTab( *pSaveAttrTab );
        }


        pSave->SetPos( *pPam->GetPoint() );
        *pPam->GetPoint() = *pNewPos;
    }

    // Mit dem Setzen von nContextStMin koennen automatisch auch
    // keine gerade offenen Listen (DL/OL/UL) mehr beendet werden.
    if( (HTML_CNTXT_PROTECT_STACK & nFlags) != 0  )
    {
        pSave->SetContextStMin( nContextStMin );
        nContextStMin = aContexts.Count();

        if( (HTML_CNTXT_KEEP_ATTRS & nFlags) == 0 )
        {
            pSave->SetContextStAttrMin( nContextStAttrMin );
            nContextStAttrMin = aContexts.Count();
        }
    }
}

void SwHTMLParser::RestoreDocContext( _HTMLAttrContext *pCntxt )
{
    _HTMLAttrContext_SaveDoc *pSave = pCntxt->GetSaveDocContext();
    if( !pSave )
        return;

    if( pSave->GetStripTrailingPara() )
        StripTrailingPara();

    if( pSave->GetPos() )
    {
        if( pSave->GetFixHeaderDist() || pSave->GetFixFooterDist() )
            FixHeaderFooterDistance( pSave->GetFixHeaderDist(),
                                     pSave->GetPos() );

        _HTMLAttrTable *pSaveAttrTab = pSave->GetAttrTab();
        if( !pSaveAttrTab )
        {
            // Attribute an aktueller Position beenden und an alter neu
            // anfangen.
            SplitAttrTab( *pSave->GetPos() );
        }
        else
        {
            RestoreAttrTab( *pSaveAttrTab );
        }

        *pPam->GetPoint() = *pSave->GetPos();

        // Die bisherigen Attribute koennen wir schonmal setzen.
        SetAttr();
    }

    if( USHRT_MAX != pSave->GetContextStMin() )
    {
        nContextStMin = pSave->GetContextStMin();
        if( USHRT_MAX != pSave->GetContextStAttrMin() )
            nContextStAttrMin = pSave->GetContextStAttrMin();
    }

    if( !pSave->GetKeepNumRules() )
    {
        // Die bisherige gemerkte Numerierung wieder setzen
        GetNumInfo().Set( pSave->GetNumInfo() );
    }
#ifndef NUM_RELSPACE
    else if( GetNumInfo().GetNumRule() && pTable )
    {
        // Die NumRule befindet sich nicht mehr unbedingt in einem
        // zusammenhaengenden Bereich und muss deshalb vollst.
        // aktualisiert werden.
        GetNumInfo().SetUpdateWholeNum( TRUE );
    }
#endif

    pCntxt->ClearSaveDocContext();
}

/*  */

void SwHTMLParser::EndContext( _HTMLAttrContext *pContext )
{
    if( pContext->GetPopStack() )
    {
        // Alle noch offenen Kontexte beenden. Der eigene
        // Kontext muss bereits geloscht sein!
        while( aContexts.Count() > nContextStMin )
        {
            _HTMLAttrContext *pCntxt = PopContext();
            ASSERT( pCntxt != pContext,
                    "Kontext noch im Stack" );
            if( pCntxt == pContext )
                break;

            EndContext( pCntxt );
            delete pCntxt;
        }
    }

    // Alle noch offenen Attribute beenden
    if( pContext->HasAttrs() )
        EndContextAttrs( pContext );

    // Falls ein Bereich geoeffnet wurde, den verlassen. Da Bereiche
    // auch innerhalb von absolut positionierten Objekten angelegt werden,
    // muss das passieren, bever ein alter Dokument-Kontext restauriert wird.
    if( pContext->GetSpansSection() )
        EndSection();

    // Rahmen und sonstige Sonderbereiche verlassen.
    if( pContext->HasSaveDocContext() )
        RestoreDocContext( pContext );

    // Ggf. noch einen Ansatz-Umbruch einfuegen
    if( AM_NONE != pContext->GetAppendMode() &&
        pPam->GetPoint()->nContent.GetIndex() )
        AppendTxtNode( pContext->GetAppendMode() );

    // PRE-/LISTING- und XMP-Umgebungen wieder starten
    if( pContext->IsFinishPREListingXMP() )
        FinishPREListingXMP();

    if( pContext->IsRestartPRE() )
        StartPRE();

    if( pContext->IsRestartXMP() )
        StartXMP();

    if( pContext->IsRestartListing() )
        StartListing();
}

void SwHTMLParser::ClearContext( _HTMLAttrContext *pContext )
{
    _HTMLAttrs &rAttrs = pContext->GetAttrs();
    for( USHORT i=0; i<rAttrs.Count(); i++ )
    {
        // einfaches Loeschen reicht hier nicht, weil das
        // Attribut auch aus seiner Liste ausgetragen werden
        // muss. Theoretisch koennt man natuerlich auch die Liste
        // und die Attribute getrennt loeschen, aber wenn man
        // dann was falsch gemacht hat, sieht es uebel aus.
        DeleteAttr( rAttrs[i] );
    }

    ASSERT( !pContext->GetSpansSection(),
            "Bereich kann nicht mehr verlassen werden" );

    ASSERT( !pContext->HasSaveDocContext(),
            "Rahmen kann nicht mehr verlassen werden" );

    // PRE-/LISTING- und XMP-Umgebungen wieder starten
    if( pContext->IsFinishPREListingXMP() )
        FinishPREListingXMP();

    if( pContext->IsRestartPRE() )
        StartPRE();

    if( pContext->IsRestartXMP() )
        StartXMP();

    if( pContext->IsRestartListing() )
        StartListing();
}

/*  */

BOOL SwHTMLParser::DoPositioning( SfxItemSet &rItemSet,
                                  SvxCSS1PropertyInfo &rPropInfo,
                                  _HTMLAttrContext *pContext )
{
    BOOL bRet = FALSE;

    // Unter folgenden Umstaenden wird jetzt ein Rahmen aufgemacht:
    // - das Tag wird absolut positioniert und left/top sind beide
    //   gegeben und enthalten auch keine %-Angabe, oder
    // - das Tag soll fliessen, und
    // - es wurde eine Breite angegeben (in beiden Faellen noetig)
    if( SwCSS1Parser::MayBePositioned( rPropInfo ) )
    {
        SfxItemSet aFrmItemSet( pDoc->GetAttrPool(),
                                RES_FRMATR_BEGIN, RES_FRMATR_END-1 );
        if( !IsNewDoc() )
            Reader::ResetFrmFmtAttrs(aFrmItemSet );

        // Ausrichtung setzen
        SetAnchorAndAdjustment( VERT_NONE, HORI_NONE, rItemSet, rPropInfo,
                                aFrmItemSet );

        // Groesse setzen
        SetVarSize( rItemSet, rPropInfo, aFrmItemSet );

        // Abstaende setzen
        SetSpace( Size(0,0), rItemSet, rPropInfo, aFrmItemSet );

        // Sonstige CSS1-Attribute Setzen
        SetFrmFmtAttrs( rItemSet, rPropInfo,
                        HTML_FF_BOX|HTML_FF_PADDING|HTML_FF_BACKGROUND,
                        aFrmItemSet );

        InsertFlyFrame( aFrmItemSet, pContext, rPropInfo.aId,
                        CONTEXT_FLAGS_ABSPOS );
        pContext->SetPopStack( TRUE );
        rPropInfo.aId.Erase();
        bRet = TRUE;
    }

    return bRet;
}

BOOL SwHTMLParser::CreateContainer( const String& rClass,
                                    SfxItemSet &rItemSet,
                                    SvxCSS1PropertyInfo &rPropInfo,
                                    _HTMLAttrContext *pContext )
{
    BOOL bRet = FALSE;
    if( rClass.EqualsIgnoreCaseAscii(sCSS1_class_abs_pos) &&
        pCSS1Parser->MayBePositioned( rPropInfo ) )
    {
        // Container-Klasse
        SfxItemSet *pFrmItemSet = pContext->GetFrmItemSet( pDoc );
        if( !IsNewDoc() )
            Reader::ResetFrmFmtAttrs( *pFrmItemSet );

        SetAnchorAndAdjustment( VERT_NONE, HORI_NONE,
                                rItemSet, rPropInfo, *pFrmItemSet );
        Size aDummy(0,0);
        SetFixSize( aDummy, aDummy, FALSE, FALSE, rItemSet, rPropInfo,
                    *pFrmItemSet );
        SetSpace( aDummy, rItemSet, rPropInfo, *pFrmItemSet );
        SetFrmFmtAttrs( rItemSet, rPropInfo, HTML_FF_BOX|HTML_FF_BACKGROUND,
                        *pFrmItemSet );

        bRet = TRUE;
    }

    return bRet;
}

/*  */

void SwHTMLParser::InsertAttrs( SfxItemSet &rItemSet,
                                SvxCSS1PropertyInfo &rPropInfo,
                                _HTMLAttrContext *pContext,
                                BOOL bCharLvl )
{
    // Ein DropCap-Attribut basteln, wenn auf Zeichen-Ebene vor dem
    // ersten Zeichen ein float: left vorkommt
    if( bCharLvl && !pPam->GetPoint()->nContent.GetIndex() &&
        SVX_ADJUST_LEFT == rPropInfo.eFloat )
    {
        SwFmtDrop aDrop;
        aDrop.GetChars() = 1;

        pCSS1Parser->FillDropCap( aDrop, rItemSet );

        // Nur wenn das Initial auch ueber mehrere Zeilen geht, wird das
        // DropCap-Attribut gesetzt. Sonst setzten wir die Attribute hart.
        if( aDrop.GetLines() > 1 )
        {
            NewAttr( &aAttrTab.pDropCap, aDrop );

            _HTMLAttrs &rAttrs = pContext->GetAttrs();
            rAttrs.Insert( aAttrTab.pDropCap, rAttrs.Count() );

            return;
        }
    }

// Feature: PrintExt
    if( !bCharLvl )
        pCSS1Parser->SetFmtBreak( rItemSet, rPropInfo );
// /Feature: PrintExt

    ASSERT( aContexts.Count() <= nContextStAttrMin ||
            aContexts[aContexts.Count()-1] != pContext,
            "SwHTMLParser::InsertAttrs: Kontext doch schon auf dem Stack" );

    SfxItemIter aIter( rItemSet );

    const SfxPoolItem *pItem = aIter.FirstItem();
    while( pItem )
    {
        _HTMLAttr **ppAttr = 0;

        switch( pItem->Which() )
        {
        case RES_LR_SPACE:
            {
                // Absatz-Einzuege muessen addiert werden und werden immer
                // nur absatzweise gesetzt (fuer den ersten Absatz hier,
                // fuer alle folgenden in SetTxtCollAttrs)

                const SvxLRSpaceItem *pLRItem =
                    (const SvxLRSpaceItem *)pItem;

                // die bisherigen Absatz-Abstaende holen (ohne die vom
                // obersten Kontext, denn den veraendern wir ja gerade) ...
                USHORT nOldLeft = 0, nOldRight = 0;
                short nOldIndent = 0;
                BOOL bIgnoreTop = aContexts.Count() > nContextStMin &&
                                  aContexts[aContexts.Count()-1] == pContext;
                GetMarginsFromContext( nOldLeft, nOldRight, nOldIndent,
                                       bIgnoreTop  );


                // und noch die aktuell gueltigen
                USHORT nLeft = nOldLeft, nRight = nOldRight;
                short nIndent = nOldIndent;
                pContext->GetMargins( nLeft, nRight, nIndent );

                // ... und die neuen Abstaende zu den alten addieren
                // Hier werden nicht die aus dem Item genommen, sondern die
                // extra gemerkten, weil die auch negativ sein koennen. Die
                // Abfrage ueber das Item funktioniert aber trotzdem, denn
                // fuer negative Werte wird das Item (mit Wert 0) auch
                // eingefuegt.
                if( rPropInfo.bLeftMargin )
                {
                    ASSERT( rPropInfo.nLeftMargin < 0 ||
                            rPropInfo.nLeftMargin == pLRItem->GetTxtLeft(),
                            "linker Abstand stimmt nicht mit Item ueberein" );
                    if( rPropInfo.nLeftMargin < 0 &&
                        -rPropInfo.nLeftMargin > nOldLeft )
                        nLeft = 0;
                    else
                        nLeft = nOldLeft + rPropInfo.nLeftMargin;
                }
                if( rPropInfo.bRightMargin )
                {
                    ASSERT( rPropInfo.nRightMargin < 0 ||
                            rPropInfo.nRightMargin == pLRItem->GetRight(),
                            "rechter Abstand stimmt nicht mit Item ueberein" );
                    if( rPropInfo.nRightMargin < 0 &&
                        -rPropInfo.nRightMargin > nOldRight )
                        nRight = 0;
                    else
                        nRight = nOldRight + rPropInfo.nRightMargin;
                }
                if( rPropInfo.bTextIndent )
                    nIndent = pLRItem->GetTxtFirstLineOfst();

                // und die Werte fuer nachfolgende Absaetze merken
                pContext->SetMargins( nLeft, nRight, nIndent );

#ifndef NUM_RELSPACE
                // Numerierungen erfordern etwas mehr Aufwand
                if( GetNumInfo().GetNumRule() )
                {
                    SwTxtNode  *pNumTxtNode = pPam->GetNode()->GetTxtNode();

                    if( pNumTxtNode->GetNum() &&
                        !(NO_NUMLEVEL & pNumTxtNode->GetNum()->GetLevel()) )
                        nIndent += HTML_NUMBUL_INDENT;

                    // den Absatz muessen wir jetzt selbst attributieren
                    pNumTxtNode->SetNumLSpace( FALSE );
                }
#endif

                // das Attribut noch am aktuellen Absatz setzen
                SvxLRSpaceItem aLRItem( *pLRItem );
                aLRItem.SetTxtFirstLineOfst( nIndent );
                aLRItem.SetTxtLeft( nLeft );
                aLRItem.SetRight( nRight );
                NewAttr( &aAttrTab.pLRSpace, aLRItem );
                EndAttr( aAttrTab.pLRSpace, 0, FALSE );
            }
            break;

        case RES_UL_SPACE:
            if( !rPropInfo.bTopMargin || !rPropInfo.bBottomMargin )
            {
                USHORT nUpper = 0, nLower = 0;
                GetULSpaceFromContext( nUpper, nLower );
                SvxULSpaceItem aULSpace( *((const SvxULSpaceItem *)pItem) );
                if( !rPropInfo.bTopMargin )
                    aULSpace.SetUpper( nUpper );
                if( !rPropInfo.bBottomMargin )
                    aULSpace.SetLower( nLower );

                NewAttr( &aAttrTab.pULSpace, aULSpace );

                // ... und noch die Kontext-Information speichern
                _HTMLAttrs &rAttrs = pContext->GetAttrs();
                rAttrs.Insert( aAttrTab.pULSpace, rAttrs.Count() );

                pContext->SetULSpace( aULSpace.GetUpper(), aULSpace.GetLower() );
            }
            else
            {
                ppAttr = &aAttrTab.pULSpace;
            }
            break;
        case RES_CHRATR_FONTSIZE:
            // es werden keine Attribute mit %-Angaben gesetzt
            if( ((const SvxFontHeightItem *)pItem)->GetProp() == 100 )
                ppAttr = &aAttrTab.pFontHeight;
            break;

        case RES_BACKGROUND:
            if( bCharLvl )
            {
                // das Frame-Attr ggf. in ein Char-Attr umwandeln
                SvxBrushItem aBrushItem( *(const SvxBrushItem *)pItem );
                aBrushItem.SetWhich( RES_CHRATR_BACKGROUND );

                // Das Attribut setzen ...
                NewAttr( &aAttrTab.pCharBrush, aBrushItem );

                // ... und noch die Kontext-Information speichern
                _HTMLAttrs &rAttrs = pContext->GetAttrs();
                rAttrs.Insert( aAttrTab.pCharBrush, rAttrs.Count() );
            }
            else if( pContext->GetToken() != HTML_TABLEHEADER_ON &&
                     pContext->GetToken() != HTML_TABLEDATA_ON )
            {
                ppAttr = &aAttrTab.pBrush;
            }
            break;

        default:
            // den zu dem Item gehoehrenden Tabellen-Eintrag ermitteln ...
            ppAttr = GetAttrTabEntry( pItem->Which() );
            break;
        }

        if( ppAttr )
        {
            // Das Attribut setzen ...
            NewAttr( ppAttr, *pItem );

            // ... und noch die Kontext-Information speichern
            _HTMLAttrs &rAttrs = pContext->GetAttrs();
            rAttrs.Insert( *ppAttr, rAttrs.Count() );
        }

        // auf zum naechsten Item
        pItem = aIter.NextItem();
    }

    if( rPropInfo.aId.Len() )
        InsertBookmark( rPropInfo.aId );
}

void SwHTMLParser::InsertAttr( _HTMLAttr **ppAttr, const SfxPoolItem & rItem,
                               _HTMLAttrContext *pCntxt )
{
    if( !ppAttr )
    {
        ppAttr = GetAttrTabEntry( rItem.Which() );
        if( !ppAttr )
            return;
    }

    // das Attribut setzen
    NewAttr( ppAttr, rItem );

    // und im Kontext merken
    _HTMLAttrs &rAttrs = pCntxt->GetAttrs();
    rAttrs.Insert( *ppAttr, rAttrs.Count() );
}

void SwHTMLParser::SplitPREListingXMP( _HTMLAttrContext *pCntxt )
{
    // PRE/Listing/XMP soll beim beenden des Kontexts beendet werden.
    pCntxt->SetFinishPREListingXMP( TRUE );

    // Und die jetzt gueltigen Flags sollen wieder gesetzt werden.
    if( IsReadPRE() )
        pCntxt->SetRestartPRE( TRUE );
    if( IsReadXMP() )
        pCntxt->SetRestartXMP( TRUE );
    if( IsReadListing() )
        pCntxt->SetRestartListing( TRUE );

    // PRE/Listing/XMP wird auuserdem sofort beendet
    FinishPREListingXMP();
}

SfxItemSet *_HTMLAttrContext::GetFrmItemSet( SwDoc *pCreateDoc )
{
    if( !pFrmItemSet && pCreateDoc )
        pFrmItemSet = new SfxItemSet( pCreateDoc->GetAttrPool(),
                        RES_FRMATR_BEGIN, RES_FRMATR_END-1 );
    return pFrmItemSet;
}
/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/html/htmlctxt.cxx,v 1.1.1.1 2000-09-18 17:14:55 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.33  2000/09/18 16:04:44  willem.vandorp
      OpenOffice header added.

      Revision 1.32  2000/04/10 12:20:55  mib
      unicode

      Revision 1.31  1999/03/26 10:37:28  MIB
      #63049#: Sofortige Numerierungs-Aktualisierung in Tabellen ist jetzt unnoetig


      Rev 1.30   26 Mar 1999 11:37:28   MIB
   #63049#: Sofortige Numerierungs-Aktualisierung in Tabellen ist jetzt unnoetig

      Rev 1.29   23 Mar 1999 15:28:14   MIB
   #63049#: Relative Einzuege in Numerierungen

      Rev 1.28   17 Mar 1999 16:46:20   MIB
   #63049#: Numerierungen mit relativen Abstaenden

      Rev 1.27   06 Nov 1998 15:33:36   MIB
   #59043#: negative Absatz-Einzuege

      Rev 1.26   21 Apr 1998 13:46:10   MIB
   fix: Keine Bookmark fuer abs-pos Objekte mit ID einfuegen

      Rev 1.25   15 Apr 1998 14:47:42   MIB
   Zwei-seitige Printing-Extensions

      Rev 1.24   03 Apr 1998 12:21:46   MIB
   Export des Rahmen-Namens als ID

      Rev 1.23   02 Apr 1998 19:43:24   MIB
   Positionierung von spaltigen Rahmen

      Rev 1.22   27 Mar 1998 10:04:10   MIB
   direkte Positionierung von Grafiken etc.

      Rev 1.21   25 Mar 1998 12:08:18   MIB
   abs.-pos. Container angefangen

      Rev 1.20   19 Mar 1998 09:03:28   MIB
   Abs.-Pos.: Attributierung nicht in Rahmen uebernehmen, Hoehe nun Mindest-Hoehe

      Rev 1.19   15 Mar 1998 16:51:14   MIB
   abs.-pos.: Abstaende bei Positionierung beachten, Hoehe nur noch Mindest-Hoehe

      Rev 1.18   13 Mar 1998 09:25:52   MIB
   Abs-Pos: margins als Rahmen-Abstaende uebernehmen

      Rev 1.17   11 Mar 1998 18:25:38   MIB
   abs. Pos.: Verankerung angepassr

      Rev 1.16   20 Feb 1998 19:04:30   MA
   header

      Rev 1.15   19 Jan 1998 16:25:56   MIB
   Numerierungs-Umbau

      Rev 1.14   26 Nov 1997 19:09:22   MA
   includes

      Rev 1.13   17 Nov 1997 10:16:48   JP
   Umstellung Numerierung

      Rev 1.12   20 Oct 1997 09:51:56   MIB
   Nur fuer absolute positioning benoetigten Code groesstenteils auskommentiert

      Rev 1.11   17 Oct 1997 13:20:32   MIB
   page-break-xxx auch uber STYLE/CLASS und ID-Optionen

      Rev 1.10   09 Oct 1997 14:36:10   JP
   Umstellung NodeIndex/-Array/BigPtrArray

      Rev 1.9   16 Sep 1997 17:25:10   MIB
   abs. Positioning fuer Absatz-Tags

      Rev 1.8   16 Sep 1997 11:15:00   MIB
   Kopf-/Fusszeilen ohne Moven von Nodes, autom. Beenden von Bereichen/Rahmen

      Rev 1.7   12 Sep 1997 11:56:16   MIB
   fix #41253#: Script in PRE (keine Schleifen), MULTICOL ohne Move von Nodes

      Rev 1.6   08 Sep 1997 17:49:12   MIB
   Verankerung von AUTO_CNTNT-Rahmen nicht mehr verschieben

      Rev 1.5   08 Sep 1997 10:33:44   MIB
   Keine Schleifen fuer PRE mehr (auch fix #41253#) (nicht freigeschaltet)

      Rev 1.4   15 Aug 1997 12:47:48   OS
   charatr/frmatr/txtatr aufgeteilt

      Rev 1.3   12 Aug 1997 13:44:18   OS
   Header-Umstellung

      Rev 1.2   07 Aug 1997 15:07:50   OM
   Headerfile-Umstellung

      Rev 1.1   04 Aug 1997 13:54:08   MIB
   aboslute psoitioning (fuer fast alle Zeichen-Attribute/-Vorlagen)

      Rev 1.0   04 Aug 1997 13:02:32   MIB
   Initial revision.

*************************************************************************/

diff --git a/sw/source/filter/html/htmldraw.cxx b/sw/source/filter/html/htmldraw.cxx
new file mode 100644
index 0000000..be48062
--- /dev/null
+++ b/sw/source/filter/html/htmldraw.cxx
@@ -0,0 +1,1070 @@
/*************************************************************************
 *
 *  $RCSfile: htmldraw.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:55 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#include "hintids.hxx"

#ifndef _SV_SVAPP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _WRKWIN_HXX //autogen
#include <vcl/wrkwin.hxx>
#endif
#ifndef _SVDMODEL_HXX //autogen
#include <svx/svdmodel.hxx>
#endif
#ifndef _SVDPAGE_HXX //autogen
#include <svx/svdpage.hxx>
#endif
#ifndef _SVDOBJ_HXX //autogen
#include <svx/svdobj.hxx>
#endif
#ifndef _SVDOTEXT_HXX //autogen
#include <svx/svdotext.hxx>
#endif
#ifndef _EEITEM_HXX //autogen
#include <svx/eeitem.hxx>
#endif
#ifndef _OUTLINER_HXX //autogen
#define _EEITEMID_HXX
#include <svx/outliner.hxx>
#endif
#ifndef SVX_XFILLIT0_HXX //autogen
#include <svx/xfillit0.hxx>
#endif
#ifndef _SVX_FILLITEM_HXX //autogen
#include <svx/xfillit.hxx>
#endif
#ifndef _SVX_COLRITEM_HXX //autogen
#include <svx/colritem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _SFXITEMITER_HXX //autogen
#include <svtools/itemiter.hxx>
#endif
#ifndef _SFX_WHITER_HXX //autogen
#include <svtools/whiter.hxx>
#endif
#ifndef _HTMLOUT_HXX //autogen
#include <svtools/htmlout.hxx>
#endif
#ifndef _HTMLTOKN_H
#include <svtools/htmltokn.h>
#endif
#ifndef _HTMLKYWD_HXX
#include <svtools/htmlkywd.hxx>
#endif
#ifndef _SVDPOOL_HXX //autogen
#include <svx/svdpool.hxx>
#endif


#ifndef _CHARATR_HXX
#include "charatr.hxx"
#endif
#ifndef _FRMFMT_HXX //autogen
#include <frmfmt.hxx>
#endif
#ifndef _FMTANCHR_HXX //autogen
#include <fmtanchr.hxx>
#endif
#ifndef _FMTSRND_HXX //autogen
#include <fmtsrnd.hxx>
#endif
#include "ndtxt.hxx"
#include "doc.hxx"
#include "dcontact.hxx"
#include "poolfmt.hxx"
#include "swcss1.hxx"
#include "swhtml.hxx"
#include "wrthtml.hxx"


const sal_uInt32 HTML_FRMOPTS_MARQUEE   =
    HTML_FRMOPT_ALIGN |
    HTML_FRMOPT_SPACE;

const sal_uInt32 HTML_FRMOPTS_MARQUEE_CSS1  =
    HTML_FRMOPT_S_ALIGN |
    HTML_FRMOPT_S_SPACE;

static HTMLOptionEnum __FAR_DATA aHTMLMarqBehaviorTable[] =
{
    { sHTML_BEHAV_scroll,       SDRTEXTANI_SCROLL       },
    { sHTML_BEHAV_alternate,    SDRTEXTANI_ALTERNATE    },
    { sHTML_BEHAV_slide,        SDRTEXTANI_SLIDE        },
    { 0,                        0                       }
};

static HTMLOptionEnum __FAR_DATA aHTMLMarqDirectionTable[] =
{
    { sHTML_AL_left,            SDRTEXTANI_LEFT         },
    { sHTML_AL_right,           SDRTEXTANI_RIGHT        },
    { 0,                        0                       }
};

/*  */
void SwHTMLParser::InsertDrawObject( SdrObject* pNewDrawObj,
                                     const Size& rPixSpace,
                                     SwVertOrient eVertOri,
                                     SwHoriOrient eHoriOri,
                                     SfxItemSet& rCSS1ItemSet,
                                     SvxCSS1PropertyInfo& rCSS1PropInfo,
                                     sal_Bool bHidden )
{
    // immer ueber dem Text stehen
    pNewDrawObj->SetLayer( pDoc->GetHeavenId() );

    SfxItemSet aFrmSet( pDoc->GetAttrPool(),
                        RES_FRMATR_BEGIN, RES_FRMATR_END-1 );
    if( !IsNewDoc() )
        Reader::ResetFrmFmtAttrs( aFrmSet );

    sal_uInt16 nLeftSpace = 0, nRightSpace = 0, nUpperSpace = 0, nLowerSpace = 0;
    if( (rPixSpace.Width() || rPixSpace.Height()) && Application::GetDefaultDevice() )
    {
        Size aTwipSpc( rPixSpace.Width(), rPixSpace.Height() );
        aTwipSpc =
            Application::GetDefaultDevice()->PixelToLogic( aTwipSpc,
                                                MapMode(MAP_TWIP) );
        nLeftSpace = nRightSpace = (sal_uInt16)aTwipSpc.Width();
        nUpperSpace = nLowerSpace = (sal_uInt16)aTwipSpc.Height();
    }

    // linken/rechten Rand setzen
    const SfxPoolItem *pItem;
    if( SFX_ITEM_SET==rCSS1ItemSet.GetItemState( RES_LR_SPACE, sal_True, &pItem ) )
    {
        // Ggf. den Erstzeilen-Einzug noch plaetten
        const SvxLRSpaceItem *pLRItem = (const SvxLRSpaceItem *)pItem;
        SvxLRSpaceItem aLRItem( *pLRItem );
        aLRItem.SetTxtFirstLineOfst( 0 );
        if( rCSS1PropInfo.bLeftMargin )
        {
            nLeftSpace = aLRItem.GetLeft();
            rCSS1PropInfo.bLeftMargin = sal_False;
        }
        if( rCSS1PropInfo.bRightMargin )
        {
            nRightSpace = aLRItem.GetRight();
            rCSS1PropInfo.bRightMargin = sal_False;
        }
        rCSS1ItemSet.ClearItem( RES_LR_SPACE );
    }
    if( nLeftSpace || nRightSpace )
    {
        SvxLRSpaceItem aLRItem;
        aLRItem.SetLeft( nLeftSpace );
        aLRItem.SetRight( nRightSpace );
        aFrmSet.Put( aLRItem );
    }

    // oberen/unteren Rand setzen
    if( SFX_ITEM_SET==rCSS1ItemSet.GetItemState( RES_UL_SPACE, sal_True, &pItem ) )
    {
        // Ggf. den Erstzeilen-Einzug noch plaetten
        const SvxULSpaceItem *pULItem = (const SvxULSpaceItem *)pItem;
        if( rCSS1PropInfo.bTopMargin )
        {
            nUpperSpace = pULItem->GetUpper();
            rCSS1PropInfo.bTopMargin = sal_False;
        }
        if( rCSS1PropInfo.bBottomMargin )
        {
            nLowerSpace = pULItem->GetLower();
            rCSS1PropInfo.bBottomMargin = sal_False;
        }

        rCSS1ItemSet.ClearItem( RES_UL_SPACE );
    }
    if( nUpperSpace || nLowerSpace )
    {
        SvxULSpaceItem aULItem;
        aULItem.SetUpper( nUpperSpace );
        aULItem.SetLower( nLowerSpace );
        aFrmSet.Put( aULItem );
    }

    SwFmtAnchor aAnchor( FLY_IN_CNTNT );
    if( SVX_CSS1_POS_ABSOLUTE == rCSS1PropInfo.ePosition &&
        SVX_CSS1_LTYPE_TWIP == rCSS1PropInfo.eLeftType &&
        SVX_CSS1_LTYPE_TWIP == rCSS1PropInfo.eTopType )
    {
        const SwStartNode *pFlySttNd =
            pDoc->GetNodes()[pPam->GetPoint()->nNode]->FindFlyStartNode();

        if( pFlySttNd )
        {
            aAnchor.SetType( FLY_AT_FLY );
            SwPosition aPos( *pFlySttNd );
            aAnchor.SetAnchor( &aPos );
        }
        else
        {
            aAnchor.SetType( FLY_PAGE );
        }
        pNewDrawObj->SetRelativePos( Point(rCSS1PropInfo.nLeft + nLeftSpace,
                                           rCSS1PropInfo.nTop + nUpperSpace) );
        aFrmSet.Put( SwFmtSurround(SURROUND_THROUGHT) );
    }
    else if( SVX_ADJUST_LEFT == rCSS1PropInfo.eFloat ||
             HORI_LEFT == eHoriOri )
    {
        aAnchor.SetType( FLY_AT_CNTNT );
        aFrmSet.Put( SwFmtSurround(bHidden ? SURROUND_THROUGHT
                                             : SURROUND_RIGHT) );
        pNewDrawObj->SetRelativePos( Point(nLeftSpace, nUpperSpace) );
    }
    else if( VERT_NONE != eVertOri )
    {
        aFrmSet.Put( SwFmtVertOrient( 0, eVertOri ) );
    }

    if( FLY_PAGE == aAnchor.GetAnchorId() )
        aAnchor.SetPageNum( 1 );
    else if( FLY_AT_FLY != aAnchor.GetAnchorId() )
        aAnchor.SetAnchor( pPam->GetPoint() );
    aFrmSet.Put( aAnchor );

    pDoc->Insert( *pPam, *pNewDrawObj, &aFrmSet );
}

/*  */

static void PutEEPoolItem( SfxItemSet &rEEItemSet,
                           const SfxPoolItem& rSwItem )
{

    sal_uInt16 nEEWhich = 0;

    switch( rSwItem.Which() )
    {
    case RES_CHRATR_COLOR:      nEEWhich = EE_CHAR_COLOR; break;
    case RES_CHRATR_CROSSEDOUT: nEEWhich = EE_CHAR_STRIKEOUT; break;
    case RES_CHRATR_ESCAPEMENT: nEEWhich = EE_CHAR_ESCAPEMENT; break;
    case RES_CHRATR_FONT:       nEEWhich = EE_CHAR_FONTINFO; break;
    case RES_CHRATR_FONTSIZE:   nEEWhich = EE_CHAR_FONTHEIGHT; break;
    case RES_CHRATR_KERNING:    nEEWhich = EE_CHAR_KERNING; break;
    case RES_CHRATR_POSTURE:    nEEWhich = EE_CHAR_ITALIC; break;
    case RES_CHRATR_UNDERLINE:  nEEWhich = EE_CHAR_UNDERLINE; break;
    case RES_CHRATR_WEIGHT:     nEEWhich = EE_CHAR_WEIGHT; break;
    case RES_BACKGROUND:
    case RES_CHRATR_BACKGROUND:
        {
            const SvxBrushItem& rBrushItem = (const SvxBrushItem&)rSwItem;
            rEEItemSet.Put( XFillStyleItem(XFILL_SOLID) );
            rEEItemSet.Put( XFillColorItem(aEmptyStr,
                            rBrushItem.GetColor()) );
        }
        break;
    }

    if( nEEWhich )
    {
        SfxPoolItem *pEEItem = rSwItem.Clone();
        pEEItem->SetWhich( nEEWhich );
        rEEItemSet.Put( *pEEItem );
        delete pEEItem;
    }
}

void SwHTMLParser::NewMarquee( HTMLTable *pCurTable )
{

    ASSERT( !pMarquee, "Marquee in Marquee???" );
    aContents.Erase();

    String aId, aStyle, aClass;

    long nWidth=0, nHeight=0;
    sal_Bool bPrcWidth = sal_False, bDirection = sal_False, bBGColor = sal_False;
    Size aSpace( 0, 0 );
    SwVertOrient eVertOri = VERT_TOP;
    SwHoriOrient eHoriOri = HORI_NONE;
    SdrTextAniKind eAniKind = SDRTEXTANI_SCROLL;
    SdrTextAniDirection eAniDir = SDRTEXTANI_LEFT;
    sal_uInt16 nCount = 0, nDelay = 60;
    sal_Int16 nAmount = -6;
    Color aBGColor;

    const HTMLOptions *pOptions = GetOptions();
    sal_uInt16 nArrLen = pOptions->Count();
    for ( sal_uInt16 i=0; i<nArrLen; i++ )
    {
        const HTMLOption *pOption = (*pOptions)[i];
        switch( pOption->GetToken() )
        {
            case HTML_O_ID:
                aId = pOption->GetString();
                break;
            case HTML_O_STYLE:
                aStyle = pOption->GetString();
                break;
            case HTML_O_CLASS:
                aClass = pOption->GetString();
                break;

            case HTML_O_BEHAVIOR:
                eAniKind =
                    (SdrTextAniKind)pOption->GetEnum( aHTMLMarqBehaviorTable,
                                                      eAniKind );
                break;

            case HTML_O_BGCOLOR:
                pOption->GetColor( aBGColor );
                bBGColor = sal_True;
                break;

            case HTML_O_DIRECTION:
                eAniDir =
                    (SdrTextAniDirection)pOption->GetEnum( aHTMLMarqDirectionTable,
                                                      eAniDir );
                bDirection = sal_True;
                break;

            case HTML_O_LOOP:
                if( pOption->GetString().
                        EqualsIgnoreCaseAscii(sHTML_LOOP_infinite) )
                {
                    nCount = 0;
                }
                else
                {
                    sal_uInt32 nLoop = pOption->GetSNumber();
                    nCount = (sal_uInt16)(nLoop>0 ? nLoop : 0 );
                }
                break;

            case HTML_O_SCROLLAMOUNT:
                nAmount = -((sal_Int16)pOption->GetNumber());
                break;

            case HTML_O_SCROLLDELAY:
                nDelay = (sal_uInt16)pOption->GetNumber();
                break;

            case HTML_O_WIDTH:
                // erstmal nur als Pixelwerte merken!
                nWidth = pOption->GetNumber();
                bPrcWidth = pOption->GetString().Search('%') != STRING_NOTFOUND;
                if( bPrcWidth && nWidth>100 )
                    nWidth = 100;
                break;

            case HTML_O_HEIGHT:
                // erstmal nur als Pixelwerte merken!
                nHeight = pOption->GetNumber();
                if( pOption->GetString().Search('%') != STRING_NOTFOUND )
                    nHeight = 0;
                break;

            case HTML_O_HSPACE:
                // erstmal nur als Pixelwerte merken!
                aSpace.Height() = pOption->GetNumber();
                break;

            case HTML_O_VSPACE:
                // erstmal nur als Pixelwerte merken!
                aSpace.Width() = pOption->GetNumber();
                break;

            case HTML_O_ALIGN:
                eVertOri =
                    (SwVertOrient)pOption->GetEnum( aHTMLImgVAlignTable,
                                                    VERT_TOP );
                eHoriOri =
                    (SwHoriOrient)pOption->GetEnum( aHTMLImgHAlignTable,
                                                    HORI_NONE );
                break;
        }
    }

    // Ein DrawTxtobj anlegen
    SdrModel* pModel = pDoc->MakeDrawModel();
    SdrPage* pPg = pModel->GetPage( 0 );
    pMarquee = SdrObjFactory::MakeNewObject( SdrInventor,
                                             OBJ_TEXT, pPg, pModel );
    if( !pMarquee )
        return;

    pPg->InsertObject( pMarquee );

    if( aId.Len() )
        InsertBookmark( aId );

    // (Nur) Alternate leueft per Default von links nach rechts
    if( SDRTEXTANI_ALTERNATE==eAniKind && !bDirection )
        eAniDir = SDRTEXTANI_RIGHT;

    // die fuer das Scrollen benoetigten Attribute umsetzen
    sal_uInt16 aWhichMap[7] =   { XATTR_FILL_FIRST,   XATTR_FILL_LAST,
                              SDRATTR_MISC_FIRST, SDRATTR_MISC_LAST,
                              EE_CHAR_START,      EE_CHAR_END,
                              0 };
    SfxItemSet aItemSet( pModel->GetItemPool(), aWhichMap );
    aItemSet.Put( SdrTextAutoGrowWidthItem( sal_False ) );
    aItemSet.Put( SdrTextAutoGrowHeightItem( sal_True ) );
    aItemSet.Put( SdrTextAniKindItem( eAniKind ) );
    aItemSet.Put( SdrTextAniDirectionItem( eAniDir ) );
    aItemSet.Put( SdrTextAniCountItem( nCount ) );
    aItemSet.Put( SdrTextAniDelayItem( nDelay ) );
    aItemSet.Put( SdrTextAniAmountItem( nAmount ) );
    if( SDRTEXTANI_ALTERNATE==eAniKind )
    {
        // (Nur) Alternate startet und stoppt per default Inside
        aItemSet.Put( SdrTextAniStartInsideItem(sal_True) );
        aItemSet.Put( SdrTextAniStopInsideItem(sal_True) );
        if( SDRTEXTANI_LEFT==eAniDir )
            aItemSet.Put( SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT) );
    }

    // die Default-Farbe (aus der Standard-Vorlage) setzen, damit ueberhaupt
    // eine sinnvolle Farbe gesetzt ist.
    const Color& rDfltColor =
        pCSS1Parser->GetTxtCollFromPool( RES_POOLCOLL_STANDARD )
            ->GetColor().GetValue();
    aItemSet.Put( SvxColorItem( rDfltColor, EE_CHAR_COLOR ) );

    // Die Attribute der aktuellen Absatzvorlage setzen
    sal_uInt16 nWhichIds[] =
    {
        RES_CHRATR_COLOR,   RES_CHRATR_CROSSEDOUT, RES_CHRATR_ESCAPEMENT,
        RES_CHRATR_FONT,    RES_CHRATR_FONTSIZE,   RES_CHRATR_KERNING,
        RES_CHRATR_POSTURE, RES_CHRATR_UNDERLINE,  RES_CHRATR_WEIGHT,
        RES_CHRATR_BACKGROUND,                     0
    };
    const SwTxtNode *pTxtNd = pDoc->GetNodes()[pPam->GetPoint()->nNode]
                                  ->GetTxtNode();
    if( pTxtNd )
    {
        const SfxItemSet& rItemSet = pTxtNd->GetAnyFmtColl().GetAttrSet();
        const SfxPoolItem *pItem;
        for( sal_uInt16 i=0; nWhichIds[i]; i++ )
        {
            if( SFX_ITEM_SET == rItemSet.GetItemState( nWhichIds[i], sal_True, &pItem ) )
                PutEEPoolItem( aItemSet, *pItem );
        }
    }

    // die Attribute der Umgebung am Draw-Objekt setzen
    _HTMLAttr** pTbl = (_HTMLAttr**)&aAttrTab;
    for( sal_uInt16 nCnt = sizeof( _HTMLAttrTable ) / sizeof( _HTMLAttr* );
         nCnt--; ++pTbl )
    {
        _HTMLAttr *pAttr = *pTbl;
        if( pAttr )
            PutEEPoolItem( aItemSet, pAttr->GetItem() );
    }

    if( bBGColor )
    {
        aItemSet.Put( XFillStyleItem(XFILL_SOLID) );
        aItemSet.Put( XFillColorItem(aEmptyStr, aBGColor) );
    }

    // Styles parsen (funktioniert hier nur fuer Attribute, die auch
    // am Zeichen-Objekt gesetzt werden koennen)
    SfxItemSet aStyleItemSet( pDoc->GetAttrPool(),
                              pCSS1Parser->GetWhichMap() );
    SvxCSS1PropertyInfo aPropInfo;
    if( HasStyleOptions( aStyle, aId, aClass )  &&
        ParseStyleOptions( aStyle, aId, aClass, aStyleItemSet, aPropInfo ) )
    {
        SfxItemIter aIter( aStyleItemSet );

        const SfxPoolItem *pItem = aIter.FirstItem();
        while( pItem )
        {
            PutEEPoolItem( aItemSet, *pItem );
            pItem = aIter.NextItem();
        }
    }

    // jetzt noch die Groesse setzen
    Size aTwipSz( bPrcWidth ? 0 : nWidth, nHeight );
    if( (aTwipSz.Width() || aTwipSz.Height()) && Application::GetDefaultDevice() )
    {
        aTwipSz = Application::GetDefaultDevice()
                    ->PixelToLogic( aTwipSz, MapMode( MAP_TWIP ) );
    }

    if( SVX_CSS1_LTYPE_TWIP== aPropInfo.eWidthType )
    {
        aTwipSz.Width() = aPropInfo.nWidth;
        nWidth = 1; // != 0;
        bPrcWidth = sal_False;
    }
    if( SVX_CSS1_LTYPE_TWIP== aPropInfo.eHeightType )
        aTwipSz.Height() = aPropInfo.nHeight;

    bFixMarqueeWidth = sal_False;
    if( !nWidth || bPrcWidth )
    {
        if( pTable )
        {
            if( !pCurTable )
            {
                // Die Laufschrift steht in einer Tabelle, aber nicht
                // in einer Zelle. Da jetzt keine vernuenftige Zuordung
                // zu einer Zelle moeglich ist, passen wir hir die
                // Breite dem Inhalt der Laufschrift an.
                bFixMarqueeWidth = sal_True;
            }
            else if( !nWidth )
            {
                // Da wir wissen, in welcher Zelle die Laufschrift ist,
                // koennen wir die Breite auch anpassen. Keine Breitenangabe
                // wird wie 100% behandelt.
                nWidth = 100;
                bPrcWidth = sal_True;
            }
            aTwipSz.Width() = MINLAY;
        }
        else
        {
            long nBrowseWidth = GetCurrentBrowseWidth();
            aTwipSz.Width() = !nWidth ? nBrowseWidth
                                      : (nWidth*nBrowseWidth) / 100;
        }
    }

    // Die Hoehe ist nur eine Mindest-Hoehe
    if( aTwipSz.Height() < MINFLY )
        aTwipSz.Height() = MINFLY;
    aItemSet.Put( SdrTextMinFrameHeightItem( aTwipSz.Height() ) );

    pMarquee->SetAttributes( aItemSet, sal_False );

    if( aTwipSz.Width() < MINFLY )
        aTwipSz.Width() = MINFLY;
    pMarquee->SetLogicRect( Rectangle( 0, 0, aTwipSz.Width(), aTwipSz.Height() ) );

    // und das Objekt in das Dok einfuegen
    InsertDrawObject( pMarquee, aSpace, eVertOri, eHoriOri, aStyleItemSet,
                      aPropInfo );

    // Das Zeichen-Objekt der Tabelle bekanntmachen. Ist ein bisserl
    // umstaendlich, weil noch ueber den Parser gegangen wird, obwohl die
    // Tabelle bekannt ist, aber anderenfalls muesste man die Tabelle
    // oeffentlich machen, und das ist auch nicht schoen. Das globale
    // pTable kann uebrigens auch nicht verwendet werden, denn die
    // Laufschrift kann sich auch mal in einer Sub-Tabelle befinden.
    if( pCurTable && bPrcWidth)
        RegisterDrawObjectToTable( pCurTable, pMarquee, (sal_uInt8)nWidth );
}

void SwHTMLParser::EndMarquee()
{
    ASSERT( pMarquee && OBJ_TEXT==pMarquee->GetObjIdentifier(),
            "kein Marquee oder falscher Typ" );

    if( bFixMarqueeWidth )
    {
        // Da es keine fixe Hoehe gibt, das Text-Objekt erstmal breiter
        // als den Text machen, damit nicht umgebrochen wird.
        const Rectangle& rOldRect = pMarquee->GetLogicRect();
        pMarquee->SetLogicRect( Rectangle( rOldRect.TopLeft(),
                                           Size( USHRT_MAX, 240 ) ) );
    }

    // den gesammelten Text einfuegen
    ((SdrTextObj*)pMarquee)->SetText( aContents );

    if( bFixMarqueeWidth )
    {
        // die Groesse dem Text anpassen.
        ((SdrTextObj*)pMarquee)->FitFrameToTextSize();
    }

    aContents.Erase();
    pMarquee = 0;
}

void SwHTMLParser::InsertMarqueeText()
{
    ASSERT( pMarquee && OBJ_TEXT==pMarquee->GetObjIdentifier(),
            "kein Marquee oder falscher Typ" );

    // das akteulle Textstueck an den Text anhaengen
    aContents += aToken;
}

void SwHTMLParser::ResizeDrawObject( SdrObject* pObj, SwTwips nWidth )
{
    ASSERT( OBJ_TEXT==pObj->GetObjIdentifier(),
            "kein Marquee oder falscher Typ" );

    if( OBJ_TEXT!=pObj->GetObjIdentifier() )
        return;

    // die alte Groesse
    const Rectangle& rOldRect = pObj->GetLogicRect();
    Size aNewSz( nWidth, rOldRect.GetSize().Height() );
    pObj->SetLogicRect( Rectangle( rOldRect.TopLeft(), aNewSz ) );
}

/*  */

const SdrObject *SwHTMLWriter::GetMarqueeTextObj( const SwDrawFrmFmt& rFmt )
{
    const SdrObject* pObj = rFmt.FindSdrObject();
    return (pObj && ::IsMarqueeTextObj( *pObj )) ? pObj : 0;
}

void SwHTMLWriter::GetEEAttrsFromDrwObj( SfxItemSet& rItemSet,
                                         const SdrObject *pObj,
                                         sal_Bool bSetDefaults )
{
    // die Edit ::com::sun::star::script::Engine-Attribute aus dem Objekt holen
    SfxItemSet aObjItemSet( *pObj->GetItemPool(), EE_CHAR_START,
                                                  EE_CHAR_END );
    pObj->TakeAttributes( aObjItemSet, sal_False, sal_False );

    // ueber die Edit ::com::sun::star::script::Engine-Attribute iterieren und die Attribute
    // in SW-Attrs wandeln bzw. default setzen
    SfxWhichIter aIter( aObjItemSet );
    sal_uInt16 nEEWhich = aIter.FirstWhich();
    while( nEEWhich )
    {
        const SfxPoolItem *pEEItem;
        sal_Bool bSet = SFX_ITEM_SET == aObjItemSet.GetItemState( nEEWhich, sal_False,
                                                              &pEEItem );

        if( bSet || bSetDefaults )
        {
            sal_uInt16 nSwWhich = 0;
            switch( nEEWhich )
            {
            case EE_CHAR_COLOR:         nSwWhich = RES_CHRATR_COLOR;        break;
            case EE_CHAR_STRIKEOUT:     nSwWhich = RES_CHRATR_CROSSEDOUT;   break;
            case EE_CHAR_ESCAPEMENT:    nSwWhich = RES_CHRATR_ESCAPEMENT;   break;
            case EE_CHAR_FONTINFO:      nSwWhich = RES_CHRATR_FONT;         break;
            case EE_CHAR_FONTHEIGHT:    nSwWhich = RES_CHRATR_FONTSIZE;     break;
            case EE_CHAR_KERNING:       nSwWhich = RES_CHRATR_KERNING;      break;
            case EE_CHAR_ITALIC:        nSwWhich = RES_CHRATR_POSTURE;      break;
            case EE_CHAR_UNDERLINE:     nSwWhich = RES_CHRATR_UNDERLINE;    break;
            case EE_CHAR_WEIGHT:        nSwWhich = RES_CHRATR_WEIGHT;       break;
            }

            if( nSwWhich )
            {
                // wenn das Item nicht gesetzt ist nehmen wir ggf. das
                // Default-Item
                if( !bSet )
                    pEEItem = &aObjItemSet.GetPool()->GetDefaultItem(nEEWhich);

                // jetzt Clonen wir das Item mit der Which-Id des Writers
                SfxPoolItem *pSwItem = pEEItem->Clone();
                pSwItem->SetWhich( nSwWhich );
                rItemSet.Put( *pSwItem );
                delete pSwItem;
            }
        }

        nEEWhich = aIter.NextWhich();
    }
}


Writer& OutHTML_DrawFrmFmtAsMarquee( Writer& rWrt,
                                     const SwDrawFrmFmt& rFmt,
                                     const SdrObject& rSdrObject )
{
    SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;

    SdrModel* pModel = rWrt.pDoc->GetDrawModel();
    ASSERT( pModel, "Da gibt's ein Draw-Obj ohne ein Draw-Model zu haben?" );
    const SdrTextObj *pTextObj = (const SdrTextObj *)&rSdrObject;

    // Gibt es ueberhaupt auszugebenden Text
    const OutlinerParaObject *pOutlinerParaObj =
        pTextObj->GetOutlinerParaObject();
    if( !pOutlinerParaObj )
        return rWrt;

    ByteString sOut( '<' );
    sOut += sHTML_marquee;

    // Die Attribute des Objektd holen
    sal_uInt16 aWhichMap[5] =   { XATTR_FILL_FIRST,   XATTR_FILL_LAST,
                              SDRATTR_MISC_FIRST, SDRATTR_MISC_LAST,
                              0 };
    SfxItemSet aItemSet( *pTextObj->GetItemPool(), aWhichMap );
    pTextObj->TakeAttributes( aItemSet, sal_False, sal_False );

    // BEHAVIOUR
    SdrTextAniKind eAniKind = pTextObj->GetTextAniKind();
    ASSERT( SDRTEXTANI_SCROLL==eAniKind ||
            SDRTEXTANI_ALTERNATE==eAniKind ||
            SDRTEXTANI_SLIDE==eAniKind,
            "Text-Draw-Objekt nicht fuer Marquee geeignet" )

    const sal_Char *pStr = 0;
    switch( eAniKind )
    {
    case SDRTEXTANI_SCROLL:     pStr = sHTML_BEHAV_scroll;      break;
    case SDRTEXTANI_SLIDE:      pStr = sHTML_BEHAV_slide;       break;
    case SDRTEXTANI_ALTERNATE:  pStr = sHTML_BEHAV_alternate;   break;
    }

    if( pStr )
        (((sOut += ' ') += sHTML_O_behavior) += '=') += pStr;

    // DIRECTION
    pStr = 0;
    SdrTextAniDirection eAniDir = pTextObj->GetTextAniDirection();
    switch( eAniDir )
    {
    case SDRTEXTANI_LEFT:       pStr = sHTML_AL_left;       break;
    case SDRTEXTANI_RIGHT:      pStr = sHTML_AL_right;      break;
    }

    if( pStr )
        (((sOut += ' ') += sHTML_O_direction) += '=') += pStr;

    // LOOP
    sal_Int32 nCount =
        ((const SdrTextAniCountItem&)aItemSet.Get( SDRATTR_TEXT_ANICOUNT ))
                                             .GetValue();
    if( 0==nCount )
        nCount = SDRTEXTANI_SLIDE==eAniKind ? 1 : -1;
    (((sOut += ' ') += sHTML_O_loop) += '=')
        += ByteString::CreateFromInt32( nCount );

    // SCROLLDELAY
    sal_uInt16 nDelay =
        ((const SdrTextAniDelayItem&)aItemSet.Get( SDRATTR_TEXT_ANIDELAY ))
                                            .GetValue();
    (((sOut += ' ') += sHTML_O_scrolldelay) += '=')
        += ByteString::CreateFromInt32( nDelay );

    // SCROLLAMOUNT
    sal_Int16 nAmount =
        ((const SdrTextAniAmountItem&)aItemSet.Get( SDRATTR_TEXT_ANIAMOUNT ))
                                             .GetValue();
    if( nAmount < 0 )
    {
        nAmount = -nAmount;
    }
    else if( nAmount && Application::GetDefaultDevice() )
    {
        nAmount = (sal_uInt16)(Application::GetDefaultDevice()
                            ->LogicToPixel( Size(nAmount,0),
                                            MapMode(MAP_TWIP) ).Width());
    }
    if( nAmount )
        (((sOut += ' ') += sHTML_O_scrollamount) += '=')
            += ByteString::CreateFromInt32( nAmount );

    Size aTwipSz( pTextObj->GetLogicRect().GetSize() );
    if( pTextObj->IsAutoGrowWidth() )
        aTwipSz.Width() = 0;
    // Die Hoehe ist bei MS eine Mindesthoehe, also geben wir auch die
    // Mindestheoehe aus, wenn es sie gibt. Da eine Mindesthoehe MINFLY
    // mit hoher Wahrscheinlichkeit vom Import kommt, wird sie nicht mit
    // ausgegeben. Falsch machen kann man da nichst, denn jeder Font ist
    // hoeher.
    if( pTextObj->IsAutoGrowHeight() )
    {
        aTwipSz.Height() = pTextObj->GetMinTextFrameHeight();
        if( MINFLY==aTwipSz.Height() )
            aTwipSz.Height() = 0;
    }

    if( (aTwipSz.Width() || aTwipSz.Height()) &&
        Application::GetDefaultDevice() )
    {
        Size aPixelSz =
            Application::GetDefaultDevice()->LogicToPixel( aTwipSz,
                                                MapMode(MAP_TWIP) );
        if( !aPixelSz.Width() && aTwipSz.Width() )
            aPixelSz.Width() = 1;
        if( !aPixelSz.Height() && aTwipSz.Height() )
            aPixelSz.Height() = 1;

        if( aPixelSz.Width() )
            (((sOut += ' ') += sHTML_O_width) += '=')
                += ByteString::CreateFromInt32( aPixelSz.Width() );

        if( aPixelSz.Height() )
            (((sOut += ' ') += sHTML_O_height) += '=')
                += ByteString::CreateFromInt32( aPixelSz.Height() );
    }

    // BGCOLOR
    XFillStyle eFillStyle =
        ((const XFillStyleItem&)aItemSet.Get(XATTR_FILLSTYLE)).GetValue();
    if( XFILL_SOLID==eFillStyle )
    {
        const Color& rFillColor =
            ((const XFillColorItem&)aItemSet.Get(XATTR_FILLCOLOR)).GetValue();

        ((sOut += ' ') += sHTML_O_bgcolor) += '=';
        rWrt.Strm() << sOut.GetBuffer();
        HTMLOutFuncs::Out_Color( rWrt.Strm(), rFillColor, rHTMLWrt.eDestEnc );
        sOut.Erase();
    }

    if( sOut.Len() )
        rWrt.Strm() << sOut.GetBuffer();

    // und nun noch ALIGN, HSPACE und VSPACE
    ByteString aEndTags;
    sal_uInt32 nFrmFlags = HTML_FRMOPTS_MARQUEE;
    if( rHTMLWrt.IsHTMLMode( HTMLMODE_ABS_POS_DRAW ) )
        nFrmFlags |= HTML_FRMOPTS_MARQUEE_CSS1;
    rHTMLWrt.OutFrmFmtOptions( rFmt, aEmptyStr, aEndTags, nFrmFlags );
    if( rHTMLWrt.IsHTMLMode( HTMLMODE_ABS_POS_DRAW ) )
        rHTMLWrt.OutCSS1_FrmFmtOptions( rFmt, nFrmFlags, &rSdrObject );


    rWrt.Strm() << '>';

    // Was jetzt kommt ist das Gegenstueck zu SdrTextObjectt::SetText()
#if SUPD>601
    Outliner aOutliner(0, OUTLINERMODE_TEXTOBJECT);
#else
    Outliner aOutliner;
#endif
    aOutliner.SetUpdateMode( sal_False );
    aOutliner.SetText( *pOutlinerParaObj );
#if SUPD>601
    String aText( aOutliner.GetText( aOutliner.GetParagraph(0),
                                     aOutliner.GetParagraphCount() ) );
#else
    String aText( aOutliner.GetText( aOutliner.First(),
                                     aOutliner.GetParagraphCount() ) );
#endif
    HTMLOutFuncs::Out_String( rWrt.Strm(), aText,
                                rHTMLWrt.eDestEnc );

    HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_marquee, sal_False );

    if( aEndTags.Len() )
        rWrt.Strm() << aEndTags.GetBuffer();

    return rWrt;
}


/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/html/htmldraw.cxx,v 1.1.1.1 2000-09-18 17:14:55 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.45  2000/09/18 16:04:44  willem.vandorp
      OpenOffice header added.

      Revision 1.44  2000/08/24 07:53:38  os
      Outliner changes

      Revision 1.43  2000/06/26 09:51:57  jp
      must change: GetAppWindow->GetDefaultDevice

      Revision 1.42  2000/04/10 12:20:55  mib
      unicode

      Revision 1.41  2000/03/21 15:06:17  os
      UNOIII

      Revision 1.40  2000/03/03 15:21:00  os
      StarView remainders removed

      Revision 1.39  2000/02/11 14:37:07  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.38  1999/11/19 16:40:20  os
      modules renamed

      Revision 1.37  1999/09/21 09:48:50  mib
      multiple text encodings

      Revision 1.36  1999/09/17 12:12:52  mib
      support of multiple and non system text encodings

      Revision 1.35  1999/06/10 08:33:54  JP
      have to change: no AppWin from SfxApp


      Rev 1.34   10 Jun 1999 10:33:54   JP
   have to change: no AppWin from SfxApp

      Rev 1.33   09 Jun 1999 19:36:36   JP
   have to change: no cast from GetpApp to SfxApp/OffApp, SfxShell only subclass of SfxApp

      Rev 1.32   27 Jan 1999 19:00:04   JP
   Task #61014#: FindSdrObject/FindContactObject als Methoden vom SwFrmFmt

      Rev 1.31   27 Jan 1999 09:43:28   OS
   #56371# TF_ONE51

      Rev 1.30   11 Dec 1998 09:34:56   JP
   Bug #58217#: MarqueeTextObjecte erkennen

      Rev 1.29   20 May 1998 15:22:18   MIB
   Zeichen-Objekte ueber Schnittstelle am Dok einfuegen

      Rev 1.28   02 Apr 1998 19:44:24   MIB
   Frm-Flags: sal_uInt16 -> sal_uInt32

      Rev 1.27   27 Mar 1998 17:24:34   MIB
   direkte absolute Positionierung und Groessen-Export von Controls und Marquee

      Rev 1.26   27 Mar 1998 10:03:38   MIB
   direkte Positionierung von Grafiken etc.

      Rev 1.25   20 Mar 1998 10:49:50   MIB
   abs.-pos. fuer Zeichen-Objektei, Optimierungen

      Rev 1.24   14 Mar 1998 19:02:34   MIB
   Export-Umstellung fuer am-zeichen gebundene Rahmen und abs.-pos.

      Rev 1.23   20 Feb 1998 19:04:32   MA
   header

      Rev 1.22   16 Feb 1998 16:06:18   MIB
   fix #45523#: Hoehe von Laufschriften als Mindesthoehe interpretieren

      Rev 1.21   16 Feb 1998 12:31:08   MIB
   DokInfo-Feld jetzt auch fixed

      Rev 1.20   26 Nov 1997 19:09:24   MA
   includes

      Rev 1.19   03 Nov 1997 14:08:52   MA
   precomp entfernt

      Rev 1.18   19 Sep 1997 08:38:00   MIB
   fix #41185#: Laufschrift an Tabellenzellen-Breite anpassen

      Rev 1.17   10 Sep 1997 15:22:06   MIB
   Styles fuer Marquee

      Rev 1.16   09 Sep 1997 14:13:24   MIB
   Ueberall Browse-View-Breite statt Seitenbreite verwenden

      Rev 1.15   29 Aug 1997 16:49:50   OS
   DLL-Umstellung

      Rev 1.14   18 Aug 1997 11:36:14   OS
   includes

      Rev 1.13   15 Aug 1997 12:47:42   OS
   charatr/frmatr/txtatr aufgeteilt

      Rev 1.12   12 Aug 1997 13:47:02   OS
   Header-Umstellung

      Rev 1.11   07 Aug 1997 15:08:28   OM
   Headerfile-Umstellung

      Rev 1.10   05 Aug 1997 14:56:36   TJ
   include

      Rev 1.9   28 Jul 1997 12:39:00   MIB
   fix #37237#: Bei Laufschrift auch Attrs aus Absatz-Vorlage uebernehmen

      Rev 1.8   29 Apr 1997 11:21:48   MH
   add: header

      Rev 1.7   10 Apr 1997 16:45:50   TRI
   includes

      Rev 1.6   10 Apr 1997 13:15:46   MH
   add: header

      Rev 1.5   09 Jan 1997 11:20:44   MIB
   fix #34862#: -Angaben groesser 100 bei MARQUEE abfangen

      Rev 1.4   22 Nov 1996 09:37:50   MIB
   fix #33414#: MARQUEE in Tabellen an Textbreite anpassen, Farbe aus Standard-Vor

      Rev 1.3   07 Nov 1996 19:06:58   JP
   NoTxtNode hat Altern.Text, Namen am HREF

      Rev 1.2   07 Nov 1996 16:24:30   MIB
   Laufschrift exportieren

      Rev 1.1   06 Nov 1996 11:50:24   MIB
   neue defaults fuer Alternate-Marquee, Anpassung an die 344

      Rev 1.0   05 Nov 1996 12:03:58   MIB
   Initial revision.

*************************************************************************/

diff --git a/sw/source/filter/html/htmlfld.cxx b/sw/source/filter/html/htmlfld.cxx
new file mode 100644
index 0000000..5752acd
--- /dev/null
+++ b/sw/source/filter/html/htmlfld.cxx
@@ -0,0 +1,787 @@
/*************************************************************************
 *
 *  $RCSfile: htmlfld.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:55 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/


#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop


#ifndef _SFXDOCINF_HXX //autogen
#include <sfx2/docinf.hxx>
#endif
#ifndef _HTMLTOKN_H
#include <svtools/htmltokn.h>
#endif
#ifndef _ZFORMAT_HXX //autogen
#include <svtools/zformat.hxx>
#endif


#ifndef _FMTFLD_HXX //autogen
#include <fmtfld.hxx>
#endif
#ifndef _NDTXT_HXX //autogen
#include <ndtxt.hxx>
#endif
#include "doc.hxx"
#include "finder.hxx"
#include "fldbas.hxx"
#include "docufld.hxx"
#include "flddat.hxx"
#include "htmlfld.hxx"
#include "swhtml.hxx"

struct HTMLNumFmtTblEntry
{
    const sal_Char *pName;
    NfIndexTableOffset eFmt;
};

static HTMLOptionEnum __FAR_DATA aHTMLFldTypeTable[] =
{
    { sHTML_FT_author,  RES_AUTHORFLD       },
    { sHTML_FT_sender,  RES_EXTUSERFLD      },
    { sHTML_FT_date,    RES_DATEFLD         },
    { sHTML_FT_time,    RES_TIMEFLD         },
    { sHTML_FT_datetime,RES_DATETIMEFLD     },
    { sHTML_FT_page,    RES_PAGENUMBERFLD   },
    { sHTML_FT_docinfo, RES_DOCINFOFLD      },
    { sHTML_FT_docstat, RES_DOCSTATFLD      },
    { sHTML_FT_filename,RES_FILENAMEFLD     },
    { 0,                0                   }
};

static HTMLNumFmtTblEntry __FAR_DATA aHTMLDateFldFmtTable[] =
{
    { sHTML_FF_ssys,        NF_DATE_SYSTEM_SHORT    },
    { sHTML_FF_lsys,        NF_DATE_SYSTEM_LONG     },
    { sHTML_FF_dmy,         NF_DATE_SYS_DDMMYY,     },
    { sHTML_FF_dmyy,        NF_DATE_SYS_DDMMYYYY,   },
    { sHTML_FF_dmmy,        NF_DATE_SYS_DMMMYY,     },
    { sHTML_FF_dmmyy,       NF_DATE_SYS_DMMMYYYY,   },
    { sHTML_FF_dmmmy,       NF_DATE_DIN_DMMMMYYYY   },
    { sHTML_FF_dmmmyy,      NF_DATE_DIN_DMMMMYYYY   },
    { sHTML_FF_ddmmy,       NF_DATE_SYS_NNDMMMYY    },
    { sHTML_FF_ddmmmy,      NF_DATE_SYS_NNDMMMMYYYY },
    { sHTML_FF_ddmmmyy,     NF_DATE_SYS_NNDMMMMYYYY },
    { sHTML_FF_dddmmmy,     NF_DATE_SYS_NNNNDMMMMYYYY },
    { sHTML_FF_dddmmmyy,    NF_DATE_SYS_NNNNDMMMMYYYY },
    { sHTML_FF_my,          NF_DATE_SYS_MMYY        },
    { sHTML_FF_md,          NF_DATE_DIN_MMDD        },
    { sHTML_FF_ymd,         NF_DATE_DIN_YYMMDD      },
    { sHTML_FF_yymd,        NF_DATE_DIN_YYYYMMDD    },
    { 0,                    NF_NUMERIC_START }
};

static HTMLNumFmtTblEntry __FAR_DATA aHTMLTimeFldFmtTable[] =
{
    { sHTML_FF_sys,      NF_TIME_HHMMSS },
    { sHTML_FF_ssmm24,   NF_TIME_HHMM },
    { sHTML_FF_ssmm12,   NF_TIME_HHMMAMPM },
    { 0,                 NF_NUMERIC_START }
};

static HTMLOptionEnum __FAR_DATA aHTMLPageNumFldFmtTable[] =
{
    { sHTML_FF_uletter,      SVX_NUM_CHARS_UPPER_LETTER },
    { sHTML_FF_lletter,      SVX_NUM_CHARS_LOWER_LETTER },
    { sHTML_FF_uroman,       SVX_NUM_ROMAN_UPPER },
    { sHTML_FF_lroman,       SVX_NUM_ROMAN_LOWER },
    { sHTML_FF_arabic,       SVX_NUM_ARABIC },
    { sHTML_FF_none,         SVX_NUM_NUMBER_NONE },
    { sHTML_FF_char,         SVX_NUM_CHAR_SPECIAL },
    { sHTML_FF_page,         SVX_NUM_PAGEDESC },
    { sHTML_FF_ulettern,     SVX_NUM_CHARS_UPPER_LETTER_N },
    { sHTML_FF_llettern,     SVX_NUM_CHARS_LOWER_LETTER_N },
    { 0,                     0 }
};


static HTMLOptionEnum __FAR_DATA aHTMLExtUsrFldSubTable[] =
{
    { sHTML_FS_company,      EU_COMPANY },
    { sHTML_FS_firstname,    EU_FIRSTNAME },
    { sHTML_FS_name,         EU_NAME },
    { sHTML_FS_shortcut,     EU_SHORTCUT },
    { sHTML_FS_street,       EU_STREET },
    { sHTML_FS_country,      EU_COUNTRY },
    { sHTML_FS_zip,          EU_ZIP },
    { sHTML_FS_city,         EU_CITY },
    { sHTML_FS_title,        EU_TITLE },
    { sHTML_FS_position,     EU_POSITION },
    { sHTML_FS_pphone,       EU_PHONE_PRIVATE },
    { sHTML_FS_cphone,       EU_PHONE_COMPANY },
    { sHTML_FS_fax,          EU_FAX },
    { sHTML_FS_email,        EU_EMAIL },
    { sHTML_FS_state,        EU_STATE },
    { 0,                     0 }
};

static HTMLOptionEnum __FAR_DATA aHTMLAuthorFldFmtTable[] =
{
    { sHTML_FF_name,         AF_NAME },
    { sHTML_FF_shortcut,     AF_SHORTCUT },
    { 0,                     0 }
};

static HTMLOptionEnum __FAR_DATA aHTMLPageNumFldSubTable[] =
{
    { sHTML_FS_random,       PG_RANDOM },
    { sHTML_FS_next,         PG_NEXT },
    { sHTML_FS_prev,         PG_PREV },
    { 0,                     0  }
};

static HTMLOptionEnum __FAR_DATA aHTMLDocInfoFldSubTable[] =
{
    { sHTML_FS_title,    DI_TITEL },
    { sHTML_FS_theme,    DI_THEMA },
    { sHTML_FS_keys,     DI_KEYS },
    { sHTML_FS_comment,  DI_COMMENT },
    { sHTML_FS_info1,    DI_INFO1 },
    { sHTML_FS_info2,    DI_INFO2 },
    { sHTML_FS_info3,    DI_INFO3 },
    { sHTML_FS_info4,    DI_INFO4 },
    { sHTML_FS_create,   DI_CREATE },
    { sHTML_FS_change,   DI_CHANGE },
    { 0,                 0 }
};

static HTMLOptionEnum __FAR_DATA aHTMLDocInfoFldFmtTable[] =
{
    { sHTML_FF_author,   DI_SUB_AUTHOR },
    { sHTML_FF_time,     DI_SUB_TIME },
    { sHTML_FF_date,     DI_SUB_DATE },
    { 0,                 0 }
};

static HTMLOptionEnum __FAR_DATA aHTMLDocStatFldSubTable[] =
{
    { sHTML_FS_page,     DS_PAGE },
    { sHTML_FS_para,     DS_PARA },
    { sHTML_FS_word,     DS_WORD },
    { sHTML_FS_char,     DS_CHAR },
    { sHTML_FS_tbl,      DS_TBL },
    { sHTML_FS_grf,      DS_GRF },
    { sHTML_FS_ole,      DS_OLE },
    { 0,                 0 }
};

static HTMLOptionEnum __FAR_DATA aHTMLFileNameFldFmtTable[] =
{
    { sHTML_FF_name,        FF_NAME },
    { sHTML_FF_pathname,    FF_PATHNAME },
    { sHTML_FF_path,        FF_PATH },
    { sHTML_FF_name_noext,  FF_NAME_NOEXT },
    { 0,                    0 }
};

/*  */

USHORT SwHTMLParser::GetNumType( const String& rStr, USHORT nDfltType )
{
    USHORT nType = nDfltType;
    const HTMLOptionEnum *pOptEnums = aHTMLPageNumFldFmtTable;
    while( pOptEnums->pName )
        if( !rStr.EqualsIgnoreCaseAscii( pOptEnums->pName ) )
            pOptEnums++;
        else
            break;

    if( pOptEnums->pName )
        nType = pOptEnums->nValue;

    return nType;
}


void SwHTMLParser::NewField()
{
    BOOL bKnownType = FALSE, bFixed = FALSE,
         bHasNumFmt = FALSE, bHasNumValue = FALSE;
    USHORT nType;
    String aValue, aNumFmt, aNumValue ;
    const HTMLOption *pSubOption=0, *pFmtOption=0;

    const HTMLOptions *pOptions = GetOptions();
    for( USHORT i = pOptions->Count(); i; )
    {
        const HTMLOption *pOption = (*pOptions)[--i];
        switch( pOption->GetToken() )
        {
        case HTML_O_TYPE:
            bKnownType = pOption->GetEnum( nType, aHTMLFldTypeTable );
            break;
        case HTML_O_SUBTYPE:
            pSubOption = pOption;
            break;
        case HTML_O_FORMAT:
            pFmtOption = pOption;
            break;
        case HTML_O_VALUE:
            aValue = pOption->GetString();
            break;
        case HTML_O_SDNUM:
            aNumFmt = pOption->GetString();
            bHasNumFmt = TRUE;
            break;
        case HTML_O_SDVAL:
            aNumValue = pOption->GetString();
            bHasNumValue = TRUE;
            break;
        case HTML_O_SDFIXED:
            bFixed = TRUE;
            break;
        }
    }

    if( !bKnownType )
        return;

    // Autor und Absender werden nur als als variables Feld eingefuegt,
    // wenn man das Dok selbst als letztes geaendert hat oder es noch
    // niemend geandert hat und man das Dok erstellt hat. Sonst
    // wird ein Fixed-Feld daraus gemacht.
    if( !bFixed &&
        (RES_EXTUSERFLD == (RES_FIELDS)nType ||
         RES_AUTHORFLD == (RES_FIELDS)nType) )
    {
        String aUser( pPathFinder->GetUserName() );
        const SfxDocumentInfo *pDocInfo = pDoc->GetInfo();
        const String& rChanged = pDocInfo->GetChanged().GetName();
        const String& rCreated = pDocInfo->GetCreated().GetName();
        if( !aUser.Len() ||
            (rChanged.Len() ? aUser!=rChanged : aUser!=rCreated) )
            bFixed = TRUE;
    }

    USHORT nWhich = nType;
    if( RES_DATEFLD==nType || RES_TIMEFLD==nType )
        nWhich = RES_DATETIMEFLD;

    SwFieldType* pType = pDoc->GetSysFldType( nWhich );
    SwField *pFld = 0;
    BOOL bInsOnEndTag = FALSE;

    switch( (RES_FIELDS)nType )
    {
    case RES_EXTUSERFLD:
        if( pSubOption )
        {
            USHORT nSub;
            ULONG nFmt = 0;
            if( bFixed )
            {
                nFmt |= AF_FIXED;
                bInsOnEndTag = TRUE;
            }
            if( pSubOption->GetEnum( nSub, aHTMLExtUsrFldSubTable ) )
                pFld = new SwExtUserField( (SwExtUserFieldType*)pType,
                                           nSub, nFmt );
        }
        break;

    case RES_AUTHORFLD:
        {
            USHORT nFmt = AF_NAME;
            if( pFmtOption )
                pFmtOption->GetEnum( nFmt, aHTMLAuthorFldFmtTable );
            if( bFixed )
            {
                nFmt |= AF_FIXED;
                bInsOnEndTag = TRUE;
            }

            pFld = new SwAuthorField( (SwAuthorFieldType *)pType, nFmt );
        }
        break;

    case RES_DATEFLD:
    case RES_TIMEFLD:
        {
            ULONG nNumFmt;
            ULONG nTime = Time().GetTime(), nDate = Date().GetDate();
            USHORT nSub;
            BOOL bValidFmt = FALSE;
            HTMLNumFmtTblEntry * pFmtTbl;

            if( RES_DATEFLD==nType )
            {
                nSub = DATEFLD;
                pFmtTbl = aHTMLDateFldFmtTable;
                if( aValue.Len() )
                    nDate = (ULONG)aValue.ToInt32();
            }
            else
            {
                nSub = TIMEFLD;
                pFmtTbl = aHTMLTimeFldFmtTable;
                if( aValue.Len() )
                    nTime = (ULONG)aValue.ToInt32();
            }
            if( aValue.Len() )
                nSub |= FIXEDFLD;

            SvNumberFormatter *pFormatter = pDoc->GetNumberFormatter();
            if( pFmtOption )
            {
                const String& rFmt = pFmtOption->GetString();
                for( USHORT i=0; pFmtTbl[i].pName; i++ )
                {
                    if( rFmt.EqualsIgnoreCaseAscii( pFmtTbl[i].pName ) )
                    {
                        nNumFmt = pFormatter->GetFormatIndex(
                                        pFmtTbl[i].eFmt, LANGUAGE_SYSTEM);
                        bValidFmt = TRUE;
                        break;
                    }
                }
            }
            if( !bValidFmt )
                nNumFmt = pFormatter->GetFormatIndex( pFmtTbl[i].eFmt,
                                                      LANGUAGE_SYSTEM);

            pFld = new SwDateTimeField( (SwDateTimeFieldType *)pType,
                                          nSub, nNumFmt );

            if (nSub & FIXEDFLD)
                ((SwDateTimeField *)pFld)->SetDateTime( nDate, nTime );
        }
        break;

    case RES_DATETIMEFLD:
        if( bHasNumFmt )
        {
            USHORT nSub = 0;

            SvNumberFormatter *pFormatter = pDoc->GetNumberFormatter();
            ULONG nNumFmt;
            LanguageType eLang;
            double dValue = GetTableDataOptionsValNum(
                                nNumFmt, eLang, aNumValue, aNumFmt,
                                *pDoc->GetNumberFormatter() );
            short nFmtType = pFormatter->GetType( nNumFmt );
            switch( nFmtType )
            {
            case NUMBERFORMAT_DATE: nSub = DATEFLD; break;
            case NUMBERFORMAT_TIME: nSub = TIMEFLD; break;
            }

            if( nSub )
            {
                if( bHasNumValue )
                    nSub |= FIXEDFLD;

                pFld = new SwDateTimeField( (SwDateTimeFieldType *)pType,
                                                  nSub, nNumFmt );
                if( bHasNumValue )
                    ((SwDateTimeField *)pFld)->SetValue( dValue );
            }
        }
        break;

    case RES_PAGENUMBERFLD:
        if( pSubOption )
        {
            USHORT nSub;
            if( pSubOption->GetEnum( nSub, aHTMLPageNumFldSubTable ) )
            {
                USHORT nFmt = SVX_NUM_PAGEDESC;
                if( pFmtOption )
                    pFmtOption->GetEnum( nFmt, aHTMLPageNumFldFmtTable );

                short nOff = 0;

                if( (SvxExtNumType)nFmt!=SVX_NUM_CHAR_SPECIAL && aValue.Len() )
                    nOff = (short)aValue.ToInt32();
                else if( (SwPageNumSubType)nSub == PG_NEXT  )
                    nOff = 1;
                else if( (SwPageNumSubType)nSub == PG_PREV  )
                    nOff = -1;

                if( (SvxExtNumType)nFmt==SVX_NUM_CHAR_SPECIAL &&
                    (SwPageNumSubType)nSub==PG_RANDOM )
                    nFmt = SVX_NUM_PAGEDESC;

                pFld = new SwPageNumberField( (SwPageNumberFieldType *)pType, nSub, nFmt, nOff );
                if( (SvxExtNumType)nFmt==SVX_NUM_CHAR_SPECIAL )
                    ((SwPageNumberField *)pFld)->SetUserString( aValue );
            }
        }
        break;

    case RES_DOCINFOFLD:
        if( pSubOption )
        {
            USHORT nSub;
            if( pSubOption->GetEnum( nSub, aHTMLDocInfoFldSubTable ) )
            {
                USHORT nExtSub = 0;
                if( DI_CREATE==(SwExtUserSubType)nSub ||
                    DI_CHANGE==(SwExtUserSubType)nSub )
                {
                    nExtSub = DI_SUB_AUTHOR;
                    if( pFmtOption )
                        pFmtOption->GetEnum( nExtSub, aHTMLDocInfoFldFmtTable );
                    nSub |= nExtSub;
                }

                ULONG nNumFmt = 0;
                double dValue = 0;
                if( bHasNumFmt && (DI_SUB_DATE==nExtSub || DI_SUB_TIME==nExtSub) )
                {
                    LanguageType eLang;
                    dValue = GetTableDataOptionsValNum(
                                    nNumFmt, eLang, aNumValue, aNumFmt,
                                    *pDoc->GetNumberFormatter() );
                    bFixed &= bHasNumValue;
                }
                else
                    bHasNumValue = FALSE;

                if( bFixed )
                {
                    nSub |= DI_SUB_FIXED;
                    bInsOnEndTag = TRUE;
                }

                pFld = new SwDocInfoField( (SwDocInfoFieldType *)pType,
                                             nSub, nNumFmt );
                if( bHasNumValue )
                    ((SwDocInfoField*)pFld)->SetValue( dValue );
            }
        }
        break;

    case RES_DOCSTATFLD:
        if( pSubOption )
        {
            USHORT nSub;
            if( pSubOption->GetEnum( nSub, aHTMLDocStatFldSubTable ) )
            {
                USHORT nFmt = SVX_NUM_ARABIC;
                if( pFmtOption )
                    pFmtOption->GetEnum( nFmt, aHTMLPageNumFldFmtTable );
                pFld = new SwDocStatField( (SwDocStatFieldType *)pType,
                                             nSub, nFmt );
                bUpdateDocStat |= (DS_PAGE != nFmt);
            }
        }
        break;

    case RES_FILENAMEFLD:
        {
            USHORT nFmt = FF_NAME;
            if( pFmtOption )
                pFmtOption->GetEnum( nFmt, aHTMLFileNameFldFmtTable );
            if( bFixed )
            {
                nFmt |= FF_FIXED;
                bInsOnEndTag = TRUE;
            }

            pFld = new SwFileNameField( (SwFileNameFieldType *)pType, nFmt );
        }
        break;
    }

    if( pFld )
    {
        if( bInsOnEndTag )
        {
            pField = pFld;
        }
        else
        {
            pDoc->Insert( *pPam, SwFmtFld(*pFld) );
            delete pFld;
        }
        bInField = TRUE;
    }
}

void SwHTMLParser::EndField()
{
    if( pField )
    {
        switch( pField->Which() )
        {
        case RES_DOCINFOFLD:
            ASSERT( ((SwDocInfoField*)pField)->IsFixed(),
                    "DokInfo-Feld haette nicht gemerkt werden muessen" );
            ((SwDocInfoField*)pField)->SetExpansion( aContents );
            break;

        case RES_EXTUSERFLD:
            ASSERT( ((SwExtUserField*)pField)->IsFixed(),
                    "ExtUser-Feld haette nicht gemerkt werden muessen" );
            ((SwExtUserField*)pField)->SetExpansion( aContents );
            break;

        case RES_AUTHORFLD:
            ASSERT( ((SwAuthorField*)pField)->IsFixed(),
                    "Author-Feld haette nicht gemerkt werden muessen" );
            ((SwAuthorField*)pField)->SetExpansion( aContents );
            break;

        case RES_FILENAMEFLD:
            ASSERT( ((SwFileNameField*)pField)->IsFixed(),
                    "FileName-Feld haette nicht gemerkt werden muessen" );
            ((SwFileNameField*)pField)->SetExpansion( aContents );
            break;
        }

        pDoc->Insert( *pPam, SwFmtFld(*pField) );
        delete pField;
        pField = 0;
    }

    bInField = FALSE;
    aContents.Erase();
}

void SwHTMLParser::InsertFieldText()
{
    if( pField )
    {
        // das aktuelle Textstueck an den Text anhaengen
        aContents += aToken;
    }
}

void SwHTMLParser::InsertCommentText( const sal_Char *pTag )
{
    BOOL bEmpty = aContents.Len() == 0;
    if( !bEmpty )
        aContents += '\n';

    aContents += aToken;
    if( bEmpty && pTag )
    {
        String aTmp( aContents );
        aContents.AssignAscii( "HTML: <" );
        aContents.AppendAscii( pTag );
        aContents.Append( '>' );
        aContents.Append( aTmp );
    }
}

void SwHTMLParser::InsertComment( const String& rComment, const sal_Char *pTag )
{
    String aComment( rComment );
    if( pTag )
    {
        aComment.AppendAscii( "</" );
        aComment.AppendAscii( pTag );
        aComment.Append( '>' );
    }

    // MIB 24.06.97: Wenn ein PostIt nach einen Space eingefuegt
    // werden soll, fuegen wir es vor dem Space ein. Dann gibt es
    // weniger Probleme beim Formatieren (bug #40483#)
    xub_StrLen nPos = pPam->GetPoint()->nContent.GetIndex();
    SwTxtNode *pTxtNd = pPam->GetNode()->GetTxtNode();
    BOOL bMoveFwd = FALSE;
    if( nPos>0 && pTxtNd && ' '==pTxtNd->GetTxt().GetChar(nPos-1) )
    {
        bMoveFwd = TRUE;

        ULONG nNodeIdx = pPam->GetPoint()->nNode.GetIndex();
        xub_StrLen nIdx = pPam->GetPoint()->nContent.GetIndex();
        for( USHORT i = aSetAttrTab.Count(); i > 0; )
        {
            _HTMLAttr *pAttr = aSetAttrTab[--i];
            if( pAttr->GetSttParaIdx() != nNodeIdx ||
                pAttr->GetSttCnt() != nIdx )
                break;

            if( RES_TXTATR_FIELD == pAttr->pItem->Which() &&
                RES_SCRIPTFLD == ((const SwFmtFld *)pAttr->pItem)->GetFld()
                                                        ->GetTyp()->Which() )
            {
                bMoveFwd = FALSE;
                break;
            }
        }

        if( bMoveFwd )
            pPam->Move( fnMoveBackward );
    }

    SwPostItField aPostItFld(
                    (SwPostItFieldType*)pDoc->GetSysFldType( RES_POSTITFLD ),
                    aEmptyStr, aComment, Date() );
    InsertAttr( SwFmtFld( aPostItFld ) );

    if( bMoveFwd )
        pPam->Move( fnMoveForward );
}


/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/html/htmlfld.cxx,v 1.1.1.1 2000-09-18 17:14:55 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.30  2000/09/18 16:04:44  willem.vandorp
      OpenOffice header added.

      Revision 1.29  2000/04/10 12:20:56  mib
      unicode

      Revision 1.28  2000/03/02 11:28:52  mib
      #73744#: state of ext user field

      Revision 1.27  1999/09/21 13:53:35  os
      SwExtUserSubType: language

      Revision 1.26  1999/09/17 12:12:56  mib
      support of multiple and non system text encodings

      Revision 1.25  1998/11/20 10:53:36  MIB
      #59064#: Unbekannte Token/<NOSCRIPT> und <NOEMEBED> beibehalten


      Rev 1.24   20 Nov 1998 11:53:36   MIB
   #59064#: Unbekannte Token/<NOSCRIPT> und <NOEMEBED> beibehalten

      Rev 1.23   17 Nov 1998 10:44:32   OS
   #58263# NumType durch SvxExtNumType ersetzt

      Rev 1.22   03 Nov 1998 14:01:14   MIB
   #58427#: Fixe Filename-Felder

      Rev 1.21   02 Nov 1998 17:17:50   MIB
   #58480#: Fuss-/Endnoten

      Rev 1.20   25 Mar 1998 12:14:40   MIB
   Statistk-Feld

      Rev 1.19   05 Mar 1998 17:41:24   OS
   AF_SHORCUT->AF_SHORTCUT

      Rev 1.18   02 Mar 1998 09:48:58   MIB
   Fixe Author- und ExtUser-Felder

      Rev 1.17   20 Feb 1998 19:03:28   MA
   header

      Rev 1.16   20 Feb 1998 12:27:34   MIB
   SDFIELD-Token/String erst ab 382 aktiviert

      Rev 1.15   16 Feb 1998 12:28:46   MIB
   DokInfo-Feld jetzt auch fixed

      Rev 1.14   13 Feb 1998 19:18:34   MIB
   Feldumstelling Teil 1: Date/Time und nicht-fixe Dok-Info

      Rev 1.13   26 Nov 1997 19:09:24   MA
   includes

      Rev 1.12   25 Nov 1997 11:50:14   TJ
   include svhtml.hxx

      Rev 1.11   21 Nov 1997 17:22:26   OM
   Feldbefehl-Umstellung: DocInfo

      Rev 1.10   03 Nov 1997 14:08:52   MA
   precomp entfernt

      Rev 1.9   14 Oct 1997 14:13:06   OM
   Feldumstellung

      Rev 1.8   29 Sep 1997 12:16:38   OM
   Feldumstellung

      Rev 1.7   24 Sep 1997 15:25:02   OM
   Feldumstellung

      Rev 1.6   15 Aug 1997 12:48:52   OS
   charatr/frmatr/txtatr aufgeteilt

      Rev 1.5   07 Aug 1997 15:07:44   OM
   Headerfile-Umstellung

      Rev 1.4   26 Jun 1997 14:13:52   OM
   Feldbefehl Dateiname ohne Extension

      Rev 1.3   11 Jun 1997 11:40:48   OM
   Neue Datumsformate fuer Datums-Feldbefehl

      Rev 1.2   18 Feb 1997 11:08:02   MIB
   Optimierung

      Rev 1.1   17 Feb 1997 12:37:22   MIB
   FileName-Feld im- und exportieren

      Rev 1.0   07 Feb 1997 18:05:10   MIB
   Initial revision.

*************************************************************************/


diff --git a/sw/source/filter/html/htmlfld.hxx b/sw/source/filter/html/htmlfld.hxx
new file mode 100644
index 0000000..41c50e1
--- /dev/null
+++ b/sw/source/filter/html/htmlfld.hxx
@@ -0,0 +1,166 @@
/*************************************************************************
 *
 *  $RCSfile: htmlfld.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:55 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _HTMLFLD_HXX
#define _HTMLFLD_HXX

#ifndef _HTMLKYWD_HXX
#include <svtools/htmlkywd.hxx>
#endif

extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FT_author, "AUTHOR" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FT_sender, "SENDER" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FT_date, "DATE" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FT_time, "TIME" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FT_datetime, "DATETIME" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FT_page, "PAGE" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FT_docinfo, "DOCINFO" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FT_docstat, "DOCSTAT" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FT_filename, "FILENAME" );

extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_company, "COMPANY" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_firstname, "FIRSTNAME" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_name, "NAME" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_shortcut, "SHORTCUT" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_street, "STREET" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_country, "COUNTRY" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_zip, "ZIP" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_city, "CITY" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_title, "TITLE" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_position, "POSITION" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_pphone, "PPHONE" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_cphone, "CPHONE" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_fax, "FAX" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_email, "EMAIL" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_state, "STATE" );

extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_random, "RANDOM" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_next, "NEXT" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_prev, "PREV" );

//sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_title, "TITLE" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_theme, "THEME" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_keys, "KEYS" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_comment, "COMMENT" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_info1, "INFO1" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_info2, "INFO2" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_info3, "INFO3" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_info4, "INFO4" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_create, "CREATE" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_change, "CHANGE" );

extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_page, "PAGE" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_para, "PARAGRAPH" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_word, "WORD" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_char, "CHAR" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_tbl, "TABLE" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_grf, "GRAPHIC" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FS_ole, "OLE" );

extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_name, "NAME" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_shortcut, "SHORTCUT" );

extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_ssys, "SSYS" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_lsys, "LSYS" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_dmy, "DMY" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_dmyy, "DMYY" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_dmmy, "DMMY" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_dmmyy, "DMMYY" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_dmmmy, "DMMMY" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_dmmmyy, "DMMMYY" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_ddmmy, "DDMMY" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_ddmmmy, "DDMMMY" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_ddmmmyy, "DDMMMYY" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_dddmmmy, "DDDMMMY" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_dddmmmyy, "DDDMMMYY" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_my, "MY" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_md, "MD" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_ymd, "YMD" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_yymd, "YYMD" );

extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_sys, "SYS" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_ssmm24, "SSMM24" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_ssmm12, "SSMM12" );

extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_uletter, "ULETTER" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_lletter, "LLETTER" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_uroman, "UROMAN" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_lroman, "LROMAN" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_arabic, "ARABIC" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_none, "NONE" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_char, "CHAR" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_page, "PAGE" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_ulettern, "ULETTERN" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_llettern, "LLETTERN" );

extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_author, "AUTHOR" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_time, "TIME" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_date, "DATE" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_all, "ALL" );

extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_pathname, "PATHNAME" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_path, "PATH" );
extern sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DECL( sHTML_FF_name_noext, "NAME-NOEXT" );


#endif


diff --git a/sw/source/filter/html/htmlfldw.cxx b/sw/source/filter/html/htmlfldw.cxx
new file mode 100644
index 0000000..f1eb6b2
--- /dev/null
+++ b/sw/source/filter/html/htmlfldw.cxx
@@ -0,0 +1,667 @@
/*************************************************************************
 *
 *  $RCSfile: htmlfldw.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:55 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/


#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif
#ifndef _HTMLOUT_HXX //autogen
#include <svtools/htmlout.hxx>
#endif
#ifndef _HTMLTOKN_H
#include <svtools/htmltokn.h>
#endif
#ifndef _FMTFLD_HXX //autogen
#include <fmtfld.hxx>
#endif
#ifndef _DOC_HXX //autogen
#include <doc.hxx>
#endif
#include "fldbas.hxx"
#include "docufld.hxx"
#include "flddat.hxx"
#include "htmlfld.hxx"
#include "wrthtml.hxx"

//-----------------------------------------------------------------------

sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FT_author, "AUTHOR" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FT_sender, "SENDER" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FT_date, "DATE" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FT_time, "TIME" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FT_datetime, "DATETIME" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FT_page, "PAGE" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FT_docinfo, "DOCINFO" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FT_docstat, "DOCSTAT" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FT_filename, "FILENAME" );

sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_company, "COMPANY" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_firstname, "FIRSTNAME" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_name, "NAME" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_shortcut, "SHORTCUT" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_street, "STREET" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_country, "COUNTRY" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_zip, "ZIP" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_city, "CITY" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_title, "TITLE" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_position, "POSITION" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_pphone, "PPHONE" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_cphone, "CPHONE" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_fax, "FAX" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_email, "EMAIL" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_state, "STATE" );

sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_random, "RANDOM" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_next, "NEXT" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_prev, "PREV" );

//sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_title, "TITLE" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_theme, "THEME" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_keys, "KEYS" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_comment, "COMMENT" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_info1, "INFO1" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_info2, "INFO2" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_info3, "INFO3" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_info4, "INFO4" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_create, "CREATE" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_change, "CHANGE" );

sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_page, "PAGE" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_para, "PARAGRAPH" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_word, "WORD" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_char, "CHAR" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_tbl, "TABLE" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_grf, "GRAPHIC" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FS_ole, "OLE" );

sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_name, "NAME" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_shortcut, "SHORTCUT" );

sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_ssys, "SSYS" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_lsys, "LSYS" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_dmy, "DMY" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_dmyy, "DMYY" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_dmmy, "DMMY" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_dmmyy, "DMMYY" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_dmmmy, "DMMMY" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_dmmmyy, "DMMMYY" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_ddmmy, "DDMMY" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_ddmmmy, "DDMMMY" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_ddmmmyy, "DDMMMYY" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_dddmmmy, "DDDMMMY" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_dddmmmyy, "DDDMMMYY" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_my, "MY" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_md, "MD" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_ymd, "YMD" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_yymd, "YYMD" );

sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_sys, "SYS" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_ssmm24, "SSMM24" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_ssmm12, "SSMM12" );

sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_uletter, "ULETTER" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_lletter, "LLETTER" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_uroman, "UROMAN" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_lroman, "LROMAN" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_arabic, "ARABIC" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_none, "NONE" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_char, "CHAR" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_page, "PAGE" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_ulettern, "ULETTERN" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_llettern, "LLETTERN" );

sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_author, "AUTHOR" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_time, "TIME" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_date, "DATE" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_all, "ALL" );

sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_pathname, "PATHNAME" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_path, "PATH" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_FF_name_noext, "NAME-NOEXT" );


const sal_Char *SwHTMLWriter::GetNumFormat( USHORT nFmt )
{
    const sal_Char *pFmtStr = 0;

    switch( (SvxExtNumType)nFmt )
    {
    case SVX_NUM_CHARS_UPPER_LETTER:    pFmtStr = sHTML_FF_uletter;     break;
    case SVX_NUM_CHARS_LOWER_LETTER:    pFmtStr = sHTML_FF_lletter;     break;
    case SVX_NUM_ROMAN_UPPER:           pFmtStr = sHTML_FF_uroman;      break;
    case SVX_NUM_ROMAN_LOWER:           pFmtStr = sHTML_FF_lroman;      break;
    case SVX_NUM_ARABIC:                pFmtStr = sHTML_FF_arabic;      break;
    case SVX_NUM_NUMBER_NONE:           pFmtStr = sHTML_FF_none;        break;
    case SVX_NUM_CHAR_SPECIAL:          pFmtStr = sHTML_FF_char;        break;
    case SVX_NUM_PAGEDESC:              pFmtStr = sHTML_FF_page;        break;
    case SVX_NUM_CHARS_UPPER_LETTER_N:  pFmtStr = sHTML_FF_ulettern;    break;
    case SVX_NUM_CHARS_LOWER_LETTER_N:  pFmtStr = sHTML_FF_llettern;    break;
    }

    return pFmtStr;
}

static Writer& OutHTML_SwField( Writer& rWrt, const SwField* pFld )
{
    SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;

    const SwFieldType* pFldTyp = pFld->GetTyp();
    USHORT nField = pFldTyp->Which();
    ULONG nFmt = pFld->GetFormat();

    const sal_Char *pTypeStr=0, // TYPE
                      *pSubStr=0,   // SUBTYPE
                   *pFmtStr=0;  // FORMAT (SW)
    String aValue;              // VALUE (SW)
    BOOL bNumFmt=FALSE;         // SDNUM (Number-Formatter-Format)
    BOOL bNumValue=FALSE;       // SDVAL (Number-Formatter-Value)
    double dNumValue;           // SDVAL (Number-Formatter-Value)
    BOOL bFixed=FALSE;          // SDFIXED

    switch( nField )
    {
        case RES_EXTUSERFLD:
            pTypeStr = sHTML_FT_sender;
            switch( (SwExtUserSubType)pFld->GetSubType() )
            {
                case EU_COMPANY:    pSubStr = sHTML_FS_company;     break;
                case EU_FIRSTNAME:  pSubStr = sHTML_FS_firstname;   break;
                case EU_NAME:       pSubStr = sHTML_FS_name;        break;
                case EU_SHORTCUT:   pSubStr = sHTML_FS_shortcut;    break;
                case EU_STREET:     pSubStr = sHTML_FS_street;      break;
                case EU_COUNTRY:    pSubStr = sHTML_FS_country;     break;
                case EU_ZIP:        pSubStr = sHTML_FS_zip;         break;
                case EU_CITY:       pSubStr = sHTML_FS_city;        break;
                case EU_TITLE:      pSubStr = sHTML_FS_title;       break;
                case EU_POSITION:   pSubStr = sHTML_FS_position;    break;
                case EU_PHONE_PRIVATE:  pSubStr = sHTML_FS_pphone;      break;
                case EU_PHONE_COMPANY:  pSubStr = sHTML_FS_cphone;      break;
                case EU_FAX:        pSubStr = sHTML_FS_fax;         break;
                case EU_EMAIL:      pSubStr = sHTML_FS_email;       break;
                case EU_STATE:      pSubStr = sHTML_FS_state;       break;
            }
            ASSERT( pSubStr, "ubekannter Subtyp fuer SwExtUserField" );
            bFixed = ((const SwExtUserField*)pFld)->IsFixed();
            break;

        case RES_AUTHORFLD:
            pTypeStr = sHTML_FT_author;
            switch( (SwAuthorFormat)nFmt & 0xff)
            {
                case AF_NAME:     pFmtStr = sHTML_FF_name;      break;
                case AF_SHORTCUT:  pFmtStr = sHTML_FF_shortcut; break;
            }
            ASSERT( pFmtStr, "ubekanntes Format fuer SwAuthorField" );
            bFixed = ((const SwAuthorField*)pFld)->IsFixed();
            break;

        case RES_DATETIMEFLD:
            pTypeStr = sHTML_FT_datetime;
            bNumFmt = TRUE;
            if( ((SwDateTimeField*)pFld)->IsFixed() )
            {
                bNumValue = TRUE;
                dNumValue = ((SwDateTimeField*)pFld)->GetValue();
            }
            break;

        case RES_PAGENUMBERFLD:
            {
                pTypeStr = sHTML_FT_page;
                SwPageNumSubType eSubType = (SwPageNumSubType)pFld->GetSubType();
                switch( eSubType )
                {
                    case PG_RANDOM:     pSubStr = sHTML_FS_random;      break;
                    case PG_NEXT:       pSubStr = sHTML_FS_next;        break;
                    case PG_PREV:       pSubStr = sHTML_FS_prev;        break;
                }
                ASSERT( pSubStr, "ubekannter Subtyp fuer SwPageNumberField" );
                pFmtStr = SwHTMLWriter::GetNumFormat( (SvxExtNumType)nFmt );

                if( (SvxExtNumType)nFmt==SVX_NUM_CHAR_SPECIAL )
                {
                    aValue = ((const SwPageNumberField *)pFld)->GetUserString();
                }
                else
                {
                    const String& rValue = pFld->GetPar2();
                    short nValue = (short)rValue.ToInt32();
                    if( (eSubType == PG_NEXT && nValue!=1) ||
                        (eSubType == PG_PREV && nValue!=-1) ||
                        (eSubType == PG_RANDOM && nValue!=0) )
                    {
                        aValue = rValue;
                    }
                }
            }
            break;
        case RES_DOCINFOFLD:
            {
                USHORT nSubType = pFld->GetSubType();
                pTypeStr = sHTML_FT_docinfo;
                USHORT nExtSubType = nSubType & 0x0f00;
                nSubType &= 0x00ff;

                switch( nSubType )
                {
                    case DI_TITEL:      pSubStr = sHTML_FS_title;   break;
                    case DI_THEMA:      pSubStr = sHTML_FS_theme;   break;
                    case DI_KEYS:       pSubStr = sHTML_FS_keys;    break;
                    case DI_COMMENT:    pSubStr = sHTML_FS_comment; break;
                    case DI_INFO1:      pSubStr = sHTML_FS_info1;   break;
                    case DI_INFO2:      pSubStr = sHTML_FS_info2;   break;
                    case DI_INFO3:      pSubStr = sHTML_FS_info3;   break;
                    case DI_INFO4:      pSubStr = sHTML_FS_info4;   break;
                    case DI_CREATE:     pSubStr = sHTML_FS_create;  break;
                    case DI_CHANGE:     pSubStr = sHTML_FS_change;  break;
                    default:            pTypeStr = 0;               break;
                }
                if( DI_CREATE == nSubType || DI_CHANGE == nSubType )
                {
                    switch( nExtSubType )
                    {
                        case DI_SUB_AUTHOR:
                            pFmtStr = sHTML_FF_author;
                            break;
                        case DI_SUB_TIME:
                            pFmtStr = sHTML_FF_time;
                            bNumFmt = TRUE;
                            break;
                        case DI_SUB_DATE:
                            pFmtStr = sHTML_FF_date;
                            bNumFmt = TRUE;
                            break;
                    }
                }
                bFixed = ((const SwDocInfoField*)pFld)->IsFixed();
                if( bNumFmt )
                {
                    if( bFixed )
                    {
                        // Fuer ein fixes Feld och den Num-Value ausgeben.
                        // Fixe Felder ohne Zahlenformate sollte es
                        // eigentlich nicht geben. ASSERT ist unten.
                        dNumValue = ((const SwDocInfoField*)pFld)->GetValue();
                        bNumValue = TRUE;
                    }
                    else if( !nFmt  )
                    {
                        // Nicht fixe Felder muessen kein Zahlenformat haben,
                        // wenn sie aus 4.0-Dokumenten stammen.
                        bNumFmt = FALSE;
                    }
                }
            }
            break;

        case RES_DOCSTATFLD:
            {
                pTypeStr = sHTML_FT_docstat;
                USHORT nSubType = pFld->GetSubType();
                switch( nSubType )
                {
                    case DS_PAGE:       pSubStr = sHTML_FS_page;    break;
                    case DS_PARA:       pSubStr = sHTML_FS_para;    break;
                    case DS_WORD:       pSubStr = sHTML_FS_word;    break;
                    case DS_CHAR:       pSubStr = sHTML_FS_char;    break;
                    case DS_TBL:        pSubStr = sHTML_FS_tbl;     break;
                    case DS_GRF:        pSubStr = sHTML_FS_grf;     break;
                    case DS_OLE:        pSubStr = sHTML_FS_ole;     break;
                    default:            pTypeStr = 0;               break;
                }
                pFmtStr = SwHTMLWriter::GetNumFormat( (SvxExtNumType)nFmt );
            }
            break;

        case RES_FILENAMEFLD:
            pTypeStr = sHTML_FT_filename;
            switch( (SwFileNameFormat)(nFmt & ~FF_FIXED) )
            {
                case FF_NAME:       pFmtStr = sHTML_FF_name;        break;
                case FF_PATHNAME:   pFmtStr = sHTML_FF_pathname;    break;
                case FF_PATH:       pFmtStr = sHTML_FF_path;        break;
                case FF_NAME_NOEXT: pFmtStr = sHTML_FF_name_noext;  break;
            }
            bFixed = ((const SwFileNameField*)pFld)->IsFixed();
            ASSERT( pFmtStr, "unbekanntes Format fuer SwFileNameField" );
            break;
    }

    // <SDFIELD>-Tag ausgeben
    if( pTypeStr )
    {
        ByteString sOut( '<' );
        ((((sOut += sHTML_sdfield) += ' ') += sHTML_O_type) += '=')
            += pTypeStr;
        if( pSubStr )
            (((sOut += ' ') += sHTML_O_subtype) += '=') += pSubStr;
        if( pFmtStr )
            (((sOut += ' ') += sHTML_O_format) += '=') += pFmtStr;
        if( aValue.Len() )
        {
            ((sOut += ' ') += sHTML_O_value) += "=\"";
            rWrt.Strm() << sOut.GetBuffer();
            HTMLOutFuncs::Out_String( rWrt.Strm(), aValue, rHTMLWrt.eDestEnc );
            sOut = '\"';
        }
        if( bNumFmt )
        {
            ASSERT( nFmt, "Zahlenformat ist 0" );
            sOut = HTMLOutFuncs::CreateTableDataOptionsValNum( sOut,
                        bNumValue, dNumValue, nFmt,
                        *rHTMLWrt.pDoc->GetNumberFormatter(),
                        rHTMLWrt.eDestEnc );

        }
        if( bFixed )
            (sOut += ' ') += sHTML_O_sdfixed;
        sOut += '>';
        rWrt.Strm() << sOut.GetBuffer();
    }

    // Inhalt des Feldes ausgeben
    HTMLOutFuncs::Out_String( rWrt.Strm(), pFld->Expand(),
                              rHTMLWrt.eDestEnc );

    // Off-Tag ausgeben
    if( pTypeStr )
        HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_sdfield, FALSE );

    return rWrt;
}


Writer& OutHTML_SwFmtFld( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwFmtFld & rFld = (SwFmtFld&)rHt;
    const SwField* pFld = rFld.GetFld();
    const SwFieldType* pFldTyp = pFld->GetTyp();

    if( RES_SETEXPFLD == pFldTyp->Which() &&
        (GSE_STRING & pFld->GetSubType()) )
    {
        int bOn = FALSE;
        if( pFldTyp->GetName().EqualsAscii("HTML_ON" ) )
            bOn = TRUE;
        else if( !pFldTyp->GetName().EqualsAscii( "HTML_OFF" ) )
            return rWrt;

        String rTxt( pFld->GetPar2() );
        rTxt.EraseLeadingChars().EraseTrailingChars();
        rWrt.Strm() << '<';
        if( !bOn )
            rWrt.Strm() << '/';
        // TODO: HTML-Tags are written without entitities, that for, characters
        // not contained in the destination encoding are lost!
        ByteString sTmp( rTxt, ((SwHTMLWriter&)rWrt).eDestEnc );
        rWrt.Strm() << sTmp.GetBuffer() << '>';
    }
    else if( RES_POSTITFLD == pFldTyp->Which() )
    {
        // Kommentare werden im ANSI-Zeichensetz, aber mit System-Zeilen-
        // Umbruechen gesschrieben.
        const String& rComment = pFld->GetPar2();
        BOOL bWritten = FALSE;

        if( rComment.Len() >= 6 && '<' == rComment.GetChar(0) &&
            '>' == rComment.GetChar(rComment.Len()-1) &&
            rComment.Copy( 1, 4 ).EqualsIgnoreCaseAscii(sHTML_meta) )
        {
            // META-Tags direkt ausgeben
            String sComment( rComment );
            sComment.ConvertLineEnd( GetSystemLineEnd() );
            // TODO: HTML-Tags are written without entitities, that for,
            // characters not contained in the destination encoding are lost!
            ByteString sTmp( sComment, ((SwHTMLWriter&)rWrt).eDestEnc );
            rWrt.Strm() << sTmp.GetBuffer();
            bWritten = TRUE;
        }
        else if( rComment.Len() >= 7 &&
                 '>' == rComment.GetChar(rComment.Len()-1) &&
                 rComment.Copy(0,5).EqualsIgnoreCaseAscii("HTML:") )
        {
            String sComment( rComment.Copy(5) );
            sComment.EraseLeadingChars();
            if( '<' == sComment.GetChar(0) )
            {
                sComment.ConvertLineEnd( GetSystemLineEnd() );
                // TODO: HTML-Tags are written without entitities, that for,
                // characters not contained in the destination encoding are
                // lost!
                ByteString sTmp( sComment, ((SwHTMLWriter&)rWrt).eDestEnc );
                rWrt.Strm() << sTmp.GetBuffer();
                bWritten = TRUE;
            }

        }

        if( !bWritten )
        {
            ByteString sOut( '<' );

            String sComment( rComment );
            sComment.ConvertLineEnd( GetSystemLineEnd() );
            // TODO: ???
            (((sOut += sHTML_comment) += ' ')
                += ByteString( sComment, ((SwHTMLWriter&)rWrt).eDestEnc ))
                += " -->";
            rWrt.Strm() << sOut.GetBuffer();
        }
    }
    else if( RES_SCRIPTFLD == pFldTyp->Which() )
    {
        SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
        if( rHTMLWrt.bLFPossible )
            rHTMLWrt.OutNewLine( TRUE );

        BOOL bURL = ((const SwScriptField *)pFld)->IsCodeURL();
        const String& rType = pFld->GetPar1();
        String aContents, aURL;
        if(bURL)
            aURL = pFld->GetPar2();
        else
            aContents = pFld->GetPar2();

        // sonst ist es der Script-Inhalt selbst. Da nur noh JavaScript
        // in Feldern landet, muss es sich um JavaSrript handeln ...:)
        HTMLOutFuncs::OutScript( rWrt.Strm(), aContents, rType, JAVASCRIPT,
                                 aURL, 0, 0, rHTMLWrt.eDestEnc );

        if( rHTMLWrt.bLFPossible )
            rHTMLWrt.OutNewLine( TRUE );
    }
    else
    {
        OutHTML_SwField( rWrt, pFld );
    }
    return rWrt;
}


/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/html/htmlfldw.cxx,v 1.1.1.1 2000-09-18 17:14:55 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.36  2000/09/18 16:04:44  willem.vandorp
      OpenOffice header added.

      Revision 1.35  2000/04/10 12:20:56  mib
      unicode

      Revision 1.34  2000/03/02 11:28:52  mib
      #73744#: state of ext user field

      Revision 1.33  1999/09/21 13:53:35  os
      SwExtUserSubType: language

      Revision 1.32  1999/09/21 09:48:54  mib
      multiple text encodings

      Revision 1.31  1998/11/20 10:53:36  MIB
      #59064#: Unbekannte Token/<NOSCRIPT> und <NOEMEBED> beibehalten


      Rev 1.30   20 Nov 1998 11:53:36   MIB
   #59064#: Unbekannte Token/<NOSCRIPT> und <NOEMEBED> beibehalten

      Rev 1.29   17 Nov 1998 10:44:38   OS
   #58263# NumType durch SvxExtNumType ersetzt

      Rev 1.28   03 Nov 1998 14:01:14   MIB
   #58427#: Fixe Filename-Felder

      Rev 1.27   02 Nov 1998 17:17:52   MIB
   #58480#: Fuss-/Endnoten

      Rev 1.26   08 Jul 1998 17:21:38   MIB
   StarScript

      Rev 1.25   26 Jun 1998 12:21:56   OM
   #51184# SubType an ExpressionFields richtig setzen und abfragen

      Rev 1.24   27 Mar 1998 09:33:44   MIB
   englisch ist besser

      Rev 1.23   25 Mar 1998 12:14:42   MIB
   Statistk-Feld

      Rev 1.22   05 Mar 1998 17:41:24   OS
   AF_SHORCUT->AF_SHORTCUT

      Rev 1.21   02 Mar 1998 09:48:58   MIB
   Fixe Author- und ExtUser-Felder

      Rev 1.20   25 Feb 1998 16:52:16   OM
   Includes

      Rev 1.19   25 Feb 1998 16:50:54   OM
   Fixe Author- und ExtUser-Felder

      Rev 1.18   20 Feb 1998 19:04:32   MA
   header

      Rev 1.17   20 Feb 1998 12:27:34   MIB
   SDFIELD-Token/String erst ab 382 aktiviert

      Rev 1.16   16 Feb 1998 12:28:50   MIB
   DokInfo-Feld jetzt auch fixed

      Rev 1.15   13 Feb 1998 19:18:34   MIB
   Feldumstelling Teil 1: Date/Time und nicht-fixe Dok-Info

      Rev 1.14   26 Nov 1997 19:09:24   MA
   includes

      Rev 1.13   21 Nov 1997 17:22:26   OM
   Feldbefehl-Umstellung: DocInfo

      Rev 1.12   03 Nov 1997 14:08:48   MA
   precomp entfernt

      Rev 1.11   15 Oct 1997 12:00:16   OM
   Feldumstellung

      Rev 1.10   29 Sep 1997 12:16:38   OM
   Feldumstellung

      Rev 1.9   24 Sep 1997 15:25:02   OM
   Feldumstellung

      Rev 1.8   15 Aug 1997 12:46:34   OS
   charatr/frmatr/txtatr aufgeteilt

      Rev 1.7   08 Jul 1997 14:06:20   MIB
   PostIts und Script-Felder aus 1. Absatz in Header exportieren

      Rev 1.6   26 Jun 1997 14:13:52   OM
   Feldbefehl Dateiname ohne Extension

      Rev 1.5   11 Jun 1997 11:40:48   OM
   Neue Datumsformate fuer Datums-Feldbefehl

      Rev 1.4   05 Jun 1997 09:13:42   OS
   ternaeren Ausdruck aufgeloest

      Rev 1.3   22 May 1997 11:04:22   MIB
   URL-Flag am Script-Feld

      Rev 1.2   24 Mar 1997 17:42:44   MIB
   fix: Kommentare uncodiert exportieren, opt: OutBasic aus goodies nutzen

      Rev 1.1   17 Feb 1997 12:37:22   MIB
   FileName-Feld im- und exportieren

      Rev 1.0   07 Feb 1997 18:00:40   MIB
   manche Felder als SDFIELD exportieren

 -------------------------------------------------------------------------*/

diff --git a/sw/source/filter/html/htmlfly.cxx b/sw/source/filter/html/htmlfly.cxx
new file mode 100644
index 0000000..159630f
--- /dev/null
+++ b/sw/source/filter/html/htmlfly.cxx
@@ -0,0 +1,2008 @@
/*************************************************************************
 *
 *  $RCSfile: htmlfly.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:55 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/


#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#define ITEMID_BOXINFO      SID_ATTR_BORDER_INNER
#include "hintids.hxx"

#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif
#ifndef SVTOOLS_URIHELPER_HXX
#include <svtools/urihelper.hxx>
#endif
#ifndef _URLOBJ_HXX //autogen
#include <tools/urlobj.hxx>
#endif

#ifndef _APP_HXX
#include <vcl/svapp.hxx>
#endif
#ifndef _WRKWIN_HXX //autogen
#include <vcl/wrkwin.hxx>
#endif

#ifndef _HTMLKYWD_HXX
#include <svtools/htmlkywd.hxx>
#endif
#ifndef _HTMLOUT_HXX //autogen
#include <svtools/htmlout.hxx>
#endif
#ifndef _IMAP_HXX //autogen
#include <svtools/imap.hxx>
#endif
#ifndef _GOODIES_IMAPOBJ_HXX
#include <svtools/imapobj.hxx>
#endif

#ifndef _XOUTBMP_HXX //autogen
#include <svx/xoutbmp.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif


#ifndef _FMTANCHR_HXX //autogen
#include <fmtanchr.hxx>
#endif
#ifndef _FMTORNT_HXX //autogen
#include <fmtornt.hxx>
#endif
#ifndef _FMTURL_HXX //autogen
#include <fmturl.hxx>
#endif
#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _FMTCLDS_HXX //autogen
#include <fmtclds.hxx>
#endif
#ifndef _FMTCNTNT_HXX //autogen
#include <fmtcntnt.hxx>
#endif
#ifndef _FMTSRND_HXX //autogen
#include <fmtsrnd.hxx>
#endif
#ifndef _FMTINFMT_HXX //autogen
#include <fmtinfmt.hxx>
#endif
#ifndef _TXTINET_HXX //autogen
#include <txtinet.hxx>
#endif
#ifndef _FRMATR_HXX
#include "frmatr.hxx"
#endif
#ifndef _GRFATR_HXX //autogen
#include <grfatr.hxx>
#endif
#ifndef _FLYPOS_HXX //autogen
#include <flypos.hxx>
#endif

#ifndef _DOCARY_HXX //autogen
#include <docary.hxx>
#endif

#ifndef _NDGRF_HXX //autogen
#include <ndgrf.hxx>
#endif

#include "doc.hxx"
#include "ndtxt.hxx"
#include "pam.hxx"
#include "swerror.h"
#include "frmfmt.hxx"
#include "wrthtml.hxx"
#include "css1kywd.hxx"
#include "htmlfly.hxx"

const ULONG HTML_FRMOPTS_IMG_ALL        =
    HTML_FRMOPT_ALT |
    HTML_FRMOPT_SIZE |
    HTML_FRMOPT_ANYSIZE |
    HTML_FRMOPT_BORDER |
    HTML_FRMOPT_NAME;
const ULONG HTML_FRMOPTS_IMG_CNTNR      =
    HTML_FRMOPTS_IMG_ALL |
    HTML_FRMOPT_ABSSIZE;
const ULONG HTML_FRMOPTS_IMG            =
    HTML_FRMOPTS_IMG_ALL |
    HTML_FRMOPT_ALIGN |
    HTML_FRMOPT_SPACE |
    HTML_FRMOPT_BRCLEAR;
const ULONG HTML_FRMOPTS_IMG_CSS1       =
    HTML_FRMOPT_S_ALIGN |
    HTML_FRMOPT_S_SPACE;

const ULONG HTML_FRMOPTS_DIV            =
    HTML_FRMOPT_ID |
    HTML_FRMOPT_S_ALIGN |
    HTML_FRMOPT_S_SIZE |
    HTML_FRMOPT_ANYSIZE |
    HTML_FRMOPT_ABSSIZE |
    HTML_FRMOPT_S_SPACE |
    HTML_FRMOPT_S_BORDER |
    HTML_FRMOPT_S_BACKGROUND |
    HTML_FRMOPT_BRCLEAR;

const ULONG HTML_FRMOPTS_MULTICOL       =
    HTML_FRMOPT_ID |
    HTML_FRMOPT_WIDTH |
    HTML_FRMOPT_ANYSIZE |
    HTML_FRMOPT_ABSSIZE;
const ULONG HTML_FRMOPTS_MULTICOL_CNTNR =
    HTML_FRMOPTS_MULTICOL;
const ULONG HTML_FRMOPTS_MULTICOL_CSS1  =
    HTML_FRMOPT_S_ALIGN |
    HTML_FRMOPT_S_SIZE |
    HTML_FRMOPT_S_SPACE |
    HTML_FRMOPT_S_BORDER|
    HTML_FRMOPT_S_BACKGROUND;

const ULONG HTML_FRMOPTS_SPACER         =
    HTML_FRMOPT_ALIGN |
    HTML_FRMOPT_SIZE |
    HTML_FRMOPT_ANYSIZE |
    HTML_FRMOPT_BRCLEAR |
    HTML_FRMOPT_MARGINSIZE |
    HTML_FRMOPT_ABSSIZE;

const ULONG HTML_FRMOPTS_CNTNR          =
    HTML_FRMOPT_S_ALIGN |
    HTML_FRMOPT_S_SPACE |
    HTML_FRMOPT_S_WIDTH |
    HTML_FRMOPT_ANYSIZE |
    HTML_FRMOPT_ABSSIZE |
    HTML_FRMOPT_S_PIXSIZE;


static Writer& OutHTML_FrmFmtTableNode( Writer& rWrt, const SwFrmFmt& rFrmFmt );
static Writer& OutHTML_FrmFmtAsMulticol( Writer& rWrt, const SwFrmFmt& rFmt,
                                         BOOL bInCntnr );
static Writer& OutHTML_FrmFmtAsSpacer( Writer& rWrt, const SwFrmFmt& rFmt );
static Writer& OutHTML_FrmFmtAsDivOrSpan( Writer& rWrt,
                                          const SwFrmFmt& rFrmFmt, BOOL bSpan );
static Writer& OutHTML_FrmFmtAsImage( Writer& rWrt, const SwFrmFmt& rFmt,
                                      BOOL bInCntnr );

static Writer& OutHTML_FrmFmtGrfNode( Writer& rWrt, const SwFrmFmt& rFmt,
                                      BOOL bInCntnr );

static Writer& OutHTML_FrmFmtAsMarquee( Writer& rWrt, const SwFrmFmt& rFrmFmt,
                                        const SdrObject& rSdrObj    );
//-----------------------------------------------------------------------

extern HTMLOutEvent __FAR_DATA aAnchorEventTable[];

static HTMLOutEvent __FAR_DATA aImageEventTable[] =
{
    { sHTML_O_SDonload,         sHTML_O_onload,     SVX_EVENT_IMAGE_LOAD        },
    { sHTML_O_SDonabort,        sHTML_O_onabort,    SVX_EVENT_IMAGE_ABORT       },
    { sHTML_O_SDonerror,        sHTML_O_onerror,    SVX_EVENT_IMAGE_ERROR       },
    { 0,                        0,                  0                       }
};

static HTMLOutEvent __FAR_DATA aIMapEventTable[] =
{
    { sHTML_O_SDonmouseover,    sHTML_O_onmouseover,    SFX_EVENT_MOUSEOVER_OBJECT  },
    { sHTML_O_SDonmouseout,     sHTML_O_onmouseout,     SFX_EVENT_MOUSEOUT_OBJECT   },
    { 0,                        0,                      0                           }
};



SV_IMPL_OP_PTRARR_SORT( SwHTMLPosFlyFrms, SwHTMLPosFlyFrmPtr )

USHORT SwHTMLWriter::GuessFrmType( const SwFrmFmt& rFrmFmt,
                                   const SdrObject*& rpSdrObj )
{
    SwHTMLFrmType eType;

    if( RES_DRAWFRMFMT == rFrmFmt.Which() )
    {
        // Als Default irgendein Zeichen-Objekt
        eType = HTML_FRMTYPE_DRAW;

        const SdrObject *pObj =
            SwHTMLWriter::GetMarqueeTextObj( (const SwDrawFrmFmt &)rFrmFmt );
        if( pObj )
        {
            // Laufschrift
            rpSdrObj = pObj;
            eType = HTML_FRMTYPE_MARQUEE;
        }
        else
        {
            pObj = GetHTMLControl( (const SwDrawFrmFmt &)rFrmFmt );

            if( pObj )
            {
                // Form-Control
                rpSdrObj = pObj;
                eType = HTML_FRMTYPE_CONTROL;
            }
        }
    }
    else
    {
        // Als Default ein Textrahmen
        eType = HTML_FRMTYPE_TEXT;

        const SwFmtCntnt& rFlyCntnt = rFrmFmt.GetCntnt();
        ULONG nStt = rFlyCntnt.GetCntntIdx()->GetIndex()+1;
        const SwNode* pNd = pDoc->GetNodes()[ nStt ];

        if( pNd->IsGrfNode() )
        {
            // Grafik - Node
            eType = HTML_FRMTYPE_GRF;
        }
        else if( pNd->IsOLENode() )
        {
            // Applet, Plugin, Floating-Frame
            eType = (SwHTMLFrmType)GuessOLENodeFrmType( *pNd );
        }
        else
        {
            ULONG nEnd = pDoc->GetNodes()[nStt-1]->EndOfSectionIndex();

            const SfxPoolItem* pItem;
            const SfxItemSet& rItemSet = rFrmFmt.GetAttrSet();
            if( SFX_ITEM_SET == rItemSet.GetItemState( RES_COL,
                                                       TRUE, &pItem ) &&
                ((const SwFmtCol *)pItem)->GetNumCols() > 1 )
            {
                // spaltiger Rahmen
                eType = HTML_FRMTYPE_MULTICOL;
            }
            else if( pNd->IsTableNode() )
            {
                const SwTableNode *pTblNd = pNd->GetTableNode();
                ULONG nTblEnd = pTblNd->EndOfSectionIndex();

                if( nTblEnd+1 == nEnd )
                {
                    // Tabelle
                    eType = HTML_FRMTYPE_TABLE;
                }
                else if( nTblEnd+2 == nEnd )
                {
                    // Tabelle mit Unterschrft
                    eType = HTML_FRMTYPE_TABLE_CAP;
                }
            }
            else if( pNd->IsTxtNode() )
            {
                const SwTxtNode *pTxtNd = pNd->GetTxtNode();

                BOOL bEmpty = FALSE;
                if( nStt==nEnd-1 && !pTxtNd->Len() )
                {
                    // leerer Rahmen? Nur wenn kein Rahmen am
                    // Text- oder Start-Node verankert ist.
                    bEmpty = TRUE;
                    if( pHTMLPosFlyFrms )
                    {
                        for( USHORT i=0; i<pHTMLPosFlyFrms->Count(); i++ )
                        {
                            ULONG nIdx = (*pHTMLPosFlyFrms)[i]
                                                ->GetNdIndex().GetIndex();
                            bEmpty = (nIdx != nStt) && (nIdx != nStt-1);
                            if( !bEmpty || nIdx > nStt )
                                break;
                        }
                    }
                }
                if( bEmpty )
                {
                    // leerer Rahmen
                    eType = HTML_FRMTYPE_EMPTY;
                }
                else if( pDoc->GetNodes()[nStt+1]->IsTableNode() )
                {
                    const SwTableNode *pTblNd =
                        pDoc->GetNodes()[nStt+1]->GetTableNode();
                    if( pTblNd->EndOfSectionIndex()+1 == nEnd )
                    {
                        // Tabelle mit Ueberschrift
                        eType = HTML_FRMTYPE_TABLE_CAP;
                    }
                }
            }
        }
    }

    return eType;
}

void SwHTMLWriter::CollectFlyFrms()
{
    BYTE nSz = (BYTE)Min( pDoc->GetSpzFrmFmts()->Count(), USHORT(255) );
    SwPosFlyFrms aFlyPos( nSz, nSz );
    pDoc->GetAllFlyFmts( aFlyPos, bWriteAll ? 0 : pCurPam, TRUE );

    for( USHORT i=0; i< aFlyPos.Count(); i++ )
    {
        const SwFrmFmt& rFrmFmt = aFlyPos[i]->GetFmt();
        const SdrObject *pSdrObj = 0;
        const SwPosition *pAPos;
        const SwCntntNode *pACNd;
        SwHTMLFrmType eType = (SwHTMLFrmType)GuessFrmType( rFrmFmt, pSdrObj );

        BYTE nMode;
        const SwFmtAnchor& rAnchor = rFrmFmt.GetAnchor();
        SwRelationOrient eHoriRel = rFrmFmt.GetHoriOrient().GetRelationOrient();
        switch( rAnchor.GetAnchorId() )
        {
        case FLY_PAGE:
        case FLY_AT_FLY:
            nMode = aHTMLOutFrmPageFlyTable[eType][nExportMode];
            break;

        case FLY_AT_CNTNT:
            // Absatz-gebundene Rahmen werden nur dann vor den
            // Absatz geschrieben, wenn der Absatz einen Abstand
            // hat.
            if( FRAME == eHoriRel &&
                (pAPos = rAnchor.GetCntntAnchor()) != 0 &&
                (pACNd = pAPos->nNode.GetNode().GetCntntNode()) != 0 )
            {
                const SvxLRSpaceItem& rLRItem =
                    (const SvxLRSpaceItem&)pACNd->GetAttr(RES_LR_SPACE);
                if( rLRItem.GetTxtLeft() || rLRItem.GetRight() )
                {
                    nMode = aHTMLOutFrmParaFrameTable[eType][nExportMode];
                    break;
                }
            }
            nMode = aHTMLOutFrmParaPrtAreaTable[eType][nExportMode];
            break;

        case FLY_AUTO_CNTNT:
            if( FRAME == eHoriRel || PRTAREA == eHoriRel )
                nMode = aHTMLOutFrmParaPrtAreaTable[eType][nExportMode];
            else
                nMode = aHTMLOutFrmParaOtherTable[eType][nExportMode];
            break;

        default:
            nMode = aHTMLOutFrmParaPrtAreaTable[eType][nExportMode];
            break;
        }

        if( !pHTMLPosFlyFrms )
            pHTMLPosFlyFrms = new SwHTMLPosFlyFrms;

        SwHTMLPosFlyFrm *pNew =
            new SwHTMLPosFlyFrm( *aFlyPos[i], pSdrObj, nMode );
        pHTMLPosFlyFrms->Insert( pNew );
    }
}

BOOL SwHTMLWriter::OutFlyFrm( ULONG nNdIdx, xub_StrLen nCntntIdx, BYTE nPos )
{
    BOOL bFlysLeft = FALSE; // Noch Flys an aktueller Node-Position da?

    // OutFlyFrm kan rekursiv aufgerufen werden. Deshalb muss man
    // manchmal wieder von vorne anfangen, nachdem ein Fly ausgegeben
    // wurde.
    BOOL bRestart = TRUE;
    while( pHTMLPosFlyFrms && bRestart )
    {
        bFlysLeft = bRestart = FALSE;

        // suche nach dem Anfang der FlyFrames
        for( USHORT i=0; i<pHTMLPosFlyFrms->Count() &&
            (*pHTMLPosFlyFrms)[i]->GetNdIndex().GetIndex() < nNdIdx; i++ )
            ;
        for( ; !bRestart && i < pHTMLPosFlyFrms->Count() &&
            (*pHTMLPosFlyFrms)[i]->GetNdIndex().GetIndex() == nNdIdx; i++ )
        {
            SwHTMLPosFlyFrm *pPosFly = (*pHTMLPosFlyFrms)[i];
            if( ( HTML_POS_ANY == nPos ||
                  pPosFly->GetOutPos() == nPos ) &&
                pPosFly->GetCntntIndex() == nCntntIdx )
            {
                // Erst entfernen ist wichtig, weil in tieferen
                // Rekursionen evtl. weitere Eintraege oder das
                // ganze Array geloscht werden koennte.
                pHTMLPosFlyFrms->Remove( i, 1 );
                i--;
                if( !pHTMLPosFlyFrms->Count() )
                {
                    delete pHTMLPosFlyFrms;
                    pHTMLPosFlyFrms = 0;
                    bRestart = TRUE;    // nicht wirklich, nur raus
                                        // aus der Schleife
                }

                OutFrmFmt( pPosFly->GetOutMode(), pPosFly->GetFmt(),
                           pPosFly->GetSdrObject() );
                switch( pPosFly->GetOutFn() )
                {
                case HTML_OUT_DIV:
                case HTML_OUT_SPAN:
                case HTML_OUT_MULTICOL:
                case HTML_OUT_TBLNODE:
                    bRestart = TRUE; // Hier wird's evtl rekursiv
                    break;
                }
                delete pPosFly;
            }
            else
            {
                bFlysLeft = TRUE;
            }
        }
    }

    return bFlysLeft;
}

void SwHTMLWriter::OutFrmFmt( BYTE nMode, const SwFrmFmt& rFrmFmt,
                              const SdrObject *pSdrObject )
{
    BYTE nCntnrMode = SwHTMLPosFlyFrm::GetOutCntnr( nMode );
    BYTE nOutMode = SwHTMLPosFlyFrm::GetOutFn(nMode);
    const sal_Char *pCntnrStr = 0;
    if( HTML_CNTNR_NONE != nCntnrMode )
    {

        if( bLFPossible && HTML_CNTNR_DIV == nCntnrMode )
            OutNewLine();

        ByteString sOut( '<' );
        pCntnrStr = (HTML_CNTNR_DIV == nCntnrMode)
                            ? sHTML_division
                            : sHTML_span;
        sOut += pCntnrStr;
        ((((sOut += ' ') += sHTML_O_class) += "=\"")
            += sCSS1_class_abs_pos) += '\"';
        Strm() << sOut.GetBuffer();

        // Fuer Nicht-Zeichenobekte eine Breite ausgeben
        ULONG nFrmFlags = HTML_FRMOPTS_CNTNR;

        // Fuer spaltige Rahmen koennen wir auch noch den Hintergrund ausgeben.
        if( HTML_OUT_MULTICOL == nOutMode )
            nFrmFlags |= HTML_FRMOPT_S_BACKGROUND|HTML_FRMOPT_S_BORDER;

        if( IsHTMLMode( HTMLMODE_BORDER_NONE ) )
           nFrmFlags |= HTML_FRMOPT_S_NOBORDER;
        OutCSS1_FrmFmtOptions( rFrmFmt, nFrmFlags, pSdrObject );
        Strm() << '>';

        if( HTML_CNTNR_DIV == nCntnrMode )
        {
            IncIndentLevel();
            bLFPossible = TRUE;
        }
    }

    switch( nOutMode )
    {
    case HTML_OUT_TBLNODE:      // OK
        ASSERT( !pCntnrStr, "Table: Container ist hier nicht vorgesehen" );
        OutHTML_FrmFmtTableNode( *this, rFrmFmt );
        break;
    case HTML_OUT_GRFNODE:      // OK
        OutHTML_FrmFmtGrfNode( *this, rFrmFmt, pCntnrStr != 0 );
        break;
    case HTML_OUT_OLENODE:      // OK
        OutHTML_FrmFmtOLENode( *this, rFrmFmt, pCntnrStr != 0 );
        break;
    case HTML_OUT_OLEGRF:       // OK
        OutHTML_FrmFmtOLENodeGrf( *this, rFrmFmt, pCntnrStr != 0 );
        break;
    case HTML_OUT_DIV:
    case HTML_OUT_SPAN:
        ASSERT( !pCntnrStr, "Div: Container ist hier nicht vorgesehen" );
        OutHTML_FrmFmtAsDivOrSpan( *this, rFrmFmt, HTML_OUT_SPAN==nOutMode );
        break;
    case HTML_OUT_MULTICOL:     // OK
        OutHTML_FrmFmtAsMulticol( *this, rFrmFmt, pCntnrStr != 0 );
        break;
    case HTML_OUT_SPACER:       // OK
        ASSERT( !pCntnrStr, "Spacer: Container ist hier nicht vorgesehen" );
        OutHTML_FrmFmtAsSpacer( *this, rFrmFmt );
        break;
    case HTML_OUT_CONTROL:      // OK
        OutHTML_DrawFrmFmtAsControl( *this,
                                    (const SwDrawFrmFmt &)rFrmFmt, *pSdrObject,
                                    pCntnrStr != 0 );
        break;
    case HTML_OUT_AMARQUEE:
        OutHTML_FrmFmtAsMarquee( *this, rFrmFmt, *pSdrObject );
        break;
    case HTML_OUT_MARQUEE:
        ASSERT( !pCntnrStr, "Marquee: Container ist hier nicht vorgesehen" );
        OutHTML_DrawFrmFmtAsMarquee( *this,
                    (const SwDrawFrmFmt &)rFrmFmt, *pSdrObject );
        break;
    case HTML_OUT_GRFFRM:
        OutHTML_FrmFmtAsImage( *this, rFrmFmt, pCntnrStr != 0 );
        break;
    }

    if( HTML_CNTNR_DIV == nCntnrMode )
    {
        DecIndentLevel();
        if( bLFPossible )
            OutNewLine();
        HTMLOutFuncs::Out_AsciiTag( Strm(), sHTML_division, FALSE );
        bLFPossible = TRUE;
    }
    else if( HTML_CNTNR_SPAN == nCntnrMode )
        HTMLOutFuncs::Out_AsciiTag( Strm(), sHTML_span, FALSE );
}


void SwHTMLWriter::OutFrmFmtOptions( const SwFrmFmt &rFrmFmt,
                                     const String& rAlternateTxt,
                                     ByteString &rEndTags,
                                     ULONG nFrmOpts )
{
    ByteString sOut;
    const SfxPoolItem* pItem;
    const SfxItemSet& rItemSet = rFrmFmt.GetAttrSet();

    // Name
    if( (nFrmOpts & (HTML_FRMOPT_ID|HTML_FRMOPT_NAME)) &&
        rFrmFmt.GetName().Len() )
    {
        const sal_Char *pStr =
            (nFrmOpts & HTML_FRMOPT_ID) ? sHTML_O_id : sHTML_O_name;
        ((sOut += ' ') += pStr) += "=\"";
        Strm() << sOut.GetBuffer();
        HTMLOutFuncs::Out_String( Strm(), rFrmFmt.GetName(), eDestEnc );
        sOut = '\"';
    }

    // ALT
    if( (nFrmOpts & HTML_FRMOPT_ALT) && rAlternateTxt.Len() )
    {
        ((sOut += ' ') += sHTML_O_alt) += "=\"";
        Strm() << sOut.GetBuffer();
        HTMLOutFuncs::Out_String( Strm(), rAlternateTxt, eDestEnc );
        sOut = '\"';
    }

    // ALIGN
    const sal_Char *pStr = 0;
    RndStdIds eAnchorId = rFrmFmt.GetAnchor().GetAnchorId();
    if( (nFrmOpts & HTML_FRMOPT_ALIGN) &&
        (FLY_AT_CNTNT == eAnchorId || FLY_AUTO_CNTNT == eAnchorId) )
    {
        // MIB 12.3.98: Ist es nicht schlauer, absatzgebundene
        // Rahmen notfalls links auszurichten als sie
        // zeichengebunden einzufuegen???
        const SwFmtHoriOrient& rHoriOri = rFrmFmt.GetHoriOrient();
        if( !(nFrmOpts & HTML_FRMOPT_S_ALIGN) ||
            FRAME == rHoriOri.GetRelationOrient() ||
            PRTAREA == rHoriOri.GetRelationOrient() )
        {
            pStr = HORI_RIGHT == rHoriOri.GetHoriOrient()
                        ? sHTML_AL_right
                        : sHTML_AL_left;
        }
    }
    if( (nFrmOpts & HTML_FRMOPT_ALIGN) && !pStr &&
        ( (nFrmOpts & HTML_FRMOPT_S_ALIGN) == 0 ||
          FLY_IN_CNTNT == eAnchorId ) &&
        SFX_ITEM_SET == rItemSet.GetItemState( RES_VERT_ORIENT, TRUE, &pItem ))
    {
        switch( ((SwFmtVertOrient*)pItem)->GetVertOrient() )
        {
        case VERT_LINE_TOP:     pStr = sHTML_VA_top;        break;
        case VERT_CHAR_TOP:
        case VERT_BOTTOM:       pStr = sHTML_VA_texttop;    break;  // geht nicht
        case VERT_LINE_CENTER:
        case VERT_CHAR_CENTER:  pStr = sHTML_VA_absmiddle;  break;  // geht nicht
        case VERT_CENTER:       pStr = sHTML_VA_middle;     break;
        case VERT_LINE_BOTTOM:
        case VERT_CHAR_BOTTOM:  pStr = sHTML_VA_absbottom;  break;  // geht nicht
        case VERT_TOP:          pStr = sHTML_VA_bottom;     break;
        }
    }
    if( pStr )
        (((sOut += ' ') += sHTML_O_align) += '=') += pStr;


    // HSPACE und VSPACE
    Size aTwipSpc( 0, 0 );
    if( (nFrmOpts & (HTML_FRMOPT_SPACE|HTML_FRMOPT_MARGINSIZE)) &&
        SFX_ITEM_SET == rItemSet.GetItemState( RES_LR_SPACE, TRUE, &pItem ))
    {
        aTwipSpc.Width() =
            ( ((SvxLRSpaceItem*)pItem)->GetLeft() +
                ((SvxLRSpaceItem*)pItem)->GetRight() ) / 2;
        nDfltLeftMargin = nDfltRightMargin = (USHORT)aTwipSpc.Width();
    }
    if( (nFrmOpts & (HTML_FRMOPT_SPACE|HTML_FRMOPT_MARGINSIZE)) &&
        SFX_ITEM_SET == rItemSet.GetItemState( RES_UL_SPACE, TRUE, &pItem ))
    {
        aTwipSpc.Height()  =
            ( ((SvxULSpaceItem*)pItem)->GetUpper() +
                ((SvxULSpaceItem*)pItem)->GetLower() ) / 2;
        nDfltTopMargin = nDfltBottomMargin = (USHORT)aTwipSpc.Height();
    }

    if( (nFrmOpts & HTML_FRMOPT_SPACE) &&
        (aTwipSpc.Width() || aTwipSpc.Height()) &&
        Application::GetDefaultDevice() )
    {
        Size aPixelSpc =
            Application::GetDefaultDevice()->LogicToPixel( aTwipSpc,
                                                MapMode(MAP_TWIP) );
        if( !aPixelSpc.Width() && aTwipSpc.Width() )
            aPixelSpc.Width() = 1;
        if( !aPixelSpc.Height() && aTwipSpc.Height() )
            aPixelSpc.Height() = 1;

        if( aPixelSpc.Width() )
        {
            (((sOut += ' ') += sHTML_O_hspace) += '=')
                += ByteString::CreateFromInt32( aPixelSpc.Width() );
        }

        if( aPixelSpc.Height() )
        {
            (((sOut += ' ') += sHTML_O_vspace) += '=')
                += ByteString::CreateFromInt32( aPixelSpc.Height() );
        }
    }

    // Der Abstand muss bei der Groesse beruecksichtigt, wenn das entsprechende
    // Flag gesetzt ist.
    if( (nFrmOpts & HTML_FRMOPT_MARGINSIZE) )
    {
        aTwipSpc.Width() *= -2;
        aTwipSpc.Height() *= -2;
    }
    else
    {
        aTwipSpc.Width() = 0;
        aTwipSpc.Height() = 0;
    }

    if( !(nFrmOpts & HTML_FRMOPT_ABSSIZE) &&
        SFX_ITEM_SET == rItemSet.GetItemState( RES_BOX, TRUE, &pItem ))
    {
        const SvxBoxItem* pBoxItem = (const SvxBoxItem*)pItem;

        aTwipSpc.Width() += pBoxItem->CalcLineSpace( BOX_LINE_LEFT );
        aTwipSpc.Width() += pBoxItem->CalcLineSpace( BOX_LINE_RIGHT );
        aTwipSpc.Height() += pBoxItem->CalcLineSpace( BOX_LINE_TOP );
        aTwipSpc.Height() += pBoxItem->CalcLineSpace( BOX_LINE_BOTTOM );
    }

    // WIDTH und/oder HEIGHT
    // ATT_VAR_SIZE/ATT_MIN_SIZE nur ausgeben, wenn ANYSIZE gesezut ist
    if( (nFrmOpts & HTML_FRMOPT_SIZE) &&
        SFX_ITEM_SET == rItemSet.GetItemState( RES_FRM_SIZE, TRUE, &pItem ) &&
        ( (nFrmOpts & HTML_FRMOPT_ANYSIZE) ||
          ATT_FIX_SIZE == ((const SwFmtFrmSize *)pItem)->GetSizeType()) )
    {
        const SwFmtFrmSize *pFSItem = (const SwFmtFrmSize *)pItem;
        BYTE nPrcWidth = pFSItem->GetWidthPercent();
        BYTE nPrcHeight = pFSItem->GetHeightPercent();

        // Groesse des Objekts Twips ohne Raender
        Size aTwipSz( (nPrcWidth ? 0
                                 : pFSItem->GetWidth()-aTwipSpc.Width()),
                      (nPrcHeight ? 0
                                  : pFSItem->GetHeight()-aTwipSpc.Height()) );

        ASSERT( aTwipSz.Width() >= 0 && aTwipSz.Height() >= 0,
                "Rahmengroesse minus Abstand < 0!!!???" );
        if( aTwipSz.Width() < 0 )
            aTwipSz.Width() = 0;
        if( aTwipSz.Height() < 0 )
            aTwipSz.Height() = 0;

        Size aPixelSz( 0, 0 );
        if( (aTwipSz.Width() || aTwipSz.Height()) &&
            Application::GetDefaultDevice() )
        {
            aPixelSz =
                Application::GetDefaultDevice()->LogicToPixel( aTwipSz,
                                                    MapMode(MAP_TWIP) );
            if( !aPixelSz.Width() && aTwipSz.Width() )
                aPixelSz.Width() = 1;
            if( !aPixelSz.Height() && aTwipSz.Height() )
                aPixelSz.Height() = 1;
        }

        if( (nFrmOpts & HTML_FRMOPT_WIDTH) &&
            ((nPrcWidth && nPrcWidth!=255) || aPixelSz.Width()) )
        {
            ((sOut += ' ') += sHTML_O_width) += '=';
            if( nPrcWidth )
                (sOut += ByteString::CreateFromInt32( nPrcWidth )) += '%';
            else
                sOut += ByteString::CreateFromInt32( aPixelSz.Width() );
        }

        if( (nFrmOpts & HTML_FRMOPT_HEIGHT) &&
            ((nPrcHeight && nPrcHeight!=255) || aPixelSz.Height()) )
        {
            ((sOut += ' ') += sHTML_O_height) += '=';
            if( nPrcHeight )
                (sOut += ByteString::CreateFromInt32( nPrcHeight )) += '%';
            else
                sOut += ByteString::CreateFromInt32( aPixelSz.Height() );
        }
    }

    if( sOut.Len() )
        Strm() << sOut.GetBuffer();

    // Umlauf fuer absatzgeb. Grafiken als <BR CLEAR=...> in den String
    // schreiben
    if( (nFrmOpts & HTML_FRMOPT_BRCLEAR) &&
        (FLY_AT_CNTNT== rFrmFmt.GetAnchor().GetAnchorId() ||
         FLY_AUTO_CNTNT== rFrmFmt.GetAnchor().GetAnchorId()) &&
        SFX_ITEM_SET == rItemSet.GetItemState( RES_SURROUND, TRUE, &pItem ))
    {
        const SwFmtSurround* pSurround = (const SwFmtSurround*)pItem;
        SwHoriOrient eHoriOri = rFrmFmt.GetHoriOrient().GetHoriOrient();
        pStr = 0;
        SwSurround eSurround = pSurround->GetSurround();
        BOOL bAnchorOnly = pSurround->IsAnchorOnly();
        switch( eHoriOri )
        {
        case HORI_RIGHT:
            {
                switch( eSurround )
                {
                case SURROUND_NONE:
                case SURROUND_RIGHT:
                    pStr = sHTML_AL_right;
                    break;
                case SURROUND_LEFT:
                case SURROUND_PARALLEL:
                    if( bAnchorOnly )
                        bClearRight = TRUE;
                    break;
                }
            }
            break;

        default:
            // #67508#: If a frame is centered, it gets left aligned. This
            // should be taken into account here, too.
            {
                switch( eSurround )
                {
                case SURROUND_NONE:
                case SURROUND_LEFT:
                    pStr = sHTML_AL_left;
                    break;
                case SURROUND_RIGHT:
                case SURROUND_PARALLEL:
                    if( bAnchorOnly )
                        bClearLeft = TRUE;
                    break;
                }
            }
            break;

        }

        if( pStr )
        {
            (((((((sOut = '<') += sHTML_linebreak) += ' ')
                += sHTML_O_clear) += '=') += pStr) += '>') += rEndTags;
            rEndTags = sOut;
        }
    }
}


Writer& OutHTML_Image( Writer& rWrt, const SwFrmFmt &rFrmFmt,
                       const String &rGrfName, const String& rAlternateTxt,
                       const Size &rRealSize, ULONG nFrmOpts,
                       const sal_Char *pMarkType,
                       const ImageMap *pAltImgMap )
{
    SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;

    // ggf. ein noch offenes Attribut voruebergehend beenden
    if( rHTMLWrt.aINetFmts.Count() )
    {
        SwFmtINetFmt *pINetFmt =
            rHTMLWrt.aINetFmts[ rHTMLWrt.aINetFmts.Count()-1 ];
        OutHTML_INetFmt( rWrt, *pINetFmt, FALSE );
    }

    String aGrfNm( rGrfName );
    if( !HTMLOutFuncs::PrivateURLToInternalImg(aGrfNm) )
        aGrfNm = INetURLObject::AbsToRel( aGrfNm, INetURLObject::WAS_ENCODED,
                                        INetURLObject::DECODE_WITH_CHARSET );

    const SfxPoolItem* pItem;
    const SfxItemSet& rItemSet = rFrmFmt.GetAttrSet();

    const SwFmtURL *pURLItem = 0;

    // das URL-Attribut nur beruecksichtigen, wenn keine Image-Map
    // uebergeben wurde
    if( !pAltImgMap &&
        SFX_ITEM_SET == rItemSet.GetItemState( RES_URL, TRUE, &pItem ))
    {
        pURLItem = (const SwFmtURL *)pItem;
    }

    // Image-Map rausschreiben
    const ImageMap *pIMap = pAltImgMap;
    if( !pIMap && pURLItem )
    {
        pIMap = pURLItem->GetMap();
    }

    String aIMapName;
    if( pIMap )
    {
        // den Namen eindeutig machen
        aIMapName = pIMap->GetName();
        String aNameBase;
        if( aIMapName.Len() )
            aNameBase = aIMapName;
        else
            aNameBase.AssignAscii( sHTML_map );
        if( !aIMapName.Len() )
            (aIMapName = aNameBase)
                += String::CreateFromInt32( rHTMLWrt.nImgMapCnt );

        BOOL bFound;
        do
        {
            bFound = FALSE;
            for( USHORT i=0; i<rHTMLWrt.aImgMapNames.Count(); i++ )
            {
                // TODO: Unicode: Comparison is case insensitive for ASCII
                // characters only now!
                if( aIMapName.EqualsIgnoreCaseAscii(*rHTMLWrt.aImgMapNames[i]) )
                {
                    bFound = TRUE;
                    break;
                }
            }
            if( bFound )
            {
                rHTMLWrt.nImgMapCnt++;
                (aIMapName = aNameBase)
                    += String::CreateFromInt32( rHTMLWrt.nImgMapCnt );
            }

        } while( bFound );

        BOOL bScale = FALSE;
        //Size aGrfSize( rNode.GetTwipSize() );
        Fraction aScaleX( 1, 1 );
        Fraction aScaleY( 1, 1 );

        const SwFmtFrmSize& rFrmSize = rFrmFmt.GetFrmSize();
        const SvxBoxItem& rBox = rFrmFmt.GetBox();

        if( !rFrmSize.GetWidthPercent() && rRealSize.Width() )
        {
            SwTwips nWidth = rFrmSize.GetWidth();
            nWidth -= ( rBox.CalcLineSpace(BOX_LINE_LEFT) +
                        rBox.CalcLineSpace(BOX_LINE_RIGHT) );

            ASSERT( nWidth>0, "Gibt es 0 twip breite Grafiken!?" );
            if( nWidth<=0 ) // sollte nicht passieren
                nWidth = 1;

            if( rRealSize.Width() != nWidth )
            {
                aScaleX = Fraction( nWidth, rRealSize.Width() );
                bScale = TRUE;
            }
        }
        if( !rFrmSize.GetHeightPercent() && rRealSize.Height() )
        {
            SwTwips nHeight = rFrmSize.GetHeight();
            nHeight -= ( rBox.CalcLineSpace(BOX_LINE_TOP) +
                         rBox.CalcLineSpace(BOX_LINE_BOTTOM) );

            ASSERT( nHeight>0, "Gibt es 0 twip hohe Grafiken!?" );
            if( nHeight<=0 )
                nHeight = 1;

            if( rRealSize.Height() != nHeight )
            {
                aScaleY = Fraction( nHeight, rRealSize.Height() );
                bScale = TRUE;
            }
        }

        rHTMLWrt.aImgMapNames.Insert( new String(aIMapName),
                                          rHTMLWrt.aImgMapNames.Count() );

        ByteString aIndMap, aIndArea;
        const sal_Char *pLF = 0, *pIndArea = 0, *pIndMap = 0;
#if defined(MAC) || defined(UNX)
        sal_Char aLF[2] = "\x00";
#endif

        if( rHTMLWrt.bLFPossible )
        {
            rHTMLWrt.OutNewLine( TRUE );
            rHTMLWrt.GetIndentString( aIndMap );
            rHTMLWrt.GetIndentString( aIndArea, 1 );
#if defined(MAC) || defined(UNX)
            aLF[0]  = SwHTMLWriter::sNewLine;
            pLF = aLF;
#else
            pLF = SwHTMLWriter::sNewLine;
#endif
            pIndArea = aIndArea.GetBuffer();
            pIndMap = aIndMap.GetBuffer();
        }

        if( bScale )
        {
            ImageMap aScaledIMap( *pIMap );
            aScaledIMap.Scale( aScaleX, aScaleY );
            HTMLOutFuncs::Out_ImageMap( rWrt.Strm(), aScaledIMap, aIMapName,
                                        aIMapEventTable,
                                        rHTMLWrt.bCfgStarBasic,
                                        pLF, pIndArea, pIndMap,
                                        rHTMLWrt.eDestEnc );
        }
        else
        {
            HTMLOutFuncs::Out_ImageMap( rWrt.Strm(), *pIMap, aIMapName,
                                        aIMapEventTable,
                                        rHTMLWrt.bCfgStarBasic,
                                        pLF, pIndArea, pIndMap,
                                         rHTMLWrt.eDestEnc );
        }
    }

    // wenn meoglich vor der Grafik einen Zeilen-Umbruch ausgeben
    if( rHTMLWrt.bLFPossible )
        rHTMLWrt.OutNewLine( TRUE );

    // Attribute die ausserhelb der Grafik geschreiben werden muessen sammeln
    ByteString sOut;
    ByteString aEndTags;

    // implizite Sprungmarke -> <A NAME=...></A>...<IMG ...>
    if( pMarkType && rFrmFmt.GetName().Len() )
        rHTMLWrt.OutImplicitMark( rFrmFmt.GetName(), pMarkType );

    // URL -> <A>...<IMG ... >...</A>
    const SvxMacroItem *pMacItem = 0;
    if( SFX_ITEM_SET == rItemSet.GetItemState( RES_FRMMACRO, TRUE, &pItem ))
        pMacItem = (const SvxMacroItem *)pItem;

    if( pURLItem || pMacItem )
    {
        String aMapURL;
        String aName;
        String aTarget;
        if( pURLItem )
        {
            aMapURL = pURLItem->GetURL();
            aName = pURLItem->GetName();
            aTarget = pURLItem->GetTargetFrameName();
        }
        BOOL bEvents = pMacItem && pMacItem->GetMacroTable().Count();

        if( aMapURL.Len() || aName.Len() || aTarget.Len() || bEvents )
        {
            (sOut = '<') += sHTML_anchor;

            // Ein HREF nur Ausgaben, wenn es einen Link oder Makros gibt
            if( aMapURL.Len() || bEvents )
            {
                ((sOut += ' ') += sHTML_O_href) += "=\"";
                rWrt.Strm() << sOut.GetBuffer();
                HTMLOutFuncs::Out_String( rWrt.Strm(),
                            INetURLObject::AbsToRel( aMapURL,
                                        INetURLObject::WAS_ENCODED,
                                        INetURLObject::DECODE_WITH_CHARSET ),
                            rHTMLWrt.eDestEnc );
                sOut = '\"';
            }

            if( aName.Len() )
            {
                ((sOut += ' ') += sHTML_O_name) += "=\"";
                rWrt.Strm() << sOut.GetBuffer();
                HTMLOutFuncs::Out_String( rWrt.Strm(), aName,
                                          rHTMLWrt.eDestEnc );
                sOut = '\"';
            }

            if( aTarget.Len() )
            {
                ((sOut += ' ') += sHTML_O_target) += "=\"";
                rWrt.Strm() << sOut.GetBuffer();
                HTMLOutFuncs::Out_String( rWrt.Strm(), aTarget,
                                          rHTMLWrt.eDestEnc );
                sOut = '\"';
            }
            if( sOut.Len() )
            {
                rWrt.Strm() << sOut.GetBuffer();
                sOut.Erase();
            }

            if( pMacItem )
            {
                const SvxMacroTableDtor& rMacTable = pMacItem->GetMacroTable();
                if( rMacTable.Count() )
                    HTMLOutFuncs::Out_Events( rWrt.Strm(), rMacTable,
                                              aAnchorEventTable,
                                              rHTMLWrt.bCfgStarBasic,
                                                 rHTMLWrt.eDestEnc );
            }

            rWrt.Strm() << ">";
            (((sOut = "</") += sHTML_anchor) += ">") += aEndTags;
            aEndTags = sOut;
        }
    }

    // Umrandung -> <FONT COLOR = ...>...<IMG ... >...</FONT>
    USHORT nBorderWidth = 0;
    if( (nFrmOpts & HTML_FRMOPT_BORDER) &&
        SFX_ITEM_SET == rItemSet.GetItemState( RES_BOX, TRUE, &pItem ))
    {
        Size aTwipBorder( 0, 0 );
        const SvxBoxItem* pBoxItem = (const SvxBoxItem*)pItem;

        const SvxBorderLine *pColBorderLine = 0;
        const SvxBorderLine *pBorderLine = pBoxItem->GetLeft();
        if( pBorderLine )
        {
            pColBorderLine = pBorderLine;
            aTwipBorder.Width() += pBorderLine->GetOutWidth();
        }

        pBorderLine = pBoxItem->GetRight();
        if( pBorderLine )
        {
            pColBorderLine = pBorderLine;
            aTwipBorder.Width() += pBorderLine->GetOutWidth();
        }

        pBorderLine = pBoxItem->GetTop();
        if( pBorderLine )
        {
            pColBorderLine = pBorderLine;
            aTwipBorder.Height() += pBorderLine->GetOutWidth();
        }

        pBorderLine = pBoxItem->GetBottom();
        if( pBorderLine )
        {
            pColBorderLine = pBorderLine;
            aTwipBorder.Height() += pBorderLine->GetOutWidth();
        }

        aTwipBorder.Width() /= 2;
        aTwipBorder.Height() /= 2;

        if( (aTwipBorder.Width() || aTwipBorder.Height()) &&
            Application::GetDefaultDevice() )
        {
            Size aPixelBorder =
                Application::GetDefaultDevice()->LogicToPixel( aTwipBorder,
                                                    MapMode(MAP_TWIP) );
            if( !aPixelBorder.Width() && aTwipBorder.Width() )
                aPixelBorder.Width() = 1;
            if( !aPixelBorder.Height() && aTwipBorder.Height() )
                aPixelBorder.Height() = 1;

            if( aPixelBorder.Width() )
                aPixelBorder.Height() = 0;

            nBorderWidth =
                (USHORT)(aPixelBorder.Width() + aPixelBorder.Height());
        }

        if( pColBorderLine )
        {
            sOut = '<';
            (((sOut += sHTML_font) += ' ') += sHTML_O_color) += '=';
            rWrt.Strm() << sOut.GetBuffer();
            HTMLOutFuncs::Out_Color( rWrt.Strm(),
                                     pColBorderLine->GetColor() ) << '>';

            (((sOut = "</" ) += sHTML_font) += '>') += aEndTags;
            aEndTags = sOut;
        }
    }

    sOut = '<';
    (((sOut += sHTML_image) += ' ') += sHTML_O_src) += "=\"";
    rWrt.Strm() << sOut.GetBuffer();
    HTMLOutFuncs::Out_String( rWrt.Strm(), aGrfNm, rHTMLWrt.eDestEnc ) << '\"';

    // Events
    sOut.Erase();
    if( SFX_ITEM_SET == rItemSet.GetItemState( RES_FRMMACRO, TRUE, &pItem ))
    {
        const SvxMacroTableDtor& rMacTable =
            ((const SvxMacroItem *)pItem)->GetMacroTable();
        if( rMacTable.Count() )
            HTMLOutFuncs::Out_Events( rWrt.Strm(), rMacTable, aImageEventTable,
                                      rHTMLWrt.bCfgStarBasic, rHTMLWrt.eDestEnc );
    }

    // ALT, ALIGN, WIDTH, HEIGHT, HSPACE, VSPACE
    rHTMLWrt.OutFrmFmtOptions( rFrmFmt, rAlternateTxt, aEndTags, nFrmOpts );
    if( rHTMLWrt.IsHTMLMode( HTMLMODE_ABS_POS_FLY ) )
        rHTMLWrt.OutCSS1_FrmFmtOptions( rFrmFmt, nFrmOpts );


    if( nFrmOpts & HTML_FRMOPT_BORDER )
    {
        (((sOut = ' ') += sHTML_O_border) += '=')
            += ByteString::CreateFromInt32( nBorderWidth );
        rWrt.Strm() << sOut.GetBuffer();
    }

    if( pURLItem && pURLItem->IsServerMap() )
    {
        (sOut = ' ') += sHTML_O_ismap;
        rWrt.Strm() << sOut.GetBuffer();
    }
    if( aIMapName.Len() )
    {
        ((sOut = ' ') += sHTML_O_usemap) += "=\"#";
        rWrt.Strm() << sOut.GetBuffer();
        HTMLOutFuncs::Out_String( rWrt.Strm(), aIMapName, rHTMLWrt.eDestEnc ) << '\"';
    }

    rHTMLWrt.Strm() << '>';

    if( aEndTags.Len() )
        rWrt.Strm() << aEndTags.GetBuffer();

    if( rHTMLWrt.aINetFmts.Count() )
    {
        // es ist noch ein Attribut auf dem Stack, das wieder geoeffnet
        // werden muss
        SwFmtINetFmt *pINetFmt =
            rHTMLWrt.aINetFmts[ rHTMLWrt.aINetFmts.Count()-1 ];
        OutHTML_INetFmt( rWrt, *pINetFmt, TRUE );
    }

    return rHTMLWrt;
}

Writer& OutHTML_BulletImage( Writer& rWrt,
                             const sal_Char *pTag,
                             const SvxBrushItem* pBrush,
                             String &rGrfName,
                             const Size &rSize,
                             const SwFmtVertOrient* pVertOrient )
{
    SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;

    // Wenn es ein BrushItem gibt, muss die Grafiknoch exportiert werden
    const String *pLink = 0;
    if( pBrush )
    {
        pLink = pBrush->GetGraphicLink();

        // embeddete Grafik -> WriteEmbedded schreiben
        if( !pLink )
        {
            const Graphic* pGrf = pBrush->GetGraphic();
            if( pGrf )
            {
                // Grafik als (JPG-)File speichern
                if( rHTMLWrt.GetOrigFileName() )
                    rGrfName = *rHTMLWrt.GetOrigFileName();
                USHORT nErr = XOutBitmap::WriteGraphic( *pGrf,  rGrfName,
                        String::CreateFromAscii("JPG"),
                        XOUTBMP_USE_GIF_IF_SENSIBLE);
                if( !nErr )
                {
                    rGrfName = URIHelper::SmartRelToAbs( rGrfName );
                    if( rHTMLWrt.HasCId() )
                        rHTMLWrt.MakeCIdURL( rGrfName );
                    pLink = &rGrfName;
                }
                else
                {
                    rHTMLWrt.nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE;
                }
            }
        }
        else
        {
            rGrfName = *pLink;
            if( rHTMLWrt.bCfgCpyLinkedGrfs || rHTMLWrt.HasCId() )
            {
                rHTMLWrt.CopyLocalFileToINet( rGrfName, rHTMLWrt.HasCId() );
                if( rHTMLWrt.HasCId() )
                    rHTMLWrt.MakeCIdURL( rGrfName );
                pLink = &rGrfName;
            }
        }
    }
    else
    {
        pLink = &rGrfName;
    }

    ByteString sOut;
    if( pTag )
        (sOut += '<') += pTag;

    if( pLink )
    {
        sOut += ' ';
        String s( *pLink );
        if( !HTMLOutFuncs::PrivateURLToInternalImg(s) )
            s = INetURLObject::AbsToRel( s, INetURLObject::WAS_ENCODED,
                                        INetURLObject::DECODE_WITH_CHARSET );
        (sOut += sHTML_O_src) += "=\"";
        rWrt.Strm() << sOut.GetBuffer();
        HTMLOutFuncs::Out_String( rWrt.Strm(), s, rHTMLWrt.eDestEnc );
        sOut = '\"';

        // Groesse des Objekts Twips ohne Raender
        Size aPixelSz( 0, 0 );
        if( (rSize.Width() || rSize.Height()) && Application::GetDefaultDevice() )
        {
            aPixelSz =
                Application::GetDefaultDevice()->LogicToPixel( rSize,
                                                    MapMode(MAP_TWIP) );
            if( !aPixelSz.Width() && rSize.Width() )
                aPixelSz.Width() = 1;
            if( !aPixelSz.Height() && rSize.Height() )
                aPixelSz.Height() = 1;
        }

        if( aPixelSz.Width() )
            (((sOut += ' ') += sHTML_O_width) += '=')
                += ByteString::CreateFromInt32( aPixelSz.Width() );

        if( aPixelSz.Height() )
            (((sOut += ' ') += sHTML_O_height) += '=')
                += ByteString::CreateFromInt32( aPixelSz.Height() );

        if( pVertOrient )
        {
            const sal_Char *pStr = 0;
            switch( pVertOrient->GetVertOrient() )
            {
            case VERT_LINE_TOP:     pStr = sHTML_VA_top;        break;
            case VERT_CHAR_TOP:
            case VERT_BOTTOM:       pStr = sHTML_VA_texttop;    break;  // geht nicht
            case VERT_LINE_CENTER:
            case VERT_CHAR_CENTER:  pStr = sHTML_VA_absmiddle;  break;  // geht nicht
            case VERT_CENTER:       pStr = sHTML_VA_middle;     break;
            case VERT_LINE_BOTTOM:
            case VERT_CHAR_BOTTOM:  pStr = sHTML_VA_absbottom;  break;  // geht nicht
            case VERT_TOP:          pStr = sHTML_VA_bottom;     break;
            }
            if( pStr )
                (((sOut += ' ') += sHTML_O_align) += '=') += pStr;
        }
    }

    if( pTag )
        sOut += '>';
    rWrt.Strm() << sOut.GetBuffer();

    return rWrt;
}


//-----------------------------------------------------------------------

static Writer& OutHTML_FrmFmtTableNode( Writer& rWrt, const SwFrmFmt& rFrmFmt )
{
    SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;

    const SwFmtCntnt& rFlyCntnt = rFrmFmt.GetCntnt();
    ULONG nStt = rFlyCntnt.GetCntntIdx()->GetIndex()+1;
    ULONG nEnd = rHTMLWrt.pDoc->GetNodes()[nStt-1]->EndOfSectionIndex();

    String aCaption;
    BOOL bTopCaption = FALSE;

    // Nicht const, weil GetTable spater mal nicht const ist
    SwNode *pNd = rHTMLWrt.pDoc->GetNodes()[ nStt ];
    SwTableNode *pTblNd = pNd->GetTableNode();
    const SwTxtNode *pTxtNd = pNd->GetTxtNode();
    if( !pTblNd && pTxtNd )
    {
        // Tabelle mit Ueberschrift
        bTopCaption = TRUE;
        pTblNd = rHTMLWrt.pDoc->GetNodes()[nStt+1]->GetTableNode();
    }
    ASSERT( pTblNd, "Rahmen enthaelt keine Tabelle" );
    if( pTblNd )
    {
        ULONG nTblEnd = pTblNd->EndOfSectionIndex();
        ASSERT( nTblEnd == nEnd - 1 ||
                (nTblEnd == nEnd - 2 && !bTopCaption),
                "Ungeuelter Rahmen-Inhalt fuer Tabelle" );

        if( nTblEnd == nEnd - 2 )
            pTxtNd = rHTMLWrt.pDoc->GetNodes()[nTblEnd+1]->GetTxtNode();
    }
    if( pTxtNd )
        aCaption = pTxtNd->GetTxt();

    {
        HTMLSaveData aSaveData( rHTMLWrt, pTblNd->GetIndex()+1,
                                pTblNd->EndOfSectionIndex(),
                                (SwFlyFrmFmt*)&rFrmFmt );
        OutHTML_SwTblNode( rHTMLWrt, *pTblNd, &rFrmFmt, &aCaption,
                           bTopCaption );
    }

    return rWrt;
}

static Writer & OutHTML_FrmFmtAsMulticol( Writer& rWrt,
                                          const SwFrmFmt& rFrmFmt,
                                          BOOL bInCntnr )
{
    SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;

    rHTMLWrt.ChangeParaToken( 0 );

    // Die aktulle <DL> beenden!
    rHTMLWrt.OutAndSetDefList( 0 );

    // als Multicol ausgeben
    if( rHTMLWrt.bLFPossible )
        rHTMLWrt.OutNewLine();

    ByteString sOut( '<' );
    sOut += sHTML_multicol;

    const SwFmtCol& rFmtCol = rFrmFmt.GetCol();

    // die Anzahl der Spalten als COLS ausgeben
    USHORT nCols = rFmtCol.GetNumCols();
    if( nCols )
        (((sOut += ' ') += sHTML_O_cols) += '=')
            += ByteString::CreateFromInt32( nCols );

    // die Gutter-Breite (Minimalwert) als GUTTER
    USHORT nGutter = rFmtCol.GetGutterWidth( TRUE );
    if( nGutter!=USHRT_MAX )
    {
        if( nGutter && Application::GetDefaultDevice() )
        {
            nGutter = (USHORT)Application::GetDefaultDevice()
                            ->LogicToPixel( Size(nGutter,0),
                                            MapMode(MAP_TWIP) ).Width();
        }
        (((sOut += ' ') += sHTML_O_gutter) += '=')
            += ByteString::CreateFromInt32( nGutter );
    }

    rWrt.Strm() << sOut.GetBuffer();

    // WIDTH
    ULONG nFrmFlags = bInCntnr ? HTML_FRMOPTS_MULTICOL_CNTNR
                                : HTML_FRMOPTS_MULTICOL;
    if( rHTMLWrt.IsHTMLMode( HTMLMODE_ABS_POS_FLY ) && !bInCntnr )
        nFrmFlags |= HTML_FRMOPTS_MULTICOL_CSS1;
    ByteString aEndTags;
    rHTMLWrt.OutFrmFmtOptions( rFrmFmt, aEmptyStr, aEndTags, nFrmFlags );
    if( rHTMLWrt.IsHTMLMode( HTMLMODE_ABS_POS_FLY ) && !bInCntnr )
        rHTMLWrt.OutCSS1_FrmFmtOptions( rFrmFmt, nFrmFlags );

    rWrt.Strm() << '>';

    rHTMLWrt.bLFPossible = TRUE;
    rHTMLWrt.IncIndentLevel();  // den Inhalt von Multicol einruecken;

    const SwFmtCntnt& rFlyCntnt = rFrmFmt.GetCntnt();
    ULONG nStt = rFlyCntnt.GetCntntIdx()->GetIndex();
    const SwStartNode* pSttNd = rWrt.pDoc->GetNodes()[nStt]->GetStartNode();
    ASSERT( pSttNd, "Wo ist der Start-Node" );

    {
        // in einem Block damit rechtzeitig vor dem Ende der alte Zustand
        // wieder hergestellt wird.
        HTMLSaveData aSaveData( rHTMLWrt, nStt+1,
                                pSttNd->EndOfSectionIndex(),
                                (const SwFlyFrmFmt*)&rFrmFmt );
        rHTMLWrt.Out_SwDoc( rWrt.pCurPam );
    }

//  rHTMLWrt.ChangeParaToken( 0 );  // MIB 8.7.97: Passiert jetzt in Out_SwDoc

    rHTMLWrt.DecIndentLevel();  // den Inhalt von Multicol einruecken;
    if( rHTMLWrt.bLFPossible )
        rHTMLWrt.OutNewLine();
    HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_multicol, FALSE );
    rHTMLWrt.bLFPossible = TRUE;

    return rWrt;
}

static Writer& OutHTML_FrmFmtAsSpacer( Writer& rWrt, const SwFrmFmt& rFrmFmt )
{
    SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;

    // wenn meoglich vor der Grafik einen Zeilen-Umbruch ausgeben
    if( rHTMLWrt.bLFPossible )
        rHTMLWrt.OutNewLine( TRUE );

    ByteString sOut('<');
    ((((sOut += sHTML_spacer) += ' ') += sHTML_O_type) += '=')
        += sHTML_SPTYPE_block;
    rWrt.Strm() << sOut.GetBuffer();

    // ALIGN, WIDTH, HEIGHT
    ByteString aEndTags;
    rHTMLWrt.OutFrmFmtOptions( rFrmFmt, aEmptyStr, aEndTags,
                                HTML_FRMOPTS_SPACER );

    rWrt.Strm() << '>';
    if( aEndTags.Len() )
        rWrt.Strm() << aEndTags.GetBuffer();

    return rWrt;
}

static Writer& OutHTML_FrmFmtAsDivOrSpan( Writer& rWrt,
                                          const SwFrmFmt& rFrmFmt, BOOL bSpan)
{
    SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;

    const sal_Char *pStr = 0;
    if( !bSpan )
    {
        rHTMLWrt.ChangeParaToken( 0 );

        // Die aktulle <DL> beenden!
        rHTMLWrt.OutAndSetDefList( 0 );
        pStr = sHTML_division;
    }
    else
        pStr = sHTML_span;

    // als DIV ausgeben
    if( rHTMLWrt.bLFPossible )
        rHTMLWrt.OutNewLine();

    ByteString sOut( '<' );
    sOut += pStr;

    rWrt.Strm() << sOut.GetBuffer();
    ByteString aEndTags;
    ULONG nFrmFlags = HTML_FRMOPTS_DIV;
    if( rHTMLWrt.IsHTMLMode( HTMLMODE_BORDER_NONE ) )
       nFrmFlags |= HTML_FRMOPT_S_NOBORDER;
    rHTMLWrt.OutFrmFmtOptions( rFrmFmt, aEmptyStr, aEndTags, nFrmFlags );
    rHTMLWrt.OutCSS1_FrmFmtOptions( rFrmFmt, nFrmFlags );
    rWrt.Strm() << '>';

    rHTMLWrt.IncIndentLevel();  // den Inhalt einruecken
    rHTMLWrt.bLFPossible = TRUE;

    const SwFmtCntnt& rFlyCntnt = rFrmFmt.GetCntnt();
    ULONG nStt = rFlyCntnt.GetCntntIdx()->GetIndex();

    // Am Start-Node verankerte Rahmen-gebundene Rahmen ausgeben
    rHTMLWrt.OutFlyFrm( nStt, 0, HTML_POS_ANY );

    const SwStartNode* pSttNd = rWrt.pDoc->GetNodes()[nStt]->GetStartNode();
    ASSERT( pSttNd, "Wo ist der Start-Node" );

    {
        // in einem Block damit rechtzeitig vor dem Ende der alte Zustand
        // wieder hergestellt wird.
        HTMLSaveData aSaveData( rHTMLWrt, nStt+1,
                                pSttNd->EndOfSectionIndex(),
                                (const SwFlyFrmFmt*)&rFrmFmt );
        rHTMLWrt.Out_SwDoc( rWrt.pCurPam );
    }

    rHTMLWrt.DecIndentLevel();  // den Inhalt von Multicol einruecken;
    if( rHTMLWrt.bLFPossible )
        rHTMLWrt.OutNewLine();
    HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), pStr, FALSE );

    if( aEndTags.Len() )
        rWrt.Strm() << aEndTags.GetBuffer();

    return rWrt;
}

static Writer & OutHTML_FrmFmtAsImage( Writer& rWrt, const SwFrmFmt& rFrmFmt,
                                       BOOL bInCntnr )
{
    SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;

    ImageMap aIMap;
    Graphic aGrf( ((SwFrmFmt &)rFrmFmt).MakeGraphic( &aIMap ) );

    String aGrfNm;
    if( rHTMLWrt.GetOrigFileName() )
        aGrfNm = *rHTMLWrt.GetOrigFileName();
    if( aGrf.GetType() == GRAPHIC_NONE ||
        XOutBitmap::WriteGraphic( aGrf, aGrfNm,
                                  String::CreateFromAscii( "JPG" ),
                                  XOUTBMP_USE_GIF_IF_POSSIBLE ) != 0 )
    {
        // leer oder fehlerhaft, da ist nichts auszugeben
        rHTMLWrt.nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE;
        return rWrt;
    }

    aGrfNm = URIHelper::SmartRelToAbs( aGrfNm );
    if( rHTMLWrt.HasCId() )
        rHTMLWrt.MakeCIdURL( aGrfNm );
    Size aSz( 0, 0 );
    ULONG nFrmFlags = bInCntnr ? HTML_FRMOPTS_GENIMG_CNTNR
                                : HTML_FRMOPTS_GENIMG;
    OutHTML_Image( rWrt, rFrmFmt, aGrfNm, rFrmFmt.GetName(), aSz,
                    HTML_FRMOPTS_GENIMG, pMarkToFrame,
                    aIMap.GetIMapObjectCount() ? &aIMap : 0 );
    return rWrt;
}


static Writer& OutHTML_FrmFmtGrfNode( Writer& rWrt, const SwFrmFmt& rFrmFmt,
                                      BOOL bInCntnr )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;

    const SwFmtCntnt& rFlyCntnt = rFrmFmt.GetCntnt();
    ULONG nStt = rFlyCntnt.GetCntntIdx()->GetIndex()+1;
    SwGrfNode *pGrfNd = rHTMLWrt.pDoc->GetNodes()[ nStt ]->GetGrfNode();
    ASSERT( pGrfNd, "Grf-Node erwartet" );
    if( !pGrfNd )
        return rWrt;

    const SwMirrorGrf& rMirror = pGrfNd->GetSwAttrSet().GetMirrorGrf();

    String aGrfNm;
    if( !pGrfNd->IsLinkedFile() || RES_DONT_MIRROR_GRF != rMirror.GetValue() )
    {
        // Grafik als File-Referenz speichern (als JPEG-Grafik speichern)
        if( rHTMLWrt.GetOrigFileName() )
            aGrfNm = *rHTMLWrt.GetOrigFileName();
        pGrfNd->SwapIn( TRUE );

        ULONG nFlags = XOUTBMP_USE_GIF_IF_SENSIBLE;
        switch( rMirror.GetValue() )
        {
        case RES_MIRROR_GRF_VERT:   nFlags = XOUTBMP_MIRROR_HORZ; break;
        case RES_MIRROR_GRF_HOR:    nFlags = XOUTBMP_MIRROR_VERT; break;
        case RES_MIRROR_GRF_BOTH:
            nFlags = XOUTBMP_MIRROR_VERT | XOUTBMP_MIRROR_HORZ;
            break;
        }

        Size aMM100Size;
        const SwFmtFrmSize& rSize = rFrmFmt.GetFrmSize();
        aMM100Size = OutputDevice::LogicToLogic( rSize.GetSize(),
                        MapMode( MAP_TWIP ), MapMode( MAP_100TH_MM ));

        USHORT nErr = XOutBitmap::WriteGraphic( pGrfNd->GetGrf(), aGrfNm,
                String::CreateFromAscii("JPG"), nFlags, &aMM100Size );
        if( nErr )              // fehlerhaft, da ist nichts auszugeben
        {
            rHTMLWrt.nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE;
            return rWrt;
        }
        aGrfNm = URIHelper::SmartRelToAbs( aGrfNm );
    }
    else
    {
        pGrfNd->GetFileFilterNms( &aGrfNm, 0 );
        if( rHTMLWrt.bCfgCpyLinkedGrfs || rHTMLWrt.HasCId() )
            rWrt.CopyLocalFileToINet( aGrfNm, rHTMLWrt.HasCId() );
    }
    if( rHTMLWrt.HasCId() )
        rHTMLWrt.MakeCIdURL( aGrfNm );

    ULONG nFrmFlags = bInCntnr ? HTML_FRMOPTS_IMG_CNTNR : HTML_FRMOPTS_IMG;
    if( rHTMLWrt.IsHTMLMode( HTMLMODE_ABS_POS_FLY ) && !bInCntnr )
        nFrmFlags |= HTML_FRMOPTS_IMG_CSS1;
    OutHTML_Image( rWrt, rFrmFmt, aGrfNm, pGrfNd->GetAlternateText(),
                   pGrfNd->GetTwipSize(), nFrmFlags, pMarkToGraphic );

    return rWrt;
}


static Writer& OutHTML_FrmFmtAsMarquee( Writer& rWrt, const SwFrmFmt& rFrmFmt,
                                  const SdrObject& rSdrObj  )
{
    SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;

    // die Edit-Engine-Attribute des Objekts als SW-Attribute holen
    // und als Hints einsortieren
    const SfxItemSet& rFmtItemSet = rFrmFmt.GetAttrSet();
    SfxItemSet aItemSet( *rFmtItemSet.GetPool(), RES_CHRATR_BEGIN,
                                                 RES_CHRATR_END );
    SwHTMLWriter::GetEEAttrsFromDrwObj( aItemSet, &rSdrObj, TRUE );
    BOOL bCfgOutStylesOld = rHTMLWrt.bCfgOutStyles;
    rHTMLWrt.bCfgOutStyles = FALSE;
    rHTMLWrt.bTxtAttr = TRUE;
    rHTMLWrt.bTagOn = TRUE;
    Out_SfxItemSet( aHTMLAttrFnTab, rWrt, aItemSet, FALSE );
    rHTMLWrt.bTxtAttr = FALSE;

    OutHTML_DrawFrmFmtAsMarquee( rHTMLWrt,
                                 (const SwDrawFrmFmt &)rFrmFmt,
                                 rSdrObj );
    rHTMLWrt.bTxtAttr = TRUE;
    rHTMLWrt.bTagOn = FALSE;
    Out_SfxItemSet( aHTMLAttrFnTab, rWrt, aItemSet, FALSE );
    rHTMLWrt.bTxtAttr = FALSE;
    rHTMLWrt.bCfgOutStyles = bCfgOutStylesOld;

    return rWrt;
}

//-----------------------------------------------------------------------

Writer& OutHTML_HeaderFooter( Writer& rWrt, const SwFrmFmt& rFrmFmt,
                              BOOL bHeader )
{
    SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;

    // als Multicol ausgeben
    rHTMLWrt.OutNewLine();
    ByteString sOut( sHTML_division );
    ((sOut += ' ') += sHTML_O_type) += '=';
    sOut += (bHeader ? "HEADER" : "FOOTER" );
    HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sOut.GetBuffer() );

    rHTMLWrt.IncIndentLevel();  // den Inhalt von Multicol einruecken;

    // Einen Spacer fuer den Absatnd zusammenbasteln. Da durch das
    // <DL> bzw. </DL> immer einer Absatz-Abstand entsteht, wird der
    // ggf. abgezogen.
    const SvxULSpaceItem& rULSpace = rFrmFmt.GetULSpace();
    USHORT nSize = bHeader ? rULSpace.GetLower() : rULSpace.GetUpper();
    rHTMLWrt.nHeaderFooterSpace = nSize;

    ByteString aSpacer;
    if( rHTMLWrt.IsHTMLMode(HTMLMODE_VERT_SPACER) &&
        nSize > HTML_PARSPACE && Application::GetDefaultDevice() )
    {
        nSize -= HTML_PARSPACE;
        nSize = (INT16)Application::GetDefaultDevice()
            ->LogicToPixel( Size(nSize,0), MapMode(MAP_TWIP) ).Width();

        ((((((((aSpacer = sHTML_spacer) += ' ')
            += sHTML_O_type) += '=') += sHTML_SPTYPE_vertical) += ' ')
            += sHTML_O_size) += '=') += ByteString::CreateFromInt32(nSize);
    }

    const SwFmtCntnt& rFlyCntnt = rFrmFmt.GetCntnt();
    ULONG nStt = rFlyCntnt.GetCntntIdx()->GetIndex();
    const SwStartNode* pSttNd = rWrt.pDoc->GetNodes()[nStt]->GetStartNode();
    ASSERT( pSttNd, "Wo ist der Start-Node" );

    if( !bHeader && aSpacer.Len() )
    {
        rHTMLWrt.OutNewLine();
        HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), aSpacer.GetBuffer() );
    }

    {
        // in einem Block damit rechtzeitig vor dem Ende der alte Zustand
        // wieder hergestellt wird. pFlyFmt braucht hier nicht gestzt zu
        // werden, denn PageDesc-Attribute koennen hier nicht vorkommen
        HTMLSaveData aSaveData( rHTMLWrt, nStt+1,
                                pSttNd->EndOfSectionIndex(),
                                rHTMLWrt.GetFlyFrmFmt() );

        if( bHeader )
            rHTMLWrt.bOutHeader = TRUE;
        else
            rHTMLWrt.bOutFooter = TRUE;

        rHTMLWrt.Out_SwDoc( rWrt.pCurPam );
    }

    if( bHeader && aSpacer.Len() )
    {
        rHTMLWrt.OutNewLine();
        HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), aSpacer.GetBuffer() );
    }

    rHTMLWrt.DecIndentLevel();  // den Inhalt von Multicol einruecken;
    rHTMLWrt.OutNewLine();
    HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_division, FALSE );

    rHTMLWrt.nHeaderFooterSpace = 0;

    return rWrt;
}


void SwHTMLWriter::AddLinkTarget( const String& rURL )
{
    if( !rURL.Len() || rURL.GetChar(0) != '#' )
        return;

    xub_StrLen nLastPos, nPos = rURL.Search( cMarkSeperator );
    if( STRING_NOTFOUND == nPos )
        return;

    while( STRING_NOTFOUND !=
                ( nLastPos = rURL.Search( cMarkSeperator, nPos + 1 )) )
        nPos = nLastPos;

    if( nPos<2 ) // mindetsens "#a|..."
        return;

    String aURL( rURL );
    aURL.Erase( 0, 1 );

    String sCmp( aURL.Copy( nPos ) ); // nPos-1+1 (-1 wg. Erase)
    sCmp.EraseAllChars();
    if( !sCmp.Len() )
        return;

    sCmp.ToLowerAscii();

    if( sCmp.EqualsAscii( pMarkToRegion ) ||
        sCmp.EqualsAscii( pMarkToFrame ) ||
        sCmp.EqualsAscii( pMarkToGraphic ) ||
        sCmp.EqualsAscii( pMarkToOLE ) ||
        sCmp.EqualsAscii( pMarkToTable ) )
    {
        // Einfach nur in einem sortierten Array merken
        aImplicitMarks.Insert( new String( aURL ) );
    }
    else if( sCmp.EqualsAscii( pMarkToOutline ) )
    {
        // Hier brauchen wir Position und Name. Deshalb sortieren wir
        // ein USHORT und ein String-Array selbst
        String aOutline( aURL.Copy( 0, nPos-1 ) );
        SwPosition aPos( *pCurPam->GetPoint() );
        if( pDoc->GotoOutline( aPos, aOutline ) )
        {
            ULONG nIdx = aPos.nNode.GetIndex();

            USHORT nPos=0;
            while( nPos < aOutlineMarkPoss.Count() &&
                   aOutlineMarkPoss[nPos] < nIdx )
                nPos++;

            aOutlineMarkPoss.Insert( nIdx, nPos );
            aOutlineMarks.Insert( new String( aURL ), nPos );
        }
    }
    else if( sCmp.EqualsAscii( pMarkToText ) )
    {
        //
    }
}

void SwHTMLWriter::CollectLinkTargets()
{
    const SwFmtINetFmt* pINetFmt;
    const SwTxtINetFmt* pTxtAttr;
    const SwTxtNode* pTxtNd;

    USHORT n, nMaxItems = pDoc->GetAttrPool().GetItemCount( RES_TXTATR_INETFMT );
    for( n = 0; n < nMaxItems; ++n )
    {
        if( 0 != (pINetFmt = (SwFmtINetFmt*)pDoc->GetAttrPool().GetItem(
            RES_TXTATR_INETFMT, n ) ) &&
            0 != ( pTxtAttr = pINetFmt->GetTxtINetFmt()) &&
            0 != ( pTxtNd = pTxtAttr->GetpTxtNode() ) &&
            pTxtNd->GetNodes().IsDocNodes() )
        {
            AddLinkTarget( pINetFmt->GetValue() );
        }
    }

    const SwFmtURL *pURL;
    nMaxItems = pDoc->GetAttrPool().GetItemCount( RES_URL );
    for( n = 0; n < nMaxItems; ++n )
    {
        if( 0 != (pURL = (SwFmtURL*)pDoc->GetAttrPool().GetItem(
            RES_URL, n ) ) )
        {
            AddLinkTarget( pURL->GetURL() );
            const ImageMap *pIMap = pURL->GetMap();
            if( pIMap )
            {
                for( USHORT i=0; i<pIMap->GetIMapObjectCount(); i++ )
                {
                    const IMapObject* pObj = pIMap->GetIMapObject( i );
                    if( pObj )
                    {
                        AddLinkTarget( pObj->GetURL() );
                    }
                }
            }
        }
    }
}

//-----------------------------------------------------------------------

SwHTMLPosFlyFrm::SwHTMLPosFlyFrm( const SwPosFlyFrm& rPosFly,
                                  const SdrObject *pSdrObj,
                                  BYTE nOutMode ) :
    pFrmFmt( &rPosFly.GetFmt() ),
    pSdrObject( pSdrObj ),
    pNdIdx( new SwNodeIndex( rPosFly.GetNdIndex() ) ),
    nOrdNum( rPosFly.GetOrdNum() ),
    nCntntIdx( 0 ),
    nOutputMode( nOutMode )
{
    const SwFmtAnchor& rAnchor = rPosFly.GetFmt().GetAnchor();
    if( FLY_AUTO_CNTNT==rAnchor.GetAnchorId() &&
        HTML_POS_INSIDE == GetOutPos() )
    {
        // Auto-gebundene Rahmen werden ein Zeichen weiter hinten
        // ausgegeben, weil dann die Positionierung mit Netscape
        // uebereinstimmt.
        ASSERT( rAnchor.GetCntntAnchor(), "Keine Anker-Position?" );
        if( rAnchor.GetCntntAnchor() )
        {
            nCntntIdx = rAnchor.GetCntntAnchor()->nContent.GetIndex();
            SwRelationOrient eHoriRel = rPosFly.GetFmt().GetHoriOrient().
                                                GetRelationOrient();
            if( FRAME == eHoriRel || PRTAREA == eHoriRel )
            {
                const SwCntntNode *pCNd = pNdIdx->GetNode().GetCntntNode();
                ASSERT( pCNd, "Kein Content-Node an PaM-Position" );
                if( pCNd && nCntntIdx < pCNd->Len() )
                    nCntntIdx++;
            }
        }
    }
}

BOOL SwHTMLPosFlyFrm::operator<( const SwHTMLPosFlyFrm& rFrm ) const
{
    if( pNdIdx->GetIndex() == rFrm.pNdIdx->GetIndex() )
    {
        if( nCntntIdx == rFrm.nCntntIdx )
        {
            if( GetOutPos() == rFrm.GetOutPos() )
                return nOrdNum < rFrm.nOrdNum;
            else
                return GetOutPos() < rFrm.GetOutPos();
        }
        else
            return nCntntIdx < rFrm.nCntntIdx;
    }
    else
        return pNdIdx->GetIndex() < rFrm.pNdIdx->GetIndex();
}

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/html/htmlfly.cxx,v 1.1.1.1 2000-09-18 17:14:55 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.81  2000/09/18 16:04:44  willem.vandorp
      OpenOffice header added.

      Revision 1.80  2000/08/18 13:03:15  jp
      don't export escaped URLs

      Revision 1.79  2000/06/26 12:55:05  os
      INetURLObject::SmartRelToAbs removed

      Revision 1.78  2000/06/26 09:52:01  jp
      must change: GetAppWindow->GetDefaultDevice

      Revision 1.77  2000/05/15 16:35:52  jp
      Changes for Unicode

      Revision 1.76  2000/04/28 14:29:11  mib
      unicode

      Revision 1.75  2000/04/10 12:20:56  mib
      unicode

      Revision 1.74  2000/02/11 14:36:57  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.73  1999/09/21 09:49:42  mib
      multiple text encodings

      Revision 1.72  1999/07/09 10:40:20  MIB
      #67508#: <BR CLEAR> for Frames that are centered


      Rev 1.71   09 Jul 1999 12:40:20   MIB
   #67508#: <BR CLEAR> for Frames that are centered

      Rev 1.70   16 Jun 1999 19:48:10   JP
   Change interface of base class Writer

*************************************************************************/

diff --git a/sw/source/filter/html/htmlfly.hxx b/sw/source/filter/html/htmlfly.hxx
new file mode 100644
index 0000000..3b8c234
--- /dev/null
+++ b/sw/source/filter/html/htmlfly.hxx
@@ -0,0 +1,175 @@
/*************************************************************************
 *
 *  $RCSfile: htmlfly.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:55 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _HTMLFLY_HXX
#define _HTMLFLY_HXX

#ifndef _SOLAR_H
#include <tools/solar.h>
#endif
#ifndef _STRING_HXX
#include <tools/string.hxx>
#endif

#ifndef _SVARRAY_H
#include <svtools/svarray.hxx>
#endif

class SdrObject;
class SwFrmFmt;
class SwNodeIndex;
class SwPosFlyFrm;

// ACHTUNG: Die Werte dieses Enumgs gehen direkt in die
// Augabe Tabelle!!!
enum SwHTMLFrmType
{
    HTML_FRMTYPE_TABLE,
    HTML_FRMTYPE_TABLE_CAP,
    HTML_FRMTYPE_MULTICOL,
    HTML_FRMTYPE_EMPTY,
    HTML_FRMTYPE_TEXT,
    HTML_FRMTYPE_GRF,
    HTML_FRMTYPE_PLUGIN,
    HTML_FRMTYPE_APPLET,
    HTML_FRMTYPE_IFRAME,
    HTML_FRMTYPE_OLE,
    HTML_FRMTYPE_MARQUEE,
    HTML_FRMTYPE_CONTROL,
    HTML_FRMTYPE_DRAW,
    HTML_FRMTYPE_END
};

#define HTML_OUT_TBLNODE    0x00
#define HTML_OUT_GRFNODE    0x01
#define HTML_OUT_OLENODE    0x02
#define HTML_OUT_DIV        0x03
#define HTML_OUT_MULTICOL   0x04
#define HTML_OUT_SPACER     0x05
#define HTML_OUT_CONTROL    0x06
#define HTML_OUT_AMARQUEE   0x07
#define HTML_OUT_MARQUEE    0x08
#define HTML_OUT_GRFFRM     0x09
#define HTML_OUT_OLEGRF     0x0a
#define HTML_OUT_SPAN       0x0b
#define HTML_OUT_MASK       0x0f

#define HTML_POS_PREFIX     0x00
#define HTML_POS_BEFORE     0x10
#define HTML_POS_INSIDE     0x20
#define HTML_POS_ANY        0x30
#define HTML_POS_MASK       0x30

#define HTML_CNTNR_NONE     0x00
#define HTML_CNTNR_SPAN     0x40
#define HTML_CNTNR_DIV      0x80
#define HTML_CNTNR_MASK     0xc0


const USHORT MAX_FRMTYPES = HTML_FRMTYPE_END;
const USHORT MAX_BROWSERS = 5;

extern BYTE aHTMLOutFrmPageFlyTable[MAX_FRMTYPES][MAX_BROWSERS];
extern BYTE aHTMLOutFrmParaFrameTable[MAX_FRMTYPES][MAX_BROWSERS];
extern BYTE aHTMLOutFrmParaPrtAreaTable[MAX_FRMTYPES][MAX_BROWSERS];
extern BYTE aHTMLOutFrmParaOtherTable[MAX_FRMTYPES][MAX_BROWSERS];
extern BYTE aHTMLOutFrmAsCharTable[MAX_FRMTYPES][MAX_BROWSERS];

class SwHTMLPosFlyFrm
{
    const SwFrmFmt      *pFrmFmt;       // der Rahmen
    const SdrObject     *pSdrObject;    // ggf. Sdr-Objekt
    SwNodeIndex         *pNdIdx;        // Node-Index
    UINT32              nOrdNum;        // Aus SwPosFlyFrm
    xub_StrLen          nCntntIdx;      // seine Position im Content
    BYTE                nOutputMode;    // Ausgabe-Infos

public:

    SwHTMLPosFlyFrm( const SwPosFlyFrm& rPosFly,
                     const SdrObject *pSdrObj, BYTE nOutMode );

    BOOL operator==( const SwHTMLPosFlyFrm& ) const { return FALSE; }
    BOOL operator<( const SwHTMLPosFlyFrm& ) const;

    const SwFrmFmt& GetFmt() const { return *pFrmFmt; }
    const SdrObject *GetSdrObject() const { return pSdrObject; }

    const SwNodeIndex& GetNdIndex() const { return *pNdIdx; }

    xub_StrLen GetCntntIndex() const    { return nCntntIdx; }

    BYTE GetOutMode() const { return nOutputMode; }

    static BYTE GetOutFn( BYTE nMode ) { return nMode & HTML_OUT_MASK; }
    static BYTE GetOutPos( BYTE nMode ) { return nMode & HTML_POS_MASK; }
    static BYTE GetOutCntnr( BYTE nMode ) { return nMode & HTML_CNTNR_MASK; }

    BYTE GetOutFn() const { return nOutputMode & HTML_OUT_MASK; }
    BYTE GetOutPos() const { return nOutputMode & HTML_POS_MASK; }
    BYTE GetOutCntnr() const { return nOutputMode & HTML_CNTNR_MASK; }
};

typedef SwHTMLPosFlyFrm *SwHTMLPosFlyFrmPtr;
SV_DECL_PTRARR_SORT( SwHTMLPosFlyFrms, SwHTMLPosFlyFrmPtr, 10, 10 )


#endif
diff --git a/sw/source/filter/html/htmlflyt.cxx b/sw/source/filter/html/htmlflyt.cxx
new file mode 100644
index 0000000..e174f6b
--- /dev/null
+++ b/sw/source/filter/html/htmlflyt.cxx
@@ -0,0 +1,673 @@
/*************************************************************************
 *
 *  $RCSfile: htmlflyt.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:55 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#include "htmlfly.hxx"

#define TE(t,p,c) (BYTE)( HTML_OUT_##t | HTML_POS_##p | HTML_CNTNR_##c )

BYTE aHTMLOutFrmPageFlyTable[MAX_FRMTYPES][MAX_BROWSERS] =
{
    {
        // Textrahmen mit Tabelle
        TE(TBLNODE, BEFORE, NONE),      // HTML 3.2
        TE(DIV,     PREFIX, NONE),      // IE 4
        TE(TBLNODE, BEFORE, NONE),      // Netscape 3
        TE(DIV,     PREFIX, NONE),      // SW
        TE(DIV,     PREFIX, NONE)       // Netscape 4!
    },
    {
        // Textrahmen mit Tabelle und Ueberschrift
        TE(TBLNODE, BEFORE, NONE),      // HTML 3.2
        TE(DIV,     PREFIX, NONE),      // IE 4
        TE(TBLNODE, BEFORE, NONE),      // Netscape 3
        TE(DIV,     PREFIX, NONE),      // SW
        TE(DIV,     PREFIX, NONE)       // Netscape 4
    },
    {
        // spaltiger Rahmen
        TE(GRFFRM,  INSIDE, NONE),      // HTML 3.2
        TE(GRFFRM,  PREFIX, NONE),      // IE 4
        TE(MULTICOL,BEFORE, NONE),      // Netscape 3
        TE(MULTICOL,PREFIX, NONE),      // SW
        TE(MULTICOL,PREFIX, DIV)        // Netscape 4
    },
    {
        // leerer Textreahmen
        TE(GRFFRM,  INSIDE, NONE),      // HTML 3.2
        TE(DIV,     PREFIX, NONE),      // IE 4
        TE(GRFFRM,  INSIDE, NONE),      // Netscape 3
        TE(DIV,     PREFIX, NONE),      // SW
        TE(DIV,     PREFIX, NONE)       // Netscape 4
    },
    {
        // sonstiger Textreahmen
        TE(GRFFRM,  INSIDE, NONE),      // HTML 3.2
        TE(DIV,     PREFIX, NONE),      // IE 4
        TE(GRFFRM,  INSIDE, NONE),      // Netscape 3
        TE(DIV,     PREFIX, NONE),      // SW
        TE(DIV,     PREFIX, NONE)       // Netscape 4
    },
    {
        // Grafik-Node
        TE(GRFNODE, INSIDE, NONE),      // HTML 3.2
        TE(GRFNODE, PREFIX, NONE),      // IE 4
        TE(GRFNODE, INSIDE, NONE),      // Netscape 3
        TE(GRFNODE, PREFIX, NONE),      // SW
        TE(GRFNODE, PREFIX, SPAN)       // Netscape 4
    },
    {
        // Plugin
        TE(OLENODE, INSIDE, NONE),      // HTML 3.2
        TE(OLENODE, PREFIX, NONE),      // IE 4
        TE(OLENODE, INSIDE, NONE),      // Netscape 3
        TE(OLENODE, PREFIX, NONE),      // SW
        TE(OLENODE, PREFIX, SPAN)       // Netscape 4
    },
    {
        // Applet
        TE(OLENODE, INSIDE, NONE),      // HTML 3.2
        TE(OLENODE, PREFIX, NONE),      // IE 4
        TE(OLENODE, INSIDE, NONE),      // Netscape 3
        TE(OLENODE, PREFIX, NONE),      // SW
        TE(OLENODE, PREFIX, SPAN)       // Netscape 4
    },
    {
        // Floating-Frame
        TE(OLEGRF,  INSIDE, NONE),      // HTML 3.2
        TE(OLENODE, PREFIX, NONE),      // IE 4
        TE(OLEGRF,  INSIDE, NONE),      // Netscape 3
        TE(OLENODE, PREFIX, NONE),      // SW
        TE(OLEGRF,  PREFIX, SPAN)       // Netscape 4
    },
    {
        // sonstige OLE-Objekte
        TE(OLEGRF,  INSIDE, NONE),      // HTML 3.2
        TE(OLEGRF,  PREFIX, NONE),      // IE 4
        TE(OLEGRF,  INSIDE, NONE),      // Netscape 3
        TE(OLEGRF,  PREFIX, NONE),      // SW
        TE(OLEGRF,  PREFIX, SPAN)       // Netscape 4
    },
    {
        // Laufschrift
        TE(GRFFRM,  INSIDE, NONE),      // HTML 3.2
        TE(AMARQUEE,PREFIX, NONE),      // IE 4
        TE(GRFFRM,  INSIDE, NONE),      // Netscape 3
        TE(AMARQUEE,PREFIX, NONE),      // SW
        TE(GRFFRM,  PREFIX, SPAN)       // Netscape 4
    },
    {
        // Controls
        TE(CONTROL, INSIDE, NONE),      // HTML 3.2
        TE(CONTROL, PREFIX, NONE),      // IE 4
        TE(CONTROL, INSIDE, NONE),      // Netscape 3
        TE(CONTROL, PREFIX, NONE),      // SW
        // Netscape schaltet FORM bei Controls in abs.-pos. SPAN aus.
        TE(CONTROL, INSIDE, NONE)       // Netscape 4
    },
    {
        // sonstige Zeichen-Objekte
        TE(GRFFRM,  INSIDE, NONE),      // HTML 3.2
        TE(GRFFRM,  PREFIX, NONE),      // IE 4
        TE(GRFFRM,  INSIDE, NONE),      // Netscape 3
        TE(GRFFRM,  PREFIX, NONE),      // SW
        TE(GRFFRM,  PREFIX, SPAN)       // Netscape 4
    }
};

BYTE aHTMLOutFrmParaFrameTable[MAX_FRMTYPES][MAX_BROWSERS] =
{
    {
        // Textrahmen mit Tabelle
        TE(TBLNODE, BEFORE, NONE),      // HTML 3.2
        TE(TBLNODE, BEFORE, NONE),      // IE 4
        TE(TBLNODE, BEFORE, NONE),      // Netscape 3
        TE(TBLNODE, BEFORE, NONE),      // SW
        TE(TBLNODE, BEFORE, NONE)       // Netscape 4
    },
    {
        // Textrahmen mit Tabelle und Ueberschrift
        TE(TBLNODE, BEFORE, NONE),      // HTML 3.2
        TE(DIV,     BEFORE, NONE),      // IE 4
        TE(TBLNODE, BEFORE, NONE),      // Netscape 3
        TE(DIV,     BEFORE, NONE),      // SW
        TE(TBLNODE, BEFORE, NONE)       // Netscape 4
    },
    {
        // spaltiger Rahmen
        TE(GRFFRM,  BEFORE, NONE),      // HTML 3.2
        TE(GRFFRM,  BEFORE, NONE),      // IE 4
        TE(MULTICOL,BEFORE, NONE),      // Netscape 3
        TE(MULTICOL,BEFORE, NONE),      // SW
        TE(MULTICOL,BEFORE, DIV)        // Netscape 4
    },
    {
        // leerer Textreahmen
        TE(GRFFRM,  BEFORE, NONE),      // HTML 3.2
        TE(DIV,     BEFORE, NONE),      // IE 4
        TE(SPACER,  BEFORE, NONE),      // Netscape 3
        TE(SPACER,  BEFORE, NONE),      // SW
        TE(SPACER,  BEFORE, NONE)       // Netscape 4
    },
    {
        // sonstiger Textreahmen
        TE(GRFFRM,  BEFORE, NONE),      // HTML 3.2
        TE(DIV,     BEFORE, NONE),      // IE 4
        TE(GRFFRM,  BEFORE, NONE),      // Netscape 3
        TE(DIV,     BEFORE, NONE),      // SW
        TE(DIV,     BEFORE, NONE)       // Netscape 4
    },
    {
        // Grafik-Node
        TE(GRFNODE, BEFORE, NONE),      // HTML 3.2
        TE(GRFNODE, BEFORE, NONE),      // IE 4
        TE(GRFNODE, BEFORE, NONE),      // Netscape 3
        TE(GRFNODE, BEFORE, NONE),      // SW
        TE(GRFNODE, BEFORE, NONE)       // Netscape 4
    },
    {
        // Plugin
        TE(OLENODE, BEFORE, NONE),      // HTML 3.2
        TE(OLENODE, BEFORE, NONE),      // IE 4
        TE(OLENODE, BEFORE, NONE),      // Netscape 3
        TE(OLENODE, BEFORE, NONE),      // SW
        TE(OLENODE, BEFORE, NONE)       // Netscape 4
    },
    {
        // Applet
        TE(OLENODE, BEFORE, NONE),      // HTML 3.2
        TE(OLENODE, BEFORE, NONE),      // IE 4
        TE(OLENODE, BEFORE, NONE),      // Netscape 3
        TE(OLENODE, BEFORE, NONE),      // SW
        TE(OLENODE, BEFORE, NONE)       // Netscape 4
    },
    {
        // Floating-Frame
        TE(OLEGRF,  BEFORE, NONE),      // HTML 3.2
        TE(OLENODE, BEFORE, NONE),      // IE 4
        TE(OLEGRF,  BEFORE, NONE),      // Netscape 3
        TE(OLENODE, BEFORE, NONE),      // SW
        TE(OLEGRF,  BEFORE, NONE)       // Netscape 4
    },
    {
        // sonstige OLE-Objekte
        TE(OLEGRF,  BEFORE, NONE),      // HTML 3.2
        TE(OLEGRF,  BEFORE, NONE),      // IE 4
        TE(OLEGRF,  BEFORE, NONE),      // Netscape 3
        TE(OLEGRF,  BEFORE, NONE),      // SW
        TE(OLEGRF,  BEFORE, NONE)       // Netscape 4
    },
    {
        // Laufschrift (fuer Netscape 4 im Container, damit
        // die LAufschrift an der richtigen Stelle erscheint
        TE(GRFFRM,  BEFORE, NONE),      // HTML 3.2
        TE(AMARQUEE,BEFORE, NONE),      // IE 4
        TE(GRFFRM,  BEFORE, NONE),      // Netscape 3
        TE(AMARQUEE,BEFORE, NONE),      // SW
        TE(GRFFRM,  BEFORE, NONE)       // Netscape 4
    },
    {
        // Controls
        TE(CONTROL, INSIDE, NONE),      // HTML 3.2
        TE(CONTROL, BEFORE, NONE),      // IE 4
        TE(CONTROL, INSIDE, NONE),      // Netscape 3
        TE(CONTROL, BEFORE, NONE),      // SW
        // hier koennte man einen Container draus machen (Import fehlt)
        TE(CONTROL, BEFORE, NONE)       // Netscape 4
    },
    {
        // sonstige Zeichen-Objekte
        TE(GRFFRM,  BEFORE, NONE),      // HTML 3.2
        TE(GRFFRM,  BEFORE, NONE),      // IE 4
        TE(GRFFRM,  BEFORE, NONE),      // Netscape 3
        TE(GRFFRM,  BEFORE, NONE),      // SW
        TE(GRFFRM,  BEFORE, NONE)       // Netscape 4
    }
};

BYTE aHTMLOutFrmParaPrtAreaTable[MAX_FRMTYPES][MAX_BROWSERS] =
{
    {
        // Textrahmen mit Tabelle
#if 0
        TE(TBLNODE, BEFORE, NONE),      // HTML 3.2
        TE(TBLNODE, BEFORE, NONE),      // IE 4
        TE(TBLNODE, BEFORE, NONE),      // Netscape 3
        TE(TBLNODE, BEFORE, NONE),      // SW
        TE(TBLNODE, BEFORE, NONE)       // Netscape 4
#endif
        TE(TBLNODE, INSIDE, NONE),      // HTML 3.2
        TE(TBLNODE, INSIDE, NONE),      // IE 4
        TE(TBLNODE, INSIDE, NONE),      // Netscape 3
        TE(TBLNODE, INSIDE, NONE),      // SW
        TE(TBLNODE, INSIDE, NONE)       // Netscape 4
    },
    {
        // Textrahmen mit Tabelle und Ueberschrift
#if 0
        TE(TBLNODE, BEFORE, NONE),      // HTML 3.2
        TE(DIV,     BEFORE, NONE),      // IE 4
        TE(TBLNODE, BEFORE, NONE),      // Netscape 3
        TE(DIV,     BEFORE, NONE),      // SW
        TE(DIV,     BEFORE, NONE)       // Netscape 4
#endif
        TE(TBLNODE, INSIDE, NONE),      // HTML 3.2
        TE(SPAN,    INSIDE, NONE),      // IE 4
        TE(TBLNODE, INSIDE, NONE),      // Netscape 3
        TE(SPAN,    INSIDE, NONE),      // SW
        TE(SPAN,    INSIDE, NONE)       // Netscape 4
    },
    {
        // spaltiger Rahmen
        TE(GRFFRM,  INSIDE, NONE),      // HTML 3.2
        TE(GRFFRM,  INSIDE, NONE),      // IE 4
        TE(MULTICOL,INSIDE, NONE),      // Netscape 3
        TE(MULTICOL,INSIDE, NONE),      // SW
        TE(MULTICOL,INSIDE, SPAN)       // Netscape 4
    },
    {
        // leerer Textreahmen
        TE(GRFFRM,  INSIDE, NONE),      // HTML 3.2
        TE(SPAN,    INSIDE, NONE),      // IE 4
        TE(SPACER,  INSIDE, NONE),      // Netscape 3
        TE(SPACER,  INSIDE, NONE),      // SW
        TE(SPACER,  INSIDE, NONE)       // Netscape 4
    },
    {
        // sonstiger Textreahmen
        TE(GRFFRM,  INSIDE, NONE),      // HTML 3.2
        TE(SPAN,    INSIDE, NONE),      // IE 4
        TE(GRFFRM,  INSIDE, NONE),      // Netscape 3
        TE(SPAN,    INSIDE, NONE),      // SW
        TE(SPAN,    INSIDE, NONE)       // Netscape 4
    },
    {
        // Grafik-Node
        TE(GRFNODE, INSIDE, NONE),      // HTML 3.2
        TE(GRFNODE, INSIDE, NONE),      // IE 4
        TE(GRFNODE, INSIDE, NONE),      // Netscape 3
        TE(GRFNODE, INSIDE, NONE),      // SW
        TE(GRFNODE, INSIDE, NONE)       // Netscape 4
    },
    {
        // Plugin
        TE(OLENODE, INSIDE, NONE),      // HTML 3.2
        TE(OLENODE, INSIDE, NONE),      // IE 4
        TE(OLENODE, INSIDE, NONE),      // Netscape 3
        TE(OLENODE, INSIDE, NONE),      // SW
        TE(OLENODE, INSIDE, NONE)       // Netscape 4
    },
    {
        // Applet
        TE(OLENODE, INSIDE, NONE),      // HTML 3.2
        TE(OLENODE, INSIDE, NONE),      // IE 4
        TE(OLENODE, INSIDE, NONE),      // Netscape 3
        TE(OLENODE, INSIDE, NONE),      // SW
        TE(OLENODE, INSIDE, NONE)       // Netscape 4
    },
    {
        // Floating-Frame
        TE(OLEGRF,  INSIDE, NONE),      // HTML 3.2
        TE(OLENODE, INSIDE, NONE),      // IE 4
        TE(OLEGRF,  INSIDE, NONE),      // Netscape 3
        TE(OLENODE, INSIDE, NONE),      // SW
        TE(OLEGRF,  INSIDE, NONE)       // Netscape 4
    },
    {
        // sonstige OLE-Objekte
        TE(OLEGRF,  INSIDE, NONE),      // HTML 3.2
        TE(OLEGRF,  INSIDE, NONE),      // IE 4
        TE(OLEGRF,  INSIDE, NONE),      // Netscape 3
        TE(OLEGRF,  INSIDE, NONE),      // SW
        TE(OLEGRF,  INSIDE, NONE)       // Netscape 4
    },
    {
        // Laufschrift
        TE(GRFFRM,  INSIDE, NONE),      // HTML 3.2
        TE(AMARQUEE,INSIDE, NONE),      // IE 4
        TE(GRFFRM,  INSIDE, NONE),      // Netscape 3
        TE(AMARQUEE,INSIDE, NONE),      // SW
        TE(GRFFRM,  INSIDE, NONE)       // Netscape 4
    },
    {
        // Controls
        TE(CONTROL, INSIDE, NONE),      // HTML 3.2
        TE(CONTROL, INSIDE, NONE),      // IE 4
        TE(CONTROL, INSIDE, NONE),      // Netscape 3
        TE(CONTROL, INSIDE, NONE),      // SW
        // hier koennte man einen Container draus machen (Import fehlt)
        TE(CONTROL, INSIDE, NONE)       // Netscape 4
    },
    {
        // sonstige Zeichen-Objekte
        TE(GRFFRM,  INSIDE, NONE),      // HTML 3.2
        TE(GRFFRM,  INSIDE, NONE),      // IE 4
        TE(GRFFRM,  INSIDE, NONE),      // Netscape 3
        TE(GRFFRM,  INSIDE, NONE),      // SW
        TE(GRFFRM,  INSIDE, NONE)       // Netscape 4
    }
};

BYTE aHTMLOutFrmParaOtherTable[MAX_FRMTYPES][MAX_BROWSERS] =
{
    {
        // Textrahmen mit Tabelle
        TE(TBLNODE, BEFORE, NONE),      // HTML 3.2
        TE(SPAN,    INSIDE, NONE),      // IE 4
        TE(TBLNODE, BEFORE, NONE),      // Netscape 3
        TE(SPAN,    INSIDE, NONE),      // SW
        TE(SPAN,    INSIDE, NONE)       // Netscape 4
    },
    {
        // Textrahmen mit Tabelle und Ueberschrift
        TE(TBLNODE, BEFORE, NONE),      // HTML 3.2
        TE(SPAN,    INSIDE, NONE),      // IE 4
        TE(TBLNODE, BEFORE, NONE),      // Netscape 3
        TE(SPAN,    INSIDE, NONE),      // SW
        TE(SPAN,    INSIDE, NONE)       // Netscape 4
    },
    {
        // spaltiger Rahmen
        TE(GRFFRM,  INSIDE, NONE),      // HTML 3.2
        TE(GRFFRM,  INSIDE, NONE),      // IE 4
        TE(MULTICOL,BEFORE, NONE),      // Netscape 3
        TE(MULTICOL,INSIDE, NONE),      // SW
        TE(MULTICOL,INSIDE, SPAN)       // Netscape 4
    },
    {
        // leerer Textreahmen
        TE(GRFFRM,  INSIDE, NONE),      // HTML 3.2
        TE(SPAN,    INSIDE, NONE),      // IE 4
        TE(GRFFRM,  INSIDE, NONE),      // Netscape 3
        TE(SPAN,    INSIDE, NONE),      // SW
        TE(SPAN,    INSIDE, NONE)       // Netscape 4
    },
    {
        // sonstiger Textreahmen
        TE(GRFFRM,  INSIDE, NONE),      // HTML 3.2
        TE(SPAN,    INSIDE, NONE),      // IE 4
        TE(GRFFRM,  INSIDE, NONE),      // Netscape 3
        TE(SPAN,    INSIDE, NONE),      // SW
        TE(SPAN,    INSIDE, NONE)       // Netscape 4
    },
    {
        // Grafik-Node
        TE(GRFNODE, INSIDE, NONE),      // HTML 3.2
        TE(GRFNODE, INSIDE, NONE),      // IE 4
        TE(GRFNODE, INSIDE, NONE),      // Netscape 3
        TE(GRFNODE, INSIDE, NONE),      // SW
        TE(GRFNODE, INSIDE, SPAN)       // Netscape 4
    },
    {
        // Plugin
        TE(OLENODE, INSIDE, NONE),      // HTML 3.2
        TE(OLENODE, INSIDE, NONE),      // IE 4
        TE(OLENODE, INSIDE, NONE),      // Netscape 3
        TE(OLENODE, INSIDE, NONE),      // SW
        TE(OLENODE, INSIDE, SPAN)       // Netscape 4
    },
    {
        // Applet
        TE(OLENODE, INSIDE, NONE),      // HTML 3.2
        TE(OLENODE, INSIDE, NONE),      // IE 4
        TE(OLENODE, INSIDE, NONE),      // Netscape 3
        TE(OLENODE, INSIDE, NONE),      // SW
        TE(OLENODE, INSIDE, SPAN)       // Netscape 4
    },
    {
        // Floating-Frame
        TE(OLEGRF,  INSIDE, NONE),      // HTML 3.2
        TE(OLENODE, INSIDE, NONE),      // IE 4
        TE(OLEGRF,  INSIDE, NONE),      // Netscape 3
        TE(OLENODE, INSIDE, NONE),      // SW
        TE(OLEGRF,  INSIDE, SPAN)       // Netscape 4
    },
    {
        // sonstige OLE-Objekte
        TE(OLEGRF,  INSIDE, NONE),      // HTML 3.2
        TE(OLEGRF,  INSIDE, NONE),      // IE 4
        TE(OLEGRF,  INSIDE, NONE),      // Netscape 3
        TE(OLEGRF,  INSIDE, NONE),      // SW
        TE(OLEGRF,  INSIDE, SPAN)       // Netscape 4
    },
    {
        // Laufschrift
        TE(GRFFRM,  INSIDE, NONE),      // HTML 3.2
        TE(AMARQUEE,INSIDE, NONE),      // IE 4
        TE(GRFFRM,  INSIDE, NONE),      // Netscape 3
        TE(AMARQUEE,INSIDE, NONE),      // SW
        TE(GRFFRM,  INSIDE, SPAN)       // Netscape 4
    },
    {
        // Controls
        TE(CONTROL, INSIDE, NONE),      // HTML 3.2
        TE(CONTROL, INSIDE, NONE),      // IE 4
        TE(CONTROL, INSIDE, NONE),      // Netscape 3
        TE(CONTROL, INSIDE, NONE),      // SW
        // Netscape schaltet FORM bei Controls in abs.-pos. SPAN aus.
        TE(CONTROL, INSIDE, NONE)       // Netscape 4
    },
    {
        // sonstige Zeichen-Objekte
        TE(GRFFRM,  INSIDE, NONE),      // HTML 3.2
        TE(GRFFRM,  INSIDE, NONE),      // IE 4
        TE(GRFFRM,  INSIDE, NONE),      // Netscape 3
        TE(GRFFRM,  INSIDE, NONE),      // SW
        TE(GRFFRM,  INSIDE, SPAN)       // Netscape 4
    }
};

BYTE aHTMLOutFrmAsCharTable[MAX_FRMTYPES][MAX_BROWSERS] =
{
    {
        // Textrahmen mit Tabelle
        TE(GRFFRM,  INSIDE, NONE),      // HTML 3.2
        TE(GRFFRM,  INSIDE, NONE),      // IE 4
        TE(GRFFRM,  INSIDE, NONE),      // Netscape 3
        TE(GRFFRM,  INSIDE, NONE),      // SW
        TE(GRFFRM,  INSIDE, NONE)       // Netscape 4
    },
    {
        // Textrahmen mit Tabelle und Ueberschrift
        TE(GRFFRM,  INSIDE, NONE),      // HTML 3.2
        TE(GRFFRM,  INSIDE, NONE),      // IE 4
        TE(GRFFRM,  INSIDE, NONE),      // Netscape 3
        TE(GRFFRM,  INSIDE, NONE),      // SW
        TE(GRFFRM,  INSIDE, NONE)       // Netscape 4
    },
    {
        // spaltiger Rahmen
        TE(GRFFRM,  INSIDE, NONE),      // HTML 3.2
        TE(GRFFRM,  INSIDE, NONE),      // IE 4
        TE(MULTICOL,INSIDE, NONE),      // Netscape 3
        TE(MULTICOL,INSIDE, NONE),      // SW
        TE(MULTICOL,INSIDE, NONE)       // Netscape 4
    },
    {
        // leerer Textreahmen
        TE(GRFFRM,  INSIDE, NONE),      // HTML 3.2
        TE(GRFFRM,  INSIDE, NONE),      // IE 4
        TE(SPACER,  INSIDE, NONE),      // Netscape 3
        TE(SPACER,  INSIDE, NONE),      // SW
        TE(SPACER,  INSIDE, NONE)       // Netscape 4
    },
    {
        // sonstiger Textreahmen
        TE(GRFFRM,  INSIDE, NONE),      // HTML 3.2
        TE(GRFFRM,  INSIDE, NONE),      // IE 4
        TE(GRFFRM,  INSIDE, NONE),      // Netscape 3
        TE(GRFFRM,  INSIDE, NONE),      // SW
        TE(GRFFRM,  INSIDE, NONE)       // Netscape 4
    },
    {
        // Grafik-Node
        TE(GRFNODE, INSIDE, NONE),      // HTML 3.2
        TE(GRFNODE, INSIDE, NONE),      // IE 4
        TE(GRFNODE, INSIDE, NONE),      // Netscape 3
        TE(GRFNODE, INSIDE, NONE),      // SW
        TE(GRFNODE, INSIDE, NONE)       // Netscape 4
    },
    {
        // Plugin
        TE(OLENODE, INSIDE, NONE),      // HTML 3.2
        TE(OLENODE, INSIDE, NONE),      // IE 4
        TE(OLENODE, INSIDE, NONE),      // Netscape 3
        TE(OLENODE, INSIDE, NONE),      // SW
        TE(OLENODE, INSIDE, NONE)       // Netscape 4
    },
    {
        // Applet
        TE(OLENODE, INSIDE, NONE),      // HTML 3.2
        TE(OLENODE, INSIDE, NONE),      // IE 4
        TE(OLENODE, INSIDE, NONE),      // Netscape 3
        TE(OLENODE, INSIDE, NONE),      // SW
        TE(OLENODE, INSIDE, NONE)       // Netscape 4
    },
    {
        // Floating-Frame
        TE(OLEGRF,  INSIDE, NONE),      // HTML 3.2
        TE(OLENODE, INSIDE, NONE),      // IE 4
        TE(OLEGRF,  INSIDE, NONE),      // Netscape 3
        TE(OLENODE, INSIDE, NONE),      // SW
        TE(OLEGRF,  INSIDE, NONE)       // Netscape 4
    },
    {
        // sonstige OLE-Objekte
        TE(OLEGRF,  INSIDE, NONE),      // HTML 3.2
        TE(OLEGRF,  INSIDE, NONE),      // IE 4
        TE(OLEGRF,  INSIDE, NONE),      // Netscape 3
        TE(OLEGRF,  INSIDE, NONE),      // SW
        TE(OLEGRF,  INSIDE, NONE)       // Netscape 4
    },
    {
        // Laufschrift (kann immer als MARQUEE exportiert werden, weil
        // der Inhalt an der richtigen Stelle erscheint
        TE(MARQUEE, INSIDE, NONE),      // HTML 3.2
        TE(MARQUEE, INSIDE, NONE),      // IE 4
        TE(MARQUEE, INSIDE, NONE),      // Netscape 3
        TE(MARQUEE, INSIDE, NONE),      // SW
        TE(MARQUEE, INSIDE, NONE)       // Netscape 4
    },
    {
        // Controls
        TE(CONTROL, INSIDE, NONE),      // HTML 3.2
        TE(CONTROL, INSIDE, NONE),      // IE 4
        TE(CONTROL, INSIDE, NONE),      // Netscape 3
        TE(CONTROL, INSIDE, NONE),      // SW
        TE(CONTROL, INSIDE, NONE)       // Netscape 4
    },
    {
        // sonstige Zeichen-Objekte
        TE(GRFFRM,  INSIDE, NONE),      // HTML 3.2
        TE(GRFFRM,  INSIDE, NONE),      // IE 4
        TE(GRFFRM,  INSIDE, NONE),      // Netscape 3
        TE(GRFFRM,  INSIDE, NONE),      // SW
        TE(GRFFRM,  INSIDE, NONE)       // Netscape 4
    }
};
/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/html/htmlflyt.cxx,v 1.1.1.1 2000-09-18 17:14:55 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.9  2000/09/18 16:04:44  willem.vandorp
      OpenOffice header added.

      Revision 1.8  1999/11/17 16:53:54  mib
      #67938#: Export columned frames as images in MS-IE mode

      Revision 1.7  1998/04/20 07:46:02  MIB
      IE3-Export weg


      Rev 1.6   20 Apr 1998 09:46:02   MIB
   IE3-Export weg

      Rev 1.5   02 Apr 1998 19:48:30   MIB
   Spaltige Rahmen fuer SW ohne Container exportieren

      Rev 1.4   31 Mar 1998 11:23:36   MIB
   Keine Verschiebung von manchen am Zeichen geb. Rahmen und anderes

      Rev 1.3   27 Mar 1998 17:25:50   MIB
   direkte absolute Positionierung und Groessen-Export von Controls und Marquee

      Rev 1.2   20 Mar 1998 10:50:14   MIB
   Anpassungen an Netscape

      Rev 1.1   19 Mar 1998 09:18:58   MIB
   Rahmen-Export verbessert/aufgeraeumt

      Rev 1.0   14 Mar 1998 19:05:18   MIB
   Initial revision.


*************************************************************************/

diff --git a/sw/source/filter/html/htmlform.cxx b/sw/source/filter/html/htmlform.cxx
new file mode 100644
index 0000000..76f4b92
--- /dev/null
+++ b/sw/source/filter/html/htmlform.cxx
@@ -0,0 +1,3209 @@
/*************************************************************************
 *
 *  $RCSfile: htmlform.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:55 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#include "hintids.hxx"

#ifndef _SV_SYSTEM_HXX //autogen
#include <vcl/system.hxx>
#endif
#ifndef _SV_SVAPP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _WRKWIN_HXX //autogen
#include <vcl/wrkwin.hxx>
#endif
#ifndef _IMGCONS_HXX //autogen
#include <vcl/imgcons.hxx>
#endif

#ifndef _TOOLKIT_UNOHLP_HXX
#include <toolkit/helper/vclunohelper.hxx>
#endif

#ifndef _HTMLKYWD_HXX
#include <svtools/htmlkywd.hxx>
#endif
#ifndef _HTMLTOKN_H
#include <svtools/htmltokn.h>
#endif

#ifndef _SFXDOCFILE_HXX //autogen
#include <sfx2/docfile.hxx>
#endif
#ifndef _SFX_OBJUNO_HXX //autogen
#include <sfx2/objuno.hxx>
#endif
#ifndef _SFXAPP_HXX
#include <sfx2/app.hxx>
#endif

#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _SVX_COLRITEM_HXX //autogen
#include <svx/colritem.hxx>
#endif
#ifndef _SVX_FONTITEM_HXX //autogen
#include <svx/fontitem.hxx>
#endif
#ifndef _SVX_FHGTITEM_HXX //autogen
#include <svx/fhgtitem.hxx>
#endif
#ifndef _SVX_WGHTITEM_HXX //autogen
#include <svx/wghtitem.hxx>
#endif
#ifndef _SVX_POSTITEM_HXX //autogen
#include <svx/postitem.hxx>
#endif
#ifndef _SVX_UDLNITEM_HXX //autogen
#include <svx/udlnitem.hxx>
#endif
#ifndef _SVX_CRSDITEM_HXX //autogen
#include <svx/crsditem.hxx>
#endif
#ifndef _SVDOUNO_HXX //autogen
#include <svx/svdouno.hxx>
#endif
#ifndef _SVX_FMGLOB_HXX
#include <svx/fmglob.hxx>
#endif

#ifndef _COM_SUN_STAR_FORM_LISTSOURCETYPE_HPP_
#include <com/sun/star/form/ListSourceType.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_FORMBUTTONTYPE_HPP_
#include <com/sun/star/form/FormButtonType.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_FORMSUBMITENCODING_HPP_
#include <com/sun/star/form/FormSubmitEncoding.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_FORMSUBMITMETHOD_HPP_
#include <com/sun/star/form/FormSubmitMethod.hpp>
#endif
#ifndef _COM_SUN_STAR_DRAWING_XDRAWPAGESUPPLIER_HPP_
#include <com/sun/star/drawing/XDrawPageSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_SCRIPT_XEVENTATTACHERMANAGER_HPP_
#include <com/sun/star/script/XEventAttacherManager.hpp>
#endif
#ifndef _COM_SUN_STAR_SCRIPT_SCRIPTEVENTDESCRIPTOR_HPP_
#include <com/sun/star/script/ScriptEventDescriptor.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_WRAPTEXTMODE_HPP_
#include <com/sun/star/text/WrapTextMode.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_HORIORIENTATION_HPP_
#include <com/sun/star/text/HoriOrientation.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_VERTORIENTATION_HPP_
#include <com/sun/star/text/VertOrientation.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_TEXTCONTENTANCHORTYPE_HPP_
#include <com/sun/star/text/TextContentAnchorType.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XINDEXCONTAINER_HPP_
#include <com/sun/star/container/XIndexContainer.hpp>
#endif
#ifndef _COM_SUN_STAR_DRAWING_XCONTROLSHAPE_HPP_
#include <com/sun/star/drawing/XControlShape.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XTEXTLAYOUTCONSTRAINS_HPP_
#include <com/sun/star/awt/XTextLayoutConstrains.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XLAYOUTCONSTRAINS_HPP_
#include <com/sun/star/awt/XLayoutConstrains.hpp>
#endif

#ifndef _DOC_HXX //autogen
#include <doc.hxx>
#endif
#ifndef _PAM_HXX //autogen
#include <pam.hxx>
#endif
#ifndef _SWTABLE_HXX //autogen
#include <swtable.hxx>
#endif
#ifndef _FMTANCHR_HXX //autogen
#include <fmtanchr.hxx>
#endif
#ifndef _HTMLTBL_HXX //autogen
#include <htmltbl.hxx>
#endif

#ifndef _SWDOCSH_HXX //autogen
#include <docsh.hxx>
#endif
#ifndef _VIEWSH_HXX //autogen
#include <viewsh.hxx>
#endif

#ifndef _UNODRAW_HXX //autogen
#include <unodraw.hxx>
#endif
#ifndef _UNOOBJ_HXX //autogen
#include <unoobj.hxx>
#endif
#include "dcontact.hxx"

#include "swcss1.hxx"
#include "swhtml.hxx"
#include "htmlform.hxx"


#ifndef _CPPUHELPER_IMPLBASE2_HXX_
#include <cppuhelper/implbase2.hxx> // helper for implementations
#endif

using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::form;
using namespace ::rtl;

const sal_uInt16 TABINDEX_MIN = 0;
const sal_uInt16 TABINDEX_MAX = 32767;

static HTMLOptionEnum __FAR_DATA aHTMLFormMethodTable[] =
{
    { sHTML_METHOD_get,     FormSubmitMethod_GET    },
    { sHTML_METHOD_post,    FormSubmitMethod_POST   },
    { 0,                    0                       }
};

static HTMLOptionEnum __FAR_DATA aHTMLFormEncTypeTable[] =
{
    { sHTML_ET_url,         FormSubmitEncoding_URL          },
    { sHTML_ET_multipart,   FormSubmitEncoding_MULTIPART    },
    { sHTML_ET_text,        FormSubmitEncoding_TEXT         },
    { 0,                    0                               }
};

enum HTMLWordWrapMode { HTML_WM_OFF, HTML_WM_HARD, HTML_WM_SOFT };

static HTMLOptionEnum __FAR_DATA aHTMLTextAreaWrapTable[] =
{
    { sHTML_WW_off,     HTML_WM_OFF },
    { sHTML_WW_hard,    HTML_WM_HARD    },
    { sHTML_WW_soft,    HTML_WM_SOFT    },
    { sHTML_WW_physical,HTML_WM_HARD    },
    { sHTML_WW_virtual, HTML_WM_SOFT    },
    { 0,                0               }
};

HTMLEventType __FAR_DATA aEventTypeTable[] =
{
    HTML_ET_ONSUBMITFORM,
    HTML_ET_ONRESETFORM,
    HTML_ET_ONGETFOCUS,
    HTML_ET_ONLOSEFOCUS,
    HTML_ET_ONCLICK,
    HTML_ET_ONCLICK_ITEM,
    HTML_ET_ONCHANGE,
    HTML_ET_ONSELECT,
    HTML_ET_END
};

const sal_Char * __FAR_DATA aEventListenerTable[] =
{
    "XSubmitListener",
    "XResetListener",
    "XFocusListener",
    "XFocusListener",
    "XApproveActionListener",
    "XItemListener",
    "XChangeListener",
    ""
};

const sal_Char * __FAR_DATA aEventMethodTable[] =
{
    "approveSubmit",
    "approveReset",
    "focusGained",
    "focusLost",
    "approveAction",
    "itemStateChanged",
    "changed",
    ""
};

const sal_Char * __FAR_DATA aEventSDOptionTable[] =
{
    sHTML_O_SDonsubmit,
    sHTML_O_SDonreset,
    sHTML_O_SDonfocus,
    sHTML_O_SDonblur,
    sHTML_O_SDonclick,
    sHTML_O_SDonclick,
    sHTML_O_SDonchange,
    0
};

const sal_Char * __FAR_DATA aEventOptionTable[] =
{
    sHTML_O_onsubmit,
    sHTML_O_onreset,
    sHTML_O_onfocus,
    sHTML_O_onblur,
    sHTML_O_onclick,
    sHTML_O_onclick,
    sHTML_O_onchange,
    0
};

/*  */

class SwHTMLForm_Impl
{
    SwDocShell                  *pDocSh;

    SvKeyValueIterator          *pHeaderAttrs;

    // gecachte Interfaces
    Reference< drawing::XDrawPage >             xDrawPage;
    Reference< container::XIndexContainer >     xForms;
    Reference< drawing::XShapes >               xShapes;
    Reference< XMultiServiceFactory >           xServiceFactory;

    Reference< script::XEventAttacherManager >  xControlEventManager;
    Reference< script::XEventAttacherManager >  xFormEventManager;

    // Kontext-Informationen
    Reference< container::XIndexContainer >     xFormComps;
    Reference< beans::XPropertySet >            xFCompPropSet;
    Reference< drawing::XShape >                xShape;

    String                      sText;
    SvStringsDtor               aStringList;
    SvStringsDtor               aValueList;
    SvUShorts                   aSelectedList;

public:

    SwHTMLForm_Impl( SwDocShell *pDSh ) :
        pDocSh( pDSh ),
        pHeaderAttrs( pDSh ? pDSh->GetHeaderAttributes() : 0 )
    {
        ASSERT( pDocSh, "Keine DocShell, keine Controls" );
    }

    const Reference< XMultiServiceFactory >& GetServiceFactory();
    const Reference< drawing::XDrawPage >& GetDrawPage();
    const Reference< drawing::XShapes >& GetShapes();
    const Reference< script::XEventAttacherManager >& GetControlEventManager();
    const Reference< script::XEventAttacherManager >& GetFormEventManager();
    const Reference< container::XIndexContainer >& GetForms();

    const Reference< container::XIndexContainer >& GetFormComps() const
    {
        return xFormComps;
    }

    void SetFormComps( const Reference< container::XIndexContainer >& r )
    {
        xFormComps = r;
    }

    void ReleaseFormComps() { xFormComps = 0; xControlEventManager = 0; }

    const Reference< beans::XPropertySet >& GetFCompPropSet() const
    {
        return xFCompPropSet;
    }

    void SetFCompPropSet( const Reference< beans::XPropertySet >& r )
    {
        xFCompPropSet = r;
    }

    void ReleaseFCompPropSet() { xFCompPropSet = 0; }

    const Reference< drawing::XShape >& GetShape() const { return xShape; }
    void SetShape( const Reference< drawing::XShape >& r ) { xShape = r; }
    void ReleaseShape() { xShape = 0; }

    String& GetText() { return sText; }
    void EraseText() { sText = aEmptyStr; }

    SvStringsDtor& GetStringList() { return aStringList; }
    void EraseStringList()
    {
        aStringList.DeleteAndDestroy( 0, aStringList.Count() );
    }

    SvStringsDtor& GetValueList() { return aValueList; }
    void EraseValueList()
    {
        aValueList.DeleteAndDestroy( 0, aValueList.Count() );
    }

    SvUShorts& GetSelectedList() { return aSelectedList; }
    void EraseSelectedList()
    {
        aSelectedList.Remove( 0, aSelectedList.Count() );
    }

    SvKeyValueIterator *GetHeaderAttrs() const { return pHeaderAttrs; }
};

const Reference< XMultiServiceFactory >& SwHTMLForm_Impl::GetServiceFactory()
{
    if( !xServiceFactory.is() && pDocSh )
    {
        xServiceFactory =
            Reference< XMultiServiceFactory >( pDocSh->GetBaseModel(),
                                               UNO_QUERY );
        ASSERT( xServiceFactory.is(),
                "XServiceFactory nicht vom Model erhalten" );
    }
    return xServiceFactory;
}


const Reference< drawing::XDrawPage >& SwHTMLForm_Impl::GetDrawPage()
{
    if( !xDrawPage.is() && pDocSh )
    {
        Reference< drawing::XDrawPageSupplier > xTxtDoc( pDocSh->GetBaseModel(),
                                                         UNO_QUERY );
        ASSERT( xTxtDoc.is(),
                "drawing::XDrawPageSupplier nicht vom XModel erhalten" );
        xDrawPage = xTxtDoc->getDrawPage();
        ASSERT( xDrawPage.is(), "drawing::XDrawPage nicht erhalten" );
    }
    return xDrawPage;
}

const Reference< container::XIndexContainer >& SwHTMLForm_Impl::GetForms()
{
    if( !xForms.is() )
    {
        GetDrawPage();
        if( xDrawPage.is() )
        {
            Reference< XFormsSupplier > xFormsSupplier( xDrawPage, UNO_QUERY );
            ASSERT( xFormsSupplier.is(),
                    "XFormsSupplier nicht vom drawing::XDrawPage erhalten" );

            Reference< container::XNameContainer > xNameCont =
                xFormsSupplier->getForms();
            xForms = Reference< container::XIndexContainer >( xNameCont,
                                                              UNO_QUERY );

            ASSERT( xForms.is(), "XForms nicht erhalten" );
        }
    }
    return xForms;
}


const Reference< drawing::XShapes > & SwHTMLForm_Impl::GetShapes()
{
    if( !xShapes.is() )
    {
        GetDrawPage();
        if( xDrawPage.is() )
        {
            xShapes = Reference< drawing::XShapes >( xDrawPage, UNO_QUERY );
            ASSERT( xShapes.is(),
                    "XShapes nicht vom drawing::XDrawPage erhalten" );
        }
    }
    return xShapes;
}

const Reference< script::XEventAttacherManager >&
                                    SwHTMLForm_Impl::GetControlEventManager()
{
    if( !xControlEventManager.is() && xFormComps.is() )
    {
        xControlEventManager =
            Reference< script::XEventAttacherManager >( xFormComps, UNO_QUERY );
        ASSERT( xControlEventManager.is(),
    "Reference< XEventAttacherManager > nicht von xFormComps erhalten" );
    }

    return xControlEventManager;
}

const Reference< script::XEventAttacherManager >&
    SwHTMLForm_Impl::GetFormEventManager()
{
    if( !xFormEventManager.is() )
    {
        GetForms();
        if( xForms.is() )
        {
            xFormEventManager =
                Reference< script::XEventAttacherManager >( xForms, UNO_QUERY );
            ASSERT( xFormEventManager.is(),
        "Reference< XEventAttacherManager > nicht von xForms erhalten" );
        }
    }

    return xFormEventManager;
}

class SwHTMLImageWatcher :
    public cppu::WeakImplHelper2< awt::XImageConsumer, XEventListener >
{
    Reference< drawing::XShape >        xShape;     // das control
    Reference< XImageProducerSupplier > xSrc;
    Reference< awt::XImageConsumer >    xThis;      // man selbst
    sal_Bool                            bSetWidth;
    sal_Bool                            bSetHeight;

    void clear();

public:

    SwHTMLImageWatcher( const Reference< drawing::XShape > & rShape,
                        sal_Bool bWidth, sal_Bool bHeight );
    ~SwHTMLImageWatcher();

    // startProduction darf nicht im Konstruktor gerufen werden, weil
    // wir und ggf. selbst zerstoeren ... Deshlab eine eigene Methode.
    void start() { xSrc->getImageProducer()->startProduction(); }

    // UNO Anbindung

    // XImageConsumer
    virtual void SAL_CALL init( sal_Int32 Width, sal_Int32 Height)
        throw( uno::RuntimeException );
    virtual void SAL_CALL setColorModel(
            sal_Int16 BitCount, const uno::Sequence< sal_Int32 >& RGBAPal,
            sal_Int32 RedMask, sal_Int32 GreenMask, sal_Int32 BlueMask,
            sal_Int32 AlphaMask)
        throw( uno::RuntimeException );
    virtual void SAL_CALL setPixelsByBytes(
            sal_Int32 X, sal_Int32 Y, sal_Int32 Width, sal_Int32 Height,
            const uno::Sequence< sal_Int8 >& ProducerData,
            sal_Int32 Offset, sal_Int32 Scansize)
        throw( uno::RuntimeException );
    virtual void SAL_CALL setPixelsByLongs(
            sal_Int32 X, sal_Int32 Y, sal_Int32 Width, sal_Int32 Height,
            const uno::Sequence< sal_Int32 >& ProducerData,
            sal_Int32 Offset, sal_Int32 Scansize)
        throw( uno::RuntimeException );
    virtual void SAL_CALL complete(
            sal_Int32 Status,
            const Reference< awt::XImageProducer > & Producer)
        throw( uno::RuntimeException );

    // XEventListener
    virtual void SAL_CALL disposing( const EventObject& Source );
};

SwHTMLImageWatcher::SwHTMLImageWatcher(
        const Reference< drawing::XShape >& rShape,
        sal_Bool bWidth, sal_Bool bHeight ) :
    xShape( rShape ),
    bSetWidth( bWidth ), bSetHeight( bHeight )
{
    // Die Quelle des Images merken
    Reference< drawing::XControlShape > xControlShape( xShape, UNO_QUERY );
    Reference< awt::XControlModel > xControlModel(
            xControlShape->getControl() );
    xSrc = Reference< XImageProducerSupplier >( xControlModel, UNO_QUERY );
    ASSERT( xSrc.is(), "Kein XImageProducerSupplier" );

    // Als Event-Listener am Shape anmelden, damit wir es beim dispose
    // loslassen k”nnen ...
    Reference< XEventListener > xEvtLstnr = (XEventListener *)this;
    Reference< XComponent > xComp( xShape, UNO_QUERY );
    xComp->addEventListener( xEvtLstnr );

    // Zum Schluss halten wir noch eine Referenz auf uns selbst, damit
    // wir am Leben bleiben ... (eigentlich sollte das nicht neotig sein,
    // weil wir ja noch an diversen anderen Stellen angemeldet sind)
    xThis = (awt::XImageConsumer *)this;

    // und am ImageProducer anmelden, um die Groesse zu erehalten ...
    xSrc->getImageProducer()->addConsumer( xThis );
}

SwHTMLImageWatcher::~SwHTMLImageWatcher()
{
}

void SwHTMLImageWatcher::clear()
{
    // Am Shape als Event-Listener abmelden
    Reference< XEventListener > xEvtLstnr = (XEventListener *)this;
    Reference< XComponent > xComp( xShape, UNO_QUERY );
    xComp->removeEventListener( xEvtLstnr );

    // Am ImageProducer abmelden
    xSrc->getImageProducer()->removeConsumer( xThis );
}

//------------------------------------------------------------------------------

void SwHTMLImageWatcher::init( sal_Int32 Width, sal_Int32 Height )
    throw( uno::RuntimeException )
{
    ASSERT( bSetWidth || bSetHeight,
            "Breite oder Hoehe muss angepasst werden" );

    // Wenn keine Breite oder Hoehe angegeben ist, ist das das init von
    // der leeren Grafik, die angezeigt wird, bevor der Stream einer
    // asynchron anzuzeigenden Grfik verfuegbar ist.
    if( !Width && !Height )
        return;

    awt::Size aNewSz;
    aNewSz.Width = Width;
    aNewSz.Height = Height;
    if( Application::GetDefaultDevice() )
    {
        Size aTmp(aNewSz.Width, aNewSz.Height);
        aTmp = Application::GetDefaultDevice()
                    ->PixelToLogic( aTmp, MapMode( MAP_100TH_MM ) );
        aNewSz.Width = aTmp.Width();
        aNewSz.Height = aTmp.Height();
    }

    if( !bSetWidth || !bSetHeight )
    {
        awt::Size aSz( xShape->getSize() );
        if( bSetWidth && aNewSz.Height )
        {
            aNewSz.Width *= aSz.Height;
            aNewSz.Width /= aNewSz.Height;
            aNewSz.Height = aSz.Height;
        }
        if( bSetHeight && aNewSz.Width )
        {
            aNewSz.Height *= aSz.Width;
            aNewSz.Height /= aNewSz.Width;
            aNewSz.Width = aSz.Width;
        }
    }
    if( aNewSz.Width < MINFLY )
        aNewSz.Width = MINFLY;
    if( aNewSz.Height < MINFLY )
        aNewSz.Height = MINFLY;

    xShape->setSize( aNewSz );
    if( bSetWidth )
    {
        // Wenn das Control in einer Tabelle verankert ist, muesen
        // die Tabellen-Spalten neu berechnet werden

        // Um an den SwXShape* zu gelangen, brauchen wir ein Interface,
        // das auch vom SwXShape implementiert wird.

        Reference< beans::XPropertySet > xPropSet( xShape, UNO_QUERY );

        Reference< XUnoTunnel> xTunnel( xPropSet, UNO_QUERY );
        SwXShape *pSwShape = xTunnel.is()
                ? (SwXShape *)xTunnel->getSomething(SwXShape::getUnoTunnelId())
                : 0;

        ASSERT( pSwShape, "Wo ist das SW-Shape?" );
        if( pSwShape )
        {
            SwFrmFmt *pFrmFmt = pSwShape->GetFrmFmt();

            const SwDoc *pDoc = pFrmFmt->GetDoc();
            const SwPosition* pAPos = pFrmFmt->GetAnchor().GetCntntAnchor();
            SwNode *pANd;
            SwTableNode *pTblNd;
            if( pAPos &&
                0 != (pANd = pDoc->GetNodes()[pAPos->nNode]) &&
                0 != (pTblNd = pANd->FindTableNode()) )
            {
                sal_Bool bLastGrf = !pTblNd->GetTable().DecGrfsThatResize();
                SwHTMLTableLayout *pLayout =
                    pTblNd->GetTable().GetHTMLTableLayout();
                if( pLayout )
                {
                    sal_uInt16 nBrowseWidth =
                        pLayout->GetBrowseWidthByTable( *pDoc );

                    if( nBrowseWidth )
                        pLayout->Resize( nBrowseWidth, sal_True, sal_True,
                                         bLastGrf ? HTMLTABLE_RESIZE_NOW
                                                  : 500 );
                }
            }
        }
    }

    // uns selbst abmelden und loeschen
    clear();
    Reference< awt::XImageConsumer >  xTmp = (awt::XImageConsumer*)this;
    xThis = 0;
}

void SwHTMLImageWatcher::setColorModel(
        sal_Int16, const Sequence< sal_Int32 >&, sal_Int32, sal_Int32,
        sal_Int32, sal_Int32 )
    throw( uno::RuntimeException )
{
}

void SwHTMLImageWatcher::setPixelsByBytes(
        sal_Int32, sal_Int32, sal_Int32, sal_Int32,
        const Sequence< sal_Int8 >&, sal_Int32, sal_Int32 )
    throw( uno::RuntimeException )
{
}


void SwHTMLImageWatcher::setPixelsByLongs(
        sal_Int32, sal_Int32, sal_Int32, sal_Int32,
        const Sequence< sal_Int32 >&, sal_Int32, sal_Int32 )
    throw( uno::RuntimeException )
{
}


void SwHTMLImageWatcher::complete( sal_Int32 Status,
        const Reference< awt::XImageProducer >& )
    throw( uno::RuntimeException )
{
    if( IMAGEERROR == Status || IMAGEABORTED == Status )
    {
        // uns selbst abmelden und loeschen
        clear();
        Reference< awt::XImageConsumer > xTmp = (awt::XImageConsumer*)this;
        xThis = 0;
    }
}

void SwHTMLImageWatcher::disposing(const lang::EventObject& evt)
{
    Reference< awt::XImageConsumer > xTmp;

    // Wenn das Shape verschwindet soll muessen wir es loslassen
    Reference< drawing::XShape > xTmpShape;
    if( evt.Source == xShape )
    {
        clear();
        xTmp = (awt::XImageConsumer*)this;
        xThis = 0;
    }
}

void SwHTMLParser::DeleteFormImpl()
{
    delete pFormImpl;
    pFormImpl = 0;
}

static void lcl_html_setFixedFontProperty(
        const Reference< beans::XPropertySet >& rPropSet )
{
    Font aFixedFont( System::GetStandardFont( STDFONT_FIXED ) );

    Any aTmp;
    aTmp <<= OUString( aFixedFont.GetName() );
    rPropSet->setPropertyValue( OUString::createFromAscii("FontName"), aTmp );

    aTmp <<= OUString( aFixedFont.GetStyleName() );
    rPropSet->setPropertyValue( OUString::createFromAscii("FontStyleName"),
                                aTmp );

    aTmp <<= (sal_Int16) aFixedFont.GetFamily();
    rPropSet->setPropertyValue( OUString::createFromAscii("FontFamily"), aTmp );

    aTmp <<= (sal_Int16) aFixedFont.GetCharSet();
    rPropSet->setPropertyValue( OUString::createFromAscii("FontCharset"),
                                aTmp );

    aTmp <<= (sal_Int16) aFixedFont.GetPitch();
    rPropSet->setPropertyValue( OUString::createFromAscii("FontPitch"), aTmp );

    float fVal(10.);
    aTmp.setValue( &fVal, ::getCppuType(&fVal ));
    rPropSet->setPropertyValue( OUString::createFromAscii("FontHeight"), aTmp );
}

class SwHTMLFormPendingStackData_Impl: public SwPendingStackData
{
    Reference< drawing::XShape >    xShape;
    Size            aTextSz;
    sal_Bool        bMinWidth;
    sal_Bool        bMinHeight;

public:

    SwHTMLFormPendingStackData_Impl(
            const Reference< drawing::XShape > & rShape, const Size& rTextSz,
            sal_Bool bMinW, sal_Bool bMinH ) :
        xShape( rShape ),
        aTextSz( rTextSz ),
        bMinWidth( bMinW ),
        bMinHeight( bMinH )
    {}

    const Reference< drawing::XShape >& GetShape() const { return xShape; }
    const Size& GetTextSize() const { return aTextSz; }
    sal_Bool IsMinWidth() const { return bMinWidth; }
    sal_Bool IsMinHeight() const { return bMinHeight; }
};

void SwHTMLParser::SetPendingControlSize( int nToken )
{
    ASSERT( pPendStack, "Wo ist der Pending Stack?" );
    SwHTMLFormPendingStackData_Impl *pData =
        (SwHTMLFormPendingStackData_Impl *)pPendStack->pData;

    SwPendingStack* pTmp = pPendStack->pNext;
    delete pPendStack;
    pPendStack = pTmp;
    ASSERT( !pPendStack, "Wo kommt der Pending-Stack her?" );

    SetControlSize( pData->GetShape(), pData->GetTextSize(),
                    pData->IsMinWidth(), pData->IsMinHeight(),
                    nToken );
    delete pData;
}

void SwHTMLParser::SetControlSize( const Reference< drawing::XShape >& rShape,
                                   const Size& rTextSz,
                                   sal_Bool bMinWidth,
                                   sal_Bool bMinHeight,
                                   int nToken )
{
    if( !rTextSz.Width() && !rTextSz.Height() && !bMinWidth  && !bMinHeight )
        return;

    // Um an den SwXShape* zu gelangen, brauchen wir ein Interface,
    // das auch vom SwXShape implementiert wird.
    Reference< beans::XPropertySet > xPropSet( rShape, UNO_QUERY );

    ViewShell *pVSh;
    pDoc->GetEditShell( &pVSh );
    if( !pVSh && !aLoadEnv.Is() )
    {
        // If there is no view shell by now and the doc shell is an internal
        // one, no view shell will be created. That for, we have to do that of
        // our own. This happens if a linked section is inserted or refreshed.
        SwDocShell *pDocSh = pDoc->GetDocShell();
        if( pDocSh && SFX_CREATE_MODE_INTERNAL == pDocSh->GetCreateMode() )
        {
            SFX_APP()->CreateViewFrame( *pDocSh, 0, sal_True );
            CallStartAction();
            pDoc->GetEditShell( &pVSh );
        }
    }
    if( !pVSh )
    {
        // If there is no view shell by now, but the document is loaded
        // asynchronous, the view shell will be created delayed because
        // the view was locked during the call to DocumentDetected. If this
        // is the case we wait until another call to our DataAvailable
        // link, because the SFX calls it if it creates the view.
        ASSERT( bDocInitalized, "DocumentDetected nocht nicht augerufen" );
        ASSERT( !IsParserWorking() || bDataAvailableLinkSet,
                "Keine ViewShell bei nicht gesetztem DataAvailable-Link" );
        if( IsParserWorking() && bDocInitalized && bDataAvailableLinkSet )
        {
            pPendStack = new SwPendingStack( nToken, pPendStack );
            pPendStack->pData =
                new SwHTMLFormPendingStackData_Impl( rShape, rTextSz,
                                                     bMinWidth, bMinHeight );
            SaveState( nToken );
            eState = SVPAR_PENDING;
        }

        return;
    }

    Reference< XUnoTunnel> xTunnel( xPropSet, UNO_QUERY );
    SwXShape *pSwShape = xTunnel.is()
        ? (SwXShape *)xTunnel->getSomething(SwXShape::getUnoTunnelId())
        : 0;

    ASSERT( pSwShape, "Wo ist das SW-Shape?" );

    // es muss ein Draw-Format sein
    SwFrmFmt *pFrmFmt = pSwShape->GetFrmFmt();
    ASSERT( RES_DRAWFRMFMT == pFrmFmt->Which(), "Kein DrawFrmFmt" );

    // Schauen, ob es ein SdrObject dafuer gibt
    const SdrObject *pObj = pFrmFmt->FindSdrObject();
    ASSERT( pObj, "SdrObject nicht gefunden" );
    ASSERT( FmFormInventor == pObj->GetObjInventor(), "falscher Inventor" );

    SdrUnoObj *pFormObj = PTR_CAST( SdrUnoObj, pObj );
    Reference< awt::XControl > xControl =
        pFormObj->GetUnoControl( pVSh->GetWin() );

    awt::Size aSz( rShape->getSize() );
    awt::Size aNewSz( 0, 0 );
    if( bMinWidth || bMinHeight )
    {
        Reference< awt::XLayoutConstrains > xLC( xControl, UNO_QUERY );
        awt::Size aTmpSz( xLC->getPreferredSize() );
        if( bMinWidth )
            aNewSz.Width = aTmpSz.Width;
        if( bMinHeight )
            aNewSz.Height = aTmpSz.Height;
    }
    if( rTextSz.Width() || rTextSz.Height())
    {
        Reference< awt::XTextLayoutConstrains > xLC( xControl, UNO_QUERY );
        ASSERT( xLC.is(), "kein XTextLayoutConstrains" );
        if( xLC.is() )
        {
            awt::Size aTmpSz( rTextSz.Width(), rTextSz.Height() );
            if( -1 == rTextSz.Width() )
            {
                aTmpSz.Width = 0;
                aTmpSz.Height = nSelectEntryCnt;
            }
            aTmpSz = xLC->getMinimumSize( aTmpSz.Width, aTmpSz.Height );
            if( rTextSz.Width() )
                aNewSz.Width = aTmpSz.Width;
            if( rTextSz.Height() )
                aNewSz.Height = aTmpSz.Height;
        }
    }

    if( Application::GetDefaultDevice() )
    {
        Size aTmpSz( aNewSz.Width, aNewSz.Height );
        aTmpSz = Application::GetDefaultDevice()
                        ->PixelToLogic( aTmpSz, MapMode( MAP_100TH_MM ) );
        aNewSz.Width  = aTmpSz.Width();
        aNewSz.Height = aTmpSz.Height();
    }
    if( aNewSz.Width )
    {
        if( aNewSz.Width < MINLAY )
            aNewSz.Width = MINLAY;
        aSz.Width = aNewSz.Width;
    }
    if( aNewSz.Height )
    {
        if( aNewSz.Height < MINLAY )
            aNewSz.Height = MINLAY;
        aSz.Height = aNewSz.Height;
    }

    rShape->setSize( aSz );
}

static void lcl_html_setEvents(
        const Reference< script::XEventAttacherManager > & rEvtMn,
        sal_uInt32 nPos, const SvxMacroTableDtor& rMacroTbl,
        const SvStringsDtor& rUnoMacroTbl,
        const SvStringsDtor& rUnoMacroParamTbl,
        const String& rType )
{
    // Erstmal muss die Anzahl der Events ermittelt werden ...
    sal_Int32 nEvents = 0;
    for( sal_uInt16 i=0; HTML_ET_END != aEventTypeTable[i]; i++ )
    {
        const SvxMacro *pMacro = rMacroTbl.Get( aEventTypeTable[i] );
        // Solange nicht alle Events implementiert sind, enthaelt die
        // Tabelle auch Leerstrings!
        if( pMacro && aEventListenerTable[i] )
            nEvents++;
    }
    for( i=0; i< rUnoMacroTbl.Count(); i++ )
    {
        const String& rStr = *rUnoMacroTbl[i];
        xub_StrLen nPos = 0;
        if( !rStr.GetToken( 0, '-', nPos ).Len() || STRING_NOTFOUND == nPos )
            continue;
        if( !rStr.GetToken( 0, '-', nPos ).Len() || STRING_NOTFOUND == nPos )
            continue;
        if( nPos < rStr.Len() )
            nEvents++;
    }

    if( 0==nEvents )
        return;

    Sequence<script::ScriptEventDescriptor> aDescs( nEvents );
    script::ScriptEventDescriptor* pDescs = aDescs.getArray();
    sal_Int32 nEvent = 0;

    for( i=0; HTML_ET_END != aEventTypeTable[i]; i++ )
    {
        const SvxMacro *pMacro = rMacroTbl.Get( aEventTypeTable[i] );
        if( pMacro && aEventListenerTable[i] )
        {
            script::ScriptEventDescriptor& rDesc = pDescs[nEvent++];
            rDesc.ListenerType =
                    OUString::createFromAscii(aEventListenerTable[i]);
            rDesc.EventMethod = OUString::createFromAscii(aEventMethodTable[i]);
            rDesc.ScriptType = pMacro->GetLanguage();
            rDesc.ScriptCode = pMacro->GetMacName();
        }
    }

    for( i=0; i< rUnoMacroTbl.Count(); i++ )
    {
        const String& rStr = *rUnoMacroTbl[i];
        xub_StrLen nPos = 0;
        String sListener( rStr.GetToken( 0, '-', nPos ) );
        if( !sListener.Len() || STRING_NOTFOUND == nPos )
            continue;

        String sMethod( rStr.GetToken( 0, '-', nPos ) );
        if( !sMethod.Len() || STRING_NOTFOUND == nPos )
            continue;

        String sCode( rStr.Copy( nPos ) );
        if( !sCode.Len() )
            continue;

        script::ScriptEventDescriptor& rDesc = pDescs[nEvent++];
        rDesc.ListenerType = sListener;
        rDesc.EventMethod = sMethod;
        rDesc.ScriptType = rType;
        rDesc.ScriptCode = sCode;
        rDesc.AddListenerParam = OUString();

        if( rUnoMacroParamTbl.Count() )
        {
            String sSearch( sListener );
            sSearch += '-';
            sSearch += sMethod;
            sSearch += '-';
            xub_StrLen nLen = sSearch.Len();
            for( sal_uInt16 j=0; j < rUnoMacroParamTbl.Count(); j++ )
            {
                const String& rParam = *rUnoMacroParamTbl[j];
                if( rParam.CompareTo( sSearch, nLen ) == COMPARE_EQUAL &&
                    rParam.Len() > nLen )
                {
                    rDesc.AddListenerParam = rParam.Copy(nLen);
                    break;
                }
            }
        }
    }
    rEvtMn->registerScriptEvents( nPos, aDescs );
}

static void lcl_html_getEvents( const String& rOption, const String& rValue,
                                SvStringsDtor& rUnoMacroTbl,
                                SvStringsDtor& rUnoMacroParamTbl )
{
    if( rOption.CompareIgnoreCaseToAscii( sHTML_O_sdevent,
                            sizeof(sHTML_O_sdevent)-1 ) == COMPARE_EQUAL )
    {
        String *pEvent = new String( rOption.Copy(sizeof(sHTML_O_sdevent)-1) );
        *pEvent += '-';
        *pEvent += rValue;
        rUnoMacroTbl.Insert( pEvent, rUnoMacroTbl.Count() );
    }
    else if( rOption.CompareIgnoreCaseToAscii( sHTML_O_sdaddparam,
                            sizeof(sHTML_O_sdaddparam)-1 ) == COMPARE_EQUAL )
    {
        String *pParam =
                    new String( rOption.Copy( sizeof(sHTML_O_sdaddparam)-1 ) );
        *pParam += '-';
        *pParam += rValue;
        rUnoMacroParamTbl.Insert( pParam, rUnoMacroParamTbl.Count() );
    }
}

Reference< drawing::XShape > SwHTMLParser::InsertControl(
        const Reference< XFormComponent > & rFComp,
        const Reference< beans::XPropertySet > & rFCompPropSet,
        const Size& rSize, SwVertOrient eVertOri, SwHoriOrient eHoriOri,
        SfxItemSet& rCSS1ItemSet, SvxCSS1PropertyInfo& rCSS1PropInfo,
        const SvxMacroTableDtor& rMacroTbl, const SvStringsDtor& rUnoMacroTbl,
        const SvStringsDtor& rUnoMacroParamTbl, sal_Bool bSetFCompPropSet,
        sal_Bool bHidden )
{
    Reference< drawing::XShape >  xShape;

    const Reference< container::XIndexContainer > & rFormComps =
        pFormImpl->GetFormComps();
    Any aAny( &rFComp, ::getCppuType( (Reference< XFormComponent>*)0 ) );
    rFormComps->insertByIndex( rFormComps->getCount(), aAny );

    if( !bHidden )
    {
        Any aTmp;
        sal_uInt16 nLeftSpace = 0, nRightSpace = 0,
                      nUpperSpace = 0, nLowerSpace = 0;

        const Reference< XMultiServiceFactory > & rServiceFactory =
            pFormImpl->GetServiceFactory();
        if( !rServiceFactory.is() )
            return xShape;

        Reference< XInterface > xCreate =
            rServiceFactory ->createInstance(
                OUString::createFromAscii("com.sun.star.drawing.ControlShape"));
        if( !xCreate.is() )
            return xShape;

        xShape = Reference< drawing::XShape >( xCreate, UNO_QUERY );

        DBG_ASSERT( xShape.is(), "XShape nicht erhalten" );
        awt::Size aTmpSz;
        aTmpSz.Width  = rSize.Width();
        aTmpSz.Height = rSize.Height();
        xShape->setSize( aTmpSz );

        Reference< beans::XPropertySet > xShapePropSet( xCreate, UNO_QUERY );

        // linken/rechten Rand setzen
        const SfxPoolItem *pItem;
        if( SFX_ITEM_SET==rCSS1ItemSet.GetItemState( RES_LR_SPACE, sal_True,
                                                     &pItem ) )
        {
            // Ggf. den Erstzeilen-Einzug noch plaetten
            const SvxLRSpaceItem *pLRItem = (const SvxLRSpaceItem *)pItem;
            SvxLRSpaceItem aLRItem( *pLRItem );
            aLRItem.SetTxtFirstLineOfst( 0 );
            if( rCSS1PropInfo.bLeftMargin )
            {
                nLeftSpace = TWIP_TO_MM100( aLRItem.GetLeft() );
                rCSS1PropInfo.bLeftMargin = sal_False;
            }
            if( rCSS1PropInfo.bRightMargin )
            {
                nRightSpace = TWIP_TO_MM100( aLRItem.GetRight() );
                rCSS1PropInfo.bRightMargin = sal_False;
            }
            rCSS1ItemSet.ClearItem( RES_LR_SPACE );
        }
        if( nLeftSpace || nRightSpace )
        {
            Any aTmp;
            aTmp <<= (sal_Int32)nLeftSpace;
            xShapePropSet->setPropertyValue(
                    OUString::createFromAscii( "LeftMargin" ), aTmp );

            aTmp <<= (sal_Int32)nRightSpace;
            xShapePropSet->setPropertyValue(
                    OUString::createFromAscii( "RightMargin" ), aTmp );
        }

        // oberen/unteren Rand setzen
        if( SFX_ITEM_SET==rCSS1ItemSet.GetItemState( RES_UL_SPACE, sal_True,
                                                     &pItem ) )
        {
            // Ggf. den Erstzeilen-Einzug noch plaetten
            const SvxULSpaceItem *pULItem = (const SvxULSpaceItem *)pItem;
            if( rCSS1PropInfo.bTopMargin )
            {
                nUpperSpace = TWIP_TO_MM100( pULItem->GetUpper() );
                rCSS1PropInfo.bTopMargin = sal_False;
            }
            if( rCSS1PropInfo.bBottomMargin )
            {
                nLowerSpace = TWIP_TO_MM100( pULItem->GetLower() );
                rCSS1PropInfo.bBottomMargin = sal_False;
            }

            rCSS1ItemSet.ClearItem( RES_UL_SPACE );
        }
        if( nUpperSpace || nLowerSpace )
        {
            uno::Any aTmp;
            aTmp <<= (sal_Int32)nUpperSpace;
            xShapePropSet->setPropertyValue(
                    OUString::createFromAscii( "TopMargin" ), aTmp );

            aTmp <<= (sal_Int32)nLowerSpace;
            xShapePropSet->setPropertyValue(
                    OUString::createFromAscii( "BottomMargin" ), aTmp );
        }

        Reference< beans::XPropertySetInfo > xPropSetInfo =
            rFCompPropSet->getPropertySetInfo();
        OUString sPropName = OUString::createFromAscii( "BackgroundColor" );
        if( SFX_ITEM_SET==rCSS1ItemSet.GetItemState( RES_BACKGROUND, sal_True,
                                                     &pItem ) &&
            xPropSetInfo->hasPropertyByName( sPropName ) )
        {
            const Color &rColor = ((const SvxBrushItem *)pItem)->GetColor();
            if( !rColor.GetTransparency() )
            {
                aTmp <<= (sal_Int32)rColor.GetRGBColor();
                rFCompPropSet->setPropertyValue( sPropName, aTmp );
            }

        }

        sPropName = OUString::createFromAscii( "TextColor" );
        if( SFX_ITEM_SET==rCSS1ItemSet.GetItemState( RES_CHRATR_COLOR, sal_True,
                                                     &pItem ) &&
            xPropSetInfo->hasPropertyByName( sPropName ) )
        {
            aTmp <<= (sal_Int32)((const SvxColorItem *)pItem)->GetValue()
                                                         .GetRGBColor();
            rFCompPropSet->setPropertyValue( sPropName, aTmp );
        }

        sPropName = OUString::createFromAscii( "FontHeight" );
        if( SFX_ITEM_SET==rCSS1ItemSet.GetItemState( RES_CHRATR_FONTSIZE,
                                                     sal_True, &pItem ) &&
            xPropSetInfo->hasPropertyByName( sPropName ) )
        {
            float fVal =
                ((float)((SvxFontHeightItem *)pItem)->GetHeight()) / 20.;
            aTmp.setValue( &fVal, ::getCppuType(&fVal));
            rFCompPropSet->setPropertyValue( sPropName, aTmp );
        }

        if( SFX_ITEM_SET==rCSS1ItemSet.GetItemState( RES_CHRATR_FONT, sal_True,
                                                     &pItem ) )
        {
            const SvxFontItem *pFontItem = (SvxFontItem *)pItem;
            sPropName = OUString::createFromAscii( "FontName" );
            if( xPropSetInfo->hasPropertyByName( sPropName ) )
            {
                aTmp <<= OUString( pFontItem->GetFamilyName() );
                rFCompPropSet->setPropertyValue( sPropName, aTmp );
            }
            sPropName = OUString::createFromAscii( "FontStyleName" );
            if( xPropSetInfo->hasPropertyByName( sPropName ) )
            {
                aTmp <<= OUString( pFontItem->GetStyleName() );
                rFCompPropSet->setPropertyValue( sPropName, aTmp );
            }
            sPropName = OUString::createFromAscii( "FontFamily" );
            if( xPropSetInfo->hasPropertyByName( sPropName ) )
            {
                aTmp <<= (sal_Int16)pFontItem->GetFamily() ;
                rFCompPropSet->setPropertyValue( sPropName, aTmp );
            }
            sPropName = OUString::createFromAscii( "FontCharset" );
            if( xPropSetInfo->hasPropertyByName( sPropName ) )
            {
                aTmp <<= (sal_Int16)pFontItem->GetCharSet() ;
                rFCompPropSet->setPropertyValue( sPropName, aTmp );
            }
            sPropName = OUString::createFromAscii( "FontPitch" );
            if( xPropSetInfo->hasPropertyByName( sPropName ) )
            {
                aTmp <<= (sal_Int16)pFontItem->GetPitch() ;
                rFCompPropSet->setPropertyValue( sPropName, aTmp );
            }
        }

        sPropName = OUString::createFromAscii( "FontWeight" );
        if( SFX_ITEM_SET==rCSS1ItemSet.GetItemState( RES_CHRATR_WEIGHT,
                                                     sal_True, &pItem ) &&
            xPropSetInfo->hasPropertyByName( sPropName ) )
        {
            float fVal = VCLUnoHelper::ConvertFontWeight(
                    ((SvxWeightItem *)pItem)->GetWeight() );
            aTmp.setValue( &fVal, ::getCppuType(&fVal));
            rFCompPropSet->setPropertyValue( sPropName, aTmp );
        }

        sPropName = OUString::createFromAscii( "FontSlant" );
        if( SFX_ITEM_SET==rCSS1ItemSet.GetItemState( RES_CHRATR_POSTURE,
                                                     sal_True, &pItem ) &&
            xPropSetInfo->hasPropertyByName( sPropName ) )
        {
            aTmp <<= (sal_Int16)((SvxPostureItem *)pItem)->GetPosture();
            rFCompPropSet->setPropertyValue( sPropName, aTmp );
        }

        sPropName = OUString::createFromAscii( "FontUnderline" );
        if( SFX_ITEM_SET==rCSS1ItemSet.GetItemState( RES_CHRATR_UNDERLINE,
                                                     sal_True, &pItem ) &&
            xPropSetInfo->hasPropertyByName( sPropName ) )
        {
            aTmp <<= (sal_Int16)((SvxUnderlineItem *)pItem)->GetUnderline();
            rFCompPropSet->setPropertyValue( sPropName, aTmp );
        }

        sPropName = OUString::createFromAscii( "FontStrikeout" );
        if( SFX_ITEM_SET==rCSS1ItemSet.GetItemState( RES_CHRATR_CROSSEDOUT,
                                                     sal_True, &pItem ) &&
            xPropSetInfo->hasPropertyByName( sPropName ) )
        {
            aTmp <<= (sal_Int16)((SvxCrossedOutItem *)pItem)->GetStrikeout();
            rFCompPropSet->setPropertyValue( sPropName, aTmp );
        }

        Reference< text::XTextRange >  xTxtRg;
        sal_Int16 nAnchorType = text::TextContentAnchorType_AS_CHARACTER;
        sal_Int16 nSurround;
        sal_Bool bSetPos = sal_False, bSetSurround = sal_False;
        sal_Int32 nXPos, nYPos;
        if( SVX_CSS1_POS_ABSOLUTE == rCSS1PropInfo.ePosition &&
            SVX_CSS1_LTYPE_TWIP == rCSS1PropInfo.eLeftType &&
            SVX_CSS1_LTYPE_TWIP == rCSS1PropInfo.eTopType )
        {
            const SwStartNode *pFlySttNd =
                pDoc->GetNodes()[pPam->GetPoint()->nNode]->FindFlyStartNode();

            if( pFlySttNd )
            {
                nAnchorType = text::TextContentAnchorType_AT_FRAME;
                SwPaM aPaM( *pFlySttNd );

                Reference< text::XText >  xDummyTxtRef; // unsauber, aber laut OS geht das ...
                xTxtRg = new SwXTextRange( aPaM, xDummyTxtRef );
            }
            else
            {
                nAnchorType = text::TextContentAnchorType_AT_PAGE;
            }
            nXPos = TWIP_TO_MM100( rCSS1PropInfo.nLeft ) + nLeftSpace;
            nYPos = TWIP_TO_MM100( rCSS1PropInfo.nTop ) + nUpperSpace;
            bSetPos = sal_True;

            nSurround = text::WrapTextMode_THROUGHT;
            bSetSurround = sal_True;
        }
        else if( SVX_ADJUST_LEFT == rCSS1PropInfo.eFloat ||
                 HORI_LEFT == eHoriOri )
        {
            nAnchorType = text::TextContentAnchorType_AT_PARAGRAPH;
            nXPos = nLeftSpace;
            nYPos = nUpperSpace;
            bSetPos = sal_True;
            nSurround = text::WrapTextMode_RIGHT;
            bSetSurround = sal_True;
        }
        else if( VERT_NONE != eVertOri )
        {
            sal_Int16 nVertOri;
            switch( eVertOri )
            {
            case VERT_NONE:
                nVertOri = text::VertOrientation::NONE;
                break;
            case VERT_TOP:
                nVertOri = text::VertOrientation::TOP;
                break;
            case VERT_CENTER:
                nVertOri = text::VertOrientation::CENTER;
                break;
            case VERT_BOTTOM:
                nVertOri = text::VertOrientation::BOTTOM;
                break;
            case VERT_CHAR_TOP:
                nVertOri = text::VertOrientation::CHAR_TOP;
                break;
            case VERT_CHAR_CENTER:
                nVertOri = text::VertOrientation::CHAR_CENTER;
                break;
            case VERT_CHAR_BOTTOM:
                nVertOri = text::VertOrientation::CHAR_BOTTOM;
                break;
            case VERT_LINE_TOP:
                nVertOri = text::VertOrientation::LINE_TOP;
                break;
            case VERT_LINE_CENTER:
                nVertOri = text::VertOrientation::LINE_CENTER;
                break;
            case VERT_LINE_BOTTOM:
                nVertOri = text::VertOrientation::LINE_BOTTOM;
                break;
            }
            aTmp <<= (sal_Int16)nVertOri ;
            xShapePropSet->setPropertyValue(
                    OUString::createFromAscii( "VertOrient" ), aTmp );
        }

        aTmp <<= (sal_Int16)nAnchorType ;
        xShapePropSet->setPropertyValue(
                OUString::createFromAscii( "AnchorType" ), aTmp );

        if( text::TextContentAnchorType_AT_PAGE == nAnchorType )
        {
            aTmp <<= (sal_Int16) 1 ;
            xShapePropSet->setPropertyValue(
                    OUString::createFromAscii( "AnchorPageNo" ), aTmp );
        }
        else
        {
            if( !xTxtRg.is() )
            {
                Reference< text::XText >  xDummyTxtRef; // unsauber, aber laut OS geht das ...
                xTxtRg = new SwXTextRange( *pPam, xDummyTxtRef );
            }

            aTmp.setValue( &xTxtRg,
                           ::getCppuType((Reference< text::XTextRange>*)0));
            xShapePropSet->setPropertyValue(
                    OUString::createFromAscii( "TextRange" ), aTmp );
        }

        if( bSetPos )
        {
            aTmp <<= (sal_Int16)text::HoriOrientation::NONE;
            xShapePropSet->setPropertyValue(
                    OUString::createFromAscii( "HoriOrient" ), aTmp );
            aTmp <<= (sal_Int32)nXPos ;
            xShapePropSet->setPropertyValue(
                    OUString::createFromAscii( "HoriOrientPosition" ), aTmp );

            aTmp <<= (sal_Int16)text::VertOrientation::NONE;
            xShapePropSet->setPropertyValue(
                    OUString::createFromAscii( "VertOrient" ), aTmp );
            aTmp <<= (sal_Int32)nYPos ;
            xShapePropSet->setPropertyValue(
                    OUString::createFromAscii( "VertOrientPosition" ), aTmp );
        }
        if( bSetSurround )
        {
            aTmp <<= (sal_Int16)nSurround ;
            xShapePropSet->setPropertyValue(
                    OUString::createFromAscii( "Surround" ), aTmp );
        }

        pFormImpl->GetShapes()->add(xShape);

        // Das Control-Model am Control-Shape setzen
        Reference< drawing::XControlShape > xControlShape( xShape, UNO_QUERY );
        Reference< awt::XControlModel >  xControlModel( rFComp, UNO_QUERY );
        xControlShape->setControl( xControlModel );
    }

    // Da beim Einfuegen der Controls der Fokus gesetzt wird, werden
    // auch schon Fokus-Events verschickt. Damit die nicht evtl. schon
    // vorhendene JavaSCript-Eents rufen, werden die Events nachtraeglich
    // gesetzt.
    if( rMacroTbl.Count() || rUnoMacroTbl.Count() )
    {
        lcl_html_setEvents( pFormImpl->GetControlEventManager(),
                            rFormComps->getCount() - 1,
                            rMacroTbl, rUnoMacroTbl, rUnoMacroParamTbl,
                            GetScriptTypeString(pFormImpl->GetHeaderAttrs()) );
    }

    if( bSetFCompPropSet )
    {
        pFormImpl->SetFCompPropSet( rFCompPropSet );
    }

    return xShape;
}

void SwHTMLParser::NewForm( sal_Bool bAppend )
{
    // Gibt es schon eine Form?
    if( pFormImpl && pFormImpl->GetFormComps().is() )
        return;

    if( bAppend )
    {
        if( pPam->GetPoint()->nContent.GetIndex() )
            AppendTxtNode( AM_SPACE );
        else
            AddParSpace();
    }

    if( !pFormImpl )
        pFormImpl = new SwHTMLForm_Impl( pDoc->GetDocShell() );

    String aAction( sBaseURL );
    String sName, sTarget;
    sal_uInt16 nEncType = FormSubmitEncoding_URL;
    sal_uInt16 nMethod = FormSubmitMethod_GET;
    SvxMacroTableDtor aMacroTbl;
    SvStringsDtor aUnoMacroTbl;
    SvStringsDtor aUnoMacroParamTbl;
    SvKeyValueIterator *pHeaderAttrs = pFormImpl->GetHeaderAttrs();
    ScriptType eDfltScriptType = GetScriptType( pHeaderAttrs );
    const String& rDfltScriptType = GetScriptTypeString( pHeaderAttrs );

    const HTMLOptions *pOptions = GetOptions();
    for( sal_uInt16 i = pOptions->Count(); i; )
    {
        const HTMLOption *pOption = (*pOptions)[--i];
        ScriptType eScriptType = eDfltScriptType;
        sal_uInt16 nEvent;
        sal_Bool bSetEvent = sal_False;

        switch( pOption->GetToken() )
        {
        case HTML_O_ACTION:
            aAction = pOption->GetString();
            break;
        case HTML_O_METHOD:
            nMethod = pOption->GetEnum( aHTMLFormMethodTable, nMethod );
            break;
        case HTML_O_ENCTYPE:
            nEncType = pOption->GetEnum( aHTMLFormEncTypeTable, nEncType );
            break;
        case HTML_O_TARGET:
            sTarget = pOption->GetString();
            break;
        case HTML_O_NAME:
            sName = pOption->GetString();
            break;

        case HTML_O_SDONSUBMIT:
            eScriptType = STARBASIC;
        case HTML_O_ONSUBMIT:
            nEvent = HTML_ET_ONSUBMITFORM;
            bSetEvent = sal_True;
            break;

        case HTML_O_SDONRESET:
            eScriptType = STARBASIC;
        case HTML_O_ONRESET:
            nEvent = HTML_ET_ONRESETFORM;
            bSetEvent = sal_True;
            break;

        default:
            lcl_html_getEvents( pOption->GetTokenString(),
                                pOption->GetString(),
                                aUnoMacroTbl, aUnoMacroParamTbl );
            break;
        }

        if( bSetEvent )
        {
            String sEvent( pOption->GetString() );
            if( sEvent.Len() )
            {
                sEvent.ConvertLineEnd();
                String aScriptType;
                if( EXTENDED_STYPE==eScriptType )
                    aScriptType = rDfltScriptType;
                aMacroTbl.Insert( nEvent, new SvxMacro( sEvent, aScriptType,
                                  eScriptType ) );
            }
        }
    }

    const Reference< XMultiServiceFactory > & rSrvcMgr =
        pFormImpl->GetServiceFactory();
    if( !rSrvcMgr.is() )
        return;

    Reference< XInterface > xInt = rSrvcMgr->createInstance(
            OUString::createFromAscii( "com.sun.star.form.component.Form" ) );
    if( !xInt.is() )
        return;

    Reference< XForm >  xForm( xInt, UNO_QUERY );
    DBG_ASSERT( xForm.is(), "keine Form?" );

    Reference< container::XIndexContainer > xFormComps( xForm, UNO_QUERY );
    pFormImpl->SetFormComps( xFormComps );

    Reference< beans::XPropertySet > xFormPropSet( xForm, UNO_QUERY );

    Any aTmp;
    aTmp <<= OUString(sName);
    xFormPropSet->setPropertyValue( OUString::createFromAscii( "Name" ), aTmp );

    if( aAction.Len() )
    {
        aAction = INetURLObject::RelToAbs(aAction);
    }
    else
    {
        // Bei leerer URL das Directory nehmen
        INetURLObject aURLObj( aPathToFile );
        aAction = aURLObj.GetPartBeforeLastName();
    }
    aTmp <<= OUString(aAction);
    xFormPropSet->setPropertyValue( OUString::createFromAscii( "TargetURL" ),
                                    aTmp );

    FormSubmitMethod eMethod = (FormSubmitMethod)nMethod;
    aTmp.setValue( &eMethod, ::getCppuType((const FormSubmitMethod*)0) );
    xFormPropSet->setPropertyValue( OUString::createFromAscii( "SubmitMethod" ),
                                    aTmp );

     FormSubmitEncoding eEncType = (FormSubmitEncoding)nEncType;
    aTmp.setValue( &eEncType, ::getCppuType((const FormSubmitEncoding*)0) );
    xFormPropSet->setPropertyValue(
            OUString::createFromAscii( "SubmitEncoding" ), aTmp );

    if( sTarget.Len() )
    {
        aTmp <<= OUString(sTarget);
        xFormPropSet->setPropertyValue(
                OUString::createFromAscii( "TargetFrame" ), aTmp );
    }

    const Reference< container::XIndexContainer > & rForms =
        pFormImpl->GetForms();
    Any aAny( &xForm, ::getCppuType((Reference< XForm>*)0) );
    rForms->insertByIndex( rForms->getCount(), aAny );
    if( aMacroTbl.Count() )
        lcl_html_setEvents( pFormImpl->GetFormEventManager(),
                            rForms->getCount() - 1,
                            aMacroTbl, aUnoMacroTbl, aUnoMacroParamTbl,
                            rDfltScriptType );
}

void SwHTMLParser::EndForm( sal_Bool bAppend )
{
    if( pFormImpl && pFormImpl->GetFormComps().is() )
    {
        if( bAppend )
        {
            if( pPam->GetPoint()->nContent.GetIndex() )
                AppendTxtNode( AM_SPACE );
            else
                AddParSpace();
        }

        pFormImpl->ReleaseFormComps();
    }
}

void SwHTMLParser::InsertInput()
{
    if( pPendStack )
    {
        SetPendingControlSize( HTML_INPUT );
        return;
    }

    if( !pFormImpl || !pFormImpl->GetFormComps().is() )
        return;

    String sImgSrc, aId, aClass, aStyle, sText;
    String sName;
    SvxMacroTableDtor aMacroTbl;
    SvStringsDtor aUnoMacroTbl;
    SvStringsDtor aUnoMacroParamTbl;
    sal_uInt16 nSize = 0;
    sal_Int16 nMaxLen = 0;
    sal_Int16 nChecked = STATE_NOCHECK;
    sal_Int32 nTabIndex = TABINDEX_MAX + 1;
    HTMLInputType eType = HTML_IT_TEXT;
    sal_Bool bDisabled = sal_False, bValue = sal_False;
    sal_Bool bSetGrfWidth = sal_False, bSetGrfHeight = sal_False;
    sal_Bool bHidden = sal_False;
    long nWidth=0, nHeight=0;
    SwVertOrient eVertOri = VERT_TOP;
    SwHoriOrient eHoriOri = HORI_NONE;
    SvKeyValueIterator *pHeaderAttrs = pFormImpl->GetHeaderAttrs();
    ScriptType eDfltScriptType = GetScriptType( pHeaderAttrs );
    const String& rDfltScriptType = GetScriptTypeString( pHeaderAttrs );

    sal_uInt16 nKeepCRLFToken = HTML_O_VALUE;
    const HTMLOptions *pOptions = GetOptions( &nKeepCRLFToken );
    for( sal_uInt16 i = pOptions->Count(); i; )
    {
        const HTMLOption *pOption = (*pOptions)[--i];
        ScriptType eScriptType = eDfltScriptType;
        sal_uInt16 nEvent;
        sal_Bool bSetEvent = sal_False;

        switch( pOption->GetToken() )
        {
        case HTML_O_ID:
            aId = pOption->GetString();
            break;
        case HTML_O_STYLE:
            aStyle = pOption->GetString();
            break;
        case HTML_O_CLASS:
            aClass = pOption->GetString();
            break;
        case HTML_O_TYPE:
            eType = pOption->GetInputType();
            break;
        case HTML_O_NAME:
            sName = pOption->GetString();
            break;
        case HTML_O_VALUE:
            sText = pOption->GetString();
            bValue = sal_True;
            break;
        case HTML_O_CHECKED:
            nChecked = STATE_CHECK;
            break;
        case HTML_O_DISABLED:
            bDisabled = sal_True;
            break;
        case HTML_O_MAXLENGTH:
            nMaxLen = (sal_Int16)pOption->GetNumber();
            break;
        case HTML_O_SIZE:
            nSize = (sal_uInt16)pOption->GetNumber();
            break;
        case HTML_O_SRC:
            sImgSrc = pOption->GetString();
            break;
        case HTML_O_WIDTH:
            // erstmal nur als Pixelwerte merken!
            nWidth = pOption->GetNumber();
            break;
        case HTML_O_HEIGHT:
            // erstmal nur als Pixelwerte merken!
            nHeight = pOption->GetNumber();
            break;
        case HTML_O_ALIGN:
            eVertOri =
                (SwVertOrient)pOption->GetEnum( aHTMLImgVAlignTable,
                                                eVertOri );
            eHoriOri =
                (SwHoriOrient)pOption->GetEnum( aHTMLImgHAlignTable,
                                                eHoriOri );
            break;
        case HTML_O_TABINDEX:
            // erstmal nur als Pixelwerte merken!
            nTabIndex = pOption->GetNumber();
            break;

        case HTML_O_SDONFOCUS:
            eScriptType = STARBASIC;
        case HTML_O_ONFOCUS:
            nEvent = HTML_ET_ONGETFOCUS;
            bSetEvent = sal_True;
            break;

        case HTML_O_SDONBLUR:               // eigtl. nur EDIT
            eScriptType = STARBASIC;
        case HTML_O_ONBLUR:
            nEvent = HTML_ET_ONLOSEFOCUS;
            bSetEvent = sal_True;
            break;

        case HTML_O_SDONCLICK:
            eScriptType = STARBASIC;
        case HTML_O_ONCLICK:
            nEvent = HTML_ET_ONCLICK;
            bSetEvent = sal_True;
            break;

        case HTML_O_SDONCHANGE:             // eigtl. nur EDIT
            eScriptType = STARBASIC;
        case HTML_O_ONCHANGE:
            nEvent = HTML_ET_ONCHANGE;
            bSetEvent = sal_True;
            break;

        case HTML_O_SDONSELECT:             // eigtl. nur EDIT
            eScriptType = STARBASIC;
        case HTML_O_ONSELECT:
            nEvent = HTML_ET_ONSELECT;
            bSetEvent = sal_True;
            break;

        default:
            lcl_html_getEvents( pOption->GetTokenString(),
                                pOption->GetString(),
                                aUnoMacroTbl, aUnoMacroParamTbl );
            break;
        }

        if( bSetEvent )
        {
            String sEvent( pOption->GetString() );
            if( sEvent.Len() )
            {
                sEvent.ConvertLineEnd();
                String aScriptType;
                if( EXTENDED_STYPE==eScriptType )
                    aScriptType = rDfltScriptType;
                aMacroTbl.Insert( nEvent, new SvxMacro( sEvent, aScriptType,
                                  eScriptType ) );
            }
        }
    }

    if( HTML_IT_IMAGE==eType )
    {
        // Image-Controls ohne Image-URL werden ignoriert (wie bei MS)
        if( !sImgSrc.Len() )
            return;
    }
#if 0
    else if( HTML_IT_HIDDEN!=eType )
    {
        // Obwohl Netscape und MS-IE nur Iamge-Buttons ausrichten koennen,
        // werten wir ALIGN fuer alle Controls aus.
        if( VERT_NONE == eVertOri )
            eVertOri = VERT_TOP;
    }
#else
    else
    {
        // ALIGN fuer alle Controls auszuwerten ist keine so gute Idee,
        // solange Absatz-gebundene Controls die Hoehe von Tabellen-Zellen
        // nicht beeinflussen
        // (#64110#, http://www.telekom.de/katalog-online/onlineshop.html)
        eVertOri = VERT_TOP;
        eHoriOri = HORI_NONE;
    }
#endif

    // Defaults entsprechen HTML_IT_TEXT
    const sal_Char *pType = "TextField";
    sal_Bool bKeepCRLFInValue = sal_False;
    switch( eType )
    {
    case HTML_IT_CHECKBOX:
        pType = "CheckBox";
        bKeepCRLFInValue = sal_True;
        break;

    case HTML_IT_RADIO:
        pType = "RadioButton";
        bKeepCRLFInValue = sal_True;
        break;

    case HTML_IT_PASSWORD:
        bKeepCRLFInValue = sal_True;
        break;

    case HTML_IT_BUTTON:
        bKeepCRLFInValue = sal_True;
    case HTML_IT_SUBMIT:
    case HTML_IT_RESET:
        pType = "CommandButton";
        break;

    case HTML_IT_IMAGE:
        pType = "ImageButton";
        break;

    case HTML_IT_FILE:
        pType = "FileControl";
        break;

    case HTML_IT_HIDDEN:
        pType = "HiddenControl";
        bKeepCRLFInValue = sal_True;
        break;
    }

    // Fuer ein par Controls mussen CR/LF noch aus dem VALUE
    // geloescht werden.
    if( !bKeepCRLFInValue )
    {
        sText.EraseAllChars( _CR );
        sText.EraseAllChars( _LF );
    }

    const Reference< XMultiServiceFactory > & rServiceFactory =
        pFormImpl->GetServiceFactory();
    if( !rServiceFactory.is() )
        return;

    String sServiceName(
            OUString::createFromAscii("com.sun.star.form.component.") );
    sServiceName.AppendAscii( pType );
    Reference< XInterface > xInt =
        rServiceFactory->createInstance( sServiceName );
    if( !xInt.is() )
        return;

    Reference< XFormComponent > xFComp( xInt, UNO_QUERY );
    if( !xFComp.is() )
        return;

    Reference< beans::XPropertySet > xPropSet( xFComp, UNO_QUERY );

    Any aTmp;
    aTmp <<= OUString(sName);
    xPropSet->setPropertyValue( OUString::createFromAscii( "Name" ), aTmp );

    if( HTML_IT_HIDDEN != eType  )
    {
        if( nTabIndex >= TABINDEX_MIN && nTabIndex <= TABINDEX_MAX  )
        {
            aTmp <<= (sal_Int16) (sal_Int16)nTabIndex ;
            xPropSet->setPropertyValue( OUString::createFromAscii( "TabIndex" ), aTmp );
        }

        if( bDisabled )
        {
            BOOL bFalse = sal_False;
            aTmp.setValue(&bFalse, ::getBooleanCppuType()  );
            xPropSet->setPropertyValue( OUString::createFromAscii( "Enabled" ), aTmp );
        }
    }

    aTmp <<= OUString(sText);

    Size aSz( 0, 0 );       // defaults
    Size aTextSz( 0, 0 );   // Text-Size
    sal_Bool bMinWidth = sal_False, bMinHeight = sal_False;
    sal_Bool bUseSize = sal_False;
    switch( eType )
    {
    case HTML_IT_CHECKBOX:
    case HTML_IT_RADIO:
        {
            if( !bValue )
                aTmp <<= OUString::createFromAscii( sHTML_on );
            xPropSet->setPropertyValue( OUString::createFromAscii( "RefValue" ),
                                        aTmp );
            aTmp <<= OUString();
            xPropSet->setPropertyValue( OUString::createFromAscii( "Label" ),
                                        aTmp );
            // #53559#: Beim RadioButton darf die DefaultChecked-Property
            // erst gesetzt werden, wenn das Control angelegt und ein
            // activateTabOrder gerufen wurde, weil es sonst noch zu der
            // vorhergehenden Gruppe gehoert.
            if( HTML_IT_CHECKBOX == eType )
            {
                aTmp <<= (sal_Int16) nChecked ;
                xPropSet->setPropertyValue(
                        OUString::createFromAscii( "DefaultState" ), aTmp );
            }

            SvxMacro *pMacro = aMacroTbl.Get( HTML_ET_ONCLICK );
            if( pMacro )
            {
                aMacroTbl.Remove( HTML_ET_ONCLICK );
                aMacroTbl.Insert( HTML_ET_ONCLICK_ITEM, pMacro );
            }
            // SIZE auszuwerten duerfte hier keinen Sinn machen???
            bMinWidth = bMinHeight = sal_True;
        }
        break;

    case HTML_IT_IMAGE:
        {
            // SIZE = WIDTH
            aSz.Width() = nSize ? nSize : nWidth;
            aSz.Width() = nWidth;
            aSz.Height() = nHeight;
            if( (aSz.Width() || aSz.Height()) && Application::GetDefaultDevice() )
            {
                aSz = Application::GetDefaultDevice()
                    ->PixelToLogic( aSz, MapMode( MAP_100TH_MM ) );
            }
             FormButtonType eButtonType = FormButtonType_SUBMIT;
            aTmp.setValue( &eButtonType,
                           ::getCppuType((const FormButtonType*)0));
            xPropSet->setPropertyValue(
                    OUString::createFromAscii( "ButtonType" ), aTmp );

            aTmp <<= (sal_Int16) 0  ;
            xPropSet->setPropertyValue( OUString::createFromAscii( "Border" ),
                                        aTmp );
        }
        break;

    case HTML_IT_BUTTON:
    case HTML_IT_SUBMIT:
    case HTML_IT_RESET:
        {
             FormButtonType eButtonType;
            switch( eType )
            {
            case HTML_IT_BUTTON:
                eButtonType = FormButtonType_PUSH;
                break;
            case HTML_IT_SUBMIT:
                eButtonType = FormButtonType_SUBMIT;
                if( !sText.Len() )
                    sText.AssignAscii( sHTML_IT_submit );
                break;
            case HTML_IT_RESET:
                eButtonType = FormButtonType_RESET;
                if( !sText.Len() )
                    sText.AssignAscii( sHTML_IT_reset );
                break;
            }
            aTmp <<= OUString(sText);
            xPropSet->setPropertyValue( OUString::createFromAscii( "Label" ),
                                        aTmp );

            aTmp.setValue( &eButtonType,
                           ::getCppuType((const FormButtonType*)0));
            xPropSet->setPropertyValue(
                            OUString::createFromAscii( "ButtonType" ), aTmp );

            bMinWidth = bMinHeight = sal_True;
            bUseSize = sal_True;
        }
        break;

    case HTML_IT_PASSWORD:
    case HTML_IT_TEXT:
    case HTML_IT_FILE:
        if( HTML_IT_FILE != eType )
        {
        // Beim File-Control wird der VALUE aus Sicherheitsgruenden ignoriert.
            xPropSet->setPropertyValue(
                    OUString::createFromAscii( "DefaultText" ), aTmp );
            if( nMaxLen != 0 )
            {
                aTmp <<= (sal_Int16) nMaxLen ;
                xPropSet->setPropertyValue(
                        OUString::createFromAscii( "MaxTextLen" ), aTmp );
            }
        }

        if( HTML_IT_PASSWORD == eType )
        {
            aTmp <<= (sal_Int16)'*' ;
            xPropSet->setPropertyValue( OUString::createFromAscii( "EchoChar" ),
                                        aTmp );
        }

        lcl_html_setFixedFontProperty( xPropSet );

        if( !nSize )
            nSize = 20;
        aTextSz.Width() = nSize;
        bMinHeight = sal_True;
        break;

    case HTML_IT_HIDDEN:
        xPropSet->setPropertyValue( OUString::createFromAscii( "HiddenValue" ),
                                    aTmp );
        bHidden = sal_True;
        break;
    }

    if( bUseSize && nSize>0 )
    {
        if( Application::GetDefaultDevice() )
        {
            Size aNewSz( nSize, 0 );
            aNewSz = Application::GetDefaultDevice()
                        ->PixelToLogic( aNewSz, MapMode( MAP_100TH_MM ) );
            aSz.Width() = aNewSz.Width();
            ASSERT( !aTextSz.Width(), "Text-Breite ist gegeben" );
            bMinWidth = sal_False;
        }
    }

    SfxItemSet aCSS1ItemSet( pDoc->GetAttrPool(), pCSS1Parser->GetWhichMap() );
    SvxCSS1PropertyInfo aCSS1PropInfo;
    if( HasStyleOptions( aStyle, aId, aClass ) )
    {
        ParseStyleOptions( aStyle, aId, aClass, aCSS1ItemSet, aCSS1PropInfo );
        if( aId.Len() )
            InsertBookmark( aId );
    }

    if( SVX_CSS1_LTYPE_TWIP== aCSS1PropInfo.eWidthType )
    {
        aSz.Width() = TWIP_TO_MM100( aCSS1PropInfo.nWidth );
        aTextSz.Width() = 0;
        bMinWidth = sal_False;
    }
    if( SVX_CSS1_LTYPE_TWIP== aCSS1PropInfo.eHeightType )
    {
        aSz.Height() = TWIP_TO_MM100( aCSS1PropInfo.nHeight );
        aTextSz.Height() = 0;
        bMinHeight = sal_False;
    }

    // Beim Image-Button bei nicht gegebern Groesse einen sinnvollen Default
    // setzen
    if( HTML_IT_IMAGE== eType )
    {
        if( !aSz.Width() )
        {
            aSz.Width() = HTML_DFLT_IMG_WIDTH;
            bSetGrfWidth = sal_True;
            if( pTable != 0 )
                IncGrfsThatResizeTable();
        }
        if( !aSz.Height() )
        {
            aSz.Height() = HTML_DFLT_IMG_HEIGHT;
            bSetGrfHeight = sal_True;
        }
    }
    if( aSz.Width() < MINFLY )
        aSz.Width() = MINFLY;
    if( aSz.Height() < MINFLY )
        aSz.Height() = MINFLY;

    Reference< drawing::XShape > xShape = InsertControl(
                                             xFComp, xPropSet, aSz,
                                             eVertOri, eHoriOri,
                                             aCSS1ItemSet, aCSS1PropInfo,
                                             aMacroTbl, aUnoMacroTbl,
                                             aUnoMacroParamTbl, sal_False,
                                             bHidden );
    if( aTextSz.Width() || aTextSz.Height() || bMinWidth || bMinHeight )
    {
        ASSERT( !(bSetGrfWidth || bSetGrfHeight), "Grafikgroesse anpassen???" );
        SetControlSize( xShape, aTextSz, bMinWidth, bMinHeight, HTML_INPUT );
    }

    if( HTML_IT_RADIO == eType )
    {
        aTmp <<= (sal_Int16) nChecked ;
        xPropSet->setPropertyValue( OUString::createFromAscii( "DefaultState" ), aTmp );
    }

    if( HTML_IT_IMAGE == eType )
    {
        // Die URL erst nach dem Einfuegen setzen, weil sich der
        // Download der Grafik erst dann am XModel anmelden kann,
        // wenn das Control eingefuegt ist.
        aTmp <<= OUString(INetURLObject::RelToAbs(sImgSrc));
        xPropSet->setPropertyValue( OUString::createFromAscii( "ImageURL" ),
                                    aTmp );
    }

    if( bSetGrfWidth || bSetGrfHeight )
    {
        SwHTMLImageWatcher* pWatcher =
            new SwHTMLImageWatcher( xShape, bSetGrfWidth, bSetGrfHeight );
        Reference< awt::XImageConsumer > xCons = pWatcher;
        pWatcher->start();
    }
}

void SwHTMLParser::NewTextArea()
{
    if( pPendStack )
    {
        SetPendingControlSize( HTML_TEXTAREA_ON );
        return;
    }

    ASSERT( !bTextArea, "TextArea in TextArea???" );
    ASSERT( !pFormImpl || !pFormImpl->GetFCompPropSet().is(),
            "TextArea in Control???" );

    if( !pFormImpl || !pFormImpl->GetFormComps().is() )
    {
        // Spezialbehandlung fuer TextArea auch untem im Parser beenden
        FinishTextArea();
        return;
    }

    String aId, aClass, aStyle;
    String sName;
    sal_Int32 nTabIndex = TABINDEX_MAX + 1;
    SvxMacroTableDtor aMacroTbl;
    SvStringsDtor aUnoMacroTbl;
    SvStringsDtor aUnoMacroParamTbl;
    sal_uInt16 nRows = 0, nCols = 0;
    sal_uInt16 nWrap = HTML_WM_OFF;
    sal_Bool bDisabled = sal_False;
    SvKeyValueIterator *pHeaderAttrs = pFormImpl->GetHeaderAttrs();
    ScriptType eDfltScriptType = GetScriptType( pHeaderAttrs );
    const String& rDfltScriptType = GetScriptTypeString( pHeaderAttrs );

    const HTMLOptions *pOptions = GetOptions();
    for( sal_uInt16 i = pOptions->Count(); i; )
    {
        const HTMLOption *pOption = (*pOptions)[--i];
        ScriptType eScriptType = eDfltScriptType;
        sal_uInt16 nEvent;
        sal_Bool bSetEvent = sal_False;

        switch( pOption->GetToken() )
        {
        case HTML_O_ID:
            aId = pOption->GetString();
            break;
        case HTML_O_STYLE:
            aStyle = pOption->GetString();
            break;
        case HTML_O_CLASS:
            aClass = pOption->GetString();
            break;
        case HTML_O_NAME:
            sName = pOption->GetString();
            break;
        case HTML_O_DISABLED:
            bDisabled = sal_True;
            break;
        case HTML_O_ROWS:
            nRows = (sal_uInt16)pOption->GetNumber();
            break;
        case HTML_O_COLS:
            nCols = (sal_uInt16)pOption->GetNumber();
            break;
        case HTML_O_WRAP:
            nWrap = pOption->GetEnum( aHTMLTextAreaWrapTable, nWrap );
            break;

        case HTML_O_TABINDEX:
            nTabIndex = pOption->GetSNumber();
            break;

        case HTML_O_SDONFOCUS:
            eScriptType = STARBASIC;
        case HTML_O_ONFOCUS:
            nEvent = HTML_ET_ONGETFOCUS;
            bSetEvent = sal_True;
            break;

        case HTML_O_SDONBLUR:
            eScriptType = STARBASIC;
        case HTML_O_ONBLUR:
            nEvent = HTML_ET_ONLOSEFOCUS;
            bSetEvent = sal_True;
            break;

        case HTML_O_SDONCLICK:
            eScriptType = STARBASIC;
        case HTML_O_ONCLICK:
            nEvent = HTML_ET_ONCLICK;
            bSetEvent = sal_True;
            break;

        case HTML_O_SDONCHANGE:
            eScriptType = STARBASIC;
        case HTML_O_ONCHANGE:
            nEvent = HTML_ET_ONCHANGE;
            bSetEvent = sal_True;
            break;

        case HTML_O_SDONSELECT:
            eScriptType = STARBASIC;
        case HTML_O_ONSELECT:
            nEvent = HTML_ET_ONSELECT;
            bSetEvent = sal_True;
            break;

        default:
            lcl_html_getEvents( pOption->GetTokenString(),
                                pOption->GetString(),
                                aUnoMacroTbl, aUnoMacroParamTbl );
            break;
        }

        if( bSetEvent )
        {
            String sEvent( pOption->GetString() );
            if( sEvent.Len() )
            {
                sEvent.ConvertLineEnd();
                if( EXTENDED_STYPE==eScriptType )
                    aScriptType = rDfltScriptType;
                aMacroTbl.Insert( nEvent, new SvxMacro( sEvent, aScriptType,
                                  eScriptType ) );
            }
        }
    }


    const Reference< lang::XMultiServiceFactory > & rSrvcMgr =
        pFormImpl->GetServiceFactory();
    if( !rSrvcMgr.is() )
    {
        FinishTextArea();
        return;
    }
    Reference< uno::XInterface >  xInt = rSrvcMgr->createInstance(
        OUString::createFromAscii( "com.sun.star.form.component.TextField" ) );
    if( !xInt.is() )
    {
        FinishTextArea();
        return;
    }

    Reference< XFormComponent > xFComp( xInt, UNO_QUERY );
    DBG_ASSERT( xFComp.is(), "keine FormComponent?" );

    Reference< beans::XPropertySet > xPropSet( xFComp, UNO_QUERY );

    Any aTmp;
    aTmp <<= OUString(sName);
    xPropSet->setPropertyValue( OUString::createFromAscii( "Name" ), aTmp );

    BOOL bTrue = sal_True;
    aTmp.setValue( &bTrue, ::getBooleanCppuType() );
    xPropSet->setPropertyValue( OUString::createFromAscii( "MultiLine" ),
                                aTmp );
    xPropSet->setPropertyValue( OUString::createFromAscii( "VScroll" ), aTmp );
    if( HTML_WM_OFF == nWrap )
        xPropSet->setPropertyValue( OUString::createFromAscii( "HScroll" ),
                                    aTmp );
    if( HTML_WM_HARD == nWrap )
        xPropSet->setPropertyValue(
                OUString::createFromAscii( "HardLineBreaks" ), aTmp );

    if( nTabIndex >= TABINDEX_MIN && nTabIndex <= TABINDEX_MAX  )
    {
        aTmp <<= (sal_Int16)nTabIndex ;
        xPropSet->setPropertyValue( OUString::createFromAscii( "TabIndex" ),
                                    aTmp );
    }

    lcl_html_setFixedFontProperty( xPropSet );

    if( bDisabled )
    {
        BOOL bFalse = sal_False;
        aTmp.setValue( &bFalse, ::getBooleanCppuType() );
        xPropSet->setPropertyValue( OUString::createFromAscii( "Enabled" ),
                                    aTmp );
    }

    ASSERT( !pFormImpl->GetText().Len(), "Text ist nicht leer!" );

    if( !nCols )
        nCols = 20;
    if( !nRows )
        nRows = 1;

    Size aTextSz( nCols, nRows );

    SfxItemSet aCSS1ItemSet( pDoc->GetAttrPool(), pCSS1Parser->GetWhichMap() );
    SvxCSS1PropertyInfo aCSS1PropInfo;
    if( HasStyleOptions( aStyle, aId, aClass ) )
    {
        ParseStyleOptions( aStyle, aId, aClass, aCSS1ItemSet, aCSS1PropInfo );
        if( aId.Len() )
            InsertBookmark( aId );
    }

    Size aSz( MINFLY, MINFLY );
    if( SVX_CSS1_LTYPE_TWIP== aCSS1PropInfo.eWidthType )
    {
        aSz.Width() = TWIP_TO_MM100( aCSS1PropInfo.nWidth );
        aTextSz.Width() = 0;
    }
    if( SVX_CSS1_LTYPE_TWIP== aCSS1PropInfo.eHeightType )
    {
        aSz.Height() = TWIP_TO_MM100( aCSS1PropInfo.nHeight );
        aTextSz.Height() = 0;
    }
    if( aSz.Width() < MINFLY )
        aSz.Width() = MINFLY;
    if( aSz.Height() < MINFLY )
        aSz.Height() = MINFLY;

    Reference< drawing::XShape > xShape = InsertControl( xFComp, xPropSet, aSz,
                                      VERT_TOP, HORI_NONE,
                                      aCSS1ItemSet, aCSS1PropInfo,
                                      aMacroTbl, aUnoMacroTbl,
                                      aUnoMacroParamTbl );
    if( aTextSz.Width() || aTextSz.Height() )
        SetControlSize( xShape, aTextSz, sal_False, sal_False,
                        HTML_TEXTAREA_ON );

    // einen neuen Kontext anlegen
    _HTMLAttrContext *pCntxt = new _HTMLAttrContext( HTML_TEXTAREA_ON );

    // und PRE/Listing/XMP voruebergehend aussetzen
    SplitPREListingXMP( pCntxt );
    PushContext( pCntxt );

    bTextArea = sal_True;
    bTAIgnoreNewPara = sal_True;
}

void SwHTMLParser::EndTextArea()
{
    ASSERT( bTextArea, "keine TextArea oder falscher Typ" );
    ASSERT( pFormImpl && pFormImpl->GetFCompPropSet().is(),
            "TextArea fehlt" );

    const Reference< beans::XPropertySet > & rPropSet =
        pFormImpl->GetFCompPropSet();

    Any aTmp;
    aTmp <<= OUString(pFormImpl->GetText());
    rPropSet->setPropertyValue( OUString::createFromAscii( "DefaultText" ),
                                aTmp );
    pFormImpl->EraseText();

    pFormImpl->ReleaseFCompPropSet();

    // den Kontext holen
    _HTMLAttrContext *pCntxt = PopContext( HTML_TEXTAREA_ON );
    if( pCntxt )
    {
        // und ggf. die Attribute beenden
        EndContext( pCntxt );
        delete pCntxt;
    }

    bTextArea = sal_False;
}


void SwHTMLParser::InsertTextAreaText( sal_uInt16 nToken )
{
    ASSERT( bTextArea, "keine TextArea oder falscher Typ" );
    ASSERT( pFormImpl && pFormImpl->GetFCompPropSet().is(),
            "TextArea fehlt" );

    String& rText = pFormImpl->GetText();
    switch( nToken)
    {
    case HTML_TEXTTOKEN:
        rText += aToken;
        break;
    case HTML_NEWPARA:
        if( !bTAIgnoreNewPara )
            rText += '\n';    // das ist hier richtig!!!
        break;
    default:
        rText += '<';
        rText += sSaveToken;
        if( aToken.Len() )
        {
            rText += ' ';
            rText += aToken;
        }
        rText += '>';
    }

    bTAIgnoreNewPara = sal_False;
}

void SwHTMLParser::NewSelect()
{
    if( pPendStack )
    {
        SetPendingControlSize( HTML_SELECT_ON );
        return;
    }

    ASSERT( !bSelect, "Select in Select???" );
    ASSERT( !pFormImpl || !pFormImpl->GetFCompPropSet().is(),
            "Select in Control???" );

    if( !pFormImpl || !pFormImpl->GetFormComps().is() )
        return;

    String aId, aClass, aStyle;
    String sName;
    sal_Int32 nTabIndex = TABINDEX_MAX + 1;
    SvxMacroTableDtor aMacroTbl;
    SvStringsDtor aUnoMacroTbl;
    SvStringsDtor aUnoMacroParamTbl;
    sal_Bool bMultiple = sal_False;
    sal_Bool bDisabled = sal_False;
    nSelectEntryCnt = 1;
    SvKeyValueIterator *pHeaderAttrs = pFormImpl->GetHeaderAttrs();
    ScriptType eDfltScriptType = GetScriptType( pHeaderAttrs );
    const String& rDfltScriptType = GetScriptTypeString( pHeaderAttrs );

    const HTMLOptions *pOptions = GetOptions();
    for( sal_uInt16 i = pOptions->Count(); i; )
    {
        const HTMLOption *pOption = (*pOptions)[--i];
        ScriptType eScriptType = eDfltScriptType;
        sal_uInt16 nEvent;
        sal_Bool bSetEvent = sal_False;

        switch( pOption->GetToken() )
        {
        case HTML_O_ID:
            aId = pOption->GetString();
            break;
        case HTML_O_STYLE:
            aStyle = pOption->GetString();
            break;
        case HTML_O_CLASS:
            aClass = pOption->GetString();
            break;
        case HTML_O_NAME:
            sName = pOption->GetString();
            break;
        case HTML_O_MULTIPLE:
            bMultiple = sal_True;
            break;
        case HTML_O_DISABLED:
            bDisabled = sal_True;
            break;
        case HTML_O_SIZE:
            nSelectEntryCnt = (sal_uInt16)pOption->GetNumber();
            break;

        case HTML_O_TABINDEX:
            nTabIndex = pOption->GetSNumber();
            break;

        case HTML_O_SDONFOCUS:
            eScriptType = STARBASIC;
        case HTML_O_ONFOCUS:
            nEvent = HTML_ET_ONGETFOCUS;
            bSetEvent = sal_True;
            break;

        case HTML_O_SDONBLUR:
            eScriptType = STARBASIC;
        case HTML_O_ONBLUR:
            nEvent = HTML_ET_ONLOSEFOCUS;
            bSetEvent = sal_True;
            break;

        case HTML_O_SDONCLICK:
            eScriptType = STARBASIC;
        case HTML_O_ONCLICK:
            nEvent = HTML_ET_ONCLICK;
            bSetEvent = sal_True;
            break;

        case HTML_O_SDONCHANGE:
            eScriptType = STARBASIC;
        case HTML_O_ONCHANGE:
            nEvent = HTML_ET_ONCHANGE;
            bSetEvent = sal_True;
            break;

        default:
            lcl_html_getEvents( pOption->GetTokenString(),
                                pOption->GetString(),
                                aUnoMacroTbl, aUnoMacroParamTbl );
            break;
        }

        if( bSetEvent )
        {
            String sEvent( pOption->GetString() );
            if( sEvent.Len() )
            {
                sEvent.ConvertLineEnd();
                if( EXTENDED_STYPE==eScriptType )
                    aScriptType = rDfltScriptType;
                aMacroTbl.Insert( nEvent, new SvxMacro( sEvent, aScriptType,
                                  eScriptType ) );
            }
        }
    }

    const Reference< lang::XMultiServiceFactory > & rSrvcMgr =
        pFormImpl->GetServiceFactory();
    if( !rSrvcMgr.is() )
    {
        FinishTextArea();
        return;
    }
    Reference< uno::XInterface >  xInt = rSrvcMgr->createInstance(
        OUString::createFromAscii( "com.sun.star.form.component.ListBox" ) );
    if( !xInt.is() )
    {
        FinishTextArea();
        return;
    }

    Reference< XFormComponent > xFComp( xInt, UNO_QUERY );
    DBG_ASSERT(xFComp.is(), "keine FormComponent?")

    Reference< beans::XPropertySet >  xPropSet( xFComp, UNO_QUERY );

    Any aTmp;
    aTmp <<= OUString(sName);
    xPropSet->setPropertyValue( OUString::createFromAscii( "Name" ), aTmp );

    if( nTabIndex >= TABINDEX_MIN && nTabIndex <= TABINDEX_MAX  )
    {
        aTmp <<= (sal_Int16)nTabIndex ;
        xPropSet->setPropertyValue( OUString::createFromAscii( "TabIndex" ),
                                    aTmp );
    }

    if( bDisabled )
    {
        BOOL bFalse = sal_False;
        aTmp.setValue( &bFalse, ::getBooleanCppuType() );
        xPropSet->setPropertyValue( OUString::createFromAscii( "Enabled" ),
                                    aTmp );
    }

    Size aTextSz( 0, 0 );
    sal_Bool bMinWidth = sal_True, bMinHeight = sal_True;
    if( !bMultiple && 1==nSelectEntryCnt )
    {
        BOOL bTrue = sal_True;
        aTmp.setValue( &bTrue, ::getBooleanCppuType() );
        xPropSet->setPropertyValue( OUString::createFromAscii( "Dropdown" ),
                                    aTmp );
    }
    else
    {
        if( nSelectEntryCnt <= 1 )      // 4 Zeilen als default
            nSelectEntryCnt = 4;

        if( bMultiple )
        {
            BOOL bTrue = sal_True;
            aTmp.setValue( &bTrue, ::getBooleanCppuType() );
            xPropSet->setPropertyValue(
                    OUString::createFromAscii( "MultiSelection" ), aTmp );
        }
        aTextSz.Height() = nSelectEntryCnt;
        bMinHeight = sal_False;
    }

    SfxItemSet aCSS1ItemSet( pDoc->GetAttrPool(), pCSS1Parser->GetWhichMap() );
    SvxCSS1PropertyInfo aCSS1PropInfo;
    if( HasStyleOptions( aStyle, aId, aClass ) )
    {
        ParseStyleOptions( aStyle, aId, aClass, aCSS1ItemSet, aCSS1PropInfo );
        if( aId.Len() )
            InsertBookmark( aId );
    }

    Size aSz( MINFLY, MINFLY );
    bFixSelectWidth = bFixSelectHeight = sal_True;
    if( SVX_CSS1_LTYPE_TWIP== aCSS1PropInfo.eWidthType )
    {
        aSz.Width() = TWIP_TO_MM100( aCSS1PropInfo.nWidth );
        bFixSelectWidth = sal_False;
        bMinWidth = sal_False;
    }
    if( SVX_CSS1_LTYPE_TWIP== aCSS1PropInfo.eHeightType )
    {
        aSz.Height() = TWIP_TO_MM100( aCSS1PropInfo.nHeight );
        aTextSz.Height() = sal_False;
        bMinHeight = sal_False;
    }
    if( aSz.Width() < MINFLY )
        aSz.Width() = MINFLY;
    if( aSz.Height() < MINFLY )
        aSz.Height() = MINFLY;

    Reference< drawing::XShape >  xShape = InsertControl( xFComp, xPropSet, aSz,
                                      VERT_TOP, HORI_NONE,
                                      aCSS1ItemSet, aCSS1PropInfo,
                                      aMacroTbl, aUnoMacroTbl,
                                      aUnoMacroParamTbl );
    if( bFixSelectWidth )
        pFormImpl->SetShape( xShape );
    if( aTextSz.Height() || bMinWidth || bMinHeight )
        SetControlSize( xShape, aTextSz, bMinWidth, bMinHeight,
                        HTML_SELECT_ON );

    // einen neuen Kontext anlegen
    _HTMLAttrContext *pCntxt = new _HTMLAttrContext( HTML_SELECT_ON );

    // und PRE/Listing/XMP voruebergehend aussetzen
    SplitPREListingXMP( pCntxt );
    PushContext( pCntxt );

    bSelect = sal_True;
}

void SwHTMLParser::EndSelect()
{
    if( pPendStack )
    {
        SetPendingControlSize( HTML_SELECT_OFF );
        return;
    }

    ASSERT( bSelect, "keine Select" );
    ASSERT( pFormImpl && pFormImpl->GetFCompPropSet().is(),
            "kein Select-Control" );

    const Reference< beans::XPropertySet > & rPropSet =
        pFormImpl->GetFCompPropSet();

    // die Groesse anpassen
    Size aNewSz( MINFLY, MINFLY );

    sal_uInt16 nEntryCnt = pFormImpl->GetStringList().Count();
    if( nEntryCnt )
    {
        Sequence<OUString> aList( (sal_Int32)nEntryCnt );
        Sequence<OUString> aValueList( (sal_Int32)nEntryCnt );
        OUString *pStrings = aList.getArray();
        OUString *pValues = aValueList.getArray();
        for( sal_uInt16 i=0; i<nEntryCnt; i++ )
        {
            String sText( *pFormImpl->GetStringList()[i] );
            sText.EraseTrailingChars();
            pStrings[i] = sText;

            sText = *pFormImpl->GetValueList()[i];
            pValues[i] = sText;
        }

        Any aAny( &aList, ::getCppuType((uno::Sequence<OUString>*)0) );

        rPropSet->setPropertyValue(
                OUString::createFromAscii( "StringItemList" ), aAny );

        aAny <<= ListSourceType_VALUELIST;
        rPropSet->setPropertyValue(
                OUString::createFromAscii( "ListSourceType" ), aAny );

        aAny.setValue( &aValueList, ::getCppuType((uno::Sequence<OUString>*)0) );

        rPropSet->setPropertyValue( OUString::createFromAscii( "ListSource" ),
                                    aAny );

        sal_uInt16 nSelCnt = pFormImpl->GetSelectedList().Count();
        if( !nSelCnt && 1 == nSelectEntryCnt && nEntryCnt )
        {
            // In einer DropDown-Listbox sollte immer ein Eintrag selektiert
            // sein.
            pFormImpl->GetSelectedList().Insert( (sal_uInt16)0, (sal_uInt16)0 );
            nSelCnt = 1;
        }
        Sequence<sal_Int16> aSelList( (sal_Int32)nSelCnt );
        sal_Int16 *pSels = aSelList.getArray();
        for( i=0; i<nSelCnt; i++ )
        {
            pSels[i] = (sal_Int16)pFormImpl->GetSelectedList()[i];
        }
        aAny.setValue( &aSelList,
                       ::getCppuType((uno::Sequence<sal_Int16>*)0) );

        rPropSet->setPropertyValue(
                OUString::createFromAscii( "DefaultSelection" ), aAny );

        pFormImpl->EraseStringList();
        pFormImpl->EraseValueList();
    }

    pFormImpl->EraseSelectedList();

    if( bFixSelectWidth )
    {
        ASSERT( pFormImpl->GetShape().is(), "Kein Shape gemerkt" );
        Size aTextSz( -1, 0 );
        SetControlSize( pFormImpl->GetShape(), aTextSz, sal_False, sal_False,
                        HTML_SELECT_OFF );
    }

    pFormImpl->ReleaseFCompPropSet();

    // den Kontext holen
    _HTMLAttrContext *pCntxt = PopContext( HTML_SELECT_ON );
    if( pCntxt )
    {
        // und ggf. die Attribute beenden
        EndContext( pCntxt );
        delete pCntxt;
    }

    bSelect = sal_False;
}

void SwHTMLParser::InsertSelectOption()
{
    ASSERT( bSelect, "keine Select" );
    ASSERT( pFormImpl && pFormImpl->GetFCompPropSet().is(),
            "kein Select-Control" );

    bLBEntrySelected = sal_False;
    String aValue;

    const HTMLOptions *pOptions = GetOptions();
    for( sal_uInt16 i = pOptions->Count(); i; )
    {
        HTMLOption *pOption = (*pOptions)[--i];
        switch( pOption->GetToken() )
        {
        case HTML_O_ID:
            // erstmal weglassen!!!
            break;
        case HTML_O_SELECTED:
            bLBEntrySelected = sal_True;
            break;
        case HTML_O_VALUE:
            aValue = pOption->GetString();
            if( !aValue.Len() )
                aValue.AssignAscii( "$$$empty$$$" );
            break;
        }
    }

    sal_uInt16 nEntryCnt = pFormImpl->GetStringList().Count();
    pFormImpl->GetStringList().Insert( new String( aEmptyStr ), nEntryCnt );
    pFormImpl->GetValueList().Insert( new String( aValue ), nEntryCnt );
    if( bLBEntrySelected )
        pFormImpl->GetSelectedList().Insert( nEntryCnt,
                                pFormImpl->GetSelectedList().Count() );
}

void SwHTMLParser::InsertSelectText()
{
    ASSERT( bSelect, "keine Select" );
    ASSERT( pFormImpl && pFormImpl->GetFCompPropSet().is(),
            "kein Select-Control" );

    sal_uInt16 nEntryCnt = pFormImpl->GetStringList().Count();
    if( nEntryCnt )
    {
        String& rText = *pFormImpl->GetStringList()[nEntryCnt-1];

        if( aToken.Len() && ' '==aToken.GetChar( 0 ) )
        {
            xub_StrLen nLen = rText.Len();
            if( !nLen || ' '==rText.GetChar( nLen-1 ))
                aToken.Erase( 0, 1 );
        }
        if( aToken.Len() )
            rText += aToken;
    }
}


/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/html/htmlform.cxx,v 1.1.1.1 2000-09-18 17:14:55 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.232  2000/09/18 16:04:44  willem.vandorp
      OpenOffice header added.

      Revision 1.231  2000/06/26 09:52:06  jp
      must change: GetAppWindow->GetDefaultDevice

      Revision 1.230  2000/06/16 12:28:26  os
      UNO3 error removed

      Revision 1.229  2000/05/16 09:23:09  os
      project usr removed

      Revision 1.228  2000/04/28 14:29:11  mib
      unicode

      Revision 1.227  2000/04/11 10:46:28  mib
      unicode

      Revision 1.226  2000/04/10 12:20:56  mib
      unicode

      Revision 1.225  2000/03/31 06:16:24  os
      UNO III: toolkit includes

      Revision 1.224  2000/03/30 07:31:01  os
      UNO III

      Revision 1.223  2000/03/21 15:06:17  os
      UNOIII

      Revision 1.222  2000/03/03 15:21:00  os
      StarView remainders removed

      Revision 1.221  2000/02/14 13:59:45  mib
      #70473#: unicode

      Revision 1.220  2000/02/10 09:51:53  mib
      #68571#: text/plain encoding for submit

      Revision 1.219  1999/11/29 11:29:08  os
      include

      Revision 1.218  1999/11/25 11:46:11  os
      ...component.Hidden -> ...component.HiddenControl; include clean-up

      Revision 1.217  1999/11/25 11:20:16  os
      ...component.Edit -> ...component.TextField

      Revision 1.216  1999/11/22 14:04:13  os
      headers added

      Revision 1.215  1999/11/19 16:40:20  os
      modules renamed

      Revision 1.214  1999/09/17 12:13:21  mib
      support of multiple and non system text encodings

      Revision 1.213  1999/07/22 16:46:44  MIB
      Create hidden view on demand if doc shell is an internal one


      Rev 1.212   22 Jul 1999 18:46:44   MIB
   Create hidden view on demand if doc shell is an internal one

      Rev 1.211   10 Jun 1999 10:34:08   JP
   have to change: no AppWin from SfxApp

      Rev 1.210   09 Jun 1999 19:36:52   JP
   have to change: no cast from GetpApp to SfxApp/OffApp, SfxShell only subclass of SfxApp

      Rev 1.209   06 May 1999 08:49:02   MIB
   #65851#: Keinen TabIndex fuer Hidden-Controls setzen

      Rev 1.208   07 Apr 1999 13:50:56   MIB
   #64327#: GetBrowseWidth fuer Tabellen in Rahmen richtig

      Rev 1.207   31 Mar 1999 09:07:08   MIB
   #64110#: ALIGN nur noch bei Image-Buttons auswerten

      Rev 1.206   29 Mar 1999 08:09:32   MIB
   #63283#: Img-URL wg. Stopp-Knopf/Reload nach dem Einfuegen des Controls setzen

      Rev 1.205   15 Mar 1999 13:10:36   OS
   #62266# FontHeight float

      Rev 1.204   12 Mar 1999 16:59:08   OS
   #62845# ServiceManager->ServiceFactory

      Rev 1.203   10 Mar 1999 15:44:04   MIB
   #62682#: Beim Setzen der Control-Groesse wenn noetig auf die ViewShell warten

      Rev 1.202   05 Mar 1999 20:45:14   HJS
   muss fuer os

      Rev 1.201   05 Mar 1999 13:49:52   OS
   HoriOrientation - UPD515

      Rev 1.200   04 Mar 1999 15:02:16   OS
   #62191# UINT nicht mehr verwenden

      Rev 1.199   03 Mar 1999 11:16:34   MIB
   #62251#: Fehlende Font-Properties setzen

      Rev 1.198   23 Feb 1999 10:27:04   MIB
   #61968#: Positionierung von Controls

      Rev 1.197   22 Feb 1999 08:40:46   MA
   1949globale Shell entsorgt, Shells am RootFrm

      Rev 1.196   12 Feb 1999 13:04:00   MIB
   #56371#: TF_ONE51: OS/2

      Rev 1.195   09 Feb 1999 15:36:10   MIB
   #56371#: TF_ONE51 aufgeraeumt

      Rev 1.194   05 Feb 1999 10:09:26   MIB
   #56371#: File-Control

      Rev 1.193   04 Feb 1999 19:25:48   MIB
   #56371#: sal_uInt16-Properties umgetsellt

      Rev 1.192   04 Feb 1999 19:03:34   MIB
   #56371#: sal_uInt16-Properties umgetsellt

      Rev 1.191   04 Feb 1999 10:18:48   OS
   #56371# FontDescriptor ist nicht immer im Set, DefaultState sal_Int16

      Rev 1.190   04 Feb 1999 09:18:14   OS
   #56371# Import funktioniert

      Rev 1.189   01 Feb 1999 11:10:04   MIB
   #56371#: Listener- und Property-Namen berichtigt

      Rev 1.188   01 Feb 1999 08:26:52   OS
   #56371# Service- u. Property-Namen berichtigt

      Rev 1.187   27 Jan 1999 19:00:12   JP
   Task #61014#: FindSdrObject/FindContactObject als Methoden vom SwFrmFmt

      Rev 1.186   27 Jan 1999 12:05:46   OS
   #56371# TF_ONE51

      Rev 1.185   25 Jan 1999 16:19:04   OS
   #56371# TF_ONE51 - uebersetzbar

      Rev 1.184   26 Nov 1998 15:20:18   MIB
   #59904#: Event-sind-noch-nicht-implementiert-Assert weg

      Rev 1.183   26 Nov 1998 10:21:30   MIB
   #59882#: bei ACTION='' das Verzeichnis als URL nehmen

      Rev 1.182   19 Oct 1998 17:22:50   MIB
   #57901# Standard-Font, #55311# leerer Listbox-Value, #54997# leerer Checkbox-Value

      Rev 1.181   14 Sep 1998 13:55:52   MIB
   #55436#: generische Events, #56435#: Event-Setzen opntimiert

      Rev 1.180   10 Sep 1998 08:31:08   MIB
   #51303#: Zeichen-Attribute fuer Controls uebernehmen

      Rev 1.179   01 Sep 1998 10:22:52   MIB
   #54997#: VALUE von Checkboxen/Radiobuttons mit 'on' defaulten

      Rev 1.178   24 Aug 1998 16:00:22   MIB
   #54606#: resetted -> afterReset

      Rev 1.177   24 Aug 1998 15:27:20   MIB
   #54532#, #55313#: Beim Anpassen der ImageButton-Groesse leere Grafik beachten

      Rev 1.176   27 Jul 1998 15:59:50   MIB
   53936#: Events erst nach dem Einfuegen des Controls registrieren (wegen Fokus-Events)

      Rev 1.175   27 Jul 1998 14:52:46   MIB
   #54008#: In DropDown-Listbox ersten EIntrag selektieren

      Rev 1.174   24 Jul 1998 09:56:20   MIB
   #53718#: und fuer das Hidden-Control nehmen wir jetzt HiddenValue statt Text

      Rev 1.173   23 Jul 1998 12:25:00   MIB
   #53611#: Heute nehmen wir statt der ValueSeq mal dir Listbox-Property

      Rev 1.172   23 Jul 1998 09:44:50   MIB
   fix #53493#: sheet::Border am ImageButton ausschalten

      Rev 1.171   22 Jul 1998 12:01:06   MIB
   fix #53559#: DefaultChecked-Property bei RadioButtons erst nach dem Einfuegen setzen

      Rev 1.170   15 Jul 1998 20:08:16   MIB
   #52554#: StarOne-Schnittstelle arbeitet jetzt mit 1/100mm

      Rev 1.169   15 Jul 1998 19:49:02   MIB
   #52660#: SelectedItems, #52664#: neue Behandlung von Default-Werten

      Rev 1.168   15 Jul 1998 10:12:42   MIB
   #52098#: Listbox-Select-Property geaender, #52729#: Controls ohne Form ignorieren

      Rev 1.167   14 Jul 1998 18:39:18   MIB
   #51982#: genererische Events nicht fuer JavaScript/StarBasic zulassen

      Rev 1.166   14 Jul 1998 09:07:04   MIB
   fix #52729#: Controls gar nicht erst einfuegen, wenn es keine Form gibt

      Rev 1.165   10 Jul 1998 13:55:40   TJ
   include fuer attacher

      Rev 1.164   08 Jul 1998 17:20:10   MIB
   StarScript

      Rev 1.163   07 Jul 1998 15:15:54   OM
   Muss Aenderung SubmitAction->TargetURL u.a.

      Rev 1.162   04 Jul 1998 17:43:50   MIB
   StarScript in IDE, StarScript-Events

      Rev 1.161   02 Jul 1998 10:43:16   MIB
   Controls wegen Event-Registrierung erst in dir Form und dann in die Page einfuegen

      Rev 1.160   01 Jul 1998 10:27:18   MIB
   Muss-Aenderung: Font-Hoehen nun in pt

      Rev 1.159   30 Jun 1998 12:23:18   MIB
   Muss-Aenderung: Multi-Property

      Rev 1.158   29 Jun 1998 15:07:08   MIB
   Event-Export, kein Value bei File-Control

      Rev 1.157   26 Jun 1998 17:06:20   MIB
   ItemListener statt ActionListener bei Checkboxen/radiobuttons

      Rev 1.156   26 Jun 1998 09:57:06   MIB
   Sumit- und Reset-Events

      Rev 1.155   24 Jun 1998 09:36:54   MIB
   fix: Hidden-Controls nun wirklich einfuegen

      Rev 1.154   22 Jun 1998 14:26:44   MIB
   Listbox-Groessenberechnung jetzt richtig

      Rev 1.153   19 Jun 1998 08:32:06   OS
   SfxModel auf XModel casten

      Rev 1.152   19 Jun 1998 08:28:28   MIB
   Events setzen

      Rev 1.151   18 Jun 1998 09:37:24   MIB
   Hidden-Control freigeschaltet, Groessenberchnung verbessert, Events begonnen

      Rev 1.150   15 Jun 1998 18:18:46   MIB
   Compiler-Fehler

      Rev 1.149   15 Jun 1998 08:57:04   OS
   Headeraenderung

      Rev 1.148   15 Jun 1998 08:53:16   MIB
   Groessenberechnungen

      Rev 1.147   14 Jun 1998 19:52:06   MIB
   Groessenberechnung vorbereitet

      Rev 1.146   14 Jun 1998 17:43:32   MIB
   Neue Properties, Hidden-Control durch Edit simuliert

      Rev 1.145   12 Jun 1998 11:36:56   MIB
   form, ImageButton mit URL

      Rev 1.144   10 Jun 1998 10:15:22   OS
   Package-Umstellung

      Rev 1.143   09 Jun 1998 19:02:26   MIB
   Form ueber FormComponentFactory erzeugen

      Rev 1.142   09 Jun 1998 13:26:42   MIB
   insertShape -> insertShapeAtTextPosition

      Rev 1.141   09 Jun 1998 10:15:20   MIB
   SIZE auch fuer Nicht-Edits auswerten

      Rev 1.140   04 Jun 1998 16:13:20   MIB
   ImageButton-Verbesserungen

      Rev 1.139   03 Jun 1998 12:49:38   MIB
   Value-Liste vorbereitet

      Rev 1.138   02 Jun 1998 16:04:16   MIB
   neue Form-Control-Anbindung

      Rev 1.137   29 May 1998 14:32:56   MIB
   ImageButton (noch nicht fertig)

      Rev 1.136   26 May 1998 18:08:42   MIB
   TABINDEX, Multiline-Scrollbars, Checkbox-/Readio-Button-Default, etc.

      Rev 1.135   26 May 1998 12:23:30   MIB
   Scrollbars an Multiline-Edits aktiviert

      Rev 1.134   20 May 1998 15:22:18   MIB
   Zeichen-Objekte ueber Schnittstelle am Dok einfuegen

      Rev 1.133   19 May 1998 19:15:02   MIB
   SW-Properties nun komplett

      Rev 1.132   19 May 1998 14:49:16   MIB
   HIDDEN-Control erstmal wieder raus, RefValue- statt Value-Property

      Rev 1.131   18 May 1998 16:54:32   MIB
   SW-Properties setzen

      Rev 1.130   18 May 1998 08:41:10   MIB
   mehr Properties setzen

      Rev 1.129   15 May 1998 11:31:50   MIB
   Interface-Aenderungen

      Rev 1.128   15 May 1998 10:04:32   MIB
   UNO-Controls statt VC-Controls (noch geht nicht viel)

      Rev 1.127   21 Apr 1998 13:46:12   MIB
   fix: Keine Bookmark fuer abs-pos Objekte mit ID einfuegen

      Rev 1.126   31 Mar 1998 11:19:58   MIB
   Controls auch Rahmengebunden einfuegen

      Rev 1.125   27 Mar 1998 17:27:40   MIB
   direkte absolute Positionierung und Groessen-Export von Controls und Marquee

      Rev 1.124   27 Mar 1998 10:03:28   MIB
   direkte Positionierung von Grafiken etc.

      Rev 1.123   27 Feb 1998 14:05:06   MIB
   Auto-gebundene Rahmen

      Rev 1.122   20 Feb 1998 19:03:28   MA
   header

      Rev 1.121   26 Nov 1997 19:09:30   MA
   includes

      Rev 1.120   08 Sep 1997 10:38:20   MIB
   Keine Schleifen fuer PRE mehr (auch fix #41253#)

      Rev 1.119   01 Sep 1997 13:52:48   MIB
   Zeichensetz-/Zeilenende-Konvertierung fuer Event-Optionen

      Rev 1.118   29 Aug 1997 16:50:32   OS
   DLL-Umstellung

      Rev 1.117   18 Aug 1997 11:36:16   OS
   includes

      Rev 1.116   15 Aug 1997 12:46:30   OS
   charatr/frmatr/txtatr aufgeteilt

      Rev 1.115   12 Aug 1997 13:42:58   OS
   Header-Umstellung

      Rev 1.114   07 Aug 1997 15:08:52   OM
   Headerfile-Umstellung

      Rev 1.113   29 Jul 1997 20:38:42   TJ
   includes - fuer tj

      Rev 1.112   10 Jul 1997 10:29:04   MIB
   fix #41516#: Hidden-Controls mit Durchlauf versehen

      Rev 1.111   10 Jun 1997 10:32:10   MIB
   Bei Fonts keine Breite mehr angeben

      Rev 1.110   06 Jun 1997 11:56:08   MIB
   <TEXTAREA WRAP=PHYSICAL/VIRTUAL> wie HARD/SOFT

      Rev 1.109   06 Jun 1997 09:57:58   MIB
   WRAP-Option fuer <TEXTAREA>

      Rev 1.108   22 May 1997 13:23:28   MIB
   In Combo-Boxen selektierten Eintrag ueber uber das Space-Loeschen hinaus retten

      Rev 1.107   22 May 1997 13:06:32   TRI
   includes

      Rev 1.106   09 Apr 1997 14:22:18   MIB
   in htmlform.cxx (nur noch Import) und htmlforw.cxx (nur Export) aufgeteilt

      Rev 1.105   04 Apr 1997 17:43:04   NF
   includes

      Rev 1.104   25 Mar 1997 16:01:50   MIB
   fix #36224#: CR/LF in machen VALUE-Optionen beibehalten

      Rev 1.103   05 Mar 1997 14:46:06   MIB
   Absatz-Abstaende verbessert

      Rev 1.102   21 Feb 1997 15:28:28   MIB
   fix #36692#: Fuer Forms in Tabellen ausserhalb von Zellen keine neuen Absaetze

      Rev 1.101   12 Feb 1997 16:48:04   MIB
   erstmal keine Warnungen

      Rev 1.100   31 Jan 1997 14:36:38   MIB
   SDONRESET aktiviert

*************************************************************************/

diff --git a/sw/source/filter/html/htmlform.hxx b/sw/source/filter/html/htmlform.hxx
new file mode 100644
index 0000000..9f23188
--- /dev/null
+++ b/sw/source/filter/html/htmlform.hxx
@@ -0,0 +1,86 @@
/*************************************************************************
 *
 *  $RCSfile: htmlform.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:55 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _HTMLFORM_HXX
#define _HTMLFORM_HXX


enum HTMLEventType
{
    HTML_ET_ONSUBMITFORM,   HTML_ET_ONRESETFORM,
    HTML_ET_ONGETFOCUS,     HTML_ET_ONLOSEFOCUS,
    HTML_ET_ONCLICK,        HTML_ET_ONCLICK_ITEM,
    HTML_ET_ONCHANGE,       HTML_ET_ONSELECT,
    HTML_ET_END
};

extern HTMLEventType __FAR_DATA aEventTypeTable[];
extern const sal_Char * __FAR_DATA aEventListenerTable[];
extern const sal_Char * __FAR_DATA aEventMethodTable[];
extern const sal_Char * __FAR_DATA aEventSDOptionTable[];
extern const sal_Char * __FAR_DATA aEventOptionTable[];




#endif


diff --git a/sw/source/filter/html/htmlforw.cxx b/sw/source/filter/html/htmlforw.cxx
new file mode 100644
index 0000000..a54155e
--- /dev/null
+++ b/sw/source/filter/html/htmlforw.cxx
@@ -0,0 +1,1635 @@
/*************************************************************************
 *
 *  $RCSfile: htmlforw.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:55 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#ifndef _COM_SUN_STAR_FRAME_XMODEL_HPP_
#include <com/sun/star/frame/XModel.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_FORMSUBMITENCODING_HPP_
#include <com/sun/star/form/FormSubmitEncoding.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_FORMSUBMITMETHOD_HPP_
#include <com/sun/star/form/FormSubmitMethod.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_FORMBUTTONTYPE_HPP_
#include <com/sun/star/form/FormButtonType.hpp>
#endif
#ifndef _COM_SUN_STAR_SCRIPT_XEVENTATTACHER_HPP_
#include <com/sun/star/script/XEventAttacher.hpp>
#endif
#ifndef _COM_SUN_STAR_SCRIPT_XEVENTATTACHERMANAGER_HPP_
#include <com/sun/star/script/XEventAttacherManager.hpp>
#endif
#ifndef _COM_SUN_STAR_DRAWING_XDRAWPAGESUPPLIER_HPP_
#include <com/sun/star/drawing/XDrawPageSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_DRAWING_XDRAWPAGESUPPLIER_HPP_
#include <com/sun/star/drawing/XDrawPageSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_XFORMSSUPPLIER_HPP_
#include <com/sun/star/form/XFormsSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_XFORM_HPP_
#include <com/sun/star/form/XForm.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_XFORMCOMPONENT_HPP_
#include <com/sun/star/form/XFormComponent.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_FORMCOMPONENTTYPE_HPP_
#include <com/sun/star/form/FormComponentType.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XCHILD_HPP_
#include <com/sun/star/container/XChild.hpp>
#endif
#ifndef _COM_SUN_STAR_SCRIPT_SCRIPTEVENTDESCRIPTOR_HPP_
#include <com/sun/star/script/ScriptEventDescriptor.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XTEXTLAYOUTCONSTRAINS_HPP_
#include <com/sun/star/awt/XTextLayoutConstrains.hpp>
#endif

#ifndef _SV_SYSTEM_HXX //autogen
#include <vcl/system.hxx>
#endif

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _SV_SVAPP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _WRKWIN_HXX //autogen
#include <vcl/wrkwin.hxx>
#endif
#ifndef _SFXMACITEM_HXX
#include <svtools/macitem.hxx>
#endif
#ifndef _URLOBJ_HXX //autogen
#include <tools/urlobj.hxx>
#endif
#ifndef _HTMLOUT_HXX //autogen
#include <svtools/htmlout.hxx>
#endif
#ifndef _HTMLTOKN_H
#include <svtools/htmltokn.h>
#endif
#ifndef _HTMLKYWD_HXX
#include <svtools/htmlkywd.hxx>
#endif
#ifndef _TOOLKIT_UNOHLP_HXX
#include <toolkit/helper/vclunohelper.hxx>
#endif

#ifndef _SVDOUNO_HXX //autogen
#include <svx/svdouno.hxx>
#endif
#ifndef _SVX_FMGLOB_HXX
#include <svx/fmglob.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _SVX_COLRITEM_HXX //autogen
#include <svx/colritem.hxx>
#endif
#ifndef _SVX_FHGTITEM_HXX //autogen
#include <svx/fhgtitem.hxx>
#endif
#ifndef _SVX_FONTITEM_HXX //autogen
#include <svx/fontitem.hxx>
#endif
#ifndef _SVX_WGHTITEM_HXX //autogen
#include <svx/wghtitem.hxx>
#endif
#ifndef _SVX_POSTITEM_HXX //autogen
#include <svx/postitem.hxx>
#endif
#ifndef _SVX_UDLNITEM_HXX //autogen
#include <svx/udlnitem.hxx>
#endif
#ifndef _SVX_CRSDITEM_HXX //autogen
#include <svx/crsditem.hxx>
#endif
#ifndef _UNOOBJ_HXX //autogen
#include <unoobj.hxx>
#endif
#ifndef _SWDOCSH_HXX //autogen
#include <docsh.hxx>
#endif

#ifndef _FMTANCHR_HXX //autogen
#include <fmtanchr.hxx>
#endif
#ifndef _FMTCNTNT_HXX //autogen
#include <fmtcntnt.hxx>
#endif
#ifndef _FRMFMT_HXX //autogen
#include <frmfmt.hxx>
#endif


#ifndef _DOCARY_HXX
#include <docary.hxx>
#endif

#ifndef _VIEWSH_HXX //autogen
#include <viewsh.hxx>
#endif
#include "pam.hxx"
#include "doc.hxx"
#include "ndtxt.hxx"
#include "dcontact.hxx"
#include "flypos.hxx"
#include "wrthtml.hxx"
#include "htmlfly.hxx"
#include "htmlform.hxx"

using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::rtl;
/*  */

const sal_uInt32 HTML_FRMOPTS_CONTROL   =
    0;
const sal_uInt32 HTML_FRMOPTS_CONTROL_CSS1  =
    HTML_FRMOPT_S_ALIGN |
    HTML_FRMOPT_S_SIZE |
    HTML_FRMOPT_S_SPACE |
    HTML_FRMOPT_BRCLEAR;
const sal_uInt32 HTML_FRMOPTS_IMG_CONTROL   =
    HTML_FRMOPT_ALIGN |
    HTML_FRMOPT_BRCLEAR;
const sal_uInt32 HTML_FRMOPTS_IMG_CONTROL_CSS1 =
    HTML_FRMOPT_S_ALIGN |
    HTML_FRMOPT_S_SPACE;


/*  */

struct HTMLControl
{
    // die Form, zu der das Control gehoert
    Reference< container::XIndexContainer > xFormComps;
    sal_uInt32 nNdIdx;              // der Node, in dem es verankert ist
    xub_StrLen nCount;              // wie viele Controls sind in dem Node

    HTMLControl( const Reference< container::XIndexContainer > & rForm,
                 sal_uInt32 nIdx );
    ~HTMLControl();

    // operatoren fuer das Sort-Array
    sal_Bool operator==( const HTMLControl& rCtrl )
    {
        return nNdIdx == rCtrl.nNdIdx;
    }
    sal_Bool operator<( const HTMLControl& rCtrl )
    {
        return nNdIdx < rCtrl.nNdIdx;
    }
};

SV_IMPL_OP_PTRARR_SORT( HTMLControls, HTMLControl* )

/*  */

void lcl_html_outEvents( SvStream& rStrm,
                         const Reference< form::XFormComponent > rFormComp,
                         sal_Bool bCfgStarBasic,
                         rtl_TextEncoding eDestEnc )
{
    Reference< container::XChild > xChild( rFormComp, UNO_QUERY );
    Reference< XInterface > xParentIfc = xChild->getParent();
    ASSERT( xParentIfc.is(), "lcl_html_outEvents: no parent interface" );
    if( !xParentIfc.is() )
        return;
    Reference< container::XIndexAccess > xIndexAcc( xParentIfc, UNO_QUERY );
    Reference< script::XEventAttacherManager > xEventManager( xParentIfc,
                                                              UNO_QUERY );
    if( !xIndexAcc.is() || !xEventManager.is() )
        return;

    // Und die Position des ControlModel darin suchen
    sal_Int32 nCount = xIndexAcc->getCount(), nPos;
    for( nPos = 0 ; nPos < nCount; nPos++ )
    {
        Any aTmp = xIndexAcc->getByIndex(nPos);
        ASSERT( aTmp.getValueType() ==
                        ::getCppuType( (Reference<form::XFormComponent>*)0 ) ||
                aTmp.getValueType() ==
                        ::getCppuType( (Reference<form::XForm>*)0 ),
                "lcl_html_outEvents: falsche Reflection" );
        if( aTmp.getValueType() ==
                    ::getCppuType( (Reference< form::XFormComponent >*)0) )

        {
            if( rFormComp ==
                    *(Reference< form::XFormComponent > *)aTmp.getValue() )
                break;
        }
        else if( aTmp.getValueType() ==
                            ::getCppuType( (Reference< form::XForm>*)0) )
        {
            Reference< form::XFormComponent > xFC(
                *(Reference< form::XForm > *)aTmp.getValue(), UNO_QUERY );
            if( rFormComp == xFC )
                break;
        }
    }

    if( nPos == nCount )
        return;

    Sequence< script::ScriptEventDescriptor > aDescs =
            xEventManager->getScriptEvents( nPos );
    nCount = aDescs.getLength();
    if( !nCount )
        return;

    const script::ScriptEventDescriptor *pDescs = aDescs.getConstArray();
    for( sal_Int32 i = 0; i < nCount; i++ )
    {
        ScriptType eScriptType = EXTENDED_STYPE;
        String aScriptType( pDescs[i].ScriptType );
        if( aScriptType.EqualsIgnoreCaseAscii(SVX_MACRO_LANGUAGE_JAVASCRIPT) )
            eScriptType = JAVASCRIPT;
        else if( aScriptType.EqualsIgnoreCaseAscii(SVX_MACRO_LANGUAGE_STARBASIC ) )
            eScriptType = STARBASIC;
        if( JAVASCRIPT != eScriptType && !bCfgStarBasic )
            continue;

        String sListener( pDescs[i].ListenerType );
        xub_StrLen nTok = sListener.GetTokenCount( '.' );
        if( nTok )
            sListener = sListener.GetToken( nTok-1, '.' );
        String sMethod( pDescs[i].EventMethod );

        const sal_Char *pOpt = 0;
        for( sal_uInt16 j=0; aEventListenerTable[j]; j++ )
        {
            if( sListener.EqualsAscii( aEventListenerTable[j] ) &&
                sMethod.EqualsAscii( aEventMethodTable[j] ) )
            {
                pOpt = (STARBASIC==eScriptType ? aEventSDOptionTable
                                               : aEventOptionTable)[j];
                break;
            }
        }

        ByteString sOut( ' ' );
        if( pOpt && (EXTENDED_STYPE != eScriptType ||
                     !pDescs[i].AddListenerParam.getLength()) )
            sOut += pOpt;
        else
            (((sOut += sHTML_O_sdevent)
                += ByteString( sListener, RTL_TEXTENCODING_ASCII_US)) += '-')
                 += ByteString( sMethod, RTL_TEXTENCODING_ASCII_US);
        sOut += "=\"";
        rStrm << sOut.GetBuffer();
        HTMLOutFuncs::Out_String( rStrm, pDescs[i].ScriptCode, eDestEnc );
        rStrm << '\"';
        if( EXTENDED_STYPE == eScriptType &&
            pDescs[i].AddListenerParam.getLength() )
        {
            (((((sOut = ' ') += sHTML_O_sdaddparam)
                += ByteString( sListener, RTL_TEXTENCODING_ASCII_US)) += '-')
                 += ByteString( sMethod, RTL_TEXTENCODING_ASCII_US))
                += "=\"";
            rStrm << sOut.GetBuffer();
            HTMLOutFuncs::Out_String( rStrm, pDescs[i].AddListenerParam,
                                      eDestEnc );
            rStrm << '\"';
        }
    }
}

sal_Bool lcl_html_isHTMLControl( sal_Int16 nClassId )
{
    sal_Bool bRet = sal_False;

    switch( nClassId )
    {
    case form::FormComponentType::TEXTFIELD:
    case form::FormComponentType::COMMANDBUTTON:
    case form::FormComponentType::RADIOBUTTON:
    case form::FormComponentType::CHECKBOX:
    case form::FormComponentType::LISTBOX:
    case form::FormComponentType::IMAGEBUTTON:
    case form::FormComponentType::FILECONTROL:
        bRet = sal_True;
        break;
    }

    return bRet;
}

sal_Bool SwHTMLWriter::HasControls() const
{
    sal_uInt32 nStartIdx = pCurPam->GetPoint()->nNode.GetIndex();

    // Skip all controls in front of the current paragraph
    for( sal_uInt16 i=0; i < aHTMLControls.Count() &&
        aHTMLControls[i]->nNdIdx < nStartIdx; i++ )
        ;

    return i < aHTMLControls.Count() && aHTMLControls[i]->nNdIdx == nStartIdx;
}

void SwHTMLWriter::OutForm( sal_Bool bTagOn, const SwStartNode *pStartNd )
{
    if( bPreserveForm )     // wir sind in einer Tabelle oder einem Bereich
        return;             // ueber dem eine Form aufgespannt wurde

    if( !bTagOn )
    {
        // die Form beenden wenn alle Controls ausgegeben wurden
        if( pxFormComps && pxFormComps->is() &&
            (*pxFormComps)->getCount() == nFormCntrlCnt )
        {
            OutForm( sal_False, *pxFormComps );
            (*pxFormComps) = 0;
        }
        return;
    }

    Reference< container::XIndexContainer > xNewFormComps;  // die neue Form
    sal_uInt32 nStartIdx = pStartNd ? pStartNd->GetIndex()
                                       : pCurPam->GetPoint()->nNode.GetIndex();

    // Ueberspringen von Controls vor dem interesanten Bereich
    for( sal_uInt16 i=0; i < aHTMLControls.Count() &&
        aHTMLControls[i]->nNdIdx < nStartIdx; i++ )
        ;

    if( !pStartNd )
    {
        // Check fuer einen einzelnen Node: da ist nur interessant, ob
        // es zu dem Node ein Control gibt und zu welcher Form es gehoert
        if( i < aHTMLControls.Count() &&
            aHTMLControls[i]->nNdIdx == nStartIdx )
            xNewFormComps = aHTMLControls[i]->xFormComps;
    }
    else
    {
        // wir klappern eine Tabelle/einen Bereich ab: hier interessiert uns:
        // - ob es Controls mit unterschiedlichen Start-Nodes gibt
        // - ob es eine Form gibt, fuer die nicht alle Controls in der
        //   Tabelle/dem Bereich liegen

        Reference< container::XIndexContainer > xCurrentFormComps;// die aktuelle Form in der Tabelle
        const SwStartNode *pCurrentStNd = 0; // und der Start-Node eines Ctrls
        xub_StrLen nCurrentCtrls = 0;   // und die in ihr gefundenen Controls
        sal_uInt32 nEndIdx =  pStartNd->EndOfSectionIndex();
        for( ; i < aHTMLControls.Count() &&
            aHTMLControls[i]->nNdIdx <= nEndIdx; i++ )
        {
            const SwStartNode *pCntrlStNd =
                pDoc->GetNodes()[aHTMLControls[i]->nNdIdx]->FindStartNode();

            if( xCurrentFormComps.is() )
            {
                // Wir befinden uns bereits in einer Form ...
                if( xCurrentFormComps==aHTMLControls[i]->xFormComps )
                {
                    // ... und das Control befindet sich auch darin ...
                    if( pCurrentStNd!=pCntrlStNd )
                    {
                        // ... aber es liegt in einer anderen Zelle:
                        // Dann muessen eir eine Form ueber der Tabelle
                        // aufmachen
                        xNewFormComps = xCurrentFormComps;
                        break;
                    }
                    nCurrentCtrls += aHTMLControls[i]->nCount;
                }
                else
                {
                    // ... aber das Control liegt in einer anderen Zelle:
                    // Da tun wir so, als ob wir eine neue Form aufmachen
                    // und suchen weiter.
                    xCurrentFormComps = aHTMLControls[i]->xFormComps;
                    pCurrentStNd = pCntrlStNd;
                    nCurrentCtrls = aHTMLControls[i]->nCount;
                }
            }
            else
            {
                // Wir befinden uns noch in keiner Form:
                // Da tun wir mal so, als ob wie wir die Form aufmachen.
                xCurrentFormComps = aHTMLControls[i]->xFormComps;
                pCurrentStNd = pCntrlStNd;
                nCurrentCtrls = aHTMLControls[i]->nCount;
            }
        }
        if( !xNewFormComps.is() && xCurrentFormComps.is() &&
            nCurrentCtrls != xCurrentFormComps->getCount() )
        {
            // In der Tablle/dem Bereich sollte eine Form aufgemacht werden,
            // die nicht vollstaendig in der Tabelle liegt. Dan muessen
            // wie die Form jetzt ebenfalls oeffen.
            xNewFormComps = xCurrentFormComps;
        }
    }

    if( xNewFormComps.is() &&
        (!pxFormComps || !(xNewFormComps == *pxFormComps)) )
    {
        // Es soll eine Form aufgemacht werden ...
        if( pxFormComps && pxFormComps->is() )
        {
            // .. es ist aber noch eine Form offen: Das ist in
            // jedem Fall eine Fehler, aber wir schliessen die alte
            // Form trotzdem
            OutForm( sal_False, *pxFormComps );

            //!!!nWarn = 1; // Control wird falscher Form zugeordnet
        }

        if( !pxFormComps )
            pxFormComps = new Reference< container::XIndexContainer > ;
        *pxFormComps = xNewFormComps;

        OutForm( sal_True, *pxFormComps );
        Reference< beans::XPropertySet >  xTmp;
        OutHiddenControls( *pxFormComps, xTmp );
    }
}

void SwHTMLWriter::OutHiddenForms()
{
    // Ohne DrawModel kann es auch keine Controls geben. Dann darf man
    // auch nicht per UNO auf das Dok zugreifen, weil sonst ein DrawModel
    // angelegt wird.
    if( !pDoc->GetDrawModel() )
        return;

    SwDocShell *pDocSh = pDoc->GetDocShell();
    if( !pDocSh )
        return;

    Reference< drawing::XDrawPageSupplier > xDPSupp( pDocSh->GetBaseModel(),
                                                     UNO_QUERY );
    ASSERT( xDPSupp.is(), "XTextDocument nicht vom XModel erhalten" );
    Reference< drawing::XDrawPage > xDrawPage = xDPSupp->getDrawPage();

    ASSERT( xDrawPage.is(), "XDrawPage nicht erhalten" );
    if( !xDrawPage.is() )
        return;

    Reference< form::XFormsSupplier > xFormsSupplier( xDrawPage, UNO_QUERY );
    ASSERT( xFormsSupplier.is(),
            "XFormsSupplier nicht vom XDrawPage erhalten" );

    Reference< container::XNameContainer > xTmp = xFormsSupplier->getForms();
    ASSERT( xTmp.is(), "XForms nicht erhalten" );
    Reference< container::XIndexContainer > xForms( xTmp, UNO_QUERY );
    ASSERT( xForms.is(), "XForms ohne container::XIndexContainer?" );

    sal_Int32 nCount = xForms->getCount();
    for( sal_Int32 i=0; i<nCount; i++)
    {
        Any aTmp = xForms->getByIndex( i );
        ASSERT( aTmp.getValueType() ==
                        ::getCppuType((Reference< form::XForm >*)0),
                "OutHiddenForms: falsche Reflection" );
        if( aTmp.getValueType() ==
                    ::getCppuType((Reference< form::XForm >*)0) )
            OutHiddenForm( *(Reference< form::XForm > *)aTmp.getValue() );
    }
}

void SwHTMLWriter::OutHiddenForm( const Reference< form::XForm > & rForm )
{
    Reference< container::XIndexContainer > xFormComps( rForm, UNO_QUERY );
    if( !xFormComps.is() )
        return;

    sal_Int32 nCount = xFormComps->getCount();
    sal_Bool bHiddenOnly = nCount > 0, bHidden = sal_False;
    for( sal_Int32 i=0; i<nCount; i++ )
    {
        Any aTmp = xFormComps->getByIndex( i );
        ASSERT( aTmp.getValueType() ==
                        ::getCppuType((Reference<form::XFormComponent>*)0),
                "OutHiddenForm: falsche Reflection" );
        if( aTmp.getValueType() !=
                    ::getCppuType((Reference<form::XFormComponent>*)0) )
            continue;

        Reference< form::XFormComponent > xFormComp =
            *(Reference< form::XFormComponent > *)aTmp.getValue();
        Reference< form::XForm > xForm( xFormComp, UNO_QUERY );
        if( xForm.is() )
            OutHiddenForm( xForm );

        if( bHiddenOnly )
        {
            Reference< beans::XPropertySet >  xPropSet( xFormComp, UNO_QUERY );
            OUString sPropName = OUString::createFromAscii( "ClassId" );
            if( xPropSet->getPropertySetInfo()->hasPropertyByName( sPropName ) )
            {
                Any aTmp = xPropSet->getPropertyValue( sPropName );
                if( aTmp.getValueType() == ::getCppuType((sal_Int16*)0) )
                {
                    if( form::FormComponentType::HIDDENCONTROL ==
                                                *(sal_Int16*)aTmp.getValue() )
                        bHidden = sal_True;
                    else if( lcl_html_isHTMLControl(
                                            *(sal_Int16*)aTmp.getValue() ) )
                        bHiddenOnly = sal_False;
                }
            }
        }
    }

    if( bHidden && bHiddenOnly )
    {
        OutForm( sal_True, xFormComps );
        Reference< beans::XPropertySet > xTmp;
        OutHiddenControls( xFormComps, xTmp );
        OutForm( sal_False, xFormComps );
    }
}

void SwHTMLWriter::OutForm( sal_Bool bOn,
                const Reference< container::XIndexContainer > & rFormComps )
{
    nFormCntrlCnt = 0;

    if( !bOn )
    {
        DecIndentLevel(); // Inhalt der Form einruecken
        if( bLFPossible )
            OutNewLine();
        HTMLOutFuncs::Out_AsciiTag( Strm(), sHTML_form, sal_False );
        bLFPossible = sal_True;

        return;
    }

    // die neue Form wird geoeffnet
    if( bLFPossible )
        OutNewLine();
    ByteString sOut( '<' );
    sOut += sHTML_form;

    Reference< beans::XPropertySet > xFormPropSet( rFormComps, UNO_QUERY );

    Any aTmp = xFormPropSet->getPropertyValue(
                                    OUString::createFromAscii( "Name" ) );
    if( aTmp.getValueType() == ::getCppuType((const OUString*)0) &&
        ((OUString*)aTmp.getValue())->getLength() )
    {
        ((sOut += ' ') += sHTML_O_name) += "=\"";
        Strm() << sOut.GetBuffer();
        HTMLOutFuncs::Out_String( Strm(), *(OUString*)aTmp.getValue(),
                                  eDestEnc );
        sOut = '\"';
    }

    aTmp = xFormPropSet->getPropertyValue(
                    OUString::createFromAscii( "TargetURL" ) );
    if( aTmp.getValueType() == ::getCppuType((const OUString*)0) &&
        ((OUString*)aTmp.getValue())->getLength() )
    {
        ((sOut += ' ') += sHTML_O_action) += "=\"";
        Strm() << sOut.GetBuffer();
        String aURL( *(OUString*)aTmp.getValue() );
        aURL = INetURLObject::AbsToRel( aURL, INetURLObject::WAS_ENCODED,
                                        INetURLObject::DECODE_WITH_CHARSET );
        HTMLOutFuncs::Out_String( Strm(), aURL, eDestEnc );
        sOut = '\"';
    }

    aTmp = xFormPropSet->getPropertyValue(
                    OUString::createFromAscii( "SubmitMethod" ) );
    if( aTmp.getValueType() == ::getCppuType((const form::FormSubmitMethod*)0) )
    {
         form::FormSubmitMethod eMethod =
                *( form::FormSubmitMethod*)aTmp.getValue();
        if( form::FormSubmitMethod_POST==eMethod )
        {
            ((((sOut += ' ')
                += sHTML_O_method) += "=\"")
                += sHTML_METHOD_post) += '\"';
        }
    }
    aTmp = xFormPropSet->getPropertyValue(
                    OUString::createFromAscii( "SubmitEncoding" ) );
    if( aTmp.getValueType()==::getCppuType((const form::FormSubmitEncoding*)0) )
    {
         form::FormSubmitEncoding eEncType =
                    *( form::FormSubmitEncoding*)aTmp.getValue();
        const sal_Char *pStr = 0;
        switch( eEncType )
        {
        case form::FormSubmitEncoding_MULTIPART:
            pStr = sHTML_ET_multipart;
            break;
        case form::FormSubmitEncoding_TEXT:
            pStr = sHTML_ET_text;
            break;
        }

        if( pStr )
        {
            ((((sOut += ' ')
                += sHTML_O_enctype) += "=\"")
                += pStr) += '\"';
        }
    }

    aTmp = xFormPropSet->getPropertyValue(
                        OUString::createFromAscii( "TargetFrame" ) );
    if( aTmp.getValueType() == ::getCppuType((const OUString*)0)&&
        ((OUString*)aTmp.getValue())->getLength() )
    {
        ((sOut += ' ') += sHTML_O_target) += "=\"";
        Strm() << sOut.GetBuffer();
        HTMLOutFuncs::Out_String( Strm(), *(OUString*)aTmp.getValue(),
                                  eDestEnc );
        sOut = '\"';
    }

    Strm() << sOut.GetBuffer();
    Reference< form::XFormComponent > xFormComp( rFormComps, UNO_QUERY );
    lcl_html_outEvents( Strm(), xFormComp, bCfgStarBasic, eDestEnc );
    Strm() << '>';

    IncIndentLevel(); // Inhalt der Form einruecken
    bLFPossible = sal_True;
}

void SwHTMLWriter::OutHiddenControls(
        const Reference< container::XIndexContainer > & rFormComps,
        const Reference< beans::XPropertySet > & rPropSet )
{
    sal_Int32 nCount = rFormComps->getCount();
    sal_Int32 nPos = 0;
    sal_Bool bDone = sal_False;
    if( rPropSet.is() )
    {
        Reference< form::XFormComponent > xFC( rPropSet, UNO_QUERY );
        for( nPos=0; !bDone && nPos < nCount; nPos++ )
        {
            Any aTmp = rFormComps->getByIndex( nPos );
            ASSERT( aTmp.getValueType() ==
                        ::getCppuType((Reference< form::XFormComponent>*)0),
                    "OutHiddenControls: falsche Reflection" );
            bDone = aTmp.getValueType() ==
                        ::getCppuType((Reference< form::XFormComponent>*)0) &&
                    *(Reference< form::XFormComponent > *)aTmp.getValue() ==
                        xFC;
        }
    }

    for( ; nPos < nCount; nPos++ )
    {
        Any aTmp = rFormComps->getByIndex( nPos );
        ASSERT( aTmp.getValueType() ==
                        ::getCppuType((Reference< form::XFormComponent>*)0),
                "OutHiddenControls: falsche Reflection" );
        if( aTmp.getValueType() !=
                    ::getCppuType((Reference< form::XFormComponent>*)0) )
            continue;
        Reference< form::XFormComponent > xFC =
                *(Reference< form::XFormComponent > *)aTmp.getValue();
        Reference< beans::XPropertySet > xPropSet( xFC, UNO_QUERY );

        OUString sPropName = OUString::createFromAscii( "ClassId" );
        if( !xPropSet->getPropertySetInfo()->hasPropertyByName( sPropName ) )
            continue;

        aTmp = xPropSet->getPropertyValue( sPropName );
        if( aTmp.getValueType() != ::getCppuType((const sal_Int16*)0) )
            continue;

        if( form::FormComponentType::HIDDENCONTROL ==
                                            *(sal_Int16*) aTmp.getValue() )
        {
            if( bLFPossible )
                OutNewLine( sal_True );
            ByteString sOut( '<' );
            ((((sOut += sHTML_input) += ' ') +=
                sHTML_O_type) += '=') += sHTML_IT_hidden;

            aTmp = xPropSet->getPropertyValue(
                            OUString::createFromAscii( "Name" ) );
            if( aTmp.getValueType() == ::getCppuType((const OUString*)0) &&
                ((OUString*)aTmp.getValue())->getLength() )
            {
                (( sOut += ' ' ) += sHTML_O_name ) += "=\"";
                Strm() << sOut.GetBuffer();
                HTMLOutFuncs::Out_String( Strm(), *(OUString*)aTmp.getValue(),
                                          eDestEnc );
                sOut = '\"';
            }
            aTmp = xPropSet->getPropertyValue(
                            OUString::createFromAscii( "HiddenValue" ) );
            if( aTmp.getValueType() == ::getCppuType((const OUString*)0) &&
                ((OUString*)aTmp.getValue())->getLength() )
            {
                ((sOut += ' ') += sHTML_O_value) += "=\"";
                Strm() << sOut.GetBuffer();
                HTMLOutFuncs::Out_String( Strm(), *(OUString*)aTmp.getValue(),
                                          eDestEnc );
                sOut = '\"';
            }
            sOut += '>';
            Strm() << sOut.GetBuffer();

            nFormCntrlCnt++;
        }
        else if( lcl_html_isHTMLControl( *(sal_Int16*) aTmp.getValue() ) )
        {
            break;
        }
    }
}

/*  */

// hier folgen die Ausgabe-Routinen, dadurch sind die form::Forms gebuendelt:

const SdrObject *SwHTMLWriter::GetHTMLControl( const SwDrawFrmFmt& rFmt )
{
    // es muss ein Draw-Format sein
    ASSERT( RES_DRAWFRMFMT == rFmt.Which(),
            "GetHTMLControl nuer fuer Draw-Formate erlaubt" );

    // Schauen, ob es ein SdrObject dafuer gibt
    const SdrObject *pObj = rFmt.FindSdrObject();
    if( !pObj || FmFormInventor != pObj->GetObjInventor() )
        return 0;

    SdrUnoObj *pFormObj = PTR_CAST( SdrUnoObj, pObj );
    Reference< awt::XControlModel >  xControlModel =
            pFormObj->GetUnoControlModel();

    ASSERT( xControlModel.is(), "UNO-Control ohne Model" );
    if( !xControlModel.is() )
        return 0;

    Reference< beans::XPropertySet >  xPropSet( xControlModel, UNO_QUERY );

    OUString sPropName = OUString::createFromAscii( "ClassId" );
    if( !xPropSet->getPropertySetInfo()->hasPropertyByName( sPropName ) )
        return 0;

    Any aTmp = xPropSet->getPropertyValue( sPropName );
    if( aTmp.getValueType() == ::getCppuType((const sal_Int16*)0)&&
        lcl_html_isHTMLControl( *(sal_Int16*) aTmp.getValue() ) )
    {
        return pObj;
    }

    return 0;
}

static void GetControlSize( const SdrObject& rSdrObj, Size& rSz,
                            SwDoc *pDoc )
{
    ViewShell *pVSh = 0;
    pDoc->GetEditShell( &pVSh );
    if( !pVSh )
        return;

    SdrUnoObj *pFormObj = PTR_CAST( SdrUnoObj, &rSdrObj );
    Reference< awt::XControl >  xControl =
            pFormObj->GetUnoControl( pVSh->GetWin() );
    Reference< awt::XTextLayoutConstrains > xLC( xControl, UNO_QUERY );
    ASSERT( xLC.is(), "kein XTextLayoutConstrains" );
    if( !xLC.is() )
        return;

    sal_Int16 nCols=0, nLines=0;
    xLC->getColumnsAndLines( nCols, nLines );
    rSz.Width() = nCols;
    rSz.Height() = nLines;
}

Writer& OutHTML_DrawFrmFmtAsControl( Writer& rWrt,
                                     const SwDrawFrmFmt& rFmt,
                                     const SdrObject& rSdrObject,
                                     sal_Bool bInCntnr )
{
    SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;

    SdrUnoObj *pFormObj = PTR_CAST( SdrUnoObj, &rSdrObject );
    Reference< awt::XControlModel > xControlModel =
        pFormObj->GetUnoControlModel();

    ASSERT( xControlModel.is(), "UNO-Control ohne Model" );
    if( !xControlModel.is() )
        return rWrt;

    Reference< beans::XPropertySet > xPropSet( xControlModel, UNO_QUERY );

//!!!   if( rHTMLWrt.pForm != pVCSbxCtrl->GetVCForm() )
//!!!       rHTMLWrt.nWarn = 1; // Control wird falscher Form zugeordnet
    rHTMLWrt.nFormCntrlCnt++;

    const sal_Char *pTag = sHTML_input, *pType = 0;
    OUString sValue;
    ByteString sOptions;
    sal_Bool bEmptyValue = sal_False;
    Any aTmp = xPropSet->getPropertyValue(
                    OUString::createFromAscii( "ClassId" ) );
    sal_Int16 nClassId = *(sal_Int16*) aTmp.getValue();
    sal_uInt32 nFrmOpts = HTML_FRMOPTS_CONTROL;
    switch( nClassId )
    {
    case form::FormComponentType::CHECKBOX:
    case form::FormComponentType::RADIOBUTTON:
        pType = (form::FormComponentType::CHECKBOX == nClassId
                    ? sHTML_IT_checkbox
                    : sHTML_IT_radio);
        aTmp = xPropSet->getPropertyValue(
                        OUString::createFromAscii( "DefaultState" ) );
        if( aTmp.getValueType() == ::getCppuType((const sal_Int16*)0) &&
            STATE_NOCHECK != *(sal_Int16*) aTmp.getValue() )
        {
            (sOptions += ' ') += sHTML_O_checked;
        }

        aTmp = xPropSet->getPropertyValue(
                        OUString::createFromAscii( "RefValue" ) );
        if( aTmp.getValueType() == ::getCppuType((const OUString*)0) )

        {
            const OUString& rVal = *(OUString*)aTmp.getValue();
            if( !rVal.len() )
                bEmptyValue = sal_True;
            else if( rVal.compareToAscii( sHTML_on ) != 0 )
                sValue = rVal;
        }
        break;

    case form::FormComponentType::COMMANDBUTTON:
        {
            form::FormButtonType eButtonType = form::FormButtonType_PUSH;
            aTmp = xPropSet->getPropertyValue(
                            OUString::createFromAscii( "ButtonType" ) );
            if( aTmp.getValueType() ==
                            ::getCppuType((const form::FormButtonType*)0) )
                eButtonType = *( form::FormButtonType*)aTmp.getValue();

            switch( eButtonType )
            {
            case form::FormButtonType_RESET:
                pType = sHTML_IT_reset;
                break;
            case form::FormButtonType_SUBMIT:
                pType = sHTML_IT_submit;
                break;
            case form::FormButtonType_PUSH:
            default:
                pType = sHTML_IT_button;
            }

            aTmp = xPropSet->getPropertyValue(
                            OUString::createFromAscii( "Label" ) );
            if( aTmp.getValueType() == ::getCppuType((const OUString*)0) &&
                ((OUString*)aTmp.getValue())->getLength() )
            {
                sValue = *(OUString*)aTmp.getValue();
            }
        }
        break;

    case form::FormComponentType::LISTBOX:
        if( rHTMLWrt.bLFPossible )
            rHTMLWrt.OutNewLine( sal_True );
        pTag = sHTML_select;
        aTmp = xPropSet->getPropertyValue(
                        OUString::createFromAscii( "Dropdown" ) );
        if( aTmp.getValueType() == ::getBooleanCppuType() &&
            !*(sal_Bool*)aTmp.getValue() )
        {
            Size aSz( 0, 0 );
            GetControlSize( rSdrObject, aSz, rWrt.pDoc );

            // wieviele sind sichtbar ??
            if( aSz.Height() )
                (((sOptions += ' ' ) += sHTML_O_size ) += '=' )
                    += ByteString::CreateFromInt32( aSz.Height() );

            aTmp = xPropSet->getPropertyValue(
                        OUString::createFromAscii( "MultiSelection" ) );
            if( aTmp.getValueType() == ::getBooleanCppuType() &&
                *(sal_Bool*)aTmp.getValue() )
            {
                (sOptions += ' ' ) += sHTML_O_multiple;
            }
        }
        break;

    case form::FormComponentType::TEXTFIELD:
        {
            Size aSz( 0, 0 );
            GetControlSize( rSdrObject, aSz, rWrt.pDoc );

            sal_Bool bMultiLine = sal_False;
            aTmp = xPropSet->getPropertyValue(
                            OUString::createFromAscii( "MultiLine" ) );
            bMultiLine = aTmp.getValueType() == ::getBooleanCppuType() &&
                         *(sal_Bool*)aTmp.getValue();

            if( bMultiLine )
            {
                if( rHTMLWrt.bLFPossible )
                    rHTMLWrt.OutNewLine( sal_True );
                pTag = sHTML_textarea;

                if( aSz.Height() )
                    (((sOptions += ' ' ) += sHTML_O_rows ) += '=' )
                        += ByteString::CreateFromInt32( aSz.Height() );
                if( aSz.Width() )
                    (((sOptions += ' ' ) += sHTML_O_cols ) += '=' )
                        += ByteString::CreateFromInt32( aSz.Width() );

                aTmp = xPropSet->getPropertyValue(
                                OUString::createFromAscii( "HScroll" ) );
                if( aTmp.getValueType() == ::getVoidCppuType() ||
                    (aTmp.getValueType() == ::getBooleanCppuType() &&
                    !*(sal_Bool*)aTmp.getValue()) )
                {
                    const sal_Char *pWrapStr = 0;
                    aTmp = xPropSet->getPropertyValue(
                            OUString::createFromAscii( "HardLineBreaks" ) );
                    pWrapStr =
                        (aTmp.getValueType() == ::getBooleanCppuType() &&
                        *(sal_Bool*)aTmp.getValue()) ? sHTML_WW_hard
                                                     : sHTML_WW_soft;
                    (((sOptions += ' ') += sHTML_O_wrap) += '=') += pWrapStr;
                }
            }
            else
            {
                aTmp = xPropSet->getPropertyValue(
                            OUString::createFromAscii( "EchoChar" ) );
                if( aTmp.getValueType() == ::getCppuType((const sal_Int16*)0) &&
                    *(sal_Int16*)aTmp.getValue() != 0 )
                    pType = sHTML_IT_password;
                else
                    pType = sHTML_IT_text;

                if( aSz.Width() )
                    (((sOptions += ' ' ) += sHTML_O_size ) += '=' )
                        += ByteString::CreateFromInt32( aSz.Width() );

                aTmp = xPropSet->getPropertyValue(
                            OUString::createFromAscii( "MaxTextLen" ) );
                if( aTmp.getValueType() == ::getCppuType((const sal_Int16*)0) &&
                    *(sal_Int16*) aTmp.getValue() != 0 )
                {
                    (((sOptions += ' ' ) += sHTML_O_maxlength ) += '=' )
                        += ByteString::CreateFromInt32(
                                *(sal_Int16*) aTmp.getValue() );
                }

                aTmp = xPropSet->getPropertyValue(
                                OUString::createFromAscii( "DefaultText" ) );
                if( aTmp.getValueType() == ::getCppuType((const OUString*)0) &&
                    ((OUString*)aTmp.getValue())->getLength() )
                {
                    sValue = *(OUString*)aTmp.getValue();
                }
            }
        }
        break;

    case form::FormComponentType::FILECONTROL:
        {
            Size aSz( 0, 0 );
            GetControlSize( rSdrObject, aSz, rWrt.pDoc );
            pType = sHTML_IT_file;

            if( aSz.Width() )
                (((sOptions += ' ' ) += sHTML_O_size ) += '=' )
                    += ByteString::CreateFromInt32( aSz.Width() );

            // VALUE vim form aus Sicherheitsgruenden nicht exportieren
        }
        break;


    case form::FormComponentType::IMAGEBUTTON:
        pType = sHTML_IT_image;
        nFrmOpts = HTML_FRMOPTS_IMG_CONTROL;
        break;

#if 0
    case FORMCOMPONENT_URLBUTTON:
        {
            // in einen Hyperlink wandeln
            ((((sOut = '<') += sHTML_anchor) += ' ' ) += sHTML_O_href )
                += "=\"";
            rWrt.Strm() << sOut.GetStr();
            HTMLOutFuncs::Out_String( rWrt.Strm(),
                INetURLObject::AbsToRel( ((VCURLButton*)pVCSbxCtrl)->GetURL(),
                                        INetURLObject::WAS_ENCODED,
                                        INetURLObject::DECODE_WITH_CHARSET),
                rHTMLWrt.eDestEnc, rHTMLWrt.eDestEnc );
            sOut = '\"';
            const String& rTarget =
                ((VCURLButton*)pVCSbxCtrl)->GetTargetFrame();
            if( rTarget.Len() )
            {
                ((sOut += ' ') += sHTML_O_target) += "=\"";
                rWrt.Strm() << sOut.GetStr();
                HTMLOutFuncs::Out_String( rWrt.Strm(), rTarget,
                rHTMLWrt.eDestEnc, rHTMLWrt.eDestEnc );
                sOut = '\"';
            }
            sOut += ">";
            rWrt.Strm() << sOut.GetStr();

            HTMLOutFuncs::Out_String( rWrt.Strm(),
                                      ((VCURLButton*)pVCSbxCtrl)->GetText(),
                rHTMLWrt.eDestEnc, rHTMLWrt.eDestEnc );
            HTMLOutFuncs::Out_Tag( rWrt.Strm(), sHTML_anchor, sal_False ) << ' ';
        }
        break;
#endif
    default:                // kennt HTML nicht
        pTag = 0;        // also ueberspringen
        break;
    }

    if( !pTag )
        return rWrt;

    ByteString sOut( '<' );
    sOut += pTag;
    if( pType )
        (((sOut += ' ') += sHTML_O_type) += '=') += pType;

    aTmp = xPropSet->getPropertyValue( OUString::createFromAscii( "Name" ) );
    if( aTmp.getValueType() == ::getCppuType((const OUString*)0) &&
        ((OUString*)aTmp.getValue())->getLength() )
    {
        (( sOut += ' ' ) += sHTML_O_name ) += "=\"";
        rWrt.Strm() << sOut.GetBuffer();
        HTMLOutFuncs::Out_String( rWrt.Strm(), *(OUString*)aTmp.getValue(),
                                  rHTMLWrt.eDestEnc );
        sOut = '\"';
    }

    aTmp = xPropSet->getPropertyValue( OUString::createFromAscii( "Enabled" ) );
    if( aTmp.getValueType() == ::getBooleanCppuType() &&
        !*(sal_Bool*)aTmp.getValue() )
    {
        (( sOut += ' ' ) += sHTML_O_disabled );
    }

    if( sValue.getLength() || bEmptyValue )
    {
        ((sOut += ' ') += sHTML_O_value) += "=\"";
        rWrt.Strm() << sOut.GetBuffer();
        HTMLOutFuncs::Out_String( rWrt.Strm(), sValue, rHTMLWrt.eDestEnc );
        sOut = '\"';
    }

    sOut += sOptions;

    if( sHTML_IT_image == pType )
    {
        aTmp = xPropSet->getPropertyValue(
                    OUString::createFromAscii( "ImageURL" ) );
        if( aTmp.getValueType() == ::getCppuType((const OUString*)0) &&
            ((OUString*)aTmp.getValue())->getLength() )
        {
            ((sOut += ' ') += sHTML_O_src) += "=\"";
            rWrt.Strm() << sOut.GetBuffer();

            HTMLOutFuncs::Out_String( rWrt.Strm(),
                        INetURLObject::AbsToRel( *(OUString*)aTmp.getValue(),
                                        INetURLObject::WAS_ENCODED,
                                        INetURLObject::DECODE_WITH_CHARSET ),
                        rHTMLWrt.eDestEnc );
            sOut = '\"';
        }

        Size aTwipSz( rSdrObject.GetLogicRect().GetSize() );
        Size aPixelSz( 0, 0 );
        if( (aTwipSz.Width() || aTwipSz.Height()) &&
            Application::GetDefaultDevice() )
        {
            aPixelSz =
                Application::GetDefaultDevice()->LogicToPixel( aTwipSz,
                                                    MapMode(MAP_TWIP) );
            if( !aPixelSz.Width() && aTwipSz.Width() )
                aPixelSz.Width() = 1;
            if( !aPixelSz.Height() && aTwipSz.Height() )
                aPixelSz.Height() = 1;
        }

        if( aPixelSz.Width() )
            (((sOut += ' ') += sHTML_O_width) += '=')
                += ByteString::CreateFromInt32( aPixelSz.Width() );

        if( aPixelSz.Height() )
            (((sOut += ' ') += sHTML_O_height) += '=')
                += ByteString::CreateFromInt32( aPixelSz.Height() );
    }

    aTmp = xPropSet->getPropertyValue(
                    OUString::createFromAscii( "TabIndex" ) );
    if( aTmp.getValueType() == ::getCppuType((const sal_Int16*)0) )
    {
        sal_Int16 nTabIndex = *(sal_Int16*) aTmp.getValue();
        if( nTabIndex > 0 )
        {
            if( nTabIndex >= 32767 )
                nTabIndex = 32767;

            (((sOut += ' ') += sHTML_O_tabindex) += '=')
                += ByteString::CreateFromInt32( nTabIndex );
        }
    }

    if( sOut.Len() )
    {
        rWrt.Strm() << sOut.GetBuffer();
        sOut.Erase();
    }

    ASSERT( !bInCntnr, "Container wird fuer Controls nicht unterstuertzt" );
    if( rHTMLWrt.IsHTMLMode( HTMLMODE_ABS_POS_DRAW ) && !bInCntnr )
    {
        // Wenn Zeichen-Objekte nicht absolut positioniert werden duerfen,
        // das entsprechende Flag loeschen.
        nFrmOpts |= (sHTML_IT_image == pType
                            ? HTML_FRMOPTS_IMG_CONTROL_CSS1
                            : HTML_FRMOPTS_CONTROL_CSS1);
    }
    ByteString aEndTags;
    if( nFrmOpts != 0 )
        rHTMLWrt.OutFrmFmtOptions( rFmt, aEmptyStr, aEndTags, nFrmOpts );

    if( rHTMLWrt.bCfgOutStyles )
    {
        sal_Bool bEdit = sHTML_textarea == pTag || sHTML_IT_file == pType ||
                     sHTML_IT_text == pType;

        Reference< beans::XPropertySetInfo > xPropSetInfo =
                xPropSet->getPropertySetInfo();
        SfxItemSet aItemSet( rHTMLWrt.pDoc->GetAttrPool(), RES_CHRATR_BEGIN,
                             RES_CHRATR_END );
        OUString sPropName = OUString::createFromAscii( "BackgroundColor" );
        if( xPropSetInfo->hasPropertyByName( sPropName ) )
        {
            aTmp = xPropSet->getPropertyValue( sPropName );
            if( aTmp.getValueType() == ::getCppuType((const sal_Int32*)0) )
            {
                Color aCol(*(sal_Int32*)aTmp .getValue());
                aItemSet.Put( SvxBrushItem( aCol, RES_CHRATR_BACKGROUND ) );
            }
        }
        sPropName = OUString::createFromAscii( "TextColor" );
        if( xPropSetInfo->hasPropertyByName( sPropName ) )
        {
            aTmp = xPropSet->getPropertyValue( sPropName );
            if( aTmp.getValueType() == ::getCppuType((const sal_Int32*)0) )
            {
                Color aColor( *(sal_Int32*)aTmp .getValue() );
                aItemSet.Put( SvxColorItem( aColor ) );
            }
        }
        sPropName = OUString::createFromAscii( "FontHeight" );
        if( xPropSetInfo->hasPropertyByName( sPropName ) )
        {
            aTmp = xPropSet->getPropertyValue( sPropName );
            if( aTmp.getValueType() == ::getCppuType((const Float*)0) )

            {
                float nHeight = *(float*)aTmp.getValue();
                if( nHeight > 0  && (!bEdit || nHeight != 10.) )
                    aItemSet.Put( SvxFontHeightItem( sal_Int16(nHeight * 20.) ) );
            }
        }
        sPropName = OUString::createFromAscii( "FontName" );
        if( xPropSetInfo->hasPropertyByName( sPropName ) )
        {
            aTmp = xPropSet->getPropertyValue( sPropName );
            if( aTmp.getValueType() == ::getCppuType((const OUString*)0) &&
                ((OUString*)aTmp.getValue())->getLength() )
            {
                Font aFixedFont( System::GetStandardFont( STDFONT_FIXED ) );
                String aFName( *(OUString*)aTmp.getValue() );
                if( !bEdit || aFName != aFixedFont.GetName() )
                {
                    FontFamily eFamily = FAMILY_DONTKNOW;
                    sPropName = OUString::createFromAscii( "FontFamily" );
                    if( xPropSetInfo->hasPropertyByName( sPropName ) )
                    {
                        aTmp = xPropSet->getPropertyValue( sPropName );
                        if( aTmp.getValueType() == ::getCppuType((const sal_Int16*)0))
                            eFamily = (FontFamily)*(sal_Int16*) aTmp.getValue();
                    }
                    SvxFontItem aItem( eFamily, aFName, aEmptyStr );
                    aItemSet.Put( aItem );
                }
            }
        }
        sPropName = OUString::createFromAscii( "FontWeight" );
        if( xPropSetInfo->hasPropertyByName( sPropName ) )
        {
            aTmp = xPropSet->getPropertyValue( sPropName );
            if( aTmp.getValueType() == ::getCppuType((const Float*)0) )
            {
                FontWeight eWeight =
                    VCLUnoHelper::ConvertFontWeight( *(float*)aTmp.getValue() );
                if( eWeight != WEIGHT_DONTKNOW && eWeight != WEIGHT_NORMAL )
                    aItemSet.Put( SvxWeightItem( eWeight ) );
            }
        }
        sPropName = OUString::createFromAscii( "FontSlant" );
        if( xPropSetInfo->hasPropertyByName( sPropName ) )
        {
            aTmp = xPropSet->getPropertyValue( sPropName );
            if( aTmp.getValueType() == ::getCppuType((const sal_Int16*)0))
            {
                FontItalic eItalic = (FontItalic)*(sal_Int16*)aTmp.getValue();
                if( eItalic != ITALIC_DONTKNOW && eItalic != ITALIC_NONE )
                    aItemSet.Put( SvxPostureItem( eItalic ) );
            }
        }
        sPropName = OUString::createFromAscii( "FontUnderline" );
        if( xPropSetInfo->hasPropertyByName( sPropName ) )
        {
            aTmp = xPropSet->getPropertyValue( sPropName );
            if( aTmp.getValueType() == ::getCppuType((const sal_Int16*)0) )
            {
                FontUnderline eUnderline =
                    (FontUnderline)*(sal_Int16*)aTmp.getValue();
                if( eUnderline != UNDERLINE_DONTKNOW  &&
                    eUnderline != UNDERLINE_NONE )
                    aItemSet.Put( SvxUnderlineItem( eUnderline ) );
            }
        }
        sPropName = OUString::createFromAscii( "FontStrikeout" );
        if( xPropSetInfo->hasPropertyByName( sPropName ) )
        {
            aTmp = xPropSet->getPropertyValue( sPropName );
            if( aTmp.getValueType() == ::getCppuType((const sal_Int16*)0))
            {
                FontStrikeout eStrikeout =
                    (FontStrikeout)*(sal_Int16*)aTmp.getValue();
                if( eStrikeout != STRIKEOUT_DONTKNOW &&
                    eStrikeout != STRIKEOUT_NONE )
                    aItemSet.Put( SvxCrossedOutItem( eStrikeout ) );
            }
        }

        rHTMLWrt.OutCSS1_FrmFmtOptions( rFmt, nFrmOpts, &rSdrObject,
                                        &aItemSet );
    }

    Reference< form::XFormComponent >  xFormComp( xControlModel, UNO_QUERY );
    lcl_html_outEvents( rWrt.Strm(), xFormComp, rHTMLWrt.bCfgStarBasic,
                        rHTMLWrt.eDestEnc );

    rWrt.Strm() << '>';

    if( sHTML_select == pTag )
    {
        aTmp = xPropSet->getPropertyValue(
                    OUString::createFromAscii( "StringItemList" ) );
        if( aTmp.getValueType() == ::getCppuType((Sequence<OUString>*)0) )
        {
            rHTMLWrt.IncIndentLevel(); // der Inhalt von Select darf
                                       // eingerueckt werden
            Sequence<OUString> aList( *(Sequence<OUString>*)aTmp.getValue() );
            sal_Int32 nCnt = aList.getLength();
            const OUString *pStrings = aList.getConstArray();

            const OUString *pValues = 0;
            sal_Int32 nValCnt = 0;
            aTmp = xPropSet->getPropertyValue(
                            OUString::createFromAscii( "ListSource" ) );
            Sequence<OUString> aValList;
            if( aTmp.getValueType() == ::getCppuType((Sequence<OUString>*)0) )
            {
                aValList = *(Sequence<OUString>*)aTmp.getValue();
                nValCnt = aValList.getLength();
                pValues = aValList.getConstArray();
            }

            Any aSelTmp = xPropSet->getPropertyValue(
                            OUString::createFromAscii( "DefaultSelection" ) );
            const sal_Int16 *pSels = 0;
            sal_Int32 nSel = 0;
            sal_Int32 nSelCnt = 0;
            Sequence<sal_Int16> aSelList;
            if( aSelTmp.getValueType() ==::getCppuType((Sequence<sal_Int16>*)0))
            {
                aSelList = *(Sequence<sal_Int16>*)aSelTmp.getValue();
                nSelCnt = aSelList.getLength();
                pSels = aSelList.getConstArray();
            }

            for( sal_Int32 i = 0; i < nCnt; i++ )
            {
                OUString sValue;
                sal_Bool bSelected = sal_False, bEmptyVal = sal_False;
                if( i < nValCnt )
                {
                    const OUString& rVal = pValues[i];
                    if( rVal.compareToAscii( "$$$empty$$$" ) == 0 )
                        bEmptyVal = sal_True;
                    else
                        sValue = rVal;
                }

                bSelected = (nSel < nSelCnt) && pSels[nSel] == i;
                if( bSelected )
                    nSel++;

                rHTMLWrt.OutNewLine(); // jede Option bekommt eine eigene Zeile
                (sOut = '<') += sHTML_option;
                if( sValue.getLength() || bEmptyVal )
                {
                    ((sOut += ' ') += sHTML_O_value) += "=\"";
                    rWrt.Strm() << sOut.GetBuffer();
                    HTMLOutFuncs::Out_String( rWrt.Strm(), sValue,
                        rHTMLWrt.eDestEnc );
                    sOut = '\"';
                }
                if( bSelected )
                    (sOut += ' ') += sHTML_O_selected;

                sOut += '>';
                rWrt.Strm() << sOut.GetBuffer();

                HTMLOutFuncs::Out_String( rWrt.Strm(), pStrings[i],
                                          rHTMLWrt.eDestEnc );
            }
            HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_option, sal_False );

            rHTMLWrt.DecIndentLevel();
            rHTMLWrt.OutNewLine();// das </SELECT> bekommt eine eigene Zeile
        }
        HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_select, sal_False );
    }
    else if( sHTML_textarea == pTag )
    {
        // In TextAreas duerfen keine zusaetzlichen Spaces oder LF exportiert
        // werden!
        String sValue;
        aTmp = xPropSet->getPropertyValue(
                        OUString::createFromAscii( "DefaultText" ) );
        if( aTmp.getValueType() == ::getCppuType((const OUString*)0)&&
            ((OUString*)aTmp.getValue())->getLength() )
        {
            sValue = String( *(OUString*)aTmp.getValue() );
        }
        if( sValue.Len() )
        {
            sValue.ConvertLineEnd( LINEEND_LF );
            xub_StrLen nPos = 0;
            while ( nPos != STRING_NOTFOUND )
            {
                if( nPos )
                    rWrt.Strm() << SwHTMLWriter::sNewLine;
                String aLine = sValue.GetToken( 0, 0x0A, nPos );
                HTMLOutFuncs::Out_String( rWrt.Strm(), aLine,
                                        rHTMLWrt.eDestEnc );
            }
        }
        HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_textarea, sal_False );
    }
    else if( sHTML_IT_checkbox == pType || sHTML_IT_radio == pType )
    {
        aTmp = xPropSet->getPropertyValue( OUString::createFromAscii("Label") );
        if( aTmp.getValueType() == ::getCppuType((const OUString*)0) &&
            ((OUString*)aTmp.getValue())->getLength() )
        {
            sValue = *(OUString*)aTmp.getValue();
            HTMLOutFuncs::Out_String( rWrt.Strm(), sValue,
                rHTMLWrt.eDestEnc ) << ' ';
        }
    }

    if( aEndTags.Len() )
        rWrt.Strm() << aEndTags.GetBuffer();

    // Controls sind nicht absatz-gebunden, deshalb kein LF mehr ausgeben!
    rHTMLWrt.bLFPossible = sal_False;

    if( rHTMLWrt.pxFormComps && rHTMLWrt.pxFormComps->is() )
        rHTMLWrt.OutHiddenControls( *rHTMLWrt.pxFormComps, xPropSet );
    return rWrt;
}

/*  */

// Ermitteln, ob eine Format zu einem Control gehoert und wenn ja
// dessen Form zurueckgeben
static void AddControl( HTMLControls& rControls,
                        const SdrObject *pSdrObj,
                        sal_uInt32 nNodeIdx )
{
    SdrUnoObj *pFormObj = PTR_CAST( SdrUnoObj, pSdrObj );
    ASSERT( pFormObj, "Doch kein FormObj" );
    Reference< awt::XControlModel > xControlModel =
            pFormObj->GetUnoControlModel();
    if( !xControlModel.is() )
        return;

    Reference< form::XFormComponent >  xFormComp( xControlModel, UNO_QUERY );
    Reference< XInterface >  xIfc = xFormComp->getParent();
    Reference< form::XForm >  xForm(xIfc, UNO_QUERY);

    ASSERT( xForm.is(), "Wo ist die Form?" );
    if( xForm.is() )
    {
        Reference< container::XIndexContainer >  xFormComps( xForm, UNO_QUERY );
        HTMLControl *pHCntrl = new HTMLControl( xFormComps, nNodeIdx );
        if( !rControls.C40_PTR_INSERT( HTMLControl, pHCntrl ) )
        {
            sal_uInt16 nPos = 0;
            if( rControls.Seek_Entry(pHCntrl,&nPos) &&
                rControls[nPos]->xFormComps==xFormComps )
                rControls[nPos]->nCount++;
            delete pHCntrl;
        }
    }
}


void SwHTMLWriter::GetControls()
{
    // Idee: die absatz- und zeichengebundenen Controls werden erst einmal
    // eingesammelt. Dabei wird fuer jedes Control des Absatz-Position
    // und VCForm in einem Array gemerkt.
    // Ueber dieses Array laesst sich dann feststellen, wo form::Forms geoeffnet
    // und geschlossen werden muessen.
    sal_uInt16 i;
    if( pHTMLPosFlyFrms )
    {
        // die absatz-gebundenen Controls einsammeln
        for( i=0; i<pHTMLPosFlyFrms->Count(); i++ )
        {
            const SwHTMLPosFlyFrm* pPosFlyFrm = pHTMLPosFlyFrms->GetObject( i );
            if( HTML_OUT_CONTROL != pPosFlyFrm->GetOutFn() )
                continue;

            const SdrObject *pSdrObj = pPosFlyFrm->GetSdrObject();
            ASSERT( pSdrObj, "Wo ist das SdrObject?" );
            if( !pSdrObj )
                continue;

            AddControl( aHTMLControls, pSdrObj,
                        pPosFlyFrm->GetNdIndex().GetIndex() );
        }
    }

    // und jetzt die in einem zeichengebundenen Rahmen
    const SwSpzFrmFmts* pSpzFrmFmts = pDoc->GetSpzFrmFmts();
    for( i=0; i<pSpzFrmFmts->Count(); i++ )
    {
        const SwFrmFmt *pFrmFmt = (*pSpzFrmFmts)[i];
        if( RES_DRAWFRMFMT != pFrmFmt->Which() )
            continue;

        const SwFmtAnchor& rAnchor = pFrmFmt->GetAnchor();
        const SwPosition *pPos = rAnchor.GetCntntAnchor();
        if( FLY_IN_CNTNT != rAnchor.GetAnchorId() || !pPos )
            continue;

        const SdrObject *pSdrObj =
            SwHTMLWriter::GetHTMLControl( *(const SwDrawFrmFmt*)pFrmFmt );
        if( !pSdrObj )
            continue;

        AddControl( aHTMLControls, pSdrObj, pPos->nNode.GetIndex() );
    }
}

/*  */

HTMLControl::HTMLControl(
        const Reference< container::XIndexContainer > & rFormComps,
        sal_uInt32 nIdx ) :
    xFormComps( rFormComps ), nNdIdx( nIdx ), nCount( 1 )
{}


HTMLControl::~HTMLControl()
{}

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/html/htmlforw.cxx,v 1.1.1.1 2000-09-18 17:14:55 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.77  2000/09/18 16:04:45  willem.vandorp
      OpenOffice header added.

      Revision 1.76  2000/08/18 13:03:18  jp
      don't export escaped URLs

      Revision 1.75  2000/06/26 09:52:10  jp
      must change: GetAppWindow->GetDefaultDevice

      Revision 1.74  2000/04/28 14:29:11  mib
      unicode

      Revision 1.73  2000/04/11 10:46:30  mib
      unicode

      Revision 1.72  2000/03/31 06:16:25  os
      UNO III: toolkit includes

      Revision 1.71  2000/03/30 07:31:01  os
      UNO III

      Revision 1.70  2000/03/21 15:06:17  os
      UNOIII

      Revision 1.69  2000/03/03 15:21:00  os
      StarView remainders removed

      Revision 1.68  2000/02/14 13:59:45  mib
      #70473#: unicode

      Revision 1.67  2000/02/10 09:51:54  mib
      #68571#: text/plain encoding for submit

      Revision 1.66  1999/11/22 14:25:04  os
      headers added

      Revision 1.65  1999/11/19 16:40:20  os
      modules renamed

*************************************************************************/

diff --git a/sw/source/filter/html/htmlftn.cxx b/sw/source/filter/html/htmlftn.cxx
new file mode 100644
index 0000000..7ce2277
--- /dev/null
+++ b/sw/source/filter/html/htmlftn.cxx
@@ -0,0 +1,689 @@
/*************************************************************************
 *
 *  $RCSfile: htmlftn.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:55 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/


#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HTMLOUT_HXX //autogen
#include <svtools/htmlout.hxx>
#endif
#ifndef _HTMLKYWD_HXX
#include <svtools/htmlkywd.hxx>
#endif

#ifndef _ERRHDL_HXX //autogen
#include <errhdl.hxx>
#endif
#ifndef _NDINDEX_HXX //autogen
#include <ndindex.hxx>
#endif
#ifndef _FMTFTN_HXX //autogen
#include <fmtftn.hxx>
#endif
#ifndef _TXTFTN_HXX //autogen
#include <txtftn.hxx>
#endif
#ifndef _FTNINFO_HXX //autogen
#include <ftninfo.hxx>
#endif
#ifndef _DOC_HXX //autogen
#include <doc.hxx>
#endif
#ifndef _NDTXT_HXX //autogen
#include <ndtxt.hxx>
#endif

#include "swhtml.hxx"
#include "wrthtml.hxx"

typedef SwTxtFtn *SwTxtFtnPtr;
SV_DECL_PTRARR( SwHTMLTxtFtns, SwTxtFtnPtr, 1, 1 )

struct SwHTMLFootEndNote_Impl
{
    SwHTMLTxtFtns aTxtFtns;
    SvStringsDtor aNames;

    String sName;
    String sContent;            // Infos fuer die letzte Fussnote
    BOOL bEndNote;
    BOOL bFixed;
};


xub_StrLen lcl_html_getNextPart( String& rPart, const String& rContent,
                             xub_StrLen nPos )
{
    rPart = aEmptyStr;
    xub_StrLen nLen = rContent.Len();
    if( nPos >= nLen )
    {
        nPos = STRING_MAXLEN;
    }
    else
    {
        BOOL bQuoted = FALSE, bDone = FALSE;
        for( ; nPos < nLen && !bDone; nPos++ )
        {
            sal_Unicode c = rContent.GetChar( nPos );
            switch( c )
            {
            case '\\':
                if( bQuoted )
                    rPart += c;
                bQuoted = !bQuoted;
                break;

            case ';':
                if( bQuoted )
                    rPart += c;
                else
                    bDone = TRUE;
                bQuoted = FALSE;
                break;

            default:
                rPart += c;
                bQuoted = FALSE;
                break;
            }
        }
    }

    return nPos;
}

xub_StrLen lcl_html_getEndNoteInfo( SwEndNoteInfo& rInfo,
                                    const String& rContent,
                                    BOOL bEndNote )
{
    xub_StrLen nStrPos = 0;
    for( USHORT nPart = 0; nPart < 4; nPart++ )
    {
        String aPart;
        if( STRING_MAXLEN != nStrPos )
            nStrPos = lcl_html_getNextPart( aPart, rContent, nStrPos );

        switch( nPart )
        {
        case 0:
            rInfo.aFmt.eType = bEndNote ? SVX_NUM_ROMAN_LOWER : SVX_NUM_ARABIC;
            if( aPart.Len() )
                rInfo.aFmt.eType = (SvxExtNumType)SwHTMLParser::GetNumType( aPart,
                                                             rInfo.aFmt.eType );
            break;

        case 1:
            rInfo.nFtnOffset = aPart.Len() == 0 ? 0 : (USHORT)aPart.ToInt32();
            break;

        case 2:
            rInfo.SetPrefix( aPart );
            break;

        case 3:
            rInfo.SetSuffix( aPart );
            break;
        }
    }

    return nStrPos;
}

void SwHTMLParser::FillEndNoteInfo( const String& rContent )
{
    SwEndNoteInfo aInfo( pDoc->GetEndNoteInfo() );
    lcl_html_getEndNoteInfo( aInfo, rContent, TRUE );
    pDoc->SetEndNoteInfo( aInfo );
}

void SwHTMLParser::FillFootNoteInfo( const String& rContent )
{
    SwFtnInfo aInfo( pDoc->GetFtnInfo() );

    xub_StrLen nStrPos = lcl_html_getEndNoteInfo( aInfo, rContent, FALSE );

    for( USHORT nPart = 4; nPart < 8; nPart++ )
    {
        String aPart;
        if( STRING_MAXLEN != nStrPos )
            nStrPos = lcl_html_getNextPart( aPart, rContent, nStrPos );

        switch( nPart )
        {
        case 4:
            aInfo.eNum = FTNNUM_DOC;
            if( aPart.Len() )
            {
                switch( aPart.GetChar(0) )
                {
                case 'D': aInfo.eNum = FTNNUM_DOC; break;
                case 'C': aInfo.eNum = FTNNUM_CHAPTER; break;
                case 'P': aInfo.eNum = FTNNUM_PAGE; break;
                }
            }
            break;

        case 5:
            aInfo.ePos = FTNPOS_PAGE;
            if( aPart.Len() )
            {
                switch( aPart.GetChar(0) )
                {
                case 'C': aInfo.ePos = FTNPOS_CHAPTER; break;
                case 'P': aInfo.ePos = FTNPOS_PAGE; break;
                }
            }
            break;

        case 6:
            aInfo.aQuoVadis = aPart;
            break;

        case 7:
            aInfo.aErgoSum = aPart;
            break;
        }
    }

    pDoc->SetFtnInfo( aInfo );
}

void SwHTMLParser::InsertFootEndNote( const String& rName, BOOL bEndNote,
                                      BOOL bFixed )
{
    if( !pFootEndNoteImpl )
        pFootEndNoteImpl = new SwHTMLFootEndNote_Impl;

    pFootEndNoteImpl->sName = rName;
    if( pFootEndNoteImpl->sName.Len() > 3 )
        pFootEndNoteImpl->sName.Erase( pFootEndNoteImpl->sName.Len() - 3 );
    // TODO: ToUpperAscii???
    pFootEndNoteImpl->sName.ToUpperAscii();

    pFootEndNoteImpl->bEndNote = bEndNote;
    pFootEndNoteImpl->bFixed = bFixed;
    pFootEndNoteImpl->sContent = aEmptyStr;
}

void SwHTMLParser::FinishFootEndNote()
{
    if( !pFootEndNoteImpl )
        return;

    SwFmtFtn aFtn( pFootEndNoteImpl->bEndNote );
    if( pFootEndNoteImpl->bFixed )
        aFtn.SetNumStr( pFootEndNoteImpl->sContent );

    pDoc->Insert( *pPam, aFtn );
    SwTxtFtn *pTxtFtn =
        (SwTxtFtn *)pPam->GetNode()->GetTxtNode()->GetTxtAttr(
                                pPam->GetPoint()->nContent.GetIndex() - 1,
                                RES_TXTATR_FTN );
    // In Kopf- und Fusszeilen duerfen keine Fussnoten eingefuegt werden.
    if( pTxtFtn )
    {
        pFootEndNoteImpl->aTxtFtns.Insert( pTxtFtn,
                                           pFootEndNoteImpl->aTxtFtns.Count() );

        pFootEndNoteImpl->aNames.Insert( new String(pFootEndNoteImpl->sName),
                                         pFootEndNoteImpl->aNames.Count() );
    }
    pFootEndNoteImpl->sName = aEmptyStr;
    pFootEndNoteImpl->sContent = aEmptyStr;
    pFootEndNoteImpl->bFixed = FALSE;
}

void SwHTMLParser::InsertFootEndNoteText()
{
    if( pFootEndNoteImpl && pFootEndNoteImpl->bFixed )
        pFootEndNoteImpl->sContent += aToken;
}

void SwHTMLParser::DeleteFootEndNoteImpl()
{
    delete pFootEndNoteImpl;
    pFootEndNoteImpl = 0;
}

SwNodeIndex *SwHTMLParser::GetFootEndNoteSection( const String& rName )
{
    SwNodeIndex *pSttNdIdx = 0;

    if( pFootEndNoteImpl )
    {
        String aName( rName );
        // TODO: ToUpperAscii
        aName.ToUpperAscii();

        USHORT nCount = pFootEndNoteImpl->aNames.Count();
        for( USHORT i=0; i<nCount; i++ )
        {
            if( *pFootEndNoteImpl->aNames[i] == aName )
            {
                pSttNdIdx = pFootEndNoteImpl->aTxtFtns[i]->GetStartNode();
                pFootEndNoteImpl->aNames.DeleteAndDestroy( i, 1 );
                pFootEndNoteImpl->aTxtFtns.Remove( i, 1 );
                if( !pFootEndNoteImpl->aNames.Count() )
                {
                    delete pFootEndNoteImpl;
                    pFootEndNoteImpl = 0;
                }

                break;
            }
        }
    }

    return pSttNdIdx;
}

Writer& OutHTML_SwFmtFtn( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;

    SwFmtFtn& rFmtFtn = (SwFmtFtn&)rHt;
    SwTxtFtn *pTxtFtn = rFmtFtn.GetTxtFtn();
    if( !pTxtFtn )
        return rWrt;

    String sFtnName, sClass;
    USHORT nPos;
    if( rFmtFtn.IsEndNote() )
    {
        nPos = rHTMLWrt.pFootEndNotes ? rHTMLWrt.pFootEndNotes->Count() : 0;
        ASSERT( nPos == rHTMLWrt.nFootNote + rHTMLWrt.nEndNote,
                "OutHTML_SwFmtFtn: Position falsch" );
        sClass.AssignAscii( sHTML_sdendnote_anc );
        sFtnName.AssignAscii( sHTML_sdendnote );
        sFtnName += String::CreateFromInt32( (sal_Int32)(++rHTMLWrt.nEndNote) );
    }
    else
    {
        nPos = rHTMLWrt.nFootNote;
        sClass.AssignAscii( sHTML_sdfootnote_anc );
        sFtnName.AssignAscii( sHTML_sdfootnote);
        sFtnName += String::CreateFromInt32( (sal_Int32)(++rHTMLWrt.nFootNote));
    }

    if( !rHTMLWrt.pFootEndNotes )
        rHTMLWrt.pFootEndNotes = new SwHTMLTxtFtns;
    rHTMLWrt.pFootEndNotes->Insert( pTxtFtn, nPos );

    ByteString sOut( '<' );
    (((sOut += sHTML_anchor) += ' ') += sHTML_O_class) += "=\"";
    rWrt.Strm() << sOut.GetBuffer();
    HTMLOutFuncs::Out_String( rWrt.Strm(), sClass, rHTMLWrt.eDestEnc );
    ((sOut += "\" ") += sHTML_O_name) += "=\"";
    rWrt.Strm() << sOut.GetBuffer();
    HTMLOutFuncs::Out_String( rWrt.Strm(), sFtnName, rHTMLWrt.eDestEnc );
    (((sOut += sHTML_FTN_anchor) += "\" ") += sHTML_O_href) += "=\"#";
    rWrt.Strm() << sOut.GetBuffer();
    HTMLOutFuncs::Out_String( rWrt.Strm(), sFtnName, rHTMLWrt.eDestEnc );
    (sOut += sHTML_FTN_symbol)+= '\"';
    if( rFmtFtn.GetNumStr().Len() )
        (sOut += ' ') += sHTML_O_sdfixed;
    sOut += '>';
    rWrt.Strm() << sOut.GetBuffer();
    HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_superscript, TRUE );

    HTMLOutFuncs::Out_String( rWrt.Strm(), rFmtFtn.GetViewNumStr(*rWrt.pDoc),
                                 rHTMLWrt.eDestEnc );
    HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_superscript, FALSE );
    HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_anchor, FALSE );

    return rWrt;
}

void SwHTMLWriter::OutFootEndNotes()
{
    ASSERT( pFootEndNotes,
            "SwHTMLWriter::OutFootEndNotes(): unnoetiger Aufruf" );
    if( !pFootEndNotes )
        return;

#ifndef PRODUCT
    USHORT nFtn = nFootNote, nEn = nEndNote;
#endif
    nFootNote = 0, nEndNote = 0;

    for( USHORT i=0; i<pFootEndNotes->Count(); i++ )
    {
        SwTxtFtn *pTxtFtn = (*pFootEndNotes)[i];
        pFmtFtn = &pTxtFtn->GetFtn();

        String sFtnName, sClass;
        if( pFmtFtn->IsEndNote() )
        {
            sClass.AssignAscii( sHTML_sdendnote );
            sFtnName.AssignAscii( sHTML_sdendnote );
            sFtnName.Append( String::CreateFromInt32((sal_Int32)(++nEndNote)) );
        }
        else
        {
            sClass.AssignAscii( sHTML_sdfootnote );
            sFtnName.AssignAscii( sHTML_sdfootnote );
            sFtnName.Append( String::CreateFromInt32((sal_Int32)(++nFootNote)));
        }

        if( bLFPossible )
            OutNewLine();
        ByteString sOut( '<' );
        (((sOut += sHTML_division) += ' ') += sHTML_O_id) += "=\"";
        Strm() << sOut.GetBuffer();
        HTMLOutFuncs::Out_String( Strm(), sFtnName, eDestEnc );
        Strm() << "\">";

        bLFPossible = TRUE;
        IncIndentLevel();   // Inhalt von <DIV> einruecken

        ASSERT( pTxtFtn, "SwHTMLWriter::OutFootEndNotes: SwTxtFtn fehlt" );
        SwNodeIndex *pSttNdIdx = pTxtFtn->GetStartNode();
        ASSERT( pSttNdIdx,
                "SwHTMLWriter::OutFootEndNotes: StartNode-Index fehlt" );
        if( pSttNdIdx )
        {
            HTMLSaveData aSaveData( *this, pSttNdIdx->GetIndex()+1,
                pSttNdIdx->GetNode().EndOfSectionIndex(), GetFlyFrmFmt(),
                FALSE );
            Out_SwDoc( pCurPam );
        }

        DecIndentLevel();   // Inhalt von <DIV> einruecken
        if( bLFPossible )
            OutNewLine();
        HTMLOutFuncs::Out_AsciiTag( Strm(), sHTML_division, FALSE );
        bLFPossible = TRUE;

        ASSERT( !pFmtFtn,
                "SwHTMLWriter::OutFootEndNotes: Ftn wurde nicht ausgegeben" );
        if( pFmtFtn )
        {
            if( pFmtFtn->IsEndNote() )
                nEndNote++;
            else
                nFootNote++;

            pFmtFtn = 0;
        }
    }

#ifndef PRODUCT
    ASSERT( nFtn == nFootNote,
            "SwHTMLWriter::OutFootEndNotes: Anzahl Fussnoten stimmt nicht" );
    ASSERT( nEn == nEndNote,
            "SwHTMLWriter::OutFootEndNotes: Anzahl Endnoten stimmt nicht" );
#endif

    delete pFootEndNotes;
    pFootEndNotes = 0;
    nFootNote = nEndNote = 0;
}

xub_StrLen SwHTMLWriter::GetFootEndNoteSymLen( const SwFmtFtn& rFmtFtn )
{
    xub_StrLen nLen = rFmtFtn.GetViewNumStr( *pDoc ).Len();

    if( rFmtFtn.GetNumStr().Len() == 0 )
    {
        const SwEndNoteInfo * pInfo =
            rFmtFtn.IsEndNote() ? &pDoc->GetEndNoteInfo() : &pDoc->GetFtnInfo();

        nLen += pInfo->GetPrefix().Len();
        nLen += pInfo->GetSuffix().Len();
    }

    return nLen;
}

void SwHTMLWriter::OutFootEndNoteSym( const SwFmtFtn& rFmtFtn )
{
    const SwEndNoteInfo *pInfo;

    String sFtnName, sClass, sPrefix, sSuffix;
    if( rFmtFtn.IsEndNote() )
    {
        sClass.AssignAscii( sHTML_sdendnote_sym );
        sFtnName.AssignAscii( sHTML_sdendnote );
        sFtnName.Append( String::CreateFromInt32((sal_Int32)nEndNote) );
        pInfo = &pDoc->GetEndNoteInfo();
    }
    else
    {
        sClass.AssignAscii( sHTML_sdfootnote_sym );
        sFtnName.AssignAscii( sHTML_sdfootnote );
        sFtnName.Append( String::CreateFromInt32((sal_Int32)nFootNote));
        pInfo = &pDoc->GetFtnInfo();
    }

    ByteString sOut( '<' );
    (((sOut += sHTML_anchor) +=  ' ') += sHTML_O_class) += "=\"";
    Strm() << sOut.GetBuffer();
    HTMLOutFuncs::Out_String( Strm(), sClass, eDestEnc );
    ((sOut += "\" ") += sHTML_O_name) += "=\"";
    Strm() << sOut.GetBuffer();
    HTMLOutFuncs::Out_String( Strm(), sFtnName, eDestEnc );
    (((sOut += sHTML_FTN_symbol) +="\" ") += sHTML_O_href) += "=\"#";
    Strm() << sOut.GetBuffer();
    HTMLOutFuncs::Out_String( Strm(), sFtnName, eDestEnc );
    (sOut += sHTML_FTN_anchor) += "\">";
    Strm() << sOut.GetBuffer();

    BOOL bAuto = rFmtFtn.GetNumStr().Len() == 0;
    String sNum;
    if( bAuto )
        sNum += pInfo->GetPrefix();
    sNum += rFmtFtn.GetViewNumStr(*pDoc);
    if( bAuto )
        sNum += pInfo->GetSuffix();
    HTMLOutFuncs::Out_String( Strm(), sNum, eDestEnc );
    HTMLOutFuncs::Out_AsciiTag( Strm(), sHTML_anchor, FALSE );
}

USHORT lcl_html_fillEndNoteInfo( const SwEndNoteInfo& rInfo,
                                 String *pParts,
                                 BOOL bEndNote  )
{
    USHORT nParts = 0;
    SvxExtNumType eFmt = rInfo.aFmt.eType;
    if( (bEndNote ? SVX_NUM_ROMAN_LOWER : SVX_NUM_ARABIC) != eFmt )
    {
        const sal_Char *pStr = SwHTMLWriter::GetNumFormat( eFmt );
        if( pStr )
        {
            pParts[0] = String::CreateFromAscii( pStr );
            nParts = 1;
        }
    }
    if( rInfo.nFtnOffset > 0 )
    {
        pParts[1] = String::CreateFromInt32( (sal_Int32)rInfo.nFtnOffset );
        nParts = 2;
    }
    if( rInfo.GetPrefix().Len() > 0 )
    {
        pParts[2] = rInfo.GetPrefix();
        nParts = 3;
    }
    if( rInfo.GetSuffix().Len() > 0 )
    {
        pParts[3] = rInfo.GetSuffix();
        nParts = 4;
    }

    return nParts;
}

void lcl_html_outFootEndNoteInfo( Writer& rWrt, String *pParts,
                                  USHORT nParts, const sal_Char *pName )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;

    String aContent;
    for( USHORT i=0; i<nParts; i++ )
    {
        xub_StrLen nPos = 0;
        String aTmp( pParts[i] );
        String aRep( String::CreateFromAscii("\\\\") );
        while( STRING_NOTFOUND != (nPos = aTmp.SearchAndReplaceAscii( "\\",
                                                     aRep, nPos ) ) )
            nPos += 2;
        nPos = 0;
        aRep.AssignAscii( "\\;" );
        while( STRING_NOTFOUND != (nPos = aTmp.SearchAndReplaceAscii( ";",
                                                     aRep, nPos ) ) )
            nPos += 2;
        if( i > 0 )
            aContent += ';';
        aContent += aTmp;
    }

    rHTMLWrt.OutNewLine();
    ByteString sOut( '<' );
    (((((((sOut += sHTML_meta) +=  ' ')
        += sHTML_O_name) += "=\"") += pName) += "\" ")
        += sHTML_O_content) += "=\"";
    rWrt.Strm() << sOut.GetBuffer();
    HTMLOutFuncs::Out_String( rWrt.Strm(), aContent, rHTMLWrt.eDestEnc );
    rWrt.Strm() << "\">";
}

void SwHTMLWriter::OutFootEndNoteInfo()
{
    // Nummerntyp (1 bzw. i)
    // Offset (0)
    // Davor
    // Dahinter
    // Dok/Seite/Kap (D)
    // Position (S)
    // Folgeseite
    // Beginn

    {
        const SwFtnInfo& rInfo = pDoc->GetFtnInfo();
        String aParts[8];
        USHORT nParts = lcl_html_fillEndNoteInfo( rInfo, aParts, FALSE );
        if( rInfo.eNum != FTNNUM_DOC )
        {
            aParts[4] = rInfo.eNum == FTNNUM_CHAPTER ? 'C' : 'P';
            nParts = 5;
        }
        if( rInfo.ePos != FTNPOS_PAGE)
        {
            aParts[5] = 'C';
            nParts = 6;
        }
        if( rInfo.aQuoVadis.Len() > 0 )
        {
            aParts[6] = rInfo.aQuoVadis;
            nParts = 7;
        }
        if( rInfo.aErgoSum.Len() > 0 )
        {
            aParts[7] = rInfo.aErgoSum;
            nParts = 8;
        }
        if( nParts > 0 )
            lcl_html_outFootEndNoteInfo( *this, aParts, nParts,
                                         sHTML_META_sdfootnote );
    }

    {
        const SwEndNoteInfo& rInfo = pDoc->GetEndNoteInfo();
        String aParts[4];
        USHORT nParts = lcl_html_fillEndNoteInfo( rInfo, aParts, TRUE );
        if( nParts > 0 )
            lcl_html_outFootEndNoteInfo( *this, aParts, nParts,
                                         sHTML_META_sdendnote );
    }
}

/*************************************************************************

      $Log: not supported by cvs2svn $
      Revision 1.6  2000/09/18 16:04:45  willem.vandorp
      OpenOffice header added.

      Revision 1.5  2000/04/10 12:20:56  mib
      unicode

      Revision 1.4  1999/09/21 09:49:49  mib
      multiple text encodings

      Revision 1.3  1999/09/17 12:13:24  mib
      support of multiple and non system text encodings

      Revision 1.2  1998/11/17 09:44:36  OS
      #58263# NumType durch SvxExtNumType ersetzt


      Rev 1.1   17 Nov 1998 10:44:36   OS
   #58263# NumType durch SvxExtNumType ersetzt

      Rev 1.0   02 Nov 1998 17:21:20   MIB
   #58480#: Fuss-/Endnoten

*************************************************************************/

diff --git a/sw/source/filter/html/htmlgrin.cxx b/sw/source/filter/html/htmlgrin.cxx
new file mode 100644
index 0000000..49fa2c6
--- /dev/null
+++ b/sw/source/filter/html/htmlgrin.cxx
@@ -0,0 +1,1656 @@
/*************************************************************************
 *
 *  $RCSfile: htmlgrin.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:55 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop
#define ITEMID_BOXINFO      SID_ATTR_BORDER_INNER

#include "hintids.hxx"

#ifndef _SV_SVAPP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _WRKWIN_HXX //autogen
#include <vcl/wrkwin.hxx>
#endif
#ifndef _SFXSTRITEM_HXX
#include <svtools/stritem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_ADJITEM_HXX //autogen
#include <svx/adjitem.hxx>
#endif
#ifndef _SVX_FHGTITEM_HXX //autogen
#include <svx/fhgtitem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _SVX_COLRITEM_HXX //autogen
#include <svx/colritem.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _SFXDOCFILE_HXX //autogen
#include <sfx2/docfile.hxx>
#endif
#ifndef _IMAP_HXX //autogen
#include <svtools/imap.hxx>
#endif
#ifndef _HTMLTOKN_H
#include <svtools/htmltokn.h>
#endif
#ifndef _HTMLKYWD_HXX
#include <svtools/htmlkywd.hxx>
#endif


#ifndef _FMTORNT_HXX //autogen
#include <fmtornt.hxx>
#endif
#ifndef _FMTURL_HXX //autogen
#include <fmturl.hxx>
#endif
#ifndef _FMTANCHR_HXX //autogen
#include <fmtanchr.hxx>
#endif
#ifndef _FMTSRND_HXX //autogen
#include <fmtsrnd.hxx>
#endif
#ifndef _FMTINFMT_HXX //autogen
#include <fmtinfmt.hxx>
#endif
#ifndef _FMTCNTNT_HXX //autogen
#include <fmtcntnt.hxx>
#endif
#ifndef _FMTANCHR_HXX //autogen
#include <fmtanchr.hxx>
#endif
#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _FMTINFMT_HXX //autogen
#include <fmtinfmt.hxx>
#endif
#ifndef _FRMATR_HXX
#include "frmatr.hxx"
#endif
#ifndef _CHARATR_HXX
#include "charatr.hxx"
#endif
#ifndef _FRMFMT_HXX //autogen
#include <frmfmt.hxx>
#endif
#ifndef _CHARFMT_HXX //autogen
#include <charfmt.hxx>
#endif
#ifndef _DOCARY_HXX
#include <docary.hxx>
#endif
#ifndef _SWDOCSH_HXX //autogen
#include <docsh.hxx>
#endif
#ifndef _PAM_HXX
#include <pam.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _NDTXT_HXX
#include <ndtxt.hxx>
#endif
#ifndef _SHELLIO_HXX
#include <shellio.hxx>
#endif
#ifndef _POOLFMT_HXX
#include <poolfmt.hxx>
#endif
#ifndef _BOOKMRK_HXX
#include <bookmrk.hxx>
#endif
#ifndef _NDGRF_HXX
#include <ndgrf.hxx>
#endif
#ifndef _HTMLNUM_HXX
#include <htmlnum.hxx>
#endif
#ifndef _SWCSS1_HXX
#include <swcss1.hxx>
#endif
#ifndef _SWHTML_HXX
#include <swhtml.hxx>
#endif


HTMLOptionEnum __FAR_DATA aHTMLImgHAlignTable[] =
{
    { sHTML_AL_left,    HORI_LEFT       },
    { sHTML_AL_right,   HORI_RIGHT      },
    { 0,                0               }
};


HTMLOptionEnum __FAR_DATA aHTMLImgVAlignTable[] =
{
    { sHTML_VA_top,         VERT_LINE_TOP       },
    { sHTML_VA_texttop,     VERT_CHAR_TOP       },
    { sHTML_VA_middle,      VERT_CENTER         },
    { sHTML_AL_center,      VERT_CENTER         },
    { sHTML_VA_absmiddle,   VERT_LINE_CENTER    },
    { sHTML_VA_bottom,      VERT_TOP            },
    { sHTML_VA_baseline,    VERT_TOP            },
    { sHTML_VA_absbottom,   VERT_LINE_BOTTOM    },
    { 0,                    0                   }
};

SV_IMPL_PTRARR( ImageMaps, ImageMapPtr )

ImageMap *SwHTMLParser::FindImageMap( const String& rName ) const
{
    ImageMap *pImageMap = 0;

    ASSERT( rName.GetChar(0) != '#', "FindImageName: Name beginnt mit #!" );

    if( pImageMaps )
    {
        for( USHORT i=0; i<pImageMaps->Count(); i++ )
        {
            ImageMap *pIMap = (*pImageMaps)[i];
            if( rName.EqualsIgnoreCaseAscii( pIMap->GetName() ) )
            {
                pImageMap = pIMap;
                break;
            }
        }
    }
    return pImageMap;
}

void SwHTMLParser::ConnectImageMaps()
{
    SwNodes& rNds = pDoc->GetNodes();
    // auf den Start-Node der 1. Section
    ULONG nIdx = rNds.GetEndOfAutotext().StartOfSectionIndex() + 1;
    ULONG nEndIdx = rNds.GetEndOfAutotext().GetIndex();

    SwGrfNode* pGrfNd;
    while( nMissingImgMaps > 0 && nIdx < nEndIdx )
    {
        SwNode *pNd = rNds[nIdx + 1];
        if( 0 != (pGrfNd = pNd->GetGrfNode()) )
        {
            SwFrmFmt *pFmt = pGrfNd->GetFlyFmt();
            SwFmtURL aURL( pFmt->GetURL() );
            const ImageMap *pIMap = aURL.GetMap();
            if( pIMap && pIMap->GetIMapObjectCount()==0 )
            {
                // Die (leere) Image-Map des Nodes wird entweder
                // durch die jetzt gefundene Image-Map ersetzt
                // oder geloescht.
                ImageMap *pNewIMap =
                    FindImageMap( pIMap->GetName() );
                aURL.SetMap( pNewIMap );
                pFmt->SetAttr( aURL );
                if( !pGrfNd->IsScaleImageMap() )
                {
                    // die Grafikgroesse ist mitlerweile da oder dir
                    // Grafik muss nicht skaliert werden
                    pGrfNd->ScaleImageMap();
                }
                nMissingImgMaps--;  // eine Map weniger suchen
            }
        }
        nIdx = rNds[nIdx]->EndOfSectionIndex() + 1;
    }
}


/*  */

void SwHTMLParser::SetAnchorAndAdjustment( SwVertOrient eVertOri,
                                           SwHoriOrient eHoriOri,
                                           const SfxItemSet &rCSS1ItemSet,
                                           const SvxCSS1PropertyInfo &rCSS1PropInfo,
                                           SfxItemSet& rFrmItemSet )
{
    const SfxItemSet *pCntnrItemSet = 0;
    USHORT i = aContexts.Count();
    while( !pCntnrItemSet && i > nContextStMin )
        pCntnrItemSet = aContexts[--i]->GetFrmItemSet();

    if( pCntnrItemSet )
    {
        // Wenn wir und in einem Container befinden wird die Verankerung
        // des Containers uebernommen.
        rFrmItemSet.Put( *pCntnrItemSet );
    }
    else if( pCSS1Parser->MayBePositioned( rCSS1PropInfo, TRUE ) )
    {
        // Wenn die Ausrichtung anhand der CSS1-Optionen gesetzt werden kann
        // werden die benutzt.
        SetAnchorAndAdjustment( rCSS1ItemSet, rCSS1PropInfo, rFrmItemSet );
    }
    else
    {
        // Sonst wird die Ausrichtung entsprechend der normalen HTML-Optionen
        // gesetzt.
        SetAnchorAndAdjustment( eVertOri, eHoriOri, rFrmItemSet );
    }
}

void SwHTMLParser::SetAnchorAndAdjustment( SwVertOrient eVertOri,
                                           SwHoriOrient eHoriOri,
                                           SfxItemSet& rFrmSet,
                                           BOOL bDontAppend )
{
    BOOL bMoveBackward = FALSE;
    SwFmtAnchor aAnchor( FLY_IN_CNTNT );
    SwRelationOrient eVertRel = FRAME;

    if( HORI_NONE != eHoriOri )
    {
        // den Absatz-Einzug bestimmen
        USHORT nLeftSpace = 0, nRightSpace = 0;
        short nIndent = 0;
        GetMarginsFromContextWithNumBul( nLeftSpace, nRightSpace, nIndent );

        // Horizonale Ausrichtung und Umlauf bestimmen.
        SwRelationOrient eHoriRel;
        SwSurround eSurround;
        switch( eHoriOri )
        {
        case HORI_LEFT:
            eHoriRel = nLeftSpace ? PRTAREA : FRAME;
            eSurround = SURROUND_RIGHT;
            break;
        case HORI_RIGHT:
            eHoriRel = nRightSpace ? PRTAREA : FRAME;
            eSurround = SURROUND_LEFT;
            break;
        case HORI_CENTER:   // fuer Tabellen
            eHoriRel = FRAME;
            eSurround = SURROUND_NONE;
            break;
        default:
            eHoriRel = FRAME;
            eSurround = SURROUND_PARALLEL;
            break;
        }

        // Einen neuen Absatz aufmachen, wenn der aktuelle
        // absatzgebundene Rahmen ohne Umlauf enthaelt.
        if( !bDontAppend && HasCurrentParaFlys( TRUE ) )
        {
            // Wenn der Absatz nur Grafiken enthaelt, braucht er
            // auch keinen unteren Absatz-Abstand. Da hier auch bei
            // Verwendung von Styles kein Abstand enstehen soll, wird
            // hier auch geweohnlich attributiert !!!
            USHORT nUpper=0, nLower=0;
            GetULSpaceFromContext( nUpper, nLower );
            InsertAttr( SvxULSpaceItem( nUpper, 0 ), FALSE, TRUE );

            AppendTxtNode( AM_NOSPACE );

            if( nUpper )
            {
                NewAttr( &aAttrTab.pULSpace, SvxULSpaceItem( 0, nLower ) );
                aParaAttrs.Insert( aAttrTab.pULSpace, aParaAttrs.Count() );
                EndAttr( aAttrTab.pULSpace, 0, FALSE );
            }
        }

        // Vertikale Ausrichtung und Verankerung bestimmen.
        xub_StrLen nCntnt = pPam->GetPoint()->nContent.GetIndex();
        if( nCntnt )
        {
            aAnchor.SetType( FLY_AUTO_CNTNT );
            bMoveBackward = TRUE;
            eVertOri = VERT_CHAR_BOTTOM;
            eVertRel = REL_CHAR;
        }
        else
        {
            aAnchor.SetType( FLY_AT_CNTNT );
            eVertOri = VERT_TOP;
            eVertRel = PRTAREA;
        }

        rFrmSet.Put( SwFmtHoriOrient( 0, eHoriOri, eHoriRel) );

        rFrmSet.Put( SwFmtSurround( eSurround ) );
    }
    rFrmSet.Put( SwFmtVertOrient( 0, eVertOri, eVertRel) );

    if( bMoveBackward )
        pPam->Move( fnMoveBackward );

    aAnchor.SetAnchor( pPam->GetPoint() );

    if( bMoveBackward )
        pPam->Move( fnMoveForward );

    rFrmSet.Put( aAnchor );
}

void SwHTMLParser::RegisterFlyFrm( SwFrmFmt *pFlyFmt )
{
    // automatisch verankerte Rahmen muessen noch um eine Position
    // nach vorne verschoben werden.
    if( RES_DRAWFRMFMT != pFlyFmt->Which() &&
        FLY_AT_CNTNT == pFlyFmt->GetAnchor().GetAnchorId() &&
        SURROUND_THROUGHT == pFlyFmt->GetSurround().GetSurround() )
    {
        aMoveFlyFrms.Insert( pFlyFmt, aMoveFlyFrms.Count() );
        aMoveFlyCnts.Insert( pPam->GetPoint()->nContent.GetIndex(),
                             aMoveFlyCnts.Count() );
    }
}

/*  */

void SwHTMLParser::GetDefaultScriptType( ScriptType& rType,
                                         String& rTypeStr ) const
{
    SwDocShell *pDocSh = pDoc->GetDocShell();
    SvKeyValueIterator* pHeaderAttrs = pDocSh ? pDocSh->GetHeaderAttributes()
                                              : 0;
    rType = GetScriptType( pHeaderAttrs );
    rTypeStr = GetScriptTypeString( pHeaderAttrs );
}

/*  */

void SwHTMLParser::InsertImage()
{
    // und jetzt auswerten
    String sGrfNm, sAltNm, aId, aClass, aStyle, aMap, sHTMLGrfName;
    SwVertOrient eVertOri = VERT_TOP;
    SwHoriOrient eHoriOri = HORI_NONE;
    long nWidth=0, nHeight=0;
    long nVSpace=0, nHSpace=0;

    USHORT nBorder = (aAttrTab.pINetFmt ? 1 : 0);
    BOOL bIsMap = FALSE;
    BOOL bPrcWidth = FALSE;
    BOOL bPrcHeight = FALSE;
    SvxMacroItem aMacroItem;

    ScriptType eDfltScriptType;
    String sDfltScriptType;
    GetDefaultScriptType( eDfltScriptType, sDfltScriptType );

    const HTMLOptions *pOptions = GetOptions();
    for( USHORT i = pOptions->Count(); i; )
    {
        USHORT nEvent = 0;
        ScriptType eScriptType = eDfltScriptType;
        const HTMLOption *pOption = (*pOptions)[--i];
        switch( pOption->GetToken() )
        {
            case HTML_O_ID:
                aId = pOption->GetString();
                break;
            case HTML_O_STYLE:
                aStyle = pOption->GetString();
                break;
            case HTML_O_CLASS:
                aClass = pOption->GetString();
                break;
            case HTML_O_SRC:
                ASSERT( INetURLObject::GetBaseURL() == sBaseURL,
                        "<IMG>: Base URL ist zerschossen" );
                sGrfNm = pOption->GetString();
                if( !InternalImgToPrivateURL(sGrfNm) )
                    sGrfNm = INetURLObject::RelToAbs( sGrfNm );
                break;
            case HTML_O_ALIGN:
                eVertOri =
                    (SwVertOrient)pOption->GetEnum( aHTMLImgVAlignTable,
                                                    VERT_TOP );
                eHoriOri =
                    (SwHoriOrient)pOption->GetEnum( aHTMLImgHAlignTable,
                                                    HORI_NONE );
                break;
            case HTML_O_WIDTH:
                // erstmal nur als Pixelwerte merken!
                nWidth = pOption->GetNumber();
                bPrcWidth = (pOption->GetString().Search('%') != STRING_NOTFOUND);
                if( bPrcWidth && nWidth>100 )
                    nWidth = 100;
                break;
            case HTML_O_HEIGHT:
                // erstmal nur als Pixelwerte merken!
                nHeight = pOption->GetNumber();
                bPrcHeight = (pOption->GetString().Search('%') != STRING_NOTFOUND);
                if( bPrcHeight && nHeight>100 )
                    nHeight = 100;
                break;
            case HTML_O_VSPACE:
                nVSpace = pOption->GetNumber();
                break;
            case HTML_O_HSPACE:
                nHSpace = pOption->GetNumber();
                break;
            case HTML_O_ALT:
                sAltNm = pOption->GetString();
                break;
            case HTML_O_BORDER:
                nBorder = (USHORT)pOption->GetNumber();
                break;
            case HTML_O_ISMAP:
                bIsMap = TRUE;
                break;
            case HTML_O_USEMAP:
                aMap = pOption->GetString();
                break;
            case HTML_O_NAME:
                sHTMLGrfName = pOption->GetString();
                break;

            case HTML_O_SDONLOAD:
                eScriptType = STARBASIC;
            case HTML_O_ONLOAD:
                nEvent = SVX_EVENT_IMAGE_LOAD;
                goto IMAGE_SETEVENT;

            case HTML_O_SDONABORT:
                eScriptType = STARBASIC;
            case HTML_O_ONABORT:
                nEvent = SVX_EVENT_IMAGE_ABORT;
                goto IMAGE_SETEVENT;

            case HTML_O_SDONERROR:
                eScriptType = STARBASIC;
            case HTML_O_ONERROR:
                nEvent = SVX_EVENT_IMAGE_ERROR;
                goto IMAGE_SETEVENT;
IMAGE_SETEVENT:
                {
                    String sTmp( pOption->GetString() );
                    if( sTmp.Len() )
                    {
                        sTmp.ConvertLineEnd();
                        String sScriptType;
                        if( EXTENDED_STYPE == eScriptType )
                            sScriptType = sDfltScriptType;
                        aMacroItem.SetMacro( nEvent,
                            SvxMacro( sTmp, sScriptType, eScriptType ));
                    }
                }
                break;
        }
    }

    if( !sGrfNm.Len() )
        return;

    // Wenn wir in einer Numerierung stehen und der Absatz noch leer und
    // nicht numeriert ist, handelt es sich vielleicht um die Grafik
    // einer Bullet-Liste
    if( !pPam->GetPoint()->nContent.GetIndex() &&
        GetNumInfo().GetDepth() > 0 && GetNumInfo().GetDepth() <= MAXLEVEL &&
        aBulletGrfs[GetNumInfo().GetDepth()-1].Len() &&
        aBulletGrfs[GetNumInfo().GetDepth()-1]==sGrfNm )
    {
        SwTxtNode* pTxtNode = pPam->GetNode()->GetTxtNode();
        if( pTxtNode && pTxtNode->GetNum() &&
            NO_NUMLEVEL & pTxtNode->GetNum()->GetLevel() )
        {
            SwNodeNum aNum( *pTxtNode->GetNum() );
            aNum.SetLevel( aNum.GetLevel() & ~NO_NUMLEVEL );
            ASSERT( aNum.GetLevel() == GetNumInfo().GetLevel(),
                    "Numerierungs-Ebene stimmt nicht" );
            pTxtNode->UpdateNum( aNum );

            // Rule invalisieren ist noetig, weil zwischem dem einlesen
            // des LI und der Grafik ein EndAction gerufen worden sein kann.
            if( GetNumInfo().GetNumRule() )
                GetNumInfo().GetNumRule()->SetInvalidRule( TRUE );

            // Die Vorlage novh mal setzen. Ist noetig, damit der
            // Erstzeilen-Einzug stimmt.
            SetTxtCollAttrs();

            return;
        }
    }

    SfxItemSet aItemSet( pDoc->GetAttrPool(), pCSS1Parser->GetWhichMap() );
    SvxCSS1PropertyInfo aPropInfo;
    if( HasStyleOptions( aStyle, aId, aClass ) )
        ParseStyleOptions( aStyle, aId, aClass, aItemSet, aPropInfo );

    SfxItemSet aFrmSet( pDoc->GetAttrPool(),
                        RES_FRMATR_BEGIN, RES_FRMATR_END-1 );
    if( !IsNewDoc() )
        Reader::ResetFrmFmtAttrs( aFrmSet );

    // Umrandung setzen
    long nHBorderWidth = 0, nVBorderWidth = 0;
    if( nBorder )
    {
        nHBorderWidth = (long)nBorder;
        nVBorderWidth = (long)nBorder;
        SvxCSS1Parser::PixelToTwip( nVBorderWidth, nHBorderWidth );

        SvxBorderLine aHBorderLine;
        SvxBorderLine aVBorderLine;

        SvxCSS1Parser::SetBorderWidth( aHBorderLine,
                                       (USHORT)nHBorderWidth, FALSE );
        if( nHBorderWidth == nVBorderWidth )
            aVBorderLine.SetOutWidth( aHBorderLine.GetOutWidth() );
        else
            SvxCSS1Parser::SetBorderWidth( aVBorderLine,
                                           (USHORT)nVBorderWidth, FALSE );

        // die tatsaechlich gesetzter Rahmenbreite benutzen und nicht die
        // Wunschbreite!
        nHBorderWidth = aHBorderLine.GetOutWidth();
        nVBorderWidth = aVBorderLine.GetOutWidth();

        if( aAttrTab.pINetFmt )
        {
            const String& rURL =
                ((const SwFmtINetFmt&)aAttrTab.pINetFmt->GetItem()).GetValue();

            pCSS1Parser->SetATagStyles();
            USHORT nPoolId =  pDoc->IsVisitedURL( rURL )
                                    ? RES_POOLCHR_INET_VISIT
                                    : RES_POOLCHR_INET_NORMAL;
            const SwCharFmt *pCharFmt = pCSS1Parser->GetCharFmtFromPool( nPoolId );
            aHBorderLine.SetColor( pCharFmt->GetColor().GetValue() );
            aVBorderLine.SetColor( aHBorderLine.GetColor() );
        }
        else
        {
            const SvxColorItem& rColorItem = aAttrTab.pFontColor ?
              (const SvxColorItem &)aAttrTab.pFontColor->GetItem() :
              (const SvxColorItem &)pDoc->GetDefault(RES_CHRATR_COLOR);
            aHBorderLine.SetColor( rColorItem.GetValue() );
            aVBorderLine.SetColor( aHBorderLine.GetColor() );
        }


        SvxBoxItem aBoxItem;
        aBoxItem.SetLine( &aHBorderLine, BOX_LINE_TOP );
        aBoxItem.SetLine( &aHBorderLine, BOX_LINE_BOTTOM );
        aBoxItem.SetLine( &aVBorderLine, BOX_LINE_LEFT );
        aBoxItem.SetLine( &aVBorderLine, BOX_LINE_RIGHT );
        aFrmSet.Put( aBoxItem );
    }

    // Ausrichtung setzen
    SetAnchorAndAdjustment( eVertOri, eHoriOri, aItemSet, aPropInfo, aFrmSet );

    // Abstaende setzen
    SetSpace( Size( nHSpace, nVSpace), aItemSet, aPropInfo, aFrmSet );

    // Sonstige CSS1-Attribute Setzen
    SetFrmFmtAttrs( aItemSet, aPropInfo, HTML_FF_BOX, aFrmSet );

    Size aTwipSz( bPrcWidth ? 0 : nWidth, bPrcHeight ? 0 : nHeight );
    if( (aTwipSz.Width() || aTwipSz.Height()) && Application::GetDefaultDevice() )
    {
        aTwipSz = Application::GetDefaultDevice()
                    ->PixelToLogic( aTwipSz, MapMode( MAP_TWIP ) );
    }

    // CSS1-Groesse auf "normale" Groesse umrechnen
    switch( aPropInfo.eWidthType )
    {
        case SVX_CSS1_LTYPE_TWIP:
            aTwipSz.Width() = aPropInfo.nWidth;
            nWidth = 1; // != 0
            bPrcWidth = FALSE;
            break;
        case SVX_CSS1_LTYPE_PERCENTAGE:
            aTwipSz.Width() = 0;
            nWidth = aPropInfo.nWidth;
            bPrcWidth = TRUE;
            break;
    }
    switch( aPropInfo.eHeightType )
    {
        case SVX_CSS1_LTYPE_TWIP:
            aTwipSz.Height() = aPropInfo.nHeight;
            nHeight = 1;    // != 0
            bPrcHeight = FALSE;
            break;
        case SVX_CSS1_LTYPE_PERCENTAGE:
            aTwipSz.Height() = 0;
            nHeight = aPropInfo.nHeight;
            bPrcHeight = TRUE;
            break;
    }

    Size aGrfSz( 0, 0 );
    BOOL bSetTwipSize = TRUE;       // Twip-Size am Node setzen?
    BOOL bChangeFrmSize = FALSE;    // Frame-Format nachtraeglich anpassen?
    BOOL bGrfSzValid = FALSE;       // aGrfSz enthaelt die Grafik-Groesse
    BOOL bRequestGrfNow = FALSE;
    BOOL bSetScaleImageMap = FALSE;
    BYTE nPrcWidth = 0, nPrcHeight = 0;

    if( !nWidth || !nHeight )
    {
        // Es fehlt die Breite oder die Hoehe

        // JP 28.05.96: dann suche doch mal in unserem QuickDraw-Cache, ob
        //              die Groesse dieser Grafik schon vorhanden ist.

// Code for the new GraphicObject
#ifdef USE_GRFOBJECT

        bGrfSzValid =
#ifdef NEW_GRFOBJ
            FindGrfSizeFromCache( sGrfNm, aGrfSz )
#else
                FALSE;
#endif
            ;

#else
// USE_GRFOBJECT

        bGrfSzValid = FindGrfSizeFromCache( sGrfNm, aGrfSz );

#endif
// USE_GRFOBJECT

        // Wenn die Grfik in einer Tabelle steht, wird sie gleich
        // angefordert, damit sie eventuell schon da ist, bevor die
        // Tabelle layoutet wird.
        if( !bGrfSzValid && pTable!=0 && !nWidth )
        {
            bRequestGrfNow = TRUE;
            IncGrfsThatResizeTable();
        }

        if( bGrfSzValid && aGrfSz.Width() && aGrfSz.Height() )
        {
            // wir haben eine Groesse und koenen sie setzen
            if( !nWidth && !nHeight )
            {
                // Hoehe und Breite fehlen
                aTwipSz = aGrfSz;
            }
            else if( nWidth )
            {
                // nur die Breite fehlt
                if( bPrcWidth )
                {
                    // %-Breite uebernehmen und Hoehe skalieren
                    nPrcWidth = (BYTE)nWidth;
                    nPrcHeight = 255;
                }
                else
                {
                    // Breite uebernehmen und Hoehe berechnen
                    aTwipSz.Height() = (aGrfSz.Height() * aTwipSz.Width())
                                        / aGrfSz.Width();
                }
            }
            else if( nHeight )
            {
                // nur die Hoehe fehlt
                if( bPrcHeight )
                {
                    // %-Hoehe lassen und Breite skalieren
                    nPrcHeight = (BYTE)nHeight;
                    nPrcWidth = 255;
                }
                else
                {
                    // Hoehe uebernehmen und Breite berechnen
                    aTwipSz.Width() = (aGrfSz.Width() * aTwipSz.Height())
                                        / aGrfSz.Height();
                }
            }
        }
        else
        {
            // wir haben keine Groesse gefunden (und sind in keiner
            // Tabelle oder haben zumindest die Breite der Grafik)

            // Die Groesse des Rahmens wird nachtraeglich gesetzt
            bChangeFrmSize = TRUE;
            aGrfSz = aTwipSz;
            if( !nWidth && !nHeight )
            {
                aTwipSz.Width() = HTML_DFLT_IMG_WIDTH;
                aTwipSz.Height() = HTML_DFLT_IMG_HEIGHT;
            }
            else if( nWidth )
            {
                // eine %-Angabe
                if( bPrcWidth )
                {
                    nPrcWidth = (BYTE)nWidth;
                    nPrcHeight = 255;
                }
                else
                {
                    aTwipSz.Height() = HTML_DFLT_IMG_HEIGHT;
                }
            }
            else if( nHeight )
            {
                if( bPrcHeight )
                {
                    nPrcHeight = (BYTE)nHeight;
                    nPrcWidth = 255;
                }
                else
                {
                    aTwipSz.Width() = HTML_DFLT_IMG_WIDTH;
                }
            }
        }
    }
    else
    {
        // Breite und Hoehe wurden angegeben und brauchen nicht gesetzt
        // zu werden
// Code for the new GraphicObject
#ifdef USE_GRFOBJECT

        bGrfSzValid =
#ifdef NEW_GRFOBJ
        FindGrfSizeFromCache( sGrfNm, aGrfSz )
#else
            FALSE;
#endif
        ;


#else
// USE_GRFOBJECT

        bGrfSzValid = FindGrfSizeFromCache( sGrfNm, aGrfSz );
#endif
// USE_GRFOBJECT

        bSetTwipSize = FALSE;

        if( bPrcWidth )
            nPrcWidth = (BYTE)nWidth;

        if( bPrcHeight )
            nPrcHeight = (BYTE)nHeight;
    }

    // Image-Map setzen
    aMap.EraseTrailingChars();
    if( aMap.Len() )
    {
        // Da wir nur lokale Image-Maps kennen nehmen wireinfach alles
        // hinter dem # als Namen
        xub_StrLen nPos = aMap.Search( '#' );
        String aName;
        if ( STRING_NOTFOUND==nPos )
            aName = aMap ;
        else
            aName = aMap.Copy(nPos+1);

        ImageMap *pImgMap = FindImageMap( aName );
        if( pImgMap )
        {
            SwFmtURL aURL; aURL.SetMap( pImgMap );//wird kopieiert
            if( bGrfSzValid )
            {
                BOOL bScale = FALSE;

                Fraction aScaleX( 1, 1 ), aScaleY( 1, 1);

                if( !nPrcWidth && aGrfSz.Width() && aTwipSz.Width() &&
                    aGrfSz.Width() != aTwipSz.Width() )
                {
                    aScaleX = Fraction( aGrfSz.Width(), aTwipSz.Width() );
                    bScale = TRUE;
                }

                if( !nPrcHeight && aGrfSz.Height() && aTwipSz.Height() &&
                    aGrfSz.Height() != aTwipSz.Height() )
                {
                    aScaleY = Fraction( aGrfSz.Height(), aTwipSz.Height() );
                    bScale = TRUE;
                }

                if( bScale )
                    aURL.GetMap()->Scale( aScaleX, aScaleY );
            }
            else
                bSetScaleImageMap = !nPrcWidth || !nPrcHeight;
            aFrmSet.Put( aURL );
        }
        else
        {
            ImageMap aEmptyImgMap( aName );
            SwFmtURL aURL; aURL.SetMap( &aEmptyImgMap );//wird kopieiert
            aFrmSet.Put( aURL );
            nMissingImgMaps++;          // es fehlen noch Image-Maps

            // die Grafik muss beim SetTwipSize skaliert werden, wenn
            // wir keine Groesse am Node gesetzt haben oder die Groesse
            // nicht der Grafikgroesse entsprach.
            bSetScaleImageMap = !bSetTwipSize || !bGrfSzValid ||
                                !nPrcWidth || !nPrcHeight;
        }
    }

    // min. Werte einhalten !!
    if( nPrcWidth )
    {
        ASSERT( !aTwipSz.Width(),
                "Wieso ist da trotz %-Angabe eine Breite gesetzt?" );
        aTwipSz.Width() = aGrfSz.Width() ? aGrfSz.Width()
                                         : HTML_DFLT_IMG_WIDTH;
    }
    else
    {
        aTwipSz.Width() += 2*nVBorderWidth;
        if( aTwipSz.Width() < MINFLY )
            aTwipSz.Width() = MINFLY;
    }
    if( nPrcHeight )
    {
        ASSERT( !aTwipSz.Height(),
                "Wieso ist da trotz %-Angabe eine Hoehe gesetzt?" );
        aTwipSz.Height() = aGrfSz.Height() ? aGrfSz.Height()
                                           : HTML_DFLT_IMG_HEIGHT;
    }
    else
    {
        aTwipSz.Height() += 2*nHBorderWidth;
        if( aTwipSz.Height() < MINFLY )
            aTwipSz.Height() = MINFLY;
    }

    SwFmtFrmSize aFrmSize( ATT_FIX_SIZE, aTwipSz.Width(), aTwipSz.Height() );
    aFrmSize.SetWidthPercent( nPrcWidth );
    aFrmSize.SetHeightPercent( nPrcHeight );
    aFrmSet.Put( aFrmSize );

    Graphic aEmptyGrf;
    aEmptyGrf.SetDefaultType();
    SwFrmFmt *pFlyFmt = pDoc->Insert( *pPam, sGrfNm, aEmptyStr, &aEmptyGrf,
                                      &aFrmSet );
    SwGrfNode *pGrfNd = pDoc->GetNodes()[ pFlyFmt->GetCntnt().GetCntntIdx()
                                  ->GetIndex()+1 ]->GetGrfNode();

    if( sHTMLGrfName.Len() )
    {
        pFlyFmt->SetName( sHTMLGrfName );

        // ggfs. eine Grafik anspringen
        if( JUMPTO_GRAPHIC == eJumpTo && sHTMLGrfName == sJmpMark )
        {
            bChkJumpMark = TRUE;
            eJumpTo = JUMPTO_NONE;
        }
    }

    if( sAltNm.Len() )
        pGrfNd->SetAlternateText( sAltNm );

    if( bSetTwipSize )
        pGrfNd->SetTwipSize( aGrfSz );

    pGrfNd->SetChgTwipSize( bChangeFrmSize );

    if( bSetScaleImageMap )
        pGrfNd->SetScaleImageMap( TRUE );

    if( aAttrTab.pINetFmt )
    {
        const SwFmtINetFmt &rINetFmt =
            (const SwFmtINetFmt&)aAttrTab.pINetFmt->GetItem();

        SwFmtURL aURL( pFlyFmt->GetURL() );

        aURL.SetURL( rINetFmt.GetValue(), bIsMap );
        aURL.SetTargetFrameName( rINetFmt.GetTargetFrame() );
        aURL.SetName( rINetFmt.GetName() );
        pFlyFmt->SetAttr( aURL );

        {
            const SvxMacro *pMacro;
            static USHORT __READONLY_DATA aEvents[] = {
                SFX_EVENT_MOUSEOVER_OBJECT,
                SFX_EVENT_MOUSECLICK_OBJECT,
                SFX_EVENT_MOUSEOUT_OBJECT,
                0 };

            for( USHORT n = 0; aEvents[ n ]; ++n )
                if( 0 != ( pMacro = rINetFmt.GetMacro( aEvents[ n ] ) ))
                    aMacroItem.SetMacro( aEvents[ n ], *pMacro );
        }

        if( FLY_IN_CNTNT == pFlyFmt->GetAnchor().GetAnchorId() &&
            aAttrTab.pINetFmt->GetSttPara() ==
                        pPam->GetPoint()->nNode &&
            aAttrTab.pINetFmt->GetSttCnt() ==
                        pPam->GetPoint()->nContent.GetIndex() - 1 )
        {
            // das Attribut wurde unmitellbar vor einer zeichengeb.
            // Grafik eingefuegt, also verschieben wir es
            aAttrTab.pINetFmt->SetStart( *pPam->GetPoint() );

            // Wenn das Attribut auch ein Sprungziel ist, fuegen
            // wir noch eine Bookmark vor der Grafik ein, weil das
            // SwFmtURL kein Sprungziel ist.
            if( rINetFmt.GetName().Len() )
            {
                pPam->Move( fnMoveBackward );
                InsertBookmark( rINetFmt.GetName() );
                pPam->Move( fnMoveForward );
            }
        }

    }

    if( aMacroItem.GetMacroTable().Count() )
        pFlyFmt->SetAttr( aMacroItem );

    // Wenn die Grafik gleich angeforder wird, muss dies geschehen,
    // nachdem das Format vollstaendig aufgebaut ist, weil es evtl.
    // gleich (synchron) angepasst wird (war bug #40983#)
    if( bRequestGrfNow )
    {
        pGrfNd->SetTransferPriority( SFX_TFPRIO_VISIBLE_LOWRES_GRAPHIC );
        pGrfNd->SwapIn();
    }

    // Ggf. Frames anlegen und Auto-gebundenen Rahmen registrieren
    RegisterFlyFrm( pFlyFmt );

    if( aId.Len() )
        InsertBookmark( aId );
}

/*  */

void SwHTMLParser::InsertBodyOptions()
{
    pDoc->SetTxtFmtColl( *pPam,
                         pCSS1Parser->GetTxtCollFromPool( RES_POOLCOLL_TEXT ) );

    String aBackGround, aId, aStyle;
    Color aBGColor, aTextColor, aLinkColor, aVLinkColor;
    BOOL bBGColor=FALSE, bTextColor=FALSE;
    BOOL bLinkColor=FALSE, bVLinkColor=FALSE;

    ScriptType eDfltScriptType;
    String sDfltScriptType;
    GetDefaultScriptType( eDfltScriptType, sDfltScriptType );

    const HTMLOptions *pOptions = GetOptions();
    for( USHORT i = pOptions->Count(); i; )
    {
        const HTMLOption *pOption = (*pOptions)[--i];
        ScriptType eScriptType = eDfltScriptType;
        USHORT nEvent;
        BOOL bSetEvent = FALSE;

        switch( pOption->GetToken() )
        {
            case HTML_O_ID:
                aId = pOption->GetString();
                break;
            case HTML_O_BACKGROUND:
                aBackGround = pOption->GetString();
                break;
            case HTML_O_BGCOLOR:
                pOption->GetColor( aBGColor );
                bBGColor = TRUE;
                break;
            case HTML_O_TEXT:
                pOption->GetColor( aTextColor );
                bTextColor = TRUE;
                break;
            case HTML_O_LINK:
                pOption->GetColor( aLinkColor );
                bLinkColor = TRUE;
                break;
            case HTML_O_VLINK:
                pOption->GetColor( aVLinkColor );
                bVLinkColor = TRUE;
                break;

            case HTML_O_SDONLOAD:
                eScriptType = STARBASIC;
            case HTML_O_ONLOAD:
                nEvent = SFX_EVENT_OPENDOC;
                bSetEvent = TRUE;
                break;

            case HTML_O_SDONUNLOAD:
                eScriptType = STARBASIC;
            case HTML_O_ONUNLOAD:
                nEvent = SFX_EVENT_PREPARECLOSEDOC;
                bSetEvent = TRUE;
                break;

            case HTML_O_SDONFOCUS:
                eScriptType = STARBASIC;
            case HTML_O_ONFOCUS:
                nEvent = SFX_EVENT_ACTIVATEDOC;
                bSetEvent = TRUE;
                break;

            case HTML_O_SDONBLUR:
                eScriptType = STARBASIC;
            case HTML_O_ONBLUR:
                nEvent = SFX_EVENT_DEACTIVATEDOC;
                bSetEvent = TRUE;
                break;

            case HTML_O_ONERROR:
//              if( bAnyStarBasic )
//                  InsertBasicDocEvent( SFX_EVENT_ACTIVATEDOC,
//                                       pOption->GetString() );
                break;

            case HTML_O_STYLE:
                aStyle = pOption->GetString();
                bTextColor = TRUE;
                break;
        }

        if( bSetEvent )
        {
            const String& rEvent = pOption->GetString();
            if( rEvent.Len() )
                InsertBasicDocEvent( nEvent, rEvent, eScriptType,
                                     sDfltScriptType );
        }
    }

    if( bTextColor && !pCSS1Parser->IsBodyTextSet() )
    {
        // Die Textfarbe wird an der Standard-Vorlage gesetzt
        pCSS1Parser->GetTxtCollFromPool( RES_POOLCOLL_STANDARD )
            ->SetAttr( SvxColorItem(aTextColor) );
        pCSS1Parser->SetBodyTextSet();
    }


    // Die Item fuer die Seitenvorlage vorbereiten (Hintergrund, Umrandung)
    // Beim BrushItem muessen schon gesetzte werte erhalten bleiben!
    SvxBrushItem aBrushItem( pCSS1Parser->GetPageDescBackground() );
    BOOL bSetBrush = FALSE;

    if( bBGColor && !pCSS1Parser->IsBodyBGColorSet() )
    {
        // Hintergrundfarbe aus "BGCOLOR"
        String aLink;
        if( aBrushItem.GetGraphicLink() )
            aLink = *aBrushItem.GetGraphicLink();
        SvxGraphicPosition ePos = aBrushItem.GetGraphicPos();

        aBrushItem.SetColor( aBGColor );

        if( aLink.Len() )
        {
            aBrushItem.SetGraphicLink( aLink );
            aBrushItem.SetGraphicPos( ePos );
        }
        bSetBrush = TRUE;
        pCSS1Parser->SetBodyBGColorSet();
    }

    if( aBackGround.Len() && !pCSS1Parser->IsBodyBackgroundSet() )
    {
        // Hintergrundgrafik aus "BACKGROUND"
        ASSERT( INetURLObject::GetBaseURL() == sBaseURL,
                "<BODY>: Base URL ist zerschossen" );
        aBrushItem.SetGraphicLink( INetURLObject::RelToAbs( aBackGround ) );
        aBrushItem.SetGraphicPos( GPOS_TILED );
        bSetBrush = TRUE;
        pCSS1Parser->SetBodyBackgroundSet();
    }

    if( aStyle.Len() )
    {
        SfxItemSet aItemSet( pDoc->GetAttrPool(), pCSS1Parser->GetWhichMap() );
        SvxCSS1PropertyInfo aPropInfo;
        pCSS1Parser->ParseStyleOption( aStyle, aItemSet, aPropInfo );

        // Ein par Attribute muessen an der Seitenvorlage gesetzt werden,
        // und zwar die, die nicht vererbit werden
        pCSS1Parser->SetPageDescAttrs( bSetBrush ? &aBrushItem : 0,
                                       &aItemSet );

        // alle noch uebrigen Optionen koennen an der Standard-Vorlage
        // gesetzt werden und gelten dann automatisch als defaults
        pCSS1Parser->GetTxtCollFromPool( RES_POOLCOLL_STANDARD )
            ->SetAttr( aItemSet );
    }
    else if( bSetBrush )
    {
        pCSS1Parser->SetPageDescAttrs( &aBrushItem );
    }

    if( bLinkColor && !pCSS1Parser->IsBodyLinkSet() )
    {
        SwCharFmt *pCharFmt =
            pCSS1Parser->GetCharFmtFromPool(RES_POOLCHR_INET_NORMAL);
        pCharFmt->SetAttr( SvxColorItem(aLinkColor) );
        pCSS1Parser->SetBodyLinkSet();
    }
    if( bVLinkColor && !pCSS1Parser->IsBodyVLinkSet() )
    {
        SwCharFmt *pCharFmt =
            pCSS1Parser->GetCharFmtFromPool(RES_POOLCHR_INET_VISIT);
        pCharFmt->SetAttr( SvxColorItem(aVLinkColor) );
        pCSS1Parser->SetBodyVLinkSet();
    }

    if( aId.Len() )
        InsertBookmark( aId );
}

/*  */

void SwHTMLParser::NewAnchor()
{
    // den voherigen Link beenden, falls es einen gab
    _HTMLAttrContext *pOldCntxt = PopContext( HTML_ANCHOR_ON );
    if( pOldCntxt )
    {
        // und ggf. die Attribute beenden
        EndContext( pOldCntxt );
        delete pOldCntxt;
    }

    SvxMacroTableDtor aMacroTbl;
    String sHRef, aName, sTarget;
    String aId, aStyle, aClass;
    BOOL bHasHRef = FALSE, bFixed = FALSE;

    ScriptType eDfltScriptType;
    String sDfltScriptType;
    GetDefaultScriptType( eDfltScriptType, sDfltScriptType );

    const HTMLOptions *pOptions = GetOptions();
    for( USHORT i = pOptions->Count(); i; )
    {
        USHORT nEvent = 0;
        ScriptType eScriptType = eDfltScriptType;
        const HTMLOption *pOption = (*pOptions)[--i];
        switch( pOption->GetToken() )
        {
            case HTML_O_NAME:
                aName = pOption->GetString();
                break;

            case HTML_O_HREF:
                sHRef = pOption->GetString();
                bHasHRef = TRUE;
                break;
            case HTML_O_TARGET:
                sTarget = pOption->GetString();
                break;

            case HTML_O_STYLE:
                aStyle = pOption->GetString();
                break;
            case HTML_O_ID:
                aId = pOption->GetString();
                break;
            case HTML_O_CLASS:
                aClass = pOption->GetString();
                break;
            case HTML_O_SDFIXED:
                bFixed = TRUE;
                break;

            case HTML_O_SDONCLICK:
                eScriptType = STARBASIC;
            case HTML_O_ONCLICK:
                nEvent = SFX_EVENT_MOUSECLICK_OBJECT;
                goto ANCHOR_SETEVENT;

            case HTML_O_SDONMOUSEOVER:
                eScriptType = STARBASIC;
            case HTML_O_ONMOUSEOVER:
                nEvent = SFX_EVENT_MOUSEOVER_OBJECT;
                goto ANCHOR_SETEVENT;

            case HTML_O_SDONMOUSEOUT:
                eScriptType = STARBASIC;
            case HTML_O_ONMOUSEOUT:
                nEvent = SFX_EVENT_MOUSEOUT_OBJECT;
                goto ANCHOR_SETEVENT;
ANCHOR_SETEVENT:
                {
                    String sTmp( pOption->GetString() );
                    if( sTmp.Len() )
                    {
                        sTmp.ConvertLineEnd();
                        String sScriptType;
                        if( EXTENDED_STYPE == eScriptType )
                            sScriptType = sDfltScriptType;
                        aMacroTbl.Insert( nEvent,
                            new SvxMacro( sTmp, sScriptType, eScriptType ));
                    }
                }
                break;

        }
    }

    // Sprungziele, die unseren ipmliziten Zielen entsprechen, schmeissen
    // wir hier ganz rigoros raus.
    if( aName.Len() )
    {
        xub_StrLen nLastPos, nPos = aName.Search( cMarkSeperator );
        if( STRING_NOTFOUND != nPos )
        {
            while( STRING_NOTFOUND !=
                        ( nLastPos = aName.Search( cMarkSeperator, nPos + 1 )) )
                nPos = nLastPos;

            String sCmp( aName.Copy( nPos+1 ) );
            sCmp.EraseAllChars();
            if( sCmp.Len() )
            {
                sCmp.ToLowerAscii();
                if( sCmp.EqualsAscii( pMarkToRegion ) ||
                    sCmp.EqualsAscii( pMarkToFrame ) ||
                    sCmp.EqualsAscii( pMarkToGraphic ) ||
                    sCmp.EqualsAscii( pMarkToOLE ) ||
                    sCmp.EqualsAscii( pMarkToTable ) ||
                    sCmp.EqualsAscii( pMarkToOutline ) ||
                    sCmp.EqualsAscii( pMarkToText ) )
                {
                    aName.Erase();
                }
            }
        }
    }

    // einen neuen Kontext anlegen
    _HTMLAttrContext *pCntxt = new _HTMLAttrContext( HTML_ANCHOR_ON );

    BOOL bEnAnchor = FALSE, bFtnAnchor = FALSE, bFtnEnSymbol = FALSE;
    String aFtnName;
    if( aClass.Len() >=9  && bHasHRef && sHRef.Len() > 1 &&
        ('s' == aClass.GetChar(0) || 'S' == aClass.GetChar(0)) &&
        ('d' == aClass.GetChar(1) || 'D' == aClass.GetChar(1)) )
    {
        if( aClass.EqualsIgnoreCaseAscii( sHTML_sdendnote_anc ) )
            bEnAnchor = TRUE;
        else if( aClass.EqualsIgnoreCaseAscii( sHTML_sdfootnote_anc ) )
            bFtnAnchor = TRUE;
        else if( aClass.EqualsIgnoreCaseAscii( sHTML_sdendnote_sym ) ||
                 aClass.EqualsIgnoreCaseAscii( sHTML_sdfootnote_sym ) )
            bFtnEnSymbol = TRUE;
        if( bEnAnchor || bFtnAnchor || bFtnEnSymbol )
        {
            aFtnName = sHRef.Copy( 1 );
            aClass = aName = aEmptyStr;
            bHasHRef = FALSE;
        }
    }

    // Styles parsen
    if( HasStyleOptions( aStyle, aId, aClass ) )
    {
        SfxItemSet aItemSet( pDoc->GetAttrPool(), pCSS1Parser->GetWhichMap() );
        SvxCSS1PropertyInfo aPropInfo;

        if( ParseStyleOptions( aStyle, aId, aClass, aItemSet, aPropInfo ) )
        {
            DoPositioning( aItemSet, aPropInfo, pCntxt );
            InsertAttrs( aItemSet, aPropInfo, pCntxt, TRUE );
        }
    }

    if( bHasHRef )
    {
        if( sHRef.Len() )
        {
            ASSERT( INetURLObject::GetBaseURL() == sBaseURL,
                    "<A>: Base URL ist zerschossen" );
            sHRef = INetURLObject::RelToAbs( sHRef );
        }
        else
        {
            // Bei leerer URL das Directory nehmen
            INetURLObject aURLObj( aPathToFile );
            sHRef = aURLObj.GetPartBeforeLastName();
        }

        pCSS1Parser->SetATagStyles();
        SwFmtINetFmt aINetFmt( sHRef, sTarget );
        aINetFmt.SetName( aName );

        if( aMacroTbl.Count() )
            aINetFmt.SetMacroTbl( &aMacroTbl );

        // das Default-Attribut setzen
        InsertAttr( &aAttrTab.pINetFmt, aINetFmt, pCntxt );
    }
    else if( aName.Len() )
    {
        InsertBookmark( aName );
    }

    if( bEnAnchor || bFtnAnchor )
    {
        InsertFootEndNote( aFtnName, bEnAnchor, bFixed );
        bInFootEndNoteAnchor = bCallNextToken = TRUE;
    }
    else if( bFtnEnSymbol )
    {
        bInFootEndNoteSymbol = bCallNextToken = TRUE;
    }

    // den Kontext merken
    PushContext( pCntxt );
}

void SwHTMLParser::EndAnchor()
{
    if( bInFootEndNoteAnchor )
    {
        FinishFootEndNote();
        bInFootEndNoteAnchor = FALSE;
    }
    else if( bInFootEndNoteSymbol )
    {
        bInFootEndNoteSymbol = FALSE;
    }

    EndTag( HTML_ANCHOR_OFF );
}

/*  */

void SwHTMLParser::InsertBookmark( const String& rName )
{
    _HTMLAttr* pTmp = new _HTMLAttr( *pPam->GetPoint(),
            SfxStringItem( RES_FLTR_BOOKMARK, rName ));
    aSetAttrTab.Insert( pTmp, aSetAttrTab.Count() );
}

BOOL SwHTMLParser::HasCurrentParaBookmarks( BOOL bIgnoreStack ) const
{
    BOOL bHasMarks = FALSE;
    ULONG nNodeIdx = pPam->GetPoint()->nNode.GetIndex();

    // 1. Schritt: befinden sich noch Bookmarks m Attribut-Stack?
    // Bookmarks werden hinten in den Stack geschrieben. Wir muessen
    // also nur die letzte Bookmark betrachten
    if( !bIgnoreStack )
    {
        _HTMLAttr* pAttr;
        for( USHORT i = aSetAttrTab.Count(); i; )
        {
            pAttr = aSetAttrTab[ --i ];
            if( RES_FLTR_BOOKMARK == pAttr->pItem->Which() )
            {
                if( pAttr->GetSttParaIdx() == nNodeIdx )
                    bHasMarks = TRUE;
                break;
            }
        }
    }

    if( !bHasMarks )
    {
        // 2. Schritt: Wenn wir keine Bookmark gefunden haben, schauen wir,
        // ob schon eine gesetzt ist
        const SwBookmarks& rBookmarks = pDoc->GetBookmarks();
        for( USHORT i=0; i<rBookmarks.Count(); i++ )
        {
            const SwBookmark* pBookmark = rBookmarks[i];
            ULONG nBookNdIdx = pBookmark->GetPos().nNode.GetIndex();
            if( nBookNdIdx==nNodeIdx )
            {
                bHasMarks = TRUE;
                break;
            }
            else if( nBookNdIdx > nNodeIdx )
                break;
        }
    }

    return bHasMarks;
}

/*  */

void SwHTMLParser::StripTrailingPara()
{
    BOOL bSetSmallFont = FALSE;

    SwCntntNode* pCNd = pPam->GetCntntNode();
    if( !pPam->GetPoint()->nContent.GetIndex() )
    {
        if( pCNd && pCNd->StartOfSectionIndex()+2 <
            pCNd->EndOfSectionIndex() )
        {
            ULONG nNodeIdx = pPam->GetPoint()->nNode.GetIndex();

            USHORT i;

            const SwFrmFmt* pFmt;
            const SwFmtAnchor* pAnchor;
            const SwPosition* pAPos;
            const SwSpzFrmFmts& rFrmFmtTbl = *pDoc->GetSpzFrmFmts();

            for( i=0; i<rFrmFmtTbl.Count(); i++ )
            {
                pFmt = rFrmFmtTbl[i];
                pAnchor = &pFmt->GetAnchor();
                if( 0 != ( pAPos = pAnchor->GetCntntAnchor()) &&
                    (FLY_AT_CNTNT == pAnchor->GetAnchorId() ||
                     FLY_AUTO_CNTNT == pAnchor->GetAnchorId()) &&
                    pAPos->nNode == nNodeIdx )

                    return;     // den Knoten duerfen wir nicht loeschen
            }

            SetAttr( FALSE );   // die noch offenen Attribute muessen
                                // beendet werden, bevor der Node
                                // geloescht wird, weil sonst der
                                // End-Index in die Botanik zeigt

            if( pCNd->Len() && pCNd->IsTxtNode() )
            {
                // es wurden Felder in den Node eingefuegt, die muessen
                // wir jetzt verschieben
                SwTxtNode *pPrvNd = pDoc->GetNodes()[nNodeIdx-1]->GetTxtNode();
                if( pPrvNd )
                {
                    SwIndex aSrc( pCNd, 0 );
                    pCNd->GetTxtNode()->Cut( pPrvNd, aSrc, pCNd->Len() );
                }
            }

            // jetz muessen wir noch eventuell vorhandene Bookmarks
            // verschieben
            const SwBookmarks& rBookmarks = pDoc->GetBookmarks();
            for( i=0; i<rBookmarks.Count(); i++ )
            {
                const SwBookmark* pBookmark = rBookmarks[i];
                ULONG nBookNdIdx = pBookmark->GetPos().nNode.GetIndex();
                if( nBookNdIdx==nNodeIdx )
                {
                    SwPosition &rBookmkPos =
                        (SwPosition&)pBookmark->GetPos();

                    SwNodeIndex nNewNdIdx( pPam->GetPoint()->nNode );
                    SwCntntNode* pCNd = pDoc->GetNodes().GoPrevious( &nNewNdIdx );
                    if( !pCNd )
                    {
                        ASSERT( !this, "Hoppla, wo ist mein Vorgaenger-Node" );
                        return;
                    }

                    rBookmkPos.nNode = nNewNdIdx;
                    rBookmkPos.nContent.Assign( pCNd, pCNd->Len() );
                }
                else if( nBookNdIdx > nNodeIdx )
                    break;
            }

            pPam->GetPoint()->nContent.Assign( 0, 0 );
            pPam->SetMark();
            pPam->DeleteMark();
            pDoc->GetNodes().Delete( pPam->GetPoint()->nNode );
            pPam->Move( fnMoveBackward, fnGoNode );
        }
        else if( pCNd && pCNd->IsTxtNode() && pTable )
        {
            // In leeren Zellen stellen wir einen kleinen Font ein, damit die
            // Zelle nicht hoeher wird als die Grafik bzw. so niedrig wie
            // moeglich bleibt.
            bSetSmallFont = TRUE;
        }
    }
    else if( pCNd && pCNd->IsTxtNode() && pTable &&
             pCNd->StartOfSectionIndex()+2 ==
             pCNd->EndOfSectionIndex() )
    {
        // Wenn die Zelle nur zeichengebundene Grafiken/Rahmen enthaelt
        // stellen wir ebenfalls einen kleinen Font ein.
        bSetSmallFont = TRUE;
        SwTxtNode* pTxtNd = pCNd->GetTxtNode();

        xub_StrLen nPos = pPam->GetPoint()->nContent.GetIndex();
        while( bSetSmallFont && nPos>0 )
        {
            bSetSmallFont = CH_TXTATR_BREAKWORD ==
                                        pTxtNd->GetTxt().GetChar( --nPos ) &&
                        0 != pTxtNd->GetTxtAttr( nPos, RES_TXTATR_FLYCNT );
        }
    }

    if( bSetSmallFont )
    {
        pCNd->SetAttr( SvxFontHeightItem(40) );
    }
}

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/html/htmlgrin.cxx,v 1.1.1.1 2000-09-18 17:14:55 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.130  2000/09/18 16:04:45  willem.vandorp
      OpenOffice header added.

      Revision 1.129  2000/08/31 10:59:55  jp
      add missing include

      Revision 1.128  2000/07/20 13:16:10  jp
      change old txtatr-character to the two new characters

      Revision 1.127  2000/06/26 09:52:14  jp
      must change: GetAppWindow->GetDefaultDevice

      Revision 1.126  2000/04/10 12:20:56  mib
      unicode

      Revision 1.125  2000/03/03 15:21:01  os
      StarView remainders removed

      Revision 1.124  2000/03/03 12:44:32  mib
      Removed JavaScript

      Revision 1.123  2000/02/11 14:37:12  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.122  1999/12/03 08:40:07  jp
      Task #70407#: use new GrfObj instead of Grafik with Cache (first only with define)

      Revision 1.121  1999/11/19 16:40:20  os
      modules renamed

      Revision 1.120  1999/09/17 12:13:28  mib
      support of multiple and non system text encodings

      Revision 1.119  1999/06/10 08:34:12  JP
      have to change: no AppWin from SfxApp


      Rev 1.118   10 Jun 1999 10:34:12   JP
   have to change: no AppWin from SfxApp

*************************************************************************/

diff --git a/sw/source/filter/html/htmlnum.cxx b/sw/source/filter/html/htmlnum.cxx
new file mode 100644
index 0000000..8af8417
--- /dev/null
+++ b/sw/source/filter/html/htmlnum.cxx
@@ -0,0 +1,997 @@
/*************************************************************************
 *
 *  $RCSfile: htmlnum.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:55 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/


#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _HTMLTOKN_H
#include <svtools/htmltokn.h>
#endif
#ifndef _HTMLKYWD_HXX
#include <svtools/htmlkywd.hxx>
#endif
#ifndef _HTMLOUT_HXX //autogen
#include <svtools/htmlout.hxx>
#endif

#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif

#ifndef _SV_SVAPP_HXX
#include <vcl/svapp.hxx>
#endif
#ifndef _SV_WRKWIN_HXX //autogen
#include <vcl/wrkwin.hxx>
#endif

#ifndef _NUMRULE_HXX
#include <numrule.hxx>
#endif
#ifndef _DOCARY_HXX
#include <docary.hxx>
#endif
#ifndef _POOLFMT_HXX
#include <poolfmt.hxx>
#endif
#ifndef _NDTXT_HXX
#include <ndtxt.hxx>
#endif
#ifndef _PARATR_HXX
#include <paratr.hxx>
#endif

#include "htmlnum.hxx"
#include "swcss1.hxx"
#include "swhtml.hxx"
#include "wrthtml.hxx"

// TODO: Unicode: Are these characters the correct ones?
#define HTML_BULLETCHAR_DISC    (0xf000 + 34)
#define HTML_BULLETCHAR_CIRCLE  (0xf000 + 38)
#define HTML_BULLETCHAR_SQUARE  (0xf000 + 36)


// <UL TYPE=...>
static HTMLOptionEnum __FAR_DATA aHTMLULTypeTable[] =
{
    { sHTML_ULTYPE_disc,    HTML_BULLETCHAR_DISC        },
    { sHTML_ULTYPE_circle,  HTML_BULLETCHAR_CIRCLE      },
    { sHTML_ULTYPE_square,  HTML_BULLETCHAR_SQUARE      },
    { 0,                    0                           }
};

/*  */

void SwHTMLNumRuleInfo::Set( const SwTxtNode& rTxtNd )
{
    if( rTxtNd.GetNum() )
    {
        pNumRule = (SwNumRule *)rTxtNd.GetNumRule();
        const SwNodeNum& rNum = *rTxtNd.GetNum();
        nDeep = pNumRule ? GetRealLevel( rNum.GetLevel() )+1 : 0;
        bNumbered = (rNum.GetLevel() & NO_NUMLEVEL) == 0;
        bRestart = rTxtNd.GetNum()->IsStart();
    }
    else
    {
        pNumRule = 0;
        nDeep = 0;
        bNumbered = bRestart = sal_False;
    }

#ifndef NUM_RELSPACE
    bUpdateWholeNum = sal_False;
#endif
}

/*  */

void SwHTMLParser::NewNumBulList( int nToken )
{
    SwHTMLNumRuleInfo& rInfo = GetNumInfo();

    // Erstmal einen neuen Absatz aufmachen
    sal_Bool bSpace = (rInfo.GetDepth() + nDefListDeep) == 0;
    if( pPam->GetPoint()->nContent.GetIndex() )
        AppendTxtNode( bSpace ? AM_SPACE : AM_NOSPACE, sal_False );
    else if( bSpace )
        AddParSpace();

    // Die Numerierung-Ebene erhoehen
    rInfo.IncDepth();
    sal_uInt8 nLevel = (sal_uInt8)( (rInfo.GetDepth() <= MAXLEVEL ? rInfo.GetDepth()
                                                        : MAXLEVEL) - 1 );

    // ggf. ein Regelwerk anlegen
    if( !rInfo.GetNumRule() )
    {
        sal_uInt16 nPos = pDoc->MakeNumRule( pDoc->GetUniqueNumRuleName() );
        rInfo.SetNumRule( pDoc->GetNumRuleTbl()[nPos] );
    }

    // das Format anpassen, falls es fuer den Level noch nicht
    // geschehen ist!
    sal_Bool bNewNumFmt = rInfo.GetNumRule()->GetNumFmt( nLevel ) == 0;
    sal_Bool bChangeNumFmt = sal_False;

    // das default Numerierungsformat erstellen
    SwNumFmt aNumFmt( rInfo.GetNumRule()->Get(nLevel) );
    rInfo.SetNodeStartValue( nLevel );
    if( bNewNumFmt )
    {
        sal_uInt16 nChrFmtPoolId = 0;
        if( HTML_ORDERLIST_ON == nToken )
        {
            aNumFmt.eType = SVX_NUM_ARABIC;
            nChrFmtPoolId = RES_POOLCHR_NUM_LEVEL;
        }
        else
        {
            // Wir setzen hier eine Zeichenvorlage, weil die UI das auch
            // so macht. Dadurch wurd immer auch eine 9pt-Schrift
            // eingestellt, was in Netscape nicht der Fall ist. Bisher hat
            // das noch niemanden gestoert.
            aNumFmt.SetBulletFont( &rInfo.GetNumRule()->GetDefBulletFont() );
            aNumFmt.eType = SVX_NUM_CHAR_SPECIAL;
            aNumFmt.SetBulletChar( cBulletChar );       // das Bulletzeichen !!
            nChrFmtPoolId = RES_POOLCHR_BUL_LEVEL;
        }

#ifdef NUM_RELSPACE
        sal_uInt16 nAbsLSpace = HTML_NUMBUL_MARGINLEFT;
        short nFirstLineIndent  = HTML_NUMBUL_INDENT;
        if( nLevel > 0 )
        {
            const SwNumFmt& rPrevNumFmt = rInfo.GetNumRule()->Get( nLevel-1 );
            nAbsLSpace += rPrevNumFmt.GetAbsLSpace();
            nFirstLineIndent = rPrevNumFmt.GetFirstLineOffset();
        }
        aNumFmt.SetAbsLSpace( nAbsLSpace );
        aNumFmt.SetFirstLineOffset( nFirstLineIndent );
#else
        aNumFmt.SetAbsLSpace( (nLevel+1) * HTML_NUMBUL_MARGINLEFT );
        aNumFmt.SetFirstLineOffset( HTML_NUMBUL_INDENT );
#endif
        aNumFmt.SetCharFmt( pCSS1Parser->GetCharFmtFromPool(nChrFmtPoolId) );
        bChangeNumFmt = sal_True;
    }
    else if( 1 != aNumFmt.GetStartValue() )
    {
        // Wenn die Ebene schon mal benutzt wurde, muss der Start-Wert
        // ggf. hart am Absatz gesetzt werden.
        rInfo.SetNodeStartValue( nLevel, 1 );
    }

    // und es ggf. durch die Optionen veraendern
    String aId, aStyle, aClass, aBulletSrc;
    SwVertOrient eVertOri = VERT_NONE;
    sal_uInt16 nWidth=USHRT_MAX, nHeight=USHRT_MAX;
    const HTMLOptions *pOptions = GetOptions();
    for( sal_uInt16 i = pOptions->Count(); i; )
    {
        const HTMLOption *pOption = (*pOptions)[--i];
        switch( pOption->GetToken() )
        {
        case HTML_O_ID:
            aId = pOption->GetString();
            break;
        case HTML_O_TYPE:
            if( bNewNumFmt && pOption->GetString().Len() )
            {
                switch( nToken )
                {
                case HTML_ORDERLIST_ON:
                    bChangeNumFmt = sal_True;
                    switch( pOption->GetString().GetChar(0) )
                    {
                    case 'A':   aNumFmt.eType = SVX_NUM_CHARS_UPPER_LETTER; break;
                    case 'a':   aNumFmt.eType = SVX_NUM_CHARS_LOWER_LETTER; break;
                    case 'I':   aNumFmt.eType = SVX_NUM_ROMAN_UPPER;        break;
                    case 'i':   aNumFmt.eType = SVX_NUM_ROMAN_LOWER;        break;
                    default:    bChangeNumFmt = sal_False;
                    }
                    break;

                case HTML_UNORDERLIST_ON:
                    aNumFmt.SetBulletChar( (sal_Unicode)pOption->GetEnum(
                                    aHTMLULTypeTable,aNumFmt.GetBulletChar() ) );
                    bChangeNumFmt = sal_True;
                    break;
                }
            }
            break;
        case HTML_O_START:
            {
                sal_uInt16 nStart = (sal_uInt16)pOption->GetNumber();
                if( bNewNumFmt )
                {
                    aNumFmt.SetStartValue( nStart );
                    bChangeNumFmt = sal_True;
                }
                else
                {
                    rInfo.SetNodeStartValue( nLevel, nStart );
                }
            }
            break;
        case HTML_O_STYLE:
            aStyle = pOption->GetString();
            break;
        case HTML_O_CLASS:
            aClass = pOption->GetString();
            break;
        case HTML_O_SRC:
            if( bNewNumFmt )
            {
                aBulletSrc = pOption->GetString();
                if( !InternalImgToPrivateURL(aBulletSrc) )
                    aBulletSrc = INetURLObject::RelToAbs( aBulletSrc );
            }
            break;
        case HTML_O_WIDTH:
            nWidth = (sal_uInt16)pOption->GetNumber();
            break;
        case HTML_O_HEIGHT:
            nHeight = (sal_uInt16)pOption->GetNumber();
            break;
        case HTML_O_ALIGN:
            eVertOri =
                (SwVertOrient)pOption->GetEnum( aHTMLImgVAlignTable,
                                                eVertOri );
            break;
        }
    }

    if( aBulletSrc.Len() )
    {
        // Eine Bullet-Liste mit Grafiken
        aNumFmt.eType = SVX_NUM_BITMAP;

        // Die Grafik als Brush anlegen
        SvxBrushItem aBrushItem;
        aBrushItem.SetGraphicLink( aBulletSrc );
        aBrushItem.SetGraphicPos( GPOS_AREA );

        // Die Groesse nur beachten, wenn Breite und Hoehe vorhanden sind
        Size aTwipSz( nWidth, nHeight), *pTwipSz=0;
        if( nWidth!=USHRT_MAX && nHeight!=USHRT_MAX )
        {
            aTwipSz =
                Application::GetDefaultDevice()->PixelToLogic( aTwipSz,
                                                    MapMode(MAP_TWIP) );
            pTwipSz = &aTwipSz;
        }

        // Die Ausrichtung auch nur beachten, wenn eine Ausrichtung
        // angegeben wurde
        SwFmtVertOrient aVertOri( 0, eVertOri );
        SwFmtVertOrient *pVertOri = VERT_NONE!=eVertOri ? &aVertOri : 0;

        aNumFmt.SetGrfBrush( &aBrushItem, pTwipSz, pVertOri );

        // Und noch die Grafik merken, um sie in den Absaetzen nicht
        // einzufuegen
        aBulletGrfs[nLevel] = aBulletSrc;
        bChangeNumFmt = sal_True;
    }
    else
        aBulletGrfs[nLevel].Erase();

    // den aktuellen Absatz erst einmal nicht numerieren
    SetNodeNum( nLevel | NO_NUMLEVEL );

    // einen neuen Kontext anlegen
    _HTMLAttrContext *pCntxt = new _HTMLAttrContext( nToken );

#ifndef NUM_RELSPACE
    // darin auch die Raender merken
    sal_uInt16 nLeft=0, nRight=0;
    short nIndent=0;
    GetMarginsFromContext( nLeft, nRight, nIndent );
    nLeft += HTML_NUMBUL_MARGINLEFT;
    pCntxt->SetMargins( nLeft, nRight, nIndent );
#endif

    // Styles parsen
    if( HasStyleOptions( aStyle, aId, aClass ) )
    {
        SfxItemSet aItemSet( pDoc->GetAttrPool(), pCSS1Parser->GetWhichMap() );
        SvxCSS1PropertyInfo aPropInfo;

        if( ParseStyleOptions( aStyle, aId, aClass, aItemSet, aPropInfo ) )
        {
#ifdef NUM_RELSPACE
            if( bNewNumFmt )
            {
                if( aPropInfo.bLeftMargin )
                {
                    // Der Der Default-Einzug wurde schon eingefuegt.
                    sal_uInt16 nAbsLSpace =
                        aNumFmt.GetAbsLSpace() - HTML_NUMBUL_MARGINLEFT;
                    if( aPropInfo.nLeftMargin < 0 &&
                        nAbsLSpace < -aPropInfo.nLeftMargin )
                        nAbsLSpace = 0U;
                    else if( aPropInfo.nLeftMargin > USHRT_MAX ||
                             (long)nAbsLSpace +
                                            aPropInfo.nLeftMargin > USHRT_MAX )
                        nAbsLSpace = USHRT_MAX;
                    else
                        nAbsLSpace = nAbsLSpace + (sal_uInt16)aPropInfo.nLeftMargin;

                    aNumFmt.SetAbsLSpace( nAbsLSpace );
                    bChangeNumFmt = sal_True;
                }
                if( aPropInfo.bTextIndent )
                {
                    short nTextIndent =
                        ((const SvxLRSpaceItem &)aItemSet.Get( RES_LR_SPACE ))
                                                        .GetTxtFirstLineOfst();
                    aNumFmt.SetFirstLineOffset( nTextIndent );
                    bChangeNumFmt = sal_True;
                }
            }
            aPropInfo.bLeftMargin = aPropInfo.bTextIndent = sal_False;
            if( !aPropInfo.bRightMargin )
                aItemSet.ClearItem( RES_LR_SPACE );
#endif
            DoPositioning( aItemSet, aPropInfo, pCntxt );
            InsertAttrs( aItemSet, aPropInfo, pCntxt );
        }
    }

    if( bChangeNumFmt )
    {
        rInfo.GetNumRule()->Set( nLevel, aNumFmt );
        pDoc->ChgNumRuleFmts( *rInfo.GetNumRule() );
    }

    PushContext( pCntxt );

    // die Attribute der neuen Vorlage setzen
    SetTxtCollAttrs( pCntxt );
}

void SwHTMLParser::EndNumBulList( int nToken )
{
    SwHTMLNumRuleInfo& rInfo = GetNumInfo();

    // Ein neuer Absatz muss aufgemacht werden, wenn
    // - der aktuelle nicht leer ist, also Text oder absatzgebundene Objekte
    //   enthaelt.
    // - der aktuelle Absatz numeriert ist.
    sal_Bool bAppend = pPam->GetPoint()->nContent.GetIndex() > 0;
    if( !bAppend )
    {
        SwTxtNode* pTxtNode = pPam->GetNode()->GetTxtNode();
        bAppend = (pTxtNode && pTxtNode->GetNum() &&
                    !(NO_NUMLEVEL & pTxtNode->GetNum()->GetLevel())) ||
                  HasCurrentParaFlys();
    }

    sal_Bool bSpace = (rInfo.GetDepth() + nDefListDeep) == 1;
    if( bAppend )
        AppendTxtNode( bSpace ? AM_SPACE : AM_NOSPACE, sal_False );
    else if( bSpace )
        AddParSpace();

    // den aktuellen Kontext vom Stack holen
    _HTMLAttrContext *pCntxt = nToken!=0 ? PopContext( nToken & ~1 ) : 0;

    // Keine Liste aufgrund eines Tokens beenden, wenn der Kontext
    // nie angelgt wurde oder nicht beendet werden darf.
    if( rInfo.GetDepth()>0 && (!nToken || pCntxt) )
    {
        rInfo.DecDepth();
        if( !rInfo.GetDepth() )     // wars der letze Level ?
        {
            // Die noch nicht angepassten Formate werden jetzt noch
            // angepasst, damit es sich besser Editieren laesst.
            const SwNumFmt *pRefNumFmt = 0;
            sal_Bool bChanged = sal_False;
            for( sal_uInt16 i=0; i<MAXLEVEL; i++ )
            {
                const SwNumFmt *pNumFmt = rInfo.GetNumRule()->GetNumFmt(i);
                if( pNumFmt )
                {
                    pRefNumFmt = pNumFmt;
                }
                else if( pRefNumFmt )
                {
                    SwNumFmt aNumFmt( rInfo.GetNumRule()->Get(i) );
                    aNumFmt.eType = pRefNumFmt->eType != SVX_NUM_BITMAP
                                        ? pRefNumFmt->eType : SVX_NUM_CHAR_SPECIAL;
                    if( SVX_NUM_CHAR_SPECIAL == aNumFmt.eType )
                    {
                        aNumFmt.SetBulletFont(
                                &rInfo.GetNumRule()->GetDefBulletFont() );
                        aNumFmt.SetBulletChar( cBulletChar );
                    }
                    aNumFmt.SetAbsLSpace( (i+1) * HTML_NUMBUL_MARGINLEFT );
                    aNumFmt.SetFirstLineOffset( HTML_NUMBUL_INDENT );
                    aNumFmt.SetCharFmt( pRefNumFmt->GetCharFmt() );
                    rInfo.GetNumRule()->Set( i, aNumFmt );
                    bChanged = sal_True;
                }
            }
            if( bChanged )
                pDoc->ChgNumRuleFmts( *rInfo.GetNumRule() );

            // Beim letzen Append wurde das NumRule-Item und das
            // NodeNum-Objekt mit kopiert. Beides muessen wir noch
            // loeschen. Das ResetAttr loescht das NodeNum-Objekt mit!
            pPam->GetNode()->GetTxtNode()->ResetAttr( RES_PARATR_NUMRULE );

#ifndef NUM_RELSPACE
            // Die Numerierung komplett beenden.
            if( pTable )
                UpdateNumRuleInTable();
#endif
            rInfo.Clear();
        }
        else
        {
            // den naechsten Absatz erstmal nicht numerieren
            SetNodeNum( rInfo.GetLevel() | NO_NUMLEVEL );
        }
    }

    // und noch Attribute beenden
    sal_Bool bSetAttrs = sal_False;
    if( pCntxt )
    {
        EndContext( pCntxt );
        delete pCntxt;
        bSetAttrs = sal_True;
    }

    if( nToken )
        SetTxtCollAttrs();

    if( bSetAttrs )
        SetAttr();  // Absatz-Atts wegen JavaScript moeglichst schnell setzen

}

/*  */

void SwHTMLParser::NewNumBulListItem( int nToken )
{
    sal_uInt8 nLevel = GetNumInfo().GetLevel();
    String aId, aStyle, aClass;
    sal_uInt16 nStart = HTML_LISTHEADER_ON != nToken
                        ? GetNumInfo().GetNodeStartValue( nLevel )
                        : USHRT_MAX;
    if( USHRT_MAX != nStart )
        GetNumInfo().SetNodeStartValue( nLevel );

    const HTMLOptions *pOptions = GetOptions();
    for( sal_uInt16 i = pOptions->Count(); i; )
    {
        const HTMLOption *pOption = (*pOptions)[--i];
        switch( pOption->GetToken() )
        {
            case HTML_O_VALUE:
                nStart = (sal_uInt16)pOption->GetNumber();
                break;
            case HTML_O_ID:
                aId = pOption->GetString();
                break;
            case HTML_O_STYLE:
                aStyle = pOption->GetString();
                break;
            case HTML_O_CLASS:
                aClass = pOption->GetString();
                break;
        }
    }

    // einen neuen Absatz aufmachen
    if( pPam->GetPoint()->nContent.GetIndex() )
        AppendTxtNode( AM_NOSPACE, sal_False );
    bNoParSpace = sal_False;    // In <LI> wird kein Abstand eingefuegt!

    if( HTML_LISTHEADER_ON==nToken )
        nLevel = nLevel | NO_NUMLEVEL;

    _HTMLAttrContext *pCntxt = new _HTMLAttrContext( nToken );

    String aNumRuleName;
    if( GetNumInfo().GetNumRule() )
    {
        aNumRuleName = GetNumInfo().GetNumRule()->GetName();
    }
    else
    {
        aNumRuleName = pDoc->GetUniqueNumRuleName();
        SwNumRule aNumRule( aNumRuleName );
        SwNumFmt aNumFmt( aNumRule.Get( 0 ) );
        aNumFmt.SetBulletFont( &SwNumRule::GetDefBulletFont() );
        aNumFmt.eType = SVX_NUM_CHAR_SPECIAL;
        aNumFmt.SetBulletChar( cBulletChar );   // das Bulletzeichen !!
        aNumFmt.SetCharFmt( pCSS1Parser->GetCharFmtFromPool(RES_POOLCHR_BUL_LEVEL) );
        aNumFmt.SetLSpace( (sal_uInt16)(-HTML_NUMBUL_INDENT) );
        aNumFmt.SetFirstLineOffset( HTML_NUMBUL_INDENT );
        aNumRule.Set( 0, aNumFmt );

        pDoc->MakeNumRule( aNumRuleName, &aNumRule );

#ifndef NUM_RELSPACE
        // Hier muessen wir hart attributieren
        sal_uInt16 nLeft=0, nRight=0;
        short nIndent=0;
        GetMarginsFromContext( nLeft, nRight, nIndent );
        nLeft += (sal_uInt16)(-HTML_NUMBUL_INDENT);
        pCntxt->SetMargins( nLeft, nRight, nIndent );
#endif

        ASSERT( !nOpenParaToken,
                "Jetzt geht ein offenes Absatz-Element verloren" );
        // Wir tun so, als ob wir in einem Absatz sind. Dann wird
        // beim naechsten Absatz wenigstens die Numerierung
        // weggeschmissen, die nach dem naechsten AppendTxtNode uebernommen
        // wird.
        nOpenParaToken = nToken;
    }

    SwTxtNode* pTxtNode = pPam->GetNode()->GetTxtNode();
    ((SwCntntNode *)pTxtNode)->SetAttr( SwNumRuleItem(aNumRuleName) );
    pTxtNode->UpdateNum( SwNodeNum( nLevel, nStart ) );
#ifndef NUM_RELSPACE
    pTxtNode->SetNumLSpace( GetNumInfo().GetNumRule()!=0 );
#endif
    if( GetNumInfo().GetNumRule() )
        GetNumInfo().GetNumRule()->SetInvalidRule( sal_True );

    // Styles parsen
    if( HasStyleOptions( aStyle, aId, aClass ) )
    {
        SfxItemSet aItemSet( pDoc->GetAttrPool(), pCSS1Parser->GetWhichMap() );
        SvxCSS1PropertyInfo aPropInfo;

        if( ParseStyleOptions( aStyle, aId, aClass, aItemSet, aPropInfo ) )
        {
            DoPositioning( aItemSet, aPropInfo, pCntxt );
            InsertAttrs( aItemSet, aPropInfo, pCntxt );
        }
    }

    PushContext( pCntxt );

    // die neue Vorlage setzen
    SetTxtCollAttrs( pCntxt );

    // Laufbalkenanzeige aktualisieren
    ShowStatline();
}

void SwHTMLParser::EndNumBulListItem( int nToken, sal_Bool bSetColl,
                                      sal_Bool bLastPara )
{
    // einen neuen Absatz aufmachen
    if( !nToken && pPam->GetPoint()->nContent.GetIndex() )
        AppendTxtNode( AM_NOSPACE );

    // Kontext zu dem Token suchen und vom Stack holen
    _HTMLAttrContext *pCntxt = 0;
    sal_uInt16 nPos = aContexts.Count();
    nToken &= ~1;
    while( !pCntxt && nPos>nContextStMin )
    {
        sal_uInt16 nCntxtToken = aContexts[--nPos]->GetToken();
        switch( nCntxtToken )
        {
        case HTML_LI_ON:
        case HTML_LISTHEADER_ON:
            if( !nToken || nToken == nCntxtToken  )
            {
                pCntxt = aContexts[nPos];
                aContexts.Remove( nPos, 1 );
            }
            break;
        case HTML_ORDERLIST_ON:
        case HTML_UNORDERLIST_ON:
        case HTML_MENULIST_ON:
        case HTML_DIRLIST_ON:
            // keine LI/LH ausserhalb der aktuellen Liste betrachten
            nPos = nContextStMin;
            break;
        }
    }

    // und noch Attribute beenden
    if( pCntxt )
    {
        EndContext( pCntxt );
        SetAttr();  // Absatz-Atts wegen JavaScript moeglichst schnell setzen
        delete pCntxt;
    }

    // und die bisherige Vorlage setzen
    if( bSetColl )
        SetTxtCollAttrs();
}

/*  */

void SwHTMLParser::SetNodeNum( sal_uInt8 nLevel )
{
    SwTxtNode* pTxtNode = pPam->GetNode()->GetTxtNode();
    ASSERT( pTxtNode, "Kein Text-Node an PaM-Position" );

    ASSERT( GetNumInfo().GetNumRule(), "Kein Numerierungs-Regel" );
    const String& rName = GetNumInfo().GetNumRule()->GetName();
    ((SwCntntNode *)pTxtNode)->SetAttr( SwNumRuleItem(rName) );

    pTxtNode->UpdateNum( SwNodeNum( nLevel ) );
#ifndef NUM_RELSPACE
    pTxtNode->SetNumLSpace( sal_True );
#endif

    // NumRule invalidieren, weil sie durch ein EndAction bereits
    // auf valid geschaltet worden sein kann.
    GetNumInfo().GetNumRule()->SetInvalidRule( sal_False );
}


#ifndef NUM_RELSPACE
void SwHTMLParser::UpdateNumRuleInTable()
{
    // Wenn wir in einer Tabelle sind, muss die Numerierung wegen
    // GetMixMaxSize gliech updatet werden. Wenn die Numerierung
    // in einen Rahmen rein oder aus einem Rahmen heraus geschoben
    // muss sie komplett updatet werden. Sonst genuegt es, sie
    // innerhalb der aktuellen Zelle zu updaten.

    ASSERT( GetNumInfo().GetNumRule(), "UpdateNumRuleInTable: Keine NumRule" );
    ASSERT( pTable, "UpdateNumRuleInTable: Keine Tabele, Aufruf unneotig" );

    sal_uInt32 nPos = ULONG_MAX;
    if( !GetNumInfo().IsUpdateWholeNum() )
    {
        const SwStartNode *pSttNd = pPam->GetNode()->FindTableBoxStartNode();
        ASSERT( pSttNd || pPam->GetNode()->FindFlyStartNode(),
                "UpdateNumRuleInTable: Doch keine Tabelle?" );
        if( pSttNd )
            nPos = pSttNd->GetIndex();
    }
    pDoc->UpdateNumRule( GetNumInfo().GetNumRule()->GetName(), nPos );
}
#endif

/*  */

void SwHTMLWriter::FillNextNumInfo()
{
    pNextNumRuleInfo = 0;

    sal_uInt32 nPos = pCurPam->GetPoint()->nNode.GetIndex() + 1;

    sal_Bool bDone = sal_False;
    sal_Bool bTable = sal_False;
    do
    {
        const SwNode* pNd = pDoc->GetNodes()[nPos];
        if( pNd->IsTxtNode() )
        {
            // Der naechste wird als naechstes ausgegeben.
            pNextNumRuleInfo = new SwHTMLNumRuleInfo( *pNd->GetTxtNode() );

            // Vor einer Tabelle behalten wir erst einmal die alte Ebene bei,
            // wenn die gleiche Numerierung hinter der Tabelle
            // fortgesetzt wird und dort nicht von vorne numeriert
            // wird. Die Tabelle wird ann beim Import so weit eingeruckt,
            // wie es der Num-Ebene entspricht.
            if( bTable &&
                pNextNumRuleInfo->GetNumRule()==GetNumInfo().GetNumRule() &&
                !pNextNumRuleInfo->IsRestart() )
            {
                pNextNumRuleInfo->SetDepth( GetNumInfo().GetDepth() );
            }
        }
        else if( pNd->IsTableNode() )
        {
            // Eine Tabelle wird uebersprungen, also den Node
            // hinter der Tabelle betrachten.
            nPos = pNd->EndOfSectionIndex() + 1;
            bTable = sal_True;
        }
        else
        {
            // In allen anderen Faellen ist die Numerierung erstmal
            // zu Ende.
            pNextNumRuleInfo = new SwHTMLNumRuleInfo;
        }
    }
    while( !pNextNumRuleInfo );
}

void SwHTMLWriter::ClearNextNumInfo()
{
    delete pNextNumRuleInfo;
    pNextNumRuleInfo = 0;
}

Writer& OutHTML_NumBulListStart( SwHTMLWriter& rWrt,
                                 const SwHTMLNumRuleInfo& rInfo )
{
    SwHTMLNumRuleInfo& rPrevInfo = rWrt.GetNumInfo();
    sal_Bool bSameRule = rPrevInfo.GetNumRule() == rInfo.GetNumRule();
    if( bSameRule && rPrevInfo.GetDepth() >= rInfo.GetDepth() &&
        !rInfo.IsRestart() )
    {
        return rWrt;
    }

    DBG_ASSERT( rWrt.nLastParaToken == 0,
                "<PRE> wurde nicht vor <OL> beendet." );
    sal_uInt16 nPrevDepth =
        (bSameRule && !rInfo.IsRestart()) ? rPrevInfo.GetDepth() : 0;

    for( sal_uInt16 i=nPrevDepth; i<rInfo.GetDepth(); i++ )
    {
        rWrt.OutNewLine(); // <OL>/<UL> in eine neue Zeile

        rWrt.aBulletGrfs[i].Erase();
        ByteString sOut( '<' );
        const SwNumFmt& rNumFmt = rInfo.GetNumRule()->Get( i );
        SvxExtNumType eType = rNumFmt.eType;
        if( SVX_NUM_CHAR_SPECIAL == eType )
        {
            // Aufzaehlungs-Liste: <OL>
            sOut += sHTML_unorderlist;

            // den Typ ueber das Bullet-Zeichen bestimmen
            const sal_Char *pStr = 0;
            switch( rNumFmt.GetBulletChar() )
            {
            case HTML_BULLETCHAR_DISC:
                pStr = sHTML_ULTYPE_disc;
                break;
            case HTML_BULLETCHAR_CIRCLE:
                pStr = sHTML_ULTYPE_circle;
                break;
            case HTML_BULLETCHAR_SQUARE:
                pStr = sHTML_ULTYPE_square;
                break;
            }

            if( pStr )
                (((sOut += ' ') += sHTML_O_type) += '=') += pStr;
        }
        else if( SVX_NUM_BITMAP == eType )
        {
            // Aufzaehlungs-Liste: <OL>
            sOut += sHTML_unorderlist;
            rWrt.Strm() << sOut.GetBuffer();
            sOut.Erase();

            OutHTML_BulletImage( rWrt,
                                    0,
                                    rNumFmt.GetGrfBrush(),
                                    rWrt.aBulletGrfs[i],
                                    rNumFmt.GetGrfSize(),
                                    rNumFmt.GetGrfOrient() );
        }
        else
        {
            // Numerierungs-Liste: <UL>
            sOut += sHTML_orderlist;

            // den Typ ueber das Format bestimmen
            sal_Char cType = 0;
            switch( eType )
            {
            case SVX_NUM_CHARS_UPPER_LETTER:    cType = 'A'; break;
            case SVX_NUM_CHARS_LOWER_LETTER:    cType = 'a'; break;
            case SVX_NUM_ROMAN_UPPER:           cType = 'I'; break;
            case SVX_NUM_ROMAN_LOWER:           cType = 'i'; break;
            }
            if( cType )
                (((sOut += ' ') += sHTML_O_type) += '=') += cType;

            // und evtl. den Startwert mit ausgeben
            if( rNumFmt.GetStartValue() != 1 )
            {
                (((sOut += ' ') += sHTML_O_start) += '=')
                    += ByteString::CreateFromInt32( rNumFmt.GetStartValue() );
            }
        }

        if( sOut.Len() )
            rWrt.Strm() << sOut.GetBuffer();

#ifdef NUM_RELSPACE
        if( rWrt.bCfgOutStyles )
            OutCSS1_NumBulListStyleOpt( rWrt, *rInfo.GetNumRule(), i );
#endif

        rWrt.Strm() << '>';

        rWrt.IncIndentLevel(); // Inhalt von <OL> einruecken
    }

    return rWrt;
}

Writer& OutHTML_NumBulListEnd( SwHTMLWriter& rWrt,
                               const SwHTMLNumRuleInfo& rNextInfo )
{
    SwHTMLNumRuleInfo& rInfo = rWrt.GetNumInfo();
    sal_Bool bSameRule = rNextInfo.GetNumRule() == rInfo.GetNumRule();
    if( bSameRule && rNextInfo.GetDepth() >= rInfo.GetDepth() &&
        !rNextInfo.IsRestart() )
    {
        return rWrt;
    }

    DBG_ASSERT( rWrt.nLastParaToken == 0,
                "<PRE> wurde nicht vor </OL> beendet." );
    sal_uInt16 nNextDepth =
        (bSameRule && !rNextInfo.IsRestart()) ? rNextInfo.GetDepth() : 0;

    // MIB 23.7.97: Die Schleife muss doch rueckwaerts durchlaufen
    // werden, weil die Reihenfolge von </OL>/</UL> stimmen muss
    for( sal_uInt16 i=rInfo.GetDepth(); i>nNextDepth; i-- )
    {
        rWrt.DecIndentLevel(); // Inhalt von <OL> einruecken
        if( rWrt.bLFPossible )
            rWrt.OutNewLine(); // </OL>/</UL> in eine neue Zeile

        // es wird also eine Liste angefangen oder beendet:
        SvxExtNumType eType = rInfo.GetNumRule()->Get( i-1 ).eType;
        const sal_Char *pStr;
        if( SVX_NUM_CHAR_SPECIAL == eType || SVX_NUM_BITMAP == eType)
            pStr = sHTML_unorderlist;
        else
            pStr = sHTML_orderlist;
        HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), pStr, sal_False );
        rWrt.bLFPossible = sal_True;
    }

    return rWrt;
}


/*************************************************************************

      $Log: not supported by cvs2svn $
      Revision 1.21  2000/09/18 16:04:45  willem.vandorp
      OpenOffice header added.

      Revision 1.20  2000/06/26 09:52:17  jp
      must change: GetAppWindow->GetDefaultDevice

      Revision 1.19  2000/04/10 12:20:56  mib
      unicode

      Revision 1.18  2000/03/21 15:06:18  os
      UNOIII

      Revision 1.17  2000/02/11 14:37:16  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.16  1999/11/19 16:40:20  os
      modules renamed

      Revision 1.15  1999/09/17 12:13:32  mib
      support of multiple and non system text encodings

      Revision 1.14  1999/03/26 10:37:28  MIB
      #63049#: Sofortige Numerierungs-Aktualisierung in Tabellen ist jetzt unnoetig


      Rev 1.13   26 Mar 1999 11:37:28   MIB
   #63049#: Sofortige Numerierungs-Aktualisierung in Tabellen ist jetzt unnoetig

      Rev 1.12   23 Mar 1999 15:28:16   MIB
   #63049#: Relative Einzuege in Numerierungen

      Rev 1.11   17 Mar 1999 16:47:10   MIB
   #63049#: Numerierungen mit relativen Abstaenden

      Rev 1.10   27 Jan 1999 09:43:54   OS
   #56371# TF_ONE51

      Rev 1.9   06 Jan 1999 10:33:40   MIB
   #60311#: In Listen fuer nicht-numerierte Absaetze keine <PRE> ausgeben

      Rev 1.8   17 Nov 1998 10:44:30   OS
   #58263# NumType durch SvxExtNumType ersetzt

      Rev 1.7   05 Nov 1998 12:34:30   MIB
   #59042#: Fuer nicht verwendete Numerierungs-Ebenen sinnvolle Defaults setzen

      Rev 1.6   21 Apr 1998 13:46:58   MIB
   fix: Keine ::com::sun::star::text::Bookmark fuer abs-pos Objekte mit ID einfuegen

      Rev 1.5   03 Apr 1998 12:21:48   MIB
   Export des Rahmen-Namens als ID

      Rev 1.4   25 Mar 1998 12:09:24   MIB
   unneotige defines weg

      Rev 1.3   02 Mar 1998 18:32:16   MIB
   fix #47671#: Erste Numerierung auf einer Ebene gewinnt, Startwert

      Rev 1.2   20 Feb 1998 19:01:50   MA
   header

      Rev 1.1   10 Feb 1998 09:51:24   MIB
   fix: Fuer Absatz-Abstand am Start-/Ende von Listen auch OL/UL/DL beachten

      Rev 1.0   19 Jan 1998 16:16:26   MIB
   Initial revision.


*************************************************************************/

diff --git a/sw/source/filter/html/htmlnum.hxx b/sw/source/filter/html/htmlnum.hxx
new file mode 100644
index 0000000..e032210
--- /dev/null
+++ b/sw/source/filter/html/htmlnum.hxx
@@ -0,0 +1,189 @@
/*************************************************************************
 *
 *  $RCSfile: htmlnum.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:55 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _HTMLNUM_HXX
#define _HTMLNUM_HXX

#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#include <string.h>

#define HTML_NUMBUL_MARGINLEFT  (MM50*2 + MM50/2)
#define HTML_NUMBUL_INDENT      (-MM50)

class SwTxtNode;
class SwNumRule;

class SwHTMLNumRuleInfo
{
    sal_uInt16      aNumStarts[MAXLEVEL];
    SwNumRule   *   pNumRule;       // Aktuelle Numerierung
    sal_uInt16      nDeep;          // aktuelle Num-Tiefe (1, 2, 3, ...)
    sal_Bool        bRestart : 1;   // Export: Numerierung neu starten
    sal_Bool        bNumbered : 1;  // Export: Absatz ist numeriert
#ifndef NUM_RELSPACE
    sal_Bool        bUpdateWholeNum : 1;    // Import: Muss die NumRule
                                        // vollstaendig aktualisiert werden
#endif

public:

    inline void Set( const SwHTMLNumRuleInfo& rInf );
    void Set( const SwTxtNode& rTxtNd );

    SwHTMLNumRuleInfo() :
        pNumRule( 0 ), nDeep( 0 ),
#ifndef NUM_RELSPACE
        bUpdateWholeNum( sal_False ),
#endif
        bRestart( sal_False ), bNumbered( sal_False )
    {
        memset( &aNumStarts, 0xff, sizeof( aNumStarts ) );
    }

    SwHTMLNumRuleInfo( const SwHTMLNumRuleInfo& rInf ) :
        pNumRule( rInf.pNumRule ), nDeep( rInf.nDeep ),
#ifndef NUM_RELSPACE
        bUpdateWholeNum( rInf.bUpdateWholeNum ),
#endif
        bRestart( rInf.bRestart ), bNumbered( rInf.bNumbered )
    {
        memcpy( &aNumStarts, &rInf.aNumStarts, sizeof( aNumStarts ) );
    }

    SwHTMLNumRuleInfo( const SwTxtNode& rTxtNd ) { Set( rTxtNd ); }
    inline SwHTMLNumRuleInfo& operator=( const SwHTMLNumRuleInfo& rInf );

    inline void Clear();

    void SetNumRule( const SwNumRule *pRule ) { pNumRule = (SwNumRule *)pRule; }
    SwNumRule *GetNumRule() { return pNumRule; }
    const SwNumRule *GetNumRule() const { return pNumRule; }

    void SetDepth( sal_uInt16 nDepth ) { nDeep = nDepth; }
    sal_uInt16 GetDepth() const { return nDeep; }
    sal_uInt16 IncDepth() { return ++nDeep; }
    sal_uInt16 DecDepth() { return nDeep==0 ? 0 : --nDeep; }
    inline sal_uInt8 GetLevel() const;

#ifndef NUM_RELSPACE
    void SetUpdateWholeNum( sal_Bool bSet ) { bUpdateWholeNum = bSet; }
    sal_Bool IsUpdateWholeNum() const { return bUpdateWholeNum; }
#endif

    void SetRestart( sal_Bool bSet ) { bRestart = bSet; }
    sal_Bool IsRestart() const { return bRestart; }

    void SetNumbered( sal_Bool bSet ) { bNumbered = bSet; }
    sal_Bool IsNumbered() const { return bNumbered; }

    inline void SetNodeStartValue( sal_uInt8 nLvl, sal_uInt16 nVal=USHRT_MAX );
    sal_uInt16 GetNodeStartValue( sal_uInt8 nLvl ) const { return aNumStarts[nLvl]; }
};

inline SwHTMLNumRuleInfo& SwHTMLNumRuleInfo::operator=(
    const SwHTMLNumRuleInfo& rInf )
{
    Set( rInf );
    return *this;
}

inline void SwHTMLNumRuleInfo::Set( const SwHTMLNumRuleInfo& rInf )
{
    pNumRule = rInf.pNumRule;
    nDeep = rInf.nDeep;
#ifndef NUM_RELSPACE
    bUpdateWholeNum = rInf.bUpdateWholeNum;
#endif
    bRestart = rInf.bRestart;
    bNumbered = rInf.bNumbered;
    memcpy( &aNumStarts, &rInf.aNumStarts, sizeof( aNumStarts ) );
}

inline void SwHTMLNumRuleInfo::Clear()
{
    pNumRule = 0;
    nDeep = 0;
#ifndef NUM_RELSPACE
    bUpdateWholeNum = sal_False;
#endif
    bRestart = bNumbered = sal_False;
    memset( &aNumStarts, 0xff, sizeof( aNumStarts ) );
}

inline sal_uInt8 SwHTMLNumRuleInfo::GetLevel() const
{
    return
        (sal_uInt8)( pNumRule!=0 && nDeep != 0
            ? ( nDeep<=MAXLEVEL ? nDeep-1 : MAXLEVEL - 1 )
            : 0 );
}

inline void SwHTMLNumRuleInfo::SetNodeStartValue( sal_uInt8 nLvl, sal_uInt16 nVal )
{
    aNumStarts[nLvl] = nVal;
}


#endif


diff --git a/sw/source/filter/html/htmlplug.cxx b/sw/source/filter/html/htmlplug.cxx
new file mode 100644
index 0000000..81e8112
--- /dev/null
+++ b/sw/source/filter/html/htmlplug.cxx
@@ -0,0 +1,1360 @@
/*************************************************************************
 *
 *  $RCSfile: htmlplug.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:55 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#include "hintids.hxx"

#ifndef SVTOOLS_URIHELPER_HXX
#include <svtools/urihelper.hxx>
#endif
#define _SVSTDARR_ULONGS
#include <svtools/svstdarr.hxx>
#ifndef _SV_SVAPP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _FRMHTML_HXX //autogen
#include <sfx2/frmhtml.hxx>
#endif
#ifndef _FRAMEOBJ_HXX //autogen
#include <sfx2/frameobj.hxx>
#endif
#ifndef _FRMHTMLW_HXX //autogen
#include <sfx2/frmhtmlw.hxx>
#endif
#ifndef _WRKWIN_HXX //autogen
#include <vcl/wrkwin.hxx>
#endif
#ifndef _SVSTOR_HXX //autogen
#include <so3/svstor.hxx>
#endif
#ifndef _APPLET_HXX //autogen
#include <so3/applet.hxx>
#endif
#ifndef _PLUGIN_HXX //autogen
#include <so3/plugin.hxx>
#endif
#ifndef _XOUTBMP_HXX //autogen
#include <svx/xoutbmp.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _HTMLTOKN_H
#include <svtools/htmltokn.h>
#endif


#ifndef _FMTORNT_HXX //autogen
#include <fmtornt.hxx>
#endif
#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _FMTSRND_HXX //autogen
#include <fmtsrnd.hxx>
#endif
#ifndef _FMTANCHR_HXX //autogen
#include <fmtanchr.hxx>
#endif
#ifndef _FMTCNTNT_HXX //autogen
#include <fmtcntnt.hxx>
#endif
#ifndef _FRMFMT_HXX //autogen
#include <frmfmt.hxx>
#endif


#include "pam.hxx"
#include "doc.hxx"
#include "ndtxt.hxx"
#include "swerror.h"
#include "ndole.hxx"
#include "swtable.hxx"
#include "swhtml.hxx"
#include "wrthtml.hxx"
#include "htmlfly.hxx"
#include "swcss1.hxx"

#define HTML_DFLT_EMBED_WIDTH ((MM50*5)/2)
#define HTML_DFLT_EMBED_HEIGHT ((MM50*5)/2)

#define HTML_DFLT_APPLET_WIDTH ((MM50*5)/2)
#define HTML_DFLT_APPLET_HEIGHT ((MM50*5)/2)

const ULONG HTML_FRMOPTS_EMBED_ALL      =
    HTML_FRMOPT_ALT |
    HTML_FRMOPT_SIZE |
    HTML_FRMOPT_NAME;
const ULONG HTML_FRMOPTS_EMBED_CNTNR    =
    HTML_FRMOPTS_EMBED_ALL |
    HTML_FRMOPT_ABSSIZE;
const ULONG HTML_FRMOPTS_EMBED          =
    HTML_FRMOPTS_EMBED_ALL |
    HTML_FRMOPT_ALIGN |
    HTML_FRMOPT_SPACE |
    HTML_FRMOPT_BRCLEAR |
    HTML_FRMOPT_NAME;
const ULONG HTML_FRMOPTS_HIDDEN_EMBED   =
    HTML_FRMOPT_ALT |
    HTML_FRMOPT_NAME;

const ULONG HTML_FRMOPTS_APPLET_ALL     =
    HTML_FRMOPT_ALT |
    HTML_FRMOPT_SIZE;
const ULONG HTML_FRMOPTS_APPLET_CNTNR   =
    HTML_FRMOPTS_APPLET_ALL |
    HTML_FRMOPT_ABSSIZE;
const ULONG HTML_FRMOPTS_APPLET         =
    HTML_FRMOPTS_APPLET_ALL |
    HTML_FRMOPT_ALIGN |
    HTML_FRMOPT_SPACE |
    HTML_FRMOPT_BRCLEAR;

const ULONG HTML_FRMOPTS_IFRAME_ALL     =
    HTML_FRMOPT_ALT |
    HTML_FRMOPT_SIZE;
const ULONG HTML_FRMOPTS_IFRAME_CNTNR   =
    HTML_FRMOPTS_IFRAME_ALL |
    HTML_FRMOPT_ABSSIZE;
const ULONG HTML_FRMOPTS_IFRAME         =
    HTML_FRMOPTS_IFRAME_ALL |
    HTML_FRMOPT_ALIGN |
    HTML_FRMOPT_SPACE |
    HTML_FRMOPT_BORDER |
    HTML_FRMOPT_BRCLEAR;

const ULONG HTML_FRMOPTS_OLE_CSS1       =
    HTML_FRMOPT_S_ALIGN |
    HTML_FRMOPT_S_SPACE;

sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_O_hidden, "HIDDEN" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_HIDDEN_false, "FALSE" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_O_archive, "ARCHIVE" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_O_archives, "ARCHIVES" );
sal_Char __FAR_DATA SVTOOLS_CONSTASCII_DEF( sHTML_O_object, "OBJECT" );

/*  */

void SwHTMLParser::SetFixSize( const Size& rPixSize,
                               const Size& rTwipDfltSize,
                               BOOL bPrcWidth, BOOL bPrcHeight,
                               SfxItemSet& rCSS1ItemSet,
                               SvxCSS1PropertyInfo& rCSS1PropInfo,
                               SfxItemSet& rFlyItemSet )
{
    // absolulte Groessenangaben in Twip umrechnen
    BYTE nPrcWidth = 0, nPrcHeight = 0;
    Size aTwipSz( bPrcWidth || USHRT_MAX==rPixSize.Width() ? 0 : rPixSize.Width(),
                  bPrcHeight || USHRT_MAX==rPixSize.Height() ? 0 : rPixSize.Height() );
    if( (aTwipSz.Width() || aTwipSz.Height()) && Application::GetDefaultDevice() )
    {
        aTwipSz =
            Application::GetDefaultDevice()->PixelToLogic( aTwipSz,
                                                MapMode(MAP_TWIP) );
    }

    // die Breite bearbeiten
    if( SVX_CSS1_LTYPE_PERCENTAGE == rCSS1PropInfo.eWidthType )
    {
        nPrcWidth = (BYTE)rCSS1PropInfo.nWidth;
        aTwipSz.Width() = rTwipDfltSize.Width();
    }
    else if( SVX_CSS1_LTYPE_TWIP== rCSS1PropInfo.eWidthType )
    {
        aTwipSz.Width() = rCSS1PropInfo.nWidth;
    }
    else if( bPrcWidth && rPixSize.Width() )
    {
        nPrcWidth = (BYTE)rPixSize.Width();
        if( nPrcWidth > 100 )
            nPrcWidth = 100;

        aTwipSz.Width() = rTwipDfltSize.Width();
    }
    else if( USHRT_MAX==rPixSize.Width() )
    {
        aTwipSz.Width() = rTwipDfltSize.Width();
    }
    if( aTwipSz.Width() < MINFLY )
    {
        aTwipSz.Width() = MINFLY;
    }

    // Hoehe bearbeiten
    if( SVX_CSS1_LTYPE_PERCENTAGE == rCSS1PropInfo.eHeightType )
    {
        nPrcHeight = (BYTE)rCSS1PropInfo.nHeight;
        aTwipSz.Height() = rTwipDfltSize.Height();
    }
    else if( SVX_CSS1_LTYPE_TWIP== rCSS1PropInfo.eHeightType )
    {
        aTwipSz.Height() = rCSS1PropInfo.nHeight;
    }
    else if( bPrcHeight && rPixSize.Height() )
    {
        nPrcHeight = (BYTE)rPixSize.Height();
        if( nPrcHeight > 100 )
            nPrcHeight = 100;

        aTwipSz.Height() = rTwipDfltSize.Height();
    }
    else if( USHRT_MAX==rPixSize.Height() )
    {
        aTwipSz.Height() = rTwipDfltSize.Height();
    }
    if( aTwipSz.Height() < MINFLY )
    {
        aTwipSz.Height() = MINFLY;
    }

    // Size setzen
    SwFmtFrmSize aFrmSize( ATT_FIX_SIZE, aTwipSz.Width(), aTwipSz.Height() );
    aFrmSize.SetWidthPercent( nPrcWidth );
    aFrmSize.SetHeightPercent( nPrcHeight );
    rFlyItemSet.Put( aFrmSize );
}

void SwHTMLParser::SetSpace( const Size& rPixSpace,
                             SfxItemSet& rCSS1ItemSet,
                             SvxCSS1PropertyInfo& rCSS1PropInfo,
                             SfxItemSet& rFlyItemSet )
{
    USHORT nLeftSpace = 0, nRightSpace = 0, nUpperSpace = 0, nLowerSpace = 0;
    if( (rPixSpace.Width() || rPixSpace.Height()) && Application::GetDefaultDevice() )
    {
        Size aTwipSpc( rPixSpace.Width(), rPixSpace.Height() );
        aTwipSpc =
            Application::GetDefaultDevice()->PixelToLogic( aTwipSpc,
                                                MapMode(MAP_TWIP) );
        nLeftSpace = nRightSpace = (USHORT)aTwipSpc.Width();
        nUpperSpace = nLowerSpace = (USHORT)aTwipSpc.Height();
    }

    // linken/rechten Rand setzen
    const SfxPoolItem *pItem;
    if( SFX_ITEM_SET==rCSS1ItemSet.GetItemState( RES_LR_SPACE, TRUE, &pItem ) )
    {
        // Ggf. den Erstzeilen-Einzug noch plaetten
        const SvxLRSpaceItem *pLRItem = (const SvxLRSpaceItem *)pItem;
        SvxLRSpaceItem aLRItem( *pLRItem );
        aLRItem.SetTxtFirstLineOfst( 0 );
        if( rCSS1PropInfo.bLeftMargin )
        {
            nLeftSpace = aLRItem.GetLeft();
            rCSS1PropInfo.bLeftMargin = FALSE;
        }
        if( rCSS1PropInfo.bRightMargin )
        {
            nRightSpace = aLRItem.GetRight();
            rCSS1PropInfo.bRightMargin = FALSE;
        }
        rCSS1ItemSet.ClearItem( RES_LR_SPACE );
    }
    if( nLeftSpace || nRightSpace )
    {
        SvxLRSpaceItem aLRItem;
        aLRItem.SetLeft( nLeftSpace );
        aLRItem.SetRight( nRightSpace );
        rFlyItemSet.Put( aLRItem );
        if( nLeftSpace )
        {
            const SwFmtHoriOrient& rHoriOri =
                (const SwFmtHoriOrient&)rFlyItemSet.Get( RES_HORI_ORIENT );
            if( HORI_NONE == rHoriOri.GetHoriOrient() )
            {
                SwFmtHoriOrient aHoriOri( rHoriOri );
                aHoriOri.SetPos( aHoriOri.GetPos() + nLeftSpace );
                rFlyItemSet.Put( aHoriOri );
            }
        }
    }

    // oberen/unteren Rand setzen
    if( SFX_ITEM_SET==rCSS1ItemSet.GetItemState( RES_UL_SPACE, TRUE, &pItem ) )
    {
        // Ggf. den Erstzeilen-Einzug noch plaetten
        const SvxULSpaceItem *pULItem = (const SvxULSpaceItem *)pItem;
        if( rCSS1PropInfo.bTopMargin )
        {
            nUpperSpace = pULItem->GetUpper();
            rCSS1PropInfo.bTopMargin = FALSE;
        }
        if( rCSS1PropInfo.bBottomMargin )
        {
            nLowerSpace = pULItem->GetLower();
            rCSS1PropInfo.bBottomMargin = FALSE;
        }
        rCSS1ItemSet.ClearItem( RES_UL_SPACE );
    }
    if( nUpperSpace || nLowerSpace )
    {
        SvxULSpaceItem aULItem;
        aULItem.SetUpper( nUpperSpace );
        aULItem.SetLower( nLowerSpace );
        rFlyItemSet.Put( aULItem );
        if( nUpperSpace )
        {
            const SwFmtVertOrient& rVertOri =
                (const SwFmtVertOrient&)rFlyItemSet.Get( RES_VERT_ORIENT );
            if( VERT_NONE == rVertOri.GetVertOrient() )
            {
                SwFmtVertOrient aVertOri( rVertOri );
                aVertOri.SetPos( aVertOri.GetPos() + nUpperSpace );
                rFlyItemSet.Put( aVertOri );
            }
        }
    }
}

/*  */

void SwHTMLParser::InsertEmbed()
{
    String aURL, aType, aName, aAlt, aId, aStyle, aClass;
    Size aSize( USHRT_MAX, USHRT_MAX );
    Size aSpace( USHRT_MAX, USHRT_MAX );
    BOOL bPrcWidth = FALSE, bPrcHeight = FALSE, bHidden = FALSE;
    SwVertOrient eVertOri = VERT_NONE;
    SwHoriOrient eHoriOri = HORI_NONE;
    SvCommandList aCmdLst;
    const HTMLOptions *pOptions = GetOptions();

    // Die Optionen werden vorwaerts gelesen, weil die Plugins sie in
    // dieser Reihenfolge erwarten. Trotzdem darf immer nur der erste
    // Wert einer Option beruecksichtigt werden.
    USHORT nArrLen = pOptions->Count();
    for( USHORT i=0; i<nArrLen; i++ )
    {
        const HTMLOption *pOption = (*pOptions)[i];
        switch( pOption->GetToken() )
        {
        case HTML_O_ID:
            aId = pOption->GetString();
            break;
        case HTML_O_STYLE:
            aStyle = pOption->GetString();
            break;
        case HTML_O_CLASS:
            aClass = pOption->GetString();
            break;
        case HTML_O_NAME:
            aName = pOption->GetString();
            break;
        case HTML_O_SRC:
            if( !aURL.Len() )
                aURL = pOption->GetString();
            break;
        case HTML_O_ALT:
            aAlt = pOption->GetString();
            break;
        case HTML_O_TYPE:
            if( !aType.Len() )
                aType = pOption->GetString();
            break;
        case HTML_O_ALIGN:
            if( eVertOri==VERT_NONE && eHoriOri==HORI_NONE )
            {
                eVertOri = (SwVertOrient)pOption->GetEnum( aHTMLImgVAlignTable, eVertOri );
                eHoriOri = (SwHoriOrient)pOption->GetEnum( aHTMLImgHAlignTable, eHoriOri );
            }
            break;
        case HTML_O_WIDTH:
            if( USHRT_MAX==aSize.Width() )
            {
                bPrcWidth = (pOption->GetString().Search('%') != STRING_NOTFOUND);
                aSize.Width() = (long)pOption->GetNumber();
            }
            break;
        case HTML_O_HEIGHT:
            if( USHRT_MAX==aSize.Height() )
            {
                bPrcHeight = (pOption->GetString().Search('%') != STRING_NOTFOUND);
                aSize.Height() = (long)pOption->GetNumber();
            }
            break;
        case HTML_O_HSPACE:
            if( USHRT_MAX==aSpace.Width() )
                aSpace.Width() = (long)pOption->GetNumber();
            break;
        case HTML_O_VSPACE:
            if( USHRT_MAX==aSpace.Height() )
                aSpace.Height() = (long)pOption->GetNumber();
            break;
        case HTML_O_UNKNOWN:
            if( pOption->GetTokenString().EqualsIgnoreCaseAscii( sHTML_O_hidden ) )
                bHidden =
                    !pOption->GetString().EqualsIgnoreCaseAscii( sHTML_HIDDEN_false );
            break;
        }

        // Es werden alle Parameter an das Plugin weitergereicht
        aCmdLst.Append( pOption->GetTokenString(), pOption->GetString() );
    }

    SfxItemSet aItemSet( pDoc->GetAttrPool(), pCSS1Parser->GetWhichMap() );
    SvxCSS1PropertyInfo aPropInfo;
    if( HasStyleOptions( aStyle, aId, aClass ) )
        ParseStyleOptions( aStyle, aId, aClass, aItemSet, aPropInfo );

    // Die Default-Werte umsetzen (ausser Hoehe/Breite, das macht schon
    // SetFrmSize() fuer uns)
    if( eVertOri==VERT_NONE && eHoriOri==HORI_NONE )
        eVertOri = VERT_TOP;
    if( USHRT_MAX==aSpace.Width() )
        aSpace.Width() = 0;
    if( USHRT_MAX==aSpace.Height() )
        aSpace.Height() = 0;
    if( bHidden )
    {
        // Size (0,0) wird in SetFrmSize auf (MINFLY, MINFLY) umgebogen
        aSize.Width() = 0; aSize.Height() = 0;
        aSpace.Width() = 0; aSpace.Height() = 0;
        bPrcWidth = bPrcHeight = FALSE;
    }

    // die URL aufbereiten
    INetURLObject aURLObj;
    if( aURL.Len() && !aURLObj.SetURL( INetURLObject::RelToAbs(aURL) ) )
        return;

    // das Plugin anlegen
    SvStorageRef pStor = new SvStorage( aEmptyStr, STREAM_STD_READWRITE);
    SvFactory *pPlugInFactory = SvFactory::GetDefaultPlugInFactory();
    SvPlugInObjectRef pPlugin =
        &pPlugInFactory->CreateAndInit( *pPlugInFactory, pStor );

    pPlugin->EnableSetModified( FALSE );
    pPlugin->SetPlugInMode( (USHORT)PLUGIN_EMBEDED );
    pPlugin->SetURL( aURLObj );
    pPlugin->SetMimeType( aType );
    pPlugin->SetCommandList( aCmdLst );
    pPlugin->EnableSetModified( TRUE );

    SfxItemSet aFrmSet( pDoc->GetAttrPool(),
                        RES_FRMATR_BEGIN, RES_FRMATR_END-1 );
    if( !IsNewDoc() )
        Reader::ResetFrmFmtAttrs( aFrmSet );

    // den Anker setzen
    if( !bHidden )
    {
        SetAnchorAndAdjustment( eVertOri, eHoriOri, aItemSet, aPropInfo, aFrmSet );
    }
    else
    {
        SwFmtAnchor aAnchor( FLY_AT_CNTNT );
        aAnchor.SetAnchor( pPam->GetPoint() );
        aFrmSet.Put( aAnchor );
        aFrmSet.Put( SwFmtHoriOrient( 0, HORI_LEFT, FRAME) );
        aFrmSet.Put( SwFmtSurround( SURROUND_THROUGHT ) );
        aFrmSet.Put( SwFmtVertOrient( 0, VERT_TOP, PRTAREA ) );
    }

    // und noch die Groesse des Rahmens
    Size aDfltSz( HTML_DFLT_EMBED_WIDTH, HTML_DFLT_EMBED_HEIGHT );
    SetFixSize( aSize, aDfltSz, bPrcWidth, bPrcHeight, aItemSet, aPropInfo,
                aFrmSet );
    SetSpace( aSpace, aItemSet, aPropInfo, aFrmSet );

    // und in das Dok einfuegen
    SwFrmFmt* pFlyFmt = pDoc->Insert( *pPam, pPlugin, &aFrmSet );

    // Namen am FrmFmt setzen
    if( aName.Len() )
        pFlyFmt->SetName( aName );

    // den alternativen Text setzen
    SwNoTxtNode *pNoTxtNd =
        pDoc->GetNodes()[ pFlyFmt->GetCntnt().GetCntntIdx()
                          ->GetIndex()+1 ]->GetNoTxtNode();
    pNoTxtNd->SetAlternateText( aAlt );

    // Ggf Frames anlegen und auto-geb. Rahmen registrieren
    if( !bHidden )
    {
        // HIDDEN-Plugins sollen absatzgebunden bleiben. Da RegisterFlyFrm
        // absatzgebundene Rahmen mit DUrchlauf in am Zeichen gebundene
        // Rahmen umwandelt, muessen die Frames hier von Hand angelegt werden.
        RegisterFlyFrm( pFlyFmt );
    }
}

/*  */

#ifdef SOLAR_JAVA
class SwHTMLApplet_Impl
{
    SvAppletObjectRef xApplet;      // das aktuelle Applet
    SvCommandList     aCommandList; // und die szugehorige Command-List
    SfxItemSet        aItemSet;
    String            sAlt;

public:

    SwHTMLApplet_Impl( SfxItemPool& rPool, USHORT nWhich1, USHORT nWhich2 ) :
        aItemSet( rPool, nWhich1, nWhich2 )
    {
    }

    ~SwHTMLApplet_Impl()
    {
        xApplet.Clear();
    }

#ifndef DEBUG
inline
#endif
    void CreateApplet( const String& rCode, const String& rName,
                       BOOL bMayScript, const String& rCodeBase,
                       const String& rAlt );

    void FinishApplet()
    {
        xApplet->SetCommandList( aCommandList );
        xApplet->EnableSetModified( TRUE );
    }


    void AppendParam( const String& rName, const String& rValue )
    {
        aCommandList.Append( rName, rValue );
    }


    SvAppletObject* GetApplet() { return &xApplet; }
    SfxItemSet& GetItemSet() { return aItemSet; }
    const String& GetAltText() { return sAlt; }
};

#ifndef DEBUG
inline
#endif
void SwHTMLApplet_Impl::CreateApplet( const String& rCode, const String& rName,
                                      BOOL bMayScript, const String& rCodeBase,
                                      const String& rAlt )
{
    SvStorageRef pStor = new SvStorage( aEmptyStr, STREAM_STD_READWRITE );
    xApplet = new SvAppletObject();
    xApplet->DoInitNew( pStor );

    xApplet->EnableSetModified( FALSE );
    xApplet->SetClass( rCode );
    xApplet->SetName( rName );
    xApplet->SetMayScript( bMayScript );
    xApplet->SetDocBase( INetURLObject::GetBaseURL() );

    String sCodeBase;
    if( rCodeBase.Len() )
    {
        INetURLObject aTmpURL;

        INetProtocol eProt = aTmpURL.CompareProtocolScheme( rCodeBase );
        if( eProt==INET_PROT_NOT_VALID &&
            rCodeBase.Search( ':' ) != STRING_NOTFOUND  )
        {
            // The codebase contains an unknown protocol rather than
            // a relative URL.
            sCodeBase = rCodeBase;
        }
        else
        {
            sCodeBase = INetURLObject::RelToAbs( rCodeBase );
        }
    }
    else
    {
        INetURLObject aTmpURL( INetURLObject::GetBaseURL() );
        sCodeBase = aTmpURL.GetPartBeforeLastName();
    }

    xApplet->SetCodeBase( sCodeBase );

    sAlt = rAlt;
}

#endif

void SwHTMLParser::InsertApplet()
{
#ifdef SOLAR_JAVA
    String aCodeBase, aCode, aName, aAlt, aId, aStyle, aClass;
    Size aSize( USHRT_MAX, USHRT_MAX );
    Size aSpace( 0, 0 );
    BOOL bPrcWidth = FALSE, bPrcHeight = FALSE, bMayScript = FALSE;
    SwVertOrient eVertOri = VERT_TOP;
    SwHoriOrient eHoriOri = HORI_NONE;

    // Eine neue Command-List anlegen
    if( pAppletImpl )
        delete pAppletImpl;
    pAppletImpl = new SwHTMLApplet_Impl( pDoc->GetAttrPool(),
                                         RES_FRMATR_BEGIN, RES_FRMATR_END-1 );

    const HTMLOptions *pOptions = GetOptions();
    for( USHORT i = pOptions->Count(); i; )
    {
        const HTMLOption *pOption = (*pOptions)[--i];
        switch( pOption->GetToken() )
        {
        case HTML_O_ID:
            aId = pOption->GetString();
            break;
        case HTML_O_STYLE:
            aStyle = pOption->GetString();
            break;
        case HTML_O_CLASS:
            aClass = pOption->GetString();
            break;
        case HTML_O_CODEBASE:
            aCodeBase = pOption->GetString();
            break;
        case HTML_O_CODE:
            aCode = pOption->GetString();
            break;
        case HTML_O_NAME:
            aName = pOption->GetString();
            break;
        case HTML_O_ALT:
            aAlt = pOption->GetString();
            break;
        case HTML_O_ALIGN:
            eVertOri = (SwVertOrient)pOption->GetEnum( aHTMLImgVAlignTable, eVertOri );
            eHoriOri = (SwHoriOrient)pOption->GetEnum( aHTMLImgHAlignTable, eHoriOri );
            break;
        case HTML_O_WIDTH:
            bPrcWidth = (pOption->GetString().Search('%') != STRING_NOTFOUND);
            aSize.Width() = (long)pOption->GetNumber();
            break;
        case HTML_O_HEIGHT:
            bPrcHeight = (pOption->GetString().Search('%') != STRING_NOTFOUND);
            aSize.Height() = (long)pOption->GetNumber();
            break;
        case HTML_O_HSPACE:
            aSpace.Width() = (long)pOption->GetNumber();
            break;
        case HTML_O_VSPACE:
            aSpace.Height() = (long)pOption->GetNumber();
            break;
        case HTML_O_MAYSCRIPT:
            bMayScript = TRUE;
            break;
        }

        // Es werden alle Parameter auch an das Applet weitergereicht
        pAppletImpl->AppendParam( pOption->GetTokenString(),
                                  pOption->GetString() );
    }

    if( !aCode.Len() )
    {
        delete pAppletImpl;
        pAppletImpl = 0;
        return;
    }

    pAppletImpl->CreateApplet( aCode, aName, bMayScript, aCodeBase, aAlt );

    SfxItemSet aItemSet( pDoc->GetAttrPool(), pCSS1Parser->GetWhichMap() );
    SvxCSS1PropertyInfo aPropInfo;
    if( HasStyleOptions( aStyle, aId, aClass ) )
        ParseStyleOptions( aStyle, aId, aClass, aItemSet, aPropInfo );

    SfxItemSet& rFrmSet = pAppletImpl->GetItemSet();
    if( !IsNewDoc() )
        Reader::ResetFrmFmtAttrs( rFrmSet );

    // den Anker und die Ausrichtung setzen
    SetAnchorAndAdjustment( eVertOri, eHoriOri, aItemSet, aPropInfo, rFrmSet );

    // und noch die Groesse des Rahmens
    Size aDfltSz( HTML_DFLT_APPLET_WIDTH, HTML_DFLT_APPLET_HEIGHT );
    SetFixSize( aSize, aDfltSz, bPrcWidth, bPrcHeight, aItemSet, aPropInfo,
                rFrmSet );
    SetSpace( aSpace, aItemSet, aPropInfo, rFrmSet );
#endif
}

void SwHTMLParser::EndApplet()
{
#ifdef SOLAR_JAVA
    if( !pAppletImpl )
        return;

    pAppletImpl->FinishApplet();

    // und in das Dok einfuegen
    SwFrmFmt* pFlyFmt = pDoc->Insert( *pPam, pAppletImpl->GetApplet(),
                                      &pAppletImpl->GetItemSet() );

    // den alternativen Namen setzen
    SwNoTxtNode *pNoTxtNd =
        pDoc->GetNodes()[ pFlyFmt->GetCntnt().GetCntntIdx()
                          ->GetIndex()+1 ]->GetNoTxtNode();
    pNoTxtNd->SetAlternateText( pAppletImpl->GetAltText() );

    // Ggf Frames anlegen und auto-geb. Rahmen registrieren
    RegisterFlyFrm( pFlyFmt );

    delete pAppletImpl;
    pAppletImpl = 0;
#endif
}

void SwHTMLParser::InsertParam()
{
#ifdef SOLAR_JAVA
    if( !pAppletImpl )
        return;

    String aName, aValue;

    const HTMLOptions *pOptions = GetOptions();
    for( USHORT i = pOptions->Count(); i; )
    {
        const HTMLOption *pOption = (*pOptions)[--i];
        switch( pOption->GetToken() )
        {
        case HTML_O_NAME:
            aName = pOption->GetString();
            break;
        case HTML_O_VALUE:
            aValue = pOption->GetString();
            break;
        }
    }

    if( !aName.Len() )
        return;

    pAppletImpl->AppendParam( aName, aValue );
#endif
}


/*  */

void SwHTMLParser::InsertFloatingFrame()
{
    String aAlt, aId, aStyle, aClass;
    Size aSize( USHRT_MAX, USHRT_MAX );
    Size aSpace( 0, 0 );
    BOOL bPrcWidth = FALSE, bPrcHeight = FALSE;
    SwVertOrient eVertOri = VERT_TOP;
    SwHoriOrient eHoriOri = HORI_NONE;

    const HTMLOptions *pOptions = GetOptions();

    // Erstmal die Optionen fr das Writer-Frame-Format holen
    USHORT nArrLen = pOptions->Count();
    for ( USHORT i=0; i<nArrLen; i++ )
    {
        const HTMLOption *pOption = (*pOptions)[i];
        switch( pOption->GetToken() )
        {
        case HTML_O_ID:
            aId = pOption->GetString();
            break;
        case HTML_O_STYLE:
            aStyle = pOption->GetString();
            break;
        case HTML_O_CLASS:
            aClass = pOption->GetString();
            break;
        case HTML_O_ALT:
            aAlt = pOption->GetString();
            break;
        case HTML_O_ALIGN:
            eVertOri = (SwVertOrient)pOption->GetEnum( aHTMLImgVAlignTable, eVertOri );
            eHoriOri = (SwHoriOrient)pOption->GetEnum( aHTMLImgHAlignTable, eHoriOri );
            break;
        case HTML_O_WIDTH:
            bPrcWidth = (pOption->GetString().Search('%') != STRING_NOTFOUND);
            aSize.Width() = (long)pOption->GetNumber();
            break;
        case HTML_O_HEIGHT:
            bPrcHeight = (pOption->GetString().Search('%') != STRING_NOTFOUND);
            aSize.Height() = (long)pOption->GetNumber();
            break;
        case HTML_O_HSPACE:
            aSpace.Width() = (long)pOption->GetNumber();
            break;
        case HTML_O_VSPACE:
            aSpace.Height() = (long)pOption->GetNumber();
            break;
        }
    }

    // und jetzt die fuer den SfxFrame
    SfxFrameDescriptor *pFrameDesc = new SfxFrameDescriptor( 0 );

    SfxFrameHTMLParser::ParseFrameOptions( pFrameDesc, pOptions );

    // den Floating-Frame anlegen
    SvStorageRef pStor = new SvStorage( aEmptyStr, STREAM_STD_READWRITE );
    SfxFrameObjectRef pFrame = new SfxFrameObject();
    pFrame->DoInitNew( pStor );

    pFrame->EnableSetModified( FALSE );
    pFrame->SetFrameDescriptor( pFrameDesc );
    pFrame->EnableSetModified( TRUE );

    SfxItemSet aItemSet( pDoc->GetAttrPool(), pCSS1Parser->GetWhichMap() );
    SvxCSS1PropertyInfo aPropInfo;
    if( HasStyleOptions( aStyle, aId, aClass ) )
        ParseStyleOptions( aStyle, aId, aClass, aItemSet, aPropInfo );

    // den Itemset holen
    SfxItemSet aFrmSet( pDoc->GetAttrPool(),
                        RES_FRMATR_BEGIN, RES_FRMATR_END-1 );
    if( !IsNewDoc() )
        Reader::ResetFrmFmtAttrs( aFrmSet );

    // den Anker und die Ausrichtung setzen
    SetAnchorAndAdjustment( eVertOri, eHoriOri, aItemSet, aPropInfo, aFrmSet );

    // und noch die Groesse des Rahmens
    Size aDfltSz( HTML_DFLT_APPLET_WIDTH, HTML_DFLT_APPLET_HEIGHT );
    SetFixSize( aSize, aDfltSz, bPrcWidth, bPrcHeight, aItemSet, aPropInfo,
                aFrmSet );
    SetSpace( aSpace, aItemSet, aPropInfo, aFrmSet );

    // und in das Dok einfuegen
    SwFrmFmt* pFlyFmt = pDoc->Insert( *pPam, pFrame, &aFrmSet );

    // den alternativen Namen setzen
    SwNoTxtNode *pNoTxtNd =
        pDoc->GetNodes()[ pFlyFmt->GetCntnt().GetCntntIdx()
                          ->GetIndex()+1 ]->GetNoTxtNode();
    pNoTxtNd->SetAlternateText( aAlt );

    // Ggf Frames anlegen und auto-geb. Rahmen registrieren
    RegisterFlyFrm( pFlyFmt );

    bInFloatingFrame = TRUE;
}

/*  */

#define HTML_OPTTYPE_IGNORE 0
#define HTML_OPTTYPE_TAG 1
#define HTML_OPTTYPE_PARAM 2

static USHORT GetOptionType( const String& rName, BOOL bApplet )
{
    USHORT nType = bApplet ? HTML_OPTTYPE_PARAM : HTML_OPTTYPE_TAG;

    switch( rName.GetChar(0) )
    {
    case 'A':
    case 'a':
        if( rName.EqualsIgnoreCaseAscii( sHTML_O_align ) ||
            rName.EqualsIgnoreCaseAscii( sHTML_O_alt ) )
            nType = HTML_OPTTYPE_IGNORE;
        else if( bApplet &&
                 (rName.EqualsIgnoreCaseAscii( sHTML_O_archive ) ||
                 rName.EqualsIgnoreCaseAscii( sHTML_O_archives )) )
            nType = HTML_OPTTYPE_TAG;
        break;
    case 'C':
    case 'c':
        if( rName.EqualsIgnoreCaseAscii( sHTML_O_class ) ||
            (bApplet && (rName.EqualsIgnoreCaseAscii( sHTML_O_code ) ||
                         rName.EqualsIgnoreCaseAscii( sHTML_O_codebase ))) )
            nType = HTML_OPTTYPE_IGNORE;
        break;
    case 'H':
    case 'h':
        if( rName.EqualsIgnoreCaseAscii( sHTML_O_height ) ||
            rName.EqualsIgnoreCaseAscii( sHTML_O_hspace ) ||
            (!bApplet && rName.EqualsIgnoreCaseAscii( sHTML_O_hidden )) )
            nType = HTML_OPTTYPE_IGNORE;
        break;
    case 'I':
    case 'i':
        if( rName.EqualsIgnoreCaseAscii( sHTML_O_id ) )
            nType = HTML_OPTTYPE_IGNORE;
        break;
    case 'M':
    case 'm':
        if( bApplet && rName.EqualsIgnoreCaseAscii( sHTML_O_mayscript ) )
            nType = HTML_OPTTYPE_IGNORE;
        break;
    case 'N':
    case 'n':
        if( rName.EqualsIgnoreCaseAscii( sHTML_O_name ) )
            nType = HTML_OPTTYPE_IGNORE;
        break;
    case 'O':
    case 'o':
        if( bApplet && rName.EqualsIgnoreCaseAscii( sHTML_O_object ) )
            nType = HTML_OPTTYPE_TAG;
        break;
    case 'S':
    case 's':
        if( rName.EqualsIgnoreCaseAscii( sHTML_O_style ) ||
            (!bApplet && rName.EqualsIgnoreCaseAscii( sHTML_O_src )) )
            nType = HTML_OPTTYPE_IGNORE;
        break;
    case 'T':
    case 't':
        if( !bApplet && rName.EqualsIgnoreCaseAscii( sHTML_O_type ) )
            nType = HTML_OPTTYPE_IGNORE;
        break;
    case 'V':
    case 'v':
        if( rName.EqualsIgnoreCaseAscii( sHTML_O_vspace ) )
            nType = HTML_OPTTYPE_IGNORE;
        break;
    case 'W':
    case 'w':
        if( rName.EqualsIgnoreCaseAscii( sHTML_O_width ) )
            nType = HTML_OPTTYPE_IGNORE;
        break;
    }

    return nType;
}

USHORT SwHTMLWriter::GuessOLENodeFrmType( const SwNode& rNode )
{
    SwOLEObj& rObj = ((SwOLENode*)rNode.GetOLENode())->GetOLEObj();

    SwHTMLFrmType eType = HTML_FRMTYPE_OLE;

    SvPlugInObjectRef pPlugin( rObj.GetOleRef() );
    if( pPlugin.Is() )
    {
        eType = HTML_FRMTYPE_PLUGIN;
    }
    else
    {
        SfxFrameObjectRef pFrame( rObj.GetOleRef() );
        if( pFrame.Is() )
        {
            eType = HTML_FRMTYPE_IFRAME;
        }
#ifdef SOLAR_JAVA
        else
        {
            SvAppletObjectRef pApplet( rObj.GetOleRef() );
            if( pApplet.Is() )
                eType = HTML_FRMTYPE_APPLET;
        }
#endif
    }

    return eType;
}

Writer& OutHTML_FrmFmtOLENode( Writer& rWrt, const SwFrmFmt& rFrmFmt,
                               BOOL bInCntnr )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;

    const SwFmtCntnt& rFlyCntnt = rFrmFmt.GetCntnt();
    ULONG nStt = rFlyCntnt.GetCntntIdx()->GetIndex()+1;
    SwOLENode *pOLENd = rHTMLWrt.pDoc->GetNodes()[ nStt ]->GetOLENode();

    ASSERT( pOLENd, "OLE-Node erwartet" );
    if( !pOLENd )
        return rWrt;

    SwOLEObj &rObj = pOLENd->GetOLEObj();
    SvPlugInObjectRef pPlugin( rObj.GetOleRef() );
#ifdef SOLAR_JAVA
    SvAppletObjectRef pApplet( rObj.GetOleRef() );
#endif
    SfxFrameObjectRef pFrame( rObj.GetOleRef() );
    BOOL bHiddenEmbed = FALSE;

    ASSERT( !pFrame.Is() || rHTMLWrt.IsHTMLMode(HTMLMODE_FLOAT_FRAME),
            "Floating-Frame wird exportiert, aber Modus ist nicht aktiviert" );

    if( !pPlugin.Is() &&
#ifdef SOLAR_JAVA
        !pApplet.Is() &&
#endif
        !pFrame.Is() )
    {
        ASSERT( pPlugin.Is(), "unbekanntes Inplace-Object" );
        return rWrt;
    }

    ByteString aEndTags;
    ULONG nFrmOpts;

    // wenn meoglich vor dem "Objekt" einen Zeilen-Umbruch ausgeben
    if( rHTMLWrt.bLFPossible )
        rHTMLWrt.OutNewLine( TRUE );

    if( rFrmFmt.GetName().Len() )
        rHTMLWrt.OutImplicitMark( rFrmFmt.GetName(),
                                  pMarkToOLE );

    ByteString sOut('<');
    if( pPlugin.Is() )
    {
        // erstmal das Plug-spezifische
        sOut += sHTML_embed;

        String aURL(
            INetURLObject::AbsToRel(pPlugin->GetURL()->GetMainURL(),
                                    INetURLObject::WAS_ENCODED,
                                    INetURLObject::DECODE_WITH_CHARSET) );

        if( aURL.Len() )
        {
            ((sOut += ' ') += sHTML_O_src) += "=\"";
            rWrt.Strm() << sOut.GetBuffer();
            HTMLOutFuncs::Out_String( rWrt.Strm(), aURL, rHTMLWrt.eDestEnc );
            sOut = '\"';
        }

        const String& aType = pPlugin->GetMimeType();
        if( aType.Len() )
        {
            ((sOut += ' ') += sHTML_O_type) += "=\"";
            rWrt.Strm() << sOut.GetBuffer();
            HTMLOutFuncs::Out_String( rWrt.Strm(), aType, rHTMLWrt.eDestEnc );
            sOut = '\"';
        }

        if( FLY_AT_CNTNT == rFrmFmt.GetAnchor().GetAnchorId() &&
            SURROUND_THROUGHT == rFrmFmt.GetSurround().GetSurround() )
        {
            // Das Plugin ist HIDDEN
            (sOut += ' ') += sHTML_O_hidden;
            nFrmOpts = HTML_FRMOPTS_HIDDEN_EMBED;
            bHiddenEmbed = TRUE;
        }
        else
        {
            nFrmOpts = bInCntnr ? HTML_FRMOPTS_EMBED_CNTNR
                                : HTML_FRMOPTS_EMBED;
        }
    }
#ifdef SOLAR_JAVA
    else if( pApplet.Is() )
    {
        // oder das Applet-Spezifische

        sOut += sHTML_applet;

        // CODEBASE
        const XubString& rURL = pApplet->GetCodeBase();
        if( rURL.Len() )
        {
#ifdef DEBUG
            String sTmp( INetURLObject::GetBaseURL() );
#endif
            String sCodeBase( INetURLObject::AbsToRel(rURL,
                                    INetURLObject::WAS_ENCODED,
                                    INetURLObject::DECODE_WITH_CHARSET) );
            if( sCodeBase.Len() )
            {
                ((sOut += ' ') += sHTML_O_codebase) += "=\"";
                rWrt.Strm() << sOut.GetBuffer();
                HTMLOutFuncs::Out_String( rWrt.Strm(), sCodeBase, rHTMLWrt.eDestEnc );
                sOut = '\"';
            }
        }

        // CODE
        ((sOut += ' ') += sHTML_O_code) += "=\"";
        rWrt.Strm() << sOut.GetBuffer();
        HTMLOutFuncs::Out_String( rWrt.Strm(), pApplet->GetClass(), rHTMLWrt.eDestEnc );
        sOut = '\"';

        // NAME
        const String &rName = pApplet->GetName();
        if( rName.Len() )
        {
            ((sOut += ' ') += sHTML_O_name) += "=\"";
            rWrt.Strm() << sOut.GetBuffer();
            HTMLOutFuncs::Out_String( rWrt.Strm(), rName, rHTMLWrt.eDestEnc );
            sOut = '\"';
        }

        if( pApplet->IsMayScript() )
            (sOut += ' ') += sHTML_O_mayscript;

        nFrmOpts = bInCntnr ? HTML_FRMOPTS_APPLET_CNTNR
                            : HTML_FRMOPTS_APPLET;
    }
#endif
    else
    {
        // oder das Flating-Frame spezifische

        sOut += sHTML_iframe;
        rWrt.Strm() << sOut.GetBuffer();

        SfxFrameHTMLWriter::Out_FrameDescriptor( rWrt.Strm(),
                                        pFrame->GetFrameDescriptor(),
                                        FALSE, 0, rHTMLWrt.eDestEnc  );
        sOut.Erase();

        nFrmOpts = bInCntnr ? HTML_FRMOPTS_IFRAME_CNTNR
                            : HTML_FRMOPTS_IFRAME;
    }

    rWrt.Strm() << sOut.GetBuffer();

    // ALT, WIDTH, HEIGHT, HSPACE, VSPACE, ALIGN
    if( rHTMLWrt.IsHTMLMode( HTMLMODE_ABS_POS_FLY ) && !bHiddenEmbed )
        nFrmOpts |= HTML_FRMOPTS_OLE_CSS1;
    rHTMLWrt.OutFrmFmtOptions( rFrmFmt, pOLENd->GetAlternateText(),
                               aEndTags, nFrmOpts );
    if( rHTMLWrt.IsHTMLMode( HTMLMODE_ABS_POS_FLY ) && !bHiddenEmbed )
        rHTMLWrt.OutCSS1_FrmFmtOptions( rFrmFmt, nFrmOpts );

#ifdef SOLAR_JAVA
    if( pApplet.Is() )
    {
        // fuer Applets die Parameter als eigene Tags ausgeben
        // und ein </APPLET> schreiben

        const SvCommandList& rCommands = pApplet->GetCommandList();
        SvULongs aParams;
        ULONG i = rCommands.Count();
        while( i > 0 )
        {
            const SvCommand& rCommand = rCommands[ --i ];
            const String& rName = rCommand.GetCommand();
            USHORT nType = GetOptionType( rName, TRUE );
            if( HTML_OPTTYPE_TAG == nType )
            {
                const String& rValue = rCommand.GetArgument();
                rWrt.Strm() << ' ';
                HTMLOutFuncs::Out_String( rWrt.Strm(), rName, rHTMLWrt.eDestEnc );
                rWrt.Strm() << "=\"";
                HTMLOutFuncs::Out_String( rWrt.Strm(), rValue, rHTMLWrt.eDestEnc ) << '\"';
            }
            else if( HTML_OPTTYPE_PARAM == nType )
            {
                aParams.Insert( i, aParams.Count() );
            }
        }

        rHTMLWrt.Strm() << '>';

        rHTMLWrt.IncIndentLevel(); // Inhalt von Applet einruecken

        USHORT ii = aParams.Count();
        while( ii > 0  )
        {
            const SvCommand& rCommand = rCommands[ aParams[--ii] ];
            const String& rName = rCommand.GetCommand();
            const String& rValue = rCommand.GetArgument();
            rHTMLWrt.OutNewLine();
            ((((sOut = '<') += sHTML_param) += ' ') += sHTML_O_name)
                += "=\"";
            rWrt.Strm() << sOut.GetBuffer();
            HTMLOutFuncs::Out_String( rWrt.Strm(), rName, rHTMLWrt.eDestEnc );
            ((sOut = "\" ") += sHTML_O_value) += "=\"";
            rWrt.Strm() << sOut.GetBuffer();
            HTMLOutFuncs::Out_String( rWrt.Strm(), rValue, rHTMLWrt.eDestEnc ) << "\">";
        }

        rHTMLWrt.DecIndentLevel(); // Inhalt von Applet einruecken
        if( rCommands.Count() )
            rHTMLWrt.OutNewLine();
        HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_applet, FALSE );
    }
    else
#endif
    if( pPlugin.Is() )
    {
        // fuer Plugins die Paramater als Optionen schreiben

        const SvCommandList& rCommands = pPlugin->GetCommandList();
        for( ULONG i=0; i<rCommands.Count(); i++ )
        {
            const SvCommand& rCommand = rCommands[ i ];
            const String& rName = rCommand.GetCommand();

            if( GetOptionType( rName, FALSE ) == HTML_OPTTYPE_TAG )
            {
                const String& rValue = rCommand.GetArgument();
                rWrt.Strm() << ' ';
                HTMLOutFuncs::Out_String( rWrt.Strm(), rName, rHTMLWrt.eDestEnc );
                rWrt.Strm() << "=\"";
                HTMLOutFuncs::Out_String( rWrt.Strm(), rValue, rHTMLWrt.eDestEnc ) << '\"';
            }
        }
        rHTMLWrt.Strm() << '>';
    }
    else
    {
        // und fuer Floating-Frames einfach noch ein </IFRAME>
        // ausgeben

        rHTMLWrt.Strm() << '>';
        HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_iframe, FALSE );
    }

    if( aEndTags.Len() )
        rWrt.Strm() << aEndTags.GetBuffer();

    return rWrt;
}

Writer& OutHTML_FrmFmtOLENodeGrf( Writer& rWrt, const SwFrmFmt& rFrmFmt,
                                  BOOL bInCntnr )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;

    const SwFmtCntnt& rFlyCntnt = rFrmFmt.GetCntnt();
    ULONG nStt = rFlyCntnt.GetCntntIdx()->GetIndex()+1;
    SwOLENode *pOLENd = rHTMLWrt.pDoc->GetNodes()[ nStt ]->GetOLENode();

    ASSERT( pOLENd, "OLE-Node erwartet" );
    if( !pOLENd )
        return rWrt;

    // Inhalt des Nodes als Grafik speichern
    SvInPlaceObjectRef xRef = pOLENd->GetOLEObj().GetOleRef();;
    GDIMetaFile* pPic = NULL;
    SvData aData( FORMAT_GDIMETAFILE );
    if( xRef->GetData( &aData ) )
        aData.GetData( &pPic, TRANSFER_REFERENCE );
    if( pPic )
    {
        Graphic aGrf( *pPic );
        String aGrfNm;
        const String* pTempFileName = rHTMLWrt.GetOrigFileName();
        if(pTempFileName)
            aGrfNm = *pTempFileName;

        USHORT nErr = XOutBitmap::WriteGraphic( aGrf, aGrfNm,
                                    String::CreateFromAscii("JPG"),
                                    XOUTBMP_USE_GIF_IF_POSSIBLE );
        if( nErr )              // fehlerhaft, da ist nichts auszugeben
        {
            rHTMLWrt.nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE;
            return rWrt;
        }
        aGrfNm = URIHelper::SmartRelToAbs( aGrfNm );
        if( rHTMLWrt.HasCId() )
            rHTMLWrt.MakeCIdURL( aGrfNm );
        ULONG nFlags = bInCntnr ? HTML_FRMOPTS_GENIMG_CNTNR
                                  : HTML_FRMOPTS_GENIMG;
        OutHTML_Image( rWrt, rFrmFmt, aGrfNm,
                       pOLENd->GetAlternateText(), pOLENd->GetTwipSize(),
                       nFlags, pMarkToOLE );
    }

    return rWrt;
}

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/html/htmlplug.cxx,v 1.1.1.1 2000-09-18 17:14:55 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.95  2000/09/18 16:04:45  willem.vandorp
      OpenOffice header added.

      Revision 1.94  2000/08/18 13:03:22  jp
      don't export escaped URLs

      Revision 1.93  2000/06/26 12:55:06  os
      INetURLObject::SmartRelToAbs removed

      Revision 1.92  2000/06/26 09:52:22  jp
      must change: GetAppWindow->GetDefaultDevice

      Revision 1.91  2000/05/15 10:06:56  os
      Chg: GetOrigFileName()

      Revision 1.90  2000/04/28 14:29:11  mib
      unicode

      Revision 1.89  2000/04/10 12:20:56  mib
      unicode

      Revision 1.88  2000/02/11 14:37:20  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.87  1999/09/21 09:49:53  mib
      multiple text encodings

      Revision 1.86  1999/09/17 12:14:02  mib
      support of multiple and non system text encodings

      Revision 1.85  1999/07/12 07:01:58  MIB
      #34644#: Applet\'s codebase is set to document base if not specified


*************************************************************************/

diff --git a/sw/source/filter/html/htmlsect.cxx b/sw/source/filter/html/htmlsect.cxx
new file mode 100644
index 0000000..d390a26
--- /dev/null
+++ b/sw/source/filter/html/htmlsect.cxx
@@ -0,0 +1,1063 @@
/*************************************************************************
 *
 *  $RCSfile: htmlsect.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:55 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/


#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#include "hintids.hxx"

#ifndef _APP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _WRKWIN_HXX //autogen
#include <vcl/wrkwin.hxx>
#endif
#ifndef _SVX_ADJITEM_HXX //autogen
#include <svx/adjitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _SVX_BRKITEM_HXX //autogen
#include <svx/brkitem.hxx>
#endif
#ifndef _HTMLTOKN_H
#include <svtools/htmltokn.h>
#endif
#ifndef _HTMLKYWD_H
#include <svtools/htmlkywd.hxx>
#endif


#ifndef _FMTORNT_HXX //autogen
#include <fmtornt.hxx>
#endif
#ifndef _FMTHDFT_HXX //autogen
#include <fmthdft.hxx>
#endif
#ifndef _FMTCNTNT_HXX //autogen
#include <fmtcntnt.hxx>
#endif
#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _FMTCLDS_HXX //autogen
#include <fmtclds.hxx>
#endif
#ifndef _FMTANCHR_HXX //autogen
#include <fmtanchr.hxx>
#endif
#ifndef _FMTPDSC_HXX //autogen
#include <fmtpdsc.hxx>
#endif
#ifndef _FMTSRND_HXX //autogen
#include <fmtsrnd.hxx>
#endif
#ifndef _FMTFLCNT_HXX //autogen
#include <fmtflcnt.hxx>
#endif
#ifndef _FRMATR_HXX
#include "frmatr.hxx"
#endif
#include "doc.hxx"
#include "pam.hxx"
#include "ndtxt.hxx"
#include "shellio.hxx"
#include "section.hxx"
#include "poolfmt.hxx"
#include "pagedesc.hxx"
#include "swtable.hxx"
#include "viewsh.hxx"
#include "swcss1.hxx"
#include "swhtml.hxx"

#define CONTEXT_FLAGS_MULTICOL (HTML_CNTXT_STRIP_PARA |  \
                                HTML_CNTXT_KEEP_NUMRULE | \
                                HTML_CNTXT_KEEP_ATTRS)
//#define CONTEXT_FLAGS_HDRFTR (HTML_CNTXT_STRIP_PARA|HTML_CNTXT_PROTECT_STACK)
#define CONTEXT_FLAGS_HDRFTR (CONTEXT_FLAGS_MULTICOL)
#define CONTEXT_FLAGS_FTN (CONTEXT_FLAGS_MULTICOL)

/*  */

void SwHTMLParser::NewDivision( int nToken )
{
    String aId, aHRef, aStyle, aClass;
    SvxAdjust eAdjust = HTML_CENTER_ON==nToken ? SVX_ADJUST_CENTER
                                               : SVX_ADJUST_END;

    sal_Bool bHeader=sal_False, bFooter=sal_False;
    const HTMLOptions *pOptions = GetOptions();
    for( sal_uInt16 i = pOptions->Count(); i; )
    {
        const HTMLOption *pOption = (*pOptions)[--i];
        switch( pOption->GetToken() )
        {
        case HTML_O_ID:
            aId = pOption->GetString();
            break;
        case HTML_O_ALIGN:
            if( HTML_DIVISION_ON==nToken )
                eAdjust = (SvxAdjust)pOption->GetEnum( aHTMLPAlignTable,
                                                        eAdjust );
            break;
        case HTML_O_STYLE:
            aStyle = pOption->GetString();
            break;
        case HTML_O_CLASS:
            aClass = pOption->GetString();
            break;
        case HTML_O_HREF:
            aHRef =  INetURLObject::RelToAbs( pOption->GetString() );
            break;
        case HTML_O_TYPE:
            {
                const String& rType = pOption->GetString();
                if( rType.EqualsIgnoreCaseAscii( "HEADER" ) )
                    bHeader = sal_True;
                else if( rType.EqualsIgnoreCaseAscii( "FOOTER" ) )
                    bFooter = sal_True;
            }
        }
    }

    sal_Bool bAppended = sal_False;
    if( pPam->GetPoint()->nContent.GetIndex() )
    {
        AppendTxtNode( bHeader||bFooter||aId.Len()||aHRef.Len() ? AM_NORMAL
                                                                : AM_NOSPACE );
        bAppended = sal_True;
    }

    _HTMLAttrContext *pCntxt = new _HTMLAttrContext( nToken );

    sal_Bool bStyleParsed = sal_False, bPositioned = sal_False;
    SfxItemSet aItemSet( pDoc->GetAttrPool(), pCSS1Parser->GetWhichMap() );
    SvxCSS1PropertyInfo aPropInfo;
    if( HasStyleOptions( aStyle, aId, aClass ) )
    {
        bStyleParsed = ParseStyleOptions( aStyle, aId, aClass,
                                          aItemSet, aPropInfo );
        if( bStyleParsed )
        {
            bPositioned = HTML_DIVISION_ON == nToken && aClass.Len() &&
                          CreateContainer( aClass, aItemSet, aPropInfo,
                                           pCntxt );
            if( !bPositioned )
                bPositioned = DoPositioning( aItemSet, aPropInfo, pCntxt );
        }
    }

    if( !bPositioned && (bHeader || bFooter) && IsNewDoc() )
    {
        SwPageDesc *pPageDesc = pCSS1Parser->GetMasterPageDesc();
        SwFrmFmt& rPageFmt = pPageDesc->GetMaster();

        SwFrmFmt *pHdFtFmt;
        sal_Bool bNew = sal_False;
        sal_uInt16 nFlags = CONTEXT_FLAGS_HDRFTR;
        if( bHeader )
        {
            pHdFtFmt = (SwFrmFmt*)rPageFmt.GetHeader().GetHeaderFmt();
            if( !pHdFtFmt )
            {
                // noch keine Header, dann erzeuge einen.
                rPageFmt.SetAttr( SwFmtHeader( sal_True ));
                pHdFtFmt = (SwFrmFmt*)rPageFmt.GetHeader().GetHeaderFmt();
                bNew = sal_True;
            }
            nFlags |= HTML_CNTXT_HEADER_DIST;
        }
        else
        {
            pHdFtFmt = (SwFrmFmt*)rPageFmt.GetFooter().GetFooterFmt();
            if( !pHdFtFmt )
            {
                // noch keine Footer, dann erzeuge einen.
                rPageFmt.SetAttr( SwFmtFooter( sal_True ));
                pHdFtFmt = (SwFrmFmt*)rPageFmt.GetFooter().GetFooterFmt();
                bNew = sal_True;
            }
            nFlags |= HTML_CNTXT_FOOTER_DIST;
        }

        const SwFmtCntnt& rFlyCntnt = pHdFtFmt->GetCntnt();
        const SwNodeIndex& rCntntStIdx = *rFlyCntnt.GetCntntIdx();
        SwCntntNode *pCNd;

        if( bNew )
        {
            pCNd = pDoc->GetNodes()[rCntntStIdx.GetIndex()+1]
                       ->GetCntntNode();
        }
        else
        {
            // Einen neuen Node zu Beginn der Section anlegen
            SwNodeIndex aSttIdx( rCntntStIdx, 1 );
            pCNd = pDoc->GetNodes().MakeTxtNode( aSttIdx,
                            pCSS1Parser->GetTxtCollFromPool(RES_POOLCOLL_TEXT));

            // Den bisherigen Inhalt der Section loeschen
            SwPaM aDelPam( aSttIdx );
            aDelPam.SetMark();

            const SwStartNode *pStNd =
                (const SwStartNode *)pDoc->GetNodes()[rCntntStIdx];
            aDelPam.GetPoint()->nNode = pStNd->EndOfSectionIndex() - 1;

            pDoc->DelFullPara( aDelPam );

            // Die Seitenvorlage aktualisieren
            for( sal_uInt16 i=0; i < pDoc->GetPageDescCnt(); i++ )
            {
                if( RES_POOLPAGE_HTML==pDoc->GetPageDesc(i).GetPoolFmtId() )
                {
                    pDoc->ChgPageDesc( i, *pPageDesc );
                    break;
                }
            }
        }

        // Kopf- bzw. Fusszeile im Browse-Mode aktivieren
        ViewShell* pVSh = 0;
        pDoc->GetEditShell( &pVSh );
        if( pVSh )
        {
            if( bHeader )
                pVSh->SetHeadInBrowse();
            else
                pVSh->SetFootInBrowse();
        }
        else
        {
            if( bHeader )
                pDoc->SetHeadInBrowse();
            else
                pDoc->SetFootInBrowse();
        }

        SwPosition aNewPos( SwNodeIndex( rCntntStIdx, 1 ), SwIndex( pCNd, 0 ) );
        SaveDocContext( pCntxt, nFlags, &aNewPos );
    }
    else if( !bPositioned && aId.Len() > 9 &&
             ('s' == aId.GetChar(0) || 'S' == aId.GetChar(0) ) &&
             ('d' == aId.GetChar(1) || 'D' == aId.GetChar(1) ) )
    {
        sal_Bool bEndNote = sal_False, bFootNote = sal_False;
        if( aId.CompareIgnoreCaseToAscii( sHTML_sdendnote, 9 ) == COMPARE_EQUAL )
            bEndNote = sal_True;
        else if( aId.CompareIgnoreCaseToAscii( sHTML_sdfootnote, 10 ) == COMPARE_EQUAL )
            bFootNote = sal_True;
        if( bFootNote || bEndNote )
        {
            SwNodeIndex *pSttNdIdx = GetFootEndNoteSection( aId );
            if( pSttNdIdx )
            {
                SwCntntNode *pCNd =
                    pDoc->GetNodes()[pSttNdIdx->GetIndex()+1]->GetCntntNode();
                SwNodeIndex aTmpSwNodeIndex = SwNodeIndex(*pCNd);
                SwPosition aNewPos( aTmpSwNodeIndex, SwIndex( pCNd, 0 ) );
                SaveDocContext( pCntxt, CONTEXT_FLAGS_FTN, &aNewPos );
                aId = aPropInfo.aId = aEmptyStr;
            }
        }
    }

    // Bereiche fuegen wir in Rahmen nur dann ein, wenn der Bereich gelinkt ist.
    if( (aId.Len() && !bPositioned) || aHRef.Len()  )
    {
        // Bereich einfuegen (muss vor dem Setzten von Attributen erfolgen,
        // weil die Section vor der PaM-Position eingefuegt.

        // wenn wir im ersten Node einer Section stehen, wir die neue
        // Section nicht in der aktuellen, sondern vor der aktuellen
        // Section eingefuegt. Deshalb muessen wir dann einen Node
        // einfuegen. UND IN LOESCHEN!!!
        if( !bAppended )
        {
            SwNodeIndex aPrvNdIdx( pPam->GetPoint()->nNode, -1 );
            if( (pDoc->GetNodes()[aPrvNdIdx])->IsSectionNode() )
            {
                AppendTxtNode();
                bAppended = sal_True;
            }
        }
        _HTMLAttrs *pPostIts = bAppended ? 0 : new _HTMLAttrs;
        SetAttr( sal_True, sal_True, pPostIts );

        // Namen der Section eindeutig machen
        String aName( pDoc->GetUniqueSectionName( aId.Len() ? &aId : 0 ) );

        SwSection aSection( aHRef.Len() ? FILE_LINK_SECTION
                                        : CONTENT_SECTION, aName );
        if( aHRef.Len() )
        {
            aSection.SetLinkFileName( aHRef );
            aSection.SetProtect();
        }

        SfxItemSet aFrmItemSet( pDoc->GetAttrPool(),
                                RES_FRMATR_BEGIN, RES_FRMATR_END-1 );
        if( !IsNewDoc() )
            Reader::ResetFrmFmtAttrs(aFrmItemSet );

        const SfxPoolItem *pItem;
        if( SFX_ITEM_SET == aItemSet.GetItemState( RES_BACKGROUND, sal_False,
                                                   &pItem ) )
        {
            aFrmItemSet.Put( *pItem );
            aItemSet.ClearItem( RES_BACKGROUND );
        }

        pDoc->Insert( *pPam, aSection, &aFrmItemSet, sal_False );

        // ggfs. einen Bereich anspringen
        if( JUMPTO_REGION == eJumpTo && aName == sJmpMark )
        {
            bChkJumpMark = sal_True;
            eJumpTo = JUMPTO_NONE;
        }

        SwTxtNode* pOldTxtNd =
            bAppended ? 0 : pDoc->GetNodes()[pPam->GetPoint()->nNode]
                                ->GetTxtNode();

        pPam->Move( fnMoveBackward );

        // PageDesc- und SwFmtBreak Attribute vom aktuellen Node in den
        // (ersten) Node des Bereich verschieben.
        if( pOldTxtNd )
            MovePageDescAttrs( pOldTxtNd, pPam->GetPoint()->nNode.GetIndex(),
                               sal_True  );

        if( pPostIts )
        {
            // noch vorhandene PostIts in den ersten Absatz
            // der Tabelle setzen
            InsertAttrs( *pPostIts );
            delete pPostIts;
            pPostIts = 0;
        }

        pCntxt->SetSpansSection( sal_True );

        // keine ::com::sun::star::text::Bookmarks mit dem gleichen Namen wie Bereiche einfuegen
        if( aPropInfo.aId.Len() && aPropInfo.aId==aName )
            aPropInfo.aId.Erase();
    }
    else
    {
        pCntxt->SetAppendMode( AM_NOSPACE );
    }

    if( SVX_ADJUST_END != eAdjust )
    {
        InsertAttr( &aAttrTab.pAdjust, SvxAdjustItem(eAdjust), pCntxt );
    }

    // Style parsen
    if( bStyleParsed )
        InsertAttrs( aItemSet, aPropInfo, pCntxt, sal_True );

    PushContext( pCntxt );
}

void SwHTMLParser::EndDivision( int nToken )
{
    // Stack-Eintrag zu dem Token suchen (weil wir noch den Div-Stack
    // haben unterscheiden wir erst einmal nicht zwischen DIV und CENTER
    _HTMLAttrContext *pCntxt = 0;
    sal_uInt16 nPos = aContexts.Count();
    while( !pCntxt && nPos>nContextStMin )
    {
        switch( aContexts[--nPos]->GetToken() )
        {
        case HTML_CENTER_ON:
        case HTML_DIVISION_ON:
            pCntxt = aContexts[nPos];
            aContexts.Remove( nPos, 1 );
            break;
        }
    }

    if( pCntxt )
    {
        // Attribute beenden
        EndContext( pCntxt );
        SetAttr();  // Absatz-Atts wegen JavaScript moeglichst schnell setzen

        delete pCntxt;
    }
}

void SwHTMLParser::FixHeaderFooterDistance( sal_Bool bHeader,
                                            const SwPosition *pOldPos )
{
    SwPageDesc *pPageDesc = pCSS1Parser->GetMasterPageDesc();
    SwFrmFmt& rPageFmt = pPageDesc->GetMaster();

    SwFrmFmt *pHdFtFmt =
        bHeader ? (SwFrmFmt*)rPageFmt.GetHeader().GetHeaderFmt()
                : (SwFrmFmt*)rPageFmt.GetFooter().GetFooterFmt();
    ASSERT( pHdFtFmt, "Doch keine Kopf- oder Fusszeile" );

    const SwFmtCntnt& rFlyCntnt = pHdFtFmt->GetCntnt();
    const SwNodeIndex& rCntntStIdx = *rFlyCntnt.GetCntntIdx();

    sal_uInt32 nPrvNxtIdx;
    if( bHeader )
    {
        nPrvNxtIdx = pDoc->GetNodes()[rCntntStIdx]->EndOfSectionIndex()-1;
    }
    else
    {
        nPrvNxtIdx = pOldPos->nNode.GetIndex() - 1;
    }

    sal_uInt16 nSpace = 0;
    SwTxtNode *pTxtNode = pDoc->GetNodes()[nPrvNxtIdx]->GetTxtNode();
    if( pTxtNode )
    {
        const SvxULSpaceItem& rULSpace =
            ((const SvxULSpaceItem&)pTxtNode
                ->SwCntntNode::GetAttr( RES_UL_SPACE ));

        // Der untere Absatz-Abstand wird zum Abstand zur
        // Kopf- oder Fusszeile
        nSpace = rULSpace.GetLower();

        // und anschliessend auf einen vernuenftigen Wert
        // gesetzt
        const SvxULSpaceItem& rCollULSpace =
            pTxtNode->GetAnyFmtColl().GetULSpace();
        if( rCollULSpace.GetUpper() == rULSpace.GetUpper() )
            pTxtNode->ResetAttr( RES_UL_SPACE );
        else
            pTxtNode->SwCntntNode::SetAttr(
                SvxULSpaceItem( rULSpace.GetUpper(),
                                rCollULSpace.GetLower() ) );
    }

    if( bHeader )
    {
        nPrvNxtIdx = pOldPos->nNode.GetIndex();
    }
    else
    {
        nPrvNxtIdx = rCntntStIdx.GetIndex() + 1;
    }

    pTxtNode = pDoc->GetNodes()[nPrvNxtIdx]
                    ->GetTxtNode();
    if( pTxtNode )
    {
        const SvxULSpaceItem& rULSpace =
            ((const SvxULSpaceItem&)pTxtNode
                ->SwCntntNode::GetAttr( RES_UL_SPACE ));

        // Der obere Absatz-Abstand wird zum Abstand zur
        // Kopf- oder Fusszeile, wenn er groesser ist als
        // der untere vom Absatz davor
        if( rULSpace.GetUpper() > nSpace )
            nSpace = rULSpace.GetUpper();

        // und anschliessend auf einen vernuenftigen Wert gesetzt
        const SvxULSpaceItem& rCollULSpace =
            pTxtNode->GetAnyFmtColl().GetULSpace();
        if( rCollULSpace.GetLower() == rULSpace.GetLower() )
            pTxtNode->ResetAttr( RES_UL_SPACE );
        else
            pTxtNode->SwCntntNode::SetAttr(
                SvxULSpaceItem( rCollULSpace.GetUpper(),
                                rULSpace.GetLower() ) );
    }

    SvxULSpaceItem aULSpace;
    if( bHeader )
        aULSpace.SetLower( nSpace );
    else
        aULSpace.SetUpper( nSpace );

    pHdFtFmt->SetAttr( aULSpace );
}

sal_Bool SwHTMLParser::EndSection( sal_Bool bLFStripped )
{
    SwEndNode *pEndNd = pDoc->GetNodes()[pPam->GetPoint()->nNode.GetIndex()+1]
                            ->GetEndNode();
    if( pEndNd && pEndNd->FindStartNode()->IsSectionNode() )
    {
        // den Bereich beenden
        if( !bLFStripped )
            StripTrailingPara();
        pPam->Move( fnMoveForward );
        return sal_True;
    }

    ASSERT( !this, "Falsche PaM Position Beenden eines Bereichs" );

    return sal_False;
}

sal_Bool SwHTMLParser::EndSections( sal_Bool bLFStripped )
{
    sal_Bool bSectionClosed = sal_False;
    sal_uInt16 nPos = aContexts.Count();
    while( nPos>nContextStMin )
    {
        _HTMLAttrContext *pCntxt = aContexts[--nPos];
        if( pCntxt->GetSpansSection() && EndSection( bLFStripped ) )
        {
            bSectionClosed = sal_True;
            pCntxt->SetSpansSection( sal_False );
            bLFStripped = sal_False;
        }
    }

    return bSectionClosed;
}

/*  */

void SwHTMLParser::NewMultiCol()
{
    String aId, aStyle, aClass;
    long nWidth = 100;
    sal_uInt16 nCols = 0, nGutter = 10;
    sal_Bool bPrcWidth = sal_True;

    const HTMLOptions *pOptions = GetOptions();
    for( sal_uInt16 i = pOptions->Count(); i; )
    {
        const HTMLOption *pOption = (*pOptions)[--i];
        switch( pOption->GetToken() )
        {
        case HTML_O_ID:
            aId = pOption->GetString();
            break;
        case HTML_O_STYLE:
            aStyle = pOption->GetString();
            break;
        case HTML_O_CLASS:
            aClass = pOption->GetString();
            break;
        case HTML_O_COLS:
            nCols = (sal_uInt16)pOption->GetNumber();
            break;
        case HTML_O_WIDTH:
            nWidth = pOption->GetNumber();
            bPrcWidth = (pOption->GetString().Search('%') != STRING_NOTFOUND);
            if( bPrcWidth && nWidth>100 )
                nWidth = 100;
            break;
        case HTML_O_GUTTER:
            nGutter = (sal_uInt16)pOption->GetNumber();
            break;

        }
    }

    _HTMLAttrContext *pCntxt = new _HTMLAttrContext( HTML_MULTICOL_ON );

    //.is the multicol elememt contained in a container? That may be the
    // case for 5.0 documents.
    sal_Bool bInCntnr = sal_False;
    i = aContexts.Count();
    while( !bInCntnr && i > nContextStMin )
        bInCntnr = 0 != aContexts[--i]->GetFrmItemSet();

    // Parse style sheets, but don't position anything by now.
    sal_Bool bStyleParsed = sal_False;
    SfxItemSet aItemSet( pDoc->GetAttrPool(), pCSS1Parser->GetWhichMap() );
    SvxCSS1PropertyInfo aPropInfo;
    if( HasStyleOptions( aStyle, aId, aClass ) )
        bStyleParsed = ParseStyleOptions( aStyle, aId, aClass,
                                          aItemSet, aPropInfo );

    // Calculate width.
    sal_uInt8 nPrcWidth = bPrcWidth ? (sal_uInt8)nWidth : 0;
    sal_uInt16 nTwipWidth = 0;
    if( !bPrcWidth && nWidth && Application::GetDefaultDevice() )
    {
        nTwipWidth = (sal_uInt16)Application::GetDefaultDevice()
                             ->PixelToLogic( Size(nWidth, 0),
                                             MapMode(MAP_TWIP) ).Width();
    }

    if( !nPrcWidth && nTwipWidth < MINFLY )
        nTwipWidth = MINFLY;

    // Do positioning.
    sal_Bool bPositioned = sal_False;
    if( bInCntnr || pCSS1Parser->MayBePositioned( aPropInfo, sal_True ) )
    {
        SfxItemSet aFrmItemSet( pDoc->GetAttrPool(),
                                RES_FRMATR_BEGIN, RES_FRMATR_END-1 );
        if( !IsNewDoc() )
            Reader::ResetFrmFmtAttrs(aFrmItemSet );

        SetAnchorAndAdjustment( VERT_NONE, HORI_NONE, aItemSet, aPropInfo,
                                aFrmItemSet );

        // The width is either the WIDTH attribute's value or contained
        // in some style option.
        SetVarSize( aItemSet, aPropInfo, aFrmItemSet, nTwipWidth, nPrcWidth );

        SetSpace( Size(0,0), aItemSet, aPropInfo, aFrmItemSet );

        // Set some other frame attributes. If the background is set, its
        // it will be cleared here. That for, it won't be set at the section,
        // too.
        SetFrmFmtAttrs( aItemSet, aPropInfo,
                        HTML_FF_BOX|HTML_FF_BACKGROUND|HTML_FF_PADDING,
                        aFrmItemSet );

        // Insert fly frame. If the are columns, the fly frame's name is not
        // the sections name but a generated one.
        String aFlyName( aEmptyStr );
        if( nCols < 2 )
        {
            aFlyName = aId;
            aPropInfo.aId.Erase();
        }

        InsertFlyFrame( aFrmItemSet, pCntxt, aFlyName, CONTEXT_FLAGS_ABSPOS );

        pCntxt->SetPopStack( sal_True );
        bPositioned = sal_True;
    }

    sal_Bool bAppended = sal_False;
    if( !bPositioned )
    {
        if( pPam->GetPoint()->nContent.GetIndex() )
        {
            AppendTxtNode( AM_SPACE );
            bAppended = sal_True;
        }
        else
        {
            AddParSpace();
        }
    }

    // If there are less then 2 columns, no section is inserted.
    if( nCols >= 2 )
    {
        if( !bAppended )
        {
            // If the pam is at the start of a section, a additional text
            // node must be inserted. Otherwise, the new section will be
            // inserted in front of the old one.
            SwNodeIndex aPrvNdIdx( pPam->GetPoint()->nNode, -1 );
            if( (pDoc->GetNodes()[aPrvNdIdx])->IsSectionNode() )
            {
                AppendTxtNode();
                bAppended = sal_True;
            }
        }
        _HTMLAttrs *pPostIts = bAppended ? 0 : new _HTMLAttrs;
        SetAttr( sal_True, sal_True, pPostIts );

        // Make section name unique.
        String aName( pDoc->GetUniqueSectionName( aId.Len() ? &aId : 0 ) );
        SwSection aSection( CONTENT_SECTION, aName );

        SfxItemSet aFrmItemSet( pDoc->GetAttrPool(),
                                RES_FRMATR_BEGIN, RES_FRMATR_END-1 );
        if( !IsNewDoc() )
            Reader::ResetFrmFmtAttrs(aFrmItemSet );

        if( nGutter && Application::GetDefaultDevice() )
        {
            nGutter = (sal_uInt16)Application::GetDefaultDevice()
                             ->PixelToLogic( Size(nGutter, 0),
                                             MapMode(MAP_TWIP) ).Width();
        }

        SwFmtCol aFmtCol;
#ifndef WIDTH_SUPPORTED_BY_SECTIONS
        nPrcWidth = 100;
#endif

        aFmtCol.Init( nCols, nGutter, nPrcWidth ? USHRT_MAX : nTwipWidth );
        aFrmItemSet.Put( aFmtCol );

        const SfxPoolItem *pItem;
        if( SFX_ITEM_SET == aItemSet.GetItemState( RES_BACKGROUND, sal_False,
                                                   &pItem ) )
        {
            aFrmItemSet.Put( *pItem );
            aItemSet.ClearItem( RES_BACKGROUND );
        }
        pDoc->Insert( *pPam, aSection, &aFrmItemSet, sal_False );

        // Jump to section, if this is requested.
        if( JUMPTO_REGION == eJumpTo && aName == sJmpMark )
        {
            bChkJumpMark = sal_True;
            eJumpTo = JUMPTO_NONE;
        }

        SwTxtNode* pOldTxtNd =
            bAppended ? 0 : pDoc->GetNodes()[pPam->GetPoint()->nNode]
                                ->GetTxtNode();

        pPam->Move( fnMoveBackward );

        // Move PageDesc and SwFmtBreak attributes of the current node
        // to the section's first node.
        if( pOldTxtNd )
            MovePageDescAttrs( pOldTxtNd, pPam->GetPoint()->nNode.GetIndex(),
                               sal_True  );

        if( pPostIts )
        {
            // Move pending PostIts into the section.
            InsertAttrs( *pPostIts );
            delete pPostIts;
            pPostIts = 0;
        }

        pCntxt->SetSpansSection( sal_True );

        // Insert a bookmark if its name differs from the section's name only.
        if( aPropInfo.aId.Len() && aPropInfo.aId==aName )
            aPropInfo.aId.Erase();
    }

    // Additional attributes must be set as hard ones.
    if( bStyleParsed )
        InsertAttrs( aItemSet, aPropInfo, pCntxt, sal_True );

    PushContext( pCntxt );
}

/*  */

void SwHTMLParser::InsertFlyFrame( const SfxItemSet& rItemSet,
                                   _HTMLAttrContext *pCntxt,
                                   const String& rName,
                                   sal_uInt16 nFlags )
{
    RndStdIds eAnchorId =
        ((const SwFmtAnchor&)rItemSet.Get( RES_ANCHOR )).GetAnchorId();

    // Den Rahmen anlegen
    SwFlyFrmFmt* pFlyFmt = pDoc->MakeFlySection( eAnchorId, pPam->GetPoint(),
                                                    &rItemSet );
    // Ggf. den Namen setzen
    if( rName.Len() )
        pFlyFmt->SetName( rName );

    RegisterFlyFrm( pFlyFmt );

    const SwFmtCntnt& rFlyCntnt = pFlyFmt->GetCntnt();
    const SwNodeIndex& rFlyCntIdx = *rFlyCntnt.GetCntntIdx();
    SwCntntNode *pCNd = pDoc->GetNodes()[rFlyCntIdx.GetIndex()+1]
                            ->GetCntntNode();

    SwPosition aNewPos( SwNodeIndex( rFlyCntIdx, 1 ), SwIndex( pCNd, 0 ) );
    SaveDocContext( pCntxt, nFlags, &aNewPos );
}


/*  */

void SwHTMLParser::MovePageDescAttrs( SwNode *pSrcNd,
                                      sal_uInt32 nDestIdx,
                                      sal_Bool bFmtBreak )
{
    SwCntntNode* pDestCntntNd =
        pDoc->GetNodes()[nDestIdx]->GetCntntNode();

    ASSERT( pDestCntntNd, "Wieso ist das Ziel kein Content-Node?" );

    if( pSrcNd->IsCntntNode() )
    {
        SwCntntNode* pSrcCntntNd = pSrcNd->GetCntntNode();

        const SfxPoolItem* pItem;
        if( SFX_ITEM_SET == pSrcCntntNd->GetSwAttrSet()
                .GetItemState( RES_PAGEDESC, sal_False, &pItem ) &&
            ((SwFmtPageDesc *)pItem)->GetPageDesc() )
        {
            pDestCntntNd->SetAttr( *pItem );
            pSrcCntntNd->ResetAttr( RES_PAGEDESC );
        }
        if( SFX_ITEM_SET == pSrcCntntNd->GetSwAttrSet()
                .GetItemState( RES_BREAK, sal_False, &pItem ) )
        {
            switch( ((SvxFmtBreakItem *)pItem)->GetBreak() )
            {
            case SVX_BREAK_PAGE_BEFORE:
            case SVX_BREAK_PAGE_AFTER:
            case SVX_BREAK_PAGE_BOTH:
                if( bFmtBreak )
                    pDestCntntNd->SetAttr( *pItem );
                pSrcCntntNd->ResetAttr( RES_BREAK );
            }
        }
    }
    else if( pSrcNd->IsTableNode() )
    {
        SwFrmFmt *pFrmFmt = pSrcNd->GetTableNode()->GetTable().GetFrmFmt();

        const SfxPoolItem* pItem;
        if( SFX_ITEM_SET == pFrmFmt->GetAttrSet().
                GetItemState( RES_PAGEDESC, sal_False, &pItem ) )
        {
            pDestCntntNd->SetAttr( *pItem );
            pFrmFmt->ResetAttr( RES_PAGEDESC );
        }
    }
}

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/html/htmlsect.cxx,v 1.1.1.1 2000-09-18 17:14:55 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.57  2000/09/18 16:04:46  willem.vandorp
      OpenOffice header added.

      Revision 1.56  2000/06/26 09:52:25  jp
      must change: GetAppWindow->GetDefaultDevice

      Revision 1.55  2000/04/10 12:20:57  mib
      unicode

      Revision 1.54  2000/03/21 15:06:18  os
      UNOIII

      Revision 1.53  2000/02/11 14:37:23  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.52  1999/11/19 16:40:20  os
      modules renamed

      Revision 1.51  1999/09/17 12:14:05  mib
      support of multiple and non system text encodings

      Revision 1.50  1999/07/23 13:35:08  MIB
      #67578#: Use multicolumned sections for <MULTICOL>, section backgrounds


      Rev 1.49   23 Jul 1999 15:35:08   MIB
   #67578#: Use multicolumned sections for <MULTICOL>, section backgrounds

      Rev 1.48   22 Jul 1999 18:59:24   MIB
   Parameters to SwDoc::Insert call for section fixed to avoid updating links

      Rev 1.47   10 Jun 1999 10:34:24   JP
   have to change: no AppWin from SfxApp

      Rev 1.46   09 Jun 1999 19:37:46   JP
   have to change: no cast from GetpApp to SfxApp/OffApp, SfxShell only subclass of SfxApp

      Rev 1.45   27 Jan 1999 09:43:26   OS
   #56371# TF_ONE51

      Rev 1.44   19 Nov 1998 16:42:44   HJS
   tempobj fuer linux

      Rev 1.43   13 Nov 1998 14:39:02   MIB
   Nachtrag zu #58450#: Fuss-/Endnoten: Keine ::com::sun::star::text::Bookmark einfuegen

      Rev 1.42   02 Nov 1998 17:23:46   MIB
   #58480#: Fuss-/Endnoten

      Rev 1.41   05 Jun 1998 13:57:02   JP
   Bug #42487#: Sprung zum Mark schon waehrend des Ladens ausfuehren

      Rev 1.40   12 May 1998 15:50:18   JP
   rund um Flys/DrawObjs im Doc/FESh umgestellt/optimiert

      Rev 1.39   21 Apr 1998 13:46:58   MIB
   fix: Keine ::com::sun::star::text::Bookmark fuer abs-pos Objekte mit ID einfuegen

      Rev 1.38   20 Apr 1998 12:58:06   MIB
   fix: Fuer DIVs mit IS keinen Bereich einfuegen, wenn ein Rahmen eingefuegt wird

      Rev 1.37   15 Apr 1998 14:47:58   MIB
   Zwei-seitige Printing-Extensions

      Rev 1.36   03 Apr 1998 15:11:52   MIB
   CSS1-Padding

      Rev 1.35   03 Apr 1998 12:22:16   MIB
   Export des Rahmen-Namens als ID

      Rev 1.34   02 Apr 1998 19:41:40   MIB
   Positionierung von spaltigen Rahmen

      Rev 1.33   25 Mar 1998 12:09:24   MIB
   unneotige defines weg

      Rev 1.32   19 Mar 1998 09:03:30   MIB
   Abs.-Pos.: Attributierung nicht in Rahmen uebernehmen, Hoehe nun Mindest-Hoehe

      Rev 1.31   11 Mar 1998 18:28:56   MIB
   fix #47846#: auto-gebundenen Rahmen korrekt verankern

      Rev 1.30   20 Feb 1998 19:01:50   MA
   header

      Rev 1.29   13 Feb 1998 18:42:48   HR
   C40_INSERT

      Rev 1.28   22 Jan 1998 19:58:30   JP
   CTOR des SwPaM umgestellt

      Rev 1.27   02 Dec 1997 09:13:02   MA
   includes

      Rev 1.26   20 Oct 1997 09:53:32   MIB
   Nur fuer absolute positioning benoetigten Code groesstenteils auskommentiert

      Rev 1.25   09 Oct 1997 14:35:34   JP
   Umstellung NodeIndex/-Array/BigPtrArray

      Rev 1.24   16 Sep 1997 17:48:58   MIB
   gleiche Methoden zusammengefasst

      Rev 1.23   16 Sep 1997 11:17:44   MIB
   Kopf-/Fusszeilen ohne Moven von Nodes, autom. Beenden von Bereichen/Rahmen

      Rev 1.22   12 Sep 1997 11:56:48   MIB
   MULTICOL ohne Move von Nodes

      Rev 1.21   08 Sep 1997 17:47:56   MIB
   Verankerung von AUTO_CNTNT-Rahmen nicht mehr verschieben

      Rev 1.20   29 Aug 1997 16:49:42   OS
   DLL-Umstellung

      Rev 1.19   15 Aug 1997 12:46:40   OS
   charatr/frmatr/txtatr aufgeteilt

      Rev 1.18   12 Aug 1997 13:47:12   OS
   Header-Umstellung

      Rev 1.17   11 Aug 1997 14:06:46   OM
   Headerfile-Umstellung

      Rev 1.16   07 Aug 1997 15:07:48   OM
   Headerfile-Umstellung

      Rev 1.15   04 Aug 1997 13:54:22   MIB
   aboslute psoitioning (fuer fast alle Zeichen-Attribute/-Vorlagen)

      Rev 1.14   31 Jul 1997 10:44:02   MIB
   DIV-STack weg, absolute positioning (sehr rudimentaer, nicht freigeschaltet)

      Rev 1.13   08 Jul 1997 14:16:40   MIB
   Meta-Tags als PostIts und die immer im ersten Body-Absatz verankern

      Rev 1.12   13 Jun 1997 11:55:38   MIB
   CLASS und ID CSS1-Optionen auswerten

      Rev 1.11   16 Apr 1997 16:36:36   MIB
   fix #38018#: Attribute wegen JavaScript hauefiger setzen

      Rev 1.10   11 Apr 1997 14:42:48   MIB
   fix #38645#: Keine Kopf-/fusszeilen beim Einfuegen einfuegen

      Rev 1.9   10 Apr 1997 11:48:00   MIB
   fix: gelinkte Bereiche nicht updaten aber schutzen

      Rev 1.8   07 Apr 1997 14:42:54   MIB
   fix: Vor Verschieben von Nodes auf StartNode und nicht auf EndIfIcons testen

      Rev 1.7   05 Mar 1997 14:49:34   MIB
   Absatz-Abstaende verbessert

      Rev 1.6   20 Feb 1997 10:23:36   MIB
   Absatnd von Kopf-/Fusszeilen am Absatz loeschen

      Rev 1.5   19 Feb 1997 16:35:14   MIB
   Absatz-Abstand als Abstand an Kopf- und Fusszeilen uebernehmen

      Rev 1.4   16 Feb 1997 12:15:12   MIB
   PageDesc-Atts in Kopf-/Fusszeilen und spaltige Bereichen richtig behandeln

      Rev 1.3   14 Feb 1997 15:48:54   MIB
   bug fix: Referenz auf PageFmt fuer Kopf-/Fusszeilen nehmen

      Rev 1.2   14 Feb 1997 15:16:32   MIB
   Kopf- und Fusszeilen importieren

      Rev 1.1   05 Feb 1997 15:44:36   MIB
   keine ::com::sun::star::text::Bookmarks fuer Bereiche anlegen (wegen gelinkten Bereichen)

      Rev 1.0   05 Feb 1997 13:57:54   MIB
   Initial revision.

*************************************************************************/

diff --git a/sw/source/filter/html/htmltab.cxx b/sw/source/filter/html/htmltab.cxx
new file mode 100644
index 0000000..4b1f091
--- /dev/null
+++ b/sw/source/filter/html/htmltab.cxx
@@ -0,0 +1,6187 @@
/*************************************************************************
 *
 *  $RCSfile: htmltab.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:56 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

//#define TEST_RESIZE

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#include "hintids.hxx"

#ifndef _SV_SVAPP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _WRKWIN_HXX //autogen
#include <vcl/wrkwin.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#define ITEMID_BOXINFO      SID_ATTR_BORDER_INNER
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _SVX_ADJITEM_HXX //autogen
#include <svx/adjitem.hxx>
#endif
#ifndef _SVX_FHGTITEM_HXX //autogen
#include <svx/fhgtitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_BRKITEM_HXX //autogen
#include <svx/brkitem.hxx>
#endif
#ifndef _SVX_SPLTITEM_HXX //autogen
#include <svx/spltitem.hxx>
#endif
#ifndef _HTMLTOKN_H
#include <svtools/htmltokn.h>
#endif
#ifndef _HTMLKYWD_HXX
#include <svtools/htmlkywd.hxx>
#endif


#ifndef _FMTORNT_HXX //autogen
#include <fmtornt.hxx>
#endif
#ifndef _FRMFMT_HXX //autogen
#include <frmfmt.hxx>
#endif
#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _FMTSRND_HXX //autogen
#include <fmtsrnd.hxx>
#endif
#ifndef _FMTPDSC_HXX //autogen
#include <fmtpdsc.hxx>
#endif
#ifndef _FMTCNTNT_HXX //autogen
#include <fmtcntnt.hxx>
#endif
#ifndef _FMTANCHR_HXX //autogen
#include <fmtanchr.hxx>
#endif
#ifndef _FMTTSPLT_HXX //autogen
#include <fmtlsplt.hxx>
#endif
#ifndef _FRMATR_HXX
#include "frmatr.hxx"
#endif
#include "pam.hxx"
#include "doc.hxx"
#include "ndtxt.hxx"
#include "shellio.hxx"
#include "poolfmt.hxx"
#include "swtable.hxx"
#include "cellatr.hxx"
#ifdef TEST_RESIZE
#include "viewsh.hxx"
#endif
#include "htmltbl.hxx"
#include "swtblfmt.hxx"
#include "htmlnum.hxx"
#include "swhtml.hxx"
#include "swcss1.hxx"

#define NETSCAPE_DFLT_BORDER 1
#define NETSCAPE_DFLT_CELLPADDING 1
#define NETSCAPE_DFLT_CELLSPACING 2

//#define FIX56334

static HTMLOptionEnum __FAR_DATA aHTMLTblVAlignTable[] =
{
    { sHTML_VA_top,         VERT_NONE       },
    { sHTML_VA_middle,      VERT_CENTER     },
    { sHTML_VA_bottom,      VERT_BOTTOM     },
    { 0,                    0               }
};


/*  */

// Die Optionen eines Table-Tags

struct HTMLTableOptions
{
    sal_uInt16 nCols;
    sal_uInt16 nWidth;
    sal_uInt16 nHeight;
    sal_uInt16 nCellPadding;
    sal_uInt16 nCellSpacing;
    sal_uInt16 nBorder;
    sal_uInt16 nHSpace;
    sal_uInt16 nVSpace;

    SvxAdjust eAdjust;
    SwVertOrient eVertOri;
    HTMLTableFrame eFrame;
    HTMLTableRules eRules;

    sal_Bool bPrcWidth : 1;
    sal_Bool bTableAdjust : 1;
    sal_Bool bBGColor : 1;

    Color aBorderColor;
    Color aBGColor;

    String aBGImage, aStyle, aId, aClass;

    HTMLTableOptions( const HTMLOptions *pOptions, SvxAdjust eParentAdjust );
};

/*  */

class _HTMLTableContext
{
    SwHTMLNumRuleInfo aNumRuleInfo; // Vor der Tabelle gueltige Numerierung

    SwTableNode *pTblNd;            // der Tabellen-Node
    SwFrmFmt *pFrmFmt;              // der Fly ::com::sun::star::frame::Frame, in dem die Tabelle steht
    SwPosition *pPos;               // die Position hinter der Tabelle

    sal_uInt16 nContextStAttrMin;
    sal_uInt16 nContextStMin;

    sal_Bool    bRestartPRE : 1;
    sal_Bool    bRestartXMP : 1;
    sal_Bool    bRestartListing : 1;

public:

    _HTMLAttrTable aAttrTab;        // und die Attribute

    _HTMLTableContext( SwPosition *pPs, sal_uInt16 nCntxtStMin,
                       sal_uInt16 nCntxtStAttrMin ) :
        pTblNd( 0 ), pFrmFmt( 0 ), pPos( pPs ),
        nContextStMin( nCntxtStMin ), nContextStAttrMin( nCntxtStAttrMin ),
        bRestartPRE( sal_False ), bRestartXMP( sal_False ), bRestartListing( sal_False )
    {
        memset( &aAttrTab, 0, sizeof( _HTMLAttrTable ));
    }

    ~_HTMLTableContext();

    void SetNumInfo( const SwHTMLNumRuleInfo& rInf ) { aNumRuleInfo.Set(rInf); }
    const SwHTMLNumRuleInfo& GetNumInfo() const { return aNumRuleInfo; };

    void SavePREListingXMP( SwHTMLParser& rParser );
    void RestorePREListingXMP( SwHTMLParser& rParser );

    SwPosition *GetPos() const { return pPos; }

    void SetTableNode( SwTableNode *pNd ) { pTblNd = pNd; }
    SwTableNode *GetTableNode() const { return pTblNd; }

    void SetFrmFmt( SwFrmFmt *pFmt ) { pFrmFmt = pFmt; }
    SwFrmFmt *GetFrmFmt() const { return pFrmFmt; }

    sal_uInt16 GetContextStMin() const { return nContextStMin; }
    sal_uInt16 GetContextStAttrMin() const { return nContextStAttrMin; }
};

/*  */

// der Inhalt einer Zelle ist eine verkettete Liste mit SwStartNodes und
// HTMLTables.

class HTMLTableCnts
{
    HTMLTableCnts *pNext;               // der naechste Inhalt

    // von den beiden naechsten Pointern darf nur einer gesetzt sein!
    const SwStartNode *pStartNode;      // ein Abastz
    HTMLTable *pTable;                  // eine Tabelle

    SwHTMLTableLayoutCnts* pLayoutInfo;

    sal_Bool bNoBreak;

    void InitCtor();

public:

    HTMLTableCnts( const SwStartNode* pStNd );
    HTMLTableCnts( HTMLTable* pTab );

    ~HTMLTableCnts();                   // nur in ~HTMLTableCell erlaubt

    // Ermitteln des SwStartNode bzw. der HTMLTable
    const SwStartNode *GetStartNode() const { return pStartNode; }
    const HTMLTable *GetTable() const { return pTable; }
    HTMLTable *GetTable() { return pTable; }

    // hinzufuegen eines neuen Knotens am Listenende
    void Add( HTMLTableCnts* pNewCnts );

    // Ermitteln des naechsten Knotens
    const HTMLTableCnts *Next() const { return pNext; }
    HTMLTableCnts *Next() { return pNext; }

    inline void SetTableBox( SwTableBox *pBox );

    void SetNoBreak() { bNoBreak = sal_True; }

    SwHTMLTableLayoutCnts *CreateLayoutInfo();
};

/*  */

// Eine Zelle der HTML-Tabelle

class HTMLTableCell
{
    // !!!ACHTUNG!!!!! Fuer jeden neuen Pointer muss die SetProtected-
    // Methode (und natuerlich der Destruktor) bearbeitet werden.
    HTMLTableCnts *pContents;       // der Inhalt der Zelle
    SvxBrushItem *pBGBrush;         // Hintergrund der Zelle
    // !!!ACHTUNG!!!!!

    sal_uInt32 nNumFmt;
    sal_uInt16 nRowSpan;                // ROWSPAN der Zelle
    sal_uInt16 nColSpan;                // COLSPAN der Zelle
    sal_uInt16 nWidth;                  // WIDTH der Zelle
    double nValue;
    SwVertOrient eVertOri;          // vertikale Ausrichtung der Zelle
    sal_Bool bProtected : 1;            // Zelle darf nicht belegt werden
    sal_Bool bRelWidth : 1;             // nWidth ist %-Angabe
    sal_Bool bHasNumFmt : 1;
    sal_Bool bHasValue : 1;
    sal_Bool bNoWrap : 1;

public:

    HTMLTableCell();                // neue Zellen sind immer leer

    ~HTMLTableCell();               // nur in ~HTMLTableRow erlaubt

    // Belegen einer nicht-leeren Zelle
    void Set( HTMLTableCnts *pCnts, sal_uInt16 nRSpan, sal_uInt16 nCSpan,
              SwVertOrient eVertOri, SvxBrushItem *pBGBrush,
              sal_Bool bHasNumFmt, sal_uInt32 nNumFmt,
              sal_Bool bHasValue, double nValue, sal_Bool bNoWrap );

    // Schuetzen einer leeren 1x1-Zelle
    void SetProtected();

    // Setzen/Ermitteln des Inhalts einer Zelle
    void SetContents( HTMLTableCnts *pCnts ) { pContents = pCnts; }
    const HTMLTableCnts *GetContents() const { return pContents; }
    HTMLTableCnts *GetContents() { return pContents; }

    // ROWSPAN/COLSPAN der Zelle Setzen/Ermitteln
    void SetRowSpan( sal_uInt16 nRSpan ) { nRowSpan = nRSpan; }
    sal_uInt16 GetRowSpan() const { return nRowSpan; }

    void SetColSpan( sal_uInt16 nCSpan ) { nColSpan = nCSpan; }
    sal_uInt16 GetColSpan() const { return nColSpan; }

    inline void SetWidth( sal_uInt16 nWidth, sal_Bool bRelWidth );

    const SvxBrushItem *GetBGBrush() const { return pBGBrush; }

    inline sal_Bool GetNumFmt( sal_uInt32& rNumFmt ) const;
    inline sal_Bool GetValue( double& rValue ) const;

    SwVertOrient GetVertOri() const { return eVertOri; }

    // Ist die Zelle belegt oder geschuetzt?
    sal_Bool IsUsed() const { return pContents!=0 || bProtected; }

    SwHTMLTableLayoutCell *CreateLayoutInfo();
};

/*  */

// Eine Zeile der HTML-Tabelle

typedef HTMLTableCell* HTMLTableCellPtr;
SV_DECL_PTRARR_DEL(HTMLTableCells,HTMLTableCellPtr,5,5)

class HTMLTableRow
{
    HTMLTableCells *pCells;             // die Zellen der Zeile

    sal_Bool bIsEndOfGroup : 1;
    sal_Bool bSplitable : 1;

    sal_uInt16 nHeight;                     // Optionen von <TR>/<TD>
    sal_uInt16 nEmptyRows;                  // wieviele Leere Zeilen folgen

    SvxAdjust eAdjust;
    SwVertOrient eVertOri;
    SvxBrushItem *pBGBrush;             // Hintergrund der Zelle aus STYLE

public:

    sal_Bool bBottomBorder;                 // kommt hinter der Zeile eine Linie?

    HTMLTableRow( sal_uInt16 nCells=0 );    // die Zellen der Zeile sind leer

    ~HTMLTableRow();

    inline void SetHeight( sal_uInt16 nHeight );
    sal_uInt16 GetHeight() const { return nHeight; }

    // Ermitteln einer Zelle
    inline HTMLTableCell *GetCell( sal_uInt16 nCell ) const;
    inline const HTMLTableCells *GetCells() const { return pCells; }


    inline void SetAdjust( SvxAdjust eAdj ) { eAdjust = eAdj; }
    inline SvxAdjust GetAdjust() const { return eAdjust; }

    inline void SetVertOri( SwVertOrient eV) { eVertOri = eV; }
    inline SwVertOrient GetVertOri() const { return eVertOri; }

    void SetBGBrush( SvxBrushItem *pBrush ) { pBGBrush = pBrush; }
    const SvxBrushItem *GetBGBrush() const { return pBGBrush; }

    inline void SetEndOfGroup() { bIsEndOfGroup = sal_True; }
    inline sal_Bool IsEndOfGroup() const { return bIsEndOfGroup; }

    void IncEmptyRows() { nEmptyRows++; }
    sal_uInt16 GetEmptyRows() const { return nEmptyRows; }

    // Expandieren einer Zeile durch hinzufuegen leerer Zellen
    void Expand( sal_uInt16 nCells, sal_Bool bOneCell=sal_False );

    // Verkuerzen einer Zeile durch loesen von leeren Zellen
    void Shrink( sal_uInt16 nCells );

    void SetSplitable( sal_Bool bSet ) { bSplitable = bSet; }
    sal_Bool IsSplitable() const { return bSplitable; }
};

/*  */

// Eine Spalte der HTML-Tabelle

class HTMLTableColumn
{
    sal_Bool bIsEndOfGroup;

    sal_uInt16 nWidth;                      // Optionen von <COL>
    sal_Bool bRelWidth;

    SvxAdjust eAdjust;
    SwVertOrient eVertOri;

    SwFrmFmt *aFrmFmts[6];

    inline sal_uInt16 GetFrmFmtIdx( sal_Bool bBorderLine,
                                SwVertOrient eVertOri ) const;

public:

    sal_Bool bLeftBorder;                   // kommt vor der Spalte eine Linie

    HTMLTableColumn();

    inline void SetWidth( sal_uInt16 nWidth, sal_Bool bRelWidth);

    inline void SetAdjust( SvxAdjust eAdj ) { eAdjust = eAdj; }
    inline SvxAdjust GetAdjust() const { return eAdjust; }

    inline void SetVertOri( SwVertOrient eV) { eVertOri = eV; }
    inline SwVertOrient GetVertOri() const { return eVertOri; }

    inline void SetEndOfGroup() { bIsEndOfGroup = sal_True; }
    inline sal_Bool IsEndOfGroup() const { return bIsEndOfGroup; }

    inline void SetFrmFmt( SwFrmFmt *pFmt, sal_Bool bBorderLine,
                           SwVertOrient eVertOri );
    inline SwFrmFmt *GetFrmFmt( sal_Bool bBorderLine,
                                SwVertOrient eVertOri ) const;

    SwHTMLTableLayoutColumn *CreateLayoutInfo();
};

/*  */

// eine HTML-Tabelle

typedef HTMLTableRow* HTMLTableRowPtr;
SV_DECL_PTRARR_DEL(HTMLTableRows,HTMLTableRowPtr,5,5)

typedef HTMLTableColumn* HTMLTableColumnPtr;
SV_DECL_PTRARR_DEL(HTMLTableColumns,HTMLTableColumnPtr,5,5)

SV_DECL_PTRARR(SdrObjects,SdrObject *,1,1)

class HTMLTable
{
    String aId;
    String aStyle;
    String aClass;

    SdrObjects *pResizeDrawObjs;// SDR-Objekte
    SvUShorts *pDrawObjPrcWidths;   // Spalte des Zeichen-Objekts und dessen
                                    // relative Breite

    HTMLTableRows *pRows;           // die Zeilen der Tabelle
    HTMLTableColumns *pColumns;     // die Spalten der Tabelle

    sal_uInt16 nRows;                   // Anzahl Zeilen
    sal_uInt16 nCols;                   // Anzahl Spalten
    sal_uInt16 nFilledCols;             // Anzahl tatsaechlich gefuellter Spalten

    sal_uInt16 nCurRow;                 // aktuelle Zeile
    sal_uInt16 nCurCol;                 // aktuelle Spalte

    sal_uInt16 nLeftMargin;             // Abstand zum linken Rand (aus Absatz)
    sal_uInt16 nRightMargin;            // Abstand zum rechten Rand (aus Absatz)

    sal_uInt16 nCellPadding;            // Abstand Umrandung zum Text
    sal_uInt16 nCellSpacing;            // Abstand zwischen zwei Zellen
    sal_uInt16 nHSpace;
    sal_uInt16 nVSpace;

    sal_uInt16 nBoxes;                  // Wievele Boxen enthaelt die Tabelle

    const SwStartNode *pPrevStNd;   // der Table-Node oder der Start-Node
                                    // der vorhergehenden Section
    const SwTable *pSwTable;        // die SW-Tabelle (nur auf dem Top-Level)
    SwTableBox *pBox1;              // die TableBox, die beim Erstellen
                                    // der Top-Level-Tabelle angelegt wird

    SwTableBoxFmt *pBoxFmt;         // das ::com::sun::star::frame::Frame-Format einer SwTableBox
    SwTableLineFmt *pLineFmt;       // das ::com::sun::star::frame::Frame-Format einer SwTableLine
    SwTableLineFmt *pLineFrmFmtNoHeight;
    SvxBrushItem *pBGBrush;         // Hintergrund der Tabelle
    SvxBrushItem *pInhBGBrush;      // "geerbter" Hintergrund der Tabelle
    const SwStartNode *pCaptionStartNode;   // Start-Node der Tabellen-Ueberschrift

    SvxBorderLine aTopBorderLine;   // die Linie fuer die Umrandung
    SvxBorderLine aBottomBorderLine;// die Linie fuer die Umrandung
    SvxBorderLine aLeftBorderLine;  // die Linie fuer die Umrandung
    SvxBorderLine aRightBorderLine; // die Linie fuer die Umrandung
    SvxBorderLine aBorderLine;      // die Linie fuer die Umrandung
    SvxBorderLine aInhLeftBorderLine;   // die Linie fuer die Umrandung
    SvxBorderLine aInhRightBorderLine;  // die Linie fuer die Umrandung
    sal_Bool bTopBorder;                // besitzt die Tabelle oben eine Linie
    sal_Bool bRightBorder;              // besitzt die Tabelle rechts eine Linie
    sal_Bool bTopAlwd;                  // duerfen die Raender gesetzt werden?
    sal_Bool bRightAlwd;
    sal_Bool bFillerTopBorder;          // bekommt eine linke/rechter Filler-
    sal_Bool bFillerBottomBorder;       // Zelle eine obere/untere Umrandung?
    sal_Bool bInhLeftBorder;
    sal_Bool bInhRightBorder;
    sal_Bool bBordersSet;               // die Umrandung wurde bereits gesetzt
    sal_Bool bForceFrame;
    sal_Bool bTableAdjustOfTag;         // stammt nTableAdjust aus <TABLE>?
    sal_Bool bHeadlineRepeat;           // Ueberschrift wiederholen
    sal_Bool bIsParentHead;
    sal_Bool bHasParentSection;
    sal_Bool bMakeTopSubTable;
    sal_Bool bHasToFly;
    sal_Bool bFixedCols;
    sal_Bool bColSpec;                  // Gab es COL(GROUP)-Elemente?
    sal_Bool bPrcWidth;                 // Breite ist eine %-Angabe

    SwHTMLParser *pParser;          // der aktuelle Parser
    HTMLTable *pTopTable;           // die Tabelle auf dem Top-Level
    HTMLTableCnts *pParentContents;

    _HTMLTableContext *pContext;    // der Kontext der Tabelle

    SwHTMLTableLayout *pLayoutInfo;


    // die folgenden Parameter stammen aus der dem <TABLE>-Tag
    sal_uInt16 nWidth;                  // die Breite der Tabelle
    sal_uInt16 nHeight;                 // absolute Hoehe der Tabelle
    SvxAdjust eTableAdjust;         // ::com::sun::star::drawing::Alignment der Tabelle
    SwVertOrient eVertOri;          // Default vertikale Ausr. der Zellen
    sal_uInt16 nBorder;                 // Breite der auesseren Umrandung
    HTMLTableFrame eFrame;          // Rahmen um die Tabelle
    HTMLTableRules eRules;          // Ramhen in der Tabelle
    sal_Bool bTopCaption;               // Ueberschrift ueber der Tabelle

    void InitCtor( const HTMLTableOptions *pOptions );

    // Korigieren des Row-Spans fuer alle Zellen oberhalb der
    // angegeben Zelle und der Zelle selbst, fuer die den anegebenen
    // Inhalt besitzen. Die angegeben Zelle bekommt den Row-Span 1
    void FixRowSpan( sal_uInt16 nRow, sal_uInt16 nCol, const HTMLTableCnts *pCnts );

    // Schuetzen der angegeben Zelle und den darunterliegenden
    void ProtectRowSpan( sal_uInt16 nRow, sal_uInt16 nCol, sal_uInt16 nRowSpan );

    // Suchen des SwStartNodes der logisch vorhergehenden Box
    // bei nRow==nCell==USHRT_MAX wird der allerletzte Start-Node
    // der Tabelle zurueckgegeben
    const SwStartNode* GetPrevBoxStartNode( sal_uInt16 nRow, sal_uInt16 nCell ) const;

    sal_uInt16 GetTopCellSpace( sal_uInt16 nRow, sal_uInt16 nRowSpan,
                            sal_Bool bSwBorders=sal_True ) const;
    sal_uInt16 GetBottomCellSpace( sal_uInt16 nRow, sal_uInt16 nRowSpan,
                               sal_Bool bSwBorders=sal_True ) const;

    // Anpassen des ::com::sun::star::frame::Frame-Formates einer Box
    void FixFrameFmt( SwTableBox *pBox, sal_uInt16 nRow, sal_uInt16 nCol,
                      sal_uInt16 nRowSpan, sal_uInt16 nColSpan,
                      sal_Bool bFirstPara=sal_True, sal_Bool bLastPara=sal_True ) const;
    void FixFillerFrameFmt( SwTableBox *pBox, sal_Bool bRight ) const;

    // den Inhalt (Lines/Boxen) eine Tabelle erstellen
    void _MakeTable( SwTableBox *pUpper=0 );

    // Anlegen einer neuen SwTableBox, die einen SwStartNode enthaelt
    SwTableBox *NewTableBox( const SwStartNode *pStNd,
                             SwTableLine *pUpper ) const;

    // Erstellen einer SwTableLine aus den Zellen des Rechtecks
    // (nTopRow/nLeftCol) inklusive bis (nBottomRow/nRightRow) exklusive
    SwTableLine *MakeTableLine( SwTableBox *pUpper,
                                sal_uInt16 nTopRow, sal_uInt16 nLeftCol,
                                sal_uInt16 nBottomRow, sal_uInt16 nRightCol );

    // Erstellen einer SwTableBox aus den Zellen des Rechtecks
    // (nTopRow/nLeftCol) inklusive bis (nBottomRow/nRightRow) exklusive
    SwTableBox *MakeTableBox( SwTableLine *pUpper,
                              sal_uInt16 nTopRow, sal_uInt16 nLeftCol,
                              sal_uInt16 nBottomRow, sal_uInt16 nRightCol );

    // Erstellen einer SwTableBox aus dem Inhalt einer Zelle
    SwTableBox *MakeTableBox( SwTableLine *pUpper,
                              HTMLTableCnts *pCnts,
                              sal_uInt16 nTopRow, sal_uInt16 nLeftCol,
                              sal_uInt16 nBootomRow, sal_uInt16 nRightCol );

    // der Autolayout-Algorithmus

    // Setzen der Umrandung anhand der Vorgaben der Parent-Tabelle
    void InheritBorders( const HTMLTable *pParent,
                         sal_uInt16 nRow, sal_uInt16 nCol,
                         sal_uInt16 nRowSpan, sal_uInt16 nColSpan,
                         sal_Bool bFirstPara, sal_Bool bLastPara );

    // Linke und rechte Umrandung der umgebenen Tabelle erben
    void InheritVertBorders( const HTMLTable *pParent,
                             sal_uInt16 nCol, sal_uInt16 nColSpan );


    // Setzen der Umrandung anhand der Benutzervorgaben
    void SetBorders();

    // wurde die Umrandung der Tabelle schon gesetzt
    sal_Bool BordersSet() const { return bBordersSet; }

    const SvxBrushItem *GetBGBrush() const { return pBGBrush; }
    const SvxBrushItem *GetInhBGBrush() const { return pInhBGBrush; }

    sal_uInt16 GetBorderWidth( const SvxBorderLine& rBLine,
                           sal_Bool bWithDistance=sal_False ) const;

public:

    sal_Bool bFirstCell;                // wurde schon eine Zelle angelegt?

    HTMLTable( SwHTMLParser* pPars, HTMLTable *pTopTab,
               sal_Bool bParHead, sal_Bool bHasParentSec,
               sal_Bool bTopTbl, sal_Bool bHasToFly,
               const HTMLTableOptions *pOptions );

    ~HTMLTable();

    // Ermitteln einer Zelle
    inline HTMLTableCell *GetCell( sal_uInt16 nRow, sal_uInt16 nCell ) const;

    // Ueberschrift setzen/ermitteln
    inline void SetCaption( const SwStartNode *pStNd, sal_Bool bTop );
    const SwStartNode *GetCaptionStartNode() const { return pCaptionStartNode; }
    sal_Bool IsTopCaption() const { return bTopCaption; }

    SvxAdjust GetTableAdjust( sal_Bool bAny ) const
    {
        return (bTableAdjustOfTag || bAny) ? eTableAdjust : SVX_ADJUST_END;
    }
    SwVertOrient GetVertOri() const { return eVertOri; }

    sal_uInt16 GetHSpace() const { return nHSpace; }
    sal_uInt16 GetVSpace() const { return nVSpace; }

    sal_Bool HasPrcWidth() const { return bPrcWidth; }
    sal_uInt8 GetPrcWidth() const { return bPrcWidth ? (sal_uInt8)nWidth : 0; }

    sal_uInt16 GetMinWidth() const
    {
        sal_uInt32 nMin = pLayoutInfo->GetMin();
        return nMin < USHRT_MAX ? (sal_uInt16)nMin : USHRT_MAX;
    }

    // von Zeilen oder Spalten geerbtes ::com::sun::star::drawing::Alignment holen
    SvxAdjust GetInheritedAdjust() const;
    SwVertOrient GetInheritedVertOri() const;

    // Einfuegen einer Zelle an der aktuellen Position
    void InsertCell( HTMLTableCnts *pCnts, sal_uInt16 nRowSpan, sal_uInt16 nColSpan,
                     sal_uInt16 nWidth, sal_Bool bRelWidth, sal_uInt16 nHeight,
                     SwVertOrient eVertOri, SvxBrushItem *pBGBrush,
                     sal_Bool bHasNumFmt, sal_uInt32 nNumFmt,
                     sal_Bool bHasValue, double nValue, sal_Bool bNoWrap );

    // Start/Ende einer neuen Zeile bekanntgeben
    void OpenRow( SvxAdjust eAdjust, SwVertOrient eVertOri,
                  SvxBrushItem *pBGBrush );
    void CloseRow( sal_Bool bEmpty );

    // Ende einer neuen Section bekanntgeben
    inline void CloseSection( sal_Bool bHead );

    // Ende einer Spalten-Gruppe bekanntgeben
    inline void CloseColGroup( sal_uInt16 nSpan, sal_uInt16 nWidth, sal_Bool bRelWidth,
                               SvxAdjust eAdjust, SwVertOrient eVertOri );

    // Einfuegen einer Spalte
    void InsertCol( sal_uInt16 nSpan, sal_uInt16 nWidth, sal_Bool bRelWidth,
                    SvxAdjust eAdjust, SwVertOrient eVertOri );

    // Beenden einer Tab-Definition (MUSS fuer ALLE Tabs aufgerufen werden)
    void CloseTable();

    // SwTable konstruieren (inkl. der Child-Tabellen)
    void MakeTable( SwTableBox *pUpper, sal_uInt16 nAbsAvail,
                    sal_uInt16 nRelAvail=0, sal_uInt16 nAbsLeftSpace=0,
                    sal_uInt16 nAbsRightSpace=0, sal_uInt16 nInhAbsSpace=0 );

    inline sal_Bool IsNewDoc() const { return pParser->IsNewDoc(); }

    void SetHasParentSection( sal_Bool bSet ) { bHasParentSection = bSet; }
    sal_Bool HasParentSection() const { return bHasParentSection; }

    void SetParentContents( HTMLTableCnts *pCnts ) { pParentContents = pCnts; }
    HTMLTableCnts *GetParentContents() const { return pParentContents; }

    void MakeParentContents();

    sal_Bool GetIsParentHeader() const { return bIsParentHead; }

    sal_Bool IsMakeTopSubTable() const { return bMakeTopSubTable; }
    void SetHasToFly() { bHasToFly=sal_True; }
    sal_Bool HasToFly() const { return bHasToFly; }

    void SetTable( const SwStartNode *pStNd, _HTMLTableContext *pCntxt,
                   sal_uInt16 nLeft, sal_uInt16 nRight,
                   const SwTable *pSwTab=0, sal_Bool bFrcFrame=sal_False );

    _HTMLTableContext *GetContext() const { return pContext; }

    SwHTMLTableLayout *CreateLayoutInfo();

    sal_Bool HasColTags() const { return bColSpec; }

    sal_uInt16 IncGrfsThatResize() { return pSwTable ? ((SwTable *)pSwTable)->IncGrfsThatResize() : 0; }

    void RegisterDrawObject( SdrObject *pObj, sal_uInt8 nPrcWidth );

    const SwTable *GetSwTable() const { return pSwTable; }

    void SetBGBrush( const SvxBrushItem& rBrush ) { delete pBGBrush; pBGBrush = new SvxBrushItem( rBrush ); }

    const String& GetId() const { return aId; }
    const String& GetClass() const { return aClass; }
    const String& GetStyle() const { return aStyle; }

    void IncBoxCount() { nBoxes++; }
    sal_Bool IsOverflowing() const { return nBoxes > 64000; }
};

SV_IMPL_PTRARR(HTMLTableCells,HTMLTableCellPtr)
SV_IMPL_PTRARR(HTMLTableRows,HTMLTableRowPtr)
SV_IMPL_PTRARR(HTMLTableColumns,HTMLTableColumnPtr)

/*  */


void HTMLTableCnts::InitCtor()
{
    pNext = 0;
    pLayoutInfo = 0;

    bNoBreak = sal_False;
}

HTMLTableCnts::HTMLTableCnts( const SwStartNode* pStNd ):
    pStartNode(pStNd), pTable(0)
{
    InitCtor();
}

HTMLTableCnts::HTMLTableCnts( HTMLTable* pTab ):
    pStartNode(0), pTable(pTab)
{
    InitCtor();
}

HTMLTableCnts::~HTMLTableCnts()
{
    delete pTable;              // die Tabellen brauchen wir nicht mehr
    delete pNext;
}

void HTMLTableCnts::Add( HTMLTableCnts* pNewCnts )
{
    HTMLTableCnts *pCnts = this;

    while( pCnts->pNext )
        pCnts = pCnts->pNext;

    pCnts->pNext = pNewCnts;
}

inline void HTMLTableCnts::SetTableBox( SwTableBox *pBox )
{
    ASSERT( pLayoutInfo, "Da sit noch keine Layout-Info" );
    if( pLayoutInfo )
        pLayoutInfo->SetTableBox( pBox );
}

SwHTMLTableLayoutCnts *HTMLTableCnts::CreateLayoutInfo()
{
    if( !pLayoutInfo )
    {
        SwHTMLTableLayoutCnts *pNextInfo = pNext ? pNext->CreateLayoutInfo() : 0;
        SwHTMLTableLayout *pTableInfo = pTable ? pTable->CreateLayoutInfo() : 0;

        pLayoutInfo = new SwHTMLTableLayoutCnts( pStartNode, pTableInfo,
                                                 bNoBreak, pNextInfo );
    }

    return pLayoutInfo;
}

/*  */

HTMLTableCell::HTMLTableCell():
    pContents(0),
    pBGBrush(0),
    nRowSpan(1), nColSpan(1), nWidth( 0 ),
    eVertOri( VERT_NONE ),
    bProtected(sal_False), bRelWidth( sal_False ),
    bHasNumFmt(sal_False), nNumFmt(0),
    bHasValue(sal_False), nValue(0)
{}

HTMLTableCell::~HTMLTableCell()
{
    // der Inhalt ist in mehrere Zellen eingetragen, darf aber nur einmal
    // geloescht werden
    if( 1==nRowSpan && 1==nColSpan )
    {
        delete pContents;
        delete pBGBrush;
    }
}

void HTMLTableCell::Set( HTMLTableCnts *pCnts, sal_uInt16 nRSpan, sal_uInt16 nCSpan,
                         SwVertOrient eVert, SvxBrushItem *pBrush,
                         sal_Bool bHasNF, sal_uInt32 nNF, sal_Bool bHasV, double nVal,
                         sal_Bool bNWrap )
{
    pContents = pCnts;
    nRowSpan = nRSpan;
    nColSpan = nCSpan;
    bProtected = sal_False;
    eVertOri = eVert;
    pBGBrush = pBrush;

    bHasNumFmt = bHasNF;
    bHasValue = bHasV;
    nNumFmt = nNF;
    nValue = nVal;

    bNoWrap = bNWrap;
}

inline void HTMLTableCell::SetWidth( sal_uInt16 nWdth, sal_Bool bRelWdth )
{
    nWidth = nWdth;
    bRelWidth = bRelWdth;
}

void HTMLTableCell::SetProtected()
{
    // Die Inhalte dieser Zelle mussen nich irgenwo anders verankert
    // sein, weil sie nicht geloescht werden!!!

    // Inhalt loeschen
    pContents = 0;

    // Hintergrundfarbe kopieren.
    if( pBGBrush )
        pBGBrush = new SvxBrushItem( *pBGBrush );

    nRowSpan = 1;
    nColSpan = 1;
    bProtected = sal_True;
}

inline sal_Bool HTMLTableCell::GetNumFmt( sal_uInt32& rNumFmt ) const
{
    rNumFmt = nNumFmt;
    return bHasNumFmt;
}

inline sal_Bool HTMLTableCell::GetValue( double& rValue ) const
{
    rValue = nValue;
    return bHasValue;
}

SwHTMLTableLayoutCell *HTMLTableCell::CreateLayoutInfo()
{
    SwHTMLTableLayoutCnts *pCntInfo = pContents ? pContents->CreateLayoutInfo() : 0;

    return new SwHTMLTableLayoutCell( pCntInfo, nRowSpan, nColSpan, nWidth,
                                      bRelWidth, bNoWrap );
}

/*  */

HTMLTableRow::HTMLTableRow( sal_uInt16 nCells ):
    pCells(new HTMLTableCells), bIsEndOfGroup(sal_False),
    eAdjust(SVX_ADJUST_END), eVertOri(VERT_TOP), pBGBrush(0),
    bBottomBorder(sal_False), nHeight(0), nEmptyRows(0), bSplitable( sal_False )
{
    for( sal_uInt16 i=0; i<nCells; i++ )
    {
        pCells->Insert( new HTMLTableCell, pCells->Count() );
    }

    ASSERT( nCells==pCells->Count(),
            "Zellenzahl in neuer HTML-Tabellenzeile stimmt nicht" );
}

HTMLTableRow::~HTMLTableRow()
{
    delete pCells;
    delete pBGBrush;
}

inline void HTMLTableRow::SetHeight( sal_uInt16 nHght )
{
    if( nHght > nHeight  )
        nHeight = nHght;
}

inline HTMLTableCell *HTMLTableRow::GetCell( sal_uInt16 nCell ) const
{
    ASSERT( nCell<pCells->Count(),
        "ungueltiger Zellen-Index in HTML-Tabellenzeile" );
    return (*pCells)[nCell];
}

void HTMLTableRow::Expand( sal_uInt16 nCells, sal_Bool bOneCell )
{
    // die Zeile wird mit einer einzigen Zelle aufgefuellt, wenn
    // bOneCell gesetzt ist. Das geht, nur fuer Zeilen, in die keine
    // Zellen mehr eingefuegt werden!

    sal_uInt16 nColSpan = nCells-pCells->Count();
    for( sal_uInt16 i=pCells->Count(); i<nCells; i++ )
    {
        HTMLTableCell *pCell = new HTMLTableCell;
        if( bOneCell )
            pCell->SetColSpan( nColSpan );

        pCells->Insert( pCell, pCells->Count() );
        nColSpan--;
    }

    ASSERT( nCells==pCells->Count(),
            "Zellenzahl in expandierter HTML-Tabellenzeile stimmt nicht" );
}

void HTMLTableRow::Shrink( sal_uInt16 nCells )
{
    ASSERT( nCells < pCells->Count(), "Anzahl Zellen falsch" );

#ifdef DEBUG
    sal_uInt16 nEnd = pCells->Count();
    for( sal_uInt16 i=nCells; i<nEnd; i++ )
    {
        HTMLTableCell *pCell = (*pCells)[i];
        ASSERT( pCell->GetRowSpan() == 1,
                "RowSpan von zu loesender Zelle ist falsch" );
        ASSERT( pCell->GetColSpan() == nEnd - i,
                    "ColSpan von zu loesender Zelle ist falsch" );
        ASSERT( !pCell->GetContents(), "Zu loeschende Zelle hat Inhalt" );
    }
#endif

    pCells->DeleteAndDestroy( nCells, pCells->Count()-nCells );
}

/*  */

HTMLTableColumn::HTMLTableColumn():
    bIsEndOfGroup(sal_False),
    nWidth(0), bRelWidth(sal_False),
    eAdjust(SVX_ADJUST_END), eVertOri(VERT_TOP),
    bLeftBorder(sal_False)
{
    for( sal_uInt16 i=0; i<6; i++ )
        aFrmFmts[i] = 0;
}

inline void HTMLTableColumn::SetWidth( sal_uInt16 nWdth, sal_Bool bRelWdth )
{
    if( bRelWidth==bRelWdth )
    {
        if( nWdth > nWidth )
            nWidth = nWdth;
    }
    else
        nWidth = nWdth;
    bRelWidth = bRelWdth;
}

inline SwHTMLTableLayoutColumn *HTMLTableColumn::CreateLayoutInfo()
{
    return new SwHTMLTableLayoutColumn( nWidth, bRelWidth, bLeftBorder );
}

inline sal_uInt16 HTMLTableColumn::GetFrmFmtIdx( sal_Bool bBorderLine,
                                             SwVertOrient eVertOri ) const
{
    ASSERT( VERT_TOP != eVertOri, "Top ist nicht erlaubt" );
    sal_uInt16 n = bBorderLine ? 3 : 0;
    switch( eVertOri )
    {
    case VERT_CENTER:   n+=1;   break;
    case VERT_BOTTOM:   n+=2;   break;
    }
    return n;
}

inline void HTMLTableColumn::SetFrmFmt( SwFrmFmt *pFmt, sal_Bool bBorderLine,
                                        SwVertOrient eVertOri )
{
    aFrmFmts[GetFrmFmtIdx(bBorderLine,eVertOri)] = pFmt;
}

inline SwFrmFmt *HTMLTableColumn::GetFrmFmt( sal_Bool bBorderLine,
                                             SwVertOrient eVertOri ) const
{
    return aFrmFmts[GetFrmFmtIdx(bBorderLine,eVertOri)];
}

/*  */


void HTMLTable::InitCtor( const HTMLTableOptions *pOptions )
{
    pResizeDrawObjs = 0;
    pDrawObjPrcWidths = 0;

    pRows = new HTMLTableRows;
    pColumns = new HTMLTableColumns;
    nRows = 0;
    nCurRow = 0; nCurCol = 0;

    pBox1 = 0;
    pBoxFmt = 0; pLineFmt = 0;
    pLineFrmFmtNoHeight = 0;
    pInhBGBrush = 0;

    pPrevStNd = 0;
    pSwTable = 0;

    bTopBorder = sal_False; bRightBorder = sal_False;
    bTopAlwd = sal_True; bRightAlwd = sal_True;
    bFillerTopBorder = sal_False; bFillerBottomBorder = sal_False;
    bInhLeftBorder = sal_False; bInhRightBorder = sal_False;
    bBordersSet = sal_False;
    bForceFrame = sal_False;
    bHeadlineRepeat = sal_False;

    nLeftMargin = 0;
    nRightMargin = 0;

    const Color& rBorderColor = pOptions->aBorderColor;

    long nBorderOpt = (long)pOptions->nBorder;
    long nPWidth = nBorderOpt==USHRT_MAX ? NETSCAPE_DFLT_BORDER
                                         : nBorderOpt;
    long nPHeight = nBorderOpt==USHRT_MAX ? 0 : nBorderOpt;
    SvxCSS1Parser::PixelToTwip( nPWidth, nPHeight );

    // nBorder gibt die Breite der Umrandung an, wie sie in die
    // Breitenberechnung in Netscape einfliesst. Wenn pOption->nBorder
    // == USHRT_MAX, wurde keine BORDER-Option angegeben. Trotzdem fliesst
    // eine 1 Pixel breite Umrandung in die Breitenberechnung mit ein.
    nBorder = (sal_uInt16)nPWidth;
    if( nBorderOpt==USHRT_MAX )
        nPWidth = 0;

    // HACK: ein Pixel-breite Linien sollen zur Haarlinie werden, wenn
    // wir mit doppelter Umrandung arbeiten
    if( pOptions->nCellSpacing!=0 && nBorderOpt==1 )
    {
        nPWidth = 1;
        nPHeight = 1;
    }

    SvxCSS1Parser::SetBorderWidth( aTopBorderLine, (sal_uInt16)nPHeight,
                                   pOptions->nCellSpacing!=0, sal_True );
    aTopBorderLine.SetColor( rBorderColor );
    aBottomBorderLine = aTopBorderLine;

    if( nPWidth == nPHeight )
    {
        aLeftBorderLine = aTopBorderLine;
    }
    else
    {
        SvxCSS1Parser::SetBorderWidth( aLeftBorderLine, (sal_uInt16)nPWidth,
                                       pOptions->nCellSpacing!=0, sal_True );
        aLeftBorderLine.SetColor( rBorderColor );
    }
    aRightBorderLine = aLeftBorderLine;

    if( pOptions->nCellSpacing != 0 )
    {
        aBorderLine.SetOutWidth( DEF_DOUBLE_LINE7_OUT );
        aBorderLine.SetInWidth( DEF_DOUBLE_LINE7_IN );
        aBorderLine.SetDistance( DEF_DOUBLE_LINE7_DIST );
    }
    else
    {
        aBorderLine.SetOutWidth( DEF_LINE_WIDTH_1 );
    }
    aBorderLine.SetColor( rBorderColor );

    if( nCellPadding )
    {
        if( nCellPadding==USHRT_MAX )
            nCellPadding = MIN_BORDER_DIST; // default
        else
        {
            nCellPadding = pParser->ToTwips( nCellPadding );
            if( nCellPadding<MIN_BORDER_DIST  )
                nCellPadding = MIN_BORDER_DIST;
        }
    }
    if( nCellSpacing )
    {
        if( nCellSpacing==USHRT_MAX )
            nCellSpacing = NETSCAPE_DFLT_CELLSPACING;
        nCellSpacing = pParser->ToTwips( nCellSpacing );
    }

    nPWidth = pOptions->nHSpace;
    nPHeight = pOptions->nVSpace;
    SvxCSS1Parser::PixelToTwip( nPWidth, nPHeight );
    nHSpace = (sal_uInt16)nPWidth;
    nVSpace = (sal_uInt16)nPHeight;

    bColSpec = sal_False;

    pBGBrush = pParser->CreateBrushItem(
                    pOptions->bBGColor ? &(pOptions->aBGColor) : 0,
                    pOptions->aBGImage, aEmptyStr, aEmptyStr, aEmptyStr );

    pContext = 0;
    pParentContents = 0;

    aId = pOptions->aId;
    aClass = pOptions->aClass;
    aStyle = pOptions->aStyle;
}

HTMLTable::HTMLTable( SwHTMLParser* pPars, HTMLTable *pTopTab,
                      sal_Bool bParHead,
                      sal_Bool bHasParentSec, sal_Bool bTopTbl, sal_Bool bHasToFlw,
                      const HTMLTableOptions *pOptions ) :
    nCols( pOptions->nCols ),
    nFilledCols( 0 ),
    nWidth( pOptions->nWidth ), bPrcWidth( pOptions->bPrcWidth ),
    nHeight( pTopTab ? 0 : pOptions->nHeight ),
    nBoxes( 1 ),
    eTableAdjust( pOptions->eAdjust ),
    bTableAdjustOfTag( pTopTab ? sal_False : pOptions->bTableAdjust ),
    eVertOri( pOptions->eVertOri ),
    eFrame( pOptions->eFrame ), eRules( pOptions->eRules ),
    nCellPadding( pOptions->nCellPadding ),
    nCellSpacing( pOptions->nCellSpacing ),
    pParser( pPars ), pTopTable( pTopTab ? pTopTab : this ),
    pCaptionStartNode( 0 ),
    bFirstCell( !pTopTab ),
    bIsParentHead( bParHead ),
    bHasParentSection( bHasParentSec ), bMakeTopSubTable( bTopTbl ),
    bHasToFly( bHasToFlw ),
    bFixedCols( pOptions->nCols>0 ), bTopCaption( sal_False ),
    pLayoutInfo( 0 )
{
    InitCtor( pOptions );

    for( sal_uInt16 i=0; i<nCols; i++ )
        pColumns->Insert( new HTMLTableColumn, pColumns->Count() );
}


HTMLTable::~HTMLTable()
{
    delete pResizeDrawObjs;
    delete pDrawObjPrcWidths;

    delete pRows;
    delete pColumns;
    delete pBGBrush;
    delete pInhBGBrush;

    delete pContext;

    // pLayoutInfo wurde entweder bereits geloescht oder muss aber es
    // in den Besitz der SwTable uebergegangen.
}

SwHTMLTableLayout *HTMLTable::CreateLayoutInfo()
{
    sal_uInt16 nW = bPrcWidth ? nWidth : pParser->ToTwips( nWidth );

    sal_uInt16 nBorderWidth = GetBorderWidth( aBorderLine, sal_True );
    sal_uInt16 nLeftBorderWidth =
        ((*pColumns)[0])->bLeftBorder ? GetBorderWidth( aLeftBorderLine, sal_True ) : 0;
    sal_uInt16 nRightBorderWidth =
        bRightBorder ? GetBorderWidth( aRightBorderLine, sal_True ) : 0;
    sal_uInt16 nInhLeftBorderWidth = 0;
    sal_uInt16 nInhRightBorderWidth = 0;

    pLayoutInfo = new SwHTMLTableLayout(
                        pSwTable,
                        nRows, nCols, bFixedCols, bColSpec,
                        nW, bPrcWidth, nBorder, nCellPadding,
                        nCellSpacing, eTableAdjust,
                        nLeftMargin, nRightMargin,
                        nBorderWidth, nLeftBorderWidth, nRightBorderWidth,
                        nInhLeftBorderWidth, nInhRightBorderWidth );

    sal_Bool bExportable = sal_True;
    sal_uInt16 i;
    for( i=0; i<nRows; i++ )
    {
        HTMLTableRow *pRow = (*pRows)[i];
        for( sal_uInt16 j=0; j<nCols; j++ )
        {
            SwHTMLTableLayoutCell *pLayoutCell =
                pRow->GetCell(j)->CreateLayoutInfo();

            pLayoutInfo->SetCell( pLayoutCell, i, j );

            if( bExportable )
            {
                SwHTMLTableLayoutCnts *pLayoutCnts =
                    pLayoutCell->GetContents();
                bExportable = !pLayoutCnts ||
                              ( pLayoutCnts->GetStartNode() &&
                                !pLayoutCnts->GetNext() );
            }
        }
    }

    pLayoutInfo->SetExportable( bExportable );

    for( i=0; i<nCols; i++ )
        pLayoutInfo->SetColumn( ((*pColumns)[i])->CreateLayoutInfo(), i );

    return pLayoutInfo;
}

inline void HTMLTable::SetCaption( const SwStartNode *pStNd, sal_Bool bTop )
{
    pCaptionStartNode = pStNd;
    bTopCaption = bTop;
}

void HTMLTable::FixRowSpan( sal_uInt16 nRow, sal_uInt16 nCol,
                            const HTMLTableCnts *pCnts )
{
    sal_uInt16 nRowSpan=1;
    HTMLTableCell *pCell;
    while( ( pCell=GetCell(nRow,nCol), pCell->GetContents()==pCnts ) )
    {
        pCell->SetRowSpan( nRowSpan );
        if( pLayoutInfo )
            pLayoutInfo->GetCell(nRow,nCol)->SetRowSpan( nRowSpan );

        if( !nRow ) break;
        nRowSpan++; nRow--;
    }
}

void HTMLTable::ProtectRowSpan( sal_uInt16 nRow, sal_uInt16 nCol, sal_uInt16 nRowSpan )
{
    for( sal_uInt16 i=0; i<nRowSpan; i++ )
    {
        GetCell(nRow+i,nCol)->SetProtected();
        if( pLayoutInfo )
            pLayoutInfo->GetCell(nRow+i,nCol)->SetProtected();
    }
}


// Suchen des SwStartNodes der letzten belegten Vorgaengerbox
const SwStartNode* HTMLTable::GetPrevBoxStartNode( sal_uInt16 nRow, sal_uInt16 nCol ) const
{
    const HTMLTableCnts *pPrevCnts = 0;

    if( 0==nRow )
    {
        // immer die Vorgaenger-Zelle
        if( nCol>0 )
            pPrevCnts = GetCell( 0, nCol-1 )->GetContents();
        else
            return pPrevStNd;
    }
    else if( USHRT_MAX==nRow && USHRT_MAX==nCol )
        // der Contents der letzten Zelle
        pPrevCnts = GetCell( nRows-1, nCols-1 )->GetContents();
    else
    {
        sal_uInt16 i;
        HTMLTableRow *pPrevRow = (*pRows)[nRow-1];

        // evtl. eine Zelle in der aktuellen Zeile
        i = nCol;
        while( i )
        {
            i--;
            if( 1 == pPrevRow->GetCell(i)->GetRowSpan() )
            {
                pPrevCnts = GetCell(nRow,i)->GetContents();
                break;
            }
        }

        // sonst die letzte gefuellte Zelle der Zeile davor suchen
        if( !pPrevCnts )
        {
            i = nCols;
            while( !pPrevCnts && i )
            {
                i--;
                pPrevCnts = pPrevRow->GetCell(i)->GetContents();
            }
        }
    }
    ASSERT( pPrevCnts, "keine gefuellte Vorgaenger-Zelle gefunden" );
    if( !pPrevCnts )
    {
        pPrevCnts = GetCell(0,0)->GetContents();
        if( !pPrevCnts )
            return pPrevStNd;
    }

    while( pPrevCnts->Next() )
        pPrevCnts = pPrevCnts->Next();

    return ( pPrevCnts->GetStartNode() ? pPrevCnts->GetStartNode()
               : pPrevCnts->GetTable()->GetPrevBoxStartNode( USHRT_MAX, USHRT_MAX ) );
}


static sal_Bool IsBoxEmpty( const SwTableBox *pBox )
{
    const SwStartNode *pSttNd = pBox->GetSttNd();
    if( pSttNd &&
        pSttNd->GetIndex() + 2 == pSttNd->EndOfSectionIndex() )
    {
        const SwCntntNode *pCNd =
            pSttNd->GetNodes()[pSttNd->GetIndex()+1]->GetCntntNode();
        if( pCNd && !pCNd->Len() )
            return sal_True;
    }

    return sal_False;
}

sal_uInt16 HTMLTable::GetTopCellSpace( sal_uInt16 nRow, sal_uInt16 nRowSpan,
                                   sal_Bool bSwBorders ) const
{
    sal_uInt16 nSpace = nCellPadding;

    if( nRow == 0 )
    {
        nSpace += nBorder + nCellSpacing;
        if( bSwBorders )
        {
            sal_uInt16 nTopBorderWidth =
                GetBorderWidth( aTopBorderLine, sal_True );
            if( nSpace < nTopBorderWidth )
                nSpace = nTopBorderWidth;
        }
    }
    else if( bSwBorders && ((*pRows)[nRow+nRowSpan-1])->bBottomBorder &&
             nSpace < MIN_BORDER_DIST )
    {
        ASSERT( !nCellPadding, "GetTopCellSpace: CELLPADDING!=0" );
        // Wenn die Gegenueberliegende Seite umrandet ist muessen
        // wir zumindest den minimalen Abstand zum Inhalt
        // beruecksichtigen. (Koennte man zusaetzlich auch an
        // nCellPadding festmachen.)
        nSpace = MIN_BORDER_DIST;
    }

    return nSpace;
}

sal_uInt16 HTMLTable::GetBottomCellSpace( sal_uInt16 nRow, sal_uInt16 nRowSpan,
                                      sal_Bool bSwBorders ) const
{
    sal_uInt16 nSpace = nCellSpacing + nCellPadding;

    if( nRow+nRowSpan == nRows )
    {
        nSpace += nBorder;

        if( bSwBorders )
        {
            sal_uInt16 nBottomBorderWidth =
                GetBorderWidth( aBottomBorderLine, sal_True );
            if( nSpace < nBottomBorderWidth )
                nSpace = nBottomBorderWidth;
        }
    }
    else if( bSwBorders )
    {
        if( ((*pRows)[nRow+nRowSpan+1])->bBottomBorder )
        {
            sal_uInt16 nBorderWidth = GetBorderWidth( aBorderLine, sal_True );
            if( nSpace < nBorderWidth )
                nSpace = nBorderWidth;
        }
        else if( nRow==0 && bTopBorder && nSpace < MIN_BORDER_DIST )
        {
            ASSERT( GetBorderWidth( aTopBorderLine, sal_True ) > 0,
                    "GetBottomCellSpace: |aTopLine| == 0" );
            ASSERT( !nCellPadding, "GetBottomCellSpace: CELLPADDING!=0" );
            // Wenn die Gegenueberliegende Seite umrandet ist muessen
            // wir zumindest den minimalen Abstand zum Inhalt
            // beruecksichtigen. (Koennte man zusaetzlich auch an
            // nCellPadding festmachen.)
            nSpace = MIN_BORDER_DIST;
        }
    }

    return nSpace;
}

void HTMLTable::FixFrameFmt( SwTableBox *pBox,
                             sal_uInt16 nRow, sal_uInt16 nCol,
                             sal_uInt16 nRowSpan, sal_uInt16 nColSpan,
                             sal_Bool bFirstPara, sal_Bool bLastPara ) const
{
    SwFrmFmt *pFrmFmt = 0;      // ::com::sun::star::frame::Frame-Format
    SwVertOrient eVOri = VERT_NONE;
    const SvxBrushItem *pBGBrush = 0;   // Hintergrund
    sal_Bool bTopLine = sal_False, bBottomLine = sal_False, bLastBottomLine = sal_False;
    sal_Bool bReUsable = sal_False;     // Format nochmals verwendbar?
    sal_uInt16 nEmptyRows = 0;
    sal_Bool bHasNumFmt = sal_False;
    sal_Bool bHasValue = sal_False;
    sal_uInt32 nNumFmt;
    double nValue;

    HTMLTableColumn *pColumn = (*pColumns)[nCol];

    if( pBox->GetSttNd() )
    {
        // die Hintergrundfarbe/-grafik bestimmen
        const HTMLTableCell *pCell = GetCell( nRow, nCol );
        pBGBrush = pCell->GetBGBrush();
        if( !pBGBrush )
        {
            // Wenn die Zelle ueber mehrere Zeilen geht muss ein evtl.
            // an der Zeile gesetzter Hintergrund an die Zelle uebernommen
            // werden.
#ifndef FIX56334
            // Wenn es sich um eine Tabelle in der Tabelle handelt und
            // die Zelle ueber die gesamte Heoehe der Tabelle geht muss
            // ebenfalls der Hintergrund der Zeile uebernommen werden, weil
            // die Line von der GC (zu Recht) wegoptimiert wird.
            if( nRowSpan > 1 || (this != pTopTable && nRowSpan==nRows) )
#else
            if( nRowSpan > 1 )
#endif
            {
                pBGBrush = ((*pRows)[nRow])->GetBGBrush();
                if( !pBGBrush && this != pTopTable )
                {
                    pBGBrush = GetBGBrush();
                    if( !pBGBrush )
                        pBGBrush = GetInhBGBrush();
                }
            }
        }

        bTopLine = 0==nRow && bTopBorder && bFirstPara;
        if( ((*pRows)[nRow+nRowSpan-1])->bBottomBorder && bLastPara )
        {
            nEmptyRows = ((*pRows)[nRow+nRowSpan-1])->GetEmptyRows();
            if( nRow+nRowSpan == nRows )
                bLastBottomLine = sal_True;
            else
                bBottomLine = sal_True;
        }

        eVOri = pCell->GetVertOri();
        bHasNumFmt = pCell->GetNumFmt( nNumFmt );
        if( bHasNumFmt )
            bHasValue = pCell->GetValue( nValue );

        if( nColSpan==1 && !bTopLine && !bLastBottomLine && !nEmptyRows &&
            !pBGBrush && !bHasNumFmt )
        {
            pFrmFmt = pColumn->GetFrmFmt( bBottomLine, eVOri );
            bReUsable = !pFrmFmt;
        }
    }

    if( !pFrmFmt )
    {
        pFrmFmt = pBox->ClaimFrmFmt();

        // die Breite der Box berechnen
        SwTwips nFrmWidth = (SwTwips)pLayoutInfo->GetColumn(nCol)
                                                ->GetRelColWidth();
        for( sal_uInt16 i=1; i<nColSpan; i++ )
            nFrmWidth += (SwTwips)pLayoutInfo->GetColumn(nCol+i)
                                             ->GetRelColWidth();

        // die Umrandung nur an Edit-Boxen setzen (bei der oberen und unteren
        // Umrandung muss beruecks. werden, ob es sich um den ersten oder
        // letzen Absatz der Zelle handelt)
        if( pBox->GetSttNd() )
        {
            sal_Bool bSet = (nCellPadding > 0);

            SvxBoxItem aBoxItem;
            long nInnerFrmWidth = nFrmWidth;

            if( bTopLine )
            {
                aBoxItem.SetLine( &aTopBorderLine, BOX_LINE_TOP );
                bSet = sal_True;
            }
            if( bLastBottomLine )
            {
                aBoxItem.SetLine( &aBottomBorderLine, BOX_LINE_BOTTOM );
                bSet = sal_True;
            }
            else if( bBottomLine )
            {
                if( nEmptyRows && !aBorderLine.GetInWidth() )
                {
                    // Leere Zeilen koennen zur Zeit nur dann ueber
                    // dicke Linien simuliert werden, wenn die Linie
                    // einfach ist.
                    SvxBorderLine aThickBorderLine( aBorderLine );

                    sal_uInt16 nBorderWidth = aBorderLine.GetOutWidth();
                    nBorderWidth *= (nEmptyRows + 1);
                    SvxCSS1Parser::SetBorderWidth( aThickBorderLine,
                                                   nBorderWidth, sal_False );
                    aBoxItem.SetLine( &aThickBorderLine, BOX_LINE_BOTTOM );
                }
                else
                {
                    aBoxItem.SetLine( &aBorderLine, BOX_LINE_BOTTOM );
                }
                bSet = sal_True;
            }
            if( ((*pColumns)[nCol])->bLeftBorder )
            {
                const SvxBorderLine& rBorderLine =
                    0==nCol ? aLeftBorderLine : aBorderLine;
                aBoxItem.SetLine( &rBorderLine, BOX_LINE_LEFT );
                nInnerFrmWidth -= GetBorderWidth( rBorderLine );
                bSet = sal_True;
            }
            if( nCol+nColSpan == nCols && bRightBorder )
            {
                aBoxItem.SetLine( &aRightBorderLine, BOX_LINE_RIGHT );
                nInnerFrmWidth -= GetBorderWidth( aRightBorderLine );
                bSet = sal_True;
            }

            if( bSet )
            {
                // fix #30588#: BorderDist nicht mehr Bestandteil
                // einer Zelle mit fixer Breite
                sal_uInt16 nBDist =
                    (2*nCellPadding <= nInnerFrmWidth) ? nCellPadding
                                                      : (nInnerFrmWidth / 2);
                // wir setzen das Item nur, wenn es eine Umrandung gibt
                // oder eine ::com::sun::star::sheet::Border-Distanz vorgegeben ist. Fehlt letztere,
                // dann gibt es eine Umrandung, und wir muessen die Distanz
                // setzen
                aBoxItem.SetDistance( nBDist ? nBDist : MIN_BORDER_DIST );
                pFrmFmt->SetAttr( aBoxItem );
            }
            else
                pFrmFmt->ResetAttr( RES_BOX );

            if( pBGBrush )
            {
                pFrmFmt->SetAttr( *pBGBrush );
            }
            else
                pFrmFmt->ResetAttr( RES_BACKGROUND );

            // fix #41003#: Format nur setzten, wenn es auch einen Value
            // gibt oder die Box leer ist.
            if( bHasNumFmt && (bHasValue || IsBoxEmpty(pBox)) )
            {
                sal_Bool bLock = pFrmFmt->GetDoc()->GetNumberFormatter()
                                     ->IsTextFormat( nNumFmt );
                SfxItemSet aItemSet( *pFrmFmt->GetAttrSet().GetPool(),
                                     RES_BOXATR_FORMAT, RES_BOXATR_VALUE );
                SvxAdjust eAdjust = SVX_ADJUST_END;
                SwCntntNode *pCNd = 0;
                if( !bLock )
                {
                    const SwStartNode *pSttNd = pBox->GetSttNd();
                    pCNd = pSttNd->GetNodes()[pSttNd->GetIndex()+1]
                                 ->GetCntntNode();
                    const SfxPoolItem *pItem;
                    if( pCNd && pCNd->GetpSwAttrSet() &&
                        SFX_ITEM_SET==pCNd->GetpSwAttrSet()->GetItemState(
                            RES_PARATR_ADJUST, sal_False, &pItem ) )
                    {
                        eAdjust = ((const SvxAdjustItem *)pItem)
                            ->GetAdjust();
                    }
                }
                aItemSet.Put( SwTblBoxNumFormat(nNumFmt) );
                if( bHasValue )
                    aItemSet.Put( SwTblBoxValue(nValue) );

                if( bLock )
                    pFrmFmt->LockModify();
                pFrmFmt->SetAttr( aItemSet );
                if( bLock )
                    pFrmFmt->UnlockModify();
                else if( pCNd && SVX_ADJUST_END != eAdjust )
                {
                    SvxAdjustItem aAdjItem( eAdjust );
                    pCNd->SetAttr( aAdjItem );
                }
            }
            else
                pFrmFmt->ResetAttr( RES_BOXATR_FORMAT );

            ASSERT( eVOri != VERT_TOP, "VERT_TOP ist nicht erlaubt!" );
            if( VERT_NONE != eVOri )
            {
                pFrmFmt->SetAttr( SwFmtVertOrient( 0, eVOri ) );
            }
            else
                pFrmFmt->ResetAttr( RES_VERT_ORIENT );

            if( bReUsable )
                pColumn->SetFrmFmt( pFrmFmt, bBottomLine, eVOri );
        }
        else
        {
            pFrmFmt->ResetAttr( RES_BOX );
            pFrmFmt->ResetAttr( RES_BACKGROUND );
            pFrmFmt->ResetAttr( RES_VERT_ORIENT );
            pFrmFmt->ResetAttr( RES_BOXATR_FORMAT );
        }
    }
    else
    {
        ASSERT( pBox->GetSttNd() ||
                SFX_ITEM_SET!=pFrmFmt->GetAttrSet().GetItemState(
                                    RES_VERT_ORIENT, sal_False ),
                "Box ohne Inhalt hat vertikale Ausrichtung" );
        pBox->ChgFrmFmt( (SwTableBoxFmt*)pFrmFmt );
    }

}

void HTMLTable::FixFillerFrameFmt( SwTableBox *pBox, sal_Bool bRight ) const
{
    SwFrmFmt *pFrmFmt = pBox->ClaimFrmFmt();

    if( bFillerTopBorder || bFillerBottomBorder ||
        (!bRight && bInhLeftBorder) || (bRight && bInhRightBorder) )
    {
        SvxBoxItem aBoxItem;
        if( bFillerTopBorder )
            aBoxItem.SetLine( &aTopBorderLine, BOX_LINE_TOP );
        if( bFillerBottomBorder )
            aBoxItem.SetLine( &aBottomBorderLine, BOX_LINE_BOTTOM );
        if( !bRight && bInhLeftBorder )
            aBoxItem.SetLine( &aInhLeftBorderLine, BOX_LINE_LEFT );
        if( bRight && bInhRightBorder )
            aBoxItem.SetLine( &aInhRightBorderLine, BOX_LINE_RIGHT );
        aBoxItem.SetDistance( MIN_BORDER_DIST );
        pFrmFmt->SetAttr( aBoxItem );
    }
    else
    {
        pFrmFmt->ResetAttr( RES_BOX );
    }

    if( GetInhBGBrush() )
        pFrmFmt->SetAttr( *GetInhBGBrush() );
    else
        pFrmFmt->ResetAttr( RES_BACKGROUND );

    pFrmFmt->ResetAttr( RES_VERT_ORIENT );
    pFrmFmt->ResetAttr( RES_BOXATR_FORMAT );
}

SwTableBox *HTMLTable::NewTableBox( const SwStartNode *pStNd,
                                    SwTableLine *pUpper ) const
{
    SwTableBox *pBox;

    if( pTopTable->pBox1 &&
        pTopTable->pBox1->GetSttNd() == pStNd )
    {
        // wenn der StartNode dem StartNode der initial angelegten Box
        // entspricht nehmen wir diese Box
        pBox = pTopTable->pBox1;
        pBox->SetUpper( pUpper );
        pTopTable->pBox1 = 0;
    }
    else
        pBox = new SwTableBox( pBoxFmt, *pStNd, pUpper );

    return pBox;
}


static void ResetLineFrmFmtAttrs( SwFrmFmt *pFrmFmt )
{
    pFrmFmt->ResetAttr( RES_FRM_SIZE );
    pFrmFmt->ResetAttr( RES_BACKGROUND );
    ASSERT( SFX_ITEM_SET!=pFrmFmt->GetAttrSet().GetItemState(
                                RES_VERT_ORIENT, sal_False ),
            "Zeile hat vertikale Ausrichtung" );
}

// !!! kann noch vereinfacht werden
SwTableLine *HTMLTable::MakeTableLine( SwTableBox *pUpper,
                                       sal_uInt16 nTopRow, sal_uInt16 nLeftCol,
                                       sal_uInt16 nBottomRow, sal_uInt16 nRightCol )
{
    SwTableLine *pLine;
    if( this==pTopTable && !pUpper && 0==nTopRow )
        pLine = (pSwTable->GetTabLines())[0];
    else
        pLine = new SwTableLine( pLineFrmFmtNoHeight ? pLineFrmFmtNoHeight
                                                     : pLineFmt,
                                 0, pUpper );

    HTMLTableRow *pTopRow = (*pRows)[nTopRow];
    sal_uInt16 nHeight = pTopRow->GetHeight();
    const SvxBrushItem *pBGBrush = 0;
#ifndef FIX56334
    if( this == pTopTable || nTopRow>0 || nBottomRow<nRows )
    {
        // An der Line eine Frabe zu setzen macht keinen Sinn, wenn sie
        // die auesserste und gleichzeitig einzige Zeile einer Tabelle in
        // der Tabelle ist.
#endif
        pBGBrush = pTopRow->GetBGBrush();

        if( !pBGBrush && this != pTopTable )
        {
            // Ein an einer Tabellen in der Tabelle gesetzter Hintergrund
            // wird an den Rows gesetzt. Das gilt auch fuer den Hintergrund
            // der Zelle, in dem die Tabelle vorkommt.
            pBGBrush = GetBGBrush();
            if( !pBGBrush )
                pBGBrush = GetInhBGBrush();
        }
#ifndef FIX56334
    }
#endif
    if( nTopRow==nBottomRow-1 && (nHeight || pBGBrush) )
    {
        SwTableLineFmt *pFrmFmt = (SwTableLineFmt*)pLine->ClaimFrmFmt();
        ResetLineFrmFmtAttrs( pFrmFmt );

        if( nHeight )
        {
            // Tabellenhoehe einstellen. Da es sich um eine
            // Mindesthoehe handelt, kann sie genauso wie in
            // Netscape berechnet werden, also ohne Beruecksichtigung
            // der tatsaechlichen Umrandungsbreite.
            nHeight += GetTopCellSpace( nTopRow, 1, sal_False ) +
                       GetBottomCellSpace( nTopRow, 1, sal_False );

            pFrmFmt->SetAttr( SwFmtFrmSize( ATT_MIN_SIZE, 0, nHeight ) );
        }

        if( pBGBrush )
        {
            pFrmFmt->SetAttr( *pBGBrush );
        }

    }
    else if( !pLineFrmFmtNoHeight )
    {
        // sonst muessen wir die Hoehe aus dem Attribut entfernen
        // und koennen uns das Format merken
        pLineFrmFmtNoHeight = (SwTableLineFmt*)pLine->ClaimFrmFmt();

        ResetLineFrmFmtAttrs( pLineFrmFmtNoHeight );
    }


    SwTableBoxes& rBoxes = pLine->GetTabBoxes();

    sal_uInt16 nStartCol = nLeftCol;
    while( nStartCol<nRightCol )
    {
        for( sal_uInt16 nRow=nTopRow; nRow<nBottomRow; nRow++ )
            (*pRows)[nRow]->SetSplitable( sal_True );

        sal_uInt16 nCol = nStartCol;
        sal_uInt16 nSplitCol = nRightCol;
        sal_Bool bSplitted = sal_False;
        while( !bSplitted )
        {
            ASSERT( nCol < nRightCol, "Zu weit gelaufen" );

            // Kann hinter der aktuellen HTML-Tabellen-Spalte gesplittet
            // werden? Wenn ja, koennte der enstehende Bereich auch noch
            // in Zeilen zerlegt werden, wenn man die naechste Spalte
            // hinzunimmt?
            sal_Bool bSplit = sal_True;
            sal_Bool bHoriSplitMayContinue = sal_False;
            sal_Bool bHoriSplitPossible = sal_False;
            for( sal_uInt16 nRow=nTopRow; nRow<nBottomRow; nRow++ )
            {
                HTMLTableCell *pCell = GetCell(nRow,nCol);
                // Gibt es in allen vorhergehenden Spalten und der gerade
                // btrachteten Zeile eine gemeinsame Zeile?
                sal_Bool bHoriSplit = (*pRows)[nRow]->IsSplitable() &&
                                  nRow+1 < nBottomRow &&
                                  1 == pCell->GetRowSpan();
                (*pRows)[nRow]->SetSplitable( bHoriSplit );

                bSplit &= ( 1 == pCell->GetColSpan() );
                if( bSplit )
                {
                    bHoriSplitPossible |= bHoriSplit;

                    // Gilt das eventuell auch noch, wenn man die naechste
                    // Spalte hinzunimmt?
                    bHoriSplit &= (nCol+1 < nRightCol &&
                                   1 == GetCell(nRow,nCol+1)->GetRowSpan());
                    bHoriSplitMayContinue |= bHoriSplit;
                }
            }

#ifndef PRODUCT
            if( nCol == nRightCol-1 )
            {
                ASSERT( bSplit, "Split-Flag falsch" );
                ASSERT( !bHoriSplitMayContinue,
                        "HoriSplitMayContinue-Flag falsch" );
                HTMLTableCell *pCell = GetCell( nTopRow, nStartCol );
                ASSERT( pCell->GetRowSpan() != (nBottomRow-nTopRow) ||
                        !bHoriSplitPossible, "HoriSplitPossible-Flag falsch" );
            }
#endif
            ASSERT( !bHoriSplitMayContinue || bHoriSplitPossible,
                    "bHoriSplitMayContinue, aber nicht bHoriSplitPossible" );

            if( bSplit )
            {
                SwTableBox* pBox = 0;
                HTMLTableCell *pCell = GetCell( nTopRow, nStartCol );
                if( pCell->GetRowSpan() == (nBottomRow-nTopRow) &&
                    pCell->GetColSpan() == (nCol+1-nStartCol) )
                {
                    // Die HTML-Tabellen-Zellen bilden genau eine Box.
                    // Dann muss hinter der Box gesplittet werden
                    nSplitCol = nCol + 1;

                    // eventuell ist die Zelle noch leer
                    if( !pCell->GetContents() )
                    {
                        ASSERT( 1==pCell->GetRowSpan(),
                                "leere Box ist nicht 1 Zeile hoch" );
                        const SwStartNode* pPrevStNd =
                            GetPrevBoxStartNode( nTopRow, nStartCol );
                        HTMLTableCnts *pCnts = new HTMLTableCnts(
                            pParser->InsertTableSection(pPrevStNd) );
                        SwHTMLTableLayoutCnts *pCntsLayoutInfo =
                            pCnts->CreateLayoutInfo();

                        pCell->SetContents( pCnts );
                        pLayoutInfo->GetCell( nTopRow, nStartCol )
                                   ->SetContents( pCntsLayoutInfo );

                        // ggf. COLSPAN beachten
                        for( sal_uInt16 j=nStartCol+1; j<nSplitCol; j++ )
                        {
                            GetCell(nTopRow,j)->SetContents( pCnts );
                            pLayoutInfo->GetCell( nTopRow, j )
                                       ->SetContents( pCntsLayoutInfo );
                        }
                    }
                    pBox = MakeTableBox( pLine, pCell->GetContents(),
                                         nTopRow, nStartCol,
                                         nBottomRow, nSplitCol );
                    bSplitted = sal_True;
                }
                else if( bHoriSplitPossible && bHoriSplitMayContinue )
                {
                    // Bis hierher lies sich die Box noch in Zeilen zerlegen
                    // und evetutell gillt das auch noch, wenn man die
                    // naechste hinzunimmt. Dann suchen wir weiter, merken
                    // uns aber die Position als moegliche Split-Position.
                    nSplitCol = nCol + 1;
                }
                else
                {
                    // Wenn sich die Box bis hier her noch in Zeilen
                    // zerlegen lies, durch hinzunahmen noch einer
                    // Spalte aber nicht mehr, dann wird genau hinter
                    // dieser Splate gesplittet. (#55447#: Das gilt
                    // insbesondere auch fuer die letzte Spalte).
                    // Hinter der aktuellen Spalte wurd ausserdem gesplittet,
                    // wenn bisher noch gar keine andere Split-Position
                    // gefunden wurde.
                    // In allen anderen Faellen wird die bisher gemerkte
                    // Split-Position benutzt.
                    if( bHoriSplitPossible || nSplitCol > nCol+1 )
                    {
                        ASSERT( !bHoriSplitMayContinue,
                                "bHoriSplitMayContinue==sal_True" );
                        ASSERT( bHoriSplitPossible || nSplitCol == nRightCol,
                                "bHoriSplitPossible-Flag sollte gesetzt sein" );

                        nSplitCol = nCol + 1;
                    }

                    // Wenn die enstehende Box nicht mehr in Zeilen zerlegt
                    // werden kann, wenn man die naechste Spalte hinzunimmt
                    // muss man ebenfalls Splitten.
                    pBox = MakeTableBox( pLine, nTopRow, nStartCol,
                                         nBottomRow, nSplitCol );
                    bSplitted = sal_True;
                }
                if( pBox )
                    rBoxes.C40_INSERT( SwTableBox, pBox, rBoxes.Count() );
            }
            nCol++;
        }
        nStartCol = nSplitCol;
    }

    return pLine;
}

// Fuellen einer SwTableBox
// !!! kann noch vereinfacht werden
SwTableBox *HTMLTable::MakeTableBox( SwTableLine *pUpper,
                                     sal_uInt16 nTopRow, sal_uInt16 nLeftCol,
                                     sal_uInt16 nBottomRow, sal_uInt16 nRightCol )
{
    SwTableBox *pBox = new SwTableBox( pBoxFmt, 0, pUpper );
    FixFrameFmt( pBox, nTopRow, nLeftCol,
                 nTopRow-nBottomRow, nRightCol-nLeftCol );

    SwTableLines& rLines = pBox->GetTabLines();
    sal_Bool bSplitted = sal_False;

    while( !bSplitted )
    {
        sal_uInt16 nStartRow = nTopRow;
        for( sal_uInt16 i=nTopRow; i<nBottomRow; i++ )
        {
            // kann hinter der aktuellen HTML-Tabellen-Zeile gesplittet werden?
            sal_Bool bSplit = sal_True;
            HTMLTableRow *pRow = (*pRows)[i];
            for( sal_uInt16 j=nLeftCol; j<nRightCol; j++ )
            {
                bSplit = ( 1 == pRow->GetCell(j)->GetRowSpan() );
                if( !bSplit )
                    break;
            }
            if( bSplit && (nStartRow>nTopRow || i+1<nBottomRow) )
            {
                // kein Spezialfall fuer die erste Zeile neotig, da wir hier
                // in einer Box und nicht in der Tabelle sind
                SwTableLine *pLine = MakeTableLine( pBox, nStartRow, nLeftCol, i+1, nRightCol );

                rLines.C40_INSERT( SwTableLine, pLine, rLines.Count() );

                nStartRow = i+1;
                bSplitted = sal_True;
            }
        }
        if( !bSplitted )
        {
            // jetzt muessen wir die Zelle mit Gewalt Teilen

            nStartRow = nTopRow;
            while( nStartRow < nBottomRow )
            {
                sal_uInt16 nMaxRowSpan=0;
                HTMLTableRow *pStartRow = (*pRows)[nStartRow];
                HTMLTableCell *pCell;
                for( i=nLeftCol; i<nRightCol; i++ )
                    if( ( pCell=pStartRow->GetCell(i),
                          pCell->GetRowSpan() > nMaxRowSpan ) )
                        nMaxRowSpan = pCell->GetRowSpan();

                nStartRow += nMaxRowSpan;
                if( nStartRow<nBottomRow )
                {
                    HTMLTableRow *pPrevRow = (*pRows)[nStartRow-1];
                    for( i=nLeftCol; i<nRightCol; i++ )
                    {
                        if( pPrevRow->GetCell(i)->GetRowSpan() > 1 )
                        {
                            // Die Inhalte sind in der Zeile darueber (also
                            // der durch FixRowSpan bearbeiteten) verankert
                            // und koennen/mussen deshalb in den mit
                            // ProtectRowSpan bearbeitetebn Zeilen
                            // geloescht oder kopiert werden
                            HTMLTableCell *pCell = GetCell( nStartRow, i );
                            FixRowSpan( nStartRow-1, i, pCell->GetContents() );
                            ProtectRowSpan( nStartRow, i,
                                            pCell->GetRowSpan() );
                        }
                    }
                }
            }
            // und jetzt nochmal von vorne ...
        }
    }

    return pBox;
}


SwTableBox *HTMLTable::MakeTableBox( SwTableLine *pUpper,
                                     HTMLTableCnts *pCnts,
                                     sal_uInt16 nTopRow, sal_uInt16 nLeftCol,
                                     sal_uInt16 nBottomRow, sal_uInt16 nRightCol )
{
    SwTableBox *pBox;
    sal_uInt16 nColSpan = nRightCol - nLeftCol;
    sal_uInt16 nRowSpan = nBottomRow - nTopRow;

    if( !pCnts->Next() )
    {
        // nur eine Inhalts-Section
        if( pCnts->GetStartNode() )
        {
            // und die ist keine Tabelle
            pBox = NewTableBox( pCnts->GetStartNode(), pUpper );
            pCnts->SetTableBox( pBox );
        }
        else
        {
            pCnts->GetTable()->InheritVertBorders( this, nLeftCol,
                                                   nRightCol-nLeftCol );
            // und die ist eine Tabelle: dann bauen wir eine neue
            // Box und fuegen die Zeilen der Tabelle in die Zeilen
            // der Box ein
            pBox = new SwTableBox( pBoxFmt, 0, pUpper );
            sal_uInt16 nAbs, nRel;
            pLayoutInfo->GetAvail( nLeftCol, nColSpan, nAbs, nRel );
            sal_uInt16 nLSpace = pLayoutInfo->GetLeftCellSpace( nLeftCol, nColSpan );
            sal_uInt16 nRSpace = pLayoutInfo->GetRightCellSpace( nLeftCol, nColSpan );
            sal_uInt16 nInhSpace = pLayoutInfo->GetInhCellSpace( nLeftCol, nColSpan );
            pCnts->GetTable()->MakeTable( pBox, nAbs, nRel, nLSpace, nRSpace,
                                          nInhSpace );
        }
    }
    else
    {
        // mehrere Inhalts Sections: dann brauchen wir eine Box mit Zeilen
        pBox = new SwTableBox( pBoxFmt, 0, pUpper );
        SwTableLines& rLines = pBox->GetTabLines();
        sal_Bool bFirstPara = sal_True;

        while( pCnts )
        {
            if( pCnts->GetStartNode() )
            {
                // normale Absaetze werden zu einer Box in einer Zeile
                SwTableLine *pLine =
                    new SwTableLine( pLineFrmFmtNoHeight ? pLineFrmFmtNoHeight
                                                         : pLineFmt, 0, pBox );
                if( !pLineFrmFmtNoHeight )
                {
                    // Wenn es noch kein Line-Format ohne Hoehe gibt, koennen
                    // wir uns dieses her als soleches merken
                    pLineFrmFmtNoHeight = (SwTableLineFmt*)pLine->ClaimFrmFmt();

                    ResetLineFrmFmtAttrs( pLineFrmFmtNoHeight );
                }

                SwTableBox* pCntBox = NewTableBox( pCnts->GetStartNode(),
                                                   pLine );
                pCnts->SetTableBox( pCntBox );
                FixFrameFmt( pCntBox, nTopRow, nLeftCol, nRowSpan, nColSpan,
                             bFirstPara, 0==pCnts->Next() );
                pLine->GetTabBoxes().C40_INSERT( SwTableBox, pCntBox,
                                             pLine->GetTabBoxes().Count() );

                rLines.C40_INSERT( SwTableLine, pLine, rLines.Count() );
            }
            else
            {
                pCnts->GetTable()->InheritVertBorders( this, nLeftCol,
                                                       nRightCol-nLeftCol );
                // Tabellen werden direkt eingetragen
                sal_uInt16 nAbs, nRel;
                pLayoutInfo->GetAvail( nLeftCol, nColSpan, nAbs, nRel );
                sal_uInt16 nLSpace = pLayoutInfo->GetLeftCellSpace( nLeftCol,
                                                                nColSpan );
                sal_uInt16 nRSpace = pLayoutInfo->GetRightCellSpace( nLeftCol,
                                                                 nColSpan );
                sal_uInt16 nInhSpace = pLayoutInfo->GetInhCellSpace( nLeftCol, nColSpan );
                pCnts->GetTable()->MakeTable( pBox, nAbs, nRel, nLSpace,
                                              nRSpace, nInhSpace );
            }

            pCnts = pCnts->Next();
            bFirstPara = sal_False;
        }
    }

    FixFrameFmt( pBox, nTopRow, nLeftCol, nRowSpan, nColSpan );

    return pBox;
}

void HTMLTable::InheritBorders( const HTMLTable *pParent,
                                sal_uInt16 nRow, sal_uInt16 nCol,
                                sal_uInt16 nRowSpan, sal_uInt16 nColSpan,
                                sal_Bool bFirstPara, sal_Bool bLastPara )
{
    ASSERT( nRows>0 && nCols>0 && nCurRow==nRows,
            "Wurde CloseTable nicht aufgerufen?" );

    // Die Child-Tabelle muss einen Rahmen bekommen, wenn die umgebende
    // Zelle einen Rand an der betreffenden Seite besitzt.
    // Der obere bzw. untere Rand wird nur gesetzt, wenn die Tabelle
    // ale erster bzw. letzter Absatz in der Zelle vorkommt. Ansonsten
    // Fuer den linken/rechten Rand kann noch nicht entschieden werden,
    // ob eine Umrandung der Tabelle noetig/moeglich ist, weil das davon
    // abhaengt, ob "Filler"-Zellen eingefuegt werden. Hier werden deshalb
    // erstmal nur Informationen gesammelt
    //
    if( 0==nRow && pParent->bTopBorder && bFirstPara )
    {
        bTopBorder = sal_True;
        bFillerTopBorder = sal_True; // auch Filler bekommt eine Umrandung
        aTopBorderLine = pParent->aTopBorderLine;
    }
    if( ((*pParent->pRows)[nRow+nRowSpan-1])->bBottomBorder && bLastPara )
    {
        ((*pRows)[nRows-1])->bBottomBorder = sal_True;
        bFillerBottomBorder = sal_True; // auch Filler bekommt eine Umrandung
        aBottomBorderLine =
            nRow+nRowSpan==pParent->nRows ? pParent->aBottomBorderLine
                                          : pParent->aBorderLine;
    }


    // Die Child Tabelle darf keinen oberen oder linken Rahmen bekommen,
    // wenn der bereits durch die umgebende Tabelle gesetzt ist.
    // Sie darf jedoch immer einen oberen Rand bekommen, wenn die Tabelle
    // nicht der erste Absatz in der Zelle ist.
    bTopAlwd = ( !bFirstPara || (pParent->bTopAlwd &&
                 (0==nRow || !((*pParent->pRows)[nRow-1])->bBottomBorder)) );

    // die Child-Tabelle muss die Farbe der Zelle erben, in der sie
    // vorkommt, wenn sie keine eigene besitzt
    const SvxBrushItem *pInhBG = pParent->GetCell(nRow,nCol)->GetBGBrush();
    if( !pInhBG && pParent != pTopTable &&
        pParent->GetCell(nRow,nCol)->GetRowSpan() == pParent->nRows )
    {
        // die ganze umgebende Tabelle ist eine Tabelle in der Tabelle
        // und besteht nur aus einer Line, die bei der GC (zu Recht)
        // wegoptimiert wird. Deshalb muss der Hintergrund der Line in
        // diese Tabelle uebernommen werden.
        pInhBG = ((*pParent->pRows)[nRow])->GetBGBrush();
        if( !pInhBG )
            pInhBG = pParent->GetBGBrush();
        if( !pInhBG )
            pInhBG = pParent->GetInhBGBrush();
    }
    if( pInhBG )
        pInhBGBrush = new SvxBrushItem( *pInhBG );
}

void HTMLTable::InheritVertBorders( const HTMLTable *pParent,
                                 sal_uInt16 nCol, sal_uInt16 nColSpan )
{
    sal_uInt16 nInhLeftBorderWidth = 0;
    sal_uInt16 nInhRightBorderWidth = 0;

    if( nCol+nColSpan==pParent->nCols && pParent->bRightBorder )
    {
        bInhRightBorder = sal_True; // erstmal nur merken
        aInhRightBorderLine = pParent->aRightBorderLine;
        nInhRightBorderWidth =
            GetBorderWidth( aInhRightBorderLine, sal_True ) + MIN_BORDER_DIST;
    }

    if( ((*pParent->pColumns)[nCol])->bLeftBorder )
    {
        bInhLeftBorder = sal_True;  // erstmal nur merken
        aInhLeftBorderLine = 0==nCol ? pParent->aLeftBorderLine
                                     : pParent->aBorderLine;
        nInhLeftBorderWidth =
            GetBorderWidth( aInhLeftBorderLine, sal_True ) + MIN_BORDER_DIST;
    }

    if( !bInhLeftBorder && (bFillerTopBorder || bFillerBottomBorder) )
        nInhLeftBorderWidth = 2 * MIN_BORDER_DIST;
    if( !bInhRightBorder && (bFillerTopBorder || bFillerBottomBorder) )
        nInhRightBorderWidth = 2 * MIN_BORDER_DIST;
    pLayoutInfo->SetInhBorderWidths( nInhLeftBorderWidth,
                                     nInhRightBorderWidth );

    bRightAlwd = ( pParent->bRightAlwd &&
                  (nCol+nColSpan==pParent->nCols ||
                   !((*pParent->pColumns)[nCol+nColSpan])->bLeftBorder) );
}

void HTMLTable::SetBorders()
{
    sal_uInt16 i;
    for( i=1; i<nCols; i++ )
        if( HTML_TR_ALL==eRules || HTML_TR_COLS==eRules ||
            ((HTML_TR_ROWS==eRules || HTML_TR_GROUPS==eRules) &&
             ((*pColumns)[i-1])->IsEndOfGroup()) )
            ((*pColumns)[i])->bLeftBorder = sal_True;

    for( i=0; i<nRows-1; i++ )
        if( HTML_TR_ALL==eRules || HTML_TR_ROWS==eRules ||
            ((HTML_TR_COLS==eRules || HTML_TR_GROUPS==eRules) &&
             ((*pRows)[i])->IsEndOfGroup()) )
            ((*pRows)[i])->bBottomBorder = sal_True;

    if( bTopAlwd && (HTML_TF_ABOVE==eFrame || HTML_TF_HSIDES==eFrame ||
                     HTML_TF_BOX==eFrame) )
        bTopBorder = sal_True;
    if( HTML_TF_BELOW==eFrame || HTML_TF_HSIDES==eFrame ||
        HTML_TF_BOX==eFrame )
        ((*pRows)[nRows-1])->bBottomBorder = sal_True;
    if( /*bRightAlwd &&*/ (HTML_TF_RHS==eFrame || HTML_TF_VSIDES==eFrame ||
                      HTML_TF_BOX==eFrame) )
        bRightBorder = sal_True;
    if( HTML_TF_LHS==eFrame || HTML_TF_VSIDES==eFrame || HTML_TF_BOX==eFrame )
        ((*pColumns)[0])->bLeftBorder = sal_True;

    for( i=0; i<nRows; i++ )
    {
        HTMLTableRow *pRow = (*pRows)[i];
        for( sal_uInt16 j=0; j<nCols; j++ )
        {
            HTMLTableCell *pCell = pRow->GetCell(j);
            if( pCell->GetContents()  )
            {
                HTMLTableCnts *pCnts = pCell->GetContents();
                sal_Bool bFirstPara = sal_True;
                while( pCnts )
                {
                    HTMLTable *pTable = pCnts->GetTable();
                    if( pTable && !pTable->BordersSet() )
                    {
                        pTable->InheritBorders( this, i, j,
                                                pCell->GetRowSpan(),
                                                pCell->GetColSpan(),
                                                bFirstPara,
                                                0==pCnts->Next() );
                        pTable->SetBorders();
                    }
                    bFirstPara = sal_False;
                    pCnts = pCnts->Next();
                }
            }
        }
    }

    bBordersSet = sal_True;
}

sal_uInt16 HTMLTable::GetBorderWidth( const SvxBorderLine& rBLine,
                                  sal_Bool bWithDistance ) const
{
    sal_uInt16 nWidth = rBLine.GetOutWidth() + rBLine.GetInWidth() +
                    rBLine.GetDistance();
    if( bWithDistance )
    {
        if( nCellPadding )
            nWidth += nCellPadding;
        else if( nWidth )
            nWidth += MIN_BORDER_DIST;
    }

    return nWidth;
}

inline HTMLTableCell *HTMLTable::GetCell( sal_uInt16 nRow,
                                          sal_uInt16 nCell ) const
{
    ASSERT( nRow<pRows->Count(),
        "ungueltiger Zeilen-Index in HTML-Tabelle" );
    return ((*pRows)[nRow])->GetCell( nCell );
}



SvxAdjust HTMLTable::GetInheritedAdjust() const
{
    SvxAdjust eAdjust = (nCurCol<nCols ? ((*pColumns)[nCurCol])->GetAdjust()
                                       : SVX_ADJUST_END );
    if( SVX_ADJUST_END==eAdjust )
        eAdjust = ((*pRows)[nCurRow])->GetAdjust();

    return eAdjust;
}

SwVertOrient HTMLTable::GetInheritedVertOri() const
{
    // VERT_TOP ist der default!
    SwVertOrient eVOri = ((*pRows)[nCurRow])->GetVertOri();
    if( VERT_TOP==eVOri && nCurCol<nCols )
        eVOri = ((*pColumns)[nCurCol])->GetVertOri();
    if( VERT_TOP==eVOri )
        eVOri = eVertOri;

    ASSERT( eVertOri != VERT_TOP, "VERT_TOP ist nicht erlaubt!" );
    return eVOri;
}

void HTMLTable::InsertCell( HTMLTableCnts *pCnts,
                            sal_uInt16 nRowSpan, sal_uInt16 nColSpan,
                            sal_uInt16 nWidth, sal_Bool bRelWidth, sal_uInt16 nHeight,
                            SwVertOrient eVertOri, SvxBrushItem *pBGBrush,
                            sal_Bool bHasNumFmt, sal_uInt32 nNumFmt,
                            sal_Bool bHasValue, double nValue, sal_Bool bNoWrap )
{
    if( !nRowSpan || (sal_uInt32)nCurRow + nRowSpan > USHRT_MAX )
        nRowSpan = 1;

    if( !nColSpan || (sal_uInt32)nCurCol + nColSpan > USHRT_MAX )
        nColSpan = 1;

    sal_uInt16 nColsReq = nCurCol + nColSpan;       // benoetigte Spalten
    sal_uInt16 nRowsReq = nCurRow + nRowSpan;       // benoetigte Zeilen
    sal_uInt16 i, j;

    // falls wir mehr Spalten benoetigen als wir zur Zeit haben,
    // muessen wir in allen Zeilen noch Zellen hinzufuegen
    if( nCols < nColsReq )
    {
        for( i=nCols; i<nColsReq; i++ )
            pColumns->Insert( new HTMLTableColumn, pColumns->Count() );
        for( i=0; i<nRows; i++ )
            ((*pRows)[i])->Expand( nColsReq, i<nCurRow );
        nCols = nColsReq;
        ASSERT( pColumns->Count()==nCols,
                "Anzahl der Spalten nach Expandieren stimmt nicht" );
    }
    if( nColsReq > nFilledCols )
        nFilledCols = nColsReq;

    // falls wir mehr Zeilen benoetigen als wir zur Zeit haben,
    // muessen wir noch neue Zeilen hinzufuegen
    if( nRows < nRowsReq )
    {
        for( i=nRows; i<nRowsReq; i++ )
            pRows->Insert( new HTMLTableRow(nCols), pRows->Count() );
        nRows = nRowsReq;
        ASSERT( nRows==pRows->Count(), "Zeilenzahl in Insert stimmt nicht" );
    }

    // Testen, ob eine Ueberschneidung vorliegt und diese
    // gegebenfalls beseitigen
    sal_uInt16 nSpanedCols = 0;
    if( nCurRow>0 )
    {
        HTMLTableRow *pCurRow = (*pRows)[nCurRow];
        for( i=nCurCol; i<nColsReq; i++ )
        {
            HTMLTableCell *pCell = pCurRow->GetCell(i);
            if( pCell->GetContents() )
            {
                // Der Inhalt reicht von einer weiter oben stehenden Zelle
                // hier herein. Inhalt und Farbe der Zelle sind deshalb in
                // jedem Fall noch dort verankert und koennen deshalb
                // ueberschrieben werden bzw. von ProtectRowSpan geloescht
                // (Inhalt) oder kopiert (Farbe) werden.
                nSpanedCols = i + pCell->GetColSpan();
                FixRowSpan( nCurRow-1, i, pCell->GetContents() );
                if( pCell->GetRowSpan() > nRowSpan )
                    ProtectRowSpan( nRowsReq, i,
                                    pCell->GetRowSpan()-nRowSpan );
            }
        }
        for( i=nColsReq; i<nSpanedCols; i++ )
        {
            // Auch diese Inhalte sind in jedem Fall nich in der Zeile
            // darueber verankert.
            HTMLTableCell *pCell = pCurRow->GetCell(i);
            FixRowSpan( nCurRow-1, i, pCell->GetContents() );
            ProtectRowSpan( nCurRow, i, pCell->GetRowSpan() );
        }
    }

    // die Zellen fuellen
    for( i=nColSpan; i>0; i-- )
        for( j=nRowSpan; j>0; j-- )
            GetCell( nRowsReq-j, nColsReq-i )
                ->Set( pCnts, j, i, eVertOri, pBGBrush,
                       bHasNumFmt, nNumFmt, bHasValue, nValue, bNoWrap );

    Size aTwipSz( bRelWidth ? 0 : nWidth, nHeight );
    if( (aTwipSz.Width() || aTwipSz.Height()) && Application::GetDefaultDevice() )
    {
        aTwipSz = Application::GetDefaultDevice()
                    ->PixelToLogic( aTwipSz, MapMode( MAP_TWIP ) );
    }

    // die Breite nur in die erste Zelle setzen!
    if( nWidth )
    {
        sal_uInt16 nTmp = bRelWidth ? nWidth : (sal_uInt16)aTwipSz.Width();
        GetCell( nCurRow, nCurCol )->SetWidth( nTmp, bRelWidth );
    }

    // Ausserdem noch die Hoehe merken
    if( nHeight && 1==nRowSpan )
    {
        if( nHeight < MINLAY )
            nHeight = MINLAY;
        ((*pRows)[nCurRow])->SetHeight( (sal_uInt16)aTwipSz.Height() );
    }

    // den Spaltenzaehler hinter die neuen Zellen setzen
    nCurCol = nColsReq;
    if( nSpanedCols > nCurCol )
        nCurCol = nSpanedCols;

    // und die naechste freie Zelle suchen
    while( nCurCol<nCols && GetCell(nCurRow,nCurCol)->IsUsed() )
        nCurCol++;
}

inline void HTMLTable::CloseSection( sal_Bool bHead )
{
    // die vorhergende Section beenden, falls es schon eine Zeile gibt
    ASSERT( nCurRow<=nRows, "ungeultige aktuelle Zeile" );
    if( nCurRow>0 && nCurRow<=nRows )
        ((*pRows)[nCurRow-1])->SetEndOfGroup();
    if( bHead /*&& nCurRow==1*/ )
        bHeadlineRepeat = sal_True;
}

void HTMLTable::OpenRow( SvxAdjust eAdjust, SwVertOrient eVertOri,
                         SvxBrushItem *pBGBrush )
{
    sal_uInt16 nRowsReq = nCurRow+1;    // Anzahl benoetigter Zeilen;

    // die naechste Zeile anlegen, falls sie nicht schon da ist
    if( nRows<nRowsReq )
    {
        for( sal_uInt16 i=nRows; i<nRowsReq; i++ )
            pRows->Insert( new HTMLTableRow(nCols), pRows->Count() );
        nRows = nRowsReq;
        ASSERT( nRows==pRows->Count(),
                "Zeilenzahl in OpenRow stimmt nicht" );
    }

    HTMLTableRow *pCurRow = ((*pRows)[nCurRow]);
    pCurRow->SetAdjust( eAdjust );
    pCurRow->SetVertOri( eVertOri );
    if( pBGBrush )
        ((*pRows)[nCurRow])->SetBGBrush( pBGBrush );

    // den Spaltenzaehler wieder an den Anfang setzen
    nCurCol=0;

    // und die naechste freie Zelle suchen
    while( nCurCol<nCols && GetCell(nCurRow,nCurCol)->IsUsed() )
        nCurCol++;
}

void HTMLTable::CloseRow( sal_Bool bEmpty )
{
    ASSERT( nCurRow<nRows, "aktulle Zeile hinter dem Tabellenende" );

    // leere Zellen bekommen einfach einen etwas dickeren unteren Rand!
    if( bEmpty )
    {
        if( nCurRow > 0 )
            ((*pRows)[nCurRow-1])->IncEmptyRows();
        return;
    }

    HTMLTableRow *pRow = (*pRows)[nCurRow];

    // den COLSPAN aller leeren Zellen am Zeilenende so anpassen, dass
    // eine Zelle daraus wird. Das kann man hier machen (und auf keinen
    // Fall frueher), weill jetzt keine Zellen mehr in die Zeile eingefuegt
    // werden.
    sal_uInt16 i=nCols;
    while( i )
    {
        HTMLTableCell *pCell = pRow->GetCell(--i);
        if( !pCell->GetContents() )
        {
            sal_uInt16 nColSpan = nCols-i;
            if( nColSpan > 1 )
                pCell->SetColSpan( nColSpan );
        }
        else
            break;
    }


    nCurRow++;
}

inline void HTMLTable::CloseColGroup( sal_uInt16 nSpan, sal_uInt16 nWidth,
                                      sal_Bool bRelWidth, SvxAdjust eAdjust,
                                      SwVertOrient eVertOri )
{
    if( nSpan )
        InsertCol( nSpan, nWidth, bRelWidth, eAdjust, eVertOri );

    ASSERT( nCurCol<=nCols, "ungueltige Spalte" );
    if( nCurCol>0 && nCurCol<=nCols )
        ((*pColumns)[nCurCol-1])->SetEndOfGroup();
}

void HTMLTable::InsertCol( sal_uInt16 nSpan, sal_uInt16 nWidth, sal_Bool bRelWidth,
                           SvxAdjust eAdjust, SwVertOrient eVertOri )
{
    sal_uInt16 i;

    if( !nSpan )
        nSpan = 1;

    sal_uInt16 nColsReq = nCurCol + nSpan;      // benoetigte Spalten

    if( nCols < nColsReq )
    {
        for( i=nCols; i<nColsReq; i++ )
            pColumns->Insert( new HTMLTableColumn, pColumns->Count() );
        nCols = nColsReq;
    }

    Size aTwipSz( bRelWidth ? 0 : nWidth, 0 );
    if( aTwipSz.Width() && Application::GetDefaultDevice() )
    {
        aTwipSz = Application::GetDefaultDevice()
                    ->PixelToLogic( aTwipSz, MapMode( MAP_TWIP ) );
    }

    for( i=nCurCol; i<nColsReq; i++ )
    {
        HTMLTableColumn *pCol = (*pColumns)[i];
        sal_uInt16 nTmp = bRelWidth ? nWidth : (sal_uInt16)aTwipSz.Width();
        pCol->SetWidth( nTmp, bRelWidth );
        pCol->SetAdjust( eAdjust );
        pCol->SetVertOri( eVertOri );
    }

    bColSpec = sal_True;

    nCurCol = nColsReq;
}


void HTMLTable::CloseTable()
{
    sal_uInt16 i;

    // Die Anzahl der Tabellenzeilen richtet sich nur nach den
    // <TR>-Elementen (d.h. nach nCurRow). Durch ROWSPAN aufgespannte
    // Zeilen hinter Zeile nCurRow muessen wir deshalb loeschen
    // und vor allem aber den ROWSPAN in den darueberliegenden Zeilen
    // anpassen.
    if( nRows>nCurRow )
    {
        HTMLTableRow *pPrevRow = (*pRows)[nCurRow-1];
        HTMLTableCell *pCell;
        for( i=0; i<nCols; i++ )
            if( ( pCell=pPrevRow->GetCell(i), pCell->GetRowSpan() > 1 ) )
            {
                FixRowSpan( nCurRow-1, i, pCell->GetContents() );
                ProtectRowSpan( nCurRow, i, (*pRows)[nCurRow]->GetCell(i)->GetRowSpan() );
            }
        for( i=nRows-1; i>=nCurRow; i-- )
            pRows->DeleteAndDestroy(i);
        nRows = nCurRow;
    }

    // falls die Tabelle keine Spalte hat, muessen wir eine hinzufuegen
    if( 0==nCols )
    {
        pColumns->Insert( new HTMLTableColumn, pColumns->Count() );
        for( i=0; i<nRows; i++ )
            ((*pRows)[i])->Expand(1);
        nCols = 1;
        nFilledCols = 1;
    }

    // falls die Tabelle keine Zeile hat, muessen wir eine hinzufuegen
    if( 0==nRows )
    {
        pRows->Insert( new HTMLTableRow(nCols), pRows->Count() );
        nRows = 1;
        nCurRow = 1;
    }

    if( nFilledCols < nCols )
    {
        pColumns->DeleteAndDestroy( nFilledCols, nCols-nFilledCols );
        for( i=0; i<nRows; i++ )
            ((*pRows)[i])->Shrink( nFilledCols );
        nCols = nFilledCols;
    }
}

void HTMLTable::_MakeTable( SwTableBox *pBox )
{
    SwTableLines& rLines = (pBox ? pBox->GetTabLines()
                                 : ((SwTable *)pSwTable)->GetTabLines() );

    // jetzt geht's richtig los ...
    sal_uInt16 nStartRow = 0;

    for( sal_uInt16 i=0; i<nRows; i++ )
    {
        // kann hinter der aktuellen HTML-Tabellen-Zeile gesplittet werden?
        sal_Bool bSplit = sal_True;
        HTMLTableRow *pRow = (*pRows)[i];
        for( sal_uInt16 j=0; j<nCols; j++ )
        {
            bSplit = ( 1 == pRow->GetCell(j)->GetRowSpan() );
            if( !bSplit )
                break;
        }

        if( bSplit )
        {
            SwTableLine *pLine = MakeTableLine( pBox, nStartRow, 0, i+1, nCols );
            if( pBox || nStartRow>0 )
            {
                rLines.C40_INSERT( SwTableLine, pLine, rLines.Count() );
            }
            nStartRow = i+1;
        }
    }
}

/* Wie werden Tabellen ausgerichtet?

erste Zeile: ohne Absatz-Einzuege
zweite Zeile: mit Absatz-Einzuegen

ALIGN=          LEFT            RIGHT           CENTER          -
-------------------------------------------------------------------------
xxx bei Tabellen mit WIDTH=nn% ist die Prozent-Angabe von Bedeutung:
xxx nn = 100        HORI_FULL       HORI_FULL       HORI_FULL       HORI_FULL %
xxx             HORI_NONE       HORI_NONE       HORI_NONE %     HORI_NONE %
xxx nn < 100        Rahmen F        Rahmen F        HORI_CENTER %   HORI_LEFT %
xxx             Rahmen F        Rahmen F        HORI_CENTER %   HORI_NONE %

bei Tabellen mit WIDTH=nn% ist die Prozent-Angabe von Bedeutung:
nn = 100        HORI_LEFT       HORI_RIGHT      HORI_CENTER %   HORI_LEFT %
                HORI_LEFT_AND   HORI_RIGHT      HORI_CENTER %   HORI_LEFT_AND %
nn < 100        Rahmen F        Rahmen F        HORI_CENTER %   HORI_LEFT %
                Rahmen F        Rahmen F        HORI_CENTER %   HORI_NONE %

sonst die berechnete Breite w
w = avail*      HORI_LEFT       HORI_RIGHT      HORI_CENTER     HORI_LEFT
                HORI_LEDT_AND   HORI_RIGHT      HORI_CENTER     HORI_LEFT_AND
w < avail       Rahmen L        Rahmen L        HORI_CENTER     HORI_LEFT
                Rahmen L        Rahmen L        HORI_CENTER     HORI_NONE

xxx *) wenn fuer die Tabelle keine Groesse angegeben wurde, wird immer
xxx   HORI_FULL genommen

*/

void HTMLTable::MakeTable( SwTableBox *pBox, sal_uInt16 nAbsAvail,
                           sal_uInt16 nRelAvail, sal_uInt16 nAbsLeftSpace,
                           sal_uInt16 nAbsRightSpace, sal_uInt16 nInhAbsSpace )
{
    ASSERT( nRows>0 && nCols>0 && nCurRow==nRows,
            "Wurde CloseTable nicht aufgerufen?" );

    ASSERT( (pLayoutInfo==0) == (this==pTopTable),
            "Top-Tabelle hat keine Layout-Info oder umgekehrt" );

    if( this==pTopTable )
    {
        // Umrandung der Tabelle und aller in ihr enthaltenen berechnen
        SetBorders();

        // Schritt 1: Die benoetigten Layout-Strukturen werden angelegt
        // (inklusive Tabellen in Tabellen).
        CreateLayoutInfo();

        // Schritt 2: Die minimalen und maximalen Spaltenbreiten werden
        // berechnet (inklusive Tabellen in Tabellen). Da wir noch keine
        // Boxen haben, arabeiten wir noch auf den Start-Nodes.
        pLayoutInfo->AutoLayoutPass1();
    }

    // Schritt 3: Die tatsaechlichen Spaltenbreiten dieser Tabelle werden
    // berechnet (nicht von Tabellen in Tabellen). Dies muss jetzt schon
    // sein, damit wir entscheiden koennen ob Filler-Zellen benoetigt werden
    // oder nicht (deshalb war auch Pass1 schon noetig).
    pLayoutInfo->AutoLayoutPass2( nAbsAvail, nRelAvail, nAbsLeftSpace,
                                  nAbsRightSpace, nInhAbsSpace );

    if( this!=pTopTable )
    {
        // die linke und rechte Umrandung der Tabelle kann jetzt entgueltig
        // festgelegt werden
        if( pLayoutInfo->GetRelRightFill() == 0 )
        {
            if( !bRightBorder )
            {
                // linke Umrandung von auesserer Tabelle uebernehmen
                if( bInhRightBorder )
                {
                    bRightBorder = sal_True;
                    aRightBorderLine = aInhRightBorderLine;
                }
            }
            else
            {
                // Umrandung nur setzen, wenn es erlaubt ist
                bRightBorder = bRightAlwd;
            }
        }

        if( pLayoutInfo->GetRelLeftFill() == 0 &&
            !((*pColumns)[0])->bLeftBorder &&
            bInhLeftBorder )
        {
            // ggf. rechte Umrandung von auesserer Tabelle uebernehmen
            ((*pColumns)[0])->bLeftBorder = sal_True;
            aLeftBorderLine = aInhLeftBorderLine;
        }
    }

    // Fuer die Top-Table muss die Ausrichtung gesetzt werden
    if( this==pTopTable )
    {
        SwHoriOrient eHoriOri;
        if( bForceFrame )
        {
            // Die Tabelle soll in einen Rahmen und ist auch schmaler
            // als der verfuegbare Platz und nicht 100% breit.
            // Dann kommt sie in einen Rahmen
            eHoriOri = bPrcWidth ? HORI_FULL : HORI_LEFT;
        }
        else switch( eTableAdjust )
        {
            // Die Tabelle passt entweder auf die Seite, soll aber in keinen
            // Rahmen oder sie ist Breiter als die Seite und soll deshalb
            // in keinen Rahmen

        case SVX_ADJUST_RIGHT:
            // in rechtsbuendigen Tabellen kann nicht auf den rechten
            // Rand Ruecksicht genommen werden
            eHoriOri = HORI_RIGHT;
            break;
        case SVX_ADJUST_CENTER:
            // zentrierte Tabellen nehmen keine Ruecksicht auf Raender!
            eHoriOri = HORI_CENTER;
            break;
        case SVX_ADJUST_LEFT:
        default:
            // linksbuendige Tabellen nehmen nur auf den linken Rand
            // Ruecksicht
            eHoriOri = nLeftMargin ? HORI_LEFT_AND_WIDTH : HORI_LEFT;
            break;
        }

        // das Tabellenform holen und anpassen
        SwFrmFmt *pFrmFmt = pSwTable->GetFrmFmt();
        pFrmFmt->SetAttr( SwFmtHoriOrient(0,eHoriOri) );
        if( HORI_LEFT_AND_WIDTH==eHoriOri )
        {
            ASSERT( nLeftMargin || nRightMargin,
                    "Da gibt's wohl noch Reste von relativen Breiten" );

            // The right margin will be ignored anyway.
            SvxLRSpaceItem aLRItem( pSwTable->GetFrmFmt()->GetLRSpace() );
            aLRItem.SetLeft( nLeftMargin );
            aLRItem.SetRight( nRightMargin );
            pFrmFmt->SetAttr( aLRItem );
        }

        if( bPrcWidth && HORI_FULL!=eHoriOri )
        {
            pFrmFmt->LockModify();
            SwFmtFrmSize aFrmSize( pFrmFmt->GetFrmSize() );
            aFrmSize.SetWidthPercent( (sal_uInt8)nWidth );
            pFrmFmt->SetAttr( aFrmSize );
            pFrmFmt->UnlockModify();
        }
    }

    // die Default Line- und Box-Formate holen
    if( this==pTopTable )
    {
        // die erste Box merken und aus der ersten Zeile ausketten
        SwTableLine *pLine1 = (pSwTable->GetTabLines())[0];
        pBox1 = (pLine1->GetTabBoxes())[0];
        pLine1->GetTabBoxes().Remove(0);

        pLineFmt = (SwTableLineFmt*)pLine1->GetFrmFmt();
        pBoxFmt = (SwTableBoxFmt*)pBox1->GetFrmFmt();
    }
    else
    {
        pLineFmt = (SwTableLineFmt*)pTopTable->pLineFmt;
        pBoxFmt = (SwTableBoxFmt*)pTopTable->pBoxFmt;
    }

    // ggf. muessen fuer Tabellen in Tabellen "Filler"-Zellen eingefuegt
    // werden
    if( this != pTopTable &&
        ( pLayoutInfo->GetRelLeftFill() > 0  ||
          pLayoutInfo->GetRelRightFill() > 0 ) )
    {
        ASSERT( pBox, "kein TableBox fuer Tabelle in Tabelle" );

        SwTableLines& rLines = pBox->GetTabLines();

        // dazu brauchen wir erstmal ein eine neue Table-Line in der Box
        SwTableLine *pLine =
            new SwTableLine( pLineFrmFmtNoHeight ? pLineFrmFmtNoHeight
                                                 : pLineFmt, 0, pBox );
        rLines.C40_INSERT( SwTableLine, pLine, rLines.Count() );

        // Sicherstellen, dass wie ein Format ohne Hoehe erwischt haben
        if( !pLineFrmFmtNoHeight )
        {
            // sonst muessen wir die Hoehe aus dem Attribut entfernen
            // und koennen uns das Format merken
            pLineFrmFmtNoHeight = (SwTableLineFmt*)pLine->ClaimFrmFmt();

            ResetLineFrmFmtAttrs( pLineFrmFmtNoHeight );
        }

        SwTableBoxes& rBoxes = pLine->GetTabBoxes();
        SwTableBox *pNewBox;

        // ggf. links eine Zelle einfuegen
        if( pLayoutInfo->GetRelLeftFill() > 0 )
        {
            // pPrevStNd ist der Vorgaenger-Start-Node der Tabelle. Den
            // "Filler"-Node fuegen wir einfach dahinter ein ...
            pPrevStNd = pParser->InsertTableSection( pPrevStNd );

            pNewBox = NewTableBox( pPrevStNd, pLine );
            rBoxes.C40_INSERT( SwTableBox, pNewBox, rBoxes.Count() );
            FixFillerFrameFmt( pNewBox, sal_False );
            pLayoutInfo->SetLeftFillerBox( pNewBox );
        }

        // jetzt die Tabelle bearbeiten
        pNewBox = new SwTableBox( pBoxFmt, 0, pLine );
        rBoxes.C40_INSERT( SwTableBox, pNewBox, rBoxes.Count() );

        SwFrmFmt *pFrmFmt = pNewBox->ClaimFrmFmt();
        pFrmFmt->ResetAttr( RES_BOX );
        pFrmFmt->ResetAttr( RES_BACKGROUND );
        pFrmFmt->ResetAttr( RES_VERT_ORIENT );
        pFrmFmt->ResetAttr( RES_BOXATR_FORMAT );


        _MakeTable( pNewBox );

        // und noch ggf. rechts eine Zelle einfuegen
        if( pLayoutInfo->GetRelRightFill() > 0 )
        {
            const SwStartNode *pStNd =
                GetPrevBoxStartNode( USHRT_MAX, USHRT_MAX );
            pStNd = pParser->InsertTableSection( pStNd );

            pNewBox = NewTableBox( pStNd, pLine );
            rBoxes.C40_INSERT( SwTableBox, pNewBox, rBoxes.Count() );

            FixFillerFrameFmt( pNewBox, sal_True );
            pLayoutInfo->SetRightFillerBox( pNewBox );
        }
    }
    else
    {
        _MakeTable( pBox );
    }

    // zum Schluss fuehren wir noch eine Garbage-Collection fuer die
    // Top-Level-Tabelle durch
    if( this==pTopTable )
    {
        if( 1==nRows && nHeight && 1==pSwTable->GetTabLines().Count() )
        {
            // Hoehe einer einzeiligen Tabelle als Mindesthoehe der
            // Zeile setzen. (War mal fixe Hoehe, aber das gibt manchmal
            // Probleme (fix #34972#) und ist auch nicht Netscape 4.0
            // konform
            nHeight = pParser->ToTwips( nHeight );
            if( nHeight < MINLAY )
                nHeight = MINLAY;

            (pSwTable->GetTabLines())[0]->ClaimFrmFmt();
            (pSwTable->GetTabLines())[0]->GetFrmFmt()
                ->SetAttr( SwFmtFrmSize( ATT_MIN_SIZE, 0, nHeight ) );
        }

        if( GetBGBrush() )
            pSwTable->GetFrmFmt()->SetAttr( *GetBGBrush() );

        ((SwTable *)pSwTable)->SetHeadlineRepeat( bHeadlineRepeat );
        ((SwTable *)pSwTable)->GCLines();

        sal_Bool bIsInFlyFrame = pContext && pContext->GetFrmFmt();
        if( bIsInFlyFrame && !nWidth )
        {
            SvxAdjust eTblAdjust = GetTableAdjust(sal_False);
            if( eTblAdjust != SVX_ADJUST_LEFT &&
                eTblAdjust != SVX_ADJUST_RIGHT )
            {
                // Wenn eine Tabelle ohne Breitenangabe nicht links oder
                // rechts umflossen werden soll, dann stacken wir sie
                // in einem Rahmen mit 100%-Breite, damit ihre Groesse
                // angepasst wird. Der Rahmen darf nicht angepasst werden.
                ASSERT( HasToFly(), "Warum ist die Tabelle in einem Rahmen?" );
                sal_uInt32 nMin = pLayoutInfo->GetMin();
                if( nMin > USHRT_MAX )
                    nMin = USHRT_MAX;
                SwFmtFrmSize aFlyFrmSize( ATT_VAR_SIZE, (SwTwips)nMin, MINLAY );
                aFlyFrmSize.SetWidthPercent( 100 );
                pContext->GetFrmFmt()->SetAttr( aFlyFrmSize );
                bIsInFlyFrame = sal_False;
            }
            else
            {
                // Links und rechts ausgerichtete Tabellen ohne Breite
                // duerfen leider nicht in der Breite angepasst werden, denn
                // sie wuerden nur schrumpfen aber nie wachsen.
                pLayoutInfo->SetMustNotRecalc( sal_True );
                if( pContext->GetFrmFmt()->GetAnchor().GetCntntAnchor()
                    ->nNode.GetNode().FindTableNode() )
                {
                    sal_uInt32 nMax = pLayoutInfo->GetMax();
                    if( nMax > USHRT_MAX )
                        nMax = USHRT_MAX;
                    SwFmtFrmSize aFlyFrmSize( ATT_VAR_SIZE, (SwTwips)nMax, MINLAY );
                    pContext->GetFrmFmt()->SetAttr( aFlyFrmSize );
                    bIsInFlyFrame = sal_False;
                }
                else
                {
                    pLayoutInfo->SetMustNotResize( sal_True );
                }
            }
        }
        pLayoutInfo->SetMayBeInFlyFrame( bIsInFlyFrame );

        // Nur Tabellen mit relativer Breite oder ohne Breite muessen
        // angepasst werden.
        pLayoutInfo->SetMustResize( bPrcWidth || !nWidth );

        pLayoutInfo->SetWidths();

        ((SwTable *)pSwTable)->SetHTMLTableLayout( pLayoutInfo );

        if( pResizeDrawObjs )
        {
            sal_uInt16 nCount = pResizeDrawObjs->Count();
            for( sal_uInt16 i=0; i<nCount; i++ )
            {
                SdrObject *pObj = (*pResizeDrawObjs)[i];
                sal_uInt16 nRow = (*pDrawObjPrcWidths)[3*i];
                sal_uInt16 nCol = (*pDrawObjPrcWidths)[3*i+1];
                sal_uInt8 nPrcWidth = (sal_uInt8)(*pDrawObjPrcWidths)[3*i+2];

                SwHTMLTableLayoutCell *pLayoutCell =
                    pLayoutInfo->GetCell( nRow, nCol );
                sal_uInt16 nColSpan = pLayoutCell->GetColSpan();

                sal_uInt16 nWidth, nDummy;
                pLayoutInfo->GetAvail( nCol, nColSpan, nWidth, nDummy );
                nWidth -= pLayoutInfo->GetLeftCellSpace( nCol, nColSpan );
                nWidth -= pLayoutInfo->GetRightCellSpace( nCol, nColSpan );
                nWidth = ((long)nWidth * nPrcWidth) / 100;

                pParser->ResizeDrawObject( pObj, nWidth );
            }
        }
    }
}

void HTMLTable::SetTable( const SwStartNode *pStNd, _HTMLTableContext *pCntxt,
                          sal_uInt16 nLeft, sal_uInt16 nRight,
                          const SwTable *pSwTab, sal_Bool bFrcFrame )
{
    pPrevStNd = pStNd;
    pSwTable = pSwTab;
    pContext = pCntxt;

    nLeftMargin = nLeft;
    nRightMargin = nRight;

    bForceFrame = bFrcFrame;
}

void HTMLTable::RegisterDrawObject( SdrObject *pObj, sal_uInt8 nPrcWidth )
{
    if( !pResizeDrawObjs )
        pResizeDrawObjs = new SdrObjects;
    pResizeDrawObjs->C40_INSERT( SdrObject, pObj, pResizeDrawObjs->Count() );

    if( !pDrawObjPrcWidths )
        pDrawObjPrcWidths = new SvUShorts;
    pDrawObjPrcWidths->Insert( nCurRow, pDrawObjPrcWidths->Count() );
    pDrawObjPrcWidths->Insert( nCurCol, pDrawObjPrcWidths->Count() );
    pDrawObjPrcWidths->Insert( (sal_uInt16)nPrcWidth, pDrawObjPrcWidths->Count() );
}

void HTMLTable::MakeParentContents()
{
    if( !GetContext() && !HasParentSection() )
    {
        SetParentContents(
            pParser->InsertTableContents( GetIsParentHeader() ) );

        SetHasParentSection( sal_True );
    }
}

_HTMLTableContext::~_HTMLTableContext()
{
    delete pPos;
}

void _HTMLTableContext::SavePREListingXMP( SwHTMLParser& rParser )
{
    bRestartPRE = rParser.IsReadPRE();
    bRestartXMP = rParser.IsReadXMP();
    bRestartListing = rParser.IsReadListing();
    rParser.FinishPREListingXMP();
}

void _HTMLTableContext::RestorePREListingXMP( SwHTMLParser& rParser )
{
    rParser.FinishPREListingXMP();

    if( bRestartPRE )
        rParser.StartPRE();

    if( bRestartXMP )
        rParser.StartXMP();

    if( bRestartListing )
        rParser.StartListing();
}

/*  */

const SwStartNode *SwHTMLParser::InsertTableSection
    ( const SwStartNode *pPrevStNd )
{
    ASSERT( pPrevStNd, "Start-Node ist NULL" );

    pCSS1Parser->SetTDTagStyles();
    SwTxtFmtColl *pColl = pCSS1Parser->GetTxtCollFromPool( RES_POOLCOLL_TABLE );

    const SwStartNode *pStNd;
    if( pTable && pTable->bFirstCell )
    {
        SwNode *pNd = pDoc->GetNodes()[pPam->GetPoint()->nNode];
        pNd->GetTxtNode()->ChgFmtColl( pColl );
        pStNd = pNd->FindTableBoxStartNode();
        pTable->bFirstCell = sal_False;
    }
    else
    {
        const SwNode* pNd;
        if( pPrevStNd->IsTableNode() )
            pNd = pPrevStNd;
        else
            pNd = pPrevStNd->EndOfSectionNode();
        SwNodeIndex nIdx( *pNd, 1 );
        pStNd = pDoc->GetNodes().MakeTextSection( nIdx, SwTableBoxStartNode,
                                                  pColl );
        pTable->IncBoxCount();
    }

    pDoc->GetNodes()[pStNd->GetIndex()+1]
        ->GetCntntNode()->SetAttr( SvxFontHeightItem(40) );

    return pStNd;
}

const SwStartNode *SwHTMLParser::InsertTableSection( sal_uInt16 nPoolId )
{
    switch( nPoolId )
    {
    case RES_POOLCOLL_TABLE_HDLN:
        pCSS1Parser->SetTHTagStyles();
        break;
    case RES_POOLCOLL_TABLE:
        pCSS1Parser->SetTDTagStyles();
        break;
    }

    SwTxtFmtColl *pColl = pCSS1Parser->GetTxtCollFromPool( nPoolId );

    SwNode *pNd = pDoc->GetNodes()[pPam->GetPoint()->nNode];
    const SwStartNode *pStNd;
    if( pTable && pTable->bFirstCell )
    {
        pNd->GetTxtNode()->ChgFmtColl( pColl );
        pTable->bFirstCell = sal_False;
        pStNd = pNd->FindTableBoxStartNode();
    }
    else
    {
        SwTableNode *pTblNd = pNd->FindTableNode();
        SwNodeIndex aIdx( *pTblNd->EndOfSectionNode() );
        pStNd = pDoc->GetNodes().MakeTextSection( aIdx, SwTableBoxStartNode,
                                                  pColl );

        pPam->GetPoint()->nNode = pStNd->GetIndex() + 1;
        SwTxtNode *pTxtNd = pPam->GetPoint()->nNode.GetNode().GetTxtNode();
        pPam->GetPoint()->nContent.Assign( pTxtNd, 0 );
        pTable->IncBoxCount();
    }

    return pStNd;
}

const SwStartNode *SwHTMLParser::InsertEmptyTableSection()
{
    ASSERT( !pTable || !pTable->bFirstCell,
            "erste Zelle der Tabelle nicht genutzt" );

    const SwNode *pNd = pDoc->GetNodes()[pPam->GetPoint()->nNode];
    const SwTableNode *pTblNd = pNd->FindTableNode();
    pTable->IncBoxCount();

    return pDoc->GetNodes().MakeEmptySection(
            SwNodeIndex( *pTblNd->EndOfSectionNode() ), SwTableBoxStartNode );
}

SwStartNode *SwHTMLParser::InsertTempTableCaptionSection()
{
    SwTxtFmtColl *pColl = pCSS1Parser->GetTxtCollFromPool( RES_POOLCOLL_TEXT );
    SwNodeIndex& rIdx = pPam->GetPoint()->nNode;
    rIdx = pDoc->GetNodes().GetEndOfExtras();
    SwStartNode *pStNd = pDoc->GetNodes().MakeTextSection( rIdx,
                                          SwNormalStartNode, pColl );

    rIdx = pStNd->GetIndex() + 1;
    pPam->GetPoint()->nContent.Assign( rIdx.GetNode().GetTxtNode(), 0 );

    return pStNd;
}


xub_StrLen SwHTMLParser::StripTrailingLF()
{
    xub_StrLen nStripped = 0;

    xub_StrLen nLen = pPam->GetPoint()->nContent.GetIndex();
    if( nLen )
    {
        SwTxtNode* pTxtNd = pPam->GetPoint()->nNode.GetNode().GetTxtNode();
        // vorsicht, wenn Kommentare nicht uebrlesen werden!!!
        if( pTxtNd )
        {
            xub_StrLen nPos = nLen;
            xub_StrLen nLFCount = 0;
            while( nPos && '\x0a' == (pTxtNd->GetTxt()).GetChar(--nPos) )
                nLFCount++;

            if( nLFCount )
            {
// MIB 6.6.97: Warum sollte man bei leeren Absaetzen nur ein LF loeschen?
// Das stimmt doch irgendwi nicht ...
//              if( nLFCount == nLen )
//              {
//                  // nur Lfs, dann nur ein LF loeschen
//                  nLFCount = 1;
//              }
//              else if( nLFCount > 2 )
                if( nLFCount > 2 )
                {
                    // Bei Netscape entspricht ein Absatz-Ende zwei LFs
                    // (mit einem kommt man in die naechste Zeile, das
                    // zweite erzeugt eine Leerzeile) Diesen Abstand
                    // erreichen wie aber schon mit dem unteren
                    // Absatz-Abstand. Wenn nach den <BR> ein neuer
                    // Absatz aufgemacht wird, wird das Maximum des Abstands,
                    // der sich aus den BR und dem P ergibt genommen.
                    // Deshalb muessen wir 2 bzw. alle bei weniger
                    // als zweien loeschen
                    nLFCount = 2;
                }

                nPos = nLen - nLFCount;
                SwIndex nIdx( pTxtNd, nPos );
                pTxtNd->Erase( nIdx, nLFCount );
                nStripped = nLFCount;
            }
        }
    }

    return nStripped;
}

SvxBrushItem* SwHTMLParser::CreateBrushItem( const Color *pColor,
                                             const String& rImageURL,
                                             const String& rStyle,
                                             const String& rId,
                                             const String& rClass )
{
    SvxBrushItem *pBrushItem = 0;

    if( rStyle.Len() || rId.Len() || rClass.Len() )
    {
        SfxItemSet aItemSet( pDoc->GetAttrPool(), RES_BACKGROUND,
                                                  RES_BACKGROUND );
        SvxCSS1PropertyInfo aPropInfo;

        if( rClass.Len() )
        {
            SvxCSS1MapEntry *pClass = pCSS1Parser->GetClass( rClass );
            if( pClass )
                aItemSet.Put( pClass->GetItemSet() );
        }

        if( rId.Len() )
        {
            SvxCSS1MapEntry *pId = pCSS1Parser->GetId( rId );
            if( pId )
                aItemSet.Put( pId->GetItemSet() );
        }

        pCSS1Parser->ParseStyleOption( rStyle, aItemSet, aPropInfo );
        const SfxPoolItem *pItem = 0;
        if( SFX_ITEM_SET == aItemSet.GetItemState( RES_BACKGROUND, sal_False,
                                                   &pItem ) )
        {
            pBrushItem = new SvxBrushItem( *((const SvxBrushItem *)pItem) );
        }
    }

    if( !pBrushItem && (pColor || rImageURL.Len()) )
    {
        pBrushItem = new SvxBrushItem();

        if( pColor )
            pBrushItem->SetColor(*pColor);

        if( rImageURL.Len() )
        {
            pBrushItem->SetGraphicLink( INetURLObject::RelToAbs(rImageURL) );
            pBrushItem->SetGraphicPos( GPOS_TILED );
        }
    }

    return pBrushItem;
}

/*  */

class _SectionSaveStruct : public SwPendingStackData
{
    sal_uInt16 nBaseFontStMinSave, nFontStMinSave, nFontStHeadStartSave;
    sal_uInt16 nDefListDeepSave, nContextStMinSave, nContextStAttrMinSave;

public:

    HTMLTable *pTable;

    _SectionSaveStruct( SwHTMLParser& rParser );
    virtual ~_SectionSaveStruct();

    sal_uInt16 GetContextStAttrMin() const { return nContextStAttrMinSave; }

    void Restore( SwHTMLParser& rParser );
};

_SectionSaveStruct::_SectionSaveStruct( SwHTMLParser& rParser ) :
    nBaseFontStMinSave(0), nFontStMinSave(0), nFontStHeadStartSave(0),
    nDefListDeepSave(0), nContextStMinSave(0), nContextStAttrMinSave(0),
    pTable( 0 )
{
    // Font-Stacks einfrieren
    nBaseFontStMinSave = rParser.nBaseFontStMin;
    rParser.nBaseFontStMin = rParser.aBaseFontStack.Count();

    nFontStMinSave = rParser.nFontStMin;
    nFontStHeadStartSave = rParser.nFontStHeadStart;
    rParser.nFontStMin = rParser.aFontStack.Count();

    // Kontext-Stack einfrieren
    nContextStMinSave = rParser.nContextStMin;
    nContextStAttrMinSave = rParser.nContextStAttrMin;
    rParser.nContextStMin = rParser.aContexts.Count();
    rParser.nContextStAttrMin = rParser.nContextStMin;

    // und noch ein par Zaehler retten
    nDefListDeepSave = rParser.nDefListDeep;
    rParser.nDefListDeep = 0;
}

_SectionSaveStruct::~_SectionSaveStruct()
{}

void _SectionSaveStruct::Restore( SwHTMLParser& rParser )
{
    // Font-Stacks wieder auftauen
    sal_uInt16 nMin = rParser.nBaseFontStMin;
    if( rParser.aBaseFontStack.Count() > nMin )
        rParser.aBaseFontStack.Remove( nMin,
                                rParser.aBaseFontStack.Count() - nMin );
    rParser.nBaseFontStMin = nBaseFontStMinSave;


    nMin = rParser.nFontStMin;
    if( rParser.aFontStack.Count() > nMin )
        rParser.aFontStack.Remove( nMin,
                            rParser.aFontStack.Count() - nMin );
    rParser.nFontStMin = nFontStMinSave;
    rParser.nFontStHeadStart = nFontStHeadStartSave;

    // Der Kontext-Stack muss schon aufgeraeumt sein!
    ASSERT( rParser.aContexts.Count() == rParser.nContextStMin &&
            rParser.aContexts.Count() == rParser.nContextStAttrMin,
            "Der Kontext-Stack wurde nicht aufgeraeumt" );
    rParser.nContextStMin = nContextStMinSave;
    rParser.nContextStAttrMin = nContextStAttrMinSave;

    // und noch ein par Zaehler rekonstruieren
    rParser.nDefListDeep = nDefListDeepSave;

    // und ein par Flags zuruecksetzen
    rParser.bNoParSpace = sal_False;
    rParser.nOpenParaToken = 0;

    if( rParser.aParaAttrs.Count() )
        rParser.aParaAttrs.Remove( 0, rParser.aParaAttrs.Count() );
}

/*  */

class _CellSaveStruct : public _SectionSaveStruct
{
    String aStyle, aId, aClass;
    String aBGImage;
    Color aBGColor;

    HTMLTableCnts* pCnts;           // Liste aller Inhalte
    HTMLTableCnts* pCurrCnts;   // der aktuelle Inhalt oder 0
    SwNodeIndex *pNoBreakEndParaIdx;// Absatz-Index eines </NOBR>

    double nValue;

    sal_uInt32 nNumFmt;

    sal_uInt16 nRowSpan, nColSpan, nWidth, nHeight;
    xub_StrLen nNoBreakEndCntntPos;     // Zeichen-Index eines </NOBR>

    SvxAdjust eAdjust;
    SwVertOrient eVertOri;

    sal_Bool bHead : 1;
    sal_Bool bPrcWidth : 1;
    sal_Bool bHasNumFmt : 1;
    sal_Bool bHasValue : 1;
    sal_Bool bBGColor : 1;
    sal_Bool bNoWrap : 1;       // NOWRAP-Option
    sal_Bool bNoBreak : 1;      // NOBREAK-Tag

public:

    _CellSaveStruct( SwHTMLParser& rParser, HTMLTable *pCurTable, sal_Bool bHd,
                     sal_Bool bReadOpt );

    virtual ~_CellSaveStruct();

    void AddContents( HTMLTableCnts *pNewCnts );
    HTMLTableCnts *GetFirstContents() { return pCnts; }

    void ClearIsInSection() { pCurrCnts = 0; }
    sal_Bool IsInSection() const { return pCurrCnts!=0; }
    HTMLTableCnts *GetCurrContents() const { return pCurrCnts; }

    void InsertCell( SwHTMLParser& rParser, HTMLTable *pCurTable );

    sal_Bool IsHeaderCell() const { return bHead; }

    void StartNoBreak( const SwPosition& rPos );
    void EndNoBreak( const SwPosition& rPos );
    void CheckNoBreak( const SwPosition& rPos, SwDoc *pDoc );
};


_CellSaveStruct::_CellSaveStruct( SwHTMLParser& rParser, HTMLTable *pCurTable,
                                  sal_Bool bHd, sal_Bool bReadOpt ) :
    _SectionSaveStruct( rParser ),
    pCnts( 0 ), pCurrCnts( 0 ), pNoBreakEndParaIdx( 0 ),
    nValue( 0.0 ),
    nNumFmt( 0 ),
    nRowSpan( 1 ), nColSpan( 1 ), nWidth( 0 ), nHeight( 0 ),
    nNoBreakEndCntntPos( 0 ),
    eAdjust( pCurTable->GetInheritedAdjust() ),
    bHead( bHd ),
    eVertOri( pCurTable->GetInheritedVertOri() ),
    bPrcWidth( sal_False ), bBGColor( sal_False ),
    bHasNumFmt( sal_False ), bHasValue( sal_False ),
    bNoWrap( sal_False ), bNoBreak( sal_False )
{
    String aNumFmt, aValue;

    if( bReadOpt )
    {
        const HTMLOptions *pOptions = rParser.GetOptions();
        for( sal_uInt16 i = pOptions->Count(); i; )
        {
            const HTMLOption *pOption = (*pOptions)[--i];
            switch( pOption->GetToken() )
            {
            case HTML_O_ID:
                aId = pOption->GetString();
                break;
            case HTML_O_COLSPAN:
                nColSpan = (sal_uInt16)pOption->GetNumber();
                break;
            case HTML_O_ROWSPAN:
                nRowSpan = (sal_uInt16)pOption->GetNumber();
                break;
            case HTML_O_ALIGN:
                eAdjust = (SvxAdjust)pOption->GetEnum(
                                        aHTMLPAlignTable, eAdjust );
                break;
            case HTML_O_VALIGN:
                eVertOri = (SwVertOrient)pOption->GetEnum(
                                        aHTMLTblVAlignTable, eVertOri );
                break;
            case HTML_O_WIDTH:
                nWidth = (sal_uInt16)pOption->GetNumber();  // nur fuer Netscape
                bPrcWidth = (pOption->GetString().Search('%') != STRING_NOTFOUND);
                if( bPrcWidth && nWidth>100 )
                    nWidth = 100;
                break;
            case HTML_O_HEIGHT:
                nHeight = (sal_uInt16)pOption->GetNumber(); // nur fuer Netscape
                if( pOption->GetString().Search('%') != STRING_NOTFOUND)
                    nHeight = 0;    // keine %-Angaben beruecksichtigen
                break;
            case HTML_O_BGCOLOR:
                // Leere BGCOLOR bei <TABLE>, <TR> und <TD>/<TH> wie Netscape
                // ignorieren, bei allen anderen Tags *wirklich* nicht.
                if( pOption->GetString().Len() )
                {
                    pOption->GetColor( aBGColor );
                    bBGColor = sal_True;
                }
                break;
            case HTML_O_BACKGROUND:
                aBGImage = pOption->GetString();
                break;
            case HTML_O_STYLE:
                aStyle = pOption->GetString();
                break;
            case HTML_O_CLASS:
                aClass = pOption->GetString();
                break;
            case HTML_O_SDNUM:
                aNumFmt = pOption->GetString();
                bHasNumFmt = sal_True;
                break;
            case HTML_O_SDVAL:
                bHasValue = sal_True;
                aValue = pOption->GetString();
                break;
            case HTML_O_NOWRAP:
                bNoWrap = sal_True;
                break;
            }
        }

        if( aId.Len() )
            rParser.InsertBookmark( aId );
    }

    if( bHasNumFmt )
    {
        LanguageType eLang;
        nValue = rParser.GetTableDataOptionsValNum(
                            nNumFmt, eLang, aValue, aNumFmt,
                            *rParser.pDoc->GetNumberFormatter() );
    }

    // einen neuen Kontext anlegen, aber das ::com::sun::star::drawing::Alignment-Attribut
    // nicht dort verankern, weil es noch ger keine Section gibt, in der
    // es gibt.
    sal_uInt16 nToken, nColl;
    if( bHead )
    {
        nToken = HTML_TABLEHEADER_ON;
        nColl = RES_POOLCOLL_TABLE_HDLN;
    }
    else
    {
        nToken = HTML_TABLEDATA_ON;
        nColl = RES_POOLCOLL_TABLE;
    }
    _HTMLAttrContext *pCntxt = new _HTMLAttrContext( nToken, nColl, aEmptyStr, sal_True );
    if( SVX_ADJUST_END != eAdjust )
        rParser.InsertAttr( &rParser.aAttrTab.pAdjust, SvxAdjustItem(eAdjust),
                            pCntxt );

    if( rParser.HasStyleOptions( aStyle, aId, aClass ) )
    {
        SfxItemSet aItemSet( rParser.pDoc->GetAttrPool(),
                             rParser.pCSS1Parser->GetWhichMap() );
        SvxCSS1PropertyInfo aPropInfo;

        if( rParser.ParseStyleOptions( aStyle, aId, aClass, aItemSet,
                                       aPropInfo ) )
            rParser.InsertAttrs( aItemSet, aPropInfo, pCntxt );
    }

    rParser.SplitPREListingXMP( pCntxt );

    rParser.PushContext( pCntxt );
}

_CellSaveStruct::~_CellSaveStruct()
{
    delete pNoBreakEndParaIdx;
}

void _CellSaveStruct::AddContents( HTMLTableCnts *pNewCnts )
{
    if( pCnts )
        pCnts->Add( pNewCnts );
    else
        pCnts = pNewCnts;

    pCurrCnts = pNewCnts;
}

void _CellSaveStruct::InsertCell( SwHTMLParser& rParser,
                                  HTMLTable *pCurTable )
{
#ifndef PRODUCT
    // Die Attribute muessen schon beim Auefrauemen des Kontext-Stacks
    // entfernt worden sein, sonst ist etwas schiefgelaufen. Das
    // Checken wir mal eben ...
    // MIB 8.1.98: Wenn ausserhalb einer Zelle Attribute geoeffnet
    // wurden stehen diese noch in der Attribut-Tabelle und werden erst
    // ganz zum Schluss durch die CleanContext-Aufrufe in BuildTable
    // geloescht. Damit es in diesem Fall keine Asserts gibt findet dann
    // keine Ueberpruefung statt. Erkennen tut man diesen Fall an
    // nContextStAttrMin: Der gemerkte Wert nContextStAttrMinSave ist der
    // Wert, den nContextStAttrMin beim Start der Tabelle hatte. Und
    // der aktuelle Wert von nContextStAttrMin entspricht der Anzahl der
    // Kontexte, die beim Start der Zelle vorgefunden wurden. Sind beide
    // Werte unterschiedlich, wurden ausserhalb der Zelle Kontexte
    // angelegt und wir ueberpruefen nichts.

    if( rParser.nContextStAttrMin == GetContextStAttrMin() )
    {
        _HTMLAttr** pTbl = (_HTMLAttr**)&rParser.aAttrTab;

        for( sal_uInt16 nCnt = sizeof( _HTMLAttrTable ) / sizeof( _HTMLAttr* );
            nCnt--; ++pTbl )
        {
            ASSERT( !*pTbl, "Die Attribut-Tabelle ist nicht leer" );
        }
    }
#endif

    // jetzt muessen wir noch die Zelle an der aktuellen Position einfuegen
    SvxBrushItem *pBrushItem =
        rParser.CreateBrushItem( bBGColor ? &aBGColor : 0, aBGImage,
                                 aStyle, aId, aClass );
    pCurTable->InsertCell( pCnts, nRowSpan, nColSpan, nWidth,
                           bPrcWidth, nHeight, eVertOri, pBrushItem,
                           bHasNumFmt, nNumFmt, bHasValue, nValue,
                           bNoWrap );
    Restore( rParser );
}

void _CellSaveStruct::StartNoBreak( const SwPosition& rPos )
{
    if( !pCnts ||
        (!rPos.nContent.GetIndex() && pCurrCnts==pCnts &&
         pCnts->GetStartNode() &&
         pCnts->GetStartNode()->GetIndex() + 1 ==
            rPos.nNode.GetIndex()) )
    {
        bNoBreak = sal_True;
    }
}

void _CellSaveStruct::EndNoBreak( const SwPosition& rPos )
{
    if( bNoBreak )
    {
        delete pNoBreakEndParaIdx;
        pNoBreakEndParaIdx = new SwNodeIndex( rPos.nNode );
        nNoBreakEndCntntPos = rPos.nContent.GetIndex();
        bNoBreak = sal_False;
    }
}

void _CellSaveStruct::CheckNoBreak( const SwPosition& rPos, SwDoc *pDoc )
{
    if( pCnts && pCurrCnts==pCnts )
    {
        if( bNoBreak )
        {
            // <NOBR> wurde nicht beendet
            pCnts->SetNoBreak();
        }
        else if( pNoBreakEndParaIdx &&
                 pNoBreakEndParaIdx->GetIndex() == rPos.nNode.GetIndex() )
        {
            if( nNoBreakEndCntntPos == rPos.nContent.GetIndex() )
            {
                // <NOBR> wurde unmittelbar vor dem Zellen-Ende beendet
                pCnts->SetNoBreak();
            }
            else if( nNoBreakEndCntntPos + 1 == rPos.nContent.GetIndex() )
            {
                const SwTxtNode *pTxtNd =
                    pDoc->GetNodes()[rPos.nNode]->GetTxtNode();
                if( pTxtNd )
                {
                    register sal_Unicode cLast =
                            pTxtNd->GetTxt().GetChar(nNoBreakEndCntntPos);
                    if( ' '==cLast || '\x0a'==cLast )
                    {
                        // Zwischem dem </NOBR> und dem Zellen-Ende gibt es nur
                        // ein Blank oder einen Zeilenumbruch.
                        pCnts->SetNoBreak();
                    }
                }
            }
        }
    }
}



HTMLTableCnts *SwHTMLParser::InsertTableContents(
                                        sal_Bool bHead )
{
    // eine neue Section anlegen, der PaM steht dann darin
    const SwStartNode *pStNd =
        InsertTableSection( bHead ? RES_POOLCOLL_TABLE_HDLN
                                           : RES_POOLCOLL_TABLE );

    if( GetNumInfo().GetNumRule() )
    {
        // 1. Absatz auf nicht numeriert setzen
        SetNodeNum( GetNumInfo().GetLevel() | NO_NUMLEVEL );
    }

    // Attributierungs-Anfang neu setzen
    const SwNodeIndex& rSttPara = pPam->GetPoint()->nNode;
    xub_StrLen nSttCnt = pPam->GetPoint()->nContent.GetIndex();

    _HTMLAttr** pTbl = (_HTMLAttr**)&aAttrTab;
    for( sal_uInt16 nCnt = sizeof( _HTMLAttrTable ) / sizeof( _HTMLAttr* );
        nCnt--; ++pTbl )
    {

        _HTMLAttr *pAttr = *pTbl;
        while( pAttr )
        {
            ASSERT( !pAttr->GetPrev(), "Attribut hat Previous-Liste" );
            pAttr->nSttPara = rSttPara;
            pAttr->nEndPara = rSttPara;
            pAttr->nSttCntnt = nSttCnt;
            pAttr->nEndCntnt = nSttCnt;

            pAttr = pAttr->GetNext();
        }
    }

    return new HTMLTableCnts( pStNd );
}

sal_uInt16 SwHTMLParser::IncGrfsThatResizeTable()
{
    return pTable ? pTable->IncGrfsThatResize() : 0;
}

void SwHTMLParser::RegisterDrawObjectToTable( HTMLTable *pCurTable,
                                        SdrObject *pObj, sal_uInt8 nPrcWidth )
{
    pCurTable->RegisterDrawObject( pObj, nPrcWidth );
}

void SwHTMLParser::BuildTableCell( HTMLTable *pCurTable, sal_Bool bReadOptions,
                                   sal_Bool bHead )
{
    if( !IsParserWorking() && !pPendStack )
        return;

    _CellSaveStruct* pSaveStruct;

    int nToken = 0;
    sal_Bool bPending = sal_False;
    if( pPendStack )
    {
        pSaveStruct = (_CellSaveStruct*)pPendStack->pData;

        SwPendingStack* pTmp = pPendStack->pNext;
        delete pPendStack;
        pPendStack = pTmp;
        nToken = pPendStack ? pPendStack->nToken : GetSaveToken();
        bPending = SVPAR_ERROR == eState && pPendStack != 0;

        SaveState( nToken );
    }
    else
    {
        // <TH> bzw. <TD> wurde bereits gelesen
        if( pTable->IsOverflowing() )
        {
            SaveState( 0 );
            return;
        }

        if( !pCurTable->GetContext() )
        {
//          MIB: 5.9.2000: Do we need this any longer?
//          bIsWriterDoc = sal_True;
            sal_Bool bTopTable = pTable==pCurTable;

            // die Tabelle besitzt noch keinen Inhalt, d.h. die eigentliche
            // Tabelle muss erst noch angelegt werden

            String aStyle, aId, aClass;
            static sal_uInt16 aWhichIds[] =
            {
                RES_PARATR_SPLIT,   RES_PARATR_SPLIT,
                RES_PAGEDESC,       RES_PAGEDESC,
                RES_BREAK,          RES_BREAK,
                RES_BACKGROUND,     RES_BACKGROUND,
                RES_KEEP,           RES_KEEP,
                RES_LAYOUT_SPLIT,   RES_LAYOUT_SPLIT,
                0
            };

            SfxItemSet aItemSet( pDoc->GetAttrPool(), aWhichIds );
            SvxCSS1PropertyInfo aPropInfo;

            sal_Bool bStyleParsed = ParseStyleOptions( pCurTable->GetStyle(),
                                                   pCurTable->GetId(),
                                                   pCurTable->GetClass(),
                                                   aItemSet, aPropInfo );
            const SfxPoolItem *pItem = 0;
            if( bStyleParsed )
            {
                if( SFX_ITEM_SET == aItemSet.GetItemState(
                                        RES_BACKGROUND, sal_False, &pItem ) )
                {
                    pCurTable->SetBGBrush( *(const SvxBrushItem *)pItem );
                    aItemSet.ClearItem( RES_BACKGROUND );
                }
                if( SFX_ITEM_SET == aItemSet.GetItemState(
                                        RES_PARATR_SPLIT, sal_False, &pItem ) )
                {
                    aItemSet.Put(
                        SwFmtLayoutSplit( ((const SvxFmtSplitItem *)pItem)
                                                ->GetValue() ) );
                    aItemSet.ClearItem( RES_PARATR_SPLIT );
                }
            }

            // Den linken/rechten Absatzeinzug ermitteln
            sal_uInt16 nLeftSpace = 0;
            sal_uInt16 nRightSpace = 0;
            short nIndent;
            GetMarginsFromContextWithNumBul( nLeftSpace, nRightSpace, nIndent );

            // die aktuelle Position an die wir irgendwann zurueckkehren
            SwPosition *pSavePos = 0;
            sal_Bool bForceFrame = sal_False;
            sal_Bool bAppended = sal_False;
            sal_Bool bParentLFStripped = sal_False;
            if( bTopTable )
            {
                // Sind wir in einer Tabelle in der Tabelle?
                const SwNode *pNd = pDoc->GetNodes()[pPam->GetPoint()->nNode];
                const SwTableNode *pTblNd = pNd->FindTableNode();

                SvxAdjust eTblAdjust = pTable->GetTableAdjust(sal_False);

                // Wenn das Table-Tag in einem Rahmen stand, den es nicht
                // mehr gibt, muessen wir die Tabelle in einen Rahmen
                // stecken.
                if( pCurTable->IsMakeTopSubTable() && pTblNd!=0 )
                    pCurTable->SetHasToFly();

                // Wenn die Tabelle links oder rechts ausgerivchtet ist,
                // oder in einen Rahmen soll, dann kommt sie auch in einen
                // solchen.
                bForceFrame = eTblAdjust == SVX_ADJUST_LEFT ||
                              eTblAdjust == SVX_ADJUST_RIGHT ||
                              pCurTable->HasToFly();

                // Da Tabelle in Tabelle nicht geht, muss die Tabelle
                // entweder in einen Rahmen, oder sie steht in einem
                // Rahmen sie steht in keiner anderen Tabelle.
                ASSERT( bForceFrame || !pTblNd,
                        "Tabelle in der Tabelle geht nur mit oder in Rahmen" );

                // Entweder kommt die Tabelle in keinen Rahmen und befindet
                // sich in keinem Rahmen (wird also durch Zellen simuliert),
                // oder es gibt bereits Inhalt an der entsprechenden Stelle.
                ASSERT( !bForceFrame || pCurTable->HasParentSection(),
                        "Tabelle im Rahmen hat keine Umgebung!" );
//              SCHOEN WAER'S, aber wie bekommen den Inhalt nicht zurueck
//              in die umgebende Zelle
//              if( bForceFrame && !pCurTable->HasParentSection() )
//              {
//                  pCurTable->SetParentContents(
//                      InsertTableContents( sal_False, SVX_ADJUST_END ) );
//                  pCurTable->SetHasParentSection( sal_True );
//              }

                sal_Bool bAppend = sal_False;
                if( bForceFrame )
                {
                    // Wenn die Tabelle in einen Rahmen kommt, muss
                    // nur ein neuer Absatz aufgemacht werden, wenn
                    // der Absatz Rahmen ohne Umlauf enthaelt.
                    bAppend = HasCurrentParaFlys(sal_True);
                }
                else
                {
                    // Sonst muss ein neuer Absatz aufgemacht werden,
                    // wenn der Absatz nicht leer ist, oder Rahmen
                    // oder ::com::sun::star::text::Bookmarks enthaelt.
                    bAppend =
                        pPam->GetPoint()->nContent.GetIndex() ||
                        HasCurrentParaFlys() ||
                        HasCurrentParaBookmarks();
                }
                if( bAppend )
                {
                    if( !pPam->GetPoint()->nContent.GetIndex() )
                    {
                        pDoc->SetTxtFmtColl( *pPam,
                            pCSS1Parser->GetTxtCollFromPool(RES_POOLCOLL_STANDARD) );
                        _HTMLAttr* pTmp =
                            new _HTMLAttr( *pPam->GetPoint(),
                                            SvxFontHeightItem( 40 ) );
                        aSetAttrTab.Insert( pTmp, aSetAttrTab.Count() );
                        pTmp = new _HTMLAttr( *pPam->GetPoint(),
                                            SvxULSpaceItem( 0, 0 ) );
                        aSetAttrTab.Insert( pTmp, 0 ); // ja, 0, weil schon
                                                        // vom Tabellenende vorher
                                                        // was gesetzt sein kann.
                    }
                    AppendTxtNode( AM_NOSPACE );
                    bAppended = sal_True;
                }
                else if( aParaAttrs.Count() )
                {
                    if( !bForceFrame )
                    {
                        // Der Absatz wird gleich hinter die Tabelle
                        // verschoben. Deshalb entfernen wir alle harten
                        // Attribute des Absatzes

                        for( sal_uInt16 i=0; i<aParaAttrs.Count(); i++ )
                            aParaAttrs[i]->Invalidate();
                    }

                    aParaAttrs.Remove( 0, aParaAttrs.Count() );
                }

                pSavePos = new SwPosition( *pPam->GetPoint() );
            }
            else if( pCurTable->HasParentSection() )
            {
                bParentLFStripped = StripTrailingLF() > 0;

                // Absaetze bzw. ueberschriften beeenden
                nOpenParaToken = 0;
                nFontStHeadStart = nFontStMin;

                // die harten Attribute an diesem Absatz werden nie mehr ungueltig
                if( aParaAttrs.Count() )
                    aParaAttrs.Remove( 0, aParaAttrs.Count() );

#ifndef NUM_RELSPACE
                if( GetNumInfo().GetNumRule() )
                    UpdateNumRuleInTable();
#endif
            }

            // einen Tabellen Kontext anlegen
            _HTMLTableContext *pTCntxt =
                        new _HTMLTableContext( pSavePos, nContextStMin,
                                               nContextStAttrMin );

            // alle noch offenen Attribute beenden und hinter der Tabelle
            // neu aufspannen
            _HTMLAttrs *pPostIts = 0;
            if( !bForceFrame && (bTopTable || pCurTable->HasParentSection()) )
            {
                SplitAttrTab( pTCntxt->aAttrTab, bTopTable );
                // Wenn wir einen schon vorhandenen Absatz verwenden, duerfen
                // in den keine PostIts eingefuegt werden, weil der Absatz
                // ja hinter die Tabelle wandert. Sie werden deshalb in den
                // ersten Absatz der Tabelle verschoben.
                // Bei Tabellen in Tabellen duerfen ebenfalls keine PostIts
                // in einen noch leeren Absatz eingefuegt werden, weil
                // der sonat nicht geloescht wird.
                if( (bTopTable && !bAppended) ||
                    (!bTopTable && !bParentLFStripped &&
                     !pPam->GetPoint()->nContent.GetIndex()) )
                    pPostIts = new _HTMLAttrs;
                SetAttr( bTopTable, bTopTable, pPostIts );
            }
            else
            {
                SaveAttrTab( pTCntxt->aAttrTab );
                if( bTopTable && !bAppended )
                {
                    pPostIts = new _HTMLAttrs;
                    SetAttr( sal_True, sal_True, pPostIts );
                }
            }
            bNoParSpace = sal_False;

            // Aktuelle Numerierung retten und auschalten.
            pTCntxt->SetNumInfo( GetNumInfo() );
            GetNumInfo().Clear();
            pTCntxt->SavePREListingXMP( *this );

            if( bTopTable )
            {
                if( bForceFrame )
                {
                    // Die Tabelle soll in einen Rahmen geschaufelt werden.

                    SfxItemSet aFrmSet( pDoc->GetAttrPool(),
                                        RES_FRMATR_BEGIN, RES_FRMATR_END-1 );
                    if( !pCurTable->IsNewDoc() )
                        Reader::ResetFrmFmtAttrs( aFrmSet );

                    SwSurround eSurround = SURROUND_NONE;
                    SwHoriOrient eHori;

                    switch( pCurTable->GetTableAdjust(sal_True) )
                    {
                    case SVX_ADJUST_RIGHT:
                        eHori = HORI_RIGHT;
                        eSurround = SURROUND_LEFT;
                        break;
                    case SVX_ADJUST_CENTER:
                        eHori = HORI_CENTER;
                        break;
                    case SVX_ADJUST_LEFT:
                        eSurround = SURROUND_RIGHT;
                    default:
                        eHori = HORI_LEFT;
                        break;
                    }
                    SetAnchorAndAdjustment( VERT_NONE, eHori, aFrmSet,
                                            sal_True );
                    aFrmSet.Put( SwFmtSurround(eSurround) );

                    SwFmtFrmSize aFrmSize( ATT_VAR_SIZE, 20*MM50, MINLAY );
                    aFrmSize.SetWidthPercent( 100 );
                    aFrmSet.Put( aFrmSize );

                    sal_uInt16 nSpace = pCurTable->GetHSpace();
                    if( nSpace )
                        aFrmSet.Put( SvxLRSpaceItem(nSpace,nSpace) );
                    nSpace = pCurTable->GetVSpace();
                    if( nSpace )
                        aFrmSet.Put( SvxULSpaceItem(nSpace,nSpace) );

                    RndStdIds eAnchorId = ((const SwFmtAnchor&)aFrmSet.
                                                Get( RES_ANCHOR )).
                                                GetAnchorId();
                    SwFrmFmt *pFrmFmt =  pDoc->MakeFlySection(
                                eAnchorId, pPam->GetPoint(), &aFrmSet );

                    pTCntxt->SetFrmFmt( pFrmFmt );
                    const SwFmtCntnt& rFlyCntnt = pFrmFmt->GetCntnt();
                    pPam->GetPoint()->nNode = *rFlyCntnt.GetCntntIdx();
                    SwCntntNode *pCNd =
                        pDoc->GetNodes().GoNext( &(pPam->GetPoint()->nNode) );
                    pPam->GetPoint()->nContent.Assign( pCNd, 0 );

                    // automatisch verankerte Rahmen muessen noch um
                    // eine Position nach vorne verschoben werden.
                    //if( FLY_AUTO_CNTNT==eAnchorId )
                    //  aMoveFlyFrms.C40_INSERT( SwFrmFmt, pFrmFmt,
                    //                           aMoveFlyFrms.Count() );
                }

                // eine SwTable mit einer Box anlegen und den PaM in den
                // Inhalt der Box-Section bewegen (der Ausrichtungs-Parameter
                // ist erstmal nur ein Dummy und wird spaeter noch richtig
                // gesetzt)
                ASSERT( !pPam->GetPoint()->nContent.GetIndex(),
                        "Der Absatz hinter der Tabelle ist nicht leer!" );
                const SwTable* pSwTable = pDoc->InsertTable( *pPam->GetPoint(),
                                                         1, 1, HORI_LEFT );

                if( bForceFrame )
                {
                    SwNodeIndex aDstIdx( pPam->GetPoint()->nNode );
                    pPam->Move( fnMoveBackward );
                    pDoc->GetNodes().Delete( aDstIdx );
                }
                else
                {
                    if( bStyleParsed )
                    {
                        pCSS1Parser->SetFmtBreak( aItemSet, aPropInfo );
                        pSwTable->GetFrmFmt()->SetAttr( aItemSet );
                    }
                    pPam->Move( fnMoveBackward );
                }

                const SwNode *pNd = pDoc->GetNodes()[pPam->GetPoint()->nNode];
                if( !bAppended && !bForceFrame )
                {
                    SwTxtNode* pOldTxtNd =
                        pDoc->GetNodes()[pSavePos->nNode]->GetTxtNode();
                    ASSERT( pOldTxtNd, "Wieso stehen wir in keinem Txt-Node?" );
                    SwFrmFmt *pFrmFmt = pSwTable->GetFrmFmt();

                    const SfxPoolItem* pItem;
                    if( SFX_ITEM_SET == pOldTxtNd->GetSwAttrSet()
                            .GetItemState( RES_PAGEDESC, sal_False, &pItem ) &&
                        ((SwFmtPageDesc *)pItem)->GetPageDesc() )
                    {
                        pFrmFmt->SetAttr( *pItem );
                        pOldTxtNd->ResetAttr( RES_PAGEDESC );
                    }
                    if( SFX_ITEM_SET == pOldTxtNd->GetSwAttrSet()
                            .GetItemState( RES_BREAK, sal_True, &pItem ) )
                    {
                        switch( ((SvxFmtBreakItem *)pItem)->GetBreak() )
                        {
                        case SVX_BREAK_PAGE_BEFORE:
                        case SVX_BREAK_PAGE_AFTER:
                        case SVX_BREAK_PAGE_BOTH:
                            pFrmFmt->SetAttr( *pItem );
                            pOldTxtNd->ResetAttr( RES_BREAK );
                        }
                    }
                }

                if( !bAppended && pPostIts )
                {
                    // noch vorhandene PostIts in den ersten Absatz
                    // der Tabelle setzen
                    InsertAttrs( *pPostIts );
                    delete pPostIts;
                    pPostIts = 0;
                }

                pTCntxt->SetTableNode( (SwTableNode *)pNd->FindTableNode() );

                pCurTable->SetTable( pTCntxt->GetTableNode(), pTCntxt,
                                     nLeftSpace, nRightSpace,
                                     pSwTable, bForceFrame );

                ASSERT( !pPostIts, "ubenutzte PostIts" );
            }
            else
            {
                // noch offene Bereiche muessen noch entfernt werden
                if( EndSections( bParentLFStripped ) )
                    bParentLFStripped = sal_False;

                if( pCurTable->HasParentSection() )
                {
                    // dannach entfernen wir ein ggf. zu viel vorhandenen
                    // leeren Absatz, aber nur, wenn er schon vor dem
                    // entfernen von LFs leer war
                    if( !bParentLFStripped )
                        StripTrailingPara();

                    if( pPostIts )
                    {
                        // noch vorhandene PostIts an das Ende des jetzt
                        // aktuellen Absatzes schieben
                        InsertAttrs( *pPostIts );
                        delete pPostIts;
                        pPostIts = 0;
                    }
                }

                const SwNode *pNd = pDoc->GetNodes()[pPam->GetPoint()->nNode];
                const SwStartNode *pStNd = (pTable->bFirstCell ? pNd->FindTableNode()
                                                            : pNd->FindTableBoxStartNode() );

                pCurTable->SetTable( pStNd, pTCntxt, nLeftSpace, nRightSpace );
            }

            // Den Kontext-Stack einfrieren, denn es koennen auch mal
            // irgendwo ausserhalb von Zellen Attribute gesetzt werden.
            // Darf nicht frueher passieren, weil eventuell noch im
            // Stack gesucht wird!!!
            nContextStMin = aContexts.Count();
            nContextStAttrMin = nContextStMin;
        }

        pSaveStruct = new _CellSaveStruct( *this, pCurTable, bHead,
                                            bReadOptions );

        // ist beim ersten GetNextToken schon pending, muss bei
        // wiederaufsetzen auf jedenfall neu gelesen werden!
        SaveState( 0 );
    }

    if( !nToken )
        nToken = GetNextToken();    // Token nach <TABLE>

    sal_Bool bDone = sal_False;
    while( (IsParserWorking() && !bDone) || bPending )
    {
        SaveState( nToken );

        nToken = FilterToken( nToken );

        ASSERT( pPendStack || !bCallNextToken || pSaveStruct->IsInSection(),
                "Wo ist die Section gebieben?" );
        if( !pPendStack && bCallNextToken && pSaveStruct->IsInSection() )
        {
            // NextToken direkt aufrufen (z.B. um den Inhalt von
            // Floating-Frames oder Applets zu ignorieren)
            NextToken( nToken );
        }
        else switch( nToken )
        {
        case HTML_TABLEHEADER_ON:
        case HTML_TABLEDATA_ON:
        case HTML_TABLEROW_ON:
        case HTML_TABLEROW_OFF:
        case HTML_THEAD_ON:
        case HTML_THEAD_OFF:
        case HTML_TFOOT_ON:
        case HTML_TFOOT_OFF:
        case HTML_TBODY_ON:
        case HTML_TBODY_OFF:
        case HTML_TABLE_OFF:
            SkipToken(-1);
        case HTML_TABLEHEADER_OFF:
        case HTML_TABLEDATA_OFF:
            bDone = sal_True;
            break;
        case HTML_TABLE_ON:
            {
                sal_Bool bTopTable = sal_False;
                sal_Bool bHasToFly = sal_False;
                SvxAdjust eTabAdjust = SVX_ADJUST_END;
                if( !pPendStack )
                {
                    // nur wenn eine neue Tabelle aufgemacht wird, aber
                    // nicht wenn nach einem Pending in der Tabelle
                    // weitergelesen wird!
                    pSaveStruct->pTable = pTable;

                    // HACK: Eine Section fuer eine Tabelle anlegen, die
                    // in einen Rahmen kommt.
                    if( !pSaveStruct->IsInSection() )
                    {
                        // Diese Schleife muss vorwartes sein, weil die
                        // erste Option immer gewinnt.
                        sal_Bool bNeedsSection = sal_False;
                        const HTMLOptions *pOptions = GetOptions();
                        for( sal_uInt16 i=0; i<pOptions->Count(); i++ )
                        {
                            const HTMLOption *pOption = (*pOptions)[i];
                            if( HTML_O_ALIGN==pOption->GetToken() )
                            {
                                SvxAdjust eAdjust =
                                    (SvxAdjust)pOption->GetEnum(
                                            aHTMLPAlignTable, SVX_ADJUST_END );
                                bNeedsSection = SVX_ADJUST_LEFT == eAdjust ||
                                                SVX_ADJUST_RIGHT == eAdjust;
                                break;
                            }
                        }
                        if( bNeedsSection )
                        {
                            pSaveStruct->AddContents(
                                InsertTableContents(bHead  ) );
                        }
                    }
                    else
                    {
                        // Wenn wir mitlerweile in einem Rahmen stehen
                        // koennen wir erneut eine echte Tabelle aufmachen.
                        // Wir erkennen das daran, dass wir keinen
                        // Tabellen-Node mehr finden.
                        bTopTable = pDoc->GetNodes()[pPam->GetPoint()->nNode]
                                        ->FindTableNode() == 0;

                        // Wenn im aktuellen Absatz Flys verankert sind,
                        // muss die neue Tabelle in einen Rahmen.
                        bHasToFly = HasCurrentParaFlys(sal_False,sal_True);
                    }

                    // in der Zelle kann sich ein Bereich befinden!
                    eTabAdjust = aAttrTab.pAdjust
                        ? ((const SvxAdjustItem&)aAttrTab.pAdjust->GetItem()).
                                                 GetAdjust()
                        : SVX_ADJUST_END;
                }

                HTMLTable *pSubTable = BuildTable( eTabAdjust,
                                                   bHead,
                                                   pSaveStruct->IsInSection(),
                                                   bTopTable, bHasToFly );
                if( SVPAR_PENDING != GetStatus() )
                {
                    // nur wenn die Tabelle wirklich zu Ende ist!
                    if( pSubTable )
                    {
                        ASSERT( pSubTable->GetTableAdjust(sal_False)!= SVX_ADJUST_LEFT &&
                                pSubTable->GetTableAdjust(sal_False)!= SVX_ADJUST_RIGHT,
                                "links oder rechts ausgerichtete Tabellen gehoehren in Rahmen" );


                        HTMLTableCnts *pParentContents =
                            pSubTable->GetParentContents();
                        if( pParentContents )
                        {
                            ASSERT( !pSaveStruct->IsInSection(),
                                    "Wo ist die Section geblieben" );

                            // Wenn jetzt keine Tabelle kommt haben wir eine
                            // Section
                            pSaveStruct->AddContents( pParentContents );
                        }

                        const SwStartNode *pCapStNd =
                                pSubTable->GetCaptionStartNode();

                        if( pSubTable->GetContext() )
                        {
                            ASSERT( !pSubTable->GetContext()->GetFrmFmt(),
                                    "Tabelle steht im Rahmen" );

                            if( pCapStNd && pSubTable->IsTopCaption() )
                            {
                                pSaveStruct->AddContents(
                                    new HTMLTableCnts(pCapStNd) );
                            }

                            pSaveStruct->AddContents(
                                new HTMLTableCnts(pSubTable) );

                            if( pCapStNd && !pSubTable->IsTopCaption() )
                            {
                                pSaveStruct->AddContents(
                                    new HTMLTableCnts(pCapStNd) );
                            }

                            // Jetzt haben wir keine Section mehr
                            pSaveStruct->ClearIsInSection();
                        }
                        else if( pCapStNd )
                        {
                            // Da wir diese Sction nicht mehr loeschen
                            // koennen (sie koeente zur erster Box
                            // gehoeren), fuegen wir sie ein.
                            pSaveStruct->AddContents(
                                new HTMLTableCnts(pCapStNd) );

                            // Jetzt haben wir keine Section mehr
                            pSaveStruct->ClearIsInSection();
                        }
                    }

                    pTable = pSaveStruct->pTable;
                }
            }
            break;

        case HTML_NOBR_ON:
            // HACK fuer MS: Steht das <NOBR> zu beginn der Zelle?
            pSaveStruct->StartNoBreak( *pPam->GetPoint() );
            break;

        case HTML_NOBR_OFF:
                pSaveStruct->EndNoBreak( *pPam->GetPoint() );
            break;

        case HTML_COMMENT:
            // Mit Kommentar-Feldern werden Spaces nicht mehr geloescht
            // ausserdem wollen wir fuer einen Kommentar keine neue Zelle
            // anlegen !!!
            NextToken( nToken );
            break;

        case HTML_MARQUEE_ON:
            if( !pSaveStruct->IsInSection() )
            {
                // eine neue Section anlegen, der PaM steht dann darin
                pSaveStruct->AddContents(
                    InsertTableContents( bHead ) );
            }
            bCallNextToken = sal_True;
            NewMarquee( pCurTable );
            break;

        case HTML_TEXTTOKEN:
            // keine Section fuer einen leeren String anlegen
            if( !pSaveStruct->IsInSection() && 1==aToken.Len() &&
                ' '==aToken.GetChar(0) )
                break;
        default:
            if( !pSaveStruct->IsInSection() )
            {
                // eine neue Section anlegen, der PaM steht dann darin
                pSaveStruct->AddContents(
                    InsertTableContents( bHead ) );
            }

            if( IsParserWorking() || bPending )
                NextToken( nToken );
            break;
        }

        ASSERT( !bPending || !pPendStack,
                "SwHTMLParser::BuildTableCell: Es gibt wieder einen Pend-Stack" );
        bPending = sal_False;
        if( IsParserWorking() )
            SaveState( 0 );

        if( !bDone )
            nToken = GetNextToken();
    }

    if( SVPAR_PENDING == GetStatus() )
    {
        pPendStack = new SwPendingStack( bHead ? HTML_TABLEHEADER_ON
                                               : HTML_TABLEDATA_ON, pPendStack );
        pPendStack->pData = pSaveStruct;

        return;
    }

    // Falls der Inhalt der Zelle leer war, muessen wir noch einen
    // leeren Inhalt anlegen. Ausserdem legen wir einen leeren Inhalt
    // an, wenn die Zelle mit einer Tabelle aufgehoert hat und keine
    // COL-Tags hatte (sonst wurde sie wahrscheinlich von uns exportiert,
    // und dann wollen wir natuerlich keinen zusaetzlichen Absatz haben).
    if( !pSaveStruct->GetFirstContents() ||
        (!pSaveStruct->IsInSection() && !pCurTable->HasColTags()) )
    {
        ASSERT( pSaveStruct->GetFirstContents() ||
                !pSaveStruct->IsInSection(),
                "Section oder nicht, das ist hier die Frage" );
        const SwStartNode *pStNd =
            InsertTableSection( pSaveStruct->IsHeaderCell()
                                        ? RES_POOLCOLL_TABLE_HDLN
                                        : RES_POOLCOLL_TABLE );
        pDoc->GetNodes()[pStNd->GetIndex()+1]
            ->GetCntntNode()->SetAttr( SvxFontHeightItem(40) );
        pSaveStruct->AddContents( new HTMLTableCnts(pStNd) );
        pSaveStruct->ClearIsInSection();
    }

    sal_Bool bLFStripped = sal_False;
    if( pSaveStruct->IsInSection() )
    {
        pSaveStruct->CheckNoBreak( *pPam->GetPoint(), pDoc );

        // Alle noch offenen Kontexte beenden. Wir nehmen hier
        // AttrMin, weil nContxtStMin evtl. veraendert wurde.
        // Da es durch EndContext wieder restauriert wird, geht das.
        while( aContexts.Count() > nContextStAttrMin+1 )
        {
            _HTMLAttrContext *pCntxt = PopContext();
            EndContext( pCntxt );
            delete pCntxt;
        }

        // LFs am Absatz-Ende entfernen
        if( StripTrailingLF()==0 && !pPam->GetPoint()->nContent.GetIndex() )
            StripTrailingPara();

#ifndef NUM_RELSPACE
        if( GetNumInfo().GetNumRule() )
            UpdateNumRuleInTable();
#endif

        // falls fuer die Zelle eine Ausrichtung gesetzt wurde, muessen
        // wir die beenden
        _HTMLAttrContext *pCntxt = PopContext();
        EndContext( pCntxt );
        delete pCntxt;
    }
    else
    {
        // Alle noch offenen Kontexte beenden
        while( aContexts.Count() > nContextStAttrMin )
        {
            _HTMLAttrContext *pCntxt = PopContext();
            ClearContext( pCntxt );
            delete pCntxt;
        }
    }

    // auch eine Numerierung muss beendet werden
    GetNumInfo().Clear();

    SetAttr( sal_False );

    pSaveStruct->InsertCell( *this, pCurTable );

    // wir stehen jetzt (wahrschenlich) vor <TH>, <TD>, <TR> oder </TABLE>
    delete pSaveStruct;
}


class _RowSaveStruct : public SwPendingStackData
{
public:
    SvxAdjust eAdjust;
    SwVertOrient eVertOri;
    sal_Bool bHasCells;

    _RowSaveStruct() :
        bHasCells( sal_False ), eAdjust( SVX_ADJUST_END ), eVertOri( VERT_TOP )
    {}
};


void SwHTMLParser::BuildTableRow( HTMLTable *pCurTable, sal_Bool bReadOptions,
                                  SvxAdjust eGrpAdjust,
                                  SwVertOrient eGrpVertOri )
{
    // <TR> wurde bereist gelesen

    if( !IsParserWorking() && !pPendStack )
        return;

    int nToken = 0;
    _RowSaveStruct* pSaveStruct;

    sal_Bool bPending = sal_False;
    if( pPendStack )
    {
        pSaveStruct = (_RowSaveStruct*)pPendStack->pData;

        SwPendingStack* pTmp = pPendStack->pNext;
        delete pPendStack;
        pPendStack = pTmp;
        nToken = pPendStack ? pPendStack->nToken : GetSaveToken();
        bPending = SVPAR_ERROR == eState && pPendStack != 0;

        SaveState( nToken );
    }
    else
    {
        SvxAdjust eAdjust = eGrpAdjust;
        SwVertOrient eVertOri = eGrpVertOri;
        Color aBGColor;
        String aBGImage, aStyle, aId, aClass;
        sal_Bool bBGColor = sal_False;
        pSaveStruct = new _RowSaveStruct;

        if( bReadOptions )
        {
            const HTMLOptions *pOptions = GetOptions();
            for( sal_uInt16 i = pOptions->Count(); i; )
            {
                const HTMLOption *pOption = (*pOptions)[--i];
                switch( pOption->GetToken() )
                {
                case HTML_O_ID:
                    aId = pOption->GetString();
                    break;
                case HTML_O_ALIGN:
                    eAdjust = (SvxAdjust)pOption->GetEnum(
                                    aHTMLPAlignTable, eAdjust );
                    break;
                case HTML_O_VALIGN:
                    eVertOri = (SwVertOrient)pOption->GetEnum(
                                    aHTMLTblVAlignTable, eVertOri );
                    break;
                case HTML_O_BGCOLOR:
                    // Leere BGCOLOR bei <TABLE>, <TR> und <TD>/<TH> wie Netsc.
                    // ignorieren, bei allen anderen Tags *wirklich* nicht.
                    if( pOption->GetString().Len() )
                    {
                        pOption->GetColor( aBGColor );
                        bBGColor = sal_True;
                    }
                    break;
                case HTML_O_BACKGROUND:
                    aBGImage = pOption->GetString();
                    break;
                case HTML_O_STYLE:
                    aStyle = pOption->GetString();
                    break;
                case HTML_O_CLASS:
                    aClass= pOption->GetString();
                    break;
                }
            }
        }

        if( aId.Len() )
            InsertBookmark( aId );

        SvxBrushItem *pBrushItem =
            CreateBrushItem( bBGColor ? &aBGColor : 0, aBGImage, aStyle,
                             aId, aClass );
        pCurTable->OpenRow( eAdjust, eVertOri, pBrushItem );
        // ist beim ersten GetNextToken schon pending, muss bei
        // wiederaufsetzen auf jedenfall neu gelesen werden!
        SaveState( 0 );
    }

    if( !nToken )
        nToken = GetNextToken();    // naechstes Token

    sal_Bool bDone = sal_False;
    while( (IsParserWorking() && !bDone) || bPending )
    {
        SaveState( nToken );

        nToken = FilterToken( nToken );

        ASSERT( pPendStack || !bCallNextToken ||
                pCurTable->GetContext() || pCurTable->HasParentSection(),
                "Wo ist die Section gebieben?" );
        if( !pPendStack && bCallNextToken &&
            (pCurTable->GetContext() || pCurTable->HasParentSection()) )
        {
            // NextToken direkt aufrufen (z.B. um den Inhalt von
            // Floating-Frames oder Applets zu ignorieren)
            NextToken( nToken );
        }
        else switch( nToken )
        {
        case HTML_TABLE_ON:
            if( !pCurTable->GetContext()  )
            {
                SkipToken( -1 );
                bDone = sal_True;
            }
//          else
//          {
//              NextToken( nToken );
//          }
            break;
        case HTML_TABLEROW_ON:
        case HTML_THEAD_ON:
        case HTML_THEAD_OFF:
        case HTML_TBODY_ON:
        case HTML_TBODY_OFF:
        case HTML_TFOOT_ON:
        case HTML_TFOOT_OFF:
        case HTML_TABLE_OFF:
            SkipToken( -1 );
        case HTML_TABLEROW_OFF:
            bDone = sal_True;
            break;
        case HTML_TABLEHEADER_ON:
        case HTML_TABLEDATA_ON:
            BuildTableCell( pCurTable, sal_True, HTML_TABLEHEADER_ON==nToken );
            if( SVPAR_PENDING != GetStatus() )
            {
                pSaveStruct->bHasCells = sal_True;
                bDone = pTable->IsOverflowing();
            }
            break;
        case HTML_CAPTION_ON:
            BuildTableCaption( pCurTable );
            bDone = pTable->IsOverflowing();
            break;
        case HTML_CAPTION_OFF:
        case HTML_TABLEHEADER_OFF:
        case HTML_TABLEDATA_OFF:
        case HTML_COLGROUP_ON:
        case HTML_COLGROUP_OFF:
        case HTML_COL_ON:
        case HTML_COL_OFF:
            // wo keine Zelle anfing kann auch keine aufhoehren, oder?
            // und die ganzen anderen Tokens haben hier auch nicht zu
            // suchen und machen nur die Tabelle kaputt
            break;
        case HTML_MULTICOL_ON:
            // spaltige Rahmen koennen wir hier leider nicht einguegen
            break;
        case HTML_FORM_ON:
            NewForm( sal_False );   // keinen neuen Absatz aufmachen!
            break;
        case HTML_FORM_OFF:
            EndForm( sal_False );   // keinen neuen Absatz aufmachen!
            break;
        case HTML_COMMENT:
            NextToken( nToken );
            break;
        case HTML_MAP_ON:
            // eine Image-Map fuegt nichts ein, deshalb koennen wir sie
            // problemlos auch ohne Zelle parsen
            NextToken( nToken );
            break;
        case HTML_TEXTTOKEN:
            if( (pCurTable->GetContext() ||
                 !pCurTable->HasParentSection()) &&
                1==aToken.Len() && ' '==aToken.GetChar(0) )
                break;
        default:
            pCurTable->MakeParentContents();
            NextToken( nToken );
            break;
        }

        ASSERT( !bPending || !pPendStack,
                "SwHTMLParser::BuildTableRow: Es gibt wieder einen Pend-Stack" );
        bPending = sal_False;
        if( IsParserWorking() )
            SaveState( 0 );

        if( !bDone )
            nToken = GetNextToken();
    }

    if( SVPAR_PENDING == GetStatus() )
    {
        pPendStack = new SwPendingStack( HTML_TABLEROW_ON, pPendStack );
        pPendStack->pData = pSaveStruct;
    }
    else
    {
        pCurTable->CloseRow( !pSaveStruct->bHasCells );
        delete pSaveStruct;
    }

    // wir stehen jetzt (wahrscheinlich) vor <TR> oder </TABLE>
}

void SwHTMLParser::BuildTableSection( HTMLTable *pCurTable,
                                      sal_Bool bReadOptions,
                                      sal_Bool bHead )
{
    // <THEAD>, <TBODY> bzw. <TFOOT> wurde bereits gelesen
    if( !IsParserWorking() && !pPendStack )
        return;

    int nToken = 0;
    sal_Bool bPending = sal_False;
    _RowSaveStruct* pSaveStruct;

    if( pPendStack )
    {
        pSaveStruct = (_RowSaveStruct*)pPendStack->pData;

        SwPendingStack* pTmp = pPendStack->pNext;
        delete pPendStack;
        pPendStack = pTmp;
        nToken = pPendStack ? pPendStack->nToken : GetSaveToken();
        bPending = SVPAR_ERROR == eState && pPendStack != 0;

        SaveState( nToken );
    }
    else
    {
        pSaveStruct = new _RowSaveStruct;

        if( bReadOptions )
        {
            const HTMLOptions *pOptions = GetOptions();
            for( sal_uInt16 i = pOptions->Count(); i; )
            {
                const HTMLOption *pOption = (*pOptions)[--i];
                switch( pOption->GetToken() )
                {
                case HTML_O_ID:
                    InsertBookmark( pOption->GetString() );
                    break;
                case HTML_O_ALIGN:
                    pSaveStruct->eAdjust =
                        (SvxAdjust)pOption->GetEnum( aHTMLPAlignTable,
                                                     pSaveStruct->eAdjust );
                    break;
                case HTML_O_VALIGN:
                    pSaveStruct->eVertOri =
                        (SwVertOrient)pOption->GetEnum( aHTMLTblVAlignTable,
                                                        pSaveStruct->eVertOri );
                    break;
                }
            }
        }

        // ist beim ersten GetNextToken schon pending, muss bei
        // wiederaufsetzen auf jedenfall neu gelesen werden!
        SaveState( 0 );
    }

    if( !nToken )
        nToken = GetNextToken();    // naechstes Token

    sal_Bool bDone = sal_False;
    while( (IsParserWorking() && !bDone) || bPending )
    {
        SaveState( nToken );

        nToken = FilterToken( nToken );

        ASSERT( pPendStack || !bCallNextToken ||
                pCurTable->GetContext() || pCurTable->HasParentSection(),
                "Wo ist die Section gebieben?" );
        if( !pPendStack && bCallNextToken &&
            (pCurTable->GetContext() || pCurTable->HasParentSection()) )
        {
            // NextToken direkt aufrufen (z.B. um den Inhalt von
            // Floating-Frames oder Applets zu ignorieren)
            NextToken( nToken );
        }
        else switch( nToken )
        {
        case HTML_TABLE_ON:
            if( !pCurTable->GetContext()  )
            {
                SkipToken( -1 );
                bDone = sal_True;
            }
//          else
//          {
//              NextToken( nToken );
//          }
            break;
        case HTML_THEAD_ON:
        case HTML_TFOOT_ON:
        case HTML_TBODY_ON:
        case HTML_TABLE_OFF:
            SkipToken( -1 );
        case HTML_THEAD_OFF:
        case HTML_TBODY_OFF:
        case HTML_TFOOT_OFF:
            bDone = sal_True;
            break;
        case HTML_CAPTION_ON:
            BuildTableCaption( pCurTable );
            bDone = pTable->IsOverflowing();
            break;
        case HTML_CAPTION_OFF:
            break;
        case HTML_TABLEHEADER_ON:
        case HTML_TABLEDATA_ON:
            SkipToken( -1 );
            BuildTableRow( pCurTable, sal_False, pSaveStruct->eAdjust,
                           pSaveStruct->eVertOri );
            bDone = pTable->IsOverflowing();
            break;
        case HTML_TABLEROW_ON:
            BuildTableRow( pCurTable, sal_True, pSaveStruct->eAdjust,
                           pSaveStruct->eVertOri );
            bDone = pTable->IsOverflowing();
            break;
        case HTML_MULTICOL_ON:
            // spaltige Rahmen koennen wir hier leider nicht einguegen
            break;
        case HTML_FORM_ON:
            NewForm( sal_False );   // keinen neuen Absatz aufmachen!
            break;
        case HTML_FORM_OFF:
            EndForm( sal_False );   // keinen neuen Absatz aufmachen!
            break;
        case HTML_TEXTTOKEN:
            // Blank-Strings sind Folge von CR+LF und kein Text
            if( (pCurTable->GetContext() ||
                 !pCurTable->HasParentSection()) &&
                1==aToken.Len() && ' '==aToken.GetChar(0) )
                break;
        default:
            pCurTable->MakeParentContents();
            NextToken( nToken );
        }

        ASSERT( !bPending || !pPendStack,
                "SwHTMLParser::BuildTableSection: Es gibt wieder einen Pend-Stack" );
        bPending = sal_False;
        if( IsParserWorking() )
            SaveState( 0 );

        if( !bDone )
            nToken = GetNextToken();
    }

    if( SVPAR_PENDING == GetStatus() )
    {
        pPendStack = new SwPendingStack( bHead ? HTML_THEAD_ON
                                               : HTML_TBODY_ON, pPendStack );
        pPendStack->pData = pSaveStruct;
    }
    else
    {
        pCurTable->CloseSection( bHead );
        delete pSaveStruct;
    }

    // wir stehen jetzt (wahrscheinlich) vor <TBODY>,... oder </TABLE>
}

struct _TblColGrpSaveStruct : public SwPendingStackData
{
    sal_uInt16 nColGrpSpan;
    sal_uInt16 nColGrpWidth;
    sal_Bool bRelColGrpWidth;
    SvxAdjust eColGrpAdjust;
    SwVertOrient eColGrpVertOri;

    inline _TblColGrpSaveStruct();


    inline void CloseColGroup( HTMLTable *pTable );
};

inline _TblColGrpSaveStruct::_TblColGrpSaveStruct() :
    nColGrpSpan( 1 ), nColGrpWidth( 0 ),
    bRelColGrpWidth( sal_False ), eColGrpAdjust( SVX_ADJUST_END ),
    eColGrpVertOri( VERT_TOP )
{}


inline void _TblColGrpSaveStruct::CloseColGroup( HTMLTable *pTable )
{
    pTable->CloseColGroup( nColGrpSpan, nColGrpWidth,
                            bRelColGrpWidth, eColGrpAdjust, eColGrpVertOri );
}

void SwHTMLParser::BuildTableColGroup( HTMLTable *pCurTable,
                                       sal_Bool bReadOptions )
{
    // <COLGROUP> wurde bereits gelesen, wenn bReadOptions

    if( !IsParserWorking() && !pPendStack )
        return;

    int nToken = 0;
    sal_Bool bPending = sal_False;
    _TblColGrpSaveStruct* pSaveStruct;

    if( pPendStack )
    {
        pSaveStruct = (_TblColGrpSaveStruct*)pPendStack->pData;

        SwPendingStack* pTmp = pPendStack->pNext;
        delete pPendStack;
        pPendStack = pTmp;
        nToken = pPendStack ? pPendStack->nToken : GetSaveToken();
        bPending = SVPAR_ERROR == eState && pPendStack != 0;

        SaveState( nToken );
    }
    else
    {

        pSaveStruct = new _TblColGrpSaveStruct;
        if( bReadOptions )
        {
            const HTMLOptions *pColGrpOptions = GetOptions();
            for( sal_uInt16 i = pColGrpOptions->Count(); i; )
            {
                const HTMLOption *pColGrpOption = (*pColGrpOptions)[--i];
                switch( pColGrpOption->GetToken() )
                {
                case HTML_O_ID:
                    InsertBookmark( pColGrpOption->GetString() );
                    break;
                case HTML_O_SPAN:
                    pSaveStruct->nColGrpSpan = (sal_uInt16)pColGrpOption->GetNumber();
                    break;
                case HTML_O_WIDTH:
                    pSaveStruct->nColGrpWidth = (sal_uInt16)pColGrpOption->GetNumber();
                    pSaveStruct->bRelColGrpWidth =
                        (pColGrpOption->GetString().Search('*') != STRING_NOTFOUND);
                    break;
                case HTML_O_ALIGN:
                    pSaveStruct->eColGrpAdjust =
                        (SvxAdjust)pColGrpOption->GetEnum( aHTMLPAlignTable,
                                                pSaveStruct->eColGrpAdjust );
                    break;
                case HTML_O_VALIGN:
                    pSaveStruct->eColGrpVertOri =
                        (SwVertOrient)pColGrpOption->GetEnum( aHTMLTblVAlignTable,
                                                pSaveStruct->eColGrpVertOri );
                    break;
                }
            }
        }
        // ist beim ersten GetNextToken schon pending, muss bei
        // wiederaufsetzen auf jedenfall neu gelesen werden!
        SaveState( 0 );
    }

    if( !nToken )
        nToken = GetNextToken();    // naechstes Token

    sal_Bool bDone = sal_False;
    while( (IsParserWorking() && !bDone) || bPending )
    {
        SaveState( nToken );

        nToken = FilterToken( nToken );

        ASSERT( pPendStack || !bCallNextToken ||
                pCurTable->GetContext() || pCurTable->HasParentSection(),
                "Wo ist die Section gebieben?" );
        if( !pPendStack && bCallNextToken &&
            (pCurTable->GetContext() || pCurTable->HasParentSection()) )
        {
            // NextToken direkt aufrufen (z.B. um den Inhalt von
            // Floating-Frames oder Applets zu ignorieren)
            NextToken( nToken );
        }
        else switch( nToken )
        {
        case HTML_TABLE_ON:
            if( !pCurTable->GetContext()  )
            {
                SkipToken( -1 );
                bDone = sal_True;
            }
//          else
//          {
//              NextToken( nToken );
//          }
            break;
        case HTML_COLGROUP_ON:
        case HTML_THEAD_ON:
        case HTML_TFOOT_ON:
        case HTML_TBODY_ON:
        case HTML_TABLEROW_ON:
        case HTML_TABLE_OFF:
            SkipToken( -1 );
        case HTML_COLGROUP_OFF:
            bDone = sal_True;
            break;
        case HTML_COL_ON:
            {
                sal_uInt16 nColSpan = 1;
                sal_uInt16 nColWidth = pSaveStruct->nColGrpWidth;
                sal_Bool bRelColWidth = pSaveStruct->bRelColGrpWidth;
                SvxAdjust eColAdjust = pSaveStruct->eColGrpAdjust;
                SwVertOrient eColVertOri = pSaveStruct->eColGrpVertOri;

                const HTMLOptions *pColOptions = GetOptions();
                for( sal_uInt16 i = pColOptions->Count(); i; )
                {
                    const HTMLOption *pColOption = (*pColOptions)[--i];
                    switch( pColOption->GetToken() )
                    {
                    case HTML_O_ID:
                        InsertBookmark( pColOption->GetString() );
                        break;
                    case HTML_O_SPAN:
                        nColSpan = (sal_uInt16)pColOption->GetNumber();
                        break;
                    case HTML_O_WIDTH:
                        nColWidth = (sal_uInt16)pColOption->GetNumber();
                        bRelColWidth =
                            (pColOption->GetString().Search('*') != STRING_NOTFOUND);
                        break;
                    case HTML_O_ALIGN:
                        eColAdjust =
                            (SvxAdjust)pColOption->GetEnum( aHTMLPAlignTable,
                                                            eColAdjust );
                        break;
                    case HTML_O_VALIGN:
                        eColVertOri =
                            (SwVertOrient)pColOption->GetEnum( aHTMLTblVAlignTable,
                                                            eColVertOri );
                        break;
                    }
                }
                pCurTable->InsertCol( nColSpan, nColWidth, bRelColWidth,
                                      eColAdjust, eColVertOri );

                // die Angaben in <COLGRP> sollen ignoriert werden, wenn
                // <COL>-Elemente existieren
                pSaveStruct->nColGrpSpan = 0;
            }
            break;
        case HTML_COL_OFF:
            break;      // Ignorieren
        case HTML_MULTICOL_ON:
            // spaltige Rahmen koennen wir hier leider nicht einguegen
            break;
        case HTML_TEXTTOKEN:
            if( (pCurTable->GetContext() ||
                 !pCurTable->HasParentSection()) &&
                1==aToken.Len() && ' '==aToken.GetChar(0) )
                break;
        default:
            pCurTable->MakeParentContents();
            NextToken( nToken );
        }

        ASSERT( !bPending || !pPendStack,
                "SwHTMLParser::BuildTableColGrp: Es gibt wieder einen Pend-Stack" );
        bPending = sal_False;
        if( IsParserWorking() )
            SaveState( 0 );

        if( !bDone )
            nToken = GetNextToken();
    }

    if( SVPAR_PENDING == GetStatus() )
    {
        pPendStack = new SwPendingStack( HTML_COL_ON, pPendStack );
        pPendStack->pData = pSaveStruct;
    }
    else
    {
        pSaveStruct->CloseColGroup( pCurTable );
        delete pSaveStruct;
    }
}

class _CaptionSaveStruct : public _SectionSaveStruct
{
    SwPosition aSavePos;
    SwHTMLNumRuleInfo aNumRuleInfo; // gueltige Numerierung

public:

    _HTMLAttrTable aAttrTab;        // und die Attribute

    _CaptionSaveStruct( SwHTMLParser& rParser, const SwPosition& rPos ) :
        _SectionSaveStruct( rParser ), aSavePos( rPos )
    {
        rParser.SaveAttrTab( aAttrTab );

        // Die aktuelle Numerierung wurde gerettet und muss nur
        // noch beendet werden.
#ifndef NUM_RELSPACE
        if( rParser.GetNumInfo().GetNumRule() )
            rParser.UpdateNumRuleInTable();
#endif
        aNumRuleInfo.Set( rParser.GetNumInfo() );
        rParser.GetNumInfo().Clear();
    }

    const SwPosition& GetPos() const { return aSavePos; }

    void RestoreAll( SwHTMLParser& rParser )
    {
        // Die alten Stack wiederherstellen
        Restore( rParser );

        // Die alte Attribut-Tabelle wiederherstellen
        rParser.RestoreAttrTab( aAttrTab );

        // Die alte Numerierung wieder aufspannen
        rParser.GetNumInfo().Set( aNumRuleInfo );
    }

    virtual ~_CaptionSaveStruct();
};

_CaptionSaveStruct::~_CaptionSaveStruct()
{}

void SwHTMLParser::BuildTableCaption( HTMLTable *pCurTable )
{
    // <CAPTION> wurde bereits gelesen

    if( !IsParserWorking() && !pPendStack )
        return;

    int nToken = 0;
    _CaptionSaveStruct* pSaveStruct;

    if( pPendStack )
    {
        pSaveStruct = (_CaptionSaveStruct*)pPendStack->pData;

        SwPendingStack* pTmp = pPendStack->pNext;
        delete pPendStack;
        pPendStack = pTmp;
        nToken = pPendStack ? pPendStack->nToken : GetSaveToken();
        ASSERT( !pPendStack, "Wo kommt hier ein Pending-Stack her?" );

        SaveState( nToken );
    }
    else
    {
        if( pTable->IsOverflowing() )
        {
            SaveState( 0 );
            return;
        }

        sal_Bool bTop = sal_True;
        const HTMLOptions *pOptions = GetOptions();
        for ( sal_uInt16 i = pOptions->Count(); i; )
        {
            const HTMLOption *pOption = (*pOptions)[--i];
            if( HTML_O_ALIGN == pOption->GetToken() )
            {
                if( pOption->GetString().EqualsIgnoreCaseAscii(sHTML_VA_bottom))
                    bTop = sal_False;
            }
        }

        // Alte PaM-Position retten.
        pSaveStruct = new _CaptionSaveStruct( *this, *pPam->GetPoint() );

        // Eine Text-Section im Icons-Bereich als Container fuer die
        // Ueberschrift anlegen und PaM dort reinstellen.
        const SwStartNode *pStNd;
        if( pTable == pCurTable )
            pStNd = InsertTempTableCaptionSection();
        else
            pStNd = InsertTableSection( RES_POOLCOLL_TEXT );

        _HTMLAttrContext *pCntxt = new _HTMLAttrContext( HTML_CAPTION_ON );

        // Tabellen-Ueberschriften sind immer zentriert.
        NewAttr( &aAttrTab.pAdjust, SvxAdjustItem(SVX_ADJUST_CENTER) );

        _HTMLAttrs &rAttrs = pCntxt->GetAttrs();
        rAttrs.Insert( aAttrTab.pAdjust, rAttrs.Count() );

        PushContext( pCntxt );

        // StartNode der Section an der Tabelle merken.
        pCurTable->SetCaption( pStNd, bTop );

        // ist beim ersten GetNextToken schon pending, muss bei
        // wiederaufsetzen auf jedenfall neu gelesen werden!
        SaveState( 0 );
    }

    if( !nToken )
        nToken = GetNextToken();    // naechstes Token

    // </CAPTION> wird laut DTD benoetigt
    sal_Bool bDone = sal_False;
    while( IsParserWorking() && !bDone )
    {
        SaveState( nToken );

        nToken = FilterToken( nToken );

        switch( nToken )
        {
        case HTML_TABLE_ON:
            if( !pPendStack )
            {
                pSaveStruct->pTable = pTable;
                sal_Bool bHasToFly = pSaveStruct->pTable!=pCurTable;
                BuildTable( pCurTable->GetTableAdjust( sal_True ),
                            sal_False, sal_True, sal_True, bHasToFly );
            }
            else
            {
                BuildTable( SVX_ADJUST_END );
            }
            if( SVPAR_PENDING != GetStatus() )
            {
                pTable = pSaveStruct->pTable;
            }
            break;
        case HTML_TABLE_OFF:
        case HTML_COLGROUP_ON:
        case HTML_THEAD_ON:
        case HTML_TFOOT_ON:
        case HTML_TBODY_ON:
        case HTML_TABLEROW_ON:
            SkipToken( -1 );
            bDone = sal_True;
            break;

        case HTML_CAPTION_OFF:
            bDone = sal_True;
            break;
        default:
            int nNxtToken = nToken;
            if( pPendStack )
            {
                SwPendingStack* pTmp = pPendStack->pNext;
                delete pPendStack;
                pPendStack = pTmp;

                ASSERT( !pTmp, "weiter kann es nicht gehen!" );
                nNxtToken = 0;  // neu lesen
            }

            if( IsParserWorking() )
                NextToken( nToken );
            break;
        }

        if( IsParserWorking() )
            SaveState( 0 );

        if( !bDone )
            nToken = GetNextToken();
    }

    if( SVPAR_PENDING==GetStatus() )
    {
        pPendStack = new SwPendingStack( HTML_CAPTION_ON, pPendStack );
        pPendStack->pData = pSaveStruct;
        return;
    }

    // Alle noch offenen Kontexte beenden
    while( aContexts.Count() > nContextStAttrMin+1 )
    {
        _HTMLAttrContext *pCntxt = PopContext();
        EndContext( pCntxt );
        delete pCntxt;
    }

    // LF am Absatz-Ende entfernen
    sal_Bool bLFStripped = StripTrailingLF() > 0;

    if( pTable==pCurTable )
    {
        // Beim spaeteren verschieben der Beschriftung vor oder hinter
        // die Tabelle wird der letzte Absatz nicht mitverschoben.
        // Deshalb muss sich am Ende der Section immer ein leerer
        // Absatz befinden.
        if( pPam->GetPoint()->nContent.GetIndex() || bLFStripped )
            AppendTxtNode( AM_NOSPACE );
    }
    else
    {
        // LFs am Absatz-Ende entfernen
        if( !pPam->GetPoint()->nContent.GetIndex() && !bLFStripped )
            StripTrailingPara();
    }

    // falls fuer die Zelle eine Ausrichtung gesetzt wurde, muessen
    // wir die beenden
    _HTMLAttrContext *pCntxt = PopContext();
    EndContext( pCntxt );
    delete pCntxt;

    SetAttr( sal_False );

    // Stacks und Attribut-Tabelle wiederherstellen
    pSaveStruct->RestoreAll( *this );

    // PaM wiederherstellen.
    *pPam->GetPoint() = pSaveStruct->GetPos();

    delete pSaveStruct;
}

class _TblSaveStruct : public SwPendingStackData
{
public:
    HTMLTable *pCurTable;

    _TblSaveStruct( HTMLTable *pCurTbl ) :
        pCurTable( pCurTbl )
    {}

    virtual ~_TblSaveStruct();

    // Aufbau der Tabelle anstossen und die Tabelle ggf. in einen
    // Rahmen packen. Wenn sal_True zurueckgegeben wird muss noch ein
    // Absatz eingefuegt werden!
    void MakeTable( sal_uInt16 nWidth, SwPosition& rPos, SwDoc *pDoc );
};

_TblSaveStruct::~_TblSaveStruct()
{}


void _TblSaveStruct::MakeTable( sal_uInt16 nWidth, SwPosition& rPos, SwDoc *pDoc )
{
    pCurTable->MakeTable( 0, nWidth );

    _HTMLTableContext *pTCntxt = pCurTable->GetContext();
    ASSERT( pTCntxt, "Wo ist der Tabellen-Kontext" );

    SwTableNode *pTblNd = pTCntxt->GetTableNode();
    ASSERT( pTblNd, "Wo ist der Tabellen-Node" );

    if( pDoc->GetRootFrm() && pTblNd )
    {
        // Existiert schon ein Layout, dann muss an dieser Tabelle die
        // BoxFrames neu erzeugt werden.

        if( pTCntxt->GetFrmFmt() )
        {
            pTCntxt->GetFrmFmt()->DelFrms();
            pTblNd->DelFrms();
            pTCntxt->GetFrmFmt()->MakeFrms();
        }
        else
        {
            pTblNd->DelFrms();
            SwNodeIndex aIdx( *pTblNd->EndOfSectionNode(), 1 );
            ASSERT( aIdx.GetIndex() <= pTCntxt->GetPos()->nNode.GetIndex(),
                    "unerwarteter Node fuer das Tabellen-Layout" );
            pTblNd->MakeFrms( &aIdx );
        }
    }

    rPos = *pTCntxt->GetPos();
}


HTMLTableOptions::HTMLTableOptions( const HTMLOptions *pOptions,
                                    SvxAdjust eParentAdjust ) :
    nCols( 0 ),
    nWidth( 0 ), nHeight( 0 ),
    nCellPadding( USHRT_MAX ), nCellSpacing( USHRT_MAX ),
    nBorder( USHRT_MAX ),
    nHSpace( 0 ), nVSpace( 0 ),
    eAdjust( eParentAdjust ), eVertOri( VERT_CENTER ),
    eFrame( HTML_TF_VOID ), eRules( HTML_TR_NONE ),
    bPrcWidth( sal_False ),
    bTableAdjust( sal_False ),
    bBGColor( sal_False ),
    aBorderColor( COL_GRAY )
{
    sal_Bool bBorderColor = sal_False;
    sal_Bool bHasFrame = sal_False, bHasRules = sal_False;

    for( sal_uInt16 i = pOptions->Count(); i; )
    {
        const HTMLOption *pOption = (*pOptions)[--i];
        switch( pOption->GetToken() )
        {
        case HTML_O_ID:
            aId = pOption->GetString();
            break;
        case HTML_O_COLS:
            nCols = (sal_uInt16)pOption->GetNumber();
            break;
        case HTML_O_WIDTH:
            nWidth = (sal_uInt16)pOption->GetNumber();
            bPrcWidth = (pOption->GetString().Search('%') != STRING_NOTFOUND);
            if( bPrcWidth && nWidth>100 )
                nWidth = 100;
            break;
        case HTML_O_HEIGHT:
            nHeight = (sal_uInt16)pOption->GetNumber();
            if( pOption->GetString().Search('%') != STRING_NOTFOUND )
                nHeight = 0;    // keine %-Anagben benutzen!!!
            break;
        case HTML_O_CELLPADDING:
            nCellPadding = (sal_uInt16)pOption->GetNumber();
            break;
        case HTML_O_CELLSPACING:
            nCellSpacing = (sal_uInt16)pOption->GetNumber();
            break;
        case HTML_O_ALIGN:
            {
                sal_uInt16 nAdjust = eAdjust;
                if( pOption->GetEnum( nAdjust, aHTMLPAlignTable ) )
                {
                    eAdjust = (SvxAdjust)nAdjust;
                    bTableAdjust = sal_True;
                }
            }
            break;
        case HTML_O_VALIGN:
            eVertOri = (SwVertOrient)pOption->GetEnum( aHTMLTblVAlignTable,
                                                       eVertOri );
            break;
        case HTML_O_BORDER:
            // BORDER und BORDER=BORDER wie BORDER=1 behandeln
            if( pOption->GetString().Len() &&
                !pOption->GetString().EqualsIgnoreCaseAscii(sHTML_O_border) )
                nBorder = (sal_uInt16)pOption->GetNumber();
            else
                nBorder = 1;

            if( !bHasFrame )
                eFrame = ( nBorder ? HTML_TF_BOX : HTML_TF_VOID );
            if( !bHasRules )
                eRules = ( nBorder ? HTML_TR_ALL : HTML_TR_NONE );
            break;
        case HTML_O_FRAME:
            eFrame = pOption->GetTableFrame();
            bHasFrame = sal_True;
            break;
        case HTML_O_RULES:
            eRules = pOption->GetTableRules();
            bHasRules = sal_True;
            break;
        case HTML_O_BGCOLOR:
            // Leere BGCOLOR bei <TABLE>, <TR> und <TD>/<TH> wie Netscape
            // ignorieren, bei allen anderen Tags *wirklich* nicht.
            if( pOption->GetString().Len() )
            {
                pOption->GetColor( aBGColor );
                bBGColor = sal_True;
            }
            break;
        case HTML_O_BACKGROUND:
            aBGImage = pOption->GetString();
            break;
        case HTML_O_BORDERCOLOR:
            pOption->GetColor( aBorderColor );
            bBorderColor = sal_True;
            break;
        case HTML_O_BORDERCOLORDARK:
            if( !bBorderColor )
                pOption->GetColor( aBorderColor );
            break;
        case HTML_O_STYLE:
            aStyle = pOption->GetString();
            break;
        case HTML_O_CLASS:
            aClass = pOption->GetString();
            break;
        case HTML_O_HSPACE:
            nHSpace = (sal_uInt16)pOption->GetNumber();
            break;
        case HTML_O_VSPACE:
            nVSpace = (sal_uInt16)pOption->GetNumber();
            break;
        }
    }

    if( nCols && !nWidth )
    {
        nWidth = 100;
        bPrcWidth = sal_True;
    }

    // Wenn BORDER=0 oder kein BORDER gegeben ist, daan darf es auch
    // keine Umrandung geben
    if( 0==nBorder || USHRT_MAX==nBorder )
    {
        eFrame = HTML_TF_VOID;
        eRules = HTML_TR_NONE;
    }
}


HTMLTable *SwHTMLParser::BuildTable( SvxAdjust eParentAdjust,
                                     sal_Bool bIsParentHead,
                                     sal_Bool bHasParentSection,
                                     sal_Bool bMakeTopSubTable,
                                     sal_Bool bHasToFly )
{
    if( !IsParserWorking() && !pPendStack )
        return 0;

    int nToken = 0;
    sal_Bool bPending = sal_False;
    _TblSaveStruct* pSaveStruct;

    if( pPendStack )
    {
        pSaveStruct = (_TblSaveStruct*)pPendStack->pData;

        SwPendingStack* pTmp = pPendStack->pNext;
        delete pPendStack;
        pPendStack = pTmp;
        nToken = pPendStack ? pPendStack->nToken : GetSaveToken();
        bPending = SVPAR_ERROR == eState && pPendStack != 0;

        SaveState( nToken );
    }
    else
    {
        HTMLTableOptions *pTblOptions =
            new HTMLTableOptions( GetOptions(), eParentAdjust );

        if( pTblOptions->aId.Len() )
            InsertBookmark( pTblOptions->aId );

        // Wenn die Tabelle in einem Rahmen steht oder link oder rechts
        // ausgerichtet ist, wird in jedem Fall eine "echte" Tabelle daraus.
        if( bMakeTopSubTable || bHasToFly ||
            (pTblOptions->bTableAdjust &&
             (SVX_ADJUST_LEFT==pTblOptions->eAdjust ||
              SVX_ADJUST_RIGHT==pTblOptions->eAdjust)) )
        {
            pTable = 0;
        }

        HTMLTable *pCurTable = new HTMLTable( this, pTable,
                                              bIsParentHead,
                                              bHasParentSection,
                                              bMakeTopSubTable,
                                              bHasToFly,
                                              pTblOptions );
        if( !pTable )
            pTable = pCurTable;

        pSaveStruct = new _TblSaveStruct( pCurTable );

        delete pTblOptions;

        // ist beim ersten GetNextToken schon pending, muss bei
        // wiederaufsetzen auf jedenfall neu gelesen werden!
        SaveState( 0 );
    }

    HTMLTable *pCurTable = pSaveStruct->pCurTable;

    // </TABLE> wird laut DTD benoetigt
    if( !nToken )
        nToken = GetNextToken();    // naechstes Token

    sal_Bool bDone = sal_False;
    while( (IsParserWorking() && !bDone) || bPending )
    {
        SaveState( nToken );

        nToken = FilterToken( nToken );

        ASSERT( pPendStack || !bCallNextToken ||
                pCurTable->GetContext() || pCurTable->HasParentSection(),
                "Wo ist die Section gebieben?" );
        if( !pPendStack && bCallNextToken &&
            (pCurTable->GetContext() || pCurTable->HasParentSection()) )
        {
            // NextToken direkt aufrufen (z.B. um den Inhalt von
            // Floating-Frames oder Applets zu ignorieren)
            NextToken( nToken );
        }
        else switch( nToken )
        {
        case HTML_TABLE_ON:
            if( !pCurTable->GetContext() )
            {
                // Wenn noch keine Tabelle eingefuegt wurde,
                // die naechste Tabelle lesen
                SkipToken( -1 );
                bDone = sal_True;
            }
//          else
//          {
//              NextToken( nToken );
//          }
            break;
        case HTML_TABLE_OFF:
            bDone = sal_True;
            break;
        case HTML_CAPTION_ON:
            BuildTableCaption( pCurTable );
            bDone = pTable->IsOverflowing();
            break;
        case HTML_COL_ON:
            SkipToken( -1 );
            BuildTableColGroup( pCurTable, sal_False );
            break;
        case HTML_COLGROUP_ON:
            BuildTableColGroup( pCurTable, sal_True );
            break;
        case HTML_TABLEROW_ON:
        case HTML_TABLEHEADER_ON:
        case HTML_TABLEDATA_ON:
            SkipToken( -1 );
            BuildTableSection( pCurTable, sal_False, sal_False );
            bDone = pTable->IsOverflowing();
            break;
        case HTML_THEAD_ON:
        case HTML_TFOOT_ON:
        case HTML_TBODY_ON:
            BuildTableSection( pCurTable, sal_True, HTML_THEAD_ON==nToken );
            bDone = pTable->IsOverflowing();
            break;
        case HTML_MULTICOL_ON:
            // spaltige Rahmen koennen wir hier leider nicht einguegen
            break;
        case HTML_FORM_ON:
            NewForm( sal_False );   // keinen neuen Absatz aufmachen!
            break;
        case HTML_FORM_OFF:
            EndForm( sal_False );   // keinen neuen Absatz aufmachen!
            break;
        case HTML_TEXTTOKEN:
            // Blank-Strings sind u. U. eine Folge von CR+LF und kein Text
            if( (pCurTable->GetContext() ||
                 !pCurTable->HasParentSection()) &&
                1==aToken.Len() && ' '==aToken.GetChar(0) )
                break;
        default:
            pCurTable->MakeParentContents();
            NextToken( nToken );
            break;
        }

        ASSERT( !bPending || !pPendStack,
                "SwHTMLParser::BuildTable: Es gibt wieder einen Pend-Stack" );
        bPending = sal_False;
        if( IsParserWorking() )
            SaveState( 0 );

        if( !bDone )
            nToken = GetNextToken();
    }

    if( SVPAR_PENDING == GetStatus() )
    {
        pPendStack = new SwPendingStack( HTML_TABLE_ON, pPendStack );
        pPendStack->pData = pSaveStruct;
        return 0;
    }

    _HTMLTableContext *pTCntxt = pCurTable->GetContext();
    if( pTCntxt )
    {
        // Die Tabelle wurde auch angelegt

        // Tabellen-Struktur anpassen
        pCurTable->CloseTable();

        // ausserhalb von Zellen begonnene Kontexte beenden
        // muss vor(!) dem Umsetzten der Attribut Tabelle existieren,
        // weil die aktuelle danach nicht mehr existiert
        while( aContexts.Count() > nContextStAttrMin )
        {
            _HTMLAttrContext *pCntxt = PopContext();
            ClearContext( pCntxt );
            delete pCntxt;
        }

        nContextStMin = pTCntxt->GetContextStMin();
        nContextStAttrMin = pTCntxt->GetContextStAttrMin();

        if( pTable==pCurTable )
        {
            // Tabellen-Beschriftung setzen
            const SwStartNode *pCapStNd = pTable->GetCaptionStartNode();
            if( pCapStNd )
            {
                // Der letzte Absatz der Section wird nie mitkopiert. Deshalb
                // muss die Section mindestens zwei Absaetze enthalten.

                if( pCapStNd->EndOfSectionIndex() - pCapStNd->GetIndex() > 2 )
                {
                    // Start-Node und letzten Absatz nicht mitkopieren.
                    SwNodeRange aSrcRg( *pCapStNd, 1,
                                    *pCapStNd->EndOfSectionNode(), -1 );

                    sal_Bool bTop = pTable->IsTopCaption();
                    SwStartNode *pTblStNd = pTCntxt->GetTableNode();

                    ASSERT( pTblStNd, "Wo ist der Tabellen-Node" );
                    ASSERT( pTblStNd==pPam->GetNode()->FindTableNode(),
                            "Stehen wir in der falschen Tabelle?" );

                    SwNode* pNd;
                    if( bTop )
                        pNd = pTblStNd;
                    else
                        pNd = pTblStNd->EndOfSectionNode();
                    SwNodeIndex aDstIdx( *pNd, bTop ? 0 : 1 );

                    pDoc->Move( aSrcRg, aDstIdx );

                    // Wenn die Caption vor der Tabelle eingefuegt wurde muss
                    // eine an der Tabelle gestzte Seitenvorlage noch in den
                    // ersten Absatz der Ueberschrift verschoben werden.
                    // Ausserdem muessen alle gemerkten Indizes, die auf den
                    // Tabellen-Node zeigen noch verschoben werden.
                    if( bTop )
                    {
                        MovePageDescAttrs( pTblStNd, aSrcRg.aStart.GetIndex(),
                                           sal_False );
                    }
                }

                // Die Section wird jetzt nicht mehr gebraucht.
                pPam->SetMark();
                pPam->DeleteMark();
                pDoc->DeleteSection( (SwStartNode *)pCapStNd );
                pTable->SetCaption( 0, sal_False );
            }

            // SwTable aufbereiten
            sal_uInt16 nBrowseWidth = (sal_uInt16)GetCurrentBrowseWidth();
            pSaveStruct->MakeTable( nBrowseWidth, *pPam->GetPoint(), pDoc );

#ifdef TEST_RESIZE
            const SwTable *pSwTable = pTable->GetSwTable();
            SwHTMLTableLayout *pLayoutInfo =
                pSwTable ? ((SwTable *)pSwTable)->GetHTMLTableLayout() : 0;
            if( pLayoutInfo )
            {
                ViewShell *pVSh = CheckActionViewShell();
                if( pVSh )
                {
                    CallEndAction( sal_False, sal_False );
                    CallStartAction( pVSh, sal_False );

                    sal_uInt16 nNewBrwoseWidth =
                        (sal_uInt16)GetCurrentBrowseWidth();
                    if( nBrowseWidth != nNewBrowseWidth )
                        pLayoutInfo->Resize( nNewBrowseWidth );
                }
            }
#endif
        }

        GetNumInfo().Set( pTCntxt->GetNumInfo() );
        pTCntxt->RestorePREListingXMP( *this );
        RestoreAttrTab( pTCntxt->aAttrTab );

        if( pTable==pCurTable )
        {
            // oberen Absatz-Abstand einstellen
            bUpperSpace = sal_True;
            SetTxtCollAttrs();

            nParaCnt -= Min(nParaCnt, pTCntxt->GetTableNode()->GetTable().GetTabSortBoxes().Count());

            // ggfs. eine Tabelle anspringen
            if( JUMPTO_TABLE == eJumpTo && pTable->GetSwTable() &&
                pTable->GetSwTable()->GetFrmFmt()->GetName() == sJmpMark )
            {
                bChkJumpMark = sal_True;
                eJumpTo = JUMPTO_NONE;
            }

            // fix #37886#: Wenn Import abgebrochen wurde kein erneutes Show
            // aufrufen, weil die ViewShell schon geloescht wurde!
            // fix #41669#: Genuegt nicht. Auch im ACCEPTING_STATE darf
            // kein Show aufgerufen werden, weil sonst waehrend des
            // Reschedules der Parser zerstoert wird, wenn noch ein
            // DataAvailable-Link kommt. Deshalb: Nur im WORKING-State.
            if( !nParaCnt && SVPAR_WORKING == GetStatus() )
                Show();
        }
    }
    else if( pTable==pCurTable )
    {
        // Es wurde gar keine Tabelle gelesen.

        // Dann muss eine evtl gelesene Beschriftung noch geloescht werden.
        const SwStartNode *pCapStNd = pCurTable->GetCaptionStartNode();
        if( pCapStNd )
        {
            pPam->SetMark();
            pPam->DeleteMark();
            pDoc->DeleteSection( (SwStartNode *)pCapStNd );
            pCurTable->SetCaption( 0, sal_False );
        }
    }

    if( pTable == pCurTable  )
    {
        delete pSaveStruct->pCurTable;
        pSaveStruct->pCurTable = 0;
        pTable = 0;
    }

    HTMLTable* pRetTbl = pSaveStruct->pCurTable;
    delete pSaveStruct;

    return pRetTbl;
}



/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/html/htmltab.cxx,v 1.1.1.1 2000-09-18 17:14:56 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.295  2000/09/18 16:04:46  willem.vandorp
      OpenOffice header added.

      Revision 1.294  2000/09/05 14:01:28  mib
      #78294#: removed support for frameset documents

      Revision 1.293  2000/06/26 09:52:30  jp
      must change: GetAppWindow->GetDefaultDevice

      Revision 1.292  2000/04/28 14:29:12  mib
      unicode

      Revision 1.291  2000/04/10 12:20:57  mib
      unicode

      Revision 1.290  2000/03/21 15:06:18  os
      UNOIII

      Revision 1.289  2000/03/03 15:21:01  os
      StarView remainders removed

      Revision 1.288  2000/02/11 14:37:28  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.287  2000/02/07 08:24:58  mib
      #72727#: HORI_LEFT_AND_WIDTH

      Revision 1.286  1999/11/19 16:40:20  os
      modules renamed

      Revision 1.285  1999/09/17 12:14:09  mib
      support of multiple and non system text encodings

      Revision 1.284  1999/07/29 06:21:52  MIB
      fix LHS means left border and RHS right border, not vice versa


      Rev 1.283   29 Jul 1999 08:21:52   MIB
   fix LHS means left border and RHS right border, not vice versa

      Rev 1.282   10 Jun 1999 10:34:26   JP
   have to change: no AppWin from SfxApp

      Rev 1.281   09 Jun 1999 19:37:00   JP
   have to change: no cast from GetpApp to SfxApp/OffApp, SfxShell only subclass of SfxApp

      Rev 1.280   20 Apr 1999 10:07:50   MIB
   bCallNextToken auch in Rows etc. auswerten

      Rev 1.279   15 Apr 1999 13:48:20   MIB
   #41833#: Styles fuer A-Tag

      Rev 1.278   12 Apr 1999 09:23:28   MIB
   Korrekt horizontal splitten (auch #64460#)

      Rev 1.277   09 Apr 1999 10:30:36   MIB
   #64522#: Styles fuer TD/TH auswerten

      Rev 1.276   08 Apr 1999 11:13:10   MIB
   #56334#: Optimierung fuer Hintergrundfarben wieder ausgebaut

      Rev 1.275   06 Apr 1999 12:07:14   MIB
   #64308#: ALIGN=? an Tabelle

      Rev 1.274   01 Apr 1999 10:20:08   MIB
   bug fix: Leere BGColor nicht auswerten

      Rev 1.273   01 Apr 1999 08:57:02   MIB
   #56334#: Keine Spezialbehandlung der Hintergruende fuer die GC mehr noetig

      Rev 1.272   30 Mar 1999 11:58:36   MIB
   #62977#: Nicht mehr Spalten einfuegen als Zellen je Zeile vorhanden

      Rev 1.271   30 Mar 1999 11:44:26   MIB
   #62977#: Nicht mehr Spalten einfuegen als Zellen je Zeile vorhanden (nur>529)

      Rev 1.270   26 Mar 1999 11:39:46   MIB
   #63049#: Sofortige Numerierungs-Aktualisierung in Tabellen ist jetzt unnoetig

      Rev 1.269   17 Mar 1999 16:47:10   MIB
   #63049#: Numerierungen mit relativen Abstaenden

      Rev 1.268   10 Mar 1999 15:44:10   MIB
   #62682#: Beim Setzen der Control-Groesse wenn noetig auf die ViewShell warten

      Rev 1.267   25 Feb 1999 16:00:42   MIB
   #61949#: globale Shell entsorgt

      Rev 1.266   27 Jan 1999 09:43:56   OS
   #56371# TF_ONE51

      Rev 1.265   11 Jan 1999 11:17:08   MIB
   Attribut-Tabellen-Ueberpruefung in NonPro wegen Asserts nicht immer

      Rev 1.264   05 Jan 1999 14:48:00   MIB
   #60429#: Zeilenhoehe korrekt berechnen

      Rev 1.263   11 Nov 1998 17:42:10   MIB
   #59059#: Beim Abbrechen Pendung-Stack noch aufraeumen

      Rev 1.262   09 Nov 1998 11:35:18   MIB
   #59159#: Pending-Stack von fremden Token nicht loeschen

      Rev 1.261   03 Nov 1998 15:37:10   MIB
   #58840#: bHoriSplittAll-Assert war falsch

      Rev 1.260   25 Sep 1998 08:36:04   MIB
   #45631#: Tabellen nach 64000 Zellen beenden

      Rev 1.259   14 Sep 1998 11:41:12   MIB
   #51238#: Beim Setzen des Zeilen-Hintergrundes ROWSPAN>1 beachten

      Rev 1.258   31 Aug 1998 11:19:44   MIB
   ##: Beim vertikalen Zerlegen auch letzte Spalte auf moegliche vert. Zerlegeung pruefen

      Rev 1.257   27 Aug 1998 09:45:52   MIB
   #54170#: Line-Format-Attribute zuruecksetzen, bevor Hoehe oder Hintergrund gesetzt wird

      Rev 1.256   26 Aug 1998 09:30:36   MIB
   #55144#: Umlauf bei Tabellen in Rahmen richtig setzen und beachten

      Rev 1.255   21 Jul 1998 16:55:46   JP
   Bug #53456#: nie per Add eine Box im Format anmelden, sondern per Box::ChgFrmFmt

      Rev 1.254   05 Jun 1998 13:56:54   JP
   Bug #42487#: Sprung zum Mark schon waehrend des Ladens ausfuehren

      Rev 1.253   12 May 1998 15:50:24   JP
   rund um Flys/DrawObjs im Doc/FESh umgestellt/optimiert

      Rev 1.252   15 Apr 1998 14:56:46   MIB
   Zwei-seitige Printing-Extensions

      Rev 1.251   27 Mar 1998 18:02:42   MIB
   HSPACE/VSPACE

      Rev 1.250   24 Mar 1998 14:31:24   MIB
   obsolete ParseStyleOptions-Methode entfernt

      Rev 1.249   11 Mar 1998 18:28:54   MIB
   fix #47846#: auto-gebundenen Rahmen korrekt verankern

      Rev 1.248   02 Mar 1998 18:43:16   MIB
   fix #45489#: Umrandung ueber mehrere Ebenenen vererben

      Rev 1.247   27 Feb 1998 16:42:38   MIB
   fix #46450#: Horizontale une vertikale Ausrichtung von Zellen mit NumFmt

      Rev 1.246   27 Feb 1998 14:05:10   MIB
   Auto-gebundene Rahmen

      Rev 1.245   25 Feb 1998 12:17:36   MIB
   I like ME and its 0xffs

      Rev 1.244   25 Feb 1998 10:49:54   MIB
   fix: Tabellen-Ueberschriften in Sub-Tabellen gleich in eine eigene Box packen

      Rev 1.243   24 Feb 1998 17:45:50   MIB
   Attribute von Tabellen-Zellen ueber AttrTab setzen

      Rev 1.242   20 Feb 1998 18:52:04   MIB
   fix #45328#: Bessere Behandlung von Styles an Tabellen-Zellen

      Rev 1.241   20 Feb 1998 12:25:12   MIB
   fix #45631#: Weniger ::com::sun::star::frame::Frame-Formate anlegen

      Rev 1.240   19 Feb 1998 15:14:52   MIB
   fix #47394#: Tabellen-Zellen wurden unnoetig geteilt

      Rev 1.239   18 Feb 1998 10:57:30   MIB
   fix #45153#: Bei fixer Tabellenhoehe Tabelle in Tabelle beachten

      Rev 1.238   13 Feb 1998 18:48:42   HR
   C40_INSERT

      Rev 1.237   29 Jan 1998 21:34:18   JP
   GetEndOfIcons ersetzt durch GetEndOfExtras, das auf GetEndOfRedlines mappt

      Rev 1.236   19 Jan 1998 16:27:14   MIB
   Numerierungs-Umbau

      Rev 1.235   26 Nov 1997 19:09:42   MA
   includes

      Rev 1.234   17 Nov 1997 10:16:40   JP
   Umstellung Numerierung

      Rev 1.233   09 Oct 1997 14:34:14   JP
   Umstellung NodeIndex/-Array/BigPtrArray

      Rev 1.232   19 Sep 1997 08:40:34   MIB
   fix #41185#: Laufschrift an Tabellenzellen-Breite anpassen

      Rev 1.231   16 Sep 1997 14:55:28   MIB
   ITEMID_BOXINFOITEM (voreubergendend) definieren

      Rev 1.230   16 Sep 1997 13:05:08   MIB
   Abs.-Pos. Rahmen am Tabellen-Ende beenden

      Rev 1.229   16 Sep 1997 11:19:12   MIB
   Kopf-/Fusszeilen ohne Moven von Nodes, autom. Beenden von Bereichen/Rahmen

      Rev 1.228   12 Sep 1997 11:54:02   MIB
   fix #41253#: Script in PRE (keine Schleifen)

      Rev 1.227   09 Sep 1997 14:10:48   MIB
   Ueberall Browse-View-Breite statt Seitenbreite verwenden

      Rev 1.226   08 Sep 1997 10:38:54   MIB
   Keine Schleifen fuer PRE mehr (auch fix #41253#) (nicht freigeschaltet)

      Rev 1.225   04 Sep 1997 15:45:30   MIB
   fix: <NOBR> auch beachten, wenn danach ein <BR> folgt

      Rev 1.224   04 Sep 1997 09:37:40   MIB
   fix #42771#: Tabellen in Rahmen beachten

      Rev 1.223   29 Aug 1997 16:49:44   OS
   DLL-Umstellung

      Rev 1.222   15 Aug 1997 12:47:38   OS
   charatr/frmatr/txtatr aufgeteilt

      Rev 1.221   12 Aug 1997 13:42:50   OS
   Header-Umstellung

      Rev 1.220   11 Aug 1997 14:04:42   OM
   Headerfile-Umstellung

      Rev 1.219   07 Aug 1997 15:08:18   OM
   Headerfile-Umstellung

      Rev 1.218   04 Aug 1997 13:54:24   MIB
   aboslute psoitioning (fuer fast alle Zeichen-Attribute/-Vorlagen)

      Rev 1.217   31 Jul 1997 10:44:32   MIB
   DIV-Stack weg

      Rev 1.216   25 Jul 1997 11:08:30   MIB
   fix #42109#: Kommentare bei Tabellen in Tabellen beachten

      Rev 1.215   21 Jul 1997 10:55:22   MIB
   fix #41869#: Keile zusaetlichen Splaten bei selbst exportierten Tabellen

      Rev 1.214   16 Jul 1997 18:33:04   MIB
   fix #41669#: Kein Show im Accepted-State, weil Parser sonst zerst. werden kann

      Rev 1.213   15 Jul 1997 13:11:54   MIB
   fix: Tabellen-Ueberschriften immer zentrieren

      Rev 1.212   11 Jul 1997 11:51:30   MIB
   fix: Bei RULES=COLS auch Zeilen-Gruppen umranden

      Rev 1.211   10 Jul 1997 10:30:30   MIB
   fix #41516#: Keine Umrandung bei FRAME ohne BORDER

      Rev 1.210   09 Jul 1997 08:45:16   MIB
   'Ueberschrift wiederholen' uanhaengig von </THEAD>-Position abktivieren

      Rev 1.209   08 Jul 1997 14:16:42   MIB
   Meta-Tags als PostIts und die immer im ersten Body-Absatz verankern

      Rev 1.208   03 Jul 1997 09:37:00   MIB
   HTML-Tabellen: Bei letzter Grafik ohne Groesse sofort anpassen

      Rev 1.207   01 Jul 1997 12:39:14   MIB
   fix: Beim Vergeben von Filler-Boxen tatsaechliche Umrandung betrachten

      Rev 1.206   28 Jun 1997 11:32:00   MIB
   fix: Bei Umrandung und CELLPADDING=0 minimalen Abstand zum Inhalte beachten

      Rev 1.205   27 Jun 1997 15:57:40   MIB
   fix: Pending-Stack bei bCallNextToken beachten

      Rev 1.204   26 Jun 1997 11:54:52   MIB
   fix #41003#: Nimber-Format nur bei Value oder leerer Zelle setzen

      Rev 1.203   26 Jun 1997 10:56:32   MIB
   fix #40941#: Tabellen In Tabellen in Rahmen, wenn sie ausweichen muessen

      Rev 1.202   24 Jun 1997 08:59:54   MIB
   fix: Beim Splitten von Zelle auch Tabellen-Layout anpassen

      Rev 1.201   20 Jun 1997 13:36:08   MIB
   Auch Grafiken in Tabellen asynchron laden

      Rev 1.200   19 Jun 1997 11:57:04   MIB
   Tabellen weichen jetzt Rahmen aus

      Rev 1.199   16 Jun 1997 08:27:56   MIB
   CLASS/ID auch fier Tabellen

      Rev 1.198   12 Jun 1997 15:55:36   MIB
   358-Tabellen korrekt importieren

      Rev 1.197   12 Jun 1997 09:13:42   MIB
   fix: PostIts auch vor Tabellen in Rahmen in die Tabelle verschieben

      Rev 1.196   09 Jun 1997 18:14:08   MIB
   fix: leere Zellen und Zellen, die nur Grafiken enthalten, bekommen einen 2pt-Font

      Rev 1.195   09 Jun 1997 12:56:46   MIB
   fix: Kein GPF beim berechnen der Exportierbarkeit des Layouts mehr

      Rev 1.194   09 Jun 1997 09:07:22   MIB
   fix: Auch aus leeren Absatzen 2 LF entfernen

      Rev 1.193   05 Jun 1997 17:42:38   MIB
   fix: <NOBR> auch mit Space dahinter, Anpassungen an Export-Moeglichkeit

      Rev 1.192   02 Jun 1997 12:01:18   MIB
   fix: Bei vorhandener Umrandung deren Breite doch beruecksichtigen

      Rev 1.191   30 May 1997 18:02:42   MIB
   NOWRAP/NOBR, Einhalten der Mindestbreite bei rel. Tabellen

      Rev 1.190   28 May 1997 19:14:26   MIB
   fix: Layout-Info nicht im Destr. loeschen, TEST_RESIZE entfernt

      Rev 1.189   28 May 1997 16:11:52   MIB
   fix: Numerierung ueber Tabellen-Ueberschrift retten

      Rev 1.188   28 May 1997 15:35:34   MIB
   fix: -Angabe aus dem Format fuer Rahmen zu nehmen war keine gute Idee

      Rev 1.187   27 May 1997 11:47:08   MIB
   Netscape-konformere Beruecksichtigung von BORDER/CELLPADDING/CELLSPACING

      Rev 1.186   15 May 1997 15:42:36   MIB
   HTML-Tabellen-Layout an SwTable merken

      Rev 1.185   06 May 1997 12:07:54   MA
   swtablehxx aufgeteilt

      Rev 1.184   30 Apr 1997 18:10:02   MIB
   Ermitteln der verfuegbaren Breite ueber Layout

      Rev 1.183   30 Apr 1997 14:54:46   MIB
   Tabellen-Layout ausgelagert

      Rev 1.182   23 Apr 1997 14:57:04   MIB
   memory leak beseitig (wie 1.171.1.0)

      Rev 1.181   21 Apr 1997 18:08:18   MIB
   fix #38931#: 1. Absaetze hinter Tab in Tab nicht numerieren, Zelle hinter T in T

      Rev 1.180   16 Apr 1997 18:23:12   MIB
   fix #37769#: Tabellenbreite sinnvoll begrenzen und USHRT_MAX-Ueberlauf vermeiden

      Rev 1.179   16 Apr 1997 15:19:26   MIB
   fix #36787#: Ersatzdarstellung von Frames, Applets etc. auch in Tabellen ignorieren

      Rev 1.178   14 Apr 1997 16:44:48   MIB
   fixes #36418#, #36819#: Tabellen mit relativen/nicht relativen Spalten gleichz.

      Rev 1.177   11 Apr 1997 17:58:52   MIB
   fix #36820#: Bei Tabellen in Rahmen Absatz-Abstand beachten

      Rev 1.176   10 Apr 1997 16:40:00   MIB
   fix #37987#: Andere Berechnung der Spalten-Mindestbreite

      Rev 1.175   09 Apr 1997 16:50:50   MIB
   fix #38575#: Nicht immer einen Absatz vor Tabellen in Rahmen aufmachen

      Rev 1.174   08 Apr 1997 11:07:02   MIB
   fix #37219#: In Tabellen-Beschriftung alles erlauben

      Rev 1.173   04 Apr 1997 11:04:22   AMA
   Chg: Ein weiterer Parameter fuer GetMinMaxSize: das absolute Minimum

      Rev 1.172   01 Apr 1997 10:47:08   MIB
   fix #38284#: keine gelegentlich vertikale Ausrichtung an Zellen ohne Inhalt mehr

      Rev 1.171   18 Mar 1997 19:06:44   MIB
   fix #37886#: Kein Show beim Abbrechen mehr aufrufen, weil ViewShell tot sein koennte

      Rev 1.170   18 Mar 1997 09:42:50   MIB
   fix #37795#: Tabellen in Tabellen-Ueberschriften abfangen

      Rev 1.169   05 Mar 1997 14:48:36   MIB
   Absatz-Abstaende verbessert

      Rev 1.168   22 Feb 1997 20:30:32   MIB
   Tabellen-Layout an Netscape 4.0 Preview 2 anpassen

      Rev 1.167   21 Feb 1997 15:28:26   MIB
   fix #36692#: Fuer ::com::sun::star::form::Forms in Tabellen ausserhalb von Zellen keine neuen Absaetze

      Rev 1.166   20 Feb 1997 17:04:46   MIB
   bug fix: SaveState auch fuer Col-Groups


*************************************************************************/

diff --git a/sw/source/filter/html/htmltabw.cxx b/sw/source/filter/html/htmltabw.cxx
new file mode 100644
index 0000000..6ef8019
--- /dev/null
+++ b/sw/source/filter/html/htmltabw.cxx
@@ -0,0 +1,1571 @@
/*************************************************************************
 *
 *  $RCSfile: htmltabw.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:56 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#define ITEMID_BOXINFO      SID_ATTR_BORDER_INNER
#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _SV_SVAPP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _HTMLOUT_HXX //autogen
#include <svtools/htmlout.hxx>
#endif
#ifndef _HTMLTOKN_H
#include <svtools/htmltokn.h>
#endif
#ifndef _HTMLKYWD_HXX
#include <svtools/htmlkywd.hxx>
#endif
#ifndef _WRKWIN_HXX //autogen
#include <vcl/wrkwin.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#include <svx/boxitem.hxx>
#endif

#ifndef _COM_SUN_STAR_FORM_XFORMSSUPPLIER_HPP_
#include <com/sun/star/form/XFormsSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_XFORM_HPP_
#include <com/sun/star/form/XForm.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_XIMAGEPRODUCERSUPPLIER_HPP_
#include <com/sun/star/form/XImageProducerSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_XFORMCONTROLLER_HPP_
#include <com/sun/star/form/XFormController.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_XFORMCOMPONENT_HPP_
#include <com/sun/star/form/XFormComponent.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_XFORMCONTROLLERLISTENER_HPP_
#include <com/sun/star/form/XFormControllerListener.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XCONTAINER_HPP_
#include <com/sun/star/container/XContainer.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XINDEXCONTAINER_HPP_
#include <com/sun/star/container/XIndexContainer.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XNAMEREPLACE_HPP_
#include <com/sun/star/container/XNameReplace.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XCONTAINERLISTENER_HPP_
#include <com/sun/star/container/XContainerListener.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XSET_HPP_
#include <com/sun/star/container/XSet.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_CONTAINEREVENT_HPP_
#include <com/sun/star/container/ContainerEvent.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XINDEXREPLACE_HPP_
#include <com/sun/star/container/XIndexReplace.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XNAMECONTAINER_HPP_
#include <com/sun/star/container/XNameContainer.hpp>
#endif

#ifndef _FMTORNT_HXX //autogen
#include <fmtornt.hxx>
#endif
#ifndef _FRMFMT_HXX //autogen
#include <frmfmt.hxx>
#endif
#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _FMTSRND_HXX //autogen
#include <fmtsrnd.hxx>
#endif
#ifndef _FRMATR_HXX
#include <frmatr.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _PAM_HXX
#include <pam.hxx>
#endif
#ifndef _NDTXT_HXX
#include <ndtxt.hxx>
#endif
#ifndef _SWRECT_HXX
#include <swrect.hxx>
#endif
#ifndef _CELLATR_HXX
#include <cellatr.hxx>
#endif
#ifndef _POOLFMT_HXX
#include <poolfmt.hxx>
#endif
#ifndef _SWTABLE_HXX
#include <swtable.hxx>
#endif
#ifndef _HTMLTBL_HXX
#include <htmltbl.hxx>
#endif
#ifndef _HTMLNUM_HXX
#include <htmlnum.hxx>
#endif
#ifndef _WRTHTML_HXX
#include <wrthtml.hxx>
#endif
#ifndef _WRTSWTBL_HXX
#include <wrtswtbl.hxx>
#endif



#ifndef PRODUCT
#ifndef _VIEWSH_HXX
#include <viewsh.hxx>
#endif
#ifndef _VIEWOPT_HXX
#include <viewopt.hxx>
#endif
#endif


//#define MAX_DEPTH (USHRT_MAX)
#define MAX_DEPTH (3)


class SwHTMLWrtTable : public SwWriteTable
{
    void Pixelize( sal_uInt16& rValue );
    void PixelizeBorders();

    void OutTableCell( SwHTMLWriter& rWrt, const SwWriteTableCell *pCell,
                       sal_Bool bOutVAlign ) const;

    void OutTableCells( SwHTMLWriter& rWrt,
                        const SwWriteTableCells& rCells,
                        const SvxBrushItem *pBrushItem ) const;

    virtual sal_Bool ShouldExpandSub( const SwTableBox *pBox,
                            sal_Bool bExpandedBefore, sal_uInt16 nDepth ) const;

    static sal_Bool HasTabBackground( const SwTableLine& rLine,
                        sal_Bool bTop, sal_Bool bBottom, sal_Bool bLeft, sal_Bool bRight );
    static sal_Bool HasTabBackground( const SwTableBox& rBox,
                        sal_Bool bTop, sal_Bool bBottom, sal_Bool bLeft, sal_Bool bRight );

public:
    SwHTMLWrtTable( const SwTableLines& rLines, long nWidth, sal_uInt16 nBWidth,
                    sal_Bool bRel, sal_uInt16 nLeftSub=0, sal_uInt16 nRightSub=0 );
    SwHTMLWrtTable( const SwHTMLTableLayout *pLayoutInfo );

    void Write( SwHTMLWriter& rWrt, SwHoriOrient eAlign=HORI_NONE,
                sal_Bool bTHead=sal_False, const SwFrmFmt *pFrmFmt=0,
                const String *pCaption=0, sal_Bool bTopCaption=sal_False,
                sal_uInt16 nHSpace=0, sal_uInt16 nVSpace=0 ) const;
};


SwHTMLWrtTable::SwHTMLWrtTable( const SwTableLines& rLines, long nWidth,
                                sal_uInt16 nBWidth, sal_Bool bRel,
                                sal_uInt16 nLSub, sal_uInt16 nRSub )
    : SwWriteTable( rLines, nWidth, nBWidth, bRel, MAX_DEPTH, nLSub, nRSub )
{
    PixelizeBorders();
}

SwHTMLWrtTable::SwHTMLWrtTable( const SwHTMLTableLayout *pLayoutInfo )
    : SwWriteTable( pLayoutInfo )
{
    // Einige Twip-Werte an Pixel-Grenzen anpassen
    if( bCollectBorderWidth )
        PixelizeBorders();
}

void SwHTMLWrtTable::Pixelize( sal_uInt16& rValue )
{
    if( rValue && Application::GetDefaultDevice() )
    {
        Size aSz( rValue, 0 );
        aSz = Application::GetDefaultDevice()->LogicToPixel( aSz, MapMode(MAP_TWIP) );
        if( !aSz.Width() )
            aSz.Width() = 1;
        aSz = Application::GetDefaultDevice()->PixelToLogic( aSz, MapMode(MAP_TWIP) );
        rValue = (sal_uInt16)aSz.Width();
    }
}

void SwHTMLWrtTable::PixelizeBorders()
{
    Pixelize( nBorder );
    Pixelize( nCellSpacing );
    Pixelize( nCellPadding );
}

sal_Bool SwHTMLWrtTable::HasTabBackground( const SwTableBox& rBox,
                        sal_Bool bTop, sal_Bool bBottom, sal_Bool bLeft, sal_Bool bRight )
{
    ASSERT( bTop || bBottom || bLeft || bRight,
            "HasTabBackground: darf nicht aufgerufen werden" );

    sal_Bool bRet = sal_False;
    if( rBox.GetSttNd() )
    {
        const SvxBrushItem& rBrushItem =
            rBox.GetFrmFmt()->GetBackground();

        bRet = !rBrushItem.GetColor().GetTransparency() ||
               rBrushItem.GetGraphicLink() || rBrushItem.GetGraphic();
    }
    else
    {
        const SwTableLines& rLines = rBox.GetTabLines();
        sal_uInt16 nCount = rLines.Count();
        sal_Bool bLeftRight = bLeft || bRight;
        for( sal_uInt16 i=0; !bRet && i<nCount; i++ )
        {
            sal_Bool bT = bTop && 0 == i;
            sal_Bool bB = bBottom && nCount-1 == i;
            if( bT || bB || bLeftRight )
                bRet = HasTabBackground( *rLines[i], bT, bB, bLeft, bRight);
        }
    }

    return bRet;
}

sal_Bool SwHTMLWrtTable::HasTabBackground( const SwTableLine& rLine,
                        sal_Bool bTop, sal_Bool bBottom, sal_Bool bLeft, sal_Bool bRight )
{
    ASSERT( bTop || bBottom || bLeft || bRight,
            "HasTabBackground: darf nicht aufgerufen werden" );

    sal_Bool bRet = sal_False;
    const SvxBrushItem& rBrushItem = rLine.GetFrmFmt()->GetBackground();
    bRet = !rBrushItem.GetColor().GetTransparency() ||
           rBrushItem.GetGraphicLink() || rBrushItem.GetGraphic();

    if( !bRet )
    {
        const SwTableBoxes& rBoxes = rLine.GetTabBoxes();
        sal_uInt16 nCount = rBoxes.Count();
        sal_Bool bTopBottom = bTop || bBottom;
        for( sal_uInt16 i=0; !bRet && i<nCount; i++ )
        {
            sal_Bool bL = bLeft && 0 == i;
            sal_Bool bR = bRight && nCount-1 == i;
            if( bTopBottom || bL || bR )
                bRet = HasTabBackground( *rBoxes[i], bTop, bBottom, bL, bR );
        }
    }

    return bRet;
}

sal_Bool lcl_WrtHTMLTbl_HasTabBorders( const SwTableLine*& rpLine, void* pPara );

sal_Bool lcl_WrtHTMLTbl_HasTabBorders( const SwTableBox*& rpBox, void* pPara )
{
    sal_Bool *pBorders = (sal_Bool *)pPara;
    if( *pBorders )
        return sal_False;

    if( !rpBox->GetSttNd() )
    {
        ((SwTableBox *)rpBox)->GetTabLines().ForEach(
                                &lcl_WrtHTMLTbl_HasTabBorders, pPara );
    }
    else
    {
        const SvxBoxItem& rBoxItem =
            (const SvxBoxItem&)rpBox->GetFrmFmt()->GetAttr( RES_BOX );

        *pBorders = rBoxItem.GetTop() || rBoxItem.GetBottom() ||
                    rBoxItem.GetLeft() || rBoxItem.GetRight();
    }

    return !*pBorders;
}

sal_Bool lcl_WrtHTMLTbl_HasTabBorders( const SwTableLine*& rpLine, void* pPara )
{
    sal_Bool *pBorders = (sal_Bool *)pPara;
    if( *pBorders )
        return sal_False;

    ((SwTableLine *)rpLine)->GetTabBoxes().ForEach(
                                    &lcl_WrtHTMLTbl_HasTabBorders, pPara );
    return !*pBorders;
}


sal_Bool SwHTMLWrtTable::ShouldExpandSub( const SwTableBox *pBox,
                                      sal_Bool bExpandedBefore,
                                      sal_uInt16 nDepth ) const
{
    sal_Bool bExpand = !pBox->GetSttNd() && nDepth>0;
    if( bExpand && bExpandedBefore )
    {
        // MIB 30.6.97: Wenn schon eine Box expandiert wurde, wird eine
        // weitere nur expandiert, wenn sie Umrandungen besitzt.
        sal_Bool bBorders = sal_False;
        lcl_WrtHTMLTbl_HasTabBorders( pBox, &bBorders );
        if( !bBorders )
            bBorders = HasTabBackground( *pBox, sal_True, sal_True, sal_True, sal_True );
        bExpand = bBorders;
    }

    return bExpand;
}


// Eine Box als einzelne Zelle schreiben
void SwHTMLWrtTable::OutTableCell( SwHTMLWriter& rWrt,
                                   const SwWriteTableCell *pCell,
                                   sal_Bool bOutVAlign ) const
{
    const SwTableBox *pBox = pCell->GetBox();
    sal_uInt16 nRow = pCell->GetRow();
    sal_uInt16 nCol = pCell->GetCol();
    sal_uInt16 nRowSpan = pCell->GetRowSpan();
    sal_uInt16 nColSpan = pCell->GetColSpan();

    SwWriteTableCol *pCol = aCols[nCol];

//  sal_Bool bOutWidth = nColSpan>1 || pCol->GetOutWidth();
    sal_Bool bOutWidth = sal_True; //nColSpan==1 && pCol->GetOutWidth();

    const SwStartNode* pSttNd = pBox->GetSttNd();
    sal_Bool bHead = sal_False;
    if( pSttNd )
    {
        sal_uInt32 nNdPos = pSttNd->GetIndex()+1;

        // Art der Zelle (TD/TH) bestimmen
        SwNode* pNd;
        while( !( pNd = rWrt.pDoc->GetNodes()[nNdPos])->IsEndNode() )
        {
            if( pNd->IsTxtNode() )
            {
                // nur Absaetzte betrachten, an denen man was erkennt
                // Das ist der Fall, wenn die Vorlage eine der Tabellen-Vorlagen
                // ist oder von einer der beiden abgelitten ist.
                const SwFmt *pFmt = &((SwTxtNode*)pNd)->GetAnyFmtColl();
                sal_uInt16 nPoolId = pFmt->GetPoolFmtId();
                while( !pFmt->IsDefault() &&
                       RES_POOLCOLL_TABLE_HDLN!=nPoolId &&
                       RES_POOLCOLL_TABLE!=nPoolId )
                {
                    pFmt = pFmt->DerivedFrom();
                    nPoolId = pFmt->GetPoolFmtId();
                }

                if( !pFmt->IsDefault() )
                {
                    bHead = (RES_POOLCOLL_TABLE_HDLN==nPoolId);
                    break;
                }
            }
            nNdPos++;
        }
    }

    rWrt.OutNewLine();  // <TH>/<TD> in neue Zeile
    ByteString sOut( '<' );
    sOut += (bHead ? sHTML_tableheader : sHTML_tabledata );

    // ROW- und COLSPAN ausgeben
    if( nRowSpan>1 )
        (((sOut += ' ' ) += sHTML_O_rowspan ) += '=')
            += ByteString::CreateFromInt32( nRowSpan );
    if( nColSpan > 1 )
        (((sOut += ' ' ) += sHTML_O_colspan ) += '=')
            += ByteString::CreateFromInt32( nColSpan );

#ifndef PURE_HTML
    long nWidth = 0;
    sal_uInt16 nPrcWidth = USHRT_MAX;
    if( bOutWidth )
    {
        if( bLayoutExport )
        {
            if( pCell->HasPrcWidthOpt() )
            {
                nPrcWidth = pCell->GetWidthOpt();
            }
            else
            {
                nWidth = pCell->GetWidthOpt();
                if( !nWidth )
                    bOutWidth = sal_False;
            }
        }
        else
        {
            if( HasRelWidths() )
                nPrcWidth = (sal_uInt16)GetPrcWidth(nCol,nColSpan);
            else
                nWidth = GetAbsWidth( nCol, nColSpan );
        }
    }

    long nHeight = pCell->GetHeight() > 0
                        ? GetAbsHeight( pCell->GetHeight(), nRow, nRowSpan )
                        : 0;
    Size aPixelSz( nWidth, nHeight );

    // WIDTH ausgeben (Grrr: nur fuer Netscape)
    if( (aPixelSz.Width() || aPixelSz.Height()) && Application::GetDefaultDevice() )
    {
        Size aOldSz( aPixelSz );
        aPixelSz = Application::GetDefaultDevice()->LogicToPixel( aPixelSz,
                                                        MapMode(MAP_TWIP) );
        if( aOldSz.Width() && !aPixelSz.Width() )
            aPixelSz.Width() = 1;
        if( aOldSz.Height() && !aPixelSz.Height() )
            aPixelSz.Height() = 1;
    }

    // WIDTH ausgeben: Aus Layout oder berechnet
    if( bOutWidth )
    {
        ((sOut += ' ' ) += sHTML_O_width ) += '=';
        if( nPrcWidth != USHRT_MAX )
            (sOut += ByteString::CreateFromInt32(nPrcWidth)) += '%';
        else
            sOut += ByteString::CreateFromInt32(aPixelSz.Width());
        if( !bLayoutExport && nColSpan==1 )
            pCol->SetOutWidth( sal_False );
    }

    if( nHeight )
    {
        (((sOut += ' ') += sHTML_O_height) += '=')
            += ByteString::CreateFromInt32(aPixelSz.Height());
    }
#endif

    const SfxItemSet& rItemSet = pBox->GetFrmFmt()->GetAttrSet();
    const SfxPoolItem *pItem;

    // ALIGN wird jetzt nur noch an den Absaetzen ausgegeben

    // VALIGN ausgeben
    if( bOutVAlign )
    {
        SwVertOrient eVertOri = pCell->GetVertOri();
        if( VERT_TOP==eVertOri || VERT_BOTTOM==eVertOri )
        {
            (((sOut += ' ') += sHTML_O_valign) += '=')
                += (VERT_TOP==eVertOri ? sHTML_VA_top : sHTML_VA_bottom);
        }
    }

    rWrt.Strm() << sOut.GetBuffer();
    sOut.Erase();

    rWrt.bTxtAttr = sal_False;
    rWrt.bOutOpts = sal_True;
    const SvxBrushItem *pBrushItem = 0;
    if( SFX_ITEM_SET==rItemSet.GetItemState( RES_BACKGROUND, sal_False, &pItem ) )
    {
        pBrushItem = (const SvxBrushItem *)pItem;
    }
    if( !pBrushItem )
        pBrushItem = pCell->GetBackground();

    if( pBrushItem )
    {
        // Hintergrund ausgeben
        String aDummy;
        rWrt.OutBackground( pBrushItem, aDummy, sal_False );

        if( rWrt.bCfgOutStyles )
            OutCSS1_TableBGStyleOpt( rWrt, *pBrushItem );
    }

    sal_uInt32 nNumFmt;
    double nValue = 0.0;
    sal_Bool bNumFmt = sal_False, bValue = sal_False;
    if( SFX_ITEM_SET==rItemSet.GetItemState( RES_BOXATR_FORMAT, sal_False, &pItem ) )
    {
        nNumFmt = ((const SwTblBoxNumFormat *)pItem)->GetValue();
        bNumFmt = sal_True;
    }
    if( SFX_ITEM_SET==rItemSet.GetItemState( RES_BOXATR_VALUE, sal_False, &pItem ) )
    {
        nValue = ((const SwTblBoxValue *)pItem)->GetValue();
        bValue = sal_True;
        if( !bNumFmt )
            nNumFmt = pBox->GetFrmFmt()->GetTblBoxNumFmt().GetValue();
    }

    if( bNumFmt || bValue )
        sOut = HTMLOutFuncs::CreateTableDataOptionsValNum( sOut,
                    bValue, nValue, nNumFmt, *rWrt.pDoc->GetNumberFormatter(),
                    rWrt.eDestEnc );
    sOut += '>';
    rWrt.Strm() << sOut.GetBuffer();
    rWrt.bLFPossible = sal_True;

    rWrt.IncIndentLevel();  // den Inhalt von <TD>...</TD> einruecken

    if( pSttNd )
    {
        HTMLSaveData aSaveData( rWrt, pSttNd->GetIndex()+1,
                                pSttNd->EndOfSectionIndex(),
                                rWrt.GetFlyFrmFmt() );
        rWrt.Out_SwDoc( rWrt.pCurPam );
//      rWrt.ChangeParaToken( 0 );  // MIB 8.7.97: Passiert jetzt in Out_SwDoc
    }
    else
    {
        sal_uInt16 nTWidth, nBWidth, nLSub, nRSub;
        if( HasRelWidths() )
        {
            nTWidth = 100;
            nBWidth = GetRawWidth( nCol, nColSpan );
            nLSub = 0;
            nRSub = 0;
        }
        else
        {
            nTWidth = GetAbsWidth( nCol, nColSpan );
            nBWidth = nTWidth;
            nLSub = GetLeftSpace( nCol );
            nRSub = GetRightSpace( nCol, nColSpan );
        }

        SwHTMLWrtTable aTableWrt( pBox->GetTabLines(), nTWidth,
                                  nBWidth, HasRelWidths(), nLSub, nRSub );
        aTableWrt.Write( rWrt );
    }

    rWrt.DecIndentLevel();  // den Inhalt von <TD>...</TD> einruecken

    if( rWrt.bLFPossible )
        rWrt.OutNewLine();
    HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), bHead ? sHTML_tableheader
                                                     : sHTML_tabledata,
                                sal_False );
    rWrt.bLFPossible = sal_True;
}


// Eine Line als Zeilen ausgeben
void SwHTMLWrtTable::OutTableCells( SwHTMLWriter& rWrt,
                                    const SwWriteTableCells& rCells,
                                    const SvxBrushItem *pBrushItem ) const
{
    // Wenn die Zeile mehr als eine Zelle nethaelt und alle Zellen
    // die gleiche Ausrichtung besitzen, das VALIGN an der Zeile statt der
    // Zelle ausgeben
    SwVertOrient eRowVertOri = VERT_NONE;
    if( rCells.Count() > 1 )
    {
        for( sal_uInt16 nCell = 0; nCell<rCells.Count(); nCell++ )
        {
            SwVertOrient eCellVertOri = rCells[nCell]->GetVertOri();
            if( 0==nCell )
            {
                eRowVertOri = eCellVertOri;
            }
            else if( eRowVertOri != eCellVertOri )
            {
                eRowVertOri = VERT_NONE;
                break;
            }
        }
    }

    rWrt.OutNewLine();  // <TR> in neuer Zeile
    rWrt.Strm() << '<' << sHTML_tablerow;
    if( pBrushItem )
    {
        String aDummy;
        rWrt.OutBackground( pBrushItem, aDummy, sal_False );

        rWrt.bTxtAttr = sal_False;
        rWrt.bOutOpts = sal_True;
        if( rWrt.bCfgOutStyles )
            OutCSS1_TableBGStyleOpt( rWrt, *pBrushItem );
    }

    if( VERT_TOP==eRowVertOri || VERT_BOTTOM==eRowVertOri )
    {
        ByteString sOut( ' ' );
        ((sOut += sHTML_O_valign) += '=')
            += (VERT_TOP==eRowVertOri ? sHTML_VA_top : sHTML_VA_bottom);
        rWrt.Strm() << sOut.GetBuffer();
    }

    rWrt.Strm() << '>';

    rWrt.IncIndentLevel(); // Inhalt von <TR>...</TR> einruecken

    for( sal_uInt16 nCell = 0; nCell<rCells.Count(); nCell++ )
        OutTableCell( rWrt, rCells[nCell], VERT_NONE==eRowVertOri );

    rWrt.DecIndentLevel(); // Inhalt von <TR>...</TR> einruecken

    rWrt.OutNewLine();  // </TR> in neuer Zeile
    HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_tablerow, sal_False );
}



void SwHTMLWrtTable::Write( SwHTMLWriter& rWrt, SwHoriOrient eAlign,
                            sal_Bool bTHead, const SwFrmFmt *pFrmFmt,
                            const String *pCaption, sal_Bool bTopCaption,
                            sal_uInt16 nHSpace, sal_uInt16 nVSpace ) const
{
    sal_uInt16 nRow;

    // Wert fuer FRAME bestimmen
    sal_uInt16 nFrameMask = 15;
    if( !(aRows[0])->bTopBorder )
        nFrameMask &= ~1;
    if( !(aRows[aRows.Count()-1])->bBottomBorder )
        nFrameMask &= ~2;
    if( !(aCols[0])->bLeftBorder )
        nFrameMask &= ~4;
    if( !(aCols[aCols.Count()-1])->bRightBorder )
        nFrameMask &= ~8;

    // Wert fur RULES bestimmen
    sal_Bool bRowsHaveBorder = sal_False;
    sal_Bool bRowsHaveBorderOnly = sal_True;
    SwWriteTableRow *pRow = aRows[0];
    for( nRow=1; nRow < aRows.Count(); nRow++ )
    {
        SwWriteTableRow *pNextRow = aRows[nRow];
        sal_Bool bBorder = ( pRow->bBottomBorder || pNextRow->bTopBorder );
        bRowsHaveBorder |= bBorder;
        bRowsHaveBorderOnly &= bBorder;

        sal_uInt16 nBorder = pRow->bBottomBorder ? pRow->nBottomBorder : USHRT_MAX;
        if( pNextRow->bTopBorder && pNextRow->nTopBorder < nBorder )
            nBorder = pNextRow->nTopBorder;

        pRow->bBottomBorder = bBorder;
        pRow->nBottomBorder = nBorder;

        pNextRow->bTopBorder = bBorder;
        pNextRow->nTopBorder = nBorder;

        pRow = pNextRow;
    }

    sal_Bool bColsHaveBorder = sal_False;
    sal_Bool bColsHaveBorderOnly = sal_True;
    SwWriteTableCol *pCol = aCols[0];
    sal_uInt16 nCol;
    for( nCol=1; nCol<aCols.Count(); nCol++ )
    {
        SwWriteTableCol *pNextCol = aCols[nCol];
        sal_Bool bBorder = ( pCol->bRightBorder || pNextCol->bLeftBorder );
        bColsHaveBorder |= bBorder;
        bColsHaveBorderOnly &= bBorder;
        pCol->bRightBorder = bBorder;
        pNextCol->bLeftBorder = bBorder;
        pCol = pNextCol;
    }


    // vorhergende Aufzaehlung etc. beenden
    rWrt.ChangeParaToken( 0 );

    if( rWrt.bLFPossible )
        rWrt.OutNewLine();  // <TABLE> in neue Zeile
    ByteString sOut( '<' );
    sOut += sHTML_table;

    // COLS ausgeben: Nur bei Export ueber Layout, wenn es beim Import
    // vorhanden war.
    if( bColsOption )
        (((sOut += ' ') += sHTML_O_cols) += '=')
            += ByteString::CreateFromInt32( aCols.Count() );

    // ALIGN= ausgeben
    if( HORI_RIGHT == eAlign )
        (((sOut += ' ') += sHTML_O_align ) += '=') += sHTML_AL_right;
    else if( HORI_CENTER == eAlign )
        (((sOut += ' ') += sHTML_O_align ) += '=') += sHTML_AL_center;
    else if( HORI_LEFT == eAlign )
        (((sOut += ' ') += sHTML_O_align ) += '=') += sHTML_AL_left;

    // WIDTH ausgeben: Stammt aus Layout oder ist berechnet
    if( nTabWidth )
    {
        ((sOut += ' ') += sHTML_O_width ) += '=';
        if( HasRelWidths() )
            (sOut += ByteString::CreateFromInt32( nTabWidth )) += '%';
        else if( Application::GetDefaultDevice() )
        {
            long nPixWidth = Application::GetDefaultDevice()->LogicToPixel(
                        Size(nTabWidth,0), MapMode(MAP_TWIP) ).Width();
            if( !nPixWidth )
                nPixWidth = 1;

            sOut += ByteString::CreateFromInt32( nPixWidth );
        }
        else
        {
            ASSERT( Application::GetDefaultDevice(), "kein Application-Window!?" );
            sOut += "100%";
        }
    }

    if( (nHSpace || nVSpace) && Application::GetDefaultDevice())
    {
        Size aPixelSpc =
            Application::GetDefaultDevice()->LogicToPixel( Size(nHSpace,nVSpace),
                                                   MapMode(MAP_TWIP) );
        if( !aPixelSpc.Width() && nHSpace )
            aPixelSpc.Width() = 1;
        if( !aPixelSpc.Height() && nVSpace )
            aPixelSpc.Height() = 1;

        if( aPixelSpc.Width() )
        {
            (((sOut += ' ') += sHTML_O_hspace) += '=')
                += ByteString::CreateFromInt32( aPixelSpc.Width() );
        }

        if( aPixelSpc.Height() )
        {
            (((sOut += ' ') += sHTML_O_vspace) += '=')
                += ByteString::CreateFromInt32( aPixelSpc.Height() );
        }
    }

    // BORDER ausgeben, aber nur wenn wir die Umrandung selbst berechnet
    // haben oder die Umrandung 0 ist oder es irgendwelche Umrandungen gibt.
    // Anderenfalls enthaelt nBorder naemlich nur die Breite der Umrandung,
    // die genutzt wird, wenn gar kein ::com::sun::star::sheet::Border angegeben ist.
    sal_Bool bHasAnyBorders = nFrameMask || bColsHaveBorder || bRowsHaveBorder;
    if( bCollectBorderWidth || nBorder==0 || bHasAnyBorders )
        (((sOut += ' ' ) += sHTML_O_border ) += '=')
            += ByteString::CreateFromInt32( rWrt.ToPixel( nBorder ) );

    // BORDERCOLOR ausgeben

    if( (sal_uInt32)-1 != nBorderColor && rWrt.bCfgOutStyles && bHasAnyBorders )
    {
        ((sOut += ' ' ) += sHTML_O_bordercolor ) += '=';
        rWrt.Strm() << sOut.GetBuffer();
        HTMLOutFuncs::Out_Color( rWrt.Strm(), nBorderColor );
        sOut.Erase();
    }

    // CELLPADDING ausgeben: Stammt aus Layout oder ist berechnet
    (((sOut += ' ' ) += sHTML_O_cellpadding ) += '=')
        += ByteString::CreateFromInt32( rWrt.ToPixel( nCellPadding ) );

    // CELLSPACING ausgeben: Stammt aus Layout oder ist berechnet
    (((sOut += ' ' ) += sHTML_O_cellspacing ) += '=')
        += ByteString::CreateFromInt32( rWrt.ToPixel( nCellSpacing ) );

    // FRAME/RULES ausgeben (nur sinnvoll, wenn border!=0)
    if( nBorder!=0 && (bCollectBorderWidth || bHasAnyBorders) )
    {
        const sal_Char *pFrame = 0;
        switch( nFrameMask )
        {
            case 0:  pFrame = sHTML_TF_void     ;break;
            case 1:  pFrame = sHTML_TF_above    ;break;
            case 2:  pFrame = sHTML_TF_below    ;break;
            case 3:  pFrame = sHTML_TF_hsides   ;break;
            case 4:  pFrame = sHTML_TF_lhs      ;break;
            case 8:  pFrame = sHTML_TF_rhs      ;break;
            case 12: pFrame = sHTML_TF_vsides   ;break;
            //FRAME=BOX ist der default wenn BORDER>0
            //case 15:
            //default: pFrame = sHTML_TF_box        ;break; // geht nicht
        };
        if( pFrame )
            (((sOut += ' ' ) += sHTML_O_frame ) += '=') += pFrame;

        const sal_Char *pRules = 0;
        if( aCols.Count() > 1 && aRows.Count() > 1 )
        {
            if( !bColsHaveBorder )
            {
                if( !bRowsHaveBorder )
                    pRules = sHTML_TR_none;
                else if( bRowsHaveBorderOnly )
                    pRules = sHTML_TR_rows;
                else
                    pRules = sHTML_TR_groups;
            }
            else if( bColsHaveBorderOnly )
            {
                if( !bRowsHaveBorder || !bRowsHaveBorderOnly )
                    pRules = sHTML_TR_cols;
            }
            else
            {
                if( !bRowsHaveBorder )
                    pRules = sHTML_TR_groups;
                else if( bRowsHaveBorderOnly )
                    pRules = sHTML_TR_rows;
                else
                    pRules = sHTML_TR_groups;
            }
        }
        else if( aRows.Count() > 1 )
        {
            if( !bRowsHaveBorder )
                pRules = sHTML_TR_none;
            else if( !bRowsHaveBorderOnly )
                pRules = sHTML_TR_groups;
        }
        else if( aCols.Count() > 1 )
        {
            if( !bColsHaveBorder )
                pRules = sHTML_TR_none;
            else if( !bColsHaveBorderOnly )
                pRules = sHTML_TR_groups;
        }

        if( pRules )
            (((sOut += ' ' ) += sHTML_O_rules ) += '=') += pRules;
    }
    rWrt.Strm() << sOut.GetBuffer();

    // Hintergrund ausgeben
    if( pFrmFmt )
    {
        String aDummy;
        rWrt.OutBackground( pFrmFmt->GetAttrSet(), aDummy, sal_False );

        if( rWrt.bCfgOutStyles && pFrmFmt )
            rWrt.OutCSS1_TableFrmFmtOptions( *pFrmFmt );
    }

    sOut = '>';
    rWrt.Strm() << sOut.GetBuffer();

    rWrt.IncIndentLevel(); // Inhalte von Table einruecken

    // Ueberschrift ausgeben
    if( pCaption && pCaption->Len() )
    {
        rWrt.OutNewLine(); // <CAPTION> in neue Zeile
        ByteString sOut( sHTML_caption );
        (((sOut += ' ') += sHTML_O_align) += '=')
            += (bTopCaption ? sHTML_VA_top : sHTML_VA_bottom);
        HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sOut.GetBuffer(), sal_True );
        HTMLOutFuncs::Out_String( rWrt.Strm(), *pCaption, rWrt.eDestEnc );
        HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_caption, sal_False );
    }

    sal_uInt16 nCols = aCols.Count();

    // <COLGRP>/<COL> ausgeben: Bei Export ueber Layout nur wenn beim
    // Import welche da waren, sonst immer.
    sal_Bool bColGroups = (bColsHaveBorder && !bColsHaveBorderOnly);
    if( bColTags )
    {
        if( bColGroups )
        {
            rWrt.OutNewLine(); // <COLGRP> in neue Zeile
            HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_colgroup, sal_True );

            rWrt.IncIndentLevel(); // Inhalt von <COLGRP> einruecken
        }

        for( nCol=0; nCol<nCols; nCol++ )
        {
            rWrt.OutNewLine(); // <COL> in neue Zeile

            const SwWriteTableCol *pCol = aCols[nCol];

            ByteString sOut( '<' );
            sOut += sHTML_col;

            sal_uInt16 nWidth;
            sal_Bool bRel;
            if( bLayoutExport )
            {
                bRel = pCol->HasRelWidthOpt();
                nWidth = pCol->GetWidthOpt();
            }
            else
            {
                bRel = HasRelWidths();
                nWidth = bRel ? GetRelWidth(nCol,1) : GetAbsWidth(nCol,1);
            }

            ((sOut += ' ' ) += sHTML_O_width ) += '=';
            if( bRel )
            {
                (sOut += ByteString::CreateFromInt32( nWidth ) ) += '*';
            }
            else
            {
                sOut += ByteString::CreateFromInt32( rWrt.ToPixel( nWidth ) );
            }
            sOut += '>';
            rWrt.Strm() << sOut.GetBuffer();

            if( bColGroups && pCol->bRightBorder && nCol<nCols-1 )
            {
                rWrt.DecIndentLevel(); // Inhalt von <COLGRP> einruecken
                rWrt.OutNewLine(); // </COLGRP> in neue Zeile
                HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_colgroup,
                                            sal_False );
                rWrt.OutNewLine(); // <COLGRP> in neue Zeile
                HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_colgroup,
                                            sal_True );
                rWrt.IncIndentLevel(); // Inhalt von <COLGRP> einruecken
            }
        }
        if( bColGroups )
        {
            rWrt.DecIndentLevel(); // Inhalt von <COLGRP> einruecken

            rWrt.OutNewLine(); // </COLGRP> in neue Zeile
            HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_colgroup,
                                        sal_False );
        }
    }

    // die Lines als Tabellenzeilen rausschreiben

    // <TBODY> ausgeben?
    sal_Bool bTSections = (bRowsHaveBorder && !bRowsHaveBorderOnly);
    sal_Bool bTBody = bTSections;

    // Wenn Sections ausgegeben werden muessen darf ein THEAD um die erste
    // Zeile nur ausgegeben werden, wenn unter der Zeile eine Linie ist
    if( bTHead &&
        (bTSections || bColGroups) &&
        nHeadEndRow<aRows.Count()-1 && !aRows[nHeadEndRow]->bBottomBorder )
        bTHead = sal_False;

    // <TBODY> aus ausgeben, wenn <THEAD> ausgegeben wird.
    bTSections |= bTHead;

    if( bTSections )
    {
        rWrt.OutNewLine(); // <THEAD>/<TDATA> in neue Zeile
        HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(),
                            bTHead ? sHTML_thead : sHTML_tbody, sal_True );

        rWrt.IncIndentLevel(); // Inhalt von <THEAD>/<TDATA> einr.
    }

    for( nRow = 0; nRow < aRows.Count(); nRow++ )
    {
        const SwWriteTableRow *pRow = aRows[nRow];
        const SwWriteTableCells& rCells = pRow->GetCells();

        OutTableCells( rWrt, pRow->GetCells(), pRow->GetBackground() );
        if( !nCellSpacing && nRow < aRows.Count()-1 && pRow->bBottomBorder &&
            pRow->nBottomBorder > DEF_LINE_WIDTH_1 )
        {
            sal_uInt16 nCnt = (pRow->nBottomBorder / DEF_LINE_WIDTH_1) - 1;
            for( ; nCnt; nCnt-- )
            {
                rWrt.OutNewLine();
                HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_tablerow,
                                            sal_True );
                HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_tablerow,
                                            sal_False );
            }
        }
        if( ( (bTHead && nRow==nHeadEndRow) ||
              (bTBody && pRow->bBottomBorder) ) &&
            nRow < aRows.Count()-1 )
        {
            rWrt.DecIndentLevel(); // Inhalt von <THEAD>/<TDATA> einr.
            rWrt.OutNewLine(); // </THEAD>/</TDATA> in neue Zeile
            HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(),
                            bTHead ? sHTML_thead : sHTML_tbody, sal_False );
            rWrt.OutNewLine(); // <THEAD>/<TDATA> in neue Zeile

            if( bTHead && nRow==nHeadEndRow )
                bTHead = sal_False;

            HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(),
                            bTHead ? sHTML_thead : sHTML_tbody, sal_True );
            rWrt.IncIndentLevel(); // Inhalt von <THEAD>/<TDATA> einr.
        }
    }

    if( bTSections )
    {
        rWrt.DecIndentLevel(); // Inhalt von <THEAD>/<TDATA> einr.

        rWrt.OutNewLine(); // </THEAD>/</TDATA> in neue Zeile
        HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(),
                            bTHead ? sHTML_thead : sHTML_tbody, sal_False );
    }

    rWrt.DecIndentLevel(); // Inhalt von <TABLE> einr.

    rWrt.OutNewLine(); // </TABLE> in neue Zeile
    HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_table, sal_False );
}

Writer& OutHTML_SwTblNode( Writer& rWrt, SwTableNode & rNode,
                           const SwFrmFmt *pFlyFrmFmt,
                           const String *pCaption, sal_Bool bTopCaption )
{

    SwTable& rTbl = rNode.GetTable();

    SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
    rHTMLWrt.bOutTable = sal_True;

    // die horizontale Ausrichtung des Rahmens hat (falls vorhanden)
    // Prioritaet. NONE bedeutet, dass keine horizontale
    // Ausrichtung geschrieben wird.
    SwHoriOrient eFlyHoriOri = HORI_NONE;
    SwSurround eSurround = SURROUND_NONE;
    sal_uInt8 nFlyPrcWidth = 0;
    long nFlyWidth;
    sal_uInt16 nFlyHSpace = 0;
    sal_uInt16 nFlyVSpace = 0;
    if( pFlyFrmFmt )
    {
        eSurround = pFlyFrmFmt->GetSurround().GetSurround();
        const SwFmtFrmSize& rFrmSize = pFlyFrmFmt->GetFrmSize();
        nFlyPrcWidth = rFrmSize.GetWidthPercent();
        nFlyWidth = rFrmSize.GetSize().Width();

        eFlyHoriOri = pFlyFrmFmt->GetHoriOrient().GetHoriOrient();
        if( HORI_NONE == eFlyHoriOri )
            eFlyHoriOri = HORI_LEFT;

        const SvxLRSpaceItem& rLRSpace = pFlyFrmFmt->GetLRSpace();
        nFlyHSpace = (rLRSpace.GetLeft() + rLRSpace.GetRight()) / 2;

        const SvxULSpaceItem& rULSpace = pFlyFrmFmt->GetULSpace();
        nFlyVSpace = (rULSpace.GetUpper() + rULSpace.GetLower()) / 2;
    }

    // ggf. eine FORM oeffnen
    sal_Bool bPreserveForm = sal_False;
    if( !rHTMLWrt.bPreserveForm )
    {
        rHTMLWrt.OutForm( sal_True, &rNode );
        bPreserveForm = (rHTMLWrt.pxFormComps && rHTMLWrt.pxFormComps->is() );
        rHTMLWrt.bPreserveForm = bPreserveForm;
    }

    SwFrmFmt *pFmt = rTbl.GetFrmFmt();

    const SwFmtFrmSize& rFrmSize = pFmt->GetFrmSize();
    long nWidth = rFrmSize.GetSize().Width();
    sal_uInt8 nPrcWidth = rFrmSize.GetWidthPercent();
    sal_uInt16 nBaseWidth = (sal_uInt16)nWidth;

    SwHoriOrient eTabHoriOri = pFmt->GetHoriOrient().GetHoriOrient();

    // HORI_NONE und HORI_FULL Tabellen benoetigen relative Breiten
    sal_uInt16 nNewDefListLvl = 0;
    sal_Bool bRelWidths = sal_False;
    sal_Bool bCheckDefList = sal_False;
    switch( eTabHoriOri )
    {
    case HORI_FULL:
        // Tabellen mit automatischer Ausrichtung werden zu Tabellen
        // mit 100%-Breite
        bRelWidths = sal_True;
        nWidth = 100;
        eTabHoriOri = HORI_LEFT;
        break;
    case HORI_NONE:
        {
            const SvxLRSpaceItem& aLRItem = pFmt->GetLRSpace();
            if( aLRItem.GetRight() )
            {
                // Die Tabellenbreite wird anhand des linken und rechten
                // Abstandes bestimmt. Deshalb versuchen wir die
                // tatsaechliche Breite der Tabelle zu bestimmen. Wenn
                // das nicht geht, machen wir eine 100% breite Tabelle
                // draus.
                nWidth = pFmt->FindLayoutRect(sal_True).Width();
                if( !nWidth )
                {
                    bRelWidths = sal_True;
                    nWidth = 100;
                }

            }
            else if( nPrcWidth  )
            {
                // Ohne rechten Rand bleibt die %-Breite erhalten
                nWidth = nPrcWidth;
                bRelWidths = sal_True;
            }
            else
            {
                // Ohne rechten Rand bleibt auch eine absolute Breite erhalten
                // Wir versuchen aber trotzdem ueber das Layout die
                // tatsachliche Breite zu ermitteln.
                long nRealWidth = pFmt->FindLayoutRect(sal_True).Width();
                if( nRealWidth )
                    nWidth = nRealWidth;
            }
            bCheckDefList = sal_True;
        }
        break;
    case HORI_LEFT_AND_WIDTH:
        eTabHoriOri = HORI_LEFT;
        bCheckDefList = sal_True;
        // no break
    default:
        // In allen anderen Faellen kann eine absolute oder relative
        // Breite direkt uebernommen werden.
        if( nPrcWidth )
        {
            bRelWidths = sal_True;
            nWidth = nPrcWidth;
        }
        break;
    }

    if( bCheckDefList )
    {
        ASSERT( !rHTMLWrt.GetNumInfo().GetNumRule() ||
                rHTMLWrt.GetNextNumInfo(),
                "NumInfo fuer naechsten Absatz fehlt!" );
        const SvxLRSpaceItem& aLRItem = pFmt->GetLRSpace();
        if( aLRItem.GetLeft() &&
            ( !rHTMLWrt.GetNumInfo().GetNumRule() ||
              ( rHTMLWrt.GetNextNumInfo() &&
                (rHTMLWrt.GetNextNumInfo()->IsRestart() ||
                 rHTMLWrt.GetNumInfo().GetNumRule() !=
                    rHTMLWrt.GetNextNumInfo()->GetNumRule()) ) ) )
        {
            // Wenn der Absatz vor der Tabelle nicht numeriert ist oder
            // der Absatz nach der Tabelle mit einer anderen oder
            // (gar keiner) Regel numeriert ist, koennen wir
            // die Einrueckung ueber eine DL regeln. Sonst behalten wir
            // die Einrueckung der Numerierung bei.
            nNewDefListLvl =
                (aLRItem.GetLeft() + (rHTMLWrt.nDefListMargin/2)) /
                rHTMLWrt.nDefListMargin;
        }
    }

    if( !pFlyFrmFmt && nNewDefListLvl != rHTMLWrt.nDefListLvl )
        rHTMLWrt.OutAndSetDefList( nNewDefListLvl );

    if( nNewDefListLvl )
    {
        if( rHTMLWrt.bLFPossible )
            rHTMLWrt.OutNewLine();
        HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_dd );
    }

    // eFlyHoriOri und eTabHoriOri besitzen nun nur noch die Werte
    // LEFT/CENTER und RIGHT!
    if( eFlyHoriOri!=HORI_NONE )
    {
        eTabHoriOri = eFlyHoriOri;
        // MIB 4.7.97: Wenn die Tabelle eine relative Breite besitzt,
        // dann richtet sich ihre Breite nach der des Rahmens, also
        // exportieren wir dessen Breite. Bei fixer Breite ist die Breite
        // der Tabelle massgeblich. Wer Tabellen mit relativer Breite <100%
        // in Rahmen steckt, ist selber schuld wenn nix Gutes bei rauskommt.
        if( bRelWidths )
        {
            nWidth = nFlyPrcWidth ? nFlyPrcWidth : nFlyWidth;
            bRelWidths = nFlyPrcWidth > 0;
        }
    }

    SwHoriOrient eDivHoriOri = HORI_NONE;
    switch( eTabHoriOri )
    {
    case HORI_LEFT:
        // Wenn eine linksbuendigeTabelle keinen rechtsseiigen Durchlauf
        // hat, brauchen wir auch kein ALIGN=LEFT in der Tabelle.
        if( eSurround==SURROUND_NONE || eSurround==SURROUND_LEFT )
            eTabHoriOri = HORI_NONE;
        break;
    case HORI_RIGHT:
        // Aehnliches gilt fuer rechtsbuendigeTabelle, hier nehmen wir
        // stattdessen ein <DIV ALIGN=RIGHT>.
        if( eSurround==SURROUND_NONE || eSurround==SURROUND_RIGHT )
        {
            eDivHoriOri = HORI_RIGHT;
            eTabHoriOri = HORI_NONE;
        }
        break;
    case HORI_CENTER:
        // ALIGN=CENTER versteht so gut wie keiner, deshalb verzichten wir
        // daruf und nehmen ein <CENTER>.
        eDivHoriOri = HORI_CENTER;
        eTabHoriOri = HORI_NONE;
        break;
    }
    if( HORI_NONE==eTabHoriOri )
        nFlyHSpace = nFlyVSpace = 0;

    if( pFmt->GetName().Len() )
        rHTMLWrt.OutImplicitMark( pFmt->GetName(), pMarkToTable );

    if( HORI_NONE!=eDivHoriOri )
    {
        if( rHTMLWrt.bLFPossible )
            rHTMLWrt.OutNewLine();  // <CENTER> in neuer Zeile
        if( HORI_CENTER==eDivHoriOri )
            HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sHTML_center, sal_True );
        else
        {
            ByteString sOut( sHTML_division );
            (((sOut += ' ') += sHTML_O_align) += '=') += sHTML_AL_right;
            HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sOut.GetBuffer(),
                                        sal_True );
        }
        rHTMLWrt.IncIndentLevel();  // Inhalt von <CENTER> einruecken
        rHTMLWrt.bLFPossible = sal_True;
    }

    // Wenn die Tabelle in keinem Rahmen ist kann man immer ein LF ausgeben.
    if( HORI_NONE==eTabHoriOri )
        rHTMLWrt.bLFPossible = sal_True;

    const SwHTMLTableLayout *pLayout = rTbl.GetHTMLTableLayout();

#ifndef PRODUCT
    ViewShell *pSh;
    rWrt.pDoc->GetEditShell( &pSh );
    if ( pSh && pSh->GetViewOptions()->IsTest1() )
        pLayout = 0;
#endif

    if( pLayout && pLayout->IsExportable() )
    {
        SwHTMLWrtTable aTableWrt( pLayout );
        aTableWrt.Write( rHTMLWrt, eTabHoriOri, rTbl.IsHeadlineRepeat(),
                         pFmt, pCaption, bTopCaption,
                         nFlyHSpace, nFlyVSpace );
    }
    else
    {
        SwHTMLWrtTable aTableWrt( rTbl.GetTabLines(), nWidth,
                                  nBaseWidth, bRelWidths );
        aTableWrt.Write( rHTMLWrt, eTabHoriOri, rTbl.IsHeadlineRepeat(),
                         pFmt, pCaption, bTopCaption,
                         nFlyHSpace, nFlyVSpace );
    }

    // Wenn die Tabelle in keinem Rahmen war kann man immer ein LF ausgeben.
    if( HORI_NONE==eTabHoriOri )
        rHTMLWrt.bLFPossible = sal_True;

    if( HORI_NONE!=eDivHoriOri )
    {
        rHTMLWrt.DecIndentLevel();  // Inhalt von <CENTER> einruecken
        rHTMLWrt.OutNewLine();      // </CENTER> in neue Teile
        HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(),
                               HORI_CENTER==eDivHoriOri ? sHTML_center
                                                        : sHTML_division, sal_False );
        rHTMLWrt.bLFPossible = sal_True;
    }

    // Pam hinter die Tabelle verschieben
    rHTMLWrt.pCurPam->GetPoint()->nNode = *rNode.EndOfSectionNode();

    if( bPreserveForm )
    {
        rHTMLWrt.bPreserveForm = sal_False;
        rHTMLWrt.OutForm( sal_False );
    }

    rHTMLWrt.bOutTable = sal_False;

    if( rHTMLWrt.GetNextNumInfo() &&
        !rHTMLWrt.GetNextNumInfo()->IsRestart() &&
        rHTMLWrt.GetNextNumInfo()->GetNumRule() ==
            rHTMLWrt.GetNumInfo().GetNumRule() )
    {
        // Wenn der Absatz hinter der Tabelle mit der gleichen Regel
        // numeriert ist wie der Absatz vor der Tabelle, dann steht in
        // der NumInfo des naechsten Absatzes noch die Ebene des Absatzes
        // vor der Tabelle. Es muss deshalb die NumInfo noch einmal geholt
        // werden um ggf. die Num-Liste noch zu beenden.
        rHTMLWrt.ClearNextNumInfo();
        rHTMLWrt.FillNextNumInfo();
        OutHTML_NumBulListEnd( rHTMLWrt, *rHTMLWrt.GetNextNumInfo() );
    }
    return rWrt;
}

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/html/htmltabw.cxx,v 1.1.1.1 2000-09-18 17:14:56 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.60  2000/09/18 16:04:46  willem.vandorp
      OpenOffice header added.

      Revision 1.59  2000/06/26 09:52:33  jp
      must change: GetAppWindow->GetDefaultDevice

      Revision 1.58  2000/04/28 14:29:12  mib
      unicode

      Revision 1.57  2000/04/10 12:20:57  mib
      unicode

      Revision 1.56  2000/03/21 15:06:18  os
      UNOIII

      Revision 1.55  2000/03/03 15:21:01  os
      StarView remainders removed

      Revision 1.54  2000/02/11 14:37:33  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.53  2000/02/07 08:24:58  mib
      #72727#: HORI_LEFT_AND_WIDTH

      Revision 1.52  1999/11/19 16:40:20  os
      modules renamed

      Revision 1.51  1999/10/29 17:35:38  jp
      export the class for build a '2D-Table' from a SwTable

      Revision 1.50  1999/09/21 09:49:57  mib
      multiple text encodings

      Revision 1.49  1999/06/11 14:43:36  MIB
      Individuelle Umrandungs-Abstaende


      Rev 1.48   11 Jun 1999 16:43:36   MIB
   Individuelle Umrandungs-Abstaende

      Rev 1.47   10 Jun 1999 10:34:30   JP
   have to change: no AppWin from SfxApp

      Rev 1.46   09 Jun 1999 19:37:04   JP
   have to change: no cast from GetpApp to SfxApp/OffApp, SfxShell only subclass of SfxApp

      Rev 1.45   22 Feb 1999 08:40:42   MA
   1949globale Shell entsorgt, Shells am RootFrm

      Rev 1.44   25 Jan 1999 16:19:10   OS
   #56371# TF_ONE51 - uebersetzbar

      Rev 1.43   05 Jan 1999 14:48:04   MIB
   #60429#: Zeilenhoehe korrekt berechnen

      Rev 1.42   09 Nov 1998 11:40:30   MIB
   #56461#: Keine Tabelle in Tabelle exportieren, wenn Hintergrund vorhanden

      Rev 1.41   04 Nov 1998 15:04:26   MIB
   #56461#: Keine Zellen mit Hintergrund als Tabelle in Tabelle exportieren

      Rev 1.40   17 Sep 1998 16:28:36   MIB
   CSS1-Export aufgeraeumt

      Rev 1.39   10 Jun 1998 10:15:38   OS
   Package-Umstellung

      Rev 1.38   19 May 1998 14:47:30   MIB
   VC-Controls raus, UNO-Controls rein

      Rev 1.37   15 Apr 1998 14:57:56   MIB
   Zwei-seitige Printing-Extensions

      Rev 1.36   08 Apr 1998 16:53:22   MIB
   NumberForamtter-Value mit 0 initialsiert (vielleicht hilft's ja gegen #49395#)

      Rev 1.35   19 Mar 1998 09:28:26   MIB
   Rahmen-Export verbessert/aufgeraeumt

      Rev 1.34   20 Feb 1998 19:01:52   MA
   header

      Rev 1.33   13 Feb 1998 19:11:50   HR
   C42 (Solaris) wie ICC

      Rev 1.32   19 Jan 1998 16:21:50   MIB
   Numerierungs-Umbau

      Rev 1.31   26 Nov 1997 19:09:46   MA
   includes

      Rev 1.30   09 Oct 1997 14:35:42   JP
   Umstellung NodeIndex/-Array/BigPtrArray

      Rev 1.29   12 Sep 1997 11:16:24   OS
   ITEMID_* definiert

      Rev 1.28   29 Aug 1997 16:49:48   OS
   DLL-Umstellung

      Rev 1.27   15 Aug 1997 12:46:32   OS
   charatr/frmatr/txtatr aufgeteilt

      Rev 1.26   12 Aug 1997 13:42:56   OS
   Header-Umstellung

      Rev 1.25   07 Aug 1997 15:08:06   OM
   Headerfile-Umstellung

      Rev 1.24   22 Jul 1997 11:31:10   MIB
   Zwei Zeilen vertauscht, wegen Opt-Fehler im OS/2 C-Set-Compiler

      Rev 1.23   11 Jul 1997 13:34:18   MIB
   VALIGN an Zeile ausgeben, wenn Ausr. an allen Zellen gleich, kein VALIGN=MIDDLE

      Rev 1.22   11 Jul 1997 11:54:52   MIB
   COLGROUP/TBODY nur wo wirklich noetig, FRAMES/RULES fuer einzeile/spaltige Tbls

      Rev 1.21   11 Jul 1997 09:17:50   MIB
   fix: BORDER/CELLSP bei nur innerer Umrandung, FRAME/RULES nur wenn noetig

      Rev 1.20   11 Jul 1997 07:42:20   MIB
   Rechts-ausgerichtete Tabellen (auch im Rahmen ohne Umlauf) durch DIV ausrichten

      Rev 1.19   09 Jul 1997 08:46:08   MIB
   Fix: Bei Export ueber Layout </THEAD> nach 1. nicht 2. Zeile

      Rev 1.18   09 Jul 1997 08:15:30   MIB
   Kein ALIGN=CENTER in mit <CENTER> zentrierten Tabellen

      Rev 1.17   08 Jul 1997 18:10:44   MIB
   fix: <PRE> vor Bereichen, spaltigen Rahmen und am Dokende beenden

      Rev 1.16   04 Jul 1997 12:40:16   MIB
   Verbess. Tbl. in Rahmen: Bei rel. Breite immmer die Rahmenbreite exportieren.

      Rev 1.15   04 Jul 1997 09:23:12   MIB
   fix: Beim Export ueber Layout kein BORDER ausgeben, wenn keine Umrandung ex.

      Rev 1.14   30 Jun 1997 16:25:16   MIB
   Die erste Box ohne Inhalt nie als Tabelle in Tabelle exportieren

      Rev 1.13   30 Jun 1997 12:01:52   MIB
   Tabellen ohne Umrandung immer als Tab in Tab exportieren

      Rev 1.12   21 Jun 1997 12:40:08   MIB
   Nach <TD> darf ein LF ausgegeben werden

      Rev 1.11   17 Jun 1997 11:45:28   MIB
   Sprungmarken fuer generierte Links in Verzeichnissen

      Rev 1.10   12 Jun 1997 15:58:42   MIB
   Ab bestimmter Tiefe Tabellen in Tabellen exportieren

      Rev 1.9   11 Jun 1997 18:11:52   MIB
   fix: Twip-Werte der Umrandung an Pixel-Breite anpassen

      Rev 1.8   10 Jun 1997 09:49:20   TRI
   Borland Anpassung

      Rev 1.7   09 Jun 1997 09:35:14   MIB
   bug fixes fuer Export ueber Layout

      Rev 1.6   05 Jun 1997 17:44:12   MIB
   Tabellen-Export ueber Layout

      Rev 1.5   05 Jun 1997 11:25:50   MIB
   keine inlines fuer Borland C

      Rev 1.4   27 May 1997 12:58:40   TRI
   PRODCT nach PRODUCT

      Rev 1.3   06 May 1997 11:01:04   TRI
   operatoren bei ICC nicht inline

      Rev 1.2   24 Apr 1997 12:50:04   MIB
   kleinere Verbesserungen

      Rev 1.1   21 Apr 1997 11:27:58   MIB
   jetzt mit Hoehenberechnung ueber Layout

      Rev 1.0   19 Apr 1997 13:23:38   MIB
   Initial revision.

      Rev 1.178   14 Apr 1997 17:33:46   MIB
   fix #36953#: Keine Tricks gegen Absatz-Abstaende im letzten Tabellen-Absatz


*************************************************************************/

diff --git a/sw/source/filter/html/htmlvsh.hxx b/sw/source/filter/html/htmlvsh.hxx
new file mode 100644
index 0000000..f500e73
--- /dev/null
+++ b/sw/source/filter/html/htmlvsh.hxx
@@ -0,0 +1,91 @@
/*************************************************************************
 *
 *  $RCSfile: htmlvsh.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:56 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _HTMLVSH_HXX
#define _HTMLVSH_HXX

#ifndef _CALBCK_HXX
#include <calbck.hxx>
#endif
class ViewShell;


class SwHTMLViewShellClient : public SwClient
{
    virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew );

public:

    SwHTMLViewShellClient( ViewShell *pVSh );

    virtual ~SwHTMLViewShellClient();

    void Register( ViewShell *pVsh );
    void DeRegister();

    /*inline*/ ViewShell *GetViewShell(); // im swhtml.cxx
};



#endif


diff --git a/sw/source/filter/html/makefile.mk b/sw/source/filter/html/makefile.mk
new file mode 100644
index 0000000..43a1cd9
--- /dev/null
+++ b/sw/source/filter/html/makefile.mk
@@ -0,0 +1,138 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:56 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=..$/..$/..

PRJNAME=sw
TARGET=html

PROJECTPCH=filt_pch
PROJECTPCHSOURCE=..\filt_1st\filt_pch

# --- Settings -----------------------------------------------------

.INCLUDE :  $(PRJ)$/inc$/swpre.mk
.INCLUDE :  settings.mk
.INCLUDE :  $(PRJ)$/inc$/sw.mk

.IF "$(mydebug)" != ""
CDEFS=$(CDEFS) -Dmydebug
.ENDIF

# --- Files --------------------------------------------------------

CXXFILES = \
        css1atr.cxx      \
        css1kywd.cxx      \
        htmlatr.cxx     \
        htmlbas.cxx      \
        htmlcss1.cxx      \
        htmlctxt.cxx      \
        htmldraw.cxx      \
        htmlfld.cxx      \
        htmlfldw.cxx      \
        htmlfly.cxx      \
        htmlflyt.cxx      \
        htmlform.cxx     \
        htmlforw.cxx     \
        htmlftn.cxx      \
        htmlgrin.cxx      \
        htmlnum.cxx      \
        htmlplug.cxx      \
        htmlsect.cxx      \
        htmltab.cxx      \
        htmltabw.cxx      \
        parcss1.cxx      \
        svxcss1.cxx      \
        swhtml.cxx 		\
        wrthtml.cxx      \

SLOFILES =  \
        $(SLO)$/css1atr.obj \
        $(SLO)$/css1kywd.obj \
        $(SLO)$/htmlatr.obj \
        $(SLO)$/htmlbas.obj \
        $(SLO)$/htmlcss1.obj \
        $(SLO)$/htmlctxt.obj \
        $(SLO)$/htmldraw.obj \
        $(SLO)$/htmlfld.obj \
        $(SLO)$/htmlfldw.obj \
        $(SLO)$/htmlfly.obj \
        $(SLO)$/htmlflyt.obj \
        $(SLO)$/htmlform.obj \
        $(SLO)$/htmlforw.obj \
        $(SLO)$/htmlftn.obj \
        $(SLO)$/htmlgrin.obj \
        $(SLO)$/htmlnum.obj \
        $(SLO)$/htmlplug.obj \
        $(SLO)$/htmlsect.obj \
        $(SLO)$/htmltab.obj \
        $(SLO)$/htmltabw.obj \
        $(SLO)$/parcss1.obj \
        $(SLO)$/svxcss1.obj \
        $(SLO)$/swhtml.obj \
        $(SLO)$/wrthtml.obj \

# --- Tagets -------------------------------------------------------

.INCLUDE :  target.mk

diff --git a/sw/source/filter/html/parcss1.cxx b/sw/source/filter/html/parcss1.cxx
new file mode 100644
index 0000000..912cbdd
--- /dev/null
+++ b/sw/source/filter/html/parcss1.cxx
@@ -0,0 +1,1598 @@
/*************************************************************************
 *
 *  $RCSfile: parcss1.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:56 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>

#ifndef _RTL_USTRBUF_HXX_
#include <rtl/ustrbuf.hxx>
#endif

#ifndef _TOOLS_DEBUG_HXX //autogen
#include <tools/debug.hxx>
#endif
#ifndef _INTN_HXX //autogen
#include <tools/intn.hxx>
#endif
#ifndef _SV_SVAPP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _SV_COLOR_HXX //autogen
#include <vcl/color.hxx>
#endif
#ifndef _HTMLTOKN_H
#include <svtools/htmltokn.h>
#endif



#include "css1kywd.hxx"
#include "parcss1.hxx"


// Loop-Check: Um Endlos-Schleifen zu vermeiden, wird in jeder
// Schalife geprueft, ob ein Fortschritt in der Eingabe-Position
// stattgefunden hat
#define LOOP_CHECK

#ifdef LOOP_CHECK

#define LOOP_CHECK_DECL \
    xub_StrLen nOldInPos = STRING_MAXLEN;
#define LOOP_CHECK_RESTART \
    nOldInPos = STRING_MAXLEN;
#define LOOP_CHECK_CHECK( where ) \
    DBG_ASSERT( nOldInPos!=nInPos || cNextCh==(sal_Unicode)EOF, where );    \
    if( nOldInPos==nInPos && cNextCh!=(sal_Unicode)EOF )                    \
        break;                                                              \
    else                                                                    \
        nOldInPos = nInPos;

#else

#define LOOP_CHECK_DECL
#define LOOP_CHECK_RESTART
#define LOOP_CHECK_CHECK( where )

#endif



const sal_Int32 MAX_LEN = 1024;

/*  */

void CSS1Parser::InitRead( const String& rIn )
{
    nlLineNr = 0;
    nlLinePos = 0;

    bWhiteSpace = TRUE; // Wenn noch nichts gelesen wurde ist das wie WS
    bEOF = FALSE;
    eState = CSS1_PAR_WORKING;
    nValue = 0.;

    aIn = rIn;
    nInPos = 0;
    cNextCh = GetNextChar();
    nToken = GetNextToken();
}

sal_Unicode CSS1Parser::GetNextChar()
{
    if( nInPos >= aIn.Len() )
    {
        bEOF = TRUE;
        return (sal_Unicode)EOF;
    }

    sal_Unicode c = aIn.GetChar( nInPos );
    nInPos++;

    if( c == '\n' )
    {
        IncLineNr();
        SetLinePos( 1L );
    }
    else
        IncLinePos();

    return c;
}

/*  */

// Diese Funktion realisiert den in
//
//      http://www.w3.orh/pub/WWW/TR/WD-css1.html
// bzw. http://www.w3.orh/pub/WWW/TR/WD-css1-960220.html
//
// beschriebenen Scanner fuer CSS1. Es handelt sich um eine direkte
// Umsetzung der dort beschriebenen Lex-Grammatik
//
CSS1Token CSS1Parser::GetNextToken()
{
    CSS1Token nRet = CSS1_NULL;
    aToken.Erase();

    do {
        // Merken, ob davor White-Space gelesen wurde
        BOOL bPrevWhiteSpace = bWhiteSpace;
        bWhiteSpace = FALSE;

        BOOL bNextCh = TRUE;
        switch( cNextCh )
        {
        case '/': // COMMENT | '/'
            {
                cNextCh = GetNextChar();
                if( '*' == cNextCh )
                {
                    // COMMENT
                    cNextCh = GetNextChar();

                    BOOL bAsterix = FALSE;
                    while( !(bAsterix && '/'==cNextCh) && !IsEOF() )
                    {
                        bAsterix = ('*'==cNextCh);
                        cNextCh = GetNextChar();
                    }
                }
                else
                {
                    // '/'
                    bNextCh = FALSE;
                    nRet = CSS1_SLASH;
                }
            }
            break;

        case '@': // '@import' | '@XXX'
            {
                cNextCh = GetNextChar();
                if( ('A' <= cNextCh && cNextCh <= 'Z') ||
                    ('a' <= cNextCh && cNextCh <= 'z') )
                {
                    // den naechsten Identifer scannen
                    ::rtl::OUStringBuffer sTmpBuffer( 32L );
                    do {
                        sTmpBuffer.append( cNextCh );
                        cNextCh = GetNextChar();
                    } while( ('A' <= cNextCh && cNextCh <= 'Z') ||
                             ('a' <= cNextCh && cNextCh <= 'z') ||
                             ('0' <= cNextCh && cNextCh <= '9') ||
                             '-'==cNextCh && !IsEOF() );

                    aToken += String(sTmpBuffer.makeStringAndClear());

                    // und schauen, ob wir ihn kennen
                    switch( aToken.GetChar(0) )
                    {
                    case 'i':
                    case 'I':
                        if( aToken.EqualsIgnoreCaseAscii(sCSS1_import) )
                            nRet = CSS1_IMPORT_SYM;
                        break;
// /Feature: PrintExt
                    case 'p':
                    case 'P':
                        if( aToken.EqualsIgnoreCaseAscii(sCSS1_page) )
                            nRet = CSS1_PAGE_SYM;
                        break;
// /Feature: PrintExt
                    }

                    // Fehlerbehandlung: '@ident' und alles bis
                    // zu einem Semikolon der dem Ende des folgenden
                    // Blocks ignorieren
                    if( CSS1_NULL==nRet )
                    {
                        aToken.Erase();
                        USHORT nBlockLvl = 0;
                        sal_Unicode cQuoteCh = 0;
                        BOOL bDone = FALSE, bEscape = FALSE;
                        while( !bDone && !IsEOF() )
                        {
                            BOOL bOldEscape = bEscape;
                            bEscape = FALSE;
                            switch( cNextCh )
                            {
                            case '{':
                                if( !cQuoteCh && !bOldEscape )
                                    nBlockLvl++;;
                                break;
                            case ';':
                                if( !cQuoteCh && !bOldEscape )
                                    bDone = nBlockLvl==0;
                                break;
                            case '}':
                                if( !cQuoteCh && !bOldEscape )
                                    bDone = --nBlockLvl==0;
                                break;
                            case '\"':
                            case '\'':
                                if( !bOldEscape )
                                {
                                    if( cQuoteCh )
                                    {
                                        if( cQuoteCh == cNextCh )
                                            cQuoteCh = 0;
                                    }
                                    else
                                    {
                                        cQuoteCh = cNextCh;
                                    }
                                }
                                break;
                            case '\\':
                                if( !bOldEscape )
                                    bEscape = TRUE;
                                break;
                            }
                            cNextCh = GetNextChar();
                        }
                    }

                    bNextCh = FALSE;
                }
            }
            break;

        case '!': // '!' 'legal' | '!' 'important' | syntax error
            {
                // White Space ueberlesen
                cNextCh = GetNextChar();
                while( ( ' ' == cNextCh ||
                       (cNextCh >= 0x09 && cNextCh <= 0x0d) ) && !IsEOF() )
                {
                    bWhiteSpace = TRUE;
                    cNextCh = GetNextChar();
                }

                if( 'i'==cNextCh || 'I'==cNextCh)
                {
                    // den naechsten Identifer scannen
                    ::rtl::OUStringBuffer sTmpBuffer( 32L );
                    do {
                        sTmpBuffer.append( cNextCh );
                        cNextCh = GetNextChar();
                    } while( ('A' <= cNextCh && cNextCh <= 'Z') ||
                             ('a' <= cNextCh && cNextCh <= 'z') ||
                             ('0' <= cNextCh && cNextCh <= '9') ||
                             '-' == cNextCh && !IsEOF() );

                    aToken += String(sTmpBuffer.makeStringAndClear());

                    if( ('i'==aToken.GetChar(0) || 'I'==aToken.GetChar(0)) &&
                        aToken.EqualsIgnoreCaseAscii(sCSS1_important) )
                    {
                        // '!' 'important'
                        nRet = CSS1_IMPORTANT_SYM;
                    }
                    else
                    {
                        // Fehlerbehandlung: '!' ignorieren, IDENT nicht
                        nRet = CSS1_IDENT;
                    }

                    bWhiteSpace = FALSE;
                    bNextCh = FALSE;
                }
                else
                {
                    // Fehlerbehandlung: '!' ignorieren
                    bNextCh = FALSE;
                }
            }
            break;

        case '\"':
        case '\'': // STRING
            {
                // \... geht noch nicht!!!
                sal_Unicode cQuoteChar = cNextCh;
                cNextCh = GetNextChar();

                ::rtl::OUStringBuffer sTmpBuffer( MAX_LEN );
                do {
                    sTmpBuffer.append( cNextCh );
                    cNextCh = GetNextChar();
                } while( cQuoteChar != cNextCh && !IsEOF() );

                aToken += String(sTmpBuffer.makeStringAndClear());

                nRet = CSS1_STRING;
            }
            break;

        case '0':
        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9': // NUMBER | PERCENTAGE | LENGTH
            {
                // die aktuelle Position retten
                xub_StrLen nInPosSave = nInPos;
                sal_Unicode cNextChSave = cNextCh;
                sal_uInt32 nlLineNrSave = nlLineNr;
                sal_uInt32 nlLinePosSave = nlLinePos;
                BOOL bEOFSave = bEOF;

                // erstmal versuchen eine Hex-Zahl zu scannen
                ::rtl::OUStringBuffer sTmpBuffer( 16 );
                do {
                    sTmpBuffer.append( cNextCh );
                    cNextCh = GetNextChar();
                } while( sTmpBuffer.getLength() < 7 &&
                         ( ('0'<=cNextCh && '9'>=cNextCh) ||
                           ('A'<=cNextCh && 'F'>=cNextCh) ||
                           ('a'<=cNextCh && 'f'>=cNextCh) ) &&
                         !IsEOF() );

                if( sTmpBuffer.getLength()==6 )
                {
                    // wir haben eine hexadezimale Farbe gefunden
                    aToken += String(sTmpBuffer.makeStringAndClear());
                    nRet = CSS1_HEXCOLOR;
                    bNextCh = FALSE;

                    break;
                }

                // sonst versuchen wir es mit einer Zahl
                nInPos = nInPosSave;
                cNextCh = cNextChSave;
                nlLineNr = nlLineNrSave;
                nlLinePos = nlLinePosSave;
                bEOF = bEOFSave;

                // erstmal die Zahl scannen
                sTmpBuffer.setLength( 0L );
                do {
                    sTmpBuffer.append( cNextCh );
                    cNextCh = GetNextChar();
                } while( (('0'<=cNextCh && '9'>=cNextCh) || '.'==cNextCh) &&
                         !IsEOF() );

                aToken += String(sTmpBuffer.makeStringAndClear());
                nValue = aToken.ToDouble();

                // White Space ueberlesen
                while( ( ' ' == cNextCh ||
                       (cNextCh >= 0x09 && cNextCh <= 0x0d) ) && !IsEOF() )
                {
                    bWhiteSpace = TRUE;
                    cNextCh = GetNextChar();
                }

                // und nun Schauen, ob es eine Einheit gibt
                switch( cNextCh )
                {
                case '%': // PERCENTAGE
                    bWhiteSpace = FALSE;
                    nRet = CSS1_PERCENTAGE;
                    break;

                case 'c':
                case 'C': // LENGTH cm | LENGTH IDENT
                case 'e':
                case 'E': // LENGTH (em | ex) | LENGTH IDENT
                case 'i':
                case 'I': // LENGTH inch | LENGTH IDENT
                case 'p':
                case 'P': // LENGTH (pt | px | pc) | LENGTH IDENT
                case 'm':
                case 'M': // LENGTH mm | LENGTH IDENT
                    {
                        // die aktuelle Position retten
                        xub_StrLen nInPosSave = nInPos;
                        sal_Unicode cNextChSave = cNextCh;
                        ULONG nlLineNrSave = nlLineNr;
                        ULONG nlLinePosSave = nlLinePos;
                        BOOL bEOFSave = bEOF;

                        // den naechsten Identifer scannen
                        String aIdent;
                        ::rtl::OUStringBuffer sTmpBuffer( 64L );
                        do {
                            sTmpBuffer.append( cNextCh );
                            cNextCh = GetNextChar();
                        } while( ( ('A' <= cNextCh && cNextCh <= 'Z') ||
                                    ('a' <= cNextCh && cNextCh <= 'z') ||
                                    ('0' <= cNextCh && cNextCh <= '9') ||
                                 '-'==cNextCh) && !IsEOF() );

                        aIdent += String(sTmpBuffer.makeStringAndClear());

                        // Ist es eine Einheit?
                        const sal_Char *pCmp1 = 0, *pCmp2 = 0, *pCmp3 = 0;
                        double nScale1 = 1., nScale2 = 1., nScale3 = 1.;
                        CSS1Token nToken1 = CSS1_LENGTH,
                                  nToken2 = CSS1_LENGTH,
                                  nToken3 = CSS1_LENGTH;
                        switch( aIdent.GetChar(0) )
                        {
                        case 'c':
                        case 'C':
                            pCmp1 = sCSS1_UNIT_cm;
                            nScale1 = (72.*20.)/2.54; // twip
                            break;
                        case 'e':
                        case 'E':
                            pCmp1 = sCSS1_UNIT_em;
                            nToken1 = CSS1_EMS;

                            pCmp2 = sCSS1_UNIT_ex;
                            nToken2 = CSS1_EMX;
                            break;
                        case 'i':
                        case 'I':
                            pCmp1 = sCSS1_UNIT_inch;
                            nScale1 = 72.*20.; // twip
                            break;
                        case 'm':
                        case 'M':
                            pCmp1 = sCSS1_UNIT_mm;
                            nScale1 = (72.*20.)/25.4; // twip
                            break;
                        case 'p':
                        case 'P':
                            pCmp1 = sCSS1_UNIT_pt;
                            nScale1 = 20.; // twip

                            pCmp2 = sCSS1_UNIT_pc;
                            nScale2 = 12.*20.; // twip

                            pCmp3 = sCSS1_UNIT_px;
                            nToken3 = CSS1_PIXLENGTH;
                            break;
                        }

                        double nScale;
                        DBG_ASSERT( pCmp1, "Wo kommt das erste Zeichen her?" );
                        if( aIdent.EqualsIgnoreCaseAscii(pCmp1) )
                        {
                            nScale = nScale1;
                            nRet = nToken1;
                        }
                        else if( pCmp2 &&
                                 aIdent.EqualsIgnoreCaseAscii(pCmp2) )
                        {
                            nScale = nScale2;
                            nRet = nToken2;
                        }
                        else if( pCmp3 &&
                                 aIdent.EqualsIgnoreCaseAscii(pCmp3) )
                        {
                            nScale = nScale3;
                            nRet = nToken3;
                        }
                        else
                        {
                            nRet = CSS1_NUMBER;
                        }

                        if( CSS1_LENGTH==nRet && nScale!=1. )
                            nValue *= nScale;

                        if( nRet == CSS1_NUMBER )
                        {
                            nInPos = nInPosSave;
                            cNextCh = cNextChSave;
                            nlLineNr = nlLineNrSave;
                            nlLinePos = nlLinePosSave;
                            bEOF = bEOFSave;
                        }
                        else
                        {
                            bWhiteSpace = FALSE;
                        }
                        bNextCh = FALSE;
                    }
                    break;
                default: // NUMBER IDENT
                    bNextCh = FALSE;
                    nRet = CSS1_NUMBER;
                    break;
                }
            }
            break;

        case ':': // ':'
            // link/visited/active abfangen !!!
            nRet = CSS1_COLON;
            break;

        case '.': // DOT_W_WS | DOT_WO_WS
            nRet = bPrevWhiteSpace ? CSS1_DOT_W_WS : CSS1_DOT_WO_WS;
            break;

        // case '/': siehe oben

        case '+': // '+'
            nRet = CSS1_PLUS;
            break;

        case '-': // '-'
            nRet = CSS1_MINUS;
            break;

        case '{': // '{'
            nRet = CSS1_OBRACE;
            break;

        case '}': // '}'
            nRet = CSS1_CBRACE;
            break;

        case ';': // ';'
            nRet = CSS1_SEMICOLON;
            break;

        case ',': // ','
            nRet = CSS1_COMMA;
            break;

        case '#': // '#'
            cNextCh = GetNextChar();
            if( ('0'<=cNextCh && '9'>=cNextCh) ||
                ('a'<=cNextCh && 'f'>=cNextCh) ||
                ('A'<=cNextCh && 'F'>=cNextCh) )
            {
                // die aktuelle Position retten
                xub_StrLen nInPosSave = nInPos;
                sal_Unicode cNextChSave = cNextCh;
                ULONG nlLineNrSave = nlLineNr;
                ULONG nlLinePosSave = nlLinePos;
                BOOL bEOFSave = bEOF;

                // erstmal versuchen eine Hex-Zahl zu scannen
                ::rtl::OUStringBuffer sTmpBuffer( 6L );
                do {
                    sTmpBuffer.append( cNextCh );
                    cNextCh = GetNextChar();
                } while( sTmpBuffer.getLength() < 7 &&
                         ( ('0'<=cNextCh && '9'>=cNextCh) ||
                           ('A'<=cNextCh && 'F'>=cNextCh) ||
                           ('a'<=cNextCh && 'f'>=cNextCh) ) &&
                         !IsEOF() );

                if( sTmpBuffer.getLength()==6 || sTmpBuffer.getLength()==3 )
                {
                    // wir haben eine hexadezimale Farbe gefunden
                    aToken += String(sTmpBuffer.makeStringAndClear());
                    nRet = CSS1_HEXCOLOR;
                    bNextCh = FALSE;

                    break;
                }

                // sonst versuchen wir es mit einer Zahl
                nInPos = nInPosSave;
                cNextCh = cNextChSave;
                nlLineNr = nlLineNrSave;
                nlLinePos = nlLinePosSave;
                bEOF = bEOFSave;
            }

            nRet = CSS1_HASH;
            bNextCh = FALSE;
            break;

        case ' ':
        case '\t':
        case '\r':
        case '\n': // White-Space
            bWhiteSpace = TRUE;
            break;

        case (sal_Unicode)EOF:
            if( IsEOF() )
            {
                eState = CSS1_PAR_ACCEPTED;
                bNextCh = FALSE;
                break;
            }
            // kein break;

        default: // IDENT | syntax error
            // TODO IsAlpha
            if( ('A' <= cNextCh && cNextCh <= 'Z') ||
                ('a' <= cNextCh && cNextCh <= 'z') )
            {
                // IDENT

                BOOL bHexColor = TRUE;

                // den naechsten Identifer scannen
                ::rtl::OUStringBuffer sTmpBuffer( 64L );
                do {
                    sTmpBuffer.append( cNextCh );
                    if( bHexColor )
                    {
                        bHexColor =  sTmpBuffer.getLength()<7 &&
                                     ( ('0'<=cNextCh && '9'>=cNextCh) ||
                                       ('A'<=cNextCh && 'F'>=cNextCh) ||
                                       ('a'<=cNextCh && 'f'>=cNextCh) );
                    }
                    cNextCh = GetNextChar();
                    // TODO: AlphaNumeric
                } while( ( ('0'<=cNextCh && '9'>=cNextCh) ||
                           ('A'<=cNextCh && 'Z'>=cNextCh) ||
                           ('a'<=cNextCh && 'z'>=cNextCh) ||
                           '-'==cNextCh ) &&
                         !IsEOF() );

                aToken += String(sTmpBuffer.makeStringAndClear());

                if( bHexColor && sTmpBuffer.getLength()==6 )
                {
                    bNextCh = FALSE;
                    nRet = CSS1_HEXCOLOR;

                    break;
                }
                if( '('==cNextCh &&
                    ( (('u'==aToken.GetChar(0) || 'U'==aToken.GetChar(0)) &&
                       aToken.EqualsIgnoreCaseAscii(sCSS1_url)) ||
                      (('r'==aToken.GetChar(0) || 'R'==aToken.GetChar(0)) &&
                       aToken.EqualsIgnoreCaseAscii(sCSS1_rgb)) ) )
                {
                    USHORT nNestCnt = 0;
                    ::rtl::OUStringBuffer sTmpBuffer( 64L );
                    do {
                        sTmpBuffer.append( cNextCh );
                        switch( cNextCh )
                        {
                        case '(':   nNestCnt++; break;
                        case ')':   nNestCnt--; break;
                        }
                        cNextCh = GetNextChar();
                    } while( (nNestCnt>1 || ')'!=cNextCh) && !IsEOF() );
                    sTmpBuffer.append( cNextCh );
                    aToken += String(sTmpBuffer.makeStringAndClear());
                    bNextCh = TRUE;
                    nRet = 'u'==aToken.GetChar(0) || 'U'==aToken.GetChar(0)
                                ? CSS1_URL
                                : CSS1_RGB;
                }
                else
                {
                    bNextCh = FALSE;
                    nRet = CSS1_IDENT;
                }
            }
            // Fehlerbehandlung: Zeichen ignorieren
            break;
        }
        if( bNextCh )
            cNextCh = GetNextChar();

    } while( CSS1_NULL==nRet && IsParserWorking() );

    return nRet;
}


/*  */


// Dies folegenden Funktionen realisieren den in
//
//      http://www.w3.orh/pub/WWW/TR/WD-css1.html
// bzw. http://www.w3.orh/pub/WWW/TR/WD-css1-960220.html
//
// beschriebenen Parser fuer CSS1. Es handelt sich um eine direkte
// Umsetzung der dort beschriebenen Grammatik

// stylesheet
//  : import* rule*
//
// import
//  : IMPORT_SYM url
//
// url
//  : STRING
//
void CSS1Parser::ParseStyleSheet()
{
    LOOP_CHECK_DECL

    // import*
    BOOL bDone = FALSE;
    while( !bDone && IsParserWorking() )
    {
        LOOP_CHECK_CHECK( "Endlos-Schleife in ParseStyleSheet()/import *" )

        switch( nToken )
        {
        case CSS1_IMPORT_SYM:
            // IMPORT_SYM url
            // url ueberspringen wir ungeprueft
            nToken = GetNextToken();
            break;
        case CSS1_IDENT:            // Look-Aheads
        case CSS1_DOT_W_WS:
        case CSS1_HASH:
// /Feature: PrintExt
        case CSS1_PAGE_SYM:
// /Feature: PrintExt
            // rule
            bDone = TRUE;
            break;
        default:
            // Fehlerbehandlung: ueberlesen
            break;
        }

        if( !bDone )
            nToken = GetNextToken();
    }

    LOOP_CHECK_RESTART

    // rule *
    while( IsParserWorking() )
    {
        LOOP_CHECK_CHECK( "Endlos-Schleife in ParseStyleSheet()/rule *" )

        switch( nToken )
        {
        case CSS1_IDENT:        // Look-Aheads
        case CSS1_DOT_W_WS:
        case CSS1_HASH:
// /Feature: PrintExt
        case CSS1_PAGE_SYM:
// /Feature: PrintExt
            // rule
            ParseRule();
            break;
        default:
            // Fehlerbehandlung: ueberlesen
            nToken = GetNextToken();
            break;
        }
    }
}

// rule
//  : selector [ ',' selector ]*
//    '{' declaration [ ';' declaration ]* '}'
//
void CSS1Parser::ParseRule()
{
    // selector
    CSS1Selector *pSelector = ParseSelector();
    if( !pSelector )
        return;

    // Selektor verarbeiten
    if( SelectorParsed( pSelector, TRUE ) )
        delete pSelector;

    LOOP_CHECK_DECL

    // [ ',' selector ]*
    while( CSS1_COMMA==nToken && IsParserWorking() )
    {
        LOOP_CHECK_CHECK( "Endlos-Schleife in ParseRule()/selector *" )

        // ',' ueberelesen
        nToken = GetNextToken();

        // selector
        pSelector = ParseSelector();
        if( !pSelector )
            return;

        // Selektor verarbeiten
        if( SelectorParsed( pSelector, FALSE ) )
            delete pSelector;
    }

    // '{'
    if( CSS1_OBRACE != nToken )
        return;
    nToken = GetNextToken();

    // declaration
    String aProperty;
    CSS1Expression *pExpr = ParseDeclaration( aProperty );
    if( !pExpr )
        return;

    // expression verarbeiten
    if( DeclarationParsed( aProperty, pExpr ) )
        delete pExpr;

    LOOP_CHECK_RESTART

    // [ ';' declaration ]*
    while( CSS1_SEMICOLON==nToken && IsParserWorking() )
    {
        LOOP_CHECK_CHECK( "Endlos-Schleife in ParseRule()/declaration *" )

        // ';'
        nToken = GetNextToken();

        // declaration
        if( CSS1_IDENT == nToken )
        {
            CSS1Expression *pExpr = ParseDeclaration( aProperty );
            if( pExpr )
            {
                // expression verarbeiten
                if( DeclarationParsed( aProperty, pExpr ) )
                    delete pExpr;
            }
        }
    }

    // '}'
    if( CSS1_CBRACE == nToken )
        nToken = GetNextToken();
}

// selector
//  : simple_selector+ [ ':' pseudo_element ]?
//
// simple_selector
//  : element_name [ DOT_WO_WS class ]?
//  | DOT_W_WS class
//  | id_selector
//
// element_name
//  : IDENT
//
// class
//  : IDENT
//
// id_selector
//  : '#' IDENT
//
// pseude_element
//  : IDENT
//
CSS1Selector *CSS1Parser::ParseSelector()
{
    CSS1Selector *pRoot = 0, *pLast = 0;

    BOOL bDone = FALSE;
    CSS1Selector *pNew = 0;

    LOOP_CHECK_DECL

    // simple_selector+
    while( !bDone && IsParserWorking() )
    {
        LOOP_CHECK_CHECK( "Endlos-Schleife in ParseSelector()" )

        BOOL bNextToken = TRUE;

        switch( nToken )
        {
        case CSS1_IDENT:
            {
                // element_name [ DOT_WO_WS class ]?

                // element_name
                String aElement = aToken;
                CSS1SelectorType eType = CSS1_SELTYPE_ELEMENT;
                nToken = GetNextToken();

                if( CSS1_DOT_WO_WS == nToken )
                {
                    // DOT_WO_WS
                    nToken = GetNextToken();

                    // class
                    if( CSS1_IDENT == nToken )
                    {
                        (aElement += '.') += aToken;
                        eType = CSS1_SELTYPE_ELEM_CLASS;
                    }
                    else
                    {
                        // class fehlt
                        return pRoot;
                    }
                }
                else
                {
                    // das war jetzt ein Look-Ahead
                    bNextToken = FALSE;
                }
                pNew = new CSS1Selector( eType, aElement );
            }
            break;
        case CSS1_DOT_W_WS:
            // DOT_W_WS class

            // DOT_W_WS
            nToken = GetNextToken();

            if( CSS1_IDENT==nToken )
            {
                // class
                pNew = new CSS1Selector( CSS1_SELTYPE_CLASS, aToken );
            }
            else
            {
                // class fehlt
                return pRoot;
            }
            break;
        case CSS1_HASH:
            // '#' id_selector

            // '#'
            nToken = GetNextToken();

            if( CSS1_IDENT==nToken )
            {
                // id_selector
                pNew = new CSS1Selector( CSS1_SELTYPE_ID, aToken );
            }
            else
            {
                // id_selector fehlt
                return pRoot;
            }
            break;

// /Feature: PrintExt
        case CSS1_PAGE_SYM:
            {
                //  @page
                pNew = new CSS1Selector( CSS1_SELTYPE_PAGE, aToken );
            }
            break;
// /Feature: PrintExt

        default:
            // wir wissen nicht was kommt, also aufhoehren
            bDone = TRUE;
            break;
        }

        // falls ein Selektor angelegt wurd, ihn speichern
        if( pNew )
        {
            DBG_ASSERT( (pRoot!=0) == (pLast!=0),
                    "Root-Selektor, aber kein Last" );
            if( pLast )
                pLast->SetNext( pNew );
            else
                pRoot = pNew;

            pLast = pNew;
            pNew = 0;
        }

        if( bNextToken && !bDone )
            nToken = GetNextToken();
    }

    if( !pRoot )
    {
        // simple_selector fehlt
        return pRoot;
    }

    // [ ':' pseudo_element ]?
    if( CSS1_COLON==nToken && IsParserWorking() )
    {
        // ':' pseudo element
        nToken = GetNextToken();
        if( CSS1_IDENT==nToken )
        {
            pLast->SetNext( new CSS1Selector(CSS1_SELTYPE_PSEUDO,aToken) );
            nToken = GetNextToken();
        }
        else
        {
            // pseudo_element fehlt
            return pRoot;
        }
    }

    return pRoot;
}

// declaration
//  : property ':' expr prio?
//  | /* empty */
//
// expression
//  : term [ operator term ]*
//
// term
//  : unary_operator?
//     [ NUMBER | STRING | PERCENTAGE | LENGTH | EMS | EXS | IDENT |
//       HEXCOLOR | URL | RGB ]
//
// operator
//  : '/' | ',' | /* empty */
//
// unary_operator
//  : '-' | '+'
//
// property
//  : ident
//
// das Vorzeichen wird nur fuer numerische Werte (ausser PERCENTAGE)
// beruecksichtigt und wird auf nValue angewendet!
CSS1Expression *CSS1Parser::ParseDeclaration( String& rProperty )
{
    CSS1Expression *pRoot = 0, *pLast = 0;

    // property
    if( CSS1_IDENT != nToken )
    {
        // property fehlt
        return pRoot;
    }
    rProperty = aToken;

    nToken = GetNextToken();


    // ':'
    if( CSS1_COLON != nToken )
    {
        // ':' fehlt
        return pRoot;
    }
    nToken = GetNextToken();

    // term [operator term]*
    // hier sind wir sehr lax, was die Syntax angeht, sollte aber kein
    // Problem sein
    BOOL bDone = FALSE;
    sal_Unicode cSign = 0, cOp = 0;
    CSS1Expression *pNew = 0;

    LOOP_CHECK_DECL

    while( !bDone && IsParserWorking() )
    {
        LOOP_CHECK_CHECK( "Endlos-Schleife in ParseDeclaration()" )

        switch( nToken )
        {
        case CSS1_MINUS:
            cSign = '-';
            break;

        case CSS1_PLUS:
            cSign = '+';
            break;

        case CSS1_NUMBER:
        case CSS1_LENGTH:
        case CSS1_PIXLENGTH:
        case CSS1_EMS:
        case CSS1_EMX:
            if( '-'==cSign )
                nValue = -nValue;
        case CSS1_STRING:
        case CSS1_PERCENTAGE:
        case CSS1_IDENT:
        case CSS1_URL:
        case CSS1_RGB:
        case CSS1_HEXCOLOR:
            pNew = new CSS1Expression( nToken, aToken, nValue, cOp );
            nValue = 0; // sonst landet das auch im naechsten Ident
            cSign = 0;
            cOp = 0;
            break;

        case CSS1_SLASH:
            cOp = '/';
            cSign = 0;
            break;

        case CSS1_COMMA:
            cOp = ',';
            cSign = 0;
            break;

        default:
            bDone = TRUE;
            break;
        }

        // falls ein Expression angelegt wurde, diesen speichern
        if( pNew )
        {
            DBG_ASSERT( (pRoot!=0) == (pLast!=0),
                    "Root-Selektor, aber kein Last" );
            if( pLast )
                pLast->SetNext( pNew );
            else
                pRoot = pNew;

            pLast = pNew;
            pNew = 0;
        }

        if( !bDone )
            nToken = GetNextToken();
    }

    if( !pRoot )
    {
        // term fehlt
        return pRoot;
    }

    // prio?
    if( CSS1_IMPORTANT_SYM==nToken )
    {
        // IMPORTANT_SYM
        nToken = GetNextToken();
    }

    return pRoot;
}

/*  */

CSS1Parser::CSS1Parser()
{
}

CSS1Parser::~CSS1Parser()
{
}

/*  */

BOOL CSS1Parser::ParseStyleSheet( const String& rIn )
{
    String aTmp( rIn );

    sal_Unicode c;
    while( aTmp.Len() &&
           ( ' '==(c=aTmp.GetChar(0)) || '\t'==c || '\r'==c || '\n'==c ) )
        aTmp.Erase( 0, 1 );

    while( aTmp.Len() && ( ' '==(c=aTmp.GetChar( aTmp.Len()-1))
           || '\t'==c || '\r'==c || '\n'==c ) )
        aTmp.Erase( aTmp.Len()-1 );

    // SGML-Kommentare entfernen
    if( aTmp.Len() >= 4 &&
        aTmp.CompareToAscii("<!--",4) == COMPARE_EQUAL )
        aTmp.Erase( 0, 4 );

    if( aTmp.Len() >=3 &&
        aTmp.Copy(aTmp.Len()-3).CompareToAscii("-->") == COMPARE_EQUAL )
        aTmp.Erase( aTmp.Len()-3 );

    if( !aTmp.Len() )
        return TRUE;

    InitRead( aTmp );

    ParseStyleSheet();

    return TRUE;
}


BOOL CSS1Parser::ParseStyleOption( const String& rIn )
{
    if( !rIn.Len() )
        return TRUE;

    InitRead( rIn );

    String aProperty;
    CSS1Expression *pExpr = ParseDeclaration( aProperty );
    if( !pExpr )
    {
        return FALSE;
    }

    // expression verarbeiten
    if( DeclarationParsed( aProperty, pExpr ) )
        delete pExpr;

    LOOP_CHECK_DECL

    // [ ';' declaration ]*
    while( CSS1_SEMICOLON==nToken && IsParserWorking() )
    {
        LOOP_CHECK_CHECK( "Endlos-Schleife in ParseStyleOption()" )

        nToken = GetNextToken();
        if( CSS1_IDENT==nToken )
        {
            CSS1Expression *pExpr = ParseDeclaration( aProperty );
            if( pExpr )
            {
                // expression verarbeiten
                if( DeclarationParsed( aProperty, pExpr ) )
                    delete pExpr;
            }
        }
    }

    return TRUE;
}

BOOL CSS1Parser::SelectorParsed( const CSS1Selector *pSelector, BOOL bFirst )
{
    // Selektor loeschen
    return TRUE;
}

BOOL CSS1Parser::DeclarationParsed( const String& rProperty,
                                    const CSS1Expression *pExpr )
{
    // Deklaration loeschen
    return TRUE;
}


/*  */

CSS1Selector::~CSS1Selector()
{
    delete pNext;
}

/*  */

CSS1Expression::~CSS1Expression()
{
    delete pNext;
}

BOOL CSS1Expression::GetURL( String& rURL  ) const
{
    DBG_ASSERT( CSS1_URL==eType, "CSS1-Ausruck ist keine Farbe URL" );

    DBG_ASSERT( aValue.CompareIgnoreCaseToAscii( sCSS1_url, 3 ) ==
                                        COMPARE_EQUAL &&
                aValue.Len() > 5 &&
                '(' == aValue.GetChar(3) &&
                ')' == aValue.GetChar(aValue.Len()-1),
                "keine gueltiges URL(...)" );

    BOOL bRet = FALSE;

    if( aValue.Len() > 5 )
    {
        rURL = aValue.Copy( 4, aValue.Len()-5 );
        rURL.EraseTrailingChars();
        rURL.EraseLeadingChars();
        bRet = TRUE;
    }

    return bRet;
}

BOOL CSS1Expression::GetColor( Color &rColor ) const
{
    DBG_ASSERT( CSS1_IDENT==eType || CSS1_RGB==eType ||
                CSS1_HEXCOLOR==eType || CSS1_STRING==eType,
                "CSS1-Ausruck kann keine Farbe sein" );

    BOOL bRet = FALSE;
    ULONG nColor = ULONG_MAX;

    switch( eType )
    {
    case CSS1_RGB:
        {
            BYTE aColors[3] = { 0, 0, 0 };

            DBG_ASSERT( aValue.CompareIgnoreCaseToAscii( sCSS1_rgb, 3 )
                                            == COMPARE_EQUAL &&
                        aValue.Len() > 5 &&
                        '(' == aValue.GetChar( 3 ) &&
                        ')' == aValue.GetChar( aValue.Len()-1),
                        "keine gueltiges RGB(...)" );

            String aColorStr( aValue.Copy( 4, aValue.Len()-1 ) );

            xub_StrLen nPos = 0;
            USHORT nColor = 0;

            while( nColor<3 && nPos<aColorStr.Len() )
            {
                register sal_Unicode c;
                while( nPos < aColorStr.Len() &&
                        ((c=aColorStr.GetChar(nPos)) == ' ' || c == '\t' ||
                        c == '\n' || c== '\r' ) )
                    nPos++;

                xub_StrLen nEnd = aColorStr.Search( ',', nPos );
                String aNumber;
                if( STRING_NOTFOUND==nEnd )
                {
                    aNumber = aColorStr.Copy(nPos);
                    nPos = aColorStr.Len();
                }
                else
                {
                    aNumber = aColorStr.Copy( nPos, nEnd-nPos );
                    nPos = nEnd+1;
                }

                USHORT nNumber = (USHORT)aNumber.ToInt32();
                if( aNumber.Search('%') != STRING_NOTFOUND )
                {
                    if( nNumber > 100 )
                        nNumber = 100;
                    nNumber *= 255;
                    nNumber /= 100;
                }
                else if( nNumber > 255 )
                    nNumber = 255;

                aColors[nColor] = (BYTE)nNumber;
                nColor ++;
            }

            rColor.SetRed( aColors[0] );
            rColor.SetGreen( aColors[1] );
            rColor.SetBlue( aColors[2] );

            bRet = TRUE;    // etwas anderes als eine Farbe kann es nicht sein
        }
        break;

    case CSS1_IDENT:
    case CSS1_STRING:
        {
            String aTmp( aValue );
            aTmp.ToUpperAscii();
            nColor = GetHTMLColor( aTmp );
            bRet = nColor != ULONG_MAX;
        }
        if( bRet || CSS1_STRING != eType || !aValue.Len() ||
            aValue.GetChar( 0 )!='#' )
            break;

    case CSS1_HEXCOLOR:
        {
            // HACK fuer MS-IE: DIe Farbe kann auch in einem String stehen
            xub_StrLen nOffset = CSS1_STRING==eType ? 1 : 0;
            BOOL bDouble = aValue.Len()-nOffset == 3;
            xub_StrLen i = nOffset, nEnd = (bDouble ? 3 : 6) + nOffset;

            nColor = 0;
            for( ; i<nEnd; i++ )
            {
                register sal_Unicode c = (i<aValue.Len() ? aValue.GetChar(i)
                                                         : '0' );
                if( c >= '0' && c <= '9' )
                    c -= 48;
                else if( c >= 'A' && c <= 'F' )
                    c -= 55;
                else if( c >= 'a' && c <= 'f' )
                    c -= 87;
                else
                    c = 16;

                nColor *= 16;
                if( c<16 )
                    nColor += c;
                if( bDouble )
                {
                    nColor *= 16;
                    if( c<16 )
                        nColor += c;
                }
            }
            // bRet = i==6;
            bRet = TRUE;
        }
        break;
    }


    if( bRet && nColor!=ULONG_MAX )
    {
        rColor.SetRed( (BYTE)((nColor & 0x00ff0000UL) >> 16) );
        rColor.SetGreen( (BYTE)((nColor & 0x0000ff00UL) >> 8) );
        rColor.SetBlue( (BYTE)(nColor & 0x000000ffUL) );
    }

    return bRet;
}

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/html/parcss1.cxx,v 1.1.1.1 2000-09-18 17:14:56 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.35  2000/09/18 16:04:47  willem.vandorp
      OpenOffice header added.

      Revision 1.34  2000/06/16 13:01:33  os
      Unicode error corrected

      Revision 1.33  2000/04/10 12:20:57  mib
      unicode

      Revision 1.32  2000/02/11 14:37:36  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.31  1999/04/19 10:46:32  MIB
      #64963#: EOF beim Zurueckseeken loeschen


      Rev 1.30   19 Apr 1999 12:46:32   MIB
   #64963#: EOF beim Zurueckseeken loeschen

      Rev 1.29   20 Feb 1998 19:02:20   MA
   header

      Rev 1.28   26 Nov 1997 19:09:48   MA
   includes

      Rev 1.27   03 Nov 1997 14:08:50   MA
   precomp entfernt

      Rev 1.26   10 Oct 1997 10:14:36   MIB
   CSS1-Printing-Ext: @page,page-break-before/after (noch kein left/right)

      Rev 1.25   19 Sep 1997 13:57:54   MIB
   unbekannte @-Bloecke werden jetzt ueberlesen

      Rev 1.24   29 Aug 1997 13:32:22   JP
   VCL Color Anpassung

      Rev 1.23   15 Jul 1997 16:52:24   MIB
   fix: Auch 3-stellige Farben erlauben (fuer www.w3.org/Style

      Rev 1.22   02 Jul 1997 17:13:14   MIB
   fix: r??() nicht wie rgb() behandeln

      Rev 1.21   13 Jun 1997 17:08:12   MIB
   Ein par MS-IE Syntax-Goodies nachgebaut

      Rev 1.20   13 Jun 1997 11:58:32   MIB
   fix: .foo auch am Anfang erkennen

      Rev 1.19   07 May 1997 15:46:38   MIB
   Destruktoren nicht inline, sonst GPF unter Win16 (Warum auch immer?)

      Rev 1.18   20 Dec 1996 14:00:46   MIB
   Warnings

      Rev 1.17   28 Oct 1996 19:12:14   MIB
   Umaute in Identifiern-Erlauben, EOF-Behandlung

      Rev 1.16   23 Oct 1996 19:49:06   JP
   String Umstellung: [] -> GetChar()

      Rev 1.15   21 Oct 1996 08:57:42   MIB
   bug fix: H1.foo wurde falsch geparsed

      Rev 1.14   13 Oct 1996 12:31:26   MIB
   Argument von unbekannten @ident ueberlesen

      Rev 1.13   20 Aug 1996 16:55:40   MIB
   bug-fix: Hexzahlen muessen 6 Zeichen lang sein

      Rev 1.12   19 Aug 1996 18:11:22   MIB
   bugfix: PIXLENGTH durchlassen

      Rev 1.11   14 Aug 1996 16:22:24   MIB
   gcc und msvc: statt *aStr nicht aStr[0] sondern aStr[(USHORT)0]

      Rev 1.10   13 Aug 1996 21:08:32   sdo
   GCC

      Rev 1.9   12 Aug 1996 10:32:16   MIB
   Anpassungen an draft vom 26.7.96, Background-Property, Scannen von Farben verb.

      Rev 1.8   07 Aug 1996 13:21:46   MIB
   Import von color und text-decoration

      Rev 1.7   17 Jul 1996 10:22:50   MIB
   Loop-Check verbessert

      Rev 1.6   27 Jun 1996 16:44:16   MIB
   fix #29184#: Endlosschleife bei SGML-Kommentaren und andere Verbesserungen

      Rev 1.5   26 Jun 1996 15:24:24   MIB
   Anpassung an 324, Includes aufgeraeumt

      Rev 1.4   20 Jun 1996 12:33:26   MIB
   bug fix: Einheiten sind jetzt case-insensitiv

      Rev 1.3   17 Jun 1996 15:59:50   MIB
   Length nun in Twips, bug fixes und Erweiterungen

      Rev 1.2   16 Jun 1996 14:32:58   MIB
   Loops sicherer gemacht, Strings ausgelagert

      Rev 1.1   14 Jun 1996 20:12:56   MIB
   die erste Endlos-Schleife gefixed

      Rev 1.0   14 Jun 1996 17:42:34   MIB
   Initial revision.

*************************************************************************/

diff --git a/sw/source/filter/html/parcss1.hxx b/sw/source/filter/html/parcss1.hxx
new file mode 100644
index 0000000..b1a9c38
--- /dev/null
+++ b/sw/source/filter/html/parcss1.hxx
@@ -0,0 +1,342 @@
/*************************************************************************
 *
 *  $RCSfile: parcss1.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:56 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _PARCSS1_HXX
#define _PARCSS1_HXX

#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif

class Color;

/*  */

// Die Tokens des CSS1-Parsers
enum CSS1Token
{
    CSS1_NULL,
    CSS1_UNKOWN,

    CSS1_IDENT,
    CSS1_STRING,
    CSS1_NUMBER,
    CSS1_PERCENTAGE,
    CSS1_LENGTH,            // eine absolute Groesse in 1/100 MM
    CSS1_PIXLENGTH,         // eine Pixel-Groesse
    CSS1_EMS,
    CSS1_EMX,
    CSS1_HEXCOLOR,

    CSS1_DOT_W_WS,
    CSS1_DOT_WO_WS,
    CSS1_COLON,
    CSS1_SLASH,
    CSS1_PLUS,
    CSS1_MINUS,
    CSS1_OBRACE,
    CSS1_CBRACE,
    CSS1_SEMICOLON,
    CSS1_COMMA,
    CSS1_HASH,

    CSS1_IMPORT_SYM,
// Feature: PrintExt
    CSS1_PAGE_SYM,
// /Feature: PrintExt

    CSS1_IMPORTANT_SYM,

    CSS1_URL,
    CSS1_RGB
};


// die Zustaende des Parsers
enum CSS1ParserState
{
    CSS1_PAR_ACCEPTED = 0,
    CSS1_PAR_WORKING,
    CSS1_PAR_ERROR
};


/*  */

enum CSS1SelectorType
{
    CSS1_SELTYPE_ELEMENT,
    CSS1_SELTYPE_ELEM_CLASS,
    CSS1_SELTYPE_CLASS,
    CSS1_SELTYPE_ID,
    CSS1_SELTYPE_PSEUDO,
// Feature: PrintExt
    CSS1_SELTYPE_PAGE
// /Feature: PrintExt

};

// Die folegende Klasse beschreibt einen Simple-Selector, also
// - einen HTML-Element-Namen
// - einen HTML-Element-Namen mit Klasse (durch '.' getrennt)
// - eine Klasse (ohne Punkt)
// - eine mit ID=xxx gesetzte ID aus einem HTML-Dokument
// oder
// - ein Pseudo-Element
//
// Die Simple-Sektoren werden in einer Liste zu vollstaendigen
// Selektoren verkettet
class CSS1Selector
{
    CSS1SelectorType eType;     // Art des Selektors
    String aSelector;           // der Selektor selbst
    CSS1Selector *pNext;        // die naechste Komponente

public:

    CSS1Selector( CSS1SelectorType eTyp, const String &rSel )
        : eType(eTyp), aSelector( rSel ), pNext( 0 )
    {}

    ~CSS1Selector();

    CSS1SelectorType GetType() const { return eType; }
    const String& GetString() const { return aSelector; }

    void SetNext( CSS1Selector *pNxt ) { pNext = pNxt; }
    const CSS1Selector *GetNext() const { return pNext; }
};


/*  */

// Die folegende Klasse beschreibt einen Teil-Ausdruck einer
// CSS1-Deklaration sie besteht aus
//
// - dem Typ des Ausdrucks (entspricht dem Token)
// - dem eigentlichen Wert als String und ggf. double
//   der double-Wert enthaelt das Vorzeichen fuer NUMBER und LENGTH
// - und dem Operator, mit dem er mit dem *Vorganger*-Ausdruck
//   verknuepft ist.
//
struct CSS1Expression
{
    sal_Unicode cOp;        // Art der Verkuepfung mit dem Vorgaenger
    CSS1Token eType;        // der Typ des Wertes
    String aValue;          // und sein Wert als String
    double nValue;          // und als Zahl (TWIPs fuer LENGTH)
    CSS1Expression *pNext;  // die naechste Komponente

public:

    CSS1Expression( CSS1Token eTyp, const String &rVal,
                    double nVal, sal_Unicode cO = 0 )
        : cOp(cO), eType(eTyp), aValue(rVal), nValue(nVal), pNext(0)
    {}

    ~CSS1Expression();

    inline void Set( CSS1Token eTyp, const String &rVal, double nVal,
                     sal_Unicode cO = 0 );

    CSS1Token GetType() const { return eType; }
    const String& GetString() const { return aValue; }
    double GetNumber() const { return nValue; }
    inline sal_uInt32 GetULength() const;
    inline sal_Int32 GetSLength() const;
    sal_Unicode GetOp() const { return cOp; }


    sal_Bool GetURL( String& rURL ) const;
    sal_Bool GetColor( Color &rRGB ) const;

    void SetNext( CSS1Expression *pNxt ) { pNext = pNxt; }
    const CSS1Expression *GetNext() const { return pNext; }
};

inline void CSS1Expression::Set( CSS1Token eTyp, const String &rVal,
                                 double nVal, sal_Unicode cO )
{
    cOp = cO; eType = eTyp; aValue = rVal; nValue = nVal; pNext = 0;
}

inline sal_uInt32 CSS1Expression::GetULength() const
{
    return nValue < 0. ? 0UL : (sal_uInt32)(nValue + .5);
}

inline sal_Int32 CSS1Expression::GetSLength() const
{
    return (sal_Int32)(nValue + (nValue < 0. ? -.5 : .5 ));
}

/*  */

// Diese Klasse parst den Inhalt eines Style-Elements oder eine Style-Option
// und bereitet ihn ein wenig auf.
//
// Das Ergebnis des Parsers wird durch die Mehtoden SelectorParsed()
// und DeclarationParsed() an abgeleitete Parser uebergeben. Bsp:
//
// H1, H2 { font-weight: bold; text-align: right }
//  |  |                    |                  |
//  |  |                    |                  DeclP( 'text-align', 'right' )
//  |  |                    DeclP( 'font-weight', 'bold' )
//  |  SelP( 'H2', sal_False )
//  SelP( 'H1', sal_True )
//
class CSS1Parser
{
    sal_Bool bWhiteSpace : 1;           // White-Space gelesen?
    sal_Bool bEOF : 1;                  // Ende des "Files" ?

    sal_Unicode cNextCh;                // naechstes Zeichen

    xub_StrLen nInPos;                  // aktuelle Position im Input-String

    sal_uInt32 nlLineNr;                    // akt. Zeilen Nummer
    sal_uInt32 nlLinePos;               // akt. Spalten Nummer

    double nValue;                  // der Wert des Tokens als Zahl

    CSS1ParserState eState;         // der akteulle Zustand der Parsers
    CSS1Token nToken;               // das aktuelle Token

    String aIn;                     // der zu parsende String
    String aToken;                  // das Token als String

    // Parsen vorbereiten
    void InitRead( const String& rIn );

    // das naechste Zeichen holen
    sal_Unicode GetNextChar();

    // das naechste Token holen
    CSS1Token GetNextToken();

    // arbeitet der Parser noch?
    sal_Bool IsParserWorking() const { return CSS1_PAR_WORKING == eState; }

    sal_Bool IsEOF() const { return bEOF; }

    sal_uInt32 IncLineNr() { return ++nlLineNr; }
    sal_uInt32 IncLinePos() { return ++nlLinePos; }
    inline sal_uInt32 SetLineNr( sal_uInt32 nlNum );            // inline unten
    inline sal_uInt32 SetLinePos( sal_uInt32 nlPos );           // inline unten

    // Parsen von Teilen der Grammatik
    void ParseStyleSheet();
    void ParseRule();
    CSS1Selector *ParseSelector();
    CSS1Expression *ParseDeclaration( String& rProperty );

protected:

    // Den Inhalt eines HTML-Style-Elements parsen.
    // Fuer jeden Selektor und jede Deklaration wird
    // SelectorParsed() bzw. DeclarationParsed() aufgerufen.
    sal_Bool ParseStyleSheet( const String& rIn );

    // Den Inhalt einer HTML-Style-Option parsen.
    // Fr jede Deklaration wird DeclarationParsed() aufgerufen.
    sal_Bool ParseStyleOption( const String& rIn );

    // Diese Methode wird aufgerufen, wenn ein Selektor geparsed wurde
    // Wenn 'bFirst' gesetzt ist, beginnt mit dem Selektor eine neue
    // Deklaration. Wird sal_True zurueckgegeben, wird der Selektor
    // geloscht, sonst nicht.
    // Die Implementierung dieser Methode gibt nur sal_True zuruck.
    virtual sal_Bool SelectorParsed( const CSS1Selector *pSelector,
                                 sal_Bool bFirst );

    // Diese Methode wird fuer jede geparsete Property aufgerufen. Wird
    // sal_True zurueckgegeben wird der Selektor geloscht, sonst nicht.
    // Die Implementierung dieser Methode gibt nur sal_True zuruck.
    virtual sal_Bool DeclarationParsed( const String& rProperty,
                                    const CSS1Expression *pExpr );

public:

    CSS1Parser();
    virtual ~CSS1Parser();

    inline sal_uInt32   GetLineNr() const       { return nlLineNr; }
    inline sal_uInt32   GetLinePos() const      { return nlLinePos; }
};

inline sal_uInt32 CSS1Parser::SetLineNr( sal_uInt32 nlNum )
{
    sal_uInt32 nlOld = nlLineNr;
    nlLineNr = nlNum;
    return nlOld;
}

inline sal_uInt32 CSS1Parser::SetLinePos( sal_uInt32 nlPos )
{
    sal_uInt32 nlOld = nlLinePos;
    nlLinePos = nlPos;
    return nlOld;
}


#endif


diff --git a/sw/source/filter/html/svxcss1.cxx b/sw/source/filter/html/svxcss1.cxx
new file mode 100644
index 0000000..015925e
--- /dev/null
+++ b/sw/source/filter/html/svxcss1.cxx
@@ -0,0 +1,3378 @@
/*************************************************************************
 *
 *  $RCSfile: svxcss1.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:56 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#include <stdlib.h>

#ifndef _SVX_SVXIDS_HRC
#include <svx/svxids.hrc>
#endif

#ifndef _HINTIDS_HXX
#define ITEMID_BOXINFO      SID_ATTR_BORDER_INNER
#define ITEMID_FONT         SID_ATTR_CHAR_FONT
#define ITEMID_POSTURE      SID_ATTR_CHAR_POSTURE
#define ITEMID_WEIGHT       SID_ATTR_CHAR_WEIGHT
#define ITEMID_FONTHEIGHT   SID_ATTR_CHAR_FONTHEIGHT
#define ITEMID_UNDERLINE    SID_ATTR_CHAR_UNDERLINE
#define ITEMID_CROSSEDOUT   SID_ATTR_CHAR_STRIKEOUT
#define ITEMID_COLOR        SID_ATTR_CHAR_COLOR
#define ITEMID_KERNING      SID_ATTR_CHAR_KERNING
#define ITEMID_CASEMAP      SID_ATTR_CHAR_CASEMAP
#define ITEMID_BLINK        SID_ATTR_FLASH

#define ITEMID_LINESPACING  SID_ATTR_PARA_LINESPACE
#define ITEMID_ADJUST       SID_ATTR_PARA_ADJUST
#define ITEMID_WIDOWS       SID_ATTR_PARA_WIDOWS
#define ITEMID_ORPHANS      SID_ATTR_PARA_ORPHANS
#define ITEMID_FMTSPLIT     SID_ATTR_PARA_SPLIT

#define ITEMID_LRSPACE SID_ATTR_LRSPACE
#define ITEMID_ULSPACE SID_ATTR_ULSPACE
#define ITEMID_BOX SID_ATTR_BORDER_OUTER
#define ITEMID_BRUSH SID_ATTR_BRUSH
#endif

#ifndef _CTRLTOOL_HXX
#include <svtools/ctrltool.hxx>
#endif

#ifndef _SVX_UDLNITEM_HXX //autogen
#include <svx/udlnitem.hxx>
#endif
#ifndef _SVX_ADJITEM_HXX //autogen
#include <svx/adjitem.hxx>
#endif
#ifndef _SVX_BLNKITEM_HXX //autogen
#include <svx/blnkitem.hxx>
#endif
#ifndef _SVX_CRSDITEM_HXX //autogen
#include <svx/crsditem.hxx>
#endif
#ifndef _SVX_KERNITEM_HXX //autogen
#include <svx/kernitem.hxx>
#endif
#ifndef _SVX_LSPCITEM_HXX //autogen
#include <svx/lspcitem.hxx>
#endif
#ifndef _SVX_FONTITEM_HXX //autogen
#include <svx/fontitem.hxx>
#endif
#ifndef _SVX_POSTITEM_HXX //autogen
#include <svx/postitem.hxx>
#endif
#ifndef _SVX_COLRITEM_HXX //autogen
#include <svx/colritem.hxx>
#endif
#ifndef _SVX_CMAPITEM_HXX //autogen
#include <svx/cmapitem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _SVX_WGHTITEM_HXX //autogen
#include <svx/wghtitem.hxx>
#endif
#ifndef _SVX_FHGTITEM_HXX //autogen
#include <svx/fhgtitem.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SFXITEMPOOL_HXX //autogen
#include <svtools/itempool.hxx>
#endif
#ifndef _SVX_SPLTITEM_HXX //autogen
#include <svx/spltitem.hxx>
#endif
#ifndef _SVX_WIDWITEM_HXX //autogen
#include <svx/widwitem.hxx>
#endif
#ifndef _SVX_ORPHITEM_HXX //autogen
#include <svx/orphitem.hxx>
#endif
#ifndef _URLOBJ_HXX //autogen
#include <tools/urlobj.hxx>
#endif
#ifndef _SVPARSER_HXX //autogen
#include <svtools/svparser.hxx>
#endif
#ifndef _SV_SVAPP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _SV_WRKWIN_HXX //autogen
#include <vcl/wrkwin.hxx>
#endif

#include "css1kywd.hxx"
#include "svxcss1.hxx"

// die Funktionen zum Parsen einer CSS1-Property sind von folgendem Typ:
typedef void (*FnParseCSS1Prop)( const CSS1Expression *pExpr,
                                 SfxItemSet& rItemSet,
                                 SvxCSS1PropertyInfo& rPropInfo,
                                 const SvxCSS1Parser& rParser );

SV_IMPL_PTRARR( CSS1Selectors, CSS1Selector* )


/*  */

static CSS1PropertyEnum __READONLY_DATA aFontSizeTable[] =
{
    { sCSS1_PV_xx_small,    0                   },
    { sCSS1_PV_x_small,     1                   },
    { sCSS1_PV_small,       2                   },
    { sCSS1_PV_medium,      3                   },
    { sCSS1_PV_large,       4                   },
    { sCSS1_PV_x_large,     5                   },
    { sCSS1_PV_xx_large,    6                   },
    { 0,                    0                   }
};

static CSS1PropertyEnum __READONLY_DATA aFontFamilyTable[] =
{
    { sCSS1_PV_serif,       FAMILY_ROMAN        },
    { sCSS1_PV_sans_serif,  FAMILY_SWISS        },
    { sCSS1_PV_cursive,     FAMILY_SCRIPT       },
    { sCSS1_PV_fantasy,     FAMILY_DECORATIVE   },
    { sCSS1_PV_monospace,   FAMILY_MODERN       },
    { 0,                    0                   }
};

static CSS1PropertyEnum __READONLY_DATA aFontWeightTable[] =
{
    { sCSS1_PV_extra_light, WEIGHT_NORMAL       }, // WEIGHT_ULTRALIGHT (OBS)
    { sCSS1_PV_light,       WEIGHT_NORMAL       }, // WEIGHT_LIGHT (OBSOLETE)
    { sCSS1_PV_demi_light,  WEIGHT_NORMAL       }, // WEIGHT_SEMILIGHT (OBS)
    { sCSS1_PV_medium,      WEIGHT_NORMAL       }, // WEIGHT_MEDIUM (OBS)
    { sCSS1_PV_normal,      WEIGHT_NORMAL       }, // WEIGHT_MEDIUM
    { sCSS1_PV_demi_bold,   WEIGHT_NORMAL       }, // WEIGHT_SEMIBOLD (OBS)
    { sCSS1_PV_bold,        WEIGHT_BOLD         }, // WEIGHT_BOLD (OBSOLETE)
    { sCSS1_PV_extra_bold,  WEIGHT_BOLD         }, // WEIGHT_ULTRABOLD (OBS)
    { sCSS1_PV_bolder,      WEIGHT_BOLD         },
    { sCSS1_PV_lighter,     WEIGHT_NORMAL       },
    { 0,                    0                   }
};

static CSS1PropertyEnum __READONLY_DATA aFontStyleTable[] =
{
    { sCSS1_PV_normal,      ITALIC_NONE         },
    { sCSS1_PV_italic,      ITALIC_NORMAL       },
    { sCSS1_PV_oblique,     ITALIC_NORMAL       },
    { 0,                    0                   }
};

static CSS1PropertyEnum __READONLY_DATA aFontVariantTable[] =
{
    { sCSS1_PV_normal,      SVX_CASEMAP_NOT_MAPPED      },
    { sCSS1_PV_small_caps,  SVX_CASEMAP_KAPITAELCHEN    },
    { 0,                    0                   }
};

/*  */

static CSS1PropertyEnum __READONLY_DATA aBGRepeatTable[] =
{
    { sCSS1_PV_repeat,      GPOS_TILED                  },
    { sCSS1_PV_repeat_x,    GPOS_TILED                  },
    { sCSS1_PV_repeat_y,    GPOS_TILED                  },
    { sCSS1_PV_no_repeat,   GPOS_NONE                   },
    { 0,                    0                           }
};

static CSS1PropertyEnum __READONLY_DATA aBGHoriPosTable[] =
{
    { sCSS1_PV_left,        GPOS_LT                 },
    { sCSS1_PV_center,      GPOS_MT                 },
    { sCSS1_PV_right,       GPOS_RT                 },
    { 0,                    0                       }
};

static CSS1PropertyEnum __READONLY_DATA aBGVertPosTable[] =
{
    { sCSS1_PV_top,         GPOS_LT                 },
    { sCSS1_PV_middle,      GPOS_LM                 },
    { sCSS1_PV_bottom,      GPOS_LB                 },
    { 0,                    0                       }
};

/*  */

static CSS1PropertyEnum __READONLY_DATA aTextAlignTable[] =
{
    { sCSS1_PV_left,        SVX_ADJUST_LEFT     },
    { sCSS1_PV_center,      SVX_ADJUST_CENTER   },
    { sCSS1_PV_right,       SVX_ADJUST_RIGHT    },
    { sCSS1_PV_justify,     SVX_ADJUST_BLOCK    },
    { 0,                    0                   }
};

/*  */

static CSS1PropertyEnum __READONLY_DATA aBorderWidthTable[] =
{
    { sCSS1_PV_thin,        0   },  // DEF_LINE_WIDTH_0 / DEF_DOUBLE_LINE0
    { sCSS1_PV_medium,      1   },  // DEF_LINE_WIDTH_1 / DEF_DOUBLE_LINE1
    { sCSS1_PV_thick,       2   },  // DEF_LINE_WIDTH_2 / DEF_DOUBLE_LINE2
    { 0,                    0   }
};

enum CSS1BorderStyle { CSS1_BS_NONE, CSS1_BS_SINGLE, CSS1_BS_DOUBLE };

static CSS1PropertyEnum __READONLY_DATA aBorderStyleTable[] =
{
    { sCSS1_PV_none,        CSS1_BS_NONE        },
    { sCSS1_PV_dotted,      CSS1_BS_SINGLE      },
    { sCSS1_PV_dashed,      CSS1_BS_SINGLE      },
    { sCSS1_PV_solid,       CSS1_BS_SINGLE      },
    { sCSS1_PV_double,      CSS1_BS_DOUBLE      },
    { sCSS1_PV_groove,      CSS1_BS_SINGLE      },
    { sCSS1_PV_ridge,       CSS1_BS_SINGLE      },
    { sCSS1_PV_inset,       CSS1_BS_SINGLE      },
    { sCSS1_PV_outset,      CSS1_BS_SINGLE      },
    { 0,                    0                   }
};

static CSS1PropertyEnum __READONLY_DATA aFloatTable[] =
{
    { sCSS1_PV_left,    SVX_ADJUST_LEFT         },
    { sCSS1_PV_right,   SVX_ADJUST_RIGHT        },
    { sCSS1_PV_none,    SVX_ADJUST_END          },
    { 0,                0                       }
};

static CSS1PropertyEnum __READONLY_DATA aPositionTable[] =
{
    { sCSS1_PV_absolute,    SVX_CSS1_POS_ABSOLUTE   },
    { sCSS1_PV_relative,    SVX_CSS1_POS_RELATIVE   },
    { sCSS1_PV_static,      SVX_CSS1_POS_STATIC     },
    { 0,                    0                       }
};

// Feature: PrintExt
static CSS1PropertyEnum __READONLY_DATA aSizeTable[] =
{
    { sCSS1_PV_auto,        SVX_CSS1_STYPE_AUTO         },
    { sCSS1_PV_landscape,   SVX_CSS1_STYPE_LANDSCAPE    },
    { sCSS1_PV_portrait,    SVX_CSS1_STYPE_PORTRAIT     },
    { 0,                    0                           }
};

static CSS1PropertyEnum __READONLY_DATA aPageBreakTable[] =
{
    { sCSS1_PV_auto,        SVX_CSS1_PBREAK_AUTO        },
    { sCSS1_PV_always,      SVX_CSS1_PBREAK_ALWAYS      },
    { sCSS1_PV_avoid,       SVX_CSS1_PBREAK_AVOID       },
    { sCSS1_PV_left,        SVX_CSS1_PBREAK_LEFT        },
    { sCSS1_PV_right,       SVX_CSS1_PBREAK_RIGHT       },
    { 0,                    0                           }
};

// /Feature: PrintExt

/*  */

// Ein Eintrag besteht aus vier USHORTs. Der erste ist die Gesamtbreite,
// die anderen sind die 3 Einzelbreiten

#define SBORDER_ENTRY( n ) \
    DEF_LINE_WIDTH_##n, DEF_LINE_WIDTH_##n, 0, 0

#define DBORDER_ENTRY( n ) \
    DEF_DOUBLE_LINE##n##_OUT + DEF_DOUBLE_LINE##n##_IN + \
    DEF_DOUBLE_LINE##n##_DIST, \
    DEF_DOUBLE_LINE##n##_OUT, \
    DEF_DOUBLE_LINE##n##_IN, \
    DEF_DOUBLE_LINE##n##_DIST

#define TDBORDER_ENTRY( n ) \
    DEF_DOUBLE_LINE##n##_OUT, \
    DEF_DOUBLE_LINE##n##_OUT, \
    DEF_DOUBLE_LINE##n##_IN, \
    DEF_DOUBLE_LINE##n##_DIST


static USHORT __READONLY_DATA aSBorderWidths[] =
{
    SBORDER_ENTRY( 0 ), SBORDER_ENTRY( 1 ), SBORDER_ENTRY( 2 ),
    SBORDER_ENTRY( 3 ), SBORDER_ENTRY( 4 )
};

static USHORT __READONLY_DATA aDBorderWidths[] =
{
    DBORDER_ENTRY( 0 ),
    DBORDER_ENTRY( 7 ),
    DBORDER_ENTRY( 1 ),
    DBORDER_ENTRY( 8 ),
    DBORDER_ENTRY( 4 ),
    DBORDER_ENTRY( 9 ),
    DBORDER_ENTRY( 3 ),
    DBORDER_ENTRY( 10 ),
    DBORDER_ENTRY( 2 ),
    DBORDER_ENTRY( 5 )
};

static USHORT __READONLY_DATA aTDBorderWidths[] =
{
    TDBORDER_ENTRY( 7 ), TDBORDER_ENTRY( 8 ), TDBORDER_ENTRY( 9 ),
    TDBORDER_ENTRY( 10 )
};

#undef SBORDER_ENTRY
#undef DBORDER_ENTRY

/*  */

struct SvxCSS1ItemIds
{
    USHORT nFont;
    USHORT nPosture;
    USHORT nWeight;
    USHORT nFontHeight;
    USHORT nUnderline;
    USHORT nCrossedOut;
    USHORT nColor;
    USHORT nKerning;
    USHORT nCaseMap;
    USHORT nBlink;

    USHORT nLineSpacing;
    USHORT nAdjust;
    USHORT nWidows;
    USHORT nOrphans;
    USHORT nFmtSplit;

    USHORT nLRSpace;
    USHORT nULSpace;
    USHORT nBox;
    USHORT nBrush;
};


static SvxCSS1ItemIds aItemIds;


/*  */

struct SvxCSS1BorderInfo
{
    Color aColor;
    USHORT nAbsWidth;
    USHORT nNamedWidth;
    CSS1BorderStyle eStyle;

    SvxCSS1BorderInfo() :
        aColor( COL_BLACK ), nAbsWidth( USHRT_MAX ),
        nNamedWidth( USHRT_MAX ), eStyle( CSS1_BS_NONE )
    {}

    SvxCSS1BorderInfo( const SvxCSS1BorderInfo& rInfo ) :
        aColor( rInfo.aColor ), nAbsWidth( rInfo.nAbsWidth ),
        nNamedWidth( rInfo.nNamedWidth ), eStyle( rInfo.eStyle )
    {}

    void SetBorderLine( USHORT nLine, SvxBoxItem &rBoxItem ) const;
};

void SvxCSS1BorderInfo::SetBorderLine( USHORT nLine, SvxBoxItem &rBoxItem ) const
{
    if( CSS1_BS_NONE==eStyle || nAbsWidth==0 ||
        (nAbsWidth==USHRT_MAX && nNamedWidth==USHRT_MAX) )
    {
        rBoxItem.SetLine( 0, nLine );
        return;
    }

    SvxBorderLine aBorderLine( &aColor );

    // Linien-Stil doppelt oder einfach?
    BOOL bDouble = eStyle == CSS1_BS_DOUBLE;

    // benannte Breite umrechnenen, wenn keine absolute gegeben ist
    if( nAbsWidth==USHRT_MAX )
    {
        const USHORT *aWidths = bDouble ? aDBorderWidths : aSBorderWidths;
        USHORT nNWidth = nNamedWidth * 4;
        aBorderLine.SetOutWidth( aWidths[nNWidth+1] );
        aBorderLine.SetInWidth( aWidths[nNWidth+2] );
        aBorderLine.SetDistance( aWidths[nNWidth+3] );
    }
    else
    {
        SvxCSS1Parser::SetBorderWidth( aBorderLine, nAbsWidth, bDouble );
    }

    rBoxItem.SetLine( &aBorderLine, nLine );
}


/*  */

SvxCSS1PropertyInfo::SvxCSS1PropertyInfo()
{
    for( USHORT i=0; i<4; i++ )
        aBorderInfos[i] = 0;

    Clear();
}

SvxCSS1PropertyInfo::SvxCSS1PropertyInfo( const SvxCSS1PropertyInfo& rProp ) :
    aId( rProp.aId ),
    bTopMargin( rProp.bTopMargin ), bBottomMargin( rProp.bBottomMargin ),
    bLeftMargin( rProp.bLeftMargin ), bRightMargin( rProp.bRightMargin ),
    bTextIndent( rProp.bTextIndent ),
    nLeftMargin( rProp.nLeftMargin ), nRightMargin( rProp.nRightMargin ),
    eFloat( rProp.eFloat ),
    ePosition( rProp.ePosition ),
    nTopBorderDistance( rProp.nTopBorderDistance ),
    nBottomBorderDistance( rProp.nBottomBorderDistance ),
    nLeftBorderDistance( rProp.nLeftBorderDistance ),
    nRightBorderDistance( rProp.nRightBorderDistance ),
    nLeft( rProp.nLeft ), nTop( rProp.nTop ),
    nWidth( rProp.nWidth ), nHeight( rProp.nHeight ),
    eLeftType( rProp.eLeftType ), eTopType( rProp.eTopType ),
    eWidthType( rProp.eWidthType ), eHeightType( rProp.eHeightType ),
// Feature: PrintExt
    eSizeType( rProp.eSizeType ),
    ePageBreakBefore( rProp.ePageBreakBefore ),
    ePageBreakAfter( rProp.ePageBreakAfter )
// /Feature: PrintExt
{
    for( USHORT i=0; i<4; i++ )
        aBorderInfos[i] = rProp.aBorderInfos[i]
                            ? new SvxCSS1BorderInfo( *rProp.aBorderInfos[i] )
                            : 0;
}

SvxCSS1PropertyInfo::~SvxCSS1PropertyInfo()
{
    DestroyBorderInfos();
}

void SvxCSS1PropertyInfo::DestroyBorderInfos()
{
    for( USHORT i=0; i<4; i++ )
    {
        delete aBorderInfos[i];
        aBorderInfos[i] = 0;
    }
}

void SvxCSS1PropertyInfo::Clear()
{
    aId.Erase();
    bTopMargin = bBottomMargin = FALSE;
    bLeftMargin = bRightMargin = bTextIndent = FALSE;
    nLeftMargin = nRightMargin = 0;
    eFloat = SVX_ADJUST_END;

    ePosition = SVX_CSS1_POS_NONE;
    nTopBorderDistance = nBottomBorderDistance =
    nLeftBorderDistance = nRightBorderDistance = USHRT_MAX;
    nLeft = nTop = nWidth = nHeight = 0;
    eLeftType = eTopType = eWidthType = eHeightType = SVX_CSS1_LTYPE_NONE;

// Feature: PrintExt
    eSizeType = SVX_CSS1_STYPE_NONE;
    ePageBreakBefore = SVX_CSS1_PBREAK_NONE;
    ePageBreakAfter = SVX_CSS1_PBREAK_NONE;

    DestroyBorderInfos();
}

void SvxCSS1PropertyInfo::Merge( const SvxCSS1PropertyInfo& rProp )
{
    if( rProp.bTopMargin )
        bTopMargin = TRUE;
    if( rProp.bBottomMargin )
        bBottomMargin = TRUE;

    if( rProp.bLeftMargin )
    {
        bLeftMargin = TRUE;
        nLeftMargin = rProp.nLeftMargin;
    }
    if( rProp.bRightMargin )
    {
        bRightMargin = TRUE;
        nRightMargin = rProp.nRightMargin;
    }
    if( rProp.bTextIndent )
        bTextIndent = TRUE;

    for( USHORT i=0; i<4; i++ )
    {
        if( rProp.aBorderInfos[i] )
        {
            if( aBorderInfos[i] )
                delete aBorderInfos[i];

            aBorderInfos[i] = new SvxCSS1BorderInfo( *rProp.aBorderInfos[i] );
        }
    }

    if( USHRT_MAX != rProp.nTopBorderDistance )
        nTopBorderDistance = rProp.nTopBorderDistance;
    if( USHRT_MAX != rProp.nBottomBorderDistance )
        nBottomBorderDistance = rProp.nBottomBorderDistance;
    if( USHRT_MAX != rProp.nLeftBorderDistance )
        nLeftBorderDistance = rProp.nLeftBorderDistance;
    if( USHRT_MAX != rProp.nRightBorderDistance )
        nRightBorderDistance = rProp.nRightBorderDistance;

    if( rProp.eFloat != SVX_ADJUST_END )
        eFloat = rProp.eFloat;

    if( rProp.ePosition != SVX_CSS1_POS_NONE )
        ePosition = rProp.ePosition;

// Feature: PrintExt
    if( rProp.eSizeType != SVX_CSS1_STYPE_NONE )
    {
        eSizeType = rProp.eSizeType;
        nWidth = rProp.nWidth;
        nHeight = rProp.nHeight;
    }

    if( rProp.ePageBreakBefore != SVX_CSS1_PBREAK_NONE )
        ePageBreakBefore = rProp.ePageBreakBefore;

    if( rProp.ePageBreakAfter != SVX_CSS1_PBREAK_NONE )
        ePageBreakAfter = rProp.ePageBreakAfter;

// /Feature: PrintExt

    if( rProp.eLeftType != SVX_CSS1_LTYPE_NONE )
    {
        eLeftType = rProp.eLeftType;
        nLeft = rProp.nLeft;
    }

    if( rProp.eTopType != SVX_CSS1_LTYPE_NONE )
    {
        eTopType = rProp.eTopType;
        nTop = rProp.nTop;
    }

    if( rProp.eWidthType != SVX_CSS1_LTYPE_NONE )
    {
        eWidthType = rProp.eWidthType;
        nWidth = rProp.nWidth;
    }

    if( rProp.eHeightType != SVX_CSS1_LTYPE_NONE )
    {
        eHeightType = rProp.eHeightType;
        nHeight = rProp.nHeight;
    }
}

SvxCSS1BorderInfo *SvxCSS1PropertyInfo::GetBorderInfo( USHORT nLine, BOOL bCreate )
{
    USHORT nPos = 0;
    switch( nLine )
    {
    case BOX_LINE_TOP:      nPos = 0;   break;
    case BOX_LINE_BOTTOM:   nPos = 1;   break;
    case BOX_LINE_LEFT:     nPos = 2;   break;
    case BOX_LINE_RIGHT:    nPos = 3;   break;
    }

    if( !aBorderInfos[nPos] && bCreate )
        aBorderInfos[nPos] = new SvxCSS1BorderInfo;

    return aBorderInfos[nPos];
}

void SvxCSS1PropertyInfo::CopyBorderInfo( USHORT nSrcLine, USHORT nDstLine,
                                          USHORT nWhat )
{
    SvxCSS1BorderInfo *pSrcInfo = GetBorderInfo( nSrcLine, FALSE );
    if( !pSrcInfo )
        return;

    SvxCSS1BorderInfo *pDstInfo = GetBorderInfo( nDstLine );
    if( (nWhat & SVX_CSS1_BORDERINFO_WIDTH) != 0 )
    {
        pDstInfo->nAbsWidth = pSrcInfo->nAbsWidth;
        pDstInfo->nNamedWidth = pSrcInfo->nNamedWidth;
    }

    if( (nWhat & SVX_CSS1_BORDERINFO_COLOR) != 0 )
        pDstInfo->aColor = pSrcInfo->aColor;

    if( (nWhat & SVX_CSS1_BORDERINFO_STYLE) != 0 )
        pDstInfo->eStyle = pSrcInfo->eStyle;
}

void SvxCSS1PropertyInfo::CopyBorderInfo( USHORT nCount, USHORT nWhat )
{
    if( nCount==0 )
    {
        CopyBorderInfo( BOX_LINE_BOTTOM, BOX_LINE_TOP, nWhat );
        CopyBorderInfo( BOX_LINE_TOP, BOX_LINE_LEFT, nWhat );
    }
    if( nCount<=1 )
    {
        CopyBorderInfo( BOX_LINE_LEFT, BOX_LINE_RIGHT, nWhat );
    }
}

void SvxCSS1PropertyInfo::SetBoxItem( SfxItemSet& rItemSet,
                                      USHORT nMinBorderDist,
                                      const SvxBoxItem *pDfltItem,
                                      BOOL bTable )
{
    BOOL bChg = nTopBorderDistance != USHRT_MAX ||
                nBottomBorderDistance != USHRT_MAX ||
                nLeftBorderDistance != USHRT_MAX ||
                nRightBorderDistance != USHRT_MAX;
    for( USHORT i=0; !bChg && i<4; i++ )
        bChg = aBorderInfos[i]!=0;

    if( !bChg )
        return;

    SvxBoxItem aBoxItem( aItemIds.nBox );
    if( pDfltItem )
        aBoxItem = *pDfltItem;

    SvxCSS1BorderInfo *pInfo = GetBorderInfo( BOX_LINE_TOP, FALSE );
    if( pInfo )
        pInfo->SetBorderLine( BOX_LINE_TOP, aBoxItem );

    pInfo = GetBorderInfo( BOX_LINE_BOTTOM, FALSE );
    if( pInfo )
        pInfo->SetBorderLine( BOX_LINE_BOTTOM, aBoxItem );

    pInfo = GetBorderInfo( BOX_LINE_LEFT, FALSE );
    if( pInfo )
        pInfo->SetBorderLine( BOX_LINE_LEFT, aBoxItem );

    pInfo = GetBorderInfo( BOX_LINE_RIGHT, FALSE );
    if( pInfo )
        pInfo->SetBorderLine( BOX_LINE_RIGHT, aBoxItem );

    for( i=0; i<4; i++ )
    {
        USHORT nLine, nDist;
        switch( i )
        {
        case 0: nLine = BOX_LINE_TOP;
                nDist = nTopBorderDistance;
                nTopBorderDistance = USHRT_MAX;
                break;
        case 1: nLine = BOX_LINE_BOTTOM;
                nDist = nBottomBorderDistance;
                nBottomBorderDistance = USHRT_MAX;
                break;
        case 2: nLine = BOX_LINE_LEFT;
                nDist = nLeftBorderDistance;
                nLeftBorderDistance = USHRT_MAX;
                break;
        case 3: nLine = BOX_LINE_RIGHT;
                nDist = nRightBorderDistance;
                nRightBorderDistance = USHRT_MAX;
                break;
        }

        if( aBoxItem.GetLine( nLine ) )
        {
            if( USHRT_MAX == nDist )
                nDist = aBoxItem.GetDistance( nLine );

            if( nDist < nMinBorderDist )
                nDist = nMinBorderDist;
        }
        else
        {
            if( USHRT_MAX == nDist )
                nDist = aBoxItem.GetDistance( nLine );

            if( !bTable )
                nDist = 0U;
            else if( nDist && nDist < nMinBorderDist )
                nDist = nMinBorderDist;
        }

        aBoxItem.SetDistance( nDist, nLine );
    }

    rItemSet.Put( aBoxItem );

    DestroyBorderInfos();
}


/*  */

SvxCSS1MapEntry::SvxCSS1MapEntry( const String& rKey, const SfxItemSet& rItemSet,
                                  const SvxCSS1PropertyInfo& rProp ) :
    aKey( rKey ),
    aItemSet( rItemSet ),
    aPropInfo( rProp )
{
    // TODO: ToUpperAscii
    aKey.ToUpperAscii();
}

#if defined( MAC ) || defined( ICC ) || defined( BLC )
BOOL operator==( const SvxCSS1MapEntry& rE1, const SvxCSS1MapEntry& rE2 )
{
    return  rE1.aKey==rE2.aKey;
}

BOOL operator<( const SvxCSS1MapEntry& rE1, const SvxCSS1MapEntry& rE2 )
{
    return  rE1.aKey<rE2.aKey;
}
#endif

SV_IMPL_OP_PTRARR_SORT( SvxCSS1Map, SvxCSS1MapEntryPtr )

/*  */

BOOL SvxCSS1Parser::StyleParsed( const CSS1Selector *pSelector,
                                 SfxItemSet& rItemSet,
                                 SvxCSS1PropertyInfo& rPropInfo )
{
    // wie man sieht passiert hier gar nichts
    return TRUE;
}

BOOL SvxCSS1Parser::SelectorParsed( const CSS1Selector *pSelector,
                                    BOOL bFirst )
{
    if( bFirst )
    {
        DBG_ASSERT( pSheetItemSet, "Wo ist der Item-Set fuer Style-Sheets?" );

        // Dieses ist der erste Selektor einer Rule, also muessen
        // die bisher geparsten Items auf die Styles verteilt werden
//      pSheetPropInfo->CreateBoxItem( *pSheetItemSet, GetDfltBorderDist() );
        for( USHORT i=0; i<aSelectors.Count(); i++ )
        {
            StyleParsed( aSelectors[i], *pSheetItemSet, *pSheetPropInfo );
        }
        pSheetItemSet->ClearItem();
        pSheetPropInfo->Clear();

        // und die naechste Rule vorbereiten
        if( aSelectors.Count() )
            aSelectors.DeleteAndDestroy( 0, aSelectors.Count() );
    }

    aSelectors.C40_INSERT( CSS1Selector, pSelector, aSelectors.Count() );

    return FALSE; // den Selektor haben wir gespeichert. Loeschen toedlich!
}


BOOL SvxCSS1Parser::DeclarationParsed( const String& rProperty,
                                       const CSS1Expression *pExpr )
{
    DBG_ASSERT( pExpr, "DeclarationParsed() ohne Expression" );

    if( !pExpr )
        return TRUE;

    ParseProperty( rProperty, pExpr );

    return TRUE;    // die Deklaration brauchen wir nicht mehr. Loeschen!
}

/*  */

SvxCSS1Parser::SvxCSS1Parser( SfxItemPool& rPool, USHORT nMinFixLineSp,
                              USHORT *pWhichIds, USHORT nWhichIds ) :
    CSS1Parser(),
    pSheetItemSet(0), pItemSet(0),
    nMinFixLineSpace( nMinFixLineSp ),
    pSearchEntry( 0 ), bIgnoreFontFamily( FALSE ),
    eDfltEnc( RTL_TEXTENCODING_DONTKNOW )
{
    // Item-Ids auch initialisieren
    aItemIds.nFont = rPool.GetTrueWhich( SID_ATTR_CHAR_FONT, FALSE );
    aItemIds.nPosture = rPool.GetTrueWhich( SID_ATTR_CHAR_POSTURE, FALSE );
    aItemIds.nWeight = rPool.GetTrueWhich( SID_ATTR_CHAR_WEIGHT, FALSE );
    aItemIds.nFontHeight = rPool.GetTrueWhich( SID_ATTR_CHAR_FONTHEIGHT, FALSE );
    aItemIds.nUnderline = rPool.GetTrueWhich( SID_ATTR_CHAR_UNDERLINE, FALSE );
    aItemIds.nCrossedOut = rPool.GetTrueWhich( SID_ATTR_CHAR_STRIKEOUT, FALSE );
    aItemIds.nColor = rPool.GetTrueWhich( SID_ATTR_CHAR_COLOR, FALSE );
    aItemIds.nKerning = rPool.GetTrueWhich( SID_ATTR_CHAR_KERNING, FALSE );
    aItemIds.nCaseMap = rPool.GetTrueWhich( SID_ATTR_CHAR_CASEMAP, FALSE );
    aItemIds.nBlink = rPool.GetTrueWhich( SID_ATTR_FLASH, FALSE );

    aItemIds.nLineSpacing = rPool.GetTrueWhich( SID_ATTR_PARA_LINESPACE, FALSE );
    aItemIds.nAdjust = rPool.GetTrueWhich( SID_ATTR_PARA_ADJUST, FALSE );
    aItemIds.nWidows = rPool.GetTrueWhich( SID_ATTR_PARA_WIDOWS, FALSE );
    aItemIds.nOrphans = rPool.GetTrueWhich( SID_ATTR_PARA_ORPHANS, FALSE );
    aItemIds.nFmtSplit = rPool.GetTrueWhich( SID_ATTR_PARA_SPLIT, FALSE );

    aItemIds.nLRSpace = rPool.GetTrueWhich( SID_ATTR_LRSPACE, FALSE );
    aItemIds.nULSpace = rPool.GetTrueWhich( SID_ATTR_ULSPACE, FALSE );
    aItemIds.nBox = rPool.GetTrueWhich( SID_ATTR_BORDER_OUTER, FALSE );
    aItemIds.nBrush = rPool.GetTrueWhich( SID_ATTR_BRUSH, FALSE );

    aWhichMap.Insert( (USHORT)0, (USHORT)0 );
    SvParser::BuildWhichTbl( aWhichMap, (USHORT *)&aItemIds,
                             sizeof(aItemIds) / sizeof(USHORT) );
    if( pWhichIds && nWhichIds )
        SvParser::BuildWhichTbl( aWhichMap, pWhichIds, nWhichIds );

    pSheetItemSet = new SfxItemSet( rPool, aWhichMap.GetData() );
    pSheetPropInfo = new SvxCSS1PropertyInfo;
    pSearchEntry = new SvxCSS1MapEntry( rPool, aWhichMap.GetData() );
}

SvxCSS1Parser::~SvxCSS1Parser()
{
    delete pSheetItemSet;
    delete pSheetPropInfo;
    delete pSearchEntry;
}


/*  */

BOOL SvxCSS1Parser::ParseStyleSheet( const String& rIn )
{
    pItemSet = pSheetItemSet;
    pPropInfo = pSheetPropInfo;

    BOOL bSuccess = CSS1Parser::ParseStyleSheet( rIn );

    // die bisher geparsten Items auf die Styles verteilt werden
//  pSheetPropInfo->CreateBoxItem( *pSheetItemSet, GetDfltBorderDist() );
    for( USHORT i=0; i<aSelectors.Count(); i++ )
    {
        StyleParsed( aSelectors[i], *pSheetItemSet, *pSheetPropInfo );
    }

    // und etwas aufrauemen
    if( aSelectors.Count() )
        aSelectors.DeleteAndDestroy( 0, aSelectors.Count() );
    pSheetItemSet->ClearItem();
    pSheetPropInfo->Clear();

    pItemSet = 0;
    pPropInfo = 0;

    return bSuccess;
}

BOOL SvxCSS1Parser::ParseStyleOption( const String& rIn,
                                      SfxItemSet& rItemSet,
                                      SvxCSS1PropertyInfo& rPropInfo )
{
    pItemSet = &rItemSet;
    pPropInfo = &rPropInfo;

    BOOL bSuccess = CSS1Parser::ParseStyleOption( rIn );
//  pPropInfo->CreateBoxItem( *pItemSet, GetDfltBorderDist() );

    pItemSet = 0;
    pPropInfo = 0;

    return bSuccess;
}

/*  */

BOOL SvxCSS1Parser::GetEnum( const CSS1PropertyEnum *pPropTable,
                          const String &rValue, USHORT& rEnum )
{
    String aValue( rValue );
    aValue.ToLowerAscii();
    while( pPropTable->pName )
    {
        if( !rValue.EqualsIgnoreCaseAscii( pPropTable->pName ) )
            pPropTable++;
        else
            break;
    }

    if( pPropTable->pName )
        rEnum = pPropTable->nEnum;

    return (pPropTable->pName != 0);
}

void SvxCSS1Parser::PixelToTwip( long &rWidth, long &rHeight )
{
    if( Application::GetDefaultDevice() )
    {
        Size aTwipSz( rWidth, rHeight );
        aTwipSz = Application::GetDefaultDevice()->PixelToLogic( aTwipSz,
                                                          MapMode(MAP_TWIP) );

        rWidth = aTwipSz.Width();
        rHeight = aTwipSz.Height();
    }
}

void SvxCSS1Parser::SetBorderWidth( SvxBorderLine& aBorderLine, USHORT nWidth,
                                    BOOL bDouble, BOOL bTable )
{
    const USHORT *aWidths;
    USHORT nSize;
    if( !bDouble )
    {
        aWidths = aSBorderWidths;
        nSize = sizeof( aSBorderWidths );
    }
    else if( bTable )
    {
        aWidths = aTDBorderWidths;
        nSize = sizeof( aTDBorderWidths );
    }
    else
    {
        aWidths = aDBorderWidths;
        nSize = sizeof( aDBorderWidths );
    }

    USHORT i = (nSize / sizeof(USHORT)) - 4;
    while( i>0 &&
           nWidth <= ((aWidths[i] + aWidths[i-4]) / 2)  )
    {
        DBG_ASSERT( aWidths[i] > aWidths[i-4],
                "Linienbreiten sind nicht sortiert!" );
        i -= 4;
    }

    aBorderLine.SetOutWidth( aWidths[i+1] );
    aBorderLine.SetInWidth( aWidths[i+2] );
    aBorderLine.SetDistance( aWidths[i+3] );
}

ULONG SvxCSS1Parser::GetFontHeight( USHORT nSize ) const
{
    USHORT nHeight;

    switch( nSize )
    {
    case 0:     nHeight =  8*20;    break;
    case 1:     nHeight = 10*20;    break;
    case 2:     nHeight = 11*20;    break;
    case 3:     nHeight = 12*20;    break;
    case 4:     nHeight = 17*20;    break;
    case 5:     nHeight = 20*20;    break;
    case 6:
    default:    nHeight = 32*20;    break;
    }

    return nHeight;
}

const FontList *SvxCSS1Parser::GetFontList() const
{
        return 0;
}

SvxCSS1MapEntry *SvxCSS1Parser::GetMapEntry( const String& rKey,
                                             const SvxCSS1Map& rMap ) const
{
    pSearchEntry->SetKey( rKey );

    SvxCSS1MapEntry *pRet = 0;
    USHORT nPos;
    if( rMap.Seek_Entry( pSearchEntry, &nPos ) )
        pRet = rMap[nPos];

    return pRet;
}

void SvxCSS1Parser::InsertMapEntry( const String& rKey,
                                    const SfxItemSet& rItemSet,
                                    const SvxCSS1PropertyInfo& rProp,
                                    SvxCSS1Map& rMap )
{
    SvxCSS1MapEntry *pEntry = GetMapEntry( rKey, rMap );
    if( pEntry )
    {
        MergeStyles( rItemSet, rProp,
                     pEntry->GetItemSet(), pEntry->GetPropertyInfo(), TRUE );
    }
    else
    {
        rMap.Insert( new SvxCSS1MapEntry( rKey, rItemSet, rProp ) );
    }
}


void SvxCSS1Parser::MergeStyles( const SfxItemSet& rSrcSet,
                                 const SvxCSS1PropertyInfo& rSrcInfo,
                                 SfxItemSet& rTargetSet,
                                 SvxCSS1PropertyInfo& rTargetInfo,
                                 BOOL bSmart )
{
    if( !bSmart )
    {
        rTargetSet.Put( rSrcSet );
    }
    else
    {
        SvxLRSpaceItem aLRSpace( (const SvxLRSpaceItem&)rTargetSet.Get(aItemIds.nLRSpace) );
        SvxULSpaceItem aULSpace( (const SvxULSpaceItem&)rTargetSet.Get(aItemIds.nULSpace) );
        SvxBoxItem aBox( (const SvxBoxItem&)rTargetSet.Get(aItemIds.nBox) );

        rTargetSet.Put( rSrcSet );

        if( rSrcInfo.bLeftMargin || rSrcInfo.bRightMargin ||
            rSrcInfo.bTextIndent )
        {
            const SvxLRSpaceItem& rNewLRSpace =
                (const SvxLRSpaceItem&)rSrcSet.Get( aItemIds.nLRSpace );

            if( rSrcInfo.bLeftMargin )
                aLRSpace.SetLeft( rNewLRSpace.GetLeft() );
            if( rSrcInfo.bRightMargin )
                aLRSpace.SetRight( rNewLRSpace.GetRight() );
            if( rSrcInfo.bTextIndent )
                aLRSpace.SetTxtFirstLineOfst( rNewLRSpace.GetTxtFirstLineOfst() );

            rTargetSet.Put( aLRSpace );
        }

        if( rSrcInfo.bTopMargin || rSrcInfo.bBottomMargin )
        {
            const SvxULSpaceItem& rNewULSpace =
                (const SvxULSpaceItem&)rSrcSet.Get( aItemIds.nULSpace );

            if( rSrcInfo.bTopMargin )
                aULSpace.SetUpper( rNewULSpace.GetUpper() );
            if( rSrcInfo.bBottomMargin )
                aULSpace.SetLower( rNewULSpace.GetLower() );

            rTargetSet.Put( aULSpace );
        }
    }

    rTargetInfo.Merge( rSrcInfo );
}

void SvxCSS1Parser::SetDfltEncoding( rtl_TextEncoding eEnc )
{
    eDfltEnc = eEnc;
}

/*  */

static void ParseCSS1_font_size( const CSS1Expression *pExpr,
                                 SfxItemSet &rItemSet,
                                 SvxCSS1PropertyInfo& rPropInfo,
                                 const SvxCSS1Parser& rParser )
{
    DBG_ASSERT( pExpr, "kein Ausdruck" );

    ULONG nHeight = 0;
    USHORT nPropHeight = 100;

    switch( pExpr->GetType() )
    {
    case CSS1_LENGTH:
        nHeight = pExpr->GetULength();
        break;
    case CSS1_PIXLENGTH:
        {
            long nPWidth = 0;
            long nPHeight = (long)pExpr->GetNumber();
            SvxCSS1Parser::PixelToTwip( nPWidth, nPHeight );
            nHeight = (ULONG)nPHeight;
        }
        break;
//#ifdef PERCENTAGE_POSSIBLE
    case CSS1_PERCENTAGE:
        // nur fuer Drop-Caps!
        nPropHeight = (USHORT)pExpr->GetNumber();
        break;
//#endif
    case CSS1_IDENT:
        {
            USHORT nSize;
#ifdef PERCENTAGE_POSSIBLE
            const String& rValue = pExpr->GetString();
#endif
            if( SvxCSS1Parser::GetEnum( aFontSizeTable, pExpr->GetString(),
                                        nSize ) )
            {
                nHeight = rParser.GetFontHeight( nSize );
            }
#ifdef PERCENTAGE_POSSIBLE
            else if( rValue.EqualsIgnoreCaseAscii( sCSS1_PV_larger ) )
            {
                nPropHeight = 150;
            }
            else if( rValue.EqualsIgnoreCaseAscii( sCSS1_PV_smaller ) )
            {
                nPropHeight = 67;
            }
#endif
        }
        break;
    }

    if( nHeight || nPropHeight!=100 )
    {
        rItemSet.Put( SvxFontHeightItem( nHeight, nPropHeight,
                                         aItemIds.nFontHeight ) );
    }
}

/*  */

static void ParseCSS1_font_family( const CSS1Expression *pExpr,
                                   SfxItemSet &rItemSet,
                                   SvxCSS1PropertyInfo& rPropInfo,
                                   const SvxCSS1Parser& rParser )
{
    DBG_ASSERT( pExpr, "kein Ausdruck" );

    String aName, aStyleName, aDfltName;
    FontFamily eFamily = FAMILY_DONTKNOW;
    FontPitch ePitch = PITCH_DONTKNOW;
    rtl_TextEncoding eEnc = rParser.GetDfltEncoding();
    const FontList *pFList = rParser.GetFontList();
    BOOL bFirst = TRUE;
    BOOL bFound = FALSE;
    while( pExpr && (bFirst || ','==pExpr->GetOp() || !pExpr->GetOp()) )
    {
        CSS1Token eType = pExpr->GetType();
        if( CSS1_IDENT==eType || CSS1_STRING==eType )
        {
            String aIdent( pExpr->GetString() );

            if( CSS1_IDENT==eType )
            {
                // Alle nachfolgenden id's sammeln und mit einem
                // Space getrennt hintendranhaengen
                const CSS1Expression *pNext = pExpr->GetNext();
                while( pNext && !pNext->GetOp() &&
                       CSS1_IDENT==pNext->GetType() )
                {
                    (aIdent += ' ') += pNext->GetString();
                    pExpr = pNext;
                    pNext = pExpr->GetNext();
                }
            }
            if( aIdent.Len() )
            {
                if( !bFound && pFList )
                {
                    sal_Handle hFont = pFList->GetFirstFontInfo( aIdent );
                    if( 0 != hFont )
                    {
                        const FontInfo& rFInfo = pFList->GetFontInfo( hFont );
                        if( RTL_TEXTENCODING_DONTKNOW != rFInfo.GetCharSet() )
                        {
                            bFound = TRUE;
                            if( RTL_TEXTENCODING_SYMBOL == rFInfo.GetCharSet() )
                                eEnc = RTL_TEXTENCODING_SYMBOL;
                        }
                    }
                }
                if( !bFirst )
                    aName += ';';
                aName += aIdent;
            }
        }

        pExpr = pExpr->GetNext();
        bFirst = FALSE;
    }

    if( aName.Len() && !rParser.IsIgnoreFontFamily() )
        rItemSet.Put( SvxFontItem( eFamily, aName, aStyleName, ePitch,
                                   eEnc, aItemIds.nFont ) );
}

/*  */

static void ParseCSS1_font_weight( const CSS1Expression *pExpr,
                                   SfxItemSet &rItemSet,
                                   SvxCSS1PropertyInfo& rPropInfo,
                                   const SvxCSS1Parser& rParser )
{
    DBG_ASSERT( pExpr, "kein Ausdruck" );

    switch( pExpr->GetType() )
    {
    case CSS1_IDENT:
    case CSS1_STRING:   // MS-IE, was sonst
        {
            USHORT nWeight;
            if( SvxCSS1Parser::GetEnum( aFontWeightTable, pExpr->GetString(),
                                        nWeight ) )
            {
                rItemSet.Put( SvxWeightItem( (FontWeight)nWeight,
                                             aItemIds.nWeight ) );
            }
        }
        break;
    case CSS1_NUMBER:
        {
            USHORT nWeight = (USHORT)pExpr->GetNumber();
            rItemSet.Put( SvxWeightItem( nWeight>400 ? WEIGHT_BOLD
                                                     : WEIGHT_NORMAL,
                                         aItemIds.nWeight ) );
        }
        break;
    }
}

/*  */

static void ParseCSS1_font_style( const CSS1Expression *pExpr,
                                  SfxItemSet &rItemSet,
                                  SvxCSS1PropertyInfo& rPropInfo,
                                  const SvxCSS1Parser& rParser )
{
    DBG_ASSERT( pExpr, "kein Ausdruck" );

    BOOL bPosture = FALSE;
    BOOL bCaseMap = FALSE;
    FontItalic eItalic;
    SvxCaseMap eCaseMap;

    // normal | italic || small-caps | oblique || small-caps | small-caps
    // (wobei nor noch normal | italic und oblique zulaessig sind

    // der Wert kann zwei Werte enthalten!
    for( USHORT i=0; pExpr && i<2; i++ )
    {
        // Auch hier hinterlaesst MS-IEs Parser seine Spuren
        if( (CSS1_IDENT==pExpr->GetType() || CSS1_STRING==pExpr->GetType()) &&
            !pExpr->GetOp() )
        {
            const String& rValue = pExpr->GetString();
            // erstmal pruefen, ob es ein Italic-Wert oder 'normal' ist
            USHORT nItalic;
            if( SvxCSS1Parser::GetEnum( aFontStyleTable, rValue, nItalic ) )
            {
                eItalic = (FontItalic)nItalic;
                if( !bCaseMap && ITALIC_NONE==eItalic )
                {
                    // fuer 'normal' muessen wir auch die case-map aussch.
                    eCaseMap = SVX_CASEMAP_NOT_MAPPED;
                    bCaseMap = TRUE;
                }
                bPosture = TRUE;
            }
            else if( !bCaseMap &&
                     rValue.EqualsIgnoreCaseAscii(sCSS1_PV_small_caps) )
            {
                eCaseMap = SVX_CASEMAP_KAPITAELCHEN;
                bCaseMap = TRUE;
            }
        }

        // den naechsten Ausdruck holen
        pExpr = pExpr->GetNext();
    }

    if( bPosture )
        rItemSet.Put( SvxPostureItem( eItalic, aItemIds.nPosture ) );

    if( bCaseMap )
        rItemSet.Put( SvxCaseMapItem( eCaseMap, aItemIds.nCaseMap ) );
}

/*  */

static void ParseCSS1_font_variant( const CSS1Expression *pExpr,
                                    SfxItemSet &rItemSet,
                                    SvxCSS1PropertyInfo& rPropInfo,
                                    const SvxCSS1Parser& rParser )
{
    DBG_ASSERT( pExpr, "kein Ausdruck" );

    // normal | small-caps

    switch( pExpr->GetType() )
    {
    case CSS1_IDENT:
        {
            USHORT nCaseMap;
            if( SvxCSS1Parser::GetEnum( aFontVariantTable, pExpr->GetString(),
                                        nCaseMap ) )
            {
                rItemSet.Put( SvxCaseMapItem( (SvxCaseMap)nCaseMap,
                                                aItemIds.nCaseMap ) );
            }
        }
    }
}

/*  */

static void ParseCSS1_color( const CSS1Expression *pExpr,
                             SfxItemSet &rItemSet,
                             SvxCSS1PropertyInfo& rPropInfo,
                             const SvxCSS1Parser& rParser )
{
    DBG_ASSERT( pExpr, "kein Ausdruck" );

    switch( pExpr->GetType() )
    {
    case CSS1_IDENT:
    case CSS1_RGB:
    case CSS1_HEXCOLOR:
    case CSS1_STRING:       // Wegen MS-IE
        {
            Color aColor;
            if( pExpr->GetColor( aColor ) )
                rItemSet.Put( SvxColorItem( aColor, aItemIds.nColor ) );
        }
        break;

    }
}

/*  */

static void MergeHori( SvxGraphicPosition& ePos, SvxGraphicPosition eHori )
{
    DBG_ASSERT( GPOS_LT==eHori || GPOS_MT==eHori || GPOS_RT==eHori,
                "vertikale Position nicht oben" );

    switch( ePos )
    {
    case GPOS_LT:
    case GPOS_MT:
    case GPOS_RT:
        ePos = eHori;
        break;

    case GPOS_LM:
    case GPOS_MM:
    case GPOS_RM:
        ePos = GPOS_LT==eHori ? GPOS_LM : (GPOS_MT==eHori ? GPOS_MM : GPOS_RM);
        break;

    case GPOS_LB:
    case GPOS_MB:
    case GPOS_RB:
        ePos = GPOS_LT==eHori ? GPOS_LB : (GPOS_MT==eHori ? GPOS_MB : GPOS_RB);
        break;
    }
}

static void MergeVert( SvxGraphicPosition& ePos, SvxGraphicPosition eVert )
{
    DBG_ASSERT( GPOS_LT==eVert || GPOS_LM==eVert || GPOS_LB==eVert,
                "horizontale Position nicht links" );

    switch( ePos )
    {
    case GPOS_LT:
    case GPOS_LM:
    case GPOS_LB:
        ePos = eVert;
        break;

    case GPOS_MT:
    case GPOS_MM:
    case GPOS_MB:
        ePos = GPOS_LT==eVert ? GPOS_MT : (GPOS_LM==eVert ? GPOS_MM : GPOS_MB);
        break;

    case GPOS_RT:
    case GPOS_RM:
    case GPOS_RB:
        ePos = GPOS_LT==eVert ? GPOS_RT : (GPOS_LM==eVert ? GPOS_RM : GPOS_RB);
        break;
    }
}

static void ParseCSS1_background( const CSS1Expression *pExpr,
                                  SfxItemSet &rItemSet,
                                  SvxCSS1PropertyInfo& rPropInfo,
                                  const SvxCSS1Parser& rParser )
{
    DBG_ASSERT( pExpr, "kein Ausdruck" );

    Color aColor;
    String aURL;

    BOOL bColor = FALSE, bTransparent = FALSE;
    SvxGraphicPosition eRepeat = GPOS_TILED;
    SvxGraphicPosition ePos = GPOS_LT;
    BOOL bHori = FALSE, bVert = FALSE;

    while( pExpr && !pExpr->GetOp() )
    {
        switch( pExpr->GetType() )
        {
        case CSS1_URL:
            pExpr->GetURL( aURL );
            break;

        case CSS1_RGB:
            bColor = pExpr->GetColor( aColor );
            break;

        case CSS1_LENGTH:
        case CSS1_PIXLENGTH:
            {
                // da wir keine absolute Positionierung koennen,
                // unterscheiden wir nur zwischen  0 und !0. Deshalb
                // koennen Pixel auch wie alle anderen Einheiten behandelt
                // werden.

                ULONG nLength = (ULONG)pExpr->GetNumber();
                if( !bHori )
                {
                    ePos = nLength ? GPOS_MM : GPOS_LT;
                    bHori = TRUE;
                }
                else if( !bVert )
                {
                    MergeVert( ePos, (nLength ? GPOS_LM : GPOS_LT) );
                    bVert = TRUE;
                }
            }
            break;

        case CSS1_PERCENTAGE:
            {
                // die %-Angabe wird auf den enum abgebildet

                USHORT nPerc = (USHORT)pExpr->GetNumber();
                if( !bHori )
                {
                    ePos = nPerc < 25 ? GPOS_LT
                                      : (nPerc < 75 ? GPOS_MM
                                                    : GPOS_RB);
                }
                else if( !bVert )
                {
                    SvxGraphicPosition eVert =
                        nPerc < 25 ? GPOS_LT: (nPerc < 75 ? GPOS_LM
                                                          : GPOS_LB);
                    MergeVert( ePos, eVert );
                }
            }
            break;

        case CSS1_IDENT:
        case CSS1_HEXCOLOR:
        case CSS1_STRING:       // Wegen MS-IE
            {
                USHORT nEnum;
                const String &rValue = pExpr->GetString();
                if( rValue.EqualsIgnoreCaseAscii( sCSS1_PV_transparent ) )
                {
                    bTransparent = TRUE;
                }
                if( SvxCSS1Parser::GetEnum( aBGRepeatTable, rValue, nEnum ) )
                {
                    eRepeat = (SvxGraphicPosition)nEnum;
                }
                else if( SvxCSS1Parser::GetEnum( aBGHoriPosTable, rValue, nEnum ) )
                {
                    // <position>, horizontal
                    MergeHori( ePos, (SvxGraphicPosition)nEnum );
                }
                else if( SvxCSS1Parser::GetEnum( aBGVertPosTable, rValue, nEnum ) )
                {
                    // <position>, vertikal
                    MergeVert( ePos, (SvxGraphicPosition)nEnum );
                }
                else if( !bColor )
                {
                    // <color>
                    bColor = pExpr->GetColor( aColor );
                }
                // <scroll> kennen wir nicht
            }
            break;
        }

        pExpr = pExpr->GetNext();
    }

    // transparent schlaegt alles
    if( bTransparent )
    {
        bColor = FALSE;
        aURL.Erase();
    }

    // repeat hat prio gegenueber einer Position
    if( GPOS_NONE == eRepeat )
        eRepeat = ePos;

    if( bTransparent || bColor || aURL.Len() )
    {
        SvxBrushItem aBrushItem( aItemIds.nBrush );

        if( bTransparent )
            aBrushItem.SetColor( Color(COL_TRANSPARENT));
        else if( bColor )
            aBrushItem.SetColor( aColor );

        if( aURL.Len() )
        {
            aBrushItem.SetGraphicLink( INetURLObject::RelToAbs( aURL ) );
            aBrushItem.SetGraphicPos( eRepeat );
        }

        rItemSet.Put( aBrushItem );
    }
}

static void ParseCSS1_background_color( const CSS1Expression *pExpr,
                                  SfxItemSet &rItemSet,
                                  SvxCSS1PropertyInfo& rPropInfo,
                                  const SvxCSS1Parser& rParser )
{
    DBG_ASSERT( pExpr, "kein Ausdruck" );

    Color aColor;

    BOOL bColor = FALSE, bTransparent = FALSE;

    switch( pExpr->GetType() )
    {
    case CSS1_RGB:
        bColor = pExpr->GetColor( aColor );
        break;
    case CSS1_IDENT:
    case CSS1_HEXCOLOR:
    case CSS1_STRING:       // Wegen MS-IE
        if( pExpr->GetString().EqualsIgnoreCaseAscii( sCSS1_PV_transparent ) )
        {
            bTransparent = TRUE;
        }
        else
        {
            // <color>
            bColor = pExpr->GetColor( aColor );
        }
        break;
    }

    if( bTransparent || bColor )
    {
        SvxBrushItem aBrushItem( aItemIds.nBrush );

        if( bTransparent )
            aBrushItem.SetColor( Color(COL_TRANSPARENT) );
        else if( bColor )
            aBrushItem.SetColor( aColor);

        rItemSet.Put( aBrushItem );
    }
}

/*  */

static void ParseCSS1_line_height( const CSS1Expression *pExpr,
                                   SfxItemSet &rItemSet,
                                   SvxCSS1PropertyInfo& rPropInfo,
                                   const SvxCSS1Parser& rParser )
{
    DBG_ASSERT( pExpr, "kein Ausdruck" );

    USHORT nHeight = 0;
    BYTE nPropHeight = 0;

    switch( pExpr->GetType() )
    {
    case CSS1_LENGTH:
        nHeight = (USHORT)pExpr->GetULength();
        break;
    case CSS1_PIXLENGTH:
        {
            long nPWidth = 0;
            long nPHeight = (long)pExpr->GetNumber();
            SvxCSS1Parser::PixelToTwip( nPWidth, nPHeight );
            nHeight = (USHORT)nPHeight;
        }
        break;
    case CSS1_PERCENTAGE:
        {
            USHORT nPHeight = (USHORT)pExpr->GetNumber();
            nPropHeight = nPHeight <= 200 ? (BYTE)nPHeight : 200;
        }
        break;
    case CSS1_NUMBER:
        {
            USHORT nPHeight = (USHORT)(pExpr->GetNumber() * 100);
            nPropHeight = nPHeight <= 200 ? (BYTE)nPHeight : 200;
        }
        break;
    }

    if( nHeight )
    {
        if( nHeight < rParser.GetMinFixLineSpace() )
            nHeight = rParser.GetMinFixLineSpace();
        SvxLineSpacingItem aLSItem( nHeight, aItemIds.nLineSpacing );
        aLSItem.SetLineHeight( nHeight );
        aLSItem.GetLineSpaceRule() = SVX_LINE_SPACE_FIX;
        aLSItem.GetInterLineSpaceRule() = SVX_INTER_LINE_SPACE_OFF;
        rItemSet.Put( aLSItem );
    }
    else if( nPropHeight )
    {
        SvxLineSpacingItem aLSItem( nPropHeight, aItemIds.nLineSpacing );
        aLSItem.GetLineSpaceRule() = SVX_LINE_SPACE_AUTO;
        if( 100 == nPropHeight )
            aLSItem.GetInterLineSpaceRule() = SVX_INTER_LINE_SPACE_OFF;
        else
            aLSItem.SetPropLineSpace( nPropHeight );
        rItemSet.Put( aLSItem );
    }

}

/*  */

static void ParseCSS1_font( const CSS1Expression *pExpr,
                            SfxItemSet &rItemSet,
                            SvxCSS1PropertyInfo& rPropInfo,
                            const SvxCSS1Parser& rParser )
{
    DBG_ASSERT( pExpr, "kein Ausdruck" );

    FontItalic eItalic = ITALIC_NONE;
    SvxCaseMap eCaseMap = SVX_CASEMAP_NOT_MAPPED;
    FontWeight eWeight = WEIGHT_NORMAL;

    // [ <font-style> || <font-variant> || <font-weight> ] ?
    while( pExpr && !pExpr->GetOp() &&
           (CSS1_IDENT==pExpr->GetType() ||
            CSS1_STRING==pExpr->GetType() ||
            CSS1_NUMBER==pExpr->GetType()) )
    {
        if( CSS1_IDENT==pExpr->GetType() ||
            CSS1_STRING==pExpr->GetType() )
        {
            const String& rValue = pExpr->GetString();

            USHORT nEnum;

            if( SvxCSS1Parser::GetEnum( aFontStyleTable, rValue, nEnum ) )
            {
                eItalic = (FontItalic)nEnum;
            }
            else if( SvxCSS1Parser::GetEnum( aFontVariantTable, rValue, nEnum ) )
            {
                eCaseMap = (SvxCaseMap)nEnum;
            }
            else if( SvxCSS1Parser::GetEnum( aFontWeightTable, rValue, nEnum ) )
            {
                eWeight = (FontWeight)nEnum;
            }
        }
        else
        {
            eWeight = (USHORT)pExpr->GetNumber() > 400 ? WEIGHT_BOLD
                                                       : WEIGHT_NORMAL;
        }

        pExpr = pExpr->GetNext();
    }

    if( !pExpr || pExpr->GetOp() )
        return;

    // Da "font" alle Werte zurecksetzt, fuer die nichts angegeben ist,
    // tun wir das hier.
    rItemSet.Put( SvxPostureItem( eItalic, aItemIds.nPosture ) );
    rItemSet.Put( SvxCaseMapItem( eCaseMap, aItemIds.nCaseMap ) );
    rItemSet.Put( SvxWeightItem( eWeight, aItemIds.nWeight ) );


    // font-size
    CSS1Expression aExpr( pExpr->GetType(), pExpr->GetString(),
                          pExpr->GetNumber() );
    ParseCSS1_font_size( &aExpr, rItemSet, rPropInfo, rParser );
    pExpr = pExpr->GetNext();

    if( !pExpr )
        return;

    // [ '/' line-height ]?
    if( '/' == pExpr->GetOp() )
    {
        // '/' line-height
        aExpr.Set( pExpr->GetType(), pExpr->GetString(), pExpr->GetNumber() );
        ParseCSS1_line_height( &aExpr, rItemSet, rPropInfo, rParser );

        pExpr = pExpr->GetNext();
    }

    if( !pExpr || pExpr->GetOp() )
        return;

    // font-family
    ParseCSS1_font_family( pExpr, rItemSet, rPropInfo, rParser );
}

/*  */

static void ParseCSS1_letter_spacing( const CSS1Expression *pExpr,
                                      SfxItemSet &rItemSet,
                                      SvxCSS1PropertyInfo& rPropInfo,
                                      const SvxCSS1Parser& rParser )
{
    DBG_ASSERT( pExpr, "kein Ausdruck" );

    switch( pExpr->GetType() )
    {
    case CSS1_LENGTH:
        rItemSet.Put( SvxKerningItem( (short)pExpr->GetSLength(),
                                      aItemIds.nKerning ) );
        break;

    case CSS1_PIXLENGTH:
        {
            long nPWidth = (long)pExpr->GetNumber();
            long nPHeight = 0;
            SvxCSS1Parser::PixelToTwip( nPWidth, nPHeight );
            rItemSet.Put( SvxKerningItem( (short)nPWidth, aItemIds.nKerning ) );
        }
        break;

    case CSS1_NUMBER:
        if( pExpr->GetNumber() == 0 )
        {
            // eigentlich unnoetig, aber wir sind ja tollerant
            rItemSet.Put( SvxKerningItem( (short)0, aItemIds.nKerning ) );
        }
        break;

    case CSS1_IDENT:
    case CSS1_STRING: // Vorschtshalber auch MS-IE
        if( pExpr->GetString().EqualsIgnoreCaseAscii(sCSS1_PV_normal) )
        {
            rItemSet.Put( SvxKerningItem( (short)0, aItemIds.nKerning ) );
        }
        break;
    }
}

/*  */

static void ParseCSS1_text_decoration( const CSS1Expression *pExpr,
                                       SfxItemSet &rItemSet,
                                       SvxCSS1PropertyInfo& rPropInfo,
                                       const SvxCSS1Parser& rParser )
{
    DBG_ASSERT( pExpr, "kein Ausdruck" );

    BOOL bUnderline = FALSE;
    BOOL bCrossedOut = FALSE;
    BOOL bBlink = FALSE;
    BOOL bBlinkOn;
    FontUnderline eUnderline;
    FontStrikeout eCrossedOut;

    // der Wert kann zwei Werte enthalten! Und MS-IE auch Strings
    while( pExpr && (pExpr->GetType() == CSS1_IDENT ||
                     pExpr->GetType() == CSS1_STRING) && !pExpr->GetOp() )
    {
        String aValue = pExpr->GetString();
        aValue.ToLowerAscii();
        BOOL bKnown = FALSE;

        switch( aValue.GetChar( 0 ) )
        {
        case 'n':
            if( aValue.EqualsAscii( sCSS1_PV_none ) )
            {
                bUnderline = TRUE;
                eUnderline = UNDERLINE_NONE;

                bCrossedOut = TRUE;
                eCrossedOut = STRIKEOUT_NONE;

                bBlink = TRUE;
                bBlinkOn = FALSE;

                bKnown = TRUE;
            }
            break;

        case 'u':
            if( aValue.EqualsAscii( sCSS1_PV_underline ) )
            {
                bUnderline = TRUE;
                eUnderline = UNDERLINE_SINGLE;

                bKnown = TRUE;
            }
            break;

        case 'l':
            if( aValue.EqualsAscii( sCSS1_PV_line_through ) )
            {
                bCrossedOut = TRUE;
                eCrossedOut = STRIKEOUT_SINGLE;

                bKnown = TRUE;
            }
            break;

        case 'b':
            if( aValue.EqualsAscii( sCSS1_PV_blink ) )
            {
                bBlink = TRUE;
                bBlinkOn = TRUE;

                bKnown = TRUE;
            }
            break;
        }

        if( !bKnown )
        {
            bUnderline = TRUE;
            eUnderline = UNDERLINE_SINGLE;
        }

        pExpr = pExpr->GetNext();
    }

    if( bUnderline )
        rItemSet.Put( SvxUnderlineItem( eUnderline, aItemIds.nUnderline ) );

    if( bCrossedOut )
        rItemSet.Put( SvxCrossedOutItem( eCrossedOut, aItemIds.nCrossedOut ) );

    if( bBlink )
        rItemSet.Put( SvxBlinkItem( bBlinkOn, aItemIds.nBlink ) );
}

/*  */

static void ParseCSS1_text_align( const CSS1Expression *pExpr,
                                  SfxItemSet &rItemSet,
                                  SvxCSS1PropertyInfo& rPropInfo,
                                  const SvxCSS1Parser& rParser )
{
    DBG_ASSERT( pExpr, "kein Ausdruck" );

    if( CSS1_IDENT==pExpr->GetType() ||
        CSS1_STRING==pExpr->GetType() ) // MS-IE, mal wieder
    {
        USHORT nAdjust;
        if( SvxCSS1Parser::GetEnum( aTextAlignTable, pExpr->GetString(),
                                    nAdjust ) )
        {
            rItemSet.Put( SvxAdjustItem( (SvxAdjust)nAdjust,
                                         aItemIds.nAdjust ) );
        }
    }
}

/*  */

static void ParseCSS1_text_indent( const CSS1Expression *pExpr,
                                   SfxItemSet &rItemSet,
                                   SvxCSS1PropertyInfo& rPropInfo,
                                   const SvxCSS1Parser& rParser )
{
    DBG_ASSERT( pExpr, "kein Ausdruck" );

    short nIndent = 0;
    BOOL bSet = FALSE;
    switch( pExpr->GetType() )
    {
    case CSS1_LENGTH:
        nIndent = (short)pExpr->GetSLength();
        bSet = TRUE;
        break;
    case CSS1_PIXLENGTH:
        {
            long nPWidth = (long)pExpr->GetNumber();
            long nPHeight = 0;
            SvxCSS1Parser::PixelToTwip( nPWidth, nPHeight );
            nIndent = (short)nPWidth;
            bSet = TRUE;
        }
        break;
    case CSS1_PERCENTAGE:
        // koennen wir nicht
        break;
    }

    if( bSet )
    {
        const SfxPoolItem* pItem;
        if( SFX_ITEM_SET == rItemSet.GetItemState( aItemIds.nLRSpace, FALSE,
                                                   &pItem ) )
        {
            SvxLRSpaceItem aLRItem( *((const SvxLRSpaceItem*)pItem) );
            aLRItem.SetTxtFirstLineOfst( nIndent );
            rItemSet.Put( aLRItem );
        }
        else
        {
            SvxLRSpaceItem aLRItem( aItemIds.nLRSpace );
            aLRItem.SetTxtFirstLineOfst( nIndent );
            rItemSet.Put( aLRItem );
        }
        rPropInfo.bTextIndent = TRUE;
    }
}

/*  */

static void ParseCSS1_margin_left( const CSS1Expression *pExpr,
                                   SfxItemSet &rItemSet,
                                   SvxCSS1PropertyInfo& rPropInfo,
                                   const SvxCSS1Parser& rParser )
{
    DBG_ASSERT( pExpr, "kein Ausdruck" );

    long nLeft = 0;
    BOOL bSet = FALSE;
    switch( pExpr->GetType() )
    {
    case CSS1_LENGTH:
        {
            nLeft = pExpr->GetSLength();
            bSet = TRUE;
        }
        break;
    case CSS1_PIXLENGTH:
        {
            nLeft = (long)pExpr->GetNumber();
            long nPHeight = 0;
            SvxCSS1Parser::PixelToTwip( nLeft, nPHeight );
            bSet = TRUE;
        }
        break;
    case CSS1_PERCENTAGE:
        // koennen wir nicht
        break;
    }

    if( bSet )
    {
        rPropInfo.nLeftMargin = nLeft;
        if( nLeft < 0 )
            nLeft = 0;
        const SfxPoolItem* pItem;
        if( SFX_ITEM_SET == rItemSet.GetItemState( aItemIds.nLRSpace, FALSE,
                                                   &pItem ) )
        {
            SvxLRSpaceItem aLRItem( *((const SvxLRSpaceItem*)pItem) );
            aLRItem.SetTxtLeft( (USHORT)nLeft );
            rItemSet.Put( aLRItem );
        }
        else
        {
            SvxLRSpaceItem aLRItem( aItemIds.nLRSpace );
            aLRItem.SetTxtLeft( (USHORT)nLeft );
            rItemSet.Put( aLRItem );
        }
        rPropInfo.bLeftMargin = TRUE;
    }
}

/*  */

static void ParseCSS1_margin_right( const CSS1Expression *pExpr,
                                    SfxItemSet &rItemSet,
                                    SvxCSS1PropertyInfo& rPropInfo,
                                    const SvxCSS1Parser& rParser )
{
    DBG_ASSERT( pExpr, "kein Ausdruck" );

    long nRight = 0;
    BOOL bSet = FALSE;
    switch( pExpr->GetType() )
    {
    case CSS1_LENGTH:
        {
            nRight = pExpr->GetSLength();
            bSet = TRUE;
        }
        break;
    case CSS1_PIXLENGTH:
        {
            nRight = (long)pExpr->GetNumber();
            long nPHeight = 0;
            SvxCSS1Parser::PixelToTwip( nRight, nPHeight );
            bSet = TRUE;
        }
        break;
    case CSS1_PERCENTAGE:
        // koennen wir nicht
        break;
    }

    if( bSet )
    {
        rPropInfo.nRightMargin = nRight;
        if( nRight < 0 )
            nRight = 0;
        const SfxPoolItem* pItem;
        if( SFX_ITEM_SET == rItemSet.GetItemState( aItemIds.nLRSpace, FALSE,
                                                   &pItem ) )
        {
            SvxLRSpaceItem aLRItem( *((const SvxLRSpaceItem*)pItem) );
            aLRItem.SetRight( (USHORT)nRight );
            rItemSet.Put( aLRItem );
        }
        else
        {
            SvxLRSpaceItem aLRItem( aItemIds.nLRSpace );
            aLRItem.SetRight( (USHORT)nRight );
            rItemSet.Put( aLRItem );
        }
        rPropInfo.bRightMargin = TRUE;
    }
}

/*  */

static void ParseCSS1_margin_top( const CSS1Expression *pExpr,
                                  SfxItemSet &rItemSet,
                                  SvxCSS1PropertyInfo& rPropInfo,
                                  const SvxCSS1Parser& rParser )
{
    DBG_ASSERT( pExpr, "kein Ausdruck" );

    USHORT nUpper = 0;
    BOOL bSet = FALSE;
    switch( pExpr->GetType() )
    {
    case CSS1_LENGTH:
        {
            long nTmp = pExpr->GetSLength();
            if( nTmp < 0 )
                nTmp = 0;
            nUpper = (USHORT)nTmp;
            bSet = TRUE;
        }
        break;
    case CSS1_PIXLENGTH:
        {
            long nPWidth = 0;
            long nPHeight =  (long)pExpr->GetNumber();
            if( nPHeight < 0 )
                nPHeight = 0;
            SvxCSS1Parser::PixelToTwip( nPWidth, nPHeight );
            nUpper = (USHORT)nPHeight;
            bSet = TRUE;
        }
        break;
    case CSS1_PERCENTAGE:
        // koennen wir nicht
        break;
    }

    if( bSet )
    {
        const SfxPoolItem* pItem;
        if( SFX_ITEM_SET == rItemSet.GetItemState( aItemIds.nULSpace, FALSE,
                                                   &pItem ) )
        {
            SvxULSpaceItem aULItem( *((const SvxULSpaceItem*)pItem) );
            aULItem.SetUpper( nUpper );
            rItemSet.Put( aULItem );
        }
        else
        {
            SvxULSpaceItem aULItem( aItemIds.nULSpace );
            aULItem.SetUpper( nUpper );
            rItemSet.Put( aULItem );
        }
        rPropInfo.bTopMargin = TRUE;
    }
}

/*  */

static void ParseCSS1_margin_bottom( const CSS1Expression *pExpr,
                                     SfxItemSet &rItemSet,
                                     SvxCSS1PropertyInfo& rPropInfo,
                                     const SvxCSS1Parser& rParser )
{
    DBG_ASSERT( pExpr, "kein Ausdruck" );

    USHORT nLower = 0;
    BOOL bSet = FALSE;
    switch( pExpr->GetType() )
    {
    case CSS1_LENGTH:
        {
            long nTmp = pExpr->GetSLength();
            if( nTmp < 0 )
                nTmp = 0;
            nLower = (USHORT)nTmp;
            bSet = TRUE;
        }
        break;
    case CSS1_PIXLENGTH:
        {
            long nPWidth = 0;
            long nPHeight =  (long)pExpr->GetNumber();
            if( nPHeight < 0 )
                nPHeight = 0;
            SvxCSS1Parser::PixelToTwip( nPWidth, nPHeight );
            nLower = (USHORT)nPHeight;
            bSet = TRUE;
        }
        break;
    case CSS1_PERCENTAGE:
        // koennen wir nicht
        break;
    }

    if( bSet )
    {
        const SfxPoolItem* pItem;
        if( SFX_ITEM_SET == rItemSet.GetItemState( aItemIds.nULSpace, FALSE,
                                                   &pItem ) )
        {
            SvxULSpaceItem aULItem( *((const SvxULSpaceItem*)pItem) );
            aULItem.SetLower( nLower );
            rItemSet.Put( aULItem );
        }
        else
        {
            SvxULSpaceItem aULItem( aItemIds.nULSpace );
            aULItem.SetLower( nLower );
            rItemSet.Put( aULItem );
        }
        rPropInfo.bBottomMargin = TRUE;
    }
}

/*  */

static void ParseCSS1_margin( const CSS1Expression *pExpr,
                              SfxItemSet &rItemSet,
                              SvxCSS1PropertyInfo& rPropInfo,
                              const SvxCSS1Parser& rParser )
{
    DBG_ASSERT( pExpr, "kein Ausdruck" );

    long nMargins[4] = { 0, 0, 0, 0 };
    BOOL bSetMargins[4] = { FALSE, FALSE, FALSE, FALSE };

    for( USHORT i=0; pExpr && i<4 && !pExpr->GetOp(); i++ )
    {
        BOOL bSetThis = FALSE;
        long nMargin;

        switch( pExpr->GetType() )
        {
        case CSS1_LENGTH:
            {
                nMargin = pExpr->GetSLength();
                bSetThis = TRUE;
            }
            break;
        case CSS1_PIXLENGTH:
            {
                long nPWidth = 0;
                nMargin =  (long)pExpr->GetNumber();
                SvxCSS1Parser::PixelToTwip( nPWidth, nMargin );
                bSetThis = TRUE;
            }
            break;
        case CSS1_PERCENTAGE:
            // koennen wir nicht
            break;
        }

        if( bSetThis )
        {
            // 0 = top
            // 1 = right
            // 2 = bottom
            // 3 = left
            switch( i )
            {
            case 0:
                nMargins[0] = nMargins[1] =nMargins[2] = nMargins[3] = nMargin;
                bSetMargins[0] = bSetMargins[1] =
                bSetMargins[2] = bSetMargins[3] = TRUE;
                break;
            case 1:
                nMargins[1] = nMargins[3] = nMargin;    // right + left
                bSetMargins[1] = bSetMargins[3] = TRUE;
                break;
            case 2:
                nMargins[2] = nMargin;  // bottom
                bSetMargins[2] = TRUE;
                break;
            case 3:
                nMargins[3] = nMargin;  // left
                bSetMargins[3] = TRUE;
                break;
            }
        }
        pExpr = pExpr->GetNext();
    }

    if( bSetMargins[3] || bSetMargins[1] )
    {
        if( bSetMargins[3] )
        {
            rPropInfo.bLeftMargin = TRUE;
            rPropInfo.nLeftMargin = nMargins[3];
            if( nMargins[3] < 0 )
                nMargins[3] = 0;
        }
        if( bSetMargins[1] )
        {
            rPropInfo.bRightMargin = TRUE;
            rPropInfo.nRightMargin = nMargins[1];
            if( nMargins[1] < 0 )
                nMargins[1] = 0;
        }

        const SfxPoolItem* pItem;
        if( SFX_ITEM_SET == rItemSet.GetItemState( aItemIds.nLRSpace, FALSE,
                                                   &pItem ) )
        {
            SvxLRSpaceItem aLRItem( *((const SvxLRSpaceItem*)pItem) );
            if( bSetMargins[3] )
                aLRItem.SetLeft( (USHORT)nMargins[3] );
            if( bSetMargins[1] )
                aLRItem.SetRight( (USHORT)nMargins[1] );
            rItemSet.Put( aLRItem );
        }
        else
        {
            SvxLRSpaceItem aLRItem( aItemIds.nLRSpace );
            if( bSetMargins[3] )
                aLRItem.SetLeft( (USHORT)nMargins[3] );
            if( bSetMargins[1] )
                aLRItem.SetRight( (USHORT)nMargins[1] );
            rItemSet.Put( aLRItem );
        }
    }

    if( bSetMargins[0] || bSetMargins[2] )
    {
        if( nMargins[0] < 0 )
            nMargins[0] = 0;
        if( nMargins[2] < 0 )
            nMargins[2] = 0;

        const SfxPoolItem* pItem;
        if( SFX_ITEM_SET == rItemSet.GetItemState( aItemIds.nULSpace, FALSE,
                                                   &pItem ) )
        {
            SvxULSpaceItem aULItem( *((const SvxULSpaceItem*)pItem) );
            if( bSetMargins[0] )
                aULItem.SetUpper( (USHORT)nMargins[0] );
            if( bSetMargins[2] )
                aULItem.SetLower( (USHORT)nMargins[2] );
            rItemSet.Put( aULItem );
        }
        else
        {
            SvxULSpaceItem aULItem( aItemIds.nULSpace );
            if( bSetMargins[0] )
                aULItem.SetUpper( (USHORT)nMargins[0] );
            if( bSetMargins[2] )
                aULItem.SetLower( (USHORT)nMargins[2] );
            rItemSet.Put( aULItem );
        }

        rPropInfo.bTopMargin |= bSetMargins[0];
        rPropInfo.bBottomMargin |= bSetMargins[2];
    }
}

/*  */

static BOOL ParseCSS1_padding_xxx( const CSS1Expression *pExpr,
                                   SfxItemSet &rItemSet,
                                   SvxCSS1PropertyInfo& rPropInfo,
                                   const SvxCSS1Parser& rParser,
                                   USHORT nWhichLine )
{
    DBG_ASSERT( pExpr, "kein Ausdruck" );

    BOOL bSet = FALSE;
    USHORT nDist = 0;

    switch( pExpr->GetType() )
    {
    case CSS1_LENGTH:
        {
            long nTmp = pExpr->GetSLength();
            if( nTmp < 0 )
                nTmp = 0;
            else if( nTmp > USHRT_MAX-1 )
                nTmp = USHRT_MAX-1;
            nDist = (USHORT)nTmp;
            bSet = TRUE;
        }
        break;
    case CSS1_PIXLENGTH:
        {
            long nPWidth = (long)pExpr->GetNumber();
            long nPHeight = 0;
            if( nPWidth < 0 )
                nPWidth = 0;
            SvxCSS1Parser::PixelToTwip( nPWidth, nPHeight );
            if( nPWidth > USHRT_MAX-1 )
                nPWidth = USHRT_MAX-1;
            nDist = (USHORT)nPWidth;
            bSet = TRUE;
        }
        break;
    case CSS1_PERCENTAGE:
        // koennen wir nicht
        break;
    }

    if( bSet )
    {
        switch( nWhichLine )
        {
        case BOX_LINE_TOP:      rPropInfo.nTopBorderDistance = nDist;   break;
        case BOX_LINE_BOTTOM:   rPropInfo.nBottomBorderDistance = nDist;break;
        case BOX_LINE_LEFT:     rPropInfo.nLeftBorderDistance = nDist;  break;
        case BOX_LINE_RIGHT:    rPropInfo.nRightBorderDistance = nDist; break;
        }
    }

    return bSet;
}

/*  */

static void ParseCSS1_padding_top( const CSS1Expression *pExpr,
                                   SfxItemSet &rItemSet,
                                   SvxCSS1PropertyInfo& rPropInfo,
                                   const SvxCSS1Parser& rParser )
{
    ParseCSS1_padding_xxx( pExpr, rItemSet, rPropInfo, rParser, BOX_LINE_TOP );
}

static void ParseCSS1_padding_bottom( const CSS1Expression *pExpr,
                                      SfxItemSet &rItemSet,
                                      SvxCSS1PropertyInfo& rPropInfo,
                                      const SvxCSS1Parser& rParser )
{
    ParseCSS1_padding_xxx( pExpr, rItemSet, rPropInfo, rParser,
                           BOX_LINE_BOTTOM );
}

static void ParseCSS1_padding_left( const CSS1Expression *pExpr,
                                    SfxItemSet &rItemSet,
                                    SvxCSS1PropertyInfo& rPropInfo,
                                    const SvxCSS1Parser& rParser )
{
    ParseCSS1_padding_xxx( pExpr, rItemSet, rPropInfo, rParser, BOX_LINE_LEFT );
}

static void ParseCSS1_padding_right( const CSS1Expression *pExpr,
                                     SfxItemSet &rItemSet,
                                     SvxCSS1PropertyInfo& rPropInfo,
                                     const SvxCSS1Parser& rParser )
{
    ParseCSS1_padding_xxx( pExpr, rItemSet, rPropInfo, rParser,
                           BOX_LINE_RIGHT );
}

static void ParseCSS1_padding( const CSS1Expression *pExpr,
                               SfxItemSet &rItemSet,
                               SvxCSS1PropertyInfo& rPropInfo,
                               const SvxCSS1Parser& rParser )
{
    USHORT n=0;
    while( n<4 && pExpr && !pExpr->GetOp() )
    {
        USHORT nLine = n==0 || n==2 ? BOX_LINE_BOTTOM : BOX_LINE_LEFT;
        if( ParseCSS1_padding_xxx( pExpr, rItemSet, rPropInfo, rParser,
                                   nLine ) )
        {
            if( n==0 )
            {
                rPropInfo.nTopBorderDistance = rPropInfo.nBottomBorderDistance;
                rPropInfo.nLeftBorderDistance = rPropInfo.nTopBorderDistance;
            }
            if( n <= 1 )
                rPropInfo.nRightBorderDistance = rPropInfo.nLeftBorderDistance;
        }

        pExpr = pExpr->GetNext();
        n++;
    }
}

/*  */

static void ParseCSS1_border_xxx( const CSS1Expression *pExpr,
                                  SfxItemSet &rItemSet,
                                  SvxCSS1PropertyInfo& rPropInfo,
                                  const SvxCSS1Parser& rParser,
                                  USHORT nWhichLine, BOOL bAll )
{
    DBG_ASSERT( pExpr, "kein Ausdruck" );

    USHORT nWidth = USHRT_MAX;      // die Linien-Dicke
    USHORT nNWidth = 1;             // benannte Linien-Dicke (und default)
    CSS1BorderStyle eStyle = CSS1_BS_NONE; // Linien-Style
    Color aColor;
    BOOL bColor = FALSE;

    while( pExpr && !pExpr->GetOp() )
    {
        switch( pExpr->GetType() )
        {
        case CSS1_RGB:
        case CSS1_HEXCOLOR:
            if( pExpr->GetColor( aColor ) )
                bColor = TRUE;
            break;

        case CSS1_IDENT:
            {
                const String& rValue = pExpr->GetString();
                USHORT nValue;
                if( SvxCSS1Parser::GetEnum( aBorderWidthTable, rValue, nValue ) )
                {
                    nNWidth = nValue;
                }
                else if( SvxCSS1Parser::GetEnum( aBorderStyleTable, rValue, nValue ) )
                {
                    eStyle = (CSS1BorderStyle)nValue;
                }
                else if( pExpr->GetColor( aColor ) )
                {
                    bColor = TRUE;
                }
            }
            break;

        case CSS1_LENGTH:
            nWidth = (USHORT)pExpr->GetULength();
            break;

        case CSS1_PIXLENGTH:
            {
                BOOL bHori = nWhichLine == BOX_LINE_TOP ||
                             nWhichLine == BOX_LINE_BOTTOM;
                // Ein Pixel wird zur Haarlinie (ist huebscher)
                long nWidthL = (long)pExpr->GetNumber();
                if( nWidthL > 1 )
                {
                    long nPWidth = bHori ? 0 : nWidthL;
                    long nPHeight = bHori ? nWidthL : 0;
                    SvxCSS1Parser::PixelToTwip( nPWidth, nPHeight );
                    nWidth = (USHORT)(bHori ? nPHeight : nPWidth);
                }
                else
                    nWidth = 1;
            }
            break;
        }

        pExpr = pExpr->GetNext();
    }

    for( USHORT i=0; i<4; i++ )
    {
        USHORT nLine;
        switch( i )
        {
        case 0: nLine = BOX_LINE_TOP; break;
        case 1: nLine = BOX_LINE_BOTTOM; break;
        case 2: nLine = BOX_LINE_LEFT; break;
        case 3: nLine = BOX_LINE_RIGHT; break;
        }

        if( bAll || nLine == nWhichLine )
        {
            SvxCSS1BorderInfo *pInfo = rPropInfo.GetBorderInfo( nLine );
            pInfo->eStyle = eStyle;
            pInfo->nAbsWidth = nWidth;
            pInfo->nNamedWidth = nNWidth;
            if( bColor )
                pInfo->aColor = aColor;
        }
    }
}

static void ParseCSS1_border_xxx_width( const CSS1Expression *pExpr,
                                        SfxItemSet &rItemSet,
                                        SvxCSS1PropertyInfo& rPropInfo,
                                        const SvxCSS1Parser& rParser,
                                        USHORT nWhichLine )
{
    DBG_ASSERT( pExpr, "kein Ausdruck" );

    USHORT nWidth = USHRT_MAX;      // die Linien-Dicke
    USHORT nNWidth = 1;             // benannte Linien-Dicke (und default)

    switch( pExpr->GetType() )
    {
    case CSS1_IDENT:
        {
            USHORT nValue;
            if( SvxCSS1Parser::GetEnum( aBorderWidthTable, pExpr->GetString(), nValue ) )
            {
                nNWidth = nValue;
            }
        }
        break;

    case CSS1_LENGTH:
        nWidth = (USHORT)pExpr->GetULength();
        break;

    case CSS1_PIXLENGTH:
        {
            BOOL bHori = nWhichLine == BOX_LINE_TOP ||
                         nWhichLine == BOX_LINE_BOTTOM;
            long nWidthL = (long)pExpr->GetNumber();
            long nPWidth = bHori ? 0 : nWidthL;
            long nPHeight = bHori ? nWidthL : 0;
            SvxCSS1Parser::PixelToTwip( nPWidth, nPHeight );
            nWidth = (USHORT)(bHori ? nPHeight : nPWidth);
        }
        break;
    }

    SvxCSS1BorderInfo *pInfo = rPropInfo.GetBorderInfo( nWhichLine );
    pInfo->nAbsWidth = nWidth;
    pInfo->nNamedWidth = nNWidth;
}

/*  */

static void ParseCSS1_border_top_width( const CSS1Expression *pExpr,
                                        SfxItemSet &rItemSet,
                                        SvxCSS1PropertyInfo& rPropInfo,
                                        const SvxCSS1Parser& rParser )
{
    ParseCSS1_border_xxx_width( pExpr, rItemSet, rPropInfo, rParser, BOX_LINE_TOP );
}

static void ParseCSS1_border_right_width( const CSS1Expression *pExpr,
                                        SfxItemSet &rItemSet,
                                        SvxCSS1PropertyInfo& rPropInfo,
                                        const SvxCSS1Parser& rParser )
{
    ParseCSS1_border_xxx_width( pExpr, rItemSet, rPropInfo, rParser, BOX_LINE_RIGHT );
}

static void ParseCSS1_border_bottom_width( const CSS1Expression *pExpr,
                                        SfxItemSet &rItemSet,
                                        SvxCSS1PropertyInfo& rPropInfo,
                                        const SvxCSS1Parser& rParser )
{
    ParseCSS1_border_xxx_width( pExpr, rItemSet, rPropInfo, rParser, BOX_LINE_BOTTOM );
}

static void ParseCSS1_border_left_width( const CSS1Expression *pExpr,
                                        SfxItemSet &rItemSet,
                                        SvxCSS1PropertyInfo& rPropInfo,
                                        const SvxCSS1Parser& rParser )
{
    ParseCSS1_border_xxx_width( pExpr, rItemSet, rPropInfo, rParser, BOX_LINE_LEFT );
}

static void ParseCSS1_border_width( const CSS1Expression *pExpr,
                                    SfxItemSet &rItemSet,
                                    SvxCSS1PropertyInfo& rPropInfo,
                                    const SvxCSS1Parser& rParser )
{
    USHORT n=0;
    while( n<4 && pExpr && !pExpr->GetOp() )
    {
        USHORT nLine = n==0 || n==2 ? BOX_LINE_BOTTOM : BOX_LINE_LEFT;
        ParseCSS1_border_xxx_width( pExpr, rItemSet, rPropInfo, rParser, nLine );
        rPropInfo.CopyBorderInfo( n, SVX_CSS1_BORDERINFO_WIDTH );

        pExpr = pExpr->GetNext();
        n++;
    }
}

static void ParseCSS1_border_color( const CSS1Expression *pExpr,
                                    SfxItemSet &rItemSet,
                                    SvxCSS1PropertyInfo& rPropInfo,
                                    const SvxCSS1Parser& rParser )
{
    USHORT n=0;
    while( n<4 && pExpr && !pExpr->GetOp() )
    {
        USHORT nLine = n==0 || n==2 ? BOX_LINE_BOTTOM : BOX_LINE_LEFT;
        Color aColor;
        switch( pExpr->GetType() )
        {
        case CSS1_RGB:
        case CSS1_HEXCOLOR:
        case CSS1_IDENT:
            if( pExpr->GetColor( aColor ) )
                rPropInfo.GetBorderInfo( nLine )->aColor = aColor;
            break;
        }
        rPropInfo.CopyBorderInfo( n, SVX_CSS1_BORDERINFO_COLOR );

        pExpr = pExpr->GetNext();
        n++;
    }
}

static void ParseCSS1_border_style( const CSS1Expression *pExpr,
                                    SfxItemSet &rItemSet,
                                    SvxCSS1PropertyInfo& rPropInfo,
                                    const SvxCSS1Parser& rParser )
{
    USHORT n=0;
    while( n<4 && pExpr && !pExpr->GetOp() )
    {
        USHORT nLine = n==0 || n==2 ? BOX_LINE_BOTTOM : BOX_LINE_LEFT;
        USHORT nValue;
        if( CSS1_IDENT==pExpr->GetType() &&
            SvxCSS1Parser::GetEnum( aBorderStyleTable, pExpr->GetString(),
                                    nValue ) )
        {
            rPropInfo.GetBorderInfo( nLine )->eStyle = (CSS1BorderStyle)nValue;
        }
        rPropInfo.CopyBorderInfo( n, SVX_CSS1_BORDERINFO_STYLE );

        pExpr = pExpr->GetNext();
        n++;
    }
}


static void ParseCSS1_border_top( const CSS1Expression *pExpr,
                                  SfxItemSet &rItemSet,
                                  SvxCSS1PropertyInfo& rPropInfo,
                                  const SvxCSS1Parser& rParser )
{
    ParseCSS1_border_xxx( pExpr, rItemSet, rPropInfo, rParser, BOX_LINE_TOP, FALSE );
}

static void ParseCSS1_border_right( const CSS1Expression *pExpr,
                                    SfxItemSet &rItemSet,
                                    SvxCSS1PropertyInfo& rPropInfo,
                                    const SvxCSS1Parser& rParser )
{
    ParseCSS1_border_xxx( pExpr, rItemSet, rPropInfo, rParser, BOX_LINE_RIGHT, FALSE );
}

static void ParseCSS1_border_bottom( const CSS1Expression *pExpr,
                                     SfxItemSet &rItemSet,
                                     SvxCSS1PropertyInfo& rPropInfo,
                                     const SvxCSS1Parser& rParser )
{
    ParseCSS1_border_xxx( pExpr, rItemSet, rPropInfo, rParser, BOX_LINE_BOTTOM, FALSE );
}

static void ParseCSS1_border_left( const CSS1Expression *pExpr,
                                   SfxItemSet &rItemSet,
                                   SvxCSS1PropertyInfo& rPropInfo,
                                   const SvxCSS1Parser& rParser )
{
    ParseCSS1_border_xxx( pExpr, rItemSet, rPropInfo, rParser, BOX_LINE_LEFT, FALSE );
}

static void ParseCSS1_border( const CSS1Expression *pExpr,
                              SfxItemSet &rItemSet,
                              SvxCSS1PropertyInfo& rPropInfo,
                              const SvxCSS1Parser& rParser )
{
    ParseCSS1_border_xxx( pExpr, rItemSet, rPropInfo, rParser, 0, TRUE );
}

/*  */

static void ParseCSS1_float( const CSS1Expression *pExpr,
                             SfxItemSet &rItemSet,
                             SvxCSS1PropertyInfo& rPropInfo,
                             const SvxCSS1Parser& rParser )
{
    DBG_ASSERT( pExpr, "kein Ausdruck" );

    if( CSS1_IDENT==pExpr->GetType() )
    {
        USHORT nFloat;
        if( SvxCSS1Parser::GetEnum( aFloatTable, pExpr->GetString(), nFloat ) )
            rPropInfo.eFloat = (SvxAdjust)nFloat;
    }
}


/*  */

static void ParseCSS1_position( const CSS1Expression *pExpr,
                                SfxItemSet &rItemSet,
                                SvxCSS1PropertyInfo& rPropInfo,
                                const SvxCSS1Parser& rParser )
{
    DBG_ASSERT( pExpr, "kein Ausdruck" );

    if( CSS1_IDENT==pExpr->GetType() )
    {
        USHORT nPos;
        if( SvxCSS1Parser::GetEnum( aPositionTable, pExpr->GetString(), nPos ) )
            rPropInfo.ePosition = (SvxCSS1Position)nPos;
    }
}

/*  */

static void ParseCSS1_length( const CSS1Expression *pExpr,
                              long& rLength,
                              SvxCSS1LengthType& rLengthType,
                              BOOL bHori )
{
    switch( pExpr->GetType() )
    {
    case CSS1_IDENT:
        if( pExpr->GetString().EqualsIgnoreCaseAscii( sCSS1_PV_auto ) )
        {
            rLength = 0;
            rLengthType = SVX_CSS1_LTYPE_AUTO;
        }
        break;

    case CSS1_LENGTH:
        rLength = pExpr->GetSLength();
        rLengthType = SVX_CSS1_LTYPE_TWIP;
        break;

    case CSS1_PIXLENGTH:
    case CSS1_NUMBER:       // wegen Netscape und IE
        {
            long nWidthL = (long)pExpr->GetNumber();
            long nPWidth = bHori ? 0 : nWidthL;
            long nPHeight = bHori ? nWidthL : 0;
            SvxCSS1Parser::PixelToTwip( nPWidth, nPHeight );
            rLength = (bHori ? nPHeight : nPWidth);
            rLengthType = SVX_CSS1_LTYPE_TWIP;
        }
        break;

    case CSS1_PERCENTAGE:
        rLength = (long)pExpr->GetNumber();
        if( rLength > 100 )
            rLength = 100;
        rLengthType = SVX_CSS1_LTYPE_PERCENTAGE;
        break;
    }
}

/*  */

static void ParseCSS1_width( const CSS1Expression *pExpr,
                             SfxItemSet &rItemSet,
                             SvxCSS1PropertyInfo& rPropInfo,
                             const SvxCSS1Parser& rParser )
{
    ParseCSS1_length( pExpr, rPropInfo.nWidth, rPropInfo.eWidthType, TRUE );
}

static void ParseCSS1_height( const CSS1Expression *pExpr,
                              SfxItemSet &rItemSet,
                              SvxCSS1PropertyInfo& rPropInfo,
                              const SvxCSS1Parser& rParser )
{
    ParseCSS1_length( pExpr, rPropInfo.nHeight, rPropInfo.eHeightType, FALSE );
}

static void ParseCSS1_left( const CSS1Expression *pExpr,
                             SfxItemSet &rItemSet,
                             SvxCSS1PropertyInfo& rPropInfo,
                             const SvxCSS1Parser& rParser )
{
    ParseCSS1_length( pExpr, rPropInfo.nLeft, rPropInfo.eLeftType, TRUE );
}

static void ParseCSS1_top( const CSS1Expression *pExpr,
                           SfxItemSet &rItemSet,
                           SvxCSS1PropertyInfo& rPropInfo,
                           const SvxCSS1Parser& rParser )
{
    ParseCSS1_length( pExpr, rPropInfo.nTop, rPropInfo.eTopType, FALSE );
}

/*  */

// Feature: PrintExt
static void ParseCSS1_size( const CSS1Expression *pExpr,
                            SfxItemSet &rItemSet,
                            SvxCSS1PropertyInfo& rPropInfo,
                            const SvxCSS1Parser& rParser )
{
    USHORT n=0;
    while( n<2 && pExpr && !pExpr->GetOp() )
    {
        switch( pExpr->GetType() )
        {
        case CSS1_IDENT:
            {
                USHORT nValue;
                if( SvxCSS1Parser::GetEnum( aSizeTable, pExpr->GetString(),
                                            nValue ) )
                {
                    rPropInfo.eSizeType = (SvxCSS1SizeType)nValue;
                }
            }
            break;

        case CSS1_LENGTH:
            rPropInfo.nHeight = pExpr->GetSLength();
            if( n==0 )
                rPropInfo.nWidth = rPropInfo.nHeight;
            rPropInfo.eSizeType = SVX_CSS1_STYPE_TWIP;
            break;

        case CSS1_PIXLENGTH:
            {
                long nPHeight = (long)pExpr->GetNumber();
                long nPWidth = n==0 ? nPHeight : 0;
                SvxCSS1Parser::PixelToTwip( nPWidth, nPHeight );
                rPropInfo.nHeight = nPHeight;
                if( n==0 )
                    rPropInfo.nWidth = nPWidth;
                rPropInfo.eSizeType = SVX_CSS1_STYPE_TWIP;
            }
            break;
        }

        pExpr = pExpr->GetNext();
        n++;
    }
}

// /Feature: PrintExt

/*  */

// Feature: PrintExt

static void ParseCSS1_page_break_xxx( const CSS1Expression *pExpr,
                                      SvxCSS1PageBreak& rPBreak )
{
    if( CSS1_IDENT == pExpr->GetType() )
    {
        USHORT nValue;
        if( SvxCSS1Parser::GetEnum( aPageBreakTable, pExpr->GetString(),
                                    nValue ) )
        {
            rPBreak = (SvxCSS1PageBreak)nValue;
        }
    }
}

static void ParseCSS1_page_break_before( const CSS1Expression *pExpr,
                                         SfxItemSet &rItemSet,
                                         SvxCSS1PropertyInfo& rPropInfo,
                                         const SvxCSS1Parser& rParser )
{
    ParseCSS1_page_break_xxx( pExpr, rPropInfo.ePageBreakBefore );
}

static void ParseCSS1_page_break_after( const CSS1Expression *pExpr,
                                        SfxItemSet &rItemSet,
                                        SvxCSS1PropertyInfo& rPropInfo,
                                        const SvxCSS1Parser& rParser )
{
    ParseCSS1_page_break_xxx( pExpr, rPropInfo.ePageBreakAfter );
}

static void ParseCSS1_page_break_inside( const CSS1Expression *pExpr,
                                         SfxItemSet &rItemSet,
                                         SvxCSS1PropertyInfo& rPropInfo,
                                         const SvxCSS1Parser& rParser )
{
    SvxCSS1PageBreak eBreak;
    ParseCSS1_page_break_xxx( pExpr, eBreak );

    BOOL bSetSplit = FALSE, bSplit = TRUE;
    switch( eBreak )
    {
    case SVX_CSS1_PBREAK_AUTO:
        bSetSplit = TRUE;
        break;
    case SVX_CSS1_PBREAK_AVOID:
        bSplit = FALSE;
        bSetSplit = TRUE;
        break;
    }

    if( bSetSplit )
        rItemSet.Put( SvxFmtSplitItem( bSplit, aItemIds.nFmtSplit ) );
}

static void ParseCSS1_widows( const CSS1Expression *pExpr,
                              SfxItemSet &rItemSet,
                              SvxCSS1PropertyInfo& rPropInfo,
                              const SvxCSS1Parser& rParser )
{
    if( CSS1_NUMBER == pExpr->GetType() )
    {
        BYTE nVal = pExpr->GetNumber() <= 255
                        ? (BYTE)pExpr->GetNumber()
                        : 255;
        SvxWidowsItem aWidowsItem( nVal, aItemIds.nWidows );
        rItemSet.Put( aWidowsItem );
    }
}

static void ParseCSS1_orphans( const CSS1Expression *pExpr,
                               SfxItemSet &rItemSet,
                               SvxCSS1PropertyInfo& rPropInfo,
                               const SvxCSS1Parser& rParser )
{
    if( CSS1_NUMBER == pExpr->GetType() )
    {
        BYTE nVal = pExpr->GetNumber() <= 255
                        ? (BYTE)pExpr->GetNumber()
                        : 255;
        SvxOrphansItem aOrphansItem( nVal, aItemIds.nOrphans );
        rItemSet.Put( aOrphansItem );
    }
}
// /Feature: PrintExt

/*  */

// die Zuordung Property zu parsender Funktion
struct CSS1PropEntry
{
    union
    {
        const sal_Char  *sName;
        String          *pName;
    };
    FnParseCSS1Prop pFunc;
};

#define CSS1_PROP_ENTRY(p) \
    {   sCSS1_P_##p, ParseCSS1_##p }


// die Tabelle mit den Zuordnungen
static CSS1PropEntry __FAR_DATA aCSS1PropFnTab[] =
{
    CSS1_PROP_ENTRY(background),
    CSS1_PROP_ENTRY(background_color),
    CSS1_PROP_ENTRY(border_top_width),
    CSS1_PROP_ENTRY(border_right_width),
    CSS1_PROP_ENTRY(border_bottom_width),
    CSS1_PROP_ENTRY(border_left_width),
    CSS1_PROP_ENTRY(border_width),
    CSS1_PROP_ENTRY(border_color),
    CSS1_PROP_ENTRY(border_style),
    CSS1_PROP_ENTRY(border_top),
    CSS1_PROP_ENTRY(border_right),
    CSS1_PROP_ENTRY(border_bottom),
    CSS1_PROP_ENTRY(border_left),
    CSS1_PROP_ENTRY(border),
    CSS1_PROP_ENTRY(color),
    CSS1_PROP_ENTRY(float),
    CSS1_PROP_ENTRY(font_size),
    CSS1_PROP_ENTRY(font_family),
    CSS1_PROP_ENTRY(font_style),
    CSS1_PROP_ENTRY(font_variant),
    CSS1_PROP_ENTRY(font_weight),
    CSS1_PROP_ENTRY(letter_spacing),
    CSS1_PROP_ENTRY(line_height),
    CSS1_PROP_ENTRY(font),
    CSS1_PROP_ENTRY(text_align),
    CSS1_PROP_ENTRY(text_decoration),
    CSS1_PROP_ENTRY(text_indent),
    CSS1_PROP_ENTRY(margin_left),
    CSS1_PROP_ENTRY(margin_right),
    CSS1_PROP_ENTRY(margin_top),
    CSS1_PROP_ENTRY(margin_bottom),
    CSS1_PROP_ENTRY(margin),
    CSS1_PROP_ENTRY(padding_top),
    CSS1_PROP_ENTRY(padding_bottom),
    CSS1_PROP_ENTRY(padding_left),
    CSS1_PROP_ENTRY(padding_right),
    CSS1_PROP_ENTRY(padding),
    CSS1_PROP_ENTRY(position),
    CSS1_PROP_ENTRY(left),
    CSS1_PROP_ENTRY(top),
    CSS1_PROP_ENTRY(width),
    CSS1_PROP_ENTRY(height),
// Feature: PrintExt
    CSS1_PROP_ENTRY(size),
    CSS1_PROP_ENTRY(page_break_before),
    CSS1_PROP_ENTRY(page_break_after),
    CSS1_PROP_ENTRY(page_break_inside),
    CSS1_PROP_ENTRY(widows),
    CSS1_PROP_ENTRY(orphans)
// /Feature: PrintExt
};

/*  */

static int __FAR_DATA bSortedPropFns = FALSE;

extern "C"
{
static int
#if defined( WNT )
 __cdecl
#endif
#if defined( ICC )
 _Optlink
#endif
    CSS1PropEntryCompare( const void *pFirst, const void *pSecond)
{
    int nRet;
    if( ((CSS1PropEntry*)pFirst)->pFunc )
    {
        if( ((CSS1PropEntry*)pSecond)->pFunc )
            nRet = strcmp( ((CSS1PropEntry*)pFirst)->sName ,
                    ((CSS1PropEntry*)pSecond)->sName );
        else
            nRet = -1 * ((CSS1PropEntry*)pSecond)->pName->CompareToAscii(
                            ((CSS1PropEntry*)pFirst)->sName );
    }
    else
    {
        if( ((CSS1PropEntry*)pSecond)->pFunc )
            nRet = ((CSS1PropEntry*)pFirst)->pName->CompareToAscii(
                        ((CSS1PropEntry*)pSecond)->sName );
        else
            nRet = ((CSS1PropEntry*)pFirst)->pName->CompareTo(
                        *((CSS1PropEntry*)pSecond)->pName );
    }

    return nRet;
}
}

void SvxCSS1Parser::ParseProperty( const String& rProperty,
                                   const CSS1Expression *pExpr )
{
    DBG_ASSERT( pItemSet, "DeclarationParsed() ohne ItemSet" );

    if( !bSortedPropFns )
    {
        qsort( (void*) aCSS1PropFnTab,
                sizeof( aCSS1PropFnTab ) / sizeof( CSS1PropEntry ),
                sizeof( CSS1PropEntry ),
                CSS1PropEntryCompare );
        bSortedPropFns = TRUE;
    }

    String aTmp( rProperty );
    aTmp.ToLowerAscii();

    CSS1PropEntry aSrch;
    aSrch.pName = &aTmp;

    void* pFound;
    if( 0 != ( pFound = bsearch( (char *) &aSrch,
                        (void*) aCSS1PropFnTab,
                        sizeof( aCSS1PropFnTab ) / sizeof( CSS1PropEntry ),
                        sizeof( CSS1PropEntry ),
                        CSS1PropEntryCompare )))
    {
        (((CSS1PropEntry*)pFound)->pFunc)( pExpr, *pItemSet, *pPropInfo, *this );
    }
}


/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/html/svxcss1.cxx,v 1.1.1.1 2000-09-18 17:14:56 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.70  2000/09/18 16:04:47  willem.vandorp
      OpenOffice header added.

      Revision 1.69  2000/06/26 09:52:38  jp
      must change: GetAppWindow->GetDefaultDevice

      Revision 1.68  2000/04/10 12:20:57  mib
      unicode

      Revision 1.67  2000/03/03 15:21:01  os
      StarView remainders removed

      Revision 1.66  2000/02/11 14:37:41  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.65  1999/09/17 12:14:44  mib
      support of multiple and non system text encodings

      Revision 1.64  1999/06/11 14:44:24  MIB
      Individuelle Umrandungs-Abstaende


      Rev 1.63   11 Jun 1999 16:44:24   MIB
   Individuelle Umrandungs-Abstaende

      Rev 1.62   15 Apr 1999 13:44:52   MIB
   background-color

      Rev 1.61   26 Jan 1999 14:44:58   MIB
   #60875#: Beim Umrechnen von Lanegen in Twip Rundung beachten

      Rev 1.60   14 Jan 1999 13:28:28   MIB
   #60776#: Festen statt minimalen Zeilen-Abstand einstellen

      Rev 1.59   06 Nov 1998 15:33:36   MIB
   #59043#: negative Absatz-Einzuege

      Rev 1.58   19 Oct 1998 11:07:00   MIB
   #58088#: top/left/width/height: Zahlen ohne Einheit wie Pixel behandeln

      Rev 1.57   09 Oct 1998 16:02:50   MIB
   #57813#: Memory-Leak beseitigt

      Rev 1.56   08 Sep 1998 16:22:52   MIB
   #56120#: margin-Property kommt jetzt auch mit nicht unterstuetzten Einheiten zurecht

      Rev 1.55   13 Jul 1998 09:20:26   MIB
   #50966#: Fonts optional ignorieren

      Rev 1.54   21 Apr 1998 13:47:24   MIB
   fix: Keine Bookmark fuer abs-pos Objekte mit ID einfuegen

      Rev 1.53   15 Apr 1998 14:50:48   MIB
   Zwei-seitige Printing-Extensions

      Rev 1.52   03 Apr 1998 15:11:08   MIB
   CSS1-Padding

      Rev 1.51   31 Mar 1998 11:14:44   MIB
   1 Pixel berite Linie wird Haarlinie

      Rev 1.50   25 Mar 1998 12:10:58   MIB
   unneotige defines weg

      Rev 1.49   20 Mar 1998 10:42:42   MIB
   Font-Listen in Font-Attributen

      Rev 1.48   14 Mar 1998 19:01:06   MIB
   Absolute-Positioning freigeschaltet

      Rev 1.47   13 Mar 1998 09:24:30   MIB
   Item-Ids nur definieren, wenn hintids.hxx nicht includet wird

      Rev 1.46   20 Feb 1998 19:02:22   MA
   header

      Rev 1.45   02 Dec 1997 09:16:20   MA
   includes

      Rev 1.44   20 Oct 1997 09:50:24   MIB
   Nur fuer absolute positioning benoetigten Code groesstenteils auskommentiert

      Rev 1.43   17 Oct 1997 13:18:40   MIB
   SvxXSS1Parser um fremde Which-Ids erweiterbar

      Rev 1.42   10 Oct 1997 10:15:56   MIB
   CSS1-Printing-Ext: @page,page-break-before/after (noch kein left/right)

      Rev 1.41   12 Sep 1997 11:16:00   OS
   ITEMID_* definiert

      Rev 1.40   12 Aug 1997 13:47:08   OS
   Header-Umstellung

      Rev 1.39   11 Aug 1997 14:05:30   OM
   Headerfile-Umstellung

      Rev 1.38   31 Jul 1997 10:42:24   MIB
   absolute poaitioning auch fuer id/class

      Rev 1.37   30 Jul 1997 12:29:00   MIB
   absolute positioning

      Rev 1.36   02 Jul 1997 17:13:46   MIB
   neue CSS1-Border-Properties

      Rev 1.35   01 Jul 1997 14:10:56   MIB
   font-Property an W3C-Recommandation/Netscape 4.0 angepasst

      Rev 1.34   13 Jun 1997 17:07:56   MIB
   Ein par MS-IE Syntax-Goodies nachgebaut

      Rev 1.33   13 Jun 1997 11:56:24   MIB
   CLASS und ID CSS1-Optionen auswerten

      Rev 1.32   06 May 1997 11:06:24   TRI
   ICC brauchte Optlink

      Rev 1.31   23 Apr 1997 12:31:14   MIB
   fix: font-family: 'sans-serif' wie font-family: sans-serif behandeln

      Rev 1.30   22 Apr 1997 17:44:50   MIB
   fix #39160#: In font-family auch zusammengestzte Namen ohne Haekchen parsen

      Rev 1.29   17 Apr 1997 19:31:28   MIB
   memory leak beseitigt

      Rev 1.28   10 Mar 1997 16:57:50   MIB
   fix #37356#: negative Absatz-Abstaende auf 0 abbilden

      Rev 1.27   28 Jan 1997 11:10:34   MIB
   float parsen

      Rev 1.26   20 Dec 1996 14:00:44   MIB
   Warnings

      Rev 1.25   17 Dec 1996 10:41:06   MIB
   neue Linienstiele ausnutzen

      Rev 1.24   12 Dec 1996 16:55:54   MIB
   Tabellen mit doppelter Umrandung

      Rev 1.23   25 Nov 1996 16:55:44   MIB
   fix #32725#: Oberer Absatz-Abstand wurde ignoriert

      Rev 1.22   29 Oct 1996 15:35:28   MIB
   Flags fuer gesetzte/nicht-gesetzte Attribut-Werte

      Rev 1.21   23 Oct 1996 19:49:06   JP
   String Umstellung: [] -> GetChar()

      Rev 1.20   22 Oct 1996 10:28:38   MIB
   Umstellung von CSS1 auf Klein-Buchstaben (u.a. wegen Amaya)

      Rev 1.19   21 Oct 1996 08:58:18   MIB
   bug fix: boder: solid ging nicht

      Rev 1.18   16 Oct 1996 09:59:22   NF
   includes...

      Rev 1.17   15 Oct 1996 13:42:36   MIB
   letter-spacing/Laufweite imp./exp.

      Rev 1.16   14 Oct 1996 18:49:14   MIB
   Am Box-Item Abstand zur Umrandung setzen

      Rev 1.15   14 Oct 1996 16:42:50   MIB
   Import CSS1-Umrandung (border)

      Rev 1.14   13 Oct 1996 12:14:16   MIB
   first-letter-Pseudo-Element/DropCaps

      Rev 1.13   11 Oct 1996 16:49:04   MIB
   font-variant und andere Anpassungen an Draft vom 11.09.96

      Rev 1.12   20 Sep 1996 18:00:48   MIB
   Itemset-Optimierungen

      Rev 1.11   19 Aug 1996 18:21:02   MIB
   Anpassungen an Draft vom 26.Juli 96

      Rev 1.10   14 Aug 1996 16:22:24   MIB
   gcc und msvc: statt *aStr nicht aStr[0] sondern aStr[(USHORT)0]

      Rev 1.9   13 Aug 1996 21:11:44   sdo
   GCC

      Rev 1.8   12 Aug 1996 10:31:16   MIB
   Anpassungen an draft vom 26.7.96, Background-Property, Scannen von Farben verb.

      Rev 1.7   07 Aug 1996 13:21:30   MIB
   Import von color und text-decoration

      Rev 1.6   10 Jul 1996 15:42:04   MIB
   Includes fuer precompiled header gerichtet

      Rev 1.5   20 Jun 1996 12:34:16   MIB
   font-style: oblique nun wie italic

      Rev 1.4   18 Jun 1996 12:19:28   MIB
   margin[-[left|right|top|bottom]]?, text-indent

      Rev 1.3   17 Jun 1996 16:00:56   MIB
   Erweiterung um Font-Properties

      Rev 1.2   16 Jun 1996 14:33:36   MIB
   Loops ausgealgert

      Rev 1.1   14 Jun 1996 20:13:58   MIB
   Properties koennen mehrere Items erzeugen, font-style-Property

      Rev 1.0   14 Jun 1996 17:43:12   MIB
   Initial revision.

*************************************************************************/

diff --git a/sw/source/filter/html/svxcss1.hxx b/sw/source/filter/html/svxcss1.hxx
new file mode 100644
index 0000000..85863f5
--- /dev/null
+++ b/sw/source/filter/html/svxcss1.hxx
@@ -0,0 +1,462 @@
/*************************************************************************
 *
 *  $RCSfile: svxcss1.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:56 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _SVXCSS1_HXX
#define _SVXCSS1_HXX

#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif

#ifndef _SFXITEMSET_HXX //autogen
#include <svtools/itemset.hxx>
#endif

#ifndef _SVX_SVXENUM_HXX //autogen
#include <svx/svxenum.hxx>
#endif

#ifndef _SVSTDARR_HXX
#define _SVSTDARR_USHORTS
#include <svtools/svstdarr.hxx>
#endif
#ifndef _RTL_TEXTENC_H
#include <rtl/textenc.h>
#endif

#ifndef _PARCSS1_HXX
#include "parcss1.hxx"
#endif

class SfxItemPool;
class SvxBoxItem;
class FontList;

/*  */

enum SvxCSS1Position
{
    SVX_CSS1_POS_NONE,          // nichts angegeben
    SVX_CSS1_POS_STATIC,        // normal
    SVX_CSS1_POS_ABSOLUTE,      // absolut
    SVX_CSS1_POS_RELATIVE,      // relativ
    SVX_CSS1_POS_END
};


enum SvxCSS1LengthType
{
    SVX_CSS1_LTYPE_NONE,        // nichts angegeben
    SVX_CSS1_LTYPE_AUTO,        // automatisch
    SVX_CSS1_LTYPE_TWIP,        // twip
    SVX_CSS1_LTYPE_PERCENTAGE,  // %-Angabe
    SVX_CSS1_LTYPE_END
};

// Feature: PrintExt
enum SvxCSS1SizeType
{
    SVX_CSS1_STYPE_NONE,        // nichts angegeben
    SVX_CSS1_STYPE_AUTO,        // automatisch
    SVX_CSS1_STYPE_TWIP,        // twip
    SVX_CSS1_STYPE_LANDSCAPE,   // Landscape
    SVX_CSS1_STYPE_PORTRAIT,    // Landscape
    SVX_CSS1_STYPE_END
};

enum SvxCSS1PageBreak
{
    SVX_CSS1_PBREAK_NONE,       // nichts angegeben
    SVX_CSS1_PBREAK_AUTO,       // automatisch
    SVX_CSS1_PBREAK_ALWAYS,     // immer
    SVX_CSS1_PBREAK_AVOID,      // nie
    SVX_CSS1_PBREAK_LEFT,       // naechste Seite ist eine linke
    SVX_CSS1_PBREAK_RIGHT,      // naechste Seite ist eine rechte
    SVX_CSS1_PBREAK_END
};

// /Feature: PrintExt

/*  */

struct CSS1PropertyEnum
{
    const sal_Char *pName;  // Wert einer Property
    sal_uInt16 nEnum;           // und der dazugehoerige Wert eines Enums
};


/*  */

class SvxBorderLine;

SV_DECL_PTRARR_DEL( CSS1Selectors, CSS1Selector*, 1, 1 )

#define SVX_CSS1_BORDERINFO_WIDTH 1
#define SVX_CSS1_BORDERINFO_COLOR 2
#define SVX_CSS1_BORDERINFO_STYLE 4

struct SvxCSS1BorderInfo;
class SvxCSS1PropertyInfo
{
    SvxCSS1BorderInfo *aBorderInfos[4];

    void DestroyBorderInfos();

public:

    String aId;             // ID fuer Bookmarks, Rahmen etc.

    sal_Bool bTopMargin : 1;
    sal_Bool bBottomMargin : 1;

    sal_Bool bLeftMargin : 1;
    sal_Bool bRightMargin : 1;
    sal_Bool bTextIndent : 1;

    SvxAdjust eFloat;

    SvxCSS1Position ePosition;

    sal_uInt16 nTopBorderDistance;
    sal_uInt16 nBottomBorderDistance;
    sal_uInt16 nLeftBorderDistance;
    sal_uInt16 nRightBorderDistance;

    long nLeft, nTop;
    long nWidth, nHeight;
    long nLeftMargin, nRightMargin;

    SvxCSS1LengthType eLeftType, eTopType;
    SvxCSS1LengthType eWidthType, eHeightType;

// Feature: PrintExt
    SvxCSS1SizeType eSizeType;

    SvxCSS1PageBreak ePageBreakBefore;
    SvxCSS1PageBreak ePageBreakAfter;
// /Feature: PrintExt

    SvxCSS1PropertyInfo();
    SvxCSS1PropertyInfo( const SvxCSS1PropertyInfo& rProp );
    ~SvxCSS1PropertyInfo();

    void Merge( const SvxCSS1PropertyInfo& rProp );

    void Clear();

    SvxCSS1BorderInfo *GetBorderInfo( sal_uInt16 nLine, sal_Bool bCreate=sal_True );
    void CopyBorderInfo( sal_uInt16 nSrcLine, sal_uInt16 nDstLine, sal_uInt16 nWhat );
    void CopyBorderInfo( sal_uInt16 nCount, sal_uInt16 nWhat );

    void SetBoxItem( SfxItemSet& rItemSet, sal_uInt16 nMinBorderDist,
                     const SvxBoxItem* pDflt=0, sal_Bool bTable = sal_False );
};

class SvxCSS1MapEntry
{
    String aKey;
    SfxItemSet aItemSet;
    SvxCSS1PropertyInfo aPropInfo;

public:

    SvxCSS1MapEntry( SfxItemPool& rPool, const sal_uInt16 *pWhichMap ) :
        aItemSet( rPool, pWhichMap )
    {}

    SvxCSS1MapEntry( const String& rKey, const SfxItemSet& rItemSet,
                     const SvxCSS1PropertyInfo& rProp );


    const SfxItemSet& GetItemSet() const { return aItemSet; }
    SfxItemSet& GetItemSet() { return aItemSet; }

    const SvxCSS1PropertyInfo& GetPropertyInfo() const { return aPropInfo; }
    SvxCSS1PropertyInfo& GetPropertyInfo() { return aPropInfo; }

    const String& GetKey()  const { return aKey; }
    // TODO: ToUpperAscii -> ???
    void SetKey( const String& rKey ) { aKey = rKey; aKey.ToUpperAscii(); }

    friend sal_Bool operator==( const SvxCSS1MapEntry& rE1,
                            const SvxCSS1MapEntry& rE2 );
    friend sal_Bool operator<( const SvxCSS1MapEntry& rE1,
                            const SvxCSS1MapEntry& rE2 );
};

typedef SvxCSS1MapEntry *SvxCSS1MapEntryPtr;
SV_DECL_PTRARR_SORT_DEL( SvxCSS1Map, SvxCSS1MapEntryPtr, 5, 5 )


#if !defined( MAC ) && !defined( ICC ) && !defined( BLC )
inline sal_Bool operator==( const SvxCSS1MapEntry& rE1, const SvxCSS1MapEntry& rE2 )
{
    return  rE1.aKey==rE2.aKey;
}

inline sal_Bool operator<( const SvxCSS1MapEntry& rE1,  const SvxCSS1MapEntry& rE2 )
{
    return  rE1.aKey<rE2.aKey;
}
#endif

// Diese Klasse bereitet den Output des CSS1-Parsers auf,
// indem die CSS1-Properties in SvxItem(Set)s umgewandelt werden.
// Ausserdem werden die Selektoren samt zugehoeriger Item-Set
// gespeichert.
// Ein abgeleiteter Parser kann dies fuer einzelne Selektoren unterdruecken,
// indem er die Methode StyleParsed ueberlaed.

class SvxCSS1Parser : public CSS1Parser
{
    CSS1Selectors aSelectors;   // Liste der "offenen" Selectoren

    SvxCSS1Map aIds;
    SvxCSS1Map aClasses;
    SvxCSS1Map aPages;
    SvxCSS1Map aTags;

    SfxItemSet *pSheetItemSet;  // der Item-Set fuer Style-Sheets
    SfxItemSet *pItemSet;       // der aktuelle Item-Set
    SvxCSS1MapEntry *pSearchEntry;

    SvxCSS1PropertyInfo *pSheetPropInfo;
    SvxCSS1PropertyInfo *pPropInfo;

    sal_uInt16 nMinFixLineSpace;    // Mindest-Abstand fuer festen Zeilenabstand

    rtl_TextEncoding    eDfltEnc;

    sal_Bool bIgnoreFontFamily;

    void ParseProperty( const String& rProperty,
                        const CSS1Expression *pExpr );

    SvUShorts aWhichMap;        // Which-Map des Parser

protected:

    // Diese Methode wird fuer jeden Selektor mit dem zugehoerigen
    // Item-Set aufgerufen. Fuer einen Selektor koennen mehrere
    // Aufrufe erfolgen.
    // wenn sal_True zuruckgegeben wird, wird der Item-Set bzw. der
    // Selektor nicht mehr gespeichert!
    // Der ItemSet darf entsprechend modifiziert werden!
    // Die Implementierung dieser Methode gibt sal_False zurueck.
    virtual sal_Bool StyleParsed( const CSS1Selector *pSelector,
                              SfxItemSet& rItemSet,
                              SvxCSS1PropertyInfo& rPropInfo );

    // Diese Methode wird aufgerufen, wenn ein Selektor geparst wurde
    // Wenn bFirst gesetzt ist, wird der Inhalt von aItemSet in alle
    // zuletzt angelegten Styles kopiert.
    // Diese Methode sollte in abgleiteten Parsern nicht mehr
    // ueberladen werden!
    virtual sal_Bool SelectorParsed( const CSS1Selector *pSelector,
                                 sal_Bool bFirst );

    // Diese Methode wird fuer jede geparste Property aufgerufen
    // sie fuegt das Item in den ItemSet 'pItemSet' ein
    // Sie sollte in abgeleiteten Parsern nicht mehr ueberladen werden!
    virtual sal_Bool DeclarationParsed( const String& rProperty,
                                    const CSS1Expression *pExpr );

public:


    SvxCSS1Parser( SfxItemPool& rPool,
                   sal_uInt16 nMinFixLineSp,
                   sal_uInt16 *pWhichIds=0, sal_uInt16 nWhichIds=0 );
    virtual ~SvxCSS1Parser();

    sal_Bool IsIgnoreFontFamily() const { return bIgnoreFontFamily; }
    void SetIgnoreFontFamily( sal_Bool bSet ) { bIgnoreFontFamily = bSet; }

    // Parsen eines Style-Sheets. Fuer jeden gefundenen Selektor
    // wird StyleParsed mit dem entsprechenem Item-Set aufgerufen
    virtual sal_Bool ParseStyleSheet( const String& rIn );

    // Parsen einer Style-Option. Hier wird einfach nur der Item-Set
    // gefuellt.
    sal_Bool ParseStyleOption( const String& rIn, SfxItemSet& rItemSet,
                           SvxCSS1PropertyInfo& rPropInfo );

    // Umwandeln eines Strings in den Wert eines Enums
    static sal_Bool GetEnum( const CSS1PropertyEnum *pPropTable,
                         const String& rValue, sal_uInt16 &rEnum );

    // Pixel in Twips wandeln
    static void PixelToTwip( long &nWidth, long &nHeight );

    // Die Breite einer Umrandung einstellen
    static void SetBorderWidth( SvxBorderLine& aBorderLine, sal_uInt16 nWidth,
                                sal_Bool bDouble, sal_Bool bTable=sal_False );

    // Die Font-Hoehe fuer eine bestimmte Font-Groesse (0-6) ermitteln
    virtual sal_uInt32 GetFontHeight( sal_uInt16 nSize ) const;

    virtual const FontList *GetFontList() const;

    const sal_uInt16 *GetWhichMap() const { return aWhichMap.GetData(); }

    SvxCSS1MapEntry *GetMapEntry( const String& rKey,
                                  const SvxCSS1Map& rMap ) const;

    void InsertMapEntry( const String& rKey, const SfxItemSet& rItemSet,
                         const SvxCSS1PropertyInfo& rProp, SvxCSS1Map& rMap );

    void InsertId( const String& rId, const SfxItemSet& rItemSet,
                   const SvxCSS1PropertyInfo& rProp );

    inline SvxCSS1MapEntry *GetId( const String& rId ) const;

    void InsertClass( const String& rClass, const SfxItemSet& rItemSet,
                      const SvxCSS1PropertyInfo& rProp );

    inline SvxCSS1MapEntry *GetClass( const String& rClass ) const;

    inline void InsertPage( const String& rPage, sal_Bool bPseudo,
                            const SfxItemSet& rItemSet,
                            const SvxCSS1PropertyInfo& rProp );

    inline SvxCSS1MapEntry *GetPage( const String& rPage, sal_Bool bPseudo ) const;

    inline SvxCSS1MapEntry *GetPage( sal_uInt16 i ) const { return aPages[i]; }
    sal_uInt16 GetPageCount() const { return aPages.Count(); }

    void InsertTag( const String& rTag, const SfxItemSet& rItemSet,
                      const SvxCSS1PropertyInfo& rProp );

    inline SvxCSS1MapEntry *GetTag( const String& rTag ) const;

    void MergeStyles( const SfxItemSet& rSrcSet,
                      const SvxCSS1PropertyInfo& rSrcInfo,
                      SfxItemSet& rTargetSet,
                      SvxCSS1PropertyInfo& rTargetInfo,
                      sal_Bool bSmart );

    sal_uInt16 GetMinFixLineSpace() const { return nMinFixLineSpace; }

    virtual void SetDfltEncoding( rtl_TextEncoding eEnc );
    rtl_TextEncoding GetDfltEncoding() const { return eDfltEnc; }
};

inline void SvxCSS1Parser::InsertId( const String& rId,
                                     const SfxItemSet& rItemSet,
                                     const SvxCSS1PropertyInfo& rProp )
{
    InsertMapEntry( rId, rItemSet, rProp, aIds );
}

inline SvxCSS1MapEntry *SvxCSS1Parser::GetId( const String& rId ) const
{
    return GetMapEntry( rId, aIds );
}

inline void SvxCSS1Parser::InsertClass( const String& rClass,
                                        const SfxItemSet& rItemSet,
                                        const SvxCSS1PropertyInfo& rProp )
{
    InsertMapEntry( rClass, rItemSet, rProp, aClasses );
}

inline SvxCSS1MapEntry *SvxCSS1Parser::GetClass( const String& rClass ) const
{
    return GetMapEntry( rClass, aClasses );
}

inline void SvxCSS1Parser::InsertPage( const String& rPage,
                                       sal_Bool bPseudo,
                                       const SfxItemSet& rItemSet,
                                       const SvxCSS1PropertyInfo& rProp )
{
    String aKey( rPage );
    if( bPseudo )
        aKey.Insert( ':', 0 );
    InsertMapEntry( aKey, rItemSet, rProp, aPages );
}

inline SvxCSS1MapEntry *SvxCSS1Parser::GetPage( const String& rPage,
                                                sal_Bool bPseudo ) const
{
    String aKey( rPage );
    if( bPseudo )
        aKey.Insert( ':', 0 );
    return GetMapEntry( aKey, aPages );
}

inline void SvxCSS1Parser::InsertTag( const String& rTag,
                                        const SfxItemSet& rItemSet,
                                        const SvxCSS1PropertyInfo& rProp )
{
    InsertMapEntry( rTag, rItemSet, rProp, aTags );
}

inline SvxCSS1MapEntry *SvxCSS1Parser::GetTag( const String& rTag ) const
{
    return GetMapEntry( rTag, aTags );
}


#endif


diff --git a/sw/source/filter/html/swcss1.hxx b/sw/source/filter/html/swcss1.hxx
new file mode 100644
index 0000000..386045d
--- /dev/null
+++ b/sw/source/filter/html/swcss1.hxx
@@ -0,0 +1,257 @@
/*************************************************************************
 *
 *  $RCSfile: swcss1.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:56 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _SWCSS1_HXX
#define _SWCSS1_HXX

#ifndef _POOLFMT_HXX
#include "poolfmt.hxx"
#endif

#include "svxcss1.hxx"

class SwDoc;
class SwFmt;
class SwCharFmt;
class SwTxtFmtColl;
class SvxBrushItem;
class SwFmtDrop;
class SwPageDesc;

// Dieser Header seiht zwar harmlos aus, included aber eben doch
// ganz unauffaellig das ein oder andere! Andererseits wird diese
// Klasse recht selten benoetigt. Deshalb ein eigener Header.


class SwCSS1Parser : public SvxCSS1Parser
{
    SwDoc *pDoc;

    ULONG aFontHeights[7];

    USHORT nDropCapCnt;

    BOOL bIsNewDoc : 1;

    BOOL bBodyBGColorSet : 1;
    BOOL bBodyBackgroundSet : 1;
    BOOL bBodyTextSet : 1;
    BOOL bBodyLinkSet : 1;
    BOOL bBodyVLinkSet : 1;

    BOOL bSetFirstPageDesc : 1;
    BOOL bSetRightPageDesc : 1;

    BOOL bTableHeaderTxtCollSet : 1;
    BOOL bTableTxtCollSet : 1;

    BOOL bLinkCharFmtsSet : 1;

    // die Vorlagen fuer DL anlegen
    SwTxtFmtColl* GetDefListTxtFmtColl( USHORT nCollId, USHORT nDeep );

    const SwPageDesc* GetPageDesc( USHORT nPoolId, BOOL bCreate );

    void SetTableTxtColl( BOOL bHeader );
    void SetLinkCharFmts();

protected:
    virtual BOOL StyleParsed( const CSS1Selector *pSelector,
                              SfxItemSet& rItemSet,
                              SvxCSS1PropertyInfo& rPropInfo );
public:
    SwCSS1Parser( SwDoc *pDoc, ULONG aFHeight[7], BOOL bNewDoc );
    virtual ~SwCSS1Parser();

    virtual BOOL ParseStyleSheet( const String& rIn );

    // Die Font-Hoehe fuer eine bestimmte Font-Groesse (0-6) ermitteln
    virtual ULONG GetFontHeight( USHORT nSize ) const;

    // Die aktuelle Font-Liste holen (auch 0 ist erlaubt)
    virtual const FontList *GetFontList() const;

    // das Zeichen-Format zu einem Token und einer ggf leeren Klasse
    // ermitteln
    SwCharFmt* GetChrFmt( USHORT nToken, const String& rClass ) const;

    // eine TextFmtColl zu einer Pool-Id ermitteln
    SwTxtFmtColl *GetTxtFmtColl( USHORT nTxtColl, const String& rClass );

    // This methods do the same as the one of SwDoc, but change the
    // encoding if required.
    SwTxtFmtColl *GetTxtCollFromPool( USHORT nPoolId ) const;
    SwCharFmt *GetCharFmtFromPool( USHORT nPoolId ) const;

    // Die linke oder rechte Seiten-Vorlage holen. In Dokumenten mit nur
    // einer Vorlage gibt es nur eine rechtee Seite.
    // Ansonsten ist die rechte Seite die HTML-Poolvorlage und die linke
    // eine Benutzter-Vorlage, die on-demand angelegt wird, wenn
    // bCreate gesetzt ist.
    SwPageDesc* GetMasterPageDesc();
    inline const SwPageDesc* GetFirstPageDesc( BOOL bCreate=FALSE );
    inline const SwPageDesc* GetRightPageDesc( BOOL bCreate=FALSE );
    inline const SwPageDesc* GetLeftPageDesc( BOOL bCreate=FALSE );

    // Attribute an der HTML-Seitenvorlage setzen (gesetzte Attribute
    // werden aus dem Item-Set geloescht ). Wird fuer's BODY-Tag
    // aufgerufen.
    void SetPageDescAttrs( const SvxBrushItem *pBrush,
                           SfxItemSet *pItemSet=0 );

    void ChgPageDesc( const SwPageDesc *pPageDesc,
                      const SwPageDesc& rNewPageDesc );

    // Wird fuer @page aufgerufen.
    void SetPageDescAttrs( const SwPageDesc *pPageDesc, SfxItemSet& rItemSet,
                           const SvxCSS1PropertyInfo& rPropInfo );

    // Fuellen eines DropCap-Attributs
    void FillDropCap( SwFmtDrop& rDrop, SfxItemSet& rItemSet,
                      const String *pName=0 );

    BOOL SetFmtBreak( SfxItemSet& rItemSet,
                      const SvxCSS1PropertyInfo& rPropInfo );


    static void AddClassName( String& rFmtName, const String& rClass );

    static inline void AddFirstLetterExt( String& rFmtName );

    static BOOL MayBePositioned( const SvxCSS1PropertyInfo& rPropInfo,
                                 BOOL bAutoWidth=FALSE );

    BOOL IsBodyBGColorSet() const { return bBodyBGColorSet; }
    BOOL IsBodyBackgroundSet() const { return bBodyBackgroundSet; }
    BOOL IsBodyTextSet() const { return bBodyTextSet; }
    BOOL IsBodyLinkSet() const { return bBodyLinkSet; }
    BOOL IsBodyVLinkSet() const { return bBodyVLinkSet; }

    BOOL IsSetFirstPageDesc() const { return bSetFirstPageDesc; }
    BOOL IsSetRightPageDesc() const { return bSetRightPageDesc; }

    void SetBodyBGColorSet() { bBodyBGColorSet = TRUE; }
    void SetBodyBackgroundSet() { bBodyBackgroundSet = TRUE; }
    void SetBodyTextSet() { bBodyTextSet = TRUE; }
    void SetBodyLinkSet() { bBodyLinkSet = TRUE; }
    void SetBodyVLinkSet() { bBodyVLinkSet = TRUE; }

    const SvxBrushItem& GetPageDescBackground() const;

    inline void SetTHTagStyles();
    inline void SetTDTagStyles();
    inline void SetATagStyles();
    inline void SetDelayedStyles();

    virtual void SetDfltEncoding( rtl_TextEncoding eEnc );
};


inline void SwCSS1Parser::AddFirstLetterExt( String& rFmtName )
{
    rFmtName.AppendAscii( ".FL", 3 );   // first letter
}

inline const SwPageDesc* SwCSS1Parser::GetFirstPageDesc( BOOL bCreate )
{
    return GetPageDesc( RES_POOLPAGE_FIRST, bCreate );
}

inline const SwPageDesc* SwCSS1Parser::GetRightPageDesc( BOOL bCreate )
{
    return GetPageDesc( RES_POOLPAGE_RIGHT, bCreate );
}

inline const SwPageDesc* SwCSS1Parser::GetLeftPageDesc( BOOL bCreate )
{
    return GetPageDesc( RES_POOLPAGE_LEFT, bCreate );
}

inline void SwCSS1Parser::SetTHTagStyles()
{
    if( !bTableHeaderTxtCollSet )
        SetTableTxtColl( TRUE );
}

inline void SwCSS1Parser::SetTDTagStyles()
{
    if( !bTableTxtCollSet )
        SetTableTxtColl( FALSE );
}


inline void SwCSS1Parser::SetATagStyles()
{
    if( !bLinkCharFmtsSet )
        SetLinkCharFmts();
}

inline void SwCSS1Parser::SetDelayedStyles()
{
    SetTHTagStyles();
    SetTDTagStyles();
    SetATagStyles();
}


#endif


diff --git a/sw/source/filter/html/swhtml.cxx b/sw/source/filter/html/swhtml.cxx
new file mode 100644
index 0000000..767de5b
--- /dev/null
+++ b/sw/source/filter/html/swhtml.cxx
@@ -0,0 +1,5646 @@
/*************************************************************************
 *
 *  $RCSfile: swhtml.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:56 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/


#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#ifndef PRODUCT
#include <stdlib.h>
#endif

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#define _SVSTDARR_STRINGS
#include <svtools/svstdarr.hxx>

#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _IMAP_HXX //autogen
#include <svtools/imap.hxx>
#endif
#ifndef _HTMLTOKN_H
#include <svtools/htmltokn.h>
#endif
#ifndef _HTMLKYWD_HXX
#include <svtools/htmlkywd.hxx>
#endif
#ifndef _CTRLTOOL_HXX
#include <svtools/ctrltool.hxx>
#endif

#ifndef _SV_SVAPP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _WRKWIN_HXX //autogen
#include <vcl/wrkwin.hxx>
#endif
#ifndef _SFX_INIMGR_HXX
#include <sfx2/inimgr.hxx>
#endif
#ifndef _FSETOBJSH_HXX //autogen
#include <sfx2/fsetobsh.hxx>
#endif
#ifndef _SFX_FCONTNR_HXX //autogen
#include <sfx2/fcontnr.hxx>
#endif
#ifndef _SFXDOCINF_HXX //autogen
#include <sfx2/docinf.hxx>
#endif
#ifndef _SFXDOCFILE_HXX //autogen
#include <sfx2/docfile.hxx>
#endif

#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _OFA_HTMLCFG_HXX //autogen
#include <offmgr/htmlcfg.hxx>
#endif

#ifndef _SVXLINKMGR_HXX
#include <svx/linkmgr.hxx>
#endif
#ifndef _SVX_KERNITEM_HXX //autogen
#include <svx/kernitem.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#define ITEMID_BOXINFO      SID_ATTR_BORDER_INNER
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_FHGTITEM_HXX //autogen
#include <svx/fhgtitem.hxx>
#endif
#ifndef _SVX_BRKITEM_HXX //autogen
#include <svx/brkitem.hxx>
#endif
#ifndef _SVX_POSTITEM_HXX //autogen
#include <svx/postitem.hxx>
#endif
#ifndef _SVX_WGHTITEM_HXX //autogen
#include <svx/wghtitem.hxx>
#endif
#ifndef _SVX_CRSDITEM_HXX //autogen
#include <svx/crsditem.hxx>
#endif
#ifndef _SVX_UDLNITEM_HXX //autogen
#include <svx/udlnitem.hxx>
#endif
#ifndef _SVX_ESCPITEM_HXX //autogen
#include <svx/escpitem.hxx>
#endif
#ifndef _SVX_BLNKITEM_HXX //autogen
#include <svx/blnkitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _SVX_COLRITEM_HXX //autogen
#include <svx/colritem.hxx>
#endif
#ifndef _SVX_FONTITEM_HXX //autogen
#include <svx/fontitem.hxx>
#endif
#ifndef _SVX_ADJITEM_HXX //autogen
#include <svx/adjitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_PROTITEM_HXX //autogen
#include <svx/protitem.hxx>
#endif
#ifndef _SVX_FLSTITEM_HXX
#include <svx/flstitem.hxx>
#endif


#ifndef _FRMATR_HXX
#include <frmatr.hxx>
#endif
#ifndef _CHARATR_HXX
#include <charatr.hxx>
#endif
#ifndef _FMTFLD_HXX //autogen
#include <fmtfld.hxx>
#endif
#ifndef _FMTPDSC_HXX //autogen
#include <fmtpdsc.hxx>
#endif
#ifndef _FMTHBSH_HXX //autogen
#include <fmthbsh.hxx>
#endif
#ifndef _TXTFLD_HXX //autogen
#include <txtfld.hxx>
#endif
#ifndef _FMTANCHR_HXX //autogen
#include <fmtanchr.hxx>
#endif
#ifndef _FMTSRND_HXX //autogen
#include <fmtsrnd.hxx>
#endif
#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _FMTCLDS_HXX //autogen
#include <fmtclds.hxx>
#endif
#ifndef _FCHRFMT_HXX //autogen
#include <fchrfmt.hxx>
#endif
#ifndef _FMTINFMT_HXX //autogen
#include <fmtinfmt.hxx>
#endif
#ifndef _DOCARY_HXX
#include <docary.hxx>
#endif
#ifndef _DOCSTAT_HXX //autogen
#include <docstat.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _PAM_HXX
#include <pam.hxx>
#endif
#ifndef _NDTXT_HXX
#include <ndtxt.hxx>
#endif
#ifndef _MDIEXP_HXX
#include <mdiexp.hxx>           // ...Percent()
#endif
#ifndef _EXPFLD_HXX
#include <expfld.hxx>
#endif
#ifndef _POOLFMT_HXX
#include <poolfmt.hxx>
#endif
#ifndef _PAGEDESC_HXX
#include <pagedesc.hxx>
#endif
#ifndef _BOOKMRK_HXX
#include <bookmrk.hxx>      // fuer SwBookmark ...
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _EDITSH_HXX
#include <editsh.hxx>       // fuer Start/EndAction
#endif
#ifndef _HINTS_HXX
#include <hints.hxx>        // fuer SwObjectDying
#endif
#ifndef _DOCUFLD_HXX
#include <docufld.hxx>
#endif
#ifndef _SWCSS1_HXX
#include <swcss1.hxx>
#endif
#ifndef _HTMLVSH_HXX
#include <htmlvsh.hxx>
#endif
#ifndef _FLTINI_HXX
#include <fltini.hxx>
#endif
#ifndef _HTMLTBL_HXX
#include <htmltbl.hxx>
#endif
#ifndef _HTMLNUM_HXX
#include <htmlnum.hxx>
#endif
#ifndef _SWHTML_HXX
#include <swhtml.hxx>
#endif
#ifndef _LINKENUM_HXX
#include <linkenum.hxx>
#endif

#ifndef _STATSTR_HRC
#include <statstr.hrc>          // ResId fuer Statusleiste
#endif
#ifndef _SWSWERROR_H
#include <swerror.h>
#endif

#define FONTSIZE_MASK           7
#define FONTCOLOR_MASK          (1<<15)
#define FONT_MASK               (1<<14)

#define HTML_ESC_PROP 80
#define HTML_ESC_SUPER DFLT_ESC_SUPER
#define HTML_ESC_SUB DFLT_ESC_SUB

#define HTML_SPTYPE_NONE 0
#define HTML_SPTYPE_BLOCK 1
#define HTML_SPTYPE_HORI 2
#define HTML_SPTYPE_VERT 3

#ifndef TOOLS_CONSTASCII_STRINGPARAM
#define TOOLS_CONSTASCII_STRINGPARAM( constAsciiStr ) constAsciiStr, sizeof( constAsciiStr )-1
#endif

// <P ALIGN=xxx>, <Hn ALIGN=xxx>, <TD ALIGN=xxx> usw.
HTMLOptionEnum __FAR_DATA aHTMLPAlignTable[] =
{
    { sHTML_AL_left,    SVX_ADJUST_LEFT     },
    { sHTML_AL_center,  SVX_ADJUST_CENTER   },
    { sHTML_AL_middle,  SVX_ADJUST_CENTER   }, // Netscape
    { sHTML_AL_right,   SVX_ADJUST_RIGHT    },
    { sHTML_AL_justify, SVX_ADJUST_BLOCK    },
    { sHTML_AL_char,    SVX_ADJUST_LEFT     },
    { 0,                0                   }
};

// <SPACER TYPE=...>
static HTMLOptionEnum __FAR_DATA aHTMLSpacerTypeTable[] =
{
    { sHTML_SPTYPE_block,       HTML_SPTYPE_BLOCK       },
    { sHTML_SPTYPE_horizontal,  HTML_SPTYPE_HORI        },
    { sHTML_SPTYPE_vertical,    HTML_SPTYPE_VERT        },
    { 0,                    0                       }
};

SV_IMPL_PTRARR( _HTMLAttrs, _HTMLAttrPtr )

HTMLReader::HTMLReader()
{
    bTmplBrowseMode = TRUE;

    String sTemplate(
            String::CreateFromAscii(TOOLS_CONSTASCII_STRINGPARAM("internal")) );
    sTemplate += INET_PATH_TOKEN;
    sTemplate.AppendAscii( TOOLS_CONSTASCII_STRINGPARAM("html") );
#ifndef MAC_WITHOUT_EXT
    sTemplate.AppendAscii( TOOLS_CONSTASCII_STRINGPARAM(".vor") );
#endif

    if( SFX_INIMANAGER()->SearchFile( sTemplate, SFX_KEY_TEMPLATE_PATH ))
        SetTemplateName( sTemplate );
#ifndef PRODUCT
    else
        ASSERT( !this,
            "Die html.vor befindet sich nicht mehr im definierten Directory!");
#endif
}

int HTMLReader::SetStrmStgPtr()
{
    ASSERT( pMedium, "Wo ist das Medium??" );

    if( pMedium->IsRemote() || !pMedium->IsStorage() )
    {
        pStrm = pMedium->GetInStream();
        return TRUE;
    }
    return FALSE;

}

    // Aufruf fuer die allg. Reader-Schnittstelle
ULONG HTMLReader::Read( SwDoc &rDoc,SwPaM &rPam, const String & rName )
{
    if( !pStrm )
    {
        ASSERT( pStrm, "HTML-Read ohne Stream" );
        return ERR_SWG_READ_ERROR;
    }

    if( !bInsertMode )
    {
        Reader::SetNoOutlineNum( rDoc );
        Reader::ResetFrmFmts( rDoc );

        rDoc.SetBrowseMode( TRUE );

        // Die HTML-Seitenvorlage setzen, wenn des kein HTML-Dokument ist,
        // sonst ist sie schon gesetzt.
        if( !rDoc.IsHTMLMode() )
        {
            rDoc.Insert( rPam, SwFmtPageDesc(
                rDoc.GetPageDescFromPool( RES_POOLPAGE_HTML )) );
        }
    }

    // damit keiner das Doc klaut!
    rDoc.AddLink();
    ULONG nRet = 0;
    SvParserRef xParser = new SwHTMLParser( &rDoc, rPam, *pStrm,
                                            rName, !bInsertMode, pMedium,
                                            IsReadUTF8() );

    SvParserState eState = xParser->CallParser();

    if( SVPAR_PENDING == eState )
        pStrm->ResetError();
    else if( SVPAR_ACCEPTED != eState )
    {
        String sErr( String::CreateFromInt32((sal_Int32)xParser->GetLineNr()));
        sErr += ',';
        sErr += String::CreateFromInt32((sal_Int32)xParser->GetLinePos());

        // den Stream als Fehlernummer Transporter benutzen
        nRet = *new StringErrorInfo( ERR_FORMAT_ROWCOL, sErr,
                                    ERRCODE_BUTTON_OK | ERRCODE_MSG_ERROR );
    }


    return nRet;
}


/*  */

SwHTMLParser::SwHTMLParser( SwDoc* pD, const SwPaM& rCrsr, SvStream& rIn,
                            const String& rPath, int bReadNewDoc,
                            SfxMedium* pMed, BOOL bReadUTF8 )
    : SfxHTMLParser( rIn, bReadNewDoc, pMed ),
    SwClient( 0 ),
    aPathToFile( rPath ),
    pDoc( pD ),
    pTable(0), pFormImpl( 0 ), pMarquee( 0 ),
    pField( 0 ),
    pCSS1Parser( 0 ), pNumRuleInfo( new SwHTMLNumRuleInfo ),
    eParaAdjust( SVX_ADJUST_END ),
    nScriptStartLineNr( 0 ),
    nBaseFontStMin( 0 ), nFontStMin( 0 ),
    nDefListDeep( 0 ),
    nFontStHeadStart( 0 ),
    nSBModuleCnt( 0 ),
    nMissingImgMaps( 0 ),
    nOpenParaToken( 0 ),
    pImageMap( 0 ),
    pImageMaps( 0 ),
    pSttNdIdx( 0 ),
    pPendStack( 0 ),
    nParaCnt( 5 ),
    pActionViewShell( 0 ),
    pAppletImpl( 0 ),
    pFootEndNoteImpl( 0 ),
    nContextStMin( 0 ),
    nContextStAttrMin( 0 ),
    bInFloatingFrame( FALSE ),
    bInNoEmbed( FALSE ),
    bInField( FALSE ), bInTitle( FALSE ),
    bInFootEndNoteAnchor( FALSE ), bInFootEndNoteSymbol( FALSE ),
    bNoParSpace( FALSE ), bDocInitalized( FALSE ), bCallNextToken( FALSE ),
    bDataAvailableLinkSet( FALSE ),
    bIgnoreRawData( FALSE ),
    bUpdateDocStat( FALSE ),
    bFixSelectWidth( FALSE ),
    bFixSelectHeight( FALSE ),
    bTextArea( FALSE ), bSelect( FALSE ),
    bSetModEnabled( FALSE ),
    eJumpTo( JUMPTO_NONE )
#ifndef PRODUCT
    ,nContinue( 0 )
#endif
{

    bUpperSpace = bViewCreated = bChkJumpMark =
    bSetCrsr = FALSE;

    eScriptLang = HTML_SL_UNKNOWN;
    bAnyStarBasic = TRUE;

    pPam = new SwPaM( *rCrsr.GetPoint() );
    memset( &aAttrTab, 0, sizeof( _HTMLAttrTable ));

    // Die Font-Groessen 1-7 aus der INI-Datei lesen
    OfaHtmlOptions* pHtmlOptions = OFF_APP()->GetHtmlOptions();
    aFontHeights[0] = pHtmlOptions->GetFontSize( 0 ) * 20;
    aFontHeights[1] = pHtmlOptions->GetFontSize( 1 ) * 20;
    aFontHeights[2] = pHtmlOptions->GetFontSize( 2 ) * 20;
    aFontHeights[3] = pHtmlOptions->GetFontSize( 3 ) * 20;
    aFontHeights[4] = pHtmlOptions->GetFontSize( 4 ) * 20;
    aFontHeights[5] = pHtmlOptions->GetFontSize( 5 ) * 20;
    aFontHeights[6] = pHtmlOptions->GetFontSize( 6 ) * 20;

    bKeepUnknown = pHtmlOptions->IsImportUnknown();

    pDoc->SetDefault( SvxFontHeightItem(aFontHeights[2]) );

    // Waehrend des Imports in den HTML-Modus schalten, damit die
    // richrigen Vorlagen angelegt werden
    bOldIsHTMLMode = pDoc->IsHTMLMode();
    pDoc->SetHTMLMode( TRUE );

    pCSS1Parser = new SwCSS1Parser( pDoc, aFontHeights, IsNewDoc() );
    pCSS1Parser->SetIgnoreFontFamily( pHtmlOptions->IsIgnoreFontFamily() );

    if( bReadUTF8 )
    {
        SetSrcEncoding( RTL_TEXTENCODING_UTF8 );
    }
    else
    {
        SwDocShell *pDocSh = pDoc->GetDocShell();
        SvKeyValueIterator *pHeaderAttrs =
            pDocSh->GetHeaderAttributes();
        if( pHeaderAttrs )
            SetEncodingByHTTPHeader( pHeaderAttrs );
    }
    pCSS1Parser->SetDfltEncoding( gsl_getSystemTextEncoding() );
    sBaseURL = INetURLObject::GetBaseURL();

    // Timer nur bei ganz normalen Dokumenten aufsetzen!
    SwDocShell* pDocSh = pDoc->GetDocShell();
    if( pDocSh )
    {
        if( SFX_CREATE_MODE_INTERNAL == pDocSh->GetCreateMode() ||
            SFX_CREATE_MODE_PREVIEW == pDocSh->GetCreateMode() )
            bViewCreated = TRUE;            // dann nicht, synchron laden

        // es ist ein Sprungziel vorgegeben.

        if( pMed )
        {
            sJmpMark = pMed->GetURLObject().GetMark();
            if( sJmpMark.Len() )
            {
                eJumpTo = JUMPTO_MARK;
                String sCmp;
                xub_StrLen nLastPos, nPos = 0;
                while( STRING_NOTFOUND != ( nLastPos =
                        sJmpMark.Search( cMarkSeperator, nPos + 1 )) )
                    nPos = nLastPos;

                if( nPos && ( sCmp = sJmpMark.Copy( nPos + 1 ) ).
                                                EraseAllChars().Len() )
                {
                    sCmp.ToLowerAscii();
                    if( sCmp.EqualsAscii( pMarkToRegion ) )
                        eJumpTo = JUMPTO_REGION;
                    else if( sCmp.EqualsAscii( pMarkToTable ) )
                        eJumpTo = JUMPTO_TABLE;
                    else if( sCmp.EqualsAscii( pMarkToGraphic ) )
                        eJumpTo = JUMPTO_GRAPHIC;
                    else if( sCmp.EqualsAscii( pMarkToOutline ) ||
                            sCmp.EqualsAscii( pMarkToText ) ||
                            sCmp.EqualsAscii( pMarkToFrame ) )
                        eJumpTo = JUMPTO_NONE;  // das ist nichts gueltiges!
                    else
                        // ansonsten ist das ein normaler (Book)Mark
                        nPos = STRING_LEN;
                }
                else
                    nPos = STRING_LEN;

                sJmpMark.Erase( nPos );
                if( !sJmpMark.Len() )
                    eJumpTo = JUMPTO_NONE;
            }
        }
    }
}

__EXPORT SwHTMLParser::~SwHTMLParser()
{
#ifndef PRODUCT
    ASSERT( !nContinue, "DTOR im Continue - Das geht schief!!!" );
#endif
    BOOL bAsync = pDoc->IsInLoadAsynchron();
    pDoc->SetInLoadAsynchron( FALSE );
    pDoc->SetHTMLMode( bOldIsHTMLMode );

    if( pDoc->GetDocShell() && aLoadEnv.Is() )
    {
        // Den Link vor dem DocumentDetected austragen, damit
        // wir waehrend des DocumentDetected nicht noch irgendwelche
        // Daten bekommen, die zum nochmaligen Aufruf von
        // DocumentDetected (in NextToken) fuehren.
        ((SfxLoadEnvironment*)&aLoadEnv)->SetDataAvailableLink( Link() );
        bDataAvailableLinkSet = FALSE;

        // wenn noch nichts entschieden ist, dann aber hier
        if( !bDocInitalized )
        {
            ErrCode eError = ((SfxLoadEnvironment*)&aLoadEnv)->
                                DocumentDetected( pDoc->GetDocShell(), 0 );
        }
    }

    // das DocumentDetected kann ggfs. die DocShells loeschen, darum nochmals
    // abfragen
    if( pDoc->GetDocShell() )
    {
        // Gelinkte Bereiche updaten
        USHORT nLinkMode = pDoc->GetLinkUpdMode();
        if( nLinkMode != NEVER && bAsync &&
            SFX_CREATE_MODE_INTERNAL!=pDoc->GetDocShell()->GetCreateMode() )
            pDoc->GetLinkManager().UpdateAllLinks( nLinkMode == MANUAL,
                                                   TRUE, FALSE );

        if( pDoc->GetDocShell()->IsLoading() )
            pDoc->GetDocShell()->StartLoadFinishedTimer();
    }

    delete pSttNdIdx;

    if( aSetAttrTab.Count() )
    {
        ASSERT( !aSetAttrTab.Count(),"Es stehen noch Attribute auf dem Stack" );
        aSetAttrTab.DeleteAndDestroy( 0, aSetAttrTab.Count() );
    }

    delete pPam;
    delete pCSS1Parser;
    delete pNumRuleInfo;
    DeleteFormImpl();
    DeleteFootEndNoteImpl();

    ASSERT( !pTable, "Es existiert noch eine offene Tabelle" );
    delete pImageMaps;
    //delete pTable;

    ASSERT( !pPendStack,
            "SwHTMLParser::~SwHTMLParser: Hier sollte es keinen Pending-Stack mehr geben" );
    while( pPendStack )
    {
        SwPendingStack* pTmp = pPendStack;
        pPendStack = pPendStack->pNext;
        delete pTmp->pData;
        delete pTmp;
    }

    if( !pDoc->RemoveLink() )
    {
        // keiner will mehr das Doc haben, also weg damit
        delete pDoc;
    }
}

SvParserState __EXPORT SwHTMLParser::CallParser()
{
    // einen temporaeren Index anlegen, auf Pos 0 so wird er nicht bewegt!
    pSttNdIdx = new SwNodeIndex( pDoc->GetNodes() );
    if( !IsNewDoc() )       // in ein Dokument einfuegen ?
    {
        const SwPosition* pPos = pPam->GetPoint();
        SwTxtNode* pSttNd = pPos->nNode.GetNode().GetTxtNode();

        pDoc->SplitNode( *pPos );

        *pSttNdIdx = pPos->nNode.GetIndex()-1;
        pDoc->SplitNode( *pPos );

        pPam->Move( fnMoveBackward );
        pDoc->SetTxtFmtColl( *pPam,
                pCSS1Parser->GetTxtCollFromPool( RES_POOLCOLL_STANDARD ));
    }

    if( GetMedium() )
    {
        const SfxPoolItem* pItem;
        if( SFX_ITEM_SET == GetMedium()->GetItemSet()->GetItemState(
                SID_LOADENVIRONMENT, FALSE, &pItem ))
        {
            aLoadEnv = &((SfxRefItem*)pItem)->GetValue();
        }

        if( !bViewCreated && aLoadEnv.Is() )
        {
            ((SfxLoadEnvironment*)&aLoadEnv)->
                SetDataAvailableLink( GetAsynchCallLink() );
            bDataAvailableLinkSet = TRUE;
        }
        else
            bViewCreated = TRUE;
    }

    // Laufbalken anzeigen
    else if( !GetMedium() || !GetMedium()->IsRemote() )
    {
        rInput.Seek(STREAM_SEEK_TO_END);
        rInput.ResetError();
        ::StartProgress( STR_STATSTR_W4WREAD, 0, rInput.Tell(),
                         pDoc->GetDocShell() );
        rInput.Seek(STREAM_SEEK_TO_BEGIN);
        rInput.ResetError();
    }

    SwPageDesc& rDesc = pDoc->_GetPageDesc( 0 );
    rDesc.Add( this );

    SvParserState eRet = HTMLParser::CallParser();

    return eRet;
}

void __EXPORT SwHTMLParser::Continue( int nToken )
{
#ifndef PRODUCT
    ASSERT( !nContinue, "Continue im Continue - Das sollte doch nicht sein, oder?" );
    nContinue++;
#endif

    // Wenn der Import (vom SFX) abgebrochen wurde, wird ein Fehler
    // gesetzt aber trotzdem noch weiter gemacht, damit vernuenftig
    // aufgeraeumt wird.
    ASSERT( SVPAR_ERROR!=eState,
            "SwHTMLParser::Continue: bereits ein Fehler gesetzt" );
    if( pDoc->GetDocShell() && pDoc->GetDocShell()->IsAbortingImport() )
        eState = SVPAR_ERROR;

    // Die ViewShell vom Dokument holen, merken und als aktuelle setzen.
    ViewShell *pInitVSh = CallStartAction();

    if( SVPAR_ERROR != eState && !pInitVSh && GetMedium() && !bViewCreated )
    {
        // Beim ersten Aufruf erstmal returnen, Doc anzeigen
        // und auf Timer Callback warten.
        // An dieser Stelle wurde im CallParser gerade mal ein Zeichen
        // gelesen und ein SaveState(0) gerufen.
        eState = SVPAR_PENDING;
        bViewCreated = TRUE;
        pDoc->SetInLoadAsynchron( TRUE );

#ifndef PRODUCT
        nContinue--;
#endif

        return;
    }

    bSetModEnabled = FALSE;
    if( pDoc->GetDocShell() &&
        0 != (bSetModEnabled = pDoc->GetDocShell()->IsEnableSetModified()) )
    {
        pDoc->GetDocShell()->EnableSetModified( FALSE );
    }

    // waehrend des einlesens kein OLE-Modified rufen
    Link aOLELink( pDoc->GetOle2Link() );
    pDoc->SetOle2Link( Link() );

    BOOL bModified = pDoc->IsModified();
    BOOL bWasUndo = pDoc->DoesUndo();
    pDoc->DoUndo( FALSE );

    GetSaveAndSetOwnBaseURL();

    // Wenn der Import abgebrochen wird, kein Continue mehr rufen.
    // Falls ein Pending-Stack existiert aber durch einen Aufruf
    // von NextToken dafuer sorgen, dass der Pending-Stack noch
    // beendet wird.
    if( SVPAR_ERROR == eState )
    {
        ASSERT( !pPendStack || pPendStack->nToken,
                "SwHTMLParser::Continue: Pending-Stack ohne Token" );
        if( pPendStack && pPendStack->nToken )
            NextToken( pPendStack->nToken );
        ASSERT( !pPendStack,
                "SwHTMLParser::Continue: Es gibt wieder einen Pend-Stack" );
    }
    else
    {
        HTMLParser::Continue( pPendStack ? pPendStack->nToken : nToken );
    }

    SetSaveBaseURL();

    // Laufbalken wieder abschalten
    EndProgress( pDoc->GetDocShell() );

    BOOL bLFStripped = FALSE;
    if( SVPAR_PENDING != GetStatus() )
    {
        // noch die letzten Attribute setzen
        {
            if( aScriptSource.Len() )
            {
                SwScriptFieldType *pType =
                    (SwScriptFieldType*)pDoc->GetSysFldType( RES_SCRIPTFLD );

                SwScriptField aFld( pType, aScriptType, aScriptSource,
                                    FALSE );
                InsertAttr( SwFmtFld( aFld ) );
            }

            if( pAppletImpl )
                EndApplet();

            // ggf. ein noch vorhandes LF hinter dem letzen Absatz entfernen
            if( IsNewDoc() )
                bLFStripped = StripTrailingLF() > 0;

            // noch offene Nummerierungen beenden.
            while( GetNumInfo().GetNumRule() )
                EndNumBulList();

            ASSERT( !nContextStMin, "Es gibt geschuetzte Kontexte" );
            nContextStMin = 0;
            while( aContexts.Count() )
            {
                _HTMLAttrContext *pCntxt = PopContext();
                if( pCntxt )
                {
                    EndContext( pCntxt );
                    delete pCntxt;
                }
            }

            if( aParaAttrs.Count() )
                aParaAttrs.Remove( 0, aParaAttrs.Count() );

            SetAttr( FALSE );

            // Noch die erst verzoegert gesetzten Styles setzen
            pCSS1Parser->SetDelayedStyles();
        }

        // den Start wieder korrigieren
        if( !IsNewDoc() && pSttNdIdx->GetIndex() )
        {
            SwTxtNode* pTxtNode = pSttNdIdx->GetNode().GetTxtNode();
            SwNodeIndex aNxtIdx( *pSttNdIdx );
            if( pTxtNode && pTxtNode->CanJoinNext( &aNxtIdx ))
            {
                xub_StrLen nStt = pTxtNode->GetTxt().Len();
                // wenn der Cursor noch in dem Node steht, dann setze in an das Ende
                if( pPam->GetPoint()->nNode == aNxtIdx )
                {
                    pPam->GetPoint()->nNode = *pSttNdIdx;
                    pPam->GetPoint()->nContent.Assign( pTxtNode, nStt );
                }

#ifndef PRODUCT
// !!! sollte nicht moeglich sein, oder ??
ASSERT( pSttNdIdx->GetIndex()+1 != pPam->GetBound( TRUE ).nNode.GetIndex(),
            "Pam.Bound1 steht noch im Node" );
ASSERT( pSttNdIdx->GetIndex()+1 != pPam->GetBound( FALSE ).nNode.GetIndex(),
            "Pam.Bound2 steht noch im Node" );

if( pSttNdIdx->GetIndex()+1 == pPam->GetBound( TRUE ).nNode.GetIndex() )
{
    register xub_StrLen nCntPos = pPam->GetBound( TRUE ).nContent.GetIndex();
    pPam->GetBound( TRUE ).nContent.Assign( pTxtNode,
                    pTxtNode->GetTxt().Len() + nCntPos );
}
if( pSttNdIdx->GetIndex()+1 == pPam->GetBound( FALSE ).nNode.GetIndex() )
{
    register xub_StrLen nCntPos = pPam->GetBound( FALSE ).nContent.GetIndex();
    pPam->GetBound( FALSE ).nContent.Assign( pTxtNode,
                    pTxtNode->GetTxt().Len() + nCntPos );
}
#endif
                // Zeichen Attribute beibehalten!
                SwTxtNode* pDelNd = aNxtIdx.GetNode().GetTxtNode();
                if( pTxtNode->GetTxt().Len() )
                    pDelNd->FmtToTxtAttr( pTxtNode );
                else
                    pTxtNode->ChgFmtColl( pDelNd->GetTxtColl() );
                pTxtNode->JoinNext();
            }
        }
    }

    if( SVPAR_ACCEPTED == eState )
    {
        if( nMissingImgMaps )
        {
            // es fehlen noch ein paar Image-Map zuordungen.
            // vielleicht sind die Image-Maps ja jetzt da?
            ConnectImageMaps();
        }

        // jetzt noch den letzten ueberfluessigen Absatz loeschen
        SwPosition* pPos = pPam->GetPoint();
        if( !pPos->nContent.GetIndex() && !bLFStripped )
        {
            SwTxtNode* pAktNd;
            ULONG nNodeIdx = pPos->nNode.GetIndex();

            BOOL bHasFlysOrMarks =
                HasCurrentParaFlys() || HasCurrentParaBookmarks( TRUE );

            if( IsNewDoc() )
            {
                if( pDoc->GetNodes()[ nNodeIdx -1 ]->IsCntntNode() &&
                    !pPam->GetPoint()->nContent.GetIndex() )
                {
                    nNodeIdx = pPam->GetPoint()->nNode.GetIndex();
                    SwCntntNode* pCNd = pPam->GetCntntNode();
                    if( pCNd && pCNd->StartOfSectionIndex()+2 <
                        pCNd->EndOfSectionIndex() && !bHasFlysOrMarks )
                    {
                        pPam->GetBound(TRUE).nContent.Assign( 0, 0 );
                        pPam->GetBound(FALSE).nContent.Assign( 0, 0 );
                        pDoc->GetNodes().Delete( pPam->GetPoint()->nNode );
                    }
                }
            }
            else if( 0 != ( pAktNd = pDoc->GetNodes()[ nNodeIdx ]->GetTxtNode()) && !bHasFlysOrMarks )
            {
                if( pAktNd->CanJoinNext( &pPos->nNode ))
                {
                    SwTxtNode* pNextNd = pPos->nNode.GetNode().GetTxtNode();
                    pPos->nContent.Assign( pNextNd, 0 );
                    pPam->SetMark(); pPam->DeleteMark();
                    pNextNd->JoinPrev();
                }
                else if( !pAktNd->GetTxt().Len() )
                {
                    pPos->nContent.Assign( 0, 0 );
                    pPam->SetMark(); pPam->DeleteMark();
                    pDoc->GetNodes().Delete( pPos->nNode, 1 );
                    pPam->Move( fnMoveBackward );
                }
            }
        }

        // nun noch das SplitNode vom Anfang aufheben
        else if( !IsNewDoc() )
        {
            if( pPos->nContent.GetIndex() )     // dann gabs am Ende kein <P>,
                pPam->Move( fnMoveForward, fnGoNode );  // als zum naechsten Node
            SwTxtNode* pTxtNode = pPos->nNode.GetNode().GetTxtNode();
            SwNodeIndex aPrvIdx( pPos->nNode );
            if( pTxtNode && pTxtNode->CanJoinPrev( &aPrvIdx ) &&
                *pSttNdIdx <= aPrvIdx )
            {
                // eigentlich muss hier ein JoinNext erfolgen, aber alle Cursor
                // usw. sind im pTxtNode angemeldet, so dass der bestehen
                // bleiben MUSS.

                // Absatz in Zeichen-Attribute umwandeln, aus dem Prev die
                // Absatzattribute und die Vorlage uebernehmen!
                SwTxtNode* pPrev = aPrvIdx.GetNode().GetTxtNode();
                pTxtNode->ChgFmtColl( pPrev->GetTxtColl() );
                pTxtNode->FmtToTxtAttr( pPrev );
                pTxtNode->SwCntntNode::ResetAllAttr();

                if( pPrev->GetpSwAttrSet() )
                    pTxtNode->SwCntntNode::SetAttr( *pPrev->GetpSwAttrSet() );

                if( &pPam->GetBound(TRUE).nNode.GetNode() == pPrev )
                    pPam->GetBound(TRUE).nContent.Assign( pTxtNode, 0 );
                if( &pPam->GetBound(FALSE).nNode.GetNode() == pPrev )
                    pPam->GetBound(FALSE).nContent.Assign( pTxtNode, 0 );

                pTxtNode->JoinPrev();
            }
        }

        // und noch die DocumentInfo aufbereiten
        if( IsNewDoc() )
        {
            const SfxDocumentInfo *pInfo = pDoc->GetInfo();
            if( pInfo->IsReloadEnabled() &&
                !pInfo->GetReloadURL().Len() )
            {
                SfxDocumentInfo aInfo( *pDoc->GetInfo() );
                aInfo.SetReloadURL( aPathToFile );
                pDoc->SetInfo( aInfo );
            }
        }

        if( bUpdateDocStat )
        {
            SwDocStat aStat( pDoc->GetDocStat() );
            ViewShell *pTmpVSh = 0;
            pDoc->GetEditShell( &pTmpVSh );
            USHORT nPages = pTmpVSh ? pTmpVSh->GetNumPages() : 1;
            pDoc->UpdateDocStat( aStat, nPages );
        }
    }

    if( SVPAR_PENDING != GetStatus() )
        delete pSttNdIdx, pSttNdIdx = 0;

    // sollte der Parser der Letzte sein, der das Doc haelt, dann braucht
    // man hier auch nichts mehr tun, Doc wird gleich zerstoert!
    if( 1 < pDoc->GetLinkCnt() )
    {
        if( bWasUndo )
        {
            pDoc->DelAllUndoObj();
            pDoc->DoUndo( TRUE );
        }
        else if( !pInitVSh )
        {
            // Wenn zu Beginn des Continue keine Shell vorhanden war,
            // kann trotzdem mitlerweile eine angelegt worden sein.
            // In dieses Fall stimmt das bWasUndo-Flag nicht und
            // wir muessen das Undo noch anschalten.
            ViewShell *pTmpVSh = CheckActionViewShell();
            if( pTmpVSh )
                pDoc->DoUndo( TRUE );
        }

        pDoc->SetOle2Link( aOLELink );
        if( !bModified )
            pDoc->ResetModified();
        if( bSetModEnabled && pDoc->GetDocShell() )
        {
            pDoc->GetDocShell()->EnableSetModified( TRUE );
            bSetModEnabled = FALSE; // this is unnecessary here
        }
    }


    // Wenn die Dokuemnt-ViewShell noch existiert und eine Action
    // offen ist (muss bei Abbruch nicht sein), die Action beenden,
    // uns von der Shell abmelden und schliesslich die alte Shell
    // wieder rekonstruieren.
    CallEndAction( TRUE );

#ifndef PRODUCT
    nContinue--;
#endif
}

void SwHTMLParser::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew )
{
    switch( pOld ? pOld->Which() : pNew ? pNew->Which() : 0 )
    {
    case RES_OBJECTDYING:
        if( ((SwPtrMsgPoolItem *)pOld)->pObject == pRegisteredIn )
        {
            // dann uns selbst beenden
            pRegisteredIn->Remove( this );
            ReleaseRef();                   // ansonsten sind wir fertig!
        }
        break;
    }
}

void SwHTMLParser::DocumentDetected()
{
    ASSERT( !bDocInitalized, "DocumentDetected mehrfach aufgerufen" );
    bDocInitalized = TRUE;
    if( IsNewDoc() )
    {
        if( IsInHeader() )
            FinishHeader( TRUE );

        CallEndAction( TRUE, TRUE );

        SetSaveBaseURL();

#ifndef PRODUCT
        ViewShell *pTmpVSh = 0;
        pDoc->GetEditShell( &pTmpVSh );
        ASSERT( pTmpVSh==0,
                "Dok-ViewShell existiert schon vor DocDetected" );
#endif
        ErrCode eError = ((SfxLoadEnvironment*)&aLoadEnv)->
                        DocumentDetected( pDoc->GetDocShell(), 0 );
        if( eError )
        {
            eState = SVPAR_ERROR;
            return;
        }
        GetSaveAndSetOwnBaseURL();

        pDoc->DoUndo( FALSE );
        // Durch das DocumentDetected wurde im allgemeinen eine
        // ViewShell angelegt. Es kann aber auch sein, dass sie
        // erst spaeter angelegt wird, naemlich dann, wenn die UI
        // gecaptured ist.
        CallStartAction();
    }
}

// wird fuer jedes Token gerufen, das in CallParser erkannt wird
void __EXPORT SwHTMLParser::NextToken( int nToken )
{
    if( ( pDoc->GetDocShell() && pDoc->GetDocShell()->IsAbortingImport() )
        || 1 == pDoc->GetLinkCnt() )
    {
        // wurde der Import vom SFX abgebrochen? Wenn ein Pending-Stack
        // existiert den noch aufraumen
        eState = SVPAR_ERROR;
        ASSERT( !pPendStack || pPendStack->nToken,
                "SwHTMLParser::NextToken: Pending-Stack ohne Token" );
        if( 1 == pDoc->GetLinkCnt() || !pPendStack )
            return ;
    }

#ifndef PRODUCT
    if( pPendStack )
    {
        switch( nToken )
        {
            // Tabellen werden ueber rekusive Methodenaufrufe gelesen
        case HTML_TABLE_ON:
            // Bei CSS-Deklarationen muss evtl. noch auf das
            // Ende eines File-Downloads gewartet werden.
        case HTML_LINK:
            // Bei Controls muss evtl. noch die Groesse gesetzt werden.
        case HTML_INPUT:
        case HTML_TEXTAREA_ON:
        case HTML_SELECT_ON:
        case HTML_SELECT_OFF:
            break;
        default:
            ASSERT( !pPendStack, "Unbekanntes Token fuer Pending-Stack" );
            break;
        }
    }
#endif

    // Die folgeneden Spezialfaelle muessen vor der Filter-Detection behandelt
    // werden, denn der Inhalt des Titels, etc. wird auch in Netcape nicht
    // zur Filter-Detection herangezogen.
    if( !pPendStack )
    {
        if( bInTitle )
        {
            switch( nToken )
            {
            case HTML_TITLE_OFF:
                if( IsNewDoc() && sTitle.Len() )
                {
                    SfxDocumentInfo aInfo( *pDoc->GetInfo() );
                    aInfo.SetTitle( sTitle );
                    pDoc->SetInfo( aInfo );

                    if( pDoc->GetDocShell() )
                        pDoc->GetDocShell()->SetTitle( sTitle );
                }
                bInTitle = FALSE;
                sTitle.Erase();
                break;

            case HTML_NONBREAKSPACE:
                sTitle += ' ';
                break;

            case HTML_SOFTHYPH:
                sTitle += '-';
                break;

            case HTML_TEXTTOKEN:
                sTitle += aToken;
                break;

            default:
                sTitle += '<';
                if( (HTML_TOKEN_ONOFF & nToken) && (1 & nToken) )
                    sTitle += '/';
                sTitle += sSaveToken;
                if( aToken.Len() )
                {
                    sTitle += ' ';
                    sTitle += aToken;
                }
                sTitle += '>';
                break;
            }

            return;
        }
    }

    // Wenn wir noch nicht wissen, was fuer ein Dokument wir vor uns haben,
    // versuchen wir das erstmal rauszufinden. Das muss fuer Controls in
    // Fall vor dem Einfuegen des Controls passieren, weil beim Einfuegen
    // bereits eine View benoetigt wird.
    if( !bDocInitalized && aLoadEnv.Is() )
        DocumentDetected();

    BOOL bGetIDOption = FALSE, bInsertUnknown = FALSE;
    BOOL bUpperSpaceSave = bUpperSpace;
    bUpperSpace = FALSE;

    // Die folgenden Speziallfaelle muessen oder koennen nach der
    // Filter-Detection erfolgen.
    if( !pPendStack )
    {
        if( bInFloatingFrame )
        {
            // <SCRIPT> wird hier (von uns) ignoriert, weil es auch in
            // Applets ignoriert wird!
            if( HTML_IFRAME_OFF == nToken )
            {
                bCallNextToken = FALSE;
                EndFloatingFrame();
            }

            return;
        }
        else if( bInNoEmbed )
        {
            switch( nToken )
            {
            case HTML_NOEMBED_OFF:
                aContents.ConvertLineEnd();
                InsertComment( aContents, sHTML_noembed );
                aContents.Erase();
                bCallNextToken = FALSE;
                bInNoEmbed = FALSE;
                break;

            case HTML_RAWDATA:
                InsertCommentText( sHTML_noembed );
                break;

            default:
                ASSERT( !this, "SwHTMLParser::NextToken: ungueltiges Tag" );
                break;
            }

            return;
        }
        else if( pAppletImpl )
        {
            // in einem Applet interessieren uns (erstmal) nur <PARAM>-Tags
            // und das </APPLET>.
            // <SCRIPT> wird hier (von Netscape) ignoriert!

            switch( nToken )
            {
            case HTML_APPLET_OFF:
                bCallNextToken = FALSE;
                EndApplet();
                break;

            case HTML_PARAM:
                InsertParam();
                break;
            }

            return;
        }
        else if( bTextArea )
        {
            // in einer TextArea wird alles bis zum </TEXTAREA> als Text
            // eingefuegt
            // <SCRIPT> wird hier (von Netscape) ignoriert!

            switch( nToken )
            {
            case HTML_TEXTAREA_OFF:
                bCallNextToken = FALSE;
                EndTextArea();
                break;

            default:
                InsertTextAreaText( nToken );
                break;
            }

            return;
        }
        else if( bSelect )
        {
            // MUSS nach bNoScript kommen!
            switch( nToken )
            {
            case HTML_SELECT_OFF:
                bCallNextToken = FALSE;
                EndSelect();
                return;

            case HTML_OPTION:
                InsertSelectOption();
                return;

            case HTML_TEXTTOKEN:
                InsertSelectText();
                return;

            case HTML_INPUT:
            case HTML_SCRIPT_ON:
            case HTML_SCRIPT_OFF:
            case HTML_NOSCRIPT_ON:
            case HTML_NOSCRIPT_OFF:
            case HTML_RAWDATA:
                // im normalen switch bahandeln
                break;

            default:
                // ignorieren
                return;
            }
        }
        else if( pMarquee )
        {
            // in einer TextArea wird alles bis zum </TEXTAREA> als Text
            // eingefuegt
            // Die <SCRIPT>-Tags werden vom MS-IE ignoriert, von uns das
            // geasmte Script
            switch( nToken )
            {
            case HTML_MARQUEE_OFF:
                bCallNextToken = FALSE;
                EndMarquee();
                break;

            case HTML_TEXTTOKEN:
                InsertMarqueeText();
                break;
            }

            return;
        }
        else if( bInField )
        {
            switch( nToken )
            {
            case HTML_SDFIELD_OFF:
                bCallNextToken = FALSE;
                EndField();
                break;

            case HTML_TEXTTOKEN:
                InsertFieldText();
                break;
            }

            return;
        }
        else if( bInFootEndNoteAnchor || bInFootEndNoteSymbol )
        {
            switch( nToken )
            {
            case HTML_ANCHOR_OFF:
                EndAnchor();
                bCallNextToken = FALSE;
                break;

            case HTML_TEXTTOKEN:
                InsertFootEndNoteText();
                break;
            }
            return;
        }
        else if( aUnknownToken.Len() )
        {
            // Unbekannte Token im Header werden nur durch ein passendes
            // End-Token, </HEAD> oder <BODY> wieder beendet. Darin wird Text
            // ignoriert.
            switch( nToken )
            {
            case HTML_UNKNOWNCONTROL_OFF:
                if( aUnknownToken.CompareTo(sSaveToken) != COMPARE_EQUAL )
                    return;
            case HTML_FRAMESET_ON:
            case HTML_HEAD_OFF:
            case HTML_BODY_ON:
            case HTML_IMAGE:        // Warum auch immer Netscape das tut.
                aUnknownToken.Erase();
                break;
            case HTML_TEXTTOKEN:
                return;
            default:
                break;
            }
        }
    }

    switch( nToken )
    {
    case HTML_BODY_ON:
        if( aStyleSource.Len() )
        {
            pCSS1Parser->ParseStyleSheet( aStyleSource );
            aStyleSource.Erase();
        }
        if( IsNewDoc() )
        {
            InsertBodyOptions();
            // Falls es eine Vorlage fuer die erste oder rechte Seite gibt,
            // setzen wir die hier.
            const SwPageDesc *pPageDesc = 0;
            if( pCSS1Parser->IsSetFirstPageDesc() )
                pPageDesc = pCSS1Parser->GetFirstPageDesc();
            else if( pCSS1Parser->IsSetRightPageDesc() )
                pPageDesc = pCSS1Parser->GetRightPageDesc();

            if( pPageDesc )
                pDoc->Insert( *pPam, SwFmtPageDesc( pPageDesc ) );
        }
        break;

    case HTML_LINK:
        InsertLink();
        break;

    case HTML_BASE:
        {
            const HTMLOptions *pOptions = GetOptions();
            for( USHORT i = pOptions->Count(); i; )
            {
                const HTMLOption *pOption = (*pOptions)[ --i ];
                switch( pOption->GetToken() )
                {
                case HTML_O_HREF:
                    sBaseURL = pOption->GetString();
                    INetURLObject::SetBaseURL( sBaseURL );
                    break;
                case HTML_O_TARGET:
                    if( IsNewDoc() )
                    {
                        SfxDocumentInfo aInfo( *pDoc->GetInfo() );
                        aInfo.SetDefaultTarget( pOption->GetString() );
                        pDoc->SetInfo( aInfo );
                    }
                    break;
                }
            }
        }
        break;

    case HTML_META:
        if( IsNewDoc() )
        {
            SwDocShell *pDocSh = pDoc->GetDocShell();
            SvKeyValueIterator *pHTTPHeader =
                pDocSh ? pDocSh->GetHeaderAttributes() : 0;
            SfxDocumentInfo aInfo( *pDoc->GetInfo() );

            if( ParseMetaOptions( &aInfo, pHTTPHeader ) )
            {
                pDoc->SetInfo( aInfo );
            }
            else
            {
                ParseMoreMetaOptions();
            }
        }
        break;

    case HTML_TITLE_ON:
        bInTitle = TRUE;
        break;

    case HTML_SCRIPT_ON:
        NewScript();
        break;

    case HTML_SCRIPT_OFF:
        EndScript();
        break;

    case HTML_NOSCRIPT_ON:
    case HTML_NOSCRIPT_OFF:
        bInsertUnknown = TRUE;
        break;

    case HTML_STYLE_ON:
        NewStyle();
        break;

    case HTML_STYLE_OFF:
        EndStyle();
        break;

    case HTML_RAWDATA:
        if( !bIgnoreRawData )
        {
            if( IsReadScript() )
            {
                AddScriptSource();
            }
            else if( IsReadStyle() )
            {
                if( aStyleSource.Len() )
                    aStyleSource += '\n';
                aStyleSource += aToken;
            }
        }
        break;

    case HTML_APPLET_ON:
#ifdef SOLAR_JAVA
        InsertApplet();
        bCallNextToken = pAppletImpl!=0 && pTable!=0;
#endif
        break;

    case HTML_IFRAME_ON:
        InsertFloatingFrame();
        bCallNextToken = bInFloatingFrame && pTable!=0;
        break;

    case HTML_LINEBREAK:
        if( !IsReadPRE() )
        {
            InsertLineBreak();
            break;
        }
        else
            bGetIDOption = TRUE;
            // <BR>s in <PRE> aehneln echten LFs, deshalb kein break

    case HTML_NEWPARA:
        // CR in PRE/LISTING/XMP
        {
            if( HTML_NEWPARA==nToken ||
                pPam->GetPoint()->nContent.GetIndex() )
            {
                AppendTxtNode(); // lf gibts hier nicht, deshalb unkritisch
                SetTxtCollAttrs();
            }
            // Laufbalkenanzeige
            if( !GetMedium() || !GetMedium()->IsRemote() )
                ::SetProgressState( rInput.Tell(), pDoc->GetDocShell() );
        }
        break;

    case HTML_NONBREAKSPACE:
        pDoc->Insert( *pPam, CHAR_HARDBLANK );
        break;

    case HTML_SOFTHYPH:
        pDoc->Insert( *pPam, CHAR_SOFTHYPHEN );
        break;

    case HTML_LINEFEEDCHAR:
        if( pPam->GetPoint()->nContent.GetIndex() )
            AppendTxtNode();
        if( !pTable && !pDoc->IsInHeaderFooter( pPam->GetPoint()->nNode ) )
        {
            NewAttr( &aAttrTab.pBreak, SvxFmtBreakItem(SVX_BREAK_PAGE_BEFORE) );
            EndAttr( aAttrTab.pBreak, 0, FALSE );
        }
        break;

    case HTML_TEXTTOKEN:
        // dann fuege den String ein, ohne das Attribute am Ende
        // aufgespannt werden.
        if( aToken.Len() && ' '==aToken.GetChar(0) && !IsReadPRE() )
        {
            xub_StrLen nPos = pPam->GetPoint()->nContent.GetIndex();
            if( nPos )
            {
                const String& rText =
                    pDoc->GetNodes()[ pPam->GetPoint()->nNode ]->GetTxtNode()
                                                               ->GetTxt();
                register sal_Unicode cLast = rText.GetChar(--nPos);
                if( ' ' == cLast || '\x0a' == cLast)
                    aToken.Erase(0,1);
            }
            else
                aToken.Erase(0,1);

            if( !aToken.Len() )
            {
                bUpperSpace = bUpperSpaceSave;
                break;
            }
        }

        if( aToken.Len() )
        {
            if( !bDocInitalized && aLoadEnv.Is() )
                DocumentDetected();
            pDoc->Insert( *pPam, aToken );

            // wenn es noch vorlaefige Absatz-Attribute gibt, der Absatz aber
            // nicht leer ist, dann sind die Absatz-Attribute entgueltig.
            if( aParaAttrs.Count() )
                aParaAttrs.Remove( 0, aParaAttrs.Count() );

            SetAttr();
        }
        break;

    case HTML_HORZRULE:
        InsertHorzRule();
        break;

    case HTML_IMAGE:
        InsertImage();
        // sollte der Parser der Letzte sein, der das Doc haelt, dann kann
        // man hier abbrechen und einen Fehler setzen.
        if( 1 == pDoc->GetLinkCnt() )
        {
            eState = SVPAR_ERROR;
        }
        break;

    case HTML_SPACER:
        InsertSpacer();
        break;

    case HTML_EMBED:
        InsertEmbed();
        break;

    case HTML_NOEMBED_ON:
        bInNoEmbed = TRUE;
        bCallNextToken = pTable!=0;
        ReadRawData( sHTML_noembed );
        break;

    case HTML_DEFLIST_ON:
        if( nOpenParaToken )
            EndPara();
        NewDefList();
        break;
    case HTML_DEFLIST_OFF:
        if( nOpenParaToken )
            EndPara();
        EndDefListItem( 0, FALSE, 1==nDefListDeep );
        EndDefList();
        break;

    case HTML_DD_ON:
    case HTML_DT_ON:
        if( nOpenParaToken )
            EndPara();
        EndDefListItem( 0, FALSE );// <DD>/<DT> beenden und keine Vorl. setzen
        NewDefListItem( nToken );
        break;

    case HTML_DD_OFF:
    case HTML_DT_OFF:
        // siehe HTML_LI_OFF
        // eigentlich muesste man ein DD/DT jetzt beenden. Da aber sowhl
        // Netscape als auch Microsoft das nicht tun, machen wir das eben
        // auch nicht.
        EndDefListItem( nToken, FALSE );
        break;

    // Bereiche
    case HTML_DIVISION_ON:
    case HTML_CENTER_ON:
        if( nOpenParaToken )
        {
            if( IsReadPRE() )
                nOpenParaToken = 0;
            else
                EndPara();
        }
        NewDivision( nToken );
        break;

    case HTML_DIVISION_OFF:
    case HTML_CENTER_OFF:
        if( nOpenParaToken )
        {
            if( IsReadPRE() )
                nOpenParaToken = 0;
            else
                EndPara();
        }
        EndDivision( nToken );
        break;

    case HTML_MULTICOL_ON:
        if( nOpenParaToken )
            EndPara();
        NewMultiCol();
        break;

    case HTML_MULTICOL_OFF:
        if( nOpenParaToken )
            EndPara();
        EndTag( HTML_MULTICOL_ON );
        break;

    case HTML_MARQUEE_ON:
        NewMarquee();
        bCallNextToken = pMarquee!=0 && pTable!=0;
        break;

    case HTML_FORM_ON:
        NewForm();
        break;
    case HTML_FORM_OFF:
        EndForm();
        break;

    // Vorlagen:
    case HTML_PARABREAK_ON:
        if( nOpenParaToken )
            EndPara( TRUE );
        NewPara();
        break;

    case HTML_PARABREAK_OFF:
        EndPara( TRUE );
        break;

    case HTML_ADDRESS_ON:
        if( nOpenParaToken )
            EndPara();
        NewTxtFmtColl( HTML_ADDRESS_ON, RES_POOLCOLL_SENDADRESS );
        break;

    case HTML_ADDRESS_OFF:
        if( nOpenParaToken )
            EndPara();
        EndTxtFmtColl( HTML_ADDRESS_OFF );
        break;

    case HTML_BLOCKQUOTE_ON:
    case HTML_BLOCKQUOTE30_ON:
        if( nOpenParaToken )
            EndPara();
        NewTxtFmtColl( HTML_BLOCKQUOTE_ON, RES_POOLCOLL_HTML_BLOCKQUOTE );
        break;

    case HTML_BLOCKQUOTE_OFF:
    case HTML_BLOCKQUOTE30_OFF:
        if( nOpenParaToken )
            EndPara();
        EndTxtFmtColl( HTML_BLOCKQUOTE_ON );
        break;

    case HTML_PREFORMTXT_ON:
    case HTML_LISTING_ON:
    case HTML_XMP_ON:
        if( nOpenParaToken )
            EndPara();
        NewTxtFmtColl( nToken, RES_POOLCOLL_HTML_PRE );
        break;

    case HTML_PREFORMTXT_OFF:
        bNoParSpace = TRUE; // der letzte PRE-Absatz muss einen Zeilenabstand bekommen
        EndTxtFmtColl( HTML_PREFORMTXT_OFF );
        break;

    case HTML_LISTING_OFF:
    case HTML_XMP_OFF:
        EndTxtFmtColl( nToken );
        break;

    case HTML_HEAD1_ON:
    case HTML_HEAD2_ON:
    case HTML_HEAD3_ON:
    case HTML_HEAD4_ON:
    case HTML_HEAD5_ON:
    case HTML_HEAD6_ON:
        if( nOpenParaToken )
        {
            if( IsReadPRE() )
                nOpenParaToken = 0;
            else
                EndPara();
        }
        NewHeading( nToken );
        break;

    case HTML_HEAD1_OFF:
    case HTML_HEAD2_OFF:
    case HTML_HEAD3_OFF:
    case HTML_HEAD4_OFF:
    case HTML_HEAD5_OFF:
    case HTML_HEAD6_OFF:
        EndHeading();
        break;

    case HTML_TABLE_ON:
        if( pPendStack )
            BuildTable( SVX_ADJUST_END );
        else
        {
            if( nOpenParaToken )
                EndPara();
            ASSERT( !pTable, "Tabelle in Tabelle darf hier nicht vorkommen" );
            if( !pTable && (IsNewDoc() || !pPam->GetNode()->FindTableNode()) &&
                (pPam->GetPoint()->nNode.GetIndex() >
                            pDoc->GetNodes().GetEndOfExtras().GetIndex() ||
                !pPam->GetNode()->FindFootnoteStartNode() ) )
            {
                if ( nParaCnt < 5 )
                    Show();     // bis hierhin schon mal anzeigen

                SvxAdjust eAdjust = aAttrTab.pAdjust
                    ? ((const SvxAdjustItem&)aAttrTab.pAdjust->GetItem()).
                                             GetAdjust()
                    : SVX_ADJUST_END;
                BuildTable( eAdjust );
            }
            else
                bInsertUnknown = bKeepUnknown;
        }
        break;

    // Listen
    case HTML_DIRLIST_ON:
    case HTML_MENULIST_ON:
    case HTML_ORDERLIST_ON:
    case HTML_UNORDERLIST_ON:
        if( nOpenParaToken )
            EndPara();
        NewNumBulList( nToken );
        break;

    case HTML_DIRLIST_OFF:
    case HTML_MENULIST_OFF:
    case HTML_ORDERLIST_OFF:
    case HTML_UNORDERLIST_OFF:
        if( nOpenParaToken )
            EndPara();
        EndNumBulListItem( 0, TRUE, GetNumInfo().GetDepth()==1 );
        EndNumBulList( nToken );
        break;

    case HTML_LI_ON:
    case HTML_LISTHEADER_ON:
        if( nOpenParaToken &&
            (pPam->GetPoint()->nContent.GetIndex()
            || HTML_PARABREAK_ON==nOpenParaToken) )
        {
            // nure bei <P><LI> den Absatz beenden, aber nicht bei <DD><LI>
            EndPara();
        }

        EndNumBulListItem( 0, FALSE );// <LI>/<LH> beenden und keine Vorl. setzen
        NewNumBulListItem( nToken );
        break;

    case HTML_LI_OFF:
    case HTML_LISTHEADER_OFF:
        EndNumBulListItem( nToken, FALSE );
        break;

    // Attribute :
    case HTML_ITALIC_ON:
        {
            NewStdAttr( HTML_ITALIC_ON, &aAttrTab.pItalic,
                        SvxPostureItem(ITALIC_NORMAL) );
        }
        break;

    case HTML_BOLD_ON:
        {
            NewStdAttr( HTML_BOLD_ON, &aAttrTab.pBold,
                        SvxWeightItem(WEIGHT_BOLD) );
        }
        break;


    case HTML_STRIKE_ON:
    case HTML_STRIKETHROUGH_ON:
        {
            NewStdAttr( HTML_STRIKE_ON, &aAttrTab.pStrike,
                        SvxCrossedOutItem(STRIKEOUT_SINGLE) );
        }
        break;

    case HTML_UNDERLINE_ON:
        {
            NewStdAttr( HTML_UNDERLINE_ON, &aAttrTab.pUnderline,
                        SvxUnderlineItem(UNDERLINE_SINGLE) );
        }
        break;

    case HTML_SUPERSCRIPT_ON:
        {
            NewStdAttr( HTML_SUPERSCRIPT_ON, &aAttrTab.pEscapement,
                        SvxEscapementItem(HTML_ESC_SUPER,HTML_ESC_PROP) );
        }
        break;

    case HTML_SUBSCRIPT_ON:
        {
            NewStdAttr( HTML_SUBSCRIPT_ON, &aAttrTab.pEscapement,
                        SvxEscapementItem(HTML_ESC_SUB,HTML_ESC_PROP) );
        }
        break;

    case HTML_BLINK_ON:
        {
            NewStdAttr( HTML_BLINK_ON, &aAttrTab.pBlink,
                        SvxBlinkItem( TRUE ) );
        }
        break;

    case HTML_SPAN_ON:
        NewStdAttr( HTML_SPAN_ON );
        break;


    case HTML_ITALIC_OFF:
    case HTML_BOLD_OFF:
    case HTML_STRIKE_OFF:
    case HTML_UNDERLINE_OFF:
    case HTML_SUPERSCRIPT_OFF:
    case HTML_SUBSCRIPT_OFF:
    case HTML_BLINK_OFF:
    case HTML_SPAN_OFF:
        EndTag( nToken );
        break;

    case HTML_STRIKETHROUGH_OFF:
        EndTag( HTML_STRIKE_OFF );
        break;

    case HTML_BASEFONT_ON:
        NewBasefontAttr();
        break;
    case HTML_BASEFONT_OFF:
        EndBasefontAttr();
        break;
    case HTML_FONT_ON:
    case HTML_BIGPRINT_ON:
    case HTML_SMALLPRINT_ON:
        NewFontAttr( nToken );
        break;
    case HTML_FONT_OFF:
    case HTML_BIGPRINT_OFF:
    case HTML_SMALLPRINT_OFF:
        EndFontAttr( nToken );
        break;

    case HTML_EMPHASIS_ON:
    case HTML_CITIATION_ON:
    case HTML_STRONG_ON:
    case HTML_CODE_ON:
    case HTML_SAMPLE_ON:
    case HTML_KEYBOARD_ON:
    case HTML_VARIABLE_ON:
    case HTML_DEFINSTANCE_ON:
    case HTML_SHORTQUOTE_ON:
    case HTML_LANGUAGE_ON:
    case HTML_AUTHOR_ON:
    case HTML_PERSON_ON:
    case HTML_ACRONYM_ON:
    case HTML_ABBREVIATION_ON:
    case HTML_INSERTEDTEXT_ON:
    case HTML_DELETEDTEXT_ON:

    case HTML_TELETYPE_ON:
        NewCharFmt( nToken );
        break;

    case HTML_SDFIELD_ON:
        NewField();
        bCallNextToken = bInField && pTable!=0;
        break;

    case HTML_EMPHASIS_OFF:
    case HTML_CITIATION_OFF:
    case HTML_STRONG_OFF:
    case HTML_CODE_OFF:
    case HTML_SAMPLE_OFF:
    case HTML_KEYBOARD_OFF:
    case HTML_VARIABLE_OFF:
    case HTML_DEFINSTANCE_OFF:
    case HTML_SHORTQUOTE_OFF:
    case HTML_LANGUAGE_OFF:
    case HTML_AUTHOR_OFF:
    case HTML_PERSON_OFF:
    case HTML_ACRONYM_OFF:
    case HTML_ABBREVIATION_OFF:
    case HTML_INSERTEDTEXT_OFF:
    case HTML_DELETEDTEXT_OFF:

    case HTML_TELETYPE_OFF:
        EndTag( nToken );
        break;

    case HTML_HEAD_OFF:
        if( aStyleSource.Len() )
        {
            pCSS1Parser->ParseStyleSheet( aStyleSource );
            aStyleSource.Erase();
        }
        break;

    case HTML_DOCTYPE:
    case HTML_BODY_OFF:
    case HTML_HTML_ON:
    case HTML_HTML_OFF:
    case HTML_HEAD_ON:
    case HTML_TITLE_OFF:
        break;      // nicht weiter auswerten, oder???

    case HTML_INPUT:
        InsertInput();
        break;

    case HTML_TEXTAREA_ON:
        NewTextArea();
        bCallNextToken = bTextArea && pTable!=0;
        break;

    case HTML_SELECT_ON:
        NewSelect();
        bCallNextToken = bSelect && pTable!=0;
        break;

    case HTML_ANCHOR_ON:
        NewAnchor();
        break;

    case HTML_ANCHOR_OFF:
        EndAnchor();
        break;

    case HTML_COMMENT:
        if( aToken.Len() > 5 )
        {
            // als Post-It einfuegen
            String aComment( aToken.Copy( 3, aToken.Len()-5 ) );
            aComment.EraseLeadingChars().EraseTrailingChars();
            InsertComment( aComment );
        }
        break;

    case HTML_MAP_ON:
        // Image Maps werden asynchron gelesen: Zunaechst wird nur eine
        // ImageMap angelegt. Die Bereiche kommen spaeter. Trozdem wird
        // die ImageMap schon in das IMap-Array eingetragen, denn sie
        // koennte ja schon verwendet werden.
        pImageMap = new ImageMap;
        if( ParseMapOptions( pImageMap) )
        {
            if( !pImageMaps )
                pImageMaps = new ImageMaps;
            pImageMaps->Insert( pImageMap, pImageMaps->Count() );
        }
        else
        {
            delete pImageMap;
            pImageMap = 0;
        }
        break;

    case HTML_MAP_OFF:
        // jetzt gibt es keine ImageMap mehr (IMap nicht Loeschen, denn
        // die stckt ja schon in dem Array!)
        pImageMap = 0;
        break;

    case HTML_AREA:
        if( pImageMap )
            ParseAreaOptions( pImageMap, SFX_EVENT_MOUSEOVER_OBJECT,
                                         SFX_EVENT_MOUSEOUT_OBJECT );
        break;

    case HTML_FRAMESET_ON:
        bInsertUnknown = bKeepUnknown;
        break;

    case HTML_NOFRAMES_ON:
        if( IsInHeader() )
            FinishHeader( TRUE );
        bInsertUnknown = bKeepUnknown;
        break;

    case HTML_UNKNOWNCONTROL_ON:
        // Im Header muss der Inhalt von unbekannten Token ignoriert werden,
        // es sei denn, das Token faengt mit einem '!' an.
        if( IsInHeader() && !IsReadPRE() && !aUnknownToken.Len() &&
            sSaveToken.Len() && '!' != sSaveToken.GetChar(0) &&
            '%' != sSaveToken.GetChar(0) )
            aUnknownToken = sSaveToken;
        // kein break

    default:
        bInsertUnknown = bKeepUnknown;
        break;
    }

    if( bGetIDOption )
        InsertIDOption();

    if( bInsertUnknown )
    {
        String aComment(
            String::CreateFromAscii(TOOLS_CONSTASCII_STRINGPARAM("HTML: <")) );
        if( (HTML_TOKEN_ONOFF & nToken) != 0 && (1 & nToken) != 0 )
            aComment += '/';
        aComment += sSaveToken;
        if( aToken.Len() )
        {
            UnescapeToken();
            (aComment += ' ') += aToken;
        }
        aComment += '>';
        InsertComment( aComment );
    }

    // wenn es noch vorlaefige Absatz-Attribute gibt, der Absatz aber
    // nicht leer ist, dann sind die Absatz-Attribute entgueltig.
    if( aParaAttrs.Count() && pPam->GetPoint()->nContent.GetIndex() )
        aParaAttrs.Remove( 0, aParaAttrs.Count() );
}

/*  */

BOOL SwHTMLParser::AppendTxtNode( SwHTMLAppendMode eMode, BOOL bUpdateNum )
{
    // Ein harter Zeilen-Umbruch am Ende muss immer entfernt werden.
    // Einen zweiten ersetzen wir durch einen Absatz-Abstand.
    xub_StrLen nLFStripped = StripTrailingLF();
    if( (AM_NOSPACE==eMode || AM_SOFTNOSPACE==eMode) && nLFStripped > 1 )
        eMode = AM_SPACE;

    // die harten Attribute an diesem Absatz werden nie mehr ungueltig
    if( aParaAttrs.Count() )
        aParaAttrs.Remove( 0, aParaAttrs.Count() );

    if( AM_SPACE==eMode || AM_NOSPACE==eMode )
    {
        SwTxtNode *pTxtNode =
            pDoc->GetNodes()[pPam->GetPoint()->nNode]->GetTxtNode();

        const SvxULSpaceItem& rULSpace =
            (const SvxULSpaceItem&)pTxtNode->SwCntntNode::GetAttr( RES_UL_SPACE );

        BOOL bChange = AM_NOSPACE==eMode ? rULSpace.GetLower() > 0
                                         : rULSpace.GetLower() == 0;

        if( bChange )
        {
            const SvxULSpaceItem& rCollULSpace =
                pTxtNode->GetAnyFmtColl().GetULSpace();

            BOOL bMayReset = AM_NOSPACE==eMode ? rCollULSpace.GetLower() == 0
                                               : rCollULSpace.GetLower() > 0;

            if( bMayReset &&
                rCollULSpace.GetUpper() == rULSpace.GetUpper() )
            {
                pTxtNode->ResetAttr( RES_UL_SPACE );
            }
            else
            {
                pTxtNode->SwCntntNode::SetAttr(
                    SvxULSpaceItem( rULSpace.GetUpper(),
                         AM_NOSPACE==eMode ? 0 : HTML_PARSPACE ) );
            }
        }
    }
    bNoParSpace = AM_NOSPACE==eMode || AM_SOFTNOSPACE==eMode;

    SwPosition aOldPos( *pPam->GetPoint() );

    BOOL bRet = pDoc->AppendTxtNode( *pPam->GetPoint() );

    // Zeichen-Attribute aufspalten und ggf keine setzen, die ueber den
    // ganzen Absatz gesetzt sind
    const SwNodeIndex& rEndIdx = aOldPos.nNode;
    xub_StrLen nEndCnt = aOldPos.nContent.GetIndex();
    const SwPosition& rPos = *pPam->GetPoint();

    _HTMLAttr** pTbl = (_HTMLAttr**)&aAttrTab;
    for( USHORT nCnt = sizeof( _HTMLAttrTable ) / sizeof( _HTMLAttr* );
         nCnt--; ++pTbl )
    {
        _HTMLAttr *pAttr = *pTbl;
        if( pAttr && pAttr->GetItem().Which() < RES_PARATR_BEGIN )
        {
            BOOL bWholePara = FALSE;

            while( pAttr )
            {
                _HTMLAttr *pNext = pAttr->GetNext();
                if( pAttr->GetSttParaIdx() < rEndIdx.GetIndex() ||
                    (!bWholePara &&
                     pAttr->GetSttPara() == rEndIdx &&
                     pAttr->GetSttCnt() != nEndCnt) )
                {
                    // den besehrigen Teil setzen
                    _HTMLAttr *pSetAttr =
                        pAttr->Clone( rEndIdx, nEndCnt );
                    pAttr->ClearPrev();

                    bWholePara =
                        pAttr->GetSttPara() == rEndIdx &&
                        pAttr->GetSttCnt() == 0;

                    // Wenn das Attribut den gesamten Absatz umspannt, werden
                    // alle auesseren Attribute nicht mehr beachtet. Deshalb
                    // darf es auch nicht in die Prev-Liste eines ausseren
                    // Attributs eingetragen werden, denn dieses wird ja
                    // erstmal nicht gesetzt. Das fuehrt zu verschiebenungen,
                    // wenn Felder ins Rennen kommen (siehe #51020#)
                    if( !pNext || bWholePara )
                    {
                        USHORT nTmp = pAttr->bInsAtStart ? 0
                                                         : aSetAttrTab.Count();
                        aSetAttrTab.Insert( pSetAttr, nTmp );
                    }
                    else
                        pNext->InsertPrev( pSetAttr );
                }

                pAttr->SetStart( rPos );
                pAttr = pNext;
            }
        }
    }

    if( bUpdateNum )
    {
        if( GetNumInfo().GetDepth() )
            SetNodeNum( GetNumInfo().GetLevel() | NO_NUMLEVEL );
        else
            pPam->GetNode()->GetTxtNode()->ResetAttr( RES_PARATR_NUMRULE );
    }

    // Attrubute im Absatz davor sollte man jetzt setzen (wegen JavaScript)
    SetAttr();

    if( !pTable && !--nParaCnt )
        Show();

    return bRet;
}

void SwHTMLParser::AddParSpace()
{
    if( !bNoParSpace )
        return;

    bNoParSpace = FALSE;

    ULONG nNdIdx = pPam->GetPoint()->nNode.GetIndex() - 1;

    SwTxtNode *pTxtNode = pDoc->GetNodes()[nNdIdx]->GetTxtNode();
    if( !pTxtNode )
        return;

    SvxULSpaceItem rULSpace =
        (const SvxULSpaceItem&)pTxtNode->SwCntntNode::GetAttr( RES_UL_SPACE );
    if( !rULSpace.GetLower() )
    {
        const SvxULSpaceItem& rCollULSpace =
            pTxtNode->GetAnyFmtColl().GetULSpace();
        if( rCollULSpace.GetLower() &&
            rCollULSpace.GetUpper() == rULSpace.GetUpper() )
        {
            pTxtNode->ResetAttr( RES_UL_SPACE );
        }
        else
        {
            pTxtNode->SwCntntNode::SetAttr(
                SvxULSpaceItem( rULSpace.GetUpper(), HTML_PARSPACE )  );
        }
    }
}


void SwHTMLParser::Show()
{
    // Hier wird
    // - ein EndAction gerufen, damit formatiert wird
    // - ein Reschedule gerufen,
    // - die eiegen View-Shell wieder gesetzt
    // - und Start-Action gerufen

    ASSERT( SVPAR_WORKING==eState, "Show nicht im Working-State - Das kann ins Auge gehen" );
    ViewShell *pOldVSh = CallEndAction();

    SetSaveBaseURL();
    GetpApp()->Reschedule();
    GetSaveAndSetOwnBaseURL();

    if( ( pDoc->GetDocShell() && pDoc->GetDocShell()->IsAbortingImport() )
        || 1 == pDoc->GetLinkCnt() )
    {
        // wurde der Import vom SFX abgebrochen?
        eState = SVPAR_ERROR;
    }

    // Die ViewShell nochmal holen, denn sie koennte im Reschedule
    // zerstoert wirden sein.
    ViewShell *pVSh = CallStartAction( pOldVSh );
    ASSERT( pOldVSh == pVSh, "Show:: Shell wurde ausgetauscht" );

    // ist der aktuelle Node nicht mehr sichtbar, dann benutzen wir
    // eine groessere Schrittweite
    if( pVSh )
        nParaCnt = pDoc->GetNodes()[pPam->GetPoint()->nNode]
                       ->IsVisible(pVSh) ? 5 : 50;
}

void SwHTMLParser::ShowStatline()
{
    // Hier wird
    // - ein Reschedule gerufen, damit gescrollt werden kann
    // - die eiegen View-Shell wieder gesetzt
    // - ein Start/End-Action gerufen, wenn gescrollt wurde.

    ASSERT( SVPAR_WORKING==eState, "ShowStatLine nicht im Working-State - Das kann ins Auge gehen" );

    // Laufbalkenanzeige
    SetSaveBaseURL();
    if( !GetMedium() || !GetMedium()->IsRemote() )
    {
        ::SetProgressState( rInput.Tell(), pDoc->GetDocShell() );
        GetSaveAndSetOwnBaseURL();
        CheckActionViewShell();
    }
    else
    {
        GetpApp()->Reschedule();
        GetSaveAndSetOwnBaseURL();

        if( ( pDoc->GetDocShell() && pDoc->GetDocShell()->IsAbortingImport() )
            || 1 == pDoc->GetLinkCnt() )
            // wurde der Import vom SFX abgebrochen?
            eState = SVPAR_ERROR;

        ViewShell *pVSh = CheckActionViewShell();
        if( pVSh && pVSh->HasInvalidRect() )
        {
            CallEndAction( FALSE, FALSE );
            CallStartAction( pVSh, FALSE );
        }
    }
}

ViewShell *SwHTMLParser::CallStartAction( ViewShell *pVSh, BOOL bChkPtr )
{
    ASSERT( !pActionViewShell, "CallStartAction: ViewShell schon gesetzt" );

    if( !pVSh || bChkPtr )
    {
        ViewShell *pOldVSh = pVSh;
        pDoc->GetEditShell( &pVSh );
        ASSERT( !pVSh || !pOldVSh || pOldVSh == pVSh,
                "CallStartAction: Wer hat die ViewShell ausgetauscht?" );
#ifdef DEBUG
        if( pOldVSh && !pVSh )
            pVSh = 0;
#endif
    }
    pActionViewShell = pVSh;

    if( pActionViewShell )
    {
        if( pActionViewShell->ISA( SwEditShell ) )
            ((SwEditShell*)pActionViewShell)->StartAction();
        else
            pActionViewShell->StartAction();
    }

    return pActionViewShell;
}

ViewShell *SwHTMLParser::CallEndAction( BOOL bChkAction, BOOL bChkPtr )
{
    if( bChkPtr )
    {
        ViewShell *pVSh = 0;
        pDoc->GetEditShell( &pVSh );
        ASSERT( !pVSh || pActionViewShell == pVSh,
                "CallEndAction: Wer hat die ViewShell ausgetauscht?" );
#ifdef DEBUG
        if( pActionViewShell && !pVSh )
            pVSh = 0;
#endif
        if( pVSh != pActionViewShell )
            pActionViewShell = 0;
    }

    if( !pActionViewShell || (bChkAction && !pActionViewShell->ActionPend()) )
        return pActionViewShell;

    if( bSetCrsr )
    {
        // an allen CrsrEditShells die Cursor auf den Doc-Anfang setzen
        ViewShell *pSh = pActionViewShell;
        do {
            if( pSh->IsA( TYPE( SwCrsrShell ) ) )
                ((SwCrsrShell*)pSh)->SttDoc();
            pSh = (ViewShell *)pSh->GetNext();
        } while( pSh != pActionViewShell );

        bSetCrsr = FALSE;
    }
    if( pActionViewShell->ISA( SwEditShell ) )
    {
        //Schon gescrollt?, dann dafuer sorgen, dass die View sich nicht bewegt!
        const FASTBOOL bOldLock = pActionViewShell->IsViewLocked();
        pActionViewShell->LockView( TRUE );
        const FASTBOOL bOldEndActionByVirDev = pActionViewShell->IsEndActionByVirDev();
        pActionViewShell->SetEndActionByVirDev( TRUE );;
        ((SwEditShell*)pActionViewShell)->EndAction();
        pActionViewShell->SetEndActionByVirDev( bOldEndActionByVirDev );
        pActionViewShell->LockView( bOldLock );

        // bChkJumpMark ist nur gesetzt, wenn das Object auch gefunden wurde
        if( bChkJumpMark )
        {
            const Point aVisSttPos( DOCUMENTBORDER, DOCUMENTBORDER );
            if( GetMedium() && aVisSttPos == pActionViewShell->VisArea().Pos() )
                ::JumpToSwMark( pActionViewShell,
                                GetMedium()->GetURLObject().GetMark() );
            bChkJumpMark = FALSE;
        }
    }
    else
        pActionViewShell->EndAction();

    // sollte der Parser der Letzte sein, der das Doc haelt, dann kann
    // man hier abbrechen und einen Fehler setzen.
    if( 1 == pDoc->GetLinkCnt() )
    {
        eState = SVPAR_ERROR;
    }

    ViewShell *pVSh = pActionViewShell;
    pActionViewShell = 0;

    return pVSh;
}

ViewShell *SwHTMLParser::CheckActionViewShell()
{
    ViewShell *pVSh = 0;
    pDoc->GetEditShell( &pVSh );
    ASSERT( !pVSh || pActionViewShell == pVSh,
            "CheckActionViewShell: Wer hat die ViewShell ausgetauscht?" );
#ifdef DEBUG
    if( pActionViewShell && !pVSh )
        pVSh = 0;
#endif
    if( pVSh != pActionViewShell )
        pActionViewShell = 0;

    return pActionViewShell;
}

/*  */

void SwHTMLParser::_SetAttr( BOOL bChkEnd, BOOL bBeforeTable,
                             _HTMLAttrs *pPostIts )
{
    SwPaM* pAttrPam = new SwPaM( *pPam->GetPoint() );
    const SwNodeIndex& rEndIdx = pPam->GetPoint()->nNode;
    xub_StrLen nEndCnt = pPam->GetPoint()->nContent.GetIndex();
    _HTMLAttr* pAttr;
    SwCntntNode* pCNd;

    _HTMLAttrs aFields( 5, 5 );

    for( USHORT n = aSetAttrTab.Count(); n; )
    {
        pAttr = aSetAttrTab[ --n ];
        USHORT nWhich = pAttr->pItem->Which();

        ULONG nEndParaIdx = pAttr->GetEndParaIdx();
        BOOL bSetAttr;
        if( bChkEnd )
        {
            // fix #42192#: Zechen-Attribute mit Ende moeglich frueh,
            // also noch im aktuellen Absatz setzen (wegen JavaScript
            // und diversen Chats). das darf man aber nicht fuer Attribute,
            // die ueber den ganzen Absatz aufgspannt werden sollen, weil
            // sie aus Absatzvorlgen stammen, die nicht gesetzt werden
            // koennen. Weil die Attribute mit SETATTR_DONTREPLACE
            // eingefuegt werden, sollte man sie auch anchtraeglich
            // noch setzen koennen.
            bSetAttr = ( nEndParaIdx < rEndIdx.GetIndex() &&
                         (RES_LR_SPACE != nWhich || !GetNumInfo().GetNumRule()) ) ||
                       ( !pAttr->IsLikePara() &&
                         nEndParaIdx == rEndIdx.GetIndex() &&
                         pAttr->GetEndCnt() < nEndCnt &&
                         RES_CHRATR_BEGIN <= nWhich &&
                         RES_TXTATR_WITHEND_END > nWhich ) ||
                       ( bBeforeTable &&
                         nEndParaIdx == rEndIdx.GetIndex() &&
                         !pAttr->GetEndCnt() );
        }
        else
        {
            // Attribiute im Content-Bereich duerfen nicht gesetzt
            // werden, wenn wir in einem Sonderbereich stehen, aber
            // umgekekehrt schon.
            ULONG nEndOfIcons = pDoc->GetNodes().GetEndOfExtras().GetIndex();
            bSetAttr = nEndParaIdx < rEndIdx.GetIndex() ||
                       rEndIdx.GetIndex() > nEndOfIcons ||
                       nEndParaIdx <= nEndOfIcons;
        }

        if( bSetAttr )
        {
            // Das Attribute darf nicht in der liste der vorlaeufigen
            // Absatz-Attribute stehen, weil es sonst geloescht wurde.
            USHORT ii = aParaAttrs.Count();
            while( ii-- )
            {
                ASSERT( pAttr != aParaAttrs[ii],
                        "SetAttr: Attribut duerfte noch nicht gesetzt werden" );
                aParaAttrs.Remove( ii );
            }


            // dann also setzen
            aSetAttrTab.Remove( n, 1 );

            while( pAttr )
            {
                _HTMLAttr *pPrev = pAttr->GetPrev();
                if( !pAttr->bValid )
                {
                    // ungueltige Attribute koennen gloescht werden
                    delete pAttr;
                    pAttr = pPrev;
                    continue; //break;
                }


                pCNd = pDoc->GetNodes()[ pAttr->nSttPara ]->GetCntntNode();
                if( !pCNd )
                {
                    // durch die elende Loescherei von Nodes kann auch mal
                    // ein Index auf einen End-Node zeigen :-(
                    if( pAttr->GetSttPara() == pAttr->GetEndPara() &&
                        (nWhich < RES_TXTATR_NOEND_BEGIN ||
                         nWhich >= RES_TXTATR_NOEND_END) )
                    {
                        // wenn der End-Index auch auf den Node zeigt
                        // brauchen wir auch kein Attribut mehr zu setzen,
                        // es sei denn, es ist ein Text-Attribut.
                        delete pAttr;
                        pAttr = pPrev;
                        continue; //break;
                    }
                    pCNd = pDoc->GetNodes().GoNext( &(pAttr->nSttPara) );
                    if( pCNd )
                        pAttr->nSttCntnt = 0;
                    else
                    {
                        ASSERT( !this, "SetAttr: GoNext() failed!" );
                        delete pAttr;
                        pAttr = pPrev;
                        continue; // break;
                    }
                }
                pAttrPam->GetPoint()->nNode = pAttr->nSttPara;



                // durch das Loeschen von BRs kann der Start-Index
                // auch mal hinter das Ende des Textes zeigen
                if( pAttr->nSttCntnt > pCNd->Len() )
                    pAttr->nSttCntnt = pCNd->Len();
                pAttrPam->GetPoint()->nContent.Assign( pCNd, pAttr->nSttCntnt );

                pAttrPam->SetMark();
                if( pAttr->GetSttPara() != pAttr->GetEndPara() &&
                    (nWhich < RES_TXTATR_NOEND_BEGIN ||
                     nWhich >= RES_TXTATR_NOEND_END) )
                {
                    pCNd = pDoc->GetNodes()[ pAttr->nEndPara ]->GetCntntNode();
                    if( !pCNd )
                    {
                        pCNd = pDoc->GetNodes().GoPrevious( &(pAttr->nEndPara) );
                        if( pCNd )
                            pAttr->nEndCntnt = pCNd->Len();
                        else
                        {
                            ASSERT( !this, "SetAttr: GoPrevious() failed!" );
                            pAttrPam->DeleteMark();
                            delete pAttr;
                            pAttr = pPrev;
                            continue; // break;
                        }
                    }

                    pAttrPam->GetPoint()->nNode = pAttr->nEndPara;
                }
                else if( pAttr->IsLikePara() )
                {
                    pAttr->nEndCntnt = pCNd->Len();
                }

                // durch das Loeschen von BRs kann der End-Index
                // auch mal hinter das Ende des Textes zeigen
                if( pAttr->nEndCntnt > pCNd->Len() )
                    pAttr->nEndCntnt = pCNd->Len();

                pAttrPam->GetPoint()->nContent.Assign( pCNd, pAttr->nEndCntnt );
                if( bBeforeTable &&
                    pAttrPam->GetPoint()->nNode.GetIndex() ==
                        rEndIdx.GetIndex() )
                {
                    // wenn wir vor dem Einfuegen einer Tabelle stehen
                    // und das Attribut im aktuellen Node beendet wird,
                    // muessen wir es im Node davor beenden oder wegschmeissen,
                    // wenn es erst in dem Node beginnt
                    if( nWhich != RES_BREAK && nWhich != RES_PAGEDESC &&
                        (nWhich < RES_TXTATR_NOEND_BEGIN ||
                         nWhich >= RES_TXTATR_NOEND_END) )
                    {
                        if( pAttrPam->GetMark()->nNode.GetIndex() !=
                            rEndIdx.GetIndex() )
                        {
                            ASSERT( !pAttrPam->GetPoint()->nContent.GetIndex(),
                                    "Content-Position vor Tabelle nicht 0???" );
                            pAttrPam->Move( fnMoveBackward );
                        }
                        else
                        {
                            pAttrPam->DeleteMark();
                            delete pAttr;
                            pAttr = pPrev;
                            continue;
                        }
                    }
                }

                switch( nWhich )
                {
                case RES_FLTR_BOOKMARK:     // dann also ein Bookmark einfuegen
                    {
                        String aName( ((SfxStringItem*)pAttr->pItem)->GetValue() );
                        USHORT nBookPos = pDoc->FindBookmark( aName );
                        if( nBookPos != USHRT_MAX )
                        {
                            const SwBookmark *pBkMk =
                                pDoc->GetBookmarks()[nBookPos];
                            if( pBkMk->GetPos() != *pAttrPam->GetPoint() )
                                pDoc->MakeUniqueBookmarkName( aName );
                            else
                                break; // keine doppelte Bookmark an dieser Pos
                        }
                        pAttrPam->DeleteMark();
                        pDoc->MakeBookmark( *pAttrPam, KeyCode(),
                                            aName, aEmptyStr );

                        // ggfs. ein Bookmark anspringen
                        if( JUMPTO_MARK == eJumpTo &&
                            aName == sJmpMark )
                        {
                            bChkJumpMark = TRUE;
                            eJumpTo = JUMPTO_NONE;
                        }
                    }
                    break;
                case RES_TXTATR_FIELD:
                    {
                        USHORT nFldWhich =
                            pPostIts ? ((const SwFmtFld *)pAttr->pItem)
                                            ->GetFld()->GetTyp()->Which() : 0;
                        if( pPostIts && (RES_POSTITFLD == nFldWhich ||
                                         RES_SCRIPTFLD == nFldWhich) )
                        {
                            pPostIts->Insert( pAttr, 0 );
                        }
                        else
                        {
                            aFields.Insert( pAttr, aFields.Count() );
                        }
                    }
                    pAttrPam->DeleteMark();
                    pAttr = pPrev;
                    continue;

                case RES_LR_SPACE:
                    if( pAttrPam->GetPoint()->nNode.GetIndex() ==
                        pAttrPam->GetMark()->nNode.GetIndex() &&
                        pCNd )
                    {
                        // wegen Numerierungen dieses Attribut direkt
                        // am Node setzen
                        pCNd->SetAttr( *pAttr->pItem );
                        break;
                    }
                    ASSERT( !this,
                            "LRSpace ueber mehrere Absaetze gesetzt!" );
                    // kein break (hier sollen wir trotzdem nie hinkommen;
                default:

                    // ggfs. ein Bookmark anspringen
                    if( RES_TXTATR_INETFMT == nWhich &&
                        JUMPTO_MARK == eJumpTo &&
                        sJmpMark == ((SwFmtINetFmt*)pAttr->pItem)->GetName() )
                    {
                        bChkJumpMark = TRUE;
                        eJumpTo = JUMPTO_NONE;
                    }

                    pDoc->Insert( *pAttrPam, *pAttr->pItem, SETATTR_DONTREPLACE );
                }
                pAttrPam->DeleteMark();

                delete pAttr;
                pAttr = pPrev;
            }
        }
    }

    for( n = aMoveFlyFrms.Count(); n; )
    {
        SwFrmFmt *pFrmFmt = aMoveFlyFrms[ --n ];

        const SwFmtAnchor& rAnchor = pFrmFmt->GetAnchor();
        ASSERT( FLY_AT_CNTNT==rAnchor.GetAnchorId(),
                "Nur Auto-Rahmen brauchen eine Spezialbehandlung" );
        const SwPosition *pFlyPos = rAnchor.GetCntntAnchor();
        ULONG nFlyParaIdx = pFlyPos->nNode.GetIndex();
        BOOL bMoveFly;
        if( bChkEnd )
        {
            bMoveFly = nFlyParaIdx < rEndIdx.GetIndex() ||
                       ( nFlyParaIdx == rEndIdx.GetIndex() &&
                         aMoveFlyCnts[n] < nEndCnt );
        }
        else
        {
            ULONG nEndOfIcons = pDoc->GetNodes().GetEndOfExtras().GetIndex();
            bMoveFly = nFlyParaIdx < rEndIdx.GetIndex() ||
                       rEndIdx.GetIndex() > nEndOfIcons ||
                       nFlyParaIdx <= nEndOfIcons;
        }
        if( bMoveFly )
        {
            pFrmFmt->DelFrms();
            *pAttrPam->GetPoint() = *pFlyPos;
            pAttrPam->GetPoint()->nContent.Assign( pAttrPam->GetCntntNode(),
                                                   aMoveFlyCnts[n] );
            SwFmtAnchor aAnchor( rAnchor );
            aAnchor.SetType( FLY_AUTO_CNTNT );
            aAnchor.SetAnchor( pAttrPam->GetPoint() );
            pFrmFmt->SetAttr( aAnchor );

            const SwFmtHoriOrient& rHoriOri = pFrmFmt->GetHoriOrient();
            if( HORI_LEFT == rHoriOri.GetHoriOrient() )
            {
                SwFmtHoriOrient aHoriOri( rHoriOri );
                aHoriOri.SetRelationOrient( REL_CHAR );
                pFrmFmt->SetAttr( aHoriOri );
            }
            const SwFmtVertOrient& rVertOri = pFrmFmt->GetVertOrient();
            if( VERT_TOP == rVertOri.GetVertOrient() )
            {
                SwFmtVertOrient aVertOri( rVertOri );
                aVertOri.SetRelationOrient( REL_CHAR );
                pFrmFmt->SetAttr( aVertOri );
            }

            pFrmFmt->MakeFrms();
            aMoveFlyFrms.Remove( n, 1 );
            aMoveFlyCnts.Remove( n, 1 );
        }
    }
    while( aFields.Count() )
    {
        pAttr = aFields[0];

        pCNd = pDoc->GetNodes()[ pAttr->nSttPara ]->GetCntntNode();
        pAttrPam->GetPoint()->nNode = pAttr->nSttPara;
        pAttrPam->GetPoint()->nContent.Assign( pCNd, pAttr->nSttCntnt );

        if( bBeforeTable &&
            pAttrPam->GetPoint()->nNode.GetIndex() == rEndIdx.GetIndex() )
        {
            ASSERT( !bBeforeTable, "Aha, der Fall tritt also doch ein" );
            ASSERT( !pAttrPam->GetPoint()->nContent.GetIndex(),
                    "Content-Position vor Tabelle nicht 0???" );
            // !!!
            pAttrPam->Move( fnMoveBackward );
        }

        pDoc->Insert( *pAttrPam, *pAttr->pItem );

        aFields.Remove( 0, 1 );
        delete pAttr;
    }

    delete pAttrPam;
}

void SwHTMLParser::NewAttr( _HTMLAttr **ppAttr, const SfxPoolItem& rItem )
{
    // Font-Hoehen und -Farben- sowie Escapement-Attribute duerfen nicht
    // zusammengefasst werden. Sie werden deshalb in einer Liste gespeichert,
    // in der das zuletzt aufgespannte Attribut vorne steht und der Count
    // immer 1 ist. Fuer alle anderen Attribute wird der Count einfach
    // hochgezaehlt.
    if( *ppAttr )
    {
        _HTMLAttr *pAttr = new _HTMLAttr( *pPam->GetPoint(), rItem,
                                            ppAttr );
        pAttr->InsertNext( *ppAttr );
        (*ppAttr) = pAttr;
    }
    else
        (*ppAttr) = new _HTMLAttr( *pPam->GetPoint(), rItem, ppAttr );
}

void SwHTMLParser::EndAttr( _HTMLAttr* pAttr, _HTMLAttr **ppDepAttr,
                            BOOL bChkEmpty )
{
    ASSERT( !ppDepAttr, "SwHTMLParser::EndAttr: ppDepAttr-Feature ungetestet?" );
    // Der Listenkopf ist im Attribut gespeichert
    _HTMLAttr **ppHead = pAttr->ppHead;

    ASSERT( ppHead, "keinen Attributs-Listenkopf gefunden!" );

    // die aktuelle Psoition als Ende-Position merken
    const SwNodeIndex* pEndIdx = &pPam->GetPoint()->nNode;
    xub_StrLen nEndCnt = pPam->GetPoint()->nContent.GetIndex();

    // WIrd das zueltzt gestartete oder ein frueher gestartetes Attribut
    // beendet?
    _HTMLAttr *pLast = 0;
    if( ppHead && pAttr != *ppHead )
    {
        // Es wird nicht das zuletzt gestartete Attribut beendet

        // Dann suche wir das unmittelbar danach gestartete Attribut, das
        // ja ebenfalls noch nicht beendet wurde (sonst stuende es nicht
        // mehr in der Liste
        pLast = *ppHead;
        while( pLast && pLast->GetNext() != pAttr )
            pLast = pLast->GetNext();

        ASSERT( pLast, "Attribut nicht in eigener Liste gefunden!" );

        // das Attribut nicht an der PaM-Psoition beenden, sondern da,
        // wo das danch gestartete Attribut anfing???
        //pEndIdx = &pPrev->GetSttPara();
        //nEndCnt = pPrev->GetSttCnt();
    }

    BOOL bMoveBack = FALSE;
    USHORT nWhich = pAttr->pItem->Which();
    if( /*!pLast &&*/ !nEndCnt && RES_PARATR_BEGIN <= nWhich &&
        *pEndIdx != pAttr->GetSttPara() )
    {
        // dann eine Cntntnt Position zurueck!
        bMoveBack = pPam->Move( fnMoveBackward );
        nEndCnt = pPam->GetPoint()->nContent.GetIndex();
    }

    // nun das Attrubut beenden
    _HTMLAttr *pNext = pAttr->GetNext();

    // ein Bereich ??
    if( !bChkEmpty || (RES_PARATR_BEGIN <= nWhich && bMoveBack) ||
        RES_PAGEDESC == nWhich || RES_BREAK == nWhich ||
        *pEndIdx != pAttr->GetSttPara() ||
        nEndCnt != pAttr->GetSttCnt() )
    {
        pAttr->nEndPara = *pEndIdx;
        pAttr->nEndCntnt = nEndCnt;
        pAttr->bInsAtStart = RES_TXTATR_INETFMT != nWhich &&
                             RES_TXTATR_CHARFMT != nWhich;

        if( !pNext )
        {
            // keine offenen Attribute dieses Typs mehr da,
            // dann koennen alle gesetzt werden, es sei denn
            // sie haengen noch von einem anderen Attribut ab,
            // dann werden sie dort angehaengt
            if( ppDepAttr && *ppDepAttr )
                (*ppDepAttr)->InsertPrev( pAttr );
            else
            {
                USHORT nTmp = pAttr->bInsAtStart ? 0 : aSetAttrTab.Count();
                aSetAttrTab.Insert( pAttr, nTmp );
            }
        }
        else
        {
            // es gibt noch andere offene Attribute des Typs,
            // daher muss das Setzen zurueckgestellt werden.
            // das aktuelle Attribut wird deshalb hinten an die
            // Previous-Liste des Nachfolgers angehaengt
            pNext->InsertPrev( pAttr );
        }
    }
    else
    {
        // dann nicht einfuegen, sondern Loeschen. Durch das "tuerken" von
        // Vorlagen durch harte Attributierung koennen sich auch mal andere
        // leere Attribute in der Prev-Liste befinden, die dann trotzdem
        // gesetzt werden muessen
        _HTMLAttr *pPrev = pAttr->GetPrev();
        delete pAttr;

        if( pPrev )
        {
            // Die Previous-Attribute muessen trotzdem gesetzt werden.
            if( pNext )
                pNext->InsertPrev( pPrev );
            else
            {
                USHORT nTmp = pPrev->bInsAtStart ? 0 : aSetAttrTab.Count();
                aSetAttrTab.Insert( pPrev, nTmp );
            }
        }

    }

    // wenn das erste Attribut der Liste gesetzt wurde muss noch der
    // Listenkopf korrigiert werden.
    if( pLast )
        pLast->pNext = pNext;
    else if( ppHead )
        *ppHead = pNext;

    if( bMoveBack )
        pPam->Move( fnMoveForward );
}

void SwHTMLParser::DeleteAttr( _HTMLAttr* pAttr )
{
    // Hier darf es keine vorlauefigen Absatz-Attribute geben, den die
    // koennten jetzt gesetzt werden und dann sind die Zeiger ungueltig!!!
    ASSERT( !aParaAttrs.Count(),
            "Hoechste Gefahr: Es gibt noch nicht-endgueltige Absatz-Attribute" );
    if( aParaAttrs.Count() )
        aParaAttrs.Remove( 0, aParaAttrs.Count() );

    // Der Listenkopf ist im Attribut gespeichert
    _HTMLAttr **ppHead = pAttr->ppHead;

    ASSERT( ppHead, "keinen Attributs-Listenkopf gefunden!" );

    // Wird das zueltzt gestartete oder ein frueher gestartetes Attribut
    // entfernt?
    _HTMLAttr *pLast = 0;
    if( ppHead && pAttr != *ppHead )
    {
        // Es wird nicht das zuletzt gestartete Attribut beendet

        // Dann suche wir das unmittelbar danach gestartete Attribut, das
        // ja ebenfalls noch nicht beendet wurde (sonst stuende es nicht
        // mehr in der Liste
        pLast = *ppHead;
        while( pLast && pLast->GetNext() != pAttr )
            pLast = pLast->GetNext();

        ASSERT( pLast, "Attribut nicht in eigener Liste gefunden!" );
    }

    // nun das Attrubut entfernen
    _HTMLAttr *pNext = pAttr->GetNext();
    _HTMLAttr *pPrev = pAttr->GetPrev();
    delete pAttr;

    if( pPrev )
    {
        // Die Previous-Attribute muessen trotzdem gesetzt werden.
        if( pNext )
            pNext->InsertPrev( pPrev );
        else
        {
            USHORT nTmp = pPrev->bInsAtStart ? 0 : aSetAttrTab.Count();
            aSetAttrTab.Insert( pPrev, nTmp );
        }
    }

    // wenn das erste Attribut der Liste entfernt wurde muss noch der
    // Listenkopf korrigiert werden.
    if( pLast )
        pLast->pNext = pNext;
    else if( ppHead )
        *ppHead = pNext;
}

void SwHTMLParser::SaveAttrTab( _HTMLAttrTable& rNewAttrTab )
{
    // Hier darf es keine vorlauefigen Absatz-Attribute geben, den die
    // koennten jetzt gesetzt werden und dann sind die Zeiger ungueltig!!!
    ASSERT( !aParaAttrs.Count(),
            "Hoechste Gefahr: Es gibt noch nicht-endgueltige Absatz-Attribute" );
    if( aParaAttrs.Count() )
        aParaAttrs.Remove( 0, aParaAttrs.Count() );

    _HTMLAttr** pTbl = (_HTMLAttr**)&aAttrTab;
    _HTMLAttr** pSaveTbl = (_HTMLAttr**)&rNewAttrTab;

    for( USHORT nCnt = sizeof( _HTMLAttrTable ) / sizeof( _HTMLAttr* );
         nCnt--; (++pTbl, ++pSaveTbl) )
    {
        *pSaveTbl = *pTbl;

        _HTMLAttr *pAttr = *pSaveTbl;
        while( pAttr )
        {
            pAttr->SetHead( pSaveTbl );
            pAttr = pAttr->GetNext();
        }

        *pTbl = 0;
    }
}

void SwHTMLParser::SplitAttrTab( _HTMLAttrTable& rNewAttrTab,
                                 BOOL bMoveEndBack )
{
    // Hier darf es keine vorlauefigen Absatz-Attribute geben, den die
    // koennten jetzt gesetzt werden und dann sind die Zeiger ungueltig!!!
    ASSERT( !aParaAttrs.Count(),
            "Hoechste Gefahr: Es gibt noch nicht-endgueltige Absatz-Attribute" );
    if( aParaAttrs.Count() )
        aParaAttrs.Remove( 0, aParaAttrs.Count() );

    const SwNodeIndex& nSttIdx = pPam->GetPoint()->nNode;
    SwNodeIndex nEndIdx( nSttIdx );

    // alle noch offenen Attribute beenden und hinter der Tabelle
    // neu aufspannen
    _HTMLAttr** pTbl = (_HTMLAttr**)&aAttrTab;
    _HTMLAttr** pSaveTbl = (_HTMLAttr**)&rNewAttrTab;
    BOOL bSetAttr = TRUE;
    xub_StrLen nSttCnt = pPam->GetPoint()->nContent.GetIndex();
    xub_StrLen nEndCnt = nSttCnt;

    if( bMoveEndBack )
    {
        ULONG nOldEnd = nEndIdx.GetIndex();
        ULONG nTmpIdx;
        if( ( nTmpIdx = pDoc->GetNodes().GetEndOfExtras().GetIndex()) >= nOldEnd ||
            ( nTmpIdx = pDoc->GetNodes().GetEndOfAutotext().GetIndex()) >= nOldEnd )
        {
            nTmpIdx = pDoc->GetNodes().GetEndOfInserts().GetIndex();
        }
        SwCntntNode* pCNd = pDoc->GetNodes().GoPrevious(&nEndIdx);

        // keine Attribute setzen, wenn der PaM aus dem Content-Bereich
        // herausgeschoben wurde.
        bSetAttr = pCNd && nTmpIdx < nEndIdx.GetIndex();

        nEndCnt = (bSetAttr ? pCNd->Len() : 0);
    }
    for( USHORT nCnt = sizeof( _HTMLAttrTable ) / sizeof( _HTMLAttr* );
         nCnt--; (++pTbl, ++pSaveTbl) )
    {
        _HTMLAttr *pAttr = *pTbl;
        *pSaveTbl = 0;
        while( pAttr )
        {
            _HTMLAttr *pNext = pAttr->GetNext();
            _HTMLAttr *pPrev = pAttr->GetPrev();

            if( bSetAttr &&
                ( pAttr->GetSttParaIdx() < nEndIdx.GetIndex() ||
                  (pAttr->GetSttPara() == nEndIdx &&
                   pAttr->GetSttCnt() != nEndCnt) ) )
            {
                // das Attribut muss vor der Liste gesetzt werden. Da wir
                // das Original noch brauchen, weil Zeiger auf das Attribut
                // noch in den Kontexten existieren, muessen wir es clonen.
                // Die Next-Liste geht dabei verloren, aber die
                // Previous-Liste bleibt erhalten
                _HTMLAttr *pSetAttr = pAttr->Clone( nEndIdx, nEndCnt );

                if( pNext )
                    pNext->InsertPrev( pSetAttr );
                else
                {
                    USHORT nTmp = pSetAttr->bInsAtStart ? 0
                                                        : aSetAttrTab.Count();
                    aSetAttrTab.Insert( pSetAttr, nTmp );
                }
            }
            else if( pPrev )
            {
                // Wenn das Attribut nicht gesetzt vor der Tabelle
                // gesetzt werden muss, muessen der Previous-Attribute
                // trotzdem gesetzt werden.
                if( pNext )
                    pNext->InsertPrev( pPrev );
                else
                {
                    USHORT nTmp = pPrev->bInsAtStart ? 0 : aSetAttrTab.Count();
                    aSetAttrTab.Insert( pPrev, nTmp );
                }
            }

            // den Start des Attributs neu setzen und die Verkettungen
            // aufbrechen
            pAttr->Reset( nSttIdx, nSttCnt, pSaveTbl );

            if( *pSaveTbl )
            {
                _HTMLAttr *pSAttr = *pSaveTbl;
                while( pSAttr->GetNext() )
                    pSAttr = pSAttr->GetNext();
                pSAttr->InsertNext( pAttr );
            }
            else
                *pSaveTbl = pAttr;

            pAttr = pNext;
        }

        *pTbl = 0;
    }
}

void SwHTMLParser::RestoreAttrTab( const _HTMLAttrTable& rNewAttrTab,
                                   BOOL bSetNewStart )
{
    // Hier darf es keine vorlauefigen Absatz-Attribute geben, den die
    // koennten jetzt gesetzt werden und dann sind die Zeiger ungueltig!!!
    ASSERT( !aParaAttrs.Count(),
            "Hoechste Gefahr: Es gibt noch nicht-endgueltige Absatz-Attribute" );
    if( aParaAttrs.Count() )
        aParaAttrs.Remove( 0, aParaAttrs.Count() );

    _HTMLAttr** pTbl = (_HTMLAttr**)&aAttrTab;
    _HTMLAttr** pSaveTbl = (_HTMLAttr**)&rNewAttrTab;

    for( USHORT nCnt = sizeof( _HTMLAttrTable ) / sizeof( _HTMLAttr* );
        nCnt--; (++pTbl, ++pSaveTbl) )
    {
        ASSERT( !*pTbl, "Die Attribut-Tabelle ist nicht leer!" );

        const SwPosition *pPos = pPam->GetPoint();
        const SwNodeIndex& rSttPara = pPos->nNode;
        xub_StrLen nSttCnt = pPos->nContent.GetIndex();

        *pTbl = *pSaveTbl;

        _HTMLAttr *pAttr = *pTbl;
        while( pAttr )
        {
            ASSERT( !pAttr->GetPrev() || !pAttr->GetPrev()->ppHead,
                    "Previous-Attribut hat noch einen Header" );
            pAttr->SetHead( pTbl );
            if( bSetNewStart )
            {
                pAttr->nSttPara = rSttPara;
                pAttr->nEndPara = rSttPara;
                pAttr->nSttCntnt = nSttCnt;
                pAttr->nEndCntnt = nSttCnt;
            }
            pAttr = pAttr->GetNext();
        }

        *pSaveTbl = 0;
    }
}

void SwHTMLParser::InsertAttr( const SfxPoolItem& rItem, BOOL bLikePara,
                               BOOL bInsAtStart )
{
    _HTMLAttr* pTmp = new _HTMLAttr( *pPam->GetPoint(),
                                     rItem );
    if( bLikePara )
        pTmp->SetLikePara();
    USHORT nTmp = bInsAtStart ? 0 : aSetAttrTab.Count();
    aSetAttrTab.Insert( pTmp, nTmp );
}

void SwHTMLParser::InsertAttrs( _HTMLAttrs& rAttrs )
{
    while( rAttrs.Count() )
    {
        _HTMLAttr *pAttr = rAttrs[0];
        InsertAttr( pAttr->GetItem() );
        rAttrs.Remove( 0, 1 );
        delete pAttr;
    }
}

/*  */

void SwHTMLParser::NewStdAttr( int nToken )
{
    String aId, aStyle, aClass;

    const HTMLOptions *pOptions = GetOptions();
    for( USHORT i = pOptions->Count(); i; )
    {
        const HTMLOption *pOption = (*pOptions)[--i];
        switch( pOption->GetToken() )
        {
        case HTML_O_ID:
            aId = pOption->GetString();
            break;
        case HTML_O_STYLE:
            aStyle = pOption->GetString();
            break;
        case HTML_O_CLASS:
            aClass = pOption->GetString();
            break;
        }
    }

    // einen neuen Kontext anlegen
    _HTMLAttrContext *pCntxt = new _HTMLAttrContext( nToken );

    // Styles parsen
    if( HasStyleOptions( aStyle, aId, aClass ) )
    {
        SfxItemSet aItemSet( pDoc->GetAttrPool(), pCSS1Parser->GetWhichMap() );
        SvxCSS1PropertyInfo aPropInfo;

        if( ParseStyleOptions( aStyle, aId, aClass, aItemSet, aPropInfo ) )
        {
            if( HTML_SPAN_ON != nToken || !aClass.Len() ||
                !CreateContainer( aClass, aItemSet, aPropInfo, pCntxt ) )
                DoPositioning( aItemSet, aPropInfo, pCntxt );
            InsertAttrs( aItemSet, aPropInfo, pCntxt, TRUE );
        }
    }

    // den Kontext merken
    PushContext( pCntxt );
}

void SwHTMLParser::NewStdAttr( int nToken, _HTMLAttr **ppAttr,
                               const SfxPoolItem & rItem )
{
    String aId, aStyle, aClass;

    const HTMLOptions *pOptions = GetOptions();
    for( USHORT i = pOptions->Count(); i; )
    {
        const HTMLOption *pOption = (*pOptions)[--i];
        switch( pOption->GetToken() )
        {
        case HTML_O_ID:
            aId = pOption->GetString();
            break;
        case HTML_O_STYLE:
            aStyle = pOption->GetString();
            break;
        case HTML_O_CLASS:
            aClass = pOption->GetString();
            break;
        }
    }

    // einen neuen Kontext anlegen
    _HTMLAttrContext *pCntxt = new _HTMLAttrContext( nToken );

    // Styles parsen
    if( HasStyleOptions( aStyle, aId, aClass ) )
    {
        SfxItemSet aItemSet( pDoc->GetAttrPool(), pCSS1Parser->GetWhichMap() );
        SvxCSS1PropertyInfo aPropInfo;

        aItemSet.Put( rItem );

        if( ParseStyleOptions( aStyle, aId, aClass, aItemSet, aPropInfo ) )
            DoPositioning( aItemSet, aPropInfo, pCntxt );

        InsertAttrs( aItemSet, aPropInfo, pCntxt, TRUE );
    }
    else
    {
        InsertAttr( ppAttr ,rItem, pCntxt );
    }

    // den Kontext merken
    PushContext( pCntxt );
}

void SwHTMLParser::EndTag( int nToken )
{
    // den Kontext holen
    _HTMLAttrContext *pCntxt = PopContext( nToken & ~1 );
    if( pCntxt )
    {
        // und ggf. die Attribute beenden
        EndContext( pCntxt );
        delete pCntxt;
    }
}


void SwHTMLParser::NewBasefontAttr()
{
    String aId, aStyle, aClass;
    USHORT nSize = 3;

    const HTMLOptions *pOptions = GetOptions();
    for( USHORT i = pOptions->Count(); i; )
    {
        const HTMLOption *pOption = (*pOptions)[--i];
        switch( pOption->GetToken() )
        {
        case HTML_O_SIZE:
            nSize = (USHORT)pOption->GetNumber();
            break;
        case HTML_O_ID:
            aId = pOption->GetString();
            break;
        case HTML_O_STYLE:
            aStyle = pOption->GetString();
            break;
        case HTML_O_CLASS:
            aClass = pOption->GetString();
            break;
        }
    }

    if( nSize < 1 )
        nSize = 1;

    if( nSize > 7 )
        nSize = 7;

    // einen neuen Kontext anlegen
    _HTMLAttrContext *pCntxt = new _HTMLAttrContext( HTML_BASEFONT_ON );

    // Styles parsen
    if( HasStyleOptions( aStyle, aId, aClass ) )
    {
        SfxItemSet aItemSet( pDoc->GetAttrPool(), pCSS1Parser->GetWhichMap() );
        SvxCSS1PropertyInfo aPropInfo;

        aItemSet.Put( SvxFontHeightItem( aFontHeights[nSize-1] ) );

        if( ParseStyleOptions( aStyle, aId, aClass, aItemSet, aPropInfo ) )
            DoPositioning( aItemSet, aPropInfo, pCntxt );

        InsertAttrs( aItemSet, aPropInfo, pCntxt, TRUE );
    }
    else
    {
        InsertAttr( &aAttrTab.pFontHeight, SvxFontHeightItem( aFontHeights[nSize-1] ), pCntxt );
    }

    // den Kontext merken
    PushContext( pCntxt );

    // die Font-Size merken
    aBaseFontStack.Insert( nSize, aBaseFontStack.Count() );
}

void SwHTMLParser::EndBasefontAttr()
{
    EndTag( HTML_BASEFONT_ON );

    // Stack-Unterlauf in Tabellen vermeiden
    if( aBaseFontStack.Count() > nBaseFontStMin )
        aBaseFontStack.Remove( aBaseFontStack.Count()-1, 1 );
}

void SwHTMLParser::NewFontAttr( int nToken )
{
    USHORT nBaseSize =
        ( aBaseFontStack.Count() > nBaseFontStMin
            ? (aBaseFontStack[aBaseFontStack.Count()-1] & FONTSIZE_MASK)
            : 3 );
    USHORT nFontSize =
        ( aFontStack.Count() > nFontStMin
            ? (aFontStack[aFontStack.Count()-1] & FONTSIZE_MASK)
            : nBaseSize );

    String aFace, aId, aStyle, aClass;
    Color aColor;
    ULONG nFontHeight = 0;  // tatsaechlich einzustellende Font-Hoehe
    USHORT nSize = 0;       // Fontgroesse in Netscape-Notation (1-7)
    BOOL bColor = FALSE;

    const HTMLOptions *pOptions = GetOptions();
    for( USHORT i = pOptions->Count(); i; )
    {
        const HTMLOption *pOption = (*pOptions)[--i];
        switch( pOption->GetToken() )
        {
        case HTML_O_SIZE:
            if( HTML_FONT_ON==nToken && pOption->GetString().Len() )
            {
                INT32 nSSize;
                if( '+' == pOption->GetString().GetChar(0) ||
                    '-' == pOption->GetString().GetChar(0) )
                    nSSize = nBaseSize + pOption->GetSNumber();
                else
                    nSSize = (INT32)pOption->GetNumber();

                if( nSSize < 1 )
                    nSSize = 1;
                else if( nSSize > 7 )
                    nSSize = 7;

                nSize = (USHORT)nSSize;
                nFontHeight = aFontHeights[nSize-1];
            }
            break;
        case HTML_O_COLOR:
            if( HTML_FONT_ON==nToken )
            {
                pOption->GetColor( aColor );
                bColor = TRUE;
            }
            break;
        case HTML_O_FACE:
            if( HTML_FONT_ON==nToken )
                aFace = pOption->GetString();
            break;
        case HTML_O_ID:
            aId = pOption->GetString();
            break;
        case HTML_O_STYLE:
            aStyle = pOption->GetString();
            break;
        case HTML_O_CLASS:
            aClass = pOption->GetString();
            break;
        }
    }

    if( HTML_FONT_ON != nToken )
    {
        // HTML_BIGPRINT_ON oder HTML_SMALLPRINT_ON

        // in Ueberschriften bestimmt die aktuelle Ueberschrift
        // die Font-Hoehe und nicht BASEFONT
        USHORT nPoolId = GetCurrFmtColl()->GetPoolFmtId();
        if( (nPoolId>=RES_POOLCOLL_HEADLINE1 &&
             nPoolId<=RES_POOLCOLL_HEADLINE6) )
        {
            // wenn die Schriftgroesse in der Ueberschrift noch
            // nicht veraendert ist, die aus der Vorlage nehmen
            if( nFontStHeadStart==aFontStack.Count() )
                nFontSize = 6 - (nPoolId - RES_POOLCOLL_HEADLINE1);
        }
        else
            nPoolId = 0;

        if( HTML_BIGPRINT_ON == nToken )
            nSize = ( nFontSize<7 ? nFontSize+1 : 7 );
        else
            nSize = ( nFontSize>1 ? nFontSize-1 : 1 );

        // in Ueberschriften wird die neue Fonthoehe wenn moeglich aus
        // den Vorlagen geholt.
        if( nPoolId && nSize>=1 && nSize <=6 )
            nFontHeight =
                pCSS1Parser->GetTxtCollFromPool(
                    RES_POOLCOLL_HEADLINE1+6-nSize )->GetSize().GetHeight();
        else
            nFontHeight = aFontHeights[nSize-1];
    }

    ASSERT( !nSize == !nFontHeight, "HTML-Font-Size != Font-Height" );

    String aFontName, aStyleName;
    FontFamily eFamily = FAMILY_DONTKNOW;   // Family und Pitch,
    FontPitch ePitch = PITCH_DONTKNOW;      // falls nicht gefunden
    rtl_TextEncoding eEnc = gsl_getSystemTextEncoding();

    if( aFace.Len() && !pCSS1Parser->IsIgnoreFontFamily() )
    {
        const FontList *pFList = 0;
        SwDocShell *pDocSh = pDoc->GetDocShell();
        if( pDocSh )
        {
            const SvxFontListItem *pFListItem =
               (const SvxFontListItem *)pDocSh->GetItem(SID_ATTR_CHAR_FONTLIST);
            if( pFListItem )
                pFList = pFListItem->GetFontList();
        }

        BOOL bFound = FALSE;
        xub_StrLen nStrPos = 0;
        while( nStrPos!=STRING_NOTFOUND )
        {
            String aFName = aFace.GetToken( 0, ',', nStrPos );
            aFName.EraseTrailingChars().EraseLeadingChars();
            if( aFName.Len() )
            {
                if( !bFound && pFList )
                {
                    sal_Handle hFont = pFList->GetFirstFontInfo( aFName );
                    if( 0 != hFont )
                    {
                        const FontInfo& rFInfo = pFList->GetFontInfo( hFont );
                        if( RTL_TEXTENCODING_DONTKNOW != rFInfo.GetCharSet() )
                        {
                            bFound = TRUE;
                            if( RTL_TEXTENCODING_SYMBOL == rFInfo.GetCharSet() )
                                eEnc = RTL_TEXTENCODING_SYMBOL;
                        }
                    }
                }
                if( aFontName.Len() )
                    aFontName += ';';
                aFontName += aFName;
            }
        }
    }


    // einen neuen Kontext anlegen
    _HTMLAttrContext *pCntxt = new _HTMLAttrContext( nToken );

    // Styles parsen
    if( HasStyleOptions( aStyle, aId, aClass ) )
    {
        SfxItemSet aItemSet( pDoc->GetAttrPool(), pCSS1Parser->GetWhichMap() );
        SvxCSS1PropertyInfo aPropInfo;

        if( nFontHeight )
            aItemSet.Put( SvxFontHeightItem( nFontHeight ) );
        if( bColor )
            aItemSet.Put( SvxColorItem(aColor) );
        if( aFontName.Len() )
            aItemSet.Put( SvxFontItem( eFamily, aFontName, aStyleName,
                                       ePitch, eEnc ) );


        if( ParseStyleOptions( aStyle, aId, aClass, aItemSet, aPropInfo ) )
            DoPositioning( aItemSet, aPropInfo, pCntxt );

        InsertAttrs( aItemSet, aPropInfo, pCntxt, TRUE );
    }
    else
    {
        if( nFontHeight )
            InsertAttr( &aAttrTab.pFontHeight,
                        SvxFontHeightItem( nFontHeight ), pCntxt );
        if( bColor )
            InsertAttr( &aAttrTab.pFontColor, SvxColorItem(aColor), pCntxt );
        if( aFontName.Len() )
            InsertAttr( &aAttrTab.pFont,
                        SvxFontItem( eFamily, aFontName, aStyleName, ePitch,
                                     eEnc ), pCntxt );
    }

    // den Kontext merken
    PushContext( pCntxt );

    aFontStack.Insert( nSize, aFontStack.Count() );
}

void SwHTMLParser::EndFontAttr( int nToken )
{
    EndTag( nToken );

    // Stack-Unterlauf in Tabellen vermeiden
    if( aFontStack.Count() > nFontStMin )
        aFontStack.Remove( aFontStack.Count()-1, 1 );
}

/*  */

void SwHTMLParser::NewPara()
{
    if( pPam->GetPoint()->nContent.GetIndex() )
        AppendTxtNode( AM_SPACE );
    else
        AddParSpace();

    eParaAdjust = SVX_ADJUST_END;
    String aId, aStyle, aClass;

    const HTMLOptions *pOptions = GetOptions();
    for( USHORT i = pOptions->Count(); i; )
    {
        const HTMLOption *pOption = (*pOptions)[--i];
        switch( pOption->GetToken() )
        {
            case HTML_O_ID:
                aId = pOption->GetString();
                break;
            case HTML_O_ALIGN:
                eParaAdjust = (SvxAdjust)pOption->GetEnum( aHTMLPAlignTable, eParaAdjust );
                break;
            case HTML_O_STYLE:
                aStyle = pOption->GetString();
                break;
            case HTML_O_CLASS:
                aClass = pOption->GetString();
                break;
        }
    }

    // einen neuen Kontext anlegen
    _HTMLAttrContext *pCntxt =
        aClass.Len() ? new _HTMLAttrContext( HTML_PARABREAK_ON,
                                             RES_POOLCOLL_TEXT, aClass )
                     : new _HTMLAttrContext( HTML_PARABREAK_ON );

    // Styles parsen (Class nicht beruecksichtigen. Das geht nur, solange
    // keine der CSS1-Properties der Klasse hart formatiert werden muss!!!)
    if( HasStyleOptions( aStyle, aId, aEmptyStr ) )
    {
        SfxItemSet aItemSet( pDoc->GetAttrPool(), pCSS1Parser->GetWhichMap() );
        SvxCSS1PropertyInfo aPropInfo;

        if( ParseStyleOptions( aStyle, aId, aEmptyStr, aItemSet, aPropInfo ) )
        {
            ASSERT( !aClass.Len() || !pCSS1Parser->GetClass( aClass ),
                    "Class wird nicht beruecksichtigt" );
            DoPositioning( aItemSet, aPropInfo, pCntxt );
            InsertAttrs( aItemSet, aPropInfo, pCntxt );
        }
    }

    if( SVX_ADJUST_END != eParaAdjust )
        InsertAttr( &aAttrTab.pAdjust, SvxAdjustItem(eParaAdjust), pCntxt );

    // und auf den Stack packen
    PushContext( pCntxt );

    // die aktuelle Vorlage oder deren Attribute setzen
    SetTxtCollAttrs( aClass.Len() ? pCntxt : 0 );

    // Laufbalkenanzeige
    ShowStatline();

    ASSERT( !nOpenParaToken, "Jetzt geht ein offenes Absatz-Element verloren" );
    nOpenParaToken = HTML_PARABREAK_ON;
}

void SwHTMLParser::EndPara( BOOL bReal )
{
    if( HTML_LI_ON==nOpenParaToken && pTable )
    {
        const SwNumRule *pNumRule = pPam->GetNode()->GetTxtNode()->GetNumRule();
        ASSERT( pNumRule, "Wo ist die Numrule geblieben" );
        if( pNumRule )
            pDoc->UpdateNumRule( pNumRule->GetName(),
                                    pPam->GetPoint()->nNode.GetIndex() );
    }

    // leere Absaetze werden von Netscape uebersprungen, von uns jetzt auch
    if( bReal )
    {
        if( pPam->GetPoint()->nContent.GetIndex() )
            AppendTxtNode( AM_SPACE );
        else
            AddParSpace();
    }

    // wenn ein DD oder DT offen war, handelt es sich um eine
    // implizite Def-Liste, die jetzt beendet werden muss
    if( (nOpenParaToken==HTML_DT_ON || nOpenParaToken==HTML_DD_ON) &&
        nDefListDeep)
    {
        nDefListDeep--;
    }

    // den Kontext vom Stack holen. Er kann auch von einer implizit
    // geoeffneten Definitionsliste kommen
    _HTMLAttrContext *pCntxt =
        PopContext( nOpenParaToken ? (nOpenParaToken & ~1)
                                   : HTML_PARABREAK_ON );

    // Attribute beenden
    if( pCntxt )
    {
        EndContext( pCntxt );
        SetAttr();  // Absatz-Atts wegen JavaScript moeglichst schnell setzen
        delete pCntxt;
    }

    // und die bisherige Vorlage neu setzen
    if( bReal )
        SetTxtCollAttrs();

    nOpenParaToken = 0;
}


void SwHTMLParser::NewHeading( int nToken )
{
    eParaAdjust = SVX_ADJUST_END;

    String aId, aStyle, aClass;

    const HTMLOptions *pOptions = GetOptions();
    for( USHORT i = pOptions->Count(); i; )
    {
        const HTMLOption *pOption = (*pOptions)[--i];
        switch( pOption->GetToken() )
        {
            case HTML_O_ID:
                aId = pOption->GetString();
                break;
            case HTML_O_ALIGN:
                eParaAdjust = (SvxAdjust)pOption->GetEnum( aHTMLPAlignTable, eParaAdjust );
                break;
            case HTML_O_STYLE:
                aStyle = pOption->GetString();
                break;
            case HTML_O_CLASS:
                aClass = pOption->GetString();
                break;
        }
    }

    // einen neuen Absatz aufmachen
    if( pPam->GetPoint()->nContent.GetIndex() )
        AppendTxtNode( AM_SPACE );
    else
        AddParSpace();

    // die passende Vorlage suchen
    USHORT nTxtColl;
    switch( nToken )
    {
    case HTML_HEAD1_ON:         nTxtColl = RES_POOLCOLL_HEADLINE1;  break;
    case HTML_HEAD2_ON:         nTxtColl = RES_POOLCOLL_HEADLINE2;  break;
    case HTML_HEAD3_ON:         nTxtColl = RES_POOLCOLL_HEADLINE3;  break;
    case HTML_HEAD4_ON:         nTxtColl = RES_POOLCOLL_HEADLINE4;  break;
    case HTML_HEAD5_ON:         nTxtColl = RES_POOLCOLL_HEADLINE5;  break;
    case HTML_HEAD6_ON:         nTxtColl = RES_POOLCOLL_HEADLINE6;  break;
    default:                    nTxtColl = RES_POOLCOLL_STANDARD;   break;
    }

    // den Kontext anlegen
    _HTMLAttrContext *pCntxt = new _HTMLAttrContext( nToken, nTxtColl, aClass );

    // Styles parsen (zu Class siehe auch NewPara)
    if( HasStyleOptions( aStyle, aId, aEmptyStr ) )
    {
        SfxItemSet aItemSet( pDoc->GetAttrPool(), pCSS1Parser->GetWhichMap() );
        SvxCSS1PropertyInfo aPropInfo;

        if( ParseStyleOptions( aStyle, aId, aEmptyStr, aItemSet, aPropInfo ) )
        {
            ASSERT( !aClass.Len() || !pCSS1Parser->GetClass( aClass ),
                    "Class wird nicht beruecksichtigt" );
            DoPositioning( aItemSet, aPropInfo, pCntxt );
            InsertAttrs( aItemSet, aPropInfo, pCntxt );
        }
    }

    if( SVX_ADJUST_END != eParaAdjust )
        InsertAttr( &aAttrTab.pAdjust, SvxAdjustItem(eParaAdjust), pCntxt );

    // udn auf den Stack packen
    PushContext( pCntxt );

    // und die Vorlage oder deren Attribute setzen
    SetTxtCollAttrs( pCntxt );

    nFontStHeadStart = aFontStack.Count();

    // Laufbalkenanzeige
    ShowStatline();
}

void SwHTMLParser::EndHeading()
{
    // einen neuen Absatz aufmachen
    if( pPam->GetPoint()->nContent.GetIndex() )
        AppendTxtNode( AM_SPACE );
    else
        AddParSpace();

    // Kontext zu dem Token suchen und vom Stack holen
    _HTMLAttrContext *pCntxt = 0;
    USHORT nPos = aContexts.Count();
    while( !pCntxt && nPos>nContextStMin )
    {
        switch( aContexts[--nPos]->GetToken() )
        {
        case HTML_HEAD1_ON:
        case HTML_HEAD2_ON:
        case HTML_HEAD3_ON:
        case HTML_HEAD4_ON:
        case HTML_HEAD5_ON:
        case HTML_HEAD6_ON:
            pCntxt = aContexts[nPos];
            aContexts.Remove( nPos, 1 );
            break;
        }
    }

    // und noch Attribute beenden
    if( pCntxt )
    {
        EndContext( pCntxt );
        SetAttr();  // Absatz-Atts wegen JavaScript moeglichst schnell setzen
        delete pCntxt;
    }

    // die bisherige Vorlage neu setzen
    SetTxtCollAttrs();

    nFontStHeadStart = nFontStMin;
}

/*  */

void SwHTMLParser::NewTxtFmtColl( int nToken, USHORT nColl )
{
    String aId, aStyle, aClass;

    const HTMLOptions *pOptions = GetOptions();
    for( USHORT i = pOptions->Count(); i; )
    {
        const HTMLOption *pOption = (*pOptions)[--i];
        switch( pOption->GetToken() )
        {
            case HTML_O_ID:
                aId = pOption->GetString();
                break;
            case HTML_O_STYLE:
                aStyle = pOption->GetString();
                break;
            case HTML_O_CLASS:
                aClass = pOption->GetString();
                break;
        }
    }

    // einen neuen Absatz aufmachen
    SwHTMLAppendMode eMode = AM_NORMAL;
    switch( nToken )
    {
    case HTML_LISTING_ON:
    case HTML_XMP_ON:
        // Diese beiden Tags werden jetzt auf die PRE-Vorlage gemappt.
        // Fuer dem Fall, dass ein CLASS angegeben ist, loeschen wir
        // es damit wir nicht die CLASS der PRE-Vorlage bekommen.
        aClass = aEmptyStr;
    case HTML_BLOCKQUOTE_ON:
    case HTML_BLOCKQUOTE30_ON:
    case HTML_PREFORMTXT_ON:
        eMode = AM_SPACE;
        break;
    case HTML_ADDRESS_ON:
        eMode = AM_NOSPACE; // ADDRESS kann auf einen <P> ohne </P> folgen
        break;
    case HTML_DT_ON:
    case HTML_DD_ON:
        eMode = AM_SOFTNOSPACE;
        break;
    default:
        ASSERT( !this, "unbekannte Vorlage" );
        break;
    }
    if( pPam->GetPoint()->nContent.GetIndex() )
        AppendTxtNode( eMode );
    else if( AM_SPACE==eMode )
        AddParSpace();

    // ... und in einem Kontext merken
    _HTMLAttrContext *pCntxt = new _HTMLAttrContext( nToken, nColl, aClass );

    // Styles parsen (zu Class siehe auch NewPara)
    if( HasStyleOptions( aStyle, aId, aEmptyStr ) )
    {
        SfxItemSet aItemSet( pDoc->GetAttrPool(), pCSS1Parser->GetWhichMap() );
        SvxCSS1PropertyInfo aPropInfo;

        if( ParseStyleOptions( aStyle, aId, aEmptyStr, aItemSet, aPropInfo ) )
        {
            ASSERT( !aClass.Len() || !pCSS1Parser->GetClass( aClass ),
                    "Class wird nicht beruecksichtigt" );
            DoPositioning( aItemSet, aPropInfo, pCntxt );
            InsertAttrs( aItemSet, aPropInfo, pCntxt );
        }
    }

    PushContext( pCntxt );

    // die neue Vorlage setzen
    SetTxtCollAttrs( pCntxt );

    // Laufbalkenanzeige aktualisieren
    ShowStatline();
}

void SwHTMLParser::EndTxtFmtColl( int nToken )
{
    SwHTMLAppendMode eMode = AM_NORMAL;
    switch( nToken & ~1 )
    {
    case HTML_BLOCKQUOTE_ON:
    case HTML_BLOCKQUOTE30_ON:
    case HTML_PREFORMTXT_ON:
    case HTML_LISTING_ON:
    case HTML_XMP_ON:
        eMode = AM_SPACE;
        break;
    case HTML_ADDRESS_ON:
    case HTML_DT_ON:
    case HTML_DD_ON:
        eMode = AM_SOFTNOSPACE;
        break;
    default:
        ASSERT( !this, "unbekannte Vorlage" );
        break;
    }
    if( pPam->GetPoint()->nContent.GetIndex() )
        AppendTxtNode( eMode );
    else if( AM_SPACE==eMode )
        AddParSpace();

    // den aktuellen Kontext vom Stack holen
    _HTMLAttrContext *pCntxt = PopContext( nToken & ~1 );

    // und noch Attribute beenden
    if( pCntxt )
    {
        EndContext( pCntxt );
        SetAttr();  // Absatz-Atts wegen JavaScript moeglichst schnell setzen
        delete pCntxt;
    }

    // und die bisherige Vorlage setzen
    SetTxtCollAttrs();
}

/*  */

void SwHTMLParser::NewDefList()
{
    String aId, aStyle, aClass;

    const HTMLOptions *pOptions = GetOptions();
    for( USHORT i = pOptions->Count(); i; )
    {
        const HTMLOption *pOption = (*pOptions)[--i];
        switch( pOption->GetToken() )
        {
            case HTML_O_ID:
                aId = pOption->GetString();
                break;
            case HTML_O_STYLE:
                aStyle = pOption->GetString();
                break;
            case HTML_O_CLASS:
                aClass = pOption->GetString();
                break;
        }
    }

    // einen neuen Absatz aufmachen
    BOOL bSpace = (GetNumInfo().GetDepth() + nDefListDeep) == 0;
    if( pPam->GetPoint()->nContent.GetIndex() )
        AppendTxtNode( bSpace ? AM_SPACE : AM_SOFTNOSPACE );
    else if( bSpace )
        AddParSpace();

    // ein Level mehr
    nDefListDeep++;


    BOOL bInDD = FALSE, bNotInDD = FALSE;
    USHORT nPos = aContexts.Count();
    while( !bInDD && !bNotInDD && nPos>nContextStMin )
    {
        USHORT nCntxtToken = aContexts[--nPos]->GetToken();
        switch( nCntxtToken )
        {
        case HTML_DEFLIST_ON:
        case HTML_DIRLIST_ON:
        case HTML_MENULIST_ON:
        case HTML_ORDERLIST_ON:
        case HTML_UNORDERLIST_ON:
            bNotInDD = TRUE;
            break;
        case HTML_DD_ON:
            bInDD = TRUE;
            break;
        }
    }


    // ... und in einem Kontext merken
    _HTMLAttrContext *pCntxt = new _HTMLAttrContext( HTML_DEFLIST_ON );

    // darin auch die Raender merken
    USHORT nLeft=0, nRight=0;
    short nIndent=0;
    GetMarginsFromContext( nLeft, nRight, nIndent );

    // Die Einrueckung, die sich schon aus einem DL-ergibt, entspricht der
    // eines DT auf dem aktuellen Level, und die entspricht der eines
    // DD auf dem Level davor. Fue einen Level >=2 muss also ein DD-Abstand
    // hinzugefuegt werden
    if( !bInDD && nDefListDeep > 1 )
    {

        // und den der DT-Vorlage des aktuellen Levels
        SvxLRSpaceItem rLRSpace =
            pCSS1Parser->GetTxtFmtColl( RES_POOLCOLL_HTML_DD, aEmptyStr )
                       ->GetLRSpace();
        nLeft += rLRSpace.GetTxtLeft();
    }

    pCntxt->SetMargins( nLeft, nRight, nIndent );

    // Styles parsen
    if( HasStyleOptions( aStyle, aId, aClass ) )
    {
        SfxItemSet aItemSet( pDoc->GetAttrPool(), pCSS1Parser->GetWhichMap() );
        SvxCSS1PropertyInfo aPropInfo;

        if( ParseStyleOptions( aStyle, aId, aClass, aItemSet, aPropInfo ) )
        {
            DoPositioning( aItemSet, aPropInfo, pCntxt );
            InsertAttrs( aItemSet, aPropInfo, pCntxt );
        }
    }

    PushContext( pCntxt );

    // die Attribute der neuen Vorlage setzen
    if( nDefListDeep > 1 )
        SetTxtCollAttrs( pCntxt );
}

void SwHTMLParser::EndDefList()
{
    BOOL bSpace = (GetNumInfo().GetDepth() + nDefListDeep) == 1;
    if( pPam->GetPoint()->nContent.GetIndex() )
        AppendTxtNode( bSpace ? AM_SPACE : AM_SOFTNOSPACE );
    else if( bSpace )
        AddParSpace();

    // ein Level weniger
    if( nDefListDeep > 0 )
        nDefListDeep--;

    // den aktuellen Kontext vom Stack holen
    _HTMLAttrContext *pCntxt = PopContext( HTML_DEFLIST_ON );

    // und noch Attribute beenden
    if( pCntxt )
    {
        EndContext( pCntxt );
        SetAttr();  // Absatz-Atts wegen JavaScript moeglichst schnell setzen
        delete pCntxt;
    }

    // und Vorlage setzen
    SetTxtCollAttrs();
}

void SwHTMLParser::NewDefListItem( int nToken )
{
    // festellen, ob das DD/DT in einer DL vorkommt
    BOOL bInDefList = FALSE, bNotInDefList = FALSE;
    USHORT nPos = aContexts.Count();
    while( !bInDefList && !bNotInDefList && nPos>nContextStMin )
    {
        USHORT nCntxtToken = aContexts[--nPos]->GetToken();
        switch( nCntxtToken )
        {
        case HTML_DEFLIST_ON:
            bInDefList = TRUE;
            break;
        case HTML_DIRLIST_ON:
        case HTML_MENULIST_ON:
        case HTML_ORDERLIST_ON:
        case HTML_UNORDERLIST_ON:
            bNotInDefList = TRUE;
            break;
        }
    }

    // wenn nicht, implizit eine neue DL aufmachen
    if( !bInDefList )
    {
        nDefListDeep++;
        ASSERT( !nOpenParaToken,
                "Jetzt geht ein offenes Absatz-Element verloren" );
        nOpenParaToken = nToken;
    }

    NewTxtFmtColl( nToken, nToken==HTML_DD_ON ? RES_POOLCOLL_HTML_DD
                                              : RES_POOLCOLL_HTML_DT );
}

void SwHTMLParser::EndDefListItem( int nToken, BOOL bSetColl,
                                   BOOL bLastPara )
{
    // einen neuen Absatz aufmachen
    if( !nToken && pPam->GetPoint()->nContent.GetIndex() )
        AppendTxtNode( AM_SOFTNOSPACE );

    // Kontext zu dem Token suchen und vom Stack holen
    nToken &= ~1;
    _HTMLAttrContext *pCntxt = 0;
    USHORT nPos = aContexts.Count();
    while( !pCntxt && nPos>nContextStMin )
    {
        USHORT nCntxtToken = aContexts[--nPos]->GetToken();
        switch( nCntxtToken )
        {
        case HTML_DD_ON:
        case HTML_DT_ON:
            if( !nToken || nToken == nCntxtToken  )
            {
                pCntxt = aContexts[nPos];
                aContexts.Remove( nPos, 1 );
            }
            break;
        case HTML_DEFLIST_ON:
            // keine DD/DT ausserhalb der aktuelen DefListe betrachten
        case HTML_DIRLIST_ON:
        case HTML_MENULIST_ON:
        case HTML_ORDERLIST_ON:
        case HTML_UNORDERLIST_ON:
            // und auch nicht ausserhalb einer anderen Liste
            nPos = nContextStMin;
            break;
        }
    }

    // und noch Attribute beenden
    if( pCntxt )
    {
        EndContext( pCntxt );
        SetAttr();  // Absatz-Atts wegen JavaScript moeglichst schnell setzen
        delete pCntxt;
    }

    // und die bisherige Vorlage setzen
    if( bSetColl )
        SetTxtCollAttrs();
}

/*  */

BOOL SwHTMLParser::HasCurrentParaFlys( BOOL bNoSurroundOnly,
                                       BOOL bSurroundOnly ) const
{
    // bNoSurroundOnly:     Der Absatz enthaelt mindestens einen Rahmen
    //                      ohne Umlauf
    // bSurroundOnly:       Der Absatz enthaelt mindestens einen Rahmen
    //                      mit Umlauf aber keinen ohne Umlauf
    // sonst:               Der Absatz enthaelt irgendeinen Rahmen
    SwNodeIndex& rNodeIdx = pPam->GetPoint()->nNode;

    SwFrmFmt* pFmt;
    const SwFmtAnchor* pAnchor;
    const SwPosition* pAPos;
    const SwSpzFrmFmts& rFrmFmtTbl = *pDoc->GetSpzFrmFmts();

    USHORT i;
    BOOL bFound = FALSE;
    for( i=0; i<rFrmFmtTbl.Count(); i++ )
    {
        pFmt = rFrmFmtTbl[i];
        pAnchor = &pFmt->GetAnchor();
        // Ein Rahmen wurde gefunden, wenn
        // - er absatzgebunden ist, und
        // - im aktuellen Absatz verankert ist, und
        //   - jeder absatzgebunene Rahmen zaehlt, oder
        //   - (nur Rahmen oder umlauf zaehlen und ) der Rahmen keinen
        //     Umlauf besitzt

        if( 0 != ( pAPos = pAnchor->GetCntntAnchor()) &&
            (FLY_AT_CNTNT == pAnchor->GetAnchorId() ||
             FLY_AUTO_CNTNT == pAnchor->GetAnchorId()) &&
            pAPos->nNode == rNodeIdx )
        {
            if( !(bNoSurroundOnly || bSurroundOnly) )
            {
                bFound = TRUE;
                break;
            }
            else
            {
                // fix #42282#: Wenn Rahmen mit Umlauf gesucht sind,
                // auch keine mit Durchlauf beachten. Dabei handelt es
                // sich (noch) um HIDDEN-Controls, und denen weicht man
                // besser auch nicht aus.
                SwSurround eSurround = pFmt->GetSurround().GetSurround();
                if( bNoSurroundOnly )
                {
                    if( SURROUND_NONE==eSurround )
                    {
                        bFound = TRUE;
                        break;
                    }
                }
                if( bSurroundOnly )
                {
                    if( SURROUND_NONE==eSurround )
                    {
                        bFound = FALSE;
                        break;
                    }
                    else if( SURROUND_THROUGHT!=eSurround )
                    {
                        bFound = TRUE;
                        // weitersuchen: Es koennten ja noch welche ohne
                        // Umlauf kommen ...
                    }
                }
            }
        }
    }

    return bFound;
}

/*  */

// die speziellen Methoden zum Einfuegen von Objecten

const SwFmtColl *SwHTMLParser::GetCurrFmtColl() const
{
    const SwCntntNode* pCNd = pPam->GetCntntNode();
    return &pCNd->GetAnyFmtColl();
}


void SwHTMLParser::SetTxtCollAttrs( _HTMLAttrContext *pContext )
{
    SwTxtFmtColl *pCollToSet = 0;   // die zu setzende Vorlage
    SfxItemSet *pItemSet = 0;       // der Set fuer harte Attrs
    USHORT nTopColl = pContext ? pContext->GetTxtFmtColl() : 0;
    const String& rTopClass = pContext ? pContext->GetClass() : (const String&) aEmptyStr;
    USHORT nDfltColl = RES_POOLCOLL_TEXT;

    BOOL bInPRE=FALSE;                          // etwas Kontext Info

    USHORT nLeftMargin = 0, nRightMargin = 0;   // die Einzuege und
    short nFirstLineIndent = 0;                 // Abstaende

    for( USHORT i=nContextStAttrMin; i<aContexts.Count(); i++ )
    {
        const _HTMLAttrContext *pCntxt = aContexts[i];

        USHORT nColl = pCntxt->GetTxtFmtColl();
        if( nColl )
        {
            // Es gibt eine Vorlage, die zu setzen ist. Dann
            // muss zunaechst einmal entschieden werden,
            // ob die Vorlage auch gesetzt werden kann
            BOOL bSetThis = TRUE;
            switch( nColl )
            {
            case USHORT(RES_POOLCOLL_HTML_PRE):
                bInPRE = TRUE;
                break;
            case USHORT(RES_POOLCOLL_TEXT):
                // <TD><P CLASS=xxx> muss TD.xxx werden
                if( nDfltColl==RES_POOLCOLL_TABLE ||
                    nDfltColl==RES_POOLCOLL_TABLE_HDLN )
                    nColl = nDfltColl;
                break;
            case USHORT(RES_POOLCOLL_HTML_HR):
                // <HR> auch in <PRE> als Vorlage setzen, sonst kann man sie
                // nicht mehr exportieren
                break;
            default:
                if( bInPRE )
                    bSetThis = FALSE;
                break;
            }

            SwTxtFmtColl *pNewColl =
                pCSS1Parser->GetTxtFmtColl( nColl, pCntxt->GetClass() );

            if( bSetThis )
            {
                // wenn jetzt eine andere Vorlage gesetzt werden soll als
                // bisher, muss die bishere Vorlage durch harte Attributierung
                // ersetzt werden

                if( pCollToSet )
                {
                    // die Attribute, die die bisherige Vorlage setzt
                    // hart einfuegen
                    if( !pItemSet )
                        pItemSet = new SfxItemSet( pCollToSet->GetAttrSet() );
                    else
                    {
                        const SfxItemSet& rCollSet = pCollToSet->GetAttrSet();
                        SfxItemSet aItemSet( *rCollSet.GetPool(),
                                             rCollSet.GetRanges() );
                        aItemSet.Set( rCollSet );
                        pItemSet->Put( aItemSet );
                    }
                    // aber die Attribute, die aktuelle Vorlage setzt
                    // entfernen, weil sie sonst spaeter ueberschrieben
                    // werden
                    pItemSet->Differentiate( pNewColl->GetAttrSet() );
                }

                pCollToSet = pNewColl;
            }
            else
            {
                // hart Attributieren
                if( !pItemSet )
                    pItemSet = new SfxItemSet( pNewColl->GetAttrSet() );
                else
                {
                    const SfxItemSet& rCollSet = pNewColl->GetAttrSet();
                    SfxItemSet aItemSet( *rCollSet.GetPool(),
                                         rCollSet.GetRanges() );
                    aItemSet.Set( rCollSet );
                    pItemSet->Put( aItemSet );
                }
            }
        }
        else
        {
            // vielliecht gibt es ja eine Default-Vorlage?
            nColl = pCntxt->GetDfltTxtFmtColl();
            if( nColl )
                nDfltColl = nColl;
        }

        // ggf. neue Absatz-Einzuege holen
        if( pCntxt->IsLRSpaceChanged() )
        {
            USHORT nLeft=0, nRight=0;

            pCntxt->GetMargins( nLeft, nRight, nFirstLineIndent );
            nLeftMargin = nLeft;
            nRightMargin = nRight;
        }
    }

    // wenn im aktuellen Kontext eine neue Vorlage gesetzt werden soll,
    // muessen deren Absatz-Abstaende noch in den Kontext eingetragen werden
    if( pContext && nTopColl )
    {
        // <TD><P CLASS=xxx> muss TD.xxx werden
        if( nTopColl==RES_POOLCOLL_TEXT &&
            (nDfltColl==RES_POOLCOLL_TABLE ||
             nDfltColl==RES_POOLCOLL_TABLE_HDLN) )
            nTopColl = nDfltColl;

        const SwTxtFmtColl *pTopColl =
            pCSS1Parser->GetTxtFmtColl( nTopColl, rTopClass );
        const SfxItemSet& rItemSet = pTopColl->GetAttrSet();
        const SfxPoolItem *pItem;
        if( SFX_ITEM_SET == rItemSet.GetItemState(RES_LR_SPACE,TRUE, &pItem) )
        {
            const SvxLRSpaceItem *pLRItem =
                (const SvxLRSpaceItem *)pItem;

            USHORT nLeft = pLRItem->GetTxtLeft();
            USHORT nRight = pLRItem->GetRight();
            nFirstLineIndent = pLRItem->GetTxtFirstLineOfst();

            // In Definitions-Listen enthalten die Abstaende auch die der
            // vorhergehenden Level
            if( RES_POOLCOLL_HTML_DD == nTopColl )
            {
                const SvxLRSpaceItem& rDTLRSpace = pCSS1Parser
                    ->GetTxtFmtColl( RES_POOLCOLL_HTML_DT, aEmptyStr )
                    ->GetLRSpace();
                nLeft -= rDTLRSpace.GetTxtLeft();
                nRight -= rDTLRSpace.GetRight();
            }
            else if( RES_POOLCOLL_HTML_DT == nTopColl )
            {
                nLeft = 0;
                nRight = 0;
            }

            // die Absatz-Abstaende addieren sich
            nLeftMargin += nLeft;
            nRightMargin += nRight;

            pContext->SetMargins( nLeftMargin, nRightMargin,
                                  nFirstLineIndent );
        }
        if( SFX_ITEM_SET == rItemSet.GetItemState(RES_UL_SPACE,TRUE, &pItem) )
        {
            const SvxULSpaceItem *pULItem =
                (const SvxULSpaceItem *)pItem;
            pContext->SetULSpace( pULItem->GetUpper(), pULItem->GetLower() );
        }
    }

    // wenn gar keine Vorlage im Kontext gesetzt ist, Textkoerper nehmen
    if( !pCollToSet )
    {
        pCollToSet = pCSS1Parser->GetTxtCollFromPool( nDfltColl );
        const SvxLRSpaceItem& rLRItem = pCollToSet->GetLRSpace();
        if( !nLeftMargin )
            nLeftMargin = rLRItem.GetTxtLeft();
        if( !nRightMargin )
            nRightMargin = rLRItem.GetRight();
        if( !nFirstLineIndent )
            nFirstLineIndent = rLRItem.GetTxtFirstLineOfst();
    }

    // bisherige harte Attributierung des Absatzes entfernen
    if( aParaAttrs.Count() )
    {
        for( i=0; i<aParaAttrs.Count(); i++ )
            aParaAttrs[i]->Invalidate();

        aParaAttrs.Remove( 0, aParaAttrs.Count() );
    }

    // Die Vorlage setzen
    pDoc->SetTxtFmtColl( *pPam, pCollToSet );

    // ggf. noch den Absatz-Einzug korrigieren
    const SvxLRSpaceItem& rLRItem = pCollToSet->GetLRSpace();
    BOOL bSetLRSpace;

#ifndef NUM_RELSPACE
    SwTxtNode* pTxtNode = pPam->GetNode()->GetTxtNode();
    ASSERT( pTxtNode, "TxtFmtColl an Nicht-Text-Node setzen???" );
    const SwNodeNum *pNodeNum = pTxtNode->GetNum();
    if( GetNumInfo().GetDepth() > 0 || pNodeNum )
    {
        // Die Werte fuer den linken Rand und den Einzug koennte man auch
        // aus der NumRule holen. Berechnen ist aber einfacher.

        ASSERT( (GetNumInfo().GetDepth() > 0) ==
                    (GetNumInfo().GetNumRule() != 0),
                "Keine NumRule in Aufzaehlung oder umgekehrt" );

        ASSERT( pNodeNum, "Kein SwNodeNum am Absatz in Aufzaehlung" );

        BOOL bNumbered = FALSE;
        if( pNodeNum && !(NO_NUMLEVEL & pNodeNum->GetLevel()) )
        {
            // der Erstzeilen-Einzug des List-Items muss noch zu dem
            // sowieso schon bestehenden addiert werden, weil er im
            // LI-Kontext nicht gesetzt wurde. Das ist leider nicht moeglich,
            // weil auch nicht-numerierte Absaetze in diesem Kontext
            // vorkommen koennen.
            nFirstLineIndent += HTML_NUMBUL_INDENT;
            bNumbered = TRUE;
        }

        // In LI-Absaetzen ausserhalb von OL/UL ist nNumBulListDeep 0, aber
        // es muss trotzdem um die Breite des Bullet-Zeichens eingerueckt
        // werden.
        USHORT nLeftMarginNumBul = (GetNumInfo().GetDepth() * HTML_NUMBUL_MARGINLEFT);
        if( !nLeftMarginNumBul )
            nLeftMarginNumBul = (USHORT)(-HTML_NUMBUL_INDENT);

        bSetLRSpace = nLeftMargin != nLeftMarginNumBul ||
                      (bNumbered && nFirstLineIndent != HTML_NUMBUL_INDENT) ||
                      (!bNumbered && nFirstLineIndent) ||
                      nRightMargin != rLRItem.GetRight();

        pTxtNode->SetNumLSpace( !bSetLRSpace );
    }
    else
    {
#endif
        bSetLRSpace = nLeftMargin != rLRItem.GetTxtLeft() ||
                      nFirstLineIndent != rLRItem.GetTxtFirstLineOfst() ||
                      nRightMargin != rLRItem.GetRight();
#ifndef NUM_RELSPACE
    }
#endif

    if( bSetLRSpace )
    {
        SvxLRSpaceItem aLRItem( rLRItem );
        aLRItem.SetTxtLeft( nLeftMargin );
        aLRItem.SetRight( nRightMargin );
        aLRItem.SetTxtFirstLineOfst( nFirstLineIndent );
        if( pItemSet )
            pItemSet->Put( aLRItem );
        else
        {
            NewAttr( &aAttrTab.pLRSpace, aLRItem );
            aAttrTab.pLRSpace->SetLikePara();
            aParaAttrs.Insert( aAttrTab.pLRSpace, aParaAttrs.Count() );
            EndAttr( aAttrTab.pLRSpace, 0, FALSE );
        }
    }

    // und nun noch die Attribute setzen
    if( pItemSet )
    {
        InsertParaAttrs( *pItemSet );
        delete pItemSet;
    }
}

/*  */

void SwHTMLParser::NewCharFmt( int nToken )
{
    String aId, aStyle, aClass;

    const HTMLOptions *pOptions = GetOptions();
    for( USHORT i = pOptions->Count(); i; )
    {
        const HTMLOption *pOption = (*pOptions)[--i];
        switch( pOption->GetToken() )
        {
        case HTML_O_ID:
            aId = pOption->GetString();
            break;
        case HTML_O_STYLE:
            aStyle = pOption->GetString();
            break;
        case HTML_O_CLASS:
            aClass = pOption->GetString();
            break;
        }
    }

    // einen neuen Kontext anlegen
    _HTMLAttrContext *pCntxt = new _HTMLAttrContext( nToken );

    // die Vorlage setzen und im Kontext merken
    SwCharFmt* pCFmt = pCSS1Parser->GetChrFmt( nToken, aClass );
    ASSERT( pCFmt, "keine Zeichenvorlage zu Token gefunden" );


    // Styles parsen (zu Class siehe auch NewPara)
    if( HasStyleOptions( aStyle, aId, aEmptyStr ) )
    {
        SfxItemSet aItemSet( pDoc->GetAttrPool(), pCSS1Parser->GetWhichMap() );
        SvxCSS1PropertyInfo aPropInfo;

        if( ParseStyleOptions( aStyle, aId, aEmptyStr, aItemSet, aPropInfo ) )
        {
            ASSERT( !aClass.Len() || !pCSS1Parser->GetClass( aClass ),
                    "Class wird nicht beruecksichtigt" );
            DoPositioning( aItemSet, aPropInfo, pCntxt );
            InsertAttrs( aItemSet, aPropInfo, pCntxt, TRUE );
        }
    }

    // Zeichen-Vorlagen werden in einem eigenen Stack gehalten und
    // koennen nie durch Styles eingefuegt werden. Das Attribut ist deshalb
    // auch gar nicht im CSS1-Which-Range enthalten
    if( pCFmt )
        InsertAttr( &aAttrTab.pCharFmts, SwFmtCharFmt( pCFmt ), pCntxt );

    // den Kontext merken
    PushContext( pCntxt );
}


/*  */

void SwHTMLParser::InsertSpacer()
{
    // und es ggf. durch die Optionen veraendern
    String aId;
    SwVertOrient eVertOri = VERT_TOP;
    SwHoriOrient eHoriOri = HORI_NONE;
    Size aSize( 0, 0);
    long nSize = 0;
    BOOL bPrcWidth = FALSE;
    BOOL bPrcHeight = FALSE;
    USHORT nType = HTML_SPTYPE_HORI;

    const HTMLOptions *pOptions = GetOptions();
    for( USHORT i = pOptions->Count(); i; )
    {
        const HTMLOption *pOption = (*pOptions)[--i];
        switch( pOption->GetToken() )
        {
        case HTML_O_ID:
            aId = pOption->GetString();
            break;
        case HTML_O_TYPE:
            pOption->GetEnum( nType, aHTMLSpacerTypeTable );
            break;
        case HTML_O_ALIGN:
            eVertOri =
                (SwVertOrient)pOption->GetEnum( aHTMLImgVAlignTable,
                                                eVertOri );
            eHoriOri =
                (SwHoriOrient)pOption->GetEnum( aHTMLImgHAlignTable,
                                                eHoriOri );
            break;
        case HTML_O_WIDTH:
            // erstmal nur als Pixelwerte merken!
            bPrcWidth = (pOption->GetString().Search('%') != STRING_NOTFOUND);
            aSize.Width() = (long)pOption->GetNumber();
            break;
        case HTML_O_HEIGHT:
            // erstmal nur als Pixelwerte merken!
            bPrcHeight = (pOption->GetString().Search('%') != STRING_NOTFOUND);
            aSize.Height() = (long)pOption->GetNumber();
            break;
        case HTML_O_SIZE:
            // erstmal nur als Pixelwerte merken!
            nSize = pOption->GetNumber();
            break;
        }
    }

    switch( nType )
    {
    case HTML_SPTYPE_BLOCK:
        {
            // einen leeren Textrahmen anlegen

            // den Itemset holen
            SfxItemSet aFrmSet( pDoc->GetAttrPool(),
                                RES_FRMATR_BEGIN, RES_FRMATR_END-1 );
            if( !IsNewDoc() )
                Reader::ResetFrmFmtAttrs( aFrmSet );

            // den Anker und die Ausrichtung setzen
            SetAnchorAndAdjustment( eVertOri, eHoriOri, aFrmSet );

            // und noch die Groesse des Rahmens
            Size aDfltSz( MINFLY, MINFLY );
            Size aSpace( 0, 0 );
            SfxItemSet aDummyItemSet( pDoc->GetAttrPool(),
                                 pCSS1Parser->GetWhichMap() );
            SvxCSS1PropertyInfo aDummyPropInfo;

            SetFixSize( aSize, aDfltSz, bPrcWidth, bPrcHeight,
                        aDummyItemSet, aDummyPropInfo, aFrmSet );
            SetSpace( aSpace, aDummyItemSet, aDummyPropInfo, aFrmSet );

            // den Inhalt schuetzen
            SvxProtectItem aProtectItem;
            aProtectItem.SetCntntProtect( TRUE );
            aFrmSet.Put( aProtectItem );

            // der Rahmen anlegen
            RndStdIds eAnchorId =
                ((const SwFmtAnchor &)aFrmSet.Get(RES_ANCHOR)).GetAnchorId();
            SwFrmFmt *pFlyFmt = pDoc->MakeFlySection( eAnchorId,
                                            pPam->GetPoint(), &aFrmSet );
            // Ggf Frames anlegen und auto-geb. Rahmen registrieren
            RegisterFlyFrm( pFlyFmt );
        }
        break;
    case HTML_SPTYPE_VERT:
        if( nSize > 0 )
        {
            if( nSize && Application::GetDefaultDevice() )
            {
                nSize = Application::GetDefaultDevice()
                            ->PixelToLogic( Size(0,nSize),
                                            MapMode(MAP_TWIP) ).Height();
            }

            // einen Absatz-Abstand setzen
            SwTxtNode *pTxtNode = 0;
            if( !pPam->GetPoint()->nContent.GetIndex() )
            {
                // den unteren Absatz-Abstand des vorherigen Nodes aendern,
                // wenn moeglich

                SetAttr();  // noch offene Absatz-Attribute setzen

                pTxtNode = pDoc->GetNodes()[pPam->GetPoint()->nNode.GetIndex()-1]
                               ->GetTxtNode();

                // Wenn der Abstz davor kein Txtenode ist, dann wird jetzt
                // ein leere Absatz angelegt, der eh schon eine Zeilenhoehe
                // Abstand erzeugt.
                if( !pTxtNode )
                    nSize = nSize>HTML_PARSPACE ? nSize-HTML_PARSPACE : 0;
            }

            if( pTxtNode )
            {
                SvxULSpaceItem aULSpace( (const SvxULSpaceItem&)pTxtNode
                    ->SwCntntNode::GetAttr( RES_UL_SPACE ) );
                aULSpace.SetLower( aULSpace.GetLower() + (USHORT)nSize );
                pTxtNode->SwCntntNode::SetAttr( aULSpace );
            }
            else
            {
                NewAttr( &aAttrTab.pULSpace, SvxULSpaceItem( 0, (USHORT)nSize ) );
                EndAttr( aAttrTab.pULSpace, 0, FALSE );

                AppendTxtNode();    // nicht am Abstand drehen!
            }
        }
        break;
    case HTML_SPTYPE_HORI:
        if( nSize > 0 )
        {
            // wenn der Absatz noch leer ist, einen Erstzeilen-Einzug
            // setzen, sondern Sperrschrift ueber einem Space aufspannen

            if( nSize && Application::GetDefaultDevice() )
            {
                nSize = Application::GetDefaultDevice()
                            ->PixelToLogic( Size(nSize,0),
                                            MapMode(MAP_TWIP) ).Width();
            }

            if( !pPam->GetPoint()->nContent.GetIndex() )
            {
                USHORT nLeft=0, nRight=0;
                short nIndent = 0;

                GetMarginsFromContextWithNumBul( nLeft, nRight, nIndent );
                nIndent += (short)nSize;

                SvxLRSpaceItem aLRItem;
                aLRItem.SetTxtLeft( nLeft );
                aLRItem.SetRight( nRight );
                aLRItem.SetTxtFirstLineOfst( nIndent );

                NewAttr( &aAttrTab.pLRSpace, aLRItem );
                EndAttr( aAttrTab.pLRSpace, 0, FALSE );
            }
            else
            {
                NewAttr( &aAttrTab.pKerning, SvxKerningItem( (short)nSize ) );
                String aTmp( ' ' );
                pDoc->Insert( *pPam, aTmp /*, CHARSET_ANSI*/ );
                EndAttr( aAttrTab.pKerning );
            }
        }
    }
}

USHORT SwHTMLParser::ToTwips( USHORT nPixel ) const
{
    if( nPixel && Application::GetDefaultDevice() )
    {
        long nTwips = Application::GetDefaultDevice()->PixelToLogic(
                    Size( nPixel, nPixel ), MapMode( MAP_TWIP ) ).Width();
        return nTwips <= USHRT_MAX ? (USHORT)nTwips : USHRT_MAX;
    }
    else
        return nPixel;
}

const SwTwips SwHTMLParser::GetCurrentBrowseWidth()
{
    SwTwips nWidth = SwHTMLTableLayout::GetBrowseWidth( *pDoc );
    if( nWidth )
        return nWidth;

    if( !aHTMLPageSize.Width() )
    {
        const SwFrmFmt& rPgFmt = pCSS1Parser->GetMasterPageDesc()->GetMaster();

        const SwFmtFrmSize& rSz   = rPgFmt.GetFrmSize();
        const SvxLRSpaceItem& rLR = rPgFmt.GetLRSpace();
        const SvxULSpaceItem& rUL = rPgFmt.GetULSpace();
        const SwFmtCol& rCol = rPgFmt.GetCol();

        aHTMLPageSize.Width() = rSz.GetWidth() - rLR.GetLeft() - rLR.GetRight();
        aHTMLPageSize.Height() = rSz.GetHeight() - rUL.GetUpper() - rUL.GetLower();

        if( 1 < rCol.GetNumCols() )
            aHTMLPageSize.Width() /= rCol.GetNumCols();
    }

    return aHTMLPageSize.Width();
}


/*  */

void SwHTMLParser::InsertIDOption()
{
    String aId;
    const HTMLOptions *pOptions = GetOptions();
    for( USHORT i = pOptions->Count(); i; )
    {
        const HTMLOption *pOption = (*pOptions)[--i];
        if( HTML_O_ID==pOption->GetToken() )
        {
            aId = pOption->GetString();
            break;
        }
    }

    if( aId.Len() )
        InsertBookmark( aId );
}


/*  */


void SwHTMLParser::InsertLineBreak()
{
    // <BR CLEAR=xxx> wird wie folgt behandelt:
    // 1.) Es werden nur nur absatzgebundene Rahmen betrachtet, die
    //     im aktuellen Absatz verankert sind.
    // 2.) Fuer linksbuendig ausgerichtete Rahmen wird bei CLEAR=LEFT
    //     oder ALL und auf rechtsbuendige ausgerichtete Rahmen bei
    //     CLEAR=RIGHT oder ALL der Durchlauf wie folgt geaendert:
    // 3.) Wenn der Absatz keinen Text enthaelt, bekommt der Rahmen keinen
    //     Umlauf
    // 4.) sonst erhaelt ein links ausgerichteter Rahmen eine rechten
    //     "nur Anker" Umlauf und recht rechst ausg. Rahmen einen linken
    //     "nur Anker" Umlauf.
    // 5.) wenn in einem nicht-leeren Absatz der Umlauf eines Rahmens
    //     geaendert wird, wird ein neuer Absatz aufgemacht
    // 6.) Wenn von keinem Rahmen der Umlauf geaendert wird, wird ein
    //     harter Zeilenumbruch eingefuegt

    String aId, aStyle, aClass;             // die ID der Bookmark
    BOOL bClearLeft = FALSE, bClearRight = FALSE;
    BOOL bCleared = FALSE;  // wurde ein CLEAR ausgefuehrt?

    // dann holen wir mal die Optionen
    const HTMLOptions *pOptions = GetOptions();
    for( USHORT i = pOptions->Count(); i; )
    {
        const HTMLOption *pOption = (*pOptions)[--i];
        switch( pOption->GetToken() )
        {
            case HTML_O_CLEAR:
                {
                    const String &aClear = pOption->GetString();
                    if( aClear.EqualsIgnoreCaseAscii( sHTML_AL_all ) )
                    {
                        bClearLeft = TRUE;
                        bClearRight = TRUE;
                    }
                    else if( aClear.EqualsIgnoreCaseAscii( sHTML_AL_left ) )
                        bClearLeft = TRUE;
                    else if( aClear.EqualsIgnoreCaseAscii( sHTML_AL_right ) )
                        bClearRight = TRUE;
                }
                break;
            case HTML_O_ID:
                aId = pOption->GetString();
                break;
            case HTML_O_STYLE:
                aStyle = pOption->GetString();
                break;
            case HTML_O_CLASS:
                aClass = pOption->GetString();
                break;
        }
    }

    // CLEAR wird nur fuer den aktuellen Absaetz unterstuetzt
    if( bClearLeft || bClearRight )
    {
        SwNodeIndex& rNodeIdx = pPam->GetPoint()->nNode;
        SwTxtNode* pTxtNd = rNodeIdx.GetNode().GetTxtNode();
        if( pTxtNd )
        {
            SwFrmFmt* pFmt;
            const SwFmtAnchor* pAnchor;
            const SwPosition* pAPos;
            const SwSpzFrmFmts& rFrmFmtTbl = *pDoc->GetSpzFrmFmts();

            for( USHORT i=0; i<rFrmFmtTbl.Count(); i++ )
            {
                pFmt = rFrmFmtTbl[i];
                pAnchor = &pFmt->GetAnchor();
                if( 0 != ( pAPos = pAnchor->GetCntntAnchor()) &&
                    (FLY_AT_CNTNT == pAnchor->GetAnchorId() ||
                     FLY_AUTO_CNTNT == pAnchor->GetAnchorId()) &&
                    pAPos->nNode == rNodeIdx &&
                    pFmt->GetSurround().GetSurround() != SURROUND_NONE )
                {
                    SwHoriOrient eHori = RES_DRAWFRMFMT == pFmt->Which()
                        ? HORI_LEFT
                        : pFmt->GetHoriOrient().GetHoriOrient();

                    SwSurround eSurround = SURROUND_PARALLEL;
                    if( pPam->GetPoint()->nContent.GetIndex() )
                    {
                        if( bClearLeft && HORI_LEFT==eHori )
                            eSurround = SURROUND_RIGHT;
                        else if( bClearRight && HORI_RIGHT==eHori )
                            eSurround = SURROUND_LEFT;
                    }
                    else if( (bClearLeft && HORI_LEFT==eHori) ||
                             (bClearRight && HORI_RIGHT==eHori) )
                    {
                        eSurround = SURROUND_NONE;
                    }

                    if( SURROUND_PARALLEL != eSurround )
                    {
                        SwFmtSurround aSurround( eSurround );
                        if( SURROUND_NONE != eSurround )
                            aSurround.SetAnchorOnly( TRUE );
                        pFmt->SetAttr( aSurround );
                        bCleared = TRUE;
                    }
                } // Anker ist nicht im Node
            } // Schleife ueber Fly-Frames
        } // kein Text-Node
    } // kein CLEAR

    // Styles parsen
    SvxFmtBreakItem aBreakItem;
    BOOL bBreakItem = FALSE;
    if( HasStyleOptions( aStyle, aId, aClass ) )
    {
        SfxItemSet aItemSet( pDoc->GetAttrPool(), pCSS1Parser->GetWhichMap() );
        SvxCSS1PropertyInfo aPropInfo;

        if( ParseStyleOptions( aStyle, aId, aClass, aItemSet, aPropInfo ) )
        {
            if( pCSS1Parser->SetFmtBreak( aItemSet, aPropInfo ) )
            {
                aBreakItem = (const SvxFmtBreakItem &)aItemSet.Get( RES_BREAK );
                bBreakItem = TRUE;
            }
            if( aPropInfo.aId.Len() )
                InsertBookmark( aPropInfo.aId );
        }
    }

    if( bBreakItem && SVX_BREAK_PAGE_AFTER==aBreakItem.GetBreak() )
    {
        NewAttr( &aAttrTab.pBreak, aBreakItem );
        EndAttr( aAttrTab.pBreak, 0, FALSE );
    }

    if( !bCleared && !bBreakItem )
    {
        // wenn kein CLEAR ausgefuehrt werden sollte oder konnte, wird
        // ein Zeilenumbruch eingefgt
        String sTmp( (sal_Unicode)0x0a );   // make the Mac happy :-)
        pDoc->Insert( *pPam, sTmp );
    }
    else if( pPam->GetPoint()->nContent.GetIndex() )
    {
        // wenn ein Claer in einem nicht-leeren Absatz ausgefuehrt wurde,
        // muss anschliessen ein neuer Absatz aufgemacht werden
        // MIB 21.02.97: Eigentlich muesste man hier den unteren Absatz-
        // Absatnd auf 0 drehen. Das geht aber bei sowas wie <BR ..><P>
        // schief (>Netacpe). Deshalb lassen wir das erstmal.
        AppendTxtNode( AM_NOSPACE );
    }
    if( bBreakItem && SVX_BREAK_PAGE_BEFORE==aBreakItem.GetBreak() )
    {
        NewAttr( &aAttrTab.pBreak, aBreakItem );
        EndAttr( aAttrTab.pBreak, 0, FALSE );
    }
}

void SwHTMLParser::InsertHorzRule()
{
    USHORT nSize = 0;
    USHORT nWidth = 0;

    SvxAdjust eAdjust = SVX_ADJUST_END;

    BOOL bPrcWidth = FALSE;
    BOOL bNoShade = FALSE;
    BOOL bColor = FALSE;

    Color aColor;
    String aId;

    // dann holen wir mal die Optionen
    const HTMLOptions *pOptions = GetOptions();
    for( USHORT i = pOptions->Count(); i; )
    {
        const HTMLOption *pOption = (*pOptions)[--i];
        switch( pOption->GetToken() )
        {
        case HTML_O_ID:
            aId = pOption->GetString();
            break;
        case HTML_O_SIZE:
            nSize = (USHORT)pOption->GetNumber();
            break;
        case HTML_O_WIDTH:
            bPrcWidth = (pOption->GetString().Search('%') != STRING_NOTFOUND);
            nWidth = (USHORT)pOption->GetNumber();
            if( bPrcWidth && nWidth>=100 )
            {
                // 100%-Linien sind der default-Fall (keine Attrs neotig)
                nWidth = 0;
                bPrcWidth = FALSE;
            }
            break;
        case HTML_O_ALIGN:
            eAdjust =
                (SvxAdjust)pOption->GetEnum( aHTMLPAlignTable, eAdjust );
            break;
        case HTML_O_NOSHADE:
            bNoShade = TRUE;
            break;
        case HTML_O_COLOR:
            pOption->GetColor( aColor );
            bColor = TRUE;
            break;
        }
    }

    if( pPam->GetPoint()->nContent.GetIndex() )
        AppendTxtNode( AM_NOSPACE );
    if( nOpenParaToken )
        EndPara();
    AppendTxtNode();
    pPam->Move( fnMoveBackward );

    // ... und in einem Kontext merken
    _HTMLAttrContext *pCntxt =
        new _HTMLAttrContext( HTML_HORZRULE, RES_POOLCOLL_HTML_HR, aEmptyStr );

    PushContext( pCntxt );

    // die neue Vorlage setzen
    SetTxtCollAttrs( pCntxt );

    // die harten Attribute an diesem Absatz werden nie mehr ungueltig
    if( aParaAttrs.Count() )
        aParaAttrs.Remove( 0, aParaAttrs.Count() );

    if( nSize>0 || bColor || bNoShade )
    {
        // Farbe und/oder Breite der Linie setzen
        if( !bColor )
            aColor.SetColor( COL_GRAY );

        SvxBorderLine aBorderLine( &aColor );
        if( nSize )
        {
            long nPWidth = 0;
            long nPHeight = (long)nSize;
            SvxCSS1Parser::PixelToTwip( nPWidth, nPHeight );
            SvxCSS1Parser::SetBorderWidth( aBorderLine, (USHORT)nPHeight,
                                           !bNoShade );
        }
        else if( bNoShade )
        {
            aBorderLine.SetOutWidth( DEF_LINE_WIDTH_2 );
        }
        else
        {
            aBorderLine.SetOutWidth( DEF_DOUBLE_LINE0_OUT );
            aBorderLine.SetInWidth( DEF_DOUBLE_LINE0_IN );
            aBorderLine.SetDistance( DEF_DOUBLE_LINE0_DIST );
        }

        SvxBoxItem aBoxItem;
        aBoxItem.SetLine( &aBorderLine, BOX_LINE_BOTTOM );
        _HTMLAttr* pTmp = new _HTMLAttr( *pPam->GetPoint(), aBoxItem );
        aSetAttrTab.Insert( pTmp, aSetAttrTab.Count() );
    }
    if( nWidth )
    {
        // Wenn wir in keiner Tabelle sind, wird die Breitenangabe durch
        // Absatz-Einzuege "getuerkt". In einer Tabelle macht das wenig
        // Sinn. Um zu Vermeiden, dass die Linie bei der Breitenberechnung
        // beruecksichtigt wird, bekommt sie aber trotzdem entsprechendes
        // LRSpace-Item verpasst.
#ifdef FIX41370
        const SwFmtColl *pColl = GetCurrFmtColl();
        SvxLRSpaceItem aLRItem( pColl->GetLRSpace() );
#endif
        if( !pTable )
        {
            // Laenge und Ausrichtung der Linie ueber Absatz-Einzuege "tuerken"
            long nBrowseWidth = GetCurrentBrowseWidth();
            nWidth = bPrcWidth ? (USHORT)((nWidth*nBrowseWidth) / 100)
                               : ToTwips( (USHORT)nBrowseWidth );
            if( nWidth < MINLAY )
                nWidth = MINLAY;

            if( (long)nWidth < nBrowseWidth )
            {
#ifndef FIX41370
                const SwFmtColl *pColl = GetCurrFmtColl();
                SvxLRSpaceItem aLRItem( pColl->GetLRSpace() );
#endif
                long nDist = nBrowseWidth - nWidth;

                switch( eAdjust )
                {
                case SVX_ADJUST_RIGHT:
                    aLRItem.SetTxtLeft( (USHORT)nDist );
                    break;
                case SVX_ADJUST_LEFT:
                    aLRItem.SetRight( (USHORT)nDist );
                    break;
                case SVX_ADJUST_CENTER:
                default:
                    nDist /= 2;
                    aLRItem.SetTxtLeft( (USHORT)nDist );
                    aLRItem.SetRight( (USHORT)nDist );
                    break;
                }

#ifndef FIX41370
                _HTMLAttr* pTmp = new _HTMLAttr( *pPam->GetPoint(), aLRItem );
                aSetAttrTab.Insert( pTmp, aSetAttrTab.Count() );
#endif
            }
        }

#ifdef FIX41370
        _HTMLAttr* pTmp = new _HTMLAttr( *pPam->GetPoint(), aLRItem );
        aSetAttrTab.Insert( pTmp, aSetAttrTab.Count() );
#endif
    }

    // Bookmarks koennen nicht in Hyperlinks eingefueht werden
    if( aId.Len() )
        InsertBookmark( aId );

    // den aktuellen Kontext vom Stack holen
    _HTMLAttrContext *pPoppedContext = PopContext( HTML_HORZRULE );
    ASSERT( pPoppedContext==pCntxt, "wo kommt denn da ein HR-Kontext her?" );
    delete pPoppedContext;

    pPam->Move( fnMoveForward );

    // und im Absatz danach die dort aktuelle Vorlage setzen
    SetTxtCollAttrs();
}

void SwHTMLParser::ParseMoreMetaOptions()
{
    String aName, aContent;
    BOOL bHTTPEquiv = FALSE, bChanged = FALSE;

    const HTMLOptions *pOptions = GetOptions();
    for( USHORT i = pOptions->Count(); i; )
    {
        const HTMLOption *pOption = (*pOptions)[ --i ];
        switch( pOption->GetToken() )
        {
        case HTML_O_NAME:
            aName = pOption->GetString();
            bHTTPEquiv = FALSE;
            break;
        case HTML_O_HTTPEQUIV:
            aName = pOption->GetString();
            bHTTPEquiv = TRUE;
            break;
        case HTML_O_CONTENT:
            aContent = pOption->GetString();
            break;
        }
    }

    // Hier wird es etwas tricky: Wir wissen genau, daá die Dok-Info
    // nicht geaendert wurde. Deshalb genuegt es, auf Generator und
    // auf refresh abzufragen, um noch nicht verarbeitete Token zu finden,
    // denn das sind die einzigen, die die Dok-Info nicht modifizieren.
    if( aName.EqualsIgnoreCaseAscii( sHTML_META_generator ) ||
        aName.EqualsIgnoreCaseAscii( sHTML_META_refresh ) ||
        aName.EqualsIgnoreCaseAscii( sHTML_META_content_type ) ||
        aName.EqualsIgnoreCaseAscii( sHTML_META_content_script_type ) )
        return;

    aContent.EraseAllChars( _CR );
    aContent.EraseAllChars( _LF );

    if( aName.EqualsIgnoreCaseAscii( sHTML_META_sdendnote ) )
    {
        FillEndNoteInfo( aContent );
        return;
    }

    if( aName.EqualsIgnoreCaseAscii( sHTML_META_sdfootnote ) )
    {
        FillFootNoteInfo( aContent );
        return;
    }

    String sText(
            String::CreateFromAscii(TOOLS_CONSTASCII_STRINGPARAM("HTML: <")) );
    sText.AppendAscii( TOOLS_CONSTASCII_STRINGPARAM(sHTML_meta) );
    sText.Append( ' ' );
    if( bHTTPEquiv  )
        sText.AppendAscii( TOOLS_CONSTASCII_STRINGPARAM(sHTML_O_httpequiv) );
    else
        sText.AppendAscii( TOOLS_CONSTASCII_STRINGPARAM(sHTML_O_name) );
    sText.AppendAscii( TOOLS_CONSTASCII_STRINGPARAM("=\"") );
    sText.Append( aName );
    sText.AppendAscii( TOOLS_CONSTASCII_STRINGPARAM("\" ") );
    sText.AppendAscii( TOOLS_CONSTASCII_STRINGPARAM(sHTML_O_content) );
    sText.AppendAscii( TOOLS_CONSTASCII_STRINGPARAM("=\"") );
    sText.Append( aContent );
    sText.AppendAscii( TOOLS_CONSTASCII_STRINGPARAM("\">") );

    SwPostItField aPostItFld(
        (SwPostItFieldType*)pDoc->GetSysFldType( RES_POSTITFLD ),
        aEmptyStr, sText, Date() );
    SwFmtFld aFmtFld( aPostItFld );
    InsertAttr( aFmtFld );
}

/*  */

#ifdef USED
void __EXPORT SwHTMLParser::SaveState( int nToken )
{
    HTMLParser::SaveState( nToken );
}

void __EXPORT SwHTMLParser::RestoreState()
{
    HTMLParser::RestoreState();
}
#endif

/*  */

_HTMLAttr::_HTMLAttr( const SwPosition& rPos, const SfxPoolItem& rItem,
                      _HTMLAttr **ppHd )
    : nSttPara( rPos.nNode ), nEndPara( rPos.nNode ),
    nSttCntnt( rPos.nContent.GetIndex() ),
    nEndCntnt(rPos.nContent.GetIndex() ),
    nCount( 1 ), pNext( 0 ), pPrev( 0 ), ppHead( ppHd ),
    bInsAtStart( TRUE ), bLikePara( FALSE ), bValid( TRUE )
{
    pItem = rItem.Clone();
}

_HTMLAttr::_HTMLAttr( const _HTMLAttr &rAttr, const SwNodeIndex &rEndPara,
                      USHORT nEndCnt, _HTMLAttr **ppHd ) :
    nSttPara( rAttr.nSttPara ), nEndPara( rEndPara ),
    nSttCntnt( rAttr.nSttCntnt ), nEndCntnt( nEndCnt ),
    nCount( rAttr.nCount ), pNext( 0 ), pPrev( 0 ), ppHead( ppHd ),
    bInsAtStart( rAttr.bInsAtStart ), bLikePara( rAttr.bLikePara ),
    bValid( rAttr.bValid )
{
    pItem = rAttr.pItem->Clone();
}

_HTMLAttr::~_HTMLAttr()
{
    delete pItem;
}

_HTMLAttr *_HTMLAttr::Clone( const SwNodeIndex& rEndPara, USHORT nEndCnt ) const
{
    // das Attribut mit der alten Start-Position neu anlegen
    _HTMLAttr *pNew = new _HTMLAttr( *this, rEndPara, nEndCnt, ppHead );

    // die Previous-Liste muss uebernommen werden, die Next-Liste nicht!
    pNew->pPrev = pPrev;

    return pNew;
}

void _HTMLAttr::Reset( const SwNodeIndex& rSttPara, USHORT nSttCnt,
                       _HTMLAttr **ppHd )
{
    // den Anfang (und das Ende) neu setzen
    nSttPara = rSttPara;
    nSttCntnt = nSttCnt;
    nEndPara = rSttPara;
    nEndCntnt = nSttCnt;

    // den Head korrigieren und die Verkettungen aufheben
    pNext = 0;
    pPrev = 0;
    ppHead = ppHd;
}

void _HTMLAttr::InsertPrev( _HTMLAttr *pPrv )
{
    ASSERT( !pPrv->pNext || pPrv->pNext == this,
            "_HTMLAttr::InsertPrev: pNext falsch" );
    pPrv->pNext = 0;

    ASSERT( 0 == pPrv->ppHead || ppHead == pPrv->ppHead,
            "_HTMLAttr::InsertPrev: ppHead falsch" );
    pPrv->ppHead = 0;

    _HTMLAttr *pAttr = this;
    while( pAttr->GetPrev() )
        pAttr = pAttr->GetPrev();

    pAttr->pPrev = pPrv;
}

/*************************************************************************

      $Log: not supported by cvs2svn $
      Revision 1.494  2000/09/18 16:04:47  willem.vandorp
      OpenOffice header added.

      Revision 1.493  2000/09/05 14:01:29  mib
      #78294#: removed support for frameset documents

      Revision 1.492  2000/08/04 10:55:23  jp
      Soft-/HardHyphens & HardBlanks changed from attribute to unicode character

      Revision 1.491  2000/06/26 09:52:42  jp
      must change: GetAppWindow->GetDefaultDevice

      Revision 1.490  2000/06/13 09:37:51  os
      using UCB

      Revision 1.489  2000/04/10 12:20:58  mib
      unicode

      Revision 1.488  2000/03/17 15:19:53  mib
      #74249#: Call EndAction before collaing DocumentDetected

      Revision 1.487  2000/03/13 15:07:03  jp
      remove JavaScript

      Revision 1.486  2000/03/03 15:21:01  os
      StarView remainders removed

      Revision 1.485  2000/03/03 12:44:32  mib
      Removed JavaScript

      Revision 1.484  2000/02/11 15:41:10  hr
      #70473# changes for unicode

      Revision 1.483  2000/01/20 11:48:38  jp
      Bug #72119#: HTML-Template is moved into an other directory

      Revision 1.482  1999/10/21 17:50:12  jp
      have to change - SearchFile with SfxIniManager, dont use SwFinder for this

      Revision 1.481  1999/09/21 09:50:36  mib
      multiple text encodings

      Revision 1.480  1999/09/17 12:14:52  mib
      support of multiple and non system text encodings

      Revision 1.479  1999/07/21 14:11:18  JP
      Bug #67779#: set any MsgBoxType at the StringErrorInfo


      Rev 1.478   21 Jul 1999 16:11:18   JP
   Bug #67779#: set any MsgBoxType at the StringErrorInfo

      Rev 1.477   11 Jun 1999 10:27:36   MIB
   #66744#: EnableModified flag

      Rev 1.476   10 Jun 1999 10:34:32   JP
   have to change: no AppWin from SfxApp

      Rev 1.475   27 Apr 1999 16:42:26   JP
   Bug #65314#: neu: IsJavaScriptEnabled

      Rev 1.474   15 Apr 1999 13:48:30   MIB
   #41833#: Styles fuer A-Tag

      Rev 1.473   13 Apr 1999 10:58:56   MIB
   #64638#: ASP-tags wie unbekannte Tags behandeln

      Rev 1.472   09 Apr 1999 17:52:00   MA
   #64467# EndAction und VirDev

      Rev 1.471   08 Apr 1999 17:33:44   MIB
   #64522#: Styles fuer TD/TH auswerten

      Rev 1.470   08 Apr 1999 12:45:54   MA
   #64467# F?r die EndAction immer alles per VirDev painten

      Rev 1.469   07 Apr 1999 13:50:46   MIB
   #64327#: GetBrowseWidth fuer Tabellen in Rahmen richtig

      Rev 1.468   29 Mar 1999 16:06:08   MIB
   #64051#: Undo auch nach JavaScript anschalten

      Rev 1.467   17 Mar 1999 16:41:52   MIB
   #63049#: Numerierungen mit relativen Abstaenden

      Rev 1.466   15 Mar 1999 13:14:30   JP
   Bug #63339#: Einfuegen Doc - Absaetze richtig zusammenfassen

      Rev 1.465   11 Mar 1999 23:55:22   JP
   Task #63171#: Optionen fuer Feld-/LinkUpdate Doc oder Modul lokal

      Rev 1.464   10 Mar 1999 15:43:22   MIB
   #62682#: Beim Setzen der Control-Groesse wenn noetig auf die ViewShell warten

      Rev 1.463   25 Feb 1999 17:27:10   MIB
   #61691#: falscher Assert

      Rev 1.462   25 Feb 1999 16:01:58   MIB
   #61949#: globale Shell entsorgti, #62261#: <BR CLEAR> auch fuer Controls

      Rev 1.461   23 Feb 1999 08:56:34   MA
   Syntaxfehler fuer Update

      Rev 1.460   22 Feb 1999 08:40:30   MA
   1949globale Shell entsorgt, Shells am RootFrm

      Rev 1.459   11 Jan 1999 10:45:30   MIB
   #60137#: UCS2-/UTF8-Unterstuetzung jetzt auch fuer F-Sets richtig

      Rev 1.458   18 Dec 1998 09:23:34   MIB
   #60137#: UTF-8-/UCS-2-Unterstuetzung fuer HTML

      Rev 1.457   04 Dec 1998 14:23:58   MIB
   #54626#: <LH> ausserhalb von <OL>/<UL> verbessert, entspricht #55072#

      Rev 1.456   02 Dec 1998 10:55:12   MIB
   #59886#: Kein Assert bei Attributen in Previous-Listen mehr

      Rev 1.455   23 Nov 1998 13:12:46   OM
   #58216# Enum fuer Aktualisieren von Verknuepfungen

      Rev 1.454   20 Nov 1998 11:51:24   MIB
   #59064#: Unbekannte Token/<NOSCRIPT> und <NOEMEBED> beibehalten

      Rev 1.453   18 Nov 1998 10:24:30   MIB
   #59579#: Inhalt von <TITLE> und <NOSCRIPT> nicht zur Filter-Detection heranziehen

      Rev 1.452   13 Nov 1998 14:38:26   MIB
   Nachtrag zu #58450#: Fuss-/Endnoten: Assert bei Verwendung der Vorlegen weg

      Rev 1.451   11 Nov 1998 17:42:02   MIB
   #59059#: Beim Abbrechen Pendung-Stack noch aufraeumen

      Rev 1.450   02 Nov 1998 17:14:26   MIB
   #58480#: Fuss-/Endnoten

      Rev 1.449   23 Oct 1998 09:47:16   MIB
   #58172#: Nach JS-Aufruf falls vorhanden zuletzt aktive ViewShell wieder setzten

      Rev 1.448   13 Oct 1998 17:28:34   MIB
   #57901#: Fixed-Font-Namen vom System holen, alten Namen entfernt

      Rev 1.447   07 Oct 1998 11:07:26   MIB
   #57559#: Erstes Token immer im Continue behandeln, 55072 erstmal raus

      Rev 1.446   01 Sep 1998 12:06:50   MIB
   #55072#: <LI> ohne <OL>/<UL> verbessert

      Rev 1.445   01 Sep 1998 09:52:02   MIB
   #55248#: Header beenden, wenn Dokuemnttyp erkannt wurde

      Rev 1.444   31 Aug 1998 18:43:54   MIB
   #55134#: DocumentDetected zum Anlegen der View aufrufen, bevor Controls eingef. werden

      Rev 1.443   26 Aug 1998 13:29:00   MIB
   #54970#: bCallNextToken nicht setzen, wenn keine Listbox, Applet, etc. einefuegt wurde

      Rev 1.442   26 Aug 1998 09:30:42   MIB
   #55144#: Umlauf bei Tabellen in Rahmen richtig setzen und beachten

      Rev 1.441   25 Aug 1998 11:09:42   MIB
   #50455#: Applet erst beim </APPLET> anlegen, weil erst dann alle Parameter da sind

      Rev 1.440   28 Jul 1998 12:04:58   MIB
   #54025#: Auf ObjectDying der ViewShell achten, #52559#: JavaScript-Zeilennummern

      Rev 1.439   23 Jul 1998 11:14:12   JP
   Task #52654#: Einfuegen Doc nicht mit einer CrsrShell sondern mit einen PaM

      Rev 1.438   13 Jul 1998 09:20:28   MIB
   #50966#: Fonts optional ignorieren

      Rev 1.437   08 Jul 1998 17:19:46   MIB
   StarScript

      Rev 1.436   02 Jul 1998 15:50:10   JP
   Modules Path ueber den PathFinder herausfinden

      Rev 1.435   26 Jun 1998 12:21:48   OM
   #51184# SubType an ExpressionFields richtig setzen und abfragen

      Rev 1.434   15 Jun 1998 15:39:02   JP
   Bug #51132#: _SetAttr - nicht pAttr sonder pAttr->pItem ist das Attribut

      Rev 1.433   15 Jun 1998 13:13:28   MIB
   fix #51020#: Im AppendTxtNode Attrs die den ganzen Absatz sofort setzen

      Rev 1.432   08 Jun 1998 12:08:42   MIB
   fix #50795#: <BODY>-Tag ist sicheres Indiz fuer Text-Dokument

      Rev 1.431   05 Jun 1998 14:04:32   JP
   Bug #42487#: Sprung zum Mark schon waehrend des Ladens ausfuehren

      Rev 1.430   20 May 1998 10:41:04   MIB
   fix #50341#: Script-Feld fuer nicht beendetes Script einfuegen

      Rev 1.429   15 May 1998 11:31:02   MIB
   UNO-Controls statt VC-Controls (noch geht nicht viel)

      Rev 1.428   12 May 1998 15:50:44   JP
   rund um Flys/DrawObjs im Doc/FESh umgestellt/optimiert

      Rev 1.427   29 Apr 1998 17:37:52   MIB
   fix: HTML-Seitenvorlage in SW-Doks wieder setzen

      Rev 1.426   21 Apr 1998 13:47:26   MIB
   fix: Keine Bookmark fuer abs-pos Objekte mit ID einfuegen

      Rev 1.425   16 Apr 1998 11:36:42   MIB
   Keine HTML-Seiten-Vorlage mehr setzen, Warnings

      Rev 1.424   15 Apr 1998 14:54:36   MIB
   Zwei-seitige Printing-Extensions

      Rev 1.423   03 Apr 1998 12:22:16   MIB
   Export des Rahmen-Namens als ID

      Rev 1.422   02 Apr 1998 19:42:40   MIB
   Positionierung von spaltigen Rahmen

      Rev 1.421   27 Mar 1998 17:28:54   MIB
   direkte absolute Positionierung und Groessen-Export von Controls und Marquee

      Rev 1.420   27 Mar 1998 09:58:32   MIB
   direkte Positionierung von Grafiken etc.

      Rev 1.419   25 Mar 1998 12:13:26   MIB
   abs.-pos. Container angefangen, Statistik-Feld

      Rev 1.418   20 Mar 1998 10:46:12   MIB
   Font-Listen in Font-Attributen

      Rev 1.417   13 Mar 1998 09:29:36   MIB
   Rahmen-Anker-Verschiebung entfernt

      Rev 1.416   28 Feb 1998 07:28:58   MH
   chg: [OW|MTF] -> UNX

      Rev 1.415   27 Feb 1998 16:22:42   JP
   ObjectDying-MessageItem umbenannt

      Rev 1.414   27 Feb 1998 14:05:42   MIB
   Auto-gebundene Rahmen

      Rev 1.413   24 Feb 1998 11:31:22   MIB
   Jetzt auch HTML_LISTING und HTML_XMP vernichtet (wegen #42029#)

      Rev 1.412   20 Feb 1998 19:02:22   MA
   header

      Rev 1.411   20 Feb 1998 13:27:14   MA
   headerfiles gewandert

      Rev 1.410   17 Feb 1998 10:51:04   MIB
   HTML-H6 -> HEADLINE6

      Rev 1.409   16 Feb 1998 12:28:42   MIB
   DokInfo-Feld jetzt auch fixed

      Rev 1.408   10 Feb 1998 09:51:20   MIB
   fix: Fuer Absatz-Abstand am Start-/Ende von Listen auch OL/UL/DL beachten

      Rev 1.407   29 Jan 1998 21:34:22   JP
   GetEndOfIcons ersetzt durch GetEndOfExtras, das auf GetEndOfRedlines mappt

      Rev 1.406   23 Jan 1998 16:10:04   MA
   includes

      Rev 1.405   22 Jan 1998 19:58:26   JP
   CTOR des SwPaM umgestellt

      Rev 1.404   19 Jan 1998 16:24:02   MIB
   Numerierungs-Umbau

      Rev 1.403   17 Dec 1997 15:48:26   ER
   cast fuer IRIX

      Rev 1.402   16 Dec 1997 18:09:04   JP
   GetSearchDelim gegen SFX_SEARCH_DELIMITER ausgetauscht

      Rev 1.401   03 Dec 1997 12:42:50   JP
   Extensions auf dem MAC zulassen

      Rev 1.400   26 Nov 1997 19:09:52   MA
   includes

      Rev 1.399   25 Nov 1997 11:53:20   TJ
   include svhtml.hxx

      Rev 1.398   17 Nov 1997 10:17:28   JP
   Umstellung Numerierung

      Rev 1.397   30 Oct 1997 18:19:26   JP
   DocumentVorlagen-Verwaltung in die Basisklasse verschoben

      Rev 1.396   20 Oct 1997 12:21:42   MIB
   fix: Kleine CSS1-Attribute aus Class hart setzen, wenn Vorlage benutzt wird.

      Rev 1.395   20 Oct 1997 09:52:58   MIB
   Nur fuer absolute positioning benoetigten Code groesstenteils auskommentiert

      Rev 1.394   17 Oct 1997 13:21:30   MIB
   page-break-xxx auch uber STYLE/CLASS und ID-Optionen

      Rev 1.393   14 Oct 1997 14:36:42   JP
   pNext vom Ring wurde privat; zugriff ueber GetNext()

      Rev 1.392   14 Oct 1997 14:30:20   MIB
   fix #44228#: ViewShell-Zerstoerung/Rekonstruktion ueber Clients

      Rev 1.391   09 Oct 1997 14:40:46   JP
   Umstellung NodeIndex/-Array/BigPtrArray

      Rev 1.390   06 Oct 1997 15:41:24   OM
   Feldumstellung

      Rev 1.389   06 Oct 1997 15:27:24   MIB
   Kein NewApplet aufrufen, wenn SOLAR_JAVA nicht gesetzt

      Rev 1.388   19 Sep 1997 12:20:24   MIB
   fix: Seiten-Umbruch auch vor Tabellen temporaer setzen

      Rev 1.387   19 Sep 1997 11:27:38   MIB
   fix #41370#: HRs in Tabellen-Zellen (nicht freigeschaltet)

      Rev 1.386   18 Sep 1997 16:38:12   JP
   Continue: beim Einfuegen von nur einem Node nicht falsch zusammenfassen

      Rev 1.385   18 Sep 1997 09:18:34   JP
   Teilfix fuer Bug 42487

      Rev 1.384   16 Sep 1997 17:23:52   MIB
   abs. Positioning fuer Absatz-Tags

      Rev 1.383   16 Sep 1997 14:55:36   MIB
   ITEMID_BOXINFOITEM (voreubergendend) definieren

      Rev 1.382   16 Sep 1997 11:00:44   MIB
   Kopf-/Fusszeilen ohne Moven von Nodes, autom. Beenden von Bereichen/Rahmen

      Rev 1.381   12 Sep 1997 11:51:20   MIB
   fix #41136#: &(xxx);-Makros

      Rev 1.380   10 Sep 1997 11:00:24   MIB
   HTMLReader::IsFormat() wieder raus

      Rev 1.379   09 Sep 1997 14:09:48   MIB
   Ueberall Browse-View-Breite statt Seitenbreite verwenden

      Rev 1.378   08 Sep 1997 17:41:40   MIB
   Verankerung von AUTO_CNTNT-Rahmen nicht mehr verschieben

      Rev 1.377   04 Sep 1997 12:36:54   JP
   Umstellungen fuer FilterDetection im SwModule und SwDLL

      Rev 1.376   02 Sep 1997 20:45:32   OS
   Header

      Rev 1.375   02 Sep 1997 11:12:08   MIB
   fix #42192#: Attribute schnellstmoeglich setzen

      Rev 1.374   01 Sep 1997 11:54:46   MIB
   fix #42679#: Im Titel nur auf </TITLE> achten, keine Schleife mehr.

      Rev 1.373   29 Aug 1997 16:50:20   OS
   DLL-Umstellung

      Rev 1.372   15 Aug 1997 12:47:46   OS
   charatr/frmatr/txtatr aufgeteilt

      Rev 1.371   14 Aug 1997 13:38:10   MA
   #42534# Error in NextToken abfragen und State setzen

      Rev 1.370   12 Aug 1997 13:44:22   OS
   Header-Umstellung

      Rev 1.369   11 Aug 1997 14:06:24   OM
   Headerfile-Umstellung

      Rev 1.368   07 Aug 1997 13:15:18   MIB
   fix #42192#: Zeichen-Attribute moeglicht frueh setzen. Noch nicht freigeschaltet

      Rev 1.367   04 Aug 1997 13:53:42   MIB
   aboslute psoitioning (fuer fast alle Zeichen-Attribute/-Vorlagen)

      Rev 1.366   31 Jul 1997 10:44:44   MIB
   DIV-Stack weg

      Rev 1.365   25 Jul 1997 13:00:38   MIB
   fix #40408#: <NOEMBED>-Tag

      Rev 1.364   18 Jul 1997 10:54:32   MIB
   fix #40951#: In Reschedule/DocDetected absichtlich geaenderte URLs beachten

      Rev 1.363   16 Jul 1997 18:38:40   MIB
   non-pro: Asserts zur Call-Stack-Kontrolle, kein Assert f. frueher gesetze Attrs

      Rev 1.362   10 Jul 1997 16:44:46   MIB
   fix #41379#: Keine Absatz-Attribute fuer leere Absaetze (auch hinter Tabellen)

      Rev 1.361   10 Jul 1997 12:02:50   MIB
   fix #41547#: Keine Tabellen in Tabellen einfuegen

*************************************************************************/

diff --git a/sw/source/filter/html/swhtml.hxx b/sw/source/filter/html/swhtml.hxx
new file mode 100644
index 0000000..929243d
--- /dev/null
+++ b/sw/source/filter/html/swhtml.hxx
@@ -0,0 +1,1068 @@
/*************************************************************************
 *
 *  $RCSfile: swhtml.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:56 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _SWHTML_HXX
#define _SWHTML_HXX

#if !defined(_SVSTDARR_XUB_STRLEN_DECL) || !defined(_SVSTDARR_LONGS_DECL) || \
    !defined(_SVSTDARR_USHORTS_DECL) || !defined(_SVSTDARR_STRINGSDTOR_DECL)
#ifndef _SVSTDARR_XUB_STRLEN_DECL
#define _SVSTDARR_XUB_STRLEN
#endif
#ifndef _SVSTDARR_LONGS_DECL
#define _SVSTDARR_LONGS
#endif
#ifndef _SVSTDARR_USHORTS_DECL
#define _SVSTDARR_USHORTS
#endif
#ifndef _SVSTDARR_STRINGSDTOR_DECL
#define _SVSTDARR_STRINGSDTOR
#endif
#include <svtools/svstdarr.hxx>
#endif

#ifndef _URLOBJ_HXX //autogen
#include <tools/urlobj.hxx>
#endif

#ifndef _SFXHTML_HXX //autogen
#include <sfx2/sfxhtml.hxx>
#endif

#ifndef _SFXMACITEM_HXX //autogen
#include <svtools/macitem.hxx>
#endif

#ifndef _FMTORNT_HXX //autogen
#include <fmtornt.hxx>
#endif

#ifndef _SVX_SVXENUM_HXX //autogen
#include <svx/svxenum.hxx>
#endif

#ifndef _COM_SUN_STAR_DRAWING_XSHAPE_HPP_
#include <com/sun/star/drawing/XShape.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_XFORMCOMPONENT_HPP_
#include <com/sun/star/form/XFormComponent.hpp>
#endif

#include "doc.hxx"
#include "pam.hxx"
#include "calbck.hxx"

#include "htmlvsh.hxx"

class SfxMedium;
class SdrObject;
class SvxMacroTableDtor;
class SvStringsDtor;

class ViewShell;

class SwStartNode;
class SwTxtNode;
class SwFmtColl;
class SwTxtFmtColl;
class SwFmtFld;
class SwFmtINetFmt;
class SwField;
class _HTMLTableContext;
class SwHTMLForm_Impl;
class SwHTMLApplet_Impl;
struct SwHTMLFootEndNote_Impl;
class HTMLTableCnts;
struct SwPendingStack;
class SvxCSS1PropertyInfo;

#define HTML_PARSPACE (MM50)

#define HTML_DFLT_IMG_WIDTH (MM50*4)
#define HTML_DFLT_IMG_HEIGHT (MM50*2)

// ein par Sachen, die man oefter mal braucht
extern HTMLOptionEnum __FAR_DATA aHTMLPAlignTable[];
extern HTMLOptionEnum __FAR_DATA aHTMLImgHAlignTable[];
extern HTMLOptionEnum __FAR_DATA aHTMLImgVAlignTable[];


// der Attribut Stack:

class _HTMLAttr;
typedef _HTMLAttr *_HTMLAttrPtr;
SV_DECL_PTRARR( _HTMLAttrs, _HTMLAttrPtr, 5, 5 )

class _HTMLAttr
{
    friend class SwHTMLParser;
    friend class _CellSaveStruct;

    SwNodeIndex nSttPara, nEndPara;
    xub_StrLen nSttCntnt, nEndCntnt;
    sal_Bool bInsAtStart : 1;
    sal_Bool bLikePara : 1; // Attribut ueber dem gesamten Absatz setzen
    sal_Bool bValid : 1;    // ist das Attribut gueltig?

    SfxPoolItem* pItem;
    sal_uInt16 nCount;      // Anzahl noch zu schliessender Attrs mit einem Wert
    _HTMLAttr *pNext;   // noch zu schliessene Attrs mit unterschiedl. Werten
    _HTMLAttr *pPrev;   // bereits geschlossene aber noch nicht gesetze Attrs
    _HTMLAttr **ppHead; // der Listenkopf

    _HTMLAttr( const SwPosition& rPos, const SfxPoolItem& rItem,
               _HTMLAttr **pHd=0 );

    _HTMLAttr( const _HTMLAttr &rAttr, const SwNodeIndex &rEndPara,
               xub_StrLen nEndCnt, _HTMLAttr **pHd );

public:

    ~_HTMLAttr();

    _HTMLAttr *Clone( const SwNodeIndex& rEndPara, xub_StrLen nEndCnt ) const;
    void Reset( const SwNodeIndex& rSttPara, xub_StrLen nSttCnt,
                _HTMLAttr **pHd );
    inline void SetStart( const SwPosition& rPos );

    sal_uInt32 GetSttParaIdx() const { return nSttPara.GetIndex(); }
    sal_uInt32 GetEndParaIdx() const { return nEndPara.GetIndex(); }

    const SwNodeIndex& GetSttPara() const { return nSttPara; }
    const SwNodeIndex& GetEndPara() const { return nEndPara; }

    xub_StrLen GetSttCnt() const { return nSttCntnt; }
    xub_StrLen GetEndCnt() const { return nEndCntnt; }

    sal_Bool IsLikePara() const { return bLikePara; }
    void SetLikePara( sal_Bool bPara=sal_True ) { bLikePara = sal_True; }

          SfxPoolItem& GetItem()        { return *pItem; }
    const SfxPoolItem& GetItem() const  { return *pItem; }

    _HTMLAttr *GetNext() const { return pNext; }
    void InsertNext( _HTMLAttr *pNxt ) { pNext = pNxt; }

    _HTMLAttr *GetPrev() const { return pPrev; }
    void InsertPrev( _HTMLAttr *pPrv );
    void ClearPrev() { pPrev = 0; }

    void SetHead( _HTMLAttr **ppHd ) { ppHead = ppHd; }

    // Beim Setzen von Attributen aus Vorlagen kann es passieren,
    // dass Attribute doch nicht mehr gesetzt werden sollen. Die zu loeschen
    // waere sehr aufwendig, da man nicht so genau weiss, wo sie eingekettet
    // sind. Sie werden deshalb einfach invalidiert und erst beim naechsten
    // _SetAttr() geloescht.
    void Invalidate() { bValid = sal_False; }
    sal_Bool IsValid() const { return bValid; }
};

// Tabelle der Attribute: Hier ist die Reihenfolge wichtig: Die Attribute
// vorne in der Tabelle werden in EndAllAttrs auch zuerst gesetzt.
struct _HTMLAttrTable
{
    _HTMLAttr
                *pKeep,         // ::com::sun::star::frame::Frame-Attribure
                *pBox,
                *pBrush,
                *pBreak,
                *pPageDesc,

                *pLRSpace,      // Absatz-Attribute
                *pULSpace,
                *pLineSpacing,
                *pAdjust,
                *pDropCap,
                *pSplit,
                *pWidows,
                *pOrphans,

                *pCharFmts,     // Text-Attribute
                *pINetFmt,

                *pBold,         // Zeichen-Attribute
                *pItalic,
                *pStrike,
                *pUnderline,
                *pBlink,
                *pFont,
                *pFontHeight,
                *pFontColor,
                *pEscapement,
                *pCaseMap,
                *pKerning,      // (nur fuer SPACER)
                *pCharBrush     // Zeichen-Hintergrund
                ;
};

class _HTMLAttrContext_SaveDoc;

enum SwHTMLAppendMode {
     AM_NORMAL,         // keine Absatz-Abstand-Behandlung
     AM_NOSPACE,        // Abstand hart auf 0cm setzen
     AM_SPACE,          // Abstand hart auf 0.5cm setzen
     AM_SOFTNOSPACE,    // Abstand nicht setzen aber 0cm merken
     AM_NONE            // gar kein Append
};

class _HTMLAttrContext
{
    _HTMLAttrs aAttrs;      // die in dem Kontext gestarteten Attribute

    String aClass;          // die Klasse des Kontexts

    _HTMLAttrContext_SaveDoc *pSaveDocContext;
    SfxItemSet *pFrmItemSet;

    sal_uInt16  nToken;         // das Token, zu dem der Kontext gehoehrt

    sal_uInt16  nTxtFmtColl;    // eine in dem Kontext begonnene Vorlage oder 0

    sal_uInt16  nLeftMargin;        // ein veraenderter linker Rand
    sal_uInt16  nRightMargin;       // ein veraenderter rechter Rand
    sal_uInt16  nFirstLineIndent;   // ein veraenderter Erstzeilen-Einzug

    sal_uInt16  nUpperSpace;
    sal_uInt16  nLowerSpace;

    SwHTMLAppendMode eAppend;

    sal_Bool    bLRSpaceChanged : 1;// linker/rechtr Rand, Einzug veraendert?
    sal_Bool    bULSpaceChanged : 1;// oberer/unterer Rand veraendert?
    sal_Bool    bDfltTxtFmtColl : 1;// nTxtFmtColl ist nur ein default
    sal_Bool    bSpansSection : 1;  // Der Kontext spannt eine SwSection auf
    sal_Bool    bPopStack : 1;      // Oberhalb liegende Stack-Elemente entf.
    sal_Bool    bFinishPREListingXMP : 1;
    sal_Bool    bRestartPRE : 1;
    sal_Bool    bRestartXMP : 1;
    sal_Bool    bRestartListing : 1;

public:
    void ClearSaveDocContext();

    _HTMLAttrContext( sal_uInt16 nTokn, sal_uInt16 nPoolId, const String& rClass,
                      sal_Bool bDfltColl=sal_False ) :
        aClass( rClass ),
        pSaveDocContext( 0 ), pFrmItemSet( 0 ),
        nToken( nTokn ), nTxtFmtColl( nPoolId ),
        nLeftMargin( 0 ), nRightMargin( 0 ), nFirstLineIndent( 0 ),
        nUpperSpace( 0 ), nLowerSpace( 0 ),
        eAppend( AM_NONE ),
        bLRSpaceChanged( sal_False ), bULSpaceChanged( sal_False ),
        bSpansSection( sal_False ), bPopStack( sal_False ),
        bFinishPREListingXMP( sal_False ),
        bRestartPRE( sal_False ), bRestartXMP( sal_False ), bRestartListing( sal_False ),
        bDfltTxtFmtColl( bDfltColl )
    {}

    _HTMLAttrContext( sal_uInt16 nTokn ) :
        pSaveDocContext( 0 ), pFrmItemSet( 0 ),
        nToken( nTokn ), nTxtFmtColl( 0 ),
        nLeftMargin( 0 ), nRightMargin( 0 ), nFirstLineIndent( 0 ),
        nUpperSpace( 0 ), nLowerSpace( 0 ),
        eAppend( AM_NONE ),
        bLRSpaceChanged( sal_False ), bULSpaceChanged( sal_False ),
        bSpansSection( sal_False ), bPopStack( sal_False ),
        bFinishPREListingXMP( sal_False ),
        bRestartPRE( sal_False ), bRestartXMP( sal_False ), bRestartListing( sal_False ),
        bDfltTxtFmtColl( sal_False )
    {}

    ~_HTMLAttrContext() { ClearSaveDocContext(); delete pFrmItemSet; }

    sal_uInt16 GetToken() const { return nToken; }

    sal_uInt16 GetTxtFmtColl() const { return bDfltTxtFmtColl ? 0 : nTxtFmtColl; }
    sal_uInt16 GetDfltTxtFmtColl() const { return bDfltTxtFmtColl ? nTxtFmtColl : 0; }

    const String& GetClass() const { return aClass; }

    inline void SetMargins( sal_uInt16 nLeft, sal_uInt16 nRight, short nIndent );

    inline sal_Bool IsLRSpaceChanged() const { return bLRSpaceChanged; }
    inline void GetMargins( sal_uInt16& nLeft, sal_uInt16& nRight,
                            short &nIndent ) const;

    inline void SetULSpace( sal_uInt16 nUpper, sal_uInt16 nLower );
    inline sal_Bool IsULSpaceChanged() const { return bULSpaceChanged; }
    inline void GetULSpace( sal_uInt16& rUpper, sal_uInt16& rLower ) const;

    sal_Bool HasAttrs() const { return aAttrs.Count() != 0; }
    const _HTMLAttrs& GetAttrs() const { return aAttrs; }
    _HTMLAttrs& GetAttrs() { return aAttrs; }

    void SetSpansSection( sal_Bool bSet ) { bSpansSection = bSet; }
    sal_Bool GetSpansSection() const { return bSpansSection; }

    void SetPopStack( sal_Bool bSet ) { bPopStack = bSet; }
    sal_Bool GetPopStack() const { return bPopStack; }

    sal_Bool HasSaveDocContext() const { return pSaveDocContext!=0; }
    _HTMLAttrContext_SaveDoc *GetSaveDocContext( sal_Bool bCreate=sal_False );

    const SfxItemSet *GetFrmItemSet() const { return pFrmItemSet; }
    SfxItemSet *GetFrmItemSet( SwDoc *pCreateDoc );

    void SetFinishPREListingXMP( sal_Bool bSet ) { bFinishPREListingXMP = bSet; }
    sal_Bool IsFinishPREListingXMP() const { return bFinishPREListingXMP; }

    void SetRestartPRE( sal_Bool bSet ) { bRestartPRE = bSet; }
    sal_Bool IsRestartPRE() const { return bRestartPRE; }

    void SetRestartXMP( sal_Bool bSet ) { bRestartXMP = bSet; }
    sal_Bool IsRestartXMP() const { return bRestartXMP; }

    void SetRestartListing( sal_Bool bSet ) { bRestartListing = bSet; }
    sal_Bool IsRestartListing() const { return bRestartListing; }

    void SetAppendMode( SwHTMLAppendMode eMode=AM_NORMAL ) { eAppend = eMode; }
    SwHTMLAppendMode GetAppendMode() const { return eAppend; }
};

typedef _HTMLAttrContext *_HTMLAttrContextPtr;
SV_DECL_PTRARR( _HTMLAttrContexts, _HTMLAttrContextPtr, 5, 5 )

class HTMLTable;
class SwCSS1Parser;
class SwHTMLNumRuleInfo;

typedef ImageMap *ImageMapPtr;
SV_DECL_PTRARR_DEL( ImageMaps, ImageMapPtr, 1, 1 )
typedef SwFrmFmt *SwFrmFmtPtr;
SV_DECL_PTRARR( SwHTMLFrmFmts, SwFrmFmtPtr, 2, 2 )

#define HTML_CNTXT_PROTECT_STACK    0x0001
#define HTML_CNTXT_STRIP_PARA       0x0002
#define HTML_CNTXT_KEEP_NUMRULE     0x0004
#define HTML_CNTXT_HEADER_DIST      0x0008
#define HTML_CNTXT_FOOTER_DIST      0x0010
#define HTML_CNTXT_KEEP_ATTRS       0x0020

#define CONTEXT_FLAGS_ABSPOS    \
    (HTML_CNTXT_PROTECT_STACK | \
     HTML_CNTXT_STRIP_PARA)

#define HTML_FF_BOX                 0x0001
#define HTML_FF_BACKGROUND          0x0002
#define HTML_FF_PADDING             0x0004

class SwHTMLParser : public SfxHTMLParser, public SwClient
{
    friend class _SectionSaveStruct;
    friend class _CellSaveStruct;
    friend class _CaptionSaveStruct;

    String      aPathToFile;
    String      sBaseURL;
    String      sSaveBaseURL;
    String      aBasicLib;
    String      aBasicModule;
    String      aScriptSource;  // Inhalt des aktuellen Script-Blocks
    String      aScriptType;    // Type des gelesenen Scripts (StarBasic/VB/JAVA)
    String      aScriptURL;     // URL eines Scripts
    String      aStyleSource;   // Inhalt des aktuellen Style-Sheets
    String      aContents;      // Text des akteullen Marquee, Feldes etc.
    String      sTitle;
    String      aUnknownToken;  // ein gestartetes unbekanntes Token
    String      aBulletGrfs[MAXLEVEL];
    String      sJmpMark;

    SvUShorts   aBaseFontStack; // Stack fuer <BASEFONT>
                                // Bit 0-2: Fontgroesse (1-7)
    SvUShorts   aFontStack;     // Stack fuer <FONT>, <BIG>, <SMALL>
                                // Bit 0-2: Fontgroesse (1-7)
                                // Bit 15: Fontfarbe wurde gesetzt

    _HTMLAttrs      aSetAttrTab;// "geschlossene", noch nicht gesetzte Attr.
    _HTMLAttrs      aParaAttrs; // vorlauefige Absatz-Attribute
    _HTMLAttrTable  aAttrTab;   // "offene" Attribute
    _HTMLAttrContexts aContexts;// der aktuelle Attribut/Token-Kontext
    SwHTMLFrmFmts   aMoveFlyFrms;// Fly-Frames, deren Anker verschoben wird
    SvXub_StrLens   aMoveFlyCnts;// und deren Content-Positionen

    SwHTMLApplet_Impl *pAppletImpl; // das aktuelle Applet

    SwCSS1Parser    *pCSS1Parser;   // der Style-Sheet-Parser
    SwHTMLNumRuleInfo *pNumRuleInfo;
    SwPendingStack  *pPendStack;

    SwDoc           *pDoc;
    SwPaM           *pPam;      // SwPosition duerfte doch reichen, oder ??
    ViewShell       *pActionViewShell;  // ViewShell, an der das StartAction
                                        // gerufen wurde.
    SwNodeIndex     *pSttNdIdx;

    HTMLTable       *pTable;    // die aktuelle "auesserste" Tabelle
    SwHTMLForm_Impl *pFormImpl;// die aktuelle Form
    SdrObject       *pMarquee;  // aktuelles Marquee
    SwField         *pField;    // aktuelles Feld
    ImageMap        *pImageMap; // aktuelle Image-Map
    ImageMaps       *pImageMaps;// alle gelesenen Image-Maps
    SwHTMLFootEndNote_Impl *pFootEndNoteImpl;

    Size    aHTMLPageSize;      // die Seitengroesse der HTML-Vorlage

    sal_uInt32  aFontHeights[7];    // die Font-Hoehen 1-7
    sal_uInt32  nScriptStartLineNr; // Zeilennummer eines Script-Blocks

    sal_uInt16  nBaseFontStMin;     //
    sal_uInt16  nFontStMin;         //
    sal_uInt16  nDefListDeep;       //
    sal_uInt16  nFontStHeadStart;   // Elemente im Font-Stack bei <Hn>
    sal_uInt16  nSBModuleCnt;       // Zaehler fuer Basic-Module
    sal_uInt16  nMissingImgMaps;    // Wie viele Image-Maps fehlen noch?
    sal_uInt16  nParaCnt;
    sal_uInt16  nContextStMin;      // Untergrenze fuer PopContext
    sal_uInt16  nContextStAttrMin;  // Untergrenze fuer Attributierung
    sal_uInt16  nSelectEntryCnt;    // Anzahl der Eintraege der akt. Listbox
    sal_uInt16  nOpenParaToken;     // ein geoeffnetes Absatz-Element

    enum JumpToMarks { JUMPTO_NONE, JUMPTO_MARK, JUMPTO_TABLE, JUMPTO_FRAME,
                        JUMPTO_REGION, JUMPTO_GRAPHIC } eJumpTo;

#ifndef PRODUCT
    sal_uInt16  nContinue;          // Tiefe der Continue-Aufrufe
#endif

    SvxAdjust   eParaAdjust;    // Ausrichtung des aktuellen Absatz
    HTMLScriptLanguage eScriptLang; // die aktuelle Script-Language

    sal_Bool bOldIsHTMLMode : 1;    // War's mal ein HTML-Dokument?

    sal_Bool bDocInitalized : 1;    // Dokument bzw. Shell wurden initialisiert
                                // Flag um doppeltes init durch Rekursion
                                // zu verhindern.
    sal_Bool bViewCreated : 1;      // die View wurde schon erzeugt (asynchron)
    sal_Bool bSetCrsr : 1;          // Crsr wieder auf den Anfang setzen
    sal_Bool bSetModEnabled : 1;

    sal_Bool bInFloatingFrame : 1;  // Wir sind in einen Floating ::com::sun::star::frame::Frame
    sal_Bool bInField : 1;
    sal_Bool bKeepUnknown : 1;      // unbekannte/nicht unterstuetze Tokens beh.
    // 8
    sal_Bool bCallNextToken : 1;    // In Tabellen: NextToken in jedem Fall rufen
    sal_Bool bIgnoreRawData : 1;    // Inhalt eines Scripts/Styles ignorieren.
    sal_Bool bLBEntrySelected : 1;  // Ist der aktuelle Listbox-Eintrag selekt.
    sal_Bool bTAIgnoreNewPara : 1;  // naechstes LF in TextArea ignorieren?
    sal_Bool bFixMarqueeWidth : 1;  // Groesse einer Laufschrift anpassen?
    sal_Bool bFixMarqueeHeight : 1;

    sal_Bool bUpperSpace : 1;       // obererer Absatz-Abstand wird benoetigt
    sal_Bool bNoParSpace : 1;
    // 16

    sal_Bool bAnyStarBasic : 1;     // gibt es ueberhaupt ein StarBasic-Modul
    sal_Bool bInNoEmbed : 1;        // Wir sind in einem NOEMBED-Bereich

    sal_Bool bInTitle : 1;          // Wir sind im Titel

    sal_Bool bChkJumpMark : 1;      // springe ggfs. zu einem vorgegebenem Mark
    sal_Bool bUpdateDocStat : 1;
    sal_Bool bFixSelectWidth : 1;   // Breite eines Selects neu setzen?
    sal_Bool bFixSelectHeight : 1;  // Breite eines Selects neu setzen?
    sal_Bool bTextArea : 1;
    // 24
    sal_Bool bSelect : 1;
    sal_Bool bInFootEndNoteAnchor : 1;
    sal_Bool bInFootEndNoteSymbol : 1;
    sal_Bool bDataAvailableLinkSet : 1;

    SvRefBaseRef aLoadEnv;

    void DeleteFormImpl();

    void DocumentDetected();
    void Show();
    void ShowStatline();
    ViewShell *CallStartAction( ViewShell *pVSh = 0, sal_Bool bChkPtr = sal_True );
    ViewShell *CallEndAction( sal_Bool bChkAction = sal_False, sal_Bool bChkPtr = sal_True );
    ViewShell *CheckActionViewShell();

    inline void GetSaveAndSetOwnBaseURL();
    inline void SetSaveBaseURL();

    // Attribute am Dok setzen
    void _SetAttr( sal_Bool bChkEnd, sal_Bool bBeforeTable, _HTMLAttrs *pPostIts );
    inline void SetAttr( sal_Bool bChkEnd = sal_True, sal_Bool bBeforeTable = sal_False,
                         _HTMLAttrs *pPostIts = 0 )
    {
        if( aSetAttrTab.Count() || aMoveFlyFrms.Count() )
            _SetAttr( bChkEnd, bBeforeTable, pPostIts );
    }

    _HTMLAttr **GetAttrTabEntry( sal_uInt16 nWhich );

    // Einen neuen Textknoten an PaM-Position anlegen
    sal_Bool AppendTxtNode( SwHTMLAppendMode eMode=AM_NORMAL, sal_Bool bUpdateNum=sal_True );
    void AddParSpace();

    // Ein Attribut beginnen/beenden
    // ppDepAttr gibt einen Attribut-Tabellen-Eintrag an, dessen Attribute
    // gesetzt sein muessen, bevor das Attribut beendet werden darf
    void NewAttr( _HTMLAttr **ppAttr, const SfxPoolItem& rItem );
    void EndAttr( _HTMLAttr *pAttr, _HTMLAttr **ppDepAttr=0,
                  sal_Bool bChkEmpty=sal_True );
    void DeleteAttr( _HTMLAttr* pAttr );

    void EndContextAttrs( _HTMLAttrContext *pContext, sal_Bool bRemove=sal_False );
    void SaveAttrTab( _HTMLAttrTable& rNewAttrTab );
    void SplitAttrTab( const SwPosition& rNewPos );
    void SplitAttrTab( _HTMLAttrTable& rNewAttrTab, sal_Bool bMoveEndBack = sal_True );
    void RestoreAttrTab( const _HTMLAttrTable& rNewAttrTab,
                         sal_Bool bSetNewStart = sal_False );
    void InsertAttr( const SfxPoolItem& rItem, sal_Bool bLikePara = sal_False,
                     sal_Bool bInsAtStart=sal_False );
    void InsertAttrs( _HTMLAttrs& rAttrs );

    sal_Bool DoPositioning( SfxItemSet &rItemSet,
                        SvxCSS1PropertyInfo &rPropInfo,
                        _HTMLAttrContext *pContext );
    sal_Bool CreateContainer( const String& rClass, SfxItemSet &rItemSet,
                          SvxCSS1PropertyInfo &rPropInfo,
                          _HTMLAttrContext *pContext );
    sal_Bool EndSection( sal_Bool bLFStripped=sal_False );

    void InsertAttrs( SfxItemSet &rItemSet, SvxCSS1PropertyInfo &rPropInfo,
                      _HTMLAttrContext *pContext, sal_Bool bCharLvl=sal_False );
    void InsertAttr( _HTMLAttr **ppAttr, const SfxPoolItem & rItem,
                     _HTMLAttrContext *pCntxt );
    void SplitPREListingXMP( _HTMLAttrContext *pCntxt );
    void FixHeaderFooterDistance( sal_Bool bHeader, const SwPosition *pOldPos );

    void EndContext( _HTMLAttrContext *pContext );
    void ClearContext( _HTMLAttrContext *pContext );

    const SwFmtColl *GetCurrFmtColl() const;

    const SwTwips GetCurrentBrowseWidth() /* const */;

    SwHTMLNumRuleInfo& GetNumInfo() { return *pNumRuleInfo; }
    void SetNodeNum( sal_uInt8 nLevel );
#ifndef NUM_RELSPACE
    void UpdateNumRuleInTable();
#endif

    // Verwalten von Absatz-Vorlagen

    // die Vorlagen auf dem Stack bzw. deren Attribute setzen
    void SetTxtCollAttrs( _HTMLAttrContext *pContext = 0 );

    // die Attribute eine Vorlage zu dem Item-Set hinzufuegen
    void AddFormatAttrs( SfxItemSet& rItemSet, const SwFmt& rFmt ) const;

    // die Attribute einer Vorlage aus dem Item-Set entfernen
    void RemoveFormatAttrs( SfxItemSet& rItemSet, const SwFmt& rFmt ) const;

    void InsertParaAttrs( const SfxItemSet& rItemSet );

    // Verwalten des Attribut-Kontexts

    // aktuellen Kontext merken
    inline void PushContext( _HTMLAttrContext *pCntxt );

    // den obersten/spezifizierten Kontext holen, aber nicht ausserhalb
    // des Kontexts mit Token nLimit suchen. Wenn bRemove gesetzt ist,
    // wird er entfernt
    _HTMLAttrContext *PopContext( sal_uInt16 nToken=0, sal_uInt16 nLimit=0,
                                  sal_Bool bRemove=sal_True );
    inline const _HTMLAttrContext *GetTopContext() const;

    sal_Bool GetMarginsFromContext( sal_uInt16 &nLeft, sal_uInt16 &nRight, short& nIndent,
                                sal_Bool bIgnoreCurrent=sal_False ) const;
    sal_Bool GetMarginsFromContextWithNumBul( sal_uInt16 &nLeft, sal_uInt16 &nRight,
                                          short& nIndent ) const;
    void GetULSpaceFromContext( sal_uInt16 &rUpper, sal_uInt16 &rLower ) const;


    void MovePageDescAttrs( SwNode *pSrcNd, sal_uInt32 nDestIdx, sal_Bool bFmtBreak );

    // Behandlung von Tags auf Absatz-Ebene

    // <P> und <H1> bis <H6>
    void NewPara();
    void EndPara( sal_Bool bReal = sal_False );
    void NewHeading( int nToken );
    void EndHeading();

    // <ADDRESS>, <BLOCKQUOTE> und <PRE>
    void NewTxtFmtColl( int nToken, sal_uInt16 nPoolId );
    void EndTxtFmtColl( int nToken );

    // <DIV> und <CENTER>
    void NewDivision( int nToken );
    void EndDivision( int nToken );

    // Fly-Frames einfuegen/verlassen
    void InsertFlyFrame( const SfxItemSet& rItemSet, _HTMLAttrContext *pCntxt,
                         const String& rId, sal_uInt16 nFlags );

    void SaveDocContext( _HTMLAttrContext *pCntxt, sal_uInt16 nFlags,
                       const SwPosition *pNewPos );
    void RestoreDocContext( _HTMLAttrContext *pCntxt );

    // alle durch <DIV> aufgespannten Bereiche verlassen
    sal_Bool EndSections( sal_Bool bLFStripped );

    // <MULTICOL>
    void NewMultiCol();
    void EndMultiCol();

    // <MARQUEE>
    void NewMarquee( HTMLTable *pCurTable=0 );
    void EndMarquee();
    void InsertMarqueeText();

    // Behandluung von Listen

    // Numerierungs <OL> und Aufzaehlungs-Listen <UL> mit <LI>
    void NewNumBulList( int nToken );
    void EndNumBulList( int nToken=0 );
    void NewNumBulListItem( int nToken );
    void EndNumBulListItem( int nToken=0, sal_Bool bSetColl=sal_True,
                            sal_Bool bLastPara=sal_False );

    // Definitions-Listen <DL> mit <DD>, <DT>
    void NewDefList();
    void EndDefList();
    void NewDefListItem( int nToken );
    void EndDefListItem( int nToken=0, sal_Bool bSetColl=sal_True,
                         sal_Bool bLastPara=sal_False );


    // Behandlung von Tags auf Zeichen-Ebene

    // Tags wie <B>, <I> etc behandeln, die ein bestimmtes Attribut
    // an und ausschalten, oder die wie SPAN nur Attribute aus Styles holen
    void NewStdAttr( int nToken );
    void NewStdAttr( int nToken, _HTMLAttr **ppAttr,
                     const SfxPoolItem & rItem );
    void EndTag( int nToken );

    // Font-Attribute behandeln
    void NewBasefontAttr();             // fuer <BASEFONT>
    void EndBasefontAttr();
    void NewFontAttr( int nToken ); // fuer <FONT>, <BIG> und <SMALL>
    void EndFontAttr( int nToken );

    // Tags, die durch Zeichenvorlagen realisiert werden
    void NewCharFmt( int nToken );

    // <SDFIELD>
public:
    static sal_uInt16 GetNumType( const String& rStr, sal_uInt16 eDfltType );
private:
    void NewField();
    void EndField();
    void InsertFieldText();

    // <SPACER>
    void InsertSpacer();

    // Einfuegen von Grafiken, Plugins und Applets

    // Image-Maps suchen und mit Grafik-Nodes verbinden
    ImageMap *FindImageMap( const String& rURL ) const;
    void ConnectImageMaps();

    // Verankerung eines Fly-Frames bestimmen und entsprechende Attribute
    // in den Attrset setzen (htmlgrin.cxx)
    void SetAnchorAndAdjustment( SwVertOrient eVertOri,
                                 SwHoriOrient eHoriOri,
                                 const SfxItemSet &rItemSet,
                                 const SvxCSS1PropertyInfo &rPropInfo,
                                 SfxItemSet& rFrmSet );
    void SetAnchorAndAdjustment( SwVertOrient eVertOri,
                                 SwHoriOrient eHoriOri,
                                 SfxItemSet& rFrmSet,
                                 sal_Bool bDontAppend=sal_False );
    void SetAnchorAndAdjustment( const SfxItemSet &rItemSet,
                                 const SvxCSS1PropertyInfo &rPropInfo,
                                 SfxItemSet &rFrmItemSet );

    void SetFrmFmtAttrs( SfxItemSet &rItemSet, SvxCSS1PropertyInfo &rPropInfo,
                         sal_uInt16 nFlags, SfxItemSet &rFrmItemSet );

    // Frames anlegen und Auto-gebundene Rahmen registrieren
    void RegisterFlyFrm( SwFrmFmt *pFlyFrm );

    // Die Groesse des Fly-Frames an die Vorgaben und Gegebenheiten anpassen
    // (nicht fuer Grafiken, deshalb htmlplug.cxx)
    void SetFixSize( const Size& rPixSize, const Size& rTwipDfltSize,
                     sal_Bool bPrcWidth, sal_Bool bPrcHeight,
                     SfxItemSet &rItemSet, SvxCSS1PropertyInfo &rPropInfo,
                     SfxItemSet& rFlyItemSet );
    void SetVarSize( SfxItemSet &rItemSet, SvxCSS1PropertyInfo &rPropInfo,
                     SfxItemSet& rFlyItemSet, SwTwips nDfltWidth=MINLAY,
                     sal_uInt8 nDltPrcWidth=0 );
    void SetSpace( const Size& rPixSpace, SfxItemSet &rItemSet,
                   SvxCSS1PropertyInfo &rPropInfo, SfxItemSet& rFlyItemSet );

    sal_uInt16 IncGrfsThatResizeTable();

    void GetDefaultScriptType( ScriptType& rType,
                               String& rTypeStr ) const;

    // die eigentlichen Einfuege-Methoden fuer <IMG>, <EMBED> und <APPLET>
    // und <PARAM>
    void InsertImage();     // htmlgrin.cxx
    void InsertEmbed();     // htmlplug.cxx

    void InsertApplet();    // htmlplug.cxx
    void EndApplet();       // CommandLine mit Applet verkn. (htmlplug.cxx)
    void InsertParam();     // htmlplug.cxx

    void InsertFloatingFrame();
    void EndFloatingFrame() { bInFloatingFrame = sal_False; }

    // <BODY>-Tag auswerten: Hintergrund-Grafiken und -Farben setzen (htmlgrin.cxx)
    void InsertBodyOptions();


    // Einfuegen von Links und ::com::sun::star::text::Bookmarks (htmlgrin.cxx)

    // <A>-Tag auswerten: einen Link bzw. eine ::com::sun::star::text::Bookmark einfuegen
    void NewAnchor();
    void EndAnchor();

    // eine ::com::sun::star::text::Bookmark einfuegen
    void InsertBookmark( const String& rName );


    void InsertCommentText( const sal_Char *pTag = 0 );
    void InsertComment( const String& rName, const sal_Char *pTag = 0 );

    // sind im aktuellen Absatz ::com::sun::star::text::Bookmarks vorhanden?
    sal_Bool HasCurrentParaBookmarks( sal_Bool bIgnoreStack=sal_False ) const;


    // Einfuegen von Script/Basic-Elementen

    // das zueletzt gelsene Basic-Modul parsen (htmlbas.cxx)
    void NewScript();
    void EndScript();

    void AddScriptSource();

    // ein Event in die SFX-Konfiguation eintragen (htmlbas.cxx)
    void InsertBasicDocEvent( sal_uInt16 nEvent, const String& rName,
                              ScriptType eScrType, const String& rScrType );

    // ein Event an ein VC-Control anhaengen (htmlform.cxx)
    void InsertBasicCtrlEvent( sal_uInt16 nEvent, const String& rName );

    // Einfuegen von Styles

    // <STYLE>
    void NewStyle();
    void EndStyle();

    inline sal_Bool HasStyleOptions( const String &rStyle, const String &rId,
                                 const String &rClass );
    sal_Bool ParseStyleOptions( const String &rStyle, const String &rId,
                            const String &rClass, SfxItemSet &rItemSet,
                            SvxCSS1PropertyInfo &rPropInfo );


    // Einfuegen von Controls und ::com::sun::star::form::Forms (htmlform.cxx)

    // Ein Draw-Objekt in das Dokuement eintragen
    void InsertDrawObject( SdrObject* pNewDrawObj, const Size& rSpace,
                           SwVertOrient eVertOri,
                           SwHoriOrient eHoriOri,
                           SfxItemSet& rCSS1ItemSet,
                           SvxCSS1PropertyInfo& rCSS1PropInfo,
                           sal_Bool bHidden=sal_False );
                        ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >  InsertControl( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormComponent > & rFormComp,
                        const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rFCompPropSet,
                        const Size& rSize,
                        SwVertOrient eVertOri,
                        SwHoriOrient eHoriOri,
                        SfxItemSet& rCSS1ItemSet,
                        SvxCSS1PropertyInfo& rCSS1PropInfo,
                        const SvxMacroTableDtor& rMacroTbl,
                        const SvStringsDtor& rUnoMacroTbl,
                        const SvStringsDtor& rUnoMacroParamTbl,
                        sal_Bool bSetPropSet = sal_True,
                        sal_Bool bHidden = sal_False );
    void SetControlSize( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > & rShape, const Size& rTextSz,
                         sal_Bool bMinWidth, sal_Bool bMinHeight, int nToken );
    void SetPendingControlSize( int nToken );

public:
    void ResizeDrawObject( SdrObject* pObj, SwTwips nWidth );
private:
    void RegisterDrawObjectToTable( HTMLTable *pCurTable, SdrObject* pObj,
                                    sal_uInt8 nWidth );


    // eine neue Form beginnen
    void NewForm( sal_Bool bAppend=sal_True );
    void EndForm( sal_Bool bAppend=sal_True );

    // die Einfuege-Methoden fuer <INPUT>, <TEXTAREA> und <SELECT>
    void InsertInput();

    void NewTextArea();
    void InsertTextAreaText( sal_uInt16 nToken );
    void EndTextArea();

    void NewSelect();
    void InsertSelectOption();
    void InsertSelectText();
    void EndSelect();

    // Einfuegen von Tabellen (htmltab.cxx)

public:         // wird in Tabellen benoetigt

    // einen Boxen-Inhalt hinter dem angegebenen Node einfuegen
    const SwStartNode *InsertTableSection( const SwStartNode *pPrevStNd );

    // Einen Boxen-Inhalt am Ende der Tabelle einfuegen, in der der PaM
    // steht un den PaM in die Zelle schieben
    const SwStartNode *InsertTableSection( sal_uInt16 nPoolId );

    // Einfeuge-Methoden fuer die diversen Tabellen-Tags
    HTMLTableCnts *InsertTableContents( sal_Bool bHead );

private:

    // Eine leere Boxen am Ende der Tabelle einfuegen. Der PaM wird
    // NICHT in die Zelle verschoben!
    const SwStartNode *InsertEmptyTableSection();


    // Eine Section fuer die voruebergende Aufnahme der Tabellen-Ueberschrift
    // anlegen
    SwStartNode *InsertTempTableCaptionSection();

    void BuildTableCell( HTMLTable *pTable, sal_Bool bReadOptions, sal_Bool bHead );
    void BuildTableRow( HTMLTable *pTable, sal_Bool bReadOptions,
                        SvxAdjust eGrpAdjust, SwVertOrient eVertOri );
    void BuildTableSection( HTMLTable *pTable, sal_Bool bReadOptions, sal_Bool bHead );
    void BuildTableColGroup( HTMLTable *pTable, sal_Bool bReadOptions );
    void BuildTableCaption( HTMLTable *pTable );
    HTMLTable *BuildTable( SvxAdjust eCellAdjust,
                           sal_Bool bIsParentHead = sal_False,
                           sal_Bool bHasParentSection=sal_True,
                           sal_Bool bIsInMulticol = sal_False,
                           sal_Bool bHasToFlow = sal_False );


    // sonstiges ...

    void ParseMoreMetaOptions();

    sal_Bool FileDownload( const String& rURL, String& rStr );
    void InsertLink();

    void InsertIDOption();
    void InsertLineBreak();
    void InsertHorzRule();

    void FillEndNoteInfo( const String& rContent );
    void FillFootNoteInfo( const String& rContent );
    void InsertFootEndNote( const String& rName, sal_Bool bEndNote, sal_Bool bFixed );
    void FinishFootEndNote();
    void InsertFootEndNoteText();
    SwNodeIndex *GetFootEndNoteSection( const String& rName );
    void DeleteFootEndNoteImpl();

    // Line-Break am Ende eines Absatzes entfernen
    xub_StrLen StripTrailingLF();

    // Einen leeren Absatz an der PaM-Position entfernen
    void StripTrailingPara();

    // sind im aktuellen Absatz Fly-Frames vorhanden?
    sal_Bool HasCurrentParaFlys( sal_Bool bNoSurroundOnly = sal_False,
                             sal_Bool bSurroundOnly = sal_False ) const;

public:         // wird in Tabellen benoetigt

    // generieren eines BrushItems (mit new) oder 0
    SvxBrushItem* CreateBrushItem( const Color *pColor,
                                   const String &rImageURL,
                                   const String &rStyle,
                                   const String &rId,
                                   const String &rClass );

protected:
    // wird fuer jedes Token gerufen, das in CallParser erkannt wird
    virtual void NextToken( int nToken );
    virtual ~SwHTMLParser();

    // wird das Dok geloescht, ist auch der Parser zu loeschen
    virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew );

public:

    SwHTMLParser( SwDoc* pD, const SwPaM& rCrsr, SvStream& rIn,
                    const String& rFileName, int bReadNewDoc = sal_True,
                    SfxMedium* pMed = 0, sal_Bool bReadUTF8 = sal_False );

    virtual SvParserState CallParser();   // Aufruf des Parsers


    sal_uInt16 ToTwips( sal_uInt16 nPixel ) const;

    // fuers asynchrone lesen aus dem SvStream
    virtual void Continue( int nToken );
};


struct SwPendingStackData
{
    virtual ~SwPendingStackData() {}
};

struct SwPendingStack
{
    int nToken;
    SwPendingStackData* pData;
    SwPendingStack* pNext;

    SwPendingStack( int nTkn, SwPendingStack* pNxt )
        : nToken( nTkn ), pData( 0 ), pNext( pNxt )
        {}
};

inline void _HTMLAttr::SetStart( const SwPosition& rPos )
{
    nSttPara = rPos.nNode;
    nSttCntnt = rPos.nContent.GetIndex();
    nEndPara = nSttPara;
    nEndCntnt = nSttCntnt;
}

inline void _HTMLAttrContext::SetMargins( sal_uInt16 nLeft, sal_uInt16 nRight,
                                          short nIndent )
{
    nLeftMargin = nLeft;
    nRightMargin = nRight;
    nFirstLineIndent = nIndent;
    bLRSpaceChanged = sal_True;
}

inline void _HTMLAttrContext::GetMargins( sal_uInt16& nLeft,
                                          sal_uInt16& nRight,
                                          short& nIndent ) const
{
    if( bLRSpaceChanged )
    {
        nLeft = nLeftMargin;
        nRight = nRightMargin;
        nIndent = nFirstLineIndent;
    }
}

inline void _HTMLAttrContext::SetULSpace( sal_uInt16 nUpper, sal_uInt16 nLower )
{
    nUpperSpace = nUpper;
    nLowerSpace = nLower;
    bULSpaceChanged = sal_True;
}

inline void _HTMLAttrContext::GetULSpace( sal_uInt16& rUpper,
                                          sal_uInt16& rLower ) const
{
    if( bULSpaceChanged )
    {
        rUpper = nUpperSpace;
        rLower = nLowerSpace;
    }
}

inline sal_Bool SwHTMLParser::HasStyleOptions( const String &rStyle,
                                           const String &rId,
                                           const String &rClass )
{
    return rStyle.Len() || rId.Len() || rClass.Len();
}

inline const _HTMLAttrContext *SwHTMLParser::GetTopContext() const
{
    return aContexts.Count() > nContextStMin
            ? aContexts[aContexts.Count()-1] : 0;
}

inline void SwHTMLParser::PushContext( _HTMLAttrContext *pCntxt )
{
    aContexts.Insert( pCntxt, aContexts.Count() );
}


inline void SwHTMLParser::GetSaveAndSetOwnBaseURL()
{
    sSaveBaseURL = INetURLObject::GetBaseURL();
    INetURLObject::SetBaseURL( sBaseURL );
}

inline void SwHTMLParser::SetSaveBaseURL()
{
    INetURLObject::SetBaseURL( sSaveBaseURL );
}


#endif


diff --git a/sw/source/filter/html/wrthtml.cxx b/sw/source/filter/html/wrthtml.cxx
new file mode 100644
index 0000000..b04a90e
--- /dev/null
+++ b/sw/source/filter/html/wrthtml.cxx
@@ -0,0 +1,1477 @@
/*************************************************************************
 *
 *  $RCSfile: wrthtml.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:56 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#include <stdlib.h>

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef SVTOOLS_URIHELPER_HXX
#include <svtools/urihelper.hxx>
#endif
#ifndef _RTL_TENCINFO_H
#include <rtl/tencinfo.h>
#endif
#ifndef _SV_WRKWIN_HXX
#include <vcl/wrkwin.hxx>
#endif
#ifndef _LINKMGR_HXX //autogen
#include <so3/linkmgr.hxx>
#endif
#ifndef _OFA_HTMLCFG_HXX //autogen
#include <offmgr/htmlcfg.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _URLOBJ_HXX //autogen
#include <tools/urlobj.hxx>
#endif
#ifndef _FRMHTMLW_HXX //autogen
#include <sfx2/frmhtmlw.hxx>
#endif
#ifndef _XOUTBMP_HXX //autogen
#include <svx/xoutbmp.hxx>
#endif
#ifndef _SVX_HTMLMODE_HXX //autogen
#include <svx/htmlmode.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_COLRITEM_HXX //autogen
#include <svx/colritem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _SVX_FONTITEM_HXX
#include <svx/fontitem.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif

#ifndef _COM_SUN_STAR_FORM_XFORMSSUPPLIER_HPP_
#include <com/sun/star/form/XFormsSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_XFORM_HPP_
#include <com/sun/star/form/XForm.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_XIMAGEPRODUCERSUPPLIER_HPP_
#include <com/sun/star/form/XImageProducerSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_XFORMCONTROLLER_HPP_
#include <com/sun/star/form/XFormController.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_XFORMCOMPONENT_HPP_
#include <com/sun/star/form/XFormComponent.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_XFORMCONTROLLERLISTENER_HPP_
#include <com/sun/star/form/XFormControllerListener.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XCONTAINER_HPP_
#include <com/sun/star/container/XContainer.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XINDEXCONTAINER_HPP_
#include <com/sun/star/container/XIndexContainer.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XNAMEREPLACE_HPP_
#include <com/sun/star/container/XNameReplace.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XCONTAINERLISTENER_HPP_
#include <com/sun/star/container/XContainerListener.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XSET_HPP_
#include <com/sun/star/container/XSet.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_CONTAINEREVENT_HPP_
#include <com/sun/star/container/ContainerEvent.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XINDEXREPLACE_HPP_
#include <com/sun/star/container/XIndexReplace.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XNAMECONTAINER_HPP_
#include <com/sun/star/container/XNameContainer.hpp>
#endif

#ifndef _FMTHDFT_HXX //autogen
#include <fmthdft.hxx>
#endif
#ifndef _FMTFLD_HXX //autogen
#include <fmtfld.hxx>
#endif
#ifndef _FMTPDSC_HXX //autogen
#include <fmtpdsc.hxx>
#endif
#ifndef _TXATBASE_HXX //autogen
#include <txatbase.hxx>
#endif
#ifndef _FRMATR_HXX
#include "frmatr.hxx"
#endif
#ifndef _CHARFMT_HXX //autogen
#include <charfmt.hxx>
#endif
#ifndef _DOCARY_HXX
#include <docary.hxx>
#endif
#ifdef TF_ONE51
#endif

#ifndef _PAM_HXX
#include <pam.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _NDTXT_HXX
#include <ndtxt.hxx>
#endif
#ifndef _MDIEXP_HXX
#include <mdiexp.hxx>       // ...Percent()
#endif
#ifndef _FLTINI_HXX
#include <fltini.hxx>
#endif
#ifndef _VIEWOPT_HXX
#include <viewopt.hxx>
#endif
#ifndef _BOOKMRK_HXX
#include <bookmrk.hxx>      // fuer SwBookmark ...
#endif
#ifndef _POOLFMT_HXX
#include <poolfmt.hxx>
#endif
#ifndef _PAGEDESC_HXX
#include <pagedesc.hxx>
#endif
#ifndef _SECTION_HXX
#include <section.hxx>
#endif
#ifndef _SWTABLE_HXX
#include <swtable.hxx>
#endif
#ifndef _FLDBAS_HXX
#include <fldbas.hxx>
#endif
#ifndef _FMTCLDS_HXX
#include <fmtclds.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _WRTHTML_HXX
#include <wrthtml.hxx>
#endif
#ifndef _HTMLNUM_HXX
#include <htmlnum.hxx>
#endif
#ifndef _HTMLFLY_HXX
#include <htmlfly.hxx>
#endif

#ifndef _SWMODULE_HXX //autogen
#include <swmodule.hxx>
#endif

#ifndef _STATSTR_HRC
#include <statstr.hrc>      // ResId fuer Statusleiste
#endif
#ifndef _SWSWERROR_H
#include <swerror.h>
#endif

#define MAX_INDENT_LEVEL 20

#if defined(MAC)
const sal_Char SwHTMLWriter::sNewLine = '\015';
#elif defined(UNX)
const sal_Char SwHTMLWriter::sNewLine = '\012';
#else
const sal_Char __FAR_DATA SwHTMLWriter::sNewLine[] = "\015\012";
#endif

static sal_Char __FAR_DATA sIndentTabs[MAX_INDENT_LEVEL+2] =
    "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t";

SwHTMLWriter::SwHTMLWriter()
{
    bFirstLine = sal_True;
    nBkmkTabPos = USHRT_MAX;
    pFlyFrmFmt = 0;
    pDfltColor = 0;
    nImgMapCnt = 1;
    pStartNdIdx = 0;
    pTemplate = 0;
    pNumRuleInfo = new SwHTMLNumRuleInfo;
    pNextNumRuleInfo = 0;
    pFootEndNotes = 0;
    pFmtFtn = 0;
    eDestEnc = RTL_TEXTENCODING_MS_1252;
}


__EXPORT SwHTMLWriter::~SwHTMLWriter()
{
    delete pNumRuleInfo;
}

sal_uInt32 SwHTMLWriter::WriteStream()
{
    // neue Konfiguration setzen
    OfaHtmlOptions* pHtmlOptions = OFF_APP()->GetHtmlOptions();

    // die Fontgroessen 1-7
    aFontHeights[0] = pHtmlOptions->GetFontSize( 0 ) * 20;
    aFontHeights[1] = pHtmlOptions->GetFontSize( 1 ) * 20;
    aFontHeights[2] = pHtmlOptions->GetFontSize( 2 ) * 20;
    aFontHeights[3] = pHtmlOptions->GetFontSize( 3 ) * 20;
    aFontHeights[4] = pHtmlOptions->GetFontSize( 4 ) * 20;
    aFontHeights[5] = pHtmlOptions->GetFontSize( 5 ) * 20;
    aFontHeights[6] = pHtmlOptions->GetFontSize( 6 ) * 20;

    // ueberhaupt Styles ausgeben
    // (dann auch obere und untere Absatz-Abstaende)
    nExportMode = pHtmlOptions->GetExportMode();
    nHTMLMode = GetHtmlMode(0);
    if( HTML_CFG_WRITER==nExportMode || HTML_CFG_NS30==nExportMode ||
        HTML_CFG_NS40==nExportMode )
        nHTMLMode |= HTMLMODE_BLOCK_SPACER;

    if( HTML_CFG_WRITER==nExportMode || HTML_CFG_MSIE==nExportMode )
        nHTMLMode |= (HTMLMODE_FLOAT_FRAME | HTMLMODE_LSPACE_IN_NUMBUL);

    if( HTML_CFG_NS30==nExportMode )
        nHTMLMode |= HTMLMODE_VERT_SPACER;

    if( HTML_CFG_MSIE==nExportMode )
        nHTMLMode |= HTMLMODE_NBSP_IN_TABLES;

    if( HTML_CFG_WRITER==nExportMode || HTML_CFG_NS40==nExportMode ||
        HTML_CFG_MSIE==nExportMode )
        nHTMLMode |= HTMLMODE_ABS_POS_FLY;

    if( HTML_CFG_WRITER==nExportMode || HTML_CFG_MSIE==nExportMode )
        nHTMLMode |= HTMLMODE_ABS_POS_DRAW;

    if( HTML_CFG_WRITER==nExportMode )
//      nHTMLMode |= HTMLMODE_FLY_MARGINS | HTMLMODE_FRSTLINE_IN_NUMBUL;
        nHTMLMode |= HTMLMODE_FLY_MARGINS;

    if( HTML_CFG_NS40==nExportMode )
        nHTMLMode |= HTMLMODE_BORDER_NONE;

    if( HTML_CFG_HTML32!=nExportMode )
        nHTMLMode |= HTMLMODE_FONT_GENERIC;

    if( HTML_CFG_NS30==nExportMode || HTML_CFG_NS40==nExportMode )
        nHTMLMode |= HTMLMODE_NO_CONTROL_CENTERING;

    bCfgOutStyles = IsHTMLMode(HTMLMODE_SOME_STYLES |
                               HTMLMODE_FULL_STYLES);
    bCfgNetscape4 = (HTML_CFG_NS40==nExportMode);

    if( IsHTMLMode(HTMLMODE_SOME_STYLES | HTMLMODE_FULL_STYLES) )
        nHTMLMode |= HTMLMODE_PRINT_EXT;

    const sal_Char *pHelpHack = getenv( "HelpEx" );
    if( pHelpHack )
    {
        ByteString aTmp( pHelpHack );
        if( aTmp.EqualsIgnoreCaseAscii( "Hilfe" ) )
            nHTMLMode |= HTMLMODE_NO_BR_AT_PAREND;
    }

    eCSS1Unit = (FieldUnit)SW_MOD()->GetMetric( pDoc->IsHTMLMode() );

    const sal_Char *pCharSet =
        rtl_getBestMimeCharsetFromTextEncoding( gsl_getSystemTextEncoding() );
    eDestEnc = rtl_getTextEncodingFromMimeCharset( pCharSet );

    // fuer Netscape optimieren heisst Spacer- und Multicol ausgeben
//  bCfgMultiCol = pHtmlOptions->IsNetscape3();
//  bCfgSpacer = pHtmlOptions->IsNetscape3();

    // wenn Styles exportiert werden, wird ein Style einem HTML-Tag manchmal
    // vorgezogen, wenn nicht fuer Netscape exportiert wird
    // bCfgPreferStyles = bCfgOutStyles; // && !pHtmlOptions->IsNetscape3();

    // Nur noch fuer den MS-IE ziehen wir den Export von Styles vor.
    bCfgPreferStyles = HTML_CFG_MSIE==nExportMode;

    bCfgStarBasic = pHtmlOptions->IsStarBasic();

    bCfgFormFeed = !IsHTMLMode(HTMLMODE_PRINT_EXT);
    bCfgCpyLinkedGrfs = pHtmlOptions->IsSaveGraphicsLocal();

    // die HTML-Vorlage holen
    sal_Bool bOldHTMLMode;
    sal_uInt16 nOldTxtFmtCollCnt, nOldCharFmtCnt;

    ASSERT( !pTemplate, "Wo kommt denn die HTML-Vorlage hier her?" );
    pTemplate = ((HTMLReader*)ReadHTML)->GetTemplateDoc();
    if( pTemplate )
    {
        pTemplate->AddLink();
        bOldHTMLMode = pTemplate->IsHTMLMode();
        pTemplate->SetHTMLMode( sal_True );

        nOldTxtFmtCollCnt = pTemplate->GetTxtFmtColls()->Count();
        nOldCharFmtCnt = pTemplate->GetCharFmts()->Count();
    }

    if( bShowProgress )
        ::StartProgress( STR_STATSTR_W4WWRITE, 0, pDoc->GetNodes().Count(),
                         pDoc->GetDocShell());

    pFlyFrmFmt = 0;     // kein FlyFrmFormat gesetzt
    pDfltColor = 0;
    pFootEndNotes = 0;
    pFmtFtn = 0;
    bOutTable = bOutHeader = bOutFooter = sal_False;
    pxFormComps = 0;
    nFormCntrlCnt = 0;
    bPreserveForm = sal_False;
    bClearLeft = bClearRight = sal_False;
    bLFPossible = sal_False;

    nLeftMargin = nDfltLeftMargin = nDfltRightMargin = 0;
    nDfltTopMargin = nDfltBottomMargin = 0;
    nFirstLineIndent = nDfltFirstLineIndent = 0;
    bPoolCollTextModified = sal_False;
    bFirstCSS1Property = bFirstCSS1Rule = sal_False;
    bCSS1IgnoreFirstPageDesc = sal_False;
    nIndentLvl = 0;
    nWhishLineLen = 70;
    nLastLFPos = 0;
    nDefListLvl = 0;
    nDefListMargin = ((pTemplate && !bCfgOutStyles) ? pTemplate : pDoc)
        ->GetTxtCollFromPool( RES_POOLCOLL_HTML_DD )
        ->GetLRSpace().GetTxtLeft();
    nHeaderFooterSpace = 0;
    nTxtAttrsToIgnore = 0;
    nCSS1OutMode = 0;
    nFootNote = nEndNote = 0;

    nWarn = 0;
    GetNumInfo().Clear();
    pNextNumRuleInfo = 0;

    // Content-Id setzen
    aCId.Erase();
    SwDocShell *pDocSh = pDoc->GetDocShell();
    if( pDocSh )
    {
        const SfxPoolItem *pItem = pDocSh->GetItem( SID_ORIGURL );
        if( pItem )
        {
            aCId = ((const SfxStringItem *)pItem)->GetValue();
            ASSERT( aCId.Len(), "CID ohne Laenge!" );
            nWhishLineLen = 72;
        }
    }

    ByteString aStartTags;

    // Tabellen und Bereiche am Doc.-Anfang beachten
    {
        SwTableNode * pTNd = pCurPam->GetNode()->FindTableNode();
        if( pTNd && bWriteAll )
        {
            // mit dem Tabellen-Node anfangen !!
            pCurPam->GetPoint()->nNode = *pTNd;

            if( bWriteOnlyFirstTable )
                pCurPam->GetMark()->nNode = *pTNd->EndOfSectionNode();
        }

        // erster Node (der einen Seitenumbruch enthalten darf)
        pStartNdIdx = new SwNodeIndex( pCurPam->GetPoint()->nNode );

        SwSectionNode * pSNd = pCurPam->GetNode()->FindSectionNode();
        while( pSNd )
        {
            if( bWriteAll )
            {
                // mit dem Section-Node anfangen !!
                pCurPam->GetPoint()->nNode = *pSNd;
            }
            else
            {
                ASSERT( FILE_LINK_SECTION != pSNd->GetSection().GetType(),
                        "Export gelinkter Bereiche am Dok-Anfang ist nicht implemntiert" );

                // nur das Tag fuer die Section merken
                ByteString aName;
                HTMLOutFuncs::ConvertStringToHTML( pSNd->GetSection().GetName(),
                                                   aName, eDestEnc );

                ByteString sOut( '<' );
                (((((((sOut += sHTML_division)
                    += ' ') += sHTML_O_id) += "=\"")
                    += aName) += '\"')
                    += '>') += aStartTags;

                aStartTags = sOut;
            }
            // FindSectionNode() an einem SectionNode liefert den selben!
            pSNd = pSNd->FindStartNode()->FindSectionNode();
        }
    }


    // Tabelle fuer die freifliegenden Rahmen erzeugen, aber nur wenn
    // das gesamte Dokument geschrieben wird
    pHTMLPosFlyFrms = 0;
    CollectFlyFrms();
    nLastParaToken = 0;
    GetControls();
    CollectLinkTargets();

    sal_uInt16 nHeaderAttrs = 0;
    pCurrPageDesc = MakeHeader( nHeaderAttrs );

    bLFPossible = sal_True;

    // Formulare, die nur HiddenControls enthalten ausgeben.
    OutHiddenForms();

    if( aStartTags.Len() )
        Strm() << aStartTags.GetBuffer();

    const SfxPoolItem *pItem;
    const SfxItemSet& rPageItemSet = pCurrPageDesc->GetMaster().GetAttrSet();
    if( !bWriteClipboardDoc && pDoc->GetDocShell() &&
        ( pDoc->IsHeadInBrowse() ||
          (!pDoc->IsHTMLMode() && !pDoc->IsBrowseMode()) ) &&
        SFX_ITEM_SET == rPageItemSet.GetItemState( RES_HEADER, sal_True, &pItem) )
    {
        const SwFrmFmt *pHeaderFmt =
            ((const SwFmtHeader *)pItem)->GetHeaderFmt();
        if( pHeaderFmt )
            OutHTML_HeaderFooter( *this, *pHeaderFmt, sal_True );
    }

    nTxtAttrsToIgnore = nHeaderAttrs;
    Out_SwDoc( pOrigPam );
    nTxtAttrsToIgnore = 0;

    if( pxFormComps && pxFormComps->is() )
        OutForm( sal_False, *pxFormComps );

    if( pFootEndNotes )
        OutFootEndNotes();

    if( !bWriteClipboardDoc && pDoc->GetDocShell() &&
        ( pDoc->IsFootInBrowse() ||
          (!pDoc->IsHTMLMode() && !pDoc->IsBrowseMode()) ) &&
        SFX_ITEM_SET == rPageItemSet.GetItemState( RES_FOOTER, sal_True, &pItem) )
    {
        const SwFrmFmt *pFooterFmt =
            ((const SwFmtFooter *)pItem)->GetFooterFmt();
        if( pFooterFmt )
            OutHTML_HeaderFooter( *this, *pFooterFmt, sal_False );
    }

    if( bLFPossible )
        OutNewLine();
    HTMLOutFuncs::Out_AsciiTag( Strm(), sHTML_body, sal_False );
    OutNewLine();
    HTMLOutFuncs::Out_AsciiTag( Strm(), sHTML_html, sal_False );

    // loesche die Tabelle mit den freifliegenden Rahmen
    sal_uInt16 i;
    ASSERT( !pHTMLPosFlyFrms, "Wurden nicht alle Rahmen ausgegeben" );
    if( pHTMLPosFlyFrms )
    {
        pHTMLPosFlyFrms->DeleteAndDestroy( 0, pHTMLPosFlyFrms->Count() );
        delete pHTMLPosFlyFrms;
        pHTMLPosFlyFrms = 0;
    }

    if( aHTMLControls.Count() )
        aHTMLControls.DeleteAndDestroy( sal_uInt16(0), aHTMLControls.Count() );

    if( aChrFmtInfos.Count() )
        aChrFmtInfos.DeleteAndDestroy( sal_uInt16(0), aChrFmtInfos.Count() );

    if( aTxtCollInfos.Count() )
        aTxtCollInfos.DeleteAndDestroy( sal_uInt16(0), aTxtCollInfos.Count() );

    if( aImgMapNames.Count() )
        aImgMapNames.DeleteAndDestroy( sal_uInt16(0), aImgMapNames.Count() );

    if( aImplicitMarks.Count() )
        aImplicitMarks.DeleteAndDestroy( sal_uInt16(0), aImplicitMarks.Count() );

    if( aOutlineMarks.Count() )
        aOutlineMarks.DeleteAndDestroy( sal_uInt16(0), aOutlineMarks.Count() );

    if( aOutlineMarkPoss.Count() )
        aOutlineMarkPoss.Remove( sal_uInt16(0), aOutlineMarkPoss.Count() );

    delete pDfltColor;
    pDfltColor = 0;

    delete pStartNdIdx;
    pStartNdIdx = 0;

    delete pxFormComps;
    pxFormComps = 0;

    ASSERT( !pFootEndNotes,
            "SwHTMLWriter::Write: Ftns nicht durch OutFootEndNotes geloescht" );

    pCurrPageDesc = 0;

    ClearNextNumInfo();

    for( i=0; i<MAXLEVEL; i++ )
        aBulletGrfs[i].Erase();

    if( bShowProgress )
        ::EndProgress( pDoc->GetDocShell() );

    if( pTemplate )
    {
        // Waehrend des Exports angelegte Zeichen- und Abastzvorlagen
        // loeschen
        sal_uInt16 nTxtFmtCollCnt = pTemplate->GetTxtFmtColls()->Count();
        while( nTxtFmtCollCnt > nOldTxtFmtCollCnt )
            pTemplate->DelTxtFmtColl( --nTxtFmtCollCnt );
        ASSERT( pTemplate->GetTxtFmtColls()->Count() == nOldTxtFmtCollCnt,
                "falsche Anzahl TxtFmtColls geloescht" );

        sal_uInt16 nCharFmtCnt = pTemplate->GetCharFmts()->Count();
        while( nCharFmtCnt > nOldCharFmtCnt )
            pTemplate->DelCharFmt( --nCharFmtCnt );
        ASSERT( pTemplate->GetCharFmts()->Count() == nOldCharFmtCnt,
                "falsche Anzahl CharFmts geloescht" );

        // HTML-Modus wieder restaurieren
        pTemplate->SetHTMLMode( bOldHTMLMode );

        if( 0 == pTemplate->RemoveLink() )
            delete pTemplate;

        pTemplate = 0;
    }

    return nWarn;
}

const SwFmtCol *lcl_html_GetFmtCol( const SwHTMLWriter& rHTMLWrt,
                                       const SwSection& rSection,
                                       const SwSectionFmt& rFmt )
{
    const SwFmtCol *pCol = 0;

    const SfxPoolItem* pItem;
    if( rHTMLWrt.IsHTMLMode( HTMLMODE_FRM_COLUMNS ) &&
        FILE_LINK_SECTION != rSection.GetType() &&
        SFX_ITEM_SET == rFmt.GetAttrSet().GetItemState(RES_COL,sal_False,&pItem) &&
        ((const SwFmtCol *)pItem)->GetNumCols() > 1 )
    {
        pCol = (const SwFmtCol *)pItem;
    }

    return pCol;
}

sal_Bool lcl_html_IsMultiColStart( const SwHTMLWriter& rHTMLWrt, sal_uInt32 nIndex )
{
    sal_Bool bRet = sal_False;
    const SwSectionNode *pSectNd =
        rHTMLWrt.pDoc->GetNodes()[nIndex]->GetSectionNode();
    if( pSectNd )
    {
        const SwSection& rSection = pSectNd->GetSection();
        const SwSectionFmt *pFmt = rSection.GetFmt();
        if( pFmt && lcl_html_GetFmtCol( rHTMLWrt, rSection, *pFmt ) )
            bRet = sal_True;
    }

    return bRet;
}

sal_Bool lcl_html_IsMultiColEnd( const SwHTMLWriter& rHTMLWrt, sal_uInt32 nIndex )
{
    sal_Bool bRet = sal_False;
    const SwEndNode *pEndNd = rHTMLWrt.pDoc->GetNodes()[nIndex]->GetEndNode();
    if( pEndNd )
        bRet = lcl_html_IsMultiColStart( rHTMLWrt,
                                         pEndNd->StartOfSectionIndex() );

    return bRet;
}


void lcl_html_OutSectionStartTag( SwHTMLWriter& rHTMLWrt,
                                     const SwSection& rSection,
                                     const SwSectionFmt& rFmt,
                                  const SwFmtCol *pCol,
                                  sal_Bool bContinued=sal_False )
{
    ASSERT( pCol || !bContinued, "Continuation of DIV" );

    if( rHTMLWrt.bLFPossible )
        rHTMLWrt.OutNewLine();

    const sal_Char *pTag = pCol ? sHTML_multicol : sHTML_division;

    ByteString sOut( '<' );
    sOut += pTag;

    const String& rName = rSection.GetName();
    if( rName.Len() && !bContinued )
    {
        ((sOut += ' ') += sHTML_O_id) += "=\"";
        rHTMLWrt.Strm() << sOut.GetBuffer();
        HTMLOutFuncs::Out_String( rHTMLWrt.Strm(), rName, rHTMLWrt.eDestEnc );
        sOut = '\"';
    }

    if( FILE_LINK_SECTION == rSection.GetType() )
    {
        ((sOut += ' ') += sHTML_O_href) += "=\"";
        rHTMLWrt.Strm() << sOut.GetBuffer();

        const String& aFName = rSection.GetLinkFileName();
        String aURL( aFName.GetToken(0,cTokenSeperator) );
        String aFilter( aFName.GetToken(1,cTokenSeperator) );
        String aSection( aFName.GetToken(2,cTokenSeperator) );

        HTMLOutFuncs::Out_String( rHTMLWrt.Strm(),
                                  INetURLObject::AbsToRel(aURL,
                                          INetURLObject::WAS_ENCODED,
                                        INetURLObject::DECODE_WITH_CHARSET),
                                  rHTMLWrt.eDestEnc );
        const sal_Char *pDelim = "&#255;";
        if( aFilter.Len() )
        {
            rHTMLWrt.Strm() << pDelim;
            HTMLOutFuncs::Out_String( rHTMLWrt.Strm(), aFilter,
                                      rHTMLWrt.eDestEnc );
        }
        if( aSection.Len() )
        {
            if( !aFilter.Len() )
                rHTMLWrt.Strm() << pDelim;
            rHTMLWrt.Strm() << pDelim;
            HTMLOutFuncs::Out_String( rHTMLWrt.Strm(), aSection,
                                      rHTMLWrt.eDestEnc );
        }
        sOut = '\"';
    }
    else if( pCol )
    {
        (((sOut += ' ') += sHTML_O_cols) += '=')
            += ByteString::CreateFromInt32( pCol->GetNumCols() );

        // minumum gutter width
        sal_uInt16 nGutter = pCol->GetGutterWidth( sal_True );
        if( nGutter!=USHRT_MAX )
        {
            if( nGutter && Application::GetDefaultDevice() )
            {
                nGutter = (sal_uInt16)Application::GetDefaultDevice()
                                ->LogicToPixel( Size(nGutter,0),
                                                MapMode(MAP_TWIP) ).Width();
            }
            (((sOut += ' ') += sHTML_O_gutter) += '=')
                += ByteString::CreateFromInt32( nGutter );
        }
    }

    rHTMLWrt.Strm() << sOut.GetBuffer();
    if( rHTMLWrt.IsHTMLMode( rHTMLWrt.bCfgOutStyles ) )
        rHTMLWrt.OutCSS1_SectionFmtOptions( rFmt );

    rHTMLWrt.Strm() << '>';

    rHTMLWrt.bLFPossible = sal_True;
    if( rName.Len() && !bContinued )
        rHTMLWrt.OutImplicitMark( rName, pMarkToRegion );

    rHTMLWrt.IncIndentLevel();
}

void lcl_html_OutSectionEndTag( SwHTMLWriter& rHTMLWrt,
                                const SwFmtCol *pCol )
{
    const sal_Char *pTag = pCol ? sHTML_multicol : sHTML_division;

    rHTMLWrt.DecIndentLevel();
    if( rHTMLWrt.bLFPossible )
        rHTMLWrt.OutNewLine();
    HTMLOutFuncs::Out_AsciiTag( rHTMLWrt.Strm(), pTag, sal_False );
    rHTMLWrt.bLFPossible = sal_True;
}

static Writer& OutHTML_Section( Writer& rWrt, const SwSectionNode& rSectNd )
{
    SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;

    // End <PRE> and any <DL>, because a definition list's level may
    // change inside the section.
    rHTMLWrt.ChangeParaToken( 0 );
    rHTMLWrt.OutAndSetDefList( 0 );

    const SwSection& rSection = rSectNd.GetSection();
    const SwSectionFmt *pFmt = rSection.GetFmt();
    ASSERT( pFmt, "Section without a format?" );

    sal_Bool bStartTag = sal_True;
    sal_Bool bEndTag = sal_True;
    const SwSectionFmt *pSurrFmt = 0;
    const SwSectionNode *pSurrSectNd = 0;
    const SwSection *pSurrSection = 0;
    const SwFmtCol *pSurrCol = 0;

    sal_uInt32 nSectSttIdx = rSectNd.GetIndex();
    sal_uInt32 nSectEndIdx = rSectNd.EndOfSectionIndex();
    const SwFmtCol *pCol = lcl_html_GetFmtCol( rHTMLWrt, rSection, *pFmt );
    if( pCol )
    {
        // If the next node is a columned section node, too, don't export
        // an empty section.
        if( lcl_html_IsMultiColStart( rHTMLWrt, nSectSttIdx+1 ) )
            bStartTag = sal_False;

        // The same applies if the section end with another columned section.
        if( lcl_html_IsMultiColEnd( rHTMLWrt, nSectEndIdx-1 ) )
            bEndTag = sal_False;

        //.is there a columned section arround this one?
        const SwStartNode *pSttNd = rSectNd.FindStartNode();
        if( pSttNd )
        {
            pSurrSectNd = pSttNd->FindSectionNode();
            if( pSurrSectNd )
            {
                const SwStartNode *pBoxSttNd = pSttNd->FindTableBoxStartNode();
                if( !pBoxSttNd ||
                    pBoxSttNd->GetIndex() < pSurrSectNd->GetIndex() )
                {
                    pSurrSection = &pSurrSectNd->GetSection();
                    pSurrFmt = pSurrSection->GetFmt();
                    if( pSurrFmt )
                        pSurrCol = lcl_html_GetFmtCol( rHTMLWrt, *pSurrSection,
                                                       *pSurrFmt );
                }
            }
        }
    }

    // The surrounding section must be closed before the current one is
    // opended, except that it start immediatly before the current one or
    // another end immediately before the current one
    if( pSurrCol && nSectSttIdx - pSurrSectNd->GetIndex() > 1 &&
        !lcl_html_IsMultiColEnd( rHTMLWrt, nSectSttIdx-1 ) )
        lcl_html_OutSectionEndTag( rHTMLWrt, pSurrCol );

    if( bStartTag )
        lcl_html_OutSectionStartTag( rHTMLWrt, rSection, *pFmt, pCol );

    {
        HTMLSaveData aSaveData( rHTMLWrt,
            rHTMLWrt.pCurPam->GetPoint()->nNode.GetIndex()+1,
            rSectNd.EndOfSectionIndex(),
            rHTMLWrt.GetFlyFrmFmt(),
            sal_False );
        rHTMLWrt.Out_SwDoc( rHTMLWrt.pCurPam );
    }

    rHTMLWrt.pCurPam->GetPoint()->nNode = *rSectNd.EndOfSectionNode();

    if( bEndTag )
        lcl_html_OutSectionEndTag( rHTMLWrt, pCol );

    // The surrounding section must be started again, except that it ends
    // immeditaly behind the current one.
    if( pSurrCol &&
        pSurrSectNd->EndOfSectionIndex() - nSectEndIdx > 1 &&
        !lcl_html_IsMultiColStart( rHTMLWrt, nSectEndIdx+1 ) )
        lcl_html_OutSectionStartTag( rHTMLWrt, *pSurrSection, *pSurrFmt,
                                     pSurrCol, sal_True );

    return rWrt;
}

void SwHTMLWriter::Out_SwDoc( SwPaM* pPam )
{
    sal_Bool bSaveWriteAll = bWriteAll;     // sichern


    // suche die naechste ::com::sun::star::text::Bookmark-Position aus der ::com::sun::star::text::Bookmark-Tabelle
    nBkmkTabPos = bWriteAll ? FindPos_Bkmk( *pCurPam->GetPoint() ) : USHRT_MAX;

    // gebe alle Bereiche des Pams in das HTML-File aus.
    do {
        bWriteAll = bSaveWriteAll;
        bFirstLine = sal_True;

        // suche den ersten am Pam-auszugebenen FlyFrame
        // fehlt noch:

        while( pCurPam->GetPoint()->nNode.GetIndex() < pCurPam->GetMark()->nNode.GetIndex() ||
              (pCurPam->GetPoint()->nNode.GetIndex() == pCurPam->GetMark()->nNode.GetIndex() &&
               pCurPam->GetPoint()->nContent.GetIndex() <= pCurPam->GetMark()->nContent.GetIndex()) )
        {
            SwNode * pNd = pCurPam->GetNode();

            ASSERT( !(pNd->IsGrfNode() || pNd->IsOLENode()),
                    "Grf- oder OLE-Node hier unerwartet" );
            if( pNd->IsTxtNode() )
            {
                SwTxtNode* pTxtNd = pNd->GetTxtNode();

                if( !bFirstLine )
                    pCurPam->GetPoint()->nContent.Assign( pTxtNd, 0 );

                OutHTML_SwTxtNode( *this, *pTxtNd );
            }
            else if( pNd->IsTableNode() )
            {
                OutHTML_SwTblNode( *this, *pNd->GetTableNode(), 0 );
            }
            else if( pNd->IsSectionNode() )
            {
                OutHTML_Section( *this, *pNd->GetSectionNode() );
            }
            else if( pNd == &pDoc->GetNodes().GetEndOfContent() )
                break;

            pCurPam->GetPoint()->nNode++;   // Bewegen
            sal_uInt32 nPos = pCurPam->GetPoint()->nNode.GetIndex();

            if( bShowProgress )
                ::SetProgressState( nPos, pDoc->GetDocShell() );   // Wie weit ?

            /* sollen nur die Selectierten Bereiche gesichert werden, so
             * duerfen nur die vollstaendigen Nodes gespeichert werde,
             * d.H. der 1. und n. Node teilweise, der 2. bis n-1. Node
             * vollstaendig. (vollstaendig heisst mit allen Formaten! )
             */
            bWriteAll = bSaveWriteAll ||
                        nPos != pCurPam->GetMark()->nNode.GetIndex();
            bFirstLine = sal_False;
            bOutFooter = sal_False; // Nach einem Node keine Fusszeile mehr
        }

        ChangeParaToken( 0 ); // MIB 8.7.97: Machen wir jetzt hier und nicht
                              // beim Aufrufer
        OutAndSetDefList( 0 );

    } while( CopyNextPam( &pPam ) );        // bis alle PaM's bearbeitet

    bWriteAll = bSaveWriteAll;          // wieder auf alten Wert zurueck
}


// schreibe die StyleTabelle, algemeine Angaben,Header/Footer/Footnotes
static void OutBodyColor( const sal_Char *pTag, const SwFmt *pFmt,
                          SwHTMLWriter& rHWrt )
{
    const SwFmt *pRefFmt = 0;

    if( rHWrt.pTemplate )
        pRefFmt = SwHTMLWriter::GetTemplateFmt( pFmt->GetPoolFmtId(),
                                                rHWrt.pTemplate );

    const SvxColorItem *pColorItem = 0;

    const SfxItemSet& rItemSet = pFmt->GetAttrSet();
    const SfxPoolItem *pRefItem, *pItem;
    sal_Bool bItemSet = SFX_ITEM_SET == rItemSet.GetItemState( RES_CHRATR_COLOR,
                                                           sal_True, &pItem);
    sal_Bool bRefItemSet = pRefFmt &&
        SFX_ITEM_SET == pRefFmt->GetAttrSet().GetItemState( RES_CHRATR_COLOR,
                                                            sal_True, &pRefItem);
    if( bItemSet )
    {
        // wenn das Item nur in der Vorlage des aktuellen Doks gesetzt
        // ist oder einen anderen Wert hat, als in der HTML-Vorlage,
        // wird es gesetzt
        const SvxColorItem *pCItem = (const SvxColorItem*)pItem;
        if( !bRefItemSet ||
            !pCItem->GetValue().IsRGBEqual(
                            ((const SvxColorItem*)pRefItem)->GetValue() ) )
            pColorItem = pCItem;
    }
    else if( bRefItemSet )
    {
        // Das Item war in der HTML-Vorlage noch gesetzt, also geben wir
        // das Default aus
        pColorItem = (const SvxColorItem*)&rItemSet.GetPool()
                                        ->GetDefaultItem( RES_CHRATR_COLOR );
    }

    if( pColorItem )
    {
        ByteString sOut( ' ' );
        (sOut += pTag) += '=';
        rHWrt.Strm() << sOut.GetBuffer();
        HTMLOutFuncs::Out_Color( rHWrt.Strm(), pColorItem->GetValue() );
        if( RES_POOLCOLL_STANDARD==pFmt->GetPoolFmtId() )
            rHWrt.pDfltColor = new Color( pColorItem->GetValue() );
    }
}

sal_uInt16 SwHTMLWriter::OutHeaderAttrs()
{
    sal_uInt32 nIdx = pCurPam->GetPoint()->nNode.GetIndex();
    sal_uInt32 nEndIdx = pCurPam->GetMark()->nNode.GetIndex();

    SwTxtNode *pTxtNd = 0;
    while( nIdx<=nEndIdx &&
            0==(pTxtNd=pDoc->GetNodes()[nIdx]->GetTxtNode()) )
        nIdx++;

    ASSERT( pTxtNd, "Kein Text-Node gefunden" );
    if( !pTxtNd || !pTxtNd->HasHints() )
        return 0;

    sal_uInt16 nAttrs = 0;
    sal_uInt16 nCntAttr = pTxtNd->GetSwpHints().Count();
    xub_StrLen nOldPos = 0;
    for( sal_uInt16 i=0; i<nCntAttr; i++ )
    {
        const SwTxtAttr *pHt = pTxtNd->GetSwpHints()[i];
        if( !pHt->GetEnd() )
        {
            xub_StrLen nPos = *pHt->GetStart();
            if( nPos-nOldPos > 1 || RES_TXTATR_FIELD != pHt->Which() )
                break;

            sal_uInt16 nFldWhich = ((const SwFmtFld&)pHt->GetAttr()).GetFld()
                                                     ->GetTyp()->Which();
            if( RES_POSTITFLD!=nFldWhich &&
                RES_SCRIPTFLD!=nFldWhich )
                break;

            OutNewLine();
            OutHTML_SwFmtFld( *this, pHt->GetAttr() );
            nOldPos = nPos;
            nAttrs++;
        }
    }

    return nAttrs;
}

const SwPageDesc *SwHTMLWriter::MakeHeader( sal_uInt16 &rHeaderAttrs )
{
    ByteString sOut( sHTML_doctype );
    (sOut += ' ') += sHTML_doctype32;
    HTMLOutFuncs::Out_AsciiTag( Strm(), sOut.GetBuffer() );

    // baue den Vorspann
    OutNewLine();
    HTMLOutFuncs::Out_AsciiTag( Strm(), sHTML_html );

    OutNewLine();
    HTMLOutFuncs::Out_AsciiTag( Strm(), sHTML_head );

    IncIndentLevel();   // Inhalt von <HEAD> einruecken

    // DokumentInfo
    ByteString sIndent;
    GetIndentString( sIndent );
//  OutNewLine();
    SfxFrameHTMLWriter::Out_DocInfo( Strm(), pDoc->GetpInfo(),
                                     sIndent.GetBuffer(), eDestEnc );

    // Kommentare und Meta-Tags des ersten Absatzes
    rHeaderAttrs = OutHeaderAttrs();

    OutFootEndNoteInfo();

    const SwPageDesc *pPageDesc = 0;
    //if( !pDoc->IsHTMLMode() )
    //{
        // In Nicht-HTML-Dokumenten wird die erste gesetzte Seitenvorlage
        // exportiert und wenn keine gesetzt ist die Standard-Vorlage
        sal_uInt32 nNodeIdx = pCurPam->GetPoint()->nNode.GetIndex();

        while( nNodeIdx < pDoc->GetNodes().Count() )
        {
            SwNode *pNd = pDoc->GetNodes()[ nNodeIdx ];
            if( pNd->IsCntntNode() )
            {
                pPageDesc = ((const SwFmtPageDesc &)pNd->GetCntntNode()
                    ->GetAttr(RES_PAGEDESC)).GetPageDesc();
                break;
            }
            else if( pNd->IsTableNode() )
            {
                pPageDesc = pNd->GetTableNode()->GetTable().GetFrmFmt()
                               ->GetPageDesc().GetPageDesc();
                break;
            }

            nNodeIdx++;
        }

        if( !pPageDesc )
            pPageDesc = &pDoc->GetPageDesc( 0 );
    //}
    //else
    //{
        // In HTML-Dokumenten nehmen wir immer die HTML-Vorlage
    //  pPageDesc = pDoc->GetPageDescFromPool( RES_POOLPAGE_HTML );
    //}

    // und nun ... das Style-Sheet!!!
    if( bCfgOutStyles )
    {
        OutStyleSheet( *pPageDesc );
    }

    // und nun ... das BASIC und JavaScript!
    if( pDoc->GetDocShell() )   // nur mit DocShell ist Basic moeglich
        OutBasic();

    DecIndentLevel();   // Inhalt von <HEAD> einruecken
    OutNewLine();
    HTMLOutFuncs::Out_AsciiTag( Strm(), sHTML_head, sal_False );

    // der Body wird nicht eingerueckt, weil sonst alles eingerueckt waere!
    OutNewLine();
    sOut = '<';
    sOut += sHTML_body;
    Strm() << sOut.GetBuffer();
    sOut.Erase();

    // Textfarbe ausgeben, wenn sie an der Standard-Vorlage gesetzt ist
    // und sich geaendert hat.
    OutBodyColor( sHTML_O_text,
                  pDoc->GetTxtCollFromPool( RES_POOLCOLL_STANDARD ),
                  *this );

    // Farben fuer (un)besuchte Links
    OutBodyColor( sHTML_O_link,
                  pDoc->GetCharFmtFromPool( RES_POOLCHR_INET_NORMAL ),
                  *this );
    OutBodyColor( sHTML_O_vlink,
                  pDoc->GetCharFmtFromPool( RES_POOLCHR_INET_VISIT ),
                  *this );

    const SfxItemSet& rItemSet = pPageDesc->GetMaster().GetAttrSet();

    String aEmbGrfName;
    OutBackground( rItemSet, aEmbGrfName, sal_True );

    if( bCfgOutStyles )
        OutCSS1_BodyTagStyleOpt( *this, rItemSet, aEmbGrfName );

    // Events anhaengen
    if( pDoc->GetDocShell() )   // nur mit DocShell ist Basic moeglich
        OutBasicBodyEvents();

    Strm() << '>';

    return pPageDesc;
}

void SwHTMLWriter::OutAnchor( const String& rName )
{
    ByteString sOut( '<' );
    (((sOut += sHTML_anchor) += ' ') += sHTML_O_name) += "=\"";
    Strm() << sOut.GetBuffer();
    HTMLOutFuncs::Out_String( Strm(), rName, eDestEnc ) << "\">";
    HTMLOutFuncs::Out_AsciiTag( Strm(), sHTML_anchor, sal_False );
}

void SwHTMLWriter::OutBookmarks()
{
    // hole das aktuelle Bookmark
    const SwBookmark* pBookmark = USHRT_MAX != nBkmkTabPos ?
                            pDoc->GetBookmarks()[ nBkmkTabPos ] : 0;
    // Ausgabe aller Bookmarks in diesem Absatz. Die Content-Position
    // wird vorerst nicht beruecksichtigt!
    sal_uInt32 nNode = pCurPam->GetPoint()->nNode.GetIndex();
    while( USHRT_MAX != nBkmkTabPos &&
        pBookmark->GetPos().nNode.GetIndex() == nNode )
    {
        // Der Bereich derBookmark wird erstam ignoriert, da er von uns
        // auch nicht eingelesen wird.

        // erst die SWG spezifischen Daten:
        if( pBookmark->IsBookMark() && pBookmark->GetName().Len() )
            OutAnchor( pBookmark->GetName() );

        if( ++nBkmkTabPos >= pDoc->GetBookmarks().Count() )
            nBkmkTabPos = USHRT_MAX;
        else
            pBookmark = pDoc->GetBookmarks()[ nBkmkTabPos ];
    }

    sal_uInt16 nPos;
    for( nPos = 0; nPos < aOutlineMarkPoss.Count() &&
                   aOutlineMarkPoss[nPos] < nNode; nPos++ )
        ;

    while( nPos < aOutlineMarkPoss.Count() && aOutlineMarkPoss[nPos] == nNode )
    {
        OutAnchor( *aOutlineMarks[nPos] );
        aOutlineMarkPoss.Remove( nPos, 1 );
        aOutlineMarks.DeleteAndDestroy( nPos, 1 );
    }
}

void SwHTMLWriter::OutImplicitMark( const String& rMark,
                                    const sal_Char *pMarkType )
{
    if( rMark.Len() && aImplicitMarks.Count() )
    {
        String sMark( rMark );
        sMark.Append( cMarkSeperator );
        sMark.AppendAscii( pMarkType );
        sal_uInt16 nPos;
        if( aImplicitMarks.Seek_Entry( &sMark, &nPos ) )
        {
            OutAnchor( sMark );
            aImplicitMarks.DeleteAndDestroy( nPos, 1 );
        }
    }
}

void SwHTMLWriter::OutBackground( const SvxBrushItem *pBrushItem,
                                  String& rEmbGrfNm, sal_Bool bGraphic )
{
    const Color &rBackColor = pBrushItem->GetColor();
    if( !rBackColor.GetTransparency() )
    {
        ByteString sOut( ' ' );
        (sOut += sHTML_O_bgcolor) += '=';
        Strm() << sOut.GetBuffer();
        HTMLOutFuncs::Out_Color( Strm(), rBackColor );
    }

    if( !bGraphic )
        return;

    const String *pLink = pBrushItem->GetGraphicLink();

    // embeddete Grafik -> WriteEmbedded schreiben
    if( !pLink )
    {
        const Graphic* pGrf = pBrushItem->GetGraphic();
        if( pGrf )
        {
            // Grafik als (JPG-)File speichern
            const String* pTempFileName = GetOrigFileName();
            if(pTempFileName)
                rEmbGrfNm = *pTempFileName;
            sal_uInt16 nErr = XOutBitmap::WriteGraphic( *pGrf, rEmbGrfNm,
                    String::CreateFromAscii( "JPG" ) );
            if( !nErr )     // fehlerhaft, da ist nichts auszugeben
            {
                rEmbGrfNm = URIHelper::SmartRelToAbs( rEmbGrfNm );
                if( HasCId() )
                    MakeCIdURL( rEmbGrfNm );
                pLink = &rEmbGrfNm;
            }
            else
            {
                nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE;
            }
        }
    }
    else
    {
        rEmbGrfNm = *pLink;
        if( HasCId() || bCfgCpyLinkedGrfs )
        {
            CopyLocalFileToINet( rEmbGrfNm, HasCId() );
            if( HasCId() )
                MakeCIdURL( rEmbGrfNm );
            pLink = &rEmbGrfNm;
        }
    }

    if( pLink )
    {
        ByteString sOut( ' ' );
        String s( INetURLObject::AbsToRel( *pLink,
                                        INetURLObject::WAS_ENCODED,
                                        INetURLObject::DECODE_WITH_CHARSET ));
        (sOut += sHTML_O_background) += "=\"";
        Strm() << sOut.GetBuffer();
        HTMLOutFuncs::Out_String( Strm(), s, eDestEnc ) << '\"';
    }
}

void SwHTMLWriter::OutBackground( const SfxItemSet& rItemSet,
                                  String& rEmbGrfNm, sal_Bool bGraphic )
{
    const SfxPoolItem* pItem;
    if( SFX_ITEM_SET == rItemSet.GetItemState( RES_BACKGROUND, sal_False,
                                               &pItem ))
    {
        OutBackground( ((const SvxBrushItem*)pItem), rEmbGrfNm, bGraphic );
    }
}

void SwHTMLWriter::GetIndentString( ByteString& rStr, sal_uInt16 nIncLvl )
{
    // etwas umstaendlich, aber wir haben nur einen Indent-String!
    sal_uInt16 nLevel = nIndentLvl + nIncLvl;

    if( nLevel && nLevel <= MAX_INDENT_LEVEL)
    {
        sIndentTabs[nLevel] = 0;
        rStr = sIndentTabs;
        sIndentTabs[nLevel] = '\t';
    }
}

void SwHTMLWriter::OutNewLine( sal_Bool bCheck )
{
    if( !bCheck || (Strm().Tell()-nLastLFPos) > nIndentLvl )
    {
        Strm() << sNewLine;
        nLastLFPos = Strm().Tell();
    }

    if( nIndentLvl && nIndentLvl <= MAX_INDENT_LEVEL)
    {
        sIndentTabs[nIndentLvl] = 0;
        Strm() << sIndentTabs;
        sIndentTabs[nIndentLvl] = '\t';
    }
}

sal_uInt16 SwHTMLWriter::GetHTMLFontSize( sal_uInt32 nHeight ) const
{
    sal_uInt16 nSize = 1;
    for( sal_uInt16 i=6; i>0; i-- )
    {
        if( nHeight > (aFontHeights[i] + aFontHeights[i-1])/2 )
        {
            nSize = i+1;
            break;
        }
    }

    return nSize;
}


void SwHTMLWriter::MakeCIdURL( String& rURL )
{
    if( !aCId.Len() )
        return;

    INetURLObject aURLObj( rURL );
    if( INET_PROT_FILE!=aURLObj.GetProtocol() )
        return;

    String aLastName( aURLObj.GetLastName() );
    ASSERT( aLastName.Len(), "Dateiname ohne Laenge!" );
    // TODO: unicode?
    aLastName.ToLowerAscii();

    rURL.AssignAscii( "cid:" );
    ((rURL += aLastName) += '.') += aCId;
}


// Struktur speichert die aktuellen Daten des Writers zwischen, um
// einen anderen Dokument-Teil auszugeben, wie z.B. Header/Footer
HTMLSaveData::HTMLSaveData( SwHTMLWriter& rWriter, sal_uInt32 nStt, sal_uInt32 nEnd,
                            const SwFlyFrmFmt *pFly, sal_Bool bSaveNum )
    : rWrt( rWriter ),
    pOldPam( rWrt.pCurPam ), pOldEnd( rWrt.GetEndPaM() ),
    pOldFlyFmt( rWrt.GetFlyFrmFmt() ), pOldNumRuleInfo( 0 ),
    pOldNextNumRuleInfo( 0 ),
    nOldDefListLvl( rWrt.nDefListLvl ),
    bOldOutHeader( rWrt.bOutHeader ), bOldOutFooter( rWrt.bOutFooter )
{
    bOldWriteAll = rWrt.bWriteAll;

    rWrt.pCurPam = rWrt.NewSwPaM( *rWrt.pDoc, nStt, nEnd );

    // Tabelle in Sonderbereichen erkennen
    if( nStt != rWrt.pCurPam->GetMark()->nNode.GetIndex() )
    {
        const SwNode *pNd = rWrt.pDoc->GetNodes()[ nStt ];
        if( pNd->IsTableNode() || pNd->IsSectionNode() )
            rWrt.pCurPam->GetMark()->nNode = nStt;
    }

    rWrt.SetEndPaM( rWrt.pCurPam );
    rWrt.pCurPam->Exchange( );
    rWrt.bWriteAll = sal_True;
    rWrt.nDefListLvl = 0;
    rWrt.bOutHeader = rWrt.bOutFooter = sal_False;

    // Ggf. die aktuelle Numerierungs-Info merken, damit sie wieder
    // neu aufgenommen werden kann. Nur dann belibt auch die Numerierungs-
    // Info des nachsten Absatz gueltig.
    if( bSaveNum )
    {
        pOldNumRuleInfo = new SwHTMLNumRuleInfo( rWrt.GetNumInfo() );
        pOldNextNumRuleInfo = rWrt.GetNextNumInfo();
        rWrt.SetNextNumInfo( 0 );
    }
    else
    {
        rWrt.ClearNextNumInfo();
    }

    // Die Numerierung wird in jedem Fall unterbrochen.
    rWrt.GetNumInfo().Clear();
    rWrt.SetFlyFrmFmt( pFly );
}


HTMLSaveData::~HTMLSaveData()
{
    delete rWrt.pCurPam;                    // Pam wieder loeschen

    rWrt.pCurPam = pOldPam;
    rWrt.SetEndPaM( pOldEnd );
    rWrt.bWriteAll = bOldWriteAll;
    rWrt.nLastParaToken = 0;
    rWrt.nDefListLvl = nOldDefListLvl;
    rWrt.bOutHeader = bOldOutHeader;
    rWrt.bOutFooter = bOldOutFooter;

    // Ggf. die Numerierung von vor der Section fortsetzen. Die Numerierung
    // des naecshten Absatz wird in jedem Fall ungueltig.
    if( pOldNumRuleInfo )
    {
        rWrt.GetNumInfo().Set( *pOldNumRuleInfo );
        delete pOldNumRuleInfo;
        rWrt.SetNextNumInfo( pOldNextNumRuleInfo );
    }
    else
    {
        rWrt.GetNumInfo().Clear();
        rWrt.ClearNextNumInfo();
    }
    rWrt.SetFlyFrmFmt( pOldFlyFmt );
}


void GetHTMLWriter( const String&, WriterRef& xRet )
{
    xRet = new SwHTMLWriter;
}


/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/html/wrthtml.cxx,v 1.1.1.1 2000-09-18 17:14:56 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.163  2000/09/18 16:04:48  willem.vandorp
      OpenOffice header added.

      Revision 1.162  2000/08/18 13:03:26  jp
      don't export escaped URLs

      Revision 1.161  2000/08/16 15:51:33  jp
      OutSectionStartTag: write correct HTML

      Revision 1.160  2000/06/26 12:55:06  os
      INetURLObject::SmartRelToAbs removed

      Revision 1.159  2000/06/26 09:52:46  jp
      must change: GetAppWindow->GetDefaultDevice

      Revision 1.158  2000/05/15 10:06:57  os
      Chg: GetOrigFileName()

      Revision 1.157  2000/04/10 12:20:58  mib
      unicode

      Revision 1.156  2000/03/21 15:06:18  os
      UNOIII

      Revision 1.155  2000/03/03 16:29:44  pl
      #73771# workaround for c50 intel compiler

      Revision 1.154  2000/03/03 15:21:01  os
      StarView remainders removed

      Revision 1.153  2000/02/11 14:37:47  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.152  1999/11/22 08:31:09  mib
      #67578#: wrong assert

*************************************************************************/

diff --git a/sw/source/filter/html/wrthtml.hxx b/sw/source/filter/html/wrthtml.hxx
new file mode 100644
index 0000000..71407a1
--- /dev/null
+++ b/sw/source/filter/html/wrthtml.hxx
@@ -0,0 +1,614 @@
/*************************************************************************
 *
 *  $RCSfile: wrthtml.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:56 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _WRTHTML_HXX
#define _WRTHTML_HXX


#ifndef _COM_SUN_STAR_CONTAINER_XINDEXCONTAINER_HPP_
#include <com/sun/star/container/XIndexContainer.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_XFORM_HPP_
#include <com/sun/star/form/XForm.hpp>
#endif
#ifndef _SV_FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif
#define _SVSTDARR_STRINGSDTOR
#define _SVSTDARR_STRINGSSORTDTOR
#define _SVSTDARR_ULONGS
#include <svtools/svstdarr.hxx>

#ifndef _STREAM_HXX //autogen
#include <tools/stream.hxx>
#endif

#include "shellio.hxx"
#include "wrt_fn.hxx"

// einige Forward Deklarationen
class Color;
class SwFrmFmt;
class SwFlyFrmFmt;
class SwDrawFrmFmt;
class SwFmtINetFmt;
class SwFmtVertOrient;
class SwFmtFtn;
class SwStartNode;
class SwTableNode;
class SwNoTxtNode;
class SwPageDesc;
class SwNodeIndex;
class ImageMap;
class SwNumRule;
class SdrObject;
class SvxBrushItem;
class SvxFontItem;
class SwHTMLNumRuleInfo;
class SwHTMLPosFlyFrms;
class SwHTMLTxtFtns;

extern SwAttrFnTab aHTMLAttrFnTab;

//#define HTML_PARSPACE ((MM50 * 7) / 10)
#define HTML_PARSPACE (MM50)

// Flags fuer die Ausgabe von Rahmen aller Art
// BORDER geht nur bei OutHTML_Image
// ANYSIZE gibt an, ob auch VAR_SIZE und MIN_SIZE angaben exportiert werden
// ABSSIZE gibt an, ob Abstand und Umrandung ignoriert werden sollen
const sal_uInt32 HTML_FRMOPT_ALIGN      = 1<<0;
const sal_uInt32 HTML_FRMOPT_S_ALIGN    = 1<<1;

const sal_uInt32 HTML_FRMOPT_WIDTH      = 1<<2;
const sal_uInt32 HTML_FRMOPT_HEIGHT         = 1<<3;
const sal_uInt32 HTML_FRMOPT_SIZE       = HTML_FRMOPT_WIDTH|HTML_FRMOPT_HEIGHT;
const sal_uInt32 HTML_FRMOPT_S_WIDTH    = 1<<4;
const sal_uInt32 HTML_FRMOPT_S_HEIGHT   = 1<<5;
const sal_uInt32 HTML_FRMOPT_S_SIZE     = HTML_FRMOPT_S_WIDTH|HTML_FRMOPT_S_HEIGHT;
const sal_uInt32 HTML_FRMOPT_ANYSIZE    = 1<<6;
const sal_uInt32 HTML_FRMOPT_ABSSIZE    = 1<<7;
const sal_uInt32 HTML_FRMOPT_MARGINSIZE     = 1<<8;

const sal_uInt32 HTML_FRMOPT_SPACE      = 1<<9;
const sal_uInt32 HTML_FRMOPT_S_SPACE    = 1<<10;

const sal_uInt32 HTML_FRMOPT_BORDER     = 1<<11;
const sal_uInt32 HTML_FRMOPT_S_BORDER   = 1<<12;
const sal_uInt32 HTML_FRMOPT_S_NOBORDER     = 1<<13;

const sal_uInt32 HTML_FRMOPT_S_BACKGROUND = 1<<14;

const sal_uInt32 HTML_FRMOPT_NAME           = 1<<15;
const sal_uInt32 HTML_FRMOPT_ALT        = 1<<16;
const sal_uInt32 HTML_FRMOPT_BRCLEAR    = 1<<17;
const sal_uInt32 HTML_FRMOPT_S_PIXSIZE  = 1<<18;
const sal_uInt32 HTML_FRMOPT_ID             = 1<<19;


const sal_uInt32 HTML_FRMOPTS_GENIMG_ALL    =
    HTML_FRMOPT_ALT     |
    HTML_FRMOPT_SIZE    |
    HTML_FRMOPT_ABSSIZE |
    HTML_FRMOPT_NAME;
const sal_uInt32 HTML_FRMOPTS_GENIMG_CNTNR = HTML_FRMOPTS_GENIMG_ALL;
const sal_uInt32 HTML_FRMOPTS_GENIMG    =
    HTML_FRMOPTS_GENIMG_ALL |
    HTML_FRMOPT_ALIGN       |
    HTML_FRMOPT_SPACE       |
    HTML_FRMOPT_BRCLEAR;

#define HTMLMODE_BLOCK_SPACER       0x00010000
#define HTMLMODE_FLOAT_FRAME        0x00020000
#define HTMLMODE_VERT_SPACER        0x00040000
#define HTMLMODE_NBSP_IN_TABLES     0x00080000
#define HTMLMODE_LSPACE_IN_NUMBUL   0x00100000
#define HTMLMODE_NO_BR_AT_PAREND    0x00200000
#define HTMLMODE_PRINT_EXT          0x00400000
#define HTMLMODE_ABS_POS_FLY        0x00800000
#define HTMLMODE_ABS_POS_DRAW       0x01000000
#define HTMLMODE_FLY_MARGINS        0x02000000
#define HTMLMODE_BORDER_NONE        0x04000000
#define HTMLMODE_FONT_GENERIC       0x08000000
#define HTMLMODE_FRSTLINE_IN_NUMBUL 0x10000000
#define HTMLMODE_NO_CONTROL_CENTERING 0x20000000

#define HTML_DLCOLL_DD 0x4000
#define HTML_DLCOLL_DT 0x8000

#define CSS1_FMT_ISTAG (USHRT_MAX)
#define CSS1_FMT_CMPREF (USHRT_MAX-1)
#define CSS1_FMT_SPECIAL (USHRT_MAX-1)

// Die folgenden Flags bestimmen nur, welche Descriptoren, Tags, Optionen etc.
// ausgegeben werden ...
#define CSS1_OUTMODE_SPAN_NO_ON     0x0000
#define CSS1_OUTMODE_SPAN_TAG_ON    0x0001
#define CSS1_OUTMODE_STYLE_OPT_ON   0x0002
#define CSS1_OUTMODE_RULE_ON        0x0003
#define CSS1_OUTMODE_SPAN_TAG1_ON   0x0004
#define CSS1_OUTMODE_ANY_ON         0x0007

#define CSS1_OUTMODE_SPAN_NO_OFF    0x0000
#define CSS1_OUTMODE_SPAN_TAG_OFF   (0x0001 << 3)
#define CSS1_OUTMODE_STYLE_OPT_OFF  (0x0002 << 3)
#define CSS1_OUTMODE_RULE_OFF       (0x0003 << 3)
#define CSS1_OUTMODE_SPAN_TAG1_OFF  (0x0004 << 3)
#define CSS1_OUTMODE_ANY_OFF        (0x0007 << 3)

#define CSS1_OUTMODE_ONOFF(a) (CSS1_OUTMODE_##a##_ON|CSS1_OUTMODE_##a##_OFF)
#define CSS1_OUTMODE_SPAN_TAG       CSS1_OUTMODE_ONOFF(SPAN_TAG)
#define CSS1_OUTMODE_STYLE_OPT      CSS1_OUTMODE_ONOFF(STYLE_OPT)
#define CSS1_OUTMODE_RULE           CSS1_OUTMODE_ONOFF(RULE)
#define CSS1_OUTMODE_SPAN_TAG1      CSS1_OUTMODE_ONOFF(TAG1)

// Die folgenden Flags legen fest, was ausgegeben wird
#define CSS1_OUTMODE_TEMPLATE       0x0000
#define CSS1_OUTMODE_BODY           (0x0001 << 6)
#define CSS1_OUTMODE_PARA           (0x0002 << 6)
#define CSS1_OUTMODE_HINT           (0x0003 << 6)
#define CSS1_OUTMODE_FRAME          (0x0004 << 6)
#define CSS1_OUTMODE_TABLE          (0x0005 << 6)
#define CSS1_OUTMODE_TABLEBOX       (0x0006 << 6)
#define CSS1_OUTMODE_DROPCAP        (0x0007 << 6)
#define CSS1_OUTMODE_SECTION        (0x0008 << 6)
#define CSS1_OUTMODE_SOURCE         (0x000f << 6)

#define CSS1_OUTMODE_ENCODE         (0x0001 << 10)


// der HTML-Writer
struct HTMLControl;
SV_DECL_PTRARR_SORT_DEL( HTMLControls, HTMLControl*, 1, 1 )
SV_DECL_PTRARR( INetFmts, SwFmtINetFmt*, 1, 1 )

struct SwHTMLFmtInfo;
SV_DECL_PTRARR_SORT_DEL( SwHTMLFmtInfos, SwHTMLFmtInfo*, 1, 1 )

class SwHTMLWriter : public Writer
{
    String aCId;                    // Content-Id fuer Mail-Export

    SwHTMLPosFlyFrms *pHTMLPosFlyFrms;
    SwHTMLNumRuleInfo *pNumRuleInfo;// aktuelle Numerierung
    SwHTMLNumRuleInfo *pNextNumRuleInfo;
    const SwFlyFrmFmt* pFlyFrmFmt;  // liegt der Node in einem FlyFrame, ist
                                    // das Format gesetzt, sonst 0. In Tabellen
                                    // nur dann, wenn die Tabelle alleine
                                    // im Rahmen ist.

    sal_uInt32 nHTMLMode;               // Beschreibung der Export-Konfiguration

    FieldUnit eCSS1Unit;

    sal_uInt16 OutHeaderAttrs();
    const SwPageDesc *MakeHeader( sal_uInt16& rHeaderAtrs );
    void GetControls();

    void AddLinkTarget( const String& rURL );
    void CollectLinkTargets();

protected:
    sal_uInt32 WriteStream();

public:
#if defined(MAC) || defined(UNX)
    static const sal_Char sNewLine;     // nur \012 oder \015
#else
    static const sal_Char __FAR_DATA sNewLine[];    // \015\012
#endif

    SvStringsDtor aImgMapNames;     // geschriebene Image Maps
    SvStringsSortDtor aImplicitMarks;// implizite Stprungmarken
    SvStringsDtor aOutlineMarks;        // geschriebene Image Maps
    SvULongs aOutlineMarkPoss;
    HTMLControls aHTMLControls;     // die zu schreibenden ::com::sun::star::form::Forms
    SwHTMLFmtInfos aChrFmtInfos;
    SwHTMLFmtInfos aTxtCollInfos;
    INetFmts aINetFmts;             // die "offenen" INet-Attribute
    SwHTMLTxtFtns *pFootEndNotes;

    String aCSS1Selector;           // der Selektor eines Styles
    String aBulletGrfs[MAXLEVEL];   // die Grafiken fuer Listen

    ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexContainer >  *pxFormComps; // die aktuelle Form

    SwDoc *pTemplate;               // die HTML-Vorlage
    Color *pDfltColor;              // default Farbe
    SwNodeIndex *pStartNdIdx;       // Index des ersten Absatz
    const SwPageDesc *pCurrPageDesc;// Die aktuelle Seiten-Vorlage
    const SwFmtFtn *pFmtFtn;

    sal_uInt32 aFontHeights[7];         // die Font-Hoehen 1-7

    sal_uInt32 nWarn;                   // Result-Code fuer Warnungen
    xub_StrLen nLastLFPos;              // letzte Position eines LF

    sal_uInt16 nLastParaToken;          // fuers Absaetze zusammenhalten
    sal_uInt16 nBkmkTabPos;             // akt. Position in der Bookmark-Tabelle
    sal_uInt16 nImgMapCnt;              // zum eindeutig
    sal_uInt16 nFormCntrlCnt;
    sal_uInt16 nEndNote;
    sal_uInt16 nFootNote;
    sal_uInt16 nLeftMargin;             // linker Einzug (z.B. aus Listen)
    sal_uInt16 nDfltLeftMargin;         // die dafaults, der nicht geschrieben
    sal_uInt16 nDfltRightMargin;        // werden muessen (aus der Vorlage)
    short  nFirstLineIndent;        // Erstzeilen-Einzug (aus Listen)
    short  nDfltFirstLineIndent;    // nicht zu schreibender default
    sal_uInt16 nDfltTopMargin;          // die defaults, der nicht geschrieben
    sal_uInt16 nDfltBottomMargin;       // werden muessen (aus der Vorlage)
    sal_uInt16 nIndentLvl;              // wie weit ist eingerueckt?
    xub_StrLen nWhishLineLen;           // wie lang darf eine Zeile werden?
    sal_uInt16 nDefListLvl;             // welcher DL-Level existiert gerade
    sal_uInt16 nDefListMargin;          // Wie weit wird in DL eingerueckt
    sal_uInt16 nHeaderFooterSpace;
    sal_uInt16 nTxtAttrsToIgnore;
    sal_uInt16 nExportMode;
    sal_uInt16 nCSS1OutMode;

    rtl_TextEncoding    eDestEnc;

    // Beschreibung der Export-Konfiguration
    // 0
    sal_Bool bCfgOutStyles : 1;         // Styles exportieren
    sal_Bool bCfgPreferStyles : 1;      // Styles herkoemmlichen Tags vorziehen
    sal_Bool bCfgFormFeed : 1;          // Form-Feeds exportieren
    sal_Bool bCfgStarBasic : 1;         // StarBasic exportieren
    sal_Bool bCfgCpyLinkedGrfs : 1;

    // Beschreibung dessen, was exportiert wird

    sal_Bool bFirstLine : 1;            // wird die 1. Zeile ausgegeben ?
    sal_Bool bTagOn : 1;                // Tag an oder aus/Attr-Start oder -Ende

    // Die folgenden beiden Flags geben an, wir Attribute exportiert werden:
    // bTxtAttr bOutOpts
    // 0        0           Style-Sheets
    // 1        0           Hints: Jedes Attribut wird als eignes Tag
    //                          geschrieben und es gibt ein End-Tag
    // 0        1           (Absatz-)Attribute: Das Attribut wird als Option
    //                          eines bereits geschrieben Tags exportiert. Es
    //                          gibt kein End-Tag.
    sal_Bool bTxtAttr : 1;
    // 8
    sal_Bool bOutOpts : 1;

    sal_Bool bOutTable : 1;             // wird der Tabelleninhalt geschrieben?
    sal_Bool bOutHeader : 1;
    sal_Bool bOutFooter : 1;

    // Flags fuer Style-Export

    sal_Bool bFirstCSS1Rule : 1;        // wurde schon eine Property ausgegeben
    sal_Bool bFirstCSS1Property : 1;    // wurde schon eine Property ausgegeben
    sal_Bool bPoolCollTextModified : 1; // die Textkoerper-Vorlage wurde
                                    // modifiziert.
    sal_Bool bCSS1IgnoreFirstPageDesc : 1;
    // 16

    // was muss/kann/darf nicht ausgegeben werden?

    sal_Bool bNoAlign : 1;              // HTML-Tag erlaubt kein ALIGN=...
    sal_Bool bClearLeft : 1;            // <BR CLEAR=LEFT> am Absatz-Ende ausg.
    sal_Bool bClearRight : 1;           // <BR CLEAR=RIGHT> am Absatz-Ende ausg.
    sal_Bool bLFPossible : 1;           // ein Zeilenumbruch darf eingef. werden

    // sonstiges

    sal_Bool bPreserveForm : 1;         // die aktuelle Form beibehalten

    sal_Bool bCfgNetscape4 : 1;         // Netscape4 Hacks
    // 22

    SwHTMLWriter();
    virtual ~SwHTMLWriter();

    void Out_SwDoc( SwPaM* );       // schreibe den makierten Bereich

    // gebe alle an in aktuellen Ansatz stehenden ::com::sun::star::text::Bookmarks aus
    void OutAnchor( const String& rName );
    void OutBookmarks();
    void OutImplicitMark( const String& rMark, const sal_Char *pMarkType );

    // gebe die evt. an der akt. Position stehenden FlyFrame aus.
    sal_Bool OutFlyFrm( sal_uInt32 nNdIdx, xub_StrLen nCntntIdx,
                        sal_uInt8 nPos );
    void OutFrmFmt( sal_uInt8 nType, const SwFrmFmt& rFmt,
                    const SdrObject *pSdrObj );

    void OutForm( sal_Bool bTagOn=sal_True, const SwStartNode *pStNd=0 );
    void OutHiddenForms();
    void OutHiddenForm( const ::com::sun::star::uno::Reference<
                                ::com::sun::star::form::XForm > & rForm );

    void OutForm( sal_Bool bOn, const ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexContainer > & rFormComps );
    void OutHiddenControls( const ::com::sun::star::uno::Reference<
                ::com::sun::star::container::XIndexContainer > & rFormComps,
            const ::com::sun::star::uno::Reference<
                ::com::sun::star::beans::XPropertySet > & rPropSet );
    sal_Bool HasControls() const;

    void OutFootEndNoteInfo();
    void OutFootEndNotes();
    xub_StrLen GetFootEndNoteSymLen( const SwFmtFtn& rFmtFtn );
    void OutFootEndNoteSym( const SwFmtFtn& rFmtFtn );

#ifdef JAVA_BASIC_IDE
    void OutBasicModule( const String& rName, const String& rLanguage );
#endif
    void OutBasic();

    void OutAndSetDefList( sal_uInt16 nNewLvl );

    void OutStyleSheet( const SwPageDesc& rPageDesc, sal_Bool bUsed=sal_True );

    inline void OutCSS1_PropertyAscii( const sal_Char *pProp,
                                       const sal_Char *pVal );
    inline void OutCSS1_PropertyAscii( const sal_Char *pProp,
                                       const ByteString& rVal );
    inline void OutCSS1_Property( const sal_Char *pProp, const String& rVal );
    void OutCSS1_Property( const sal_Char *pProp, const sal_Char *pVal,
                           const String *pSVal );
    void OutCSS1_UnitProperty( const sal_Char *pProp, long nVal );
    void OutCSS1_PixelProperty( const sal_Char *pProp, long nVal, sal_Bool bVert );
    void OutCSS1_SfxItemSet( const SfxItemSet& rItemSet, sal_Bool bDeep=sal_True );
#if USED
    void OutCSS1_SfxItem( const SfxPoolItem *pItem1,
                          const SfxPoolItem *pItem2 = 0 );
#endif

    // BODY-Tag-Events aus der SFX-Konfigaurion
    void OutBasicBodyEvents();

    // BACKGROUND/BGCOLOR-Option
    void OutBackground( const SvxBrushItem *pBrushItem, String& rEmbGrfNm,
                        sal_Bool bGraphic );
    void OutBackground( const SfxItemSet& rItemSet, String &rEmbGrfName,
                        sal_Bool bGraphic );

    // ALT/ALIGN/WIDTH/HEIGHT/HSPACE/VSPACE-Optionen des aktuellen
    // Frame-Formats ausgeben und ggf. ein <BR CLEAR=...> vorne an
    // rEndTags anhaengen
    void OutFrmFmtOptions( const SwFrmFmt& rFrmFmt, const String& rAltTxt,
                            ByteString &rEndTags, sal_uInt32 nFrmOpts );
    void OutCSS1_TableFrmFmtOptions( const SwFrmFmt& rFrmFmt );
    void OutCSS1_SectionFmtOptions( const SwFrmFmt& rFrmFmt );
    void OutCSS1_FrmFmtOptions( const SwFrmFmt& rFrmFmt, sal_uInt32 nFrmOpts,
                                const SdrObject *pSdrObj=0,
                                const SfxItemSet *pItemSet=0 );
    void OutCSS1_FrmFmtBackground( const SwFrmFmt& rFrmFmt );

    void ChangeParaToken( sal_uInt16 nNew );

    // Umgebendes FlyFrmFmt
    const SwFlyFrmFmt *GetFlyFrmFmt() const { return pFlyFrmFmt; }
    void SetFlyFrmFmt( const SwFlyFrmFmt *pFly ) { pFlyFrmFmt = pFly; }

    void IncIndentLevel() { nIndentLvl++; }
    void DecIndentLevel() { if ( nIndentLvl ) nIndentLvl--; }
    void GetIndentString( ByteString& rStr, sal_uInt16 nIncLvl=0 );

    xub_StrLen GetLineLen() { return (xub_StrLen)(Strm().Tell()-nLastLFPos); }
    void OutNewLine( sal_Bool bCheck=sal_False );

    // fuer HTMLSaveData
    SwPaM* GetEndPaM() { return pOrigPam; }
    void SetEndPaM( SwPaM* pPam ) { pOrigPam = pPam; }

    sal_uInt32 ToPixel( sal_uInt32 nVal ) const;

    sal_uInt16 GuessFrmType( const SwFrmFmt& rFrmFmt,
                         const SdrObject*& rpStrObj );
    sal_uInt16 GuessOLENodeFrmType( const SwNode& rNd );

    void CollectFlyFrms();

    sal_uInt16 GetHTMLFontSize( sal_uInt32 nFontHeight ) const;

    // Die aktuelle Numerierungs-Information holen.
    SwHTMLNumRuleInfo& GetNumInfo() { return *pNumRuleInfo; }

    // Die Numerierungs-Information des naechsten Absatz holen. Sie
    // muss noch nicht vorhanden sein!
    SwHTMLNumRuleInfo *GetNextNumInfo() { return pNextNumRuleInfo; }

    // Die Numerierungs-Information des naechsten Absatz setzen.
    void SetNextNumInfo( SwHTMLNumRuleInfo *pNxt ) { pNextNumRuleInfo=pNxt; }

    // Die Numerierungs-Information des naeschten Absatz fuellen.
    void FillNextNumInfo();

    // Die Numerierungs-Information des naeschten Absatz loeschen.
    void ClearNextNumInfo();

    static const SdrObject *GetHTMLControl( const SwDrawFrmFmt& rFmt );
    static const SdrObject *GetMarqueeTextObj( const SwDrawFrmFmt& rFmt );
    static sal_uInt16 GetCSS1Selector( const SwFmt *pFmt, ByteString& rToken,
                                   String& rClass, sal_uInt16& rRefPoolId,
                                   String *pPseudo=0 );

    static const SwFmt *GetTemplateFmt( sal_uInt16 nPoolId, SwDoc *pTemplate );
    static const SwFmt *GetParentFmt( const SwFmt& rFmt, sal_uInt16 nDeep );

    static void SubtractItemSet( SfxItemSet& rItemSet,
                                 const SfxItemSet& rRefItemSet,
                                 sal_Bool bSetDefaults,
                                 sal_Bool bClearSame = sal_True );

    static void GetEEAttrsFromDrwObj( SfxItemSet& rItemSet,
                                      const SdrObject *pObj,
                                      sal_Bool bSetDefaults );

    static sal_uInt16 GetDefListLvl( const String& rNm, sal_uInt16 nPoolId );

    sal_uInt32 GetHTMLMode() const { return nHTMLMode; }
    sal_Bool IsHTMLMode( sal_uInt32 nMode ) const { return (nHTMLMode & nMode) != 0; }

    inline sal_Bool IsCSS1Source( sal_uInt16 n ) const;
    sal_Bool HasCId() const { return aCId.Len() > 0; }
    void MakeCIdURL( String& rURL );

    static const sal_Char *GetNumFormat( sal_uInt16 nFmt );
    static void PrepareFontList( const SvxFontItem& rFontItem, String& rNames,
                                 sal_Unicode cQuote, sal_Bool bGeneric );

    FieldUnit GetCSS1Unit() const { return eCSS1Unit; }
};

inline sal_Bool SwHTMLWriter::IsCSS1Source( sal_uInt16 n ) const
{
    return n == (nCSS1OutMode & CSS1_OUTMODE_SOURCE);
}

inline void SwHTMLWriter::OutCSS1_PropertyAscii( const sal_Char *pProp,
                                                 const sal_Char *pVal )
{
    OutCSS1_Property( pProp, pVal, 0 );
}

inline void SwHTMLWriter::OutCSS1_PropertyAscii( const sal_Char *pProp,
                                                 const ByteString& rVal )
{
    OutCSS1_Property( pProp, rVal.GetBuffer(), 0 );
}

inline void SwHTMLWriter::OutCSS1_Property( const sal_Char *pProp,
                                            const String& rVal )
{
    OutCSS1_Property( pProp, 0, &rVal );
}

// Struktur speichert die aktuellen Daten des Writers zwischen, um
// einen anderen Dokument-Teil auszugeben, wie z.B. Header/Footer
// Mit den beiden USHORTs im CTOR wird ein neuer PaM erzeugt und auf
// die Position im Dokument gesetzt.
// Im Destructor werden alle Daten wieder restauriert und der angelegte
// Pam wieder geloescht.

struct HTMLSaveData
{
    SwHTMLWriter& rWrt;
    SwPaM* pOldPam, *pOldEnd;
    SwHTMLNumRuleInfo *pOldNumRuleInfo;     // Owner = this
    SwHTMLNumRuleInfo *pOldNextNumRuleInfo; // Owner = HTML-Writer
    sal_uInt16 nOldDefListLvl;
    sal_Bool bOldWriteAll : 1;
    sal_Bool bOldOutHeader : 1;
    sal_Bool bOldOutFooter : 1;
    const SwFlyFrmFmt* pOldFlyFmt;

    HTMLSaveData( SwHTMLWriter&, sal_uInt32 nStt, sal_uInt32 nEnd,
                  const SwFlyFrmFmt* pFly, sal_Bool bSaveNum=sal_True );
    ~HTMLSaveData();
};


// einige Funktions-Deklarationen
Writer& OutHTML_FrmFmtOLENode( Writer& rWrt, const SwFrmFmt& rFmt,
                               sal_Bool bInCntnr );
Writer& OutHTML_FrmFmtOLENodeGrf( Writer& rWrt, const SwFrmFmt& rFmt,
                                  sal_Bool bInCntnr );

Writer& OutHTML_SwTxtNode( Writer&, const SwCntntNode& );
Writer& OutHTML_SwTblNode( Writer& , SwTableNode &, const SwFrmFmt *,
                           const String* pCaption=0, sal_Bool bTopCaption=sal_False );

Writer& OutHTML_DrawFrmFmtAsControl( Writer& rWrt, const SwDrawFrmFmt& rFmt,
                                     const SdrObject& rSdrObj, sal_Bool bInCntnr );
Writer& OutHTML_DrawFrmFmtAsMarquee( Writer& rWrt, const SwDrawFrmFmt& rFmt,
                                     const SdrObject& rSdrObj );

Writer& OutHTML_HeaderFooter( Writer& rWrt, const SwFrmFmt& rFrmFmt,
                              sal_Bool bHeader );

Writer& OutHTML_Image( Writer&, const SwFrmFmt& rFmt,
                       const String& rGrfName, const String& rAlternateTxt,
                       const Size& rRealSize, sal_uInt32 nFrmOpts,
                       const sal_Char *pMarkType = 0,
                       const ImageMap *pGenImgMap = 0 );
Writer& OutHTML_BulletImage( Writer& rWrt, const sal_Char *pTag,
                             const SvxBrushItem* pBrush, String &rGrfName,
                             const Size &rSize,
                             const SwFmtVertOrient* pVertOrient );

Writer& OutHTML_SwFmtFld( Writer& rWrt, const SfxPoolItem& rHt );
Writer& OutHTML_SwFmtFtn( Writer& rWrt, const SfxPoolItem& rHt );
Writer& OutHTML_INetFmt( Writer&, const SwFmtINetFmt& rINetFmt, sal_Bool bOn );

Writer& OutCSS1_BodyTagStyleOpt( Writer& rWrt, const SfxItemSet& rItemSet,
                                 String aEmbBGGrfName );
Writer& OutCSS1_ParaTagStyleOpt( Writer& rWrt, const SfxItemSet& rItemSet );

Writer& OutCSS1_HintSpanTag( Writer& rWrt, const SfxPoolItem& rHt );
Writer& OutCSS1_HintStyleOpt( Writer& rWrt, const SfxPoolItem& rHt );

Writer& OutCSS1_TableBGStyleOpt( Writer& rWrt, const SfxPoolItem& rHt );
Writer& OutCSS1_NumBulListStyleOpt( Writer& rWrt, const SwNumRule& rNumRule,
                                    sal_uInt8 nLevel );

Writer& OutHTML_NumBulListStart( SwHTMLWriter& rWrt,
                                 const SwHTMLNumRuleInfo& rInfo );
Writer& OutHTML_NumBulListEnd( SwHTMLWriter& rWrt,
                               const SwHTMLNumRuleInfo& rNextInfo );


#endif  //  _WRTHTML_HXX

diff --git a/sw/source/filter/inc/fltbase.hxx b/sw/source/filter/inc/fltbase.hxx
new file mode 100644
index 0000000..b739718
--- /dev/null
+++ b/sw/source/filter/inc/fltbase.hxx
@@ -0,0 +1,166 @@
/*************************************************************************
 *
 *  $RCSfile: fltbase.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:53 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef __FLTBASE_HXX__
#define __FLTBASE_HXX__

#ifndef _STREAM_HXX //autogen
#include <tools/stream.hxx>
#endif

#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif

class SwFilterBase
{
protected:
    SvStream    *pIn;
    sal_Char    *pReadBuff; //      Groessenangabe
    INT32       nBytesLeft; // noch zu lesende Bytes des aktuelle Records

    CharSet     eQuellChar; // Quell-Zeichensatz (interner Zeichensatz)
//  CharSet     eZielChar;  // Ziel-Zeichensatz

    USHORT      nTab;       // z.Zt. bearbeitete Tabelle
    USHORT      nReadBuffSize;// temporaerer Lesepuffer mit

    // ----------------------------------------------------------
    inline void ReadChar( char &rC );
    inline void ReadByte( BYTE &rN );
    inline void Read( short &rN );
    inline void ReadUnicode( sal_Unicode &rU );
    inline void Read( BYTE &rN0, USHORT &rN1, USHORT &rN2 );
    inline void Read( USHORT &rN );
    inline void Read( USHORT &rN1, USHORT &rN2 );
    inline void Read( USHORT &rN1, USHORT &rN2, USHORT &rN3, USHORT &rN4 );
    inline void Read( double &rF );
            void Read( String &rS );        // liest 0-terminierten C-String!
    inline void ClearBytesLeft( void );
};


inline void SwFilterBase::ReadChar( char &rC )
    {
    *pIn >> rC;
    nBytesLeft--;
    }

inline void SwFilterBase::ReadByte( BYTE &rN )
    {
    *pIn >> rN;
    nBytesLeft--;
    }

inline void SwFilterBase::ReadUnicode( sal_Unicode &rU )
{
    {
    sal_Char cC;
    *pIn >> cC;
    rU = ByteString::ConvertToUnicode(cC, eQuellChar);
    nBytesLeft--;
    }
}

inline void SwFilterBase::Read( short &rN )
    {
    *pIn >> rN;
    nBytesLeft -= 2;
    }

inline void SwFilterBase::Read( BYTE &rN0, USHORT &rN1, USHORT &rN2 )
    {
    *pIn >> rN0 >> rN1 >> rN2;
    nBytesLeft -= 5;
    }

inline void SwFilterBase::Read( USHORT &rN )
    {
    *pIn >> rN;
    nBytesLeft -= 2;
    }

inline void SwFilterBase::Read( USHORT &rN1, USHORT &rN2 )
    {
    *pIn >> rN1 >> rN2;
    nBytesLeft -= 4;
    }

inline void SwFilterBase::Read( USHORT &rN1, USHORT &rN2, USHORT &rN3, USHORT &rN4 )
    {
    *pIn >> rN1 >> rN2 >> rN3 >> rN4;
    nBytesLeft -= 8;
    }

inline void SwFilterBase::Read( double &rF )
    {
    *pIn >> rF;
    nBytesLeft -= 8;
    }

inline void SwFilterBase::ClearBytesLeft( void )
    {
    pIn->SeekRel( nBytesLeft );
    nBytesLeft = 0;
    }


#endif

diff --git a/sw/source/filter/inc/fltglbls.hxx b/sw/source/filter/inc/fltglbls.hxx
new file mode 100644
index 0000000..e0d1f2f
--- /dev/null
+++ b/sw/source/filter/inc/fltglbls.hxx
@@ -0,0 +1,218 @@
/*************************************************************************
 *
 *  $RCSfile: fltglbls.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:53 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FLTGLBS_HXX
#define _FLTGLBS_HXX

#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif
#ifndef _LANG_HXX //autogen
#include <tools/lang.hxx>
#endif
#ifndef _SVARRAY_HXX //autogen
#include <svtools/svarray.hxx>
#endif


class SfxPoolItem;
class SwDoc;
class SwPaM;
class SwTable;

class XF_Buffer;
class ColorBuffer;
class FontBuffer;
class SvNumberFormatter;


class ExcGlob;
extern ExcGlob *pExcGlob;

class LotGlob;
extern LotGlob *pLotGlob;

// ----- Basis-Klasse ----------------------------------------------------
class FilterGlobals
{
protected:
    SvPtrarr        aTblFmts;
    USHORT          nColStart;
    USHORT          nColEnd;
    USHORT          nRowStart;
    USHORT          nRowEnd;
    USHORT          nAnzCols;
    USHORT          nAnzRows;

public:
    FilterGlobals( SwDoc& rDoc, const SwPaM& rPam );
    ~FilterGlobals();

    SwDoc           *pD;
    SwPaM           *pPam;
    const SwTable   *pTable;

    SvNumberFormatter *pNumFormatter;
    LanguageType    eDefLanguage;
    String          aStandard;      // fuer Excel-Standard-Format
    ULONG           nStandard;
    ULONG           nDefFormat;     // = 0xFFFFFFFF

    void SetRange( USHORT nCS, USHORT nCE, USHORT nRS, USHORT nRE );

    BOOL IsInColRange( USHORT nCol )
                {   return ( nCol >= nColStart && nCol <= nColEnd ); }
    BOOL IsInRowRange( USHORT nRow )
                {   return ( nRow >= nRowStart && nRow <= nRowEnd ); }
    BOOL IsInRange( USHORT nCol, USHORT nRow )
                {   return IsInRowRange(nRow) && IsInColRange(nCol); }

    void NormalizeCol( USHORT &rCol )   { rCol -= nColStart; }
    void NormalizeRow( USHORT &rRow )   { rRow -= nRowStart; }
    void Normalize( USHORT &rCol, USHORT &rRow )
                        {   NormalizeCol( rCol ); NormalizeRow( rRow ); }

    USHORT AnzCols() const  { return nAnzCols; }
    USHORT AnzRows() const  { return nAnzRows; }

    BOOL ColRangeLimitter( USHORT &rCS, USHORT &rCE );

    void InsertText( USHORT nCol, USHORT nRow, const String& rStr );
    void CreateTable();
    void InsertAttr( const SfxPoolItem& rItem );

    inline void     ColLimitter( USHORT &rCol );
    inline void     RowLimitter( USHORT &rRow );
#ifdef USED
//      inline BOOL     RowRangeLimitter( USHORT &rRS, USHORT &rRE );
#endif
};





// ----- for Excel-Import only -------------------------------------------

enum ExcelRecordTypes { ERT_Biff2, ERT_Biff3, ERT_Biff4, ERT_Biff5 };

class ExcGlob : public FilterGlobals
{
public:
    ExcGlob( SwDoc& rDoc, const SwPaM& rPam );
    ~ExcGlob();

    XF_Buffer           *pXF_Buff;
    FontBuffer          *pFontBuff;
    ColorBuffer         *pColorBuff;
    ExcelRecordTypes    eHauptDateiTyp;
};

// ----- for Lotus-Import only -------------------------------------------
class LotGlob : public FilterGlobals
{
public:
    LotGlob( SwDoc& rDoc, const SwPaM& rPam )
        : FilterGlobals( rDoc, rPam ) {}
};




inline void FilterGlobals::ColLimitter( USHORT &rCol )
{
    if( rCol < nColStart )
        rCol = nColStart;
    else if( rCol > nColEnd )
        rCol = nColEnd;
}

inline void FilterGlobals::RowLimitter( USHORT &rRow )
{
    if( rRow < nRowStart )
        rRow = nRowStart;
    else if( rRow > nRowEnd )
        rRow = nRowEnd;
}

#ifdef USED

inline BOOL FilterGlobals::RowRangeLimitter( USHORT &rRS, USHORT &rRE )
    {
    //  PREC / POST: analog zu ColRangeLimitter
    BOOL bRet;
    DBG_ASSERT( rRS <= rRE,
        "-FilterGlobals::RowRangeLimitter(): Startzeile > Endzeile!" );
    if( rRS > nRowEnd || rRE < nRowStart )
        bRet = FALSE;
    else
        {
        bRet = TRUE;
        if( rRS < nRowStart )   rRS = nRowStart;
        if( rRE > nRowEnd )     rRE = nRowEnd;
        }
    return bRet;
    }

#endif


#endif

diff --git a/sw/source/filter/inc/fltini.hxx b/sw/source/filter/inc/fltini.hxx
new file mode 100644
index 0000000..05abeed
--- /dev/null
+++ b/sw/source/filter/inc/fltini.hxx
@@ -0,0 +1,219 @@
/*************************************************************************
 *
 *  $RCSfile: fltini.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:53 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FLTINI_HXX
#define _FLTINI_HXX


#ifndef _SHELLIO_HXX
#include <shellio.hxx>
#endif
#ifndef _TOOLS_COLOR_HXX
#include <tools/color.hxx>
#endif

class SwNumRuleTbl;
class SwDoc;
class SwTxtNode;
class SwNodeNum;
class SwNumRule;
class SwNodeIndex;


// die speziellen Reader

class Sw6Reader: public Reader
{
    virtual ULONG Read( SwDoc &,SwPaM &,const String &);
};

class W4WReader: public StgReader
{
    String sVersion;
    USHORT nFilter;
    BOOL bStorageFlag;
    virtual ULONG Read(SwDoc &,SwPaM &,const String &);
    // wir wollen die Streams / Storages nicht geoeffnet haben
    virtual int SetStrmStgPtr();
public:
    W4WReader() : StgReader(), nFilter(0), bStorageFlag(FALSE) {}
    virtual int GetReaderType();
    virtual void SetFltName( const String& rFltName );

    USHORT GetFilter() const { return nFilter; }
    const String& GetVersion() const { return sVersion; }
};

#ifdef DEBUG_SH

class Internal_W4WReader: public W4WReader
{
    virtual ULONG Read(SwDoc &,SwPaM &,const String &);
};

#endif

class ExcelReader : public StgReader
{
    virtual ULONG Read(SwDoc &,SwPaM &,const String &);
public:
    virtual int GetReaderType();
};

class LotusReader : public Reader
{
    CharSet eCodeSet;
    virtual ULONG Read(SwDoc &,SwPaM &,const String &);
public:
    virtual void SetFltName( const String& rFltNm );
};

class HTMLReader: public Reader
{
    // wir wollen die Streams / Storages nicht geoeffnet haben
    virtual int SetStrmStgPtr();
    virtual ULONG Read(SwDoc &,SwPaM &,const String &);
public:
    HTMLReader();
};

class WW1Reader : public Reader
{
    virtual ULONG Read(SwDoc &,SwPaM &,const String &);
};

class WW8Reader : public StgReader
{
    virtual ULONG Read(SwDoc &,SwPaM &,const String &);
public:
    virtual int GetReaderType();

    virtual BOOL HasGlossaries() const;
    virtual BOOL ReadGlossaries( SwTextBlocks&, BOOL bSaveRelFiles ) const;
};

class XMLReader : public Reader
{
    virtual ULONG Read(SwDoc &,SwPaM &,const String &);
public:
    XMLReader();
};

// die speziellen Writer

#if 0
WriterRef GetW4WWriter( const String& );
WriterRef GetStgWriter( const String& );
WriterRef GetWWWriter( const String& );
WriterRef GetWW8Writer( const String& );
#if !( defined(PRODUCT) || defined(MAC) || defined(PM2) )
WriterRef GetDebugWriter( const String& );
WriterRef GetUndoWriter( const String& );
#endif
#else
void GetW4WWriter( const String&, WriterRef& );
void GetStgWriter( const String&, WriterRef& );
void GetWWWriter( const String&, WriterRef& );
void GetWW8Writer( const String&, WriterRef& );
#if !( defined(PRODUCT) || defined(MAC) || defined(PM2) )
void GetDebugWriter( const String&, WriterRef& );
void GetUndoWriter( const String&, WriterRef& );
#endif
#endif

// Zugriff auf die Ini-Datei
ULONG ReadFilterFlags( const sal_Char* pName, const sal_Char* pAltName = 0 );

// JP 17.03.99 - 63049
// Umsetzen der LRSpaces im aktuell importierten Doc. Die Fremd-Filter
// liefern immer absolute Werte fuer die Ebenen einer NumRule. Wir
// verarbeiten jetzt aber relative Werte bezogen auf das LR-Space-Item.
// Das hat zur Folge, das bei allen Absaetzen die EInzuege der NumRule vom
// Absatz-Einzug abgezogen werden muss.
class SwRelNumRuleSpaces
{
    SwNumRuleTbl* pNumRuleTbl;  // Liste aller benannten NumRules
    BOOL bNewDoc;

    void SetNumLSpace( SwTxtNode& rNd, const SwNumRule& rRule );

public:
    SwRelNumRuleSpaces( SwDoc& rDoc, BOOL bNewDoc );
    ~SwRelNumRuleSpaces();

    void SetNumRelSpaces( SwDoc& rDoc );
    void SetOultineRelSpaces( const SwNodeIndex& rStt,
                                const SwNodeIndex& rEnd );
};

#define SW_SV_BRUSH_25          0
#define SW_SV_BRUSH_50          1
#define SW_SV_BRUSH_75          2
#define SW_SV_BRUSH_NULL        3
#define SW_SV_BRUSH_SOLID       4
#define SW_SV_BRUSH_INVALID     5

Color   ConvertBrushStyle(const Color& rCol, const Color& rFillCol, BYTE nStyle);

// Get size of fly (if 'automatic' in WW) and check if not too small
void    CalculateFlySize( SfxItemSet& rFlySet, SwNodeIndex& rAnchor,
                          SwTwips nPageWidth );

#endif _FLTINI_HXX
diff --git a/sw/source/filter/inc/fltshell.hxx b/sw/source/filter/inc/fltshell.hxx
new file mode 100644
index 0000000..7b13799
--- /dev/null
+++ b/sw/source/filter/inc/fltshell.hxx
@@ -0,0 +1,675 @@
/*************************************************************************
 *
 *  $RCSfile: fltshell.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:53 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FLTSHELL_HXX
#define _FLTSHELL_HXX

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _KEYCOD_HXX //autogen
#include <vcl/keycod.hxx>
#endif
#ifndef _DATETIME_HXX //autogen
#include <tools/datetime.hxx>
#endif
#ifndef _SVX_BRKITEM_HXX //autogen
#include <svx/brkitem.hxx>
#endif


#ifndef _FMTCOL_HXX
#include <fmtcol.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _PAM_HXX
#include <pam.hxx>
#endif
#ifndef _POOLFMT_HXX
#include <poolfmt.hxx>
#endif
#ifndef _FMTORNT_HXX //autogen
#include <fmtornt.hxx>
#endif
#ifndef _FRMATR_HXX
#include <frmatr.hxx>
#endif

class SwFlyFrmFmt;
class SwTOXBase;
class SwNumRule;
class SwFltShell;
class SwFmtFld;
class SwField;
class Graphic;
class SwTableLines;
class SwTableBoxes;
class SwTableBox;
class SwTableLine;
class International;
class DateTime;


inline void SwFltClearFlag(ULONG& rFieldFlags, int no)
    { rFieldFlags &= ~(1L << no); }

inline void SwFltSetFlag(ULONG& rFieldFlags, int no)
    { rFieldFlags |= 1L << no; }

inline BOOL SwFltGetFlag(ULONG nFieldFlags, int no)
    { return (nFieldFlags & (1L << no)) != 0; }

// Stack-Eintrag fuer die Attribute Es werden immer Pointer auf neue Attribute uebergeben.
class SwFltStackEntry
{
public:
    SwNodeIndex nMkNode;
    SwNodeIndex nPtNode;
    SfxPoolItem * pAttr;// Format Attribute
    long nHandle;       // fuer verschachtelte Attrs, z.B. Bookmarks
    xub_StrLen nMkCntnt;// Nachbildung von Mark()
    xub_StrLen nPtCntnt;// Nachbildung von GetPoint()

    BOOL bOld;          // to mark Attributes *before* skipping field results
    BOOL bLocked;
    BOOL bCopied;

    SwFltStackEntry(const SwPosition & rStartPos, SfxPoolItem* pHt );
    SwFltStackEntry(const SwFltStackEntry& rEntry);
    ~SwFltStackEntry();

    void SetStartPos(const SwPosition & rStartPos);
    void SetEndPos(  const SwPosition & rEndPos);
    BOOL MakeRegion(SwDoc* pDoc, SwPaM& rRegion, BOOL bCheck );
};

// ein Stack fuer die gesamten Text-Attribute
typedef SwFltStackEntry* SwFltStackEntryPtr;

SV_DECL_PTRARR(SwFltControlStackEntries,SwFltStackEntryPtr,5,10)

class SwFltControlStack : public SwFltControlStackEntries
{
    friend SwFltShell;

    ULONG nFieldFlags;
    KeyCode aEmptyKeyCode; // fuer Bookmarks

    BOOL IsAttrOpen(USHORT nAttrId);

    void MoveAttrs( const SwPosition&  rPos );

protected:
    SwDoc* pDoc;
    BOOL bIsEndStack;

    virtual void SetAttrInDoc(const SwPosition& rTmpPos, SwFltStackEntry* pEntry);

public:
    enum Flags
    {
        HYPO,
        TAGS_DO_ID,
        TAGS_VISIBLE,
        BOOK_TO_VAR_REF,
        BOOK_AND_REF,
        TAGS_IN_TEXT,
        ALLOW_FLD_CR,
        NO_FLD_CR,
        DONT_HARD_PROTECT
    };

    SwFltControlStack(SwDoc* pDo, ULONG nFieldFl);
    ~SwFltControlStack();

    BOOL IsFlagSet(Flags no) const  { return ::SwFltGetFlag(nFieldFlags, no);}

    void NewAttr(const SwPosition& rPos, const SfxPoolItem & rAttr );
//  BOOL SetAttr(const SwPosition& rPos, USHORT nAttrId=0, BOOL bTstEnde=TRUE);
                // SetAttr mit Handle fuer verschachtelte Attrs, z.B. Bookmarks
    BOOL SetAttr(const SwPosition& rPos, USHORT nAttrId=0, BOOL bTstEnde=TRUE,
                 long nHand = LONG_MAX);

    void StealAttr(const SwPosition* pPos, USHORT nAttrId = 0);
    void MoveAttrsToNextNode( const SwNodeIndex& rNdIdx );
    void MarkAllAttrsOld();
    void KillUnlockedAttrs(const SwPosition& pPos);
    SfxPoolItem* GetFmtStackAttr(USHORT nWhich, USHORT * pPos = 0);
    const SfxPoolItem* GetOpenStackAttr(const SwPosition& rPos, USHORT nWhich);
    const SfxPoolItem* GetFmtAttr(const SwPosition& rPos, USHORT nWhich);
};

class SwFltAnchor : public SfxPoolItem
{
    SwFrmFmt* pFrmFmt;
public:
    SwFltAnchor(SwFrmFmt* pFlyFmt);
    SwFltAnchor(const SwFltAnchor&);
    // "pure virtual Methoden" vom SfxPoolItem
    virtual int operator==(const SfxPoolItem&) const;
    virtual SfxPoolItem* Clone(SfxItemPool* = 0) const;
    const SwFrmFmt* GetFrmFmt() const       { return pFrmFmt; }
          SwFrmFmt* GetFrmFmt()             { return pFrmFmt; }
};

class SwFltRedline : public SfxPoolItem
{
public:
    DateTime        aStamp;
    DateTime        aStampPrev;
    SwRedlineType   eType;
    SwRedlineType   eTypePrev;
    USHORT          nAutorNo;
    USHORT          nAutorNoPrev;

    SwFltRedline(SwRedlineType   eType_,
                 USHORT          nAutorNo_,
                 const DateTime& rStamp_,
                 SwRedlineType   eTypePrev_    = REDLINE_INSERT,
                 USHORT          nAutorNoPrev_ = USHRT_MAX,
                 const DateTime* pStampPrev_   = 0)
        : eType( eType_ ), nAutorNo( nAutorNo_ ), aStamp( rStamp_ ),
        eTypePrev( eTypePrev_ ), nAutorNoPrev( nAutorNoPrev_ )
    {
            if( pStampPrev_ )
                aStampPrev = *pStampPrev_;
    }

    SwFltRedline(const SwFltRedline& rCpy):
        SfxPoolItem(RES_FLTR_REDLINE),
        eType(          rCpy.eType        ),
        nAutorNo(       rCpy.nAutorNo     ),
        aStamp(         rCpy.aStamp       ),
        eTypePrev(      rCpy.eTypePrev    ),
        nAutorNoPrev(   rCpy.nAutorNoPrev ),
        aStampPrev(     rCpy.aStampPrev   )
        {}
    // "pure virtual Methoden" vom SfxPoolItem
    virtual int operator==(const SfxPoolItem& rItem) const;
    virtual SfxPoolItem* Clone(SfxItemPool* = 0) const;
};

class SwFltBookmark : public SfxPoolItem
{
friend class SwFltShell;    // darf aName und aVal uebersetzen
    long nHandle;
    String aName;
    String aVal;
    BOOL bOnlyRef;          // "FRAGE"-Feld, Ref/Seitenrf oder nichts
    BOOL bRef;
    BOOL bPgRef;
public:
    SwFltBookmark( const String& rNa, const String& rVa,
                    long nHand, BOOL bOnlyR );
    SwFltBookmark( const SwFltBookmark& );
    // "pure virtual Methoden" vom SfxPoolItem
    virtual int operator==(const SfxPoolItem&) const;
    virtual SfxPoolItem* Clone(SfxItemPool* = 0) const;
    const String& GetName() const       { return aName; }
    const String& GetValSys() const     { return aVal; }
    BOOL IsOnlyRef() const              { return bOnlyRef; }
    BOOL IsRef() const                  { return bRef; }
    void SetRef(BOOL b = TRUE)          { bRef = b; }
    BOOL IsPgRef() const                { return bPgRef; }
    void SetPgRef(BOOL b = TRUE)        { bPgRef = b; }
    long GetHandle() const              { return nHandle; }
};

class SwFltTOX : public SfxPoolItem
{
    SwTOXBase* pTOXBase;
    USHORT nCols;
    BOOL bHadBreakItem; // there was a break item BEFORE insertion of the TOX
    BOOL bHadPageDescItem; // ...
public:
    SwFltTOX(SwTOXBase* pBase, USHORT _nCols = 0);
    SwFltTOX(const SwFltTOX&);
    // "pure virtual Methoden" vom SfxPoolItem
    virtual int operator==(const SfxPoolItem&) const;
    virtual SfxPoolItem* Clone(SfxItemPool* = 0) const;
    SwTOXBase* GetBase()            { return pTOXBase; }
    USHORT GetCols() const          { return nCols; }
    void SetHadBreakItem(    BOOL bVal ) { bHadBreakItem    = bVal; }
    void SetHadPageDescItem( BOOL bVal ) { bHadPageDescItem = bVal; }
    BOOL HadBreakItem()    const { return bHadBreakItem; }
    BOOL HadPageDescItem() const { return bHadPageDescItem; }
};

class SwFltSection : public SfxPoolItem
{
    SwSection* pSection;
public:
    SwFltSection( SwSection* pSect );
    SwFltSection( const SwFltSection& );
    // "pure virtual Methoden" vom SfxPoolItem
    virtual int operator==(const SfxPoolItem&) const;
    virtual SfxPoolItem* Clone(SfxItemPool* = 0) const;
    SwSection* GetSection()         { return pSection; }
};
// Der WWEndStack verhaelt sich wie der WWControlStck, nur dass die Attribute
// auf ihm bis ans Ende des Dokuments gehortet werden, falls auf sie noch
// zugegriffen werden muss (z.B. Book/RefMarks, Index u.s.w.)
class SwFltEndStack : public SwFltControlStack
{
public:
    SwFltEndStack(SwDoc* pDo, ULONG nFieldFl)
        :SwFltControlStack(pDo, nFieldFl)
    {
        bIsEndStack = TRUE;
    }

    void SetBookRef( const String& rName, BOOL bPgRef = FALSE );
};

///////////////////////////////////////////////////////////////////////////////////////////
//
// hier beginnen die fuer ww1-filter neu erstellten klassen. diese
// sollen eine simple oberflaeche fuer die komplexen strukturen des
// writers speziell fuer filter sein. soll etwas in den writer gegeben
// werden, soll ein << reichen. hierfuer sind neue typen erzeugt
// worden. ausserdem soll moeglich sein das objekt nach vielen
// zustaenden der momentanen formatierung zu fragen, sodasz diese der
// filter nicht selbst verwalten musz.
//
// den anfang macht eine vorlagen-oberklasse, die einfachen umgang mit
// formatvorlagen ermoeglicht:
//

class SwFltOutBase
{
    SwDoc& rDoc;
protected:
    RndStdIds eFlyAnchor;
    BOOL bFlyAbsPos;

    SwDoc& GetDoc()                 { return rDoc; }
    SfxItemSet* NewFlyDefaults();

    SwFltOutBase(SwDoc& rDocu)
        : rDoc(rDocu), bFlyAbsPos(FALSE), eFlyAnchor(FLY_AT_CNTNT)
    {}

public:
    virtual SwFltOutBase& operator << (const SfxPoolItem& rItem) = 0;

    virtual const SfxPoolItem& GetAttr(USHORT nWhich) = 0;
    virtual const SfxPoolItem& GetNodeOrStyAttr(USHORT nWhich) = 0;

    virtual const SfxPoolItem& GetCellAttr(USHORT nWhich);
    virtual BOOL BeginTable();
    virtual void NextTableCell();
    virtual void NextTableRow();
    virtual void SetTableWidth(SwTwips nW);
    virtual void SetTableOrient(SwHoriOrient eOri);
    virtual void SetCellWidth(SwTwips nWidth, USHORT nCell);
    virtual void SetCellHeight(SwTwips nH);
    virtual void SetCellBorder(const SvxBoxItem& rFmtBox, USHORT nCell);
    virtual void SetCellSpace(USHORT nSp);
    virtual void DeleteCell(USHORT nCell);
    virtual void EndTable();

    virtual BOOL IsInFly() = 0;
    virtual void SetFlyFrmAttr(const SfxPoolItem& rAttr) = 0;
    virtual const SfxPoolItem& GetFlyFrmAttr(USHORT nWhich) = 0;
    virtual BOOL BeginFly( RndStdIds eAnchor, BOOL bAbsolutePos,
                               const SfxItemSet* pMoreAttrs = 0 );
    virtual void SetFlyAnchor( RndStdIds eAnchor );
    virtual void EndFly();
};

class SwFltOutDoc : public SwFltOutBase
{
    SwFltControlStack& rStack;
    SwFltEndStack& rEndStack;
    SwPaM* pPaM;
    SwFrmFmt* pFly;
// table items:
    const SwTable* pTable;
    SwPosition* pTabSavedPos; // set when in table
    SwPosition* pFlySavedPos; // set when in fly
    SwTwips nTableWidth;
    USHORT usTableX;
    USHORT usTableY;
    BOOL bReadNoTbl;                // Keine Tabellen

    SwTableBox* GetBox(USHORT ny, USHORT nx = USHRT_MAX);
    BOOL SeekCell( short nRow, short nCol, BOOL bPam );
    void SplitTable();
public:
    SwFltOutDoc(SwDoc& rDocu, SwPaM* pP, SwFltControlStack& rStk, SwFltEndStack& rEStk)
         :SwFltOutBase(rDocu), pPaM(pP), rStack(rStk), rEndStack(rEStk),
          pFly(0), pTable(0), pTabSavedPos(0), pFlySavedPos(0),
          nTableWidth(0), bReadNoTbl(FALSE)
    {}

    void SetReadNoTable()           { bReadNoTbl = TRUE; }
    BOOL IsTableWidthSet() const    { return 0 != nTableWidth; }

    virtual SwFltOutBase& operator << (const SfxPoolItem& rItem);

    virtual const SfxPoolItem& GetAttr(USHORT nWhich);
    virtual const SfxPoolItem& GetNodeOrStyAttr(USHORT nWhich);

    BOOL IsInTable();
    virtual const SfxPoolItem& GetCellAttr(USHORT nWhich);
    virtual BOOL BeginTable();
    virtual void NextTableCell();
    virtual void NextTableRow();
    virtual void SetTableWidth(SwTwips nW);
    virtual void SetTableOrient(SwHoriOrient eOri);
    virtual void SetCellWidth(SwTwips nWidth, USHORT nCell);
    virtual void SetCellHeight(SwTwips nH);
    virtual void SetCellBorder(const SvxBoxItem& rFmtBox, USHORT nCell);
    virtual void SetCellSpace(USHORT nSp);
    virtual void DeleteCell(USHORT nCell);
    virtual void EndTable();

    SwFrmFmt* MakeFly( RndStdIds eAnchor, SfxItemSet* pSet );
    virtual BOOL IsInFly();
    virtual void SetFlyFrmAttr(const SfxPoolItem& rAttr);
    virtual const SfxPoolItem& GetFlyFrmAttr(USHORT nWhich);
    virtual BOOL BeginFly( RndStdIds eAnchor, BOOL bAbsolutePos,
                               const SfxItemSet* pMoreAttrs = 0 );
    virtual void EndFly();
};

class SwFltFormatCollection : public SwFltOutBase
{
    SwTxtFmtColl* pColl;
    SfxItemSet* pFlyAttrs;      // Simulation der Flys in Styles
    BOOL bHasFly;
public:
    SwFltFormatCollection(SwDoc&, RES_POOL_COLLFMT_TYPE nType);
    SwFltFormatCollection(SwDoc&, const String& rName );
    ~SwFltFormatCollection() { if( pFlyAttrs ) delete pFlyAttrs; }

    void Reset()
    {
        pColl->ResetAllAttr();
        pColl->SetAuto(FALSE); // nach Empfehlung JP
    }
    void Derived(SwTxtFmtColl* pBase)
        { pColl->SetDerivedFrom(pBase); }

//  SwTxtFmtColl* Search(String, CharSet eSrc);
    SwTxtFmtColl* GetColl()         { return pColl; }
    void SetHasFly()                { bHasFly = TRUE; }
    SfxItemSet* GetpFlyAttrs()      { return pFlyAttrs; }

    virtual SwFltOutBase& operator << (const SfxPoolItem& rItem);
    virtual const SfxPoolItem& GetAttr(USHORT nWhich);
    virtual const SfxPoolItem& GetNodeOrStyAttr(USHORT nWhich);

    virtual BOOL IsInFly();
    virtual void SetFlyFrmAttr(const SfxPoolItem& rAttr);
    virtual const SfxPoolItem& GetFlyFrmAttr(USHORT nWhich);
    virtual BOOL BeginFly( RndStdIds eAnchor, BOOL bAbsolutePos,
                               const SfxItemSet* pMoreAttrs = 0 );
    BOOL BeginStyleFly( SwFltOutDoc* pOutDoc );
    virtual void EndFly();
};

//
// dies nun ist die zauberhafteklasse: intention: alle eins nach dem
// andern hinein'pipe'n. wird eine besondere struktur eingelesen, wird
// eine klammer geoeffnet (BeginXxx) und nach beendigung geschlossen
// (EndXxx), wobei Xxx zB fuer Fusznoten, Kopf/Fuszzeilen oder
// Tabellen steht. Styles funktionieren auch so, haben aber den
// unterschied, keine buchstaben zu akzeptieren.
// beginnt ein neuer absatz oder aehnliches, wird NextXxx genutzt.
// hier ist moeglich, Tab, Zeilenumbruch, Absatzende, Seitenumbruch
// und Sektionsende einzufuegen.
//
class SwFltShell
{
    SwFltOutDoc* pOutDoc;
    SwFltFormatCollection* pColls[256];
    SwFltOutBase* pOut;

//  SwFltFormatCollection* pFormat; // set when in style-mode
    SwPageDesc* pCurrentPageDesc;
    SwPosition* pSavedPos; // set, when in footnote or header/footer -mode
#ifdef None
#undef None
#endif
    enum SubModes {
        None,
        Header,
        Footer,
        Footnote,
        Table,
        Fly,
        Style,
        Max
    } eSubMode;

// Fly items:
    USHORT nAktStyle;               // zur Indizierung pStyleFlyTable
//
    SwFltControlStack aStack;
    SwFltEndStack aEndStack;
    SwPaM* pPaM;
//
    USHORT nPageDescOffset; // fuers update der pagedescs
    CharSet eSrcCharSet; // charset der quelle
    friend SwFltControlStack;
    BOOL bNewDoc;
    BOOL bStdPD;
    BOOL bProtect;

public:
    SwFltShell(SwDoc* , SwPaM& , BOOL bNew, ULONG = 0);
    ~SwFltShell();

    SwDoc& GetDoc()                 { return *aStack.pDoc; }

    CharSet SetCharSet(CharSet eNew)    { CharSet eOld = eSrcCharSet;
                                          eSrcCharSet = eNew;
                                          return eOld;
                                        }
    void SetUseStdPageDesc()        { bStdPD = TRUE; }
    void SetProtect()               { bProtect = TRUE; }
    SwPageDesc* MakePageDesc(SwPageDesc* pFirstPageDesc = NULL);
    SwPageDesc& GetPageDesc()       { return *pCurrentPageDesc; }
    void NextTab()                  { (*this) << BYTE(0x09); }
    void NextLine()                 { (*this) << BYTE(0x0a); }
    void NextParagraph()    {   GetDoc().AppendTxtNode(*pPaM->GetPoint()); }
    void NextPage()         { NextParagraph();
                                  GetDoc().Insert(*pPaM,
                                    SvxFmtBreakItem(SVX_BREAK_PAGE_BEFORE));
                            }
    void NextSection()      { pCurrentPageDesc = MakePageDesc(); }

    SwFltShell& AddGraphic( const String& rPicName );
    SwFltShell& AddError( const sal_Char* pErr );
    SwFltShell& AddLinkedSection( const String& rFileName );
    SwFltShell& EndItem( USHORT nId );
    SwFltShell& SetStyle( USHORT nStyle );

    SwFltShell& operator << ( Graphic& );
    SwFltShell& operator << ( SwFltBookmark& aBook );
    void SetBookEnd(long nHandle);
    SwFltShell& operator << ( const SwFltTOX& );
    SwFltShell& operator << ( const String& );  // Vorsicht: CHARSET_ANSI
    SwFltShell& operator << ( const sal_Unicode );
    SwFltShell& operator << ( const SwField& );
    SwFltShell& operator << ( const SfxPoolItem& rItem )
        { *pOut << rItem; return *this; }

//  SwFltShell& operator >> (SfxPoolItem&);
// methode zum beenden einer sub-sektion, zB Fusznote etc
    void End()                      { eSubMode = None; }
// methoden zur verwaltung von Header/Footer
    void BeginHeader(SwPageDesc* =NULL);
    void BeginFooter(SwPageDesc* =NULL);
    void EndHeaderFooter();
// methoden zur verwaltung von FootNotes
    void BeginFootnote();
    void EndFootnote();
// methoden zur verwaltung von Tabellen
    BOOL IsInTable() {
        return ( pOut == pOutDoc ) ? pOutDoc->IsInTable() : 0; }
    const SfxPoolItem& GetCellAttr(USHORT nWhich) {
        return pOut->GetCellAttr(nWhich); }
    BOOL BeginTable() {
        BOOL b = pOut->BeginTable();
        if(b) eSubMode = Table;
        return b; }
    void NextTableCell() {
        pOut->NextTableCell(); }
    void NextTableRow() {
        pOut->NextTableRow(); }
    void SetTableWidth(SwTwips nW) {
        pOut->SetTableWidth(nW); }
    BOOL IsTableWidthSet() {
        return pOutDoc->IsTableWidthSet(); }
    void SetTableOrient(SwHoriOrient eOri) {
        pOut->SetTableOrient(eOri); }
    void SetCellWidth(SwTwips nWidth, USHORT nCell = USHRT_MAX ) {
        pOut->SetCellWidth(nWidth, nCell); }
    void SetCellHeight(SwTwips nH) {
        pOut->SetCellHeight(nH); }
    void SetCellBorder(const SvxBoxItem& rFmtBox, USHORT nCell = USHRT_MAX ){
        pOut->SetCellBorder(rFmtBox, nCell); }
    void SetCellSpace(USHORT nSp) {
        pOut->SetCellSpace(nSp); }
    void DeleteCell(USHORT nCell = USHRT_MAX) {
        pOut->DeleteCell(nCell); }
    void EndTable() {
        pOut->EndTable(); }
// methoden zur verwaltung von Flys
    BOOL IsInFly() { return pOut->IsInFly(); }
    BOOL BeginFly( RndStdIds eAnchor = FLY_AT_CNTNT, BOOL bAbsolutePos = FALSE );
    void SetFlyAnchor( RndStdIds eAnchor )
        { pOut->SetFlyAnchor( eAnchor ); }
    void SetFlyXPos( short nXPos,SwRelationOrient eHRel = FRAME,
                     SwHoriOrient eHAlign = HORI_NONE );
    void SetFlyYPos( short nYPos, SwRelationOrient eVRel = FRAME,
                     SwVertOrient eVAlign = VERT_NONE );
    void SetFlyFrmAttr(const SfxPoolItem& rAttr){
        pOut->SetFlyFrmAttr( rAttr ); }
    void EndFly();
// methoden zur verwaltung von styles:
    void BeginStyle(USHORT nUserCode, RES_POOL_COLLFMT_TYPE aType)
    {
        ASSERT(nUserCode<sizeof(pColls)/sizeof(*pColls), "code out of bounds");
        ASSERT(pColls[nUserCode] == NULL, "user codes dublicate");
        if (eSubMode == Style)
            EndStyle();
        pOut = pColls[nUserCode] = new SwFltFormatCollection(GetDoc(), aType);
        nAktStyle = nUserCode;
        eSubMode = Style;
    }
    void BeginStyle( USHORT nUserCode, const String& rName )
    {
        ASSERT(nUserCode<sizeof(pColls)/sizeof(*pColls), "code out of bounds");
        ASSERT(pColls[nUserCode] == NULL, "user codes dublicate");
        if (eSubMode == Style)
            EndStyle();
        pOut = pColls[nUserCode] = new SwFltFormatCollection(GetDoc(), rName );
        nAktStyle = nUserCode;
        eSubMode = Style;
    }
    BOOL IsStyleImported(USHORT nUserCode)
        { return pColls[nUserCode] != 0; }
    void BaseStyle(USHORT nBased)
    {
        ASSERT(eSubMode == Style, "wrong state for style");
        ASSERT(pColls[nBased], "Style based on noexistent style" );
        if( eSubMode == Style && pColls[nBased]->GetColl() )
            ((SwFltFormatCollection*)pOut)->Derived(pColls[nBased]->GetColl());
    }
    void NextStyle(USHORT nWhich, USHORT nNext);

    void EndStyle()
    {
//      ASSERT(eSubMode == Style, "wrong state for style");
        nAktStyle = 0;
        pOut = pOutDoc;
        eSubMode = None;
    }

    BOOL IsFlagSet(SwFltControlStack::Flags no) const
        { return aStack.IsFlagSet(no); }
    void ConvertUStr( String& rInOut );
    void ConvertLStr( String& rInOut );
    String QuoteStr( const String& rIn );
// folgende status kann die shell verwalten:
    const SfxPoolItem& GetNodeOrStyAttr(USHORT nWhich)
        { return pOut->GetNodeOrStyAttr( nWhich ); }
    const SfxPoolItem& GetAttr(USHORT nWhich)
        { return pOut->GetAttr( nWhich ); }
    const SfxPoolItem& GetFlyFrmAttr(USHORT nWhich)
        { return pOut->GetFlyFrmAttr( nWhich ); }
    SwFieldType *GetSysFldType(USHORT eWhich)
        { return GetDoc().GetSysFldType(eWhich); }
    BOOL GetWeightBold();
    BOOL GetPostureItalic();
    BOOL GetCrossedOut();
    BOOL GetContour();
    BOOL GetCaseKapitaelchen();
    BOOL GetCaseVersalien();
};


#endif
diff --git a/sw/source/filter/inc/makefile.mk b/sw/source/filter/inc/makefile.mk
new file mode 100644
index 0000000..c6cdee2
--- /dev/null
+++ b/sw/source/filter/inc/makefile.mk
@@ -0,0 +1,61 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:53 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************
diff --git a/sw/source/filter/inc/rtf.hxx b/sw/source/filter/inc/rtf.hxx
new file mode 100644
index 0000000..fc310f4
--- /dev/null
+++ b/sw/source/filter/inc/rtf.hxx
@@ -0,0 +1,168 @@
/*************************************************************************
 *
 *  $RCSfile: rtf.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:53 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _RTF_HXX
#define _RTF_HXX

#ifndef _SOLAR_H
#include <tools/solar.h>
#endif

// Umsetzung einiger FlyFrame-Attribute
class RTFVertOrient
{
    union {
        struct {
            USHORT nOrient : 4;
            USHORT nRelOrient : 1;
        } Flags;
        USHORT nVal;
    } Value;

public:
    RTFVertOrient( USHORT nValue ) { Value.nVal = nValue; }

    RTFVertOrient( USHORT nOrient, USHORT nRelOrient )  {
        Value.Flags.nOrient = nOrient;
        Value.Flags.nRelOrient = nRelOrient;
    }

    USHORT GetOrient()   const { return Value.Flags.nOrient; }
    USHORT GetRelation() const { return Value.Flags.nRelOrient; }
    USHORT GetValue()    const { return Value.nVal; }
};


class RTFHoriOrient
{
    union {
        struct {
            USHORT nOrient : 4;
            USHORT nRelAnchor : 4;
            USHORT nRelOrient : 1;
        } Flags;
        USHORT nVal;
    } Value;

public:
    RTFHoriOrient( USHORT nValue ) { Value.nVal = nValue; }

    RTFHoriOrient( USHORT nOrient, USHORT nRelOrient ) {
        Value.Flags.nOrient = nOrient;
        Value.Flags.nRelOrient = nRelOrient;
        Value.Flags.nRelAnchor = 0;
    }

    USHORT GetOrient()   const { return Value.Flags.nOrient; }
    USHORT GetRelation() const { return Value.Flags.nRelOrient; }
    USHORT GetValue()    const { return Value.nVal; }
};

class RTFProtect
{
    union {
        struct {
            BOOL bCntnt : 1;
            BOOL bSize : 1;
            BOOL bPos : 1;
        } Flags;
        BYTE nVal;
    } Value;
public:
    RTFProtect( BYTE nValue ) { Value.nVal = nValue; }

    RTFProtect( BOOL bCntnt, BOOL bSize, BOOL bPos ) {
        Value.Flags.bCntnt = bCntnt;
        Value.Flags.bSize = bSize;
        Value.Flags.bPos = bPos;
    }

    BOOL GetCntnt()     const { return Value.Flags.bCntnt; }
    BOOL GetSize()      const { return Value.Flags.bSize; }
    BOOL GetPos()       const { return Value.Flags.bPos; }
    USHORT GetValue()   const { return Value.nVal; }
};


class RTFSurround
{
    union {
        struct {
            USHORT nGoldCut : 1;
            USHORT nOrder : 4;
        } Flags;
        BYTE nVal;
    } Value;
public:
    RTFSurround( BYTE nValue ) { Value.nVal = nValue; }

    RTFSurround( BOOL bGoldCut, BYTE nOrder ) {
        Value.Flags.nOrder = nOrder;
        Value.Flags.nGoldCut = bGoldCut;
    }

    BYTE GetOrder()     const { return (BYTE)Value.Flags.nOrder; }
    BOOL GetGoldCut()   const { return (BOOL)Value.Flags.nGoldCut; }
    USHORT GetValue()   const { return Value.nVal; }
};

#endif // _RTF_HXX


diff --git a/sw/source/filter/inc/wrt_fn.hxx b/sw/source/filter/inc/wrt_fn.hxx
new file mode 100644
index 0000000..fe6f000
--- /dev/null
+++ b/sw/source/filter/inc/wrt_fn.hxx
@@ -0,0 +1,103 @@
/*************************************************************************
 *
 *  $RCSfile: wrt_fn.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:53 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _WRT_FN_HXX
#define _WRT_FN_HXX

#include "hintids.hxx"      // fuer die Konstanten

// einige Forward-Deklarationen
class SwFmt;
class SwNode;
class SwCntntNode;
class Writer;
class SfxPoolItem;
class SfxItemSet;


/* Funktionspointer auf die Attribut-Write-Funktionen */
typedef Writer& (*FnAttrOut)( Writer&, const SfxPoolItem& );
typedef FnAttrOut SwAttrFnTab[ POOLATTR_END - POOLATTR_BEGIN ];

Writer& Out( const SwAttrFnTab, const SfxPoolItem&, Writer& );
Writer& Out_SfxItemSet( const SwAttrFnTab, Writer&, const SfxItemSet&,
                         BOOL bDeep, BOOL bTstForDefault = TRUE );


/* Funktionspointer auf die Node-Write-Funktionen */

enum RES_NODE
{
RES_NODE_BEGIN = 0,
    RES_TXTNODE = RES_NODE_BEGIN,
    RES_GRFNODE,
    RES_OLENODE,
RES_NODE_END
};

typedef Writer& (*FnNodeOut)( Writer&, SwCntntNode& );
typedef FnNodeOut SwNodeFnTab[ RES_NODE_END - RES_NODE_BEGIN ];

Writer& Out( const SwNodeFnTab, SwNode&, Writer & rWrt );




#endif  //  _WRT_FN_HXX
diff --git a/sw/source/filter/inc/wrtswtbl.hxx b/sw/source/filter/inc/wrtswtbl.hxx
new file mode 100644
index 0000000..e033014
--- /dev/null
+++ b/sw/source/filter/inc/wrtswtbl.hxx
@@ -0,0 +1,375 @@
/*************************************************************************
 *
 *  $RCSfile: wrtswtbl.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:54 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef  _WRTSWTBL_HXX
#define  _WRTSWTBL_HXX

#ifndef _SOLAR_H
#include <tools/solar.h>
#endif
#ifndef _TOOLS_COLOR_HXX
#include <tools/color.hxx>
#endif
#ifndef _SVARRAY_HXX
#include <svtools/svarray.hxx>
#endif

#ifndef _ORNTENUM_HXX
#include <orntenum.hxx>
#endif
#ifndef _HORIORNT_HXX
#include <horiornt.hxx>
#endif

class Color;
class SwTableBox;
class SwTableBoxes;
class SwTableLine;
class SwTableLines;
class SwTable;
class SwFrmFmt;
class SwHTMLTableLayout;
class SvxBrushItem;
class SvxBoxItem;
class SvxBorderLine;


//---------------------------------------------------------------------------
//       Code aus dem HTML-Filter fuers schreiben von Tabellen
//---------------------------------------------------------------------------

#define COLFUZZY 20
#define ROWFUZZY 20
#define COL_DFLT_WIDTH ((2*COLFUZZY)+1)
#define ROW_DFLT_HEIGHT (2*ROWFUZZY)+1


//-----------------------------------------------------------------------

class SwWriteTableCell
{
    const SwTableBox *pBox;     // SwTableBox der Zelle
    const SvxBrushItem *pBackground;    // geerbter Hintergrund einer Zeile

    long nHeight;               // fixe/Mindest-Hoehe der Zeile

    USHORT nWidthOpt;           // Breite aus Option;

    USHORT nRow;                // Start-Zeile
    USHORT nCol;                // Start-Spalte

    USHORT nRowSpan;            // ueberspannte Zeilen
    USHORT nColSpan;            // ueberspannte Spalten


    BOOL bPrcWidthOpt;

public:

    SwWriteTableCell( const SwTableBox *pB, USHORT nR, USHORT nC,
                        USHORT nRSpan, USHORT nCSpan, long nHght,
                        const SvxBrushItem *pBGround ) :
        pBox( pB ),
        nRow( nR ), nCol( nC ),
        nRowSpan( nRSpan ), nColSpan( nCSpan ),
        nHeight( nHght ), pBackground( pBGround ),
        nWidthOpt( 0 ), bPrcWidthOpt( FALSE )
    {}

    const SwTableBox *GetBox() const { return pBox; }

    USHORT GetRow() const { return nRow; }
    USHORT GetCol() const { return nCol; }

    USHORT GetRowSpan() const { return nRowSpan; }
    USHORT GetColSpan() const { return nColSpan; }

    long GetHeight() const { return nHeight; }
    SwVertOrient GetVertOri() const;

    const SvxBrushItem *GetBackground() const { return pBackground; }

    void SetWidthOpt( USHORT nWidth, BOOL bPrc )
    {
        nWidthOpt = nWidth; bPrcWidthOpt = bPrc;
    }

    USHORT GetWidthOpt() const { return nWidthOpt; }
    BOOL HasPrcWidthOpt() const { return bPrcWidthOpt; }
};

typedef SwWriteTableCell *SwWriteTableCellPtr;
SV_DECL_PTRARR_DEL( SwWriteTableCells, SwWriteTableCellPtr, 5, 5 )


//-----------------------------------------------------------------------

class SwWriteTableRow
{
    SwWriteTableCells aCells;       // Alle Zellen der Rows

    const SvxBrushItem *pBackground;// Hintergrund

    long nPos;                  // End-Position (twips) der Zeile

public:

    USHORT nTopBorder;              // Dicke der oberen/unteren Umrandugen
    USHORT nBottomBorder;

    BOOL bTopBorder : 1;            // Welche Umrandungen sind da?
    BOOL bBottomBorder : 1;

    SwWriteTableRow( long nPos );

    SwWriteTableCell *AddCell( const SwTableBox *pBox,
                                 USHORT nRow, USHORT nCol,
                                 USHORT nRowSpan, USHORT nColSpan,
                                 long nHeight,
                                 const SvxBrushItem *pBackground );

    void SetBackground( const SvxBrushItem *pBGround )
    {
        pBackground = pBGround;
    }
    const SvxBrushItem *GetBackground() const { return pBackground; }

    BOOL HasTopBorder() const                   { return bTopBorder; }
    BOOL HasBottomBorder() const                { return bBottomBorder; }

    long GetPos() const                         { return nPos; }
    const SwWriteTableCells& GetCells() const   { return aCells; }

    inline int operator==( const SwWriteTableRow& rRow ) const;
    inline int operator<( const SwWriteTableRow& rRow2 ) const;
};

inline int SwWriteTableRow::operator==( const SwWriteTableRow& rRow ) const
{
    // etwas Unschaerfe zulassen
    return (nPos >= rRow.nPos ? nPos - rRow.nPos
                               : rRow.nPos - nPos ) <= ROWFUZZY;
}

inline int SwWriteTableRow::operator<( const SwWriteTableRow& rRow ) const
{
    // Da wir hier nur die Wahrheits-Grade 0 und 1 kennen, lassen wir lieber
    // auch nicht zu, dass x==y und x<y gleichzeitig gilt ;-)
    return nPos < rRow.nPos - ROWFUZZY;
}

typedef SwWriteTableRow *SwWriteTableRowPtr;
SV_DECL_PTRARR_SORT_DEL( SwWriteTableRows, SwWriteTableRowPtr, 5, 5 )


//-----------------------------------------------------------------------

class SwWriteTableCol
{
    USHORT nPos;                        // End Position der Spalte

    USHORT nWidthOpt;

    BOOL bRelWidthOpt : 1;
    BOOL bOutWidth : 1;                 // Spaltenbreite ausgeben?

public:
    BOOL bLeftBorder : 1;               // Welche Umrandungen sind da?
    BOOL bRightBorder : 1;

    SwWriteTableCol( USHORT nPosition );

    USHORT GetPos() const                       { return nPos; }

    void SetLeftBorder( BOOL bBorder )          { bLeftBorder = bBorder; }
    BOOL HasLeftBorder() const                  { return bLeftBorder; }

    void SetRightBorder( BOOL bBorder )         { bRightBorder = bBorder; }
    BOOL HasRightBorder() const                 { return bRightBorder; }

    void SetOutWidth( BOOL bSet )               { bOutWidth = bSet; }
    BOOL GetOutWidth() const                    { return bOutWidth; }

    inline int operator==( const SwWriteTableCol& rCol ) const;
    inline int operator<( const SwWriteTableCol& rCol ) const;

    void SetWidthOpt( USHORT nWidth, BOOL bRel )
    {
        nWidthOpt = nWidth; bRelWidthOpt = bRel;
    }
    USHORT GetWidthOpt() const                  { return nWidthOpt; }
    BOOL HasRelWidthOpt() const                 { return bRelWidthOpt; }
};

inline int SwWriteTableCol::operator==( const SwWriteTableCol& rCol ) const
{
    // etwas Unschaerfe zulassen
    return (nPos >= rCol.nPos ? nPos - rCol.nPos
                                     : rCol.nPos - nPos ) <= COLFUZZY;
}

inline int SwWriteTableCol::operator<( const SwWriteTableCol& rCol ) const
{
    // Da wir hier nur die Wahrheits-Grade 0 und 1 kennen, lassen wir lieber
    // auch nicht zu, dass x==y und x<y gleichzeitig gilt ;-)
    return nPos < rCol.nPos - COLFUZZY;
}


typedef SwWriteTableCol *SwWriteTableColPtr;
SV_DECL_PTRARR_SORT_DEL( SwWriteTableCols, SwWriteTableColPtr, 5, 5 )

//-----------------------------------------------------------------------

class SwWriteTable
{
protected:
    SwWriteTableCols aCols; // alle Spalten
    SwWriteTableRows aRows; // alle Zellen

    UINT32 nBorderColor;        // Umrandungsfarbe

    USHORT nCellSpacing;        // Dicke der inneren Umrandung
    USHORT nCellPadding;        // Absatnd Umrandung-Inhalt

    USHORT nBorder;             // Dicke der ausseren Umrandung
    USHORT nInnerBorder;        // Dicke der inneren Umrandung
    USHORT nBaseWidth;          // Bezugsgroesse fur Breiten SwFmtFrmSize

    USHORT nHeadEndRow;         // letzte Zeile des Tabellen-Kopfes

    USHORT nLeftSub;
    USHORT nRightSub;

    long nTabWidth;             // Absolute/Relative Breite der Tabelle

    BOOL bRelWidths : 1;        // Breiten relativ ausgeben?
    BOOL bUseLayoutHeights : 1; // Layout zur Hoehenbestimmung nehmen?
#ifndef PRODUCT
    BOOL bGetLineHeightCalled : 1;
#endif

    BOOL bColsOption : 1;
    BOOL bColTags : 1;
    BOOL bLayoutExport : 1;
    BOOL bCollectBorderWidth : 1;

    virtual BOOL ShouldExpandSub( const SwTableBox *pBox,
                                BOOL bExpandedBefore, USHORT nDepth ) const;

    void CollectTableRowsCols( long nStartRPos, USHORT nStartCPos,
                               long nParentLineHeight,
                               USHORT nParentLineWidth,
                               const SwTableLines& rLines,
                               USHORT nDepth );

    void FillTableRowsCols( long nStartRPos, USHORT nStartRow,
                            USHORT nStartCPos, USHORT nStartCol,
                            long nParentLineHeight,
                            USHORT nParentLineWidth,
                            const SwTableLines& rLines,
                            const SvxBrushItem* pLineBrush,
                            USHORT nDepth );

    void MergeBorders( const SvxBorderLine* pBorderLine, BOOL bTable );

    USHORT MergeBoxBorders( const SwTableBox *pBox, USHORT nRow, USHORT nCol,
                            USHORT nRowSpan, USHORT nColSpan,
                            USHORT &rTopBorder, USHORT &rBottomBorder );

    USHORT GetBaseWidth() const { return nBaseWidth; }

    BOOL HasRelWidths() const { return bRelWidths; }

public:
    static long GetBoxWidth( const SwTableBox *pBox );
protected:

    long GetLineHeight( const SwTableLine *pLine );
    long GetLineHeight( const SwTableBox *pBox ) const;
    const SvxBrushItem *GetLineBrush( const SwTableBox *pBox,
                                      SwWriteTableRow *pRow );

    USHORT GetLeftSpace( USHORT nCol ) const;
    USHORT GetRightSpace( USHORT nCol, USHORT nColSpan ) const;

    USHORT GetRawWidth( USHORT nCol, USHORT nColSpan ) const;
    USHORT GetAbsWidth( USHORT nCol, USHORT nColSpan ) const;
    USHORT GetRelWidth( USHORT nCol, USHORT nColSpan ) const;
    USHORT GetPrcWidth( USHORT nCol, USHORT nColSpan ) const;

    long GetAbsHeight( long nRawWidth, USHORT nRow, USHORT nRowSpan ) const;

public:
    SwWriteTable( const SwTableLines& rLines, long nWidth, USHORT nBWidth,
                    BOOL bRel, USHORT nMaxDepth = USHRT_MAX,
                    USHORT nLeftSub=0, USHORT nRightSub=0 );
    SwWriteTable( const SwHTMLTableLayout *pLayoutInfo );

    const SwWriteTableCols& GetCols() const { return aCols; }
    const SwWriteTableRows& GetRows() const { return aRows; }
};




#endif

diff --git a/sw/source/filter/makefile.mk b/sw/source/filter/makefile.mk
new file mode 100644
index 0000000..cb186c7
--- /dev/null
+++ b/sw/source/filter/makefile.mk
@@ -0,0 +1,244 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:53 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=..$/..

PRJNAME=sw
TARGET=filter

PROJECTPCH=filt_pch
PDBTARGET=filt_pch
PROJECTPCHSOURCE=.\filt_1st\filt_pch

.IF "$(CALLTARGETS)"=="filter"
RC_SUBDIRS=
.ENDIF

# --- Settings -----------------------------------------------------

.INCLUDE :	$(PRJ)$/inc$/swpre.mk
.INCLUDE :	settings.mk
.INCLUDE :	$(PRJ)$/inc$/sw.mk

# --- Files --------------------------------------------------------

# fuer VC++/NT andere Label als Verzeichnisnamen
.IF "$(RC_SUBDIRS)" == ""
SWSUBDIRS= \
    filt_1st \
    ascii \
    basflt \
    excel \
    html \
    lotus \
    rtf \
    w4w \
    writer \
    ww1 \
    ww8 \
    xml

.IF "$(product)" == ""
.IF "$(GUI)" == "WIN" || "$(GUI)" == "WNT" || "$(GUI)" == "UNX"
SWSUBDIRS+= \
    debug
.ENDIF
.ENDIF

.IF "$(compact)" == ""
SWSUBDIRS+= \
    sw6
.ENDIF
.ENDIF

SUBLIBS= \
    $(SLB)$/ascii.lib \
    $(SLB)$/basflt.lib \
    $(SLB)$/excel.lib \
    $(SLB)$/html.lib \
    $(SLB)$/lotus.lib \
    $(SLB)$/rtf.lib \
    $(SLB)$/w4w.lib \
    $(SLB)$/writer.lib \
    $(SLB)$/ww1.lib \
    $(SLB)$/ww8.lib \
    $(SLB)$/xml.lib

.IF "$(product)" == ""
.IF "$(GUI)" == "WIN" || "$(GUI)" == "WNT" || "$(GUI)" == "UNX"
SUBLIBS+= \
    $(SLB)$/debug.lib
.ENDIF
.ENDIF
.IF "$(compact)" == ""
SUBLIBS+= \
     $(SLB)$/sw6.lib
.ENDIF

# -----------------------------------------------------------

.IF "$(RC_SUBDIRS)" == ""
.IF "$(depend)" == ""
filter: 					\
    filt_1st				\
    $(SWSUBDIRS)				\
    ALLTAR
.ELSE
filter:
    @+echo Doing nothing in source\filter
.ENDIF
.ENDIF

################################################################

LIB1TARGET=$(SLB)$/filter.lib
LIB1FILES= \
        $(SUBLIBS)

.INCLUDE :	target.mk

################################################################

.IF "$(dbutil)" != ""
dbutilx += "dbutil=true"
.ENDIF
.IF "$(debug)" != ""
.IF "$(debug)" != "D_FORCE_OPT"
dbutilx += "debug=true"
.ENDIF
.ENDIF


.IF "$(CALLTARGETS)"!="filter"
.IF "$(DOPLD)$(dopld)" == ""

.IF "$(RC_SUBDIRS)" == ""
#rule lib / subdir
$(SLB)$/%.lib : %
    @echo @

filt_1st .SETDIR=filt_1st:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(CALLMACROS)

ascii .SETDIR=ascii:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(CALLMACROS)

basflt .SETDIR=basflt:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(CALLMACROS)

debug .SETDIR=debug:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(CALLMACROS)

excel .SETDIR=excel:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(CALLMACROS)

html .SETDIR=html:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(CALLMACROS)

lotus .SETDIR=lotus:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(CALLMACROS)

rtf .SETDIR=rtf:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(CALLMACROS)

sw6 .SETDIR=sw6:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(CALLMACROS)

w4w .SETDIR=w4w:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(CALLMACROS)

writer .SETDIR=writer:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(CALLMACROS)

ww1 .SETDIR=ww1:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(CALLMACROS)

ww8 .SETDIR=ww8:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(CALLMACROS)

xml .SETDIR=xml:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(CALLMACROS)

.ENDIF
.ELSE
filt_1st:
    @echo nix
.ENDIF
.ENDIF

kill:
    del $(SLB)$/filter.lib

diff --git a/sw/source/filter/rtf/makefile.mk b/sw/source/filter/rtf/makefile.mk
new file mode 100644
index 0000000..194278f
--- /dev/null
+++ b/sw/source/filter/rtf/makefile.mk
@@ -0,0 +1,106 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:56 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=..$/..$/..

PRJNAME=sw
TARGET=rtf

PROJECTPCH=filt_pch
PROJECTPCHSOURCE=..\filt_1st\filt_pch

# --- Settings -----------------------------------------------------

.INCLUDE :  $(PRJ)$/inc$/swpre.mk
.INCLUDE :  settings.mk
.INCLUDE :  $(PRJ)$/inc$/sw.mk

.IF "$(mydebug)" != ""
CDEFS=$(CDEFS) -Dmydebug
.ENDIF

# --- Files --------------------------------------------------------

CXXFILES = \
        rtfatr.cxx \
        rtffld.cxx \
        rtffly.cxx \
        rtfnum.cxx \
        rtftbl.cxx \
        swparrtf.cxx \
        wrtrtf.cxx



SLOFILES =	\
        $(SLO)$/rtfatr.obj \
        $(SLO)$/rtffld.obj \
        $(SLO)$/rtffly.obj \
        $(SLO)$/rtfnum.obj \
        $(SLO)$/rtftbl.obj \
        $(SLO)$/swparrtf.obj \
        $(SLO)$/wrtrtf.obj

# --- Tagets -------------------------------------------------------

.INCLUDE :  target.mk

diff --git a/sw/source/filter/rtf/rtfatr.cxx b/sw/source/filter/rtf/rtfatr.cxx
new file mode 100644
index 0000000..1ecb25f
--- /dev/null
+++ b/sw/source/filter/rtf/rtfatr.cxx
@@ -0,0 +1,3068 @@
/*************************************************************************
 *
 *  $RCSfile: rtfatr.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:56 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

/*
 * Dieses File enthaelt alle Ausgabe-Funktionen des RTF-Writers;
 * fuer alle Nodes, Attribute, Formate und Chars.
 */

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#include <fltini.hxx>
#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#define ITEMID_BOXINFO      SID_ATTR_BORDER_INNER

#ifndef SVTOOLS_URIHELPER_HXX
#include <svtools/urihelper.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _RTFKEYWD_HXX //autogen
#include <svtools/rtfkeywd.hxx>
#endif
#ifndef _RTFOUT_HXX
#include <svtools/rtfout.hxx>
#endif
#ifndef _SFXITEMITER_HXX //autogen
#include <svtools/itemiter.hxx>
#endif
#ifndef _URLOBJ_HXX //autogen
#include <tools/urlobj.hxx>
#endif
#ifndef _SVX_HYZNITEM_HXX //autogen
#include <svx/hyznitem.hxx>
#endif
#ifndef _SVX_TSTPITEM_HXX //autogen
#include <svx/tstpitem.hxx>
#endif
#ifndef _SVX_LSPCITEM_HXX //autogen
#include <svx/lspcitem.hxx>
#endif
#ifndef _SVX_LANGITEM_HXX //autogen
#include <svx/langitem.hxx>
#endif
#ifndef _SVX_KEEPITEM_HXX //autogen
#include <svx/keepitem.hxx>
#endif
#ifndef _SVX_UDLNITEM_HXX //autogen
#include <svx/udlnitem.hxx>
#endif
#ifndef _SVX_SHADITEM_HXX //autogen
#include <svx/shaditem.hxx>
#endif
#ifndef _SVX_CMAPITEM_HXX //autogen
#include <svx/cmapitem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _SVX_PROTITEM_HXX //autogen
#include <svx/protitem.hxx>
#endif
#ifndef _SVX_OPAQITEM_HXX //autogen
#include <svx/opaqitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _SVX_PRNTITEM_HXX //autogen
#include <svx/prntitem.hxx>
#endif
#ifndef _SVX_COLRITEM_HXX //autogen
#include <svx/colritem.hxx>
#endif
#ifndef _SVX_ESCPITEM_HXX //autogen
#include <svx/escpitem.hxx>
#endif
#ifndef _SVX_FHGTITEM_HXX //autogen
#include <svx/fhgtitem.hxx>
#endif
#ifndef _SVX_SPLTITEM_HXX //autogen
#include <svx/spltitem.hxx>
#endif
#ifndef _SVX_ADJITEM_HXX //autogen
#include <svx/adjitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_CRSDITEM_HXX //autogen
#include <svx/crsditem.hxx>
#endif
#ifndef _SVX_CNTRITEM_HXX //autogen
#include <svx/cntritem.hxx>
#endif
#ifndef _SVX_POSTITEM_HXX //autogen
#include <svx/postitem.hxx>
#endif
#ifndef _SVX_SHDDITEM_HXX //autogen
#include <svx/shdditem.hxx>
#endif
#ifndef _SVX_WGHTITEM_HXX //autogen
#include <svx/wghtitem.hxx>
#endif
#ifndef _SVX_BRKITEM_HXX //autogen
#include <svx/brkitem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _XOUTBMP_HXX //autogen
#include <svx/xoutbmp.hxx>
#endif
#ifndef _UNOTOOLS_CHARCLASS_HXX
#include <unotools/charclass.hxx>
#endif


#ifndef _FRMATR_HXX
#include <frmatr.hxx>
#endif
#ifndef _CHARATR_HXX
#include <charatr.hxx>
#endif
#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _FMTPDSC_HXX //autogen
#include <fmtpdsc.hxx>
#endif
#ifndef _FMTORNT_HXX //autogen
#include <fmtornt.hxx>
#endif
#ifndef _FMTFLD_HXX //autogen
#include <fmtfld.hxx>
#endif
#ifndef _FMTFLCNT_HXX //autogen
#include <fmtflcnt.hxx>
#endif
#ifndef _FMTFTN_HXX //autogen
#include <fmtftn.hxx>
#endif
#ifndef _FMTHBSH_HXX //autogen
#include <fmthbsh.hxx>
#endif
#ifndef _FCHRFMT_HXX //autogen
#include <fchrfmt.hxx>
#endif
#ifndef _FMTCNTNT_HXX //autogen
#include <fmtcntnt.hxx>
#endif
#ifndef _FMTHDFT_HXX //autogen
#include <fmthdft.hxx>
#endif
#ifndef _FMTCLDS_HXX //autogen
#include <fmtclds.hxx>
#endif
#ifndef _TXTFTN_HXX //autogen
#include <txtftn.hxx>
#endif
#ifndef _FMTSRND_HXX //autogen
#include <fmtsrnd.hxx>
#endif
#ifndef _FMTANCHR_HXX //autogen
#include <fmtanchr.hxx>
#endif
#ifndef _CHARFMT_HXX //autogen
#include <charfmt.hxx>
#endif
#ifndef _FMTINFMT_HXX //autogen
#include <fmtinfmt.hxx>
#endif
#ifndef _TXTINET_HXX //autogen
#include <txtinet.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _DOCARY_HXX
#include <docary.hxx>
#endif
#ifndef _NDTXT_HXX
#include <ndtxt.hxx>
#endif
#ifndef _PAM_HXX
#include <pam.hxx>
#endif
#ifndef _PARATR_HXX
#include <paratr.hxx>
#endif
#ifndef _FLDBAS_HXX
#include <fldbas.hxx>           // fuer SwField ...
#endif
#ifndef _WRTRTF_HXX
#include <wrtrtf.hxx>
#endif
#ifndef _RTF_HXX
#include <rtf.hxx>          // fuer SwPictureType
#endif
#ifndef _WRTTXATR_HXX
#include <wrttxatr.hxx>     // fuer EndPosList (zwischenspeicher fuer TextAttr.=
#endif
#ifndef _NDGRF_HXX
#include <ndgrf.hxx>
#endif
#ifndef _GRFATR_HXX
#include <grfatr.hxx>
#endif
#ifndef _FMTCOL_HXX
#include <fmtcol.hxx>
#endif
#ifndef _DOCUFLD_HXX
#include <docufld.hxx>
#endif
#ifndef _FLDDAT_HXX
#include <flddat.hxx>
#endif
#ifndef _PAGEDESC_HXX
#include <pagedesc.hxx>     // fuer SwPageDesc ...
#endif
#ifndef _SWTABLE_HXX
#include <swtable.hxx>      // fuer SwPageDesc ...
#endif
#ifndef _LINETYPE_HXX
#include <linetype.hxx>     // fuer SwPageDesc ...
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _SWRECT_HXX //autogen
#include <swrect.hxx>
#endif
#ifndef _SECTION_HXX //autogen
#include <section.hxx>
#endif
#ifndef _WRTSWTBL_HXX
#include <wrtswtbl.hxx>
#endif
#ifndef _HTMLTBL_HXX
#include <htmltbl.hxx>
#endif
#ifndef _FMTCLBL_HXX
#include <fmtclbl.hxx>
#endif


/*
 * um nicht immer wieder nach einem Update festzustellen, das irgendwelche
 * Hint-Ids dazugekommen sind, wird hier definiert, die Groesse der Tabelle
 * definiert und mit der akt. verglichen. Bei unterschieden wird der
 * Compiler schon meckern.
 *
 * diese Section und die dazugeherigen Tabellen muessen in folgenden Files
 * gepflegt werden: rtf\rtfatr.cxx, sw6\sw6atr.cxx, w4w\w4watr.cxx
 */
#if !defined(UNX) && !defined(MSC) && !defined(PPC) && !defined(CSET) && !defined(__MWERKS__) && !defined(WTC)

#define ATTRFNTAB_SIZE 121
#if ATTRFNTAB_SIZE != POOLATTR_END - POOLATTR_BEGIN
#error Attribut-Tabelle ist ungueltigt. Wurden neue Hint-IDs zugefuegt ??
#endif

#ifdef FORMAT_TABELLE
// da sie nicht benutzt wird!
#define FORMATTAB_SIZE 7
#if FORMATTAB_SIZE != RES_FMT_END - RES_FMT_BEGIN
#error Format-Tabelle ist ungueltigt. Wurden neue Hint-IDs zugefuegt ??
#endif
#endif

#define NODETAB_SIZE 3
#if NODETAB_SIZE != RES_NODE_END - RES_NODE_BEGIN
#error Node-Tabelle ist ungueltigt. Wurden neue Hint-IDs zugefuegt ??
#endif

#endif

#ifdef WNT
// ueber xoutbmp.hxx wird das winuser.h angezogen. Dort gibt es ein
// define GetProp das mit unserem SvxEscapement kollidiert!
#undef GetProp
#endif

//-----------------------------------------------------------------------

static Writer& OutRTF_SwFmtCol( Writer& rWrt, const SfxPoolItem& rHt );

//-----------------------------------------------------------------------

SvStream& OutComment( Writer& rWrt, const sal_Char* pStr )
{
    return (rWrt.Strm() << '{' << sRTF_IGNORE << pStr);
}

SvStream& OutComment( Writer& rWrt, const char* pStr, BOOL bSetFlag )
{
    // setze Flag, damit bei der Ausgabe von Attributen zu erkennen,
    // ob ueberhaupt etwas ausgegeben wurde.
    ((SwRTFWriter&)rWrt).bOutFmtAttr = bSetFlag;
    return (rWrt.Strm() << '{' << sRTF_IGNORE << pStr);
}

Writer& OutRTF_AsByteString( Writer& rWrt, const String& rStr )
{
    ByteString sOutStr( rStr, DEF_ENCODING );
    rWrt.Strm() << sOutStr.GetBuffer();
    return rWrt;
}

// fuer die Formate muesste eine einzige Ausgabe-Funktion genuegen !
/*
 * Formate wie folgt ausgeben:
 *      - gebe alle Attribute vom Format aus
 */

Writer& OutRTF_SwFmt( Writer& rWrt, const SwFmt& rFmt )
{
    SwRTFWriter & rRTFWrt = (SwRTFWriter&)rWrt;
    BOOL bOutItemSet = TRUE;

    switch( rFmt.Which() )
    {
    case RES_CONDTXTFMTCOLL:
    case RES_TXTFMTCOLL:
        {
            USHORT nId = rRTFWrt.GetId( (const SwTxtFmtColl&)rFmt );
            if( 0 == nId )
                return rWrt;        // Default-TextStyle nicht ausgeben !!

            rWrt.Strm() << sRTF_S;
            rWrt.OutULong( nId );
            rRTFWrt.bOutFmtAttr = TRUE;
            BYTE nLvl = ((const SwTxtFmtColl&)rFmt).GetOutlineLevel();
            if( MAXLEVEL > nLvl )
            {
                BYTE nWWLvl = 8 >= nLvl ? nLvl : 8;
                rWrt.Strm() << sRTF_LS;
                rWrt.OutULong( rWrt.pDoc->GetNumRuleTbl().Count() );
                rWrt.Strm() << sRTF_ILVL; rWrt.OutULong( nWWLvl );
                rWrt.Strm() << sRTF_OUTLINELEVEL; rWrt.OutULong( nWWLvl );
                if( nWWLvl != nLvl )            // RTF-kennt nur 9 Ebenen
                {
                    OutComment( rWrt, sRTF_SOUTLVL );
                    rWrt.OutULong( nLvl ) << '}';
                }

                const SwNumFmt* pNFmt = &rWrt.pDoc->GetOutlineNumRule()->Get( nLvl );
                if( pNFmt->GetAbsLSpace() )
                {
                    SfxItemSet aSet( *rFmt.GetAttrSet().GetPool(),
                                    rFmt.GetAttrSet().GetRanges() );
                    aSet.SetParent( &rFmt.GetAttrSet() );
                    SvxLRSpaceItem aLR( (SvxLRSpaceItem&)aSet.Get( RES_LR_SPACE ) );

                    aLR.SetTxtLeft( aLR.GetTxtLeft() + pNFmt->GetAbsLSpace() );
                    aLR.SetTxtFirstLineOfst( pNFmt->GetFirstLineOffset() );

                    aSet.Put( aLR );
                    Out_SfxItemSet( aRTFAttrFnTab, rWrt, aSet, TRUE );
                    bOutItemSet = FALSE;
                }
            }
        }
        break;
    case RES_CHRFMT:
        {
            USHORT nId = rRTFWrt.GetId( (const SwCharFmt&)rFmt );
            if( 0 == nId )
                return rWrt;        // Default-CharStyle nicht ausgeben !!

            rWrt.Strm() << sRTF_IGNORE << sRTF_CS;
            rWrt.OutULong( nId );
            rRTFWrt.bOutFmtAttr = TRUE;
        }
        break;

//  case RES_GRFFMTCOLL:
// ?????
    }

    if( bOutItemSet )
        Out_SfxItemSet( aRTFAttrFnTab, rWrt, rFmt.GetAttrSet(), TRUE );
    return rWrt;
}



void OutRTF_SwFlyFrmFmt( SwRTFWriter& rRTFWrt )
{
    // ist der aktuelle Absatz in einem freifliegenden Rahmen ? Dann
    // muessen noch die Attribute dafuer ausgegeben werden.
    ASSERT( rRTFWrt.pFlyFmt, "wo ist das Fly-Format?" );

    if( rRTFWrt.bOutFmtAttr )
    {
        rRTFWrt.Strm() << ' ';
        rRTFWrt.bOutFmtAttr = FALSE;
    }
    // gebe erstmal alle RTF-Spezifischen Attribute aus
    rRTFWrt.bRTFFlySyntax = TRUE;
    OutRTF_SwFmt( rRTFWrt, *rRTFWrt.pFlyFmt );

    // dann gebe alle eigenen Attribute aus
    {
        // dazu erzeuge einen temp strstream, um festzustellen ob es
        // ueberhaupt eigene Attribute gibt !
        SvMemoryStream aTmpStrm;
        SvStream* pSaveStrm = &rRTFWrt.Strm();
        rRTFWrt.SetStrm( aTmpStrm );

        rRTFWrt.bRTFFlySyntax = FALSE;
        OutRTF_SwFmt( rRTFWrt, *rRTFWrt.pFlyFmt );

        rRTFWrt.SetStrm( *pSaveStrm );  // Stream-Pointer wieder zurueck

        if( aTmpStrm.GetSize() )            // gibt es SWG spezifische Attribute ??
        {
            aTmpStrm.Seek( 0L );
            rRTFWrt.Strm() << '{' << sRTF_IGNORE << aTmpStrm << '}';
        }
    }
//  rRTFWrt.pFlyFmt = 0;        // wieder zuruecksetzen !!
}

/* Ausgabe der Nodes */

/*
 *  Ausgabe der Texte-Attribute:
 *      Die Text-Attribute sind in einem VarArray nach ihren Start-Positionen
 *      sortiert. Fuer den RTF-Writer ist aber auch das Ende von Bedeutung.
 *      Darum die Idee, sobald im SwpHints-Array ein Attribut mit der Start-
 *      Position gefunden wurde, in einem Sortierten-Array die Endposition
 *      zu speichern. Sobald der Writer die Position erreicht hat, wird die
 *      schliessende Klammer ausgegeben und die Position aus dem Sort.Array
 *      geloescht.
 *  15.3.93: Es reicht leider nicht aus nur Start und End zuspeichern, denn
 *      im SwpHints Array stehen sie nicht nach Ende sortiert, so dass
 *      Attribute die falsche schliessende Klammer bekommen. (z.B
 *      Bold von 0..3, dann folgt Underline von 0..4. Dann bekommt Underline
 *      die schliessende Klammer von Bold !!)
 *      Also muessen erst alle Attribute einer Position gesammelt, nach
 *      Ende sortiert und dann erst ausgegeben werden.
 */

class RTFEndPosLst : public EndPosLst
{
public:
    RTFEndPosLst() {}
    void OutAttrs( Writer& rWrt, xub_StrLen nStrPos );
    void EndAttrs( SwRTFWriter& rWrt, xub_StrLen nStrPos );
};

void RTFEndPosLst::OutAttrs( Writer& rWrt, xub_StrLen nStrPos )
{
    SttEndPos* pStt;
    for( USHORT n = Count(); n ;  )
        if( nStrPos == (pStt = (*this)[ --n ])->GetStart() )
        {
            rWrt.Strm() << '{';
            for( USHORT i = 0; i < pStt->GetAttrs().Count(); ++i )
                Out( aRTFAttrFnTab, pStt->GetAttrs()[i]->GetAttr(), rWrt );
        }
}

void RTFEndPosLst::EndAttrs( SwRTFWriter& rWrt, xub_StrLen nStrPos )
{
    SttEndPos* pSEPos;
    while( 0 != Count() && 0 != (pSEPos = (*this)[ 0 ]) &&
            ( STRING_MAXLEN == nStrPos || nStrPos == pSEPos->GetEnd() ))
    {
        rWrt.Strm() << '}';

        const _SwpTxtHts& rAttrs = pSEPos->GetAttrs();
        for( USHORT nAttr = rAttrs.Count(); nAttr; )
            if( RES_TXTATR_INETFMT == rAttrs[ --nAttr ]->Which() )
            {
                // Hyperlinks werden als Felder geschrieben, aber der
                // "FieldResult" steht als Text im TextNode. Also muss
                // bei diesen Attributen am Ende 2 Klammern stehen!
                rWrt.Strm() << "}}";
            }

        rWrt.nFontHeight = pSEPos->GetFontSize();
        Remove();
    }

}

static Writer& OutRTF_SwTxtNode( Writer& rWrt, SwCntntNode & rNode )
{
    SwTxtNode * pNd = &((SwTxtNode&)rNode);
    SwRTFWriter & rRTFWrt = (SwRTFWriter&)rWrt;
    RTFEndPosLst aEndPosLst;
    SttEndPos* pNewStt;
    USHORT nAttrPos = 0;
    xub_StrLen nStrPos = rRTFWrt.pCurPam->GetPoint()->nContent.GetIndex();

    const String& rStr = pNd->GetTxt();
    xub_StrLen nEnde = rStr.Len();
    if( rRTFWrt.pCurPam->GetPoint()->nNode == rRTFWrt.pCurPam->GetMark()->nNode )
        nEnde = Min( nEnde, rRTFWrt.pCurPam->GetMark()->nContent.GetIndex() );

    int bNewFmts = rRTFWrt.pAttrSet != &pNd->GetSwAttrSet();
    if( bNewFmts )
    {
        // harte Attributierung am Node und am Vorgaenger ?
        const SfxItemSet* pNdSet = pNd->GetpSwAttrSet();
        if( pNdSet && rRTFWrt.pAttrSet && rRTFWrt.bAutoAttrSet &&
            pNdSet->GetParent() == rRTFWrt.pAttrSet->GetParent() &&
            pNdSet->Count() == rRTFWrt.pAttrSet->Count() )
        {
            // die beiden Parents sind gleich, dann teste doch mal die
            // Attribute im Set

            int bEqual = TRUE;
            if( pNdSet->Count() )
            {
                SfxItemIter aIter( *rRTFWrt.pAttrSet );
                const SfxPoolItem *pItem, *pCurr = aIter.GetCurItem();
                while( TRUE )
                {
                    if( SFX_ITEM_SET != pNdSet->GetItemState( pCurr->Which(),
                        FALSE, &pItem ) || *pItem != *pCurr )
                    {
                        bEqual = FALSE;
                        break;
                    }

                    if( aIter.IsAtEnd() )
                        break;
                    pCurr = aIter.NextItem();
                }
            }
            if( bEqual )
                bNewFmts = FALSE;
        }
        rRTFWrt.pAttrSet = &pNd->GetSwAttrSet();
        rRTFWrt.bAutoAttrSet = 0 != pNdSet;
    }

    // bestimme die aktuelle FontSize aus den Formaten
    rRTFWrt.nFontHeight = (USHORT)rRTFWrt.pAttrSet->GetSize().GetHeight();

    // Flag zuruecksetzen, damit nach der Ausgabe der Collection
    // getestet werden kann, ob noch ein Blank auszugeben ist
    rRTFWrt.bOutFmtAttr = FALSE;

    // in der Ausgabe eines Flys? Dann vorm ausgeben der AbsatzAttribute
    // den Format-Pointer auf 0 setzen!
    SwFlyFrmFmt* pSaveFmt = rRTFWrt.pFlyFmt;

    if( bNewFmts && rRTFWrt.bWriteAll )
    {
        rRTFWrt.Strm() << sRTF_PARD << sRTF_PLAIN << ' ';       // alle Attribute zuruecksetzen
        if( rRTFWrt.bOutTable )
            rRTFWrt.Strm() << sRTF_INTBL;

        // ist der aktuelle Absatz in einem freifliegenden Rahmen ? Dann
        // muessen noch die Attribute dafuer ausgegeben werden.
        if( pSaveFmt )
        {
            OutRTF_SwFlyFrmFmt( rRTFWrt );
            rRTFWrt.pFlyFmt = 0;
        }

        rRTFWrt.OutListNum( *pNd );

        OutRTF_SwFmt( rRTFWrt, pNd->GetAnyFmtColl() );
    }

    // gibt es harte Attributierung ?
    if( bNewFmts && pNd->GetpSwAttrSet() )
    {
        rRTFWrt.pFlyFmt = 0;

        const SfxItemSet& rNdSet = pNd->GetSwAttrSet();

        const SwNumRule* pRule;
        const SwNodeNum* pNum;
        if( (( 0 != ( pNum = pNd->GetNum() ) &&
                0 != ( pRule = pNd->GetNumRule() )) ||
                ( 0 != ( pNum = pNd->GetOutlineNum() ) &&
                0 != ( pRule = rWrt.pDoc->GetOutlineNumRule() ) ) ) &&
                pNum->GetLevel() < NO_NUM )
        {
            BYTE nLvl = GetRealLevel( pNum->GetLevel() );
            const SwNumFmt* pFmt = pRule->GetNumFmt( nLvl );
            if( !pFmt )
                pFmt = &pRule->Get( nLvl );

            SfxItemSet aSet( rNdSet );
            SvxLRSpaceItem aLR( (SvxLRSpaceItem&)rNdSet.Get( RES_LR_SPACE ) );

            aLR.SetTxtLeft( aLR.GetTxtLeft() + pFmt->GetAbsLSpace() );
            if( MAXLEVEL > pNum->GetLevel() )
                aLR.SetTxtFirstLineOfst( pFmt->GetFirstLineOffset() );
            else
                aSet.ClearItem( RES_PARATR_NUMRULE );
            aSet.Put( aLR );
            Out_SfxItemSet( aRTFAttrFnTab, rWrt, aSet, FALSE );
        }
        else
            Out_SfxItemSet( aRTFAttrFnTab, rWrt, rNdSet, FALSE );
    }

    rRTFWrt.pFlyFmt = pSaveFmt;

    // erstmal den Start berichtigen. D.h. wird nur ein Teil vom Satz
    // ausgegeben, so muessen auch da die Attribute stimmen!!
    const SwTxtAttr * pHt = 0;
    USHORT nCntAttr = pNd->HasHints() ? pNd->GetSwpHints().Count() : 0;
    if( nCntAttr && nStrPos > *( pHt = pNd->GetSwpHints()[ 0 ] )->GetStart() )
    {
        rRTFWrt.bTxtAttr = TRUE;
        // Ok, es gibt vorher Attribute, die ausgegeben werden muessen
        do {
            nAttrPos++;
            if( RES_TXTATR_FIELD == pHt->Which() )      // Felder nicht
                continue;                               // ausgeben

            if( pHt->GetEnd() )
            {
                xub_StrLen nHtEnd = *pHt->GetEnd(), nHtStt = *pHt->GetStart();
                if( !rRTFWrt.bWriteAll && nHtEnd <= nStrPos )
                    continue;

                // leere Hints am Anfang nicht beachten, oder ??
                if( nHtEnd == nHtStt )
                    continue;

                // Attribut in die Liste aufnehemen
                if( !rRTFWrt.bWriteAll )
                {
                    if( nHtStt < nStrPos ) nHtStt = nStrPos;
                    if( nHtEnd >= nEnde ) nHtEnd = nEnde;
                }
                pNewStt = new SttEndPos( pHt, nHtStt, nHtEnd, rRTFWrt.nFontHeight );

                aEndPosLst.Insert( pNewStt );
                continue;
                // aber nicht ausgeben, das erfolgt spaeter !!
            }
            Out( aRTFAttrFnTab, pHt->GetAttr(), rRTFWrt );

        } while( nAttrPos < nCntAttr && nStrPos >
            *( pHt = pNd->GetSwpHints()[ nAttrPos ] )->GetStart() );

        // dann gebe mal alle gesammelten Attribute von der String-Pos aus
        aEndPosLst.OutAttrs( rRTFWrt, nStrPos );

        rRTFWrt.bTxtAttr = FALSE;
    }

    if( !rRTFWrt.bWriteAll && rRTFWrt.bFirstLine )
    {
        if( rRTFWrt.bOutFmtAttr )
        {
            rRTFWrt.Strm() << ' ';
            rRTFWrt.bOutFmtAttr = FALSE;
        }
        OutRTF_SwFmt( rRTFWrt, pNd->GetAnyFmtColl() );
    }

    if( rRTFWrt.bOutFmtAttr &&
        ( nAttrPos < nCntAttr ? *pHt->GetStart() != nStrPos : TRUE ))
        rRTFWrt.Strm() << ' ';

    // das Flag gibt an, ob das SwTxtFld am Ende vom Absatz steht. Denn
    // dann ist vor dem Absatzumbruch die schliessende Klammer auszugeben
    xub_StrLen nChrCnt = 0;
    for( ; nStrPos <= nEnde; nStrPos++ )
    {
        if( nStrPos != nEnde && aEndPosLst.Count() )
            aEndPosLst.EndAttrs( rRTFWrt, nStrPos );

        // versuche nach ungefaehr 255 Zeichen eine neue Zeile zu beginnen
        if( nChrCnt != ( nStrPos & 0xff00 ))
        {
            rWrt.Strm() << SwRTFWriter::sNewLine;
            nChrCnt = nStrPos & 0xff00;
        }

        if( nAttrPos < nCntAttr && *pHt->GetStart() == nStrPos
            && nStrPos != nEnde )
        {
            rRTFWrt.bTxtAttr = TRUE;
            rRTFWrt.bOutFmtAttr = FALSE;
            do {
                BOOL bEmpty = FALSE;
                if( pHt->GetEnd() )
                {
                    if( FALSE == (bEmpty = *pHt->GetEnd() == nStrPos) )
                    {
                        pNewStt = new SttEndPos( pHt, nStrPos, *pHt->GetEnd(),
                                                rRTFWrt.nFontHeight );
                        aEndPosLst.Insert( pNewStt );
                        continue;
                    }
                    rRTFWrt.Strm() << '{';
                }
                Out( aRTFAttrFnTab, pHt->GetAttr(), rRTFWrt );
                if( bEmpty )
                {
                    rRTFWrt.Strm() << '}';
                    rRTFWrt.bOutFmtAttr = FALSE;
                }
            } while( ++nAttrPos < nCntAttr && nStrPos ==
                *( pHt = pNd->GetSwpHints()[ nAttrPos ] )->GetStart() );

            // dann gebe mal alle gesammelten Attribute von der String-Pos aus
            aEndPosLst.OutAttrs( rRTFWrt, nStrPos );

            if( rRTFWrt.bOutFmtAttr )
                rRTFWrt.Strm() << ' ';
            rRTFWrt.bTxtAttr = FALSE;
        }

        rRTFWrt.OutBookmarks( nStrPos );

        if( nStrPos != nEnde )
            RTFOutFuncs::Out_Char( rWrt.Strm(), rStr.GetChar( nStrPos ),
                                    DEF_ENCODING, rRTFWrt.bWriteHelpFmt );
    }

    // noch eine schliesende Klammer da ??
    if( aEndPosLst.Count() )
        aEndPosLst.EndAttrs( rRTFWrt, USHRT_MAX );

    // wenn bis zum Ende vom Node, dann auch das AbsatzEnde ausgeben
    if( rRTFWrt.pCurPam->GetMark()->nNode.GetIndex() ==
        rRTFWrt.pCurPam->GetPoint()->nNode.GetIndex() )
    {
        if( pNd->Len() != rRTFWrt.pCurPam->GetMark()->nContent.GetIndex() )
            return rWrt;

        if( rRTFWrt.bOutTable )
        {
            rRTFWrt.Strm() << SwRTFWriter::sNewLine;
            return rWrt;
        }
    }

    rRTFWrt.Strm() << SwRTFWriter::sNewLine << sRTF_PAR << ' ';
    return rRTFWrt;
}



static Writer& OutRTF_SwGrfNode( Writer& rWrt, SwCntntNode & rNode )
{
    SwRTFWriter & rRTFWrt = (SwRTFWriter&)rWrt;
    SwGrfNode * pNd = &((SwGrfNode&)rNode);

    // ist der aktuelle Absatz in einem freifliegenden Rahmen ? Dann
    // muessen noch die Attribute dafuer ausgegeben werden.
    if( rRTFWrt.pFlyFmt )
        OutRTF_SwFlyFrmFmt( rRTFWrt );
    rRTFWrt.Strm() << "{{";

    // damit die eigenen Grafik-Attribute nach der PICT / import Anweisung
    // stehen, muessen die am Anfang ausgegeben werden.
    rRTFWrt.bOutFmtAttr = FALSE;
    OutRTF_SwFmt( rRTFWrt, *pNd->GetFmtColl() );

    if( rRTFWrt.bOutFmtAttr )       // wurde ueberhaupt ein Attrribut
        rRTFWrt.Strm() << "}{";     // ausgegeben ??

    String aCID;
    SwDocShell *pDocSh = rWrt.pDoc->GetDocShell();
    if( pDocSh )
    {
        const SfxPoolItem *pItem = pDocSh->GetItem( SID_ORIGURL );
        if( pItem )
        {
            aCID = ((const SfxStringItem *)pItem)->GetValue();
            ASSERT( aCID.Len(), "CID ohne Laenge!" );
        }
    }

    String aGrfNm;
    const SwMirrorGrf& rMirror = pNd->GetSwAttrSet().GetMirrorGrf();
    if( !pNd->IsLinkedFile() || RES_DONT_MIRROR_GRF != rMirror.GetValue() )
    {
        // Grafik als File-Referenz speichern (als JPEG-Grafik speichern)
        aGrfNm = *rWrt.GetOrigFileName();
        pNd->SwapIn( TRUE );
        ULONG nFlags = 0;
        switch( rMirror.GetValue() )
        {
        case RES_MIRROR_GRF_VERT:   nFlags = XOUTBMP_MIRROR_HORZ; break;
        case RES_MIRROR_GRF_HOR:    nFlags = XOUTBMP_MIRROR_VERT; break;
        case RES_MIRROR_GRF_BOTH:
            nFlags = XOUTBMP_MIRROR_VERT | XOUTBMP_MIRROR_HORZ;
            break;
        }

        Size aMM100Size;
        Size* pMM100Size = 0;
        if( rRTFWrt.pFlyFmt )
        {
            const SwFmtFrmSize& rSize = rRTFWrt.pFlyFmt->GetFrmSize();
            aMM100Size = OutputDevice::LogicToLogic( rSize.GetSize(),
                            MapMode( MAP_TWIP ), MapMode( MAP_100TH_MM ));
            pMM100Size = &aMM100Size;
        }

        USHORT nErr = XOutBitmap::WriteGraphic( pNd->GetGrf(), aGrfNm,
                String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "JPG" )),
                                                nFlags, pMM100Size );
        if( nErr )              // fehlerhaft, da ist nichts auszugeben
        {
            rRTFWrt.Strm() << "}}";
            return rWrt;
        }

        // MIB 17.7.97: Wenn Mail-Export, dann in eine file-URL draus machen,
        // damit wir spaeter auf ein file-Protokoll stossen.
        if( aCID.Len() )
            aGrfNm = URIHelper::SmartRelToAbs( aGrfNm );
    }
    else
    {
        pNd->GetFileFilterNms( &aGrfNm, 0 );
        if( aCID.Len() )
            rWrt.CopyLocalFileToINet( aGrfNm, TRUE );
    }

    if( aCID.Len() )
    {
        INetURLObject aURLObj( aGrfNm );
        if( INET_PROT_FILE==aURLObj.GetProtocol() )
        {
            String aLastName( aURLObj.GetLastName(
                                INetURLObject::DECODE_WITH_CHARSET ) );
            ASSERT( aLastName.Len(), "Dateiname ohne Laenge!" );
            GetAppCharClass().toLower( aLastName );

            aGrfNm.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "cid:" ));
            ((aGrfNm = aLastName) += '.') += aCID;
        }
        else
            aGrfNm = INetURLObject::AbsToRel( aGrfNm,
                                        INetURLObject::WAS_ENCODED,
                                        INetURLObject::DECODE_WITH_CHARSET );
    }
    else
    {
        // MIB->JP: Warum erst AbsToRel und dann das URL-Objekt? So
        // kommt bei relativierbaren URLs als Protokoll "unknown" raus.
        // Ist das Absicht?
        aGrfNm = INetURLObject::AbsToRel( aGrfNm, INetURLObject::WAS_ENCODED,
                                        INetURLObject::DECODE_WITH_CHARSET );
        INetURLObject aUrl( aGrfNm );
        if( aUrl.GetProtocol() == INET_PROT_FILE )
            aGrfNm = aUrl.PathToFileName();
    }

    // Bitmap als File-Referenz speichern
    rRTFWrt.Strm() << sRTF_FIELD << sRTF_FLDPRIV;
    OutComment( rRTFWrt, sRTF_FLDINST ) << "{\\\\import ";
    RTFOutFuncs::Out_String( rWrt.Strm(), aGrfNm, DEF_ENCODING,
                                rRTFWrt.bWriteHelpFmt );
    rRTFWrt.Strm() << "}}{" << sRTF_FLDRSLT << " }}";

    rRTFWrt.Strm() << '}' << SwRTFWriter::sNewLine;
    return rRTFWrt;
}

static Writer& OutRTF_SwOLENode( Writer& rWrt, SwCntntNode & rNode )
{
    SwRTFWriter & rRTFWrt = (SwRTFWriter&)rWrt;

    // ist der aktuelle Absatz in einem freifliegenden Rahmen ? Dann
    // muessen noch die Attribute dafuer ausgegeben werden.
    if( rRTFWrt.pFlyFmt )
        OutRTF_SwFlyFrmFmt( rRTFWrt );

    rWrt.Strm() << SwRTFWriter::sNewLine << sRTF_PAR;
    return rWrt;
}


static void OutTBLBorderLine( SwRTFWriter& rWrt, const SvxBorderLine* pLine,
                                const sal_Char* pStr, USHORT nDist )
{
    ByteString sLineStr;
    if( pLine->GetInWidth() )
    {
        // doppelte Linie
        sLineStr = sRTF_BRDRDB;
        switch( pLine->GetInWidth() )
        {
        case DEF_LINE_WIDTH_0:
            ( sLineStr += sRTF_BRDRW ) += "15";
            break;
        case DEF_LINE_WIDTH_1:
            ( sLineStr += sRTF_BRDRW ) += "30";
            break;
        case DEF_LINE_WIDTH_2:
        case DEF_LINE_WIDTH_3:
            ( sLineStr += sRTF_BRDRW ) += "45";
            break;
        }
    }
    else
    {
        // einfache Linie
        if( DEF_LINE_WIDTH_1 >= pLine->GetOutWidth() )
            (( sLineStr = sRTF_BRDRS ) += sRTF_BRDRW ) +=
                        ByteString::CreateFromInt32( pLine->GetOutWidth() );
        else
            (( sLineStr = sRTF_BRDRTH ) += sRTF_BRDRW ) +=
                        ByteString::CreateFromInt32( pLine->GetOutWidth() / 2 );
    }

    rWrt.Strm() << pStr << sLineStr.GetBuffer() << sRTF_BRDRCF;
    rWrt.OutULong( rWrt.GetId( pLine->GetColor() ) ) << sRTF_BRSP;
    rWrt.OutULong( nDist );
}

static void OutSwTblBorder( SwRTFWriter& rWrt, const SvxBoxItem& rBox )
{
    static USHORT __READONLY_DATA aBorders[] = {
            BOX_LINE_TOP, BOX_LINE_LEFT, BOX_LINE_BOTTOM, BOX_LINE_RIGHT };
    static const char* __READONLY_DATA aBorderNames[] = {
            sRTF_CLBRDRT, sRTF_CLBRDRL, sRTF_CLBRDRB, sRTF_CLBRDRR };
    const USHORT* pBrd = aBorders;
    const char** pBrdNms = (const char**)aBorderNames;
    for( int i = 0; i < 4; ++i, ++pBrd, ++pBrdNms )
    {
        // funktioniert im WinWord so nicht
        USHORT nDist = 0; //rBox.GetDistance( *pBrd );
        const SvxBorderLine* pLn = rBox.GetLine( *pBrd );
        if( pLn )
            OutTBLBorderLine( rWrt, pLn, *pBrdNms, nDist );
        else if( nDist )
        {
            rWrt.Strm() << *pBrdNms << sRTF_BRSP;
            rWrt.OutULong( nDist );
        }
    }
}

static void OutSwTblBackground( SwRTFWriter& rWrt, const SvxBrushItem& rBack )
{
    if( !rBack.GetColor().GetTransparency() )
    {
        rWrt.Strm() << sRTF_CLCBPAT;
        rWrt.OutULong( rWrt.GetId( rBack.GetColor() ) );
    }
}


Writer& OutRTF_SwTblNode( Writer& rWrt, SwTableNode & rNode )
{
    SwRTFWriter & rRTFWrt = (SwRTFWriter&)rWrt;
    const SwTable& rTbl = rNode.GetTable();
    const SwTableLines& rLns = rTbl.GetTabLines();
    SwTwips nPageSize = 0, nTblOffset = 0;

/*
//!!!!!!!!!!!!! for clipboard create any view if the table is complex !!!
    if( rTbl.IsTblComplex() )
    {
        // then we have to create any layout
        SFX_APP()->CreateViewFrame( *xDocSh, 0, TRUE );
    }
*/

    {
        Point aPt;
        SwRect aRect( rTbl.GetFrmFmt()->FindLayoutRect( FALSE, &aPt ));
        if( aRect.IsEmpty() )
        {
            // dann besorge mal die Seitenbreite ohne Raender !!
            const SwFrmFmt* pFmt = rRTFWrt.pFlyFmt ? rRTFWrt.pFlyFmt :
                rWrt.pDoc->GetPageDesc(0).GetPageFmtOfNode( rNode, FALSE );

            aRect = pFmt->FindLayoutRect( TRUE );
            if( 0 == ( nPageSize = aRect.Width() ))
            {
                const SvxLRSpaceItem& rLR = pFmt->GetLRSpace();
                nPageSize = pFmt->GetFrmSize().GetWidth() -
                                rLR.GetLeft() - rLR.GetRight();
            }
        }
        else
            nPageSize = aRect.Width();
    }

    SwTwips nTblSz = rTbl.GetFrmFmt()->GetFrmSize().GetWidth();

    ByteString aTblAdjust( sRTF_TRQL );
    switch( rTbl.GetFrmFmt()->GetHoriOrient().GetHoriOrient() )
    {
    case HORI_CENTER:   aTblAdjust = sRTF_TRQC; break;
    case HORI_RIGHT:    aTblAdjust = sRTF_TRQR; break;
    case HORI_NONE:
    case HORI_LEFT_AND_WIDTH:
            {
                const SvxLRSpaceItem& rLRSp = rTbl.GetFrmFmt()->GetLRSpace();
                nTblOffset = rLRSp.GetLeft();
                nPageSize -= (nTblOffset + rLRSp.GetRight());
                aTblAdjust += sRTF_TRLEFT;
                aTblAdjust += ByteString::CreateFromInt32( nTblOffset );
            }
            break;
//  case case FLY_HORI_FULL:
    }

    // ist die Tabelle wesentlich (PageSize + 10%) groesser als die Seite,
    // dann sind die Box-Breiten relative Angaben.
    BOOL bRelBoxSize = TRUE /*ALWAYS relativ (nPageSize + ( nPageSize / 10 )) < nTblSz*/;

    SwWriteTable* pTableWrt;
    const SwHTMLTableLayout *pLayout = rTbl.GetHTMLTableLayout();
    if( pLayout && pLayout->IsExportable() )
        pTableWrt = new SwWriteTable( pLayout );
    else
        pTableWrt = new SwWriteTable( rTbl.GetTabLines(), (USHORT)nPageSize,
                                          (USHORT)nTblSz, FALSE );

    // rCols are the array of all cols of the table
    const SwWriteTableCols& rCols = pTableWrt->GetCols();
    USHORT nColCnt = rCols.Count();
    SwWriteTableCellPtr* pBoxArr = new SwWriteTableCellPtr[ nColCnt ];
    USHORT* pRowSpans = new USHORT[ nColCnt ];
    memset( pBoxArr, 0, sizeof( pBoxArr[0] ) * nColCnt );
    memset( pRowSpans, 0, sizeof( pRowSpans[0] ) * nColCnt );
    long nLastHeight = 0;
    const SwWriteTableRows& rRows = pTableWrt->GetRows();
    for( USHORT nLine = 0; nLine < rRows.Count(); ++nLine )
    {
        USHORT nBox;

        const SwWriteTableRow *pRow = rRows[ nLine ];
        const SwWriteTableCells& rCells = pRow->GetCells();

        BOOL bFixRowHeight = FALSE;
        for( nColCnt = 0, nBox = 0; nBox < rCells.Count(); ++nColCnt )
        {
            if( !pRowSpans[ nColCnt ] )
            {
                // set new BoxPtr
                SwWriteTableCell* pCell = rCells[ nBox++ ];
                pBoxArr[ nColCnt ] = pCell;
                pRowSpans[ nColCnt ] = pCell->GetRowSpan();
                for( USHORT nCellSpan = pCell->GetColSpan(), nCS = 1;
                        nCS < nCellSpan; ++nCS, ++nColCnt )
                {
                    pBoxArr[ nColCnt+1 ] = pBoxArr[ nColCnt ];
                    pRowSpans[ nColCnt+1 ] = pRowSpans[ nColCnt ];
                }
            }
            if( 1 != pRowSpans[ nColCnt ] )
                bFixRowHeight = TRUE;
        }

        for( ; nColCnt < rCols.Count() && pRowSpans[ nColCnt ]; ++nColCnt )
            bFixRowHeight = TRUE;

        // Start Tabellendefinition
        rWrt.Strm() << sRTF_TROWD << aTblAdjust.GetBuffer();

        if( !nLine && rTbl.IsHeadlineRepeat() )
            rWrt.Strm() << sRTF_TRHDR;

        // Zeilenhoehe ausgeben
        long nHeight = 0;
        if( bFixRowHeight && rWrt.pDoc->GetRootFrm() )
        {
            nHeight = -pRow->GetPos();      //neg. => abs. height!
            if( nLine )
                nHeight += rRows[ nLine - 1 ]->GetPos();

            // merged line -> dont split it
            rWrt.Strm() << sRTF_TRKEEP;
        }
        else
        {
            const SwTableLine* pLine = pBoxArr[ 0 ]->GetBox()->GetUpper();
            const SwFmtFrmSize& rLSz = pLine->GetFrmFmt()->GetFrmSize();
            if( ATT_VAR_SIZE != rLSz.GetSizeType() && rLSz.GetHeight() )
                nHeight = ATT_MIN_SIZE == rLSz.GetSizeType()
                                                ? rLSz.GetHeight()
                                                : -rLSz.GetHeight();
        }
        if( nHeight )
        {
            rWrt.Strm() << sRTF_TRRH;
            rWrt.OutLong( nHeight );
        }

        // Breite der Boxen ausgeben
        SwTwips nSz = 0, nCalc;
        for( nBox = 0; nBox < nColCnt; ++nBox )
        {
            SwWriteTableCell* pCell = pBoxArr[ nBox ];
            if( nBox && pBoxArr[ nBox-1 ] == pBoxArr[ nBox ] )
                continue;

            const SwFrmFmt& rFmt = *pCell->GetBox()->GetFrmFmt();
            if( 1 < pCell->GetRowSpan() )
                rWrt.Strm() << ( pCell->GetRowSpan() == pRowSpans[ nBox ]
                                ? sRTF_CLVMGF
                                : sRTF_CLVMRG );

            const SfxPoolItem* pItem;
            if( SFX_ITEM_SET == rFmt.GetAttrSet().GetItemState(
                                            RES_BOX, TRUE, &pItem ) )
                OutSwTblBorder( rRTFWrt, (SvxBoxItem&)*pItem );

// RTF kennt Schattierung in unserem Sinne nicht!
//              if( SFX_ITEM_SET == pBoxFmt->GetAttrSet().GetItemState(
//                                          RES_SHADOW, TRUE, &pItem ) )
//                  OutSwTblShadow( rRTFWrt, *pItem );

            if( SFX_ITEM_SET == rFmt.GetAttrSet().GetItemState(
                                            RES_BACKGROUND, TRUE, &pItem )
                || 0 != ( pItem = pCell->GetBackground() )
                || 0 != ( pItem = pRow->GetBackground() ) )
                OutSwTblBackground( rRTFWrt, (SvxBrushItem&)*pItem );

            if( SFX_ITEM_SET == rFmt.GetAttrSet().GetItemState(
                                            RES_VERT_ORIENT, TRUE, &pItem ) )
                switch( ((SwFmtVertOrient*)pItem)->GetVertOrient() )
                {
                case VERT_CENTER:   rWrt.Strm() << sRTF_CLVERTALC; break;
                case VERT_BOTTOM:   rWrt.Strm() << sRTF_CLVERTALB; break;
                default:            rWrt.Strm() << sRTF_CLVERTALT; break;
                }

            const SwFmtFrmSize& rLSz = rFmt.GetFrmSize();
            nSz += rLSz.GetWidth();
            rWrt.Strm() << sRTF_CELLX;

            nCalc = nSz;
            if( bRelBoxSize )
            {
                nCalc *= nPageSize;
                nCalc /= nTblSz;
            }
            rWrt.OutLong( nTblOffset + nCalc );
        }

        // Inhalt der Boxen ausgeben
        rWrt.Strm() << SwRTFWriter::sNewLine << sRTF_PARD << sRTF_INTBL;
        for( nBox = 0; nBox < nColCnt; ++nBox )
        {
            if( nBox && pBoxArr[ nBox-1 ] == pBoxArr[ nBox ] )
                continue;

            if( pBoxArr[ nBox ]->GetRowSpan() == pRowSpans[ nBox ] )
            {
                // new Box
                const SwStartNode* pSttNd = pBoxArr[ nBox ]->GetBox()->GetSttNd();
                RTFSaveData aSaveData( rRTFWrt,
                        pSttNd->GetIndex()+1, pSttNd->EndOfSectionIndex() );
                rRTFWrt.bOutTable = TRUE;
                rRTFWrt.Out_SwDoc( rRTFWrt.pCurPam );
            }
            rWrt.Strm() << sRTF_CELL;
        }

        // das wars mit der Line
        rWrt.Strm() << sRTF_ROW << sRTF_PARD << ' ';

        for( nBox = 0; nBox < nColCnt; ++nBox )
            --pRowSpans[ nBox ];
    }

    delete pTableWrt;
    delete pBoxArr;
    delete pRowSpans;

    // Pam hinter die Tabelle verschieben
    rRTFWrt.pCurPam->GetPoint()->nNode = *rNode.EndOfSectionNode();

    return rWrt;
}

Writer& OutRTF_SwSectionNode( Writer& rWrt, SwSectionNode& rNode )
{
    SwRTFWriter & rRTFWrt = (SwRTFWriter&)rWrt;
    const SwSection& rSect = rNode.GetSection();

    // folgt dahinter noch ein SectionNode? Dann wird erst die innere
    // Section aktiv. Hier wird die Verschachtelung aufgebrochen, weil
    // RTF das nicht kennt
    BOOL bPgDscWrite = FALSE;
    {
        SwNodeIndex aIdx( rNode, 1 );
        const SwNode& rNd = aIdx.GetNode();
        if( rNd.IsSectionNode() /*&& CONTENT_SECTION ==
            aIdx.GetNode().GetSectionNode()->GetSection().GetType()*/ )
            return rWrt;

        // falls als erstes Position ein Content- oder Tabellen-Node steht,
        // dann kann dieser einen PageDesc gesetzt haben und der muss vor
        // der Bereichsbeschreibung geschrieben werden!
        // Umgekehrt muss im OutBreaks dann
        if( rNd.IsCntntNode() )
        {
            bPgDscWrite = rRTFWrt.OutBreaks( ((SwCntntNode&)rNd).GetSwAttrSet() );
            rRTFWrt.bIgnoreNextPgBreak = TRUE;
        }
        else if( rNd.IsTableNode() )
        {
            bPgDscWrite = rRTFWrt.OutBreaks( ((SwTableNode&)rNd).GetTable().
                                            GetFrmFmt()->GetAttrSet() );
            rRTFWrt.bIgnoreNextPgBreak = TRUE;
        }
    }


//  if( CONTENT_SECTION == rSect.GetType() )
    {
        // als fortlaufenden Abschnittwechsel heraus schreiben
        if( !bPgDscWrite )
            rWrt.Strm() << sRTF_SECT << sRTF_SBKNONE;
        //JP 19.03.99 - es muss fuer den Import auf jedenfall das Cols
        //              Token geschrieben werden. Sonst kann nicht erkannt
        //              werden, wann ein PageDesc & eine Section gueltig ist
        rWrt.Strm() << sRTF_COLS << '1';
        rRTFWrt.bOutFmtAttr = TRUE;
        const SfxPoolItem* pItem;
        const SfxItemSet& rSet = rSect.GetFmt()->GetAttrSet();
        if( SFX_ITEM_SET == rSet.GetItemState( RES_COL, FALSE, &pItem ))
            OutRTF_SwFmtCol( rWrt, *pItem );
        else
            rWrt.Strm() << sRTF_COLS << '1' << sRTF_COLSX << '709';

        if( SFX_ITEM_SET == rSet.GetItemState( RES_COLUMNBALANCE,
            FALSE, &pItem ) && ((SwFmtNoBalancedColumns*)pItem)->GetValue() )
            OutComment( rWrt, sRTF_BALANCEDCOLUMN ) << '}';

        rWrt.Strm() << SwRTFWriter::sNewLine;
    }

    return rWrt;
}


/* File CHRATR.HXX: */

static Writer& OutRTF_SwFont( Writer& rWrt, const SfxPoolItem& rHt )
{
    /* trage den Font in die Font-Liste vom Writer ein und gebe hier nur
     *  die entsprechende Nummer aus. Der Font wird spaeter ueber diese
     * Tabelle im RTF-Dokument referenziert.
     */
    SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt;
    rRTFWrt.bOutFmtAttr = TRUE;

    rWrt.Strm() << sRTF_F;
    rWrt.OutULong( rRTFWrt.GetId( (const SvxFontItem&)rHt ) );
    return rWrt;
}

static Writer& OutRTF_SwPosture( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt;
    const FontItalic nPosture = ((const SvxPostureItem&)rHt).GetPosture();
    int bTxtOut = rRTFWrt.bTxtAttr && ITALIC_NONE == nPosture;
    if( ITALIC_NORMAL == nPosture || bTxtOut )
    {
        rRTFWrt.bOutFmtAttr = TRUE;
        rWrt.Strm() << sRTF_I;
    }
    if( bTxtOut )
        rWrt.Strm() << '0';     // wieder abschalten
    return rWrt;
}



static Writer& OutRTF_SwWeight( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt;
    const FontWeight nBold = ((const SvxWeightItem&)rHt).GetWeight();
    int bTxtOut = rRTFWrt.bTxtAttr && WEIGHT_NORMAL == nBold;
    if( WEIGHT_BOLD == nBold || bTxtOut )
    {
        rRTFWrt.bOutFmtAttr = TRUE;
        rWrt.Strm() << sRTF_B;
    }
    if( bTxtOut )
        rWrt.Strm() <<  '0';
    return rWrt;
}


static Writer& OutRTF_SwShadowed( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt;
    const BOOL bShadow = ((const SvxShadowedItem&)rHt).GetValue();
    int bTxtOut = rRTFWrt.bTxtAttr && !bShadow;
    if( bShadow || bTxtOut )
    {
        rRTFWrt.bOutFmtAttr = TRUE;
        rWrt.Strm() << sRTF_SHAD;
    }
    if( bTxtOut )
        rWrt.Strm() << '0';
    return rWrt;
}



static Writer& OutRTF_SwContour( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt;
    const BOOL bContour = ((const SvxContourItem&)rHt).GetValue();
    int bTxtOut = rRTFWrt.bTxtAttr && !bContour;
    if( bContour || bTxtOut )
    {
        rRTFWrt.bOutFmtAttr = TRUE;
        rWrt.Strm() << sRTF_OUTL;
    }
    if( bTxtOut )
        rWrt.Strm() << '0';
    return rWrt;
}



#ifdef USED
static Writer& OutRTF_SwKerning( Writer& rWrt, const SfxPoolItem& )
{
    return rWrt;
}
#endif


static Writer& OutRTF_SwCrossedOut( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt;
    const FontStrikeout nStrike = ((const SvxCrossedOutItem&)rHt).GetStrikeout();
    int bTxtOut = rRTFWrt.bTxtAttr && STRIKEOUT_NONE == nStrike;

    if( (STRIKEOUT_NONE != nStrike && STRIKEOUT_DONTKNOW != nStrike) || bTxtOut )
    {
        rRTFWrt.bOutFmtAttr = TRUE;
        if( STRIKEOUT_DOUBLE == nStrike )
            rWrt.Strm() << sRTF_STRIKEDL;
        else
            rWrt.Strm() << sRTF_STRIKE;
    }
    if( bTxtOut )
        rWrt.Strm() << '0';
    return rWrt;
}



static Writer& OutRTF_SwCaseMap( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt;
    switch( ((const SvxCaseMapItem&)rHt).GetValue() )
    {
    case SVX_CASEMAP_KAPITAELCHEN:
        rWrt.Strm() << sRTF_SCAPS;
        break;

    case SVX_CASEMAP_VERSALIEN:
        rWrt.Strm() << sRTF_CAPS;
        break;

    case SVX_CASEMAP_NOT_MAPPED:
        rWrt.Strm() << sRTF_CAPS << '0' << sRTF_SCAPS << '0';       // beide aus !!
        break;

    default:
        return rWrt;
    }

    rRTFWrt.bOutFmtAttr = TRUE;
    return rWrt;
}


static Writer& OutRTF_SwUnderline( Writer& rWrt, const SfxPoolItem& rHt )
{
    const char* pStr = 0;
    switch( ((const SvxUnderlineItem&)rHt).GetUnderline() )
    {
    case UNDERLINE_SINGLE:          pStr = sRTF_UL;         break;
    case UNDERLINE_DOUBLE:          pStr = sRTF_ULDB;       break;
    case UNDERLINE_NONE:            pStr = sRTF_ULNONE;     break;
    case UNDERLINE_DOTTED:          pStr = sRTF_ULD;        break;
    case UNDERLINE_DASH:            pStr = sRTF_ULDASH;     break;
    case UNDERLINE_DASHDOT:         pStr = sRTF_ULDASHD;    break;
    case UNDERLINE_DASHDOTDOT:      pStr = sRTF_ULDASHDD;   break;
    case UNDERLINE_BOLD:            pStr = sRTF_ULTH;       break;
    case UNDERLINE_WAVE:            pStr = sRTF_ULWAVE;     break;
    case UNDERLINE_BOLDDOTTED:      pStr = sRTF_ULTHD;      break;
    case UNDERLINE_BOLDDASH:        pStr = sRTF_ULTHDASH;   break;
    case UNDERLINE_LONGDASH:        pStr = sRTF_ULLDASH;    break;
    case UNDERLINE_BOLDLONGDASH:    pStr = sRTF_ULTHLDASH;  break;
    case UNDERLINE_BOLDDASHDOT:     pStr = sRTF_ULTHDASHD;  break;
    case UNDERLINE_BOLDDASHDOTDOT:  pStr = sRTF_ULTHDASHDD; break;
    case UNDERLINE_BOLDWAVE:        pStr = sRTF_ULHWAVE;    break;
    case UNDERLINE_DOUBLEWAVE:      pStr = sRTF_ULULDBWAVE; break;
    }

    if( pStr )
    {
        ((SwRTFWriter&)rWrt).Strm() << pStr;
        ((SwRTFWriter&)rWrt).bOutFmtAttr = TRUE;
    }
    return rWrt;
}



static Writer& OutRTF_SwLanguage( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt;
    rRTFWrt.bOutFmtAttr = TRUE;
    rWrt.Strm() << sRTF_LANG;
    rWrt.OutULong( ((const SvxLanguageItem&)rHt).GetLanguage() );
    return rWrt;
}



static Writer& OutRTF_SwEscapement( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt;
    const SvxEscapementItem& rEsc = (const SvxEscapementItem&)rHt;
    const char * pUpDn;

    SwTwips nH;
    if( !rRTFWrt.bTxtAttr )
        nH = rRTFWrt.nFontHeight;
    else
        nH = rRTFWrt.pAttrSet->GetSize().GetHeight();

    if( 0 < rEsc.GetEsc() )
        pUpDn = sRTF_UP;
    else if( 0 > rEsc.GetEsc() )
    {
        pUpDn = sRTF_DN;
        nH = -nH;               // den negativen Wert herrausrechnen
    }
    else
        return rWrt;

    // prozentuale Veraenderung speichern !
    short nEsc = rEsc.GetEsc();
    short nProp = rEsc.GetProp() * 100;
    if( DFLT_ESC_AUTO_SUPER == nEsc )
    {
        nEsc = 100 - rEsc.GetProp();
        ++nProp;
    }
    else if( DFLT_ESC_AUTO_SUB == nEsc )
    {
        nEsc = - 100 + rEsc.GetProp();
        ++nProp;
    }

    OutComment( rWrt, sRTF_UPDNPROP, TRUE );
    rWrt.OutULong( nProp ) << '}' << pUpDn;

    /*
     * berechne aus der akt. FontSize und dem ProzentWert die Verschiebung,
     * wobei im RTF File 1/2 Points stehen muessen, waehrend intern
     * mit Twips gerechnet wird.
     * Formel :         (FontSize * 1/20 ) pts         x * 2
     *                  -----------------------  = ------------
     *                    100%                      Escapement
     */

    rWrt.OutULong( ( (long( nEsc ) * nH) + 500L ) / 1000L );
                                                // 500L zum Aufrunden !!
    return rWrt;
}



static Writer& OutRTF_SwSize( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt;
    rRTFWrt.bOutFmtAttr = TRUE;

    USHORT nSize = (USHORT)((const SvxFontHeightItem&)rHt).GetHeight();
    rWrt.Strm() << sRTF_FS;
    rWrt.OutULong( nSize / 10 );
    if( rRTFWrt.bTxtAttr )
        rRTFWrt.nFontHeight = nSize;
    return rWrt;
}



static Writer& OutRTF_SwColor( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt;
    /* trage die Color in die Color-Liste vom Writer ein und gebe hier nur
     * die entsprechende Nummer aus. Die Color wird spaeter ueber diese
     * Tabelle im RTF-Dokument referenziert.
     */
    rRTFWrt.bOutFmtAttr = TRUE;
    rWrt.Strm() << sRTF_CF;
    rWrt.OutULong( rRTFWrt.GetId( ((const SvxColorItem&)rHt).GetValue() ));
    return rWrt;
}


extern void sw3io_ConvertToOldField( const SwField* pFld, USHORT& rWhich,
                              ULONG& rFmt, ULONG nFFVersion );

static Writer& OutRTF_SwField( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwFmtFld & rFld = (SwFmtFld&)rHt;
    SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt;

    const SwField* pFld = rFld.GetFld();

    ByteString aFldStt( '{' );
    ((((aFldStt += sRTF_FIELD) += '{' ) += sRTF_IGNORE ) += sRTF_FLDINST) += ' ';
    switch( pFld->GetTyp()->Which() )
    {
    case RES_DBFLD:
            aFldStt += "MERGEFIELD ";
            // kein break !!
    case RES_USERFLD:
            rWrt.Strm() << aFldStt.GetBuffer();
            RTFOutFuncs::Out_String( rWrt.Strm(), pFld->GetTyp()->GetName(),
                                    DEF_ENCODING, rRTFWrt.bWriteHelpFmt );
            break;
//  case RES_CHAPTERFLD:
//          rWrt.Strm() << ' ';
//          break;
    case RES_PAGENUMBERFLD:
            rWrt.Strm() << aFldStt.GetBuffer() << "\\\\page";
            {
                char __READONLY_DATA
                    sNType0[] = "ALPHABETIC",       /* CHARS_UPPER_LETTER*/
                    sNType1[] = "alphabetic",       /* CHARS_LOWER_LETTER*/
                    sNType2[] = "ROMAN",            /* ROMAN_UPPER       */
                    sNType3[] = "roman",            /* ROMAN_LOWER       */
                    sNType4[] = "ARABIC";           /* ARABIC            */

                const char* pFmtStr = 0;
                switch( pFld->GetFormat() )
                {
                case SVX_NUM_CHARS_UPPER_LETTER:
                case SVX_NUM_CHARS_UPPER_LETTER_N:  pFmtStr = sNType0; break;
                case SVX_NUM_CHARS_LOWER_LETTER:
                case SVX_NUM_CHARS_LOWER_LETTER_N:  pFmtStr = sNType1; break;
                case SVX_NUM_ROMAN_UPPER:           pFmtStr = sNType2; break;
                case SVX_NUM_ROMAN_LOWER:           pFmtStr = sNType3; break;
                case SVX_NUM_ARABIC:                pFmtStr = sNType4; break;
                }

                if( pFmtStr )
                    rWrt.Strm() << "\\\\* " << pFmtStr;
            }
            break;
    case RES_FILENAMEFLD:
            rWrt.Strm() << aFldStt.GetBuffer() << "\\\\filename ";
            break;
    case RES_DBNAMEFLD:
            rWrt.Strm() << aFldStt.GetBuffer() << "\\\\data ";
            RTFOutFuncs::Out_String( rWrt.Strm(), rWrt.pDoc->GetDBName(),
                                    DEF_ENCODING, rRTFWrt.bWriteHelpFmt );
            break;
    case RES_AUTHORFLD:
            rWrt.Strm() << aFldStt.GetBuffer() << "\\\\author ";
            break;

    case RES_HIDDENTXTFLD:
            if( TYP_CONDTXTFLD == ((SwHiddenTxtField*)pFld)->GetSubType() )
                RTFOutFuncs::Out_String( rWrt.Strm(), pFld->Expand(),
                                        DEF_ENCODING, rRTFWrt.bWriteHelpFmt );
            else
            {
                rWrt.Strm() << '{' << sRTF_V << ' ';
                OutRTF_AsByteString( rWrt, pFld->GetPar2() ).Strm()
                            << '}' << SwRTFWriter::sNewLine;
            }
            return rWrt;        // nicht bis zum Ende, kein RTF-Feld !!

    case RES_DATETIMEFLD:
            if (!(pFld->GetSubType() & FIXEDFLD))
            {
                USHORT nWhich = RES_DATETIMEFLD;
                ULONG nFmt = pFld->GetFormat();
                sw3io_ConvertToOldField(pFld, nWhich, nFmt, SOFFICE_FILEFORMAT_40 );
                if (pFld->GetSubType() & DATEFLD)
                {
                    rWrt.Strm() << aFldStt.GetBuffer() << "\\\\date \\\\@\"";
                    switch( nFmt )
                    {
                    case DF_SSYS:       rWrt.Strm() << "tt.MM.yy";              break;
                    case DF_LSYS:       rWrt.Strm() << "tttt, t. MMMM yyyy";    break;
                    case DF_SHORT:      rWrt.Strm() << "tt.MM.yy";              break;
                    case DF_SCENT:      rWrt.Strm() << "tt.MM.yyyy";            break;
                    case DF_LMON:       rWrt.Strm() << "t. MMM yyyy";           break;
                    case DF_LMONTH:     rWrt.Strm() << "t. MMMM yyyy";          break;
                    case DF_LDAYMON:    rWrt.Strm() << "ttt, t. MMMM yyyy";     break;
                    case DF_LDAYMONTH:  rWrt.Strm() << "tttt, t. MMMM yyyy";    break;
                    }
                }
                else
                {
                    rWrt.Strm() << aFldStt.GetBuffer() << "\\\\date \\\\@\"";
                    switch( nFmt )
                    {
                    case TF_SSMM_24:    rWrt.Strm() << "HH:mm"; break;
                    case TF_SSMM_12:    rWrt.Strm() << "hh:mm"; break;  // ???
                    case TF_SYSTEM:     rWrt.Strm() << "HH:mm"; break;
                    }
                }
                rWrt.Strm() << '\"';
                break;
            }
            // Kein break: in default-Zweig laufen!

    default:
        {
            aFldStt.Erase();

            // JP 20.07.95: warum nicht das Expandierte rausschreiben ?
            sal_Char cCh;
            rWrt.Strm().SeekRel(-1);
            rWrt.Strm() >> cCh;
            if( ' ' != cCh )            // vorweg immer einen Trenner
                rWrt.Strm() << ' ';
            RTFOutFuncs::Out_String( rWrt.Strm(), pFld->Expand(),
                                        DEF_ENCODING, rRTFWrt.bWriteHelpFmt );
        }
        break;
    }

    if( aFldStt.Len() )
    {
        rWrt.Strm() << "}{" << sRTF_FLDRSLT << ' ';
        RTFOutFuncs::Out_String( rWrt.Strm(), pFld->Expand(),
                                        DEF_ENCODING, rRTFWrt.bWriteHelpFmt );
        rWrt.Strm() << "}}";
        rRTFWrt.bOutFmtAttr = FALSE;
    }

    return rWrt;
}

static Writer& OutRTF_SwFlyCntnt( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwFrmFmt* pFmt = ((SwFmtFlyCnt&)rHt).GetFrmFmt();
    if( RES_DRAWFRMFMT != pFmt->Which() )
    {
        OutComment( rWrt, sRTF_FLYINPARA );
        ((SwRTFWriter&)rWrt).OutRTFFlyFrms( *((SwFlyFrmFmt*)pFmt) );
        rWrt.Strm() << '}';
        ((SwRTFWriter&)rWrt).bOutFmtAttr = FALSE;
    }
// Zeichengebundene Zeichenobjekte werden ignoriert.
    return rWrt;
}



#ifdef USED
static Writer& OutRTF_SwTOXMark( Writer& rWrt, const SfxPoolItem& )
{
    return rWrt;
}
#endif

#ifdef USED
static Writer& OutRTF_SwNoHyphen( Writer& rWrt, const SfxPoolItem& )
{
    return rWrt;
}
#endif


static Writer& OutRTF_SwFtn( Writer& rWrt, const SfxPoolItem& rHt )
{
    const SwFmtFtn& rFtn = (const SwFmtFtn&)rHt;
    SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt;

    do {    // middle-check-loop
        if( !rFtn.GetTxtFtn() || !rFtn.GetTxtFtn()->GetStartNode() )
            break;          // es gibt keine Kopf-/Fusszeile/Fussnote

        // Hole vom Node und vom letzten Node die Position in der Section
        ULONG   nStart = rFtn.GetTxtFtn()->GetStartNode()->GetIndex()+1,
                nEnd = rWrt.pDoc->GetNodes()[ nStart-1 ]->EndOfSectionIndex();

        // kein Bereich also kein gueltiger Node
        if( nStart >= nEnd )
            break;

        rWrt.Strm() << '{' << sRTF_SUPER << ' ';
        if( !rFtn.GetNumStr().Len() )
        {
            rWrt.Strm() << sRTF_CHFTN;
            OutComment( rWrt, sRTF_FOOTNOTE );
            if( rFtn.IsEndNote() )
                rWrt.Strm() << sRTF_FTNALT;
            rWrt.Strm() << ' ' << sRTF_CHFTN;
        }
        else
        {
            OutRTF_AsByteString( rWrt, rFtn.GetNumStr() );
            OutComment( rWrt, sRTF_FOOTNOTE );
            if( rFtn.IsEndNote() )
                rWrt.Strm() << sRTF_FTNALT;
            rWrt.Strm() << ' ';
            OutRTF_AsByteString( rWrt, rFtn.GetNumStr() );
        }
        RTFSaveData aSaveData( rRTFWrt, nStart, nEnd );
        // damit kein \par ausgegeben wird !!
        rRTFWrt.pCurPam->GetMark()->nContent++;
        rRTFWrt.Out_SwDoc( rRTFWrt.pCurPam );

        rWrt.Strm() << "}}" << SwRTFWriter::sNewLine;
        rRTFWrt.bOutFmtAttr = FALSE;

    } while( FALSE );
    return rWrt;
}

static Writer& OutRTF_SwHardBlank( Writer& rWrt, const SfxPoolItem& rHt)
{
    RTFOutFuncs::Out_Char( rWrt.Strm(), ((SwFmtHardBlank&)rHt).GetChar(),
                        DEF_ENCODING, ((SwRTFWriter&)rWrt).bWriteHelpFmt );
    return rWrt;
}

#ifdef USED
static Writer& OutRTF_SwRefMark( Writer& rWrt, const SfxPoolItem& )
{
    return rWrt;
}
#endif


#ifdef USED
static Writer& OutRTF_SwNoLinebreakHere( Writer& rWrt, const SfxPoolItem& )
{
    return rWrt;
}
#endif

static Writer& OutRTF_SwTxtINetFmt( Writer& rWrt, const SfxPoolItem& rHt )
{
    const SwFmtINetFmt& rURL = (const SwFmtINetFmt&)rHt;
    SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt;
    if( rURL.GetValue().Len() )
    {
        rWrt.Strm() << '{' << sRTF_FIELD << '{' << sRTF_IGNORE
                    << sRTF_FLDINST << " HYPERLINK ";

        String sURL( rURL.GetValue() );
        if( INET_MARK_TOKEN != sURL.GetChar(0) )
        {
            INetURLObject aTmp( INetURLObject::AbsToRel( sURL ) );
            sURL = aTmp.GetURLNoMark( INetURLObject::DECODE_WITH_CHARSET );
/*          if( INET_PROT_FILE == aTmp.GetProtocol() )
            {
                // WW97 wollen keine FILE-URL haben, sondern einen normalen
                // Dateinamen. Aber ab WW2000 kennen sie FileURLs.
                sURL = aTmp.GetFull();
            }
*/          rWrt.Strm() << '\"';
            RTFOutFuncs::Out_String( rWrt.Strm(), sURL, DEF_ENCODING,
                                    rRTFWrt.bWriteHelpFmt ) << "\" ";
            sURL = aTmp.GetMark();
        }

        if( sURL.Len() )
        {
            rWrt.Strm() << "\\\\l \"";
            sURL.Erase( 0, 1 );
            RTFOutFuncs::Out_String( rWrt.Strm(), sURL, DEF_ENCODING,
                                    rRTFWrt.bWriteHelpFmt ) << "\" ";
        }

        if( rURL.GetTargetFrame().Len() )
        {
            rWrt.Strm() << "\\\\t \"";
            RTFOutFuncs::Out_String( rWrt.Strm(), rURL.GetTargetFrame(),
                        DEF_ENCODING, rRTFWrt.bWriteHelpFmt ) << "\" ";
        }

        rWrt.Strm() << "}{" << sRTF_FLDRSLT << ' ';
        rRTFWrt.bOutFmtAttr = FALSE;

        // und dann noch die Attributierung ausgeben
        const SwCharFmt* pFmt;
        const SwTxtINetFmt* pTxtAtr = rURL.GetTxtINetFmt();
        if( pTxtAtr && 0 != ( pFmt = pTxtAtr->GetCharFmt() ))
            OutRTF_SwFmt( rWrt, *pFmt );
    }
    return rWrt;
}

static Writer& OutRTF_SwTxtCharFmt( Writer& rWrt, const SfxPoolItem& rHt )
{
    const SwFmtCharFmt& rChrFmt = (const SwFmtCharFmt&)rHt;
    const SwCharFmt* pFmt = rChrFmt.GetCharFmt();

    if( pFmt )
        OutRTF_SwFmt( rWrt, *pFmt );
    return rWrt;
}

/* File FRMATR.HXX */

static Writer& OutRTF_SwFrmSize( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt;
    const SwFmtFrmSize& rSz = (const SwFmtFrmSize&)rHt;
    if( rRTFWrt.pFlyFmt )       // wird das FlyFrmFmt ausgegeben ?
    {
        if( !rRTFWrt.bRTFFlySyntax )
            return rWrt;

        if( rSz.GetWidth() )
        {
            rWrt.Strm() << sRTF_ABSW;
            rWrt.OutLong( rSz.GetWidth() );
            rRTFWrt.bOutFmtAttr = TRUE;
        }

        if( rSz.GetHeight() )
        {
            long nH = rSz.GetHeight();
            if( ATT_FIX_SIZE == rSz.GetSizeType() )
                nH = -nH;
            rWrt.Strm() << sRTF_ABSH;
            rWrt.OutLong( nH );
            rRTFWrt.bOutFmtAttr = TRUE;
        }
    }
    else if( rRTFWrt.bOutPageDesc )
    {
        rWrt.Strm() << sRTF_PGWSXN;
        rWrt.OutLong( rSz.GetWidth() );
        rWrt.Strm() << sRTF_PGHSXN;
        rWrt.OutLong( rSz.GetHeight() );
        rRTFWrt.bOutFmtAttr = TRUE;
    }
    return rWrt;
}



#ifdef USED
static Writer& OutRTF_SwFillOrder( Writer& rWrt, const SfxPoolItem& )
{
    return rWrt;
}
#endif


#ifdef USED
static Writer& OutRTF_SwFmtPaperBin( Writer& rWrt, const SfxPoolItem& )
{
    return rWrt;
}
#endif



static Writer& OutRTF_SwFmtLRSpace( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt;
    const SvxLRSpaceItem & rLR = (const SvxLRSpaceItem&) rHt;
    if( !rRTFWrt.pFlyFmt )
    {
        if( rRTFWrt.bOutPageDesc )
        {
            if( rLR.GetLeft() )
            {
                rWrt.Strm() << sRTF_MARGLSXN;
                rWrt.OutLong( rLR.GetLeft() );
                rRTFWrt.bOutFmtAttr = TRUE;
            }
            if( rLR.GetRight() )
            {
                rWrt.Strm() << sRTF_MARGRSXN;
                rWrt.OutLong( rLR.GetRight() );
                rRTFWrt.bOutFmtAttr = TRUE;
            }
        }
        else
        {
            rRTFWrt.bOutFmtAttr = TRUE;
            rWrt.Strm() << sRTF_LI;
            rWrt.OutLong( rLR.GetTxtLeft() ) << sRTF_RI;
            rWrt.OutLong( rLR.GetRight() );
            rWrt.Strm() << sRTF_FI;
            rWrt.OutLong( rLR.GetTxtFirstLineOfst() );
        }
    }
    else if( rLR.GetLeft() == rLR.GetRight() && rRTFWrt.bRTFFlySyntax )
    {
        rRTFWrt.bOutFmtAttr = TRUE;
        rWrt.Strm() << sRTF_DFRMTXTX;
        rWrt.OutLong( rLR.GetLeft() );
    }
    return rWrt;
}

static Writer& OutRTF_SwFmtULSpace( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt;
    const SvxULSpaceItem & rUL = (const SvxULSpaceItem&) rHt;
    if( rRTFWrt.pFlyFmt )
    {
        if( rUL.GetUpper() == rUL.GetLower() && rRTFWrt.bRTFFlySyntax )
        {
            rRTFWrt.bOutFmtAttr = TRUE;
            rWrt.Strm() << sRTF_DFRMTXTY;
            rWrt.OutLong( rUL.GetLower() );
        }
    }
    else
    {
        const char* p;
        USHORT nValue = rUL.GetUpper();
        if( rRTFWrt.bOutPageDesc )
        {
            p = sRTF_MARGTSXN;
            if( !rRTFWrt.bOutPageDescTbl )
            {
                SwRect aRect;
                const SwFmtHeader* pHdr;
                if( SFX_ITEM_SET == rRTFWrt.pAktPageDesc->GetMaster().
                        GetItemState( RES_HEADER, FALSE,
                        (const SfxPoolItem**)&pHdr ) && pHdr->IsActive() )
                {
                    aRect = pHdr->GetHeaderFmt()->FindLayoutRect( FALSE );
                    if( aRect.Height() )
                        nValue += aRect.Height();
                    else
                    {
                        const SwFmtFrmSize& rSz = pHdr->GetHeaderFmt()->GetFrmSize();
                        if( ATT_VAR_SIZE != rSz.GetSizeType() )
                            nValue += rSz.GetHeight();
                        else
                            nValue += 274;      // defaulten fuer 12pt Schrift
                        nValue += pHdr->GetHeaderFmt()->GetULSpace().GetLower();
                    }
                }
            }
        }
        else
            p = sRTF_SB;

        if( rRTFWrt.bOutPageDesc || nValue )
        {
            rRTFWrt.bOutFmtAttr = TRUE;
            rWrt.Strm() << p;
            rWrt.OutLong( nValue );
        }


        nValue = rUL.GetLower();
        if( rRTFWrt.bOutPageDesc )
        {
            p = sRTF_MARGBSXN;
            if( !rRTFWrt.bOutPageDescTbl )
            {
                SwRect aRect;
                const SwFmtFooter* pFtr;
                if( SFX_ITEM_SET == rRTFWrt.pAktPageDesc->GetMaster().
                        GetItemState( RES_FOOTER, FALSE,
                        (const SfxPoolItem**)&pFtr ) && pFtr->IsActive() )
                {
                    aRect = pFtr->GetFooterFmt()->FindLayoutRect( FALSE );
                    if( aRect.Height() )
                        nValue += aRect.Height();
                    else
                    {
                        const SwFmtFrmSize& rSz = pFtr->GetFooterFmt()->GetFrmSize();
                        if( ATT_VAR_SIZE != rSz.GetSizeType() )
                            nValue += rSz.GetHeight();
                        else
                            nValue += 274;      // defaulten fuer 12pt Schrift
                        nValue += pFtr->GetFooterFmt()->GetULSpace().GetUpper();
                    }
                }
            }
        }
        else
            p = sRTF_SA;

        if( rRTFWrt.bOutPageDesc || nValue )
        {
            rRTFWrt.bOutFmtAttr = TRUE;
            rWrt.Strm() << p;
            rWrt.OutLong( nValue );
        }
    }
    return rWrt;
}

// Header-Footer werden auch vom RTF-Writer direkt gerufen, also kein static!


Writer& OutRTF_SwFmtHeader( Writer& rWrt, const SfxPoolItem& rHt )
{
    const SwFmtHeader& rHd = (const SwFmtHeader&)rHt;
    if( !rHd.IsActive() )       // nicht aktiv, dann nichts weiter ausgeben
        return rWrt;

    // hole einen Node zu dem Request
    SwStartNode *pSttNode = 0;
    const SwFmtCntnt& rCntnt = rHd.GetHeaderFmt()->GetCntnt();
    if( rCntnt.GetCntntIdx() )
        pSttNode = rCntnt.GetCntntIdx()->GetNode().GetStartNode();

    do {    // middle-check-loop
        if( !pSttNode )
            break;          // es gibt keine Kopf-/Fusszeile/Fussnote

        SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt;

        // Hole vom Node und vom letzten Node die Position in der Section
        ULONG nStart = pSttNode->GetIndex() + 1,
                nEnd = pSttNode->EndOfSectionIndex();

        // kein Bereich also kein gueltiger Node
        if( nStart >= nEnd )
            break;
        ASSERT( rRTFWrt.pAktPageDesc, "Header-Attribut ohne PageDesc" );

        const sal_Char * pHdNm = sRTF_HEADER;
        rWrt.Strm() << pHdNm << 'y';
        if( rRTFWrt.bOutPageDescTbl )
        {
            // hole die Ober-/Unterkanten vom Header
            const SvxULSpaceItem& rUL = rHd.GetHeaderFmt()->GetULSpace();
            const SvxLRSpaceItem& rLR = rHd.GetHeaderFmt()->GetLRSpace();
            const SwFmtFrmSize& rSz = rHd.GetHeaderFmt()->GetFrmSize();

            rWrt.OutLong( rUL.GetUpper() );
            OutComment( rWrt, pHdNm ) << "yb";
            rWrt.OutLong( rUL.GetLower() ) << pHdNm << "xl";
            rWrt.OutLong( rLR.GetLeft() ) << pHdNm << "xr";
            rWrt.OutLong( rLR.GetRight() )  << pHdNm << "yh";
            rWrt.OutLong( ATT_FIX_SIZE  == rSz.GetSizeType()
                            ? -rSz.GetHeight()
                            : rSz.GetHeight() ) << '}';
        }
        else
            rWrt.OutLong( rRTFWrt.pAktPageDesc->GetMaster().
                            GetULSpace().GetUpper() );

        // wird nicht die PageDesc-Tabelle ausgegeben und gibt es einen
        // Nachfolger, dann handelt es sich um die "1.Seite" nach RTF.
        sal_Char cTyp = 0;
        if( !rRTFWrt.bOutPageDesc && rRTFWrt.pAktPageDesc->GetFollow() &&
            rRTFWrt.pAktPageDesc->GetFollow() != rRTFWrt.pAktPageDesc )
            cTyp = 'f';     // dann FirstPage-Header
        else if( !rRTFWrt.pAktPageDesc->IsHeaderShared() )
            cTyp = rRTFWrt.bOutLeftHeadFoot ? 'l' : 'r';

        rWrt.Strm() << '{'<< pHdNm;
        if( cTyp ) rWrt.Strm() << cTyp;
        rWrt.Strm() << ' ';

        {
            RTFSaveData aSaveData( rRTFWrt, nStart, nEnd );
            rRTFWrt.Out_SwDoc( rRTFWrt.pCurPam );
        }

        rWrt.Strm() << '}' << SwRTFWriter::sNewLine;

    } while( FALSE );
    return rWrt;
}
// Header-Footer werden auch vom RTF-Writer direkt gerufen, also kein static!


Writer& OutRTF_SwFmtFooter( Writer& rWrt, const SfxPoolItem& rHt )
{
    const SwFmtFooter& rFt = (const SwFmtFooter&)rHt;
    if( !rFt.IsActive() )       // nicht aktiv, dann nichts weiter ausgeben
        return rWrt;

    SwStartNode *pSttNode = 0;
    const SwFmtCntnt& rCntnt = rFt.GetFooterFmt()->GetCntnt();
    if( rCntnt.GetCntntIdx() )
        pSttNode = rCntnt.GetCntntIdx()->GetNode().GetStartNode();

    do {    // middle-check-loop
        if( !pSttNode )
            break;          // es gibt keine Kopf-/Fusszeile/Fussnote

        SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt;

            // Hole vom Node und vom letzten Node die Position in der Section
        ULONG nStart = pSttNode->GetIndex()+1,
              nEnd = pSttNode->EndOfSectionIndex();

        // kein Bereich also kein gueltiger Node
        if( nStart >= nEnd )
            break;
        ASSERT( rRTFWrt.pAktPageDesc, "Footer-Attribut ohne PageDesc" );

        const sal_Char * pFtNm = sRTF_FOOTER;
        rWrt.Strm() << pFtNm << 'y';
        if( rRTFWrt.bOutPageDescTbl )
        {
            // hole die Ober-/Unterkanten vom Footer
            const SvxULSpaceItem& rUL = rFt.GetFooterFmt()->GetULSpace();
            const SvxLRSpaceItem& rLR = rFt.GetFooterFmt()->GetLRSpace();
            const SwFmtFrmSize& rSz = rFt.GetFooterFmt()->GetFrmSize();

            rWrt.OutLong( rUL.GetLower() );
            OutComment( rWrt, pFtNm ) << "yt";
            rWrt.OutLong( rUL.GetUpper() ) << pFtNm << "xl";
            rWrt.OutLong( rLR.GetLeft() ) << pFtNm << "xr";
            rWrt.OutLong( rLR.GetRight() )  << pFtNm << "yh";
            rWrt.OutLong( ATT_FIX_SIZE  == rSz.GetSizeType()
                            ? -rSz.GetHeight()
                            : rSz.GetHeight() )  << '}';
        }
        else
            rWrt.OutLong( rRTFWrt.pAktPageDesc->GetMaster().
                            GetULSpace().GetLower() );

        // wird nicht die PageDesc-Tabelle ausgegeben und gibt es einen
        // Nachfolger, dann handelt es sich um die "1.Seite" nach RTF.
        sal_Char cTyp = 0;
        if( !rRTFWrt.bOutPageDesc && rRTFWrt.pAktPageDesc->GetFollow() &&
            rRTFWrt.pAktPageDesc->GetFollow() != rRTFWrt.pAktPageDesc )
            cTyp = 'f';     // dann FirstPage-Header
        else if( !rRTFWrt.pAktPageDesc->IsFooterShared() )
            cTyp = rRTFWrt.bOutLeftHeadFoot ? 'l' : 'r';

        rWrt.Strm() << '{'<< pFtNm;
        if( cTyp ) rWrt.Strm() << cTyp;
        rWrt.Strm() << ' ';

        {
            RTFSaveData aSaveData( rRTFWrt, nStart, nEnd );
            rRTFWrt.Out_SwDoc( rRTFWrt.pCurPam );
        }

        rWrt.Strm() << '}' << SwRTFWriter::sNewLine;

    } while( FALSE );
    return rWrt;
}

static Writer& OutRTF_SwFmtPrint( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt;
    if( !rRTFWrt.bRTFFlySyntax && !((const SvxPrintItem&)rHt).GetValue() )
    {
        rRTFWrt.bOutFmtAttr = TRUE;
        rWrt.Strm() << sRTF_FLYPRINT;
    }
    return rWrt;
}


static Writer& OutRTF_SwFmtOpaque( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt;
    if( !rRTFWrt.bRTFFlySyntax && !((const SvxOpaqueItem&)rHt).GetValue() )
    {
        rRTFWrt.bOutFmtAttr = TRUE;
        rWrt.Strm() << sRTF_FLYOPAQUE;
    }
    return rWrt;
}


static Writer& OutRTF_SwFmtProtect( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt;
    if( !rRTFWrt.bRTFFlySyntax )
    {
        const SvxProtectItem & rFlyProtect = (const SvxProtectItem&) rHt;
        RTFProtect aP( rFlyProtect.IsCntntProtected(),
                        rFlyProtect.IsSizeProtected(),
                        rFlyProtect.IsPosProtected() );
        rRTFWrt.bOutFmtAttr = TRUE;
        rWrt.Strm() << sRTF_FLYPRTCTD;
        rWrt.OutULong( aP.GetValue() );
    }
    return rWrt;
}


static Writer& OutRTF_SwFmtSurround( Writer& rWrt, const SfxPoolItem& rHt )
{
    const SwFmtSurround& rFlySurround = (const SwFmtSurround&) rHt;
    SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt;
    if( rRTFWrt.bRTFFlySyntax )
    {
        if( SURROUND_NONE == rFlySurround.GetSurround() )
        {
            rRTFWrt.bOutFmtAttr = TRUE;
            rWrt.Strm() << sRTF_NOWRAP;
        }
    }
    else
    {
        SwSurround eSurround = rFlySurround.GetSurround();
        BOOL bGold = SURROUND_IDEAL == eSurround;
        if( bGold )
            eSurround = SURROUND_PARALLEL;
        RTFSurround aMC( bGold, eSurround );
        rWrt.Strm() << sRTF_FLYMAINCNT;
        rWrt.OutULong( aMC.GetValue() );
        rRTFWrt.bOutFmtAttr = TRUE;
    }
    return rWrt;
}

static Writer& OutRTF_SwFmtVertOrient ( Writer& rWrt, const SfxPoolItem& rHt )
{
    const SwFmtVertOrient& rFlyVert = (const SwFmtVertOrient&) rHt;
    RTFVertOrient aVO( rFlyVert.GetVertOrient(), rFlyVert.GetRelationOrient() );
    SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt;

    if( rRTFWrt.bRTFFlySyntax && rRTFWrt.pFlyFmt )
    {
        rRTFWrt.bOutFmtAttr = TRUE;
        const char* pOrient;
        RndStdIds eAnchor = rRTFWrt.pFlyFmt->GetAnchor().GetAnchorId();
        SwRelationOrient eOrient = rFlyVert.GetRelationOrient();
        if( FLY_PAGE == eAnchor )
        {
            if( REL_PG_FRAME == eOrient || FRAME == eOrient )
                pOrient = sRTF_PVPG;
            else
                pOrient = sRTF_PVMRG;
        }
        else
            pOrient = sRTF_PVPARA;
        rWrt.Strm() << pOrient;

        switch( rFlyVert.GetVertOrient() )
        {
        case VERT_TOP:
        case VERT_LINE_TOP:     rWrt.Strm() << sRTF_POSYT;  break;
        case VERT_BOTTOM:
        case VERT_LINE_BOTTOM:  rWrt.Strm() << sRTF_POSYB;  break;
        case VERT_CENTER:
        case VERT_LINE_CENTER:  rWrt.Strm() << sRTF_POSYC;  break;
        case VERT_NONE:
            {
                rWrt.Strm() << sRTF_POSY;
                rWrt.OutULong( rFlyVert.GetPos() );
            }
            break;
        }
    }
    else if( !rRTFWrt.bRTFFlySyntax )
    {
        rRTFWrt.bOutFmtAttr = TRUE;
        rWrt.Strm() << sRTF_FLYVERT;
        rWrt.OutULong( aVO.GetValue() );
    }

    return rWrt;
}

static Writer& OutRTF_SwFmtHoriOrient( Writer& rWrt, const SfxPoolItem& rHt )
{
    const SwFmtHoriOrient& rFlyHori = (const SwFmtHoriOrient&) rHt;
    RTFHoriOrient aHO( rFlyHori.GetHoriOrient(),
                          rFlyHori.GetRelationOrient() );

    SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt;
    if( rRTFWrt.bRTFFlySyntax && rRTFWrt.pFlyFmt )
    {
        rRTFWrt.bOutFmtAttr = TRUE;
        const char* pS;
        RndStdIds eAnchor = rRTFWrt.pFlyFmt->GetAnchor().GetAnchorId();
        SwRelationOrient eOrient = rFlyHori.GetRelationOrient();
        if( FLY_PAGE == eAnchor )
        {
            if( REL_PG_FRAME == eOrient || FRAME == eOrient )
                pS = sRTF_PHPG;
            else
                pS = sRTF_PHMRG;
        }
        else
            pS = sRTF_PHCOL;
        rWrt.Strm() << pS;

        pS = 0;
        switch( rFlyHori.GetHoriOrient() )
        {
        case HORI_RIGHT:        pS = rFlyHori.IsPosToggle()
                                    ? sRTF_POSXO
                                    : sRTF_POSXR;
                                break;
        case HORI_LEFT:         pS = rFlyHori.IsPosToggle()
                                    ? sRTF_POSXI
                                    : sRTF_POSXL;
                                break;
        case HORI_CENTER:       pS = sRTF_POSXC;    break;
        case HORI_NONE:
                {
                    rWrt.Strm() << sRTF_POSX;
                    rWrt.OutULong( rFlyHori.GetPos() );
                }
                break;
        }
        if( pS )
            rWrt.Strm() << pS;
    }
    else
    {
        rRTFWrt.bOutFmtAttr = TRUE;
        rWrt.Strm()  << sRTF_FLYHORZ;
        rWrt.OutULong( aHO.GetValue() );
    }
    return rWrt;
}

static Writer& OutRTF_SwFmtAnchor( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt;
    if( !rRTFWrt.bRTFFlySyntax )
    {
        const SwFmtAnchor& rAnchor = (const SwFmtAnchor&) rHt;
        USHORT nId = rAnchor.GetAnchorId();
        rWrt.Strm() << sRTF_FLYANCHOR;
        rWrt.OutULong( nId );
        rRTFWrt.bOutFmtAttr = TRUE;
        switch( nId )
        {
        case FLY_PAGE:
                rWrt.Strm() << sRTF_FLYPAGE;
                rWrt.OutULong( rAnchor.GetPageNum() );
            break;
        case FLY_AT_CNTNT:
        case FLY_IN_CNTNT:
            rWrt.Strm() << sRTF_FLYCNTNT;
            break;
        }
    }
    return rWrt;
}



static Writer& OutRTF_SwFmtBackground( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt;
    // wird das FlyFrmFmt ausgegeben, dann Background nur ausgeben, wenn
    // RTF-Syntax gesetzt ist !
    if( !rRTFWrt.pFlyFmt || !rRTFWrt.bRTFFlySyntax )
    {
        const SvxBrushItem& rBack = (const SvxBrushItem&)rHt;
        if( !rBack.GetColor().GetTransparency() )
        {
            ByteString sOut( sRTF_CBPAT );
            sOut += ByteString::CreateFromInt32(
                                rRTFWrt.GetId( rBack.GetColor() ));

            if( rRTFWrt.pFlyFmt || rRTFWrt.bOutPageDesc )
            {
                rWrt.Strm() << '{' << sOut.GetBuffer() << '}';
            }
            else
            {
                rRTFWrt.bOutFmtAttr = TRUE;
                rWrt.Strm() << sOut.GetBuffer();
            }
        }
    }
    return rWrt;
}


static Writer& OutRTF_SwFmtShadow( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt;
    // wird das FlyFrmFmt ausgegeben, dann Schatten nur ausgeben, wenn
    // nicht RTF-Syntax gesetzt ist !
    if( rRTFWrt.pFlyFmt && rRTFWrt.bRTFFlySyntax )
        return rWrt;

    const SvxShadowItem& rShadow = (const SvxShadowItem&)rHt;
                             // FALSE wegen schliessender Klammer !!
    OutComment( rWrt, sRTF_SHADOW, FALSE );
    rWrt.OutULong( rShadow.GetLocation() ) << sRTF_SHDWDIST;
    rWrt.OutULong( rShadow.GetWidth() ) << sRTF_SHDWSTYLE;
    const Color& rColor = rShadow.GetColor();
    rWrt.OutULong( rColor.GetTransparency() ? SW_SV_BRUSH_NULL : SW_SV_BRUSH_SOLID );
    rWrt.OutULong( rRTFWrt.GetId( rColor ) ) << sRTF_SHDWFCOL;
    rWrt.OutULong( 0 ) << '}';
    return rWrt;
}


static void OutBorderLine( SwRTFWriter& rWrt, const SvxBorderLine* pLine,
                            const char* pStr )
{
    rWrt.Strm() << pStr << sRTF_BRDLNCOL;
    rWrt.OutULong( rWrt.GetId( pLine->GetColor() ) ) << sRTF_BRDLNIN;
    rWrt.OutULong( pLine->GetInWidth() ) << sRTF_BRDLNOUT;
    rWrt.OutULong( pLine->GetOutWidth() ) << sRTF_BRDLNDIST;
    rWrt.OutULong( pLine->GetDistance() );
}


static Writer& OutRTF_SwFmtBox( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt;

    const SvxBoxItem& rBox = (const SvxBoxItem&)rHt;

    static USHORT __READONLY_DATA aBorders[] = {
            BOX_LINE_TOP, BOX_LINE_LEFT, BOX_LINE_BOTTOM, BOX_LINE_RIGHT };
    static const sal_Char* __READONLY_DATA aBorderNames[] = {
            sRTF_BRDRT, sRTF_BRDRL, sRTF_BRDRB, sRTF_BRDRR };

    USHORT nDist = rBox.GetDistance();

    // wird das FlyFrmFmt ausgegeben, dann Border nur ausgeben, wenn
    // nicht RTF-Syntax gesetzt ist!
    if( rRTFWrt.pFlyFmt && rRTFWrt.bRTFFlySyntax )
    {
/*
RTF kennt keine Rahmen Umrandung!
        // die normale RTF-Definition
        if( rBox.GetTop() && rBox.GetBottom() &&
            rBox.GetLeft() && rBox.GetRight() &&
            *rBox.GetTop() == *rBox.GetBottom() &&
            *rBox.GetTop() == *rBox.GetLeft() &&
            *rBox.GetTop() == *rBox.GetRight() )
            OutTBLBorderLine( rRTFWrt, rBox.GetTop(), sRTF_BOX, nDist );
        else
        {
            OUT_BRDLINE( rBox.GetTop(),     sRTF_BRDRT, nDist );
            OUT_BRDLINE( rBox.GetBottom(),  sRTF_BRDRB, nDist );
            OUT_BRDLINE( rBox.GetLeft(),    sRTF_BRDRL, nDist );
            OUT_BRDLINE( rBox.GetRight(),   sRTF_BRDRR, nDist );
        }
*/
        return rWrt;
    }
    else if( !rRTFWrt.pFlyFmt )
    {
        // erst die normale RTF-Definition, dann unsere eigene
        if( rBox.GetTop() && rBox.GetBottom() &&
            rBox.GetLeft() && rBox.GetRight() &&
            *rBox.GetTop() == *rBox.GetBottom() &&
            *rBox.GetTop() == *rBox.GetLeft() &&
            *rBox.GetTop() == *rBox.GetRight() &&
            nDist == rBox.GetDistance( BOX_LINE_TOP ) &&
            nDist == rBox.GetDistance( BOX_LINE_LEFT ) &&
            nDist == rBox.GetDistance( BOX_LINE_BOTTOM ) &&
            nDist == rBox.GetDistance( BOX_LINE_RIGHT ))
            OutTBLBorderLine( rRTFWrt, rBox.GetTop(), sRTF_BOX, nDist );
        else
        {
            const USHORT* pBrd = aBorders;
            const sal_Char** pBrdNms = (const sal_Char**)aBorderNames;
            for( int i = 0; i < 4; ++i, ++pBrd, ++pBrdNms )
            {
                const SvxBorderLine* pLn = rBox.GetLine( *pBrd );
                if( pLn )
                    OutTBLBorderLine( rRTFWrt, pLn, *pBrdNms,
                                        rBox.GetDistance( *pBrd ) );
            }
        }
    }

    const USHORT* pBrd = aBorders;
    const sal_Char** pBrdNms = (const sal_Char**)aBorderNames;
    for( int i = 0; i < 4; ++i, ++pBrd, ++pBrdNms )
    {
        const SvxBorderLine* pLn = rBox.GetLine( *pBrd );
        if( pLn )
        {
            rWrt.Strm() << '{' << sRTF_IGNORE;
            OutBorderLine( rRTFWrt, pLn, *pBrdNms );
            rWrt.Strm() << '}' << sRTF_BRSP;
            rWrt.OutULong( rBox.GetDistance( *pBrd ));
        }
    }

    rRTFWrt.bOutFmtAttr = FALSE;
    return rWrt;
}


#ifdef USED
static Writer& OutRTF_SwFmtFrmMacro( Writer& rWrt, const SfxPoolItem& )
{
    return rWrt;
}
#endif

static Writer& OutRTF_SwFmtCol( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwRTFWriter& rRTFWrt = ((SwRTFWriter&)rWrt);
    if( rRTFWrt.pFlyFmt && rRTFWrt.bRTFFlySyntax )
        return rWrt;

    const SwFmtCol& rCol = (const SwFmtCol&)rHt;
    const SwColumns& rColumns = rCol.GetColumns();

    USHORT nCols = rColumns.Count();
    if( 1 < nCols )
    {
        // dann besorge mal die Seitenbreite ohne Raender !!
        const SwFrmFmt* pFmt;

        if( rRTFWrt.pFlyFmt )
            pFmt = rRTFWrt.pFlyFmt;
        else if( rRTFWrt.pAktPageDesc )
            pFmt = &rRTFWrt.pAktPageDesc->GetMaster();
        else
            pFmt = &rWrt.pDoc->GetPageDesc(0).GetMaster();

        const SvxLRSpaceItem& rLR = pFmt->GetLRSpace();

        USHORT nPageSize = pFmt->GetFrmSize().GetWidth() -
                            rLR.GetLeft() - rLR.GetRight();

        rWrt.Strm() << sRTF_COLS;
        rWrt.OutLong( nCols );

        if( rCol.IsOrtho() )
        {
            rWrt.Strm() << sRTF_COLSX;
            rWrt.OutLong( rCol.GetGutterWidth( TRUE ) );
        }
        else
            for( USHORT n = 0; n < nCols; )
            {
                rWrt.Strm() << sRTF_COLNO;
                rWrt.OutLong( n+1 );

                rWrt.Strm() << sRTF_COLW;
                rWrt.OutLong( rCol.CalcPrtColWidth( n, nPageSize ) );
                if( ++n != nCols )
                {
                    rWrt.Strm() << sRTF_COLSR;
                    rWrt.OutLong( rColumns[ n-1 ]->GetRight() +
                                  rColumns[ n ]->GetLeft() );
                }
            }
        ((SwRTFWriter&)rWrt).bOutFmtAttr = TRUE;
    }
    return rWrt;
}

static Writer& OutRTF_SvxFmtKeep( Writer& rWrt, const SfxPoolItem& rHt )
{
    const SvxFmtKeepItem& rItem = (const SvxFmtKeepItem&)rHt;
    if( rItem.GetValue() )
    {
        rWrt.Strm() << sRTF_KEEPN;
        ((SwRTFWriter&)rWrt).bOutFmtAttr = TRUE;
    }
    return rWrt;
}

/* File GRFATR.HXX */

static Writer& OutRTF_SwMirrorGrf( Writer& rWrt, const SfxPoolItem& rHt )
{
    const SwMirrorGrf & rMirror = (const SwMirrorGrf&)rHt;
    if( RES_DONT_MIRROR_GRF == rMirror.GetValue() )
        return rWrt;

    ((SwRTFWriter&)rWrt).bOutFmtAttr = TRUE;
    rWrt.Strm() << sRTF_IGNORE << sRTF_GRFMIRROR;
    rWrt.OutULong( rMirror.GetValue() );
    return rWrt;
}

static Writer& OutRTF_SwCropGrf( Writer& rWrt, const SfxPoolItem& rHt )
{
    const SwCropGrf & rCrop = (const SwCropGrf&)rHt;
    ByteString aStr;
    if( rCrop.GetLeft() )
        ( aStr += sRTF_PICCROPL ) +=
                        ByteString::CreateFromInt32( (short)rCrop.GetLeft() );
    if( rCrop.GetRight() )
        ( aStr += sRTF_PICCROPR ) +=
                        ByteString::CreateFromInt32( (short)rCrop.GetRight() );
    if( rCrop.GetTop() )
        ( aStr += sRTF_PICCROPT ) +=
                        ByteString::CreateFromInt32( (short)rCrop.GetTop() );
    if( rCrop.GetBottom() )
        ( aStr += sRTF_PICCROPB ) +=
                        ByteString::CreateFromInt32( (short)rCrop.GetBottom() );
    if( aStr.Len() )
    {
        ((SwRTFWriter&)rWrt).bOutFmtAttr = TRUE;
        rWrt.Strm() << aStr.GetBuffer();
    }
    return rWrt;
}



/* File PARATR.HXX  */

static Writer& OutRTF_SwLineSpacing( Writer& rWrt, const SfxPoolItem& rHt )
{
    const SvxLineSpacingItem &rLs = (const SvxLineSpacingItem&)rHt;

    switch( rLs.GetLineSpaceRule() )
    {
    case SVX_LINE_SPACE_AUTO:
    case SVX_LINE_SPACE_FIX:
    case SVX_LINE_SPACE_MIN:
        {
            ((SwRTFWriter&)rWrt).bOutFmtAttr = TRUE;
            rWrt.Strm() << sRTF_SL;
            sal_Char cMult = '0';
            switch( rLs.GetInterLineSpaceRule() )
            {
            case SVX_INTER_LINE_SPACE_FIX:      // unser Durchschuss
                // gibt es aber nicht in WW - also wie kommt man an
                // die MaxLineHeight heran?
                rWrt.OutLong( (short)rLs.GetInterLineSpace() );
                break;

            case SVX_INTER_LINE_SPACE_PROP:
                rWrt.OutLong( (240L * rLs.GetPropLineSpace()) / 100L );
                cMult = '1';
                break;

            default:
                if( SVX_LINE_SPACE_FIX == rLs.GetLineSpaceRule() )
                    rWrt.Strm() << '-';

                rWrt.OutLong( rLs.GetLineHeight() );
                break;
            }
            rWrt.Strm() << sRTF_SLMULT << cMult;
        }
        break;
    }
    return rWrt;
}

static Writer& OutRTF_SwAdjust( Writer& rWrt, const SfxPoolItem& rHt )
{
    const SvxAdjustItem & rAdjust = ((const SvxAdjustItem&)rHt);
    ByteString aAttr( "\\q" );
    switch( rAdjust.GetAdjust() )
    {
    case SVX_ADJUST_LEFT:       aAttr += 'l';   break;
    case SVX_ADJUST_RIGHT:      aAttr += 'r';   break;
    case SVX_ADJUST_BLOCKLINE:
    case SVX_ADJUST_BLOCK:      aAttr += 'j';   break;
    case SVX_ADJUST_CENTER:     aAttr += 'c';   break;

    default:
        return rWrt;        // kein gueltiges Attriut, also returnen
    }
    ((SwRTFWriter&)rWrt).bOutFmtAttr = TRUE;
    rWrt.Strm() << aAttr.GetBuffer();
    return rWrt;
}

static Writer& OutRTF_SvxFmtSplit( Writer& rWrt, const SfxPoolItem& rHt )
{
    const SvxFmtSplitItem& rItem = (const SvxFmtSplitItem&)rHt;
    if( !rItem.GetValue() )
    {
        rWrt.Strm() << sRTF_KEEP;
        ((SwRTFWriter&)rWrt).bOutFmtAttr = TRUE;
    }
    return rWrt;
}


#ifdef USED
static Writer& OutRTF_SwWidows( Writer& rWrt, const SfxPoolItem& )
{
    return rWrt;
}
#endif

#ifdef USED
static Writer& OutRTF_SwOrphans( Writer& rWrt, const SfxPoolItem& )
{
    return rWrt;
}
#endif



static Writer& OutRTF_SwTabStop( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt;
    const SvxTabStopItem & rTStops = (const SvxTabStopItem&)rHt;
    long nOffset = rRTFWrt.pAttrSet->GetLRSpace().GetTxtLeft();
    for( USHORT n = 0; n < rTStops.Count(); n++ )
    {
        const SvxTabStop & rTS = rTStops[ n ];
        if( SVX_TAB_ADJUST_DEFAULT != rTS.GetAdjustment() )
        {
            BOOL bOutDecimal = TRUE;
            const char* pFill = 0;
            switch( rTS.GetFill() )
            {
            case cDfltFillChar:
                break;

            case '.':   pFill = sRTF_TLDOT; break;
            case '_':   pFill = sRTF_TLUL;  break;
            case '-':   pFill = sRTF_TLTH;  break;
            case '=':   pFill = sRTF_TLEQ;  break;
            default:
                if( !rRTFWrt.bWriteHelpFmt )
                {
                    OutComment( rWrt, sRTF_TLSWG, FALSE );
                    rWrt.OutULong( (((USHORT)rTS.GetFill()) << 8 ) +
                                    rTS.GetDecimal() )
                        << '}';
                    bOutDecimal = FALSE;
                }
            }
            if( pFill )
                rWrt.Strm() << pFill;

            if( !rRTFWrt.bWriteHelpFmt && bOutDecimal &&
                rTS.GetDecimal() != ((SvxTabStopItem&)*GetDfltAttr(
                    RES_PARATR_TABSTOP ))[ 0 ].GetDecimal() )
            {
                OutComment( rWrt, sRTF_TLSWG, FALSE );
                rWrt.OutULong( (((USHORT)rTS.GetFill()) << 8 ) +
                                rTS.GetDecimal() ) << '}';
            }

            const sal_Char* pAdjStr = 0;
            switch( rTS.GetAdjustment() )
            {
            case SVX_TAB_ADJUST_RIGHT:      pAdjStr = sRTF_TQR;     break;
            case SVX_TAB_ADJUST_DECIMAL:    pAdjStr = sRTF_TQDEC;   break;
            case SVX_TAB_ADJUST_CENTER:     pAdjStr = sRTF_TQC;     break;
            }
            if( pAdjStr )
                rWrt.Strm() << pAdjStr;
            rWrt.Strm() << sRTF_TX;
            rWrt.OutLong( rTS.GetTabPos() + nOffset );
        }
    }
    rRTFWrt.bOutFmtAttr = TRUE;
    return rWrt;
}

static Writer& OutRTF_SwHypenZone( Writer& rWrt, const SfxPoolItem& rHt )
{
    if( !((SwRTFWriter&)rWrt).bWriteHelpFmt )
    {
        const SvxHyphenZoneItem& rAttr = (const SvxHyphenZoneItem&)rHt;

        USHORT nFlags = rAttr.IsHyphen() ? 1 : 0;
        if( rAttr.IsPageEnd() ) nFlags += 2;

        OutComment( rWrt, sRTF_HYPHEN, FALSE );
        rWrt.OutULong( nFlags ) << sRTF_HYPHLEAD;
        rWrt.OutULong( rAttr.GetMinLead() ) << sRTF_HYPHTRAIL;
        rWrt.OutULong( rAttr.GetMinTrail() ) << sRTF_HYPHMAX;
        rWrt.OutULong( rAttr.GetMaxHyphens() ) << '}';
    }
    return rWrt;
}

static Writer& OutRTF_SwNumRule( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt;
    if( !rRTFWrt.bOutListNumTxt )
    {
        const SwNumRuleItem& rAttr = (const SwNumRuleItem&)rHt;
        USHORT nId;
        if( rAttr.GetValue().Len() &&
            USHRT_MAX != (nId = rRTFWrt.GetId( rAttr ) ) )
        {
            rWrt.Strm() << sRTF_LS;
            rWrt.OutULong( nId );
            rRTFWrt.bOutFmtAttr = TRUE;
        }
    }
    return rWrt;
}

/*
 * lege hier die Tabellen fuer die RTF-Funktions-Pointer auf
 * die Ausgabe-Funktionen an.
 * Es sind lokale Strukturen, die nur innerhalb der RTF-DLL
 * bekannt sein muessen.
 */

SwAttrFnTab aRTFAttrFnTab = {
/* RES_CHRATR_CASEMAP   */          OutRTF_SwCaseMap,
/* RES_CHRATR_CHARSETCOLOR  */      0,
/* RES_CHRATR_COLOR */              OutRTF_SwColor,
/* RES_CHRATR_CONTOUR   */          OutRTF_SwContour,
/* RES_CHRATR_CROSSEDOUT    */      OutRTF_SwCrossedOut,
/* RES_CHRATR_ESCAPEMENT    */      OutRTF_SwEscapement,
/* RES_CHRATR_FONT  */              OutRTF_SwFont,
/* RES_CHRATR_FONTSIZE  */          OutRTF_SwSize,
/* RES_CHRATR_KERNING   */          0, // NOT USED!! OutRTF_SwKerning,
/* RES_CHRATR_LANGUAGE  */          OutRTF_SwLanguage,
/* RES_CHRATR_POSTURE   */          OutRTF_SwPosture,
/* RES_CHRATR_PROPORTIONALFONTSIZE*/0,
/* RES_CHRATR_SHADOWED  */          OutRTF_SwShadowed,
/* RES_CHRATR_UNDERLINE */          OutRTF_SwUnderline,
/* RES_CHRATR_WEIGHT    */          OutRTF_SwWeight,
/* RES_CHRATR_WORDLINEMODE  */      0, // Neu: Wortweises Unter-/Durchstreichen
/* RES_CHRATR_AUTOKERN  */          0, // Neu: Automatisches Pairkerning
/* RES_CHRATR_BLINK */              0, // Neu: Blinkender Text
/* RES_CHRATR_NOHYPHEN  */          0, // Neu: nicht trennen
/* RES_CHRATR_NOLINEBREAK */        0, // Neu: nicht umbrechen
/* RES_CHRATR_BACKGROUND */         0, // Neu: Zeichenhintergrund
/* RES_CHRATR_CJK_FONT */           0,
/* RES_CHRATR_CJK_FONTSIZE */       0,
/* RES_CHRATR_CJK_LANGUAGE */       0,
/* RES_CHRATR_CJK_POSTURE */        0,
/* RES_CHRATR_CJK_WEIGHT */         0,
/* RES_CHRATR_CTL_FONT */           0,
/* RES_CHRATR_CTL_FONTSIZE */       0,
/* RES_CHRATR_CTL_LANGUAGE */       0,
/* RES_CHRATR_CTL_POSTURE */        0,
/* RES_CHRATR_CTL_WEIGHT */         0,
/* RES_CHRATR_WRITING_DIRECTION */  0,
/* RES_CHRATR_DUMMY2 */             0,
/* RES_CHRATR_DUMMY3 */             0,
/* RES_CHRATR_DUMMY4 */             0,
/* RES_CHRATR_DUMMY5 */             0,
/* RES_CHRATR_DUMMY1 */             0, // Dummy:

/* RES_TXTATR_INETFMT   */          OutRTF_SwTxtINetFmt, // Dummy
/* RES_TXTATR_NOHYPHEN  */          0, // Dummy
/* RES_TXTATR_REFMARK*/             0, // NOT USED!! OutRTF_SwRefMark,
/* RES_TXTATR_TOXMARK */            0, // NOT USED!! OutRTF_SwTOXMark,
/* RES_TXTATR_CHARFMT   */          OutRTF_SwTxtCharFmt,
/* RES_TXTATR_TWO_LINES */          0,
/* RES_TXTATR_CJK_RUBY */           0,
/* RES_TXTATR_UNKNOWN_CONTAINER */  0,
/* RES_TXTATR_DUMMY5 */             0,
/* RES_TXTATR_DUMMY6 */             0,

/* RES_TXTATR_FIELD */              OutRTF_SwField,
/* RES_TXTATR_FLYCNT */             OutRTF_SwFlyCntnt,
/* RES_TXTATR_FTN */                OutRTF_SwFtn,
/* RES_TXTATR_SOFTHYPH */           0,  // old attr. - coded now by character
/* RES_TXTATR_HARDBLANK*/           OutRTF_SwHardBlank,
/* RES_TXTATR_DUMMY1 */             0, // Dummy:
/* RES_TXTATR_DUMMY2 */             0, // Dummy:

/* RES_PARATR_LINESPACING   */      OutRTF_SwLineSpacing,
/* RES_PARATR_ADJUST    */          OutRTF_SwAdjust,
/* RES_PARATR_SPLIT */              OutRTF_SvxFmtSplit,
/* RES_PARATR_WIDOWS    */          0, // NOT USED!! OutRTF_SwWidows,
/* RES_PARATR_ORPHANS   */          0, // NOT USED!! OutRTF_SwOrphans,
/* RES_PARATR_TABSTOP   */          OutRTF_SwTabStop,
/* RES_PARATR_HYPHENZONE*/          OutRTF_SwHypenZone,
/* RES_PARATR_DROP */               0,
/* RES_PARATR_REGISTER */           0, // neu:  Registerhaltigkeit
/* RES_PARATR_NUMRULE */            OutRTF_SwNumRule,
/* RES_PARATR_DUMMY2 */             0, // Dummy:

/* RES_FILL_ORDER   */              0, // NOT USED!! OutRTF_SwFillOrder,
/* RES_FRM_SIZE */                  OutRTF_SwFrmSize,
/* RES_PAPER_BIN    */              0, // NOT USED!! OutRTF_SwFmtPaperBin,
/* RES_LR_SPACE */                  OutRTF_SwFmtLRSpace,
/* RES_UL_SPACE */                  OutRTF_SwFmtULSpace,
/* RES_PAGEDESC */                  0,
/* RES_BREAK */                     0,
/* RES_CNTNT */                     0,
/* RES_HEADER */                    OutRTF_SwFmtHeader,
/* RES_FOOTER */                    OutRTF_SwFmtFooter,
/* RES_PRINT */                     OutRTF_SwFmtPrint,
/* RES_OPAQUE */                    OutRTF_SwFmtOpaque,
/* RES_PROTECT */                   OutRTF_SwFmtProtect,
/* RES_SURROUND */                  OutRTF_SwFmtSurround,
/* RES_VERT_ORIENT */               OutRTF_SwFmtVertOrient,
/* RES_HORI_ORIENT */               OutRTF_SwFmtHoriOrient,
/* RES_ANCHOR */                    OutRTF_SwFmtAnchor,
/* RES_BACKGROUND */                OutRTF_SwFmtBackground,
/* RES_BOX  */                      OutRTF_SwFmtBox,
/* RES_SHADOW */                    OutRTF_SwFmtShadow,
/* RES_FRMMACRO */                  0, // NOT USED!! OutRTF_SwFmtFrmMacro,
/* RES_COL */                       OutRTF_SwFmtCol,
/* RES_KEEP */                      OutRTF_SvxFmtKeep,
/* RES_URL */                       0, // URL
/* RES_EDIT_IN_READONLY */          0,
/* RES_LAYOUT_SPLIT */              0,
/* RES_FRMATR_DUMMY1 */             0, // Dummy:
/* RES_FRMATR_DUMMY2 */             0, // Dummy:
/* RES_FRMATR_DUMMY3 */             0, // Dummy:
/* RES_FRMATR_DUMMY4 */             0, // Dummy:
/* RES_FRMATR_DUMMY5 */             0, // Dummy:
/* RES_FRMATR_DUMMY6 */             0, // Dummy:
/* RES_FRMATR_DUMMY7 */             0, // Dummy:
/* RES_FRMATR_DUMMY8 */             0, // Dummy:
/* RES_FRMATR_DUMMY9 */             0, // Dummy:

/* RES_GRFATR_MIRRORGRF */          OutRTF_SwMirrorGrf,
/* RES_GRFATR_CROPGRF   */          OutRTF_SwCropGrf,
/* RES_GRFATR_ROTATION */           0,
/* RES_GRFATR_LUMINANCE */          0,
/* RES_GRFATR_CONTRAST */           0,
/* RES_GRFATR_CHANNELR */           0,
/* RES_GRFATR_CHANNELG */           0,
/* RES_GRFATR_CHANNELB */           0,
/* RES_GRFATR_GAMMA */              0,
/* RES_GRFATR_INVERT */             0,
/* RES_GRFATR_TRANSPARENCY */       0,
/* RES_GRFATR_DRWAMODE */           0,
/* RES_GRFATR_DUMMY1 */             0,
/* RES_GRFATR_DUMMY2 */             0,
/* RES_GRFATR_DUMMY3 */             0,
/* RES_GRFATR_DUMMY4 */             0,
/* RES_GRFATR_DUMMY5 */             0,

/* RES_BOXATR_FORMAT */             0,
/* RES_BOXATR_FORMULA */            0,
/* RES_BOXATR_VALUE */              0,

/* RES_UNKNOWNATR_CONTAINER */      0
};

SwNodeFnTab aRTFNodeFnTab = {
/* RES_TXTNODE  */                   OutRTF_SwTxtNode,
/* RES_GRFNODE  */                   OutRTF_SwGrfNode,
/* RES_OLENODE  */                   OutRTF_SwOLENode
};

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/rtf/rtfatr.cxx,v 1.1.1.1 2000-09-18 17:14:56 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.344  2000/09/18 16:04:50  willem.vandorp
      OpenOffice header added.

      Revision 1.343  2000/08/30 16:46:03  jp
      use CharClass instead of international

      Revision 1.342  2000/08/25 12:28:03  jp
      Graphic Crop-Attribut exported to SVX

      Revision 1.341  2000/08/18 13:02:02  jp
      don't export escaped URLs

      Revision 1.340  2000/08/04 10:48:05  jp
      Soft-/HardHyphens & HardBlanks changed from attribute to unicode character; use rtfout functions

      Revision 1.339  2000/07/31 19:24:34  jp
      new attributes for CJK/CTL and graphic

      Revision 1.338  2000/07/20 13:16:22  jp
      change old txtatr-character to the two new characters

      Revision 1.337  2000/06/26 12:53:08  os
      INetURLObject::SmartRelToAbs removed

      Revision 1.336  2000/05/09 17:22:42  jp
      Changes for Unicode

      Revision 1.335  2000/03/24 14:10:38  jp
      Bug #74428#: LRSpace - GetLeft returns the right value for pagedescs

      Revision 1.334  2000/03/15 13:50:27  jp
      Bug #74070#: WriteTable - look for colspans

      Revision 1.333  2000/03/03 15:21:02  os
      StarView remainders removed

      Revision 1.332  2000/02/24 18:33:21  jp
      Bug #73098#: read & write list entries without number

      Revision 1.331  2000/02/11 14:37:51  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.330  2000/01/25 20:11:50  jp
      Bug #72146#: OutSwChar - write the original character code if it can not be converted

      Revision 1.329  2000/01/07 12:26:49  jp
      Task #71411#: read/write NoBalancedColumns

      Revision 1.328  1999/12/08 13:51:01  jp
      Task #70258#: textattr for XMLAttrContainer

*************************************************************************/


diff --git a/sw/source/filter/rtf/rtffld.cxx b/sw/source/filter/rtf/rtffld.cxx
new file mode 100644
index 0000000..c2e7c41
--- /dev/null
+++ b/sw/source/filter/rtf/rtffld.cxx
@@ -0,0 +1,960 @@
/*************************************************************************
 *
 *  $RCSfile: rtffld.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:56 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#include <ctype.h>

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _GRAPH_HXX //autogen
#include <vcl/graph.hxx>
#endif
#ifndef _URLOBJ_HXX //autogen
#include <tools/urlobj.hxx>
#endif
#ifndef _RTFTOKEN_H
#include <svtools/rtftoken.h>
#endif
#ifndef _SVX_FONTITEM_HXX //autogen
#include <svx/fontitem.hxx>
#endif
#ifndef _SVX_FHGTITEM_HXX //autogen
#include <svx/fhgtitem.hxx>
#endif

#ifndef _FMTFLD_HXX //autogen
#include <fmtfld.hxx>
#endif
#ifndef _FMTINFMT_HXX //autogen
#include <fmtinfmt.hxx>
#endif
#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _PAM_HXX
#include <pam.hxx>
#endif
#ifndef _NDTXT_HXX
#include <ndtxt.hxx>
#endif
#ifndef _SHELLIO_HXX
#include <shellio.hxx>
#endif
#ifndef _FLDBAS_HXX
#include <fldbas.hxx>
#endif
#ifndef _SWPARRTF_HXX
#include <swparrtf.hxx>
#endif
#ifndef _TXATBASE_HXX
#include <txatbase.hxx>
#endif
#ifndef _DBFLD_HXX
#include <dbfld.hxx>
#endif
#ifndef _USRFLD_HXX
#include <usrfld.hxx>
#endif
#ifndef _DOCUFLD_HXX
#include <docufld.hxx>
#endif
#ifndef _FLDDAT_HXX
#include <flddat.hxx>
#endif


// bestimme, ob es sich um ein IMPORT/TOC - Feld handelt.
// return:  0 - weder noch,
//          1 - TOC
//          2 - IMPORT
//          3 - INDEX
enum RTF_FLD_TYPES {
    RTFFLD_UNKNOWN = 0,
    RTFFLD_TOC,
    RTFFLD_IMPORT,
    RTFFLD_INDEX,
    RTFFLD_SYMBOL,
    RTFFLD_PAGE,
    RTFFLD_DATE,
    RTFFLD_DATA,
    RTFFLD_MERGEFLD,
    RTFFLD_HYPERLINK
};

static RTF_FLD_TYPES _WhichFld( String& rName, String& rNext )
{
    // Strings sind PascalStrings; Laenge steht an 1. Stellen, dadurch wird
    // sich der Aufruf von strlen erspart!!!
    sal_Char __READONLY_DATA sTOC[]=        "\3toc";
    sal_Char __READONLY_DATA sIMPORT[]=     "\6import";
    sal_Char __READONLY_DATA sINDEX[]=      "\5index";
    sal_Char __READONLY_DATA sSYMBOL[]=     "\6symbol";
    sal_Char __READONLY_DATA sPAGE[]=       "\4page";
    sal_Char __READONLY_DATA sDATE[]=       "\4date";
    sal_Char __READONLY_DATA sDATA[]=       "\4data";
    sal_Char __READONLY_DATA sMERGEFLD[]=   "\10mergefield";
    sal_Char __READONLY_DATA sIMPORT2[]=    "\16includepicture";
    sal_Char __READONLY_DATA sHYPERLINK[]=  "\x9hyperlink";

    struct _Dummy_RTF_FLD_TYPES
    {
        RTF_FLD_TYPES eFldType;
        const sal_Char* pFldNm;
    };
    __READONLY_DATA _Dummy_RTF_FLD_TYPES aFldNmArr[ RTFFLD_HYPERLINK+1 ] = {
            RTFFLD_TOC,         sTOC,
            RTFFLD_IMPORT,      sIMPORT,
            RTFFLD_INDEX,       sINDEX,
            RTFFLD_SYMBOL,      sSYMBOL,
            RTFFLD_PAGE,        sPAGE,
            RTFFLD_DATE,        sDATE,
            RTFFLD_DATA,        sDATA,
            RTFFLD_MERGEFLD,    sMERGEFLD,
            RTFFLD_IMPORT,      sIMPORT2,
            RTFFLD_HYPERLINK,   sHYPERLINK
    };


    if( !rName.Len() )
        return RTFFLD_UNKNOWN;

    String sNm( rName );
    sNm = sNm.EraseLeadingChars().GetToken(0, ' ');
    ASSERT( sNm.Len(), "Feldname hat keine Laenge!" );
    if( !sNm.Len() )
        return RTFFLD_UNKNOWN;

    xub_StrLen nTokenStt = rName.Search( sNm );
    sNm.ToLowerAscii();

    for( int n = 0; n < sizeof( aFldNmArr ) / sizeof( aFldNmArr[0]); ++n )
    {
        const sal_Char* pCmp = aFldNmArr[n].pFldNm;
        int nLen = *pCmp++;
        xub_StrLen nFndPos = sNm.SearchAscii( pCmp );
        if( STRING_NOTFOUND != nFndPos &&
            ( !nFndPos || !isalpha(sNm.GetChar( nFndPos-1 )) ) &&
            ( nFndPos+nLen == sNm.Len() || !isalpha(sNm.GetChar(nFndPos+nLen) ) ) )
        {
//          rName = sNm.Copy( nFndPos, nLen );
            rName = rName.Copy( nFndPos, nLen );
            nFndPos += nTokenStt + nLen;
            while( rNext.GetChar( nFndPos ) == ' ' )    ++nFndPos;
            rNext.Erase( 0, nFndPos );
            rNext.EraseTrailingChars();
            return aFldNmArr[n].eFldType;
        }
    }
    return RTFFLD_UNKNOWN;      // nichts gefunden.
}

static USHORT CheckNumberFmtStr( const String& rNStr )
{
    // zur Kontrolle, falls jemand meint, neue Werte zufuegen zu muessen
#define NUMBERTAB_SZ 8
    sal_Char __READONLY_DATA
        sNType0[] = "\10ALPHABETIC",       /* CHARS_UPPER_LETTER*/
        sNType1[] = "\10alphabetic",       /* CHARS_LOWER_LETTER*/
        sNType2[] = "\5ROMAN",            /* ROMAN_UPPER       */
        sNType3[] = "\5roman",            /* ROMAN_LOWER       */
        sNType4[] = "\6ARABIC",           /* ARABIC            */
        sNType5[] = "\4NONE",             /* NUMBER_NONE       */
        sNType6[] = "\4CHAR",             /* CHAR_SPECIAL      */
        sNType7[] = "\4PAGE";             /* PAGEDESC          */
    static const sal_Char* __READONLY_DATA aNumberTypeTab[ NUMBERTAB_SZ ] =
    {
        sNType0, sNType1, sNType2, sNType3, sNType4,
        sNType5, sNType6, sNType7
    };


    for( USHORT n = SVX_NUM_CHARS_UPPER_LETTER;  n <= SVX_NUM_PAGEDESC; n++ )
    {
        const sal_Char* pCmp = aNumberTypeTab[ n ];
        int nLen = *pCmp++;
        if( rNStr.EqualsAscii( pCmp, 0, nLen ))
            return 2 <= n ? n : (n + SVX_NUM_CHARS_UPPER_LETTER_N);
    }
    return SVX_NUM_PAGEDESC;        // default-Wert
}

extern void sw3io_ConvertFromOldField( SwDoc& rDoc, USHORT& rWhich,
                                        USHORT& rSubType, ULONG &rFmt,
                                        USHORT nVersion );

class RtfFieldSwitch
{
    String sParam;
    xub_StrLen nCurPos;
public:
    RtfFieldSwitch( const String& rParam );
    sal_Unicode GetSwitch( String& rParam );

    BOOL IsAtEnd() const { return nCurPos >= sParam.Len(); }
};

RtfFieldSwitch::RtfFieldSwitch( const String& rParam )
    : sParam( rParam ), nCurPos( 0  )
{
    sParam.EraseTrailingChars().EraseLeadingChars();
}

sal_Unicode RtfFieldSwitch::GetSwitch( String& rParam )
{
    // beginnt ein Schalter?
    sal_Unicode c, cKey = 0;
    if( '\\' == (c = sParam.GetChar( nCurPos )) )
    {
        if( '\\' == ( c = sParam.GetChar( ++nCurPos )) )
            c = sParam.GetChar( ++nCurPos );

        cKey = c;

        while( ++nCurPos < sParam.Len() &&
                ' ' == ( c = sParam.GetChar( nCurPos )) )
            ;
    }

    // dann alles in Hochkommatas oder bis zum naechsten // als
    // Param returnen
    USHORT nOffset;
    if( '"' != c && '\'' != c )
        c = '\\', nOffset = 0;
    else
        nOffset = 1;

    sParam.Erase( 0, nCurPos + nOffset );
    rParam = sParam.GetToken( 0, c );
    sParam.Erase( 0, rParam.Len() + nOffset ).EraseLeadingChars();
    if( '\\' == c )
        rParam.EraseTrailingChars();
    nCurPos = 0;

    return cKey;
}

int SwRTFParser::MakeFieldInst( String& rFieldStr )
{
    // sicher den Original-String fuer die FeldNamen (User/Datenbank)
    String aSaveStr( rFieldStr );
    SwFieldType * pFldType;
    xub_StrLen nPos = 0;
    USHORT nSubType;
    int nRet;

    switch( nRet = _WhichFld( rFieldStr, aSaveStr ) )
    {
    case RTFFLD_IMPORT:
        {
//JP 11.03.96: vertraegt sich nicht so ganz mit Internet!
//            if( STRING_NOTFOUND != ( nPos = aSaveStr.Search( '.' )))
//                aSaveStr.Erase( nPos+4 );

            if( aSaveStr.Len() )
            {
                sal_Unicode c = aSaveStr.GetChar( 0 );
                if( '"' == c || '\'' == c )
                {
                    aSaveStr.Erase( 0, 1 );
                    aSaveStr = aSaveStr.GetToken( 0, c );
                }

                rFieldStr = INetURLObject::RelToAbs( aSaveStr );
            }
//          SkipGroup();        // ueberlese den Rest
        }
        break;

    case RTFFLD_PAGE:
        {
            pFldType = pDoc->GetSysFldType( RES_PAGENUMBERFLD );
            SwPageNumberField aPF( (SwPageNumberFieldType*)pFldType,
                                    PG_RANDOM, SVX_NUM_ARABIC );
            if( STRING_NOTFOUND != ( nPos = aSaveStr.SearchAscii( "\\*" )) )
            {
                nPos += 2;
                while( aSaveStr.GetChar(nPos) == ' ' ) nPos++;
                aSaveStr.Erase( 0, nPos );

                // steht jetzt geanu auf dem Format-Namen
                aPF.ChangeFormat( CheckNumberFmtStr( aSaveStr ));
            }
            pDoc->Insert( *pPam, SwFmtFld( aPF ) );
            SkipGroup();        // ueberlese den Rest
        }
        break;
    case RTFFLD_DATE:
        {
            if( STRING_NOTFOUND == ( nPos = aSaveStr.SearchAscii( "\\@" )) )
            {
                // es fehlt die Format - Angabe: defaulten auf Datum
                pFldType = pDoc->GetSysFldType( RES_DATETIMEFLD );
                pDoc->Insert( *pPam, SwFmtFld( SwDateTimeField(
                                (SwDateTimeFieldType*)pFldType, DATEFLD )));
            }
            else
            {
                // versuche aus dem Formatstring zu erkennen, ob es ein
                // Datum oder Zeit oder Datum & Zeit Field ist
                // nur das Format interressiert
                aSaveStr.Erase( 0, aSaveStr.Search( '\"' )+1 );
                // alles hinter dem Format interressiert auch nicht mehr.
                aSaveStr.Erase( aSaveStr.Search( '\"' ) );
                aSaveStr.SearchAndReplaceAscii( "AM", aEmptyStr );
                aSaveStr.SearchAndReplaceAscii( "PM", aEmptyStr );

                xub_StrLen nDPos = aSaveStr.Search( 'M' ),  // M    -> Datum
                           nTPos = aSaveStr.Search( 'H' );  // H    -> 24h
                if( STRING_NOTFOUND == nTPos )
                    nTPos = aSaveStr.Search( 'h' );         // h    -> 12h

                SwField *pTFld = 0, *pDFld = 0;

                if( STRING_NOTFOUND != nTPos )
                {
                    pFldType = pDoc->GetSysFldType( RES_DATETIMEFLD );
                    pTFld = new SwDateTimeField( (SwDateTimeFieldType*)pFldType, TIMEFLD );
                    ((SwDateTimeField*)pTFld)->ChangeFormat(
                                'H' == aSaveStr.GetChar( nTPos )
                                        ? TF_SSMM_24
                                        : TF_SSMM_12);
                }

                if( STRING_NOTFOUND != nDPos )      // Datum ?
                {
                    static SwDateFormat aDateA[16] = {
                        DF_SHORT, DF_LMON, DF_LDAYMON, DF_LDAYMON,
                        DF_SCENT, DF_LDAYMON, DF_LDAYMON, DF_LDAYMON,
                        DF_SHORT, DF_LMON, DF_LDAYMONTH, DF_LDAYMONTH,
                        DF_SCENT, DF_LDAYMONTH, DF_LDAYMONTH, DF_LDAYMONTH
                    };
                                //  t, tt, T, TT -> no day of week
                                //  ttt, tttt, TTT, TTTT -> day of week
                    BOOL bDayOfWeek = STRING_NOTFOUND !=
                                            aSaveStr.SearchAscii( "ttt" ) ||
                                      STRING_NOTFOUND !=
                                            aSaveStr.SearchAscii( "TTT" ) ||
                                      STRING_NOTFOUND !=
                                            aSaveStr.SearchAscii( "ddd" ) ||
                                      STRING_NOTFOUND !=
                                            aSaveStr.SearchAscii( "DDD" );
                                //  M, MM -> numeric month
                                //  MMM, MMMM -> text. month
                    BOOL bLitMonth = STRING_NOTFOUND !=
                                            aSaveStr.SearchAscii( "MMM" );
                                //  MMMM -> full month
                    BOOL bFullMonth = STRING_NOTFOUND !=
                                            aSaveStr.SearchAscii( "MMMM" );
                                //  jj, JJ -> 2-col-year
                                //  jjjj, JJJJ -> 4-col-year
                    BOOL bFullYear = STRING_NOTFOUND !=
                                            aSaveStr.SearchAscii( "jjj" ) ||
                                      STRING_NOTFOUND !=
                                            aSaveStr.SearchAscii( "JJJ" ) ||
                                      STRING_NOTFOUND !=
                                            aSaveStr.SearchAscii( "yyy" ) ||
                                      STRING_NOTFOUND !=
                                            aSaveStr.SearchAscii( "YYY" );

                    USHORT i =  ( bLitMonth & 1 ) |
                                ( ( bDayOfWeek & 1 ) << 1 ) |
                                ( ( bFullYear & 1 ) << 2 ) |
                                ( ( bFullMonth & 1 ) << 3 );

                    pFldType = pDoc->GetSysFldType( RES_DATETIMEFLD );

                    nSubType = DATEFLD;
                    USHORT nWhich = RES_DATEFLD;
                    ULONG nFormat = aDateA[ i ];
                    sw3io_ConvertFromOldField( *pDoc, nWhich, nSubType, nFormat, 0x0110 );
                    pDFld = new SwDateTimeField( (SwDateTimeFieldType*)pFldType, DATEFLD, nFormat );
                }

                // Zeit kommt vor Date, alos Feld-Pointer swappen
                if( nTPos < nDPos )
                {
                    SwField* pTmp = pTFld;
                    pTFld = pDFld;
                    pDFld = pTmp;
                }

                if( pDFld )
                {
                    pDoc->Insert( *pPam, SwFmtFld( *pDFld ));
                    delete pDFld;
                }
                if( pTFld )
                {
                    pDoc->Insert( *pPam, SwFmtFld( *pTFld ));
                    delete pTFld;
                }
            }
            SkipGroup();        // ueberlese den Rest
        }
        break;
    case RTFFLD_DATA:
        {
            // Datenbank-FileName: nur der Filename interressiert
            // Zur Zeit werden nur SDF-Files verarbeitet, also suche nach
            // der Extension

            // im SWG geben die DATA Felder den Namen der Datenbank
            // an. Dieser kann als Field oder als DBInfo interpretiert
            // werden:
            //  \\data -> Datenbank-Name als Field
            //  DATA -> Datenbank-Info
            BOOL bField = rFieldStr.GetChar( 0 ) != 'D';

            // nur der Name interressiert
            if( STRING_NOTFOUND != (nPos = aSaveStr.Search( '.' )) )
                aSaveStr.Erase( nPos );

            if( bField )
            {
                pFldType = pDoc->GetSysFldType( RES_DBNAMEFLD );
                pDoc->Insert( *pPam, SwFmtFld( SwDBNameField(
                                (SwDBNameFieldType*)pFldType, aEmptyStr ) ));
            }
            else
                pDoc->ChgDBName( aSaveStr );        // MS: Keine DBInfo verwenden
            SkipGroup();        // ueberlese den Rest
        }
        break;
    case RTFFLD_MERGEFLD:
        {
            // ein Datenbank - Feld: nur der Name interressiert
            // bis zum Ende vom String ist das der Feldname
            SwDBFieldType aTmp( pDoc, aSaveStr, aEmptyStr );    // Hack(OM): Erstmal Leerstring
            SwDBField aDBFld( (SwDBFieldType*)pDoc->InsertFldType( aTmp ));

            aDBFld.ChangeFormat( UF_STRING );
            pDoc->Insert( *pPam, SwFmtFld( aDBFld ));
            SkipGroup();        // ueberlese den Rest
        }
        break;

    case RTFFLD_SYMBOL:
        {
            // loesche fuehrende Blanks
            if( IsNewGroup() )  GetAttrSet();
            SetNewGroup( TRUE );

            SfxItemSet& rSet = GetAttrSet();

            BOOL bCharIns = FALSE;
            RtfFieldSwitch aRFS( aSaveStr );
            while( !aRFS.IsAtEnd() )
            {
                String sParam;
                sal_Unicode cKey = aRFS.GetSwitch( sParam );
                if( sParam.Len() )
                    switch( cKey )
                    {
                    case 0:
                        if( !bCharIns )
                        {
                            sal_Unicode nChar = sParam.ToInt32();
                            if( nChar )
                            {
                                pDoc->Insert( *pPam, nChar );
                                bCharIns = TRUE;
                            }
                        }
                        break;

                    case 'f': case 'F':
                        // Font setzen
                        {
                            SvxRTFFontTbl& rTbl = GetFontTbl();
                            for( Font* pFont = rTbl.First(); pFont;
                                    pFont = rTbl.Next() )
                                if( pFont->GetName() == sParam )
                                {
                                    rSet.Put( SvxFontItem(
                                            pFont->GetFamily(),
                                            sParam,
                                            pFont->GetStyleName(),
                                            pFont->GetPitch(),
                                            pFont->GetCharSet(),
                                            RES_CHRATR_FONT ));
                                    break;
                                }
                        }
                        break;
                    case 'h': case 'H':
                        //??
                        break;
                    case 's': case 'S':
                        // Fontsize setzen
                        {
                            USHORT nVal = sParam.ToInt32();
                            nVal *= 20;
                            rSet.Put( SvxFontHeightItem( (const USHORT)nVal,
                                        100, RES_CHRATR_FONTSIZE ));
                        }
                        break;
                    }
            }

            if( !IsNewGroup() ) AttrGroupEnd();
            SetNewGroup( FALSE );

            SkipGroup();        // ueberlese den Rest
        }
        break;

    case RTFFLD_HYPERLINK:
        rFieldStr.Erase();
        if( aSaveStr.Len() )
        {
            // return String ist URL, # Mark, \1 Frame
            String sMark, sFrame;
            RtfFieldSwitch aRFS( aSaveStr );
            while( !aRFS.IsAtEnd() )
            {
                String sParam;
                sal_Unicode cKey = aRFS.GetSwitch( sParam );
                if( sParam.Len() )
                    switch( cKey )
                    {
                    case 0:
                        if( !rFieldStr.Len() )
                            rFieldStr = INetURLObject::RelToAbs( sParam );
                        break;

                    case 'l':   case 'L':   sMark = sParam;     break;
                    case 't':   case 'T':   sFrame = sParam;    break;
                    }
            }

            if( sMark.Len() )
                ( rFieldStr += INET_MARK_TOKEN ) += sMark;
            if( sFrame.Len() )
                ( rFieldStr += '\1' ) += sFrame;
        }
        break;

    case RTFFLD_TOC:
    case RTFFLD_INDEX:
        break;

    default:
        {
            // keines von den bekannten Feldern, also eine neues UserField
            aSaveStr.EraseLeadingChars().EraseTrailingChars();
            SwUserFieldType aTmp( pDoc, aSaveStr );
            SwUserField aUFld( (SwUserFieldType*)pDoc->InsertFldType( aTmp ));
            aUFld.ChangeFormat( UF_STRING );
            pDoc->Insert( *pPam, SwFmtFld( aUFld ));
            nRet = RTFFLD_UNKNOWN;
        }
        break;
    }
    return nRet;
}

void SwRTFParser::ReadField()
{
    int nRet = 0;
    int nOpenBrakets = 1;       // die erste wurde schon vorher erkannt !!
    int bFldInst = FALSE, bFldRslt = FALSE;
    String sFieldStr, sFieldNm;
    BYTE cCh;

    while( nOpenBrakets && IsParserWorking() )
        switch( GetNextToken() )
        {
        case '}':
            {
                --nOpenBrakets;
                if( 1 != nOpenBrakets || !bFldInst )
                    break;

                if( !bFldRslt )
                {
                    // FieldInst vollstaendig eingelesen, was ist es denn?
                    nRet = MakeFieldInst( sFieldStr );

                    // erstmal Index/Inhaltsverzeichniss ueberspringen
                    // und als normalen Text einfuegen. Spaeter mal auch dem
                    // SwPaM darum aufspannen.
                    if( RTFFLD_TOC == nRet || RTFFLD_INDEX == nRet )
                        return;

                    if( RTFFLD_IMPORT == nRet || RTFFLD_HYPERLINK == nRet )
                        sFieldNm = sFieldStr;

                    sFieldStr.Erase();
                }
                else if( RTFFLD_UNKNOWN == nRet ) // FieldResult wurde eingelesen
                {
                    // der String ist der Wert vom Feld
//                  sFieldStr.Insert( '"', 0 );
//                  sFieldStr.Insert( '"' );

                    // besorge mal das Feld:
                    SwTxtNode* pTxtNd = pPam->GetPoint()->nNode.GetNode().GetTxtNode();
                    SwTxtAttr* pFldAttr = pTxtNd->GetTxtAttr(
                            pPam->GetPoint()->nContent.GetIndex()-1 );

                    ((SwUserFieldType*)pFldAttr->GetFld().GetFld()->GetTyp())->
                                SetContent( sFieldStr );
                }
                else if( sFieldNm.Len() )
                {
                    if( RTFFLD_IMPORT == nRet )
                    {
                        // Grafik einfuegen
                        InsPicture( sFieldNm );
                        nRet = INT_MAX;
                    }
                    else if( RTFFLD_HYPERLINK == nRet && sFieldStr.Len() )
                    {
                        // im FieldStr steht der anzuzeigenden Text, im
                        pDoc->Insert( *pPam, sFieldStr );

                        String sTarget( sFieldNm.GetToken( 1, '\1' ));
                        if( sTarget.Len() )
                            sFieldNm.Erase( sFieldNm.Len() - sTarget.Len() -1 );

                        // oder ueber den Stack setzen??
                        pPam->SetMark();
                        pPam->GetMark()->nContent -= sFieldStr.Len();
                        pDoc->Insert( *pPam,
                                        SwFmtINetFmt( sFieldNm, sTarget ),
                                        SETATTR_DONTEXPAND );
                        pPam->DeleteMark();
                    }
                }
            }
            break;

        case '{':
            if( RTF_IGNOREFLAG != GetNextToken() )
                SkipToken( -1 );
            // Unknown und alle bekannten nicht ausgewerteten Gruppen
            // sofort ueberspringen
            else if( RTF_UNKNOWNCONTROL != GetNextToken() )
                SkipToken( -2 );
            else
            {
                // gleich herausfiltern
                ReadUnknownData();
                if( '}' != GetNextToken() )
                    eState = SVPAR_ERROR;
                break;
            }
            ++nOpenBrakets;
            break;

        case RTF_DATAFIELD:
        case RTF_FIELD:
            SkipGroup();
            break;

        case RTF_FLDINST:
            bFldInst = TRUE;
            break;

        case RTF_FLDRSLT:
            bFldRslt = TRUE;
            break;

        case RTF_U:
            {
                if( nTokenValue )
                    sFieldStr += (sal_Unicode)nTokenValue;
                else
                    sFieldStr += aToken;
            }
            break;

        case RTF_LINE:          cCh = '\n'; goto INSINGLECHAR;
        case RTF_TAB:           cCh = '\t'; goto INSINGLECHAR;
        case RTF_SUBENTRYINDEX: cCh = ':';  goto INSINGLECHAR;
        case RTF_EMDASH:        cCh = 151;  goto INSINGLECHAR;
        case RTF_ENDASH:        cCh = 150;  goto INSINGLECHAR;
        case RTF_BULLET:        cCh = 149;  goto INSINGLECHAR;
        case RTF_LQUOTE:        cCh = 145;  goto INSINGLECHAR;
        case RTF_RQUOTE:        cCh = 146;  goto INSINGLECHAR;
        case RTF_LDBLQUOTE:     cCh = 147;  goto INSINGLECHAR;
        case RTF_RDBLQUOTE:     cCh = 148;  goto INSINGLECHAR;
INSINGLECHAR:
            sFieldStr += ByteString::ConvertToUnicode( cCh,
                                               RTL_TEXTENCODING_MS_1252 );
            break;

        // kein Break, aToken wird als Text gesetzt
        case RTF_TEXTTOKEN:
            sFieldStr += aToken;
            break;

        case RTF_PICT:      // Pic-Daten einlesen!
            if( RTFFLD_IMPORT == nRet )
            {
                Graphic aGrf;
                SvxRTFPictureType aPicType;
                if( ReadBmpData( aGrf, aPicType ) )
                {
                    InsPicture( sFieldNm, &aGrf, &aPicType );
                    nRet = INT_MAX;
                }
                SkipGroup();
            }
            break;

        case RTF_BKMKSTART:
        case RTF_BKMKEND:
        case RTF_BKMK_KEY:
        case RTF_XE:
        case RTF_TC:
        case RTF_NEXTFILE:
        case RTF_TEMPLATE:
        case RTF_SHPRSLT:
            SkipGroup();
            break;
    }

    if( RTFFLD_IMPORT == nRet && sFieldNm.Len() )
    {
        // Grafik einfuegen
        InsPicture( sFieldNm );
    }

    SkipToken( -1 );        // die schliesende Klammer wird "oben" ausgewertet
}


/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/rtf/rtffld.cxx,v 1.1.1.1 2000-09-18 17:14:56 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.51  2000/09/18 16:04:50  willem.vandorp
      OpenOffice header added.

      Revision 1.50  2000/05/09 17:22:46  jp
      Changes for Unicode

      Revision 1.49  2000/03/23 19:01:03  jp
      Bug #74426#: ReadField: skip over some groups

      Revision 1.48  2000/03/10 15:56:55  jp
      Bug #74100#: read W2000 rtf-format

      Revision 1.47  2000/02/17 13:46:51  jp
      Bug #73098#: Import / Export problems

      Revision 1.46  2000/02/11 14:37:57  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.45  2000/01/25 20:12:58  jp
      Bug #72146#: read UniCode character

      Revision 1.44  1999/03/03 13:59:16  JP
      Bug #62735#: Symbolfelder komplett lesen


      Rev 1.43   03 Mar 1999 14:59:16   JP
   Bug #62735#: Symbolfelder komplett lesen

      Rev 1.42   16 Feb 1999 11:57:16   JP
   Task #61942#: Hyperlinks einlesen

      Rev 1.41   17 Nov 1998 10:45:58   OS
   #58263# NumType durch SvxExtNumType ersetzt

      Rev 1.40   11 Aug 1998 12:16:32   JP
   Bug #54796#: fehlender Numerierunstyp und Bugfixes

      Rev 1.39   06 Aug 1998 21:43:28   JP
   Bug #54796#: neue NumerierungsTypen (WW97 kompatibel)

      Rev 1.38   13 May 1998 18:07:18   JP
   PageField: auf PageDesc Format defaulten

      Rev 1.37   20 Feb 1998 13:36:30   MA
   headerfiles gewandert

      Rev 1.36   13 Feb 1998 19:22:02   MIB
   Felder: Schnittstellen-Anpassung fuer Konvertierungs-Funktionen

      Rev 1.35   27 Jan 1998 19:00:38   HR
   HP9000 Krams entfernt

      Rev 1.34   26 Nov 1997 15:05:34   MA
   headerfiles

      Rev 1.33   25 Nov 1997 12:03:02   TJ
   include svrtf.hxx

      Rev 1.32   03 Nov 1997 14:10:34   MA
   precomp entfernt

      Rev 1.31   15 Oct 1997 11:59:44   OM
   Feldumstellung

      Rev 1.30   14 Oct 1997 14:12:06   OM
   Feldumstellung

      Rev 1.29   09 Oct 1997 16:16:44   OM
   Feldumstellung

      Rev 1.28   29 Sep 1997 12:14:38   OM
   Feldumstellung

      Rev 1.27   24 Sep 1997 15:23:20   OM
   Feldumstellung

      Rev 1.26   15 Aug 1997 12:51:44   OS
   charatr/frmatr/txtatr aufgeteilt

      Rev 1.25   12 Nov 1996 18:28:12   sdo
   GCC-Parser

      Rev 1.24   29 Oct 1996 12:58:48   JP
   am Doc ist das NodesArray nur noch ueber Get..() zugaenglich

      Rev 1.23   23 Oct 1996 19:49:08   JP
   String Umstellung: [] -> GetChar()

      Rev 1.22   28 Jun 1996 15:07:26   MA
   includes

      Rev 1.21   19 Jun 1996 11:57:52   MA
   headerfiles 323

      Rev 1.20   10 Jun 1996 11:23:38   JP
   ImportFeld: jetzt auch mit dem neuen WinWord 6.0 Format

      Rev 1.19   30 Apr 1996 09:36:28   OM
   Mehrere Datenbanken pro Dok

      Rev 1.17   11 Apr 1996 17:31:38   JP
   Umstellung - RelToAbs/AbsToRel

      Rev 1.16   10 Apr 1996 18:59:00   JP
   Umstellung relative/absolute Pfade fuer Grafiken

      Rev 1.15   11 Mar 1996 23:08:24   JP
   InsPicture: keine Extension abschneiden

      Rev 1.14   11 Jan 1996 22:04:00   JP
   Date/Time - Felder: die Formate richtig lesen/schreiben

      Rev 1.13   13 Dec 1995 21:04:10   JP
   Warnings entfernt

      Rev 1.12   24 Nov 1995 17:24:10   OM
   PCH->PRECOMPILED

      Rev 1.11   07 Nov 1995 20:06:20   JP
   Readonly-Daten hinter segeofglobals verschoben

      Rev 1.10   21 Aug 1995 21:30:38   JP
   svxitems-HeaderFile entfernt

      Rev 1.9   18 Aug 1995 19:05:50   mk
   HP9000 (MDA)

      Rev 1.8   09 Aug 1995 18:15:02   JP
   Daten vors SEG_EOFGLOBAL verschoben

      Rev 1.7   03 Apr 1995 20:51:30   JP
   fuer PreComp.Header eingerichtet

      Rev 1.6   13 Mar 1995 14:56:20   KH
   Mac jetzt richtig

      Rev 1.5   08 Feb 1995 09:43:08   JP
   alten RTF-Parser entfernt, Sw_RTF -> SwRTF

      Rev 1.4   18 Jan 1995 21:05:12   ER
   fld.hxx -> *fld*.hxx

      Rev 1.3   11 Jan 1995 19:36:28   JP
   RTF-Reader fertiggestellt

      Rev 1.2   09 Jan 1995 19:35:30   JP
   Symbolzeichen: kein Wert, nicht einfuegen

      Rev 1.1   06 Jan 1995 12:07:08   JP
   originalen Feldnamen returnen

      Rev 1.0   22 Dec 1994 17:34:36   JP
   Initial revision.

*************************************************************************/

diff --git a/sw/source/filter/rtf/rtffly.cxx b/sw/source/filter/rtf/rtffly.cxx
new file mode 100644
index 0000000..ac7f121
--- /dev/null
+++ b/sw/source/filter/rtf/rtffly.cxx
@@ -0,0 +1,1745 @@
/*************************************************************************
 *
 *  $RCSfile: rtffly.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:56 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _LIST_HXX //autogen
#include <tools/list.hxx>
#endif
#ifndef _CACHESTR_HXX //autogen
#include <tools/cachestr.hxx>
#endif
#ifndef _RTFTOKEN_H
#include <svtools/rtftoken.h>
#endif
#ifndef _SFXITEMITER_HXX //autogen
#include <svtools/itemiter.hxx>
#endif
#ifndef _SVX_PRNTITEM_HXX //autogen
#include <svx/prntitem.hxx>
#endif
#ifndef _SVX_OPAQITEM_HXX //autogen
#include <svx/opaqitem.hxx>
#endif
#ifndef _SVX_PROTITEM_HXX //autogen
#include <svx/protitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_BRKITEM_HXX //autogen
#include <svx/brkitem.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen wg. SvxBoxItem
#include <svx/boxitem.hxx>
#endif
#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _FMTANCHR_HXX //autogen
#include <fmtanchr.hxx>
#endif
#ifndef _FMTPDSC_HXX //autogen
#include <fmtpdsc.hxx>
#endif
#ifndef _FMTORNT_HXX //autogen
#include <fmtornt.hxx>
#endif
#ifndef _FMTSRND_HXX //autogen
#include <fmtsrnd.hxx>
#endif
#ifndef _FMTCLDS_HXX //autogen
#include <fmtclds.hxx>
#endif
#ifndef _FMTCNTNT_HXX //autogen
#include <fmtcntnt.hxx>
#endif
#ifndef _FRMATR_HXX
#include <frmatr.hxx>
#endif
#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _PAM_HXX
#include <pam.hxx>
#endif
#ifndef _NDTXT_HXX
#include <ndtxt.hxx>
#endif
#ifndef _SHELLIO_HXX
#include <shellio.hxx>
#endif
#ifndef _SWPARRTF_HXX
#include <swparrtf.hxx>
#endif
#ifndef _GRFATR_HXX
#include <grfatr.hxx>
#endif
#ifndef _PARATR_HXX
#include <paratr.hxx>
#endif
#ifndef _POOLFMT_HXX
#include <poolfmt.hxx>
#endif
#ifndef _RTF_HXX
#include <rtf.hxx>
#endif
#ifndef _NDGRF_HXX
#include <ndgrf.hxx>
#endif
#ifndef _PAGEDESC_HXX
#include <pagedesc.hxx>
#endif
#ifndef _SWTABLE_HXX
#include <swtable.hxx>
#endif
#ifndef _TXTFLCNT_HXX
#include <txtflcnt.hxx>
#endif
#ifndef _FMTFLCNT_HXX
#include <fmtflcnt.hxx>
#endif
#ifndef _FLTINI_HXX
#include <fltini.hxx>
#endif


#define ANCHOR(p)   ((SwFmtAnchor*)p)

// steht in shellio.hxx
extern SwCntntNode* GoNextNds( SwNodeIndex * pIdx, FASTBOOL bChk );

SV_IMPL_PTRARR( SwFlySaveArr, SwFlySave* )

inline const SwFmtFrmSize GetFrmSize(const SfxItemSet& rSet, BOOL bInP=TRUE)
    { return (const SwFmtFrmSize&)rSet.Get( RES_FRM_SIZE,bInP); }


/*  */


SwFlySave::SwFlySave( const SwPaM& rPam, SfxItemSet& rSet )
    : aFlySet( rSet ),
    nSttNd( rPam.GetPoint()->nNode ), nEndNd( nSttNd ),
    nEndCnt( 0 ), nPageWidth( ATT_MIN_SIZE ),
    nDropLines( 0 ), nDropAnchor( 0 )
{
}

int SwFlySave::IsEqualFly( const SwPaM& rPos, SfxItemSet& rSet )
{
    if( rSet.Count() != aFlySet.Count() || nDropAnchor )
        return FALSE;

    // nur TextNodes zusammenfassen
    if( nSttNd == nEndNd && nEndNd.GetNode().IsNoTxtNode() )
        return FALSE;

    // teste auf gleiche / naechste Position
    if( rPos.GetPoint()->nNode.GetIndex() == nEndNd.GetIndex() )
    {
        if( 1 < (rPos.GetPoint()->nContent.GetIndex() - nEndCnt) )
            return FALSE;
    }
    else if( rPos.GetPoint()->nContent.GetIndex() )
        return FALSE;
    else
    {
        SwNodeIndex aIdx( nEndNd );
        SwCntntNode* pCNd = rPos.GetDoc()->GetNodes()[ aIdx ]->GetCntntNode();
        if( !GoNextNds( &aIdx, TRUE ) ||
            aIdx.GetIndex() != rPos.GetPoint()->nNode.GetIndex() ||
            ( pCNd && pCNd->Len() != nEndCnt ))
        {
            return FALSE;
        }
    }

    if( rSet.Count() )
    {
        SfxItemIter aIter( rSet );
        const SfxPoolItem *pItem, *pCurr = aIter.GetCurItem();
        while( TRUE )
        {
            if( SFX_ITEM_SET != aFlySet.GetItemState( pCurr->Which(),
                FALSE, &pItem ) ||
                // Ankerattribute gesondert behandeln
                ( RES_ANCHOR == pCurr->Which()
                    ? (ANCHOR(pCurr)->GetAnchorId() != ANCHOR(pItem)->GetAnchorId() ||
                       ANCHOR(pCurr)->GetPageNum() != ANCHOR(pItem)->GetPageNum())
                    : *pItem != *pCurr ))
                        return FALSE;

            if( aIter.IsAtEnd() )
                break;
            pCurr = aIter.NextItem();
        }
    }
    return TRUE;
}

void SwFlySave::SetFlySize( const SwTableNode& rTblNd )
{
    // sollte der Fly kleiner als diese Tabelle sein, dann
    // korrigiere diesen (nur bei abs. Angaben!)
    SwTwips nWidth = rTblNd.GetTable().GetFrmFmt()->GetFrmSize().GetWidth();
    const SwFmtFrmSize& rSz = GetFrmSize( aFlySet );
    if( nWidth > rSz.GetWidth() )
        aFlySet.Put( SwFmtFrmSize( rSz.GetSizeType(), nWidth, rSz.GetHeight() ));
}

BOOL lcl_HasBreakAttrs( const SwCntntNode& rNd )
{
    BOOL bRet = FALSE;
    const SfxItemSet& rSet = rNd.GetSwAttrSet();
    const SfxPoolItem* pItem;
    if( SFX_ITEM_SET == rSet.GetItemState( RES_BREAK, TRUE, &pItem ) &&
        SVX_BREAK_NONE != ((SvxFmtBreakItem*)pItem)->GetBreak() )
        bRet = TRUE;
    else if( SFX_ITEM_SET == rSet.GetItemState( RES_PAGEDESC, TRUE, &pItem )&&
         0 != ((SwFmtPageDesc*)pItem)->GetPageDesc() )
        bRet = TRUE;
    return bRet;
}


void lcl_CpyBreakAttrs( SwCntntNode* pSrcNd, SwCntntNode* pDstNd,
                        SwNodeIndex* pNewIdx )
{
    SwAttrSet* pSet;
    if( pSrcNd && pDstNd && 0 != ( pSet = pSrcNd->GetpSwAttrSet() ) )
    {
        const SfxPoolItem *pDescItem, *pBreakItem;

        if( SFX_ITEM_SET != pSet->GetItemState( RES_BREAK,
                                        FALSE, &pBreakItem ) )
            pBreakItem = 0;

        if( SFX_ITEM_SET != pSet->GetItemState( RES_PAGEDESC,
                                        FALSE, &pDescItem ) )
            pDescItem = 0;

        if( pDescItem || pBreakItem )
        {
            if( lcl_HasBreakAttrs( *pDstNd ))
            {
                SwPosition aPos( *pDstNd, SwIndex( pDstNd ));
                aPos.nNode--;
                pDstNd->GetDoc()->AppendTxtNode( aPos );
                if( pNewIdx )
                    *pNewIdx = aPos.nNode;

                SwCntntNode* pOldNd = pDstNd;
                pDstNd = aPos.nNode.GetNode().GetCntntNode();
                pDstNd->ChgFmtColl( pOldNd->GetFmtColl() );
                if( pDstNd->GetpSwAttrSet() )
                {
                    SfxItemSet aSet( *pDstNd->GetpSwAttrSet() );
                    aSet.ClearItem( RES_BREAK );
                    aSet.ClearItem( RES_PAGEDESC );
                    pDstNd->SetAttr( aSet );
                }
            }
            if( pBreakItem )
            {
                pDstNd->SetAttr( *pBreakItem );
                pSrcNd->ResetAttr( RES_BREAK );
            }
            if( pDescItem )
            {
                pDstNd->SetAttr( *pDescItem );
                pSrcNd->ResetAttr( RES_PAGEDESC );
            }
        }
    }
}


void SwRTFParser::SetFlysInDoc()
{
    // !! von Oben abarbeiten, CntntPos ist kein Index !
    SwNodes & rNds = pDoc->GetNodes();
    SvPtrarr aPrevFmts( 255 < aFlyArr.Count() ? aFlyArr.Count() : 255 );
    SwFrmFmt* pParent = pDoc->GetFrmFmtFromPool( RES_POOLFRM_FRAME );
    for( USHORT n = 0; n < aFlyArr.Count(); ++n )
    {
        SwFlySave* pFlySave = aFlyArr[ n ];

        ASSERT( !pFlySave->nSttNd.GetNode().FindFlyStartNode(),
                "Content vom Fly steht in einem Fly" );
        ASSERT( pFlySave->nSttNd.GetIndex() <= pFlySave->nEndNd.GetIndex(),
                "Fly hat falschen Bereich" );

        //JP 21.09.98: wenn ein DropCap ist, dann Text im Node belassen, am
        //              Absatz das Absatz Attribut setzen. Ggfs noch die
        //              FontSize zuruecksetzen, damit das DropCap nicht zu
        //              groá wird.
        if( pFlySave->nDropAnchor )
        {
            SwTxtNode* pSttNd = pFlySave->nSttNd.GetNode().GetTxtNode(),
                     * pEndNd = pFlySave->nEndNd.GetNode().GetTxtNode();
            if( pSttNd && pEndNd &&
                pSttNd->GetIndex() + 1 == pEndNd->GetIndex() )
            {
                BOOL bJoined;
                {
                    SwPaM aTmp( *pEndNd, 0, *pSttNd, pSttNd->GetTxt().Len() );
                    bJoined = pDoc->DeleteAndJoin( aTmp );
                }
                if( bJoined )
                {
                    SwFmtDrop aDropCap;
                    aDropCap.GetLines() = (BYTE)pFlySave->nDropLines;
                    aDropCap.GetChars() = 1;

                    SwIndex aIdx( pEndNd );
                    pEndNd->RstAttr( aIdx, 1, RES_CHRATR_FONTSIZE );
                    pEndNd->SwCntntNode::SetAttr( aDropCap );
                }
            }
            delete pFlySave;
            continue;
        }

        // liegt Ende und Start vom Naechsten im gleichen Node, dann muss
        // gesplittet werden
        if( n + 1 < aFlyArr.Count() && pFlySave->nEndCnt &&
            pFlySave->nEndNd == aFlyArr[ n + 1 ]->nSttNd )
        {
            SwCntntNode* pCNd = rNds[ pFlySave->nEndNd ]->GetCntntNode();
            if( pCNd )
            {
                SwPosition aPos( pFlySave->nEndNd,
                                SwIndex( pCNd, pFlySave->nEndCnt ));
                pDoc->SplitNode( aPos );
                pFlySave->nEndNd--;
            }
            else
                pFlySave->nEndCnt = 0;
        }

        // verschiebe den Inhalt von diesem Anchor in den Auto-TextBereich
        // und erzeuge dadurch den richtigen SwG-Rahmen
        SwNodeRange aRg( pFlySave->nSttNd, 0, pFlySave->nEndNd,
                        (pFlySave->nEndCnt ? 1 : 0) );
        BOOL bMakeEmptySection = aRg.aStart < aRg.aEnd;

        {
            // Nur TextNodes koennen in Tabellen stehen !!
            const SwNode* pNd = &pFlySave->nSttNd.GetNode();
            if( pNd->IsNoTxtNode() )
            {
                // die Size muss noch korrigiert werden!
                nAktPageDesc = 0;       // Standart PageDesc
                if( SFX_ITEM_SET != pFlySave->aFlySet.GetItemState(
                    RES_FRM_SIZE, FALSE ) )
                    _SetPictureSize( *(SwNoTxtNode*)pNd, aRg.aStart,
                                    pFlySave->aFlySet );
                if( 0 != ( pNd = pNd->FindTableNode() ) )
                    pFlySave->SetFlySize( *(SwTableNode*)pNd );
            }
            else
            {
                // TabelleNodes beachten
                BOOL bMoveFromCell = FALSE;
                pNd = pNd->FindTableNode();
                if( pNd )   // am Anfang eine Tabelle, -> Bereich auf TabStart
                {
                    if( pFlySave->nSttNd.GetNode().FindStartNode() ==
                        pFlySave->nEndNd.GetNode().FindStartNode() )
                    {
                        // dann nur den Node verschieben
                        SwNodeIndex& rIdx = pFlySave->nSttNd;
                        if( rIdx.GetNode().EndOfSectionIndex() -
                            rIdx.GetNode().FindStartNode()->GetIndex() ==
                            aRg.aEnd.GetIndex() - aRg.aStart.GetIndex() + 1 )
                        {
                            // dann bliebe kein Node mehr stehen, also
                            // erzeuge eine leere Text Section!
                            bMakeEmptySection = FALSE;
                        }
                        bMoveFromCell = TRUE;
                    }
                    else
                        aRg.aStart = *pNd;
                }

                if( bMakeEmptySection )
                {
                    pNd = &aRg.aEnd.GetNode();
                    ULONG nSectEnd = pNd->EndOfSectionIndex();
                    if( !pFlySave->nEndCnt )
                        ++nSectEnd;

                    if( !bMoveFromCell && !pNd->IsTableNode() &&
                        0 != (pNd = pNd->FindTableNode() ) )
                    {
                        const SwNode* pTblBxNd;
                        // Ende der Tabelle ist hinter dieser Box ??
                        if( pNd->EndOfSectionIndex() == nSectEnd )
                            aRg.aEnd = nSectEnd+1;
                        // is the end in the first box of the table, then
                        // move before the table (Bug 67663)
                        else if( 0 != ( pTblBxNd = aRg.aEnd.GetNode().
                                                FindTableBoxStartNode()) &&
                                 pTblBxNd->GetIndex() - 1 == pNd->GetIndex())
                            aRg.aEnd = *pNd;
                        else
                        {
                            // Tabelle ist noch groesser, also splitte sie hier.
                            rNds.SplitTable( aRg.aEnd, TRUE );
                            aRg.aEnd = pNd->EndOfSectionIndex() + 1;
                        }
                    }
                }
            }
        }

        // vorm verschieben muss sich der Index auf die alte Position
        // gemerkt werden, der Index wird mit verschoben !!!

        SwNodeIndex aTmpIdx( rNds.GetEndOfAutotext() );
        SwStartNode* pSttNd = bMakeEmptySection
                ? rNds.MakeEmptySection( aTmpIdx, SwFlyStartNode )
                : rNds.MakeTextSection( aTmpIdx, SwFlyStartNode,
                        (SwTxtFmtColl*)pDoc->GetDfltTxtFmtColl() );

        // das ist die Verankerungs-Position (fuers Layout!)
        pFlySave->nSttNd = aRg.aStart.GetIndex()-1;
        if( bMakeEmptySection )
        {
            // check: the move does not clear the surrounded section. If all
            // nodes moved away, then create a new TxtNode
            {
                SwNodeIndex aPrev( aRg.aStart, -1 );
                if( aPrev.GetNode().IsStartNode() &&
                    aPrev.GetNode().EndOfSectionNode() == &aRg.aEnd.GetNode())
                {
                    // create new txtnode, because the section does never be empty
                    pDoc->GetNodes().MakeTxtNode( aRg.aEnd,
                            (SwTxtFmtColl*)pDoc->GetDfltTxtFmtColl() );
                    aRg.aEnd--;
                }
            }
            aTmpIdx = *pSttNd->EndOfSectionNode();
            pDoc->Move( aRg, aTmpIdx );
        }

        pFlySave->aFlySet.Put( SwFmtCntnt( pSttNd ));

        CalculateFlySize( pFlySave->aFlySet, pFlySave->nSttNd,
                          pFlySave->nPageWidth );

        // if the section only contains one Node and this has a
        // border or backgorund, then put it to the frame
        // Not in our own RTF-Format!
        if( pSttNd->GetIndex() + 2 == pSttNd->EndOfSectionIndex() &&
            !bSwPageDesc )
        {
            SwTxtNode* pSrcNd = pDoc->GetNodes()[ pSttNd->GetIndex() + 1 ]
                                    ->GetTxtNode();
            if( pSrcNd && pSrcNd->GetpSwAttrSet() )
            {
                SfxItemSet aTmpSet( pDoc->GetAttrPool(),
                                    RES_BACKGROUND, RES_BOX );
                aTmpSet.Put( *pSrcNd->GetpSwAttrSet() );
                if( aTmpSet.Count() )
                {
                    pFlySave->aFlySet.Put( aTmpSet );
                    pSrcNd->ResetAttr( RES_BACKGROUND, RES_BOX );
                }
            }
        }

        SwFlyFrmFmt* pFmt = pDoc->MakeFlyFrmFmt( aEmptyStr, pParent );
        pFmt->SetAttr( pFlySave->aFlySet );

        const SwFmtAnchor& rAnchor = pFmt->GetAnchor();
        if( FLY_IN_CNTNT != rAnchor.GetAnchorId() )
        {
            // korrigiere noch den Absatz, ist immer der vorhergehende !
            // JP 20.09.95: wenn es diesen gibt! (DocAnfang!)

            //JP 02.08.99: that is wrong. The anchor is ever the NEXT!
            //JP 05.08.99: there are an Bug in the ExportFilter which will
            //              be fixed in the Version 517 - by SWG-Export
            //              the fly will be after the paragraph - but in RTF
            //              the flys will be before the paragraph.
            if( !bSwPageDesc || 5430 < GetVersionNo() )
                pFlySave->nSttNd++;

//            if( !pFlySave->nSttNd.GetNode().IsCntntNode() )
            {
                // Seitenumbrueche in den Bodybereich verschieben!
                SwCntntNode* pSrcNd = aRg.aStart.GetNode().GetCntntNode();
                SwCntntNode* pDstNd = pFlySave->nSttNd.GetNode().GetCntntNode();
                if( !pDstNd )
                    pDstNd = pDoc->GetNodes().GoNext( &pFlySave->nSttNd );

                ::lcl_CpyBreakAttrs( pSrcNd, pDstNd, &pFlySave->nSttNd );
            }


            SwPosition aPos( pFlySave->nSttNd );
            SwFmtAnchor aAnchor( rAnchor );
            aAnchor.SetAnchor( &aPos );
            pFmt->SetAttr( aAnchor );

            // check if the new Frame contains any anchors to previous
            // flys. This is in RTF not allowed, so move all anchors to
            // the prev position
            {
                ULONG nSttNd = pSttNd->GetIndex(),
                      nEndNd = pSttNd->EndOfSectionIndex();
                for( USHORT nPrevFmts = aPrevFmts.Count(); nPrevFmts; )
                {
                    SwFmt* pTmpFmt = (SwFmt*)aPrevFmts[ --nPrevFmts ];
                    const SwFmtAnchor& rAn = pTmpFmt->GetAnchor();
                    ULONG nNd = rAn.GetCntntAnchor()->nNode.GetIndex();
                    if( nSttNd < nNd && nNd < nEndNd )
                    {
                        SwFmtAnchor aAnchor( rAn );
                        aAnchor.SetAnchor( &aPos );
                        pTmpFmt->SetAttr( aAnchor );
                    }
                    else
                        // then forget it
                        aPrevFmts.Remove( nPrevFmts, 1 );
                }

                void* p = (void*)pFmt;
                aPrevFmts.Insert( p, aPrevFmts.Count() );
            }
        }
        delete pFlySave;
    }
    aFlyArr.Remove( 0, aFlyArr.Count() );
}

void SwRTFParser::ReadFly( int nToken, SfxItemSet* pSet )
{
    // ein Set fuer die FrmFmt-Attribute
    SfxItemSet aSet( pDoc->GetAttrPool(), RES_FRMATR_BEGIN, RES_FRMATR_END-1 );
    if( !IsNewDoc() )
        Reader::ResetFrmFmtAttrs( aSet );

    // der Fly beginnt immer in einem neuen Absatz
    if( pPam->GetPoint()->nContent.GetIndex() )
        InsertPara();

    // RTF-Defaults setzen:
    SwFmtAnchor aAnchor( FLY_PAGE, 1 );
    SwFmtHoriOrient aHori( 0, HORI_LEFT, /*FRAME*/REL_PG_PRTAREA );
    SwFmtVertOrient aVert( 0, VERT_TOP, REL_PG_PRTAREA );

    USHORT nCols = USHRT_MAX, nColSpace = USHRT_MAX, nAktCol = 0;
    SvUShorts aColumns;

    BOOL bChkDropCap = 0 == pSet;
    USHORT nDropCapLines = 0, nDropCapAnchor = 0;
    int nOpenBrakets = GetOpenBrakets();

    if( !pSet )
        pSet = &aSet;
    else
    {
        // die Werte aus dem uebergebenen!
        aAnchor = (SwFmtAnchor&)pSet->Get( RES_ANCHOR );
        aHori = (SwFmtHoriOrient&)pSet->Get( RES_HORI_ORIENT );
        aVert = (SwFmtVertOrient&)pSet->Get( RES_VERT_ORIENT );
    }

    // dann sammel mal alle Attribute zusammen
    int bWeiter = TRUE;
    do {
        USHORT nVal = USHORT(nTokenValue);
        switch( nToken )
        {
        case RTF_ABSW:
            {
                SwFmtFrmSize aSz( ATT_MIN_SIZE, nTokenValue, 0 );
                const SfxPoolItem* pItem;
                if( SFX_ITEM_SET == pSet->GetItemState( RES_FRM_SIZE, TRUE,
                    &pItem ))
                {
                    aSz.SetSizeType( ((SwFmtFrmSize*)pItem)->GetSizeType() );
                    aSz.SetHeight( ((SwFmtFrmSize*)pItem)->GetHeight() );
                }
                if( MINFLY > nTokenValue )  nTokenValue = MINFLY;
                aSet.Put( aSz );
            }
            break;
        case RTF_ABSH:
            {
                SwFmtFrmSize aSz( ATT_MIN_SIZE, 0, MINFLY );
                const SfxPoolItem* pItem;
                if( SFX_ITEM_SET == pSet->GetItemState( RES_FRM_SIZE, TRUE,
                    &pItem ))
                {
                    aSz.SetWidth( ((SwFmtFrmSize*)pItem)->GetWidth() );
                }

                if( 0 > nTokenValue )
                {
                    nTokenValue = -nTokenValue;
                    aSz.SetSizeType( ATT_FIX_SIZE );
                }
                if( MINFLY > nTokenValue )  nTokenValue = MINFLY;
                aSz.SetHeight( nTokenValue );
                aSet.Put( aSz );
            }
            break;

        case RTF_NOWRAP:
            {
                pSet->Put( SwFmtSurround( SURROUND_NONE ));
            }
            break;
        case RTF_DXFRTEXT:
                {
                    SvxULSpaceItem aUL;
                    SvxLRSpaceItem aLR;
                    aUL.SetUpper( nVal );   aUL.SetLower( nVal );
                    aLR.SetLeft( nVal );    aLR.SetRight( nVal );
                    pSet->Put( aUL );
                    pSet->Put( aLR );
                }
                break;

        case RTF_DFRMTXTX:
                {
                    SvxLRSpaceItem aLR;
                    aLR.SetLeft( nVal );    aLR.SetRight( nVal );
                    pSet->Put( aLR );
                }
                break;
        case RTF_DFRMTXTY:
                {
                    SvxULSpaceItem aUL;
                    aUL.SetUpper( nVal );   aUL.SetLower( nVal );
                    pSet->Put( aUL );
                }
                break;

        case RTF_POSNEGX:
        case RTF_POSX:      aHori.SetHoriOrient( HORI_NONE );
                            aHori.SetPos( (long)nTokenValue );
                            break;
        case RTF_POSXC:     aHori.SetHoriOrient( HORI_CENTER );     break;
        case RTF_POSXI:     aHori.SetHoriOrient( HORI_LEFT );
                            aHori.SetPosToggle( TRUE );
                            break;
        case RTF_POSXO:     aHori.SetHoriOrient( HORI_RIGHT );
                            aHori.SetPosToggle( TRUE );
                            break;
        case RTF_POSXL:     aHori.SetHoriOrient( HORI_LEFT );       break;
        case RTF_POSXR:     aHori.SetHoriOrient( HORI_RIGHT );      break;

        case RTF_POSNEGY:
        case RTF_POSY:      aVert.SetVertOrient( VERT_NONE );
                            aVert.SetPos( (long)nTokenValue );
                            break;
        case RTF_POSYT:     aVert.SetVertOrient( VERT_TOP );    break;
        case RTF_POSYB:     aVert.SetVertOrient( VERT_BOTTOM ); break;
        case RTF_POSYC:     aVert.SetVertOrient( VERT_CENTER ); break;

        case RTF_PHMRG:     aHori.SetRelationOrient( REL_PG_PRTAREA ); break;
        case RTF_PVMRG:     aVert.SetRelationOrient( REL_PG_PRTAREA ); break;
        case RTF_PHPG:      aHori.SetRelationOrient( REL_PG_FRAME ); break;
        case RTF_PVPG:      aVert.SetRelationOrient( REL_PG_FRAME );break;
        case RTF_PHCOL:     aHori.SetRelationOrient( FRAME ); break;
        case RTF_PVPARA:    aVert.SetRelationOrient( FRAME ); break;

        case RTF_POSYIL:
        case RTF_ABSLOCK:
                                break;

        case RTF_DROPCAPLI:                         // Dropcaps !!
                if( bChkDropCap )
                {
                    nDropCapLines = USHORT( nTokenValue );
                    if( !nDropCapAnchor )
                        nDropCapAnchor = 1;
                }
                break;
        case RTF_DROPCAPLT:
                if( bChkDropCap )
                {
                    nDropCapAnchor = USHORT( nTokenValue );
                    if( !nDropCapLines )
                        nDropCapLines = 3;
                }
                break;


        // fuer die "alten" Writer - haben die Spaltigkeit falsch heraus-
        // geschrieben
        case RTF_COLS:          nCols = USHORT( nTokenValue );      break;
        case RTF_COLSX:         nColSpace = USHORT( nTokenValue );  break;
        case RTF_COLNO:
            nAktCol = USHORT( nTokenValue );
            if( RTF_COLW == GetNextToken() )
            {
                USHORT nWidth = USHORT( nTokenValue ), nSpace = 0;
                if( RTF_COLSR == GetNextToken() )
                    nSpace = USHORT( nTokenValue );
                else
                    SkipToken( -1 );        // wieder zurueck

                if( --nAktCol == ( aColumns.Count() / 2 ) )
                {
                    aColumns.Insert( nWidth + nSpace, aColumns.Count() );
                    aColumns.Insert( nSpace, aColumns.Count() );
                }
            }
            break;

        case '{':
            {
                short nSkip = 0;
                if( RTF_IGNOREFLAG != ( nToken = GetNextToken() ))
                {
                    if( RTF_SHADINGDEF == (nToken & ~0xff) )
                    {
                        ReadBackgroundAttr( nToken, aSet );
                        GetNextToken();     // Klammer ueberlesen
                    }
                    else
                        nSkip = -1;
                }
                else if( RTF_APOCTL ==
                    ((nToken = GetNextToken() ) & ~(0xff | RTF_SWGDEFS)) )
                {
                    bReadSwFly = TRUE;      // alles kommt in den akt. Fly
                    SvxLRSpaceItem aLR;
                    SvxULSpaceItem aUL;
                    nCols = USHRT_MAX;      // neu aufsetzen
                    nColSpace = USHRT_MAX;
                    do {
                    nVal = USHORT(nTokenValue);
                    switch( nToken )
                    {
                    // Swg-Frame-Tokens
                    case RTF_FLYPRINT:
                        {
                            pSet->Put( SvxPrintItem( RES_PRINT, FALSE ));
                        }
                        break;
                    case RTF_FLYOPAQUE:
                        {
                            pSet->Put( SvxOpaqueItem( RES_OPAQUE, FALSE ));
                        }
                        break;

                    case RTF_FLYPRTCTD:
                        {
                            RTFProtect aP( (BYTE)nTokenValue );
                            SvxProtectItem aProtectItem;
                            aProtectItem.SetCntntProtect( aP.GetCntnt() );
                            aProtectItem.SetSizeProtect( aP.GetSize() );
                            aProtectItem.SetPosProtect( aP.GetPos() );
                            pSet->Put( aProtectItem );
                        }
                        break;

                    case RTF_FLYMAINCNT:
                        {
                            RTFSurround aMC( (BYTE)nTokenValue );
                            SwFmtSurround aSurr( (SwSurround)aMC.GetOrder());
                            if( aMC.GetGoldCut() )
                                aSurr.SetSurround( SURROUND_IDEAL );
                            pSet->Put( aSurr );
                        }
                        break;
                    case RTF_FLYVERT:
                        {
                            RTFVertOrient aVO( nVal );
                            aVert.SetVertOrient( (SwVertOrient)aVO.GetOrient() );
                            aVert.SetRelationOrient( (SwRelationOrient)aVO.GetRelation() );
                        }
                        break;
                    case RTF_FLYHORZ:
                        {
                            RTFHoriOrient aHO( nVal );
                            aHori.SetHoriOrient( (SwHoriOrient)aHO.GetOrient() );
                            aHori.SetRelationOrient( (SwRelationOrient)aHO.GetRelation() );
                        }
                        break;
                    case RTF_FLYOUTLEFT:        aLR.SetLeft( nVal );        break;
                    case RTF_FLYOUTRIGHT:       aLR.SetRight( nVal );       break;
                    case RTF_FLYOUTUPPER:       aUL.SetUpper( nVal );       break;
                    case RTF_FLYOUTLOWER:       aUL.SetLower( nVal );       break;
                    case RTF_FLYANCHOR:
                            switch( GetNextToken() )
                            {
                            case RTF_FLY_PAGE:
                                aAnchor.SetType( FLY_PAGE );
                                aAnchor.SetPageNum( USHORT(nTokenValue));
                                aAnchor.SetAnchor( 0 );
                                break;

                            case RTF_FLY_CNTNT:
                                {
                                    SwNodeIndex aIdx( pPam->GetPoint()->nNode );
                                    pDoc->GetNodes().GoPrevious( &aIdx );
                                    SwPosition aPos( aIdx );
                                    aAnchor.SetType( FLY_AT_CNTNT );
                                    aAnchor.SetAnchor( &aPos );
                                }
                                break;

// JP 26.09.94: die Bindung an die Spalte gibt es nicht mehr !!
//                          case RTF_FLY_COLUMN:
                            }
                            break;
                    case RTF_COLS:  nCols = USHORT( nTokenValue );      break;
                    case RTF_COLSX: nColSpace = USHORT( nTokenValue );  break;
                    case RTF_COLNO:
                        nAktCol = USHORT( nTokenValue );
                        if( RTF_COLW == GetNextToken() )
                        {
                            USHORT nWidth = USHORT( nTokenValue ), nSpace = 0;
                            if( RTF_COLSR == GetNextToken() )
                                nSpace = USHORT( nTokenValue );
                            else
                                SkipToken( -1 );        // wieder zurueck

                            if( --nAktCol == ( aColumns.Count() / 2 ) )
                            {
                                aColumns.Insert( nWidth + nSpace, aColumns.Count() );
                                aColumns.Insert( nSpace, aColumns.Count() );
                            }
                        }
                        break;

                    case '{':
                        if( RTF_BRDBOX == ( nToken = GetNextToken() ) )
                            ReadBorderAttr( nToken, aSet );
                        else if( RTF_SHADINGDEF == (nToken & ~0xff ) )
                            ReadBackgroundAttr( nToken, aSet );
                        else if( RTF_IGNOREFLAG == nToken )
                        {
                            int bSkipGrp = TRUE;
                            switch( nToken = GetNextToken() )
                            {
                            case RTF_SHADOW:
                            case RTF_BRDBOX:
                                ReadAttr( SkipToken( -2 ), &aSet );
                                bSkipGrp = FALSE;
                                break;

                            case RTF_BRDRT:
                            case RTF_BRDRB:
                            case RTF_BRDRR:
                            case RTF_BRDRL:
                                bSkipGrp = FALSE;
                                ReadBorderAttr( SkipToken( -2 ), aSet );
                                break;
                            }

                                // keine weitere Klammer mehr ueberlesen!!!
                            if( !bSkipGrp )
                                break;

                            SkipGroup();
                        }
                        else
                            SkipGroup();
                        GetNextToken();     // Klammer ueberlesen
                        break;
                    }
                    } while( IsParserWorking() &&
                                '}' != ( nToken = GetNextToken() ));

                    if( aUL.GetUpper() || aUL.GetLower() )
                        pSet->Put( aUL );
                    if( aLR.GetLeft() || aLR.GetRight() )
                        pSet->Put( aLR );
                }
                else if( RTF_BRDBOX == nToken )
                    ReadBorderAttr( nToken, aSet );
                else if( RTF_SHADOW == nToken )
                    ReadAttr( SkipToken( -2 ), &aSet );
                else if( RTF_SHADINGDEF == (nToken & ~0xff ) )
                    ReadBackgroundAttr( nToken, aSet );
                else if( RTF_UNKNOWNCONTROL == nToken )
                    SkipGroup();
                else
                    nSkip = -2;

                if( nSkip )
                {
                    nToken = SkipToken( nSkip );
                    bWeiter = FALSE;
                }
            }
            break;

        default:
            bWeiter = FALSE;
        }

        if( bWeiter )
            nToken = GetNextToken();
    } while( bWeiter && IsParserWorking() );

    if( !bReadSwFly && ( FRAME == aVert.GetRelationOrient() ||
        //JP 21.07.99: for Bug 67630 - it read into Header od Footer, set
        //              never the anchor to Page. Because it is then only
        //              on the first used page .
        ( FLY_PAGE == aAnchor.GetAnchorId() &&
          pPam->GetPoint()->nNode < pDoc->GetNodes().GetEndOfExtras() &&
          ( pPam->GetNode()->FindHeaderStartNode() ||
            pPam->GetNode()->FindFooterStartNode() )) ))
        aAnchor.SetType( FLY_AT_CNTNT );

    pSet->Put( aAnchor );
    pSet->Put( aHori );
    pSet->Put( aVert );

    if( nCols && USHRT_MAX != nCols )
    {
        SwFmtCol aCol;
        if( USHRT_MAX == nColSpace )
            nColSpace = 720;

        const SvxLRSpaceItem& rLR = (SvxLRSpaceItem&)pSet->Get( RES_LR_SPACE );
        ULONG nWidth = USHRT_MAX;
        aCol.Init( nCols, nColSpace, USHORT( nWidth ) );
        if( nCols == ( aColumns.Count() / 2 ) )
        {
            for( USHORT n = 0, i = 0; n < aColumns.Count(); n += 2, ++i )
            {
                SwColumn* pCol = aCol.GetColumns()[ i ];
                ULONG nTmp = aColumns[ n ];
                nTmp *= USHRT_MAX;
                nTmp /= nWidth;
                pCol->SetWishWidth( USHORT(nTmp) );
/*
    JP 07.07.95: der Dialog kennt nur eine Breite fuer alle Spalten
                 darum hier nicht weiter beachten
                nTmp = aColumns[ n+1 ];
                if( nTmp )
                    pCol->SetRight( USHORT(nTmp) );
                else
                    pCol->SetRight( 0 );
                pCol->SetLeft( 0 );
*/
            }
        }
        pSet->Put( aCol );
    }

    if( pSet != &aSet )         // wurde der Set uebergeben, dann wars das
        return ;

    // ein neues FlyFormat anlegen oder das alte benutzen ?
    // (teste ob es die selben Attribute besitzt!)
    SwFlySave* pFlySave;
    USHORT nFlyArrCnt = aFlyArr.Count();
    if( !nFlyArrCnt ||
        !( pFlySave = aFlyArr[ nFlyArrCnt-1 ])->IsEqualFly( *pPam, aSet ))
    {
        pFlySave = new SwFlySave( *pPam, aSet );
        Size aPgSize;
        GetPageSize( aPgSize );
        pFlySave->nPageWidth = aPgSize.Width();

        if( nDropCapAnchor )
        {
            pFlySave->nDropAnchor = nDropCapAnchor;
            pFlySave->nDropLines = nDropCapLines;
        }
        aFlyArr.Insert(  pFlySave, nFlyArrCnt++ );
    }

    SetPardTokenRead( FALSE );
    const SwTableNode* pTblNd = pPam->GetNode()->FindTableNode();

    while( !IsPardTokenRead() && IsParserWorking() )
    {
        if( RTF_PARD == nToken || nOpenBrakets > GetOpenBrakets() )
            break;

        NextToken( nToken );

        if( !IsPardTokenRead() )
        {
            nToken = GetNextToken();

            // BUG 22036: kommt zwischen Fly-Attributen ein unbekanntes,
            //              dann erzeuge nie 2 FlyFrames, sondern fasse
            //              beide zusammen !!!
            while( RTF_APOCTL == ( nToken & ~(0xff | RTF_SWGDEFS) ))
            {
                if( RTF_FLY_INPARA == nToken )
                    break;

                if( RTF_IGNOREFLAG == SkipToken( -1 ) )
                {
                    if( '{' == SkipToken( -1 ) )
                        nToken = '{';
                    else
                        SkipToken( 2 );
                }
                else
                    SkipToken( 1 );

                ReadFly( nToken, &pFlySave->aFlySet );
                nToken = GetNextToken();
            }
        }
    }

    if( pTblNd && !pPam->GetPoint()->nContent.GetIndex() &&
        pTblNd->EndOfSectionIndex() + 1 ==
            pPam->GetPoint()->nNode.GetIndex() )
    {
        // nicht mehr in der Tabelle, sondern dahinter ?
        // Dann aber wieder zurueck in die Tabelle
        pPam->Move( fnMoveBackward );
    }
    else
        pTblNd = 0;

    // wurde garnichts eingefuegt?
    if( !pTblNd &&
        pPam->GetPoint()->nNode == pFlySave->nSttNd &&
        !pPam->GetPoint()->nContent.GetIndex() )
    {
//      // dann erzeuge mindestens einen leeren TextNode
//      pDoc->AppendTxtNode(*pPam);
        // dann zerstoere den FlySave wieder.
        aFlyArr.DeleteAndDestroy( --nFlyArrCnt );

    }
    else
    {
        FASTBOOL bMovePaM = 0 != pTblNd;

        pFlySave->nEndNd = pPam->GetPoint()->nNode;
        pFlySave->nEndCnt = pPam->GetPoint()->nContent.GetIndex();

        if( bMovePaM )
            pPam->Move( fnMoveForward );

        pTblNd = pFlySave->nSttNd.GetNode().FindTableNode();
        if( pTblNd && !pFlySave->nEndCnt &&
            pTblNd == pFlySave->nEndNd.GetNode().FindTableNode() )
        {
            // dann teste mal, ob das \pard nicht zu spaet kam und
            // eigentlich in die vorherige Zelle gehoert
            const SwStartNode* pSttBoxNd = pFlySave->nSttNd.GetNode().
                                            FindTableBoxStartNode(),
                            * pEndBoxNd = pFlySave->nEndNd.GetNode().
                                            FindTableBoxStartNode();
            if( pSttBoxNd && pEndBoxNd &&
                bMovePaM ? ( pSttBoxNd == pEndBoxNd )
                         : ( pSttBoxNd->EndOfSectionIndex() + 1 ==
                                pEndBoxNd->GetIndex() &&
                                pEndBoxNd->GetIndex() + 1 ==
                                pFlySave->nEndNd.GetIndex() ))
            {
                // dann gehoert das Ende in die vorherige Box!
                SwPosition aPos( *pPam->GetPoint() );
                pPam->GetPoint()->nNode = *pSttBoxNd->EndOfSectionNode();
                pPam->Move( fnMoveBackward, fnGoNode );

                DelLastNode();

                pPam->GetPoint()->nNode = *pSttBoxNd->EndOfSectionNode();
                pPam->Move( fnMoveBackward, fnGoNode );

                pFlySave->nEndNd = pPam->GetPoint()->nNode;
                pFlySave->nEndCnt = pPam->GetPoint()->nContent.GetIndex();

                *pPam->GetPoint() = aPos;
            }
        }
        else if( !bReadSwFly && !pFlySave->nEndCnt &&
            pFlySave->nSttNd.GetIndex() + 1 == pFlySave->nEndNd.GetIndex() &&
            pFlySave->nSttNd.GetNode().IsTxtNode() )
        {

            SwTxtNode* pTxtNd = pFlySave->nSttNd.GetNode().GetTxtNode();
            SwTxtFlyCnt* pFlyCnt;
            if( 1 == pTxtNd->GetTxt().Len() &&
                0 != ( pFlyCnt = (SwTxtFlyCnt*)pTxtNd->GetTxtAttr(
                                                0, RES_TXTATR_FLYCNT )) &&
                pFlyCnt->GetFlyCnt().GetFrmFmt() )
            {
                // then move the content into the surrounded fly
                SwFrmFmt* pFlyFmt = pFlyCnt->GetFlyCnt().GetFrmFmt();
                const SwNodeIndex* pFlySNd = pFlyFmt->GetCntnt().GetCntntIdx();
                SwNodeRange aRg( *pFlySNd, 1,
                                 *pFlySNd->GetNode().EndOfSectionNode(), 0 );

                // merge the itemsets
                SwFmtFrmSize aSz1( (SwFmtFrmSize&)pFlyFmt->GetAttrSet().
                                                Get( RES_FRM_SIZE ));
                SwFmtFrmSize aSz2( (SwFmtFrmSize&)pFlySave->aFlySet.
                                                Get( RES_FRM_SIZE ));
                // if
                if( !aRg.aStart.GetNode().IsNoTxtNode() ||
                    !aSz1.GetHeight() || !aSz1.GetWidth() ||
                    !aSz2.GetHeight() || !aSz2.GetWidth() ||
                    ( aSz1.GetHeight() == aSz2.GetHeight() &&
                      aSz1.GetWidth() == aSz2.GetWidth() ) )
                {
                    SfxItemSet aDiffs( pFlyFmt->GetAttrSet() );
                    aDiffs.ClearItem( RES_ANCHOR );
                    aDiffs.ClearItem( RES_FRM_SIZE );
                    aDiffs.ClearItem( RES_CNTNT );
                    aDiffs.Differentiate( pFlySave->aFlySet );
                    pFlySave->aFlySet.Put( aDiffs );

                    BOOL bSet = FALSE;
                    if( aSz1.GetHeight() && !aSz2.GetHeight() )
                    {
                        bSet = TRUE;
                        aSz2.SetHeight( aSz1.GetHeight() );
                    }
                    if( aSz1.GetWidth() && !aSz2.GetWidth() )
                    {
                        bSet = TRUE;
                        aSz2.SetWidth( aSz1.GetWidth() );
                    }
                    if( bSet )
                        pFlySave->aFlySet.Put( aSz2 );

                    // move any PageBreak/Desc Attr to the next Para
                    {
                        SwCntntNode* pSrcNd = pFlySave->nSttNd.GetNode().GetCntntNode();
                        SwCntntNode* pDstNd = pFlySave->nEndNd.GetNode().GetCntntNode();

                        ::lcl_CpyBreakAttrs( pSrcNd, pDstNd, &pFlySave->nEndNd );
                    }

                    // create new txtnode, because the section does never be empty
                    pDoc->GetNodes().MakeTxtNode( aRg.aStart,
                                (SwTxtFmtColl*)pDoc->GetDfltTxtFmtColl() );

                    SwNodeIndex aTmp( pFlySave->nSttNd, +1 );
                    pDoc->Move( aRg, aTmp );

                    // now delete the redundant txtnode
                    pDoc->GetNodes().Delete( pFlySave->nSttNd, 1 );
                }
            }
        }
    }

    bReadSwFly = FALSE;
    SkipToken( -1 );
}


void SwRTFParser::InsPicture( const String& rGrfNm, const Graphic* pGrf,
                                const SvxRTFPictureType* pPicType )
{
    // kennzeichen fuer Swg-Dokumente:
    // (dann ist das FlyFmt fuer die Grafik!)
    SwGrfNode * pGrfNd;
    if( bReadSwFly )
    {
        // erzeuge nur einen normalen GrafikNode und ersetze diesen gegen
        // den vorhandenen Textnode
        SwNodeIndex& rIdx = pPam->GetPoint()->nNode;
        pGrfNd = pDoc->GetNodes().MakeGrfNode( rIdx,
                    rGrfNm, aEmptyStr,    // Name der Graphic !!
                    pGrf,
                    (SwGrfFmtColl*)pDoc->GetDfltGrfFmtColl() );

        if( pGrfAttrSet )
            pGrfNd->SetAttr( *pGrfAttrSet );

        SwFlySave* pFlySave = aFlyArr[ aFlyArr.Count()-1 ];
        pFlySave->nSttNd = rIdx.GetIndex() - 1;

        if( 1 < aFlyArr.Count() )
        {
            pFlySave = aFlyArr[ aFlyArr.Count() - 2 ];
            if( pFlySave->nEndNd == rIdx )
                pFlySave->nEndNd = rIdx.GetIndex() - 1;
        }
    }
    else
    {
        // wenn normale RTF-Grafik, dann steht diese im Textfluss !
        SwAttrSet aFlySet( pDoc->GetAttrPool(), RES_VERT_ORIENT, RES_ANCHOR );
        const SwPosition* pPos = pPam->GetPoint();

        SwFmtAnchor aAnchor( FLY_IN_CNTNT );
        aAnchor.SetAnchor( pPos );
        aFlySet.Put( aAnchor );
        aFlySet.Put( SwFmtVertOrient( 0, VERT_TOP ));

        SwFrmFmt* pFlyFmt = pDoc->Insert( *pPam,
                    rGrfNm, aEmptyStr,      // Name der Graphic !!
                    pGrf,
                    &aFlySet,               // Attribute fuer den FlyFrm
                    pGrfAttrSet );          // Attribute fuer die Grafik

        pGrfNd = pDoc->GetNodes()[ pFlyFmt->GetCntnt().GetCntntIdx()->
                                            GetIndex()+1 ]->GetGrfNode();

        _SetPictureSize( *pGrfNd, pPos->nNode,
                        (SfxItemSet&)pFlyFmt->GetAttrSet(),
                        pPicType );
    }

    if( pGrfAttrSet )
        DELETEZ( pGrfAttrSet );
}

void SwRTFParser::_SetPictureSize( const SwNoTxtNode& rNd,
                                    const SwNodeIndex& rAnchor,
                                    SfxItemSet& rSet,
                                    const SvxRTFPictureType* pPicType )
{
    Size aSize( ((SwNoTxtNode&)rNd).GetTwipSize() );
    if( pPicType )
    {
        if( rNd.IsGrfNode() )
        {
            if( SvxRTFPictureType::WIN_METAFILE != pPicType->eStyle &&
                pPicType->nGoalWidth && pPicType->nGoalHeight )
            {
                aSize.Width() = pPicType->nGoalWidth;
                aSize.Height() =pPicType->nGoalHeight;
            }
            else if( SvxRTFPictureType::MAC_QUICKDRAW == pPicType->eStyle )
            {
                // IMMER auf 72 DPI bezogen, also 1pt == 20 Twip !!
                aSize.Width() = pPicType->nWidth * 20;
                aSize.Height() = pPicType->nHeight * 20;
            }
            else
            {
                // von 100TH_MM nach TWIP umrechenen!
                aSize.Width() = pPicType->nWidth * 144 / 254;
                aSize.Height() = pPicType->nHeight * 144 / 254;
            }
            ((SwGrfNode&)rNd).SetTwipSize( aSize );
        }

        if( 100 != pPicType->nScalX )
            aSize.Width() = (((long)pPicType->nScalX) * ( aSize.Width() -
                        ( pPicType->nCropL + pPicType->nCropR ))) / 100L;

        if( 100 != pPicType->nScalY )
            aSize.Height() = (((long)pPicType->nScalY) * ( aSize.Height() -
                        ( pPicType->nCropT + pPicType->nCropB ))) / 100L;
    }

    // sorge dafuer, das der Rahmen nicht groesser als der akt.
    // Pagedescriptor wird.
    Size aPgSize;
    GetPageSize( aPgSize );

    if( aSize.Height() > aPgSize.Height() )
        aSize.Height() = aPgSize.Height();

    if( aSize.Width() > aPgSize.Width() )
        aSize.Width() = aPgSize.Width();

    //steht der Fly etwa in einer Tabelle ?
    const SwNode* pAnchorNd = pDoc->GetNodes()[ rAnchor ];
    const SwTableNode* pTblNd = pAnchorNd->FindTableNode();
    if( pTblNd )
    {
        // Box feststellen:
        const SwTableBox* pBox = pTblNd->GetTable().GetTblBox(
                                pAnchorNd->StartOfSectionIndex() );
        if( pBox )
        {
            long nBoxWidth = pBox->GetFrmFmt()->GetFrmSize().GetWidth();
            if( aSize.Width() > nBoxWidth )
                aSize.Width() = nBoxWidth;
        }
    }

        // min. Werte einhalten !!
    if( aSize.Width() < /*2268*/MINFLY )
        aSize.Width() = /*2268*/MINFLY;
    if( aSize.Height() < MINFLY)
        aSize.Height() = MINFLY;

    if( pPicType )
    {
        BOOL bChg = FALSE;
        SwCropGrf aCrop;

/*
 JP 28.07.99: Bug 67800 - no crop by MAC_QUICKDRAW. At time i dont know why
                            it has been coded. But this has used for any
                            RTF-File, but i dont found them.
        if( SvxRTFPictureType::MAC_QUICKDRAW == pPicType->eStyle )
        {
            // evt. ein wenig Croppen ??
            // IMMER auf 72 DPI bezogen, also 1pt == 20 Twip !!
            long nTmp = pPicType->nWidth * 20;
            if( nTmp != aSize.Width() )
            {
                // in der Breite (also rechts) croppen
                aCrop.Right() = nTmp - aSize.Width();
                aSize.Width() = nTmp;
                bChg = TRUE;
            }

            nTmp = pPicType->nHeight * 20;
            if( nTmp != aSize.Height() )
            {
                // in der Hoehe (also unten) croppen
                aCrop.Bottom() = nTmp - aSize.Height();
                aSize.Height() = nTmp;
                bChg = TRUE;
            }
        }
*/
        if( pPicType->nCropT )
            aCrop.SetTop( pPicType->nCropT ), bChg = TRUE;
        if( pPicType->nCropB )
            aCrop.SetBottom( pPicType->nCropB ), bChg = TRUE;
        if( pPicType->nCropL )
            aCrop.SetLeft( pPicType->nCropL ), bChg = TRUE;
        if( pPicType->nCropR )
            aCrop.SetRight( pPicType->nCropR ), bChg = TRUE;

        if( bChg )
        {
            // dann mal an die CropWerte an die GrafikSize anpassen.
            ((SwNoTxtNode&)rNd).SetAttr( aCrop );
        }
    }
    rSet.Put( SwFmtFrmSize( ATT_FIX_SIZE, aSize.Width(), aSize.Height() ));
}

void SwRTFParser::GetPageSize( Size& rSize )
{
    const SwFrmFmt& rPgFmt = pDoc->GetPageDesc(nAktPageDesc).GetMaster();

    const SwFmtFrmSize& rSz   = rPgFmt.GetFrmSize();
    const SvxLRSpaceItem& rLR = rPgFmt.GetLRSpace();
    const SvxULSpaceItem& rUL = rPgFmt.GetULSpace();
    const SwFmtCol& rCol = rPgFmt.GetCol();

    rSize.Width() = rSz.GetWidth() - rLR.GetLeft() - rLR.GetRight();
    rSize.Height() = rSz.GetHeight() - rUL.GetUpper() - rUL.GetLower();

    if( 1 < rCol.GetNumCols() )
    {
        rSize.Width() /= rCol.GetNumCols();
        rSize.Height() /= rCol.GetNumCols();
    }
}

void __EXPORT SwRTFParser::ReadBitmapData()
{
    Graphic aGrf;
    SvxRTFPictureType aPicType;
    if( ReadBmpData( aGrf, aPicType ) )
        InsPicture( aEmptyStr, &aGrf, &aPicType );
}

#ifdef READ_OLE_OBJECT
void __EXPORT SwRTFParser::ReadOLEData()
{
    SvCacheStream aTmpFile( 0xA000 );
    Graphic aGrf;
    SvxRTFPictureType aPicType, aOleType;

    int nToken, bValidOle = TRUE, bWeiter = TRUE;
    int nOpenBrakets = 1;       // die erste wurde schon vorher erkannt !!

    String* pStr = 0;
    String sObjClass, sObjName, sObjData;

    while( nOpenBrakets && IsParserWorking() && bWeiter && bValidOle )
    {
        nToken = GetNextToken();
        USHORT nVal = USHORT( nTokenValue );
        switch( nToken )
        {
        case '}':       --nOpenBrakets; pStr = 0; break;
        case '{':
            {
                if( RTF_IGNOREFLAG != GetNextToken() )
                    nToken = SkipToken( -1 );
                else if( RTF_UNKNOWNCONTROL != GetNextToken() )
                    nToken = SkipToken( -2 );
                else
                {
                    // gleich herausfiltern
                    ReadUnknownData();
                    nToken = GetNextToken();
                    if( '}' != nToken )
                        eState = SVPAR_ERROR;
                    break;
                }
                ++nOpenBrakets;
            }
            break;

        case RTF_OBJECT:
        case RTF_OBJEMB:        // default ist embedded
        case RTF_LINKSELF:      // ??
        case RTF_OBJLOCK:       // ??
        case RTF_OBJUPDATE:     // ??
        case RTF_OBJTIME:       // ??
        case RTF_OBJSETSIZE:
        case RTF_OBJALIGN:
        case RTF_OBJTRANSY:
        case RTF_OBJATTPH:
            break;

        case RTF_OBJLINK:       // ?? welche Daten sind das ??
        case RTF_OBJAUTLINK:    // ??       -""-            ??
        case RTF_OBJSUB:
        case RTF_OBJPUB:
        case RTF_OBJICEMB:
        case RTF_OBJOCX:
        case RTF_OBJHTML:
        case RTF_OBJALIAS:
        case RTF_OBJSECT:
            bValidOle = FALSE;      // diese Typen koennen wir nicht
            break;

        case RTF_OBJCLASS:
            // Daten lesen
            pStr = &sObjClass;
            break;

        case RTF_OBJNAME:
            // Daten lesen
            pStr = &sObjName;
            break;

        case RTF_OBJDATA:
            pStr = &sObjData;
            break;

        case RTF_RESULT:
            {
                // hier weitermachen, wenn das OLE-Object ungueltig ist
                bWeiter = FALSE;
            }
            break;
        case RTF_RSLTBMP:           // diese sollten wir ignorieren
        case RTF_RSLTMERGE:
        case RTF_RSLTPICT:
        case RTF_RSLTRTF:
        case RTF_RSLTTXT:
            break;

        case RTF_OBJW:          aOleType.nWidth = nVal; break;
        case RTF_OBJH:          aOleType.nHeight = nVal; break;
        case RTF_OBJCROPT:      aOleType.nCropT = (short)nTokenValue; break;
        case RTF_OBJCROPB:      aOleType.nCropB = (short)nTokenValue; break;
        case RTF_OBJCROPL:      aOleType.nCropL = (short)nTokenValue; break;
        case RTF_OBJCROPR:      aOleType.nCropR = (short)nTokenValue; break;
        case RTF_OBJSCALEX:     aOleType.nScalX = nVal; break;
        case RTF_OBJSCALEY:     aOleType.nScalY = nVal; break;

        case RTF_TEXTTOKEN:
            if( 1 < nOpenBrakets && pStr )
            {
                if( pStr == &sObjData )
                {
                    xub_StrLen nHexLen = HexToBin( aToken );
                    if( STRING_NOTFOUND != nHexLen )
                        bValidOle = FALSE;
                    else
                    {
                        aTmpFile.Write( (sal_Char*)aToken.GetBuffer(), nHexLen );
                        bValidOle = 0 == aTmpFile.GetError();
                    }
                }
                else
                    *pStr += aToken;
            }
            break;
        }
    }

    if( bValidOle )
    {
        bValidOle = FALSE;      // erstmal
    }

    if( !bWeiter )      // dann stehen wir noch im Result
    {
        // ist das Ole-Object Ok?
        // -> dann solange SkipGroup rufen, bis zur letzten
        //      schliessenden Klammer
        // ansonsten alle Token verarbeiten, bis zur letzten
        //      schliessenden Klammer

        bWeiter = TRUE;
        while( nOpenBrakets && IsParserWorking() && bWeiter )
        {
            switch( nToken = GetNextToken() )
            {
            case '}':       --nOpenBrakets; break;
            case '{':       ++nOpenBrakets;  break;
            }
            if( nOpenBrakets && !bValidOle )
                NextToken( nToken );
        }
    }

    if( !bValidOle && '}' != nToken )
        SkipGroup();

    SkipToken( -1 );        // die schliesende Klammer wird "oben" ausgewertet
}
#endif

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/rtf/rtffly.cxx,v 1.1.1.1 2000-09-18 17:14:56 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.86  2000/09/18 16:04:50  willem.vandorp
      OpenOffice header added.

      Revision 1.85  2000/08/25 12:27:59  jp
      Graphic Crop-Attribut exported to SVX

      Revision 1.84  2000/05/09 17:22:49  jp
      Changes for Unicode

      Revision 1.83  2000/04/14 14:06:17  khz
      Task #70451# use CalculateFlySize() for WW frames with 'auto'width

      Revision 1.82  1999/12/13 13:17:43  jp
      Bug #70652#: read tokens posnegx/y

      Revision 1.81  1999/08/19 10:33:32  JP
      Bug #68304#: by windows metafile ignore the picgoal size, dont delete sourrounded flys if the size unequal


      Rev 1.80   19 Aug 1999 12:33:32   JP
   Bug #68304#: by windows metafile ignore the picgoal size, dont delete sourrounded flys if the size unequal

      Rev 1.79   09 Aug 1999 17:37:48   JP
   read owne border of flyframes

      Rev 1.78   05 Aug 1999 23:04:16   JP
   Bug #67974#: SetFlysInDoc - anchor to next or cur paragraph

      Rev 1.77   03 Aug 1999 19:46:44   JP
   Bug #68007#,#67978#: changes for import of flys from interleave/WP7/Aplixware

      Rev 1.76   28 Jul 1999 14:21:32   JP
   Bug #67800#: set no crop by MAC-Pictures, if the size not equal

      Rev 1.75   21 Jul 1999 18:27:02   JP
   Bug #67630#,#67663#: changes for read of flys

      Rev 1.74   08 Jul 1999 21:24:24   JP
   has an APO no framesize, then get from the txtnode the min/max size

      Rev 1.73   17 Jun 1999 14:46:20   JP
   Bug #66301#: SetFlyInDoc - create new Node if the 'anchor' Node has pagebreak attrs

      Rev 1.72   19 Apr 1999 12:48:44   JP
   Vorbereitungen fuer OLE-Objecte in RTF lesen (anstoss ist Bug #60140#)

      Rev 1.71   24 Mar 1999 14:48:58   JP
   Bug #63882#: Flys in/mit Tabellen korrekt lesen

      Rev 1.70   19 Nov 1998 22:05:58   JP
   Bug #59697#: Token ABSLOCK ignorieren, inner/out richtig behandeln

      Rev 1.69   21 Sep 1998 17:16:14   JP
   DropCaps unterstuetzen

      Rev 1.68   27 Jul 1998 14:57:06   JP
   Bug #54001#: Wert vom AbsH an der Size setzen

      Rev 1.67   06 Jul 1998 13:36:00   MH
   int. comp. error

      Rev 1.66   13 May 1998 18:16:20   JP
   CheckSize: nicht mit undefiniertem Pointer arbeiten

      Rev 1.65   12 May 1998 15:51:20   JP
   rund um Flys/DrawObjs im Doc/FESh umgestellt/optimiert

      Rev 1.64   07 May 1998 15:40:08   JP
   MacPict Grafiken haben Point und keine MM100 angaben

      Rev 1.63   08 Apr 1998 14:28:34   RG
   C40_INSERT ging unter unxsols nicht

      Rev 1.62   20 Feb 1998 13:36:32   MA
   headerfiles gewandert

      Rev 1.61   17 Feb 1998 12:24:54   RG
   Mac: sysdep.hxx raus

      Rev 1.60   11 Feb 1998 14:07:16   JP
   kleinere Bugs behoben bei Rahmen & Tabellen

      Rev 1.59   29 Jan 1998 21:35:24   JP
   GetEndOfIcons ersetzt durch GetEndOfExtras, das auf GetEndOfRedlines mappt

      Rev 1.58   25 Nov 1997 15:11:30   JP
   Headerfiles

      Rev 1.57   20 Nov 1997 12:16:50   AMA
   Opt. SwSurround: GoldCut jetzt als Enum; nicht implementierte Enums entfernt

      Rev 1.56   03 Nov 1997 14:10:36   MA
   precomp entfernt

      Rev 1.55   30 Oct 1997 17:49:32   AMA
   Chg: Kein AutoFlag mehr an Break bzw. PageDesc-Attributen

      Rev 1.54   09 Oct 1997 14:27:50   JP
   Umstellung NodeIndex/-Array/BigPtrArray

      Rev 1.53   15 Aug 1997 12:51:44   OS
   charatr/frmatr/txtatr aufgeteilt

      Rev 1.52   13 Aug 1997 19:18:30   JP
   Bug #41892#: ReadFly - nur bei RTF-Absatzbindung ggfs. auf die Seienbind. umschalten

      Rev 1.51   13 Aug 1997 18:35:02   JP
   Bug #42480#: spaltige Rahmen kennt RTF nicht, nur wir

      Rev 1.50   11 Aug 1997 17:49:34   OS
   Header-Umstellung

      Rev 1.49   07 Aug 1997 15:06:24   OM
   Headerfile-Umstellung

      Rev 1.48   22 May 1997 20:39:54   JP
   Bug #40118#: kein Inhalt im Fly -> verwerfen

      Rev 1.47   07 Jan 1997 16:53:22   JP
   Bug #34627#: GrafikGroesse setzen

      Rev 1.46   06 Jan 1997 19:04:10   JP
   IsEqual: Flys zusammenfassen, wenns die akt. Position vom vorhergeheden ist

      Rev 1.45   06 Jan 1997 15:15:48   JP
   Bug #34622#: TeilNodes bei Flys absplitten, FlyInFlys korrekt lesen

      Rev 1.44   29 Oct 1996 12:58:50   JP
   am Doc ist das NodesArray nur noch ueber Get..() zugaenglich

      Rev 1.43   09 Oct 1996 13:05:18   JP
   SwNodes::GoNext/-Prev (-Sect) returnt statt BOOL den gefundenen ContentNode

      Rev 1.42   08 Oct 1996 13:53:42   JP
   IsEqualFly: Header/Footer Absaetze nicht zusammenfassen;absatzgebundene Flys

      Rev 1.41   27 Sep 1996 17:59:46   MIB
   In Filtern in Rahmenvorlagen Umrandungs/Abstaende loeschen

      Rev 1.40   29 Aug 1996 10:10:46   JP
   beim StartNode muss jetzt ein spz. Sectiontype gesetzt werden

      Rev 1.39   20 Aug 1996 14:53:34   TRI
   C40_INSERT statt Insert

      Rev 1.38   04 Jul 1996 15:01:20   JP
   ReadFly: auch bei eigenen APOCTL ReadFly rufen

      Rev 1.37   28 Jun 1996 15:07:30   MA
   includes

      Rev 1.36   18 Jun 1996 16:36:04   JP
   ReadFly: erweitert um optionalen Itemset erweitert(FlyInFly lesen); MACPict: ggfs. Croppen

      Rev 1.35   13 Jun 1996 09:21:26   JP
   Flys lesen: bei Fly in Fly eine while schleife

      Rev 1.34   10 Jun 1996 11:24:24   JP
   Crop-Werte im CropAttribut setzen

      Rev 1.33   25 Apr 1996 13:56:42   MIB
   Verschiebung SvHTMLParser in Gooedies

      Rev 1.32   25 Apr 1996 09:23:44   JP
   lesen der Grafik-Daten in svxparser verschoben

*************************************************************************/

diff --git a/sw/source/filter/rtf/rtfnum.cxx b/sw/source/filter/rtf/rtfnum.cxx
new file mode 100644
index 0000000..5b5b42f
--- /dev/null
+++ b/sw/source/filter/rtf/rtfnum.cxx
@@ -0,0 +1,1468 @@
/*************************************************************************
 *
 *  $RCSfile: rtfnum.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:56 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _STREAM_HXX //autogen
#include <tools/stream.hxx>
#endif
#ifndef _RTFTOKEN_H
#include <svtools/rtftoken.h>
#endif
#ifndef _RTFKEYWD_HXX //autogen
#include <svtools/rtfkeywd.hxx>
#endif
#ifndef _SFXINTITEM_HXX //autogen
#include <svtools/intitem.hxx>
#endif
#ifndef _RTFOUT_HXX
#include <svtools/rtfout.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_FONTITEM_HXX //autogen
#include <svx/fontitem.hxx>
#endif
#ifndef _SVX_FHGTITEM_HXX //autogen
#include <svx/fhgtitem.hxx>
#endif
#ifndef _SVX_WGHTITEM_HXX //autogen
#include <svx/wghtitem.hxx>
#endif
#ifndef _SVX_POSTITEM_HXX //autogen
#include <svx/postitem.hxx>
#endif
#ifndef _SVX_CMAPITEM_HXX //autogen
#include <svx/cmapitem.hxx>
#endif
#ifndef _SVX_CRSDITEM_HXX //autogen
#include <svx/crsditem.hxx>
#endif
#ifndef _SVX_COLRITEM_HXX //autogen
#include <svx/colritem.hxx>
#endif
#ifndef _SVX_UDLNITEM_HXX //autogen
#include <svx/udlnitem.hxx>
#endif
#ifndef _SVX_WRLMITEM_HXX //autogen
#include <svx/wrlmitem.hxx>
#endif

#ifndef _SHELLIO_HXX
#include <shellio.hxx>
#endif
#ifndef _FLTINI_HXX
#include <fltini.hxx>
#endif
#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _SWPARRTF_HXX
#include <swparrtf.hxx>
#endif
#ifndef _WRTRTF_HXX
#include <wrtrtf.hxx>
#endif
#ifndef _NDTXT_HXX
#include <ndtxt.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _DOCARY_HXX
#include <docary.hxx>
#endif
#ifndef _PAM_HXX
#include <pam.hxx>
#endif
#ifndef _CHARFMT_HXX
#include <charfmt.hxx>
#endif
#ifndef _POOLFMT_HXX
#include <poolfmt.hxx>
#endif
#ifndef _NUMRULE_HXX
#include <numrule.hxx>
#endif
#ifndef _CHARATR_HXX
#include <charatr.hxx>
#endif
#ifndef _PARATR_HXX
#include <paratr.hxx>
#endif
#ifndef _CMDID_H
#include <cmdid.h>
#endif

#define RTF_NUMRULE_NAME "RTF_Num"

SV_IMPL_VARARR( SwListArr, SwListEntry )


void lcl_ExpandNumFmts( SwNumRule& rRule )
{
    // dann noch das NumFormat in alle Ebenen setzen
    for( BYTE n = 1; n < MAXLEVEL; ++n )
        if( !rRule.GetNumFmt( n ) )
        {
            SwNumFmt aNumFmt( rRule.Get( 0 ));
            aNumFmt.SetAbsLSpace( aNumFmt.GetAbsLSpace() * ( n + 1 ) );
            rRule.Set( n, aNumFmt );
        }
}

SfxItemSet& GetNumChrFmt( SwDoc& rDoc, SwNumRule& rRule, BYTE nNumLvl )
{
    SwCharFmt* pChrFmt = rRule.Get( nNumLvl ).GetCharFmt();
    if( !pChrFmt )
    {
        String sNm( rRule.GetName() );
        ( sNm += ' ' ) += String::CreateFromInt32( nNumLvl + 1 );
        pChrFmt = rDoc.MakeCharFmt( sNm, rDoc.GetDfltCharFmt() );
        if( !rRule.GetNumFmt( nNumLvl ))
            rRule.Set( nNumLvl, rRule.Get( nNumLvl ) );
        ((SwNumFmt*)rRule.GetNumFmt( nNumLvl ))->SetCharFmt( pChrFmt );
    }
    return (SfxItemSet&)pChrFmt->GetAttrSet();
}

void SwRTFParser::ReadListLevel( SwNumRule& rRule, BYTE nNumLvl )
{
    int nToken;
    int nOpenBrakets = 1;       // die erste wurde schon vorher erkannt !!
    int nLvlTxtLevel = 0, nLvlNumberLevel = 0;
    String sLvlText, sLvlNumber;
    SwNumFmt* pCurNumFmt;
    if( MAXLEVEL >= nNumLvl )
    {
        pCurNumFmt = (SwNumFmt*)rRule.GetNumFmt( nNumLvl );
        pCurNumFmt->SetAbsLSpace( 0 );
        pCurNumFmt->SetFirstLineOffset( 0 );
    }
    else
        pCurNumFmt = 0;

    while( nOpenBrakets && IsParserWorking() )
    {
        switch( ( nToken = GetNextToken() ))
        {
        case '}':
            if( nOpenBrakets )
            {
                if( nLvlTxtLevel == nOpenBrakets )
                {
                    if( DelCharAtEnd( sLvlText, ';' ).Len() &&
                        sLvlText.Len() && sLvlText.Len() ==
                        (USHORT)(sLvlText.GetChar( 0 )) + 1 )
                        sLvlText.Erase( 0, 1 );
                    nLvlTxtLevel = 0;
                }
                if( nLvlNumberLevel == nOpenBrakets )
                {
                    DelCharAtEnd( sLvlNumber, ';' );
                    nLvlNumberLevel = 0;
                }
            }
            --nOpenBrakets;
            break;

        case '{':
            {
                if( RTF_IGNOREFLAG != GetNextToken() )
                    nToken = SkipToken( -1 );
                // Unknown und alle bekannten nicht ausgewerteten Gruppen
                // sofort ueberspringen
                else if( RTF_UNKNOWNCONTROL != ( nToken = GetNextToken() ))
//                      RTF_PANOSE != nToken && RTF_FALT != nToken &&
//                      RTF_FALT != nToken && RTF_FNAME != nToken &&
//                      RTF_FONTEMB != nToken && RTF_FONTFILE != nToken )
                    nToken = SkipToken( -2 );
                else
                {
                    // gleich herausfiltern
                    ReadUnknownData();
                    nToken = GetNextToken();
                    if( '}' != nToken )
                        eState = SVPAR_ERROR;
                    break;
                }
                ++nOpenBrakets;
            }
            break;

        case RTF_LEVELNFC:
            {
                SvxExtNumType eType = SVX_NUM_ARABIC;
                switch( nTokenValue )
                {
                case 1:     eType = SVX_NUM_ROMAN_UPPER;            break;
                case 2:     eType = SVX_NUM_ROMAN_LOWER;            break;
                case 3:     eType = SVX_NUM_CHARS_UPPER_LETTER_N;   break;
                case 4:     eType = SVX_NUM_CHARS_LOWER_LETTER_N;   break;
                case 255:
                case 23:    eType = SVX_NUM_CHAR_SPECIAL;           break;
                }
                if( pCurNumFmt )
                    pCurNumFmt->eType = eType;
            }
            break;

        case RTF_LEVELJC:
            {
                SvxAdjust eAdj = SVX_ADJUST_LEFT;
                switch( nTokenValue )
                {
                case 1:     eAdj = SVX_ADJUST_CENTER;   break;
                case 2:     eAdj = SVX_ADJUST_RIGHT;    break;
                }
                if( pCurNumFmt )
                    pCurNumFmt->SetAdjust( eAdj );
            }
            break;

        case RTF_LEVELSTARTAT:
            if( pCurNumFmt && -1 != nTokenValue )
                pCurNumFmt->SetStartValue( USHORT( nTokenValue ));
            break;

        case RTF_LEVELTEXT:
            nLvlTxtLevel = nOpenBrakets;
            break;

        case RTF_LEVELNUMBERS:
            nLvlNumberLevel = nOpenBrakets;
            break;

        case RTF_LI:
            if( pCurNumFmt && -1 != nTokenValue )
            {
                if( 0 > nTokenValue )
                    nTokenValue =- nTokenValue;
                pCurNumFmt->SetAbsLSpace( USHORT( nTokenValue ));
            }
            break;

        case RTF_FI:
            if( pCurNumFmt && -1 != nTokenValue )
            {
                if( 0 < short( nTokenValue ))
                    nTokenValue = - short( nTokenValue );
                pCurNumFmt->SetFirstLineOffset( short( nTokenValue ));
            }
            break;

        case RTF_TEXTTOKEN:
            if( nLvlTxtLevel == nOpenBrakets )
                sLvlText += aToken;
            else if( nLvlNumberLevel == nOpenBrakets )
                sLvlNumber += aToken;
            break;

        case RTF_LEVELOLD:
        case RTF_LEVELPREV:
        case RTF_LEVELPREVSPACE:
        case RTF_LEVELINDENT:
        case RTF_LEVELSPACE:
        case RTF_LEVELFOLLOW:
        case RTF_LEVELLEGAL:
        case RTF_LEVELNORESTART:
            break;

        default:
            if( pCurNumFmt &&
                RTF_CHRFMT == (nToken & ~(0xff | RTF_SWGDEFS) ))
            {
                ReadAttr( nToken, &GetNumChrFmt( *pDoc, rRule, nNumLvl ) );

                // dann aus der Vorlage den Font holen
                if( SVX_NUM_CHAR_SPECIAL == pCurNumFmt->eType )
                    pCurNumFmt->SetBulletFont( FindFontOfItem(
                                pCurNumFmt->GetCharFmt()->GetFont() ) );
            }
            break;
        }
    }

    if( IsParserWorking() && pCurNumFmt )
    {
        // dann erzeuge mal die Pre/Postfix-Strings
        if( sLvlText.Len() &&
            SVX_NUM_CHAR_SPECIAL == pCurNumFmt->eType )
        {
            pCurNumFmt->SetBulletChar( sLvlText.GetChar( 0 ) );
            // dann aus der Vorlage den Font holen
            if( pCurNumFmt->GetCharFmt() )
                pCurNumFmt->SetBulletFont( FindFontOfItem(
                        pCurNumFmt->GetCharFmt()->GetFont() ) );
        }
        else if( sLvlNumber.Len() && sLvlText.Len() )
        {
            // in sLvlText steht der Text, in sLvlNumber die Position
            // der Ebenen in sLvlText
            pCurNumFmt->SetPrefix(
                sLvlText.Copy( 0, USHORT( sLvlNumber.GetChar( 0 ))-1 ));
            pCurNumFmt->SetPostfix( sLvlText.Copy(
                    USHORT( sLvlNumber.GetChar( sLvlNumber.Len()-1 )) ));
            // wieviele Levels stehen im String?
            pCurNumFmt->SetUpperLevel( (BYTE)sLvlNumber.Len() );
        }
        else if( !sLvlText.Len() )
        {
            pCurNumFmt->eType = SVX_NUM_NUMBER_NONE;
            pCurNumFmt->SetPostfix( aEmptyStr );
        }
    }

    SkipToken( -1 );
}

void SwRTFParser::ReadListTable()
{
    int nToken;
    int nOpenBrakets = 1;       // die erste wurde schon vorher erkannt !!
    bNewNumList = TRUE;

    USHORT nRuleCount = 0;
    BYTE nNumLvl = 0;
    SwNumRule* pCurRule = 0;
    SwListEntry aEntry;

    while( nOpenBrakets && IsParserWorking() )
    {
        switch( ( nToken = GetNextToken() ))
        {
        case '}':       if( --nOpenBrakets && IsParserWorking() )
                        {
                            // Style konnte vollstaendig gelesen werden,
                            // also ist das noch ein stabiler Status
                            SaveState( RTF_LISTTABLE );
                            if( 1 == nOpenBrakets )
                            {
                                if( aEntry.nListId )
                                    aListArr.Insert( aEntry, aListArr.Count() );
                                aEntry.Clear();
                            }
                        }
                        break;

        case '{':
            {
                if( RTF_IGNOREFLAG != GetNextToken() )
                    nToken = SkipToken( -1 );
                // Unknown und alle bekannten nicht ausgewerteten Gruppen
                // sofort ueberspringen
                else if( RTF_UNKNOWNCONTROL != ( nToken = GetNextToken() ))
//                      RTF_PANOSE != nToken && RTF_FALT != nToken &&
//                      RTF_FALT != nToken && RTF_FNAME != nToken &&
//                      RTF_FONTEMB != nToken && RTF_FONTFILE != nToken )
                    nToken = SkipToken( -2 );
                else
                {
                    // gleich herausfiltern
                    ReadUnknownData();
                    nToken = GetNextToken();
                    if( '}' != nToken )
                        eState = SVPAR_ERROR;
                    break;
                }
                ++nOpenBrakets;
            }
            break;

        case RTF_LIST:
            {
                if( pCurRule && pCurRule->IsContinusNum() )
                    lcl_ExpandNumFmts( *pCurRule );

                String sTmp( String::CreateFromAscii(
                    RTL_CONSTASCII_STRINGPARAM( RTF_NUMRULE_NAME " 1" )));
                aEntry.nListDocPos = pDoc->MakeNumRule( sTmp );
                pCurRule = pDoc->GetNumRuleTbl()[ aEntry.nListDocPos ];
                pCurRule->SetName( pDoc->GetUniqueNumRuleName( &sTmp, FALSE ) );
                pCurRule->SetAutoRule( FALSE );
                nNumLvl = (BYTE)-1;
            }
            break;

        case RTF_LISTID:            aEntry.nListId = nTokenValue;       break;
        case RTF_LISTTEMPLATEID:    aEntry.nListTemplateId = nTokenValue; break;

        case RTF_LISTRESTARTHDN:
            break;
        case RTF_LISTNAME:
            if( RTF_TEXTTOKEN == GetNextToken() )
            {
                String sTmp( DelCharAtEnd( aToken, ';' ));
                if( sTmp.Len() && !pDoc->FindNumRulePtr( sTmp ))
                    pCurRule->SetName( sTmp );
            }
            SkipGroup();
            break;

        case RTF_LISTSIMPLE:
            pCurRule->SetContinusNum( TRUE );
            break;

        case RTF_LISTLEVEL:
            {
                if( ++nNumLvl < MAXLEVEL )
                    pCurRule->Set( nNumLvl, pCurRule->Get( nNumLvl ));
                ReadListLevel( *pCurRule, nNumLvl );
            }
            break;
        }
    }

    if( pCurRule && pCurRule->IsContinusNum() )
        lcl_ExpandNumFmts( *pCurRule );

    SkipToken( -1 );        // die schliesende Klammer wird "oben" ausgewertet
}

BOOL lcl_IsEqual( SwNumRule* pOrigRule, SwNumRule* pRule )
{
    BOOL bRet = 0;
    if( pOrigRule && pRule )
    {
        bRet =  pOrigRule->GetRuleType() == pRule->GetRuleType() &&
                pOrigRule->IsContinusNum() == pRule->IsContinusNum() &&
                pOrigRule->IsAbsSpaces() == pRule->IsAbsSpaces();
        if( bRet )
            for( BYTE n = 0; bRet && n < MAXLEVEL; ++n )
            {
                const SwNumFmt* pOFmt = pOrigRule->GetNumFmt( n ),
                              * pFmt = pRule->GetNumFmt( n );
                if( pFmt && pOFmt )
                {
                    SwCharFmt* pOCFmt = pOFmt->GetCharFmt(),
                             * pCFmt = pFmt->GetCharFmt();
                    if( pOCFmt && pCFmt )
                    {
                        bRet = pCFmt->GetAttrSet() == pOCFmt->GetAttrSet();
                    }
                    else
                        bRet = !pCFmt && !pOCFmt;
                    if( bRet )
                    {
                        ((SwNumFmt*)pOFmt)->SetCharFmt( 0 );
                        ((SwNumFmt*)pFmt)->SetCharFmt( 0 );
                        bRet = *pOFmt == *pFmt;
                        ((SwNumFmt*)pOFmt)->SetCharFmt( pOCFmt );
                        ((SwNumFmt*)pFmt)->SetCharFmt( pCFmt );
                    }
                }
                else
                    bRet = !pFmt && !pOFmt;
            }
    }
    return bRet;
}

void SwRTFParser::ReadListOverrideTable()
{
    int nToken;
    int nOpenBrakets = 1;       // die erste wurde schon vorher erkannt !!
    SwListEntry aEntry;
    SwNumRule* pRule = 0, *pOrigRule = 0;
    BYTE nNumLvl = 0;
    BOOL bOverrideFormat = FALSE, bOverrideStart = FALSE;

    while( nOpenBrakets && IsParserWorking() )
    {
        switch( ( nToken = GetNextToken() ))
        {
        case '}':
            if( --nOpenBrakets && IsParserWorking() )
            {
                // Style konnte vollstaendig gelesen werden,
                // also ist das noch ein stabiler Status
                SaveState( RTF_LISTOVERRIDETABLE );

                if( 1 == nOpenBrakets )
                {
                    bOverrideFormat = FALSE, bOverrideStart = FALSE;
                    if( pRule )
                    {
                        if( lcl_IsEqual( pOrigRule, pRule ))
                        {
                            // no changes on the rule -> use the original rule
                            aEntry.nListDocPos = pDoc->FindNumRule(
                                                    pOrigRule->GetName() );
                            // delete the temp Rule
                            RemoveUnusedNumRule( pRule );
                        }
                        else if( pRule->IsContinusNum() )
                            lcl_ExpandNumFmts( *pRule );
                    }

                    if( aEntry.nListId && aEntry.nListNo )
                        for( USHORT n = aListArr.Count(); n; )
                            if( aListArr[ --n ].nListId == aEntry.nListId &&
                                !aListArr[ n ].nListNo )
                            {
                                aListArr[ n ].nListNo = aEntry.nListNo;
                                if( pOrigRule )
                                    aListArr[ n ].nListDocPos = aEntry.nListDocPos;
                                break;
                            }
                    aEntry.Clear();
                    pOrigRule = 0;
                    pRule = 0;
                }
            }
            break;

        case '{':
            {
                if( RTF_IGNOREFLAG != GetNextToken() )
                    nToken = SkipToken( -1 );
                // Unknown und alle bekannten nicht ausgewerteten Gruppen
                // sofort ueberspringen
                else if( RTF_UNKNOWNCONTROL != ( nToken = GetNextToken() ))
                    nToken = SkipToken( -2 );
                else
                {
                    // gleich herausfiltern
                    ReadUnknownData();
                    nToken = GetNextToken();
                    if( '}' != nToken )
                        eState = SVPAR_ERROR;
                    break;
                }
                ++nOpenBrakets;
            }
            break;

        case RTF_LISTOVERRIDE:      aEntry.Clear();                 break;
        case RTF_LISTID:            aEntry.nListId = nTokenValue;   break;
        case RTF_LS:                aEntry.nListNo = nTokenValue;   break;
        case RTF_LISTOVERRIDECOUNT:
            if( nTokenValue )
            {
                pRule = 0;
                // dann erzeugen wir mal schnell eine Kopie von der NumRule,
                // denn diese wird jetzt mal kurz veraendert.
                if( aEntry.nListId )
                    for( USHORT n = 0; n < aListArr.Count(); ++n )
                        if( aListArr[ n ].nListId == aEntry.nListId )
                        {
                            pRule = pDoc->GetNumRuleTbl()[
                                                aListArr[ n ].nListDocPos ];
                            pOrigRule = pRule;

                            String sTmp( String::CreateFromAscii(
                                RTL_CONSTASCII_STRINGPARAM( RTF_NUMRULE_NAME " 1" )));
                            aEntry.nListDocPos = pDoc->MakeNumRule( sTmp, pRule );
                            pRule = pDoc->GetNumRuleTbl()[ aEntry.nListDocPos ];
                            pRule->SetName( pDoc->GetUniqueNumRuleName( &sTmp, FALSE ) );
                            pRule->SetAutoRule( FALSE );
                            nNumLvl = (BYTE)-1;
                            aListArr.Insert( aEntry, aListArr.Count() );
                            break;
                        }

            }
            break;

        case RTF_LISTLEVEL:
            if( pRule && bOverrideFormat )
            {
                if( ++nNumLvl < MAXLEVEL )
                    pRule->Set( nNumLvl, pRule->Get( nNumLvl ));
                ReadListLevel( *pRule, nNumLvl );
            }
            break;

        case RTF_LEVELSTARTAT:
            if( pRule && bOverrideStart )
            {
            }
            break;

        case RTF_LISTOVERRIDESTART:
            bOverrideStart = TRUE;
            break;

        case RTF_LISTOVERRIDEFORMAT:
            bOverrideFormat = TRUE;
            break;

        case RTF_LFOLEVEL:
            // was fehlt noch?
            break;
        }
    }

    // search the outline numrule and set it into the doc
    if( GetStyleTbl().Count() )
    {
        if( !bStyleTabValid )
            MakeStyleTab();

        const SfxPoolItem* pItem;
        const SwTxtFmtColl* pColl;
        SvxRTFStyleType* pStyle = GetStyleTbl().First();
        do {
            if( MAXLEVEL > pStyle->nOutlineNo &&
                0 != ( pColl = aTxtCollTbl.Get( (USHORT)GetStyleTbl().
                                                        GetCurKey() )) &&
                SFX_ITEM_SET == pColl->GetItemState( RES_PARATR_NUMRULE,
                FALSE, &pItem ))
            {
                USHORT nRulePos = pDoc->FindNumRule(
                                ((SwNumRuleItem*)pItem)->GetValue() );
                if( USHRT_MAX != nRulePos )
                {
                    const SwNumRule *pRule = pDoc->GetNumRuleTbl()[ nRulePos ];
                    pDoc->SetOutlineNumRule( *pRule );
                    pDoc->DelNumRule( pRule->GetName() );
                    // now pRule pointer is invalid !!!

                    // now decrement all position in the listtable, which will
                    // behind the doc-rule position
                    for( USHORT n = aListArr.Count(); n; )
                    {
                        SwListEntry& rEntry = aListArr[ --n ];
                        if( rEntry.nListDocPos == nRulePos )
                            aListArr.Remove( n );
                        else if( rEntry.nListDocPos > nRulePos )
                            --rEntry.nListDocPos;
                    }
                    break;
                }
            }

            pStyle->aAttrSet.ClearItem( FN_PARAM_NUM_LEVEL );

        } while( 0 != (pStyle = GetStyleTbl().Next()) );
    }

    SkipToken( -1 );        // die schliesende Klammer wird "oben" ausgewertet
}

SwNumRule* SwRTFParser::GetNumRuleOfListNo( long nListNo, BOOL bRemoveFromList )
{
    SwNumRule* pRet = 0;
    SwListEntry* pEntry;
    for( USHORT n = aListArr.Count(); n; )
        if( ( pEntry = &aListArr[ --n ])->nListNo == nListNo )
        {
            if( bRemoveFromList )
                aListArr.Remove( n );
            else
            {
                pEntry->bRuleUsed = TRUE;
                pRet = pDoc->GetNumRuleTbl()[ pEntry->nListDocPos ];
            }
            break;
        }
    return pRet;
}

void SwRTFParser::RemoveUnusedNumRule( SwNumRule* pRule )
{
    if( pRule )
    {
        for ( BYTE nLvl = 0; nLvl < MAXLEVEL; ++nLvl )
        {
            SwNumFmt& rNFmt = (SwNumFmt&)pRule->Get( nLvl );
            SwCharFmt* pCFmt = rNFmt.GetCharFmt();
            if( pCFmt )
            {
                pCFmt->Remove( &rNFmt );
                if( !pCFmt->GetDepends() )
                    pDoc->DelCharFmt( pCFmt );
            }
        }
        pDoc->DelNumRule( pRule->GetName() );
    }
#ifndef PRODUCT
    else
    {
        ASSERT( pRule, "NumRulePointer 0 kann nicht geloescht werden" );
    }
#endif
}

void SwRTFParser::RemoveUnusedNumRules()
{
    SwListEntry* pEntry;
    SvPtrarr aDelArr;
    USHORT n;
    for( n = aListArr.Count(); n; )
        if( !( pEntry = &aListArr[ --n ])->bRuleUsed )
        {
            void * p = pDoc->GetNumRuleTbl()[pEntry->nListDocPos];
            // dont delete named char formats
            if( USHRT_MAX == aDelArr.GetPos( p ) &&
                ((SwNumRule*)p)->GetName().EqualsAscii( RTF_NUMRULE_NAME, 0,
                                sizeof( RTF_NUMRULE_NAME )) )
                aDelArr.Insert( p, aDelArr.Count() );
        }

    for( n = aDelArr.Count(); n; )
    {
        SwNumRule* pDel = (SwNumRule*)aDelArr[ --n ];
        RemoveUnusedNumRule( pDel );
    }
}

const Font* SwRTFParser::FindFontOfItem( const SvxFontItem& rItem ) const
{
    SvxRTFFontTbl& rFntTbl = ((SwRTFParser*)this)->GetFontTbl();
    const Font* pFnt = rFntTbl.First();
    while( pFnt )
    {
        if( pFnt->GetFamily() == rItem.GetFamily() &&
            pFnt->GetName() == rItem.GetFamilyName() &&
            pFnt->GetStyleName() == rItem.GetStyleName() &&
            pFnt->GetPitch() == rItem.GetPitch() &&
            pFnt->GetCharSet() == rItem.GetCharSet() )
            return pFnt;

        pFnt = rFntTbl.Next();
    }
    return 0;
}


void SwRTFParser::ReadNumSecLevel( int nToken )
{
    // lese die \pnseclvl - Gruppe
    // nTokenValue gibt schon den richtigen Level vor 1 - 9!
    BYTE nLevel = 0;
    long nListNo = 0;
    BOOL bContinus = TRUE;

    if( RTF_PNSECLVL == nToken )
    {
        // suche die Rule - steht unter Nummer 3
        nListNo = 3;
        bContinus = FALSE;
        nLevel = MAXLEVEL <= nTokenValue ? MAXLEVEL - 1
                                         : BYTE( nTokenValue - 1 );
    }
    else
    {
        switch( nToken = GetNextToken() )
        {
        case RTF_PNLVL:         nListNo = 3;
                                bContinus = FALSE;
                                nLevel = MAXLEVEL <= nTokenValue
                                                    ? MAXLEVEL - 1
                                                    : BYTE( nTokenValue-1 );
                                break;

        case RTF_PNLVLBODY:     nListNo = 2;    break;
        case RTF_PNLVLBLT:      nListNo = 1;    break;
        case RTF_PNLVLCONT:     nListNo = 4;    break;

        default:
            SkipGroup();
            return ;
        }
    }

    // suche die Rule - steht unter Nummer 3
    USHORT nNewFlag = 1 << nListNo;
    SwNumRule* pCurRule = GetNumRuleOfListNo( nListNo,
                                        0 != ( nNewNumSectDef & nNewFlag ) );
    if( !pCurRule )
    {
        // dann muessen wir die mal anlegen
        nNewNumSectDef &= ~nNewFlag;
        String sTmp( String::CreateFromAscii(
                        RTL_CONSTASCII_STRINGPARAM( RTF_NUMRULE_NAME " 1" )));
        SwListEntry aEntry( nListNo, 0, pDoc->MakeNumRule( sTmp ));
        aEntry.nListNo = nListNo;
        aListArr.Insert( aEntry, aListArr.Count() );
        pCurRule = pDoc->GetNumRuleTbl()[ aEntry.nListDocPos ];
        pCurRule->SetName( pDoc->GetUniqueNumRuleName( &sTmp, FALSE ));
        pCurRule->SetAutoRule( FALSE );
        pCurRule->SetContinusNum( bContinus );
    }

    if( !pCurRule->GetNumFmt( nLevel ))
        pCurRule->Set( nLevel, pCurRule->Get( nLevel ));
    SwNumFmt* pCurNumFmt = (SwNumFmt*)pCurRule->GetNumFmt( nLevel );
    if( RTF_PNLVLBLT == nToken )
        pCurNumFmt->eType = SVX_NUM_CHAR_SPECIAL;
    pCurNumFmt->SetPostfix( aEmptyStr );
    pCurNumFmt->SetPrefix( aEmptyStr );
    pCurNumFmt->eType = SVX_NUM_NUMBER_NONE;

    if( bStyleTabValid && RTF_PNSECLVL != nToken )
    {
        // dann den akt. Lvl und Rule am Absatz setzen.
        // Dieses muss aber in den vorherigen "Kontext", sprich in den vor
        // der Klammer offenen Attrset. Darum das SetNewGroup davor und dahinter
        SetNewGroup( FALSE );
        GetAttrSet().Put( SfxUInt16Item( FN_PARAM_NUM_LEVEL, nLevel ));
        GetAttrSet().Put( SwNumRuleItem( pCurRule->GetName() ));
        SetNewGroup( TRUE );
    }

    FontUnderline eUnderline;
    int nOpenBrakets = 1;       // die erste wurde schon vorher erkannt !!
    while( nOpenBrakets && IsParserWorking() )
    {
        switch( ( nToken = GetNextToken() ))
        {
        case '}':
            if( --nOpenBrakets && IsParserWorking() )
            {
                // Style konnte vollstaendig gelesen werden,
                // also ist das noch ein stabiler Status
                SaveState( RTF_PNSECLVL );
            }
            break;

        case '{':
            {
                if( RTF_IGNOREFLAG != GetNextToken() )
                    nToken = SkipToken( -1 );
                // Unknown und alle bekannten nicht ausgewerteten Gruppen
                // sofort ueberspringen
                else if( RTF_UNKNOWNCONTROL != ( nToken = GetNextToken() ))
                    nToken = SkipToken( -2 );
                else
                {
                    // gleich herausfiltern
                    ReadUnknownData();
                    nToken = GetNextToken();
                    if( '}' != nToken )
                        eState = SVPAR_ERROR;
                    break;
                }
                ++nOpenBrakets;
            }
            break;

        case RTF_PNCARD:
        case RTF_PNORD:
        case RTF_PNORDT:
        case RTF_PNDEC:     pCurNumFmt->eType = SVX_NUM_ARABIC;                 break;
        case RTF_PNUCLTR:   pCurNumFmt->eType = SVX_NUM_CHARS_UPPER_LETTER_N;   break;
        case RTF_PNUCRM:    pCurNumFmt->eType = SVX_NUM_ROMAN_UPPER;            break;
        case RTF_PNLCLTR:   pCurNumFmt->eType = SVX_NUM_CHARS_LOWER_LETTER_N;   break;
        case RTF_PNLCRM:    pCurNumFmt->eType = SVX_NUM_ROMAN_LOWER;            break;

        case RTF_PNF:
            {
                const Font& rSVFont = GetFont( USHORT(nTokenValue) );
                GetNumChrFmt( *pDoc, *pCurRule, nLevel ).Put(
                            SvxFontItem( rSVFont.GetFamily(),
                                rSVFont.GetName(), rSVFont.GetStyleName(),
                                rSVFont.GetPitch(), rSVFont.GetCharSet() ));
                if( SVX_NUM_CHAR_SPECIAL == pCurNumFmt->eType )
                    pCurNumFmt->SetBulletFont( &rSVFont );
            }
            break;
        case RTF_PNFS:
            {
                if( -1 == nTokenValue )
                    nTokenValue = 240;
                else
                    nTokenValue *= 10;
                GetNumChrFmt( *pDoc, *pCurRule, nLevel ).Put(
                            SvxFontHeightItem( (const USHORT)nTokenValue ));
            }
            break;

        case RTF_PNB:
            {
                GetNumChrFmt( *pDoc, *pCurRule, nLevel ).Put( SvxWeightItem(
                                nTokenValue ? WEIGHT_BOLD : WEIGHT_NORMAL ));
            }
            break;

        case RTF_PNI:
            {
                GetNumChrFmt( *pDoc, *pCurRule, nLevel ).Put( SvxPostureItem(
                            nTokenValue ? ITALIC_NORMAL : ITALIC_NONE ));
            }
            break;

        case RTF_PNCAPS:
        case RTF_PNSCAPS:
            {
                GetNumChrFmt( *pDoc, *pCurRule, nLevel ).Put( SvxCaseMapItem(
                                nTokenValue ? SVX_CASEMAP_KAPITAELCHEN
                                            : SVX_CASEMAP_NOT_MAPPED ));
            }
            break;
        case RTF_PNSTRIKE:
            {
                GetNumChrFmt( *pDoc, *pCurRule, nLevel ).Put( SvxCrossedOutItem(
                        nTokenValue ? STRIKEOUT_SINGLE : STRIKEOUT_NONE ));
            }
            break;

        case RTF_PNCF:
            {
                GetNumChrFmt( *pDoc, *pCurRule, nLevel ).Put( SvxColorItem(
                            GetColor( USHORT(nTokenValue) ) ));
            }
            break;


        case RTF_PNUL:
            eUnderline = nTokenValue ? UNDERLINE_SINGLE : UNDERLINE_NONE;
            goto NUMATTR_SETUNDERLINE;
        case RTF_PNULD:
            eUnderline = UNDERLINE_DOTTED;
            goto NUMATTR_SETUNDERLINE;
        case RTF_PNULDB:
            eUnderline = UNDERLINE_DOUBLE;
            goto NUMATTR_SETUNDERLINE;
        case RTF_PNULNONE:
            eUnderline = UNDERLINE_NONE;
            goto NUMATTR_SETUNDERLINE;
        case RTF_PNULW:
            {
                GetNumChrFmt( *pDoc, *pCurRule, nLevel ).Put(
                                    SvxWordLineModeItem( TRUE ));
            }
            eUnderline = UNDERLINE_SINGLE;
            goto NUMATTR_SETUNDERLINE;

NUMATTR_SETUNDERLINE:
            {
                GetNumChrFmt( *pDoc, *pCurRule, nLevel ).Put(
                        SvxUnderlineItem( eUnderline ));
            }
            break;

        case RTF_PNINDENT:
            if( 0 > short( nTokenValue ) )
                nTokenValue = - (short)nTokenValue;
            pCurNumFmt->SetFirstLineOffset( - short( nTokenValue ));
            pCurNumFmt->SetAbsLSpace( (nLevel + 1 ) * USHORT( nTokenValue ));
            break;
        case RTF_PNSP:
            pCurNumFmt->SetCharTextOffset( USHORT( nTokenValue ));
            break;

        case RTF_PNPREV:
            if( nLevel )
            {
                BYTE nPrev = 2, nLast = nLevel;
                while( nLast && 1 < pCurRule->Get( --nLast ).GetUpperLevel() )
                    ++nPrev;
                pCurNumFmt->SetUpperLevel( nPrev );
            }
            break;

        case RTF_PNQC:  pCurNumFmt->SetAdjust( SVX_ADJUST_CENTER );     break;
        case RTF_PNQL:  pCurNumFmt->SetAdjust( SVX_ADJUST_LEFT );       break;
        case RTF_PNQR:  pCurNumFmt->SetAdjust( SVX_ADJUST_RIGHT );      break;

        case RTF_PNSTART:
            pCurNumFmt->SetStartValue( USHORT( nTokenValue ));
            break;

        case RTF_PNNUMONCE:
        case RTF_PNACROSS:
        case RTF_PNHANG:
        case RTF_PNRESTART:     break;

        case RTF_PNTXTA:
            {
                String sTmp;
                GetTextToEndGroup( sTmp );
                if( SVX_NUM_CHAR_SPECIAL == pCurNumFmt->eType )
                {
                    pCurNumFmt->SetBulletChar( sTmp.GetChar( 0 ) );
                    if( pCurNumFmt->GetCharFmt() )
                        pCurNumFmt->SetBulletFont( FindFontOfItem(
                                    pCurNumFmt->GetCharFmt()->GetFont() ) );
                    sTmp.Erase();
                }
                pCurNumFmt->SetPostfix( sTmp );
            }
            break;

        case RTF_PNTXTB:
            {
                String sTmp;
                pCurNumFmt->SetPrefix( GetTextToEndGroup( sTmp ) );
            }
            break;
        }
    }

    // falls vollstaendige Numerierung an ist und das Zeichen davor ein
    // Punkt ist, dann will RTF den Punkt als Trenner zwischen den Ebenen
    // haben - das haben wir aber schon als default
    if( 1 < pCurNumFmt->GetUpperLevel() &&
        1 == pCurNumFmt->GetPrefix().Len() &&
        '.' == pCurNumFmt->GetPrefix().GetChar( 0 ) &&
        SVX_NUM_CHAR_SPECIAL != pCurNumFmt->eType )
        pCurNumFmt->SetPrefix( aEmptyStr );

    // falls das ein nicht numerierter Absatz mit ein Prefix-Text mit
    // einem Zeichen ist, dann setze den als Bulletzeichen
    if( pCurNumFmt->GetCharFmt() && SVX_NUM_NUMBER_NONE == pCurNumFmt->eType &&
        3 == nListNo && 1 == pCurNumFmt->GetPrefix().Len() )
    {
        SwCharFmt* pChFmt = pCurNumFmt->GetCharFmt();
        pCurNumFmt->eType = SVX_NUM_CHAR_SPECIAL;
        pCurNumFmt->SetBulletFont( FindFontOfItem( pChFmt->GetFont() ) );

        pCurNumFmt->SetBulletChar( pCurNumFmt->GetPrefix().GetChar( 0 ) );
        pCurNumFmt->SetPrefix( aEmptyStr );

        // den Font oder sogar das gesamte CharFormat loeschen?
        if( SFX_ITEM_SET == pChFmt->GetItemState( RES_CHRATR_FONT, FALSE ))
        {
            if( 1 == pChFmt->GetAttrSet().Count() )
            {
                pCurNumFmt->SetCharFmt( 0 );
                pDoc->DelCharFmt( pChFmt );
            }
            else
                pChFmt->ResetAttr( RES_CHRATR_FONT );
        }
    }

    SkipToken( -1 );        // die schliesende Klammer wird "oben" ausgewertet
}


/*  */

// dann noch die Ausgabe-Funktionen (nur fuer WinWord 97)

void SwRTFWriter::OutRTFListTab()
{
    ByteString sOverrideList;
    const SwNumRuleTbl& rListTbl = pDoc->GetNumRuleTbl();
    USHORT nId = 1, nTmplId = 1, n;

    // prepare the NodeNum to generate the NumString
    SwNodeNum aNdNum( 0 );
    for( n = 0; n < MAXLEVEL; ++n )
        aNdNum.GetLevelVal()[ n ] = n;
    BYTE aNumLvlPos[ MAXLEVEL ];

    for( n = rListTbl.Count()+1; n; )
    {
        const SwNumRule* pRule;
        --n;
        if( n == rListTbl.Count() )
            pRule = pDoc->GetOutlineNumRule();
        else
        {
            pRule = rListTbl[ n ];
            if( !pDoc->IsUsed( *pRule ))
                continue;
        }

        BYTE nEnd = MAXLEVEL;
        while( nEnd-- && !pRule->GetNumFmt( nEnd ))
            ;
        ++nEnd;

        for( BYTE nLvl = 0; nLvl < nEnd; ++nLvl )
            if( SVX_NUM_NUMBER_NONE != pRule->Get( nLvl ).eType )
                break;

        if( nLvl == nEnd )      // alle Level no number -> dont write it
            continue;

        // mit der ersten Rule wird auch die ListTable geschrieben
        if( !sOverrideList.Len() )
            OutComment( *this, sRTF_LISTTABLE );

        Strm() << '{' << sRTF_LIST << sRTF_LISTTEMPLATEID;
        OutULong( nTmplId );
        ByteString sTmp;

        if( pRule->IsContinusNum() )
            Strm() << sRTF_LISTSIMPLE;

        for( nLvl = 0; nLvl < nEnd; ++nLvl )
        {
            const SwNumFmt& rFmt = pRule->Get( nLvl );
            Strm() << sNewLine;
            if( nLvl > 8 )          // RTF-kennt nur 9 Ebenen
                OutComment( *this, sRTF_SOUTLVL );

            Strm() << '{' << sRTF_LISTLEVEL << sRTF_LEVELNFC;

            USHORT nVal = 0;
            switch( rFmt.eType )
            {
            case SVX_NUM_ROMAN_UPPER:           nVal = 1;   break;
            case SVX_NUM_ROMAN_LOWER:           nVal = 2;   break;
            case SVX_NUM_CHARS_UPPER_LETTER:
            case SVX_NUM_CHARS_UPPER_LETTER_N:  nVal = 3;   break;
            case SVX_NUM_CHARS_LOWER_LETTER:
            case SVX_NUM_CHARS_LOWER_LETTER_N:  nVal = 4;   break;

            case SVX_NUM_BITMAP:
            case SVX_NUM_CHAR_SPECIAL:          nVal = 23;  break;
            }
            OutLong( nVal ) << sRTF_LEVELJC;

            switch( rFmt.GetAdjust() )
            {
            case SVX_ADJUST_CENTER:     nVal = 1;   break;
            case SVX_ADJUST_RIGHT:      nVal = 2;   break;
            default:                    nVal = 0;   break;
            }
            OutLong( nVal ) << sRTF_LEVELSTARTAT;
            OutLong( rFmt.GetStartValue() )
                << sRTF_LEVELFOLLOW << "2{" << sRTF_LEVELTEXT << ' ';

            BOOL bWriteBulletFont = FALSE;
            memset( aNumLvlPos, 0, MAXLEVEL );
            if( SVX_NUM_CHAR_SPECIAL == rFmt.eType ||
                SVX_NUM_BITMAP == rFmt.eType )
            {
                Strm() << "\\'01\\'"; OutHex( rFmt.GetBulletChar() );
                bWriteBulletFont = TRUE;
            }
            else if( SVX_NUM_NUMBER_NONE != rFmt.eType )
            {
                memset( aNumLvlPos, 0, MAXLEVEL );
                BYTE* pLvlPos = aNumLvlPos;
                aNdNum.SetLevel( nLvl );
                String sNumStr( pRule->MakeNumString( aNdNum, FALSE, TRUE ));

                // now search the nums in the string
                for( BYTE i = 0; i <= nLvl; ++i )
                {
                    String sSrch( String::CreateFromInt32( i ));
                    xub_StrLen nFnd = sNumStr.Search( sSrch );
                    if( STRING_NOTFOUND != nFnd )
                    {
                        *pLvlPos = (BYTE)(nFnd + rFmt.GetPrefix().Len() + 1 );
                        ++pLvlPos;
                        sNumStr.SetChar( nFnd, (sal_Unicode)i );
                    }
                }

                Strm() << "\\'";
                OutHex( sNumStr.Len() + rFmt.GetPrefix().Len() +
                                        rFmt.GetPostfix().Len() );

                if( rFmt.GetPrefix().Len() )
                    RTFOutFuncs::Out_String( Strm(), rFmt.GetPrefix(),
                                            DEF_ENCODING, bWriteHelpFmt );


                for( xub_StrLen x = 0; x < sNumStr.Len(); ++x )
                    if( sNumStr.GetChar( x ) < 0x20 ||
                        sNumStr.GetChar( x ) > 0xFF )
                    {
                        Strm() << "\\'"; OutHex( sNumStr.GetChar( x ) );
                    }
                    else
                        Strm() << (sal_Char)sNumStr.GetChar( x );

                if( rFmt.GetPostfix().Len() )
                    RTFOutFuncs::Out_String( Strm(), rFmt.GetPostfix(),
                                            DEF_ENCODING, bWriteHelpFmt );
            }

            // write the levelnumbers
            Strm() << ";}{" << sRTF_LEVELNUMBERS;
            for( BYTE i = 0; i <= nLvl && aNumLvlPos[ i ]; ++i )
            {
                Strm() << "\\'"; OutHex( aNumLvlPos[ i ] );
            }
            Strm() << ";}";

            if( rFmt.GetCharFmt() )
                Out_SfxItemSet( aRTFAttrFnTab, *this,
                                rFmt.GetCharFmt()->GetAttrSet(), TRUE );

            if( bWriteBulletFont )
            {
                Strm() << sRTF_F;
                const Font* pFont = rFmt.GetBulletFont();
                if( !pFont )
                    pFont = &SwNumRule::GetDefBulletFont();
                OutULong( GetId( *pFont ));
            }

            Strm() << sRTF_FI;
            OutLong( rFmt.GetFirstLineOffset() ) << sRTF_LI;
            OutLong( rFmt.GetAbsLSpace() );

            Strm() << '}';

            if( nLvl > 8 )      // RTF-kennt nur 9 Ebenen
                Strm() << '}';
        }

        if( !pRule->IsAutoRule() )
        {
            Strm() << '{' << sRTF_LISTNAME << ' ';
            RTFOutFuncs::Out_String( Strm(), pRule->GetName(), DEF_ENCODING,
                                    bWriteHelpFmt ) << ";}" ;
        }
        Strm() << sRTF_LISTID;
        OutULong( nId ) << '}' << sNewLine;

        sTmp = '{';
        ((((((( sTmp += sRTF_LISTOVERRIDE ) +=
                    sRTF_LISTID ) += ByteString::CreateFromInt32( nId )) +=
                    sRTF_LISTOVERRIDECOUNT ) += '0' ) +=
                    sRTF_LS ) += ByteString::CreateFromInt32( n )) += '}';
        sOverrideList += sTmp;

        ++nId, ++nTmplId;
    }

    if( sOverrideList.Len() )
        Strm() << "}{" << sRTF_LISTOVERRIDETABLE
               << sOverrideList.GetBuffer() << '}' << sNewLine;
}

USHORT SwRTFWriter::GetId( const SwNumRuleItem& rItem ) const
{
    return pDoc->FindNumRule( rItem.GetValue() );
}

void SwRTFWriter::OutListNum( const SwTxtNode& rNd )
{
    const SwNumRule* pRule = rNd.GetNumRule();
    const SwNodeNum* pNdNum = 0;
    // or is an outlinerule valid?
    if( pRule )
        pNdNum = rNd.GetNum();
    else if( MAXLEVEL > rNd.GetTxtColl()->GetOutlineLevel() &&
            0 != ( pNdNum = rNd.GetOutlineNum() ) )
        pRule = pDoc->GetOutlineNumRule();

    if( pRule && pNdNum && MAXLEVEL > pNdNum->GetLevel() )
    {
        bOutFmtAttr = FALSE;
        bOutListNumTxt = TRUE;

        BOOL bValidNum = MAXLEVEL > pNdNum->GetLevel();
        BYTE nLvl = GetRealLevel( pNdNum->GetLevel() );
        const SwNumFmt* pFmt = pRule->GetNumFmt( nLvl );
        if( !pFmt )
            pFmt = &pRule->Get( nLvl );

        const SfxItemSet& rNdSet = rNd.GetSwAttrSet();

        SfxItemSet aSet( *rNdSet.GetPool(), rNdSet.GetRanges() );
        aSet.SetParent( &rNdSet );
        SvxLRSpaceItem aLR( (SvxLRSpaceItem&)rNdSet.Get( RES_LR_SPACE ) );
        aLR.SetTxtLeft( aLR.GetTxtLeft() + pFmt->GetAbsLSpace() );

        if( bValidNum )
        {
            aLR.SetTxtFirstLineOfst( pFmt->GetFirstLineOffset() );
            Strm() << '{' << sRTF_LISTTEXT << sRTF_PARD << sRTF_PLAIN << ' ';
        }
        aSet.Put( aLR );
        Out_SfxItemSet( aRTFAttrFnTab, *this, aSet, TRUE );

        if( pFmt->GetCharFmt() )
            Out_SfxItemSet( aRTFAttrFnTab, *this,
                        pFmt->GetCharFmt()->GetAttrSet(), TRUE );

        if( bValidNum )
        {
            String sTxt;
            if( SVX_NUM_CHAR_SPECIAL == pFmt->eType || SVX_NUM_BITMAP == pFmt->eType )
                sTxt = pFmt->GetBulletChar();
            else
                sTxt = pRule->MakeNumString( *pNdNum );

            if( bOutFmtAttr )
            {
                Strm() << ' ';
                bOutFmtAttr = FALSE;
            }

            RTFOutFuncs::Out_String( Strm(), sTxt, DEF_ENCODING, bWriteHelpFmt);

            if( OUTLINE_RULE != pRule->GetRuleType() )
            {
                Strm() /*<< sRTF_TAB*/ << '}' << sRTF_ILVL;
                if( nLvl > 8 )          // RTF-kennt nur 9 Ebenen
                {
                    OutULong( 8 );
                    OutComment( *this, sRTF_SOUTLVL );
                    OutULong( nLvl ) << '}';
                }
                else
                    OutULong( nLvl );
                Strm()  << ' ';
            }
            else
                Strm() /*<< sRTF_TAB*/ << '}';
        }
        bOutListNumTxt = FALSE;
    }
}

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/rtf/rtfnum.cxx,v 1.1.1.1 2000-09-18 17:14:56 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.27  2000/09/18 16:04:51  willem.vandorp
      OpenOffice header added.

      Revision 1.26  2000/08/04 10:48:09  jp
      Soft-/HardHyphens & HardBlanks changed from attribute to unicode character; use rtfout functions

      Revision 1.25  2000/05/26 07:22:44  os
      old SW Basic API Slots removed

      Revision 1.24  2000/05/24 07:57:04  jp
      Bugfixes for Unicode

      Revision 1.23  2000/05/09 17:22:53  jp
      Changes for Unicode

      Revision 1.22  2000/03/14 17:25:25  jp
      Bug #73968#: read and set outline/num-levels

      Revision 1.21  2000/03/14 09:22:24  jp
      Bug #73941#: remove unused numrules, share override rules

      Revision 1.20  2000/03/10 17:54:09  jp
      Bug #73965#: ReadListLevel - set no number

      Revision 1.19  2000/03/10 15:56:52  jp
      Bug #74100#: read W2000 rtf-format

      Revision 1.18  2000/02/24 18:33:17  jp
      Bug #73098#: read & write list entries without number

      Revision 1.17  2000/02/17 13:46:55  jp
      Bug #73098#: Import / Export problems

      Revision 1.16  2000/02/11 14:38:01  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.15  2000/01/25 20:13:02  jp
      Bug #72146#: read UniCode character

      Revision 1.14  1999/08/03 17:47:38  JP
      Bug #67975#: changes for import of Bulltets from interleave/WP7/Aplixware


      Rev 1.13   03 Aug 1999 19:47:38   JP
   Bug #67975#: changes for import of Bulltets from interleave/WP7/Aplixware

      Rev 1.12   12 Jul 1999 17:35:24   JP
   read and write outlinelevel/-numrules

      Rev 1.11   30 Mar 1999 14:41:48   JP
   Task #63049#: Numerierung mit rel. Einzuegen

      Rev 1.10   29 Mar 1999 10:00:32   JP
   Bug #63990#: NumRules immer mit negativen Erstzeileneinzug

      Rev 1.9   18 Mar 1999 09:51:44   JP
   Task #63049#: Numerierung mit rel. Einzuegen

      Rev 1.8   16 Mar 1999 23:19:34   JP
   Task #63049#: Einzuege bei NumRules relativ

      Rev 1.7   05 Mar 1999 14:27:56   JP
   Bug #57749#: spaltige Bereiche einlesen - jeder Bereich hat eigene NumRules

      Rev 1.6   03 Mar 1999 15:17:22   JP
   Bug #57749#: spaltige Bereiche einlesen

      Rev 1.5   17 Nov 1998 10:45:30   OS
   #58263# NumType durch SvxExtNumType ersetzt

      Rev 1.4   21 Sep 1998 17:15:12   JP
   RTF_LEVELNFC: 255 ist auch ein Bullet

      Rev 1.3   06 Aug 1998 21:43:30   JP
   Bug #54796#: neue NumerierungsTypen (WW97 kompatibel)

      Rev 1.2   04 Jun 1998 19:28:06   JP
   Bug #50887#: Font bei Grafik-NumFormaten ist 0, also default Font schreiben

      Rev 1.1   27 May 1998 22:26:14   JP
   Bug #50585#: ListOverrideTabelle korrekt einlesen

      Rev 1.0   20 Apr 1998 17:44:00   JP
   neu: Numerierung lesen/schreiben

*************************************************************************/

diff --git a/sw/source/filter/rtf/rtftbl.cxx b/sw/source/filter/rtf/rtftbl.cxx
new file mode 100644
index 0000000..11da00d
--- /dev/null
+++ b/sw/source/filter/rtf/rtftbl.cxx
@@ -0,0 +1,978 @@
/*************************************************************************
 *
 *  $RCSfile: rtftbl.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:56 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#ifdef WTC
#define private public
#endif

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _SVX_BRKITEM_HXX
#include <svx/brkitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen wg. SvxLRSpaceItem
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX
#include <svx/boxitem.hxx>
#endif
#ifndef _RTFTOKEN_H
#include <svtools/rtftoken.h>
#endif

#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _FMTORNT_HXX //autogen
#include <fmtornt.hxx>
#endif
#ifndef _FMTPDSC_HXX //autogen
#include <fmtpdsc.hxx>
#endif
#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _NDTXT_HXX
#include <ndtxt.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _PAM_HXX
#include <pam.hxx>
#endif
#ifndef _SWPARRTF_HXX
#include <swparrtf.hxx>
#endif
#ifndef _POOLFMT_HXX
#include <poolfmt.hxx>
#endif
#ifndef _SWTABLE_HXX
#include <swtable.hxx>
#endif
#ifndef _TBLSEL_HXX
#include <tblsel.hxx>
#endif
#ifndef _SWTBLFMT_HXX
#include <swtblfmt.hxx>
#endif
#ifndef _TBLENUM_HXX
#include <tblenum.hxx>
#endif
#ifndef _FRMATR_HXX
#include <frmatr.hxx>
#endif

typedef SwTableBoxFmt* SwTableBoxFmtPtr;
SV_DECL_PTRARR( SwBoxFrmFmts, SwTableBoxFmtPtr, 25, 50 )

class SwShareBoxFmts;
extern void _DeleteBox( SwTable& rTbl, SwTableBox* pBox, SwUndo* = 0,
                    BOOL = TRUE, const BOOL = TRUE, SwShareBoxFmts* = 0 );

void SwRTFParser::ReadTable( int nToken )
{
    nInsTblRow = USHRT_MAX;
    if( bReadNoTbl )
    {
        // alle Tabellen-Tokens ueberlesen
        nToken = GetNextToken();        // RTF_TROWD ueberlesen
        do {
            if( RTF_TABLEDEF != (nToken & ~(0xff | RTF_SWGDEFS)) &&
                RTF_UNKNOWNCONTROL != nToken )
            {
                SkipToken( -1 );
                break;
            }
            nToken = GetNextToken();
        } while( IsParserWorking() );
        return ;
    }

    // verhinder Tabelle in Tabelle/Footnote
    SwTwips nTblSz = 0;
    int bReadNewCell = FALSE, bChkExistTbl = FALSE;

    // kein TROWD aber ein TabellenToken -> zwischen TROWD und Tab.Token
    // waren andere Zeichen (siehe Bug 27445.rtf)
    if( RTF_TROWD == nToken || !pTableNode )
    {
        if( RTF_TROWD == nToken )
            nToken = GetNextToken();        // RTF_TROWD ueberlesen

        // Flags fuer die gemergten Boxen loeschen
        aMergeBoxes.Remove( 0, aMergeBoxes.Count() );
        aMergeBoxes.Insert( (BOOL)FALSE, USHORT(0) );
        nAktBox = 0;

        // wenn schon in einer Tabellen, dann splitte oder benutze
        // die bisherigen Boxen weiter
        bChkExistTbl = 0 != pDoc->GetNodes()[ pPam->GetPoint()->nNode ]->FindTableNode();
    }
    else
    {
        bReadNewCell = TRUE;
        SwTableLines& rLns = pTableNode->GetTable().GetTabLines();
        SwTableLine* pLine = rLns[ rLns.Count()-1 ];
        for( USHORT n = nAktBox; n; )
            nTblSz += pLine->GetTabBoxes()[ --n ]->GetFrmFmt()->
                            GetFrmSize().GetWidth();
    }


    SwHoriOrient eAdjust = HORI_LEFT;       // default fuer Tabellen
    USHORT nLSpace = 0, nBrdDist = MIN_BORDER_DIST;
    SwVertOrient eVerOrient = VERT_NONE;
    long nLineHeight = 0;
    USHORT nBoxCnt = aMergeBoxes.Count()-1;
    SwBoxFrmFmts aBoxFmts;
    SwTableBoxFmt* pBoxFmt = pDoc->MakeTableBoxFmt();
    BOOL bHeadlineRepeat = FALSE;

#ifdef SET_TRGAPH
    SvxLRSpaceItem aLR;
#endif

    int bWeiter = TRUE;
    do {
        switch( nToken )
        {
        case RTF_TRRH:
            nLineHeight = nTokenValue;
            break;

        case RTF_CLMRG:
            aMergeBoxes[ nBoxCnt ] = TRUE;
            break;

        case RTF_CELLX:
            {
                SwTableBoxFmt* pFmt = pBoxFmt;
                SwTwips nSize = nTokenValue - nTblSz;
                if( aMergeBoxes[ nBoxCnt ] )
                {
                    // neue Zellen lesen und noch keine Formate vorhanden,
                    // dann benutze das der vorhergebende
                    if( bReadNewCell && !aBoxFmts.Count() )
                    {
                        SwTableLines& rLns = pTableNode->GetTable().GetTabLines();
                        SwTableLine* pLine = rLns[ rLns.Count()-1 ];
                        --nAktBox;
                        pFmt = (SwTableBoxFmt*)pLine->GetTabBoxes()[ nAktBox ]->GetFrmFmt();
                    }
                    else
                        pFmt = aBoxFmts[ aBoxFmts.Count()-1 ];

                    pBoxFmt->ResetAllAttr();
                    nSize += pFmt->GetFrmSize().GetWidth();
                }
                else
                {
                    // Platz zwischen den Spalten angeben und ist
                    // diese auch kleiner als die Breite der Box
#ifdef SET_TRGAPH
                    if( aLR.GetLeft() && 2L * aLR.GetLeft() < nSize )
                        pBoxFmt->SetAttr( aLR );
                    aLR.SetLeft( 0 ); aLR.SetRight( 0 );
#endif
                    aBoxFmts.Insert( pBoxFmt, aBoxFmts.Count() );
                    pBoxFmt = pDoc->MakeTableBoxFmt();
                }

                pFmt->SetAttr( SwFmtFrmSize( ATT_VAR_SIZE, nSize, 0 ));
                nTblSz = nTokenValue;
                aMergeBoxes.Insert( (BOOL)FALSE, ++nBoxCnt );
            }
            break;

        case RTF_TRGAPH:
            {
                nBrdDist = (USHORT)nTokenValue;
#ifdef SET_TRGAPH
                aLR.SetLeft( USHORT( nTokenValue ));
                aLR.SetRight( USHORT( nTokenValue ));
#endif
            }
            break;

        case RTF_TRQL:          eAdjust = HORI_LEFT;    break;
        case RTF_TRQR:          eAdjust = HORI_RIGHT;   break;
        case RTF_TRQC:          eAdjust = HORI_CENTER;  break;

                                // mit VERT_TOP kommt der Dialog nicht klar!
                                // Bug #65126#
        case RTF_CLVERTALT:     eVerOrient = VERT_NONE;     break;

        case RTF_CLVERTALC:     eVerOrient = VERT_CENTER;   break;
        case RTF_CLVERTALB:     eVerOrient = VERT_BOTTOM;   break;

        case RTF_TRLEFT:
            if( 0 <= nTokenValue )
            {
                if( HORI_LEFT == eAdjust )
                    eAdjust = HORI_LEFT_AND_WIDTH;
                nLSpace = (USHORT)nTokenValue;
            }
            nTblSz = nTokenValue;
            break;

        case RTF_TRHDR:
            bHeadlineRepeat = TRUE;
            break;

        case RTF_CLTXLRTB:
        case RTF_CLTXTBRL:
        case RTF_INTBL:     // das wissen wir !
        case RTF_CLMGF:
        case RTF_CLVMGF:
        case RTF_CLVMRG:
        case RTF_LTRROW:
        case RTF_RTLROW:
        case RTF_TRBRDRB:
        case RTF_TRBRDRH:
        case RTF_TRBRDRL:
        case RTF_TRBRDRR:
        case RTF_TRBRDRT:
        case RTF_TRBRDRV:
        case RTF_TRKEEP:
                break;

        default:
            if( ( nToken & ~(0xff | RTF_TABLEDEF)) == RTF_SHADINGDEF )
            {
                if( aMergeBoxes[ nBoxCnt ] )
                    break;
                ReadBackgroundAttr( nToken,
                        (SfxItemSet&)pBoxFmt->GetAttrSet(), TRUE );
            }
            else if( ( nToken & ~(0xff | RTF_TABLEDEF) ) == RTF_BRDRDEF )
            {
                if( aMergeBoxes[ nBoxCnt ] )
                    break;

                const SfxPoolItem* pItem;
                SfxItemSet& rSet = (SfxItemSet&)pBoxFmt->GetAttrSet();
                ReadBorderAttr( nToken, rSet, TRUE );
                if( SFX_ITEM_SET == rSet.GetItemState( RES_BOX, FALSE, &pItem ))
                {
                    SvxBoxItem aBox( *(SvxBoxItem*)pItem );
                    BOOL bChg = FALSE;
                    for ( int nLn = 0; nLn < 4; ++nLn )
                        if( aBox.GetLine( nLn ) && !aBox.GetDistance( nLn ) )
                        {
                            aBox.SetDistance( 2 > nLn ? 18 : nBrdDist, nLn );
                            bChg = TRUE;
                        }
                    if( bChg )
                        rSet.Put( aBox );
                }
            }
            else if( RTF_TABLEDEF != (nToken & ~(0xff | RTF_SWGDEFS)) )
            {
                if( RTF_UNKNOWNCONTROL == nToken )
                    NextToken( nToken );
                else
                    bWeiter = FALSE;
            }
            break;
        }

        if( VERT_NONE != eVerOrient )
        {
            if( !aMergeBoxes[ nBoxCnt ] )
                pBoxFmt->SetAttr( SwFmtVertOrient( 0, eVerOrient ));
            eVerOrient = VERT_NONE;
        }
        if( bWeiter )
            nToken = GetNextToken();
    } while( bWeiter && IsParserWorking() );

    // das letzte temp. BoxFmt loeschen
    delete pBoxFmt;

    // es wurde keine einzige Box erkannt
    if( nAktBox == nBoxCnt || ( bReadNewCell && !pTableNode ))
    {
        SkipToken( -1 );            // zum Letzen gueltigen zurueck
        return;
    }

    nTblSz -= nLSpace;

    int bNewTbl = TRUE;
    SwTableLine* pNewLine;

    // lege eine neue Tabelle an oder erweiter die aktuelle um eine neue Line
    // oder Box !
    SwNode* pNd;

    if( bChkExistTbl )
    {
        // es ist eine Tabelle vorhanden, teste mal ob die weiter benutzt
        // werden kann oder ob sie abgesplittet und neu gefuellt werden
        // muss.
        pTableNode = pPam->GetNode()->FindTableNode();

        // Cursor kann nur in der letzten Line stehen

        // das Attribut darf nicht ueber das Modify an der
        // Tabelle gesetzt werden, denn sonst werden alle
        // Boxen wieder auf 0 zurueck gesetzt !!!!!
        SwFrmFmt* pFmt = pTableNode->GetTable().GetFrmFmt();
        const SwFmtFrmSize& rTblSz = pFmt->GetFrmSize();
        const SwFmtHoriOrient& rHoriz = pFmt->GetHoriOrient();

        const SwTableLines* pLns = &pTableNode->GetTable().GetTabLines();

        if( 1 == pLns->Count() )
        {
            if( eAdjust != rHoriz.GetHoriOrient() )
            {
                ((SfxItemSet&)pFmt->GetAttrSet()).Put( SwFmtHoriOrient( 0,
                                                            eAdjust ) );
            }
            if( rTblSz.GetWidth() != nTblSz )
            {
                SwFmtFrmSize aSz( rTblSz );
                aSz.SetWidth( nTblSz );
                ((SfxItemSet&)pFmt->GetAttrSet()).Put( aSz );
            }

            if( HORI_LEFT_AND_WIDTH == eAdjust &&
                nLSpace != pFmt->GetLRSpace().GetLeft() )
            {
                SvxLRSpaceItem aL; aL.SetLeft( nLSpace );
                ((SfxItemSet&)pFmt->GetAttrSet()).Put( aL );
            }
        }
        else if( 1 < pLns->Count() && ( rTblSz.GetWidth() != nTblSz
            || rHoriz.GetHoriOrient() != eAdjust ||
            ( HORI_LEFT_AND_WIDTH == eAdjust &&
                nLSpace != pFmt->GetLRSpace().GetLeft() ) ||
            bHeadlineRepeat != pTableNode->GetTable().IsHeadlineRepeat() ))
        {
            // Tabelle ab der PaM-Position splitten
            pNewLine = (*pLns)[ pLns->Count() - 2 ];        // die vorherige Line!
            SwTableBox* pBox = pNewLine->GetTabBoxes()[ 0 ];
            while( ( pLns = &pBox->GetTabLines() )->Count() )
                pBox = (*pLns)[ 0 ]->GetTabBoxes()[ 0 ];

            SwNodeIndex aTmpIdx( *pBox->GetSttNd() );
            pDoc->GetNodes().SplitTable( aTmpIdx, HEADLINE_NONE, FALSE );
            pTableNode = pPam->GetNode()->FindTableNode();
            pFmt = pTableNode->GetTable().GetFrmFmt();

            SwFmtFrmSize aSz( rTblSz );
            aSz.SetWidth( nTblSz );
            ((SfxItemSet&)pFmt->GetAttrSet()).Put( aSz );
            ((SfxItemSet&)pFmt->GetAttrSet()).Put( SwFmtHoriOrient( 0,
                                                            eAdjust ) );
            if( HORI_LEFT_AND_WIDTH == eAdjust && nLSpace )
            {
                SvxLRSpaceItem aL; aL.SetLeft( nLSpace );
                ((SfxItemSet&)pFmt->GetAttrSet()).Put( aL );
            }
            pTableNode->GetTable().SetHeadlineRepeat( bHeadlineRepeat );
        }

        pLns = &pTableNode->GetTable().GetTabLines();
        pNewLine = (*pLns)[ pLns->Count() - 1 ];

        // jetzt die Boxen abgleichen
        USHORT nBoxes = Min( pNewLine->GetTabBoxes().Count(), aBoxFmts.Count() );
        for( USHORT n = 0; n < nBoxes; ++n )
        {
            SwTableBox* pBox = pNewLine->GetTabBoxes()[ n ];
            *pBox->GetFrmFmt() = *aBoxFmts[ n ];
            delete aBoxFmts[ n ];
        }
        aBoxFmts.Remove( 0, n );

        if( aBoxFmts.Count() )      // es muessen noch neue zugefuegt werden
            nAktBox = n;
        else                        // es mussen noch Boxen geloescht werden
        {
            // remove ContentIndex of other Bound
            pPam->SetMark(); pPam->DeleteMark();
            while( n < pNewLine->GetTabBoxes().Count() )
                _DeleteBox( pTableNode->GetTable(),
                            pNewLine->GetTabBoxes()[ n ], 0, FALSE, FALSE );
        }

        pOldTblNd = pTableNode;
        bNewTbl = FALSE;

        {
            // JP 13.08.98: TabellenUmrandungen optimieren - Bug 53525
            void* p = pFmt;
            aTblFmts.Insert( p, aTblFmts.Count() );
        }
    }
    else
    {
        if( !bReadNewCell && ( pNd = pDoc->GetNodes()[
            pPam->GetPoint()->nNode.GetIndex()-1 ])->IsEndNode() )
        {
            pTableNode = pNd->StartOfSectionNode()->GetTableNode();
            if( pTableNode )
            {
                // dann test mal ob wirklich nur eine neue Line eingefuegt
                // werden soll!
                SwFrmFmt* pFmt = pTableNode->GetTable().GetFrmFmt();
                const SwFmtFrmSize& rTblSz = pFmt->GetFrmSize();
                const SwFmtHoriOrient& rHoriz = pFmt->GetHoriOrient();
                if( rTblSz.GetWidth() != nTblSz
                    || rHoriz.GetHoriOrient() != eAdjust )
                    pTableNode = 0;
            }
        }

        if( pTableNode )
        {

            // das Attribut darf nicht ueber das Modify an der
            // Tabelle gesetzt werden, denn sonst werden alle
            // Boxen wieder auf 0 zurueck gesetzt !!!!!
            SwFrmFmt* pFmt = pTableNode->GetTable().GetFrmFmt();
            const SwFmtFrmSize& rTblSz = pFmt->GetFrmSize();
            if( rTblSz.GetWidth() < nTblSz )
            {
                SwFmtFrmSize aSz( rTblSz );
                aSz.SetWidth( nTblSz );
                ((SfxItemSet&)pFmt->GetAttrSet()).Put( aSz );
            }

            SwTableLines& rLns = pTableNode->GetTable().GetTabLines();

            if( bReadNewCell )
                pNewLine = rLns[ rLns.Count()-1 ];
            else
            {
                pNewLine = new SwTableLine(
                        (SwTableLineFmt*)rLns[ rLns.Count()-1 ]->GetFrmFmt(),
                        aBoxFmts.Count(), 0 );
                pNewLine->ClaimFrmFmt();
                pNewLine->GetFrmFmt()->ResetAttr( RES_FRM_SIZE );
                rLns.C40_INSERT( SwTableLine, pNewLine, rLns.Count() );
            }
            bNewTbl = FALSE;
        }
        else
        {
            if( pPam->GetPoint()->nContent.GetIndex() )
                InsertPara();

            pDoc->InsertTable( *pPam->GetPoint(), 1, 1, eAdjust );
            pTableNode = pDoc->GetNodes()[ pPam->GetPoint()->nNode.
                            GetIndex() - 5 ]->GetTableNode();
            ASSERT( pTableNode, "Wo ist mein TabellenNode?" );

            SwTableLines& rLns = pTableNode->GetTable().GetTabLines();
            pNewLine = rLns[ rLns.Count()-1 ];

            SwFrmFmt* pFmt = pTableNode->GetTable().GetFrmFmt();
            SwFmtFrmSize aSz( pFmt->GetFrmSize() );
            aSz.SetWidth( nTblSz );
            ((SfxItemSet&)pFmt->GetAttrSet()).Put( aSz );

            if( HORI_LEFT_AND_WIDTH == eAdjust && nLSpace )
            {
                SvxLRSpaceItem aL; aL.SetLeft( nLSpace );
                ((SfxItemSet&)pFmt->GetAttrSet()).Put( aL );
            }
            pTableNode->GetTable().SetHeadlineRepeat( bHeadlineRepeat );

            nAktBox = 0;
            pOldTblNd = pTableNode;

            {
                // JP 13.08.98: TabellenUmrandungen optimieren - Bug 53525
                void* p = pFmt;
                aTblFmts.Insert( p, aTblFmts.Count() );
            }
        }
    }

    if( nLineHeight )
    {
        SwFrmSize eSize;
        if( 0 > nLineHeight )
            eSize = ATT_FIX_SIZE, nLineHeight = -nLineHeight;
        else
            eSize = ATT_MIN_SIZE;
        pNewLine->ClaimFrmFmt()->SetAttr( SwFmtFrmSize( eSize, 0, nLineHeight ));
    }

    if( aBoxFmts.Count() )
    {
        // setze das default Style
        SwTxtFmtColl* pColl = aTxtCollTbl.Get( 0 );
        if( !pColl )
            pColl = pDoc->GetTxtCollFromPool( RES_POOLCOLL_STANDARD );

        USHORT nStt = 0;
        if( bNewTbl )
        {
            SwTableBox* pBox = pNewLine->GetTabBoxes()[0];
            pBoxFmt = (SwTableBoxFmt*)pBox->GetFrmFmt();
            pBoxFmt->Remove( pBox );
            delete pBoxFmt;
            aBoxFmts[0]->Add( pBox );
            SwTxtNode* pTNd = pDoc->GetNodes()[ pBox->GetSttIdx()+1 ]
                                            ->GetTxtNode();
            ASSERT( pTNd, "wo ist der Textnode dieser Box?" );
            pTNd->ChgFmtColl( pColl );
            ++nStt;
        }

        for( ; nStt < aBoxFmts.Count(); ++nStt )
        {
            pDoc->GetNodes().InsBoxen( pTableNode, pNewLine,
                    aBoxFmts[ nStt ],
                    // Formate fuer den TextNode der Box
                    pColl, 0,
                    nAktBox + nStt, 1 );
        }
    }

    if( bChkExistTbl )
        nAktBox = 0;

    if( pDoc->GetRootFrm() )
    {
        // exitiert schon ein Layout, dann muss an dieser Tabelle die
        // BoxFrames neu erzeugt werden.
        pTableNode->DelFrms();
        pTableNode->MakeFrms( &pPam->GetPoint()->nNode );
    }

    ULONG nOldPos = pPam->GetPoint()->nNode.GetIndex();
    SwTableBox* pBox = pNewLine->GetTabBoxes()[ nAktBox ];
    pPam->GetPoint()->nNode = *pBox->GetSttNd()->EndOfSectionNode();
    pPam->Move( fnMoveBackward, fnGoCntnt );

    // alle Attribute, die schon auf den nachfolgen zeigen auf die neue
    // Box umsetzen !!
    SvxRTFItemStack& rAttrStk = GetAttrStack();
    const SvxRTFItemStackType* pStk;
    for( USHORT n = 0; n < rAttrStk.Count(); ++n )
        if( ( pStk = rAttrStk[ n ])->GetSttNodeIdx() == ULONG(nOldPos) &&
            !pStk->GetSttCnt() )
            ((SvxRTFItemStackType*)pStk)->SetStartPos( SwxPosition( pPam ) );

    SkipToken( -1 );            // zum Letzen gueltigen zurueck
}


// in die naechste Box dieser Line (opt.: falls es nicht die letzte ist)
void SwRTFParser::GotoNextBox()
{
    nInsTblRow = USHRT_MAX;

    ASSERT( pTableNode, "Kein Tabellennode, dann auch keine Box" );

    SwTableLines& rLns = pTableNode->GetTable().GetTabLines();
    SwTableLine* pLine = rLns[ rLns.Count()-1 ];
    SwTableBoxes& rBoxes = pLine->GetTabBoxes();
    SwTableBox* pBox = rBoxes[ rBoxes.Count()-1 ];

    if( ++nAktBox >= aMergeBoxes.Count() )
        nAktBox = aMergeBoxes.Count()-1;

    if( !aMergeBoxes[ nAktBox ] )
    {
        int bMove = TRUE;
        if( pBox->GetSttIdx() > pPam->GetPoint()->nNode.GetIndex() )
        {
            USHORT nRealBox = 0;
            for( USHORT nTmp = 0; nTmp < nAktBox; ++nTmp )
                if( !aMergeBoxes[ nTmp ] )
                    ++nRealBox;

            if( nRealBox < rBoxes.Count() )
            {
                pPam->GetPoint()->nNode = *rBoxes[ nRealBox ]->GetSttNd()->EndOfSectionNode();
                pPam->Move( fnMoveBackward, fnGoCntnt );
                bMove = FALSE;
            }
        }

        if( bMove && nAktBox + 1 == aMergeBoxes.Count() )
            // dann hinter die Tabelle
            pPam->Move( fnMoveForward, fnGoNode );
    }
    else if( !pDoc->GetNodes()[ pPam->GetPoint()->nNode ]->IsCntntNode() )
        // dann in die vorherige ans Ende
        pPam->Move( fnMoveBackward, fnGoCntnt );
}


void SwRTFParser::NewTblLine()
{
    nInsTblRow = USHRT_MAX;

    // erweiter die aktuelle um eine neue Line
    FASTBOOL bMakeCopy = FALSE;
    SwNode* pNd = pDoc->GetNodes()[ pPam->GetPoint()->nNode.GetIndex()-1 ];
    if( !pNd->IsEndNode() ||
        !(pNd = pNd->StartOfSectionNode())->IsTableNode() )
    {
        if( !pOldTblNd )
            return ;

        bMakeCopy = TRUE;
        pNd = pOldTblNd;
    }
    pTableNode = (SwTableNode*)pNd;

    SwTableLines* pLns = &pTableNode->GetTable().GetTabLines();
    SwTableLine* pLine = (*pLns)[ pLns->Count()-1 ];
    SwTableBoxes& rBoxes = pLine->GetTabBoxes();
    SwTableBox* pBox = rBoxes[ rBoxes.Count()-1 ];

    if( !bMakeCopy &&
        64000 < pTableNode->GetTable().GetTabSortBoxes().Count() )
    {
        bMakeCopy = TRUE;       // spaetestens jetzt eine neue anfangen!
    }

    if( bMakeCopy )
    {
        // und die Selektion kopieren
        SwSelBoxes aBoxes;
        pTableNode->GetTable().SelLineFromBox( pBox, aBoxes );
        pTableNode->GetTable().MakeCopy( pDoc, *pPam->GetPoint(),
                                        aBoxes, FALSE );
        ULONG nNd = pPam->GetPoint()->nNode.GetIndex()-1;
        pTableNode = pDoc->GetNodes()[ nNd ]->FindTableNode();
        pOldTblNd = pTableNode;

        pLns = &pTableNode->GetTable().GetTabLines();
    }
    else
//      pDoc->InsertRow( aBoxes );
        pTableNode->GetTable().AppendRow( pDoc );

    pBox = (*pLns)[ pLns->Count()-1 ]->GetTabBoxes()[0];

    ULONG nOldPos = pPam->GetPoint()->nNode.GetIndex();
    pPam->GetPoint()->nNode = *pBox->GetSttNd();
    pPam->Move( fnMoveForward );
    nAktBox = 0;

    // alle Nodes in den Boxen auf die "default" Vorlage setzten
    {
        SwTxtFmtColl* pColl = aTxtCollTbl.Get( 0 );
        if( !pColl )
            pColl = pDoc->GetTxtCollFromPool( RES_POOLCOLL_STANDARD );
        pPam->SetMark();

        pLine = (*pLns)[ pLns->Count()-1 ];
        pBox = pLine->GetTabBoxes()[ pLine->GetTabBoxes().Count() -1 ];
        pPam->GetPoint()->nNode = *pBox->GetSttNd()->EndOfSectionNode();
        pPam->Move( fnMoveBackward );
        pDoc->SetTxtFmtColl( *pPam, pColl );
        // Bug 73940 - remove ALL attributes (NumRules/Break/etc.)
        {
            SwNodeIndex aIdx( pPam->GetMark()->nNode );
            SwNodeIndex& rEndIdx = pPam->GetPoint()->nNode;
            while( aIdx <= rEndIdx )
            {
                SwCntntNode* pCNd = aIdx.GetNode().GetCntntNode();
                if( pCNd && pCNd->GetpSwAttrSet() )
                    pCNd->ResetAllAttr();
                aIdx++;
            }
        }
        pPam->Exchange();
        pPam->DeleteMark();
    }

    // alle Attribute, die schon auf den nachfolgen zeigen auf die neue
    // Box umsetzen !!
    SvxRTFItemStack& rAttrStk = GetAttrStack();
    const SvxRTFItemStackType* pStk;
    for( USHORT n = 0; n < rAttrStk.Count(); ++n )
        if( ( pStk = rAttrStk[ n ])->GetSttNodeIdx() == ULONG(nOldPos) &&
            !pStk->GetSttCnt() )
            ((SvxRTFItemStackType*)pStk)->SetStartPos( SwxPosition( pPam ) );
}

void SwRTFParser::CheckInsNewTblLine()
{
    if( USHRT_MAX != nInsTblRow )
    {
        if( nInsTblRow > GetOpenBrakets() || IsPardTokenRead() )
            nInsTblRow = USHRT_MAX;
        else if( !pTableNode )      // Tabelle nicht mehr vorhanden ?
            NewTblLine();           // evt. Line copieren
    }
}

/*************************************************************************

      $Log: not supported by cvs2svn $
      Revision 1.64  2000/09/18 16:04:51  willem.vandorp
      OpenOffice header added.

      Revision 1.63  2000/05/09 17:22:57  jp
      Changes for Unicode

      Revision 1.62  2000/03/15 18:22:45  jp
      Bug #73972#: ReadTable - set distance on the borderlines

      Revision 1.61  2000/03/14 09:55:41  jp
      Bug #73940#: NewTableLine - remove all attributes after copying the row

      Revision 1.60  2000/02/17 13:46:58  jp
      Bug #73098#: Import / Export problems

      Revision 1.59  1999/09/09 17:46:33  jp
      Bug #68573#: InsertTable - dont insert paragraph at start doc

      Revision 1.58  1999/08/11 14:52:54  JP
      Bug #68058#: read/write repeated tableheadlines


      Rev 1.57   11 Aug 1999 16:52:54   JP
   Bug #68058#: read/write repeated tableheadlines

      Rev 1.56   09 Aug 1999 14:34:04   JP
   Bug #68058#: read/write repeated tableheadlines

      Rev 1.55   05 Aug 1999 22:52:38   JP
   Bug #68095#: save tablefmt for optimize the tableborders

      Rev 1.54   03 Aug 1999 19:51:12   JP
   Bug #67984#: read trleft token

      Rev 1.53   22 Jul 1999 19:59:40   JP
   Bug #54824#: read&write tableposition 'from left'

      Rev 1.52   21 Apr 1999 13:31:20   JP
   Bug #65126#: kein VertTop bei Tabellenzellen setzen

      Rev 1.51   01 Apr 1999 16:46:12   JP
   Bug #64291#: Tabellenhoehe lesen/schreiben

      Rev 1.50   29 Mar 1999 16:28:20   JP
   Bug #62847#: Parameter vom DeleteBox haben sich geaendert

      Rev 1.49   11 Feb 1999 23:43:50   JP
   Bug #55590#: Schnittstelle geaendert

      Rev 1.48   18 Dec 1998 18:02:38   JP
   #59571#: Teilfix - Tabelle splitten, wenn die SortBoxes > 64000

      Rev 1.47   15 Dec 1998 17:49:22   JP
   #59571#: Teilfix - statt InsertRow am Doc das neue AppendRow an der Tabelle benutzen

      Rev 1.46   13 Aug 1998 10:33:24   JP
   Bug #53525#: Tabellen - an den Kanten keine doppelte Umrandung mehr

      Rev 1.45   27 May 1998 22:27:10   JP
   Tokens fuer vertikale Ausrichtung in den Boxen beachten

      Rev 1.44   16 Mar 1998 23:21:40   JP
   SplitTable hat neuen Parameter bekommen

      Rev 1.43   20 Feb 1998 13:36:34   MA
   headerfiles gewandert

      Rev 1.42   04 Feb 1998 09:18:10   JP
   DelFrmFmt: bei TabellenBoxen/Lines direkt das FrmFmt loeschen

      Rev 1.41   26 Nov 1997 15:05:34   MA
   headerfiles

      Rev 1.40   25 Nov 1997 15:11:30   JP
   Headerfiles

      Rev 1.39   03 Nov 1997 14:10:34   MA
   precomp entfernt

      Rev 1.38   29 Oct 1997 13:37:50   JP
   Bug #45159#: PageDesc/-Break wird vom InsertTable schon uebernommen

      Rev 1.37   09 Oct 1997 14:27:50   JP
   Umstellung NodeIndex/-Array/BigPtrArray

      Rev 1.36   15 Aug 1997 12:51:50   OS
   charatr/frmatr/txtatr aufgeteilt

      Rev 1.35   11 Aug 1997 17:48:48   OS
   Header-Umstellung

      Rev 1.34   07 Aug 1997 15:06:40   OM
   Headerfile-Umstellung

      Rev 1.33   27 Jun 1997 11:34:36   JP
   Bug #40723#: erst pard oder neue Ebene nach einem row hebt die Tabelle auf

      Rev 1.32   09 Jun 1997 11:22:30   NF
   lcl_DeleteBox richtig als extern declariert

      Rev 1.31   06 Jun 1997 13:25:52   JP
   lcl_DeleteBox: weiterer Parameter

      Rev 1.30   06 May 1997 12:07:14   MA
   swtablehxx aufgeteilt

      Rev 1.29   17 Apr 1997 15:17:10   JP
   segmentc entfernt

      Rev 1.28   17 Apr 1997 15:15:56   JP
   Bug #38923#: beim einfuegen von Zellen, kann die erste eine gemergt sein

      Rev 1.27   20 Jan 1997 19:21:46   JP
   neu: SwTableFmt/-LineFmt/-BoxFmt statt SwFrmFmt

      Rev 1.26   14 Jan 1997 18:41:40   JP
   Tabelle: Umbrueche im Tabellenformat beachten

      Rev 1.25   20 Dec 1996 19:37:36   JP
   Bug #34702#: Tabellentokens hier auswerten, auch unbekannte!

      Rev 1.24   02 Dec 1996 14:51:28   TRI
   bei WTC ist private jetzt public

      Rev 1.23   29 Oct 1996 12:58:48   JP
   am Doc ist das NodesArray nur noch ueber Get..() zugaenglich

      Rev 1.22   18 Sep 1996 13:47:06   JP
   extern Deklaration zum DeleteBox geaendert

      Rev 1.21   20 Aug 1996 14:57:44   TRI
   C40_INSERT statt Insert

      Rev 1.20   22 Jul 1996 11:53:46   JP
   Bug #27445#: Attribute zwischen TabellenDef und ZellenDef erkennen

      Rev 1.19   04 Jul 1996 15:01:56   JP
   Tabellen einlesen korrigiert

      Rev 1.18   28 Jun 1996 15:07:32   MA
   includes

      Rev 1.17   19 Jun 1996 09:38:30   JP
   Tabellen bekommen beim Insert schon einen eindeutigen Namen

      Rev 1.16   25 Apr 1996 13:56:42   MIB
   Verschiebung SvHTMLParser in Gooedies

      Rev 1.15   15 Jan 1996 13:01:22   JP
   Bug #24234#: Tabellen bekommen einen eindeutigen Namen

      Rev 1.14   09 Jan 1996 11:53:48   JP
   Bug 23680: ReadTable - TabelleInTabelle immer abpruefen

      Rev 1.13   13 Dec 1995 10:35:50   MA
   opt: Bessere Defaults fuer Arrays

      Rev 1.12   24 Nov 1995 17:24:04   OM
   PCH->PRECOMPILED

      Rev 1.11   30 Oct 1995 21:18:56   JP
   intbl refernziert auch vorher eingelesene Tabellen

      Rev 1.10   21 Aug 1995 21:30:36   JP
   svxitems-HeaderFile entfernt

      Rev 1.9   27 Jul 1995 09:28:24   mk
   an SCC4.0.1a angepasst (MDA)

      Rev 1.8   20 Jun 1995 16:49:10   MA
   SwFmtBreak -> SvxFmtBreakItem

      Rev 1.7   30 May 1995 08:19:54   SWG
   forward fuer svtool.hxx!!!

      Rev 1.6   03 Apr 1995 20:51:42   JP
   fuer PreComp.Header eingerichtet

      Rev 1.5   08 Feb 1995 09:43:08   JP
   alten RTF-Parser entfernt, Sw_RTF -> SwRTF

      Rev 1.4   02 Feb 1995 18:38:14   JP
   Tabelle: fuege Boxen auch einzeln ein

      Rev 1.3   27 Jan 1995 08:15:50   JP
   sBoxFmtNm kommt jetzt aus Table-Header

      Rev 1.2   15 Jan 1995 20:34:38   JP
   verhinder Tabelle in Tabelle/Fussnote

      Rev 1.1   11 Jan 1995 19:36:28   JP
   RTF-Reader fertiggestellt

      Rev 1.0   06 Jan 1995 12:07:42   JP
   Initial revision.

*************************************************************************/


diff --git a/sw/source/filter/rtf/swparrtf.cxx b/sw/source/filter/rtf/swparrtf.cxx
new file mode 100644
index 0000000..b595912
--- /dev/null
+++ b/sw/source/filter/rtf/swparrtf.cxx
@@ -0,0 +1,3818 @@
/*************************************************************************
 *
 *  $RCSfile: swparrtf.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:56 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif


#ifndef _TOOLS_TEMPFILE_HXX
#include <tools/tempfile.hxx>
#endif
#ifndef __RSC //autogen
#include <tools/errinf.hxx>
#endif
#ifndef _STREAM_HXX //autogen
#include <tools/stream.hxx>
#endif
#ifndef _SFXITEMITER_HXX //autogen
#include <svtools/itemiter.hxx>
#endif
#ifndef _RTFTOKEN_H
#include <svtools/rtftoken.h>
#endif
#ifndef _SFXINTITEM_HXX //autogen
#include <svtools/intitem.hxx>
#endif
#ifndef _TEXTCONV_HXX //autogen
#include <svx/textconv.hxx>
#endif
#ifndef _SVX_FHGTITEM_HXX //autogen
#include <svx/fhgtitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _SVX_BRKITEM_HXX //autogen
#include <svx/brkitem.hxx>
#endif
#ifndef _SVX_TSTPITEM_HXX //autogen
#include <svx/tstpitem.hxx>
#endif
#ifndef _SVX_LSPCITEM_HXX //autogen
#include <svx/lspcitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_ESCPITEM_HXX //autogen
#include <svx/escpitem.hxx>
#endif
#ifndef _SVX_FONTITEM_HXX //autogen
#include <svx/fontitem.hxx>
#endif

#ifndef _FMTPDSC_HXX //autogen
#include <fmtpdsc.hxx>
#endif
#ifndef _FMTFLD_HXX //autogen
#include <fmtfld.hxx>
#endif
#ifndef _FMTHBSH_HXX //autogen
#include <fmthbsh.hxx>
#endif
#ifndef _FMTHDFT_HXX //autogen
#include <fmthdft.hxx>
#endif
#ifndef _FMTCNTNT_HXX //autogen
#include <fmtcntnt.hxx>
#endif
#ifndef _TXTFTN_HXX //autogen
#include <txtftn.hxx>
#endif
#ifndef _FMTCLDS_HXX //autogen
#include <fmtclds.hxx>
#endif
#ifndef _FMTFTN_HXX //autogen
#include <fmtftn.hxx>
#endif
#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _FMTFLCNT_HXX //autogen
#include <fmtflcnt.hxx>
#endif
#ifndef _FMTANCHR_HXX //autogen
#include <fmtanchr.hxx>
#endif
#ifndef _FRMATR_HXX
#include <frmatr.hxx>
#endif
#ifndef _DOCSTAT_HXX //autogen
#include <docstat.hxx>
#endif
#ifndef _SWTABLE_HXX
#include <swtable.hxx>
#endif
#ifndef _SHELLIO_HXX
#include <shellio.hxx>
#endif
#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _NDTXT_HXX
#include <ndtxt.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _DOCARY_HXX
#include <docary.hxx>
#endif
#ifndef _PAM_HXX
#include <pam.hxx>
#endif
#ifndef _MDIEXP_HXX
#include <mdiexp.hxx>           // ...Percent()
#endif
#ifndef _SWPARRTF_HXX
#include <swparrtf.hxx>
#endif
#ifndef _FMTCOL_HXX
#include <fmtcol.hxx>
#endif
#ifndef _CHARFMT_HXX
#include <charfmt.hxx>
#endif
#ifndef _PAGEDESC_HXX
#include <pagedesc.hxx>
#endif
#ifndef _POOLFMT_HXX
#include <poolfmt.hxx>
#endif
#ifndef _NUMRULE_HXX
#include <numrule.hxx>
#endif
#ifndef _FTNINFO_HXX
#include <ftninfo.hxx>
#endif
#ifndef _DOCUFLD_HXX
#include <docufld.hxx>
#endif
#ifndef _FLDDAT_HXX
#include <flddat.hxx>
#endif
#ifndef _FLTINI_HXX
#include <fltini.hxx>
#endif
#ifndef _FCHRFMT_HXX
#include <fchrfmt.hxx>
#endif
#ifndef _PARATR_HXX
#include <paratr.hxx>
#endif
#ifndef _SECTIOM_HXX
#include <section.hxx>
#endif
#ifndef _FMTCLBL_HXX
#include <fmtclbl.hxx>
#endif

#ifndef _SWSWERROR_H
#include <swerror.h>
#endif
#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _STATSTR_HRC
#include <statstr.hrc>          // ResId fuer Statusleiste
#endif


// einige Hilfs-Funktionen
// char
inline const SvxFontHeightItem& GetSize(const SfxItemSet& rSet,BOOL bInP=TRUE)
    { return (const SvxFontHeightItem&)rSet.Get( RES_CHRATR_FONTSIZE,bInP); }
inline const SvxLRSpaceItem& GetLRSpace(const SfxItemSet& rSet,BOOL bInP=TRUE)
    { return (const SvxLRSpaceItem&)rSet.Get( RES_LR_SPACE,bInP); }


/*  */
#ifdef DEBUG_JP

static void OutStyle( const SwPaM& rPam, const SwTxtFmtColl& rColl );
static void OutSet( const SwPaM& rPam, const SfxItemSet& rSet );
static void OutText( const SwPaM& rPam, const sal_Char* pText );
static void DumpStart();
static void DumpEnde();

#define DUMP_INIT                   DumpStart();
#define DUMP_FINIT                  DumpEnde();
#define DUMP_SET( pam, set )        OutSet( pam, set );
#define DUMP_STYLE( pam, ss )       OutStyle( pam, ss );
#define DUMP_TXT( pam, txt )        OutText( pam, txt );

#else

#define DUMP_INIT
#define DUMP_FINIT
#define DUMP_SET( pam, set )
#define DUMP_STYLE( pam, ss )
#define DUMP_TXT( pam, txt )

#endif

/*  */

// Aufruf fuer die allg. Reader-Schnittstelle
ULONG RtfReader::Read( SwDoc &rDoc,SwPaM &rPam, const String &)
{
    if( !pStrm )
    {
        ASSERT( FALSE, "RTF-Read ohne Stream" );
        return ERR_SWG_READ_ERROR;
    }

    //JP 18.01.96: Alle Ueberschriften sind normalerweise ohne
    //              Kapitelnummer. Darum hier explizit abschalten
    //              weil das Default jetzt wieder auf AN ist.
    if( !bInsertMode )
    {
        Reader::SetNoOutlineNum( rDoc );

        // MIB 27.09.96: Umrandung uns Abstaende aus Frm-Vorlagen entf.
        Reader::ResetFrmFmts( rDoc );
    }

    ULONG nRet = 0;
    SvParserRef xParser = new SwRTFParser( &rDoc, rPam, *pStrm,!bInsertMode );
    SvParserState eState = xParser->CallParser();
    if( SVPAR_PENDING != eState && SVPAR_ACCEPTED != eState )
    {
        String sErr( String::CreateFromInt32( xParser->GetLineNr() ));
        sErr += ',';
        sErr += String::CreateFromInt32( xParser->GetLinePos() );

        nRet = *new StringErrorInfo( ERR_FORMAT_ROWCOL, sErr,
                                    ERRCODE_BUTTON_OK | ERRCODE_MSG_ERROR );
    }
    return nRet;
}

SwRTFParser::SwRTFParser( SwDoc* pD, const SwPaM& rCrsr, SvStream& rIn,
                        int bReadNewDoc )
    : SvxRTFParser( pD->GetAttrPool(), rIn, bReadNewDoc ),
    pDoc( pD ),
    pTableNode( 0 ), pOldTblNd( 0 ), nAktBox( 0 ), nNewNumSectDef( USHRT_MAX ),
    nAktPageDesc( 0 ), nAktFirstPageDesc( 0 ),
    pGrfAttrSet( 0 ),
    aMergeBoxes( 0, 5 ),
    nInsTblRow( USHRT_MAX ),
    pSttNdIdx( 0 ),
    pRegionEndIdx( 0 ),
    pRelNumRule( new SwRelNumRuleSpaces( *pD, bReadNewDoc )),
    aTblFmts( 0, 10 )
{
    bReadNoTbl = bReadSwFly = bSwPageDesc = bStyleTabValid =
    bInPgDscTbl = bNewNumList = FALSE;
    bFirstContinue = bFirstDocControl = TRUE;

    pPam = new SwPaM( *rCrsr.GetPoint() );
    SetInsPos( SwxPosition( pPam ) );
    SetChkStyleAttr( TRUE );
    SetCalcValue( FALSE );
    SetReadDocInfo( TRUE );

    // diese sollen zusaetzlich ueber \pard zurueck gesetzt werden
    USHORT temp;
    temp = RES_TXTATR_CHARFMT;      AddPlainAttr( temp );
    temp = RES_PAGEDESC;            AddPardAttr( temp );
    temp = RES_BREAK;               AddPardAttr( temp );
    temp = RES_PARATR_NUMRULE;      AddPardAttr( temp );
    temp = FN_PARAM_NUM_LEVEL;          AddPardAttr( temp );

    DUMP_INIT
}

// Aufruf des Parsers
SvParserState SwRTFParser::CallParser()
{
    bReadNoTbl = FALSE;
    bFirstContinue = TRUE;

    rInput.Seek(STREAM_SEEK_TO_BEGIN);
    rInput.ResetError();

    return SvxRTFParser::CallParser();
}


void SwRTFParser::Continue( int nToken )
{
    if( bFirstContinue )
    {
        bFirstContinue = FALSE;

        // einen temporaeren Index anlegen, auf Pos 0 so wird er nicht bewegt!
        pSttNdIdx = new SwNodeIndex( pDoc->GetNodes() );
        if( !IsNewDoc() )       // in ein Dokument einfuegen ?
        {
            const SwPosition* pPos = pPam->GetPoint();
            SwTxtNode* pSttNd = pPos->nNode.GetNode().GetTxtNode();

            pDoc->SplitNode( *pPos );

            *pSttNdIdx = pPos->nNode.GetIndex()-1;
            pDoc->SplitNode( *pPos );

            pPam->Move( fnMoveBackward );
            pDoc->SetTxtFmtColl( *pPam, pDoc->GetTxtCollFromPool( RES_POOLCOLL_STANDARD ));

            // verhinder das einlesen von Tabellen in Fussnoten / Tabellen
            ULONG nNd = pPos->nNode.GetIndex();
            bReadNoTbl = 0 != pSttNd->FindTableNode() ||
                        ( nNd < pDoc->GetNodes().GetEndOfInserts().GetIndex() &&
                        pDoc->GetNodes().GetEndOfInserts().StartOfSectionIndex() < nNd );
        }

        // Laufbalken anzeigen, aber nur bei synchronem Call
        ULONG nCurrPos = rInput.Tell();
        rInput.Seek(STREAM_SEEK_TO_END);
        rInput.ResetError();
        ::StartProgress( STR_STATSTR_W4WREAD, 0, rInput.Tell(), pDoc->GetDocShell());
        rInput.Seek( nCurrPos );
        rInput.ResetError();
    }

    SvxRTFParser::Continue( nToken );

    if( SVPAR_PENDING == GetStatus() )
        return ;                // weiter gehts beim naechsten mal

    // Laufbalken bei asynchronen Call nicht einschalten !!!
    ::EndProgress( pDoc->GetDocShell() );

#ifdef DEBUG_JP
{
extern Writer* GetDebugWriter(const String&);
        Writer* pWriter = GetDebugWriter(aEmptyStr);
        if( pWriter )
        {
            SwWriter( SvFileStream( "f:\\tmp\\$$rtf_1.db", STREAM_WRITE ),
                        *pDoc ).Write( pWriter );
        }
}
#endif


    {
        // JP 13.08.98: TabellenUmrandungen optimieren - Bug 53525
        for( USHORT n = aTblFmts.Count(); n; )
        {
            SwTable* pTbl = SwTable::FindTable( (SwFrmFmt*)aTblFmts[ --n ] );
            if( pTbl )
                pTbl->GCBorderLines();
        }
    }

    pRelNumRule->SetNumRelSpaces( *pDoc );

    // den Start wieder korrigieren
    if( !IsNewDoc() && pSttNdIdx->GetIndex() )
    {
        //die Flys muessen zuerst zurecht gerueckt werden, denn sonst wird
        // ein am 1. Absatz verankerter Fly falsch eingefuegt
        if( SVPAR_ACCEPTED == eState )
        {
            if( aFlyArr.Count() )
                SetFlysInDoc();
            pRelNumRule->SetOultineRelSpaces( *pSttNdIdx, pPam->GetPoint()->nNode );
        }

        SwTxtNode* pTxtNode = pSttNdIdx->GetNode().GetTxtNode();
        SwNodeIndex aNxtIdx( *pSttNdIdx );
        if( pTxtNode && pTxtNode->CanJoinNext( &aNxtIdx ))
        {
            xub_StrLen nStt = pTxtNode->GetTxt().Len();
            // wenn der Cursor noch in dem Node steht, dann setze in an das Ende
            if( pPam->GetPoint()->nNode == aNxtIdx )
            {
                pPam->GetPoint()->nNode = *pSttNdIdx;
                pPam->GetPoint()->nContent.Assign( pTxtNode, nStt );
            }

#ifndef PRODUCT
// !!! sollte nicht moeglich sein, oder ??
ASSERT( pSttNdIdx->GetIndex()+1 != pPam->GetBound( TRUE ).nNode.GetIndex(),
            "Pam.Bound1 steht noch im Node" );
ASSERT( pSttNdIdx->GetIndex()+1 != pPam->GetBound( FALSE ).nNode.GetIndex(),
            "Pam.Bound2 steht noch im Node" );

if( pSttNdIdx->GetIndex()+1 == pPam->GetBound( TRUE ).nNode.GetIndex() )
{
    register xub_StrLen nCntPos = pPam->GetBound( TRUE ).nContent.GetIndex();
    pPam->GetBound( TRUE ).nContent.Assign( pTxtNode,
                    pTxtNode->GetTxt().Len() + nCntPos );
}
if( pSttNdIdx->GetIndex()+1 == pPam->GetBound( FALSE ).nNode.GetIndex() )
{
    register xub_StrLen nCntPos = pPam->GetBound( FALSE ).nContent.GetIndex();
    pPam->GetBound( FALSE ).nContent.Assign( pTxtNode,
                    pTxtNode->GetTxt().Len() + nCntPos );
}
#endif
            // Zeichen Attribute beibehalten!
            SwTxtNode* pDelNd = aNxtIdx.GetNode().GetTxtNode();
            if( pTxtNode->GetTxt().Len() )
                pDelNd->FmtToTxtAttr( pTxtNode );
            else
                pTxtNode->ChgFmtColl( pDelNd->GetTxtColl() );
            pTxtNode->JoinNext();
        }
    }

    if( SVPAR_ACCEPTED == eState )
    {
        // den letzen Bereich wieder zumachen
        if( pRegionEndIdx )
        {
            // JP 06.01.00: Task 71411 - the last section in WW are not a
            //              balanced Section.
            if( !GetVersionNo() )
            {
                SwSectionNode* pSectNd = pRegionEndIdx->GetNode().
                                    FindStartNode()->GetSectionNode();
                if( pSectNd )
                    pSectNd->GetSection().GetFmt()->SetAttr(
                                    SwFmtNoBalancedColumns( TRUE ) );
            }

            DelLastNode();
            pPam->GetPoint()->nNode = *pRegionEndIdx;
            pPam->Move( fnMoveForward, fnGoNode );
            delete pRegionEndIdx, pRegionEndIdx = 0;
        }

        if( aFlyArr.Count() )
            SetFlysInDoc();

        // jetzt noch den letzten ueberfluessigen Absatz loeschen
        SwPosition* pPos = pPam->GetPoint();
        if( !pPos->nContent.GetIndex() )
        {
            SwTxtNode* pAktNd;
            ULONG nNodeIdx = pPos->nNode.GetIndex();
            if( IsNewDoc() )
            {
                SwNode* pTmp = pDoc->GetNodes()[ nNodeIdx -1 ];
                if( pTmp->IsCntntNode() && !pTmp->FindTableNode() )
                    DelLastNode();
            }
            else if( 0 != ( pAktNd = pDoc->GetNodes()[ nNodeIdx ]->GetTxtNode()) )
            {
                if( pAktNd->CanJoinNext( &pPos->nNode ))
                {
                    SwTxtNode* pNextNd = pPos->nNode.GetNode().GetTxtNode();
                    pPos->nContent.Assign( pNextNd, 0 );
                    pPam->SetMark(); pPam->DeleteMark();
                    pNextNd->JoinPrev();
                }
                else if( !pAktNd->GetTxt().Len() &&
                        pAktNd->StartOfSectionIndex()+2 <
                        pAktNd->EndOfSectionIndex() )
                {
                    pPos->nContent.Assign( 0, 0 );
                    pPam->SetMark(); pPam->DeleteMark();
                    pDoc->GetNodes().Delete( pPos->nNode, 1 );
                    pPam->Move( fnMoveBackward );
                }
            }
        }

        // nun noch das SplitNode vom Ende aufheben
        else if( !IsNewDoc() )
        {
            if( pPos->nContent.GetIndex() )     // dann gabs am Ende kein \par,
                pPam->Move( fnMoveForward, fnGoNode );  // als zum naechsten Node
            SwTxtNode* pTxtNode = pPos->nNode.GetNode().GetTxtNode();
            SwNodeIndex aPrvIdx( pPos->nNode );
            if( pTxtNode && pTxtNode->CanJoinPrev( &aPrvIdx ) &&
                *pSttNdIdx <= aPrvIdx )
            {
                // eigentlich muss hier ein JoinNext erfolgen, aber alle Cursor
                // usw. sind im pTxtNode angemeldet, so dass der bestehen
                // bleiben MUSS.

                // Absatz in Zeichen-Attribute umwandeln, aus dem Prev die
                // Absatzattribute und die Vorlage uebernehmen!
                SwTxtNode* pPrev = aPrvIdx.GetNode().GetTxtNode();
                pTxtNode->ChgFmtColl( pPrev->GetTxtColl() );
                pTxtNode->FmtToTxtAttr( pPrev );
                pTxtNode->SwCntntNode::ResetAllAttr();

                if( pPrev->GetpSwAttrSet() )
                    pTxtNode->SwCntntNode::SetAttr( *pPrev->GetpSwAttrSet() );

                if( &pPam->GetBound(TRUE).nNode.GetNode() == pPrev )
                    pPam->GetBound(TRUE).nContent.Assign( pTxtNode, 0 );
                if( &pPam->GetBound(FALSE).nNode.GetNode() == pPrev )
                    pPam->GetBound(FALSE).nContent.Assign( pTxtNode, 0 );

                pTxtNode->JoinPrev();
            }
        }
        else if( GetDocInfo() )
            // evt. eingelesen DocInfo setzen
            pDoc->SetInfo( *GetDocInfo() );
    }
    delete pSttNdIdx, pSttNdIdx = 0;
    delete pRegionEndIdx, pRegionEndIdx = 0;
    RemoveUnusedNumRules();
}

SwRTFParser::~SwRTFParser()
{
    delete pSttNdIdx;
    delete pRegionEndIdx;
    delete pPam;
    delete pRelNumRule;

    if( aFlyArr.Count() )
        aFlyArr.DeleteAndDestroy( 0, aFlyArr.Count() );

    if( pGrfAttrSet )   DELETEZ( pGrfAttrSet );
    DUMP_FINIT
}

extern void sw3io_ConvertFromOldField( SwDoc& rDoc, USHORT& rWhich,
                                USHORT& rSubType, ULONG &rFmt,
                                USHORT nVersion );

void SwRTFParser::NextToken( int nToken )
{
    USHORT eDateFmt;

    switch( nToken )
    {
    case RTF_FOOTNOTE:      ReadHeaderFooter( nToken );
                            SkipToken( -1 );        // Klammer wieder zurueck
                            break;
    case RTF_SWG_PRTDATA:           ReadPrtData();              break;
    case RTF_FIELD:                 ReadField();                break;
    case RTF_PICT:                  ReadBitmapData();           break;
#ifdef READ_OLE_OBJECT
    case RTF_OBJECT:                ReadOLEData();              break;
#endif
    case RTF_TROWD:                 ReadTable( nToken );        break;
    case RTF_PGDSCTBL:              ReadPageDescTbl();          break;
    case RTF_LISTTABLE:             ReadListTable();            break;
    case RTF_LISTOVERRIDETABLE:     ReadListOverrideTable();    break;

    case RTF_LISTTEXT:
        GetAttrSet().Put( SfxUInt16Item( FN_PARAM_NUM_LEVEL, 0 ));
        SkipGroup();
        break;

    case RTF_PN:
    case RTF_PNSECLVL:
        if( bNewNumList )
            SkipGroup();
        else
            ReadNumSecLevel( nToken );
        break;

    case RTF_PNTEXT:
        SkipGroup();
        break;

    case RTF_OUTLINELEVEL:
        {
            BYTE nLevel = MAXLEVEL <= nTokenValue ? MAXLEVEL - 1
                                                  : BYTE( nTokenValue );
            GetAttrSet().Put( SfxUInt16Item( FN_PARAM_NUM_LEVEL, nLevel ));
        }
        break;

    case RTF_DEFFORMAT:
    case RTF_DEFTAB:
    case RTF_DEFLANG:
        // sind zwar Dok-Controls, werden aber manchmal auch vor der
        // Font/Style/Color-Tabelle gesetzt!
        SvxRTFParser::NextToken( nToken );
        break;

    case RTF_PAGE:
        {
            const SwCntntNode* pCNd;
            const SwAttrSet* pSet;
            if( pPam->GetPoint()->nContent.GetIndex() ||
                ( 0 != ( pCNd = pPam->GetCntntNode()) &&
                  0 != ( pSet = pCNd->GetpSwAttrSet()) &&
                 ( SFX_ITEM_SET == pSet->GetItemState( RES_BREAK, FALSE ) ||
                   SFX_ITEM_SET == pSet->GetItemState( RES_PAGEDESC, FALSE ))))
                InsertPara();
            CheckInsNewTblLine();
            pDoc->Insert( *pPam, SvxFmtBreakItem( SVX_BREAK_PAGE_BEFORE ) );
        }
        break;

    case RTF_SECT:
        ReadSectControls( nToken );
        break;
    case RTF_CELL:
        if( bReadNoTbl )
            InsertPara();
        else
        {
            if( USHRT_MAX != nInsTblRow && !pTableNode )    // Tabelle nicht mehr vorhanden ?
                NewTblLine();               // evt. Line copieren
            GotoNextBox();
        }
        break;

    case RTF_ROW:
        if( !bReadNoTbl )
        {
            // aus der Line raus
            nAktBox = 0;
            pTableNode = 0;
            // noch in der Tabelle drin?
            SwNodeIndex& rIdx = pPam->GetPoint()->nNode;
            const SwTableNode* pTblNd = rIdx.GetNode().FindTableNode();
            if( pTblNd )
            {
                // search the end of this row
                const SwStartNode* pBoxStt =
                                    rIdx.GetNode().FindTableBoxStartNode();
                const SwTableBox* pBox = pTblNd->GetTable().GetTblBox(
                                                pBoxStt->GetIndex() );
                const SwTableLine* pLn = pBox->GetUpper();
                pBox = pLn->GetTabBoxes()[ pLn->GetTabBoxes().Count() - 1 ];
                rIdx = *pBox->GetSttNd()->EndOfSectionNode();
                pPam->Move( fnMoveForward, fnGoNode );
            }
            nInsTblRow = GetOpenBrakets();
            SetPardTokenRead( FALSE );
        }
        ::SetProgressState( rInput.Tell(), pDoc->GetDocShell() );
        break;

    case RTF_INTBL:
        if( !bReadNoTbl )
        {
            if( !pTableNode )           // Tabelle nicht mehr vorhanden ?
                NewTblLine();           // evt. Line copieren
            else
            {
                // Crsr nicht mehr in der Tabelle ?
                if( !pPam->GetNode()->FindTableNode() )
                {
                    // dann wieder in die letzte Box setzen
                    // (kann durch einlesen von Flys geschehen!)
                    pPam->GetPoint()->nNode = *pTableNode->EndOfSectionNode();
                    pPam->Move( fnMoveBackward );
                }
            }
        }
        break;

    case RTF_FLY_INPARA:
            // \pard  und plain ueberlesen !
        if( '}' != GetNextToken() && '}' != GetNextToken() )
        {
            // Zeichengebundener Fly in Fly
            ReadHeaderFooter( nToken );
            SetPardTokenRead( FALSE );
        }
        break;

    case RTF_PGDSCNO:
        if( IsNewDoc() && bSwPageDesc &&
            USHORT(nTokenValue) < pDoc->GetPageDescCnt() )
        {
            const SwPageDesc* pPgDsc = &pDoc->GetPageDesc( USHORT(nTokenValue) );
            CheckInsNewTblLine();
            pDoc->Insert( *pPam, SwFmtPageDesc( pPgDsc ));
        }
        break;

    case RTF_COLUM:
        pDoc->Insert( *pPam, SvxFmtBreakItem( SVX_BREAK_COLUMN_BEFORE ));
        break;

    case RTF_DXFRTEXT:      // werden nur im Zusammenhang mit Flys ausgewertet
    case RTF_DFRMTXTX:
    case RTF_DFRMTXTY:
        break;

    case RTF_CHDATE:    eDateFmt = DF_SHORT;    goto SETCHDATEFIELD;
    case RTF_CHDATEA:   eDateFmt = DF_SSYS;     goto SETCHDATEFIELD;
    case RTF_CHDATEL:   eDateFmt = DF_LSYS;     goto SETCHDATEFIELD;
SETCHDATEFIELD:
        {
            USHORT nSubType = DATEFLD, nWhich = RES_DATEFLD;
            ULONG nFormat = eDateFmt;
            sw3io_ConvertFromOldField( *pDoc, nWhich, nSubType, nFormat, 0x0110 );

            SwDateTimeField aDateFld( (SwDateTimeFieldType*)
                                        pDoc->GetSysFldType( RES_DATETIMEFLD ), DATEFLD, nFormat);
            CheckInsNewTblLine();
            pDoc->Insert( *pPam, SwFmtFld( aDateFld ));
        }
        break;

    case RTF_CHTIME:
        {
            USHORT nSubType = TIMEFLD, nWhich = RES_TIMEFLD;
            ULONG nFormat = TF_SSMM_24;
            sw3io_ConvertFromOldField( *pDoc, nWhich, nSubType, nFormat, 0x0110 );
            SwDateTimeField aTimeFld( (SwDateTimeFieldType*)
                    pDoc->GetSysFldType( RES_DATETIMEFLD ), TIMEFLD, nFormat);
            CheckInsNewTblLine();
            pDoc->Insert( *pPam, SwFmtFld( aTimeFld ));
        }
        break;

    case RTF_CHPGN:
        {
            SwPageNumberField aPageFld( (SwPageNumberFieldType*)
                                    pDoc->GetSysFldType( RES_PAGENUMBERFLD ),
                                    PG_RANDOM, SVX_NUM_ARABIC );
            CheckInsNewTblLine();
            pDoc->Insert( *pPam, SwFmtFld( aPageFld));
        }
        break;

    case RTF_CHFTN:
        bFootnoteAutoNum = TRUE;
        break;

    case RTF_NOFPAGES:
        if( IsNewDoc() && nTokenValue && -1 != nTokenValue )
            ((SwDocStat&)pDoc->GetDocStat()).nPage = (USHORT)nTokenValue;
        break;

    case RTF_NOFWORDS:
        if( IsNewDoc() && nTokenValue && -1 != nTokenValue )
            ((SwDocStat&)pDoc->GetDocStat()).nWord = (USHORT)nTokenValue;
        break;
    case RTF_NOFCHARS:
        if( IsNewDoc() && nTokenValue && -1 != nTokenValue )
            ((SwDocStat&)pDoc->GetDocStat()).nChar = (USHORT)nTokenValue;
        break;

    case RTF_U:
        {
            CheckInsNewTblLine();
            if( nTokenValue )
                aToken = (sal_Unicode )nTokenValue;
            pDoc->Insert( *pPam, aToken );
        }
        break;

//  case RTF_REVDTTM:
//      UnknownAttrToken( nToken, &GetAttrSet() );
//      break;


// RTF_SUBENTRYINDEX

    default:
        switch( nToken & ~(0xff | RTF_SWGDEFS) )
        {
        case RTF_DOCFMT:
            ReadDocControls( nToken );
            break;
        case RTF_SECTFMT:
            ReadSectControls( nToken );
            break;
        case RTF_APOCTL:
            ReadFly( nToken );
            break;
        case RTF_BRDRDEF | RTF_TABLEDEF:
        case RTF_SHADINGDEF | RTF_TABLEDEF:
        case RTF_TABLEDEF:
            ReadTable( nToken );
            break;

        case RTF_INFO:
            ReadInfo();
            break;

        default:
            if( USHRT_MAX != nInsTblRow &&
                (nInsTblRow > GetOpenBrakets() || IsPardTokenRead() ))
                nInsTblRow = USHRT_MAX;

            SvxRTFParser::NextToken( nToken );
            break;
        }
    }
    if( USHRT_MAX != nInsTblRow &&
        (nInsTblRow > GetOpenBrakets() || IsPardTokenRead() ))
        nInsTblRow = USHRT_MAX;
}


void SwRTFParser::InsertText()
{
    DUMP_TXT( *pPam, aToken )
    // dann fuege den String ein, ohne das Attribute am Ende
    // aufgespannt werden.
    CheckInsNewTblLine();
    pDoc->Insert( *pPam, aToken );
}


void SwRTFParser::InsertPara()
{
    CheckInsNewTblLine();
    pDoc->AppendTxtNode(*pPam->GetPoint());

    // setze das default Style
    if( !bStyleTabValid )
        MakeStyleTab();

    SwTxtFmtColl* pColl = aTxtCollTbl.Get( 0 );
    if( !pColl )
        pColl = pDoc->GetTxtCollFromPool( RES_POOLCOLL_STANDARD );
    pDoc->SetTxtFmtColl( *pPam, pColl );

    ::SetProgressState( rInput.Tell(), pDoc->GetDocShell() );
}



void SwRTFParser::MovePos( int bForward )
{
    if( bForward )
        pPam->Move( fnMoveForward );
    else
        pPam->Move( fnMoveBackward );
}

int SwRTFParser::IsEndPara( SvxNodeIdx* pNd, xub_StrLen nCnt ) const
{
    SwCntntNode *pNode = pDoc->GetNodes()[pNd->GetIdx()]->GetCntntNode();
    return pNode && pNode->Len() == nCnt;
}

void SwRTFParser::SetEndPrevPara( SvxNodeIdx*& rpNodePos, xub_StrLen& rCntPos )
{
    SwNodeIndex aIdx( pPam->GetPoint()->nNode );
    SwCntntNode* pNode = pDoc->GetNodes().GoPrevious( &aIdx );
    if( !pNode )
        ASSERT( FALSE, "keinen vorherigen ContentNode gefunden" );

    rpNodePos = new SwNodeIdx( aIdx );
    rCntPos = pNode->Len();
}

void SwRTFParser::SetAttrInDoc( SvxRTFItemStackType &rSet )
{
    ULONG nSNd = rSet.GetSttNodeIdx(), nENd = rSet.GetEndNodeIdx();
    xub_StrLen nSCnt = rSet.GetSttCnt(), nECnt = rSet.GetEndCnt();

    SwPaM aPam( *pPam->GetPoint() );

#ifndef PRODUCT
    ASSERT( nSNd <= nENd, "Start groesser als Ende" );
    SwNode* pDebugNd = pDoc->GetNodes()[ nSNd ];
    ASSERT( pDebugNd->IsCntntNode(), "Start kein ContentNode" );
    pDebugNd = pDoc->GetNodes()[ nENd ];
    ASSERT( pDebugNd->IsCntntNode(), "Ende kein ContentNode" );
#endif

    SwCntntNode* pCNd = pDoc->GetNodes()[ nSNd ]->GetCntntNode();
    aPam.GetPoint()->nNode = nSNd;
    aPam.GetPoint()->nContent.Assign( pCNd, nSCnt );
    aPam.SetMark();
    if( nENd == nSNd )
        aPam.GetPoint()->nContent = nECnt;
    else
    {
        aPam.GetPoint()->nNode = nENd;
        pCNd = aPam.GetCntntNode();
        aPam.GetPoint()->nContent.Assign( pCNd, nECnt );
    }

    // setze ueber den Bereich das entsprechende Style
    if( rSet.StyleNo() )
    {
        // setze jetzt das Style
        if( !bStyleTabValid )
            MakeStyleTab();
        SwTxtFmtColl* pColl = aTxtCollTbl.Get( rSet.StyleNo() );
        if( pColl )
        {
            pDoc->SetTxtFmtColl( aPam, pColl, FALSE );
            DUMP_STYLE( aPam, *pColl )
        }
    }

    const SfxPoolItem* pItem;
    if( rSet.GetAttrSet().Count() )
    {

        // falls eine Zeichenvorlage im Set steht, deren Attribute
        // aus dem Set loeschen. Sonst sind diese doppelt, was man ja
        // nicht will.
        if( SFX_ITEM_SET == rSet.GetAttrSet().GetItemState(
            RES_TXTATR_CHARFMT, FALSE, &pItem ) &&
            ((SwFmtCharFmt*)pItem)->GetCharFmt() )
        {
            const String& rName = ((SwFmtCharFmt*)pItem)->GetCharFmt()->GetName();
            SvxRTFStyleType* pStyle = GetStyleTbl().First();
            do {
                if( pStyle->bIsCharFmt && pStyle->sName == rName )
                {
                    // alle Attribute, die schon vom Style definiert sind, aus dem
                    // akt. AttrSet entfernen
                    SfxItemSet &rAttrSet = rSet.GetAttrSet(),
                               &rStyleSet = pStyle->aAttrSet;
                    SfxItemIter aIter( rAttrSet );
                    USHORT nWhich = aIter.GetCurItem()->Which();
                    while( TRUE )
                    {
                        if( SFX_ITEM_SET == rStyleSet.GetItemState(
                            nWhich, FALSE, &pItem ) && *pItem == *aIter.GetCurItem())
                            rAttrSet.ClearItem( nWhich );       // loeschen

                        if( aIter.IsAtEnd() )
                            break;
                        nWhich = aIter.NextItem()->Which();
                    }
                    break;
                }
            } while( 0 != (pStyle = GetStyleTbl().Next()) );
        }
        // dann setze ueber diesen Bereich die Attrbiute
        SetSwgValues( rSet.GetAttrSet() );


#if 0
///!!!!!!!!!!!!!!!!!!!!!
        if( !rSet.GetAttrSet().GetParent() )
        {
            const SfxItemPool& rPool = pDoc->GetAttrPool();
            SfxItemSet &rAttrSet = rSet.GetAttrSet();
            SfxItemIter aIter( rAttrSet );
            USHORT nWhich = aIter.GetCurItem()->Which();
            while( TRUE )
            {
                if( SFX_WHICH_MAX < nWhich ||
                    rPool.GetDefaultItem( nWhich ) == *aIter.GetCurItem() )
                    rAttrSet.ClearItem( nWhich );       // loeschen

                if( aIter.IsAtEnd() )
                    break;
                nWhich = aIter.NextItem()->Which();
            }
        }
        if( rSet.GetAttrSet().Count() )
#endif

        pDoc->Insert( aPam, rSet.GetAttrSet(), SETATTR_DONTCHGNUMRULE );
        DUMP_SET( aPam, rSet.GetAttrSet() )
    }

    if( SFX_ITEM_SET == rSet.GetAttrSet().GetItemState(
        FN_PARAM_NUM_LEVEL, FALSE, &pItem ))
    {
        // dann ueber den Bereich an den Nodes das NodeNum setzen
        for( ULONG n = nSNd; n <= nENd; ++n )
        {
            SwTxtNode* pTxtNd = pDoc->GetNodes()[ n ]->GetTxtNode();
            if( pTxtNd )
            {
                pTxtNd->UpdateNum( SwNodeNum( (BYTE)
                            ((SfxUInt16Item*)pItem)->GetValue() ));
                // Update vom LR-Space abschalten?
            }
        }
    }

    if( SFX_ITEM_SET == rSet.GetAttrSet().GetItemState(
        RES_PARATR_NUMRULE, FALSE, &pItem ))
    {
        const SwNumRule* pRule = pDoc->FindNumRulePtr(
                                    ((SwNumRuleItem*)pItem)->GetValue() );
        if( pRule && ( pRule->IsContinusNum() || !bNewNumList ))
        {
            // diese Rule hat keinen Level, also muss die Einrueckung
            // erhalten bleiben!
            // dann ueber den Bereich an den Nodes das Flag zuruecksetzen
            SwNodeNum aNdNum( 0 );
            for( ULONG n = nSNd; n <= nENd; ++n )
            {
                SwTxtNode* pTxtNd = pDoc->GetNodes()[ n ]->GetTxtNode();
                if( pTxtNd )
                {
                    if( !pTxtNd->GetNum() )
                        pTxtNd->UpdateNum( aNdNum );
                    // Update vom LR-Space abschalten
                    pTxtNd->SetNumLSpace( FALSE );
                }
            }
        }
    }
}


// lese alle Dokument-Controls ein
void SwRTFParser::ReadDocControls( int nToken )
{
    int bWeiter = TRUE;

    SwFmtFrmSize aFrmSize(ATT_FIX_SIZE, 12240, 15840 );
    SvxULSpaceItem aUL;
    SvxLRSpaceItem aLR;
    SwFtnInfo aFtnInfo;
    SwEndNoteInfo aEndInfo;
    UseOnPage eUseOn;
    USHORT nPgStart = USHRT_MAX;
    if( bFirstDocControl )
    {
        // RTF-Defaults setzen
        SwFmtFrmSize aFrmSize(ATT_FIX_SIZE, 12240, 15840 );

        aUL.SetUpper( 1440 ); aUL.SetLower( 1440 );
        aLR.SetRight( 1800 ); aLR.SetLeft(  1800 );
        eUseOn = UseOnPage(PD_ALL | PD_HEADERSHARE | PD_FOOTERSHARE);
        aFtnInfo.ePos = FTNPOS_CHAPTER; aFtnInfo.eNum = FTNNUM_DOC;
        bFirstDocControl = FALSE;
    }
    else
    {
        const SwPageDesc& rStdPgDsc = pDoc->GetPageDesc( 0 );
        aFrmSize = rStdPgDsc.GetMaster().GetFrmSize();
        aUL = rStdPgDsc.GetMaster().GetULSpace();
        aLR = rStdPgDsc.GetMaster().GetLRSpace();

        eUseOn = rStdPgDsc.ReadUseOn();

        aEndInfo = pDoc->GetEndNoteInfo();
        aFtnInfo = pDoc->GetFtnInfo();
    }

    BOOL bEndInfoChgd = FALSE, bFtnInfoChgd = FALSE;

    do {
        USHORT nValue = USHORT( nTokenValue );
        switch( nToken )
        {
/*      case '}':       --nOpenBrakets; nToken = RTF_DOCFMT; break;
        case '{':       ++nOpenBrakets; nToken = RTF_DOCFMT; break;
        case RTF_IGNOREFLAG:            nToken = RTF_DOCFMT; break;
*/
        case RTF_PAPERW:
            if( 0 < nTokenValue )
                aFrmSize.SetWidth( nTokenValue );
            break;
        case RTF_PAPERH:
            if( 0 < nTokenValue )
                aFrmSize.SetHeight( nTokenValue );
            break;
        case RTF_MARGL:
            if( 0 <= nTokenValue )
                aLR.SetLeft( nValue );
            break;
        case RTF_MARGR:
            if( 0 <= nTokenValue )
                aLR.SetRight( nValue );
            break;
        case RTF_MARGT:
            if( 0 <= nTokenValue )
                aUL.SetUpper( nValue );
            break;
        case RTF_MARGB:
            if( 0 <= nTokenValue )
                aUL.SetLower( nValue );
            break;

        case RTF_FACINGP:   eUseOn = UseOnPage(PD_MIRROR | PD_HEADERSHARE | PD_FOOTERSHARE);
                            break;
        case RTF_PGNSTART:  nPgStart = nValue;      break;

        case RTF_ENDDOC:
        case RTF_ENDNOTES:
            aFtnInfo.ePos = FTNPOS_CHAPTER; bFtnInfoChgd = TRUE;
            break;
        case RTF_FTNTJ:
        case RTF_FTNBJ:
            aFtnInfo.ePos = FTNPOS_PAGE; bFtnInfoChgd = TRUE;
            break;

        case RTF_AENDDOC:
        case RTF_AENDNOTES:
        case RTF_AFTNTJ:
        case RTF_AFTNBJ:
        case RTF_AFTNRESTART:
        case RTF_AFTNRSTCONT:
            break;      // wir kenn nur am Doc Ende und Doc weite Num.!

        case RTF_FTNSTART:
            if( nValue )
            {
                aFtnInfo.nFtnOffset = nValue-1;
                bFtnInfoChgd = TRUE;
            }
            break;
        case RTF_AFTNSTART:
            if( nValue )
            {
                aEndInfo.nFtnOffset = nValue-1;
                bEndInfoChgd = TRUE;
            }
            break;
        case RTF_FTNRSTPG:
            aFtnInfo.eNum = FTNNUM_PAGE; bFtnInfoChgd = TRUE;
            break;
        case RTF_FTNRESTART:
            aFtnInfo.eNum = FTNNUM_CHAPTER; bFtnInfoChgd = TRUE;
            break;
        case RTF_FTNRSTCONT:
            aFtnInfo.eNum = FTNNUM_DOC; bFtnInfoChgd = TRUE;
            break;

        case RTF_FTNNAR:
            aFtnInfo.aFmt.eType = SVX_NUM_ARABIC; bFtnInfoChgd = TRUE; break;
        case RTF_FTNNALC:
            aFtnInfo.aFmt.eType = SVX_NUM_CHARS_LOWER_LETTER_N; bFtnInfoChgd = TRUE; break;
        case RTF_FTNNAUC:
            aFtnInfo.aFmt.eType = SVX_NUM_CHARS_UPPER_LETTER_N; bFtnInfoChgd = TRUE; break;
        case RTF_FTNNRLC:
            aFtnInfo.aFmt.eType = SVX_NUM_ROMAN_LOWER; bFtnInfoChgd = TRUE; break;
        case RTF_FTNNRUC:
            aFtnInfo.aFmt.eType = SVX_NUM_ROMAN_UPPER; bFtnInfoChgd = TRUE; break;
        case RTF_FTNNCHI:
            aFtnInfo.aFmt.eType = SVX_NUM_CHAR_SPECIAL; bFtnInfoChgd = TRUE; break;

        case RTF_AFTNNAR:
            aEndInfo.aFmt.eType = SVX_NUM_ARABIC; bEndInfoChgd = TRUE; break;
        case RTF_AFTNNALC:
            aEndInfo.aFmt.eType = SVX_NUM_CHARS_LOWER_LETTER_N; bEndInfoChgd = TRUE; break;
        case RTF_AFTNNAUC:
            aEndInfo.aFmt.eType = SVX_NUM_CHARS_UPPER_LETTER_N; bEndInfoChgd = TRUE; break;
        case RTF_AFTNNRLC:
            aEndInfo.aFmt.eType = SVX_NUM_ROMAN_LOWER; bEndInfoChgd = TRUE; break;
        case RTF_AFTNNRUC:
            aEndInfo.aFmt.eType = SVX_NUM_ROMAN_UPPER; bEndInfoChgd = TRUE; break;
        case RTF_AFTNNCHI:
            aEndInfo.aFmt.eType = SVX_NUM_CHAR_SPECIAL; bEndInfoChgd = TRUE; break;


        case '{':
            {
                short nSkip = 0;
                if( RTF_IGNOREFLAG != GetNextToken() )
                    nSkip = -1;
                else if( RTF_DOCFMT != (( nToken = GetNextToken() )
                        & ~(0xff | RTF_SWGDEFS)) )
                    nSkip = -2;
                else
                {
                    SkipGroup();        // erstmal komplett ueberlesen
                    // ueberlese noch die schliessende Klammer
                    GetNextToken();
                }
                if( nSkip )
                {
                    SkipToken( nSkip );     // Ignore wieder zurueck
                    bWeiter = FALSE;
                }
            }
            break;

        default:
            if( RTF_DOCFMT == (nToken & ~(0xff | RTF_SWGDEFS)) ||
                RTF_UNKNOWNCONTROL == nToken )
                SvxRTFParser::NextToken( nToken );
            else
                bWeiter = FALSE;
            break;
        }
        if( bWeiter )
            nToken = GetNextToken();
    } while( bWeiter && IsParserWorking() );

    if( IsNewDoc() )
    {
        if( bEndInfoChgd )
            pDoc->SetEndNoteInfo( aEndInfo );
        if( bFtnInfoChgd )
            pDoc->SetFtnInfo( aFtnInfo );
    }

    if( !bSwPageDesc )
    {
        if( IsNewDoc() )
        {
            // direkt an der Standartseite drehen
            SwPageDesc& rPg = pDoc->_GetPageDesc( 0 );
            rPg.WriteUseOn( eUseOn );
            SwFrmFmt &rFmt1 = rPg.GetMaster(), &rFmt2 = rPg.GetLeft();

            rFmt1.SetAttr( aFrmSize );  rFmt2.SetAttr( aFrmSize );
            rFmt1.SetAttr( aLR );       rFmt2.SetAttr( aLR );
            rFmt1.SetAttr( aUL );       rFmt2.SetAttr( aUL );

            // StartNummer der Seiten setzen
            if( USHRT_MAX != nPgStart )
            {
                const SfxPoolItem* pItem;
                const SwCntntNode* pNd = pPam->GetCntntNode();
                if( pNd && pNd->GetpSwAttrSet() && SFX_ITEM_SET ==
                    pNd->GetpSwAttrSet()->GetItemState( RES_PAGEDESC,
                    FALSE, &pItem ) )
                {
                    // set a new PageNum
                    ((SwFmtPageDesc*)pItem)->SetNumOffset( nPgStart );
                }
                else
                {
                    SwFmtPageDesc aPgDsc( &rPg );
                    aPgDsc.SetNumOffset( nPgStart );
                    pDoc->Insert( *pPam, aPgDsc );
                }
            }
        }

        MakeStyleTab();
        // das default-Style schon gleich am ersten Node setzen
//          if( IsNewDoc() )
        {
            SwTxtFmtColl* pColl = aTxtCollTbl.Get( 0 );
            if( !pColl )
                pColl = pDoc->GetTxtCollFromPool( RES_POOLCOLL_STANDARD );
            pDoc->SetTxtFmtColl( *pPam, pColl );
        }
    }

    SkipToken( -1 );
}

void SwRTFParser::MakeStyleTab()
{
    // dann erzeuge aus der SvxStyle-Tabelle die Swg-Collections
    if( GetStyleTbl().Count() )
    {
        USHORT nValidOutlineLevels = 0;
        if( !IsNewDoc() )
        {
            // search all outlined collections
            BYTE nLvl;
            const SwTxtFmtColls& rColls = *pDoc->GetTxtFmtColls();
            for( USHORT n = rColls.Count(); n; )
                if( MAXLEVEL > (nLvl = rColls[ --n ]->GetOutlineLevel() ))
                    nValidOutlineLevels |= 1 << nLvl;
        }

        SvxRTFStyleType* pStyle = GetStyleTbl().First();
        do {
            USHORT nNo = USHORT( GetStyleTbl().GetCurKey() );
            if( pStyle->bIsCharFmt )
            {
                if( !aCharFmtTbl.Get( nNo ) )
                    // existiert noch nicht, also anlegen
                    MakeCharStyle( nNo, *pStyle );
            }
            else if( !aTxtCollTbl.Get( nNo ) )
            {
                // existiert noch nicht, also anlegen
                if( MAXLEVEL > pStyle->nOutlineNo )
                {
                    USHORT nOutlFlag = 1 << pStyle->nOutlineNo;
                    if( nValidOutlineLevels & nOutlFlag )
                        pStyle->nOutlineNo = (BYTE)-1;
                    else
                        nValidOutlineLevels |= nOutlFlag;
                }

                MakeStyle( nNo, *pStyle );
            }

        } while( 0 != (pStyle = GetStyleTbl().Next()) );
        bStyleTabValid = TRUE;
    }
}

SwPageDesc* SwRTFParser::_MakeNewPageDesc( int bFirst )
{
    USHORT* pNo = &nAktPageDesc;
    String aNm( String::CreateFromAscii(
                        RTL_CONSTASCII_STRINGPARAM( "RTF-SectionPage(" )));

    if( bFirst )
    {
        aNm.InsertAscii( "First", 4 );
        pNo = &nAktFirstPageDesc;
    }
    aNm += String::CreateFromInt32( pDoc->GetPageDescCnt() );
    aNm += ')';

    USHORT nNew = pDoc->MakePageDesc( aNm, 0 );
    SwPageDesc& rAkt = pDoc->_GetPageDesc( nNew );
    SwPageDesc& rOld = pDoc->_GetPageDesc( *pNo );
    pDoc->CopyPageDesc( rOld, rAkt, FALSE );

    *pNo = nNew;

    // setze den Follow-PageDesc immer auf sich selbst
    rAkt.SetFollow( &rAkt );

    // falls auf \\page ein \\setd folgt, dann muss noch ein neuer
    // Absatz eingefuegt werden.
    SwCntntNode* pCNd = pPam->GetCntntNode();
    ASSERT( pCNd, "wo ist mein Content-Node" );
    if( SFX_ITEM_SET == pCNd->GetSwAttrSet().GetItemState( RES_BREAK, FALSE )
        // sollten nicht am NodeAnfang stehen, erzeuge einen neuen Absatz
        || pPam->GetPoint()->nContent.GetIndex() )
        InsertPara();

    return &rAkt;
}

BOOL lcl_CompareRTFPageDesc( const SwPageDesc& rOld, const SwPageDesc& rAkt )
{
    BOOL bRet = /*rAkt.ReadUseOn() == rOld.ReadUseOn() && Bug 63599 */
                rAkt.GetLandscape() == rOld.GetLandscape() &&
                rAkt.GetNumType().eType == rOld.GetNumType().eType;

    if( bRet )
    {
        // dann ein paar Attribute vergleichen
        USHORT __READONLY_DATA aIdArr[] = { RES_FRM_SIZE, RES_UL_SPACE,
                                            RES_BACKGROUND, RES_SHADOW,
                                            0 };
        const SfxPoolItem* pOldItem, *pAktItem;
        for( USHORT n = 0; aIdArr[ n ] && bRet; n += 2 )
        {
            for( USHORT nId = aIdArr[ n ]; nId <= aIdArr[ n+1]; ++nId )
            {
                int eOldSt = rOld.GetMaster().GetItemState( nId, FALSE, &pOldItem ),
                    eAktSt = rAkt.GetMaster().GetItemState( nId, FALSE, &pAktItem );
                if( eOldSt != eAktSt ||
                    ( SFX_ITEM_SET == eOldSt && *pOldItem != *pAktItem ))
                {
                    bRet = FALSE;
                    break;
                }
            }
        }
    }
    return bRet;
}

BOOL lcl_SetFmtCol( SwFmt& rFmt, USHORT nCols, USHORT nColSpace,
                    const SvUShorts& rColumns )
{
    BOOL bSet = FALSE;
    if( nCols && USHRT_MAX != nCols )
    {
        SwFmtCol aCol;
        if( USHRT_MAX == nColSpace )
            nColSpace = 720;

        aCol.Init( nCols, nColSpace, USHRT_MAX );
        if( nCols == ( rColumns.Count() / 2 ) )
        {
            aCol._SetOrtho( FALSE );
            USHORT nWishWidth = 0, nHalfPrev = 0;
            for( USHORT n = 0, i = 0; n < rColumns.Count(); n += 2, ++i )
            {
                SwColumn* pCol = aCol.GetColumns()[ i ];
                pCol->SetLeft( nHalfPrev );
                USHORT nSp = rColumns[ n+1 ];
                nHalfPrev = nSp / 2;
                pCol->SetRight( nSp - nHalfPrev );
                pCol->SetWishWidth( rColumns[ n ] +
                                    pCol->GetLeft() + pCol->GetRight() );
                nWishWidth += pCol->GetWishWidth();
            }
            aCol.SetWishWidth( nWishWidth );
        }
        rFmt.SetAttr( aCol );
        bSet = TRUE;
    }
    return bSet;
}

// lese alle Section-Controls ein
void SwRTFParser::ReadSectControls( int nToken )
{
    int bWeiter = TRUE;

    // werden die eigenen PageDesc - Informationen gelesen, dann alles
    // ueberlesen
    // Wird in ein bestehendes Doc eingelesen oder wurden eigene PageDesc
    // gelesen, dann sind nur die Bereiche von interresse
    BOOL bInsPageDesc = IsNewDoc() && !bSwPageDesc;

    if( bInPgDscTbl )
    {
        do {
            if( '{' == nToken )
            {
                switch( nToken = GetNextToken() )
                {
                case RTF_IGNOREFLAG:
                    if( RTF_SECTFMT != (( nToken = GetNextToken() )
                        & ~(0xff | RTF_SWGDEFS)) )
                    {
                        SkipToken( -2 );    // Ignore und Token wieder zurueck
                        bWeiter = FALSE;
                        break;
                    }
                    // kein break, Gruppe ueberspringen

                case RTF_FOOTER:
                case RTF_HEADER:
                case RTF_FOOTERR:
                case RTF_HEADERR:
                case RTF_FOOTERL:
                case RTF_HEADERL:
                case RTF_FOOTERF:
                case RTF_HEADERF:
                    SkipGroup();        // erstmal komplett ueberlesen
                    // ueberlese noch die schliessende Klammer
                    GetNextToken();
                    break;

                default:
                    SkipToken( -1 );            // Ignore wieder zurueck
                    bWeiter = FALSE;
                    break;
                }
            }
            else if( RTF_SECTFMT == (nToken & ~(0xff | RTF_SWGDEFS)) ||
                RTF_UNKNOWNCONTROL == nToken )
                SvxRTFParser::NextToken( nToken );
            else
                bWeiter = FALSE;
            if( bWeiter )
                nToken = GetNextToken();
        } while( bWeiter && IsParserWorking() );
        SkipToken( -1 );                    // letztes Token wieder zurueck
        return;
    }

    // RTF-Defaults setzen
    BOOL bFirstCall = 1 == pDoc->GetPageDescCnt();
    BOOL bHeaderUL = FALSE, bHeaderLR = FALSE,
        bFooterUL = FALSE, bFooterLR = FALSE;

    USHORT nLastPageDesc = nAktPageDesc,
            nLastFirstPageDesc = nAktFirstPageDesc;

    BOOL bMakeNewPageDesc = RTF_SECT == nToken;
    BOOL bInsNewPageDesc = bMakeNewPageDesc || bFirstCall || bSwPageDesc;
    SwPageDesc* pAkt, *pFirst = 0;
    if( bInsNewPageDesc )
    {
        pAkt = _MakeNewPageDesc( FALSE );
        if( bMakeNewPageDesc )
        {
            nToken = GetNextToken();
            // some export filter write the RTF_SECT in brakets -> skip over
            while( '}' == nToken )
            {
                NextToken( nToken );
                nToken = GetNextToken();
            }
        }
    }
    else
    {
        pAkt = &pDoc->_GetPageDesc( nAktPageDesc );
        if( nAktFirstPageDesc )
            pFirst = &pDoc->_GetPageDesc( nAktFirstPageDesc );
    }

    SwFmtFrmSize aSz( pAkt->GetMaster().GetFrmSize() ),
                aHSz( ATT_MIN_SIZE );
    SvxULSpaceItem aUL( pAkt->GetMaster().GetULSpace() ), aHUL, aFUL;
    SvxLRSpaceItem aLR( pAkt->GetMaster().GetLRSpace() ), aHLR, aFLR;
    BOOL    bPgWiChgd = FALSE, bPgHeChgd = FALSE,
            bPgUpChgd = FALSE, bPgLoChgd = FALSE,
            bPgLeChgd = FALSE, bPgRiChgd = FALSE,
            bPgFcChgd = FALSE,
            bNoBalancedCols = FALSE;

    USHORT nRestoreUpper = USHRT_MAX, nRestoreLower = USHRT_MAX;
    SwFrmFmt* pFmt = (SwFrmFmt*)pAkt->GetMaster().GetHeader().GetHeaderFmt();
    if( pFmt )
    {
        aHUL = pFmt->GetULSpace();
        aHLR = pFmt->GetLRSpace();
        aHSz = pFmt->GetFrmSize();
        if( aHSz.GetHeight() )
        {
            nRestoreUpper = (USHORT)aHSz.GetHeight();
            aUL.SetUpper( aUL.GetUpper() + nRestoreUpper );
            aHSz.SetHeight( 0 );
        }
    }

    if( 0 != (pFmt = (SwFrmFmt*)pAkt->GetMaster().GetFooter().GetFooterFmt()) )
    {
        aFUL = pFmt->GetULSpace();
        aFLR = pFmt->GetLRSpace();
        if( aFUL.GetUpper() )
        {
            nRestoreLower = aFUL.GetUpper();
            aUL.SetLower( aUL.GetLower() + nRestoreLower  );
            aFUL.SetUpper( 0 );
        }
    }

    BOOL bCheckEqualPgDesc = TRUE, bPgDescChgd = FALSE;
    SvxBreak eBreak = SVX_BREAK_PAGE_BEFORE;

    USHORT nCols = USHRT_MAX, nColSpace = USHRT_MAX, nAktCol = 0;
    SvUShorts aColumns;

    USHORT nPgStart = USHRT_MAX;
    SwNumType aNumType;

    do {
        BOOL bIsSectToken = FALSE;
        USHORT nValue = USHORT( nTokenValue );
        switch( nToken )
        {
        case RTF_SECT:
            bWeiter = FALSE;
            break;

        case RTF_SECTD:
            {
                // Wert von der StandardPage holen !
                const SwFrmFmt& rFmt = pDoc->GetPageDesc(0).GetMaster();
                aSz = rFmt.GetFrmSize();
                aUL = rFmt.GetULSpace();
                aLR = rFmt.GetLRSpace();

                nRestoreUpper = USHRT_MAX, nRestoreLower = USHRT_MAX;
                aHUL.SetUpper( 720 );   aHUL.SetLower( 0 );
                aFUL.SetUpper( 0 );     aFUL.SetLower( 720 );
                aHLR.SetLeft( 0 );      aHLR.SetRight( 0 );
                aFLR.SetLeft( 0 );      aFLR.SetRight( 0 );
                pAkt->WriteUseOn( UseOnPage(PD_ALL | PD_HEADERSHARE | PD_FOOTERSHARE) );
                pAkt->SetLandscape( FALSE );

                // remove Columns/Header/Footer
                pAkt->GetMaster().ResetAttr( RES_COL );
                if( pFirst )
                    pFirst->GetMaster().ResetAttr( RES_COL );

                nPgStart = USHRT_MAX;
                nCols = USHRT_MAX;
                nColSpace = USHRT_MAX;
                aNumType.eType = SVX_NUM_ARABIC;
                bHeaderUL = bHeaderLR = bFooterUL = bFooterLR = TRUE;
                eBreak = SVX_BREAK_PAGE_BEFORE;
                nNewNumSectDef = USHRT_MAX;

                bPgWiChgd = bPgHeChgd = bPgUpChgd = bPgLoChgd = bPgLeChgd =
                    bPgRiChgd = bPgFcChgd = TRUE;
            bPgDescChgd = TRUE;
            }
            break;

        case RTF_PGWSXN:
            if( 0 < nTokenValue )
            {
                aSz.SetWidth( nTokenValue );
                bPgWiChgd = TRUE;
                bPgDescChgd = TRUE;
            }
            break;

        case RTF_PGHSXN:
            if( 0 < nTokenValue )
            {
                aSz.SetHeight( nTokenValue );
                bPgHeChgd = TRUE;
                bPgDescChgd = TRUE;
            }
            break;
        case RTF_MARGLSXN:
            if( 0 <= nTokenValue )
            {
                aLR.SetLeft( nValue );
                bPgLeChgd =TRUE;
                bPgDescChgd = TRUE;
            }
            break;
        case RTF_MARGRSXN:
            if( 0 <= nTokenValue )
            {
                aLR.SetRight( nValue );
                bPgRiChgd = TRUE;
                bPgDescChgd = TRUE;
            }
            break;

        case RTF_MARGTSXN:
            if( 0 <= nTokenValue )
            {
                nRestoreUpper = USHRT_MAX;
                aUL.SetUpper( nValue );
                bPgUpChgd = TRUE;
                bPgDescChgd = TRUE;
            }
            break;

        case RTF_MARGBSXN:
            if( 0 <= nTokenValue )
            {
                nRestoreLower = USHRT_MAX;
                aUL.SetLower( nValue );
                bPgLoChgd = TRUE;
                bPgDescChgd = TRUE;
            }
            break;

        case RTF_FACPGSXN:
            pAkt->SetUseOn( UseOnPage(PD_MIRROR | ( pAkt->GetUseOn() &
                                ~(PD_HEADERSHARE | PD_FOOTERSHARE) )));
            bPgDescChgd = TRUE;
            break;

        case RTF_HEADERY:
            aHUL.SetUpper( nValue );
            bHeaderUL = TRUE;
            bPgDescChgd = TRUE;
            break;

        case RTF_FOOTERY:
            aFUL.SetLower( nValue );
            bFooterUL = TRUE;
            bPgDescChgd = TRUE;
            break;

        case RTF_LNDSCPSXN:
            pAkt->SetLandscape( TRUE );
            bPgFcChgd = TRUE;
            bPgDescChgd = TRUE;
            break;

        case RTF_PGNSTARTS:
            nPgStart = nValue;
            bPgDescChgd = TRUE;
            break;

        case RTF_PGNDEC:
            aNumType.eType = SVX_NUM_ARABIC;
            bPgDescChgd = TRUE;
            break;
        case RTF_PGNUCRM:
            aNumType.eType = SVX_NUM_ROMAN_UPPER;
            bPgDescChgd = TRUE;
            break;
        case RTF_PGNLCRM:
            aNumType.eType = SVX_NUM_ROMAN_LOWER;
            bPgDescChgd = TRUE;
            break;
        case RTF_PGNUCLTR:
            aNumType.eType = SVX_NUM_CHARS_UPPER_LETTER_N;
            bPgDescChgd = TRUE;
            break;
        case RTF_PGNLCLTR:
            aNumType.eType = SVX_NUM_CHARS_LOWER_LETTER_N;
            bPgDescChgd = TRUE;
            break;

        case RTF_SBKNONE:
            bIsSectToken = TRUE;
            eBreak = SVX_BREAK_NONE;
            bPgDescChgd = !bFirstCall;
            break;

        case RTF_SBKCOL:
            eBreak = SVX_BREAK_COLUMN_BEFORE;
            bPgDescChgd = TRUE;
            break;

        case RTF_ENDNHERE:
        case RTF_BINFSXN:
        case RTF_BINSXN:
        case RTF_SBKPAGE:
        case RTF_SBKEVEN:
        case RTF_SBKODD:
        case RTF_LINEBETCOL:
        case RTF_LINEMOD:
        case RTF_LINEX:
        case RTF_LINESTARTS:
        case RTF_LINERESTART:
        case RTF_LINEPAGE:
        case RTF_LINECONT:
        case RTF_GUTTERSXN:
        case RTF_PGNCONT:
        case RTF_PGNRESTART:
        case RTF_PGNX:
        case RTF_PGNY:
        case RTF_VERTALT:
        case RTF_VERTALB:
        case RTF_VERTALC:
        case RTF_VERTALJ:
            break;

        case RTF_TITLEPG:
            if( bInsPageDesc && !pFirst )
                pFirst = _MakeNewPageDesc( TRUE );
            bCheckEqualPgDesc = FALSE;
            bPgDescChgd = TRUE;
            break;

        case RTF_HEADER:
        case RTF_HEADERL:
        case RTF_HEADERR:
        case RTF_FOOTER:
        case RTF_FOOTERL:
        case RTF_FOOTERR:
            if( bInsPageDesc )
                ReadHeaderFooter( nToken, pAkt );
            else
                SkipGroup(), GetNextToken();    //Gruppe mit schl. Klammer lesen
            bCheckEqualPgDesc = FALSE;
            bPgDescChgd = TRUE;
            break;

        case RTF_FOOTERF:
        case RTF_HEADERF:
            if( bInsPageDesc )
            {
                if( !pFirst )
                    pFirst = _MakeNewPageDesc( TRUE );
                ReadHeaderFooter( nToken, pFirst );
            }
            else
                SkipGroup(), GetNextToken();    //Gruppe mit schl. Klammer lesen
            bCheckEqualPgDesc = FALSE;
            bPgDescChgd = TRUE;
            break;

        case RTF_COLS:
            bIsSectToken = TRUE;
            nCols = nValue;
            bPgDescChgd = TRUE;
            break;

        case RTF_COLSX:
            bIsSectToken = TRUE;
            nColSpace = nValue;
            bPgDescChgd = TRUE;
            break;

        case RTF_COLNO:
            bIsSectToken = TRUE;
            nAktCol = nValue;
            if( RTF_COLW == GetNextToken() )
            {
                USHORT nWidth = USHORT( nTokenValue ), nSpace = 0;
                if( RTF_COLSR == GetNextToken() )
                    nSpace = USHORT( nTokenValue );
                else
                    SkipToken( -1 );        // wieder zurueck

                if( --nAktCol == ( aColumns.Count() / 2 ) )
                {
                    aColumns.Insert( nWidth, aColumns.Count() );
                    aColumns.Insert( nSpace, aColumns.Count() );
                }
            }
            bPgDescChgd = TRUE;
            break;


        case '{':
            {
                short nSkip = 0;
                if( RTF_IGNOREFLAG != ( nToken = GetNextToken() ))
                    nSkip = -1;
                else if( RTF_SECTFMT != (( nToken = GetNextToken() )
                         & ~(0xff | RTF_SWGDEFS)) &&
                        ( RTF_DOCFMT != ( nToken & ~(0xff | RTF_SWGDEFS))) )
                    nSkip = -2;
                else
                {
                    bPgDescChgd = TRUE;
                    switch( nToken )
                    {
                    case RTF_HEADER_YB:
                        aHUL.SetLower( USHORT(nTokenValue) );
                        bHeaderUL = TRUE;
                        if( RTF_HEADER_XL == GetNextToken() &&
                            RTF_HEADER_XR == GetNextToken() )
                        {
                            bHeaderLR = TRUE;
                            aHLR.SetLeft( USHORT(GetStackPtr( -1 )->nTokenValue) );
                            aHLR.SetRight( USHORT(nTokenValue));
                        }
                        else
                            SkipGroup();
                        break;

                    case RTF_FOOTER_YT:
                        aFUL.SetUpper( USHORT(nTokenValue));
                        bFooterUL = TRUE;
                        if( RTF_FOOTER_XL == GetNextToken() &&
                            RTF_FOOTER_XR == GetNextToken() )
                        {
                            bFooterLR = TRUE;
                            aFLR.SetLeft( USHORT(GetStackPtr( -1 )->nTokenValue) );
                            aFLR.SetRight( USHORT(nTokenValue));
                        }
                        else
                            SkipGroup();
                        break;

                    case RTF_BALANCED_COLUMN:
                        bIsSectToken = TRUE;
                        bPgDescChgd = TRUE;
                        bNoBalancedCols = TRUE;
                        break;

                    default:
                        SkipGroup();        // erstmal komplett ueberlesen
                        break;
                    }

                    // ueberlese noch die schliessende Klammer
                    GetNextToken();
                }
                if( nSkip )
                {
                    bWeiter = -1 == nSkip && (
                            RTF_FOOTER == nToken || RTF_HEADER == nToken ||
                            RTF_FOOTERR == nToken || RTF_HEADERR == nToken ||
                            RTF_FOOTERL == nToken || RTF_HEADERL == nToken ||
                            RTF_FOOTERF == nToken || RTF_HEADERF == nToken );
                    SkipToken( nSkip );     // Ignore wieder zurueck
                }
            }
            break;

        case RTF_PAPERW:
        case RTF_PAPERH:
        case RTF_MARGL:
        case RTF_MARGR:
        case RTF_MARGT:
        case RTF_MARGB:
        case RTF_FACINGP:
            {
                ReadDocControls( nToken );

                // set the new Values
                const SwPageDesc& rStdPgDsc = pDoc->GetPageDesc( 0 );
                const SwFmtFrmSize& rSz = rStdPgDsc.GetMaster().GetFrmSize();
                const SvxULSpaceItem rUL = rStdPgDsc.GetMaster().GetULSpace();
                const SvxLRSpaceItem rLR = rStdPgDsc.GetMaster().GetLRSpace();

                if( !bPgWiChgd ) aSz.SetWidth( rSz.GetWidth() );
                if( !bPgHeChgd ) aSz.SetHeight( rSz.GetHeight() );
                if( !bPgUpChgd ) aUL.SetUpper( rUL.GetUpper() );
                if( !bPgLoChgd ) aUL.SetLower( rUL.GetLower() );
                if( !bPgLeChgd ) aLR.SetLeft( rLR.GetLeft() );
                if( !bPgRiChgd ) aLR.SetRight( rLR.GetRight() );
                if( !bPgFcChgd ) pAkt->SetLandscape( rStdPgDsc.GetLandscape() );
            }
            break;
        default:
            if( RTF_DOCFMT == (nToken & ~(0xff | RTF_SWGDEFS)) )
                ReadDocControls( nToken );
            else if( RTF_SECTFMT == (nToken & ~(0xff | RTF_SWGDEFS)) ||
                     RTF_UNKNOWNCONTROL == nToken )
                SvxRTFParser::NextToken( nToken );
            else
                bWeiter = FALSE;
            break;
        }


        if( bWeiter )
        {
            // kein eigener Bereich und kein Section Attribut?
            if( !bInsPageDesc && !bIsSectToken )
                bCheckEqualPgDesc = FALSE;
            nToken = GetNextToken();
        }
    } while( bWeiter && IsParserWorking() );


    if( !bPgDescChgd )
    {
        // der aktuelle muss wieder entnfernt werden
        if( bInsNewPageDesc )
        {
            pDoc->DelPageDesc( nAktPageDesc );
            if( pFirst )
                pDoc->DelPageDesc( nAktFirstPageDesc );
            nAktPageDesc = nLastPageDesc;
            nAktFirstPageDesc = nLastFirstPageDesc;
        }
        SkipToken( -1 );
        return ;
    }


    // den letzen Bereich wieder zumachen
    if( pRegionEndIdx )
    {
        DelLastNode();
        pPam->GetPoint()->nNode = *pRegionEndIdx;
        pPam->Move( fnMoveForward, fnGoNode );
        delete pRegionEndIdx, pRegionEndIdx = 0;
    }


    pFmt = &pAkt->GetMaster();

    if( bInsPageDesc )
    {
        if( bHeaderUL )
        {
            if( aUL.GetUpper() > aHUL.GetUpper() )
            {
                aHSz.SetHeight( aUL.GetUpper() - aHUL.GetUpper() );
                aHUL.SetUpper( 0 );
                aUL.SetUpper( USHORT(aUL.GetUpper() - aHSz.GetHeight()) );

                if( !pFmt->GetHeader().GetHeaderFmt() )
                    pFmt->SetAttr( SwFmtHeader( (BOOL)TRUE ));
                if( pFirst && !pFirst->GetMaster().GetHeader().GetHeaderFmt() )
                    pFirst->GetMaster().SetAttr( SwFmtHeader( (BOOL)TRUE ));
            }
        }
        else if( USHRT_MAX != nRestoreUpper )
            aUL.SetUpper( aUL.GetUpper() - nRestoreUpper );

        if( bFooterUL  )
        {
            if( aUL.GetLower() > aFUL.GetLower() )
            {
                aFUL.SetUpper( aUL.GetLower() - aFUL.GetLower() );
                aUL.SetLower( aFUL.GetLower() );
                aFUL.SetLower( 0 );
                if( !pFmt->GetFooter().GetFooterFmt() )
                    pFmt->SetAttr( SwFmtFooter( (BOOL)TRUE ));
                if( pFirst && !pFirst->GetMaster().GetFooter().GetFooterFmt() )
                    pFirst->GetMaster().SetAttr( SwFmtFooter( (BOOL)TRUE ));
            }
            else
            {
                aUL.SetLower( aFUL.GetLower() );
                aFUL.SetLower( 0 );
            }
        }
        else if( USHRT_MAX != nRestoreLower )
            aUL.SetLower( aUL.GetLower() - nRestoreLower );

        pFmt->SetAttr( aSz );
        pFmt->SetAttr( aLR );
        pFmt->SetAttr( aUL );

        pAkt->SetNumType( aNumType );
        if( pFirst )
            pFirst->SetNumType( aNumType );

        if( ( bHeaderUL || bHeaderLR ) &&
            0 != (pFmt = (SwFrmFmt*)pAkt->GetMaster().GetHeader().GetHeaderFmt()) )
        {
            if( bHeaderUL && aHSz.GetHeight() ) pFmt->SetAttr( aHSz );
            if( bHeaderLR ) pFmt->SetAttr( aHLR );
        }

        if( ( bFooterUL || bFooterLR ) &&
            0 != ( pFmt = (SwFrmFmt*)pAkt->GetMaster().GetFooter().GetFooterFmt()) )
        {
            if( bFooterUL ) pFmt->SetAttr( aFUL );
            if( bFooterLR ) pFmt->SetAttr( aFLR );
        }
    }


    if( nCols && USHRT_MAX != nCols )
    {
        if( ::lcl_SetFmtCol( pAkt->GetMaster(), nCols, nColSpace, aColumns )
            && pFirst )
            pFirst->GetMaster().SetAttr( pAkt->GetMaster().GetAttr( RES_COL ));

        //JP 19.03.99 - Spaltigkeit NIE an der Seite setzen - dieses
        //              ist immer ein Kennzeichen fuer einen Bereich, weil
        //              die Seitenspalten NIE vom Layout aufgebrochen werden.
        //JP 24.02.00 - but dont insert column section into a column page
        //              Bug 73480
        if( bSwPageDesc )
        {
            const SwPageDesc& rOld = pDoc->GetPageDesc( nLastPageDesc );
            if( rOld.GetMaster().GetAttr( RES_COL ) !=
                pAkt->GetMaster().GetAttr( RES_COL ) )
            {
                bCheckEqualPgDesc = TRUE;
                bInsPageDesc = FALSE;
                eBreak = SVX_BREAK_NONE;

// !! ???? muss das hier passieren ??
                // fuer den Absatz dahinter sorgen
                pDoc->AppendTxtNode(*pPam->GetPoint());
                pPam->Move( fnMoveBackward );
                pPam->SetMark();
            }
        }
    }
    else if( bInsNewPageDesc )
    {
        pAkt->GetMaster().ResetAttr( RES_COL );
        if( pFirst )
            pFirst->GetMaster().ResetAttr( RES_COL );
    }

    if( pFirst )
    {
        // setze am ersten den richtigen Follow
        pFirst->SetFollow( pAkt );

        // und setze noch die die Werte aus PageDesc:
        pFirst->SetLandscape( pAkt->GetLandscape() );

        pFmt = &pFirst->GetMaster();

        pFmt->SetAttr( aSz );
        pFmt->SetAttr( aLR );
        pFmt->SetAttr( aUL );

        if( ( bHeaderUL || bHeaderLR ) &&
            0 != (pFmt = (SwFrmFmt*)pFirst->GetMaster().GetHeader().GetHeaderFmt()) )
        {
            if( bHeaderUL && aHSz.GetHeight() ) pFmt->SetAttr( aHSz );
            if( bHeaderLR ) pFmt->SetAttr( aHLR );
        }

        if( ( bFooterUL || bFooterLR ) &&
            0 != ( pFmt = (SwFrmFmt*)pFirst->GetMaster().GetFooter().GetFooterFmt()) )
        {
            if( bFooterUL ) pFmt->SetAttr( aFUL );
            if( bFooterLR ) pFmt->SetAttr( aFLR );
        }
    }

    const SwPageDesc& rOld = pDoc->GetPageDesc( nLastPageDesc );
    if( bInsNewPageDesc && pFirst &&
        pDoc->GetPageDesc( nLastFirstPageDesc ).GetFollow() != &rOld )
    {
        bCheckEqualPgDesc = FALSE;
    }

    if( bInsPageDesc && ( !bCheckEqualPgDesc || !bInsNewPageDesc ||
        // dann pruefe ob die Attribute beider PageDesc gleich sind
        !::lcl_CompareRTFPageDesc(pDoc->GetPageDesc( nLastPageDesc ), *pAkt ))
        || ( bMakeNewPageDesc && SVX_BREAK_NONE != eBreak ) )
    {
        // Pagedescriptoren am Dokument updaten (nur so werden auch die
        // linken Seiten usw. eingestellt).

        // Spaltigkeit in den Set uebernehmen
        SfxItemSet* pSet = 0;
        const SfxPoolItem* pItem;
        SfxItemSet aSet( pDoc->GetAttrPool(), RES_COL, RES_COLUMNBALANCE );
        if( SFX_ITEM_SET == pAkt->GetMaster().GetItemState(
                                            RES_COL, FALSE, &pItem )
            && 1 < ((SwFmtCol*)pItem)->GetColumns().Count() )
        {
            aSet.Put( *pItem );
            pSet = &aSet;
            pAkt->GetMaster().ResetAttr( RES_COL );
            if( pFirst )
                pFirst->GetMaster().ResetAttr( RES_COL );
        }

        pDoc->ChgPageDesc( nAktPageDesc, *pAkt );

        if( pSet )
        {
            SwSection aSect( CONTENT_SECTION, pDoc->GetUniqueSectionName() );
            SwSection* pSect = pDoc->Insert( *pPam, aSect, pSet );
            pPam->DeleteMark();

            SwSectionNode* pSectNd = pSect->GetFmt()->GetSectionNode( TRUE );
            if( pRegionEndIdx )
                *pRegionEndIdx = *pSectNd->EndOfSectionNode();
            else
                pRegionEndIdx = new SwNodeIndex( *pSectNd->EndOfSectionNode());

            pPam->GetPoint()->nNode = *pSectNd;
            pPam->Move( fnMoveForward, fnGoNode );

            // Attribut Enden ggfs. anpassen!!!!
            if( GetAttrStack().Count() )
            {
                // Attribut Stack-Eintraege, muessen ans Ende des vorherigen
                // Nodes verschoben werden.
                for( USHORT n = GetAttrStack().Count(); n; )
                {
                    SvxRTFItemStackType* pStkEntry = (SvxRTFItemStackType*)
                                                    GetAttrStack()[ --n ];
                    if( pRegionEndIdx->GetIndex() == pStkEntry->GetSttNode().GetIdx() )
                        pStkEntry->SetStartPos( SwxPosition( pPam ) );
                }
            }
        }

        if( bInsNewPageDesc )
        {
            SwFmtPageDesc aPgDsc( pAkt );

            if( pFirst )
            {
                // Pagedescriptoren am Dokument updaten (nur so werden auch die
                // linken Seiten usw. eingestellt).
                pDoc->ChgPageDesc( nAktFirstPageDesc, *pFirst );
                pFirst->Add( &aPgDsc );
            }

            if( USHRT_MAX != nPgStart )
                aPgDsc.SetNumOffset( nPgStart );
            pDoc->Insert( *pPam, aPgDsc );
        }
    }
    else
    {
        // sollte es ein BereichsWechsel sein?
        if( bCheckEqualPgDesc && SVX_BREAK_NONE == eBreak
            /*&& (!bInsPageDesc || neuen Bereich aufsetzen
             rOld.GetMaster().GetCol() != pAkt->GetMaster().GetCol() )*/ )
        {
            // Spaltigkeit in den Set uebernehmen
            SfxItemSet* pSet = 0;
            const SfxPoolItem* pItem;
            SfxItemSet aSet( pDoc->GetAttrPool(), RES_COL, RES_COLUMNBALANCE);
            if( SFX_ITEM_SET == pAkt->GetMaster().GetItemState(
                                                RES_COL, FALSE, &pItem )
                && 1 < ((SwFmtCol*)pItem)->GetColumns().Count() )
            {
                aSet.Put( *pItem );
                pSet = &aSet;
            }

            if( bNoBalancedCols )
            {
                aSet.Put( SwFmtNoBalancedColumns( TRUE ) );
                pSet = &aSet;
            }

            if( !bFirstCall || pSet )
            {
                SwSection aSect( CONTENT_SECTION, pDoc->GetUniqueSectionName() );
                SwSection* pSect = pDoc->Insert( *pPam, aSect, pSet );
                pPam->DeleteMark();

                SwSectionNode* pSectNd = pSect->GetFmt()->GetSectionNode( TRUE );
                if( pRegionEndIdx )
                    *pRegionEndIdx = *pSectNd->EndOfSectionNode();
                else
                    pRegionEndIdx = new SwNodeIndex( *pSectNd->EndOfSectionNode());

                pPam->GetPoint()->nNode = *pSectNd;
                pPam->Move( fnMoveForward, fnGoNode );

                // Attribut Enden ggfs. anpassen!!!!
                if( GetAttrStack().Count() )
                {
                    // Attribut Stack-Eintraege, muessen ans Ende des vorherigen
                    // Nodes verschoben werden.
                    for( USHORT n = GetAttrStack().Count(); n; )
                    {
                        SvxRTFItemStackType* pStkEntry = (SvxRTFItemStackType*)
                                                        GetAttrStack()[ --n ];
                        if( pRegionEndIdx->GetIndex() == pStkEntry->GetSttNode().GetIdx() )
                            pStkEntry->SetStartPos( SwxPosition( pPam ) );
                    }
                }
            }
        }
        else if( bInsPageDesc )
        {
            if(SVX_BREAK_COLUMN_BEFORE == eBreak )
                pDoc->Insert( *pPam, SvxFmtBreakItem( eBreak ));
            else if( SVX_BREAK_NONE != eBreak )
            {
                SwFmtPageDesc aPgDsc( ( pFirst && &rOld ==
                            pDoc->GetPageDesc( nLastFirstPageDesc ).GetFollow() )
                                ? &pDoc->_GetPageDesc( nLastFirstPageDesc )
                                : &rOld );

                if( USHRT_MAX != nPgStart )
                    aPgDsc.SetNumOffset( nPgStart );
                pDoc->Insert( *pPam, aPgDsc );
            }
        }

        // der aktuelle muss wieder entnfernt werden
        if( bInsNewPageDesc )
        {
            pDoc->DelPageDesc( nAktPageDesc );
            if( pFirst )
                pDoc->DelPageDesc( nAktFirstPageDesc );
            nAktPageDesc = nLastPageDesc;
            nAktFirstPageDesc = nLastFirstPageDesc;
        }
    }

    SkipToken( -1 );
}



void SwRTFParser::ReadPageDescTbl()
{
    if( !IsNewDoc() )
    {
        SkipGroup();
        return;
    }

    // dann erzeuge aus der SvxStyle-Tabelle die Swg-Collections, damit
    // diese auch in den Headers/Footer benutzt werden koennen!
    MakeStyleTab();
    // das default-Style schon gleich am ersten Node setzen
    SwTxtFmtColl* pColl = aTxtCollTbl.Get( 0 );
    if( !pColl )
        pColl = pDoc->GetTxtCollFromPool( RES_POOLCOLL_STANDARD );
    pDoc->SetTxtFmtColl( *pPam, pColl );

    int nToken, bSaveChkStyleAttr = IsChkStyleAttr();
    int nOpenBrakets = 1;       // die erste wurde schon vorher erkannt !!

    SetChkStyleAttr(FALSE);     // Attribute nicht gegen die Styles checken

    bInPgDscTbl = TRUE;
    USHORT nPos = 0;
    SwPageDesc* pPg;
    SwFrmFmt* pPgFmt;

    SvxULSpaceItem aUL, aHUL, aFUL;
    SvxLRSpaceItem aLR, aHLR, aFLR;
    SwFmtFrmSize aSz( ATT_FIX_SIZE, 11905, 16837 );     // DIN A4 defaulten
    SwFmtFrmSize aFSz( ATT_MIN_SIZE ), aHSz( ATT_MIN_SIZE );

    USHORT nCols = USHRT_MAX, nColSpace = USHRT_MAX, nAktCol = 0;
    SvUShorts aColumns;

    while( nOpenBrakets && IsParserWorking() )
    {
        switch( nToken = GetNextToken() )
        {
        case '{':
            ++nOpenBrakets;
            break;

        case '}':
            if( 1 == --nOpenBrakets )
            {
                // PageDesc ist fertig, setze am Doc
                pPgFmt->SetAttr( aLR );
                pPgFmt->SetAttr( aUL );
                pPgFmt->SetAttr( aSz );
                ::lcl_SetFmtCol( *pPgFmt, nCols, nColSpace, aColumns );
                if( pPgFmt->GetHeader().GetHeaderFmt() )
                {
                    SwFrmFmt* pHFmt = (SwFrmFmt*)pPgFmt->GetHeader().GetHeaderFmt();
                    pHFmt->SetAttr( aHUL );
                    pHFmt->SetAttr( aHLR );
                    pHFmt->SetAttr( aHSz );
                }
                if( pPgFmt->GetFooter().GetFooterFmt() )
                {
                    SwFrmFmt* pFFmt = (SwFrmFmt*)pPgFmt->GetFooter().GetFooterFmt();
                    pFFmt->SetAttr( aHUL );
                    pFFmt->SetAttr( aHLR );
                    pFFmt->SetAttr( aHSz );
                }
                pDoc->ChgPageDesc( nPos++, *pPg );
            }
            break;

        case RTF_PGDSC:
            if( nPos)   // kein && wg MAC
              if (nPos != pDoc->MakePageDesc(
                                      String::CreateFromInt32( nTokenValue ) ) )
                ASSERT( FALSE, "PageDesc an falscher Position" );

            pPg = &pDoc->_GetPageDesc( nPos );
            pPg->SetLandscape( FALSE );
            pPgFmt = &pPg->GetMaster();
#ifndef CFRONT
    SETPAGEDESC_DEFAULTS:
#endif
            // aSz = pPgFmt->GetFrmSize();
            aSz.SetWidth( 11905 ); aSz.SetHeight( 16837 );      // DIN A4 defaulten
            aLR.SetLeft( 0 );   aLR.SetRight( 0 );
            aUL.SetLower( 0 );  aUL.SetUpper( 0 );
            aHLR.SetLeft( 0 );  aHLR.SetRight( 0 );
            aHUL.SetLower( 0 ); aHUL.SetUpper( 0 );
            aFLR.SetLeft( 0 );  aFLR.SetRight( 0 );
            aFUL.SetLower( 0 ); aFUL.SetUpper( 0 );
            nCols = USHRT_MAX; nColSpace = USHRT_MAX; nAktCol = 0;
            aFSz.SetSizeType( ATT_MIN_SIZE ); aFSz.SetHeight( 0 );
            aHSz.SetSizeType( ATT_MIN_SIZE ); aHSz.SetHeight( 0 );
            break;

        case RTF_PGDSCUSE:
            pPg->WriteUseOn( (UseOnPage)nTokenValue );
            break;

        case RTF_PGDSCNXT:
            // setze erstmal nur die Nummer als Follow. Am Ende der
            // Tabelle wird diese entsprechend korrigiert !!
            if( nTokenValue )
                pPg->SetFollow( (const SwPageDesc*)nTokenValue );
            else
                pPg->SetFollow( &pDoc->GetPageDesc( 0 ) );
            break;

        case RTF_FORMULA:   /* Zeichen "\|" !!! */
            pPgFmt->SetAttr( aLR );
            pPgFmt->SetAttr( aUL );
            pPgFmt->SetAttr( aSz );
            ::lcl_SetFmtCol( *pPgFmt, nCols, nColSpace, aColumns );
            if( pPgFmt->GetHeader().GetHeaderFmt() )
            {
                SwFrmFmt* pHFmt = (SwFrmFmt*)pPgFmt->GetHeader().GetHeaderFmt();
                pHFmt->SetAttr( aHUL );
                pHFmt->SetAttr( aHLR );
                pHFmt->SetAttr( aHSz );
            }
            if( pPgFmt->GetFooter().GetFooterFmt() )
            {
                SwFrmFmt* pFFmt = (SwFrmFmt*)pPgFmt->GetFooter().GetFooterFmt();
                pFFmt->SetAttr( aHUL );
                pFFmt->SetAttr( aHLR );
                pFFmt->SetAttr( aHSz );
            }

            pPgFmt = &pPg->GetLeft();
#ifndef CFRONT
            goto SETPAGEDESC_DEFAULTS;
#else
            aLR.SetLeft( 0 );   aLR.SetRight( 0 );
            aUL.SetLower( 0 );  aUL.SetUpper( 0 );
            aHLR.SetLeft( 0 );  aHLR.SetRight( 0 );
            aHUL.SetLower( 0 ); aHUL.SetUpper( 0 );
            aFLR.SetLeft( 0 );  aFLR.SetRight( 0 );
            aFUL.SetLower( 0 ); aFUL.SetUpper( 0 );
//          aSz = pPgFmt->GetFrmSize();
            aSz.SetWidth( 11905 ); aSz.SetHeight( 16837 );      // DIN A4 defaulten
            nCols = USHRT_MAX; nColSpace = USHRT_MAX; nAktCol = 0;
            aFSz.SetSizeType( ATT_MIN_SIZE ); aFSz.SetHeight( 0 );
            aHSz.SetSizeType( ATT_MIN_SIZE ); aHSz.SetHeight( 0 );
            break;
#endif

        // alt: LI/RI/SA/SB, neu: MARG?SXN
        case RTF_MARGLSXN:
        case RTF_LI:        aLR.SetLeft( (USHORT)nTokenValue );     break;
        case RTF_MARGRSXN:
        case RTF_RI:        aLR.SetRight( (USHORT)nTokenValue );    break;
        case RTF_MARGTSXN:
        case RTF_SA:        aUL.SetUpper( (USHORT)nTokenValue );    break;
        case RTF_MARGBSXN:
        case RTF_SB:        aUL.SetLower( (USHORT)nTokenValue );    break;
        case RTF_PGWSXN:    aSz.SetWidth( nTokenValue );            break;
        case RTF_PGHSXN:    aSz.SetHeight( nTokenValue );           break;

        case RTF_HEADERY:       aHUL.SetUpper( (USHORT)nTokenValue );   break;
        case RTF_HEADER_YB:     aHUL.SetLower( (USHORT)nTokenValue );   break;
        case RTF_HEADER_XL:     aHLR.SetLeft( (USHORT)nTokenValue );    break;
        case RTF_HEADER_XR:     aHLR.SetRight( (USHORT)nTokenValue );   break;
        case RTF_FOOTERY:       aFUL.SetLower( (USHORT)nTokenValue );   break;
        case RTF_FOOTER_YT:     aFUL.SetUpper( (USHORT)nTokenValue );   break;
        case RTF_FOOTER_XL:     aFLR.SetLeft( (USHORT)nTokenValue );    break;
        case RTF_FOOTER_XR:     aFLR.SetRight( (USHORT)nTokenValue );   break;

        case RTF_HEADER_YH:
                if( 0 > nTokenValue )
                {
                    aHSz.SetSizeType( ATT_FIX_SIZE );
                    nTokenValue = -nTokenValue;
                }
                aHSz.SetHeight( (USHORT)nTokenValue );
                break;

        case RTF_FOOTER_YH:
                if( 0 > nTokenValue )
                {
                    aFSz.SetSizeType( ATT_FIX_SIZE );
                    nTokenValue = -nTokenValue;
                }
                aFSz.SetHeight( (USHORT)nTokenValue );
                break;


        case RTF_LNDSCPSXN:     pPg->SetLandscape( TRUE );          break;

        case RTF_COLS:          nCols = (USHORT)nTokenValue;        break;
        case RTF_COLSX:         nColSpace = (USHORT)nTokenValue;    break;

        case RTF_COLNO:
            nAktCol = (USHORT)nTokenValue;
            if( RTF_COLW == GetNextToken() )
            {
                USHORT nWidth = USHORT( nTokenValue ), nSpace = 0;
                if( RTF_COLSR == GetNextToken() )
                    nSpace = USHORT( nTokenValue );
                else
                    SkipToken( -1 );        // wieder zurueck

                if( --nAktCol == ( aColumns.Count() / 2 ) )
                {
                    aColumns.Insert( nWidth, aColumns.Count() );
                    aColumns.Insert( nSpace, aColumns.Count() );
                }
            }
            break;

        case RTF_PAGEBB:
            {
                pPgFmt->SetAttr( SvxFmtBreakItem( SVX_BREAK_PAGE_BEFORE ) );
            }
            break;

        case RTF_HEADER:
        case RTF_HEADERL:
        case RTF_HEADERR:
        case RTF_FOOTER:
        case RTF_FOOTERL:
        case RTF_FOOTERR:
        case RTF_FOOTERF:
        case RTF_HEADERF:
            ReadHeaderFooter( nToken, pPg );

            --nOpenBrakets;     // Klammer wird im ReadAttr ueberlesen!
            break;


        case RTF_TEXTTOKEN:
            if( !DelCharAtEnd( aToken, ';' ).Len() )
                break;
            pPg->SetName( aToken );

            {
                // sollte es eine Vorlage aus dem Pool sein ??
                USHORT n = pDoc->GetPoolId( aToken, GET_POOLID_PAGEDESC );
                if( USHRT_MAX != n )
                    // dann setze bei der Neuen die entsp. PoolId
                    pPg->SetPoolFmtId( n );
            }
            break;

        case RTF_BRDBOX:
            if( 3 == nOpenBrakets )
            {
                ReadBorderAttr( SkipToken( -2 ), (SfxItemSet&)pPgFmt->GetAttrSet() );
                --nOpenBrakets;     // Klammer wird im ReadAttr ueberlesen!
            }
            break;

        case RTF_SHADOW:
            if( 3 == nOpenBrakets )
            {
                ReadAttr( SkipToken( -2 ), (SfxItemSet*)&pPgFmt->GetAttrSet() );
                --nOpenBrakets;     // Klammer wird im ReadAttr ueberlesen!
            }
            break;


        default:
            if( (nToken & ~0xff ) == RTF_SHADINGDEF )
                ReadBackgroundAttr( nToken, (SfxItemSet&)pPgFmt->GetAttrSet() );
            break;
        }
    }


    // setze jetzt noch bei allen die entsprechenden Follows !!
    // Die, die ueber die Tabelle eingelesen wurden und einen
    // Follow definiert haben, ist dieser als Tabposition im
    // Follow schon gesetzt.
    for( nPos = 0; nPos < pDoc->GetPageDescCnt(); ++nPos )
    {
        SwPageDesc* pPgDsc = &pDoc->_GetPageDesc( nPos );
        if( (USHORT)(long)pPgDsc->GetFollow() < pDoc->GetPageDescCnt() )
            pPgDsc->SetFollow( &pDoc->GetPageDesc(
                    (USHORT)(long)pPgDsc->GetFollow() ));
    }

    SetChkStyleAttr( bSaveChkStyleAttr );

    bInPgDscTbl = FALSE;
    nAktPageDesc = 0;
    nAktFirstPageDesc = 0;
    bSwPageDesc = TRUE;
    SkipToken( -1 );
}

// -------------- Methoden --------------------

/*
void SwRTFParser::ReadUnknownData()
{
    SvRTFParser::ReadUnknownData();
}

void SwRTFParser::ReadOLEData()
{
    SvRTFParser::ReadOLEData();
}
*/

void SwRTFParser::ReadPrtData()
{
    // der Eingabe Stream steht auf der aktuellen Position
    USHORT nLen = USHORT( nTokenValue ), nCnt = 0;
    BYTE * pData = new BYTE[ nLen ];

    while( IsParserWorking() )          // lese bis zur schliessenden Klammer
    {
        int nToken = GetNextToken();
        if( RTF_TEXTTOKEN == nToken )
        {
            xub_StrLen nTknLen = HexToBin( aToken );
            if( STRING_NOTFOUND != nTknLen )
            {
                memcpy( pData + nCnt, (sal_Char*)aToken.GetBuffer(), nTknLen );
                nCnt += nTknLen;
            }
        }
        else if( '}' == nToken )
            break;
    }

/*-----------------25.10.94 16:37-------------------
!!! OK 25.10.94 16:37
    // um Byte-Dreher (Mac/Unix/Win) bei der Laenge auszuschliessen,
    // setze hier expliziet die Laenge.
    ((JobSetup*)pData)->nLen = nLen;

    // so, jetzt sind alle Daten gelesen, setze den Bitsack am Document
    // dieser kopiert die Daten !!
    pDoc->SetJobsetup( (JobSetup*)pData );
    delete pData;
--------------------------------------------------*/
    SkipToken( -1 );        // schliessende Klammer wieder zurueck!!
}

static const SwNodeIndex* SetHeader(SwFrmFmt* pHdFtFmt, BOOL bCheck )
{
    SwFrmFmt* pTmp = pHdFtFmt;
    pHdFtFmt = bCheck ? (SwFrmFmt*)pHdFtFmt->GetHeader().GetHeaderFmt() : 0;
    if( !pHdFtFmt )
    {
        // noch keine Header, dann erzeuge einen. Ob die Kopf/Fuss-
        // zeilen angezeigt werden, bestimmen \header? \footer? ...
        pTmp->SetAttr( SwFmtHeader( TRUE ));
        pHdFtFmt = (SwFrmFmt*)pTmp->GetHeader().GetHeaderFmt();
    }
    return  pHdFtFmt->GetCntnt().GetCntntIdx();
}

static const SwNodeIndex* SetFooter(SwFrmFmt* pHdFtFmt, BOOL bCheck)
{
    SwFrmFmt* pTmp = pHdFtFmt;
    pHdFtFmt = bCheck ? (SwFrmFmt*)pHdFtFmt->GetFooter().GetFooterFmt() : 0;
    if( !pHdFtFmt )
    {
        // noch keine Header, dann erzeuge einen. Ob die Kopf/Fuss-
        // zeilen angezeigt werden, bestimmen \header? \footer? ...
        pTmp->SetAttr( SwFmtFooter( TRUE ));
        pHdFtFmt = (SwFrmFmt*)pTmp->GetFooter().GetFooterFmt();
    }
    return pHdFtFmt->GetCntnt().GetCntntIdx();
}


void SwRTFParser::ReadHeaderFooter( int nToken, SwPageDesc* pPageDesc )
{
    ASSERT( RTF_FOOTNOTE == nToken ||
            RTF_FLY_INPARA == nToken ||
            pPageDesc, "PageDesc fehlt" );

    // alle wichtigen Sachen sichern
    SwPosition aSavePos( *pPam->GetPoint() );
    SvxRTFItemStack aSaveStack;
    aSaveStack.Insert( &GetAttrStack(), 0 );
    GetAttrStack().Remove( 0, GetAttrStack().Count() );

    // save the fly array - after read, all flys may be set into
    // the header/footer
    SwFlySaveArr aSaveArray( 255 < aFlyArr.Count() ? aFlyArr.Count() : 255 );
    aSaveArray.Insert( &aFlyArr, 0 );
    aFlyArr.Remove( 0, aFlyArr.Count() );
    BOOL bSetFlyInDoc = TRUE;

    const SwNodeIndex* pSttIdx = 0;
    SwFrmFmt* pHdFtFmt = 0;
    SwTxtAttr* pTxtAttr = 0;
    int bDelFirstChar = FALSE, bIsFootnote = FALSE;
    BOOL bOldGrpStt = IsNewGroup();

    int nOpenBrakets = GetOpenBrakets() - 1;

    switch( nToken )
    {
    case RTF_FOOTNOTE:
        {
            BOOL bIsEndNote = RTF_FTNALT == GetNextToken();
            if( !bIsEndNote )
                SkipToken( -1 );

            SwTxtNode* pTxtNd = pPam->GetNode()->GetTxtNode();
            SwFmtFtn aFtnNote( bIsEndNote );
            xub_StrLen nPos = pPam->GetPoint()->nContent.GetIndex();

            if( nPos && !bFootnoteAutoNum )
            {
                pPam->GetPoint()->nContent--;
                nPos--;
                aFtnNote.SetNumStr( pTxtNd->GetTxt().GetChar( nPos ) );
                ((String&)pTxtNd->GetTxt()).SetChar( nPos, CH_TXTATR_INWORD );
                bDelFirstChar = TRUE;
            }

            pTxtAttr = pTxtNd->Insert( aFtnNote, nPos, nPos,
                        bDelFirstChar ? SETATTR_NOTXTATRCHR : 0 );

            ASSERT( pTxtAttr, "konnte die Fussnote nicht einfuegen/finden" );

            if( pTxtAttr )
                pSttIdx = ((SwTxtFtn*)pTxtAttr)->GetStartNode();
            bIsFootnote = TRUE;

            // wurde an der Position ein Escapement aufgespannt, so entferne
            // das jetzt. Fussnoten sind bei uns immer hochgestellt.
            SvxRTFItemStackTypePtr pTmp = aSaveStack.Top();
            if( pTmp && pTmp->GetSttNodeIdx() ==
                pPam->GetPoint()->nNode.GetIndex() &&
                pTmp->GetSttCnt() == nPos )
                pTmp->GetAttrSet().ClearItem( RES_CHRATR_ESCAPEMENT );
        }
        break;

    case RTF_FLY_INPARA:
        {
            xub_StrLen nPos = pPam->GetPoint()->nContent.GetIndex();
            SfxItemSet aSet( pDoc->GetAttrPool(), RES_FRMATR_BEGIN,
                                            RES_FRMATR_END-1 );
            aSet.Put( SwFmtAnchor( FLY_IN_CNTNT ));
            pHdFtFmt = pDoc->MakeFlySection( FLY_IN_CNTNT, pPam->GetPoint(), &aSet );

            pTxtAttr = pPam->GetNode()->GetTxtNode()->GetTxtAttr(
                                                nPos, RES_TXTATR_FLYCNT );
            ASSERT( pTxtAttr, "konnte den Fly nicht einfuegen/finden" );

            pSttIdx = pHdFtFmt->GetCntnt().GetCntntIdx();
            bSetFlyInDoc = FALSE;
        }
        break;

    case RTF_HEADERF:
    case RTF_HEADER:
        pPageDesc->WriteUseOn( (UseOnPage)(pPageDesc->ReadUseOn() | PD_HEADERSHARE) );
        pHdFtFmt = &pPageDesc->GetMaster();
        pSttIdx = SetHeader( pHdFtFmt, FALSE );
        break;

    case RTF_HEADERL:
        // wir koennen keine linken oder rechten haben, immer beide
        pPageDesc->WriteUseOn( (UseOnPage)(pPageDesc->ReadUseOn() & ~PD_HEADERSHARE) );
        SetHeader( pPageDesc->GetRightFmt(), TRUE );
        pHdFtFmt = pPageDesc->GetLeftFmt();
        pSttIdx = SetHeader(pHdFtFmt, FALSE );
        break;

    case RTF_HEADERR:
        // wir koennen keine linken oder rechten haben, immer beide
        pPageDesc->WriteUseOn( (UseOnPage)(pPageDesc->ReadUseOn() & ~PD_HEADERSHARE) );
        SetHeader( pPageDesc->GetLeftFmt(), TRUE );
        pHdFtFmt = pPageDesc->GetRightFmt();
        pSttIdx = SetHeader(pHdFtFmt, FALSE );
        break;

    case RTF_FOOTERF:
    case RTF_FOOTER:
        pPageDesc->WriteUseOn( (UseOnPage)(pPageDesc->ReadUseOn() | PD_FOOTERSHARE) );
        pHdFtFmt = &pPageDesc->GetMaster();
        pSttIdx = SetFooter(pHdFtFmt, FALSE );
        break;

    case RTF_FOOTERL:
        // wir koennen keine linken oder rechten haben, immer beide
        pPageDesc->WriteUseOn( (UseOnPage)(pPageDesc->ReadUseOn() & ~PD_FOOTERSHARE) );
        SetFooter( pPageDesc->GetRightFmt(), TRUE );
        pHdFtFmt = pPageDesc->GetLeftFmt();
        pSttIdx = SetFooter(pHdFtFmt, FALSE );
        break;

    case RTF_FOOTERR:
        // wir koennen keine linken oder rechten haben, immer beide
        pPageDesc->WriteUseOn( (UseOnPage)(pPageDesc->ReadUseOn() & ~PD_FOOTERSHARE) );
        SetFooter( pPageDesc->GetLeftFmt(), TRUE );
        pHdFtFmt = pPageDesc->GetRightFmt();
        pSttIdx = SetFooter(pHdFtFmt, FALSE );
        break;
    }

    if( !pSttIdx )
        SkipGroup();
    else
    {
        // es ist auf jedenfall jetzt ein TextNode im Kopf/Fusszeilen-Bereich
        // vorhanden. Dieser muss jetzt nur noch gefunden und der neue Cursor
        // dort hinein gesetzt werden.
        SwCntntNode *pNode = pDoc->GetNodes()[ pSttIdx->GetIndex()+1 ]->
                                GetCntntNode();

        // immer ans Ende der Section einfuegen !!
        pPam->GetPoint()->nNode = *pNode->EndOfSectionNode();
        pPam->Move( fnMoveBackward );

        SetNewGroup( TRUE );

        while( !( nOpenBrakets == GetOpenBrakets() && !GetStackPos()) && IsParserWorking() )
        {
            switch( nToken = GetNextToken() )
            {
            case RTF_U:
                if( bDelFirstChar )
                {
                    bDelFirstChar = FALSE;
                    nToken = 0;
                }
                break;

            case RTF_TEXTTOKEN:
                if( bDelFirstChar )
                {
                    if( !aToken.Erase( 0, 1 ).Len() )
                        nToken = 0;
                    bDelFirstChar = FALSE;
                }
                break;
            }
            if( nToken )
                NextToken( nToken );
        }

        SetAllAttrOfStk();
        if( aFlyArr.Count() && bSetFlyInDoc )
            SetFlysInDoc();

        // sollte der letze Node leer sein, dann loesche ihn
        // (\par heisst ja Absatzende und nicht neuer Absatz!)
        DelLastNode();
    }

    // vom FlyFmt noch die richtigen Attribute setzen
    if( pTxtAttr && RES_TXTATR_FLYCNT == pTxtAttr->Which() )
    {
        ASSERT( aFlyArr.Count(), "kein Fly definiert" );
        SwFlySave* pFlySave = aFlyArr[ aFlyArr.Count()-1 ];
        pFlySave->aFlySet.ClearItem( RES_ANCHOR );
        pHdFtFmt->SetAttr( pFlySave->aFlySet );
        aFlyArr.DeleteAndDestroy( aFlyArr.Count() - 1 );
    }

    bFootnoteAutoNum = FALSE;       // default auf aus!

    // und alles wieder zurueck
    *pPam->GetPoint() = aSavePos;
    if( bIsFootnote )
        SetNewGroup( bOldGrpStt );      // Status wieder zurueck
    else
        SetNewGroup( FALSE );           // { - Klammer war kein Group-Start!
    GetAttrStack().Insert( &aSaveStack, 0 );

    aFlyArr.Insert( &aSaveArray, 0 );
    aSaveArray.Remove( 0, aSaveArray.Count() );
}

void SwRTFParser::SetSwgValues( SfxItemSet& rSet )
{
    const SfxPoolItem* pItem;
    // Escapement korrigieren
    if( SFX_ITEM_SET == rSet.GetItemState( RES_CHRATR_ESCAPEMENT, FALSE, &pItem ))
    {
        /* prozentuale Veraenderung errechnen !
            * Formel :      (FontSize * 1/20 ) pts      Escapement * 2
            *               -----------------------  = ----------------
            *                     100%                          x
            */

        // die richtige
        long nEsc = ((SvxEscapementItem*)pItem)->GetEsc();

        // automatische Ausrichtung wurde schon richtig berechnet
        if( DFLT_ESC_AUTO_SUPER != nEsc && DFLT_ESC_AUTO_SUB != nEsc )
        {
            const SvxFontHeightItem& rFH = GetSize( rSet );
            nEsc *= 1000L;
            nEsc /= long(rFH.GetHeight());

            SvxEscapementItem aEsc( (short) nEsc,
                                ((SvxEscapementItem*)pItem)->GetProp());
            rSet.Put( aEsc );
        }
    }

    // TabStops anpassen
    if( SFX_ITEM_SET == rSet.GetItemState( RES_PARATR_TABSTOP, FALSE, &pItem ))
    {
        const SvxLRSpaceItem& rLR = GetLRSpace( rSet );
        SvxTabStopItem aTStop( *(SvxTabStopItem*)pItem );

        register long nOffset = rLR.GetTxtLeft();
        if( nOffset )
        {
            // Tabs anpassen !!
            SvxTabStop* pTabs = (SvxTabStop*)aTStop.GetStart();
            for( USHORT n = aTStop.Count(); n; --n, ++pTabs)
                if( SVX_TAB_ADJUST_DEFAULT != pTabs->GetAdjustment() )
                    pTabs->GetTabPos() -= nOffset;

            // negativer Einzug, dann auf 0 Pos einen Tab setzen
            if( rLR.GetTxtFirstLineOfst() < 0 )
                aTStop.Insert( SvxTabStop() );
        }

        if( !aTStop.Count() )
        {
            const SvxTabStopItem& rDflt = (const SvxTabStopItem&)rSet.
                                GetPool()->GetDefaultItem(RES_PARATR_TABSTOP);
            if( rDflt.Count() )
                aTStop.Insert( &rDflt, 0 );
        }
        rSet.Put( aTStop );
    }
    else if( SFX_ITEM_SET == rSet.GetItemState( RES_LR_SPACE, FALSE, &pItem )
            && ((SvxLRSpaceItem*)pItem)->GetTxtFirstLineOfst() < 0 )
    {
        // negativer Einzug, dann auf 0 Pos einen Tab setzen
        rSet.Put( SvxTabStopItem( 1, 0 ));
    }

    // NumRules anpassen
    if( !bStyleTabValid &&
        SFX_ITEM_SET == rSet.GetItemState( RES_PARATR_NUMRULE, FALSE, &pItem ))
    {
        // dann steht im Namen nur ein Verweis in das ListArray
        SwNumRule* pRule = GetNumRuleOfListNo( ((SwNumRuleItem*)pItem)->
                                                GetValue().ToInt32() );
        if( pRule )
            rSet.Put( SwNumRuleItem( pRule->GetName() ));
        else
            rSet.ClearItem( RES_PARATR_NUMRULE );
    }


/*
 ????????????????????????????????????????????????????????????????????
 ?? muss die LineSpacing Hoehe 200Twip betragen ??
 ?? in rtfitem.hxx wird es auf 0 defaultet. Wenn ja, dann muss hier
 ?? ein neues Item gesetzt werden!!!!
 ????????????????????????????????????????????????????????????????????

    // LineSpacing korrigieren
    if( SFX_ITEM_SET == rSet.GetItemState( RES_PARATR_LINESPACING, FALSE, &pItem ))
    {
        const SvxLineSpacingItem* pLS = (const SvxLineSpacingItem*)pItem;
        SvxLineSpacingItem aNew;

        aNew.SetInterLineSpace( pLS->GetInterLineSpace() );
        aNew.GetLineSpaceRule() = pLS->GetLineSpaceRule();
        aNew.SetPropLineSpace( pLS->GetPropLineSpace() );
        aNew.GetInterLineSpaceRule() = pLS->GetInterLineSpaceRule();

        rSet.Put( aNew );
    }
?????????????????????????????????????????????????????????????????? */

}


SwTxtFmtColl* SwRTFParser::MakeColl( const String& rName, USHORT nPos,
                                        BYTE nOutlineLevel, int& rbCollExist )
{
    if( BYTE(-1) == nOutlineLevel )
        nOutlineLevel = NO_NUMBERING;

    rbCollExist = FALSE;
    SwTxtFmtColl* pColl;
    String aNm( rName );
    if( !aNm.Len() )
    {
        if( !nPos )
        {
            pColl = pDoc->GetTxtCollFromPool( RES_POOLCOLL_STANDARD );
            pColl->SetOutlineLevel( nOutlineLevel );
            return pColl;
        }

        aNm.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "NoName(" ));      // erzeuge einen Namen
        aNm += String::CreateFromInt32( nPos );
        aNm += ')';
    }

    // suche jetzt nach einem Style mit dem gleichen Namen (0=dflt. FmtColl)
    if( 0 != (pColl = pDoc->FindTxtFmtCollByName( aNm ) ) )
    {
        // neues Doc: keine alten Attribute behalten !!
        if( IsNewDoc() )
        {
            pColl->ResetAllAttr();
            pColl->SetOutlineLevel( nOutlineLevel );
        }
        else
            rbCollExist = TRUE;
        return pColl;
    }

    // Collection neu erzeugen
    pColl = pDoc->MakeTxtFmtColl( aNm,
                    pDoc->GetTxtCollFromPool( RES_POOLCOLL_STANDARD ) );

    // sollte es eine Vorlage aus dem Pool sein ??
    USHORT n = pDoc->GetPoolId( aNm, GET_POOLID_TXTCOLL );
    if( USHRT_MAX != n )
        // dann setze bei der Neuen die entsp. PoolId
        pColl->SetPoolFmtId( n );

    pColl->SetOutlineLevel( nOutlineLevel );
    return pColl;
}

SwCharFmt* SwRTFParser::MakeCharFmt( const String& rName, USHORT nPos,
                                    int& rbCollExist )
{
    rbCollExist = FALSE;
    SwCharFmt* pFmt;
    String aNm( rName );
    if( !aNm.Len() )
    {
        aNm.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "NoName(" ));
        aNm += String::CreateFromInt32( nPos );
        aNm += ')';
    }

    // suche jetzt nach einem Style mit dem gleichen Namen (0=dflt. FmtColl)
    if( 0 != (pFmt = pDoc->FindCharFmtByName( aNm ) ) )
    {
        // neues Doc: keine alten Attribute behalten !!
        if( IsNewDoc() )
            pFmt->ResetAllAttr();
        else
            rbCollExist = TRUE;
        return pFmt;
    }

    // Format neu erzeugen
    pFmt = pDoc->MakeCharFmt( aNm, pDoc->GetDfltCharFmt() );

    // sollte es eine Vorlage aus dem Pool sein ??
    USHORT n = pDoc->GetPoolId( aNm, GET_POOLID_CHRFMT );
    if( USHRT_MAX != n )
        // dann setze bei der Neuen die entsp. PoolId
        pFmt->SetPoolFmtId( n );

    return pFmt;
}

void SwRTFParser::SetStyleAttr( SfxItemSet& rCollSet,
                                const SfxItemSet& rStyleSet,
                                const SfxItemSet& rDerivedSet )
{
    rCollSet.Put( rStyleSet );
    if( rDerivedSet.Count() )
    {
        // suche alle Attribute, die neu gesetzt werden:
        const SfxPoolItem* pItem;
        SfxItemIter aIter( rDerivedSet );
        USHORT nWhich = aIter.GetCurItem()->Which();
        while( TRUE )
        {
            switch( rStyleSet.GetItemState( nWhich, FALSE, &pItem ) )
            {
            case SFX_ITEM_DEFAULT:
                // auf default zuruecksetzen
                if( RES_FRMATR_END > nWhich )
                    rCollSet.Put( rCollSet.GetPool()->GetDefaultItem( nWhich ));
                break;
            case SFX_ITEM_SET:
                if( *pItem == *aIter.GetCurItem() )     // gleiches Attribut?
                    // definition kommt aus dem Parent
                    rCollSet.ClearItem( nWhich );       // loeschen
                break;
            }

            if( aIter.IsAtEnd() )
                break;
            nWhich = aIter.NextItem()->Which();
        }
    }
    // und jetzt noch auf unsere Werte abgleichen
    SetSwgValues( rCollSet );
}

SwTxtFmtColl* SwRTFParser::MakeStyle( USHORT nNo, const SvxRTFStyleType& rStyle )
{
    int bCollExist;
    SwTxtFmtColl* pColl = MakeColl( rStyle.sName, USHORT(nNo),
                                    rStyle.nOutlineNo, bCollExist );
    aTxtCollTbl.Insert( nNo, pColl );

    // in bestehendes Dok einfuegen, dann keine Ableitung usw. setzen
    if( bCollExist )
        return pColl;

    USHORT nStyleNo = rStyle.nBasedOn;
    if( nStyleNo != nNo )
    {
        SvxRTFStyleType* pDerivedStyle = GetStyleTbl().Get( nStyleNo );
        SwTxtFmtColl* pDerivedColl = aTxtCollTbl.Get( nStyleNo );
        if( !pDerivedColl )         // noch nicht vorhanden, also anlegen
        {
            // ist die ueberhaupt als Style vorhanden ?
            pDerivedColl = pDerivedStyle
                    ? MakeStyle( nStyleNo, *pDerivedStyle )
                    : pDoc->GetTxtCollFromPool( RES_POOLCOLL_STANDARD );
        }

        if( pColl == pDerivedColl )
            ((SfxItemSet&)pColl->GetAttrSet()).Put( rStyle.aAttrSet );
        else
        {
            pColl->SetDerivedFrom( pDerivedColl );

            // setze die richtigen Attribute
            const SfxItemSet* pDerivedSet;
            if( pDerivedStyle )
                pDerivedSet = &pDerivedStyle->aAttrSet;
            else
                pDerivedSet = &pDerivedColl->GetAttrSet();

            SetStyleAttr( (SfxItemSet&)pColl->GetAttrSet(),
                            rStyle.aAttrSet, *pDerivedSet );
        }
    }
    else
        ((SfxItemSet&)pColl->GetAttrSet()).Put( rStyle.aAttrSet );


    nStyleNo = rStyle.nNext;
    if( nStyleNo != nNo )
    {
        SwTxtFmtColl* pNext = aTxtCollTbl.Get( nStyleNo );
        if( !pNext )            // noch nicht vorhanden, also anlegen
        {
            // ist die ueberhaupt als Style vorhanden ?
            SvxRTFStyleType* pMkStyle = GetStyleTbl().Get( nStyleNo );
            pNext = pMkStyle
                    ? MakeStyle( nStyleNo, *pMkStyle )
                    : pDoc->GetTxtCollFromPool( RES_POOLCOLL_STANDARD );
        }
        pColl->SetNextTxtFmtColl( *pNext );
    }
    return pColl;
}

SwCharFmt* SwRTFParser::MakeCharStyle( USHORT nNo, const SvxRTFStyleType& rStyle )
{
    int bCollExist;
    SwCharFmt* pFmt = MakeCharFmt( rStyle.sName, USHORT(nNo), bCollExist );
    aCharFmtTbl.Insert( nNo, pFmt );

    // in bestehendes Dok einfuegen, dann keine Ableitung usw. setzen
    if( bCollExist )
        return pFmt;

    USHORT nStyleNo = rStyle.nBasedOn;
    if( nStyleNo != nNo )
    {
        SvxRTFStyleType* pDerivedStyle = GetStyleTbl().Get( nStyleNo );
        SwCharFmt* pDerivedFmt = aCharFmtTbl.Get( nStyleNo );
        if( !pDerivedFmt )          // noch nicht vorhanden, also anlegen
        {
            // ist die ueberhaupt als Style vorhanden ?
            pDerivedFmt = pDerivedStyle
                    ? MakeCharStyle( nStyleNo, *pDerivedStyle )
                    : pDoc->GetDfltCharFmt();
        }

        if( pFmt == pDerivedFmt )
            ((SfxItemSet&)pFmt->GetAttrSet()).Put( rStyle.aAttrSet );
        else
        {
            pFmt->SetDerivedFrom( pDerivedFmt );

            // setze die richtigen Attribute
            const SfxItemSet* pDerivedSet;
            if( pDerivedStyle )
                pDerivedSet = &pDerivedStyle->aAttrSet;
            else
                pDerivedSet = &pDerivedFmt->GetAttrSet();

            SetStyleAttr( (SfxItemSet&)pFmt->GetAttrSet(),
                            rStyle.aAttrSet, *pDerivedSet );
        }
    }
    else
        ((SfxItemSet&)pFmt->GetAttrSet()).Put( rStyle.aAttrSet );

    return pFmt;
}

// loesche den letzten Node (Tabelle/Fly/Ftn/..)
void SwRTFParser::DelLastNode()
{
    // sollte der letze Node leer sein, dann loesche ihn
    // (\par heisst ja Absatzende und nicht neuer Absatz!)
    if( !pPam->GetPoint()->nContent.GetIndex() )
    {
        ULONG nNodeIdx = pPam->GetPoint()->nNode.GetIndex();
        SwCntntNode* pCNd = pDoc->GetNodes()[ nNodeIdx ]->GetCntntNode();
        if( pCNd && pCNd->StartOfSectionIndex()+2 <
            pCNd->EndOfSectionIndex() )
        {
            if( GetAttrStack().Count() )
            {
                // Attribut Stack-Eintraege, muessen ans Ende des vorherigen
                // Nodes verschoben werden.
                BOOL bMove = FALSE;
                for( USHORT n = GetAttrStack().Count(); n; )
                {
                    SvxRTFItemStackType* pStkEntry = (SvxRTFItemStackType*)
                                                    GetAttrStack()[ --n ];
                    if( nNodeIdx == pStkEntry->GetSttNode().GetIdx() )
                    {
                        if( !bMove )
                        {
                            pPam->Move( fnMoveBackward );
                            bMove = TRUE;
                        }
                        pStkEntry->SetStartPos( SwxPosition( pPam ) );
                    }
                }
                if( bMove )
                    pPam->Move( fnMoveForward );
            }
            pPam->GetPoint()->nContent.Assign( 0, 0 );
            pPam->SetMark();
            pPam->DeleteMark();
            pDoc->GetNodes().Delete( pPam->GetPoint()->nNode );
        }
    }
}

    // fuer Tokens, die im ReadAttr nicht ausgewertet werden
void SwRTFParser::UnknownAttrToken( int nToken, SfxItemSet* pSet )
{
    switch( nToken )
    {
    case RTF_INTBL:
        {
            if( !pTableNode )           // Tabelle nicht mehr vorhanden ?
                NewTblLine();           // evt. Line copieren
            else
            {
                // Crsr nicht mehr in der Tabelle ?
                if( !pPam->GetNode()->FindTableNode() )
                {
                    ULONG nOldPos = pPam->GetPoint()->nNode.GetIndex();

                    // dann wieder in die letzte Box setzen
                    // (kann durch einlesen von Flys geschehen!)
                    pPam->GetPoint()->nNode = *pTableNode->EndOfSectionNode();
                    pPam->Move( fnMoveBackward );

                    // alle Attribute, die schon auf den nachfolgen zeigen
                    // auf die neue Box umsetzen !!
                    SvxRTFItemStack& rAttrStk = GetAttrStack();
                    const SvxRTFItemStackType* pStk;
                    for( USHORT n = 0; n < rAttrStk.Count(); ++n )
                        if( ( pStk = rAttrStk[ n ])->GetSttNodeIdx() == nOldPos &&
                            !pStk->GetSttCnt() )
                            ((SvxRTFItemStackType*)pStk)->SetStartPos( SwxPosition( pPam ) );
                }
            }
        }
        break;

    case RTF_PAGEBB:
        {
            pSet->Put( SvxFmtBreakItem( SVX_BREAK_PAGE_BEFORE ));
        }
        break;

    case RTF_PGBRK:
        {
            pSet->Put( SvxFmtBreakItem( 1 == nTokenValue ?
                                SVX_BREAK_PAGE_BOTH : SVX_BREAK_PAGE_AFTER ));
        }
        break;

    case RTF_PGDSCNO:
        if( IsNewDoc() && bSwPageDesc &&
            USHORT(nTokenValue) < pDoc->GetPageDescCnt() )
        {
            const SwPageDesc* pPgDsc = &pDoc->GetPageDesc( (USHORT)nTokenValue );
            pDoc->Insert( *pPam, SwFmtPageDesc( pPgDsc ));
        }
        break;

    case RTF_V:
        if( 0 != nTokenValue )
        {
            // alles ueberlesen bis dieses wieder abgeschaltet wird. Durch
            // plain in der Gruppe oder durch V0
            String sHiddenTxt;
            int nOpenBrakets = 0;
            int nOpenHiddens = 1;
            do {
                switch( nToken = GetNextToken() )
                {
                case '}':
                    if( !--nOpenBrakets /*&& IsNewGroup()*/ )
                        // die Klammer wird noch gebraucht!
                        SkipToken( -1 );
                    break;
                case '{':
                    ++nOpenBrakets;
                    break;

                case RTF_V:
                    if( nTokenValue )
                        ++nOpenHiddens;
                    else if( !--nOpenHiddens && 1 == nOpenBrakets )
                        // das wars
                        nOpenBrakets = 0;
                    break;

                case RTF_U:
                    {
                        if( nTokenValue )
                            sHiddenTxt += (sal_Unicode)nTokenValue;
                        else
                            sHiddenTxt += aToken;
                    }
                    break;

                case RTF_TEXTTOKEN:
                    sHiddenTxt += aToken;
                    break;

                case RTF_PLAIN:
                    if( !nOpenHiddens && 1 == nOpenBrakets )
                    {
                        nOpenBrakets = 0;
                        SkipToken( -1 );
                    }
                    break;
                }
            } while( nOpenBrakets && IsParserWorking() );
            if( sHiddenTxt.Len() )
            {
                SwHiddenTxtField aFld( (SwHiddenTxtFieldType*)
                            pDoc->GetSysFldType( RES_HIDDENTXTFLD ),
                            TRUE, aEmptyStr, sHiddenTxt, TRUE );

                pDoc->Insert( *pPam, SwFmtFld( aFld ) );
            }
        }
        break;

    case RTF_CS:
        {
            SwCharFmt* pFmt = aCharFmtTbl.Get( nTokenValue );
            if( pFmt )
                pSet->Put( SwFmtCharFmt( pFmt ));
        }
        break;

    case RTF_LS:
        if( -1 != nTokenValue )
        {
            if( bStyleTabValid )
            {
                // dann ist auch die ListTabelle gueltig, also suche die
                // enstprechende NumRule
                SwNumRule* pRule = GetNumRuleOfListNo( nTokenValue );
                if( pRule )
                    pSet->Put( SwNumRuleItem( pRule->GetName() ));

                if( SFX_ITEM_SET != pSet->GetItemState( FN_PARAM_NUM_LEVEL, FALSE ))
                    pSet->Put( SfxUInt16Item( FN_PARAM_NUM_LEVEL, 0 ));
            }
            else
                // wir sind in der Style-Definitions - Phase. Der Name
                // wird dann spaeter umgesetzt
                pSet->Put( SwNumRuleItem( String::CreateFromInt32( nTokenValue )));
        }
        break;

    case RTF_ILVL:
    case RTF_SOUTLVL:
        {
            BYTE nLevel = MAXLEVEL <= nTokenValue ? MAXLEVEL - 1
                                                  : BYTE( nTokenValue );
            pSet->Put( SfxUInt16Item( FN_PARAM_NUM_LEVEL, nLevel ));
        }
        break;

/*
    case RTF_SBYS:
    case RTF_EXPND:
    case RTF_KEEP:
    case RTF_KEEPN:
*/


    // Revision Time Stamp
/*  case RTF_REVDTTM:
        {
            USHORT nMin, nHour, nDay, nMon, nYear, nDayOfWeek;
// long wird gelesen, wird haben aber nur einen short!!!
            ULONG nDtm = aToken.Copy( 7 );
            //  3         2         1         0
            // 10987654321098765432109876543210
            // DOW|   Y    | M | D  | H  | Min
            //
            nMin       = 0x3F & ( nDtm >>= 0 );
            nHour      = 0x1f & ( nDtm >>= 6 );
            nDay       = 0x1f & ( nDtm >>= 5 );
            nMon       = 0x0F & ( nDtm >>= 5 );
            nYear      =(0x7F & ( nDtm >>= 4 )) + 1900;
            nDayOfWeek = 0x07 & ( nDtm >>= 7 );

            Time aTime( nHour, nMin );
            Date aDate( nDay, nMon, nYear );
        }
        break;
*/
    }
}

void SwRTFParser::ReadInfo( const sal_Char* pChkForVerNo )
{
sal_Char __READONLY_DATA aChkForVerNo[] = "StarWriter";

    // falls nicht schon was vorgegeben wurde, setzen wir unseren Namen
    // rein. Wenn das im Kommentar match, wird im Parser die VersionNummer
    // gelesen und gesetzt
    if( !pChkForVerNo )
        pChkForVerNo = aChkForVerNo;

    SvxRTFParser::ReadInfo( pChkForVerNo );
}


#ifdef USED
void SwRTFParser::SaveState( int nToken )
{
    SvxRTFParser::SaveState( nToken );
}

void SwRTFParser::RestoreState()
{
    SvxRTFParser::RestoreState();
}
#endif

/**/

ULONG SwNodeIdx::GetIdx() const
{
    return aIdx.GetIndex();
}

SvxNodeIdx* SwNodeIdx::Clone() const
{
    return new SwNodeIdx( aIdx );
}

SvxPosition* SwxPosition::Clone() const
{
    return new SwxPosition( pPam );
}

SvxNodeIdx* SwxPosition::MakeNodeIdx() const
{
    return new SwNodeIdx( pPam->GetPoint()->nNode );
}

ULONG   SwxPosition::GetNodeIdx() const
{
    return pPam->GetPoint()->nNode.GetIndex();
}

xub_StrLen SwxPosition::GetCntIdx() const
{
    return pPam->GetPoint()->nContent.GetIndex();
}


/*  */

#ifdef DEBUG_JP

#include <string.h>     // fuer sprintf
#include <stdio.h>
#include <svx/cmapitem.hxx>
#include <svx/colritem.hxx>
#include <svx/cntritem.hxx>
#include <svx/crsditem.hxx>
#include <svx/fontitem.hxx>
#include <svx/kernitem.hxx>
#include <svx/langitem.hxx>
#include <svx/postitem.hxx>
#include <svx/shdditem.hxx>
#include <svx/udlnitem.hxx>
#include <svx/wghtitem.hxx>
#include <svx/wrlmitem.hxx>
#include <svx/adjitem.hxx>

static SvFileStream* pOut = 0;
static void OutAttr( const SfxItemSet& rSet )
{
    if( !rSet.Count() )
        return;

    char sOut[ 200 ];
    SfxItemIter aIter( rSet );
    const SfxPoolItem* pItem = aIter.GetCurItem();
    while( TRUE )
    {
        sOut[0] = 0;
        switch( pItem->Which() )
        {
        case RES_CHRATR_CASEMAP:
            {
                sprintf( sOut,
                    "CaseMap: Style[%d]",
                    ((const SvxCaseMapItem*)pItem)->GetValue() );
            }
            break;
        case RES_CHRATR_COLOR:
            {
                sprintf( sOut,
                    "Color: Red[%d] Green[%d] Blue[%d]",
                    ((const SvxColorItem*)pItem)->GetValue().GetRed(),
                    ((const SvxColorItem*)pItem)->GetValue().GetGreen(),
                    ((const SvxColorItem*)pItem)->GetValue().GetBlue() );
            }
            break;

        case RES_CHRATR_CONTOUR:
            {
                sprintf( sOut,
                        "Contour: Style[%s]",
            ( ((const SvxContourItem*)pItem)->GetValue() ? "ON" : "OFF" ) );
            }
            break;
        case RES_CHRATR_CROSSEDOUT:
            {
                sprintf( sOut,
                    "CrossedOut: Style[%d]",
                    ((const SvxCrossedOutItem*)pItem)->GetValue() );
            }
            break;
        case RES_CHRATR_ESCAPEMENT:
            {
                sprintf( sOut,
                    "Escapement: Style[%d, %d]",
                    ((const SvxEscapementItem*)pItem)->GetEsc(),
                    ((const SvxEscapementItem*)pItem)->GetProp() );
            }
            break;
        case RES_CHRATR_FONT:
            {
                const SvxFontItem& rFont = *(const SvxFontItem*)pItem;
                sprintf( sOut,
                    "Font: Fam[%d] Nm[%s] Pitch[%d] CharSet[%d]",
                    rFont.GetFamily(),
                    rFont.GetFamilyName().GetStr(),
                    rFont.GetPitch(),
                    rFont.GetCharSet() );
            }
            break;
        case RES_CHRATR_FONTSIZE:
            {
                sprintf( sOut,
                    "FontSize: Height[%d]",
                    ((const SvxFontHeightItem*)pItem)->GetHeight() );
            }
            break;
        case RES_CHRATR_KERNING:
            {
                sprintf( sOut,
                    "Kerning: Style[%d]",
                    ((const SvxKerningItem*)pItem)->GetValue() );
            }
            break;
        case RES_CHRATR_LANGUAGE:
            {
                sprintf( sOut,
                    "Language: Style[%d]",
                    ((const SvxLanguageItem*)pItem)->GetValue() );
            }
            break;
        case RES_CHRATR_POSTURE:
            {
                sprintf( sOut,
                    "Posture: Style[%d]",
                    ((const SvxPostureItem*)pItem)->GetValue() );
            }
            break;

        case RES_CHRATR_SHADOWED:
            {
                sprintf( sOut,
                    "Shadowed: Style[%s]",
            ( ((const SvxShadowedItem*)pItem)->GetValue() ? "ON" : "OFF" ) );
            }
            break;

        case RES_CHRATR_UNDERLINE:
            {
                sprintf( sOut,
                    "Underline: Style[%d]",
                    ((const SvxUnderlineItem*)pItem)->GetValue() );
            }
            break;
        case RES_CHRATR_WEIGHT:
            {
                sprintf( sOut,
                    "Weight: Style[%d]",
                    ((const SvxWeightItem*)pItem)->GetValue() );
            }
            break;
        case RES_CHRATR_WORDLINEMODE:
            {
                sprintf( sOut,
                    "WordLine: Style[%s]",
            ( ((const SvxWordLineModeItem*)pItem)->GetValue() ? "ON" : "OFF" ) );
            }
            break;

        case RES_TXTATR_CHARFMT:
            *pOut << "CharFmt: "
                  << ((SwFmtCharFmt*)pItem)->GetCharFmt()->GetName()->GetStr()
                  << endl;
            }
            break;
        case RES_PARATR_LINESPACING:
            {
                sprintf( sOut,
                    "LineSpacing: Size[%d] Sp.Rule[%d] In.Sp.Rule[%d] In.Space[%d] Height[%d]",
                    ((const SvxLineSpacingItem*)pItem)->GetPropLineSpace(),
                    ((const SvxLineSpacingItem*)pItem)->GetLineSpaceRule(),
                    ((const SvxLineSpacingItem*)pItem)->GetInterLineSpaceRule(),
                    ((const SvxLineSpacingItem*)pItem)->GetInterLineSpace(),
                    ((const SvxLineSpacingItem*)pItem)->GetLineHeight() );
            }
            break;

        case RES_PARATR_ADJUST:
            {
                sprintf( sOut,
                    "Adjust: Style[%d]",
                    ((const SvxAdjustItem*)pItem)->GetAdjust() );
            }
            break;
        case RES_PARATR_TABSTOP:
            {
                const SvxTabStopItem & rAttr = *(const SvxTabStopItem*)pItem;
                *pOut << "TabStops: (" << endl;
                for( USHORT n = 0; n < rAttr.Count(); n++ )
                {
                    const SvxTabStop & rTab = rAttr[ n ];
                    sprintf( sOut,
                                "\t\tTabStop: Style[%d] Pos[%d] Around[%c] Fill[%c]",
                                rTab.GetAdjustment(),
                                rTab.GetTabPos(),
                                rTab.GetDecimal(),
                                rTab.GetFill() );
                    *pOut << sOut << endl;
                }
                *pOut << ')' << endl;
                sOut[0] = 0;
            }
            break;
        case RES_PARATR_HYPHENZONE:
                *pOut << "HYPHENZONE" << endl;
                break;

        case RES_LR_SPACE:
            {
                sprintf( sOut,
                    "LRSpace: Left[%d], Right[%d]",
                    ((const SvxLRSpaceItem*)pItem)->GetLeft(),
                    ((const SvxLRSpaceItem*)pItem)->GetRight() );
            }
            break;
        case RES_UL_SPACE:
            {
                sprintf( sOut,
                    "ULSpace: Upper[%d], Lower[%d]",
                    ((const SvxULSpaceItem*)pItem)->GetUpper(),
                    ((const SvxULSpaceItem*)pItem)->GetLower() );
            }
            break;

        case RES_BACKGROUND:
                *pOut << "BACKGROUND" << endl;
                break;
        case RES_BOX:
                *pOut << "BOX" << endl;
                break;
        case RES_SHADOW:
                *pOut << "SHADOW" << endl;
                break;

        default:
            sprintf( sOut, "UnknownItem: %d", pItem->Which() );
        }

        if( sOut[0] )
            *pOut << sOut << endl;

        if( aIter.IsAtEnd() )
            break;
        pItem = aIter.NextItem();
    }
}

static void OutStyle( const SwPaM& rPam, const SwTxtFmtColl& rColl )
{
    char sOut[ 200 ];
    sprintf( sOut, "Style: [%5d|%5d] - [%5d|%5d]",
        rPam.GetMark()->nNode.GetIndex(),
        rPam.GetMark()->nContent.GetIndex(),
        rPam.GetPoint()->nNode.GetIndex(),
        rPam.GetPoint()->nContent.GetIndex() );
    *pOut << sOut
        << " ®"
        << rColl.GetName()->GetStr()
        << "¯ {" << endl;
    OutAttr( rColl.GetAttrSet() );
    *pOut << '}' << endl;
}

static void OutSet( const SwPaM& rPam, const SfxItemSet& rSet )
{
    char sOut[ 200 ];
    sprintf( sOut, "Attr: [%5d|%5d] - [%5d|%5d] {",
        rPam.GetMark()->nNode.GetIndex(),
        rPam.GetMark()->nContent.GetIndex(),
        rPam.GetPoint()->nNode.GetIndex(),
        rPam.GetPoint()->nContent.GetIndex() );
    *pOut << sOut << endl;
    OutAttr( rSet );
    *pOut << '}' << endl;
}

static void OutText( const SwPaM& rPam, const char* pText )
{
    char sOut[ 200 ];
    sprintf( sOut, "Text: [%5d|%5d] - [%5d|%5d]",
        rPam.GetMark()->nNode.GetIndex(),
        rPam.GetMark()->nContent.GetIndex(),
        rPam.GetPoint()->nNode.GetIndex(),
        rPam.GetPoint()->nContent.GetIndex() );
    *pOut << sOut
        << " ®"
        << pText
        << '¯' << endl;
}

static void DumpStart()
{
    TempFile aTempFile;

    pOut = new SvFileStream( aTempFile.GetName(),
                            STREAM_WRITE | STREAM_TRUNC );
    *pOut << "Dump des RTF30-Parsers" << endl;
}

static void DumpEnde()
{
    *pOut  << endl<< "Das wars" << endl;
    delete pOut;
    pOut = 0;
}

#endif


/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/rtf/swparrtf.cxx,v 1.1.1.1 2000-09-18 17:14:56 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.159  2000/09/18 16:04:51  willem.vandorp
      OpenOffice header added.

      Revision 1.158  2000/08/07 15:13:02  jp
      Bug #77342#: use String::CreateFromInt32

      Revision 1.157  2000/08/04 10:48:19  jp
      Soft-/HardHyphens & HardBlanks changed from attribute to unicode character; use rtfout functions

      Revision 1.156  2000/07/20 13:16:26  jp
      change old txtatr-character to the two new characters

      Revision 1.155  2000/06/13 09:42:01  os
      using UCB

      Revision 1.154  2000/05/26 07:22:44  os
      old SW Basic API Slots removed

      Revision 1.153  2000/05/09 17:23:01  jp
      Changes for Unicode

      Revision 1.152  2000/03/21 16:30:56  jp
      Bug #74351# ReadSectControls: reset column from the first pagedesc too

      Revision 1.151  2000/03/14 17:25:21  jp
      Bug #73968#: read and set outline/num-levels

      Revision 1.150  2000/03/14 09:22:29  jp
      Bug #73941#: remove unused numrules, share override rules

      Revision 1.149  2000/02/24 18:31:42  jp
      Bug #73480#: ReadSectControls - dont set columns at PageDesc and Region

      Revision 1.148  2000/02/11 17:36:06  jp
      Bug #72146#: read UniCode character

      Revision 1.147  2000/02/11 14:38:06  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.146  2000/01/25 20:13:27  jp
      Bug #72146#: read UniCode character

      Revision 1.145  2000/01/07 12:26:54  jp
      Task #71411#: read/write NoBalancedColumns

      Revision 1.144  1999/12/13 13:15:42  jp
      Bug #70916#: ROW - skip to the end of the current line and then move the cursor one node forward

*************************************************************************/

diff --git a/sw/source/filter/rtf/swparrtf.hxx b/sw/source/filter/rtf/swparrtf.hxx
new file mode 100644
index 0000000..a6a889e8
--- /dev/null
+++ b/sw/source/filter/rtf/swparrtf.hxx
@@ -0,0 +1,437 @@
/*************************************************************************
 *
 *  $RCSfile: swparrtf.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:56 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWPARRTF_HXX
#define _SWPARRTF_HXX

#ifndef _SVSTDARR_HXX
#define _SVSTDARR_BOOLS
#include <svtools/svstdarr.hxx>
#endif
#ifndef _SVXRTF_HXX //autogen
#include <svx/svxrtf.hxx>
#endif

#ifndef _NDINDEX_HXX
#include <ndindex.hxx>
#endif

class Font;
class Graphic;

class SwNoTxtNode;
class Size;
class SwPaM;
class SwDoc;
class SwPageDesc;
class SwTxtFmtColl;
class SwTableNode;
class SwCharFmt;
class SwNumFmt;
class SwNumRule;
class SwRTFParser;
class SvxFontItem;
class SwRelNumRuleSpaces;
class SwNodeNum;
class SwTxtNode;
struct SvxRTFPictureType;


class SwNodeIdx : public SvxNodeIdx
{
    SwNodeIndex aIdx;
public:
    SwNodeIdx( const SwNodeIndex& rIdx ) : aIdx( rIdx ) {}
    virtual ULONG   GetIdx() const;
    virtual SvxNodeIdx* Clone() const;
};

class SwxPosition : public SvxPosition
{
    SwPaM* pPam;
public:
    SwxPosition( SwPaM* pCrsr ) : pPam( pCrsr ) {}

    virtual ULONG   GetNodeIdx() const;
    virtual xub_StrLen GetCntIdx() const;

    // erzeuge von sich selbst eine Kopie
    virtual SvxPosition* Clone() const;
    // erzeuge vom NodeIndex eine Kopie
    virtual SvxNodeIdx* MakeNodeIdx() const;
};


// zum zwischenspeichern der Flys:
struct SwFlySave
{
    SfxItemSet  aFlySet;
    SwNodeIndex nSttNd, nEndNd;
    SwTwips     nPageWidth;
    xub_StrLen  nEndCnt;
    USHORT      nDropLines, nDropAnchor;

    SwFlySave( const SwPaM& rPam, SfxItemSet& rSet );
    int IsEqualFly( const SwPaM& rPos, SfxItemSet& rSet );
    void SetFlySize( const SwTableNode& rTblNd );
};

struct SwListEntry
{
    long nListId, nListTemplateId, nListNo;
    USHORT nListDocPos;
    BOOL bRuleUsed;

    SwListEntry()
        : nListId( 0 ), nListTemplateId( 0 ), nListNo( 0 ), nListDocPos( 0 ),
        bRuleUsed( FALSE )
    {}
    SwListEntry( long nLstId, long nLstTmplId, USHORT nLstDocPos )
        : nListId( nLstId ), nListTemplateId( nLstTmplId ), nListNo( 0 ),
        nListDocPos( nLstDocPos ), bRuleUsed( FALSE )
    {}

    void Clear() { nListId = nListTemplateId = nListNo = 0, nListDocPos = 0;
                    bRuleUsed = FALSE; }
};

DECLARE_TABLE( SwRTFStyleTbl, SwTxtFmtColl* )
DECLARE_TABLE( SwRTFCharStyleTbl, SwCharFmt* )
typedef SwFlySave* SwFlySavePtr;
SV_DECL_PTRARR_DEL( SwFlySaveArr, SwFlySavePtr, 0, 20 )
SV_DECL_VARARR( SwListArr, SwListEntry, 0, 20 )


class SwRTFParser : public SvxRTFParser
{
    SwRTFStyleTbl aTxtCollTbl;
    SwRTFCharStyleTbl aCharFmtTbl;
    SwFlySaveArr aFlyArr;               // Flys als Letzes im Doc setzen
    SvBools aMergeBoxes;                // Flags fuer gemergte Zellen
    SwListArr aListArr;
    SvPtrarr aTblFmts;

    SfxItemSet* pGrfAttrSet;
    SwTableNode* pTableNode, *pOldTblNd; // fuers Lesen von Tabellen: akt. Tab
    SwNodeIndex* pSttNdIdx;
    SwNodeIndex* pRegionEndIdx;
    SwDoc*  pDoc;
    SwPaM*  pPam;               // SwPosition duerfte doch reichen, oder ??
    SwRelNumRuleSpaces* pRelNumRule;    // Liste aller benannten NumRules

    USHORT nAktPageDesc, nAktFirstPageDesc;
    USHORT nAktBox;                     // akt. Box
    USHORT nInsTblRow;          // beim nach \row kein \pard -> neue Line anlegen
    USHORT nNewNumSectDef;      // jeder SectionWechsel kann neue Rules definieren

    BOOL bSwPageDesc : 1;
    BOOL bReadSwFly : 1;        // lese Swg-Fly (wichtig fuer Bitmaps!)
    BOOL bReadNoTbl : 1;        // verhinder Tabelle in Tabelle/FootNote
    BOOL bFootnoteAutoNum : 1;  // automatische Numerierung ?
    BOOL bStyleTabValid : 1;    // Styles schon erzeugt ?
    BOOL bInPgDscTbl : 1;       // beim PageDescTbl lesen
    BOOL bNewNumList : 1;       // Word 7.0 NumList gelesen, 6.0 ueberspringen
    BOOL bFirstContinue: 1;     // 1.Call ins Continue
    BOOL bFirstDocControl: 1;   // 1.Call of ReadDocControl


    virtual void InsertPara();
    virtual void InsertText();
    virtual void MovePos( int bForward = TRUE );
    virtual void SetEndPrevPara( SvxNodeIdx*& rpNodePos, xub_StrLen& rCntPos );

    void CheckInsNewTblLine();

    // setze RTF-Werte auf Swg-Werte
    void SetSwgValues( SfxItemSet& rSet );

    virtual void ReadInfo( const sal_Char* pChkForVerNo = 0 );

    void ReadListLevel( SwNumRule& rRule, BYTE nLvl );
    void ReadListTable();
    void ReadListOverrideTable();
    void ReadNumSecLevel( int nToken );
    SwNumRule* GetNumRuleOfListNo( long nListNo,
                                    BOOL bRemoveFromList = FALSE );
    void RemoveUnusedNumRule( SwNumRule* );
    void RemoveUnusedNumRules();
    const Font* FindFontOfItem( const SvxFontItem& rItem ) const;

    // 3 Methoden zum Aufbauen der Styles
    SwTxtFmtColl* MakeColl( const String&, USHORT nPos, BYTE nOutlineLevel,
                            int& rbCollExist );
    SwCharFmt* MakeCharFmt( const String& rName, USHORT nPos,
                            int& rbCollExist );
    void SetStyleAttr( SfxItemSet& rCollSet,
                        const SfxItemSet& rStyleSet,
                        const SfxItemSet& rDerivedSet );
    SwTxtFmtColl* MakeStyle( USHORT nNo, const SvxRTFStyleType& rStyle );
    SwCharFmt* MakeCharStyle( USHORT nNo, const SvxRTFStyleType& rStyle );
    void MakeStyleTab();

    int MakeFieldInst( String& rFieldStr );
    SwPageDesc* _MakeNewPageDesc( int bFirst );

    // einlesen/einfuegen von Bitmaps
    void InsPicture( const String& rNm,
                    const Graphic* = 0, const SvxRTFPictureType* = 0 );
    void _SetPictureSize( const SwNoTxtNode& rNd, const SwNodeIndex& rAnchor,
                            SfxItemSet& rSet, const SvxRTFPictureType* = 0  );

    void SetFlysInDoc();
    void GetPageSize( Size& rSize );        // Groesse der PagePrintArea

    // fuers Einlesen von Tabellen
    void GotoNextBox();
    void NewTblLine();

    void DelLastNode();         // loesche den letzten Node (Tabelle/Fly/Ftn/..)

    void AddNumRule( SwNumRule* pRule );
    void SetNumRelSpaces();
    void SetOultineRelSpaces( const SwNodeIndex& rStt,
                                const SwNodeIndex& rEnd );
    void SetNumLSpace( SwTxtNode& rNd, const SwNodeNum& rNum,
                                const SwNumRule& rRule );

protected:
    // wird fuer jedes Token gerufen, das in CallParser erkannt wird
    virtual void NextToken( int nToken );

//  virtual void ReadUnknownData();
    virtual void ReadBitmapData();
#ifdef READ_OLE_OBJECT
    virtual void ReadOLEData();
#endif
    virtual void SetAttrInDoc( SvxRTFItemStackType &rSet );
    // fuer Tokens, die im ReadAttr nicht ausgewertet werden
    virtual void UnknownAttrToken( int nToken, SfxItemSet* pSet );

    void ReadPrtData();
    void ReadField();
    void ReadHeaderFooter( int nToken, SwPageDesc* pPageDesc = 0 );
    void ReadDocControls( int nToken );
    void ReadSectControls( int nToken );
    void ReadFly( int nToken, SfxItemSet* pFillSet = 0 );
    void ReadTable( int nToken );
    void ReadPageDescTbl();

    virtual ~SwRTFParser();

public:
    SwRTFParser( SwDoc* pD, const SwPaM& rCrsr, SvStream& rIn,
                        int bReadNewDoc = TRUE );

    virtual SvParserState CallParser(); // Aufruf des Parsers
    virtual int IsEndPara( SvxNodeIdx* pNd, xub_StrLen nCnt ) const;

    // fuers asynchrone lesen aus dem SvStream
//  virtual void SaveState( int nToken );
//  virtual void RestoreState();
    virtual void Continue( int nToken );
};

/*************************************************************************

      $Log: not supported by cvs2svn $
      Revision 1.45  2000/09/18 16:04:51  willem.vandorp
      OpenOffice header added.

      Revision 1.44  2000/09/09 12:53:29  willem.vandorp
      Header and footer replaced

      Revision 1.43  2000/05/09 17:23:05  jp
      Changes for Unicode

      Revision 1.42  2000/04/14 14:00:41  khz
      Task #70451# use CalculateFlySize() for WW frames with 'auto'width

      Revision 1.41  2000/03/14 09:22:33  jp
      Bug #73941#: remove unused numrules, share override rules

      Revision 1.40  1999/08/03 17:43:08  JP
      Bug #68028#,#68026#,#67983#,#67982#: changes for import of PageDesc from interleave/WP7/Aplixware


      Rev 1.39   03 Aug 1999 19:43:08   JP
   Bug #68028#,#68026#,#67983#,#67982#: changes for import of PageDesc from interleave/WP7/Aplixware

      Rev 1.38   19 Apr 1999 12:48:50   JP
   Vorbereitungen fuer OLE-Objecte in RTF lesen (anstoss ist Bug #60140#)

      Rev 1.37   18 Mar 1999 09:51:50   JP
   Task #63049#: Numerierung mit rel. Einzuegen

      Rev 1.36   16 Mar 1999 23:20:00   JP
   Task #63049#: Einzuege bei NumRules relativ

      Rev 1.35   05 Mar 1999 14:27:58   JP
   Bug #57749#: spaltige Bereiche einlesen - jeder Bereich hat eigene NumRules

      Rev 1.34   03 Mar 1999 15:17:24   JP
   Bug #57749#: spaltige Bereiche einlesen

      Rev 1.33   24 Feb 1999 19:51:32   JP
   Task #62314#: Asynchrone DDE-Links/-Requests

      Rev 1.32   21 Sep 1998 17:16:14   JP
   DropCaps unterstuetzen

      Rev 1.31   13 Aug 1998 10:33:24   JP
   Bug #53525#: Tabellen - an den Kanten keine doppelte Umrandung mehr

      Rev 1.30   27 May 1998 22:26:16   JP
   Bug #50585#: ListOverrideTabelle korrekt einlesen

      Rev 1.29   20 Apr 1998 17:43:20   JP
   neu: Numerierung lesen/schreiben

      Rev 1.28   06 Apr 1998 14:46:30   JP
   Erweiterungen fuer Numerierungen (97-Vers.)

      Rev 1.27   03 Apr 1998 18:51:52   JP
   RTF-Parser um neue Tokens erweitert

      Rev 1.26   11 Feb 1998 14:07:20   JP
   kleinere Bugs behoben bei Rahmen & Tabellen

      Rev 1.25   26 Jan 1998 20:54:50   JP
   Bug #45958#: Continue - die gesplitteten Nodes richtig zusammenfassen, neu: Zeichenvorlagen lesen

      Rev 1.24   09 Oct 1997 14:27:52   JP
   Umstellung NodeIndex/-Array/BigPtrArray

      Rev 1.23   01 Sep 1997 20:09:02   JP
   Bug #43126#: Flag fuers Einfuegen in Numerierungen

      Rev 1.22   11 Aug 1997 13:59:42   OM
   Headerfile-Umstellung

      Rev 1.21   27 Jun 1997 11:34:36   JP
   Bug #40723#: erst pard oder neue Ebene nach einem row hebt die Tabelle auf

      Rev 1.20   23 Oct 1996 12:42:24   JP
   SVMEM -> SVSTDARR Umstellung

      Rev 1.19   04 Jul 1996 15:02:30   JP
   Tabellen einlesen korrigiert

      Rev 1.18   28 Jun 1996 15:07:26   MA
   includes

      Rev 1.17   18 Jun 1996 16:35:38   JP
   ReadFly: erweitert um optionalen Itemset erweitert(FlyInFly lesen)

      Rev 1.16   12 Jun 1996 16:49:36   JP
   PageDesc: Header/Footer richtig einlesen

      Rev 1.15   08 May 1996 18:33:20   JP
   Erweiterung fuers asynchrone Laden

      Rev 1.14   25 Apr 1996 13:57:16   MIB
   Verschiebung SvHTMLParser in Gooedies

      Rev 1.13   25 Apr 1996 09:24:30   JP
   SwPictureType in svx exportiert

      Rev 1.12   12 Feb 1996 12:45:50   JP
   StyleTabelle auch aufbauen wenn sie gebraucht wird

      Rev 1.11   13 Dec 1995 10:35:58   MA
   opt: Bessere Defaults fuer Arrays

      Rev 1.10   30 Oct 1995 21:18:58   JP
   intbl refernziert auch vorher eingelesene Tabellen

      Rev 1.9   11 Oct 1995 20:31:48   HJS
   umbenennung

      Rev 1.8   23 Feb 1995 09:37:06   JP
   Methode RTFPardPlain wird nicht mehr benoetigt

      Rev 1.7   08 Feb 1995 09:49:14   JP
   alten RTF-Parser entfernt, Sw_RTF -> SwRTF

      Rev 1.6   18 Jan 1995 19:53:48   JP
   Footnote: beachte fuehrende Zeichen

      Rev 1.5   15 Jan 1995 20:34:12   JP
   Einfuegen in bestehendes Doc: Vorlagen richtig behandeln

      Rev 1.4   11 Jan 1995 19:45:30   JP
   RTF-Reader fertiggestellt

      Rev 1.3   09 Jan 1995 08:25:12   JP
   aus rtffly.cxx SwFlySave public gemacht

      Rev 1.2   06 Jan 1995 12:08:28   JP
   lesen von Tabellen zugefuegt

      Rev 1.1   23 Dec 1994 08:39:28   JP
   forward deklaration zugefuegt

      Rev 1.0   22 Dec 1994 17:38:36   JP
   Initial revision.

*************************************************************************/

#endif
    //_SWPARRTF_HXX

diff --git a/sw/source/filter/rtf/wrtrtf.cxx b/sw/source/filter/rtf/wrtrtf.cxx
new file mode 100644
index 0000000..c5abaa8
--- /dev/null
+++ b/sw/source/filter/rtf/wrtrtf.cxx
@@ -0,0 +1,1593 @@
/*************************************************************************
 *
 *  $RCSfile: wrtrtf.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:56 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#include <stdlib.h>

#define ITEMID_BOXINFO      SID_ATTR_BORDER_INNER
#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _STREAM_HXX //autogen
#include <tools/stream.hxx>
#endif
#ifndef _DATETIME_HXX //autogen
#include <tools/datetime.hxx>
#endif
#ifndef _RTL_TENCINFO_H
#include <rtl/tencinfo.h>
#endif
#ifndef _RTFKEYWD_HXX //autogen
#include <svtools/rtfkeywd.hxx>
#endif
#ifndef _RTFOUT_HXX
#include <svtools/rtfout.hxx>
#endif
#ifndef _SFXDOCINF_HXX //autogen
#include <sfx2/docinf.hxx>
#endif
#ifndef _SVX_PAPERINF_HXX //autogen
#include <svx/paperinf.hxx>
#endif
#ifndef _SVX_FONTITEM_HXX //autogen
#include <svx/fontitem.hxx>
#endif
#ifndef _SVX_SHADITEM_HXX //autogen
#include <svx/shaditem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _SVX_COLRITEM_HXX //autogen
#include <svx/colritem.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_TSTPITEM_HXX //autogen
#include <svx/tstpitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_BRKITEM_HXX //autogen
#include <svx/brkitem.hxx>
#endif


#ifndef _FMTPDSC_HXX //autogen
#include <fmtpdsc.hxx>
#endif
#ifndef _FMTCNTNT_HXX //autogen
#include <fmtcntnt.hxx>
#endif
#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _FMTHDFT_HXX //autogen
#include <fmthdft.hxx>
#endif
#ifndef _FRMATR_HXX
#include <frmatr.hxx>
#endif
#ifndef _DOCARY_HXX
#include <docary.hxx>
#endif
#ifndef _PAM_HXX
#include <pam.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _PARATR_HXX
#include <paratr.hxx>
#endif
#ifndef _FLDBAS_HXX
#include <fldbas.hxx>
#endif
#ifndef _NDTXT_HXX
#include <ndtxt.hxx>
#endif
#ifndef _WRTRTF_HXX
#include <wrtrtf.hxx>
#endif
#ifndef _FMTCOL_HXX
#include <fmtcol.hxx>
#endif
#ifndef _FLYPOS_HXX
#include <flypos.hxx>
#endif
#ifndef _BOOKMRK_HXX
#include <bookmrk.hxx>      // fuer SwBookmark ...
#endif
#ifndef _PAGEDESC_HXX
#include <pagedesc.hxx>     // fuer SwPageDesc...
#endif
#ifndef _NUMRULE_HXX
#include <numrule.hxx>
#endif
#ifndef _FTNINFO_HXX
#include <ftninfo.hxx>
#endif
#ifndef _CHARFMT_HXX
#include <charfmt.hxx>
#endif
#ifndef _SECTION_HXX //autogen
#include <section.hxx>
#endif
#ifndef _SWTABLE_HXX
#include <swtable.hxx>      // fuer SwPageDesc ...
#endif

#ifndef _SWSWERROR_H
#include <swerror.h>
#endif
#ifndef _MDIEXP_HXX
#include <mdiexp.hxx>       // ...Percent()
#endif
#ifndef _STATSTR_HRC
#include <statstr.hrc>      // ResId fuer Statusleiste
#endif

#if defined(MAC)
const sal_Char SwRTFWriter::sNewLine = '\015';
#elif defined(UNX)
const sal_Char SwRTFWriter::sNewLine = '\012';
#else
const sal_Char __FAR_DATA SwRTFWriter::sNewLine[] = "\015\012";
#endif



SV_DECL_VARARR( RTFColorTbl, Color, 5, 2 )
SV_IMPL_VARARR( RTFColorTbl, Color )


SwRTFWriter::SwRTFWriter( const String& rFltName )
{
    // schreibe Win-RTF-HelpFileFmt
    bWriteHelpFmt = 'W' == rFltName.GetChar( 0 );
    // schreibe nur Gliederungs Absaetze
    bOutOutlineOnly = 'O' == rFltName.GetChar( 0 );
}


SwRTFWriter::~SwRTFWriter() {}



ULONG SwRTFWriter::WriteStream()
{
    bOutPageAttr = bOutSection = TRUE;

    bOutStyleTab = bOutTable = bOutPageDesc = bOutPageDescTbl =
    bAutoAttrSet = bOutListNumTxt = bOutLeftHeadFoot = bIgnoreNextPgBreak =
        FALSE;

    nFontHeight = 0;
    nBkmkTabPos = USHRT_MAX;
    pAktPageDesc = 0;
    pAttrSet = 0;
    pFlyFmt = 0;        // kein FlyFrmFormat gesetzt

    pColTbl = new RTFColorTbl;

    BYTE nSz = (BYTE)Min( pDoc->GetSpzFrmFmts()->Count(), USHORT(255) );
    SwPosFlyFrms aFlyPos( nSz, nSz );

    //Abkuerzung wenn nur Gliederung ausgegeben werden soll, und keine
    //Gliederungsabsaetze ausserhalb des Body stehen.
    if ( bOutOutlineOnly &&
         pDoc->GetNodes().GetOutLineNds().Count() &&
         pDoc->GetNodes().GetOutLineNds()[0]->GetIndex() >
         pDoc->GetNodes().GetEndOfExtras().GetIndex() )
    {
        nAktFlyPos = 0;
        pFlyPos = 0;
        MakeHeader();

        const SwOutlineNodes &rOutLine = pDoc->GetNodes().GetOutLineNds();
        for ( USHORT i = 0; i < rOutLine.Count(); ++i )
        {
            const SwNode *pNd = pDoc->GetNodes()[*rOutLine[i]];
            ASSERT( pNd->IsCntntNode(), "Outlinenode and no CntNode!?" );

            SwCntntNode* pCNd = (SwCntntNode*)pNd;

            // erfrage den aktuellen PageDescriptor.
            const SwPageDesc* pTmp = pCNd->GetSwAttrSet().GetPageDesc().GetPageDesc();
            if( pTmp )
                pAktPageDesc = pTmp;
            pCurPam->GetPoint()->nContent.Assign( pCNd, 0 );
            Out( aRTFNodeFnTab, *pCNd, *this );
        }
    }
    else
    {
        long nMaxNode = pDoc->GetNodes().Count();

        if( bShowProgress )
            ::StartProgress( STR_STATSTR_W4WWRITE, 0, nMaxNode, pDoc->GetDocShell() );

        // Tabelle am Doc.-Anfang beachten
        {
            SwTableNode * pTNd = pCurPam->GetNode()->FindTableNode();
            if( pTNd && bWriteAll )
            {
                // mit dem TabellenNode anfangen !!
                pCurPam->GetPoint()->nNode = *pTNd;

                if( bWriteOnlyFirstTable )
                    pCurPam->GetMark()->nNode = *pTNd->EndOfSectionNode();
            }
        }

        // Tabelle fuer die freifliegenden Rahmen erzeugen, aber nur wenn
        // das gesamte Dokument geschrieben wird
        nAktFlyPos = 0;
        pDoc->GetAllFlyFmts( aFlyPos, bWriteAll ? 0 : pOrigPam );

        // sollten nur Rahmen vorhanden sein?
        // (Moeglich, wenn eine Rahmen-Selektion ins Clipboard
        // gestellt wurde)
        if( bWriteAll &&
            // keine Laenge
            *pCurPam->GetPoint() == *pCurPam->GetMark() &&
            // Rahmen vorhanden
            pDoc->GetSpzFrmFmts()->Count() && !aFlyPos.Count() &&
            // nur ein Node im Array
            pDoc->GetNodes().GetEndOfExtras().GetIndex() + 3 ==
            pDoc->GetNodes().GetEndOfContent().GetIndex() &&
            // und genau der ist selektiert
            pDoc->GetNodes().GetEndOfContent().GetIndex() - 1 ==
            pCurPam->GetPoint()->nNode.GetIndex() )
        {
            // dann den Inhalt vom Rahmen ausgeben.
            // dieser steht immer an Position 0 !!
            SwFrmFmt* pFmt = (*pDoc->GetSpzFrmFmts())[ 0 ];
            const SwNodeIndex* pIdx = pFmt->GetCntnt().GetCntntIdx();
            if( pIdx )
            {
                SwPosFlyFrm* pFPos = new SwPosFlyFrm( pCurPam->GetPoint()->nNode,
                                                        pFmt, aFlyPos.Count() );
                aFlyPos.Insert( pFPos );
            }
        }

        pFlyPos = &aFlyPos;

        // schreibe die StyleTabelle, allgemeine Angaben,Header/Footer/Footnotes
        MakeHeader();

        Out_SwDoc( pOrigPam );

        if( bShowProgress )
            ::EndProgress( pDoc->GetDocShell() );
    }

    Strm() << '}';

    // loesche die Tabelle mit den freifliegenden Rahmen
    for( USHORT i = aFlyPos.Count(); i > 0; )
        delete aFlyPos[ --i ];

    pFlyPos = 0;
    delete pColTbl;

    // schreibe Win-RTF-HelpFileFmt
    bOutOutlineOnly = bWriteHelpFmt = FALSE;
    pAttrSet = 0;

    return 0;
}


void SwRTFWriter::Out_SwDoc( SwPaM* pPam )
{
    BOOL bSaveWriteAll = bWriteAll;     // sichern
    // suche die naechste Bookmark-Position aus der Bookmark-Tabelle
    nBkmkTabPos = bWriteAll ? FindPos_Bkmk( *pCurPam->GetPoint() ) : USHRT_MAX;

    // gebe alle Bereiche des Pams in das RTF-File aus.
    do {
        bWriteAll = bSaveWriteAll;
        bFirstLine = TRUE;

        // suche den ersten am Pam-auszugebenen FlyFrame
        // fehlt noch:

        while( pCurPam->GetPoint()->nNode < pCurPam->GetMark()->nNode ||
              (pCurPam->GetPoint()->nNode == pCurPam->GetMark()->nNode &&
               pCurPam->GetPoint()->nContent.GetIndex() <= pCurPam->GetMark()->nContent.GetIndex()) )
        {
            SwNode& rNd = pCurPam->GetPoint()->nNode.GetNode();

            if( &rNd == &pDoc->GetNodes().GetEndOfContent() )
                break;

            if( rNd.IsCntntNode() )
            {
                SwCntntNode& rCNd = (SwCntntNode&)rNd;

                OutBreaks( rCNd.GetSwAttrSet() );
                OutFlyFrm();

                if( !bFirstLine )
                    pCurPam->GetPoint()->nContent.Assign( &rCNd, 0 );

                if( !bOutOutlineOnly ||
                    ( rCNd.IsTxtNode() && NO_NUMBERING !=
                        ((SwTxtNode&)rCNd).GetTxtColl()->GetOutlineLevel() ))
                    Out( aRTFNodeFnTab, rCNd, *this );

            }
            else if( !bOutOutlineOnly )
            {
                if( rNd.IsTableNode() )
                {
                    OutBreaks( ((SwTableNode&)rNd).GetTable().GetFrmFmt()
                                ->GetAttrSet() );
                    OutRTF_SwTblNode( *this, (SwTableNode&)rNd );
                }
                else if( rNd.IsSectionNode() )
                {
                    OutBreaks( ((SwSectionNode&)rNd).GetSection().GetFmt()
                                ->GetAttrSet() );
                    OutRTF_SwSectionNode( *this, (SwSectionNode&)rNd );
                }
                else if( rNd.IsEndNode() )
                    CheckEndNodeForSection( rNd );
            }

            ULONG nPos = pCurPam->GetPoint()->nNode++;  // Bewegen

            if( bShowProgress )
                ::SetProgressState( nPos, pDoc->GetDocShell() );   // Wie weit ?

            /* sollen nur die Selectierten Bereiche gesichert werden, so
             * duerfen nur die vollstaendigen Nodes gespeichert werde,
             * d.H. der 1. und n. Node teilweise, der 2. bis n-1. Node
             * vollstaendig. (vollstaendig heisst mit allen Formaten! )
             */
            bWriteAll = bSaveWriteAll ||
                    pCurPam->GetPoint()->nNode != pCurPam->GetMark()->nNode;
            bFirstLine = FALSE;
        }
    } while( CopyNextPam( &pPam ) );        // bis alle PaM's bearbeitet

    bWriteAll = bSaveWriteAll;          // wieder auf alten Wert zurueck
}


// schreibe die StyleTabelle, algemeine Angaben,Header/Footer/Footnotes


void SwRTFWriter::MakeHeader()
{
    // baue den Vorspann wie Header, ColorTbl, FontTbl
    Strm() << '{' << sRTF_RTF << '1'
#ifdef MAC
        << sRTF_MAC
#else
        << sRTF_ANSI
#endif
        ;
    if( bWriteAll )
    {
        Strm() << sRTF_DEFF;
        OutULong( GetId( (SvxFontItem&)pDoc->GetAttrPool().GetDefaultItem(
                        RES_CHRATR_FONT ) ));
    }


    OutRTFFontTab();
    OutRTFColorTab();
    OutRTFStyleTab();
    OutRTFListTab();

    Strm() << SwRTFWriter::sNewLine;        // ein Trenner

    // wenn teilweise ausgegeben wird, die globalen Daten nicht speichern
    if( !bWriteAll )
        return;

    // Ausgeben der Doc-Info/-Statistik
    OutDocInfoStat();

    // einige globale Daten Schreiben
    {   // Default-TabSize
        const SvxTabStopItem& rTabs = (const SvxTabStopItem&)
                    pDoc->GetAttrPool().GetDefaultItem( RES_PARATR_TABSTOP );
        Strm() << sRTF_DEFTAB;
        OutLong( rTabs[0].GetTabPos() );
    }

    // PageDescriptor ausgeben (??nur wenn das gesamte Dokument??)
    OutPageDesc();

    // gebe die Groesse und die Raender der Seite aus
    if( pDoc->GetPageDescCnt() )
    {
        //JP 06.04.99: Bug 64361 - suche den ersten SwFmtPageDesc. Ist
        //              keiner gesetzt, so ist der Standard gueltig
        const SwFmtPageDesc* pSttPgDsc = 0;
        {
            const SwNode& rSttNd = *pDoc->GetNodes()[
                        pDoc->GetNodes().GetEndOfExtras().GetIndex() + 2 ];
            const SfxItemSet* pSet = 0;

            if( rSttNd.IsCntntNode() )
                pSet = &rSttNd.GetCntntNode()->GetSwAttrSet();
            else if( rSttNd.IsTableNode() )
                pSet = &rSttNd.GetTableNode()->GetTable().
                            GetFrmFmt()->GetAttrSet();
            else if( rSttNd.IsSectionNode() )
                pSet = &rSttNd.GetSectionNode()->GetSection().
                            GetFmt()->GetAttrSet();

            if( pSet )
            {
                USHORT nPosInDoc;
                pSttPgDsc = (SwFmtPageDesc*)&pSet->Get( RES_PAGEDESC );
                if( !pSttPgDsc->GetPageDesc() )
                    pSttPgDsc = 0;
                else if( pDoc->FindPageDescByName( pSttPgDsc->
                                    GetPageDesc()->GetName(), &nPosInDoc ))
                {
                                                // FALSE wegen schliessender Klammer !!
                    OutComment( *this, sRTF_PGDSCNO, FALSE );
                    OutULong( nPosInDoc ) << '}';
                }
            }
        }
        const SwPageDesc& rPageDesc = pSttPgDsc ? *pSttPgDsc->GetPageDesc()
                                                : pDoc->GetPageDesc( 0 );
        const SwFrmFmt &rFmtPage = rPageDesc.GetMaster();

        {
            if( rPageDesc.GetLandscape() )
                Strm() << sRTF_LANDSCAPE;

            const SwFmtFrmSize& rSz = rFmtPage.GetFrmSize();
            // Clipboard-Dokument wird immer ohne Drucker angelegt, so ist
            // der Std.PageDesc immer aug LONG_MAX !! Mappe dann auf DIN A4
            if( LONG_MAX == rSz.GetHeight() || LONG_MAX == rSz.GetWidth() )
            {
                Strm() << sRTF_PAPERH;
                OutULong( lA4Height ) << sRTF_PAPERW;
                OutULong( lA4Width );
            }
            else
            {
                Strm() << sRTF_PAPERH;
                OutULong( rSz.GetHeight() ) << sRTF_PAPERW;
                OutULong( rSz.GetWidth() );
            }
        }

        {
            const SvxLRSpaceItem& rLR = rFmtPage.GetLRSpace();
            Strm() << sRTF_MARGL;
            OutLong( rLR.GetLeft() ) << sRTF_MARGR;
            OutLong( rLR.GetRight() );
        }

        {
            const SvxULSpaceItem& rUL = rFmtPage.GetULSpace();
            Strm() << sRTF_MARGT;
            OutLong( rUL.GetUpper() ) << sRTF_MARGB;
            OutLong( rUL.GetLower() );
        }

        Strm() << sRTF_SECTD << sRTF_SBKNONE;
        OutRTFPageDescription( rPageDesc, FALSE, FALSE );
        if( pSttPgDsc )
        {
            bIgnoreNextPgBreak = TRUE;
            pAktPageDesc = &rPageDesc;
        }
    }


    {
        // schreibe die Fussnoten- und Endnoten-Info raus
        const SwFtnInfo& rFtnInfo = pDoc->GetFtnInfo();

        const char* pOut = FTNPOS_CHAPTER == rFtnInfo.ePos
                            ? sRTF_ENDDOC
                            : sRTF_FTNBJ;
        Strm() << pOut << sRTF_FTNSTART;
        OutLong( rFtnInfo.nFtnOffset + 1 );

        switch( rFtnInfo.eNum )
        {
        case FTNNUM_PAGE:       pOut = sRTF_FTNRSTPG;   break;
        case FTNNUM_DOC:        pOut = sRTF_FTNRSTCONT; break;
//      case FTNNUM_CHAPTER:
        default:                pOut = sRTF_FTNRESTART; break;
        }
        Strm() << pOut;

        switch( rFtnInfo.aFmt.eType )
        {
        case SVX_NUM_CHARS_LOWER_LETTER:
        case SVX_NUM_CHARS_LOWER_LETTER_N:  pOut = sRTF_FTNNALC;    break;
        case SVX_NUM_CHARS_UPPER_LETTER:
        case SVX_NUM_CHARS_UPPER_LETTER_N:  pOut = sRTF_FTNNAUC;    break;
        case SVX_NUM_ROMAN_LOWER:           pOut = sRTF_FTNNRLC;    break;
        case SVX_NUM_ROMAN_UPPER:           pOut = sRTF_FTNNRUC;    break;
        case SVX_NUM_CHAR_SPECIAL:          pOut = sRTF_FTNNCHI;    break;
//      case SVX_NUM_ARABIC:
        default:                    pOut = sRTF_FTNNAR;     break;
        }
        Strm() << pOut;


        const SwEndNoteInfo& rEndNoteInfo = pDoc->GetEndNoteInfo();

        Strm() << sRTF_AENDDOC << sRTF_AFTNRSTCONT
               << sRTF_AFTNSTART;
        OutLong( rEndNoteInfo.nFtnOffset + 1 );

        switch( rEndNoteInfo.aFmt.eType )
        {
        case SVX_NUM_CHARS_LOWER_LETTER:
        case SVX_NUM_CHARS_LOWER_LETTER_N:  pOut = sRTF_AFTNNALC;   break;
        case SVX_NUM_CHARS_UPPER_LETTER:
        case SVX_NUM_CHARS_UPPER_LETTER_N:  pOut = sRTF_AFTNNAUC;   break;
        case SVX_NUM_ROMAN_LOWER:           pOut = sRTF_AFTNNRLC;   break;
        case SVX_NUM_ROMAN_UPPER:           pOut = sRTF_AFTNNRUC;   break;
        case SVX_NUM_CHAR_SPECIAL:          pOut = sRTF_AFTNNCHI;   break;
//      case SVX_NUM_ARABIC:
        default:                    pOut = sRTF_AFTNNAR;    break;
        }
        Strm() << pOut;
    }

    if( pDoc->_GetDBDesc().Len() )
    {
        // stelle erstmal fest, ob ueberhaupt Datenbankfelder benutzt werden!
        const SwFldTypes* pTypes = pDoc->GetFldTypes();
        for( USHORT nCnt = pTypes->Count(); nCnt >= INIT_FLDTYPES; )
            if( RES_DBFLD == (*pTypes)[ --nCnt ]->Which() &&
                (*pTypes)[ nCnt ]->GetDepends() )
            {
                Strm() << '{' << sRTF_FIELD;
                OutComment( *this, sRTF_FLDINST ) << " DATA ";
                RTFOutFuncs::Out_String( Strm(), pDoc->GetDBName(),
                                        DEF_ENCODING, bWriteHelpFmt );
                Strm() << "}{" << sRTF_FLDRSLT << " }}";
                break;
            }
    }

    pAttrSet = 0;

    Strm() << SwRTFWriter::sNewLine;        // ein Trenner
}

void SwRTFWriter::OutInfoDateTime( const DateTime& rDT, const char* pStr )
{
    Strm() << '{' << pStr << sRTF_YR;
    OutLong( Strm(), rDT.GetYear() ) << sRTF_MO;
    OutLong( Strm(), rDT.GetMonth() ) << sRTF_DY;
    OutLong( Strm(), rDT.GetDay() ) << sRTF_HR;
    OutLong( Strm(), rDT.GetHour() ) << sRTF_MIN;
    OutLong( Strm(), rDT.GetMin() ) << '}';
}

void SwRTFWriter::OutDocInfoStat()
{
    Strm() << '{' << sRTF_INFO;

    const SfxDocumentInfo* pInfo = pDoc->GetpInfo();
    if( pInfo )
    {
        const String* pStr = &pInfo->GetTitle();
        if( pStr->Len() )
        {
            Strm() << '{' << sRTF_TITLE << ' ';
            RTFOutFuncs::Out_String( Strm(), *pStr, DEF_ENCODING,
                                        bWriteHelpFmt ) << '}';
        }
        if( (pStr = &pInfo->GetTheme())->Len() )
        {
            Strm() << '{' << sRTF_SUBJECT << ' ';
            RTFOutFuncs::Out_String( Strm(), *pStr, DEF_ENCODING,
                                        bWriteHelpFmt ) << '}';
        }
        if( (pStr = &pInfo->GetKeywords())->Len() )
        {
            Strm() << '{' << sRTF_KEYWORDS << ' ';
            RTFOutFuncs::Out_String( Strm(), *pStr, DEF_ENCODING,
                                        bWriteHelpFmt ) << '}';
        }
        if( (pStr = &pInfo->GetComment())->Len() )
        {
            Strm() << '{' << sRTF_DOCCOMM << ' ';
            RTFOutFuncs::Out_String( Strm(), *pStr, DEF_ENCODING,
                                        bWriteHelpFmt ) << '}';
        }

        const SfxStamp* pStamp = &pInfo->GetCreated();
        if( ( pStr = &pStamp->GetName())->Len() )
        {
            Strm() << '{' << sRTF_AUTHOR << ' ';
            RTFOutFuncs::Out_String( Strm(), *pStr, DEF_ENCODING,
                                        bWriteHelpFmt ) << '}';
        }
        OutInfoDateTime( pStamp->GetTime(), sRTF_CREATIM );

        pStamp = &pInfo->GetChanged();
        if( ( pStr = &pStamp->GetName())->Len() )
        {
            Strm() << '{' << sRTF_OPERATOR << ' ';
            RTFOutFuncs::Out_String( Strm(), *pStr, DEF_ENCODING,
                                        bWriteHelpFmt ) << '}';
        }
        OutInfoDateTime( pStamp->GetTime(), sRTF_REVTIM );

        OutInfoDateTime( pInfo->GetPrinted().GetTime(), sRTF_PRINTIM );
    }


    // fuer interne Zwecke - Versionsnummer rausschreiben
    Strm() << '{' << sRTF_COMMENT << " StarWriter}{" << sRTF_VERN;
    OutLong( Strm(), SOFFICE_FILEFORMAT_NOW ) << '}';

    Strm() << '}';
}


static void InsColor( RTFColorTbl& rTbl, const Color& rCol )
{
    for( USHORT n = 0; n < rTbl.Count(); ++n )
        if( rTbl[n] == rCol )
            return;         // schon vorhanden, zurueck

    rTbl.Insert( rCol, rTbl.Count() );
}

static void InsColorLine( RTFColorTbl& rTbl, const SvxBoxItem& rBox )
{
    const SvxBorderLine* pLine = 0;

    if( rBox.GetTop() )
        InsColor( rTbl, (pLine = rBox.GetTop())->GetColor() );
    if( rBox.GetBottom() && pLine != rBox.GetBottom() )
        InsColor( rTbl, (pLine = rBox.GetBottom())->GetColor() );
    if( rBox.GetLeft() && pLine != rBox.GetLeft()  )
        InsColor( rTbl, (pLine = rBox.GetLeft())->GetColor() );
    if( rBox.GetRight() && pLine != rBox.GetRight()  )
        InsColor( rTbl, rBox.GetRight()->GetColor() );
}


void SwRTFWriter::OutRTFColorTab()
{
    ASSERT( pColTbl, "Wo ist meine Color-Tabelle?" );

    // dann baue die ColorTabelle aus allen Attributen, die Colors
    // enthalten und im Pool angemeldet sind auf.
    USHORT n, nMaxItem;
    const SfxItemPool& rPool = pDoc->GetAttrPool();

    // das Charakter - Color Attribut
    {
        const SvxColorItem* pCol = (const SvxColorItem*)GetDfltAttr(
                                                RES_CHRATR_COLOR );
        InsColor( *pColTbl, pCol->GetValue() );
        if( 0 != ( pCol = (const SvxColorItem*)rPool.GetPoolDefaultItem(
                RES_CHRATR_COLOR ) ))
            InsColor( *pColTbl, pCol->GetValue() );
        nMaxItem = rPool.GetItemCount(RES_CHRATR_COLOR);
        for( n = 0; n < nMaxItem; ++n )
            if( 0 != (pCol = (const SvxColorItem*)rPool.GetItem(
                RES_CHRATR_COLOR, n ) ) )
                InsColor( *pColTbl, pCol->GetValue() );
    }

    // das Frame Hintergrund - Attribut
    {
        const SvxBrushItem* pBkgrd = (const SvxBrushItem*)GetDfltAttr(
                                                            RES_BACKGROUND );
        InsColor( *pColTbl, pBkgrd->GetColor() );
//      InsColor( *pColTbl, pBkgrd->GetBrush().GetFillColor() );
        if( 0 != ( pBkgrd = (const SvxBrushItem*)rPool.GetPoolDefaultItem(
                        RES_BACKGROUND ) ))
        {
            InsColor( *pColTbl, pBkgrd->GetColor() );
//          InsColor( *pColTbl, pBkgrd->GetBrush().GetFillColor() );
        }
        nMaxItem = rPool.GetItemCount(RES_BACKGROUND);
        for( n = 0; n < nMaxItem; ++n )
            if( 0 != (pBkgrd = (const SvxBrushItem*)rPool.GetItem(
                RES_BACKGROUND, n ) ))
            {
                InsColor( *pColTbl, pBkgrd->GetColor() );
//              InsColor( *pColTbl, pBkgrd->GetBrush().GetFillColor() );
            }
    }

    // das Frame Schatten - Attribut
    {
        const SvxShadowItem* pShadow = (const SvxShadowItem*)GetDfltAttr(
                                                            RES_SHADOW );
        InsColor( *pColTbl, pShadow->GetColor() );
//      InsColor( *pColTbl, pShadow->GetBrush().GetFillColor() );
        if( 0 != ( pShadow = (const SvxShadowItem*)rPool.GetPoolDefaultItem(
                        RES_SHADOW ) ))
        {
            InsColor( *pColTbl, pShadow->GetColor() );
//          InsColor( *pColTbl, pShadow->GetBrush().GetFillColor() );
        }
        nMaxItem = rPool.GetItemCount(RES_SHADOW);
        for( n = 0; n < nMaxItem; ++n )
            if( 0 != (pShadow = (const SvxShadowItem*)rPool.GetItem(
                RES_SHADOW, n ) ) )
            {
                InsColor( *pColTbl, pShadow->GetColor() );
//              InsColor( *pColTbl, pShadow->GetBrush().GetFillColor() );
            }
    }

    // das Frame Umrandungs - Attribut
    {
        // Box muesste noch gemacht werden, aber default nie eine Line gesetzt!
        const SvxBoxItem* pBox;
        if( 0 != ( pBox = (const SvxBoxItem*)rPool.GetPoolDefaultItem(
                        RES_BOX ) ))
            InsColorLine( *pColTbl, *pBox );
        nMaxItem = rPool.GetItemCount(RES_BOX);
        for( n = 0; n < nMaxItem; ++n )
            if( 0 != (pBox = (const SvxBoxItem*)rPool.GetItem( RES_BOX, n ) ))
                InsColorLine( *pColTbl, *pBox );
    }

    // und raus damit
    Strm() << SwRTFWriter::sNewLine << '{' << sRTF_COLORTBL;

    for( n = 0; n < pColTbl->Count(); n++ )
    {
        const Color& rCol = (*pColTbl)[ n ];
        Strm() << sRTF_RED;
#ifdef VCL
        OutULong( rCol.GetRed() ) << sRTF_GREEN;
        OutULong( rCol.GetGreen() ) << sRTF_BLUE;
        OutULong( rCol.GetBlue() ) << ';';
#else
        OutULong( ( rCol.GetRed() & 0xff00 ) >> 8 ) << sRTF_GREEN;
        OutULong( ( rCol.GetGreen() & 0xff00 ) >> 8 ) << sRTF_BLUE;
        OutULong( ( rCol.GetBlue() & 0xff00 ) >> 8 ) << ';';
#endif
    }
    Strm() << '}';
}


static void _OutFont( SwRTFWriter& rWrt, const SvxFontItem& rFont, USHORT nNo )
{
    rWrt.Strm() << '{' << sRTF_F;

    const char* pStr = sRTF_FNIL;
    switch( rFont.GetFamily() )
    {
    case FAMILY_ROMAN:          pStr = sRTF_FROMAN;     break;
    case FAMILY_SWISS:          pStr = sRTF_FSWISS;     break;
    case FAMILY_MODERN:         pStr = sRTF_FMODERN;    break;
    case FAMILY_SCRIPT:         pStr = sRTF_FSCRIPT;    break;
    case FAMILY_DECORATIVE:     pStr = sRTF_FDECOR;     break;
    }
    rWrt.OutULong( nNo ) << pStr << sRTF_FPRQ;

    USHORT nVal = 0;
    switch( rFont.GetPitch() )
    {
    case PITCH_FIXED:       nVal = 1;       break;
    case PITCH_VARIABLE:    nVal = 2;       break;
    }
    rWrt.OutULong( nVal );

    rtl_TextEncoding eChrSet = rFont.GetCharSet();
    if( RTL_TEXTENCODING_DONTKNOW == eChrSet )
    {
        ASSERT( FALSE, "Wrong font encoding" );
        eChrSet = RTL_TEXTENCODING_MS_1252;
    }
    rWrt.Strm() << sRTF_FCHARSET;
    rWrt.OutULong( rtl_getBestWindowsCharsetFromTextEncoding( eChrSet ) );

    rWrt.Strm() << ' ';
    RTFOutFuncs::Out_String( rWrt.Strm(), rFont.GetFamilyName(), DEF_ENCODING,
                            rWrt.bWriteHelpFmt ) << ";}";
}

void SwRTFWriter::OutRTFFontTab()
{
    USHORT n = 0;
    const SfxItemPool& rPool = pDoc->GetAttrPool();
    const SvxFontItem* pFont = (const SvxFontItem*)GetDfltAttr( RES_CHRATR_FONT );

    Strm() << SwRTFWriter::sNewLine << '{' << sRTF_FONTTBL;
    _OutFont( *this, *pFont, n++ );

    if( 0 != ( pFont = (const SvxFontItem*)rPool.GetPoolDefaultItem(
                                                        RES_CHRATR_FONT )))
        _OutFont( *this, *pFont, n++ );

    PutNumFmtFontsInAttrPool();

    USHORT nMaxItem = rPool.GetItemCount( RES_CHRATR_FONT );
    for( USHORT nGet = 0; nGet < nMaxItem; ++nGet )
        if( 0 != (pFont = (const SvxFontItem*)rPool.GetItem(
            RES_CHRATR_FONT, nGet )) )
        _OutFont( *this, *pFont, n++ );

    Strm() << '}';
}



void SwRTFWriter::OutRTFStyleTab()
{
    // das 0-Style ist das Default, wird nie ausgegeben !!
    USHORT nArrLen = pDoc->GetTxtFmtColls()->Count();
    if( nArrLen <= 1 && pDoc->GetCharFmts()->Count() <= 1 )
        return;

    bOutStyleTab = TRUE;
    Strm() << SwRTFWriter::sNewLine << '{' << sRTF_STYLESHEET;

    // das Default-TextStyle wird nicht mit ausgegeben !!
    for( USHORT n = 1; n < nArrLen; ++n )
    {
        const SwTxtFmtColl* pColl = (*pDoc->GetTxtFmtColls())[ n ];
        pAttrSet = &pColl->GetAttrSet();

        Strm() << '{';
         // gebe Attribute aus
        OutRTF_SwFmt( *this, *pColl );

        if( pColl->DerivedFrom() )
            // suche die Id vom "Parent" Format
            for( USHORT nBasedOn=1; nBasedOn < nArrLen; nBasedOn++)
                if( (*pDoc->GetTxtFmtColls())[ nBasedOn ] ==
                        pColl->DerivedFrom() )
                {
                    // die Ableitung vom Format
                    Strm() << sRTF_SBASEDON;
                    OutULong( nBasedOn );
                    break;
                }

        if( pColl == &pColl->GetNextTxtFmtColl() )
        {
            Strm() << sRTF_SNEXT;
            OutULong( n );
        }
        else
            // suche die Id vom "Naechsten" Format
            for( USHORT nNext=1; nNext < nArrLen; nNext++)
                if( (*pDoc->GetTxtFmtColls())[ nNext ] ==
                        &pColl->GetNextTxtFmtColl() )
                {
                    // die Ableitung vom Format
                    Strm() << sRTF_SNEXT;
                    OutULong( nNext );
                    break;
                }

        if( NO_NUMBERING != pColl->GetOutlineLevel() )
        {
            Strm() << '{' << sRTF_IGNORE << sRTF_SOUTLVL;
            OutULong( pColl->GetOutlineLevel() ) << '}';
        }

        Strm() << ' ';
        RTFOutFuncs::Out_String( Strm(), pColl->GetName(), DEF_ENCODING,
                        bWriteHelpFmt ) << ";}" << SwRTFWriter::sNewLine;
    }

    USHORT nChrArrLen = pDoc->GetCharFmts()->Count();
    for( n = 1; n < nChrArrLen; ++n )
    {
        const SwCharFmt* pFmt = (*pDoc->GetCharFmts())[ n ];
        pAttrSet = &pFmt->GetAttrSet();

        Strm() << '{';
         // gebe Attribute aus
        OutRTF_SwFmt( *this, *pFmt );

        if( pFmt->DerivedFrom() )
            // suche die Id vom "Parent" Format
            for( USHORT nBasedOn=1; nBasedOn < nChrArrLen; nBasedOn++)
                if( (*pDoc->GetCharFmts())[ nBasedOn ] ==
                        pFmt->DerivedFrom() )
                {
                    // die Ableitung vom Format
                    Strm() << sRTF_SBASEDON;
                    OutULong( nArrLen + nBasedOn );
                    break;
                }

        Strm() << ' ';
        RTFOutFuncs::Out_String( Strm(), pFmt->GetName(), DEF_ENCODING,
                    bWriteHelpFmt ) << ";}" << SwRTFWriter::sNewLine;
    }

    Strm() << '}';
    bOutStyleTab = FALSE;
}


void SwRTFWriter::OutRTFFlyFrms( const SwFlyFrmFmt& rFlyFrmFmt )
{
    // ein FlyFrame wurde erkannt, gebe erstmal den aus

    // Hole vom Node und vom letzten Node die Position in der Section
    const SwFmtCntnt& rFlyCntnt = rFlyFrmFmt.GetCntnt();

    ULONG nStt = rFlyCntnt.GetCntntIdx()->GetIndex()+1;
    ULONG nEnd = pDoc->GetNodes()[ nStt - 1 ]->EndOfSectionIndex();

    if( nStt >= nEnd )      // kein Bereich, also kein gueltiger Node
        return;

    Strm() << SwRTFWriter::sNewLine << sRTF_PARD << sRTF_PLAIN;

    {
        RTFSaveData aSaveData( *this, nStt, nEnd );
        pFlyFmt = (SwFlyFrmFmt*)&rFlyFrmFmt;
        Out_SwDoc( pCurPam );
    }

    Strm() << sRTF_PARD << SwRTFWriter::sNewLine;
}


void SwRTFWriter::OutBookmarks( xub_StrLen nCntntPos )
{
    // hole das aktuelle Bookmark
    const SwBookmark* pBookmark = USHRT_MAX != nBkmkTabPos ?
                            pDoc->GetBookmarks()[ nBkmkTabPos ] : 0;
    // Ausgabe von Bookmarks
    while( USHRT_MAX != nBkmkTabPos &&
        pBookmark->GetPos().nNode.GetIndex() ==
            pCurPam->GetPoint()->nNode.GetIndex() &&
        pBookmark->GetPos().nContent.GetIndex() == nCntntPos )
    {
        // zur Zeit umspannt das SwBookmark keinen Bereich also kann
        // es hier vollstaendig ausgegeben werden.

        // erst die SWG spezifischen Daten:
        if( pBookmark->GetShortName().Len() ||
            pBookmark->GetKeyCode().GetCode() )
        {
            OutComment( *this, sRTF_BKMKKEY );
            OutULong( ( pBookmark->GetKeyCode().GetCode() |
                     pBookmark->GetKeyCode().GetModifier() ));
            if( !pBookmark->GetShortName().Len() )
                Strm() << "  " ;
            else
            {
                Strm() << ' ';
                OutRTF_AsByteString( *this, pBookmark->GetShortName() );
            }
            Strm() << '}';
        }
        OutComment( *this, sRTF_BKMKSTART ) << ' ';
        RTFOutFuncs::Out_String( Strm(), pBookmark->GetName(),
                                DEF_ENCODING, bWriteHelpFmt ) << '}';

        OutComment( *this, sRTF_BKMKEND ) << ' ';
        RTFOutFuncs::Out_String( Strm(), pBookmark->GetName(),
                                DEF_ENCODING, bWriteHelpFmt ) << '}';

        if( ++nBkmkTabPos >= pDoc->GetBookmarks().Count() )
            nBkmkTabPos = USHRT_MAX;
        else
            pBookmark = pDoc->GetBookmarks()[ nBkmkTabPos ];
    }
}


void SwRTFWriter::OutFlyFrm()
{
    if( !pFlyPos )
        return;

    // gebe alle freifliegenden Rahmen die sich auf den akt. Absatz
    // und evt. auf das aktuelle Zeichen beziehen, aus.

    // suche nach dem Anfang der FlyFrames
    for( USHORT n = 0; n < pFlyPos->Count() &&
            (*pFlyPos)[n]->GetNdIndex().GetIndex() <
                pCurPam->GetPoint()->nNode.GetIndex(); ++n )
        ;
    if( n < pFlyPos->Count() )
        while( n < pFlyPos->Count() &&
                pCurPam->GetPoint()->nNode.GetIndex() ==
                    (*pFlyPos)[n]->GetNdIndex().GetIndex() )
        {
            // den Array-Iterator weiterschalten, damit nicht doppelt
            // ausgegeben wird !!
            OutRTFFlyFrms( (const SwFlyFrmFmt&)(*pFlyPos)[n++]->GetFmt() );
        }
}


USHORT SwRTFWriter::GetId( const Color& rColor ) const
{
    ASSERT( pColTbl, "Wo ist meine Color-Tabelle?" );
    for( USHORT n = 0; n < pColTbl->Count(); n++ )
        if( rColor == (*pColTbl)[ n ] )
            return n;

    ASSERT( FALSE, "Color nicht in der Tabelle" );
    return 0;
}

USHORT SwRTFWriter::GetId( const SvxFontItem& rFont ) const
{
    const SfxItemPool& rPool = pDoc->GetAttrPool();
    const SvxFontItem* pFont = (const SvxFontItem*)GetDfltAttr( RES_CHRATR_FONT );
    if( rFont == *pFont )
        return 0;

    USHORT n = 1;
    if( 0 != ( pFont = (const SvxFontItem*)rPool.GetPoolDefaultItem(
                                                        RES_CHRATR_FONT )))
    {
        if( rFont == *pFont )
            return 1;
        ++n;
    }

    USHORT nMaxItem = rPool.GetItemCount( RES_CHRATR_FONT );
    for( USHORT nGet = 0; nGet < nMaxItem; ++nGet )
        if( 0 != (pFont = (const SvxFontItem*)rPool.GetItem(
            RES_CHRATR_FONT, nGet )) )
        {
            if( rFont == *pFont )
                return n;
            ++n;
        }

    ASSERT( FALSE, "Font nicht in der Tabelle" );
    return 0;
}

USHORT SwRTFWriter::GetId( const Font& rFont ) const
{
    return GetId( SvxFontItem( rFont.GetFamily(), rFont.GetName(),
                                rFont.GetStyleName(), rFont.GetPitch(),
                                rFont.GetCharSet() ) );
}

USHORT SwRTFWriter::GetId( const SwTxtFmtColl& rColl ) const
{
    // suche das angegebene Format
    const SvPtrarr & rArr = *pDoc->GetTxtFmtColls();
    for( USHORT n = 0; n < rArr.Count(); n++ )
        if( (SwTxtFmtColl*)rArr[ n ] == &rColl )
            return n;
    ASSERT( FALSE, "TextCollection nicht in der Tabelle" );
    return 0;
}

USHORT SwRTFWriter::GetId( const SwCharFmt& rFmt ) const
{
    // suche das angegebene Format
    const SvPtrarr & rArr = *pDoc->GetCharFmts();
    for( USHORT n = 0; n < rArr.Count(); n++ )
        if( (SwCharFmt*)rArr[ n ] == &rFmt )
            return n + pDoc->GetTxtFmtColls()->Count();
    ASSERT( FALSE, "CharDFFormat nicht in der Tabelle" );
    return 0;
}

void SwRTFWriter::OutPageDesc()
{
    // Ausgabe der Page-Descriptoren
    USHORT nSize = pDoc->GetPageDescCnt();
    if( !nSize )
        return;

    Strm() << SwRTFWriter::sNewLine;        // ein Trenner
    bOutPageDesc = bOutPageDescTbl = TRUE;
    OutComment( *this, sRTF_PGDSCTBL );
    for( USHORT n = 0; n < nSize; ++n )
    {
        const SwPageDesc& rPageDesc = pDoc->GetPageDesc( n );

        Strm() << SwRTFWriter::sNewLine << '{' << sRTF_PGDSC;
        OutULong( n ) << sRTF_PGDSCUSE;
        OutULong( rPageDesc.ReadUseOn() );

        OutRTFPageDescription( rPageDesc, FALSE, FALSE );

        // suche den Folge-PageDescriptor:
        USHORT i = nSize;
        while( i  )
            if( rPageDesc.GetFollow() == &pDoc->GetPageDesc( --i ) )
                break;
        Strm() << sRTF_PGDSCNXT;
        OutULong( i ) << ' ';
        RTFOutFuncs::Out_String( Strm(), rPageDesc.GetName(),
                                DEF_ENCODING, bWriteHelpFmt ) << ";}";
    }
    Strm() << '}' << SwRTFWriter::sNewLine;
    bOutPageDesc = bOutPageDescTbl = FALSE;
}

void SwRTFWriter::OutRTFPageDescription( const SwPageDesc& rPgDsc,
                                            BOOL bWriteReset,
                                            BOOL bCheckForFirstPage )
{
    // jetzt noch den Teil fuer alle anderen Applikationen:
    const SwPageDesc *pSave = pAktPageDesc;
    BOOL bOldOut = bOutPageDesc, bOldHDFT = bOutLeftHeadFoot;

    // falls es einen Follow gibt,
    pAktPageDesc = &rPgDsc;
    if( bCheckForFirstPage && pAktPageDesc->GetFollow() &&
        pAktPageDesc->GetFollow() != pAktPageDesc )
        pAktPageDesc = pAktPageDesc->GetFollow();

    bOutPageDesc = TRUE;
    bOutLeftHeadFoot = FALSE;

    if( bWriteReset )
    {
        if( bFirstLine && bWriteAll &&
            pCurPam->GetPoint()->nNode == pOrigPam->Start()->nNode )
            Strm() << sRTF_SECTD << sRTF_SBKNONE;
        else
            Strm() << sRTF_SECT << sRTF_SECTD;
    }

    if( pAktPageDesc->GetLandscape() )
        Strm() << sRTF_LNDSCPSXN;

    const SwFmt *pFmt = &pAktPageDesc->GetMaster(); //GetLeft();
    OutRTF_SwFmt( *this, *pFmt );

    // falls es gesharte Heaer/Footer gibt, so gebe diese auch noch aus
    if( PD_MIRROR & pAktPageDesc->GetUseOn() &&
        !pAktPageDesc->IsFooterShared() || !pAktPageDesc->IsHeaderShared() )
    {
        bOutLeftHeadFoot = TRUE;
        const SfxPoolItem* pHt;
        if( !pAktPageDesc->IsHeaderShared() &&
            SFX_ITEM_SET == pAktPageDesc->GetLeft().GetAttrSet().
                    GetItemState( RES_HEADER, FALSE, &pHt ))
            OutRTF_SwFmtHeader( *this, *pHt );

        if( !pAktPageDesc->IsFooterShared() &&
            SFX_ITEM_SET == pAktPageDesc->GetLeft().GetAttrSet().
                    GetItemState( RES_FOOTER, FALSE, &pHt ))
            OutRTF_SwFmtFooter( *this, *pHt );
        bOutLeftHeadFoot = FALSE;
    }

    if( pAktPageDesc != &rPgDsc )
    {
        pAktPageDesc = &rPgDsc;
        Strm() << sRTF_TITLEPG;

        // die Header/Footer der 1. Seite ausgeben
        const SfxPoolItem* pHt;
        if( SFX_ITEM_SET == pAktPageDesc->GetMaster().GetAttrSet().
                    GetItemState( RES_HEADER, FALSE, &pHt ))
            OutRTF_SwFmtHeader( *this, *pHt );

        if( SFX_ITEM_SET == pAktPageDesc->GetMaster().GetAttrSet().
                                GetItemState( RES_FOOTER, FALSE, &pHt ))
            OutRTF_SwFmtFooter( *this, *pHt );
    }

    pAktPageDesc = pSave;
    bOutPageDesc = bOldOut;
    bOutLeftHeadFoot = bOldHDFT;
}

BOOL SwRTFWriter::OutBreaks( const SfxItemSet& rSet )
{
    // dann nie Seitenumbrueche ausgeben
    BOOL bPgDscWrite = FALSE;

    if( !bOutOutlineOnly && bOutPageAttr && !bIgnoreNextPgBreak)
    {
        const SfxPoolItem *pItem;
        if( SFX_ITEM_SET == rSet.GetItemState( RES_PAGEDESC, TRUE, &pItem )
            && ((SwFmtPageDesc*)pItem)->GetPageDesc() )
        {
            const SwFmtPageDesc& rPgDsc = *(SwFmtPageDesc*)pItem;
            for( USHORT nPos = pDoc->GetPageDescCnt(); nPos; )
                if( &pDoc->GetPageDesc( --nPos ) == rPgDsc.GetPageDesc() )
                {
                    pAktPageDesc = ((SwFmtPageDesc*)pItem)->GetPageDesc();
                                                // FALSE wegen schliessender Klammer !!
                    OutComment( *this, sRTF_PGDSCNO, FALSE );
                    OutULong( nPos ) << '}';

                    // nicht weiter, in Styles gibts keine SectionControls !!
                    if( !bOutStyleTab )
                        OutRTFPageDescription( *rPgDsc.GetPageDesc(),
                                                        TRUE, TRUE );
                    bPgDscWrite = TRUE;
                    break;
                }
        }
        else if( SFX_ITEM_SET == rSet.GetItemState( RES_BREAK, TRUE, &pItem ) )
        {
            const SvxFmtBreakItem &rBreak = *(SvxFmtBreakItem*)pItem;
            if( bWriteHelpFmt )
            {
                if( SVX_BREAK_PAGE_BEFORE == rBreak.GetBreak() ||
                    SVX_BREAK_PAGE_AFTER == rBreak.GetBreak() ||
                    SVX_BREAK_PAGE_BOTH == rBreak.GetBreak() )
                {
                    bOutFmtAttr = TRUE;
                    Strm() << sRTF_PAGE;
                }
            }
            else
                switch( rBreak.GetBreak() )
                {
                case SVX_BREAK_COLUMN_BEFORE:
                case SVX_BREAK_COLUMN_AFTER:
                case SVX_BREAK_COLUMN_BOTH:
                    break;

                case SVX_BREAK_PAGE_BEFORE:
                    bOutFmtAttr = TRUE;
                    Strm() << sRTF_PAGE;
                    break;

                case SVX_BREAK_PAGE_AFTER:
                    OutComment( *this, sRTF_PGBRK, FALSE ) << "0}";
                    break;

                case SVX_BREAK_PAGE_BOTH:
                    OutComment( *this, sRTF_PGBRK, FALSE ) << "1}";
                    break;
                }
        }
    }
    bIgnoreNextPgBreak = FALSE;
    return bPgDscWrite;
}


void SwRTFWriter::CheckEndNodeForSection( const SwNode& rNd )
{
    const SwSectionNode* pSectNd = rNd.FindStartNode()->GetSectionNode();
    if( pSectNd /*&& CONTENT_SECTION == pSectNd->GetSection().GetType()*/ )
    {
        const SwSectionFmt* pSectFmt = pSectNd->GetSection().GetFmt();

        // diese Section hatte den akt. Abschnitt bestimmt
        // wer bestimmt den nachsten??
        SwNodeIndex aIdx( rNd, 1 );
        pSectNd = aIdx.GetNode().GetSectionNode();
        if( !( ( pSectNd || aIdx.GetNode().IsEndNode() &&
            0 != ( pSectNd = aIdx.GetNode().FindStartNode()->GetSectionNode() ))
            /*&& CONTENT_SECTION == pSectNd->GetSection().GetType()*/ ))
        {
            // wer bestimmt denn nun den neuen Abschnitt?
            // PageDesc oder eine uebergeordnete Section?
            SwSection* pParent = pSectFmt->GetParentSection();
//          while( pParent /*&& CONTENT_SECTION != pParent->GetType()*/ )
//              pParent = pParent->GetParent();

            if( pParent /*&& CONTENT_SECTION == pParent->GetType()*/ )
                OutRTF_SwSectionNode( *this, *pParent->
                        GetFmt()->GetSectionNode( TRUE ) );
            else
            {
                Strm() << sRTF_SECT << sRTF_SECTD << sRTF_SBKNONE;
                OutRTFPageDescription( ( pAktPageDesc
                                    ? *pAktPageDesc
                                    : pDoc->GetPageDesc(0) ),
                                FALSE, TRUE );
                Strm() << SwRTFWriter::sNewLine;
            }
        }
        // else
            // weiter machen, der naechste definiert den neuen Abschnitt
    }
}

// Struktur speichert die aktuellen Daten des Writers zwischen, um
// einen anderen Dokument-Teil auszugeben, wie z.B. Header/Footer
RTFSaveData::RTFSaveData( SwRTFWriter& rWriter, ULONG nStt, ULONG nEnd )
    : rWrt( rWriter ),
    pOldPam( rWrt.pCurPam ), pOldEnd( rWrt.GetEndPaM() ),
    pOldFlyFmt( rWrt.pFlyFmt ), pOldPageDesc( rWrt.pAktPageDesc ),
    pOldAttrSet( rWrt.pAttrSet )

{
    bOldWriteAll = rWrt.bWriteAll;
    bOldOutTable = rWrt.bOutTable;
    bOldOutPageAttr = rWrt.bOutPageAttr;
    bOldAutoAttrSet = rWrt.bAutoAttrSet;
    bOldOutSection = rWrt.bOutSection;

    rWrt.pCurPam = rWrt.NewSwPaM( *rWrt.pDoc, nStt, nEnd );

    // Tabelle in Sonderbereichen erkennen
    if( nStt != rWrt.pCurPam->GetMark()->nNode.GetIndex() &&
        rWrt.pDoc->GetNodes()[ nStt ]->IsTableNode() )
        rWrt.pCurPam->GetMark()->nNode = nStt;

    rWrt.SetEndPaM( rWrt.pCurPam );
    rWrt.pCurPam->Exchange( );
    rWrt.bWriteAll = TRUE;
    rWrt.bOutTable = FALSE;
    rWrt.bOutPageAttr = FALSE;
    rWrt.pAttrSet = 0;
    rWrt.bAutoAttrSet = FALSE;
    rWrt.bOutSection = FALSE;
}


RTFSaveData::~RTFSaveData()
{
    delete rWrt.pCurPam;                    // Pam wieder loeschen

    rWrt.pCurPam = pOldPam;
    rWrt.SetEndPaM( pOldEnd );
    rWrt.bWriteAll = bOldWriteAll;
    rWrt.bOutTable = bOldOutTable;
    rWrt.pFlyFmt = pOldFlyFmt;
    rWrt.pAktPageDesc = pOldPageDesc;
    rWrt.pAttrSet = pOldAttrSet;
    rWrt.bAutoAttrSet = bOldAutoAttrSet;
    rWrt.bOutPageAttr = bOldOutPageAttr;
    rWrt.bOutSection = bOldOutSection;
}


void GetRTFWriter( const String& rFltName, WriterRef& xRet )
{
    xRet = new SwRTFWriter( rFltName );
}


/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/rtf/wrtrtf.cxx,v 1.1.1.1 2000-09-18 17:14:56 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.202  2000/09/18 16:04:51  willem.vandorp
      OpenOffice header added.

      Revision 1.201  2000/08/22 20:51:18  jp
      OutHeader: don't ask for DBName

      Revision 1.200  2000/08/04 10:48:32  jp
      Soft-/HardHyphens & HardBlanks changed from attribute to unicode character; use rtfout functions

      Revision 1.199  2000/07/04 16:23:30  jp
      AMA_TEST define removed

      Revision 1.198  2000/05/09 17:23:08  jp
      Changes for Unicode

      Revision 1.197  2000/03/03 16:22:05  pl
      #73771# workaround for c50 intel compiler

      Revision 1.196  2000/03/03 15:21:02  os
      StarView remainders removed

      Revision 1.195  2000/02/24 18:30:25  jp
      Bug #73485#: write right follow of pagedesc, initialize the akt. pagedesc

      Revision 1.194  2000/01/25 20:10:34  jp
      Bug #72146#: _OutFont - replace system/dontknow charset to the current charset

      Revision 1.193  1999/11/22 18:00:05  jp
      OutSectionNode: dont skip to top parent section

      Revision 1.192  1999/10/25 12:16:40  jp
      get font charset over RTL-Function

      Revision 1.191  1999/08/05 20:53:50  JP
      write flyfrms before the paragraph and not behind


      Rev 1.190   05 Aug 1999 22:53:50   JP
   write flyfrms before the paragraph and not behind

      Rev 1.189   22 Jul 1999 20:01:10   JP
   read&write footer and header height

      Rev 1.188   23 Jun 1999 19:12:30   JP
   optimize for NumRules, interface of FindPos_Bkmk has changed

      Rev 1.187   16 Jun 1999 19:49:06   JP
   Change interface of base class Writer

      Rev 1.186   04 May 1999 15:00:02   JP
   FilterExportklasse Writer von SvRef abgeleitet, damit sie immer zerstoert wird

      Rev 1.185   06 Apr 1999 17:00:18   JP
   Bug #64361#: MakeHeader - ggfs. ersten PageDesc vom 1.Node besorgen

      Rev 1.184   19 Mar 1999 17:08:06   JP
   Bug #63772#: Spaltige Bereiche im-/exportieren

      Rev 1.183   18 Mar 1999 09:51:54   JP
   Task #63049#: Numerierung mit rel. Einzuegen

      Rev 1.182   16 Mar 1999 23:20:00   JP
   Task #63049#: Einzuege bei NumRules relativ

      Rev 1.181   05 Mar 1999 14:44:34   JP
   Bug #57749#: spaltige Bereiche schreiben - alle Section-Typen

      Rev 1.180   04 Mar 1999 19:59:22   JP
   Bug #57749#: spaltige Bereiche schreiben

      Rev 1.179   17 Nov 1998 10:45:52   OS
   #58263# NumType durch SvxExtNumType ersetzt

      Rev 1.178   09 Nov 1998 17:28:46   JP
   Bug #58817#: StyleTabelle wieder schreiben

      Rev 1.177   30 Oct 1998 18:30:26   JP
   Task #58596#: neues Flag an der Writerklasse -> schreibe nur die 1. Tabelle

      Rev 1.176   28 Oct 1998 10:36:12   JP
   Bug #58565#: Assert im OutHeader behoben

      Rev 1.175   11 Aug 1998 12:16:36   JP
   Bug #54796#: fehlender Numerierunstyp und Bugfixes

      Rev 1.174   06 Aug 1998 21:45:56   JP
   Bug #54796#: neue NumerierungsTypen (WW97 kompatibel)

      Rev 1.173   04 Jun 1998 19:28:08   JP
   Bug #50887#: Font bei Grafik-NumFormaten ist 0, also default Font schreiben

      Rev 1.172   13 May 1998 17:15:22   JP
   OutRTFPageDesc: beim 1.PageDesc keinen Sectionbreak schreiben

      Rev 1.171   11 May 1998 22:50:32   JP
   Zeichenvorlagen schreiben

      Rev 1.170   11 May 1998 16:46:50   JP
   RTF-CharFormate ausgeben

      Rev 1.169   05 May 1998 14:00:26   JP
   linke/rechte Header/Footer korrekt rausschreiben

      Rev 1.168   20 Apr 1998 17:43:20   JP
   neu: Numerierung lesen/schreiben

      Rev 1.167   03 Apr 1998 18:51:56   JP
   RTF-Parser um neue Tokens erweitert

      Rev 1.166   20 Feb 1998 13:36:40   MA
   headerfiles gewandert

      Rev 1.165   29 Jan 1998 21:35:24   JP
   GetEndOfIcons ersetzt durch GetEndOfExtras, das auf GetEndOfRedlines mappt

      Rev 1.164   27 Jan 1998 21:50:18   JP
   GetNumDepend durch GetDepends ersetzt

      Rev 1.163   26 Nov 1997 15:05:30   MA
   headerfiles

      Rev 1.162   09 Oct 1997 14:27:52   JP
   Umstellung NodeIndex/-Array/BigPtrArray

      Rev 1.161   12 Sep 1997 10:57:22   OS
   ITEMID_* definiert

      Rev 1.160   03 Sep 1997 08:58:52   OS
   Header

      Rev 1.159   29 Aug 1997 13:53:24   JP
   VCL Color Anpassung

      Rev 1.158   15 Aug 1997 12:51:42   OS
   charatr/frmatr/txtatr aufgeteilt

      Rev 1.157   11 Aug 1997 17:48:44   OS
   Header-Umstellung

      Rev 1.156   07 Aug 1997 15:06:36   OM
   Headerfile-Umstellung

      Rev 1.155   07 Apr 1997 16:35:10   JP
   Das ShowProgressFlag der Writerklasse auswerten

      Rev 1.154   17 Feb 1997 12:03:44   MA
   opt: Outline schneller schreiben wenn Gliederung nur im Body

      Rev 1.153   15 Feb 1997 17:57:14   JP
   OutStyleTab: pAttrSet Pointer wieder clearen

      Rev 1.152   15 Feb 1997 17:00:22   JP
   neu: nur Gliederungsabsaetze schreiben

      Rev 1.151   14 Jan 1997 08:51:42   MA
   includes

*************************************************************************/


diff --git a/sw/source/filter/rtf/wrtrtf.hxx b/sw/source/filter/rtf/wrtrtf.hxx
new file mode 100644
index 0000000..7ee3b41
--- /dev/null
+++ b/sw/source/filter/rtf/wrtrtf.hxx
@@ -0,0 +1,244 @@
/*************************************************************************
 *
 *  $RCSfile: wrtrtf.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:56 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _WRTRTF_HXX
#define _WRTRTF_HXX

#ifndef _SHELLIO_HXX
#include <shellio.hxx>
#endif
#ifndef _WRT_FN_HXX
#include <wrt_fn.hxx>
#endif

// einige Forward Deklarationen
class Color;
class Font;
class SvPtrarr;
class RTFColorTbl;
class SwFmt;
class SwFmtColl;
class SwFlyFrmFmt;
class SwPosFlyFrms;
class SwPageDesc;
class SwTableNode;
class SwTxtFmtColl;
class SwNumRule;
class SwNumRuleTbl;
class SwNodeNum;
class DateTime;

extern SwAttrFnTab aRTFAttrFnTab;
extern SwNodeFnTab aRTFNodeFnTab;

// the text encoding for the export
#ifdef MAC
#define DEF_ENCODING        RTL_TEXTENCODING_APPLE_ROMAN
#else
#define DEF_ENCODING        RTL_TEXTENCODING_MS_1252
#endif


// der RTF-Writer

class SwRTFWriter : public Writer
{
    SvPtrarr* pFontRemoveLst;
    RTFColorTbl* pColTbl;
    SwPosFlyFrms* pFlyPos;          // Pointer auf die aktuelle "FlyFrmTabelle"
    USHORT nAktFlyPos;              // Index auf das naechste "FlyFrmFmt"

    void OutRTFColorTab();
    void OutRTFFontTab();
    void OutRTFStyleTab();
    void OutRTFListTab();

    void MakeHeader();
    void OutDocInfoStat();
    void OutInfoDateTime( const DateTime&, const sal_Char* );
    void CheckEndNodeForSection( const SwNode& rNd );


public:
    // --- public Member --------------------------------------------------

    SwFlyFrmFmt* pFlyFmt;               // liegt der Node in einem FlyFrame,
                                        // ist das Format gesetzt, sonst 0
    const SwPageDesc* pAktPageDesc;     // aktuell gesetzter PageDesc.
    const SwAttrSet* pAttrSet;      // akt. Format/Collection vom Node
                                    // fuer den Zugriff auf einige Attribute
                                    // z.B. Font-Size, LR-Space,..
    USHORT nBkmkTabPos;             // akt. Position in der Bookmark-Tabelle
    USHORT nFontHeight;             // akt. Hoehe vom Font

#if defined(MAC) || defined(UNX)
    static const sal_Char sNewLine;                 // nur \012 oder \015
#else
    static const sal_Char __FAR_DATA sNewLine[];    // \015\012
#endif


    BOOL bFirstLine : 1;            // wird die 1. Zeile ausgegeben ?
    BOOL bOutFmtAttr : 1;           // TRUE: beim Schreiben eines Formates
                                    // existierte mindestens ein Attribut
    BOOL bRTFFlySyntax : 1;         // gebe nur original RTFSyntax aus
                                    // (nur fuer die fliegenden Rahmen)
    BOOL bOutPageDesc: 1;           // gebe einen PageDescriptor aus
    BOOL bOutPageDescTbl: 1;        // gebe die PageDescriptor-Tabelle aus
    BOOL bOutTable : 1;             // gebe eine Tabelle aus
    BOOL bTxtAttr : 1;              // werden TextAttribute ausgegeben ?
    BOOL bWriteHelpFmt : 1;         // schreibe Win-RTF-HelpFileFmt
    BOOL bOutStyleTab : 1;          // gebe die StyleSheet-Tabelle aus
    BOOL bOutPageAttr : 1;          // PageDescAttribut ausgeben?
    BOOL bAutoAttrSet : 1;          // TRUE:  pAttrSet ist harte Attributierung
                                    // FALSE: pAttrSet ist vom Format/Collection
    BOOL bOutOutlineOnly : 1;       // TRUE: nur Gliederungs-Absaetze schreiben
    BOOL bOutListNumTxt : 1;        // TRUE: der ListNumText wird ausgegeben
    BOOL bOutLeftHeadFoot : 1;      // gebe vom PageDesc. den linkten
                                    // Header/Footer aus
    BOOL bOutSection : 1;           // TRUE: Section PageDesc ausgeben
    BOOL bIgnoreNextPgBreak : 1;    // TRUE: naechsten PageDesc/Break ignorieren

    // --- public Methoden ------------------------------------------------

    SwRTFWriter( const String& rFilterName );
    virtual ~SwRTFWriter();
    virtual ULONG WriteStream();

    void Out_SwDoc( SwPaM* );       // schreibe den makierten Bereich

        // gebe die evt. an der akt. Position stehenden FlyFrame aus.
    void OutFlyFrm();
    void OutRTFFlyFrms( const SwFlyFrmFmt& );
        // gebe alle an der Position stehenden Bookmarks aus
    void OutBookmarks( xub_StrLen nCntntPos );
        // gebe die PageDesc-Daten im normalen RTF-Format aus
    void OutRTFPageDescription( const SwPageDesc&, BOOL , BOOL );
    BOOL OutBreaks( const SfxItemSet& rSet );

        // gebe die PageDescriptoren aus
    USHORT GetId( const Color& ) const;
    USHORT GetId( const SvxFontItem& ) const;
    USHORT GetId( const Font& ) const;
    USHORT GetId( const SwTxtFmtColl& ) const;
    USHORT GetId( const SwCharFmt& ) const;
    USHORT GetId( const SwNumRuleItem& rItem ) const;

    void OutPageDesc();

    void OutListNum( const SwTxtNode& rNd );

    // fuer RTFSaveData
    SwPaM* GetEndPaM()              { return pOrigPam; }
    void SetEndPaM( SwPaM* pPam )   { pOrigPam = pPam; }
};


// Struktur speichert die aktuellen Daten des Writers zwischen, um
// einen anderen Dokument-Teil auszugeben, wie z.B. Header/Footer
// Mit den beiden USHORTs im CTOR wird ein neuer PaM erzeugt und auf
// die Position im Dokument gesetzt.
// Im Destructor werden alle Daten wieder restauriert und der angelegte
// Pam wieder geloescht.

struct RTFSaveData
{
    SwRTFWriter& rWrt;
    SwPaM* pOldPam, *pOldEnd;
    BOOL bOldWriteAll : 1;
    BOOL bOldOutTable : 1;
    BOOL bOldOutPageAttr : 1;
    BOOL bOldAutoAttrSet : 1;
    BOOL bOldOutSection : 1;

    SwFlyFrmFmt* pOldFlyFmt;
    const SwPageDesc* pOldPageDesc;
    const SwAttrSet* pOldAttrSet;           // akt. Attribute vom Node

    RTFSaveData( SwRTFWriter&, ULONG nStt, ULONG nEnd );
    ~RTFSaveData();
};


// einige Funktions-Deklarationen
Writer& OutRTF_AsByteString( Writer& rWrt, const String& rStr );
Writer& OutRTF_SwFmt( Writer& rWrt, const SwFmt& );
Writer& OutRTF_SwTblNode( Writer& , SwTableNode & );
Writer& OutRTF_SwSectionNode( Writer& , SwSectionNode & );


// Augabe von RTF-Bitmaps (steht im File "wrtpict.cxx")
//struct SvxRTFPictureType;
//class Bitmap;
//USHORT WriteRTFPict( const SwPictureType&, Bitmap&, SvStream& );

// Ausagbe von Footer-/Headers
Writer& OutRTF_SwFmtHeader( Writer& , const SfxPoolItem& );
Writer& OutRTF_SwFmtFooter( Writer& , const SfxPoolItem& );

// Kommentar und zusaetzlichen String ausgeben
SvStream& OutComment( Writer& rWrt, const sal_Char* pStr );
    // zusaetzlich das bOutFmtAttr-Flag manipulieren
SvStream& OutComment( Writer& rWrt, const sal_Char* pStr, BOOL bSetFlag );

#endif  //  _WRTRTF_HXX


diff --git a/sw/source/filter/writer/makefile.mk b/sw/source/filter/writer/makefile.mk
new file mode 100644
index 0000000..bea3000
--- /dev/null
+++ b/sw/source/filter/writer/makefile.mk
@@ -0,0 +1,94 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:57 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=..$/..$/..

PRJNAME=sw
TARGET=writer

PROJECTPCH=filt_pch
PROJECTPCHSOURCE=..\filt_1st\filt_pch

# --- Settings -----------------------------------------------------

.INCLUDE :  $(PRJ)$/inc$/swpre.mk
.INCLUDE :  settings.mk
.INCLUDE :  $(PRJ)$/inc$/sw.mk

# --- Files --------------------------------------------------------

CXXFILES = \
        writer.cxx \
        wrt_fn.cxx \
        wrtswtbl.cxx \
        wrttxatr.cxx \

SLOFILES =  \
        $(SLO)$/writer.obj \
        $(SLO)$/wrt_fn.obj \
        $(SLO)$/wrtswtbl.obj \
        $(SLO)$/wrttxatr.obj \

# --- Tagets -------------------------------------------------------

.INCLUDE :  target.mk

diff --git a/sw/source/filter/writer/writer.cxx b/sw/source/filter/writer/writer.cxx
new file mode 100644
index 0000000..677df92
--- /dev/null
+++ b/sw/source/filter/writer/writer.cxx
@@ -0,0 +1,780 @@
/*************************************************************************
 *
 *  $RCSfile: writer.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:57 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#define _SVSTDARR_STRINGSSORTDTOR
#include <svtools/svstdarr.hxx>

#ifndef _STREAM_HXX //autogen
#include <tools/stream.hxx>
#endif
#ifndef _SFXDOCFILE_HXX //autogen
#include <sfx2/docfile.hxx>
#endif
#ifndef SVTOOLS_URIHELPER_HXX
#include <svtools/urihelper.hxx>
#endif
#ifndef _FILTER_HXX //autogen
#include <svtools/filter.hxx>
#endif
#ifndef _SVX_IMPGRF_HXX //autogen
#include <svx/impgrf.hxx>
#endif
#ifndef _SVX_FONTITEM_HXX //autogen
#include <svx/fontitem.hxx>
#endif
#ifndef _EEITEM_HXX
#include <svx/eeitem.hxx>
#endif


#ifndef _TOOLS_TEMPFILE_HXX
#include <tools/tempfile.hxx>
#endif
#ifndef _SHELLIO_HXX
#include <shellio.hxx>
#endif
#ifndef _PAM_HXX
#include <pam.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _DOCARY_HXX
#include <docary.hxx>
#endif
#ifndef _NODE_HXX
#include <node.hxx>
#endif
#ifndef _FORMAT_HXX
#include <format.hxx>
#endif
#ifndef _BOOKMRK_HXX
#include <bookmrk.hxx>          // fuer SwBookmark ...
#endif
#ifndef _NUMRULE_HXX //autogen
#include <numrule.hxx>
#endif

#ifndef _SWSWERROR_H
#include <swerror.h>
#endif

// Stringbuffer fuer die umgewandelten Zahlen
static sal_Char aNToABuf[] = "0000000000000000000000000";
#define NTOABUFLEN (sizeof(aNToABuf))

DECLARE_TABLE( SwBookmarkNodeTable, SvPtrarr* )

struct Writer_Impl
{
    SvStringsSortDtor *pSrcArr, *pDestArr;
    SvPtrarr* pFontRemoveLst, *pBkmkArr;
    SwBookmarkNodeTable* pBkmkNodePos;

    Writer_Impl( const SwDoc& rDoc );
    ~Writer_Impl();

    void RemoveFontList( SwDoc& rDoc );
    void InsertBkmk( const SwBookmark& rBkmk );
};

Writer_Impl::Writer_Impl( const SwDoc& rDoc )
    : pSrcArr( 0 ), pDestArr( 0 ), pFontRemoveLst( 0 ), pBkmkNodePos( 0 )
{
}

Writer_Impl::~Writer_Impl()
{
    delete pSrcArr;
    delete pDestArr;
    delete pFontRemoveLst;

    if( pBkmkNodePos )
    {
        for( SvPtrarr* p = pBkmkNodePos->First(); p; p = pBkmkNodePos->Next() )
            delete p;
        delete pBkmkNodePos;
    }
}

void Writer_Impl::RemoveFontList( SwDoc& rDoc )
{
    ASSERT( pFontRemoveLst, "wo ist die FontListe?" );
    for( USHORT i = pFontRemoveLst->Count(); i; )
    {
        SvxFontItem* pItem = (SvxFontItem*)(*pFontRemoveLst)[ --i ];
        rDoc.GetAttrPool().Remove( *pItem );
    }
}

void Writer_Impl::InsertBkmk( const SwBookmark& rBkmk )
{
    if( !pBkmkNodePos )
        pBkmkNodePos = new SwBookmarkNodeTable;

    ULONG nNd = rBkmk.GetPos().nNode.GetIndex();
    SvPtrarr* pArr = pBkmkNodePos->Get( nNd );
    if( !pArr )
    {
        pArr = new SvPtrarr( 1, 4 );
        pBkmkNodePos->Insert( nNd, pArr );
    }

    void* p = (void*)&rBkmk;
    pArr->Insert( p, pArr->Count() );

    if( rBkmk.GetOtherPos() && rBkmk.GetOtherPos()->nNode != nNd )
    {
        nNd = rBkmk.GetOtherPos()->nNode.GetIndex();
        pArr = pBkmkNodePos->Get( nNd );
        if( !pArr )
        {
            pArr = new SvPtrarr( 1, 4 );
            pBkmkNodePos->Insert( nNd, pArr );
        }
        pArr->Insert( p, pArr->Count() );
    }
}

/*
 * Dieses Modul ist die Zentrale-Sammelstelle fuer alle Write-Filter
 * und ist eine DLL !
 *
 * Damit der Writer mit den unterschiedlichen Writern arbeiten kann,
 * muessen fuer diese die Ausgabe-Funktionen der Inhalts tragenden
 * Objecte auf die verschiedenen Ausgabe-Funktionen gemappt werden.
 *
 * Dazu kann fuer jedes Object ueber den Which-Wert in einen Tabelle ge-
 * griffen werden, um seine Ausgabe-Funktion zu erfragen.
 * Diese Funktionen stehen in den entsprechenden Writer-DLL's.
 */

Writer::Writer()
    : pImpl( 0 ), pStrm( 0 ), pOrigPam( 0 ), pOrigFileName( 0 ),
    pCurPam(0), pDoc( 0 )
{
    bWriteAll = bShowProgress = bUCS2_WithStartChar = TRUE;
    bASCII_NoLastLineEnd = bASCII_ParaAsBlanc = bASCII_ParaAsCR =
        bWriteClipboardDoc = bWriteOnlyFirstTable = FALSE;
}

Writer::~Writer()
{
}

void Writer::ResetWriter()
{
    if( pImpl && pImpl->pFontRemoveLst )
        pImpl->RemoveFontList( *pDoc );
    delete pImpl, pImpl = 0;

    if( pCurPam )
    {
        while( pCurPam->GetNext() != pCurPam )
            delete pCurPam->GetNext();
        delete pCurPam;
    }
    pCurPam = 0;
    pOrigFileName = 0;
    pDoc = 0;
    pStrm = 0;

    bShowProgress = bUCS2_WithStartChar = TRUE;
    bASCII_NoLastLineEnd = bASCII_ParaAsBlanc = bASCII_ParaAsCR =
        bWriteClipboardDoc = bWriteOnlyFirstTable = FALSE;
}

BOOL Writer::CopyNextPam( SwPaM ** ppPam )
{
    if( (*ppPam)->GetNext() == pOrigPam )
    {
        *ppPam = pOrigPam;          // wieder auf den Anfangs-Pam setzen
        return FALSE;               // Ende vom Ring
    }

    // ansonsten kopiere den die Werte aus dem naechsten Pam
    *ppPam = ((SwPaM*)(*ppPam)->GetNext() );

    *pCurPam->GetPoint() = *(*ppPam)->Start();
    *pCurPam->GetMark() = *(*ppPam)->End();

    return TRUE;
}

// suche die naechste Bookmark-Position aus der Bookmark-Tabelle

USHORT Writer::FindPos_Bkmk( const SwPosition& rPos ) const
{
    USHORT nRet = USHRT_MAX;
    const SwBookmarks& rBkmks = pDoc->GetBookmarks();

    if( rBkmks.Count() )
    {
        SwBookmark aBkmk( rPos );
        USHORT nPos;
        if( rBkmks.Seek_Entry( &aBkmk, &nPos ))
        {
            // suche abwaerts nach weiteren Bookmarks auf der Cursor-Position
            while( 0 < nPos &&
                rBkmks[ nPos-1 ]->IsEqualPos( aBkmk ))
                --nPos;
        }
        else if( nPos < rBkmks.Count() )
            nRet = nPos;
    }
    return nRet;
}


SwPaM* Writer::NewSwPaM( SwDoc & rDoc, ULONG nStartIdx, ULONG nEndIdx,
                        BOOL bNodesArray ) const
{
    SwNodes* pNds = bNodesArray ? &rDoc.GetNodes() : (SwNodes*)rDoc.GetUndoNds();

    SwNodeIndex aStt( *pNds, nStartIdx );
    SwCntntNode* pCNode = aStt.GetNode().GetCntntNode();
    if( !pCNode && 0 == ( pCNode = pNds->GoNext( &aStt )) )
        ASSERT( !this, "An StartPos kein ContentNode mehr" );

    SwPaM* pNew = new SwPaM( aStt );
    pNew->SetMark();
    aStt = nEndIdx;
    if( 0 == (pCNode = aStt.GetNode().GetCntntNode()) &&
        0 == (pCNode = pNds->GoPrevious( &aStt )) )
        ASSERT( !this, "An StartPos kein ContentNode mehr" );
    pCNode->MakeEndIndex( &pNew->GetPoint()->nContent );
    pNew->GetPoint()->nNode = aStt;
    return pNew;
}

/////////////////////////////////////////////////////////////////////////////

// Stream-spezifisches
#ifndef PRODUCT
SvStream& Writer::Strm()
{
    ASSERT( pStrm, "Oh-oh. Dies ist ein Storage-Writer. Gleich knallts!" );
    return *pStrm;
}
#endif


SvStream& Writer::OutHex( SvStream& rStrm, ULONG nHex, BYTE nLen )
{                                                  // in einen Stream aus
    // Pointer an das Bufferende setzen
    sal_Char* pStr = aNToABuf + (NTOABUFLEN-1);
    for( BYTE n = 0; n < nLen; ++n )
    {
        *(--pStr) = (sal_Char)(nHex & 0xf ) + 48;
        if( *pStr > '9' )
            *pStr += 39;
        nHex >>= 4;
    }
    return rStrm << pStr;
}

SvStream& Writer::OutLong( SvStream& rStrm, long nVal )
{
    // Pointer an das Bufferende setzen
    sal_Char* pStr = aNToABuf + (NTOABUFLEN-1);

    int bNeg = nVal < 0;
    if( bNeg )
        nVal = -nVal;

    do {
        *(--pStr) = (sal_Char)(nVal % 10 ) + 48;
        nVal /= 10;
    } while( nVal );

    // Ist Zahl negativ, dann noch -
    if( bNeg )
        *(--pStr) = '-';

    return rStrm << pStr;
}

SvStream& Writer::OutULong( SvStream& rStrm, ULONG nVal )
{
    // Pointer an das Bufferende setzen
    sal_Char* pStr = aNToABuf + (NTOABUFLEN-1);

    do {
        *(--pStr) = (sal_Char)(nVal % 10 ) + 48;
        nVal /= 10;
    } while ( nVal );
    return rStrm << pStr;
}


ULONG Writer::Write( SwPaM& rPaM, SvStream& rStrm, const String* pFName )
{
    pStrm = &rStrm;
    pDoc = rPaM.GetDoc();
    pOrigFileName = pFName;
    pImpl = new Writer_Impl( *pDoc );

    // PaM kopieren, damit er veraendert werden kann
    pCurPam = new SwPaM( *rPaM.End(), *rPaM.Start() );
    // zum Vergleich auf den akt. Pam sichern
    pOrigPam = &rPaM;

    ULONG nRet = WriteStream();

    ResetWriter();

    return nRet;
}

ULONG Writer::Write( SwPaM& rPam, SfxMedium& rMed, const String* pFileName )
{
    return IsStgWriter()
                ? Write( rPam, *rMed.GetStorage(), pFileName )
                : Write( rPam, *rMed.GetOutStream(), pFileName );
}

ULONG Writer::Write( SwPaM& rPam, SvStorage&, const String* )
{
    ASSERT( !this, "Schreiben in Storages auf einem Stream?" );
    return ERR_SWG_WRITE_ERROR;
}


BOOL Writer::CopyLocalFileToINet( String& rFileNm, BOOL bCIdTarget )
{
    BOOL bRet = FALSE;
    INetURLObject aFileUrl( rFileNm ), aTargetUrl( *pOrigFileName );
    if( ( INET_PROT_FILE == aFileUrl.GetProtocol() ||
          (bCIdTarget && INET_PROT_CID == aFileUrl.GetProtocol()) ) &&
        ( (bCIdTarget && INET_PROT_FILE == aTargetUrl.GetProtocol()) ||
          (!bCIdTarget && INET_PROT_FILE != aTargetUrl.GetProtocol() &&
                          INET_PROT_FTP <= aTargetUrl.GetProtocol() &&
                          INET_PROT_NEWS >= aTargetUrl.GetProtocol()) ) )
    {
        if( pImpl->pSrcArr )
        {
            // wurde die Datei schon verschoben
            USHORT nPos;
            if( pImpl->pSrcArr->Seek_Entry( &rFileNm, &nPos ))
            {
                rFileNm = *(*pImpl->pDestArr)[ nPos ];
                return TRUE;
            }
        }
        else
        {
            pImpl->pSrcArr = new SvStringsSortDtor( 4, 4 );
            pImpl->pDestArr = new SvStringsSortDtor( 4, 4 );
        }

        String* pSrc = new String( rFileNm );

        String* pDest = 0;

        if( INET_PROT_FILE == aFileUrl.GetProtocol() )
        {
            SvFileStream aTmp( aFileUrl.PathToFileName(), STREAM_READ );

            pDest = new String( aTargetUrl.GetPartBeforeLastName() );
            *pDest += aFileUrl.GetName();

            if( INET_PROT_FILE == aTargetUrl.GetProtocol() )
            {
                ASSERT( bCIdTarget,
                        "CopyLocalFile: file->file: CId-Flag nicht gesetzt" );
                INetURLObject aCpyURL( *pDest );
                SvFileStream aCpy( aCpyURL.PathToFileName(), STREAM_WRITE );
                aCpy << aTmp;

                aCpy.Close();
                bRet = SVSTREAM_OK == aCpy.GetError();
            }
            else
            {
                ASSERT( !bCIdTarget,
                        "CopyLocalFile: file->net: CId-Flag gesetzt" );
                SfxMedium aMedium( *pDest, STREAM_WRITE | STREAM_SHARE_DENYNONE,
                                    FALSE, FALSE );

                SvFileStream aCpy( aMedium.GetPhysicalName(), STREAM_WRITE );
                aCpy << aTmp;
                aCpy.Close();

                aMedium.Close();
                aMedium.Commit();

                bRet = 0 == aMedium.GetError();
            }
        }
        else
        {
            ASSERT( INET_PROT_CID == aFileUrl.GetProtocol(),
                    "CopyLocalFile: cid->file: Source-URL nicht cid" );
            ASSERT( INET_PROT_FILE == aTargetUrl.GetProtocol(),
                    "CopyLocalFile: cid->file: Target-URL nicht file" );
            ASSERT( bCIdTarget,
                    "CopyLocalFile: cid->file: CId-Flag nicht gesetzt" );

            SfxMedium aMedium( *pSrc, STREAM_READ | STREAM_SHARE_DENYNONE,
                                FALSE, TRUE );
            if( aMedium.GetInStream() )
            {
                // Eine CID-URL wird in eine Datei kopiert, wenn eine
                // Mail beantworted wird. Die Datei muss dann die richtige
                // Extension bekommen. Da Netscape-CIDs keine Extensions
                // enthalten muessen wir sie ueber den Grafik-Typ
                // bestimmen und koennen sie nicht uas der URL extrahieren.
                GraphicDescriptor aDesc( *aMedium.GetInStream() );
                GraphicFilter *pGrfFilter = GetGrfFilter();

                if ( aDesc.Detect( FALSE ) )
                {
                    String aExt( pGrfFilter->GetImportFormatShortName(
                        aDesc.GetImportFormatNumber( aDesc.GetFileFormat(),
                                                pGrfFilter->GetConfig() ) ) );

                    INetURLObject aAbsObj(URIHelper::SmartRelToAbs(aTargetUrl.GetMainURL()));
                    aAbsObj.removeSegment();
                    String sPath(aAbsObj.GetMainURL());
                    TempFile aTempFile(aTargetUrl.GetBase(), &aExt, &sPath);

                    SvFileStream aCpy( aTempFile.GetName(), STREAM_WRITE );
                    aCpy << *aMedium.GetInStream();
                    aCpy.Close();

                    bRet = SVSTREAM_OK == aCpy.GetError();
                    if( bRet )
                        pDest = new String( aTempFile.GetName() );
                }
            }
        }

        if( bRet )
        {
            pImpl->pSrcArr->Insert( pSrc );
            pImpl->pDestArr->Insert( pDest );
            rFileNm = *pDest;
        }
        else
        {
            delete pSrc;
            delete pDest;
        }
    }

    return bRet;
}

void Writer::PutNumFmtFontsInAttrPool()
{
    // dann gibt es noch in den NumRules ein paar Fonts
    // Diese in den Pool putten. Haben sie danach einen RefCount > 1
    // kann es wieder entfernt werden - ist schon im Pool
    SfxItemPool& rPool = pDoc->GetAttrPool();
    const SwNumRuleTbl& rListTbl = pDoc->GetNumRuleTbl();
    const SwNumRule* pRule;
    const SwNumFmt* pFmt;
    const Font *pFont, *pDefFont = &SwNumRule::GetDefBulletFont();
    BOOL bCheck = FALSE;

    for( USHORT nGet = rListTbl.Count(); nGet; )
        if( pDoc->IsUsed( *(pRule = rListTbl[ --nGet ] )))
            for( BYTE nLvl = 0; nLvl < MAXLEVEL; ++nLvl )
                if( SVX_NUM_CHAR_SPECIAL == (pFmt = &pRule->Get( nLvl ))->eType ||
                    SVX_NUM_BITMAP == pFmt->eType )
                {
                    if( 0 == ( pFont = pFmt->GetBulletFont() ) )
                        pFont = pDefFont;

                    if( bCheck )
                    {
                        if( *pFont == *pDefFont )
                            continue;
                    }
                    else if( *pFont == *pDefFont )
                        bCheck = TRUE;

                    _AddFontItem( rPool, SvxFontItem( pFont->GetFamily(),
                                pFont->GetName(), pFont->GetStyleName(),
                                pFont->GetPitch(), pFont->GetCharSet() ));
                }
}

void Writer::PutEditEngFontsInAttrPool()
{
    SfxItemPool& rPool = pDoc->GetAttrPool();
    if( rPool.GetSecondaryPool() )
    {
        USHORT nW = EE_CHAR_FONTINFO;
        const SvxFontItem* pFont = (const SvxFontItem*)&rPool.GetDefaultItem( nW );
        _AddFontItem( rPool, *pFont );

        if( 0 != ( pFont = (const SvxFontItem*)rPool.GetPoolDefaultItem( nW )) )
            _AddFontItem( rPool, *pFont );

        USHORT nMaxItem = rPool.GetItemCount( nW );
        for( USHORT nGet = 0; nGet < nMaxItem; ++nGet )
            if( 0 != (pFont = (const SvxFontItem*)rPool.GetItem( nW, nGet )) )
                _AddFontItem( rPool, *pFont );
    }
}

void Writer::_AddFontItem( SfxItemPool& rPool, const SvxFontItem& rFont )
{
    const SvxFontItem* pItem;
    if( RES_CHRATR_FONT != rFont.Which() )
    {
        SvxFontItem aFont( rFont );
        aFont.SetWhich( RES_CHRATR_FONT );
        pItem = (SvxFontItem*)&rPool.Put( aFont );
    }
    else
        pItem = (SvxFontItem*)&rPool.Put( rFont );

    if( 1 < pItem->GetRef() )
        rPool.Remove( *pItem );
    else
    {
        if( !pImpl->pFontRemoveLst )
            pImpl->pFontRemoveLst = new SvPtrarr( 0, 10 );

        void* p = (void*)pItem;
        pImpl->pFontRemoveLst->Insert( p, pImpl->pFontRemoveLst->Count() );
    }
}

// build a bookmark table, which is sort by the node position. The
// OtherPos of the bookmarks also inserted.
void Writer::CreateBookmarkTbl()
{
    const SwBookmarks& rBkmks = pDoc->GetBookmarks();
    for( USHORT n = rBkmks.Count(); n; )
    {
        const SwBookmark& rBkmk = *rBkmks[ --n ];
        if( rBkmk.IsBookMark() )
            pImpl->InsertBkmk( rBkmk );
    }
}


// search alle Bookmarks in the range and return it in the Array
USHORT Writer::GetBookmarks( const SwCntntNode& rNd, xub_StrLen nStt,
                             xub_StrLen nEnd, SvPtrarr& rArr )
{
    ASSERT( !rArr.Count(), "es sind noch Eintraege vorhanden" );

    ULONG nNd = rNd.GetIndex();
    SvPtrarr* pArr = pImpl->pBkmkNodePos ? pImpl->pBkmkNodePos->Get( nNd ) : 0;
    if( pArr )
    {
        // there exist some bookmarks, search now all which is in the range
        if( !nStt && nEnd == rNd.Len() )
            // all
            rArr.Insert( pArr, 0 );
        else
        {
            USHORT n;
            xub_StrLen nCntnt;
            for( n = 0; n < pArr->Count(); ++n )
            {
                void* p = (*pArr)[ n ];
                const SwBookmark& rBkmk = *(SwBookmark*)p;
                if( rBkmk.GetPos().nNode == nNd &&
                    (nCntnt = rBkmk.GetPos().nContent.GetIndex() ) >= nStt &&
                    nCntnt < nEnd )
                {
                    rArr.Insert( p, rArr.Count() );
                }
                else if( rBkmk.GetOtherPos() && nNd ==
                        rBkmk.GetOtherPos()->nNode.GetIndex() && (nCntnt =
                        rBkmk.GetOtherPos()->nContent.GetIndex() ) >= nStt &&
                        nCntnt < nEnd )
                {
                    rArr.Insert( p, rArr.Count() );
                }
            }
        }
    }
    return rArr.Count();
}

////////////////////////////////////////////////////////////////////////////

// Storage-spezifisches

ULONG StgWriter::WriteStream()
{
    ASSERT( !this, "Schreiben in Streams auf einem Storage?" );
    return ERR_SWG_WRITE_ERROR;
}

ULONG StgWriter::Write( SwPaM& rPaM, SvStorage& rStg, const String* pFName )
{
    pStrm = 0;
    pStg = &rStg;
    pDoc = rPaM.GetDoc();
    pOrigFileName = pFName;
    pImpl = new Writer_Impl( *pDoc );

    // PaM kopieren, damit er veraendert werden kann
    pCurPam = new SwPaM( *rPaM.End(), *rPaM.Start() );
    // zum Vergleich auf den akt. Pam sichern
    pOrigPam = &rPaM;

    ULONG nRet = WriteStorage();

    pStg = NULL;
    ResetWriter();

    return nRet;
}

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/writer/writer.cxx,v 1.1.1.1 2000-09-18 17:14:57 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.103  2000/09/18 16:04:55  willem.vandorp
      OpenOffice header added.

      Revision 1.102  2000/08/04 16:25:50  jp
      read/write unicode ascii files

      Revision 1.101  2000/06/26 13:01:26  os
      INetURLObject::SmartRelToAbs removed

      Revision 1.100  2000/06/13 09:43:46  os
      using UCB

      Revision 1.99  2000/05/08 16:51:53  jp
      Changes for Unicode

      Revision 1.98  1999/10/13 10:38:29  jp
      PutEditEngFontsInAtrPool - check if the editenginepool exist

      Revision 1.97  1999/10/12 20:04:37  jp
      Writer: put EditEngine fonts into the writer pool

      Revision 1.96  1999/08/12 10:19:56  MIB
      Don\'t delete impl if it hasn\'t been set (for XML filter)


      Rev 1.95   12 Aug 1999 12:19:56   MIB
   Don't delete impl if it hasn't been set (for XML filter)

      Rev 1.94   30 Jun 1999 18:53:20   JP
   dtor for impl class

      Rev 1.93   24 Jun 1999 22:51:34   JP
   new: Writer with internal Impl-structur, build Bookmark table sortet by nodes

      Rev 1.92   23 Jun 1999 19:13:40   JP
   interface of Writer::FindPos_Bkmk has changed

      Rev 1.91   16 Jun 1999 19:52:14   JP
   Change interface of base class Writer

      Rev 1.90   28 Jan 1999 14:21:28   JP
   GraphicFilter-SS hat sich geaendert - Task #59174#

      Rev 1.89   30 Oct 1998 18:30:02   JP
   Task #58596#: neues Flag an der Writerklasse -> schreibe nur die 1. Tabelle

      Rev 1.88   27 Jun 1998 16:02:08   JP
   Writer mit neuen Flags; fuer den ASCII-Writer, etwas aufgeraeumt

      Rev 1.87   23 Apr 1998 19:07:44   MIB
   fix #49729#: Stream beim kopieren von Grafiken ins INet schliessen

      Rev 1.86   22 Jan 1998 20:02:56   JP
   CTOR des SwPaM umgestellt

      Rev 1.85   26 Nov 1997 14:29:14   MA
   headerfiles

      Rev 1.84   03 Nov 1997 14:12:48   MA
   precomp entfernt

      Rev 1.83   13 Oct 1997 16:06:34   JP
   pNext vom Ring wurde privat; zugriff ueber GetNext()

      Rev 1.82   09 Oct 1997 14:26:24   JP
   Umstellung NodeIndex/-Array/BigPtrArray

      Rev 1.81   03 Sep 1997 11:59:44   JP
   zusaetzliches include von docary

*************************************************************************/

diff --git a/sw/source/filter/writer/wrt_fn.cxx b/sw/source/filter/writer/wrt_fn.cxx
new file mode 100644
index 0000000..98784a8a
--- /dev/null
+++ b/sw/source/filter/writer/wrt_fn.cxx
@@ -0,0 +1,230 @@
/*************************************************************************
 *
 *  $RCSfile: wrt_fn.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:57 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SFXITEMITER_HXX //autogen
#include <svtools/itemiter.hxx>
#endif
#ifndef _SFX_WHITER_HXX //autogen
#include <svtools/whiter.hxx>
#endif


#include "shellio.hxx"
#include "wrt_fn.hxx"
#include "pam.hxx"
#include "node.hxx"
#include "format.hxx"



Writer& Out( const SwAttrFnTab pTab, const SfxPoolItem& rHt, Writer & rWrt )
{
    USHORT nId = rHt.Which();
    ASSERT(  nId < POOLATTR_END && nId >= POOLATTR_BEGIN, "SwAttrFnTab::Out()" );
    FnAttrOut pOut;
    if( 0 != ( pOut = pTab[ nId - RES_CHRATR_BEGIN] ))
        (*pOut)( rWrt, rHt );
    return rWrt;

}

Writer& Out_SfxItemSet( const SwAttrFnTab pTab, Writer& rWrt,
                        const SfxItemSet& rSet, BOOL bDeep,
                        BOOL bTstForDefault )
{
    // erst die eigenen Attribute ausgeben
    const SfxItemPool& rPool = *rSet.GetPool();
    const SfxItemSet* pSet = &rSet;
    if( !pSet->Count() )        // Optimierung - leere Sets
    {
        if( !bDeep )
            return rWrt;
        while( 0 != ( pSet = pSet->GetParent() ) && !pSet->Count() )
            ;
        if( !pSet )
            return rWrt;
    }
    const SfxPoolItem* pItem;
    FnAttrOut pOut;
    if( !bDeep || !pSet->GetParent() )
    {
        ASSERT( rSet.Count(), "Wurde doch schon behandelt oder?" );
        SfxItemIter aIter( *pSet );
        pItem = aIter.GetCurItem();
        do {
            if( 0 != ( pOut = pTab[ pItem->Which() - RES_CHRATR_BEGIN] ))
                    (*pOut)( rWrt, *pItem );
        } while( !aIter.IsAtEnd() && 0 != ( pItem = aIter.NextItem() ) );
    }
    else
    {
        SfxWhichIter aIter( *pSet );
        register USHORT nWhich = aIter.FirstWhich();
        while( nWhich )
        {
            if( SFX_ITEM_SET == pSet->GetItemState( nWhich, bDeep, &pItem ) &&
                ( !bTstForDefault || (
                    *pItem != rPool.GetDefaultItem( nWhich )
                    || ( pSet->GetParent() &&
                        *pItem != pSet->GetParent()->Get( nWhich ))
                )) && 0 != ( pOut = pTab[ nWhich - RES_CHRATR_BEGIN] ))
                    (*pOut)( rWrt, *pItem );
            nWhich = aIter.NextWhich();
        }
    }
    return rWrt;
}



Writer& Out( const SwNodeFnTab pTab, SwNode& rNode, Writer & rWrt )
{
    // es muss ein CntntNode sein !!
    SwCntntNode * pCNd = rNode.GetCntntNode();
    if( !pCNd )
        return rWrt;

    USHORT nId;
    switch( pCNd->GetNodeType() )
    {
    case ND_TEXTNODE:   nId = RES_TXTNODE;  break;
    case ND_GRFNODE:    nId = RES_GRFNODE;  break;
    case ND_OLENODE:    nId = RES_OLENODE;  break;
    default:
        ASSERT( FALSE, "was fuer ein Node ist es denn nun?" );
    }
    FnNodeOut pOut;
    if( 0 != ( pOut = pTab[ nId - RES_NODE_BEGIN ] ))
        (*pOut)( rWrt, *pCNd );
    return rWrt;
}


/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/writer/wrt_fn.cxx,v 1.1.1.1 2000-09-18 17:14:57 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.32  2000/09/18 16:04:55  willem.vandorp
      OpenOffice header added.

      Revision 1.31  1999/07/06 12:55:38  JP
      Out_SfxItemSet: test to default items optional


      Rev 1.30   06 Jul 1999 14:55:38   JP
   Out_SfxItemSet: test to default items optional

      Rev 1.29   26 Nov 1997 14:29:14   MA
   headerfiles

      Rev 1.28   03 Nov 1997 14:12:48   MA
   precomp entfernt

      Rev 1.27   22 Jan 1997 12:01:18   JP
   neu: Tabellen Box Attribute

      Rev 1.26   16 Oct 1996 16:58:54   JP
   unbenutzte Methoden entfernt

      Rev 1.25   01 Jul 1996 16:03:14   MA
   includes

      Rev 1.24   22 Mar 1996 14:52:12   SWG
   include hinzugefuegt

      Rev 1.23   24 Nov 1995 17:24:42   OM
   PCH->PRECOMPILED

      Rev 1.22   25 Oct 1994 15:57:12   MA
   PreHdr.

      Rev 1.21   04 Oct 1994 16:34:06   JP
   Out_SfxItemSet: optimiert

      Rev 1.20   28 Sep 1994 12:37:34   JP
   neue Methode: Out_SfxItemSet

      Rev 1.19   25 Aug 1994 18:09:12   JP
   Umstellung Attribute (von SwHint -> SfxPoolItem)

      Rev 1.18   15 Feb 1994 15:31:30   MI
   handsegmentierung

      Rev 1.17   28 Jan 1994 11:34:06   MI
   TCOV() entfernt, SW_... nach SEG_... umbenannt

      Rev 1.16   13 Jan 1994 08:31:32   MI
   Segmentierung per #define ermoeglicht

*************************************************************************/


diff --git a/sw/source/filter/writer/wrtswtbl.cxx b/sw/source/filter/writer/wrtswtbl.cxx
new file mode 100644
index 0000000..308c191
--- /dev/null
+++ b/sw/source/filter/writer/wrtswtbl.cxx
@@ -0,0 +1,959 @@
/*************************************************************************
 *
 *  $RCSfile: wrtswtbl.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:57 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PCH
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _TOOLS_DEBUG_HXX
#include <tools/debug.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _FRACT_HXX
#include <tools/fract.hxx>
#endif

#ifndef _WRTSWTBL_HXX
#include <wrtswtbl.hxx>
#endif
#ifndef _SWTABLE_HXX
#include <swtable.hxx>
#endif
#ifndef _FRMFMT_HXX
#include <frmfmt.hxx>
#endif
#ifndef _FMTFSIZE_HXX
#include <fmtfsize.hxx>
#endif
#ifndef _FMTORNT_HXX
#include <fmtornt.hxx>
#endif
#ifndef _FRMATR_HXX
#include <frmatr.hxx>
#endif
#ifndef _HTMLTBL_HXX
#include <htmltbl.hxx>
#endif


SV_IMPL_PTRARR( SwWriteTableCells, SwWriteTableCellPtr )
SV_IMPL_OP_PTRARR_SORT( SwWriteTableRows, SwWriteTableRowPtr )
SV_IMPL_OP_PTRARR_SORT( SwWriteTableCols, SwWriteTableColPtr )

//-----------------------------------------------------------------------

SwVertOrient SwWriteTableCell::GetVertOri() const
{
    SwVertOrient eCellVertOri = VERT_TOP;
    if( pBox->GetSttNd() )
    {
        const SfxItemSet& rItemSet = pBox->GetFrmFmt()->GetAttrSet();
        const SfxPoolItem *pItem;
        if( SFX_ITEM_SET == rItemSet.GetItemState( RES_VERT_ORIENT, FALSE, &pItem ) )
        {
            SwVertOrient eBoxVertOri =
                ((const SwFmtVertOrient *)pItem)->GetVertOrient();
            if( VERT_CENTER==eBoxVertOri || VERT_BOTTOM==eBoxVertOri)
                eCellVertOri = eBoxVertOri;
        }
    }

    return eCellVertOri;
}

//-----------------------------------------------------------------------

SwWriteTableRow::SwWriteTableRow( long nPosition )
    : nPos(nPosition), pBackground( 0 ),
    bTopBorder(TRUE), bBottomBorder(TRUE),
    nTopBorder(USHRT_MAX), nBottomBorder(USHRT_MAX)
{
}


SwWriteTableCell *SwWriteTableRow::AddCell( const SwTableBox *pBox,
                                USHORT nRow, USHORT nCol,
                                USHORT nRowSpan, USHORT nColSpan,
                                long nHeight,
                                const SvxBrushItem *pBackground )
{
    SwWriteTableCell *pCell =
        new SwWriteTableCell( pBox, nRow, nCol, nRowSpan, nColSpan,
                                nHeight, pBackground );
    aCells.Insert( pCell, aCells.Count() );

    return pCell;
}

//-----------------------------------------------------------------------

SwWriteTableCol::SwWriteTableCol( USHORT nPosition )
    : nPos(nPosition),
    bLeftBorder(TRUE), bRightBorder(TRUE),
    nWidthOpt( 0 ), bRelWidthOpt( FALSE ),
    bOutWidth( TRUE )
{
}

//-----------------------------------------------------------------------

long SwWriteTable::GetBoxWidth( const SwTableBox *pBox )
{
    const SwFrmFmt *pFmt = pBox->GetFrmFmt();
    const SwFmtFrmSize& aFrmSize=
        (const SwFmtFrmSize&)pFmt->GetAttr( RES_FRM_SIZE );

    return aFrmSize.GetSize().Width();
}

long SwWriteTable::GetLineHeight( const SwTableLine *pLine )
{
#ifndef PRODUCT
    BOOL bOldGetLineHeightCalled = bGetLineHeightCalled;
    bGetLineHeightCalled = TRUE;
#endif

    long nHeight = 0;
    if( bUseLayoutHeights )
    {
        // Erstmal versuchen wir die Hoehe ueber das Layout zu bekommen
        long nHeight = pLine->GetLineRect( FALSE ).Height();
        if( nHeight > 0 )
            return nHeight;

        // Wenn kein Layout gefunden wurde, gehen wir von festen Hoehen aus.
        bUseLayoutHeights = FALSE;

#ifndef PRODUCT
        ASSERT( !bOldGetLineHeightCalled, "Layout ungueltig?" );
#endif
    }

    const SwTableBoxes& rBoxes = pLine->GetTabBoxes();
    USHORT nBoxes = rBoxes.Count();

    for( USHORT nBox=0; nBox<nBoxes; nBox++ )
    {
        const SwTableBox* pBox = rBoxes[nBox];
        if( pBox->GetSttNd() )
        {
            if( nHeight < ROW_DFLT_HEIGHT )
                nHeight = ROW_DFLT_HEIGHT;
        }
        else
        {
            long nTmp = 0;
            const SwTableLines &rLines = pBox->GetTabLines();
            for( USHORT nLine=0; nLine<rLines.Count(); nLine++ )
            {
                nTmp += GetLineHeight( rLines[nLine] );
            }
            if( nHeight < nTmp )
                nHeight = nTmp;
        }
    }

    return nHeight;
}

long SwWriteTable::GetLineHeight( const SwTableBox *pBox ) const
{
    const SwTableLine *pLine = pBox->GetUpper();

    if( !pLine )
        return 0;

    const SwFrmFmt *pLineFrmFmt = pLine->GetFrmFmt();
    const SfxPoolItem* pItem;
    const SfxItemSet& rItemSet = pLineFrmFmt->GetAttrSet();

    long nHeight = 0;
    if( SFX_ITEM_SET == rItemSet.GetItemState( RES_FRM_SIZE, TRUE, &pItem ))
        nHeight = ((SwFmtFrmSize*)pItem)->GetHeight();

    return nHeight;
}

const SvxBrushItem *SwWriteTable::GetLineBrush( const SwTableBox *pBox,
                                                  SwWriteTableRow *pRow )
{
    const SwTableLine *pLine = pBox->GetUpper();

    while( pLine )
    {
        const SwFrmFmt *pLineFrmFmt = pLine->GetFrmFmt();
        const SfxPoolItem* pItem;
        const SfxItemSet& rItemSet = pLineFrmFmt->GetAttrSet();

        const SvxBrushItem *pBrushItem = 0;
        if( SFX_ITEM_SET == rItemSet.GetItemState( RES_BACKGROUND, FALSE,
                                                   &pItem ) )
        {
            if( !pLine->GetUpper() )
            {
                if( !pRow->GetBackground() )
                    pRow->SetBackground( (const SvxBrushItem *)pItem );
                pItem = 0;
            }

            return (const SvxBrushItem *)pItem;
        }

        pBox = pLine->GetUpper();
        pLine = pBox ? pBox->GetUpper() : 0;
    }

    return 0;
}


void SwWriteTable::MergeBorders( const SvxBorderLine* pBorderLine,
                                   BOOL bTable )
{
    if( (UINT32)-1 == nBorderColor )
    {
        Color aGrayColor( COL_GRAY );
        if( !pBorderLine->GetColor().IsRGBEqual( aGrayColor ) )
            nBorderColor = pBorderLine->GetColor().GetColor();
    }

    if( !bCollectBorderWidth )
        return;

    USHORT nOutWidth = pBorderLine->GetOutWidth();
    if( bTable )
    {
        if( nOutWidth && (!nBorder || nOutWidth < nBorder) )
            nBorder = nOutWidth;
    }
    else
    {
        if( nOutWidth && (!nInnerBorder || nOutWidth < nInnerBorder) )
            nInnerBorder = nOutWidth;
    }

    USHORT nDist = pBorderLine->GetInWidth() ? pBorderLine->GetDistance()
                                                : 0;
    if( nDist && (!nCellSpacing || nDist < nCellSpacing) )
        nCellSpacing = nDist;
}


USHORT SwWriteTable::MergeBoxBorders( const SwTableBox *pBox,
                                        USHORT nRow, USHORT nCol,
                                        USHORT nRowSpan, USHORT nColSpan,
                                        USHORT& rTopBorder,
                                        USHORT &rBottomBorder )
{
    USHORT nBorderMask = 0;

    const SwFrmFmt *pFrmFmt = pBox->GetFrmFmt();
    const SvxBoxItem& rBoxItem = (const SvxBoxItem&)pFrmFmt->GetAttr( RES_BOX );

    USHORT nWidth = 0;

    if( rBoxItem.GetTop() )
    {
        nBorderMask |= 1;
        MergeBorders( rBoxItem.GetTop(), nRow==0 );
        rTopBorder = rBoxItem.GetTop()->GetOutWidth();
    }

    if( rBoxItem.GetLeft() )
    {
        nBorderMask |= 4;
        MergeBorders( rBoxItem.GetLeft(), nCol==0 );
    }

    if( rBoxItem.GetBottom() )
    {
        nBorderMask |= 2;
        MergeBorders( rBoxItem.GetBottom(), nRow+nRowSpan==aRows.Count() );
        rBottomBorder = rBoxItem.GetBottom()->GetOutWidth();
    }

    if( rBoxItem.GetRight() )
    {
        nBorderMask |= 8;
        MergeBorders( rBoxItem.GetRight(), nCol+nColSpan==aCols.Count() );
    }

    // If any distance is set, the smallest one is used. This holds for
    // the four distance of a box as well as for the distances of different
    // boxes.
    if( bCollectBorderWidth )
    {
        USHORT nDist = rBoxItem.GetDistance( BOX_LINE_TOP );
        if( nDist && (!nCellPadding || nDist < nCellPadding) )
            nCellPadding = nDist;
        nDist = rBoxItem.GetDistance( BOX_LINE_BOTTOM );
        if( nDist && (!nCellPadding || nDist < nCellPadding) )
            nCellPadding = nDist;
        nDist = rBoxItem.GetDistance( BOX_LINE_LEFT );
        if( nDist && (!nCellPadding || nDist < nCellPadding) )
            nCellPadding = nDist;
        nDist = rBoxItem.GetDistance( BOX_LINE_RIGHT );
        if( nDist && (!nCellPadding || nDist < nCellPadding) )
            nCellPadding = nDist;
    }

    return nBorderMask;
}


USHORT SwWriteTable::GetRawWidth( USHORT nCol, USHORT nColSpan ) const
{
    USHORT nWidth = aCols[nCol+nColSpan-1]->GetPos();
    if( nCol > 0 )
        nWidth -= aCols[nCol-1]->GetPos();

    return nWidth;
}

USHORT SwWriteTable::GetLeftSpace( USHORT nCol ) const
{
    USHORT nSpace = nCellPadding + nCellSpacing;

    // In der ersten Spalte auch noch die Liniendicke abziehen
    if( nCol==0 )
    {
        nSpace += nLeftSub;

        const SwWriteTableCol *pCol = aCols[nCol];
        if( pCol->HasLeftBorder() )
            nSpace += nBorder;
    }

    return nSpace;
}

USHORT SwWriteTable::GetRightSpace( USHORT nCol, USHORT nColSpan ) const
{
    USHORT nSpace = nCellPadding;

    // In der letzten Spalte noch einmal zusaetzlich CELLSPACING und
    // und die Liniendicke abziehen
    if( nCol+nColSpan==aCols.Count() )
    {
        nSpace += (nCellSpacing + nRightSub);

        const SwWriteTableCol *pCol = aCols[nCol+nColSpan-1];
        if( pCol->HasRightBorder() )
            nSpace += nBorder;
    }

    return nSpace;
}

USHORT SwWriteTable::GetAbsWidth( USHORT nCol, USHORT nColSpan ) const
{
    long nWidth = GetRawWidth( nCol, nColSpan );
    if( nBaseWidth != nTabWidth )
    {
        nWidth *= nTabWidth;
        nWidth /= nBaseWidth;
    }

    nWidth -= GetLeftSpace( nCol ) + GetRightSpace( nCol, nColSpan );

    ASSERT( nWidth > 0, "Spaltenbreite <= 0. OK?" );
    return nWidth > 0 ? (USHORT)nWidth : 0;
}

USHORT SwWriteTable::GetRelWidth( USHORT nCol, USHORT nColSpan ) const
{
    long nWidth = GetRawWidth( nCol, nColSpan );

    return (USHORT)(long)Fraction( nWidth*256 + GetBaseWidth()/2,
                                   GetBaseWidth() );
}

USHORT SwWriteTable::GetPrcWidth( USHORT nCol, USHORT nColSpan ) const
{
    long nWidth = GetRawWidth( nCol, nColSpan );

    // sieht komisch aus, ist aber nichts anderes als
    //  [(100 * nWidth) + .5] ohne Rundungsfehler
    return (USHORT)(long)Fraction( nWidth*100 + GetBaseWidth()/2,
                                   GetBaseWidth() );
}

long SwWriteTable::GetAbsHeight( long nRawHeight, USHORT nRow,
                                   USHORT nRowSpan ) const
{
    nRawHeight -= (2*nCellPadding + nCellSpacing);

    // In der ersten Zeile noch einmal zusaetzlich CELLSPACING und
    // und die Liniendicke abziehen
    const SwWriteTableRow *pRow = 0;
    if( nRow==0 )
    {
        nRawHeight -= nCellSpacing;
        pRow = aRows[nRow];
        if( pRow->HasTopBorder() )
            nRawHeight -= nBorder;
    }

    // In der letzten Zeile noch die Liniendicke abziehen
    if( nRow+nRowSpan==aRows.Count() )
    {
        if( !pRow || nRowSpan > 1 )
            pRow = aRows[nRow+nRowSpan-1];
        if( pRow->HasBottomBorder() )
            nRawHeight -= nBorder;
    }

    ASSERT( nRawHeight > 0, "Zeilenheohe <= 0. OK?" );
    return nRawHeight > 0 ? nRawHeight : 0;
}



BOOL SwWriteTable::ShouldExpandSub( const SwTableBox *pBox,
                                      BOOL bExpandedBefore,
                                      USHORT nDepth ) const
{
    return !pBox->GetSttNd() && nDepth > 0;
}

void SwWriteTable::CollectTableRowsCols( long nStartRPos,
                                           USHORT nStartCPos,
                                           long nParentLineHeight,
                                           USHORT nParentLineWidth,
                                           const SwTableLines& rLines,
                                           USHORT nDepth )
{
    BOOL bSubExpanded = FALSE;
    USHORT nLines = rLines.Count();

#ifndef PRODUCT
    USHORT nEndCPos = 0;
#endif

    long nRPos = nStartRPos;
    for( USHORT nLine = 0; nLine < nLines; nLine++ )
    {
        /*const*/ SwTableLine *pLine = rLines[nLine];

        long nOldRPos = nRPos;

        if( nLine < nLines-1 || nParentLineHeight==0  )
        {
            nRPos += GetLineHeight( pLine );
            SwWriteTableRow *pRow = new SwWriteTableRow( nRPos );

            USHORT nRow;
            if( aRows.Seek_Entry( pRow, &nRow ) )
                delete pRow;
            else
                aRows.Insert( pRow );
        }
        else
        {
            long nCheckPos = nRPos + GetLineHeight( pLine );
            nRPos = nStartRPos + nParentLineHeight;
#ifndef PRODUCT
            SwWriteTableRow aRow( nStartRPos + nParentLineHeight );
            ASSERT( aRows.Seek_Entry(&aRow),
                    "Parent-Zeile nicht gefunden" );
            ASSERT( !bUseLayoutHeights ||
                    SwWriteTableRow(nCheckPos) == SwWriteTableRow(nRPos),
                    "Hoehe der Zeilen stimmt nicht mit Parent ueberein" );
#endif
        }

        // Fuer alle Boxen der Zeile ggf. eine Spalte einfuegen
        const SwTableBoxes& rBoxes = pLine->GetTabBoxes();
        USHORT nBoxes = rBoxes.Count();

        USHORT nCPos = nStartCPos;
        for( USHORT nBox=0; nBox<nBoxes; nBox++ )
        {
            const SwTableBox *pBox = rBoxes[nBox];

            USHORT nOldCPos = nCPos;

            if( nBox < nBoxes-1 || (nParentLineWidth==0 && nLine==0)  )
            {
                nCPos += (USHORT)GetBoxWidth( pBox );
                SwWriteTableCol *pCol = new SwWriteTableCol( nCPos );

                USHORT nCol;
                if( aCols.Seek_Entry( pCol, &nCol ) )
                    delete pCol;
                else
                    aCols.Insert( pCol );

                if( nBox==nBoxes-1 )
                {
                    ASSERT( nLine==0 && nParentLineWidth==0,
                            "Jetzt wird die Parent-Breite plattgemacht!" );
                    nParentLineWidth = nCPos-nStartCPos;
                }
            }
            else
            {
#ifndef PRODUCT
                USHORT nCheckPos = nCPos + (USHORT)GetBoxWidth( pBox );
                if( !nEndCPos )
                {
                    nEndCPos = nCheckPos;
                }
                else
                {
                    ASSERT( SwWriteTableCol(nCheckPos) ==
                                                SwWriteTableCol(nEndCPos),
                    "Zelle enthaelt unterschiedlich breite Zeilen" );
                }
#endif
                nCPos = nStartCPos + nParentLineWidth;
#ifndef PRODUCT
                SwWriteTableCol aCol( nStartCPos + nParentLineWidth );
                ASSERT( aCols.Seek_Entry(&aCol),
                        "Parent-Zelle nicht gefunden" );
                ASSERT( SwWriteTableCol(nCheckPos) ==
                                            SwWriteTableCol(nCPos),
                        "Breite der Zellen stimmt nicht mit Parent ueberein" );
#endif
            }

            if( ShouldExpandSub( pBox, bSubExpanded, nDepth ) )
            {
                CollectTableRowsCols( nOldRPos, nOldCPos,
                                        nRPos - nOldRPos,
                                        nCPos - nOldCPos,
                                        pBox->GetTabLines(),
                                        nDepth-1 );
                bSubExpanded = TRUE;
            }
        }
    }
}


void SwWriteTable::FillTableRowsCols( long nStartRPos, USHORT nStartRow,
                                        USHORT nStartCPos, USHORT nStartCol,
                                        long nParentLineHeight,
                                        USHORT nParentLineWidth,
                                        const SwTableLines& rLines,
                                        const SvxBrushItem* pParentBrush,
                                        USHORT nDepth )
{
    USHORT nLines = rLines.Count();
    BOOL bSubExpanded = FALSE;

    // Festlegen der Umrandung
    long nRPos = nStartRPos;
    USHORT nRow = nStartRow;

    for( USHORT nLine = 0; nLine < nLines; nLine++ )
    {
        const SwTableLine *pLine = rLines[nLine];

        // Position der letzten ueberdeckten Zeile ermitteln
        long nOldRPos = nRPos;
        if( nLine < nLines-1 || nParentLineHeight==0 )
            nRPos += GetLineHeight( pLine );
        else
            nRPos = nStartRPos + nParentLineHeight;

        // Und ihren Index
        USHORT nOldRow = nRow;
        SwWriteTableRow aRow( nRPos );
        BOOL bFound = aRows.Seek_Entry( &aRow, &nRow );
        ASSERT( bFound, "Wo ist die Zeile geblieben?" );

        SwWriteTableRow *pRow = aRows[nOldRow];
        SwWriteTableRow *pEndRow = aRows[nRow];
        if( nLine==0 && nParentLineHeight==0 )
            nHeadEndRow = nRow;

        const SwTableBoxes& rBoxes = pLine->GetTabBoxes();

        const SwFrmFmt *pLineFrmFmt = pLine->GetFrmFmt();
        const SfxPoolItem* pItem;
        const SfxItemSet& rItemSet = pLineFrmFmt->GetAttrSet();

        long nHeight = 0;
        if( SFX_ITEM_SET == rItemSet.GetItemState( RES_FRM_SIZE, TRUE, &pItem ))
            nHeight = ((SwFmtFrmSize*)pItem)->GetHeight();


        const SvxBrushItem *pBrushItem, *pLineBrush = pParentBrush;
        if( SFX_ITEM_SET == rItemSet.GetItemState( RES_BACKGROUND, FALSE,
                                                   &pItem ) )
        {
            pLineBrush = (const SvxBrushItem *)pItem;

            // Wenn die Zeile die gesamte Tabelle umspannt, koennen
            // Wir den Hintergrund an der Zeile ausgeben. Sonst muessen
            // wir in an den Zelle ausgeben.
            BOOL bOutAtRow = !nParentLineWidth;
            if( !bOutAtRow && nStartCPos==0 )
            {
                USHORT nEndCol;
                SwWriteTableCol aCol( nParentLineWidth );
                bOutAtRow = aCols.Seek_Entry(&aCol,&nEndCol) &&
                            nEndCol == aCols.Count()-1;
            }
            if( bOutAtRow )
            {
                pRow->SetBackground( pLineBrush );
                pBrushItem = 0;
            }
            else
                pBrushItem = pLineBrush;
        }
        else
        {
            pRow->SetBackground( pLineBrush );
            pBrushItem = 0;
        }

        USHORT nBoxes = rBoxes.Count();
        USHORT nCPos = nStartCPos;
        USHORT nCol = nStartCol;

        for( USHORT nBox=0; nBox<nBoxes; nBox++ )
        {
            const SwTableBox *pBox = rBoxes[nBox];

            // Position der letzten ueberdeckten Spalte ermitteln
            USHORT nOldCPos = nCPos;
            if( nBox < nBoxes-1 || (nParentLineWidth==0 && nLine==0) )
            {
                nCPos += (USHORT)GetBoxWidth( pBox );
                if( nBox==nBoxes-1 )
                    nParentLineWidth = nCPos - nStartCPos;
            }
            else
                nCPos = nStartCPos + nParentLineWidth;

            // Und ihren Index
            USHORT nOldCol = nCol;
            SwWriteTableCol aCol( nCPos );
            BOOL bFound = aCols.Seek_Entry( &aCol, &nCol );
            ASSERT( bFound, "Wo ist die Spalte geblieben?" );

            if( !ShouldExpandSub( pBox, bSubExpanded, nDepth ) )
            {
                USHORT nRowSpan = nRow - nOldRow + 1;
                USHORT nColSpan = nCol - nOldCol + 1;
                pRow->AddCell( pBox, nOldRow, nOldCol,
                               nRowSpan, nColSpan, nHeight,
                               pBrushItem );
                nHeight = 0; // Die Hoehe braucht nur einmal geschieben werden

                if( pBox->GetSttNd() )
                {
                    // Wegen OS/2 schon hier, sonst gibt es einen
                    // Optimierungs-Fehler!!!!
                    SwWriteTableCol *pCol = aCols[nOldCol];

                    USHORT nTopBorder = USHRT_MAX, nBottomBorder = USHRT_MAX;
                    USHORT nBorderMask = MergeBoxBorders( pBox, nOldRow, nOldCol,
                                                          nRowSpan, nColSpan,
                                                          nTopBorder,
                                                          nBottomBorder );

                    if( !(nBorderMask & 4) )
                        pCol->bLeftBorder = FALSE;

                    pCol = aCols[nCol];
                    if( !(nBorderMask & 8) )
                        pCol->bRightBorder = FALSE;

                    if( !(nBorderMask & 1) )
                        pRow->bTopBorder = FALSE;
                    else if( !pRow->nTopBorder || nTopBorder < pRow->nTopBorder )
                        pRow->nTopBorder = nTopBorder;

                    if( !(nBorderMask & 2) )
                        pEndRow->bBottomBorder = FALSE;
                    else if( !pEndRow->nBottomBorder ||
                             nBottomBorder < pEndRow->nBottomBorder )
                        pEndRow->nBottomBorder = nBottomBorder;
                }
                else
                {
                    aCols[nOldCol]->bLeftBorder = FALSE;
                    aCols[nCol]->bRightBorder = FALSE;
                    pRow->bTopBorder = FALSE;
                    pEndRow->bBottomBorder = FALSE;
                }
            }
            else
            {
                FillTableRowsCols( nOldRPos, nOldRow, nOldCPos, nOldCol,
                                    nRPos-nOldRPos, nCPos-nOldCPos,
                                    pBox->GetTabLines(),
                                    pLineBrush, nDepth-1 );
                bSubExpanded = TRUE;
            }

            nCol++; // Die naechste Zelle faengt in der nachten Spalte an
        }

        nRow++;
    }
}

SwWriteTable::SwWriteTable( const SwTableLines& rLines, long nWidth,
                                USHORT nBWidth, BOOL bRel, USHORT nMaxDepth,
                                USHORT nLSub, USHORT nRSub )
    : nBorderColor( (UINT32)-1 ),
    nBorder( 0 ),
    nInnerBorder( 0 ),
    nCellPadding( 0 ),
    nCellSpacing( 0 ),
    nTabWidth( nWidth ),
    nBaseWidth( nBWidth ),
    nLeftSub( nLSub ), nRightSub( nRSub ),
    bRelWidths( bRel ),
    bUseLayoutHeights( TRUE ),
#ifndef PRODUCT
    bGetLineHeightCalled( FALSE ),
#endif
    nHeadEndRow( USHRT_MAX ),
    bColsOption( FALSE ),
    bColTags( TRUE ),
    bLayoutExport( FALSE ),
    bCollectBorderWidth( TRUE )
{
    USHORT nParentWidth = nBaseWidth + nLeftSub + nRightSub;

    // Erstmal die Tabellen-Struktur festlegen. Hinter der Tabelle ist in
    // jedem Fall eine Spalte zu Ende
    SwWriteTableCol *pCol = new SwWriteTableCol( nParentWidth );
    aCols.Insert( pCol );
    CollectTableRowsCols( 0, 0, 0, nParentWidth, rLines, nMaxDepth - 1 );

    // Und jetzt mit leben fuellen
    FillTableRowsCols( 0, 0, 0, 0, 0, nParentWidth, rLines, 0, nMaxDepth - 1 );

    // Einige Twip-Werte an Pixel-Grenzen anpassen
    if( !nBorder )
        nBorder = nInnerBorder;
}



SwWriteTable::SwWriteTable( const SwHTMLTableLayout *pLayoutInfo )
    : nBorderColor( (UINT32)-1 ),
    nBorder( 0 ),
    nInnerBorder( 0 ),
    nCellPadding( 0 ),
    nCellSpacing( 0 ),
    nTabWidth( pLayoutInfo->GetWidthOption() ),
    nBaseWidth( pLayoutInfo->GetWidthOption() ),
    nLeftSub( 0 ), nRightSub( 0 ),
    bRelWidths( pLayoutInfo->HasPrcWidthOption() ),
    bUseLayoutHeights( FALSE ),
#ifndef PRODUCT
    bGetLineHeightCalled( FALSE ),
#endif
    nHeadEndRow( 0 ),
    bColsOption( pLayoutInfo->HasColsOption() ),
    bColTags( pLayoutInfo->HasColTags() ),
    bLayoutExport( TRUE ),
    bCollectBorderWidth( pLayoutInfo->HaveBordersChanged() )
{
    if( !bCollectBorderWidth )
    {
        nBorder = pLayoutInfo->GetBorder();
        nCellPadding = pLayoutInfo->GetCellPadding();
        nCellSpacing = pLayoutInfo->GetCellSpacing();
    }

    USHORT nRow, nCol;
    USHORT nCols = pLayoutInfo->GetColCount();
    USHORT nRows = pLayoutInfo->GetRowCount();

    // Erstmal die Tabellen-Struktur festlegen.
    for( nCol=0; nCol<nCols; nCol++ )
    {
        SwWriteTableCol *pCol =
            new SwWriteTableCol( (nCol+1)*COL_DFLT_WIDTH );

        if( bColTags )
        {
            const SwHTMLTableLayoutColumn *pLayoutCol =
                pLayoutInfo->GetColumn( nCol );
            pCol->SetWidthOpt( pLayoutCol->GetWidthOption(),
                               pLayoutCol->IsRelWidthOption() );
        }

        aCols.Insert( pCol );
    }

    for( nRow=0; nRow<nRows; nRow++ )
    {
        SwWriteTableRow *pRow =
            new SwWriteTableRow( (nRow+1)*ROW_DFLT_HEIGHT );
        pRow->nTopBorder = 0;
        pRow->nBottomBorder = 0;
        aRows.Insert( pRow );
    }

    // Und jetzt mit leben fuellen
    for( nRow=0; nRow<nRows; nRow++ )
    {
        SwWriteTableRow *pRow = aRows[nRow];

        BOOL bHeightExported = FALSE;
        for( nCol=0; nCol<nCols; nCol++ )
        {
            const SwHTMLTableLayoutCell *pLayoutCell =
                pLayoutInfo->GetCell( nRow, nCol );

            const SwHTMLTableLayoutCnts *pLayoutCnts =
                pLayoutCell->GetContents();

            // Beginnt die Zelle eigentlich eine Zeile weiter oben oder
            // weiter vorne?
            if( ( nRow>0 && pLayoutCnts == pLayoutInfo->GetCell(nRow-1,nCol)
                                                      ->GetContents() ) ||
                ( nCol>0 && pLayoutCnts == pLayoutInfo->GetCell(nRow,nCol-1)
                                                      ->GetContents() ) )
            {
                continue;
            }

            USHORT nRowSpan = pLayoutCell->GetRowSpan();
            USHORT nColSpan = pLayoutCell->GetColSpan();
            const SwTableBox *pBox = pLayoutCnts->GetTableBox();
            ASSERT( pBox,
                    "Tabelle in Tabelle kann nicht ueber Layout exportiert werden" );

            long nHeight = bHeightExported ? 0 : GetLineHeight( pBox );
            const SvxBrushItem *pBrushItem = GetLineBrush( pBox, pRow );

            SwWriteTableCell *pCell =
                pRow->AddCell( pBox, nRow, nCol, nRowSpan, nColSpan,
                               nHeight, pBrushItem );
            pCell->SetWidthOpt( pLayoutCell->GetWidthOption(),
                                pLayoutCell->IsPrcWidthOption() );

            USHORT nTopBorder = USHRT_MAX, nBottomBorder = USHRT_MAX;
            USHORT nBorderMask =
            MergeBoxBorders( pBox, nRow, nCol, nRowSpan, nColSpan,
                                nTopBorder, nBottomBorder );

            SwWriteTableCol *pCol = aCols[nCol];
            if( !(nBorderMask & 4) )
                pCol->bLeftBorder = FALSE;

            pCol = aCols[nCol+nColSpan-1];
            if( !(nBorderMask & 8) )
                pCol->bRightBorder = FALSE;

            if( !(nBorderMask & 1) )
                pRow->bTopBorder = FALSE;

            SwWriteTableRow *pEndRow = aRows[nRow+nRowSpan-1];
            if( !(nBorderMask & 2) )
                pEndRow->bBottomBorder = FALSE;

            // Die Hoehe braucht nur einmal geschieben werden
            if( nHeight )
                bHeightExported = TRUE;
        }
    }

    // Einige Twip-Werte an Pixel-Grenzen anpassen
    if( bCollectBorderWidth && !nBorder )
        nBorder = nInnerBorder;
}



/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/writer/wrtswtbl.cxx,v 1.1.1.1 2000-09-18 17:14:57 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.3  2000/09/18 16:04:55  willem.vandorp
      OpenOffice header added.

      Revision 1.2  2000/03/03 15:22:02  os
      StarView remainders removed

      Revision 1.1  1999/10/29 17:38:03  jp
      class for build a '2D-Table' from a SwTable


*************************************************************************/

diff --git a/sw/source/filter/ww1/fltshell.cxx b/sw/source/filter/ww1/fltshell.cxx
new file mode 100644
index 0000000..3f18bc6
--- /dev/null
+++ b/sw/source/filter/ww1/fltshell.cxx
@@ -0,0 +1,2357 @@
/*************************************************************************
 *
 *  $RCSfile: fltshell.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:57 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#define ITEMID_BOXINFO      SID_ATTR_BORDER_INNER
#include <ctype.h>
#include <stdio.h> // sprintf

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _SYSTEM_HXX //autogen
#include <vcl/system.hxx>
#endif
#ifndef _GRAPH_HXX //autogen
#include <vcl/graph.hxx>
#endif
#ifndef SVTOOLS_URIHELPER_HXX
#include <svtools/urihelper.hxx>
#endif
#ifndef _SVX_IMPGRF_HXX //autogen
#include <svx/impgrf.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_WGHTITEM_HXX //autogen
#include <svx/wghtitem.hxx>
#endif
#ifndef _SVX_CMAPITEM_HXX //autogen
#include <svx/cmapitem.hxx>
#endif
#ifndef _SVX_ITEM_HXX //autogen
#include <svx/cntritem.hxx>
#endif
#ifndef _SVX_POSTITEM_HXX //autogen
#include <svx/postitem.hxx>
#endif
#ifndef _SVX_CRSDITEM_HXX //autogen
#include <svx/crsditem.hxx>
#endif
#ifndef _SFXSTRITEM_HXX
#include <svtools/stritem.hxx>
#endif
#ifndef _UNOTOOLS_CHARCLASS_HXX
#include <unotools/charclass.hxx>
#endif

#ifndef _TXTFTN_HXX //autogen
#include <txtftn.hxx>
#endif
#ifndef _FMTPDSC_HXX //autogen
#include <fmtpdsc.hxx>
#endif
#ifndef _FMTFTN_HXX //autogen
#include <fmtftn.hxx>
#endif
#ifndef _FMTANCHR_HXX //autogen
#include <fmtanchr.hxx>
#endif
#ifndef _FMTRFMRK_HXX //autogen
#include <fmtrfmrk.hxx>
#endif
#ifndef _FMTCLDS_HXX //autogen
#include <fmtclds.hxx>
#endif
#ifndef _FMTFLD_HXX //autogen
#include <fmtfld.hxx>
#endif
#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _FMTHDFT_HXX //autogen
#include <fmthdft.hxx>
#endif
#ifndef _FMTCNTNT_HXX //autogen
#include <fmtcntnt.hxx>
#endif
#ifndef _REDLINE_HXX
#include <redline.hxx>
#endif
#ifndef _PAM_HXX
#include <pam.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _NDTXT_HXX
#include <ndtxt.hxx>
#endif
#ifndef _FRMATR_HXX
#include <frmatr.hxx>
#endif
#ifndef _FLDBAS_HXX
#include <fldbas.hxx>           // RES_SETEXPFLD
#endif
#ifndef _CHARATR_HXX
#include <charatr.hxx>          // class SwFmtRefMark
#endif
#ifndef _SWTABLE_HXX
#include <swtable.hxx>          // class SwTableLines, ...
#endif
#ifndef _TOX_HXX
#include <tox.hxx>
#endif
#ifndef _EXPFLD_HXX
#include <expfld.hxx>           // SwExpField
#endif
#ifndef _SECTION_HXX
#include <section.hxx>          // class SwSection
#endif
#ifndef _TBLSEL_HXX
#include <tblsel.hxx>           // class SwSelBoxes
#endif
#ifndef _PAGEDESC_HXX
#include <pagedesc.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>            // class SwDocSh
#endif
#ifndef _FLTSHELL_HXX
#include <fltshell.hxx>
#endif

#define MAX_FIELDLEN 64000

SV_IMPL_PTRARR(SwFltControlStackEntries, SwFltStackEntryPtr)

static SwCntntNode* GetCntntNode(SwDoc* pDoc, SwNodeIndex& rIdx, BOOL bNext)
{
    SwCntntNode* pCNd = pDoc->GetNodes()[ rIdx ]->GetCntntNode();
    if(!pCNd && 0 == (pCNd = bNext ? pDoc->GetNodes().GoNext(&rIdx)
                                     : pDoc->GetNodes().GoPrevious(&rIdx)))
    {
        pCNd = bNext ? pDoc->GetNodes().GoPrevious(&rIdx)
                     : pDoc->GetNodes().GoNext(&rIdx);
        ASSERT(pCNd, "kein ContentNode gefunden");
    }
    return pCNd;
}

// ------ Stack-Eintrag fuer die gesamten - Attribute vom Text -----------
SwFltStackEntry::SwFltStackEntry(const SwPosition& rStartPos, SfxPoolItem* pHt ) :
    nMkNode(rStartPos.nNode, -1),
    nPtNode(nMkNode)
{
    // Anfang vom Bereich merken
    nMkCntnt = rStartPos.nContent.GetIndex();
    pAttr = pHt;        // speicher eine Kopie vom Attribut
    bOld    = FALSE;    // used for marking Attributes *before* skipping field results
    bLocked = TRUE;     // locke das Attribut --> darf erst
    bCopied = FALSE;    // gesetzt werden, wenn es wieder geunlocked ist
}

SwFltStackEntry::SwFltStackEntry(const SwFltStackEntry& rEntry) :
    nMkNode(rEntry.nMkNode),
    nPtNode(rEntry.nPtNode)
{
    pAttr   = rEntry.pAttr->Clone();
    nMkCntnt= rEntry.nMkCntnt;
    bOld    = rEntry.bOld;
    bLocked = bCopied = TRUE; // when rEntry were NOT bLocked we would never have been called
}


SwFltStackEntry::~SwFltStackEntry()
{
    // Attribut kam zwar als Pointer, wird aber hier geloescht
    if (pAttr)
        delete pAttr;
}

void SwFltStackEntry::SetEndPos(const SwPosition& rEndPos)
{
    // Attribut freigeben und das Ende merken.
    // Alles mit USHORT's, weil sonst beim Einfuegen von neuem Text an der
    // Cursor-Position auch der Bereich vom Attribut weiter
    // verschoben wird.
    // Das ist aber nicht das gewollte!
    bLocked = FALSE;                    // freigeben und das ENDE merken
    nPtNode = rEndPos.nNode.GetIndex()-1;
    nPtCntnt = rEndPos.nContent.GetIndex();
}

BOOL SwFltStackEntry::MakeRegion(SwDoc* pDoc, SwPaM& rRegion, BOOL bCheck )
{
    // wird ueberhaupt ein Bereich umspannt ??
    // - ist kein Bereich, dann nicht returnen wenn am Anfang vom Absatz
    // - Felder aussortieren, koennen keinen Bereich haben !!
#ifdef DEBUG
    USHORT nWhich = pAttr->Which();
#endif
    if (nMkNode.GetIndex() == nPtNode.GetIndex()
     && nMkCntnt == nPtCntnt
     && nPtCntnt
     && RES_TXTATR_FIELD != pAttr->Which())
        return FALSE;

    // !!! Die Content-Indizies beziehen sich immer auf den Node !!!
    rRegion.GetPoint()->nNode = nMkNode.GetIndex() + 1;
    SwCntntNode* pCNd = GetCntntNode(pDoc, rRegion.GetPoint()->nNode, TRUE);
    rRegion.GetPoint()->nContent.Assign(pCNd, nMkCntnt);
    rRegion.SetMark();
    if( nMkNode != nPtNode )
    {
        rRegion.GetPoint()->nNode = nPtNode.GetIndex() + 1;
        pCNd = GetCntntNode(pDoc, rRegion.GetPoint()->nNode, FALSE);
    }
    rRegion.GetPoint()->nContent.Assign(pCNd, nPtCntnt);
#ifdef DEBUG
    ASSERT( CheckNodesRange( rRegion.Start()->nNode,
                             rRegion.End()->nNode, TRUE ),
             "Attribut oder AEhnliches ueber Bereichs-Grenzen" );
#endif
    if( bCheck )
        return CheckNodesRange( rRegion.Start()->nNode,
                                rRegion.End()->nNode, TRUE );
    else
        return TRUE;
}


SwFltControlStack::SwFltControlStack(SwDoc* pDo, ULONG nFieldFl) :
    SwFltControlStackEntries(10, 5),
    pDoc(pDo),
    nFieldFlags(nFieldFl),
    bIsEndStack(FALSE)
{
}


SwFltControlStack::~SwFltControlStack()
{
    ASSERT(!Count(), "noch Attribute auf dem Stack");
}

// MoveAttrs() ist fuer folgendes Problem:
// Wenn ueber den Stack ein Feld wie z.B. "Variable setzen" gesetzt wird,
// verschiebt sich der Text um ein \xff - Zeichen, und alle folgenden
// Attribute stimmen in ihrer Position nicht mehr.
// Dann muss MoveAttrs() nach dem Setzen des Attributes ins Doc gerufen werden,
// so dass alle Attribut-Positionen,
// die im selben Absatz weiter hinten stehen, um 1 Zeichen weiter
// nach rechts verschoben werden.
void SwFltControlStack::MoveAttrs( const SwPosition& rPos )
{
    USHORT nCnt = Count();
    SwFltStackEntry* pEntry;
    ULONG nPosNd = rPos.nNode.GetIndex();
    USHORT nPosCt = rPos.nContent.GetIndex() - 1;

    for (USHORT i=0; i < nCnt; i++){
        pEntry = (*this)[ i ];
        if(( pEntry->nMkNode.GetIndex() + 1 == nPosNd )
           &&( pEntry->nMkCntnt >= nPosCt )){
            pEntry->nMkCntnt++;
            ASSERT( pEntry->nMkCntnt
                <= pDoc->GetNodes()[nPosNd]->GetCntntNode()->Len(),
                    "Attribut-Anfang hinter Zeilenende" );
        }
        if(( pEntry->nPtNode.GetIndex() + 1 == nPosNd )
           &&( pEntry->nPtCntnt >= nPosCt )){
            pEntry->nPtCntnt++;
            ASSERT( pEntry->nPtCntnt
                <= pDoc->GetNodes()[nPosNd]->GetCntntNode()->Len(),
                    "Attribut-Ende hinter Zeilenende" );
        }
    }
}



// all attributes that are on rPos will but changed so that their Point or their
// Mark (whichever had been on rPos) will be set to the next node
void SwFltControlStack::MoveAttrsToNextNode( const SwNodeIndex& rNdIdx )
{
    USHORT nCnt = Count();
    SwFltStackEntry* pEntry;

    for (USHORT i=0; i < nCnt; i++)
    {
        pEntry = (*this)[ i ];
        if(    ( pEntry->nMkNode  == rNdIdx ) )
            pEntry->nMkNode++;

        if(    ( pEntry->nPtNode  == rNdIdx ) )
            pEntry->nPtNode++;
    }
}


void SwFltControlStack::MarkAllAttrsOld()
{
    USHORT nCnt = Count();
    for (USHORT i=0; i < nCnt; i++)
        (*this)[ i ]->bOld = TRUE;
}


void SwFltControlStack::NewAttr(const SwPosition& rPos, const SfxPoolItem & rAttr )
{
    SwFltStackEntry *pTmp = new SwFltStackEntry(rPos, rAttr.Clone() );
    register USHORT nWhich = pTmp->pAttr->Which();
    SetAttr(rPos, nWhich);// Ende von evtl. gleichen Attributen auf dem Stack
                                // Setzen, damit sich die Attribute nicht auf
                                // dem Stack haeufen
    Insert(pTmp, Count());
}

// SwFltControlStack::StealAttr() loescht Attribute des angegebenen Typs vom Stack.
// Als nAttrId sind erlaubt: 0 fuer alle, oder ein spezieller Typ.
// Damit erscheinen sie nicht in der Doc-Struktur. Dabei werden nur die
// Attribute entfernt, die im selben Absatz wie pPos stehen.
// Wird fuer Grafik-Apos -> Grafiken benutzt.
void SwFltControlStack::StealAttr(const SwPosition* pPos, USHORT nAttrId /* = 0 */)
{
    USHORT nCnt = Count();

    register SwFltStackEntry* pEntry;

    while (nCnt)
    {
        nCnt --;
        pEntry = (*this)[ nCnt ];
        if (pEntry->nPtNode.GetIndex()+1 == pPos->nNode.GetIndex() &&
            (!nAttrId || nAttrId == pEntry->pAttr->Which()))
            DeleteAndDestroy(nCnt);     // loesche aus dem Stack
    }
}

// SwFltControlStack::KillUnlockedAttr() loescht alle Attribute vom Stack,
// welche punktuell auf pPos aufgespannt sind.
// Damit erscheinen sie nicht in der Doc-Struktur.
// Wird im WW Import benoetigt zum ignorieren der auf dem 0x0c Section-
// Break-Symbol gesetzten Attribute.
void SwFltControlStack::KillUnlockedAttrs(const SwPosition& pPos)
{
    SwNodeIndex aAktNode( pPos.nNode, -1 );
    USHORT nAktIdx = pPos.nContent.GetIndex();

    USHORT nCnt = Count();
    register SwFltStackEntry* pEntry;
    while( nCnt )
    {
        nCnt --;
        pEntry = (*this)[ nCnt ];
        if(    !pEntry->bOld
            && !pEntry->bLocked
            && (pEntry->nMkNode  == aAktNode)
            && (pEntry->nMkCntnt == nAktIdx )
            && (pEntry->nPtNode  == aAktNode)
            && (pEntry->nPtCntnt == nAktIdx ))
        {
            DeleteAndDestroy( nCnt ); // loesche aus dem Stack
        }
    }
}

// Alle gelockten Attribute freigeben (unlocken) und das Ende setzen,
// alle anderen im Document setzen und wieder aus dem Stack loeschen
// Returned, ob das gesuchte Attribut / die gesuchten Attribute
// ueberhaupt auf dem Stack standen
BOOL SwFltControlStack::SetAttr(const SwPosition& rPos, USHORT nAttrId,
                                BOOL bTstEnde, long nHand )
{
    ASSERT(!nAttrId ||
        (POOLATTR_BEGIN <= nAttrId && POOLATTR_END > nAttrId) ||
        (RES_FLTRATTR_BEGIN <= nAttrId && RES_FLTRATTR_END > nAttrId),
        "Falsche Id fuers Attribut")

    BOOL bFound = FALSE;
    USHORT nCnt = Count();

    SwFltStackEntry* pEntry;

    for (USHORT i=0; i < nCnt; i++)
    {
        pEntry = (*this)[ i ];
        if (pEntry->bLocked)
        {
            // setze das Ende vom Attribut
            BOOL bF = FALSE;
            if (!nAttrId ){
                bF = TRUE;
            }else if( nAttrId == pEntry->pAttr->Which()){
                if( nAttrId != RES_FLTR_BOOKMARK ){     // Handle abfragen
                    bF = TRUE;
                }else if( nHand == ((SwFltBookmark*)(pEntry->pAttr))->GetHandle() )
                {
                    bF = TRUE;
                }
            }
            if( bF ){
                pEntry->SetEndPos(rPos);
                bFound = TRUE;
            }
#if 0
            if (!nAttrId || nAttrId == pEntry->pAttr->Which())
            {
                pEntry->SetEndPos(rPos);
                bFound = TRUE;
            }
#endif
            continue;
        }

        // ist die Endposition die Cursor-Position, dann noch nicht
        // ins Dokument setzen, es muss noch Text folgen;
        // ausser am Dokumentende. (Attribut-Expandierung !!)
        // Beim Ende-Stack niemals ausser am DocEnde reinsetzen
        if (bTstEnde)
        {
            if (bIsEndStack || pEntry->nPtNode.GetIndex()+1 ==
                        rPos.nNode.GetIndex())
            continue;
        }
        SetAttrInDoc(rPos, pEntry);
        DeleteAndDestroy(i);        // loesche aus dem Stack
        i--; nCnt--;        // Danach rutschen alle folgenden nach unten
    }
    return bFound;
}

static void MakePoint(SwFltStackEntry* pEntry, SwDoc* pDoc, SwPaM& rRegion)
{
            // der Anker ist der Point vom Pam. Dieser wird beim Einfugen
            // von Text usw. veraendert; darum wird er auf dem Stack
            // gespeichert. Das Attribut muss nur noch im Format
            // gesetzt werden.
    rRegion.DeleteMark();
    rRegion.GetPoint()->nNode = pEntry->nMkNode.GetIndex() + 1;
    SwCntntNode* pCNd = GetCntntNode(pDoc, rRegion.GetPoint()->nNode, TRUE);
    rRegion.GetPoint()->nContent.Assign(pCNd, pEntry->nMkCntnt);
}

static void MakeRegionOrPoint(SwFltStackEntry* pEntry, SwDoc* pDoc,
                    SwPaM& rRegion, BOOL bCheck )
{
    if (!pEntry->MakeRegion(pDoc, rRegion, bCheck ))
        MakePoint(pEntry, pDoc, rRegion);
}

// MakeBookRegionOrPoint() ist wie MakeRegionOrPoint, aber die besonderen
// Beschraenkungen von Bookmarks in Tabellen werden beachtet.
// ( Anfang und Ende muessen in selber Zelle sein )
static void MakeBookRegionOrPoint(SwFltStackEntry* pEntry, SwDoc* pDoc,
                    SwPaM& rRegion, BOOL bCheck )
{
    if (pEntry->MakeRegion(pDoc, rRegion, bCheck )){
        const SwNodes& rNds = pDoc->GetNodes();
//      BOOL b1 = rNds[rRegion.GetPoint()->nNode]->FindTableNode() != 0;
//      const SwStartNode* p1 = rNds[rRegion.GetPoint()->nNode]->FindTableBoxStartNode();
//      const SwStartNode* p2 = rNds[rRegion.GetMark()->nNode]->FindTableBoxStartNode();
        if( rNds[rRegion.GetPoint()->nNode]->FindTableBoxStartNode()
              != rNds[rRegion.GetMark()->nNode]->FindTableBoxStartNode() ){
            rRegion.Exchange();         // Ungueltiger Bereich
            rRegion.DeleteMark();       // -> beide auf Mark
        }
    }else{
        MakePoint(pEntry, pDoc, rRegion);
    }
}

static void MakePosition(SwFltStackEntry* pEntry, SwDoc* pDoc, SwPosition& rPosi)
{
    rPosi.nNode = pEntry->nMkNode.GetIndex() + 1;
    SwCntntNode* pCNd = GetCntntNode(pDoc, rPosi.nNode, TRUE);
    rPosi.nContent.Assign(pCNd, pEntry->nMkCntnt);
}

#ifdef DEBUG
extern FASTBOOL CheckNodesRange( const SwNodeIndex& rStt,
                    const SwNodeIndex& rEnd, FASTBOOL bChkSection );
#endif

// IterateNumrulePiece() sucht von rTmpStart bis rEnd den ersten
// fuer Numrules gueltigen Bereich heraus.
//
// rNds sind die Doc-Nodes
// rEnd ist Bereichs-Ende,
// rTmpStart ist ReinRaus-Parameter: Anfang des zu untersuchenden Bereiches rein,
//                                   Anfang des gueltigen Bereichs raus
// rTmpEnd ist raus-Parameter
// Return-Bool ist TRUE fuer gueltigen Bereich
static BOOL IterateNumrulePiece( const SwNodeIndex& rEnd,
                                SwNodeIndex& rTmpStart, SwNodeIndex& rTmpEnd )
{
    while( ( rTmpStart <= rEnd )
           && !( rTmpStart.GetNode().IsTxtNode() ) )    // suche gueltigen Anfang
        rTmpStart++;

    rTmpEnd = rTmpStart;
    while( ( rTmpEnd <= rEnd )
           && ( rTmpEnd.GetNode().IsTxtNode() ) )       // suche gueltiges Ende + 1
        rTmpEnd++;

    rTmpEnd--;                                      // gueltiges Ende

    return rTmpStart <= rTmpEnd;                    // gueltig ?
}

void SwFltControlStack::SetAttrInDoc(const SwPosition& rTmpPos, SwFltStackEntry* pEntry)
{
    SwPaM aRegion( rTmpPos );

    switch(pEntry->pAttr->Which())
    {
    case RES_FLTR_ANCHOR:
        {
            MakePoint(pEntry, pDoc, aRegion);
            SwFrmFmt* pFmt = ((SwFltAnchor*)pEntry->pAttr)->GetFrmFmt();
            SwFmtAnchor aAnchor(pFmt->GetAnchor());
            aAnchor.SetAnchor(aRegion.GetPoint());
            pFmt->SetAttr(aAnchor);
                    // Damit die Frames bei Einfuegen in existierendes Doc
                    //  erzeugt werden (erst nach Setzen des Ankers!):
            if(pDoc->GetRootFrm()
                && FLY_AT_CNTNT == pFmt->GetAnchor().GetAnchorId()){
                pFmt->MakeFrms();
            }
        }
        break;
    case RES_FLTR_STYLESHEET:
        break;
    case RES_TXTATR_FIELD:
        break;
    case RES_TXTATR_TOXMARK:
        break;
    case RES_FLTR_NUMRULE:          // Numrule 'reinsetzen
        {
            const String& rNumNm = ((SfxStringItem*)pEntry->pAttr)->GetValue();
            SwNumRule* pRul = pDoc->FindNumRulePtr( rNumNm );
            if( pRul )
            {
                if( pEntry->MakeRegion(pDoc, aRegion, TRUE))
                {
                    SwNodeIndex aTmpStart( aRegion.Start()->nNode );
                    SwNodeIndex aTmpEnd( aTmpStart );
                    SwNodeIndex& rRegEndNd = aRegion.End()->nNode;
                    while( IterateNumrulePiece( rRegEndNd,
                                                aTmpStart, aTmpEnd ) )
                    {
                        SwPaM aTmpPam( aTmpStart, aTmpEnd );
                        pDoc->SetNumRule( aTmpPam, *pRul );

                        aTmpStart = aTmpEnd;    // Start fuer naechstes Teilstueck
                        aTmpStart++;
                    }
                }
                else
                    pDoc->DelNumRule( rNumNm );
            }
        }
        break;
    case RES_FLTR_NUMRULE_NUM:
        break;
    case RES_FLTR_BOOKMARK:         // eigentlich nur fuer den Ende-Stack
        {
            SwFltBookmark* pB = (SwFltBookmark*)pEntry->pAttr;
            const String& rName = ((SwFltBookmark*)pEntry->pAttr)->GetName();

            if (IsFlagSet(BOOK_TO_VAR_REF))
            {
                if (pB->IsPgRef() && !pB->IsRef())
                {
                            // XRefs und Bookmarks sind bereits geUpcased
                    MakeBookRegionOrPoint(pEntry, pDoc, aRegion, TRUE);
                    pDoc->Insert(aRegion, SwFmtRefMark(rName));
                }
                else if( !pB->IsOnlyRef() )
                {
                    SwFieldType* pFT = pDoc->GetFldType(RES_SETEXPFLD, rName);
                    if (!pFT)
                    {                       // FieldType anlegen
                        SwSetExpFieldType aS(pDoc, rName, GSE_STRING);
                        pFT = pDoc->InsertFldType(aS);
                    }
                    SwSetExpField aFld((SwSetExpFieldType*)pFT,
                                        pB->GetValSys());
                    aFld.SetSubType(SUB_INVISIBLE);
                    MakePoint(pEntry, pDoc, aRegion);
                    pDoc->Insert(aRegion, SwFmtFld(aFld));
                    MoveAttrs( *(aRegion.GetPoint()) );
                }
            }
            if( !pB->IsOnlyRef() &&
                ( !IsFlagSet(HYPO) || IsFlagSet(BOOK_AND_REF) ) )
            {
                MakeBookRegionOrPoint(pEntry, pDoc, aRegion, TRUE);
                pDoc->MakeBookmark( aRegion, aEmptyKeyCode, rName, aEmptyStr);
            }
        }
        break;
    case RES_FLTR_TOX:
        {
            MakePoint(pEntry, pDoc, aRegion);

            SwPosition* pPoint = aRegion.GetPoint();

            SwFltTOX* pTOXAttr = (SwFltTOX*)pEntry->pAttr;

            // test if on this node there had been a pagebreak BEFORE the
            //     tox attribut was put on the stack
            SfxItemSet aBkSet( pDoc->GetAttrPool(), RES_PAGEDESC, RES_BREAK );
            SwCntntNode* pNd = 0;
            if( !pTOXAttr->HadBreakItem() || !pTOXAttr->HadPageDescItem() )
            {
                pNd = pPoint->nNode.GetNode().GetCntntNode();
                if( pNd )
                {
                    const SfxItemSet* pSet = pNd->GetpSwAttrSet();
                    const SfxPoolItem* pItem;
                    if( pSet )
                    {
                        if(    !pTOXAttr->HadBreakItem()
                            && SFX_ITEM_SET == pSet->GetItemState( RES_BREAK, FALSE, &pItem ) )
                        {
                            aBkSet.Put( *pItem );
                            pNd->ResetAttr( RES_BREAK );
                        }
                        if(    !pTOXAttr->HadPageDescItem()
                            && SFX_ITEM_SET == pSet->GetItemState( RES_PAGEDESC, FALSE, &pItem ) )
                        {
                            aBkSet.Put( *pItem );
                            pNd->ResetAttr( RES_PAGEDESC );
                        }
                    }
                }
            }

            // now insert the TOX
            const SwTOXBaseSection* pSect
                = pDoc->InsertTableOf(  *pPoint,
                                        *pTOXAttr->GetBase(),
                                        FALSE  );
            delete pTOXAttr->GetBase();


            // set (aboved saved and removed) the break item at the node following the TOX
            if( aBkSet.Count() )
                pNd->SetAttr( aBkSet );


            USHORT nCols = ((SwFltTOX*)pEntry->pAttr)->GetCols();
            aRegion.Move( fnMoveBackward );
            SwTOXBase* pBase = (SwTOXBase*)pDoc->GetCurTOX( *aRegion.GetPoint() );
            if( pBase )
            {
                SfxItemSet aSet( pDoc->GetAttrPool(), RES_COL, RES_COL );
                SwFmtCol aCol;
                aCol.Init( nCols, 708, USHRT_MAX );
                aSet.Put( aCol );
                pBase->SetAttrSet( aSet );
            }
        }
        break;
    case RES_FLTR_SECTION:
        MakePoint(pEntry, pDoc, aRegion);   // bislang immer Point==Mark
        pDoc->Insert(aRegion, *((SwFltSection*)pEntry->pAttr)->GetSection(),
                     0, FALSE);
        delete(((SwFltSection*)pEntry->pAttr)->GetSection());
        break;
    case RES_FLTR_REDLINE:
        {
            if (pEntry->MakeRegion(pDoc, aRegion, TRUE))
            {
                pDoc->SetRedlineMode(   REDLINE_ON
                                      | REDLINE_SHOW_INSERT
                                      | REDLINE_SHOW_DELETE );
                SwFltRedline& rFltRedline = *((SwFltRedline*)pEntry->pAttr);

                if( USHRT_MAX != rFltRedline.nAutorNoPrev )
                {
                    SwRedlineData aData(rFltRedline.eTypePrev,
                                        rFltRedline.nAutorNoPrev,
                                        rFltRedline.aStampPrev,
                                        aEmptyStr,
                                        0
                                        );
                    pDoc->AppendRedline(new SwRedline(aData, aRegion));
                }
                SwRedlineData aData(rFltRedline.eType,
                                    rFltRedline.nAutorNo,
                                    rFltRedline.aStamp,
                                    aEmptyStr,
                                    0
                                    );
                pDoc->AppendRedline( new SwRedline(aData, aRegion) );
                pDoc->SetRedlineMode(   REDLINE_NONE
                                      | REDLINE_SHOW_INSERT
                                      | REDLINE_SHOW_DELETE );
            }
        }
        break;
    default:
        if (pEntry->MakeRegion(pDoc, aRegion, FALSE))
            pDoc->Insert(aRegion, *pEntry->pAttr);
        break;
    }
}

SfxPoolItem* SwFltControlStack::GetFmtStackAttr(USHORT nWhich, USHORT * pPos)
{
    SwFltStackEntry* pEntry;
    USHORT nSize = Count();

    while (nSize)
    {
        // ist es das gesuchte Attribut ? (gueltig sind nur gelockte,
        // also akt. gesetzte Attribute!!)
        if ((pEntry = (*this)[ --nSize ])->bLocked &&
            pEntry->pAttr->Which() == nWhich)
        {
            if (pPos)
                *pPos = nSize;
            return (SfxPoolItem*)pEntry->pAttr;     // Ok, dann Ende
        }
    }
    return 0;
}

const SfxPoolItem* SwFltControlStack::GetOpenStackAttr(const SwPosition& rPos, USHORT nWhich)
{
    SwFltStackEntry* pEntry;
    USHORT nSize = Count();
    SwNodeIndex aAktNode( rPos.nNode, -1 );
    USHORT nAktIdx = rPos.nContent.GetIndex();

    while (nSize)
    {
        // ist es das gesuchte Attribut ? (gueltig sind nur gelockte,
        // also akt. gesetzte, noch offene Attribute!!)
        pEntry = (*this)[ --nSize ];
        if(    pEntry->bLocked
            && (pEntry->pAttr->Which() == nWhich)
            && (pEntry->nMkNode  == aAktNode)
            && (pEntry->nMkCntnt == nAktIdx ))
        {
            return (SfxPoolItem*)pEntry->pAttr;     // Ok, dann Ende
        }
    }
    return 0;
}

const SfxPoolItem* SwFltControlStack::GetFmtAttr(const SwPosition& rPos, USHORT nWhich)
{
    SfxPoolItem* pHt = GetFmtStackAttr(nWhich);
    if (pHt)
        return (const SfxPoolItem*)pHt;

    // im Stack ist das Attribut nicht vorhanden, also befrage das Dokument
//  SwCntntNode * pNd = rPaM.GetCntntNode();
    SwCntntNode * pNd = pDoc->GetNodes()[ rPos.nNode ]->GetCntntNode();

    if (!pNd)           // kein ContentNode, dann das dflt. Attribut
        return &pDoc->GetAttrPool().GetDefaultItem(nWhich);
    return &pNd->GetAttr(nWhich);
}

BOOL SwFltControlStack::IsAttrOpen(USHORT nAttrId)
{
    USHORT nCnt = Count();

    if (!nCnt)  return FALSE;

    SwFltStackEntry* pEntry;

    for (USHORT i=0; i < nCnt; i++)
    {
        pEntry = (*this)[ i ];
        if (pEntry->bLocked && nAttrId == pEntry->pAttr->Which())
            return TRUE;
    }
    return FALSE;
}

//------ hier stehen die Methoden von SwFltAnchor -----------
SwFltAnchor::SwFltAnchor(SwFrmFmt* pFmt) :
    SfxPoolItem(RES_FLTR_ANCHOR), pFrmFmt(pFmt)
{
}

SwFltAnchor::SwFltAnchor(const SwFltAnchor& rCpy) :
    SfxPoolItem(RES_FLTR_ANCHOR), pFrmFmt(rCpy.pFrmFmt)
{
}

int SwFltAnchor::operator==(const SfxPoolItem& rItem) const
{
    return pFrmFmt == ((SwFltAnchor&)rItem).pFrmFmt;
}

SfxPoolItem* __EXPORT SwFltAnchor::Clone(SfxItemPool*) const
{
    return new SwFltAnchor(*this);
}

//------ hier stehen die Methoden von SwFltRedline -----------
int SwFltRedline::operator==(const SfxPoolItem& rItem) const
{
    return this == &rItem;
}

SfxPoolItem* SwFltRedline::Clone( SfxItemPool* ) const
{
    return new SwFltRedline(*this);
}

//------ hier stehen die Methoden von SwFltBookmark -----------
SwFltBookmark::SwFltBookmark( const String& rNa, const String& rVa,
                                long nHand, BOOL bOnlyR )
    : SfxPoolItem(RES_FLTR_BOOKMARK), nHandle(nHand), aName(rNa), aVal(rVa),
    bOnlyRef(bOnlyR), bRef(FALSE), bPgRef(FALSE)
{
        // eSrc: CHARSET_DONTKNOW fuer keine UEbersetzung bei operator <<
        // Upcase wird immer gemacht.
        // bei XXXStack.NewAttr(...) wird nie eine UEbersetzung vorgenommen.
        // ansonsten: uebergebener Src-Charset fuer aName
        // im Filter eingestellter Src-Charset fuer aVal ( Text )
}

SwFltBookmark::SwFltBookmark(const SwFltBookmark& rCpy)
    : SfxPoolItem(RES_FLTR_BOOKMARK),
    nHandle(rCpy.nHandle),
    aName(rCpy.aName),
    aVal(rCpy.aVal),
    bOnlyRef(rCpy.bOnlyRef),
    bRef(rCpy.bRef),
    bPgRef(rCpy.bPgRef)
{
}

int SwFltBookmark::operator==(const SfxPoolItem& rItem) const
{
    return (aName == ((SwFltBookmark&)rItem).aName)
            && (nHandle == ((SwFltBookmark&)rItem).nHandle);
}

SfxPoolItem* SwFltBookmark::Clone(SfxItemPool*) const
{
    return new SwFltBookmark(*this);
}

//------ hier stehen die Methoden von SwFltTOX -----------

SwFltTOX::SwFltTOX(SwTOXBase* pBase, USHORT _nCols)
    : SfxPoolItem(RES_FLTR_TOX), pTOXBase(pBase), nCols( _nCols ),
      bHadBreakItem( FALSE ), bHadPageDescItem( FALSE )
{
}

SwFltTOX::SwFltTOX(const SwFltTOX& rCpy)
    : SfxPoolItem(RES_FLTR_TOX), pTOXBase(rCpy.pTOXBase), nCols( rCpy.nCols ),
      bHadBreakItem( rCpy.bHadBreakItem ), bHadPageDescItem( rCpy.bHadPageDescItem )
{
}

int SwFltTOX::operator==(const SfxPoolItem& rItem) const
{
    return pTOXBase == ((SwFltTOX&)rItem).pTOXBase;
}

SfxPoolItem* SwFltTOX::Clone(SfxItemPool*) const
{
    return new SwFltTOX(*this);
}

//------ hier stehen die Methoden von SwFltSwSection -----------

SwFltSection::SwFltSection(SwSection *pSect) :
    SfxPoolItem(RES_FLTR_SECTION), pSection(pSect)
{
}

SwFltSection::SwFltSection(const SwFltSection& rCpy) :
    SfxPoolItem(RES_FLTR_SECTION), pSection(rCpy.pSection)
{
}

int SwFltSection::operator==(const SfxPoolItem& rItem) const
{
    return pSection == ((SwFltSection&)rItem).pSection;
}

SfxPoolItem* __EXPORT SwFltSection::Clone(SfxItemPool*) const
{
    return new SwFltSection(*this);
}

//------ hier stehen die Methoden von SwFltEndStack -----------

// Bei Auftreten einer Referenz wird die entsprechende Textmarke als
// RefMark statt als Bookmark behandelt

void SwFltEndStack::SetBookRef( const String& rName, BOOL bPgRef)
{
    SfxPoolItem* pAttr;
    USHORT nSize = Count();

    while( nSize )
    {
        // ist es das gesuchte Attribut ?
        pAttr = (*this)[ --nSize ]->pAttr;
        if( (pAttr->Which() == RES_FLTR_BOOKMARK ) &&
//JP 11.05.00 - UNICODE-FRAGE - reicht ein EqualsIgnoreCaseAscii oder
//                              muß man das ueber die International machen?
             ((SwFltBookmark*)pAttr)->GetName().EqualsIgnoreCaseAscii( rName ))
        {
            if (bPgRef)
                ((SwFltBookmark*)pAttr)->SetPgRef();
            else
                ((SwFltBookmark*)pAttr)->SetRef();
            break;
        }
    }
}

///////////////////////////////////////////////////////////////////////
//
// hier beginnt der von mdt erzeugte code. dieser ist eine shell auf
// der writer-seite nach moeglichkeit bald fuer alle filter. die ganze
// schwierigkeit, texte & formatattribute einzufuegen, die positionen
// zu verwalten, styles & kopf/fuszzeilen etc.
//

//////////////////////////////////////////////////////////// SwFltShell
SwFltShell::SwFltShell(SwDoc* pDoc, SwPaM& rPaM, BOOL bNew, ULONG nFieldFl)
    : aStack(pDoc, nFieldFl),
    aEndStack(pDoc, nFieldFl),
    pCurrentPageDesc(0),
    eSrcCharSet( RTL_TEXTENCODING_MS_1252 ),
    nPageDescOffset(GetDoc().GetPageDescCnt()),
    pPaM(new SwPaM( *(rPaM.GetPoint()))),
    bNewDoc(bNew),
    bStdPD(FALSE),
    bProtect(FALSE),
    nAktStyle(0),
    pSavedPos(0),
    eSubMode(None)
{
    memset( pColls, 0, sizeof( pColls ) );
    pOutDoc = new SwFltOutDoc( *pDoc, pPaM, aStack, aEndStack );
    pOut = pOutDoc;

    if( !bNewDoc ){     // in ein Dokument einfuegen ?
                        // Da immer ganze Zeile eingelesen werden, muessen
                        // evtl. Zeilen eingefuegt / aufgebrochen werden
        const SwPosition* pPos = pPaM->GetPoint();
        const SwTxtNode* pSttNd = pPos->nNode.GetNode().GetTxtNode();
        USHORT nCntPos = pPos->nContent.GetIndex();
        if( nCntPos && pSttNd->GetTxt().Len() )
                                            // EinfuegePos nicht in leerer Zeile
            pDoc->SplitNode( *pPos );       // neue Zeile erzeugen
        if( pSttNd->GetTxt().Len() ){       // EinfuegePos nicht am Ende der Zeile
            pDoc->SplitNode( *pPos );       // neue Zeile
            pPaM->Move( fnMoveBackward );   // gehe in leere Zeile
        }

        // verhinder das Einlesen von Tabellen in Fussnoten / Tabellen
        ULONG nNd = pPos->nNode.GetIndex();
        BOOL bReadNoTbl = 0 != pSttNd->FindTableNode() ||
            ( nNd < pDoc->GetNodes().GetEndOfInserts().GetIndex() &&
            pDoc->GetNodes().GetEndOfInserts().StartOfSectionIndex() < nNd );
        if( bReadNoTbl )
            pOutDoc->SetReadNoTable();
    }
    pCurrentPageDesc =  &((SwPageDesc&)pDoc->GetPageDesc( 0 )); // Standard

}

SwFltShell::~SwFltShell()
{
    USHORT i;

    if (eSubMode == Style)
        EndStyle();
    if( pOutDoc->IsInTable() )          // falls nicht ordentlich abgeschlossen
        EndTable();
    if( pOutDoc->IsInFly() )
        EndFly();

    GetDoc().SetUpdateExpFldStat();
    GetDoc().SetInitDBFields(TRUE);
    aStack.SetAttr(*pPaM->GetPoint(), 0, FALSE);
    aStack.SetAttr(*pPaM->GetPoint(), 0, FALSE);
    aEndStack.SetAttr(*pPaM->GetPoint(), 0, FALSE);
    aEndStack.SetAttr(*pPaM->GetPoint(), 0, FALSE);
    if( bProtect ){     // Das ganze Doc soll geschuetzt sein

        SwDoc& rDoc = GetDoc();
                        // 1. SectionFmt und Section anlegen
        SwSectionFmt* pSFmt = rDoc.MakeSectionFmt( 0 );
        SwSection aS( CONTENT_SECTION, String::CreateFromAscii(
                                RTL_CONSTASCII_STRINGPARAM("PMW-Protect") ));
        aS.SetProtect( TRUE );
                        // 2. Start- und EndIdx suchen
        const SwNode* pEndNd = &rDoc.GetNodes().GetEndOfContent();
        SwNodeIndex aEndIdx( *pEndNd, -1L );
        const SwStartNode* pSttNd = pEndNd->StartOfSectionNode();
        SwNodeIndex aSttIdx( *pSttNd, 1L );         // +1 -> hinter StartNode
                                                    // Section einfuegen
                        // Section einfuegen
        rDoc.GetNodes().InsertSection( aSttIdx, *pSFmt, aS, &aEndIdx, FALSE );

        if( !IsFlagSet(SwFltControlStack::DONT_HARD_PROTECT) ){
            SwDocShell* pDocSh = rDoc.GetDocShell();
            if( pDocSh )
                pDocSh->SetReadOnlyUI( TRUE );
        }
    }
        // Pagedescriptoren am Dokument updaten (nur so werden auch die
        // linken Seiten usw. eingestellt).

    GetDoc().ChgPageDesc( 0, GetDoc().GetPageDesc( 0 ));    // PageDesc "Standard"
    for (i=nPageDescOffset;i<GetDoc().GetPageDescCnt();i++)
    {
        const SwPageDesc& rPD = GetDoc().GetPageDesc(i);
        GetDoc().ChgPageDesc(i, rPD);
    }

    delete pPaM;
    for (i=0; i<sizeof(pColls)/sizeof(*pColls); i++)
        if( pColls[i] )
            delete pColls[i];
    delete pOutDoc;
}

SwFltShell& SwFltShell::operator << ( const String& rStr )
{
    ASSERT(eSubMode != Style, "char insert while in style-mode");
    GetDoc().Insert( *pPaM, rStr );
    return *this;
}

void SwFltShell::ConvertUStr( String& rInOut )
{
    GetAppCharClass().toUpper( rInOut );
}
void SwFltShell::ConvertLStr( String& rInOut )
{
    GetAppCharClass().toLower( rInOut );
}

// QuoteString() wandelt CRs abhaengig von nFieldIniFlags in '\n' oder "\0x0d"
String SwFltShell::QuoteStr( const String& rIn )
{
    String sOut( rIn );
    BOOL bAllowCr = aStack.IsFlagSet( SwFltControlStack::ALLOW_FLD_CR );

    for( xub_StrLen n = 0; n < sOut.Len(); ++n )
    {
        switch( sOut.GetChar( n ) )
        {
        case 0x0a:
            sOut.Erase( n, 1 );             // 0xd 0xa wird zu \n
            break;

        case 0x0b:
        case 0x0c:
        case 0x0d:
            if( bAllowCr )
                 sOut.SetChar( n, '\n' );
            break;
        }
    }
    return sOut;
}

SwFltShell& SwFltShell::operator << ( const sal_Unicode c )
{
    ASSERT( eSubMode != Style, "char insert while in style-mode");
    GetDoc().Insert( *pPaM, c );
    return *this;
}

SwFltShell& SwFltShell::AddError( const sal_Char* pErr )
{
    String aName( String::CreateFromAscii(
                    RTL_CONSTASCII_STRINGPARAM( "ErrorTag" )));
    SwFieldType* pFT = GetDoc().GetFldType( RES_SETEXPFLD, aName );
    if( pFT == 0)
    {
        SwSetExpFieldType aS(&GetDoc(), aName, GSE_STRING);
        pFT = GetDoc().InsertFldType(aS);
    }
    SwSetExpField aFld( (SwSetExpFieldType*)pFT,
                        String::CreateFromAscii( pErr ));
    //, VVF_INVISIBLE
    GetDoc().Insert(*pPaM, SwFmtFld(aFld));
    return *this;
}

SwFltShell& SwFltShell::AddLinkedSection( const String& rFileName )
{
    String aStr( String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "Ww1" )));
    SwSection* pSection = new SwSection( FILE_LINK_SECTION,
                                     GetDoc().GetUniqueSectionName( &aStr ));
    pSection->SetLinkFileName( INetURLObject::RelToAbs( rFileName ) );
    pSection->SetProtect( TRUE );
    *this << SwFltSection(pSection);
    EndItem( RES_FLTR_SECTION);
    return *this;
}

SwFltShell& SwFltShell::operator << (Graphic& rGraphic)
{
    SwFlyFrmFmt* pFlyFmt = GetDoc().Insert( *pPaM, aEmptyStr, aEmptyStr,
                                            &rGraphic); // embedded Grafik !!
    return *this;
}

SwFltShell& SwFltShell::AddGraphic( const String& rPicName )
{
    if (0) // gelinkt?
    {
        SwFlyFrmFmt* pFlyFmt = GetDoc().Insert(*pPaM,
         INetURLObject::RelToAbs( rPicName ), // Name der Grafik !!
         aEmptyStr);
    }
    else
    {
    // embedded:
        GraphicFilter* pFilter = ::GetGrfFilter();
        Graphic aGraphic;
    // one of: GFF_NOT GFF_BMP GFF_GIF GFF_JPG GFF_PCD GFF_PCX GFF_PNG
    // GFF_TIF GFF_XBM GFF_DXF GFF_MET GFF_PCT GFF_SGF GFF_SVM GFF_WMF
    // GFF_SGV GFF_XXX
        INetURLObject aDir( URIHelper::SmartRelToAbs(rPicName) );
        switch ( pFilter->ImportGraphic( aGraphic, aDir ))
        {
        case GRFILTER_OK:
            *this << aGraphic;
            break;

        case GRFILTER_OPENERROR:
        case GRFILTER_IOERROR:
        case GRFILTER_FORMATERROR:
        case GRFILTER_VERSIONERROR:
        case GRFILTER_FILTERERROR:
        case GRFILTER_ABORT:
        case GRFILTER_TOOBIG:
        default:
            AddError( "picture import error" );
            break;
        }
    }
    return *this;
}

/*SwFltShell& SwFltShell::operator << (SwFltCharSet nCharSet)
{
    eSrcCharSet = nCharSet;
    return *this;
}*/

SwFltShell& SwFltShell::SetStyle( USHORT nStyle )
{
#ifndef MAC
    SwFltFormatCollection* p = pColls[ nStyle ];
#else
    SwFltFormatCollection* p = pColls[ nStyle ];
#endif

    if (p)
    {
        if( !pOutDoc->IsInTable() && nStyle != nAktStyle )
        {
            if( pColls[nAktStyle]->IsInFly() && pOutDoc->IsInFly() )
                pOutDoc->EndFly();
            if( p->IsInFly() )
                p->BeginStyleFly( pOutDoc );
        }
        GetDoc().SetTxtFmtColl(*pPaM, p->GetColl());
        nAktStyle = nStyle;
    }
    else
    {
        ASSERT( FALSE, "Ungueltiger SwFltStyleCode" );
    }
    return *this;
}

SwFltShell& SwFltShell::operator << (SwFltBookmark& aBook)
{
    ConvertUStr( aBook.aName );
    aBook.aVal = QuoteStr(aBook.aVal);
    aEndStack.NewAttr(*pPaM->GetPoint(), aBook);
    return *this;
}

void SwFltShell::SetBookEnd(long nHandle)
{
    aEndStack.SetAttr( *pPaM->GetPoint(), RES_FLTR_BOOKMARK, TRUE, nHandle );
}

SwFltShell& SwFltShell::EndItem( USHORT nAttrId )
{
    switch( nAttrId )
    {
    case RES_FLTR_BOOKMARK:
        ASSERT( FALSE, "Falscher Aufruf fuer Bookmark-Ende" );
        break;

    case RES_FLTR_TOX:
        aEndStack.SetAttr(*pPaM->GetPoint(), nAttrId);
        break;

    default:
        aStack.SetAttr(*pPaM->GetPoint(), nAttrId);
        break;
    }
    return *this;
}

SwFltShell& SwFltShell::operator << (const SwField& rField)
{
    GetDoc().Insert(*pPaM, SwFmtFld(rField));
    return *this;
}

/*virtual*/ SwFltOutBase& SwFltOutDoc::operator << (const SfxPoolItem& rItem)
{
    rStack.NewAttr(*pPaM->GetPoint(), rItem);
    return *this;
}

SwFltShell& SwFltShell::operator << (const SwFltTOX& rItem)
{
    aEndStack.NewAttr(*pPaM->GetPoint(), rItem);
    return *this;
}

/*virtual*/ SwFltOutBase& SwFltFormatCollection::operator <<
                                (const SfxPoolItem& rItem)
{
    pColl->SetAttr(rItem);
    return *this;
}


#if 0
SwFltShell& SwFltShell::operator >> (SfxPoolItem& rItem)
{
    //rItem = *GetFmtAttr(rItem.Which());
#pragma message(__FILE__ "(?) : ^das waer schoen!")
    //~ mdt: remove from stack if item begins here.
    return *this;
}
#endif

const SfxPoolItem& SwFltOutDoc::GetAttr(USHORT nWhich)
{
    return *rStack.GetFmtAttr(*pPaM->GetPoint(), nWhich);
}

const SfxPoolItem& SwFltFormatCollection::GetAttr(USHORT nWhich)
{
    return GetColl()->GetAttr(nWhich);  // mit Parents
}

// GetNodeOrStyAttr holt Attribute fuer Toggle- und Modify-Attribute:
// Bei Formatdefinitionen aus dem altuellen Style mit Parents
// sonst aus dem Node mit Parents
// Im Stack wird nicht nachgesehen

const SfxPoolItem& SwFltOutDoc::GetNodeOrStyAttr(USHORT nWhich)
{
    SwCntntNode * pNd = GetDoc().GetNodes()[ pPaM->GetPoint()->nNode ]
                            ->GetCntntNode();
    if (pNd)            // ContentNode: Attribut mit Parent
        return pNd->GetAttr(nWhich);
    else                // kein ContentNode, dann das dflt. Attribut
        return GetDoc().GetAttrPool().GetDefaultItem(nWhich);
}

const SfxPoolItem& SwFltFormatCollection::GetNodeOrStyAttr(USHORT nWhich)
{
    return GetColl()->GetAttr(nWhich);  // mit Parents
}


BOOL SwFltShell::GetWeightBold()
{
    return ((SvxWeightItem&)GetNodeOrStyAttr(RES_CHRATR_WEIGHT)).GetWeight()
                                != WEIGHT_NORMAL;
}

BOOL SwFltShell::GetPostureItalic()
{
    return ((SvxPostureItem&)GetNodeOrStyAttr(RES_CHRATR_POSTURE)).GetPosture()
                                != ITALIC_NONE;
}

BOOL SwFltShell::GetCrossedOut()
{
    return ((SvxCrossedOutItem&)GetNodeOrStyAttr(RES_CHRATR_CROSSEDOUT))
                                    .GetStrikeout() != STRIKEOUT_NONE;
}

BOOL SwFltShell::GetContour()
{
    return ((SvxContourItem&)GetNodeOrStyAttr(RES_CHRATR_CONTOUR)).GetValue();
}

BOOL SwFltShell::GetCaseKapitaelchen()
{
    return ((SvxCaseMapItem&)GetNodeOrStyAttr(RES_CHRATR_CASEMAP))
                                    .GetCaseMap() == SVX_CASEMAP_KAPITAELCHEN;
}

BOOL SwFltShell::GetCaseVersalien()
{
    return ((SvxCaseMapItem&)GetNodeOrStyAttr(RES_CHRATR_CASEMAP))
                                    .GetCaseMap() == SVX_CASEMAP_VERSALIEN;
}

//-------------------------------------------------------------------------
// Tabellen
//-------------------------------------------------------------------------
const SfxPoolItem& SwFltOutBase::GetCellAttr(USHORT nWhich)
{
    ASSERT(FALSE, "GetCellAttr ausserhalb von normalem Text");
    return GetDoc().GetAttrPool().GetDefaultItem(nWhich);
}

BOOL SwFltOutBase::BeginTable()
{
    ASSERT(FALSE, "BeginTable ausserhalb von normalem Text");
    return FALSE;
}

void SwFltOutBase::NextTableCell()
{
    ASSERT(FALSE, "NextTableCell ausserhalb von normalem Text");
}

void SwFltOutBase::NextTableRow()
{
    ASSERT(FALSE, "NextTableRow ausserhalb von normalem Text");
}

void SwFltOutBase::SetTableWidth(SwTwips nW)
{
    ASSERT(FALSE, "SetTableWidth ausserhalb von normalem Text");
}

void SwFltOutBase::SetTableOrient(SwHoriOrient eOri)
{
    ASSERT(FALSE, "SetTableOrient ausserhalb von normalem Text");
}

void SwFltOutBase::SetCellWidth(SwTwips nWidth, USHORT nCell)
{
    ASSERT(FALSE, "SetCellWidth ausserhalb von normalem Text");
}

void SwFltOutBase::SetCellHeight(SwTwips nH)
{
    ASSERT(FALSE, "SetCellHeight ausserhalb von normalem Text");
}

void SwFltOutBase::SetCellBorder(const SvxBoxItem& rFmtBox, USHORT nCell)
{
    ASSERT(FALSE, "SetCellBorder ausserhalb von normalem Text");
}

void SwFltOutBase::SetCellSpace(USHORT nSp)
{
    ASSERT(FALSE, "SetCellSpace ausserhalb von normalem Text");
}

void SwFltOutBase::DeleteCell(USHORT nCell)
{
    ASSERT(FALSE, "DeleteCell ausserhalb von normalem Text");
}

void SwFltOutBase::EndTable()
{
    ASSERT(FALSE, "EndTable ausserhalb von normalem Text");
}

/*virtual*/ BOOL SwFltOutDoc::IsInTable()
{
    return pTable != 0;
};

BOOL SwFltOutDoc::BeginTable()
{
    if(bReadNoTbl)
        return FALSE;

    if (pTable){
        ASSERT(FALSE, "BeginTable in Table");
        return FALSE;
    }
                            // Alle Attribute schliessen, da sonst Attribute
                            // entstehen koennen, die in Flys reinragen
    rStack.SetAttr( *pPaM->GetPoint(), 0, FALSE );
    rEndStack.SetAttr( *pPaM->GetPoint(), 0, FALSE );

// create table:
    ASSERT(pTabSavedPos == NULL, "SwFltOutDoc");
    pTabSavedPos = new SwPosition(*pPaM->GetPoint());
    pTable = GetDoc().InsertTable(*pTabSavedPos, 1, 1, HORI_LEFT);
    nTableWidth = 0;
    ((SwTable*)pTable)->LockModify();   // Nichts automatisch anpassen!
// set pam in 1. table cell
    usTableX =
    usTableY = 0;
    SeekCell(usTableY, usTableX, TRUE);
    return TRUE;
}

SwTableBox* SwFltOutDoc::GetBox(USHORT ny, USHORT nx /*= USHRT_MAX */)
{
    if(!pTable){
        ASSERT(pTable, "GetBox ohne Tabelle");
        return 0;
    }
    if( nx == USHRT_MAX )   // aktuelle Zelle
        nx = usTableX;

// get structs to table cells
    const SwTableLines* pTableLines = &pTable->GetTabLines();
    if(!pTableLines){
        ASSERT(FALSE, "SwFltOutDoc:GetBox:pTableLines");
        return 0;
    }
    if( ny >= pTableLines->Count() ){   // Notbremse
        ASSERT( FALSE, "SwFltOutDoc:GetBox:ny >= Count()");
        ny = pTableLines->Count() - 1;
    }
    SwTableLine* pTableLine = (*pTableLines)[ny];
    if(!pTableLine){
        ASSERT(FALSE, "SwFltOutDoc:GetBox:pTableLine");
        return 0;
    }
    SwTableBoxes* pTableBoxes = &pTableLine->GetTabBoxes();
    if(!pTableBoxes){
        ASSERT(FALSE, "SwFltOutDoc:GetBox:pTableBoxes");
        return 0;
    }
    if( nx >= pTableBoxes->Count() ){   // Notbremse
        ASSERT(FALSE, "SwFltOutDoc:GetBox:nx >= Count()");
        nx = pTableBoxes->Count() - 1;
    }
    SwTableBox* pTableBox = (*pTableBoxes)[nx];

    ASSERT(pTableBox != 0, "SwFltOutDoc:GetBox:pTableBox");
    return pTableBox;
}

void SwFltOutDoc::NextTableCell()
{
    if(!pTable){
        ASSERT(pTable, "NextTableCell ohne Tabelle");
        return;
    }
    const SwTableLines* pTableLines = &pTable->GetTabLines();
    SwTableLine* pTableLine = (*pTableLines)[usTableY];
    SwTableBoxes* pTableBoxes = &pTableLine->GetTabBoxes();
    SwTableBox* pTableBox = (*pTableBoxes)[usTableX];
    ASSERT(pTableBox != 0, "SwFltOutDoc:NextTableCell:pTableBox");
    if(!pTableBox)
        return;
//#pragma message(__FILE__ "(?) : Sw's const problem")
// insert cells:
    if (++usTableX >= pTableBoxes->Count())
        GetDoc().GetNodes().InsBoxen(
         GetDoc().IsIdxInTbl(pPaM->GetPoint()->nNode),
         pTableLine,
         (SwTableBoxFmt*)pTableBox->GetFrmFmt(),
         GetDoc().GetTxtCollFromPool(RES_POOLCOLL_STANDARD),
         0,
         pTableBoxes->Count());
    SeekCell(usTableY, usTableX, TRUE);
    pTableBox = (*pTableBoxes)[usTableX];
    ASSERT(pTableBox != 0, "SwFltOutDoc:pTableBox");
    if(pTableBox)
        (*pTableBoxes)[usTableX]->ClaimFrmFmt();
}

void SwFltOutDoc::NextTableRow()
{
    SwTableBox* pTableBox = GetBox(usTableY, 0);
    if(pTableBox){
// duplicate row:
        SwSelBoxes aSelBoxes;
        aSelBoxes.Insert( pTableBox );
        GetDoc().InsertRow(aSelBoxes);
//      GetDoc().InsertRow(pTable->SelLineFromBox(pTableBox, aSelBoxes));
#ifdef DEBUG
        const SwTableLines* pTableLines = &pTable->GetTabLines();
        SwTableLine* pTableLine = (*pTableLines)[usTableY+1];
        SwTableBoxes* pTableBoxes = &pTableLine->GetTabBoxes();
        USHORT nBx = pTableBoxes->Count();
        SwTableBox* pTableBox = (*pTableBoxes)[0];
        SwFrmFmt* pFmt = pTableBox->GetFrmFmt();

        SwFmtFrmSize &rSz = ((SwFmtFrmSize&)pFmt->GetAttr(RES_FRM_SIZE));
        SwTwips nW = rSz.GetWidth();
#endif
        usTableX = 0;
        SeekCell(++usTableY, usTableX, TRUE);
        GetDoc().SetTxtFmtColl(*pPaM,
            GetDoc().GetTxtCollFromPool(RES_POOLCOLL_STANDARD));
    }
}

void SwFltOutDoc::SetTableWidth(SwTwips nSwWidth)
{
    if(!pTable){
        ASSERT(pTable, "SetTableWidth ohne Tabelle");
        return;
    }
    ASSERT( nSwWidth > MINLAY, "Tabellenbreite <= MINLAY" );
    if( nSwWidth != nTableWidth ){
        if( nTableWidth )           // Nicht beim ersten Setzen
            SplitTable();
        pTable->GetFrmFmt()->SetAttr( SwFmtFrmSize(ATT_VAR_SIZE, nSwWidth));
        nTableWidth = nSwWidth;
    }
}

void SwFltOutDoc::SetTableOrient(SwHoriOrient eOri)
{
    if(!pTable){
        ASSERT(pTable, "SetTableOrient ohne Tabelle");
        return;
    }
    pTable->GetFrmFmt()->SetAttr( SwFmtHoriOrient( 0, eOri ));
}

void SwFltOutDoc::SetCellWidth(SwTwips nWidth, USHORT nCell /* = USHRT_MAX */ )
{
    if(!pTable){
        ASSERT(pTable, "SetCellWidth ohne Tabelle");
        return;
    }
    ASSERT( nWidth > MINLAY, "Tabellenzellenbreite <= MINLAY" );
    if (nWidth < MINLAY)
        nWidth = MINLAY;

    SwTableBox* pTableBox = GetBox(usTableY, nCell);
    if(pTableBox && pTableBox->GetFrmFmt() ){
        SwFmtFrmSize aFmtFrmSize(ATT_FIX_SIZE);
        aFmtFrmSize.SetWidth(nWidth);
        pTableBox->GetFrmFmt()->SetAttr(aFmtFrmSize);
    }
}

void SwFltOutDoc::SetCellHeight(SwTwips nHeight)
{
    if(!pTable){
        ASSERT(pTable, "SetCellHeight ohne Tabelle");
        return;
    }

    const SwTableLines* pTableLines = &pTable->GetTabLines();
    SwTableLine* pTableLine = (*pTableLines)[usTableY];
    SwFmtFrmSize aFmtFrmSize(ATT_MIN_SIZE, 0, 0);
    if (nHeight < MINLAY)
        nHeight = MINLAY;
    aFmtFrmSize.SetHeight(nHeight);
    pTableLine->GetFrmFmt()->SetAttr(aFmtFrmSize);
}

const SfxPoolItem& SwFltOutDoc::GetCellAttr(USHORT nWhich)
{
    if (!pTable){
        ASSERT(pTable, "GetCellAttr ohne Table");
        return GetDoc().GetAttrPool().GetDefaultItem(nWhich);
    }

    SwTableBox* pTableBox = GetBox(usTableY, usTableX);
    if(!pTableBox)
        return GetDoc().GetAttrPool().GetDefaultItem(nWhich);
    return pTableBox->GetFrmFmt()->GetAttr( nWhich );
}

void SwFltOutDoc::SetCellBorder(const SvxBoxItem& rFmtBox,
                               USHORT nCell /* = USHRT_MAX */ )
{
    SwTableBox* pTableBox = GetBox(usTableY, nCell);
    if(pTableBox)
        pTableBox->GetFrmFmt()->SetAttr(rFmtBox);
}

// nicht aktiviert !!!
void SwFltOutDoc::SetCellSpace(USHORT nDist)
{
    if(!pTable){
        ASSERT(pTable, "SetCellSpace ohne Tabelle");
        return;
    }
    SwTableBox* pTableBox = GetBox(usTableY, usTableX);
    if(!pTableBox)
        return;

    SvxBoxItem aFmtBox( *((SvxBoxItem*)
                        &pTableBox->GetFrmFmt()->GetAttr( RES_BOX )));

    // versteh ich nich, sven: if (!nDist) nDist = 18; // ca. 0.03 cm
    if (nDist > 42) // max. 0.7 mm
        nDist = 42;
    else
        if (nDist < MIN_BORDER_DIST)
            nDist = MIN_BORDER_DIST;
    aFmtBox.SetDistance(nDist);
    pTableBox->GetFrmFmt()->SetAttr(aFmtBox);
}

void SwFltOutDoc::DeleteCell(USHORT nCell /* = USHRT_MAX */)
{
    SwTableBox* pTableBox = GetBox(usTableY, nCell);
    if(pTableBox){
        SwSelBoxes aSelBoxes;
        aSelBoxes.Insert( pTableBox );
        GetDoc().DeleteRowCol(aSelBoxes);
        usTableX--;
    }
}

void SwFltOutDoc::SplitTable()
{
    if(!pTable){
        ASSERT(pTable, "SplitTable ohne Tabelle");
        return;
    }
    SwTableBox* pAktBox = GetBox(usTableY, usTableX);
    SwTableBox* pSplitBox = GetBox(usTableY - 1, 0);
    BOOL bOk = 0 != GetDoc().GetNodes().SplitTable(
                            SwNodeIndex( *pSplitBox->GetSttNd() ), FALSE );
    pTable = &pAktBox->GetSttNd()->FindTableNode()->GetTable();
    usTableY = 0;
//  GetDoc().Insert(*pPaM, "SplitTable", GetSystemCharSet());
}

void SwFltOutDoc::EndTable()
{
    if (!pTable){
        ASSERT(pTable, "EndTable ohne Table");
        return;
    }
                            // Alle Attribute schliessen, da sonst Attribute
                            // entstehen koennen, die in Flys reinragen
    rStack.SetAttr( *pPaM->GetPoint(), 0, FALSE );
    rEndStack.SetAttr( *pPaM->GetPoint(), 0, FALSE );

    if (GetDoc().GetRootFrm()){
        SwTableNode* pTableNode = GetDoc().IsIdxInTbl(
            pPaM->GetPoint()->nNode);
        pTableNode->DelFrms();
        pTableNode->MakeFrms(&pPaM->GetPoint()->nNode);
    }

    *pPaM->GetPoint() = *pTabSavedPos;              // restore Cursor
    delete pTabSavedPos;
    pTabSavedPos = 0;
    ((SwTable*)pTable)->UnlockModify(); // Test, nuetzt nichts gegen Assert
    pTable = 0;
    nTableWidth = 0;
}

BOOL SwFltOutDoc::SeekCell(short nRow, short nCol, BOOL bPam)
{
// get structs to table cells
    const SwTableLines* pTableLines = &pTable->GetTabLines();
    SwTableLine* pTableLine = (*pTableLines)[usTableY];
    SwTableBoxes* pTableBoxes = &pTableLine->GetTabBoxes();
    SwTableBox* pTableBox = (*pTableBoxes)[usTableX];

    if ((USHORT)nRow >= pTableLines->Count())
    {
        ASSERT((USHORT)nRow >= pTableLines->Count(), "SwFltOutDoc");
        return FALSE;
    }
    pTableLine = (*pTableLines)[nRow];
    pTableBoxes = &pTableLine->GetTabBoxes();
    if (nCol >= pTableBoxes->Count())
        return FALSE;
    pTableBox = (*pTableBoxes)[nCol];
    if( !pTableBox->GetSttNd() )
    {
        ASSERT(pTableBox->GetSttNd(), "SwFltOutDoc");
        return FALSE;
    }
    if(bPam)
    {
        pPaM->GetPoint()->nNode = pTableBox->GetSttIdx() + 1;
        pPaM->GetPoint()->nContent.Assign(pPaM->GetCntntNode(), 0);
//#pragma message(__FILE__ "(?) : Sw's const problem")
#ifdef DEBUG
        const SwTxtFmtColl* p = GetDoc().GetDfltTxtFmtColl();
        p = GetDoc().GetTxtCollFromPool(RES_POOLCOLL_STANDARD);
#endif
        GetDoc().SetTxtFmtColl(*pPaM,
            GetDoc().GetTxtCollFromPool(RES_POOLCOLL_STANDARD));
    }
    return TRUE;
}


//-----------------------------------------------------------------------------
// Flys in SwFltOutBase
//-----------------------------------------------------------------------------

SfxItemSet* SwFltOutBase::NewFlyDefaults()
{
// Unbedingt noetige Standardwerte setzen ( falls diese Werte nicht
// spaeter explizit gesetzt werden )

    SfxItemSet* p = new SfxItemSet( GetDoc().GetAttrPool(),
                                    RES_FRMATR_BEGIN, RES_FRMATR_END-1 );
    SwFmtFrmSize aSz( ATT_VAR_SIZE, MINFLY, MINFLY );
                                        // Default: Breite 100% ( = PMW:Auto )
    aSz.SetWidthPercent( 100 );         // Hoehe: Auto
    p->Put( aSz );
    p->Put( SwFmtHoriOrient( 0, HORI_NONE, FRAME ));
    return p;
}

BOOL SwFltOutBase::BeginFly( RndStdIds eAnchor /*= FLY_AT_CNTNT*/,
                           BOOL bAbsolutePos /*= FALSE*/,
                           const SfxItemSet* pMoreAttrs /*= 0*/ )
{
    ASSERT(!pMoreAttrs, "SwFltOutBase:BeginFly mit pMoreAttrs" );
    eFlyAnchor = eAnchor;
    bFlyAbsPos = bAbsolutePos;      // Bloedsinn eigentlich
    return TRUE;
}

/*virtual*/ void SwFltOutBase::SetFlyAnchor( RndStdIds eAnchor )
{
    if( !IsInFly() ){
        ASSERT( FALSE, "SetFlyAnchor() ohne Fly" );
        return;
    }
    if( eAnchor == FLY_IN_CNTNT ){
        ASSERT( FALSE, "SetFlyAnchor( FLY_IN_CNTNT ) nicht implementiert" );
        return;
    }
    SwFmtAnchor& rAnchor = (SwFmtAnchor&)GetFlyFrmAttr( RES_ANCHOR );
    rAnchor.SetType( eAnchor );
}

void SwFltOutBase::EndFly()
{
    if( bFlyAbsPos ){
        // hier muessen die absoluten Positionen am Fly noch in
        // die Writer-Koordinaten umgerechnet werden.
    }
}

//-----------------------------------------------------------------------------
// Flys in SwFltDoc
//-----------------------------------------------------------------------------

/* virtual */ BOOL SwFltOutDoc::IsInFly()
{
    return pFly != 0;
};

SwFrmFmt* SwFltOutDoc::MakeFly( RndStdIds eAnchor, SfxItemSet* pSet )
{
    pFly = (SwFlyFrmFmt*)GetDoc().MakeFlySection( eAnchor, pPaM->GetPoint(),
                                                    pSet );
    return pFly;
}

BOOL SwFltOutDoc::BeginFly( RndStdIds eAnchor /*= FLY_AT_CNTNT*/,
                           BOOL bAbsolutePos /*= FALSE*/,
                           const SfxItemSet* pMoreAttrs /*= 0*/ )

{
    SwFltOutBase::BeginFly( eAnchor, bAbsolutePos, 0 );
    SfxItemSet* pSet = NewFlyDefaults();

// Alle Attribute schliessen, da sonst Attribute entstehen koennen,
// die in Flys reinragen
    rStack.SetAttr( *pPaM->GetPoint(), 0, FALSE );
    rEndStack.SetAttr( *pPaM->GetPoint(), 0, FALSE );

// create Fly:
    ASSERT(pFlySavedPos == NULL, "BeginFly in Fly");    // rekursiv geht noch nicht
    pFlySavedPos = new SwPosition(*pPaM->GetPoint());


    SwFmtAnchor aAnchor( eAnchor, 1 );

// Wenn Fly-Attribute im Style waren, dann jetzt als Defaults reinsetzen
    if (pMoreAttrs)
        pSet->Put(*pMoreAttrs);

//  dieses NICHT bei Seitengebundenem Fly mit Seiten-NUMMER !
    aAnchor.SetAnchor(pPaM->GetPoint());    // braucht erstaunlicherweise
                                            // den Stack nicht
//  aStack.NewAttr( *pPaM->GetPoint(), SwFltAnchor( pFly ) );

    pSet->Put( aAnchor );
    SwFrmFmt* pF = MakeFly( eAnchor, pSet );
    delete pSet;

// set pam in Fly
    const SwFmtCntnt& rCntnt = pF->GetCntnt();
    ASSERT( rCntnt.GetCntntIdx(), "Kein Inhalt vorbereitet." );
    pPaM->GetPoint()->nNode = rCntnt.GetCntntIdx()->GetIndex() + 1;
    SwCntntNode *pNode = pPaM->GetCntntNode();
    pPaM->GetPoint()->nContent.Assign( pNode, 0 );

    return TRUE;
}

/*virtual*/ void SwFltOutDoc::SetFlyFrmAttr(const SfxPoolItem& rAttr)
{
    if (pFly)
        pFly->SetAttr( rAttr );
    else
        ASSERT(pFly, "SetFlyAttr ohne Doc-Fly");
}

/*virtual*/ const SfxPoolItem& SwFltOutDoc::GetFlyFrmAttr(USHORT nWhich)
{
    if (pFly){
        return pFly->GetAttr( nWhich );
    }else{
        ASSERT(pFly, "GetFlyAttr ohne Fly");
        return GetDoc().GetAttrPool().GetDefaultItem(nWhich);
    }
}

void SwFltOutDoc::EndFly()
{
    if( pTable ){
        ASSERT( FALSE, "SwFltOutDoc::EndFly() in Table" );
        return;
    }
                        // Alle Attribute schliessen, da sonst Attribute
                        // entstehen koennen, die aus Flys rausragen
    rStack.SetAttr( *pPaM->GetPoint(), 0, FALSE );
    rEndStack.SetAttr( *pPaM->GetPoint(), 0, FALSE );

    *pPaM->GetPoint() = *pFlySavedPos;              // restore Cursor
    delete pFlySavedPos;
    pFlySavedPos = 0;
    SwFltOutBase::EndFly();
    pFly = 0;
}

//-----------------------------------------------------------------------------
// Flys in SwFltFormatCollection
//-----------------------------------------------------------------------------
/*virtual*/ BOOL SwFltFormatCollection::IsInFly()
{
    return bHasFly;
};

/*virtual*/ void SwFltFormatCollection::SetFlyFrmAttr(const SfxPoolItem& rAttr)
{
    if (!pFlyAttrs)
        pFlyAttrs = new SfxItemSet( GetDoc().GetAttrPool(),
                             RES_FRMATR_BEGIN, RES_FRMATR_END-1 );
    pFlyAttrs->Put( rAttr );
}

/*virtual*/ const SfxPoolItem& SwFltFormatCollection::GetFlyFrmAttr(USHORT nWhich)
{
//  ASSERT( pFlyAttrs, "GetFlyFrmAttr ohne Coll-FlyAttrs" );
    if( pFlyAttrs )
        return pFlyAttrs->Get( nWhich, FALSE );
    else
        return GetDoc().GetAttrPool().GetDefaultItem(nWhich);
}

BOOL SwFltFormatCollection::BeginFly( RndStdIds eAnchor /*= FLY_AT_CNTNT*/,
                           BOOL bAbsolutePos /*= FALSE*/,
                           const SfxItemSet* pMoreAttrs /*= 0*/ )

{
    SwFltOutBase::BeginFly( eAnchor, bAbsolutePos, pMoreAttrs );
    bHasFly = TRUE;
    return TRUE;
}

void SwFltFormatCollection::EndFly()    // Wird nie aufgerufen
{
}

BOOL SwFltFormatCollection::BeginStyleFly( SwFltOutDoc* pOutDoc )
{
    ASSERT( pOutDoc, "BeginStyleFly ohne pOutDoc" );
    ASSERT( pOutDoc && !pOutDoc->IsInFly(), "BeginStyleFly in Fly" );
    if( pOutDoc && !pOutDoc->IsInFly() )
        return pOutDoc->BeginFly( eFlyAnchor, bFlyAbsPos, pFlyAttrs );
    else
        return FALSE;
}

//-----------------------------------------------------------------------------
// Flys in SwFltShell
//-----------------------------------------------------------------------------

BOOL SwFltShell::BeginFly( RndStdIds eAnchor /*= FLY_AT_CNTNT*/,
                           BOOL bAbsolutePos /*= FALSE*/ )

{
    if (pOut->IsInFly()){
        ASSERT(FALSE, "BeginFly in Fly");
        return FALSE;
    }
    if (pOutDoc->IsInTable()){
        ASSERT(FALSE, "BeginFly in Table");
        return FALSE;
    }
    pOut->BeginFly( eAnchor, bAbsolutePos, pColls[nAktStyle]->GetpFlyAttrs() );
    eSubMode = Fly;
    return TRUE;
}

void SwFltShell::SetFlyXPos( short nXPos,SwRelationOrient eHRel /*= FRAME*/,
                             SwHoriOrient eHAlign /*= HORI_NONE*/ )
{
    SetFlyFrmAttr( SwFmtHoriOrient( nXPos, eHAlign, eHRel ) );
}

void SwFltShell::SetFlyYPos( short nYPos, SwRelationOrient eVRel /*= FRAME*/,
                             SwVertOrient eVAlign /*= VERT_NONE*/ )
{
    SetFlyFrmAttr( SwFmtVertOrient( nYPos, eVAlign, eVRel ) );
}


void SwFltShell::EndFly()
{
    if (!pOut->IsInFly()){
        ASSERT(FALSE, "EndFly ohne Fly");
        return;
    }
    if (pOutDoc->IsInTable()){      // Table verschraenkt mit Fly macht keinen Sinn
        ASSERT(FALSE, "EndFly in Table ( verschraenkt )");
        EndTable();     // -> Table beenden
    }
    pOut->EndFly();
    eSubMode = None;
}

//-----------------------------------------------------------------------------
// Fussnoten
//-----------------------------------------------------------------------------

void SwFltShell::BeginFootnote()
{
    if( pOut->IsInFly() ){          // Passiert z.B. bei Fussnote in Fly
        ASSERT(FALSE, "Fussnote in Fly nicht erlaubt");
        return;
    }
    if( pOutDoc->IsInTable() ){
        ASSERT(FALSE, "Fussnote in Table z.Zt. nicht erlaubt");
        return;
    }

// Alle Attribute schliessen, da sonst Attribute entstehen koennen,
// die in Fussnoten reinragen
    aStack.SetAttr( *pPaM->GetPoint(), 0, FALSE );
//  aEndStack.SetAttr( *pPaM->GetPoint(), 0, FALSE );
//  EndStack erstmal nicht zwangs-Schliessen, damit Bookmarks ueber
//  Fussnoten im PMW uebernommen werden

    SwFmtFtn aFtn;
    GetDoc().Insert(*pPaM, aFtn);
    ASSERT(pSavedPos == NULL, "SwFltShell");
    pSavedPos = new SwPosition(*pPaM->GetPoint());
    pPaM->Move(fnMoveBackward, fnGoCntnt);
    SwTxtNode* pTxt = pPaM->GetNode()->GetTxtNode();
    SwTxtAttr* pFN = pTxt->GetTxtAttr(pPaM->GetPoint()->nContent,
     RES_TXTATR_FTN);
    if( !pFN ){         // Passiert z.B. bei Fussnote in Fly
        ASSERT(pFN, "Probleme beim Anlegen des Fussnoten-Textes");
        return;
    }
    const SwNodeIndex* pStartIndex = ((SwTxtFtn*)pFN)->GetStartNode();
    ASSERT(pStartIndex, "Probleme beim Anlegen des Fussnoten-Textes");
    pPaM->GetPoint()->nNode = pStartIndex->GetIndex() + 1;
    pPaM->GetPoint()->nContent.Assign(pPaM->GetCntntNode(), 0);
    eSubMode = Footnote;
}

void SwFltShell::EndFootnote()
{
    if(!pSavedPos)
        return;
                        // Alle Attribute schliessen, da sonst Attribute
                        // entstehen koennen, die aus Fussnoten rausragen
    aStack.SetAttr( *pPaM->GetPoint(), 0, FALSE );
//  aEndStack.SetAttr( *pPaM->GetPoint(), 0, FALSE );
//  EndStack erstmal nicht zwangs-Schliessen, damit Bookmarks ueber
//  Fussnoten im PMW uebernommen werden

    *pPaM->GetPoint() = *pSavedPos;             // restore Cursor
    delete pSavedPos;
    pSavedPos = 0;
}

void SwFltShell::BeginHeader(SwPageDesc* pPD)
{
    SwFrmFmt* pFmt = &pCurrentPageDesc->GetMaster(
     ); //(bUseLeft) ?  &pCurrentPageDesc->GetLeft() :
    SwFrmFmt* pHdFtFmt;
    pFmt->SetAttr(SwFmtHeader(TRUE));
    pHdFtFmt = (SwFrmFmt*)pFmt->GetHeader().GetHeaderFmt();
    const SwNodeIndex* pStartIndex = pHdFtFmt->GetCntnt().GetCntntIdx();
    if (!pStartIndex)
        return;
    ASSERT(pSavedPos == NULL, "SwFltShell");
    pSavedPos = new SwPosition(*pPaM->GetPoint());
    pPaM->GetPoint()->nNode = pStartIndex->GetIndex() + 1;
    pPaM->GetPoint()->nContent.Assign(pPaM->GetCntntNode(), 0);
    eSubMode = Header;
}

void SwFltShell::BeginFooter(SwPageDesc* pPD)
{
    SwFrmFmt* pFmt =  &pCurrentPageDesc->GetMaster(
     ); //(bUseLeft) ?  &pCurrentPageDesc->GetLeft() :
    SwFrmFmt* pHdFtFmt;
    pFmt->SetAttr(SwFmtFooter(TRUE));
    pHdFtFmt = (SwFrmFmt*)pFmt->GetFooter().GetFooterFmt();
    const SwNodeIndex* pStartIndex = pHdFtFmt->GetCntnt().GetCntntIdx();
    if (!pStartIndex)
        return;
    ASSERT(pSavedPos == NULL, "SwFltShell");
    pSavedPos = new SwPosition(*pPaM->GetPoint());
    pPaM->GetPoint()->nNode = pStartIndex->GetIndex() + 1;
    pPaM->GetPoint()->nContent.Assign(pPaM->GetCntntNode(), 0);
    eSubMode = Footer;
}

void SwFltShell::EndHeaderFooter()
{
    *pPaM->GetPoint() = *pSavedPos;             // restore Cursor
    delete pSavedPos;
    pSavedPos = 0;
}

SwPageDesc* SwFltShell::MakePageDesc(SwPageDesc* pFirstPageDesc)
{
    if(bStdPD)                      // keine Neuen PageDescs
        return pCurrentPageDesc;

    BOOL bFollow = (pFirstPageDesc != 0);
    SwPageDesc* pNewPD;
    USHORT nPos;
    if (bFollow && pFirstPageDesc->GetFollow() != pFirstPageDesc)
        return pFirstPageDesc;      // Fehler: hat schon Follow
// Erkennung doppelter Namen fehlt noch (Wahrscheinlichkeit
// fuer dopp. Namen ist gering)

// Namen zusammenbasteln
    String aNm( String::CreateFromAscii(
                            RTL_CONSTASCII_STRINGPARAM( "Konvert ")));
    if (bFollow)
        aNm.AppendAscii( "Folge" );
    aNm += String(GetDoc().GetPageDescCnt());
    if (!bFollow)
        nPos = GetDoc().MakePageDesc(aNm, 0);
    else
        nPos = GetDoc().MakePageDesc(aNm,
         pFirstPageDesc);// alles uebernehmen
    pNewPD =  &((SwPageDesc&)GetDoc().GetPageDesc(nPos));
    if (bFollow)
    {               // Dieser ist der folgende von pPageDesc
        pFirstPageDesc->SetFollow(pNewPD);
        pNewPD->SetFollow(pNewPD);
    }
    else
        GetDoc().Insert( *pPaM, SwFmtPageDesc( pNewPD ) );
    pNewPD->WriteUseOn( // alle Seiten
     (UseOnPage)(PD_ALL | PD_HEADERSHARE | PD_FOOTERSHARE));
    return pNewPD;
}

///////////////////////////////////////////////// SwFltFormatCollection
SwFltFormatCollection::SwFltFormatCollection(
    SwDoc& rDoc, RES_POOL_COLLFMT_TYPE nType) :
    SwFltOutBase(rDoc),
    pColl(rDoc.GetTxtCollFromPool(nType)),
    pFlyAttrs( 0 ),
    bHasFly( FALSE )
{
    Reset();            // Default-Attrs loeschen und Auto-Flag
}

SwFltFormatCollection::SwFltFormatCollection(
    SwDoc& rDoc, const String& rName ) :
    SwFltOutBase(rDoc),
    pFlyAttrs( 0 ),
    bHasFly( FALSE )
{
    pColl = rDoc.MakeTxtFmtColl(rName, (SwTxtFmtColl*)rDoc.GetDfltTxtFmtColl());
    Reset();            // Default-Attrs loeschen und Auto-Flag
}

#if 0
SwTxtFmtColl* SwFltFormatCollection::Search(String aName, CharSet eSrc)
{
    aName.Convert(eSrc);
    SwTxtFmtColl* pColl = GetDoc().FindTxtFmtCollByName(aName);
    if(!pColl)
    {
        USHORT n = GetDoc().GetPoolId(aName, GET_POOLID_TXTCOLL);
        if(USHRT_MAX != n)
            pColl = GetDoc().GetTxtCollFromPool(n);
    }
    return pColl;
}
#endif
void SwFltShell::NextStyle(USHORT nWhich, USHORT nNext)
{
        ASSERT(pColls[nWhich], "Next style for noexistent style" );
        ASSERT(pColls[nNext], "Next style to noexistent style" );
        if( pColls[nWhich] && pColls[nNext] )
            pColls[nWhich]->GetColl()->SetNextTxtFmtColl(
                 *pColls[nNext]->GetColl() );
}

/**********************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ww1/fltshell.cxx,v 1.1.1.1 2000-09-18 17:14:57 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.57  2000/09/18 16:04:55  willem.vandorp
      OpenOffice header added.

      Revision 1.56  2000/08/30 16:46:59  jp
      use CharClass instead of international

      Revision 1.55  2000/07/28 15:26:54  khz
      #73796# don't delete NumRule from Attr but set it into pDoc

      Revision 1.54  2000/07/25 16:58:34  khz
      #74876# MakeRegion() don't use different Nodes for same Node Index

      Revision 1.53  2000/07/24 16:39:49  khz
      #75701# set Break or PageDesc item BEHIND TOX if not found before the #0x0C

      Revision 1.52  2000/07/12 11:37:05  khz
      #76503# SwFltStackEntry.bOld prevents from killing attributes in ww8par.cxx

      Revision 1.51  2000/06/28 08:10:17  khz
      #70915# new: MoveAttrsToNextTextNode() [see coment in ww8/ww8par.cxx]

      Revision 1.50  2000/06/26 12:53:42  os
      INetURLObject::SmartRelToAbs removed

      Revision 1.49  2000/06/13 11:22:33  os
      SUPD removed

      Revision 1.48  2000/06/13 09:38:40  os
      using UCB

      Revision 1.47  2000/05/26 11:41:20  hr
      SwFltShell& SwFltShell::operator << ( const sal_Unicode c )

      Revision 1.46  2000/05/11 16:06:41  jp
      Changes for Unicode

      Revision 1.45  2000/02/11 14:39:29  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.44  1999/11/25 17:00:35  khz
      Task #70133# new method SwFltControlStack::KillUnlockedAttrs()

      Revision 1.43  1999/11/25 16:38:15  khz
      Task #70133# new method SwFltControlStack::KillUnlockedAttrs()

      Revision 1.42  1999/10/29 12:08:16  khz
      import new TOX_CONTENT and TOX_INDEX features

      Revision 1.41  1999/10/25 19:35:23  tl
      ongoing ONE_LINGU implementation

      Revision 1.40  1999/10/08 09:29:10  khz
      Import Redlining

      Revision 1.39  1999/04/27 12:19:10  KHZ
      Task #65353# Section ins Doc einfuegen nur mit Parameter bUpdate = FALSE


      Rev 1.38   27 Apr 1999 14:19:10   KHZ
   Task #65353# Section ins Doc einfuegen nur mit Parameter bUpdate = FALSE

      Rev 1.37   12 May 1998 15:52:14   JP
   rund um Flys/DrawObjs im Doc/FESh umgestellt/optimiert

      Rev 1.36   27 Feb 1998 19:12:42   HJS
   SH 27.02.98

      Rev 1.33   22 Jan 1998 20:06:44   JP
   CTOR des SwPaM umgestellt

      Rev 1.32   02 Dec 1997 17:25:56   MA
   includes

      Rev 1.31   29 Nov 1997 17:37:12   MA
   includes

      Rev 1.30   17 Nov 1997 09:57:14   JP
   Umstellung Numerierung

      Rev 1.29   30 Oct 1997 18:17:16   AMA
   Chg: Kein AutoFlag mehr an Break bzw. PageDesc-Attributen

      Rev 1.28   09 Oct 1997 14:14:32   JP
   Aenderungen von SH und Umstellung NodeIndex/-Array/BigPtrArray

      Rev 1.27   02 Oct 1997 15:26:00   OM
   Feldumstellung

      Rev 1.26   12 Sep 1997 11:17:24   OS
   ITEMID_* definiert

      Rev 1.25   04 Sep 1997 11:18:00   JP
   include

      Rev 1.24   03 Sep 1997 14:17:32   SH
   Flys, Tabellen ok, Style-Abhaengigkeiten u.v.a.m

      Rev 1.23   15 Aug 1997 12:50:36   OS
   charatr/frmatr/txtatr aufgeteilt

      Rev 1.22   12 Aug 1997 14:16:32   OS
   Header-Umstellung

      Rev 1.21   11 Aug 1997 14:07:40   OM
   Headerfile-Umstellung

      Rev 1.20   11 Aug 1997 12:50:34   SH
   Flys und einfache Tabellen und Tabulatoren

      Rev 1.19   18 Jul 1997 09:31:36   MA
   Stand von SH, #41738# GPF und Tabellen etwas besser

      Rev 1.16   11 Jul 1997 14:54:44   SH
   #40772#, #41459#

      Rev 1.15   16 Jun 1997 13:08:58   MA
   Stand Micheal Dietrich

      Rev 1.13   27 Apr 1997 16:27:28   SH
   Sonderwunsch Hypo: Ref-Feld auf Frage-Feld

      Rev 1.12   01 Apr 1997 22:41:04   SH
   MoveAttrs fuer Hypo-Bookmarks

      Rev 1.11   12 Mar 1997 19:13:06   SH
   MDT: Progressbar, Pagedesc-Bug, Spalten, Anfang Tabellen u.a.

      Rev 1.10   24 Jan 1997 19:49:32   SH
   Bookmarks verschraenkt und verschachtelt

      Rev 1.9   22 Jan 1997 12:01:52   JP
   neu: Tabellen Box Attribute

      Rev 1.8   10 Jan 1997 18:42:00   SH
   Stabiler und mehr von MDT

      Rev 1.7   28 Nov 1996 18:07:52   SH
   Schneller Schoener Weiter von MDT

      Rev 1.6   29 Oct 1996 13:11:24   JP
   am Doc ist das NodesArray nur noch ueber Get..() zugaenglich

      Rev 1.5   24 Oct 1996 17:16:44   JP
   Optimierung: Find...ByName

      Rev 1.4   09 Oct 1996 13:08:14   JP
   SwNodes::GoNext/-Prev (-Sect) returnt statt BOOL den gefundenen ContentNode

      Rev 1.3   08 Oct 1996 22:09:18   SH
   Zusammenfassung Anchor + GrafAnchor

      Rev 1.2   30 Sep 1996 23:20:30   SH
   neu von MDA

**********************************************************************/
//)}]
diff --git a/sw/source/filter/ww1/makefile.mk b/sw/source/filter/ww1/makefile.mk
new file mode 100644
index 0000000..e284583
--- /dev/null
+++ b/sw/source/filter/ww1/makefile.mk
@@ -0,0 +1,136 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:57 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=..$/..$/..

PRJNAME=sw
TARGET=ww1

PROJECTPCH=filt_pch
PROJECTPCHSOURCE=..\filt_1st\filt_pch

# --- Settings -----------------------------------------------------

.INCLUDE :  $(PRJ)$/inc$/swpre.mk
.INCLUDE :  settings.mk
.INCLUDE :  $(PRJ)$/inc$/sw.mk

.IF "$(mydebug)" != ""
CDEFS=$(CDEFS) -Dmydebug
.ENDIF

# --- Files --------------------------------------------------------

CXXFILES = \
        fltshell.cxx \
        w1par.cxx \
        w1class.cxx \
        w1filter.cxx \
        w1sprm.cxx \


SLOFILES =  \
        $(SLO)$/w1par.obj \
        $(SLO)$/w1class.obj \
        $(SLO)$/w1filter.obj \
        $(SLO)$/w1sprm.obj \
        $(SLO)$/fltshell.obj \


# --- Targets -------------------------------------------------------

.INCLUDE :  target.mk

run: alltar

#copy all relevant files to a backupdir
bak:
    copy ..\inc\fltshell.hxx backup
    copy *.?xx backup
    copy makefile* backup
    copy vcs.cfg backup
    copy ..\..\..\dump1\src\dump1.cxx backup
    copy ..\..\..\dump1\src\makefile backup\makefile.dmp
    copy ..\..\..\WNTMSCI\bin\makefile backup\makefile.bin
    copy ..\..\..\UTIL\makefile backup\makefile.utl
    copy s:\solenv\inc\wnt.mak backup

# remove this filter from libs to avoid annoying effects
upgrade:
    attrib -r *.?xx
    attrib -r makefile.*
    del ..\..\..\WNMSCI\LIB\ww1.lib
    del ..\..\..\WNMSCI\DBO\w1*.obj
    del ..\..\..\WNMSCI\DBO\fltshell.obj
    del ..\..\..\WNMSCI\MISC
    lib /nologo /REMOVE:..\..\..\WNTMSCI\obj\fltshell.obj /out:..\..\..\WNTMSCI\LIB\filter.lib ..\..\..\WNTMSCI\LIB\filter.lib
    lib /nologo /REMOVE:..\..\..\WNTMSCI\obj\w1sprm.obj /out:..\..\..\WNTMSCI\LIB\filter.lib ..\..\..\WNTMSCI\LIB\filter.lib
    lib /nologo /REMOVE:..\..\..\WNTMSCI\obj\w1filter.obj /out:..\..\..\WNTMSCI\LIB\filter.lib ..\..\..\WNTMSCI\LIB\filter.lib
    lib /nologo /REMOVE:..\..\..\WNTMSCI\obj\w1class.obj /out:..\..\..\WNTMSCI\LIB\filter.lib ..\..\..\WNTMSCI\LIB\filter.lib
    lib /nologo /REMOVE:..\..\..\WNTMSCI\obj\w1par.obj /out:..\..\..\WNTMSCI\LIB\filter.lib ..\..\..\WNTMSCI\LIB\filter.lib
    copy backup\makefile.bin ..\..\..\WNTMSCI\bin\makefile
    diff backup\makefile.utl ..\..\..\UTIL\makefile
    diff s:\solenv\inc\wnt.mak backup

zip: bak
    pkzip c:\temp\ww1 backup\*.*

diff --git a/sw/source/filter/ww1/w1class.cxx b/sw/source/filter/ww1/w1class.cxx
new file mode 100644
index 0000000..ad716d4
--- /dev/null
+++ b/sw/source/filter/ww1/w1class.cxx
@@ -0,0 +1,1580 @@
/*************************************************************************
 *
 *  $RCSfile: w1class.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:57 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PCH
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#include <string.h>

#ifndef _STREAM_HXX //autogen
#include <tools/stream.hxx>
#endif

#ifndef _W1CLASS_HXX
#include <w1class.hxx>
#endif


/////////////////////////////////////////////////////////////////// Fib
Ww1Fib::Ww1Fib( SvStream& rStream )
    : rStream(rStream)
{
    bOK = 0 == rStream.Seek(0) &&
          rStream.Read( &aFib, sizeof( aFib )) == sizeof( aFib );
}

///////////////////////////////////////////////////////////// PlainText
sal_Unicode Ww1PlainText::operator [] ( ULONG ulOffset )
{
    DBG_ASSERT( ulOffset<Count(), "Ww1PlainText" );
    sal_Unicode cRet;
    sal_Char cRead;
    if( rFib.GetStream().Seek( ulFilePos + ulOffset ) == ulFilePos+ulOffset &&
        rFib.GetStream().Read( &cRead, sizeof( cRead ) ) == sizeof( cRead ) )
    {
        cRet = ByteString::ConvertToUnicode( cRead, RTL_TEXTENCODING_MS_1252 );
    }
    else
        cRet = ' ';
    return cRet;
}

String Ww1PlainText::GetText( ULONG ulOffset, ULONG nLen ) const
{
    String sRet;
    ByteString aStr;
    DBG_ASSERT(ulOffset+nLen<Count(), "Ww1PlainText");
    if( rFib.GetStream().Seek(ulFilePos+ulOffset) == ulFilePos+ulOffset &&
        rFib.GetStream().Read( aStr.AllocBuffer( nLen ), nLen ) == nLen )
        sRet = String( aStr, RTL_TEXTENCODING_MS_1252 );
    return sRet;
}

///////////////////////////////////////////////////////////////// Style
Ww1Style::Ww1Style()
    : stcBase(0),
    stcNext(0),
    bUsed(FALSE),
    pParent(NULL),
    pPapx(NULL)
{
}

Ww1Style::~Ww1Style()
{
    delete pPapx;
}

void Ww1Style::SetDefaults(BYTE stc)
{
    if( 222 == stc )
    {
        stcBase = 222;
        stcNext = 222;
        aChpx.hpsSet(20);
    }
}

USHORT Ww1Style::ReadName( BYTE*&p, USHORT& rnCountBytes, USHORT stc )
{
    BYTE nCountBytes = SVBT8ToByte(p);
    p++;
    rnCountBytes--;
    if( !nCountBytes ) // default
    {
        static sal_Char* __READONLY_DATA names[] =
        {
            "W1 Null",  //222
            "W1 Annotation reference",  //223
            "W1 Annotation text",  //224
            "W1 Table of contents 8",  //225
            "W1 Table of contents 7",  //226
            "W1 Table of contents 6",  //227
            "W1 Table of contents 5",  //228
            "W1 Table of contents 4",  //229
            "W1 Table of contents 3",  //230
            "W1 Table of contents 2",  //231
            "W1 Table of contents 1",  //232
            "W1 Index 7",  //233
            "W1 Index 6",  //234
            "W1 Index 5",  //235
            "W1 Index 4",  //236
            "W1 Index 3",  //237
            "W1 Index 2",  //238
            "W1 Index 1",  //239
            "W1 Line number",  //240
            "W1 Index heading",  //241
            "W1 Footer",  //242
            "W1 Header",  //243
            "W1 Footnote reference",  //244
            "W1 Footnote text",  //245
            "W1 Heading 9",  //246
            "W1 Heading 8",  //247
            "W1 Heading 7",  //248
            "W1 Heading 6",  //249
            "W1 Heading 5",  //250
            "W1 Heading 4",  //251
            "W1 Heading 3",  //252
            "W1 Heading 2",  //253
            "W1 Heading 1",  //254
            "W1 Normal indent"  //255
            };//256

        const sal_Char* pStr;
        if( !stc )
            pStr = "W1 Normal";
        else if( stc - 222 >= sizeof( names ) / sizeof( *names ))
            pStr = "?";
        else
            pStr = names[ stc-222 ];
        SetName( String( pStr, RTL_TEXTENCODING_MS_1252 ));
    }
    else if( 255 > nCountBytes ) // unused
    {
        SetName( String( (sal_Char*)p, nCountBytes, RTL_TEXTENCODING_MS_1252 ));
        p += nCountBytes;
        DBG_ASSERT(rnCountBytes>=nCountBytes, "Ww1Style");
        rnCountBytes -= nCountBytes;
    }
    return 0;
}

USHORT Ww1Style::ReadChpx( BYTE*&p, USHORT& rnCountBytes )
{
    USHORT nCountBytes = SVBT8ToByte(p);
    p++;
    rnCountBytes--;
    if (nCountBytes != 255 // unused
     && nCountBytes != 0) // default
    {
        if (nCountBytes > sizeof(aChpx))
            nCountBytes = sizeof(aChpx);
        memcpy( &aChpx, p, nCountBytes );
        p += nCountBytes;
        DBG_ASSERT(rnCountBytes>=nCountBytes, "Ww1Style");
        rnCountBytes -= nCountBytes;
    }
    return 0;
}

USHORT Ww1Style::ReadPapx(BYTE*&p, USHORT& rnCountBytes)
{
    USHORT nCountBytes = SVBT8ToByte(p);
    p++;
    rnCountBytes--;
    if (nCountBytes != 255)
    {
        pPapx = new Ww1SprmPapx(p, nCountBytes);
        p += nCountBytes;
        DBG_ASSERT(rnCountBytes>=nCountBytes, "Ww1Style");
        rnCountBytes -= nCountBytes;
    }
    else
        pPapx = new Ww1SprmPapx(p, 0);
    return 0;
}

USHORT Ww1Style::ReadEstcp(BYTE*&p, USHORT& rnCountBytes)
{
    stcNext = SVBT8ToByte(p);
    p++;
    rnCountBytes--;
    stcBase = SVBT8ToByte(p);
    p++;
    DBG_ASSERT(rnCountBytes>0, "Ww1Style");
    rnCountBytes--;
    return 0;
}

//////////////////////////////////////////////////////////// StyleSheet
Ww1StyleSheet::Ww1StyleSheet(Ww1Fib& rFib)
    : cstcStd(0),
    rFib(rFib),
    bOK(FALSE)
{
    USHORT cbStshf = rFib.GetFIB().cbStshfGet();
    DBG_ASSERT(cbStshf>=17, "Ww1StyleSheet");
    for (USHORT stc=0;stc<Count();stc++)
    {
        aStyles[stc].SetParent(this);
        aStyles[stc].SetDefaults((BYTE)stc);
    }
    BYTE* del = NULL;
    if (rFib.GetStream().Seek(rFib.GetFIB().fcStshfGet())
      == (ULONG)rFib.GetFIB().fcStshfGet()
     && (del = new BYTE[cbStshf]) != NULL
     && rFib.GetStream().Read(del, cbStshf) == (ULONG)cbStshf)
        {
        BYTE* p = del;
            cstcStd = SVBT16ToShort(p);
            p += sizeof(SVBT16);
            cbStshf -= sizeof(SVBT16);
            ReadNames(p, cbStshf);
            ReadChpx(p, cbStshf);
            ReadPapx(p, cbStshf);
            ReadEstcp(p, cbStshf);
            DBG_ASSERT(cbStshf==0, "Ww1StyleSheet");
            bOK = cbStshf == 0;
        }
    delete del;
}

USHORT Ww1StyleSheet::ReadNames( BYTE*& p, USHORT& rnCountBytes )
{
    USHORT nCountBytes = SVBT16ToShort(p);
    p += sizeof(SVBT16);
    DBG_ASSERT(rnCountBytes>=nCountBytes, "Ww1StyleSheet");
    rnCountBytes -= nCountBytes;
    nCountBytes -= sizeof(SVBT16);
    USHORT stcp = 0;
    while (nCountBytes > 0)
    {
        USHORT stc = (stcp - cstcStd) & 255;
        aStyles[stc].ReadName(p, nCountBytes, stc);
        stcp++;
    }
    DBG_ASSERT(nCountBytes==0, "Ww1StyleSheet");
    return 0;
}

USHORT Ww1StyleSheet::ReadChpx(BYTE*& p, USHORT& rnCountBytes)
{
    USHORT nCountBytes = SVBT16ToShort(p);
    p += sizeof(SVBT16);
    DBG_ASSERT(rnCountBytes>=nCountBytes, "Ww1StyleSheet");
    rnCountBytes -= nCountBytes;
    nCountBytes -= sizeof(SVBT16);
    USHORT stcp = 0;
    while (nCountBytes > 0)
    {
        USHORT stc = (stcp - cstcStd) & 255;
        aStyles[stc].ReadChpx(p, nCountBytes);
        stcp++;
    }
    DBG_ASSERT(nCountBytes == 0, "Ww1StyleSheet");
    return 0;
}

USHORT Ww1StyleSheet::ReadPapx(BYTE*& p, USHORT& rnCountBytes)
{
    USHORT nCountBytes = SVBT16ToShort(p);
    p += sizeof(SVBT16);
    DBG_ASSERT(rnCountBytes>=nCountBytes, "Ww1StyleSheet");
    rnCountBytes -= nCountBytes;
    nCountBytes -= sizeof(SVBT16);
    USHORT stcp = 0;
    while (nCountBytes > 0)
    {
        USHORT stc = (stcp - cstcStd) & 255;
        aStyles[stc].ReadPapx(p, nCountBytes);
        stcp++;
    }
    DBG_ASSERT(nCountBytes == 0, "Ww1StyleSheet");
    return 0;
}

USHORT Ww1StyleSheet::ReadEstcp(BYTE*& p, USHORT& rnCountBytes)
{
    USHORT iMac = SVBT16ToShort(p);
    p += sizeof(SVBT16);
    DBG_ASSERT(rnCountBytes>=sizeof(SVBT16), "Ww1StyleSheet");
    rnCountBytes -= sizeof(SVBT16);
    for (USHORT stcp=0;stcp<iMac;stcp++)
    {
        USHORT stc = (stcp - cstcStd) & 255;
        aStyles[stc].ReadEstcp(p, rnCountBytes);
    }
    DBG_ASSERT(rnCountBytes==0, "Ww1StyleSheet");
    return 0;
}

///////////////////////////////////////////////////////////////// Fonts

Ww1Fonts::Ww1Fonts(Ww1Fib& rFib, ULONG nFieldFlgs)
    : nMax(0), rFib(rFib), pFontA(0), nFieldFlags( nFieldFlgs ), bOK(FALSE)
{
    if(rFib.GetFIB().cbSttbfffnGet() > 2 ) // ueberhaupt fonts?
    {
        SVBT16 nCountBytes;
        DBG_ASSERT(rFib.GetFIB().cbSttbfffnGet() > sizeof(nCountBytes), "Ww1Fonts");
        if (rFib.GetStream().Seek(rFib.GetFIB().fcSttbfffnGet())
         == (ULONG)rFib.GetFIB().fcSttbfffnGet())
            if (rFib.GetStream().Read(nCountBytes, sizeof(nCountBytes))
             == sizeof(nCountBytes)) // Laenge steht hier nochmal
            {
                DBG_ASSERT(SVBT16ToShort(nCountBytes)
                 == rFib.GetFIB().cbSttbfffnGet(), "redundant-size missmatch");
                 // hoffentlich sind sie immer gleich
                W1_FFN* pA = (W1_FFN*)new char[rFib.GetFIB().cbSttbfffnGet()
                 - sizeof(nCountBytes)]; // Alloziere Font-Array
                //~ Ww1: new-NULL
                if (rFib.GetStream().Read(pA, rFib.GetFIB().cbSttbfffnGet()
                 - sizeof(nCountBytes)) == (ULONG)rFib.GetFIB().cbSttbfffnGet()
                 - sizeof(nCountBytes)) // lese alle Fonts
                {} //nothing

                long nLeft = rFib.GetFIB().cbSttbfffnGet()
                 - sizeof(nCountBytes); // Zaehle, wieviele Fonts enthalten
                W1_FFN* p = pA;
                while (1)
                {
                    USHORT nNextSiz;
                    nNextSiz = p->cbFfnM1Get() + 1;
                    if(nNextSiz > nLeft)
                        break;
                    nMax++;
                    nLeft -= nNextSiz;
                    if(nLeft < 1)           // naechste Laenge muss gelesen werden koennen
                        break;
                    p = (W1_FFN *)(((char*)p) + nNextSiz);
                }
                if (nMax)
                {
                    pFontA = new W1_FFN*[nMax];         // alloziere Index-Array
                    //~ Ww1: new-NULL
                    pFontA[0] = pA;                     // fuelle Index-Array
                    USHORT i;
                    for(i=1, p=pA; i<nMax; i++)
                    {
                        p = (W1_FFN*)(((char*)p) + p->cbFfnM1Get() + 1);
                        pFontA[i] = p;
                    }
                }
                else
                    pFontA = 0; // Keine Eintraege -> kein Array
            }
    }
    bOK = TRUE;
}

W1_FFN* Ww1Fonts::GetFFN(USHORT nNum)
{
    W1_FFN* pRet = NULL;
    if (pFontA)
        if (nNum < nMax)
            pRet = pFontA[nNum];
    return pRet;
}

/////////////////////////////////////////////////////////////////// DOP
Ww1Dop::Ww1Dop(Ww1Fib& rFib)
    : rFib(rFib)
{
    long nRead;
    memset(&aDop, 0, sizeof(aDop)); // set defaults
    if(rFib.GetFIB().cbDopGet() >= sizeof(aDop))
        nRead = sizeof(aDop);
    else
        nRead = rFib.GetFIB().cbDopGet();
    bOK = rFib.GetStream().Seek(rFib.GetFIB().fcDopGet()) ==
                (ULONG)rFib.GetFIB().fcDopGet() &&
            rFib.GetStream().Read(&aDop, nRead) == (ULONG)nRead;
}

/////////////////////////////////////////////////////////////// Picture
Ww1Picture::Ww1Picture(SvStream& rStream, ULONG ulFilePos)
    : pPic(NULL), bOK(FALSE)
{
    ulFilePos &= 0xffffff; //~ ww1: warum auch immer - im highbyte steht eine 5?!?!
    SVBT32 lcb;
    if (rStream.Seek(ulFilePos) == (ULONG)ulFilePos)
        if (rStream.Read(&lcb, sizeof(lcb)) == (ULONG)sizeof(lcb))
            if (sizeof(int)>=4 || SVBT32ToLong(lcb) < 0x8000) //~ mdt: 64K & 16bit
                if ((pPic = (W1_PIC*)(new BYTE[SVBT32ToLong(lcb)])) != NULL)
                    if (rStream.Seek(ulFilePos) == (ULONG)ulFilePos)
                        if (rStream.Read(pPic, SVBT32ToLong(lcb)) == (ULONG)SVBT32ToLong(lcb))
                        {
                            DBG_ASSERT(pPic->cbHeaderGet()==sizeof(*pPic)-sizeof(pPic->rgb), "Ww1Picture");
                            bOK = TRUE;
                        }
}

////////////////////////////////////////////////////////////////// Sprm
Ww1Sprm::Ww1Sprm(BYTE* x, USHORT nCountBytes)
    : p(NULL),
    nCountBytes(nCountBytes),
    bOK(FALSE),
    pArr(NULL),
    count(0)
{
    if (nCountBytes == 0)
        bOK = TRUE;
    else
        if ((p = new BYTE[nCountBytes]) != NULL)
        {
            memcpy(p, x, nCountBytes);
            if (ReCalc())
                bOK = TRUE;
        }
}

Ww1Sprm::Ww1Sprm(SvStream& rStream, ULONG ulFilePos)
    : p(NULL),
    nCountBytes(0),
    bOK(FALSE),
    pArr(NULL),
    count(0)
{
    SVBT8 x;
    ByteToSVBT8(0, x);
    if (rStream.Seek(ulFilePos) == (ULONG)ulFilePos)
        if (rStream.Read(&x, sizeof(x)) == (ULONG)sizeof(x))
            if ((nCountBytes = SVBT8ToByte(x)) == 255
             || !nCountBytes
             || (p = new BYTE[nCountBytes]) != NULL)
                if (nCountBytes == 255
                 || !nCountBytes
                 || rStream.Read(p, nCountBytes) == (ULONG)nCountBytes)
                    if (ReCalc())
                        bOK = TRUE;
}

Ww1Sprm::~Ww1Sprm()
{
    delete pArr;
    delete p;
}

USHORT Ww1SingleSprm::Size(BYTE* pSprm)
{
    return nCountBytes;
}

USHORT Ww1SingleSprmTab::Size(BYTE* pSprm) // Doc 24/25, Fastsave-Sprm
{
    DBG_ASSERT(nCountBytes==0, "Ww1SingleSprmTab");
    USHORT nRet = sizeof(SVBT8);
    USHORT nSize = SVBT8ToByte(pSprm);
    if (nSize != 255)
        nRet += nSize;
    else
    {
        USHORT nDel = SVBT8ToByte(pSprm+1) * 4;
        USHORT nIns = SVBT8ToByte(pSprm + 3 + nDel) * 3;
        nRet += nDel + nIns;
    }
    DBG_ASSERT(nRet <= 354, "Ww1SingleSprmTab");
    if (nRet > 354)
        nRet = 0;
    return nRet;
}

USHORT Ww1SingleSprmByteSized::Size(BYTE* pSprm)
{
    USHORT nRet;
    nRet = SVBT8ToByte(pSprm);
    nRet += sizeof(SVBT8);  // var. l. byte-size
//  pSprm += sizeof(SVBT8); // var. l. byte-size
    nRet += nCountBytes;
    return nRet;
}

USHORT Ww1SingleSprmWordSized::Size(BYTE* pSprm)
{
    USHORT nRet;
    nRet = SVBT16ToShort(pSprm);
    nRet += sizeof(SVBT16);  // var. l. word-size
//  pSprm += sizeof(SVBT16); // var. l. word-size
    nRet += nCountBytes;
    return nRet;
}

static BYTE nLast = 0;
static BYTE nCurrent = 0;
USHORT Ww1Sprm::GetSize(BYTE nId, BYTE* pSprm)
{
    DBG_ASSERT(nId<sizeof(aTab)/sizeof(*aTab), "Ww1Sprm");
    USHORT nL = 0;
    nL = GetTab(nId).Size(pSprm);
nLast = nCurrent;
nCurrent = nId;
    return nL;
}

BOOL Ww1Sprm::Fill(USHORT index, BYTE& nId, USHORT& nL, BYTE*& pSprm)
{
    DBG_ASSERT(nId<sizeof(aTab)/sizeof(*aTab), "Ww1Sprm");
    DBG_ASSERT(index < Count(), "Ww1Sprm");
    pSprm = p + pArr[index];
    nId = SVBT8ToByte(pSprm);
    pSprm++;
    nL = GetTab(nId).Size(pSprm);
    return TRUE;
}

BOOL Ww1Sprm::ReCalc()
{
    BOOL bRet = TRUE;
    delete pArr;
    pArr = NULL;
    count = 0;
    if (nCountBytes != 255) // not unused?
    {
        USHORT cbsik = nCountBytes;
        BYTE* psik = p;
        while (cbsik > 0)
        {
            USHORT iLen = GetSizeBrutto(psik);
            DBG_ASSERT(iLen<=cbsik, "Ww1Sprm");
            if (iLen > cbsik)
                cbsik = 0; // ignore the rest: we are wrong...
            else
            {
                psik += iLen;
                cbsik -= iLen;
                count++;
            }
        }
        if (bRet
         && (pArr = new USHORT[count]) != NULL)
        {
            cbsik = nCountBytes;
            USHORT offset = 0;
            USHORT current = 0;
            psik = p;
            while (current<count)
            {
                pArr[current++] = offset;
                USHORT iLen = GetSizeBrutto(psik);
                psik += iLen;
                if (iLen > cbsik)
                    cbsik = 0;
                else
                    cbsik -= iLen;
                offset += iLen;
            }

        }
        else
            count = 0;
    }
    return bRet;
}

Ww1SingleSprm* Ww1Sprm::aTab[256];

void Ww1Sprm::DeinitTab()
{
    for (int i=0;i<sizeof(aTab)/sizeof(*aTab);i++)
    {
        delete aTab[i];
        aTab[i] = NULL;
    }
}

void Ww1Sprm::InitTab()
{
    int i = 0;
    aTab[i++] = new Ww1SingleSprm(0, "?"); //   0
    aTab[i++] = new Ww1SingleSprm(0, "?"); //   1
    aTab[i++] = new Ww1SingleSprmByte("sprmPStc"); //   2 pap.istd (style code)
    aTab[i++] = new Ww1SingleSprmByteSized(0, "sprmPIstdPermute"); //   3 pap.istd  permutation
    aTab[i++] = new Ww1SingleSprmByte("sprmPIncLevel"); //   4 pap.istddifference
    aTab[i++] = new Ww1SingleSprmPJc("sprmPJc"); //   5 pap.jc (justification)
    aTab[i++] = new Ww1SingleSprmBool("sprmPFSideBySide"); //   6 pap.fSideBySide
    aTab[i++] = new Ww1SingleSprmPFKeep("sprmPFKeep"); //   7 pap.fKeep
    aTab[i++] = new Ww1SingleSprmPFKeepFollow("sprmPFKeepFollow"); //   8 pap.fKeepFollow
    aTab[i++] = new Ww1SingleSprmPPageBreakBefore("sprmPPageBreakBefore"); //   9 pap.fPageBreakBefore
    aTab[i++] = new Ww1SingleSprmByte("sprmPBrcl"); //  10 pap.brcl
    aTab[i++] = new Ww1SingleSprmByte("sprmPBrcp"); //  11 pap.brcp
    aTab[i++] = new Ww1SingleSprmByteSized(0, "sprmPAnld"); //  12 pap.anld (ANLD structure)
    aTab[i++] = new Ww1SingleSprmByte("sprmPNLvlAnm"); //  13 pap.nLvlAnm nn
    aTab[i++] = new Ww1SingleSprmBool("sprmPFNoLineNumb"); //  14 ap.fNoLnn
    aTab[i++] = new Ww1SingleSprmPChgTabsPapx("sprmPChgTabsPapx"); //  15 pap.itbdMac, ...
    aTab[i++] = new Ww1SingleSprmPDxaRight("sprmPDxaRight"); //  16 pap.dxaRight
    aTab[i++] = new Ww1SingleSprmPDxaLeft("sprmPDxaLeft"); //  17 pap.dxaLeft
    aTab[i++] = new Ww1SingleSprmWord("sprmPNest"); //  18 pap.dxaNest
    aTab[i++] = new Ww1SingleSprmPDxaLeft1("sprmPDxaLeft1"); //  19 pap.dxaLeft1
    aTab[i++] = new Ww1SingleSprmPDyaLine("sprmPDyaLine"); //  20 pap.lspd  an LSPD
    aTab[i++] = new Ww1SingleSprmPDyaBefore("sprmPDyaBefore"); //  21 pap.dyaBefore
    aTab[i++] = new Ww1SingleSprmPDyaAfter("sprmPDyaAfter"); //  22 pap.dyaAfter
    aTab[i++] = new Ww1SingleSprmTab(0, "?"); // 23 pap.itbdMac, pap.rgdxaTab
    aTab[i++] = new Ww1SingleSprmPFInTable("sprmPFInTable"); //  24 pap.fInTable
    aTab[i++] = new Ww1SingleSprmPTtp("sprmPTtp"); //  25 pap.fTtp
    aTab[i++] = new Ww1SingleSprmPDxaAbs("sprmPDxaAbs"); //  26 pap.dxaAbs
    aTab[i++] = new Ww1SingleSprmPDyaAbs("sprmPDyaAbs"); //  27 pap.dyaAbs
    aTab[i++] = new Ww1SingleSprmPDxaWidth("sprmPDxaWidth"); //  28 pap.dxaWidth
    aTab[i++] = new Ww1SingleSprmPpc("sprmPPc"); //  29 pap.pcHorz, pap.pcVert
    aTab[i++] = new Ww1SingleSprmPBrc10(BRC_TOP, "sprmPBrcTop10"); //  30 pap.brcTop BRC10
    aTab[i++] = new Ww1SingleSprmPBrc10(BRC_LEFT, "sprmPBrcLeft10"); //  31 pap.brcLeft BRC10
    aTab[i++] = new Ww1SingleSprmPBrc10(BRC_BOTTOM, "sprmPBrcBottom10"); //  32 pap.brcBottom BRC10
    aTab[i++] = new Ww1SingleSprmPBrc10(BRC_RIGHT, "sprmPBrcRight10"); //  33 pap.brcRight BRC10
    aTab[i++] = new Ww1SingleSprmWord("sprmPBrcBetween10"); //  34 pap.brcBetween BRC10
    aTab[i++] = new Ww1SingleSprmPBrc10(BRC_LEFT, "sprmPBrcBar10"); //  35 pap.brcBar BRC10
    aTab[i++] = new Ww1SingleSprmPFromText("sprmPFromText10"); //  36 pap.dxaFromText dxa
    aTab[i++] = new Ww1SingleSprmByte("sprmPWr"); //  37 pap.wr wr
    aTab[i++] = new Ww1SingleSprmWord("sprmPBrcTop"); //  38 pap.brcTop BRC
    aTab[i++] = new Ww1SingleSprmWord("sprmPBrcLeft"); //  39 pap.brcLeft BRC
    aTab[i++] = new Ww1SingleSprmWord("sprmPBrcBottom"); //  40 pap.brcBottom BRC
    aTab[i++] = new Ww1SingleSprmWord("sprmPBrcRight"); //  41 pap.brcRight BRC
    aTab[i++] = new Ww1SingleSprmWord("sprmPBrcBetween"); //  42 pap.brcBetween BRC
    aTab[i++] = new Ww1SingleSprmWord("sprmPBrcBar"); //  43 pap.brcBar BRC word
    aTab[i++] = new Ww1SingleSprmBool("sprmPFNoAutoHyph"); //  44 pap.fNoAutoHyph
    aTab[i++] = new Ww1SingleSprmWord("sprmPWHeightAbs"); //  45 pap.wHeightAbs w
    aTab[i++] = new Ww1SingleSprmWord("sprmPDcs"); //  46 pap.dcs DCS
    aTab[i++] = new Ww1SingleSprmWord("sprmPShd"); //  47 pap.shd SHD
    aTab[i++] = new Ww1SingleSprmWord("sprmPDyaFromText"); //  48 pap.dyaFromText dya
    aTab[i++] = new Ww1SingleSprmWord("sprmPDxaFromText"); //  49 pap.dxaFromText dxa
    aTab[i++] = new Ww1SingleSprmBool("sprmPFLocked"); //  50 pap.fLocked 0 or 1 byte
    aTab[i++] = new Ww1SingleSprmBool("sprmPFWidowControl"); //  51 pap.fWidowControl 0 or 1 byte
    aTab[i++] = new Ww1SingleSprm(0, "?"); //  52 sprmPRuler ?
    aTab[i++] = new Ww1SingleSprm(0, "?"); //  53
    aTab[i++] = new Ww1SingleSprm(0, "?"); //  54
    aTab[i++] = new Ww1SingleSprm(0, "?"); //  55
    aTab[i++] = new Ww1SingleSprm(0, "?"); //  56
    aTab[i++] = new Ww1SingleSprmByteSized(0, "sprmCDefault"); //  57 whole CHP (see below) none variable length
    aTab[i++] = new Ww1SingleSprm(0, "sprmCPlain"); //  58 whole CHP (see below) none 0
    aTab[i++] = new Ww1SingleSprm(0, "?"); //  59
    aTab[i++] = new Ww1SingleSprm4State("sprmCFBold"); //  60 chp.fBold 0,1, 128, or 129 (see below) byte
    aTab[i++] = new Ww1SingleSprm4State("sprmCFItalic"); //  61 chp.fItalic 0,1, 128, or 129 (see below) byte
    aTab[i++] = new Ww1SingleSprm4State("sprmCFStrike"); //  62 chp.fStrike 0,1, 128, or 129 (see below) byte
    aTab[i++] = new Ww1SingleSprm4State("sprmCFOutline"); //  63 chp.fOutline 0,1, 128, or 129 (see below) byte
    aTab[i++] = new Ww1SingleSprm4State("sprmCFShadow"); //  64 chp.fShadow 0,1, 128, or 129 (see below) byte
    aTab[i++] = new Ww1SingleSprm4State("sprmCFSmallCaps"); //  65 chp.fSmallCaps 0,1, 128, or 129 (see below) byte
    aTab[i++] = new Ww1SingleSprm4State("sprmCFCaps"); //  66 chp.fCaps 0,1, 128, or 129 (see below) byte
    aTab[i++] = new Ww1SingleSprm4State("sprmCFVanish"); //  67 chp.fVanish 0,1, 128, or 129 (see below) byte
    aTab[i++] = new Ww1SingleSprmWord("sprmCFtc"); //  68 chp.ftc ftc word
    aTab[i++] = new Ww1SingleSprmByte("sprmCKul"); //  69 chp.kul kul byte
    aTab[i++] = new Ww1SingleSprm(3, "sprmCSizePos"); //  70 chp.hps, chp.hpsPos (see below) 3 bytes
    aTab[i++] = new Ww1SingleSprmWord("sprmCDxaSpace"); //  71 chp.dxaSpace dxa word
    aTab[i++] = new Ww1SingleSprmWord("//"); //  72 //
    aTab[i++] = new Ww1SingleSprmByte("sprmCIco"); //  73 chp.ico ico byte
    aTab[i++] = new Ww1SingleSprmByte("sprmCHps"); //  74 chp.hps hps !byte!
    aTab[i++] = new Ww1SingleSprmByte("sprmCHpsInc"); //  75 chp.hps (see below) byte
    aTab[i++] = new Ww1SingleSprmWord("sprmCHpsPos"); //  76 chp.hpsPos hps !word!
    aTab[i++] = new Ww1SingleSprmByte("sprmCHpsPosAdj"); //  77 chp.hpsPos hps (see below) byte
    aTab[i++] = new Ww1SingleSprmByteSized(0, "?"); //  78 ?chp.fBold, chp.fItalic, chp.fSmallCaps, ...
    aTab[i++] = new Ww1SingleSprm(0, "?"); //  79
    aTab[i++] = new Ww1SingleSprm(0, "?"); //  80
    aTab[i++] = new Ww1SingleSprm(0, "?"); //  81
    aTab[i++] = new Ww1SingleSprm(0, "?"); //  82
    aTab[i++] = new Ww1SingleSprm(0, "?"); //  83
    aTab[i++] = new Ww1SingleSprm(0, "?"); //  84
    aTab[i++] = new Ww1SingleSprm(0, "?"); //  85
    aTab[i++] = new Ww1SingleSprm(0, "?"); //  86
    aTab[i++] = new Ww1SingleSprm(0, "?"); //  87
    aTab[i++] = new Ww1SingleSprm(0, "?"); //  88
    aTab[i++] = new Ww1SingleSprm(0, "?"); //  89
    aTab[i++] = new Ww1SingleSprm(0, "?"); //  90
    aTab[i++] = new Ww1SingleSprm(0, "?"); //  91
    aTab[i++] = new Ww1SingleSprm(0, "?"); //  92
    aTab[i++] = new Ww1SingleSprm(0, "?"); //  93
    aTab[i++] = new Ww1SingleSprmByte("sprmPicBrcl"); //  94 pic.brcl brcl (see PIC structure definition) byte
    aTab[i++] = new Ww1SingleSprmByteSized(0, "sprmPicScale"); //  95 pic.mx, pic.my, pic.dxaCropleft,
    aTab[i++] = new Ww1SingleSprm(0, "?"); //  96
    aTab[i++] = new Ww1SingleSprm(0, "?"); //  97
    aTab[i++] = new Ww1SingleSprm(0, "?"); //  99
    aTab[i++] = new Ww1SingleSprm(0, "?"); //  99
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 100
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 101
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 102
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 103
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 104
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 105
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 106
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 107
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 108
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 109
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 110
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 111
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 112
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 113
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 114
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 115
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 116
    aTab[i++] = new Ww1SingleSprmByte("sprmSBkc"); // 117 sep.bkc bkc byte
    aTab[i++] = new Ww1SingleSprmBool("sprmSFTitlePage"); // 118 sep.fTitlePage 0 or 1 byte
    aTab[i++] = new Ww1SingleSprmSColumns("sprmSCcolumns"); // 119 sep.ccolM1 # of cols - 1 word
    aTab[i++] = new Ww1SingleSprmWord("sprmSDxaColumns"); // 120 sep.dxaColumns dxa word
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 121 sep.fAutoPgn obsolete byte
    aTab[i++] = new Ww1SingleSprmByte("sprmSNfcPgn"); // 122 sep.nfcPgn nfc byte
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 123 sep.dyaPgn dya short
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 124 sep.dxaPgn dya short
    aTab[i++] = new Ww1SingleSprmBool("sprmSFPgnRestart"); // 125 sep.fPgnRestart 0 or 1 byte
    aTab[i++] = new Ww1SingleSprmBool("sprmSFEndnote"); // 126 sep.fEndnote 0 or 1 byte
    aTab[i++] = new Ww1SingleSprmByte("sprmSLnc"); // 127 sep.lnc lnc byte
    aTab[i++] = new Ww1SingleSprmSGprfIhdt("sprmSGprfIhdt"); // 128 sep.grpfIhdt grpfihdt (see Headers and Footers topic) byte
    aTab[i++] = new Ww1SingleSprmWord("sprmSNLnnMod"); // 129 sep.nLnnMod non-neg int. word
    aTab[i++] = new Ww1SingleSprmWord("sprmSDxaLnn"); // 130 sep.dxaLnn dxa word
    aTab[i++] = new Ww1SingleSprmWord("sprmSDyaHdrTop"); // 131 sep.dyaHdrTop dya word
    aTab[i++] = new Ww1SingleSprmWord("sprmSDyaHdrBottom"); // 132 sep.dyaHdrBottom dya word
    aTab[i++] = new Ww1SingleSprmBool("sprmSLBetween"); // 133 sep.fLBetween 0 or 1 byte
    aTab[i++] = new Ww1SingleSprmByte("sprmSVjc"); // 134 sep.vjc vjc byte
    aTab[i++] = new Ww1SingleSprmWord("sprmSLnnMin"); // 135 sep.lnnMin lnn word
    aTab[i++] = new Ww1SingleSprmWord("sprmSPgnStart"); // 136 sep.pgnStart pgn word
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 137
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 138
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 139
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 140
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 141
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 142
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 143
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 144
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 145
    aTab[i++] = new Ww1SingleSprmWord("sprmTJc"); // 146 tap.jc jc word (low order byte is significant)
    aTab[i++] = new Ww1SingleSprmWord("sprmTDxaLeft"); // 147 tap.rgdxaCenter (see below) dxa word
    aTab[i++] = new Ww1SingleSprmWord("sprmTDxaGapHalf"); // 148 tap.dxaGapHalf, tap.rgdxaCenter (see below) dxa word
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 149 ???tap.fCantSplit 1 or 0 byte
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 150 ???tap.fTableHeader 1 or 0 byte
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 151 ???tap.rgbrcTable complex(see below) 12 bytes
    aTab[i++] = new Ww1SingleSprmTDefTable10("sprmTDefTable10"); // 152 tap.rgdxaCenter, tap.rgtc complex (see below) variable length
    aTab[i++] = new Ww1SingleSprmWord("sprmTDyaRowHeight"); // 153 tap.dyaRowHeight dya word
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 154 ???tap.rgtc complex (see below)
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 155 ???tap.rgshd complex (see below)
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 156 ???tap.tlp TLP 4 bytes
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 157 ???tap.rgtc[].rgbrc complex (see below) 5 bytes
    aTab[i++] = new Ww1SingleSprm(4, "sprmTInsert"); // 158 tap.rgdxaCenter,tap.rgtc complex (see below) 4 bytes
    aTab[i++] = new Ww1SingleSprmWord("sprmTDelete"); // 159 tap.rgdxaCenter, tap.rgtc complex (see below) word
    aTab[i++] = new Ww1SingleSprm(4, "sprmTDxaCol"); // 160 tap.rgdxaCenter complex (see below) 4 bytes
    aTab[i++] = new Ww1SingleSprmWord("sprmTMerge"); // 161 tap.fFirstMerged, tap.fMerged complex (see below) word
    aTab[i++] = new Ww1SingleSprmWord("sprmTSplit"); // 162 tap.fFirstMerged, tap.fMerged complex (see below) word
    aTab[i++] = new Ww1SingleSprm(5, "sprmTSetBrc10"); // 163 tap.rgtc[].rgbrc complex (see below) 5 bytes
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 164
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 165
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 166
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 167
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 168
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 169
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 170
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 171
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 172
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 173
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 174
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 175
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 176
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 177
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 178
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 179
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 180
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 181
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 182
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 183
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 184
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 185
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 186
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 187
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 188
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 189
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 190
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 191
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 192
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 193
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 194
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 195
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 196
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 197
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 198
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 199
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 200
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 201
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 202
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 203
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 204
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 205
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 206
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 207
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 208
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 209
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 210
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 211
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 212
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 213
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 214
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 215
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 216
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 217
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 218
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 219
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 220
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 221
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 222
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 223
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 224
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 225
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 226
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 227
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 228
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 229
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 230
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 231
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 232
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 233
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 234
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 235
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 236
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 237
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 238
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 239
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 240
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 241
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 242
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 243
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 244
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 245
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 246
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 247
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 248
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 249
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 250
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 251
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 252
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 253
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 254
    aTab[i++] = new Ww1SingleSprm(0, "?"); // 255
    if (aTab[i-1] == NULL)
        DeinitTab(); //~ mdt: low mem und nu?
    DBG_ASSERT(i==sizeof(aTab)/sizeof(*aTab), "Ww1Sprm");
}

////////////////////////////////////////////////////////////// SprmPapx
Ww1SprmPapx::Ww1SprmPapx(BYTE* p, USHORT nSize) :
    Ww1Sprm(Sprm(p, nSize), SprmSize(p, nSize))
{
    memset(&aPapx, 0, sizeof(aPapx));
    memcpy(&aPapx, p, nSize<sizeof(aPapx)?nSize:sizeof(aPapx));
}

USHORT Ww1SprmPapx::SprmSize(BYTE*, USHORT nSize)
{
    USHORT nRet = 0;
    if (nSize >= sizeof(W1_PAPX))
        nRet = nSize - ( sizeof(W1_PAPX) - 1 ); // im W1_PAPX ist das
                                                // 1. SprmByte enthalten
    return nRet;
}

BYTE* Ww1SprmPapx::Sprm(BYTE* p, USHORT nSize)
{
    BYTE* pRet = NULL;
    if (nSize >= sizeof(W1_PAPX))
        pRet = ((W1_PAPX*)(p))->grpprlGet();
    return pRet;
}

/////////////////////////////////////////////////////////////////// Plc
Ww1Plc::Ww1Plc(Ww1Fib& rFib, ULONG ulFilePos, USHORT nCountBytes, USHORT nItemSize) :
    p(NULL),
    nCountBytes(nCountBytes),
    iMac(0),
    bOK(FALSE),
    nItemSize(nItemSize),
    rFib(rFib)
{
    if (!nCountBytes)
        bOK = TRUE;
    else
        if (rFib.GetStream().Seek(ulFilePos) == (ULONG)ulFilePos)
            if ((p = new BYTE[nCountBytes]) != NULL)
                if (rFib.GetStream().Read(p, nCountBytes) == (ULONG)nCountBytes)
                {
                    bOK = TRUE;
                    iMac = (nCountBytes - sizeof(SVBT32)) / (sizeof(SVBT32) + nItemSize);
                    DBG_ASSERT(iMac * ((USHORT)sizeof(ULONG) + nItemSize) +
                     (USHORT)sizeof(SVBT32) == nCountBytes, "Ww1Plc");
                }
}

Ww1Plc::~Ww1Plc()
{
    delete p;
}

void Ww1Plc::Seek(ULONG ulSeek, USHORT& nIndex)
{
    if (iMac)
        for (;nIndex <= iMac && Where(nIndex) < ulSeek;nIndex++)
            ;
}

ULONG Ww1Plc::Where(USHORT nIndex)
{
    ULONG ulRet = 0xffffffff;
    DBG_ASSERT(nIndex <= iMac, "index out of bounds");
    if (iMac && nIndex <= iMac)
        ulRet = SVBT32ToLong(p + sizeof(SVBT32) * nIndex);
    return ulRet;
}

BYTE* Ww1Plc::GetData(USHORT nIndex)
{
    BYTE* pRet = NULL;
    DBG_ASSERT(nIndex < iMac, "index out of bounds");
    if (nIndex < iMac)
        pRet = p + (iMac + 1) * sizeof(SVBT32) +
         nIndex * nItemSize; // Pointer auf Inhalts-Array
    return pRet;
}

/////////////////////////////////////////////////////////////////// Sep

//////////////////////////////////////////////////////////////// PlcSep

//////////////////////////////////////////////////////////////// PlcPap

//////////////////////////////////////////////////////////////// PlcChp

//////////////////////////////////////////////////////////////// PlcFnr

///////////////////////////////////////////////////////////// PlcFnText

///////////////////////////////////////////////////////////// PlcFields

///////////////////////////////////////////////////////////// PlcBookmarks
// class Ww1StringList liest im Ctor eine Anzahl von P-Strings aus dem Stream
// in den Speicher und patcht sie zu C-Strings um.
// Die Anzahl wird in nMax zurueckgeliefert.
// im Index 0 stehen alle Strings nacheinander, ab Index 1 werden
// die einzelnen Strings referenziert.
Ww1StringList::Ww1StringList( SvStream& rSt, ULONG nFc, USHORT nCb )
    : pIdxA(0), nMax(0)
{
    if( nCb > 2 )            // ueberhaupt Eintraege ?
    {
        SVBT16 nCountBytes;
        DBG_ASSERT(nCb > sizeof(nCountBytes), "Ww1StringList");
        if (rSt.Seek(nFc) == (ULONG)nFc)
            if (rSt.Read(nCountBytes, sizeof(nCountBytes))
                     == sizeof(nCountBytes)) // Laenge steht hier nochmal
            {
                DBG_ASSERT(SVBT16ToShort(nCountBytes)
                         == nCb, "redundant-size missmatch");
                                    // hoffentlich sind sie immer gleich
                sal_Char* pA = new sal_Char[nCb - sizeof(nCountBytes) + 1];
                                    // Alloziere PString-Array
                //~ Ww1: new-NULL
                if (rSt.Read(pA, nCb - sizeof(nCountBytes))
                        == (ULONG)nCb - sizeof(nCountBytes))    // lese alle
                {}// do nothing
                                    // Zaehle, wieviele Fonts enthalten
                long nLeft = nCb - sizeof(nCountBytes);
                sal_Char* p = pA;
                while (1)
                {
                    USHORT nNextSiz;
                    nNextSiz = *p + 1;
                    if(nNextSiz > nLeft)
                        break;
                    nMax++;
                    nLeft -= nNextSiz;
                    if(nLeft < 1)           // naechste Laenge muss gelesen werden koennen
                        break;
                    p = p + nNextSiz;
                }
                if (nMax)
                {
                    pIdxA = new sal_Char*[nMax+1];      // alloziere Index-Array
                    pIdxA[0] = pA;                      // Index 0 : alles
                                                        // ab Index 1 C-Strings
                    pIdxA[1] = pA + 1;                  // fuelle Index-Array
                    USHORT i = 2;
                    p = pA;
                    BYTE nL = *p;
                    while(1)
                    {
                        p += nL + 1;                    // Neues Laengen-Byte
                        nL = *p;                        // merke Laenge
                        *p = '\0';                      // mach C-String draus
                        if( i > nMax )
                            break;
                        pIdxA[i] = p + 1;               // Ptr auf C-String
                        i++;
                    }
                }
                else
                    pIdxA = 0;  // Keine Eintraege -> kein Array
            }
    }
}
const String Ww1StringList::GetStr( USHORT nNum ) const
{
    String sRet;
    if( nNum <= nMax )
        sRet = String( pIdxA[ nNum+1 ], RTL_TEXTENCODING_MS_1252 );
    return sRet;
}

Ww1Bookmarks::Ww1Bookmarks(Ww1Fib& rFib)
    : rFib(rFib), aNames(rFib), nIsEnd(0)
{
    pPos[0] = new Ww1PlcBookmarkPos(rFib, rFib.GetFIB().fcPlcfbkfGet(),
                                    rFib.GetFIB().cbPlcfbkfGet(), FALSE);
    nPlcIdx[0] = 0;
    pPos[1] = new Ww1PlcBookmarkPos(rFib, rFib.GetFIB().fcPlcfbklGet(),
                                    rFib.GetFIB().cbPlcfbklGet(), TRUE);
    nPlcIdx[1] = 0;
    bOK = !aNames.GetError() && !pPos[0]->GetError() && !pPos[1]->GetError();
}


// Der Operator ++ hat eine Tuecke: Wenn 2 Bookmarks aneinandergrenzen, dann
// sollte erst das Ende des ersten und dann der Anfang des 2. erreicht werden.
// Liegen jedoch 2 Bookmarks der Laenge 0 aufeinander, *muss* von jedem Bookmark
// erst der Anfang und dann das Ende gefunden werden.
// Der Fall: ][
//            [...]
//           ][
// ist noch nicht geloest, dabei muesste ich in den Anfangs- und Endindices
// vor- und zurueckspringen, wobei ein weiterer Index oder ein Bitfeld
// oder etwas aehnliches zum Merken der bereits abgearbeiteten Bookmarks
// noetig wird.
void Ww1Bookmarks::operator ++( int )
{
    if( bOK )
    {
        nPlcIdx[nIsEnd]++;

        register ULONG l0 = pPos[0]->Where(nPlcIdx[0]);
        register ULONG l1 = pPos[1]->Where(nPlcIdx[1]);
        if( l0 < l1 )
            nIsEnd = 0;
        else if( l1 < l0 )
            nIsEnd = 1;
        else
            nIsEnd = ( nIsEnd ) ? 0 : 1;
    }
}

long Ww1Bookmarks::GetHandle() const
{
    if( bOK )
    {
        if( nIsEnd )
            return nPlcIdx[1];

        const BYTE* p = pPos[0]->GetData( nPlcIdx[0] );
        if( p )
            return SVBT16ToShort( p );
    }
    return LONG_MAX;
}

long Ww1Bookmarks::Len() const
{
    if( nIsEnd )
    {
        DBG_ASSERT( FALSE, "Falscher Aufruf (1) von Ww1Bookmarks::Len()" );
        return 0;
    }
    USHORT nEndIdx = SVBT16ToShort(pPos[0]->GetData(nPlcIdx[0]));
    return pPos[1]->Where(nEndIdx) - pPos[0]->Where(nPlcIdx[0]);
}

const String Ww1Bookmarks::GetName() const
{
    if( nIsEnd )
        return String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "???" ));
    return aNames.GetStr( nPlcIdx[0] );
}

/////////////////////////////////////////////////////////////////// Fkp
Ww1Fkp::Ww1Fkp(SvStream& rStream, ULONG ulFilePos, USHORT nItemSize) :
    nItemSize(nItemSize),
    bOK(FALSE)
{
    if (rStream.Seek(ulFilePos) == (ULONG)ulFilePos)
        if (rStream.Read(aFkp, sizeof(aFkp)) == sizeof(aFkp))
            bOK = TRUE;
}

ULONG Ww1Fkp::Where(USHORT nIndex)
{
    ULONG lRet = 0xffffffff;
    DBG_ASSERT(nIndex<=Count(), "index out of bounds");
    if (nIndex<=Count())
        lRet = SVBT32ToLong(aFkp+nIndex*sizeof(SVBT32));
    return lRet;
}

BYTE* Ww1Fkp::GetData(USHORT nIndex)
{
    BYTE* pRet = NULL;
    DBG_ASSERT(nIndex<=Count(), "index out of bounds");
    if (nIndex<=Count())
        pRet = aFkp + (Count()+1) * sizeof(SVBT32) +
         nIndex * nItemSize; // beginn der strukturen
    return pRet;
}

//////////////////////////////////////////////////////////////// FkpPap
BOOL Ww1FkpPap::Fill(USHORT nIndex, BYTE*& p, USHORT& rnCountBytes)
{
    DBG_ASSERT( nIndex < Count(), "Ww1FkpPap::Fill() Index out of Range" );
    USHORT nOffset = SVBT8ToByte(GetData(nIndex)) * 2;
    if (nOffset)
    {
        DBG_ASSERT(nOffset>(USHORT)(Count()*sizeof(SVBT32)), "calc error");
//      rnCountBytes = SVBT8ToByte(aFkp+nOffset) * 2 + 1;  // SH: +1 ?????
        rnCountBytes = SVBT8ToByte(aFkp+nOffset) * 2;
        nOffset += sizeof(SVBT8);
        if( nOffset + rnCountBytes < 511 )  // SH: Assert schlug 1 zu frueh zu
            rnCountBytes++;                 // SH: Ich weiss nicht genau,
                                            // ob das letzte Byte des PAPX
                                            // genutzt wird, aber so vergessen
                                            // wir keins und sind trotzdem
                                            // auf der sicheren Seite
        DBG_ASSERT(nOffset+rnCountBytes <= 511, "calc error");
        p = aFkp + nOffset;
    }
    else
    {
        p = NULL;
        rnCountBytes = 0;
    }
    return TRUE;
}

BOOL Ww1FkpPap::Fill(
    USHORT nIndex, BYTE*& p, USHORT& rnCountBytes, ULONG& rulStart, ULONG& rulEnd)
{
    rulStart = Where(nIndex);
    rulEnd = Where(nIndex+1);
    Fill(nIndex, p, rnCountBytes);
    return TRUE;
}

//////////////////////////////////////////////////////////////// FkpChp
BOOL Ww1FkpChp::Fill(USHORT nIndex, W1_CHP& aChp)
{
    DBG_ASSERT( nIndex < Count(), "Ww1FkpChp::Fill() Index out of Range" );
    memset(&aChp, 0, sizeof(aChp)); // Default, da verkuerzt gespeichert
    USHORT nOffset = GetData(nIndex)[0] * 2;
    if (nOffset)
    {
        DBG_ASSERT(nOffset>(USHORT)(Count()*sizeof(SVBT32)), "calc error");
        USHORT nCountBytes = aFkp[nOffset];
        nOffset += sizeof(SVBT8);
        DBG_ASSERT(nCountBytes <= 511-nOffset, "calc error");
        DBG_ASSERT(nCountBytes <= sizeof(aChp), "calc error");
        memcpy(&aChp, aFkp+nOffset, nCountBytes);
    }
    return TRUE;
}

BOOL Ww1FkpChp::Fill(USHORT nIndex, W1_CHP& aChp, ULONG& rulStart, ULONG& rulEnd)
{
    DBG_ASSERT( nIndex < Count(), "Ww1FkpChp::Fill() Index out of Range" );
    rulStart = Where(nIndex);
    rulEnd = Where(nIndex+1);
    memset(&aChp, 0, sizeof(aChp)); // Default, da verkuerzt gespeichert
    USHORT nOffset = GetData(nIndex)[0] * 2;
    if (nOffset)
    {
        DBG_ASSERT(nOffset>(USHORT)(Count()*sizeof(SVBT32)), "calc error");
        USHORT nCountBytes = aFkp[nOffset];
        nOffset += sizeof(SVBT8);
        DBG_ASSERT(nCountBytes <= 511-nOffset, "calc error");
        DBG_ASSERT(nCountBytes <= sizeof(aChp), "calc error");
        memcpy(&aChp, aFkp+nOffset, nCountBytes);
    }
    return TRUE;
}

///////////////////////////////////////////////////////////////// Assoc
Ww1Assoc::Ww1Assoc(Ww1Fib& rFib)
    : rFib(rFib), pBuffer(NULL), bOK(FALSE)
{
    USHORT cb = rFib.GetFIB().cbSttbfAssocGet();
    for (USHORT i=0;i<MaxFields;i++)
        pStrTbl[i] = NULL;
    if ((pBuffer = new sal_Char[cb]) != NULL
     && rFib.GetStream().Seek(rFib.GetFIB().fcSttbfAssocGet()) ==
        rFib.GetFIB().fcSttbfAssocGet()
     && rFib.GetStream().Read(pBuffer, cb) == cb)
    {
        USHORT j;
        DBG_ASSERT( cb == SVBT16ToShort( *(SVBT16*)pBuffer ), "size missmatch");
        for (i=0,j=sizeof(SVBT16);j<cb && i<Criteria1;i++)
        {
            pStrTbl[i] = pBuffer+j;
            j += (*pBuffer + j) + 1;
        }
        bOK = TRUE;
    }
}

String Ww1Assoc::GetStr(USHORT code)
{
    String sRet;
    DBG_ASSERT(code<MaxFields, "out of range");
    if (pStrTbl[code] != NULL)
        for( USHORT i=0;i<pStrTbl[code][0];i++ )
            sRet += String( pStrTbl[code][i+1], RTL_TEXTENCODING_MS_1252 );
    return sRet;
}

/////////////////////////////////////////////////////////////////// Pap
Ww1Pap::Ww1Pap(Ww1Fib& rFib) :
    Ww1PlcPap(rFib),
    nPlcIndex(0),
    nFkpIndex(0),
    nPushedPlcIndex(0xffff),
    nPushedFkpIndex(0xffff),
    ulOffset(0),
    pPap(0)
{
}

void Ww1Pap::Seek(ULONG ulSeek)
{
    while (ulSeek > Where())
        (*this)++;
}

// SH: Where hat einen Parameter mitbekommen, der sagt, ob bei Neuanlegen eines
// Fkps der zugehoerige Index auf 0 gesetzt werden soll
// ( darf fuer Push/Pop nicht passieren )
// Ein eleganterer Weg faellt mir auf die Schnelle nicht ein
ULONG Ww1Pap::Where( BOOL bSetIndex )
{
    ULONG ulRet = 0xffffffff;
    if (pPap == NULL)
        if (nPlcIndex < Count())
        {
            pPap = new Ww1FkpPap(rFib.GetStream(),
                        SVBT16ToShort(GetData(nPlcIndex)) << 9);
            if( bSetIndex )
                nFkpIndex = 0;
        }
    if (pPap != NULL)
//      if (nFkpIndex < pPap->Count())
        if (nFkpIndex <= pPap->Count())
            ulRet = pPap->Where(nFkpIndex) - rFib.GetFIB().fcMinGet();
    return ulRet;
}

void Ww1Pap::operator++(int)
{
    if (pPap != NULL)
//      if (++nFkpIndex >= pPap->Count())
        if (++nFkpIndex > pPap->Count())
        {
            delete pPap;
            pPap = NULL;
            nPlcIndex++;
        }
}

// SH: FindSprm sucht in grpprl nach Sprm nId
// Rueckgabe: Pointer oder 0
BOOL Ww1Pap::FindSprm(USHORT nId, BYTE* pStart, BYTE* pEnd)
{
    Ww1Sprm aSprm( pStart, pEnd-pStart );
    USHORT nC = aSprm.Count();
    int i;
    BYTE nI;
    USHORT nLen;
    BYTE *pData;
    for( i = 0; i < nC; i++ ){
        aSprm.Fill( i, nI, nLen, pData );
        if( nI == nId )
            return TRUE;
    }
    return FALSE;
}

BOOL Ww1Pap::HasId0(USHORT nId)
{
    BOOL bRet = FALSE;
    UpdateIdx();

    if( !pPap ){
        DBG_ASSERT( FALSE, "Ww1Pap::HasId():: kann kein pPap erzeugen" );
        return FALSE;
    }

    BYTE* p;
    USHORT n;
    if( pPap->Fill(nFkpIndex, p, n) ){
        BYTE* p2 = ((W1_PAPX*)(p))->grpprlGet(); // SH: Offset fehlte
        bRet = FindSprm( nId, p2, p+n );
    }
    return bRet;
}

BOOL Ww1Pap::HasId(USHORT nId)
{
    BOOL bRet = FALSE;
    USHORT nPushedPlcIndex = nPlcIndex;
    USHORT nPushedFkpIndex = nFkpIndex;
    bRet = HasId0( nId );
    if (nPlcIndex != nPushedPlcIndex)
    {
        delete pPap;
        pPap = NULL;
    }
    nPlcIndex = nPushedPlcIndex;
    nFkpIndex = nPushedFkpIndex;
    Where( FALSE );
    return bRet;
}

BOOL Ww1Pap::NextHas(USHORT nId)
{
    BOOL bRet = FALSE;
    USHORT nPushedPlcIndex = nPlcIndex;
    USHORT nPushedFkpIndex = nFkpIndex;
    (*this)++;
    bRet = HasId0( nId );
    if (nPlcIndex != nPushedPlcIndex)
    {
        delete pPap;
        pPap = NULL;
    }
    nPlcIndex = nPushedPlcIndex;
    nFkpIndex = nPushedFkpIndex;
    Where( FALSE );
    return bRet;
}

/////////////////////////////////////////////////////////////////// Chp
Ww1Chp::Ww1Chp(Ww1Fib& rFib) :
    Ww1PlcChp(rFib),
    nPlcIndex(0),
    nFkpIndex(0),
    nPushedPlcIndex(0xffff),
    nPushedFkpIndex(0xffff),
    ulOffset(0),
    pChp(0)
{
}

void Ww1Chp::Seek(ULONG ulSeek)
{
    while (ulSeek > Where())
        (*this)++;
}

// SH: Where hat einen Parameter mitbekommen, der sagt, ob bei Neuanlegen eines
// Fkps der zugehoerige Index auf 0 gesetzt werden soll
// ( darf fuer Push/Pop nicht passieren )
// Ein eleganterer Weg faellt mir auf die Schnelle nicht ein
ULONG Ww1Chp::Where( BOOL bSetIndex )
{
    ULONG ulRet = 0xffffffff;
    if (pChp == NULL)
        if (nPlcIndex < Count())
        {
            pChp = new Ww1FkpChp(rFib.GetStream(),
                        SVBT16ToShort(GetData(nPlcIndex)) << 9);
            if( bSetIndex )
                nFkpIndex = 0;
        }
    if (pChp != NULL)
//      if (nFkpIndex < pChp->Count())
        if (nFkpIndex <= pChp->Count())
            ulRet = pChp->Where(nFkpIndex) -
                     rFib.GetFIB().fcMinGet() - ulOffset;
    return ulRet;
}

void Ww1Chp::operator++(int)
{
    if (pChp != NULL)
//      if (++nFkpIndex >= pChp->Count())
        if (++nFkpIndex > pChp->Count())
        {
            delete pChp;
            pChp = NULL;
            nPlcIndex++;
        }
}

////////////////////////////////////////////////////////////// Manager
Ww1Manager::Ww1Manager(SvStream& rStrm, ULONG nFieldFlgs) :
        bOK(FALSE),
        bInTtp(FALSE),
        bInStyle(FALSE),
        bStopAll(FALSE),
        aFib(rStrm),
        aDop(aFib),
        aFonts(aFib, nFieldFlgs),
        aSep(aFib, aDop.GetDOP().grpfIhdtGet()),
        aDoc(aFib),
        pDoc(&aDoc),
        ulDocSeek(0),
        pSeek(&ulDocSeek),
        aPap(aFib),
        aChp(aFib),
        aFld(aFib),
        pFld(&aFld),
        aFtn(aFib),
        aBooks(aFib)
{
    bOK = !aFib.GetError()
        && !aFib.GetFIB().fComplexGet()
        && !aDoc.GetError()
        && !aSep.GetError()
        && !aPap.GetError()
        && !aChp.GetError()
        && !aFld.GetError()
        && !aFtn.GetError()
        && !aBooks.GetError();
}

BOOL Ww1Manager::IsValidFib(const BYTE*p, USHORT size)
{
    return ((
        ((W1_FIB*)p)->wIdentGet() == 42396
         && ((W1_FIB*)p)->nFibGet() == 33 // ww1
#ifdef DEBUG
     || ((W1_FIB*)p)->wIdentGet() == 42459
         && ((W1_FIB*)p)->nFibGet() == 45 // ww2b
#endif
     )
//   && ((W1_FIB*)p)->nProductGet() == 8413
     && ((W1_FIB*)p)->fComplexGet() == 0);
}

BOOL Ww1Manager::HasInTable()
{
    return aPap.HasId(24); // Ww1SingleSprmPFInTable
}

BOOL Ww1Manager::HasTtp()
{
    return aPap.HasId(25); // Ww1SingleSprmPTtp
}

BOOL Ww1Manager::NextHasTtp()
{
    return aPap.NextHas(25); // Ww1SingleSprmPTtp
}

BOOL Ww1Manager::HasPPc()
{
    return aPap.HasId(29); // Ww1SingleSprmPPc
}

BOOL Ww1Manager::HasPDxaAbs()
{
    return aPap.HasId(26); // Ww1SingleSprmPDxaAbs
}

/**********************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ww1/w1class.cxx,v 1.1.1.1 2000-09-18 17:14:57 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.19  2000/09/18 16:04:56  willem.vandorp
      OpenOffice header added.

      Revision 1.18  2000/05/11 16:06:45  jp
      Changes for Unicode

      Revision 1.17  1998/02/19 16:00:42  HJS
      fuer sh eingechecked


      Rev 1.16   19 Feb 1998 17:00:42   HJS
   fuer sh eingechecked

      Rev 1.15   29 Nov 1997 17:37:08   MA
   includes

      Rev 1.14   09 Oct 1997 14:13:46   JP
   Aenderungen von SH

      Rev 1.13   03 Sep 1997 14:15:58   SH
   Flys, Tabellen ok, Style-Abhaengigkeiten u.v.a.m

      Rev 1.12   11 Aug 1997 12:49:08   SH
   Flys und einfache Tabellen und Tabulatoren

      Rev 1.11   18 Jul 1997 09:31:38   MA
   Stand von SH, #41738# GPF und Tabellen etwas besser

      Rev 1.9   16 Jun 1997 13:08:56   MA
   Stand Micheal Dietrich

      Rev 1.7   12 Mar 1997 19:11:52   SH
   MDT: Progressbar, Pagedesc-Bug, Spalten, Anfang Tabellen u.a.

      Rev 1.6   10 Jan 1997 18:42:40   SH
   Stabiler und mehr von MDT

      Rev 1.5   28 Nov 1996 18:08:28   SH
   Schneller Schoener Weiter von MDT

      Rev 1.4   05 Nov 1996 12:47:28   mda
   kein io.h unter Unix includen

      Rev 1.3   14 Oct 1996 13:07:12   KH
   explizite Feldlaenge wg. compiler bug

      Rev 1.2   30 Sep 1996 23:27:52   SH
   neu von MDA

      Rev 1.1   11 Sep 1996 11:23:40   TRI
   WIN16 brauchte Cast

      Rev 1.0   10 Sep 1996 02:10:06   SH
   Initial revision.


**********************************************************************/
//]})
diff --git a/sw/source/filter/ww1/w1class.hxx b/sw/source/filter/ww1/w1class.hxx
new file mode 100644
index 0000000..d4ac0cf
--- /dev/null
+++ b/sw/source/filter/ww1/w1class.hxx
@@ -0,0 +1,1753 @@
/*************************************************************************
 *
 *  $RCSfile: w1class.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:57 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _STRING_HXX
#include <tools/string.hxx>
#endif
#ifndef _TOOLS_DEBUG_HXX
#include <tools/debug.hxx>
#endif

// local
#ifndef _W1STRUCT_HXX
#include <w1struct.hxx>
#endif

#ifdef DUMP
#include <fstream.h>
#endif

class ostream;
class SvxFontItem;
class SvxBorderLine;
class SvxBoxItem;
class SvStream;
class SfxPoolItem;
class SwField;
class Ww1Annotation;
class Ww1AtnText;
class Ww1Chp;
class Ww1DocText;
class Ww1Dop;
class Ww1Fib;
class Ww1Fkp;
class Ww1FkpChp;
class Ww1FkpPap;
class Ww1Fonts;
class Ww1Manager;
class Ww1McrText;
class Ww1Pap;
class Ww1PlainText;
class Ww1Plc;
class Ww1PlcAnnotationRef;
class Ww1PlcAnnotationTxt;
class Ww1PlcChp;
class Ww1PlcFields;
class Ww1PlcFieldFootnote;
class Ww1PlcFieldHeaderFooter;
class Ww1PlcFieldMacro;
class Ww1PlcFieldText;
class Ww1PlcFootnoteRef;
class Ww1PlcFootnoteTxt;
class Ww1PlcGlossary;
class Ww1PlcHdd;
class Ww1PlcPap;
class Ww1PlcSep;
class Ww1Shell;
class Ww1Sprm;
class Ww1SprmPapx;
class Ww1SprmSep;
class Ww1Style;
class Ww1StyleSheet;

///////////////////////////////////////////////////////////////////////
//
// nach moeglichkeit wurden in diesem modul methoden aehnlicher
// funktionalitaet gleich benannt. Die namen wurden wenn moeglich vom
// ww-filter uebernommen.
// Where() gibt die position eines elements. dies kann sowohl eine
// seek-position im stream als auch ein relativer offset sein, da dies
// bei word durcheinander geht.  die methoden sind durch kommentare
// gekennzeichnet, ob sie sich auf positionen in der datei oder
// innerhalb des textes beziehen. vorsicht: innerhalb des textes kann
// verschiedene texte in der datei bedeuten.
// Count() gibt die anzahl der elemente zurueck. vorsicht bei
// n/n-1-feldern (word speichert strukturen gern in doppel-arrays, in
// denen das erste n elemente, das zweite jedoch n-1 elemente
// enthaelt.
// Fill() fuellt uebergebene referenzen mit daten aus den
// word-strukturen.
// GetData() gibt zeiger auf den datenbereich zurueck
// GetError() gibt zurueck, ob fehler aufgetreten ist
// Start(), Stop(), Out(), op<< siehe modul w1filter
// Dump() siehe modul w1dump
//

/////////////////////////////////////////////////////////////////// Fib
//
// file information block: wurzel des uebels: steht am beginn der
// datei (seek(0)) und enthaelt alle positionen der strukturen der
// datei
//
class Ww1Fib
{
    W1_FIB aFib;
    BOOL bOK;
    SvStream& rStream;
public:
    Ww1Fib(SvStream&);
    friend ostream& operator <<(ostream&, Ww1Fib&);
    W1_FIB& GetFIB()        { return aFib; }
    BOOL GetError()         { return !bOK; }
    SvStream& GetStream()   { return rStream; }
};

/////////////////////////////////////////////////////////////////// Dop
//
// document property: eigenschaften des gesamten dokuments
//
class Ww1Dop
{
    W1_DOP aDop;
    Ww1Fib& rFib;
    BOOL bOK;
public:
    Ww1Dop(Ww1Fib&);
    BOOL GetError() {
        return !bOK; }
    W1_DOP& GetDOP() {
        return aDop; }
    friend ostream& operator <<(ostream&, Ww1Dop&);
    void Out(Ww1Shell&);
};

///////////////////////////////////////////////////////////// PlainText
//
// ww-dateien koennen mehrere textbloecke enthalten (main-text,
// fusznoten etc). PlainText vereinigt die gemeinsamkeiten
//
class Ww1PlainText
{
protected:
    Ww1Fib& rFib;
    ULONG ulFilePos;
    ULONG ulCountBytes;
    ULONG ulSeek;
    BOOL bOK;
public:
    Ww1PlainText( Ww1Fib& rFib, ULONG ulFilePos, ULONG ulCountBytes )
        : rFib( rFib ), ulCountBytes( ulCountBytes ),
        ulFilePos( ulFilePos ), ulSeek( 0 ), bOK(TRUE)
    {}

    // innerhalb des textes
    ULONG Where() const                 { return ulSeek; }
    void Seek( ULONG ulNew )
        {
            DBG_ASSERT(ulNew < ulCountBytes, "Ww1PlainText")
            if (ulNew < ulCountBytes)
                ulSeek = ulNew;
        }

    ULONG Count() const                 { return ulCountBytes; }
    void SetCount(ULONG ulNew)
        {
            ulNew += ulSeek;
            if (ulCountBytes > ulNew)
                ulCountBytes = ulNew;
        }
    void operator++(int)
    {
        DBG_ASSERT(ulSeek+1<ulCountBytes, "Ww1PlainText");
        ulSeek++;
    }
    BOOL GetError()                     { return !bOK; }
    sal_Unicode Out( Ww1Shell&, ULONG& );
    sal_Unicode Out( String&, ULONG=0xffffffff);
    sal_Unicode Out( sal_Unicode& );
    friend ostream& operator <<(ostream&, Ww1PlainText&);
    String& Fill( String&, ULONG=0, ULONG=0xffffffff );
    sal_Unicode operator []( ULONG );
    String GetText( ULONG ulOffset, ULONG nLen ) const;

    enum Consts { MinChar = 32 };
    static BOOL IsChar( sal_Unicode c )     { return c >= MinChar; }
};

/////////////////////////////////////////////////////////////// DocText
class Ww1DocText : public Ww1PlainText
{
public:
    Ww1DocText(Ww1Fib& rFib) :
        Ww1PlainText(rFib, rFib.GetFIB().fcMinGet(),
         rFib.GetFIB().ccpTextGet()) {
        }
};

/////////////////////////////////////////////////////////////// FtnText
class Ww1FtnText : public Ww1PlainText
{
public:
    ULONG Offset(Ww1Fib& rFib) {
        return rFib.GetFIB().ccpTextGet(); }
    Ww1FtnText(Ww1Fib& rFib) :
        Ww1PlainText(rFib, rFib.GetFIB().fcMinGet() +
         Offset(rFib), rFib.GetFIB().ccpFtnGet()) {
        }
};

/////////////////////////////////////////////////////////////// HddText
class Ww1HddText : public Ww1PlainText
{
public:
    ULONG Offset(Ww1Fib& rFib) {
        return rFib.GetFIB().ccpTextGet() + rFib.GetFIB().ccpFtnGet(); }
    Ww1HddText(Ww1Fib& rFib) :
        Ww1PlainText(rFib, rFib.GetFIB().fcMinGet() +
         Offset(rFib), rFib.GetFIB().ccpHddGet()) {
        }
};

/////////////////////////////////////////////////////////////// McrText
class Ww1McrText : public Ww1PlainText
{
public:
    ULONG Offset(Ww1Fib& rFib) {
        return rFib.GetFIB().ccpTextGet() + rFib.GetFIB().ccpFtnGet()
         + rFib.GetFIB().ccpHddGet(); }
    Ww1McrText(Ww1Fib& rFib) :
        Ww1PlainText(rFib, rFib.GetFIB().fcMinGet() +
         Offset(rFib), rFib.GetFIB().ccpMcrGet()) {
        }
};

/////////////////////////////////////////////////////////////// AtnText
class Ww1AtnText : public Ww1PlainText
{
public:
    ULONG Offset(Ww1Fib& rFib) {
        return rFib.GetFIB().ccpTextGet() + rFib.GetFIB().ccpFtnGet()
         + rFib.GetFIB().ccpHddGet() + rFib.GetFIB().ccpMcrGet(); }
    Ww1AtnText(Ww1Fib& rFib) :
        Ww1PlainText(rFib, rFib.GetFIB().fcMinGet() +
         Offset(rFib), rFib.GetFIB().ccpAtnGet()) {
        }
};

///////////////////////////////////////////////////////////////// Style
//
// ein einzelner style oder vorlage
//
class Ww1Style
{
    String aName;
    W1_CHP aChpx;
    Ww1SprmPapx* pPapx;
    Ww1StyleSheet* pParent;
    BYTE stcBase;
    BYTE stcNext;
    BOOL bUsed;
public:
    Ww1Style();
    ~Ww1Style();
    BOOL IsUsed() const                 { return bUsed; }
    void SetDefaults(BYTE);
    void SetParent(Ww1StyleSheet* newParent)    { pParent = newParent; }
    void SetName(const String& rName)   { bUsed = TRUE; aName = rName; }
    const String& GetName() const       { return aName; }
//  Ww1Style& GetNext();
    Ww1Style& GetBase();
    USHORT GetnBase() const             { return stcBase; }
    USHORT GetnNext() const             { return stcNext; }
    USHORT ReadName(BYTE*&, USHORT&, USHORT stc);
    USHORT ReadChpx(BYTE*&, USHORT&);
    USHORT ReadPapx(BYTE*&, USHORT&);
    USHORT ReadEstcp(BYTE*&, USHORT&);
    friend ostream& operator <<(ostream&, Ww1Style&);
    void Out(Ww1Shell&, Ww1Manager&);
};

//////////////////////////////////////////////////////////// StyleSheet
//
// die sammlung aller vorlagen (max. 256)
//
class Ww1StyleSheet
{
    Ww1Style aStyles[256];
    USHORT cstcStd; // count style code standard
    Ww1Fib& rFib;
    BOOL bOK;
    USHORT ReadNames(BYTE*&, USHORT&);
    USHORT ReadChpx(BYTE*&, USHORT&);
    USHORT ReadPapx(BYTE*&, USHORT&);
    USHORT ReadEstcp(BYTE*&, USHORT&);

    void OutDefaults(Ww1Shell& rOut, Ww1Manager& rMan, USHORT stc);
    void OutOne(Ww1Shell& rOut, Ww1Manager& rMan, USHORT stc);
    void OutOneWithBase(Ww1Shell& rOut, Ww1Manager& rMan, USHORT stc,
                        BYTE* pbStopRecur );
public:
    Ww1StyleSheet(Ww1Fib& rFib);
    Ww1Style& GetStyle(USHORT stc) {
        return aStyles[stc]; }
    USHORT Count() {
        return 256; }
    friend ostream& operator <<(ostream&, Ww1StyleSheet&);
    void Out(Ww1Shell&, Ww1Manager&);
    friend Ww1Style;
    BOOL GetError() {
        return !bOK; }
};

///////////////////////////////////////////////////////////////// Fonts
//
// ww kennt nur font-nummern beim formatieren. nebenher gibts ein
// array von fonts, damit man aus der nummer einen konkreten font
// machen kann.
//
class Ww1Fonts
{
protected:
    W1_FFN** pFontA; // Array of Pointers to Font Description
    Ww1Fib& rFib;
    ULONG nFieldFlags;
    USHORT nMax; // Array-Groesse
    BOOL bOK;
public:
    Ww1Fonts(Ww1Fib&, ULONG nFieldFlgs);
    ~Ww1Fonts() {
        if (pFontA)
            DELETEZ(pFontA[0]);
        DELETEZ(pFontA); }
    W1_FFN* GetFFN(USHORT nNum);
    USHORT Count() {
        return nMax; }
    friend ostream& operator <<(ostream&, Ww1Fonts&);
    BOOL GetError() {
        return !bOK; }
    SvxFontItem GetFont(USHORT);
};

//////////////////////////////////////////////////////////// SingleSprm
//
// diese klassen ersetzen die aSprmTab etc des ww6-filters. die
// funktionspointer sind hier virtuale methoden, fuer die typen (byte,
// word, var-sized etc) gibt es abgeleitete klassen. diese haben
// methoden zum bestimmen der groesze, dumpen und shell-ausgeben der
// Sprms.
// die klassen werden mit new (in InitTab()) erzeugt und nach ihrem
// code in die tabelle gestellt. zum aktivieren ruft man nun nur noch
// die entsprechende methode des objektes in der tabelle auf.
// wohlgemerkt: SingleSprms sind die _beschreibung_ und _funktion_ der
// Sprms, nicht deren inhalt. dieser musz uebergeben werden an die
// einzelnen methoden wie Size, Dump und Start/Stop.
//
class Ww1SingleSprm
{
public:
#ifdef DUMP
//
// allein die virtuellen methoden stehen in der vtab, also je nachdem,
// ob fuer dumper oder filter uebersetzt wird ausblenden: das spart
// platz. ausserdem stehen die methoden fuer dumper bzw filter in
// verschiedenen modulen, die im jeweils anderen projekt nicht
// uebersetzt werden. das diese dann beim linken nicht zur verfuegung
// stehen faellt dann auch nicht auf. Der Namensstring ist nur im
// Dumper noetig: weg damit im Filter.
//
    void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
    void Stop(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
    virtual ostream& Dump(ostream&, BYTE*, USHORT);
    const sal_Char* sName;
#else
    virtual void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
    virtual void Stop(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
    ostream& Dump(ostream&, BYTE*, USHORT);
#endif
    virtual USHORT Size(BYTE*);
    USHORT nCountBytes;

    Ww1SingleSprm(USHORT nCountBytes, const sal_Char* pName = 0 )
        : nCountBytes(nCountBytes)
#ifdef DUMP
        , sName( pName)
#endif
        {
        }
};

class Ww1SingleSprmByteSized : public Ww1SingleSprm {
public:
//  ostream& Dump(ostream&, BYTE*, USHORT);
    USHORT Size(BYTE*);
    Ww1SingleSprmByteSized(USHORT nCountBytes, sal_Char* sName = 0) :
        Ww1SingleSprm(nCountBytes, sName) {
        }
};

class Ww1SingleSprmWordSized : public Ww1SingleSprm {
public:
//  ostream& Dump(ostream&, BYTE*, USHORT);
    USHORT Size(BYTE*);
    Ww1SingleSprmWordSized(USHORT nCountBytes, sal_Char* sName = 0) :
        Ww1SingleSprm(nCountBytes, sName) {
        }
};

class Ww1SingleSprmByte : public Ww1SingleSprm {
public:
    ostream& Dump(ostream&, BYTE*, USHORT);
//  USHORT Size(BYTE*);
    Ww1SingleSprmByte(sal_Char* sName = 0) :
        Ww1SingleSprm(1, sName) {
        }
};

class Ww1SingleSprmBool : public Ww1SingleSprmByte {
public:
    ostream& Dump(ostream&, BYTE*, USHORT);
//  USHORT Size(BYTE*);
    Ww1SingleSprmBool(sal_Char* sName = 0) :
        Ww1SingleSprmByte(sName) {
        }
};

class Ww1SingleSprm4State : public Ww1SingleSprmByte {
public:
    ostream& Dump(ostream&, BYTE*, USHORT);
//  USHORT Size(BYTE*);
    Ww1SingleSprm4State(sal_Char* sName = 0) :
        Ww1SingleSprmByte(sName) {
        }
};

class Ww1SingleSprmWord : public Ww1SingleSprm {
public:
    ostream& Dump(ostream&, BYTE*, USHORT);
//  USHORT Size(BYTE*);
    Ww1SingleSprmWord(sal_Char* sName = 0) :
        Ww1SingleSprm(2, sName) {
        }
};

class Ww1SingleSprmLong : public Ww1SingleSprm {
public:
    ostream& Dump(ostream&, BYTE*, USHORT);
//  USHORT Size(BYTE*);
    Ww1SingleSprmLong(sal_Char* sName = 0) :
        Ww1SingleSprm(4, sName) {
        }
};

class Ww1SingleSprmTab : public Ww1SingleSprm {
public:
    ostream& Dump(ostream&, BYTE*, USHORT);
    USHORT Size(BYTE*);
    Ww1SingleSprmTab(USHORT nCountBytes, sal_Char* sName = 0) :
        Ww1SingleSprm(nCountBytes, sName) {
        }
};

class Ww1SingleSprmPJc : public Ww1SingleSprmByte {
public:
    Ww1SingleSprmPJc(sal_Char* sName) :
        Ww1SingleSprmByte(sName) {
        }
    void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
    void Stop(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
};

class Ww1SingleSprmPDxa : public Ww1SingleSprmWord {
public:
    Ww1SingleSprmPDxa(sal_Char* sName) :
        Ww1SingleSprmWord(sName) {
        }
    void Stop(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
};

class Ww1SingleSprmPDxaRight : public Ww1SingleSprmPDxa {
public:
    Ww1SingleSprmPDxaRight(sal_Char* sName) :
        Ww1SingleSprmPDxa(sName) {
        }
    void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
};

class Ww1SingleSprmPDxaLeft : public Ww1SingleSprmPDxa {
public:
    Ww1SingleSprmPDxaLeft(sal_Char* sName) :
        Ww1SingleSprmPDxa(sName) {
        }
    void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
};

class Ww1SingleSprmPDxaLeft1 : public Ww1SingleSprmPDxa {
public:
    Ww1SingleSprmPDxaLeft1(sal_Char* sName) :
        Ww1SingleSprmPDxa(sName) {
        }
    void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
};

class Ww1SingleSprmPFKeep : public Ww1SingleSprmBool {
public:
    Ww1SingleSprmPFKeep(sal_Char* sName) :
        Ww1SingleSprmBool(sName) {
        }
    void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
    void Stop(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
};

class Ww1SingleSprmPFKeepFollow : public Ww1SingleSprmBool {
public:
    Ww1SingleSprmPFKeepFollow(sal_Char* sName) :
        Ww1SingleSprmBool(sName) {
        }
    void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
    void Stop(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
};

class Ww1SingleSprmPPageBreakBefore : public Ww1SingleSprmBool {
public:
    Ww1SingleSprmPPageBreakBefore(sal_Char* sName) :
        Ww1SingleSprmBool(sName) {
        }
    void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
    void Stop(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
};

class Ww1SingleSprmPBrc : public Ww1SingleSprmWord {
protected:
//  SvxBorderLine* SetBorder(SvxBorderLine*, W1_BRC*);
    // spezielle start-routine, je nach sprm verschieden versorgt
    // mit einem BoxItem.
    void Start(Ww1Shell&, BYTE, W1_BRC10*, USHORT, Ww1Manager&, SvxBoxItem&);
    void Start(Ww1Shell&, BYTE, W1_BRC*, USHORT, Ww1Manager&, SvxBoxItem&);
public:
    Ww1SingleSprmPBrc(sal_Char* sName) :
        Ww1SingleSprmWord(sName) {
        }
    void Stop(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
    // SetBorder() wird auch fuer Tabellen gebraucht, deshalb public
    static SvxBorderLine* SetBorder(SvxBorderLine*, W1_BRC10*);
};

#define BRC_TOP ((USHORT)0)
#define BRC_LEFT ((USHORT)1)
#define BRC_BOTTOM ((USHORT)2)
#define BRC_RIGHT ((USHORT)3)
#define BRC_ANZ ((USHORT)BRC_RIGHT-BRC_TOP+1)

// Die BRC-struktur fuer 1.0 versionen von word sind verschieden von
// denen der folgenden versionen. diese werden zum glueck aber auch
// von anderen sprms abgerufen.
// SH: Ab sofort alle 4 Umrandungen ueber nur 1 Klasse.
class Ww1SingleSprmPBrc10 : public Ww1SingleSprmPBrc {
    USHORT nLine;   // BRC_TOP, BRC_LEFT, ...
public:
    Ww1SingleSprmPBrc10(USHORT nL, sal_Char* sName) :
        nLine(nL), Ww1SingleSprmPBrc(sName) {
        }
    void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
};

class Ww1SingleSprmParaSpace : public Ww1SingleSprmWord {
public:
    Ww1SingleSprmParaSpace(sal_Char* sName) :
        Ww1SingleSprmWord(sName) {
        }
    void Stop(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
};

class Ww1SingleSprmPDyaBefore : public Ww1SingleSprmParaSpace {
public:
    Ww1SingleSprmPDyaBefore(sal_Char* sName) :
        Ww1SingleSprmParaSpace(sName) {
        }
    void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
};

class Ww1SingleSprmPDyaAfter : public Ww1SingleSprmParaSpace {
public:
    Ww1SingleSprmPDyaAfter(sal_Char* sName) :
        Ww1SingleSprmParaSpace(sName) {
        }
    void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
};

class Ww1SingleSprmPDyaLine : public Ww1SingleSprmWord {
public:
    Ww1SingleSprmPDyaLine(sal_Char* sName) :
        Ww1SingleSprmWord(sName) {
        }
    void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
    void Stop(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
};

class Ww1SingleSprmPChgTabsPapx : public Ww1SingleSprmByteSized {
public:
    Ww1SingleSprmPChgTabsPapx(sal_Char* sName) :
        Ww1SingleSprmByteSized(0, sName) {
        }
  // Size() ist noch nicht aktiviert !!
    void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
    void Stop(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
};

class Ww1SingleSprmSGprfIhdt : public Ww1SingleSprmByte {
public:
    Ww1SingleSprmSGprfIhdt(sal_Char* sName) :
        Ww1SingleSprmByte(sName) {
        }
    void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
};

class Ww1SingleSprmSColumns : public Ww1SingleSprmWord {
public:
    Ww1SingleSprmSColumns(sal_Char* sName) :
        Ww1SingleSprmWord(sName) {
        }
    void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
};

class Ww1SingleSprmPFInTable : public Ww1SingleSprmBool {
public:
    Ww1SingleSprmPFInTable(sal_Char* sName) :
        Ww1SingleSprmBool(sName) {
        }
    void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
    void Stop(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
};

class Ww1SingleSprmPTtp : public Ww1SingleSprmBool {
public:
    Ww1SingleSprmPTtp(sal_Char* sName) :
        Ww1SingleSprmBool(sName) {
        }
    void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
    void Stop(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
};

class Ww1SingleSprmTJc : public Ww1SingleSprmWord {
public:
    Ww1SingleSprmTJc(sal_Char* sName) :
        Ww1SingleSprmWord(sName) {
        }
    void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
};

//class Ww1SingleSprmTDxaLeft : public Ww1SingleSprmWord {
//public:
//  Ww1SingleSprmTDxaLeft(sal_Char* sName) :
//      Ww1SingleSprmWord(sName) {
//      }
//  void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
//};

class Ww1SingleSprmTDxaGapHalf : public Ww1SingleSprmWord {
public:
    Ww1SingleSprmTDxaGapHalf(sal_Char* sName) :
        Ww1SingleSprmWord(sName) {
        }
    void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
};

class Ww1SingleSprmTDefTable10 : public Ww1SingleSprmWordSized {
public:
    Ww1SingleSprmTDefTable10(sal_Char* sName) :
        Ww1SingleSprmWordSized(0, sName) {
        }
    void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
};

class Ww1SingleSprmTDyaRowHeight : public Ww1SingleSprmWord {
public:
    Ww1SingleSprmTDyaRowHeight(sal_Char* sName) :
        Ww1SingleSprmWord(sName) {
        }
    void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
};

// Klassendefinitionen fuer Tabellen-Fastsave-Attribute
// Da wir kein Fastsave unterstuetzen, brauchen wir's nicht

#if 0

class Ww1SingleSprmTInsert : public Ww1SingleSprm {
public:
    Ww1SingleSprmTInsert(sal_Char* sName) :
        Ww1SingleSprm(4, sName) {
        }
    void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
};

class Ww1SingleSprmTDelete : public Ww1SingleSprmWord {
public:
    Ww1SingleSprmTDelete(sal_Char* sName) :
        Ww1SingleSprmWord(sName) {
        }
    void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
};

class Ww1SingleSprmTDxaCol : public Ww1SingleSprm {
public:
    Ww1SingleSprmTDxaCol(sal_Char* sName) :
        Ww1SingleSprm(4, sName) {
        }
    void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
};

class Ww1SingleSprmTMerge : public Ww1SingleSprmWord {
public:
    Ww1SingleSprmTMerge(sal_Char* sName) :
        Ww1SingleSprmWord(sName) {
        }
    void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
};

class Ww1SingleSprmTSplit : public Ww1SingleSprmWord {
public:
    Ww1SingleSprmTSplit(sal_Char* sName) :
        Ww1SingleSprmWord(sName) {
        }
    void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
};

class Ww1SingleSprmTSetBrc10 : public Ww1SingleSprm {
public:
    Ww1SingleSprmTSetBrc10(sal_Char* sName) :
        Ww1SingleSprm(5, sName) {
        }
    void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
};
#endif // 0

// Klassendefinitionen fuer Apos ( == Flys )

class Ww1SingleSprmPpc : public Ww1SingleSprmByte {
public:
    Ww1SingleSprmPpc(sal_Char* sName) :
        Ww1SingleSprmByte(sName) {
        }
    void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
};

class Ww1SingleSprmPDxaAbs : public Ww1SingleSprmWord {
public:
    Ww1SingleSprmPDxaAbs(sal_Char* sName) :
        Ww1SingleSprmWord(sName) {
        }
    void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
};

class Ww1SingleSprmPDyaAbs : public Ww1SingleSprmWord {
public:
    Ww1SingleSprmPDyaAbs(sal_Char* sName) :
        Ww1SingleSprmWord(sName) {
        }
    void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
};

class Ww1SingleSprmPDxaWidth : public Ww1SingleSprmWord {
public:
    Ww1SingleSprmPDxaWidth(sal_Char* sName) :
        Ww1SingleSprmWord(sName) {
        }
    void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
};

class Ww1SingleSprmPFromText : public Ww1SingleSprmWord {
public:
    Ww1SingleSprmPFromText(sal_Char* sName) :
        Ww1SingleSprmWord(sName) {
        }
    void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
};

////////////////////////////////////////////////////////////////// Sprm
//
// der tatsaechlich in der datei auftretende datentyp Sprm
//
class Ww1Sprm
{
    BOOL ReCalc();
protected:
    static Ww1SingleSprm* aTab[256];
    static void InitTab();
    Ww1SingleSprm& GetTab(USHORT nId) {
        if (aTab[0] == 0)
            InitTab();
        return *aTab[nId]; }
    BYTE* p;
    USHORT nCountBytes;
    BOOL bOK;
    USHORT* pArr;
    USHORT count;
// ohne Token, mit laengen-byte/word
    USHORT GetSize(BYTE nId, BYTE* pSprm);
// mit Token und LaengenByte
    USHORT GetSizeBrutto(BYTE* pSprm) {
        BYTE nId = *pSprm++;
        return GetSize(nId, pSprm) + 1; }
// gibt fuer nTh element id, size & zeiger auf daten:
//  BOOL Fill(USHORT, BYTE&, USHORT&, BYTE*&);
public:
// SH: brauche ich public
// gibt fuer nTh element id, size & zeiger auf daten:
    BOOL Fill(USHORT, BYTE&, USHORT&, BYTE*&);

    Ww1Sprm(BYTE*, USHORT);
    Ww1Sprm(SvStream&, ULONG);
    ~Ww1Sprm();
    friend ostream& operator <<(ostream&, Ww1Sprm&);
    void Start(Ww1Shell&, Ww1Manager&);
    void Start(Ww1Shell&, Ww1Manager&, USHORT);
    void Stop(Ww1Shell&, Ww1Manager&);
    BOOL IsUsed() {
        return nCountBytes != 255; }
    USHORT Count() {
        return count; }
    BOOL GetError() {
        return !bOK; }
    static void DeinitTab();
};

/////////////////////////////////////////////////////////////// Picture
//
// der wrapper um den datentyp PIC, eine struktur, die am beginn eines
// bild-dateinamens oder eines eingebetteten bildes steht.
//
class Ww1Picture
{
    BOOL bOK;
    W1_PIC* pPic;
public:
    Ww1Picture(SvStream&, ULONG);
    ~Ww1Picture() {
        }
    BOOL GetError() {
        return !bOK; }
    friend ostream& operator <<(ostream&, Ww1Picture&);
    void Out(Ww1Shell&, Ww1Manager&);
    void WriteBmp(SvStream&);
};

/////////////////////////////////////////////////////////////////// Plc
//
// eine der wichtigen array-strukturen der ww-dateien. sie beinhalten
// n+1 dateipositionen und n attribute, die zwischen den
// dateipositionen gelten.
//
class Ww1Plc
{
    BYTE* p;
    USHORT nCountBytes;
    USHORT iMac;
    USHORT nItemSize;
    BOOL bOK;
protected:
    Ww1Fib& rFib;
    BYTE* GetData(USHORT);
public:
    Ww1Plc(Ww1Fib&, ULONG, USHORT, USHORT);
    ~Ww1Plc();
    friend ostream& operator <<(ostream&, Ww1Plc&);
    ULONG Where(USHORT); // wie im jeweiligen plc
    void Seek(ULONG, USHORT&);
    void Fill(USHORT nIndex, ULONG& begin, ULONG& end) {
        begin = Where(nIndex);
        end = Where(nIndex+1); }
    USHORT Count() {
        return iMac; }
    BOOL GetError() {
        return !bOK; }
};

// Size Tabs from Sven:
//    CHP, PAP, SEP, HED, FNR, FNT
//Plc 2,   2,   6,   0,   2,   0
//Fkp 1,   1,   0,   0,   0,   0

/////////////////////////////////////////////////////////// PlcGlossary
class Ww1PlcGlossary : public Ww1Plc
{
public:
    Ww1PlcGlossary(Ww1Fib& rFib) :
        Ww1Plc(rFib, rFib.GetFIB().fcPlcfglsyGet(),
         rFib.GetFIB().cbPlcfglsyGet(), 0) {
        }
};

////////////////////////////////////////////////////// PlcAnnotationRef
class Ww1PlcAnnotationRef : public Ww1Plc
{
public:
    Ww1PlcAnnotationRef(Ww1Fib& rFib) :
        Ww1Plc(rFib, rFib.GetFIB().fcPlcfandRefGet(),
         rFib.GetFIB().cbPlcfandRefGet(), 0) {
        }
};

////////////////////////////////////////////////////// PlcAnnotationTxt
class Ww1PlcAnnotationTxt : public Ww1Plc
{
public:
    Ww1PlcAnnotationTxt(Ww1Fib& rFib) :
        Ww1Plc(rFib, rFib.GetFIB().fcPlcfandTxtGet(),
         rFib.GetFIB().cbPlcfandTxtGet(), 0) {
        }
};

///////////////////////////////////////////////////////// PlcAnnotation
class Ww1Annotation {
    Ww1PlcAnnotationRef aRef;
    Ww1PlcAnnotationTxt aTxt;
public:
    Ww1Annotation(Ww1Fib& rFib) :
        aRef(rFib),
        aTxt(rFib) {
        }
    friend ostream& operator <<(ostream&, Ww1Annotation&);
};

//////////////////////////////////////////////////////////////// PlcSep
class Ww1PlcSep : public Ww1Plc
{
public:
    Ww1PlcSep(Ww1Fib& rFib):
        Ww1Plc(rFib, rFib.GetFIB().fcPlcfsedGet(),
         rFib.GetFIB().cbPlcfsedGet(), 6) {
        }
    friend ostream& operator <<(ostream&, Ww1PlcSep&);
};

//////////////////////////////////////////////////////////////// PlcChp
class Ww1PlcChp : public Ww1Plc
{
public:
    Ww1PlcChp(Ww1Fib& rFib) :
        Ww1Plc(rFib, rFib.GetFIB().fcPlcfbteChpxGet(),
         rFib.GetFIB().cbPlcfbteChpxGet(), 2) {
        }
    friend ostream& operator <<(ostream&, Ww1PlcChp&);
};

//////////////////////////////////////////////////////////////// PlcPap
class Ww1PlcPap : public Ww1Plc
{
public:
    Ww1PlcPap(Ww1Fib& rFib) :
        Ww1Plc(rFib, rFib.GetFIB().fcPlcfbtePapxGet(),
         rFib.GetFIB().cbPlcfbtePapxGet(), 2) {
        }
    friend ostream& operator <<(ostream&, Ww1PlcPap&);
};

//////////////////////////////////////////////////////// PlcFootnoteRef
class Ww1PlcFootnoteRef : public Ww1Plc
{
public:
    Ww1PlcFootnoteRef(Ww1Fib& rFib) :
        Ww1Plc(rFib, rFib.GetFIB().fcPlcffndRefGet(),
         rFib.GetFIB().cbPlcffndRefGet(), 2) {
        }
    friend ostream& operator <<(ostream&, Ww1PlcFootnoteRef&);
};

//////////////////////////////////////////////////////// PlcFootnoteTxt
class Ww1PlcFootnoteTxt : public Ww1Plc
{
public:
    Ww1PlcFootnoteTxt(Ww1Fib& rFib) :
        Ww1Plc(rFib, rFib.GetFIB().fcPlcffndTxtGet(),
         rFib.GetFIB().cbPlcffndTxtGet(), 0) {
        }
    friend ostream& operator <<(ostream&, Ww1PlcFootnoteTxt&);
};

///////////////////////////////////////////////////////////// PlcFields
class Ww1PlcFields : public Ww1Plc
{
    //USHORT Fill(USHORT, BYTE&, String&, String&, String&);
public:
    Ww1PlcFields(Ww1Fib& rFib, ULONG start, USHORT nCountBytes)
        : Ww1Plc(rFib, start, nCountBytes, 2)
    {}
    W1_FLD* GetData(USHORT nIndex)
        { return (W1_FLD*)Ww1Plc::GetData(nIndex); }
    ULONG Where(USHORT nIndex)  // absolut im file
        { return Ww1Plc::Where(nIndex) + rFib.GetFIB().fcMinGet(); }
    friend ostream& operator <<(ostream&, Ww1PlcFields&);
};

///////////////////////////////////////////////////////////// PlcBookmarks
class Ww1StringList
{
    sal_Char** pIdxA;
    USHORT nMax;
public:
    Ww1StringList( SvStream& rSt, ULONG nFc, USHORT nCb );
    ~Ww1StringList()
        {   if( pIdxA ) { delete pIdxA[0]; delete pIdxA; } }
    const String GetStr( USHORT nNum ) const;
    USHORT Count() const    { return nMax; }
    BOOL GetError() const   { return (nMax != 0) && !pIdxA; }
};

class Ww1PlcBookmarkTxt: public Ww1StringList
{
public:
    Ww1PlcBookmarkTxt(Ww1Fib& rFib) :
        Ww1StringList( rFib.GetStream(), rFib.GetFIB().fcSttbfbkmkGet(),
                       rFib.GetFIB().cbSttbfbkmkGet() )
    {}
};

class Ww1PlcBookmarkPos : public Ww1Plc
{
//  USHORT Fill(USHORT, BYTE&, String&, String&, String&);
public:
    Ww1PlcBookmarkPos(Ww1Fib& rFib, ULONG start, USHORT nCountBytes, BOOL bEnd)
        : Ww1Plc(rFib, start, nCountBytes, (bEnd) ? 0 : 2)
    {}

    BYTE* GetData(USHORT nIndex)    {   return Ww1Plc::GetData(nIndex); }
    // Position als CP
    ULONG WhereCP(USHORT nIndex)    { return Ww1Plc::Where(nIndex); }
    // absolut im file
    ULONG Where(USHORT nIndex)
    {
        return ( nIndex < Count() )
               ? Ww1Plc::Where(nIndex) + rFib.GetFIB().fcMinGet()
               : 0xffffffff;
    }
//  friend ostream& operator <<(ostream&, Ww1PlcBookmarks&);
};

//////////////////////////////////////////////////////////////// PlcHdd
class Ww1PlcHdd : public Ww1Plc
{
public:
    Ww1PlcHdd(Ww1Fib& rFib)
        : Ww1Plc(rFib, rFib.GetFIB().fcPlcfhddGet(),
                     rFib.GetFIB().cbPlcfhddGet(), 0)
    {}
};

/////////////////////////////////////////////////////////////////// Fkp
//
// aehnlich den plcs aufgebaute arrays, die sich auf eine groesze von
// 512 byte beschraenken.
//
class Ww1Fkp
{
protected:
    BYTE aFkp[512];
    USHORT nItemSize;
    BOOL bOK;
    BYTE* GetData(USHORT);
public:
    Ww1Fkp(SvStream&, ULONG, USHORT);
    friend ostream& operator <<(ostream&, Ww1Fkp&);
    USHORT Count() const            { return SVBT8ToByte(aFkp+511); }
    ULONG Where(USHORT); // wie im entsprechenden fkp
};

//////////////////////////////////////////////////////////////// FkpPap
class Ww1FkpPap : public Ww1Fkp
{
public:
    Ww1FkpPap(SvStream& rStream, ULONG ulFilePos)
        : Ww1Fkp(rStream, ulFilePos, 1)
    {}
    friend ostream& operator <<(ostream&, Ww1FkpPap&);
    BOOL Fill(USHORT,  BYTE*&, USHORT&, ULONG&, ULONG&);
    BOOL Fill(USHORT,  BYTE*&, USHORT&);
};

//////////////////////////////////////////////////////////////// FkpChp
class Ww1FkpChp : public Ww1Fkp
{
#ifdef DUMP
    SvStream& rStream;
    SvStream& GetStream()   { return rStream; }
#endif
public:
    Ww1FkpChp(SvStream& rStream, ULONG ulFilePos)
        : Ww1Fkp(rStream, ulFilePos, 1)
#ifdef DUMP
        , rStream(rStream)
#endif
    {}

    friend ostream& operator <<(ostream&, Ww1FkpChp&);
    BOOL Fill(USHORT, W1_CHP&, ULONG&, ULONG&);
    BOOL Fill(USHORT, W1_CHP&);
};

////////////////////////////////////////////////////////////// SprmPapx
class Ww1SprmPapx : public Ww1Sprm
{
    W1_PAPX aPapx;
    BYTE* Sprm(BYTE* p, USHORT nSize);
    USHORT SprmSize(BYTE* p, USHORT nSize);
public:
    Ww1SprmPapx(BYTE* p, USHORT nSize);
    friend ostream& operator <<(ostream&, Ww1SprmPapx&);
    void Start(Ww1Shell&, Ww1Manager&);
    void Stop(Ww1Shell&, Ww1Manager&);
};

/////////////////////////////////////////////////////////////// SprmSep
class Ww1SprmSep : public Ww1Sprm
{
public:
    Ww1SprmSep(Ww1Fib& rFib, ULONG ulFilePos)
        : Ww1Sprm(rFib.GetStream(), ulFilePos)
    {}
    friend ostream& operator <<(ostream&, Ww1SprmSep&);
};

///////////////////////////////////////////////////////////////// Assoc
class Ww1Assoc
{
    enum fields { FileNext, Dot, Title, Subject, KeyWords, Comments,
        Author, LastRevBy, DataDoc, HeaderDoc, Criteria1, Criteria2,
        Criteria3, Criteria4, Criteria5, Criteria6, Criteria7, MaxFields };

    Ww1Fib& rFib;
    sal_Char* pBuffer;
    sal_Char* pStrTbl[ MaxFields ];
    BOOL bOK;

    String GetStr(USHORT);

public:
    Ww1Assoc(Ww1Fib&);
    ~Ww1Assoc()             { delete pBuffer; }
    BOOL GetError() const   { return !bOK; }
    friend ostream& operator <<(ostream&, Ww1Assoc&);
    void Out(Ww1Shell&);
};

////////////////////////////////////////////////////////// HeaderFooter
//
// Header/Footer/Footnoteseparators sind einer nach dem naechsten in
// einem eigenen text gespeichert. ein plc trennt diesen text in
// einzelne teile.  diese werden durchnummeriert als ihdd. nun gibt es
// 9 verschiedene funktionen fuer diese texte. wird eine davon
// angefordert, ist es der erste, beim naechstern der 2 ihdd und so
// weiter.  welcher textteil also welcher typ sein wird laeszt sich
// nur bei sequenziellem lesen der datei bestimmen. die 9 typen sind:
// fusznoten-trenner, folge-fusznoten-trenner, folge-fusznoten-notiz,
// gerade-seiten kopfzeilen, ungerade seiten kopfzeilen, dto 2*
// fuszzeilen, kopf & fuszzeilen, wenn erste seite andere zeilen hat.
// HeaderFooter merkt sich fuer jede der 9 die momentane einstellung
// (jedoch nicht die alten) und den naechstvergebbaren ihdd.  ist ein
// teil nicht vorhanden bekommt er den wert 0xffff.
//
class Ww1HeaderFooter : public Ww1PlcHdd
{
    USHORT nextIhdd; // naechster textteil im HddText
    USHORT nFtnSep; // fusznoten trenner
    USHORT nFtnFollowSep; // folge fusznoten trenner
    USHORT nFtnNote; // folgefunsznotennotiz
    USHORT nEvenHeadL; // kopfzeilen grader seiten
    USHORT nOddHeadL; // kopfzeilen ungrader seiten
    USHORT nEvenFootL; // fuszzeilen grader seiten
    USHORT nOddFootL; // fuszzeilen ungerader seiten
    USHORT nFirstHeadL; // kopfzeilen der ersten seite
    USHORT nFirstFootL; // fuszzeilen der ersten seite
    enum HeaderFooterMode {
        None, FtnSep, FtnFollowSep, FtnNote, EvenHeadL, OddHeadL,
        EvenFootL, OddFootL, FirstHeadL, MaxHeaderFooterMode
    } eHeaderFooterMode;

public:
    Ww1HeaderFooter(Ww1Fib& rFib, USHORT grpfIhdt)
        : Ww1PlcHdd(rFib),
        nextIhdd(0),
        nFtnSep(0xffff),
        nFtnFollowSep(0xffff),
        nFtnNote(0xffff),
        nEvenHeadL(0xffff),
        nOddHeadL(0xffff),
        nEvenFootL(0xffff),
        nOddFootL(0xffff),
        nFirstHeadL(0xffff),
        nFirstFootL(0xffff),
        eHeaderFooterMode(None)
    {
        if (grpfIhdt & 0x0001) nFtnSep = nextIhdd++;
        if (grpfIhdt & 0x0002) nFtnFollowSep = nextIhdd++;
        if (grpfIhdt & 0x0004) nFtnNote = nextIhdd++;
    }
//  ~Ww1HeaderFooter() {}
    void SetGrpfIhdt(USHORT grpfIhdt)
    {
        if (grpfIhdt & 0x0001) nEvenHeadL = nextIhdd++;
        if (grpfIhdt & 0x0002) nOddHeadL = nextIhdd++;
        if (grpfIhdt & 0x0004) nEvenFootL = nextIhdd++;
        if (grpfIhdt & 0x0008) nOddFootL = nextIhdd++;
        if (grpfIhdt & 0x0010) nFirstHeadL = nextIhdd++;
        if (grpfIhdt & 0x0020) nFirstFootL = nextIhdd++;
        DBG_ASSERT(nextIhdd<=Count(), "Ww1HeaderFooter");
    }
    BOOL operator++(int)
    {
        BOOL bRet = TRUE;
        eHeaderFooterMode = (HeaderFooterMode)((short)eHeaderFooterMode + 1);
        if( eHeaderFooterMode == MaxHeaderFooterMode)
        {
            eHeaderFooterMode = None;
            bRet = FALSE;
        }
        return bRet;
    }
    BOOL FillFtnSep(ULONG& begin, ULONG& end)
    {
        if (nFtnSep == 0xffff)
            return FALSE;
        Fill(nFtnSep, begin, end);
        return TRUE;
    }
    BOOL FillFtnFollowSep(ULONG& begin, ULONG& end)
    {
        if (nFtnFollowSep == 0xffff)
            return FALSE;
        Fill(nFtnFollowSep, begin, end);
        return TRUE;
    }
    BOOL FillFtnNote(ULONG& begin, ULONG& end)
    {
        if (nFtnNote == 0xffff)
            return FALSE;
        Fill(nFtnNote, begin, end);
        return TRUE;
    }
    BOOL FillEvenHeadL(ULONG& begin, ULONG& end)
    {
        if (nEvenHeadL == 0xffff)
            return FALSE;
        Fill(nEvenHeadL, begin, end);
        return TRUE;
    }
    BOOL FillOddHeadL(ULONG& begin, ULONG& end)
    {
        if (nOddHeadL == 0xffff)
            return FALSE;
        Fill(nOddHeadL, begin, end);
        return TRUE;
    }
    BOOL FillEvenFootL(ULONG& begin, ULONG& end)
    {
        if (nEvenFootL == 0xffff)
            return FALSE;
        Fill(nEvenFootL, begin, end);
        return TRUE;
    }
    BOOL FillOddFootL(ULONG& begin, ULONG& end)
    {
        if (nOddFootL == 0xffff)
            return FALSE;
        Fill(nOddFootL, begin, end);
        return TRUE;
    }
    BOOL FillFirstHeadL(ULONG& begin, ULONG& end)
    {
        if (nFirstHeadL == 0xffff)
            return FALSE;
        Fill(nFirstHeadL, begin, end);
        return TRUE;
    }
    BOOL FillFirstFootL(ULONG& begin, ULONG& end)
    {
        if (nFirstFootL == 0xffff)
            return FALSE;
        Fill(nFirstFootL, begin, end);
        return TRUE;
    }
    void Start(Ww1Shell&, Ww1Manager&);
    void Stop(Ww1Shell&, Ww1Manager&, sal_Unicode&);
};

//////////////////////////////////////////////////////////////// Fields
class Ww1Fields : public Ww1PlcFields
{
    USHORT nPlcIndex;
    String sErgebnis; // das von word errechnete ergebniss
    SwField* pField;
    ULONG Where(USHORT nIndex)  // innerhalb des textes
        { return Ww1PlcFields::Where(nIndex) - rFib.GetFIB().fcMinGet(); }

public:
    Ww1Fields(Ww1Fib& rFib, ULONG ulFilePos, USHORT nCountBytes)
        : Ww1PlcFields(rFib, ulFilePos, nCountBytes), nPlcIndex(0), pField(0)
    {}
//  ~Ww1Fields() {}
    // innerhalb des textes
    ULONG Where()       { return Where(nPlcIndex); }
    void operator++(int)
    {
        DBG_ASSERT(nPlcIndex+1 <= Count(), "Ww1Fields");
        nPlcIndex++;
    }
    void Seek(ULONG ulNew)      { Ww1PlcFields::Seek(ulNew, nPlcIndex); }
    W1_FLD* GetData()
    {
        DBG_ASSERT(nPlcIndex < Count(), "Ww1Fields");
        return Ww1PlcFields::GetData(nPlcIndex);
    }
    ULONG GetLength();
    friend ostream& operator <<(ostream&, Ww1Manager&);
    void Start(Ww1Shell&, Ww1Manager&);
    void Stop(Ww1Shell&, Ww1Manager&, sal_Unicode&);
    void Out(Ww1Shell&, Ww1Manager&, USHORT=0);
};

class Ww1TextFields : public Ww1Fields
{
public:
    Ww1TextFields(Ww1Fib& rFib)
        : Ww1Fields(rFib, rFib.GetFIB().fcPlcffldMomGet(),
                     rFib.GetFIB().cbPlcffldMomGet())
    {}
};

class Ww1FootnoteFields : public Ww1Fields
{
public:
    Ww1FootnoteFields(Ww1Fib& rFib)
        : Ww1Fields(rFib, rFib.GetFIB().fcPlcffldFtnGet(),
                     rFib.GetFIB().cbPlcffldFtnGet())
    {}
};

class Ww1HeaderFooterFields : public Ww1Fields
{
public:
    Ww1HeaderFooterFields(Ww1Fib& rFib)
        : Ww1Fields(rFib, rFib.GetFIB().fcPlcffldHdrGet(),
                     rFib.GetFIB().cbPlcffldHdrGet())
    {}
};

class Ww1MacroFields : public Ww1Fields
{
public:
    Ww1MacroFields(Ww1Fib& rFib)
        : Ww1Fields(rFib, rFib.GetFIB().fcPlcffldMcrGet(),
                     rFib.GetFIB().cbPlcffldMcrGet())
    {}
};

//////////////////////////////////////////////////////////////// Bookmarks
class Ww1Bookmarks
{
    Ww1PlcBookmarkTxt aNames;
    Ww1PlcBookmarkPos* pPos[2];
    Ww1Fib& rFib;

    USHORT nPlcIdx[2];
    USHORT nIsEnd;
    BOOL bOK;
//  ULONG Where(USHORT nIndex) { // innerhalb des textes
//      return Ww1PlcFields::Where(nIndex) - rFib.GetFIB().fcMinGet(); }
public:
    Ww1Bookmarks(Ww1Fib& rFib);
    ~Ww1Bookmarks()
    {
            delete pPos[1];
            delete pPos[0];
    }
    ULONG Where() const     { return pPos[nIsEnd]->WhereCP(nPlcIdx[nIsEnd]); }
    void operator++(int);
    BOOL GetError() const   { return !bOK; }
    long GetHandle() const;
    BOOL GetIsEnd() const   { return ( nIsEnd ) ? TRUE : FALSE; }
    const String GetName() const;
    long Len() const;
    friend ostream& operator <<(ostream&, Ww1Bookmarks&);
    void Start(Ww1Shell&, Ww1Manager&);
    void Stop(Ww1Shell&, Ww1Manager&, sal_Unicode&);
    void Out(Ww1Shell&, Ww1Manager&, USHORT=0);
};

///////////////////////////////////////////////////////////// Footnotes
class Ww1Footnotes : public Ww1PlcFootnoteRef
{
    USHORT nPlcIndex;
    Ww1PlcFootnoteTxt aText;
    BOOL bStarted;
public:
    Ww1Footnotes(Ww1Fib& rFib)
        : Ww1PlcFootnoteRef(rFib), nPlcIndex(0), aText(rFib), bStarted(FALSE)
    {}
//  ~Ww1Footnotes() {}
    // innerhalb des textes
    ULONG Where()
    {
        ULONG ulRet = 0xffffffff;
        if (Count())
            ulRet = Ww1PlcFootnoteRef::Where(nPlcIndex);
        return ulRet;
    }
    void operator++(int)
    {
        DBG_ASSERT(nPlcIndex+1 <= Count(), "Ww1Footnotes");
        nPlcIndex++;
    }
    void Start(Ww1Shell&, Ww1Manager&);
    void Stop(Ww1Shell&, Ww1Manager&, sal_Unicode&);
};

/////////////////////////////////////////////////////////////////// Sep
class Ww1Sep : public Ww1PlcSep
{
    USHORT nPlcIndex;
    Ww1HeaderFooter aHdd;
public:
    Ww1Sep(Ww1Fib& rFib, USHORT grpfIhdt)
        : Ww1PlcSep(rFib), aHdd(rFib, grpfIhdt),nPlcIndex(0)
    {}
//  ~Ww1Sep() {}

    Ww1HeaderFooter& GetHdd()   { return aHdd; }
    void operator++(int)        { nPlcIndex++; }
    BYTE* GetData()             { return Ww1PlcSep::GetData(nPlcIndex); }
    // innerhalb des textes
    ULONG Where()               { return Ww1PlcSep::Where(nPlcIndex); }
    void SetGrpfIhdt(BYTE grpfIhdt)
    {
        GetHdd().SetGrpfIhdt(grpfIhdt);
//      GetHdd().Start(rOut, rMan);
    }
    void Start(Ww1Shell&, Ww1Manager&);
    void Stop(Ww1Shell& rOut, Ww1Manager& rMan, sal_Unicode& c)
        { aHdd.Stop(rOut, rMan, c); }
};

/////////////////////////////////////////////////////////////////// Pap
class Ww1Pap : public Ww1PlcPap
{
    USHORT nPlcIndex;
    USHORT nPushedPlcIndex;
    USHORT nFkpIndex;
    USHORT nPushedFkpIndex;
    ULONG ulOffset;
    Ww1FkpPap* pPap;

    BOOL FindSprm(USHORT nId, BYTE* pStart, BYTE* pEnd);
    void UpdateIdx()
    {
        if (pPap && nFkpIndex >= pPap->Count() )
        {
            delete pPap;
            pPap = NULL;
            nPlcIndex++;
        }
        if( !pPap )
            Where();
    }
    BOOL HasId0(USHORT nId);

public:
    Ww1Pap(Ww1Fib& rFib);
    ~Ww1Pap()   { delete pPap; }
    ULONG Where( BOOL bSetIndex = TRUE ); // innerhalb des textes
    void operator++(int);
    BOOL FillStart(BYTE*& p, USHORT& nSize)
    {
        UpdateIdx();
        return pPap->Fill(nFkpIndex, p, nSize);
    }
    BOOL FillStop(BYTE*& p, USHORT& nSize)
    {
        return nFkpIndex ? pPap->Fill(nFkpIndex-1, p, nSize) : FALSE;
    }
    void Start(Ww1Shell&, Ww1Manager&);
    void Stop(Ww1Shell&, Ww1Manager&, sal_Unicode&);
    void Seek(ULONG);
    void Push(ULONG ulOffset = 0)
    {
        DBG_ASSERT(!Pushed(), "Ww1Pap");
        nPushedPlcIndex = nPlcIndex;
        nPushedFkpIndex = nFkpIndex;
        Seek(ulOffset);
        this->ulOffset = ulOffset;
        delete pPap;
        pPap = NULL;
    }
    BOOL Pushed()
    {
        return nPushedPlcIndex != 0xffff;
    }
    void Pop()
    {
        DBG_ASSERT(Pushed(), "Ww1Pap");
        ulOffset = 0;
        nPlcIndex = nPushedPlcIndex;
        nFkpIndex = nPushedFkpIndex;
        nPushedPlcIndex = 0xffff;
        nPushedFkpIndex = 0xffff;
        delete pPap;
        pPap = NULL;
        Where( FALSE );
    }
    BOOL HasId(USHORT nId);
    BOOL NextHas(USHORT nId);
};

/////////////////////////////////////////////////////////////////// Chp
class Ww1Chp : public Ww1PlcChp
{
    USHORT nPlcIndex;
    USHORT nPushedPlcIndex;
    USHORT nFkpIndex;
    USHORT nPushedFkpIndex;
    ULONG ulOffset;
    Ww1FkpChp* pChp;
    void UpdateIdx()
    {
        if (pChp && nFkpIndex >= pChp->Count() )
        {
            delete pChp;
            pChp = NULL;
            nPlcIndex++;
        }
        if( !pChp )
            Where();
    }

public:
    Ww1Chp( Ww1Fib& rFib );
    ~Ww1Chp()   { delete pChp; }
    ULONG Where( BOOL bSetIndex = TRUE ); // innerhalb des textes
    void operator++(int);
    BOOL FillStart(W1_CHP& rChp)
    {
        UpdateIdx();
        return pChp->Fill(nFkpIndex, rChp);
    }
    BOOL FillStop(W1_CHP& rChp)
    { return nFkpIndex ? pChp->Fill(nFkpIndex-1, rChp) : FALSE;  }
    void Start(Ww1Shell&, Ww1Manager&);
    void Stop(Ww1Shell&, Ww1Manager&, sal_Unicode&);
    void Seek(ULONG);
    void Push(ULONG ulOffset = 0)
    {
        DBG_ASSERT(!Pushed(), "Ww1Chp");
        nPushedPlcIndex = nPlcIndex;
        nPushedFkpIndex = nFkpIndex;
        Seek(ulOffset);
        this->ulOffset = ulOffset;
        delete pChp;
        pChp = NULL;
    }
    BOOL Pushed()               { return nPushedPlcIndex != 0xffff; }
    void Pop()
    {
        DBG_ASSERT(Pushed(), "Ww1Chp");
        ulOffset = 0;
        nPlcIndex = nPushedPlcIndex;
        nFkpIndex = nPushedFkpIndex;
        nPushedPlcIndex = 0xffff;
        nPushedFkpIndex = 0xffff;
        delete pChp;
        pChp = NULL;
        Where( FALSE );
    }
};

/////////////////////////////////////////////////////////////// Manager
//
// zentraler aufhaenger der ww-seite des filters, konstruiert aus dem
// inputstream (ww-datei) enthaelt er alles, was noetig ist, um in die
// shell (pm-seite) gepiped zu werden.
//
class Ww1Manager
{
    BOOL bOK;
    BOOL bInTtp;
    BOOL bInStyle;
    BOOL bStopAll;
    Ww1Fib aFib;
    Ww1Dop aDop;
    Ww1Fonts aFonts;
// ab jetzt alles paarig, fuer 'pushed':
    Ww1DocText aDoc;
    Ww1PlainText* pDoc;
    ULONG ulDocSeek;
    ULONG* pSeek;
    Ww1TextFields aFld;
    Ww1Fields* pFld;
// selbst 'push'bar:
    Ww1Chp aChp;
    Ww1Pap aPap;
// nicht in textbereichen vorhanden, wenn ge'pushed'
    Ww1Footnotes aFtn;
    Ww1Bookmarks aBooks;
    Ww1Sep aSep;

    void OutStop( Ww1Shell&, sal_Unicode );
    void OutStart( Ww1Shell& );
    void Out(Ww1Shell&, sal_Unicode );

public:
    Ww1Manager(SvStream& rStrm, ULONG nFieldFlgs);
    BOOL GetError() const       { return !bOK; }

// Fuer Tabellen
    void SetInTtp(BOOL bSet = TRUE)     { bInTtp = bSet; }
    BOOL IsInTtp() const                { return bInTtp; }
    void SetInStyle(BOOL bSet = TRUE)   { bInStyle = bSet; }
    BOOL IsInStyle() const              { return bInStyle; }
    void SetStopAll(BOOL bSet = TRUE)   { bStopAll = bSet; }
    BOOL IsStopAll() const              { return bStopAll; }
    BOOL HasInTable();
    BOOL HasTtp();
    BOOL NextHasTtp();
    BOOL LastHasTtp();

// Fuer Flys
    BOOL HasPPc();
    BOOL HasPDxaAbs();

    Ww1Fib& GetFib()                    { return aFib; }
    Ww1PlainText& GetText()             { return *pDoc; }
    Ww1Dop& GetDop()                    { return aDop; }
    Ww1Sep& GetSep()                    { return aSep; }
    // innerhalb des textes
    ULONG Where()                       { return pDoc->Where(); }
    void Fill( sal_Unicode& rChr )      { pDoc->Out( rChr ); }
    BYTE Fill( String& rStr, ULONG ulLen)
    {
        ulLen += pDoc->Where();
        return pDoc->Out(rStr, ulLen);
    }
    SvxFontItem GetFont(USHORT nFCode);
    static BOOL IsValidFib(const BYTE*, USHORT);
    friend Ww1Shell& operator <<(Ww1Shell&, Ww1Manager&);
    friend ostream& operator <<(ostream&, Ww1Manager&);
    BOOL Pushed()                       { return pDoc != &aDoc; }
    void Pop();
    void Push0(Ww1PlainText* pDoc, ULONG, Ww1Fields* = 0);
    void Push1(Ww1PlainText* pDoc, ULONG ulSeek, ULONG ulSeek2 = 0,
               Ww1Fields* = 0);
};

/**********************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ww1/w1class.hxx,v 1.1.1.1 2000-09-18 17:14:57 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.19  2000/09/18 16:04:56  willem.vandorp
      OpenOffice header added.

      Revision 1.18  2000/09/09 12:53:29  willem.vandorp
      Header and footer replaced

      Revision 1.17  2000/05/11 16:06:48  jp
      Changes for Unicode

      Revision 1.16  1998/02/19 16:01:14  HJS
      fuer sh eingechecked


      Rev 1.15   19 Feb 1998 17:01:14   HJS
   fuer sh eingechecked

      Rev 1.12   14 Nov 1997 10:55:28   OS
   SH-Aenderung fuer Textmarken

      Rev 1.11   09 Oct 1997 14:13:46   JP
   Aenderungen von SH

      Rev 1.10   03 Sep 1997 14:16:28   SH
   Flys, Tabellen ok, Style-Abhaengigkeiten u.v.a.m

      Rev 1.9   11 Aug 1997 12:49:26   SH
   Flys und einfache Tabellen und Tabulatoren

      Rev 1.8   18 Jul 1997 09:31:38   MA
   Stand von SH, #41738# GPF und Tabellen etwas besser

      Rev 1.5   16 Jun 1997 13:09:04   MA
   Stand Micheal Dietrich

      Rev 1.4   12 Mar 1997 19:11:24   SH
   MDT: Progressbar, Pagedesc-Bug, Spalten, Anfang Tabellen u.a.

      Rev 1.3   10 Jan 1997 18:43:58   SH
   Stabiler und mehr von MDT

      Rev 1.2   28 Nov 1996 18:08:06   SH
   Schneller Schoener Weiter von MDT

      Rev 1.1   30 Sep 1996 23:22:18   SH
   neu von MDA


**********************************************************************/
diff --git a/sw/source/filter/ww1/w1filter.cxx b/sw/source/filter/ww1/w1filter.cxx
new file mode 100644
index 0000000..c547b39
--- /dev/null
+++ b/sw/source/filter/ww1/w1filter.cxx
@@ -0,0 +1,2433 @@
/*************************************************************************
 *
 *  $RCSfile: w1filter.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:57 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PCH
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#include <tools/solar.h>
#ifndef _SVX_PAPERINF_HXX
#include <svx/paperinf.hxx>
#endif
#ifndef _FILTER_HXX //autogen
#include <svtools/filter.hxx>
#endif
#ifndef _SFXDOCINF_HXX //autogen
#include <sfx2/docinf.hxx>
#endif
#ifndef _STREAM_HXX //autogen
#include <tools/stream.hxx>
#endif
#ifndef _GRAPH_HXX //autogen
#include <vcl/graph.hxx>
#endif
#ifndef _SVX_FONTITEM_HXX //autogen
#include <svx/fontitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _SVX_WGHTITEM_HXX //autogen
#include <svx/wghtitem.hxx>
#endif
#ifndef _SVX_POSTITEM_HXX //autogen
#include <svx/postitem.hxx>
#endif
#ifndef _SVX_CRSDITEM_HXX //autogen
#include <svx/crsditem.hxx>
#endif
#ifndef _SVX_CNTRITEM_HXX //autogen
#include <svx/cntritem.hxx>
#endif
#ifndef _SVX_CMAPITEM_HXX //autogen
#include <svx/cmapitem.hxx>
#endif
#ifndef _SVX_FHGTITEM_HXX //autogen
#include <svx/fhgtitem.hxx>
#endif
#ifndef _SVX_UDLNITEM_HXX //autogen
#include <svx/udlnitem.hxx>
#endif
#ifndef _SVX_WRLMITEM_HXX //autogen
#include <svx/wrlmitem.hxx>
#endif
#ifndef _SVX_COLRITEM_HXX //autogen
#include <svx/colritem.hxx>
#endif
#ifndef _SVX_KERNITEM_HXX //autogen
#include <svx/kernitem.hxx>
#endif
#ifndef _SVX_ESCPITEM_HXX //autogen
#include <svx/escpitem.hxx>
#endif
#ifndef _SVX_WGHTITEM_HXX //autogen
#include <svx/wghtitem.hxx>
#endif
#ifndef _SVX_TSTPITEM_HXX //autogen
#include <svx/tstpitem.hxx>
#endif

#ifndef _URLOBJ_HXX
#include <tools/urlobj.hxx>
#endif

#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _PAM_HXX
#include <pam.hxx>
#endif
#ifndef _NDTXT_HXX
#include <ndtxt.hxx>
#endif
#ifndef _PAGEDESC_HXX
#include <pagedesc.hxx>
#endif
#ifndef _FLDDAT_HXX
#include <flddat.hxx>
#endif
#ifndef _REFFLD_HXX
#include <reffld.hxx>
#endif
#ifndef _EXPFLD_HXX
#include <expfld.hxx>
#endif
#ifndef _DOCUFLD_HXX
#include <docufld.hxx>
#endif
#ifndef _FTNINFO_HXX
#include <ftninfo.hxx>
#endif
#ifndef _SECTION_HXX
#include <section.hxx>          // class SwSection
#endif
#ifndef _FLTINI_HXX
#include <fltini.hxx>
#endif
#ifndef _W1PAR_HXX
#include <w1par.hxx>
#endif

#ifndef _SWSWERROR_H
#include <swerror.h>
#endif
#ifndef _MDIEXP_HXX
#include <mdiexp.hxx>
#endif
#ifndef _STATSTR_HRC
#include <statstr.hrc>
#endif

#define MAX_FIELDLEN 64000


///////////////////////////////////////////////////////////////////////
//
// hier stehen die methoden operator<<, Out, Start und Stop mit
// folgender Bedeutung: wenn moeglich wird die information aus dem
// dokument per
//   operator<<()
// in die shell uebertragen. sind jedoch weitere parameter noetig
// wurde der name
//   Out()
// gewaehlt. ist ein bereich zu kennzeichnen (zB bei attributen
// von/bis), heissen die methoden
//   Start(), Stop()
// alle diese methoden stehen in diesem modul, das fuer den filter,
// jedoch nicht fuer den dumper noetig ist.  und da alle regeln ihre
// ausnahme haben: hier stehen auch methoden, die aus anderen gruenden
// fuer den dumper sinnlos sind, zB wenn sie auf sv-strukturen beruhen
// wie zB GetFont() auf SvxFontItem.
//

/////////////////////////////////////////////////////////////// Manager
Ww1Shell& operator <<(Ww1Shell& rOut, Ww1Manager& This)
{
    // verhindern, das bei rekusivem aufruf dies mehrfach passiert:
    if (!This.Pushed())
    {
        { // der wird nur temporaer gebraucht:
            This.SetInStyle( TRUE );
            Ww1StyleSheet(This.aFib).Out(rOut, This);
            This.SetInStyle( FALSE );
        }
        { // dieser auch:
            Ww1Assoc(This.aFib).Out(rOut);
        }
          // dieser nicht, der ist bereits member:
        This.aDop.Out(rOut);
          // Jetzt entscheiden, wie Seitenvorlagen erzeugt werden
        if (This.GetSep().Count() <= 1)
            rOut.SetUseStdPageDesc();
    }
    // und jetzt das eigentliche dok:
    sal_Unicode cUnknown = ' ';
    while (*This.pSeek < This.pDoc->Count())
    {
    // ausgabe des ProgressState nur, wenn im haupttext, da sonst
    // nicht bestimmt werden kann, wie weit wir sind:
        if (!This.Pushed())
            ::SetProgressState(This.Where() * 100 / This.pDoc->Count(),
             rOut.GetDoc().GetDocShell());
    // hier werden abwechselnd die attribute und die zeichen in die
    // shell gepumpt.  die positionen werden durch das lesen der
    // zeichen aus dem manager hoch- gezaehlt.  erst alle attribute:
        This.Out(rOut, cUnknown);
    // das textdocument pDoc ist ein Ww1PlainText, dessen Out()
    // methode solange ausgibt, bis entweder ein sonderzeichen
    // auftaucht oder die anzahl der auszugebenden zeichen erreicht
    // ist:
        cUnknown = This.pDoc->Out(rOut, *This.pSeek);
    }
    This.SetStopAll(TRUE);
    This.OutStop(rOut, cUnknown);   // Damit die Attribute am Ende geschlossen
    This.SetStopAll(FALSE);         // werden
    return rOut;
}

void Ww1Manager::OutStop(Ww1Shell& rOut, sal_Unicode cUnknown)
{
                        // Bookmarks brauchen nicht beendet werden ???
    if (pFld)
        pFld->Stop(rOut, *this, cUnknown);
    if (!Pushed())
        aFtn.Stop(rOut, *this, cUnknown);
    if (1)
        aChp.Stop(rOut, *this, cUnknown);
    if (1)
        aPap.Stop(rOut, *this, cUnknown);
    if (!Pushed())
        aSep.Stop(rOut, *this, cUnknown);
}

void Ww1Manager::OutStart( Ww1Shell& rOut )
{
// alle attribute, die's brauchen beginnen
    if (!Pushed())
        aSep.Start(rOut, *this);
    if (1)
        aPap.Start(rOut, *this);
    if (1)
        aChp.Start(rOut, *this);
    if (!Pushed())
        aFtn.Start(rOut, *this);
    if (pFld)
        pFld->Start(rOut, *this);
    if (!Pushed())
        aBooks.Start(rOut, *this);
// bestimmen, wo das naechste Ereigniss ist:
    ULONG ulEnd = pDoc->Count(); // spaetestens am textende
    if (!Pushed())
        if (ulEnd > aSep.Where()) // naechster Sep vorher?
            ulEnd = aSep.Where();
    if (1)
        if (ulEnd > aPap.Where()) // naechster Pap vorher?
            ulEnd = aPap.Where();
    if (1)
        if (ulEnd > aChp.Where()) // naechster Chp vorher?
            ulEnd = aChp.Where();
    if (!Pushed())
        if (ulEnd > aFtn.Where()) // naechster Ftn vorher?
            ulEnd = aFtn.Where();
    if (pFld)
        if (ulEnd > pFld->Where()) // naechster Fld vorher?
            ulEnd = pFld->Where();
    if (!Pushed())
        if (ulEnd > aBooks.Where()) // naechster Bookmark vorher?
            ulEnd = aBooks.Where();
    *pSeek = Where(); // momentane position
    if (*pSeek < ulEnd) // sind wir bereits weiter?
        *pSeek = ulEnd;
}

void Ww1Manager::Out(Ww1Shell& rOut, sal_Unicode cUnknown)
{
// Je nach modus wird hier mit feldern, fusznoten, zeichenattributen,
// absatzatributen und sektionen wie folgt verfahren: von allen wird
// zuallererst die stop-methoden gerufen. stellt das objekt fest, dasz
// etwas zu beenden ist (natuerlich nicht im ersten durchgang) beendet
// es dies, ansonsten ist der aufruf wirkungslos.  dann werden
// unbehandelte sonderzeichen augegeben. das werden genauso alle
// start-methoden gerufen und danach per where festgestellt, an
// welcher stelle die naechste aktion zu erwarten ist.
//
// ist der manager in einem ge'push'ten mode, werden bestimmte
// elemente ausgeklammert. felder werden wiederum nur in besonderen
// faellen augeklammert, wenn naemlich bereiche ausgegeben werden, die
// keine felder enthalten koennen. charakterattribute und
// paragraphenattribute werden jedoch nie ausgeklammert. die if (1)
// wurden zur verdeutlichung der einheitlichkeit eingefuegt.

// Erstmal eine Sonderbehandlung fuer Tabellen:
// die wichtigen Attribute lassen sich am Besten vor Beendigung derselben
// abfragen.
// Optimierung: Sie werden nur auf sinnvolle Werte gesetzt, wenn
// das 0x07-Zeiche ansteht.

    BOOL bLIsTtp = FALSE;
    BOOL bLHasTtp = FALSE;
    if( cUnknown == 0x07 )
    {
        bLIsTtp = IsInTtp();
        bLHasTtp = HasTtp();
    }
#if 0
    ULONG uLlMan = Where();
    BOOL bLStop = IsStopAll();
    BOOL bLIsT = rOut.IsInTable();
    BOOL bLHasT = HasInTable();
    BOOL bLIsTtp = IsInTtp();
    BOOL bLHasTtp = HasTtp();
    BOOL bLNextHasTtp = NextHasTtp();
#endif

    OutStop( rOut, cUnknown );      // Attrs ggfs. beenden

// meta-zeichen interpretieren:
    if (!Ww1PlainText::IsChar(cUnknown))
        switch (cUnknown)
        {
        case 0x02:
            // dontknow
        break;
        case 0x07: // table
#if 0
{
    ULONG ulMan = Where();
    BOOL bStop = IsStopAll();
    BOOL bIsT = rOut.IsInTable();
    BOOL bHasT = HasInTable();
    BOOL bIsTtp = IsInTtp();
    BOOL bHasTtp = HasTtp();
    BOOL bNextHasTtp = NextHasTtp();
#endif
            if (rOut.IsInTable() && HasInTable() && !bLIsTtp && !bLHasTtp){
//          if (rOut.IsInTable() && HasInTable() && !IsInTtp() && !HasTtp()){
//          if (rOut.IsInTable() && HasInTable() && !HasTtp() && !NextHasTtp()){
//              rOut << 'X';
                rOut.NextTableCell();
            }else{
//              rOut << 'O';
            }
        break;
        case 0x09: // tab
            rOut.NextTab();
        break;
        case 0x0a: // linefeed
            rOut.NextParagraph();
        break;
        case 0x0b: // linebreak
            if (rOut.IsInTable())
//              rOut.NextBand();    // war Stuss
                ;
            else
                rOut.NextLine();
        break;
        case 0x0d: // carriage return
            // ignore
        break;
        case 0x0c: // pagebreak
            rOut.NextPage();
        break;
        case 0x14: // sectionendchar
            // ignore here
        break;
        default:
        {
#ifdef DEBUG
            char s[200];
            sprintf(s, "%s(%d) assert (Ww1PlainText::IsChar(c)) failed"
             ": unknown char 0x%02x", __FILE__, __LINE__, cUnknown);
            DBG_ERROR(s);
#endif
        }
        }

    OutStart( rOut );   // Attrs ggfs. starten und Naechste Pos berechnen
}

#if 0
void Ww1Manager::Out(Ww1Shell& rOut, BYTE cUnknown)
{
// Je nach modus wird hier mit feldern, fusznoten, zeichenattributen,
// absatzatributen und sektionen wie folgt verfahren: von allen wird
// zuallererst die stop-methoden gerufen. stellt das objekt fest, dasz
// etwas zu beenden ist (natuerlich nicht im ersten durchgang) beendet
// es dies, ansonsten ist der aufruf wirkungslos.  dann werden
// unbehandelte sonderzeichen augegeben. das werden genauso alle
// start-methoden gerufen und danach per where festgestellt, an
// welcher stelle die naechste aktion zu erwarten ist.
//
// ist der manager in einem ge'push'ten mode, werden bestimmte
// elemente ausgeklammert. felder werden wiederum nur in besonderen
// faellen augeklammert, wenn naemlich bereiche ausgegeben werden, die
// keine felder enthalten koennen. charakterattribute und
// paragraphenattribute werden jedoch nie ausgeklammert. die if (1)
// wurden zur verdeutlichung der einheitlichkeit eingefuegt.
    if (pFld)
        pFld->Stop(rOut, *this, cUnknown);
    if (!Pushed())
        aFtn.Stop(rOut, *this, cUnknown);
    if (1)
        aChp.Stop(rOut, *this, cUnknown);
    if (1)
        aPap.Stop(rOut, *this, cUnknown);
    if (!Pushed())
        aSep.Stop(rOut, *this, cUnknown);
// meta-zeichen interpretieren:
    if (!Ww1PlainText::IsChar(cUnknown))
        switch (cUnknown)
        {
        case 0x02:
            // dontknow
        break;
        case 0x07: // table
//  hier muesste etwa stehen:
// ich probiere es mal in den Sprm::Stop von InTable und Ttp
//          if (IsInTable()){
//              if(IsInDummyCell())
//                  if (NextInTable())
//                      rOut.NextTableRow();
//              else
//                  rOut.NextTableCell();
//          rOut.NextTableCell();
        break;
        case 0x09: // tab
            rOut.NextTab();
        break;
        case 0x0a: // linefeed
            rOut.NextParagraph();
        break;
        case 0x0b: // linebreak
            if (IsInTable())
//              rOut.NextBand();    // war Stuss
                ;
            else
                rOut.NextLine();
        break;
        case 0x0d: // carriage return
            // ignore
        break;
        case 0x0c: // pagebreak
            rOut.NextPage();
        break;
        case 0x14: // sectionendchar
            // ignore here
        break;
        default:
        {
#ifdef DEBUG
            char s[200];
            sprintf(s, "%s(%d) assert (Ww1PlainText::IsChar(c)) failed"
             ": unknown char 0x%02x", __FILE__, __LINE__, cUnknown);
            DBG_ERROR(s);
#endif
        }
        }
// alle attribute, die's brauchen beginnen
    if (!Pushed())
        aSep.Start(rOut, *this);
    if (1)
        aPap.Start(rOut, *this);
    if (1)
        aChp.Start(rOut, *this);
    if (!Pushed())
        aFtn.Start(rOut, *this);
    if (pFld)
        pFld->Start(rOut, *this);
// bestimmen, wo das naechste Ereigniss ist:
    ULONG ulEnd = pDoc->Count(); // spaetestens am textende
    if (!Pushed())
        if (ulEnd > aSep.Where()) // naechster Sep vorher?
            ulEnd = aSep.Where();
    if (1)
        if (ulEnd > aPap.Where()) // naechster Pap vorher?
            ulEnd = aPap.Where();
    if (1)
        if (ulEnd > aChp.Where()) // naechster Chp vorher?
            ulEnd = aChp.Where();
    if (!Pushed())
        if (ulEnd > aFtn.Where()) // naechster Ftn vorher?
            ulEnd = aFtn.Where();
    if (pFld)
        if (ulEnd > pFld->Where()) // naechster Fld vorher?
            ulEnd = pFld->Where();
    *pSeek = Where(); // momentane position
    if (*pSeek < ulEnd) // sind wir bereits weiter?
        *pSeek = ulEnd;
}
#endif  // 0

SvxFontItem Ww1Manager::GetFont(USHORT nFCode)
{
    return aFonts.GetFont(nFCode);
}

void Ww1Manager::Push0(Ww1PlainText* pDoc, ULONG ulSeek, Ww1Fields* pFld)
{
    DBG_ASSERT(!Pushed(), "Ww1Manager");
    this->pDoc = pDoc;
    pSeek = new ULONG;
    *pSeek = pDoc->Where();
    aPap.Push(ulSeek);
    aChp.Push(ulSeek);
    this->pFld = pFld;
}

// ulSeek ist der FC-Abstand zwischen Hauptest-Start und Sondertext-Start
// ulSeek2 ist der Offset dieses bestimmten Sondertextes im Sondertext-Bereich,
// also z.B. der Offset des speziellen K/F-Textes
void Ww1Manager::Push1(Ww1PlainText* pDoc, ULONG ulSeek, ULONG ulSeek2,
                       Ww1Fields* pFld)
{
    DBG_ASSERT(!Pushed(), "Ww1Manager");
    this->pDoc = pDoc;
    pSeek = new ULONG;
    *pSeek = pDoc->Where();
    aPap.Push(ulSeek + ulSeek2);
    aChp.Push(ulSeek + ulSeek2);
    if( pFld )
        pFld->Seek( ulSeek2 );
    this->pFld = pFld;
}

void Ww1Manager::Pop()
{
    DBG_ASSERT(Pushed(), "Ww1Manager");
    delete pDoc;
    pDoc = &aDoc;
    delete pSeek;
    pSeek = &ulDocSeek;
    aChp.Pop();
    aPap.Pop();
    delete pFld;
    pFld = &aFld;
}

///////////////////////////////////////////////////////////// Bookmarks

void Ww1Bookmarks::Out(Ww1Shell& rOut, Ww1Manager& rMan, USHORT)
{
#ifdef DEBUG
    const String & rN = GetName();
    long nHandle = GetHandle();
#endif

    if( GetIsEnd() ){
        rOut.SetBookEnd( GetHandle() );
        return;
    }
#if 0
    eBookStatus eB = pB->GetStatus();
    if( ( eB & BOOK_IGNORE ) != 0 )
        return 0;                               // Bookmark zu ignorieren
#endif

    const String & rName = GetName();
    if( rName.EqualsAscii( "_Toc", 0, 4 ) ) // "_Toc*" ist ueberfluessig
        return;

    if( rOut.IsFlagSet( SwFltControlStack::HYPO )
        && rName.EqualsIgnoreCaseAscii( "FORMULAR" ) )
        rOut.SetProtect();

            // Fuer UEbersetzung Bookmark -> Variable setzen
    long nLen = Len();
    if( nLen > MAX_FIELDLEN )
        nLen = MAX_FIELDLEN;
                                // Lese Inhalt des Bookmark
                                // geht vermulich auch ueber Ww1PlainText
    String aVal( rMan.GetText().GetText( Where(), nLen ) );

        // in 2 Schritten, da OS/2 zu doof ist
    SwFltBookmark aBook( rName, aVal, GetHandle(), FALSE );
    rOut << aBook;
//          ( eB & BOOK_ONLY_REF ) != 0, TRUE  );

//  rOut << GetName();  // Test
}

void Ww1Bookmarks::Start(Ww1Shell& rOut, Ww1Manager& rMan)
{
#ifdef DEBUG
    ULONG ulMan = rMan.Where();
    ULONG ulBook = Where();
#endif

    if (rMan.Where() >= Where())
    {
        Out(rOut, rMan);
        (*this)++;
    }
}

///////////////////////////////////////////////////////////// Footnotes
void Ww1Footnotes::Start(Ww1Shell& rOut, Ww1Manager& rMan)
{
    if (rMan.Where() >= Where())
    {
        DBG_ASSERT(nPlcIndex < Count(), "WwFootnotes");
        sal_Unicode c;
        rMan.Fill(c);
        DBG_ASSERT(c==0x02, "Ww1Footnotes");
        if (c==0x02)
        {
            Ww1FtnText* pText = new Ww1FtnText(rMan.GetFib());
        // beginn des textes dieser fusznote:
            ULONG start = aText.Where(nPlcIndex);
            pText->Seek(start);
        // laenge des textes
            ULONG count = aText.Where(nPlcIndex+1) - start;
            pText->SetCount(count);
        // fusznotenkennung sollte das erste byte sein
            pText->Out(c);
            DBG_ASSERT(c==0x02, "Ww1Footnotes");
            count--; // fuer das eben gelesene kenn-byte
        // fusznoten mode beginnen:
            rOut.BeginFootnote();
            bStarted = TRUE;
            rMan.Push0(pText, pText->Offset(rMan.GetFib()),
             new Ww1FootnoteFields(rMan.GetFib()));
            rOut << rMan;
            rMan.Pop();
            rOut.EndFootnote();
        }
        else
            (*this)++;
    }
}

void Ww1Footnotes::Stop(Ww1Shell& rOut, Ww1Manager& rMan, sal_Unicode& c)
{
    if (bStarted && rMan.Where() > Where())
    {
        DBG_ASSERT(nPlcIndex < Count(), "Ww1Footnotes");
//      DBG_ASSERT(c==0x02, "Ww1Footnotes");    // scheint Stuss zu sein
        c = ' ';
        (*this)++;
    }
}

//////////////////////////////////////////////////////////////// Fields
void Ww1Fields::Start(Ww1Shell& rOut, Ww1Manager& rMan)
{
    if (rMan.Where() >= Where()){
        DBG_ASSERT(nPlcIndex < Count(), "Ww1Fields");
        if (GetData()->chGet() == 19)
            Out(rOut, rMan);
        else
            (*this)++; // ignore
    }
}

void Ww1Fields::Stop( Ww1Shell& rOut, Ww1Manager& rMan, sal_Unicode& c)
{
    if (rMan.Where() >= Where())
    {
        DBG_ASSERT(nPlcIndex < Count(), "Ww1Fields");
        if (GetData()->chGet() != 19)
        {
            rMan.Fill( c );
            DBG_ASSERT(c==21, "Ww1Fields");
            (*this)++;
            c = ' ';
            if (pField)
            // haben wir ein fertiges feld da, das  eingefuegt werden soll?
            {
                rOut << *pField;
                delete pField;
                pField = 0;
            // das macht der filter so, damit attribute die ueber das feld
            // gelten auch wirklich eingelesen werden und dem feld
            // zugeordnet werden.
            }
            if (sErgebnis.Len())
                rOut << sErgebnis;
        }
    }
}

enum WWDateTime{ WW_DONTKNOW = 0x0, WW_DATE = 0x1, WW_TIME = 0x2, WW_BOTH = 0x3 };

static WWDateTime GetTimeDatePara( const String& rForm,
                                    SwTimeFormat* pTime = 0,
                                     SwDateFormat* pDate = 0 )
{
    WWDateTime eDT = WW_BOTH;
    if( STRING_NOTFOUND == rForm.Search( 'H' ))         // H    -> 24h
    {
        if( pTime )
            *pTime = TF_SSMM_24;
    }
    else if( STRING_NOTFOUND == rForm.Search( 'H' ))    // h    -> 24h
    {
        if( pTime )
            *pTime = TF_SSMM_12;
    }
    else                                    // keine Zeit
    {
        eDT = (WWDateTime)( eDT & ~(USHORT)WW_TIME );
    }

    xub_StrLen nDPos = 0;
    while( STRING_NOTFOUND != nDPos )
    {
        nDPos = rForm.Search( 'M', nDPos );     // M    -> Datum
        if( !nDPos )
            break;
        sal_Unicode cPrev = rForm.GetChar( nDPos - 1 );
        // ignoriere dabei "AM", "aM", "PM", "pM"
        if( 'a' != cPrev && 'A' != cPrev && 'p' != cPrev && 'P' != cPrev )
            break;
        // else search again
        ++nDPos;
    }

    if( STRING_NOTFOUND != nDPos )                  // Monat -> Datum ?
    {
        static SwDateFormat __READONLY_DATA aDateA[32] =
        {
            DFF_DMY, DFF_DMMY, DFF_DMYY, DFF_DMMYY,
            DFF_DMMMY, DFF_DMMMY, DFF_DMMMYY, DFF_DMMMYY,
            DFF_DDMMY, DFF_DDMMY, DFF_DDMMMYY, DFF_DDMMMYY,
            DFF_DDMMMY, DFF_DDMMMY, DFF_DDMMMYY, DFF_DDMMMYY,
            DFF_DDDMMMY, DFF_DDDMMMY, DFF_DDDMMMYY, DFF_DDDMMMYY,
            DFF_DDDMMMY, DFF_DDDMMMY, DFF_DDDMMMYY, DFF_DDDMMMYY,
            DFF_DDDMMMY, DFF_DDDMMMY, DFF_DDDMMMYY, DFF_DDDMMMYY,
            DFF_DDDMMMY, DFF_DDDMMMY, DFF_DDDMMMYY, DFF_DDDMMMYY
        };

        BOOL bHasDay = STRING_NOTFOUND != rForm.Search( 't' ) ||
                       STRING_NOTFOUND != rForm.Search( 'T' ) ||
                       STRING_NOTFOUND != rForm.Search( 'd' ) ||
                       STRING_NOTFOUND != rForm.Search( 'D' );

        BOOL bLongDayOfWeek= STRING_NOTFOUND != rForm.SearchAscii( "tttt" ) ||
                               STRING_NOTFOUND != rForm.SearchAscii( "TTTT" ) ||
                               STRING_NOTFOUND != rForm.SearchAscii( "dddd" ) ||
                               STRING_NOTFOUND != rForm.SearchAscii( "DDDD" );

        BOOL bDayOfWeek = STRING_NOTFOUND != rForm.SearchAscii( "ttt" ) ||
                          STRING_NOTFOUND != rForm.SearchAscii( "TTT" ) ||
                          STRING_NOTFOUND != rForm.SearchAscii( "ddd" ) ||
                          STRING_NOTFOUND != rForm.SearchAscii( "DDD" );

                    //  M, MM -> numeric month
                    //  MMM, MMMM -> text. month
        BOOL bLitMonth = STRING_NOTFOUND != rForm.SearchAscii( "MMM" );
                    //  MMMM -> full month
        BOOL bFullMonth = STRING_NOTFOUND != rForm.SearchAscii( "MMMM" );
                    //  jj, JJ -> 2-col-year
                    //  jjjj, JJJJ -> 4-col-year
        BOOL bFullYear = STRING_NOTFOUND != rForm.SearchAscii( "jjj" ) ||
                         STRING_NOTFOUND != rForm.SearchAscii( "JJJ" ) ||
                         STRING_NOTFOUND != rForm.SearchAscii( "yyy" ) ||
                         STRING_NOTFOUND != rForm.SearchAscii( "YYY" );

        USHORT i = ( bLitMonth & 1 )
                   | ( ( bFullYear & 1 ) << 1 )
                   | ( ( bFullMonth & 1 ) << 2 )
                   | ( ( bDayOfWeek & 1 ) << 3 )
                   | ( ( bLongDayOfWeek & 1 ) << 4 );
        if( pDate )
        {
            if( !bHasDay && !bFullMonth )
                *pDate = DFF_MY;
            else
                *pDate = aDateA[i];
        }
    }
    else
    {
        eDT = (WWDateTime)( eDT & ~(USHORT)WW_DATE );
    }
    return eDT;
}


extern void sw3io_ConvertFromOldField( SwDoc& rDoc, USHORT& rWhich,
                                USHORT& rSubType, ULONG &rFmt,
                                USHORT nVersion );

void Ww1Fields::Out(Ww1Shell& rOut, Ww1Manager& rMan, USHORT nDepth)
{
    String sType; // der typ als string
    String sFormel; // die formel
    String sFormat;
    String sDTFormat;   // Datum / Zeit-Format
    W1_FLD* pData = GetData(); // die an den plc gebunden daten
    DBG_ASSERT(pData->chGet()==19, "Ww1Fields"); // sollte beginn sein

    sal_Unicode c;
    rMan.Fill( c );
    DBG_ASSERT(c==19, "Ww1Fields"); // sollte auch beginn sein
    if (pData->chGet()==19 && c == 19)
    {
        String aStr;
        c = rMan.Fill( aStr, GetLength() );
        DBG_ASSERT(Ww1PlainText::IsChar(c), "Ww1Fields");
        xub_StrLen pos = aStr.Search(' ');
        // get type out of text
        sType = aStr.Copy( 0, pos );
        aStr.Erase( 0, pos );
        if ( pos != STRING_NOTFOUND )
            aStr.Erase(0, 1);
        sFormel += aStr;
        BYTE rbType = pData->fltGet();
        do {
        // solange den formelteil einlesen, bis das feld entweder
        // zuende ist oder der ergebnisteil beginnt. dabei koennen
        // natuerlich neue felder beginnen (word unterstuetzt felder,
        // die wiederum felder beinhalten).
            (*this)++;
            pData = GetData();
            if (pData->chGet()==19) // nested field
            {
                Out(rOut, rMan, nDepth+1);
                rMan.Fill(c);
                DBG_ASSERT(c==21, "Ww1PlainText");
                sFormel.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "Ww" ));
                sFormel += String::CreateFromInt32( nPlcIndex );
                c = rMan.Fill(aStr, GetLength());
                DBG_ASSERT(Ww1PlainText::IsChar(c), "Ww1PlainText");
                sFormel += aStr;
            }
        }
        while (pData->chGet()==19);

        // get format out of text
        pos = sFormel.SearchAscii( "\\*" );
        sFormat = sFormel.Copy( pos );
        sFormel.Erase( pos );

        pos = sFormel.SearchAscii( "\\@" );
        sDTFormat = sFormel.Copy( pos );
        sFormel.Erase( pos );

        // der formelteil ist zuende, kommt ein ergebnisteil?
        if( pData->chGet() == 20 )
        {
            rMan.Fill( c );
            DBG_ASSERT(c==20, "Ww1PlainText");
            c = rMan.Fill(sErgebnis, GetLength());
            if (!Ww1PlainText::IsChar(c))
                sErgebnis += c; //~ mdt: sonderzeichenbenhandlung
            (*this)++;
            pData = GetData();
        }
        DBG_ASSERT(pData->chGet()==21, "Ww1PlainText");
        BOOL bKnown = TRUE;
        DBG_ASSERT(pField==0, "Ww1PlainText");
        if (pField != 0)
        {
            rOut << *pField;
            delete pField;
            pField = 0;
        }
// naja, aber info enthaelt alle moeglichkeiten, die auch direkt da sind
oncemore:
        switch (rbType)
        {
        case 3: // bookmark reference
            rOut.ConvertUStr( sFormel );
            pField = new SwGetRefField( (SwGetRefFieldType*)
                rOut.GetSysFldType( RES_GETREFFLD ),
                sFormel,
                REF_BOOKMARK,
                0,
                REF_CONTENT );
//          pField = new SwGetExpField((SwGetExpFieldType*)
//           rOut.GetSysFldType(RES_GETEXPFLD), sFormel, GSE_STRING);
//           ,
//           GSE_STRING, VVF_SYS);
        break;
        case 6: // set command
        {
            pos = aStr.Search(' ');
            String aName( aStr.Copy( 0, pos ));
            aStr.Erase(0, pos );
            aStr.Erase(0, 1);
            if( !aName.Len() )
                break;
            rOut.ConvertUStr( aName );
            SwFieldType* pFT = rOut.GetDoc().InsertFldType(
                SwSetExpFieldType( &rOut.GetDoc(), aName, GSE_STRING ) );
            pField = new SwSetExpField((SwSetExpFieldType*)pFT, aStr);
            ((SwSetExpField*)pField)->SetSubType(SUB_INVISIBLE);
// Invisible macht in 378 AErger, soll aber demnaechst gehen

            // das Ignorieren des Bookmarks ist nicht implementiert
        }
        break;
#if 0               // noch nicht fertig, daher disabled
        case 8: // create index
        case 13: // create table of contents
        {
            TOXTypes eTox;                              // Baue ToxBase zusammen
            switch( rbType ){
                case  8: eTox = TOX_INDEX; break;
                case 13: eTox = TOX_CONTENT; break;
                default: eTox = TOX_USER; break;
            }
            USHORT nCreateOf = ( eTox == TOX_CONTENT ) ? ( TOX_MARK | TOX_OUTLINELEVEL )
                                                    : TOX_MARK;
            BYTE nNum = 0;      // wird z.Zt. nicht ausgewertet
            const SwTOXType* pType = rOut.GetDoc().GetTOXType( eTox, nNum );
            SwForm aForm( eTox );
            SwTOXBase* pBase = new SwTOXBase( pType, aForm, nCreateOf, aEmptyStr );
                                        // Name des Verzeichnisses
            switch( eTox ){
            case TOX_INDEX:   pBase->SetOptions( TOI_SAME_ENTRY | TOI_FF | TOI_CASE_SENSITIVE );
                            break;
            case TOX_CONTENT: break;
            case TOX_USER:    break;
            }                                           // ToxBase fertig

            rOut.GetDoc().SetUpdateTOX( TRUE );         // Update fuer TOX anstossen
            rOut << SwFltTOX( pBase );
            rOut.EndItem(RES_FLTR_TOX);
        }
        break;
#endif
        case 14: // info var
        {
            pos = aStr.Search(' ');
            String aSubType( aStr.Copy( 0, pos ));
            aStr.Erase(0, pos );
            aStr.Erase(0, 1);
            rOut.ConvertUStr( aSubType );


            // ganz grosze schiete: der typ 'info' kann einem der
            // typen 15..31 entsprechen. er enthaelt als formel
            // das eingentliche feld der doc-info.
            // kein ';' benutzen mit folgendem macro:
#define IS(sd, se, t) \
    if (aSubType.EqualsAscii( sd ) || aSubType.EqualsAscii( se)) \
        rbType = t; \
    else

            // deutsche bez.     englische bez.    typ-code
            IS("titel",          "title",          15)
            IS("thema",          "subject",        16)
            IS("autor",          "author",         17)
            IS("stichw?rter",    "keywords",       18) //~ mdt: umlaut
            IS("kommentar",      "comment",        19)
            IS("gespeichertvon", "lastrevisedby",  20)
            IS("ertelldat",      "creationdate",   21)
            IS("speicherdat",    "revisiondate",   22)
            IS("druckdat",       "printdate",      23)
            IS("version",        "revisionnumber", 24)
            IS("zeit",           "edittime",       25)
            IS("anzseit",        "numberofpages",  26)
            IS("anzw?rter",      "numberofwords",  27) //~ mdt: umlaut
            IS("anzzeichen",     "numberofchars",  28)
            IS("dateiname",      "filename",       29)
            IS("vorlage",        "templatename",   30)
                bKnown = FALSE;
#undef IS
            if (rbType != 14)
                goto oncemore;
        }
        break;
        case 15: // title
            pField = new SwDocInfoField((SwDocInfoFieldType*)
             rOut.GetSysFldType(RES_DOCINFOFLD), DI_TITEL, 0);
        break;
        case 16: // subject
            pField = new SwDocInfoField((SwDocInfoFieldType*)
             rOut.GetSysFldType(RES_DOCINFOFLD), DI_THEMA, 0);
        break;
        case 17: // author
            pField = new SwAuthorField((SwAuthorFieldType*)
             rOut.GetSysFldType(RES_AUTHORFLD), AF_NAME);
        break;
        case 18: // keywords
            pField = new SwDocInfoField((SwDocInfoFieldType*)
             rOut.GetSysFldType(RES_DOCINFOFLD), DI_KEYS, 0);
        break;
        case 19: // comments
            pField = new SwDocInfoField((SwDocInfoFieldType*)
             rOut.GetSysFldType(RES_DOCINFOFLD), DI_COMMENT, 0);
        break;
        case 20: // last revised by
            pField = new SwDocInfoField((SwDocInfoFieldType*)
             rOut.GetSysFldType(RES_DOCINFOFLD), DI_CHANGE|DI_SUB_AUTHOR);
        break;
        case 21: // creation date
        case 22: // revision date
        case 23: // print date
        case 25:{// edit time
                    USHORT nSub;
                    USHORT nReg = 0;    // RegInfoFormat, DefaultFormat fuer DocInfoFelder

                    switch( rbType )
                    {
                        case 21: nSub = DI_CREATE;  nReg = DI_SUB_DATE; break;
                        case 23: nSub = DI_PRINT;   nReg = DI_SUB_DATE; break;
                        case 22: nSub = DI_CHANGE;  nReg = DI_SUB_DATE; break;
                        case 25: nSub = DI_CHANGE;  nReg = DI_SUB_TIME; break;
                    }
                    switch( GetTimeDatePara( sDTFormat ) )
                    {
                        case WW_DATE: nReg = DI_SUB_DATE; break;
                        case WW_TIME: nReg = DI_SUB_TIME; break;
                        case WW_BOTH: nReg = DI_SUB_DATE; break;
                        // WW_DONTKNOW -> Default bereits gesetzt
                    }
                    pField = new SwDocInfoField((SwDocInfoFieldType*)
                        rOut.GetSysFldType(RES_DOCINFOFLD), nSub | nReg);
                }
        break;
        case 24: // revision number
            pField = new SwDocInfoField((SwDocInfoFieldType*)
             rOut.GetSysFldType(RES_DOCINFOFLD),  DI_DOCNO, 0);
        break;
        case 26: // number of pages
            pField = new SwDocStatField((SwDocStatFieldType*)
             rOut.GetSysFldType(RES_DOCSTATFLD), DS_PAGE, SVX_NUM_ARABIC);
        break;
        case 27: // number of words
            pField = new SwDocStatField((SwDocStatFieldType*)
             rOut.GetSysFldType(RES_DOCSTATFLD), DS_WORD, SVX_NUM_ARABIC);
        break;
        case 28: // number of chars
            pField = new SwDocStatField((SwDocStatFieldType*)
             rOut.GetSysFldType(RES_DOCSTATFLD), DS_CHAR, SVX_NUM_ARABIC);
        break;
        case 29: // file name
            pField = new SwFileNameField((SwFileNameFieldType*)
             rOut.GetSysFldType(RES_FILENAMEFLD));
        break;
        case 30: // doc template name
            pField = new SwTemplNameField((SwTemplNameFieldType*)
             rOut.GetSysFldType(RES_TEMPLNAMEFLD), FF_NAME);
        break;
        case 31:
        case 32:{
                    SwDateFormat aDate = DF_SSYS;
                    SwTimeFormat aTime = TF_SYSTEM;

                    WWDateTime eDT = GetTimeDatePara(sDTFormat, &aTime, &aDate);
                    if( eDT == WW_DONTKNOW )        // kein D/T-Formatstring
                        eDT = ( rbType == 32 ) ? WW_TIME : WW_DATE;    // benutze ID

                    if( eDT & WW_DATE )
                    {
                        USHORT nWhich = RES_DATEFLD;
                        USHORT nSubType = DATEFLD;
                        ULONG nFormat = aDate;
                        sw3io_ConvertFromOldField( rOut.GetDoc(),
                            nWhich, nSubType, nFormat, 0x0110 );
                        pField = new SwDateTimeField((SwDateTimeFieldType*)
                            rOut.GetSysFldType(RES_DATETIMEFLD), DATEFLD, nFormat);

                        if( eDT == WW_BOTH )
                            rOut << * pField << ' ';
                                // Mogel: direkt einfuegen und Space dahinter
                    }
                    if( eDT & WW_TIME )
                    {
                        USHORT nWhich = RES_TIMEFLD;
                        USHORT nSubType = TIMEFLD;
                        ULONG nFormat = aTime;
                        sw3io_ConvertFromOldField( rOut.GetDoc(),
                            nWhich, nSubType, nFormat, 0x0110 );
                        pField = new SwDateTimeField((SwDateTimeFieldType*)
                            rOut.GetSysFldType(RES_DATETIMEFLD), TIMEFLD, nFormat);
                    }

                }
        break;
        case 33: // current page
            pField = new SwPageNumberField((SwPageNumberFieldType*)
             rOut.GetSysFldType(RES_PAGENUMBERFLD), PG_RANDOM, SVX_NUM_ARABIC);
        break;
        case 34: // evaluation exp
        {
            if (nDepth == 0)
            {
                SwGetExpFieldType* p =
                 (SwGetExpFieldType*)rOut.GetSysFldType(RES_GETEXPFLD);
                DBG_ASSERT(p!=0, "Ww1Fields");
                if (p != 0)
                    pField = new SwGetExpField(p, sFormel,
                     GSE_STRING, VVF_SYS);
            }
            else // rekursion:
            {
                String aName( String::CreateFromAscii(
                                        RTL_CONSTASCII_STRINGPARAM( "Ww" )));
                aName += String::CreateFromInt32( nPlcIndex );
                SwFieldType* pFT = rOut.GetDoc().GetFldType( RES_SETEXPFLD,
                                                            aName);
                if (pFT == 0)
                {
                    SwSetExpFieldType aS(&rOut.GetDoc(), aName, GSE_FORMULA);
                    pFT = rOut.GetDoc().InsertFldType(aS);
                }
                SwSetExpField aFld((SwSetExpFieldType*)pFT, sFormel);
                aFld.SetSubType(SUB_INVISIBLE);
                rOut << aFld;
            }
        }
        break;
        case 36: // print command, Einfuegendatei
        {
            pos = aStr.Search(' ');
            String aFName( aStr.Copy( 0, pos ));
            aStr.Erase(0, pos );
            aStr.Erase(0, 1);
            if( !aFName.Len() )
                break;
            aFName.SearchAndReplaceAscii( "\\\\", String( '\\' ));

//          char* pBook = FindNextPara( pNext, 0 );     //!! Bookmark/Feld-Name
//                                                      //!! erstmal nicht

//          ConvertFFileName( aPara, pFName );          //!! WW1 ????
            aFName = INetURLObject::RelToAbs( aFName );

            String aName( String::CreateFromAscii(
                                        RTL_CONSTASCII_STRINGPARAM( "WW" )));
            SwSection* pSection = new SwSection( FILE_LINK_SECTION,
                rOut.GetDoc().GetUniqueSectionName( &aStr ) );
            pSection->SetLinkFileName( aFName );
            pSection->SetProtect( TRUE );
            rOut << SwFltSection( pSection );
            rOut.EndItem( RES_FLTR_SECTION );
            rOut.NextParagraph();
        }
        case 37: // page ref
            pField = new SwGetRefField(
             (SwGetRefFieldType*)rOut.GetSysFldType(RES_GETREFFLD),
             sFormel, 0, 0, REF_PAGE);
        break;
        case 38: // ask command
        {
            pos = aStr.Search(' ');
            String aName( aStr.Copy( 0, pos ));
            aStr.Erase(0, pos );
            aStr.Erase(0, 1);
            if( !aName.Len() )
                break;

            SwFieldType* pFT = rOut.GetDoc().InsertFldType(
                SwSetExpFieldType( &rOut.GetDoc(), aName, GSE_STRING ) );
            pField = new SwSetExpField((SwSetExpFieldType*)pFT, aStr );
            ((SwSetExpField*)pField)->SetInputFlag( TRUE );
            ((SwSetExpField*)pField)->SetSubType(SUB_INVISIBLE);
//          pField.SetPromptText( aQ ); //!! fehlt noch
//          aFld.SetPar2( aDef );       //!! dito
            // das Ignorieren des Bookmarks ist nicht implementiert
        }
        case 39: // fillin command
            pField = new SwInputField(
                (SwInputFieldType*)rOut.GetSysFldType( RES_INPUTFLD ),
                aEmptyStr, sFormel,
                INP_TXT, 0 );       // sichtbar ( geht z.Zt. nicht anders )
        break;
        case 51: // macro button
        {
            pos = aStr.Search(' ');
            String aName( aStr.Copy( 0, pos ));
            aStr.Erase(0, pos );
            aStr.Erase(0, 1);
            if( !aName.Len() || !aStr.Len() )
                break;
            aName.InsertAscii( "StarOffice.Standard.Modul1.", 0 );

            pField = new SwMacroField( (SwMacroFieldType*)
                            rOut.GetSysFldType( RES_MACROFLD ),
                            aName, aStr );
        }
        break;
        case 55: // read tiff / or better: import anything
        {
            const sal_Unicode* pFormel = sFormel.GetBuffer();
            const sal_Unicode* pDot = 0;
            String sName;
            while (*pFormel != '\0' && *pFormel != ' ')
            {
                // ab hier koennte eine extension kommen
                if (*pFormel == '.')
                    pDot = pFormel;
                else
                    // aha: wir waren bislang noch in dirs
                    if (*pFormel == '\\')
                    {
                        pDot = 0;
                        if (pFormel[1] == '\\')
                            pFormel++;
                    }
                if (*pFormel != '\0')
                    sName += *pFormel++;
            }
            if( pDot )
            {
                String sExt;
                while( *pDot != '\0' && *pDot != ' ')
                    sExt += *pDot++;

                if( sExt.EqualsIgnoreCaseAscii( ".tiff" )
                 || sExt.EqualsIgnoreCaseAscii( ".bmp" )
                 || sExt.EqualsIgnoreCaseAscii( ".gif" )
                 || sExt.EqualsIgnoreCaseAscii( ".pcx" )
                 || sExt.EqualsIgnoreCaseAscii( ".pic" ))
                    rOut.AddGraphic( sName );
                else
                    bKnown = FALSE;
            }
            else
                bKnown = FALSE;
        }
        break;
        default: // unknown
            DBG_ASSERT(FALSE, "Ww1PlainText");
        // unsupported:
        case 1: // unknown
        case 2: // possible bookmark
        case 4: // index entry
        // wwpar5: 1351/1454
        case 5: // footnote ref
//          pField = new SwGetRefField(
//           (SwGetRefFieldType*)rDoc.GetSysFldType(RES_GETREFFLD),
//           sFormel, REF_FOOTNOTE, 0, REF_BEGIN);
        case 7: // if command
        case 8: // create index
        // wwpar5: 1351/1454
        case 9: // table of contents entry
        // wwpar5: 1351/1454
        case 10: // style ref
        case 11: // doc ref
        case 12: // seq ref
        case 13: // create table of contents
        // wwpar5: 1351/1454
        case 35: // literal text
        // print merge:
        case 40: // data command
        case 41: // next command
        case 42: // nextif command
        case 43: // skipif command
        case 44: // number of record
        //
        case 45: // dde ref
        case 46: // dde auto ref
        case 47: // glossary entry
        case 48: // print char
        case 49: // formula def
        case 50: // goto button
        case 52: // auto number outline
        case 53: // auto number legal
        case 54: // auto number arabic
            bKnown = FALSE;
        break;
        }
        if( bKnown || sErgebnis.EqualsAscii( "\0270" ))
            this->sErgebnis.Erase();
        else
            this->sErgebnis = sErgebnis;
    }
    else // oops: we are terribly wrong: skip this
        (*this)++;
}

ULONG Ww1Fields::GetLength()
{
// berechnet die laenge eines feldteiles. nicht mitgerechnet werden
// die terminierenden zeichen im text (19, 20, 21) die beginn, trenner
// und ende bedeuten.
    ULONG ulBeg = Where();
    ULONG ulEnd = Where(nPlcIndex+1);
    DBG_ASSERT(ulBeg<ulEnd, "Ww1Fields");
    return (ulEnd - ulBeg) - 1;
}

/////////////////////////////////////////////////////////////////// Sep
void Ww1Sep::Start(Ww1Shell& rOut, Ww1Manager& rMan)
{
    if (rMan.Where() >= Where())
    {
        rOut.NextSection();
        SwFrmFmt &rFmt = rOut.GetPageDesc().GetMaster();
        W1_DOP& rDOP = rMan.GetDop().GetDOP();
        rOut.GetPageDesc().SetLandscape(rDOP.fWideGet());
        SwFmtFrmSize aSz(rFmt.GetFrmSize());
        aSz.SetWidth(rDOP.xaPageGet());
        aSz.SetHeight(rDOP.yaPageGet());
        rFmt.SetAttr(aSz);
        SvxLRSpaceItem aLR(rDOP.dxaLeftGet()+rDOP.dxaGutterGet(),
         rDOP.dxaRightGet());
        rFmt.SetAttr(aLR);
        SvxULSpaceItem aUL(rDOP.dyaTopGet(), rDOP.dyaBottomGet());
        rFmt.SetAttr(aUL);
    // sobald wir mit dem lesen der zeichen soweit sind, wo sep's
    // momentanes attribut beginnt, wird dieses attribut eingefuegt.
    // diese methode ist bei den meisten start/stop methoden der
    // memberklassen des managers identisch.
        BYTE* p = GetData();
        Ww1SprmSep aSprm(rFib, SVBT32ToLong(p+2));
        aSprm.Start(rOut, rMan);
        aSprm.Stop(rOut, rMan);
        (*this)++;
        aHdd.Start(rOut, rMan);
    }
}

/////////////////////////////////////////////////////////////////// Pap
void Ww1Pap::Start(Ww1Shell& rOut, Ww1Manager& rMan)
{
    if (rMan.Where() >= Where())
    {
        BYTE* p;
        USHORT cb;
    // bereitstellen der zu startenden attribute
        if (FillStart(p, cb))
        {
            Ww1SprmPapx aSprm(p, cb);
        // und ausgeben:
            aSprm.Start(rOut, rMan);
        }
        (*this)++;
    }
}

void Ww1Pap::Stop(Ww1Shell& rOut, Ww1Manager& rMan, sal_Unicode&)
{
#ifdef DEBUG
    ULONG ulMan = rMan.Where();
    ULONG ulPap = Where();
    BOOL bIsStopAll = rMan.IsStopAll();
#endif
    if (rMan.Where() >= Where() || rMan.IsStopAll())
    {
        BYTE* p;
        USHORT cb;
        if (FillStop(p, cb)){
            Ww1SprmPapx aSprm(p, cb);
            aSprm.Stop(rOut, rMan);
        }else{
            DBG_ASSERT( !nPlcIndex || rMan.IsStopAll(), "Pap-Attribut-Stop verloren" );
//          rMan.IsStopAll() ist nicht schoen.
        }
    }
}

//////////////////////////////////////////////////////////////// W1_CHP
//
// momentan laesst sich die ausgabe von W1CHPxen nicht nur per define
// loesen....
//
void W1_CHP::Out(Ww1Shell& rOut, Ww1Manager& rMan)
{
    if (fBoldGet())
        rOut << SvxWeightItem(
            rOut.GetWeightBold()?WEIGHT_NORMAL:WEIGHT_BOLD);
    if (fItalicGet())
        rOut << SvxPostureItem(
            rOut.GetPostureItalic()?ITALIC_NONE:ITALIC_NORMAL);
    if (fStrikeGet())
        rOut << SvxCrossedOutItem(
            rOut.GetCrossedOut()?STRIKEOUT_NONE:STRIKEOUT_SINGLE);
    if (fOutlineGet())
        rOut << SvxContourItem(!rOut.GetContour());
    if (fSmallCapsGet())
        rOut << SvxCaseMapItem(
            rOut.GetCaseKapitaelchen()?SVX_CASEMAP_NOT_MAPPED:SVX_CASEMAP_KAPITAELCHEN);
    if (fCapsGet())
        rOut << SvxCaseMapItem(
            rOut.GetCaseVersalien()?SVX_CASEMAP_NOT_MAPPED:SVX_CASEMAP_VERSALIEN);
    if (fsHpsGet())
            rOut << SvxFontHeightItem(hpsGet() * 10);
    if (fsKulGet())
        switch (kulGet()) {
        case 0: {
                    rOut << SvxUnderlineItem(UNDERLINE_NONE) <<
                        SvxWordLineModeItem(FALSE);
                } break;
        default: DBG_ASSERT(FALSE, "Chpx");
        case 1: {
                    rOut << SvxUnderlineItem(UNDERLINE_SINGLE);
                } break;
        case 2: {
                    rOut << SvxUnderlineItem(UNDERLINE_SINGLE) <<
                    SvxWordLineModeItem(TRUE);
                } break;
        case 3: {
                    rOut << SvxUnderlineItem(UNDERLINE_DOUBLE);
                } break;
        case 4: {
                    rOut << SvxUnderlineItem(UNDERLINE_DOTTED);
                } break;
        }

    if (fsIcoGet())
        switch(icoGet()) {
        default: DBG_ASSERT(FALSE, "Chpx");
        case 0: { rOut.EndItem(RES_CHRATR_COLOR); } break;
        case 1: { rOut << SvxColorItem(Color(COL_BLACK)); } break;
        case 2: { rOut << SvxColorItem(Color(COL_LIGHTBLUE)); } break;
        case 3: { rOut << SvxColorItem(Color(COL_LIGHTCYAN)); } break;
        case 4: { rOut << SvxColorItem(Color(COL_LIGHTGREEN)); } break;
        case 5: { rOut << SvxColorItem(Color(COL_LIGHTMAGENTA)); } break;
        case 6: { rOut << SvxColorItem(Color(COL_LIGHTRED)); } break;
        case 7: { rOut << SvxColorItem(Color(COL_YELLOW)); } break;
        case 8: { rOut << SvxColorItem(Color(COL_WHITE)); } break;
        }
    if (fsSpaceGet()) {
        short sQps = qpsSpaceGet();
        if (sQps > 56)
            sQps = sQps - 64;
        rOut << SvxKerningItem(sQps);
    }
    if (fsPosGet())
        if (hpsPosGet() == 0)
            rOut << SvxEscapementItem(SVX_ESCAPEMENT_OFF);
        else {
            short sHps = hpsPosGet();
            if (sHps > 128)
                sHps =  sHps - 256;
            sHps *= 100;
            sHps /= 24;
            rOut << SvxEscapementItem(sHps, 100);
        }
    if (fsFtcGet()) {
        SvxFontItem aFont(rMan.GetFont(ftcGet()));
        rOut << aFont;
    }
}

/////////////////////////////////////////////////////////////////// Chp
void Ww1Chp::Start(Ww1Shell& rOut, Ww1Manager& rMan)
{
#ifdef DEBUG
    ULONG ulMan = rMan.Where();
    ULONG ulChp = Where();
#endif

    if (rMan.Where() >= Where())
    {
        W1_CHP aChpx;
        if (FillStart(aChpx))
        {
            aChpx.Out(rOut, rMan);
            if (aChpx.fcPicGet())
            {
                Ww1Picture aPic(rMan.GetFib().GetStream(),
                 aChpx.fcPicGet());
                if (!aPic.GetError())
                    aPic.Out(rOut, rMan);
            }
        }
        (*this)++;
    }
}

void Ww1Chp::Stop(Ww1Shell& rOut, Ww1Manager& rMan, sal_Unicode&)
{
    if (rMan.Where() >= Where())
    {
        W1_CHP aChpx;
        if (FillStop(aChpx))
        {
        // zuerst alle toggle-flags
            if (aChpx.fBoldGet())
                rOut.EndItem(RES_CHRATR_WEIGHT);
            if (aChpx.fItalicGet())
                rOut.EndItem(RES_CHRATR_POSTURE);
            if (aChpx.fStrikeGet())
                rOut.EndItem(RES_CHRATR_CROSSEDOUT);
            if (aChpx.fOutlineGet())
                rOut.EndItem(RES_CHRATR_CONTOUR);
            if (aChpx.fSmallCapsGet() || aChpx.fCapsGet())
                rOut.EndItem(RES_CHRATR_CASEMAP);
        // dann alle zahl-werte, diese haben flags, wenn sie gesetzt
        // sind..................
            if (aChpx.fsHpsGet())
                rOut.EndItem(RES_CHRATR_FONTSIZE);
            if (aChpx.fsKulGet())
                rOut.EndItem(RES_CHRATR_UNDERLINE)
                    .EndItem(RES_CHRATR_WORDLINEMODE);
            if (aChpx.fsIcoGet())
                rOut.EndItem(RES_CHRATR_COLOR);
            if (aChpx.fsSpaceGet())
                rOut.EndItem(RES_CHRATR_KERNING);
            if (aChpx.fsPosGet())
                rOut.EndItem(RES_CHRATR_ESCAPEMENT);
            if (aChpx.fsFtcGet())
                rOut.EndItem(RES_CHRATR_FONT);
        }else{
            DBG_ASSERT( !nPlcIndex, "Chp-Attribut-Stop verloren" );
        }
    }
}

///////////////////////////////////////////////////////////////// Style
void Ww1Style::Out(Ww1Shell& rOut, Ww1Manager& rMan)
{
// Zuerst Basis, damit Attribute des Basis-Styles erkannt werden
// first: Base................................................
    if(pParent->GetStyle(stcBase).IsUsed() )    // Basis gueltig ?
        rOut.BaseStyle(stcBase);

// next of all: CHP...............................................
    aChpx.Out(rOut, rMan);
// Last: PAP.......................................................
    if (pPapx)
        pPapx->Start(rOut, rMan);
}

////////////////////////////////////////////////////////// Ww1PlainText
//
// die Out() methoden von plaintext fuer den filter geben eine anzahl
// zeichen aus auf die shell, einen string oder einen char, wieviel
// zeichen ausgegeben werden, bestimmt ulEnd, das das ende bestimmt,
// bis zudem ausgegeben wird. ausserdem beenden die methoden die
// ausgabe bei kontrollzeichen.
// diese sind definiert durch MinChar. alle zeichen mit wert darunter
// gelten als kontroll- zeichen. dafuer gibts die methode IsChar, die
// zurueckgibt, ob es sich um ein standard zeichen handelt. kommt ein
// solches zeichen, wird dieses zeichen zurueckgegeben und die methode
// beendet, auch wenn ulEnd noch nicht erreicht wurde. bei nutzung
// also beachten, dasz wenn !IsChar(Out(...)) gilt, ulEnd unter
// umstaenden nicht erreicht wurde. dann wurde das kontrollzeichen
// zwar (weg-)gelesen, jedoch noch nicht ausgegeben.
//
sal_Unicode Ww1PlainText::Out( Ww1Shell& rOut, ULONG& ulEnd )
{
// gibt die zeichen bis ulEnd aus, es sei den es kommen sonderzeichen
// die eine bedeutung haben wie absatzende oder seitenumbruch.
    if (ulEnd > Count())
        ulEnd = Count();
    while (ulSeek < ulEnd)
    {
        sal_Unicode c = (*this)[ulSeek];
        (*this)++;
        if (Ww1PlainText::IsChar(c))
            rOut << c;
        else
            return c;
    }
    return Ww1PlainText::MinChar;
}

sal_Unicode Ww1PlainText::Out( String& rStr, ULONG ulEnd )
{
// wie Out(Shell..., jedoch ausgabe auf einen string
    rStr.Erase();
    if (ulEnd > Count())
        ulEnd = Count();
    while (ulSeek < ulEnd)
    {
        sal_Unicode c = (*this)[ulSeek];
        (*this)++;
        if( Ww1PlainText::IsChar(c) )
            rStr += c;
        else
            return c;
    }
    return Ww1PlainText::MinChar;
}

//
// hier eruebrigt sich ulEnd...oder?
//
sal_Unicode Ww1PlainText::Out( sal_Unicode& rRead )
{
    rRead = (*this)[ulSeek];
    (*this)++;
    return rRead;
}

/////////////////////////////////////////////////////////// Ww1SprmPapx

void Ww1SprmPapx::Start(Ww1Shell& rOut, Ww1Manager& rMan)
{
    if( !rMan.IsInStyle() ){        // Innerhalb Style gehts ueber die
                                    // normalen Attribute
        if (!rOut.IsInFly()
            && !rOut.IsInTable()    // Nicht innerhalb Tabelle!
            && ( rMan.HasPPc() || rMan.HasPDxaAbs())){ // Fly-Start
            rOut.BeginFly();        // eAnchor );
        }
        if (!rOut.IsInTable() && rMan.HasInTable())
        {
            rOut.BeginTable();
        }
        rOut.SetStyle(aPapx.stcGet());
    }
    Ww1Sprm::Start(rOut, rMan);
}

void Ww1SprmPapx::Stop(Ww1Shell& rOut, Ww1Manager& rMan)
{
    Ww1Sprm::Stop(rOut, rMan);

    if( !rMan.IsInStyle() )         // Innerhalb Style gehts ueber die
    {                               // normalen Attribute
        if (rOut.IsInTable() &&( rMan.IsStopAll() || !rMan.HasInTable()))
            rOut.EndTable();

        if( rOut.IsInFly() &&
            ( rMan.IsStopAll()
                || ( !rMan.HasPPc() && !rMan.HasPDxaAbs()   // Fly-Ende
                    && !rOut.IsInTable())))     // Nicht innerhalb Tabelle!
            rOut.EndFly();
    }
}

///////////////////////////////////////////////////////////////// Fonts
SvxFontItem Ww1Fonts::GetFont(USHORT nFCode)
{
// erzeugen eine fonts im sw-sinne aus den word-strukturen
    FontFamily eFamily = FAMILY_DONTKNOW;
    String aName;
    FontPitch ePitch = PITCH_DONTKNOW;
    rtl_TextEncoding eCharSet = RTL_TEXTENCODING_DONTKNOW;
    switch (nFCode)
    {
// In the Winword 1.x format, the names of the first three fonts were
// omitted from the table and assumed to be "Tms Rmn" (for ftc = 0),
// "Symbol", and "Helv"
    case 0:
         eFamily = FAMILY_ROMAN;
         aName.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "Tms Rmn" ));
         ePitch = PITCH_VARIABLE;
         eCharSet = RTL_TEXTENCODING_MS_1252;
    break;
    case 1:
         aName.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "Symbol" ));
         ePitch = PITCH_VARIABLE;
         eCharSet = RTL_TEXTENCODING_SYMBOL;
    break;
    case 2:
         eFamily = FAMILY_SWISS;
         aName.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "Helv" ));
         ePitch = PITCH_VARIABLE;
         eCharSet = RTL_TEXTENCODING_MS_1252;
    break;
    default:
    {
        W1_FFN* pF = GetFFN(nFCode - 3);
        if (pF != 0)
        {
        // Fontname .........................................
            aName = String( (sal_Char*)pF->szFfnGet(),
                            RTL_TEXTENCODING_MS_1252 );
        // Pitch .............................................
            static FontPitch ePitchA[] =
            {
                PITCH_DONTKNOW, PITCH_FIXED, PITCH_VARIABLE, PITCH_DONTKNOW
            };
            ePitch = ePitchA[pF->prgGet()];
        // CharSet ...........................................
            eCharSet = RTL_TEXTENCODING_MS_1252;
            if (aName.EqualsIgnoreCaseAscii("Symbol")
             || aName.EqualsIgnoreCaseAscii("Symbol Set")
             || aName.EqualsIgnoreCaseAscii("Wingdings")
             || aName.EqualsIgnoreCaseAscii("ITC Zapf Dingbats") )
                eCharSet = RTL_TEXTENCODING_SYMBOL;
        // FontFamily ........................................
            USHORT b = pF->ffGet();
            static FontFamily eFamilyA[] =
            {
                FAMILY_DONTKNOW, FAMILY_ROMAN, FAMILY_SWISS, FAMILY_MODERN,
                FAMILY_SCRIPT, FAMILY_DECORATIVE
            };
            if (b < sizeof(eFamilyA))
                eFamily = eFamilyA[b];
        }
        else
        {
            DBG_ASSERT(FALSE, "WW1Fonts::GetFont: Nicht existenter Font !");
            eFamily = FAMILY_SWISS;
             aName.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "Helv" ));
            ePitch = PITCH_VARIABLE;
            eCharSet = RTL_TEXTENCODING_MS_1252;
        }
    }
    break;
    }
            // Extrawurst Hypo
    if ( SwFltGetFlag( nFieldFlags, SwFltControlStack::HYPO )
         && ( aName.EqualsIgnoreCaseAscii("Helv")
            || aName.EqualsIgnoreCaseAscii("Helvetica") ) )
    {
         aName.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "Helvetica Neue" ));
        if (eFamily==FAMILY_DONTKNOW)
            eFamily = FAMILY_SWISS;
    }
    else
    {
            // VCL matcht die Fonts selber
            // allerdings passiert bei Helv, Tms Rmn und System Monospaced
            // Scheisse, so dass diese ersetzt werden muessen.
            // Nach TH sollen diese durch feste Werte ersetzt werden,
            // also nicht ueber System::GetStandardFont, damit keine
            // Namenslisten auftauchen ( Dieses koennte den User verwirren )
        if( aName.EqualsIgnoreCaseAscii("Helv"))
        {
             aName.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "Helvetica" ));
            if (eFamily==FAMILY_DONTKNOW)
                eFamily = FAMILY_SWISS;
        }
        else if (aName.EqualsIgnoreCaseAscii("Tms Rmn"))
        {
             aName.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "Times New Roman" ));
            if (eFamily==FAMILY_DONTKNOW)
                eFamily = FAMILY_ROMAN;
        }
        else if (aName.EqualsIgnoreCaseAscii("System Monospaced") )
        {
             aName.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "Courier" ));
            ePitch = PITCH_FIXED;
        }
    }
// nun koennen wir den font basteln: .........................
    return SvxFontItem(eFamily, aName, aEmptyStr, ePitch, eCharSet);
}

/////////////////////////////////////////////////////////////////// Dop
void Ww1Dop::Out(Ww1Shell& rOut)
{
    //~ mdt: fehlt
    // aDop.fWidowControlGet(); // keine Absatztrennung fuer einzelne Zeilen
    long nDefTabSiz = aDop.dxaTabGet();
    if (nDefTabSiz < 56)
        nDefTabSiz = 709;

    // wir wollen genau einen DefaultTab
    SvxTabStopItem aNewTab(1, USHORT(nDefTabSiz),SVX_TAB_ADJUST_DEFAULT);
    ((SvxTabStop&)aNewTab[0]).GetAdjustment() = SVX_TAB_ADJUST_DEFAULT;
    rOut.GetDoc().GetAttrPool().SetPoolDefaultItem( aNewTab); //~ mdt: besser (GetDoc)

    SwFrmFmt &rFmt = rOut.GetPageDesc().GetMaster();
    W1_DOP& rDOP = GetDOP();
    rOut.GetPageDesc().SetLandscape(rDOP.fWideGet());
    SwFmtFrmSize aSz(rFmt.GetFrmSize());
    aSz.SetWidth(rDOP.xaPageGet());
    aSz.SetHeight(rDOP.yaPageGet());
    rFmt.SetAttr(aSz);
    SvxLRSpaceItem aLR(rDOP.dxaLeftGet()+rDOP.dxaGutterGet(),
     rDOP.dxaRightGet());
    rFmt.SetAttr(aLR);
    SvxULSpaceItem aUL(rDOP.dyaTopGet(), rDOP.dyaBottomGet());
    rFmt.SetAttr(aUL);

    SwFtnInfo aInfo;
    aInfo = rOut.GetDoc().GetFtnInfo();     // Copy-Ctor privat
                // wo positioniert ? ( 0 == Section, 1 == Page,
                // 2 == beim Text -> Page, 3 == Doc  )
    switch( rDOP.fpcGet() ){
    case 1:
    case 2: aInfo.ePos = FTNPOS_PAGE; break;
    default: aInfo.ePos = FTNPOS_CHAPTER; break;
    }
//  aInfo.eNum = ( rDOP.fFtnRestartGet() ) ? FTNNUM_CHAPTER : FTNNUM_DOC;
    // Da Sw unter Chapter anscheinend was anderes versteht als PMW
    // hier also immer Doc !
    aInfo.eNum = FTNNUM_DOC;
                            // wie neu nummerieren ?
                            // SW-UI erlaubt Nummer nur bei FTNNUM_DOC
    if( rDOP.nFtnGet() > 0 && aInfo.eNum == FTNNUM_DOC )
        aInfo.nFtnOffset = rDOP.nFtnGet() - 1;
    rOut.GetDoc().SetFtnInfo( aInfo );

}

///////////////////////////////////////////////////////////////// Assoc
void Ww1Assoc::Out(Ww1Shell& rOut)
{
    SfxDocumentInfo* pInfo;
    if (rOut.GetDoc().GetpInfo()) //~ mdt: besser (GetDoc)
        pInfo = new SfxDocumentInfo(*rOut.GetDoc().GetpInfo());
    else
        pInfo = new SfxDocumentInfo();
//~ mdt: fehlen: FileNext, Dot, DataDoc, HeaderDoc, Criteria1,
// Criteria2, Criteria3, Criteria4, Criteria5, Criteria6, Criteria7
    pInfo->SetTitle( GetStr(Title) );
    pInfo->SetTheme( GetStr(Subject) );
    pInfo->SetComment( GetStr(Comments) );
    pInfo->SetKeywords( GetStr(KeyWords) );
    pInfo->SetCreated( GetStr(Author) );
    pInfo->SetChanged( GetStr(LastRevBy) );
    rOut.GetDoc().SetInfo(*pInfo);
    delete pInfo;
}

//////////////////////////////////////////////////////////// StyleSheet
void Ww1StyleSheet::OutDefaults(Ww1Shell& rOut, Ww1Manager& rMan, USHORT stc)
{
    switch (stc){
    case 222: // Null
        rOut << SvxFontHeightItem(240);
        rOut << SvxFontItem(rMan.GetFont(2));
        break;
    case 223: // annotation reference
        rOut << SvxFontHeightItem(160);
        break;
    case 224: // annotation text
        rOut << SvxFontHeightItem(200);
        break;
    case 225: // table of contents 8
    case 226: // table of contents 7
    case 227: // table of contents 6
    case 228: // table of contents 5
    case 229: // table of contents 4
    case 230: // table of contents 3
    case 231: // table of contents 2
    case 232: // table of contents 1
        rOut << SvxLRSpaceItem(( 232 - stc ) * 720, 720);
            // Tabulatoren fehlen noch !
        break;
    case 233: // index 7
    case 234: // und index 6
    case 235: // und index 5
    case 236: // und index 4
    case 237: // und index 3
    case 238: // und index 2
        rOut << SvxLRSpaceItem(( 239 - stc ) * 360, 0);
        break;
    case 239: // index 1
        break;
    case 240: // line number
        break;
    case 241: // index heading
        break;
    case 242:  // footer
    case 243:{ // ... und header
            SvxTabStopItem aAttr;
            SvxTabStop aTabStop;
            aTabStop.GetTabPos() = 4535;  // 8 cm
            aTabStop.GetAdjustment() = SVX_TAB_ADJUST_CENTER;
            aAttr.Insert( aTabStop );
            aTabStop.GetTabPos() = 9071;  // 16 cm
            aTabStop.GetAdjustment() = SVX_TAB_ADJUST_RIGHT;
            aAttr.Insert( aTabStop );
            rOut << aAttr;
        }
        break;
    case 244: // footnote reference
        rOut << SvxFontHeightItem(160);
        rOut << SvxEscapementItem(6 * 100 / 24, 100);
        break;
    case 245: // footnote text
        rOut << SvxFontHeightItem(200);
        break;
    case 246: // heading 9
    case 247: // und heading 8
    case 248: // und heading 7
        rOut << SvxLRSpaceItem(720, 0);
        rOut << SvxPostureItem(
                    rOut.GetPostureItalic()?ITALIC_NONE:ITALIC_NORMAL);
        rOut << SvxFontHeightItem(200);
        break;
    case 249: // heading 6
        rOut << SvxLRSpaceItem(720, 0);
        rOut << SvxUnderlineItem(UNDERLINE_SINGLE);
        rOut << SvxFontHeightItem(200);
        break;
    case 250: // heading 5
        rOut << SvxLRSpaceItem(720, 0);
        rOut << SvxWeightItem(rOut.GetWeightBold()?WEIGHT_NORMAL:WEIGHT_BOLD);
        rOut << SvxFontHeightItem(200);
        break;
    case 251: // heading 4
        rOut << SvxLRSpaceItem(360, 0);
        rOut << SvxUnderlineItem(UNDERLINE_SINGLE);
        rOut << SvxFontHeightItem(240);
        break;
    case 252: // heading 3
        rOut << SvxLRSpaceItem(360, 0);
        rOut << SvxWeightItem(rOut.GetWeightBold()?WEIGHT_NORMAL:WEIGHT_BOLD);
        rOut << SvxFontHeightItem(240);
        break;
    case 253: // heading 2
        rOut << SvxULSpaceItem(120, 0);
        rOut << SvxWeightItem(rOut.GetWeightBold()?WEIGHT_NORMAL:WEIGHT_BOLD);
        rOut << SvxFontHeightItem(240);
        rOut << SvxFontItem(rMan.GetFont(2));
        break;
    case 254: // heading 1
        rOut << SvxULSpaceItem(240, 0);
        rOut << SvxWeightItem(rOut.GetWeightBold()?WEIGHT_NORMAL:WEIGHT_BOLD);
        rOut << SvxUnderlineItem(UNDERLINE_SINGLE);
        rOut << SvxFontHeightItem(240);
        rOut << SvxFontItem(rMan.GetFont(2));
        break;
    case 255: // Normal indent
        rOut << SvxLRSpaceItem(720, 0);
        break;
    case 0: // Normal
        rOut << SvxFontHeightItem(200);
        break;
    default: // selbstdefiniert
        rOut << SvxFontHeightItem(200);
        break;
    }
}

void Ww1StyleSheet::OutOne(Ww1Shell& rOut, Ww1Manager& rMan, USHORT stc)
{
    const RES_POOL_COLLFMT_TYPE RES_NONE = RES_POOLCOLL_DOC_END;
    RES_POOL_COLLFMT_TYPE aType = RES_NONE;
//              aType = RES_POOLCOLL_JAKETADRESS; break;
//              aType = RES_POOLCOLL_LISTS_BEGIN; break;
//              aType = RES_POOLCOLL_SENDADRESS; break;
//              aType = RES_POOLCOLL_SIGNATURE; break;
//              aType = RES_POOLCOLL_TEXT_NEGIDENT; break;
//              aType = RES_POOLCOLL_TOX_IDXH; break;
    switch (stc)
    {
    case 222: // Null
        aType = RES_POOLCOLL_TEXT; break;   //???
        break;
    case 223: // annotation reference
        break;
    case 224: // annotation text
        break;
    case 225: // table of contents 8
        aType = RES_POOLCOLL_TOX_CNTNT8; break;
    case 226: // table of contents 7
        aType = RES_POOLCOLL_TOX_CNTNT7; break;
    case 227: // table of contents 6
        aType = RES_POOLCOLL_TOX_CNTNT6; break;
    case 228: // table of contents 5
        aType = RES_POOLCOLL_TOX_CNTNT5; break;
    case 229: // table of contents 4
        aType = RES_POOLCOLL_TOX_CNTNT4; break;
    case 230: // table of contents 3
        aType = RES_POOLCOLL_TOX_CNTNT3; break;
    case 231: // table of contents 2
        aType = RES_POOLCOLL_TOX_CNTNT2; break;
    case 232: // table of contents 1
        aType = RES_POOLCOLL_TOX_CNTNT1; break;
    case 233: // index 7
        break;
    case 234: // index 6
        break;
    case 235: // index 5
        break;
    case 236: // index 4
        break;
    case 237: // index 3
        aType = RES_POOLCOLL_TOX_IDX3; break;
    case 238: // index 2
        aType = RES_POOLCOLL_TOX_IDX2; break;
    case 239: // index 1
        aType = RES_POOLCOLL_TOX_IDX1; break;
    case 240: // line number
        break;
    case 241: // index heading
        break;
    case 242: // footer
        aType = RES_POOLCOLL_FOOTER; break;
    case 243: // header
        aType = RES_POOLCOLL_HEADER; break;
    case 244: // footnote reference
        break;
    case 245: // footnote text
        aType = RES_POOLCOLL_FOOTNOTE; break;
    case 246: // heading 9
        break;
    case 247: // heading 8
        break;
    case 248: // heading 7
        break;
    case 249: // heading 6
        break;
    case 250: // heading 5
        aType = RES_POOLCOLL_HEADLINE5; break;
    case 251: // heading 4
        aType = RES_POOLCOLL_HEADLINE4; break;
    case 252: // heading 3
        aType = RES_POOLCOLL_HEADLINE3; break;
    case 253: // heading 2
        aType = RES_POOLCOLL_HEADLINE2; break;
    case 254: // heading 1
        aType = RES_POOLCOLL_HEADLINE1; break;
    case 255: // Normal indent
        aType = RES_POOLCOLL_TEXT_IDENT; break;
    case 0: // Normal
        aType = RES_POOLCOLL_STANDARD; break;
//      aType = RES_POOLCOLL_TEXT; break;       // Das ist "textkoerper"
    }
    if (aType == RES_NONE)
        rOut.BeginStyle(stc, GetStyle(stc).GetName() );
    else
        rOut.BeginStyle(stc, aType);
    OutDefaults(rOut, rMan, stc);
    GetStyle(stc).Out(rOut, rMan);
    rOut.EndStyle();
//  rMan.SetInApo(FALSE);
}
// OutOneWithBase() liest einen Style mit OutOne() einen Style ein
// Jedoch liest er, wenn noch nicht geschehen, den Basisstyle rekursiv ein
void Ww1StyleSheet::OutOneWithBase(Ww1Shell& rOut, Ww1Manager& rMan,
                                   USHORT stc, BYTE* pbStopRecur )
{
// SH: lineares Einlesen ist Scheisse, da dann BasedOn nicht gesetzt
// werden kann und ausserdem Toggle- und Modify-Attrs (z.B. Tabs ) nicht gehen.

    Ww1Style& rSty = GetStyle(stc);
    USHORT nBase = rSty.GetnBase();
    if( nBase != stc
        && !rOut.IsStyleImported( nBase )
        && GetStyle(nBase).IsUsed()
        && !pbStopRecur[nBase] ){

        pbStopRecur[nBase] = 1;
        OutOneWithBase( rOut, rMan, nBase, pbStopRecur ); // Rekursiv
    }
    OutOne( rOut, rMan, stc );
}

void Ww1StyleSheet::Out(Ww1Shell& rOut, Ww1Manager& rMan)
{
    USHORT stc;
    BYTE bStopRecur[256];
    memset( bStopRecur, FALSE, sizeof(bStopRecur) );

// 1. Durchlauf: Styles mit Basisstyles rekursiv
    for (stc=0;stc<Count();stc++)
        if (GetStyle(stc).IsUsed() && !rOut.IsStyleImported( stc ) )
            OutOneWithBase( rOut, rMan, stc, bStopRecur );

// 2. Durchlauf: Follow-Styles
    for (stc=0;stc<Count();stc++){
        Ww1Style& rSty = GetStyle(stc);
        if ( rSty.IsUsed() ){
            USHORT nNext = rSty.GetnNext();
            if( nNext != stc && GetStyle(nNext).IsUsed() )
                rOut.NextStyle( stc, nNext );
        }
    }
}

////////////////////////////////////////////////////////////// Picture
static ULONG GuessPicSize(W1_PIC* pPic)
{
    long nSize = pPic->lcbGet() - (sizeof(*pPic)-sizeof(pPic->rgb));
    register BYTE* p = pPic->rgbGet();
    USHORT maxx = pPic->mfp.xExtGet();
    USHORT padx = ((maxx + 7) / 8) * 8;
    USHORT maxy = pPic->mfp.yExtGet();
    return 120L + (ULONG)padx * maxy;
}

//
// folgende methode schreibt eine windows-.BMP-datei aus einem
// embeddeten bild in ww-1 dateien
// gelesen wird 4-bit format, geschrieben jedoch 8-bit.
//
void Ww1Picture::WriteBmp(SvStream& rOut)
{
    long nSize = pPic->lcbGet() - (sizeof(*pPic)-sizeof(pPic->rgb));
    register BYTE* p = pPic->rgbGet();
    USHORT maxx = pPic->mfp.xExtGet();
    USHORT padx = ((maxx + 7) / 8) * 8;
    USHORT maxy = pPic->mfp.yExtGet();
    USHORT unknown1 = SVBT16ToShort(p); p+= sizeof(SVBT16); nSize -= sizeof(SVBT16);
    USHORT unknown2 = SVBT16ToShort(p); p+= sizeof(SVBT16); nSize -= sizeof(SVBT16);
    USHORT x = SVBT16ToShort(p); p+= sizeof(SVBT16); nSize -= sizeof(SVBT16);
    DBG_ASSERT(x==maxx, "Ww1Picture");
    USHORT y = SVBT16ToShort(p); p+= sizeof(SVBT16); nSize -= sizeof(SVBT16);
    DBG_ASSERT(y==maxy, "Ww1Picture");
    USHORT planes = SVBT16ToShort(p); p+= sizeof(SVBT16); nSize -= sizeof(SVBT16);
    DBG_ASSERT(planes==1, "Ww1Picture");
    USHORT bitcount = SVBT16ToShort(p); p+= sizeof(SVBT16); nSize -= sizeof(SVBT16);
    DBG_ASSERT(bitcount==4, "Ww1Picture");
    DBG_ASSERT(16*3+padx*maxy/2==nSize, "Ww1Picture");
    SVBT32 tmpLong;
    SVBT16 tmpShort;
    SVBT8 tmpByte;
#define wLong(n) \
    LongToSVBT32(n, tmpLong); \
    if ((rOut.Write(tmpLong, sizeof(SVBT32))) != sizeof(SVBT32)) goto error;
#define wShort(n) \
    ShortToSVBT16(n, tmpShort); \
    if ((rOut.Write(tmpShort, sizeof(SVBT16))) != sizeof(SVBT16)) goto error;
#define wByte(n) \
    ByteToSVBT8(n, tmpByte); \
    if ((rOut.Write(tmpByte, sizeof(SVBT8))) != sizeof(SVBT8)) goto error;
    wByte('B'); wByte('M');
    wLong(54 + 4 * 16 + padx * maxy);
    wLong(0);
    wLong(54 + 4 * 16);
    wLong(40);
    wLong(maxx);
    wLong(maxy);
    wShort(1);
    wShort(8);
    wLong(0);
    wLong(0);
    wLong(0);
    wLong(0);
    wLong(16);
    wLong(16);
    register USHORT i;
    for (i=0;nSize>0&&i<16;i++)
    {
        wByte(*p);
        p++;
        nSize -= sizeof(BYTE);
        wByte(*p);
        p++;
        nSize -= sizeof(BYTE);
        wByte(*p);
        p++;
        nSize -= sizeof(BYTE);
        wByte(0);
    }
    DBG_ASSERT(padx*maxy/2==nSize, "Ww1Picture");
    register USHORT j;
#if 1
    {
        BYTE* pBuf = new BYTE[padx];
        BYTE* q = pBuf;
        for (j=0;nSize>0&&j<maxy;j++)
        {
            register BYTE* q = pBuf;
            for (i=0;nSize>0&&i<maxx;i+=2)
            {
                *q++ = *p>>4;
                *q++ = *p&0xf;
                p++;
                nSize -= sizeof(BYTE);
            }
            for (;i<padx;i+=2)
            {
                *q++ = 0;
                p++;
                nSize -= sizeof(BYTE);
            }
            if(rOut.Write(pBuf, padx) != padx){
                delete pBuf;
                goto error;
            }
        }
        delete pBuf;
    }
#else
    for (j=0;nSize>0&&j<maxy;j++)
    {
        for (i=0;nSize>0&&i<maxx;i+=2)
        {
            wByte(*p>>4);
            wByte(*p&0xf);
            p++;
            nSize -= sizeof(BYTE);
        }
        for (;i<padx;i+=2)
        {
            wByte(0);
            p++;
            nSize -= sizeof(BYTE);
        }
    }
#endif
    DBG_ASSERT(nSize==0, "Ww1Picture");
#undef wLong
#undef wShort
#undef wByte
    rOut.Seek(0);
    return;
error:
    ;
}

void Ww1Picture::Out(Ww1Shell& rOut, Ww1Manager& rMan)
{
    Graphic* pGraphic = 0;
    USHORT mm;
    switch (mm = pPic->mfp.mmGet())
    {
    case 8: // embedded metafile
    {
        SvMemoryStream aOut(8192, 8192);
        aOut.Write(pPic->rgbGet(), pPic->lcbGet() -
         (sizeof(*pPic)-sizeof(pPic->rgb)));
        aOut.Seek(0);
        GDIMetaFile aWMF;
        if (ReadWindowMetafile(aOut, aWMF) && aWMF.GetActionCount() > 0)
        {
            aWMF.SetPrefMapMode(MapMode(MAP_100TH_MM));
            Size aOldSiz(aWMF.GetPrefSize());
            Size aNewSiz(pPic->mfp.xExtGet(), pPic->mfp.yExtGet());
            Fraction aFracX(aNewSiz.Width(), aOldSiz.Width());
            Fraction aFracY(aNewSiz.Height(), aOldSiz.Height());
            aWMF.Scale(aFracX, aFracY);
            aWMF.SetPrefSize(aNewSiz);
            pGraphic = new Graphic(aWMF);
        }
        break;
    }
    case 94: // embedded name SH:??? Was denn nun ? Embeddet oder Name ?
    case 98: // TIFF-Name
    {
        String aDir( (sal_Char*)pPic->rgbGet(),
                (USHORT)(pPic->lcbGet() - (sizeof(*pPic)-sizeof(pPic->rgb))),
                RTL_TEXTENCODING_MS_1252 );
        //SvFileStream aOut(aDir, STREAM_READ|STREAM_WRITE|STREAM_TRUNC);
        rOut.AddGraphic( aDir );
    }
    break;
    case 97: // embedded bitmap
//  case 99: // SH: bei meinem BspDoc 41738.doc auch embedded Bitmap,
             // aber leider anderes Format
    {
        ULONG nSiz = GuessPicSize(pPic);
        SvMemoryStream aOut(nSiz, 8192);
        WriteBmp(aOut);
        Bitmap aBmp;
        aOut >> aBmp;
        pGraphic = new Graphic(aBmp);
    }
    default:
        DBG_ASSERT(pPic->mfp.mmGet() == 97, "Ww1Picture");
    }
    if (pGraphic)
        rOut << *pGraphic;
}

////////////////////////////////////////////////////////// HeaderFooter
void Ww1HeaderFooter::Start(Ww1Shell& rOut, Ww1Manager& rMan)
{
// wird sowieso nur bei SEPs aufgerufen, keine weitere pruefung
// noetig:
    if (!rMan.Pushed())
    {
        while ((*this)++)
            switch (eHeaderFooterMode)
            {
            case FtnSep:
            break;
            case FtnFollowSep:
            break;
            case FtnNote:
            break;
            case EvenHeadL:
            break;
            case OddHeadL:
            {
                ULONG begin;
                ULONG end;
                if (FillOddHeadL(begin, end))
                {
                    Ww1HddText* pText = new Ww1HddText(rMan.GetFib());
                    pText->Seek(begin);
                    pText->SetCount(end-begin);
                    rOut.BeginHeader();
                    rMan.Push1(pText, pText->Offset(rMan.GetFib()), begin,
                     new Ww1HeaderFooterFields(rMan.GetFib()));
                    rOut << rMan;
                    rMan.Pop();
                    rOut.EndHeaderFooter();
                    return;
                }
            }
            break;
            case EvenFootL:
            break;
            case OddFootL:
            {
                ULONG begin;
                ULONG end;
                if (FillOddFootL(begin, end))
                {
                    Ww1HddText* pText = new Ww1HddText(rMan.GetFib());
                    pText->Seek(begin);
                    pText->SetCount(end-begin);
                    rOut.BeginFooter();
                    rMan.Push1(pText, pText->Offset(rMan.GetFib()), begin,
                     new Ww1HeaderFooterFields(rMan.GetFib()));
                    rOut << rMan;
                    rMan.Pop();
                    rOut.EndHeaderFooter();
                    return;
                }
            }
            break;
            case FirstHeadL:
            break;
            }
    }
}

void Ww1HeaderFooter::Stop(Ww1Shell& rOut, Ww1Manager& rMan, sal_Unicode&)
{
    if (!rMan.Pushed() && eHeaderFooterMode != None
//   && rMan.GetText().Where() >= rMan.GetText().Count()
    )
    {
        Start(rOut, rMan);
    }
}

/***********************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ww1/w1filter.cxx,v 1.1.1.1 2000-09-18 17:14:57 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.29  2000/09/18 16:04:56  willem.vandorp
      OpenOffice header added.

      Revision 1.28  2000/05/11 16:06:52  jp
      Changes for Unicode

      Revision 1.27  2000/02/11 14:39:31  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.26  1999/03/16 11:12:24  JP
      Task #63047#: keine Abfrage mehr auf ein SVX_TAB_DEFDIST


      Rev 1.25   16 Mar 1999 12:12:24   JP
   Task #63047#: keine Abfrage mehr auf ein SVX_TAB_DEFDIST

      Rev 1.24   17 Nov 1998 10:48:18   OS
   #58263# NumType durch SvxExtNumType ersetzt

      Rev 1.23   27 Feb 1998 19:29:06   HJS
   SH 27.02.98

      Rev 1.20   09 Dec 1997 17:04:38   JP
   neue InhaltsVerzeichnis Poolvorlagen -> neuer MaxLevel

      Rev 1.19   29 Nov 1997 17:37:10   MA
   includes

      Rev 1.18   21 Nov 1997 17:22:44   OM
   Feldbefehl-Umstellung: DocInfo

      Rev 1.17   14 Oct 1997 14:17:18   OM
   Feldumstellung

      Rev 1.16   09 Oct 1997 14:13:46   JP
   Aenderungen von SH

      Rev 1.15   02 Oct 1997 15:26:00   OM
   Feldumstellung

      Rev 1.14   29 Sep 1997 12:16:56   OM
   Feldumstellung

      Rev 1.13   24 Sep 1997 15:25:24   OM
   Feldumstellung

      Rev 1.12   04 Sep 1997 11:18:00   JP
   include

      Rev 1.11   03 Sep 1997 14:16:58   SH
   Flys, Tabellen ok, Style-Abhaengigkeiten u.v.a.m

      Rev 1.10   15 Aug 1997 12:50:36   OS
   charatr/frmatr/txtatr aufgeteilt

      Rev 1.9   12 Aug 1997 14:16:34   OS
   Header-Umstellung

      Rev 1.8   11 Aug 1997 12:51:02   SH
   Flys und einfache Tabellen und Tabulatoren

      Rev 1.7   17 Jul 1997 15:20:52   MA
   Bitmap Typ 99 geht nicht, abgeklemmt

      Rev 1.6   16 Jun 1997 13:08:56   MA
   Stand Micheal Dietrich

      Rev 1.5   24 Mar 1997 03:04:22   HJS
   fuer os2 auskommentiert

      Rev 1.4   12 Mar 1997 19:12:18   SH
   MDT: Progressbar, Pagedesc-Bug, Spalten, Anfang Tabellen u.a.

      Rev 1.3   10 Jan 1997 18:46:30   SH
   Stabiler und mehr von MDT

      Rev 1.2   28 Nov 1996 18:08:50   SH
   Schneller Schoener Weiter von MDT

      Rev 1.1   30 Sep 1996 23:23:40   SH
   neu von MDT

      Rev 1.0   14 Aug 1996 19:32:28   SH
   Initial revision.


***********************************************************************/
//]})
diff --git a/sw/source/filter/ww1/w1par.cxx b/sw/source/filter/ww1/w1par.cxx
new file mode 100644
index 0000000..a21f47c
--- /dev/null
+++ b/sw/source/filter/ww1/w1par.cxx
@@ -0,0 +1,255 @@
/*************************************************************************
 *
 *  $RCSfile: w1par.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:58 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PCH
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#ifndef _PAM_HXX
#include <pam.hxx>              // fuer SwPam
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _NDTXT_HXX
#include <ndtxt.hxx>            // class SwTxtNode
#endif
#ifndef _FLTINI_HXX
#include <fltini.hxx>           // Ww1Reader
#endif
#ifndef _W1PAR_HXX
#include <w1par.hxx>
#endif

#ifndef _MDIEXP_HXX
#include <mdiexp.hxx>           // StatLine...()
#endif
#ifndef _SWSWERROR_H
#include <swerror.h>            // ERR_WW1_...
#endif
#ifndef _STATSTR_HRC
#include <statstr.hrc>          // ResId fuer Statusleiste
#endif

//----------------------------------------
//    Initialisieren der Feld-FilterFlags
//----------------------------------------

static ULONG WW1_Read_FieldIniFlags()
{
//  USHORT i;
    ULONG nFieldFlags = ReadFilterFlags( "WW1F" );
    if ( SwFltGetFlag( nFieldFlags, SwFltControlStack::HYPO ) )
    {
        SwFltSetFlag( nFieldFlags, SwFltControlStack::BOOK_TO_VAR_REF );
        SwFltSetFlag( nFieldFlags, SwFltControlStack::TAGS_DO_ID );
        SwFltSetFlag( nFieldFlags, SwFltControlStack::TAGS_IN_TEXT );
        SwFltSetFlag( nFieldFlags, SwFltControlStack::ALLOW_FLD_CR );
    }
    return nFieldFlags;
}

////////////////////////////////////////////////// StarWriter-Interface
//
// Eine Methode liefern die call-Schnittstelle fuer den Writer.
// Read() liest eine Datei. hierzu werden zwei Objekte erzeugt, die Shell,
// die die Informationen aufnimmt und der Manager der sie aus der Datei liest.
// Diese werden dann einfach per Pipe 'uebertragen'.
//

ULONG WW1Reader::Read(SwDoc& rDoc, SwPaM& rPam, const String& cName)
{
    ULONG nRet = ERR_SWG_READ_ERROR;
    ASSERT(pStrm!=NULL, "W1-Read ohne Stream");
    if (pStrm != NULL)
    {
        BOOL bNew = !bInsertMode;           // Neues Doc ( kein Einfuegen )

        // erstmal eine shell konstruieren: die ist schnittstelle
        // zum writer-dokument
        ULONG nFieldFlags = WW1_Read_FieldIniFlags();
        Ww1Shell* pRdr = new Ww1Shell( rDoc, rPam, bNew, nFieldFlags );
        if( pRdr )
        {
            // dann den manager, der liest die struktur des word-streams
            Ww1Manager* pMan = new Ww1Manager( *pStrm, nFieldFlags );
            if( pMan )
            {
                if( !pMan->GetError() )
                {
                    ::StartProgress( STR_STATSTR_W4WREAD, 0, 100,
                                        rDoc.GetDocShell() );
                    ::SetProgressState( 0, rDoc.GetDocShell() );
                    // jetzt nur noch alles rueberschieben
                    *pRdr << *pMan;
                    if( !pMan->GetError() )
                        // und nur hier, wenn kein fehler auftrat
                        // fehlerfreiheit melden
                        nRet = 0; // besser waere: WARN_SWG_FEATURES_LOST;
                    ::EndProgress( rDoc.GetDocShell() );
                }
                else
                {
                    if( pMan->GetFib().GetFIB().fComplexGet() )
                        //!!! ACHTUNG: hier muss eigentlich ein Error
                        // wegen Fastsave kommen, das der PMW-Filter
                        // das nicht unterstuetzt. Stattdessen temporaer
                        // nur eine Warnung, bis die entsprechende
                        // Meldung und Behandlung weiter oben eingebaut ist.
//                      nRet = WARN_WW6_FASTSAVE_ERR;
                        // Zum Einchecken mit neuem String:
                        nRet = ERR_WW6_FASTSAVE_ERR;
                }
            }
            delete pMan;
        }
        delete pRdr;
    }
    Ww1Sprm::DeinitTab();
    return nRet;
}

///////////////////////////////////////////////////////////////// Shell
//
// Die Shell ist die Schnittstelle vom Filter zum Writer. Sie ist
// abgeleitet von der mit ww-filter gemeinsam benutzten Shell
// SwFltShell und enthaelt alle fuer ww1 noetigen Erweiterungen. Wie
// in einen Stream werden alle Informationen, die aus der Datei
// gelesen werden, in die shell ge'piped'.
//
Ww1Shell::Ww1Shell( SwDoc& rD, SwPaM& rPam, BOOL bNew, ULONG nFieldFlags)
    : SwFltShell(&rD, rPam, bNew, nFieldFlags)
{
}



/**********************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ww1/w1par.cxx,v 1.1.1.1 2000-09-18 17:14:58 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.20  2000/09/18 16:04:57  willem.vandorp
      OpenOffice header added.

      Revision 1.19  2000/05/15 16:37:48  jp
      Changes for Unicode

      Revision 1.18  2000/05/11 16:07:43  jp
      Changes for Unicode

      Revision 1.17  1998/07/23 09:13:52  JP
      Task #52654#: Einfuegen Doc nicht mit einer CrsrShell sondern mit einen PaM


      Rev 1.16   23 Jul 1998 11:13:52   JP
   Task #52654#: Einfuegen Doc nicht mit einer CrsrShell sondern mit einen PaM

      Rev 1.15   27 Feb 1998 19:29:46   HJS
   SH 27.02.98

      Rev 1.13   29 Nov 1997 17:37:08   MA
   includes

      Rev 1.12   09 Oct 1997 14:13:48   JP
   Aenderungen von SH

      Rev 1.11   04 Sep 1997 12:37:38   JP
   Umstellungen fuer FilterDetection im SwModule und SwDLL

      Rev 1.10   03 Sep 1997 14:14:24   SH
   Flys, Tabellen ok, Style-Abhaengigkeiten u.v.a.m

      Rev 1.9   12 Aug 1997 14:16:36   OS
   Header-Umstellung

      Rev 1.8   11 Aug 1997 14:07:32   OM
   Headerfile-Umstellung

      Rev 1.7   16 Jun 1997 13:08:58   MA
   Stand Micheal Dietrich

      Rev 1.6   12 Mar 1997 19:12:40   SH
   MDT: Progressbar, Pagedesc-Bug, Spalten, Anfang Tabellen u.a.

      Rev 1.5   10 Jan 1997 18:47:12   SH
   Stabiler und mehr von MDT

      Rev 1.4   28 Nov 1996 18:09:18   SH
   Schneller Schoener Weiter von MDT

      Rev 1.3   18 Oct 1996 10:58:36   JP
   aufbreitet fuer PRJPCH

      Rev 1.2   30 Sep 1996 23:24:10   SH
   neu von MDA

      Rev 1.0   14 Aug 1996 19:32:28   SH
   Initial revision.

**********************************************************************/
//]})
diff --git a/sw/source/filter/ww1/w1par.hxx b/sw/source/filter/ww1/w1par.hxx
new file mode 100644
index 0000000..48f8789
--- /dev/null
+++ b/sw/source/filter/ww1/w1par.hxx
@@ -0,0 +1,81 @@
/*************************************************************************
 *
 *  $RCSfile: w1par.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:58 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _W1PAR_HXX
#define _W1PAR_HXX

#ifndef _FLTSHELL_HXX
#include <fltshell.hxx>
#endif
#ifndef _W1CLASS_HXX
#include <w1class.hxx>
#endif

////////////////////////////////////////////////////////////// Ww1Shell
class Ww1Shell : public SwFltShell
{
public:
    Ww1Shell(SwDoc&, SwPaM&, BOOL bNew, ULONG nFieldFlags);
};


#endif

diff --git a/sw/source/filter/ww1/w1sprm.cxx b/sw/source/filter/ww1/w1sprm.cxx
new file mode 100644
index 0000000..130f592
--- /dev/null
+++ b/sw/source/filter/ww1/w1sprm.cxx
@@ -0,0 +1,960 @@
/*************************************************************************
 *
 *  $RCSfile: w1sprm.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:58 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PCH
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#define ITEMID_BOXINFO      SID_ATTR_BORDER_INNER
// std
#include <stdio.h> // sprintf

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#include <tools/solar.h>
#ifndef _SVX_PAPERINF_HXX
#include <svx/paperinf.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_ADJITEM_HXX //autogen
#include <svx/adjitem.hxx>
#endif
#ifndef _SVX_SPLTITEM_HXX //autogen
#include <svx/spltitem.hxx>
#endif
#ifndef _SVX_KEEPITEM_HXX //autogen
#include <svx/keepitem.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_SHADITEM_HXX //autogen
#include <svx/shaditem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _SVX_LSPCITEM_HXX //autogen
#include <svx/lspcitem.hxx>
#endif
#ifndef _SVX_TSTPITEM_HXX //autogen
#include <svx/tstpitem.hxx>
#endif


#ifndef _FMTCLDS_HXX //autogen
#include <fmtclds.hxx>
#endif
#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _PAM_HXX
#include <pam.hxx>
#endif
#ifndef _NDTXT_HXX
#include <ndtxt.hxx>
#endif
#ifndef _CHARATR_HXX
#include <charatr.hxx>
#endif
#ifndef _FRMATR_HXX
#include <frmatr.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _ERRHDL_HXX
#include <errhdl.hxx>
#endif
#ifndef _FLTINI_HXX
#include <fltini.hxx>
#endif
#ifndef _DOCUFLD_HXX
#include <docufld.hxx>
#endif
#ifndef _PAGEDESC_HXX
#include <pagedesc.hxx>
#endif
#ifndef _FLDDAT_HXX
#include <flddat.hxx>
#endif
#ifndef _REFFLD_HXX
#include <reffld.hxx>
#endif
#ifndef _EXPFLD_HXX
#include <expfld.hxx>
#endif
#ifndef _W1PAR_HXX
#include <w1par.hxx>
#endif

#ifndef _MDIEXP_HXX
#include <mdiexp.hxx>
#endif
#ifndef _SWSWERROR_H
#include <swerror.h>
#endif
#ifndef _STATSTR_HRC
#include <statstr.hrc>
#endif

/////////////////////////////////////////////////////////////// Ww1Sprm
void Ww1Sprm::Stop( Ww1Shell& rOut, Ww1Manager& rMan)
{
    if(IsUsed())
//      for(USHORT i=0;i<Count();i++)
        for(short i=Count()-1;i>=0;i--){    // rueckwaerts
            BYTE nId;
            USHORT nSize;
            BYTE* pSprm;
            Fill(i, nId, nSize, pSprm);
            GetTab(nId).Stop(rOut, nId, pSprm, nSize, rMan);
        }
}

void Ww1Sprm::Start(
    Ww1Shell& rOut, Ww1Manager& rMan, USHORT i)
{
    BYTE nId;
    USHORT nSize;
    BYTE* pSprm;
    Fill(i, nId, nSize, pSprm);
    GetTab(nId).Start(rOut, nId, pSprm, nSize, rMan);
}

void Ww1Sprm::Start(
    Ww1Shell& rOut, Ww1Manager& rMan)
{
    if(IsUsed())
        for(USHORT i=0;i<Count();i++)
            Start(rOut, rMan, i);
}

//////////////////////////////////////////////////////////// SingleSprm
void Ww1SingleSprm::Start(
    Ww1Shell&, BYTE nId, BYTE*, USHORT, Ww1Manager&)
{
#ifdef DEBUG
//  ASSERT(FALSE, "Unknown Sprm");
    if (nId)
    {
        char s[200];
        sprintf(s, "%s(%d) Sprm id %d started.",
         __FILE__, __LINE__,(int)nId);
        DBG_ERROR(s);
    }
#endif
}

void Ww1SingleSprm::Stop(
    Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&)
{
//  ASSERT(FALSE, "Unknown Sprm");
}

////////////////////////////////////////////////////////////////// STOP
//
// folgende defines werden genutzt zur implementierung der
// Stop()-Member der SingleSprm-klassen, da diese im normalfalle
// lediglich EndItem(s) in die shell stellen.
//
#define STOP1(Class, Code) \
    void Class::Stop( \
     Ww1Shell& rOut, BYTE, BYTE*, USHORT, Ww1Manager&) { \
        rOut.EndItem(Code); }
#define STOP2(Class, Code1, Code2) \
    void Class::Stop( \
     Ww1Shell& rOut, BYTE, BYTE*, USHORT, Ww1Manager&) { \
        rOut.EndItem(Code1).EndItem(Code2); }

/////////////////////////////////////////////////////// SingleSprmXxxxx
//
// hier beginnt die auswertung der eigentlichen sprms. jeder sprmtyp
// hat eine eigene klasse, die die virtualen methoden start und stop
// implementiert. die klassen stehen in der sprm-tab, die statischer
// member von Ww1Sprm ist. taucht ein sprm im dokument auf, werden die
// virtualen methoden bei beginn und ende der formatierung gerufen.
//
void Ww1SingleSprmPDxaLeft::Start(
    Ww1Shell& rOut, BYTE, BYTE* pSprm, USHORT, Ww1Manager&)
{
    SvxLRSpaceItem aLR((SvxLRSpaceItem&)rOut.GetAttr(RES_LR_SPACE));
    short nPara = SVBT16ToShort(pSprm);
    if(nPara < 0)
        nPara = 0;
    if(aLR.GetTxtFirstLineOfst() < -nPara)
        aLR.SetTxtFirstLineOfst(-nPara); // sonst weigert sich SetTxtLeft()
    aLR.SetTxtLeft(nPara);
    rOut << aLR;
}

void Ww1SingleSprmPDxaRight::Start(
    Ww1Shell& rOut, BYTE, BYTE* pSprm, USHORT, Ww1Manager&)
{
    SvxLRSpaceItem aLR((SvxLRSpaceItem&)rOut.GetAttr(RES_LR_SPACE));
    short nPara = SVBT16ToShort(pSprm);
    if(nPara < 0)
        nPara = 0;
    aLR.SetRight(nPara);
    rOut << aLR;
}

void Ww1SingleSprmPDxaLeft1::Start(
    Ww1Shell& rOut, BYTE, BYTE* pSprm, USHORT, Ww1Manager&)
{
    SvxLRSpaceItem aLR((SvxLRSpaceItem&)rOut.GetAttr(RES_LR_SPACE));
    short nPara = SVBT16ToShort(pSprm);
    if(-nPara >(short)aLR.GetTxtLeft())
        nPara = -(short)aLR.GetTxtLeft();
    aLR.SetTxtFirstLineOfst(nPara);
    rOut << aLR;
}

STOP1(Ww1SingleSprmPDxa, RES_LR_SPACE)

void Ww1SingleSprmPJc::Start(
    Ww1Shell& rOut, BYTE, BYTE* pSprm, USHORT, Ww1Manager&)
{
    static SvxAdjust __READONLY_DATA aAdj[] = {
        SVX_ADJUST_LEFT,
        SVX_ADJUST_CENTER,
        SVX_ADJUST_RIGHT,
        SVX_ADJUST_BLOCK };
    BYTE nPara = SVBT8ToByte(pSprm);
    nPara %=(sizeof(aAdj)/sizeof(*aAdj));
    rOut << SvxAdjustItem(aAdj[nPara]);
}

STOP1(Ww1SingleSprmPJc, RES_PARATR_ADJUST)

void Ww1SingleSprmPFKeep::Start(
    Ww1Shell& rOut, BYTE, BYTE* pSprm, USHORT, Ww1Manager&)
{
    rOut << SvxFmtSplitItem((SVBT8ToByte(pSprm) & 1) == 0);
}

STOP1(Ww1SingleSprmPFKeep, RES_PARATR_SPLIT)

void Ww1SingleSprmPFKeepFollow::Start(
    Ww1Shell& rOut, BYTE, BYTE* pSprm, USHORT, Ww1Manager&)
{
    rOut << SvxFmtKeepItem((SVBT8ToByte(pSprm) & 1) != 0);
}

STOP1(Ww1SingleSprmPFKeepFollow, RES_KEEP)

void Ww1SingleSprmPPageBreakBefore::Start(
    Ww1Shell& rOut, BYTE, BYTE* pSprm, USHORT, Ww1Manager&)
{
    rOut << SvxFmtBreakItem(SVBT8ToByte(pSprm) & 1?
     SVX_BREAK_PAGE_BEFORE:SVX_BREAK_NONE );
}

STOP1(Ww1SingleSprmPPageBreakBefore, RES_BREAK)

SvxBorderLine* Ww1SingleSprmPBrc::SetBorder(SvxBorderLine* pLine, W1_BRC10* pBrc)
{
    USHORT nCode;
    if(pBrc->dxpLine2WidthGet() == 0)
    {
        switch(pBrc->dxpLine1WidthGet())
        {
        default: ASSERT(FALSE, "unknown linewidth");
        case 0: return 0;                           // keine Linie
        case 1: nCode = DEF_LINE_WIDTH_0; break;
        case 2: nCode = DEF_LINE_WIDTH_1; break;
        case 3: nCode = DEF_LINE_WIDTH_2; break;
        case 4: nCode = DEF_LINE_WIDTH_3; break;
        case 5: nCode = DEF_LINE_WIDTH_4; break;
        }
        pLine->SetOutWidth(nCode);
        pLine->SetInWidth(0);
    }
    else
    {
        switch(pBrc->dxpLine1WidthGet())
        {
        default: ASSERT(FALSE, "unknown linewidth");
        case 1: nCode = DEF_DOUBLE_LINE0_IN; break;
        }
        pLine->SetOutWidth(nCode);
        switch(pBrc->dxpLine2WidthGet())
        {
        default: ASSERT(FALSE, "unknown linewidth");
        case 1: nCode = DEF_DOUBLE_LINE0_OUT; break;
        }
        pLine->SetInWidth(nCode);
    }
    switch(pBrc->dxpLine1WidthGet())
    {
    default: ASSERT(FALSE, "unknown space");
    case 0: nCode = DEF_DOUBLE_LINE0_DIST; break;
    case 1: nCode = DEF_DOUBLE_LINE1_DIST; break;
    case 2: nCode = DEF_DOUBLE_LINE2_DIST; break;
    case 3: nCode = DEF_DOUBLE_LINE3_DIST; break;
    }
    pLine->SetDistance(nCode);
    return pLine;
}
#if 0
SvxBorderLine* Ww1SingleSprmPBrc::SetBorder(SvxBorderLine* pLine, W1_BRC* pBrc)
{
    static USHORT __READONLY_DATA nOutTab[] = { // Aussenlinie
        DEF_LINE_WIDTH_0, DEF_LINE_WIDTH_0,     // No Line -> hair line
        DEF_LINE_WIDTH_0, DEF_LINE_WIDTH_0,
        DEF_LINE_WIDTH_0, DEF_LINE_WIDTH_0,
        DEF_LINE_WIDTH_0, DEF_LINE_WIDTH_0,     // Single Thin Dotted / Dashed
        DEF_LINE_WIDTH_0, DEF_LINE_WIDTH_0,     // Single Line thin(Idx * 15tw)
        DEF_LINE_WIDTH_1, DEF_LINE_WIDTH_2,
        DEF_LINE_WIDTH_2, DEF_LINE_WIDTH_3,
        DEF_LINE_WIDTH_0, DEF_LINE_WIDTH_0,     // Single Thin Dotted / Dashed
        DEF_LINE_WIDTH_0, DEF_LINE_WIDTH_1,     // Single Line thick(Idx * 30tw)
        DEF_LINE_WIDTH_2, DEF_LINE_WIDTH_3,
        DEF_LINE_WIDTH_4, DEF_LINE_WIDTH_4,
        DEF_LINE_WIDTH_1, DEF_LINE_WIDTH_1,     // Single Thick Dotted / Dashed
        DEF_DOUBLE_LINE0_OUT, DEF_DOUBLE_LINE0_OUT, // Double Line(Idx * 15tw)
        DEF_DOUBLE_LINE1_OUT, DEF_DOUBLE_LINE2_OUT,
        DEF_DOUBLE_LINE2_OUT, DEF_DOUBLE_LINE3_OUT,
        DEF_DOUBLE_LINE0_OUT, DEF_DOUBLE_LINE0_OUT }; // Double Dotted / Dashed
    static USHORT __READONLY_DATA nInTab[] = {  // Innenlinie
        0, 0, 0, 0, 0, 0, 0, 0,                 // No line / dotted / dashed
        0, 0, 0, 0, 0, 0, 0, 0,                 // Single Line thin(Idx * 15tw)
        0, 0, 0, 0, 0, 0, 0, 0,                 // Single Line thick(Idx * 30tw)
        DEF_DOUBLE_LINE0_IN, DEF_DOUBLE_LINE0_IN,   // Double Line(Idx * 15tw)
        DEF_DOUBLE_LINE1_IN, DEF_DOUBLE_LINE2_IN,
        DEF_DOUBLE_LINE2_IN, DEF_DOUBLE_LINE3_IN,
        DEF_DOUBLE_LINE0_IN, DEF_DOUBLE_LINE0_IN }; // Double Dotted / Dashed
    static USHORT __READONLY_DATA nDistTab[] = { // Abstand der Linien
        0, 0, 0, 0, 0, 0, 0, 0,                 // No line / dotted / dashed
        0, 0, 0, 0, 0, 0, 0, 0,                 // Single Line thin(Idx * 15tw)
        0, 0, 0, 0, 0, 0, 0, 0,                 // Single Line thick(Idx * 30tw)
        DEF_DOUBLE_LINE0_DIST, DEF_DOUBLE_LINE0_DIST, // Double Line(Idx * 15tw)
        DEF_DOUBLE_LINE1_DIST, DEF_DOUBLE_LINE2_DIST,
        DEF_DOUBLE_LINE2_DIST, DEF_DOUBLE_LINE3_DIST,
        DEF_DOUBLE_LINE0_DIST, DEF_DOUBLE_LINE0_DIST }; // Double Dotted / Dashed
    short nIdx = pBrc->dxpLineWidthGet() + 8 * pBrc->brcTypeGet();
    pLine->SetOutWidth(nOutTab[nIdx]);
    pLine->SetInWidth(nInTab[nIdx]);
    pLine->SetDistance(nDistTab[nIdx]);
    if(pBrc->icoGet())
    {
        ColorName nIdx;
        switch(pBrc->icoGet())
        {
        default: ASSERT(FALSE, "unknown color code");
        case 0:
        case 1: nIdx = COL_BLACK; break;
        case 2: nIdx = COL_LIGHTBLUE; break;
        case 3: nIdx = COL_LIGHTCYAN; break;
        case 4: nIdx = COL_LIGHTGREEN; break;
        case 5: nIdx = COL_LIGHTMAGENTA; break;
        case 6: nIdx = COL_LIGHTRED; break;
        case 7: nIdx = COL_YELLOW; break;
        case 8: nIdx = COL_WHITE; break;
        }
        Color aCol(nIdx);
        pLine->SetColor(aCol);
    }
    return pLine;
}
#endif

void Ww1SingleSprmPBrc::Start(
    Ww1Shell& rOut, BYTE, W1_BRC10* pBrc, USHORT nSize, Ww1Manager& rMan, SvxBoxItem& aBox)
{
    ASSERT(sizeof(W1_BRC10) == nSize, "sizemissmatch");
    if(pBrc->dxpSpaceGet())
        aBox.SetDistance(10 + 20 * pBrc->dxpSpaceGet());
            //??? Warum 10+... ????

    if( rOut.IsInFly() )
        rOut.SetFlyFrmAttr( aBox );
    else
        rOut << aBox;

    if(pBrc->fShadowGet())
    {
        Color aBlack(COL_BLACK); // schwarzer...
        SvxShadowItem aS(ITEMID_SHADOW,(const Color*)&aBlack, 32,
                         SVX_SHADOW_BOTTOMRIGHT); // 1.6 tw breit
        if( rOut.IsInFly() )
            rOut.SetFlyFrmAttr( aS );
        else
            rOut << aS;
    }
}

STOP2(Ww1SingleSprmPBrc, RES_BOX, RES_SHADOW)

static USHORT __READONLY_DATA nBrcTrans[BRC_ANZ] =
     { BOX_LINE_TOP, BOX_LINE_LEFT, BOX_LINE_BOTTOM, BOX_LINE_RIGHT };

void Ww1SingleSprmPBrc10::Start(
    Ww1Shell& rOut, BYTE nId, BYTE* pSprm, USHORT nSize, Ww1Manager& rMan)
{

    W1_BRC10* pBrc =(W1_BRC10*)pSprm;
    const SfxPoolItem &rItem = ( ( rOut.IsInFly() ) ?
                     rOut.GetFlyFrmAttr(RES_BOX) :rOut.GetAttr(RES_BOX));
    const SvxBoxItem &rBoxItem = (const SvxBoxItem&)rItem;
    SvxBoxItem aBox( rBoxItem );
//  rOut >> aBox;
    SvxBorderLine aLine;
    aBox.SetLine(SetBorder(&aLine, pBrc), nBrcTrans[nLine] );
    Ww1SingleSprmPBrc::Start(rOut, nId, pBrc, nSize, rMan, aBox);
}

STOP1(Ww1SingleSprmParaSpace, RES_UL_SPACE)

void Ww1SingleSprmPDyaBefore::Start(
    Ww1Shell& rOut, BYTE nId, BYTE* pSprm, USHORT nSize, Ww1Manager& rMan)
{
    short nPara = SVBT16ToShort(pSprm);
    if(nPara < 0)
        nPara = -nPara;
    SvxULSpaceItem aUL((SvxULSpaceItem&)rOut.GetAttr(RES_UL_SPACE));
    aUL.SetUpper(nPara);
    rOut << aUL;
}

void Ww1SingleSprmPDyaAfter::Start(
    Ww1Shell& rOut, BYTE nId, BYTE* pSprm, USHORT nSize, Ww1Manager& rMan)
{
    short nPara = SVBT16ToShort(pSprm);
    if(nPara < 0)
        nPara = -nPara;
    SvxULSpaceItem aUL((SvxULSpaceItem&)rOut.GetAttr(RES_UL_SPACE));
    aUL.SetLower(nPara);
    rOut << aUL;
}

STOP1(Ww1SingleSprmPDyaLine, RES_PARATR_LINESPACING)

void Ww1SingleSprmPDyaLine::Start(
    Ww1Shell& rOut, BYTE nId, BYTE* pSprm, USHORT nSize, Ww1Manager& rMan)
{
    short nSpace = SVBT16ToShort(pSprm);
    if(nSpace < 0)
        nSpace = -nSpace;
    SvxLineSpacingItem aLSpc;
    if(TRUE)
    {// MultilineSpace(proportional)
        long n = nSpace * 100 / 240;    // W1: 240 = 100%, SW: 100 = 100%
        if(n>200)
            n = 200; // SW_UI-Maximum
        aLSpc.GetLineSpaceRule() = SVX_LINE_SPACE_AUTO;
        aLSpc.SetPropLineSpace((BYTE)n);
    }
    else
    {// Fixed / Minimum
        aLSpc.SetLineHeight((USHORT)nSpace);
        aLSpc.GetInterLineSpaceRule() = SVX_INTER_LINE_SPACE_OFF;
    }
    rOut << aLSpc;
}

void Ww1SingleSprmPChgTabsPapx::Start(
    Ww1Shell& rOut, BYTE nId, BYTE* pSprm, USHORT nSize, Ww1Manager& rMan)
{
#ifdef DEBUG
//  rOut << 'T';
#endif
    short nLeftPMgn = 0;    // Koordinaten etwa gleich ??
//  ( pAktColl ) ? pCollA[nAktColl].nLeftParaMgn
//                                 : nLeftParaMgn;      // Absatz L-Space

    short i;
    BYTE nDel = pSprm[1];
    BYTE* pDel = pSprm + 2;                     // Del - Array
    BYTE nIns = pSprm[nDel*2+2];
    BYTE* pIns = pSprm + 2*nDel + 3;            // Ins - Array
    W1_TBD* pTyp = (W1_TBD*)(pSprm + 2*nDel + 2*nIns + 3);// Typ - Array

    SvxTabStopItem aAttr( (SvxTabStopItem&)rOut.GetNodeOrStyAttr( RES_PARATR_TABSTOP ));

    SvxTabStop aTabStop;

    for( i=0; i<nDel; i++ ){
        USHORT nPos = aAttr.GetPos( SVBT16ToShort( pDel + i*2 ) - nLeftPMgn );
        if( nPos != SVX_TAB_NOTFOUND )
            aAttr.Remove( nPos, 1 );
    }

    for( i=0; i<nIns; i++ ){
        short nPos = SVBT16ToShort( pIns + i*2 ) - nLeftPMgn;
        if( nPos < 0 )
            continue;
        aTabStop.GetTabPos() = nPos;
        switch( pTyp[i].jcGet() ){
        case 0: aTabStop.GetAdjustment() = SVX_TAB_ADJUST_LEFT; break;
        case 1: aTabStop.GetAdjustment() = SVX_TAB_ADJUST_CENTER; break;
        case 2: aTabStop.GetAdjustment() = SVX_TAB_ADJUST_RIGHT; break;
        case 3: aTabStop.GetAdjustment() = SVX_TAB_ADJUST_DECIMAL; break;
        case 4: continue;                   // ignoriere Bar
        }

        switch( pTyp[i].tlcGet() ){
        case 0: aTabStop.GetFill() = ' '; break;
        case 1: aTabStop.GetFill() = '.'; break;
        case 2: aTabStop.GetFill() = '-'; break;
        case 3:
        case 4: aTabStop.GetFill() = '_'; break;
        }

        USHORT nPos2 = aAttr.GetPos( nPos );
        if( nPos2 != SVX_TAB_NOTFOUND )
            aAttr.Remove( nPos2, 1 );       // sonst weigert sich das Insert()

        aAttr.Insert( aTabStop );
    }
    rOut << aAttr;
}

STOP1(Ww1SingleSprmPChgTabsPapx, RES_PARATR_TABSTOP)

void Ww1SingleSprmSGprfIhdt::Start(
    Ww1Shell& rOut, BYTE nId, BYTE* pSprm, USHORT nSize, Ww1Manager& rMan)
{
    rMan.GetSep().SetGrpfIhdt(SVBT8ToByte(pSprm));
}

void Ww1SingleSprmSColumns::Start(
    Ww1Shell& rOut, BYTE nId, BYTE* pSprm, USHORT nSize, Ww1Manager& rMan)
{
    short nColSpace = 708; // default 1,25 cm
    short nNettoWidth = -1; //~ mdt: dxaLeft/Right missing...
    short nCols = SVBT16ToShort(pSprm);
    nCols++;
    if (nCols < 2)
        return;
    SwFmtCol aCol;
    aCol.Init(nCols, nColSpace, nNettoWidth);
    rOut.GetPageDesc().GetMaster().SetAttr(aCol);
}

void Ww1SingleSprmPTtp::Start(
    Ww1Shell& rOut, BYTE, BYTE*, USHORT, Ww1Manager& rMan)
{
    rMan.SetInTtp( TRUE );      // Besonderheit: wird bei InTable::Stop und
                                // nicht bei InTtp::Stop zurueckgesetzt,
                                // da Auswertung in InTable
}

void Ww1SingleSprmPTtp::Stop(
    Ww1Shell& rOut, BYTE, BYTE*, USHORT, Ww1Manager& rMan)
{
    if (rOut.IsInTable() && rMan.HasInTable())
        rOut.NextTableRow();
}

void Ww1SingleSprmPFInTable::Start(
    Ww1Shell& rOut, BYTE, BYTE*, USHORT,
    Ww1Manager& rMan)
{
}

void Ww1SingleSprmPFInTable::Stop(
    Ww1Shell& rOut, BYTE, BYTE*, USHORT,
    Ww1Manager& rMan)
{
    ASSERT(rOut.IsInTable(), "");
//  if (rOut.IsInTable() && rMan.HasInTable() && !rMan.IsInTtp() && !rMan.HasTtp())
//      rOut.NextTableCell();
    rMan.SetInTtp( FALSE );
}

void Ww1SingleSprmTJc::Start(
    Ww1Shell& rOut, BYTE nId, BYTE* pSprm, USHORT nSize, Ww1Manager& rMan)
{
    short nSpace = SVBT16ToShort(pSprm);
}

#if 0
void Ww1SingleSprmTDxaLeft::Start(
    Ww1Shell& rOut, BYTE nId, BYTE* pSprm, USHORT nSize, Ww1Manager& rMan)
{
    short nSpace = SVBT16ToShort(pSprm);
    rOut.SetCellWidth(nSpace - rMan.GetX());
    rMan.SetX(nSpace);
}
#endif

void Ww1SingleSprmTDxaGapHalf::Start(
    Ww1Shell& rOut, BYTE nId, BYTE* pSprm, USHORT nSize, Ww1Manager& rMan)
{
    short nSpace = SVBT16ToShort(pSprm);
    rOut.SetCellSpace(nSpace);
}

void Ww1SingleSprmTDefTable10::Start(
    Ww1Shell& rOut, BYTE nId, BYTE* pSprm, USHORT nSize, Ww1Manager& rMan)
{
    int i;
    BYTE *p = pSprm + 2;    // LaengenWord ueberlesen
    BYTE nCount = *p;
    p++;
    nSize -= 3;
// Es fehlt noch:
// - GapHalf
// - eventuelle Ausduennung der Zellenumrandungen

    if( nCount < 1 || nCount > 32 || nSize < ( nCount + 1 ) * 2  )
        return;

// Erstmal die Zellenpositionen einlesen
    short nPos = SVBT16ToShort( p );    // signed, kann auch neg. sein !!!

//  if( !rOut.IsTableWidthSet() ){      // Muss Tabellenbreite und -Ausrichtung
                                        // noch gesetzt werden ?
    {
        short nWholeWidth = SVBT16ToShort( p + 2 * nCount ) - nPos;
        rOut.SetTableWidth( (USHORT)nWholeWidth );  // Tabellenbreite setzen

// Pos der Tabelle setzen
        long nMidTab = nPos + nWholeWidth / 2;      // TabellenMitte
        const SwFrmFmt &rFmt = rOut.GetPageDesc().GetMaster();
        const SvxLRSpaceItem& rLR = rFmt.GetLRSpace();
        long nRight = rFmt.GetFrmSize().GetWidth()
                      - rLR.GetLeft() - rLR.GetRight();

        SwHoriOrient eOri = HORI_LEFT;
        if( nPos > MINLAY ){                        // per Zuppeln positioniert
            if ( nMidTab <= nRight / 3 )            // 1/3 der Seite
                eOri = HORI_LEFT;
            else if ( nMidTab <= 2 * nRight / 3 )   // 2/3 der Seite
                eOri = HORI_CENTER;
            else
                eOri = HORI_RIGHT;
        }
        rOut.SetTableOrient( eOri );
    }

    BYTE* pEndPos = p+2;
    BYTE* pTc0 = ( nSize >= nCount * 10 ) ? pEndPos + 2 * nCount : 0;
    USHORT nCellsDeleted = 0;       // fuer gemergte Zellen

    for( i = 0; i < nCount; i++ ){
// Info sammeln
        W1_TC* pTc = (W1_TC*)pTc0;
        BOOL bFirstMerged = (pTc) ? pTc->fFirstMergedGet() : FALSE;
        BOOL bMerged = (pTc) ? pTc->fMergedGet() : FALSE;

// Zellenbreiten setzen
        USHORT nPos1 = SVBT16ToShort( pEndPos );
        if( !bMerged )
            rOut.SetCellWidth( nPos1 - nPos, i - nCellsDeleted );
                                        // Zellenbreite setzen
                                        // Wechselwirkung mit GapHalf fehlt noch
                                        // ( GapHalf wird noch ignoriert )
        pEndPos+=2;
        nPos = nPos1;

        if( pTc0 ){                     // gibts TCs ueberhaupt ?
            W1_TC* pTc = (W1_TC*)pTc0;
            BOOL bFirstMerged = pTc->fFirstMergedGet();
            BOOL bMerged = pTc->fMergedGet();
//          ASSERT( !bMerged, "Gemergte Tabellenzellen noch nicht vollstaendig implementiert" );
            if( !bMerged ){
// und nun die Umrandungen
                SvxBoxItem aBox( (SvxBoxItem&)rOut.GetCellAttr( RES_BOX ));
                SvxBorderLine aLine;
                W1_BRC10* pBrc = pTc->rgbrcGet();
                for( USHORT j=0; j<4; j++ ){
                    aBox.SetLine(Ww1SingleSprmPBrc::SetBorder(&aLine, pBrc),
                                 nBrcTrans[j]);
                    pBrc++;
                }
                rOut.SetCellBorder( aBox, i - nCellsDeleted );
            }else{
// gemergte Zellen entfernen
                rOut.DeleteCell( i - nCellsDeleted );
                nCellsDeleted++;
            }
            pTc0+=sizeof(W1_TC);    // 10
        }
    }
}


void Ww1SingleSprmTDyaRowHeight::Start(
    Ww1Shell& rOut, BYTE nId, BYTE* pSprm, USHORT nSize, Ww1Manager& rMan)
{
    short nSpace = SVBT16ToShort(pSprm);
    rOut.SetCellHeight(nSpace);
}

// Fastsave-Attribute brauche ich als Dymmys nicht

#if 0

void Ww1SingleSprmTInsert::Start(
    Ww1Shell& rOut, BYTE nId, BYTE* pSprm, USHORT nSize, Ww1Manager& rMan)
{
}

void Ww1SingleSprmTDelete::Start(
    Ww1Shell& rOut, BYTE nId, BYTE* pSprm, USHORT nSize, Ww1Manager& rMan)
{
    short nSpace = SVBT16ToShort(pSprm);
}

void Ww1SingleSprmTDxaCol::Start(
    Ww1Shell& rOut, BYTE nId, BYTE* pSprm, USHORT nSize, Ww1Manager& rMan)
{
}

void Ww1SingleSprmTMerge::Start(
    Ww1Shell& rOut, BYTE nId, BYTE* pSprm, USHORT nSize, Ww1Manager& rMan)
{
    short nSpace = SVBT16ToShort(pSprm);
}

void Ww1SingleSprmTSplit::Start(
    Ww1Shell& rOut, BYTE nId, BYTE* pSprm, USHORT nSize, Ww1Manager& rMan)
{
    short nSpace = SVBT16ToShort(pSprm);
}

void Ww1SingleSprmTSetBrc10::Start(
    Ww1Shell& rOut, BYTE nId, BYTE* pSprm, USHORT nSize, Ww1Manager& rMan)
{
}
#endif // 0

void Ww1SingleSprmPpc::Start(
    Ww1Shell& rOut, BYTE nId, BYTE* pSprm, USHORT nSize, Ww1Manager& rMan)
{
    BYTE nPpc = SVBT8ToByte(pSprm);

    if (rOut.IsInTable())                       // Flys in Tabellen kann PMW
        return;                                 // nicht

    RndStdIds eAnchor;          // Bindung
    SwRelationOrient eHRel;     // Seite oder Seitenrand
    SwRelationOrient eVRel;     // Seite oder Seitenrand

    switch ( ( nPpc & 0x30 ) >> 4 ){        // Y - Bindung bestimmt Sw-Bindung
    case 0: eAnchor = FLY_AT_CNTNT;         // Vert Margin
            eVRel = PRTAREA;
//          if( nYPos < 0 )
//              nYPos = 0;                  // koennen wir nicht
            break;
/*  case 1:*/                               // Vert. Seite
    default:eAnchor = FLY_PAGE;             // Vert Page oder unknown
            eVRel = FRAME;
            break;                          // 2=Vert. Paragraph, 3=Use Default
    }

    switch ( ( nPpc & 0xc0 ) >> 6 ){        // X - Bindung -> Koordinatentransformation
    case 0:                                 // Hor. Spalte
    case 1:                                 // Hor. Absatz
            eHRel = PRTAREA;
//          nXPos += nPgLeft;               // in Seiten-Koordinaten umrechnen
            break;
/*  case 2:*/                               // Hor. Seite
    default:
            eHRel = FRAME;
            break;
    }

    if( !rOut.IsInFly() && rMan.IsInStyle() ){
        rOut.BeginFly( eAnchor );           // Starte StyleFly
    }else{
        rOut.SetFlyAnchor( eAnchor );       // Setze Anker
    }
}

void Ww1SingleSprmPDxaAbs::Start(
    Ww1Shell& rOut, BYTE nId, BYTE* pSprm, USHORT nSize, Ww1Manager& rMan)
{
    short nXPos = SVBT16ToShort(pSprm);

    if( rMan.IsInStyle() && !rOut.IsInFly() ){
        rOut.BeginFly();                    // Fly ohne PPc-Attribut
    }

    SwRelationOrient eHRel = FRAME;
    SwHoriOrient eHAlign = HORI_NONE;

    switch( nXPos ){                        // besondere X-Positionen ?
    case 0:
    case -12: eHAlign = HORI_NONE; nXPos = 0; break;   // Mogel: innen -> links
                            // eigentich HORI_LEFT, aber dann verrueckt
                            // ein Abstand nach aussen den Fly
    case -4:  eHAlign = HORI_CENTER; nXPos = 0; break; // zentriert
    case -8:                                           // rechts
    case -16: eHAlign = HORI_RIGHT; nXPos = 0; break;  // Mogel: aussen -> rechts
//  default:  nXPos += (short)nIniFlyDx; break; // Korrekturen per Ini-Datei
    }
    rOut.SetFlyXPos( nXPos, eHRel, eHAlign );
}

void Ww1SingleSprmPDyaAbs::Start(
    Ww1Shell& rOut, BYTE nId, BYTE* pSprm, USHORT nSize, Ww1Manager& rMan)
{
    short nYPos = SVBT16ToShort(pSprm);
    SwRelationOrient eVRel = FRAME;
    SwVertOrient eVAlign = VERT_NONE;

    switch( nYPos ){                            // besondere Y-Positionen ?
    case -4:  eVAlign = VERT_TOP; nYPos = 0; break; // oben
    case -8:  eVAlign = VERT_CENTER; nYPos = 0; break;  // zentriert
    case -12: eVAlign = VERT_BOTTOM; nYPos = 0; break;  // unten
//  default:  nYPos += (short)nIniFlyDy; break; // Korrekturen per Ini-Datei
    }
    rOut.SetFlyYPos( nYPos, eVRel, eVAlign );
}

void Ww1SingleSprmPDxaWidth::Start(
    Ww1Shell& rOut, BYTE nId, BYTE* pSprm, USHORT nSize, Ww1Manager& rMan)
{
    short nDxaWidth = SVBT16ToShort(pSprm);
    rOut.SetFlyFrmAttr( SwFmtFrmSize( ATT_VAR_SIZE, nDxaWidth, MINFLY ) );
}

void Ww1SingleSprmPFromText::Start(
    Ww1Shell& rOut, BYTE nId, BYTE* pSprm, USHORT nSize, Ww1Manager& rMan)
{
    if( rOut.IsInFly() ){   // Kommt auch ausserhalb eines Flys vor, hat
                            // dann aber offensichtlich nichts zu bedeuten.
                            // Einen impliziten Fly-Anfang bedeutet es
                            // definitiv nicht
        short nFromText = SVBT16ToShort(pSprm);

        SvxLRSpaceItem aLR;
        aLR.SetTxtLeft( nFromText );
        aLR.SetRight( nFromText );
        rOut.SetFlyFrmAttr( aLR );

        rOut.SetFlyFrmAttr( SvxULSpaceItem( nFromText, nFromText ) );
    }
}

#undef STOP1
#undef STOP2

/**********************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ww1/w1sprm.cxx,v 1.1.1.1 2000-09-18 17:14:58 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.19  2000/09/18 16:04:57  willem.vandorp
      OpenOffice header added.

      Revision 1.18  2000/05/11 16:06:59  jp
      Changes for Unicode

      Revision 1.17  2000/03/03 15:22:12  os
      StarView remainders removed

      Revision 1.16  1998/06/29 11:01:32  JP
      SvxFmtBreakItem ohne Flag!


      Rev 1.15   29 Jun 1998 13:01:32   JP
   SvxFmtBreakItem ohne Flag!

      Rev 1.14   19 Feb 1998 17:01:14   HJS
   fuer sh eingechecked

      Rev 1.12   29 Nov 1997 17:37:08   MA
   includes

      Rev 1.11   09 Oct 1997 14:13:48   JP
   Aenderungen von SH

      Rev 1.6   11 Aug 1997 12:52:20   SH
   Flys und einfache Tabellen und Tabulatoren

      Rev 1.5   18 Jul 1997 09:31:38   MA
   Stand von SH, #41738# GPF und Tabellen etwas besser

      Rev 1.4   16 Jun 1997 13:08:56   MA
   Stand Micheal Dietrich

      Rev 1.3   12 Mar 1997 19:12:54   SH
   MDT: Progressbar, Pagedesc-Bug, Spalten, Anfang Tabellen u.a.

      Rev 1.2   13 Jan 1997 16:42:02   NF
   __READONLY_DATA fr Win16 korrigiert: Typ __READONLY_DATA identifier ...

      Rev 1.1   10 Jan 1997 18:47:34   SH
   Stabiler und mehr von MDT

      Rev 1.0   28 Nov 1996 18:09:30   SH
   Schneller Schoener Weiter von MDT

      Rev 1.0   14 Aug 1996 19:32:28   SH
   Initial revision.


**********************************************************************/
//]})
diff --git a/sw/source/filter/ww1/w1struct.hxx b/sw/source/filter/ww1/w1struct.hxx
new file mode 100644
index 0000000..92ebbf4
--- /dev/null
+++ b/sw/source/filter/ww1/w1struct.hxx
@@ -0,0 +1,965 @@
/*************************************************************************
 *
 *  $RCSfile: w1struct.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:58 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef W1STRUCT_HXX
#define W1STRUCT_HXX

// star view
#include <string.h>

#ifndef _SOLAR_H
#include <tools/solar.h>
#endif

class Ww1Shell;
class Ww1Manager;

struct W1_FIB /////////////////////////////////////////////////////////
{
    SVBT16 wIdent;// 0x0 int magic number
    USHORT wIdentGet() {
        return SVBT16ToShort(wIdent); }
    SVBT16 nFib;// 0x2 FIB version written
    USHORT nFibGet() {
        return SVBT16ToShort(nFib); }
    SVBT16 nProduct;// 0x4 product version written by
    USHORT nProductGet() {
        return SVBT16ToShort(nProduct); }
    SVBT16 nlocale;// 0x6 language stamp---localized version;
    USHORT nlocaleGet() {
        return SVBT16ToShort(nlocale); }
    SVBT16 pnNext;// 0x8
    USHORT pnNextGet() {
        return SVBT16ToShort(pnNext); }
    SVBT16 fFlags;
    USHORT fFlagsGet() {
        return SVBT16ToShort(fFlags); }
    // SVBT16 fDot :1;// 0xa    0001
    BOOL fDotGet() {
        return ((fFlagsGet() >> 0) & 1); }
    // SVBT16 fGlsy :1;//       0002
    BOOL fGlsyGet() {
        return ((fFlagsGet() >> 1) & 1); }
    // SVBT16 fComplex :1;//        0004 when 1, file is in complex, fast-saved format.
    BOOL fComplexGet() {
        return ((fFlagsGet() >> 2) & 1); }
    // SVBT16 fHasPic :1;//     0008 file contains 1 or more pictures
    BOOL fHasPicGet() {
        return ((fFlagsGet() >> 3) & 1); }
    // SVBT16 cQuickSaves :4;//     00F0 count of times file was quicksaved
    USHORT cQuickSavesGet() {
        return (USHORT)((fFlagsGet() >> 4) & 0xf); }
    // SVBT16 u1 :8;//      FF00 unused
    USHORT u1Get() {
        return (USHORT)((fFlagsGet() >> 8) & 0xff); }
    SVBT16 nFibBack;// 0xc
    USHORT nFibBackGet() {
        return SVBT16ToShort(nFibBack); }
    SVBT16 u2[5];// 0xe reserved
    SVBT32 fcMin;// 0x18 file offset of first character of text
    ULONG fcMinGet() {
        return SVBT32ToLong(fcMin); }
    SVBT32 fcMac;// 0x1c file offset of last character of text + 1
    ULONG fcMacGet() {
        return SVBT32ToLong(fcMac); }
    SVBT32 cbMac;// 0x20 file offset of last byte written to file + 1.
    ULONG cbMacGet() {
        return SVBT32ToLong(cbMac); }
    SVBT32 u4[4];// 0x24 reserved
    SVBT32 ccpText;// 0x34 length of main document text stream
    ULONG ccpTextGet() {
        return SVBT32ToLong(ccpText); }
    SVBT32 ccpFtn;// 0x38 length of footnote subdocument text stream
    ULONG ccpFtnGet() {
        return SVBT32ToLong(ccpFtn); }
    SVBT32 ccpHdd;// 0x3c length of header subdocument text stream
    ULONG ccpHddGet() {
        return SVBT32ToLong(ccpHdd); }
    SVBT32 ccpMcr;// 0x40 length of macro subdocument text stream
    ULONG ccpMcrGet() {
        return SVBT32ToLong(ccpMcr); }
    SVBT32 ccpAtn;// 0x44 length of annotation subdocument text stream
    ULONG ccpAtnGet() {
        return SVBT32ToLong(ccpAtn); }
    SVBT32 cp5[4];// 0x48
    SVBT32 fcStshfOrig;// 0x58 file offset of original allocation for STSH in file
    ULONG fcStshfOrigGet() {
        return SVBT32ToLong(fcStshfOrig); }
    SVBT16 cbStshfOrig;// 0x5c count of bytes of original STSH allocation
    USHORT cbStshfOrigGet() {
        return SVBT16ToShort(cbStshfOrig); }
    SVBT32 fcStshf;// 0x5e file offset of STSH in file.
    ULONG fcStshfGet() {
        return SVBT32ToLong(fcStshf); }
    SVBT16 cbStshf;// 0x62 count of bytes of current STSH allocation
    USHORT cbStshfGet() {
        return SVBT16ToShort(cbStshf); }
    SVBT32 fcPlcffndRef;// 0x64 file offset of footnote reference PLC.
    ULONG fcPlcffndRefGet() {
        return SVBT32ToLong(fcPlcffndRef); }
    SVBT16 cbPlcffndRef;// 0x68 count of bytes of footnote reference PLC
    USHORT cbPlcffndRefGet() {
        return SVBT16ToShort(cbPlcffndRef); }
                            // == 0 if no footnotes defined in document.

    SVBT32 fcPlcffndTxt;// 0x6a file offset of footnote text PLC.
    ULONG fcPlcffndTxtGet() {
        return SVBT32ToLong(fcPlcffndTxt); }
    SVBT16 cbPlcffndTxt;// 0x6e count of bytes of footnote text PLC.
    USHORT cbPlcffndTxtGet() {
        return SVBT16ToShort(cbPlcffndTxt); }
                            // == 0 if no footnotes defined in document

    SVBT32 fcPlcfandRef;// 0x70 file offset of annotation reference PLC.
    ULONG fcPlcfandRefGet() {
        return SVBT32ToLong(fcPlcfandRef); }
    SVBT16 cbPlcfandRef;// 0x74 count of bytes of annotation reference PLC.
    USHORT cbPlcfandRefGet() {
        return SVBT16ToShort(cbPlcfandRef); }

    SVBT32 fcPlcfandTxt;// 0x76 file offset of annotation text PLC.
    ULONG fcPlcfandTxtGet() {
        return SVBT32ToLong(fcPlcfandTxt); }
    SVBT16 cbPlcfandTxt;// 0x7a count of bytes of the annotation text PLC
    USHORT cbPlcfandTxtGet() {
        return SVBT16ToShort(cbPlcfandTxt); }

    SVBT32 fcPlcfsed;// 8x7c file offset of section descriptor PLC.
    ULONG fcPlcfsedGet() {
        return SVBT32ToLong(fcPlcfsed); }
    SVBT16 cbPlcfsed;// 0x80 count of bytes of section descriptor PLC.
    USHORT cbPlcfsedGet() {
        return SVBT16ToShort(cbPlcfsed); }

    SVBT32 fcPlcfpgd;// 0x82 file offset of paragraph descriptor PLC
    ULONG fcPlcfpgdGet() {
        return SVBT32ToLong(fcPlcfpgd); }
    SVBT16 cbPlcfpgd;// 0x86 count of bytes of paragraph descriptor PLC.
    USHORT cbPlcfpgdGet() {
        return SVBT16ToShort(cbPlcfpgd); }
                            // ==0 if file was never repaginated
                            // Should not be written by third party creators

    SVBT32 fcPlcfphe;// 0x88 file offset of PLC of paragraph heights.
    ULONG fcPlcfpheGet() {
        return SVBT32ToLong(fcPlcfphe); }
    SVBT16 cbPlcfphe;// 0x8c count of bytes of paragraph height PLC.
    USHORT cbPlcfpheGet() {
        return SVBT16ToShort(cbPlcfphe); }
                            // ==0 when file is non-complex.

    SVBT32 fcSttbfglsy;// 0x8e file offset of glossary string table.
    ULONG fcSttbfglsyGet() {
        return SVBT32ToLong(fcSttbfglsy); }
    SVBT16 cbSttbfglsy;// 0x92 count of bytes of glossary string table.
    USHORT cbSttbfglsyGet() {
        return SVBT16ToShort(cbSttbfglsy); }
                            // == 0 for non-glossary documents.
                            // !=0 for glossary documents.

    SVBT32 fcPlcfglsy;// 0x94 file offset of glossary PLC.
    ULONG fcPlcfglsyGet() {
        return SVBT32ToLong(fcPlcfglsy); }
    SVBT16 cbPlcfglsy;// 0x98 count of bytes of glossary PLC.
    USHORT cbPlcfglsyGet() {
        return SVBT16ToShort(cbPlcfglsy); }
                            // == 0 for non-glossary documents.
                            // !=0 for glossary documents.

    SVBT32 fcPlcfhdd;// 0x9a byte offset of header PLC.
    ULONG fcPlcfhddGet() {
        return SVBT32ToLong(fcPlcfhdd); }
    SVBT16 cbPlcfhdd;// 0x9e count of bytes of header PLC.
    USHORT cbPlcfhddGet() {
        return SVBT16ToShort(cbPlcfhdd); }
                            // == 0 if document contains no headers

    SVBT32 fcPlcfbteChpx;// 0xa0 file offset of character property bin table.PLC.
    ULONG fcPlcfbteChpxGet() {
        return SVBT32ToLong(fcPlcfbteChpx); }
    SVBT16 cbPlcfbteChpx;// 0xa4 count of bytes of character property bin table PLC.
    USHORT cbPlcfbteChpxGet() {
        return SVBT16ToShort(cbPlcfbteChpx); }

    SVBT32 fcPlcfbtePapx;// 0xa6 file offset of paragraph property bin table.PLC.
    ULONG fcPlcfbtePapxGet() {
        return SVBT32ToLong(fcPlcfbtePapx); }
    SVBT16 cbPlcfbtePapx;// 0xaa count of bytes of paragraph property bin table PLC.
    USHORT cbPlcfbtePapxGet() {
        return SVBT16ToShort(cbPlcfbtePapx); }

    SVBT32 fcPlcfsea;// 0xac file offset of PLC reserved for private use. The SEA is 6 bytes long.
    ULONG fcPlcfseaGet() {
        return SVBT32ToLong(fcPlcfsea); }
    SVBT16 cbPlcfsea;// 0xb0    count of bytes of private use PLC.
    USHORT cbPlcfseaGet() {
        return SVBT16ToShort(cbPlcfsea); }

    SVBT32 fcSttbfffn;// 0xb2   file offset of font information STTBF. See the FFN file structure definition.
    ULONG fcSttbfffnGet() {
        return SVBT32ToLong(fcSttbfffn); }
    SVBT16 cbSttbfffn;// 0xb6   count of bytes in sttbfffn.
    USHORT cbSttbfffnGet() {
        return SVBT16ToShort(cbSttbfffn); }

    SVBT32 fcPlcffldMom;// 0xb8 offset in doc stream to the PLC of field positions in the main document.
    ULONG fcPlcffldMomGet() {
        return SVBT32ToLong(fcPlcffldMom); }
    SVBT16 cbPlcffldMom;// 0xbc
    USHORT cbPlcffldMomGet() {
        return SVBT16ToShort(cbPlcffldMom); }

    SVBT32 fcPlcffldHdr;// 0xbe offset in doc stream to the PLC of field positions in the header subdocument.
    ULONG fcPlcffldHdrGet() {
        return SVBT32ToLong(fcPlcffldHdr); }
    SVBT16 cbPlcffldHdr;// 0xc2
    USHORT cbPlcffldHdrGet() {
        return SVBT16ToShort(cbPlcffldHdr); }

    SVBT32 fcPlcffldFtn;// 0xc4 offset in doc stream to the PLC of field positions in the footnote subdocument.
    ULONG fcPlcffldFtnGet() {
        return SVBT32ToLong(fcPlcffldFtn); }
    SVBT16 cbPlcffldFtn;// 0xc8
    USHORT cbPlcffldFtnGet() {
        return SVBT16ToShort(cbPlcffldFtn); }

    SVBT32 fcPlcffldAtn;// 0xca offset in doc stream to the PLC of field positions in the annotation subdocument.
    ULONG fcPlcffldAtnGet() {
        return SVBT32ToLong(fcPlcffldAtn); }
    SVBT16 cbPlcffldAtn;// 0xce
    USHORT cbPlcffldAtnGet() {
        return SVBT16ToShort(cbPlcffldAtn); }

    SVBT32 fcPlcffldMcr;// 0xd0 offset in doc stream to the PLC of field positions in the macro subdocument.
    ULONG fcPlcffldMcrGet() {
        return SVBT32ToLong(fcPlcffldMcr); }
    SVBT16 cbPlcffldMcr;// 0xd4
    USHORT cbPlcffldMcrGet() {
        return SVBT16ToShort(cbPlcffldMcr); }

    SVBT32 fcSttbfbkmk;// 0xd6 offset in document stream of the STTBF that records bookmark names in the main document
    ULONG fcSttbfbkmkGet() {
        return SVBT32ToLong(fcSttbfbkmk); }
    SVBT16 cbSttbfbkmk;// 0xda
    USHORT cbSttbfbkmkGet() {
        return SVBT16ToShort(cbSttbfbkmk); }

    SVBT32 fcPlcfbkf;// 0xdc offset in document stream of the PLCF that records the beginning CP offsets of bookmarks in the main document. See BKF
    ULONG fcPlcfbkfGet() {
        return SVBT32ToLong(fcPlcfbkf); }
    SVBT16 cbPlcfbkf;// 0xe0
    USHORT cbPlcfbkfGet() {
        return SVBT16ToShort(cbPlcfbkf); }

    SVBT32 fcPlcfbkl;// 0xe2 offset in document stream of the PLCF that records the ending CP offsets of bookmarks recorded in the main document. See the BKL structure definition.
    ULONG fcPlcfbklGet() {
        return SVBT32ToLong(fcPlcfbkl); }
    SVBT16 cbPlcfbkl;// 0xe6 SVBT16
    USHORT cbPlcfbklGet() {
        return SVBT16ToShort(cbPlcfbkl); }

    SVBT32 fcCmds;// 0xe8 FC
    ULONG fcCmdsGet() {
        return SVBT32ToLong(fcCmds); }
    SVBT16 cbCmds;// 0xec
    USHORT cbCmdsGet() {
        return SVBT16ToShort(cbCmds); }

    SVBT32 fcPlcmcr;// 0xee FC
    ULONG fcPlcmcrGet() {
        return SVBT32ToLong(fcPlcmcr); }
    SVBT16 cbPlcmcr;// 0xf2
    USHORT cbPlcmcrGet() {
        return SVBT16ToShort(cbPlcmcr); }

    SVBT32 fcSttbfmcr;// 0xf4 FC
    ULONG fcSttbfmcrGet() {
        return SVBT32ToLong(fcSttbfmcr); }
    SVBT16 cbSttbfmcr;// 0xf8
    USHORT cbSttbfmcrGet() {
        return SVBT16ToShort(cbSttbfmcr); }

    SVBT32 fcPrEnv;// 0xfa
    ULONG fcPrEnvGet() {
        return SVBT32ToLong(fcPrEnv); }
    SVBT16 cbPrEnv;// 0xfe
    USHORT cbPrEnvGet() {
        return SVBT16ToShort(cbPrEnv); }

    SVBT32 fcWss;// 0x100 file offset of Window Save State data structure. See WSS.
    ULONG fcWssGet() {
        return SVBT32ToLong(fcWss); }
    SVBT16 cbWss;// 0x100 count of bytes of WSS. ==0 if unable to store the window state.
    USHORT cbWssGet() {
        return SVBT16ToShort(cbWss); }

    SVBT32 fcDop;// 0x106 file offset of document property data structure.
    ULONG fcDopGet() {
        return SVBT32ToLong(fcDop); }
    SVBT16 cbDop;// 0x10a count of bytes of document properties.
    USHORT cbDopGet() {
        return SVBT16ToShort(cbDop); }


    SVBT32 fcSttbfAssoc;// 0x10c offset to STTBF of associated strings. See STTBFASSOC.
    ULONG fcSttbfAssocGet() {
        return SVBT32ToLong(fcSttbfAssoc); }
    SVBT16 cbSttbfAssoc;// 0x110
    USHORT cbSttbfAssocGet() {
        return SVBT16ToShort(cbSttbfAssoc); }

    SVBT32 fcClx;// 0x112 file offset of beginning of information for complex files.
    ULONG fcClxGet() {
        return SVBT32ToLong(fcClx); }
    SVBT16 cbClx;// 0x116 count of bytes of complex file information. 0 if file is non-complex.
    USHORT cbClxGet() {
        return SVBT16ToShort(cbClx); }

    SVBT32 fcPlcfpgdFtn;// 0x118 file offset of page descriptor PLC for footnote subdocument.
    ULONG fcPlcfpgdFtnGet() {
        return SVBT32ToLong(fcPlcfpgdFtn); }
    SVBT16 cbPlcfpgdFtn;// 0x11C count of bytes of page descriptor PLC for footnote subdocument.
    USHORT cbPlcfpgdFtnGet() {
        return SVBT16ToShort(cbPlcfpgdFtn); }
                            // ==0 if document has not been paginated. The length of the PGD is 8 bytes.

    SVBT32 fcSpare1;// 0x11e file offset of the name of the original file.
    ULONG fcSpare1Get() {
        return SVBT32ToLong(fcSpare1); }
    SVBT16 cbSpare1;// 0x122 count of bytes of the name of the original file.
    USHORT cbSpare1Get() {
        return SVBT16ToShort(cbSpare1); }
    SVBT32 fcSpare2;// 0x124 file offset of the name of the original file.
    ULONG fcSpare2Get() {
        return SVBT32ToLong(fcSpare2); }
    SVBT16 cbSpare2;// 0x128 count of bytes of the name of the original file.
    USHORT cbSpare2Get() {
        return SVBT16ToShort(cbSpare2); }
    SVBT32 fcSpare3;// 0x12a file offset of the name of the original file.
    ULONG fcSpare3Get() {
        return SVBT32ToLong(fcSpare3); }
    SVBT16 cbSpare3;// 0x12e count of bytes of the name of the original file.
    USHORT cbSpare3Get() {
        return SVBT16ToShort(cbSpare3); }
    SVBT32 fcSpare4;// 0x130 file offset of the name of the original file.
    ULONG fcSpare4Get() {
        return SVBT32ToLong(fcSpare4); }
    SVBT16 cbSpare4;// 0x134 count of bytes of the name of the original file.
    USHORT cbSpare4Get() {
        return SVBT16ToShort(cbSpare4); }

    SVBT16 cpnBteChp;// 0x18E count of CHPX FKPs recorded in file. In non-complex files if the number of
    USHORT cpnBteChpGet() {
        return SVBT16ToShort(cpnBteChp); }
                            // entries in the plcfbteChpx is less than this, the plcfbteChpx is incomplete.
    SVBT16 cpnBtePap;// 0x190 count of PAPX FKPs recorded in file. In non-complex files if the number of
    USHORT cpnBtePapGet() {
        return SVBT16ToShort(cpnBtePap); }
                            // entries in the plcfbtePapx is less than this, the plcfbtePapx is incomplete.
};

struct W1_DOP ///////////////////////////////////// Document Properties
{
    SVBT16 fFlags;
    USHORT fFlagsGet() {
        return SVBT16ToShort(fFlags); }
    // SVBT16 fFacingPages : 1;// 1 when facing pages should be printed
    BOOL fFacingPagesGet() {
        return ((fFlagsGet() >> 0) & 1); }
    // SVBT16 fWidowControl : 1;// 1 when widow control is in effect. 0 when widow control disabled.
    BOOL fWidowControlGet() {
        return ((fFlagsGet() >> 1) & 1); }
    // SVBT16 : 3;// unused
    // SVBT16 fpc : 2;// 1 footnote position code: 0 as endnotes, 1 at bottom of page, 2 immediately beneath text
    USHORT fpcGet() {
        return (USHORT)((fFlagsGet() >> 5) & 3); }
    // SVBT16 fWide : 1;// Landscape
    BOOL fWideGet() {
        return ((fFlagsGet() >> 7) & 1); }
    // SVBT16 grpfIhdt : 8;// 0 specification of document headers and footers. See explanation under Headers and Footers topic.
    USHORT grpfIhdtGet() {
        return (USHORT)((fFlagsGet() >> 8) & 0xff); }
    SVBT16 fFtnFlags;
    USHORT fFtnFlagsGet() {
        return SVBT16ToShort(fFtnFlags); }
    // SVBT16 fFtnRestart : 1;
    BOOL fFtnRestartGet() {
        return ((fFtnFlagsGet() >> 0) & 1); }
    // SVBT16 nFtn : 15;// 1 initial footnote number for document
    USHORT nFtnGet() {
        return (USHORT)((fFtnFlagsGet() >> 1) & 0x7fff); }
    SVBT16 fRvsFlags;
    USHORT fRvsFlagsGet() {
        return SVBT16ToShort(fRvsFlags); }
    // SVBT16 irmBar : 8;
    USHORT irmBarGet() {
        return (USHORT)((fRvsFlagsGet() >> 0) & 0xff); }
    // SVBT16 irmProps : 7;
    USHORT irmPropsGet() {
        return (USHORT)((fRvsFlagsGet() >> 8) & 0x7f); }
    // SVBT16 fRevMarking   : 1;//   when 1, Word will mark revisions as the document is edited
    BOOL fRevMarkingGet() {
        return ((fRvsFlagsGet() >> 15) & 1); }
    SVBT16 fSveFlags;
    USHORT fSveFlagsGet() {
        return SVBT16ToShort(fSveFlags); }
    // SVBT16 fBackup : 1;//     always make backup when document saved when 1.
    BOOL fBackupGet() {
        return ((fSveFlagsGet() >> 0) & 1); }
    // SVBT16 fExactCWords : 1;
    BOOL fExactCWordsGet() {
        return ((fSveFlagsGet() >> 1) & 1); }
    // SVBT16 fPagHidden : 1;//
    BOOL fPagHiddenGet() {
        return ((fSveFlagsGet() >> 2) & 1); }
    // SVBT16 fPagResults : 1;
    BOOL fPagResultsGet() {
        return ((fSveFlagsGet() >> 3) & 1); }
    // SVBT16 fLockAtn : 1;//    when 1, annotations are locked for editing
    BOOL fLockAtnGet() {
        return ((fSveFlagsGet() >> 4) & 1); }
    // SVBT16 fMirrorMargins : 1;//  swap margins on left/right pages when 1.
    BOOL fMirrorMarginsGet() {
        return ((fSveFlagsGet() >> 5) & 1); }
    // SVBT16 : 10;// unused
    SVBT16 fSpares;
    USHORT fSparesGet() {
        return SVBT16ToShort(fSpares); }
    SVBT16 yaPage;
    USHORT yaPageGet() {
        return SVBT16ToShort(yaPage); }
    SVBT16 xaPage;
    USHORT xaPageGet() {
        return SVBT16ToShort(xaPage); }
    SVBT16 dyaTop;
    USHORT dyaTopGet() {
        return SVBT16ToShort(dyaTop); }
    SVBT16 dxaLeft;
    USHORT dxaLeftGet() {
        return SVBT16ToShort(dxaLeft); }
    SVBT16 dyaBottom;
    USHORT dyaBottomGet() {
        return SVBT16ToShort(dyaBottom); }
    SVBT16 dxaRight;
    USHORT dxaRightGet() {
        return SVBT16ToShort(dxaRight); }
    SVBT16 dxaGutter;
    USHORT dxaGutterGet() {
        return SVBT16ToShort(dxaGutter); }
    SVBT16  dxaTab;// 720 twips default tab width
    USHORT dxaTabGet() {
        return SVBT16ToShort(dxaTab); }
    SVBT16  wSpare;//
    USHORT wSpareGet() {
        return SVBT16ToShort(wSpare); }
    SVBT16  dxaHotZ;// width of hyphenation hot zone measured in twips
    USHORT dxaHotZGet() {
        return SVBT16ToShort(dxaHotZ); }
    SVBT16  rgwSpare[2];// reserved
    SVBT32  dttmCreated;// DTTM date and time document was created
    ULONG dttmCreatedGet() {
        return SVBT32ToLong(dttmCreated); }
    SVBT32  dttmRevised;// DTTM date and time document was last revised
    ULONG dttmRevisedGet() {
        return SVBT32ToLong(dttmRevised); }
    SVBT32  dttmLastPrint;// DTTM date and time document was last printed
    ULONG dttmLastPrintGet() {
        return SVBT32ToLong(dttmLastPrint); }
    SVBT16  nRevision;// number of times document has been revised since its creation
    USHORT nRevisionGet() {
        return SVBT16ToShort(nRevision); }
    SVBT32  tmEdited;// time document was last edited
    ULONG tmEditedGet() {
        return SVBT32ToLong(tmEdited); }
    SVBT32  cWords;// count of words tallied by last Word Count execution
    ULONG cWordsGet() {
        return SVBT32ToLong(cWords); }
    SVBT32  cCh;// count of characters tallied by last Word Count execution
    ULONG cChGet() {
        return SVBT32ToLong(cCh); }
    SVBT16  cPg;// count of pages tallied by last Word Count execution
    USHORT cPgGet() {
        return SVBT16ToShort(cPg); }
    SVBT16  rgwSpareDocSum[2];
};
// cbDOP is 66.

struct W1_CHP /////////////////////////////////////////////////////////
{
    SVBT16  fChar;
    SVBT16  ftc;// Font Code
    SVBT8   hps;// Font size in half points
    SVBT8   hpsPos;// Sub/Superscript ( signed number, 0 = normal )
    SVBT16  fText;
    SVBT32  fcPic;// not stored in File
    SVBT8   fnPic;// internal
    SVBT16  hpsLargeChp;// ???

    W1_CHP() { memset( this, 0, sizeof( *this)); }

    USHORT fCharGet()       { return SVBT16ToShort(fChar); }
    void fCharSet(USHORT n) { ShortToSVBT16(n, fChar); }
    BOOL fBoldGet()         { return ((fCharGet() >> 0) & 1); }
    void fBoldSet(BOOL b)   { fCharSet( ( fCharGet() & 0xfffe ) | ( b << 0 ) ); }
    BOOL fItalicGet()       { return ((fCharGet() >> 1) & 1); }
    void fItalicSet(BOOL b) { fCharSet( ( fCharGet() & 0xfffd ) | ( b << 1 ) ); }
    BOOL fStrikeGet()       { return ((fCharGet() >> 2) & 1); }
    BOOL fOutlineGet()      { return ((fCharGet() >> 3) & 1); }
    BOOL fFldVanishGet()    { return ((fCharGet() >> 4) & 1); }
    BOOL fSmallCapsGet()    { return ((fCharGet() >> 5) & 1); }
    BOOL fCapsGet()         { return ((fCharGet() >> 6) & 1); }
    BOOL fVanishGet()       { return ((fCharGet() >> 7) & 1); }
    BOOL fRMarkGet()        { return ((fCharGet() >> 8) & 1); }
    BOOL fSpecGet()         { return ((fCharGet() >> 9) & 1); }
    BOOL fsIcoGet()         { return ((fCharGet() >> 10) & 1); }
    BOOL fsFtcGet()         { return ((fCharGet() >> 11) & 1); }
    void fsFtcSet(BOOL b)   { fCharSet( ( fCharGet() & 0xf7ff ) | ( b << 11 ) ); }
    BOOL fsHpsGet()         { return ((fCharGet() >> 12) & 1); }
    void fsHpsSet(BOOL b)   { fCharSet( ( fCharGet() & 0xefff ) | ( b << 12 ) ); }
    BOOL fsKulGet()         { return ((fCharGet() >> 13) & 1); }
    void fsKulSet(BOOL b)   { fCharSet( ( fCharGet() & 0xdfff ) | ( b << 13 ) ); }
    BOOL fsPosGet()         { return ((fCharGet() >> 14) & 1); }
    BOOL fsSpaceGet()       { return ((fCharGet() >> 15) & 1); }
    // SVBT16 fBold :1;// 1 == opposite boldness of style
    // SVBT16 fItalic :1;// 1 == opposite of style
    // SVBT16 fStrike :1;// 1 == opposite of style
    // SVBT16 fOutline :1;// 1 == opposite of style
    // SVBT16 fFldVanish :1;// 1 == opposite of style
    // SVBT16 fSmallCaps :1;// 1 == opposite of style
    // SVBT16 fCaps :1;// 1 == opposite of style
    // SVBT16 fVanish :1;// 1 == opposite of style
    // SVBT16 fRMark :1;// ???
    // SVBT16 fSpec :1;// 1 == opposite of style
    // SVBT16 fsIco :1;// 1 == Color (ico) different to style
    // SVBT16 fsFtc :1;// 1 == FontCode (ftc) different to style
    // SVBT16 fsHps :1;// 1 == FontSize (hps) different to style
    // SVBT16 fsKul :1;// 1 == Underline Code (kul) different to style
    // SVBT16 fsPos :1;// 1 == Char position (hpsPos) different to style
    // SVBT16 fsSpace :1;// 1 == Char Spacing (qpsSpace) different to style

    USHORT ftcGet()         { return SVBT16ToShort(ftc); }
    void ftcSet(USHORT n)   { ShortToSVBT16(n, ftc); }
    void hpsSet(BYTE n)     { ByteToSVBT8(n, hps); }
    BYTE hpsGet()           { return SVBT8ToByte(hps); }

    BYTE hpsPosGet()        { return SVBT8ToByte(hpsPos); }
    USHORT fTextGet()       { return SVBT16ToShort(fText); }
    void fTextSet(USHORT n) { ShortToSVBT16(n, fText); }
    USHORT qpsSpaceGet()    { return (USHORT)((fTextGet() >> 0) & 0x3f); }
    USHORT wSpare2Get()     { return (USHORT)((fTextGet() >> 6) & 3); }
    USHORT icoGet()         { return (USHORT)((fTextGet() >> 8) & 0xf); }
    USHORT kulGet()         { return (USHORT)((fTextGet() >> 12) & 7); }
    void kulSet(USHORT n)   { fTextSet( ( fTextGet() & 0x8fff ) | ( ( n & 7 ) << 12 ) ); }
    BOOL fSysVanishGet()    { return ((fTextGet() >> 15) & 1); }
    // SVBT16 qpsSpace :6;// Char Spacing, -7 .. 56; 57 = -7, 63 = -1
    // SVBT16 wSpare2 : 2;// reserved
    // SVBT16 ico :4;// color of Text: 0=black, 1=blue, 2=cyan, 3=green, 4=magenta, 5=red, 6=yellow, 7=white
    // SVBT16 kul: 3;// Underline code: 0=none, 1=single, 2=by word, 3=double, 4=dotted
    // SVBT16 fSysVanish: 1;// used internally

    ULONG fcPicGet()        { return SVBT32ToLong(fcPic); }
    USHORT fnPicGet()       { return SVBT8ToByte(fnPic); }
    USHORT hpsLargeChpGet() { return SVBT16ToShort(hpsLargeChp); }

    void Out(Ww1Shell&, Ww1Manager&);
};

struct W1_FFN ///////////////////////////////////////// Font Descriptor
{
    SVBT8 cbFfnM1;// 0x0    total length of FFN - 1.
    USHORT cbFfnM1Get() {
        return SVBT8ToByte(cbFfnM1); }
    SVBT8 fFlags;
    USHORT fFlagsGet() {
        return SVBT8ToByte(fFlags); }
    // SVBT8 prg : 2;// 0x1:03  pitch request
    USHORT prgGet() {
        return (USHORT)((fFlagsGet() >> 0) & 3); }
    // SVBT8 fTrueType : 1;//   0x1:04  when 1, font is a TrueType font
    BOOL fTrueTypeGet() {
        return ((fFlagsGet() >> 2) & 1); }
    // SVBT8 : 1;// 0x1:08  reserved
    // SVBT8 ff : 3;//  0x1:70  font family id
    USHORT ffGet() {
        return (USHORT)((fFlagsGet() >> 4) & 7); }
    // SVBT8 : 1;// 0x1:80  reserved
    BYTE szFfn[65];// 0x6       zero terminated string that records name of font.
                            // Vorsicht: Dieses Array kann auch kleiner sein!!!
                            // Possibly followed by a second sz which records the name of an
                            // alternate font to use if the first named font does not exist
                            // on this system. Maximal size of szFfn is 65 characters.
    BYTE* szFfnGet() { return szFfn; }
};

struct W1_PHE /////////////////////////////////////// Paragraph Height
{
    SVBT16 fFlags;
    USHORT fFlagsGet() {
        return SVBT16ToShort(fFlags); }
    BOOL fSpareGet() {
        return fFlagsGet() & 1; }
    BOOL fUnkGet() {
        return (fFlagsGet() >> 1) & 1; }
    BOOL fDiffLinesGet() {
        return (fFlagsGet() >> 2) & 1; }
    BYTE clMacGet() {
        return (fFlagsGet() >> 8) & 0xff; }
    SVBT16 dxaCol;
    USHORT dxaColGet() {
        return SVBT16ToShort(dxaCol); }
    SVBT16 xxx; // beachte die dreifachnutzung.... siehe doc.
    USHORT dylHeightGet() {
        return SVBT16ToShort(xxx); }
    USHORT dylLineGet() {
        return SVBT16ToShort(xxx); }
    USHORT fStyleDirtyGet() {
        return SVBT16ToShort(xxx); }
};

struct W1_PAPX ///////////////////////// Paragraph Property Difference
{
    SVBT8 stc;
    BYTE stcGet() {
        return SVBT8ToByte(stc); }
    W1_PHE phe;
    BYTE grpprl[1];
    BYTE* grpprlGet() {
        return grpprl; }
};

struct W1_BRC //////////////////////////////////////////// Border Code
{
    SVBT16 aBits;
    USHORT aBitsGet() {
        return SVBT16ToShort(aBits); }
    // SVBT16 dxpLineWidth : 3;// 0007 When dxpLineWidth is 0, 1, 2, 3, 4, or 5,
                                // this field is the width of a single line of border
                                // in units of 0.75 points Must be nonzero when brcType
                                // is nonzero. 6 == dotted, 7 == dashed.
    BYTE dxpLineWidthGet() {
        return (aBitsGet() >> 0) & 0x0007; }
    // SVBT16 brcType : 2;// 0018 border type code: 0 == none, 1 == single, 2 == thick,
                            // 3 == double
    BYTE brcTypeGet() {
        return (aBitsGet() >> 3) & 0x0003; }
    // SVBT16 fShadow : 1;// 0020   when 1, border is drawn with shadow. Must be 0
                            // when BRC is a substructure of the TC
    BYTE fShadowGet() {
        return (aBitsGet() >> 5) & 0x0001; }
    // SVBT16 ico : 5;// 07C0 color code (see chp.ico)
    BYTE icoGet() {
        return (aBitsGet() >> 6) & 0x001f; }
    // SVBT16 dxpSpace : 5;// F800  width of space to maintain between border and
                                // text within border. Must be 0 when BRC is a
                                // substructure of the TC. Stored in points for Windows.
    BYTE dxpSpaceGet() {
        return (aBitsGet() >> 11) & 0x001f; }
};

struct W1_BRC10 ///////////////////////////////// Border Code Word 1.0
{
    SVBT16 aBits;
    USHORT aBitsGet() {
        return SVBT16ToShort(aBits); }
    BYTE dxpLine2WidthGet() {
        return (aBitsGet() >> 0) & 0x0007; }
    BYTE dxpSpaceBetweenGet() {
        return (aBitsGet() >> 3) & 0x0007; }
    BYTE dxpLine1WidthGet() {
        return (aBitsGet() >> 6) & 0x0007; }
    BYTE dxpSpaceGet() {
        return (aBitsGet() >> 9) & 0x001f; }
    BYTE fShadowGet() {
        return (aBitsGet() >> 14) & 0x0001; }
    BYTE fSpareGet() {
        return (aBitsGet() >> 15) & 0x0001; }
};

struct W1_FLD //////////////////////////////////////// FieldDescriptor
{
    SVBT8 ch; // boundary-type (begin(19), separator (20), end (21))
    BYTE chGet() {
        return SVBT8ToByte(ch); }
    SVBT8 flt; // field type / flags
    BYTE fltGet() {
        return SVBT8ToByte(flt); }
    // variant, when ch==21:
    BOOL fDifferGet() {
        return (fltGet() >> 0) & 1; }
    BOOL fResultDirtyGet() {
        return (fltGet() >> 2) & 1; }
    BOOL ResultEditedGet() {
        return (fltGet() >> 3) & 1; }
    BOOL fLockedGet() {
        return (fltGet() >> 4) & 1; }
    BOOL fPrivateResultGet() {
        return (fltGet() >> 5) & 1; }
    BOOL fNestedGet() {
        return (fltGet() >> 6) & 1; }
};

struct W1_PIC /////////////////////////////////////// PictureStructure
{
    SVBT32 lcb;// 0x0 number of bytes in the PIC structure plus size of following picture data which may be a Window's metafile, a bitmap, or the filename of a TIFF file.
    ULONG lcbGet() {
        return SVBT32ToLong(lcb); }
    SVBT16 cbHeader;// 0x4 number of bytes in the PIC (to allow for future expansion).
    USHORT cbHeaderGet() {
        return SVBT16ToShort(cbHeader); }
    struct MFP {
        SVBT16 mm;// 0x6    int
        USHORT mmGet() {
            return SVBT16ToShort(mm); }
        SVBT16 xExt;// 0x8  int
        USHORT xExtGet() {
            return SVBT16ToShort(xExt); }
        SVBT16 yExt;// 0xa  int
        USHORT yExtGet() {
            return SVBT16ToShort(yExt); }
        SVBT16 hMF;// 0xc   int
        USHORT hMFGet() {
            return SVBT16ToShort(hMF); }
    } mfp;
    union W1_MFP_BMP {
        SVBT8 bm[14];// 0xe BITMAP(14 bytes)    Window's bitmap structure when PIC describes a BITMAP.
        SVBT8 rcWinMF[14];// 0xe    rc (rectangle - 8 bytes) rect for window origin and extents when metafile is stored -- ignored if 0
    } MFP_BMP;
    SVBT16 dxaGoal;// 0x1c  horizontal measurement in twips of the rectangle the picture should be imaged within.
    USHORT dxaGoalGet() {
        return SVBT16ToShort(dxaGoal); }
    SVBT16 dyaGoal;// 0x1e  vertical measurement in twips of the rectangle the picture should be imaged within.
    USHORT dyaGoalGet() {
        return SVBT16ToShort(dyaGoal); }
    SVBT16 mx;// 0x20   horizontal scaling factor supplied by user in .1% units.
    USHORT mxGet() {
        return SVBT16ToShort(mx); }
    SVBT16 my;// 0x22   vertical scaling factor supplied by user in .1% units.
    USHORT myGet() {
        return SVBT16ToShort(my); }
    SVBT16 dxaCropLeft;// 0x24  the amount the picture has been cropped on the left in twips.
    USHORT dxaCropLeftGet() {
        return SVBT16ToShort(dxaCropLeft); }
    SVBT16 dyaCropTop;// 0x26   the amount the picture has been cropped on the top in twips.
    USHORT dyaCropTopGet() {
        return SVBT16ToShort(dyaCropTop); }
    SVBT16 dxaCropRight;// 0x28 the amount the picture has been cropped on the right in twips.
    USHORT dxaCropRightGet() {
        return SVBT16ToShort(dxaCropRight); }
    SVBT16 dyaCropBottom;// 0x2a    the amount the picture has been cropped on the bottom in twips.
    USHORT dyaCropBottomGet() {
        return SVBT16ToShort(dyaCropBottom); }
    SVBT16 flags;
    USHORT flagsGet() {
        return SVBT16ToShort(flags); }
//  brcl : 4;// 000F    Obsolete, superseded by brcTop, etc. In
    BYTE brclGet() {
        return flagsGet() & 0xf; }
//  fFrameEmpty : 1;// 0010 picture consists of a single frame
    BOOL fFrameEmptyGet() {
        return (flagsGet() >> 4) & 1; }
// win6 stuff:
//  fBitmap : 1;// 0020 ==1, when picture is just a bitmap
//  BOOL fBitmapGet() {
//      return (flagsGet() >> 5) & 1; }
//  fDrawHatch : 1;// 0040  ==1, when picture is an active OLE object
//  BOOL fDrawHatchGet() {
//      return (flagsGet() >> 6) & 1; }
//  fError : 1;// 0080  ==1, when picture is just an error message
//  BOOL fErrorGet() {
//      return (flagsGet() >> 7) & 1; }
//  bpp : 8;// FF00 bits per pixel, 0 = unknown
//  BYTE bppGet() {
//      return (flagsGet() >> 8) & 0xff; }
//  SVBT16 rgbrc[4];
//  USHORT rgbrcGet(USHORT nIndex) {
//      return SVBT16ToShort(rgbrc[nIndex]); }
//  W1_BRC brcTop;// 0x2e   specification for border above picture
//  W1_BRC brcLeft;// 0x30 specification for border to the left
//  W1_BRC brcBottom;// 0x32    specification for border below picture
//  W1_BRC brcRight;// 0x34 specification for border to the right
//  SVBT16 dxaOrigin;// 0x36    horizontal offset of hand annotation origin
//  USHORT dxaOriginGet() {
//      return SVBT16ToShort(dxaOrigin); }
//  SVBT16 dyaOrigin;// 0x38    vertical offset of hand annotation origin
//  USHORT dyaOriginGet() {
//      return SVBT16ToShort(dyaOrigin); }
    SVBT8 rgb;// 0x3a   variable array of bytes containing Window's metafile, bitmap or TIFF file filename.
    BYTE* rgbGet() {
        return rgb; }
};

struct W1_TBD /////////////////////////////////////////////////////////
{
    SVBT8 aBits1;
    BYTE aBits1Get() {
        return SVBT8ToByte(aBits1); }
// SVBT8 jc : 3;// 0x07 justification code: 0=left tab, 1=centered tab, 2=right tab, 3=decimal tab, 4=bar
    BYTE jcGet() {
        return aBits1Get() & 0x07; }
// SVBT8 tlc : 3;// 0x38    tab leader code: 0=no leader, 1=dotted leader,
                        // 2=hyphenated leader, 3=single line leader, 4=heavy line leader
    BYTE tlcGet() {
        return (aBits1Get() >> 3 ) & 0x07; }
// *    int :2  C0  reserved
};

struct W1_TC //////////////////////////////////////////////////////////
{
    SVBT8 aBits1;
    BYTE aBits1Get() {
        return SVBT8ToByte(aBits1); }
    BYTE fFirstMergedGet() {
        return aBits1Get() & 0x01; }
    BYTE fMergedGet() {
        return (aBits1Get() >> 1 ) & 0x01; }
    SVBT8 aBits2;
// SVBT16 fFirstMerged : 1;// 0001  set to 1 when cell is first cell of a range of cells that have been merged.
// SVBT16 fMerged : 1;// 0002   set to 1 when cell has been merged with preceding cell.
// SVBT16 fUnused : 14;// FFFC  reserved
    W1_BRC10 rgbrc[4];// notational convenience for referring to brcTop, brcLeft, etc fields.
    W1_BRC10* rgbrcGet() {
        return rgbrc; }
// BRC brcTop;// specification of the top border of a table cell
// BRC brcLeft;// specification of left border of table row
// BRC brcBottom;// specification of bottom border of table row
// BRC brcRight;// specification of right border of table row.
};
// cbTC (count of bytes of a TC) is 10(decimal), A(hex).

#if 0
struct W1_SHD ////////////////////////////////////////////// struct SHD
{
    SVBT16 aBits1;
    // SVBT16 nFore : 5;// 0x001f ForegroundColor
    USHORT GetFore() { return SVBT16ToShort(aBits1) & 0x01; };
    void SetFore( short nVal ){
        ShortToSVBT16((SVBT16ToShort(aBits1)&0xffe0)|(nVal&0x1f), aBits1); };
    // SVBT16 nBack : 5;// 0x03e0 BackgroundColor
    W1_SHD() { ShortToSVBT16( 0, aBits1 ); };
    USHORT GetBack() { return (SVBT16ToShort(aBits1) >> 5 & 0x1f ); };
    void SetBack( short nVal ){
        ShortToSVBT16((SVBT16ToShort(aBits1)&0xfc1f)|(nVal&0x1f)<<5, aBits1); };
    // SVBT16 nStyle : 5;// 0x7c00 Percentage and Style
    USHORT GetStyle() { return (SVBT16ToShort(aBits1) >> 10 & 0x1f ); };
    void SetStyle( short nVal ){
        ShortToSVBT16((SVBT16ToShort(aBits1)&0x83ff)|(nVal&0x1f)<<10, aBits1); };
    // SVBT16 nDontKnow : 1;// 0x8000 ???
};

struct W1_ANLV ////////////////////////////////////////////////////////
{
    SVBT8 nfc;// 0 number format code, 0=Arabic, 1=Upper case Roman, 2=Lower case Roman
                        // 3=Upper case Letter, 4=Lower case letter, 5=Ordinal
    SVBT8 cbTextBefore;// 1 offset into anld.rgch limit of prefix text
    SVBT8 cbTextAfter;// 2
    SVBT8 aBits1;
// SVBT8 jc : 2;// 3 : 0x03 justification code, 0=left, 1=center, 2=right, 3=left and right justify
// SVBT8 fPrev : 1;// 0x04  when ==1, include previous levels
// SVBT8 fHang : 1;// 0x08  when ==1, number will be displayed using a hanging indent
// SVBT8 fSetBold : 1;// 0x10   when ==1, boldness of number will be determined by anld.fBold.
// SVBT8 fSetItalic : 1;// 0x20 when ==1, italicness of number will be determined by anld.fItalic
// SVBT8 fSetSmallCaps : 1;// 0x40  when ==1, anld.fSmallCaps will determine whether number will be displayed in small caps or not.
// SVBT8 fSetCaps : 1;// 0x80   when ==1, anld.fCaps will determine whether number will be displayed capitalized or not
    SVBT8 aBits2;
// SVBT8 fSetStrike : 1;// 4 : 0x01 when ==1, anld.fStrike will determine whether the number will be displayed using strikethrough or not.
// SVBT8 fSetKul : 1;// 0x02 when ==1, anld.kul will determine the underlining state of the autonumber.
// SVBT8 fPrevSpace : 1;// 0x04 when ==1, autonumber will be displayed with a single prefixing space character
// SVBT8 fBold : 1;// 0x08  determines boldness of autonumber when anld.fSetBold == 1.
// SVBT8 fItalic : 1;// 0x10    determines italicness of autonumber when anld.fSetItalic == 1.
// SVBT8 fSmallCaps : 1;// 0x20 determines whether autonumber will be displayed using small caps when anld.fSetSmallCaps == 1.
// SVBT8 fCaps : 1;// 0x40  determines whether autonumber will be displayed using caps when anld.fSetCaps == 1.
// SVBT8 fStrike : 1;// 0x80    determines whether autonumber will be displayed using caps when anld.fSetStrike == 1.
    SVBT8 aBits3;
// SVBT8 kul : 3;// 5 : 0x07    determines whether autonumber will be displayed with underlining when anld.fSetKul == 1.
// SVBT8 ico : 5;// 0xF1    color of autonumber
    SVBT16 ftc;// 6 font code of autonumber
    SVBT16 hps;// 8 font half point size (or 0=auto)
    SVBT16 iStartAt;// 0x0a starting value (0 to 65535)
    SVBT16 dxaIndent;// 0x0c *short?* *USHORT?* width of prefix text (same as indent)
    SVBT16 dxaSpace;// 0x0e     minimum space between number and paragraph
};
// *cbANLV (count of bytes of ANLV) is 16 (decimal), 10(hex).

struct W1_ANLD ////////////////////////////////////////////////////////
{
    W1_ANLV eAnlv;// 0
    SVBT8 fNumber1;// 0x10      number only 1 item per table cell
    SVBT8 fNumberAcross;// 0x11     number across cells in table rows(instead of down)
    SVBT8 fRestartHdn;// 0x12       restart heading number on section boundary
    SVBT8 fSpareX;// 0x13       unused( should be 0)
    sal_Char rgchAnld[32];// 0x14   characters displayed before/after autonumber
};


struct W1_OLST ////////////////////////////////////////////////////////
{
    W1_ANLV rganlv[9];// 0 an array of 9 ANLV structures (heading levels)
    SVBT8 fRestartHdr;// 0x90 when ==1, restart heading on section break
    SVBT8 fSpareOlst2;// 0x91 reserved
    SVBT8 fSpareOlst3;// 0x92 reserved
    SVBT8 fSpareOlst4;// 0x93 reserved
    sal_Char rgch[64];// 0x94 array of 64 chars     text before/after number
};
// cbOLST is 212(decimal), D4(hex).

#endif
#endif

diff --git a/sw/source/filter/ww8/dump/dump8.cxx b/sw/source/filter/ww8/dump/dump8.cxx
new file mode 100644
index 0000000..e0e5970
--- /dev/null
+++ b/sw/source/filter/ww8/dump/dump8.cxx
@@ -0,0 +1,259 @@
/*************************************************************************
 *
 *  $RCSfile: dump8.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:59 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/


#ifndef _SV_SVAPP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _SV_WRKWIN_HXX //autogen
#include <vcl/wrkwin.hxx>
#endif
#ifndef _SV_MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif

#ifndef _FACTORY_HXX //autogen
#include <so3/factory.hxx>
#endif

#ifndef _SVSTOR_HXX //autogen
#include <so3/svstor.hxx>
#endif

// globale Vars

char** pPara;

// Deklarationen

int PrepareConvert( String& rName, String& rOutName, String& rMess );
int DoConvert( const String& rName, BYTE nVersion );
void DeInit();



// -----------------------------------------------------------------------

class MyApp : public Application
{
public:
    void Main();
};

// -----------------------------------------------------------------------

MyApp aMyApp;

// -----------------------------------------------------------------------

class MyWin : public WorkWindow
{
    String& rMessg;
public:
         MyWin( Window* pParent, WinBits aWinStyle, String& rMess ) :
             WorkWindow(pParent, aWinStyle), rMessg( rMess ) {}

    void Paint( const Rectangle& );
    void Resize();

    void MouseButtonDown( const MouseEvent& rMEvt );
    void KeyInput( const KeyEvent& rKEvt );
};

// -----------------------------------------------------------------------

extern SvStorageStreamRef xStrm;

void MyApp::Main()
{
    SvFactory::Init();
    String aMess, aName, aOutName;
    BYTE nVersion = 8;

    int nArgs = GetCommandLineParamCount();
    if (nArgs)
    {
        aName = GetCommandLineParam( 0 );
        if (aName.Search('.') == STRING_NOTFOUND)
            aName += ".doc";
        if (nArgs >= 2)
        {
            aOutName = GetCommandLineParam( 1 );
            if (nArgs > 2)
            {
                nVersion = (BYTE)(USHORT)GetCommandLineParam( 2 );
                if( 6 > nVersion || 8 < nVersion )
                {
                    aMess = "Aufruf: Dump1 InFile [OutFile] [6|7|8]";
                }
            }
        }
        else
        {
            aOutName = aName;
            aOutName.Erase(aOutName.Search('.'));
            aOutName += ".dmp";
        }
    }

    BOOL bOk =     !aMess
                && !PrepareConvert( aName, aOutName, aMess )
                && !DoConvert( aName, nVersion  );

    if( !bOk )
    {
        MyWin aMainWin( NULL, WB_APP | WB_STDWORK, aMess );

        aMainWin.SetText( "WW8-Dumper" );
        aMainWin.Show();
        aMainWin.Invalidate();

        Execute();
    }
    DeInit();
//  SvFactory::DeInit();
}

// -----------------------------------------------------------------------

void MyWin::Paint( const Rectangle& )
{
    String aText( "Dumper fuer WinWord-Dateien !\n"
                                "Die Wandlung ging schief. Ist es wirklich ein WW-File ?" );

    Size  aWinSize  = GetOutputSizePixel();
    Size  aTextSize = GetTextSize( aText );
    Point aPos( aWinSize.Width() / 2  - aTextSize.Width() / 2,
                aWinSize.Height() / 2 - aTextSize.Height() / 2 );

    DrawText( aPos, aText );

    aPos.Y() += 20;
    DrawText( aPos, rMessg );
}

// -----------------------------------------------------------------------

void MyWin::Resize()
{
    Invalidate();
}

// -----------------------------------------------------------------------

void MyWin::MouseButtonDown( const MouseEvent& )
{
}

// -----------------------------------------------------------------------

void MyWin::KeyInput( const KeyEvent& rKEvt )
{
    WorkWindow::KeyInput( rKEvt );
}



//class XVclComponentPeer;
XWindowPeer* Window::GetComponentInterface( BOOL )
{
return 0;
}

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ww8/dump/dump8.cxx,v 1.1.1.1 2000-09-18 17:14:59 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.8  2000/09/18 16:05:02  willem.vandorp
      OpenOffice header added.

      Revision 1.7  2000/02/14 14:40:00  jp
      #70473# changes for unicode

      Revision 1.6  2000/01/25 10:44:55  khz
      change: update the dumper according to import improvements

      Revision 1.5  1999/08/16 10:22:38  JP
      neu: Dump EscherObjects


      Rev 1.4   16 Aug 1999 12:22:38   JP
   neu: Dump EscherObjects

      Rev 1.3   15 Jun 1999 14:19:16   JP
   new: ListTable and other Contents

      Rev 1.2   25 Jun 1998 15:43:46   KHZ
   Strukturaenderung fuer PAPX FKPs

      Rev 1.1   10 Jun 1998 17:22:32   KHZ
   Zwischenstand-Sicherung Dumper

      Rev 1.0   27 May 1998 15:29:52   KHZ
   Initial revision.

*************************************************************************/

diff --git a/sw/source/filter/ww8/dump/dump8a.cxx b/sw/source/filter/ww8/dump/dump8a.cxx
new file mode 100644
index 0000000..9ce9c04
--- /dev/null
+++ b/sw/source/filter/ww8/dump/dump8a.cxx
@@ -0,0 +1,3127 @@
/*************************************************************************
 *
 *  $RCSfile: dump8a.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:59 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/


//#include <stdio.h>        // SEEK_SET
#include <string.h>     // memset(), ...
#include <io.h>         // access()


//#include "defs.hxx"
#include <tools/solar.h>
#ifndef _SVSTOR_HXX //autogen
#include <so3/svstor.hxx>
#endif
#include "ww8struc.hxx"
#include "ww8scan.hxx"
#include "ww8darr.hxx"
#include "ww8dout.hxx"

#if 0
#define DELETEZ( p ) ( delete( p ), p = 0 )
//#define LONG_MAX ( (long)0x7fffffff )
#endif
#define ASSERT( a, b ) ( (a)?(void)0:(void)(*pOut<<endl1<<"ASSERTION failed "<< __FILE__<<__LINE__<< b <<endl1) )


#define nWW8MaxListLevel 9

WW8ScannerBase* pSBase = 0;
//WW8PLCFMan* pPLCFMan = 0;

WW8Fib*            pWwFib = 0;
SvStorageRef*      pxStor;
SvStorageStreamRef xStrm;
SvStorageStreamRef xTableStream;    // ist bei Ver6-7 mit xStrm identisch,
                                    // ansonsten entweder 0TABLE oder 1TABLE
SvStorageStreamRef xDataStream;     // ist bei Ver6-7 mit xStrm identisch,
                                    // ansonsten DATA

typedef void (*FNDumpData)( void* );

BOOL DumpChar( BYTE c );
void DumpShortPlainText( WW8_CP nStartCp, long nTextLen, char* pName );
void DumpPlainText( WW8_CP nStartCp, long nTextLen, char* pName );
void DumpSprms( BYTE nVersion, SvStream& rSt, short nLen );


BOOL WW8ReadINT32( SvStream& rStrm, INT32& rTarget )
{
      rStrm >> rTarget;
      return TRUE;


      SVBT32 nData;
      BOOL bOk = TRUE;
      if( 4 == rStrm.Read( &nData, 4 ) )
              rTarget = SVBT32ToLong( nData );
      else
              bOk = FALSE;
      return bOk;
}

BOOL WW8ReadINT16( SvStream& rStrm, INT16& rTarget )
{
      rStrm >> rTarget;
      return TRUE;


      SVBT16 nData;
      BOOL bOk = TRUE;
      if( 2 == rStrm.Read( &nData, 2 ) )
      {
              rTarget = SVBT16ToShort( nData );
      }
      else
              bOk = FALSE;
      return bOk;
}

BOOL WW8ReadBYTE( SvStream& rStrm, BYTE& rTarget )
{
      rStrm >> rTarget;
      return TRUE;


      SVBT8 nData;
      BOOL bOk = TRUE;
      if( 1 == rStrm.Read( &nData, 1 ) )
              rTarget = SVBT8ToByte( nData );
      else
              bOk = FALSE;
      return bOk;
}

BOOL WW8ReadUINT32( SvStream& rStrm, UINT32& rTarget )
     { return WW8ReadINT32( rStrm, (INT32&) rTarget ); }

BOOL WW8ReadUINT16( SvStream& rStrm, UINT16& rTarget )
     { return WW8ReadINT16( rStrm, (INT16&) rTarget ); }


static void Dump_LVL( UINT16 nLevel )
{
    indent( *pOut, *xTableStream );

    long nStart, dxaSpace, dxaIndent;
    BYTE nfc, nFlags, ixchFollow, cbChpx, cbPapx;
    BYTE aOfsNumsXCH[nWW8MaxListLevel];
    *xTableStream >> nStart >> nfc >> nFlags;
    xTableStream->Read( aOfsNumsXCH, 9 );
    *xTableStream >> ixchFollow >> dxaSpace >> dxaIndent
        >> cbChpx >> cbPapx;
    xTableStream->SeekRel( 2 );

    *pOut << " Level: " << nLevel << endl1;
    *pOut << indent2 << "  Start: " << nStart
                    << " Fmt: " << (USHORT)nfc
                    << " Follow: ";
    if( 0 == ixchFollow ) *pOut << "tab";
    else if( 1 == ixchFollow ) *pOut << "blank";
    else if( 2 == ixchFollow ) *pOut << "nothing";
    *pOut << endl1  << indent2<< "  dxSpace: " << dxaSpace
        << " dxaIndent: " << dxaIndent << " LevelCharPos: ";

    for( BYTE x = 0; x < nWW8MaxListLevel; ++x )
        *pOut << (USHORT)aOfsNumsXCH[ x ] << ", ";
    *pOut << endl1;

    if( cbPapx )
    {
        ULONG nXPos = xTableStream->Tell();
        DumpSprms( pWwFib->nVersion, *xTableStream, cbPapx );
        xTableStream->Seek( nXPos + cbPapx );
    }
    if( cbChpx )
    {
        ULONG nXPos = xTableStream->Tell();
        DumpSprms( pWwFib->nVersion, *xTableStream, cbChpx );
        xTableStream->Seek( nXPos + cbChpx );
    }

    USHORT nStrLen, nC;
    *xTableStream >> nStrLen;
    char* pStr = new char[ nStrLen+1 ], *p = pStr;
    while( nStrLen-- )
    {
        *xTableStream >> nC;
        if( 10 > nC ) nC += 0x30;
        *pStr++ = (char)nC;
    }
    *pStr = 0;
    *pOut << indent2 << "Str: \"" << p << '\"' << endl1 << endl1;
}

static void DumpNumList()
{
    if( pWwFib->lcbSttbListNames )
    {
        ULONG nOldPos = xTableStream->Tell();
        xTableStream->Seek( pWwFib->fcSttbListNames );

        *pOut << endl1;
        begin( *pOut, *xTableStream ) << "ListNames, Size ";

        UINT16 nDummy;
        UINT32 nCount;
        *xTableStream >> nDummy >> nCount;

        *pOut << nCount << ", Dummy: " << nDummy << endl1;

        *pOut << indent2;
        for( ; nCount; --nCount )
        {
            UINT16 nLen, nC;
            *xTableStream >> nLen;
            char * pChar = new char[ nLen + 1 ], *p = pChar;
            while( nLen-- )
            {
                *xTableStream >> nC;
                *pChar++ = (char)nC;
            }
            *pChar = 0;
            *pOut << '\"' << p << '\"';
            if( 1 < nCount ) *pOut << ", ";
            delete p;
        }
        *pOut << endl1;

        end( *pOut, *xTableStream ) << "ListNames" << endl1;
        xTableStream->Seek( nOldPos );
    }

    if( pWwFib->lcbPlcfLst )
    {
        ULONG nOldPos = xTableStream->Tell();
        xTableStream->Seek( pWwFib->fcPlcfLst );

        *pOut << endl1;
        begin( *pOut, *xTableStream ) << "LiST Data on File, Size ";

        UINT16 nCount;
        *xTableStream >> nCount;
        *pOut << nCount << endl1;

        ULONG nLVLPos = pWwFib->fcPlcfLst + ( nCount * 0x1c ) + 2;

        // 1.1 alle LST einlesen
        for( UINT16 nList = 0; nList < nCount; nList++ )
        {
            indent( *pOut, *xTableStream );

            BYTE nByte;
            UINT32 nLstId, nTplId;
            *xTableStream >> nLstId >> nTplId;

            USHORT aStyleIdArr[ nWW8MaxListLevel ];
            for( USHORT nLevel = 0; nLevel < nWW8MaxListLevel; nLevel++ )
                *xTableStream >> aStyleIdArr[ nLevel ];
            *xTableStream >> nByte;
            xTableStream->SeekRel( 1 );     // Dummy ueberlesen

            *pOut << "ListId: " << nLstId
                << " TemplateId " << nTplId << endl1
                << indent2 << " StyleIds: ";
            for( nLevel = 0; nLevel < nWW8MaxListLevel; nLevel++ )
                *pOut << aStyleIdArr[ nLevel ] << ", ";

            *pOut << endl1;
            if( 1 & nByte ) *pOut << " <simple List>";
            if( 2 & nByte ) *pOut << " <restart at new section>";
            if( 3 & nByte ) *pOut << endl1;

            ULONG nTmpPos = xTableStream->Tell();
            xTableStream->Seek( nLVLPos );

            // 1.2 alle LVL aller aLST einlesen
            for( nLevel = 0; nLevel < ((1 & nByte) ? 1 : nWW8MaxListLevel); nLevel++ )
                Dump_LVL( nLevel );

            nLVLPos = xTableStream->Tell();
            xTableStream->Seek( nTmpPos );
        }

        end( *pOut, *xTableStream ) << "LiST Data on File" << endl1;
        xTableStream->Seek( nOldPos );
    }

    if( pWwFib->lcbPlfLfo )
    {
        ULONG nOldPos = xTableStream->Tell();
        xTableStream->Seek( pWwFib->fcPlfLfo );

        *pOut << endl1;
        begin( *pOut, *xTableStream ) << "List Format Override, Size ";

        UINT32 nCount, nLstId;
        *xTableStream >> nCount;
        *pOut << nCount << endl1;

        ULONG nLVLPos = pWwFib->fcPlfLfo + ( nCount * 0x10 ) + 4;

        for( ; nCount; --nCount )
        {
            indent( *pOut, *xTableStream );

            BYTE nLevels;
            *xTableStream >> nLstId;
            xTableStream->SeekRel( 8 );
            *xTableStream >> nLevels;
            xTableStream->SeekRel( 3 );

            *pOut << "ListId: " << nLstId
                << " Override Levels: " << (USHORT)nLevels << endl1;

            ULONG nTmpPos = xTableStream->Tell();
            xTableStream->Seek( nLVLPos );

            for( BYTE nLvl = 0; nLvl < nLevels; ++nLvl )
            {
                UINT32 nStartAt;
                BYTE nFlags;
                do {
                    *xTableStream >> nFlags;
                } while( 0xFF == nFlags  );
                xTableStream->SeekRel( -1 );

                indent( *pOut, *xTableStream );
                *xTableStream >> nStartAt >> nFlags;
                xTableStream->SeekRel( 3 );

                if( nFlags & 0x10 ) *pOut << "<Override start>";
                if( nFlags & 0x20 ) *pOut << "<Override formattting>";
                if( nFlags & 0x30 ) *pOut << endl1;

                if( nFlags & 0x20 )
                    Dump_LVL( nFlags & 0x0F );
            }
            nLVLPos = xTableStream->Tell();
            xTableStream->Seek( nTmpPos );
        }

        end( *pOut, *xTableStream ) << "List Format Override" << endl1 << endl1;
        xTableStream->Seek( nOldPos );
    }
}

static void DumpBookLow()
{
    *pOut << begin2 << "Bookmarks Low" << endl1;
    *pOut << indent2 <<"Start:  Adr " << hex6 << pWwFib->fcPlcfbkf
         << ", Len: " << pWwFib->lcbPlcfbkf << endl1;
    *pOut << indent2 << "End:    Adr " << hex6 << pWwFib->fcPlcfbkl
         << ", Len: " << pWwFib->lcbPlcfbkl << endl1;
    *pOut << indent2 << "Strings: Adr " << hex6 << pWwFib->fcSttbfbkmk
         << ", Len: " << pWwFib->lcbSttbfbkmk << endl1;
    *pOut << endl1;

    WW8PLCFspecial aStarts( &xStrm, pWwFib->fcPlcfbkf, pWwFib->lcbPlcfbkf, 4 );
    WW8PLCFspecial aEnds(   &xStrm, pWwFib->fcPlcfbkl, pWwFib->lcbPlcfbkl, 0, -1, TRUE );

    USHORT i = 0;
    while( 1 ){
        long nStart = aStarts.GetPos( i );
        if( nStart >= LONG_MAX )
            break;

        *pOut << indent2 << i << ".StartCp: " << hex6 << nStart;

        const void* p = aStarts.GetData( i );
        if( p ){
            *pOut << ", EndIdx: ";
            USHORT nEndIdx = *((USHORT*)p);
            *pOut << nEndIdx;
            long nEnd = aEnds.GetPos( nEndIdx );
            *pOut << ", End: " << hex6 << nEnd << hex
                  << ", Len: " << nEnd - nStart << dec;
        }else{
            *pOut << " aStarts.GetData() ging schief.";
        }

#if 0       // gibt's im wirklichen Leben nicht
        if( aEnds.Get( n, p ) ){
            *pOut << " aEnds.iBkf: ";
            if( p )
                *pOut << *((USHORT*)p);
            else
                *pOut << "NULL-Ptr";
        }else{
            *pOut << " aEnds.Get() ging schief.";
        }
#endif

        *pOut << endl1;
        i++;
    }
    *pOut << end2 << "Bookmarks Low" << endl1 << endl1;
}

static void DumpBookHigh()
{
    WW8PLCFx_Book aBook( &xStrm, &xTableStream, *pWwFib, 0 );
    if( !aBook.GetIMax() ){
        *pOut << indent1 << "No Bookmarks" << endl1 << endl1;
        return;
    }

    *pOut << indent1 << begin1 << "Bookmarks High" << endl1;

    USHORT i = 0;
    while( 1 ){
        long nPos = aBook.Where();
        if( nPos >= LONG_MAX )
            break;
        *pOut << indent2 << i << ". Cp:" << hex6 << nPos << dec;
        *pOut << ( ( aBook.GetIsEnd() ) ? " Ende  " : " Anfang" );
        *pOut << " Handle: " << aBook.GetHandle();
//      *pOut << " Len: " << hex4 << aBook.GetLen() << dec;
        const char* pN = aBook.GetName();
        if( pN )
            *pOut << " Name: " << pN << endl1;
        else
            *pOut << endl1;
        aBook++;
        i++;
    }
    *pOut << end2 << "Bookmarks High" << endl1 << endl1;
}

static BOOL DumpField3( WW8PLCFspecial& rPlc )
{
    WW8FieldDesc aF;

    BOOL bOk = WW8GetFieldPara( pWwFib->nVersion, rPlc, aF );
    if( !bOk )
    {
        *pOut << "       " << indent1 << "no WW8GetFieldPara()" << endl1;
        return FALSE;
    }
    *pOut << "       " << indent1 << begin1 << "Field Cp: " << hex
          << aF.nSCode << ", Len: " << aF.nLCode << "; Cp: " << aF.nSRes
          << ", Len: "<< aF.nLRes << ", Typ: " << dec << (USHORT)aF.nId
          << ", Options: " << hex << (USHORT)aF.nOpt;
    if( aF.bCodeNest )
        *pOut << " Code Nested";
    if( aF.bResNest )
        *pOut << " Result Nested";
    *pOut << endl1;
    DumpShortPlainText( aF.nSCode, aF.nLCode, "Code" );
    DumpShortPlainText( aF.nSRes, aF.nLRes, "Result" );
    *pOut << "       " << end1 << "Field" << endl1;
    return TRUE;
}

static BOOL DumpField2( WW8PLCFspecial& rPlc )
{
    WW8_CP nSCode, nECode, nSRes, nERes;
    void* pData;
    if( !rPlc.Get( nSCode, pData ) )                // Ende des Plc1 ?
        return FALSE;
    rPlc++;

    if( ((BYTE*)pData)[0] != 19 ){
        *pOut << "Field Error, " << (USHORT)((BYTE*)pData)[0] << endl1;
        return TRUE;    // nicht abbrechen
    }

    *pOut << "       " << indent1 << begin1 << "Field" << " Cp: " << hex
          << nSCode << " Typ: " << dec << (USHORT)((BYTE*)pData)[1] << endl1;

    if( !rPlc.Get( nECode, pData ) )            // Ende des Plc1 ?
        return FALSE;

    DumpShortPlainText( nSCode, nECode - nSCode, "Code" );  // Code, bei nested abgeschnitten
    nSRes = nECode;                             // Default


    while( ((BYTE*)pData)[0] == 19 ){           // immer noch neue (nested) Anfaenge ?
        DumpField2( rPlc );                     // nested Field im Beschreibungsteil
        if( !rPlc.Get( nSRes, pData ) )         // Ende des Plc1 ?
            return FALSE;
    }

    if( ((BYTE*)pData)[0] == 20 ){              // Field Separator ?
        rPlc++;
        *pOut << "       " << indent1 << "Field Seperator" << " Cp: " << hex << nSRes
              << ", Flags = 0x" << hex << (USHORT)((BYTE*)pData)[1] << dec << endl1;
        if( !rPlc.Get( nERes, pData ) )         // Ende des Plc1 ?
            return FALSE;

        while( ((BYTE*)pData)[0] == 19 ){       // immer noch neue (nested) Anfaenge ?
            DumpField2( rPlc );                 // nested Field im Resultatteil
            if( !rPlc.Get( nERes, pData ) )     // Ende des Plc1 ?
                return FALSE;
        }
        DumpShortPlainText( nSRes, nERes - nSRes, "Result" );   // Result, bei nested incl. nested Field

    }else{
        nERes = nSRes;                          // Kein Result vorhanden
    }

    rPlc++;
    if( ((BYTE*)pData)[0] == 21 ){              // Field Ende ?
        *pOut << "       " << end1 << " Field " << " Cp: " << hex << nERes
              << ", Flags = 0x" << hex << (USHORT)((BYTE*)pData)[1] << dec << endl1;
    }else{
        *pOut << "       Unknown Field Type" << endl1;
        *pOut << "       " << end1 << " Field " << endl1;
    }

    return TRUE;
}

static void DumpField1( WW8_FC nPos, long nLen, char* pName )
{
    if( !nLen )
    {
        *pOut << pName << ": No Fields" << endl1 << endl1;
        return;
    }

    WW8PLCFspecial aPlc( &xTableStream, nPos, nLen, 2 );

    *pOut << hex6 << nPos << dec2 <<  ' ' << indent1 << begin1;
    *pOut << "Plc." << pName << ", Len: ";
    *pOut << nLen << ", ca. " << aPlc.GetIMax()/3 << " Elements"

            << " Idx: " << (long)aPlc.GetIdx()
            << " IMax: " << aPlc.GetIMax()

            << endl1;

//  while( DumpField2( aPlc ) ){}
    while( (long)aPlc.GetIdx() < aPlc.GetIMax() )
    {
        DumpField3( aPlc );
        aPlc++;
    }

    end( *pOut, *xStrm ) << "Plcx." << pName << endl1 << endl1;
}


//-----------------------------------------
static void DumpFonts()
{
    WW8Fonts aFonts( *xTableStream, *pWwFib );

    USHORT i;

    *pOut << endl1;
    *pOut << 'T' << hex6 << pWwFib->fcSttbfffn << dec2 << ' ' << indent1 << begin1 << "FFNs" << endl1;

    for( i=0; i<aFonts.GetMax(); i++){
        // const
        WW8_FFN* p = (WW8_FFN*)aFonts.GetFont( i );

        *pOut << "Id:" << i << " Name:\"" << String( p->sFontname ).GetStr() << '"';    // Name
        if( p->ibszAlt )                    // gibt es einen alternativen Font ?

        *pOut << ", Alternativ:" << '"' << String( p->sFontname.Copy( p->ibszAlt ) ).GetStr() << '"';

        *pOut << ", PitchRequest:" << (short)p->prg << ", TrueType:" << (short)p->fTrueType;
        *pOut << ", FontFamily:" << (short)p->ff;
        *pOut << ", BaseWeight:" << p->wWeight;
        *pOut << ", CharacterSet:" << (short)p->chs;
        *pOut << endl1;
    }
    *pOut << "       " << end1 << "FFNs" << endl1 << endl1;
}


//-----------------------------------------
//          class DFib
//-----------------------------------------

class DFib: public WW8Fib
{
public:
    DFib( SvStream& rStrm, BYTE nVersion ) : WW8Fib( rStrm, nVersion ) {}
    void Dump();
};

//-----------------------------------------

void DFib::Dump()
{
    *pOut << "Adressen: FIB " << hex << 0 << ", Text "
         << fcMin << ", TextLen " << ccpText
         << ", Styles " << fcStshf << endl1;

    *pOut << "\twIdent: " << wIdent << endl1;
    *pOut << "\tnFib: " << nFib << endl1;
    *pOut << "\tnProduct: " << nProduct << endl1;
    *pOut << "\tlid: " << lid << endl1;
    *pOut << "\tpnNext: " << pnNext << endl1;

    *pOut << "\tfDot: " << (fDot ? '1' : '0') << endl1;
    *pOut << "\tfGlsy: " << (fGlsy ? '1' : '0') << endl1;
    *pOut << "\tfComplex: " << (fComplex ? '1' : '0') << endl1;
    *pOut << "\tfHasPic: " << (fHasPic ? '1' : '0') << endl1;
    *pOut << "\tcQuickSaves: " << (USHORT)cQuickSaves  << endl1;
    *pOut << "\tfEncrypted: " << (fEncrypted ? '1' : '0') << endl1;
    *pOut << "\tfWhichTblStm: " << (fWhichTblStm ? '1' : '0') << endl1;
    *pOut << "\tfExtChar: " << (fExtChar ? '1' : '0') << endl1;

    *pOut << "\tnFibBack: " << nFibBack << endl1;
    *pOut << "\tlKey1: " << lKey1 << endl1;
    *pOut << "\tlKey2: " << lKey2 << endl1;
    *pOut << "\tenvr: " << envr << endl1;

    *pOut << "\tfMac: " << (fMac ? '1' : '0') << endl1;
    *pOut << "\tfEmptySpecial: " << (fEmptySpecial ? '1' : '0') << endl1;
    *pOut << "\tfLoadOverridePage: " << (fLoadOverridePage ? '1' : '0') << endl1;
    *pOut << "\tfFuturesavedUndo: " << (fFuturesavedUndo ? '1' : '0') << endl1;
    *pOut << "\tfWord97Saved: " << (fWord97Saved ? '1' : '0') << endl1;

    *pOut << "\tchse: " << chse << endl1;
    *pOut << "\tchseTables: " << chseTables << endl1;
    *pOut << "\tfcMin: " << fcMin << endl1;
    *pOut << "\tfcMac: " << fcMac << endl1;
    *pOut << "\tcsw: " << csw << endl1;
    *pOut << "\twMagicCreated: " << wMagicCreated << endl1;
    *pOut << "\twMagicRevised: " << wMagicRevised << endl1;
    *pOut << "\twMagicCreatedPrivate: " << wMagicCreatedPrivate << endl1;
    *pOut << "\twMagicRevisedPrivate: " << wMagicRevisedPrivate << endl1;
    *pOut << "\tlidFE: " << lidFE << endl1;
    *pOut << "\tclw: " << clw << endl1;
    *pOut << "\tcbMac: " << cbMac << endl1;
    *pOut << "\tccpText: " << ccpText << endl1;
    *pOut << "\tccpFtn: " << ccpFtn << endl1;
    *pOut << "\tccpHdr: " << ccpHdr << endl1;
    *pOut << "\tccpMcr: " << ccpMcr << endl1;
    *pOut << "\tccpAtn: " << ccpAtn << endl1;
    *pOut << "\tccpEdn: " << ccpEdn << endl1;
    *pOut << "\tccpTxbx: " << ccpTxbx << endl1;
    *pOut << "\tccpHdrTxbx: " << ccpHdrTxbx << endl1;
    *pOut << "\tpnFbpChpFirst: " << pnFbpChpFirst << endl1;
    *pOut << "\tpnFbpPapFirst: " << pnFbpPapFirst << endl1;
    *pOut << "\tpnFbpLvcFirst: " << pnFbpLvcFirst << endl1;
    *pOut << "\tpnLvcFirst: " << pnLvcFirst << endl1;
    *pOut << "\tcpnBteLvc: " << cpnBteLvc << endl1;
    *pOut << "\tfcIslandFirst: " << fcIslandFirst << endl1;
    *pOut << "\tfcIslandLim: " << fcIslandLim << endl1;
    *pOut << "\tcfclcb: " << cfclcb << endl1;
    *pOut << "\tfcStshfOrig: " << fcStshfOrig << endl1;
    *pOut << "\tlcbStshfOrig: " << lcbStshfOrig << endl1;
    *pOut << "\tfcStshf: " << fcStshf << endl1;
    *pOut << "\tlcbStshf: " << lcbStshf << endl1;
    *pOut << "\tfcPlcffndRef: " << fcPlcffndRef << endl1;
    *pOut << "\tlcbPlcffndRef: " << lcbPlcffndRef << endl1;
    *pOut << "\tfcPlcffndTxt: " << fcPlcffndTxt << endl1;
    *pOut << "\tlcbPlcffndTxt: " << lcbPlcffndTxt << endl1;
    *pOut << "\tfcPlcfandRef: " << fcPlcfandRef << endl1;
    *pOut << "\tlcbPlcfandRef: " << lcbPlcfandRef << endl1;
    *pOut << "\tfcPlcfandTxt: " << fcPlcfandTxt << endl1;
    *pOut << "\tlcbPlcfandTxt: " << lcbPlcfandTxt << endl1;
    *pOut << "\tfcPlcfsed: " << fcPlcfsed << endl1;
    *pOut << "\tlcbPlcfsed: " << lcbPlcfsed << endl1;
    *pOut << "\tfcPlcfpad: " << fcPlcfpad << endl1;
    *pOut << "\tlcbPlcfpad: " << lcbPlcfpad << endl1;
    *pOut << "\tfcPlcfphe: " << fcPlcfphe << endl1;
    *pOut << "\tlcbPlcfphe: " << lcbPlcfphe << endl1;
    *pOut << "\tfcSttbfglsy: " << fcSttbfglsy << endl1;
    *pOut << "\tlcbSttbfglsy: " << lcbSttbfglsy << endl1;
    *pOut << "\tfcPlcfglsy: " << fcPlcfglsy << endl1;
    *pOut << "\tlcbPlcfglsy: " << lcbPlcfglsy << endl1;
    *pOut << "\tfcPlcfhdd: " << fcPlcfhdd << endl1;
    *pOut << "\tlcbPlcfhdd: " << lcbPlcfhdd << endl1;
    *pOut << "\tfcPlcfbteChpx: " << fcPlcfbteChpx << endl1;
    *pOut << "\tlcbPlcfbteChpx: " << lcbPlcfbteChpx << endl1;
    *pOut << "\tfcPlcfbtePapx: " << fcPlcfbtePapx << endl1;
    *pOut << "\tlcbPlcfbtePapx: " << lcbPlcfbtePapx << endl1;
    *pOut << "\tfcPlcfsea: " << fcPlcfsea << endl1;
    *pOut << "\tlcbPlcfsea: " << lcbPlcfsea << endl1;
    *pOut << "\tfcSttbfffn: " << fcSttbfffn << endl1;
    *pOut << "\tlcbSttbfffn: " << lcbSttbfffn << endl1;
    *pOut << "\tfcPlcffldMom: " << fcPlcffldMom << endl1;
    *pOut << "\tlcbPlcffldMom: " << lcbPlcffldMom << endl1;
    *pOut << "\tfcPlcffldHdr: " << fcPlcffldHdr << endl1;
    *pOut << "\tlcbPlcffldHdr: " << lcbPlcffldHdr << endl1;
    *pOut << "\tfcPlcffldFtn: " << fcPlcffldFtn << endl1;
    *pOut << "\tlcbPlcffldFtn: " << lcbPlcffldFtn << endl1;
    *pOut << "\tfcPlcffldAtn: " << fcPlcffldAtn << endl1;
    *pOut << "\tlcbPlcffldAtn: " << lcbPlcffldAtn << endl1;
    *pOut << "\tfcPlcffldMcr: " << fcPlcffldMcr << endl1;
    *pOut << "\tlcbPlcffldMcr: " << lcbPlcffldMcr << endl1;
    *pOut << "\tfcSttbfbkmk: " << fcSttbfbkmk << endl1;
    *pOut << "\tlcbSttbfbkmk: " << lcbSttbfbkmk << endl1;
    *pOut << "\tfcPlcfbkf: " << fcPlcfbkf << endl1;
    *pOut << "\tlcbPlcfbkf: " << lcbPlcfbkf << endl1;
    *pOut << "\tfcPlcfbkl: " << fcPlcfbkl << endl1;
    *pOut << "\tlcbPlcfbkl: " << lcbPlcfbkl << endl1;
    *pOut << "\tfcCmds: " << fcCmds << endl1;
    *pOut << "\tlcbCmds: " << lcbCmds << endl1;
    *pOut << "\tfcPlcfmcr: " << fcPlcfmcr << endl1;
    *pOut << "\tlcbPlcfmcr: " << lcbPlcfmcr << endl1;
    *pOut << "\tfcSttbfmcr: " << fcSttbfmcr << endl1;
    *pOut << "\tlcbSttbfmcr: " << lcbSttbfmcr << endl1;
    *pOut << "\tfcPrDrvr: " << fcPrDrvr << endl1;
    *pOut << "\tlcbPrDrvr: " << lcbPrDrvr << endl1;
    *pOut << "\tfcPrEnvPort: " << fcPrEnvPort << endl1;
    *pOut << "\tlcbPrEnvPort: " << lcbPrEnvPort << endl1;
    *pOut << "\tfcPrEnvLand: " << fcPrEnvLand << endl1;
    *pOut << "\tlcbPrEnvLand: " << lcbPrEnvLand << endl1;
    *pOut << "\tfcWss: " << fcWss << endl1;
    *pOut << "\tlcbWss: " << lcbWss << endl1;
    *pOut << "\tfcDop: " << fcDop << endl1;
    *pOut << "\tlcbDop: " << lcbDop << endl1;
    *pOut << "\tfcSttbfAssoc: " << fcSttbfAssoc << endl1;
    *pOut << "\tcbSttbfAssoc: " << cbSttbfAssoc << endl1;
    *pOut << "\tfcClx: " << fcClx << endl1;
    *pOut << "\tlcbClx: " << lcbClx << endl1;
    *pOut << "\tfcPlcfpgdFtn: " << fcPlcfpgdFtn << endl1;
    *pOut << "\tlcbPlcfpgdFtn: " << lcbPlcfpgdFtn << endl1;
    *pOut << "\tfcAutosaveSource: " << fcAutosaveSource << endl1;
    *pOut << "\tlcbAutosaveSource: " << lcbAutosaveSource << endl1;
    *pOut << "\tfcGrpStAtnOwners: " << fcGrpStAtnOwners << endl1;
    *pOut << "\tlcbGrpStAtnOwners: " << lcbGrpStAtnOwners << endl1;
    *pOut << "\tfcSttbfAtnbkmk: " << fcSttbfAtnbkmk << endl1;
    *pOut << "\tlcbSttbfAtnbkmk: " << lcbSttbfAtnbkmk << endl1;
    *pOut << "\tfcPlcfdoaMom: " << fcPlcfdoaMom << endl1;
    *pOut << "\tlcbPlcfdoaMom: " << lcbPlcfdoaMom << endl1;
    *pOut << "\tfcPlcfdoaHdr: " << fcPlcfdoaHdr << endl1;
    *pOut << "\tlcbPlcfdoaHdr: " << lcbPlcfdoaHdr << endl1;
    *pOut << "\tfcPlcfspaMom: " << fcPlcfspaMom << endl1;
    *pOut << "\tlcbPlcfspaMom: " << lcbPlcfspaMom << endl1;
    *pOut << "\tfcPlcfspaHdr: " << fcPlcfspaHdr << endl1;
    *pOut << "\tlcbPlcfspaHdr: " << lcbPlcfspaHdr << endl1;
    *pOut << "\tfcPlcfAtnbkf: " << fcPlcfAtnbkf << endl1;
    *pOut << "\tlcbPlcfAtnbkf: " << lcbPlcfAtnbkf << endl1;
    *pOut << "\tfcPlcfAtnbkl: " << fcPlcfAtnbkl << endl1;
    *pOut << "\tlcbPlcfAtnbkl: " << lcbPlcfAtnbkl << endl1;
    *pOut << "\tfcPms: " << fcPms << endl1;
    *pOut << "\tlcbPMS: " << lcbPMS << endl1;
    *pOut << "\tfcFormFldSttbf: " << fcFormFldSttbf << endl1;
    *pOut << "\tlcbFormFldSttbf: " << lcbFormFldSttbf << endl1;
    *pOut << "\tfcPlcfendRef: " << fcPlcfendRef << endl1;
    *pOut << "\tlcbPlcfendRef: " << lcbPlcfendRef << endl1;
    *pOut << "\tfcPlcfendTxt: " << fcPlcfendTxt << endl1;
    *pOut << "\tlcbPlcfendTxt: " << lcbPlcfendTxt << endl1;
    *pOut << "\tfcPlcffldEdn: " << fcPlcffldEdn << endl1;
    *pOut << "\tlcbPlcffldEdn: " << lcbPlcffldEdn << endl1;
    *pOut << "\tfcPlcfpgdEdn: " << fcPlcfpgdEdn << endl1;
    *pOut << "\tlcbPlcfpgdEdn: " << lcbPlcfpgdEdn << endl1;
    *pOut << "\tfcDggInfo: " << fcDggInfo << endl1;
    *pOut << "\tlcbDggInfo: " << lcbDggInfo << endl1;
    *pOut << "\tfcSttbfRMark: " << fcSttbfRMark << endl1;
    *pOut << "\tlcbSttbfRMark: " << lcbSttbfRMark << endl1;
    *pOut << "\tfcSttbfCaption: " << fcSttbfCaption << endl1;
    *pOut << "\tlcbSttbfCaption: " << lcbSttbfCaption << endl1;
    *pOut << "\tfcSttbAutoCaption: " << fcSttbAutoCaption << endl1;
    *pOut << "\tlcbSttbAutoCaption: " << lcbSttbAutoCaption << endl1;
    *pOut << "\tfcPlcfwkb: " << fcPlcfwkb << endl1;
    *pOut << "\tlcbPlcfwkb: " << lcbPlcfwkb << endl1;
    *pOut << "\tfcPlcfspl: " << fcPlcfspl << endl1;
    *pOut << "\tlcbPlcfspl: " << lcbPlcfspl << endl1;
    *pOut << "\tfcPlcftxbxTxt: " << fcPlcftxbxTxt << endl1;
    *pOut << "\tlcbPlcftxbxTxt: " << lcbPlcftxbxTxt << endl1;
    *pOut << "\tfcPlcffldTxbx: " << fcPlcffldTxbx << endl1;
    *pOut << "\tlcbPlcffldTxbx: " << lcbPlcffldTxbx << endl1;
    *pOut << "\tfcPlcfHdrtxbxTxt: " << fcPlcfHdrtxbxTxt << endl1;
    *pOut << "\tlcbPlcfHdrtxbxTxt: " << lcbPlcfHdrtxbxTxt << endl1;
    *pOut << "\tfcPlcffldHdrTxbx: " << fcPlcffldHdrTxbx << endl1;
    *pOut << "\tlcbPlcffldHdrTxbx: " << lcbPlcffldHdrTxbx << endl1;
    *pOut << "\tfcPlcfLst: " << fcPlcfLst << endl1;
    *pOut << "\tlcbPlcfLst: " << lcbPlcfLst << endl1;
    *pOut << "\tfcPlfLfo: " << fcPlfLfo << endl1;
    *pOut << "\tlcbPlfLfo: " << lcbPlfLfo << endl1;
    *pOut << "\tfcPlcftxbxBkd: " << fcPlcftxbxBkd << endl1;
    *pOut << "\tlcbPlcftxbxBkd: " << lcbPlcftxbxBkd << endl1;
    *pOut << "\tfcPlcfHdrtxbxBkd: " << fcPlcfHdrtxbxBkd << endl1;
    *pOut << "\tlcbPlcfHdrtxbxBkd: " << lcbPlcfHdrtxbxBkd << endl1;
    *pOut << "\tfcSttbListNames: " << fcSttbListNames << endl1;
    *pOut << "\tlcbSttbListNames: " << lcbSttbListNames << endl1;

    *pOut << "\tpnChpFirst: " << pnChpFirst << endl1;
    *pOut << "\tpnPapFirst: " << pnPapFirst << endl1;
    *pOut << "\tcpnBteChp: " << cpnBteChp << endl1;
    *pOut << "\tcpnBtePap: " << cpnBtePap << endl1;


    *pOut << dec << "END FIB" << endl1 << endl1;
}

//-----------------------------------------
//          class DStyle
//-----------------------------------------

class DStyle: public WW8Style
{
    BYTE nVersion;
public:
    DStyle( SvStream& rStream, WW8Fib& rFib )
            : WW8Style( rStream, rFib ){ nVersion = rFib.nVersion; }
    void Dump1Style( USHORT nNr );
    void Dump();
};

//-----------------------------------------
//      universelle Hilfsroutinen
//-----------------------------------------

static void DumpIt( SvStream& rSt, short nLen )
{
    indent( *pOut, rSt );
    if( nLen <= 0 ){
        *pOut << endl1;
        return;
    }
    while ( nLen  ){
        BYTE c;
        xStrm->Read( &c, sizeof(c) );
        *pOut << "<0x" << hex2 << (USHORT)c << dec2 << "> ";
        nLen--;
    }
    *pOut << endl1;
}

static void DumpItSmall( SvStream& rStrm, short nLen )
{
    if( nLen <= 0 )
        return;

    while ( nLen  )
    {
        BYTE c;

        rStrm.Read( &c, sizeof(c) );

        if( c <= 9 )
            *pOut << (USHORT)c;
        else
            *pOut << "0x" << hex2 << (USHORT)c << dec2;

        nLen--;

        if( nLen )
            *pOut << ',';
    }
}

//-----------------------------------------
//      Hilfsroutinen : Foot-, Endnotes
//-----------------------------------------


#if 0
void DumpText( WW8_CP nStartCp, long nTextLen, WW8ScannerBase* pBase, short nType, char* pName = "" );
static void DumpFtnShort( short nId, long nPos, long nFieldLen )
{
    ASSERT( nId < 261 && nId > 255, "Falsche Id" );

    *pOut << '<' << hex << nPos << dec << ' ';

    *pOut << 'F' << nId << ' ' << WW8GetSprmDumpInfo( nId ).pName << ' ';
/*
    if ( WW8GetSprmDumpInfo( nId ).pOutFnc ){
        WW8GetSprmDumpInfo( nId ).pOutFnc( nId, nFieldLen );    // Rufe AusgabeFunktion
    }
*/
    *pOut << '>' << endl1;

    pPLCFMan->SavePLCF();
    WW8PLCFMan* pOldPLCFMan = pPLCFMan;

    pSBase->pChpPLCF->SeekPos( nPos );
    pSBase->pPapPLCF->SeekPos( nPos );

    DumpText( nPos, nFieldLen, pSBase, MAN_FTN, WW8GetSprmDumpInfo( nId ).pName );

    indent( *pOut, *xStrm );

    pPLCFMan = pOldPLCFMan;             // Attributverwaltung restoren
    pPLCFMan->RestorePLCF();
}
#endif

//-----------------------------------------
//      Hilfsroutinen : SPRMS
//-----------------------------------------


/*
#if 0
static short DumpSprmShort( short nSprmsLen )
{
    long nSprmPos = xStrm->Tell();

    *pOut << '<' << hex << nSprmPos << dec << ' ';

    BYTE x[512];
    xStrm->Read( x, 512 );                  // Token und folgende lesen
    BYTE i = x[0];

    nSprmsLen -= WW8GetSprmSizeBrutto( nVersion, x ); // so viele Sprm-Bytes folgen noch nach diesem Sprm

    if( nSprmsLen < 0 )
        *pOut << "!UEberhang um " << -nSprmsLen << " Bytes!" << endl1;

    *pOut << 'A' << (USHORT)i  << ' ';
    *pOut << aSprmTab[i].pName << ' ';

    xStrm->Seek( nSprmPos + 1 + WW8SprmDataOfs( i ) );// gehe zum eigentlichen
                                                     // Inhalt
    if ( aSprmTab[i].pOutFnc ){
        WW8GetSprmDumpInfo( nId ).pOutFnc( i, WW8GetSprmSizeNetto( x ) );// Rufe AusgabeFunktion
    }else{
        DumpItSmall( WW8GetSprmSizeNetto( x ) );        // oder Dumper
    }
    *pOut << '>';

    return nSprmsLen;
}

static void DumpSprmsShort( short nLen )
{
    if( nLen <= 1 || xStrm->IsEof() ){
        return;
    }
    while ( nLen > 1 ){
        nLen = DumpSprmShort( nLen );
    }
}
#endif
*/




static short DumpSprm( BYTE nVersion, SvStream& rSt, short nSprmsLen )
{
    long nSprmPos = rSt.Tell();
    BYTE nDelta;

    indent( *pOut, rSt );

    BYTE x[512];
    rSt.Read( x, 512 );                 // Token und folgende lesen

    USHORT nId = WW8GetSprmId( nVersion, x, &nDelta );

    short nSprmL = WW8GetSprmSizeBrutto( nVersion, x, &nId );
    short nSprmNL = WW8GetSprmSizeNetto( nVersion, x, &nId );

    nSprmsLen -= nSprmL;
    if( nSprmsLen < 0 )
        *pOut << "!UEberhang um " << -nSprmsLen << " Bytes!" << endl1;

    // Ausgabe: Token in Dez
    if( 8 > nVersion )
        *pOut << (USHORT)x[0];
    else
        *pOut << hex << nId << dec;
    *pOut << '/' << nSprmL;  // Laenge incl. alles in Dez
    *pOut << '/' << nSprmNL;    // Laenge excl Token in Dez


    const SprmDumpInfo& rSprm = WW8GetSprmDumpInfo( nId );

    *pOut << " = " << rSprm.pName << ' ';

    rSt.Seek( nSprmPos + 1 + nDelta + WW8SprmDataOfs( nId ) );// gehe zum eigentlichen
                                                     // Inhalt
    if( rSprm.pOutFnc )
        rSprm.pOutFnc( rSt, nSprmNL );      // Rufe Ausgabefunktion
    else
        DumpItSmall( rSt, nSprmNL );        // oder Dumper
    *pOut << endl1;

    return nSprmsLen;
}

void DumpSprms( BYTE nVersion, SvStream& rSt, short nLen )
{
    if( nLen <= 1 || rSt.IsEof() ){
        return;
    }
    begin( *pOut, rSt ) << "Sprms" << endl1;
    while ( nLen > 1 )
    {
        nLen = DumpSprm( nVersion, rSt, nLen );
    }
    end( *pOut, rSt ) << "Sprms" << endl1;
}

// DumpMemSprm() dumpt ein 2-Byte-Sprm, der im WW8_PCD eingebaut ist
static void DumpMemSprm( BYTE nVersion, INT16* pSprm )
{
    BYTE* p = (BYTE*)pSprm;
    USHORT nId = WW8GetSprmId( nVersion, p, 0 );

    *pOut << (USHORT)p[0];                      // Ausgabe: Token in Dez
    *pOut << '/' << WW8GetSprmSizeBrutto( nVersion, p, &nId );   // Laenge incl. alles in Dez
    *pOut << '/' << WW8GetSprmSizeNetto(  nVersion, p, &nId );    // Laenge excl Token in Dez

    *pOut << " = " << WW8GetSprmDumpInfo( nId ).pName;

    *pOut << " 0x" << hex2 << *(p + 1);
}


//-----------------------------------------
//          Hilfsroutinen: SEPX
//-----------------------------------------
void DumpSepx( BYTE nVersion, long nPos )
{
    USHORT nLen;
    xStrm->Seek( nPos );
    begin( *pOut, *xStrm ) << "Sepx, Len: ";
    xStrm->Read( &nLen, 2 );
    *pOut << nLen << endl1;

    DumpSprms( nVersion, *xStrm, nLen );

    end( *pOut, *xStrm ) << "Sepx" << endl1;
}


//-----------------------------------------
//  Hilfsroutinen: FKP.CHPX, FKP.PAPX
//-----------------------------------------
static void DumpPhe( WW8_PHE_Base& rPhe )
{
    if( rPhe.aBits1 == 0 && rPhe.nlMac == 0
        && SVBT16ToShort( rPhe.dxaCol ) == 0
        && SVBT16ToShort( rPhe.dyl ) == 0 )
    {
        *pOut << indent2 << "  empty PHE" << endl1;
    }
    else
    {
        *pOut << begin2 << "PHE" << endl1;
        *pOut << indent2 << "fSpare: " << ( rPhe.aBits1 & 0x1 );
        *pOut << ", fUnk: " << (( rPhe.aBits1 >> 1 ) & 1 );
        *pOut << ", fDiffLines: " << (( rPhe.aBits1 >> 2 ) & 1 );
        *pOut << ", unused: " << (( rPhe.aBits1 >> 3 ) & 0x1F )
              << " (" << (short)(( rPhe.aBits1 >> 2 ) & 0x3F ) +
                                 (((short)rPhe.nlMac) << 8)
              << ")";
        *pOut << ", nLines: " << (short)rPhe.nlMac << ',' << endl1;
        *pOut << indent2 << "dxaCol: " << (short)SVBT16ToShort( rPhe.dxaCol );
        if( rPhe.aBits1 & 0x4 )
        {
            *pOut << ", total height: " << (USHORT)SVBT16ToShort( rPhe.dyl );
        }
        else
        {
            *pOut << ", height per line: " << (short)SVBT16ToShort( rPhe.dyl );
            *pOut << ", total height: " << rPhe.nlMac * (short)SVBT16ToShort( rPhe.dyl );
        }
        *pOut << endl1;
        *pOut << end2 << "PHE" << endl1;
    }
}

//typedef enum{ CHP=0, PAP, SEP, PLC_END }ePlcT;
static char* NameTab[PLCF_END+4]={ "chpx", "papx", "sepx", "head",
                                    "FootnoteRef", "EndnoteRef",
                                    "AnnotationRef" };

void DumpFkp( BYTE nVersion, long nPos, short nItemSize, ePLCFT ePlc )
{
    char nElem;

    xStrm->Seek( nPos+511 );
    xStrm->Read( &nElem, 1 );


    *pOut << 'D' << hex6 << nPos << dec2 << ' ' << indent1 << begin1 << "Fkp.";
    *pOut << NameTab[ePlc] << ", ";
    *pOut << (USHORT)nElem << " Elements" << endl1;

    int i;
    WW8_FC aF[2];
    BYTE c;
    long nStartOfs = nPos + ( nElem + 1 ) * 4;  // bei dieser Pos faengt Offset-Array an
    short nOfs;
    WW8_PHE_Base aPhe;

    for( i=0; i<nElem; i++ )
    {
        xStrm->Seek( nPos + i * 4 );
        indent( *pOut, *xStrm );
        xStrm->Read( aF, sizeof( aF ) );            // lese 2 FCs

        xStrm->Seek( nStartOfs + i * nItemSize );
        xStrm->Read( &c, 1 );       // lese Word Offset ( evtl. Teil von BX )
        if( ePlc == PAP )
            xStrm->Read( &aPhe, sizeof( aPhe ) );

        nOfs= c * 2;                            // -> Byte Offset
        xStrm->Seek( nPos + nOfs );
        xStrm->Read( &c, 1 );

        if( !c )
            xStrm->Read( &c, 1 );

        *pOut << "Fc: " << hex << aF[0] << ".." << aF[1];
        *pOut << " Cp: " << pSBase->WW8Fc2Cp( aF[0] )
              << ".."    << pSBase->WW8Fc2Cp( aF[1] );
        *pOut << " Offset: " << nOfs << dec2;
        if ( nOfs )
        {
            switch ( ePlc )
            {
            case CHP:
                *pOut << ", Len: " << (short)c << endl1;
                DumpSprms( nVersion, *xStrm, (short)c );
                break;

            case PAP:
                short nLen = c * 2;     // So weit bis zum naechsten !

                short nIStd;

                WW8ReadINT16( *xStrm, nIStd );

                *pOut << ", Len max: " << nLen << ", ID:" << nIStd << endl1;
                DumpSprms( nVersion, *xStrm, nLen - 2 );
                DumpPhe( aPhe );
                break;
            }
        }
        else
        {
            *pOut << dec2 << " No attribute" << endl1;
        }

    }
    end( *pOut, *xStrm ) << "Fkp." << NameTab[ePlc] << endl1;
}

//-----------------------------------------
//      WW8_DOP ( Document Properties )
//-----------------------------------------

//!!! WW8LoadDop gibt's jetzt auch in WW8scan.cxx
void DumpDop( WW8Fib& rFib )
{
    // nicht loeschen!
    xTableStream->Seek( rFib.fcDop );   // diese Aktion dient lediglich dazu, die
                        // Positions-Ausgabe  der folgenden Anweisung
                        // mit dem alten Dumper uebereinstimmen zu lassen.

//  *pOut << begin( *pOut, *xTableStream ) << "Dop, Size " << rFib.lcbDop << ", DefaultSize 84" << endl1;
    begin( *pOut, *xTableStream ) << "Dop, Size " << rFib.lcbDop << ", DefaultSize 84" << endl1;

    WW8Dop* pD = new WW8Dop( *xTableStream, rFib.nFib, rFib.fcDop, rFib.lcbDop );

    *pOut << indent2 << "fFacingPages : " << pD->fFacingPages << endl1;
    *pOut << indent2 << "fWidowControl : " << pD->fWidowControl << endl1;
    *pOut << indent2 << "fPMHMainDoc : " << pD->fPMHMainDoc << endl1;
    *pOut << indent2 << "grfSuppression : " << pD->grfSuppression << endl1;
    *pOut << indent2 << "fpc : " << pD->fpc << endl1;
    *pOut << indent2 << "grpfIhdt : " << pD->grpfIhdt << endl1;
    *pOut << indent2 << "rncFtn : " << pD->rncFtn << endl1;
    *pOut << indent2 << "nFtn : " << pD->nFtn << endl1;
    *pOut << indent2 << "fOutlineDirtySave : " << pD->fOutlineDirtySave << endl1;
    *pOut << indent2 << "fOnlyMacPics : " << pD->fOnlyMacPics << endl1;
    *pOut << indent2 << "fOnlyWinPics : " << pD->fOnlyWinPics << endl1;
    *pOut << indent2 << "fLabelDoc : " << pD->fLabelDoc << endl1;
    *pOut << indent2 << "fHyphCapitals : " << pD->fHyphCapitals << endl1;
    *pOut << indent2 << "fAutoHyphen : " << pD->fAutoHyphen << endl1;
    *pOut << indent2 << "fFormNoFields : " << pD->fFormNoFields << endl1;
    *pOut << indent2 << "fLinkStyles : " << pD->fLinkStyles << endl1;
    *pOut << indent2 << "fRevMarking : " << pD->fRevMarking << endl1;
    *pOut << indent2 << "fBackup : " << pD->fBackup << endl1;
    *pOut << indent2 << "fExactCWords : " << pD->fExactCWords << endl1;
    *pOut << indent2 << "fPagHidden : " << pD->fPagHidden << endl1;
    *pOut << indent2 << "fPagResults : " << pD->fPagResults << endl1;
    *pOut << indent2 << "fLockAtn : " << pD->fLockAtn << endl1;
    *pOut << indent2 << "fMirrorMargins : " << pD->fMirrorMargins << endl1;
    *pOut << indent2 << "fReadOnlyRecommended : " << pD->fReadOnlyRecommended << endl1;
    *pOut << indent2 << "fDfltTrueType : " << pD->fDfltTrueType << endl1;
    *pOut << indent2 << "fPagSuppressTopSpacing : " << pD->fPagSuppressTopSpacing << endl1;
    *pOut << indent2 << "fProtEnabled : " << pD->fProtEnabled << endl1;
    *pOut << indent2 << "fDispFormFldSel : " << pD->fDispFormFldSel << endl1;
    *pOut << indent2 << "fRMView : " << pD->fRMView << endl1;
    *pOut << indent2 << "fRMPrint : " << pD->fRMPrint << endl1;
    *pOut << indent2 << "fWriteReservation : " << pD->fWriteReservation << endl1;
    *pOut << indent2 << "fLockRev : " << pD->fLockRev << endl1;
    *pOut << indent2 << "fEmbedFonts : " << pD->fEmbedFonts << endl1;
    *pOut << indent2 << "copts_fNoTabForInd : " << pD->copts_fNoTabForInd << endl1;
    *pOut << indent2 << "copts_fNoSpaceRaiseLower : " << pD->copts_fNoSpaceRaiseLower << endl1;
    *pOut << indent2 << "copts_fSupressSpbfAfterPgBrk : " << pD->copts_fSupressSpbfAfterPgBrk << endl1;
    *pOut << indent2 << "copts_fWrapTrailSpaces : " << pD->copts_fWrapTrailSpaces << endl1;
    *pOut << indent2 << "copts_fMapPrintTextColor : " << pD->copts_fMapPrintTextColor << endl1;
    *pOut << indent2 << "copts_fNoColumnBalance : " << pD->copts_fNoColumnBalance << endl1;
    *pOut << indent2 << "copts_fConvMailMergeEsc : " << pD->copts_fConvMailMergeEsc << endl1;
    *pOut << indent2 << "copts_fSupressTopSpacing : " << pD->copts_fSupressTopSpacing << endl1;
    *pOut << indent2 << "copts_fOrigWordTableRules : " << pD->copts_fOrigWordTableRules << endl1;
    *pOut << indent2 << "copts_fTransparentMetafiles : " << pD->copts_fTransparentMetafiles << endl1;
    *pOut << indent2 << "copts_fShowBreaksInFrames : " << pD->copts_fShowBreaksInFrames << endl1;
    *pOut << indent2 << "copts_fSwapBordersFacingPgs : " << pD->copts_fSwapBordersFacingPgs << endl1;
    *pOut << indent2 << "dxaTab : " << pD->dxaTab << endl1;
    *pOut << indent2 << "wSpare : " << pD->wSpare << endl1;
    *pOut << indent2 << "dxaHotZ : " << pD->dxaHotZ << endl1;
    *pOut << indent2 << "cConsecHypLim : " << pD->cConsecHypLim << endl1;
    *pOut << indent2 << "wSpare2 : " << pD->wSpare2 << endl1;
    *pOut << indent2 << "dttmCreated : " << pD->dttmCreated << endl1;
    *pOut << indent2 << "dttmRevised : " << pD->dttmRevised << endl1;
    *pOut << indent2 << "dttmLastPrint : " << pD->dttmLastPrint << endl1;
    *pOut << indent2 << "nRevision : " << pD->nRevision << endl1;
    *pOut << indent2 << "tmEdited : " << pD->tmEdited << endl1;
    *pOut << indent2 << "cWords : " << pD->cWords << endl1;
    *pOut << indent2 << "cCh : " << pD->cCh << endl1;
    *pOut << indent2 << "cPg : " << pD->cPg << endl1;
    *pOut << indent2 << "cParas : " << pD->cParas << endl1;
    *pOut << indent2 << "rncEdn : " << pD->rncEdn << endl1;
    *pOut << indent2 << "nEdn : " << pD->nEdn << endl1;
    *pOut << indent2 << "epc : " << pD->epc << endl1;
    *pOut << indent2 << "fPrintFormData : " << pD->fPrintFormData << endl1;
    *pOut << indent2 << "fSaveFormData : " << pD->fSaveFormData << endl1;
    *pOut << indent2 << "fShadeFormData : " << pD->fShadeFormData << endl1;
    *pOut << indent2 << "fWCFtnEdn : " << pD->fWCFtnEdn << endl1;
    *pOut << indent2 << "cLines : " << pD->cLines << endl1;
    *pOut << indent2 << "cWordsFtnEnd : " << pD->cWordsFtnEnd << endl1;
    *pOut << indent2 << "cChFtnEdn : " << pD->cChFtnEdn << endl1;
    *pOut << indent2 << "cPgFtnEdn : " << pD->cPgFtnEdn << endl1;
    *pOut << indent2 << "cParasFtnEdn : " << pD->cParasFtnEdn << endl1;
    *pOut << indent2 << "cLinesFtnEdn : " << pD->cLinesFtnEdn << endl1;
    *pOut << indent2 << "lKeyProtDoc : " << pD->lKeyProtDoc << endl1;
    *pOut << indent2 << "wvkSaved : " << pD->wvkSaved << endl1;
    *pOut << indent2 << "wScaleSaved : " << pD->wScaleSaved << endl1;
    *pOut << indent2 << "zkSaved : " << pD->zkSaved << endl1;
    *pOut << indent2 << "fNoTabForInd : " << pD->fNoTabForInd << endl1;
    *pOut << indent2 << "fNoSpaceRaiseLower : " << pD->fNoSpaceRaiseLower << endl1;
    *pOut << indent2 << "fSupressSpbfAfterPageBreak : " << pD->fSupressSpbfAfterPageBreak << endl1;
    *pOut << indent2 << "fWrapTrailSpaces : " << pD->fWrapTrailSpaces << endl1;
    *pOut << indent2 << "fMapPrintTextColor : " << pD->fMapPrintTextColor << endl1;
    *pOut << indent2 << "fNoColumnBalance : " << pD->fNoColumnBalance << endl1;
    *pOut << indent2 << "fConvMailMergeEsc : " << pD->fConvMailMergeEsc << endl1;
    *pOut << indent2 << "fSupressTopSpacing : " << pD->fSupressTopSpacing << endl1;
    *pOut << indent2 << "fOrigWordTableRules : " << pD->fOrigWordTableRules << endl1;
    *pOut << indent2 << "fTransparentMetafiles : " << pD->fTransparentMetafiles << endl1;
    *pOut << indent2 << "fShowBreaksInFrames : " << pD->fShowBreaksInFrames << endl1;
    *pOut << indent2 << "fSwapBordersFacingPgs : " << pD->fSwapBordersFacingPgs << endl1;
    *pOut << indent2 << "fSuppressTopSpacingMac5 : " << pD->fSuppressTopSpacingMac5 << endl1;
    *pOut << indent2 << "fTruncDxaExpand : " << pD->fTruncDxaExpand << endl1;
    *pOut << indent2 << "fPrintBodyBeforeHdr : " << pD->fPrintBodyBeforeHdr << endl1;
    *pOut << indent2 << "fNoLeading : " << pD->fNoLeading << endl1;
    *pOut << indent2 << "fMWSmallCaps : " << pD->fMWSmallCaps << endl1;

    *pOut << indent2 << "adt : " << pD->adt << endl1;

    *pOut << indent2 << "lvl : " << pD->lvl << endl1;
    *pOut << indent2 << "fHtmlDoc : " << pD->fHtmlDoc << endl1;
    *pOut << indent2 << "fSnapBorder : " << pD->fSnapBorder << endl1;
    *pOut << indent2 << "fIncludeHeader : " << pD->fIncludeHeader << endl1;
    *pOut << indent2 << "fIncludeFooter : " << pD->fIncludeFooter << endl1;
    *pOut << indent2 << "fForcePageSizePag : " << pD->fForcePageSizePag << endl1;
    *pOut << indent2 << "fMinFontSizePag : " << pD->fMinFontSizePag << endl1;

    *pOut << indent2 << "fHaveVersions : " << pD->fHaveVersions << endl1;
    *pOut << indent2 << "fAutoVersion : " << pD->fAutoVersion << endl1;
    *pOut << indent2 << "cChWS : " << pD->cChWS << endl1;
    *pOut << indent2 << "cChWSFtnEdn : " << pD->cChWSFtnEdn << endl1;
    *pOut << indent2 << "grfDocEvents : " << pD->grfDocEvents << endl1;
    *pOut << indent2 << "cDBC : " << pD->cDBC << endl1;
    *pOut << indent2 << "cDBCFtnEdn : " << pD->cDBCFtnEdn << endl1;
    *pOut << indent2 << "nfcFtnRef : " << pD->nfcFtnRef << endl1;
    *pOut << indent2 << "nfcEdnRef : " << pD->nfcEdnRef << endl1;
    *pOut << indent2 << "hpsZoonFontPag : " << pD->hpsZoonFontPag << endl1;
    *pOut << indent2 << "dywDispPag : " << pD->dywDispPag << endl1;

    end( *pOut, *xStrm ) << "Dop" << endl1 << endl1;

    DELETEZ( pD );
}

//-----------------------------------------
//    PLCF.PCD ( Piece Table )
//-----------------------------------------

#ifdef __WW8_NEEDS_PACK
#  pragma pack(2)
#endif

struct WW8_PCD1
{
    BYTE aBits1;
    BYTE aBits2;
//  INT16 fNoParaLast : 1;  // when 1, means that piece contains no end of parag
//  BYTE fPaphNil : 1;      // used internally by Word
//  BYTE fCopied : 1;       // used internally by Word
    //          *   int :5
//  BYTE aBits2;            // fn int:8, used internally by Word
    INT32 fc;               // file offset of beginning of piece. The size of th
    INT16 prm;              // PRM contains either a single sprm or else an inde
};

#ifdef __WW8_NEEDS_PACK
#  pragma pack()
#endif

static void DumpPLCFPcd( BYTE nVersion, long nPos, long nLen )
{
    WW8PLCF aPlc( &xTableStream, nPos , nLen, 8 );

    *pOut << 'D' << hex6 << nPos << dec2 <<  ' ' << indent1 << begin1;
    *pOut << "Plcx.Pcd, Len: ";
    *pOut << nLen << ", " << aPlc.GetIMax() << " Elements" << endl1;

    int i;
    for( i=0; i<aPlc.GetIMax(); i++ )
    {
        long start, ende;
        void* pData;
        aPlc.Get( start, ende, pData );
        *pOut << indent2 << " Cp: " << hex6 << start << ".." << hex6 << ende;

        WW8_PCD1* p = (WW8_PCD1*) pData;
        *pOut << ", Bits: " << hex2  <<  (USHORT)p->aBits1 << ' '
              << hex2 << (USHORT)p->aBits2;
        *pOut << ", FcStart: ";
        if( 8 <= nVersion )
        {
            BOOL bUniCode;
            *pOut << hex6
                  << WW8PLCFx_PCD::TransformPieceAddress( p->fc, bUniCode );
            if( bUniCode )
                *pOut << " (UniCode)";
        }
        else
            *pOut << hex6 << p->fc;

        *pOut << dec << ", prm ";
        if( p->prm & 0x1 ){
            *pOut << "No: " << ( p->prm >> 1 );
        }else if ( p-> prm == 0 ){
            *pOut << "-";
        }else{
            *pOut << "(Sprm): ";
            DumpMemSprm( nVersion, &(p->prm) );
        }
        *pOut << endl1;

        aPlc++;
    }
    end( *pOut, *xTableStream ) << "Plcx.Pcd" << endl1;
}

static void DumpPcd( BYTE nVersion, long nPos, long nLen )
{
    long nLen1 = nLen;
    xTableStream->Seek( nPos );

    *pOut << 'D' << hex6 << nPos << dec2 <<  ' ' << indent1 << begin1;
    *pOut << "PieceTable, Len: " << nLen << endl1;
    if( sizeof( WW8_PCD1 ) != 8 )
        *pOut << "!!! Alignment-Problem !!! sizeof( WW8_PCD1 ) != 8 !!! " << endl1;

    long i = 0;
    while (1){
        BYTE c;
        INT16 cb;

        xTableStream->Read( &c, 1 );
        nLen1 --;
        if( c == 2 )
            break;
        xTableStream->Read( &cb, 2 );
        nLen1 -= 2;
        indent( *pOut, *xTableStream ) << "grpprl No. " << i << ", Len: " << cb << endl1;

        long nPos = xTableStream->Tell();
        DumpSprms( nVersion, *xTableStream, cb );                   // Dumpe Sprms
        xTableStream->Seek( nPos + cb );            // gehe hinter grpprl
        nLen1 -= cb;
        i++;
//      *pOut << "       " << indent1 << "grpprl: " << cb << "Bytes ueberlesen";
//      *pOut << endl1;
    }
    INT32 nLen2;
    xTableStream->Read( &nLen2, 4 );
    nLen1 -= 4;
    if( nLen1 != nLen2 )
        *pOut << "!!! nLen1 ( " << nLen1 << " ) != nLen2 ( " << nLen2 << " ) !"
              << endl1;

    DumpPLCFPcd( nVersion, xTableStream->Tell(), nLen2 );

    end( *pOut, *xTableStream ) << "PieceTable" << endl1 << endl1;
}

//-----------------------------------------
//    PLCF.CHPX, PLCF.PAPX, PLCF.SEPX
//-----------------------------------------

static void DumpPLCF( long nPos, long nLen, ePLCFT ePlc )
{
    static int __READONLY_DATA WW8FkpSizeTabVer6[ PLCF_END ] = {
                                                    1,  7, 0 /*, 0, 0, 0*/ };
    static int __READONLY_DATA PlcSizeTabVer6[ PLCF_END+4 ] = {
                                                    2, 2, 12, 0, 2, 2, 20 };

    static int __READONLY_DATA WW8FkpSizeTabVer8[ PLCF_END ] = {
                                                    1, 13, 0 /*, 0, 0, 0*/ };
    static int __READONLY_DATA PlcSizeTabVer8[ PLCF_END+4 ] = {
                                                    4, 4, 12, 0, 2, 2, 30 };

    const int* pFkpSizeTab;
    const int* pPlcSizeTab;

    switch( pWwFib->nVersion )
    {
    case 6:
    case 7: pFkpSizeTab = WW8FkpSizeTabVer6;
            pPlcSizeTab = PlcSizeTabVer6;
            break;
    case 8: pFkpSizeTab = WW8FkpSizeTabVer8;
            pPlcSizeTab = PlcSizeTabVer8;
            break;
    default:// Programm-Fehler!
                    /*
                        ACHTUNG: im FILTER nicht "FALSE" sondern "!this()" schreiben,
                                            da sonst Warning unter OS/2
                    */
                    ASSERT( FALSE, "Es wurde vergessen, nVersion zu kodieren!" );
                    return;
    }

//  SvStream* pSt = (SEP == ePlc) ? &xTableStream : &xStrm;
    SvStream* pSt = &xTableStream;

    WW8PLCF aPlc( pSt, nPos, nLen, pPlcSizeTab[ ePlc ] );

    *pOut << 'T' << hex6 << nPos << dec2 <<  ' ' << indent1 << begin1;
    *pOut << "Plcx." << NameTab[ePlc] << ", Len: ";
    *pOut << nLen << ", " << aPlc.GetIMax() << " Elements" << endl1;

    int i;
    for( i=0; i<aPlc.GetIMax(); i++ )
    {
        long start, ende;
        void* pData;
        aPlc.Get( start, ende, pData );
        *pOut << indent2 << "Plcx." << NameTab[ePlc];
        switch( ePlc ){
        case SEP: {
                        *pOut << " Cp: " << hex << start << ".." << ende ;
                        long nPo = *((long*)((char*)pData+2));
                    if( nPo == 0xffffffffL )
                        {
                          *pOut << " Empty" << endl1;
                    }
                        else
                        {
                            *pOut << ", Sepx-Position: " << nPo << dec << endl1;
                        DumpSepx( pWwFib->nVersion, nPo );
                    }
                  }
                  break;
        case CHP:
        case PAP: {
                        *pOut << " Fc: " << hex << start << ".." << ende ;
                        long nPo;
                        switch( pWwFib->nVersion )
                        {
                        case 6:
                        case 7: nPo = *((USHORT*)pData);
                                        break;
                        case 8: nPo = *((UINT32*)pData);
                                        break;
                        default:// Programm-Fehler!
                                        /*
                                            ACHTUNG: im FILTER nicht "FALSE" sondern "!this()" schreiben,
                                                                da sonst Warning unter OS/2
                                        */
                                        ASSERT( FALSE, "Es wurde vergessen, nVersion zu kodieren!" );
                                        return;
                        }

                    nPo <<= 9;
                    *pOut << ", Offset: " << nPo << dec << endl1;
                    DumpFkp( pWwFib->nVersion, nPo, pFkpSizeTab[ ePlc ], ePlc );
                  }
                  break;

        case PLCF_END+0:
                  *pOut << " Cp: " << hex << start << ".." << ende << dec << endl1;
                  break;

        case PLCF_END+1:
        case PLCF_END+2:
            {
                *pOut << " Cp: " << hex << start;
                USHORT nFlags= *((USHORT*)pData);
                *pOut << ", Flags: 0x" << nFlags << dec << endl1;
            }
            break;

        case PLCF_END+3:
            {
                *pOut << " Cp: " << hex << start << ", Initial: \"";
                const char* p = (char*)pData;
                BYTE n = *p++;
                while( n-- )
                {
                    if( 8 == pWwFib->nVersion )
                        ++p;
                    *pOut << *p++;
                }

                long nBkmkId;
                USHORT nId;
                if( 8 == pWwFib->nVersion )
                {
                    nId = SVBT16ToShort( ((WW8_ATRD*)pData)->ibst );
                    nBkmkId = SVBT32ToLong( ((WW8_ATRD*)pData)->ITagBkmk );
                }
                else
                {
                    nId = SVBT16ToShort( ((WW67_ATRD*)pData )->ibst );
                    nBkmkId = SVBT32ToLong( ((WW67_ATRD*)pData )->ITagBkmk );
                }

                *pOut << "\", AutorId: " << hex << nId
                      << " BkmkId: " << nBkmkId << dec <<endl1;
            }
            break;

        }
        aPlc++;
    }
    end( *pOut, *xTableStream ) << "Plcx." << NameTab[ePlc] << endl1 << endl1;
}

//-----------------------------------------------------
//  PLCF.CHPX, PLCF.PAPX unter  Benutzung von PLCF_Fkp
//-----------------------------------------------------
#if 0
static void DumpPLCF2( long nPos, long nLen, ePlcT ePlc )
{
    *pOut << 'T' << hex6 << nPos << dec2 <<  ' ' << indent1 << begin1;
    *pOut << "Plcx." << NameTab[ePlc] << endl1;

    PLCF* pPLCF;
    switch( ePlc ){
    case SEP: pPLCF = new PLCF_Sepx( nPos, nLen, ePlc );
              break;
    default:  pPLCF = new PLCF_Fkp( nPos, nLen, ePlc );
              break;
    }

    while(1){
        long nSt, nE;
        short nL;

        WW8_CP nP = pPLCF->WhereNext();
        pPLCF->SeekNextSprms( nSt, nE, nL );            // wo sind naechste Sprms

        if ( nSt == LONG_MAX )
            break;                              // fertig

        *pOut << "       " << indent1 << "Cp: " << hex << nP <<" Cp: " << nSt << ".." << nE << dec;

        if( nL ){
            *pOut << ", Len: " << nL << endl1;
            DumpSprms( *xStrm, nL );
        }else{
            *pOut << ", No Attribute" << endl1;
        }
    }
    end( *pOut, *xStrm ) << "Plcx." << NameTab[ePlc] << endl1 << endl1;
    DELETEZ( pPLCF );
}
#endif
//-----------------------------------------
//              Text ohne Attribute
//-----------------------------------------

static void DumpPlainText1( WW8_CP nStartCp, long nTextLen )
{
    long l;
    BYTE c;


    xStrm->Seek( pSBase->WW8Cp2Fc( nStartCp ) );

    for (l=0; l<nTextLen; l++)
    {
        xStrm->Read( &c, sizeof(c) );
        if ( DumpChar( c ) )
        {
            *pOut << endl1;
            indent( *pOut, *xStrm );
        }
//      DumpChar( c );
    }
}

void DumpShortPlainText( WW8_CP nStartCp, long nTextLen, char* pName )
{
    indent( *pOut, *xStrm ) << pName << " PlainText: Cp: "
                                    << hex << nStartCp
                                    << ".." << nStartCp + nTextLen << dec
                                    << " :\"";
    DumpPlainText1( nStartCp, nTextLen );
    *pOut << "\"" << endl1;
}

void DumpPlainText( WW8_CP nStartCp, long nTextLen, char* pName )
{
    begin( *pOut, *xStrm ) << pName << " Text: Cp: " << hex << nStartCp
                                    << ".." << nStartCp + nTextLen << dec
                                    << endl1;
    indent( *pOut, *xStrm );
    DumpPlainText1( nStartCp, nTextLen );
    *pOut << endl1;
    end( *pOut, *xStrm ) << pName << " Text" << endl1;
}

//-----------------------------------------
//              Text mit Attributen
//-----------------------------------------

BOOL DumpChar( BYTE c )
{
    if ( ( c >= 32 ) && ( c <= 127 ) ){
        *pOut << c;
        return FALSE;
    }else{
        switch (c){
        case 0xe4:                          // dt. Umlaute
        case 0xf6:
        case 0xfc:
        case 0xdf:
        case 0xc4:
        case 0xd6:
        case 0xdc: *pOut << c; return FALSE;

        case 0xd: *pOut << "<CR>";
                  return TRUE;
        case 0x7:
        case 0xc:  *pOut << "<0x" << hex2 << (USHORT)c << dec2 << '>';
                  return TRUE;
        default:  *pOut << "<0x" << hex2 << (USHORT)c << dec2 << '>';
                  return FALSE;
        }
    }
}

#if 0
void DumpText2( long nTextStart, long nTextLen, long nPlcPos, long nPlcLen, ePlcT ePlc )
{
    long l;
    BYTE c;

    PLCF aPLCF( nPlcPos, nPlcLen, ePlc );
    long nNxStart = aPLCF.WhereNext();
    long nNxEnd = LONG_MAX;

    xStrm->Seek( nTextStart );

    begin( *pOut, *xStrm ) << "Text" << endl1;
    indent( *pOut, xStrm );
    for (l=0; l<nTextLen; l++){

        if( nTextStart + l == nNxStart ){
            long nOld = xStrm->Tell();
            short nL;

            aPLCF.SeekNext( nNxStart, nNxEnd, nL );         // wo ist naechstes Attribut
            if( nL ){
                *pOut << '<';
                DumpSprmsShort( nL );
                *pOut << '>';
            }else{
                *pOut << "<No Attribute>";
            }

            nNxStart = aPLCF.WhereNext();
            xStrm->Seek( nOld );
        }
        if( nTextStart + l == nNxEnd )
            *pOut << "<End Attribute>";

        xStrm->Read( &c, sizeof(c) );
        if ( DumpChar( c ) )
        {
            *pOut << endl1;
            indent( *pOut, xStrm );
        }
    }
    *pOut << endl1;
    end( *pOut, *xStrm ) << "Text" << endl1 << endl1;
}
#endif
#if 0
long DumpTxtAttr( WW8PLCFMan& rMan, BOOL& bNl )
{
    long nPos, nNext, nOld = xStrm->Tell();
    short nId;
    long nL;
    BYTE nFlags;

    BOOL b = rMan.SeekNext( nPos, nL, nId, nFlags );    // gehe zu Attribut

    if( nFlags & MAN_MASK_NEW_SEP )             // neue Section
        *pOut << "<Section Break>";

/*  if( nFlags & MAN_MASK_NEW_PAP )             // neuer Absatz
        *pOut << "<ParaStyle:" << pPLCFMan->GetColl( MAN_NUM_PARACOLL ) << '>' << endl1;
*/
    if( nId != -1 && nId != -11 ){                      // leere Attrs ignorieren

        if ( bNl )
            *pOut << hex6 << nOld << ' ' << indent1;
        bNl = FALSE;

        if( nId < 256 ){
            if( b ){                                    // WW-Attribute
                if( nL >= 0 ){                          // Attr-Anfang
                    xStrm->Seek( nPos );
                    DumpSprmShort( (short)nL );
                }else {
                    *pOut << "<A" << nId << " No Attr>";
                }
            }else{                                      // Attr-Ende
                *pOut << "<End A" << nId << '>';
            }
        }else if( nId < 260 ){
            DumpFtnShort( nId, nPos, nL );            // Footnotes u.ae.
        }else{
            *pOut << "<Field>";
        }
    }

    nNext = rMan.WhereNext();
    xStrm->Seek( nOld );
    return nNext;
}

void DumpText( WW8_CP nStartCp, long nTextLen, WW8ScannerBase* pBase, short nType, char* pName )
{
    pPLCFMan = new WW8PLCFMan( pBase, nType );

    long l;
    BYTE c;

    long nNext = pPLCFMan->WhereNext();

    xStrm->Seek( WW8Cp2Fc( nStartCpp, pWwFib->fcMin, 8 != pWwFib->nVersion ) );

    begin( *pOut, *xStrm ) << pName << "Text" << endl1;
    BOOL bNl = TRUE;
    for (l=nStartCp; l<nStartCp+nTextLen; l++){

        while( l >= nNext )
            nNext = DumpTxtAttr( *pPLCFMan, bNl );

        if ( bNl ) indent( *pOut, xStrm );

        xStrm->Read( &c, sizeof(c) );
        bNl = DumpChar( c );
        if ( bNl ){
            *pOut << "<ParaStyle:" << pPLCFMan->GetColl( MAN_NUM_PARACOLL ) << '>' << endl1;
        }
    }

    while( l >= nNext )
        nNext = DumpTxtAttr( *pPLCFMan, bNl );

    if( !bNl )
        *pOut << endl1;

    end( *pOut, *xStrm ) << pName << "Text" << endl1;

    DELETEZ( pPLCFMan );
}
#endif

//-----------------------------------------
//      Header / Footer
//-----------------------------------------

static void DumpPlcText( WW8_FC nPos, long nLen, long nOfs,
                        char* pName, WW8ScannerBase* pBase,
                        long nStruct = 0, FNDumpData pOutFnc = 0 )
{
    if( !nLen ) return;

    WW8PLCF aPlc( &xTableStream, nPos , nLen, nStruct );

    *pOut << 'T' << hex6 << nPos << dec2 <<  ' ' << indent1 << begin1;
    *pOut << "Plc." << pName << " Text, Len: ";
    *pOut << nLen << ", " << aPlc.GetIMax() << " Elements" << endl1;

    int i;
    for( i=0; i < aPlc.GetIMax(); ++i )
    {
        WW8_CP start, ende;
        WW8_FC start2, ende2;
        void* pData;
        aPlc.Get( start, ende, pData );
        start2 = pSBase->WW8Cp2Fc(start + nOfs );
        ende2 =  pSBase->WW8Cp2Fc(ende + nOfs );

        *pOut << "       " << indent1 << "Plcx." << pName;
        *pOut << " Cp: " << hex << start << ".." << ende;
        *pOut << " entspricht Fc: " << start2 << ".." << ende2 << dec << endl1;

        DumpPlainText( nOfs + start, ende - start - 1, pName );

        if( pOutFnc )
            (*pOutFnc)( pData );
        aPlc++;
    }
    end( *pOut, *xTableStream ) << "Plcx." << pName << endl1 << endl1;
}

void DumpHeader( WW8ScannerBase* pBase )
{
    DumpPlcText( pWwFib->fcPlcfhdd,
                 pWwFib->lcbPlcfhdd,
                 pWwFib->ccpText + pWwFib->ccpFtn,
                 "Header/Footer", pBase );
}

static void DumpFootnotes( WW8ScannerBase* pBase )
{
    if( !pWwFib->lcbPlcffndRef ){
        *pOut << "No Footnotes" << endl1 << endl1;
        return;
    }

    DumpPLCF( pWwFib->fcPlcffndRef,
              pWwFib->lcbPlcffndRef,
              ePLCFT(/*FNR*/PLCF_END + 1) );
    DumpPlcText( pWwFib->fcPlcffndTxt,
                 pWwFib->lcbPlcffndTxt,
                 pWwFib->ccpText,
                 "FootNote" , pBase );
}

static void DumpEndnotes( WW8ScannerBase* pBase )
{
    if( !pWwFib->lcbPlcfendRef ){
        *pOut << "No Endnotes" << endl1 << endl1;
        return;
    }

    DumpPLCF( pWwFib->fcPlcfendRef,
              pWwFib->lcbPlcfendRef,
              ePLCFT(/*ENR*/PLCF_END + 2) );
    DumpPlcText( pWwFib->fcPlcfendTxt,
                 pWwFib->lcbPlcfendTxt,
                 pWwFib->ccpText + pWwFib->ccpFtn
                    + pWwFib->ccpHdr + pWwFib->ccpAtn,
                 "EndNote", pBase );
}

static void DumpAnnotations( WW8ScannerBase* pBase )
{
    if( !pWwFib->lcbPlcfandRef ){
        *pOut << "No Annotations" << endl1 << endl1;
        return;
    }

    DumpPLCF( pWwFib->fcPlcfandRef,
              pWwFib->lcbPlcfandRef,
              ePLCFT(/*ENR*/PLCF_END + 3) );
    DumpPlcText( pWwFib->fcPlcfandTxt,
                 pWwFib->lcbPlcfandTxt,
                 pWwFib->ccpText + pWwFib->ccpFtn
                    + pWwFib->ccpHdr,
                 "Annotation", pBase );
}

void DumpTxtStoryEntry( void* pData )
{
    if( 8 == pWwFib->nVersion )
    {
        long* p = (long*)pData;
        begin( *pOut, *xStrm )
            << "TextboxStory" << hex << endl1;

        *pOut << "       " << indent1 << "cTxbx/iNextReuse: 0x" << *p++;
        *pOut << " cReusable: 0x" << *p++;
        short* ps = (short*)p;
        *pOut << " fReusable: 0x" << *ps++ << endl1;
        p = (long*)ps;
        ++p;        // reserved
        *pOut << "       " << indent1 << "lid: 0x" << *p++;
        *pOut << " txidUndo: 0x" << *p++ << dec << endl1;

        end( *pOut, *xStrm ) << "TextboxStory" << endl1 << endl1;
    }
}

static void DumpTextBoxs( WW8ScannerBase* pBase )
{
    if( pWwFib->lcbPlcftxbxTxt )
    {
        DumpPlcText( pWwFib->fcPlcftxbxTxt,
                     pWwFib->lcbPlcftxbxTxt,
                     pWwFib->ccpText + pWwFib->ccpFtn
                        + pWwFib->ccpHdr + pWwFib->ccpAtn + pWwFib->ccpEdn,
                     "TextBoxes", pBase,
                     8 == pWwFib->nVersion ? 22 : 0, &DumpTxtStoryEntry );
    }
    else
        *pOut << "No Textboxes" << endl1 << endl1;

    if( pWwFib->lcbPlcfHdrtxbxTxt )
        DumpPlcText( pWwFib->fcPlcfHdrtxbxTxt,
                     pWwFib->lcbPlcfHdrtxbxTxt,
                     pWwFib->ccpText + pWwFib->ccpFtn
                        + pWwFib->ccpHdr + pWwFib->ccpAtn + pWwFib->ccpEdn
                        + pWwFib->ccpTxbx,
                     "HeaderTextBoxes", pBase,
                     8 == pWwFib->nVersion ? 22 : 0, &DumpTxtStoryEntry );
    else
        *pOut << "No HeaderTextboxes" << endl1 << endl1;

}


static void DumpDrawObjects( const char* pNm, long nStart, long nLen,
                            long nOffset )
{
    if( nStart && nLen )
    {
        WW8PLCFspecial aPLCF( &xTableStream, nStart, nLen,
                                8 == pWwFib->nVersion ? 26 : 6 );
        *pOut << 'T' << hex6 << nStart << dec2 << ' ' << indent1 << begin1
              << pNm << ", Len: " << nLen
              << ", " << aPLCF.GetIMax() << " Elements" << endl1;

        for( USHORT i = 0; i < aPLCF.GetIMax(); ++i )
        {
            long nCp = aPLCF.GetPos( i );
            if( nCp >= LONG_MAX )
                break;

            *pOut << indent2 << i << ".Cp: 0x" << hex << nCp + nOffset;
            long* pFSPA = (long*)aPLCF.GetData( i );
            if( 8 == pWwFib->nVersion )
            {
                *pOut << " ShapeId: 0x" << *pFSPA++;
                *pOut << " left: " << dec << *pFSPA++;
                *pOut << " top: " << *pFSPA++;
                *pOut << " right: " << *pFSPA++;
                *pOut << " bottom: " << *pFSPA++;
                USHORT* pU = (USHORT*)pFSPA;
                *pOut << " flags: 0x" << hex << *pU++;
                pFSPA = (long*)pU;
                *pOut << " xTxbx: " << dec << *pFSPA;
            }
            else
            {
                *pOut << " FC of DO: 0x" << *pFSPA++;
                *pOut << " ctcbx: " << dec << *(USHORT*)pFSPA;
            }

            *pOut << endl1;
        }
        *pOut << end1;
    }
    else
        *pOut << "No ";
    *pOut << pNm << endl1 << endl1;
}

static void DumpTxtboxBrks( const char* pNm, long nStart, long nLen,
                            long nOffset )
{
    if( nStart && nLen )
    {
        WW8PLCFspecial aPLCF( &xTableStream, nStart, nLen, 6 );
        *pOut << 'T' << hex6 << nStart << dec2 << ' ' << indent1 << begin1
              << pNm << ", Len: " << nLen
              << ", " << aPLCF.GetIMax() << " Elements" << endl1;

        for( USHORT i = 0; i < aPLCF.GetIMax(); ++i )
        {
            long nCp = aPLCF.GetPos( i );
            if( nCp >= LONG_MAX )
                break;

            USHORT* pBKD = (USHORT*)aPLCF.GetData( i );
            *pOut << indent2 << i << ".Cp: 0x" << hex << nCp + nOffset
                  << " itxbxs: 0x" << *pBKD++;
            *pOut << " dcpDepend: 0x" << *pBKD++;
            *pOut << " flags: 0x" << hex << *pBKD << dec << endl1;
        }
        *pOut << end2;
    }
    else
        *pOut << "No ";
    *pOut << pNm << endl1 << endl1;
}

static void DumpFdoa( WW8ScannerBase* pBase )
{
    long nOffset = pWwFib->ccpText + pWwFib->ccpFtn
                        + pWwFib->ccpHdr + pWwFib->ccpAtn + pWwFib->ccpEdn;

    if( 8 == pWwFib->nVersion )
    {
        DumpDrawObjects( "DrawObjects in Maintext",
                            pWwFib->fcPlcfspaMom, pWwFib->lcbPlcfspaMom,
                            /*nOffset*/0 );
        // PLCF fuer TextBox-Break-Deskriptoren im Maintext
        DumpTxtboxBrks( "TextBox-Break-Desk. im Maintext",
                        pWwFib->fcPlcftxbxBkd, pWwFib->lcbPlcftxbxBkd,
                        nOffset );
    }
    else
        DumpDrawObjects( "DrawObjects in Maintext",
                            pWwFib->fcPlcfdoaMom, pWwFib->lcbPlcfdoaMom,
                            /*nOffset*/0 );

    nOffset += pWwFib->ccpHdrTxbx;

    if( 8 == pWwFib->nVersion )
    {
        DumpDrawObjects( "DrawObjects in Head/Foot",
                    pWwFib->fcPlcfspaHdr, pWwFib->lcbPlcfspaHdr,
                    /*nOffset*/0 );
        // PLCF fuer TextBox-Break-Deskriptoren im Header-/Footer-Bereich
        DumpTxtboxBrks( "TextBox-Break-Desk. im Head/Foot",
                        pWwFib->fcPlcfHdrtxbxBkd, pWwFib->lcbPlcfHdrtxbxBkd,
                        nOffset );
    }
    else
        DumpDrawObjects( "DrawObjects in Head/Foot",
                    pWwFib->fcPlcfdoaHdr, pWwFib->lcbPlcfdoaHdr,
                    /*nOffset*/0 );
}

BOOL ReadEsherRec( SvStream& rStrm, UINT8& rVer, UINT16& rInst,
                    UINT16& rFbt, UINT32& rLength )
{
    UINT16 aBits;
    if( !WW8ReadUINT16( rStrm, aBits ) ) return FALSE;
    rVer  =  aBits & 0x000F;
    rInst = (aBits & 0xFFF0) >> 4;
    //----------------------------------------------
    if( !WW8ReadUINT16( rStrm, rFbt ) ) return FALSE;
    //----------------------------------------------
    return WW8ReadUINT32( rStrm, rLength );
}

const char* _GetShapeTypeNm( UINT16 nId )
{
    const char* aNmArr[ 202 + 2 + 1 ] = {
/*   0*/    "NotPrimitive","Rectangle","RoundRectangle","Ellipse","Diamond","IsocelesTriangle","RightTriangle","Parallelogram","Trapezoid","Hexagon",
/*  10*/    "Octagon","Plus","Star","Arrow","ThickArrow","HomePlate","Cube","Balloon","Seal","Arc",
/*  20*/    "Line","Plaque","Can","Donut","TextSimple","TextOctagon","TextHexagon","TextCurve","TextWave","TextRing",
/*  30*/    "TextOnCurve","TextOnRing","StraightConnector1","BentConnector2","BentConnector3","BentConnector4","BentConnector5","CurvedConnector2","CurvedConnector3","CurvedConnector4",
/*  40*/    "CurvedConnector5","Callout1","Callout2","Callout3","AccentCallout1","AccentCallout2","AccentCallout3","BorderCallout1","BorderCallout2","BorderCallout3",
/*  50*/    "AccentBorderCallout1","AccentBorderCallout2","AccentBorderCallout3","Ribbon","Ribbon2","Chevron","Pentagon","NoSmoking","Seal8","Seal16",
/*  60*/    "Seal32","WedgeRectCallout","WedgeRRectCallout","WedgeEllipseCallout","Wave","FoldedCorner","LeftArrow","DownArrow","UpArrow","LeftRightArrow",
/*  70*/    "UpDownArrow","IrregularSeal1","IrregularSeal2","LightningBolt","Heart","PictureFrame","QuadArrow","LeftArrowCallout","RightArrowCallout","UpArrowCallout",
/*  80*/    "DownArrowCallout","LeftRightArrowCallout","UpDownArrowCallout","QuadArrowCallout","Bevel","LeftBracket","RightBracket","LeftBrace","RightBrace","LeftUpArrow",
/*  90*/    "BentUpArrow","BentArrow","Seal24","StripedRightArrow","NotchedRightArrow","BlockArc","SmileyFace","VerticalScroll","HorizontalScroll","CircularArrow",
/* 100*/    "NotchedCircularArrow","UturnArrow","CurvedRightArrow","CurvedLeftArrow","CurvedUpArrow","CurvedDownArrow","CloudCallout","EllipseRibbon","EllipseRibbon2","FlowChartProcess",
/* 110*/    "FlowChartDecision","FlowChartInputOutput","FlowChartPredefinedProcess","FlowChartInternalStorage","FlowChartDocument","FlowChartMultidocument","FlowChartTerminator","FlowChartPreparation","FlowChartManualInput","FlowChartManualOperation",
/* 120*/    "FlowChartConnector","FlowChartPunchedCard","FlowChartPunchedTape","FlowChartSummingJunction","FlowChartOr","FlowChartCollate","FlowChartSort","FlowChartExtract","FlowChartMerge","FlowChartOfflineStorage",
/* 130*/    "FlowChartOnlineStorage","FlowChartMagneticTape","FlowChartMagneticDisk","FlowChartMagneticDrum","FlowChartDisplay","FlowChartDelay","TextPlainText","TextStop","TextTriangle","TextTriangleInverted",
/* 140*/    "TextChevron","TextChevronInverted","TextRingInside","TextRingOutside","TextArchUpCurve","TextArchDownCurve","TextCircleCurve","TextButtonCurve","TextArchUpPour","TextArchDownPour",
/* 150*/    "TextCirclePour","TextButtonPour","TextCurveUp","TextCurveDown","TextCascadeUp","TextCascadeDown","TextWave1","TextWave2","TextWave3","TextWave4",
/* 160*/    "TextInflate","TextDeflate","TextInflateBottom","TextDeflateBottom","TextInflateTop","TextDeflateTop","TextDeflateInflate","TextDeflateInflateDeflate","TextFadeRight","TextFadeLeft",
/* 170*/    "TextFadeUp","TextFadeDown","TextSlantUp","TextSlantDown","TextCanUp","TextCanDown","FlowChartAlternateProcess","FlowChartOffpageConnector","Callout90","AccentCallout90",
/* 180*/    "BorderCallout90","AccentBorderCallout90","LeftRightUpArrow","Sun","Moon","BracketPair","BracePair","Seal4","DoubleWave","ActionButtonBlank",
/* 190*/    "ActionButtonHome","ActionButtonHelp","ActionButtonInformation","ActionButtonForwardNext","ActionButtonBackPrevious","ActionButtonEnd","ActionButtonBeginning","ActionButtonReturn","ActionButtonDocument","ActionButtonSound",
/* 200*/    "ActionButtonMovie","HostControl","TextBox","Nil", "???"
    };
    if( 203 < nId )
        nId = 204;
    return aNmArr[ nId ];
}

void DumpEscherProp( UINT16 nId, BOOL bBid, BOOL bComplex, UINT32 nOp,
                        UINT32& rStreamOffset )
{
    const char* pRecNm = 0;
    switch( nId )
    {
    case 4:     pRecNm = "DFF_Prop_Rotation"; break;
// Protection
    case 119:   pRecNm = "DFF_Prop_LockRotation"; break;
    case 120:   pRecNm = "DFF_Prop_LockAspectRatio"; break;
    case 121:   pRecNm = "DFF_Prop_LockPosition"; break;
    case 122:   pRecNm = "DFF_Prop_LockAgainstSelect"; break;
    case 123:   pRecNm = "DFF_Prop_LockCropping"; break;
    case 124:   pRecNm = "DFF_Prop_LockVertices"; break;
    case 125:   pRecNm = "DFF_Prop_LockText"; break;
    case 126:   pRecNm = "DFF_Prop_LockAdjustHandles"; break;
    case 127:   pRecNm = "DFF_Prop_LockAgainstGrouping"; break;
// Text
    case 128:   pRecNm = "DFF_Prop_lTxid"; break;
    case 129:   pRecNm = "DFF_Prop_dxTextLeft"; break;
    case 130:   pRecNm = "DFF_Prop_dyTextTop"; break;
    case 131:   pRecNm = "DFF_Prop_dxTextRight"; break;
    case 132:   pRecNm = "DFF_Prop_dyTextBottom"; break;
    case 133:   pRecNm = "DFF_Prop_WrapText"; break;
    case 134:   pRecNm = "DFF_Prop_scaleText"; break;
    case 135:   pRecNm = "DFF_Prop_anchorText"; break;
    case 136:   pRecNm = "DFF_Prop_txflTextFlow"; break;
    case 137:   pRecNm = "DFF_Prop_cdirFont"; break;
    case 138:   pRecNm = "DFF_Prop_hspNext"; break;
    case 139:   pRecNm = "DFF_Prop_txdir"; break;
    case 187:   pRecNm = "DFF_Prop_SelectText"; break;
    case 188:   pRecNm = "DFF_Prop_AutoTextMargin"; break;
    case 189:   pRecNm = "DFF_Prop_RotateText"; break;
    case 190:   pRecNm = "DFF_Prop_FitShapeToText"; break;
    case 191:   pRecNm = "DFF_Prop_FitTextToShape"; break;
// GeoText
    case 192:   pRecNm = "DFF_Prop_gtextUNICODE"; break;
    case 193:   pRecNm = "DFF_Prop_gtextRTF"; break;
    case 194:   pRecNm = "DFF_Prop_gtextAlign"; break;
    case 195:   pRecNm = "DFF_Prop_gtextSize"; break;
    case 196:   pRecNm = "DFF_Prop_gtextSpacing"; break;
    case 197:   pRecNm = "DFF_Prop_gtextFont"; break;
    case 240:   pRecNm = "DFF_Prop_gtextFReverseRows"; break;
    case 241:   pRecNm = "DFF_Prop_fGtext"; break;
    case 242:   pRecNm = "DFF_Prop_gtextFVertical"; break;
    case 243:   pRecNm = "DFF_Prop_gtextFKern"; break;
    case 244:   pRecNm = "DFF_Prop_gtextFTight"; break;
    case 245:   pRecNm = "DFF_Prop_gtextFStretch"; break;
    case 246:   pRecNm = "DFF_Prop_gtextFShrinkFit"; break;
    case 247:   pRecNm = "DFF_Prop_gtextFBestFit"; break;
    case 248:   pRecNm = "DFF_Prop_gtextFNormalize"; break;
    case 249:   pRecNm = "DFF_Prop_gtextFDxMeasure"; break;
    case 250:   pRecNm = "DFF_Prop_gtextFBold"; break;
    case 251:   pRecNm = "DFF_Prop_gtextFItalic"; break;
    case 252:   pRecNm = "DFF_Prop_gtextFUnderline"; break;
    case 253:   pRecNm = "DFF_Prop_gtextFShadow"; break;
    case 254:   pRecNm = "DFF_Prop_gtextFSmallcaps"; break;
    case 255:   pRecNm = "DFF_Prop_gtextFStrikethrough"; break;
// Blip
    case 256:   pRecNm = "DFF_Prop_cropFromTop"; break;
    case 257:   pRecNm = "DFF_Prop_cropFromBottom"; break;
    case 258:   pRecNm = "DFF_Prop_cropFromLeft"; break;
    case 259:   pRecNm = "DFF_Prop_cropFromRight"; break;
    case 260:   pRecNm = "DFF_Prop_pib"; break;
    case 261:   pRecNm = "DFF_Prop_pibName"; break;
    case 262:   pRecNm = "DFF_Prop_pibFlags"; break;
    case 263:   pRecNm = "DFF_Prop_pictureTransparent"; break;
    case 264:   pRecNm = "DFF_Prop_pictureContrast"; break;
    case 265:   pRecNm = "DFF_Prop_pictureBrightness"; break;
    case 266:   pRecNm = "DFF_Prop_pictureGamma"; break;
    case 267:   pRecNm = "DFF_Prop_pictureId"; break;
    case 268:   pRecNm = "DFF_Prop_pictureDblCrMod"; break;
    case 269:   pRecNm = "DFF_Prop_pictureFillCrMod"; break;
    case 270:   pRecNm = "DFF_Prop_pictureLineCrMod"; break;
    case 271:   pRecNm = "DFF_Prop_pibPrint"; break;
    case 272:   pRecNm = "DFF_Prop_pibPrintName"; break;
    case 273:   pRecNm = "DFF_Prop_pibPrintFlags"; break;
    case 316:   pRecNm = "DFF_Prop_fNoHitTestPicture"; break;
    case 317:   pRecNm = "DFF_Prop_pictureGray"; break;
    case 318:   pRecNm = "DFF_Prop_pictureBiLevel"; break;
    case 319:   pRecNm = "DFF_Prop_pictureActive"; break;
// Geometry
    case 320:   pRecNm = "DFF_Prop_geoLeft"; break;
    case 321:   pRecNm = "DFF_Prop_geoTop"; break;
    case 322:   pRecNm = "DFF_Prop_geoRight"; break;
    case 323:   pRecNm = "DFF_Prop_geoBottom"; break;
    case 324:   pRecNm = "DFF_Prop_shapePath"; break;
    case 325:   pRecNm = "DFF_Prop_pVertices"; break;
    case 326:   pRecNm = "DFF_Prop_pSegmentInfo"; break;
    case 327:   pRecNm = "DFF_Prop_adjustValue"; break;
    case 328:   pRecNm = "DFF_Prop_adjust2Value"; break;
    case 329:   pRecNm = "DFF_Prop_adjust3Value"; break;
    case 330:   pRecNm = "DFF_Prop_adjust4Value"; break;
    case 331:   pRecNm = "DFF_Prop_adjust5Value"; break;
    case 332:   pRecNm = "DFF_Prop_adjust6Value"; break;
    case 333:   pRecNm = "DFF_Prop_adjust7Value"; break;
    case 334:   pRecNm = "DFF_Prop_adjust8Value"; break;
    case 335:   pRecNm = "DFF_Prop_adjust9Value"; break;
    case 336:   pRecNm = "DFF_Prop_adjust10Value"; break;
    case 378:   pRecNm = "DFF_Prop_fShadowOK"; break;
    case 379:   pRecNm = "DFF_Prop_f3DOK"; break;
    case 380:   pRecNm = "DFF_Prop_fLineOK"; break;
    case 381:   pRecNm = "DFF_Prop_fGtextOK"; break;
    case 382:   pRecNm = "DFF_Prop_fFillShadeShapeOK"; break;
    case 383:   pRecNm = "DFF_Prop_fFillOK"; break;
// FillStyle
    case 384:   pRecNm = "DFF_Prop_fillType"; break;
    case 385:   pRecNm = "DFF_Prop_fillColor"; break;
    case 386:   pRecNm = "DFF_Prop_fillOpacity"; break;
    case 387:   pRecNm = "DFF_Prop_fillBackColor"; break;
    case 388:   pRecNm = "DFF_Prop_fillBackOpacity"; break;
    case 389:   pRecNm = "DFF_Prop_fillCrMod"; break;
    case 390:   pRecNm = "DFF_Prop_fillBlip"; break;
    case 391:   pRecNm = "DFF_Prop_fillBlipName"; break;
    case 392:   pRecNm = "DFF_Prop_fillBlipFlags"; break;
    case 393:   pRecNm = "DFF_Prop_fillWidth"; break;
    case 394:   pRecNm = "DFF_Prop_fillHeight"; break;
    case 395:   pRecNm = "DFF_Prop_fillAngle"; break;
    case 396:   pRecNm = "DFF_Prop_fillFocus"; break;
    case 397:   pRecNm = "DFF_Prop_fillToLeft"; break;
    case 398:   pRecNm = "DFF_Prop_fillToTop"; break;
    case 399:   pRecNm = "DFF_Prop_fillToRight"; break;
    case 400:   pRecNm = "DFF_Prop_fillToBottom"; break;
    case 401:   pRecNm = "DFF_Prop_fillRectLeft"; break;
    case 402:   pRecNm = "DFF_Prop_fillRectTop"; break;
    case 403:   pRecNm = "DFF_Prop_fillRectRight"; break;
    case 404:   pRecNm = "DFF_Prop_fillRectBottom"; break;
    case 405:   pRecNm = "DFF_Prop_fillDztype"; break;
    case 406:   pRecNm = "DFF_Prop_fillShadePreset"; break;
    case 407:   pRecNm = "DFF_Prop_fillShadeColors"; break;
    case 408:   pRecNm = "DFF_Prop_fillOriginX"; break;
    case 409:   pRecNm = "DFF_Prop_fillOriginY"; break;
    case 410:   pRecNm = "DFF_Prop_fillShapeOriginX"; break;
    case 411:   pRecNm = "DFF_Prop_fillShapeOriginY"; break;
    case 412:   pRecNm = "DFF_Prop_fillShadeType"; break;
    case 443:   pRecNm = "DFF_Prop_fFilled"; break;
    case 444:   pRecNm = "DFF_Prop_fHitTestFill"; break;
    case 445:   pRecNm = "DFF_Prop_fillShape"; break;
    case 446:   pRecNm = "DFF_Prop_fillUseRect"; break;
    case 447:   pRecNm = "DFF_Prop_fNoFillHitTest"; break;
// LineStyle
    case 448:   pRecNm = "DFF_Prop_lineColor"; break;
    case 449:   pRecNm = "DFF_Prop_lineOpacity"; break;
    case 450:   pRecNm = "DFF_Prop_lineBackColor"; break;
    case 451:   pRecNm = "DFF_Prop_lineCrMod"; break;
    case 452:   pRecNm = "DFF_Prop_lineType"; break;
    case 453:   pRecNm = "DFF_Prop_lineFillBlip"; break;
    case 454:   pRecNm = "DFF_Prop_lineFillBlipName"; break;
    case 455:   pRecNm = "DFF_Prop_lineFillBlipFlags"; break;
    case 456:   pRecNm = "DFF_Prop_lineFillWidth"; break;
    case 457:   pRecNm = "DFF_Prop_lineFillHeight"; break;
    case 458:   pRecNm = "DFF_Prop_lineFillDztype"; break;
    case 459:   pRecNm = "DFF_Prop_lineWidth"; break;
    case 460:   pRecNm = "DFF_Prop_lineMiterLimit"; break;
    case 461:   pRecNm = "DFF_Prop_lineStyle"; break;
    case 462:   pRecNm = "DFF_Prop_lineDashing"; break;
    case 463:   pRecNm = "DFF_Prop_lineDashStyle"; break;
    case 464:   pRecNm = "DFF_Prop_lineStartArrowhead"; break;
    case 465:   pRecNm = "DFF_Prop_lineEndArrowhead"; break;
    case 466:   pRecNm = "DFF_Prop_lineStartArrowWidth"; break;
    case 467:   pRecNm = "DFF_Prop_lineStartArrowLength"; break;
    case 468:   pRecNm = "DFF_Prop_lineEndArrowWidth"; break;
    case 469:   pRecNm = "DFF_Prop_lineEndArrowLength"; break;
    case 470:   pRecNm = "DFF_Prop_lineJoinStyle"; break;
    case 471:   pRecNm = "DFF_Prop_lineEndCapStyle"; break;
    case 507:   pRecNm = "DFF_Prop_fArrowheadsOK"; break;
    case 508:   pRecNm = "DFF_Prop_fLine"; break;
    case 509:   pRecNm = "DFF_Prop_fHitTestLine"; break;
    case 510:   pRecNm = "DFF_Prop_lineFillShape"; break;
    case 511:   pRecNm = "DFF_Prop_fNoLineDrawDash"; break;
// ShadowStyle
    case 512:   pRecNm = "DFF_Prop_shadowType"; break;
    case 513:   pRecNm = "DFF_Prop_shadowColor"; break;
    case 514:   pRecNm = "DFF_Prop_shadowHighlight"; break;
    case 515:   pRecNm = "DFF_Prop_shadowCrMod"; break;
    case 516:   pRecNm = "DFF_Prop_shadowOpacity"; break;
    case 517:   pRecNm = "DFF_Prop_shadowOffsetX"; break;
    case 518:   pRecNm = "DFF_Prop_shadowOffsetY"; break;
    case 519:   pRecNm = "DFF_Prop_shadowSecondOffsetX"; break;
    case 520:   pRecNm = "DFF_Prop_shadowSecondOffsetY"; break;
    case 521:   pRecNm = "DFF_Prop_shadowScaleXToX"; break;
    case 522:   pRecNm = "DFF_Prop_shadowScaleYToX"; break;
    case 523:   pRecNm = "DFF_Prop_shadowScaleXToY"; break;
    case 524:   pRecNm = "DFF_Prop_shadowScaleYToY"; break;
    case 525:   pRecNm = "DFF_Prop_shadowPerspectiveX"; break;
    case 526:   pRecNm = "DFF_Prop_shadowPerspectiveY"; break;
    case 527:   pRecNm = "DFF_Prop_shadowWeight"; break;
    case 528:   pRecNm = "DFF_Prop_shadowOriginX"; break;
    case 529:   pRecNm = "DFF_Prop_shadowOriginY"; break;
    case 574:   pRecNm = "DFF_Prop_fShadow"; break;
    case 575:   pRecNm = "DFF_Prop_fshadowObscured"; break;
// PerspectiveStyle
    case 576:   pRecNm = "DFF_Prop_perspectiveType"; break;
    case 577:   pRecNm = "DFF_Prop_perspectiveOffsetX"; break;
    case 578:   pRecNm = "DFF_Prop_perspectiveOffsetY"; break;
    case 579:   pRecNm = "DFF_Prop_perspectiveScaleXToX"; break;
    case 580:   pRecNm = "DFF_Prop_perspectiveScaleYToX"; break;
    case 581:   pRecNm = "DFF_Prop_perspectiveScaleXToY"; break;
    case 582:   pRecNm = "DFF_Prop_perspectiveScaleYToY"; break;
    case 583:   pRecNm = "DFF_Prop_perspectivePerspectiveX"; break;
    case 584:   pRecNm = "DFF_Prop_perspectivePerspectiveY"; break;
    case 585:   pRecNm = "DFF_Prop_perspectiveWeight"; break;
    case 586:   pRecNm = "DFF_Prop_perspectiveOriginX"; break;
    case 587:   pRecNm = "DFF_Prop_perspectiveOriginY"; break;
    case 639:   pRecNm = "DFF_Prop_fPerspective"; break;
// 3D Object
    case 640:   pRecNm = "DFF_Prop_c3DSpecularAmt"; break;
    case 641:   pRecNm = "DFF_Prop_c3DDiffuseAmt"; break;
    case 642:   pRecNm = "DFF_Prop_c3DShininess"; break;
    case 643:   pRecNm = "DFF_Prop_c3DEdgeThickness"; break;
    case 644:   pRecNm = "DFF_Prop_c3DExtrudeForward"; break;
    case 645:   pRecNm = "DFF_Prop_c3DExtrudeBackward"; break;
    case 646:   pRecNm = "DFF_Prop_c3DExtrudePlane"; break;
    case 647:   pRecNm = "DFF_Prop_c3DExtrusionColor"; break;
    case 648:   pRecNm = "DFF_Prop_c3DCrMod"; break;
    case 700:   pRecNm = "DFF_Prop_f3D"; break;
    case 701:   pRecNm = "DFF_Prop_fc3DMetallic"; break;
    case 702:   pRecNm = "DFF_Prop_fc3DUseExtrusionColor"; break;
    case 703:   pRecNm = "DFF_Prop_fc3DLightFace"; break;
// 3D Style
    case 704:   pRecNm = "DFF_Prop_c3DYRotationAngle"; break;
    case 705:   pRecNm = "DFF_Prop_c3DXRotationAngle"; break;
    case 706:   pRecNm = "DFF_Prop_c3DRotationAxisX"; break;
    case 707:   pRecNm = "DFF_Prop_c3DRotationAxisY"; break;
    case 708:   pRecNm = "DFF_Prop_c3DRotationAxisZ"; break;
    case 709:   pRecNm = "DFF_Prop_c3DRotationAngle"; break;
    case 710:   pRecNm = "DFF_Prop_c3DRotationCenterX"; break;
    case 711:   pRecNm = "DFF_Prop_c3DRotationCenterY"; break;
    case 712:   pRecNm = "DFF_Prop_c3DRotationCenterZ"; break;
    case 713:   pRecNm = "DFF_Prop_c3DRenderMode"; break;
    case 714:   pRecNm = "DFF_Prop_c3DTolerance"; break;
    case 715:   pRecNm = "DFF_Prop_c3DXViewpoint"; break;
    case 716:   pRecNm = "DFF_Prop_c3DYViewpoint"; break;
    case 717:   pRecNm = "DFF_Prop_c3DZViewpoint"; break;
    case 718:   pRecNm = "DFF_Prop_c3DOriginX"; break;
    case 719:   pRecNm = "DFF_Prop_c3DOriginY"; break;
    case 720:   pRecNm = "DFF_Prop_c3DSkewAngle"; break;
    case 721:   pRecNm = "DFF_Prop_c3DSkewAmount"; break;
    case 722:   pRecNm = "DFF_Prop_c3DAmbientIntensity"; break;
    case 723:   pRecNm = "DFF_Prop_c3DKeyX"; break;
    case 724:   pRecNm = "DFF_Prop_c3DKeyY"; break;
    case 725:   pRecNm = "DFF_Prop_c3DKeyZ"; break;
    case 726:   pRecNm = "DFF_Prop_c3DKeyIntensity"; break;
    case 727:   pRecNm = "DFF_Prop_c3DFillX"; break;
    case 728:   pRecNm = "DFF_Prop_c3DFillY"; break;
    case 729:   pRecNm = "DFF_Prop_c3DFillZ"; break;
    case 730:   pRecNm = "DFF_Prop_c3DFillIntensity"; break;
    case 763:   pRecNm = "DFF_Prop_fc3DConstrainRotation"; break;
    case 764:   pRecNm = "DFF_Prop_fc3DRotationCenterAuto"; break;
    case 765:   pRecNm = "DFF_Prop_fc3DParallel"; break;
    case 766:   pRecNm = "DFF_Prop_fc3DKeyHarsh"; break;
    case 767:   pRecNm = "DFF_Prop_fc3DFillHarsh"; break;
// Shape
    case 769:   pRecNm = "DFF_Prop_hspMaster"; break;
    case 771:   pRecNm = "DFF_Prop_cxstyle"; break;
    case 772:   pRecNm = "DFF_Prop_bWMode"; break;
    case 773:   pRecNm = "DFF_Prop_bWModePureBW"; break;
    case 774:   pRecNm = "DFF_Prop_bWModeBW"; break;
    case 826:   pRecNm = "DFF_Prop_fOleIcon"; break;
    case 827:   pRecNm = "DFF_Prop_fPreferRelativeResize"; break;
    case 828:   pRecNm = "DFF_Prop_fLockShapeType"; break;
    case 830:   pRecNm = "DFF_Prop_fDeleteAttachedObject"; break;
    case 831:   pRecNm = "DFF_Prop_fBackground"; break;

// Callout
    case 832:   pRecNm = "DFF_Prop_spcot"; break;
    case 833:   pRecNm = "DFF_Prop_dxyCalloutGap"; break;
    case 834:   pRecNm = "DFF_Prop_spcoa"; break;
    case 835:   pRecNm = "DFF_Prop_spcod"; break;
    case 836:   pRecNm = "DFF_Prop_dxyCalloutDropSpecified"; break;
    case 837:   pRecNm = "DFF_Prop_dxyCalloutLengthSpecified"; break;
    case 889:   pRecNm = "DFF_Prop_fCallout"; break;
    case 890:   pRecNm = "DFF_Prop_fCalloutAccentBar"; break;
    case 891:   pRecNm = "DFF_Prop_fCalloutTextBorder"; break;
    case 892:   pRecNm = "DFF_Prop_fCalloutMinusX"; break;
    case 893:   pRecNm = "DFF_Prop_fCalloutMinusY"; break;
    case 894:   pRecNm = "DFF_Prop_fCalloutDropAuto"; break;
    case 895:   pRecNm = "DFF_Prop_fCalloutLengthSpecified"; break;

// GroupShape
    case 896:   pRecNm = "DFF_Prop_wzName"; break;
    case 897:   pRecNm = "DFF_Prop_wzDescription"; break;
    case 898:   pRecNm = "DFF_Prop_pihlShape"; break;
    case 899:   pRecNm = "DFF_Prop_pWrapPolygonVertices"; break;
    case 900:   pRecNm = "DFF_Prop_dxWrapDistLeft"; break;
    case 901:   pRecNm = "DFF_Prop_dyWrapDistTop"; break;
    case 902:   pRecNm = "DFF_Prop_dxWrapDistRight"; break;
    case 903:   pRecNm = "DFF_Prop_dyWrapDistBottom"; break;
    case 904:   pRecNm = "DFF_Prop_lidRegroup"; break;
    case 953:   pRecNm = "DFF_Prop_fEditedWrap"; break;
    case 954:   pRecNm = "DFF_Prop_fBehindDocument"; break;
    case 955:   pRecNm = "DFF_Prop_fOnDblClickNotify"; break;
    case 956:   pRecNm = "DFF_Prop_fIsButton"; break;
    case 957:   pRecNm = "DFF_Prop_fOneD"; break;
    case 958:   pRecNm = "DFF_Prop_fHidden"; break;
    case 959:   pRecNm = "DFF_Prop_fPrint"; break;
    }

    *pOut << "      " << indent1 << ' ';
    if( pRecNm )
        *pOut << pRecNm;
    else
        *pOut << "Prop" ;

    *pOut   << " Id: " << dec << nId << " (=0x" << hex << nId << ')';
    if( bBid )
        *pOut << " Bid: 0x" << (UINT16)bBid;

    if( bComplex )
    {
        *pOut << " Cmpl: 0x" << (UINT16)bComplex;
        // ....
        rStreamOffset += nOp;
    }
//  else
        *pOut << " op: 0x" << nOp;

    *pOut << dec << endl1;
}

void DumpEscherRec( ULONG nPos, UINT8 nVer, UINT16 nInst,
                    UINT16 nFbt, UINT32 nLength )
{
    const char* pRecNm = 0;
    switch( nFbt )
    {
    case 0xF000:    pRecNm = "DFF_msofbtDggContainer"; break;
    case 0xF006:    pRecNm = "DFF_msofbtDgg"; break;
    case 0xF016:    pRecNm = "DFF_msofbtCLSID"; break;
    case 0xF00B:    pRecNm = "DFF_msofbtOPT"; break;
    case 0xF11A:    pRecNm = "DFF_msofbtColorMRU"; break;
    case 0xF11E:    pRecNm = "DFF_msofbtSplitMenuColors"; break;
    case 0xF001:    pRecNm = "DFF_msofbtBstoreContainer"; break;
    case 0xF007:    pRecNm = "DFF_msofbtBSE"; break;
    case 0xF018:    pRecNm = "DFF_msofbtBlipFirst"; break;
    case 0xF117:    pRecNm = "DFF_msofbtBlipLast"; break;
    case 0xF002:    pRecNm = "DFF_msofbtDgContainer"; break;
    case 0xF008:    pRecNm = "DFF_msofbtDg"; break;
    case 0xF118:    pRecNm = "DFF_msofbtRegroupItems"; break;
    case 0xF120:    pRecNm = "DFF_msofbtColorScheme"; break;
    case 0xF003:    pRecNm = "DFF_msofbtSpgrContainer"; break;
    case 0xF004:    pRecNm = "DFF_msofbtSpContainer"; break;
    case 0xF009:    pRecNm = "DFF_msofbtSpgr"; break;
    case 0xF00A:    pRecNm = "DFF_msofbtSp"; break;
    case 0xF00C:    pRecNm = "DFF_msofbtTextbox"; break;
    case 0xF00D:    pRecNm = "DFF_msofbtClientTextbox"; break;
    case 0xF00E:    pRecNm = "DFF_msofbtAnchor"; break;
    case 0xF00F:    pRecNm = "DFF_msofbtChildAnchor"; break;
    case 0xF010:    pRecNm = "DFF_msofbtClientAnchor"; break;
    case 0xF011:    pRecNm = "DFF_msofbtClientData"; break;
    case 0xF11F:    pRecNm = "DFF_msofbtOleObject"; break;
    case 0xF11D:    pRecNm = "DFF_msofbtDeletedPspl"; break;
    case 0xF005:    pRecNm = "DFF_msofbtSolverContainer"; break;
    case 0xF012:    pRecNm = "DFF_msofbtConnectorRule"; break;
    case 0xF013:    pRecNm = "DFF_msofbtAlignRule"; break;
    case 0xF014:    pRecNm = "DFF_msofbtArcRule"; break;
    case 0xF015:    pRecNm = "DFF_msofbtClientRule"; break;
    case 0xF017:    pRecNm = "DFF_msofbtCalloutRule"; break;
    }

    *pOut << hex6 << nPos << indent1;
    if( pRecNm )
        *pOut << pRecNm;
    else
        *pOut << "Record:";
    *pOut << " Id: 0x" << hex << nFbt << " Instance: 0x" << nInst
          << " Version: 0x" << (UINT16)nVer << " Laenge: 0x" << nLength
          << dec << endl1;

    switch( nFbt )
    {
    case 0xf00b:        // DFF_msofbtOPT
        {
            UINT16 nId; UINT32 nOp, nStreamOffset = nInst * 6;
            BOOL bBid, bComplex;
            for( UINT16 n = 0; n < nInst; ++n )
            {
                if( !WW8ReadUINT16( *xTableStream, nId ) ||
                    !WW8ReadUINT32( *xTableStream, nOp ))
                    break;
                bBid = ( nId >> 14 ) & 1;
                bComplex = ( nId >> 15 ) & 1;
                nId &= 0x3fff;

                ::DumpEscherProp( nId, bBid, bComplex, nOp, nStreamOffset );
            }
        }
        break;

    case 0xF00d:        // DFF_msofbtClientTextbox
    case 0xF010:        // DFF_msofbtClientAnchor
    case 0xF011:        // DFF_msofbtClientData
        {
            UINT32 nData;
            if( 4 == nLength && WW8ReadUINT32( *xTableStream, nData ))
                *pOut << "      " << indent1 << " Data: "
                      << hex << nData << dec << endl1;
        }
        break;

    case 0xf00a:        // DFF_msofbtSp
        {
            UINT32 nId, nData;
            if( WW8ReadUINT32( *xTableStream, nId ) &&
                WW8ReadUINT32( *xTableStream, nData ))
            {
                *pOut << "      " << indent1 << " \""
                      << _GetShapeTypeNm( nInst )
                      << "\" Id: 0x" << hex << nId
                      << " Flags: 0x" << nData << dec << endl1;
            }
        }
        break;

    case 0xf009:        // DFF_msofbtSpgr
    case 0xf00f:        // DFF_msofbtChildAnchor
        {
            UINT32 nL, nT, nR, nB;
            if( WW8ReadUINT32( *xTableStream, nL ) &&
                WW8ReadUINT32( *xTableStream, nT ) &&
                WW8ReadUINT32( *xTableStream, nR ) &&
                WW8ReadUINT32( *xTableStream, nB ) )
            {
                *pOut << "      " << indent1 << " Rect: (L/T/R/B): " << dec
                      << nL << '/' << nT << '/' << nR << '/' << nB << endl;
            }
        }
        break;

    case 0xf006:    //ESCHER_Dgg
        {
            UINT32 spidMax,     // The current maximum shape ID
                   cidcl,       // The number of ID clusters (FIDCLs)
                   cspSaved,    // The total number of shapes saved
                                 // (including deleted shapes, if undo
                                 // information was saved)
                   cdgSaved;    // The total number of drawings saved

            if( WW8ReadUINT32( *xTableStream, spidMax ) &&
                WW8ReadUINT32( *xTableStream, cidcl ) &&
                WW8ReadUINT32( *xTableStream, cspSaved ) &&
                WW8ReadUINT32( *xTableStream, cdgSaved ))
            {
                *pOut << "      " << indent1 << " " << hex
                      << " spidMax: 0x" << spidMax
                      << " cidcl: 0x" << cidcl
                      << " cspSaved: 0x" << cspSaved
                      << " cdgSaved: 0x" << cdgSaved
                      << dec << endl1;


                UINT32 dgid,    // DG owning the SPIDs in this cluster
                          cspidCur;  // number of SPIDs used so far

                for( UINT32 n = 1; n < cidcl; ++n )
                {
                    if( !WW8ReadUINT32( *xTableStream, dgid ) ||
                        !WW8ReadUINT32( *xTableStream, cspidCur ))
                        break;

                    *pOut << "      " << indent1 << "  " << hex
                          << " dgid: 0x" << dgid
                          << " cspidCur: 0x" << cspidCur
                          << dec << endl1;
                }
            }
        }
        break;

    case 0xF016:    //ESCHER_CLSID
    case 0xF11A:    //ESCHER_ColorMRU
    case 0xF11E:    //ESCHER_SplitMenuColors
//  case 0xF001:    //ESCHER_BstoreContainer
    case 0xF007:    //ESCHER_BSE
    case 0xF018:    //ESCHER_BlipFirst
    case 0xF117:    //ESCHER_BlipLast
    case 0xF118:    //ESCHER_RegroupItems
    case 0xF120:    //ESCHER_ColorScheme
    case 0xF00C:    //ESCHER_Textbox
    case 0xF00E:    //ESCHER_Anchor
    case 0xF11F:    //ESCHER_OleObject
    case 0xF11D:    //ESCHER_DeletedPspl
    case 0xF005:    //ESCHER_SolverContainer
    case 0xF012:    //ESCHER_ConnectorRule
    case 0xF013:    //ESCHER_AlignRule
    case 0xF014:    //ESCHER_ArcRule
    case 0xF015:    //ESCHER_ClientRule
    case 0xF017:    //ESCHER_CalloutRule
    case 0xF119:    //ESCHER_Selection
    case 0xf008:    //ESCHER_Dg
        {
            int nCnt = 128;
            while( nLength )
            {
                if( 128 == nCnt || 16 == ++nCnt )
                {
                    if( 128 != nCnt )
                        *pOut << endl1;
                    *pOut << "      " << indent1 << " Data: ";
                    nCnt = 0;
                }

                static char __READONLY_DATA sHex[17] = { "0123456789abcdef" };
                BYTE c;
                *xTableStream >> c;
                *pOut << sHex[ ( c & 0xf0 ) >> 4 ] << sHex[ c & 0x0f ] << ' ';
                --nLength;
            }
            *pOut << dec << endl1;
        }
        break;
    }


}


void DumpEscherRecs( ULONG nPos, UINT32 nLength )
{
    begin( *pOut, *xTableStream ) << endl1;

    UINT16 nOldFbt = 0;
    ULONG nReadLen = 0;
    while( nReadLen < nLength )
    {
        UINT8 nVer;
        UINT16 nInst, nFbt;
        UINT32 nRecLen;

        if( !::ReadEsherRec( *xTableStream, nVer, nInst, nFbt, nRecLen ))
            break;

        if( !( 0xf000 <= nFbt && nFbt <= 0xf120 ))
        {
            xTableStream->Seek( nPos + nReadLen );
            unsigned char c;
            *xTableStream >> c;

            ++nReadLen;
            if( !::ReadEsherRec( *xTableStream, nVer, nInst, nFbt, nRecLen )
                || !( 0xf000 <= nFbt && nFbt <= 0xf120 ) )
                break;

            *pOut << hex6 << nPos + nReadLen - 1 << indent1
                    << "DummyChar: 0x" << hex << (int)c << dec << endl1;
        }

        ::DumpEscherRec( nPos + nReadLen, nVer, nInst,
                        nFbt, nRecLen );

        nReadLen += 2 * sizeof( UINT32 );
        switch( nFbt )
        {
        case 0xF000:
        case 0xF001:    //ESCHER_BstoreContainer
        case 0xF002:
        case 0xF003:
        case 0xF004:
            DumpEscherRecs( nPos + nReadLen, nRecLen );
            break;
        }

        nReadLen += nRecLen;
        xTableStream->Seek( nPos + nReadLen );
        nOldFbt = nFbt;
    }
    end( *pOut, *xTableStream ) << endl1;
}


void DumpDrawing()
{
    if( pWwFib->lcbDggInfo )
    {
        ULONG nOldPos = xTableStream->Tell(), nReadLen = 0;
        xTableStream->Seek( pWwFib->fcDggInfo );

        *pOut << endl << hex6 << pWwFib->fcDggInfo << dec2 <<  ' ' << indent1
              << begin1 << "Escher (DggInfo): Len: " << pWwFib->lcbDggInfo
              << endl1;

        ::DumpEscherRecs( pWwFib->fcDggInfo, (ULONG)pWwFib->lcbDggInfo );

        end( *pOut, *xTableStream ) << endl1 << endl1;
        xTableStream->Seek( nOldPos );
    }
}


//-----------------------------------------
//      Hilfroutinen fuer Styles
//-----------------------------------------

static short DumpStyleUPX( BYTE nVersion, short nLen, BOOL bPAP )
{
    short cbUPX;
    BOOL bEmpty;


    if( nLen <= 0 ){
        indent( *pOut, *xTableStream );
        *pOut << "very empty UPX." << ((bPAP) ? "papx " : "chpx ");
        *pOut << "Len:" << nLen << endl1;
        return nLen;
    }

    nLen -= WW8SkipOdd( &xTableStream );
    indent( *pOut, *xTableStream );

    xTableStream->Read( &cbUPX, 2 );
    nLen-=  2;

    if ( cbUPX > nLen )
    {
        *pOut << "!cbUPX auf nLen verkleinert! ";
        cbUPX = nLen;
    }

    bEmpty = ( cbUPX <= 0 ) || ( bPAP && ( cbUPX <= 2 ) );

    if ( bEmpty )
        *pOut << "empty ";
    else
        *pOut << begin1;

    *pOut << "UPX." << ((bPAP) ? "papx " : "chpx ");
    *pOut << "Len:" << nLen << " cbUPX:" << cbUPX << ' ';

    if( bPAP )
    {
        USHORT id;

        xTableStream->Read( &id, 2 );
        cbUPX-=  2;
        nLen-=  2;
        *pOut << "ID:" << id;
    }

    *pOut << endl1;

    ULONG nPos = xTableStream->Tell();              // falls etwas falsch interpretiert
                                        // wird, gehts danach wieder richtig
    DumpSprms( nVersion, *xTableStream, cbUPX );

    if ( xTableStream->Tell() != nPos + cbUPX ){
        *pOut << "!Um " << xTableStream->Tell() - nPos + cbUPX
             << " Bytes falsch positioniert!" << endl1;
        xTableStream->Seek( nPos+cbUPX );
    }

    nLen -= cbUPX;

    if ( !bEmpty )
        end( *pOut, *xTableStream ) << "UPX." << ((bPAP) ? "papx " : "chpx ") << endl1;

    return nLen;
}

static void DumpStyleGrupx( BYTE nVersion, short nLen, BOOL bPara )
{
    if( nLen <= 0 )
        return;
    nLen -= WW8SkipOdd( &xTableStream );

    begin( *pOut, *xTableStream ) << "Grupx, Len:" << nLen << endl1;

    if( bPara ) nLen = DumpStyleUPX( nVersion, nLen, TRUE );    // Grupx.Papx
    DumpStyleUPX( nVersion, nLen, FALSE );                                      // Grupx.Chpx

    end( *pOut, *xTableStream ) << "Grupx" << endl1;
}

static void PrintStyleId( USHORT nId )
{
    switch ( nId ){
    case 0xffe: *pOut << "User "; break;
    case 0xfff: *pOut << "Nil "; break;
    default:    *pOut <<  nId << ' '; break;
    }
}

//-----------------------------------------
//              Styles
//-----------------------------------------

void DStyle::Dump1Style( USHORT nNr )
{
    short nSkip, cbStd;
    BYTE* pStr;
    char c;
    indent( *pOut, *xTableStream );

    WW8_STD* pStd = Read1Style( nSkip, &pStr, &cbStd ); // lese Style

    if ( pStr ){                                    // echter Style
        *pOut << begin1;
        switch ( pStd->sgc ){
        case 1:  c = 'P'; break;
        case 2:  c = 'C'; break;
        default: c = '?'; break;
        }
        *pOut << c << "-Style Nr:" << nNr << ' ';
        *pOut << "ID:"; PrintStyleId( pStd->sti );
        *pOut << "BasedOn:"; PrintStyleId( pStd->istdBase );
        *pOut << "Next:" << pStd->istdNext << " Name:\"" << &pStr[1] << "\"";
        *pOut << endl1 << "                       ";
        *pOut << "cbStd:" << cbStd << ' ';
        *pOut << "No of Upx & Upe:" << pStd->cupx << ' ';
        *pOut << "bchUpe:" << pStd->bchUpe << ' ';
        *pOut << "nSkip:" << nSkip << endl1;
    }else{                                  // leerer Slot
        *pOut << "empty Slot Nr:" << nNr << endl1;
    }

    long nPos = xTableStream->Tell();               // falls etwas falsch interpretiert
                                        // wird, gehts danach wieder richtig

    if( pStd && ( pStd->sgc == 1 || pStd->sgc == 2 ) )
        DumpStyleGrupx( nVersion, nSkip, pStd->sgc == 1 );

    if ( pStr )                                 // echter Style
        end( *pOut, *xTableStream ) << c << "-Style" << endl1;

    xTableStream->Seek( nPos+nSkip );

    DELETEZ( pStr );
    DELETEZ( pStd );
}

void DStyle::Dump()
{
    *pOut << hex6 << nStyleStart << ' ' << dec2 << indent1;

    *pOut << begin1       << cstd << " Styles, ";
    *pOut << "Base:"      << cbSTDBaseInFile;
    *pOut << ", Written:" << (fStdStylenamesWritten) ? 'T' : 'F';
    *pOut << ", MaxSti:"  << stiMaxWhenSaved;
    *pOut << ", MaxFix:"  << istdMaxFixedWhenSaved;
    *pOut << ", BuildIn:" << nVerBuiltInNamesWhenSaved;
    *pOut << ", StdFnt:"  << ftcStandardChpStsh << endl1;

    USHORT i;
    for( i=0; i<cstd; i++ )
        Dump1Style( i );

    end( *pOut, *xTableStream ) << "Styles" << endl1 << endl1;
}

//-----------------------------------------
//              Main
//-----------------------------------------

//char cName [266];
//char cOutName [266];

int PrepareConvert( String& rName, String& rOutName, String& rMess )
{
#if 0
    if( argc < 2 ) {
        rMess += "Aufruf: Dump8 InFile [OutFile [StorFile] ] ";
        return 1;
    }else{
        strncpy( cName, *++argv, sizeof( cName )-5 );
    }
    if( !strchr( cName, '.' ) )
        strcat( cName, ".DOC" );

    if( argc >= 3 ){
        strncpy( cOutName, *++argv, sizeof( cOutName ) );
    }else{
        strncpy( cOutName, cName, sizeof( cOutName ) );
        char* p = strchr( cOutName, '.' );
        *p = 0;
        strcat( cOutName, ".DMP" );
    }
#endif
    if( access( rName.GetStr(), 0 ) ){
        rMess += "Kann ";
        rMess += rName;
        rMess += " nicht oeffnen";
        return 1;
    }

    pxStor = new SvStorageRef( new SvStorage( rName, STREAM_STD_READ ) );
    xStrm = (*pxStor)->OpenStream( String( "WordDocument" ), STREAM_STD_READ );

    if ( !xStrm.Is() /* || xStrm->GetError() */ ){
        rMess += "Kann StorageStream \"WordDocument\" in ";
        rMess += rName;
        rMess += " nicht zum Lesen oeffnen";
        DELETEZ( pxStor );
        return 1;
    }

    ULONG nL;
    if ( xStrm->Read( &nL, sizeof( nL ) ) == 0 ){
        rMess += "Kann aus StorageStream \"WordDocument\" in ";
        rMess += rName;
        rMess += " nicht Lesen";
        return 1;
    }
    xStrm->Seek( 0 );

    pOut = new fstream( rOutName, ios::out );
    if ( !pOut ){
        rMess += "Kann Ausgabedatei ";
        rMess += rOutName;
        rMess += " nicht zum Schreiben oeffnen";
        return 1;
    }

#if 0       // erstmal raus wg. Umstellung
    if( argc > 3 ) {
        char StorName[266];
        strncpy( StorName, *++argv, sizeof( StorName )-5 );

        if( !strchr( StorName, '.' ) )
            strcat( StorName, ".STO" );

        SvFileStream aStrm( StorName, STREAM_WRITE|STREAM_TRUNC );
        aStrm << *xStrm;

//      fstream aOut2( StorName, ios::out );
//      aOut2 << *xStrm;

        xStrm->Seek( 0 );
    }
#endif
    rMess += "Ausgabe von ";
    rMess += rName;
    rMess += " in Datei ";
    rMess += rOutName;
    rMess += "......";

    if ( xStrm->Read( &nL, sizeof( nL ) ) == 0 ){
        return 1;
    }
    xStrm->Seek( 0 );

    return 0;
}

int DoConvert( const String& rName, BYTE nVersion )
{
    ULONG nL;
    if ( xStrm->Read( &nL, sizeof( nL ) ) == 0 ){
        return 1;
    }
    xStrm->Seek( 0 );

    pWwFib = new DFib( *xStrm, nVersion );

    if ( pWwFib->nFibError )
        return 1;

#if 0
    *pOut << "Eingabe-Dateiname : \"" << cName << '"' << endl1;
    if ( cOutName[0] == 0 )
        *pOut << "Ausgabe auf \"cout\"" << endl1;
    else
        *pOut << "Ausgabe-Dateiname : \"" << cOutName << '"' << endl1;
    *pOut << endl1;
#endif


    // Nachdem wir nun den FIB eingelesen haben, wissen wir ja,
    // welcher Table-Stream gueltig ist.
    // Diesen oeffnen wir nun.

    switch( pWwFib->nVersion )  // 6 steht fuer "6 ODER 7",  7 steht fuer "NUR 7"
    {
    case 6:
    case 7:
            xTableStream = &xStrm;
            xDataStream = &xStrm;
                    break;
    case 8:
            xTableStream = (*pxStor)->OpenStream(
                        ( 1 == pWwFib->fWhichTblStm ) ? "1Table" : "0Table" ,
                        STREAM_STD_READ );
            xDataStream = (*pxStor)->OpenStream( "Data", STREAM_STD_READ | STREAM_NOCREATE );
            if( !xDataStream.Is() || SVSTREAM_OK != xDataStream->GetError() )
                xDataStream = &xStrm;
                    break;
    default:// Programm-Fehler!
                    /*
                        ACHTUNG: im FILTER nicht "FALSE" sondern "!this()" schreiben,
                                            da sonst Warning unter OS/2
                    */
                    ASSERT( FALSE, "Es wurde vergessen, nVersion zu kodieren!" );
                    return 1;
    }


    // dann erstmal den Dateinamen schreiben:
    *pOut << "Datei: " << rName.GetStr() << endl;

    pSBase = new WW8ScannerBase( &xStrm, &xTableStream, &xDataStream, pWwFib );

    // erstmal die Lowlevel-Funktionen

    ((DFib*)pWwFib)->Dump();                                                        // FIB
    DumpDop(  *pWwFib );                                                                                    // WW8_DOP

    if( ( 8 > pWwFib->nVersion && pWwFib->fComplex ) ||
        pWwFib->lcbClx )
        DumpPcd( pWwFib->nVersion, pWwFib->fcClx, pWwFib->lcbClx );

    DumpBookLow();

    DumpBookHigh();


    DumpPLCF( pWwFib->fcPlcfsed, pWwFib->lcbPlcfsed, SEP );             // SEPX

    DumpPLCF( pWwFib->fcPlcfbteChpx, pWwFib->lcbPlcfbteChpx, CHP ); // CHPX

    DumpPLCF( pWwFib->fcPlcfbtePapx, pWwFib->lcbPlcfbtePapx, PAP ); // PAPX

    {
        DStyle aStyle( *xTableStream, *pWwFib );                                        // Styles
        aStyle.Dump();
    }

    DumpFonts();                                                        // WW8_FFN

  // ... und jetzt die High-Level-Funktionen

    WW8_CP nStartCp = 0;

    DumpPlainText( nStartCp, pWwFib->ccpText, "Main" );
    *pOut << endl1;
    DumpField1( pWwFib->fcPlcffldMom, pWwFib->lcbPlcffldMom,
                "MainText Fields" );

    DumpHeader( pSBase );                                           // Header / Footer
    DumpField1( pWwFib->fcPlcffldHdr, pWwFib->lcbPlcffldHdr,
                "Header/Footer Fields" );

    DumpFootnotes( pSBase );
    DumpField1( pWwFib->fcPlcffldFtn, pWwFib->lcbPlcffldFtn,
                "Footnote Fields" );

    DumpEndnotes( pSBase );
    DumpField1( pWwFib->fcPlcffldEdn, pWwFib->lcbPlcffldEdn,
                "Endnote Fields" );

    DumpAnnotations( pSBase );

    DumpTextBoxs( pSBase );

    DumpField1( pWwFib->fcPlcffldTxbx, pWwFib->lcbPlcffldTxbx,
                "Textbox Fields" );
    DumpField1( pWwFib->fcPlcffldHdrTxbx, pWwFib->lcbPlcffldHdrTxbx,
                "Header/Footer Textbox Fields" );

    if( 8 == pWwFib->nVersion )
        DumpNumList();

    DumpFdoa( pSBase );

    if( pWwFib->lcbPlcfspaHdr || pWwFib->lcbPlcfspaMom )
        DumpDrawing();

    DELETEZ( pSBase );
    DELETEZ( pWwFib );
    return 0;
}

void DeInit()
{
//  DELETEZ( aWwStor );
    xStrm.Clear();
    DELETEZ( pxStor );
    DELETEZ( pOut );
}

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ww8/dump/dump8a.cxx,v 1.1.1.1 2000-09-18 17:14:59 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.15  2000/09/18 16:05:02  willem.vandorp
      OpenOffice header added.

      Revision 1.14  2000/02/14 14:39:35  jp
      #70473# changes for unicode

      Revision 1.13  2000/02/14 14:12:01  jp
      piece table is in the table stream

      Revision 1.12  2000/01/25 10:44:58  khz
      change: update the dumper according to import improvements

      Revision 1.11  1999/11/18 22:15:11  jp
      dump fields

      Revision 1.10  1999/11/18 22:09:53  jp
      dump fields

      Revision 1.9  1999/10/27 17:57:35  jp
      changes for tables

      Revision 1.8  1999/09/08 11:58:46  jp
      den neuen WW8Scanner benutzen

      Revision 1.7  1999/09/08 11:14:15  jp
      Escher dump verbessert


      Rev 1.5   16 Aug 1999 12:22:38   JP
   neu: Dump EscherObjects

      Rev 1.4   15 Jun 1999 14:19:18   JP
   new: ListTable and other Contents

      Rev 1.3   25 Jun 1998 16:29:52   KHZ
   doppelte Deklaration von FkpSizeTab in Define umgewandelt

      Rev 1.2   25 Jun 1998 15:43:46   KHZ
   Strukturaenderung fuer PAPX FKPs

      Rev 1.1   10 Jun 1998 17:22:38   KHZ
   Zwischenstand-Sicherung Dumper

      Rev 1.0   27 May 1998 15:29:26   KHZ
   Initial revision.

*************************************************************************/

diff --git a/sw/source/filter/ww8/dump/makefile.mk b/sw/source/filter/ww8/dump/makefile.mk
new file mode 100644
index 0000000..da4babc
--- /dev/null
+++ b/sw/source/filter/ww8/dump/makefile.mk
@@ -0,0 +1,179 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:59 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=.

PRJNAME=DUMP8
TARGET=dump8
VERSION=$(UPD)

# --- Settings ---------------------------------------------------

.INCLUDE :	svpre.mk
.INCLUDE :	settings.mk
.INCLUDE :	sv.mk

CXXFILES=	dump8.cxx dump8a.cxx ww8dout.cxx ww8darr.cxx ww8scan.cxx msvbasic.cxx

OBJFILES=	$(OBJ)$/dump8.obj $(OBJ)$/dump8a.obj $(OBJ)$/ww8dout.obj \
               $(OBJ)$/ww8darr.obj $(OBJ)$/ww8scan.obj $(OBJ)$/msvbasic.obj


.IF "$(depend)" == ""

CFLAGS+= -DDUMP

# --- DUMP8 EXE --------------------------------------------------------

# IENV=$(IENV);..\RES

APP1TARGET=$(PRJNAME)

# RESLIB1NAME=vu
# RESLIB1SRSFILES=$(SRS)$/main.srs

APP1LIBS=$(LIB1TARGET)

.IF "$(GUI)" == "WNT"
APP1STDLIBS= $(SVTOOLLIB) $(SVLLIB) $(TOOLSLIB) $(SVLIB) svmem.lib so2.lib
# irtl.lib
.IF "$(SO3)" == ""
APP1STDLIBS+= sdstor.lib
.ELSE
APP1STDLIBS+= sot.lib
.ENDIF
APP1STDLIBS+= ole32.lib oleaut32.lib uuid.lib shell32.lib advapi32.lib libci.lib msvcirt.lib
.ELSE
.IF "$(GUI)" == "OS2"
APP1STDLIBS=sdstor.lib so2.lib svtool.lib $(SVLIB) tools.lib svmem.lib svx.lib
.ELSE
APP1STDLIBS=svtool.lib tools.lib $(SVLIB) svmem.lib sdstor.lib so2.lib svx.lib
APP1STDLIBS+= ole2 compobj storage shell
.ENDIF
.ENDIF
.IF "$(GUI)"=="WNT"
APP1DEPN=	$(L)$/svtool.lib $(L)$/itools.lib $(SVLIBDEPEND) $(L)$/svmem.lib $(L)$/so2.lib
.ELSE
APP1DEPN=	$(L)$/svtool.lib $(L)$/tools.lib $(SVLIBDEPEND) $(L)$/svmem.lib $(L)$/so2.lib
.ENDIF
APP1OBJS=	$(OBJ)$/dump8.obj $(OBJ)$/dump8a.obj $(OBJ)$/ww8dout.obj \
               $(OBJ)$/ww8darr.obj $(OBJ)$/ww8scan.obj $(OBJ)/msvbasic.obj

APP1DEF=	$(MISC)$/$(PRJNAME).def
#APP1RES=	 $(RES)$/$(PRJNAME).res
#SRSFILES=	 $(SRS)$/main.srs

#-------------------------------------------------------------------------
#								Windows 3.x
#-------------------------------------------------------------------------

.IF "$(GUI)" == "WIN"

ALL: \
    ALLTAR

$(MISC)$/$(PRJNAME).def: makefile
    echo NAME		 VIEWER 										 >$@
    echo  DESCRIPTION	'StarView - Testprogramm'                    >>$@
    echo EXETYPE	 WINDOWS										 >>$@
    echo PROTMODE													 >>$@
    echo STUB		 'winSTUB.EXE'                                   >>$@
    echo CODE		 PRELOAD MOVEABLE DISCARDABLE					 >>$@
    echo DATA		 PRELOAD MULTIPLE MOVEABLE						 >>$@
    echo HEAPSIZE	 4096											 >>$@
    echo STACKSIZE	 30000											 >>$@

.ENDIF # GUI == WIN

#-------------------------------------------------------------------------
#										OS/2
#-------------------------------------------------------------------------

.IF "$(GUI)" == "OS2"

ALL: \
    $(SRS)$/main.srs \
    ALLTAR

$(MISC)$/$(PRJNAME).def: makefile
    echo NAME		 VIEWER WINDOWAPI								   >$@
    echo DESCRIPTION 'Storage Viewer (C)1995 STAR DIVISION GmbH'      >>$@
    echo EXETYPE	 OS2											  >>$@
    echo PROTMODE													  >>$@
    echo STUB		 'OS2STUB.EXE'                                    >>$@
    echo CODE		 LOADONCALL 									  >>$@
    echo DATA		 PRELOAD MULTIPLE								  >>$@
    echo HEAPSIZE	 4096											  >>$@
    echo STACKSIZE	 30000											  >>$@

.ENDIF # GUI == OS2

#-------------------------------------------------------------------------
#								Windows NT
#-------------------------------------------------------------------------

# --- Targets -----------------------------------------------------------

.ENDIF

.INCLUDE :	target.mk

diff --git a/sw/source/filter/ww8/dump/msvbasic.cxx b/sw/source/filter/ww8/dump/msvbasic.cxx
new file mode 100644
index 0000000..0808ac5
--- /dev/null
+++ b/sw/source/filter/ww8/dump/msvbasic.cxx
@@ -0,0 +1,598 @@
/*************************************************************************
 *
 *  $RCSfile: msvbasic.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:59 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/


#include <string.h>     // memset(), ...
#ifndef UNX
#include <io.h>         // access()
#endif

#ifndef _MSVBASIC_HXX
#include <msvbasic.hxx>
#endif

/* class VBA_Impl:
 * The VBA class provides a set of methods to handle Visual Basic For
 * Applications streams, the constructor is given the root ole2 stream
 * of the document, Open reads the VBA project file and figures out
 * the number of VBA streams, and the offset of the data within them.
 * Decompress decompresses a particular numbered stream, NoStreams returns
 * this number, and StreamName can give you the streams name. Decompress
 * will call Output when it has a 4096 byte collection of data to output,
 * and also with the final remainder of data if there is still some left
 * at the end of compression. Output is virtual to allow custom handling
 * of each chunk of decompressed data. So inherit from this to do something
 * useful with the data.
 *
 * cmc
 * */

BYTE VBA_Impl::ReadPString(SvStorageStreamRef &xVBAProject)
{
    UINT16 idlen;
    BYTE type=0;
    *xVBAProject >> idlen;
    BYTE out;
    int i=0;
    if (idlen < 6)
    {
        type=0;
        xVBAProject->SeekRel(-2);
        return(type);
    }

    for(i=0;i<idlen/2;i++)
    {
        *xVBAProject >> out;
        xVBAProject->SeekRel(1);
        if (i==2)
        {
            type=out;
            if ((type != 'G') && (type != 'C'))
                type=0;
            if (type == 0)
            {
                xVBAProject->SeekRel(-8);
                break;
            }
        }
    }


    return(type);
}

void VBA_Impl::ConfirmFixedOctect(SvStorageStreamRef &xVBAProject)
{
    static const BYTE stest[8] =
        {
        0x06, 0x02, 0x01, 0x00, 0x08, 0x02, 0x00, 0x00
        };

    BYTE test[8];
    xVBAProject->Read(test,8);
    if (memcmp(stest,test,8) != 0)
        DBG_WARNING("Found a different octect, please report");
}

void VBA_Impl::Confirm12Zeros(SvStorageStreamRef &xVBAProject)
{
    static const BYTE stest[12]={0};
    BYTE test[12];
    xVBAProject->Read(test,12);
    if (memcmp(stest,test,12) != 0)
        DBG_WARNING("Found a Non Zero block, please report");
}

void VBA_Impl::ConfirmHalfWayMarker(SvStorageStreamRef &xVBAProject)
{
    static const BYTE stest[12]={0,0,0,0,0,0,0,0,0,0,1,0};
    BYTE test[12];
    xVBAProject->Read(test,12);
    if (memcmp(stest,test,12) != 0)
        DBG_WARNING("Found a different halfway marker, please report");
}

void VBA_Impl::ConfirmFixedMiddle(SvStorageStreamRef &xVBAProject)
{
    static const BYTE stest[20] =
    {
        0x00, 0x00, 0xe1, 0x2e, 0x45, 0x0d, 0x8f, 0xe0,
        0x1a, 0x10, 0x85, 0x2e, 0x02, 0x60, 0x8c, 0x4d,
        0x0b, 0xb4, 0x00, 0x00
    };

    BYTE test[20];
    xVBAProject->Read(test,20);
    if (memcmp(stest,test,20) != 0)
    {
        DBG_WARNING("Found a different middle marker, please report");
        xVBAProject->SeekRel(-20);
    }
}

void VBA_Impl::ConfirmFixedMiddle2(SvStorageStreamRef &xVBAProject)
{
    static const BYTE stest[20] =
    {
        0x00, 0x00, 0x2e, 0xc9, 0x27, 0x8e, 0x64, 0x12,
        0x1c, 0x10, 0x8a, 0x2f, 0x04, 0x02, 0x24, 0x00,
        0x9c, 0x02, 0x00, 0x00
    };

    BYTE test[20];
    xVBAProject->Read(test,20);
    if (memcmp(stest,test,20) != 0)
        {
        DBG_WARNING("Found a different middle2 marker, please report");
        xVBAProject->SeekRel(-20);
        }
}


void VBA_Impl::Output( int nLen, const BYTE *pData)
{
    sVBAString += String( (const sal_Char *)pData, nLen );
/*
//For debugging purposes
    for(int i=0;i<len;i++)
        *pOut << data[i];
*/
}


int VBA_Impl::ReadVBAProject(const SvStorageRef &rxVBAStorage)
    {
    SvStorageStreamRef xVBAProject;
    xVBAProject = rxVBAStorage->OpenStream( "_VBA_PROJECT",
                    STREAM_STD_READ | STREAM_NOCREATE );

    if( !xVBAProject.Is() || SVSTREAM_OK != xVBAProject->GetError() )
    {
        DBG_WARNING("Not able to find vba project, cannot find macros");
        return(0);
    }
    xVBAProject->SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );

    //*pOut << hex;
    BYTE header[30] =
    {
        0xcc, 0x61, 0x5e, 0x00, 0x00, 0x01, 0x00, 0xff,
        0x07, 0x04, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00,
        0xe4, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x01, 0x00
    };
    BYTE headerin[30];

    xVBAProject->Read(headerin,30);
    if (memcmp(header,headerin,30) != 0)
        DBG_WARNING("Warning VBA header is different, please report");
    UINT16 value;
    *xVBAProject >> value;
    //*pOut << "Trigger value 1 is " << value << endl;
    UINT16 svalue;
    *xVBAProject >> svalue;
    if (svalue != 0x02)
        DBG_WARNING("Warning VBA number is different, please report");

    int count=0;
    BYTE testc=0;

    //*pOut << "Other strings after the middle are..." << endl;
    //There appears to be almost any number of strings acceptable
    //most begin with */G , and sometimes with
    //*/C. Those with G always have a trailer of 12 bytes, those
    //with C come in pairs, the first with no trailer, and the
    //second with one of 12 bytes. The following code attemts
    //to read these strings and ends when it reaches a sequence of
    //bytes which fails a test to be a valid string. So this
    //while loop here is the particular piece of code which is
    //very suspect and likely to be the cause of any crashes and
    //problems.
    while ((testc = ReadPString(xVBAProject)) != 0)
    {
        //*pOut << endl;
        //*pOut << "testcharacter is " << testc << endl;
        switch (testc)
        {
            case 'C':
                count++;
                if (count == 2)
                {
                    Confirm12Zeros(xVBAProject);
                    count=0;
                }
                break;
            default:
            case 'G':
                Confirm12Zeros(xVBAProject);
                break;
        }
    }

    //appears to be a fixed 20 byte sequence here, and then the strings
    //continue
    ConfirmFixedMiddle(xVBAProject);

    count=0;
    testc=0;

    while ((testc = ReadPString(xVBAProject)) != 0)
    {
        //*pOut << endl;
        //*pOut << "testcharacter is " << testc << endl;
        switch (testc)
        {
            case 'C':
                count++;
                if (count == 2)
                {
                    Confirm12Zeros(xVBAProject);
                    count=0;
                }
                break;
            default:
            case 'G':
                Confirm12Zeros(xVBAProject);
                break;
        }
    }

    //there *may* be another different 20byte fixed string
    ConfirmFixedMiddle2(xVBAProject);

    //*pOut << "testc is " << testc << endl;
    //*pOut << "position is " << xVBAProject->Tell() << endl;

    UINT16 nModules;
    *xVBAProject >> nModules;

    //begin section, this section isn't really 100% correct
    //*pOut << nModules << hex << " vba modules" << endl;
    xVBAProject->SeekRel(2*nModules);
    xVBAProject->SeekRel(4);
    //*pOut << "position is " << xVBAProject->Tell() << endl;
    ConfirmFixedOctect(xVBAProject);

    UINT16 junksize;
    while(junksize != 0xFFFF)
    {
        xVBAProject->Read(&junksize,2); // usually 18 02, sometimes 1e 02
        //but sometimes its a run of numbers until 0xffff, gagh!!!
        //*pOut << "position is " << xVBAProject->Tell() << "len is "
        //  << junksize << endl;
    }

    UINT16 ftest;
    *xVBAProject >> ftest;
    if (ftest != 0xFFFF)
        xVBAProject->SeekRel(ftest);
    *xVBAProject >> ftest;
    if (ftest != 0xFFFF)
        xVBAProject->SeekRel(ftest);

    xVBAProject->SeekRel(100);
    //*pOut << "position is " << xVBAProject->Tell() << endl;
    //end section


    *xVBAProject >> nOffsets;
    pOffsets = new VBAOffset_Impl[nOffsets];
    int i;
    for (i=0;i<nOffsets;i++)
        {
        BYTE discard;
        UINT16 len;
        *xVBAProject >> len;
        int j;
        for (j=0;j<len/2;j++)
            {
            *xVBAProject >> discard;
            pOffsets[i].sName += discard;
            *xVBAProject >> discard;
            }
        *xVBAProject >> len;
        xVBAProject->SeekRel(len);

        //begin section, another problem area
        *xVBAProject >> len;
        if (len == 0xFFFF)
        {
            xVBAProject->SeekRel(2);
            *xVBAProject >> len;
            xVBAProject->SeekRel(len);
        }
        else
            xVBAProject->SeekRel(len+2);
        //
        /* I have a theory that maybe you read a 16bit len, and
         * if it has 0x02 for the second byte then it is a special
         * token of its own that affects nothing else, otherwise
         * it is a len of the following data. C. I must test this
         * theory later.
         */
        //end section

        xVBAProject->SeekRel(8);
        BYTE no_of_octects;
        *xVBAProject >> no_of_octects;
        for(j=0;j<no_of_octects;j++)
            xVBAProject->SeekRel(8);
        xVBAProject->SeekRel(6);

        *xVBAProject >> pOffsets[i].nOffset;
        //*pOut << pOffsets[i].pName.GetStr() << " at 0x" << hex << pOffsets[i].nOffset << endl;
        xVBAProject->SeekRel(2);
        }

    //*pOut << endl;
    return(nOffsets);
    }

BOOL VBA_Impl::Open( const String &rToplevel,const String &rSublevel )
{
    /* beginning test for vba stuff */
    BOOL bRet = FALSE;
    SvStorageRef xMacros= xStor->OpenStorage(rToplevel);
    if( !xMacros.Is() || SVSTREAM_OK != xMacros->GetError() )
    {
        DBG_WARNING("No Macros Storage");
    }
    else
    {
        xVBA = xMacros->OpenStorage(rSublevel);
        if( !xVBA.Is() || SVSTREAM_OK != xVBA->GetError() )
        {
            DBG_WARNING("No Visual Basic in Storage");
        }
        else
        {
            if (ReadVBAProject(xVBA))
                bRet = TRUE;
        }
    }
    /* end test for vba stuff */
    return bRet;
}

const String &VBA_Impl::Decompress( UINT16 nIndex, int *pOverflow)
{
    SvStorageStreamRef xVBAStream;
    sVBAString.Erase();

    DBG_ASSERT( nIndex < nOffsets, "Index out of range" );
    xVBAStream = xVBA->OpenStream( pOffsets[nIndex].sName,
                        STREAM_STD_READ | STREAM_NOCREATE );
    if (pOverflow)
        *pOverflow=0;
    if( !xVBAStream.Is() || SVSTREAM_OK !=
        xVBAStream->GetError() )
    {
        DBG_WARNING("Not able to open vb module ");
        DBG_WARNING((pOffsets[nIndex].sName).GetStr());
    }
    else
    {
        xVBAStream->SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );
        DecompressVBA(nIndex,xVBAStream);
        /*
         * if len was too big for a single string set that variable ?
         *  if ((len > XX) && (pOverflow))
                *pOverflow=1;
         */
        if (bCommented)
        {
            String sTempStringa("\x0D\x0A");
            String sTempStringb("\x0D\x0ARem ");
            sVBAString.SearchAndReplaceAll(sTempStringa,sTempStringb);
            sVBAString.Insert("Rem ",0);
        }
    }
    return sVBAString;
}


int VBA_Impl::DecompressVBA( int nIndex, SvStorageStreamRef &xVBAStream )
{
    BYTE leadbyte;
    unsigned int pos = 0;

    //*pOut << "jumping to " << hex << offsets[nIndex].offset << endl;
    xVBAStream->Seek(pOffsets[nIndex].nOffset+3);

    int len;
    UINT16 token;
    int distance, shift, clean=1;

    while(xVBAStream->Read(&leadbyte,1))
        {
        //*pOut << "reading 8 data unit block beginning with " << leadbyte << int(leadbyte) << " at pos " << xVBAStream->Tell() << " real pos " << pos << endl;
        for(int position=0x01;position < 0x100;position=position<<1)
            {
            //we see if the leadbyte has flagged this location as a dataunit
            //which is actually a token which must be looked up in the history
            if (leadbyte & position)
                {
                *xVBAStream >> token;

                if (clean == 0)
                    clean=1;

                //For some reason the division of the token into the length
                //field of the data to be inserted, and the distance back into
                //the history differs depending on how full the history is
                int pos2 = pos%WINDOWLEN;
                if (pos2 <= 0x10)
                    shift = 12;
                else if (pos2 <= 0x20)
                    shift = 11;
                else if (pos2 <= 0x40)
                    shift = 10;
                else if (pos2 <= 0x80)
                    shift = 9;
                else if (pos2 <= 0x100)
                    shift = 8;
                else if (pos2 <= 0x200)
                    shift = 7;
                else if (pos2 <= 0x400)
                    shift = 6;
                else if (pos2 <= 0x800)
                    shift = 5;
                else
                    shift = 4;

                int i;
                len=0;
                for(i=0;i<shift;i++)
                    len |= token & (1<<i);

                //*pOut << endl << "match lookup token " << int(token) << "len " << int(len) << endl;

                len += 3;
                //*pOut << endl << "len is " << len << "shift is " << shift << endl;

                distance = token >> shift;
                //*pOut << "distance token shift is " << distance << " " << int(token) << " " << shift << "pos is " << pos << " " << xVBAStream->Tell() << endl;

                //read the len of data from the history, wrapping around the
                //WINDOWLEN boundary if necessary
                //data read from the history is also copied into the recent
                //part of the history as well.
                for (i = 0; i < len; i++)
                    {
                    unsigned char c;
                    //*pOut << endl << (pos%WINDOWLEN)-distance-1 << " " << pos << " " << distance << endl;
                    c = aHistory[(pos-distance-1)%WINDOWLEN];
                    aHistory[pos%WINDOWLEN] = c;
                    pos++;
                    //*pOut << "real pos is " << pos << endl;
                    //
                    //temp removed
                    //*pOut << c ;
                    }
                }
            else
                {
                // special boundary case code, not guarantueed to be correct
                // seems to work though, there is something wrong with the
                // compression scheme (or maybe a feature) where when
                // the data ends on a WINDOWLEN boundary and the excess
                // bytes in the 8 dataunit list are discarded, and not
                // interpreted as tokens or normal data.
                if ((pos != 0) && ((pos%WINDOWLEN) == 0) && (clean))
                    {
                    //*pOut << "at boundary position is " << position << " " << xVBAStream->Tell() << " pos is " << pos << endl;
                    //if (position != 0x01)
                    //*pOut << "must restart by eating remainder single byte data units" << endl;
                    xVBAStream->SeekRel(2);
                    clean=0;
                    Output(WINDOWLEN,aHistory);
                    break;
                    }
                //This is the normal case for when the data unit is not a
                //token to be looked up, but instead some normal data which
                //can be output, and placed in the history.
                if (xVBAStream->Read(&aHistory[pos%WINDOWLEN],1))
                {
                    pos++;
                    //temp removed
                    //*pOut << aHistory[pos++%WINDOWLEN];
                }
                if (clean == 0)
                    clean=1;
                //*pOut << "pos is " << pos << " " << xVBAStream->Tell() << endl;
                }
            }
        }
    if (pos%WINDOWLEN)
        Output(pos%WINDOWLEN,aHistory);
    return(pos);
}

/*************************************************************************

    Source Code Control System - Header

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ww8/dump/msvbasic.cxx,v 1.1.1.1 2000-09-18 17:14:59 hr Exp $

    Source Code Control System - Update

    $Log: not supported by cvs2svn $
    Revision 1.5  2000/09/18 16:05:03  willem.vandorp
    OpenOffice header added.

    Revision 1.4  2000/02/03 09:31:52  cmc
    #72268# Office 2000 compatibility bug fixed

    Revision 1.2  2000/01/26 16:40:15  cmc
    Made VBA Project stream reader more robust

    Revision 1.1  2000/01/26 12:34:58  jp
    #72268#: move form svdraw to here

    Revision 1.4  2000/01/25 16:12:21  rt
    #65293# includes unnecessary

    Revision 1.3  2000/01/25 11:17:42  cmc
    #72268# Visual Basic Decompression


*************************************************************************/
diff --git a/sw/source/filter/ww8/dump/msvbasic.hxx b/sw/source/filter/ww8/dump/msvbasic.hxx
new file mode 100644
index 0000000..83cdc51
--- /dev/null
+++ b/sw/source/filter/ww8/dump/msvbasic.hxx
@@ -0,0 +1,140 @@
/*************************************************************************
 *
 *  $RCSfile: msvbasic.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:59 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _MSVBASIC_HXX
#define _MSVBASIC_HXX

#ifdef _SOLAR_H
#include <tools/solar.h>
#endif
#ifndef _TOOLS_DEBUG_HXX
#include <tools/debug.hxx>
#endif
#ifndef _SVSTOR_HXX //autogen
#include <so3/svstor.hxx>
#endif


/* class VBA:
 * The VBA class provides a set of methods to handle Visual Basic For
 * Applications streams, the constructor is given the root ole2 stream
 * of the document, Open reads the VBA project file and figures out
 * the number of VBA streams, and the offset of the data within them.
 * Decompress decompresses a particular numbered stream, NoStreams returns
 * this number, and StreamName can give you the streams name. Decompress
 * will return a string with the decompressed data. The optional extra
 * argument will be set if not NULL to 1 in the case of a string overflow,
 * if I can figure out how to do that.
 *
 * Otherwise it is possible to inherit from VBA and implement a Output
 * member which gets called with each 4096 output sized block.
 *
 * cmc
 * */

#define WINDOWLEN 4096

class VBA_Impl
{
public:
        VBA_Impl( SvStorage &rIn, BOOL bCmmntd = TRUE )
            : xStor(&rIn), pOffsets(0), nOffsets(0), bCommented(bCmmntd)
            {}
        ~VBA_Impl() {if (nOffsets) delete [] pOffsets;}
        //0 for failure, 1 for success
        BOOL Open( const String &rToplevel, const String &rSublevel);
        const String & Decompress( UINT16 nIndex, int *pOverflow=0);
        UINT16 GetNoStreams() const                 { return nOffsets; }
        const String &GetStreamName( UINT16 nIndex ) const
            {
                DBG_ASSERT( nIndex < nOffsets, "Index out of range" );
                return pOffsets[ nIndex ].sName;
            }
        virtual void Output(int len,const BYTE *data);
private:
        struct VBAOffset_Impl
        {
            String sName;
            UINT32 nOffset;
        };

        SvStorageRef xVBA;
        String sVBAString;
        SvStorageRef xStor;
        VBAOffset_Impl *pOffsets;
        UINT16 nOffsets;
        BYTE aHistory[ WINDOWLEN ];
        BOOL bCommented;

        //0 for failure, anything else for success
        int ReadVBAProject(const SvStorageRef &rxVBAStorage);
        int DecompressVBA(int index, SvStorageStreamRef &rxVBAStream);
        void Confirm12Zeros(SvStorageStreamRef &xVBAProject);
        void ConfirmHalfWayMarker(SvStorageStreamRef &xVBAProject);
        void ConfirmFixedMiddle(SvStorageStreamRef &xVBAProject);
        void ConfirmFixedMiddle2(SvStorageStreamRef &xVBAProject);
        void ConfirmFixedOctect(SvStorageStreamRef &xVBAProject);
        BYTE ReadPString(SvStorageStreamRef &xVBAProject);
};




#endif
diff --git a/sw/source/filter/ww8/dump/ww8darr.cxx b/sw/source/filter/ww8/dump/ww8darr.cxx
new file mode 100644
index 0000000..3674b34
--- /dev/null
+++ b/sw/source/filter/ww8/dump/ww8darr.cxx
@@ -0,0 +1,615 @@
/*************************************************************************
 *
 *  $RCSfile: ww8darr.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:59 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include <stdlib.h>

#include "ww8dout.hxx"              // OutShort()
#include "ww8darr.hxx"




//-----------------------------------------



SprmDumpInfo aSprmDumpTab[] = {
    0, (FnOut)0, "NOP(0)",
    2, OutShort, "sprmPIstd",  // pap.istd (style code)
    3, (FnOut)0, "sprmPIstdPermute", // pap.istd    permutation
    4, OutByte,  "sprmPIncLv1", // pap.istddifference
    5, OutByte,  "sprmPJc", // pap.jc (justification)
    6, OutBool,  "sprmPFSideBySide", // pap.fSideBySide
    7, OutBool,  "sprmPFKeep", // pap.fKeep
    8, OutBool,  "sprmPFKeepFollow ", //    pap.fKeepFollow
    9, OutBool,  "sprmPPageBreakBefore", // pap.fPageBreakBefore

    10, (FnOut)0, "sprmPBrcl", //   pap.brcl
    11, (FnOut)0, "sprmPBrcp ", // pap.brcp
    12, (FnOut)0, "sprmPAnld", //   pap.anld (ANLD structure)
    13, OutByte,  "sprmPNLvlAnm", // pap.nLvlAnm nn
    14, OutBool,  "sprmPFNoLineNumb", //ap.fNoLnn

    //??
    15, OutTab,   "?sprmPChgTabsPapx", // pap.itbdMac, ...


    16, OutShort,  "sprmPDxaRight", // pap.dxaRight
    17, OutShort,  "sprmPDxaLeft", // pap.dxaLeft
    18, OutWord,  "sprmPNest", // pap.dxaLeft
    19, OutShort,  "sprmPDxaLeft1", // pap.dxaLeft1

    20, OutShorts, "sprmPDyaLine", // pap.lspd  an LSPD
    21, OutWord,  "sprmPDyaBefore", // pap.dyaBefore
    22, OutWord,  "sprmPDyaAfter", //   pap.dyaAfter


    //??
    23, (FnOut)0, "?sprmPChgTabs", // pap.itbdMac, pap.rgdxaTab, ...


    24, OutBool,  "sprmPFInTable", // pap.fInTable
    25, OutBool,  "sprmPTtp", // pap.fTtp
    26, OutWord,  "sprmPDxaAbs", // pap.dxaAbs
    27, OutWord,  "sprmPDyaAbs", // pap.dyaAbs
    28, OutWord, "sprmPDxaWidth", // pap.dxaWidth
    29, (FnOut)0, "sprmPPc", // pap.pcHorz, pap.pcVert

    30, (FnOut)0, "sprmPBrcTop10", // pap.brcTop BRC10
    31, (FnOut)0, "sprmPBrcLeft10", // pap.brcLeft BRC10
    32, (FnOut)0, "sprmPBrcBottom10", // pap.brcBottom BRC10
    33, (FnOut)0, "sprmPBrcRight10", // pap.brcRight BRC10
    34, (FnOut)0, "sprmPBrcBetween10", // pap.brcBetween BRC10
    35, (FnOut)0, "sprmPBrcBar10", // pap.brcBar BRC10
    36, OutWord, "sprmPFromText10", // pap.dxaFromText dxa
    37, (FnOut)0, "sprmPWr", // pap.wr wr
    38, OutWordHex, "sprmPBrcTop", // pap.brcTop BRC
    39, OutWordHex, "sprmPBrcLeft", // pap.brcLeft BRC

    40, OutWordHex, "sprmPBrcBottom", // pap.brcBottom BRC
    41, OutWordHex, "sprmPBrcRight", // pap.brcRight BRC
    42, (FnOut)0, "sprmPBrcBetween", // pap.brcBetween BRC
    43, (FnOut)0, "sprmPBrcBar",//pap.brcBar BRC word
    44, OutBool,  "sprmPFNoAutoHyph",//pap.fNoAutoHyph
    45, OutWord,  "sprmPWHeightAbs",//pap.wHeightAbs w
    46, (FnOut)0, "sprmPDcs",//pap.dcs DCS
    47, OutWordHex, "sprmPShd",//pap.shd SHD
    48, OutWord,  "sprmPDyaFromText",//pap.dyaFromText dya
    49, OutWord,  "sprmPDxaFromText",//pap.dxaFromText dxa

    50, OutBool,  "sprmPFLocked", // pap.fLocked 0 or 1 byte
    51, OutBool,  "sprmPFWidowControl", // pap.fWidowControl 0 or 1 byte


    //??
    52, (FnOut)0, "?sprmPRuler 52", //???


    65, OutBool,  "sprmCFStrikeRM", // chp.fRMarkDel 1 or 0 bit
    66, OutBool,  "sprmCFRMark", // chp.fRMark 1 or 0 bit
    67, OutBool,  "sprmCFFldVanish", // chp.fFldVanish 1 or 0 bit
    68, OutTab68, "sprmCPicLocation", // chp.fcPic and chp.fSpec
    69, OutShort, "sprmCIbstRMark", // chp.ibstRMark index into sttbRMark

    70, (FnOut)0, "sprmCDttmRMark", // chp.dttm DTTM long
    71, OutBool,  "sprmCFData", // chp.fData 1 or 0 bit
    72, OutShort, "sprmCRMReason", // chp.idslRMReason an index to a table
    73, (FnOut)0, "sprmCChse", // chp.fChsDiff and chp.chse see below 3 bytes
    74, (FnOut)0, "sprmCSymbol", // chp.fSpec, chp.chSym and chp.ftcSym
    75, OutBool,  "sprmCFOle2", // chp.fOle2 1 or 0 bit

    80, OutShort, "sprmCIstd", // chp.istd istd, see stylesheet definition short
    81, (FnOut)0, "sprmCIstdPermute", // chp.istd permutation vector (see below)
    82, (FnOut)0, "sprmCDefault", // whole CHP (see below) none variable length
    83, (FnOut)0, "sprmCPlain", // whole CHP (see below) none 0
    84, (FnOut)0, "??84",
    85, OutBool4, "sprmCFBold", // chp.fBold 0,1, 128, or 129 (see below) byte
    86, OutBool4, "sprmCFItalic", // chp.fItalic 0,1, 128, or 129 (see below) byte
    87, OutBool4, "sprmCFStrike", // chp.fStrike 0,1, 128, or 129 (see below) byte
    88, OutBool4, "sprmCFOutline", // chp.fOutline 0,1, 128, or 129 (see below) byte
    89, OutBool4, "sprmCFShadow", // chp.fShadow 0,1, 128, or 129 (see below) byte

    90, OutBool4, "sprmCFSmallCaps", // chp.fSmallCaps 0,1, 128, or 129 (see below) byte
    91, OutBool4, "sprmCFCaps", // chp.fCaps 0,1, 128, or 129 (see below) byte
    92, OutBool4, "sprmCFVanish", // chp.fVanish 0,1, 128, or 129 (see below) byte
    93, OutWord,  "sprmCFtc", // chp.ftc ftc word
    94, OutByte,  "sprmCKul", // chp.kul kul byte
    95, (FnOut)0, "sprmCSizePos", // chp.hps, chp.hpsPos (see below) 3 bytes
    96, OutWord,  "sprmCDxaSpace", // chp.dxaSpace dxa word
    97, OutWord,  "sprmCLid", // chp.lid LID word
    98, OutByte,  "sprmCIco", // chp.ico ico byte
    99, OutWord,  "sprmCHps", // chp.hps hps word!

    100, OutByte,  "sprmCHpsInc", // chp.hps (see below) byte
    101, OutWord,  "sprmCHpsPos", // chp.hpsPos hps byte
    102, OutByte,  "sprmCHpsPosAdj", // chp.hpsPos hps (see below) byte


    //??
    103, (FnOut)0, "?sprmCMajority", // chp.fBold, chp.fItalic, chp.fSmallCaps, ...


    104, OutByte,  "sprmCIss", // chp.iss iss byte
    105, (FnOut)0, "sprmCHpsNew50", // chp.hps hps variable width, length always recorded as 2
    106, (FnOut)0, "sprmCHpsInc1", // chp.hps complex (see below) variable width, length always recorded as 2
    107, OutShort, "sprmCHpsKern", // chp.hpsKern hps short
    108, (FnOut)0, "sprmCMajority50", // chp.fBold, chp.fItalic, chp.fSmallCaps, chp.fVanish, ...
    109, OutShort, "sprmCHpsMul", // chp.hps percentage to grow hps short

    110, OutShort, "sprmCCondHyhen", // chp.ysri ysri short
    117, OutBool,  "sprmCFSpec", // chp.fSpec  1 or 0 bit
    118, OutBool,  "sprmCFObj", // chp.fObj 1 or 0 bit
    119, (FnOut)0, "sprmPicBrcl", // pic.brcl brcl (see PIC structure definition) byte

    120,    (FnOut)0, "sprmPicScale", // pic.mx, pic.my, pic.dxaCropleft,
    121, (FnOut)0, "sprmPicBrcTop", // pic.brcTop BRC word
    122, (FnOut)0, "sprmPicBrcLeft", // pic.brcLeft BRC word
    123, (FnOut)0, "sprmPicBrcBottom", // pic.brcBottom BRC word
    124, (FnOut)0, "sprmPicBrcRight", // pic.brcRight BRC word
    131, OutByte,  "sprmSScnsPgn", // sep.cnsPgn cns byte
    132, (FnOut)0, "sprmSiHeadingPgn", // sep.iHeadingPgn heading number level byte
    133, (FnOut)0, "sprmSOlstAnm", // sep.olstAnm OLST variable length
    136, (FnOut)0, "sprmSDxaColWidth", // sep.rgdxaColWidthSpacing complex (see below) 3 bytes
    137, (FnOut)0, "sprmSDxaColSpacing", // sep.rgdxaColWidthSpacing complex (see below) 3 bytes
    138, OutBool,  "sprmSFEvenlySpaced", // sep.fEvenlySpaced 1 or 0 byte
    139, OutBool,  "sprmSFProtected", // sep.fUnlocked 1 or 0 byte

    140, OutWord,  "sprmSDmBinFirst", // sep.dmBinFirst  word
    141, OutWord,  "sprmSDmBinOther", // sep.dmBinOther  word
    142, OutByte,  "sprmSBkc", // sep.bkc bkc byte
    143, OutBool,  "sprmSFTitlePage", // sep.fTitlePage 0 or 1 byte
    144, OutWord,  "sprmSCcolumns", // sep.ccolM1 # of cols - 1 word
    145, OutWord,  "sprmSDxaColumns", // sep.dxaColumns dxa word
    146, (FnOut)0, "sprmSFAutoPgn", // sep.fAutoPgn obsolete byte
    147, OutByte,  "sprmSNfcPgn", // sep.nfcPgn nfc byte
    148, OutShort, "sprmSDyaPgn", // sep.dyaPgn dya short
    149, OutShort, "sprmSDxaPgn", // sep.dxaPgn dya short

    150, OutBool,  "sprmSFPgnRestart", // sep.fPgnRestart 0 or 1 byte
    151, OutBool,  "sprmSFEndnote", // sep.fEndnote 0 or 1 byte
    152, OutByte,  "sprmSLnc", // sep.lnc lnc byte
    153, (FnOut)0, "sprmSGprfIhdt", // sep.grpfIhdt grpfihdt (see Headers and Footers topic) byte
    154, OutWord,  "sprmSNLnnMod", // sep.nLnnMod non-neg int. word
    155, OutWord, "sprmSDxaLnn", // sep.dxaLnn dxa word
    156, OutWord,  "sprmSDyaHdrTop", // sep.dyaHdrTop dya word
    157, OutWord,  "sprmSDyaHdrBottom", // sep.dyaHdrBottom dya word
    158, OutBool,  "sprmSLBetween", // sep.fLBetween 0 or 1 byte
    159, OutByte,  "sprmSVjc", // sep.vjc vjc byte

    160, OutWord,  "sprmSLnnMin", // sep.lnnMin lnn word
    161, OutWord,  "sprmSPgnStart", // sep.pgnStart pgn word
    162, OutByte,  "sprmSBOrientation", // sep.dmOrientPage dm byte


    //??
    163, OutWord,  "?SprmSBCustomize 163", //???


    164, OutWord,  "sprmSXaPage", // sep.xaPage xa word
    165, OutWord,  "sprmSYaPage", // sep.yaPage ya word
    166, OutWord,  "sprmSDxaLeft", // sep.dxaLeft dxa word
    167, OutWord,  "sprmSDxaRight", // sep.dxaRight dxa word
    168, OutWord,  "sprmSDyaTop", // sep.dyaTop dya word
    169, OutWord,  "sprmSDyaBottom", // sep.dyaBottom dya word

    170, OutWord,  "sprmSDzaGutter", // sep.dzaGutter dza word
    171, OutWord,  "sprmSDMPaperReq", // sep.dmPaperReq dm word
    182, OutWord,  "sprmTJc", // tap.jc jc word (low order byte is significant)
    183, OutWord,  "sprmTDxaLeft", // tap.rgdxaCenter (see below) dxa word
    184, OutWord,  "sprmTDxaGapHalf", // tap.dxaGapHalf, tap.rgdxaCenter (see below) dxa word
    185, OutBool,  "sprmTFCantSplit", // tap.fCantSplit 1 or 0 byte
    186, OutBool,  "sprmTTableHeader", // tap.fTableHeader 1 or 0 byte
    187, OutWordsHex, "sprmTTableBorders", // tap.rgbrcTable complex(see below) 12 bytes
    188, (FnOut)0, "sprmTDefTable10", // tap.rgdxaCenter, tap.rgtc complex (see below) variable length
    189, OutShort,  "sprmTDyaRowHeight", // tap.dyaRowHeight dya word


    //??
    190, OutTab190, "sprmTDefTable", // tap.rgtc complex (see below)


    //??
    191, OutTab191, "sprmTDefTableShd", // tap.rgshd complex (see below)


    192, OutTab192, "sprmTTlp", // tap.tlp TLP 4 bytes
    193, (FnOut)0, "sprmTSetBrc", // tap.rgtc[].rgbrc complex (see below) 5 bytes
    194, (FnOut)0, "sprmTInsert", // tap.rgdxaCenter,tap.rgtc complex (see below) 4 bytes
    195, (FnOut)0, "sprmTDelete", // tap.rgdxaCenter, tap.rgtc complex (see below) word
    196, (FnOut)0, "sprmTDxaCol", // tap.rgdxaCenter complex (see below) 4 bytes
    197, (FnOut)0, "sprmTMerge", // tap.fFirstMerged, tap.fMerged complex (see below) word
    198, (FnOut)0, "sprmTSplit", // tap.fFirstMerged, tap.fMerged complex (see below) word
    199, (FnOut)0, "sprmTSetBrc10", // tap.rgtc[].rgbrc complex (see below) 5 bytes

    200, (FnOut)0, "sprmTSetShd", // tap.rgshd complex (see below) 4 bytes



    // ab hier Selbstdefinierte Ids

    256, (FnOut)0, "FootNote",
    257, (FnOut)0, "EndNote",
    258, (FnOut)0, "??258 selbstdef.",
    259, (FnOut)0, "??259 selbstdef.",
    260, (FnOut)0, "Field",

//- neue ab Ver8 ------------------------------------------------------------

    0x4600, OutShort,"sprmPIstd", // pap.istd;istd (style code);short;
    0xC601, (FnOut)0,"sprmPIstdPermute", // pap.istd;permutation vector (see below);variable length;
    0x2602, OutByte, "sprmPIncLvl", // pap.istd, pap.lvl;difference between istd of base PAP and istd of PAP to be produced (see below);byte;
    0x2403, OutByte, "sprmPJc", // pap.jc;jc (justification);byte;
    0x2404, OutByte, "sprmPFSideBySide", // pap.fSideBySide;0 or 1;byte;
    0x2405, OutByte, "sprmPFKeep", // pap.fKeep;0 or 1;byte;
    0x2406, OutByte, "sprmPFKeepFollow", // pap.fKeepFollow;0 or 1;byte;
    0x2407, OutByte, "sprmPFPageBreakBefore", // pap.fPageBreakBefore;0 or 1;byte;
    0x2408, OutByte, "sprmPBrcl", // pap.brcl;brcl;byte;
    0x2409, OutByte, "sprmPBrcp", // pap.brcp;brcp;byte;
    0x260A, OutByte, "sprmPIlvl", // pap.ilvl;ilvl;byte;
    0x460B, OutShort, "sprmPIlfo", // pap.ilfo;ilfo (list index) ;short;
    0x240C, OutByte, "sprmPFNoLineNumb", // pap.fNoLnn;0 or 1;byte;
    0xC60D, OutTab,  "sprmPChgTabsPapx", // pap.itbdMac, pap.rgdxaTab, pap.rgtbd;complex - see below;variable length
    0x840E, OutWord, "sprmPDxaRight", // pap.dxaRight;dxa;word;
    0x840F, OutWord, "sprmPDxaLeft", // pap.dxaLeft;dxa;word;
    0x4610, OutWord, "sprmPNest", // pap.dxaLeft;dxa-see below;word;
    0x8411, OutWord, "sprmPDxaLeft1", // pap.dxaLeft1;dxa;word;
    0x6412,OutLongHex,"sprmPDyaLine", // pap.lspd;an LSPD, a long word structure consisting of a short of dyaLine followed by a short of fMultLinespace - see below;long;
    0xA413, OutWord, "sprmPDyaBefore", // pap.dyaBefore;dya;word;
    0xA414, OutWord, "sprmPDyaAfter", // pap.dyaAfter;dya;word;
    0xC615, (FnOut)0,"sprmPChgTabs", // pap.itbdMac, pap.rgdxaTab, pap.rgtbd;complex - see below;variable length;
    0x2416, OutByte, "sprmPFInTable", // pap.fInTable;0 or 1;byte;
    0x2417, OutByte, "sprmPFTtp", // pap.fTtp;0 or 1;byte;
    0x8418, OutWord, "sprmPDxaAbs", // pap.dxaAbs;dxa;word;
    0x8419, OutWord, "sprmPDyaAbs", // pap.dyaAbs;dya;word;
    0x841A, OutWord, "sprmPDxaWidth", // pap.dxaWidth;dxa;word;
    0x261B, OutByte, "sprmPPc", // pap.pcHorz, pap.pcVert;complex - see below;byte;
    0x461C, OutWord, "sprmPBrcTop10", // pap.brcTop;BRC10;word;
    0x461D, OutWord, "sprmPBrcLeft10", // pap.brcLeft;BRC10;word;
    0x461E, OutWord, "sprmPBrcBottom10", // pap.brcBottom;BRC10;word;
    0x461F, OutWord, "sprmPBrcRight10", // pap.brcRight;BRC10;word;
    0x4620, OutWord, "sprmPBrcBetween10", // pap.brcBetween;BRC10;word;
    0x4621, OutWord, "sprmPBrcBar10", // pap.brcBar;BRC10;word;
    0x4622, OutWord, "sprmPDxaFromText10", // pap.dxaFromText;dxa;word;
    0x2423, OutByte, "sprmPWr", // pap.wr;wr (see description of PAP for definition;byte;
    0x6424,OutLongHex,"sprmPBrcTop", // pap.brcTop;BRC;long;
    0x6425,OutLongHex,"sprmPBrcLeft", // pap.brcLeft;BRC;long;
    0x6426,OutLongHex,"sprmPBrcBottom", // pap.brcBottom;BRC;long;
    0x6427,OutLongHex,"sprmPBrcRight", // pap.brcRight;BRC;long;
    0x6428,OutLongHex,"sprmPBrcBetween", // pap.brcBetween;BRC;long;
    0x6629,OutLongHex,"sprmPBrcBar", // pap.brcBar;BRC;long;
    0x242A, OutByte, "sprmPFNoAutoHyph", // pap.fNoAutoHyph;0 or 1;byte;
    0x442B, OutWord, "sprmPWHeightAbs", // pap.wHeightAbs;w;word;
    0x442C, OutShort,"sprmPDcs", // pap.dcs;DCS;short;
    0x442D, OutWord, "sprmPShd", // pap.shd;SHD;word;
    0x842E, OutWord, "sprmPDyaFromText", // pap.dyaFromText;dya;word;
    0x842F, OutWord, "sprmPDxaFromText", // pap.dxaFromText;dxa;word;
    0x2430, OutByte, "sprmPFLocked", // pap.fLocked;0 or 1;byte;
    0x2431, OutByte, "sprmPFWidowControl", // pap.fWidowControl;0 or 1;byte;
    0xC632, (FnOut)0,"sprmPRuler", // ;;variable length;
    0x2433, OutByte, "sprmPFKinsoku", // pap.fKinsoku;0 or 1;byte;
    0x2434, OutByte, "sprmPFWordWrap", // pap.fWordWrap;0 or 1;byte;
    0x2435, OutByte, "sprmPFOverflowPunct", // pap.fOverflowPunct;0 or 1;byte;
    0x2436, OutByte, "sprmPFTopLinePunct", // pap.fTopLinePunct;0 or 1;byte;
    0x2437, OutByte, "sprmPFAutoSpaceDE", // pap.fAutoSpaceDE;0 or 1;byte;
    0x2438, OutByte, "sprmPFAutoSpaceDN", // pap.fAutoSpaceDN;0 or 1;byte;
    0x4439, OutWord, "sprmPWAlignFont", // pap.wAlignFont;iFa (see description of PAP for definition);word;
    0x443A, OutWord, "sprmPFrameTextFlow", // pap.fVertical pap.fBackward pap.fRotateFont;complex (see description of PAP for definition);word;
    0x243B, OutByte, "sprmPISnapBaseLine", // obsolete: not applicable in Word97 and later versions;;byte;
    0xC63E, (FnOut)0,"sprmPAnld", // pap.anld;;variable length;
    0xC63F, (FnOut)0,"sprmPPropRMark", // pap.fPropRMark;complex (see below);variable length;
    0x2640, OutByte, "sprmPOutLvl", // pap.lvl;has no effect if pap.istd is < 1 or is > 9;byte;
    0x2441, OutByte, "sprmPFBiDi", // ;;byte;
    0x2443, OutBool, "sprmPFNumRMIns", // pap.fNumRMIns;1 or 0;bit;
    0x2444, OutByte, "sprmPCrLf", // ;;byte;
    0xC645, (FnOut)0,"sprmPNumRM", // pap.numrm;;variable length;
    0x6645,OutHugeHex,"sprmPHugePapx", // see below;fc in the data stream to locate the huge grpprl (see below);long;
    0x6646,OutHugeHex,"sprmPHugePapx", // see below;fc in the data stream to locate the huge grpprl (see below);long;
    0x2447, OutByte, "sprmPFUsePgsuSettings", // pap.fUsePgsuSettings;1 or 0;byte;
    0x2448, OutByte, "sprmPFAdjustRight", // pap.fAdjustRight;1 or 0;byte;
    0x0800, OutBool, "sprmCFRMarkDel", // chp.fRMarkDel;1 or 0;bit;
    0x0801, OutBool, "sprmCFRMark", // chp.fRMark;1 or 0;bit;
    0x0802, OutBool, "sprmCFFldVanish", // chp.fFldVanish;1 or 0;bit;
    0x6A03, OutTab68,"sprmCPicLocation", // chp.fcPic and chp.fSpec;see below;variable length, length recorded is always 4;
    0x4804, OutShort,"sprmCIbstRMark", // chp.ibstRMark;index into sttbRMark;short;
    0x6805,OutLongHex,"sprmCDttmRMark", // chp.dttmRMark;DTTM;long;
    0x0806, OutBool, "sprmCFData", // chp.fData;1 or 0;bit;
    0x4807, OutShort, "sprmCIdslRMark", // chp.idslRMReason;an index to a table of strings defined in Word 6.0 executables;short;
    0xEA08, (FnOut)0,"sprmCChs", // chp.fChsDiff and chp.chse;see below;3 bytes;
    0x6A09, (FnOut)0,"sprmCSymbol", // chp.fSpec, chp.xchSym and chp.ftcSym;see below;variable length, length recorded is always 4;
    0x080A, OutBool, "sprmCFOle2", // chp.fOle2;1 or 0;bit;
//0x480B, obsolete,"sprmCIdCharType", // obsolete: not applicable in Word97 and later versions;;;
    0x2A0C, OutByte, "sprmCHighlight", // chp.fHighlight, chp.icoHighlight;ico (fHighlight is set to 1 iff ico is not 0);byte;
    0x680E,OutLongHex,"sprmCObjLocation", // chp.fcObj;FC;long;
//0x2A10, ? ? ?  , "sprmCFFtcAsciSymb", // ;;;
    0x4A30, OutShort, "sprmCIstd", // chp.istd;istd, see stylesheet definition;short;
    0xCA31, (FnOut)0,"sprmCIstdPermute", // chp.istd;permutation vector (see below);variable length;
    0x2A32, (FnOut)0,"sprmCDefault", // whole CHP (see below);none;variable length;
    0x2A33, (FnOut)0,"sprmCPlain", // whole CHP (see below);none; Laenge: 0;
//0x2A34, ? ? ?, "sprmCKcd", // ;;;
    0x0835, OutByte, "sprmCFBold", // chp.fBold;0,1, 128, or 129 (see below);byte;
    0x0836, OutByte, "sprmCFItalic", // chp.fItalic;0,1, 128, or 129 (see below);byte;
    0x0837, OutByte, "sprmCFStrike", // chp.fStrike;0,1, 128, or 129 (see below);byte;
    0x0838, OutByte, "sprmCFOutline", // chp.fOutline;0,1, 128, or 129 (see below);byte;
    0x0839, OutByte, "sprmCFShadow", // chp.fShadow;0,1, 128, or 129 (see below);byte;
    0x083A, OutByte, "sprmCFSmallCaps", // chp.fSmallCaps;0,1, 128, or 129 (see below);byte;
    0x083B, OutByte, "sprmCFCaps", // chp.fCaps;0,1, 128, or 129 (see below);byte;
    0x083C, OutByte, "sprmCFVanish", // chp.fVanish;0,1, 128, or 129 (see below);byte;
    0x4A3D, OutWord, "sprmCFtcDefault", // ;ftc, only used internally, never stored in file;word;
    0x2A3E, OutByte, "sprmCKul", // chp.kul;kul;byte;
    0xEA3F, (FnOut)0,"sprmCSizePos", // chp.hps, chp.hpsPos;(see below);3 bytes;
    0x8840, OutWord, "sprmCDxaSpace", // chp.dxaSpace;dxa;word;
    0x4A41, OutWord, "sprmCLid", // ;only used internally never stored;word;
    0x2A42, OutByte, "sprmCIco", // chp.ico;ico;byte;
    0x4A43, OutWord, "sprmCHps", // chp.hps;hps;word;
    0x2A44, OutByte, "sprmCHpsInc", // chp.hps;(see below);byte;
    0x4845, OutByte, "sprmCHpsPos", // chp.hpsPos;hps;byte;
    0x2A46, OutByte, "sprmCHpsPosAdj", // chp.hpsPos;hps (see below);byte;
    0xCA47, (FnOut)0,"sprmCMajority", // chp.fBold, chp.fItalic, chp.fSmallCaps, chp.fVanish, chp.fStrike, chp.fCaps, chp.rgftc, chp.hps, chp.hpsPos, chp.kul, chp.dxaSpace, chp.ico, chp.rglid;complex (see below);variable length, length byte plus size of following grpprl;
    0x2A48, OutByte, "sprmCIss", // chp.iss;iss;byte;
    0xCA49, (FnOut)0,"sprmCHpsNew50", // chp.hps;hps;variable width, length always recorded as 2;
    0xCA4A, (FnOut)0,"sprmCHpsInc1", // chp.hps;complex (see below);variable width, length always recorded as 2;
    0x484B, OutShort,"sprmCHpsKern", // chp.hpsKern;hps;short;
    0xCA4C, (FnOut)0,"sprmCMajority50", // chp.fBold, chp.fItalic, chp.fSmallCaps, chp.fVanish, chp.fStrike, chp.fCaps, chp.ftc, chp.hps, chp.hpsPos, chp.kul, chp.dxaSpace, chp.ico,;complex (see below);variable length;
    0x4A4D, OutShort,"sprmCHpsMul", // chp.hps;percentage to grow hps;short;
    0x484E, OutShort,"sprmCYsri", // chp.ysri;ysri;short;
    0x4A4F, OutShort,"sprmCRgFtc0", // chp.rgftc[0];ftc for ASCII text (see below);short;
    0x4A50, OutShort,"sprmCRgFtc1", // chp.rgftc[1];ftc for Far East text (see below);short;
    0x4A51, OutShort,"sprmCRgFtc2", // chp.rgftc[2];ftc for non-Far East text (see below);short;
//0x4852, ? ? ?  , "sprmCCharScale", // ;;;
    0x2A53, OutByte, "sprmCFDStrike", // chp.fDStrike;;byte;
    0x0854, OutBool, "sprmCFImprint", // chp.fImprint;1 or 0;bit;
    0x0855, OutBool, "sprmCFSpec", // chp.fSpec ;1 or 0;bit;
    0x0856, OutBool, "sprmCFObj", // chp.fObj;1 or 0;bit;
    0xCA57, (FnOut)0,"sprmCPropRMark", // chp.fPropRMark, chp.ibstPropRMark, chp.dttmPropRMark;Complex (see below);variable length always recorded as 7 bytes;
    0x0858, OutBool, "sprmCFEmboss", // chp.fEmboss;1 or 0;bit;
    0x2859, OutByte, "sprmCSfxText", // chp.sfxtText;text animation;byte;
//0x085A, ? ? ?  , "sprmCFBiDi", // ;;;
//0x085B, ? ? ?  , "sprmCFDiacColor", // ;;;
//0x085C, ? ? ?  , "sprmCFBoldBi", // ;;;
//0x085D, ? ? ?  , "sprmCFItalicBi", // ;;;
//0x4A5E, ? ? ?  , "sprmCFtcBi", // ;;;
//0x485F, ? ? ?  , "sprmCLidBi", // ;;;
//0x4A60, ? ? ?  , "sprmCIcoBi", // ;;;
//0x4A61, ? ? ?  , "sprmCHpsBi", // ;;;
    0xCA62, (FnOut)0,"sprmCDispFldRMark", // chp.fDispFldRMark, chp.ibstDispFldRMark, chp.dttmDispFldRMark ;Complex (see below);variable length always recorded as 39 bytes;
    0x4863, OutShort,"sprmCIbstRMarkDel", // chp.ibstRMarkDel;index into sttbRMark;short;
    0x6864,OutLongHex,"sprmCDttmRMarkDel", // chp.dttmRMarkDel;DTTM;long;
    0x6865,OutLongHex,"sprmCBrc", // chp.brc;BRC;long;
    0x4866, OutShort,"sprmCShd", // chp.shd;SHD;short;
    0x4867, OutShort,"sprmCIdslRMarkDel", // chp.idslRMReasonDel;an index to a table of strings defined in Word 6.0 executables;short;
    0x0868, OutBool, "sprmCFUsePgsuSettings", // chp.fUsePgsuSettings;1 or 0;bit;
    0x486B, OutWord, "sprmCCpg", // ;;word;
    0x486D, OutWord, "sprmCRgLid0", // chp.rglid[0];LID: for non-Far East text;word;
    0x486E, OutWord, "sprmCRgLid1", // chp.rglid[1];LID: for Far East text;word;
    0x286F, OutByte, "sprmCIdctHint", // chp.idctHint;IDCT: (see below);byte;
    0x2E00, OutByte, "sprmPicBrcl", // pic.brcl;brcl (see PIC structure definition);byte;
    0xCE01, (FnOut)0,"sprmPicScale", // pic.mx, pic.my, pic.dxaCropleft, pic.dyaCropTop pic.dxaCropRight, pic.dyaCropBottom;Complex (see below);length byte plus 12 bytes;
    0x6C02,OutLongHex,"sprmPicBrcTop", // pic.brcTop;BRC;long;
    0x6C03,OutLongHex,"sprmPicBrcLeft", // pic.brcLeft;BRC;long;
    0x6C04,OutLongHex,"sprmPicBrcBottom", // pic.brcBottom;BRC;long;
    0x6C05,OutLongHex,"sprmPicBrcRight", // pic.brcRight;BRC;long;
    0x3000, OutByte, "sprmScnsPgn", // sep.cnsPgn;cns;byte;
    0x3001, OutByte, "sprmSiHeadingPgn", // sep.iHeadingPgn;heading number level;byte;
    0xD202, (FnOut)0,"sprmSOlstAnm", // sep.olstAnm;OLST;variable length;
    0xF203, (FnOut)0,"sprmSDxaColWidth", // sep.rgdxaColWidthSpacing;complex (see below);3 bytes;
    0xF204, (FnOut)0,"sprmSDxaColSpacing", // sep.rgdxaColWidthSpacing;complex (see below);3 bytes;
    0x3005, OutByte, "sprmSFEvenlySpaced", // sep.fEvenlySpaced;1 or 0;byte;
    0x3006, OutByte, "sprmSFProtected", // sep.fUnlocked;1 or 0;byte;
    0x5007, OutWord, "sprmSDmBinFirst", // sep.dmBinFirst;;word;
    0x5008, OutWord, "sprmSDmBinOther", // sep.dmBinOther;;word;
    0x3009, OutByte, "sprmSBkc", // sep.bkc;bkc;byte;
    0x300A, OutByte, "sprmSFTitlePage", // sep.fTitlePage;0 or 1;byte;
    0x500B, OutWord, "sprmSCcolumns", // sep.ccolM1;# of cols - 1;word;
    0x900C, OutWord, "sprmSDxaColumns", // sep.dxaColumns;dxa;word;
    0x300D, OutByte, "sprmSFAutoPgn", // sep.fAutoPgn;obsolete;byte;
    0x300E, OutByte, "sprmSNfcPgn", // sep.nfcPgn;nfc;byte;
    0xB00F, OutShort,"sprmSDyaPgn", // sep.dyaPgn;dya;short;
    0xB010, OutShort,"sprmSDxaPgn", // sep.dxaPgn;dya;short;
    0x3011, OutByte, "sprmSFPgnRestart", // sep.fPgnRestart;0 or 1;byte;
    0x3012, OutByte, "sprmSFEndnote", // sep.fEndnote;0 or 1;byte;
    0x3013, OutByte, "sprmSLnc", // sep.lnc;lnc;byte;
    0x3014, OutByte, "sprmSGprfIhdt", // sep.grpfIhdt;grpfihdt (see Headers and Footers topic);byte;
    0x5015, OutWord, "sprmSNLnnMod", // sep.nLnnMod;non-neg int.;word;
    0x9016, OutWord, "sprmSDxaLnn", // sep.dxaLnn;dxa;word;
    0xB017, OutWord, "sprmSDyaHdrTop", // sep.dyaHdrTop;dya;word;
    0xB018, OutWord, "sprmSDyaHdrBottom", // sep.dyaHdrBottom;dya;word;
    0x3019, OutByte, "sprmSLBetween", // sep.fLBetween;0 or 1;byte;
    0x301A, OutByte, "sprmSVjc", // sep.vjc;vjc;byte;
    0x501B, OutWord, "sprmSLnnMin", // sep.lnnMin;lnn;word;
    0x501C, OutWord, "sprmSPgnStart", // sep.pgnStart;pgn;word;
    0x301D, OutByte, "sprmSBOrientation", // sep.dmOrientPage;dm;byte;
//0x301E, ? ? ?  , "sprmSBCustomize", // ;;;
    0xB01F, OutWord, "sprmSXaPage", // sep.xaPage;xa;word;
    0xB020, OutWord, "sprmSYaPage", // sep.yaPage;ya;word;
    0xB021, OutWord, "sprmSDxaLeft", // sep.dxaLeft;dxa;word;
    0xB022, OutWord, "sprmSDxaRight", // sep.dxaRight;dxa;word;
    0x9023, OutWord, "sprmSDyaTop", // sep.dyaTop;dya;word;
    0x9024, OutWord, "sprmSDyaBottom", // sep.dyaBottom;dya;word;
    0xB025, OutWord, "sprmSDzaGutter", // sep.dzaGutter;dza;word;
    0x5026, OutWord, "sprmSDmPaperReq", // sep.dmPaperReq;dm;word;
    0xD227, (FnOut)0,"sprmSPropRMark", // sep.fPropRMark, sep.ibstPropRMark, sep.dttmPropRMark ;complex (see below);variable length always recorded as 7 bytes;
//0x3228, ? ? ?  , "sprmSFBiDi", // ;;;
//0x3229, ? ? ?  , "sprmSFFacingCol", // ;;;
//0x322A, ? ? ?  , "sprmSFRTLGutter", // ;;;
    0x702B,OutLongHex,"sprmSBrcTop", // sep.brcTop;BRC;long;
    0x702C,OutLongHex,"sprmSBrcLeft", // sep.brcLeft;BRC;long;
    0x702D,OutLongHex,"sprmSBrcBottom", // sep.brcBottom;BRC;long;
    0x702E,OutLongHex,"sprmSBrcRight", // sep.brcRight;BRC;long;
    0x522F, OutWord, "sprmSPgbProp", // sep.pgbProp;;word;
    0x7030,OutLongHex,"sprmSDxtCharSpace", // sep.dxtCharSpace;dxt;long;
    0x9031,OutLongHex,"sprmSDyaLinePitch", // sep.dyaLinePitch;dya;long;
//0x5032, ? ? ?  , "sprmSClm", // ;;;
    0x5033, OutShort,"sprmSTextFlow", // sep.wTextFlow;complex (see below);short;
    0x5400, OutWord, "sprmTJc", // tap.jc;jc;word (low order byte is significant);
    0x9601, OutWord, "sprmTDxaLeft", // tap.rgdxaCenter (see below);dxa;word;
    0x9602, OutWord, "sprmTDxaGapHalf", // tap.dxaGapHalf, tap.rgdxaCenter (see below);dxa;word;
    0x3403, OutByte, "sprmTFCantSplit", // tap.fCantSplit;1 or 0;byte;
    0x3404, OutByte, "sprmTTableHeader", // tap.fTableHeader;1 or 0;byte;
    0xD605, (FnOut)0,"sprmTTableBorders", // tap.rgbrcTable;complex(see below);24 bytes;
    0xD606, (FnOut)0,"sprmTDefTable10", // tap.rgdxaCenter, tap.rgtc;complex (see below);variable length;
    0x9407, OutShort, "sprmTDyaRowHeight", // tap.dyaRowHeight;dya;word;
    0xD608, OutTabD608,"sprmTDefTable", // tap.rgtc;complex (see below);;
    0xD609, OutTabD609,"sprmTDefTableShd", // tap.rgshd;complex (see below);;
    0x740A, (FnOut)0,"sprmTTlp", // tap.tlp;TLP;4 bytes;
//0x560B, ? ? ?  , "sprmTFBiDi", // ;;;
//0x740C, ? ? ?  , "sprmTHTMLProps", // ;;;
    0xD620, (FnOut)0,"sprmTSetBrc", // tap.rgtc[].rgbrc;complex (see below);5 bytes;
    0x7621, (FnOut)0,"sprmTInsert", // tap.rgdxaCenter, tap.rgtc;complex (see below);4 bytes;
    0x5622, OutWord, "sprmTDelete", // tap.rgdxaCenter, tap.rgtc;complex (see below);word;
    0x7623, (FnOut)0,"sprmTDxaCol", // tap.rgdxaCenter;complex (see below);4 bytes;
    0x5624, OutWord, "sprmTMerge", // tap.fFirstMerged, tap.fMerged;complex (see below);word;
    0x5625, OutWord, "sprmTSplit", // tap.fFirstMerged, tap.fMerged;complex (see below);word;
    0xD626, (FnOut)0,"sprmTSetBrc10", // tap.rgtc[].rgbrc;complex (see below);5 bytes;
    0x7627, (FnOut)0,"sprmTSetShd", // tap.rgshd;complex (see below);4 bytes;
    0x7628, (FnOut)0,"sprmTSetShdOdd", // tap.rgshd;complex (see below);4 bytes;
    0x7629, OutWord, "sprmTTextFlow", // tap.rgtc[].fVerticaltap.rgtc[].fBackwardtap.rgtc[].fRotateFont;0 or 10 or 10 or 1;word;
//0xD62A, ? ? ?  , "sprmTDiagLine", // ;;;
    0xD62B, (FnOut)0,"sprmTVertMerge", // tap.rgtc[].vertMerge;complex (see below);variable length always recorded as 2 bytes;
    0xD62C, (FnOut)0,"sprmTVertAlign", // tap.rgtc[].vertAlign;complex (see below);variable length always recorded as 3 byte;
};


static int
#if defined( WNT )
 __cdecl
#endif
#if defined( ICC )
 _Optlink
#endif
    CompSprmDumpId( const void *pFirst, const void *pSecond)
{
    return( ((SprmDumpInfo*)pFirst )->nId - ((SprmDumpInfo*)pSecond)->nId );
}


SprmDumpInfo& WW8GetSprmDumpInfo( USHORT nId )
{
    // ggfs. Tab sortieren
    static BOOL bInit = FALSE;
    if( !bInit )
    {
        qsort( (void*)aSprmDumpTab,
            sizeof( aSprmDumpTab      ) / sizeof (aSprmDumpTab[ 0 ]),
            sizeof( aSprmDumpTab[ 0 ] ),
            CompSprmDumpId );
        bInit = TRUE;
    }
    // Sprm heraussuchen
    void* pFound;
    SprmDumpInfo aSrch;
    aSrch.nId = nId;
    if( 0 == ( pFound = bsearch( (char *) &aSrch,
                        (void*) aSprmDumpTab,
                        sizeof( aSprmDumpTab      ) / sizeof (aSprmDumpTab[ 0 ]),
                        sizeof( aSprmDumpTab[ 0 ] ),
                        CompSprmDumpId )))
    {
        // im Fehlerfall auf Nulltes Element verweisen
        pFound = (void*)aSprmDumpTab;
    }
    return *(SprmDumpInfo*) pFound;
}





/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ww8/dump/ww8darr.cxx,v 1.1.1.1 2000-09-18 17:14:59 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.8  2000/09/18 16:05:03  willem.vandorp
      OpenOffice header added.

      Revision 1.7  1999/10/28 20:35:11  jp
      write table shading vakues

      Revision 1.6  1999/10/28 18:13:47  jp
      write table height as short

      Revision 1.5  1999/10/27 17:57:53  jp
      changes for tables

      Revision 1.4  1999/08/16 10:22:38  JP
      neu: Dump EscherObjects


      Rev 1.3   16 Aug 1999 12:22:38   JP
   neu: Dump EscherObjects

      Rev 1.2   15 Jun 1999 14:12:36   JP
   new: ListTable and other Contents

      Rev 1.1   10 Jun 1998 17:22:32   KHZ
   Zwischenstand-Sicherung Dumper

      Rev 1.0   27 May 1998 15:30:10   KHZ
   Initial revision.


*************************************************************************/


diff --git a/sw/source/filter/ww8/dump/ww8darr.hxx b/sw/source/filter/ww8/dump/ww8darr.hxx
new file mode 100644
index 0000000..67c22e4
--- /dev/null
+++ b/sw/source/filter/ww8/dump/ww8darr.hxx
@@ -0,0 +1,77 @@
/*************************************************************************
 *
 *  $RCSfile: ww8darr.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:59 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _WW8DARR_HXX
#define _WW8DARR_HXX

typedef void (*FnOut)( SvStream& rSt, short );

struct SprmDumpInfo
{
    USHORT nId;
    FnOut  pOutFnc;
    char*  pName;
};

SprmDumpInfo& WW8GetSprmDumpInfo( USHORT nId );


#endif
diff --git a/sw/source/filter/ww8/dump/ww8dout.cxx b/sw/source/filter/ww8/dump/ww8dout.cxx
new file mode 100644
index 0000000..48eef00
--- /dev/null
+++ b/sw/source/filter/ww8/dump/ww8dout.cxx
@@ -0,0 +1,499 @@
/*************************************************************************
 *
 *  $RCSfile: ww8dout.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:59 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include <stdio.h>          // getchar

//#include "defs.hxx"
#include <tools/solar.h>            // BYTE
//#include "wwscan.hxx" // aWwStor
#include "ww8dout.hxx"

#ifndef _STREAM_HXX //autogen
#include <tools/stream.hxx>
#endif

#ifndef _SVSTOR_HXX //autogen
#include <so3/svstor.hxx>
#endif

extern SvStorageStreamRef xStrm;
extern SvStorageStreamRef xTableStream;
extern SvStorageStreamRef xDataStream;  // ist bei Ver6-7 mit xStrm identisch,
void DumpSprms( BYTE nVersion, SvStream& rSt, short nLen );

ostream* pOut = 0;

#define DumpVer8

//-----------------------------------------
//          Streams
//-----------------------------------------


static int level = 0;
static long lastpos = -1;

ostream& __cdecl endl1( ostream& s ){
//ostream& endl1( ostream& s ) {
    s << endl;
    return s;
}

ostream&  __cdecl hex2( ostream& s ) {
    s.width( 2 ); s.fill( (const char)250 );
    s << hex;
    return s;
}

ostream&  __cdecl hex4( ostream& s ) {
    s.width( 4 ); s.fill( (const char)250 );
    s << hex ;
    return s;
}

ostream&  __cdecl hex6( ostream& s ) {
    s.width( 6 ); s.fill( (const char)250 );
    s << hex ;
    return s;
}

ostream&  __cdecl hex8( ostream& s ) {
    s.width( 8 ); s.fill( (const char)250 );
    s << hex ;
    return s;
}

ostream&  __cdecl dec2( ostream& s ) {
    s << dec;
    s.width( 0 ); s.fill( 0 );
    return s;
}

ostream&  __cdecl filepos( ostream& s, SvStream& rSt ) {
    register long pos = rSt.Tell();

    if ( pos != lastpos ){
#ifndef DumpVer8
        if( &rSt == &xStrm )
            s << "D";
        else
            s << "T";
#endif
        s.width( 6 );
        s.fill( (const char)250 );
        s << hex << pos << dec << ' ';
        s.width( 0 ); s.fill( 0 );
        lastpos = pos;
    }else{
#ifndef DumpVer8
        s << "        ";
#else
        s << "       ";
#endif
    }
    return s;
}

ostream&  __cdecl indent( ostream& s, SvStream& rSt ) {
    filepos( s, rSt );
    for( int i = 0; i < level; i++ ) s << "  ";
    return s;
}

ostream&  __cdecl indent1( ostream& s ) {
    for( int i = 0; i < level; i++ ) s << "  ";
    return s;
}

ostream&  __cdecl indent2( ostream& s ) {
#ifndef DumpVer8
    s << "        " << indent1;
#else
    s << "       " << indent1;
#endif
    return s;
}

ostream&  __cdecl begin( ostream& s, SvStream& rSt  ) { indent( s, rSt ) << "BEGIN "; level++; return s; }

// begin1 ohne indent
ostream&  __cdecl begin1( ostream& s ) { s << "BEGIN "; level++; return s; }

// begin2 ohne Nummer
ostream&  __cdecl begin2( ostream& s ) { s << indent2 << "BEGIN "; level++; return s; }

ostream&  __cdecl end( ostream& s, SvStream& rSt  ) { level--; return indent( s, rSt ) << "END "; }

// end1 ohne filepos
ostream&  __cdecl end1( ostream& s ) { level--; return s << indent1 << "END "; }

// end2 ohne Nummer
ostream&  __cdecl end2( ostream& s ) { level--; return s << indent2 << "END "; }

//-----------------------------------------
//          Ausgabe-Funktionen
//-----------------------------------------

void OutBool( SvStream& rSt, short )
{
    BYTE nPara;

    rSt.Read( &nPara, sizeof( nPara ) );
    switch( nPara ){
    case 0:  *pOut << "F"; break;
    case 1:  *pOut << "T"; break;
    default: *pOut << "ERROR:" << (USHORT)nPara; break;
    }
}

void OutBool4( SvStream& rSt, short )
{
    BYTE nPara;

    rSt.Read( &nPara, sizeof( nPara ) );
    switch( nPara ){
    case 0:   *pOut << "F"; break;
    case 1:   *pOut << "T"; break;
    case 128: *pOut << "==Style"; break;
    case 129: *pOut << "!=Style"; break;
    default:  *pOut << "ERROR:" << (USHORT)nPara; break;
    }
}

void OutByte( SvStream& rSt, short )
{
    BYTE nPara;

    rSt.Read( &nPara, sizeof( nPara ) );
    *pOut << (USHORT)nPara;
}

void OutShort( SvStream& rSt, short )
{
    short nPara;

    rSt.Read( &nPara, sizeof( nPara ) );
    *pOut << nPara;
}

void OutShorts( SvStream& rSt, short nLen )
{
    INT16 nPara;

    for( short i = 0; i < nLen / 2; i++ ){
        rSt.Read( &nPara, sizeof( nPara ) );
        *pOut << nPara << ' ';
    }
}

void OutWord( SvStream& rSt, short )
{
    USHORT nPara;

    rSt.Read( &nPara, sizeof( nPara ) );
    *pOut << nPara;
}

void OutWords( SvStream& rSt, short nLen )
{
    USHORT nPara;

    for( short i = 0; i < nLen / 2; i++ ){
        rSt.Read( &nPara, sizeof( nPara ) );
        *pOut << nPara;
    }
}

void OutWordHex( SvStream& rSt, short )
{
    USHORT nPara;

    rSt.Read( &nPara, sizeof( nPara ) );
    *pOut << "0x" << hex4 << nPara << dec;
}

void OutWordsHex( SvStream& rSt, short nLen )
{
    USHORT nPara;
    nLen /= sizeof( nPara );
    for( short i = 0; i < nLen; i++ ){
        rSt.Read( &nPara, sizeof( nPara ) );
        *pOut << "0x" << hex4 << nPara << dec;
        if( i < nLen - 1 )
            *pOut << ' ';
    }
}

void OutLongsHex( SvStream& rSt, short nLen )
{
    long nPara;
    nLen /= sizeof( nPara );
    for( short i = 0; i < nLen; i++ )
    {
        rSt.Read( &nPara, sizeof( nPara ) );
        *pOut << "0x" << hex8 << nPara << dec;
        if( i < nLen - 1 )
            *pOut << ' ';
    }
}

void OutLongHex( SvStream& rSt, short )
{
    ULONG nPara;

    rSt.Read( &nPara, sizeof( nPara ) );
    *pOut << "0x" << hex8 << nPara << dec;
}

void OutTab68( SvStream& rSt, short )
{
    ULONG nPara;

    rSt.Read( &nPara, sizeof( nPara ) );
    if(  nPara == 0 )
        *pOut << "None";
    else
        *pOut << "0x" << hex8 << nPara << dec;
}


void OutTab( SvStream& rSt, short )
{
    BYTE nDel, nIns, nType;
    short nPos, i;

    rSt.Read( &nDel, sizeof( nDel ) );
    *pOut << "Del " << (USHORT)nDel;
    if ( nDel ) *pOut << ": ";
    else        *pOut << ", ";

    for( i=1; i<=nDel; i++){
        rSt.Read( &nPos, sizeof( nPos ) );
        *pOut << nPos;
        if( i<nDel ) *pOut << ',';
        else *pOut << ' ';
    }
    rSt.Read( &nIns, sizeof( nIns ) );
    *pOut << "Ins " << (USHORT)nIns;
    if ( nIns ) *pOut << ": ";

    for( i=1; i<=nIns; i++){
        rSt.Read( &nPos, sizeof( nPos ) );
        *pOut << nPos;
        if( i<nIns ) *pOut << ',';
        else *pOut << ' ';
    }
    if ( nIns ) *pOut << "Typ: ";

    for( i=1; i<=nIns; i++){
        rSt.Read( &nType, sizeof( nType ) );
        *pOut << (USHORT)nType;
        if( i<nIns ) *pOut << ',';
        else *pOut << ' ';
    }

//  nSiz = 1 + 2 * nDel + 1 + nIns * 3; // genaue Laenge,
//      stimmt auch bei Laenge > 256
//  bei diesem Tab-Befehl anscheinend nicht noetig
}

void OutTab190( SvStream& rSt, short nLen )
{
    BYTE nCols;
    rSt.Read( &nCols, sizeof( nCols ) );
    *pOut << (USHORT)nCols << " Cols: ";

    short nPos, i;
    for( i = 0; i <= nCols; i++ ){
        rSt.Read( &nPos, sizeof( nPos ) );
        *pOut << nPos;
        if( i < nCols )
            *pOut << ", ";
    }
    *pOut << dec << "; ";
    for( i = 0; i < nCols; i++ ){
        *pOut << "Col " << i << " TC: ";
        OutWordsHex( rSt, 10 );
        if( i < nCols - 1 )
            *pOut << "; ";
    }
}

void OutTab191( SvStream& rSt, short nLen )
{
    BYTE nCols;
    rSt.Read( &nCols, sizeof( nCols ) );
    *pOut << (USHORT)nCols << " Cols, SHDs: ";
    OutWordsHex( rSt, ( nCols + 1 ) * 2 );
}

void OutTab192( SvStream& rSt, short )
{
    OutWord(    rSt, 0 );
    OutWordHex( rSt, 0 );
}

void OutHugeHex( SvStream& rSt, short nLen )
{
    long nPos;
    rSt.Read( &nPos, sizeof( nPos ) );

    long nCurr = xDataStream->Tell();
    xDataStream->Seek( nPos );

    xDataStream->Read( &nLen, sizeof( nLen ) );

//  *pOut << ", Len max: " << nLen << ", ID:" << nIStd << endl1;
    *pOut << endl1;
    DumpSprms( 8, *xDataStream, nLen );

    xDataStream->Seek( nCurr );
}

void OutTabD608( SvStream& rSt, short nLen )
{
    BYTE nHi, nCols;
    rSt.Read( &nHi, sizeof( nHi ) );
//  nLen += ((short)nHi) << 8;

    rSt.Read( &nCols, sizeof( nCols ) );
    *pOut << " Cols: " << (short)nCols << ' ' << endl1 << indent2;

    short nPos, i;
    for( i = 0; i <= nCols; ++i )
    {
        rSt.Read( &nPos, sizeof( nPos ) );
        *pOut << nPos;
        if( i < nCols )
            *pOut << ", ";
    }
    nLen -= ( nCols + 1 ) * 2;
    nLen /= 20;

    for( i = 0; i < nLen; ++i )
    {
        *pOut << endl1 << indent2 << "Col " << i << " TC: ";
        OutLongsHex( rSt, 20 );
        if( i < nLen - 1 )
            *pOut << "; ";
    }
}

void OutTabD609( SvStream& rSt, short nLen )
{
    *pOut << " Brush(FBS): ";
    for( short i = 0; i < nLen / 2; ++i )
    {
        UINT16 nVal;
        rSt.Read( &nVal, sizeof( nVal ) );
        *pOut << (nVal & 0x1f);
        *pOut << "|" << ((nVal >> 5) & 0x1f);
        *pOut << "|" << ((nVal >> 10) & 0x3f);
        if( i < nLen )
            *pOut << ", ";
    }
}


/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ww8/dump/ww8dout.cxx,v 1.1.1.1 2000-09-18 17:14:59 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.9  2000/09/18 16:05:03  willem.vandorp
      OpenOffice header added.

      Revision 1.8  2000/02/11 14:39:38  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.7  1999/11/02 18:06:52  jp
      Dump of hugepapx

      Revision 1.6  1999/10/28 20:35:15  jp
      write table shading vakues

      Revision 1.5  1999/10/27 17:58:09  jp
      changes for tables

      Revision 1.4  1999/06/15 12:14:44  JP
      new: ListTable and other Contents


      Rev 1.3   15 Jun 1999 14:14:44   JP
   new: ListTable and other Contents

      Rev 1.2   25 Jun 1998 15:44:42   KHZ
   Strukturaenderung fuer PAPX FKPs

      Rev 1.1   10 Jun 1998 17:22:34   KHZ
   Zwischenstand-Sicherung Dumper

      Rev 1.0   27 May 1998 15:30:18   KHZ
   Initial revision.


*************************************************************************/


diff --git a/sw/source/filter/ww8/dump/ww8dout.hxx b/sw/source/filter/ww8/dump/ww8dout.hxx
new file mode 100644
index 0000000..1b7fca2
--- /dev/null
+++ b/sw/source/filter/ww8/dump/ww8dout.hxx
@@ -0,0 +1,120 @@
/*************************************************************************
 *
 *  $RCSfile: ww8dout.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:59 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _WW8DOUT_HXX
#define _WW8DOUT_HXX

#ifndef INC_FSTREAM
  #include <fstream.h>          // ostream
#endif
#ifndef SOLAR_H
  #include <tools/solar.h>          // BYTE
#endif

class SvStream;

void OutByte(     SvStream& rSt, short nLen );
void OutBool(     SvStream& rSt, short nLen );
void OutShort(    SvStream& rSt, short      );
void OutShorts(   SvStream& rSt, short nLen );
void OutWord(     SvStream& rSt, short      );
void OutWords(    SvStream& rSt, short nLen );
void OutWordHex(  SvStream& rSt, short      );
void OutWordsHex( SvStream& rSt, short      );
void OutLongHex(  SvStream& rSt, short      );
void OutLongsHex( SvStream& rSt, short nLen );
void OutTab(      SvStream& rSt, short nLen );
void OutTab68(    SvStream& rSt, short nLen );
void OutTab190(   SvStream& rSt, short nLen );
void OutTab191(   SvStream& rSt, short nLen );
void OutTab192(   SvStream& rSt, short nLen );
void OutBool4(    SvStream& rSt, short nLen );
void OutHugeHex(  SvStream& rSt, short nLen );
void OutTabD608(  SvStream& rSt, short nLen );
void OutTabD609(  SvStream& rSt, short nLen );


// unter WNTMSCI4 muss das __cdecl sein, damit nicht nur der Fkt-Pointer
// ausgegeben wird....

ostream& __cdecl filepos( ostream& s, SvStream& rSt );

ostream& __cdecl endl1(   ostream& s );
ostream& __cdecl indent(  ostream& s, SvStream& rSt );
ostream& __cdecl indent1( ostream& s );
ostream& __cdecl indent2( ostream& s );
ostream& __cdecl hex2( ostream& s );
ostream& __cdecl hex4( ostream& s );
ostream& __cdecl hex6( ostream& s );
ostream& __cdecl hex8( ostream& s );
ostream& __cdecl dec2( ostream& s );

ostream& __cdecl begin( ostream&  s, SvStream& rSt  );
ostream& __cdecl begin1( ostream& s );
ostream& __cdecl begin2( ostream& s );
ostream& __cdecl end( ostream&  s, SvStream& rSt  );
ostream& __cdecl end1( ostream& s );
ostream& __cdecl end2( ostream& s );

extern ostream* pOut;


#endif
diff --git a/sw/source/filter/ww8/dump/ww8scan.cxx b/sw/source/filter/ww8/dump/ww8scan.cxx
new file mode 100644
index 0000000..f9dc437
--- /dev/null
+++ b/sw/source/filter/ww8/dump/ww8scan.cxx
@@ -0,0 +1,6049 @@
/*************************************************************************
 *
 *  $RCSfile: ww8scan.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:59 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/


#include <stdlib.h>

#ifdef PCH
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#ifndef PCH
#include <string.h>         // memset()

#if defined( UNX) || defined( MAC)
int svstricmp( const char* pStr1, const char* pStr2);
// tools/source/generic/string2.cxx
#endif

#ifndef _SVSTDARR_HXX
#define _SVSTDARR_SHORTS
#define _SVSTDARR_USHORTS
#define _SVSTDARR_USHORTSSORT
#include <svtools/svstdarr.hxx>
#endif

#ifdef DUMP
  #define ERR_SWG_READ_ERROR 1234
  #include <assert.h>
  #define ASSERT( a, b )
#else
  #include "swerror.h"      // ERR_WW6_...
  #include "errhdl.hxx"         // ASSERT()
  #include "swtypes.hxx"        // DELETEZ
#endif
#endif

#ifndef _DEBUG_HXX //autogen
#include <tools/debug.hxx>
#endif
#ifndef _APP_HXX //autogen
#include <vcl/svapp.hxx>
#endif

#ifndef _WW8SCAN_HXX
#include <ww8scan.hxx>
#endif


//-----------------------------------------
//      Debug-Code fuer Fastsave-Dateien
//( Kram, um die Strukturen unter CV besser im Debugger untersuchen zu koennen )
//-----------------------------------------
#if defined DEBUG //&& !defined __WW_NEEDS_COPY
#define DEBUG_STRUCT
#endif

#ifdef DEBUG_STRUCT
#  ifdef __WW8_NEEDS_PACK
#    pragma pack(2)
#  endif
struct WW8_PCD1
{
    INT16 fNoParaLast : 1;  // when 1, means that piece contains no end of paragraph marks.
//  BYTE fPaphNil : 1;      // used internally by Word
//  BYTE fCopied : 1;       // used internally by Word
//          *   int :5
//  BYTE aBits2;            // fn int:8, used internally by Word
    INT32 fc;               // file offset of beginning of piece. The size of the
    INT16 prm;              // PRM contains either a single sprm or else an index number
};
#  ifdef __WW8_NEEDS_PACK
#    pragma pack()
#  endif
#endif  // DEBUG_STRUCT


USHORT WW8GetSprmId( BYTE nVersion, BYTE* pSp, BYTE* pDelta );



WW8SprmIter::WW8SprmIter(BYTE* pSprms_,     short nLen_,       BYTE nVersion_ )
                    :  pSprms( pSprms_), nRemLen( nLen_), nVersion( nVersion_),
                       nDelta( ( 8 > nVersion ) ? 0 : 1 )
{
    UpdateMyMembers();
}

void WW8SprmIter::SetSprms(BYTE* pSprms_, short nLen_)
{
    pSprms  = pSprms_;
    nRemLen = nLen_;
    UpdateMyMembers();
}

BYTE* WW8SprmIter::operator ++( int )
{
    if( 0 < nRemLen )
    {
        pSprms  += nAktSizeBrutto;
        nRemLen -= nAktSizeBrutto;
        UpdateMyMembers();
    }
    return pSprms;
}

void WW8SprmIter::UpdateMyMembers()
{
    if( pSprms && (0 < nRemLen) )
    {
        nAktId         = WW8GetSprmId( nVersion, pSprms );
        pAktParams     = pSprms + 1 + nDelta + WW8SprmDataOfs( nAktId );
        nAktSizeBrutto = WW8GetSprmSizeBrutto( nVersion, pSprms, &nAktId );
    }
    else
    {
        nAktId         = 0;
        pAktParams     = 0;
        nAktSizeBrutto = 0;
        nRemLen        = 0;
    }
}



//-----------------------------------------
//      temporaerer Test
//-----------------------------------------
// WW8PLCFx_PCDAttrs halten sich an WW8PLCF_Pcd fest und besitzen deshalb keine
// eigenen Iteratoren. Alle sich auf Iteratoren beziehenden Methoden
// sind deshalb Dummies.

WW8PLCFx_PCDAttrs::WW8PLCFx_PCDAttrs( BYTE nVersion, WW8PLCFx_PCD* pPLCFx_PCD, WW8ScannerBase* pBase )
: WW8PLCFx( nVersion, TRUE ),
  pPcd( pPLCFx_PCD ),
  pGrpprls( pBase->pPieceGrpprls ),
  nGrpprls( pBase->nPieceGrpprls ),
  pPcdI( pPLCFx_PCD->GetPLCFIter() )
{
}

WW8PLCFx_PCDAttrs::~WW8PLCFx_PCDAttrs()
{
}

ULONG WW8PLCFx_PCDAttrs::GetIdx()
{
    return 0;
}

void WW8PLCFx_PCDAttrs::SetIdx( ULONG )
{
}

BOOL WW8PLCFx_PCDAttrs::SeekPos( WW8_CP n )
{
    return TRUE;
}

WW8PLCFx& WW8PLCFx_PCDAttrs::operator ++( int )
{
    return *this;
}

WW8_CP WW8PLCFx_PCDAttrs::Where()
{
    return ( pPcd ) ? pPcd->Where() : LONG_MAX;
}

void WW8PLCFx_PCDAttrs::GetSprms( WW8PLCFxDesc* p )
{
    void* pData;

    p->bRealLineEnd = FALSE;
    if(     !pPcdI
         || !pPcdI->Get( p->nStartPos, p->nEndPos, pData ))
    {
        p->nStartPos = p->nEndPos = LONG_MAX;       // PLCF fertig abgearbeitet
        p->pMemPos = 0;
        return;
    }
    UINT16 nPrm = SVBT16ToShort( ( (WW8_PCD*)pData )->prm );

    if ( nPrm & 1 )
    {   // PRM Variante 2
        UINT16 nSprmIdx = nPrm >> 1;

        if( nSprmIdx >= nGrpprls ){
            p->nStartPos = p->nEndPos = LONG_MAX;       // Bloedsinniger Index
            p->pMemPos = 0;
            return;
        }
        BYTE* pSprms = (BYTE*)( pGrpprls[nSprmIdx] );

        p->nSprmsLen = SVBT16ToShort( pSprms ); // Laenge
        pSprms += 2;
        p->pMemPos = pSprms;                    // Position
    }
    else
    {   // PRM Variante 1:  Sprm wird direkt in Member-Var abgelegt
        /*
            Dies sind die Attr, die in der Piece-Table stehen, statt im Text !
        */

        if(8 > GetVersion())
        {
            aShortSprm[0] = (BYTE)( ( nPrm & 0xfe) >> 1 );
            aShortSprm[1] = (BYTE)(   nPrm         >> 8 );
            p->nSprmsLen = ( nPrm ) ? 2 : 0;        // Laenge

            // store Postion of internal mini storage in Data Pointer
            p->pMemPos = aShortSprm;
        }
        else
        {
            p->pMemPos = 0;
            BYTE nSprmListIdx = (BYTE)((nPrm & 0xfe) >> 1);
            if( nSprmListIdx )
            {
                // process Sprm Id Matching as explained in MS Doku
                //
                // ''Property Modifier(variant 1) (PRM)''
                // see file: s62f39.htm
                //
                // Since isprm is 7 bits, rgsprmPrm can hold 0x80 entries.
                static USHORT __READONLY_DATA aSprmId[0x80] = {
                         0,     0,     0,     0,// sprmNoop, sprmNoop, sprmNoop, sprmNoop
                    0x2402,0x2403,0x2404,0x2405,// sprmPIncLvl, sprmPJc, sprmPFSideBySide, sprmPFKeep
                    0x2406,0x2407,0x2408,0x2409,// sprmPFKeepFollow, sprmPFPageBreakBefore, sprmPBrcl, sprmPBrcp
                    0x260A,     0,0x240C,     0,// sprmPIlvl, sprmNoop, sprmPFNoLineNumb, sprmNoop
                         0,     0,     0,     0,// sprmNoop, sprmNoop, sprmNoop, sprmNoop
                         0,     0,     0,     0,// sprmNoop, sprmNoop, sprmNoop, sprmNoop
                    0x2416,0x2417,     0,     0,// sprmPFInTable, sprmPFTtp, sprmNoop, sprmNoop
                         0,0x261B,     0,     0,// sprmNoop, sprmPPc,  sprmNoop, sprmNoop
                         0,     0,     0,     0,// sprmNoop, sprmNoop, sprmNoop, sprmNoop
                         0,0x2423,     0,     0,// sprmNoop, sprmPWr,  sprmNoop, sprmNoop
                         0,     0,     0,     0,// sprmNoop, sprmNoop, sprmNoop, sprmNoop
                    0x242A,     0,     0,     0,// sprmPFNoAutoHyph, sprmNoop, sprmNoop, sprmNoop
                         0,     0,0x2430,0x2431,// sprmNoop, sprmNoop, sprmPFLocked, sprmPFWidowControl
                         0,0x2433,0x2434,0x2435,// sprmNoop, sprmPFKinsoku, sprmPFWordWrap, sprmPFOverflowPunct
                    0x2436,0x2437,0x2438,     0,// sprmPFTopLinePunct, sprmPFAutoSpaceDE, sprmPFAutoSpaceDN, sprmNoop
                         0,0x243B,     0,     0,// sprmNoop, sprmPISnapBaseLine, sprmNoop, sprmNoop
                         0,0x0800,0x0801,0x0802,// sprmNoop, sprmCFStrikeRM, sprmCFRMark, sprmCFFldVanish
                         0,     0,     0,0x0806,// sprmNoop, sprmNoop, sprmNoop, sprmCFData
                         0,     0,     0,0x080A,// sprmNoop, sprmNoop, sprmNoop, sprmCFOle2
                         0,0x2A0C,0x0858,0x2859,// sprmNoop, sprmCHighlight, sprmCFEmboss, sprmCSfxText
                         0,     0,     0,0x2A33,// sprmNoop, sprmNoop, sprmNoop, sprmCPlain
                         0,0x0835,0x0836,0x0837,// sprmNoop, sprmCFBold, sprmCFItalic, sprmCFStrike
                    0x0838,0x0839,0x083a,0x083b,// sprmCFOutline, sprmCFShadow, sprmCFSmallCaps, sprmCFCaps,
                    0x083C,     0,0x2A3E,     0,// sprmCFVanish, sprmNoop, sprmCKul, sprmNoop,
                         0,     0,0x2A42,     0,// sprmNoop, sprmNoop, sprmCIco, sprmNoop,
                    0x2A44,     0,0x2A46,     0,// sprmCHpsInc, sprmNoop, sprmCHpsPosAdj, sprmNoop,
                    0x2A48,     0,     0,     0,// sprmCIss, sprmNoop, sprmNoop, sprmNoop,
                         0,     0,     0,     0,// sprmNoop, sprmNoop, sprmNoop, sprmNoop,
                         0,     0,     0,0x2A53,// sprmNoop, sprmNoop, sprmNoop, sprmCFDStrike,
                    0x0854,0x0855,0x0856,0x2E00,// sprmCFImprint, sprmCFSpec, sprmCFObj, sprmPicBrcl,
                    0x2640,     0,     0,     0,// sprmPOutLvl, sprmNoop, sprmNoop, sprmNoop,
                         0,     0,     0,     0 // sprmNoop, sprmNoop, sprmPPnbrRMarkNot
                };                              //                     ^^^^^^^^^^^^^^^^^ unknown name!

                // find real Sprm Id:
                USHORT nSprmId = aSprmId[ nSprmListIdx ];

                if( nSprmId )
                {
                    // move Sprm Id and Sprm Param to internal mini storage:
                    aShortSprm[0] = (BYTE)( ( nSprmId & 0x00ff)      );
                    aShortSprm[1] = (BYTE)( ( nSprmId & 0xff00) >> 8 );
                    aShortSprm[2] = (BYTE)( nPrm >> 8 );

                    // store Sprm Length in member:
                    p->nSprmsLen = ( nPrm ) ? 3 : 0;

                    // store Postion of internal mini storage in Data Pointer
                    p->pMemPos = aShortSprm;
                }
            }
        }
    }
}

//------------------------------------------------------------------------

WW8PLCFx_PCD::WW8PLCFx_PCD( BYTE nVersion, WW8PLCFpcd* pPLCFpcd,
                            WW8_CP nStartCp, BOOL bVer67P )
    : WW8PLCFx( nVersion, FALSE )
{
    pPcdI = new WW8PLCFpcd_Iter( *pPLCFpcd, nStartCp ); // eigenen Iterator konstruieren
    bVer67= bVer67P;
}

WW8PLCFx_PCD::~WW8PLCFx_PCD()
{                                   // pPcd-Dtor wird in WW8ScannerBase gerufen
    delete( pPcdI );
}

ULONG WW8PLCFx_PCD::GetIdx()
{
    return ( pPcdI ) ? pPcdI->GetIdx() : 0;
}

void WW8PLCFx_PCD::SetIdx( ULONG nIdx )
{
    if( pPcdI )
        pPcdI->SetIdx( nIdx );
}

BOOL WW8PLCFx_PCD::SeekPos( WW8_CP nCpPos )
{
    return ( pPcdI ) ? pPcdI->SeekPos( nCpPos ) : FALSE;
}

WW8_CP WW8PLCFx_PCD::Where()
{
    return ( pPcdI ) ? pPcdI->Where() : LONG_MAX;
}

long WW8PLCFx_PCD::GetNoSprms( long& rStart, long& rEnd, long& rLen )
{
    void* pData;
    rLen = 0;

    if(     !pPcdI
         || !pPcdI->Get( rStart, rEnd, pData ) )
    {
        rStart = rEnd = LONG_MAX;
        return -1;
    }
    return pPcdI->GetIdx();
}

WW8PLCFx& WW8PLCFx_PCD::operator ++( int )
{
    if( !pPcdI ){
        ASSERT( ASS_FALSE, "pPcdI fehlt");
    }else{
        (*pPcdI)++;
    }
    return *this;
}

WW8_FC WW8PLCFx_PCD::AktPieceStartCp2Fc( WW8_CP nCp )
{
    WW8_CP nCpStart, nCpEnd;
    void* pData;

    if ( !pPcdI->Get( nCpStart, nCpEnd, pData ) ){
        ASSERT( ASS_FALSE, "AktPieceStartCp2Fc() mit falschem Cp gerufen (1)" );
        return LONG_MAX;
    }

    ASSERT( nCp >= nCpStart && nCp < nCpEnd,
            "AktPieceCp2Fc() mit falschem Cp gerufen (2)" );

    if( nCp < nCpStart )
        nCp = nCpStart;
    if( nCp >= nCpEnd )
        nCp = nCpEnd - 1;

    BOOL bIsUnicode = FALSE;
    WW8_FC nFC = SVBT32ToLong( ((WW8_PCD*)pData)->fc );
    if( !bVer67 )
        nFC = WW8PLCFx_PCD::TransformPieceAddress( nFC, bIsUnicode );

    return nFC + (nCp - nCpStart) * (bIsUnicode ? 2 : 1);
}


eCutT WW8PLCFx_PCD::AktPieceFc2Cp( long& rStartPos, long& rEndPos )
{
    WW8_CP nCpStart, nCpEnd;
    void* pData;
    eCutT eRet = CUT_NONE;

    if ( !pPcdI->Get( nCpStart, nCpEnd, pData ) ){
        ASSERT( ASS_FALSE, "AktPieceFc2Cp() - Fehler" );
        rStartPos = rEndPos = LONG_MAX;
        return CUT_BOTH;
    }

    BOOL bIsUnicode = FALSE;
    INT32 nFcStart  = SVBT32ToLong( ((WW8_PCD*)pData)->fc );
    if( !bVer67 )
        nFcStart = WW8PLCFx_PCD::TransformPieceAddress( nFcStart, bIsUnicode );

    INT32 nUnicodeFactor = bIsUnicode ? 2 : 1;

    if( rStartPos < nFcStart )
    {
        rStartPos = nFcStart;
        eRet = (eCutT)( eRet | CUT_START );
    }
    if( rStartPos >= nFcStart + (nCpEnd - nCpStart)  * nUnicodeFactor )
    {
        rStartPos = nFcStart + (nCpEnd - nCpStart - 1) * nUnicodeFactor;
        eRet = (eCutT)( eRet | CUT_START );
    }
    // jetzt CP berechnen
    rStartPos = nCpStart + (rStartPos - nFcStart) / nUnicodeFactor;


    if( rEndPos < nFcStart )
    {
        rEndPos = nFcStart;
        eRet = (eCutT)( eRet | CUT_END );
    }
    if( rEndPos > nFcStart + (nCpEnd - nCpStart) * nUnicodeFactor )
    {
        rEndPos = nFcStart + (nCpEnd - nCpStart) * nUnicodeFactor;
        eRet = (eCutT)( eRet | CUT_END );
    }
    // jetzt CP berechnen
    rEndPos = nCpStart + (rEndPos - nFcStart) / nUnicodeFactor;
#ifdef DEBUG
    if (0 > rStartPos)
    {
        BOOL i = 5;
    }
    ASSERT( (0 <= rStartPos), "AktPieceFc2Cp() - rStartPos kleiner Null!" );
#endif
    return eRet;
}

WW8_CP WW8PLCFx_PCD::AktPieceStartFc2Cp( WW8_FC nStartPos )
{
    WW8_CP nCpStart, nCpEnd;
    void* pData;

    if( nStartPos == LONG_MAX )
        return LONG_MAX;

    if ( !pPcdI->Get( nCpStart, nCpEnd, pData ) )
    {
        ASSERT( ASS_FALSE, "AktPieceStartFc2Cp() - Fehler" );
        return LONG_MAX;
    }
    BOOL bIsUnicode = FALSE;
    INT32 nFcStart  = SVBT32ToLong( ((WW8_PCD*)pData)->fc );
    if( !bVer67 )
        nFcStart = WW8PLCFx_PCD::TransformPieceAddress( nFcStart, bIsUnicode );


    INT32 nUnicodeFactor = bIsUnicode ? 2 : 1;

    if( nStartPos < nFcStart )
        nStartPos = nFcStart;

    if( nStartPos >= nFcStart + (nCpEnd - nCpStart)     * nUnicodeFactor )
        nStartPos  = nFcStart + (nCpEnd - nCpStart - 1) * nUnicodeFactor;

    return nCpStart + (nStartPos - nFcStart) / nUnicodeFactor;
}



//-----------------------------------------
//      Hilfsroutinen fuer alle
//-----------------------------------------

DateTime WW8ScannerBase::WW8DTTM2DateTime(long lDTTM)
{
/*
mint    short   :6  0000003F    minutes (0-59)
hr      short   :5  000007C0    hours (0-23)
dom     short   :5  0000F800    days of month (1-31)
mon     short   :4  000F0000    months (1-12)
yr      short   :9  1FF00000    years (1900-2411)-1900
wdy     short   :3  E0000000    weekday(Sunday=0
                                        Monday=1
( wdy can be ignored )                  Tuesday=2
                                        Wednesday=3
                                        Thursday=4
                                        Friday=5
                                        Saturday=6)
*/
    DateTime aDateTime(Date( 0 ), Time( 0 ));
    if( lDTTM )
    {
        USHORT lMin =(USHORT)(lDTTM & 0x0000003F);
        lDTTM >>= 6;
        USHORT lHour=(USHORT)(lDTTM & 0x0000001F);
        lDTTM >>= 5;
        USHORT lDay =(USHORT)(lDTTM & 0x0000001F);
        lDTTM >>= 5;
        USHORT lMon =(USHORT)(lDTTM & 0x0000000F);
        lDTTM >>= 4;
        USHORT lYear=(USHORT)(lDTTM & 0x000001FF) + 1900;
        aDateTime = DateTime(Date(lDay, lMon, lYear), Time(lHour, lMin));
    }
    return aDateTime;
}

WW8_CP WW8ScannerBase::WW8Fc2Cp( WW8_FC nFcPos ) const
{
    if( nFcPos == LONG_MAX )
        return LONG_MAX;

    if( pPieceIter )
    {                               // Complex File ?
        ULONG nOldPos = pPieceIter->GetIdx();
        pPieceIter->SetIdx( 0 );
        while( 1 )
        {
            long nCpStart, nCpEnd;
            void* pData;
            if( !pPieceIter->Get( nCpStart, nCpEnd, pData ) )
            {   // ausserhalb PLCFfpcd ?
                ASSERT( !this, "PLCFpcd-WW8Fc2Cp() ging schief" );
                break;
//              pPieceIter->SetIdx( nOldPos );
//              return 0;
            }
            BOOL bIsUnicode = FALSE;
            INT32 nFcStart  = SVBT32ToLong( ((WW8_PCD*)pData)->fc );
            if( 8 <= pWw8Fib->nVersion )
                nFcStart = WW8PLCFx_PCD::TransformPieceAddress( nFcStart,
                                                                bIsUnicode );

            INT32 nLen = (nCpEnd - nCpStart) * (bIsUnicode ? 2 : 1);

            if( nFcPos >= nFcStart && nFcPos < nFcStart + nLen )
            {   // gefunden
                pPieceIter->SetIdx( nOldPos );

                return nCpStart + ((nFcPos - nFcStart) / (bIsUnicode ? 2 : 1));
            }
            (*pPieceIter)++;
        }
        pPieceIter->SetIdx( nOldPos );      // nicht gefunden
        return LONG_MAX;
    }
    // No complex file
    return nFcPos - pWw8Fib->fcMin;
}

WW8_FC WW8ScannerBase::WW8Cp2Fc( WW8_CP nCpPos, BOOL* pIsUnicode,
                                WW8_CP* pNextPieceCp, BOOL* pTestFlag ) const
{
    if( pTestFlag )
        *pTestFlag = TRUE;
    if( LONG_MAX == nCpPos )
        return LONG_MAX;

    if( pPieceIter )
    {   // Complex File
        if( pNextPieceCp )
            *pNextPieceCp = LONG_MAX;

        if( !pPieceIter->SeekPos( nCpPos ) )
        {
            if( pTestFlag )
                *pTestFlag = FALSE;
            else
                ASSERT( !this, "Falscher CP an WW8Cp2Fc() uebergeben" );
            return LONG_MAX;
        }
        long nCpStart, nCpEnd;
        void* pData;
        if( !pPieceIter->Get( nCpStart, nCpEnd, pData ) )
        {
            if( pTestFlag )
                *pTestFlag = FALSE;
            else
                ASSERT( ASS_FALSE, "PLCFfpcd-Get ging schief" );
            return LONG_MAX;
        }
        if( pNextPieceCp )
            *pNextPieceCp = nCpEnd;
        BOOL bIsUnicode;
        if( !pIsUnicode )
            pIsUnicode = &bIsUnicode;

        WW8_FC nRet = SVBT32ToLong( ((WW8_PCD*)pData)->fc );
        if( 8 > pWw8Fib->nVersion )
            *pIsUnicode = FALSE;
        else
            nRet = WW8PLCFx_PCD::TransformPieceAddress( nRet, *pIsUnicode );


        nRet += (nCpPos - nCpStart) * (*pIsUnicode ? 2 : 1);

        return nRet;
    }

    // No complex file
    if( pIsUnicode )
        *pIsUnicode = FALSE;
    return nCpPos + pWw8Fib->fcMin;
}

//-----------------------------------------
//      class WW8ScannerBase
//-----------------------------------------

WW8PLCFpcd* WW8ScannerBase::OpenPieceTable( SvStream* pStr, WW8Fib* pWwF )
{
    if(    (    (8 > pWw8Fib->nVersion)
             && !pWwF->fComplex
           )
        || !pWwF->lcbClx ) return 0;

    WW8_FC nClxPos = pWwF->fcClx;
    INT32 nClxLen = pWwF->lcbClx;
    register INT32 nLeft = nClxLen;
    INT16 nGrpprl = 0;
    BYTE clxt;

    pStr->Seek( nClxPos );
    while( 1 ){                                 // Zaehle Zahl der Grpprls
        *pStr >> clxt;
        nLeft--;
        if( 2 == clxt )                         // PLCFfpcd ?
            break;                              // PLCFfpcd gefunden
        if( 1 == clxt )                         // clxtGrpprl ?
            nGrpprl++;
        UINT16 nLen;
        *pStr >> nLen;
        nLeft -= 2 + nLen;
        if( nLeft < 0 )
            return 0;                           // schiefgegangen
        pStr->SeekRel( nLen );                  // ueberlies grpprl
    }
    pStr->Seek( nClxPos );
    nLeft = nClxLen;
    pPieceGrpprls = new char*[nGrpprl + 1];
    memset( pPieceGrpprls, 0, ( nGrpprl + 1 ) * 4 );
    nPieceGrpprls = nGrpprl;
    INT16 nAktGrpprl = 0;                       // lies Grpprls ein
    while( 1 )
    {
        *pStr >> clxt;
        nLeft--;
        if( 2 == clxt)                          // PLCFfpcd ?
            break;                              // PLCFfpcd gefunden
        UINT16 nLen;
        *pStr >> nLen;
        nLeft -= 2 + nLen;
        if( nLeft < 0 )
            return 0;                           // schiefgegangen
        if( 1 == clxt )                         // clxtGrpprl ?
        {
            char* p = new char[nLen+2];         // alloziere
            memcpy( p, &nLen, 2 );              // trage Laenge ein
            pStr->Read( p+2, nLen );            // lies grpprl
            pPieceGrpprls[nAktGrpprl++] = p;    // trage in Array ein
        }
        else
            pStr->SeekRel( nLen );              // ueberlies nicht-Grpprl
    }
    // lies Piece Table PLCF ein
    INT32 nPLCFfLen;
    *pStr >> nPLCFfLen;
    ASSERT( 65536 > nPLCFfLen, "PLCFfpcd ueber 64 k" );
    return new WW8PLCFpcd( pStr, pStr->Tell(), nPLCFfLen, 8 );
}

void WW8ScannerBase::DeletePieceTable()
{
    if( pPieceGrpprls )
    {
        for( char** p = pPieceGrpprls; *p; p++ )
            delete[]( *p );
        delete[]( pPieceGrpprls );
        pPieceGrpprls = 0;
    }
}

WW8ScannerBase::WW8ScannerBase( SvStream* pSt, SvStream* pTblSt, SvStream* pDataSt,
                                WW8Fib* pWwFib )
    : pWw8Fib( pWwFib ), pPieceGrpprls( 0 ),
    pMainFdoa( 0 ), pHdFtFdoa( 0 ),
    pMainTxbx( 0 ), pMainTxbxBkd( 0 ), pHdFtTxbx( 0 ), pHdFtTxbxBkd( 0 )
{
    pPiecePLCF = OpenPieceTable( pTblSt, pWw8Fib );             // Complex
    if( pPiecePLCF )
    {
        pPieceIter      = new WW8PLCFpcd_Iter( *pPiecePLCF );
        pPLCFx_PCD      = new WW8PLCFx_PCD( pWwFib->nVersion, pPiecePLCF, 0,
                                            8 > pWw8Fib->nVersion );
        pPLCFx_PCDAttrs = new WW8PLCFx_PCDAttrs( pWwFib->nVersion, pPLCFx_PCD, this);
    }
    else
    {
        pPieceIter      = 0;
        pPLCFx_PCD      = 0;
        pPLCFx_PCDAttrs = 0;
    }

    // pChpPLCF and pPapPLCF may NOT be created before pPLCFx_PCD !!
    pChpPLCF = new WW8PLCFx_Cp_FKP( pSt, pTblSt, pDataSt, *this, CHP ); // CHPX
    pPapPLCF = new WW8PLCFx_Cp_FKP( pSt, pTblSt, pDataSt, *this, PAP ); // PAPX

    pSepPLCF = new WW8PLCFx_SEPX(   pSt, pTblSt, *pWwFib, 0 );          // SEPX

    // Footnotes
    pFtnPLCF = new WW8PLCFx_SubDoc( pTblSt, pWwFib->nVersion, 0,
                                pWwFib->fcPlcffndRef, pWwFib->lcbPlcffndRef,
                                pWwFib->fcPlcffndTxt, pWwFib->lcbPlcffndTxt,
                                2 );
    // Endnotes
    pEdnPLCF = new WW8PLCFx_SubDoc( pTblSt, pWwFib->nVersion, 0,
                                pWwFib->fcPlcfendRef, pWwFib->lcbPlcfendRef,
                                pWwFib->fcPlcfendTxt, pWwFib->lcbPlcfendTxt,
                                2 );
    // Anmerkungen
    pAndPLCF = new WW8PLCFx_SubDoc( pTblSt, pWwFib->nVersion, 0,
                                pWwFib->fcPlcfandRef, pWwFib->lcbPlcfandRef,
                                pWwFib->fcPlcfandTxt, pWwFib->lcbPlcfandTxt,
                                (8 > pWwFib->nVersion) ? 20 : 30 );

    // Fields Main Text
    pFldPLCF    = new WW8PLCFx_FLD( pTblSt, *pWwFib, MAN_MAINTEXT, 0 );
    // Fields Header / Footer
    pFldHdFtPLCF= new WW8PLCFx_FLD( pTblSt, *pWwFib, MAN_HDFT,     0 );
    // Fields Footnote
    pFldFtnPLCF = new WW8PLCFx_FLD( pTblSt, *pWwFib, MAN_FTN,      0 );
    // Fields Endnote
    pFldEdnPLCF = new WW8PLCFx_FLD( pTblSt, *pWwFib, MAN_EDN,      0 );
    // Fields Anmerkungen
    pFldAndPLCF = new WW8PLCFx_FLD( pTblSt, *pWwFib, MAN_AND,      0 );
    // Fields in Textboxes in Main Text
    pFldTxbxPLCF= new WW8PLCFx_FLD( pTblSt, *pWwFib, MAN_TXBX,     0 );
    // Fields in Textboxes in Header / Footer
    pFldTxbxHdFtPLCF=new WW8PLCFx_FLD(pTblSt,*pWwFib,MAN_TXBX_HDFT,0 );

    switch( pWw8Fib->nVersion ) // beachte: 6 steht fuer "6 ODER 7",  7 steht fuer "NUR 7"
    {
    case 6:
    case 7: if( pWwFib->fcPlcfdoaMom && pWwFib->lcbPlcfdoaMom )
                        pMainFdoa = new WW8PLCFspecial( pTblSt, pWwFib->fcPlcfdoaMom,
                                                pWwFib->lcbPlcfdoaMom, 6 );
                    if( pWwFib->fcPlcfdoaHdr && pWwFib->lcbPlcfdoaHdr )
                        pHdFtFdoa = new WW8PLCFspecial( pTblSt, pWwFib->fcPlcfdoaHdr,
                                                pWwFib->lcbPlcfdoaHdr, 6 );
                    break;
    case 8:
        if( pWwFib->fcPlcfspaMom && pWwFib->lcbPlcfspaMom )
            pMainFdoa = new WW8PLCFspecial( pTblSt, pWwFib->fcPlcfspaMom,
                                                    pWwFib->lcbPlcfspaMom, 26 );
        if( pWwFib->fcPlcfspaHdr && pWwFib->lcbPlcfspaHdr )
            pHdFtFdoa = new WW8PLCFspecial( pTblSt, pWwFib->fcPlcfspaHdr,
                                                    pWwFib->lcbPlcfspaHdr, 26 );
        // PLCF fuer TextBox-Break-Deskriptoren im Maintext
        if( pWwFib->fcPlcftxbxBkd && pWwFib->lcbPlcftxbxBkd )
            pMainTxbxBkd = new WW8PLCFspecial( pTblSt,
                                                pWwFib->fcPlcftxbxBkd,
                                                pWwFib->lcbPlcftxbxBkd, 0);
        // PLCF fuer TextBox-Break-Deskriptoren im Header-/Footer-Bereich
        if( pWwFib->fcPlcfHdrtxbxBkd && pWwFib->lcbPlcfHdrtxbxBkd )
            pHdFtTxbxBkd = new WW8PLCFspecial( pTblSt,
                                                pWwFib->fcPlcfHdrtxbxBkd,
                                                pWwFib->lcbPlcfHdrtxbxBkd, 0);
        break;


    default:ASSERT( !this, "Es wurde vergessen, nVersion zu kodieren!" );
    }

    // PLCF fuer TextBox-Stories im Maintext
    long nLenTxBxS = (8 > pWw8Fib->nVersion) ? 0 : 22;
    if( pWwFib->fcPlcftxbxTxt && pWwFib->lcbPlcftxbxTxt )
        pMainTxbx = new WW8PLCFspecial( pTblSt, pWwFib->fcPlcftxbxTxt,
                              pWwFib->lcbPlcftxbxTxt, nLenTxBxS );

    // PLCF fuer TextBox-Stories im Header-/Footer-Bereich
    if( pWwFib->fcPlcfHdrtxbxTxt && pWwFib->lcbPlcfHdrtxbxTxt )
        pHdFtTxbx = new WW8PLCFspecial( pTblSt, pWwFib->fcPlcfHdrtxbxTxt,
                              pWwFib->lcbPlcfHdrtxbxTxt, nLenTxBxS );

    pBook = new WW8PLCFx_Book( pSt, pTblSt, *pWwFib, 0 );
}

WW8ScannerBase::~WW8ScannerBase()
{
    DeletePieceTable();
    delete pPLCFx_PCDAttrs;
    delete pPLCFx_PCD;
    delete pPieceIter;
    delete pPiecePLCF;
    delete pBook;
    delete pFldEdnPLCF;
    delete pFldFtnPLCF;
    delete pFldAndPLCF;
    delete pFldHdFtPLCF;
    delete pFldPLCF;
    delete pFldTxbxPLCF;
    delete pFldTxbxHdFtPLCF;
    delete pEdnPLCF;
    delete pFtnPLCF;
    delete pAndPLCF;
    delete pSepPLCF;
    delete pPapPLCF;
    delete pChpPLCF;
    // vergessene Schaeflein
    delete pMainFdoa;
    delete pHdFtFdoa;
    delete pMainTxbx;
    delete pMainTxbxBkd;
    delete pHdFtTxbx;
    delete pHdFtTxbxBkd;
}

//-----------------------------------------
//      Stack fuer shorts
//-----------------------------------------

class UShortStk: private SvShorts
{
public:
    UShortStk():SvShorts( 10, 10 ) {}
    ~UShortStk() {}
    void Push( USHORT s ) { Insert( (USHORT)s, SvShorts::Count() ); }
    inline USHORT Top();
    inline USHORT Pop();
    USHORT Count() { return SvShorts::Count(); }
};

inline USHORT UShortStk::Top()
{
    USHORT nPos = SvShorts::Count() - 1;
    USHORT s = (*this)[ nPos ];
    return s;
}

inline USHORT UShortStk::Pop()
{
    USHORT nPos = SvShorts::Count() - 1;
    USHORT s = (*this)[ nPos ];
    Remove( nPos );
    return s;
}


//-----------------------------------------
//          Fields
//-----------------------------------------

static BOOL WW8SkipField( WW8PLCFspecial& rPLCF )
{
    void* pData;
    long nP;

    if( !rPLCF.Get( nP, pData ) )                   // Ende des PLCFspecial ?
        return FALSE;

    rPLCF++;

    if((((BYTE*)pData)[0] & 0x1f ) != 0x13 )        // Kein Anfang ?
        return TRUE;                                // Bei Fehler nicht abbrechen

    if( !rPLCF.Get( nP, pData ) )
        return FALSE;


    while((((BYTE*)pData)[0] & 0x1f ) == 0x13 ){    // immer noch neue (nested) Anfaenge ?
        WW8SkipField( rPLCF );                      // nested Field im Beschreibungsteil
        if( !rPLCF.Get( nP, pData ) )
            return FALSE;
    }

    if((((BYTE*)pData)[0] & 0x1f ) == 0x14 ){       // Field Separator ?
        rPLCF++;

        if( !rPLCF.Get( nP, pData ) )
            return FALSE;

        while((((BYTE*)pData)[0] & 0x1f ) == 0x13 ){// immer noch neue (nested) Anfaenge ?
            WW8SkipField( rPLCF );                  // nested Field im Resultatteil
            if( !rPLCF.Get( nP, pData ) )
                return FALSE;
        }
    }
    rPLCF++;

    return TRUE;
}

BOOL WW8GetFieldPara( BYTE nVersion, WW8PLCFspecial& rPLCF, WW8FieldDesc& rF )
{
    void* pData;
    ULONG nOldIdx = rPLCF.GetIdx();

    rF.nLen = rF.nId = rF.nOpt = rF.bCodeNest = rF.bResNest = 0;

    if( !rPLCF.Get( rF.nSCode, pData ) )             // Ende des PLCFspecial ?
        goto Err;

    rPLCF++;

    if((((BYTE*)pData)[0] & 0x1f ) != 0x13 )        // Kein Anfang ?
        goto Err;

    rF.nId = ((BYTE*)pData)[1];

    if( !rPLCF.Get( rF.nLCode, pData ) )
        goto Err;

    rF.nSRes = rF.nLCode;                           // Default
    rF.nSCode++;                                    // ohne Marken
    rF.nLCode -= rF.nSCode;                         // Pos zu Laenge

    while((((BYTE*)pData)[0] & 0x1f ) == 0x13 ){    // immer noch neue (nested) Anfaenge ?
        WW8SkipField( rPLCF );                      // nested Field im Beschreibungsteil
        rF.bCodeNest = TRUE;
        if( !rPLCF.Get( rF.nSRes, pData ) )
            goto Err;
    }

    if((((BYTE*)pData)[0] & 0x1f ) == 0x14 ){       // Field Separator ?
        rPLCF++;

        if( !rPLCF.Get( rF.nLRes, pData ) )
            goto Err;

        while((((BYTE*)pData)[0] & 0x1f ) == 0x13 ){// immer noch neue (nested) Anfaenge ?
            WW8SkipField( rPLCF );                  // nested Field im Resultatteil
            rF.bResNest = TRUE;
            if( !rPLCF.Get( rF.nLRes, pData ) )
                goto Err;
        }
        rF.nLen = rF.nLRes - rF.nSCode + 2;         // nLRes ist noch die Endposition
        rF.nLRes -= rF.nSRes;                       // nun: nLRes = Laenge
        rF.nSRes++;                                 // Endpos encl. Marken
        rF.nLRes--;

    }else{
        rF.nLRes = 0;                               // Kein Result vorhanden
        rF.nLen = rF.nSRes - rF.nSCode + 2;         // Gesamtlaenge
    }

    rPLCF++;
    if((((BYTE*)pData)[0] & 0x1f ) == 0x15 ){       // Field Ende ?
                                                    // INDEX-Fld hat Bit7 gesetzt!?!
        rF.nOpt = ((BYTE*)pData)[1];                // Ja -> Flags uebernehmen
    }else{
        rF.nId = 0;                                 // Nein -> Feld ungueltig
    }

    rPLCF.SetIdx( nOldIdx );
    return TRUE;
Err:
    rPLCF.SetIdx( nOldIdx );
    return FALSE;
}


//-----------------------------------------


// WW8ReadPString liest einen Pascal-String ein und gibt ihn zurueck. Der Pascal-
// String hat am Ende ein \0, der aber im Laengenbyte nicht mitgezaehlt wird.
// Der Speicher fuer den Pascalstring wird alloziert.
UINT8* WW8ReadPString( SvStream& rStrm, BOOL bAtEndSeekRel1 )
{
    UINT8 b;
    rStrm >> b;
    UINT8* pStr = new UINT8[ b+2 ];
    pStr[0] = b;
    rStrm.Read( &pStr[1], b );
    pStr[b+1] = '\0';

    if( bAtEndSeekRel1 )
        rStrm.SeekRel( 1 ); // ueberspringe das Null-Byte am Ende.

    return pStr;
}

// WW8ReadXString liest einen Unicode-String ein und gibt ihn zurueck. Der Pascal-
// String hat am Ende ein \0, der aber im Laengenbyte nicht mitgezaehlt wird.
// Der Speicher fuer den Pascalstring wird alloziert.
/*
UINT8* WW8Read_xstz(SvStream& rStrm, BOOL bAtEndSeekRel1, USHORT nChars)
{
    USHORT b;
    if( nChars )
        b = nChars;
    else
        WW8ReadUINT16( rStrm, b );

    UniString aTmp;
    aTmp.AllocStrBuf( b );

    sal_Unicode* pWStr = aTmp.GetCharStr();

    for( BYTE nIdx = 0; nIdx < b; ++nIdx, ++pWStr )
    {
        UINT16 nChar;
        WW8ReadUINT16( rStrm, nChar );

        if( 0xF000 == (nChar & 0xFF00))
            nChar &= 0x00FF;
        *pWStr = nChar;
    }
    if( bAtEndSeekRel1 )
        rStrm.SeekRel( 1 ); // ueberspringe das Null-Byte am Ende.

    String sConvert( aTmp, CHARSET_ANSI );

    UINT8* pStr = new UINT8[ sConvert.Len()+2 ];
    pStr[ 0 ] = (char)b;
    memcpy( pStr+1, sConvert.GetStr(), sConvert.Len()+1 );

    return pStr;
}
*/
UINT8* WW8Read_xstz( SvStream& rStrm, BOOL bAtEndSeekRel1, USHORT nChars,
                     BOOL bInsLeadingLen, long* pWasRead )
{
    USHORT b;

    if( nChars )
        b = nChars;
    else
        rStrm >> b;

    USHORT nDelta = bInsLeadingLen ? 1 : 0;

    UINT8* pStr = new UINT8[ b + nDelta + 1 ];

    for( UINT16 nIdx = 0; nIdx < b; ++nIdx )
    {
        UINT16 nChar;
        rStrm >> nChar;
        if( 0 != rStrm.GetError() )
        {
            ASSERT( 0==b, "Stream Error while reading UCHAR string!" );
            b = nIdx;
            break;
        }

        UINT8 c = String::ConvertFromUnicode( nChar );
        pStr[ nIdx + nDelta ] = (c ? c : ((UINT8)nChar));
    }

    if( bInsLeadingLen )
        pStr[ 0 ] = (UINT8)b;  // set count of chars that could be read

    if( pWasRead )
        *pWasRead = nIdx;

    if( bAtEndSeekRel1 )
        rStrm.SeekRel( 1 ); // ueberspringe das Null-Byte am Ende.

    pStr[ nIdx + nDelta ] = 0;

    return pStr;
}


USHORT WW8ScannerBase::WW8ReadString( SvStream& rStrm, String* pString,
                                        WW8_CP nAktStartCp, long   nTotalLen,
                                        unsigned char** ppStr ) const
{
    // Klartext einlesen, der sich ueber mehrere Pieces erstrecken kann
    if( pString )
        pString->Erase();

    if( ppStr && !*ppStr )
        *ppStr = new unsigned char[ nTotalLen ];

    long   nTotalRead = 0;
    WW8_CP nBehindTextCp = nAktStartCp + nTotalLen;
    WW8_CP nNextPieceCp  = nBehindTextCp; // Initialisierung wichtig fuer Ver6
    do {
        BOOL bIsUnicode, bPosOk;
        WW8_FC fcAct = WW8Cp2Fc( nAktStartCp, &bIsUnicode,
                                 &nNextPieceCp, &bPosOk);

        if( !bPosOk ) break;  // vermutlich uebers Dateiende hinaus gezielt, macht nix!

        rStrm.Seek( fcAct );

        long nLen = (    (nNextPieceCp < nBehindTextCp)
                        ? nNextPieceCp
                        : nBehindTextCp
                    )
                    - nAktStartCp;

        if( 0 >= nLen ) break;

        if( nLen > USHRT_MAX - 1 )
            nLen = USHRT_MAX - 1;

        unsigned char* pStr;
        long nWasRead = 0;
        if( bIsUnicode )
            pStr = WW8Read_xstz( rStrm, FALSE, (USHORT)nLen, FALSE, &nWasRead );
        else
        {
            pStr = new unsigned char[ nLen ];
            nWasRead = rStrm.Read( pStr, nLen );
        }
        if( nWasRead != nLen ) break;

        if( pString )
            *pString += String( (const char*)pStr, (USHORT)nLen );
        if( ppStr )
            memcpy( (*ppStr) + nTotalRead, pStr, nLen );
        delete[]( pStr );

        nTotalRead  += nLen;
        nAktStartCp += nLen;
    } while( nTotalRead < nTotalLen );

    if( pString )
        return pString->Len();
    return (USHORT)nTotalRead;
}


//-----------------------------------------
//              WW8PLCFspecial
//-----------------------------------------

// Bei nStartPos < 0 wird das erste Element des PLCFs genommen
WW8PLCFspecial::WW8PLCFspecial( SvStream* pSt, long nFilePos, long nPLCF,
            long nStruct, long nStartPos, BOOL bNoEnd )
:nIdx( 0 ), nStru( nStruct )
{
    nIMax = ( nPLCF - 4 ) / ( 4 + nStruct );
    pPLCF_PosArray = new INT32[ ( nPLCF + 3 ) / 4 ];    // Pointer auf Pos- u. Struct-Array

    long nOldPos = pSt->Tell();

    pSt->Seek( nFilePos );
    pSt->Read( pPLCF_PosArray, nPLCF );
#ifdef __BIGENDIAN
    for( nIdx = 0; nIdx <= nIMax; nIdx++ ){
        pPLCF_PosArray[nIdx] = SWAPLONG( pPLCF_PosArray[nIdx] );
    }
    nIdx = 0;
#endif // __BIGENDIAN
    if( bNoEnd ) nIMax++;
    if( nStruct )
        pPLCF_Contents = (char*)&pPLCF_PosArray[nIMax + 1]; // Pointer auf Inhalts-Array
    else
        pPLCF_Contents = 0;                         // kein Inhalt
    if( nStartPos >= 0 )
        SeekPos( nStartPos );

    pSt->Seek( nOldPos );
}

// WW8PLCFspecial::SeekPos() stellt den WW8PLCFspecial auf die Stelle nPos, wobei auch noch der
// Eintrag benutzt wird, der vor nPos beginnt und bis hinter nPos reicht.
// geeignet fuer normale Attribute. Allerdings wird der Attributanfang nicht
// auf die Position nPos korrigiert.
BOOL WW8PLCFspecial::SeekPos( long nPos )
{
    register long nI;
    register long nP = nPos;

    if( nP < pPLCF_PosArray[0] ){
        nIdx = 0;
        return FALSE;                   // Nicht gefunden: nPos unterhalb kleinstem Eintrag
    }
    for( nI=1; nI<=nIMax; nI++){        // Suchen mit um 1 erhoehtem Index
        if( nP < pPLCF_PosArray[nI] ){          // Position gefunden
            nIdx = nI - 1;              // nI - 1 ist der richtige Index
            return TRUE;                // ... und fertig
        }
    }
    nIdx = nIMax;                       // Nicht gefunden, groesser als alle Eintraege
    return FALSE;
}

// WW8PLCFspecial::SeekPosExact() wie SeekPos(), aber es wird sichergestellt, dass kein
// Attribut angeschnitten wird, d.h. das naechste gelieferte Attribut beginnt
// auf oder hinter nPos. Wird benutzt fuer Felder + Bookmarks.
BOOL WW8PLCFspecial::SeekPosExact( long nPos )
{
    register long nI;
    register long nP = nPos;

    if( nP < pPLCF_PosArray[0] ){
        nIdx = 0;
        return FALSE;                   // Nicht gefunden: nPos unterhalb kleinstem Eintrag
    }
    for( nI=0; nI<nIMax; nI++){         // Suchen
        if( nP <= pPLCF_PosArray[nI] ){         // Position gefunden
            nIdx = nI;                  // nI ist der richtige Index
            return TRUE;                // ... und fertig
        }
    }
    nIdx = nIMax;                       // Nicht gefunden, groesser als alle Eintraege
    return FALSE;
}

BOOL WW8PLCFspecial::Get( long& rPos, void*& rpValue )
{
    if ( nIdx >= nIMax ){
        rPos = LONG_MAX;
        return FALSE;
    }
    rPos = pPLCF_PosArray[nIdx];
    rpValue = pPLCF_Contents ? (void*)&pPLCF_Contents[nIdx * nStru] : 0;
    return TRUE;
}

BOOL WW8PLCFspecial::GetData( long nIdx, long& rPos, void*& rpValue )
{
    if ( nIdx >= nIMax ){
        rPos = LONG_MAX;
        return FALSE;
    }
    rPos = pPLCF_PosArray[nIdx];
    rpValue = pPLCF_Contents ? (void*)&pPLCF_Contents[nIdx * nStru] : 0;
    return TRUE;
}

//-----------------------------------------
//              WW8PLCF z.B. fuer SEPX
//-----------------------------------------

// Ctor fuer *andere* als Fkps
// Bei nStartPos < 0 wird das erste Element des PLCFs genommen
WW8PLCF::WW8PLCF( SvStream* pSt, long nFilePos, long nPLCF,
          long nStruct, long nStartPos )
:nIdx( 0 ), nStru( nStruct )
{
    ASSERT( nPLCF, "WW8PLCF: nPLCF ist Null!" );

    nIMax = ( nPLCF - 4 ) / ( 4 + nStruct );

    ReadPLCF( pSt, nFilePos, nPLCF );

    if( nStartPos >= 0 )
        SeekPos( nStartPos );
}

// Ctor *nur* fuer Fkps
// Die letzten 2 Parameter sind fuer PLCF.Chpx und PLCF.Papx noetig.
// ist ncpN != 0, dann wird ein unvollstaendiger PLCF vervollstaendigt.
// Das ist bei WW6 bei Resourcenmangel und bei WordPad (W95) immer noetig.
// Bei nStartPos < 0 wird das erste Element des PLCFs genommen
WW8PLCF::WW8PLCF( SvStream* pSt, long nFilePos, long nPLCF,
          long nStruct, long nStartPos, long nPN, long ncpN )
:nIdx( 0 ), nStru( nStruct )
{
    nIMax = ( nPLCF - 4 ) / ( 4 + nStruct );

    if( nIMax >= (long) ncpN )
        ReadPLCF( pSt, nFilePos, nPLCF );
    else
        GeneratePLCF( pSt, nPN, ncpN );

    if( nStartPos >= 0 )
        SeekPos( nStartPos );

// Damit man sich den Inhalt im Debugger ansehen kann
#ifdef DEBUG_STRUCT
    INT32  (*p1)[200] = (INT32  (*)[200])pPLCF_PosArray;
    USHORT (*p2)[200] = (USHORT (*)[200])pPLCF_Contents;
    p2 = p2;
#endif
}

void WW8PLCF::ReadPLCF( SvStream* pSt, long nFilePos, long nPLCF )
{
    pPLCF_PosArray = new INT32[ ( nPLCF + 3 ) / 4 ];    // Pointer auf Pos-Array

    long nOldPos = pSt->Tell();

    pSt->Seek( nFilePos );
    pSt->Read( pPLCF_PosArray, nPLCF );
#ifdef __BIGENDIAN
    for( nIdx = 0; nIdx <= nIMax; nIdx++ ){
      pPLCF_PosArray[nIdx] = SWAPLONG( pPLCF_PosArray[nIdx] );
    }
    nIdx = 0;
#endif // __BIGENDIAN
    pPLCF_Contents = (char*)&pPLCF_PosArray[nIMax + 1];     // Pointer auf Inhalts-Array

    pSt->Seek( nOldPos );
}

void WW8PLCF::GeneratePLCF( SvStream* pSt, long nPN,
                       long ncpN )
{
    ASSERT( nIMax < (long)ncpN, "Pcl.Fkp: Warum ist PLCF zu gross ?" );
    nIMax = ncpN;
    long nSiz = 6 * nIMax + 4;
    pPLCF_PosArray = new INT32[ ( nSiz + 3 ) / 4 ]; // Pointer auf Pos-Array
    memset( pPLCF_PosArray, 0, (size_t)nSiz );

    INT32 nFc;
    USHORT i;

    for( i = 0; i < ncpN; i++ ){        // Baue FC-Eintraege
        pSt->Seek( ( nPN + i ) << 9 );  // erster FC-Eintrag jedes Fkp
        *pSt >> nFc;
        pPLCF_PosArray[i] = nFc;
    }
    ULONG nLastFkpPos = ( ( nPN + nIMax - 1 ) << 9 );
    pSt->Seek( nLastFkpPos + 511 );     // Anz. Fkp-Eintraege des letzten Fkp
    BYTE nb;
    *pSt >> nb;
    pSt->Seek( nLastFkpPos + nb * 4 );  // letzer FC-Eintrag des letzten Fkp
    *pSt >> nFc;
    pPLCF_PosArray[nIMax] = nFc;        // Ende des letzten Fkp

    pPLCF_Contents = (char*)&pPLCF_PosArray[nIMax + 1]; // Pointer auf Inhalts-Array
    USHORT* p = (USHORT*)pPLCF_Contents;

    for( i = 0; i < ncpN; i++ )         // Baue PNs
        p[i] = nPN + i;

#ifdef DEBUG_STRUCT // Damit man sich den Inhalt im Debugger ansehen kann
    INT32  (*p1)[200] = (INT32  (*)[200])pPLCF_PosArray;
    USHORT (*p2)[200] = (USHORT (*)[200])pPLCF_Contents;
    p2 = p2;
#endif
}

BOOL WW8PLCF::SeekPos( long nPos )
{
    register long nI;
    register long nP = nPos;

    if( nP < pPLCF_PosArray[0] ){
        nIdx = 0;
        return FALSE;                   // Nicht gefunden: nPos unterhalb kleinstem Eintrag
    }
    for( nI=1; nI<=nIMax; nI++){        // Suchen mit um 1 erhoehtem Index
        if( nP < pPLCF_PosArray[nI] ){          // Position gefunden
            nIdx = nI - 1;              // nI - 1 ist der richtige Index
            return TRUE;                // ... und fertig
        }
    }
    nIdx = nIMax;                       // Nicht gefunden, groesser als alle Eintraege
    return FALSE;
}

BOOL WW8PLCF::Get( long& rStart, long& rEnd, void*& rpValue )
{
    if ( nIdx >= nIMax )
    {
        rStart = rEnd = LONG_MAX;
        return FALSE;
    }
    rStart = pPLCF_PosArray[ nIdx     ];
    rEnd   = pPLCF_PosArray[ nIdx + 1 ];
    rpValue = (void*)&pPLCF_Contents[nIdx * nStru];
    return TRUE;
}

long WW8PLCF::Where()
{
    if ( nIdx >= nIMax )
        return LONG_MAX;

    return pPLCF_PosArray[nIdx];
}

//-----------------------------------------
//              WW8PLCFpcd
//-----------------------------------------

WW8PLCFpcd::WW8PLCFpcd( SvStream* pSt, long nFilePos, long nPLCF, long nStruct )
:nStru( nStruct )
{
    nIMax = ( nPLCF - 4 ) / ( 4 + nStruct );
    pPLCF_PosArray = new INT32[ ( nPLCF + 3 ) / 4 ];    // Pointer auf Pos-Array

    long nOldPos = pSt->Tell();

    pSt->Seek( nFilePos );
    pSt->Read( pPLCF_PosArray, nPLCF );
#ifdef __BIGENDIAN
    for( long nI = 0; nI <= nIMax; nI++ ){
      pPLCF_PosArray[nI] = SWAPLONG( pPLCF_PosArray[nI] );
    }
#endif // __BIGENDIAN

    pPLCF_Contents = (char*)&pPLCF_PosArray[nIMax + 1]; // Pointer auf Inhalts-Array

#ifdef DEBUG_STRUCT // Damit man sich den Inhalt im Debugger ansehen kann
    INT32    (*p1)[200] = (INT32    (*)[200])pPLCF_PosArray;
    WW8_PCD1 (*p2)[200] = (WW8_PCD1 (*)[200])pPLCF_Contents;
#endif

    pSt->Seek( nOldPos );
}

// Bei nStartPos < 0 wird das erste Element des PLCFs genommen
WW8PLCFpcd_Iter::WW8PLCFpcd_Iter( WW8PLCFpcd& rPLCFpcd, long nStartPos /* = -1 */ )
:rPLCF( rPLCFpcd ), nIdx( 0 )
{
    if( nStartPos >= 0 )
        SeekPos( nStartPos );
}

BOOL WW8PLCFpcd_Iter::SeekPos( long nPos )
{
    register long nI;
    register long nP = nPos;

    if( nP < rPLCF.pPLCF_PosArray[0] ){
        nIdx = 0;
        return FALSE;                   // Nicht gefunden: nPos unterhalb kleinstem Eintrag
    }
    for( nI=1; nI<=rPLCF.nIMax; nI++){  // Suchen mit um 1 erhoehtem Index
        if( nP < rPLCF.pPLCF_PosArray[nI] ){// Position gefunden
            nIdx = nI - 1;              // nI - 1 ist der richtige Index
            return TRUE;                // ... und fertig
        }
    }
    nIdx = rPLCF.nIMax;                 // Nicht gefunden, groesser als alle Eintraege
    return FALSE;
}

/*
BOOL WW8PLCFpcd_Iter::SeekMaxMainFC( WW8Fib& rWwF, long& rMaxPosData )
{
    long nCpStart, nCpEnd;
    void* pData;
    nIdx = rPLCF.nIMax-1;
    if( !Get( nCpStart, nCpEnd, pData ) )
    {
        ASSERT( ASS_FALSE, "SeekMaxMainFC findet Eintrag zu nIdx nicht" );
        return FALSE;
    }
    BOOL bIsUnicode;
    WW8_FC nActPosData = WW8PLCFx_PCD::TransformPieceAddress(
                                        SVBT32ToLong( ( (WW8_PCD*)pData )->fc ),
                                        &bIsUnicode );

//  rMaxPosData = nActPosData + ((rWwF.ccpText - nCpStart) * (bIsUnicode ? 2 : 1));

    rMaxPosData = nActPosData + rWwF.ccpText - nCpStart;

    return (0 < rMaxPosData);
}
*/

BOOL WW8PLCFpcd_Iter::Get( long& rStart, long& rEnd, void*& rpValue )
{
    if( nIdx >= rPLCF.nIMax )
    {
        rStart = rEnd = LONG_MAX;
        return FALSE;
    }
    rStart = rPLCF.pPLCF_PosArray[nIdx];
    rEnd = rPLCF.pPLCF_PosArray[nIdx + 1];
    rpValue = (void*)&rPLCF.pPLCF_Contents[nIdx * rPLCF.nStru];
#ifdef DEBUG_STRUCT
    WW8_PCD1* p = (WW8_PCD1*)rpValue;
    p = p;
#endif
    return TRUE;
}

long WW8PLCFpcd_Iter::Where()
{
    if ( nIdx >= rPLCF.nIMax )
        return LONG_MAX;

    return rPLCF.pPLCF_PosArray[nIdx];
}

//-----------------------------------------

WW8PLCFx_Fc_FKP::WW8Fkp::WW8Fkp( BYTE nFibVer, SvStream* pSt, SvStream* pDataSt,
                                 long nFilePos, long nItemSiz,
                                 ePLCFT ePl, WW8_FC nStartFc )
:nItemSize( nItemSiz ), ePLCF( ePl ), nIdx( 0 )
{
    nVersion = nFibVer;

//  pFkp = new BYTE[512];           // 512 Byte
    pFkp = (BYTE*)new INT32[128];           // 512 Byte

    long nOldPos = pSt->Tell();

    pSt->Seek( nFilePos );
    pSt->Read( pFkp, 512 );
    nIMax = pFkp[511];
#ifdef __BIGENDIAN
    register UINT32* p;
    for( nIdx = 0, p = (UINT32*)pFkp; nIdx <= nIMax; nIdx++, p++ )
        *p = SWAPLONG( *p );
#endif // __BIGENDIAN


    // Pointer auf Offset-Bereich in *pFkp
    BYTE* pOfs = pFkp + (nIMax + 1) * 4;

    pGrpprl = new WW8Grpprl[nIMax];
    memset( pGrpprl, 0, sizeof( WW8Grpprl )*nIMax );

    WW8Grpprl* pTmpGrpprl = pGrpprl;
    for( nIdx = 0; nIdx < nIMax; nIdx++, pTmpGrpprl++ )
    {
        USHORT nOfs = (*(pOfs + nIdx * nItemSize)) * 2;

        if ( nOfs )
        {
            switch ( ePLCF )
            {
            case CHP:
                    pTmpGrpprl->nLen  = (short)pFkp[ nOfs ];
                    pTmpGrpprl->pData = pFkp + nOfs + 1;
                    break;
            case PAP:
                    BYTE nDelta = 0;//(8 > nVersion) ? 0 : 1;
                    pTmpGrpprl->nLen = pFkp[ nOfs ];
                    if( 8 <= nVersion && !pTmpGrpprl->nLen )
                    {
                        pTmpGrpprl->nLen = pFkp[ nOfs+1 ];
                        nDelta++;
                    }
                    pTmpGrpprl->nIStd = SVBT16ToShort( (unsigned char *) pFkp+nOfs+1+nDelta );
                    pTmpGrpprl->pData = pFkp + nOfs + 3+nDelta ;
                    USHORT nSpId = WW8GetSprmId( nVersion, pTmpGrpprl->pData );
                    if( 0x6645 == nSpId || 0x6646 == nSpId )
                    {
                        UINT32 nPos  = *(UINT32*)(pTmpGrpprl->pData + 2);
                        UINT32 nCurr = pDataSt->Tell();
                        pDataSt->Seek( nPos );
                        *pDataSt >> pTmpGrpprl->nLen;
                        pTmpGrpprl->pData = new BYTE[pTmpGrpprl->nLen];
                        pTmpGrpprl->bMustDelete = TRUE;
                        pDataSt->Read( pTmpGrpprl->pData, pTmpGrpprl->nLen );

                        pDataSt->Seek( nCurr );
                    }
                    else
                    {
                        pTmpGrpprl->nLen *= 2;
                        pTmpGrpprl->nLen -= 2;
                    }
                    break;
            }
        }
    }

    nIdx = 0;

    if( nStartFc >= 0 )
        SeekPos( nStartFc );

    pSt->Seek( nOldPos );
}

WW8PLCFx_Fc_FKP::WW8Fkp::~WW8Fkp()
{
    WW8Grpprl* pTmpGrpprl = pGrpprl;
    for( nIdx = 0; nIdx < nIMax; nIdx++, pTmpGrpprl++ )
    {
        if( pTmpGrpprl->bMustDelete )
            delete pTmpGrpprl->pData;
    }
    delete pGrpprl;
    delete pFkp;
}

BOOL WW8PLCFx_Fc_FKP::WW8Fkp::SeekPos( WW8_FC nFc )
{
    register short nI;

    if( nFc < ((WW8_FC*)pFkp)[0] ){
        nIdx = 0;
        return FALSE;                   // Nicht gefunden: nPos unterhalb kleinstem Eintrag
    }
    for( nI=1; nI<=nIMax; nI++){        // Suchen mit um 1 erhoehtem Index
        if( nFc < ((WW8_FC*)pFkp)[nI] ){    // Position gefunden
            nIdx = nI - 1;              // nI - 1 ist der richtige Index
            return TRUE;                // ... und fertig
        }
    }
    nIdx = nIMax;                       // Nicht gefunden, groesser als alle Eintraege
    return FALSE;
}

BYTE* WW8PLCFx_Fc_FKP::WW8Fkp::Get( WW8_FC& rStart, WW8_FC& rEnd, short& rLen )
{
    rLen = 0;

    if( nIdx >= nIMax ){
        rStart = LONG_MAX;
        return 0;
    }

    rStart = ((WW8_FC*)pFkp)[nIdx  ];
    rEnd   = ((WW8_FC*)pFkp)[nIdx+1];

    BYTE* pSprms = GetLenAndIStdAndSprms( rLen );
    return pSprms;
}

void WW8PLCFx_Fc_FKP::WW8Fkp::SetIdx( ULONG nI )
{
    if( nI < nIMax) nIdx = (short)nI;
}

BYTE* WW8PLCFx_Fc_FKP::WW8Fkp::GetLenAndIStdAndSprms(short& rLen)
{
    WW8Grpprl* pTmpGrpprl = pGrpprl + nIdx;

    rLen  = pTmpGrpprl->nLen;

    return pTmpGrpprl->pData;
}


BYTE* WW8FindSprm( USHORT nId, long nLen, BYTE* pSprms, BYTE nVersion )
{
    WW8SprmIter aSprmIter( pSprms, nLen, nVersion );

    while( aSprmIter.GetSprms() )
    {
        if( aSprmIter.GetAktId() == nId )
            return aSprmIter.GetAktParams();    // SPRM found!
        aSprmIter++;
    }

    return 0;                                   // SPRM _not_ found
}


BYTE* WW8PLCFx_Fc_FKP::WW8Fkp::HasSprm( USHORT nId )
{
    if( nIdx >= nIMax )
        return 0;

    short nLen;
    BYTE* pSprms = GetLenAndIStdAndSprms( nLen );

    return WW8FindSprm( nId, nLen, pSprms, nVersion );
}

ULONG WW8PLCFx_Fc_FKP::WW8Fkp::GetParaHeight() const
{
    if( ePLCF != PAP ){
        ASSERT( ASS_FALSE, "Fkp::GetParaHeight: Falscher Fkp" );
        return 0;
    }
    if( nIdx >= nIMax )
        return 0;

    WW8_PHE_Base* pPhe = (WW8_PHE_Base*)( (pFkp + (nIMax + 1) * 4)
                                        + ( nIdx * nItemSize ) + 1 );

    if( pPhe->aBits1 & 0x2 )                    // fUnk
        return 0;                               // invalid

    if( pPhe->aBits1 & 0x4 ){                   // fDiffLines
        return SVBT16ToShort( pPhe->dyl );      // Gesamthoehe
    }else{                                      // nlMac gleich hohe Zeilen
        INT32 nH = (INT16)SVBT16ToShort( pPhe->dyl );   // Zeilenhoehe
        if( nH < 0 )                            // negative Werte wollen wir
            nH = 0;                             // nicht
        nH *= (INT32)pPhe->nlMac;               // Hoehe einer Zeile * Zeilen
        return (ULONG)nH;
    }
}

//-----------------------------------------

#if 0
BYTE* WW8PLCFx::GetSprms( long& rStart, long& rEnd, long& rLen )
{
    ASSERT( FALSE, "Falsches GetSprms gerufen" );
    rStart = rEnd = LONG_MAX;
    rLen = 0;
    return 0;
}
#endif

void WW8PLCFx::GetSprms( WW8PLCFxDesc* p )
{
    ASSERT( ASS_FALSE, "Falsches GetSprms gerufen" );
    p->nStartPos = p->nEndPos = LONG_MAX;
    p->nSprmsLen = 0;
    p->pMemPos = 0;
    p->bRealLineEnd = FALSE;
    return;
}

long WW8PLCFx::GetNoSprms( long& rStart, long& rEnd, long& rLen )
{
    ASSERT( ASS_FALSE, "Falsches GetNoSprms gerufen" );
    rStart = rEnd = LONG_MAX;
    rLen = 0;
    return 0;
}

#if 0
WW8PLCFx& WW8PLCFx::operator ++(int)
{
    ASSERT( FALSE, "Falsches ++ gerufen" );
    return *this;
}
#endif

// ...Idx2: Default: ignorieren
ULONG WW8PLCFx::GetIdx2()
{
    return 0;
}

void WW8PLCFx::SetIdx2( ULONG nIdx )
{
}

//-----------------------------------------
BOOL WW8PLCFx_Fc_FKP::NewFkp()
{
    long nPLCFStart, nPLCFEnd;
    void* pPage;

    static int __READONLY_DATA WW8FkpSizeTabVer6[ PLCF_END ] = {
                                                    1,  7, 0 /*, 0, 0, 0*/ };
    static int __READONLY_DATA WW8FkpSizeTabVer8[ PLCF_END ] = {
                                                    1, 13, 0 /*, 0, 0, 0*/ };
    const int* pFkpSizeTab;
    switch( GetVersion() )
    {
    case 6:
    case 7: pFkpSizeTab = WW8FkpSizeTabVer6;
            break;
    case 8: pFkpSizeTab = WW8FkpSizeTabVer8;
            break;
    default:// Programm-Fehler!
            ASSERT( !this, "Es wurde vergessen, nVersion zu kodieren!" );
            return FALSE;
    }

#if 0   //!!!!!
    pFkp = 0;   // absichtliches SpeicherLoch fuer besseres Debuggen
#else
    DELETEZ( pFkp );
#endif

    if (!pPLCF->Get( nPLCFStart, nPLCFEnd, pPage ))
        return FALSE;                                   // PLCF fertig abgearbeitet
    (*pPLCF)++;
    long nPo = SVBT16ToShort( (unsigned char *)pPage );
    nPo <<= 9;                                          // shift als LONG
    pFkp = new WW8Fkp( GetVersion(), pFKPStrm, pDataStrm, nPo, pFkpSizeTab[ ePLCF ],
                        ePLCF, nStartFc );
    nStartFc = -1;                                  // Nur das erste Mal
    return TRUE;
}

WW8PLCFx_Fc_FKP::WW8PLCFx_Fc_FKP(SvStream* pSt, SvStream* pTblSt,
                                 SvStream* pDataSt, WW8Fib& rFib, ePLCFT ePl,
                                 WW8_FC nStartFcL,
                                 WW8PLCFx_PCDAttrs* pPLCFx_PCDAttrs_)
    : WW8PLCFx( rFib.nVersion, TRUE ),
    pFKPStrm( pSt ),
    pDataStrm( pDataSt ),
    ePLCF( ePl ),
    pFkp( 0 ),
    nStartFc( nStartFcL ),
    pPCDAttrs( pPLCFx_PCDAttrs_)
{
    long nLenStruct = (8 > rFib.nVersion) ? 2 : 4;
    if( ePl == CHP )
        pPLCF = new WW8PLCF( pTblSt, rFib.fcPlcfbteChpx,
                        rFib.lcbPlcfbteChpx,
                        nLenStruct,
                        nStartFc,
                        rFib.pnChpFirst,
                        rFib.cpnBteChp );
    else
        pPLCF = new WW8PLCF( pTblSt, rFib.fcPlcfbtePapx,
                        rFib.lcbPlcfbtePapx,
                        nLenStruct,
                        nStartFc,
                        rFib.pnPapFirst,
                        rFib.cpnBtePap );
}

WW8PLCFx_Fc_FKP::~WW8PLCFx_Fc_FKP()
{
    delete pFkp;
    delete pPLCF;
}


ULONG WW8PLCFx_Fc_FKP::GetIdx()
{
    ULONG u = pPLCF->GetIdx() << 8;
    if( pFkp )
        u |= pFkp->GetIdx();
    return u;
}

void WW8PLCFx_Fc_FKP::SetIdx( ULONG nIdx )
{
    if( !( nIdx & 0xffffff00L ) ){
        pPLCF->SetIdx( nIdx >> 8 );
        DELETEZ( pFkp );

    }else{                              // Es gab einen Fkp
                                        // Lese PLCF um 1 Pos zurueck, um
        pPLCF->SetIdx( ( nIdx >> 8 ) - 1 );  // die Adresse des Fkp wiederzubekommen
        if ( NewFkp() )                     // und lese Fkp wieder ein
            pFkp->SetIdx( nIdx & 0xff );    // Dann stelle Fkp-Pos wieder ein
    }
}

BOOL WW8PLCFx_Fc_FKP::SeekPos( WW8_FC nFcPos )
{
    DELETEZ( pFkp );                // FKP ungueltig machen
    nStartFc = nFcPos;              // StartPos fuer naechstes Where()
    return pPLCF->SeekPos( nFcPos );    // StartPos fuer naechstes pPLCF->Get()
}

WW8_FC WW8PLCFx_Fc_FKP::Where()
{
    if( !pFkp ){
        if( !NewFkp() )
            return LONG_MAX;
    }
    WW8_FC nP = pFkp->Where();
    if( nP != LONG_MAX )
        return nP;

    DELETEZ( pFkp );                    // FKP beendet -> hole neuen
    return Where();                     // am einfachsten rekursiv
}



BYTE* WW8PLCFx_Fc_FKP::GetSprms( WW8_FC& rStart, WW8_FC& rEnd, long& rLen )
{
    rLen = 0;                               // Default
    rStart = rEnd = LONG_MAX;

    if( !pFkp ){                            // Fkp nicht da ?
        if( !NewFkp() )
            return 0;
    }

    short nLen;
    BYTE* pPos = pFkp->Get( rStart, rEnd, nLen );
    if( rStart == LONG_MAX )
    {               // nicht gefunden
        return 0;
    }
    rLen = nLen;
    return pPos;
}



WW8PLCFx& WW8PLCFx_Fc_FKP::operator ++( int )
{
    if( !pFkp ){
//      ASSERT( FALSE, "pFkp fehlt");
//      return *this;
        if( !NewFkp() )
            return *this;
    }

    (*pFkp)++;
    if( pFkp->Where() == LONG_MAX ){
        NewFkp();
    }
    return *this;
}

USHORT WW8PLCFx_Fc_FKP::GetIstd() const
{
    return (pFkp) ? pFkp->GetIstd() : 0xffff;
}


void WW8PLCFx_Fc_FKP::GetPCDSprms( WW8PLCFxDesc& rDesc )
{
    rDesc.pMemPos   = 0;
    rDesc.nSprmsLen = 0;
    if( pPCDAttrs )
    {
        if( !pFkp )
        {
            DBG_WARNING( "+Problem: GetPCDSprms: NewFkp noetig ( kein const moeglich )" );
            if( !NewFkp() )
                return;
        }

        long nFcPos, nEnd;              // FCs
        short nLen;
        pFkp->Get( nFcPos, nEnd, nLen );

        WW8PLCFpcd_Iter* pIter = pPCDAttrs->GetIter();

    /**************************************/
        ULONG nSaveIdx = pIter->GetIdx();
        BOOL bFirst = TRUE;
        while( 1 )
        {
            long nCpStart, nCpEnd;
            void* pData;
            if( !pIter->Get( nCpStart, nCpEnd, pData ) )
            {   // ausserhalb PLCFfpcd ?
                break;
            }
            BOOL bIsUnicode = FALSE;
            INT32 nFcStart  = SVBT32ToLong( ((WW8_PCD*)pData)->fc );
            if( 7 < GetVersion() )
                nFcStart = WW8PLCFx_PCD::TransformPieceAddress( nFcStart, bIsUnicode );

            INT32 nLen = (nCpEnd - nCpStart) * (bIsUnicode ? 2 : 1);

            if( nFcPos >= nFcStart && nFcPos < nFcStart + nLen )
            {
                // gefunden
                pPCDAttrs->GetSprms( &rDesc );
                break;
            }
            if( bFirst )
            {
                pIter->SetIdx( 0 );
                bFirst = FALSE;
            }
            else
                (*pIter)++;
        }
        if( nSaveIdx != pIter->GetIdx() )
            pIter->SetIdx( nSaveIdx );
    /**************************************/
    }
}


BYTE* WW8PLCFx_Fc_FKP::HasSprm( USHORT nId )
{                                       // const waere schoener, aber dafuer
                                        // muesste NewFkp() ersetzt werden
                                        // oder wegfallen
    if( !pFkp )
    {
        DBG_WARNING( "+Motz: HasSprm: NewFkp noetig ( kein const moeglich )" );
                // Passiert bei BugDoc 31722
        if( !NewFkp() )
            return 0;
    }

    BYTE* pRes = pFkp->HasSprm( nId );

    if( !pRes )
    {
        WW8PLCFxDesc aDesc;
        GetPCDSprms( aDesc );

        if( aDesc.pMemPos )
        {
            pRes = WW8FindSprm( nId, aDesc.nSprmsLen,
                                aDesc.pMemPos, pFkp->GetVersion() );
        }
    }
    return pRes;
}


ULONG WW8PLCFx_Fc_FKP::GetParaHeight() const
{
    if( !pFkp ){
        ASSERT( ASS_FALSE, "GetParaHeight: pFkp nicht da" );
        return 0;
    }
    return pFkp->GetParaHeight();
}

//-----------------------------------------

WW8PLCFx_Cp_FKP::WW8PLCFx_Cp_FKP( SvStream* pSt, SvStream* pTblSt, SvStream* pDataSt,
                                    const WW8ScannerBase& rBase,
                                    ePLCFT ePl )
    : WW8PLCFx_Fc_FKP( pSt, pTblSt, pDataSt, *rBase.pWw8Fib, ePl,
                        rBase.WW8Cp2Fc( 0 ),
                        rBase.pPLCFx_PCDAttrs ),
    rSBase( rBase ),
//  nFcMin( rBase.pWrFib.fcMin ),
    nAttrStart( -1 ), nAttrEnd( -1 ),
    bLineEnd( FALSE ),
    bComplex( (7 < rBase.pWw8Fib->nVersion) || (0 != rBase.pWw8Fib->fComplex) )
{
    ResetAttrStartEnd();
    pPcd = rSBase.pPiecePLCF ? new WW8PLCFx_PCD(
                                rBase.pWw8Fib->nVersion, rBase.pPiecePLCF, 0,
                                ((6 == GetVersion()) || (7 == GetVersion())) )
                           : 0;
}

WW8PLCFx_Cp_FKP::~WW8PLCFx_Cp_FKP()
{
    delete pPcd;
}

void WW8PLCFx_Cp_FKP::ResetAttrStartEnd()
{
  nAttrStart = -1;
  nAttrEnd   = -1;
  bLineEnd   = FALSE;
}

ULONG WW8PLCFx_Cp_FKP::GetIdx2()
{
    return pPcd ? pPcd->GetIdx() : 0;
}

void WW8PLCFx_Cp_FKP::SetIdx2( ULONG nIdx )
{
    if( pPcd )
        pPcd->SetIdx( nIdx );
}

BOOL WW8PLCFx_Cp_FKP::SeekPos( WW8_CP nCpPos )
{
/*
    WW8_FC nTargetFc = WW8Cp2Fc( nCpPos, nFcMin );
    return (LONG_MAX != nTargetFc)
        && WW8PLCFx_Fc_FKP::SeekPos( nTargetFc );
*/
    if( pPcd )  // Complex
    {
        if( !pPcd->SeekPos( nCpPos ) )  // Piece setzen
            return FALSE;
        return WW8PLCFx_Fc_FKP::SeekPos( pPcd->AktPieceStartCp2Fc( nCpPos ) );
    }
                                    // KEINE Piece-Table !!!
    return WW8PLCFx_Fc_FKP::SeekPos( rSBase.WW8Cp2Fc( nCpPos /*,TRUE*/ ) );
}

WW8_CP WW8PLCFx_Cp_FKP::Where()
{
    WW8_FC nFc = WW8PLCFx_Fc_FKP::Where();
    if( pPcd )
        return pPcd->AktPieceStartFc2Cp( nFc ); // Piece ermitteln
    return rSBase.WW8Fc2Cp( nFc/*,TRUE*/ );     // KEINE Piece-Table !!!
}

void WW8PLCFx_Cp_FKP::GetSprms( WW8PLCFxDesc* p )
{
    p->pMemPos = WW8PLCFx_Fc_FKP::GetSprms( p->nStartPos, p->nEndPos, p->nSprmsLen );

#ifdef DEBUG
    if( ePLCF == PAP ) // um hier einen Brechpunkt zu setzen
        ePLCF = PAP;
#endif

    if( pPcd )  // Piece-Table vorhanden !!!
    {
        if(    (nAttrStart >  nAttrEnd)
            || (nAttrStart ==       -1) )  // Init ( noch kein ++ gerufen )
        {
            eCutT eC = pPcd->AktPieceFc2Cp( p->nStartPos, p->nEndPos );
            p->bRealLineEnd = !( eC & CUT_END ) && ePLCF == PAP;
        }
        else
        {
            p->nStartPos = nAttrStart;
            p->nEndPos = nAttrEnd;
            p->bRealLineEnd = bLineEnd;
        }
    }
    else        // KEINE Piece-Table !!!
    {
        p->nStartPos = rSBase.WW8Fc2Cp( p->nStartPos/*,TRUE*/ );
        p->nEndPos   = rSBase.WW8Fc2Cp( p->nEndPos/*,TRUE*/ );
        p->bRealLineEnd = ePLCF == PAP;
    }
}


// WW8PLCF_Cp_Fkp::SearchParaEnd kann einfacher durchgefuehrt werden, wenn das
// Flag "Zeilenende im Piece" in der Piecetable ausgewertet wird.
void WW8PLCFx_Cp_FKP::SearchParaEnd( long nOldEndCp )
{
    if( !bComplex )
    {
        ASSERT( !this, "SearchParaEnd fuer Non-Complex File gerufen" );
        return;
    }
    if( ePLCF != PAP )
    {
        ASSERT( !this, "SearchParaEnd fuer Non-PAP gerufen" );
        return;
    }
    long nFkpLen;                           // Fkp-Eintrag
    long nPcdStart, nPcdEnd;                // Piece-Grenzen

    WW8PLCFx_Fc_FKP::GetSprms( nAttrStart, nAttrEnd, nFkpLen ); // Fkp-Eintrag holen
    eCutT eC = pPcd->AktPieceFc2Cp( nAttrStart, nAttrEnd );
    if( eC == CUT_NONE )            // neuer Eintrag ganz im akt. Piece
    {
        ASSERT( !this, "Nanu?" );
        return;                             // und fertig
    }
    WW8PLCFpcd_Iter* pIter = pPcd->GetPLCFIter();
    void* pData;
    do{
        (*pPcd)++;                                      //  naechstes Piece
        if( !pIter->Get( nPcdStart, nPcdEnd, pData ) ){ // Piece-Grenzen holen
#ifdef DEBUG_STRUCT
            WW8_PCD1* p = (WW8_PCD1*)pData;
            p = p;
#endif
            nAttrStart = nAttrEnd = LONG_MAX;   // kein Piece mehr vorhanden
            return;
        }
#ifdef DEBUG_STRUCT
        WW8_PCD1* p = (WW8_PCD1*)pData;
        p = p;
#endif

    }while( SVBT8ToByte( ( (WW8_PCD*)pData )->aBits1 ) & 0x1 );
                                                // bis NL in Piece

    if( !WW8PLCFx_Fc_FKP::SeekPos( rSBase.WW8Cp2Fc( nPcdStart ) ) )
    {
        ASSERT( !this, " Can't seek to Piece Start" );
        nAttrStart = nAttrEnd = LONG_MAX;   // kein Piece mehr vorhanden
        return;
    }
    WW8PLCFx_Fc_FKP::GetSprms( nAttrStart, nAttrEnd, nFkpLen ); // Fkp-Eintrag holen
    eC = pPcd->AktPieceFc2Cp(  nAttrStart, nAttrEnd );  // wird in CPs gebraucht

    nAttrStart = nOldEndCp;     // Aufziehen ueber ganzen Absatz, unabhaengig
                                // davon, wieviel Pieces das sind
}

WW8PLCFx& WW8PLCFx_Cp_FKP::operator ++( int )
{
    WW8PLCFx_Fc_FKP::operator ++( 0 );
    if( !bComplex || !pPcd )                    // !pPcd: Notbremse
        return *this;
// ohoho
    long nFkpLen;                               // Fkp-Eintrag
    long nPcdStart, nPcdEnd, nPcdLen;           // Piece-Grenzen
    long nOldEndCp = nAttrEnd;

    WW8PLCFx_Fc_FKP::GetSprms( nAttrStart, nAttrEnd, nFkpLen ); // Fkp-Eintrag holen
    eCutT eC = pPcd->AktPieceFc2Cp( nAttrStart, nAttrEnd );
    bLineEnd = !( eC & CUT_END ) && ePLCF == PAP;
    if( !( eC & CUT_START ) ){                  // neuer Eintrag faengt im
                                                // akt. Piece an
#ifdef DEBUG
        if( ePLCF == PAP )
            ePLCF = PAP;                    // um hier einen Brechpunkt zu setzen
        if( ePLCF == CHP )
            ePLCF = CHP;                    // um hier einen Brechpunkt zu setzen
#endif
        return *this;               // und fertig
    }
                                    // naechster Eintrag im naechsten Piece

    if( ePLCF == PAP )
    {
        SearchParaEnd( nOldEndCp );
        bLineEnd = TRUE;
        return *this;
    }

    //  naechstes Piece
    bLineEnd = FALSE;
    (*pPcd)++;
    pPcd->GetNoSprms( nPcdStart, nPcdEnd, nPcdLen );
    // Piece-Grenzen holen
    if( !WW8PLCFx_Fc_FKP::SeekPos( rSBase.WW8Cp2Fc( nPcdStart ) ) )
    {
        ASSERT( nPcdStart == LONG_MAX, "Chp-SeekPos ging schief" );
        nAttrStart = nAttrEnd = LONG_MAX;
        goto Ret;
    }
    // Fkp-Eintrag holen
    WW8PLCFx_Fc_FKP::GetSprms( nAttrStart, nAttrEnd, nFkpLen );
    eC  = pPcd->AktPieceFc2Cp( nAttrStart, nAttrEnd );
Ret:
    return *this;
}

//-----------------------------------------
//-----------------------------------------

WW8PLCFx_SEPX::WW8PLCFx_SEPX( SvStream* pSt, SvStream* pTblSt, WW8Fib& rFib, WW8_CP nStartCp )
: pStrm( pSt ), WW8PLCFx( rFib.nVersion, TRUE ), nArrMax( 256 ), nSprmSiz( 0 )
{
    pPLCF =   rFib.lcbPlcfsed
            ? new WW8PLCF( pTblSt, rFib.fcPlcfsed,
                            rFib.lcbPlcfsed,
                            12, nStartCp )
            : 0;

    pSprms = new BYTE[nArrMax];     // maximale Laenge
}

WW8PLCFx_SEPX::~WW8PLCFx_SEPX()
{
    delete pPLCF;
    delete pSprms;
}

ULONG WW8PLCFx_SEPX::GetIdx()
{
    return pPLCF ? pPLCF->GetIdx() : 0;
}

void WW8PLCFx_SEPX::SetIdx( ULONG nIdx )
{
    if( pPLCF ) pPLCF->SetIdx( nIdx );
}

BOOL WW8PLCFx_SEPX::SeekPos( WW8_CP nCpPos )
{
    return pPLCF ? pPLCF->SeekPos( nCpPos ) : 0;
}

WW8_CP WW8PLCFx_SEPX::Where()
{
    return pPLCF ? pPLCF->Where() : 0;
}

void WW8PLCFx_SEPX::GetSprms( WW8PLCFxDesc* p )
{
    if( !pPLCF ) return;

    void* pData;

    p->bRealLineEnd = FALSE;
    if (!pPLCF->Get( p->nStartPos, p->nEndPos, pData ))
    {
        p->nStartPos = p->nEndPos = LONG_MAX;       // PLCF fertig abgearbeitet
        p->pMemPos = 0;
    }
    else
    {
//      long nPo = SVBT16ToShort( (unsigned char *)pData );
//      nPo <<= 9;                                      // shift als LONG

        long nPo = SVBT32ToLong( (unsigned char *)pData+2 );
        //long nPo = SVBT16ToShort(  (unsigned char *)pData+2 );

        if ( nPo == 0xffffffffL )
        {
            p->nStartPos = p->nEndPos = LONG_MAX;       // Sepx empty
            p->pMemPos = 0;
        }
        else
        {
            pStrm->Seek( nPo );
            *pStrm >> nSprmSiz; // read len

            if( nSprmSiz > nArrMax )
            {               // passt nicht
                delete( pSprms );
                nArrMax = nSprmSiz;                 // Hole mehr Speicher
                pSprms = new BYTE[nArrMax];
            }
            pStrm->Read( pSprms, nSprmSiz );        // read Sprms

            p->nSprmsLen = nSprmSiz;
            p->pMemPos = pSprms;                    // return Position
        }
    }
}


WW8PLCFx& WW8PLCFx_SEPX::operator ++( int )
{
    if( pPLCF )
        (*pPLCF)++;
    return *this;
}


BYTE* WW8PLCFx_SEPX::HasSprm( USHORT nId ) const
{
    return pPLCF ? WW8FindSprm( nId, nSprmSiz, pSprms, GetVersion() )
                 : 0;
}


BYTE* WW8PLCFx_SEPX::HasSprm( USHORT nId, BYTE*  pOtherSprms,
                                          long   nOtherSprmSiz ) const
{
    return pPLCF ? WW8FindSprm( nId, nOtherSprmSiz, pOtherSprms, GetVersion() )
                 : 0;
}



BOOL WW8PLCFx_SEPX::Find4Sprms(USHORT nId1, USHORT nId2, USHORT nId3, USHORT nId4,
                               BYTE*& p1,   BYTE*& p2,   BYTE*& p3,   BYTE*& p4 ) const
{
    if( !pPLCF ) return 0;

    BOOL bFound = FALSE;
    p1 = 0;
    p2 = 0;
    p3 = 0;
    p4 = 0;

    BYTE* pSp = pSprms;
    short i;
    BYTE nDelta = ( 8 > GetVersion()) ? 0 : 1;
    for( i=0; i+1+nDelta < nSprmSiz;    )
    {
        // Sprm gefunden?
        USHORT nAktId = WW8GetSprmId( GetVersion(), pSp );
        BOOL bOk = TRUE;
        if( nAktId  == nId1 )
            p1 = pSp
                + 1 + nDelta
                + WW8SprmDataOfs( nId1 );
        else
        if( nAktId  == nId2 )
            p2 = pSp
                + 1 + nDelta
                + WW8SprmDataOfs( nId2 );
        else
        if( nAktId  == nId3 )
            p3 = pSp
                + 1 + nDelta
                + WW8SprmDataOfs( nId3 );
        else
        if( nAktId  == nId4 )
            p4 = pSp
                + 1 + nDelta
                + WW8SprmDataOfs( nId4 );
        else
            bOk = FALSE;
        bFound |= bOk;
        // erhoehe Zeiger, so dass er auf naechsten Sprm zeigt
        short x = WW8GetSprmSizeBrutto( GetVersion(), pSp, &nAktId  );
        i += x;
        pSp += x;
    }
    return bFound;
}

BYTE* WW8PLCFx_SEPX::HasSprm( USHORT nId, BYTE n2nd ) const
{
    if( !pPLCF ) return 0;

    BYTE* pSp = pSprms;
    short i;
    BYTE nDelta = ( 8 > GetVersion()) ? 0 : 1;

    for( i=0; i+1+nDelta < nSprmSiz;    )
    {
        // Sprm gefunden?
        USHORT nAktId = WW8GetSprmId( GetVersion(), pSp );
        if(    ( nAktId            == nId  )
                && ( pSp[ 1 + nDelta ] == n2nd ) )
            return pSp
                    + 1 + nDelta
                    + WW8SprmDataOfs( nId );
        // erhoehe Zeiger, so dass er auf naechsten Sprm zeigt
        short x = WW8GetSprmSizeBrutto( GetVersion(), pSp, &nAktId );
        i += x;
        pSp += x;
    }
    return 0;   // Sprm nicht gefunden
}

//-----------------------------------------
//-----------------------------------------

WW8PLCFx_SubDoc::WW8PLCFx_SubDoc( SvStream* pSt, BYTE nVersion,
                                    WW8_CP nStartCp,
                                    long nFcRef, long nLenRef,
                                    long nFcTxt, long nLenTxt,
                                    long nStruct )
    : WW8PLCFx( nVersion, FALSE ), pRef( 0 ), pTxt( 0 )
{
    if( nLenRef && nLenTxt )
    {
        pRef = new WW8PLCF( pSt, nFcRef, nLenRef, nStruct, nStartCp );
        pTxt = new WW8PLCF( pSt, nFcTxt, nLenTxt, 0, nStartCp );
    }
}

WW8PLCFx_SubDoc::~WW8PLCFx_SubDoc()
{
    delete pRef;
    delete pTxt;
}

ULONG WW8PLCFx_SubDoc::GetIdx()
{
    if( pRef )
        return ( pRef->GetIdx() << 16
                 | pTxt->GetIdx() );        // Wahrscheinlich pTxt... nicht noetig
    return 0;
}

void WW8PLCFx_SubDoc::SetIdx( ULONG nIdx )
{
    if( pRef )
    {
        pRef->SetIdx( nIdx >> 16 );
        pTxt->SetIdx( nIdx & 0xffff );      // Wahrscheinlich pTxt... nicht noetig
    }
}

BOOL WW8PLCFx_SubDoc::SeekPos( WW8_CP nCpPos )
{
    return ( pRef ) ? pRef->SeekPos( nCpPos ) : FALSE;
}

WW8_CP WW8PLCFx_SubDoc::Where()
{
    return ( pRef ) ? pRef->Where() : LONG_MAX;
}

long WW8PLCFx_SubDoc::GetNoSprms( WW8_CP& rStart, long& rEnd, long& rLen )
{
    void* pData;
    long nSt, nE;
    rEnd = LONG_MAX;

    if ( !pRef )
    {
        rStart  = LONG_MAX;             // Es gibt keine Noten
        rLen = 0;
        return -1;
    }

    ULONG nNr = pRef->GetIdx();

    if (!pRef->Get( rStart, nE, pData ))
    {
        rStart = LONG_MAX;              // PLCF fertig abgearbeitet
        rLen = 0;
        return -1;
    }
    pTxt->SetIdx( nNr );

    if(!pTxt->Get( nSt, rLen, pData ))
    {
        rStart = LONG_MAX;              // PLCF fertig abgearbeitet
        rLen = 0;
        return -1;
    }

    rLen -= nSt;
    return nSt;
}

WW8PLCFx& WW8PLCFx_SubDoc::operator ++( int )
{
    if( pRef && pTxt )
    {
        (*pRef)++;
        (*pTxt)++;
    }
    return *this;
}


//-----------------------------------------
//          Felder
//-----------------------------------------

WW8PLCFx_FLD::WW8PLCFx_FLD( SvStream* pSt, WW8Fib& rMyFib,
                            short nType, WW8_CP nStartCp )
    : WW8PLCFx( rMyFib.nVersion, FALSE ), rFib( rMyFib ), pPLCF( 0 )
{

    long nFc, nLen;

    switch( nType )
    {
    case MAN_HDFT: nFc = rFib.fcPlcffldHdr;
                   nLen = rFib.lcbPlcffldHdr;
                   break;
    case MAN_FTN:  nFc = rFib.fcPlcffldFtn;
                   nLen = rFib.lcbPlcffldFtn;
                   break;
    case MAN_EDN:  nFc = rFib.fcPlcffldEdn;
                   nLen = rFib.lcbPlcffldEdn;
                   break;
    case MAN_AND:  nFc = rFib.fcPlcffldAtn;
                   nLen = rFib.lcbPlcffldAtn;
                   break;
    case MAN_TXBX: nFc = rFib.fcPlcffldTxbx;
                   nLen = rFib.lcbPlcffldTxbx;
                   break;
    case MAN_TXBX_HDFT:
                   nFc = rFib.fcPlcffldHdrTxbx;
                   nLen = rFib.lcbPlcffldHdrTxbx;
                   break;
    default:       nFc = rFib.fcPlcffldMom;
                   nLen = rFib.lcbPlcffldMom;
                   break;
    }

    if( nLen )
        pPLCF = new WW8PLCFspecial( pSt, nFc, nLen, 2 );
}

WW8PLCFx_FLD::~WW8PLCFx_FLD()
{
    delete pPLCF;
}

ULONG WW8PLCFx_FLD::GetIdx()
{
    return ( pPLCF ) ? pPLCF->GetIdx() : 0;
}

void WW8PLCFx_FLD::SetIdx( ULONG nIdx )
{
    if( pPLCF )
        pPLCF->SetIdx( nIdx );
}

BOOL WW8PLCFx_FLD::SeekPos( WW8_CP nCpPos )
{
    return ( pPLCF ) ? pPLCF->SeekPosExact( nCpPos ) : FALSE;
}

WW8_CP WW8PLCFx_FLD::Where()
{
    return ( pPLCF ) ? pPLCF->Where() : LONG_MAX;
}

long WW8PLCFx_FLD::GetNoSprms( WW8_CP& rStart, long& rEnd, long& rLen )
{
    void* pData;
    ULONG nIdx;

    rLen = 0;
    rEnd = LONG_MAX;                            // Es gibt keine Ende

    if ( !pPLCF ){
        rStart = LONG_MAX;                      // Es gibt keine Felder
        return -1;
    }

    if (!pPLCF->Get( rStart, pData )){
        rStart = LONG_MAX;                      // PLCF fertig abgearbeitet
        return -1;
    }

    nIdx = pPLCF->GetIdx();

    return (long)nIdx;
}

WW8PLCFx& WW8PLCFx_FLD::operator ++( int )
{
    WW8SkipField( *pPLCF );                     // gehe zum naechsten Feld
    return *this;
}

BOOL WW8PLCFx_FLD::GetPara( long nIdx, WW8FieldDesc& rF )
{
    ASSERT( pPLCF, "Aufruf ohne Feld PLCFspecial" );
    if( !pPLCF )
        return FALSE;

    ULONG n = pPLCF->GetIdx();
    pPLCF->SetIdx( (ULONG)nIdx );

    BOOL bOk = WW8GetFieldPara( rFib.nVersion, *pPLCF, rF );
    pPLCF->SetIdx( n );
    return bOk;
}

//-----------------------------------------
//      class WW8PLCF_Book
//-----------------------------------------


// MyMemCpy kopiert immer aufwaerts, d.h. pDest < pSource geht.
/*inline*/ static void MyMemcpy( char* pDest, char* pSource, size_t nCount )
{
    register char* pEnd = pSource + nCount;
    while( pSource < pEnd )
        *pDest++ = *pSource++;
}


// ConvertPStrings() konvertiert ein offenes Array von Pascal-Strings
// in C-Strings. Dieses geschieht am Platz. memcpy wird nicht benutzt,
// da es nach MSC-Hilfe nicht mit ueberlappenden Bereichen umgehen kann,
// memmove kann das, ist aber nicht nach ANSI - Standard.
static void ConvertPStrings( WW8_PSTR** pPS, long nCount )
{
    register WW8_PSTR* pP;
    register long i;
    for( i=0; i<nCount; i++)
    {
        pP = pPS[i];
        BYTE nLen = pP->nLen;
        MyMemcpy( (char*)pP, (char*)pP->cStr, nLen );
        pP->cStr[nLen-1] = 0;
    }
}


char** WW8ReadSTTBF(BOOL bVer8, SvStream& rStrm, UINT32 nStart, INT32  nLen,
        long& rCount, USHORT nSkip,BYTE ***pData)
{
    ULONG nOldPos = rStrm.Tell();
    UINT16 nData = nLen - 2;

    rCount =  0;

    WW8_PSTR** pNameA;
    UINT16 nLen2;

    rStrm.Seek( nStart );
    rStrm >> nLen2; // bVer67: total length of structure
                    // bVer8 : count of strings

    if( bVer8 )
    {
        UINT16 nStrings;
        BOOL bUnicode = (0xFFFF == nLen2);
        if( bUnicode )
            rStrm >> nStrings;
        else
            nStrings = nLen2;

        UINT16 nExtra = 0;
        rCount = nStrings;
        rStrm >> nExtra;

        pNameA = new WW8_PSTR*[ nStrings ];     // alloziere Index-Array
        if (pData)
            *pData = new BYTE*[ nStrings ];

        for(USHORT i=0; i < nStrings; i++)
        {
            BYTE   nBChar;
            UINT16 nStrLen;
            if( bUnicode )
                rStrm >> nStrLen;
            else
            {
                rStrm >> nBChar;
                nStrLen = nBChar;
            }

            UniString aTmp;
            aTmp.AllocStrBuf( nStrLen );

            sal_Unicode* pWStr = aTmp.GetCharStr();

            UINT16  nWChar;
            for( BYTE nIdx = 0; nIdx < nStrLen; ++nIdx, ++pWStr )
            {
                if( bUnicode )
                {
                    rStrm >> nWChar;
                    if( 0xF000 == (nWChar & 0xFF00))
                        nWChar &= 0x00FF;
                    *pWStr = nWChar;
                }
                else
                {
                    rStrm >> nBChar;
                    *pWStr = nBChar;
                }
            }

            // Skip the extra data
            if( nExtra )
            {
                if (pData)
                {
                    (*pData)[i] = new BYTE[ nExtra ];
                    for( BYTE nIdx2 = 0; nIdx2 < nExtra; ++nIdx2 )
                        rStrm >> (*pData)[i][nIdx2];

                }
                else
                    rStrm.SeekRel( nExtra );
            }

            String sConvert( aTmp, CHARSET_ANSI );

            USHORT nActLen = sConvert.Len();
            UINT8* pStr = new UINT8[ nActLen+1 ];

            MyMemcpy( (char*)pStr, (char*)sConvert.GetStr(), nActLen );
            pStr[ nActLen ] = 0;

            pNameA[ i ] = (WW8_PSTR*)pStr;
        }
    }
    else
    {
        WW8_PSTR* pA = (WW8_PSTR*)new char[ nData ];
                                                    // Alloziere Name-Array
        rStrm.Read( pA, nData );        // lies alle Namen

        long nLeft = nData;         // Zaehle, wieviele Namen

        WW8_PSTR* p = pA;

        while( 1 )
        {
            short nNextSiz;

            nNextSiz = p->nLen + 1;
            if( nNextSiz > nLeft )
                break;
            rCount++;
            nLeft -= nNextSiz;
            if( nLeft < 1 )         // naechste Laenge muss gelesen werden koennen
                break;
            p = (WW8_PSTR*)( ( (char*)p ) + nNextSiz + nSkip );
        }

        if( rCount )                        // Keine Eintraege -> kein Array
        {
            pNameA = new WW8_PSTR*[ rCount ];       // alloziere Index-Array

            pNameA[0] = pA;                     // fuelle Index-Array

            short i;
            for( i=1, p=pA; i < rCount; i++)
            {
                p = (WW8_PSTR*)( ( (char*)p ) +  p->nLen + 1 + nSkip );
                pNameA[i] = p;
            }
            ConvertPStrings( pNameA, rCount );
        }
        else
        {
            pNameA = 0;
            delete pA;
        }
    }
    rStrm.Seek( nOldPos );
    return (char**)pNameA;
}


WW8PLCFx_Book::WW8PLCFx_Book( SvStream* pSt, SvStream* pTblSt, WW8Fib& rFib, WW8_CP nStartCp )
: WW8PLCFx( rFib.nVersion, FALSE ), nIsEnd( 0 ),  pStatus( 0 )
{
    if( !rFib.fcPlcfbkf || !rFib.lcbPlcfbkf
        || !rFib.fcPlcfbkl || !rFib.lcbPlcfbkl
        || !rFib.fcSttbfbkmk || !rFib.lcbSttbfbkmk )
    {
        pBook[0] = pBook[1] = 0;
        pBookNames = 0;
        nIMax = 0;
        return;
    }
    pBook[0] = new WW8PLCFspecial( pTblSt, rFib.fcPlcfbkf,
                           rFib.lcbPlcfbkf, 4 );

    pBook[1] = new WW8PLCFspecial( pTblSt, rFib.fcPlcfbkl,
                         rFib.lcbPlcfbkl, 0, -1, TRUE );

    pBookNames = WW8ReadSTTBF(  (7 < rFib.nVersion),
                                *pTblSt,
                                rFib.fcSttbfbkmk,
                                rFib.lcbSttbfbkmk,
                                nIMax );

    if( pBook[0]->GetIMax() < nIMax )   // Anzahl der Bookmarks
        nIMax = pBook[0]->GetIMax();
    if( pBook[1]->GetIMax() < nIMax )
        nIMax = pBook[1]->GetIMax();
    pStatus = new eBookStatus[ nIMax ];
    memset( pStatus, 0, nIMax * sizeof( eBookStatus ) );
}

WW8PLCFx_Book::~WW8PLCFx_Book()
{
    delete[] ( pStatus );
    if( pBookNames )
    {
        for( USHORT i=0, nEnd = (8 > GetVersion()) ? 1 : nIMax; i<nEnd; ++i )
            delete( pBookNames[ i ] );
        delete[]( pBookNames );
    }
    delete( pBook[1] );
    delete( pBook[0] );
}

ULONG WW8PLCFx_Book::GetIdx()
{
    return ( pBookNames ) ? pBook[0]->GetIdx() : 0;
}

void WW8PLCFx_Book::SetIdx( ULONG nI )
{
    if( pBookNames )
        pBook[0]->SetIdx( nI );
}

ULONG WW8PLCFx_Book::GetIdx2()
{
    return ( pBookNames )
            ? ( pBook[1]->GetIdx() | ( ( nIsEnd ) ? 0x80000000 : 0 ) )
            : 0;
}

void WW8PLCFx_Book::SetIdx2( ULONG nI )
{
    if( pBookNames ){
        pBook[1]->SetIdx( nI & 0x7fffffff );
        nIsEnd = (USHORT)( ( nI >> 31 ) & 1 );  // 0 oder 1
    }
}

BOOL WW8PLCFx_Book::SeekPos( WW8_CP nCpPos )
{
    if( !pBook[0] )
        return FALSE;
    BOOL bOk = pBook[0]->SeekPosExact( nCpPos );
    bOk &= pBook[1]->SeekPosExact( nCpPos );
    nIsEnd = 0;

    return bOk;
}

WW8_CP WW8PLCFx_Book::Where()
{
    return pBook[nIsEnd]->Where();
}

long WW8PLCFx_Book::GetNoSprms( long& rStart, long& rEnd, long& rLen )
{
    void* pData;
    rEnd = LONG_MAX;
    rLen = 0;

    if ( !pBook[0] || !pBook[1] || !pBookNames
         || (long)(pBook[nIsEnd]->GetIdx()) >= nIMax ){
        rStart = rEnd = LONG_MAX;
        return -1;
    }

    pBook[nIsEnd]->Get( rStart, pData );    // Pos. abfragen

    return pBook[nIsEnd]->GetIdx();
}

// Der Operator ++ hat eine Tuecke: Wenn 2 Bookmarks aneinandergrenzen, dann
// sollte erst das Ende des ersten und dann der Anfang des 2. erreicht werden.
// Liegen jedoch 2 Bookmarks der Laenge 0 aufeinander, *muss* von jedem Bookmark
// erst der Anfang und dann das Ende gefunden werden.
// Der Fall: ][
//            [...]
//           ][
// ist noch nicht geloest, dabei muesste ich in den Anfangs- und Endindices
// vor- und zurueckspringen, wobei ein weiterer Index oder ein Bitfeld
// oder etwas aehnliches zum Merken der bereits abgearbeiteten Bookmarks
// noetig wird.
WW8PLCFx& WW8PLCFx_Book::operator ++( int )
{
    if( pBook[0] && pBook[1] && pBookNames ){
        (*pBook[nIsEnd])++;

        register ULONG l0 = pBook[0]->Where();
        register ULONG l1 = pBook[1]->Where();
        if( l0 < l1 )
            nIsEnd = 0;
        else if( l1 < l0 )
            nIsEnd = 1;
        else
            nIsEnd = ( nIsEnd ) ? 0 : 1;

//      nIsEnd = ( pBook[1]->Where() <= pBook[0]->Where() ) ? 1 : 0;
    }
    return *this;
}

long WW8PLCFx_Book::GetLen() const
{
    if( nIsEnd ){
        ASSERT( ASS_FALSE, "Falscher Aufruf (1) von PLCF_Book::GetLen()" );
        return 0;
    }
    void * p;
    WW8_CP nStartPos;
    if( !pBook[0]->Get( nStartPos, p ) ){
        ASSERT( ASS_FALSE, "Falscher Aufruf (2) von PLCF_Book::GetLen()" );
        return 0;
    }
    USHORT nEndIdx = SVBT16ToShort( *((SVBT16*)p) );
//  USHORT nEndIdx = *(USHORT*)p;
    return pBook[1]->GetPos( nEndIdx ) - nStartPos;
}

// IgnoreBook ist dafuer da, bei Feldern mit implizitem WW-Bookmark
// die Bookmarks zwischen Anfang und Ende des Feldes zu ignorieren,
// die den angegebenen Namen tragen.
BOOL WW8PLCFx_Book::SetStatus( WW8_CP nStartRegion, WW8_CP nEndRegion, char* pName,
                           eBookStatus eStat )
{
    ASSERT( nStartRegion < LONG_MAX && nEndRegion < LONG_MAX,
            "IgnoreBook mit falschen Parametern" );

    if( !pBook[0] || !pBook[1] )
        return FALSE;

    BOOL bFound = FALSE;
    long i = 0;
    WW8_CP nStartAkt, nEndAkt;
    do{
        void* p;
        USHORT nEndIdx;

        if( pBook[0]->GetData( i, nStartAkt, p ) && p ){
            nEndIdx = SVBT16ToShort( *((SVBT16*)p) );
//          nEndIdx = *((USHORT*)p);
        }
        else
        {
            ASSERT( ASS_FALSE, "Bookmark-EndIdx nicht lesbar" );
            nEndIdx = (USHORT)i;
        }
        nEndAkt = pBook[1]->GetPos( nEndIdx );
        if( nStartAkt >= nStartRegion && nEndAkt <= nEndRegion )
#if defined( UNX) || defined( MAC)
            if ( 0 == svstricmp( pName, pBookNames[i] ) ){
#else
            if ( 0 == stricmp( pName, pBookNames[i] ) ){
#endif
                pStatus[nEndIdx] = (eBookStatus)( pStatus[nEndIdx] | eStat );
                bFound = TRUE;
            }
        i++;
    }while( nStartAkt <= nEndRegion && i < pBook[0]->GetIMax() );
    return bFound;
}

eBookStatus WW8PLCFx_Book::GetStatus() const
{
    if( !pStatus )
        return BOOK_NORMAL;
    long nEndIdx = GetHandle();
    return ( nEndIdx < nIMax ) ? pStatus[nEndIdx] : BOOK_NORMAL;
}

long WW8PLCFx_Book::GetHandle() const
{
    if( !pBook[0] || !pBook[1] )
        return LONG_MAX;

    if( nIsEnd ){
        return pBook[1]->GetIdx();
    }else{
//  BOOL     Get( long& rStart, void*& rpValue );
        const void* p = pBook[0]->GetData( pBook[0]->GetIdx() );
        if( p )
        {
            return SVBT16ToShort( *((SVBT16*)p) );
//          return *((USHORT*)p);
        }
        else
            return LONG_MAX;
    }
}

//-----------------------------------------
//          WW8PLCFMan
//-----------------------------------------

#ifndef DUMP

// Am Ende eines Absatzes reichen bei WW6 die Attribute bis hinter das <CR>.
// Das wird fuer die Verwendung mit dem SW um 1 Zeichen zurueckgesetzt, wenn
// dadurch kein AErger zu erwarten ist.
void WW8PLCFMan::AdjustEnds( WW8PLCFxDesc& rDesc )
{
    if ( (&rDesc == pPap) && rDesc.bRealLineEnd )
    {
        if ( pPap->nEndPos != LONG_MAX )    // Para adjust
        {
            nLineEnd = pPap->nEndPos;       // nLineEnd zeigt *hinter* das <CR>
            pPap->nEndPos--;                // Absatzende um 1 Zeichen verkuerzen

            if( pChp->nEndPos == nLineEnd ) // gibt es bereits ein CharAttr-Ende,
                                            // das auf das jetzige Absatzende zeigt ?
                pChp->nEndPos--;            // ... dann auch um 1 Zeichen verkuerzen

            if( pSep->nEndPos == nLineEnd ) // gibt es bereits ein Sep-Ende,
                                            // das auf das jetzige Absatzende zeigt ?
                pSep->nEndPos--;            // ... dann auch um 1 Zeichen verkuerzen
        }
    }
    else
    if(    (&rDesc == pChp)
        || (&rDesc == pSep) )
    {                                       // Char Adjust oder Sep Adjust
        if(     (rDesc.nEndPos == nLineEnd) // Wenn Ende Char-Attr == Absatzende ...
             && (rDesc.nEndPos > rDesc.nStartPos) )
            rDesc.nEndPos--;                    // ... dann um 1 Zeichen verkuerzen
    }

    if( rDesc.nStartPos > rDesc.nEndPos ){  // allgemeiner Plausibilitaetstest

        //if( gfhdf

        ASSERT( ASS_FALSE, "+Anfang und Ende des WW86-Attributes stehen ueber Kreuz" );
        rDesc.nEndPos = rDesc.nStartPos;
    }
}

void WW8PLCFMan::GetNewSprms( WW8PLCFxDesc& rDesc )
{
    rDesc.pPLCFx->GetSprms( &rDesc );

    //if( rDesc.nStartPos <= rDesc.nEndPos

    ASSERT((LONG_MAX == rDesc.nStartPos) || (rDesc.nStartPos <= rDesc.nEndPos),
            "Attr-Anfang und -Ende ueber Kreuz" );

    if( rDesc.nStartPos != LONG_MAX ) rDesc.nStartPos -= rDesc.nCpOfs;
    if( rDesc.nEndPos   != LONG_MAX ) rDesc.nEndPos   -= rDesc.nCpOfs;

    rDesc.bFirstSprm = TRUE;

    AdjustEnds( rDesc );
}

void WW8PLCFMan::GetNewNoSprms( WW8PLCFxDesc& rDesc )
{
    rDesc.nCp2OrIdx =
        rDesc.pPLCFx->GetNoSprms(rDesc.nStartPos, rDesc.nEndPos,
                                                rDesc.nSprmsLen);

    ASSERT((LONG_MAX == rDesc.nStartPos) || (rDesc.nStartPos <= rDesc.nEndPos),
            "Attr-Anfang und -Ende ueber Kreuz" );

    if( rDesc.nStartPos != LONG_MAX ) rDesc.nStartPos -= rDesc.nCpOfs;
    if( rDesc.nEndPos   != LONG_MAX ) rDesc.nEndPos   -= rDesc.nCpOfs;
    rDesc.bFirstSprm = TRUE;
}

static USHORT GetId( BYTE nVersion, WW8PLCFxDesc* p, short nIdx )
{
    USHORT nId;

    if( p->nSprmsLen > 0 )
        // alt: nId = *p->pMemPos;
        nId = WW8GetSprmId( nVersion, p->pMemPos );
    else
        nId = 0;        // Id = 0 fuer leeres Attribut
    return nId;
}

WW8PLCFMan::WW8PLCFMan( WW8ScannerBase* pBase, short nType, long nStartCp )
{
    pWwFib = pBase->pWw8Fib;

    memset( aD, 0, sizeof( aD ) );
    nLineEnd = LONG_MAX;
    nManType = nType;
    long nCpO;
    USHORT i;

    if( MAN_MAINTEXT == nType )
    {
        // Suchreihenfolge der Attribute
        nPLCF = MAN_ANZ_PLCF;
        pFld = &aD[0];
        pBkm = &aD[1];
        pEdn = &aD[2];
        pFtn = &aD[3];
        pAnd = &aD[4];
        pChp = &aD[5];
        pPap = &aD[6];
        pSep = &aD[7];
        pPcd = ( pBase->pPLCFx_PCD ) ? &aD[8] : 0;
        pPcdA = ( pBase->pPLCFx_PCDAttrs ) ? &aD[9] : 0;
        pSep->pPLCFx = pBase->pSepPLCF;
        pFtn->pPLCFx = pBase->pFtnPLCF;
        pEdn->pPLCFx = pBase->pEdnPLCF;
        pBkm->pPLCFx = pBase->pBook;
        pAnd->pPLCFx = pBase->pAndPLCF;
    }
    else
    {
        // Suchreihenfolge der Attribute
        nPLCF = 7;
        pFld = &aD[0];
        pBkm = ( pBase->pBook ) ? &aD[1] : 0;
        pChp = &aD[2];
        pPap = &aD[3];
        pSep = &aD[4];          // Dummy
        pPcd = ( pBase->pPLCFx_PCD ) ? &aD[5] : 0;
        pPcdA= ( pBase->pPLCFx_PCDAttrs ) ? &aD[6] : 0;
        pAnd = pFtn = pEdn = 0;     // unbenutzt bei SpezText
    }

    pChp->pPLCFx = pBase->pChpPLCF;
    pPap->pPLCFx = pBase->pPapPLCF;
    if( pPcd )
        pPcd->pPLCFx = pBase->pPLCFx_PCD;
    if( pPcdA )
        pPcdA->pPLCFx= pBase->pPLCFx_PCDAttrs;
    if( pBkm )
        pBkm->pPLCFx = pBase->pBook;

    switch( nType )                 // Feld-Initialisierung
    {
    case MAN_HDFT: pFld->pPLCFx = pBase->pFldHdFtPLCF;
                   nCpO     = pWwFib->ccpText + pWwFib->ccpFtn;
                   pFdoa    = pBase->pHdFtFdoa;
                   pTxbx    = pBase->pHdFtTxbx;
                   pTxbxBkd = pBase->pHdFtTxbxBkd;
                   break;
    case MAN_FTN:  pFld->pPLCFx = pBase->pFldFtnPLCF;
                   nCpO     = pWwFib->ccpText;
                   pFdoa    = pTxbx = pTxbxBkd = 0;
                   break;
    case MAN_EDN:  pFld->pPLCFx = pBase->pFldEdnPLCF;
                   nCpO     = pWwFib->ccpText + pWwFib->ccpFtn
                            + pWwFib->ccpHdr + pWwFib->ccpAtn;
                   pFdoa = pTxbx = pTxbxBkd = 0;
                   break;
    case MAN_AND:  pFld->pPLCFx = pBase->pFldAndPLCF;
                   nCpO = pWwFib->ccpText + pWwFib->ccpFtn
                            + pWwFib->ccpHdr;
                   pFdoa = pTxbx = pTxbxBkd = 0;
                   break;


    case MAN_TXBX: pFld->pPLCFx = pBase->pFldTxbxPLCF;
                   nCpO     = pWwFib->ccpText + pWwFib->ccpFtn
                            + pWwFib->ccpHdr + pWwFib->ccpMcr
                            + pWwFib->ccpAtn + pWwFib->ccpEdn;
                   pTxbx    = pBase->pMainTxbx;
                   pTxbxBkd = pBase->pMainTxbxBkd;
                   pFdoa = 0;
                   break;
    case MAN_TXBX_HDFT:
                   pFld->pPLCFx = pBase->pFldTxbxHdFtPLCF;
                   nCpO     = pWwFib->ccpText + pWwFib->ccpFtn
                            + pWwFib->ccpHdr + pWwFib->ccpMcr
                            + pWwFib->ccpAtn + pWwFib->ccpEdn
                            + pWwFib->ccpTxbx;
                   pTxbx    = pBase->pHdFtTxbx;
                   pTxbxBkd = pBase->pHdFtTxbxBkd;
                   pFdoa = 0;
                   break;


    default: pFld->pPLCFx = pBase->pFldPLCF;
                   nCpO = 0;
                   pFdoa    = pBase->pMainFdoa;
                   pTxbx    = pBase->pMainTxbx;
                   pTxbxBkd = pBase->pMainTxbxBkd;
                   break;
    }

    if( nStartCp || nCpO )          // PLCFe auf Text-StartPos einstellen
    {
        pChp->pPLCFx->SeekPos( nStartCp + nCpO ); // Attribute neu
        pPap->pPLCFx->SeekPos( nStartCp + nCpO ); // aufsetzen
        pFld->pPLCFx->SeekPos( nStartCp );
        if( pPcd )
            pPcd->pPLCFx->SeekPos( nStartCp + nCpO );
        if( pBkm )
            pBkm->pPLCFx->SeekPos( nStartCp + nCpO );
    }

    // initialisieren der Member-Vars Low-Level
    GetChpPLCF()->ResetAttrStartEnd();
    GetPapPLCF()->ResetAttrStartEnd();
    for( i=0; i<nPLCF; i++)
    {
        register WW8PLCFxDesc* p = &aD[i];

        p->nCpOfs = ( p == pChp || p == pPap || p == pBkm ) ? nCpO : 0;
        p->nCp2OrIdx = 0;
        p->bFirstSprm = FALSE;
        p->pIdStk = 0;
        p->nStartPos = p->nEndPos = LONG_MAX;
    }

    // initialisieren der Member-Vars High-Level
    for( i=0; i<nPLCF; i++){
        register WW8PLCFxDesc* p = &aD[i];

        if( !p->pPLCFx )
            continue;

        if( p->pPLCFx->IsSprm() )
        {
            p->pIdStk = new UShortStk;  // Vorsicht: nEndPos muss bereits
            GetNewSprms( *p );          // bei allen PLCFen initialisiert sein
        }
        else
        {
            if( p->pPLCFx )
                GetNewNoSprms( *p );
        }
    }
}

WW8PLCFMan::~WW8PLCFMan()
{
    for( USHORT i=0; i<nPLCF; i++)
        delete aD[i].pIdStk;
}

// 0. welche Attr.-Klasse,
// 1. ob ein Attr.-Start ist,
// 2. CP, wo ist naechste Attr.-Aenderung
short WW8PLCFMan::WhereIdx( BOOL* pbStart, long* pPos )
{
    long next = LONG_MAX;   // SuchReihenfolge:
    short nextIdx = -1;     // erst Enden finden ( CHP, PAP, ( SEP ) ),
    BOOL bStart = TRUE;     // dann Anfaenge finden ( ( SEP ), PAP, CHP )
    short i;
    register WW8PLCFxDesc* pD;
    for( i=0; i<(short)nPLCF; i++)
    {
        pD = &aD[i];
        if(     ( pD->nEndPos    < next     )
            &&  ( pD->nStartPos == LONG_MAX ) )
        {   // sonst ist Anfang = Ende
            next = pD->nEndPos;
            nextIdx = i;
            bStart = FALSE;
        }
    }
    for( i=(short)nPLCF-1; i>=0; i--)
    {
        pD = &aD[i];
        if( pD->nStartPos < next ){
            next = pD->nStartPos;
            nextIdx = i;
            bStart = TRUE;
        }
    }
    if( pPos )
        *pPos = next;
    if( pbStart )
        *pbStart = bStart;
    return nextIdx;
}

WW8_CP WW8PLCFMan::Where()      // gibt die CP-Pos der naechsten Attribut-Aenderung zurueck
{
    long l;
    WhereIdx( 0, &l );
    return l;
}

void WW8PLCFMan::Save1PLCFx( WW8PLCFxDesc* p, WW8PLCFxSave1* pSave ) const
{
    if( !p->pPLCFx )
        return;
    pSave->nPLCFxPos = p->pPLCFx->GetIdx();
    pSave->nPLCFxPos2 = p->pPLCFx->GetIdx2();
    if( p->pPLCFx->IsSprm() )
    {
        WW8PLCFxDesc aD;
        p->pPLCFx->GetSprms( &aD );
        pSave->nPLCFxMemOfs = p->pMemPos - aD.pMemPos;
    }
}

void WW8PLCFMan::Restore1PLCFx( WW8PLCFxDesc* p, WW8PLCFxSave1* pSave )
{
    if( !p->pPLCFx )
        return;
    p->pPLCFx->SetIdx( pSave->nPLCFxPos );          // restore PLCF-Pos
    p->pPLCFx->SetIdx2( pSave->nPLCFxPos2 );

    if( p->pPLCFx->IsSprm() ){
        WW8PLCFxDesc aD;
        p->pPLCFx->GetSprms( &aD );
        p->pMemPos = aD.pMemPos + pSave->nPLCFxMemOfs;
    }
}

void WW8PLCFMan::SaveAllPLCFx( WW8PLCFxSaveAll* pSave )
{
    for(USHORT i=0; i<nPLCF; i++)
        Save1PLCFx( &aD[i], &pSave->aS[i] );
}

void WW8PLCFMan::RestoreAllPLCFx( WW8PLCFxSaveAll* pSave )
{
    for(USHORT i=0; i<nPLCF; i++)
        Restore1PLCFx( &aD[i], &pSave->aS[i] );
}

void WW8PLCFMan::GetSprmStart( short nIdx, WW8PLCFManResult* pRes )
{

    // Pruefen !!!

    pRes->nMemLen = 0;

    register WW8PLCFxDesc* p = &aD[nIdx];

    if( p->bFirstSprm ){                    // erster Sprm einer Gruppe
        if( p == pPap )                         // Anfang neuer Pap ?
            pRes->nFlags |= MAN_MASK_NEW_PAP;   // dann muss Aufrufer auf neuen
                                                // Style testen
        else if( p == pSep )                    // Anfang neuer Sep ?
            pRes->nFlags |= MAN_MASK_NEW_SEP;   // dann muss Aufrufer eine neue
                                                // Section / Pagedesc erzeugen
    }
    pRes->pMemPos = p->pMemPos;
    pRes->nSprmId = GetId( pWwFib->nVersion, p, nIdx );
    if( p->nSprmsLen )
        pRes->nMemLen = WW8GetSprmSizeBrutto( pWwFib->nVersion,
                                            pRes->pMemPos,
                                            &pRes->nSprmId ); // Laenge des akt. Sprm
}

void WW8PLCFMan::GetSprmEnd( short nIdx, WW8PLCFManResult* pRes )
{

    // Pruefen !!!

    register WW8PLCFxDesc* p = &aD[nIdx];

    if( p->pIdStk->Count() )
        pRes->nSprmId = p->pIdStk->Top();       // hole Ende-Position
    else
    {
        ASSERT( ASS_FALSE, "Keine Id auf dem Stack" );
        pRes->nSprmId = 0;
    }
}

void WW8PLCFMan::GetNoSprmStart( short nIdx, WW8PLCFManResult* pRes )
{

    // Pruefen !!!

    register WW8PLCFxDesc* p = &aD[nIdx];
//  long nEnd;

//  p->nCp2OrIdx = p->pPLCFx->GetNoSprms( pRes->nCpPos, nEnd, pRes->nMemLen );
//  p->nCp2OrIdx = p->pPLCFx->GetNoSprms( p->nStartPos, p->nEndPos,
//                                              p->nSprmsLen );
//  GetNoSprms( nIdx );
    pRes->nCpPos = p->nStartPos;
    pRes->nMemLen = p->nSprmsLen;
    pRes->nCp2OrIdx = p->nCp2OrIdx;

    if( p == pFld )
        pRes->nSprmId = 258;
    else if( p == pFtn )
        pRes->nSprmId = 256;
    else if( p == pEdn )
        pRes->nSprmId = 257;
    else if( p == pBkm )
        pRes->nSprmId = 259;
    else if( p == pPcd )
        pRes->nSprmId = 260;
    else if( p == pAnd )
        pRes->nSprmId = 261;
    else
        pRes->nSprmId = 0;          // default: nicht gefunden
}

void WW8PLCFMan::GetNoSprmEnd( short nIdx, WW8PLCFManResult* pRes )
{

    // Pruefen !!!

    if( &aD[nIdx] == pBkm )
        pRes->nSprmId = 259;
    else if( &aD[nIdx] == pPcd )
        pRes->nSprmId = 260;
    else
        pRes->nSprmId = 0;

    pRes->nMemLen = -1;     // Ende-Kennzeichen
}


//
void WW8PLCFMan::AdvSprm( short nIdx, BOOL bStart )
{
    register WW8PLCFxDesc* p = &aD[nIdx];   // Sprm-Klasse(!) ermitteln

    p->bFirstSprm = FALSE;
    if( bStart )
    {
        USHORT nLastId = GetId( pWwFib->nVersion, p, nIdx );
        p->pIdStk->Push( nLastId ); // merke Id fuer Attribut-Ende

        if( p->nSprmsLen )
        {   /*
                Pruefe, ob noch Sprm(s) abzuarbeiten sind
            */

            // Laenge des letzten Sprm
            short nSprmL = WW8GetSprmSizeBrutto( pWwFib->nVersion, p->pMemPos, &nLastId );

            // Gesamtlaenge Sprms um SprmLaenge verringern
            p->nSprmsLen -= nSprmL;

            // Pos des evtl. naechsten Sprm
            if( p->nSprmsLen <= 0 )
                p->pMemPos = 0;     // sicherheitshalber auf Null setzen, da Enden folgen!
            else
                p->pMemPos += nSprmL;
        }
        if( p->nSprmsLen <= 0 )
            p->nStartPos = LONG_MAX;    // es folgen Enden
    }
    else
    {
        if( p->pIdStk->Count() )
            p->pIdStk->Pop();
        if( !p->pIdStk->Count() )
        {                       // Kein weiterer Sprm auf dieser Pos ?
            (*p->pPLCFx)++;     // naechste Gruppe von Sprms
            p->pMemPos = 0;     // !!!
            GetNewSprms( *p );
            ASSERT( p->nStartPos <= p->nEndPos, "Attribut ueber Kreuz" );
        }
    }
}

void WW8PLCFMan::AdvNoSprm( short nIdx, BOOL bStart )
{

    // Pruefen !!!

    register WW8PLCFxDesc* p = &aD[nIdx];

    if( p == pPcd ){                        // NoSprm mit Ende
        if( bStart ){
            p->nStartPos = LONG_MAX;
        }else{                              // naechster NoSprm mit Ende
            (*p->pPLCFx)++;
            p->pMemPos = 0;                 // MemPos ungueltig
            GetNewNoSprms( *p );
//          p->nCp2OrIdx = p->pPLCFx->GetNoSprms( p->nStartPos, p->nEndPos,
//                                              p->nSprmsLen );
        }
    }else{                                  // NoSprm ohne Ende
        (*p->pPLCFx)++;
        p->pMemPos = 0;                     // MemPos ungueltig
        GetNewNoSprms( *p );
//      p->nCp2OrIdx = p->pPLCFx->GetNoSprms( p->nStartPos, p->nEndPos,
//                                          p->nSprmsLen );
    }
}

WW8PLCFMan& WW8PLCFMan::operator ++(int)
{
    BOOL bStart;
    short nIdx = WhereIdx( &bStart, 0 );
    if( nPLCF > nIdx )
    {
        register WW8PLCFxDesc* p = &aD[nIdx];

        p->bFirstSprm = TRUE;                       // Default

        if( p->pPLCFx->IsSprm() )
            AdvSprm( nIdx, bStart );
        else                                        // NoSprm
            AdvNoSprm( nIdx, bStart );
    }
    return *this;
}

// Rueckgabe TRUE fuer Anfang eines Attributes oder Fehler,
//           FALSE fuer Ende d. Attr
// Restliche Rueckgabewerte werden in der vom Aufrufer zu stellenden Struktur
// WW8PclxManResults geliefert.
BOOL WW8PLCFMan::Get( WW8PLCFManResult* pRes )
{
    pRes->nMemLen = pRes->nFlags = 0;
    pRes->nCpPos  = 0;                  // Defaults
    pRes->pMemPos = 0;

    BOOL bStart;
    short nIdx = WhereIdx( &bStart, 0 );

    if( nIdx < 0 ){
        ASSERT( ASS_FALSE, "Position nicht gefunden" );
        return TRUE;
    }

    if( aD[nIdx].pPLCFx->IsSprm() ){
        if( bStart ){
            GetSprmStart( nIdx, pRes );
            return TRUE;
        }else{
            GetSprmEnd( nIdx, pRes );
            return FALSE;
        }
    }else{
/*
        if( &aD[nIdx] == pPcd ){            // Piece-Ende
            pRes->nId = -4;
            pRes->nMemLen = ( bStart ) ? 0 : -1;
            return bStart;
        }else
*/
        if( bStart ){
            GetNoSprmStart( nIdx, pRes );
            return TRUE;
        }else{
            GetNoSprmEnd( nIdx, pRes );
            return FALSE;
        }
    }
}

USHORT WW8PLCFMan::GetColl() const
{
    if( pPap->pPLCFx ){
        return  pPap->pPLCFx->GetIstd();
    }else{
        ASSERT( ASS_FALSE, "GetColl ohne PLCF_Pap" );
        return 0;
    }
}

WW8PLCFx_FLD* WW8PLCFMan::GetFld() const
{
    return (WW8PLCFx_FLD*)pFld->pPLCFx;
}

BYTE* WW8PLCFMan::HasParaSprm( USHORT nId ) const
{
    return ((WW8PLCFx_Cp_FKP*)pPap->pPLCFx)->HasSprm( nId );
}

BYTE* WW8PLCFMan::HasCharSprm( USHORT nId ) const
{
    return ((WW8PLCFx_Cp_FKP*)pChp->pPLCFx)->HasSprm( nId );
}

#endif // !DUMP

//-----------------------------------------


WW8Fib::WW8Fib( SvStream& rSt, BYTE nWantedVersion,UINT32 nOffset ): nFibError( 0 )
{
    BYTE aBits1;
    BYTE aBits2;
    BYTE aVer8Bits1;    // nur ab WinWord 8 benutzt
    rSt.Seek( nOffset );
    /*
        Wunsch-Nr vermerken, File-Versionsnummer ermitteln
        und gegen Wunsch-Nr. checken !
    */
    nVersion = nWantedVersion;
    rSt >> wIdent;
    rSt >> nFib;
    rSt >> nProduct;
    if( 0 != rSt.GetError() )
    {
        INT16 nFibMin;
        INT16 nFibMax;
        switch( nVersion )  // beachte: 6 steht fuer "6 ODER 7",  7 steht fuer "NUR 7"
            {
        case 6: nFibMin = 0x0065;   // von 101 WinWord 6.0
                                                            //     102    "
                                                            // und 103 WinWord 6.0 fuer Macintosh
                                                            //     104    "
                    nFibMax = 0x0069;   // bis 105 WinWord 95
                        break;
        case 7: nFibMin = 0x0069;   // von 105 WinWord 95
                        nFibMax = 0x0069;   // bis 105 WinWord 95
                        break;
        case 8: nFibMin = 0x006A;   // von 106 WinWord 97
                        nFibMax = 0x00c1;   // bis 193 WinWord 97 (?)
                        break;
        default:nFibMin = 0;            // Programm-Fehler!
                        nFibMax = 0;
                        nFib    = 1;
                        ASSERT( !this, "Es wurde vergessen, nVersion zu kodieren!" );
        }
        if(    ( nFib < nFibMin )
            || ( nFib > nFibMax ) )
        {
            nFibError = ERR_SWG_READ_ERROR; // Error melden
            return;                         // und hopp raus!
        }
    }

    // praktische Hilfsvariablen:
    BOOL bVer67 = ((6 == nVersion) || (7 == nVersion));
    BOOL bVer8  =  (8 == nVersion);

    // Hilfs-Varis fuer Ver67:
    INT16 pnChpFirst_Ver67;
    INT16 pnPapFirst_Ver67;
    INT16 cpnBteChp_Ver67;
    INT16 cpnBtePap_Ver67;

    // und auf gehts: FIB einlesen
    rSt >> lid;
    rSt >> pnNext;
    rSt >> aBits1;
    rSt >> aBits2;
    rSt >> nFibBack;
    rSt >> lKey1;
    rSt >> lKey2;
    rSt >> envr;
    rSt >> aVer8Bits1;      // unter Ver67  nur leeres Reservefeld
                // Inhalt von aVer8Bits1
                //
                // BYTE fMac              :1;
                // BYTE fEmptySpecial     :1;
                // BYTE fLoadOverridePage :1;
                // BYTE fFuturesavedUndo  :1;
                // BYTE fWord97Saved      :1;
                // BYTE :3;
    rSt >> chse;
    rSt >> chseTables;
    rSt >> fcMin;
    rSt >> fcMac;

// Einschub fuer WW8 *****************************************************
    if( !bVer67 )
    {
        rSt >> csw;

        // Marke: "rgsw"  Beginning of the array of shorts
        rSt >> wMagicCreated;
        rSt >> wMagicRevised;
        rSt >> wMagicCreatedPrivate;
        rSt >> wMagicRevisedPrivate;
        rSt.SeekRel( 9 * sizeof( INT16 ) );

        /*
        // dies sind die 9 unused Felder:
        && (bVer67 || WW8ReadINT16(  rSt, pnFbpChpFirst_W6          ))  // 1
        && (bVer67 || WW8ReadINT16(  rSt, pnChpFirst_W6                 ))  // 2
        && (bVer67 || WW8ReadINT16(  rSt, cpnBteChp_W6                  ))  // 3
        && (bVer67 || WW8ReadINT16(  rSt, pnFbpPapFirst_W6          ))  // 4
        && (bVer67 || WW8ReadINT16(  rSt, pnPapFirst_W6                 ))  // 5
        && (bVer67 || WW8ReadINT16(  rSt, cpnBtePap_W6                  ))  // 6
        && (bVer67 || WW8ReadINT16(  rSt, pnFbpLvcFirst_W6          ))  // 7
        && (bVer67 || WW8ReadINT16(  rSt, pnLvcFirst_W6                 ))  // 8
        && (bVer67 || WW8ReadINT16(  rSt, cpnBteLvc_W6                  ))  // 9
        */
        rSt >> lidFE;
        rSt >> clw;
    }

// Ende des Einschubs fuer WW8 *******************************************

        // Marke: "rglw"  Beginning of the array of longs
    rSt >> cbMac;

        // 2 Longs uebergehen, da unwichtiger Quatsch
    rSt.SeekRel( 2 * sizeof( INT32) );

        // weitere 2 Longs nur bei Ver67 ueberspringen
    if( bVer67 )
        rSt.SeekRel( 2 * sizeof( INT32) );

    rSt >> ccpText;
    rSt >> ccpFtn;
    rSt >> ccpHdr;
    rSt >> ccpMcr;
    rSt >> ccpAtn;
    rSt >> ccpEdn;
    rSt >> ccpTxbx;
    rSt >> ccpHdrTxbx;

        // weiteres Long nur bei Ver67 ueberspringen
    if( bVer67 )
        rSt.SeekRel( 1 * sizeof( INT32) );
    else
    {
// Einschub fuer WW8 *****************************************************
        rSt >> pnFbpChpFirst;
        rSt >> pnChpFirst;
        rSt >> cpnBteChp;
        rSt >> pnFbpPapFirst;
        rSt >> pnPapFirst;
        rSt >> cpnBtePap;
        rSt >> pnFbpLvcFirst;
        rSt >> pnLvcFirst;
        rSt >> cpnBteLvc;
        rSt >> fcIslandFirst;
        rSt >> fcIslandLim;
        rSt >> cfclcb;
    }

// Ende des Einschubs fuer WW8 *******************************************

        // Marke: "rgfclcb" Beginning of array of FC/LCB pairs.
    rSt >> fcStshfOrig;
    rSt >> lcbStshfOrig;
    rSt >> fcStshf;
    rSt >> lcbStshf;
    rSt >> fcPlcffndRef;
    rSt >> lcbPlcffndRef;
    rSt >> fcPlcffndTxt;
    rSt >> lcbPlcffndTxt;
    rSt >> fcPlcfandRef;
    rSt >> lcbPlcfandRef;
    rSt >> fcPlcfandTxt;
    rSt >> lcbPlcfandTxt;
    rSt >> fcPlcfsed;
    rSt >> lcbPlcfsed;
    rSt >> fcPlcfpad;
    rSt >> lcbPlcfpad;
    rSt >> fcPlcfphe;
    rSt >> lcbPlcfphe;
    rSt >> fcSttbfglsy;
    rSt >> lcbSttbfglsy;
    rSt >> fcPlcfglsy;
    rSt >> lcbPlcfglsy;
    rSt >> fcPlcfhdd;
    rSt >> lcbPlcfhdd;
    rSt >> fcPlcfbteChpx;
    rSt >> lcbPlcfbteChpx;
    rSt >> fcPlcfbtePapx;
    rSt >> lcbPlcfbtePapx;
    rSt >> fcPlcfsea;
    rSt >> lcbPlcfsea;
    rSt >> fcSttbfffn;
    rSt >> lcbSttbfffn;
    rSt >> fcPlcffldMom;
    rSt >> lcbPlcffldMom;
    rSt >> fcPlcffldHdr;
    rSt >> lcbPlcffldHdr;
    rSt >> fcPlcffldFtn;
    rSt >> lcbPlcffldFtn;
    rSt >> fcPlcffldAtn;
    rSt >> lcbPlcffldAtn;
    rSt >> fcPlcffldMcr;
    rSt >> lcbPlcffldMcr;
    rSt >> fcSttbfbkmk;
    rSt >> lcbSttbfbkmk;
    rSt >> fcPlcfbkf;
    rSt >> lcbPlcfbkf;
    rSt >> fcPlcfbkl;
    rSt >> lcbPlcfbkl;
    rSt >> fcCmds;
    rSt >> lcbCmds;
    rSt >> fcPlcfmcr;
    rSt >> lcbPlcfmcr;
    rSt >> fcSttbfmcr;
    rSt >> lcbSttbfmcr;
    rSt >> fcPrDrvr;
    rSt >> lcbPrDrvr;
    rSt >> fcPrEnvPort;
    rSt >> lcbPrEnvPort;
    rSt >> fcPrEnvLand;
    rSt >> lcbPrEnvLand;
    rSt >> fcWss;
    rSt >> lcbWss;
    rSt >> fcDop;
    rSt >> lcbDop;
    rSt >> fcSttbfAssoc;
    rSt >> cbSttbfAssoc;
    rSt >> fcClx;
    rSt >> lcbClx;
    rSt >> fcPlcfpgdFtn;
    rSt >> lcbPlcfpgdFtn;
    rSt >> fcAutosaveSource;
    rSt >> lcbAutosaveSource;
    rSt >> fcGrpStAtnOwners;
    rSt >> lcbGrpStAtnOwners;
    rSt >> fcSttbfAtnbkmk;
    rSt >> lcbSttbfAtnbkmk;

        // weiteres short nur bei Ver67 ueberspringen
    if( bVer67 )
    {
        rSt.SeekRel( 1*sizeof( INT16) );

        // folgende 4 Shorts existieren nur bei Ver67;
        rSt >> pnChpFirst_Ver67;
        rSt >> pnPapFirst_Ver67;
        rSt >> cpnBteChp_Ver67;
        rSt >> cpnBtePap_Ver67;
    }

    rSt >> fcPlcfdoaMom;
    rSt >> lcbPlcfdoaMom;
    rSt >> fcPlcfdoaHdr;
    rSt >> lcbPlcfdoaHdr;
    rSt >> fcPlcfspaMom;
    rSt >> lcbPlcfspaMom;
    rSt >> fcPlcfspaHdr;
    rSt >> lcbPlcfspaHdr;

    rSt >> fcPlcfAtnbkf;
    rSt >> lcbPlcfAtnbkf;
    rSt >> fcPlcfAtnbkl;
    rSt >> lcbPlcfAtnbkl;
    rSt >> fcPms;
    rSt >> lcbPMS;
    rSt >> fcFormFldSttbf;
    rSt >> lcbFormFldSttbf;
    rSt >> fcPlcfendRef;
    rSt >> lcbPlcfendRef;
    rSt >> fcPlcfendTxt;
    rSt >> lcbPlcfendTxt;
    rSt >> fcPlcffldEdn;
    rSt >> lcbPlcffldEdn;
    rSt >> fcPlcfpgdEdn;
    rSt >> lcbPlcfpgdEdn;
    rSt >> fcDggInfo;
    rSt >> lcbDggInfo;
    rSt >> fcSttbfRMark;
    rSt >> lcbSttbfRMark;
    rSt >> fcSttbfCaption;
    rSt >> lcbSttbfCaption;
    rSt >> fcSttbAutoCaption;
    rSt >> lcbSttbAutoCaption;
    rSt >> fcPlcfwkb;
    rSt >> lcbPlcfwkb;
    rSt >> fcPlcfspl;
    rSt >> lcbPlcfspl;
    rSt >> fcPlcftxbxTxt;
    rSt >> lcbPlcftxbxTxt;
    rSt >> fcPlcffldTxbx;
    rSt >> lcbPlcffldTxbx;
    rSt >> fcPlcfHdrtxbxTxt;
    rSt >> lcbPlcfHdrtxbxTxt;
    rSt >> fcPlcffldHdrTxbx;
    rSt >> lcbPlcffldHdrTxbx;

    if( 0 == rSt.GetError() )
    {
        // Bit-Flags setzen
        fDot        =   aBits1 & 0x01       ;
        fGlsy       = ( aBits1 & 0x02 ) >> 1;
        fComplex    = ( aBits1 & 0x04 ) >> 2;
        fHasPic     = ( aBits1 & 0x08 ) >> 3;
        cQuickSaves = ( aBits1 & 0xf0 ) >> 4;
        fEncrypted  =   aBits2 & 0x01       ;
        fWhichTblStm= ( aBits2 & 0x02 ) >> 1;
        // dummy    = ( aBits2 & 0x0e ) >> 1;
        fExtChar    = ( aBits2 & 0x10 ) >> 4;
        // dummy    = ( aBits2 & 0xe0 ) >> 5;

        /*
            ggfs. Ziel-Varaiblen, aus xxx_Ver67 fuellen
            oder Flags setzen
        */
        if( bVer67 )
        {
            pnChpFirst = pnChpFirst_Ver67;
            pnPapFirst = pnPapFirst_Ver67;
            cpnBteChp  = cpnBteChp_Ver67;
            cpnBtePap  = cpnBtePap_Ver67;
        }
        else if( bVer8 )
        {
          fMac              =   aVer8Bits1  & 0x01           ;
          fEmptySpecial     = ( aVer8Bits1  & 0x02 ) >> 1;
          fLoadOverridePage = ( aVer8Bits1  & 0x04 ) >> 2;
          fFuturesavedUndo  = ( aVer8Bits1  & 0x08 ) >> 3;
          fWord97Saved      = ( aVer8Bits1  & 0x10 ) >> 4;

            /*
                speziell fuer WW8:
                ermittle die Werte fuer PLCF LST und PLF LFO
                und PLCF fuer TextBox-Break-Deskriptoren
            */
            long nOldPos = rSt.Tell();
            rSt.Seek( 0x02e2 );
            rSt >> fcPlcfLst;
            rSt >> lcbPlcfLst;
            rSt >> fcPlfLfo;
            rSt >> lcbPlfLfo;
            rSt >> fcPlcftxbxBkd;
            rSt >> lcbPlcftxbxBkd;
            rSt >> fcPlcfHdrtxbxBkd;
            rSt >> lcbPlcfHdrtxbxBkd;
            if( 0 != rSt.GetError() )
            {
                nFibError = ERR_SWG_READ_ERROR;
            }

            rSt.Seek( 0x372 );          // fcSttbListNames
            rSt >>  fcSttbListNames;
            rSt >> lcbSttbListNames;
            if( 0 != rSt.GetError() )
                nFibError = ERR_SWG_READ_ERROR;

            rSt.Seek( nOldPos );
        }
    }
    else
    {
        nFibError = ERR_SWG_READ_ERROR;     // Error melden
    }
}


WW8Fib::WW8Fib( BYTE nVer )
{
    memset( this, 0, sizeof( *this ));
    nVersion = nVer;
    if( 8 == nVer )
    {
        fcMin = 0x400;
        wIdent = 0xa5ec;
        nFib = nFibBack = 0xc1;
        nProduct = 0x49;

        csw = 0x0e;     // muss das sein ???
        cfclcb = 0x5d;  //      -""-
        clw = 0x16;     //      -""-
        pnFbpChpFirst = pnFbpPapFirst = pnFbpLvcFirst = 0x000fffff;
        fExtChar = TRUE;

// diese Flags muessen nicht gesetzt werden; koennen aber.
//      wMagicCreated = wMagicRevised = 0x6a62;
//      wMagicCreatedPrivate = wMagicRevisedPrivate = 0xb3b2;
//      fWord97Saved = TRUE;
    }
    else
    {
        fcMin = 0x300;
        wIdent = 0xa5dc;
        nFib = nFibBack = 0x65;
        nProduct = 0xc02d;
    }

    lid = 0x407;
}


BOOL WW8Fib::Write( SvStream& rStrm )
{
    BYTE* pData = new BYTE[ fcMin ];
    BYTE* pDataPtr = pData;
    memset( pData, 0, fcMin );

    BOOL bVer8 = 8 == nVersion;

    ULONG nPos = rStrm.Tell();
    cbMac = rStrm.Seek( STREAM_SEEK_TO_END );
    rStrm.Seek( nPos );

    Set_UInt16( pData, wIdent );
    Set_UInt16( pData, nFib );
    Set_UInt16( pData, nProduct );
    Set_UInt16( pData, lid );
    Set_UInt16( pData, pnNext );

    UINT16 nBits16 = 0;
    if( fDot )          nBits16 |= 0x0001;
    if( fGlsy)          nBits16 |= 0x0002;
    if( fComplex )      nBits16 |= 0x0004;
    if( fHasPic )       nBits16 |= 0x0008;
    nBits16 |= (0xf0 & ( cQuickSaves << 4 ));
    if( fEncrypted )    nBits16 |= 0x0100;
    if( fWhichTblStm )  nBits16 |= 0x0200;
    if( fExtChar )      nBits16 |= 0x1000;
    Set_UInt16( pData, nBits16 );

    Set_UInt16( pData, nFibBack );
    Set_UInt16( pData, lKey1 );
    Set_UInt16( pData, lKey2 );
    Set_UInt8( pData, envr );

    BYTE nBits8 = 0;
    if( bVer8 )
    {
        if( fMac )                  nBits8 |= 0x0001;
        if( fEmptySpecial )         nBits8 |= 0x0002;
        if( fLoadOverridePage )     nBits8 |= 0x0004;
        if( fFuturesavedUndo )      nBits8 |= 0x0008;
        if( fWord97Saved )          nBits8 |= 0x0010;
    }
    Set_UInt8( pData, nBits8  );                // unter Ver67  nur leeres Reservefeld

    Set_UInt16( pData, chse );
    Set_UInt16( pData, chseTables );
    Set_UInt32( pData, fcMin );
    Set_UInt32( pData, fcMac );

// Einschub fuer WW8 *****************************************************

        // Marke: "rgsw"  Beginning of the array of shorts
    if( bVer8 )
    {
        Set_UInt16( pData, csw );
        Set_UInt16( pData, wMagicCreated );
        Set_UInt16( pData, wMagicRevised );
        Set_UInt16( pData, wMagicCreatedPrivate );
        Set_UInt16( pData, wMagicRevisedPrivate );
        pData += 9 * sizeof( INT16 );
        Set_UInt16( pData, lidFE );
        Set_UInt16( pData, clw );
    }

// Ende des Einschubs fuer WW8 *******************************************

        // Marke: "rglw"  Beginning of the array of longs
    Set_UInt32( pData, cbMac );

    // 2 Longs uebergehen, da unwichtiger Quatsch
    pData += 2 * sizeof( INT32);

        // weitere 2 Longs nur bei Ver67 ueberspringen
    if( !bVer8 ) pData += 2 * sizeof( INT32);

    Set_UInt32( pData, ccpText );
    Set_UInt32( pData, ccpFtn );
    Set_UInt32( pData, ccpHdr );
    Set_UInt32( pData, ccpMcr );
    Set_UInt32( pData, ccpAtn );
    Set_UInt32( pData, ccpEdn );
    Set_UInt32( pData, ccpTxbx );
    Set_UInt32( pData, ccpHdrTxbx );

        // weiteres Long nur bei Ver67 ueberspringen
    if( !bVer8 ) pData += 1 * sizeof( INT32);

// Einschub fuer WW8 *****************************************************
    if( bVer8 )
    {
        Set_UInt32( pData, pnFbpChpFirst );
        Set_UInt32( pData, pnChpFirst );
        Set_UInt32( pData, cpnBteChp );
        Set_UInt32( pData, pnFbpPapFirst );
        Set_UInt32( pData, pnPapFirst );
        Set_UInt32( pData, cpnBtePap );
        Set_UInt32( pData, pnFbpLvcFirst );
        Set_UInt32( pData, pnLvcFirst );
        Set_UInt32( pData, cpnBteLvc );
        Set_UInt32( pData, fcIslandFirst );
        Set_UInt32( pData, fcIslandLim );
        Set_UInt16( pData, cfclcb );
    }
// Ende des Einschubs fuer WW8 *******************************************

        // Marke: "rgfclcb" Beginning of array of FC/LCB pairs.
    Set_UInt32( pData, fcStshfOrig );
    Set_UInt32( pData, lcbStshfOrig );
    Set_UInt32( pData, fcStshf );
    Set_UInt32( pData, lcbStshf );
    Set_UInt32( pData, fcPlcffndRef );
    Set_UInt32( pData, lcbPlcffndRef );
    Set_UInt32( pData, fcPlcffndTxt );
    Set_UInt32( pData, lcbPlcffndTxt );
    Set_UInt32( pData, fcPlcfandRef );
    Set_UInt32( pData, lcbPlcfandRef );
    Set_UInt32( pData, fcPlcfandTxt );
    Set_UInt32( pData, lcbPlcfandTxt );
    Set_UInt32( pData, fcPlcfsed );
    Set_UInt32( pData, lcbPlcfsed );
    Set_UInt32( pData, fcPlcfpad );
    Set_UInt32( pData, lcbPlcfpad );
    Set_UInt32( pData, fcPlcfphe );
    Set_UInt32( pData, lcbPlcfphe );
    Set_UInt32( pData, fcSttbfglsy );
    Set_UInt32( pData, lcbSttbfglsy );
    Set_UInt32( pData, fcPlcfglsy );
    Set_UInt32( pData, lcbPlcfglsy );
    Set_UInt32( pData, fcPlcfhdd );
    Set_UInt32( pData, lcbPlcfhdd );
    Set_UInt32( pData, fcPlcfbteChpx );
    Set_UInt32( pData, lcbPlcfbteChpx );
    Set_UInt32( pData, fcPlcfbtePapx );
    Set_UInt32( pData, lcbPlcfbtePapx );
    Set_UInt32( pData, fcPlcfsea );
    Set_UInt32( pData, lcbPlcfsea );
    Set_UInt32( pData, fcSttbfffn );
    Set_UInt32( pData, lcbSttbfffn );
    Set_UInt32( pData, fcPlcffldMom );
    Set_UInt32( pData, lcbPlcffldMom );
    Set_UInt32( pData, fcPlcffldHdr );
    Set_UInt32( pData, lcbPlcffldHdr );
    Set_UInt32( pData, fcPlcffldFtn );
    Set_UInt32( pData, lcbPlcffldFtn );
    Set_UInt32( pData, fcPlcffldAtn );
    Set_UInt32( pData, lcbPlcffldAtn );
    Set_UInt32( pData, fcPlcffldMcr );
    Set_UInt32( pData, lcbPlcffldMcr );
    Set_UInt32( pData, fcSttbfbkmk );
    Set_UInt32( pData, lcbSttbfbkmk );
    Set_UInt32( pData, fcPlcfbkf );
    Set_UInt32( pData, lcbPlcfbkf );
    Set_UInt32( pData, fcPlcfbkl );
    Set_UInt32( pData, lcbPlcfbkl );
    Set_UInt32( pData, fcCmds );
    Set_UInt32( pData, lcbCmds );
    Set_UInt32( pData, fcPlcfmcr );
    Set_UInt32( pData, lcbPlcfmcr );
    Set_UInt32( pData, fcSttbfmcr );
    Set_UInt32( pData, lcbSttbfmcr );
    Set_UInt32( pData, fcPrDrvr );
    Set_UInt32( pData, lcbPrDrvr );
    Set_UInt32( pData, fcPrEnvPort );
    Set_UInt32( pData, lcbPrEnvPort );
    Set_UInt32( pData, fcPrEnvLand );
    Set_UInt32( pData, lcbPrEnvLand );
    Set_UInt32( pData, fcWss );
    Set_UInt32( pData, lcbWss );
    Set_UInt32( pData, fcDop );
    Set_UInt32( pData, lcbDop );
    Set_UInt32( pData, fcSttbfAssoc );
    Set_UInt32( pData, cbSttbfAssoc );
    Set_UInt32( pData, fcClx );
    Set_UInt32( pData, lcbClx );
    Set_UInt32( pData, fcPlcfpgdFtn );
    Set_UInt32( pData, lcbPlcfpgdFtn );
    Set_UInt32( pData, fcAutosaveSource );
    Set_UInt32( pData, lcbAutosaveSource );
    Set_UInt32( pData, fcGrpStAtnOwners );
    Set_UInt32( pData, lcbGrpStAtnOwners );
    Set_UInt32( pData, fcSttbfAtnbkmk );
    Set_UInt32( pData, lcbSttbfAtnbkmk );

        // weiteres short nur bei Ver67 ueberspringen
    if( !bVer8 )
    {
        pData += 1*sizeof( INT16);
        Set_UInt16( pData, (UINT16)pnChpFirst );
        Set_UInt16( pData, (UINT16)pnPapFirst );
        Set_UInt16( pData, (UINT16)cpnBteChp );
        Set_UInt16( pData, (UINT16)cpnBtePap );
    }

    Set_UInt32( pData, fcPlcfdoaMom ); // nur bei Ver67, in Ver8 unused
    Set_UInt32( pData, lcbPlcfdoaMom ); // nur bei Ver67, in Ver8 unused
    Set_UInt32( pData, fcPlcfdoaHdr ); // nur bei Ver67, in Ver8 unused
    Set_UInt32( pData, lcbPlcfdoaHdr ); // nur bei Ver67, in Ver8 unused

    Set_UInt32( pData, fcPlcfspaMom ); // in Ver67 leere Reserve
    Set_UInt32( pData, lcbPlcfspaMom ); // in Ver67 leere Reserve
    Set_UInt32( pData, fcPlcfspaHdr ); // in Ver67 leere Reserve
    Set_UInt32( pData, lcbPlcfspaHdr ); // in Ver67 leere Reserve

    Set_UInt32( pData, fcPlcfAtnbkf );
    Set_UInt32( pData, lcbPlcfAtnbkf );
    Set_UInt32( pData, fcPlcfAtnbkl );
    Set_UInt32( pData, lcbPlcfAtnbkl );
    Set_UInt32( pData, fcPms );
    Set_UInt32( pData, lcbPMS );
    Set_UInt32( pData, fcFormFldSttbf );
    Set_UInt32( pData, lcbFormFldSttbf );
    Set_UInt32( pData, fcPlcfendRef );
    Set_UInt32( pData, lcbPlcfendRef );
    Set_UInt32( pData, fcPlcfendTxt );
    Set_UInt32( pData, lcbPlcfendTxt );
    Set_UInt32( pData, fcPlcffldEdn );
    Set_UInt32( pData, lcbPlcffldEdn );
    Set_UInt32( pData, fcPlcfpgdEdn );
    Set_UInt32( pData, lcbPlcfpgdEdn );
    Set_UInt32( pData, fcDggInfo ); // in Ver67 leere Reserve
    Set_UInt32( pData, lcbDggInfo ); // in Ver67 leere Reserve
    Set_UInt32( pData, fcSttbfRMark );
    Set_UInt32( pData, lcbSttbfRMark );
    Set_UInt32( pData, fcSttbfCaption );
    Set_UInt32( pData, lcbSttbfCaption );
    Set_UInt32( pData, fcSttbAutoCaption );
    Set_UInt32( pData, lcbSttbAutoCaption );
    Set_UInt32( pData, fcPlcfwkb );
    Set_UInt32( pData, lcbPlcfwkb );
    Set_UInt32( pData, fcPlcfspl ); // in Ver67 leere Reserve
    Set_UInt32( pData, lcbPlcfspl ); // in Ver67 leere Reserve
    Set_UInt32( pData, fcPlcftxbxTxt );
    Set_UInt32( pData, lcbPlcftxbxTxt );
    Set_UInt32( pData, fcPlcffldTxbx );
    Set_UInt32( pData, lcbPlcffldTxbx );
    Set_UInt32( pData, fcPlcfHdrtxbxTxt );
    Set_UInt32( pData, lcbPlcfHdrtxbxTxt );
    Set_UInt32( pData, fcPlcffldHdrTxbx );
    Set_UInt32( pData, lcbPlcffldHdrTxbx );

    if( bVer8 )
    {
        pData += 0x2e2 - 0x27a;             // Pos + Offset (fcPlcfLst - fcStwUser)
        Set_UInt32( pData, fcPlcfLst );
        Set_UInt32( pData, lcbPlcfLst );
        Set_UInt32( pData, fcPlfLfo );
        Set_UInt32( pData, lcbPlfLfo );
        Set_UInt32( pData, fcPlcftxbxBkd );
        Set_UInt32( pData, lcbPlcftxbxBkd );
        Set_UInt32( pData, fcPlcfHdrtxbxBkd );
        Set_UInt32( pData, lcbPlcfHdrtxbxBkd );

        pData += 0x372 - 0x302;             // Pos + Offset (fcSttbListNames - fcDocUndo)
        Set_UInt32( pData, fcSttbListNames );
        Set_UInt32( pData, lcbSttbListNames );
    }

    rStrm.Write( pDataPtr, fcMin );
    delete pDataPtr;
    return 0 == rStrm.GetError();
}

//-----------------------------------------


WW8Style::WW8Style( SvStream& rStream, WW8Fib& rFibPara ): rSt( rStream ), rFib( rFibPara )
{
    nStyleStart = rFib.fcStshf;
    nStyleLen   = rFib.lcbStshf;

    rSt.Seek( nStyleStart );

    USHORT cbStshi = 0; //  2 bytes size of the following STSHI structure

    // alte Version ?
    if ( rFib.nFib < 67 )
    {
        cbStshi = 4;    // -> Laengenfeld fehlt
    }
    else    // neue Version:
        // lies die Laenge der in der Datei gespeicherten Struktur
        rSt >> cbStshi;

    UINT16 nRead = cbStshi;
    do
    {
        UINT16 a16Bit;

        if(  2 > nRead ) break;
        rSt >> cstd;

        if(  4 > nRead ) break;
        rSt >> cbSTDBaseInFile;

        if(  6 > nRead ) break;
        rSt >> a16Bit;
        fStdStylenamesWritten = a16Bit & 0x0001;

        if(  8 > nRead ) break;
        rSt >> stiMaxWhenSaved;

        if( 10 > nRead ) break;
        rSt >> istdMaxFixedWhenSaved;

        if( 12 > nRead ) break;
        rSt >> nVerBuiltInNamesWhenSaved;

        if( 14 > nRead ) break;
        rSt >> ftcStandardChpStsh;

        // ggfs. den Rest ueberlesen
        if( 14 < nRead )
            rSt.SeekRel( nRead-14 );
    }
    while( !this ); // Trick: obiger Block wird genau einmal durchlaufen
                                    //   und kann vorzeitig per "break" verlassen werden.

    if( 0 != rSt.GetError() )
    {
        // wie denn nun den Error melden?
    }
}


// Read1STDFixed() liest ein Style ein. Wenn der Style vollstaendig vorhanden
// ist, d.h. kein leerer Slot, dann wird Speicher alloziert und ein Pointer auf
// die ( evtl. mit Nullen aufgefuellten ) STD geliefert. Ist es ein leerer
// Slot, dann wird ein Nullpointer zurueckgeliefert.
WW8_STD* WW8Style::Read1STDFixed( short& rSkip, short* pcbStd )
{
    WW8_STD* pStd = (WW8_STD*)0;

    UINT16 cbStd;
    rSt >> cbStd;   // lies Laenge

    UINT16 nRead = cbSTDBaseInFile;
    if( cbStd >= cbSTDBaseInFile ){ // Fixed part vollst. vorhanden

        // read fixed part of STD
        pStd = new WW8_STD;
        memset( pStd, 0, sizeof( *pStd ) );

        do
        {
            UINT16 a16Bit;

            if( 2 > nRead ) break;
            rSt >> a16Bit;
            pStd->sti          =        a16Bit & 0x0fff  ;
            pStd->fScratch     = 0 != ( a16Bit & 0x1000 );
            pStd->fInvalHeight = 0 != ( a16Bit & 0x2000 );
            pStd->fHasUpe      = 0 != ( a16Bit & 0x4000 );
            pStd->fMassCopy    = 0 != ( a16Bit & 0x8000 );

            if( 4 > nRead ) break;
            rSt >> a16Bit;
            pStd->sgc      =   a16Bit & 0x000f       ;
            pStd->istdBase = ( a16Bit & 0xfff0 ) >> 4;

            if( 6 > nRead ) break;
            rSt >> a16Bit;
            pStd->cupx     =   a16Bit & 0x000f       ;
            pStd->istdNext = ( a16Bit & 0xfff0 ) >> 4;

            if( 8 > nRead ) break;
            rSt >> pStd->bchUpe;

            // ab Ver8 sollten diese beiden Felder dazukommen:
            if(10 > nRead ) break;
            rSt >> a16Bit;
            pStd->fAutoRedef =   a16Bit & 0x0001       ;
            pStd->fHidden    = ( a16Bit & 0x0002 ) >> 2;

            // man kann nie wissen: vorsichtshalber ueberlesen
            // wir eventuelle Fuellsel, die noch zum BASE-Part gehoeren...
            if( 10 < nRead )
                rSt.SeekRel( nRead-10 );
        }
        while( !this ); // Trick: obiger Block wird genau einmal durchlaufen
                                        //   und kann vorzeitig per "break" verlassen werden.

        if(    (0 != rSt.GetError())
            || !nRead )
            DELETEZ( pStd );        // per NULL den Error melden

      rSkip = cbStd - cbSTDBaseInFile;
    }
    else
    {           // Fixed part zu kurz
        if( cbStd )
            rSt.SeekRel( cbStd );           // ueberlies Reste
        rSkip = 0;
    }
    if( pcbStd )
        *pcbStd = cbStd;
    return pStd;
}

WW8_STD* WW8Style::Read1Style( short& rSkip, UINT8** ppStr, short* pcbStd )
{
    WW8_STD* pStd;

    pStd = Read1STDFixed( rSkip, pcbStd );          // lese STD

    // String gewuenscht ?
    if( ppStr )
    {   // echter Style ?
        if ( pStd )
    {

        switch( rFib.nVersion ) // beachte: 6 steht fuer "6 ODER 7",  7 steht fuer "NUR 7"
        {
        case 6:
        case 7: // lies Pasacl-String
                        *ppStr = WW8ReadPString( rSt );
                        rSkip -= (*ppStr)[0]+2;
                        break;
        case 8: // lies Unicode-String mit fuehrendem Laengenbyte
                        *ppStr = WW8Read_xstz( rSt );
                        rSkip -= 1+(((*ppStr)[0] + 1 )* 2);
                        break;
        default:ASSERT( !this, "Es wurde vergessen, nVersion zu kodieren!" );
        }

    }
    else
    {
        *ppStr = (UINT8*)0;                 // Kann keinen Namen liefern
    }
    }
    return pStd;
}


//-----------------------------------------


struct WW8_FFN_Ver6 : public WW8_FFN_BASE
{
    // ab Ver6
    char    szFfn[65];  // 0x6 bzw. 0x40 ab Ver8 zero terminated string that
                                        // records name of font.
                                        // Maximal size of szFfn is 65 characters.
                                        // Vorsicht: Dieses Array kann auch kleiner sein!!!
                                        // Possibly followed by a second sz which records the
                                        // name of an alternate font to use if the first named
                                        // font does not exist on this system.
};
struct WW8_FFN_Ver8 : public WW8_FFN_BASE
{
    // ab Ver8 sind folgende beiden Felder eingeschoben,
    // werden von uns ignoriert.
    char  panose[ 10 ];     //  0x6   PANOSE
    char  fs[ 24     ];     //  0x10  FONTSIGNATURE

    // ab Ver8 als Unicode
    UINT16 szFfn[65];// 0x6 bzw. 0x40 ab Ver8 zero terminated string that
                                        // records name of font.
                                        // Maximal size of szFfn is 65 characters.
                                        // Vorsicht: Dieses Array kann auch kleiner sein!!!
                                        // Possibly followed by a second sz which records the
                                        // name of an alternate font to use if the first named
                                        // font does not exist on this system.
};


// JP 30.07.98: unter UNX ist sal_Unicode kein UNIT16, sondern ein long
void lcl_UIn16ToWChar( UniString& rStr, UINT16* pSrc )
{
    UINT16* p = pSrc, nCnt = 0;
    for( ; *p; ++nCnt, ++p )
        ;
//  rStr.AllocStrBuf( nCnt + 1 );
    rStr.AllocStrBuf( nCnt );
    sal_Unicode* pChar = rStr.GetCharStr();
    for( p = pSrc; nCnt; --nCnt, ++p, ++pChar )
        *pChar = SVBT16ToShort( *(SVBT16*)p );

//  *pChar = 0;
}

WW8Fonts::WW8Fonts( SvStream& rSt, WW8Fib& rFib )
{
    if( rFib.lcbSttbfffn <= 2 )
    {
        ASSERT( ASS_FALSE, "Fonttabelle kaputt! (rFib.lcbSttbfffn < 2)" );
        pFontA = 0;
        nMax = 0;
        return;
    }

    BOOL bVer67 = (8 > rFib.nVersion);

    rSt.Seek( rFib.fcSttbfffn );

    // allocate Font Array
    char* pA   = new char[ rFib.lcbSttbfffn - 2 ];
    WW8_FFN* p = (WW8_FFN*)pA;

    if( !bVer67 )
    {
        // bVer8: read the count of strings in nMax
        rSt >> nMax;
    }

    // Ver8:  skip undefined uint16
    // Ver67: skip the herein stored total byte of structure
    //        - we already got that information in rFib.lcbSttbfffn
    rSt.SeekRel( 2 );

    // read all font information
    rSt.Read( pA, rFib.lcbSttbfffn - 2 );

    if( bVer67 )
    {
        // try to figure out how many fonts are defined here
        nMax = 0;
        long nLeft = rFib.lcbSttbfffn - 2;
        for(;;)
        {
            short nNextSiz;

            nNextSiz = p->cbFfnM1 + 1;
            if( nNextSiz > nLeft )
                break;
            nMax++;
            nLeft -= nNextSiz;
            if( nLeft < 1 )     // can we read the given ammount of bytes ?
                break;
            // increase p by nNextSiz Bytes
            p = (WW8_FFN *)( ( (char*)p ) + nNextSiz );
        }
    }

    if( nMax )
    {
        // allocate Index Array
        pFontA = new WW8_FFN[ nMax ];
        p = pFontA;

        if( bVer67 )
        {
            WW8_FFN_Ver6* pVer6 = (WW8_FFN_Ver6*)pA;
            for(USHORT i=0; i<nMax; ++i, ++p)
            {
                p->cbFfnM1   = pVer6->cbFfnM1;
                p->prg       = pVer6->prg;
                p->fTrueType = pVer6->fTrueType;
                p->ff        = pVer6->ff;
                p->wWeight   = SVBT16ToShort( *(SVBT16*)&pVer6->wWeight );
                p->chs       = pVer6->chs;
                p->ibszAlt   = pVer6->ibszAlt;
                p->sFontname = pVer6->szFfn;
                pVer6 = (WW8_FFN_Ver6*)( ( (char*)pVer6 ) +  pVer6->cbFfnM1 + 1 );
            }
        }
        else
        {
            WW8_FFN_Ver8* pVer8 = (WW8_FFN_Ver8*)pA;
            char c2;
            for(USHORT i=0; i<nMax; ++i, ++p)
            {
                p->cbFfnM1   = pVer8->cbFfnM1;
                c2           = *(((char*)pVer8) + 1);

                p->prg       =  c2 & 0x02;
                p->fTrueType = (c2 & 0x04) >> 2;
                // ein Reserve-Bit ueberspringen
                p->ff        = (c2 & 0x70) >> 4;

                p->wWeight   = SVBT16ToShort( *(SVBT16*)&pVer8->wWeight );
                p->chs       = pVer8->chs;
                p->ibszAlt   = pVer8->ibszAlt;

                ::lcl_UIn16ToWChar( p->sFontname, pVer8->szFfn );

                // Zeiger auf Ursprungsarray einen Font nach hinten setzen
//              (char*)pVer8 += pVer8->cbFfnM1 + 1;
                pVer8 = (WW8_FFN_Ver8*)( ( (char*)pVer8 ) +  pVer8->cbFfnM1 + 1 );
            }
        }
    }
    delete pA;
}

const WW8_FFN* WW8Fonts::GetFont( USHORT nNum ) const
{
    if( !pFontA || nNum > nMax )
        return 0;

    return &pFontA[ nNum ];
}



//-----------------------------------------


// Suche zu einem Header / Footer den Index in der WW-Liste von Headern / Footern
//
// Pferdefuesse bei WinWord6 und -7:
// 1) Am Anfang des Einlesens muss WWPLCF_HdFt mit Fib und Dop konstruiert werden
// 2) Der Haupttext muss sequentiell ueber alle Sections gelesen werden
// 3) Fuer jedes vorkommende Header / Footer - Attribut des Haupttextes
//  ( Darf pro Section maximal eins sein ) muss UpdateIndex() genau einmal
//  mit dem Parameter des Attributes gerufen werden. Dieser Aufruf muss *nach*
//  dem letzten Aufruf von GetTextPos() passieren.
// 4) GetTextPos() darf mit genau einem der obenstehen WW_... aufgerufen werden
//   ( nicht verodern ! )
// -> dann liefert GetTextPos() vielleicht auch ein richtiges Ergebnis

WW8PLCF_HdFt::WW8PLCF_HdFt( SvStream* pSt, WW8Fib& rFib, WW8Dop& rDop )
: aPLCF( pSt, rFib.fcPlcfhdd , rFib.lcbPlcfhdd , 0 )
{
    nIdxOffset = 0;

//  for( BYTE nI = 0x80; nI >= 0x20; nI >>= 1 ) // Beschreibung stimmt nicht

    for( BYTE nI = 0x1; nI <= 0x4; nI <<= 1 )   // Vorsicht: Beschreibung stimmt nicht
        if( nI & rDop.grpfIhdt )                // Bit gesetzt ?
            nIdxOffset++;

    nTextOfs = rFib.ccpText + rFib.ccpFtn; // Groesse des Haupttextes
                                                        // und der Fussnoten
}

BOOL WW8PLCF_HdFt::GetTextPos( BYTE grpfIhdt, BYTE nWhich, WW8_CP& rStart, long& rLen )
{
    BYTE nI = 0x1;
    short nIdx = nIdxOffset;
    while( TRUE ){
        if( nI & nWhich )
            break;                  // gefunden
        if( grpfIhdt & nI )
            nIdx++;                 // uninteressanter Header / Footer
        nI <<= 1;                   // naechstes Bit testen
        if( nI > 0x20 )
            return FALSE;       // nicht gefunden
    }
                                            // nIdx ist HdFt-Index
    WW8_CP ende;
    void* pData;

    aPLCF.SetIdx( nIdx );               // dann suche passenden CP
    aPLCF.Get( rStart, ende, pData );
    rLen = ende - rStart;
// Der letzte Header/Footer hat eine Laenge, die um 1 Zeichen zu gross ist
// ( folgendes CR ). Um diesen passend zu kuerzen muesste man den Index
// dieses K/F-Textes finden ( es ist nicht der letzte im PLCF ! ).
//  if( (long)aPLCF.GetIdx() == aPLCF.GetIMax() )   // Falsch!
//      rLen--;                         // Letztes Element ist 1 zu gross
    aPLCF++;
    return TRUE;
}

BOOL WW8PLCF_HdFt::GetTextPosExact( short nIdx, WW8_CP& rStart, long& rLen )
{
    WW8_CP ende;
    void* pData;

    aPLCF.SetIdx( nIdx );               // dann suche passenden CP
    aPLCF.Get( rStart, ende, pData );
    rLen = ende - rStart;
// Der letzte Header/Footer hat eine Laenge, die um 1 Zeichen zu gross ist
// ( folgendes CR ). Um diesen passend zu kuerzen muesste man den Index
// dieses K/F-Textes finden ( es ist nicht der letzte im PLCF ! ).
//  if( (long)aPLCF.GetIdx() == aPLCF.GetIMax() )   // Falsch!
//      rLen--;                         // Letztes Element ist 1 zu gross
    return TRUE;
}

void WW8PLCF_HdFt::UpdateIndex( BYTE grpfIhdt )
{
    for( BYTE nI = 0x1; nI <= 0x20; nI <<= 1 )  // Vorsicht: Beschreibung stimmt nicht
        if( nI & grpfIhdt )
            nIdxOffset++;
}

//-----------------------------------------
//          WW8Dop
//-----------------------------------------



WW8Dop::WW8Dop( SvStream& rSt, INT16 nFib, INT32 nPos, INT32 nSize )
{
    BYTE* pData = new BYTE[ 500 ];
    BYTE* pDataPtr = pData;
    UINT32 nRead = 500 < nSize ? 500 : nSize;
    rSt.Seek( nPos );
    if( 2 > nSize || nRead != rSt.Read( pData, nRead ))
    {
        memset( &nDataStart, 0, (&nDataEnd - &nDataStart) );
        nDopError = ERR_SWG_READ_ERROR;     // Error melden
    }
    else
    {
        if( 500 > nRead )
            memset( pData + nRead, 0, 500 - nRead );

        // dann mal die Daten auswerten
        UINT32 a32Bit;
        UINT16 a16Bit;
        BYTE   a8Bit;

        a16Bit = Get_UShort( pData );
        fFacingPages        = 0 != ( a16Bit  &  0x0001 )     ;
        fWidowControl       = 0 != ( a16Bit  &  0x0002 )     ;
        fPMHMainDoc         = 0 != ( a16Bit  &  0x0004 )     ;
        grfSuppression      =      ( a16Bit  &  0x0018 ) >> 3;
        fpc                 =      ( a16Bit  &  0x0060 ) >> 5;
        grpfIhdt            =      ( a16Bit  &  0xff00 ) >> 8;

        a16Bit = Get_UShort( pData );
        rncFtn              =   a16Bit  &  0x0003        ;
        nFtn                = ( a16Bit  & ~0x0003 ) >> 2 ;

        a8Bit = Get_Byte( pData );
        fOutlineDirtySave      = 0 != ( a8Bit  &  0x01   );

        a8Bit = Get_Byte( pData );
        fOnlyMacPics           = 0 != ( a8Bit  &  0x01   );
        fOnlyWinPics           = 0 != ( a8Bit  &  0x02   );
        fLabelDoc              = 0 != ( a8Bit  &  0x04   );
        fHyphCapitals          = 0 != ( a8Bit  &  0x08   );
        fAutoHyphen            = 0 != ( a8Bit  &  0x10   );
        fFormNoFields          = 0 != ( a8Bit  &  0x20   );
        fLinkStyles            = 0 != ( a8Bit  &  0x40   );
        fRevMarking            = 0 != ( a8Bit  &  0x80   );

        a8Bit = Get_Byte( pData );
        fBackup                = 0 != ( a8Bit  &  0x01   );
        fExactCWords           = 0 != ( a8Bit  &  0x02   );
        fPagHidden             = 0 != ( a8Bit  &  0x04   );
        fPagResults            = 0 != ( a8Bit  &  0x08   );
        fLockAtn               = 0 != ( a8Bit  &  0x10   );
        fMirrorMargins         = 0 != ( a8Bit  &  0x20   );
        fReadOnlyRecommended   = 0 != ( a8Bit  &  0x40   );
        fDfltTrueType          = 0 != ( a8Bit  &  0x80   );

        a8Bit = Get_Byte( pData );
        fPagSuppressTopSpacing = 0 != ( a8Bit  &  0x01   );
        fProtEnabled           = 0 != ( a8Bit  &  0x02   );
        fDispFormFldSel        = 0 != ( a8Bit  &  0x04   );
        fRMView                = 0 != ( a8Bit  &  0x08   );
        fRMPrint               = 0 != ( a8Bit  &  0x10   );
        fWriteReservation      = 0 != ( a8Bit  &  0x20   );
        fLockRev               = 0 != ( a8Bit  &  0x40   );
        fEmbedFonts            = 0 != ( a8Bit  &  0x80   );


        a8Bit = Get_Byte( pData );
        copts_fNoTabForInd           = 0 != ( a8Bit  &  0x01   );
        copts_fNoSpaceRaiseLower     = 0 != ( a8Bit  &  0x02   );
        copts_fSupressSpbfAfterPgBrk = 0 != ( a8Bit  &  0x04   );
        copts_fWrapTrailSpaces       = 0 != ( a8Bit  &  0x08   );
        copts_fMapPrintTextColor     = 0 != ( a8Bit  &  0x10   );
        copts_fNoColumnBalance       = 0 != ( a8Bit  &  0x20   );
        copts_fConvMailMergeEsc      = 0 != ( a8Bit  &  0x40   );
        copts_fSupressTopSpacing     = 0 != ( a8Bit  &  0x80   );

        a8Bit = Get_Byte( pData );
        copts_fOrigWordTableRules    = 0 != ( a8Bit  &  0x01   );
        copts_fTransparentMetafiles  = 0 != ( a8Bit  &  0x02   );
        copts_fShowBreaksInFrames    = 0 != ( a8Bit  &  0x04   );
        copts_fSwapBordersFacingPgs  = 0 != ( a8Bit  &  0x08   );

        dxaTab = Get_Short( pData );
        wSpare = Get_UShort( pData );
        dxaHotZ = Get_UShort( pData );
        cConsecHypLim = Get_UShort( pData );
        wSpare2 = Get_UShort( pData );
        dttmCreated = Get_Long( pData );
        dttmRevised = Get_Long( pData );
        dttmLastPrint = Get_Long( pData );
        nRevision = Get_Short( pData );
        tmEdited = Get_Long( pData );
        cWords = Get_Long( pData );
        cCh = Get_Long( pData );
        cPg = Get_Short( pData );
        cParas = Get_Long( pData );

        a16Bit = Get_UShort( pData );
        rncEdn =   a16Bit &  0x0003       ;
        nEdn   = ( a16Bit & ~0x0003 ) >> 2;

        a16Bit = Get_UShort( pData );
        epc            =   a16Bit &  0x0003       ;
        nfcFtnRef      = ( a16Bit &  0x003c ) >> 2;
        nfcEdnRef      = ( a16Bit &  0x03c0 ) >> 6;
        fPrintFormData = 0 != ( a16Bit &  0x0400 );
        fSaveFormData  = 0 != ( a16Bit &  0x0800 );
        fShadeFormData = 0 != ( a16Bit &  0x1000 );
        fWCFtnEdn      = 0 != ( a16Bit &  0x8000 );

        cLines = Get_Long( pData );
        cWordsFtnEnd = Get_Long( pData );
        cChFtnEdn = Get_Long( pData );
        cPgFtnEdn = Get_Short( pData );
        cParasFtnEdn = Get_Long( pData );
        cLinesFtnEdn = Get_Long( pData );
        lKeyProtDoc = Get_Long( pData );

        a16Bit = Get_UShort( pData );
        wvkSaved    =   a16Bit &  0x0007        ;
        wScaleSaved = ( a16Bit &  0x0ff8 ) >> 3 ;
        zkSaved     = ( a16Bit &  0x3000 ) >> 12;

        /*
            bei nFib >= 103 gehts weiter:
        */
        if( nFib >= 103 )
        {
            a32Bit = Get_ULong( pData );
            fNoTabForInd                = ( a32Bit &  0x00000001 )       ;
            fNoSpaceRaiseLower          = ( a32Bit &  0x00000002 ) >>  1 ;
            fSupressSpbfAfterPageBreak  = ( a32Bit &  0x00000004 ) >>  2 ;
            fWrapTrailSpaces            = ( a32Bit &  0x00000008 ) >>  3 ;
            fMapPrintTextColor          = ( a32Bit &  0x00000010 ) >>  4 ;
            fNoColumnBalance            = ( a32Bit &  0x00000020 ) >>  5 ;
            fConvMailMergeEsc           = ( a32Bit &  0x00000040 ) >>  6 ;
            fSupressTopSpacing          = ( a32Bit &  0x00000080 ) >>  7 ;
            fOrigWordTableRules         = ( a32Bit &  0x00000100 ) >>  8 ;
            fTransparentMetafiles       = ( a32Bit &  0x00000200 ) >>  9 ;
            fShowBreaksInFrames         = ( a32Bit &  0x00000400 ) >> 10 ;
            fSwapBordersFacingPgs       = ( a32Bit &  0x00000800 ) >> 11 ;
            fSuppressTopSpacingMac5     = ( a32Bit &  0x00010000 ) >> 16 ;
            fTruncDxaExpand             = ( a32Bit &  0x00020000 ) >> 17 ;
            fPrintBodyBeforeHdr         = ( a32Bit &  0x00040000 ) >> 18 ;
            fNoLeading                  = ( a32Bit &  0x00080000 ) >> 19 ;
            fMWSmallCaps                = ( a32Bit &  0x00200000 ) >> 21 ;
        }

        /*
            bei nFib > 105 gehts weiter:
        */
        if( nFib > 105 )
        {
            adt = Get_Short( pData );

            memcpy( &doptypography, pData, sizeof( WW8_DOPTYPOGRAPHY ));
            pData += sizeof( WW8_DOPTYPOGRAPHY );

            memcpy( &dogrid, pData, sizeof( WW8_DOGRID ));
            pData += sizeof( WW8_DOGRID );

            a16Bit = Get_UShort( pData );
            // die untersten 9 Bit sind uninteressant
            fHtmlDoc                = ( a16Bit &  0x0200 ) >>  9 ;
            fSnapBorder             = ( a16Bit &  0x0800 ) >> 11 ;
            fIncludeHeader          = ( a16Bit &  0x1000 ) >> 12 ;
            fIncludeFooter          = ( a16Bit &  0x2000 ) >> 13 ;
            fForcePageSizePag       = ( a16Bit &  0x4000 ) >> 14 ;
            fMinFontSizePag         = ( a16Bit &  0x8000 ) >> 15 ;

            a16Bit = Get_UShort( pData );
            fHaveVersions   = 0 != ( a16Bit  &  0x0001 );
            fAutoVersion    = 0 != ( a16Bit  &  0x0002 );

            pData += 12;

            cChWS = Get_Long( pData );
            cChWSFtnEdn = Get_Long( pData );
            grfDocEvents = Get_Long( pData );

            pData += 4+30+8;

            cDBC = Get_Long( pData );
            cDBCFtnEdn = Get_Long( pData );

            pData += 1 * sizeof( long );

            nfcFtnRef = Get_Short( pData );
            nfcEdnRef = Get_Short( pData );
            hpsZoonFontPag = Get_Short( pData );
            dywDispPag = Get_Short( pData );
        }
    }
    delete pDataPtr;
}

WW8Dop::WW8Dop()
{
    // erstmal alles auf 0 defaulten
    memset( &nDataStart, 0, (&nDataEnd - &nDataStart) );

    fWidowControl = 1;
    fpc = 1;
    nFtn = 1;
    fOutlineDirtySave = 1;
    fHyphCapitals = 1;
    fBackup = 1;
    fPagHidden = 1;
    fPagResults = 1;
    fDfltTrueType = 1;
    fRMView = 1;
    fRMPrint = 1;
    dxaTab = 0x2d0;
    dxaHotZ = 0x168;
    dttmCreated = 0x45FBAC69;
    dttmRevised = 0x45FBAC69;
    nRevision = 1;
    nEdn = 1;

    epc = 3;
    nfcEdnRef = 2;
    fShadeFormData = 1;

    wvkSaved = 2;
    wScaleSaved = 100;
    zkSaved = 0;

    lvl = 9;
    fIncludeHeader = 1;
    fIncludeFooter = 1;

    cChWS = /**!!**/ 0;
    cChWSFtnEdn = /**!!**/ 0;

    cDBC = /**!!**/ 0;
    cDBCFtnEdn = /**!!**/ 0;
}

BOOL WW8Dop::Write( SvStream& rStrm, WW8Fib& rFib )
{
    INT32 nLen = 8 == rFib.nVersion ? 500 : 84;
    rFib.fcDop =  rStrm.Tell();
    rFib.lcbDop = nLen;

    BYTE aData[ 500 ];
    memset( aData, 0, 500 );
    BYTE* pData = aData;

    // dann mal die Daten auswerten
    UINT32 a32Bit;
    UINT16 a16Bit;
    BYTE   a8Bit;

    a16Bit = 0;
    if( fFacingPages )      a16Bit |= 0x0001;
    if( fWidowControl )     a16Bit |= 0x0002;
    if( fPMHMainDoc )       a16Bit |= 0x0004;
    a16Bit |= ( 0x0018 & (grfSuppression << 3));
    a16Bit |= ( 0x0060 & (fpc << 5));
    a16Bit |= ( 0xff00 & (grpfIhdt << 8));
    Set_UInt16( pData, a16Bit );

    a16Bit = 0;
    a16Bit |= ( 0x0003 & rncFtn );
    a16Bit |= ( ~0x0003 & (nFtn << 2));
    Set_UInt16( pData, a16Bit );

    a8Bit = 0;
    if( fOutlineDirtySave ) a8Bit |= 0x01;
    Set_UInt8( pData, a8Bit );

    a8Bit = 0;
    if( fOnlyMacPics )  a8Bit |= 0x01;
    if( fOnlyWinPics )  a8Bit |= 0x02;
    if( fLabelDoc )     a8Bit |= 0x04;
    if( fHyphCapitals ) a8Bit |= 0x08;
    if( fAutoHyphen )   a8Bit |= 0x10;
    if( fFormNoFields ) a8Bit |= 0x20;
    if( fLinkStyles )   a8Bit |= 0x40;
    if( fRevMarking )   a8Bit |= 0x80;
    Set_UInt8( pData, a8Bit );

    a8Bit = 0;
    if( fBackup )               a8Bit |= 0x01;
    if( fExactCWords )          a8Bit |= 0x02;
    if( fPagHidden )            a8Bit |= 0x04;
    if( fPagResults )           a8Bit |= 0x08;
    if( fLockAtn )              a8Bit |= 0x10;
    if( fMirrorMargins )        a8Bit |= 0x20;
    if( fReadOnlyRecommended )  a8Bit |= 0x40;
    if( fDfltTrueType )         a8Bit |= 0x80;
    Set_UInt8( pData, a8Bit );

    a8Bit = 0;
    if( fPagSuppressTopSpacing )    a8Bit |= 0x01;
    if( fProtEnabled )              a8Bit |= 0x02;
    if( fDispFormFldSel )           a8Bit |= 0x04;
    if( fRMView )                   a8Bit |= 0x08;
    if( fRMPrint )                  a8Bit |= 0x10;
    if( fWriteReservation )         a8Bit |= 0x20;
    if( fLockRev )                  a8Bit |= 0x40;
    if( fEmbedFonts )               a8Bit |= 0x80;
    Set_UInt8( pData, a8Bit );


    a8Bit = 0;
    if( copts_fNoTabForInd )            a8Bit |= 0x01;
    if( copts_fNoSpaceRaiseLower )      a8Bit |= 0x02;
    if( copts_fSupressSpbfAfterPgBrk )  a8Bit |= 0x04;
    if( copts_fWrapTrailSpaces )        a8Bit |= 0x08;
    if( copts_fMapPrintTextColor )      a8Bit |= 0x10;
    if( copts_fNoColumnBalance )        a8Bit |= 0x20;
    if( copts_fConvMailMergeEsc )       a8Bit |= 0x40;
    if( copts_fSupressTopSpacing )      a8Bit |= 0x80;
    Set_UInt8( pData, a8Bit );

    a8Bit = 0;
    if( copts_fOrigWordTableRules )     a8Bit |= 0x01;
    if( copts_fTransparentMetafiles )   a8Bit |= 0x02;
    if( copts_fShowBreaksInFrames )     a8Bit |= 0x04;
    if( copts_fSwapBordersFacingPgs )   a8Bit |= 0x08;
    Set_UInt8( pData, a8Bit );

    Set_UInt16( pData, dxaTab );
    Set_UInt16( pData, wSpare );
    Set_UInt16( pData, dxaHotZ );
    Set_UInt16( pData, cConsecHypLim );
    Set_UInt16( pData, wSpare2 );
    Set_UInt32( pData, dttmCreated );
    Set_UInt32( pData, dttmRevised );
    Set_UInt32( pData, dttmLastPrint );
    Set_UInt16( pData, nRevision );
    Set_UInt32( pData, tmEdited );
    Set_UInt32( pData, cWords );
    Set_UInt32( pData, cCh );
    Set_UInt16( pData, cPg );
    Set_UInt32( pData, cParas );

    a16Bit = 0;
    a16Bit |= ( 0x0003 & rncEdn );
    a16Bit |= (~0x0003 & ( nEdn << 2));
    Set_UInt16( pData, a16Bit );

    a16Bit = 0;
    a16Bit |= (0x0003 & epc );
    a16Bit |= (0x003c & (nfcFtnRef << 2));
    a16Bit |= (0x03c0 & (nfcEdnRef << 6));
    if( fPrintFormData )    a16Bit |= 0x0400;
    if( fSaveFormData )     a16Bit |= 0x0800;
    if( fShadeFormData )    a16Bit |= 0x1000;
    if( fWCFtnEdn )         a16Bit |= 0x8000;
    Set_UInt16( pData, a16Bit );

    Set_UInt32( pData, cLines );
    Set_UInt32( pData, cWordsFtnEnd );
    Set_UInt32( pData, cChFtnEdn );
    Set_UInt16( pData, cPgFtnEdn );
    Set_UInt32( pData, cParasFtnEdn );
    Set_UInt32( pData, cLinesFtnEdn );
    Set_UInt32( pData, lKeyProtDoc );

    a16Bit = 0;
    if( wvkSaved )  a16Bit |= 0x0007;
    a16Bit |= (0x0ff8 & (wScaleSaved << 3));
    a16Bit |= (0x3000 & (zkSaved << 12));
    Set_UInt16( pData, a16Bit );

    if( 8 == rFib.nVersion )
    {
        a32Bit = 0;
        if( fNoTabForInd )                  a32Bit |= 0x00000001;
        if( fNoSpaceRaiseLower )            a32Bit |= 0x00000002;
        if( fSupressSpbfAfterPageBreak )    a32Bit |= 0x00000004;
        if( fWrapTrailSpaces )              a32Bit |= 0x00000008;
        if( fMapPrintTextColor )            a32Bit |= 0x00000010;
        if( fNoColumnBalance )              a32Bit |= 0x00000020;
        if( fConvMailMergeEsc )             a32Bit |= 0x00000040;
        if( fSupressTopSpacing )            a32Bit |= 0x00000080;
        if( fOrigWordTableRules )           a32Bit |= 0x00000100;
        if( fTransparentMetafiles )         a32Bit |= 0x00000200;
        if( fShowBreaksInFrames )           a32Bit |= 0x00000400;
        if( fSwapBordersFacingPgs )         a32Bit |= 0x00000800;
        if( fSuppressTopSpacingMac5 )       a32Bit |= 0x00010000;
        if( fTruncDxaExpand )               a32Bit |= 0x00020000;
        if( fPrintBodyBeforeHdr )           a32Bit |= 0x00040000;
        if( fNoLeading )                    a32Bit |= 0x00080000;
        if( fMWSmallCaps )                  a32Bit |= 0x00200000;
        Set_UInt32( pData, a32Bit );

        Set_UInt16( pData, adt );

        memcpy( pData, &doptypography, sizeof( WW8_DOPTYPOGRAPHY ));
        pData += sizeof( WW8_DOPTYPOGRAPHY );

        memcpy( pData, &dogrid, sizeof( WW8_DOGRID ));
        pData += sizeof( WW8_DOGRID );

        a16Bit = 0x12;      // lvl auf 9 setzen
        if( fHtmlDoc )          a16Bit |= 0x0200;
        if( fSnapBorder )       a16Bit |= 0x0800;
        if( fIncludeHeader )    a16Bit |= 0x1000;
        if( fIncludeFooter )    a16Bit |= 0x2000;
        if( fForcePageSizePag ) a16Bit |= 0x4000;
        if( fMinFontSizePag )   a16Bit |= 0x8000;
        Set_UInt16( pData, a16Bit );

        a16Bit = 0;
        if( fHaveVersions ) a16Bit |= 0x0001;
        if( fAutoVersion )  a16Bit |= 0x0002;
        Set_UInt16( pData, a16Bit );

        pData += 12;

        Set_UInt32( pData, cChWS );
        Set_UInt32( pData, cChWSFtnEdn );
        Set_UInt32( pData, grfDocEvents );

        pData += 4+30+8;

        Set_UInt32( pData, cDBC );
        Set_UInt32( pData, cDBCFtnEdn );

        pData += 1 * sizeof( long );

        Set_UInt16( pData, nfcFtnRef );
        Set_UInt16( pData, nfcEdnRef );
        Set_UInt16( pData, hpsZoonFontPag );
        Set_UInt16( pData, dywDispPag );
    }
    rStrm.Write( aData, nLen );
    return 0 == rStrm.GetError();
}

/***************************************************************************
#       Array zum Bestimmen der Laenge der SPRMs
#**************************************************************************/


/*
    Werte fuer SprmInfo.nVari
*/
#define L_FIX  0
#define L_VAR  1
#define L_VAR2 2

struct SprmInfo
{
    USHORT nId;
    BYTE   nLen : 6;
    BYTE   nVari: 2;
};


/*
    Zweck: Laenge und Parameter-Offset eines Sprm erfahren
*/
static SprmInfo aWwSprmTab[] = {
       0, 0, L_FIX, // "Default-sprm",  // wird uebersprungen
       2, 2, L_FIX, // "sprmPIstd",  // pap.istd (style code)
       3, 3, L_VAR, // "sprmPIstdPermute", // pap.istd  permutation
       4, 1, L_FIX, //  "sprmPIncLv1", // pap.istddifference
       5, 1, L_FIX, //  "sprmPJc", // pap.jc (justification)
       6, 1, L_FIX, //  "sprmPFSideBySide", // pap.fSideBySide
       7, 1, L_FIX, //  "sprmPFKeep", // pap.fKeep
       8, 1, L_FIX, //  "sprmPFKeepFollow ", // pap.fKeepFollow
       9, 1, L_FIX, //  "sprmPPageBreakBefore", // pap.fPageBreakBefore

      10, 1, L_FIX, // "sprmPBrcl", //  pap.brcl
      11, 1, L_FIX, // "sprmPBrcp ", // pap.brcp
      12, 0, L_VAR, // "sprmPAnld", //  pap.anld (ANLD structure)
      13, 1, L_FIX, //  "sprmPNLvlAnm", // pap.nLvlAnm nn
      14, 1, L_FIX, //  "sprmPFNoLineNumb", //ap.fNoLnn


      // ???
      15, 0, L_VAR, //   "?sprmPChgTabsPapx", // pap.itbdMac, ...


      16, 2, L_FIX, //  "sprmPDxaRight", // pap.dxaRight
      17, 2, L_FIX, //  "sprmPDxaLeft", // pap.dxaLeft
      18, 2, L_FIX, //  "sprmPNest", // pap.dxaLeft
      19, 2, L_FIX, //  "sprmPDxaLeft1", // pap.dxaLeft1

      20, 4, L_FIX, //  "sprmPDyaLine", // pap.lspd an LSPD
      21, 2, L_FIX, //  "sprmPDyaBefore", // pap.dyaBefore
      22, 2, L_FIX, //  "sprmPDyaAfter", // pap.dyaAfter


      // ???
      23, 0, L_VAR, // "?sprmPChgTabs", // pap.itbdMac, pap.rgdxaTab, ...


      24, 1, L_FIX, //  "sprmPFInTable", // pap.fInTable
      25, 1, L_FIX, //  "sprmPTtp", // pap.fTtp
      26, 2, L_FIX, //  "sprmPDxaAbs", // pap.dxaAbs
      27, 2, L_FIX, //  "sprmPDyaAbs", // pap.dyaAbs
      28, 2, L_FIX, // "sprmPDxaWidth", // pap.dxaWidth
      29, 1, L_FIX, // "sprmPPc", // pap.pcHorz, pap.pcVert

      30, 2, L_FIX, // "sprmPBrcTop10", // pap.brcTop BRC10
      31, 2, L_FIX, // "sprmPBrcLeft10", // pap.brcLeft BRC10
      32, 2, L_FIX, // "sprmPBrcBottom10", // pap.brcBottom BRC10
      33, 2, L_FIX, // "sprmPBrcRight10", // pap.brcRight BRC10
      34, 2, L_FIX, // "sprmPBrcBetween10", // pap.brcBetween BRC10
      35, 2, L_FIX, // "sprmPBrcBar10", // pap.brcBar BRC10
      36, 2, L_FIX, // "sprmPFromText10", // pap.dxaFromText dxa
      37, 1, L_FIX, // "sprmPWr", // pap.wr wr
      38, 2, L_FIX, // "sprmPBrcTop", // pap.brcTop BRC
      39, 2, L_FIX, // "sprmPBrcLeft", // pap.brcLeft BRC

      40, 2, L_FIX, // "sprmPBrcBottom", // pap.brcBottom BRC
      41, 2, L_FIX, // "sprmPBrcRight", // pap.brcRight BRC
      42, 2, L_FIX, // "sprmPBrcBetween", // pap.brcBetween BRC
      43, 2, L_FIX, // "sprmPBrcBar",//pap.brcBar BRC word
      44, 1, L_FIX, //  "sprmPFNoAutoHyph",//pap.fNoAutoHyph
      45, 2, L_FIX, //  "sprmPWHeightAbs",//pap.wHeightAbs w
      46, 2, L_FIX, // "sprmPDcs",//pap.dcs DCS
      47, 2, L_FIX, // "sprmPShd",//pap.shd SHD
      48, 2, L_FIX, //  "sprmPDyaFromText",//pap.dyaFromText dya
      49, 2, L_FIX, //  "sprmPDxaFromText",//pap.dxaFromText dxa

      50, 1, L_FIX, //  "sprmPFLocked", // pap.fLocked 0 or 1 byte

      51, 1, L_FIX, //  "sprmPFWidowControl", // pap.fWidowControl 0 or 1 byte


      // ???
    52, 0, L_FIX, // "?sprmPRuler 52", //???


      65, 1, L_FIX, //  "sprmCFStrikeRM", // chp.fRMarkDel 1 or 0 bit
      66, 1, L_FIX, //  "sprmCFRMark", // chp.fRMark 1 or 0 bit
      67, 1, L_FIX, //  "sprmCFFldVanish", // chp.fFldVanish 1 or 0 bit
      68, 0, L_VAR, // "sprmCPicLocation", // chp.fcPic and chp.fSpec
      69, 2, L_FIX, // "sprmCIbstRMark", // chp.ibstRMark index into sttbRMark

      70, 4, L_FIX, // "sprmCDttmRMark", // chp.dttm DTTM long
      71, 1, L_FIX, //  "sprmCFData", // chp.fData 1 or 0 bit
      72, 2, L_FIX, // "sprmCRMReason", // chp.idslRMReason an index to a table
      73, 3, L_FIX, // "sprmCChse", // chp.fChsDiff and chp.chse see below 3 bytes
      74, 0, L_VAR, // "sprmCSymbol", // chp.fSpec, chp.chSym and chp.ftcSym
      75, 1, L_FIX, //  "sprmCFOle2", // chp.fOle2 1 or 0   bit

      80, 2, L_FIX, // "sprmCIstd", // chp.istd istd, see stylesheet definition short
      81, 0, L_VAR, // "sprmCIstdPermute", // chp.istd permutation vector (see below)
      82, 0, L_VAR, // "sprmCDefault", // whole CHP (see below) none variable length
      83, 0, L_FIX, // "sprmCPlain", // whole CHP (see below) none 0
      85, 1, L_FIX, // "sprmCFBold", // chp.fBold 0,1, 128, or 129 (see below) byte
      86, 1, L_FIX, //"sprmCFItalic", // chp.fItalic 0,1, 128, or 129 (see below) byte
      87, 1, L_FIX, // "sprmCFStrike", // chp.fStrike 0,1, 128, or 129 (see below) byte
      88, 1, L_FIX, // "sprmCFOutline", // chp.fOutline 0,1, 128, or 129 (see below) byte
      89, 1, L_FIX, // "sprmCFShadow", // chp.fShadow 0,1, 128, or 129 (see below) byte

      90, 1, L_FIX, // "sprmCFSmallCaps", // chp.fSmallCaps 0,1, 128, or 129 (see below) byte
      91, 1, L_FIX, // "sprmCFCaps", // chp.fCaps 0,1, 128, or 129 (see below) byte
      92, 1, L_FIX, // "sprmCFVanish", // chp.fVanish 0,1, 128, or 129 (see below) byte
      93, 2, L_FIX, // "sprmCFtc", // chp.ftc ftc word
      94, 1, L_FIX, // "sprmCKul", // chp.kul kul byte
      95, 3, L_FIX, // "sprmCSizePos", // chp.hps, chp.hpsPos (see below) 3 bytes
      96, 2, L_FIX, //  "sprmCDxaSpace", // chp.dxaSpace dxa word
      97, 2, L_FIX, //  "sprmCLid", // chp.lid LID word
      98, 1, L_FIX, //  "sprmCIco", // chp.ico ico byte
      99, 2, L_FIX, // "sprmCHps", // chp.hps hps !word!


     100, 1, L_FIX, //  "sprmCHpsInc", // chp.hps (see below) byte
     101, 2, L_FIX, //  "sprmCHpsPos", // chp.hpsPos hps !word!
     102, 1, L_FIX, //  "sprmCHpsPosAdj", // chp.hpsPos hps (see below) byte


     // ???
     103, 0, L_VAR, // "?sprmCMajority", // chp.fBold, chp.fItalic, chp.fSmallCaps, ...


     104, 1, L_FIX, //  "sprmCIss", // chp.iss iss byte
     105, 0, L_VAR, // "sprmCHpsNew50", // chp.hps hps variable width, length always recorded as 2
     106, 0, L_VAR, // "sprmCHpsInc1", // chp.hps complex (see below) variable width, length always recorded as 2
     107, 2, L_FIX, // "sprmCHpsKern", // chp.hpsKern hps short
     108, 0, L_VAR, // "sprmCMajority50", // chp.fBold, chp.fItalic, chp.fSmallCaps, chp.fVanish, ...
     109, 2, L_FIX, // "sprmCHpsMul", // chp.hps percentage to grow hps short

     110, 2, L_FIX, // "sprmCCondHyhen", // chp.ysri ysri short
     117, 1, L_FIX, //  "sprmCFSpec", // chp.fSpec  1 or 0 bit
     118, 1, L_FIX, //  "sprmCFObj", // chp.fObj 1 or 0 bit
     119, 1, L_FIX, // "sprmPicBrcl", // pic.brcl brcl (see PIC structure definition) byte

     120,12, L_VAR, // "sprmPicScale", // pic.mx, pic.my, pic.dxaCropleft,
     121, 2, L_FIX, // "sprmPicBrcTop", // pic.brcTop BRC word
     122, 2, L_FIX, // "sprmPicBrcLeft", // pic.brcLeft BRC word
     123, 2, L_FIX, // "sprmPicBrcBottom", // pic.brcBottom BRC word
     124, 2, L_FIX, // "sprmPicBrcRight", // pic.brcRight BRC word

     131, 1, L_FIX, //  "sprmSScnsPgn", // sep.cnsPgn cns byte
     132, 1, L_FIX, // "sprmSiHeadingPgn", // sep.iHeadingPgn heading number level byte
     133, 0, L_VAR, // "sprmSOlstAnm", // sep.olstAnm OLST variable length
     136, 3, L_FIX, // "sprmSDxaColWidth", // sep.rgdxaColWidthSpacing complex (see below) 3 bytes
     137, 3, L_FIX, // "sprmSDxaColSpacing", // sep.rgdxaColWidthSpacing complex (see below) 3 bytes
     138, 1, L_FIX, //  "sprmSFEvenlySpaced", // sep.fEvenlySpaced 1 or 0 byte
     139, 1, L_FIX, //  "sprmSFProtected", // sep.fUnlocked 1 or 0 byte

     140, 2, L_FIX, //  "sprmSDmBinFirst", // sep.dmBinFirst  word
     141, 2, L_FIX, //  "sprmSDmBinOther", // sep.dmBinOther  word
     142, 1, L_FIX, //  "sprmSBkc", // sep.bkc bkc byte
     143, 1, L_FIX, //  "sprmSFTitlePage", // sep.fTitlePage 0 or 1 byte
     144, 2, L_FIX, //  "sprmSCcolumns", // sep.ccolM1 # of cols - 1 word
     145, 2, L_FIX, //  "sprmSDxaColumns", // sep.dxaColumns dxa word
     146, 1, L_FIX, // "sprmSFAutoPgn", // sep.fAutoPgn obsolete byte
     147, 1, L_FIX, //  "sprmSNfcPgn", // sep.nfcPgn nfc byte
     148, 2, L_FIX, // "sprmSDyaPgn", // sep.dyaPgn dya short
     149, 2, L_FIX, // "sprmSDxaPgn", // sep.dxaPgn dya short


     150, 1, L_FIX, //  "sprmSFPgnRestart", // sep.fPgnRestart 0 or 1 byte
     151, 1, L_FIX, //  "sprmSFEndnote", // sep.fEndnote 0 or 1 byte
     152, 1, L_FIX, //  "sprmSLnc", // sep.lnc lnc byte
     153, 1, L_FIX, // "sprmSGprfIhdt", // sep.grpfIhdt grpfihdt (see Headers and Footers topic) byte
     154, 2, L_FIX, //  "sprmSNLnnMod", // sep.nLnnMod non-neg int. word
     155, 2, L_FIX, // "sprmSDxaLnn", // sep.dxaLnn dxa word
     156, 2, L_FIX, //  "sprmSDyaHdrTop", // sep.dyaHdrTop dya word
     157, 2, L_FIX, //  "sprmSDyaHdrBottom", // sep.dyaHdrBottom dya word
     158, 1, L_FIX, //  "sprmSLBetween", // sep.fLBetween 0 or 1 byte
     159, 1, L_FIX, //  "sprmSVjc", // sep.vjc vjc byte

     160, 2, L_FIX, //  "sprmSLnnMin", // sep.lnnMin lnn word
     161, 2, L_FIX, //  "sprmSPgnStart", // sep.pgnStart pgn word
     162, 1, L_FIX, //  "sprmSBOrientation", // sep.dmOrientPage dm byte
     163, 0, L_FIX, //  "?SprmSBCustomize 163", //???
     164, 2, L_FIX, //  "sprmSXaPage", // sep.xaPage xa word
     165, 2, L_FIX, //  "sprmSYaPage", // sep.yaPage ya word
     166, 2, L_FIX, //  "sprmSDxaLeft", // sep.dxaLeft dxa word
     167, 2, L_FIX, //  "sprmSDxaRight", // sep.dxaRight dxa word
     168, 2, L_FIX, //  "sprmSDyaTop", // sep.dyaTop dya word
     169, 2, L_FIX, //  "sprmSDyaBottom", // sep.dyaBottom dya word

     170, 2, L_FIX, //  "sprmSDzaGutter", // sep.dzaGutter dza word
     171, 2, L_FIX, //  "sprmSDMPaperReq", // sep.dmPaperReq dm word

     182, 2, L_FIX, //  "sprmTJc", // tap.jc jc word (low order byte is significant)
     183, 2, L_FIX, //  "sprmTDxaLeft", // tap.rgdxaCenter (see below) dxa word
     184, 2, L_FIX, //  "sprmTDxaGapHalf", // tap.dxaGapHalf, tap.rgdxaCenter (see below) dxa word
     185, 1, L_FIX, //  "sprmTFCantSplit", // tap.fCantSplit 1 or 0 byte
     186, 1, L_FIX, //  "sprmTTableHeader", // tap.fTableHeader 1 or 0 byte
     187,12, L_FIX, // "sprmTTableBorders", // tap.rgbrcTable complex(see below) 12 bytes
     188, 0, L_VAR, // "sprmTDefTable10", // tap.rgdxaCenter, tap.rgtc complex (see below) variable length
     189, 2, L_FIX, //  "sprmTDyaRowHeight", // tap.dyaRowHeight dya word

     190, 0, L_VAR2, // "sprmTDefTable", // tap.rgtc complex (see below)
     191, 1, L_VAR, // "sprmTDefTableShd", // tap.rgshd complex (see below)
     192, 4, L_FIX, // "sprmTTlp", // tap.tlp TLP 4 bytes
     193, 5, L_FIX, // "sprmTSetBrc", // tap.rgtc[].rgbrc complex (see below) 5 bytes
     194, 4, L_FIX, // "sprmTInsert", // tap.rgdxaCenter,tap.rgtc complex (see below) 4 bytes
     195, 2, L_FIX, // "sprmTDelete", // tap.rgdxaCenter, tap.rgtc complex (see below) word
     196, 4, L_FIX, // "sprmTDxaCol", // tap.rgdxaCenter complex (see below) 4 bytes
     197, 2, L_FIX, // "sprmTMerge", // tap.fFirstMerged, tap.fMerged complex (see below) word
     198, 2, L_FIX, // "sprmTSplit", // tap.fFirstMerged, tap.fMerged complex (see below) word
     199, 5, L_FIX, // "sprmTSetBrc10", // tap.rgtc[].rgbrc complex (see below) 5 bytes

     200, 4, L_FIX, // "sprmTSetShd", // tap.rgshd complex (see below) 4 bytes

//- neue ab Ver8 ------------------------------------------------------------
    /*
        Die neuen Kodes werden einfach hier an die Liste angehaengt.
        So kann ein und dieselbe Liste fuer Ver6 und Ver8 gemeinsam verwendet werden.
        MS hat gluecklicherweise darauf geachtet, fuer Ver8 einen anderen Nummernkreis
        zu nehmen als fuer Ver6-7.
    */
    0x4600, 2, L_FIX, // "sprmPIstd" pap.istd;istd (style code);short;
    0xC601, 0, L_VAR, // "sprmPIstdPermute" pap.istd;permutation vector (see below);variable length;
    0x2602, 1, L_FIX, // "sprmPIncLvl" pap.istd, pap.lvl;difference between istd of base PAP and istd of PAP to be produced (see below);byte;
    0x2403, 1, L_FIX, // "sprmPJc" pap.jc;jc (justification);byte;
    0x2404, 1, L_FIX, // "sprmPFSideBySide" pap.fSideBySide;0 or 1;byte;
    0x2405, 1, L_FIX, // "sprmPFKeep" pap.fKeep;0 or 1;byte;
    0x2406, 1, L_FIX, // "sprmPFKeepFollow" pap.fKeepFollow;0 or 1;byte;
    0x2407, 1, L_FIX, // "sprmPFPageBreakBefore" pap.fPageBreakBefore;0 or 1;byte;
    0x2408, 1, L_FIX, // "sprmPBrcl" pap.brcl;brcl;byte;
    0x2409, 1, L_FIX, // "sprmPBrcp" pap.brcp;brcp;byte;
    0x260A, 1, L_FIX, // "sprmPIlvl" pap.ilvl;ilvl;byte;
    0x460B, 2, L_FIX, // "sprmPIlfo" pap.ilfo;ilfo (list index) ;short;
    0x240C, 1, L_FIX, // "sprmPFNoLineNumb" pap.fNoLnn;0 or 1;byte;
    0xC60D, 0, L_VAR, // "sprmPChgTabsPapx" pap.itbdMac, pap.rgdxaTab, pap.rgtbd;complex - see below;variable length
    0x840E, 2, L_FIX, // "sprmPDxaRight" pap.dxaRight;dxa;word;
    0x840F, 2, L_FIX, // "sprmPDxaLeft" pap.dxaLeft;dxa;word;
    0x4610, 2, L_FIX, // "sprmPNest" pap.dxaLeft;dxa-see below;word;
    0x8411, 2, L_FIX, // "sprmPDxaLeft1" pap.dxaLeft1;dxa;word;
    0x6412, 4, L_FIX, // "sprmPDyaLine" pap.lspd;an LSPD, a long word structure consisting of a short of dyaLine followed by a short of fMultLinespace - see below;long;
    0xA413, 2, L_FIX, // "sprmPDyaBefore" pap.dyaBefore;dya;word;
    0xA414, 2, L_FIX, // "sprmPDyaAfter" pap.dyaAfter;dya;word;
    0xC615, 0, L_VAR, // "sprmPChgTabs" pap.itbdMac, pap.rgdxaTab, pap.rgtbd;complex - see below;variable length;
    0x2416, 1, L_FIX, // "sprmPFInTable" pap.fInTable;0 or 1;byte;
    0x2417, 1, L_FIX, // "sprmPFTtp" pap.fTtp;0 or 1;byte;
    0x8418, 2, L_FIX, // "sprmPDxaAbs" pap.dxaAbs;dxa;word;
    0x8419, 2, L_FIX, // "sprmPDyaAbs" pap.dyaAbs;dya;word;
    0x841A, 2, L_FIX, // "sprmPDxaWidth" pap.dxaWidth;dxa;word;
    0x261B, 1, L_FIX, // "sprmPPc" pap.pcHorz, pap.pcVert;complex - see below;byte;
    0x461C, 2, L_FIX, // "sprmPBrcTop10" pap.brcTop;BRC10;word;
    0x461D, 2, L_FIX, // "sprmPBrcLeft10" pap.brcLeft;BRC10;word;
    0x461E, 2, L_FIX, // "sprmPBrcBottom10" pap.brcBottom;BRC10;word;
    0x461F, 2, L_FIX, // "sprmPBrcRight10" pap.brcRight;BRC10;word;
    0x4620, 2, L_FIX, // "sprmPBrcBetween10" pap.brcBetween;BRC10;word;
    0x4621, 2, L_FIX, // "sprmPBrcBar10" pap.brcBar;BRC10;word;
    0x4622, 2, L_FIX, // "sprmPDxaFromText10" pap.dxaFromText;dxa;word;
    0x2423, 1, L_FIX, // "sprmPWr" pap.wr;wr (see description of PAP for definition;byte;
    0x6424, 4, L_FIX, // "sprmPBrcTop" pap.brcTop;BRC;long;
    0x6425, 4, L_FIX, // "sprmPBrcLeft" pap.brcLeft;BRC;long;
    0x6426, 4, L_FIX, // "sprmPBrcBottom" pap.brcBottom;BRC;long;
    0x6427, 4, L_FIX, // "sprmPBrcRight" pap.brcRight;BRC;long;
    0x6428, 4, L_FIX, // "sprmPBrcBetween" pap.brcBetween;BRC;long;
    0x6629, 4, L_FIX, // "sprmPBrcBar" pap.brcBar;BRC;long;
    0x242A, 1, L_FIX, // "sprmPFNoAutoHyph" pap.fNoAutoHyph;0 or 1;byte;
    0x442B, 2, L_FIX, // "sprmPWHeightAbs" pap.wHeightAbs;w;word;
    0x442C, 2, L_FIX, // "sprmPDcs" pap.dcs;DCS;short;
    0x442D, 2, L_FIX, // "sprmPShd" pap.shd;SHD;word;
    0x842E, 2, L_FIX, // "sprmPDyaFromText" pap.dyaFromText;dya;word;
    0x842F, 2, L_FIX, // "sprmPDxaFromText" pap.dxaFromText;dxa;word;
    0x2430, 1, L_FIX, // "sprmPFLocked" pap.fLocked;0 or 1;byte;
    0x2431, 1, L_FIX, // "sprmPFWidowControl" pap.fWidowControl;0 or 1;byte;
    0xC632, 0, L_VAR, // "sprmPRuler" ;;variable length;
    0x2433, 1, L_FIX, // "sprmPFKinsoku" pap.fKinsoku;0 or 1;byte;
    0x2434, 1, L_FIX, // "sprmPFWordWrap" pap.fWordWrap;0 or 1;byte;
    0x2435, 1, L_FIX, // "sprmPFOverflowPunct" pap.fOverflowPunct;0 or 1;byte;
    0x2436, 1, L_FIX, // "sprmPFTopLinePunct" pap.fTopLinePunct;0 or 1;byte;
    0x2437, 1, L_FIX, // "sprmPFAutoSpaceDE" pap.fAutoSpaceDE;0 or 1;byte;
    0x2438, 1, L_FIX, // "sprmPFAutoSpaceDN" pap.fAutoSpaceDN;0 or 1;byte;
    0x4439, 2, L_FIX, // "sprmPWAlignFont" pap.wAlignFont;iFa (see description of PAP for definition);word;
    0x443A, 2, L_FIX, // "sprmPFrameTextFlow" pap.fVertical pap.fBackward pap.fRotateFont;complex (see description of PAP for definition);word;
    0x243B, 1, L_FIX, // "sprmPISnapBaseLine" obsolete: not applicable in Word97 and later versions;;byte;
    0xC63E, 0, L_VAR, // "sprmPAnld" pap.anld;;variable length;
    0xC63F, 0, L_VAR, // "sprmPPropRMark" pap.fPropRMark;complex (see below);variable length;
    0x2640, 1, L_FIX, // "sprmPOutLvl" pap.lvl;has no effect if pap.istd is < 1 or is > 9;byte;
    0x2441, 1, L_FIX, // "sprmPFBiDi" ;;byte;
    0x2443, 1, L_FIX, // "sprmPFNumRMIns" pap.fNumRMIns;1 or 0;bit;
    0x2444, 1, L_FIX, // "sprmPCrLf" ;;byte;
    0xC645, 0, L_VAR, // "sprmPNumRM" pap.numrm;;variable length;
    0x6645, 4, L_FIX, // "sprmPHugePapx" see below;fc in the data stream to locate the huge grpprl (see below);long;
    0x6646, 4, L_FIX, // "sprmPHugePapx" see below;fc in the data stream to locate the huge grpprl (see below);long;
    0x2447, 1, L_FIX, // "sprmPFUsePgsuSettings" pap.fUsePgsuSettings;1 or 0;byte;
    0x2448, 1, L_FIX, // "sprmPFAdjustRight" pap.fAdjustRight;1 or 0;byte;
    0x0800, 1, L_FIX, // "sprmCFRMarkDel" chp.fRMarkDel;1 or 0;bit;
    0x0801, 1, L_FIX, // "sprmCFRMark" chp.fRMark;1 or 0;bit;
    0x0802, 1, L_FIX, // "sprmCFFldVanish" chp.fFldVanish;1 or 0;bit;

// wahrscheinlich falsch:
//0x6A03, 0, L_VAR, // "sprmCPicLocation" chp.fcPic and chp.fSpec;see below;variable length, length recorded is always 4;

// eher so:
    0x6A03, 4, L_FIX, // "sprmCPicLocation" chp.fcPic and chp.fSpec;see below;
                                        // variable length,
                                        // ????????
                                        // length recorded is always 4;
                                        // ======             =========

    0x4804, 2, L_FIX, // "sprmCIbstRMark" chp.ibstRMark;index into sttbRMark;short;
    0x6805, 4, L_FIX, // "sprmCDttmRMark" chp.dttmRMark;DTTM;long;
    0x0806, 1, L_FIX, // "sprmCFData" chp.fData;1 or 0;bit;
    0x4807, 2, L_FIX, // "sprmCIdslRMark" chp.idslRMReason;an index to a table of strings defined in Word 6.0 executables;short;
    0xEA08, 1, L_FIX, // "sprmCChs" chp.fChsDiff and chp.chse;see below;3 bytes;
    0x6A09, 4, L_FIX, // "sprmCSymbol" chp.fSpec, chp.xchSym and chp.ftcSym;see below;variable length, length recorded is always 4;
    0x080A, 1, L_FIX, // "sprmCFOle2" chp.fOle2;1 or 0;bit;
//0x480B, 0, L_FIX, // "sprmCIdCharType" obsolete: not applicable in Word97 and later versions;;;
    0x2A0C, 1, L_FIX, // "sprmCHighlight" chp.fHighlight, chp.icoHighlight;ico (fHighlight is set to 1 iff ico is not 0);byte;
    0x680E, 4, L_FIX, // "sprmCObjLocation" chp.fcObj;FC;long;
//0x2A10, 0, L_FIX, // "sprmCFFtcAsciSymb" ;;;
    0x4A30, 2, L_FIX, // "sprmCIstd" chp.istd;istd, see stylesheet definition;short;
    0xCA31, 0, L_VAR, // "sprmCIstdPermute" chp.istd;permutation vector (see below);variable length;
    0x2A32, 0, L_VAR, // "sprmCDefault" whole CHP (see below);none;variable length;
    0x2A33, 0, L_FIX, // "sprmCPlain" whole CHP (see below);none;0;
//0x2A34, 0, L_FIX, // "sprmCKcd" ;;;
    0x0835, 1, L_FIX, // "sprmCFBold" chp.fBold;0,1, 128, or 129 (see below);byte;
    0x0836, 1, L_FIX, // "sprmCFItalic" chp.fItalic;0,1, 128, or 129 (see below);byte;
    0x0837, 1, L_FIX, // "sprmCFStrike" chp.fStrike;0,1, 128, or 129 (see below);byte;
    0x0838, 1, L_FIX, // "sprmCFOutline" chp.fOutline;0,1, 128, or 129 (see below);byte;
    0x0839, 1, L_FIX, // "sprmCFShadow" chp.fShadow;0,1, 128, or 129 (see below);byte;
    0x083A, 1, L_FIX, // "sprmCFSmallCaps" chp.fSmallCaps;0,1, 128, or 129 (see below);byte;
    0x083B, 1, L_FIX, // "sprmCFCaps" chp.fCaps;0,1, 128, or 129 (see below);byte;
    0x083C, 1, L_FIX, // "sprmCFVanish" chp.fVanish;0,1, 128, or 129 (see below);byte;
    0x4A3D, 2, L_FIX, // "sprmCFtcDefault" ;ftc, only used internally, never stored in file;word;
    0x2A3E, 1, L_FIX, // "sprmCKul" chp.kul;kul;byte;
    0xEA3F, 3, L_FIX, // "sprmCSizePos" chp.hps, chp.hpsPos;(see below);3 bytes;
    0x8840, 2, L_FIX, // "sprmCDxaSpace" chp.dxaSpace;dxa;word;
    0x4A41, 2, L_FIX, // "sprmCLid" ;only used internally never stored;word;
    0x2A42, 1, L_FIX, // "sprmCIco" chp.ico;ico;byte;
    0x4A43, 2, L_FIX, // "sprmCHps" chp.hps;hps;byte; ACHTUNG: ich nehme mal lieber ein: word;
    0x2A44, 1, L_FIX, // "sprmCHpsInc" chp.hps;(see below);byte;
    0x4845, 1, L_FIX, // "sprmCHpsPos" chp.hpsPos;hps;byte;
    0x2A46, 1, L_FIX, // "sprmCHpsPosAdj" chp.hpsPos;hps (see below);byte;
    0xCA47, 0, L_VAR, // "sprmCMajority" chp.fBold, chp.fItalic, chp.fSmallCaps, chp.fVanish, chp.fStrike, chp.fCaps, chp.rgftc, chp.hps, chp.hpsPos, chp.kul, chp.dxaSpace, chp.ico, chp.rglid;complex (see below);variable length, length byte plus size of following grpprl;
    0x2A48, 1, L_FIX, // "sprmCIss" chp.iss;iss;byte;
    0xCA49, 0, L_VAR, // "sprmCHpsNew50" chp.hps;hps;variable width, length always recorded as 2;
    0xCA4A, 0, L_VAR, // "sprmCHpsInc1" chp.hps;complex (see below);variable width, length always recorded as 2;
    0x484B, 2, L_FIX, // "sprmCHpsKern" chp.hpsKern;hps;short;
    0xCA4C, 2, L_FIX, // "sprmCMajority50" chp.fBold, chp.fItalic, chp.fSmallCaps, chp.fVanish, chp.fStrike, chp.fCaps, chp.ftc, chp.hps, chp.hpsPos, chp.kul, chp.dxaSpace, chp.ico,;complex (see below);variable length;
    0x4A4D, 2, L_FIX, // "sprmCHpsMul" chp.hps;percentage to grow hps;short;
    0x484E, 2, L_FIX, // "sprmCYsri" chp.ysri;ysri;short;
    0x4A4F, 2, L_FIX, // "sprmCRgFtc0" chp.rgftc[0];ftc for ASCII text (see below);short;
    0x4A50, 2, L_FIX, // "sprmCRgFtc1" chp.rgftc[1];ftc for Far East text (see below);short;
    0x4A51, 2, L_FIX, // "sprmCRgFtc2" chp.rgftc[2];ftc for non-Far East text (see below);short;
//0x4852, 0, L_FIX, // "sprmCCharScale" ;;;
    0x2A53, 1, L_FIX, // "sprmCFDStrike" chp.fDStrike;;byte;
    0x0854, 1, L_FIX, // "sprmCFImprint" chp.fImprint;1 or 0;bit;
    0x0855, 1, L_FIX, // "sprmCFSpec" chp.fSpec ;1 or 0;bit;
    0x0856, 1, L_FIX, // "sprmCFObj" chp.fObj;1 or 0;bit;
    0xCA57, 0, L_VAR, // "sprmCPropRMark" chp.fPropRMark, chp.ibstPropRMark, chp.dttmPropRMark;Complex (see below);variable length always recorded as 7 bytes;
    0x0858, 1, L_FIX, // "sprmCFEmboss" chp.fEmboss;1 or 0;bit;
    0x2859, 1, L_FIX, // "sprmCSfxText" chp.sfxtText;text animation;byte;
//0x085A, 0, L_FIX, // "sprmCFBiDi" ;;;
//0x085B, 0, L_FIX, // "sprmCFDiacColor" ;;;
//0x085C, 0, L_FIX, // "sprmCFBoldBi" ;;;
//0x085D, 0, L_FIX, // "sprmCFItalicBi" ;;;
//0x4A5E, 0, L_FIX, // "sprmCFtcBi" ;;;
//0x485F, 0, L_FIX, // "sprmCLidBi" ;;;
//0x4A60, 0, L_FIX, // "sprmCIcoBi" ;;;
//0x4A61, 0, L_FIX, // "sprmCHpsBi" ;;;
    0xCA62, 0, L_VAR, // "sprmCDispFldRMark" chp.fDispFldRMark, chp.ibstDispFldRMark, chp.dttmDispFldRMark ;Complex (see below);variable length always recorded as 39 bytes;
    0x4863, 2, L_FIX, // "sprmCIbstRMarkDel" chp.ibstRMarkDel;index into sttbRMark;short;
    0x6864, 4, L_FIX, // "sprmCDttmRMarkDel" chp.dttmRMarkDel;DTTM;long;
    0x6865, 4, L_FIX, // "sprmCBrc" chp.brc;BRC;long;
    0x4866, 2, L_FIX, // "sprmCShd" chp.shd;SHD;short;
    0x4867, 2, L_FIX, // "sprmCIdslRMarkDel" chp.idslRMReasonDel;an index to a table of strings defined in Word 6.0 executables;short;
    0x0868, 1, L_FIX, // "sprmCFUsePgsuSettings" chp.fUsePgsuSettings;1 or 0;bit;
    0x486B, 2, L_FIX, // "sprmCCpg" ;;word;
    0x486D, 2, L_FIX, // "sprmCRgLid0" chp.rglid[0];LID: for non-Far East text;word;
    0x486E, 2, L_FIX, // "sprmCRgLid1" chp.rglid[1];LID: for Far East text;word;
    0x286F, 1, L_FIX, // "sprmCIdctHint" chp.idctHint;IDCT: (see below);byte;
    0x2E00, 1, L_FIX, // "sprmPicBrcl" pic.brcl;brcl (see PIC structure definition);byte;
    0xCE01, 0, L_VAR, // "sprmPicScale" pic.mx, pic.my, pic.dxaCropleft, pic.dyaCropTop pic.dxaCropRight, pic.dyaCropBottom;Complex (see below);length byte plus 12 bytes;
    0x6C02, 4, L_FIX, // "sprmPicBrcTop" pic.brcTop;BRC;long;
    0x6C03, 4, L_FIX, // "sprmPicBrcLeft" pic.brcLeft;BRC;long;
    0x6C04, 4, L_FIX, // "sprmPicBrcBottom" pic.brcBottom;BRC;long;
    0x6C05, 4, L_FIX, // "sprmPicBrcRight" pic.brcRight;BRC;long;
    0x3000, 1, L_FIX, // "sprmScnsPgn" sep.cnsPgn;cns;byte;
    0x3001, 1, L_FIX, // "sprmSiHeadingPgn" sep.iHeadingPgn;heading number level;byte;
    0xD202, 0, L_VAR, // "sprmSOlstAnm" sep.olstAnm;OLST;variable length;
    0xF203, 3, L_FIX, // "sprmSDxaColWidth" sep.rgdxaColWidthSpacing;complex (see below);3 bytes;
    0xF204, 3, L_FIX, // "sprmSDxaColSpacing" sep.rgdxaColWidthSpacing;complex (see below);3 bytes;
    0x3005, 1, L_FIX, // "sprmSFEvenlySpaced" sep.fEvenlySpaced;1 or 0;byte;
    0x3006, 1, L_FIX, // "sprmSFProtected" sep.fUnlocked;1 or 0;byte;
    0x5007, 2, L_FIX, // "sprmSDmBinFirst" sep.dmBinFirst;;word;
    0x5008, 2, L_FIX, // "sprmSDmBinOther" sep.dmBinOther;;word;
    0x3009, 1, L_FIX, // "sprmSBkc" sep.bkc;bkc;byte;
    0x300A, 1, L_FIX, // "sprmSFTitlePage" sep.fTitlePage;0 or 1;byte;
    0x500B, 2, L_FIX, // "sprmSCcolumns" sep.ccolM1;# of cols - 1;word;
    0x900C, 2, L_FIX, // "sprmSDxaColumns" sep.dxaColumns;dxa;word;
    0x300D, 1, L_FIX, // "sprmSFAutoPgn" sep.fAutoPgn;obsolete;byte;
    0x300E, 1, L_FIX, // "sprmSNfcPgn" sep.nfcPgn;nfc;byte;
    0xB00F, 2, L_FIX, // "sprmSDyaPgn" sep.dyaPgn;dya;short;
    0xB010, 2, L_FIX, // "sprmSDxaPgn" sep.dxaPgn;dya;short;
    0x3011, 1, L_FIX, // "sprmSFPgnRestart" sep.fPgnRestart;0 or 1;byte;
    0x3012, 1, L_FIX, // "sprmSFEndnote" sep.fEndnote;0 or 1;byte;
    0x3013, 1, L_FIX, // "sprmSLnc" sep.lnc;lnc;byte;
    0x3014, 1, L_FIX, // "sprmSGprfIhdt" sep.grpfIhdt;grpfihdt (see Headers and Footers topic);byte;
    0x5015, 2, L_FIX, // "sprmSNLnnMod" sep.nLnnMod;non-neg int.;word;
    0x9016, 2, L_FIX, // "sprmSDxaLnn" sep.dxaLnn;dxa;word;
    0xB017, 2, L_FIX, // "sprmSDyaHdrTop" sep.dyaHdrTop;dya;word;
    0xB018, 2, L_FIX, // "sprmSDyaHdrBottom" sep.dyaHdrBottom;dya;word;
    0x3019, 1, L_FIX, // "sprmSLBetween" sep.fLBetween;0 or 1;byte;
    0x301A, 1, L_FIX, // "sprmSVjc" sep.vjc;vjc;byte;
    0x501B, 2, L_FIX, // "sprmSLnnMin" sep.lnnMin;lnn;word;
    0x501C, 2, L_FIX, // "sprmSPgnStart" sep.pgnStart;pgn;word;
    0x301D, 1, L_FIX, // "sprmSBOrientation" sep.dmOrientPage;dm;byte;
//0x301E, 0, L_FIX, // "sprmSBCustomize" ;;;

    0xB01F, 2, L_FIX, // "sprmSXaPage" sep.xaPage;xa;word;
    0xB020, 2, L_FIX, // "sprmSYaPage" sep.yaPage;ya;word;
    0xB021, 2, L_FIX, // "sprmSDxaLeft" sep.dxaLeft;dxa;word;
    0xB022, 2, L_FIX, // "sprmSDxaRight" sep.dxaRight;dxa;word;
    0x9023, 2, L_FIX, // "sprmSDyaTop" sep.dyaTop;dya;word;
    0x9024, 2, L_FIX, // "sprmSDyaBottom" sep.dyaBottom;dya;word;

    0xB025, 2, L_FIX, // "sprmSDzaGutter" sep.dzaGutter;dza;word;
    0x5026, 2, L_FIX, // "sprmSDmPaperReq" sep.dmPaperReq;dm;word;
    0xD227, 0, L_VAR, // "sprmSPropRMark" sep.fPropRMark, sep.ibstPropRMark, sep.dttmPropRMark ;complex (see below);variable length always recorded as 7 bytes;
//0x3228, 0, L_FIX, // "sprmSFBiDi" ;;;
//0x3229, 0, L_FIX, // "sprmSFFacingCol" ;;;
//0x322A, 0, L_FIX, // "sprmSFRTLGutter" ;;;
    0x702B, 4, L_FIX, // "sprmSBrcTop" sep.brcTop;BRC;long;
    0x702C, 4, L_FIX, // "sprmSBrcLeft" sep.brcLeft;BRC;long;
    0x702D, 4, L_FIX, // "sprmSBrcBottom" sep.brcBottom;BRC;long;
    0x702E, 4, L_FIX, // "sprmSBrcRight" sep.brcRight;BRC;long;
    0x522F, 2, L_FIX, // "sprmSPgbProp" sep.pgbProp;;word;
    0x7030, 4, L_FIX, // "sprmSDxtCharSpace" sep.dxtCharSpace;dxt;long;
    0x9031, 4, L_FIX, // "sprmSDyaLinePitch" sep.dyaLinePitch;dya;long;
//0x5032, 0, L_FIX, // "sprmSClm" ;;;
    0x5033, 2, L_FIX, // "sprmSTextFlow" sep.wTextFlow;complex (see below);short;
    0x5400, 2, L_FIX, // "sprmTJc" tap.jc;jc;word (low order byte is significant);
    0x9601, 2, L_FIX, // "sprmTDxaLeft" tap.rgdxaCenter (see below);dxa;word;
    0x9602, 2, L_FIX, // "sprmTDxaGapHalf" tap.dxaGapHalf, tap.rgdxaCenter (see below);dxa;word;
    0x3403, 1, L_FIX, // "sprmTFCantSplit" tap.fCantSplit;1 or 0;byte;
    0x3404, 1, L_FIX, // "sprmTTableHeader" tap.fTableHeader;1 or 0;byte;
    0xD605, 0, L_VAR, // "sprmTTableBorders" tap.rgbrcTable;complex(see below);24 bytes;
    0xD606, 0, L_VAR, // "sprmTDefTable10" tap.rgdxaCenter, tap.rgtc;complex (see below);variable length;
    0x9407, 2, L_FIX, // "sprmTDyaRowHeight" tap.dyaRowHeight;dya;word;
    0xD608, 0, L_VAR, // "sprmTDefTable" tap.rgtc;complex (see below);;
    0xD609, 0, L_VAR, // "sprmTDefTableShd" tap.rgshd;complex (see below);;
    0x740A, 2, L_FIX, // "sprmTTlp" tap.tlp;TLP;4 bytes;
//0x560B, 0, L_FIX, // "sprmTFBiDi" ;;;
//0x740C, 0, L_FIX, // "sprmTHTMLProps" ;;;
    0xD620, 0, L_VAR, // "sprmTSetBrc" tap.rgtc[].rgbrc;complex (see below);5 bytes;
    0x7621, 0, L_VAR, // "sprmTInsert" tap.rgdxaCenter, tap.rgtc;complex (see below);4 bytes;
    0x5622, 0, L_VAR, // "sprmTDelete" tap.rgdxaCenter, tap.rgtc;complex (see below);word;
    0x7623, 0, L_VAR, // "sprmTDxaCol" tap.rgdxaCenter;complex (see below);4 bytes;
    0x5624, 0, L_VAR, // "sprmTMerge" tap.fFirstMerged, tap.fMerged;complex (see below);word;
    0x5625, 0, L_VAR, // "sprmTSplit" tap.fFirstMerged, tap.fMerged;complex (see below);word;
    0xD626, 0, L_VAR, // "sprmTSetBrc10" tap.rgtc[].rgbrc;complex (see below);5 bytes;
    0x7627, 0, L_VAR, // "sprmTSetShd" tap.rgshd;complex (see below);4 bytes;
    0x7628, 0, L_VAR, // "sprmTSetShdOdd" tap.rgshd;complex (see below);4 bytes;
    0x7629, 0, L_VAR, // "sprmTTextFlow" tap.rgtc[].fVerticaltap.rgtc[].fBackwardtap.rgtc[].fRotateFont;0 or 10 or 10 or 1;word;
//0xD62A, 0, L_FIX, // "sprmTDiagLine" ;;;
    0xD62B, 0, L_VAR, // "sprmTVertMerge" tap.rgtc[].vertMerge;complex (see below);variable length always recorded as 2 bytes;
        0xD62C, 0, L_VAR, // "sprmTVertAlign" tap.rgtc[].vertAlign;complex (see below);variable length always recorded as 3 byte;

};



static int
#if defined( WNT )
 __cdecl
#endif
#if defined( ICC )
 _Optlink
#endif
    CompSprmId( const void *pFirst, const void *pSecond)
{
    return( ((SprmInfo*)pFirst )->nId - ((SprmInfo*)pSecond)->nId );
}


SprmInfo& WW8GetSprmInfo( USHORT nId )
{
    // ggfs. Tab sortieren
    static BOOL bInit = FALSE;
    if( !bInit )
    {
        qsort( (void*)aWwSprmTab,
            sizeof( aWwSprmTab      ) / sizeof (aWwSprmTab[ 0 ]),
            sizeof( aWwSprmTab[ 0 ] ),
            CompSprmId );
        bInit = TRUE;
    }
    // Sprm heraussuchen
    void* pFound;
    SprmInfo aSrch;
    aSrch.nId = nId;
    if( 0 == ( pFound = bsearch( (char *) &aSrch,
                        (void*) aWwSprmTab,
                        sizeof( aWwSprmTab      ) / sizeof (aWwSprmTab[ 0 ]),
                        sizeof( aWwSprmTab[ 0 ] ),
                        CompSprmId )))
    {
        // im Fehlerfall auf Nulltes Element verweisen
        pFound = (void*)aWwSprmTab;
    }
    return *(SprmInfo*) pFound;
}



//-----------------------------------------
//              Sprms
//-----------------------------------------

static short WW8GetSprmSize0( USHORT nId, BYTE* pSprm, BYTE nDelta)
{
    SprmInfo& rSprm = WW8GetSprmInfo( nId );
    short nL = 0;                       // soviel Bytes sind zu lesen

    //sprmPChgTabs
    switch( nId )
    {
    case 23:
    case 0xC615:
        if( SVBT16ToShort( &pSprm[1 + nDelta] ) != 255 )
            nL = SVBT16ToShort( &pSprm[1 + nDelta] ) + rSprm.nLen - 1;
        else
        {
            BYTE nDel = pSprm[2 + nDelta];
            BYTE nIns = pSprm[3 + nDelta + 4 * nDel];

            nL = 2 + 4 * nDel + 3 * nIns;
        }
        break;

    case 0xd608:
        nL = SVBT16ToShort( &pSprm[1 + nDelta] );
        break;

    default:
        switch ( rSprm.nVari )
        {
        case L_FIX: nL = rSprm.nLen;        // Excl. Token
                    break;
        case L_VAR: nL = (short)pSprm[1 + nDelta]// Variable 1-Byte Laenge?
                     + rSprm.nLen;      // Excl. Token + Var-Laengenbyte
                    break;
    //  case L_VAR2: nL = ( *(short*)&pSprm[1 + nDelta] )   // Variable 2-Byte Laenge?
        case L_VAR2: nL = SVBT16ToShort( &pSprm[1 + nDelta] )   // Variable 2-Byte Laenge?
                     + rSprm.nLen - 1;  // Excl. Token + Var-Laengenbyte
                    break;
        }
        break;
    }
    return nL;
}


USHORT WW8CountSprms( BYTE   nVersion,
                      BYTE*  pSp,
                      long   nSprmSiz,
                      const  SvUShortsSort* pIgnoreSprms )
{
    BYTE nDelta = ( 8 > nVersion ) ? 0 : 1;
    USHORT nMySprms = 0;
    for(short i=0; i+1+nDelta < nSprmSiz;  )
    {
        USHORT nSpId = WW8GetSprmId( nVersion, pSp );

        if( !nSpId )
            break;

        short nSpLen = WW8GetSprmSizeBrutto( nVersion, pSp, &nSpId  );
        // erhoehe Zeiger, so dass er auf naechsten Sprm zeigt
        i += nSpLen;
        pSp += nSpLen;

        if( !pIgnoreSprms || USHRT_MAX == pIgnoreSprms->Seek_Entry( nSpId ) )
        {
            ++nMySprms;
        }
    }
    return nMySprms;
}

BOOL WW8PLCFx_SEPX::CompareSprms( BYTE*  pOtherSprms,
                                  long   nOtherSprmSiz,
                                  const  SvUShortsSort* pIgnoreSprms ) const
{
    BOOL bRes = FALSE;
    BYTE* pSp   = pSprms;
    short i;
    BYTE nDelta = ( 8 > GetVersion()) ? 0 : 1;

    if(    WW8CountSprms(GetVersion(), pSp, nSprmSiz, pIgnoreSprms)
        == WW8CountSprms(GetVersion(), pOtherSprms, nOtherSprmSiz, pIgnoreSprms) )
    {
        bRes = TRUE;
        for( i=0; i+1+nDelta < nSprmSiz;    )
        {
            USHORT nSpId = WW8GetSprmId( GetVersion(), pSp );

            if( !nSpId )
                break;

            short nSpLen = WW8GetSprmSizeBrutto( GetVersion(), pSp, &nSpId  );

            if( !pIgnoreSprms || !pIgnoreSprms->Seek_Entry( nSpId ) )
            {
                BYTE* pOtherSp = HasSprm( nSpId, pOtherSprms, nOtherSprmSiz );

                if(    ( !pOtherSp )
                    || (0 != memcmp( pSp + 1 + nDelta + WW8SprmDataOfs( nSpId ),
                                     pOtherSp,
                                     WW8GetSprmSize0( nSpId, pSp, nDelta ) ) ) )
                {
                    bRes = FALSE;
                    break;
                }
            }
            // erhoehe Zeiger, so dass er auf naechsten Sprm zeigt
            i += nSpLen;
            pSp += nSpLen;
        }
    }
    return bRes;    // unterschiedliche Sprms ?
}


// ein bzw. zwei Byte am Anfang des Sprm sind die Id
USHORT WW8GetSprmId( BYTE nVersion, BYTE* pSp, BYTE* pDelta )
{
    USHORT nId = 0;
    switch( nVersion )  // beachte: 6 steht fuer "6 ODER 7",  7 steht fuer "NUR 7"
    {
        case 6:
        case 7: nId = *pSp;
                if( 0x0100 < nId ) nId = 0;
                if( pDelta ) *pDelta = 0;
                break;
        case 8: nId = SVBT16ToShort( &pSp[ 0 ] );
                if( 0x0800 > nId )
                    nId = 0;
                if( pDelta )
                    *pDelta = 1;
                break;
        default:ASSERT( nId, "Es wurde vergessen, nVersion zu kodieren!" );
    }
    return nId;
}


// ohne Token und LaengenByte
short WW8GetSprmSizeNetto( BYTE nVersion, BYTE* pSprm, USHORT* pId )
{
    BYTE   nDelta = ( 8 > nVersion ) ? 0 : 1;
    USHORT nId = pId ? *pId : WW8GetSprmId( nVersion, pSprm );
    return WW8GetSprmSize0( nId, pSprm, nDelta );
}


// mit Token und LaengenByte
short WW8GetSprmSizeBrutto( BYTE nVersion, BYTE* pSprm, USHORT* pId )
{
    BYTE   nDelta = ( 8 > nVersion ) ? 0 : 1;
    USHORT nId = pId ? *pId : WW8GetSprmId( nVersion, pSprm );
    return WW8GetSprmSize0( nId, pSprm, nDelta )
            + 1 + nDelta
            + WW8GetSprmInfo( nId ).nVari;
}

BYTE WW8SprmDataOfs( USHORT nId )
{
    return WW8GetSprmInfo( nId ).nVari;
}


/*************************************************************************
      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ww8/dump/ww8scan.cxx,v 1.1.1.1 2000-09-18 17:14:59 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.12  2000/09/18 16:05:03  willem.vandorp
      OpenOffice header added.

      Revision 1.11  2000/02/11 14:39:42  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.10  2000/02/03 10:09:40  cmc
      #72268# Allow create fib from offset, added data to STTBF

      Revision 1.75  2000/02/03 10:08:30  cmc
      #72268# Allow create fib from offset, added data to STTBF

      Revision 1.74  2000/02/02 18:07:47  khz
      Task #69885# Read SPRMs that are stored in piece table grpprls

      Revision 1.73  1999/12/21 08:02:45  khz
      Task #68143# nIdx set to Zero caused Hd/Ft to get wrong sprms

      Revision 1.72  1999/12/07 14:29:00  khz
      Task #69508# import sprmPHugePapx by reading DATA stream

      Revision 1.71  1999/12/07 09:53:04  khz
      Task #67979# typo-error corrected (was '==' instead of '=')

      Revision 1.70  1999/12/06 19:34:27  khz
      Task #67979# Absolute Positioned Object must have SPRM 5 or SPRM 29

      Revision 1.69  1999/11/19 15:09:24  khz
      Task #69910# Use extra PLCF structure for field!

      Revision 1.68  1999/11/03 17:20:04  khz
      Task #68676# GPF when loading file under Solaris (reading FFN structures)

      Revision 1.67  1999/10/21 15:36:25  khz
      Import Redlining (4)

      Revision 1.66  1999/10/13 21:06:47  khz
      Import Redlining (3)

      Revision 1.65  1999/10/08 09:25:29  khz
      Import Redlining

      Revision 1.64  1999/09/10 15:36:43  khz
      CharSet matching made by TENCINFO.H::rtl_getTextEncodingFromWindowsCharset()

      Revision 1.63  1999/09/09 18:16:17  khz
      CharSet matching now done in central methode WW8SCAN.HXX::WW8GetCharSet()

      Revision 1.62  1999/09/08 13:26:13  khz
      Better performance by reducing use of SWAP..() and SVBT..To..() methods

      Revision 1.61  1999/08/30 19:53:02  JP
      Bug #68219#: no static members - be reentrant


      Rev 1.60   30 Aug 1999 21:53:02   JP
   Bug #68219#: no static members - be reentrant

      Rev 1.59   09 Aug 1999 18:34:38   KHZ
   Task #67543# Import of Property Modifier(variant 1) (PRM) in WW8 docs

      Rev 1.58   18 Jun 1999 15:53:56   KHZ
   Reference field (page, bookmark, footnote) part#1

      Rev 1.57   15 Jun 1999 14:34:56   JP
   for Export: FIB - read/write SttbListNames

      Rev 1.56   14 Jun 1999 16:00:18   KHZ
   Task #66411# allow import of document even when SEPX is missing completely

      Rev 1.55   03 Jun 1999 16:58:56   KHZ
   Task #66418# Nach C'tor WW8Fkp ein ''pSt->Seek( nOldPos );'' ausfuehren!

      Rev 1.54   03 Jun 1999 11:42:46   KHZ
   Task #66398# Variante 1 fuer PRM ist bei Ver67 Ok.

      Rev 1.53   02 Jun 1999 17:07:46   KHZ
   Task #66393# in WW8Cp2Fc ist *pIsUnicode bei bVer67 zu initialisieren

      Rev 1.52   02 Jun 1999 09:32:44   KHZ
   Task #66227# a) kein Unicode bei Ver67 ;-)  b) Grafik in grupp. Textbox

      Rev 1.51   28 May 1999 09:59:12   JP
   Fib-CTOR: wichtige Flags fuer den W97-Export setzen

      Rev 1.50   28 May 1999 09:19:22   KHZ
   Task #66395# Return-Adresse kein komplexer Ausdruck mehr

      Rev 1.49   26 May 1999 10:58:02   JP
   Fib: einige Konstanten nachgetragen

      Rev 1.48   21 May 1999 01:58:08   JP
   Export von WW97 Format: DOP in TableStream

      Rev 1.47   19 May 1999 11:12:54   JP
   WinWord97-ExportFilter

      Rev 1.46   11 May 1999 17:15:32   KHZ
   Task #66019# FontFamily: andere Bitreihenfolge auf Solaris beachten

      Rev 1.45   14 Apr 1999 14:20:12   KHZ
   Task #61268# Solaris-Problem wegen drei vergessenen SVBT16-Umwandlungen

      Rev 1.44   13 Apr 1999 16:02:28   KHZ
   Task #61268# SVBT16 statt USHORT bei Bookmarks eingesetzt

      Rev 1.43   10 Mar 1999 15:11:12   KHZ
   Task #62521# Einlesen von Sonderzeichen

      Rev 1.42   08 Mar 1999 11:48:48   KHZ
   Task #57749# Writer kann jetzt spaltige Bereiche

      Rev 1.41   26 Feb 1999 14:43:38   KHZ
   Task #59715# Behandlung von Section breaks

      Rev 1.40   25 Jan 1999 10:22:38   KHZ
   Task #60715# in Textobjekt verankerte Grafik als Grafik importieren

      Rev 1.39   19 Jan 1999 10:47:42   KHZ
   Task #60878# WW8Cp2Fc setzt *pIsUniCode bei Non-Complex auf FALSE

      Rev 1.38   18 Jan 1999 08:57:08   KHZ
   Task #60878# WW8Dp2Fc nur dann Assertion, wenn kein pTestFlag

      Rev 1.37   11 Dec 1998 11:12:38   JP
   Task #59580# Unicode (3) - Bug behoben beim Read_Xstz

      Rev 1.36   10 Dec 1998 21:29:00   JP
   Bug #59643#: benutzerdefinierte Zeichen von Fuss-/EndNoten verarbeiten

      Rev 1.35   07 Dec 1998 18:17:06   KHZ
   Task #59580# falsches Feldende: WW8SkipField verglich mit 0x7f statt 0x1f

      Rev 1.34   05 Dec 1998 17:10:26   KHZ
   Task #59580# Unicode (3)

      Rev 1.33   04 Dec 1998 20:19:50   KHZ
   Task #58766# Textboxen mit Unicode-Inhalt

      Rev 1.32   03 Dec 1998 19:10:02   KHZ
   Task #58766# Unicode-Import (2)

      Rev 1.31   03 Dec 1998 10:39:50   JP
   Task #60063#: Kommentare als PostIts einlesen

      Rev 1.30   02 Dec 1998 16:57:02   JP
   Task #60063#: Kommentare als PostIts einlesen

      Rev 1.29   30 Nov 1998 17:46:50   JP
   Task #59822#: OLE-Objecte importieren

      Rev 1.28   30 Nov 1998 17:30:36   KHZ
   Task #54828# Unicode-Import

      Rev 1.27   03 Nov 1998 18:29:54   KHZ
   Task #57243# Performance-Gewinn durch Vermeiden ueberfluessiger WW8GetSprmId()

      Rev 1.26   02 Nov 1998 17:58:32   KHZ
   Task #57017# Textmarken-Namen als UNICODE-Strings

      Rev 1.25   16 Oct 1998 16:12:34   KHZ
   Task #53520# ueberpruefe Feld DRUCKDATUM in DocInfo anhand von WW-internem Feld

      Rev 1.24   22 Sep 1998 19:37:42   KHZ
   Bug #57018# Fontnamen wurden unrichtig importiert

      Rev 1.23   22 Sep 1998 17:40:24   KHZ
   Bug #56310# Kopf-/Fusszeilen in Unicode-Dokumenten jetzt korrekt

      Rev 1.22   03 Sep 1998 22:15:40   KHZ
   Task #55189# Textboxen

      Rev 1.21   27 Aug 1998 10:12:28   KHZ
   Task #55189# Escher-Import fuer Draw, Calc und Writer

      Rev 1.20   11 Aug 1998 12:26:16   KHZ
   Task #52607# Optimierung in AdjustEnds(), GetNewSprms(), GetNoNewSprms()

      Rev 1.19   30 Jul 1998 14:47:24   JP
   Bug #54385#: sal_Unicode ist unter UNX ein long und kein UINT16

      Rev 1.18   30 Jul 1998 00:02:54   KHZ
   Task #53614# Grafiken, die NICHT ueber dem Text liegen (MSDFF-Quick-Hack)

      Rev 1.17   29 Jul 1998 16:53:18   KHZ
   Task #52607# Fehler in FKP (Teil 2)

      Rev 1.16   29 Jul 1998 13:56:10   KHZ
   Task #52607# Fehler in FKP

      Rev 1.15   28 Jul 1998 22:27:28   KHZ
   Task #52607# nummerierte Listen (Teil 3)

      Rev 1.14   28 Jul 1998 11:05:46   KHZ
   Task #52607# nummerierte Listen (Teil 1)

      Rev 1.13   22 Jul 1998 15:32:56   KHZ
   Task #52607#

      Rev 1.12   21 Jul 1998 14:52:28   KHZ
   Task #52607# (WW 97 Import)

      Rev 1.11   21 Jul 1998 12:32:52   KHZ
   als MSDrawingObject eingebettete Grafik (Teil 1)

      Rev 1.10   16 Jul 1998 21:50:14   KHZ
   Task #52607# Compilererror wg. (rLen *= 2) -= 2

      Rev 1.9   15 Jul 1998 15:47:18   KHZ
   Task #52607# Felder

      Rev 1.8   14 Jul 1998 16:34:18   KHZ
   Task #52607# Absatz- und Zeichen-Styles

      Rev 1.7   13 Jul 1998 15:29:46   KHZ
   Task #52607# Seitenvorlage fuer 1st Page, embed. Grafik (NICHT UEBER Text)

      Rev 1.6   30 Jun 1998 21:33:20   KHZ
   Header/Footer/Footnotes weitgehend ok

      Rev 1.5   26 Jun 1998 20:50:22   KHZ
   Absatz-Attribute jetzt weitestgehend ok

      Rev 1.4   23 Jun 1998 20:49:26   KHZ
   verarbeitet jetzt auch mehrere FKPs

      Rev 1.3   23 Jun 1998 11:24:28   KHZ
   Zwischenstand: die meisten Zeichenattribute Ok!

      Rev 1.2   18 Jun 1998 09:47:12   KHZ
   Zwischenstand fur 396c

      Rev 1.1   16 Jun 1998 18:35:30   KHZ
   DaSi-Stand

      Rev 1.0   16 Jun 1998 10:57:24   KHZ
   Initial revision.

      Rev 1.1   10 Jun 1998 17:22:32   KHZ
   Zwischenstand-Sicherung Dumper

      Rev 1.0   27 May 1998 15:29:02   KHZ
   Initial revision.


*************************************************************************/
diff --git a/sw/source/filter/ww8/dump/ww8scan.hxx b/sw/source/filter/ww8/dump/ww8scan.hxx
new file mode 100644
index 0000000..d49c1a8
--- /dev/null
+++ b/sw/source/filter/ww8/dump/ww8scan.hxx
@@ -0,0 +1,1498 @@
/*************************************************************************
 *
 *  $RCSfile: ww8scan.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:59 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _WW8SCAN_HXX
#define _WW8SCAN_HXX


#ifndef _SOLAR_H
#include <tools/solar.h>        // UINTXX
#endif
#ifndef _DATETIME_HXX //autogen
#include <tools/datetime.hxx>
#endif
#ifndef _STREAM_HXX //autogen
#include <tools/stream.hxx>
#endif
#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif
#ifndef WW8STRUC_HXX
#include "ww8struc.hxx"     // FIB, STSHI, STD
#endif
#ifndef LONG_MAX
#include <limits.h>
#endif
#ifndef _SAL_TYPES_H
#include <sal/types.h>
#endif

                        // ASS_FALSE, um ASSERT( ASS_FALSE, ... ) schreiben
                        // zu koennen, ohne vom Compiler angemeckert zu werden
#ifndef ASS_FALSE
#define ASS_FALSE ( !this )
#endif

#ifndef DELETEZ
#define DELETEZ( p ) ( delete( p ), p = 0 )
#endif


//class SvStream;
class  UShortStk;
class  WW8Fib;
class  WW8ScannerBase;
class  WW8PLCFspecial;
struct WW8PLCFxDesc;
class  WW8PLCFx_PCD;
class  SvUShortsSort;



UINT8* WW8ReadPString( SvStream& rStrm, BOOL bAtEndSeekRel1 = TRUE );

// Folgende Methode liest einen 2-byter-UNICODE-String ein:
// - falls bAtEndSeekRel1 gesetzt ist, wird am Ende genau EIN Byte uebersprungen,
// - falls nChars (die Zeichen-Anzahl, NICHT die Byte-Anzahl) nicht gesetzt ist,
//   wird das erste USHORT als Lannengenangabe interpretiert,
//   ansonsten als erstes String-Zeichen genommen.
UINT8* WW8Read_xstz(SvStream& rStrm, BOOL bAtEndSeekRel1 = TRUE,
                    USHORT nChars = 0, BOOL bInsLeadingLen = TRUE,
                    long* pWasRead = 0 );


// read array of strings (see MS documentation: STring TaBle stored in File)
// returns NOT the original pascal strings but an array of converted char*
//
// attention: the *extra data* of each string are SKIPPED and ignored
char** WW8ReadSTTBF(BOOL bVer8, SvStream& rStrm, UINT32 nStart,
                    INT32 nLen,
                    long& rCount,
                    USHORT nSkip = 0, BYTE ***pData=0);

USHORT WW8GetSprmId(        BYTE nVersion, BYTE* pSp,   BYTE*   pDelta = 0 );
short WW8GetSprmSizeNetto(  BYTE nVersion, BYTE* pSprm, USHORT* pId );
short WW8GetSprmSizeBrutto( BYTE nVersion, BYTE* pSprm, USHORT* pId );
BYTE WW8SprmDataOfs( USHORT nId );

struct WW8_PSTR         // Pascal-String
{
    UINT8 nLen;
    char cStr[2];       // offene Laenge
};

struct WW8FieldDesc
{
    long nLen;              // Gesamtlaenge ( zum Text ueberlesen )
    WW8_CP nSCode;           // Anfang Befehlscode
    long nLCode;            // Laenge
    WW8_CP nSRes;           // Anfang Ergebnis
    long nLRes;             // Laenge ( == 0, falls kein Ergebnis )
    USHORT nId;             // WW-Id fuer Felder
    BYTE nOpt;              // WW-Flags ( z.B.: vom User geaendert )
    BOOL bCodeNest:1;       // Befehl rekursiv verwendet
    BOOL bResNest:1;        // Befehl in Resultat eingefuegt
};

BOOL WW8GetFieldPara( BYTE nVersion, WW8PLCFspecial& rPLCF, WW8FieldDesc& rF );


/*
    u.a. fuer Felder, also genausoviele Attr wie Positionen,
    falls Ctor-Param bNoEnd = false
*/
class WW8PLCFspecial        // Iterator fuer PLCFs
{
    INT32* pPLCF_PosArray;  // Pointer auf Pos-Array und auf ganze Struktur
    char*  pPLCF_Contents;  // Pointer auf Inhalts-Array-Teil des Pos-Array
    long nIMax;         // Anzahl der Elemente
    long nIdx;          // Merker, wo wir gerade sind
    long nStru;

public:
    WW8PLCFspecial( SvStream* pSt, long nFilePos, long nPLCF,
          long nStruct, long nStartPos = -1, BOOL bNoEnd = FALSE );
    ~WW8PLCFspecial(){ delete( pPLCF_PosArray ); pPLCF_PosArray = 0; }
    ULONG GetIdx() const { return (ULONG)nIdx; }
    void SetIdx( ULONG nI ) { nIdx = (long)nI; }    // geht ueber Nummer
    long GetIMax(){ return nIMax; }
    BOOL SeekPos( long nPos );          // geht ueber FC- bzw. CP-Wert
                                                                    // bzw. naechste groesseren Wert
    BOOL SeekPosExact( long nPos );
    long Where() { return ( nIdx >= nIMax ) ? LONG_MAX : pPLCF_PosArray[nIdx]; }
    BOOL Get( long& rStart, void*& rpValue );
    BOOL GetData( long nIdx, long& rPos, void*& rpValue );

    const void* GetData( long nIdx ) const {
        return ( nIdx >= nIMax ) ? 0 : (const void*)&pPLCF_Contents[nIdx * nStru]; }
    long GetPos( long nIdx ){
        return ( nIdx >= nIMax ) ? LONG_MAX : pPLCF_PosArray[nIdx]; }

    WW8PLCFspecial& operator ++( int ) { nIdx++; return *this; }
    WW8PLCFspecial& operator --( int ) { nIdx--; return *this; }
};




/*
    simple Iterator for SPRMs
*/
class WW8SprmIter
{
    // these members will be updated
    BYTE*   pSprms;     // remaining part of the SPRMs ( == start of akt. SPRM)
    BYTE*   pAktParams; // start of akt. SPRM's parameters
    USHORT  nAktId;
    short   nAktSizeBrutto;

    // these members will *not* be updated by UpdateMyMembers()
    BYTE    nVersion;
    BYTE    nDelta;
    short   nRemLen;    // length of remaining SPRMs (including akt. SPRM)

    void UpdateMyMembers();
public:
    WW8SprmIter( BYTE* pSprms_, short nLen_, BYTE nVersion_ );
    void   SetSprms( BYTE* pSprms_, short nLen_ );
    BYTE*  operator ++( int );
    BYTE*  GetSprms()     const { return ( pSprms && (0 < nRemLen) )
                                ? pSprms
                                : 0; }
    BYTE*  GetAktParams() const { return pAktParams; }
    USHORT GetAktId()     const { return nAktId; }
};



/*
    u.a. fuer FKPs auf normale Attr., also ein Attr weniger als Positionen
*/
class WW8PLCF                       // Iterator fuer PLCFs
{
    INT32* pPLCF_PosArray;  // Pointer auf Pos-Array und auf ganze Struktur
    char* pPLCF_Contents;       // Pointer auf Inhalts-Array-Teil des Pos-Array
    long nIMax;                         // Anzahl der Elemente
    long nIdx;
    long nStru;

    void ReadPLCF( SvStream* pSt, long nFilePos, long nPLCF );

    /*
        Falls im Dok ein PLC fehlt und die FKPs solo dastehen,
        machen wir uns hiermit einen PLC:
    */
    void GeneratePLCF( SvStream* pSt, long nPN, long ncpN );

public:
    WW8PLCF( SvStream* pSt, long nFilePos, long nPLCF,
        long nStruct, long nStartPos = -1 );

    /*
        folgender Ctor generiert ggfs. einen PLC aus nPN und ncpN
    */
    WW8PLCF( SvStream* pSt, long nFilePos, long nPLCF,
        long nStruct, long nStartPos, long nPN, long ncpN );

    ~WW8PLCF(){ delete( pPLCF_PosArray ); pPLCF_PosArray = 0; }
    ULONG GetIdx() const { return (ULONG)nIdx; }
    void SetIdx( ULONG nI ) { nIdx = (long)nI; }
    long GetIMax(){ return nIMax; }
    BOOL SeekPos( long nPos );
    long Where();
    BOOL Get( long& rStart, long& rEnd, void*& rpValue );
    WW8PLCF& operator ++( int ) { if( nIdx < nIMax ) nIdx++; return *this; }

    const void* GetData( long nIdx ) const {
        return ( nIdx >= nIMax ) ? 0 : (const void*)&pPLCF_Contents[nIdx * nStru]; }
};

/*
    fuer Piece Table (bei Schnellspeicherung)
*/
class WW8PLCFpcd
{
friend class WW8PLCFpcd_Iter;
    INT32* pPLCF_PosArray;  // Pointer auf Pos-Array und auf ganze Struktur
    char*  pPLCF_Contents;  // Pointer auf Inhalts-Array-Teil des Pos-Array
    long nIMax;
    long nStru;

public:
    WW8PLCFpcd( SvStream* pSt, long nFilePos, long nPLCF, long nStruct );
    ~WW8PLCFpcd(){ delete( pPLCF_PosArray ); }
};

/*
    mehrere WW8PLCFpcd_Iter koennen auf die gleiche WW8PLCFpcd zeigen !!!
*/
class WW8PLCFpcd_Iter
{
    WW8PLCFpcd& rPLCF;
    long nIdx;

public:
    WW8PLCFpcd_Iter( WW8PLCFpcd& rPLCFpcd, long nStartPos = -1 );
//  ~WW8PLCFpcd_Iter() {}
    ULONG GetIdx() const { return (ULONG)nIdx; }
    void SetIdx( ULONG nI ) { nIdx = (long)nI; }
    long GetIMax(){ return rPLCF.nIMax; }
    BOOL SeekPos( long nPos );
//  BOOL SeekMaxMainFC( WW8Fib& rWwF, long& rMaxPosData );
    long Where();
    BOOL Get( long& rStart, long& rEnd, void*& rpValue );
    WW8PLCFpcd_Iter& operator ++( int ) { if( nIdx < rPLCF.nIMax ) nIdx++; return *this; }
};

// PLCF-Typ:
enum ePLCFT{ CHP=0, PAP, SEP, /*HED, FNR, ENR,*/ PLCF_END };

/*
    pure virtual:
*/
class WW8PLCFx              // virtueller Iterator fuer Piece Table Exceptions
{
    BYTE nVersion;              // Versionsnummer des FIB
    BOOL bIsSprm;               // PLCF von Sprms oder von anderem ( Footnote, ... )

public:
    WW8PLCFx( BYTE nFibVersion, BOOL bSprm )
        { bIsSprm = bSprm; nVersion = nFibVersion; }

//  virtual ~WW8PLCFx() {}
    BOOL IsSprm() { return bIsSprm; }
    virtual ULONG GetIdx() = 0;
    virtual void SetIdx( ULONG nIdx ) = 0;
    virtual ULONG GetIdx2();
    virtual void SetIdx2( ULONG nIdx );
    virtual BOOL SeekPos( WW8_CP nCpPos ) = 0;
    virtual long Where() = 0;
//  virtual BYTE* GetSprms( long& rStart, long& rEnd, long& rLen );
    virtual void GetSprms( WW8PLCFxDesc* p );
    virtual long GetNoSprms( long& rStart, long&, long& rLen );
    virtual WW8PLCFx& operator ++( int ) = 0;
    virtual USHORT GetIstd() const { return 0xffff; }
    BYTE GetVersion() const { return nVersion; }
};

enum eCutT { CUT_NONE = 0, CUT_START, CUT_END, CUT_BOTH };

class WW8PLCFx_PCDAttrs : public WW8PLCFx
{
    WW8PLCFpcd_Iter* pPcdI;
    WW8PLCFx_PCD* pPcd;
    char** pGrpprls;            // Attribute an Piece-Table
    SVBT32 aShortSprm;          // mini storage: can contain ONE sprm with
                                // 1 byte param
    UINT16 nGrpprls;            // Attribut Anzahl davon

public:
    WW8PLCFx_PCDAttrs( BYTE nVersion, WW8PLCFx_PCD* pPLCFx_PCD, WW8ScannerBase* pBase );
    virtual ~WW8PLCFx_PCDAttrs();
    virtual ULONG GetIdx();
    virtual void SetIdx( ULONG nI );
    virtual BOOL SeekPos( WW8_CP nCpPos );
    virtual long Where();
    virtual void GetSprms( WW8PLCFxDesc* p );
    virtual WW8PLCFx& operator ++( int );

    WW8PLCFpcd_Iter* GetIter() const { return pPcdI; }
};

class WW8PLCFx_PCD : public WW8PLCFx            // Iterator fuer Piece Table
{
    WW8PLCFpcd_Iter* pPcdI;
    BOOL bVer67;

public:
    WW8PLCFx_PCD( BYTE nVersion, WW8PLCFpcd* pPLCFpcd, WW8_CP nStartCp, BOOL bVer67P );
    virtual ~WW8PLCFx_PCD();
    virtual ULONG GetIdx();
    virtual void SetIdx( ULONG nI );
    virtual BOOL SeekPos( WW8_CP nCpPos );
    virtual long Where();
//  virtual void GetSprms( WW8PLCFxDesc* p );
    virtual long GetNoSprms( long& rStart, long&, long& rLen );
    virtual WW8PLCFx& operator ++( int );
    WW8_CP AktPieceStartFc2Cp( WW8_FC nStartPos );
    WW8_FC AktPieceStartCp2Fc( WW8_CP nCp );
    eCutT AktPieceFc2Cp( long& rStartPos, long& rEndPos );
    WW8PLCFpcd_Iter* GetPLCFIter() { return pPcdI; }

    static INT32 TransformPieceAddress(long nfc, BOOL& bIsUnicodeAddress)
    {
        bIsUnicodeAddress = 0 == (0x40000000 & nfc);
        return bIsUnicodeAddress
            ?  nfc
            : (nfc & 0x3fffFFFF) / 2;
    }
    BOOL IsVersion67() const { return bVer67; }
};


class WW8PLCFx_Fc_FKP : public WW8PLCFx     // Iterator fuer Piece Table Exceptions of Fkps
                                // arbeitet nur auf FCs, nicht auf CPs !
                                // ( Low-Level )
{


        class WW8Fkp        // Iterator fuer Formatted Disk Page
        {
            struct WW8Grpprl
            {
                BYTE*  pData;
                USHORT nLen;
                USHORT nIStd; // nur bei Fkp.Papx gueltig (aktuelle Style-Nr)
                BOOL   bMustDelete;
            };

            WW8Grpprl* pGrpprl;     // Pointer of Meta Array (pointing

            BYTE* pFkp;         // gesamter Fkp

            long nItemSize;     // entweder 1 Byte oder ein komplettes BX
            short nIdx;         // Pos-Merker
            ePLCFT ePLCF;
            char nIMax;         // Anzahl der Eintraege
            BYTE nVersion;

        public:
            WW8Fkp( BYTE nFibVer, SvStream* pFKPStrm, SvStream* pDataStrm,
                    long nFilePos, long nItemSiz,
                    ePLCFT ePl, WW8_FC nStartFc = -1 );
            ~WW8Fkp();
            ULONG GetIdx() const { return (ULONG)nIdx; }
            void SetIdx( ULONG nI );
            BOOL SeekPos( long nPos );
            WW8_FC Where() { return (  nIdx<nIMax)
                                     ? ((WW8_FC*)pFkp)[nIdx]
                                     : LONG_MAX; }
            WW8Fkp& operator ++( int ) { if( nIdx < nIMax ) nIdx++;
                                         return *this; }
            BYTE* Get( WW8_FC& rStart, WW8_FC& rEnd, short& rLen );
            USHORT GetIstd() const { return pGrpprl[ nIdx ].nIStd; }

            /*
                liefert einen echten Pointer auf das Sprm vom Typ nId,
                falls ein solches im Fkp drin ist.
            */
            BYTE* GetLenAndIStdAndSprms(short& rLen);

            /*
                ruft GetLenAndIStdAndSprms() auf...
            */
            BYTE* HasSprm( USHORT nId );

            ULONG GetParaHeight() const;    // fuer Header/Footer bei Papx-Fkps

            BYTE GetVersion() const { return nVersion; }
        };


    WW8PLCFx_PCDAttrs* pPCDAttrs;
    SvStream* pFKPStrm;         // Input-File
    SvStream* pDataStrm;        // Input-File
    WW8PLCF* pPLCF;
    WW8Fkp* pFkp;
    WW8_FC nStartFc;

    BOOL NewFkp();

protected:
    ePLCFT ePLCF;

public:
    WW8PLCFx_Fc_FKP( SvStream* pSt, SvStream* pTblSt, SvStream* pDataSt,
                     WW8Fib& rFib, ePLCFT ePl, WW8_FC nStartFcL,
                     WW8PLCFx_PCDAttrs* pPLCFx_PCD );
    virtual ~WW8PLCFx_Fc_FKP();
    virtual ULONG GetIdx();
    virtual void SetIdx( ULONG nIdx );
    virtual BOOL SeekPos( WW8_FC nFcPos );
    virtual WW8_FC Where();
    BYTE* GetSprms( WW8_FC& rStart, WW8_FC& rEnd, long& rLen );
    virtual WW8PLCFx& operator ++( int );
    virtual USHORT GetIstd() const;
    void GetPCDSprms( WW8PLCFxDesc& rDesc );
    BYTE* HasSprm( USHORT nId );
    ULONG GetParaHeight() const;
};

// Iterator fuer Piece Table Exceptions of Fkps arbeitet auf CPs (High-Level)
class WW8PLCFx_Cp_FKP : public WW8PLCFx_Fc_FKP
{
    const WW8ScannerBase& rSBase;
    WW8PLCFx_PCD* pPcd;
    WW8_CP nAttrStart, nAttrEnd;
    BOOL bLineEnd : 1;
    BOOL bComplex : 1;

    void SearchParaEnd( long nOldEndCp );

public:
    WW8PLCFx_Cp_FKP( SvStream* pSt, SvStream* pTblSt, SvStream* pDataSt, const WW8ScannerBase&
                        rBase,  ePLCFT ePl );
    virtual ~WW8PLCFx_Cp_FKP();
    void ResetAttrStartEnd();
    ULONG GetIdx2();
    void SetIdx2( ULONG nIdx );
    virtual BOOL SeekPos( WW8_CP nCpPos );
    virtual WW8_CP Where();
    virtual void GetSprms( WW8PLCFxDesc* p );
    virtual WW8PLCFx& operator ++( int );
};



class WW8PLCFx_SEPX : public WW8PLCFx           // Iterator fuer Piece Table Exceptions of Sepx
{
    SvStream* pStrm;
    WW8PLCF* pPLCF;
    BYTE* pSprms;
    USHORT nArrMax;
    UINT16 nSprmSiz;

public:
    WW8PLCFx_SEPX( SvStream* pSt, SvStream* pTblxySt, WW8Fib& rFib, WW8_CP nStartCp );
    virtual ~WW8PLCFx_SEPX();
    virtual ULONG GetIdx();
    virtual void SetIdx( ULONG nIdx );
    long GetIMax() const { return ( pPLCF ) ? pPLCF->GetIMax() : 0; }
    virtual BOOL SeekPos( WW8_CP nCpPos );
    virtual long Where();
    virtual void GetSprms( WW8PLCFxDesc* p );
    virtual WW8PLCFx& operator ++( int );
    BYTE* HasSprm( USHORT nId ) const;
    BYTE* HasSprm( USHORT nId, BYTE n2nd ) const;
    BYTE* HasSprm( USHORT nId, BYTE* pOtherSprms, long nOtherSprmSiz ) const;
    BOOL Find4Sprms(USHORT nId1, USHORT nId2, USHORT nId3, USHORT nId4,
                    BYTE*& p1,   BYTE*& p2,   BYTE*& p3,   BYTE*& p4 ) const;
    BOOL CompareSprms( BYTE* pOtherSprms,
                       long nOtherSprmSiz,
                       const SvUShortsSort* pIgnoreSprms = 0 ) const;
};

// Iterator fuer Fuss-/Endnoten und Anmerkungen
class WW8PLCFx_SubDoc : public WW8PLCFx
{
    WW8PLCF* pRef;
    WW8PLCF* pTxt;

public:
    WW8PLCFx_SubDoc( SvStream* pSt, BYTE nVersion, WW8_CP nStartCp,
                    long nFcRef, long nLenRef,
                    long nFcTxt, long nLenTxt, long nStruc = 0 );
    virtual ~WW8PLCFx_SubDoc();
    virtual ULONG GetIdx();
    virtual void SetIdx( ULONG nIdx );
    virtual BOOL SeekPos( WW8_CP nCpPos );
    virtual long Where();

    // liefert Reference Descriptoren
    const void* GetData( long nIdx = -1 ) const
        {
            return pRef ? pRef->GetData( -1L == nIdx ? pRef->GetIdx()
                                                     : nIdx ) : 0;
        }

    /*
        liefert Angabe, wo Kopf und Fusszeilen-Text zu finden ist
    */
    BOOL Get( long& rStart, void*& rpValue );
    virtual long GetNoSprms( long& rStart, long&, long& rLen );
    virtual WW8PLCFx& operator ++( int );
    long Count() { return ( pRef ) ? pRef->GetIMax() : 0; }
};

class WW8PLCFx_FLD : public WW8PLCFx            // Iterator fuer Fuss- und Endnoten
{
    WW8PLCFspecial* pPLCF;
    WW8Fib& rFib;

public:
    WW8PLCFx_FLD( SvStream* pSt, WW8Fib& rMyFib, short nType, WW8_CP nStartCp );
    virtual ~WW8PLCFx_FLD();
    virtual ULONG GetIdx();
    virtual void SetIdx( ULONG nIdx );
    virtual BOOL SeekPos( WW8_CP nCpPos );
    virtual long Where();
    virtual long GetNoSprms( long& rStart, long&, long& rLen );
    virtual WW8PLCFx& operator ++( int );
    BOOL GetPara( long nIdx, WW8FieldDesc& rF );
};

enum eBookStatus { BOOK_NORMAL = 0, BOOK_IGNORE = 0x1, BOOK_ONLY_REF = 0x2 };

class WW8PLCFx_Book : public WW8PLCFx           // Iterator fuer Booknotes
{
    WW8PLCFspecial* pBook[2];           // Start- und EndPosition
    char** pBookNames;                  // Name
    eBookStatus* pStatus;
    long nIMax;                         // Anzahl der Booknotes
    USHORT nIsEnd;
public:
    WW8PLCFx_Book( SvStream* pSt, SvStream* pTblSt, WW8Fib& rFib, WW8_CP nStartCp );
    virtual ~WW8PLCFx_Book();
    long GetIMax(){ return nIMax; }
    virtual ULONG GetIdx();
    virtual void SetIdx( ULONG nI );
    virtual ULONG GetIdx2();
    virtual void SetIdx2( ULONG nIdx );
    virtual BOOL SeekPos( WW8_CP nCpPos );
    virtual long Where();
    virtual long GetNoSprms( long& rStart, long& rEnd, long& rLen );
    virtual WW8PLCFx& operator ++( int );
    const char* GetName() const
        { return ( !nIsEnd && ( (long)(pBook[0]->GetIdx()) < nIMax ) )
                    ? pBookNames[pBook[0]->GetIdx()] : 0; }
    WW8_CP GetStartPos() const
        { return ( nIsEnd ) ? LONG_MAX : pBook[0]->Where(); }
    long GetLen() const;
    BOOL GetIsEnd() const { return ( nIsEnd ) ? TRUE : FALSE; }
    long GetHandle() const;
    BOOL SetStatus( WW8_CP nStartRegion, WW8_CP nEndRegion, char* pName,
                    eBookStatus eStat );
    eBookStatus GetStatus() const;
};

/*
    hiermit arbeiten wir draussen:
*/
struct WW8PLCFManResult
{
    WW8_CP nCpPos;      // Attribut-Anfangsposition
    long nMemLen;       // Laenge dazu
    long nCp2OrIdx;     // footnote-textpos oder Index in PLCF
    WW8_CP nAktCp;      // wird nur vom Aufrufer benutzt
    BYTE* pMemPos;      // Mem-Pos fuer Sprms
    USHORT nSprmId;     // Sprm-Id ( 0 = ungueltige Id -> ueberspringen! )
                                        // (2..255) oder Pseudo-Sprm-Id (256..260)
                                        // bzw. ab Winword-Ver8 die Sprm-Id (800..)
    BYTE nFlags;        // Absatz- oder Section-Anfang
};

/*
    hiermit arbeitet der Manager drinnen:
*/
struct WW8PLCFxDesc
{
    WW8PLCFx* pPLCFx;
    UShortStk* pIdStk;// Speicher fuer Attr-Id fuer Attr-Ende(n)
    BYTE* pMemPos;      // wo liegen die Sprm(s)
    long nStartPos;
    long nEndPos;
    long nCp2OrIdx;     // wo liegen die NoSprm(s)
    long nSprmsLen;     // wie viele Bytes fuer weitere Sprms / Laenge Fussnote
    long nCpOfs;        // fuer Offset Header .. Footnote
    BOOL bFirstSprm;    // fuer Erkennung erster Sprm einer Gruppe
    BOOL bRealLineEnd;  // FALSE bei Pap-Piece-Ende
};


#define MAN_ANZ_PLCF 12

struct WW8PLCFxSave1
{
    ULONG nPLCFxPos;
    ULONG nPLCFxPos2;       // fuer PLCF_Cp_Fkp: PieceIter-Pos
    long nPLCFxMemOfs;
};

struct WW8PLCFxSaveAll
{
    WW8PLCFxSave1 aS[MAN_ANZ_PLCF];
};

#define MAN_MASK_NEW_PAP 1      // neue Zeile
#define MAN_MASK_NEW_SEP 2      // neue Section


#define MAN_MAINTEXT 0          // Defines fuer PLCFMan-ctor
#define MAN_FTN 1
#define MAN_EDN 2
#define MAN_HDFT 3
#define MAN_AND 4
#define MAN_TXBX 5
#define MAN_TXBX_HDFT 6

#ifndef DUMP

class WW8PLCFMan
{
    WW8PLCFxDesc aD[MAN_ANZ_PLCF];
    WW8PLCFxDesc *pChp, *pPap, *pSep, *pFld, *pFldTxbx, *pFldTxbxHdft,
                 *pFtn, *pEdn,
                 *pBkm, *pPcd, *pPcdA, *pAnd;
    WW8PLCFspecial *pFdoa, *pTxbx, *pTxbxBkd;

    WW8Fib* pWwFib;
    long nLineEnd;                  // zeigt *hinter* das <CR>

    USHORT nPLCF;                   // so viele PLCFe werden verwaltet
    short nManType;

    short WhereIdx( BOOL* pbStart, long* pPos );
    void AdjustEnds(    WW8PLCFxDesc& rDesc );
    void GetNewSprms(   WW8PLCFxDesc& rDesc );
    void GetNewNoSprms( WW8PLCFxDesc& rDesc );
    void GetSprmStart( short nIdx, WW8PLCFManResult* pRes );
    void GetSprmEnd( short nIdx, WW8PLCFManResult* pRes );
    void GetNoSprmStart( short nIdx, WW8PLCFManResult* pRes );
    void GetNoSprmEnd( short nIdx, WW8PLCFManResult* pRes );
    void AdvSprm(   short nIdx, BOOL bStart );
    void AdvNoSprm( short nIdx, BOOL bStart );

public:
    WW8PLCFMan( WW8ScannerBase* pBase, short nType, long nStartCp );
    ~WW8PLCFMan();

    /*
        Where fragt, an welcher naechsten Position sich irgendein
        Attr aendert...
    */
    long Where();

    BOOL Get( WW8PLCFManResult* pResult );
    WW8PLCFMan& operator ++( int );
    USHORT GetColl() const; // liefert aktuellen Style
    WW8PLCFx_FLD* GetFld() const;
    WW8PLCFx_SubDoc* GetEdn() const { return (WW8PLCFx_SubDoc*)pEdn->pPLCFx; }
    WW8PLCFx_SubDoc* GetFtn() const { return (WW8PLCFx_SubDoc*)pFtn->pPLCFx; }
    WW8PLCFx_SubDoc* GetAtn() const { return (WW8PLCFx_SubDoc*)pAnd->pPLCFx; }
    WW8PLCFx_Book* GetBook() const { return (WW8PLCFx_Book*)pBkm->pPLCFx; }
    long GetCpOfs() const { return pChp->nCpOfs; }  // fuer Header/Footer...

    /*
        fragt, ob *aktueller Absatz* einen Sprm diesen Typs hat
    */
    BYTE* HasParaSprm( USHORT nId ) const;

    /*
        fragt, ob *aktueller Textrun* einen Sprm diesen Typs hat
    */
    BYTE* HasCharSprm( USHORT nId ) const;

    WW8PLCFx_Cp_FKP* GetChpPLCF(){ return (WW8PLCFx_Cp_FKP*)pChp->pPLCFx; }
    WW8PLCFx_Cp_FKP* GetPapPLCF(){ return (WW8PLCFx_Cp_FKP*)pPap->pPLCFx; }
    WW8PLCFx_SEPX* GetSepPLCF(){   return (WW8PLCFx_SEPX*)pSep->pPLCFx; }
    WW8PLCFxDesc* GetPap(){ return pPap; }
    void Save1PLCFx(    WW8PLCFxDesc* p, WW8PLCFxSave1*   pSave ) const;
    void Restore1PLCFx( WW8PLCFxDesc* p, WW8PLCFxSave1*   pSave );
    void SaveAllPLCFx(                   WW8PLCFxSaveAll* pSave );
    void RestoreAllPLCFx(                WW8PLCFxSaveAll* pSave );
    WW8PLCFspecial* GetFdoa()   { return pFdoa;     }
    WW8PLCFspecial* GetTxbx()   { return pTxbx;     }
    WW8PLCFspecial* GetTxbxBkd(){ return pTxbxBkd;  }
    short GetManType() { return nManType; }
};

#endif // !DUMP

class WW8ScannerBase
{
friend WW8PLCFx_PCDAttrs::WW8PLCFx_PCDAttrs( BYTE nVersion, WW8PLCFx_PCD* pPLCFx_PCD, WW8ScannerBase* pBase );
friend WW8PLCFx_Cp_FKP::WW8PLCFx_Cp_FKP( SvStream*, SvStream*, SvStream*,
                                        const WW8ScannerBase&, ePLCFT );

#ifdef DUMP
friend static void DumpPLCFText( WW8_FC nPos, long nLen, long nOfs, char* pName,
                                WW8ScannerBase* pBase );
friend static void DumpFtnShort( short nId, long nPos, long nFieldLen );
#else
friend WW8PLCFMan::WW8PLCFMan( WW8ScannerBase*, short, long );
friend class SwWw8ImplReader;
#endif

    WW8Fib* pWw8Fib;
    WW8PLCFx_Cp_FKP*  pChpPLCF;         // Character-Attrs
    WW8PLCFx_Cp_FKP*  pPapPLCF;         // Para-Attrs
    WW8PLCFx_SEPX*    pSepPLCF;         // Section-Attrs
    WW8PLCFx_SubDoc*  pFtnPLCF;         // Footnotes
    WW8PLCFx_SubDoc*  pEdnPLCF;         // EndNotes
    WW8PLCFx_SubDoc*  pAndPLCF;         // Anmerkungen
    WW8PLCFx_FLD*     pFldPLCF;         // Fields in Main Text
    WW8PLCFx_FLD*     pFldHdFtPLCF;     // Fields in Header / Footer
    WW8PLCFx_FLD*     pFldTxbxPLCF;     // Fields in Textboxes in Main Text
    WW8PLCFx_FLD*     pFldTxbxHdFtPLCF; // Fields in Textboxes in Header / Footer
    WW8PLCFx_FLD*     pFldFtnPLCF;      // Fields in Footnotes
    WW8PLCFx_FLD*     pFldEdnPLCF;      // Fields in Endnotes
    WW8PLCFx_FLD*     pFldAndPLCF;      // Fields in Anmerkungen
    WW8PLCFspecial*   pMainFdoa;        // Graphic Primitives in Main Text
    WW8PLCFspecial*   pHdFtFdoa;        // Graphic Primitives in Header / Footer
    WW8PLCFspecial*   pMainTxbx;        // Textboxen in Main Text
    WW8PLCFspecial*   pMainTxbxBkd;     // Break-Deskriptoren fuer diese
    WW8PLCFspecial*   pHdFtTxbx;        // TextBoxen in Header / Footer
    WW8PLCFspecial*   pHdFtTxbxBkd;     // Break-Deskriptoren fuer diese
    WW8PLCFx_Book*    pBook;            // Bookmarks

    WW8PLCFpcd*         pPiecePLCF; // fuer FastSave ( Basis-PLCF ohne Iterator )
    WW8PLCFpcd_Iter*    pPieceIter; // fuer FastSave ( Iterator dazu )
    WW8PLCFx_PCD*       pPLCFx_PCD;     // dito
    WW8PLCFx_PCDAttrs*  pPLCFx_PCDAttrs;
    char**              pPieceGrpprls;      // Attribute an Piece-Table
    UINT16              nPieceGrpprls;      // Anzahl davon

    WW8PLCFpcd* OpenPieceTable( SvStream* pStr, WW8Fib* pWwF );
    void DeletePieceTable();

public:
    WW8ScannerBase( SvStream* pSt, SvStream* pTblSt, SvStream* pDataSt,
                    WW8Fib* pWwF );
    ~WW8ScannerBase();
    BOOL AreThereFootnotes() { return pFtnPLCF->Count() > 0; };
    BOOL AreThereEndnotes()  { return pEdnPLCF->Count() > 0; };
    static DateTime WW8DTTM2DateTime(long lDTTM);

    WW8_CP WW8Fc2Cp( WW8_FC nFcPos ) const ;
    WW8_FC WW8Cp2Fc( WW8_CP nCpPos, BOOL* pIsUnicode = 0,
                     WW8_CP* pNextPieceCp = 0, BOOL* pTestFlag = 0 ) const;

    USHORT WW8ReadString( SvStream& rStrm, String* pString,
                            WW8_CP nAktStartCp, long nTotalLen,
                            unsigned char** ppStr = 0 ) const;
};




class WW8Fib
{
public:
    /*
        von uns verlangte Programm-Version:
        in Ctor wird geprueft, ob sie zu nFib passt
    */
    BYTE nVersion;  // 6 steht fuer "WinWord 6 oder WinWord 95",
                                    // 7 steht fuer "nur WinWord 95"
                                    // 8 steht fuer "nur WinWord 97"
    /*
        Fehlerstatus
    */
    ULONG nFibError;
    /*
        vom Ctor aus dem FIB gelesene Daten
        (entspricht nur ungefaehr der tatsaechlichen Struktur
         des Winword-FIB)
    */
    UINT16 wIdent;      // 0x0 int magic number
    UINT16 nFib;        // 0x2 FIB version written
    UINT16 nProduct;    // 0x4 product version written by
    INT16 lid;          // 0x6 language stamp---localized version;
    WW8_PN pnNext;          // 0x8

    UINT16 fDot :1;     // 0xa 0001
    UINT16 fGlsy :1;
    UINT16 fComplex :1; // 0004 when 1, file is in complex, fast-saved format.
    UINT16 fHasPic :1;  // 0008 file contains 1 or more pictures
    UINT16 cQuickSaves :4; // 00F0 count of times file was quicksaved
    UINT16 fEncrypted :1; //0100 1 if file is encrypted, 0 if not
    UINT16 fWhichTblStm :1; //0200 When 0, this fib refers to the table stream
                                                    // named "0Table", when 1, this fib refers to the
                                                    // table stream named "1Table". Normally, a file
                                                    // will have only one table stream, but under unusual
                                                    // circumstances a file may have table streams with
                                                    // both names. In that case, this flag must be used
                                                    // to decide which table stream is valid.
    // UINT16 u1 :2;
    UINT16 fExtChar :1; // 1000 =1, when using extended character set in file
    // UINT16 u2 :3;

    UINT16 nFibBack;    // 0xc
    INT16 lKey1;            // 0xe  file encrypted key, only valid if fEncrypted.
    INT16 lKey2;            // 0x10  key in 2 Portionen wg. Misalignment
    UINT8 envr;         // 0x12 environment in which file was created
                                    //      0 created by Win Word / 1 created by Mac Word
    BYTE fMac              :1;          // 0x13 when 1, this file was last saved in the Mac environment
    BYTE fEmptySpecial     :1;
    BYTE fLoadOverridePage :1;
    BYTE fFuturesavedUndo  :1;
    BYTE fWord97Saved      :1;
    BYTE :3;

    UINT16 chse;        // 0x14 default extended character set id for text in document stream. (overidden by chp.chse)
                        //      0 = ANSI  / 256 Macintosh character set.
    UINT16 chseTables;  // 0x16 default extended character set id for text in
                        //      internal data structures: 0 = ANSI, 256 = Macintosh
    WW8_FC fcMin;           // 0x18 file offset of first character of text
    WW8_FC fcMac;           // 0x1c file offset of last character of text + 1

    // Einschub fuer WW8 *****************************************************
    UINT16 csw;             // Count of fields in the array of "shorts"

    // Marke: "rgsw" Beginning of the array of shorts
    UINT16 wMagicCreated;                   // unique number Identifying the File's creator
                                                                // 0x6A62 is the creator ID for Word and is reserved.
                                                                // Other creators should choose a different value.
    UINT16 wMagicRevised;                   // identifies the File's last modifier
  UINT16 wMagicCreatedPrivate;  // private data
    UINT16 wMagicRevisedPrivate;    // private data
    /*
    INT16  pnFbpChpFirst_W6;            // not used
    INT16  pnChpFirst_W6;                   // not used
    INT16  cpnBteChp_W6;                    // not used
    INT16  pnFbpPapFirst_W6;            // not used
    INT16  pnPapFirst_W6;                   // not used
    INT16  cpnBtePap_W6;                    // not used
    INT16  pnFbpLvcFirst_W6;            // not used
    INT16  pnLvcFirst_W6;                   // not used
    INT16  cpnBteLvc_W6;                    // not used
    */
    INT16  lidFE;                                   // Language id if document was written by Far East version
                                                                // of Word (i.e. FIB.fFarEast is on)
    UINT16 clw;                                     // Number of fields in the array of longs

    // Ende des Einschubs fuer WW8 *******************************************

    // Marke: "rglw" Beginning of the array of longs
    WW8_FC cbMac;           // 0x20 file offset of last byte written to file + 1.

    // WW8_FC u4[4];            // 0x24
    WW8_CP ccpText;         // 0x34 length of main document text stream
    WW8_CP ccpFtn;          // 0x38 length of footnote subdocument text stream
    WW8_CP ccpHdr;          // 0x3c length of header subdocument text stream
    WW8_CP ccpMcr;          // 0x40 length of macro subdocument text stream
    WW8_CP ccpAtn;          // 0x44 length of annotation subdocument text stream
    WW8_CP ccpEdn;          // 0x48 length of endnote subdocument text stream
    WW8_CP ccpTxbx;         // 0x4c length of textbox subdocument text stream
    WW8_CP ccpHdrTxbx;      // 0x50 length of header textbox subdocument text stream

    // Einschub fuer WW8 *****************************************************
    INT32  pnFbpChpFirst;   // when there was insufficient memory for Word to expand
                                                // the PLCFbte at save time, the PLCFbte is written
                                                // to the file in a linked list of 512-byte pieces
                                                // starting with this pn.
    /*
    // folgende Felder existieren zwar so in der Datei,
    // wir benutzen jedoch unten deklarierte General-Variablen
    // fuer Ver67 und Ver8 gemeinsam.
    INT32  pnChpFirst;      // the page number of the lowest numbered page in the
                                                        // document that records CHPX FKP information
    INT32  cpnBteChp;           // count of CHPX FKPs recorded in file. In non-complex
                                                        // files if the number of entries in the PLCFbteChpx
                                                        // is less than this, the PLCFbteChpx is incomplete.
    */
    INT32  pnFbpPapFirst;   // when there was insufficient memory for Word to expand
                                                // the PLCFbte at save time, the PLCFbte is written to
                                                // the file in a linked list of 512-byte pieces
                                                // starting with this pn
    /*
    // folgende Felder existieren zwar so in der Datei,
    // wir benutzen jedoch unten deklarierte General-Variablen
    // fuer Ver67 und Ver8 gemeinsam.
    INT32  pnPapFirst;      // the page number of the lowest numbered page in the
                                                        // document that records PAPX FKP information
    INT32  cpnBtePap;       // count of PAPX FKPs recorded in file. In non-complex
                                                        // files if the number of entries in the PLCFbtePapx is
                                                        // less than this, the PLCFbtePapx is incomplete.
    */
    INT32  pnFbpLvcFirst;   // when there was insufficient memory for Word to expand
                                                // the PLCFbte at save time, the PLCFbte is written to
                                                // the file in a linked list of 512-byte pieces
                                                // starting with this pn
    INT32  pnLvcFirst;          // the page number of the lowest numbered page in the
                                                // document that records LVC FKP information
    INT32  cpnBteLvc;           // count of LVC FKPs recorded in file. In non-complex
                                                // files if the number of entries in the PLCFbtePapx is
                                                // less than this, the PLCFbtePapx is incomplete.
    INT32  fcIslandFirst;   // ?
    INT32  fcIslandLim;     // ?
    UINT16 cfclcb;              // Number of fields in the array of FC/LCB pairs.

    // Ende des Einschubs fuer WW8 *******************************************

    // Marke: "rgfclcb" Beginning of array of FC/LCB pairs.
    WW8_FC fcStshfOrig;     // file offset of original allocation for STSH in table
                                                // stream. During fast save Word will attempt to reuse
                                                // this allocation if STSH is small enough to fit.
    INT32 lcbStshfOrig; // 0x5c count of bytes of original STSH allocation
    WW8_FC fcStshf;         // 0x60 file offset of STSH in file.
    INT32 lcbStshf;     // 0x64 count of bytes of current STSH allocation
    WW8_FC fcPlcffndRef;    // 0x68 file offset of footnote reference PLCF.
    INT32 lcbPlcffndRef;    // 0x6c count of bytes of footnote reference PLCF
                        //      == 0 if no footnotes defined in document.

    WW8_FC fcPlcffndTxt;    // 0x70 file offset of footnote text PLCF.
    INT32 lcbPlcffndTxt;    // 0x74 count of bytes of footnote text PLCF.
                        //      == 0 if no footnotes defined in document

    WW8_FC fcPlcfandRef;    // 0x78 file offset of annotation reference PLCF.
    INT32 lcbPlcfandRef;    // 0x7c count of bytes of annotation reference PLCF.

    WW8_FC fcPlcfandTxt;    // 0x80 file offset of annotation text PLCF.
    INT32 lcbPlcfandTxt;    // 0x84 count of bytes of the annotation text PLCF

    WW8_FC fcPlcfsed;       // 8x88 file offset of section descriptor PLCF.
    INT32 lcbPlcfsed;   // 0x8c count of bytes of section descriptor PLCF.

    WW8_FC fcPlcfpad;       // 0x90 file offset of paragraph descriptor PLCF
    INT32 lcbPlcfpad;   // 0x94 count of bytes of paragraph descriptor PLCF.
                        // ==0 if file was never viewed in Outline view.
                        // Should not be written by third party creators

    WW8_FC fcPlcfphe;       // 0x98 file offset of PLCF of paragraph heights.
    INT32 lcbPlcfphe;   // 0x9c count of bytes of paragraph height PLCF.
                        // ==0 when file is non-complex.

    WW8_FC fcSttbfglsy;     // 0xa0 file offset of glossary string table.
    INT32 lcbSttbfglsy; // 0xa4 count of bytes of glossary string table.
                        //      == 0 for non-glossary documents.
                        //      !=0 for glossary documents.

    WW8_FC fcPlcfglsy;      // 0xa8 file offset of glossary PLCF.
    INT32 lcbPlcfglsy;  // 0xac count of bytes of glossary PLCF.
                        //      == 0 for non-glossary documents.
                        //      !=0 for glossary documents.

    WW8_FC fcPlcfhdd;       // 0xb0 byte offset of header PLCF.
    INT32 lcbPlcfhdd;   // 0xb4 count of bytes of header PLCF.
                        //      == 0 if document contains no headers

    WW8_FC fcPlcfbteChpx;   // 0xb8 file offset of character property bin table.PLCF.
    INT32 lcbPlcfbteChpx;// 0xbc count of bytes of character property bin table PLCF.

    WW8_FC fcPlcfbtePapx;   // 0xc0 file offset of paragraph property bin table.PLCF.
    INT32 lcbPlcfbtePapx;// 0xc4 count of bytes of paragraph  property bin table PLCF.

    WW8_FC fcPlcfsea;       // 0xc8 file offset of PLCF reserved for private use. The SEA is 6 bytes long.
    INT32 lcbPlcfsea;   // 0xcc count of bytes of private use PLCF.

    WW8_FC fcSttbfffn;      // 0xd0 file offset of font information STTBF. See the FFN file structure definition.
    INT32 lcbSttbfffn;  // 0xd4 count of bytes in sttbfffn.

    WW8_FC fcPlcffldMom;    // 0xd8 offset in doc stream to the PLCF of field positions in the main document.
    INT32 lcbPlcffldMom;    // 0xdc

    WW8_FC fcPlcffldHdr;    // 0xe0 offset in doc stream to the PLCF of field positions in the header subdocument.
    INT32 lcbPlcffldHdr;    // 0xe4

    WW8_FC fcPlcffldFtn;    // 0xe8 offset in doc stream to the PLCF of field positions in the footnote subdocument.
    INT32 lcbPlcffldFtn;    // 0xec

    WW8_FC fcPlcffldAtn;    // 0xf0 offset in doc stream to the PLCF of field positions in the annotation subdocument.
    INT32 lcbPlcffldAtn;    // 0xf4

    WW8_FC fcPlcffldMcr;    // 0xf8 offset in doc stream to the PLCF of field positions in the macro subdocument.
    INT32 lcbPlcffldMcr;    // 9xfc

    WW8_FC fcSttbfbkmk; // 0x100 offset in document stream of the STTBF that records bookmark names in the main document
    INT32 lcbSttbfbkmk; // 0x104

    WW8_FC fcPlcfbkf;   // 0x108 offset in document stream of the PLCF that records the beginning CP offsets of bookmarks in the main document. See BKF
    INT32 lcbPlcfbkf;   // 0x10c

    WW8_FC fcPlcfbkl;   // 0x110 offset in document stream of the PLCF that records the ending CP offsets of bookmarks recorded in the main document. See the BKL structure definition.
    INT32 lcbPlcfbkl;   // 0x114 INT32

    WW8_FC fcCmds;      // 0x118 FC
    INT32 lcbCmds;      // 0x11c

    WW8_FC fcPlcfmcr;       // 0x120 FC
    INT32 lcbPlcfmcr;       // 0x124

    WW8_FC fcSttbfmcr;  // 0x128 FC
    INT32 lcbSttbfmcr;  // 0x12c

    WW8_FC fcPrDrvr;        // 0x130 file offset of the printer driver information (names of drivers, port etc...)
    INT32 lcbPrDrvr;        // 0x134 count of bytes of the printer driver information (names of drivers, port etc...)

    WW8_FC fcPrEnvPort; // 0x138 file offset of the print environment in portrait mode.
    INT32 lcbPrEnvPort; // 0x13c count of bytes of the print environment in portrait mode.

    WW8_FC fcPrEnvLand; // 0x140 file offset of the print environment in landscape mode.
    INT32 lcbPrEnvLand; // 0x144 count of bytes of the print environment in landscape mode.

    WW8_FC fcWss;       // 0x148 file offset of Window Save State data structure. See WSS.
    INT32 lcbWss;       // 0x14c count of bytes of WSS. ==0 if unable to store the window state.

    WW8_FC fcDop;       // 0x150 file offset of document property data structure.
    INT32 lcbDop;       // 0x154 count of bytes of document properties.
        // cbDOP is 84 when nFib < 103


    WW8_FC fcSttbfAssoc;    // 0x158 offset to STTBF of associated strings. See STTBFASSOC.
    INT32 cbSttbfAssoc; // 0x15C

    WW8_FC fcClx;           // 0x160 file  offset of beginning of information for complex files.
    INT32 lcbClx;       // 0x164 count of bytes of complex file information. 0 if file is non-complex.

    WW8_FC fcPlcfpgdFtn;    // 0x168 file offset of page descriptor PLCF for footnote subdocument.
    INT32 lcbPlcfpgdFtn;    // 0x16C count of bytes of page descriptor PLCF for footnote subdocument.
                        //  ==0 if document has not been paginated. The length of the PGD is 8 bytes.

    WW8_FC fcAutosaveSource;    // 0x170 file offset of the name of the original file.
    INT32 lcbAutosaveSource;    // 0x174 count of bytes of the name of the original file.

    WW8_FC fcGrpStAtnOwners;    // 0x178 group of strings recording the names of the owners of annotations
    INT32 lcbGrpStAtnOwners;    // 0x17C count of bytes of the group of strings

    WW8_FC fcSttbfAtnbkmk;  // 0x180 file offset of the sttbf that records names of bookmarks in the annotation subdocument
    INT32 lcbSttbfAtnbkmk;  // 0x184 length in bytes of the sttbf that records names of bookmarks in the annotation subdocument

    // Einschubs fuer WW67 ***************************************************

    // INT16 wSpare4Fib;    // Reserve, muss hier nicht deklariert werden

    /*
    // folgende Felder existieren zwar so in der Datei,
    // wir benutzen jedoch unten deklarierte General-Variablen
    // fuer Ver67 und Ver8 gemeinsam.
    WW8_PN pnChpFirst;  // the page number of the lowest numbered page in
                                                        // the document that records CHPX FKP information
    WW8_PN pnPapFirst;  // the page number of the lowest numbered page in
                                                        // the document that records PAPX FKP information

    WW8_PN cpnBteChp;       // count of CHPX FKPs recorded in file. In non-complex
                                                        // files if the number of entries in the PLCFbteChpx is
                                                        // less than this, the PLCFbteChpx  is incomplete.
    WW8_PN cpnBtePap;       // count of PAPX FKPs recorded in file. In non-complex
                                                        // files if the number of entries in the PLCFbtePapx is
                                                        // less than this, the PLCFbtePapx  is incomplete.
    */

    // Ende des Einschubs fuer WW67 ******************************************

    WW8_FC fcPlcfdoaMom;    // 0x192 file offset of the  FDOA (drawn object) PLCF for main document.
                        //  ==0 if document has no drawn objects. The length of the FDOA is 6 bytes.
                        // ab Ver8 unused
    INT32 lcbPlcfdoaMom;    // 0x196 length in bytes of the FDOA PLCF of the main document
                                                // ab Ver8 unused
    WW8_FC fcPlcfdoaHdr;    // 0x19A file offset of the  FDOA (drawn object) PLCF for the header document.
                        //  ==0 if document has no drawn objects. The length of the FDOA is 6 bytes.
                        // ab Ver8 unused
    INT32 lcbPlcfdoaHdr;    // 0x19E length in bytes of the FDOA PLCF of the header document
                                                // ab Ver8 unused

    WW8_FC fcPlcfspaMom;        // offset in table stream of the FSPA PLCF for main document.
                                                // == 0 if document has no office art objects
                                                        // war in Ver67 nur leere Reserve
    INT32 lcbPlcfspaMom;        // length in bytes of the FSPA PLCF of the main document
                                                        // war in Ver67 nur leere Reserve
    WW8_FC fcPlcfspaHdr;        // offset in table stream of the FSPA PLCF for header document.
                                                // == 0 if document has no office art objects
                                                        // war in Ver67 nur leere Reserve
    INT32 lcbPlcfspaHdr;        // length in bytes of the FSPA PLCF of the header document
                                                        // war in Ver67 nur leere Reserve

    WW8_FC fcPlcfAtnbkf;    // 0x1B2 file offset of BKF (bookmark first) PLCF of the annotation subdocument
    INT32 lcbPlcfAtnbkf;    // 0x1B6 length in bytes of BKF (bookmark first) PLCF of the annotation subdocument

    WW8_FC fcPlcfAtnbkl;    // 0x1BA file offset of BKL (bookmark last) PLCF of the annotation subdocument
    INT32 lcbPlcfAtnbkl;    // 0x1BE length in bytes of BKL (bookmark first) PLCF of the annotation subdocument

    WW8_FC fcPms;       // 0x1C2 file offset of PMS (Print Merge State) information block
    INT32 lcbPMS;       // 0x1C6 length in bytes of PMS

    WW8_FC fcFormFldSttbf;  // 0x1CA file offset of form field Sttbf which contains strings used in form field dropdown controls
    INT32 lcbFormFldSttbf;  // 0x1CE length in bytes of form field Sttbf

    WW8_FC fcPlcfendRef;    // 0x1D2 file offset of PLCFendRef which points to endnote references in the main document stream
    INT32 lcbPlcfendRef;    // 0x1D6

    WW8_FC fcPlcfendTxt;    // 0x1DA file offset of PLCFendRef which points to endnote text  in the endnote document
                        //       stream which corresponds with the PLCFendRef
    INT32 lcbPlcfendTxt;    // 0x1DE

    WW8_FC fcPlcffldEdn;    // 0x1E2 offset to PLCF of field positions in the endnote subdoc
    INT32 lcbPlcffldEdn;    // 0x1E6

    WW8_FC  fcPlcfpgdEdn;   // 0x1EA offset to PLCF of page boundaries in the endnote subdoc.
    INT32 lcbPlcfpgdEdn;        // 0x1EE


    WW8_FC fcDggInfo;           // offset in table stream of the office art object table data.
                                                // The format of office art object table data is found in a separate document.
                                                        // war in Ver67 nur leere Reserve
    INT32 lcbDggInfo;           // length in bytes of the office art object table data
                                                        // war in Ver67 nur leere Reserve

    WW8_FC fcSttbfRMark;        // 0x1fa offset to STTBF that records the author abbreviations...
    INT32 lcbSttbfRMark;        // 0x1fe
    WW8_FC fcSttbfCaption;  // 0x202 offset to STTBF that records caption titles...
    INT32 lcbSttbfCaption;  // 0x206
    WW8_FC fcSttbAutoCaption;   // offset in table stream to the STTBF that records the object names and
                                                        // indices into the caption STTBF for objects which get auto captions.
    INT32 lcbSttbAutoCaption;   // 0x20e

    WW8_FC fcPlcfwkb;       // 0x212 offset to PLCF that describes the boundaries of contributing documents...
    INT32 lcbPlcfwkb;       // 0x216

    WW8_FC fcPlcfspl;       // offset in table stream of PLCF (of SPLS structures) that records spell check state
                                                        // war in Ver67 nur leere Reserve
    INT32 lcbPlcfspl;                   // war in Ver67 nur leere Reserve

    WW8_FC fcPlcftxbxTxt;   // 0x222 ...PLCF of beginning CP in the text box subdoc
    INT32 lcbPlcftxbxTxt;   // 0x226
    WW8_FC fcPlcffldTxbx;   // 0x22a ...PLCF of field boundaries recorded in the textbox subdoc.
    INT32 lcbPlcffldTxbx;   // 0x22e
    WW8_FC fcPlcfHdrtxbxTxt;// 0x232 ...PLCF of beginning CP in the header text box subdoc
    INT32 lcbPlcfHdrtxbxTxt;// 0x236
    WW8_FC fcPlcffldHdrTxbx;// 0x23a ...PLCF of field boundaries recorded in the header textbox subdoc.
    INT32 lcbPlcffldHdrTxbx;// 0x23e

    /*
        spezielle Listenverwaltung fuer WW8
    */
    WW8_FC fcPlcfLst;       // 0x02e2 offset in the table stream of list format information.
    INT32 lcbPlcfLst;       // 0x02e6 length
    WW8_FC fcPlfLfo;        // 0x02ea offset in the table stream of list format override information.
    INT32 lcbPlfLfo;        // 0x02ee length
    /*
        spezielle Break-Verwaltung fuer Text-Box-Stories in WW8
    */
    WW8_FC fcPlcftxbxBkd;   // 0x02f2 PLCF fuer TextBox-Break-Deskriptoren im Maintext
    INT32 lcbPlcftxbxBkd;   // 0x02f6
    WW8_FC fcPlcfHdrtxbxBkd;// 0x02fa PLCF fuer TextBox-Break-Deskriptoren im Header-/Footer-Bereich
    INT32 lcbPlcfHdrtxbxBkd;// 0x02fe

    // 0x302 - 372 == ignore
    /*
        ListNames (skip to here!)
    */
    WW8_FC fcSttbListNames;// 0x0372 PLCF for Listname Table
    INT32 lcbSttbListNames;// 0x0376
    /*
        General-Varaiblen, die fuer Ver67 und Ver8 verwendet werden,
        obwohl sie in der jeweiligen DATEI verschiedene Groesse haben:
    */
    INT32 pnChpFirst;
    INT32 pnPapFirst;
    INT32 cpnBteChp;
    INT32 cpnBtePap;
    /*
        nun wird lediglich noch ein Ctor benoetigt
    */
    WW8Fib( SvStream& rStrm, BYTE nWantedVersion,UINT32 nOffset=0 );

    /* leider falsch, man braucht auch noch einen fuer den Export */
    WW8Fib( BYTE nVersion = 6 );
    BOOL Write( SvStream& rStrm );
};


class WW8Style
{
protected:
    WW8Fib& rFib;
    SvStream& rSt;
    long nStyleStart;
    long nStyleLen;
//  WW8_STSHI* pStishi;

    UINT16  cstd;                               // Count of styles in stylesheet
    UINT16  cbSTDBaseInFile;        // Length of STD Base as stored in a file
    UINT16  fStdStylenamesWritten : 1;  // Are built-in stylenames stored?
    UINT16  : 15;                   // Spare flags
    UINT16  stiMaxWhenSaved;        // Max sti known when this file was written
    UINT16  istdMaxFixedWhenSaved;  // How many fixed-index istds are there?
    UINT16  nVerBuiltInNamesWhenSaved;  // Current version of built-in stylenames
    UINT16  ftcStandardChpStsh;     // ftc used by StandardChpStsh for this document

public:
    WW8Style( SvStream& rSt, WW8Fib& rFibPara );
//  ~WW8Style(){ delete( pStishi ); pStishi = 0; }
  WW8_STD* Read1STDFixed( short& rSkip, short* pcbStd );
    WW8_STD* Read1Style( short& rSkip, UINT8** ppStr = 0, short* pcbStd = 0 );
    const UINT16 GetCount() const { return cstd; }
};


class WW8Fonts
{
protected:
    WW8_FFN* pFontA;        // Array of Pointers to Font Description
    // Hilfs-Vari
    USHORT nMax;        // Array-Groesse
public:
    WW8Fonts( SvStream& rSt, WW8Fib& rFib );
    ~WW8Fonts(){ if( pFontA ) __DELETE( nMax )pFontA; }
    const WW8_FFN* GetFont( USHORT nNum ) const;
    USHORT GetMax() const { return nMax; }
};


#define WW8_HEADER_EVEN 0x1
#define WW8_HEADER_ODD 0x2
#define WW8_FOOTER_EVEN 0x4
#define WW8_FOOTER_ODD 0x8
#define WW8_HEADER_FIRST 0x10
#define WW8_FOOTER_FIRST 0x20

class WW8Dop            // Document Properties
{
public:
    /*
        Fehlerstatus
    */
    ULONG nDopError;
    /*
        vom Ctor aus dem FIB gelesene Daten
        (entspricht nur ungefaehr der tatsaechlichen Struktur
         des Winword-FIB)
    */
    // Initialisier-Dummy:
    BYTE    nDataStart;
    //-------------------------
    UINT16  fFacingPages : 1;   // 1 when facing pages should be printed
    UINT16  fWidowControl : 1;  // 1 when widow control is in effect. 0 when widow control disabled.
    UINT16  fPMHMainDoc : 1;    // 1 when doc is a main doc for Print Merge Helper, 0 when not; default=0
    UINT16  grfSuppression : 2; // 0 Default line suppression storage; 0= form letter line suppression; 1= no line suppression; default=0
    UINT16  fpc : 2;            // 1 footnote position code: 0 as endnotes, 1 at bottom of page, 2 immediately beneath text
    UINT16  : 1;                // 0 unused
    //-------------------------
    UINT16  grpfIhdt : 8;           // 0 specification of document headers and footers. See explanation under Headers and Footers topic.
    //-------------------------
    UINT16  rncFtn : 2;         // 0 restart index for footnotes, 0 don't restart note numbering, 1 section, 2 page
    UINT16  nFtn : 14;          // 1 initial footnote number for document
    UINT16  fOutlineDirtySave : 1; // when 1, indicates that information in the hPLCFpad should be refreshed since outline has been dirtied
    UINT16  : 7;                //   reserved
    UINT16  fOnlyMacPics : 1;   //   when 1, Word believes all pictures recorded in the document were created on a Macintosh
    UINT16  fOnlyWinPics : 1;   //   when 1, Word believes all pictures recorded in the document were created in Windows
    UINT16  fLabelDoc : 1;      //   when 1, document was created as a print merge labels document
    UINT16  fHyphCapitals : 1;  //   when 1, Word is allowed to hyphenate words that are capitalized. When 0, capitalized may not be hyphenated
    UINT16  fAutoHyphen : 1;    //   when 1, Word will hyphenate newly typed text as a background task
    UINT16  fFormNoFields : 1;
    UINT16  fLinkStyles : 1;    //   when 1, Word will merge styles from its template
    UINT16  fRevMarking : 1;    //   when 1, Word will mark revisions as the document is edited
    UINT16  fBackup : 1;        //   always make backup when document saved when 1.
    UINT16  fExactCWords : 1;
    UINT16  fPagHidden : 1;     //
    UINT16  fPagResults : 1;
    UINT16  fLockAtn : 1;       //   when 1, annotations are locked for editing
    UINT16  fMirrorMargins : 1; //   swap margins on left/right pages when 1.
    UINT16  fReadOnlyRecommended : 1;// user has recommended that this doc be opened read-only when 1
    UINT16  fDfltTrueType : 1;  //   when 1, use TrueType fonts by default (flag obeyed only when doc was created by WinWord 2.x)
    UINT16  fPagSuppressTopSpacing : 1;//when 1, file created with SUPPRESSTOPSPACING=YES in win.ini. (flag obeyed only when doc was created by WinWord 2.x).
    UINT16  fProtEnabled : 1;   //   when 1, document is protected from edit operations
    UINT16  fDispFormFldSel : 1;//   when 1, restrict selections to occur only within form fields
    UINT16  fRMView : 1;        //   when 1, show revision markings on screen
    UINT16  fRMPrint : 1;       //   when 1, print revision marks when document is printed
    UINT16  fWriteReservation : 1;
    UINT16  fLockRev : 1;       //   when 1, the current revision marking state is locked
    UINT16  fEmbedFonts : 1;    //   when 1, document contains embedded True Type fonts
    //    compatability options
    UINT16 copts_fNoTabForInd : 1;          //    when 1, don’t add automatic tab stops for hanging indent
    UINT16 copts_fNoSpaceRaiseLower : 1;        //    when 1, don’t add extra space for raised or lowered characters
    UINT16 copts_fSupressSpbfAfterPgBrk : 1;    // when 1, supress the paragraph Space Before and Space After options after a page break
    UINT16 copts_fWrapTrailSpaces : 1;      //    when 1, wrap trailing spaces at the end of a line to the next line
    UINT16 copts_fMapPrintTextColor : 1;        //    when 1, print colors as black on non-color printers
    UINT16 copts_fNoColumnBalance : 1;      //    when 1, don’t balance columns for Continuous Section starts
    UINT16 copts_fConvMailMergeEsc : 1;
    UINT16 copts_fSupressTopSpacing : 1;        //    when 1, supress extra line spacing at top of page
    UINT16 copts_fOrigWordTableRules : 1;   //    when 1, combine table borders like Word 5.x for the Macintosh
    UINT16 copts_fTransparentMetafiles : 1; //    when 1, don’t blank area between metafile pictures
    UINT16 copts_fShowBreaksInFrames : 1;   //    when 1, show hard page or column breaks in frames
    UINT16 copts_fSwapBordersFacingPgs : 1; //    when 1, swap left and right pages on odd facing pages

    INT16  dxaTab;              // 720 twips    default tab width
    UINT16 wSpare;              //
    UINT16 dxaHotZ;         //      width of hyphenation hot zone measured in twips
    UINT16 cConsecHypLim;       //      number of lines allowed to have consecutive hyphens
    UINT16 wSpare2;         //      reserved
    INT32   dttmCreated;        // DTTM date and time document was created
    INT32   dttmRevised;        // DTTM date and time document was last revised
    INT32   dttmLastPrint;      // DTTM date and time document was last printed
    INT16   nRevision;          //      number of times document has been revised since its creation
    INT32   tmEdited;           //      time document was last edited
    INT32   cWords;             //      count of words tallied by last Word Count execution
    INT32   cCh;                //      count of characters tallied by last Word Count execution
    INT16   cPg;                //      count of pages tallied by last Word Count execution
    INT32   cParas;             //      count of paragraphs tallied by last Word Count execution
    UINT16 rncEdn : 2;          //      restart endnote number code: 0 don’t restart endnote numbering, 1 section, 2 page
    UINT16 nEdn : 14;           //      beginning endnote number
    UINT16 epc : 2;         //      endnote position code: 0 at end of section, 3 at end of document
    // UINT16 nfcFtnRef : 4;        //      number format code for auto footnotes: 0 Arabic, 1 Upper case Roman, 2 Lower case Roman
                                //      3 Upper case Letter, 4 Lower case Letter
                                // ersetzt durch gleichlautendes Feld unten
    // UINT16 nfcEdnRef : 4;        //      number format code for auto endnotes: 0 Arabic, 1 Upper case Roman, 2 Lower case Roman
                                //      3 Upper case Letter, 4 Lower case Letter
                                // ersetzt durch gleichlautendes Feld unten
    UINT16 fPrintFormData : 1;  //      only print data inside of form fields
    UINT16 fSaveFormData : 1;   //      only save document data that is inside of a form field.
    UINT16 fShadeFormData : 1;  //      shade form fields
    UINT16 : 2;             //      reserved
    UINT16 fWCFtnEdn : 1;       //      when 1, include footnotes and endnotes in word count
    INT32   cLines;             //      count of lines tallied by last Word Count operation
    INT32   cWordsFtnEnd;       //      count of words in footnotes and endnotes tallied by last Word Count operation
    INT32   cChFtnEdn;          //      count of characters in footnotes and endnotes tallied by last Word Count operation
    INT16   cPgFtnEdn;          //      count of pages in footnotes and endnotes tallied by last Word Count operation
    INT32   cParasFtnEdn;       //      count of paragraphs in footnotes and endnotes tallied by last Word Count operation
    INT32   cLinesFtnEdn;       //      count of paragraphs in footnotes and endnotes tallied by last Word Count operation
    INT32   lKeyProtDoc;        //      document protection password key, only valid if dop.fProtEnabled, dop.fLockAtn or dop.fLockRev are 1.
    UINT16  wvkSaved : 3;       //      document view kind: 0 Normal view, 1 Outline view, 2 Page View
    UINT16  wScaleSaved : 9;    //
    UINT16  zkSaved : 2;

    // hier sollte bei nFib < 103   Schluss sein, sonst ist Datei fehlerhaft!

    /*
        bei nFib >= 103 gehts weiter:
    */
    UINT32 fNoTabForInd                             :1; // see above in compatability options
    UINT32 fNoSpaceRaiseLower                   :1; // see above
    UINT32 fSupressSpbfAfterPageBreak   :1; // see above
    UINT32 fWrapTrailSpaces                     :1; // see above
    UINT32 fMapPrintTextColor                   :1; // see above
    UINT32 fNoColumnBalance                     :1; // see above
    UINT32 fConvMailMergeEsc                    :1; // see above
    UINT32 fSupressTopSpacing                   :1; // see above
    UINT32 fOrigWordTableRules              :1; // see above
    UINT32 fTransparentMetafiles            :1; // see above
    UINT32 fShowBreaksInFrames              :1; // see above
    UINT32 fSwapBordersFacingPgs            :1; // see above
    UINT32                                                      :4; // reserved
    UINT32 fSuppressTopSpacingMac5      :1; // Suppress extra line spacing at top
                                                                                // of page like MacWord 5.x
    UINT32 fTruncDxaExpand                      :1; // Expand/Condense by whole number of points
    UINT32 fPrintBodyBeforeHdr              :1; // Print body text before header/footer
    UINT32 fNoLeading                                   :1; // Don't add extra spacebetween rows of text
    UINT32                                                      :1; // reserved
    UINT32 fMWSmallCaps                             :1; // Use larger small caps like MacWord 5.x
    UINT32                                                   :10;// reserved

    // hier sollte bei nFib <= 105  Schluss sein, sonst ist Datei fehlerhaft!

    /*
        bei nFib > 105 gehts weiter:
    */
    INT16   adt;                            // Autoformat Document Type:
                                                    // 0 for normal. 1 for letter, and 2 for email.
    WW8_DOPTYPOGRAPHY doptypography;    // siehe WW8STRUC.HXX
    WW8_DOGRID        dogrid;                   // siehe WW8STRUC.HXX
    UINT16                      :1; // reserved
    UINT16 lvl                  :4; // Which outline levels are showing in outline view
    UINT16                      :4; // reserved
    UINT16 fHtmlDoc             :1; // This file is based upon an HTML file
    UINT16                      :1; // reserved
    UINT16 fSnapBorder          :1; // Snap table and page borders to page border
    UINT16 fIncludeHeader       :1; // Place header inside page border
    UINT16 fIncludeFooter       :1; // Place footer inside page border
    UINT16 fForcePageSizePag    :1; // Are we in online view
    UINT16 fMinFontSizePag      :1; // Are we auto-promoting
                                                                // fonts to >= hpsZoonFontPag?
    UINT16 fHaveVersions            :1; // versioning is turned on
    UINT16 fAutoVersion             :1; // autoversioning is enabled
    UINT16                                   :14;   // reserved
    // hier 12 Byte ueberspringen: ASUMI
    INT32 cChWS;
    INT32 cChWSFtnEdn;
    INT32 grfDocEvents;
    // hier 4+30+8 Bytes ueberspringen
    INT32 cDBC;
    INT32 cDBCFtnEdn;
    // hier 4 Bytes ueberspringen
    INT16 nfcFtnRef;
    INT16 nfcEdnRef;
    INT16 hpsZoonFontPag;
    INT16 dywDispPag;

    // 2. Initialisier-Dummy:
    BYTE    nDataEnd;

    /*
        nun wird lediglich noch ein Ctor benoetigt,
        dem die FIB-Nummer uebergeben werden muss
    */
    WW8Dop( SvStream& rSt, INT16 nFib, INT32 nPos, INT32 nSize );

    /* leider falsch, man braucht auch noch einen fuer den Export */
    WW8Dop();
    BOOL Write( SvStream& rStrm, WW8Fib& rFib );
};


inline short WW8SkipOdd(SvStream* pSt )
{
#if defined HP9000 || defined SINIX
    short bRet = pSt->Tell() & 0x1;
    if (bRet) {
        UINT8 c;
        pSt->Read( &c, 1 );
    }
    return bRet;
#else
    if ( pSt->Tell() & 0x1 ){
        UINT8 c;
        pSt->Read( &c, 1 );
        return 1;
    }
    return 0;
#endif
}


class WW8PLCF_HdFt
{
    WW8PLCF aPLCF;
    long nTextOfs;
    short nIdxOffset;

public:
    WW8PLCF_HdFt( SvStream* pSt, WW8Fib& rFib, WW8Dop& rDop );
//  ~WW8PLCF_HdFt() {}
    BOOL GetTextPos( BYTE grpfIhdt, BYTE nWhich, WW8_CP& rStart, long& rLen );
    BOOL GetTextPosExact( short nIdx, WW8_CP& rStart, long& rLen );
    void UpdateIndex( BYTE grpfIhdt );
};



#endif

diff --git a/sw/source/filter/ww8/dump/ww8struc.hxx b/sw/source/filter/ww8/dump/ww8struc.hxx
new file mode 100644
index 0000000..27f1d33
--- /dev/null
+++ b/sw/source/filter/ww8/dump/ww8struc.hxx
@@ -0,0 +1,851 @@
/*************************************************************************
 *
 *  $RCSfile: ww8struc.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:59 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _WW8STRUC_HXX
#define _WW8STRUC_HXX

#ifndef _STRING_HXX
#include <tools/string.hxx>
#endif


// max. Anzahl der Listen-Level in WW8: 1..9
#define nWW8MaxListLevel 9


inline BYTE Get_Byte( BYTE *& p )
    { BYTE n = SVBT8ToByte( *(SVBT8*)p );       p += 1; return n; }

inline short Get_Short( BYTE *& p )
    { short n = SVBT16ToShort( *(SVBT16*)p );   p += 2; return n; }
inline USHORT Get_UShort( BYTE *& p )
    { USHORT n = SVBT16ToShort( *(SVBT16*)p );  p += 2; return n; }

inline long Get_Long( BYTE *& p )
    { long n = SVBT32ToLong( *(SVBT32*)p );     p += 4; return n; }
inline ULONG Get_ULong( BYTE *& p )
    { ULONG n = SVBT32ToLong( *(SVBT32*)p );        p += 4; return n; }

inline void Set_UInt8( BYTE *& p, UINT8 n )
    { ByteToSVBT8( n, *(SVBT8*)p );  p+= 1; }

inline void Set_UInt16( BYTE *& p, UINT16 n )
    { ShortToSVBT16( n, *(SVBT16*)p );  p+= 2; }

inline void Set_UInt32( BYTE *& p, UINT32 n )
    { LongToSVBT32( n, *(SVBT32*)p );  p+= 4; }


#if defined  __BIGENDIAN || __ALIGNMENT4 > 2 || defined UNX
#define __WW8_NEEDS_COPY
#else
#if defined WNT || defined WIN || defined OS2
#define __WW8_NEEDS_PACK
#pragma pack(2)
#endif
#endif

typedef INT16 WW8_PN;
typedef INT32 WW8_FC;
typedef INT32 WW8_CP;

// STD: STyle Definition
//   The STD contains the entire definition of a style.
//   It has two parts, a fixed-length base (cbSTDBase bytes long)
//   and a variable length remainder holding the name, and the upx and upe
//   arrays (a upx and upe for each type stored in the style, std.cupx)
//   Note that new fields can be added to the BASE of the STD without
//   invalidating the file format, because the STSHI contains the length
//   that is stored in the file.  When reading STDs from an older version,
//   new fields will be zero.
struct WW8_STD
{
    // Base part of STD:
    UINT16  sti : 12;          // invariant style identifier
    UINT16  fScratch : 1;      // spare field for any temporary use,
                                                         // always reset back to zero!
    UINT16  fInvalHeight : 1;  // PHEs of all text with this style are wrong
    UINT16  fHasUpe : 1;       // UPEs have been generated
    UINT16  fMassCopy : 1;     // std has been mass-copied; if unused at
                                                         // save time, style should be deleted
    UINT16  sgc : 4;           // style type code
    UINT16  istdBase : 12;     // base style
    UINT16  cupx : 4;          // # of UPXs (and UPEs)
    UINT16  istdNext : 12;     // next style
    UINT16  bchUpe;            // offset to end of upx's, start of upe's
    //-------- jetzt neu:
    // ab Ver8 gibts zwei Felder mehr:
  UINT16    fAutoRedef : 1;    /* auto redefine style when appropriate */
  UINT16    fHidden : 1;       /* hidden from UI? */
  UINT16    : 14;              /* unused bits */

    // Variable length part of STD:
    //  UINT8   stzName[2];        /* sub-names are separated by chDelimStyle
    // char grupx[];
            // the UPEs are not stored on the file; they are a cache of the based-on
        // chain
    // char grupe[];
};

/*
    Basis zum Einlesen UND zum Arbeiten (wird jeweils unter
    schiedlich beerbt)
*/
struct WW8_FFN_BASE     // Font Descriptor
{
    // ab Ver6
    BYTE    cbFfnM1;        //  0x0     total length of FFN - 1.

    BYTE    prg: 2;         //  0x1:03  pitch request
    BYTE    fTrueType : 1;  //  0x1:04  when 1, font is a TrueType font
                            //  0x1:08  reserved
    BYTE    ff : 3;         //  0x1:70  font family id
                            //  0x1:80  reserved

    short wWeight;          //  0x2     base weight of font
    BYTE    chs;            //  0x4     character set identifier
    BYTE    ibszAlt;        //  0x5     index into ffn.szFfn to the name of the alternate font
};

/*
    Hiermit arbeiten wir im Parser (und Dumper)
*/
struct WW8_FFN : public WW8_FFN_BASE
{
    // ab Ver8 als Unicode
    UniString sFontname;// 0x6 bzw. 0x40 ab Ver8 zero terminated string that
                                        // records name of font.
                                        // Maximal size of szFfn is 65 characters.
                                        // Vorsicht: Dieses Array kann auch kleiner sein!!!
                                        // Possibly followed by a second sz which records the
                                        // name of an alternate font to use if the first named
                                        // font does not exist on this system.
};



struct WW8_BRCVer6  // alter Border Code
{
    SVBT16 aBits1;
//  UINT16 dxpLineWidth : 3;// 0007 When dxpLineWidth is 0, 1, 2, 3, 4, or 5, this field is the width of
                            //      a single line of border in units of 0.75 points
                            //      Must be nonzero when brcType is nonzero.
                            //      6 == dotted, 7 == dashed.
//  UINT16 brcType : 2;     // 0018 border type code: 0 == none, 1 == single, 2 == thick, 3 == double
//  UINT16 fShadow : 1;     // 0020 when 1, border is drawn with shadow. Must be 0 when BRC is a substructure of the TC
//  UINT16 ico : 5;         // 07C0 color code (see chp.ico)
//  UINT16 dxpSpace : 5;    // F800 width of space to maintain between border and text within border.
                            //      Must be 0 when BRC is a substructure of the TC.  Stored in points for Windows.
};

struct WW8_BRC : public WW8_BRCVer6 // Border Code
{
    SVBT16 aBits2;
//  UINT16 dxpLineWidth : 3;// 0007 When dxpLineWidth is 0, 1, 2, 3, 4, or 5, this field is the width of
                            //      a single line of border in units of 0.75 points
                            //      Must be nonzero when brcType is nonzero.
                            //      6 == dotted, 7 == dashed.
//  UINT16 brcType : 2;     // 0018 border type code: 0 == none, 1 == single, 2 == thick, 3 == double
//  UINT16 fShadow : 1;     // 0020 when 1, border is drawn with shadow. Must be 0 when BRC is a substructure of the TC
//  UINT16 ico : 5;         // 07C0 color code (see chp.ico)
//  UINT16 dxpSpace : 5;    // F800 width of space to maintain between border and text within border.
                            //      Must be 0 when BRC is a substructure of the TC.  Stored in points for Windows.
};

typedef WW8_BRC WW8_BRC5[5];        // 5 * Border Code

#define WW8_TOP 0
#define WW8_LEFT 1
#define WW8_BOT 2
#define WW8_RIGHT 3
#define WW8_BETW 4





struct WW8_BordersSO            // fuer StarOffice-Border Code
{
    USHORT Out;
    USHORT In;
    USHORT Dist;
};


/*
// Linien-Defaults in Twips: fruehere Writer-Defaults,
//                           siehe auch <svx/boxitem.hxx>
#define DEF_LINE_WIDTH_0        1
#define DEF_LINE_WIDTH_1        20
#define DEF_LINE_WIDTH_2        50
#define DEF_LINE_WIDTH_3        80
#define DEF_LINE_WIDTH_4        100

#define DEF_MAX_LINE_WIDHT      DEF_LINE_WIDTH_4
#define DEF_MAX_LINE_DIST       DEF_LINE_WIDTH_2

#define DEF_DOUBLE_LINE0_OUT    DEF_LINE_WIDTH_0
#define DEF_DOUBLE_LINE0_IN     DEF_LINE_WIDTH_0
#define DEF_DOUBLE_LINE0_DIST   DEF_LINE_WIDTH_1

#define DEF_DOUBLE_LINE1_OUT    DEF_LINE_WIDTH_1
#define DEF_DOUBLE_LINE1_IN     DEF_LINE_WIDTH_1
#define DEF_DOUBLE_LINE1_DIST   DEF_LINE_WIDTH_1

#define DEF_DOUBLE_LINE2_OUT    DEF_LINE_WIDTH_2
#define DEF_DOUBLE_LINE2_IN     DEF_LINE_WIDTH_2
#define DEF_DOUBLE_LINE2_DIST   DEF_LINE_WIDTH_2

#define DEF_DOUBLE_LINE3_OUT    DEF_LINE_WIDTH_2
#define DEF_DOUBLE_LINE3_IN     DEF_LINE_WIDTH_1
#define DEF_DOUBLE_LINE3_DIST   DEF_LINE_WIDTH_2

#define DEF_DOUBLE_LINE4_OUT    DEF_LINE_WIDTH_1
#define DEF_DOUBLE_LINE4_IN     DEF_LINE_WIDTH_2
#define DEF_DOUBLE_LINE4_DIST   DEF_LINE_WIDTH_1

#define DEF_DOUBLE_LINE5_OUT    DEF_LINE_WIDTH_3
#define DEF_DOUBLE_LINE5_IN     DEF_LINE_WIDTH_2
#define DEF_DOUBLE_LINE5_DIST   DEF_LINE_WIDTH_2

#define DEF_DOUBLE_LINE6_OUT    DEF_LINE_WIDTH_2
#define DEF_DOUBLE_LINE6_IN     DEF_LINE_WIDTH_3
#define DEF_DOUBLE_LINE6_DIST   DEF_LINE_WIDTH_2

#define DEF_DOUBLE_LINE7_OUT    DEF_LINE_WIDTH_0
#define DEF_DOUBLE_LINE7_IN     DEF_LINE_WIDTH_0
#define DEF_DOUBLE_LINE7_DIST   DEF_LINE_WIDTH_2

#define DEF_DOUBLE_LINE8_OUT    DEF_LINE_WIDTH_1
#define DEF_DOUBLE_LINE8_IN     DEF_LINE_WIDTH_0
#define DEF_DOUBLE_LINE8_DIST   DEF_LINE_WIDTH_2

#define DEF_DOUBLE_LINE9_OUT    DEF_LINE_WIDTH_2
#define DEF_DOUBLE_LINE9_IN     DEF_LINE_WIDTH_0
#define DEF_DOUBLE_LINE9_DIST   DEF_LINE_WIDTH_2

#define DEF_DOUBLE_LINE10_OUT   DEF_LINE_WIDTH_3
#define DEF_DOUBLE_LINE10_IN    DEF_LINE_WIDTH_0
#define DEF_DOUBLE_LINE10_DIST  DEF_LINE_WIDTH_2
*/
// Deklarationen gemaess BOXITEM.HXX
#define WW8_DECL_LINETAB_ARRAY                                               \
    static WW8_BordersSO __READONLY_DATA nLineTabVer8[] =                    \
    {                                                                        \
/* 0*/  { DEF_LINE_WIDTH_0, 0, 0 },                                          \
/* 1*/  { DEF_LINE_WIDTH_1, 0, 0 },                                          \
/* 2*/  { DEF_LINE_WIDTH_2, 0, 0 },                                          \
/* 3*/  { DEF_LINE_WIDTH_3, 0, 0 },                                          \
/* 4*/  { DEF_LINE_WIDTH_4, 0, 0 },                                          \
/* 5*/  { DEF_DOUBLE_LINE0_OUT, DEF_DOUBLE_LINE0_IN, DEF_DOUBLE_LINE0_DIST },\
/* 6*/  { DEF_DOUBLE_LINE1_OUT, DEF_DOUBLE_LINE1_IN, DEF_DOUBLE_LINE1_DIST },\
/* 7*/  { DEF_DOUBLE_LINE2_OUT, DEF_DOUBLE_LINE2_IN, DEF_DOUBLE_LINE2_DIST },\
/* 8*/  { DEF_DOUBLE_LINE3_OUT, DEF_DOUBLE_LINE3_IN, DEF_DOUBLE_LINE3_DIST },\
/* 9*/  { DEF_DOUBLE_LINE4_OUT, DEF_DOUBLE_LINE4_IN, DEF_DOUBLE_LINE4_DIST },\
/*10*/  { DEF_DOUBLE_LINE5_OUT, DEF_DOUBLE_LINE5_IN, DEF_DOUBLE_LINE5_DIST },\
/*11*/  { DEF_DOUBLE_LINE6_OUT, DEF_DOUBLE_LINE6_IN, DEF_DOUBLE_LINE6_DIST },\
/*12*/  { DEF_DOUBLE_LINE7_OUT, DEF_DOUBLE_LINE7_IN, DEF_DOUBLE_LINE7_DIST },\
/*13*/  { DEF_DOUBLE_LINE8_OUT, DEF_DOUBLE_LINE8_IN, DEF_DOUBLE_LINE8_DIST },\
/*14*/  { DEF_DOUBLE_LINE9_OUT, DEF_DOUBLE_LINE9_IN, DEF_DOUBLE_LINE9_DIST },\
/*15*/  { DEF_DOUBLE_LINE10_OUT,DEF_DOUBLE_LINE10_IN,DEF_DOUBLE_LINE10_DIST} \
    };

#define WW8_DECL_LINETAB_OFS_DOUBLE 5   // Beginn des DOUBLE_LINE Abschnitts in meiner Liste




struct WW8_XCHAR    // Hilfs-Konstrukt fuer WW8_DOPTYPOGRAPHY
{
    char A;
    char B;
};

struct WW8_DOPTYPOGRAPHY
{   /*
        Document Typography Info (DOPTYPOGRAPHY)
        These options are Far East only, and are accessible
        through the Typography tab of the Tools/Options dialog.
    */



    /* a c h t u n g :     es duerfen keine solchen Bitfelder ueber einen eingelesenes Byte-Array
                            gelegt werden!!
                            stattdessen ist ein aBits1 darueber zu legen, das mit & auszulesen ist
    GRUND: Compiler auf Intel und Sparc sortieren die Bits unterschiedlich
    */



    short fKerningPunct  : 1;       // true if we're kerning punctuation
    short iJustification : 2;       // Kinsoku method of justification:
                                                                //  0 = always expand
                                                                //  1 = compress punctuation
                                                                //  2 = compress punctuation and kana.
    short iLevelOfKinsoku: 2;       // Level of Kinsoku:
                                                                //  0 = Level 1
                                                                //  1 = Level 2
                                                                //  2 = Custom
    short f2on1          : 1;       // 2-page-on-1 feature is turned on.
    short                :10;       // reserved
    short cchFollowingPunct;        // length of rgxchFPunct
    short cchLeadingPunct;          // length of rgxchLPunct

    WW8_XCHAR rgxchFPunct[101]; // array of characters that should
                                                            // never appear at the start of a line
    WW8_XCHAR rgxchLPunct[51];  // array of characters that should
                                                            // never appear at the end of a line
};

struct WW8_DOGRID
{
    short xaGrid;       // x-coord of the upper left-hand corner of the grid
    short yaGrid;       // y-coord of the upper left-hand corner of the grid
    short dxaGrid;  // width of each grid square
    short dyaGrid;  // height of each grid square



    /* a c h t u n g :     es duerfen keine solchen Bitfelder ueber einen eingelesenes Byte-Array
                            gelegt werden!!
                            stattdessen ist ein aBits1 darueber zu legen, das mit & auszulesen ist
    GRUND: Compiler auf Intel und Sparc sortieren die Bits unterschiedlich
    */



    short dyGridDisplay:7;  // the number of grid squares (in the y direction)
                                                    // between each gridline drawn on the screen. 0 means
                                                    // don't display any gridlines in the y direction.
    short fTurnItOff   :1;  // suppress display of gridlines
    short dxGridDisplay:7;  // the number of grid squares (in the x direction)
                                                    // between each gridline drawn on the screen. 0 means
                                                    // don't display any gridlines in the y direction.
    short fFollowMargins:1; // if true, the grid will start at the left and top
                                                    // margins and ignore xaGrid and yaGrid.
};

struct WW8_PIC
{
    INT32 lcb;          // 0x0 number of bytes in the PIC structure plus size of following picture data which may be a Window's metafile, a bitmap, or the filename of a TIFF file.
    UINT16 cbHeader;    // 0x4 number of bytes in the PIC (to allow for future expansion).
    struct {
        INT16 mm;       // 0x6  int
        INT16 xExt;     // 0x8  int
        INT16 yExt;     // 0xa  int
        INT16 hMF;      // 0xc  int
    }MFP;
//  BYTE bm[14];        // 0xe  BITMAP(14 bytes)    Window's bitmap structure when PIC describes a BITMAP.
    BYTE rcWinMF[14];   // 0xe  rc (rectangle - 8 bytes) rect for window origin
                        //      and extents when  metafile is stored -- ignored if 0
    INT16 dxaGoal;      // 0x1c horizontal  measurement in twips of the  rectangle the picture should be imaged within.
    INT16 dyaGoal;      // 0x1e vertical  measurement in twips of the  rectangle the picture should be imaged within.
    UINT16 mx;          // 0x20 horizontal scaling factor supplied by user in .1% units.
    UINT16 my;          // 0x22 vertical scaling factor supplied by user in .1% units.
    INT16 dxaCropLeft;  // 0x24 the amount the picture has been cropped on the left in twips.
    INT16 dyaCropTop;   // 0x26 the amount the picture has been cropped on the top in twips.
    INT16 dxaCropRight; // 0x28 the amount the picture has been cropped on the right in twips.
    INT16 dyaCropBottom;// 0x2a the amount the picture has been cropped on the bottom in twips.
    INT16 brcl : 4;     // 000F Obsolete, superseded by brcTop, etc.  In
    INT16 fFrameEmpty : 1;  // 0010 picture consists of a single frame
    INT16 fBitmap : 1;      // 0020 ==1, when picture is just a bitmap
    INT16 fDrawHatch : 1;   // 0040 ==1, when picture is an active OLE object
    INT16 fError : 1;       // 0080 ==1, when picture is just an error message
    INT16 bpp : 8;      // FF00 bits per pixel, 0 = unknown
    WW8_BRC rgbrc[4];
//  BRC brcTop;         // 0x2e specification for border above picture
//  BRC brcLeft;        // 0x30 specification for border to the left
//  BRC brcBottom;      // 0x32 specification for border below picture
//  BRC brcRight;       // 0x34 specification for border to the right
    INT16 dxaOrigin;    // 0x36 horizontal offset of hand annotation origin
    INT16 dyaOrigin;    // 0x38 vertical offset of hand annotation origin
//  BYTE rgb[];         // 0x3a variable array of bytes containing Window's metafile, bitmap or TIFF file filename.
};

struct WW8_PIC_SHADOW
{
    SVBT32 lcb;         // 0x0 number of bytes in the PIC structure plus size of following picture data which may be a Window's metafile, a bitmap, or the filename of a TIFF file.
    SVBT16 cbHeader;    // 0x4 number of bytes in the PIC (to allow for future expansion).
    struct {
        SVBT16 mm;      // 0x6  int
        SVBT16 xExt;        // 0x8  int
        SVBT16 yExt;        // 0xa  int
        SVBT16 hMF;     // 0xc  int
    }MFP;
//  SVBT8 bm[14];       // 0xe  BITMAP(14 bytes)    Window's bitmap structure when PIC describes a BITMAP.
    SVBT8 rcWinMF[14];  // 0xe  rc (rectangle - 8 bytes) rect for window origin
                        //      and extents when  metafile is stored -- ignored if 0
    SVBT16 dxaGoal;     // 0x1c horizontal  measurement in twips of the  rectangle the picture should be imaged within.
    SVBT16 dyaGoal;     // 0x1e vertical  measurement in twips of the  rectangle the picture should be imaged within.
    SVBT16 mx;          // 0x20 horizontal scaling factor supplied by user in .1% units.
    SVBT16 my;          // 0x22 vertical scaling factor supplied by user in .1% units.
    SVBT16 dxaCropLeft; // 0x24 the amount the picture has been cropped on the left in twips.
    SVBT16 dyaCropTop;  // 0x26 the amount the picture has been cropped on the top in twips.
    SVBT16 dxaCropRight;    // 0x28 the amount the picture has been cropped on the right in twips.
    SVBT16 dyaCropBottom;// 0x2a    the amount the picture has been cropped on the bottom in twips.
    SVBT8 aBits1; //0x2c
    SVBT8 aBits2;
    WW8_BRC rgbrc[4];
//  BRC brcTop;         // 0x2e specification for border above picture
//  BRC brcLeft;        // 0x30 specification for border to the left
//  BRC brcBottom;      // 0x32 specification for border below picture
//  BRC brcRight;       // 0x34 specification for border to the right
    SVBT16 dxaOrigin;   // 0x36 horizontal offset of hand annotation origin
    SVBT16 dyaOrigin;   // 0x38 vertical offset of hand annotation origin
//  SVBT8 rgb[];            // 0x3a variable array of bytes containing Window's metafile, bitmap or TIFF file filename.
};


struct WW8_TBD
{
    SVBT8 aBits1;
//  BYTE jc : 3;        // 0x07 justification code: 0=left tab, 1=centered tab, 2=right tab, 3=decimal tab, 4=bar
//  BYTE tlc : 3;       // 0x38 tab leader code: 0=no leader, 1=dotted leader,
                        // 2=hyphenated leader, 3=single line leader, 4=heavy line leader
//  *   int :2  C0  reserved
};

struct WW8_TCell    // hiermit wird weitergearbeitet (entspricht weitestgehend dem Ver8-Format)
{
    BOOL bFirstMerged   : 1;// 0001 set to 1 when cell is first cell of a range of cells that have been merged.
    BOOL bMerged        : 1;// 0002 set to 1 when cell has been merged with preceding cell.
    BOOL bVertical      : 1;// set to 1 when cell has vertical text flow
    BOOL bBackward      : 1;// for a vertical table cell, text flow is bottom to top when 1 and is bottom to top when 0.
    BOOL bRotateFont    : 1;// set to 1 when cell has rotated characters (i.e. uses @font)
    BOOL bVertMerge     : 1;// set to 1 when cell is vertically merged with the cell(s) above and/or below. When cells are vertically merged, the display area of the merged cells are consolidated. The consolidated area is used to display the contents of the first vertically merged cell (the cell with fVertRestart set to 1), and all other vertically merged cells (those with fVertRestart set to 0) must be empty. Cells can only be merged vertically if their left and right boundaries are (nearly) identical (i.e. if corresponding entries in rgdxaCenter of the table rows differ by at most 3).
    BOOL bVertRestart   : 1;// set to 1 when the cell is the first of a set of vertically merged cells. The contents of a cell with fVertStart set to 1 are displayed in the consolidated area belonging to the entire set of vertically merged cells. Vertically merged cells with fVertRestart set to 0 must be empty.
    BYTE nVertAlign     : 2;// specifies the alignment of the cell contents relative to text flow (e.g. in a cell with bottom to top text flow and bottom vertical alignment, the text is shifted horizontally to match the cell's right boundary):
                                                    //          0 top
                                                    //          1 center
                                                    //          2 bottom
    UINT16 fUnused      : 7;// reserved - nicht loeschen: macht das UINT16 voll !!

    WW8_BRC rgbrc[4];               // border codes
//notational convenience for referring to brcTop, brcLeft, etc fields.
//  BRC brcTop;             // specification of the top border of a table cell
//  BRC brcLeft;            // specification of left border of table row
//  BRC brcBottom;          // specification of bottom border of table row
//  BRC brcRight;           // specification of right border of table row.
};
// cbTC (count of bytes of a TC) is 18(decimal), 12(hex).


struct WW8_TCellVer6    // wird aus der Datei gelesen
{
    SVBT8  aBits1Ver6;
    SVBT8  aBits2Ver6;
//  UINT16 fFirstMerged : 1;// 0001 set to 1 when cell is first cell of a range of cells that have been merged.
//  UINT16 fMerged : 1;     // 0002 set to 1 when cell has been merged with preceding cell.
//  UINT16 fUnused : 14;    // FFFC reserved
    WW8_BRCVer6 rgbrcVer6[4];
// notational convenience for referring to brcTop, brcLeft, etc fields:
//          BRC brcTop;             // specification of the top border of a table cell
//          BRC brcLeft;            // specification of left border of table row
//          BRC brcBottom;          // specification of bottom border of table row
//          BRC brcRight;           // specification of right border of table row.
};
// cbTC (count of bytes of a TC) is 10(decimal), A(hex).

struct WW8_TCellVer8    // wird aus der Datei gelesen
{
    SVBT16 aBits1Ver8;      // Dokumentation siehe oben unter WW8_TCell
    SVBT16 aUnused;         // reserve
    WW8_BRC rgbrcVer8[4];   // Dokumentation siehe oben unter WW8_TCell
};
// cbTC (count of bytes of a TC) is 20(decimal), 14(hex).


struct WW8_SHD              // struct SHD fehlt in der Beschreibung
{
private:
    UINT16 aBits;
//  UINT16 nFore : 5;       // 0x001f ForegroundColor
//  UINT16 nBack : 5;       // 0x03e0 BackgroundColor
//  UINT16 nStyle : 5;      // 0x7c00 Percentage and Style
//  UINT16 nDontKnow : 1;   // 0x8000 ???   ab Ver8: ebenfalls fuer Style

public:
    WW8_SHD(){ aBits = 0; }

    BYTE GetFore()  const                           { return (BYTE)( aBits        & 0x1f); }
    BYTE GetBack()  const                           { return (BYTE)((aBits >> 5 ) & 0x1f); }
    BYTE GetStyle(BOOL bVer67)  const { return (BYTE)((aBits >> 10) & ( bVer67?0x1f:0x3f ) ); }

    UINT16 GetValue()   const                       { return aBits; }

    void SetValue(   UINT16 nVal ){ aBits = nVal; }
    void SetWWValue( SVBT16 nVal ){ aBits = (UINT16)SVBT16ToShort( nVal ); }

    void SetFore( BYTE nVal ){ aBits = (aBits & 0xffe0) |  (nVal & 0x1f);     }
    void SetBack( BYTE nVal ){ aBits = (aBits & 0xfc1f) | ((nVal & 0x1f)<<5); }
    void SetStyle( BOOL bVer67, BYTE nVal ){
                                         aBits = (aBits & ( bVer67?0x83ff:0x03ff ) )
                                                                                      | ((nVal & ( bVer67?0x1f:0x2f ))<<10); }
};


struct WW8_ANLV
{
    SVBT8 nfc;          // 0        number format code, 0=Arabic, 1=Upper case Roman, 2=Lower case Roman
                        //          3=Upper case Letter, 4=Lower case letter, 5=Ordinal
    SVBT8 cbTextBefore; // 1        offset into anld.rgch limit of prefix text
    SVBT8 cbTextAfter;  // 2
    SVBT8 aBits1;
//  BYTE jc : 2;        // 3 : 0x03 justification code, 0=left, 1=center, 2=right, 3=left and right justify
//  BYTE fPrev : 1;     //     0x04 when ==1, include previous levels
//  BYTE fHang : 1;     //     0x08 when ==1, number will be displayed using a hanging indent
//  BYTE fSetBold : 1;  //     0x10 when ==1, boldness of number will be determined by anld.fBold.
//  BYTE fSetItalic : 1;//     0x20 when ==1, italicness of number will be determined by anld.fItalic
//  BYTE fSetSmallCaps : 1;//  0x40 when ==1, anld.fSmallCaps will determine whether number will be displayed in small caps or not.
//  BYTE fSetCaps : 1;  //     0x80 when ==1, anld.fCaps will determine whether number will be displayed capitalized or not
    SVBT8 aBits2;
//  BYTE fSetStrike : 1;// 4 : 0x01 when ==1, anld.fStrike will determine whether the number will be displayed using strikethrough or not.
//  BYTE fSetKul : 1;   //     0x02 when ==1, anld.kul will determine the underlining state of the autonumber.
//  BYTE fPrevSpace : 1;//     0x04 when ==1, autonumber will be displayed with a single prefixing space character
//  BYTE fBold : 1;     //     0x08 determines boldness of autonumber when anld.fSetBold == 1.
//  BYTE fItalic : 1;   //     0x10 determines italicness of autonumber when anld.fSetItalic == 1.
//  BYTE fSmallCaps : 1;//     0x20 determines whether autonumber will be displayed using small caps when anld.fSetSmallCaps == 1.
//  BYTE fCaps : 1;     //     0x40 determines whether autonumber will be displayed using caps when anld.fSetCaps == 1.
//  BYTE fStrike : 1;   //     0x80 determines whether autonumber will be displayed using caps when anld.fSetStrike == 1.
    SVBT8 aBits3;
//  BYTE kul : 3;       // 5 : 0x07 determines whether  autonumber will be displayed with underlining when anld.fSetKul == 1.
//  BYTE ico : 5;       //     0xF1 color of autonumber
    SVBT16 ftc;         // 6        font code of  autonumber
    SVBT16 hps;         // 8        font half point size (or 0=auto)
    SVBT16 iStartAt;    // 0x0a     starting value (0 to 65535)
    SVBT16 dxaIndent;   // 0x0c     *short?* *USHORT?* width of prefix text (same as indent)
    SVBT16 dxaSpace;    // 0x0e     minimum space between number and paragraph
};
// *cbANLV (count of bytes of ANLV) is 16 (decimal), 10(hex).

struct WW8_ANLD
{
    WW8_ANLV eAnlv;     // 0
    SVBT8 fNumber1;     // 0x10     number only 1 item per table cell
    SVBT8 fNumberAcross;    // 0x11     number across cells in table rows(instead of down)
    SVBT8 fRestartHdn;  // 0x12     restart heading number on section boundary
    SVBT8 fSpareX;      // 0x13     unused( should be 0)
    char rgchAnld[32];  // 0x14 characters displayed before/after autonumber
};


struct WW8_OLST
{
    WW8_ANLV rganlv[9]; // 0    an array of 9 ANLV structures (heading levels)
    SVBT8 fRestartHdr;  // 0x90 when ==1, restart heading on section break
    SVBT8 fSpareOlst2;  // 0x91 reserved
    SVBT8 fSpareOlst3;  // 0x92 reserved
    SVBT8 fSpareOlst4;  // 0x93 reserved
    char rgch[64];      // 0x94 array of 64 chars       text before/after number
};
// cbOLST is 212(decimal), D4(hex).

struct WW8_FDOA
{
    SVBT32 fc;          // 0  FC pointing to drawing object data
    SVBT16 ctxbx;       // 4  count of textboxes in the drawing object
};

struct WW8_DO
{
    SVBT16 dok;             // 0    Drawn Object Kind, currently this is always 0
    SVBT16 cb;              // 2    size (count of bytes) of the entire DO
    SVBT8  bx;              // 4    x position relative to anchor CP
    SVBT8  by;              // 5    y position relative to anchor CP
    SVBT16 dhgt;                // 6    height of DO
    SVBT16 aBits1;
//  UINT16 fAnchorLock : 1; // 8    1 if the DO anchor is locked
//  BYTE[] rgdp;            // 0xa  variable length array of drawing primitives
};

struct WW8_DPHEAD
{
    SVBT16 dpk;         //  0   Drawn Primitive Kind  REVIEW davebu
  //        0=start of grouping, 1=line, 2=textbox, 3=rectangle,
  //        4=arc, 5=elipse, 6=polyline, 7=callout textbox,
  //        8=end of grouping, 9=sample primitve holding default values
    SVBT16 cb;          // 2    size (count of bytes) of this DP
    SVBT16 xa;          // 4    These 2 points describe the rectangle
    SVBT16 ya;          // 6    enclosing this DP relative to the origin of
    SVBT16 dxa;         // 8    the DO
    SVBT16 dya;         // 0xa
};


struct WW8_DP_LINETYPE
{
    SVBT32 lnpc;            // LiNe Property Color -- RGB color value
    SVBT16 lnpw;            // line property weight in twips
    SVBT16 lnps;            // line property style : 0=Solid, 1=Dashed
                            // 2=Dotted, 3=Dash Dot, 4=Dash Dot Dot, 5=Hollow
};

struct WW8_DP_SHADOW    // Schattierung!
{
    SVBT16 shdwpi;          // Shadow Property Intensity
    SVBT16 xaOffset;        // x offset of shadow
    SVBT16 yaOffset;        // y offset of shadow
};

struct WW8_DP_FILL
{
    SVBT32 dlpcFg;          // FiLl Property Color ForeGround -- RGB color value
    SVBT32 dlpcBg;          // Property Color BackGround -- RGB color value
    SVBT16 flpp;            // FiLl Property Pattern REVIEW davebu
};

struct WW8_DP_LINEEND
{
    SVBT16 aStartBits;
//  UINT16 eppsStart : 2;   // Start EndPoint Property Style
                            // 0=None, 1=Hollow, 2=Filled
//  UINT16 eppwStart : 2;   // Start EndPoint Property Weight
//  UINT16 epplStart : 2;   // Start EndPoint Property length
//  UINT16 dummyStart : 10; // Alignment
    SVBT16 aEndBits;
//  UINT16 eppsEnd : 2;     // End EndPoint Property Style
//  UINT16 eppwEnd : 2;     // End EndPoint Property Weight
//  UINT16 epplEnd : 2;     // End EndPoint Property length
//  UINT16 dummyEnd : 10;   // Alignment
};

struct WW8_DP_LINE
{
//  WW8_DPHEAD dphead;      // 0    Common header for a drawing primitive
    SVBT16 xaStart;         // starting point for line
    SVBT16 yaStart;         //
    SVBT16 xaEnd;           // ending point for line
    SVBT16 yaEnd;
    WW8_DP_LINETYPE aLnt;
    WW8_DP_LINEEND aEpp;
    WW8_DP_SHADOW aShd;
};

struct WW8_DP_TXTBOX
{
    WW8_DP_LINETYPE aLnt;
    WW8_DP_FILL aFill;
    WW8_DP_SHADOW aShd;
    SVBT16 aBits1;
//  UINT16 fRoundCorners : 1; //0x24    0001    1 if the textbox has rounded corners
//  UINT16 zaShape : 15;    // 0x24     000e    REVIEW davebu
    SVBT16 dzaInternalMargin; // 0x26   REVIEW davebu
};

struct WW8_DP_RECT
{
    WW8_DP_LINETYPE aLnt;
    WW8_DP_FILL aFill;
    WW8_DP_SHADOW aShd;
    SVBT16 aBits1;
//  UINT16 fRoundCorners : 1; // 0x24   0001    1 if the textbox has rounded corners
//  UINT16 zaShape : 15; // 0x24 000e   REVIEW davebu
};

struct WW8_DP_ARC
{
    WW8_DP_LINETYPE aLnt;
    WW8_DP_FILL aFill;
    WW8_DP_SHADOW aShd;
    SVBT8 fLeft;        // 0x24 00ff    REVIEW davebu
    SVBT8 fUp;          // 0x24 ff00    REVIEW davebu
//  UINT16 fLeft : 8;   // 0x24 00ff    REVIEW davebu
//  UINT16 fUp : 8;     // 0x24 ff00    REVIEW davebu
};

struct WW8_DP_ELIPSE
{
    WW8_DP_LINETYPE aLnt;
    WW8_DP_FILL aFill;
    WW8_DP_SHADOW aShd;
};

struct WW8_DP_POLYLINE
{
    WW8_DP_LINETYPE aLnt;
    WW8_DP_FILL aFill;
    WW8_DP_LINEEND aEpp;
    WW8_DP_SHADOW aShd;
    SVBT16 aBits1;
//  UINT16 fPolygon : 1; // 0x28  0001  1 if this is a polygon
//  UINT16 cpt : 15;    // 0x28   00fe  count of points
//  short xaFirst;      // 0x2a These are the endpoints of the first line.
//  short yaFirst;      // 0x2c
//  short xaEnd;        // 0x2e
//  short yaEnd;        // 0x30
//  short rgpta[];      // 0x32 An array of xa,ya pairs for the remaining points
};

struct WW8_DP_CALLOUT_TXTBOX
{
    SVBT16 flags;               // 0x0c REVIEW davebu flags
    SVBT16 dzaOffset;           // 0x0e REVIEW davebu
    SVBT16 dzaDescent;          // 0x10 REVIEW davebu
    SVBT16 dzaLength;           // 0x12 REVIEW davebu
    WW8_DPHEAD dpheadTxbx;      // 0x14 DPHEAD for a textbox
    WW8_DP_TXTBOX dptxbx;       // 0x20 DP for a textbox
    WW8_DPHEAD dpheadPolyLine;  // 0x4c DPHEAD for a Polyline
    WW8_DP_POLYLINE dpPolyLine; // 0x48 DP for a polyline
};

struct WW8_DP_DEFAULTS
{
    WW8_DP_LINETYPE aLnt;
    WW8_DP_FILL aFill;
    WW8_DP_LINEEND aEpp;
    WW8_DP_SHADOW aShd;
    SVBT16 dzaOffset;       // 0x2a REVIEW davebu
    SVBT16 dzaDescent;      // 0x2c REVIEW davebu
    SVBT16 dzaLength;       // 0x2e REVIEW davebu

    SVBT16 aBits3;
//  UINT16 fRoundCorners : 1;   // 0x30 0001    1 if the textbox has rounded corners
//  UINT16 zaShape : 15;        // 0x30 000fe   REVIEW davebu
    SVBT16 dzaInternalMargin;   // 0x32 REVIEW davebu
};


struct WW8_PCD
{
    SVBT8 aBits1;
//  BYTE fNoParaLast : 1;   // when 1, means that piece contains no end of paragraph marks.
//  BYTE fPaphNil : 1;      // used internally by Word
//  BYTE fCopied : 1;       // used internally by Word
//          *   int :5
    SVBT8 aBits2;           // fn int:8, used internally by Word
    SVBT32 fc;              // file offset of beginning of piece. The size of the
                            // ithpiece can be determined by subtracting rgcp[i] of
                            // the containing plcfpcd from its rgcp[i+1].
    SVBT16 prm;             // PRM contains either a single sprm or else an index number
                            // of the grpprl which contains the sprms that modify the
                            // properties of the piece.
};

struct WW8_PHE_Base
{
    BYTE aBits1;            //
//                              0   0   fSpare  int :1  0001    reserved
//                              fUnk    int :1  0002    phe entry is invalid
//                                                      when == 1
//                              fDiffLines  int :1  0004    when 1, total
//                               height of paragraph is known but lines in
//                               paragraph have different heights.
//                              *   int :5  00F8    reserved
    BYTE nlMac;             //  when fDiffLines is 0 is number of lines in
//                          //  paragraph
    SVBT16 dxaCol;          //  width of lines in paragraph
    SVBT16 dyl;
//                              4   4   dylLine int when fDiffLines is 0,
//                              is height of every line in paragraph.in pixels
//                              4   4 dylHeight uns when fDiffLines is 1,
//                              is the total height in pixels of the paragraph
};

/*
eigentlich muessten wir das jetzt in etwa *so* praezisieren:

            struct WW8_PHE_Ver6 : public WW8_PHE_Base
            {
                //  6 Bytes gross
            };
            struct WW8_PHE_Ver6 : public WW8_PHE_Base
            {
                SVBT16 a;
                SVBT16 b;
                SVBT16 c;   // 12 Byte gross
            };
*/

// AnnoTation Refernce Descriptor (ATRD)
struct WW8_ATRD                 // fuer die 8-Version
{
    SVBT16 xstUsrInitl[ 10 ];       // pascal-style String holding initials
                                    // of annotation author
    SVBT16 ibst;                    // index into GrpXstAtnOwners
    SVBT16 ak;                      // not used
    SVBT16 grfbmc;                  // not used
    SVBT32 ITagBkmk;                // when not -1, this tag identifies the
                                    // annotation bookmark that locates the
                                    // range of CPs in the main document which
                                    // this annotation references.
};

struct WW67_ATRD                // fuer die 6/7-Version
{
    char xstUsrInitl[ 10 ];         // pascal-style String holding initials
                                    // of annotation author
    SVBT16 ibst;                    // index into GrpXstAtnOwners
    SVBT16 ak;                      // not used
    SVBT16 grfbmc;                  // not used
    SVBT32 ITagBkmk;                // when not -1, this tag identifies the
                                    // annotation bookmark that locates the
                                    // range of CPs in the main document which
                                    // this annotation references.
};


#ifdef __WW8_NEEDS_PACK
#pragma pack()
#endif


#endif
diff --git a/sw/source/filter/ww8/makefile.mk b/sw/source/filter/ww8/makefile.mk
new file mode 100644
index 0000000..5969618
--- /dev/null
+++ b/sw/source/filter/ww8/makefile.mk
@@ -0,0 +1,134 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:58 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=..$/..$/..

PRJNAME=sw
TARGET=ww8

PROJECTPCH=filt_pch
PROJECTPCHSOURCE=..\filt_1st\filt_pch

# --- Settings -----------------------------------------------------

.INCLUDE :	$(PRJ)$/inc$/swpre.mk
.INCLUDE :	settings.mk
.INCLUDE :	$(PRJ)$/inc$/sw.mk

.IF "$(mydebug)" != ""
CDEFS=$(CDEFS) -Dmydebug
.ENDIF

# --- Files --------------------------------------------------------

CXXFILES = \
        wrtw8esh.cxx \
        wrtw8nds.cxx \
        wrtw8num.cxx \
        wrtw8sty.cxx \
        wrtww8.cxx \
        wrtww8gr.cxx \
        ww8atr.cxx \
        ww8graf.cxx \
        ww8graf2.cxx \
        ww8par.cxx \
        ww8par2.cxx \
        ww8par3.cxx \
        ww8par4.cxx \
        ww8par5.cxx \
        ww8par6.cxx \
        ww8glsy.cxx \
        msocximp.cxx \
        ww8scan.cxx



SLOFILES =	\
        $(SLO)$/wrtw8esh.obj \
        $(SLO)$/wrtw8nds.obj \
        $(SLO)$/wrtw8num.obj \
        $(SLO)$/wrtw8sty.obj \
        $(SLO)$/wrtww8.obj \
        $(SLO)$/wrtww8gr.obj \
        $(SLO)$/ww8atr.obj \
        $(SLO)$/ww8graf.obj \
        $(SLO)$/ww8graf2.obj \
        $(SLO)$/ww8par.obj \
        $(SLO)$/ww8par2.obj \
        $(SLO)$/ww8par3.obj \
        $(SLO)$/ww8par4.obj \
        $(SLO)$/ww8par5.obj \
        $(SLO)$/ww8par6.obj \
        $(SLO)$/ww8glsy.obj \
        $(SLO)$/msocximp.obj \
        $(SLO)$/ww8scan.obj

EXCEPTIONSFILES =	\
        $(SLO)$/ww8par5.obj \
        $(SLO)$/ww8graf.obj \
        $(SLO)$/ww8graf2.obj \
        $(SLO)$/msocximp.obj

# --- Tagets -------------------------------------------------------

.INCLUDE :	target.mk

diff --git a/sw/source/filter/ww8/wrtw8esh.cxx b/sw/source/filter/ww8/wrtw8esh.cxx
new file mode 100644
index 0000000..95bee2c
--- /dev/null
+++ b/sw/source/filter/ww8/wrtw8esh.cxx
@@ -0,0 +1,1706 @@
/*************************************************************************
 *
 *  $RCSfile: wrtw8esh.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:58 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PCH
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif


#ifndef _COM_SUN_STAR_DRAWING_XSHAPE_HPP_
#include <com/sun/star/drawing/XShape.hpp>
#endif

#ifndef _SVSTOR_HXX
#include <so3/svstor.hxx>
#endif
#ifndef _IPOBJ_HXX
#include <so3/ipobj.hxx>
#endif
#ifndef _FILTER_HXX
#include <svtools/filter.hxx>
#endif
#ifndef _SFXITEMITER_HXX
#include <svtools/itemiter.hxx>
#endif
#ifndef _SVDOBJ_HXX
#include <svx/svdobj.hxx>
#endif
#ifndef _SVDOTEXT_HXX
#include <svx/svdotext.hxx>
#endif
#ifndef _SVDMODEL_HXX
#include <svx/svdmodel.hxx>
#endif
#ifndef _SVDPAGE_HXX
#include <svx/svdpage.hxx>
#endif
#ifndef _SVDTRANS_HXX
#include <svx/svdtrans.hxx>
#endif
#ifndef _OUTLOBJ_HXX
#include <svx/outlobj.hxx>
#endif
#ifndef _EDITOBJ_HXX
#include <svx/editobj.hxx>
#endif
#ifndef _ESCHEREX_HXX
#include <svx/escherex.hxx>
#endif
#ifndef _SVX_UNOSHAPE_HXX
#include <svx/unoshape.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX
#include <svx/brshitem.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX
#include <svx/ulspitem.hxx>
#endif
#ifndef _SVX_FONTITEM_HXX
#include <svx/fontitem.hxx>
#endif
#ifndef _EEITEM_HXX
#include <svx/eeitem.hxx>
#endif
#ifndef _MyEDITENG_HXX
#include <svx/editeng.hxx>
#endif

#ifndef _WRTWW8_HXX
#include <wrtww8.hxx>
#endif
#ifndef _FLYPOS_HXX
#include <flypos.hxx>
#endif
#ifndef _FMTCNCT_HXX
#include <fmtcnct.hxx>
#endif
#ifndef _FMTANCHR_HXX
#include <fmtanchr.hxx>
#endif
#ifndef _FMTSRND_HXX
#include <fmtsrnd.hxx>
#endif
#ifndef _FMTORNT_HXX
#include <fmtornt.hxx>
#endif
#ifndef _FMTFSIZE_HXX
#include <fmtfsize.hxx>
#endif
#ifndef _DCONTACT_HXX
#include <dcontact.hxx>
#endif
#ifndef _CALBCK_HXX
#include <calbck.hxx>
#endif
#ifndef _FRMFMT_HXX
#include <frmfmt.hxx>
#endif
#ifndef _FMTCNTNT_HXX
#include <fmtcntnt.hxx>
#endif
#ifndef _NDINDEX_HXX
#include <ndindex.hxx>
#endif
#ifndef _NODE_HXX
#include <node.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _DOCARY_HXX
#include <docary.hxx>
#endif
#ifndef _PAM_HXX
#include <pam.hxx>
#endif
#ifndef _SWRECT_HXX
#include <swrect.hxx>
#endif
#ifndef _NDGRF_HXX
#include <ndgrf.hxx>
#endif
#ifndef _GRFATR_HXX
#include <grfatr.hxx>
#endif
#ifndef _NDOLE_HXX
#include <ndole.hxx>
#endif
#ifndef _UNODRAW_HXX
#include <unodraw.hxx>
#endif

#ifndef _ERRHDL_HXX
#include <errhdl.hxx>
#endif

using namespace ::com::sun::star;

SV_DECL_VARARR_SORT( SvULongsSort, ULONG, 1, 1 )
SV_IMPL_VARARR_SORT( SvULongsSort, ULONG )

#define sEscherStream       String::CreateFromAscii( \
                                RTL_CONSTASCII_STRINGPARAM( "tempEsher" ))
#define sEscherPictStream   String::CreateFromAscii( \
                                RTL_CONSTASCII_STRINGPARAM( "EsherPicts" ))


WW8_WrPlcDrawObj::WW8_WrPlcDrawObj( BYTE nTyp )
    : nTTyp( nTyp ), aParentPos( 0, 16 )
{
}

WW8_WrPlcDrawObj::~WW8_WrPlcDrawObj()
{
    for( USHORT n = aParentPos.Count(); n; )
        delete (Point*)aParentPos[ --n ];
}

void WW8_WrPlcDrawObj::WritePlc( SwWW8Writer& rWrt ) const
{
    if( 8 != rWrt.pFib->nVersion )
        return ;        // solange kein DrawObjects in 95 exportiert wird


    ULONG nFcStart = rWrt.pTableStrm->Tell();
    USHORT nLen = aCps.Count();

    if( nLen )
    {
        // write CPs
        WW8Fib& rFib = *rWrt.pFib;
        ULONG nCpOffs = TXT_TXTBOX == nTTyp
                            ? 0 : (rWrt.pFib->ccpText + rWrt.pFib->ccpFtn);
        register USHORT i;
        for( i = 0; i < nLen; i++ )
            SwWW8Writer::WriteLong( *rWrt.pTableStrm, aCps[ i ] - nCpOffs );
        SwWW8Writer::WriteLong( *rWrt.pTableStrm,
                                            rFib.ccpText + rFib.ccpFtn +
                                            rFib.ccpHdr + rFib.ccpEdn +
                                            rFib.ccpTxbx + rFib.ccpHdrTxbx + 1 );

        for( i = 0; i < nLen; ++i )
        {
            // write the fspa-struct
            const SwFrmFmt& rFmt = *(SwFrmFmt*)aCntnt[ i ];
            const SdrObject* pObj = rFmt.FindRealSdrObject();

            Rectangle aRect;
            if( RES_FLYFRMFMT == rFmt.Which() )
            {
                Point aObjPos;
                SwRect aLayRect( rFmt.FindLayoutRect( FALSE, &aObjPos ));
                if( aLayRect.IsEmpty() )
                {
                    // the Object is not visible - so get the values from
                    // the format. The Position may not be correct.
                    const SwFmtVertOrient& rVOr = rFmt.GetVertOrient();
                    if( VERT_NONE == rVOr.GetVertOrient() )
                        aObjPos.Y() = rVOr.GetPos();
                    const SwFmtHoriOrient& rHOr = rFmt.GetHoriOrient();
                    if( HORI_NONE == rHOr.GetHoriOrient() )
                        aObjPos.X() = rHOr.GetPos();

                    aRect.SetSize( rFmt.GetFrmSize().GetSize() );
                    aRect.SetPos( aObjPos );
                }
                else
                    aRect = aLayRect.SVRect();
            }
            else
            {
                ASSERT( pObj, "wo ist das SDR-Object?" );
                if( pObj )
                    aRect = pObj->GetSnapRect();
            }
            aRect -= *(Point*)aParentPos[ i ];

            // spid
            SwWW8Writer::WriteLong( *rWrt.pTableStrm, aShapeIds[ i ] );

            //xaLeft/yaTop/xaRight/yaBottom - rel. to anchor
            SwWW8Writer::WriteLong( *rWrt.pTableStrm, aRect.Left() );
            SwWW8Writer::WriteLong( *rWrt.pTableStrm, aRect.Top() );
            SwWW8Writer::WriteLong( *rWrt.pTableStrm, aRect.Right() );
            SwWW8Writer::WriteLong( *rWrt.pTableStrm, aRect.Bottom() );

            //fHdr/bx/by/wr/wrk/fRcaSimple/fBelowText/fAnchorLock
            USHORT nFlags;
            if( FLY_PAGE == rFmt.GetAnchor().GetAnchorId() )
                nFlags = 0x0A;      // x-rel to top Page, y-rel to top Page
            else
                nFlags = 0x14;      // x-rel to text,  y-rel to text

            const SwFmtSurround& rSurr = rFmt.GetSurround();
            USHORT nContour = rSurr.IsContour() ? 0x80 : 0x40;
            switch( rSurr.GetSurround() )
            {
            case SURROUND_NONE:         nFlags |= 0x020;    break;
            case SURROUND_THROUGHT:     nFlags |= 0x060;    break;
            case SURROUND_PARALLEL:     nFlags |= 0x000 | nContour; break;
            case SURROUND_IDEAL:        nFlags |= 0x600 | nContour; break;
            case SURROUND_LEFT:         nFlags |= 0x200 | nContour; break;
            case SURROUND_RIGHT:        nFlags |= 0x400 | nContour; break;
            }
            if( pObj && pObj->GetLayer() == rWrt.pDoc->GetHellId() )
                nFlags |= 0x4000;

            SwWW8Writer::WriteShort( *rWrt.pTableStrm, nFlags );

            // cTxbx
            SwWW8Writer::WriteLong( *rWrt.pTableStrm, 0 );
        }


        if( TXT_TXTBOX == nTTyp )
        {
            rFib.fcPlcfspaMom = nFcStart;
            rFib.lcbPlcfspaMom = rWrt.pTableStrm->Tell() - nFcStart;
        }
        else
        {
            rFib.fcPlcfspaHdr = nFcStart;
            rFib.lcbPlcfspaHdr = rWrt.pTableStrm->Tell() - nFcStart;
        }
    }
}


BOOL WW8_WrPlcDrawObj::Append( SwWW8Writer& rWrt, WW8_CP nCp,
                                const SwFrmFmt& rFmt,
                                const Point& rNdTopLeft )
{
    BOOL bRet = FALSE;
    if( TXT_HDFT == rWrt.nTxtTyp || TXT_MAINTEXT == rWrt.nTxtTyp )
    {
        const SdrObject* pObj = rFmt.FindSdrObject(), *pInsObj = 0;
        if( RES_FLYFRMFMT == rFmt.Which() )
        {
            // check for textflyframe and if it is the first in a Chain
            const SwNodeIndex* pNdIdx = rFmt.GetCntnt().GetCntntIdx();
            if( pNdIdx )
                bRet = TRUE;
        }
        else
            bRet = TRUE;
    }

    if( bRet )
    {
        aCps.Insert( nCp, aCps.Count() );
        void* p = (void*)&rFmt;
        aCntnt.Insert( p, aCntnt.Count() );
        void* pPos = new Point( rNdTopLeft );
        aParentPos.Insert( pPos, aParentPos.Count() );
        aShapeIds.Insert( ULONG(0), aShapeIds.Count() );
    }
    return bRet;
}

void WW8_WrPlcDrawObj::SetShapeId( const SwFrmFmt& rFmt, UINT32 nId )
{
    const VoidPtr p = (void*)&rFmt;
    USHORT nPos = aCntnt.GetPos( p );
    if( USHRT_MAX != nPos )
        aShapeIds[ nPos ] = nId;
}

/*  */

void WW8_WrPlcTxtBoxes::WriteTxt( SwWW8Writer& rWrt )
{
    rWrt.bInWriteEscher = TRUE;
    long& rccp = TXT_TXTBOX == nTyp ? rWrt.pFib->ccpTxbx
                                    : rWrt.pFib->ccpHdrTxbx;
    WW8_WrPlcSubDoc::WriteTxt( rWrt, nTyp, rccp );

    WW8_CP nCP = rWrt.Fc2Cp( rWrt.Strm().Tell() );
    WW8Fib& rFib = *rWrt.pFib;
    long nOffset = rFib.ccpText + rFib.ccpFtn + rFib.ccpHdr + rFib.ccpAtn
                            + rFib.ccpEdn;
    if( TXT_TXTBOX == nTyp )
        rWrt.pFldTxtBxs->Finish( nCP, nOffset );
    else
        rWrt.pFldHFTxtBxs->Finish( nCP, nOffset + rFib.ccpTxbx );
    rWrt.bInWriteEscher = FALSE;
}

void WW8_WrPlcTxtBoxes::Append( const SdrObject& rObj, UINT32 nShapeId )
{
    void* p = (void*)&rObj;
    aCntnt.Insert( p, aCntnt.Count() );
    aShapeIds.Insert( nShapeId, aShapeIds.Count() );
}

const SvULongs* WW8_WrPlcTxtBoxes::GetShapeIdArr() const
{
    return &aShapeIds;
}

/*  */

UINT32 SwWW8Writer::GetSdrOrdNum( const SwFrmFmt& rFmt ) const
{
    UINT32 nOrdNum;
    const SdrObject* pObj = rFmt.FindRealSdrObject();
    if( pObj )
        nOrdNum = pObj->GetOrdNum();
    else
    {
        // no Layout for this format, then recalc the ordnum
        SwFrmFmt* pFmt = (SwFrmFmt*)&rFmt;
        nOrdNum = pDoc->GetSpzFrmFmts()->GetPos( pFmt );

        const SdrModel* pModel = pDoc->GetDrawModel();
        if( pModel )
            nOrdNum += pModel->GetPage( 0 )->GetObjCount();
    }
    return nOrdNum;
}

void SwWW8Writer::AppendFlyInFlys( WW8_CP& rCP, const SwFrmFmt& rFrmFmt,
                                    const Point& rNdTopLeft )
{
    ASSERT( !pEscher, "der EscherStream wurde schon geschrieben!" );
    if( pEscher )
        return ;

    WW8_WrPlcDrawObj *pDrwO = TXT_HDFT == nTxtTyp ? pHFSdrObjs : pSdrObjs;
    if( pDrwO->Append( *this, rCP, rFrmFmt, rNdTopLeft ))
    {
        static BYTE __READONLY_DATA aSpec8[] = {
            0x03, 0x6a, 0, 0, 0, 0,         // sprmCObjLocation (wahrscheinlich unnoetig)
            0x55, 0x08, 1                   // sprmCFSpec
        };
                                                // fSpec-Attribut TRUE
                            // Fuer DrawObjets muss ein Spezial-Zeichen
                            // in den Text und darum ein fSpec-Attribut
        pChpPlc->AppendFkpEntry( Strm().Tell() );
        WriteChar( 0x8 );
        rCP += 1;       // to next charakter position
        pChpPlc->AppendFkpEntry( Strm().Tell(), sizeof( aSpec8 ), aSpec8 );

        if( RES_FLYFRMFMT == rFrmFmt.Which() )
        {
            // search all Flys/DrawObj in Flys and put it behind this
            // text position.
            const SwNodeIndex* pNdIdx = rFrmFmt.GetCntnt().GetCntntIdx();
            ASSERT( pNdIdx, "wo ist der NodeIndex geblieben?" );
            ULONG nStart = pNdIdx->GetIndex(),
                  nEnd = pNdIdx->GetNode().EndOfSectionIndex(),
                  nIdx;

            USHORT nArrLen = pDoc->GetSpzFrmFmts()->Count();
            for( USHORT n = 0; n < nArrLen; ++n )
            {
                const SwFrmFmt* pFmt = (*pDoc->GetSpzFrmFmts())[n];
                const SwFmtAnchor* pAnchor = &pFmt->GetAnchor();
                const SwPosition* pAPos;
                if( ( pAnchor->GetAnchorId() == FLY_AT_CNTNT ||
                      pAnchor->GetAnchorId() == FLY_AT_FLY ||
                      pAnchor->GetAnchorId() == FLY_AUTO_CNTNT ) &&
                    0 != ( pAPos = pAnchor->GetCntntAnchor()) &&
                    nStart <= ( nIdx = pAPos->nNode.GetIndex()) &&
                    nIdx < nEnd )
                {
                    AppendFlyInFlys( rCP, *pFmt, rNdTopLeft );
                }
            }
        }
    }
}


USHORT SwWW8Writer::TranslateToEditEngineId( USHORT nWhich )
{
    switch( nWhich )
    {
    case RES_LR_SPACE:              nWhich = EE_PARA_LRSPACE;       break;
    case RES_UL_SPACE:              nWhich = EE_PARA_ULSPACE;       break;
    case RES_PARATR_LINESPACING:    nWhich = EE_PARA_SBL;           break;
    case RES_PARATR_ADJUST:         nWhich = EE_PARA_JUST;          break;
    case RES_PARATR_TABSTOP:        nWhich = EE_PARA_TABS;          break;

    case RES_CHRATR_COLOR:          nWhich = EE_CHAR_COLOR;         break;
    case RES_CHRATR_FONT:           nWhich = EE_CHAR_FONTINFO;      break;
    case RES_CHRATR_FONTSIZE:       nWhich = EE_CHAR_FONTHEIGHT;    break;
    case RES_CHRATR_WEIGHT:         nWhich = EE_CHAR_WEIGHT;        break;
    case RES_CHRATR_UNDERLINE:      nWhich = EE_CHAR_UNDERLINE;     break;
    case RES_CHRATR_CROSSEDOUT:     nWhich = EE_CHAR_STRIKEOUT;     break;
    case RES_CHRATR_POSTURE:        nWhich = EE_CHAR_ITALIC;        break;
    case RES_CHRATR_CONTOUR:        nWhich = EE_CHAR_OUTLINE;       break;
    case RES_CHRATR_SHADOWED:       nWhich = EE_CHAR_SHADOW;        break;
    case RES_CHRATR_ESCAPEMENT:     nWhich = EE_CHAR_ESCAPEMENT;    break;
    case RES_CHRATR_AUTOKERN:       nWhich = EE_CHAR_PAIRKERNING;   break;
    case RES_CHRATR_KERNING:        nWhich = EE_CHAR_KERNING;       break;
    case RES_CHRATR_WORDLINEMODE:   nWhich = EE_CHAR_WLM;           break;
    case RES_CHRATR_CHARSETCOLOR:   nWhich = EE_FEATURE_NOTCONV;    break;


    default:
//  case EE_PARA_NUMBULLET:
//  case EE_PARA_HYPHENATE:
//  case EE_PARA_BULLETSTATE:
//  case EE_PARA_OUTLLRSPACE:
//  case EE_PARA_OUTLLEVEL:
//  case EE_PARA_BULLET:
//ITEMID_FONTWIDTH        EE_CHAR_FONTWIDTH
        nWhich = 0;
        break;
    }
    return nWhich;
}

USHORT SwWW8Writer::TranslateFromEditEngineId( USHORT nWhich )
{
    switch( nWhich )
    {
    case EE_PARA_LRSPACE:       nWhich = RES_LR_SPACE;              break;
    case EE_PARA_ULSPACE:       nWhich = RES_UL_SPACE;              break;
    case EE_PARA_SBL:           nWhich = RES_PARATR_LINESPACING;    break;
    case EE_PARA_JUST:          nWhich = RES_PARATR_ADJUST;         break;
    case EE_PARA_TABS:          nWhich = RES_PARATR_TABSTOP;        break;

    case EE_CHAR_COLOR:         nWhich = RES_CHRATR_COLOR;          break;
    case EE_CHAR_FONTINFO:      nWhich = RES_CHRATR_FONT;           break;
    case EE_CHAR_FONTHEIGHT:    nWhich = RES_CHRATR_FONTSIZE;       break;
    case EE_CHAR_WEIGHT:        nWhich = RES_CHRATR_WEIGHT;         break;
    case EE_CHAR_UNDERLINE:     nWhich = RES_CHRATR_UNDERLINE;      break;
    case EE_CHAR_STRIKEOUT:     nWhich = RES_CHRATR_CROSSEDOUT;     break;
    case EE_CHAR_ITALIC:        nWhich = RES_CHRATR_POSTURE;        break;
    case EE_CHAR_OUTLINE:       nWhich = RES_CHRATR_CONTOUR;        break;
    case EE_CHAR_SHADOW:        nWhich = RES_CHRATR_SHADOWED;       break;
    case EE_CHAR_ESCAPEMENT:    nWhich = RES_CHRATR_ESCAPEMENT;     break;
    case EE_CHAR_PAIRKERNING:   nWhich = RES_CHRATR_AUTOKERN;       break;
    case EE_CHAR_KERNING:       nWhich = RES_CHRATR_KERNING;        break;
    case EE_CHAR_WLM:           nWhich = RES_CHRATR_WORDLINEMODE;   break;
    case EE_FEATURE_NOTCONV:    nWhich = RES_CHRATR_CHARSETCOLOR;   break;

    default:
//  case EE_PARA_NUMBULLET:
//  case EE_PARA_HYPHENATE:
//  case EE_PARA_BULLETSTATE:
//  case EE_PARA_OUTLLRSPACE:
//  case EE_PARA_OUTLLEVEL:
//  case EE_PARA_BULLET:
//ITEMID_FONTWIDTH        EE_CHAR_FONTWIDTH
        nWhich = 0;
        break;
    }
    return nWhich;
}

class WW8_SdrAttrIter : public WW8_AttrIter
{
    const EditTextObject* pEditObj;
    EECharAttribArray aTxtAtrArr;
    SvPtrarr aChrTxtAtrArr;
    SvUShorts aChrSetArr;
    USHORT nPara;
    xub_StrLen nAktSwPos;
    xub_StrLen nTmpSwPos;                   // fuer HasItem()
    rtl_TextEncoding eNdChrSet;

    xub_StrLen SearchNext( xub_StrLen nStartPos );
    void SetCharSet( const EECharAttrib& rTxtAttr, BOOL bStart );

public:
    WW8_SdrAttrIter( SwWW8Writer& rWr, const EditTextObject& rEditObj );
    void NextPara( USHORT nPar );
    void OutParaAttr( BOOL bCharAttr );

    BOOL IsTxtAttr( xub_StrLen nSwPos );

    void NextPos() { nAktSwPos = SearchNext( nAktSwPos + 1 ); }

    void OutAttr( xub_StrLen nSwPos );
    virtual const SfxPoolItem* HasTextItem( USHORT nWhich ) const;
    virtual const SfxPoolItem& GetItem( USHORT nWhich ) const;
    BOOL OutAttrWithRange( xub_StrLen nPos );
    xub_StrLen WhereNext() const                { return nAktSwPos; }
    rtl_TextEncoding GetNextCharSet() const;
    rtl_TextEncoding GetNodeCharSet() const     { return eNdChrSet; }
};


WW8_SdrAttrIter::WW8_SdrAttrIter( SwWW8Writer& rWr,
                                    const EditTextObject& rEditObj )
    : WW8_AttrIter( rWr ), pEditObj( &rEditObj ),
    aTxtAtrArr( 0, 4 ), aChrTxtAtrArr( 0, 4 ), aChrSetArr( 0, 4 )
{
    NextPara( 0 );
}

void WW8_SdrAttrIter::NextPara( USHORT nPar )
{
    nPara = nPar;
    // Attributwechsel an Pos 0 wird ignoriert, da davon ausgegangen
    // wird, dass am Absatzanfang sowieso die Attribute neu ausgegeben
    // werden.
    aChrTxtAtrArr.Remove( 0, aChrTxtAtrArr.Count() );
    aChrSetArr.Remove( 0, aChrSetArr.Count() );
    nAktSwPos = nTmpSwPos = 0;

    SfxItemSet aSet( pEditObj->GetParaAttribs( nPara ));
    eNdChrSet = ((SvxFontItem&)aSet.Get( EE_CHAR_FONTINFO )).GetCharSet();
    pEditObj->GetCharAttribs( nPara, aTxtAtrArr );
    nAktSwPos = SearchNext( 1 );
}

rtl_TextEncoding WW8_SdrAttrIter::GetNextCharSet() const
{
    if( aChrSetArr.Count() )
        return (rtl_TextEncoding)aChrSetArr[ aChrSetArr.Count() - 1 ];
    return eNdChrSet;
}

// der erste Parameter in SearchNext() liefert zurueck, ob es ein TxtAtr ist.
xub_StrLen WW8_SdrAttrIter::SearchNext( xub_StrLen nStartPos )
{
    register xub_StrLen nPos;
    register xub_StrLen nMinPos = STRING_MAXLEN;
    register xub_StrLen i;

    for( i = 0; i < aTxtAtrArr.Count(); i++ )
    {
        const EECharAttrib& rHt = aTxtAtrArr[ i ];
        nPos = rHt.nStart;  // gibt erstes Attr-Zeichen
        if( nPos >= nStartPos && nPos <= nMinPos )
        {
            nMinPos = nPos;
            SetCharSet( rHt, TRUE );
        }

//??        if( pHt->GetEnd() )         // Attr mit Ende
        {
            nPos = rHt.nEnd;        // gibt letztes Attr-Zeichen + 1
            if( nPos >= nStartPos && nPos < nMinPos )
            {
                nMinPos = nPos;
                SetCharSet( rHt, FALSE );
            }
        }
/*      else
        {                                   // Attr ohne Ende
            nPos = rHt.nStart + 1;  // Laenge 1 wegen CH_TXTATR im Text
            if( nPos >= nStartPos && nPos < nMinPos )
            {
                nMinPos = nPos;
                SetCharSet( rHt, FALSE );
            }
        }
*/
    }
    return nMinPos;
}

void WW8_SdrAttrIter::SetCharSet( const EECharAttrib& rAttr, BOOL bStart )
{
    void* p = 0;
    rtl_TextEncoding eChrSet;
    const SfxPoolItem& rItem = *rAttr.pAttr;
    switch( rItem.Which() )
    {
    case EE_CHAR_FONTINFO:
        p = (void*)&rAttr;
        eChrSet = ((SvxFontItem&)rItem).GetCharSet();
        break;
    }

    if( p )
    {
        USHORT nPos;
        if( bStart )
        {
            nPos = aChrSetArr.Count();
            aChrSetArr.Insert( eChrSet, nPos );
            aChrTxtAtrArr.Insert( p, nPos );
        }
        else if( USHRT_MAX != ( nPos = aChrTxtAtrArr.GetPos( p )) )
        {
            aChrTxtAtrArr.Remove( nPos );
            aChrSetArr.Remove( nPos );
        }
    }
}

void WW8_SdrAttrIter::OutAttr( xub_StrLen nSwPos )
{
    OutParaAttr( TRUE );

    if( aTxtAtrArr.Count() )
    {
        const SwModify* pOldMod = rWrt.pOutFmtNode;
        rWrt.pOutFmtNode = 0;

        nTmpSwPos = nSwPos;
        register USHORT i, nWhich;
        FnAttrOut pOut;
        for( i = 0; i < aTxtAtrArr.Count(); i++ )
        {
            const EECharAttrib& rHt = aTxtAtrArr[ i ];
            if( nSwPos >= rHt.nStart && nSwPos < rHt.nEnd &&
                0 != ( nWhich = rWrt.TranslateFromEditEngineId(
                                                rHt.pAttr->Which() )) &&
                0 != ( pOut = aWW8AttrFnTab[ nWhich - RES_CHRATR_BEGIN ] ) )

                    (*pOut)( rWrt, *rHt.pAttr );

            else if( nSwPos < rHt.nStart )
                break;
        }

        nTmpSwPos = 0;      // HasTextItem nur in dem obigen Bereich erlaubt
        rWrt.pOutFmtNode = pOldMod;
    }
}

BOOL WW8_SdrAttrIter::IsTxtAttr( xub_StrLen nSwPos )
{
// solange die EditEngine keine Attribute hat, die nur eine Position haben
return  FALSE;

    // search for attrs without end position
    register USHORT i;
    for( i = 0; i < aTxtAtrArr.Count(); i++ )
        if( aTxtAtrArr[ i ].nStart == nSwPos )
            return TRUE;
    return FALSE;
}

// HasItem ist fuer die Zusammenfassung des Doppel-Attributes Underline
// und WordLineMode als TextItems. OutAttr() ruft die Ausgabefunktion,
// die dann ueber HasItem() nach anderen Items an der
// Attribut-Anfangposition fragen kann.
// Es koennen nur Attribute mit Ende abgefragt werden.
// Es wird mit bDeep gesucht
const SfxPoolItem* WW8_SdrAttrIter::HasTextItem( USHORT nWhich ) const
{
    const SfxPoolItem* pRet = 0;
    if( 0 != ( nWhich = rWrt.TranslateToEditEngineId( nWhich )) )
    {
        register USHORT i;
        for( i = 0; i < aTxtAtrArr.Count(); ++i )
        {
            const EECharAttrib& rHt = aTxtAtrArr[ i ];
            if( nWhich == rHt.pAttr->Which() &&
                nTmpSwPos >= rHt.nStart && nTmpSwPos < rHt.nEnd )
            {
                pRet = rHt.pAttr;       // gefunden
                break;
            }
            else if( nTmpSwPos < rHt.nStart )
                break;              // dann kommt da nichts mehr
        }
    }
    return pRet;
}

const SfxPoolItem& WW8_SdrAttrIter::GetItem( USHORT nWhich ) const
{
    const SfxPoolItem* pRet = HasTextItem( nWhich );
    if( !pRet )
    {
        SfxItemSet aSet( pEditObj->GetParaAttribs( nPara ));
        pRet = &aSet.Get( rWrt.TranslateToEditEngineId( nWhich ) );
    }
    return *pRet;
}

void WW8_SdrAttrIter::OutParaAttr( BOOL bCharAttr )
{
    SfxItemSet aSet( pEditObj->GetParaAttribs( nPara ));
    if( aSet.Count() )
    {
        const SfxItemSet* pOldSet = rWrt.GetCurItemSet();
        rWrt.SetCurItemSet( &aSet );

        SfxItemIter aIter( aSet );
        const SfxPoolItem* pItem = aIter.GetCurItem();
        FnAttrOut pOut;

        do {
            USHORT nWhich = rWrt.TranslateFromEditEngineId( pItem->Which() );
            if( nWhich && 0 != ( pOut =
                aWW8AttrFnTab[ nWhich - RES_CHRATR_BEGIN ] )
                && ( bCharAttr ? ( nWhich >= RES_CHRATR_BEGIN
                                  && nWhich < RES_TXTATR_END)
                               : (nWhich >= RES_PARATR_BEGIN
                                  && nWhich < RES_FRMATR_END) ) )
                (*pOut)( rWrt, *pItem );

        } while( !aIter.IsAtEnd() && 0 != ( pItem = aIter.NextItem() ) );
        rWrt.SetCurItemSet( pOldSet );
    }
}

void SwWW8Writer::WriteSdrTextObj( const SdrObject& rObj )
{
    const SdrTextObj* pTxtObj = PTR_CAST( SdrTextObj, &rObj );
    ASSERT( pTxtObj, "das ist gar kein SdrTextObj!" );

    BOOL bAnyWrite = FALSE;
    const OutlinerParaObject* pParaObj = pTxtObj->GetOutlinerParaObject();
    if( pParaObj )
    {
        const EditTextObject& rEditObj = pParaObj->GetTextObject();
        WW8_SdrAttrIter aAttrIter( *this, rEditObj );

        USHORT nPara = rEditObj.GetParagraphCount();
        BYTE bNul = 0;
        for( USHORT n = 0; n < nPara; ++n )
        {
            if( n )
                aAttrIter.NextPara( n );

            rtl_TextEncoding eChrSet = aAttrIter.GetNodeCharSet();

            ASSERT( !pO->Count(), " pO ist am Zeilenanfang nicht leer" );

            String aStr( rEditObj.GetText( n ));
            xub_StrLen nAktPos = 0;
            xub_StrLen nEnd = aStr.Len();
            BOOL bUnicode = TRUE;
            do {
/*
                switch( eChrSet )
                {
        //      case CHARSET_DONTKNOW:       ????
                case CHARSET_SYMBOL:
        //      case CHARSET_WIN_SYMBOL:
        //      case CHARSET_WIN_WINGDINGS:
        //      case CHARSET_MAC_DINGBATS:
        //      case CHARSET_MAC_SYMBOL:
        //      case CHARSET_ADOBE_SYMBOL:
        //      case CHARSET_ADOBE_DINGBATS:
        //      case CHARSET_STAR_STARBATS:
        //      case CHARSET_STAR_STARMATH:
                    bUnicode = bWrtWW8 ? TRUE : FALSE;
                    break;
                default:
                    bUnicode = FALSE;
                    break;
                }
*/
                xub_StrLen nNextAttr = aAttrIter.WhereNext();
                rtl_TextEncoding eNextChrSet = aAttrIter.GetNextCharSet();

                if( nNextAttr > nEnd )
                    nNextAttr = nEnd;

                BOOL bTxtAtr = aAttrIter.IsTxtAttr( nAktPos );
                if( !bTxtAtr )
                    OutSwString( aStr, nAktPos, nNextAttr - nAktPos,
                                    bUnicode, eChrSet );

                            // Am Zeilenende werden die Attribute bis ueber das CR
                            // aufgezogen. Ausnahme: Fussnoten am Zeilenende
                if( nNextAttr == nEnd && !bTxtAtr )
                    WriteCR();              // CR danach

                                                // Ausgabe der Zeichenattribute
                aAttrIter.OutAttr( nAktPos );   // nAktPos - 1 ??
                pChpPlc->AppendFkpEntry( Strm().Tell(),
                                                pO->Count(), pO->GetData() );
                pO->Remove( 0, pO->Count() );                   // leeren

                            // Ausnahme: Fussnoten am Zeilenende
                if( nNextAttr == nEnd && bTxtAtr )
                    WriteCR();              // CR danach

                nAktPos = nNextAttr;
                eChrSet = eNextChrSet;
                aAttrIter.NextPos();
            }
            while( nAktPos < nEnd );

            ASSERT( !pO->Count(), " pO ist am ZeilenEnde nicht leer" );

            pO->Insert( bNul, pO->Count() );        // Style # as short
            pO->Insert( bNul, pO->Count() );

            aAttrIter.OutParaAttr( FALSE );

            ULONG nPos = Strm().Tell();
            pPapPlc->AppendFkpEntry( Strm().Tell(),
                                            pO->Count(), pO->GetData() );
            pO->Remove( 0, pO->Count() );                       // leeren
            pChpPlc->AppendFkpEntry( nPos );
        }
        bAnyWrite = 0 != nPara;
    }
    if( !bAnyWrite )
        WriteStringAsPara( aEmptyStr );
}

/*  */

class SwEscherEx : public  EscherEx
{
    // private members
    SvULongs aFollowShpIds;
    SvPtrarr aSortFmts;
    SwWW8Writer& rWrt;
    WW8_WrPlcTxtBoxes *pTxtBxs;
    SvStream* pEscherStrm, *pPictStrm;
    long nEmuMul, nEmuDiv;

    // private methods
    void Init();

    UINT32 GetFlyShapeId( const SwFrmFmt& rFmt );
    void MakeZOrderArrAndFollowIds( const SvPtrarr& rSrcArr );

    INT32 ToFract16( INT32 nVal, UINT32 nMax ) const
        {
            INT32 nMSVal = ( nVal / 65536) * nMax;
            nMSVal += ( nVal * 65536 ) / nMax;
            return nMSVal;
        }
    INT32 DrawModelToEmu( INT32 nVal ) const
        { return BigMulDiv( nVal, nEmuMul, nEmuDiv ); }

    void WriteTxtFlyFrame( const SwFrmFmt& rFmt, UINT32 nShapeId,
                                UINT32 nTxtBox );
    void WriteGrfFlyFrame( const SwFrmFmt& rFmt, UINT32 nShapeId );
    void WriteOLEFlyFrame( const SwFrmFmt& rFmt, UINT32 nShapeId );
    void WriteFlyFrameAttr( const SwFrmFmt& rFmt );
    void WriteGrfAttr( const SwNoTxtNode& rNd );

    UINT32 WriteFlyFrm( const SwFrmFmt& rFmt );

    virtual SvStream* QueryPicStream();
    virtual UINT32 QueryTextID( const uno::Reference< drawing::XShape>& , UINT32 );

    SwEscherEx( const SwEscherEx& );
public:
    SwEscherEx( SvStream* pStrm, SwWW8Writer& rWW8Wrt );
    virtual ~SwEscherEx();

    void FinishEscher();
    void WritePictures();
};


/*  */

void SwWW8Writer::CreateEscher()
{
    if(pHFSdrObjs->GetCntntArr().Count() || pSdrObjs->GetCntntArr().Count())
    {
        ASSERT( !pEscher, "wer hat den Pointer nicht geloescht?" );
        SvStream* pEscherStrm = pStg->OpenStream( sEscherStream,
                                STREAM_READWRITE | STREAM_SHARE_DENYALL );
        pEscherStrm->SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );

        pEscher = new SwEscherEx( pEscherStrm, *this );
    }
}

void SwWW8Writer::WriteEscher()
{
    if( pEscher )
    {
        ULONG nStart = pTableStrm->Tell();

        pEscher->WritePictures();
        pEscher->FinishEscher();

        pFib->fcDggInfo = nStart;
        pFib->lcbDggInfo = pTableStrm->Tell() - nStart;
        delete pEscher, pEscher = 0;
    }
}


/*  */

// Output- Routines for Escher Export

SwEscherEx::SwEscherEx( SvStream* pStrm, SwWW8Writer& rWW8Wrt )
/*  : SvxEscherEx( *pStrm,
                   rWW8Wrt.pHFSdrObjs->GetCntntArr().Count() ? 2 : 1,
                   *rWW8Wrt.pDoc->GetDrawModel(),
                   1440 ),
*/
    : EscherEx( *pStrm, rWW8Wrt.pHFSdrObjs->GetCntntArr().Count() ? 2 : 1 ),
    rWrt( rWW8Wrt ), pTxtBxs( 0 ), pEscherStrm( pStrm ), pPictStrm( 0 )
{
    Init();
    OpenContainer( ESCHER_DggContainer );
        BeginCount();
        AddColor( 0x08000004 );
        AddColor( 0x08000001 );
        AddColor( 0x08000002 );
        AddColor( 0x100000f7 );
        EndCount( ESCHER_SplitMenuColors );
    CloseContainer();   // ESCHER_DggContainer

    BYTE i = 2;     // for header/footer and the other
    WW8_WrPlcDrawObj *pSdrObjs = rWrt.pHFSdrObjs;
    pTxtBxs = rWrt.pHFTxtBxs;

    if( !pSdrObjs->GetCntntArr().Count() )      // if no header/footer -> skip over
    {
        --i;
        pSdrObjs = rWrt.pSdrObjs;
        pTxtBxs = rWrt.pTxtBxs;
    }

    for( ; i--; pSdrObjs = rWrt.pSdrObjs, pTxtBxs = rWrt.pTxtBxs )
    {
        // "dummy char" (or any Count ?) - why? This knows only M$
        GetStream() << (sal_Char)i;

        OpenContainer( ESCHER_DgContainer );

            EnterGroup( 0 );

                ULONG nSecondShapeId = pSdrObjs == rWrt.pSdrObjs
                                    ? GetShapeID() : 0;

                // write now all Writer-/DrawObjects
                MakeZOrderArrAndFollowIds( pSdrObjs->GetCntntArr() );

                ULONG nShapeId;
                for( USHORT n = 0; n < aSortFmts.Count(); ++n )
                {
                    const SwFrmFmt& rFmt = *(SwFrmFmt*)aSortFmts[ n ];
                    if( RES_FLYFRMFMT == rFmt.Which() )
                        nShapeId = WriteFlyFrm( rFmt );
                    else
                    {
                        const SdrObject* pObj = rFmt.FindRealSdrObject();
                        if( pObj )
                        {
                            nShapeId = AddSdrObject( *pObj );
                        }
#ifndef PRODUCT
                        else
                            ASSERT( !this, "wo ist das SDR-Object?" );
#endif
                    }

                    if( !nShapeId )
                    {
                        /*!!!*/ const SdrObject* pObj = 0;
                        nShapeId = AddDummyShape( *pObj );
                    }

                    pSdrObjs->SetShapeId( rFmt, nShapeId );
                }

            EndSdrObjectPage();         // ???? Bugfix for 74724

            LeaveGroup();

            if( nSecondShapeId )
            {
                OpenContainer( ESCHER_SpContainer );

                    AddShape( ESCHER_ShpInst_Rectangle, 0xe00, nSecondShapeId );

                    BeginCount();
                    // default Fuellfarbe ist das StarOffice blau7
                    // ----> von DrawingLayer besorgen !!
                    AddOpt( ESCHER_Prop_fillColor, 0xffb800 );
                    AddOpt( ESCHER_Prop_fillBackColor, 0 );
                    AddOpt( ESCHER_Prop_fNoFillHitTest, 0x00100010 );
                    AddOpt( ESCHER_Prop_lineColor, 0x8000001 );
                    AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x00080008 );
                    AddOpt( ESCHER_Prop_shadowColor, 0x8000002 );
                    AddOpt( ESCHER_Prop_lineWidth, 0 );

// winword defaults!
//                  AddOpt( ESCHER_Prop_fNoFillHitTest, 0x100000 );
//                  AddOpt( ESCHER_Prop_lineWidth, 0 );
//                  AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x80000 );
//                  AddOpt( ESCHER_Prop_bWMode, 0x9 );
//                  AddOpt( ESCHER_Prop_fBackground, 0x10001 );

                    EndCount( ESCHER_OPT, 3 );

                    AddAtom( 4, ESCHER_ClientData );
                    GetStream() << 1L;

                CloseContainer();   // ESCHER_SpContainer
            }
        CloseContainer();   // ESCHER_DgContainer
    }
}

SwEscherEx::~SwEscherEx()
{
}

void SwEscherEx::Init()
{
    SdrModel& rModel = *rWrt.pDoc->GetDrawModel();
    // PPT arbeitet nur mit Einheiten zu 576DPI
    // WW hingegen verwendet twips, dh. 1440DPI.
    MapUnit eMap = rModel.GetScaleUnit();

//  Fraction aFact( nAppScale );
//  aFact /= GetMapFactor( MAP_INCH, eMap ).X();
    // create little values
//  aFact = Fraction( aFact.GetNumerator(), aFact.GetDenominator() );

    // Bei 100TH_MM -> 2540/576=635/144
    // Bei Twip     -> 1440/576=5/2
//  nMapMul = aFact.GetNumerator();
//  nMapDiv = aFact.GetDenominator();
//  bNeedMap = nMapMul != nMapDiv;

    // MS-DFF-Properties sind grossteils in EMU (English Metric Units) angegeben
    // 1mm=36000emu, 1twip=635emu
    Fraction aFact( 360, 1 );
//  aFact = Fraction( 360, 1 );
    aFact /= GetMapFactor( MAP_100TH_MM, eMap ).X();
    // create little values
    aFact = Fraction( aFact.GetNumerator(), aFact.GetDenominator() );
    nEmuMul = aFact.GetNumerator();
    nEmuDiv = aFact.GetDenominator();

    // Und noch was fuer typografische Points
//  aFact = Fraction( 1, 1 );
//  aFact /= GetMapFactor(MAP_POINT,eMap).X();
//  nPntMul = aFact.GetNumerator();
//  nPntDiv = aFact.GetDenominator();

    SetHellLayerId( rWrt.pDoc->GetHellId() );
}

void SwEscherEx::WritePictures()
{
    if( pPictStrm )
    {
        // set the blip - entries to the correct stream pos
        INT32 nEndPos = rWrt.Strm().Tell();
        SetNewBlipStreamOffset( nEndPos );

        pPictStrm->Seek( 0 );
        rWrt.Strm() << *pPictStrm;

        delete pPictStrm, pPictStrm = 0;
        rWrt.GetStorage().Remove( sEscherPictStream );
    }
    Flush();
}

void SwEscherEx::FinishEscher()
{
    pEscherStrm->Seek( 0 );
    *rWrt.pTableStrm << *pEscherStrm;

    delete pEscherStrm, pEscherStrm = 0;
    rWrt.GetStorage().Remove( sEscherStream );
}


UINT32 SwEscherEx::WriteFlyFrm( const SwFrmFmt& rFmt )
{
    // check for textflyframe and if it is the first in a Chain
    UINT32 nShapeId = 0;
    const SwNodeIndex* pNdIdx = rFmt.GetCntnt().GetCntntIdx();
    if( pNdIdx )
    {
        SwNodeIndex aIdx( *pNdIdx, 1 );
        switch( aIdx.GetNode().GetNodeType() )
        {
        case ND_GRFNODE:
            WriteGrfFlyFrame( rFmt, nShapeId =GetShapeID() );
            break;

        case ND_OLENODE:
            WriteOLEFlyFrame( rFmt, nShapeId =GetShapeID() );
            break;

        default:
            {
                const SdrObject* pObj = rFmt.FindRealSdrObject();
                if( pObj )
                {
                    // check for the first in a Chain
                    UINT32 nTxtId;
                    USHORT nOff = 0;
                    const SwFrmFmt* pFmt = &rFmt, *pPrev;
                    while( 0 != ( pPrev = pFmt->GetChain().GetPrev() ))
                    {
                        ++nOff;
                        pFmt = pPrev;
                    }

                    nShapeId = GetFlyShapeId( rFmt );
                    if( !nOff )
                    {
                        void* p = (void*)pObj;
                        nTxtId = pTxtBxs->GetPos( p );
                        if( USHRT_MAX == nTxtId )
                        {
                            pTxtBxs->Append( *pObj, nShapeId );
                            nTxtId = pTxtBxs->Count();
                        }
                        else
                            ++nTxtId;
                    }
                    else
                    {
                        const SdrObject* pPrevObj = pFmt->FindRealSdrObject();
                        void* p = (void*)pPrevObj;
                        nTxtId = pTxtBxs->GetPos( p );
                        if( USHRT_MAX == nTxtId )
                        {
                            UINT32 nPrevShapeId = GetFlyShapeId( *pFmt );
                            pTxtBxs->Append( *pPrevObj, nPrevShapeId );
                            nTxtId = pTxtBxs->Count();
                        }
                        else
                            ++nTxtId;
                    }
                    nTxtId *= 0x10000;
                    nTxtId += nOff;

                    WriteTxtFlyFrame( rFmt, nShapeId, nTxtId );
                }
            }
        }
    }
    return nShapeId;
}

void SwEscherEx::WriteTxtFlyFrame( const SwFrmFmt& rFmt, UINT32 nShapeId,
                                    UINT32 nTxtBox )
{
    OpenContainer( ESCHER_SpContainer );

    AddShape( ESCHER_ShpInst_TextBox, 0xa00, nShapeId );

    BeginCount();

    AddOpt( ESCHER_Prop_lTxid, nTxtBox );

    const VoidPtr pNext = rFmt.GetChain().GetNext();
    if( pNext )
    {
        USHORT nPos = aSortFmts.GetPos( pNext );
        if( USHRT_MAX != nPos && aFollowShpIds[ nPos ] )
            AddOpt( ESCHER_Prop_hspNext, aFollowShpIds[ nPos ] );
    }

    WriteFlyFrameAttr( rFmt );

    EndCount( ESCHER_OPT, 3 );

    AddAtom( 4, ESCHER_ClientAnchor );  GetStream() << 0L;
    AddAtom( 4, ESCHER_ClientData );    GetStream() << 1L;
    AddAtom( 4, ESCHER_ClientTextbox ); GetStream() << nTxtBox;

    CloseContainer();   // ESCHER_SpContainer
}

void SwEscherEx::WriteGrfFlyFrame( const SwFrmFmt& rFmt, UINT32 nShapeId )
{
    OpenContainer( ESCHER_SpContainer );

    AddShape( ESCHER_ShpInst_PictureFrame, 0xa00, nShapeId );

    BeginCount();

    UINT32 nFlags = ESCHER_BlipFlagDefault;
    SwNodeIndex aIdx( *rFmt.GetCntnt().GetCntntIdx(), 1 );
    SwGrfNode& rGrfNd = *aIdx.GetNode().GetGrfNode();
    if( rGrfNd.IsLinkedFile() )
    {
        String sURL;
        rGrfNd.GetFileFilterNms( &sURL, 0 );

        WW8Bytes aBuf;
        SwWW8Writer::InsAsString16( aBuf, sURL );
        SwWW8Writer::InsUInt16( aBuf, 0 );

        USHORT nArrLen = aBuf.Count();
        BYTE* pArr = new BYTE[ nArrLen ];
        memcpy( pArr, aBuf.GetData(), nArrLen );

        AddOpt( ESCHER_Prop_pibName, TRUE, nArrLen, pArr, nArrLen );
        nFlags = ESCHER_BlipFlagLinkToFile | ESCHER_BlipFlagURL |
                    ESCHER_BlipFlagDoNotSave;
    }
    else
    {
        rGrfNd.SwapIn( TRUE );
        AddOpt( ESCHER_Prop_pib, AddGraphic( *QueryPicStream(),
                                            rGrfNd.GetGrf() ), TRUE );
    }
    AddOpt( ESCHER_Prop_pibFlags, nFlags );

    WriteFlyFrameAttr( rFmt );
    WriteGrfAttr( rGrfNd );

    EndCount( ESCHER_OPT, 3 );

    AddAtom( 4, ESCHER_ClientAnchor );      GetStream() << 0L;
    AddAtom( 4, ESCHER_ClientData );        GetStream() << 1L;

    CloseContainer();   // ESCHER_SpContainer
}

void SwEscherEx::WriteOLEFlyFrame( const SwFrmFmt& rFmt, UINT32 nShapeId )
{
    SwNodeIndex aIdx( *rFmt.GetCntnt().GetCntntIdx(), 1 );
    SwOLENode& rOLENd = *aIdx.GetNode().GetOLENode();
    const SvInPlaceObjectRef xObj( rOLENd.GetOLEObj().GetOleRef() );
    SvData aData( FORMAT_GDIMETAFILE );
    GDIMetaFile* pMtf;

    const SdrObject* pSdrObj = rFmt.FindRealSdrObject();
    if( pSdrObj && xObj->GetData( &aData ) &&
        aData.GetData( &pMtf, TRANSFER_MOVE ) )
    {
        OpenContainer( ESCHER_SpContainer );

        AddShape( ESCHER_ShpInst_PictureFrame, 0xa10, nShapeId );

        BeginCount();

        {
            SvMemoryStream aGrfStrm;
            WriteWindowMetafile( aGrfStrm, *pMtf );
            const BYTE* pMem = (BYTE*)aGrfStrm.GetData();
            UINT32 nLen = aGrfStrm.GetSize();
            Size aSz( rOLENd.GetTwipSize() );
            aSz.Width() = DrawModelToEmu( aSz.Width() );
            aSz.Height() = DrawModelToEmu( aSz.Height() );
            Rectangle aRect( Point(0,0), aSz );
            AddOpt( ESCHER_Prop_pib, AddWMF( *QueryPicStream(),
                                    pMem + 22, nLen - 22, aRect ), TRUE );
        }
        pTxtBxs->Append( *pSdrObj, nShapeId );
        UINT32 nPicId = pTxtBxs->Count();
        nPicId *= 0x10000;
        AddOpt( ESCHER_Prop_pictureId, nPicId );
        AddOpt( ESCHER_Prop_pictureActive, 0x10000 );

        WriteFlyFrameAttr( rFmt );
        WriteGrfAttr( rOLENd );

        EndCount( ESCHER_OPT, 3 );

        AddAtom( 4, ESCHER_ClientAnchor );      GetStream() << 0L;
        AddAtom( 4, ESCHER_ClientData );        GetStream() << 1L;

        CloseContainer();   // ESCHER_SpContainer
    }
}


void SwEscherEx::WriteGrfAttr( const SwNoTxtNode& rNd )
{
    const SfxPoolItem* pItem;
    if( SFX_ITEM_SET == rNd.GetSwAttrSet().GetItemState( RES_GRFATR_CROPGRF,
                                                        TRUE, &pItem ))
    {
        const Size aSz( rNd.GetTwipSize() );
        INT32 nVal;
        if( 0 != ( nVal = ((SwCropGrf*)pItem )->GetLeft() ) )
            AddOpt( ESCHER_Prop_cropFromLeft, ToFract16( nVal, aSz.Width()) );
        if( 0 != ( nVal = ((SwCropGrf*)pItem )->GetRight() ) )
            AddOpt( ESCHER_Prop_cropFromRight, ToFract16( nVal, aSz.Width()));
        if( 0 != ( nVal = ((SwCropGrf*)pItem )->GetTop() ) )
            AddOpt( ESCHER_Prop_cropFromTop, ToFract16( nVal, aSz.Height()));
        if( 0 != ( nVal = ((SwCropGrf*)pItem )->GetBottom() ) )
            AddOpt( ESCHER_Prop_cropFromBottom, ToFract16( nVal, aSz.Height()));
    }
    // mirror ??
}

void SwEscherEx::WriteFlyFrameAttr( const SwFrmFmt& rFmt )
{
    const SfxPoolItem* pItem;
    BOOL bFirstLine = TRUE;
    if( SFX_ITEM_SET == rFmt.GetItemState( RES_BOX, TRUE, &pItem ) )
    {
        static UINT16 __READONLY_DATA aExhperProp[ 4 ] = {
            ESCHER_Prop_dyTextTop,  ESCHER_Prop_dyTextBottom,
            ESCHER_Prop_dxTextLeft, ESCHER_Prop_dxTextRight
        };
        const SvxBorderLine* pLine;

        for( int n = 0; n < 4; ++n )
            if( 0 != ( pLine = ((SvxBoxItem*)pItem)->GetLine( n )) )
            {
                if( bFirstLine )
                {
                    UINT32 nLineColor = GetColor( pLine->GetColor(), FALSE );
                    AddOpt( ESCHER_Prop_lineColor, nLineColor );
                    AddOpt( ESCHER_Prop_lineBackColor, nLineColor ^ 0xffffff );

                    UINT32 nLineWidth;
                    ESCHER_LineStyle eStyle;
                    if( pLine->GetInWidth() )
                    {
                        // double line
                        nLineWidth = pLine->GetInWidth() +
                                       pLine->GetOutWidth() +
                                       pLine->GetDistance();
                        if( pLine->GetInWidth() == pLine->GetOutWidth() )
                            eStyle = ESCHER_LineDouble;
                        else if( pLine->GetInWidth() < pLine->GetOutWidth() )
                            eStyle = ESCHER_LineThickThin;
                        else
                            eStyle = ESCHER_LineThinThick;
                    }
                    else
                    {
                        // simple line
                        eStyle = ESCHER_LineSimple;
                        nLineWidth = pLine->GetOutWidth();
                    }

                    AddOpt( ESCHER_Prop_lineStyle, eStyle );
                    AddOpt( ESCHER_Prop_lineWidth, DrawModelToEmu( nLineWidth ));

                    bFirstLine = FALSE;
                }

                AddOpt( aExhperProp[ n ], DrawModelToEmu(
                                ((SvxBoxItem*)pItem)->GetDistance( n ) ));
            }
    }
    if( bFirstLine )                // no valid line found
    {
        AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x80000 );
        AddOpt( ESCHER_Prop_dyTextTop, 0 );
        AddOpt( ESCHER_Prop_dyTextBottom, 0 );
        AddOpt( ESCHER_Prop_dxTextLeft, 0 );
        AddOpt( ESCHER_Prop_dxTextRight, 0 );
    }

    // write shadow
/*
    WinWord dont know any shadow at textboxes
    if( SFX_ITEM_SET == rFmt.GetItemState( RES_SHADOW, TRUE, &pItem ) )
    {
            mpEscherEx->AddOpt( ESCHER_Prop_fshadowObscured, 0x20002 );
            if( rObj.ImplGetPropertyValue(  C2U("ShadowColor") ) )
                mpEscherEx->AddOpt( ESCHER_Prop_shadowColor,
                    mpEscherEx->GetColor(
                            *((UINT32*)rObj.GetUsrAny().get()) ) );


            if ( rObj.ImplGetPropertyValue( C2U("Shadow") ) )
            {
                if ( rObj.GetUsrAny().getBOOL() )
                {
                    if( rObj.ImplGetPropertyValue( C2U("ShadowXDistance") ) )
                        mpEscherEx->AddOpt( ESCHER_Prop_shadowOffsetX,
                                    *((INT32*)rObj.GetUsrAny().get()) * 360 );
                    if( rObj.ImplGetPropertyValue( C2U("ShadowYDistance") ) )
                        mpEscherEx->AddOpt( ESCHER_Prop_shadowOffsetY,
                                    *((INT32*)rObj.GetUsrAny().get()) * 360 );
                    if( rObj.ImplGetPropertyValue( C2U("ShadowTransparence") ) )
                        mpEscherEx->AddOpt( ESCHER_Prop_shadowOpacity,
                            ( ( 100 - (*((UINT16*)rObj.GetUsrAny().get()) )
                                        << 16 ) / 100 ) );
                }
            }
    }
*/

    if( SFX_ITEM_SET == rFmt.GetItemState( RES_BACKGROUND, TRUE, &pItem ) )
    {
        if( /* ((SvxBrushItem*)pItem)->GetGraphicLink() || */
                ((SvxBrushItem*)pItem)->GetGraphic() )
        {
/*          if( ((SvxBrushItem*)pItem)->GetGraphicLink() )
            {
                AddOpt( ESCHER_Prop_fillBlipName, TRUE,
                // wie jetzt ??
                AddOpt( UINT16 nPropertyID, BOOL bBlib, UINT32 nPropValue,
                        BYTE* pProp, UINT32 nPropSize );
            }
            else
*/
            {
                AddOpt( ESCHER_Prop_fillBlip, AddGraphic( *QueryPicStream(),
                                    *((SvxBrushItem*)pItem)->GetGraphic() ),
                                    TRUE );
            }
            AddOpt( ESCHER_Prop_fillType, ESCHER_FillPicture );
            AddOpt( ESCHER_Prop_fNoFillHitTest, 0x140014 );
            AddOpt( ESCHER_Prop_fillBackColor, 0 );
        }
        else if( !((SvxBrushItem*)pItem)->GetColor().GetTransparency() )
        {
            UINT32 nFillColor = GetColor( ((SvxBrushItem*)pItem)->
                                                    GetColor(), FALSE );
            AddOpt( ESCHER_Prop_fillColor, nFillColor );
            AddOpt( ESCHER_Prop_fillBackColor, nFillColor ^ 0xffffff );
            AddOpt( ESCHER_Prop_fNoFillHitTest, 0x100010 );
        }
        else
        {
            AddOpt( ESCHER_Prop_fNoFillHitTest, 0x100000 );
        }
    }

    if( SFX_ITEM_SET == rFmt.GetItemState( RES_LR_SPACE, TRUE, &pItem ))
    {
        AddOpt( ESCHER_Prop_dxWrapDistLeft,
                DrawModelToEmu( ((SvxLRSpaceItem*)pItem)->GetLeft() ) );
        AddOpt( ESCHER_Prop_dxWrapDistRight,
                DrawModelToEmu( ((SvxLRSpaceItem*)pItem)->GetRight() ) );
    }
    if( SFX_ITEM_SET == rFmt.GetItemState( RES_UL_SPACE, TRUE, &pItem ))
    {
        AddOpt( ESCHER_Prop_dyWrapDistTop,
                DrawModelToEmu( ((SvxULSpaceItem*)pItem)->GetUpper() ) );
        AddOpt( ESCHER_Prop_dyWrapDistBottom,
                DrawModelToEmu( ((SvxULSpaceItem*)pItem)->GetLower() ) );
    }

    const SdrObject* pObj = rFmt.FindRealSdrObject();
    if( pObj && pObj->GetLayer() == GetHellLayerId() )
        AddOpt( ESCHER_Prop_fPrint, 0x200020 );
}

void SwEscherEx::MakeZOrderArrAndFollowIds( const SvPtrarr& rSrcArr )
{
    if( aSortFmts.Count() )
        aSortFmts.Remove( 0, aSortFmts.Count() );

    USHORT n, nPos, nCnt = rSrcArr.Count();
    SvULongsSort aSort( 255 < nCnt ? 255 : nCnt, 255 );
    for( n = 0; n < nCnt; ++n )
    {
        void* p = rSrcArr[ n ];
        ULONG nOrdNum = rWrt.GetSdrOrdNum( *(SwFrmFmt*)p );
        aSort.Insert( nOrdNum, nPos );
        aSortFmts.Insert( p, nPos );
    }

    if( aFollowShpIds.Count() )
        aFollowShpIds.Remove( 0, aFollowShpIds.Count() );

    ULONG nShapeId;
    const SwFmtChain* pChain;
    for( n = 0; n < nCnt; ++n )
    {
        const SwFrmFmt* pFmt = (SwFrmFmt*)aSortFmts[ n ];

        if( RES_FLYFRMFMT == pFmt->Which() &&
            ( ( pChain = &pFmt->GetChain())->GetPrev() ||
                pChain->GetNext() ) )
        {
            // the format needs a shapeid
            nShapeId = GetShapeID();
        }
        else
            nShapeId = 0;
        aFollowShpIds.Insert( nShapeId, n );
    }
}


UINT32 SwEscherEx::GetFlyShapeId( const SwFrmFmt& rFmt )
{
    const VoidPtr pFmt = (void*)&rFmt;
    USHORT nPos = aSortFmts.GetPos( pFmt );
    UINT32 nShapeId;
    if( USHRT_MAX != nPos )
    {
        if( 0 == ( nShapeId = aFollowShpIds[ nPos ] ))
        {
            nShapeId = GetShapeID();
            aFollowShpIds[ nPos ] = nShapeId;
        }
    }
    else
        nShapeId = GetShapeID();
    return nShapeId;
}

UINT32 SwEscherEx::QueryTextID( const uno::Reference< drawing::XShape>& xXShapeRef, UINT32 nShapeId )
{
    UINT32 nId = 0;
    uno::Reference< lang::XUnoTunnel > xTunnel(xXShapeRef, uno::UNO_QUERY);
    SvxShape* pSvxShape = xTunnel.is() ?
        (SvxShape*)xTunnel->getSomething(SvxShape::getUnoTunnelId()) : 0;
    if( pSvxShape )
    {
        SdrObject* pObj = pSvxShape->GetSdrObject();
        if( pObj )
        {
            pTxtBxs->Append( *pObj, nShapeId );
            nId = pTxtBxs->Count();
            nId *= 0x10000;
        }
    }
    return nId;
}

SvStream* SwEscherEx::QueryPicStream()
{
    if( !pPictStrm )
    {
        pPictStrm = rWrt.GetStorage().OpenStream( sEscherPictStream,
                                STREAM_READWRITE | STREAM_SHARE_DENYALL );
        pPictStrm->SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );
    }
    return pPictStrm;
}


/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ww8/wrtw8esh.cxx,v 1.1.1.1 2000-09-18 17:14:58 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.23  2000/09/18 16:04:57  willem.vandorp
      OpenOffice header added.

      Revision 1.22  2000/08/25 12:27:31  jp
      Graphic Crop-Attribut exported to SVX

      Revision 1.21  2000/07/17 20:28:23  jp
      WriteGrfFlyFrame: alloc buffer for the linked graphics

      Revision 1.20  2000/05/16 17:39:17  jp
      Changes for Unicode

      Revision 1.19  2000/05/12 16:13:51  jp
      Changes for Unicode

      Revision 1.18  2000/04/11 17:35:37  jp
      Bug #74724#: CTOR SwEscherEx - call the end outproc for the SdrPage

      Revision 1.17  2000/03/24 13:55:29  jp
      Bug #74452#: after writing the escher delete the escher object

      Revision 1.16  2000/03/21 15:04:57  os
      UNOIII

      Revision 1.15  2000/03/03 15:20:01  os
      StarView remainders removed

      Revision 1.14  2000/02/23 18:40:03  jp
      Task #73176#: AddWmf will have EMU values

      Revision 1.13  2000/02/11 14:39:51  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.12  1999/11/24 14:55:55  hr
      #65293#: added header

      Revision 1.11  1999/10/14 21:05:57  jp
      Bug #68617#,#68705# and other little things

      Revision 1.10  1999/10/13 09:08:41  jp
      write character attributs of SdrObjects

      Revision 1.9  1999/10/11 10:57:30  jp
      some bugfixes #68745#/#69033#/#68681#

      Revision 1.8  1999/09/10 16:27:59  jp
      write FlyFrms too if no SdrObject exist

      Revision 1.7  1999/09/08 16:29:18  jp
      Bug #68618#: recognize the write of escher stream

      Revision 1.6  1999/09/01 17:32:38  JP
      new: write the text of SdrTextObjects


      Rev 1.5   01 Sep 1999 19:32:38   JP
   new: write the text of SdrTextObjects

      Rev 1.4   31 Aug 1999 09:51:36   JP
   set NumberFormatInt at streams to littleendian

      Rev 1.3   24 Aug 1999 20:15:48   JP
   Escher Export

      Rev 1.2   16 Aug 1999 17:16:30   JP
   W97 Export: experimental escher export (1)

      Rev 1.1   16 Aug 1999 13:05:42   JP
   write EscherObjects - only a testversion!

      Rev 1.0   21 Jul 1999 18:28:56   JP
   W97 Export: experimental escher export

*************************************************************************/

diff --git a/sw/source/filter/ww8/wrtw8nds.cxx b/sw/source/filter/ww8/wrtw8nds.cxx
new file mode 100644
index 0000000..3834d91
--- /dev/null
+++ b/sw/source/filter/ww8/wrtw8nds.cxx
@@ -0,0 +1,2002 @@
/*************************************************************************
 *
 *  $RCSfile: wrtw8nds.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:58 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PCH
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _URLOBJ_HXX //autogen wg. INetURLObject
#include <tools/urlobj.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _SVX_FONTITEM_HXX //autogen wg. SvxFontItem
#include <svx/fontitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen wg. SvxULSpaceItem
#include <svx/ulspitem.hxx>
#endif
#ifndef _SVX_BRKITEM_HXX //autogen
#include <svx/brkitem.hxx>
#endif

#ifndef _FMTPDSC_HXX //autogen
#include <fmtpdsc.hxx>
#endif
#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _FMTORNT_HXX //autogen
#include <fmtornt.hxx>
#endif
#ifndef _FMTFLCNT_HXX //autogen
#include <fmtflcnt.hxx>
#endif
#ifndef _FMTANCHR_HXX //autogen
#include <fmtanchr.hxx>
#endif
#ifndef _FMTCNTNT_HXX //autogen
#include <fmtcntnt.hxx>
#endif
#ifndef _FRMATR_HXX //autogen
#include <frmatr.hxx>
#endif
#ifndef _PARATR_HXX //autogen
#include <paratr.hxx>
#endif
#ifndef _TXATBASE_HXX //autogen
#include <txatbase.hxx>
#endif
#ifndef _FMTINFMT_HXX //autogen wg. SwFmtINetFmt
#include <fmtinfmt.hxx>
#endif
#ifndef _FMTRFMRK_HXX //autogen wg. SwFmtRefMark
#include <fmtrfmrk.hxx>
#endif
#ifndef _FCHRFMT_HXX //autogen wg. SwFmtCharFmt
#include <fchrfmt.hxx>
#endif
#ifndef _CHARFMT_HXX //autogen wg. SwCharFmt
#include <charfmt.hxx>
#endif
#ifndef _TOX_HXX //autogen wg. SwTOXMark
#include <tox.hxx>
#endif
#ifndef _NDTXT_HXX //autogen
#include <ndtxt.hxx>
#endif
#ifndef _PAM_HXX //autogen
#include <pam.hxx>
#endif
#ifndef _DOC_HXX //autogen
#include <doc.hxx>
#endif
#ifndef _DOCARY_HXX //autogen
#include <docary.hxx>
#endif
#ifndef _SWTABLE_HXX //autogen
#include <swtable.hxx>
#endif
#ifndef _SECTION_HXX //autogen
#include <section.hxx>
#endif
#ifndef _PAGEDESC_HXX //autogen
#include <pagedesc.hxx>
#endif
#ifndef _SWRECT_HXX //autogen
#include <swrect.hxx>
#endif
#ifndef _WRTWW8_HXX
#include <wrtww8.hxx>
#endif
#ifndef _FLYPOS_HXX
#include <flypos.hxx>           // SwPosFlyFrms
#endif
#ifndef _REFFLD_HXX //autogen wg. SwGetRefField
#include <reffld.hxx>
#endif
#ifndef _REDLINE_HXX
#include <redline.hxx>
#endif
#ifndef _WRTSWTBL_HXX
#include <wrtswtbl.hxx>
#endif
#ifndef _HTMLTBL_HXX
#include <htmltbl.hxx>
#endif
#ifndef _TXTTXMRK_HXX
#include <txttxmrk.hxx>
#endif
#ifndef SW_FMTLINE_HXX
#include <fmtline.hxx>
#endif

/*  */

WW8_AttrIter::WW8_AttrIter( SwWW8Writer& rWr )
    : rWrt( rWr ), pOld( rWr.pChpIter )
{
    rWrt.pChpIter = this;
}

WW8_AttrIter::~WW8_AttrIter()
{
    rWrt.pChpIter = pOld;
}

void WW8_AttrIter::GetItems( WW8Bytes& rItems ) const
{
}


/*  */

// Die Klasse WW8_SwAttrIter ist eine Hilfe zum Aufbauen der Fkp.chpx.
// Dabei werden nur Zeichen-Attribute beachtet; Absatz-Attribute brauchen
// diese Behandlung nicht.
// Die Absatz- und Textattribute des Writers kommen rein, und es wird
// mit Where() die naechste Position geliefert, an der sich die Attribute
// aendern. IsTxtAtr() sagt, ob sich an der mit Where() gelieferten Position
// ein Attribut ohne Ende und mit \xff im Text befindet.
// Mit OutAttr() werden die Attribute an der angegebenen SwPos
// ausgegeben.
class WW8_SwAttrIter : public WW8_AttrIter
{
    const SwTxtNode& rNd;
    SvPtrarr aTxtAtrArr;
    SvUShorts aChrSetArr;
    const SwRedline* pCurRedline;
    xub_StrLen nAktSwPos;
    xub_StrLen nTmpSwPos;                   // fuer HasItem()
    USHORT nCurRedlinePos;
    rtl_TextEncoding eNdChrSet;

    xub_StrLen SearchNext( xub_StrLen nStartPos );
    void SetCharSet( const SwTxtAttr& rTxtAttr, BOOL bStart );
    void FieldVanish( const String& rTxt );

    void OutSwFmtINetFmt( const SwFmtINetFmt& rAttr, BOOL bStart );
    void OutSwFmtRefMark( const SwFmtRefMark& rAttr, BOOL bStart );
    void OutSwTOXMark( const SwTOXMark& rAttr, BOOL bStart );

public:
    WW8_SwAttrIter( SwWW8Writer& rWr, const SwTxtNode& rNd );

    BOOL IsTxtAttr( xub_StrLen nSwPos );
    BOOL IsRedlineAtEnd( xub_StrLen nPos ) const;

    void NextPos() { nAktSwPos = SearchNext( nAktSwPos + 1 ); }

    void OutAttr( xub_StrLen nSwPos );
    virtual const SfxPoolItem* HasTextItem( USHORT nWhich ) const;
    virtual const SfxPoolItem& GetItem( USHORT nWhich ) const;
    virtual void GetItems( WW8Bytes& rItems ) const;
    BOOL OutAttrWithRange( xub_StrLen nPos );
    void OutRedlines( xub_StrLen nPos );

    xub_StrLen WhereNext() const                    { return nAktSwPos; }
    rtl_TextEncoding GetNextCharSet() const;
    rtl_TextEncoding GetNodeCharSet() const             { return eNdChrSet; }
};


WW8_SwAttrIter::WW8_SwAttrIter( SwWW8Writer& rWr, const SwTxtNode& rTxtNd )
    : WW8_AttrIter( rWr ), rNd( rTxtNd ), nAktSwPos( 0 ), nTmpSwPos( 0 ),
    aTxtAtrArr( 0, 4 ), aChrSetArr( 0, 4 ), nCurRedlinePos( USHRT_MAX ),
    pCurRedline( 0 )
{
    // Attributwechsel an Pos 0 wird ignoriert, da davon ausgegangen
    // wird, dass am Absatzanfang sowieso die Attribute neu ausgegeben
    // werden.
    eNdChrSet = ((SvxFontItem&)rNd.SwCntntNode::GetAttr(
                                        RES_CHRATR_FONT )).GetCharSet();
    if( rWrt.pDoc->GetRedlineTbl().Count() )
    {
        SwPosition aPos( rNd, SwIndex( (SwTxtNode*)&rNd ) );
        pCurRedline = rWrt.pDoc->GetRedline( aPos, &nCurRedlinePos );
    }
    nAktSwPos = SearchNext( 1 );
}

rtl_TextEncoding WW8_SwAttrIter::GetNextCharSet() const
{
    if( aChrSetArr.Count() )
        return (rtl_TextEncoding)aChrSetArr[ aChrSetArr.Count() - 1 ];
    return eNdChrSet;
}

xub_StrLen WW8_SwAttrIter::SearchNext( xub_StrLen nStartPos )
{
    register xub_StrLen nPos;
    register xub_StrLen nMinPos = STRING_MAXLEN;
    register xub_StrLen i;

    // first the redline, then the attributes
    if( pCurRedline )
    {
        const SwPosition* pEnd = pCurRedline->End();
        if( pEnd->nNode == rNd &&
            ( i = pEnd->nContent.GetIndex() ) >= nStartPos )
            nMinPos = i;
    }

    if( nCurRedlinePos < rWrt.pDoc->GetRedlineTbl().Count() )
    {
        // nCurRedlinePos point to the next redline
        nPos = nCurRedlinePos;
        if( pCurRedline )
            ++nPos;

        for( ; nPos < rWrt.pDoc->GetRedlineTbl().Count(); ++nPos )
        {
            const SwRedline* pRedl = rWrt.pDoc->GetRedlineTbl()[ nPos ];

            const SwPosition* pStt = pRedl->Start();
            const SwPosition* pEnd = pStt == pRedl->GetPoint()
                                        ? pRedl->GetMark()
                                        : pRedl->GetPoint();

            if( pStt->nNode == rNd )
            {
                if( ( i = pStt->nContent.GetIndex() ) >= nStartPos &&
                    i < nMinPos )
                    nMinPos = i;
            }
            else
                break;

            if( pEnd->nNode == rNd &&
                ( i = pEnd->nContent.GetIndex() ) < nMinPos &&
                i >= nStartPos )
                    nMinPos = i;
        }
    }

    const SwpHints* pTxtAttrs = rNd.GetpSwpHints();
    if( pTxtAttrs )
    {

// kann noch optimiert werden, wenn ausgenutzt wird, dass die TxtAttrs
// nach der Anfangsposition geordnet sind. Dann muessten
// allerdings noch 2 Indices gemerkt werden
        for( i = 0; i < pTxtAttrs->Count(); i++ )
        {
            const SwTxtAttr* pHt = (*pTxtAttrs)[i];
            nPos = *pHt->GetStart();    // gibt erstes Attr-Zeichen
            if( nPos >= nStartPos && nPos <= nMinPos )
            {
                nMinPos = nPos;
                SetCharSet( *pHt, TRUE );
            }

            if( pHt->GetEnd() )         // Attr mit Ende
            {
                nPos = *pHt->GetEnd();      // gibt letztes Attr-Zeichen + 1
                if( nPos >= nStartPos && nPos <= nMinPos )
                {
                    nMinPos = nPos;
                    SetCharSet( *pHt, FALSE );
                }
            }
            else
            {                                   // Attr ohne Ende
                nPos = *pHt->GetStart() + 1;    // Laenge 1 wegen CH_TXTATR im Text
                if( nPos >= nStartPos && nPos <= nMinPos )
                {
                    nMinPos = nPos;
                    SetCharSet( *pHt, FALSE );
                }
            }
        }
    }
    return nMinPos;
}

void WW8_SwAttrIter::SetCharSet( const SwTxtAttr& rAttr, BOOL bStart )
{
    void* p = 0;
    rtl_TextEncoding eChrSet;
    const SfxPoolItem& rItem = rAttr.GetAttr();
    switch( rItem.Which() )
    {
    case RES_CHRATR_FONT:
        p = (void*)&rAttr;
        eChrSet = ((SvxFontItem&)rItem).GetCharSet();
        break;

    case RES_TXTATR_CHARFMT:
        {
            const SfxPoolItem* pItem;
            if( ((SwFmtCharFmt&)rItem).GetCharFmt() && SFX_ITEM_SET ==
                ((SwFmtCharFmt&)rItem).GetCharFmt()->GetItemState(
                    RES_CHRATR_FONT, TRUE, &pItem ))
            {
                eChrSet = ((SvxFontItem*)pItem)->GetCharSet();
                p = (void*)&rAttr;
            }
        }
        break;

//  case RES_TXTATR_INETFMT:
//      break;
    }

    if( p )
    {
        USHORT nPos;
        if( bStart )
        {
            nPos = aChrSetArr.Count();
            aChrSetArr.Insert( eChrSet, nPos );
            aTxtAtrArr.Insert( p, nPos );
        }
        else if( USHRT_MAX != ( nPos = aTxtAtrArr.GetPos( p )) )
        {
            aTxtAtrArr.Remove( nPos );
            aChrSetArr.Remove( nPos );
        }
    }
}

void WW8_SwAttrIter::OutAttr( xub_StrLen nSwPos )
{
    if( rNd.GetpSwAttrSet() )
        rWrt.Out_SfxItemSet( *rNd.GetpSwAttrSet(), FALSE, TRUE );

    const SwpHints* pTxtAttrs = rNd.GetpSwpHints();
    if( pTxtAttrs )
    {
        const SwModify* pOldMod = rWrt.pOutFmtNode;
        rWrt.pOutFmtNode = &rNd;

        nTmpSwPos = nSwPos;
        register xub_StrLen i;
        for( i = 0; i < pTxtAttrs->Count(); i++ )
        {
            const SwTxtAttr* pHt = (*pTxtAttrs)[i];
            const xub_StrLen* pEnd = pHt->GetEnd();

            if( pEnd ? ( nSwPos >= *pHt->GetStart() && nSwPos < *pEnd )
                        : nSwPos == *pHt->GetStart() )
                Out( aWW8AttrFnTab, pHt->GetAttr(), rWrt );
            else if( nSwPos < *pHt->GetStart() )
                break;
        }

        nTmpSwPos = 0;      // HasTextItem nur in dem obigen Bereich erlaubt
        rWrt.pOutFmtNode = pOldMod;
    }

    OutRedlines( nSwPos );
}

BOOL WW8_SwAttrIter::IsTxtAttr( xub_StrLen nSwPos )
{
    // search for attrs without end position
    const SwpHints* pTxtAttrs = rNd.GetpSwpHints();
    if( pTxtAttrs )
    {
        register USHORT i;
        for( i = 0; i < pTxtAttrs->Count(); i++ )
        {
            const SwTxtAttr* pHt = (*pTxtAttrs)[i];
            if( !pHt->GetEnd() && *pHt->GetStart() == nSwPos )
                return TRUE;
        }
    }
    return FALSE;
}

// HasItem ist fuer die Zusammenfassung des Doppel-Attributes Underline
// und WordLineMode als TextItems. OutAttr() ruft die Ausgabefunktion,
// die dann ueber HasItem() nach anderen Items an der
// Attribut-Anfangposition fragen kann.
// Es koennen nur Attribute mit Ende abgefragt werden.
// Es wird mit bDeep gesucht
const SfxPoolItem* WW8_SwAttrIter::HasTextItem( USHORT nWhich ) const
{
    const SfxPoolItem* pRet = 0;
    const SwpHints* pTxtAttrs = rNd.GetpSwpHints();
    if( !nTmpSwPos && !pTxtAttrs )
    {
        ASSERT( !this, "HasTextItem nicht aus OutAttr gerufen !" );
    }
    else if( pTxtAttrs )
    {
        register USHORT i;
        for( i = 0; i < pTxtAttrs->Count(); ++i )
        {
            const SwTxtAttr* pHt = (*pTxtAttrs)[i];
            const SfxPoolItem* pItem = &pHt->GetAttr();
            const xub_StrLen* pAtrEnd = 0;
            if( 0 != ( pAtrEnd = pHt->GetEnd() ) &&     // nur Attr mit Ende
                nWhich == pItem->Which() &&             //
                nTmpSwPos >= *pHt->GetStart() && nTmpSwPos < *pAtrEnd )
            {
                pRet = pItem;       // gefunden
                break;
            }
            else if( nTmpSwPos < *pHt->GetStart() )
                break;              // dann kommt da nichts mehr
        }
    }
    return pRet;
}

void WW8_SwAttrIter::GetItems( WW8Bytes& rItems ) const
{
    WW8Bytes* pO_Sav = rWrt.pO;
    rWrt.pO = &rItems;

    if( rNd.GetpSwAttrSet() )
        rWrt.Out_SfxItemSet( *rNd.GetpSwAttrSet(), FALSE, TRUE );

    const SwpHints* pTxtAttrs = rNd.GetpSwpHints();
    if( pTxtAttrs )
    {
        const SwModify* pOldMod = rWrt.pOutFmtNode;
        rWrt.pOutFmtNode = &rNd;

        register USHORT i;
        for( i = 0; i < pTxtAttrs->Count(); i++ )
        {
            const SwTxtAttr* pHt = (*pTxtAttrs)[i];
            const xub_StrLen* pEnd = pHt->GetEnd();

            if( pEnd && nTmpSwPos >= *pHt->GetStart() && nTmpSwPos < *pEnd )
                Out( aWW8AttrFnTab, pHt->GetAttr(), rWrt );
            else if( nTmpSwPos < *pHt->GetStart() )
                break;
        }

        rWrt.pOutFmtNode = pOldMod;
    }

//  OutRedlines( nTmpSwPos );
    rWrt.pO = pO_Sav;
}

const SfxPoolItem& WW8_SwAttrIter::GetItem( USHORT nWhich ) const
{
    const SfxPoolItem* pRet = HasTextItem( nWhich );
    if( !pRet )
        pRet = &rNd.SwCntntNode::GetAttr( nWhich );
    return *pRet;
}

void WW8_SwAttrIter::OutSwFmtINetFmt( const SwFmtINetFmt& rINet, BOOL bStart )
{
    if( bStart )
    {
        INetURLObject aURL( rINet.GetValue() );
        String sURL( aURL.GetURLNoMark(INetURLObject::DECODE_WITH_CHARSET) );
        String sMark( aURL.GetMark(INetURLObject::DECODE_WITH_CHARSET) );

        sURL = INetURLObject::AbsToRel( sURL, INetURLObject::WAS_ENCODED,
                                        INetURLObject::DECODE_WITH_CHARSET );
        sURL.Insert( String::CreateFromAscii(
                        RTL_CONSTASCII_STRINGPARAM( "HYPERLINK \"" )), 0 );
        sURL += '\"';

        if( sMark.Len() )
            (( sURL.AppendAscii( RTL_CONSTASCII_STRINGPARAM( " \\l \"" )))
                    += sMark ) += '\"';

        if( rINet.GetTargetFrame().Len() )
            ( sURL.AppendAscii( RTL_CONSTASCII_STRINGPARAM( " \\n " )))
                    += rINet.GetTargetFrame();

        rWrt.OutField( 0, 88, sURL,
                    WRITEFIELD_START | WRITEFIELD_CMD_START );

        // write the refence to the "picture" structure
        ULONG nDataStt = rWrt.pDataStrm->Tell();
        rWrt.pChpPlc->AppendFkpEntry( rWrt.Strm().Tell() );

//I'm leaving this as a define for now for easy removal of this code
//C.
#define WRITE_HYPERLINK_IN_DATA_STREAM

#ifdef WRITE_HYPERLINK_IN_DATA_STREAM
//WinWord 2000 doesn't write this - so its a temp solution by W97
        rWrt.WriteChar( 0x01 );

        static BYTE aArr1[] = {
            0x03, 0x6a, 0,0,0,0,    // sprmCPicLocation

            0x06, 0x08, 0x01,       // sprmCFData
            0x55, 0x08, 0x01,       // sprmCFSpec
            0x02, 0x08, 0x01        // sprmCFFldVanish
        };
        BYTE* pDataAdr = aArr1 + 2;
        Set_UInt32( pDataAdr, nDataStt );

        rWrt.pChpPlc->AppendFkpEntry( rWrt.Strm().Tell(),
                                    sizeof( aArr1 ), aArr1 );
#endif

        rWrt.OutField( 0, 88, sURL, WRITEFIELD_CMD_END );


#ifdef WRITE_HYPERLINK_IN_DATA_STREAM
        // now write the picture structur
        sURL = aURL.GetURLNoMark();

        BOOL bAbsolute = TRUE;  //all links end up in the data stream as
                                //absolute references.
        INetProtocol aProto = aURL.GetProtocol();

        static BYTE __READONLY_DATA aURLData1[] = {
            0,0,0,0,        // len of struct
            0x44,0,         // the start of "next" data
            0,0,0,0,0,0,0,0,0,0,                // PIC-Structure!
            0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    //  |
            0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    //  |
            0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    //  |
            0,0,0,0,                            // /
        };
        static BYTE __READONLY_DATA MAGIC_A[] = {
            // start of "next" data
            0xD0,0xC9,0xEA,0x79,0xF9,0xBA,0xCE,0x11,
            0x8C,0x82,0x00,0xAA,0x00,0x4B,0xA9,0x0B
        };

        rWrt.pDataStrm->Write( aURLData1, sizeof(aURLData1) );
        BYTE nAnchor=0x00;
        if( sMark.Len() )
            nAnchor=0x08;
        rWrt.pDataStrm->Write( &nAnchor, 1 );
        rWrt.pDataStrm->Write( MAGIC_A, sizeof(MAGIC_A) );
        SwWW8Writer::WriteLong( *rWrt.pDataStrm, 0x00000002);
        UINT32 nFlag=0x01;
        if (bAbsolute) nFlag |= 0x02;
        if( sMark.Len() ) nFlag |= 0x08;
        SwWW8Writer::WriteLong( *rWrt.pDataStrm, nFlag );

        if (aProto == INET_PROT_FILE)
        {
// version 1 (for a document)

            static BYTE __READONLY_DATA MAGIC_C[] = {
                0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46,
                0x00, 0x00
            };

            static BYTE __READONLY_DATA MAGIC_D[] = {
                0xFF, 0xFF, 0xAD, 0xDE, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
            };

            sURL = aURL.PathToFileName();

            rWrt.pDataStrm->Write( MAGIC_C, sizeof(MAGIC_C) );
            SwWW8Writer::WriteLong( *rWrt.pDataStrm, sURL.Len()+1 );
            SwWW8Writer::WriteString8( *rWrt.pDataStrm, sURL, TRUE,
                                        RTL_TEXTENCODING_MS_1252 );
            rWrt.pDataStrm->Write( MAGIC_D, sizeof( MAGIC_D) );

            SwWW8Writer::WriteLong( *rWrt.pDataStrm, 2*sURL.Len()+6);
            SwWW8Writer::WriteLong( *rWrt.pDataStrm, 2*sURL.Len());
            SwWW8Writer::WriteShort( *rWrt.pDataStrm, 3 );
            SwWW8Writer::WriteString16( *rWrt.pDataStrm, sURL, FALSE );
        }
        else
        {
            // version 2 (simple url)
            // an write some data to the data stream, but dont ask
            // what the data mean, except for the URL.
            // The First piece is the WW8_PIC structure.
            //
            static BYTE __READONLY_DATA MAGIC_B[] = {
                0xE0,0xC9,0xEA,0x79,0xF9,0xBA,0xCE,0x11,
                0x8C,0x82,0x00,0xAA,0x00,0x4B,0xA9,0x0B
            };

            rWrt.pDataStrm->Write( MAGIC_B, sizeof(MAGIC_B) );
            SwWW8Writer::WriteLong( *rWrt.pDataStrm, 2 * (sURL.Len()+1) );
            SwWW8Writer::WriteString16( *rWrt.pDataStrm, sURL, TRUE );
        }

        if( sMark.Len() )
        {
            SwWW8Writer::WriteLong( *rWrt.pDataStrm, sMark.Len()+1 );
            SwWW8Writer::WriteString16( *rWrt.pDataStrm, sMark, TRUE );
        }
        SwWW8Writer::WriteLong( *rWrt.pDataStrm, nDataStt,
            rWrt.pDataStrm->Tell() - nDataStt );
#endif

    }
    else
        rWrt.OutField( 0, 0, aEmptyStr, WRITEFIELD_CLOSE );
}


void WW8_SwAttrIter::OutSwFmtRefMark( const SwFmtRefMark& rAttr, BOOL bStart )
{
    if( rWrt.HasRefToObject( REF_SETREFATTR, &rAttr.GetRefName(), 0 ))
        rWrt.AppendBookmark( rWrt.GetBookmarkName( REF_SETREFATTR,
                                            &rAttr.GetRefName(), 0 ));
}

void WW8_SwAttrIter::FieldVanish( const String& rTxt )
{
    WW8Bytes aItems;
    rWrt.pChpIter->GetItems( aItems );
    USHORT nStt_TxtAtt = aItems.Count();

    // sprmCFFldVanish
    if( rWrt.bWrtWW8 )
        SwWW8Writer::InsUInt16( aItems, 0x802 );
    else
        aItems.Insert( 67, aItems.Count() );
    aItems.Insert( 1, aItems.Count() );

    USHORT nStt_sprmCFSpec = aItems.Count();

    // sprmCFSpec --  fSpec-Attribut TRUE
    if( rWrt.bWrtWW8 )
        SwWW8Writer::InsUInt16( aItems, 0x855 );
    else
        aItems.Insert( 117, aItems.Count() );
    aItems.Insert( 1, aItems.Count() );


//  rWrt.pChpPlc->AppendFkpEntry( rWrt.Strm().Tell(), nStt_TxtAtt,
//                                  aItems.GetData() );
    rWrt.WriteChar( '\x13' );
    rWrt.pChpPlc->AppendFkpEntry( rWrt.Strm().Tell(), aItems.Count(),
                                    aItems.GetData() );
    rWrt.OutSwString( rTxt, 0, rTxt.Len(), rWrt.IsUnicode(),
                        RTL_TEXTENCODING_MS_1252 );
    rWrt.pChpPlc->AppendFkpEntry( rWrt.Strm().Tell(), nStt_sprmCFSpec,
                                    aItems.GetData() );
    rWrt.WriteChar( '\x15' );
    rWrt.pChpPlc->AppendFkpEntry( rWrt.Strm().Tell(), aItems.Count(),
                                    aItems.GetData() );
}

void WW8_SwAttrIter::OutSwTOXMark( const SwTOXMark& rAttr, BOOL bStart )
{
    // its a field; so get the Text form the Node and build the field
    ASSERT( !bStart, "calls only with the endposition!" );
    String sTxt;

    const SwTxtTOXMark& rTxtTOXMark = *rAttr.GetTxtTOXMark();
    const xub_StrLen* pTxtEnd = rTxtTOXMark.GetEnd();
    if( pTxtEnd )       // has range?
        sTxt = rNd.GetExpandTxt( *rTxtTOXMark.GetStart(),
                                 *pTxtEnd  - *rTxtTOXMark.GetStart() );
    else
        sTxt = rAttr.GetAlternativeText();

    switch( rAttr.GetTOXType()->GetType() )
    {
    case TOX_INDEX:
        if( rAttr.GetPrimaryKey().Len() )
        {
            sTxt.Insert( ':', 0 );
            sTxt.Insert( rAttr.GetPrimaryKey(), 0 );
        }
        sTxt.InsertAscii( " XE \"", 0 );
        sTxt.InsertAscii( "\" " );
        break;

    case TOX_USER:
        ( sTxt.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "\" \\f \"" )))
                += (sal_Char)( 'A' + rWrt.GetId( *rAttr.GetTOXType() ));
        // kein break;
    case TOX_CONTENT:
        {
            sTxt.InsertAscii( " INHALT \"", 0 );
            USHORT nLvl = rAttr.GetLevel();
            if( nLvl > nWW8MaxListLevel )
                nLvl = nWW8MaxListLevel;

            ((sTxt.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "\" \\l " )))
                += String::CreateFromInt32( nLvl )) += ' ';
        }
        break;
    }

    if( sTxt.Len() )
        FieldVanish( sTxt );
}

BOOL WW8_SwAttrIter::OutAttrWithRange( xub_StrLen nPos )
{
    BOOL bRet = FALSE;
    const SwpHints* pTxtAttrs = rNd.GetpSwpHints();
    if( pTxtAttrs )
    {
        nTmpSwPos = nPos;
        const xub_StrLen* pEnd;
        register USHORT i;
        for( i = 0; i < pTxtAttrs->Count(); ++i )
        {
            const SwTxtAttr* pHt = (*pTxtAttrs)[i];
            const SfxPoolItem* pItem = &pHt->GetAttr();
            switch( pItem->Which() )
            {
            case RES_TXTATR_INETFMT:
                if( rWrt.bWrtWW8 )  // nur WW8 kann Hyperlinks
                {
                    if( nPos == *pHt->GetStart() )
                    {
                        OutSwFmtINetFmt( (SwFmtINetFmt&)*pItem, TRUE );
                        bRet = TRUE;
                    }
                    else if( nPos == *pHt->GetEnd() )
                        OutSwFmtINetFmt( (SwFmtINetFmt&)*pItem, FALSE );
                }
                break;

            case RES_TXTATR_REFMARK:
                if( nPos == *pHt->GetStart() )
                    OutSwFmtRefMark( (SwFmtRefMark&)*pItem, TRUE );
                if( 0 != ( pEnd = pHt->GetEnd() ) && nPos == *pEnd )
                    OutSwFmtRefMark( (SwFmtRefMark&)*pItem, FALSE );
                break;

            case RES_TXTATR_TOXMARK:
                if( 0 != ( pEnd = pHt->GetEnd() ) ? nPos == *pEnd
                                                  : nPos == *pHt->GetStart())
                    OutSwTOXMark( (SwTOXMark&)*pItem, FALSE );
                break;
            }
        }
        nTmpSwPos = 0;      // HasTextItem nur in dem obigen Bereich erlaubt
    }
    return bRet;
}

BOOL WW8_SwAttrIter::IsRedlineAtEnd( xub_StrLen nEnd ) const
{
    BOOL bRet = FALSE;
    // search next Redline
    for( USHORT nPos = nCurRedlinePos;
        nPos < rWrt.pDoc->GetRedlineTbl().Count(); ++nPos )
    {
        const SwPosition* pEnd = rWrt.pDoc->GetRedlineTbl()[ nPos ]->End();
        if( pEnd->nNode == rNd )
        {
            if( pEnd->nContent.GetIndex() == nEnd )
            {
                bRet = TRUE;
                break;
            }
        }
        else
            break;
    }
    return bRet;
}

void WW8_SwAttrIter::OutRedlines( xub_StrLen nPos )
{
    if( pCurRedline )
    {
        const SwPosition* pEnd = pCurRedline->End();
        if( pEnd->nNode == rNd &&
            pEnd->nContent.GetIndex() <= nPos )
        {
            pCurRedline = 0;
            ++nCurRedlinePos;
        }
        else
            // write data of current redline
            rWrt.OutRedline( pCurRedline->GetRedlineData() );
    }

    if( !pCurRedline )
    {
        // search next Redline
        for( ; nCurRedlinePos < rWrt.pDoc->GetRedlineTbl().Count();
                ++nCurRedlinePos )
        {
            const SwRedline* pRedl = rWrt.pDoc->GetRedlineTbl()[ nCurRedlinePos ];

            const SwPosition* pStt = pRedl->Start();
            const SwPosition* pEnd = pStt == pRedl->GetPoint()
                                        ? pRedl->GetMark()
                                        : pRedl->GetPoint();

            if( pStt->nNode == rNd )
            {
                if( pStt->nContent.GetIndex() >= nPos )
                {
                    if( pStt->nContent.GetIndex() == nPos )
                    {
                        // write data of this redline
                        pCurRedline = pRedl;
                        rWrt.OutRedline( pCurRedline->GetRedlineData() );
                    }
                    break;
                }
            }
            else
                break;

            if( pEnd->nNode == rNd &&
                pEnd->nContent.GetIndex() < nPos )
            {
                pCurRedline = pRedl;
                break;
            }
        }
    }
}

/*  */

Writer& OutWW8_SwTxtNode( Writer& rWrt, SwCntntNode& rNode )
{
    SwWW8Writer& rWW8Wrt = (SwWW8Writer&)rWrt;
    SwTxtNode* pNd = &((SwTxtNode&)rNode);

    BOOL bFlyInTable = rWW8Wrt.pFlyFmt && rWW8Wrt.bIsInTable;

    // akt. Style
    if( !bFlyInTable )
        rWW8Wrt.nStyleBeforeFly
            = rWW8Wrt.GetId( (SwTxtFmtColl&)pNd->GetAnyFmtColl() );

    SVBT16 nSty;
    ShortToSVBT16( rWW8Wrt.nStyleBeforeFly, nSty );

    WW8Bytes* pO = rWW8Wrt.pO;

    if( rWW8Wrt.bStartTOX )
    {
        // ignore TOX header section
        const SwSectionNode* pSectNd = rNode.FindSectionNode();
        if( TOX_CONTENT_SECTION == pSectNd->GetSection().GetType() )
            rWW8Wrt.StartTOX( pSectNd->GetSection() );
    }

    const SwSection* pTOXSect = 0;
    if( rWW8Wrt.bInWriteTOX )
    {
        // check for end of TOX
        SwNodeIndex aIdx( *pNd, 1 );
        if( !aIdx.GetNode().IsTxtNode() )
        {
            const SwSectionNode* pTOXSectNd = rNode.FindSectionNode();
            pTOXSect = &pTOXSectNd->GetSection();

            const SwNode* pNxt = rNode.GetNodes().GoNext( &aIdx );
            if( pNxt && pNxt->FindSectionNode() == pTOXSectNd )
                pTOXSect = 0;
        }
    }

    WW8_SwAttrIter aAttrIter( rWW8Wrt, *pNd );
    rtl_TextEncoding eChrSet = aAttrIter.GetNodeCharSet();

    ASSERT( !pO->Count(), " pO ist am Zeilenanfang nicht leer" );

    String aStr( pNd->GetTxt() );

    // 0x0a     ( Hard Line Break ) -> 0x0b
    // 0xad     ( soft hyphen )     -> 0x1f
    // 0x2011   ( hard hyphen )     -> 0x1e
    if( aStr.Len() )
    {
        aStr.SearchAndReplaceAll( 0x0A, 0x0B );
        aStr.SearchAndReplaceAll( CHAR_HARDHYPHEN, 0x1e );
        aStr.SearchAndReplaceAll( CHAR_SOFTHYPHEN, 0x1f );
    }
    xub_StrLen nAktPos = 0;
    xub_StrLen nEnd = aStr.Len();
    BOOL bUnicode = TRUE, bRedlineAtEnd = FALSE;
    do {
/*
        if( !bUseAlwaysUnicode )
        {
            switch( eChrSet )
            {
//          case CHARSET_DONTKNOW:       ????
            case CHARSET_SYMBOL:
//          case CHARSET_WIN_SYMBOL:
//          case CHARSET_WIN_WINGDINGS:
//          case CHARSET_MAC_DINGBATS:
//          case CHARSET_MAC_SYMBOL:
//          case CHARSET_ADOBE_SYMBOL:
//          case CHARSET_ADOBE_DINGBATS:
//          case CHARSET_STAR_STARBATS:
//          case CHARSET_STAR_STARMATH:
                bUnicode = rWW8Wrt.bWrtWW8 ? TRUE : FALSE;
                break;
            default:
                bUnicode = FALSE;
                break;
            }
        }
*/
        xub_StrLen nNextAttr = aAttrIter.WhereNext();
        rtl_TextEncoding eNextChrSet = aAttrIter.GetNextCharSet();

        if( nNextAttr > nEnd )
            nNextAttr = nEnd;

        rWW8Wrt.AppendBookmarks( *pNd, nAktPos, nNextAttr - nAktPos );
        BOOL bTxtAtr = aAttrIter.IsTxtAttr( nAktPos );
        BOOL bAttrWithRange = aAttrIter.OutAttrWithRange( nAktPos );

        if( !bTxtAtr )
            rWW8Wrt.OutSwString( aStr, nAktPos, nNextAttr - nAktPos,
                                    bUnicode, eChrSet );

                    // Am Zeilenende werden die Attribute bis ueber das CR
                    // aufgezogen. Ausnahme: Fussnoten am Zeilenende
        if( nNextAttr == nEnd )
        {
            if( !bTxtAtr && !bAttrWithRange )
            {
                if( aAttrIter.IsRedlineAtEnd( nEnd ))
                    bRedlineAtEnd = TRUE;
                else
                {
                    if( pTOXSect )
                        rWW8Wrt.EndTOX( *pTOXSect );
                    rWW8Wrt.WriteCR();              // CR danach
                }
            }
        }
                                        // Ausgabe der Zeichenattribute
        aAttrIter.OutAttr( nAktPos );   // nAktPos - 1 ??
        rWW8Wrt.pChpPlc->AppendFkpEntry( rWrt.Strm().Tell(),
                                            pO->Count(), pO->GetData() );
        pO->Remove( 0, pO->Count() );                   // leeren

                    // Ausnahme: Fussnoten am Zeilenende
        if( nNextAttr == nEnd )
        {
            aAttrIter.OutAttrWithRange( nEnd );
            if( pO->Count() )
            {
                rWW8Wrt.pChpPlc->AppendFkpEntry( rWrt.Strm().Tell(),
                                            pO->Count(), pO->GetData() );
                pO->Remove( 0, pO->Count() );                   // leeren
            }

            if( bTxtAtr || bAttrWithRange || bRedlineAtEnd )
            {
                if( pTOXSect )
                    rWW8Wrt.EndTOX( *pTOXSect );

                rWW8Wrt.WriteCR();              // CR danach

                if( bRedlineAtEnd )
                {
                    aAttrIter.OutRedlines( nEnd );
                    if( pO->Count() )
                    {
                        rWW8Wrt.pChpPlc->AppendFkpEntry( rWrt.Strm().Tell(),
                                                    pO->Count(), pO->GetData() );
                        pO->Remove( 0, pO->Count() );                   // leeren
                    }
                }
            }
        }
        nAktPos = nNextAttr;
        eChrSet = eNextChrSet;
        aAttrIter.NextPos();
    }
    while( nAktPos < nEnd );

    ASSERT( !pO->Count(), " pO ist am ZeilenEnde nicht leer" );

//  // gibt es harte Absatz-Attributierung oder Fly- oder Table-Attrs ?
//  if( pNd->GetpSwAttrSet() || rWW8Wrt.pFlyFmt || rWW8Wrt.bOutTable ){
        pO->Insert( (BYTE*)&nSty, 2, pO->Count() );     // Style #

        if( rWW8Wrt.pFlyFmt && !rWW8Wrt.bIsInTable )    // Fly-Attrs
            rWW8Wrt.Out_SwFmt( *rWW8Wrt.pFlyFmt, FALSE, FALSE, TRUE );

        if( rWW8Wrt.bOutTable )
        {                                               // Tab-Attr
            // sprmPFInTable
            if( rWW8Wrt.bWrtWW8 )
                SwWW8Writer::InsUInt16( *pO, 0x2416 );
            else
                pO->Insert( 24, pO->Count() );
            pO->Insert( 1, pO->Count() );
        }

        if( !bFlyInTable )
        {
            SfxItemSet* pTmpSet = 0;
            const BYTE nPrvNxtNd =
                ( WWFL_ULSPACE_LIKE_SWG & rWW8Wrt.GetIniFlags())
                        ? (ND_HAS_PREV_LAYNODE|ND_HAS_NEXT_LAYNODE)
                        : pNd->HasPrevNextLayNode();

            if( (ND_HAS_PREV_LAYNODE|ND_HAS_NEXT_LAYNODE ) != nPrvNxtNd )
            {
                const SfxPoolItem* pItem;
                if( SFX_ITEM_SET == pNd->GetSwAttrSet().GetItemState(
                        RES_UL_SPACE, TRUE, &pItem ) &&
                    ( ( !( ND_HAS_PREV_LAYNODE & nPrvNxtNd ) &&
                       ((SvxULSpaceItem*)pItem)->GetUpper()) ||
                      ( !( ND_HAS_NEXT_LAYNODE & nPrvNxtNd ) &&
                       ((SvxULSpaceItem*)pItem)->GetLower()) ))
                {
                    pTmpSet = new SfxItemSet( pNd->GetSwAttrSet() );
                    SvxULSpaceItem aUL( *(SvxULSpaceItem*)pItem );
                    if( !(ND_HAS_PREV_LAYNODE & nPrvNxtNd ))
                        aUL.SetUpper( 0 );
                    if( !(ND_HAS_NEXT_LAYNODE & nPrvNxtNd ))
                        aUL.SetLower( 0 );
                    pTmpSet->Put( aUL );
                }
            }

            if( !pTmpSet )
                pTmpSet = pNd->GetpSwAttrSet();

            const SwNumRule* pRule;
            const SwNodeNum* pNum;
            if( (( 0 != ( pNum = pNd->GetNum() ) &&
                    0 != ( pRule = pNd->GetNumRule() )) ||
                    ( 0 != ( pNum = pNd->GetOutlineNum() ) &&
                    0 != ( pRule = rWrt.pDoc->GetOutlineNumRule() ) ) ) &&
                    pNum->GetLevel() < NO_NUM )
            {
                BYTE nLvl = GetRealLevel( pNum->GetLevel() );
                const SwNumFmt* pFmt = pRule->GetNumFmt( nLvl );
                if( !pFmt )
                    pFmt = &pRule->Get( nLvl );

                if( pTmpSet == pNd->GetpSwAttrSet() )
                    pTmpSet = new SfxItemSet( pNd->GetSwAttrSet() );

                SvxLRSpaceItem aLR( (SvxLRSpaceItem&)pTmpSet->Get( RES_LR_SPACE ) );
                aLR.SetTxtLeft( aLR.GetTxtLeft() + pFmt->GetAbsLSpace() );

                if( MAXLEVEL > pNum->GetLevel() )
                {
                    aLR.SetTxtFirstLineOfst( pFmt->GetFirstLineOffset() );
                    if( pNum == pNd->GetNum() && SFX_ITEM_SET !=
                        pTmpSet->GetItemState( RES_PARATR_NUMRULE ) )
                    {
                        // NumRule from a template - then put it into the itemset
                        pTmpSet->Put( SwNumRuleItem( pRule->GetName() ));
                    }
                }
                else
                    pTmpSet->ClearItem( RES_PARATR_NUMRULE );

                pTmpSet->Put( aLR );
                SwWW8Writer::CorrTabStopInSet( *pTmpSet, pFmt->GetAbsLSpace() );
            }

            if( pTmpSet )
            {                                               // Para-Attrs
                rWW8Wrt.pStyAttr = &pNd->GetAnyFmtColl().GetAttrSet();

                const SwModify* pOldMod = rWW8Wrt.pOutFmtNode;
                rWW8Wrt.pOutFmtNode = pNd;

                rWW8Wrt.Out_SfxItemSet( *pTmpSet, TRUE, FALSE );        // Pap-Attrs

                rWW8Wrt.pStyAttr = 0;
                rWW8Wrt.pOutFmtNode = pOldMod;

                if( pTmpSet != pNd->GetpSwAttrSet() )
                    delete pTmpSet;
            }
        }
        rWW8Wrt.pPapPlc->AppendFkpEntry( rWrt.Strm().Tell(),
                                        pO->Count(), pO->GetData() );
        pO->Remove( 0, pO->Count() );                       // leeren
//  }else{
//      rWW8Wrt.pPapPlc->AppendFkpEntry( rWrt.Strm().Tell(), sizeof( nSty ), nSty );
//  }
    return rWrt;
}


/*  */

//---------------------------------------------------------------------------
//       Tabellen
//---------------------------------------------------------------------------

Writer& OutWW8_SwTblNode( Writer& rWrt, SwTableNode & rNode )
{
    SwWW8Writer & rWW8Wrt = (SwWW8Writer&)rWrt;
    SwTable& rTbl = rNode.GetTable();
    rWW8Wrt.Out_SfxBreakItems( rTbl.GetFrmFmt()->GetAttrSet(), rNode );

    SwTableLines& rLns = rTbl.GetTabLines();
    SwTwips nPageSize = 0, nTblOffset = 0;

    {
        Point aPt;
        SwRect aRect( rTbl.GetFrmFmt()->FindLayoutRect( FALSE, &aPt ));
        if( aRect.IsEmpty() )
        {
            // dann besorge mal die Seitenbreite ohne Raender !!
            const SwFrmFmt* pFmt = rWW8Wrt.pFlyFmt ? rWW8Wrt.pFlyFmt :
                rWrt.pDoc->GetPageDesc(0).GetPageFmtOfNode( rNode, FALSE );

            aRect = pFmt->FindLayoutRect( TRUE );
            if( 0 == ( nPageSize = aRect.Width() ))
            {
                const SvxLRSpaceItem& rLR = pFmt->GetLRSpace();
                nPageSize = pFmt->GetFrmSize().GetWidth() -
                                rLR.GetLeft() - rLR.GetRight();
            }
        }
        else
            nPageSize = aRect.Width();
    }

    SwTwips nTblSz = rTbl.GetFrmFmt()->GetFrmSize().GetWidth();
    WW8Bytes aAt( 128, 128 );   // Attribute fuer's Tabellen-Zeilenende

    static BYTE __READONLY_DATA aNullBytes[] = { 0, 0, 0, 0 };

    // sprmPDxaFromText10
    if( rWW8Wrt.bWrtWW8 )
    {
        static BYTE __READONLY_DATA  aTabLineAttr[] = {
                0, 0,               // Sty # 0
                0x16, 0x24, 1,      // sprmPFInTable
                0x17, 0x24, 1 };    // sprmPFTtp
        aAt.Insert( aTabLineAttr, sizeof( aTabLineAttr ), aAt.Count() );
    }
    else
    {
        static BYTE __READONLY_DATA  aTabLineAttr[] = {
                0, 0,               // Sty # 0
                24, 1,              // sprmPFInTable
                25, 1 };            // sprmPFTtp
        aAt.Insert( aTabLineAttr, sizeof( aTabLineAttr ), aAt.Count() );
    }

    SwHoriOrient eHOri = rTbl.GetFrmFmt()->GetHoriOrient().GetHoriOrient();
    switch( eHOri )
    {
    case HORI_CENTER:
    case HORI_RIGHT:
        if( rWW8Wrt.bWrtWW8 )
            SwWW8Writer::InsUInt16( aAt, 0x5400 );
        else
            aAt.Insert( 182, aAt.Count() );
        SwWW8Writer::InsUInt16( aAt, (HORI_RIGHT == eHOri ? 2 : 1 ));
        break;

    case HORI_NONE:
    case HORI_LEFT_AND_WIDTH:
        {
            const SvxLRSpaceItem& rLRSp = rTbl.GetFrmFmt()->GetLRSpace();
            nTblOffset = rLRSp.GetLeft();
            nPageSize -= nTblOffset + rLRSp.GetRight();
        }
        break;
//  case FLY_HORI_FULL:
    }

    BOOL bRelBoxSize = TRUE /*ALWAYS relativ (nPageSize + ( nPageSize / 10 )) < nTblSz*/;
    USHORT nStdAtLen = aAt.Count();

    SwWriteTable* pTableWrt;
    const SwHTMLTableLayout *pLayout = rTbl.GetHTMLTableLayout();
    if( pLayout && pLayout->IsExportable() )
        pTableWrt = new SwWriteTable( pLayout );
    else
        pTableWrt = new SwWriteTable( rTbl.GetTabLines(), (USHORT)nPageSize,
                                          (USHORT)nTblSz, FALSE );

    // WW6 / 8 can not have more then 31 / 64 cells
    const USHORT nMaxCols = rWW8Wrt.bWrtWW8 ? 64 : 31;
    // rCols are the array of all cols of the table
    const SwWriteTableCols& rCols = pTableWrt->GetCols();
    USHORT nColCnt = rCols.Count();
    SwWriteTableCellPtr* pBoxArr = new SwWriteTableCellPtr[ nColCnt ];
    USHORT* pRowSpans = new USHORT[ nColCnt ];
    memset( pBoxArr, 0, sizeof( pBoxArr[0] ) * nColCnt );
    memset( pRowSpans, 0, sizeof( pRowSpans[0] ) * nColCnt );
    long nLastHeight = 0;
    const SwWriteTableRows& rRows = pTableWrt->GetRows();
    for( USHORT nLine = 0; nLine < rRows.Count(); ++nLine )
    {
        USHORT nBox, nRealBox;

        const SwWriteTableRow *pRow = rRows[ nLine ];
        const SwWriteTableCells& rCells = pRow->GetCells();

        BOOL bFixRowHeight = FALSE;
        USHORT nRealColCnt = 0;
        for( nColCnt = 0, nBox = 0; nBox < rCells.Count(); ++nColCnt )
        {
            if( !pRowSpans[ nColCnt ] )
            {
                // set new BoxPtr
                SwWriteTableCell* pCell = rCells[ nBox++ ];
                pBoxArr[ nColCnt ] = pCell;
                pRowSpans[ nColCnt ] = pCell->GetRowSpan();
                for( USHORT nCellSpan = pCell->GetColSpan(), nCS = 1;
                        nCS < nCellSpan; ++nCS, ++nColCnt )
                {
                    pBoxArr[ nColCnt+1 ] = pBoxArr[ nColCnt ];
                    pRowSpans[ nColCnt+1 ] = pRowSpans[ nColCnt ];
                }
                ++nRealColCnt;
            }
            else if( !nColCnt || pBoxArr[ nColCnt-1 ] != pBoxArr[ nColCnt ] )
                ++nRealColCnt;

            if( 1 != pRowSpans[ nColCnt ] )
                bFixRowHeight = TRUE;
        }

        for( ; nColCnt < rCols.Count() && pRowSpans[ nColCnt ]; ++nColCnt )
        {
            if( !nColCnt || pBoxArr[ nColCnt-1 ] != pBoxArr[ nColCnt ] )
                ++nRealColCnt;
            bFixRowHeight = TRUE;
        }

        USHORT nWWColMax = nRealColCnt > nMaxCols ? nMaxCols : nRealColCnt;

        // 1.Zeile eine Headline?  sprmTTableHeader
        if( !nLine && rTbl.IsHeadlineRepeat() )
        {
            if( rWW8Wrt.bWrtWW8 )
                SwWW8Writer::InsUInt16( aAt, 0x3404 );
            else
                aAt.Insert( 186, aAt.Count() );
            aAt.Insert( 1, aAt.Count() );
        }

        // Zeilenhoehe ausgeben   sprmTDyaRowHeight
        long nHeight = 0;
        if( bFixRowHeight )
        {
            nHeight = -pRow->GetPos();      //neg. => abs. height!
            if( nLine )
                nHeight += rRows[ nLine - 1 ]->GetPos();
        }
        else
        {
            const SwTableLine* pLine = pBoxArr[ 0 ]->GetBox()->GetUpper();
            const SwFmtFrmSize& rLSz = pLine->GetFrmFmt()->GetFrmSize();
            if( ATT_VAR_SIZE != rLSz.GetSizeType() && rLSz.GetHeight() )
                nHeight = ATT_MIN_SIZE == rLSz.GetSizeType()
                                                ? rLSz.GetHeight()
                                                : -rLSz.GetHeight();
        }
        if( nHeight )
        {
            if( rWW8Wrt.bWrtWW8 )
                SwWW8Writer::InsUInt16( aAt, 0x9407 );
            else
                aAt.Insert( 189, aAt.Count() );
            SwWW8Writer::InsUInt16( aAt, (USHORT)nHeight );
        }

        // sprmTFCantSplit - unsere Tabellen duerfen nie in der Zeile
        // gesplittet werden.
        if( rWW8Wrt.bWrtWW8 )
            SwWW8Writer::InsUInt16( aAt, 0x3403 );
        else
            aAt.Insert( 185, aAt.Count() );
        aAt.Insert( (BYTE)0, aAt.Count() );

        // Inhalt der Boxen ausgeben
        for( nBox = 0, nRealBox = 0; nBox < nColCnt; ++nBox )
        {
            if( nBox && pBoxArr[ nBox-1 ] == pBoxArr[ nBox ] )
                continue;

            if( pBoxArr[ nBox ]->GetRowSpan() == pRowSpans[ nBox ] )
            {
                // new Box
                const SwStartNode* pSttNd = pBoxArr[ nBox ]->GetBox()->GetSttNd();
                WW8SaveData aSaveData( rWW8Wrt, pSttNd->GetIndex()+1,
                                        pSttNd->EndOfSectionIndex() );
                rWW8Wrt.bOutTable = TRUE;
                rWW8Wrt.bIsInTable= TRUE;
                rWW8Wrt.WriteText();
            }
            else
            {
                rWW8Wrt.bOutTable = TRUE;
                rWW8Wrt.WriteStringAsPara( aEmptyStr );
                rWW8Wrt.bOutTable = FALSE;
            }

            if( nWWColMax < nRealColCnt )
            {
                if( nRealBox+1 < nWWColMax || nRealBox+1 == nRealColCnt )
                    rWW8Wrt.ReplaceCr( (char)0x07 );    // SpaltenEnde
            }
            else if( nRealBox < nWWColMax )
                rWW8Wrt.ReplaceCr( (char)0x07 );    // SpaltenEnde
            ++nRealBox;
        }

        // das wars mit der Line
        rWW8Wrt.WriteChar( (char)0x7 ); // TabellenZeilen-Ende

        if( rWW8Wrt.bWrtWW8 )
        {
            // SprmTDefTable
            // 0+1 - OpCode, 2+3 - Laenge = Cells * (sizeof TC + uint16)
            // 4 - Cells (max 32!)
            SwWW8Writer::InsUInt16( aAt, 0xD608 );
            SwWW8Writer::InsUInt16( aAt, 2 + ( nWWColMax + 1 ) * 2 +
                                                ( nWWColMax * 20 ));
            aAt.Insert( nWWColMax, aAt.Count() );               //
        }
        else
        {
            // SprmTDefTable
            // 0 - OpCode, 1,2 - Laenge = Cells * (sizeof TC + uint16)
            // 3 - Cells (max 32!)
            aAt.Insert( 190, aAt.Count() );
            SwWW8Writer::InsUInt16( aAt, nWWColMax * 12 + 4 );  // Sprm-Laenge
            aAt.Insert( nWWColMax, aAt.Count() );               //
        }

        SwTwips nSz = 0, nCalc;
        SwWW8Writer::InsUInt16( aAt, (USHORT)nTblOffset );

        for( nBox = 0, nRealBox = 0; nRealBox < nWWColMax; ++nBox )
        {
            if( nBox && pBoxArr[ nBox-1 ] == pBoxArr[ nBox ] )
                continue;

            const SwFrmFmt* pBoxFmt = pBoxArr[ nBox ]->GetBox()->GetFrmFmt();
            const SwFmtFrmSize& rLSz = pBoxFmt->GetFrmSize();
            nSz += rLSz.GetWidth();
            nCalc = nSz;
            if( bRelBoxSize )
            {
                nCalc *= nPageSize;
                nCalc /= nTblSz;
            }
            SwWW8Writer::InsUInt16( aAt, (USHORT)(nTblOffset + nCalc ));
            ++nRealBox;
        }

        for( nBox = 0, nRealBox = 0; nRealBox < nWWColMax; nBox++ )
        {
            if( nBox && pBoxArr[ nBox-1 ] == pBoxArr[ nBox ] )
                continue;
            // rgf, erstmal alles 0 - WW8: 4, sonst 2 Byte
            // write vertikal alignment
            const SwFrmFmt& rFmt = *pBoxArr[ nBox ]->GetBox()->GetFrmFmt();
            if( rWW8Wrt.bWrtWW8 )
            {
                USHORT nFlags = pBoxArr[ nBox ]->GetRowSpan();
                if( 1 < nFlags )
                {
                    if( nFlags == pRowSpans[ nBox ] )
                        nFlags = 0x60;                  // start a new vert. merge
                    else
                        nFlags = 0x20;                  // continue a vert. merge
                }
                else
                    nFlags = 0;                     // no vert. merge

                switch( rFmt.GetVertOrient().GetVertOrient() )
                {
                case VERT_CENTER:   nFlags |= 0x080;    break;
                case VERT_BOTTOM:   nFlags |= 0x100;    break;
                }
                SwWW8Writer::InsUInt16( aAt, nFlags );
            }
            ++nRealBox;
            aAt.Insert( aNullBytes, 2, aAt.Count() );   // dummy
            rWW8Wrt.Out_SwFmtTableBox( aAt, rFmt.GetBox() ); // 8/16 Byte
        }

        // Background
        USHORT nBackg;
        if( pRow->GetBackground() )
            // over all boxes!
            nBackg = nWWColMax;
        else
        {
            nBackg = 0;
            for( nBox = 0, nRealBox = 0; nRealBox < nWWColMax; ++nBox )
            {
                if( nBox && pBoxArr[ nBox-1 ] == pBoxArr[ nBox ] )
                    continue;

                SwWriteTableCell* pCell = pBoxArr[ nBox ];
                if( pCell->GetBackground() ||
                    SFX_ITEM_ON == pCell->GetBox()->GetFrmFmt()->
                    GetItemState( RES_BACKGROUND, FALSE ) )
                    nBackg = nRealBox + 1;
                ++nRealBox;
            }
        }

        if( nBackg )
        {
            // TableShade, 0(+1) - OpCode, 1(2) - Count * sizeof( SHD ),
            // 2..(3..) - SHD
            if( rWW8Wrt.bWrtWW8 )
                SwWW8Writer::InsUInt16( aAt, 0xD609 );
            else
                aAt.Insert( (BYTE)191, aAt.Count() );
            aAt.Insert( (BYTE)(nBackg * 2), aAt.Count() );  // Len

            const SfxPoolItem* pI;
            for( nBox = 0, nRealBox = 0; nRealBox < nBackg; ++nBox )
            {
                if( nBox && pBoxArr[ nBox-1 ] == pBoxArr[ nBox ] )
                    continue;

                USHORT nValue;
                SwWriteTableCell* pCell = pBoxArr[ nBox ];
                if( SFX_ITEM_ON == pCell->GetBox()->GetFrmFmt()->
                    GetAttrSet().GetItemState( RES_BACKGROUND, FALSE, &pI )
                    || 0 != ( pI = pCell->GetBackground() )
                    || 0 != ( pI = pRow->GetBackground() ) )
                {
                    WW8_SHD aShd;
                    rWW8Wrt.TransBrush( ((const SvxBrushItem*)pI)->
                                        GetColor(), aShd );
                    nValue = aShd.GetValue();
                }
                else
                    nValue = 0;
                SwWW8Writer::InsUInt16( aAt, nValue );
                ++nRealBox;
            }
        }

        rWW8Wrt.pPapPlc->AppendFkpEntry( rWrt.Strm().Tell(),
                                   aAt.Count(), aAt.GetData() );
        if( aAt.Count() > nStdAtLen )
            aAt.Remove( nStdAtLen, aAt.Count() - nStdAtLen );

        for( nBox = 0; nBox < nColCnt; ++nBox )
            --pRowSpans[ nBox ];
    }

    delete pTableWrt;
    delete pBoxArr;
    delete pRowSpans;

    // Pam hinter die Tabelle verschieben
    rWW8Wrt.pCurPam->GetPoint()->nNode = *rNode.EndOfSectionNode();

    return rWrt;
}


/*  */

Writer& OutWW8_SwSectionNode( Writer& rWrt, SwSectionNode& rSectionNode )
{
    SwWW8Writer& rWW8Wrt = (SwWW8Writer&)rWrt;
    const SwSection& rSection = rSectionNode.GetSection();

    SwNodeIndex aIdx( rSectionNode, 1 );
    const SwNode& rNd = aIdx.GetNode();
    if( !rNd.IsSectionNode()  )
    {
        // Bug 74245 - if the first Node inside the section has an own
        //              PageDesc or PageBreak attribut, then dont write
        //              here the section break
        ULONG nRstLnNum = 0;
        const SfxItemSet* pSet;
        if( rNd.IsTableNode() )
            pSet = &rNd.GetTableNode()->GetTable().GetFrmFmt()->GetAttrSet();
        else if( rNd.IsCntntNode() )
        {
            pSet = &rNd.GetCntntNode()->GetSwAttrSet();
            nRstLnNum = ((SwFmtLineNumber&)pSet->Get(
                            RES_LINENUMBER )).GetStartValue();
        }
        else
            pSet = 0;

        const SfxPoolItem* pI;
        if( pSet && (
            ( SFX_ITEM_ON != pSet->GetItemState( RES_PAGEDESC, TRUE, &pI )
                || 0 == ((SwFmtPageDesc*)pI)->GetPageDesc() ) ||
            ( SFX_ITEM_ON != pSet->GetItemState( RES_BREAK, TRUE, &pI )
                || SVX_BREAK_NONE == ((SvxFmtBreakItem*)pI)->GetBreak() )))
            pSet = 0;

        if( !pSet )
        {
            // new Section with no own PageDesc/-Break
            //  -> write follow section break;
            const SwSectionFmt& rFmt = *rSection.GetFmt();
            rWW8Wrt.ReplaceCr( (char)0xc ); // Indikator fuer Page/Section-Break

            rWW8Wrt.pSepx->AppendSep( rWW8Wrt.Fc2Cp( rWrt.Strm().Tell() ),
                                        rWW8Wrt.pAktPageDesc,
                                        &rFmt, nRstLnNum );
        }
    }
    if( TOX_CONTENT_SECTION == rSection.GetType() )
        rWW8Wrt.bStartTOX = TRUE;
    return rWrt;
}

/*  */

//---------------------------------------------------------------------------
//       Flys
//---------------------------------------------------------------------------

void SwWW8Writer::OutWW8FlyFrmsInCntnt( const SwTxtNode& rNd )
{
    const SwpHints* pTxtAttrs = rNd.GetpSwpHints();
    if( pTxtAttrs )
    {
        for( USHORT n=0; n < pTxtAttrs->Count(); ++n )
        {
            const SwTxtAttr* pAttr = (*pTxtAttrs)[ n ];
            if( RES_TXTATR_FLYCNT == pAttr->Which() )
            {
                // zeichengebundenes Attribut
                const SwFmtFlyCnt& rFlyCntnt = pAttr->GetFlyCnt();
                const SwFlyFrmFmt& rFlyFrmFmt = *(SwFlyFrmFmt*)rFlyCntnt.GetFrmFmt();
                const SwNodeIndex* pNodeIndex = rFlyFrmFmt.GetCntnt().GetCntntIdx();

                if( pNodeIndex )
                {
                    ULONG nStt = pNodeIndex->GetIndex()+1,
                          nEnd = pNodeIndex->GetNode().EndOfSectionIndex();

                    if( (nStt < nEnd) && !pDoc->GetNodes()[ nStt ]->IsNoTxtNode() )
                    {
                        Point aOffset;
                        // Rechtecke des Flys und des Absatzes besorgen
                        SwRect aParentRect( rNd.FindLayoutRect( FALSE, &aOffset ) ),
                               aFlyRect( rFlyFrmFmt.FindLayoutRect( FALSE, &aOffset ) );

                        aOffset = aFlyRect.Pos() - aParentRect.Pos();

                        // PaM umsetzen: auf Inhalt des Fly-Frameformats
                        WW8SaveData aSaveData( *this, nStt, nEnd );

                        // wird in Out_SwFmt() ausgewertet
                        pFlyOffset = &aOffset;
                        pFlyFmt = (SwFlyFrmFmt*)&rFlyFrmFmt;
                        // Ok, rausschreiben:
                        WriteText();
                    }
                }
            }
        }
    }
}


void SwWW8Writer::OutWW8FlyFrm( const SwFrmFmt& rFrmFmt,
                                const Point& rNdTopLeft )
{
    if( !bWrtWW8 )
    {
        if( RES_DRAWFRMFMT == rFrmFmt.Which() )
        {
            ASSERT( !this, "OutWW8FlyFrm: DrawInCnt-Baustelle " );
            return ;
        }

        BOOL bDone = FALSE;

        // Hole vom Node und vom letzten Node die Position in der Section
        /*
        const SwFmtCntnt& rFlyCntnt = rFrmFmt.GetCntnt();

        ULONG nStt = rFlyCntnt.GetCntntIdx()->GetIndex()+1;
        ULONG nEnd = pDoc->GetNodes()[ nStt - 1 ]->EndOfSectionIndex();
        */
        const SwNodeIndex* pNodeIndex = rFrmFmt.GetCntnt().GetCntntIdx();

        ULONG nStt = pNodeIndex ? pNodeIndex->GetIndex()+1                  : 0;
        ULONG nEnd = pNodeIndex ? pNodeIndex->GetNode().EndOfSectionIndex() : 0;

        if( nStt >= nEnd )      // kein Bereich, also kein gueltiger Node
            return;

        const SwFmtAnchor& rAnch = rFrmFmt.GetAnchor();

        if( !bIsInTable && (FLY_IN_CNTNT == rAnch.GetAnchorId()) )
        {
            // ein zeichen(!)gebundener Rahmen liegt vor
            SwTxtNode* pParTxtNode = rAnch.GetCntntAnchor()->nNode.GetNode().GetTxtNode();

            if( pParTxtNode && !pDoc->GetNodes()[ nStt ]->IsNoTxtNode() )
                bDone = TRUE;
        }
        if( !bDone )
        {
            // ein NICHT zeichengebundener Rahmen liegt vor

            const SwFmtFrmSize& rS = rFrmFmt.GetFrmSize();
            nFlyWidth  = rS.GetWidth();  // Fuer Anpassung Graphic-Groesse
            nFlyHeight = rS.GetHeight();

            ASSERT( !pFlyFmt, "+pFlyFmt ist vor einem Rahmen nicht 0 ( Rahmen in Rahmen ? )" );
            {
                WW8SaveData aSaveData( *this, nStt, nEnd );
                pFlyFmt = (SwFlyFrmFmt*)&rFrmFmt;
                if( pFlyFmt )
                {
                    if( bIsInTable && (FLY_PAGE != rAnch.GetAnchorId()) )
                    {
                        // Beachten: Flag  bOutTable  wieder setzen,
                        //           denn wir geben ja ganz normalen Content der
                        //           Tabelenzelle aus und keinen Rahmen
                        //           (Flag wurde oben in  aSaveData()  geloescht)
                        bOutTable = TRUE;
                        const String& rName = pFlyFmt->GetName();
                        StartCommentOutput( rName );
                        if( !pDoc->GetNodes()[ nStt ]->IsNoTxtNode() )
                            WriteText();
                        EndCommentOutput( rName );
                    }
                    else
                        WriteText();
                }
                else
                    ASSERT( !this, "+Fly-Ausgabe ohne FlyFmt" );
            }
            // ASSERT( !pFlyFmt, " pFlyFmt ist hinter einem Rahmen nicht 0" );
        }
    }
    else
    {
        // write as escher
        WW8_CP nCP = Fc2Cp( Strm().Tell() );
        AppendFlyInFlys( nCP, rFrmFmt, rNdTopLeft );
    }
}


void SwWW8Writer::OutFlyFrms( const SwCntntNode& rNode )
{
    if( !pFlyPos )
        return;

    // gib alle freifliegenden Rahmen die sich auf den akt. Absatz
    // und evt. auf das aktuelle Zeichen beziehen, aus.
    ULONG nCurPos = rNode.GetIndex();

    // suche nach dem Anfang der FlyFrames
    for( USHORT n = 0; n < pFlyPos->Count() &&
            (*pFlyPos)[n]->GetNdIndex().GetIndex() <
                nCurPos; ++n )
        ;

    Point aNdPos, aPgPos;
    Point* pLayPos;
    BOOL bValidNdPos = FALSE, bValidPgPos = FALSE;

    if( n < pFlyPos->Count() )
    {
        while(     ( n < pFlyPos->Count() )
                && (   nCurPos
                    == (*pFlyPos)[n]->GetNdIndex().GetIndex() ) )
        {
            const SwFrmFmt& rFmt = (*pFlyPos)[ n ]->GetFmt();
            if( FLY_PAGE == rFmt.GetAnchor().GetAnchorId() )
            {
                // get the Layout Node-Position.
                if( !bValidPgPos )
                {
                    aPgPos = rNode.FindPageFrmRect( FALSE, &aPgPos ).Pos();
                    bValidPgPos = TRUE;
                }
                pLayPos = &aPgPos;
            }
            else
            {
                // get the Layout Node-Position.
                if( !bValidNdPos )
                {
                    aNdPos = rNode.FindLayoutRect( FALSE, &aNdPos ).Pos();
                    bValidNdPos = TRUE;
                }
                pLayPos = &aNdPos;
            }

            OutWW8FlyFrm( rFmt, *pLayPos );
            ++n;
         }
    }
}

/*  */

// write data of any redline
void SwWW8Writer::OutRedline( const SwRedlineData& rRedline )
{
    if( rRedline.Next() )
        OutRedline( *rRedline.Next() );

    static USHORT __READONLY_DATA aSprmIds[ 2 * 2 * 3 ] =
    {
        // Ids for insert
            0x0801, 0x4804, 0x6805,         // for WW8
            0x0042, 0x0045, 0x0046,         // for WW6
        // Ids for delete
            0x0800, 0x4863, 0x6864,         // for WW8
            0x0041, 0x0045, 0x0046          // for WW6
    };

    const USHORT* pSprmIds = 0;
    switch( rRedline.GetType() )
    {
    case REDLINE_INSERT:
        pSprmIds = aSprmIds;
        break;

    case REDLINE_DELETE:
        pSprmIds = aSprmIds + (2 * 3);
        break;

    case REDLINE_FORMAT:
        if( bWrtWW8 )
        {
            InsUInt16( 0xca57 );
            pO->Insert( 7, pO->Count() );       // len
            pO->Insert( 1, pO->Count() );
            InsUInt16( AddRedlineAuthor( rRedline.GetAuthor() ) );
            InsUInt32( SwWW8Writer::GetDTTM( rRedline.GetTimeStamp() ));
        }
        break;
    }

    if( pSprmIds )
    {
        if( !bWrtWW8 )
            pSprmIds += 3;

        if( bWrtWW8 )
            InsUInt16( pSprmIds[0] );
        else
            pO->Insert( pSprmIds[0], pO->Count() );
        pO->Insert( 1, pO->Count() );

        if( bWrtWW8 )
            InsUInt16( pSprmIds[1] );
        else
            pO->Insert( pSprmIds[1], pO->Count() );
        InsUInt16( AddRedlineAuthor( rRedline.GetAuthor() ) );

        if( bWrtWW8 )
            InsUInt16( pSprmIds[2] );
        else
            pO->Insert( pSprmIds[2], pO->Count() );
        InsUInt32( SwWW8Writer::GetDTTM( rRedline.GetTimeStamp() ));
    }
}

/*  */

SwNodeFnTab aWW8NodeFnTab = {
/* RES_TXTNODE  */                   OutWW8_SwTxtNode,
/* RES_GRFNODE  */                   OutWW8_SwGrfNode,
/* RES_OLENODE  */                   OutWW8_SwOleNode,
};


/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ww8/wrtw8nds.cxx,v 1.1.1.1 2000-09-18 17:14:58 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.42  2000/09/18 16:04:57  willem.vandorp
      OpenOffice header added.

      Revision 1.41  2000/08/21 10:13:58  khz
      Export Line Numbering (restart on new section)

      Revision 1.40  2000/08/18 13:02:21  jp
      don't export escaped URLs

      Revision 1.39  2000/08/04 10:57:10  jp
      Soft-/HardHyphens & HardBlanks changed from attribute to unicode character

      Revision 1.38  2000/07/25 18:51:22  jp
      Bug #76835#: OutWW8_SwTblNode - count realboxes correct

      Revision 1.37  2000/05/12 16:13:55  jp
      Changes for Unicode

      Revision 1.36  2000/04/19 18:03:31  jp
      Bug #75223#: SearchNext - new min pos must be greater than the startpos

      Revision 1.35  2000/04/17 10:33:46  jp
      Bug #74947#: OutRedlines - set curredline only if the startpos. is the cur.outpos.

      Revision 1.34  2000/03/21 16:22:40  jp
      Bug #74360#: OutSwTableNode - dont count realboxes only by W97 export

      Revision 1.33  2000/03/21 15:02:52  os
      StarView remainders removed

      Revision 1.32  2000/03/17 12:33:46  jp
      Bug #74245#: OutSectionNode - dont write setionbreak if the next node has his own pagebreak

      Revision 1.31  2000/03/15 13:46:31  jp
      Bug #74070#: WriteTable - look for colspans

      Revision 1.30  2000/03/03 15:20:01  os
      StarView remainders removed

      Revision 1.29  2000/02/25 09:55:06  jp
      Bug #73098#: read & write list entries without number

      Revision 1.28  2000/02/21 12:32:50  cmc
      #69372# Hyperlinks are exported with the extra WW97 data in the Data Stream to activate links in the Word UI

      Revision 1.27  2000/01/25 20:08:49  jp
      Bug #72146#: OutSwTxtNode - write UNICode if some character can not be converted

      Revision 1.26  1999/12/20 17:41:29  jp
      Bug #70749#: Date/Time-Numberformats in german format from the formatter

      Revision 1.25  1999/12/14 22:11:57  jp
      Bug #70846#: OutTxtNode - if numbered Node and no NumRuleItem in Itemset, then put it new

      Revision 1.24  1999/12/13 16:12:35  jp
      Bug #70789#: TOXMarks may have a position or a range

      Revision 1.23  1999/11/25 21:22:25  jp
      Bug #70131#: OutFields: append the charattributes of the node to the sprms

      Revision 1.22  1999/11/22 18:26:14  jp
      export of TOX and TOX entries

      Revision 1.21  1999/11/12 13:08:01  jp
      OutSwTable: replace CR to 0x7 on the last Box if the SW Table has to much columns

      Revision 1.20  1999/10/29 17:40:14  jp
      export of 'complex'(vert. merged) tables

      Revision 1.19  1999/10/21 17:53:13  jp
      Bug #69377#: write redline sprm of formatting correct

      Revision 1.18  1999/10/14 21:06:01  jp
      Bug #68617#,#68705# and other little things

      Revision 1.17  1999/10/14 11:09:26  jp
      export Redlines into W95/W97

      Revision 1.16  1999/10/13 18:09:37  jp
      write redlines

      Revision 1.15  1999/10/11 11:00:10  jp
      some changes for export EditEngine text in WW-Format

      Revision 1.14  1999/09/10 16:29:58  jp
      SwTable: get from Layout the upper size, Bug #67922#: dont W95 loop if fly in tablecells

      Revision 1.13  1999/09/09 17:39:52  jp
      Bug #68634#: write TableLineHeight as int16 and not as int32

      Revision 1.12  1999/08/30 16:55:30  JP
      write vertical alignment of tablecells


      Rev 1.11   30 Aug 1999 18:55:30   JP
   write vertical alignment of tablecells

      Rev 1.10   23 Jul 1999 11:18:38   KZ
   rem. CHARSET Symbols

      Rev 1.9   21 Jul 1999 18:28:22   JP
   W97 Export: experimental escher export

      Rev 1.8   06 Jul 1999 14:53:58   JP
   W97-Export corrections

      Rev 1.7   30 Jun 1999 19:56:40   JP
   W97-Export: Fields/PostIts/References

      Rev 1.6   25 Jun 1999 18:43:08   JP
   W97-Export: hyperlinks and fields, Bug #67174#

      Rev 1.5   24 Jun 1999 22:52:18   JP
   Export of Bookmarks and Hyperlinks

      Rev 1.4   23 Jun 1999 20:14:42   JP
   W97-Export: write Bookmarks

      Rev 1.3   23 Jun 1999 12:46:14   JP
   Export of numbers und outlinenumbers

      Rev 1.2   16 Jun 1999 19:54:54   JP
   Change interface of base class Writer, Export of W97 NumRules

      Rev 1.1   08 Jun 1999 09:22:36   JP
   WW97-Export: 1.Teil fuer Tabellen (W95-Funktionalitaet)

      Rev 1.0   04 Jun 1999 17:49:00   JP
   WW97-Export: Code aufgeteilt

*************************************************************************/

diff --git a/sw/source/filter/ww8/wrtw8num.cxx b/sw/source/filter/ww8/wrtw8num.cxx
new file mode 100644
index 0000000..f07bc98
--- /dev/null
+++ b/sw/source/filter/ww8/wrtw8num.cxx
@@ -0,0 +1,627 @@
/*************************************************************************
 *
 *  $RCSfile: wrtw8num.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:58 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PCH
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _SV_FONT_HXX //autogen
#include <vcl/font.hxx>
#endif
#ifndef _SVX_FONTITEM_HXX //autogen
#include <svx/fontitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen wg. SvxLRSpaceItem
#include <svx/lrspitem.hxx>
#endif

#ifndef _DOC_HXX //autogen
#include <doc.hxx>
#endif
#ifndef _DOCARY_HXX //autogen
#include <docary.hxx>
#endif
#ifndef _NUMRULE_HXX //autogen
#include <numrule.hxx>
#endif
#ifndef _PARATR_HXX //autogen
#include <paratr.hxx>
#endif
#ifndef _CHARFMT_HXX //autogen
#include <charfmt.hxx>
#endif
#ifndef _NDTXT_HXX //autogen wg. SwTxtNode
#include <ndtxt.hxx>
#endif

#ifndef _WRTWW8_HXX
#include <wrtww8.hxx>
#endif


USHORT SwWW8Writer::GetId( const SwNumRule& rNumRule ) const
{
    if( !pUsedNumTbl )
    {
        SwWW8Writer* pThis = (SwWW8Writer*)this;
        pThis->pUsedNumTbl = new SwNumRuleTbl;
        pThis->pUsedNumTbl->Insert( &pDoc->GetNumRuleTbl(), 0 );
        for( USHORT n = pUsedNumTbl->Count(); n; )
            if( !pDoc->IsUsed( *pUsedNumTbl->GetObject( --n )) )
                pThis->pUsedNumTbl->Remove( n );

        // jetzt noch die OutlineRule einfuegen
        SwNumRule* pR = (SwNumRule*)pDoc->GetOutlineNumRule();
        pThis->pUsedNumTbl->Insert( pR, pUsedNumTbl->Count() );
    }
    SwNumRule* p = (SwNumRule*)&rNumRule;
    return pUsedNumTbl->GetPos( p );
}

void SwWW8Writer::OutListTab()
{
    if( !pUsedNumTbl )
        return ;            // no numbering is used

    USHORT nCount = pUsedNumTbl->Count();

    pFib->fcPlcfLst = pTableStrm->Tell();
    SwWW8Writer::WriteShort( *pTableStrm, nCount );

    // First Loop - write static data of SwNumRule - LSTF
    for( USHORT n = 0; n < nCount; ++n )
    {
        const SwNumRule& rRule = *pUsedNumTbl->GetObject( n );

        SwWW8Writer::WriteLong( *pTableStrm, n + 1 );
        SwWW8Writer::WriteLong( *pTableStrm, n + 1 );

        // mit keinen Styles verbunden
        for( int i = 0; i < nWW8MaxListLevel; ++i )
            SwWW8Writer::WriteShort( *pTableStrm, 0xFFF );

        BYTE nFlags = 0, nDummy = 0;
        if( rRule.IsContinusNum() )
            nFlags |= 0x1;
        *pTableStrm << nFlags << nDummy;
    }

    // set len to FIB
    pFib->lcbPlcfLst = pTableStrm->Tell() - pFib->fcPlcfLst;

    // second Loop - write all Levels for all SwNumRules - LVLF

    // prepare the NodeNum to generate the NumString
    SwNodeNum aNdNum( 0 );
    for( n = 0; n < nWW8MaxListLevel; ++n )
        aNdNum.GetLevelVal()[ n ] = n;

    BYTE aPapSprms [] = {
        0x0f, 0x84, 0, 0,               // sprmPDxaLeft
        0x11, 0x84, 0, 0                // sprmPDxaLeft1
    };

    for( n = 0; n < nCount; ++n )
    {
        const SwNumRule& rRule = *pUsedNumTbl->GetObject( n );
        BYTE nLvl, nFlags,
            nLevels = rRule.IsContinusNum() ? 1 : nWW8MaxListLevel;
        for( nLvl = 0; nLvl < nLevels; ++nLvl )
        {
            // write the static data of the SwNumFmt of this level
            BYTE aNumLvlPos[ nWW8MaxListLevel ] = { 0,0,0,0,0,0,0,0,0 };

            const SwNumFmt& rFmt = rRule.Get( nLvl );
            SwWW8Writer::WriteLong( *pTableStrm, rFmt.GetStartValue() );
            *pTableStrm << SwWW8Writer::GetNumId( rFmt.eType );

            switch( rFmt.GetAdjust() )
            {
            case SVX_ADJUST_CENTER: nFlags = 1; break;
            case SVX_ADJUST_RIGHT:  nFlags = 2; break;
            default:                nFlags = 0; break;
            }
            *pTableStrm << nFlags;

            // Build the NumString for this Level
            String sNumStr;
            BOOL bWriteBullet = FALSE;
            rtl_TextEncoding eChrSet = RTL_TEXTENCODING_SYMBOL;
            if( SVX_NUM_CHAR_SPECIAL == rFmt.eType ||
                SVX_NUM_BITMAP == rFmt.eType )
            {
                sNumStr = rFmt.GetBulletChar();
                bWriteBullet = TRUE;

                const Font* pFont = rFmt.GetBulletFont();
                if( !pFont )
                    pFont = &SwNumRule::GetDefBulletFont();

                eChrSet = pFont->GetCharSet();
            }
            else if( SVX_NUM_NUMBER_NONE != rFmt.eType )
            {
                BYTE* pLvlPos = aNumLvlPos;
                aNdNum.SetLevel( nLvl );
                sNumStr = rRule.MakeNumString( aNdNum, FALSE, TRUE );

                // now search the nums in the string
                for( BYTE i = 0; i <= nLvl; ++i )
                {
                    String sSrch( String::CreateFromInt32( i ));
                    xub_StrLen nFnd = sNumStr.Search( sSrch );
                    if( STRING_NOTFOUND != nFnd )
                    {
                        *pLvlPos = (BYTE)(nFnd + rFmt.GetPrefix().Len() + 1 );
                        ++pLvlPos;
                        sNumStr.SetChar( nFnd, (char)i );
                    }
                }

                if( rFmt.GetPrefix().Len() )
                    sNumStr.Insert( rFmt.GetPrefix(), 0 );
                if( rFmt.GetPostfix().Len() )
                    sNumStr += rFmt.GetPostfix();
            }

            // write the rgbxchNums[9]
            pTableStrm->Write( aNumLvlPos, nWW8MaxListLevel );

            nFlags = 2;     // ixchFollow: 0 - tab, 1 - blank, 2 - nothing
            *pTableStrm << nFlags;
            // dxaSoace/dxaIndent (Word 6 compatibility)
            SwWW8Writer::WriteLong( *pTableStrm, 0 );
            SwWW8Writer::WriteLong( *pTableStrm, 0 );

            // cbGrpprlChpx
            WW8Bytes aCharAtrs;
            if( rFmt.GetCharFmt() || bWriteBullet )
            {
                WW8Bytes* pOldpO = pO;
                pO = &aCharAtrs;
                SfxItemSet aSet( pDoc->GetAttrPool(), RES_CHRATR_BEGIN,
                                                      RES_CHRATR_END );
                const SfxItemSet* pOutSet;
                if( bWriteBullet )
                {
                    const Font* pFont = rFmt.GetBulletFont();
                    if( !pFont )
                        pFont = &SwNumRule::GetDefBulletFont();
                    pOutSet = &aSet;

                    if( rFmt.GetCharFmt() )
                        aSet.Put( rFmt.GetCharFmt()->GetAttrSet() );
                    aSet.Put( SvxFontItem( pFont->GetFamily(),
                                pFont->GetName(), pFont->GetStyleName(),
                                pFont->GetPitch(), pFont->GetCharSet() ));
                }
                else
                    pOutSet = &rFmt.GetCharFmt()->GetAttrSet();

                Out_SfxItemSet( *pOutSet, FALSE, TRUE );
                pO = pOldpO;
            }
            nFlags = (BYTE)aCharAtrs.Count();
            *pTableStrm << nFlags;

            // cbGrpprlPapx
            nFlags = sizeof( aPapSprms );
            *pTableStrm << nFlags;

            // reserved
            SwWW8Writer::WriteShort( *pTableStrm, 0 );

            // write Papx
            BYTE* pData = aPapSprms + 2;
            Set_UInt16( pData, rFmt.GetAbsLSpace() );
            pData += 2;
            Set_UInt16( pData, rFmt.GetFirstLineOffset() );
            pTableStrm->Write( aPapSprms, sizeof( aPapSprms ));

            // write Chpx
            if( aCharAtrs.Count() )
                pTableStrm->Write( aCharAtrs.GetData(), aCharAtrs.Count() );

            // write the num string
            SwWW8Writer::WriteShort( *pTableStrm, sNumStr.Len() );
            SwWW8Writer::WriteString16( *pTableStrm, sNumStr, FALSE );
        }
    }
}

void SwWW8Writer::OutOverrideListTab()
{
    if( !pUsedNumTbl )
        return ;            // no numbering is used

    // write the "list format override" - LFO
    USHORT nCount = pUsedNumTbl->Count();

    pFib->fcPlfLfo = pTableStrm->Tell();
    SwWW8Writer::WriteLong( *pTableStrm, nCount );

    for( USHORT n = 0; n < nCount; ++n )
    {
        SwWW8Writer::WriteLong( *pTableStrm, n + 1 );
        SwWW8Writer::FillCount( *pTableStrm, 12 );
    }
    for( n = 0; n < nCount; ++n )
        SwWW8Writer::WriteLong( *pTableStrm, -1 );  // no overwrite

    // set len to FIB
    pFib->lcbPlfLfo = pTableStrm->Tell() - pFib->fcPlfLfo;
}

void SwWW8Writer::OutListNamesTab()
{
    if( !pUsedNumTbl )
        return ;            // no numbering is used

    // write the "list format override" - LFO
    USHORT nNms = 0, nCount = pUsedNumTbl->Count();

    pFib->fcSttbListNames = pTableStrm->Tell();
    SwWW8Writer::WriteShort( *pTableStrm, -1 );
    SwWW8Writer::WriteLong( *pTableStrm, nCount );

    for( ; nNms < nCount; ++nNms )
    {
        const SwNumRule& rRule = *pUsedNumTbl->GetObject( nNms );
        String sNm;
        if( !rRule.IsAutoRule() )
            sNm = rRule.GetName();

        SwWW8Writer::WriteShort( *pTableStrm, sNm.Len() );
        if( sNm.Len() )
            SwWW8Writer::WriteString16( *pTableStrm, sNm, FALSE );
    }

    SwWW8Writer::WriteLong( *pTableStrm, pFib->fcSttbListNames + 2, nNms );
    // set len to FIB
    pFib->lcbSttbListNames = pTableStrm->Tell() - pFib->fcSttbListNames;
}

/*  */

// old WW95-Code

void SwWW8Writer::Out_Olst( const SwNumRule& rRule )
{
    static BYTE __READONLY_DATA aAnlvBase[] = { // Defaults
                                1,0,0,          // Upper Roman
                                0x0C,           // Hanging Indent, fPrev
                                0,0,1,0x80,0,0,1,0,0x1b,1,0,0 };

    static BYTE __READONLY_DATA aSprmOlstHdr[] = { 133, 212 };

    pO->Insert( aSprmOlstHdr, sizeof( aSprmOlstHdr ), pO->Count() );
    WW8_OLST aOlst;
    memset( &aOlst, 0, sizeof(aOlst) );
    BYTE* pC = aOlst.rgch;
    BYTE* pChars = (BYTE*)pC;
    USHORT nCharLen = 64;

    USHORT j;
    for( j = 0; j < nWW8MaxListLevel; j++ ) // 9 variable ANLVs
    {
        memcpy( &aOlst.rganlv[j], aAnlvBase, sizeof( WW8_ANLV ) );  // Defaults

        const SwNumFmt* pFmt = rRule.GetNumFmt( j );
        if( pFmt )
            BuildAnlvBase( aOlst.rganlv[j], pChars, nCharLen, rRule,
                            *pFmt, (BYTE)j );
    }

    pO->Insert( (BYTE*)&aOlst, sizeof( aOlst ), pO->Count() );
}


void SwWW8Writer::Out_WwNumLvl( BYTE nWwLevel )
{
    pO->Insert( 13, pO->Count() );
    pO->Insert( nWwLevel, pO->Count() );
}

void SwWW8Writer::Out_SwNumLvl( BYTE nSwLevel )
{
    Out_WwNumLvl( ( nSwLevel == NO_NUM ) ? 0 : nSwLevel + 1 );
}

void SwWW8Writer::BuildAnlvBulletBase( WW8_ANLV& rAnlv, BYTE*& rpCh,
                                    USHORT& rCharLen, const SwNumFmt& rFmt )
{
    BYTE nb = 0;                                // Zahlentyp
    ByteToSVBT8( 11, rAnlv.nfc );

    switch( rFmt.GetAdjust() )
    {
    case SVX_ADJUST_RIGHT:      nb = 2; break;
    case SVX_ADJUST_CENTER:     nb = 1; break;
    case SVX_ADJUST_BLOCK:
    case SVX_ADJUST_BLOCKLINE:  nb = 3; break;
    }
    if( rFmt.GetFirstLineOffset() < 0 )
        nb |= 0x8;          // number will be displayed using a hanging indent
    ByteToSVBT8( nb, rAnlv.aBits1 );

    xub_StrLen nS = rFmt.GetPrefix().Len();
    if( 1 < rCharLen )
    {
        const Font& rFont = rFmt.GetBulletFont()
                                    ? *rFmt.GetBulletFont()
                                    : SwNumRule::GetDefBulletFont();
        USHORT nFontId = GetId( rFont );
        ShortToSVBT16( nFontId, rAnlv.ftc );
        *rpCh = ByteString::ConvertFromUnicode( rFmt.GetBulletChar(),
                                                rFont.GetCharSet() );
        rpCh++;
        rCharLen--;
        ByteToSVBT8( 1, rAnlv.cbTextBefore );
    }
    ShortToSVBT16( -rFmt.GetFirstLineOffset(), rAnlv.dxaIndent );
    ShortToSVBT16( rFmt.GetCharTextOffset(), rAnlv.dxaSpace );
}

static void SwWw8_InsertAnlText( const String& rStr, BYTE*& rpCh,
                                 USHORT& rCharLen, SVBT8& r8Len )
{
    BYTE nb = 0;
    WW8Bytes aO;
    SwWW8Writer::InsAsString8( aO, rStr, RTL_TEXTENCODING_MS_1252 );

    USHORT nCnt = aO.Count();
    if( nCnt && nCnt < rCharLen )
    {
        nb = (BYTE)nCnt;
        memcpy( rpCh, aO.GetData(), nCnt );
        rpCh += nCnt;
        rCharLen -= nCnt;
    }
    ByteToSVBT8( nb, r8Len );
}

void SwWW8Writer::BuildAnlvBase( WW8_ANLV& rAnlv, BYTE*& rpCh,
                                USHORT& rCharLen, const SwNumRule& rRul,
                                const SwNumFmt& rFmt, BYTE nSwLevel )
{
    ByteToSVBT8( SwWW8Writer::GetNumId( rFmt.eType ), rAnlv.nfc );

    BYTE nb = 0;
    switch( rFmt.GetAdjust() )
    {
    case SVX_ADJUST_RIGHT: nb = 2; break;
    case SVX_ADJUST_CENTER: nb = 1; break;
    case SVX_ADJUST_BLOCK:
    case SVX_ADJUST_BLOCKLINE: nb = 3; break;
    }

    BOOL bInclUpper = rFmt.IsInclUpperLevel();
    if( bInclUpper )
        nb |= 0x4;          // include previous levels

    if( rFmt.GetFirstLineOffset() < 0 )
        nb |= 0x8;          // number will be displayed using a hanging indent
    ByteToSVBT8( nb, rAnlv.aBits1 );

    if( bInclUpper && !rRul.IsContinusNum() )
    {
        if( (nSwLevel >= 1 )
            && (nSwLevel<= nWW8MaxListLevel )
            && (rFmt.eType != SVX_NUM_NUMBER_NONE ) )   // UEberhaupt Nummerierung ?
        {                                               // -> suche, ob noch Zahlen davor
            BYTE nUpper = rFmt.GetUpperLevel();
            if( (nUpper >= 0 )
                && (nUpper <= nWW8MaxListLevel )
                && (rRul.Get(nUpper).eType != SVX_NUM_NUMBER_NONE ) )   // Nummerierung drueber ?
            {
                                                    // dann Punkt einfuegen
                SwWw8_InsertAnlText( aDotStr, rpCh, rCharLen,
                                    rAnlv.cbTextBefore );
            }

        }
    }
    else
    {
        SwWw8_InsertAnlText( rFmt.GetPrefix(), rpCh, rCharLen,
                             rAnlv.cbTextBefore );
        SwWw8_InsertAnlText( rFmt.GetPostfix(), rpCh, rCharLen,
                             rAnlv.cbTextAfter );
    }

    ShortToSVBT16( rFmt.GetStartValue(), rAnlv.iStartAt );
    ShortToSVBT16( -rFmt.GetFirstLineOffset(), rAnlv.dxaIndent );
    ShortToSVBT16( rFmt.GetCharTextOffset(), rAnlv.dxaSpace );
}

void SwWW8Writer::Out_NumRuleAnld( const SwNumRule& rRul, const SwNumFmt& rFmt,
                                   BYTE nSwLevel )
{
    static BYTE __READONLY_DATA aSprmAnldDefault[54] = {
                         12, 52,
                         1,0,0,0x0c,0,0,1,0x80,0,0,1,0,0x1b,1,0,0,0x2e,
                         0,0,0,
                         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
    BYTE aSprmAnld[54];

    memcpy( aSprmAnld, aSprmAnldDefault, sizeof( aSprmAnld ) );
    WW8_ANLD* pA = (WW8_ANLD*)(aSprmAnld + 2);  // handlicher Pointer

    BYTE* pChars = (BYTE*)(pA->rgchAnld);
    USHORT nCharLen = 31;

    if( nSwLevel == 11 )
        BuildAnlvBulletBase( pA->eAnlv, pChars, nCharLen, rFmt );
    else
        BuildAnlvBase( pA->eAnlv, pChars, nCharLen, rRul, rFmt, nSwLevel );

    // ... und raus damit
    OutSprmBytes( (BYTE*)&aSprmAnld, sizeof( aSprmAnld ) );
}


// Return: ist es eine Gliederung ?
BOOL SwWW8Writer::Out_SwNum( const SwTxtNode* pNd )
{
    BYTE nSwLevel = pNd->GetNum()->GetLevel();
    const SwNumRule* pRul = pNd->GetNumRule();
    if( !pRul || nSwLevel == nWW8MaxListLevel )
        return FALSE;

    BOOL bNoNum = FALSE;
    if( nSwLevel == NO_NUM )
        nSwLevel = NO_NUMLEVEL | 0 ;    // alte Codierung...
    if( ( nSwLevel & NO_NUMLEVEL ) != 0 )
    {
        nSwLevel &= ~NO_NUMLEVEL;       // 0..nWW8MaxListLevel
        bNoNum = TRUE;
    }

    BOOL bRet = TRUE;
    const SwNumFmt* pFmt = &pRul->Get( nSwLevel );// interessierendes Format

#ifdef NUM_RELSPACE
    SwNumFmt aFmt( *pFmt );
    const SvxLRSpaceItem& rLR = (SvxLRSpaceItem&)pNd->SwCntntNode::GetAttr( RES_LR_SPACE );
    aFmt.SetAbsLSpace( aFmt.GetAbsLSpace() + rLR.GetLeft() );
    pFmt = &aFmt;
#endif

#ifdef DEBUG
    BYTE nIncl = pRul->Get(1).GetUpperLevel();
#endif

    if( pFmt->eType == SVX_NUM_NUMBER_NONE
        || pFmt->eType == SVX_NUM_CHAR_SPECIAL
        || pFmt->eType == SVX_NUM_BITMAP )
    {
                            // Aufzaehlung
        Out_WwNumLvl( (bNoNum) ? 12 : 11 );
        Out_NumRuleAnld( *pRul, *pFmt, 11 );
        bRet = FALSE;
    }
    else if( pRul->IsContinusNum()
              || ( pRul->Get(1).GetUpperLevel() <= 1 ) )
    {
                            // Nummerierung
        Out_WwNumLvl( (bNoNum) ? 12 : 10 );
        Out_NumRuleAnld( *pRul, *pFmt, 10 );
        bRet = FALSE;
    }
    else
    {
                            // Gliederung
        Out_SwNumLvl( (bNoNum) ? 12 :nSwLevel );
        Out_NumRuleAnld( *pRul, *pFmt, nSwLevel );
    }
    return bRet;
}


/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ww8/wrtw8num.cxx,v 1.1.1.1 2000-09-18 17:14:58 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.9  2000/09/18 16:04:58  willem.vandorp
      OpenOffice header added.

      Revision 1.8  2000/07/24 13:03:36  jp
      Bug #76561#: convert Bulletchar to unicode

      Revision 1.7  2000/05/12 16:13:58  jp
      Changes for Unicode

      Revision 1.6  2000/02/25 09:55:10  jp
      Bug #73098#: read & write list entries without number

      Revision 1.5  1999/12/09 15:42:43  jp
      Bug #70669#: GetId without ASSERT

      Revision 1.4  1999/10/13 18:09:41  jp
      write redlines

      Revision 1.3  1999/06/23 10:46:16  JP
      Export of numbers und outlinenumbers


      Rev 1.2   23 Jun 1999 12:46:16   JP
   Export of numbers und outlinenumbers

      Rev 1.1   21 Jun 1999 10:06:58   JP
   write ListOverride table in correct format

      Rev 1.0   16 Jun 1999 19:56:20   JP
   Change interface of base class Writer, Export of W97 NumRules

*************************************************************************/

diff --git a/sw/source/filter/ww8/wrtw8sty.cxx b/sw/source/filter/ww8/wrtw8sty.cxx
new file mode 100644
index 0000000..4f7a9ea
--- /dev/null
+++ b/sw/source/filter/ww8/wrtw8sty.cxx
@@ -0,0 +1,1942 @@
/*************************************************************************
 *
 *  $RCSfile: wrtw8sty.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:58 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PCH
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#define _SVSTDARR_STRINGSSORTDTOR

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _SVX_BOXITEM_HXX //autogen
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_FONTITEM_HXX //autogen
#include <svx/fontitem.hxx>
#endif
#ifndef _SVDOBJ_HXX //autogen wg. SdrObject
#include <svx/svdobj.hxx>
#endif
#ifndef _SVDOTEXT_HXX //autogen wg. SdrTextObj
#include <svx/svdotext.hxx>
#endif

#ifndef _WRTWW8_HXX
#include <wrtww8.hxx>
#endif
#ifndef _DOC_HXX //autogen
#include <doc.hxx>
#endif
#ifndef _DOCARY_HXX //autogen
#include <docary.hxx>
#endif
#ifndef _POOLFMT_HXX //autogen
#include <poolfmt.hxx>
#endif
#ifndef _FMTCOL_HXX //autogen
#include <fmtcol.hxx>
#endif
#ifndef _FMTPDSC_HXX //autogen
#include <fmtpdsc.hxx>
#endif
#ifndef _PAGEDESC_HXX //autogen
#include <pagedesc.hxx>
#endif
#ifndef _NDTXT_HXX //autogen
#include <ndtxt.hxx>
#endif
#ifndef _FTNINFO_HXX //autogen
#include <ftninfo.hxx>
#endif
#ifndef _FMTHDFT_HXX //autogen
#include <fmthdft.hxx>
#endif
#ifndef _SECTION_HXX //autogen
#include <section.hxx>
#endif
#ifndef _FMTCNTNT_HXX //autogen
#include <fmtcntnt.hxx>
#endif
#ifndef _FMTFTN_HXX //autogen
#include <fmtftn.hxx>
#endif
#ifndef _NDINDEX_HXX //autogen
#include <ndindex.hxx>
#endif
#ifndef _TXTFTN_HXX
#include <txtftn.hxx>
#endif
#ifndef _CHARFMT_HXX
#include <charfmt.hxx>
#endif
#ifndef _DOCUFLD_HXX
#include <docufld.hxx>
#endif
#ifndef _DCONTACT_HXX
#include <dcontact.hxx>
#endif
#ifndef _FMTCNCT_HXX
#include <fmtcnct.hxx>
#endif
#ifndef _FTNIDX_HXX
#include <ftnidx.hxx>
#endif

#ifndef SW_LINEINFO_HXX
#include <lineinfo.hxx>
#endif


struct WW8_SED
{
    SVBT16 aBits1;      // orientation change + internal, Default: 6
    SVBT32 fcSepx;      //  FC  file offset to beginning of SEPX for section.
                        //  0xFFFFFFFF for no Sprms
    SVBT16 fnMpr;       //  used internally by Windows Word, Default: 0
    SVBT32 fcMpr;       //  FC, points to offset in FC space for MacWord
                        // Default: 0xffffffff ( nothing )
                        //  cbSED is 12 (decimal)), C (hex).
};

struct WW8_PdAttrDesc
{
    BYTE* pData;
    USHORT nLen;
    WW8_FC nSepxFcPos;
};


SV_IMPL_VARARR( WW8_WrSepInfoPtrs, WW8_SepInfo )

// class WW8_WrPlc0 ist erstmal nur fuer Header / Footer-Positionen, d.h. es gibt
// keine inhaltstragende Struktur.
class WW8_WrPlc0
{
    SvULongs aPos;      // PTRARR von CPs / FCs
    ULONG nOfs;
public:
    WW8_WrPlc0( ULONG nOffset );
    USHORT Count() const                { return aPos.Count(); }
    void Append( ULONG nStartCpOrFc );
    void Write( SvStream& rStrm );
    ULONG GetCP( USHORT n ) const       { return aPos[ n ]; }
};


//------------------------------------------------------------
//  Styles
//------------------------------------------------------------

#define WW8_RESERVED_SLOTS 15

// GetId( SwCharFmt ) zur Benutzung im Text -> nil verboten,
// "Default Char Style" stattdessen
USHORT SwWW8Writer::GetId( const SwCharFmt& rFmt ) const
{
    USHORT nRet = pStyles->Sty_GetWWSlot( rFmt );
    return ( nRet != 0xfff ) ? nRet : 10;       // Default Char Style
}

// GetId( SwTxtFmtColl ) zur Benutzung an TextNodes -> nil verboten,
// "Standard" stattdessen
USHORT SwWW8Writer::GetId( const SwTxtFmtColl& rColl ) const
{
    USHORT nRet = pStyles->Sty_GetWWSlot( rColl );
    return ( nRet != 0xfff ) ? nRet : 0;        // Default TxtFmtColl
}



//typedef pFmtT
WW8WrtStyle::WW8WrtStyle( SwWW8Writer& rWr )
    : rWrt( rWr ), nPOPosStdLen1( 0 ), nPOPosStdLen2( 0 )
{
    rWrt.pO->Remove( 0, rWrt.pO->Count() );             // leeren
    SwDoc& rDoc = *rWrt.pDoc;

    // if exist any Foot-/End-Notes then get from the EndNoteInfo struct
    // the CharFormats. They will create it!
    if( rDoc.GetFtnIdxs().Count() )
    {
        rDoc.GetEndNoteInfo().GetAnchorCharFmt( rDoc );
        rDoc.GetEndNoteInfo().GetCharFmt( rDoc );
        rDoc.GetFtnInfo().GetAnchorCharFmt( rDoc );
        rDoc.GetFtnInfo().GetCharFmt( rDoc );
    }
    USHORT nAlloc = WW8_RESERVED_SLOTS + rDoc.GetCharFmts()->Count() - 1 +
                                        rDoc.GetTxtFmtColls()->Count() - 1;
                    // etwas grosszuegig ( bis zu 15 frei )
    pFmtA = new SwFmt*[ nAlloc ];
    memset( pFmtA, 0, nAlloc * sizeof( SwFmt* ) );
    BuildStyleTab();
}

WW8WrtStyle::~WW8WrtStyle()
{
    delete[]( pFmtA );
    rWrt.pO->Remove( 0, rWrt.pO->Count() );             // leeren
}

// Sty_SetWWSlot() fuer Abhaengigkeiten der Styles -> nil ist erlaubt
USHORT WW8WrtStyle::Sty_GetWWSlot( const SwFmt& rFmt ) const
{
    register USHORT n;
    for( n = 0; n < nUsedSlots; n++ )
        if( pFmtA[n] == &rFmt )
            return n;
    return 0xfff;                   // 0xfff: WW: nil
}

USHORT WW8WrtStyle::Build_GetWWSlot( const SwFmt& rFmt )
{
    USHORT nRet;
    switch( nRet = rFmt.GetPoolFmtId() )
    {
    case RES_POOLCOLL_STANDARD:     nRet = 0;       break;

    case RES_POOLCOLL_HEADLINE1:
    case RES_POOLCOLL_HEADLINE2:
    case RES_POOLCOLL_HEADLINE3:
    case RES_POOLCOLL_HEADLINE4:
    case RES_POOLCOLL_HEADLINE5:
    case RES_POOLCOLL_HEADLINE6:
    case RES_POOLCOLL_HEADLINE7:
    case RES_POOLCOLL_HEADLINE8:
    case RES_POOLCOLL_HEADLINE9:    nRet -= RES_POOLCOLL_HEADLINE1-1;   break;

//  case RES_POOLCHR_FOOTNOTE_ANCHOR:   nRet =
//  case RES_POOLCHR_ENDNOTE_ANCHOR:
    default:
        nRet = nUsedSlots++;
        break;
    }
    return nRet;
}

USHORT WW8WrtStyle::GetWWId( const SwFmt& rFmt ) const
{
    USHORT nRet = 0xffe;        // User-Style als default
    USHORT nPoolId = rFmt.GetPoolFmtId();
    if( nPoolId == RES_POOLCOLL_STANDARD )
        nRet = 0;
    else if( nPoolId >= RES_POOLCOLL_HEADLINE1 &&
             nPoolId <= RES_POOLCOLL_HEADLINE9 )
        nRet = nPoolId + 1 - RES_POOLCOLL_HEADLINE1;
    else if( nPoolId >= RES_POOLCOLL_TOX_IDX1 &&
             nPoolId <= RES_POOLCOLL_TOX_IDX3 )
        nRet = nPoolId + 10 - RES_POOLCOLL_TOX_IDX1;
    else if( nPoolId >= RES_POOLCOLL_TOX_CNTNT1 &&
             nPoolId <= RES_POOLCOLL_TOX_CNTNT5 )
        nRet = nPoolId + 19 - RES_POOLCOLL_TOX_CNTNT1;
    else if( nPoolId >= RES_POOLCOLL_TOX_CNTNT6 &&
             nPoolId <= RES_POOLCOLL_TOX_CNTNT9 )
        nRet = nPoolId + 24 - RES_POOLCOLL_TOX_CNTNT6;
    else
        switch( nPoolId )
        {
        case RES_POOLCOLL_FOOTNOTE:         nRet = 29;  break;
        case RES_POOLCOLL_HEADER:           nRet = 31;  break;
        case RES_POOLCOLL_FOOTER:           nRet = 32;  break;
        case RES_POOLCOLL_TOX_IDXH:         nRet = 33;  break;
        case RES_POOLCOLL_JAKETADRESS:      nRet = 36;  break;
        case RES_POOLCOLL_SENDADRESS:       nRet = 37;  break;
        case RES_POOLCOLL_ENDNOTE:          nRet = 43;  break;
        case RES_POOLCOLL_LISTS_BEGIN:      nRet = 47;  break;
        case RES_POOLCOLL_DOC_TITEL:        nRet = 62;  break;
        case RES_POOLCOLL_SIGNATURE:        nRet = 64;  break;
        case RES_POOLCOLL_TEXT:             nRet = 66;  break;
        case RES_POOLCOLL_TEXT_MOVE:        nRet = 67;  break;
        case RES_POOLCOLL_DOC_SUBTITEL:     nRet = 74;  break;
        case RES_POOLCOLL_TEXT_IDENT:       nRet = 77;  break;

        case RES_POOLCHR_FOOTNOTE_ANCHOR:   nRet = 38;  break;
        case RES_POOLCHR_ENDNOTE_ANCHOR:    nRet = 42;  break;
        case RES_POOLCHR_INET_NORMAL:       nRet = 85;  break;
        case RES_POOLCHR_INET_VISIT:        nRet = 86;  break;
        case RES_POOLCHR_HTML_STRONG:       nRet = 87;  break;
        case RES_POOLCHR_HTML_EMPHASIS:     nRet = 88;  break;
        case RES_POOLCHR_LINENUM:           nRet = 40;  break;
        case RES_POOLCHR_PAGENO:            nRet = 41;  break;
        }
    return nRet;
}

void WW8WrtStyle::BuildStyleTab()
{
    nUsedSlots = WW8_RESERVED_SLOTS;    // soviele sind reserviert fuer
                                        // Standard und HeadingX u.a.
    SwFmt* pFmt;
    USHORT n;
    const SvPtrarr& rArr = *rWrt.pDoc->GetCharFmts();       // erst CharFmt
        // das Default-ZeichenStyle ( 0 ) wird nicht mit ausgegeben !
    for( n = 1; n < rArr.Count(); n++ )
    {
        pFmt = (SwFmt*)rArr[n];
        pFmtA[ Build_GetWWSlot( *pFmt ) ] = pFmt;
    }
    const SvPtrarr& rArr2 = *rWrt.pDoc->GetTxtFmtColls();   // dann TxtFmtColls
        // das Default-TextStyle ( 0 ) wird nicht mit ausgegeben !
    for( n = 1; n < rArr2.Count(); n++ )
    {
        pFmt = (SwFmt*)rArr2[n];
        pFmtA[ Build_GetWWSlot( *pFmt ) ] = pFmt;
    }
}

void WW8WrtStyle::WriteStyle( SvStream& rStrm )
{
    WW8Bytes* pO = rWrt.pO;

    short nLen = pO->Count() - 2;            // Laenge des Styles
    BYTE* p = (BYTE*)pO->GetData() + nPOPosStdLen1;
    ShortToSVBT16( nLen, p );               // nachtragen
    p = (BYTE*)pO->GetData() + nPOPosStdLen2;
    ShortToSVBT16( nLen, p );               // dito

    rStrm.Write( pO->GetData(), pO->Count() );      // ins File damit
    pO->Remove( 0, pO->Count() );                   // leeren fuer naechsten
}


void WW8WrtStyle::BuildStd( const String& rName, BOOL bPapFmt, short nWwBase,
                             short nWwNext, USHORT nWwId )
{
    BYTE aWW8_STD[ sizeof( WW8_STD ) ];
    BYTE* pData = aWW8_STD;
    memset( &aWW8_STD, 0, sizeof( WW8_STD ) );

    UINT16 nBit16 = 0x1000;         // fInvalHeight
    nBit16 |= (0x0FFF & nWwId);
    Set_UInt16( pData, nBit16 );

    nBit16 = nWwBase << 4;          // istdBase
    nBit16 |= bPapFmt ? 1 : 2;      // sgc
    Set_UInt16( pData, nBit16 );

    nBit16 = nWwNext << 4;          // istdNext
    nBit16 |= bPapFmt ? 2 : 1;      // cupx
    Set_UInt16( pData, nBit16 );

    pData += sizeof( UINT16 );      // bchUpe

    if( rWrt.bWrtWW8 )
    {
        //-------- jetzt neu:
        // ab Ver8 gibts zwei Felder mehr:
        //UINT16    fAutoRedef : 1;    /* auto redefine style when appropriate */
        //UINT16    fHidden : 1;       /* hidden from UI? */
        //UINT16    : 14;              /* unused bits */
        pData += sizeof( UINT16 );
    }


    UINT16 nLen = ( pData - aWW8_STD ) + 1 +
                ((rWrt.bWrtWW8 ? 2 : 1 ) * (rName.Len() + 1));  // vorlaeufig

    WW8Bytes* pO = rWrt.pO;
    nPOPosStdLen1 = pO->Count();        // Adr1 zum nachtragen der Laenge

    SwWW8Writer::InsUInt16( *pO, nLen );
    pO->Insert( aWW8_STD, ( pData - aWW8_STD ), pO->Count() );

    nPOPosStdLen2 = nPOPosStdLen1 + 8;  // Adr2 zum nachtragen von "end of upx"

    // Namen schreiben
    if( rWrt.bWrtWW8 )
    {
        SwWW8Writer::InsUInt16( *pO, rName.Len() ); // Laenge
        SwWW8Writer::InsAsString16( *pO, rName );
    }
    else
    {
        pO->Insert( (BYTE)rName.Len(), pO->Count() );       // Laenge
        SwWW8Writer::InsAsString8( *pO, rName, RTL_TEXTENCODING_MS_1252 );
    }
    pO->Insert( (BYTE)0, pO->Count() );             // Trotz P-String 0 am Ende!
}

void WW8WrtStyle::SkipOdd()     // Ruecke zu gerader Adresse vor
{
    WW8Bytes* pO = rWrt.pO;
    if( ( rWrt.pTableStrm->Tell() + pO->Count() ) & 1 )     // Start auf gerader
        pO->Insert( (BYTE)0, pO->Count() );         // Adresse
}

void WW8WrtStyle::Set1StyleDefaults( const SwFmt& rFmt, BOOL bPap )
{
    // defaults, that differs between WinWord and SO
    static USHORT __READONLY_DATA aPapIds[] = {
        RES_PARATR_WIDOWS, RES_PARATR_HYPHENZONE,
        0 };
    static USHORT __READONLY_DATA aChpIds[] = {
        RES_CHRATR_FONTSIZE, RES_CHRATR_LANGUAGE,
        0 };

    for( const USHORT* pIds = bPap ? aPapIds : aChpIds; *pIds; ++pIds )
    {
        if( SFX_ITEM_SET != rFmt.GetItemState( *pIds, FALSE ))
            Out( aWW8AttrFnTab, rFmt.GetAttr( *pIds, TRUE ), rWrt );
    }
}

void WW8WrtStyle::BuildUpx( const SwFmt* pFmt, BOOL bPap, USHORT nPos,
                            BOOL bInsDefCharSiz )
{
    WW8Bytes* pO = rWrt.pO;

    SkipOdd();
    UINT16 nLen = ( bPap ) ? 2 : 0;             // Default-Laenge
    USHORT nLenPos = pO->Count();               // Laenge zum Nachtragen
                                    // Keinen Pointer merken, da sich bei
                                    // _grow der Pointer aendert !

    SwWW8Writer::InsUInt16( *pO, nLen );        // Style-Len

    UINT16 nStartSiz = pO->Count();

    if( bPap )
        SwWW8Writer::InsUInt16( *pO, nPos);     // Style-Nummer

    rWrt.Out_SwFmt( *pFmt, bPap, !bPap );

    if( bInsDefCharSiz  )                   // nicht abgeleitet v. anderem Style
        Set1StyleDefaults( *pFmt, bPap );

    nLen = pO->Count() - nStartSiz;
    BYTE* pUpxLen = (BYTE*)pO->GetData() + nLenPos; // Laenge zum Nachtragen
    ShortToSVBT16( nLen, pUpxLen );                 // Default-Laenge eintragen
}

// Out1Style geht fuer TxtFmtColls und CharFmts
void WW8WrtStyle::Out1Style( SwFmt* pFmt, USHORT nPos )
{
    if( pFmt )
    {
        BOOL bFmtColl = pFmt->Which() == RES_TXTFMTCOLL ||
                        pFmt->Which() == RES_CONDTXTFMTCOLL;
        short nWwBase = 0xfff;                  // Default: none

        if( !pFmt->IsDefault() )                // Abgeleitet von ?
            nWwBase = Sty_GetWWSlot( *pFmt->DerivedFrom() );

        SwFmt* pNext;
        if( bFmtColl )
            pNext = &((SwTxtFmtColl*)pFmt)->GetNextTxtFmtColl();
        else
            pNext = pFmt;       // CharFmt: Naechstes CharFmt == Selbes

        short nWwNext = Sty_GetWWSlot( *pNext );

        BuildStd( pFmt->GetName(), bFmtColl, nWwBase, nWwNext,
                    GetWWId( *pFmt ) );
        if( bFmtColl )
            BuildUpx( pFmt, TRUE, nPos, nWwBase==0xfff );           // UPX.papx
        BuildUpx( pFmt, FALSE, nPos, bFmtColl && nWwBase==0xfff );  // UPX.chpx

        SkipOdd();
        WriteStyle( *rWrt.pTableStrm );
    }
    else if( nPos == 10 )           // Default Char-Style ( nur WW )
    {
        if( rWrt.bWrtWW8 )
        {
            static BYTE __READONLY_DATA aDefCharSty[] = {
                0x42, 0x00,
                0x41, 0x40, 0xF2, 0xFF, 0xA1, 0x00, 0x42, 0x00,
                0x00, 0x00, 0x19, 0x00, 0x41, 0x00, 0x62, 0x00,
                0x73, 0x00, 0x61, 0x00, 0x74, 0x00, 0x7A, 0x00,
                0x2D, 0x00, 0x53, 0x00, 0x74, 0x00, 0x61, 0x00,
                0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00,
                0x64, 0x00, 0x73, 0x00, 0x63, 0x00, 0x68, 0x00,
                0x72, 0x00, 0x69, 0x00, 0x66, 0x00, 0x74, 0x00,
                0x61, 0x00, 0x72, 0x00, 0x74, 0x00, 0x00, 0x00,
                0x00, 0x00 };
            rWrt.pTableStrm->Write( &aDefCharSty, sizeof( aDefCharSty ) );
        }
        else
        {
            static BYTE __READONLY_DATA aDefCharSty[] = {
                0x26, 0x00,
                0x41, 0x40, 0xF2, 0xFF, 0xA1, 0x00, 0x26, 0x00,
                0x19, 0x41, 0x62, 0x73, 0x61, 0x74, 0x7A, 0x2D,
                0x53, 0x74, 0x61, 0x6E, 0x64, 0x61, 0x72, 0x64,
                0x73, 0x63, 0x68, 0x72, 0x69, 0x66, 0x74, 0x61,
                0x72, 0x74, 0x00, 0x00, 0x00, 0x00 };
            rWrt.pTableStrm->Write( &aDefCharSty, sizeof( aDefCharSty ) );
        }
    }
/*  else if( nPos == WW8_CSTY_FTN )     // Ftn-CharStyle ( nur WW )
    {
        if( rWrt.bWrtWW8 )
        {
            static BYTE __READONLY_DATA aFtnCharSty[] = {
                0x32, 0x00,
                0x26, 0x40, 0xA2, 0x00, 0x01, 0x01, 0x32, 0x00,
                0x00, 0x00, 0x0F, 0x00, 0x46, 0x00, 0x75, 0x00,
                0xDF, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x74, 0x00,
                0x65, 0x00, 0x6E, 0x00, 0x7A, 0x00, 0x65, 0x00,
                0x69, 0x00, 0x63, 0x00, 0x68, 0x00, 0x65, 0x00,
                0x6E, 0x00, 0x00, 0x00, 0x03, 0x00, 0x48, 0x2A,
                0x01, 0x00 };
            rWrt.pTableStrm->Write( &aFtnCharSty, sizeof( aFtnCharSty ) );
        }
        else
        {
            static BYTE __READONLY_DATA aFtnCharSty[] = {
                0x1E, 0x00,
                0x26, 0x40, 0xA2, 0x00, 0x01, 0x01, 0x1E, 0x00,
                0x0F, 0x46, 0x75, 0xDF, 0x6E, 0x6F, 0x74, 0x65,
                0x6E, 0x7A, 0x65, 0x69, 0x63, 0x68, 0x65, 0x6E,
                0x00, 0x00, 0x02, 0x00, 0x68, 0x01 };
            rWrt.pTableStrm->Write( &aFtnCharSty, sizeof( aFtnCharSty ) );
        }
    }
*/  else
    {
        UINT16 n = 0;
        rWrt.pTableStrm->Write( &n , 2 );   // leerer Style
    }
}

void WW8WrtStyle::OutStyleTab()
{
    WW8Fib& rFib = *rWrt.pFib;

    ULONG nCurPos = rWrt.pTableStrm->Tell();
    if( nCurPos & 1 )                   // Start auf gerader
    {
        *rWrt.pTableStrm << (char)0;        // Adresse
        ++nCurPos;
    }
    rWrt.bStyDef = TRUE;
    rFib.fcStshfOrig = rFib.fcStshf = nCurPos;
    ULONG nStyAnzPos = nCurPos + 2;     // Anzahl wird nachgetragen

    if( rWrt.bWrtWW8 )
    {
        static BYTE __READONLY_DATA aStShi[] = {
            0x12, 0x00,
            0x0F, 0x00, 0x0A, 0x00, 0x01, 0x00, 0x5B, 0x00,
            0x0F, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00 };

        rWrt.pTableStrm->Write( &aStShi, sizeof( aStShi ) );
    }
    else
    {
        static BYTE __READONLY_DATA aStShi[] = {
            0x0E, 0x00,
            0x0F, 0x00, 0x08, 0x00, 0x01, 0x00, 0x4B, 0x00,
            0x0F, 0x00, 0x00, 0x00, 0x00, 0x00 };
        rWrt.pTableStrm->Write( &aStShi, sizeof( aStShi ) );
    }

    USHORT n;
    for( n = 0; n < nUsedSlots; n++ )
        Out1Style( pFmtA[n], n );

    rFib.lcbStshfOrig = rFib.lcbStshf = rWrt.pTableStrm->Tell() - rFib.fcStshf;
    SwWW8Writer::WriteShort( *rWrt.pTableStrm, nStyAnzPos, nUsedSlots );
    rWrt.bStyDef = FALSE;
}


/*  */

//---------------------------------------------------------------------------
//          Fonts
//---------------------------------------------------------------------------

USHORT SwWW8Writer::GetId( const SvxFontItem& rFont ) const
{
    const SfxItemPool& rPool = pDoc->GetAttrPool();
    const SvxFontItem* pFont = (const SvxFontItem*)GetDfltAttr( RES_CHRATR_FONT );
    USHORT n = 3;
    if( rFont == *pFont )
        return n;

    ++n;
    if( 0 != ( pFont = (const SvxFontItem*)rPool.GetPoolDefaultItem(
                                                        RES_CHRATR_FONT )))
    {
        if( rFont == *pFont )
            return n;
        ++n;
    }

    USHORT nMaxItem = rPool.GetItemCount( RES_CHRATR_FONT );
    for( USHORT nGet = 0; nGet < nMaxItem; ++nGet )
        if( 0 != (pFont = (const SvxFontItem*)rPool.GetItem(
            RES_CHRATR_FONT, nGet )) )
        {
            if( rFont == *pFont )
                return n;
            ++n;
        }

    ASSERT( !this, "Font nicht in der Tabelle" );
    return 0;
}

USHORT SwWW8Writer::GetId( const Font& rFont ) const
{
    return GetId( SvxFontItem( rFont.GetFamily(), rFont.GetName(),
                                rFont.GetStyleName(), rFont.GetPitch(),
                                rFont.GetCharSet() ) );
}

static void _OutFont( SwWW8Writer& rWrt, const SvxFontItem& rFont )
{
    BYTE aWW8_FFN[ 6 ];
    memset( aWW8_FFN, 0, 6 );                       // 6 == len of fixed Part
    if( rWrt.bWrtWW8 )
        aWW8_FFN[0] = (BYTE)( 6 - 1 + 0x22 + ( 2 *
                                    ( 1 + rFont.GetFamilyName().Len() ) ));
    else
        aWW8_FFN[0] = (BYTE)( 6 - 1 + 1 + rFont.GetFamilyName().Len() );

    BYTE aB = 0;
    switch( rFont.GetPitch() )
    {
    case PITCH_VARIABLE: aB |= 2; break;    // aF.prg = 2
    case PITCH_FIXED:    aB |= 1; break;
    default:             break;         // aF.prg = 0 : DEFAULT_PITCH (windows.h)
    }
    aB |= 1 << 2;                       // aF.fTrueType = 1; weiss ich nicht besser;

    switch( rFont.GetFamily() )
    {
    case FAMILY_ROMAN:      aB |= 1 << 4; break; // aF.ff = 1;
    case FAMILY_SWISS:      aB |= 2 << 4; break; // aF.ff = 2;
    case FAMILY_MODERN:     aB |= 3 << 4; break; // aF.ff = 3;
    case FAMILY_SCRIPT:     aB |= 4 << 4; break; // aF.ff = 4;
    case FAMILY_DECORATIVE: aB |= 5 << 4; break; // aF.ff = 5;
    default:                              break; // aF.ff = 0; FF_DONTCARE (windows.h)
    }
    aWW8_FFN[1] = aB;

    ShortToSVBT16( 400, &aWW8_FFN[2] );         // weiss ich nicht besser
                                                // 400 == FW_NORMAL (windows.h)
    if( RTL_TEXTENCODING_SYMBOL == rFont.GetCharSet() )
        aWW8_FFN[4] = 2;
    else
        aWW8_FFN[4] = 0;

    rWrt.pTableStrm->Write( aWW8_FFN, 6 );                  // fixed part
    if( rWrt.bWrtWW8 )
    {
        // ab Ver8 sind folgende beiden Felder eingeschoben,
        // werden von uns ignoriert.
        //char  panose[ 10 ];       //  0x6   PANOSE
        //char  fs[ 24     ];       //  0x10  FONTSIGNATURE
        SwWW8Writer::FillCount( *rWrt.pTableStrm, 0x22 );
        SwWW8Writer::WriteString16( *rWrt.pTableStrm, rFont.GetFamilyName(),
                                    TRUE );
    }
    else
        SwWW8Writer::WriteString8( *rWrt.pTableStrm, rFont.GetFamilyName(),
                                    TRUE, RTL_TEXTENCODING_MS_1252 );
}

void SwWW8Writer::OutFontTab( WW8Fib& rFib )
{
    rFib.fcSttbfffn = pTableStrm->Tell();
    if( bWrtWW8 )
    {
        SwWW8Writer::WriteLong( *pTableStrm, 0 );       // hier wird Laenge nachgetragen ( cbFFN )

        // ab Ver8 sind folgende beiden Felder eingeschoben,
        // werden von uns ignoriert.
        //char  panose[ 10 ];       //  0x6   PANOSE
        //char  fs[ 24     ];       //  0x10  FONTSIGNATURE

        static BYTE __READONLY_DATA aBase_10[] = {
                    0x47,0x16,0x90,0x01,0x00,0x00 };
        static BYTE __READONLY_DATA aBase_11[] = {
            'T',0,'i',0,'m',0,'e',0,'s',0,' ',0,
            'N',0,'e',0,'w',0,' ',0,'R',0,'o',0,'m',0,'a',0,'n',0,0,0 };

        static BYTE __READONLY_DATA aBase_20[] = {
                    0x35,0x16,0x90,0x01,0x02,0x00 };
        static BYTE __READONLY_DATA aBase_21[] = {
            'S',0,'y',0,'m',0,'b',0,'o',0,'l',0,0,0 };

        static BYTE __READONLY_DATA aBase_30[] = {
                    0x33,0x26,0x90,0x01,0x00,0x00 };
        static BYTE __READONLY_DATA aBase_31[] = {
            'A',0,'r',0,'i',0,'a',0,'l',0,0,0 };

        // Base part
        pTableStrm->Write( aBase_10, sizeof( aBase_10 ) );
        SwWW8Writer::FillCount( *pTableStrm, 0x22 );
        pTableStrm->Write( aBase_11, sizeof( aBase_11 ) );

        pTableStrm->Write( aBase_20, sizeof( aBase_20 ) );
        SwWW8Writer::FillCount( *pTableStrm, 0x22 );
        pTableStrm->Write( aBase_21, sizeof( aBase_21 ) );

        pTableStrm->Write( aBase_30, sizeof( aBase_30 ) );
        SwWW8Writer::FillCount( *pTableStrm, 0x22 );
        pTableStrm->Write( aBase_31, sizeof( aBase_31 ) );
    }
    else
    {
        SwWW8Writer::WriteShort( *pTableStrm, 0 );      // hier wird Laenge nachgetragen ( cbFFN )

        static BYTE __READONLY_DATA aBase[] = {
            0x15,0x16,0x90,0x01,0x00,0x00,'T','i','m','e','s',' ',
                                    'N','e','w',' ','R','o','m','a','n',0,
            0x0c,0x16,0x90,0x01,0x02,0x00,'S','y','m','b','o','l',0,
            0x0b,0x26,0x90,0x01,0x00,0x00,'A','r','i','a','l',0 };
        pTableStrm->Write( aBase, sizeof( aBase ) );        // Base part
    }

    const SfxItemPool& rPool = pDoc->GetAttrPool();
    const SvxFontItem* pFont = (const SvxFontItem*)GetDfltAttr( RES_CHRATR_FONT );
    const SvxFontItem* pDfltFont = (const SvxFontItem*)rPool.GetPoolDefaultItem(
                                    RES_CHRATR_FONT );

    _OutFont( *this, *pFont );
    USHORT nFontCount = 4;

    if( pDfltFont )
    {
        _OutFont( *this, *pDfltFont );
        ++nFontCount;
    }

    USHORT nMaxItem = rPool.GetItemCount( RES_CHRATR_FONT );
    for( USHORT nGet = 0; nGet < nMaxItem; ++nGet )
    {
        pFont = (const SvxFontItem*)rPool.GetItem( RES_CHRATR_FONT, nGet );
        if( pFont )
        {
            _OutFont( *this, *pFont );
            ++nFontCount;
        }
    }
    rFib.lcbSttbfffn = pTableStrm->Tell() - rFib.fcSttbfffn;
    if( bWrtWW8 )
        SwWW8Writer::WriteLong( *pTableStrm, rFib.fcSttbfffn, nFontCount );
    else
        SwWW8Writer::WriteShort( *pTableStrm, rFib.fcSttbfffn,
                                (INT16)pFib->lcbSttbfffn );
}


/*  */

WW8_WrPlc0::WW8_WrPlc0( ULONG nOffset )
    : aPos( 4, 4 ), nOfs( nOffset )
{
}

void WW8_WrPlc0::Append( ULONG nStartCpOrFc )
{
    aPos.Insert( nStartCpOrFc - nOfs, aPos.Count() );
}

void WW8_WrPlc0::Write( SvStream& rStrm )
{
    USHORT nLen = aPos.Count();
    for( USHORT i = 0; i < nLen; ++i )
    {
        SVBT32 nP;
        LongToSVBT32( aPos[i], nP );
        rStrm.Write( nP, 4 );
    }
}

//------------------------------------------------------------------------------

/*  */
//------------------------------------------------------------------------------
// class WW8_WrPlcSepx : Uebersetzung PageDescs in Sections
//      behandelt auch Header und Footer
//------------------------------------------------------------------------------

WW8_WrPlcSepx::WW8_WrPlcSepx()
    : pTxtPos( 0 ), aCps( 4, 4 ), aSects( 4, 4 ), pAttrs( 0 )
{
}

WW8_WrPlcSepx::~WW8_WrPlcSepx()
{
    USHORT nLen = aSects.Count();
    if( pAttrs )
    {
        while( nLen )
        {
            delete[] pAttrs[ --nLen ].pData;
        }
        delete[] pAttrs;
    }
    delete pTxtPos;
}

void WW8_WrPlcSepx::AppendSep( WW8_CP nStartCp,
                               const SwPageDesc* pPd,
                               const SwSectionFmt* pSectionFmt,
                               ULONG nLnNumRestartNo )
{
    aCps.Insert( nStartCp, aCps.Count() );
    aSects.Insert( WW8_SepInfo( pPd, pSectionFmt, nLnNumRestartNo ),
                   aSects.Count() );
}

void WW8_WrPlcSepx::AppendSep( WW8_CP nStartCp, const SwFmtPageDesc& rPD,
                               const SwNode& rNd, ULONG nLnNumRestartNo )
{
    aCps.Insert( nStartCp, aCps.Count() );
    WW8_SepInfo aI( rPD.GetPageDesc(), 0, nLnNumRestartNo );
    aI.nPgRestartNo = rPD.GetNumOffset();
    aI.pPDNd = &rNd;
    aSects.Insert( aI, aSects.Count() );
}

// WW8_WrPlcSepx::SetNum() setzt in jeder Section beim 1. Aufruf den
// Num-Pointer, alle folgenden Aufrufe werden ignoriert. Damit wird
// die erste Aufzaehlung einer Section uebernommen.

void WW8_WrPlcSepx::SetNum( const SwTxtNode* pNumNd )
{
    WW8_SepInfo& rInfo = aSects[ aSects.Count() - 1 ];
    if( !rInfo.pNumNd ) // noch nicht belegt
        rInfo.pNumNd = pNumNd;
}

void WW8_WrPlcSepx::WriteOlst( SwWW8Writer& rWrt, USHORT i )
{
    if( !rWrt.bWrtWW8 )
    {
        const SwNumRule* pRule;
        const SwTxtNode* pNd = aSects[i].pNumNd;
        if( pNd && 0 != ( pRule = pNd->GetNumRule() ))
            rWrt.Out_Olst( *pRule );
    }
}


void WW8_WrPlcSepx::WriteFtnEndTxt( SwWW8Writer& rWrt, ULONG nCpStt )
{
    BYTE nInfoFlags = 0;
    const SwFtnInfo& rInfo = rWrt.pDoc->GetFtnInfo();
    if( rInfo.aErgoSum.Len() )  nInfoFlags |= 0x02;
    if( rInfo.aQuoVadis.Len() ) nInfoFlags |= 0x04;

    BYTE nEmptyStt = rWrt.bWrtWW8 ? 0 : 6;
    if( nInfoFlags )
    {
        if( rWrt.bWrtWW8 )
            pTxtPos->Append( nCpStt );  // empty footenote separator

        if( 0x02 & nInfoFlags )         // Footenote contiunation separator
        {
            pTxtPos->Append( nCpStt );
            rWrt.WriteStringAsPara( rInfo.aErgoSum );
            rWrt.WriteStringAsPara( aEmptyStr );
            nCpStt = rWrt.Fc2Cp( rWrt.Strm().Tell() );
        }
        else if( rWrt.bWrtWW8 )
            pTxtPos->Append( nCpStt );

        if( 0x04 & nInfoFlags )         // Footenote contiunation notice
        {
            pTxtPos->Append( nCpStt );
            rWrt.WriteStringAsPara( rInfo.aQuoVadis );
            rWrt.WriteStringAsPara( aEmptyStr );
            nCpStt = rWrt.Fc2Cp( rWrt.Strm().Tell() );
        }
        else if( rWrt.bWrtWW8 )
            pTxtPos->Append( nCpStt );

        if( rWrt.bWrtWW8 )
            nEmptyStt = 3;
        else
            rWrt.pDop->grpfIhdt = nInfoFlags;
    }

    while( 6 > nEmptyStt++ )
        pTxtPos->Append( nCpStt );

    // gleich die Flags am Dop setzen
    WW8Dop& rDop = *rWrt.pDop;
    // Footnote Info
    switch( rInfo.eNum )
    {
    case FTNNUM_PAGE:       rDop.rncFtn = 2; break;
    case FTNNUM_CHAPTER:    rDop.rncFtn  = 1; break;
    default: rDop.rncFtn  = 0; break;
    }                                   // rncFtn
    rDop.nfcFtnRef = SwWW8Writer::GetNumId( rInfo.aFmt.eType );
    rDop.nFtn = rInfo.nFtnOffset + 1;
    rDop.fpc = rWrt.bFtnAtTxtEnd ? 2 : 1;

    // Endnote Info
    rDop.rncEdn = 0;                        // rncEdn: Don't Restart
    const SwEndNoteInfo& rEndInfo = rWrt.pDoc->GetEndNoteInfo();
    rDop.nfcEdnRef = SwWW8Writer::GetNumId( rEndInfo.aFmt.eType );
    rDop.nEdn = rEndInfo.nFtnOffset + 1;
    rDop.epc = rWrt.bEndAtTxtEnd ? 3 : 0;
}


void WW8_WrPlcSepx::SetHeaderFlag( BYTE& rHeadFootFlags, const SwFmt& rFmt,
                                   BYTE nFlag )
{
    const SfxPoolItem* pItem;
    if( SFX_ITEM_SET == rFmt.GetItemState( RES_HEADER, TRUE, &pItem )
        && ((SwFmtHeader*)pItem)->IsActive() &&
        ((SwFmtHeader*)pItem)->GetHeaderFmt() )
        rHeadFootFlags |= nFlag;
}
void WW8_WrPlcSepx::SetFooterFlag( BYTE& rHeadFootFlags, const SwFmt& rFmt,
                                   BYTE nFlag )
{
    const SfxPoolItem* pItem;
    if( SFX_ITEM_SET == rFmt.GetItemState( RES_FOOTER, TRUE, &pItem )
        && ((SwFmtFooter*)pItem)->IsActive() &&
        ((SwFmtFooter*)pItem)->GetFooterFmt() )
        rHeadFootFlags |= nFlag;
}

void WW8_WrPlcSepx::OutHeader( SwWW8Writer& rWrt, const SwFmt& rFmt,
                                ULONG& rCpPos, BYTE nHFFlags, BYTE nFlag )
{
    if( nFlag & nHFFlags )
    {
        const SwFmtHeader& rHd = rFmt.GetHeader();
        ASSERT( rHd.GetHeaderFmt(), "KopfText nicht richtig da" );
        const SwFmtCntnt& rCntnt = rHd.GetHeaderFmt()->GetCntnt();
        pTxtPos->Append( rCpPos );
        rWrt.WriteKFTxt1( rCntnt );
        rWrt.WriteStringAsPara( aEmptyStr ); // CR ans Ende ( sonst mault WW )
        rCpPos = rWrt.Fc2Cp( rWrt.Strm().Tell() );
    }
    else if( rWrt.bWrtWW8 )
        pTxtPos->Append( rCpPos );
}
void WW8_WrPlcSepx::OutFooter( SwWW8Writer& rWrt, const SwFmt& rFmt,
                                ULONG& rCpPos, BYTE nHFFlags, BYTE nFlag )
{
    if( nFlag & nHFFlags )
    {
        const SwFmtFooter& rFt = rFmt.GetFooter();
        ASSERT( rFt.GetFooterFmt(), "KopfText nicht richtig da" );
        const SwFmtCntnt& rCntnt = rFt.GetFooterFmt()->GetCntnt();
        pTxtPos->Append( rCpPos );
        rWrt.WriteKFTxt1( rCntnt );
        rWrt.WriteStringAsPara( aEmptyStr ); // CR ans Ende ( sonst mault WW )
        rCpPos = rWrt.Fc2Cp( rWrt.Strm().Tell() );
    }
    else if( rWrt.bWrtWW8 )
        pTxtPos->Append( rCpPos );
}

void WW8_WrPlcSepx::CheckForFacinPg( SwWW8Writer& rWrt ) const
{
    // 2 Werte werden gesetzt
    //      Dop.fFacingPages            == Kopf-/Fusszeilen unterschiedlich
    //      Dop.fSwapBordersFacingPgs   == gespiegelte Raender
    for( USHORT i = 0, nEnde = 0; i < aSects.Count(); ++i )
    {
        WW8_SepInfo& rSepInfo = aSects[i];
        if( !rSepInfo.pSectionFmt )
        {
            const SwPageDesc* pPd = rSepInfo.pPageDesc;
            if( pPd->GetFollow() && pPd != pPd->GetFollow() &&
                pPd->GetFollow()->GetFollow() == pPd->GetFollow() &&
                rSepInfo.pPDNd &&
                pPd->IsFollowNextPageOfNode( *rSepInfo.pPDNd ) )
                // das ist also 1.Seite und nachfolgende, also nur den
                // follow beachten
                pPd = pPd->GetFollow();

            // left-/right chain of pagedescs ?
            else if( !( 1 & nEnde ) &&
                pPd->GetFollow() && pPd != pPd->GetFollow() &&
                pPd->GetFollow()->GetFollow() == pPd &&
                (( PD_LEFT == ( PD_ALL & pPd->ReadUseOn() ) &&
                   PD_RIGHT == ( PD_ALL & pPd->GetFollow()->ReadUseOn() )) ||
                 ( PD_RIGHT == ( PD_ALL & pPd->ReadUseOn() ) &&
                   PD_LEFT == ( PD_ALL & pPd->GetFollow()->ReadUseOn() )) ))
            {
                rWrt.pDop->fFacingPages = rWrt.pDop->fMirrorMargins = TRUE;
                nEnde |= 1;
            }

            if( !( 1 & nEnde ) &&
                ( !pPd->IsHeaderShared() || !pPd->IsFooterShared() ))
            {
                rWrt.pDop->fFacingPages = TRUE;
                nEnde |= 1;
            }
            if( !( 2 & nEnde ) &&
                PD_MIRROR == ( PD_MIRROR & pPd->ReadUseOn() ))
            {
                rWrt.pDop->fSwapBordersFacingPgs = rWrt.pDop->fMirrorMargins = TRUE;
                nEnde |= 2;
            }

            if( 3 == nEnde )
                break;      // weiter brauchen wird nicht
        }
    }
}


int WW8_WrPlcSepx::HasBorderItem( const SwFmt& rFmt )
{
    const SfxPoolItem* pItem;
    return SFX_ITEM_SET == rFmt.GetItemState( RES_BOX,TRUE, &pItem ) &&
            (   ((SvxBoxItem*)pItem)->GetTop() ||
                ((SvxBoxItem*)pItem)->GetBottom()  ||
                ((SvxBoxItem*)pItem)->GetLeft()  ||
                ((SvxBoxItem*)pItem)->GetRight() );
}

void WW8_WrPlcSepx::WriteKFTxt( SwWW8Writer& rWrt )
{
    pAttrs = new WW8_PdAttrDesc[ aSects.Count() ];
    WW8Bytes* pO = rWrt.pO;
    ULONG nCpStart = rWrt.Fc2Cp( rWrt.Strm().Tell() );
    BOOL bOldPg = rWrt.bOutPageDescs;
    rWrt.bOutPageDescs = TRUE;

    ASSERT( !pTxtPos, "wer hat den Pointer gesetzt?" );
    pTxtPos = new WW8_WrPlc0( nCpStart );

    WriteFtnEndTxt( rWrt, nCpStart );
    CheckForFacinPg( rWrt );

    WW8Bytes aLineNum;
    const SwLineNumberInfo& rLnNumInfo = rWrt.pDoc->GetLineNumberInfo();
    if( rLnNumInfo.IsPaintLineNumbers() )
    {
        // sprmSNLnnMod - activate Line Numbering and define Modulo
        if( rWrt.bWrtWW8 )
            SwWW8Writer::InsUInt16( aLineNum, 0x5015 );
        else
            aLineNum.Insert( 154, aLineNum.Count() );
        SwWW8Writer::InsUInt16( aLineNum, (UINT16)rLnNumInfo.GetCountBy() );

        // sprmSDxaLnn - xPosition of Line Number
        if( rWrt.bWrtWW8 )
            SwWW8Writer::InsUInt16( aLineNum, 0x9016 );
        else
            aLineNum.Insert( 155, aLineNum.Count() );
        SwWW8Writer::InsUInt16( aLineNum, (UINT16)rLnNumInfo.GetPosFromLeft() );

        //
    }

    USHORT i;
    for( i = 0; i < aSects.Count(); ++i )
    {
        WW8_PdAttrDesc* pA = pAttrs + i;
        WW8_SepInfo& rSepInfo = aSects[i];
        const SwPageDesc* pPd = rSepInfo.pPageDesc;

        if( rSepInfo.pSectionFmt && !pPd )
            pPd = &rWrt.pDoc->GetPageDesc(0);

        rWrt.pAktPageDesc = pPd;
        pA->nSepxFcPos = 0xffffffff;                // Default: none

        if( !pPd )
        {
            pA->pData = 0;
            pA->nLen  = 0;
            continue;
        }

        pO->Remove( 0, pO->Count() );       // leeren
        rWrt.bOutPageDescs = TRUE;


        if( aLineNum.Count() )
        {
            pO->Insert( &aLineNum, pO->Count() );

            // sprmSLnc - restart number: 0 per page, 1 per section, 2 never restart
            if( rSepInfo.nLnNumRestartNo || !rLnNumInfo.IsRestartEachPage() )
            {
                if( rWrt.bWrtWW8 )
                    SwWW8Writer::InsUInt16( *pO, 0x3013 );
                else
                    pO->Insert( 152, pO->Count() );
                pO->Insert( rSepInfo.nLnNumRestartNo ? 1 : 2, pO->Count() );
            }

            // sprmSLnnMin - Restart the Line Number with given value
            if( rSepInfo.nLnNumRestartNo )
            {
                if( rWrt.bWrtWW8 )
                    SwWW8Writer::InsUInt16( *pO, 0x501B );
                else
                    pO->Insert( 160, pO->Count() );
                SwWW8Writer::InsUInt16( *pO, (UINT16)rSepInfo.nLnNumRestartNo - 1 );
            }
        }


        /*  sprmSBkc, break code:   0 No break, 1 New column
                                    2 New page, 3 Even page, 4 Odd page
        */
        BYTE nBreakCode = 2;            // default neue Seite beginnen
        BOOL bOutPgDscSet = TRUE, bLeftRightPgChain = FALSE;
        const SwFrmFmt* pPdFmt = &pPd->GetMaster();
        const SwFrmFmt* pPdFirstPgFmt = pPdFmt;
        if( rSepInfo.pSectionFmt )
        {
            // ist pSectionFmt gesetzt, dann gab es einen SectionNode
            //  gueltiger Pointer -> Section beginnt,
            //  0xfff -> Section wird beendet
            nBreakCode = 0;         // fortlaufender Abschnitt
            if( (SwSectionFmt*)0xFFFFFFFF != rSepInfo.pSectionFmt )
            {
                // Itemset erzeugen, das das PgDesk-AttrSet beerbt:
                // als Nachkomme wird bei 'deep'-Out_SfxItemSet
                // auch der Vorfahr abgeklappert
                const SfxItemSet* pPdSet = &pPdFmt->GetAttrSet();
                SfxItemSet aSet( *pPdSet->GetPool(), pPdSet->GetRanges() );
                aSet.SetParent( pPdSet );

                // am Nachkommen NUR  die Spaltigkeit gemaess Sect-Attr. umsetzen
                aSet.Put( rSepInfo.pSectionFmt->GetAttr( RES_COL ) );

                // und raus damit ins WW-File
                const SfxItemSet* pOldI = rWrt.pISet;
                rWrt.pISet = &aSet;
                Out_SfxItemSet( aWW8AttrFnTab, rWrt, aSet, TRUE );
                rWrt.pISet = pOldI;

                bOutPgDscSet = FALSE;
            }
        }

        if( bOutPgDscSet )
        {
            // es ist ein Follow gesetzt und dieser zeigt nicht auf sich
            // selbst, so liegt eine Seitenverkettung vor.
            // Falls damit eine "Erste Seite" simuliert werden soll, so
            // koennen wir das auch als solches schreiben.
            // Anders sieht es mit Links/Rechts wechseln aus. Dafuer muss
            // erkannt werden, wo der Seitenwechsel statt findet. Hier ist
            // es aber dafuer zuspaet!
            if( pPd->GetFollow() && pPd != pPd->GetFollow() &&
                pPd->GetFollow()->GetFollow() == pPd->GetFollow() &&
                rSepInfo.pPDNd &&
                pPd->IsFollowNextPageOfNode( *rSepInfo.pPDNd ) )
            {
                if( rSepInfo.pPDNd )
                    pPdFirstPgFmt = pPd->GetPageFmtOfNode( *rSepInfo.pPDNd );
                else
                    pPdFirstPgFmt = &pPd->GetMaster();

                rWrt.pAktPageDesc = pPd = pPd->GetFollow();
                pPdFmt = &pPd->GetMaster();

                // sprmSFTitlePage
                if( rWrt.bWrtWW8 )
                    SwWW8Writer::InsUInt16( *pO, 0x300A );
                else
                    pO->Insert( 143, pO->Count() );
                pO->Insert( 1, pO->Count() );
            }

            const SfxItemSet* pOldI = rWrt.pISet;

            if( rWrt.bWrtWW8 )              // Seitenumrandung schreiben
            {
                USHORT nPgBorder = HasBorderItem( *pPdFmt ) ? 0 : USHRT_MAX;
                if( pPdFmt != pPdFirstPgFmt )
                {
                    if( HasBorderItem( *pPdFirstPgFmt ))
                    {
                        if( USHRT_MAX == nPgBorder )
                        {
                            nPgBorder = 1;
                            // nur die 1. Seite umrandet -> BoxItem aus dem
                            // richtigen Format besorgen
                            rWrt.pISet = &pPdFirstPgFmt->GetAttrSet();
                            Out( aWW8AttrFnTab, pPdFirstPgFmt->GetAttr(
                                        RES_BOX ), rWrt );
                        }
                    }
                    else if( !nPgBorder )
                        nPgBorder = 2;
                }

                if( USHRT_MAX != nPgBorder )
                {
                    // Flag und das Border Attribut schreiben
                    SwWW8Writer::InsUInt16( *pO, 0x522F );
                    SwWW8Writer::InsUInt16( *pO, nPgBorder );
                }
            }

            const SfxPoolItem* pItem;
            if( pPdFmt != pPdFirstPgFmt && SFX_ITEM_SET ==
                pPdFirstPgFmt->GetItemState( RES_PAPER_BIN, TRUE, &pItem ))
            {
                rWrt.pISet = &pPdFirstPgFmt->GetAttrSet();
                rWrt.bOutFirstPage = TRUE;
                Out( aWW8AttrFnTab, *pItem, rWrt );
                rWrt.bOutFirstPage = FALSE;
            }


            // left-/right chain of pagedescs ?
            if( pPd->GetFollow() && pPd != pPd->GetFollow() &&
                pPd->GetFollow()->GetFollow() == pPd &&
                (( PD_LEFT == ( PD_ALL & pPd->ReadUseOn() ) &&
                   PD_RIGHT == ( PD_ALL & pPd->GetFollow()->ReadUseOn() )) ||
                 ( PD_RIGHT == ( PD_ALL & pPd->ReadUseOn() ) &&
                   PD_LEFT == ( PD_ALL & pPd->GetFollow()->ReadUseOn() )) ))
            {
                bLeftRightPgChain = TRUE;

                // welches ist der Bezugspunkt ????? (links oder rechts?)
                // annahme die rechte Seite!
                if( PD_LEFT == ( PD_ALL & pPd->ReadUseOn() ))
                {
                    nBreakCode = 3;
                    pPd = pPd->GetFollow();
                    pPdFmt = &pPd->GetMaster();
                }
                else
                    nBreakCode = 4;
            }

            rWrt.pISet = &pPdFmt->GetAttrSet();
            Out_SfxItemSet( aWW8AttrFnTab, rWrt, pPdFmt->GetAttrSet(),
                                TRUE, FALSE );
            rWrt.pISet = pOldI;

            // dann noch die restlichen Einstellungen aus dem PageDesc

            // sprmSNfcPgn
            BYTE nb = SwWW8Writer::GetNumId( pPd->GetNumType().eType );
            if( rWrt.bWrtWW8 )
                SwWW8Writer::InsUInt16( *pO, 0x300E );
            else
                pO->Insert( 147, pO->Count() );
            pO->Insert( nb, pO->Count() );

//???           const SwPageFtnInfo& rFtnInfo = pPd->GetFtnInfo();

            if( rSepInfo.nPgRestartNo )
            {
                // sprmSFPgnRestart
                if( rWrt.bWrtWW8 )
                    SwWW8Writer::InsUInt16( *pO, 0x3011 );
                else
                    pO->Insert( 150, pO->Count() );
                pO->Insert( 1, pO->Count() );
                // sprmSPgnStart
                if( rWrt.bWrtWW8 )
                    SwWW8Writer::InsUInt16( *pO, 0x501C );
                else
                    pO->Insert( 161, pO->Count() );
                SwWW8Writer::InsUInt16( *pO, rSepInfo.nPgRestartNo );
            }

            // werden es nur linke oder nur rechte Seiten?
            if( 2 == nBreakCode )
            {
                if( PD_LEFT == ( PD_ALL & pPd->ReadUseOn() ))
                    nBreakCode = 3;
                else if( PD_RIGHT == ( PD_ALL & pPd->ReadUseOn() ))
                    nBreakCode = 4;
            }
        }

        if( 2 != nBreakCode )           // neue Seite ist default
        {
            if( rWrt.bWrtWW8 )
                SwWW8Writer::InsUInt16( *pO, 0x3009 );
            else
                pO->Insert( 142, pO->Count() );
            pO->Insert( nBreakCode, pO->Count() );
        }

        WriteOlst( rWrt, i );


        // Header oder Footer
        BYTE nHeadFootFlags = 0;

        const SwFrmFmt* pPdLeftFmt = bLeftRightPgChain
                                        ? &pPd->GetFollow()->GetMaster()
                                        : &pPd->GetLeft();

        SetHeaderFlag( nHeadFootFlags, *pPdFmt, WW8_HEADER_ODD );
        SetFooterFlag( nHeadFootFlags, *pPdFmt, WW8_FOOTER_ODD );
        if( !pPd->IsHeaderShared() || bLeftRightPgChain )
            SetHeaderFlag( nHeadFootFlags, *pPdLeftFmt, WW8_HEADER_EVEN );
        if( !pPd->IsFooterShared() || bLeftRightPgChain )
            SetFooterFlag( nHeadFootFlags, *pPdLeftFmt, WW8_FOOTER_EVEN );
        if( pPdFmt != pPdFirstPgFmt )
        {
            // es gibt eine ErsteSeite:
            SetHeaderFlag( nHeadFootFlags, *pPdFirstPgFmt, WW8_HEADER_FIRST );
            SetFooterFlag( nHeadFootFlags, *pPdFirstPgFmt, WW8_FOOTER_FIRST );
        }

        if( nHeadFootFlags && !rWrt.bWrtWW8 )
        {
            BYTE nTmpFlags = nHeadFootFlags;
            if( rWrt.pDop->fFacingPages )
            {
                if( !(nTmpFlags & WW8_FOOTER_EVEN) &&
                    (nTmpFlags & WW8_FOOTER_ODD ) )
                    nTmpFlags |= WW8_FOOTER_EVEN;

                if( !(nTmpFlags & WW8_HEADER_EVEN) &&
                    (nTmpFlags & WW8_HEADER_ODD ) )
                    nTmpFlags |= WW8_HEADER_EVEN;
            }

            // sprmSGprfIhdt, wird nur noch im WW95 benoetigt
            pO->Insert( 153, pO->Count() );
            pO->Insert( nTmpFlags, pO->Count() );
        }

        if( pO->Count() )
        {                   // waren Attrs vorhanden ?
            pA->nLen = pO->Count();
            pA->pData = new BYTE [pO->Count()];
            memcpy( pA->pData, pO->GetData(), pO->Count() );    // -> merken
            pO->Remove( 0, pO->Count() );       // leeren fuer HdFt-Text
        }
        else
        {                               // keine Attrs da
            pA->pData = 0;
            pA->nLen = 0;
        }

/*
!!!!!!!!!!!
            // Umrandungen an Kopf- und Fusstexten muessten etwa so gehen:
            // Dabei muss etwas wie pOut eingebaut werden,
            // das bei jeder Spezialtext-Zeile wiederholt wird.
            const SwFrmFmt* pFFmt = rFt.GetFooterFmt();
            const SvxBoxItem& rBox = pFFmt->GetBox(FALSE);
            OutWW8_SwFmtBox1( rWrt.pOut, rBox, FALSE );
!!!!!!!!!!!
        Man koennt daraus Absatzattribute machen, die dann bei jedem Absatz
        beachtet werden. Gilt fuer Hintergrund/Umrandung
!!!!!!!!!!!
*/

        ULONG nCpPos = rWrt.Fc2Cp( rWrt.Strm().Tell() );
        if( !(nHeadFootFlags & WW8_HEADER_EVEN) && rWrt.pDop->fFacingPages )
            OutHeader( rWrt, *pPdFmt, nCpPos, nHeadFootFlags, WW8_HEADER_ODD );
        else
            OutHeader( rWrt, *pPdLeftFmt, nCpPos, nHeadFootFlags, WW8_HEADER_EVEN );
        OutHeader( rWrt, *pPdFmt, nCpPos, nHeadFootFlags, WW8_HEADER_ODD );

        if( !(nHeadFootFlags & WW8_FOOTER_EVEN) && rWrt.pDop->fFacingPages )
            OutFooter( rWrt, *pPdFmt, nCpPos, nHeadFootFlags, WW8_FOOTER_ODD );
        else
            OutFooter( rWrt, *pPdLeftFmt, nCpPos, nHeadFootFlags, WW8_FOOTER_EVEN );
        OutFooter( rWrt, *pPdFmt, nCpPos, nHeadFootFlags, WW8_FOOTER_ODD );

        OutHeader( rWrt, *pPdFirstPgFmt, nCpPos, nHeadFootFlags, WW8_HEADER_FIRST );
        OutFooter( rWrt, *pPdFirstPgFmt, nCpPos, nHeadFootFlags, WW8_FOOTER_FIRST );
    }

    if( pTxtPos->Count() )
    {
        // HdFt vorhanden ?
        ULONG nCpEnd = rWrt.Fc2Cp( rWrt.Strm().Tell() );
        pTxtPos->Append( nCpEnd );  // Ende letzter Hd/Ft fuer PlcfHdd

        if( nCpEnd > nCpStart )
        {
            ++nCpEnd;
            pTxtPos->Append( nCpEnd + 1 );  // Ende letzter Hd/Ft fuer PlcfHdd

            rWrt.WriteStringAsPara( aEmptyStr ); // CR ans Ende ( sonst mault WW )
        }
        rWrt.pFldHdFt->Finish( nCpEnd, rWrt.pFib->ccpText + rWrt.pFib->ccpFtn );
        rWrt.pFib->ccpHdr = nCpEnd - nCpStart;
    }
    else
        delete pTxtPos, pTxtPos = 0;

    rWrt.bOutPageDescs = bOldPg;
}


void WW8_WrPlcSepx::WriteSepx( SvStream& rStrm ) const
{
    USHORT i;
    for( i = 0; i < aSects.Count(); i++ ) // ueber alle Sections
    {
        WW8_PdAttrDesc* pA = pAttrs + i;
        if( pA->nLen )
        {
            SVBT16 nL;
            pA->nSepxFcPos = rStrm.Tell();
            ShortToSVBT16( pA->nLen, nL );
            rStrm.Write( nL, 2 );
            rStrm.Write( pA->pData, pA->nLen );
        }
    }
}


void WW8_WrPlcSepx::WritePlcSed( SwWW8Writer& rWrt ) const
{
    ASSERT( aCps.Count() == aSects.Count() + 1, "WrPlcSepx: DeSync" );
    ULONG nFcStart = rWrt.pTableStrm->Tell();

    USHORT i;
    // ( ueber alle Sections )
    for( i = 0; i <= aSects.Count(); i++ )
    {
        UINT32 nP = aCps[i];
        SVBT32 nPos;
        LongToSVBT32( nP, nPos );
        rWrt.pTableStrm->Write( nPos, 4 );
    }

    static WW8_SED aSed = { 4, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, 0xff, 0xff };

    // ( ueber alle Sections )
    for( i = 0; i < aSects.Count(); i++ )
    {
        WW8_PdAttrDesc* pA = pAttrs + i;
        LongToSVBT32( pA->nSepxFcPos, aSed.fcSepx );    // Sepx-Pos
        rWrt.pTableStrm->Write( &aSed, sizeof( aSed ) );
    }
    rWrt.pFib->fcPlcfsed = nFcStart;
    rWrt.pFib->lcbPlcfsed = rWrt.pTableStrm->Tell() - nFcStart;
}


void WW8_WrPlcSepx::WritePlcHdd( SwWW8Writer& rWrt ) const
{
    if( pTxtPos && pTxtPos->Count() )
    {
        rWrt.pFib->fcPlcfhdd = rWrt.pTableStrm->Tell();
        pTxtPos->Write( *rWrt.pTableStrm );             // Plc0
        rWrt.pFib->lcbPlcfhdd = rWrt.pTableStrm->Tell() -
                                rWrt.pFib->fcPlcfhdd;
    }
}

void SwWW8Writer::WriteKFTxt1( const SwFmtCntnt& rCntnt )
{
    SwNodePtr pNode;

    if( rCntnt.GetCntntIdx() )
        pNode = pDoc->GetNodes()[ rCntnt.GetCntntIdx()->GetIndex()+1 ];
    else
        pNode = 0;

    if( pNode )
    {
        // Hole vom Node und vom letzten Node die Position in der Section
        ULONG nStart = pNode->StartOfSectionIndex()+1;
        ULONG nEnd = pNode->EndOfSectionIndex();

        // Bereich also gueltiger Node
        if( nStart < nEnd )
        {
            BOOL bOldKF = bOutKF;
            bOutKF = TRUE;
            WriteSpecialText( nStart, nEnd, TXT_HDFT );
            bOutKF = bOldKF;
        }
        else
            pNode = 0;
    }

    if( !pNode )
    {
        // es gibt keine Kopf-/Fusszeile, aber ein CR ist immer noch noetig
        ASSERT( pNode, "K/F-Text nicht richtig da" );
        WriteStringAsPara( aEmptyStr ); // CR ans Ende ( sonst mault WW )
    }
}

/*  */
//------------------------------------------------------------------------------
// class WW8_WrPlcFtnEdn : Sammeln der Fuss/Endnoten und Ausgeben der Texte
// und Plcs am Ende des Docs.
// WW8_WrPlcFtnEdn ist die Klasse fuer Fuss- und Endnoten
//------------------------------------------------------------------------------
WW8_WrPlcSubDoc::WW8_WrPlcSubDoc()
    : aCps( 0, 16 ), aCntnt( 0, 16 ), pTxtPos( 0 )
{
}

WW8_WrPlcSubDoc::~WW8_WrPlcSubDoc()
{
    delete pTxtPos;
}

void WW8_WrPlcFtnEdn::Append( WW8_CP nCp, const SwFmtFtn& rFtn )
{
    aCps.Insert( nCp, aCps.Count() );
    void* p = (void*)&rFtn;
    aCntnt.Insert( p, aCntnt.Count() );
}

void WW8_WrPlcPostIt::Append( WW8_CP nCp, const SwPostItField& rPostIt )
{
    aCps.Insert( nCp, aCps.Count() );
    void* p = (void*)&rPostIt;
    aCntnt.Insert( p, aCntnt.Count() );
}

void WW8_WrPlcSubDoc::WriteTxt( SwWW8Writer& rWrt, BYTE nTTyp,
                                long& rCount )
{
    USHORT nLen = aCntnt.Count();
    if( nLen )
    {
        ULONG nCpStart = rWrt.Fc2Cp( rWrt.Strm().Tell() );
        pTxtPos = new WW8_WrPlc0( nCpStart );
        USHORT i;

        switch( nTTyp )
        {
        case TXT_ATN:
            for( i = 0; i < nLen; i++ )
            {
                // Anfaenge fuer PlcfAtnTxt
                pTxtPos->Append( rWrt.Fc2Cp( rWrt.Strm().Tell() ));

                const SwPostItField& rPFld = *(SwPostItField*)aCntnt[ i ];
                rWrt.WritePostItBegin( rPFld );
                rWrt.WriteStringAsPara( rPFld.GetTxt() );
            }
            break;

        case TXT_TXTBOX:
        case TXT_HFTXTBOX:
            for( i = 0; i < nLen; i++ )
            {
                // textbox - content
                WW8_CP nCP = rWrt.Fc2Cp( rWrt.Strm().Tell() );
                aCps.Insert( nCP, i );
                pTxtPos->Append( nCP );

                // is it an writer or sdr - textbox?
                const SdrObject& rObj = *(SdrObject*)aCntnt[ i ];
                if( rObj.ISA( SdrTextObj ) )
                    rWrt.WriteSdrTextObj( rObj );
                else
                {
                    const SwFrmFmt* pFmt = ::FindFrmFmt( &rObj );
                    ASSERT( pFmt, "wo ist das Format geblieben?" );

                    const SwNodeIndex* pNdIdx = pFmt->GetCntnt().GetCntntIdx();
                    ASSERT( pNdIdx, "wo ist der StartNode der Textbox?" );
                    rWrt.WriteSpecialText( pNdIdx->GetIndex() + 1,
                                       pNdIdx->GetNode().EndOfSectionIndex(),
                                       nTTyp );
                }

                // CR at end of one textbox text ( otherwise WW gpft :-( )
                rWrt.WriteStringAsPara( aEmptyStr );
            }
            break;

        case TXT_EDN:
        case TXT_FTN:
            for( i = 0; i < nLen; i++ )
            {
                // Anfaenge fuer PlcfFtnTxt/PlcfEdnTxt
                pTxtPos->Append( rWrt.Fc2Cp( rWrt.Strm().Tell() ));

                // Noten-Inhalt
                const SwFmtFtn* pFtn = (SwFmtFtn*)aCntnt[ i ];
                rWrt.WriteFtnBegin( *pFtn );
                const SwNodeIndex* pIdx = pFtn->GetTxtFtn()->GetStartNode();
                ASSERT( pIdx, "wo ist der StartNode der Fuss-/EndNote?" );
                rWrt.WriteSpecialText( pIdx->GetIndex() + 1,
                                       pIdx->GetNode().EndOfSectionIndex(),
                                       nTTyp );
            }
            break;

        default:
            ASSERT( !this, "was ist das fuer ein SubDocType?" );
        }

        pTxtPos->Append( rWrt.Fc2Cp( rWrt.Strm().Tell() ));
        // CR ans Ende ( sonst mault WW )
        rWrt.WriteStringAsPara( aEmptyStr );

        ULONG nCpEnd = rWrt.Fc2Cp( rWrt.Strm().Tell() );
        pTxtPos->Append( nCpEnd );
        rCount = nCpEnd - nCpStart;
    }
}

void WW8_WrPlcSubDoc::WritePlc( SwWW8Writer& rWrt, BYTE nTTyp,
                                long& rTxtStart, long& rTxtCount,
                                long& rRefStart, long& rRefCount ) const
{
    ULONG nFcStart = rWrt.pTableStrm->Tell();
    USHORT nLen = aCps.Count();
    if( nLen )
    {
        ASSERT( aCps.Count() + 2 == pTxtPos->Count(), "WritePlc: DeSync" );

        SvStringsSortDtor aStrArr( 0, 4 );
        WW8Fib& rFib = *rWrt.pFib;              // n+1-te CP-Pos nach Handbuch
        USHORT i;
        BOOL bWriteCP = TRUE;

        switch( nTTyp )
        {
        case TXT_ATN:
            // then write first the GrpXstAtnOwners
            for( i = 0; i < nLen; ++i )
            {
                const SwPostItField& rPFld = *(SwPostItField*)aCntnt[ i ];
                String* p = new String( rPFld.GetPar1() );
                if( !aStrArr.Insert( p ))
                    delete p;
            }


            if( rWrt.bWrtWW8 )
                for( i = 0; i < aStrArr.Count(); ++i )
                {
                    const String& rStr = *aStrArr[ i ];
                    SwWW8Writer::WriteShort( *rWrt.pTableStrm, rStr.Len() );
                    SwWW8Writer::WriteString16( *rWrt.pTableStrm, rStr, FALSE );
                }
            else
                for( i = 0; i < aStrArr.Count(); ++i )
                {
                    const String& rStr = *aStrArr[ i ];
                    *rWrt.pTableStrm << (BYTE)rStr.Len();
                    SwWW8Writer::WriteString8( *rWrt.pTableStrm, rStr, FALSE,
                                                RTL_TEXTENCODING_MS_1252 );
                }

            rFib.fcGrpStAtnOwners = nFcStart;
            nFcStart = rWrt.pTableStrm->Tell();
            rFib.lcbGrpStAtnOwners = nFcStart - rFib.fcGrpStAtnOwners;
            break;

        case TXT_TXTBOX:
        case TXT_HFTXTBOX:
            {
                pTxtPos->Write( *rWrt.pTableStrm );
                const SvULongs* pShapeIds = GetShapeIdArr();
                ASSERT( pShapeIds, "wo sind die ShapeIds?" );

                // nLen = pTxtPos->Count();
                for( i = 0; i < nLen; ++i )
                {
                    // write textbox story - FTXBXS
                    // is it an writer or sdr - textbox?
                    const SdrObject* pObj = (SdrObject*)aCntnt[ i ];
                    INT32 nCnt = 1;
                    if( !pObj->ISA( SdrTextObj ) )
                    {
                        // find the "highest" SdrObject of this
                        const SwFrmFmt& rFmt = *::FindFrmFmt( pObj );

                        const SwFmtChain* pChn = &rFmt.GetChain();
                        while( pChn->GetNext() )
                        {
                            // has a chain?
                            // then calc the cur pos in the chain
                            ++nCnt;
                            pChn = &pChn->GetNext()->GetChain();
                        }
                    }
                    // long cTxbx / iNextReuse
                    SwWW8Writer::WriteLong( *rWrt.pTableStrm, nCnt );
                    // long cReusable
                    SwWW8Writer::WriteLong( *rWrt.pTableStrm, 0 );
                    // short fReusable
                    SwWW8Writer::WriteShort( *rWrt.pTableStrm, 0 );
                    // long reserved
                    SwWW8Writer::WriteLong( *rWrt.pTableStrm, -1 );
                    // long lid
                    SwWW8Writer::WriteLong( *rWrt.pTableStrm,
                                            (*pShapeIds)[i]);
                    // long txidUndo
                    SwWW8Writer::WriteLong( *rWrt.pTableStrm, 0 );
                }
                SwWW8Writer::FillCount( *rWrt.pTableStrm, 22 );
                bWriteCP = FALSE;
            }
            break;
        }

        if( bWriteCP )
        {
            // Schreibe CP-Positionen
            for( i = 0; i < nLen; i++ )
                SwWW8Writer::WriteLong( *rWrt.pTableStrm, aCps[ i ] );

            // n+1-te CP-Pos nach Handbuch
            SwWW8Writer::WriteLong( *rWrt.pTableStrm,
                                            rFib.ccpText + rFib.ccpFtn +
                                            rFib.ccpHdr + rFib.ccpEdn +
                                            rFib.ccpTxbx + rFib.ccpHdrTxbx + 1 );

            if( TXT_ATN == nTTyp )
            {
                USHORT nFndPos;
                for( i = 0; i < nLen; ++i )
                {
                    const SwPostItField& rPFld = *(SwPostItField*)aCntnt[ i ];
                    String sAuthor( rPFld.GetPar1() );
                    aStrArr.Seek_Entry( &sAuthor, &nFndPos );
                    BYTE nLen = (BYTE)sAuthor.Len();
                    if( nLen > 9 )
                    {
                        sAuthor.Erase( 9 );
                        nLen = 9;
                    }

                    // xstUsrInitl[ 10 ] pascal-style String holding initials
                    // of annotation author
                    if( rWrt.bWrtWW8 )
                    {
                        SwWW8Writer::WriteShort( *rWrt.pTableStrm, nLen );
                        SwWW8Writer::WriteString16( *rWrt.pTableStrm, sAuthor,
                                                    FALSE );
                        SwWW8Writer::FillCount( *rWrt.pTableStrm, (9 - nLen) * 2 );

                    }
                    else
                    {
                        *rWrt.pTableStrm << nLen;
                        SwWW8Writer::WriteString8( *rWrt.pTableStrm, sAuthor,
                                        FALSE, RTL_TEXTENCODING_MS_1252 );
                        SwWW8Writer::FillCount( *rWrt.pTableStrm, 9 - nLen );
                    }

                    //SVBT16 ibst;      // index into GrpXstAtnOwners
                    //SVBT16 ak;        // not used
                    //SVBT16 grfbmc;    // not used
                    //SVBT32 ITagBkmk;  // when not -1, this tag identifies the

                    SwWW8Writer::WriteShort( *rWrt.pTableStrm, nFndPos );
                    SwWW8Writer::WriteShort( *rWrt.pTableStrm, 0 );
                    SwWW8Writer::WriteShort( *rWrt.pTableStrm, 0 );
                    SwWW8Writer::WriteLong( *rWrt.pTableStrm, -1 );
                }
            }
            else
            {
                USHORT nNo = 0;
                for( i = 0; i < nLen; ++i )             // Schreibe Flags
                {
                    const SwFmtFtn* pFtn = (SwFmtFtn*)aCntnt[ i ];
                    SwWW8Writer::WriteShort( *rWrt.pTableStrm,
                                pFtn->GetNumStr().Len() ? 0 : ++nNo );
                }
            }
        }
        rRefStart = nFcStart;
        nFcStart = rWrt.pTableStrm->Tell();
        rRefCount = nFcStart - rRefStart;

        pTxtPos->Write( *rWrt.pTableStrm );

        switch( nTTyp )
        {
        case TXT_TXTBOX:
        case TXT_HFTXTBOX:
            for( i = 0; i < nLen; ++i )
            {
                // write break descriptor (BKD)
                // short itxbxs
                SwWW8Writer::WriteShort( *rWrt.pTableStrm, i );
                // short dcpDepend
                SwWW8Writer::WriteShort( *rWrt.pTableStrm, 0 );
                // short flags : icol/fTableBreak/fColumnBreak/fMarked/
                //               fUnk/fTextOverflow
                SwWW8Writer::WriteShort( *rWrt.pTableStrm, 0x800 );
            }
            SwWW8Writer::FillCount( *rWrt.pTableStrm, 6 );
            break;
        }

        rTxtStart = nFcStart;
        rTxtCount = rWrt.pTableStrm->Tell() - nFcStart;
    }
}

const SvULongs* WW8_WrPlcSubDoc::GetShapeIdArr() const
{
    return 0;
}

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ww8/wrtw8sty.cxx,v 1.1.1.1 2000-09-18 17:14:58 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.28  2000/09/18 16:04:58  willem.vandorp
      OpenOffice header added.

      Revision 1.27  2000/08/21 10:14:03  khz
      Export Line Numbering (restart on new section)

      Revision 1.26  2000/07/04 08:58:09  jp
      _OutFont: write zero terminated FontNames

      Revision 1.25  2000/05/12 16:14:02  jp
      Changes for Unicode

      Revision 1.24  2000/05/04 11:41:34  jp
      Bug #75550#: standard para.style must have a language sprm

      Revision 1.23  2000/01/25 20:09:30  jp
      Bug #72146#: convert stylenames only for W95 to ANSI

      Revision 1.22  1999/12/15 17:06:14  jp
      Bug #70913#: write Ftn-/EndNoteInfo - at end of section or page/doc

      Revision 1.21  1999/11/25 21:19:37  jp
      Bug #70134#: dont set def values by charstyles

      Revision 1.20  1999/11/22 18:26:11  jp
      export of TOX and TOX entries

      Revision 1.19  1999/11/12 16:07:16  jp
      write foot-/endnote attributes with correct charfmts

      Revision 1.18  1999/11/10 16:09:50  jp
      Bug #67922#: write header/footer for w95

      Revision 1.17  1999/10/22 14:11:01  jp
      Bug #69408#: if write SfxItemSet set the pointer at writerclass

      Revision 1.16  1999/10/14 21:06:05  jp
      Bug #68617#,#68705# and other little things

      Revision 1.15  1999/10/13 09:08:46  jp
      write character attributs of SdrObjects

      Revision 1.14  1999/10/11 10:58:59  jp
      Bug #69083#: set mirrormargin flag in dop

      Revision 1.13  1999/09/09 17:40:49  jp
      Bug #68628#: write startvalue of SwFtnInfo and SwEndNoteInfo

      Revision 1.12  1999/09/01 17:32:38  JP
      new: write the text of SdrTextObjects


      Rev 1.11   01 Sep 1999 19:32:38   JP
   new: write the text of SdrTextObjects

      Rev 1.10   30 Aug 1999 18:55:02   JP
   write cp's of foot-/endnotes

      Rev 1.9   24 Aug 1999 20:15:48   JP
   Escher Export

      Rev 1.8   16 Aug 1999 17:16:30   JP
   W97 Export: experimental escher export (1)

      Rev 1.7   21 Jul 1999 18:28:22   JP
   W97 Export: experimental escher export

      Rev 1.6   06 Jul 1999 14:54:04   JP
   W97-Export corrections

      Rev 1.5   30 Jun 1999 19:56:42   JP
   W97-Export: Fields/PostIts/References

      Rev 1.4   23 Jun 1999 12:46:16   JP
   Export of numbers und outlinenumbers

      Rev 1.3   16 Jun 1999 19:53:58   JP
   Change interface of base class Writer

      Rev 1.2   04 Jun 1999 17:47:56   JP
   WW97-Export: Code aufgeteilt

      Rev 1.1   21 May 1999 01:59:10   JP
   Export von WW97 Format: StyleSheets

      Rev 1.0   19 May 1999 19:35:16   JP
   WinWord97-ExportFilter

*************************************************************************/

diff --git a/sw/source/filter/ww8/wrtww8.cxx b/sw/source/filter/ww8/wrtww8.cxx
new file mode 100644
index 0000000..81ac65a
--- /dev/null
+++ b/sw/source/filter/ww8/wrtww8.cxx
@@ -0,0 +1,2226 @@
/*************************************************************************
 *
 *  $RCSfile: wrtww8.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:58 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PCH
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#define ITEMID_BOXINFO      SID_ATTR_BORDER_INNER

#include <string.h>             // memcpy()

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _SV_SALBTYPE_HXX
#include <vcl/salbtype.hxx>
#endif
#ifndef _SVSTOR_HXX
#include <so3/svstor.hxx>
#endif
#ifndef _ZFORMAT_HXX
#include <svtools/zformat.hxx>
#endif
#ifndef _SFXDOCINF_HXX
#include <sfx2/docinf.hxx>
#endif
#ifndef _SVX_TSPTITEM_HXX
#include <svx/tstpitem.hxx>
#endif
#ifndef _SVDMODEL_HXX
#include <svx/svdmodel.hxx>
#endif
#ifndef _SVDPAGE_HXX
#include <svx/svdpage.hxx>
#endif
#ifndef _SVX_HYZNITEM_HXX //autogen
#include <svx/hyznitem.hxx>
#endif

#if SUPD>593
#ifndef _MSOLEEXP_HXX
#include <svx/msoleexp.hxx>
#endif
#endif

#ifndef _OFA_FLTRCFG_HXX
#include <offmgr/fltrcfg.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif

#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _SWRECT_HXX
#include <swrect.hxx>
#endif
#ifndef _TXATBASE_HXX
#include <txatbase.hxx>
#endif
#ifndef _FMTCNTNT_HXX
#include <fmtcntnt.hxx>
#endif
#ifndef _FMTPDSC_HXX
#include <fmtpdsc.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _DOCARY_HXX
#include <docary.hxx>
#endif
#ifndef _PAM_HXX
#include <pam.hxx>
#endif
#ifndef _NDTXT_HXX
#include <ndtxt.hxx>
#endif
#ifndef _SHELLIO_HXX
#include <shellio.hxx>
#endif
#ifndef _DOCSTAT_HXX
#include <docstat.hxx>
#endif
#ifndef _PAGEDESC_HXX
#include <pagedesc.hxx>
#endif
#ifndef _FLYPOS_HXX
#include <flypos.hxx>
#endif
#ifndef _BOOKMRK_HXX
#include <bookmrk.hxx>
#endif
#ifndef _SWTABLE_HXX
#include <swtable.hxx>
#endif
#ifndef _WRTWW8_HXX
#include <wrtww8.hxx>
#endif
#ifndef _WW8STRUC_HXX
#include <ww8struc.hxx>
#endif
#ifndef _WRT_FN_HXX
#include <wrt_fn.hxx>
#endif
#ifndef _FLTINI_HXX
#include <fltini.hxx>
#endif
#ifndef _ERRHDL_HXX
#include <errhdl.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _SECTION_HXX
#include <section.hxx>
#endif
#include "poolfmt.hxx"          // RES_POOLCOLL_STANDARD

#ifndef _MDIEXP_HXX
#include <mdiexp.hxx>           // Progress
#endif
#ifndef _STATSTR_HRC
#include <statstr.hrc>          // ResId fuer Statusleiste
#endif

#ifndef SW_FMTLINE_HXX
#include <fmtline.hxx>
#endif


class WW8_WrFkp
{
    BYTE* pFkp;         // gesamter Fkp ( zuerst nur FCs und Sprms )
    BYTE* pOfs;         // Pointer auf Offset-Bereich, spaeter nach pFkp kopiert
    ePLCFT ePlc;
    short nStartGrp;    // ab hier grpprls
    short nOldStartGrp;
    BYTE nItemSize;
    BYTE nIMax;         // Anzahl der Eintrags-Paare
    BYTE nOldVarLen;
    BOOL bCombined;     // TRUE : Einfuegen verboten

    BYTE SearchSameSprm( USHORT nVarLen, const BYTE* pSprms );
public:
    WW8_WrFkp( ePLCFT ePl, WW8_FC nStartFc, BOOL bWrtWW8 );
    ~WW8_WrFkp();
    BOOL Append( WW8_FC nEndFc, USHORT nVarLen = 0, const BYTE* pSprms = 0 );
    BOOL Combine();
    void Write( SvStream& rStrm, SwWW8WrGrf& rGrf );

    BOOL IsEqualPos( WW8_FC nEndFc ) const
    {   return !bCombined && nIMax && nEndFc == ((INT32*)pFkp)[nIMax]; }
    void MergeToNew( short& rVarLen, BYTE *& pNewSprms );
    BOOL IsEmptySprm() const
    {   return !bCombined && nIMax && !nOldVarLen;  }
    void SetNewEnd( WW8_FC nEnd )
    {   ((INT32*)pFkp)[nIMax] = nEnd; }

#ifdef __WW8_NEEDS_COPY
    WW8_FC GetStartFc() const;
    WW8_FC GetEndFc() const;
#else
    WW8_FC GetStartFc() const { return ((INT32*)pFkp)[0]; };
    WW8_FC GetEndFc() const { return ((INT32*)pFkp)[nIMax]; };
#endif // defined __WW8_NEEDS_COPY
};


// -------------------------------------------------------------------------
// class WW8_WrPc sammelt alle Piece-Eintraege fuer ein Piece
// -------------------------------------------------------------------------

class WW8_WrPc
{
    WW8_CP nStartCp;                    // Start ZeichenPosition vom Text
    WW8_FC nStartFc;                    // Start File Position vom Text
    USHORT nStatus;                     // Absatzende im Piece ?

public:
    WW8_WrPc(WW8_FC nSFc, WW8_CP nSCp )
        : nStartCp( nSCp ), nStartFc( nSFc ), nStatus( 0x0040 )
    {}

    void SetStatus()                { nStatus = 0x0050; }
    USHORT GetStatus()  const       { return nStatus; }
    WW8_CP GetStartCp() const       { return nStartCp; }
    WW8_FC GetStartFc() const       { return nStartFc; }
};


class WW8_WrtBookmarks
{
    SvULongs aSttCps, aEndCps;              // Array of Start- and End CPs
    SvStringsDtor aSwBkmkNms;               // Array of Sw - Bookmarknames
//  SvStringsDtor aWWBkmkNms;               // Array of WW - Bookmarknames

    USHORT GetPos( const String& rNm );
public:
    WW8_WrtBookmarks();
    ~WW8_WrtBookmarks();

    void Append( WW8_CP nStartCp, const String& rNm );
    void Write( SwWW8Writer& rWrt );

//  String GetWWBkmkName( const String& rName ) const;
};

class WW8_WrtRedlineAuthor
{
    SvStringsDtor aAuthors;             // Array of Sw - Bookmarknames

    USHORT GetPos( const String& rNm );
public:
    WW8_WrtRedlineAuthor() : aAuthors( 0, 4 ) {}

    USHORT AddName( const String& rNm );
    void Write( SwWW8Writer& rWrt );
};


#define ANZ_DEFAULT_STYLES 16

// die Namen der StorageStreams
#define sMainStream         String::CreateFromAscii( \
                                RTL_CONSTASCII_STRINGPARAM( "WordDocument" ))
#define sDataStream         String::CreateFromAscii( \
                                RTL_CONSTASCII_STRINGPARAM( "Data" ))
#define sTableStream        String::CreateFromAscii( \
                                RTL_CONSTASCII_STRINGPARAM( "1Table" ))


SV_IMPL_VARARR( WW8Bytes, BYTE )
SV_IMPL_PTRARR( WW8_WrFkpPtrs, WW8_FkpPtr )

typedef WW8_WrPc* WW8_WrPcPtr;
SV_DECL_PTRARR_DEL( WW8_WrPcPtrs, WW8_WrPcPtr, 4, 4 )
SV_IMPL_PTRARR( WW8_WrPcPtrs, WW8_WrPcPtr )

static void WriteDop( SwWW8Writer& rWrt )
{
    WW8Dop& rDop = *rWrt.pDop;

    // default TabStop schreiben
    const SvxTabStopItem& rTabStop = (SvxTabStopItem& )rWrt.pDoc->
                    GetAttrPool().GetDefaultItem( RES_PARATR_TABSTOP );
    rDop.dxaTab = (USHORT)rTabStop[0].GetTabPos();


    // Werte aus der DocStatistik (werden aufjedenfall fuer die
    // DocStat-Felder benoetigt!)
    rDop.fWCFtnEdn = TRUE; // because they are included in StarWriter

    const SwDocStat& rDStat = rWrt.pDoc->GetDocStat();
    rDop.cWords = rDStat.nWord;
    rDop.cCh    = rDStat.nChar;
    rDop.cPg    = rDStat.nPage;
    rDop.cParas = rDStat.nPara;
    rDop.cLines = rDStat.nPara;

//  auch damit werden die DocStat-Felder in Kopf-/Fusszeilen nicht korrekt
//  berechnet.
//  ( we do not have this fields! )

    // und noch fuer die Header und Footers
    rDop.cWordsFtnEnd   = rDStat.nWord;
    rDop.cChFtnEdn      = rDStat.nChar;
    rDop.cPgFtnEdn      = rDStat.nPage;
    rDop.cParasFtnEdn   = rDStat.nPara;
    rDop.cLinesFtnEdn   = rDStat.nPara;

    rDop.Write( *rWrt.pTableStrm, *rWrt.pFib );
}


// HasItem ist fuer die Zusammenfassung der Doppel-Attribute
// Underline / WordLineMode und Box / Shadow.
// Es kann nur etwas gefunden werden, wenn diese Methode innerhalb
// der aufgerufenen Methoden WW8_SwAttrIter::OutAttr() und
// SwWW8Writer::Out_SfxItemSet() benutzt wird.
const SfxPoolItem* SwWW8Writer::HasItem( USHORT nWhich ) const
{
    const SfxPoolItem* pItem;
    if( pISet )
    {
        // if write a EditEngine text, then the WhichIds are greater as
        // ourer own Ids. So the Id have to translate from ouer into the
        // EditEngine Range
        if( RES_WHICHHINT_END < *pISet->GetRanges() )
            nWhich = TranslateToEditEngineId( nWhich );
        if( SFX_ITEM_SET != pISet->GetItemState( nWhich, TRUE, &pItem ) )
            pItem = 0;
    }
    else if( pChpIter )
        pItem = pChpIter->HasTextItem( nWhich );
    else
    {
        ASSERT( !this, "Wo ist mein ItemSet / pChpIter ?" );
        pItem = 0;
    }
    return pItem;
}

const SfxPoolItem& SwWW8Writer::GetItem( USHORT nWhich ) const
{
    const SfxPoolItem* pItem;
    if( pISet )
    {
        // if write a EditEngine text, then the WhichIds are greater as
        // ourer own Ids. So the Id have to translate from ouer into the
        // EditEngine Range
        if( RES_WHICHHINT_END < *pISet->GetRanges() )
            nWhich = TranslateToEditEngineId( nWhich );
        pItem = &pISet->Get( nWhich, TRUE );
    }
    else if( pChpIter )
        pItem = &pChpIter->GetItem( nWhich );
    else
    {
        ASSERT( !this, "Wo ist mein ItemSet / pChpIter ?" );
        pItem = 0;
    }
    return *pItem;
}

//------------------------------------------------------------------------------

WW8_WrPlc1::WW8_WrPlc1( USHORT nStructSz )
    : aPos( 16, 16 ), aDat( 16 * (int)nStructSz, 16 * (int)nStructSz ),
    nStructSiz( nStructSz )
{
}

void WW8_WrPlc1::Append( WW8_CP nCp, const void* pData )
{
    aPos.Insert( nCp, aPos.Count() );
    aDat.Insert( (BYTE*)pData, nStructSiz, aDat.Count() );
}

void WW8_WrPlc1::Finish( ULONG nLastCp, ULONG nSttCp )
{
    if( aPos.Count() )
    {
        aPos.Insert( nLastCp, aPos.Count() );
        if( nSttCp )
            for( USHORT n = 0; n < aPos.Count(); ++n )
                aPos[ n ] -= nSttCp;
    }
}


void WW8_WrPlc1::Write( SvStream& rStrm )
{
    for( USHORT i = 0; i < aPos.Count(); ++i )
        SwWW8Writer::WriteLong( rStrm, aPos[i] );
    rStrm.Write( aDat.GetData(), aDat.Count() );    // Anz Eintraege
}

//------------------------------------------------------------------------------
//  Klasse WW8_WrPlcFld fuer Felder
//------------------------------------------------------------------------------


BOOL WW8_WrPlcFld::Write( SwWW8Writer& rWrt )
{
    if( WW8_WrPlc1::Count() <= 1 )
        return FALSE;

    long *pfc, *plc;
    switch( nTxtTyp )
    {
    case TXT_MAINTEXT:
        pfc = &rWrt.pFib->fcPlcffldMom;
        plc = &rWrt.pFib->lcbPlcffldMom;
        break;
    case TXT_HDFT:
        pfc = &rWrt.pFib->fcPlcffldHdr;
        plc = &rWrt.pFib->lcbPlcffldHdr;
        break;

    case TXT_FTN:
        pfc = &rWrt.pFib->fcPlcffldFtn;
        plc = &rWrt.pFib->lcbPlcffldFtn;
        break;

    case TXT_EDN:
        pfc = &rWrt.pFib->fcPlcffldEdn;
        plc = &rWrt.pFib->lcbPlcffldEdn;
        break;

    case TXT_TXTBOX:
        pfc = &rWrt.pFib->fcPlcffldTxbx;
        plc = &rWrt.pFib->lcbPlcffldTxbx;
        break;

    case TXT_HFTXTBOX:
        pfc = &rWrt.pFib->fcPlcffldHdrTxbx;
        plc = &rWrt.pFib->lcbPlcffldHdrTxbx;
        break;

    default:
        pfc = plc = 0;
        break;
    }

    if( pfc && plc )
    {
        ULONG nFcStart = rWrt.pTableStrm->Tell();
        WW8_WrPlc1::Write( *rWrt.pTableStrm );
        *pfc = nFcStart;
        *plc = rWrt.pTableStrm->Tell() - nFcStart;
    }
    return TRUE;
}


//--------------------------------------------------------------------------

void SwWW8Writer::FillCount( SvStream& rStrm, ULONG nCount )
{
    static UINT32 __READONLY_DATA aNulls[16] = {
                        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; // 64 Byte

    while( nCount > 64 )
    {
        rStrm.Write( aNulls, 64 );          // in 64-Byte-Schritten
        nCount -= 64;
    }
    rStrm.Write( aNulls, nCount );          // Rest ( 0 .. 64 Bytes ) schreiben
}


ULONG SwWW8Writer::FillUntil( SvStream& rStrm, ULONG nEndPos )
{
    ULONG nCurPos = rStrm.Tell();
    if( !nEndPos )                          // nEndPos == 0 -> next Page
        nEndPos = nCurPos + 0x1ff & ~0x1ffUL;

    if( nEndPos > nCurPos )
        SwWW8Writer::FillCount( rStrm, nEndPos - nCurPos );
#ifndef PRODUCT
    else
        ASSERT( nEndPos == nCurPos, "Falsches FillUntil()" );
#endif
    return rStrm.Tell();
}


//--------------------------------------------------------------------------
/*  */

WW8_WrPlcPn::WW8_WrPlcPn( SwWW8Writer& rWr, ePLCFT ePl, WW8_FC nStartFc )
    : rWrt( rWr ), ePlc( ePl ), nFkpStartPage( 0 )
{
    WW8_FkpPtr pF = new WW8_WrFkp( ePlc, nStartFc, rWrt.bWrtWW8 );
    aFkps.Insert( pF, aFkps.Count() );
}

WW8_WrPlcPn::~WW8_WrPlcPn()
{
    aFkps.DeleteAndDestroy( 0, aFkps.Count() );
}

void WW8_WrPlcPn::AppendFkpEntry( WW8_FC nEndFc, short nVarLen,
                                    const BYTE* pSprms )
{
    WW8_FkpPtr pF = aFkps.GetObject( aFkps.Count() - 1 );

    // big sprm? build the sprmPHugePapx
    BYTE* pNewSprms = (BYTE*)pSprms;
    BYTE aHugePapx[ 8 ];
    if( rWrt.bWrtWW8 && PAP == ePlc && 488 < nVarLen )
    {
        BYTE* p = aHugePapx;
        *p++ = *pSprms++;           // set style Id
        *p++ = *pSprms++;
        nVarLen -= 2;

        long nDataPos = rWrt.pDataStrm->Tell();
        SwWW8Writer::WriteShort( *rWrt.pDataStrm, nVarLen );
        rWrt.pDataStrm->Write( pSprms, nVarLen );

        Set_UInt16( p, 0x6646 );    // set SprmCode
        Set_UInt32( p, nDataPos );  // set startpos (FC) in the datastream
        nVarLen = p - aHugePapx;
        pSprms = pNewSprms = aHugePapx;
    }
    // if append at the same FC-EndPos and there are sprms, then get the old
    // sprms and erase it; they will append now with the new sprms
    else if( nVarLen && pF->IsEqualPos( nEndFc ))
        pF->MergeToNew( nVarLen, pNewSprms );
    // has the prev EndFC an empty sprm and the current is empty too, then
    // expand only the old EndFc to the new EndFc
    else if( !nVarLen && pF->IsEmptySprm() )
    {
        pF->SetNewEnd( nEndFc );
        return ;
    }

    BOOL bOk = pF->Append( nEndFc, nVarLen, pNewSprms );
    if( !bOk )
    {
        pF->Combine();
        pF = new WW8_WrFkp( ePlc, pF->GetEndFc(), rWrt.bWrtWW8 );// Anfang neuer Fkp
                                                    // == Ende alter Fkp
        aFkps.Insert( pF, aFkps.Count() );
        if( !pF->Append( nEndFc, nVarLen, pNewSprms ) )
        {
            ASSERT( !this, "Sprm liess sich nicht einfuegen" );
        }
    }
    if( pNewSprms != pSprms )
        delete pNewSprms;
}

void WW8_WrPlcPn::WriteFkps()
{
    nFkpStartPage = (USHORT) ( SwWW8Writer::FillUntil( rWrt.Strm() ) >> 9 );

    for( USHORT i = 0; i < aFkps.Count(); i++ )
        aFkps.GetObject( i )->Write( rWrt.Strm(), *rWrt.pGrf );

    if( CHP == ePlc )
    {
        rWrt.pFib->pnChpFirst = nFkpStartPage;
        rWrt.pFib->cpnBteChp = aFkps.Count();
    }
    else
    {
        rWrt.pFib->pnPapFirst = nFkpStartPage;
        rWrt.pFib->cpnBtePap = aFkps.Count();
    }
}

void WW8_WrPlcPn::WritePlc()
{
    ULONG nFcStart = rWrt.pTableStrm->Tell();
    USHORT i;

    for( i = 0; i < aFkps.Count(); i++ )
        SwWW8Writer::WriteLong( *rWrt.pTableStrm,
                                aFkps.GetObject( i )->GetStartFc() );

    SwWW8Writer::WriteLong( *rWrt.pTableStrm,
                                aFkps.GetObject( i - 1 )->GetEndFc() );

    // fuer jedes FKP die Page ausgeben
    if( rWrt.bWrtWW8)                   // fuer WW97 Long-Ausgabe
        for ( i = 0; i < aFkps.Count(); i++)
            SwWW8Writer::WriteLong( *rWrt.pTableStrm, i + nFkpStartPage );
    else                            // fuer WW95 Short-Ausgabe
        for ( i = 0; i < aFkps.Count(); i++)
            SwWW8Writer::WriteShort( *rWrt.pTableStrm, i + nFkpStartPage );

    if( CHP == ePlc )
    {
        rWrt.pFib->fcPlcfbteChpx = nFcStart;
        rWrt.pFib->lcbPlcfbteChpx = rWrt.pTableStrm->Tell() - nFcStart;
    }
    else
    {
        rWrt.pFib->fcPlcfbtePapx = nFcStart;
        rWrt.pFib->lcbPlcfbtePapx = rWrt.pTableStrm->Tell() - nFcStart;
    }
}

//--------------------------------------------------------------------------
/*  */

WW8_WrFkp::WW8_WrFkp( ePLCFT ePl, WW8_FC nStartFc, BOOL bWrtWW8 )
    : nItemSize( ( CHP == ePl ) ? 1 : ( bWrtWW8 ? 13 : 7 )),
         nIMax( 0 ), ePlc( ePl ), bCombined( FALSE ), nStartGrp( 511 ),
    nOldStartGrp( 511 ), nOldVarLen( 0 )
{
    pFkp = (BYTE*)new INT32[128];           // 512 Byte
    pOfs = (BYTE*)new INT32[128];           // 512 Byte
    memset( pFkp, 0, 4 * 128 );
    memset( pOfs, 0, 4 * 128 );
    ( (INT32*)pFkp )[0] = nStartFc;         // 0. FC-Eintrag auf nStartFc
}

WW8_WrFkp::~WW8_WrFkp()
{
    delete( pFkp );
    delete( pOfs );
}

BYTE WW8_WrFkp::SearchSameSprm( USHORT nVarLen, const BYTE* pSprms )
{
    if( 3 < nVarLen )
    {
        // if the sprms contained picture-references then never equal!
        for( BYTE n = nVarLen - 1; 3 < n; --n )
            if( pSprms[ n ] == GRF_MAGIC_3 &&
                pSprms[ n-1 ] == GRF_MAGIC_2 &&
                pSprms[ n-2 ] == GRF_MAGIC_1 )
                    return 0;
    }

    short i;
    for( i = 0; i < nIMax; i++ )
    {
        BYTE nStart = pOfs[i * nItemSize];
        if( nStart )
        {                               // Hat Sprms
            const BYTE* p = pFkp + ( (USHORT)nStart << 1 );
            if( ( CHP == ePlc
                    ? (*p++ == nVarLen)
                    : (((USHORT)*p++ << 1 ) == (( nVarLen+1) & 0xfffe)) )
                && !memcmp( p, pSprms, nVarLen ) )
                    return nStart;                      // gefunden
        }
    }
    return 0;           // nicht gefunden
}

BOOL WW8_WrFkp::Append( WW8_FC nEndFc, USHORT nVarLen, const BYTE* pSprms )
{
    ASSERT( !nVarLen || pSprms, "Item-Pointer fehlt" );
    ASSERT( nVarLen < ( ( ePlc == PAP ) ? 497U : 502U ), "Sprms zu lang !" );

    if( bCombined )
    {
        ASSERT( !this, "Fkp::Append: Fkp is already combined" );
        return FALSE;
    }
    INT32 n = ((INT32*)pFkp)[nIMax];        // letzter Eintrag
    if( nEndFc <= n )
    {
        ASSERT( nEndFc >= n, "+Fkp: FC rueckwaerts" );
        ASSERT( !nVarLen || !pSprms || nEndFc != n,
                                    "+Fkp: selber FC mehrfach benutzt" );
                        // selber FC ohne Sprm wird ohne zu mosern ignoriert.

        return TRUE;    // ignorieren, keinen neuen Fkp anlegen
    }

    BYTE nOldP = ( nVarLen ) ? SearchSameSprm( nVarLen, pSprms ) : 0;
                                            // Kombinieren gleicher Eintraege
    short nOffset, nPos = nStartGrp;
    if( nVarLen && !nOldP )
    {
        nPos = PAP == ePlc
                ? ( 13 == nItemSize     // HACK: PAP und bWrtWW8 !!
                     ? (nStartGrp & 0xFFFE ) - nVarLen - 1
                     : (nStartGrp - (((nVarLen + 1) & 0xFFFE)+1)) & 0xFFFE )
                : ((nStartGrp - nVarLen - 1) & 0xFFFE);
        if( nPos < 0 )
            return FALSE;           // Passt absolut nicht
        nOffset = nPos;             // Offset merken (kann auch ungerade sein!)
        nPos &= 0xFFFE;             // Pos fuer Sprms ( gerade Pos )
    }

    if( (USHORT)nPos <= ( nIMax + 2U ) * 4U + ( nIMax + 1U ) * nItemSize )
                                            // Passt hinter CPs und Offsets ?
        return FALSE;                       // Nein

    ((INT32*)pFkp)[nIMax + 1] = nEndFc;     // FC eintragen

    nOldVarLen = (BYTE)nVarLen;
    if( nVarLen && !nOldP )
    {               // echt eintragen
        nOldStartGrp = nStartGrp;

        nStartGrp = nPos;
        pOfs[nIMax * nItemSize] = (BYTE)( nStartGrp >> 1 );
                                            // ( DatenAnfg >> 1 ) eintragen
        BYTE nCnt = CHP == ePlc
                        ? ( nVarLen < 256 ) ? (BYTE) nVarLen : 255
                        : ( ( nVarLen + 1 ) >> 1 );

        pFkp[ nOffset ] = nCnt;                     // DatenLaenge eintragen
        memcpy( pFkp + nOffset + 1, pSprms, nVarLen );  // Sprms speichern
    }
    else
    {
        // nicht echt eintragen ( keine Sprms oder Wiederholung )
        // DatenAnfg 0 ( keine Daten ) oder Wiederholung
        pOfs[nIMax * nItemSize] = nOldP;
    }
    nIMax++;
    return TRUE;
}

BOOL WW8_WrFkp::Combine()
{
    if( bCombined )
        return FALSE;
    if( nIMax )
        memcpy( pFkp + ( nIMax + 1 ) * 4, pOfs, nIMax * nItemSize );
    DELETEZ( pOfs );
    ((BYTE*)pFkp)[511] = nIMax;
    bCombined = TRUE;

#if defined __BIGENDIAN         // Hier werden nur die FCs gedreht, die
    register USHORT i;          // Sprms muessen an anderer Stelle gedreht
                                // werden
    register UINT32* p;
    for( i = 0, p = (UINT32*)pFkp; i <= nIMax; i++, p++ )
        *p = SWAPLONG( *p );
#endif // ifdef __BIGENDIAN

    return TRUE;
}

void WW8_WrFkp::Write( SvStream& rStrm, SwWW8WrGrf& rGrf )
{
    Combine();                      // Falls noch nicht Combined

    register BYTE* p;               //  Suche Magic fuer nPicLocFc
    BYTE* pEnd = pFkp + nStartGrp;
    for( p = pFkp + 511 - 4; p >= pEnd; p-- )
    {
        if( *p != GRF_MAGIC_1 )     // Suche nach Signatur 0x12 0x34 0x56 0xXX
            continue;
        if( *(p+1) != GRF_MAGIC_2 )
            continue;
        if( *(p+2) != GRF_MAGIC_3 )
            continue;

        SVBT32 nPos;                // Signatur gefunden
        LongToSVBT32( rGrf.GetFPos(), nPos );   // FilePos der Grafik
        memcpy( p, nPos, 4 );       // Patche FilePos ueber Signatur
    }
    rStrm.Write( pFkp, 512 );
}

void WW8_WrFkp::MergeToNew( short& rVarLen, BYTE *& rpNewSprms )
{
    BYTE nStart = pOfs[ (nIMax-1) * nItemSize ];
    if( nStart )
    {   // Hat Sprms
        BYTE* p = pFkp + ( (USHORT)nStart << 1 );

        // old and new equal? Then copy only one into the new sprms
        if( nOldVarLen == rVarLen && !memcmp( p+1, rpNewSprms, nOldVarLen ))
        {
            BYTE* pNew = new BYTE[ nOldVarLen ];
            memcpy( pNew, p+1, nOldVarLen );
            rpNewSprms = pNew;
        }
        else
        {
            BYTE* pNew = new BYTE[ nOldVarLen + rVarLen ];
            memcpy( pNew, p+1, nOldVarLen );
            memcpy( pNew + nOldVarLen, rpNewSprms, rVarLen );

            rpNewSprms = pNew;
            rVarLen += nOldVarLen;
        }
        --nIMax;
        // if this sprms dont used from others, remove it
        FASTBOOL bFnd = FALSE;
        for( USHORT n = 0; n < nIMax; ++n )
            if( nStart == pOfs[ n * nItemSize ] )
            {
                bFnd = TRUE;
                break;
            }
        if( !bFnd )
        {
            nStartGrp = nOldStartGrp;
            memset( p, 0, nOldVarLen+1 );
        }
    }
}

#ifdef __WW8_NEEDS_COPY

WW8_FC WW8_WrFkp::GetStartFc() const
{
// wenn bCombined, dann ist das Array ab pFkp schon Bytemaessig auf LittleEndian
// umgedreht, d.h. zum Herausholen der Anfangs- und Endpositionen muss
// zurueckgedreht werden.
    if( bCombined )
        return SVBT32ToLong( pFkp );        // 0. Element
    return ((INT32*)pFkp)[0];
}

WW8_FC WW8_WrFkp::GetEndFc() const
{
    if( bCombined )
        return SVBT32ToLong( &(pFkp[nIMax*4]) );    // nIMax-tes SVBT32-Element
    return ((INT32*)pFkp)[nIMax];
}

#endif // defined __WW8_NEEDS_COPY



//--------------------------------------------------------------------------
// Methoden fuer Piece-Table-Verwaltung
//--------------------------------------------------------------------------

WW8_WrPct::WW8_WrPct( WW8_FC nfcMin )
    : nOldFc( nfcMin ),bIsUni( FALSE ), pPcts( new WW8_WrPcPtrs )
{
    AppendPc( nOldFc, bIsUni );
}

WW8_WrPct::~WW8_WrPct()
{
    delete pPcts;
}

// Piece fuellen und neues Piece erzeugen
void WW8_WrPct::AppendPc( WW8_FC nStartFc, BOOL bIsUnicode )
{
    WW8_CP nStartCp = nStartFc - nOldFc;    // Textbeginn abziehen
    if ( !nStartCp )
    {
        if ( 0 != pPcts->Count() )
        {
            ASSERT( 1 == pPcts->Count(), "Leeres Piece !!");
            pPcts->DeleteAndDestroy( pPcts->Count() - 1 , 1);
        }
    }

    nOldFc = nStartFc;                      // StartFc als alten merken

    if( bIsUni )
        nStartCp >>= 1;                 // Bei Unicode Anzahl der Zeichen / 2


    if ( !bIsUnicode )
    {
        nStartFc <<= 1;                 // Adresse * 2
        nStartFc |= 0x40000000;         // Vorletztes Bit setzen fuer !Unicode
    }

    if( pPcts->Count() )
        nStartCp += pPcts->GetObject( pPcts->Count()- 1 )->GetStartCp();

    WW8_WrPcPtr pPc = new WW8_WrPc( nStartFc, nStartCp );
    pPcts->Insert( pPc, pPcts->Count() );

    bIsUni = bIsUnicode;
}


void WW8_WrPct::WritePc( SwWW8Writer& rWrt )
{
    ULONG nPctStart;
    ULONG nOldPos, nEndPos;
    USHORT i;

    nPctStart = rWrt.pTableStrm->Tell();                    // Beginn Piece-Table
    *rWrt.pTableStrm << ( char )0x02;                       // Statusbyte PCT
    nOldPos = nPctStart + 1;                                // Position merken
    SwWW8Writer::WriteLong( *rWrt.pTableStrm, 0 );          // Laenge folgt
    for( i = 0; i < pPcts->Count(); ++i )                   // Bereiche
        SwWW8Writer::WriteLong( *rWrt.pTableStrm,
                                pPcts->GetObject( i )->GetStartCp() );


    // die letzte Pos noch errechnen
    ULONG nStartCp = rWrt.pFib->fcMac - nOldFc;
    if( bIsUni )
        nStartCp >>= 1;             // Bei Unicode Anzahl der Zeichen / 2
    nStartCp += pPcts->GetObject( i-1 )->GetStartCp();
    SwWW8Writer::WriteLong( *rWrt.pTableStrm, nStartCp );

    // Pieceverweise
    for ( i = 0; i < pPcts->Count(); ++i )
    {
        WW8_WrPcPtr pPc = pPcts->GetObject( i );

        SwWW8Writer::WriteShort( *rWrt.pTableStrm, pPc->GetStatus());
        SwWW8Writer::WriteLong( *rWrt.pTableStrm, pPc->GetStartFc());
        SwWW8Writer::WriteShort( *rWrt.pTableStrm, 0);          // PRM=0
    }

    // Eintraege im FIB
    rWrt.pFib->fcClx = nPctStart;
    nEndPos = rWrt.pTableStrm->Tell();
    rWrt.pFib->lcbClx = nEndPos - nPctStart;

    // und noch die Laenge eintragen
    SwWW8Writer::WriteLong( *rWrt.pTableStrm, nOldPos,
                            nEndPos - nPctStart-5 );

}

void WW8_WrPct::SetParaBreak()
{
    ASSERT( pPcts->Count(),"SetParaBreak : aPcts.Count = 0" );
    pPcts->GetObject( pPcts->Count() - 1)->SetStatus();
}

ULONG WW8_WrPct::Fc2Cp( ULONG nFc ) const
{
    ASSERT( nFc >= (ULONG)nOldFc, "FilePos liegt vorm letzten Piece" );
    ASSERT( pPcts->Count(), "Fc2Cp noch kein Piece vorhanden" );

    nFc -= nOldFc;
    if( bIsUni )
        nFc /= 2;
    return nFc + pPcts->GetObject( pPcts->Count() - 1 )->GetStartCp();
}

//--------------------------------------------------------------------------
/*  */

WW8_WrtBookmarks::WW8_WrtBookmarks()
    : aSttCps( 0, 16 ), aEndCps( 0, 16 ),
    aSwBkmkNms( 0, 16 )
// JP 24.06.99: not used at time    ,aWWBkmkNms( 0, 16 ),
{
}

WW8_WrtBookmarks::~WW8_WrtBookmarks()
{
}

void WW8_WrtBookmarks::Append( WW8_CP nStartCp, const String& rNm )
{
    USHORT nPos = GetPos( rNm );
    if( USHRT_MAX == nPos )
    {
        // new -> insert as start position
        nPos = aSttCps.Count();
        // sort by startposition
        //      theory: write continuous -> then the new position is at end
        while( nPos && aSttCps[ nPos - 1 ] > ULONG( nStartCp ))
            --nPos;

        aSttCps.Insert( nStartCp, nPos );
        aEndCps.Insert( nStartCp, nPos );
        String* p = new String( rNm );
        aSwBkmkNms.Insert( p, nPos );
// JP 24.06.99: not used at time
//      p = new String( GetWWBkmkName(rNm ));
//      aWWBkmkNms.Insert( p, nPos );
    }
    else
    {
        // old -> its the end position
        ASSERT( aEndCps[ nPos ] == aSttCps[ nPos ], "end position is valid" );
        aEndCps.Replace( nStartCp, nPos );
    }
}


void WW8_WrtBookmarks::Write( SwWW8Writer& rWrt )
{
    USHORT nCount = aSttCps.Count(), i;
    if( nCount )
    {
        SvULongs aEndSortTab( 255 < nCount ? 255 : nCount, 4 );
        // sort then endpositions
        for( i = 0; i < nCount; ++i )
        {
            ULONG nCP = aEndCps[ i ];
            USHORT nPos = i;
            while( nPos && aEndSortTab[ nPos - 1 ] > nCP )
                --nPos;
            aEndSortTab.Insert( nCP, nPos );
        }

        // we have some bookmarks found in the document -> write them
        // first the Bookmark Name Stringtable
        rWrt.WriteAsStringTable( (SvStrings&)aSwBkmkNms,
                                    rWrt.pFib->fcSttbfbkmk,
                                    rWrt.pFib->lcbSttbfbkmk );

        // second the Bookmark start positions as pcf of longs
        SvStream& rStrm = rWrt.bWrtWW8 ? *rWrt.pTableStrm : rWrt.Strm();
        rWrt.pFib->fcPlcfbkf = rStrm.Tell();
        for( i = 0; i < nCount; ++i )
            SwWW8Writer::WriteLong( rStrm, aSttCps[ i ] );
        SwWW8Writer::WriteLong( rStrm, rWrt.pFib->ccpText );
        for( i = 0; i < nCount; ++i )
        {
            ULONG nEndCP = aEndCps[ i ];
            USHORT nPos = i;
            if( aEndSortTab[ nPos ] > nEndCP )
            {
                while( aEndSortTab[ --nPos ] != nEndCP )
                    ;
            }
            else if( aEndSortTab[ nPos ] < nEndCP )
                while( aEndSortTab[ ++nPos ] != nEndCP )
                    ;

            SwWW8Writer::WriteLong( rStrm, nPos );
        }
        rWrt.pFib->lcbPlcfbkf = rStrm.Tell() - rWrt.pFib->fcPlcfbkf;

        // third the Bookmark end positions
        rWrt.pFib->fcPlcfbkl = rStrm.Tell();
        for( i = 0; i < nCount; ++i )
            SwWW8Writer::WriteLong( rStrm, aEndSortTab[ i ] );
        SwWW8Writer::WriteLong( rStrm, rWrt.pFib->ccpText );
        rWrt.pFib->lcbPlcfbkl = rStrm.Tell() - rWrt.pFib->fcPlcfbkl;
    }
}

// JP 24.06.99: not used at time
/*String WW8_WrtBookmarks::GetWWBkmkName( const String& rName ) const
{
    // replace all characters that will WinWord not understand
    return rName;
}
*/

USHORT WW8_WrtBookmarks::GetPos( const String& rNm )
{
    USHORT nRet = USHRT_MAX, n;
    for( n = 0; n < aSttCps.Count(); ++n )
        if( rNm == *aSwBkmkNms.GetObject( n ))
        {
            nRet = n;
            break;
        }
    return nRet;
}

void SwWW8Writer::AppendBookmarks( const SwTxtNode& rNd,
                                    xub_StrLen nAktPos, xub_StrLen nLen )
{
    SvPtrarr aArr( 8, 8 );
    USHORT nCntnt;
    xub_StrLen nAktEnd = nAktPos + nLen;
    if( GetBookmarks( rNd, nAktPos, nAktEnd, aArr ))
    {
        ULONG nNd = rNd.GetIndex(), nSttCP = Fc2Cp( Strm().Tell() );
        for( USHORT n = 0; n < aArr.Count(); ++n )
        {
            const SwBookmark& rBkmk = *(SwBookmark*)aArr[ n ];
            const SwPosition* pPos = &rBkmk.GetPos(),
                            * pOPos = rBkmk.GetOtherPos();
            if( pOPos && pOPos->nNode == pPos->nNode &&
                pOPos->nContent < pPos->nContent )
            {
                pOPos = pPos;
                pPos = rBkmk.GetOtherPos();
            }

            if( !pOPos || ( nNd == pPos->nNode.GetIndex() &&
                ( nCntnt = pPos->nContent.GetIndex() ) >= nAktPos &&
                nCntnt < nAktEnd ) )
            {
                ULONG nCp = nSttCP + pPos->nContent.GetIndex() - nAktPos;
                pBkmks->Append( nCp, rBkmk.GetName() );
            }
            if( pOPos && nNd == pOPos->nNode.GetIndex() &&
                ( nCntnt = pOPos->nContent.GetIndex() ) >= nAktPos &&
                nCntnt < nAktEnd )
            {
                ULONG nCp = nSttCP + pOPos->nContent.GetIndex() - nAktPos;
                pBkmks->Append( nCp, rBkmk.GetName() );
            }
        }
    }
}

void SwWW8Writer::AppendBookmark( const String& rName, USHORT nOffset )
{
    ULONG nSttCP = Fc2Cp( Strm().Tell() ) + nOffset;
    pBkmks->Append( nSttCP, rName );
}


//--------------------------------------------------------------------------
/*  */

USHORT WW8_WrtRedlineAuthor::AddName( const String& rNm )
{
    for( USHORT n = 0, nCnt = aAuthors.Count(); n < nCnt; ++n )
        if( *aAuthors[ n ] == rNm )
            return n;

    String* pNew = new String( rNm );
    aAuthors.Insert( pNew, n );
    return n;
}

void WW8_WrtRedlineAuthor::Write( SwWW8Writer& rWrt )
{
    rWrt.WriteAsStringTable( (SvStrings&)aAuthors,
                                rWrt.pFib->fcSttbfRMark,
                                rWrt.pFib->lcbSttbfRMark,
                                rWrt.bWrtWW8 ? 0 : 2 );
}

USHORT SwWW8Writer::AddRedlineAuthor( USHORT nId )
{
    if( !pRedlAuthors )
    {
        pRedlAuthors = new WW8_WrtRedlineAuthor;
        pRedlAuthors->AddName( String::CreateFromAscii(
                            RTL_CONSTASCII_STRINGPARAM( "Unknown" )));
    }
    return pRedlAuthors->AddName( SW_MOD()->GetRedlineAuthor( nId ) );
}

//--------------------------------------------------------------------------
/*  */

void SwWW8Writer::WriteAsStringTable( const SvStrings& rStrings,
                                        INT32& rfcSttbf, INT32& rlcbSttbf,
                                        USHORT nExtraLen )
{
    USHORT n, nCount = rStrings.Count();
    if( nCount )
    {
        // we have some Redlines found in the document -> the
        // Author Name Stringtable
        SvStream& rStrm = bWrtWW8 ? *pTableStrm : Strm();
        rfcSttbf = rStrm.Tell();
        if( bWrtWW8 )
        {
            SwWW8Writer::WriteShort( rStrm, -1 );
            SwWW8Writer::WriteLong( rStrm, nCount );
            for( n = 0; n < nCount; ++n )
            {
                const String& rNm = *rStrings[ n ];
                SwWW8Writer::WriteShort( rStrm, rNm.Len() );
                SwWW8Writer::WriteString16( rStrm, rNm, FALSE );
                if( nExtraLen )
                    SwWW8Writer::FillCount( rStrm, nExtraLen );
            }
        }
        else
        {
            SwWW8Writer::WriteShort( rStrm, 0 );
            for( n = 0; n < nCount; ++n )
            {
                const String aNm( rStrings[ n ]->Copy(0, 255 ));
                rStrm << (BYTE)aNm.Len();
                SwWW8Writer::WriteString8( rStrm, aNm, FALSE,
                                                RTL_TEXTENCODING_MS_1252 );
                if( nExtraLen )
                    SwWW8Writer::FillCount( rStrm, nExtraLen );
            }
        }
        rlcbSttbf = rStrm.Tell() - rfcSttbf;
        if( !bWrtWW8 )
            SwWW8Writer::WriteShort( rStrm, rfcSttbf, (USHORT)rlcbSttbf );
    }
}

// WriteShort() traegt an FilePos nPos den Wert nVal ein und seekt auf die
// alte FilePos zurueck. Benutzt zum Nachtragen von Laengen.
void SwWW8Writer::WriteShort( SvStream& rStrm, ULONG nPos, INT16 nVal )
{
    ULONG nOldPos = rStrm.Tell();       // Pos merken
    rStrm.Seek( nPos );
    SwWW8Writer::WriteShort( rStrm, nVal );
    rStrm.Seek( nOldPos );
}

void SwWW8Writer::WriteLong( SvStream& rStrm, ULONG nPos, INT32 nVal )
{
    ULONG nOldPos = rStrm.Tell();       // Pos merken
    rStrm.Seek( nPos );
    SwWW8Writer::WriteLong( rStrm, nVal );
    rStrm.Seek( nOldPos );
}

#ifdef __WW8_NEEDS_COPY

void SwWW8Writer::InsUInt16( WW8Bytes& rO, UINT16 n )
{
    SVBT16 nL;
    ShortToSVBT16( n, nL );
    rO.Insert( nL, 2, rO.Count() );
}
void SwWW8Writer::InsUInt32( WW8Bytes& rO, UINT32 n )
{
    SVBT32 nL;
    LongToSVBT32( n, nL );
    rO.Insert( nL, 4, rO.Count() );
}

#else

void SwWW8Writer::InsUInt16( WW8Bytes& rO, UINT16 n )
{
    rO.Insert( (BYTE*)&n, 2, rO.Count() );
}
void SwWW8Writer::InsUInt32( WW8Bytes& rO, UINT32 n )
{
    rO.Insert( (BYTE*)&n, 4, rO.Count() );
}

#endif // defined __WW8_NEEDS_COPY

void SwWW8Writer::InsAsString16( WW8Bytes& rO, const String& rStr )
{
    for( const sal_Unicode* pStr = rStr.GetBuffer(); *pStr; ++pStr )
        SwWW8Writer::InsUInt16( rO, *pStr );
}

void SwWW8Writer::InsAsString8( WW8Bytes& rO, const String& rStr,
                                rtl_TextEncoding eCodeSet )
{
    ByteString sTmp( rStr, eCodeSet );
    rO.Insert( (BYTE*)sTmp.GetBuffer(), sTmp.Len(), rO.Count() );
}

void SwWW8Writer::WriteString16( SvStream& rStrm, const String& rStr,
                                    BOOL bAddZero )
{
    WW8Bytes aBytes;
    SwWW8Writer::InsAsString16( aBytes, rStr );
    if( bAddZero )
        SwWW8Writer::InsUInt16( aBytes, 0 );
    rStrm.Write( aBytes.GetData(), aBytes.Count() );
}

void SwWW8Writer::WriteString8( SvStream& rStrm, const String& rStr,
                                BOOL bAddZero, rtl_TextEncoding eCodeSet )
{
    WW8Bytes aBytes;
    SwWW8Writer::InsAsString8( aBytes, rStr, eCodeSet );
    if( bAddZero )
        aBytes.Insert( (BYTE)0, aBytes.Count() );
    rStrm.Write( aBytes.GetData(), aBytes.Count() );
}

void SwWW8Writer::WriteStringAsPara( const String& rTxt, USHORT nStyleId )
{
    if( rTxt.Len() )
        OutSwString( rTxt, 0, rTxt.Len(), IsUnicode(), RTL_TEXTENCODING_MS_1252 );
    WriteCR();              // CR danach

    WW8Bytes aArr( 10, 10 );
    SwWW8Writer::InsUInt16( aArr, nStyleId );
    if( bOutTable )
    {                                               // Tab-Attr
        // sprmPFInTable
        if( bWrtWW8 )
            SwWW8Writer::InsUInt16( aArr, 0x2416 );
        else
            aArr.Insert( 24, aArr.Count() );
        aArr.Insert( 1, aArr.Count() );
    }

    ULONG nPos = Strm().Tell();
    pPapPlc->AppendFkpEntry( nPos, aArr.Count(), aArr.GetData() );
    pChpPlc->AppendFkpEntry( nPos );
}

void SwWW8Writer::WriteSpecialText( ULONG nStart, ULONG nEnd, BYTE nTTyp )
{
    BYTE nOldTyp = nTxtTyp;
    nTxtTyp = nTTyp;
    SwPaM* pOldPam = pCurPam;       //!! Einfaches Umsetzen des PaM ohne
    SwPaM* pOldEnd = pOrigPam;          // Wiederherstellen muesste es auch tun
    BOOL bOldPageDescs = bOutPageDescs;
    bOutPageDescs = FALSE;
                                    // bOutKF wird in WriteKF1 gemerkt / gesetzt
    pCurPam = NewSwPaM( *pDoc, nStart, nEnd );

    // Tabelle in Sonderbereichen erkennen
    if(    (nStart != pCurPam->GetMark()->nNode.GetIndex())
        && pDoc->GetNodes()[ nStart ]->IsTableNode() )
        pCurPam->GetMark()->nNode = nStart;

    pOrigPam = pCurPam;
    pCurPam->Exchange();

    WriteText();

    delete pCurPam;                    // Pam wieder loeschen
    bOutPageDescs = bOldPageDescs;
    pCurPam = pOldPam;
    pOrigPam = pOldEnd;
    nTxtTyp = nOldTyp;
}

void SwWW8Writer::OutSwString( const String& rStr, xub_StrLen nStt,
                                xub_StrLen nLen, BOOL bUnicode,
                                rtl_TextEncoding eChrSet )

{
    if( nLen )
    {
        if ( bUnicode != pPiece->IsUnicode() )
            pPiece->AppendPc ( Strm().Tell(), bUnicode );

        if( nStt || nLen != rStr.Len() )
        {
            String sOut( rStr.Copy( nStt, nLen ) );
            if( bUnicode )
                SwWW8Writer::WriteString16( Strm(), sOut, FALSE );
            else
                SwWW8Writer::WriteString8( Strm(), sOut, FALSE, eChrSet );
        }
        else if( bUnicode )
            SwWW8Writer::WriteString16( Strm(), rStr, FALSE );
        else
            SwWW8Writer::WriteString8( Strm(), rStr, FALSE, eChrSet );
    }
}

void SwWW8Writer::WriteCR()
{
    WriteChar( '\015' );
    pPiece->SetParaBreak();
}

void SwWW8Writer::WriteChar( sal_Unicode c )
{
    if( pPiece->IsUnicode() )
        Strm() << c;
    else
        Strm() << (BYTE)c;
}

long SwWW8Writer::GetDTTM( const DateTime& rDT )
{
/*
mint    short   :6  0000003F    minutes (0-59)
hr      short   :5  000007C0    hours (0-23)
dom     short   :5  0000F800    days of month (1-31)
mon     short   :4  000F0000    months (1-12)
yr      short   :9  1FF00000    years (1900-2411)-1900
wdy     short   :3  E0000000    weekday(Sunday=0
                                        Monday=1
( wdy can be ignored )                  Tuesday=2
                                        Wednesday=3
                                        Thursday=4
                                        Friday=5
                                        Saturday=6)
*/

    long nDT = ( rDT.GetDayOfWeek() + 1 ) % 7;
    nDT <<= 9;
    nDT += ( rDT.GetYear() - 1900 ) & 0x1ff;
    nDT <<= 4;
    nDT += rDT.GetMonth() & 0xf;
    nDT <<= 5;
    nDT += rDT.GetDay() & 0x1f;
    nDT <<= 5;
    nDT += rDT.GetHour() & 0x1f;
    nDT <<= 6;
    nDT += rDT.GetMin() & 0x3f;
    return nDT;
}

/*  */
//---------------------------------------------------------------------------
//       Hilfsroutinen fuer Flys
//---------------------------------------------------------------------------
// Struktur speichert die aktuellen Daten des Writers zwischen, um
// einen anderen Dokument-Teil auszugeben, wie z.B. Header/Footer
WW8SaveData::WW8SaveData( SwWW8Writer& rWriter, ULONG nStt, ULONG nEnd )
    : rWrt( rWriter ),
    pOldPam( rWrt.pCurPam ), pOldEnd( rWrt.GetEndPaM() ),
    pOldFlyFmt( rWrt.pFlyFmt ), pOldPageDesc( rWrt.pAktPageDesc )

{
    pOldFlyOffset = rWrt.pFlyOffset;
    if( rWrt.pO->Count() )
    {
        pOOld = rWrt.pO;
        rWrt.pO = new WW8Bytes( 128, 128 );
    }
    else
        pOOld = 0;
    bOldWriteAll = rWrt.bWriteAll;
    bOldOutTable = rWrt.bOutTable;
    bOldIsInTable= rWrt.bIsInTable;
    bOldFlyFrmAttrs = rWrt.bOutFlyFrmAttrs;
    bOldStartTOX = rWrt.bStartTOX;
    bOldInWriteTOX = rWrt.bInWriteTOX;

    rWrt.pCurPam = rWrt.NewSwPaM( *rWrt.pDoc, nStt, nEnd );

    // Tabelle in Sonderbereichen erkennen
    if( nStt != rWrt.pCurPam->GetMark()->nNode.GetIndex() &&
        rWrt.pDoc->GetNodes()[ nStt ]->IsTableNode() )
        rWrt.pCurPam->GetMark()->nNode = nStt;

    rWrt.SetEndPaM( rWrt.pCurPam );
    rWrt.pCurPam->Exchange( );
    rWrt.bWriteAll = TRUE;
    rWrt.bOutTable = FALSE;
    // Vorsicht:  rWrt.bIsInTable  darf hier NICHT veraendert werden!
    rWrt.bOutFlyFrmAttrs = FALSE;
//  rWrt.pAttrSet = 0;
    rWrt.bStartTOX = FALSE;
    rWrt.bInWriteTOX = FALSE;
}


WW8SaveData::~WW8SaveData()
{
    delete rWrt.pCurPam;                    // Pam wieder loeschen

    rWrt.pCurPam = pOldPam;
    rWrt.SetEndPaM( pOldEnd );
    rWrt.bWriteAll = bOldWriteAll;
    rWrt.bOutTable = bOldOutTable;
    rWrt.bIsInTable= bOldIsInTable;
    rWrt.bOutFlyFrmAttrs = bOldFlyFrmAttrs;
    rWrt.bStartTOX = bOldStartTOX;
    rWrt.bInWriteTOX = bOldInWriteTOX;
    rWrt.pFlyFmt = pOldFlyFmt;
    rWrt.pAktPageDesc = pOldPageDesc;
//  rWrt.pAttrSet = pOldAttrSet;
    ASSERT( !rWrt.pO->Count(), " pO ist am Ende von WW8SaveData nicht leer" );
    if( pOOld )
    {
        delete rWrt.pO;
        rWrt.pO = pOOld;
    }
    rWrt.pFlyOffset = pOldFlyOffset;
}


void SwWW8Writer::WriteText()
{
    while( pCurPam->GetPoint()->nNode < pCurPam->GetMark()->nNode ||
            (pCurPam->GetPoint()->nNode == pCurPam->GetMark()->nNode &&
            pCurPam->GetPoint()->nContent.GetIndex() <= pCurPam->GetMark()->nContent.GetIndex()) )
    {
        SwNode * pNd = pCurPam->GetNode();

        if( pNd->IsTxtNode() ) // blitzschnelle Methode
        {
            const SwTxtNode* pTxtNode = pNd->GetTxtNode();
            if( pTxtNode->GetpSwAttrSet() )
                Out_SfxBreakItems( *pTxtNode->GetpSwAttrSet(), *pTxtNode );
            if( !bIsInTable )
                OutWW8FlyFrmsInCntnt( *pTxtNode ); // als Zeichen gebundene Flys
        }

        if( pNd->IsCntntNode() )
        {
            SwCntntNode* pCNd = (SwCntntNode*)pNd;

            // erfrage den aktuellen PageDescriptor.
            if( !bInWriteEscher )
                OutFlyFrms( *pCNd );

            const SwPageDesc* pTemp = pCNd->GetSwAttrSet().GetPageDesc().GetPageDesc();
            if( pTemp )
                pAktPageDesc = pTemp;

            pCurPam->GetPoint()->nContent.Assign( pCNd, 0 );
            Out( aWW8NodeFnTab, *pCNd, *this );
        }
        else if( pNd->IsTableNode() && !bIsInTable )
            OutWW8_SwTblNode( *this, *(SwTableNode*)pNd );
        else if( pNd->IsSectionNode() && TXT_MAINTEXT == nTxtTyp )
            OutWW8_SwSectionNode( *this, *pNd->GetSectionNode() );
        else if( TXT_MAINTEXT == nTxtTyp && pNd->IsEndNode() &&
                 pNd->FindStartNode()->IsSectionNode() )
        {
            const SwSection& rSect = pNd->FindStartNode()->GetSectionNode()
                                        ->GetSection();
            if( bStartTOX && TOX_CONTENT_SECTION == rSect.GetType() )
                bStartTOX = FALSE;

            SwNodeIndex aIdx( *pNd, 1 );
            if(    aIdx.GetNode().IsEndNode()
                && aIdx.GetNode().FindStartNode()->IsSectionNode() )
                ;
            else
            if(    aIdx.GetNode().IsSectionNode() )
                ;
            else
            {
                ReplaceCr( (char)0xc ); // Indikator fuer Page/Section-Break

                const SwSectionFmt* pParentFmt = rSect.GetFmt()->GetParent();
                if( !pParentFmt )
                    pParentFmt = (SwSectionFmt*)0xFFFFFFFF;

                ULONG nRstLnNum;
                if( aIdx.GetNode().IsCntntNode() )
                    nRstLnNum = ((SwCntntNode&)aIdx.GetNode()).GetSwAttrSet().
                                            GetLineNumber().GetStartValue();
                else
                    nRstLnNum = 0;

                pSepx->AppendSep( Fc2Cp( Strm().Tell() ),
                                    pAktPageDesc, pParentFmt, nRstLnNum );
            }
        }
        else if( pNd == &pNd->GetNodes().GetEndOfContent() )
            break;

        ULONG nPos = pCurPam->GetPoint()->nNode++;  // Bewegen
        ::SetProgressState( nPos, pCurPam->GetDoc()->GetDocShell() );   // Wie weit ?
    }
}

void SwWW8Writer::WriteMainText()
{
    pFib->fcMin = Strm().Tell();

    do {
        WriteText();
    } while( FALSE );       //!! Temporaer nur 1 Bereich
//  } while( CopyNextPam( &pCurPam ) );     // bis alle Pam bearbeitet

    if( 0 == Strm().Tell() - pFib->fcMin )  // kein Text ?
        WriteCR();                  // dann CR ans Ende ( sonst mault WW )

    pFib->ccpText = Fc2Cp( Strm().Tell() );
    pFldMain->Finish( pFib->ccpText, 0 );

                    // ccpText beinhaltet Ftn- und KF-Texte
                    // deshalb wird pFib->ccpText evtl. noch geupdated
    // save the StyleId of the last paragraph. Because WW97 take the style
    // from the last CR, that will be write after footer/Header/fontnotes/
    // annotation usw.
    const SwTxtNode* pLastNd = pCurPam->GetMark()->nNode.GetNode().GetTxtNode();
    if( pLastNd )
        nLastFmtId = GetId( (SwTxtFmtColl&)pLastNd->GetAnyFmtColl() );
}

void SwWW8Writer::WriteFkpPlcUsw()
{
    if( !bWrtWW8 )
    {
        static BYTE __READONLY_DATA aSpec[2] = { 117, 1 };

        pChpPlc->AppendFkpEntry( Strm().Tell() );   // Sepx mit fSpecial
        pSepx->WriteSepx( Strm() );                 // Slcx.Sepx
        pGrf->Write();                              // Grafiken
        pChpPlc->AppendFkpEntry( Strm().Tell(), sizeof( aSpec ), aSpec );

        pChpPlc->WriteFkps();                   // Fkp.Chpx
        pPapPlc->WriteFkps();                   // Fkp.Papx
        pStyles->OutStyleTab();                 // Styles
        pFtn->WritePlc( *this );                // Footnote-Ref & Text Plc
        pEdn->WritePlc( *this );                // Endnote-Ref & Text Plc
        pAtn->WritePlc( *this );                // Annotation-Ref & Text Plc
        pSepx->WritePlcSed( *this );            // Slcx.PlcSed
        pSepx->WritePlcHdd( *this );            // Slcx.PlcHdd
        pChpPlc->WritePlc();                    // Plcx.Chpx
        pPapPlc->WritePlc();                    // Plcx.Papx
        OutFontTab( *pFib );                    // FFNs
        if( pRedlAuthors )
            pRedlAuthors->Write( *this );       // sttbfRMark (RedlineAuthors)
        pFldMain->Write( *this );               // Fields ( Main Text )
        pFldHdFt->Write( *this );               // Fields ( Header/Footer )
        pFldFtn->Write( *this );                // Fields ( FootNotes )
        pFldEdn->Write( *this );                // Fields ( EndNotes )
        pBkmks->Write( *this );                 // Bookmarks - sttbfBkmk/
                                                // plcfBkmkf/plcfBkmkl
        WriteDop( *this );                      // Document-Properties

    }
    else
    {
        // Grafiken in den Data-Tream
//???       static BYTE __READONLY_DATA aSpec[] = { 0x55,0x08,0x01 };
//???       pChpPlc->AppendFkpEntry( pDataStrm->Tell() );   // Sepx mit fSpecial

        pGrf->Write();                      // Grafiken
//???       pChpPlc->AppendFkpEntry( pDataStrm->Tell(), sizeof( aSpec ), aSpec );

        // Ausgabe in WordDocument-Stream
        pChpPlc->WriteFkps();                   // Fkp.Chpx
        pPapPlc->WriteFkps();                   // Fkp.Papx
        pSepx->WriteSepx( Strm() );             // Sepx

        // Ausagbe in Table-Stream
        pStyles->OutStyleTab();                 // fuer WW8 StyleTab
        pFtn->WritePlc( *this );                // Footnote-Ref & Text Plc
        pEdn->WritePlc( *this );                // Endnote-Ref & Text Plc
        pTxtBxs->WritePlc( *this );             // Textbox Text Plc
        pHFTxtBxs->WritePlc( *this );           // Head/Foot-Textbox Text Plc
        pAtn->WritePlc( *this );                // Annotation-Ref & Text Plc

        pSepx->WritePlcSed( *this );            // Slcx.PlcSed
        pSepx->WritePlcHdd( *this );            // Slcx.PlcHdd

        pChpPlc->WritePlc();                    // Plcx.Chpx
        pPapPlc->WritePlc();                    // Plcx.Papx

        if( pRedlAuthors )
            pRedlAuthors->Write( *this );       // sttbfRMark (RedlineAuthors)
        pFldMain->Write( *this );               // Fields ( Main Text )
        pFldHdFt->Write( *this );               // Fields ( Header/Footer )
        pFldFtn->Write( *this );                // Fields ( FootNotes )
        pFldEdn->Write( *this );                // Fields ( EndNotes )
        pFldTxtBxs->Write( *this );             // Fields ( Textboxes )
        pFldHFTxtBxs->Write( *this );           // Fields ( Head/Foot-Textboxes )

        // dggInfo - escher stream
        WriteEscher();

        pSdrObjs->WritePlc( *this );
        pHFSdrObjs->WritePlc( *this );
        // spamom - office drawing table
        // spahdr - header office drawing table

        pBkmks->Write( *this );                 // Bookmarks - sttbfBkmk/
                                                // plcfBkmkf/plcfBkmkl

        OutListTab();                           // listformats  - LSTF
        OutOverrideListTab();                   //   - "" -     - LFO
        OutListNamesTab();                      //   - "" -     - ListNames

        pPiece->WritePc( *this );               // Piece-Table
        OutFontTab( *pFib );                    // FFNs
        WriteDop( *this );                      // Document-Properties
    }
    Strm().Seek( 0 );

    pFib->Write( Strm() );  // FIB
}

void SwWW8Writer::StoreDoc1()
{
    // Start of Text ( Mangel ueber )
    SwWW8Writer::FillUntil( Strm(), pFib->fcMin );

    WriteMainText();                    // HauptText
    pFtn->WriteTxt( *this );            // Footnote-Text
    pSepx->WriteKFTxt( *this );         // K/F-Text
    pAtn->WriteTxt( *this );            // Annotation-Text
    pEdn->WriteTxt( *this );            // EndNote-Text

    // create the escher streams
    if( bWrtWW8 )
        CreateEscher();

    pTxtBxs->WriteTxt( *this );         // Textbox Text Plc
    pHFTxtBxs->WriteTxt( *this );       // Head/Foot-Textbox Text Plc

    WriteStringAsPara( aEmptyStr, nLastFmtId ); // CR ans Ende ( sonst mault WW )

    pSepx->Finish( Fc2Cp( Strm().Tell() ));// Text + Ftn + HdFt als Section-Ende

    pFib->fcMac = Strm().Tell();        // Ende aller Texte

    WriteFkpPlcUsw();                   // FKP, PLC, .....
}

ULONG SwWW8Writer::StoreDoc()
{
    nIniFlags = ReadFilterFlags( "WWWR" );
    nCharFmtStart = ANZ_DEFAULT_STYLES;
    nFmtCollStart = nCharFmtStart + pDoc->GetCharFmts()->Count() - 1;

    bStyDef = bBreakBefore = bOutKF =
        bOutFlyFrmAttrs = bOutPageDescs = bOutTable = bOutFirstPage =
        bIsInTable = bOutGrf = bInWriteEscher = bStartTOX =
        bInWriteTOX = FALSE;

    bFtnAtTxtEnd = bEndAtTxtEnd = TRUE;

    pFlyFmt = 0;
    pFlyOffset = 0;
    nTxtTyp = TXT_MAINTEXT;
    nFlyWidth = nFlyHeight = 0;
    nStyleBeforeFly = nLastFmtId = 0;
    pStyAttr = 0;
    pOutFmtNode = 0;
    pUsedNumTbl = 0;
    pEscher = 0;
    pRedlAuthors = 0;
    if( aTOXArr.Count() )
        aTOXArr.Remove( 0, aTOXArr.Count() );

#if SUPD>593
    if( !pOLEExp )
    {
        UINT32 nSvxMSDffOLEConvFlags = 0;
        const OfaFilterOptions* pOpt = OFF_APP()->GetFilterOptions();
        if( pOpt->IsStarMath2MathType() )
            nSvxMSDffOLEConvFlags |= OLE_STARMATH_2_MATHTYPE;
        if( pOpt->IsStarWriter2WinWord() )
            nSvxMSDffOLEConvFlags |= OLE_STARWRITER_2_WINWORD;
        if( pOpt->IsStarCalc2Excel() )
            nSvxMSDffOLEConvFlags |= OLE_STARCALC_2_EXCEL;
        if( pOpt->IsStarImpress2PowerPoint() )
            nSvxMSDffOLEConvFlags |= OLE_STARIMPRESS_2_POWERPOINT;

        pOLEExp = new SvxMSExportOLEObjects( nSvxMSDffOLEConvFlags );
    }
#endif

    PrepareStorage();

    PutNumFmtFontsInAttrPool();
    PutEditEngFontsInAttrPool();

    pFib = new WW8Fib( bWrtWW8 ? 8 : 6 );

    SvStream* pOldStrm = pStrm;         // JP 19.05.99: wozu das ???
    SvStorageStreamRef xWwStrm( pStg->OpenStream( aMainStg ) );
    SvStorageStreamRef xTableStrm( xWwStrm ), xDataStrm( xWwStrm );
    xWwStrm->SetBufferSize( 32768 );

    if( bWrtWW8 )
    {
        pFib->fWhichTblStm = 1;
        xTableStrm = pStg->OpenStream( sTableStream, STREAM_STD_WRITE );
        xDataStrm = pStg->OpenStream( sDataStream, STREAM_STD_WRITE );

        xDataStrm->SetBufferSize( 32768 );  // fuer Grafiken
        xTableStrm->SetBufferSize( 16384 ); // fuer die Font-/Style-Table, usw.

        xTableStrm->SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );
        xDataStrm->SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );
    }

    pStrm = &xWwStrm;
    pTableStrm = &xTableStrm;
    pDataStrm = &xDataStrm;

    pStrm->SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );

    pAktPageDesc = &pDoc->GetPageDesc( 0 );     // Default: "Standard"
    pSepx = new WW8_WrPlcSepx;      // Sepx
    {
        const SfxPoolItem* pI;
        const SwNode* pNd = pCurPam->GetCntntNode();
        const SfxItemSet* pSet = pNd ? &((SwCntntNode*)pNd)->GetSwAttrSet()
                                     : 0;

        ULONG nRstLnNum =  pSet ? ((SwFmtLineNumber&)pSet->Get(
                                            RES_LINENUMBER )).GetStartValue()
                                : 0;

        const SwTableNode* pTblNd = pCurPam->GetNode()->FindTableNode();
        const SwSectionNode* pSectNd;
        if( pTblNd )
        {
            pSet = &pTblNd->GetTable().GetFrmFmt()->GetAttrSet();
            pNd = pTblNd;
        }
        else if( 0 != ( pSectNd = pNd->FindSectionNode() ) )
        {
            if( TOX_HEADER_SECTION == pSectNd->GetSection().GetType() &&
                pSectNd->FindStartNode()->IsSectionNode() )
                pSectNd = pSectNd->FindStartNode()->GetSectionNode();

            if( TOX_CONTENT_SECTION == pSectNd->GetSection().GetType() )
            {
                pNd = pSectNd;
                pCurPam->GetPoint()->nNode = *pNd;
            }
        }

        // Hole evtl. Pagedesc des 1. Nodes
        if( pSet && SFX_ITEM_ON == pSet->GetItemState(RES_PAGEDESC,TRUE,&pI)
            && ((SwFmtPageDesc*)pI)->GetPageDesc() )
            pSepx->AppendSep( 0, *(SwFmtPageDesc*)pI, *pNd, nRstLnNum );
        else
            pSepx->AppendSep( 0, pAktPageDesc, 0, nRstLnNum );
    }

    pFtn = new WW8_WrPlcFtnEdn( TXT_FTN );                      // Ftn
    pEdn = new WW8_WrPlcFtnEdn( TXT_EDN );                      // Edn
    pAtn = new WW8_WrPlcPostIt;                                 // PostIts
    pTxtBxs = new WW8_WrPlcTxtBoxes( TXT_TXTBOX );
    pHFTxtBxs = new WW8_WrPlcTxtBoxes( TXT_HFTXTBOX );

    pSdrObjs = new WW8_WrPlcDrawObj( TXT_TXTBOX );      // Draw-/Fly-Objects
    pHFSdrObjs = new WW8_WrPlcDrawObj( TXT_HFTXTBOX );  // Draw-/Fly-Objects
                                                        // in header or footer

    pBkmks = new WW8_WrtBookmarks;                          // Bookmarks
    CreateBookmarkTbl();

    pPapPlc = new WW8_WrPlcPn( *this, PAP, pFib->fcMin );
    pChpPlc = new WW8_WrPlcPn( *this, CHP, pFib->fcMin );
    pO = new WW8Bytes( 128, 128 );
    pStyles = new WW8WrtStyle( *this );
    pFldMain = new WW8_WrPlcFld( 2, TXT_MAINTEXT );
    pFldHdFt = new WW8_WrPlcFld( 2, TXT_HDFT );
    pFldFtn = new WW8_WrPlcFld( 2, TXT_FTN );
    pFldEdn = new WW8_WrPlcFld( 2, TXT_EDN );
    pFldTxtBxs = new WW8_WrPlcFld( 2, TXT_TXTBOX );
    pFldHFTxtBxs = new WW8_WrPlcFld( 2, TXT_HFTXTBOX );

    pGrf = new SwWW8WrGrf( *this );
    pPiece = new WW8_WrPct( pFib->fcMin );
    pDop = new WW8Dop;

    USHORT nRedlineMode = pDoc->GetRedlineMode();
    pDop->fRevMarking = 0 != (REDLINE_ON & nRedlineMode);
    pDop->fRMView = 0 != ( REDLINE_SHOW_DELETE & nRedlineMode );
    if( pDoc->GetRedlineTbl().Count() )
        pDoc->SetRedlineMode( nRedlineMode | REDLINE_SHOW_DELETE |
                                            REDLINE_SHOW_INSERT );

    // set AutoHyphenation flag if found in default para style
    const SfxPoolItem* pItem;
    SwTxtFmtColl* pStdTxtFmtColl = pDoc->GetTxtCollFromPool( RES_POOLCOLL_STANDARD );
    if(    pStdTxtFmtColl
        && SFX_ITEM_SET == pStdTxtFmtColl->GetItemState(
                                        RES_PARATR_HYPHENZONE, FALSE, &pItem ) )
        pDop->fAutoHyphen = ((SvxHyphenZoneItem*)pItem)->IsHyphen();

    // make unique OrdNums (Z-Order) for all drawing-/fly Objects
    if( pDoc->GetDrawModel() )
        pDoc->GetDrawModel()->GetPage( 0 )->RecalcObjOrdNums();

    StoreDoc1();

    if( nRedlineMode != pDoc->GetRedlineMode() )
        pDoc->SetRedlineMode( nRedlineMode );

    if( pUsedNumTbl )           // all used NumRules
    {
        // clear array  - it's an auto delete array
        pUsedNumTbl->Remove( 0, pUsedNumTbl->Count() );
        delete pUsedNumTbl;
    }

    DELETEZ( pGrf );
    DELETEZ( pFldFtn );
    DELETEZ( pFldTxtBxs );
    DELETEZ( pFldHFTxtBxs );
    DELETEZ( pFldEdn );
    DELETEZ( pFldHdFt );
    DELETEZ( pFldMain );
    DELETEZ( pStyles );
    DELETEZ( pO );
    DELETEZ( pChpPlc );
    DELETEZ( pPapPlc );
    DELETEZ( pSepx );

    delete pRedlAuthors;
    delete pSdrObjs;
    delete pHFSdrObjs;
    delete pTxtBxs;
    delete pHFTxtBxs;
    delete pAtn;
    delete pEdn;
    delete pFtn;
    delete pBkmks;
    delete pPiece;
    delete pDop;
    delete pFib;
    pStrm = pOldStrm;


    xWwStrm->SetBufferSize( 0 );
    if( bWrtWW8 )
    {
        xTableStrm->SetBufferSize( 0 );
        xDataStrm->SetBufferSize( 0 );
        if( 0 == pDataStrm->Seek( STREAM_SEEK_TO_END ))
        {
            xDataStrm.Clear();
            pDataStrm = 0;
            pStg->Remove( sDataStream );
        }
    }

    return 0;
}


void SwWW8Writer::PrepareStorage()
{
    ULONG nLen;
    const BYTE* pData;
    const char* pName;
    UINT32 nId1;

    if( bWrtWW8 )
    {
        static char __READONLY_DATA aUserName[] = "Microsoft Word-Document";
        static BYTE __READONLY_DATA aCompObj[] = {
            0x01, 0x00, 0xFE, 0xFF, 0x03, 0x0A, 0x00, 0x00,
            0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0x09, 0x02, 0x00,
            0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x46, 0x18, 0x00, 0x00, 0x00,
            0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66,
            0x74, 0x20, 0x57, 0x6F, 0x72, 0x64, 0x2D, 0x44,
            0x6F, 0x6B, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x00,
            0x0A, 0x00, 0x00, 0x00, 0x4D, 0x53, 0x57, 0x6F,
            0x72, 0x64, 0x44, 0x6F, 0x63, 0x00, 0x10, 0x00,
            0x00, 0x00, 0x57, 0x6F, 0x72, 0x64, 0x2E, 0x44,
            0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x2E,
            0x38, 0x00, 0xF4, 0x39, 0xB2, 0x71, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00 };

        pName = aUserName;
        pData = aCompObj;
        nLen = sizeof( aCompObj );
        nId1 = 0x00020906L;
    }
    else
    {
        static char __READONLY_DATA aUserName[] = "Microsoft Word 6.0 Document";
        static BYTE __READONLY_DATA aCompObj[] = {
            0x01, 0x00, 0xFE, 0xFF, 0x03, 0x0A, 0x00, 0x00,
            0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x09, 0x02, 0x00,
            0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x46, 0x1C, 0x00, 0x00, 0x00,
            0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66,
            0x74, 0x20, 0x57, 0x6F, 0x72, 0x64, 0x20, 0x36,
            0x2E, 0x30, 0x2D, 0x44, 0x6F, 0x6B, 0x75, 0x6D,
            0x65, 0x6E, 0x74, 0x00, 0x0A, 0x00, 0x00, 0x00,
            0x4D, 0x53, 0x57, 0x6F, 0x72, 0x64, 0x44, 0x6F,
            0x63, 0x00, 0x10, 0x00, 0x00, 0x00, 0x57, 0x6F,
            0x72, 0x64, 0x2E, 0x44, 0x6F, 0x63, 0x75, 0x6D,
            0x65, 0x6E, 0x74, 0x2E, 0x36, 0x00, 0x00, 0x00,
            0x00, 0x00 };

        pName = aUserName;
        pData = aCompObj;
        nLen = sizeof( aCompObj );
        nId1 = 0x00020900L;
    }

    SvGlobalName aGName( nId1, 0x0000, 0x0000, 0xc0, 0x00, 0x00, 0x00,
                         0x00, 0x00, 0x00, 0x46 );
    pStg->SetClass( aGName, 0, String::CreateFromAscii( pName ));
    SvStorageStreamRef xStor( pStg->OpenStream( String::CreateFromAscii(
                                RTL_CONSTASCII_STRINGPARAM( "\1CompObj" ))));
    xStor->Write( pData, nLen );
                // noch mal ueberplaetten, um auch Clipboardformat zu setzen
    pDoc->GetInfo()->SavePropertySet( pStg );   // DocInfo
}


ULONG SwWW8Writer::WriteStorage()
{
    long nMaxNode = pDoc->GetNodes().Count();
    ::StartProgress( STR_STATSTR_W4WWRITE, 0, nMaxNode, pDoc->GetDocShell() );

    // Tabelle am Doc.-Anfang beachten
    {
        SwTableNode * pTNd = pCurPam->GetNode()->FindTableNode();
        if( pTNd && bWriteAll )
            // mit dem TabellenNode anfangen !!
            pCurPam->GetPoint()->nNode = *pTNd;
    }

    // Tabelle fuer die freifliegenden Rahmen erzeugen, aber nur wenn
    // das gesamte Dokument geschrieben wird
    nAktFlyPos = 0;
    SwPosFlyFrms aFlyPos;
    pDoc->GetAllFlyFmts( aFlyPos, bWriteAll ? 0 : pOrigPam, bWrtWW8 );
        // Die Sonderbehandlung fuer Teilausgabe fehlt noch ( siehe RTF )
    pFlyPos = &aFlyPos;

    ULONG nRet = StoreDoc();

    // loesche die Tabelle mit den freifliegenden Rahmen
    for( USHORT i = aFlyPos.Count(); i > 0; )
        delete aFlyPos[ --i ];

    ::EndProgress( pDoc->GetDocShell() );
    bWrtWW8 = FALSE;        // sicherheitshalber: Default fuer's naechste Mal
    return nRet;
}

SwWW8Writer::SwWW8Writer( const String& rFltName )
    : pChpIter( 0 ), aMainStg( sMainStream ), pPapPlc( 0 ), pChpPlc( 0 ),
    pO( 0 ), pAktPageDesc( 0 ), pISet( 0 ), pUsedNumTbl( 0 ), pBmpPal( 0 ),
    pKeyMap( 0 )
#if SUPD>593
    , pOLEExp( 0 )
#endif
{
    bWrtWW8 = rFltName.EqualsAscii( FILTER_WW8 );
}

SwWW8Writer::~SwWW8Writer()
{
    if( pBmpPal )
        delete pBmpPal;
    if( pKeyMap )
    {
        NfKeywordTable* pDel = (NfKeywordTable*)pKeyMap;
        delete [] pDel;
    }
#if SUPD>593
    if( pOLEExp )
        delete pOLEExp;
#endif
}

void GetWW8Writer( const String& rFltName, WriterRef& xRet )
{
    xRet = new SwWW8Writer( rFltName );
}



/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ww8/wrtww8.cxx,v 1.1.1.1 2000-09-18 17:14:58 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.54  2000/09/18 16:04:58  willem.vandorp
      OpenOffice header added.

      Revision 1.53  2000/08/21 10:14:06  khz
      Export Line Numbering (restart on new section)

      Revision 1.52  2000/07/25 15:16:21  khz
      #76811# read/write AutoHyphenation flag from/into Document Properties

      Revision 1.51  2000/07/06 15:55:55  khz
      Document Statistics

      Revision 1.50  2000/07/05 16:07:30  jp
      new MS Filteroptions - change StarOffice Objects to OLE-Objects

      Revision 1.49  2000/05/15 16:40:34  jp
      Changes for Unicode

      Revision 1.48  2000/05/12 16:14:07  jp
      Changes for Unicode

      Revision 1.47  2000/03/28 18:47:53  jp
      Bug #74360#: WrFkp::Append - calculate the correct offset for W95

      Revision 1.46  2000/03/09 09:23:04  jp
      Bug #74053#: write sectionbreaks only in maintext

      Revision 1.45  2000/03/03 16:08:37  pl
      #73771# workaround for c50 intel compiler

      Revision 1.44  2000/03/01 14:21:03  jp
      Bug #73720#: StoreDoc1 - search the TOX content section

      Revision 1.43  2000/02/11 14:39:55  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.42  1999/12/20 17:41:33  jp
      Bug #70749#: Date/Time-Numberformats in german format from the formatter

      Revision 1.41  1999/12/15 17:06:18  jp
      Bug #70913#: write Ftn-/EndNoteInfo - at end of section or page/doc

      Revision 1.40  1999/12/13 13:56:06  jp
      Bug #70766#: StoreDoc - look for TOX at start of Document

      Revision 1.39  1999/11/25 21:22:29  jp
      Bug #70131#: OutFields: append the charattributes of the node to the sprms

      Revision 1.38  1999/11/22 18:26:07  jp
      export of TOX and TOX entries

      Revision 1.37  1999/11/12 13:06:17  jp
      write correct PAP-Fkps for Version 8

      Revision 1.36  1999/11/02 09:44:13  jp
      write sprmPHugePapx

      Revision 1.35  1999/10/29 17:40:18  jp
      export of 'complex'(vert. merged) tables

      Revision 1.34  1999/10/14 21:06:09  jp
      Bug #68617#,#68705# and other little things

      Revision 1.33  1999/10/14 11:09:20  jp
      export Redlines into W95/W97

      Revision 1.32  1999/10/13 18:09:45  jp
      write redlines

      Revision 1.31  1999/10/13 09:08:51  jp
      write character attributs of SdrObjects

      Revision 1.30  1999/10/11 11:00:14  jp
      some changes for export EditEngine text in WW-Format

      Revision 1.29  1999/10/04 16:44:40  jp
      Bug #68679#: check content range of bookmarkpos

      Revision 1.28  1999/09/08 16:29:21  jp
      Bug #68618#: recognize the write of escher stream

      Revision 1.27  1999/08/31 07:51:34  JP
      set NumberFormatInt at streams to littleendian


      Rev 1.26   31 Aug 1999 09:51:34   JP
   set NumberFormatInt at streams to littleendian

      Rev 1.25   24 Aug 1999 20:15:50   JP
   Escher Export

      Rev 1.24   16 Aug 1999 17:16:28   JP
   W97 Export: experimental escher export (1)

      Rev 1.23   16 Aug 1999 13:05:44   JP
   write EscherObjects - only a testversion!

      Rev 1.22   21 Jul 1999 18:28:24   JP
   W97 Export: experimental escher export

      Rev 1.21   06 Jul 1999 14:54:00   JP
   W97-Export corrections

      Rev 1.20   30 Jun 1999 19:56:42   JP
   W97-Export: Fields/PostIts/References

      Rev 1.19   24 Jun 1999 22:52:18   JP
   Export of Bookmarks and Hyperlinks

      Rev 1.18   23 Jun 1999 20:14:40   JP
   W97-Export: write Bookmarks

      Rev 1.17   23 Jun 1999 12:46:16   JP
   Export of numbers und outlinenumbers

      Rev 1.16   16 Jun 1999 19:55:20   JP
   Change interface of base class Writer, Export of W97 NumRules

      Rev 1.15   04 Jun 1999 17:47:52   JP
   WW97-Export: Code aufgeteilt

      Rev 1.14   03 Jun 1999 21:04:10   JP
   Export von Seitenvorlagen verbessert: Abstaende/Umrandung/ErsteSeite/...

      Rev 1.13   02 Jun 1999 18:45:40   JP
   WinWord-Export um Kopf-/Fusszeilen erweitert

      Rev 1.12   31 May 1999 23:14:24   JP
   Erweiterungen/Umstellungen fuer Export

      Rev 1.11   31 May 1999 18:54:34   JP
   Bug #66446#,#66457#: Asserts entfernt

      Rev 1.10   28 May 1999 17:09:06   MPA
   WinWord97 Export

      Rev 1.9   27 May 1999 23:45:06   JP
   PiceTable eingebaut, Schnittstellen angepasst, usw.

      Rev 1.8   26 May 1999 16:44:28   MPA
   Anfaenge Piece-Table

      Rev 1.7   26 May 1999 09:39:30   JP
   OutStyleTab entfernt, OutFontTab mit Fib-Ref, WritePlc ohne Flag

      Rev 1.6   25 May 1999 17:00:10   MPA
   Anpassung PAPX/CHPX WW97

      Rev 1.5   21 May 1999 19:20:00   JP
   kleinere Korrekturen

      Rev 1.4   21 May 1999 17:01:00   MPA
   Anf,nge WW97

      Rev 1.3   21 May 1999 10:51:52   MPA
   SwAttrItr:CTor von Pointer nach Ref

      Rev 1.2   21 May 1999 02:00:50   JP
   Export von WW97 Format: allgemeine Methoden und FontTabelle

      Rev 1.1   19 May 1999 19:34:16   JP
   WinWord97-ExportFilter

      Rev 1.0   19 May 1999 11:20:02   JP
   WinWord97-ExportFilter

*************************************************************************/

diff --git a/sw/source/filter/ww8/wrtww8.hxx b/sw/source/filter/ww8/wrtww8.hxx
new file mode 100644
index 0000000..7eab24f
--- /dev/null
+++ b/sw/source/filter/ww8/wrtww8.hxx
@@ -0,0 +1,815 @@
/*************************************************************************
 *
 *  $RCSfile: wrtww8.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:58 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _WRTWW8_HXX
#define _WRTWW8_HXX

#ifndef _SOLAR_H
#include <tools/solar.h>        // UINTXX
#endif
#ifndef _SV_GEN_HXX //autogen
#include <tools/gen.hxx>
#endif
#ifndef _SVSTDARR_HXX
#define _SVSTDARR_USHORTS
#define _SVSTDARR_ULONGS
#define _SVSTDARR_STRINGS
#define _SVSTDARR_STRINGSDTOR
#include <svtools/svstdarr.hxx>
#endif

#ifndef SHELLIO_HXX
#include <shellio.hxx>
#endif
#ifndef WRT_FN_HXX
#include <wrt_fn.hxx>
#endif
#ifndef WW8STRUC_HXX
#include <ww8struc.hxx>
#endif
#ifndef _WW8SCAN_HXX
#include <ww8scan.hxx>
#endif


// einige Forward Deklarationen
class BitmapPalette;
class Brush;                //JP 04.06.99: die Brush obsolete!!
class SwEscherEx;
class DateTime;
class Font;
class SdrObject;
class SfxItemSet;
class SvStream;
class SvxBorderLine;
class SvxFontItem;
class SvxBoxItem;
class SwAttrSet;
class SwBookmark;
class SwCharFmt;
class SwCntntNode;
class SwField;
class SwFlyFrmFmt;
class SwFmt;
class SwFmtCntnt;
class SwFmtFtn;
class SwFmtINetFmt;
class SwFmtRefMark;
class SwFrmFmt;
class SwGrfNode;
class SwModify;
class SwNodeNum;
class SwNoTxtNode;
class SwNumFmt;
class SwNumRule;
class SwNumRuleTbl;
class SwPageDesc;
class SwFmtPageDesc;
class SwpHints;
class SwOLENode;
class SwPosFlyFrms;
class SwPostItField;
class SwRedlineData;
class SwSection;
class SwSectionFmt;
class SwSectionNode;
class SwTableNode;
class SwTOXType;
class SwTOXMark;
class SwTxtAttr;
class SwTxtFmtColl;
class SwTxtNode;
class SwWW8WrGrf;
class SwWW8Writer;
class WW8WrtStyle;
class WW8Bytes;
class WW8_AttrIter;
class WW8_WrFkp;
class WW8_WrPlc0;
class WW8_WrPlc1;
class WW8_WrPlcDrawObj;
class WW8_WrPlcFld;
class WW8_WrPlcFtnEdn;
class WW8_WrPlcPn;
class WW8_WrPlcPostIt;
class WW8_WrPlcSepx;
class WW8_WrPlcTxtBoxes;
class WW8_WrPct;            // Verwaltung
class WW8_WrPcPtrs;
class WW8_WrtBookmarks;
class WW8_WrtRedlineAuthor;
class SvxMSExportOLEObjects;
struct WW8_PdAttrDesc;
struct WW8_SHD;


#define WWFL_ULSPACE_LIKE_SWG   0x00000001
#define WWFL_NO_GRAF            0x00000080
#define WWFL_NO_OLE             0x00020000
#define WWFL_KA_DEBUG           0x08000000
#define WWFL_READ_FROM_FILE     0x40000000


#define WW8_CSTY_FTN 15     // Slot# fuer C-Format Fussnotenzeichen

#define GRF_MAGIC_1 0x12    // 3 magic Bytes fuer PicLocFc-Attribute
#define GRF_MAGIC_2 0x34
#define GRF_MAGIC_3 0x56
#define GRF_MAGIC_321 0x563412L

// defines for InsertField- Method
#define WRITEFIELD_ALL              0xFF
#define WRITEFIELD_START            0x01
#define WRITEFIELD_CMD_START        0x02
#define WRITEFIELD_CMD_END          0x04
#define WRITEFIELD_END              0x10
#define WRITEFIELD_CLOSE            0x20

#define TXT_MAINTEXT    0           // Defines fuer TextTyp
//!!#define TXT_FTNEDN 1
#define TXT_HDFT        2
#define TXT_FTN         3
#define TXT_EDN         4
#define TXT_ATN         5
#define TXT_TXTBOX      6
#define TXT_HFTXTBOX    7


extern SwNodeFnTab aWW8NodeFnTab;
extern SwAttrFnTab aWW8AttrFnTab;

SV_DECL_VARARR( WW8Bytes, BYTE, 128, 128 );

struct WW8_SepInfo
{
    const SwPageDesc* pPageDesc;
    const SwSectionFmt* pSectionFmt;
    const SwNode* pPDNd;
    const SwTxtNode* pNumNd;
    ULONG  nLnNumRestartNo;
    USHORT nPgRestartNo;

    WW8_SepInfo()
        : pPageDesc(0), pSectionFmt(0), pNumNd(0), pPDNd(0), nPgRestartNo(0),
          nLnNumRestartNo(0)
    {}

    WW8_SepInfo( const SwPageDesc* pPD, const SwSectionFmt* pFmt, ULONG nLnRestart )
        : pPageDesc(pPD), pSectionFmt(pFmt), pNumNd(0), nPgRestartNo(0),
          nLnNumRestartNo( nLnRestart ), pPDNd( 0 )
    {}
};
SV_DECL_VARARR( WW8_WrSepInfoPtrs, WW8_SepInfo, 4, 4 );


class WW8_WrPlcSepx     // Plc fuer PageDescs -> Sepx ( Section Extensions )
{
    WW8_WrSepInfoPtrs aSects;   // PTRARR von SwPageDesc und SwSectionFmt
    SvULongs aCps;              // PTRARR von CPs
    WW8_PdAttrDesc* pAttrs;
    WW8_WrPlc0* pTxtPos;        // Pos der einzelnen Header / Footer

    void CheckForFacinPg( SwWW8Writer& rWrt ) const;
    void WriteOlst( SwWW8Writer& rWrt, USHORT i );
    void WriteFtnEndTxt( SwWW8Writer& rWrt, ULONG nCpStt );
    void OutHeader( SwWW8Writer& rWrt, const SwFmt& rFmt,
                        ULONG& rCpPos, BYTE nHFFlags, BYTE nFlag );
    void OutFooter( SwWW8Writer& rWrt, const SwFmt& rFmt,
                        ULONG& rCpPos, BYTE nHFFlags, BYTE nFlag );
    static void SetHeaderFlag( BYTE& rHeadFootFlags, const SwFmt& rFmt,
                                  BYTE nFlag );
    static void SetFooterFlag( BYTE& rHeadFootFlags, const SwFmt& rFmt,
                                   BYTE nFlag );
    static int HasBorderItem( const SwFmt& rFmt );

public:
    WW8_WrPlcSepx();
    ~WW8_WrPlcSepx();
    void AppendSep( WW8_CP nStartCp,
                    const SwPageDesc* pPd,
                    const SwSectionFmt* pSectionFmt = 0,
                    ULONG nLnNumRestartNo = 0 );
    void AppendSep( WW8_CP nStartCp, const SwFmtPageDesc& rPd,
                    const SwNode& rNd,
                    ULONG nLnNumRestartNo );
    void Finish( WW8_CP nEndCp ) { aCps.Insert( nEndCp, aCps.Count() ); }
    void SetNum( const SwTxtNode* pNumNd );
    void WriteKFTxt( SwWW8Writer& rWrt );
    void WriteSepx( SvStream& rStrm ) const;
    void WritePlcSed( SwWW8Writer& rWrt ) const;
    void WritePlcHdd( SwWW8Writer& rWrt ) const;
};

//--------------------------------------------------------------------------
// class WW8_WrPct zum Aufbau der Piece-Table
//--------------------------------------------------------------------------
class WW8_WrPct
{
    WW8_WrPcPtrs* pPcts;
    WW8_FC nOldFc;
    BOOL bIsUni : 1;
public:
    WW8_WrPct( WW8_FC nStartFc );
    ~WW8_WrPct();
    void AppendPc( WW8_FC nStartFc, BOOL bIsUnicode );
    void WritePc( SwWW8Writer& rWrt );
    void SetParaBreak();
    BOOL IsUnicode() const  { return bIsUni; }
    ULONG Fc2Cp( ULONG nFc ) const;
};



// der WW8-Writer
class SwWW8Writer: public StgWriter
{
friend void WW8_WrPlcSepx::WriteKFTxt( SwWW8Writer& rWrt ); // pO
friend void WW8_WrPlcSepx::WriteOlst( SwWW8Writer& rWrt, USHORT i );
friend Writer& OutWW8_SwTxtNode( Writer& rWrt, SwCntntNode& rNode );

    String aMainStg;
    SvPtrarr aTOXArr;
    SwPosFlyFrms* pFlyPos;          // Pointer auf die aktuelle "FlyFrmTabelle"
    const SfxItemSet* pISet;        // fuer Doppel-Attribute
    WW8_WrPct*  pPiece;             // Pointer auf Piece-Table
    SwNumRuleTbl* pUsedNumTbl;      // alle used NumRules
    WW8_WrtBookmarks* pBkmks;
    WW8_WrtRedlineAuthor* pRedlAuthors;
    BitmapPalette* pBmpPal;
    void* pKeyMap;
    SvxMSExportOLEObjects* pOLEExp;

    ULONG nIniFlags;                // Flags aus der writer.ini
    USHORT nCharFmtStart;
    USHORT nFmtCollStart;
    USHORT nAktFlyPos;              // Index auf das naechste "FlyFrmFmt"
    USHORT nStyleBeforeFly;         // Style-Nummer des Nodes,
                                    //       in/an dem ein Fly verankert ist
    USHORT nLastFmtId;              // Style of last TxtNode in normal range

    virtual ULONG WriteStorage();

    void PrepareStorage();
    void WriteFkpPlcUsw();
    void OutFontTab( WW8Fib& pFib );
    void WriteMainText();
    void StoreDoc1();
    ULONG StoreDoc();
    void Out_Olst( const SwNumRule& rRule );
    void Out_WwNumLvl( BYTE nWwLevel );
    void Out_SwNumLvl( BYTE nSwLevel );
    void Out_NumRuleAnld( const SwNumRule& rRul, const SwNumFmt& rFmt,
                          BYTE nSwLevel );
    void BuildAnlvBulletBase( WW8_ANLV& rAnlv, BYTE*& rpCh, USHORT& rCharLen,
                              const SwNumFmt& rFmt );
    static void BuildAnlvBase( WW8_ANLV& rAnlv, BYTE*& rpCh, USHORT& rCharLen,
                   const SwNumRule& rRul, const SwNumFmt& rFmt, BYTE nSwLevel );

    void Out_BorderLine( WW8Bytes& rO, const SvxBorderLine* pLine,
                            USHORT nDist, USHORT nSprmNo, BOOL bShadow );

    void OutListTab();
    void OutOverrideListTab();
    void OutListNamesTab();


public:
    const SwPageDesc* pAktPageDesc;
    WW8Fib* pFib;
    WW8Dop* pDop;
    WW8_WrPlcPn* pPapPlc;
    WW8_WrPlcPn* pChpPlc;
    WW8_AttrIter* pChpIter;
    WW8WrtStyle* pStyles;
    WW8_WrPlcSepx* pSepx;
    WW8_WrPlcFtnEdn* pFtn;
    WW8_WrPlcFtnEdn* pEdn;
    WW8_WrPlcPostIt* pAtn;
    WW8_WrPlcTxtBoxes *pTxtBxs, *pHFTxtBxs;

    SwFlyFrmFmt* pFlyFmt;           // liegt der Node in einem FlyFrame, ist
                                    // das Format gesetzt, sonst 0

    Point* pFlyOffset;              // zur Justierung eines im Writer als Zeichen
                                    // gebundenen Flys, der im WW Absatzgebunden wird.

    WW8_WrPlcFld* pFldMain;         // Felder im Haupttext
    WW8_WrPlcFld* pFldHdFt;         // Felder in Header/Footer
    WW8_WrPlcFld* pFldFtn;          // Felder in FootNotes
    WW8_WrPlcFld* pFldEdn;          // Felder in EndNotes
    WW8_WrPlcFld* pFldTxtBxs;       // fields in textboxes
    WW8_WrPlcFld* pFldHFTxtBxs;     // fields in header/footer textboxes
    SwWW8WrGrf* pGrf;
    const SwAttrSet* pStyAttr;      // StyleAttr fuer Tabulatoren
    const SwModify* pOutFmtNode;    // write Format or Node

    WW8_WrPlcDrawObj *pSdrObjs,     // Draw-/Fly-Objects
                     *pHFSdrObjs;   // Draw-/Fly-Objects in header or footer

    WW8Bytes* pO;

    SvStream *pTableStrm, *pDataStrm;   // Streams fuer WW97 Export

    SwEscherEx* pEscher;            // escher export class
    SwTwips nFlyWidth, nFlyHeight;  // Fuer Anpassung Graphic

    BYTE nTxtTyp;

    BOOL bStyDef : 1;           // wird Style geschrieben ?
    BOOL bBreakBefore : 1;      // Breaks werden 2mal ausgegeben
    BOOL bOutKF : 1;            // Kopf/Fusstexte werden ausgegeben
    BOOL bOutFlyFrmAttrs : 1;   // Rahmen-Attr von Flys werden ausgegeben
    BOOL bOutPageDescs : 1;     // PageDescs werden ausgegeben ( am Doc-Ende )
    BOOL bOutFirstPage : 1;     // write Attrset of FirstPageDesc
    BOOL bOutTable : 1;         // Tabelle wird ausgegeben
                                //    ( wird zB bei Flys in Tabelle zurueckgesetzt )
    BOOL bIsInTable : 1;        // wird sind innerhalb der Ausgabe einer Tabelle
                                //    ( wird erst nach der Tabelle zurueckgesetzt )
    BOOL bOutGrf : 1;           // Grafik wird ausgegeben
    BOOL bWrtWW8 : 1;           // Schreibe WW95 oder WW97 FileFormat
    BOOL bInWriteEscher : 1;    // in write textboxes
    BOOL bStartTOX : 1;         // TRUE: a TOX is startet
    BOOL bInWriteTOX : 1;       // TRUE: all content are in a TOX
    BOOL bFtnAtTxtEnd : 1;      // TRUE: all FTN at Textend
    BOOL bEndAtTxtEnd : 1;      // TRUE: all END at Textend


    SvxMSExportOLEObjects& GetOLEExp()      { return *pOLEExp; }

    static USHORT TranslateToEditEngineId( USHORT nWhich );
    static USHORT TranslateFromEditEngineId( USHORT nWhich );
    const SfxPoolItem* HasItem( USHORT nWhich ) const;
    const SfxPoolItem& GetItem( USHORT nWhich ) const;

    USHORT GetId( const SwTxtFmtColl& rColl ) const;
    USHORT GetId( const SwCharFmt& rFmt ) const;
    USHORT GetId( const SvxFontItem& rFont ) const;
    USHORT GetId( const Font& rFont ) const;
    USHORT GetId( const SwNumRule& rNumRule ) const;
    USHORT GetId( const SwTOXType& rTOXType );

    void OutRedline( const SwRedlineData& rRedline );
    USHORT AddRedlineAuthor( USHORT nId );

    void StartTOX( const SwSection& rSect );
    void EndTOX( const SwSection& rSect );

    void WriteSpecialText( ULONG nStart, ULONG nEnd, BYTE nTTyp );
    void WriteKFTxt1( const SwFmtCntnt& rCntnt );
    void WriteFtnBegin( const SwFmtFtn& rFtn, WW8Bytes* pO = 0 );
    void WritePostItBegin( const SwPostItField& rFld, WW8Bytes* pO = 0 );
    void OutWW8FlyFrmsInCntnt( const SwTxtNode& rNd );
    void OutWW8FlyFrm( const SwFrmFmt& rFlyFrmFmt, const Point& rNdTopLeft );
    void OutFlyFrms( const SwCntntNode& rNode );
    void AppendFlyInFlys( WW8_CP& rCP, const SwFrmFmt& rFrmFmt,
                            const Point& rNdTopLeft );
    void WriteSdrTextObj( const SdrObject& rObj );

    UINT32 GetSdrOrdNum( const SwFrmFmt& rFmt ) const;
    void CreateEscher();
    void WriteEscher();

    BOOL Out_SwNum( const SwTxtNode* pNd );
    void Out_SwFmt( const SwFmt& rFmt, BOOL bPapFmt, BOOL bChpFmt,
                    BOOL bFlyFmt = FALSE );
    BOOL GetNumberFmt( const SwField& rFld, String& rStr );
    void OutField( const SwField* pFld, BYTE nFldType,
                    const String& rFldCmd, BYTE nMode = WRITEFIELD_ALL );
    void StartCommentOutput( const String& rName );
    void EndCommentOutput(   const String& rName );
    void OutGrf( const SwNoTxtNode* pNd );
    void AppendBookmarks( const SwTxtNode& rNd, xub_StrLen nAktPos, xub_StrLen nLen );
    void AppendBookmark( const String& rName, USHORT nOffset = 0 );
    String GetBookmarkName( USHORT nTyp, const String* pNm, USHORT nSeqNo );
    BOOL HasRefToObject( USHORT nTyp, const String* pNm, USHORT nSeqNo );

    void WriteAsStringTable( const SvStrings&, INT32& rfcSttbf,
                                INT32& rlcbSttbf, USHORT nExtraLen = 0 );
    void WriteText();
    void WriteCR();
    void WriteChar( sal_Unicode c );
    void OutSwString( const String&, xub_StrLen nStt, xub_StrLen nLen,
                        BOOL bUnicode, rtl_TextEncoding eChrSet );

    ULONG ReplaceCr( BYTE nChar );

    ULONG Fc2Cp( ULONG nFc ) const          { return pPiece->Fc2Cp( nFc ); }

            // einige z.T. static halb-interne Funktions-Deklarationen

    void OutSprmBytes( BYTE* pBytes, USHORT nSiz )
                                { pO->Insert( pBytes, nSiz, pO->Count() ); }

    ULONG GetIniFlags() const               { return nIniFlags; }
    inline BOOL IsUnicode() const           { return pPiece->IsUnicode(); }

    const SfxItemSet* GetCurItemSet() const         { return pISet; }
    void SetCurItemSet( const SfxItemSet* pS )      { pISet = pS; }

    void Out_SfxItemSet( const SfxItemSet& rSet, BOOL bPapFmt, BOOL bChpFmt );
    void Out_SfxBreakItems( const SfxItemSet& rSet, const SwNode& rNd );

    void Out_SwFmtBox( const SvxBoxItem& rBox, BOOL bShadow );
    void Out_SwFmtTableBox( WW8Bytes& rO, const SvxBoxItem& rBox );
    BYTE TransCol( const Color& rCol );
    BOOL TransBrush( const Color& rCol, WW8_SHD& rShd );
    UINT32 TranslateBorderLine( const SvxBorderLine& pLine,
                                       USHORT nDist, BOOL bShadow );

    static long GetDTTM( const DateTime& rDT );

    static BYTE GetNumId( USHORT eNumType );
    static void CorrTabStopInSet( SfxItemSet& rSet, USHORT nAbsLeft );

    static ULONG FillUntil( SvStream& rStrm, ULONG nEndPos = 0 );
    static void FillCount( SvStream& rStrm, ULONG nCount );

    static void WriteShort( SvStream& rStrm, INT16 nVal ) { rStrm << nVal; }
    static void WriteShort( SvStream& rStrm, ULONG nPos, INT16 nVal );

    static void WriteLong( SvStream& rStrm, INT32 nVal ) { rStrm << nVal; }
    static void WriteLong( SvStream& rStrm, ULONG nPos, INT32 nVal );

    static void WriteString16( SvStream& rStrm, const String& rStr,
                                BOOL bAddZero );
    static void WriteString8( SvStream& rStrm, const String& rStr,
                                BOOL bAddZero, rtl_TextEncoding eCodeSet );

    static void InsUInt16( WW8Bytes& rO, UINT16 );
    static void InsUInt32( WW8Bytes& rO, UINT32 );
    static void InsAsString16( WW8Bytes& rO, const String& );
    static void InsAsString8( WW8Bytes& rO, const String& rStr,
                                rtl_TextEncoding eCodeSet );

    void InsUInt16( UINT16 n )      { SwWW8Writer::InsUInt16( *pO, n ); }
    void InsUInt32( UINT32 n )      { SwWW8Writer::InsUInt32( *pO, n ); }
    void InsAsString16( const String& rStr )
                        { SwWW8Writer::InsAsString16( *pO, rStr ); }
    void InsAsString8( const String& rStr, rtl_TextEncoding eCodeSet )
                        { SwWW8Writer::InsAsString8( *pO, rStr, eCodeSet ); }
    void WriteStringAsPara( const String& rTxt, USHORT nStyleId = 0 );

            // nach aussen interessant

    SwWW8Writer( const String& rFltName );
    virtual ~SwWW8Writer();

    // fuer WW8SaveData
    SwPaM* GetEndPaM()              { return pOrigPam; }
    void SetEndPaM( SwPaM* pPam )   { pOrigPam = pPam; }
};


class WW8_WrPlcSubDoc   // Doppel-Plc fuer Foot-/Endnotes und Postits
{
protected:
    SvULongs aCps;                  // PTRARR CP-Pos der Verweise
    SvPtrarr aCntnt;                // PTRARR von SwFmtFtn/PostIts/..
    WW8_WrPlc0* pTxtPos;            // Pos der einzelnen Texte

    WW8_WrPlcSubDoc();
    ~WW8_WrPlcSubDoc();

    void WriteTxt( SwWW8Writer& rWrt, BYTE nTTyp, long& rCount );
    void WritePlc( SwWW8Writer& rWrt, BYTE nTTyp,
                    long& rTxtStt, long& rTxtCnt,
                    long& rRefStt, long& rRefCnt ) const;

    virtual const SvULongs* GetShapeIdArr() const;
};

// Doppel-Plc fuer Footnotes/Endnotes
class WW8_WrPlcFtnEdn : public WW8_WrPlcSubDoc
{
    BYTE nTyp;
public:
    WW8_WrPlcFtnEdn( BYTE nTTyp ) : nTyp( nTTyp ) {}

    inline void WriteTxt( SwWW8Writer& rWrt );
    inline void WritePlc( SwWW8Writer& rWrt ) const;

    void Append( WW8_CP nCp, const SwFmtFtn& rFtn );
};

class WW8_WrPlcPostIt : public WW8_WrPlcSubDoc  // Doppel-Plc fuer PostIts
{
public:
    WW8_WrPlcPostIt() {}

    void Append( WW8_CP nCp, const SwPostItField& rPostIt );
    inline void WriteTxt( SwWW8Writer& rWrt );
    inline void WritePlc( SwWW8Writer& rWrt ) const;
};


class WW8_WrPlcTxtBoxes : public WW8_WrPlcSubDoc    // Doppel-Plc fuer Textboxen
{                                                   // Rahmen/DrawTextboxes!
    BYTE nTyp;
    SvULongs aShapeIds;             // VARARR of ShapeIds for the SwFrmFmts

    virtual const SvULongs* GetShapeIdArr() const;

public:
    WW8_WrPlcTxtBoxes( BYTE nTTyp ) : nTyp( nTTyp ) {}

    void WriteTxt( SwWW8Writer& rWrt );
    inline void WritePlc( SwWW8Writer& rWrt ) const;
    void Append( const SdrObject& rObj, UINT32 nShapeId );
    USHORT Count() const { return aCntnt.Count(); }
    USHORT GetPos( const VoidPtr& p ) const { return aCntnt.GetPos( p ); }
};


class WW8_WrPlcDrawObj      // PC for DrawObjects and Text-/OLE-/GRF-Boxes
{
    SvULongs aCps;                  // VARARR CP-Pos der Verweise
    SvULongs aShapeIds;             // VARARR of ShapeIds for the SwFrmFmts
    SvPtrarr aCntnt;                // PTRARR of SwFrmFmt
    SvPtrarr aParentPos;            // PTRARR of Points
    BYTE nTTyp;

public:
    WW8_WrPlcDrawObj( BYTE nType );
    ~WW8_WrPlcDrawObj();

    void WritePlc( SwWW8Writer& rWrt ) const;
    BOOL Append( SwWW8Writer&, WW8_CP nCp, const SwFrmFmt& rFmt,
                const Point& rNdTopLeft );
    const SvPtrarr& GetCntntArr() const { return aCntnt; }
    void SetShapeId( const SwFrmFmt& rFmt, UINT32 nId );
    UINT32 GetShapeId( USHORT n ) const { return aShapeIds[ n ]; }
};


typedef WW8_WrFkp* WW8_FkpPtr;  // Plc fuer Chpx und Papx ( incl PN-Plc )
SV_DECL_PTRARR( WW8_WrFkpPtrs, WW8_FkpPtr, 4, 4 );

class WW8_WrPlcPn                   // Plc fuer Page Numbers
{
    SwWW8Writer& rWrt;
    WW8_WrFkpPtrs aFkps;            // PTRARR
    USHORT nFkpStartPage;
    ePLCFT ePlc;
    BOOL bWrtWW8;                   // Fuer Writererkennung

public:
    WW8_WrPlcPn( SwWW8Writer& rWrt, ePLCFT ePl, WW8_FC nStartFc );
    ~WW8_WrPlcPn();
    void AppendFkpEntry( WW8_FC nEndFc, short nVarLen = 0, const BYTE* pSprms = 0 );
    void WriteFkps();
    void WritePlc();
};

// class WW8_WrPlc1 ist erstmal nur fuer Felder
class WW8_WrPlc1
{
    SvULongs aPos;              // PTRARR von CPs
    WW8Bytes aDat;              // Inhalte ( Strukturen )
    USHORT nStructSiz;
protected:
    USHORT Count() const { return aPos.Count(); }
    void Write( SvStream& rStrm );

public:
    WW8_WrPlc1( USHORT nStructSz );
    void Append( WW8_CP nCp, const void* pData );
    void Finish( ULONG nLastCp, ULONG nStartCp );
};

// class WW8_WrPlcFld ist fuer Felder
class WW8_WrPlcFld: public WW8_WrPlc1
{
    BYTE nTxtTyp;
public:
    WW8_WrPlcFld( USHORT nStructSz, BYTE nTTyp )
        : WW8_WrPlc1( nStructSz ), nTxtTyp( nTTyp )
    {}
    BOOL Write( SwWW8Writer& rWrt );
};


// class SwWW8WrGrf sammelt Grafiken und gibt sie aus
class SwWW8WrGrf
{
    SwWW8Writer& rWrt;  // SwWW8Writer fuer Zugriff auf die Vars
    SvPtrarr aNds;      // Positionen der SwGrfNodes und SwOleNodes
    SvPtrarr aFlys;     // Umgebende FlyFrms dazu
    SvULongs aPos;      // FilePos der Grafiken
    SvUShorts aWid;     // Breite der Grafiken
    SvUShorts aHei;     // Hoehe der Grafiken
    USHORT nIdx;        // Index in File-Positionen

    void Write1GrfHdr( SvStream& rStrm, const SwNoTxtNode* pNd,
            const SwFlyFrmFmt* pFly, UINT16 mm, UINT16 nWidth, UINT16 nHeight );
    void Write1Grf1( SvStream& rStrm, const SwGrfNode* pGrfNd,
                    const SwFlyFrmFmt* pFly, UINT16 nWidth, UINT16 nHeight );
    void Write1Grf( SvStream& rStrm, const SwNoTxtNode* pNd,
                    const SwFlyFrmFmt* pFly, UINT16 nWidth, UINT16 nHeight );
public:
    SwWW8WrGrf( SwWW8Writer& rW )
        : rWrt( rW ), aNds( 4, 4 ), aFlys( 4, 4 ), aPos( 4, 4 ),
          aWid( 4, 4 ), aHei( 4, 4 )
    {}
    void Insert( const SwNoTxtNode* pNd, const SwFlyFrmFmt* pFly );
    void Write();
    ULONG GetFPos() { return ( nIdx < aNds.Count() ) ? aPos[nIdx++] : 0; }
};

// The class WW8_AttrIter is a helper class to build the Fkp.chpx. This
// class may be overloaded for output the SwTxtAttrs and the
// EditEngineTxtAttrs.
class WW8_AttrIter
{
    WW8_AttrIter* pOld;
protected:
    SwWW8Writer& rWrt;
public:
    WW8_AttrIter( SwWW8Writer& rWrt );
    ~WW8_AttrIter();

    virtual const SfxPoolItem* HasTextItem( USHORT nWhich ) const = 0;
    virtual const SfxPoolItem& GetItem( USHORT nWhich ) const = 0;
    virtual void GetItems( WW8Bytes& rItems ) const;
};


class WW8WrtStyle
{
    SwWW8Writer& rWrt;
    SwFmt** pFmtA;
    USHORT nPOPosStdLen1, nPOPosStdLen2;
    USHORT nUsedSlots;

    void BuildStyleTab();
    void BuildUpx( const SwFmt* pFmt, BOOL bPap, USHORT nPos,
                   BOOL bInsDefCharSiz );
    USHORT Build_GetWWSlot( const SwFmt& rFmt );
    USHORT GetWWId( const SwFmt& rFmt ) const;
    void Set1StyleDefaults( const SwFmt& rFmt, BOOL bPap );
    void Out1Style( SwFmt* pFmt, USHORT nPos );

    void WriteStyle( SvStream& rStrm );
    void SkipOdd();
    void BuildStd( const String& rName, BOOL bPapFmt, short nWwBase,
                   short nWwNext, USHORT nWwId );

public:
    WW8WrtStyle( SwWW8Writer& rWr );
    ~WW8WrtStyle();

    void OutStyleTab();
    USHORT Sty_GetWWSlot( const SwFmt& rFmt ) const;
};


struct WW8SaveData
{
    SwWW8Writer& rWrt;
    Point* pOldFlyOffset;
    WW8Bytes* pOOld;
    SwPaM* pOldPam, *pOldEnd;
    SwFlyFrmFmt* pOldFlyFmt;
    const SwPageDesc* pOldPageDesc;

    BOOL bOldWriteAll : 1;
    BOOL bOldOutTable : 1;
    BOOL bOldIsInTable: 1;
    BOOL bOldFlyFrmAttrs : 1;
    BOOL bOldStartTOX : 1;
    BOOL bOldInWriteTOX : 1;
        // bOutPageDesc muss nicht gesichert werden, da es nur nicht waehrend
        // der Ausgabe von Spezial-Texten veraendert wird.

    WW8SaveData( SwWW8Writer&, ULONG nStt, ULONG nEnd );
    ~WW8SaveData();
};


// einige halb-interne Funktions-Deklarationen fuer die Node-Tabelle

Writer& OutWW8_SwGrfNode( Writer& rWrt, SwCntntNode& rNode );
Writer& OutWW8_SwOleNode( Writer& rWrt, SwCntntNode& rNode );
Writer& OutWW8_SwSectionNode(Writer& rWrt, SwSectionNode& rSectionNode );
Writer& OutWW8_SwTblNode( Writer& rWrt, SwTableNode & rNode );

Writer& OutWW8_SwFmtHoriOrient( Writer& rWrt, const SfxPoolItem& rHt );
Writer& OutWW8_SwFmtVertOrient( Writer& rWrt, const SfxPoolItem& rHt );


// --------------------------- inlines ---------------------------------

inline void WW8_WrPlcFtnEdn::WriteTxt( SwWW8Writer& rWrt )
{
    if( TXT_FTN == nTyp )
    {
        WW8_WrPlcSubDoc::WriteTxt( rWrt, TXT_FTN, rWrt.pFib->ccpFtn );
        rWrt.pFldFtn->Finish( rWrt.Fc2Cp( rWrt.Strm().Tell() ),
                            rWrt.pFib->ccpText );
    }
    else
    {
        WW8_WrPlcSubDoc::WriteTxt( rWrt, TXT_EDN, rWrt.pFib->ccpEdn );
        rWrt.pFldEdn->Finish( rWrt.Fc2Cp( rWrt.Strm().Tell() ),
                            rWrt.pFib->ccpText + rWrt.pFib->ccpFtn
                            + rWrt.pFib->ccpHdr + rWrt.pFib->ccpAtn );
    }
}

inline void WW8_WrPlcFtnEdn::WritePlc( SwWW8Writer& rWrt ) const
{
    if( TXT_FTN == nTyp )
        WW8_WrPlcSubDoc::WritePlc( rWrt, TXT_FTN,
                    rWrt.pFib->fcPlcffndTxt, rWrt.pFib->lcbPlcffndTxt,
                    rWrt.pFib->fcPlcffndRef, rWrt.pFib->lcbPlcffndRef );
    else
        WW8_WrPlcSubDoc::WritePlc( rWrt, TXT_EDN,
                    rWrt.pFib->fcPlcfendTxt, rWrt.pFib->lcbPlcfendTxt,
                    rWrt.pFib->fcPlcfendRef, rWrt.pFib->lcbPlcfendRef );
}


void WW8_WrPlcPostIt::WriteTxt( SwWW8Writer& rWrt )
{
    WW8_WrPlcSubDoc::WriteTxt( rWrt, TXT_ATN, rWrt.pFib->ccpAtn );
}

void WW8_WrPlcPostIt::WritePlc( SwWW8Writer& rWrt ) const
{
    WW8_WrPlcSubDoc::WritePlc( rWrt, TXT_ATN,
                    rWrt.pFib->fcPlcfandTxt, rWrt.pFib->lcbPlcfandTxt,
                    rWrt.pFib->fcPlcfandRef, rWrt.pFib->lcbPlcfandRef );
}

void WW8_WrPlcTxtBoxes::WritePlc( SwWW8Writer& rWrt ) const
{
    if( TXT_TXTBOX == nTyp )
        WW8_WrPlcSubDoc::WritePlc( rWrt, nTyp,
                rWrt.pFib->fcPlcftxbxBkd, rWrt.pFib->lcbPlcftxbxBkd,
                rWrt.pFib->fcPlcftxbxTxt, rWrt.pFib->lcbPlcftxbxTxt );
    else
        WW8_WrPlcSubDoc::WritePlc( rWrt, nTyp,
                rWrt.pFib->fcPlcfHdrtxbxBkd, rWrt.pFib->lcbPlcfHdrtxbxBkd,
                rWrt.pFib->fcPlcfHdrtxbxTxt, rWrt.pFib->lcbPlcfHdrtxbxTxt );
}



#endif  //  _WRTWW8_HXX

diff --git a/sw/source/filter/ww8/wrtww8gr.cxx b/sw/source/filter/ww8/wrtww8gr.cxx
new file mode 100644
index 0000000..2b5f3fc
--- /dev/null
+++ b/sw/source/filter/ww8/wrtww8gr.cxx
@@ -0,0 +1,697 @@
/*************************************************************************
 *
 *  $RCSfile: wrtww8gr.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:58 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#define ITEMID_BOXINFO      SID_ATTR_BORDER_INNER
#include <hintids.hxx>

#ifndef _URLOBJ_HXX //autogen
#include <tools/urlobj.hxx>
#endif
#ifndef _VIRDEV_HXX //autogen
#include <vcl/virdev.hxx>
#endif
#ifndef _APP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _WRKWIN_HXX //autogen
#include <vcl/wrkwin.hxx>
#endif
#ifndef _IPOBJ_HXX //autogen
#include <so3/ipobj.hxx>
#endif
#ifndef _SVSTOR_HXX //autogen wg. SvStorage
#include <so3/svstor.hxx>
#endif
#ifndef _FILTER_HXX //autogen
#include <svtools/filter.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_SHADITEM_HXX //autogen
#include <svx/shaditem.hxx>
#endif
#ifndef _SVX_SHADITEM_HXX //autogen
#include <svx/shaditem.hxx>
#endif
#ifndef _MSOLEEXP_HXX
#include <svx/msoleexp.hxx>
#endif

#ifndef _FMTANCHR_HXX //autogen
#include <fmtanchr.hxx>
#endif
#ifndef _NDGRF_HXX
#include <ndgrf.hxx>
#endif
#ifndef _FRMFMT_HXX
#include <frmfmt.hxx>       // class SwFlyFrmFmt
#endif
#ifndef _GRFATR_HXX
#include <grfatr.hxx>       // class SwCropGrf
#endif
#ifndef _NDOLE_HXX
#include <ndole.hxx>
#endif
#ifndef _WW8STRUC_HXX
#include <ww8struc.hxx>
#endif
#ifndef _WRTWW8_HXX
#include <wrtww8.hxx>
#endif


#define WW8_ASCII2STR(s) String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM(s))

// Damit KA debuggen kann, ohne sich den ganzen Writer zu holen, ist
// temporaer dieses Debug gesetzt. Ist ausserdem noch das passende IniFlag
// gesetzt, dann werden in d:\ Hilfsdateien erzeugt.
// !! sollte demnaechst wieder entfernt werden !!
// #define DEBUG_KA


// ToDo:
// 5. Die MapModes, die Win nicht kann, umrechnen

// OutGrf() wird fuer jeden GrafNode im Doc gerufen. Es wird ein PicLocFc-Sprm
// eingefuegt, der statt Adresse ein Magic ULONG enthaelt. Ausserdem wird
// in der Graf-Klasse der GrfNode-Ptr gemerkt ( fuers spaetere Ausgeben der
// Grafiken und Patchen der PicLocFc-Attribute )

Writer& OutWW8_SwGrfNode( Writer& rWrt, SwCntntNode& rNode )
{
    SwWW8Writer& rWW8Wrt = (SwWW8Writer&)rWrt;
    rWW8Wrt.OutGrf( rNode.GetGrfNode() );

    rWW8Wrt.pFib->fHasPic = 1;

    return rWrt;
}

Writer& OutWW8_SwOleNode( Writer& rWrt, SwCntntNode& rNode )
{
    SwWW8Writer& rWW8Wrt = (SwWW8Writer&)rWrt;
    if( !(rWW8Wrt.GetIniFlags() & WWFL_NO_OLE ) )
    {
        if( rWW8Wrt.bWrtWW8 )
        {
            static BYTE aSpecOLE[] = {
                0x03, 0x6a, 0, 0, 0, 0,         // sprmCPicLocation
                0x0a, 0x08, 1,                  // sprmCFOLE2
                0x56, 0x08, 1                   // sprmCFObj
            };

            const SwOLENode& rOLENd = (SwOLENode&)rNode;
            UINT32 nPictureId = (long)&rOLENd;
            BYTE* pDataAdr = aSpecOLE + 2;
            Set_UInt32( pDataAdr, nPictureId );

            SvStorageRef xObjStg = rWW8Wrt.GetStorage().OpenStorage(
                            String::CreateFromAscii(
                                RTL_CONSTASCII_STRINGPARAM( "ObjectPool" )),
                                    STREAM_READWRITE| STREAM_SHARE_DENYALL );
            if( xObjStg.Is()  )
            {
                String sStorageName( '_' );
                sStorageName += String::CreateFromInt32( nPictureId );
                SvStorageRef xOleStg = xObjStg->OpenStorage( sStorageName,
                                    STREAM_READWRITE| STREAM_SHARE_DENYALL );
                if( xOleStg.Is() )
                {
                    SvInPlaceObjectRef xObj( ((SwOLENode&)rOLENd).
                                                GetOLEObj().GetOleRef() );
                    if( xObj.Is() )
                    {
                        rWW8Wrt.GetOLEExp().ExportOLEObject( *xObj, *xOleStg );

                        // write as embedded field - the other things will
                        // be done in the escher export
                        String sServer( String::CreateFromAscii(
                                RTL_CONSTASCII_STRINGPARAM( " EINBETTEN " )));
                        ( sServer += xOleStg->GetUserName() ) += ' ';

                        rWW8Wrt.OutField( 0, 58, sServer,
                                                WRITEFIELD_START |
                                                WRITEFIELD_CMD_START |
                                                WRITEFIELD_CMD_END );

                        rWW8Wrt.pChpPlc->AppendFkpEntry( rWrt.Strm().Tell(),
                                        sizeof( aSpecOLE ), aSpecOLE );

                        rWW8Wrt.WriteChar( 0x1 );

                        rWW8Wrt.OutField( 0, 58, aEmptyStr,
                                                WRITEFIELD_END |
                                                WRITEFIELD_CLOSE );
                        rWW8Wrt.WriteCR();              // CR danach
                    }
                }
            }
        }
        else
            rWW8Wrt.OutGrf( rNode.GetOLENode() );
    }
    return rWrt;
}


void SwWW8Writer::OutGrf( const SwNoTxtNode* pNd )
{
    if( nIniFlags & WWFL_NO_GRAF )
        return;     // Iniflags: kein Grafik-Export

    if( !pFlyFmt )              // Grafik mit eigenem Frame ( eigentlich immer )
    {
        ASSERT( !this, "+Grafik ohne umgebenden Fly" );
        return ;
    }

    // GrfNode fuer spaeteres rausschreiben der Grafik merken
    pGrf->Insert( pNd, pFlyFmt );

    pChpPlc->AppendFkpEntry( pStrm->Tell(), pO->Count(), pO->GetData() );
    pO->Remove( 0, pO->Count() );                   // leeren

    WriteChar( (char)1 );   // Grafik-Sonderzeichen in Haupttext einfuegen

    BYTE aArr[ 14 ];
    BYTE* pArr = aArr;

    // sprmCFSpec
    if( bWrtWW8 )
        Set_UInt16( pArr, 0x855 );
    else
        Set_UInt8( pArr, 117 );
    Set_UInt8( pArr, 1 );

    // sprmCPicLocation
    if( bWrtWW8 )
        Set_UInt16( pArr, 0x6a03 );
    else
    {
        Set_UInt8( pArr, 68 );
        Set_UInt8( pArr, 4 );
    }
    Set_UInt32( pArr, GRF_MAGIC_321 );

    // Magic variieren, damit verschiedene Grafik-Attribute nicht
    // gemerged werden
    static BYTE nAttrMagicIdx = 0;
    --pArr;
    Set_UInt8( pArr, nAttrMagicIdx++ );
    pChpPlc->AppendFkpEntry( pStrm->Tell(), pArr - aArr, aArr );

    RndStdIds eAn = pFlyFmt->GetAttrSet().GetAnchor( FALSE ).GetAnchorId();
    if( eAn == FLY_AT_CNTNT || eAn == FLY_PAGE )
    {
        WriteChar( (char)0x0d ); // umgebenden Rahmen mit CR abschliessen

        static BYTE __READONLY_DATA nSty[2] = { 0, 0 };
        pO->Insert( nSty, 2, pO->Count() );     // Style #0
        BOOL bOldGrf = bOutGrf;
        bOutGrf = TRUE;

        Out_SwFmt( *pFlyFmt, FALSE, FALSE, TRUE );          // Fly-Attrs

        bOutGrf = bOldGrf;
        pPapPlc->AppendFkpEntry( pStrm->Tell(), pO->Count(), pO->GetData() );
        pO->Remove( 0, pO->Count() );                   // leeren
    }
}

void SwWW8WrGrf::Insert( const SwNoTxtNode* pNd, const SwFlyFrmFmt* pFly )
{
    aNds.Insert( (VoidPtr)pNd, aNds.Count() );
    aFlys.Insert( (VoidPtr)pFly, aFlys.Count() );
    if( rWrt.nFlyWidth > 0 && rWrt.nFlyHeight > 0 )
    {
        aWid.Insert( (UINT16)rWrt.nFlyWidth, aWid.Count() ); // hier steht die ware Groesse
        aHei.Insert( (UINT16)rWrt.nFlyHeight, aHei.Count() ); // naemlich im uebergeordneten Frame
    }
    else
    {
        Size aGrTwipSz( pNd->GetTwipSize() );
        //JP 05.12.98: falls die Grafik noch nie angezeigt wurde und es sich
        //              um eine gelinkte handelt, so ist keine Size gesetzt. In
        //              diesem Fall sollte man sie mal reinswappen.
        if( ( !aGrTwipSz.Width() || !aGrTwipSz.Height() ) &&
            pNd->IsGrfNode() &&
            GRAPHIC_DEFAULT == ((SwGrfNode*)pNd)->GetGrf().GetType() )
        {
            ((SwGrfNode*)pNd)->SwapIn();
            aGrTwipSz = pNd->GetTwipSize();
        }

        aWid.Insert( (UINT16)aGrTwipSz.Width(), aWid.Count() );
        aHei.Insert( (UINT16)aGrTwipSz.Height(), aHei.Count() );
    }
}

void SwWW8WrGrf::Write1GrfHdr( SvStream& rStrm, const SwNoTxtNode* pNd,
                                const SwFlyFrmFmt* pFly,
                            UINT16 mm, UINT16 nWidth, UINT16 nHeight )
{
    INT16 nXSizeAdd = 0, nYSizeAdd = 0;
    INT16 nCropL = 0, nCropR = 0, nCropT = 0, nCropB = 0;

            // Crop-AttributInhalt in Header schreiben ( falls vorhanden )
    const SwAttrSet* pAttrSet = pNd->GetpSwAttrSet();
    const SfxPoolItem* pItem;
    if( pAttrSet && ( SFX_ITEM_ON
        == pAttrSet->GetItemState( RES_GRFATR_CROPGRF, FALSE, &pItem ) ) )
    {
        const SwCropGrf& rCr = *(SwCropGrf*)pItem;
        nCropL = rCr.GetLeft();
        nCropR = rCr.GetRight();
        nCropT = rCr.GetTop();
        nCropB = rCr.GetBottom();
        nXSizeAdd -= (INT16)( rCr.GetLeft() - rCr.GetRight() );
        nYSizeAdd -= (INT16)( rCr.GetTop() - rCr.GetBottom() );
    }

    Size aGrTwipSz( pNd->GetTwipSize() );
    //JP 05.12.98: falls die Grafik noch nie angezeigt wurde und es sich
    //              um eine gelinkte handelt, so ist keine Size gesetzt. In
    //              diesem Fall sollte man sie mal reinswappen.
    if( ( !aGrTwipSz.Width() || !aGrTwipSz.Height() ) &&
        pNd->IsGrfNode() &&
        GRAPHIC_DEFAULT == ((SwGrfNode*)pNd)->GetGrf().GetType() )
    {
        ((SwGrfNode*)pNd)->SwapIn();
        aGrTwipSz = pNd->GetTwipSize();
    }


    BOOL bWrtWW8 = rWrt.bWrtWW8;
    UINT16 nHdrLen = bWrtWW8 ? 0x3A : 0x44;

    BYTE aArr[ sizeof( WW8_PIC_SHADOW ) ];
    memset( aArr, 0, nHdrLen );

    BYTE* pArr = aArr + 4;                          //skip lcb
    Set_UInt16( pArr, nHdrLen );                    // set cbHeader

    Set_UInt16( pArr, mm );                         // set mm
    Set_UInt16( pArr, aGrTwipSz.Width() * 254L / 144 );     // set xExt
    Set_UInt16( pArr, aGrTwipSz.Height() * 254L / 144 );    // set yExt
    pArr += 16;                                     // skip hMF & rcWinMF
    Set_UInt16( pArr, (UINT16)aGrTwipSz.Width() );  // set dxaGoal
    Set_UInt16( pArr, (UINT16)aGrTwipSz.Height() ); // set dyaGoal

    if( aGrTwipSz.Width() + nXSizeAdd )             // set mx
        Set_UInt16( pArr, ( nWidth * 1000L /
                            ( aGrTwipSz.Width() + nXSizeAdd ) ) );
    else
        pArr += 2;
    if( aGrTwipSz.Height() + nYSizeAdd )            // set my
        Set_UInt16( pArr, ( nHeight * 1000L /
                            ( aGrTwipSz.Height() + nYSizeAdd ) ) );
    else
        pArr += 2;

    Set_UInt16( pArr, nCropL );                     // set dxaCropLeft
    Set_UInt16( pArr, nCropT );                     // set dyaCropTop
    Set_UInt16( pArr, nCropR );                     // set dxaCropRight
    Set_UInt16( pArr, nCropB );                     // set dyaCropBottom
    pArr += 2;                                      // skip Flags

    if( pFly )
    {
        const SwAttrSet& rAttrSet = pFly->GetAttrSet();
        if( SFX_ITEM_ON == rAttrSet.GetItemState( RES_BOX, FALSE, &pItem ) )
        {
            const SvxBoxItem* pBox = (const SvxBoxItem*)pItem;
            if( pBox )
            {
                BOOL bShadow = FALSE;               // Shadow ?
                const SfxPoolItem* pItem;
                if( SFX_ITEM_ON
                    == rAttrSet.GetItemState( RES_SHADOW, TRUE, &pItem ) )
                {
                    const SvxShadowItem* pSI = (const SvxShadowItem*)pItem;
                    bShadow = ( pSI->GetLocation() != SVX_SHADOW_NONE )
                            && ( pSI->GetWidth() != 0 );
                }

                BYTE aLnArr[4] = { BOX_LINE_TOP, BOX_LINE_LEFT,
                                    BOX_LINE_BOTTOM, BOX_LINE_RIGHT };
                for( BYTE i = 0; i < 4; ++i )
                {
                    const SvxBorderLine* pLn = pBox->GetLine( aLnArr[ i ] );
                    UINT32 nBrd = pLn
                                    ? rWrt.TranslateBorderLine( *pLn,
                                        pBox->GetDistance( aLnArr[ i ] ),
                                        bShadow )
                                    : 0;

                    if( bWrtWW8 )
                        Set_UInt32( pArr, nBrd );
                    else
                        Set_UInt16( pArr, (USHORT)nBrd );
                }
            }
        }
    }
    rStrm.Write( aArr, nHdrLen );
}

void SwWW8WrGrf::Write1Grf1( SvStream& rStrm, const SwGrfNode* pGrfNd,
                    const SwFlyFrmFmt* pFly, UINT16 nWidth, UINT16 nHeight )
{
    if( pGrfNd->IsLinkedFile() )        // Linked File
    {
        String aFileN, aFiltN;
        UINT16 mm;
        pGrfNd->GetFileFilterNms( &aFileN, &aFiltN );

        aFileN = INetURLObject::AbsToRel( aFileN, INetURLObject::WAS_ENCODED,
                                        INetURLObject::DECODE_WITH_CHARSET );
        INetURLObject aUrl( aFileN );
        if( aUrl.GetProtocol() == INET_PROT_FILE )
            aFileN = aUrl.PathToFileName();

//JP 05.12.98: nach einigen tests hat sich gezeigt, das WW mit 99 nicht
//              klarkommt. Sie selbst schreiben aber bei Verknuepfunfen,
//              egal um welchen Type es sich handelt, immer den Wert 94.
//              Bug 59859
//      if ( COMPARE_EQUAL == aFiltN.ICompare( "TIF", 3 ) )
//          mm = 99;                    // 99 = TIFF
//      else
            mm = 94;                    // 94 = BMP, GIF

        Write1GrfHdr( rStrm, pGrfNd, pFly, mm, nWidth, nHeight );   // Header
        rStrm << (BYTE)aFileN.Len();    // Pascal-String schreiben
        SwWW8Writer::WriteString8( rStrm, aFileN, FALSE, RTL_TEXTENCODING_MS_1252 );
    }
    else                                // Embedded File oder DDE oder so was
    {
        Graphic& rGrf = (Graphic&)(pGrfNd->GetGrf());
        BOOL bSwapped = rGrf.IsSwapOut();
        ((SwGrfNode*)pGrfNd)->SwapIn(); // immer ueber den Node einswappen !!!

        GDIMetaFile aMeta;

        switch ( rGrf.GetType() )
        {
        case GRAPHIC_BITMAP:            // Bitmap -> in Metafile abspielen
            {
                VirtualDevice aVirt;
                aMeta.Record( &aVirt );
                aVirt.DrawBitmap( Point( 0,0 ), rGrf.GetBitmap() );
                aMeta.Stop();
                aMeta.WindStart();
                aMeta.SetPrefMapMode( rGrf.GetPrefMapMode());
                aMeta.SetPrefSize( rGrf.GetPrefSize());
            }
            break;
        case GRAPHIC_GDIMETAFILE :      // GDI ( =SV ) Metafile
#ifndef VCL
        case GRAPHIC_WINMETAFILE :      // WinMetafile
#endif
                aMeta = rGrf.GetGDIMetaFile();
                break;
        default : return;
        }

//      ASSERT( aMeta.GetPrefMapMode().GetMapUnit() == MAP_100TH_MM,
//              "MapMode der Grafik ist nicht 1/100mm!" );

#ifdef DEBUG
        BOOL bSchreibsRaus  = FALSE;
        BOOL bSchreibsRein  = FALSE;
        long nSchreibsRausA = rStrm.Tell();
        long nSchreibsReinA = nSchreibsRausA;
#endif

        Write1GrfHdr( rStrm, pGrfNd, pFly, 8, nWidth, nHeight );    // Header
        WriteWindowMetafileBits( rStrm, aMeta );        // eigentliche Grafik

#ifdef DEBUG
        if(  bSchreibsRaus )
        {
            long nSchreibsRausZ = rStrm.Tell();
            SvFileStream aS( WW8_ASCII2STR( "e:\\ww-exp.wmf" ), STREAM_WRITE );
            rStrm.Seek( nSchreibsRausA );
            UINT16 nRead1;
            BYTE* pBuf = new BYTE[ 8192 ];
            ULONG nRead = nSchreibsRausZ - nSchreibsRausA;
            do{
                nRead1 = ( nRead > 8192 ) ? 8192 : (UINT16)nRead;
                rStrm.Read( pBuf, nRead1 );
                aS.Write(   pBuf, nRead1 );
                nRead -= nRead1;
            }while( nRead );
            aS.Close();
            rStrm.Seek( nSchreibsRausZ );
        }
        if(  bSchreibsRein )
        {
            SvFileStream aS( WW8_ASCII2STR( "e:\\ww-imp.wmf" ), STREAM_READ );
            aS.Seek( STREAM_SEEK_TO_END );
            ULONG nRead = aS.Tell();
            aS.Seek( 0 );
            rStrm.Seek( nSchreibsReinA );
            UINT16 nRead1;
            BYTE* pBuf = new BYTE[ 8192 ];
            do{
                nRead1 = ( nRead > 8192 ) ? 8192 : (UINT16)nRead;
                aS.Read(     pBuf, nRead1 );
                rStrm.Write( pBuf, nRead1 );
                nRead -= nRead1;
            }while( nRead );
            aS.Close();
            // kein Seek, da es hier im Stream weitergehen soll...
        }
#endif

        if( bSwapped ) rGrf.SwapOut();
    }
}

void SwWW8WrGrf::Write1Grf( SvStream& rStrm, const SwNoTxtNode* pNd,
                    const SwFlyFrmFmt* pFly, UINT16 nWidth, UINT16 nHeight )
{
    if( !pNd || ( !pNd->IsGrfNode() && !pNd->IsOLENode() ) )
        return;

    UINT32 nPos = rStrm.Tell();         // Grafik-Anfang merken

    if( pNd->IsGrfNode() )
    {
        const SwGrfNode* pGrfNd = pNd->GetGrfNode();
        Write1Grf1( rStrm, pGrfNd, pFly, nWidth, nHeight );
    }
    else if( pNd->IsOLENode() )
    {
        SwOLENode*                  pOleNd = ((SwNoTxtNode*)pNd)->GetOLENode(); // const wegcasten
        ASSERT( pOleNd, " Wer hat den OleNode versteckt ?" );
        SwOLEObj&                   rSObj= pOleNd->GetOLEObj();
        const SvInPlaceObjectRef    rObj(  rSObj.GetOleRef() );
        SvData                      aData( FORMAT_GDIMETAFILE );

        // das MetaFile wird sich jetzt ueber die SvData-Schnittstelle
        // besorgt, d.h. SvData-Object anlegen und via GetData
        // das MetaFile abholen. MakeMetaFile entfaellt,
        // der Rest ist gleich geblieben (KA 30.09.96)
        if ( rObj->GetData( &aData ) )
        {
            GDIMetaFile* pMtf = NULL;

            if ( aData.GetData( &pMtf, TRANSFER_MOVE ) )
            {
                DBG_ASSERT( pMtf, "Wo ist denn nun das MetaFile?" );

                Size aS ( pMtf->GetPrefSize() );
#ifdef DEBUG
                MapMode aMap ( pMtf->GetPrefMapMode() );
                ASSERT( pMtf->GetActionCount(), "OLE schreiben OK ? ( No Meta-Action )" );
                ASSERT( pMtf->GetPrefMapMode().GetMapUnit() == MAP_100TH_MM,
                        "MapMode des Ole ist nicht 1/100mm!" );
#endif
                pMtf->WindStart();
                pMtf->Play( Application::GetDefaultDevice(),
                            Point( 0, 0 ), Size( 2880, 2880 ) );
                Write1GrfHdr( rStrm, pNd, pFly, 8, nWidth, nHeight );   // Header
                WriteWindowMetafileBits( rStrm, *pMtf );                // eigentliche Grafik

#ifdef DEBUG_KA

                if( rWrt.GetIniFlags() & WWFL_KA_DEBUG )
                {
                    SvFileStream aS( WW8_ASCII2STR( "d:\\xxx.svm" ), STREAM_WRITE | STREAM_TRUNC );

                    aS << *pMtf;
                    aS.Close();

                    aS.Open( WW8_ASCII2STR( "d:\\xxx.wmf" ), STREAM_WRITE | STREAM_TRUNC  );
                    WriteWindowMetafile( aS, *pMtf );
                }

#endif // DEBUG_KA

                // brauchen wir nicht mehr
                delete pMtf;
            }
        }
    }

    UINT32 nPos2 = rStrm.Tell();                    // Ende merken
    rStrm.Seek( nPos );
    SVBT32 nLen;
    LongToSVBT32( nPos2 - nPos, nLen );             // Grafik-Laenge ausrechnen
    rStrm.Write( nLen, 4 );                         // im Header einpatchen
    rStrm.Seek( nPos2 );                            // Pos wiederherstellen
}

// SwWW8WrGrf::Write() wird nach dem Text gerufen. Es schreibt die alle
// Grafiken raus und merkt sich die File-Positionen der Grafiken, damit
// beim Schreiben der Attribute die Positionen in die PicLocFc-Sprms
// eingepatcht werden koennen.
// Das Suchen in den Attributen nach dem Magic ULONG und das Patchen
// passiert beim Schreiben der Attribute. Die SwWW8WrGrf-Klasse liefert
// hierfuer nur mit GetFPos() sequentiell die Positionen.
void SwWW8WrGrf::Write()
{
    nIdx = 0;       // fuers anschliessende Abfragen
    SvStream& rStrm = *rWrt.pDataStrm;
    for( USHORT i = 0; i < aNds.Count(); i++ )
    {
        UINT32 nPos = rStrm.Tell();                 // auf 4 Bytes alignen
        if( nPos & 0x3 )
            SwWW8Writer::FillCount( rStrm, 4 - ( nPos & 0x3 ) );

        aPos.Insert( rStrm.Tell(), aPos.Count() );  // Pos merken
        const SwNoTxtNode* pNd = (const SwNoTxtNode*)aNds[i];
        Write1Grf( rStrm, pNd, (const SwFlyFrmFmt*)aFlys[i],
                                aWid[i], aHei[i] );
    }
}

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ww8/wrtww8gr.cxx,v 1.1.1.1 2000-09-18 17:14:58 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.16  2000/09/18 16:04:58  willem.vandorp
      OpenOffice header added.

      Revision 1.15  2000/08/25 12:27:35  jp
      Graphic Crop-Attribut exported to SVX

      Revision 1.14  2000/08/18 13:02:29  jp
      don't export escaped URLs

      Revision 1.13  2000/07/05 16:07:38  jp
      new MS Filteroptions - change StarOffice Objects to OLE-Objects

      Revision 1.12  2000/06/26 09:58:38  jp
      must change: GetAppWindow->GetDefaultDevice

      Revision 1.11  2000/05/25 09:19:59  khz
      Changes for Unicode (for debug mode)

      Revision 1.10  2000/05/12 16:14:14  jp
      Changes for Unicode

      Revision 1.9  2000/02/11 14:39:59  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.8  1999/12/02 10:41:05  jp
      Bug #70093#: OutWW8_SwOleNode - write field with storage-username, W97 need it

      Revision 1.7  1999/10/29 17:40:22  jp
      export of 'complex'(vert. merged) tables

      Revision 1.6  1999/08/24 18:15:52  JP
      Escher Export


      Rev 1.5   24 Aug 1999 20:15:52   JP
   Escher Export

      Rev 1.4   06 Jul 1999 14:54:06   JP
   W97-Export corrections

      Rev 1.3   30 Jun 1999 19:56:46   JP
   W97-Export: Fields/PostIts/References

      Rev 1.2   04 Jun 1999 17:47:56   JP
   WW97-Export: Code aufgeteilt

      Rev 1.1   27 May 1999 23:42:28   JP
   Schnittstellen angepasst

      Rev 1.0   19 May 1999 11:20:20   JP
   WinWord97-ExportFilter

*************************************************************************/


diff --git a/sw/source/filter/ww8/ww8atr.cxx b/sw/source/filter/ww8/ww8atr.cxx
new file mode 100644
index 0000000..c04ba28
--- /dev/null
+++ b/sw/source/filter/ww8/ww8atr.cxx
@@ -0,0 +1,3489 @@
/*************************************************************************
 *
 *  $RCSfile: ww8atr.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:58 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

/*
 * Dieses File enthaelt alle Ausgabe-Funktionen des WW8-Writers;
 * fuer alle Nodes, Attribute, Formate und Chars.
 */

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#define ITEMID_BOXINFO      SID_ATTR_BORDER_INNER

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _APP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _SV_SALBTYPE_HXX
#include <vcl/salbtype.hxx>
#endif
#ifndef _ZFORMAT_HXX
#include <svtools/zformat.hxx>
#endif
#ifndef _SFXITEMITER_HXX //autogen
#include <svtools/itemiter.hxx>
#endif
#ifndef _SVX_FONTITEM_HXX
#include <svx/fontitem.hxx>
#endif
#ifndef _SVX_TSTPITEM_HXX //autogen
#include <svx/tstpitem.hxx>
#endif
#ifndef _SVX_ADJITEM_HXX //autogen
#include <svx/adjitem.hxx>
#endif
#ifndef _SVX_SPLTITEM_HXX //autogen
#include <svx/spltitem.hxx>
#endif
#ifndef _SVX_WIDWITEM_HXX //autogen
#include <svx/widwitem.hxx>
#endif
#ifndef _SVX_LSPCITEM_HXX //autogen
#include <svx/lspcitem.hxx>
#endif
#ifndef _SVX_KEEPITEM_HXX //autogen
#include <svx/keepitem.hxx>
#endif
#ifndef _SVX_SHADITEM_HXX //autogen
#include <svx/shaditem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _SVX_POSTITEM_HXX //autogen
#include <svx/postitem.hxx>
#endif
#ifndef _SVX_WGHTITEM_HXX //autogen
#include <svx/wghtitem.hxx>
#endif
#ifndef _SVX_KERNITEM_HXX //autogen
#include <svx/kernitem.hxx>
#endif
#ifndef _SVX_CRSDITEM_HXX //autogen
#include <svx/crsditem.hxx>
#endif
#ifndef _SVX_CMAPITEM_HXX //autogen
#include <svx/cmapitem.hxx>
#endif
#ifndef _SVX_WRLMITEM_HXX //autogen
#include <svx/wrlmitem.hxx>
#endif
#ifndef _SVX_UDLNITEM_HXX //autogen
#include <svx/udlnitem.hxx>
#endif
#ifndef _SVX_LANGITEM_HXX //autogen
#include <svx/langitem.hxx>
#endif
#ifndef _SVX_ESCPITEM_HXX //autogen
#include <svx/escpitem.hxx>
#endif
#ifndef _SVX_FHGTITEM_HXX //autogen
#include <svx/fhgtitem.hxx>
#endif
#ifndef _SVX_COLRITEM_HXX //autogen
#include <svx/colritem.hxx>
#endif
#ifndef _SVX_HYZNITEM_HXX //autogen
#include <svx/hyznitem.hxx>
#endif
#ifndef _SVX_BRKITEM_HXX //autogen
#include <svx/brkitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_ITEM_HXX //autogen
#include <svx/cntritem.hxx>
#endif
#ifndef _SVX_SHDDITEM_HXX //autogen
#include <svx/shdditem.hxx>
#endif
#ifndef _SVX_AKRNITEM_HXX //autogen wg. SvxAutoKernItem
#include <svx/akrnitem.hxx>
#endif
#ifndef _SVX_PBINITEM_HXX //autogen wg. SvxPaperBinItem
#include <svx/pbinitem.hxx>
#endif

#ifndef _FMTFLD_HXX //autogen
#include <fmtfld.hxx>
#endif
#ifndef _FCHRFMT_HXX //autogen
#include <fchrfmt.hxx>
#endif
#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _FMTPDSC_HXX //autogen
#include <fmtpdsc.hxx>
#endif
#ifndef _FMTHDFT_HXX //autogen
#include <fmthdft.hxx>
#endif
#ifndef _FMTORNT_HXX //autogen
#include <fmtornt.hxx>
#endif
#ifndef _FMTANCHR_HXX //autogen
#include <fmtanchr.hxx>
#endif
#ifndef _FMTCLDS_HXX //autogen
#include <fmtclds.hxx>
#endif
#ifndef _FMTSRND_HXX //autogen
#include <fmtsrnd.hxx>
#endif
#ifndef _FMTFTN_HXX //autogen
#include <fmtftn.hxx>
#endif
#ifndef _FMTFLCNT_HXX //autogen
#include <fmtflcnt.hxx>
#endif
#ifndef _FRMATR_HXX
#include <frmatr.hxx>
#endif
#ifndef _FMTINFMT_HXX //autogen wg. SwFmtINetFmt
#include <fmtinfmt.hxx>
#endif
#ifndef _TXTFLD_HXX //autogen wg. SwTxtFld
#include <txtfld.hxx>
#endif
#ifndef _TXTFTN_HXX //autogen wg. SwTxtFtn
#include <txtftn.hxx>
#endif
#ifndef _POOLFMT_HXX
#include <poolfmt.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>          // Doc fuer Fussnoten
#endif
#ifndef _PARATR_HXX
#include <paratr.hxx>
#endif
#ifndef _FLDBAS_HXX
#include <fldbas.hxx>       // fuer SwField ...
#endif
#ifndef _DOCUFLD_HXX
#include <docufld.hxx>       // fuer SwField ...
#endif
#ifndef _FORMAT_HXX
#include <format.hxx>
#endif
#ifndef _PAGEDESC_HXX
#include <pagedesc.hxx>     // fuer SwPageDesc...
#endif
#ifndef _FLDDAT_HXX
#include <flddat.hxx>       // fuer Datum-Felder
#endif
#ifndef _NDTXT_HXX
#include <ndtxt.hxx>        // fuer Numrules
#endif
#ifndef _NDINDEX_HXX
#include <ndindex.hxx>
#endif
#ifndef _FMTHBSH_HXX //autogen
#include <fmthbsh.hxx>
#endif
#ifndef _SWRECT_HXX //autogen
#include <swrect.hxx>
#endif
#ifndef _REFFLD_HXX //autogen wg. SwGetRefField
#include <reffld.hxx>
#endif
#ifndef _FTNINFO_HXX
#include <ftninfo.hxx>
#endif
#ifndef _CHARFMT_HXX
#include <charfmt.hxx>
#endif
#ifndef _SECTION_HXX
#include <section.hxx>
#endif
#ifndef SW_LINEINFO_HXX
#include <lineinfo.hxx>
#endif
#ifndef SW_FMTLINE_HXX
#include <fmtline.hxx>
#endif
#ifndef _TOX_HXX
#include <tox.hxx>
#endif
#ifndef _FMTFTNTX_HXX
#include <fmtftntx.hxx>
#endif


#ifdef DEBUG
# ifndef _FMTCNTNT_HXX
#  include <fmtcntnt.hxx>
# endif
#endif

#ifndef _WRTWW8_HXX
#include <wrtww8.hxx>
#endif


#define APP_ASC(s)          AppendAscii( RTL_CONSTASCII_STRINGPARAM( s ))
#define ASIGN_ASC(s)        AssignAscii( RTL_CONSTASCII_STRINGPARAM( s ))
#define CREA_ASC(s)         String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( s ))

/*
 * um nicht immer wieder nach einem Update festzustellen, das irgendwelche
 * Hint-Ids dazugekommen sind, wird hier definiert, die Groesse der Tabelle
 * definiert und mit der akt. verglichen. Bei unterschieden wird der
 * Compiler schon meckern.
 *
 * diese Section und die dazugeherigen Tabellen muessen in folgenden Files
 * gepflegt werden: rtf\rtfatr.cxx, sw6\sw6atr.cxx, w4w\w4watr.cxx
*/

#if !defined(MSC) && !defined(UNX) && !defined(PPC) && !defined(CSET) && !defined(__MWERKS__) && !defined(WTC)

#define ATTRFNTAB_SIZE 121
#if ATTRFNTAB_SIZE != POOLATTR_END - POOLATTR_BEGIN
#error "Attribut-Tabelle ist ungueltigt. Wurden neue Hint-ID's zugefuegt ??"
#endif

#if 0
#define FORMATTAB_SIZE 6
#if FORMATTAB_SIZE != RES_FMT_END - RES_FMT_BEGIN
#error "Format-Tabelle ist ungueltigt. Wurden neue Hint-ID's zugefuegt ??"
#endif
#endif

#define NODETAB_SIZE 3
#if NODETAB_SIZE != RES_NODE_END - RES_NODE_BEGIN
#error "Node-Tabelle ist ungueltigt. Wurden neue Hint-ID's zugefuegt ??"
#endif

#endif



extern void sw3io_ConvertToOldField( const SwField* pFld, USHORT& rWhich,
                              ULONG& rFmt, ULONG nFFVersion );


//#define WW8_OUT( rWrt, a ) ((SwWW8Writer&)rWrt).pO->Insert( (BYTE*)&a,\
//                   sizeof( a ), ((SwWW8Writer&)rWrt).pO->Count() )

#define WW8_OUT( rWrt, a ) \
    ((SwWW8Writer&)rWrt).OutSprmBytes( (BYTE*)&a, sizeof( a ) )



//------------------------------------------------------------
//  Forward-Declarationen
//------------------------------------------------------------
static Writer& OutWW8_SwFmtBreak( Writer& rWrt, const SfxPoolItem& rHt );
static Writer& OutWW8_SwNumRuleItem( Writer& rWrt, const SfxPoolItem& rHt );

//------------------------------------------------------------
//  Hilfsroutinen fuer Styles
//------------------------------------------------------------

/*
 * Format wie folgt ausgeben:
 *      - gebe die Attribute aus; ohne Parents!
 */

void SwWW8Writer::Out_SfxItemSet( const SfxItemSet& rSet,
                                  BOOL bPapFmt, BOOL bChpFmt )
{
    if( rSet.Count() )
    {
        const SfxPoolItem* pItem;
        FnAttrOut pOut;

        pISet = &rSet;                  // fuer Doppel-Attribute

        // first the NumRule and than the LRSpace, so will W97 understand it
        // and move away the paragraph from the left side
        if( bPapFmt && SFX_ITEM_SET == rSet.GetItemState( RES_PARATR_NUMRULE,
                                                            FALSE, &pItem ))
        {
            pOut = aWW8AttrFnTab[ RES_PARATR_NUMRULE - RES_CHRATR_BEGIN ];
            (*pOut)( *this, *pItem );
        }

        SfxItemIter aIter( rSet );
        pItem = aIter.GetCurItem();

        do {
            register USHORT nWhich = pItem->Which();
            pOut = aWW8AttrFnTab[nWhich - RES_CHRATR_BEGIN];
            if( 0 != pOut && (!bPapFmt || RES_PARATR_NUMRULE != nWhich ))
            {
                BOOL bChp = nWhich >= RES_CHRATR_BEGIN
                            && nWhich < RES_TXTATR_END;
                BOOL bPap = nWhich >= RES_PARATR_BEGIN
                            && nWhich < RES_FRMATR_END;
                if( ( bChpFmt && bChp  ) || ( bPapFmt && bPap ) )
                    (*pOut)( *this, *pItem );
            }
        } while( !aIter.IsAtEnd() && 0 != ( pItem = aIter.NextItem() ) );

        pISet = 0;                      // fuer Doppel-Attribute
    }
}

// Da WW nur Break-After ( Pagebreak und Sectionbreaks ) kennt, im SW aber
// Bagebreaks "vor" und "nach" und Pagedescs nur "vor" existieren, werden
// die Breaks 2* durchgeklimpert, naemlich vor und hinter jeder Zeile.
// Je nach BreakTyp werden sie vor oder nach der Zeile gesetzt.
// Es duerfen nur Funktionen gerufen werden, die nicht in den
// Ausgabebereich pO schreiben, da dieser nur einmal fuer CHP und PAP existiert
// und damit im falschen landen wuerden.
void SwWW8Writer::Out_SfxBreakItems( const SfxItemSet& rSet, const SwNode& rNd )
{
    if( rSet.Count() )
    {
        bBreakBefore = TRUE;

        const SfxPoolItem* pItem;
        if( !bStyDef && !bOutKF && !bOutPageDescs && SFX_ITEM_SET ==
            rSet.GetItemState( RES_PAGEDESC, FALSE, &pItem ) &&
            ((SwFmtPageDesc*)pItem)->GetRegisteredIn() )
        {
            // Die PageDescs werden beim Auftreten von PageDesc-Attributen nur
            // in WW8Writer::pSepx mit der entsprechenden Position eingetragen.
            // Das Aufbauen und die Ausgabe der am PageDesc haengenden Attribute
            // und Kopf/Fusszeilen passiert nach dem Haupttext und seinen Attributen.
            const SwFmtPageDesc& rPgDesc = *(SwFmtPageDesc*)pItem;
            pAktPageDesc = rPgDesc.GetPageDesc();
            if( pAktPageDesc )
            {
                ULONG nFcPos = ReplaceCr( 0x0c ); // Page/Section-Break

                // tatsaechlich wird hier NOCH NICHTS ausgegeben, sondern
                // nur die Merk-Arrays aCps, aSects entsprechend ergaenzt
                if( nFcPos )
                    pSepx->AppendSep( Fc2Cp( nFcPos ), rPgDesc, rNd,
                                      ((SwFmtLineNumber&)rSet.Get(
                                            RES_LINENUMBER )).GetStartValue());
            }
        }
        else if( SFX_ITEM_SET == rSet.GetItemState( RES_BREAK, FALSE, &pItem ) )
            OutWW8_SwFmtBreak( *this, *pItem );

        bBreakBefore = FALSE;
    }
}

void SwWW8Writer::CorrTabStopInSet( SfxItemSet& rSet, USHORT nAbsLeft )
{
    const SfxPoolItem* pItem;
    if( SFX_ITEM_SET == rSet.GetItemState( RES_PARATR_TABSTOP, TRUE, &pItem ))
    {
        // dann muss das fuer die Ausgabe korrigiert werden
        SvxTabStopItem aTStop( *(SvxTabStopItem*)pItem );
        for( USHORT nCnt = 0; nCnt < aTStop.Count(); ++nCnt )
        {
            SvxTabStop& rTab = (SvxTabStop&)aTStop[ nCnt ];
            if( SVX_TAB_ADJUST_DEFAULT != rTab.GetAdjustment() &&
                rTab.GetTabPos() >= nAbsLeft )
                rTab.GetTabPos() -= nAbsLeft;
            else
            {
                aTStop.Remove( nCnt );
                --nCnt;
            }
        }
        rSet.Put( aTStop );
    }
}

BYTE SwWW8Writer::GetNumId( USHORT eNumType )
{
    BYTE nRet = 0;
    switch( eNumType )
    {
    case SVX_NUM_CHARS_UPPER_LETTER:
    case SVX_NUM_CHARS_UPPER_LETTER_N:  nRet = 3;       break;
    case SVX_NUM_CHARS_LOWER_LETTER:
    case SVX_NUM_CHARS_LOWER_LETTER_N:  nRet = 4;       break;
    case SVX_NUM_ROMAN_UPPER:           nRet = 1;       break;
    case SVX_NUM_ROMAN_LOWER:           nRet = 2;       break;

    case SVX_NUM_BITMAP:
    case SVX_NUM_CHAR_SPECIAL:          nRet = 23;      break;

    // nix, macht WW undokumentiert auch so
    case SVX_NUM_NUMBER_NONE:           nRet = 0xff;    break;
    }
    return nRet;
}

void SwWW8Writer::Out_SwFmt( const SwFmt& rFmt, BOOL bPapFmt, BOOL bChpFmt,
                                BOOL bFlyFmt )
{
    BOOL bCallOutSet = TRUE;
    const SwModify* pOldMod = pOutFmtNode;
    pOutFmtNode = &rFmt;

    switch( rFmt.Which() )
    {
    case RES_CONDTXTFMTCOLL:
    case RES_TXTFMTCOLL:
        if( bPapFmt )
        {
            BYTE nLvl = ((const SwTxtFmtColl&)rFmt).GetOutlineLevel();
            if( MAXLEVEL > nLvl )
            {
                // if Write StyleDefinition then write the OutlineRule
                const SwNumFmt& rNFmt = pDoc->GetOutlineNumRule()->Get(nLvl);
                if( bStyDef )
                {
                    if( nLvl >= nWW8MaxListLevel )
                        nLvl = nWW8MaxListLevel-1;

                    if( bWrtWW8 )
                    {
                        // write sprmPIlvl and sprmPIlfo
                        SwWW8Writer::InsUInt16( *pO, 0x260a );
                        pO->Insert( nLvl, pO->Count() );
                        SwWW8Writer::InsUInt16( *pO, 0x460b );
                        SwWW8Writer::InsUInt16( *pO, 1 + GetId(
                                            *pDoc->GetOutlineNumRule() ) );
                    }
                    else
                    {
                        Out_SwNumLvl( nLvl );
                        if( rNFmt.GetAbsLSpace() )
                        {
                            SwNumFmt aNumFmt( rNFmt );
                            const SvxLRSpaceItem& rLR = (SvxLRSpaceItem&)
                                            rFmt.GetAttr( RES_LR_SPACE );
                            aNumFmt.SetAbsLSpace( aNumFmt.GetAbsLSpace() +
                                                    rLR.GetLeft() );
                            Out_NumRuleAnld( *pDoc->GetOutlineNumRule(),
                                            aNumFmt, nLvl );
                        }
                        else
                            Out_NumRuleAnld( *pDoc->GetOutlineNumRule(),
                                            rNFmt, nLvl );
                    }
                }

                if( rNFmt.GetAbsLSpace() )
                {
                    SfxItemSet aSet( rFmt.GetAttrSet() );
                    SvxLRSpaceItem aLR( (SvxLRSpaceItem&)aSet.Get( RES_LR_SPACE ) );

                    aLR.SetTxtLeft( aLR.GetTxtLeft() + rNFmt.GetAbsLSpace() );
                    aLR.SetTxtFirstLineOfst( rNFmt.GetFirstLineOffset() );

                    aSet.Put( aLR );
                    SwWW8Writer::CorrTabStopInSet( aSet, rNFmt.GetAbsLSpace() );
                    Out_SfxItemSet( aSet, bPapFmt, bChpFmt );
                    bCallOutSet = FALSE;
                }
            }
        }
        break;

    case RES_CHRFMT:    break;
    case RES_FLYFRMFMT:
        if( bFlyFmt )
        {
            SfxItemSet aSet( pDoc->GetAttrPool(), RES_FRMATR_BEGIN,
                                                RES_FRMATR_END-1 );
            aSet.Set( pFlyFmt->GetAttrSet() );

            // Fly als Zeichen werden bei uns zu Absatz-gebundenen
            // jetzt den Abstand vom Absatz-Rand setzen
            if( pFlyOffset )
            {
                aSet.Put( SwFmtVertOrient( pFlyOffset->Y() ));
                aSet.Put( SwFmtHoriOrient( pFlyOffset->X() ));
            }

            if( SFX_ITEM_SET != aSet.GetItemState( RES_SURROUND ))
                aSet.Put( SwFmtSurround( SURROUND_NONE ) );

            bOutFlyFrmAttrs  = TRUE;
            Out_SfxItemSet( aSet, TRUE, FALSE );
            bOutFlyFrmAttrs = FALSE;

            bCallOutSet = FALSE;
        }
        break;
    default:            ASSERT( !this, "Was wird hier ausgegeben ??? " );
                        break;
    }

    if( bCallOutSet )
        Out_SfxItemSet( rFmt.GetAttrSet(), bPapFmt, bChpFmt );
    pOutFmtNode = pOldMod;
}

BOOL SwWW8Writer::HasRefToObject( USHORT nTyp, const String* pNm,
                                    USHORT nSeqNo )
{
    BOOL bFnd = FALSE;
    const SwTxtNode* pNd;
    SwClientIter aIter( *pDoc->GetSysFldType( RES_GETREFFLD ));
    for( SwFmtFld* pFld = (SwFmtFld*)aIter.First( TYPE( SwFmtFld ));
            pFld && !bFnd; pFld = (SwFmtFld*)aIter.Next() )
        if( pFld->GetTxtFld() && nTyp == pFld->GetFld()->GetSubType() &&
            0 != ( pNd = pFld->GetTxtFld()->GetpTxtNode() ) &&
            pNd->GetNodes().IsDocNodes() )
        {
            const SwGetRefField& rRFld = *(SwGetRefField*)pFld->GetFld();
            switch( nTyp )
            {
            case REF_BOOKMARK:
            case REF_SETREFATTR:    bFnd = *pNm == rRFld.GetSetRefName(); break;
            case REF_FOOTNOTE:
            case REF_ENDNOTE:       bFnd = nSeqNo == rRFld.GetSeqNo(); break;

            case REF_SEQUENCEFLD:   break;      // ???
            case REF_OUTLINE:       break;      // ???
            }
        }

    return bFnd;
}

String SwWW8Writer::GetBookmarkName( USHORT nTyp, const String* pNm,
                                    USHORT nSeqNo )
{
    String sRet;
    switch( nTyp )
    {
    case REF_SETREFATTR:    (sRet.APP_ASC( "Ref_" )) += *pNm; break;
    case REF_SEQUENCEFLD:   break;      // ???
    case REF_BOOKMARK:      sRet = *pNm;    break;
    case REF_OUTLINE:       break;      // ???
    case REF_FOOTNOTE:      (sRet.APP_ASC( "_RefF" ))
                                += String::CreateFromInt32( nSeqNo );
                            break;
    case REF_ENDNOTE:       (sRet.APP_ASC( "_RefE" ))
                                += String::CreateFromInt32( nSeqNo );
                            break;
    }
    return sRet;
}

//-----------------------------------------------------------------------
/*  */
/* File CHRATR.HXX: */

static Writer& OutWW8_SwBoldUSW( Writer& rWrt, BYTE nId, BOOL bVal )
{
    SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt;
    if( rWrtWW8.bWrtWW8 )
        rWrtWW8.InsUInt16( 7 == nId ? 0x2a53 : 0x0835 + nId );
    else if( 7 == nId )
        return rWrt;            // das Attribut gibt es im WW6 nicht
    else
        rWrtWW8.pO->Insert( 85 + nId, rWrtWW8.pO->Count() );
    rWrtWW8.pO->Insert( bVal ? 1 : 0, rWrtWW8.pO->Count() );
    return rWrt;
}

static Writer& OutWW8_SwFont( Writer& rWrt, const SfxPoolItem& rHt )
{
    const SvxFontItem& rAttr = (const SvxFontItem&)rHt;
    SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt;
    USHORT nFontID= rWrtWW8.GetId( rAttr );

    if( rWrtWW8.bWrtWW8 )
    {
        // what about sprmCIdctHint (286F) ??
        rWrtWW8.InsUInt16( 0x4a4f );
        rWrtWW8.InsUInt16( nFontID );
        rWrtWW8.InsUInt16( 0x4a51 );
    }
    else
        rWrtWW8.pO->Insert( 93, rWrtWW8.pO->Count() );
    rWrtWW8.InsUInt16( nFontID );
    return rWrt;
}

static Writer& OutWW8_SwPosture( Writer& rWrt, const SfxPoolItem& rHt )
{
    return OutWW8_SwBoldUSW( rWrt, 1,
                ITALIC_NONE != ((const SvxPostureItem&)rHt).GetPosture() );
}

static Writer& OutWW8_SwWeight( Writer& rWrt, const SfxPoolItem& rHt )
{
    return OutWW8_SwBoldUSW( rWrt, 0,
                WEIGHT_BOLD == ((const SvxWeightItem&)rHt).GetWeight() );
}

// Shadowed und Contour gibts in WW-UI nicht. JP: ??
static Writer& OutWW8_SwContour( Writer& rWrt, const SfxPoolItem& rHt )
{
    return OutWW8_SwBoldUSW( rWrt, 3,
                            ((const SvxContourItem&)rHt).GetValue() );
}

static Writer& OutWW8_SwShadow( Writer& rWrt, const SfxPoolItem& rHt )
{
    return OutWW8_SwBoldUSW( rWrt, 4,
                            ((const SvxShadowedItem&)rHt).GetValue() );
}

static Writer& OutWW8_SwKerning( Writer& rWrt, const SfxPoolItem& rHt )
{
    const SvxKerningItem& rAttr = (const SvxKerningItem&)rHt;
    SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt;
    if( rWrtWW8.bWrtWW8 )
        rWrtWW8.InsUInt16( 0x8840 );
    else
        rWrtWW8.pO->Insert( 96, rWrtWW8.pO->Count() );
    rWrtWW8.InsUInt16( rAttr.GetValue() );
    return rWrt;
}

static Writer& OutWW8_SvxAutoKern( Writer& rWrt, const SfxPoolItem& rHt )
{
    const SvxAutoKernItem& rAttr = (const SvxAutoKernItem&)rHt;
    SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt;
    if( rWrtWW8.bWrtWW8 )
        rWrtWW8.InsUInt16( 0x484B );
    else
        rWrtWW8.pO->Insert( 107, rWrtWW8.pO->Count() );
    rWrtWW8.pO->Insert( rAttr.GetValue() ? 1 : 0, rWrtWW8.pO->Count() );
    return rWrt;
}


static Writer& OutWW8_SwCrossedOut( Writer& rWrt, const SfxPoolItem& rHt )
{
    FontStrikeout eSt = ((const SvxCrossedOutItem&)rHt).GetStrikeout();
    if( STRIKEOUT_DOUBLE == eSt )
        return OutWW8_SwBoldUSW( rWrt, 7, TRUE );
    if( STRIKEOUT_NONE != eSt )
        return OutWW8_SwBoldUSW( rWrt, 2, TRUE );

    // dann auch beide ausschalten!
    OutWW8_SwBoldUSW( rWrt, 7, FALSE );
    return OutWW8_SwBoldUSW( rWrt, 2, FALSE );
}

static Writer& OutWW8_SwCaseMap( Writer& rWrt, const SfxPoolItem& rHt )
{
    USHORT eSt = ((const SvxCaseMapItem&)rHt).GetValue();
    if( SVX_CASEMAP_KAPITAELCHEN == eSt )
        return OutWW8_SwBoldUSW( rWrt, 5, TRUE );
    if( SVX_CASEMAP_VERSALIEN == eSt )
        return OutWW8_SwBoldUSW( rWrt, 6, TRUE );

    // dann auch beide ausschalten!
    OutWW8_SwBoldUSW( rWrt, 5, FALSE );
    return OutWW8_SwBoldUSW( rWrt, 6, FALSE );
}

static Writer& OutWW8_SwUnderline( Writer& rWrt, const SfxPoolItem& rHt )
{
    const SvxUnderlineItem& rAttr = (const SvxUnderlineItem&)rHt;
    SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt;
    if( rWrtWW8.bWrtWW8 )
        rWrtWW8.InsUInt16( 0x2A3E );
    else
        rWrtWW8.pO->Insert( 94, rWrtWW8.pO->Count() );

    const SfxPoolItem* pItem = ((SwWW8Writer&)rWrt).HasItem(
                                            RES_CHRATR_WORDLINEMODE );
    BOOL bWord = pItem ? ((const SvxWordLineModeItem*)pItem)->GetValue() : FALSE;

        // WW95 - parameters:   0 = none,   1 = single, 2 = by Word,
        //                      3 = double, 4 = dotted, 5 = hidden
        // WW97 - additional parameters:
                            //  6 = thick,   7 = dash,       8 = dot(not used)
                            //  9 = dotdash 10 = dotdotdash, 11 = wave
    BYTE b = 0;
    switch( rAttr.GetUnderline() )
    {
    case UNDERLINE_SINGLE:          b = ( bWord ) ? 2 : 1;          break;
    case UNDERLINE_BOLD:            b = rWrtWW8.bWrtWW8 ?  6 : 1;   break;
    case UNDERLINE_DOUBLE:          b = 3;                          break;
    case UNDERLINE_DOTTED:          b = 4;                          break;
    case UNDERLINE_DASH:            b = rWrtWW8.bWrtWW8 ?  7 : 4;   break;
    case UNDERLINE_DASHDOT:         b = rWrtWW8.bWrtWW8 ?  9 : 4;   break;
    case UNDERLINE_DASHDOTDOT:      b = rWrtWW8.bWrtWW8 ? 10 : 4;   break;
    case UNDERLINE_WAVE:            b = rWrtWW8.bWrtWW8 ? 11 : 3;   break;
    // -------------  new in WW2000  -------------------------------------
    case UNDERLINE_BOLDDOTTED:      b = rWrtWW8.bWrtWW8 ? 20 : 4;   break;
    case UNDERLINE_BOLDDASH:        b = rWrtWW8.bWrtWW8 ? 23 : 4;   break;
    case UNDERLINE_LONGDASH:        b = rWrtWW8.bWrtWW8 ? 39 : 4;   break;
    case UNDERLINE_BOLDLONGDASH:    b = rWrtWW8.bWrtWW8 ? 55 : 4;   break;
    case UNDERLINE_BOLDDASHDOT:     b = rWrtWW8.bWrtWW8 ? 25 : 4;   break;
    case UNDERLINE_BOLDDASHDOTDOT:  b = rWrtWW8.bWrtWW8 ? 26 : 4;   break;
    case UNDERLINE_BOLDWAVE:        b = rWrtWW8.bWrtWW8 ? 27 : 3;   break;
    case UNDERLINE_DOUBLEWAVE:      b = rWrtWW8.bWrtWW8 ? 43 : 3;   break;
    }

    rWrtWW8.pO->Insert( b, rWrtWW8.pO->Count() );
    return rWrt;
}

static Writer& OutWW8_SwLanguage( Writer& rWrt, const SfxPoolItem& rHt )
{
    const SvxLanguageItem& rAttr = (const SvxLanguageItem&)rHt;
    SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt;
    if( rWrtWW8.bWrtWW8 )
        rWrtWW8.InsUInt16( 0x486D );    // use sprmCRgLid0 rather than sprmCLid
    else
        rWrtWW8.pO->Insert( 97, rWrtWW8.pO->Count() );
    rWrtWW8.InsUInt16( rAttr.GetLanguage() );
    return rWrt;
}

static Writer& OutWW8_SwEscapement( Writer& rWrt, const SfxPoolItem& rHt )
{
    const SvxEscapementItem& rAttr = (const SvxEscapementItem&)rHt;
    SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt;

    BYTE b = 0xFF;
    short nEsc = rAttr.GetEsc(), nProp = rAttr.GetProp();
    if( !nEsc )
    {
        b = 0;
        nEsc = 0;
        nProp = 100;
    }
    else if( DFLT_ESC_PROP == nProp )
    {
        if( DFLT_ESC_SUB == nEsc || DFLT_ESC_AUTO_SUB == nEsc )
            b = 2;
        else if( DFLT_ESC_SUPER == nEsc || DFLT_ESC_AUTO_SUPER == nEsc )
            b = 1;
    }

    if( 0xFF != b )
    {
        if( rWrtWW8.bWrtWW8 )
            rWrtWW8.InsUInt16( 0x2A48 );
        else
            rWrtWW8.pO->Insert( 104, rWrtWW8.pO->Count() );
        rWrtWW8.pO->Insert( b, rWrtWW8.pO->Count() );
    }

    if( 0 == b || 0xFF == b )
    {
        long nHeight = ((SvxFontHeightItem&)rWrtWW8.GetItem(
                                    RES_CHRATR_FONTSIZE )).GetHeight();
        if( rWrtWW8.bWrtWW8 )
            rWrtWW8.InsUInt16( 0x4845 );
        else
            rWrtWW8.pO->Insert( 101, rWrtWW8.pO->Count() );
        rWrtWW8.InsUInt16( (short)(( nHeight * nEsc + 500 ) / 1000 ));

        if( 100 != nProp || !b )
        {
            if( rWrtWW8.bWrtWW8 )
                rWrtWW8.InsUInt16( 0x4A43 );
            else
                rWrtWW8.pO->Insert( 99, rWrtWW8.pO->Count() );
            rWrtWW8.InsUInt16( ( nHeight * nProp + 500 ) / 1000 );
        }
    }
    return rWrt;
}

static Writer& OutWW8_SwSize( Writer& rWrt, const SfxPoolItem& rHt )
{
    const SvxFontHeightItem& rAttr = (const SvxFontHeightItem&)rHt;
    SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt;
    if( rWrtWW8.bWrtWW8 )
        rWrtWW8.InsUInt16( 0x4A43 );
    else
        rWrtWW8.pO->Insert( 99, rWrtWW8.pO->Count() );
    rWrtWW8.InsUInt16( (UINT16)(( rAttr.GetHeight() + 5 ) / 10 ) );
    return rWrt;
}


// TransCol uebersetzt SW-Farben in WW. Heraus kommt die bei WW fuer
// Text- und Hintergrundfarbe benutzte Codierung.
// Gibt es keine direkte Entsprechung, dann wird versucht, eine moeglichst
// aehnliche WW-Farbe zu finden.
// return: 5-Bit-Wert ( 0..16 )
BYTE SwWW8Writer::TransCol( const Color& rCol )
{
    BYTE nCol = 0;      // ->Auto
    switch( rCol.GetColor() )
    {
    case COL_BLACK:         nCol = 1;   break;
    case COL_BLUE:          nCol = 9;   break;
    case COL_GREEN:         nCol = 11;  break;
    case COL_CYAN:          nCol = 10;  break;
    case COL_RED:           nCol = 13;  break;
    case COL_MAGENTA:       nCol = 12;  break;
    case COL_BROWN:         nCol = 14;  break;
    case COL_GRAY:          nCol = 15;  break;
    case COL_LIGHTGRAY:     nCol = 16;  break;
    case COL_LIGHTBLUE:     nCol = 2;   break;
    case COL_LIGHTGREEN:    nCol = 4;   break;
    case COL_LIGHTCYAN:     nCol = 3;   break;
    case COL_LIGHTRED:      nCol = 6;   break;
    case COL_LIGHTMAGENTA:  nCol = 5;   break;
    case COL_YELLOW:        nCol = 7;   break;
    case COL_WHITE:         nCol = 8;   break;

    default:
        if( !pBmpPal )
        {
            pBmpPal = new BitmapPalette( 16 );
            static const ColorData aColArr[ 16 ] = {
                COL_BLACK,      COL_LIGHTBLUE,  COL_LIGHTCYAN,  COL_LIGHTGREEN,
                COL_LIGHTMAGENTA,COL_LIGHTRED,  COL_YELLOW,     COL_WHITE,
                COL_BLUE,       COL_CYAN,       COL_GREEN,      COL_MAGENTA,
                COL_RED,        COL_BROWN,      COL_GRAY,       COL_LIGHTGRAY
            };

            for( int i = 0; i < 16; ++i )
                pBmpPal->operator[]( i ) = Color( aColArr[ i ] );
        }
        nCol = pBmpPal->GetBestIndex( rCol ) + 1;
        break;
    }
    return nCol;
}

// TransBrush uebersetzt SW-Brushes in WW. Heraus kommt WW8_SHD.
// Nicht-Standardfarben des SW werden noch nicht in die
// Misch-Werte ( 0 .. 95% ) vom WW uebersetzt.
// Return: Echte Brush ( nicht transparent )
// auch bei Transparent wird z.B. fuer Tabellen eine transparente Brush
// geliefert
BOOL SwWW8Writer::TransBrush( const Color& rCol, WW8_SHD& rShd )
{
    if( rCol.GetTransparency() )
        rShd = WW8_SHD();               // alles Nullen : transparent
    else
    {
        rShd.SetFore( 8);
        rShd.SetBack( TransCol( rCol ) );
        rShd.SetStyle( bWrtWW8, 0 );
    }
    return !rCol.GetTransparency();
}

static Writer& OutWW8_SwColor( Writer& rWrt, const SfxPoolItem& rHt )
{
    const SvxColorItem& rAttr = (const SvxColorItem&)rHt;
    SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt;
    if( rWrtWW8.bWrtWW8 )
        rWrtWW8.InsUInt16( 0x2A42 );
    else
        rWrtWW8.pO->Insert( 98, rWrtWW8.pO->Count() );

    rWrtWW8.pO->Insert( rWrtWW8.TransCol( ((const SvxColorItem&)rHt).
                                        GetValue() ), rWrtWW8.pO->Count() );
    return rWrt;
}

static Writer& OutWW8_SwFmtCharBackground( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwWW8Writer& rWW8Wrt = (SwWW8Writer&)rWrt;

    if( rWW8Wrt.bWrtWW8 )   // nur WW8 kann ZeichenHintergrund
    {
        const SvxBrushItem& rBack = (const SvxBrushItem&)rHt;
        WW8_SHD aSHD;

        if( rWW8Wrt.TransBrush( rBack.GetColor(), aSHD ) )
        {
            // sprmCShd
            rWW8Wrt.InsUInt16( 0x4866 );
            rWW8Wrt.InsUInt16( aSHD.GetValue() );
        }
    }
    return rWrt;
}

static Writer& OutSwFmtINetFmt( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt;
    const SwFmtINetFmt& rINet = (SwFmtINetFmt&)rHt;

    if( rINet.GetValue().Len() )
    {
        USHORT nId;
        const String& rStr = rINet.GetINetFmt();
        if( rStr.Len() )
            nId = rINet.GetINetFmtId();
        else
            nId = RES_POOLCHR_INET_NORMAL;

        const SwCharFmt* pFmt = IsPoolUserFmt( nId )
                        ? rWrt.pDoc->FindCharFmtByName( rStr )
                        : rWrt.pDoc->GetCharFmtFromPool( nId );

        if( rWrtWW8.bWrtWW8 )
            rWrtWW8.InsUInt16( 0x4A30 );
        else
            rWrtWW8.pO->Insert( 80, rWrtWW8.pO->Count() );

        rWrtWW8.InsUInt16( rWrtWW8.GetId( *pFmt ) );
    }
    return rWrt;
}


static void InsertSpecialChar( SwWW8Writer& rWrt, BYTE c )
{
    WW8Bytes aItems;
    if( rWrt.pChpIter )
        rWrt.pChpIter->GetItems( aItems );

    if( 0x13 == c )
        rWrt.pChpPlc->AppendFkpEntry( rWrt.Strm().Tell() );
    else
        rWrt.pChpPlc->AppendFkpEntry( rWrt.Strm().Tell(), aItems.Count(),
                                    aItems.GetData() );

    // at end the attributes writes by the Textnode
    if( 0x15 == c )
        aItems.Remove( 0, aItems.Count() );

    rWrt.WriteChar( c );

    // fSpec-Attribut TRUE
    if( rWrt.bWrtWW8 )
        SwWW8Writer::InsUInt16( aItems, 0x855 );
    else
        aItems.Insert( 117, aItems.Count() );
    aItems.Insert( 1, aItems.Count() );

    rWrt.pChpPlc->AppendFkpEntry( rWrt.Strm().Tell(), aItems.Count(),
                                    aItems.GetData() );
}


void SwWW8Writer::OutField( const SwField* pFld, BYTE nFldType,
                            const String& rFldCmd, BYTE nMode )
{
    static BYTE                 aFld13[2] = { 0x13, 0x00 };  // will change
    static BYTE __READONLY_DATA aFld14[2] = { 0x14, 0xff };
    static BYTE __READONLY_DATA aFld15[2] = { 0x15, 0x80 };

    BOOL bUnicode = IsUnicode();
    WW8_WrPlcFld* pFldP;
    switch ( nTxtTyp )
    {
    case TXT_MAINTEXT:  pFldP = pFldMain;       break;
    case TXT_HDFT:      pFldP = pFldHdFt;       break;
    case TXT_FTN:       pFldP = pFldFtn;        break;
    case TXT_EDN:       pFldP = pFldEdn;        break;
    case TXT_TXTBOX:    pFldP = pFldTxtBxs;     break;
    case TXT_HFTXTBOX:  pFldP = pFldHFTxtBxs;   break;

    default:
        ASSERT( !this, "was ist das fuer ein SubDoc-Type?" );
        break;
    }

    if( WRITEFIELD_START & nMode )
    {
        aFld13[1] = nFldType;                           // Typ nachtragen
        pFldP->Append( Fc2Cp( Strm().Tell() ), aFld13 );
        InsertSpecialChar( *this, 0x13 );
    }
    if( WRITEFIELD_CMD_START & nMode )
    {
        if( bUnicode )
            SwWW8Writer::WriteString16( Strm(), rFldCmd, FALSE );
        else
            SwWW8Writer::WriteString8( Strm(), rFldCmd, FALSE,
                                                RTL_TEXTENCODING_MS_1252 );
    }
    if( WRITEFIELD_CMD_END & nMode )
    {
//      Strm() << " \\* FORMATVERBINDEN ";
        pFldP->Append( Fc2Cp( Strm().Tell() ), aFld14 );
        InsertSpecialChar( *this, 0x14 );
    }
    if( WRITEFIELD_END & nMode )
    {
        String sOut;
        if( pFld )
            sOut = pFld->Expand();
        else
            sOut = rFldCmd;
        if( sOut.Len() )
        {
            if( bUnicode )
                SwWW8Writer::WriteString16( Strm(), sOut, FALSE );
            else
                SwWW8Writer::WriteString8( Strm(), sOut, FALSE,
                                                RTL_TEXTENCODING_MS_1252 );
        }
    }
    if( WRITEFIELD_CLOSE & nMode )
    {
        pFldP->Append( Fc2Cp( Strm().Tell() ), aFld15 );
        InsertSpecialChar( *this, 0x15 );
    }
}

void SwWW8Writer::StartCommentOutput(const String& rName)
{
    String aStr( CREA_ASC( " ANGEBEN [" )); ( aStr += rName ).APP_ASC( "] " );
    OutField( 0, 35, aStr, WRITEFIELD_START | WRITEFIELD_CMD_START );
}

void SwWW8Writer::EndCommentOutput(const String& rName)
{
    String aStr( CREA_ASC( " [" )); ( aStr += rName ).APP_ASC(  "] " );
    OutField( 0, 35, aStr, WRITEFIELD_CMD_END | WRITEFIELD_END |
                            WRITEFIELD_CLOSE );
}


USHORT SwWW8Writer::GetId( const SwTOXType& rTOXType )
{
    void* p = (void*)&rTOXType;
    USHORT nRet = aTOXArr.GetPos( p );
    if( USHRT_MAX == nRet )
        aTOXArr.Insert( p, nRet = aTOXArr.Count() );
    return nRet;
}

// return values:  1 - no PageNum,
//                 2 - TabStop before PageNum,
//                 3 - Text before PageNum - rTxt hold the text
//                 4 - no Text and no TabStop before PageNum
int lcl_CheckForm( const SwForm& rForm, BYTE nLvl, String& rText )
{
    int nRet = 4;
    rText.Erase();

    SwFormTokenEnumerator aIter( rForm.CreateTokenEnumerator( nLvl ));
    BOOL bPgNumFnd = FALSE;
    FormTokenType eTType;
    while( TOKEN_END != ( eTType = aIter.GetNextTokenType() ) && !bPgNumFnd )
    {
        switch( eTType )
        {
        case TOKEN_PAGE_NUMS:
            bPgNumFnd = TRUE;
            break;

        case TOKEN_TAB_STOP:
            nRet = 2;
            break;
        case TOKEN_TEXT:
            nRet = 3;
            rText = aIter.GetCurToken().sText.Copy( 0, 5 );
            break;

        case TOKEN_LINK_START:
        case TOKEN_LINK_END:
            break;

        default:
            nRet = 4;
            break;
        }
    }

    if( !bPgNumFnd )
        nRet = 1;

    return nRet;
}


void SwWW8Writer::StartTOX( const SwSection& rSect )
{
    const SwTOXBase* pTOX = rSect.GetTOXBase();
    if( pTOX )
    {
        static sal_Char __READONLY_DATA sContent[] = " VERZEICHNIS \\w \\x ";
        static sal_Char __READONLY_DATA sIndex[] = " INDEX ";
        static sal_Char __READONLY_DATA sEntryEnd[] = "\" ";


        BYTE nCode;
        String aStr;
        switch( pTOX->GetType() )
        {
        case TOX_INDEX:
            {
                nCode = 8;
                aStr.AssignAscii( sIndex );

                if( pTOX->GetTOXForm().IsCommaSeparated() )
                    aStr.APP_ASC( "\\r " );

                if( TOI_ALPHA_DELIMITTER & pTOX->GetOptions() )
                    aStr.APP_ASC( "\\h \"A\" " );

                {
                    String aFillTxt;
                    for( BYTE n = 1; n <= 3; ++n )
                    {
                        String aTxt;
                        int nRet = ::lcl_CheckForm( pTOX->GetTOXForm(),
                                                    n, aTxt );

                        if( 3 == nRet )
                            aFillTxt = aTxt;
                        else if( 4 == nRet )
                            aFillTxt = '\t';
                        else
                            aFillTxt.Erase();
                    }
                    (aStr.APP_ASC( "\\e \"" )) += aFillTxt;
                    aStr.AppendAscii( sEntryEnd );
                }
            }
            break;

//      case TOX_AUTHORITIES:   nCode = 73; aStr = ???; break;

        case TOX_ILLUSTRATIONS:
        case TOX_OBJECTS:
        case TOX_TABLES:
            if( !pTOX->IsFromObjectNames() )
            {
                nCode = 13;
                aStr.AssignAscii( sContent );

                (( aStr.APP_ASC( "\\c \"" )) += pTOX->GetSequenceName()
                                ).AppendAscii( sEntryEnd );
                String aTxt;
                int nRet = ::lcl_CheckForm( pTOX->GetTOXForm(), 1, aTxt );
                if( 1 == nRet )
                    aStr.APP_ASC( "\\n " );
                else if( 3 == nRet || 4 == nRet )
                    (( aStr.APP_ASC( "\\p \"" )) += aTxt ).AppendAscii(sEntryEnd);
            }
            break;

//      case TOX_USER:
//      case TOX_CONTENT:
        default:
            {
                nCode = 13;
                aStr.AssignAscii( sContent );

                String sTOption;
                USHORT n, nTOXLvl = pTOX->GetLevel();
                if( !nTOXLvl )
                    ++nTOXLvl;

                if( TOX_MARK & pTOX->GetCreateType() )
                {
                    aStr.APP_ASC( "\\f " );

                    if( TOX_USER == pTOX->GetType() )
                        (( aStr += '\"' ) +=
                                (sal_Char)( 'A' + GetId( *pTOX->GetTOXType() ))
                                    ).AppendAscii( sEntryEnd );
                }

                if( TOX_OUTLINELEVEL & pTOX->GetCreateType() )
                {
                    // are the chapter template the normal headline 1 to 9 ?
                    // search all outlined collections
                    BYTE nLvl, nMinLvl = MAXLEVEL;
                    const SwTxtFmtColls& rColls = *pDoc->GetTxtFmtColls();
                    const SwTxtFmtColl* pColl;
                    for( n = rColls.Count(); n; )
                        if( MAXLEVEL > (nLvl = ( pColl =
                                    rColls[ --n ] )->GetOutlineLevel() ) &&
                              nMinLvl > nLvl &&
                            ( RES_POOLCOLL_HEADLINE1 > pColl->GetPoolFmtId() ||
                              RES_POOLCOLL_HEADLINE9 < pColl->GetPoolFmtId() ))
                        {
                            nMinLvl = nLvl;
                        }

                    nLvl = nMinLvl < nTOXLvl ? nMinLvl : (BYTE)nTOXLvl;
                    if( nLvl )
                    {
                        USHORT nTmpLvl = nLvl + 1;
                        if( nTmpLvl > nWW8MaxListLevel )
                            nTmpLvl = nWW8MaxListLevel;

                        ((aStr.APP_ASC( "\\o \"1-" )) +=
                            String::CreateFromInt32( nTmpLvl ))
                                    .AppendAscii(sEntryEnd);
                    }

                    if( nLvl != nMinLvl )
                    {
                        // collect this templates into the \t otion
                        for( n = rColls.Count(); n; )
                            if( MAXLEVEL > (nLvl = ( pColl =
                                    rColls[ --n ] )->GetOutlineLevel() ) &&
                                  nMinLvl <= nLvl )
                            {
                                if( sTOption.Len() )
                                    sTOption += ';';
                                (( sTOption += pColl->GetName() ) += ';' )
                                        += String::CreateFromInt32( nLvl + 1 );
                            }
                    }
                }

                if( TOX_TEMPLATE & pTOX->GetCreateType() )
                    for( n = 0; n < nTOXLvl; ++n )
                    {
                        const String& rStyles = pTOX->GetStyleNames( n );
                        if( rStyles.Len() )
                        {
                            xub_StrLen nPos = 0;
                            String sLvl( ';' );
                            sLvl += String::CreateFromInt32( n + 1 );
                            do {
                                String sStyle( rStyles.GetToken( 0,
                                            TOX_STYLE_DELIMITER, nPos ));
                                if( sStyle.Len() )
                                {
                                    if( sTOption.Len() )
                                        sTOption += ';';
                                    ( sTOption += sStyle ) += sLvl;
                                }
                            } while( STRING_NOTFOUND != nPos );
                        }
                    }

                {
                    String aFillTxt;
                    BYTE nNoPgStt = MAXLEVEL, nNoPgEnd = MAXLEVEL;
                    BOOL bFirstFillTxt = TRUE, bOnlyText = TRUE;
                    for( n = 0; n < nTOXLvl; ++n )
                    {
                        String aTxt;
                        int nRet = ::lcl_CheckForm( pTOX->GetTOXForm(),
                                                    n+1, aTxt );
                        if( 1 == nRet )
                        {
                            bOnlyText = FALSE;
                            if( MAXLEVEL == nNoPgStt )
                                nNoPgStt = n+1;
                        }
                        else
                        {
                            if( MAXLEVEL != nNoPgStt &&
                                MAXLEVEL == nNoPgEnd )
                                nNoPgEnd = BYTE(n);

                            bOnlyText = bOnlyText && 3 == nRet;
                            if( 3 == nRet || 4 == nRet )
                            {
                                if( bFirstFillTxt )
                                    aFillTxt = aTxt;
                                else if( aFillTxt != aTxt )
                                    aFillTxt.Erase();
                                bFirstFillTxt = FALSE;
                            }
                        }
                    }
                    if( MAXLEVEL != nNoPgStt )
                    {
                        if( nWW8MaxListLevel < nNoPgEnd )
                            nNoPgEnd = nWW8MaxListLevel;
                        aStr.APP_ASC( "\\n " );
                        (aStr += String::CreateFromInt32( nNoPgStt )) += '-';
                        (aStr += String::CreateFromInt32( nNoPgEnd  )) += ' ';
                    }
                    if( bOnlyText )
                        ((aStr.APP_ASC( "\\p \"" )) += aFillTxt )
                                .AppendAscii(sEntryEnd);
                }

                if( sTOption.Len() )
                    (( aStr.APP_ASC( "\\t \"" )) += sTOption )
                        .AppendAscii(sEntryEnd);
            }
            break;
        }

        if( aStr.Len() )
        {
            bInWriteTOX = TRUE;
            OutField( 0, nCode, aStr, WRITEFIELD_START |
                                WRITEFIELD_CMD_START | WRITEFIELD_CMD_END );
        }
    }
    bStartTOX = FALSE;
}

void SwWW8Writer::EndTOX( const SwSection& rSect )
{
    const SwTOXBase* pTOX = rSect.GetTOXBase();
    if( pTOX )
    {
        BYTE nCode = TOX_INDEX == pTOX->GetType() ? 8 : 13;
        OutField( 0, nCode, aEmptyStr, WRITEFIELD_CLOSE );
    }
    bInWriteTOX = FALSE;
}



// GetDatePara, GetTimePara, GetNumberPara modifizieren die String-Ref
// Es werden die deutschen Format-Spezifier benutzt, da im FIB auch dt. als
// Creator angegeben ist.
BOOL SwWW8Writer::GetNumberFmt( const SwField& rFld, String& rStr )
{
    BOOL bHasFmt = FALSE;
    SvNumberFormatter* pNFmtr = pDoc->GetNumberFormatter();
    UINT32 nFmtIdx = rFld.GetFormat();
    const SvNumberformat* pNumFmt = pNFmtr->GetEntry( nFmtIdx );
    if( pNumFmt )
    {
        USHORT nLng = rFld.GetLanguage();
        const International aIntl( nLng );
        if( !pKeyMap )
        {
            pKeyMap = new NfKeywordTable;
            NfKeywordTable& rKeyMap = *(NfKeywordTable*)pKeyMap;
//          aKeyMap[ NF_KEY_NONE = 0,
//          aKeyMap[ NF_KEY_E,
//          aKeyMap[ NF_KEY_AMPM,
//          aKeyMap[ NF_KEY_AP,
            rKeyMap[ NF_KEY_MI      ].ASIGN_ASC( "m" );
            rKeyMap[ NF_KEY_MMI     ].ASIGN_ASC( "mm" );
            rKeyMap[ NF_KEY_M       ].ASIGN_ASC( "M" );
            rKeyMap[ NF_KEY_MM      ].ASIGN_ASC( "MM" );
            rKeyMap[ NF_KEY_MMM     ].ASIGN_ASC( "MMM" );
            rKeyMap[ NF_KEY_MMMM    ].ASIGN_ASC( "MMMM" );
            rKeyMap[ NF_KEY_H       ].ASIGN_ASC( "H" );
            rKeyMap[ NF_KEY_HH      ].ASIGN_ASC( "HH" );
            rKeyMap[ NF_KEY_S       ].ASIGN_ASC( "s" );
            rKeyMap[ NF_KEY_SS      ].ASIGN_ASC( "ss" );
//          aKeyMap[ NF_KEY_Q,
//          aKeyMap[ NF_KEY_QQ,
            rKeyMap[ NF_KEY_T       ].ASIGN_ASC( "t" );
            rKeyMap[ NF_KEY_TT      ].ASIGN_ASC( "tt" );
            rKeyMap[ NF_KEY_TTT     ].ASIGN_ASC( "ttt" );
            rKeyMap[ NF_KEY_TTTT    ].ASIGN_ASC( "tttt" );
            rKeyMap[ NF_KEY_JJ      ].ASIGN_ASC( "jj" );
            rKeyMap[ NF_KEY_JJJJ    ].ASIGN_ASC( "jjjj" );
            rKeyMap[ NF_KEY_NN      ].ASIGN_ASC( "ttt" );
            rKeyMap[ NF_KEY_NNNN    ].ASIGN_ASC( "tttt" );
//          aKeyMap[ NF_KEY_CCC,
//          aKeyMap[ NF_KEY_GENERAL,
//          aKeyMap[ NF_KEY_NNN,
//          aKeyMap[ NF_KEY_WW,
//          aKeyMap[ NF_KEY_QUARTER,
//          aKeyMap[ NF_KEY_TRUE,
//          aKeyMap[ NF_KEY_FALSE,
//          aKeyMap[ NF_KEY_BOOLEAN,
        }

        String sFmt( pNumFmt->GetMappedFormatstring(
                        *(NfKeywordTable*)pKeyMap, aIntl, TRUE ));
        if( sFmt.Len() )
        {
            (( rStr.APP_ASC( "\\@\"" )) += sFmt ).APP_ASC( "\" " );
            bHasFmt = TRUE;
        }
    }
    return bHasFmt;
}

void WW8_GetNumberPara( String& rStr, const SwField& rFld )
{
    switch( rFld.GetFormat() )
    {
    case SVX_NUM_CHARS_UPPER_LETTER:
    case SVX_NUM_CHARS_UPPER_LETTER_N: rStr.APP_ASC( "\\*ALPHABETISCH "); break;
    case SVX_NUM_CHARS_LOWER_LETTER:
    case SVX_NUM_CHARS_LOWER_LETTER_N: rStr.APP_ASC("\\*alphabetisch "); break;
    case SVX_NUM_ROMAN_UPPER:        rStr.APP_ASC("\\*R\xd6MISCH "); break;
    case SVX_NUM_ROMAN_LOWER:        rStr.APP_ASC("\\*r\xf6misch "); break;
    case SVX_NUM_ARABIC:             rStr.APP_ASC("\\*Arabisch "); break;
    }
}

void SwWW8Writer::WritePostItBegin( const SwPostItField& rPostIt,
                                    WW8Bytes* pO )
{
    BYTE aArr[ 3 ];
    BYTE* pArr = aArr;

    // sprmCFSpec TRUE
    if( bWrtWW8 )
        Set_UInt16( pArr, 0x855 );
    else
        Set_UInt8( pArr, 117 );
    Set_UInt8( pArr, 1 );

    pChpPlc->AppendFkpEntry( Strm().Tell() );
    WriteChar( 0x05 );              // Annotation reference

    if( pO )
        pO->Insert( aArr, pArr - aArr, pO->Count() );
    else
        pChpPlc->AppendFkpEntry( Strm().Tell(), pArr - aArr, aArr );
}

static Writer& OutWW8_SwField( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwWW8Writer& rWW8Wrt = (SwWW8Writer&)rWrt;
    const SwFmtFld& rFld = (SwFmtFld&)rHt;
    const SwField* pFld = rFld.GetFld();
    String aStr;        // fuer optionale Parameter
    BOOL bWriteExpand = FALSE;
    USHORT nSubType = pFld->GetSubType();
    BYTE nFldTyp = 0;

    switch( pFld->GetTyp()->Which() )
    {
//  case RES_CHAPTERFLD:
//      break;

    case RES_SETEXPFLD:
        if( GSE_SEQ == nSubType )
        {
            (( aStr.ASIGN_ASC( " SEQ \"" )) += pFld->GetTyp()->GetName() )
                    .APP_ASC( "\" " );
            ::WW8_GetNumberPara( aStr, *pFld );
            rWW8Wrt.OutField( pFld, 12, aStr );
        }
        else
            bWriteExpand = TRUE;
        break;

    case RES_PAGENUMBERFLD:
        aStr.ASIGN_ASC( " SEITE " );
        ::WW8_GetNumberPara( aStr, *pFld );
        rWW8Wrt.OutField( pFld, 33, aStr );
        break;

    case RES_FILENAMEFLD:
        rWW8Wrt.OutField( pFld, 29, CREA_ASC( "DATEINAME" ));
        break;

    case RES_DBNAMEFLD:
        aStr.ASIGN_ASC( "DATENBANK " );         // ok ??
        aStr += rWrt.pDoc->GetDBName();
        rWW8Wrt.OutField( pFld, 78, aStr );
        break;

    case RES_AUTHORFLD:
        rWW8Wrt.OutField( pFld, (AF_SHORTCUT & nSubType ? 61 : 60),
                            CREA_ASC( "AUTOR" ));
        break;

    case RES_TEMPLNAMEFLD:
        rWW8Wrt.OutField( pFld, 30, CREA_ASC("DOKVORLAGE" ));
        break;

    case RES_DOCINFOFLD:    // Last printed, last edited,...
        if( DI_SUB_FIXED & nSubType )
            bWriteExpand = TRUE;
        else
        {
            static sal_Char __READONLY_DATA sFld15[] = "TITLE";
            static sal_Char __READONLY_DATA sFld16[] = "THEMA";
            static sal_Char __READONLY_DATA sFld17[] = "AUTOR ";
            static sal_Char __READONLY_DATA sFld18[] = "STICHW\xd6RTER";
            static sal_Char __READONLY_DATA sFld19[] = "KOMMENTAR";
            static sal_Char __READONLY_DATA sFld20[] = "GESPEICHERTVON";
            static sal_Char __READONLY_DATA sFld21[] = "ERSTELLDAT ";
            static sal_Char __READONLY_DATA sFld22[] = "SPEICHERDAT ";
            static sal_Char __READONLY_DATA sFld23[] = "DRUCKDAT ";
            static sal_Char __READONLY_DATA sFld24[] = "\xdc" "BERARBEITUNGSNUMMER";

            static const sal_Char* __READONLY_DATA aFldArr[] = {
                    sFld15, sFld16, sFld17, sFld18, sFld19,
                    sFld20, sFld21, sFld22, sFld23, sFld24
            };

            switch( 0xff & nSubType )
            {
            case DI_TITEL:      nFldTyp = 15;   break;
            case DI_THEMA:      nFldTyp = 16;   break;
            case DI_KEYS:       nFldTyp = 18;   break;
            case DI_COMMENT:    nFldTyp = 19;   break;
            case DI_DOCNO:      nFldTyp = 24;   break;

            case DI_CREATE:
                if( DI_SUB_AUTHOR == (nSubType & ~DI_SUB_AUTHOR ))
                    nFldTyp = 17;
                else if( rWW8Wrt.GetNumberFmt( *pFld, aStr ))
                    nFldTyp = 21;
                break;

            case DI_CHANGE:
                if( DI_SUB_AUTHOR == (nSubType & ~DI_SUB_AUTHOR ))
                    nFldTyp = 20;
                break;

            case DI_PRINT:
                if( DI_SUB_AUTHOR != (nSubType & ~DI_SUB_AUTHOR ) &&
                    rWW8Wrt.GetNumberFmt( *pFld, aStr ))
                    nFldTyp = 23;
                break;
            case DI_EDIT:
                if( DI_SUB_AUTHOR != (nSubType & ~DI_SUB_AUTHOR ) &&
                    rWW8Wrt.GetNumberFmt( *pFld, aStr ))
                    nFldTyp = 22;
                break;
            }

            if( nFldTyp )
            {
                aStr.InsertAscii( aFldArr[ nFldTyp - 15 ], 0 );
                rWW8Wrt.OutField( pFld, nFldTyp, aStr );
            }
            else
                bWriteExpand = TRUE;
        }
        break;

    case RES_DATETIMEFLD:
        if( FIXEDFLD & nSubType || !rWW8Wrt.GetNumberFmt( *pFld, aStr ) )
            bWriteExpand = TRUE;
        else
        {
            const sal_Char* pAddStr;
            USHORT nTyp;
            if( DATEFLD & nSubType )
            {
                pAddStr = " AKTUALDAT ";
                nTyp = 31;
            }
            else
            {
                pAddStr = " ZEIT ";
                nTyp = 32;
            }
            aStr.InsertAscii( pAddStr, 0 );
            rWW8Wrt.OutField( pFld, nTyp, aStr );
        }
        break;

    case RES_DOCSTATFLD:
        {
            switch( nSubType )
            {
            case DS_PAGE:   aStr.ASIGN_ASC(" ANZSEITEN ");      nFldTyp = 26; break;
            case DS_WORD:   aStr.ASIGN_ASC(" ANZW\xd6RTER ");   nFldTyp = 27; break;
            case DS_CHAR:   aStr.ASIGN_ASC(" ANZZEICHEN ");     nFldTyp = 28; break;
            }

            if( nFldTyp )
            {
                ::WW8_GetNumberPara( aStr, *pFld );
                rWW8Wrt.OutField( pFld, nFldTyp, aStr );
            }
            else
                bWriteExpand = TRUE;
        }
        break;
    case RES_EXTUSERFLD:
        {
            switch( 0xFF & nSubType  )
            {
            case EU_FIRSTNAME:
            case EU_NAME:
                nFldTyp = 60;
                aStr.ASIGN_ASC("BENUTZERNAME");
                break;

            case EU_SHORTCUT:
                nFldTyp = 61;
                aStr.ASIGN_ASC("BENUTZERINITIALEN");
                break;

            case EU_STREET:
            case EU_COUNTRY:
            case EU_ZIP:
            case EU_CITY:
                nFldTyp = 62;
                aStr.ASIGN_ASC("BENUTZERADR");
                break;
            }
            if( nFldTyp )
                rWW8Wrt.OutField( pFld, nFldTyp, aStr );
            else
                bWriteExpand = TRUE;
        }
        break;

    case RES_POSTITFLD:
        {
            const SwPostItField& rPFld = *(SwPostItField*)pFld;
            rWW8Wrt.pAtn->Append( rWW8Wrt.Fc2Cp( rWrt.Strm().Tell() ), rPFld );
            rWW8Wrt.WritePostItBegin( rPFld, rWW8Wrt.pO );
        }
        break;

    case RES_INPUTFLD:
        ((aStr.ASIGN_ASC("EINGEBEN \"" )) += pFld->GetPar2() )+= '\"';
        rWW8Wrt.OutField( pFld, 39, aStr );
        break;

    case RES_GETREFFLD:
        {
            aStr.ASIGN_ASC(" REF ");
            const SwGetRefField& rRFld = *(SwGetRefField*)pFld;
            switch( nSubType )
            {
            case REF_SETREFATTR:
            case REF_BOOKMARK:
                aStr += rWW8Wrt.GetBookmarkName( nSubType,
                                                &rRFld.GetSetRefName(), 0 );
                nFldTyp = 3;
                break;

            case REF_FOOTNOTE:
            case REF_ENDNOTE:
                aStr += rWW8Wrt.GetBookmarkName( nSubType, 0,
                                                rRFld.GetSeqNo() );
                nFldTyp = REF_ENDNOTE == nSubType ? 72 : 5;
                switch( pFld->GetFormat() )
                {
                case REF_PAGE_PGDESC:
                case REF_PAGE:
                case REF_UPDOWN:
                    break;
                default:
                    aStr.InsertAscii( "FUSSENDNOTE", 1 );
                    break;
                }
                break;

//          case REF_SEQUENCEFLD:   // ???
//          case REF_OUTLINE:       // 10
            // page reference - 37
            // DDE reference  - 45
            // DDE automatic reference - 46
            }

            if( nFldTyp )
            {
                switch( pFld->GetFormat() )
                {
                case REF_PAGE_PGDESC:
                case REF_PAGE:
                    aStr.InsertAscii( "SEITEN", 1 );
                    nFldTyp = 37;
                    break;

                case REF_UPDOWN:
                    aStr.APP_ASC( " \\p" );
                    nFldTyp = 3;
                    break;

                case REF_CHAPTER:
                case REF_ONLYNUMBER:
                case REF_ONLYCAPTION:
                case REF_ONLYSEQNO:
                    break;
                // default:
                // case REF_CONTENT:
                }

                aStr.APP_ASC( " \\h " );        // insert hyperlink
                rWW8Wrt.OutField( pFld, nFldTyp, aStr );

            }
            else
                bWriteExpand = TRUE;
        }
        break;

    default:
        bWriteExpand = TRUE;
        break;
    }

    if( bWriteExpand )
    {
        if( rWW8Wrt.IsUnicode() )
            SwWW8Writer::WriteString16( rWrt.Strm(), pFld->Expand(), FALSE );
        else
            SwWW8Writer::WriteString8(  rWrt.Strm(), pFld->Expand(), FALSE,
                                                    RTL_TEXTENCODING_MS_1252 );
    }

    return rWrt;
}

static Writer& OutWW8_SwFlyCntnt( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt;
    if( rWrtWW8.pOutFmtNode && rWrtWW8.pOutFmtNode->ISA( SwCntntNode ))
    {
        SwTxtNode* pTxtNd = (SwTxtNode*)rWrtWW8.pOutFmtNode;

        Point aLayPos;
        aLayPos = pTxtNd->FindLayoutRect( FALSE, &aLayPos ).Pos();

        rWrtWW8.OutWW8FlyFrm( *((SwFmtFlyCnt&)rHt).GetFrmFmt(), aLayPos );
    }
    return rWrt;
}

// TOXMarks fehlen noch

// Detaillierte Einstellungen zur Trennung erlaubt WW nur dokumentenweise.
// Man koennte folgende Mimik einbauen: Die Werte des Style "Standard" werden,
// falls vorhanden, in die Document Properties ( DOP ) gesetzt.
// ---
// ACK.  Dieser Vorschlag passt exakt zu unserer Implementierung des Import,
// daher setze ich das gleich mal um. (KHZ, 07/15/2000)
static Writer& OutWW8_SvxHyphenZone( Writer& rWrt, const SfxPoolItem& rHt )
{
// sprmPFNoAutoHyph
    const SvxHyphenZoneItem& rAttr = (const SvxHyphenZoneItem&)rHt;
    SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt;
    if( rWrtWW8.bWrtWW8 )
        rWrtWW8.InsUInt16( 0x242A );
    else
        rWrtWW8.pO->Insert( 44, rWrtWW8.pO->Count() );

    rWrtWW8.pO->Insert( rAttr.IsHyphen() ? 0 : 1, rWrtWW8.pO->Count() );
    return rWrt;
}

// NoHyphen: ich habe keine Entsprechung in der SW-UI und WW-UI gefunden

static Writer& OutWW8_SwHardBlank( Writer& rWrt, const SfxPoolItem& rHt )
{
    ((SwWW8Writer&)rWrt).WriteChar( ((SwFmtHardBlank&)rHt).GetChar() );
    return rWrt;
}

// RefMark, NoLineBreakHere  fehlen noch

void SwWW8Writer::WriteFtnBegin( const SwFmtFtn& rFtn, WW8Bytes* pOutArr )
{
    WW8Bytes aAttrArr;
    BOOL bAutoNum = !rFtn.GetNumStr().Len();    // Auto-Nummer
    if( bAutoNum )
    {
        if( bWrtWW8 )
        {
            static BYTE __READONLY_DATA aSpec[] = {
                0x03, 0x6a, 0, 0, 0, 0,         // sprmCObjLocation (wahrscheinlich unnoetig)
                0x55, 0x08, 1                   // sprmCFSpec
            };

            aAttrArr.Insert( aSpec, sizeof( aSpec ), aAttrArr.Count() );
        }
        else
        {
            static BYTE __READONLY_DATA aSpec[] = {
                117, 1,                         // sprmCFSpec
                68, 4, 0, 0, 0, 0               // sprmCObjLocation (wahrscheinlich unnoetig)
            };
            aAttrArr.Insert( aSpec, sizeof( aSpec ), aAttrArr.Count() );
        }
    }

        // sprmCIstd
    const SwEndNoteInfo* pInfo;
    if( rFtn.IsEndNote() )
        pInfo = &pDoc->GetEndNoteInfo();
    else
        pInfo = &pDoc->GetFtnInfo();
    const SwCharFmt* pCFmt = pOutArr
                                ? pInfo->GetAnchorCharFmt( *pDoc )
                                : pInfo->GetCharFmt( *pDoc );
    if( bWrtWW8 )
        SwWW8Writer::InsUInt16( aAttrArr, 0x4a30 );
    else
        aAttrArr.Insert( 80, aAttrArr.Count() );
    SwWW8Writer::InsUInt16( aAttrArr, GetId( *pCFmt ) );

                                                // fSpec-Attribut TRUE
                            // Fuer Auto-Nummer muss ein Spezial-Zeichen
                            // in den Text und darum ein fSpec-Attribut
    pChpPlc->AppendFkpEntry( Strm().Tell() );
    if( bAutoNum )
        WriteChar( 0x02 );              // Auto-Nummer-Zeichen
    else
        // User-Nummerierung
        OutSwString( rFtn.GetNumStr(), 0, rFtn.GetNumStr().Len(),
                        IsUnicode(), RTL_TEXTENCODING_MS_1252 );

    if( pOutArr )
    {
        // insert at start of array, so the "hard" attribute overrule the
        // attributes of the character template
        pOutArr->Insert( &aAttrArr, 0 );
    }
    else
    {
        WW8Bytes aOutArr;

        // insert at start of array, so the "hard" attribute overrule the
        // attributes of the character template
        aOutArr.Insert( &aAttrArr, 0 );

        // write for the ftn number in the content, the font of the anchor
        const SwTxtFtn* pTxtFtn = rFtn.GetTxtFtn();
        if( pTxtFtn )
        {
            WW8Bytes* pOld = pO;
            pO = &aOutArr;
            SfxItemSet aSet( pDoc->GetAttrPool(), RES_CHRATR_FONT,
                                                    RES_CHRATR_FONT );

            pCFmt = pInfo->GetCharFmt( *pDoc );
            aSet.Set( pCFmt->GetAttrSet() );

            pTxtFtn->GetTxtNode().GetAttr( aSet, *pTxtFtn->GetStart(),
                                            (*pTxtFtn->GetStart()) + 1 );
            ::OutWW8_SwFont( *this, aSet.Get( RES_CHRATR_FONT ));
            pO = pOld;
        }
        pChpPlc->AppendFkpEntry( Strm().Tell(), aOutArr.Count(),
                                                aOutArr.GetData() );
    }
}

static BOOL lcl_IsAtTxtEnd( const SwFmtFtn& rFtn )
{
    BOOL bRet = TRUE;
    if( rFtn.GetTxtFtn() )
    {
        USHORT nWh = rFtn.IsEndNote() ? RES_END_AT_TXTEND
                                      : RES_FTN_AT_TXTEND;
        const SwSectionNode* pSectNd = rFtn.GetTxtFtn()->GetTxtNode().
                                                        FindSectionNode();
        while( pSectNd && FTNEND_ATPGORDOCEND ==
                ((const SwFmtFtnAtTxtEnd&)pSectNd->GetSection().GetFmt()->
                GetAttr( nWh, TRUE )).GetValue() )
            pSectNd = pSectNd->FindStartNode()->FindSectionNode();

        if( !pSectNd )
            bRet = FALSE;   // the is ftn/end collected at Page- or Doc-End
    }
    return bRet;
}


static Writer& OutWW8_SwFtn( Writer& rWrt, const SfxPoolItem& rHt )
{
    const SwFmtFtn& rFtn = (const SwFmtFtn&)rHt;
    SwWW8Writer& rWW8Wrt = (SwWW8Writer&)rWrt;

    USHORT nTyp;
    WW8_WrPlcFtnEdn* pFtnEnd;
    if( rFtn.IsEndNote() )
    {
        pFtnEnd = rWW8Wrt.pEdn;
        nTyp = REF_ENDNOTE;
        if( rWW8Wrt.bEndAtTxtEnd )
            rWW8Wrt.bEndAtTxtEnd = lcl_IsAtTxtEnd( rFtn );
    }
    else
    {
        pFtnEnd = rWW8Wrt.pFtn;
        nTyp = REF_FOOTNOTE;
        if( rWW8Wrt.bFtnAtTxtEnd )
            rWW8Wrt.bFtnAtTxtEnd = lcl_IsAtTxtEnd( rFtn );
    }

    // if any reference to this footnote/endnote then insert an internal
    // Bookmark.
    String sBkmkNm;
    if( rWW8Wrt.HasRefToObject( nTyp, 0, rFtn.GetTxtFtn()->GetSeqRefNo() ))
    {
        sBkmkNm = rWW8Wrt.GetBookmarkName( nTyp, 0,
                                    rFtn.GetTxtFtn()->GetSeqRefNo() );
        rWW8Wrt.AppendBookmark( sBkmkNm );
    }


    pFtnEnd->Append( rWW8Wrt.Fc2Cp( rWrt.Strm().Tell() ), rFtn );
    rWW8Wrt.WriteFtnBegin( rFtn, rWW8Wrt.pO );

    if( sBkmkNm.Len() )
        rWW8Wrt.AppendBookmark( sBkmkNm );

    return rWrt;
}



static Writer& OutWW8_SwTxtCharFmt( Writer& rWrt, const SfxPoolItem& rHt )
{
    const SwFmtCharFmt& rAttr = (const SwFmtCharFmt&)rHt;
    if( rAttr.GetCharFmt() )
    {
        SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt;
        if( rWrtWW8.bWrtWW8 )
            rWrtWW8.InsUInt16( 0x4A30 );
        else
            rWrtWW8.pO->Insert( 80, rWrtWW8.pO->Count() );

        rWrtWW8.InsUInt16( rWrtWW8.GetId( *rAttr.GetCharFmt() ) );
    }
    return rWrt;
}


static Writer& OutWW8_SwNumRuleItem( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwWW8Writer& rWW8Wrt = (SwWW8Writer&)rWrt;
    const SwNumRuleItem& rNumRule = (const SwNumRuleItem&)rHt;

    const SwTxtNode* pTxtNd = 0;
    USHORT nNumId;
    BYTE nLvl = 0;
    if( rNumRule.GetValue().Len() )
    {
        const SwNumRule* pRule = rWrt.pDoc->FindNumRulePtr(
                                        rNumRule.GetValue() );
        if( pRule && USHRT_MAX != ( nNumId = rWW8Wrt.GetId( *pRule )) )
        {
            ++nNumId;
            if( rWW8Wrt.pOutFmtNode )
            {
                if( rWW8Wrt.pOutFmtNode->ISA( SwCntntNode ))
                {
                    pTxtNd = (SwTxtNode*)rWW8Wrt.pOutFmtNode;
                    const SwNodeNum* pNum = pTxtNd->GetNum();

                    if( pNum && NO_NUM > pNum->GetLevel() )
                        nLvl = GetRealLevel( pNum->GetLevel() );
                }
                else if( rWW8Wrt.pOutFmtNode->ISA( SwTxtFmtColl ))
                {
                    const SwTxtFmtColl* pC = (SwTxtFmtColl*)rWW8Wrt.pOutFmtNode;
                    if( pC && MAXLEVEL > pC->GetOutlineLevel() )
                        nLvl = pC->GetOutlineLevel();
                }
            }
        }
        else
            nNumId = USHRT_MAX;
    }
    else
        nNumId = 0;

    if( USHRT_MAX != nNumId )
    {
        if( nLvl >= nWW8MaxListLevel )
            nLvl = nWW8MaxListLevel-1;
        if( rWW8Wrt.bWrtWW8 )
        {
            // write sprmPIlvl and sprmPIlfo
            SwWW8Writer::InsUInt16( *rWW8Wrt.pO, 0x260a );
            rWW8Wrt.pO->Insert( nLvl, rWW8Wrt.pO->Count() );
            SwWW8Writer::InsUInt16( *rWW8Wrt.pO, 0x460b );
            SwWW8Writer::InsUInt16( *rWW8Wrt.pO, nNumId );
        }
        else if( pTxtNd && rWW8Wrt.Out_SwNum( pTxtNd ) )                // NumRules
            rWW8Wrt.pSepx->SetNum( pTxtNd );
    }
    return rWrt;
}

/* File FRMATR.HXX */

static Writer& OutWW8_SwFrmSize( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwWW8Writer& rWW8Wrt = (SwWW8Writer&)rWrt;
    const SwFmtFrmSize& rSz = (const SwFmtFrmSize&)rHt;

    if( rWW8Wrt.bOutFlyFrmAttrs )                   // Flys
    {
        if( rWW8Wrt.bOutGrf )
            return rWrt;                // Fly um Grafik -> Auto-Groesse

//???? was ist bei Prozentangaben ???
        if( rSz.GetWidth() )
        {
            //"sprmPDxaWidth"
            if( rWW8Wrt.bWrtWW8 )
                rWW8Wrt.InsUInt16( 0x841A );
            else
                rWW8Wrt.pO->Insert( 28, rWW8Wrt.pO->Count() );
            rWW8Wrt.InsUInt16( (USHORT)rSz.GetWidth() );
        }

        if( rSz.GetHeight() )
        {
            // sprmPWHeightAbs
            if( rWW8Wrt.bWrtWW8 )
                rWW8Wrt.InsUInt16( 0x442B );
            else
                rWW8Wrt.pO->Insert( 45, rWW8Wrt.pO->Count() );

            USHORT nH = 0;
            switch( rSz.GetSizeType() )
            {
            case ATT_VAR_SIZE: break;
            case ATT_FIX_SIZE: nH = (USHORT)rSz.GetHeight() & 0x7fff; break;
            default:           nH = (USHORT)rSz.GetHeight() | 0x8000; break;
            }
            rWW8Wrt.InsUInt16( nH );
        }
    }
    else if( rWW8Wrt.bOutPageDescs )            // PageDesc : Breite + Hoehe
    {
        if( rWW8Wrt.pAktPageDesc->GetLandscape() )
        {
            /*sprmSBOrientation*/
            if( rWW8Wrt.bWrtWW8 )
                rWW8Wrt.InsUInt16( 0x301d );
            else
                rWW8Wrt.pO->Insert( 162, rWW8Wrt.pO->Count() );
            rWW8Wrt.pO->Insert( 2, rWW8Wrt.pO->Count() );
        }

        /*sprmSXaPage*/
        if( rWW8Wrt.bWrtWW8 )
            rWW8Wrt.InsUInt16( 0xB01F );
        else
            rWW8Wrt.pO->Insert( 164, rWW8Wrt.pO->Count() );
        rWW8Wrt.InsUInt16( (USHORT)rSz.GetWidth() );

        /*sprmSYaPage*/
        if( rWW8Wrt.bWrtWW8 )
            rWW8Wrt.InsUInt16( 0xB020 );
        else
            rWW8Wrt.pO->Insert( 165, rWW8Wrt.pO->Count() );
        rWW8Wrt.InsUInt16( (USHORT)rSz.GetHeight() );
    }
    return rWrt;
}

// FillOrder fehlt noch

// ReplaceCr() wird fuer Pagebreaks und Pagedescs gebraucht. Es wird ein
// bereits geschriebenes CR durch ein Break-Zeichen ersetzt. Replace muss
// direkt nach Schreiben des CR gerufen werden.
// Rueckgabe: FilePos des ersetzten CRs + 1 oder 0 fuer nicht ersetzt

ULONG SwWW8Writer::ReplaceCr( BYTE nChar )
{
    // Bug #49917#
    ASSERT( nChar, "gegen 0 ersetzt bringt WW97/95 zum Absturz" );

    ULONG nRetPos = 0, nPos = Strm().Tell();
    Strm().SeekRel( IsUnicode() ? -2 : -1 );
    BYTE nC1;
    Strm().Read( &nC1, 1 );
    if( nC1 == 0x0d )               // CR ?
    {
        Strm().SeekRel( -1 );       // CR hinter Zeile
        Strm().Write( &nChar, 1 );  // durch nChar ersetzen
        nRetPos = nPos;
    }
    Strm().Seek( nPos );

    if( 0x7 == nC1 )            // at end of TableRow ?
    {
        // then write as normal char
        WriteChar( nChar );
        nRetPos = Strm().Tell();
    }
#ifdef PRODUCT
    else
    {
        ASSERT( nRetPos || nPos == (ULONG)pFib->fcMin,
                "WW8_ReplaceCr an falscher FilePos gerufen" );
    }
#endif
    return nRetPos;
}

// Breaks schreiben nichts in das Ausgabe-Feld rWrt.pO,
// sondern nur in den Text-Stream ( Bedingung dafuer, dass sie von Out_Break...
// gerufen werden duerfen )
static Writer& OutWW8_SwFmtBreak( Writer& rWrt, const SfxPoolItem& rHt )
{
/*UMSTELLEN*/
    SwWW8Writer& rWW8Wrt = (SwWW8Writer&)rWrt;
    const SvxFmtBreakItem &rBreak = (const SvxFmtBreakItem&)rHt;

    if( rWW8Wrt.bStyDef )
    {
        switch( rBreak.GetBreak() )
        {
//JP 21.06.99: column breaks does never change to pagebreaks
//      case SVX_BREAK_COLUMN_BEFORE:
//      case SVX_BREAK_COLUMN_BOTH:

        case SVX_BREAK_PAGE_BEFORE:
        case SVX_BREAK_PAGE_BOTH:
            // sprmPPageBreakBefore/sprmPFPageBreakBefore
            if( rWW8Wrt.bWrtWW8 )
                rWW8Wrt.InsUInt16( 0x2407 );
            else
                rWW8Wrt.pO->Insert( 9, rWW8Wrt.pO->Count() );
            rWW8Wrt.pO->Insert( rBreak.GetValue() ? 1 : 0, rWW8Wrt.pO->Count() );
            break;
        }
    }
    else if( !rWW8Wrt.pFlyFmt )
    {
        BYTE nC = 0;
        BOOL bBefore = FALSE;

        switch( rBreak.GetBreak() )
        {
        case SVX_BREAK_NONE:                                // Ausgeschaltet
            if( !rWW8Wrt.bBreakBefore )
            {
                // sprmPPageBreakBefore/sprmPFPageBreakBefore
                if( rWW8Wrt.bWrtWW8 )
                    rWW8Wrt.InsUInt16( 0x2407 );
                else
                    rWW8Wrt.pO->Insert( 9, rWW8Wrt.pO->Count() );
                rWW8Wrt.pO->Insert( (BYTE)0, rWW8Wrt.pO->Count() );
            }
            return rWrt;

        case SVX_BREAK_COLUMN_BEFORE:                       // ColumnBreak
            bBefore = TRUE;
                // no break;
        case SVX_BREAK_COLUMN_AFTER:
        case SVX_BREAK_COLUMN_BOTH:
            nC = 0xe;
            break;

        case SVX_BREAK_PAGE_BEFORE:                         // PageBreak
            bBefore = TRUE;
            // no break;
        case SVX_BREAK_PAGE_AFTER:
        case SVX_BREAK_PAGE_BOTH:
            nC = 0xc;
            break;
        }

        if( (bBefore == rWW8Wrt.bBreakBefore ) && nC )  // #49917#
            rWW8Wrt.ReplaceCr( nC );
    }
    return rWrt;
}

static Writer& OutWW8_SvxPaperBin( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt;
    const SvxPaperBinItem& rItem = (const SvxPaperBinItem&)rHt;

    if( rWrtWW8.bOutPageDescs )
    {
        USHORT nVal;
        switch( rItem.GetValue() )
        {
        case 0: nVal = 15;  break;      // Automatically select
        case 1: nVal = 1;   break;      // Upper paper tray
        case 2: nVal = 4;   break;      // Manual paper feed
        default: nVal = 0;  break;
        }

        if( nVal )
        {
            // sprmSDmBinFirst  0x5007  word
            // sprmSDmBinOther  0x5008  word
            BYTE nOff = rWrtWW8.bOutFirstPage ? 0 : 1;
            if( rWrtWW8.bWrtWW8 )
                rWrtWW8.InsUInt16( 0x5007 + nOff );
            else
                rWrtWW8.pO->Insert( 140 + nOff, rWrtWW8.pO->Count() );
            rWrtWW8.InsUInt16( nVal );
        }
    }
    return rWrt;
}

static Writer& OutWW8_SwFmtLRSpace( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwWW8Writer& rWW8Wrt = (SwWW8Writer&)rWrt;
    const SvxLRSpaceItem & rLR = (const SvxLRSpaceItem&) rHt;


    // Flys fehlen noch ( siehe RTF )

    if( rWW8Wrt.bOutFlyFrmAttrs )                   // Flys
    {
        // sprmPDxaFromText10
        if( rWW8Wrt.bWrtWW8 )
            rWW8Wrt.InsUInt16( 0x4622 );
        else
            rWW8Wrt.pO->Insert( 49, rWW8Wrt.pO->Count() );
        // Mittelwert nehmen, da WW nur 1 Wert kennt
        rWW8Wrt.InsUInt16( (USHORT) ( ( rLR.GetLeft() + rLR.GetRight() ) / 2 ) );
    }
    else if( rWW8Wrt.bOutPageDescs )                // PageDescs
    {
        USHORT nLDist, nRDist;
        const SfxPoolItem* pItem = ((SwWW8Writer&)rWrt).HasItem( RES_BOX );
        if( pItem )
        {
            nRDist = ((SvxBoxItem*)pItem)->CalcLineSpace( BOX_LINE_LEFT );
            nLDist = ((SvxBoxItem*)pItem)->CalcLineSpace( BOX_LINE_RIGHT );
        }
        else
            nLDist = nRDist = 0;
        nLDist += rLR.GetLeft();
        nRDist += rLR.GetRight();

        // sprmSDxaLeft
        if( rWW8Wrt.bWrtWW8 )
            rWW8Wrt.InsUInt16( 0xB021 );
        else
            rWW8Wrt.pO->Insert( 166, rWW8Wrt.pO->Count() );
        rWW8Wrt.InsUInt16( nLDist );
        // sprmSDxaRight
        if( rWW8Wrt.bWrtWW8 )
            rWW8Wrt.InsUInt16( 0xB022 );
        else
            rWW8Wrt.pO->Insert( 167, rWW8Wrt.pO->Count() );
        rWW8Wrt.InsUInt16( nRDist );
    }
    else
    {                                          // normale Absaetze
        // sprmPDxaLeft
        if( rWW8Wrt.bWrtWW8 )
            rWW8Wrt.InsUInt16( 0x840F );
        else
            rWW8Wrt.pO->Insert( 17, rWW8Wrt.pO->Count() );
        rWW8Wrt.InsUInt16( rLR.GetTxtLeft() );
        // sprmPDxaRight
        if( rWW8Wrt.bWrtWW8 )
            rWW8Wrt.InsUInt16( 0x840E );
        else
            rWW8Wrt.pO->Insert( 16, rWW8Wrt.pO->Count() );
        rWW8Wrt.InsUInt16( rLR.GetRight() );
        // sprmPDxaLeft1
        if( rWW8Wrt.bWrtWW8 )
            rWW8Wrt.InsUInt16( 0x8411 );
        else
            rWW8Wrt.pO->Insert( 19, rWW8Wrt.pO->Count() );
        rWW8Wrt.InsUInt16( rLR.GetTxtFirstLineOfst() );
    }
    return rWrt;
}

static USHORT lcl_CalcHdFtDist( const SwFrmFmt& rFmt, BOOL bLower )
{
    long nDist = 0;
    SwRect aRect( rFmt.FindLayoutRect( FALSE ));
    if( aRect.Height() )
        nDist += aRect.Height();
    else
    {
        const SwFmtFrmSize& rSz = rFmt.GetFrmSize();
        if( ATT_VAR_SIZE != rSz.GetSizeType() )
            nDist += rSz.GetHeight();
        else
        {
            nDist += 274;       // defaulten fuer 12pt Schrift
            const SvxULSpaceItem& rUL = rFmt.GetULSpace();
            nDist += ( bLower ? rUL.GetLower() : rUL.GetUpper() );
        }
    }
    return (USHORT)nDist;
}

static Writer& OutWW8_SwFmtULSpace( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwWW8Writer& rWW8Wrt = (SwWW8Writer&)rWrt;
    const SvxULSpaceItem & rUL = (const SvxULSpaceItem&) rHt;

    // Flys fehlen noch ( siehe RTF )

    if( rWW8Wrt.bOutFlyFrmAttrs )                   // Flys
    {
        // sprmPDyaFromText
        if( rWW8Wrt.bWrtWW8 )
            rWW8Wrt.InsUInt16( 0x842E );
        else
            rWW8Wrt.pO->Insert( 48, rWW8Wrt.pO->Count() );
        // Mittelwert nehmen, da WW nur 1 Wert kennt
        rWW8Wrt.InsUInt16( (USHORT) ( ( rUL.GetUpper() + rUL.GetLower() ) / 2 ) );
    }
    else if( rWW8Wrt.bOutPageDescs )            // Page-UL
    {
        USHORT nUDist, nLDist;
        const SfxPoolItem* pItem = rWW8Wrt.HasItem( RES_BOX );
        if( pItem )
        {
            nUDist = ((SvxBoxItem*)pItem)->CalcLineSpace( BOX_LINE_TOP );
            nLDist = ((SvxBoxItem*)pItem)->CalcLineSpace( BOX_LINE_BOTTOM );
        }
        else
            nUDist = nLDist = 0;
        nUDist += rUL.GetUpper();
        nLDist += rUL.GetLower();

        // Kopf-/Fusszeilen beachten:
        if( 0 != ( pItem = rWW8Wrt.HasItem( RES_HEADER )) &&
            ((SwFmtHeader*)pItem)->IsActive() )
        {
            // dann aufjedenfall schon mal den Abstand der Kopfzeile zum
            // SeitenAnfang ausgeben
            // sprmSDyaHdrTop
            if( rWW8Wrt.bWrtWW8 )
                rWW8Wrt.InsUInt16( 0xB017 );
            else
                rWW8Wrt.pO->Insert( 156, rWW8Wrt.pO->Count() );
            rWW8Wrt.InsUInt16( nUDist );
            nUDist += ::lcl_CalcHdFtDist( *((SwFmtHeader*)pItem)->
                                            GetHeaderFmt(), TRUE );
        }
        // sprmSDyaTop
        if( rWW8Wrt.bWrtWW8 )
            rWW8Wrt.InsUInt16( 0x9023 );
        else
            rWW8Wrt.pO->Insert( 168, rWW8Wrt.pO->Count() );
        rWW8Wrt.InsUInt16( nUDist );


        if( 0 != ( pItem = rWW8Wrt.HasItem( RES_FOOTER )) &&
            ((SwFmtFooter*)pItem)->IsActive() )
        {
            // dann aufjedenfall schon mal den Abstand der Fusszeile zum
            // SeitenEnde ausgeben
            // sprmSDyaHdrBottom
            if( rWW8Wrt.bWrtWW8 )
                rWW8Wrt.InsUInt16( 0xB018 );
            else
                rWW8Wrt.pO->Insert( 157, rWW8Wrt.pO->Count() );
            rWW8Wrt.InsUInt16( nLDist );
            nLDist += ::lcl_CalcHdFtDist( *((SwFmtFooter*)pItem)->
                                            GetFooterFmt(), FALSE );
        }
        // sprmSDyaBottom
        if( rWW8Wrt.bWrtWW8 )
            rWW8Wrt.InsUInt16( 0x9024 );
        else
            rWW8Wrt.pO->Insert( 169, rWW8Wrt.pO->Count() );
        rWW8Wrt.InsUInt16( nLDist );
    }
    else
    {
        // sprmPDyaBefore
        if( rWW8Wrt.bWrtWW8 )
            rWW8Wrt.InsUInt16( 0xA413 );
        else
            rWW8Wrt.pO->Insert( 21, rWW8Wrt.pO->Count() );
        rWW8Wrt.InsUInt16( rUL.GetUpper() );
        // sprmPDyaAfter
        if( rWW8Wrt.bWrtWW8 )
            rWW8Wrt.InsUInt16( 0xA414 );
        else
            rWW8Wrt.pO->Insert( 22, rWW8Wrt.pO->Count() );
        rWW8Wrt.InsUInt16( rUL.GetLower() );
    }
    return rWrt;
}

// Print, Opaque, Protect fehlen noch

static Writer& OutWW8_SwFmtSurround( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwWW8Writer& rWW8Wrt = (SwWW8Writer&)rWrt;
    if( rWW8Wrt.bOutFlyFrmAttrs )
    {
        if( rWW8Wrt.bWrtWW8 )
            rWW8Wrt.InsUInt16( 0x2423 );
        else
            rWW8Wrt.pO->Insert( 37, rWW8Wrt.pO->Count() );

        rWW8Wrt.pO->Insert( (SURROUND_NONE !=
                        ((const SwFmtSurround&) rHt).GetSurround() )
                    ? 2 : 1, rWW8Wrt.pO->Count() );
    }
    return rWrt;
}

Writer& OutWW8_SwFmtVertOrient( Writer& rWrt, const SfxPoolItem& rHt )
{
    const SwFmtVertOrient& rFlyVert = (const SwFmtVertOrient&) rHt;
    SwWW8Writer& rWW8Wrt = (SwWW8Writer&)rWrt;

//!!!! Ankertyp und entsprechende Umrechnung fehlt noch

    if( rWW8Wrt.bOutFlyFrmAttrs )
    {
        const SwFmtVertOrient& rFlyVert = (const SwFmtVertOrient&) rHt;

        short nPos;
        switch( rFlyVert.GetVertOrient() )
        {
        case VERT_NONE:         nPos = (short)rFlyVert.GetPos(); break;
        case VERT_CENTER:
        case VERT_LINE_CENTER:  nPos = -8; break;
        case VERT_BOTTOM:
        case VERT_LINE_BOTTOM:  nPos = -12; break;
        case VERT_TOP:
        case VERT_LINE_TOP:
        default:                nPos = -4; break;
        }

        // sprmPDyaAbs
        if( rWW8Wrt.bWrtWW8 )
            rWW8Wrt.InsUInt16( 0x8419 );
        else
            rWW8Wrt.pO->Insert( 27, rWW8Wrt.pO->Count() );
        rWW8Wrt.InsUInt16( nPos );
    }
    return rWrt;
}


Writer& OutWW8_SwFmtHoriOrient( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwWW8Writer& rWW8Wrt = (SwWW8Writer&)rWrt;
    if( !rWW8Wrt.pFlyFmt )
    {
        ASSERT( rWW8Wrt.pFlyFmt, "HoriOrient ohne pFlyFmt !!" );
        return rWrt;
    }

//!!!! Ankertyp und entsprechende Umrechnung fehlt noch
    if( rWW8Wrt.bOutFlyFrmAttrs )
    {
        const SwFmtHoriOrient& rFlyHori = (const SwFmtHoriOrient&) rHt;

        short nPos;
        switch( rFlyHori.GetHoriOrient() )
        {
        case HORI_NONE:    {
                                nPos = (short)rFlyHori.GetPos();
                                if( !nPos )
                                    nPos = 1;   // WW: 0 ist reserviert
#if 0
// ist nicht noetig, da Bindung an Absatz als hor. Bindung an die
// Spalte exportiert wird, da so das Verhalten bei Mehrspaltigkeit
// am AEhnlichsten ist.
                                RndStdIds eAn = rWW8Wrt.pFlyFmt->GetAttrSet().
                                                GetAnchor().GetAnchorId();
                                if( eAn == FLY_AT_CNTNT || eAn == FLY_IN_CNTNT )
                                    nPos += GetPageL( rWW8Wrt );
#endif
                           }
                           break;

        case HORI_LEFT:    nPos = rFlyHori.IsPosToggle() ? -12 : 0;
                           break;
        case HORI_RIGHT:   nPos = rFlyHori.IsPosToggle() ? -16 : -8;
                           break;
        case HORI_CENTER:
        case HORI_FULL:                         // FULL nur fuer Tabellen
        default:           nPos = -4; break;
        }

        // sprmPDxaAbs
        if( rWW8Wrt.bWrtWW8 )
            rWW8Wrt.InsUInt16( 0x8418 );
        else
            rWW8Wrt.pO->Insert( 26, rWW8Wrt.pO->Count() );
        rWW8Wrt.InsUInt16( nPos );
    }
    return rWrt;
}

static Writer& OutWW8_SwFmtAnchor( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwWW8Writer& rWW8Wrt = (SwWW8Writer&)rWrt;
    ASSERT( rWW8Wrt.pFlyFmt, "Anker ohne pFlyFmt !!" );

    if( rWW8Wrt.bOutFlyFrmAttrs )
    {
        const SwFmtAnchor& rAnchor = (const SwFmtAnchor&) rHt;
        BYTE nP = 0;
        switch( rAnchor.GetAnchorId() )
        {
        case FLY_PAGE:      nP |= ( 1 << 4 )        // Vert: Page
                                  | ( 2 << 6 );     // Horz: Page
                            break;
        // Im Fall eine Flys als Zeichen: Absatz-gebunden setzen!!!
        case FLY_AT_FLY:
        case FLY_AUTO_CNTNT:
        case FLY_AT_CNTNT:
        case FLY_IN_CNTNT:  nP |= ( 2 << 4 )        // Vert: Text
                                  | ( 0 << 6 );     // Horz: Column
                            break;
        }

        // sprmPPc
        if( rWW8Wrt.bWrtWW8 )
            rWW8Wrt.InsUInt16( 0x261B );
        else
            rWW8Wrt.pO->Insert( 29, rWW8Wrt.pO->Count() );
        rWW8Wrt.pO->Insert( nP, rWW8Wrt.pO->Count() );
    }
    return rWrt;
}

static Writer& OutWW8_SwFmtBackground( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwWW8Writer& rWW8Wrt = (SwWW8Writer&)rWrt;

    if( !rWW8Wrt.bOutPageDescs )    // WW kann keinen Hintergrund
    {                               // in Section
        const SvxBrushItem& rBack = (const SvxBrushItem&)rHt;
        WW8_SHD aSHD;

        if( rWW8Wrt.TransBrush( rBack.GetColor(), aSHD ) )
        {
            // sprmPShd
            if( rWW8Wrt.bWrtWW8 )
                rWW8Wrt.InsUInt16( 0x442D );
            else
                rWW8Wrt.pO->Insert( 47, rWW8Wrt.pO->Count() );
            rWW8Wrt.InsUInt16( aSHD.GetValue() );
        }
    }
    return rWrt;
}


// TranslateBorderLine() liefert eine UINT32 zurueck, der noch in einen
// SVBT32 uebersetzt werden muss.
// bei Export als WW6 sind nur die unteren 16 Bit von Interesse
// bShadow darf bei Tabellenzellen *nicht* gesetzt sein !
UINT32 SwWW8Writer::TranslateBorderLine( const SvxBorderLine& rLine,
                                        USHORT nDist, BOOL bShadow )
{
    UINT32 nBrd = 0;
    UINT16 nWidth = rLine.GetInWidth() + rLine.GetOutWidth(), brcType = 0;
    UINT32 nColCode = 0;
    if( nWidth )                                // Linie ?
    {
        // BRC.brcType
        BOOL bDouble = 0 != rLine.GetInWidth() && 0 != rLine.GetOutWidth();
        BOOL bThick = !bDouble && !bWrtWW8 && nWidth > 75;
        if( bDouble )
            brcType = 3;
        else if( bThick )
            brcType = 2;
        else
            brcType = 1;

        // BRC.dxpLineWidth
        if( bThick )
            nWidth /= 2;

        if( bWrtWW8 )
        {
            // Angabe in 8tel Punkten, also durch 2.5, da 1 Punkt = 20 Twips
            nWidth = (( nWidth * 8 ) + 10 ) / 20;
            if( 0xff < nWidth )
                nWidth = 0xff;
        }
        else
        {
            // Angabe in 0.75 pt
            nWidth = ( nWidth + 7 ) / 15;
            if( nWidth > 5 )
                nWidth = 5;
        }

        if( 0 == nWidth )                       // ganz duenne Linie
            nWidth = 1;                         //       nicht weglassen

        // BRC.ico
        nColCode = TransCol( rLine.GetColor() );
    }

    // BRC.dxpSpace
    long nLDist = nDist;
    nLDist /= 20;               // Masseinheit : pt
    if( nLDist > 0x1f )
        nLDist = 0x1f;

    if( bWrtWW8 )
    {
        nBrd = nWidth + ( brcType << 8 );
        nBrd |= nColCode << 16;
        nBrd |= nLDist << 24;

        // fShadow, keine weiteren Einstellungen im WW moeglich
        if( bShadow )
            nBrd |= (0x2000L << 16);
    }
    else
    {
        nBrd = nWidth + ( brcType << 3 );
        nBrd |= (nColCode & 0x1f) << 6;
        nBrd |= nLDist << 11;
        // fShadow, keine weiteren Einstellungen im WW moeglich
        if( bShadow )
            nBrd |= 0x20;
    }

    return nBrd;
}

// MakeBorderLine() bekommt einen WW8Bytes* uebergeben, um die Funktion
// auch fuer die Tabellen-Umrandungen zu benutzen.
// Wenn nSprmNo == 0, dann wird der Opcode nicht ausgegeben.
// bShadow darf bei Tabellenzellen *nicht* gesetzt sein !
void SwWW8Writer::Out_BorderLine( WW8Bytes& rO, const SvxBorderLine* pLine,
                                  USHORT nDist, USHORT nOffset,
                                  BOOL bShadow )
{
    ASSERT( (0 <= nOffset && nOffset <= 3) || USHRT_MAX == nOffset ||
            ((0x702b - 0x6424) <= nOffset && nOffset <= (0x702e - 0x6424)),
                "SprmOffset ausserhalb des Bereichs" );


    UINT32 nBrdCd = pLine ? TranslateBorderLine( *pLine, nDist, bShadow )
                          : 0;
    if( bWrtWW8 )
    {
// WW97-SprmIds
// 0x6424, sprmPBrcTop      pap.brcTop;BRC;long; !!!!
// 0x6425, sprmPBrcLeft
// 0x6426, sprmPBrcBottom
// 0x6427, sprmPBrcRight
        if( USHRT_MAX != nOffset )                      // mit OpCode-Ausgabe ?
            SwWW8Writer::InsUInt16( rO, 0x6424 + nOffset );

        SwWW8Writer::InsUInt32( rO, nBrdCd );
    }
    else
    {
// WW95-SprmIds
//     38, sprmPBrcTop      - pap.brcTop BRC short !!!
//     39, sprmPBrcLeft
//     40, sprmPBrcBottom
//     41, sprmPBrcRight
        if( USHRT_MAX != nOffset )                      // mit OpCode-Ausgabe ?
            rO.Insert( (BYTE)( 38 + nOffset ), rO.Count() );
        SwWW8Writer::InsUInt16( rO, (UINT16)nBrdCd );
    }
}

// OutWW8_SwFmtBox1() ist fuer alle Boxen ausser in Tabellen.
// es wird pO des WW8Writers genommen
void SwWW8Writer::Out_SwFmtBox( const SvxBoxItem& rBox, BOOL bShadow )
{
    USHORT nOffset = 0;
    if( bOutPageDescs )
    {
        if( !bWrtWW8 )
            return ;            // WW95 kennt keine Seitenumrandung

// WW97-SprmIds
// 0x702b, sprmSBrcTop      pap.brcTop;BRC;long; !!!!
// 0x702c, sprmSBrcLeft
// 0x702d, sprmSBrcBottom
// 0x702e, sprmSBrcRight
        nOffset = (0x702b - 0x6424);
    }

    static USHORT __READONLY_DATA aBorders[] = {
            BOX_LINE_TOP, BOX_LINE_LEFT, BOX_LINE_BOTTOM, BOX_LINE_RIGHT };
    const USHORT* pBrd = aBorders;
    for( int i = 0; i < 4; ++i, ++pBrd )
    {
        const SvxBorderLine* pLn = rBox.GetLine( *pBrd );
        Out_BorderLine( *pO, pLn, rBox.GetDistance( *pBrd ), nOffset+i,
                            bShadow );
    }
}

// OutWW8_SwFmtBox2() ist fuer TC-Strukturen in Tabellen. Der Sprm-Opcode
// wird nicht geschrieben, da es in der TC-Structur ohne Opcode gepackt ist.
// dxpSpace wird immer 0, da WW das in Tabellen so verlangt
// ( Tabellenumrandungen fransen sonst aus )
// Ein WW8Bytes-Ptr wird als Ausgabe-Parameter uebergeben

void SwWW8Writer::Out_SwFmtTableBox( WW8Bytes& rO, const SvxBoxItem& rBox )
{
    // moeglich und vielleicht besser waere 0xffff
    static USHORT __READONLY_DATA aBorders[] = {
            BOX_LINE_TOP, BOX_LINE_LEFT, BOX_LINE_BOTTOM, BOX_LINE_RIGHT };
    const USHORT* pBrd = aBorders;
    for( int i = 0; i < 4; ++i, ++pBrd )
    {
        const SvxBorderLine* pLn = rBox.GetLine( *pBrd );
        Out_BorderLine( rO, pLn, 0, USHRT_MAX, FALSE );
    }
}

static Writer& OutWW8_SwFmtBox( Writer& rWrt, const SfxPoolItem& rHt )
{
                                // Fly um Grafik-> keine Umrandung hier, da
                                // der GrafikHeader bereits die Umrandung hat
    SwWW8Writer& rWW8Wrt = ((SwWW8Writer&)rWrt);
    if( !rWW8Wrt.bOutGrf )
    {
        BOOL bShadow = FALSE;
        const SfxPoolItem* pItem = ((SwWW8Writer&)rWrt).HasItem( RES_SHADOW );
        if( pItem )
        {
            const SvxShadowItem* p = (const SvxShadowItem*)pItem;
            bShadow = ( p->GetLocation() != SVX_SHADOW_NONE )
                      && ( p->GetWidth() != 0 );
        }

        rWW8Wrt.Out_SwFmtBox( (SvxBoxItem&)rHt, bShadow );
    }
    return rWrt;
}


static Writer& OutWW8_SwFmtCol( Writer& rWrt, const SfxPoolItem& rHt )
{
    const SwFmtCol& rCol = (const SwFmtCol&)rHt;
    const SwColumns& rColumns = rCol.GetColumns();
    SwWW8Writer& rWW8Wrt = ((SwWW8Writer&)rWrt);

    USHORT nCols = rColumns.Count();
    if( 1 < nCols
        && !rWW8Wrt.bOutFlyFrmAttrs )       // mehrspaltige Rahmen kann WW nicht
    {
        // dann besorge mal die Seitenbreite ohne Raender !!
        SwTwips nPageSize;
        const SwFrmFmt* pFmt = rWW8Wrt.pAktPageDesc
                                ? &rWW8Wrt.pAktPageDesc->GetMaster()
                                : &rWW8Wrt.pDoc->GetPageDesc(0).GetMaster();

        SwRect aRect( pFmt->FindLayoutRect( TRUE ));
        if( 0 == ( nPageSize = aRect.Width() ))
        {
            const SvxLRSpaceItem& rLR = pFmt->GetLRSpace();
            nPageSize = pFmt->GetFrmSize().GetWidth() -
                            rLR.GetLeft() - rLR.GetRight();
        }

        // CColumns
        if( rWW8Wrt.bWrtWW8 )
            rWW8Wrt.InsUInt16( 0x500b );
        else
            rWW8Wrt.pO->Insert( 144, rWW8Wrt.pO->Count() );
        rWW8Wrt.InsUInt16( nCols - 1 );

        // DxaColumns
        if( rWW8Wrt.bWrtWW8 )
            rWW8Wrt.InsUInt16( 0x900c );
        else
            rWW8Wrt.pO->Insert( 145, rWW8Wrt.pO->Count() );
        rWW8Wrt.InsUInt16( rCol.GetGutterWidth( TRUE ) );

        // LBetween
        if( rWW8Wrt.bWrtWW8 )
            rWW8Wrt.InsUInt16( 0x3019 );
        else
            rWW8Wrt.pO->Insert( 158, rWW8Wrt.pO->Count() );
        rWW8Wrt.pO->Insert( COLADJ_NONE == rCol.GetLineAdj() ? 0 : 1,
                            rWW8Wrt.pO->Count() );

        // Nachsehen, ob alle Spalten gleich sind
        BOOL bEven = TRUE;
        USHORT n;
        USHORT nColWidth = rCol.CalcPrtColWidth( 0, (USHORT)nPageSize );
        for( n = 1; n < nCols; n++ )
        {
            short nDiff = nColWidth - rCol.CalcPrtColWidth( n, (USHORT)nPageSize );
            if( nDiff > 10 || nDiff < -10 )      // Toleranz: 10 tw
            {
                bEven = FALSE;
                break;
            }
        }
        if( bEven )
        {
            USHORT nSpace = rColumns[0]->GetRight() + rColumns[1]->GetLeft();
            for( n = 2; n < nCols; n++ )
            {
                short nDiff = nSpace - ( rColumns[n - 1]->GetRight()
                                         + rColumns[n]->GetLeft() );
                if( nDiff > 10 || nDiff < -10 )
                { // Toleranz: 10 tw
                    bEven = FALSE;
                    break;
                }
            }
        }

        // FEvenlySpaced
        if( rWW8Wrt.bWrtWW8 )
            rWW8Wrt.InsUInt16( 0x3005 );
        else
            rWW8Wrt.pO->Insert( 138, rWW8Wrt.pO->Count() );
        rWW8Wrt.pO->Insert( bEven ? 1 : 0, rWW8Wrt.pO->Count() );

        if( !bEven )
        {
            for( USHORT n = 0; n < nCols; ++n )
            {
                //sprmSDxaColWidth
                if( rWW8Wrt.bWrtWW8 )
                    rWW8Wrt.InsUInt16( 0xF203 );
                else
                    rWW8Wrt.pO->Insert( 136, rWW8Wrt.pO->Count() );
                rWW8Wrt.pO->Insert( n, rWW8Wrt.pO->Count() );
                rWW8Wrt.InsUInt16( rCol.CalcPrtColWidth( n, (USHORT)nPageSize ) );

                if( n+1 != nCols )
                {
                    //sprmSDxaColSpacing
                    if( rWW8Wrt.bWrtWW8 )
                        rWW8Wrt.InsUInt16( 0xF204 );
                    else
                        rWW8Wrt.pO->Insert( 137, rWW8Wrt.pO->Count() );
                    rWW8Wrt.pO->Insert( n, rWW8Wrt.pO->Count() );
                    rWW8Wrt.InsUInt16( rColumns[ n ]->GetRight() +
                                       rColumns[ n + 1 ]->GetLeft() );
                }
            }
        }
    }
    return rWrt;
}

// "Absaetze zusammenhalten"
static Writer& OutWW8_SvxFmtKeep( Writer& rWrt, const SfxPoolItem& rHt )
{
// sprmFKeepFollow
    const SvxFmtKeepItem& rAttr = (const SvxFmtKeepItem&)rHt;
    SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt;
    if( rWrtWW8.bWrtWW8 )
        rWrtWW8.InsUInt16( 0x2406 );
    else
        rWrtWW8.pO->Insert( 8, rWrtWW8.pO->Count() );

    rWrtWW8.pO->Insert( rAttr.GetValue() ? 1 : 0, rWrtWW8.pO->Count() );
    return rWrt;
}


// exclude a paragraph from Line Numbering
static Writer& OutWW8_SwFmtLineNumber( Writer& rWrt, const SfxPoolItem& rHt )
{
// sprmPFNoLineNumb
    const SwFmtLineNumber& rAttr = (const SwFmtLineNumber&)rHt;

    SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt;
    if( rWrtWW8.bWrtWW8 )
        rWrtWW8.InsUInt16( 0x240C );
    else
        rWrtWW8.pO->Insert( 14, rWrtWW8.pO->Count() );

    rWrtWW8.pO->Insert( rAttr.IsCount() ? 0 : 1, rWrtWW8.pO->Count() );

    return rWrt;
}


/* File PARATR.HXX  */

static Writer& OutWW8_SvxLineSpacing( Writer& rWrt, const SfxPoolItem& rHt )
{
// sprmPDyaLine
    const SvxLineSpacingItem& rAttr = (const SvxLineSpacingItem&)rHt;
    SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt;
    if( rWrtWW8.bWrtWW8 )
        rWrtWW8.InsUInt16( 0x6412 );
    else
        rWrtWW8.pO->Insert( 20, rWrtWW8.pO->Count() );

    short nSpace = 240, nMulti = 0;

    switch( rAttr.GetLineSpaceRule() )
    {
    case SVX_LINE_SPACE_AUTO:
    case SVX_LINE_SPACE_FIX:
    case SVX_LINE_SPACE_MIN:
        {
            switch( rAttr.GetInterLineSpaceRule() )
            {
            case SVX_INTER_LINE_SPACE_FIX:      // unser Durchschuss
                // gibt es aber nicht in WW - also wie kommt man an
                // die MaxLineHeight heran?
                nSpace = (short)rAttr.GetInterLineSpace();
                break;

            case SVX_INTER_LINE_SPACE_PROP:
                nSpace = (short)(( 240L * rAttr.GetPropLineSpace() ) / 100L );
                nMulti = 1;
                break;

            default:                    // z.B. Minimum oder FIX?
                if( SVX_LINE_SPACE_FIX == rAttr.GetLineSpaceRule() )
                    nSpace = -(short)rAttr.GetLineHeight();
                else
                    nSpace = (short)rAttr.GetLineHeight();
                break;
            }
        }
        break;
    }

    rWrtWW8.InsUInt16( nSpace );
    rWrtWW8.InsUInt16( nMulti );
    return rWrt;
}


static Writer& OutWW8_SvxAdjust( Writer& rWrt, const SfxPoolItem& rHt )
{
// sprmPJc
    const SvxAdjustItem& rAttr = (const SvxAdjustItem&)rHt;
    BYTE nAdj = 255;
    switch( rAttr.GetAdjust() )
    {
    case SVX_ADJUST_LEFT:       nAdj = 0;   break;
    case SVX_ADJUST_RIGHT:      nAdj = 2;   break;
    case SVX_ADJUST_BLOCKLINE:
    case SVX_ADJUST_BLOCK:      nAdj = 3;   break;
    case SVX_ADJUST_CENTER:     nAdj = 1;   break;
    default:                    return rWrt;    // kein gueltiges Attribut
    }

    if( 255 != nAdj )               // gueltiges Attribut?
    {
        SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt;
        if( rWrtWW8.bWrtWW8 )
            rWrtWW8.InsUInt16( 0x2403 );
        else
            rWrtWW8.pO->Insert( 5, rWrtWW8.pO->Count() );
        rWrtWW8.pO->Insert( nAdj, rWrtWW8.pO->Count() );
    }
    return rWrt;
}

// "Absaetze trennen"
static Writer& OutWW8_SvxFmtSplit( Writer& rWrt, const SfxPoolItem& rHt )
{
// sprmPFKeep
    const SvxFmtSplitItem& rAttr = (const SvxFmtSplitItem&)rHt;
    SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt;
    if( rWrtWW8.bWrtWW8 )
        rWrtWW8.InsUInt16( 0x2405 );
    else
        rWrtWW8.pO->Insert( 7, rWrtWW8.pO->Count() );
    rWrtWW8.pO->Insert( rAttr.GetValue() ? 0 : 1, rWrtWW8.pO->Count() );
    return rWrt;
}

//  Es wird nur das Item "SvxWidowItem" und nicht die Orphans uebersetzt,
//  da es fuer beides im WW nur ein Attribut "Absatzkontrolle" gibt und
//  im SW wahrscheinlich vom Anwender immer Beide oder keiner gesetzt werden.
static Writer& OutWW8_SvxWidows( Writer& rWrt, const SfxPoolItem& rHt )
{
// sprmPFWidowControl
    const SvxWidowsItem& rAttr = (const SvxWidowsItem&)rHt;
    SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt;
    if( rWrtWW8.bWrtWW8 )
        rWrtWW8.InsUInt16( 0x2431 );
    else
        rWrtWW8.pO->Insert( 51, rWrtWW8.pO->Count() );
    rWrtWW8.pO->Insert( rAttr.GetValue() ? 1 : 0, rWrtWW8.pO->Count() );
    return rWrt;
}


class SwWW8WrTabu
{
    BYTE* pDel;                 // DelArray
    BYTE* pAddPos;              // AddPos-Array
    BYTE* pAddTyp;              // AddTyp-Array
    USHORT nAdd;                // so viele Tabs kommen hinzu
    USHORT nDel;                // so viele Tabs fallen weg
    USHORT nLeftParaMgn;        // fuer anderes Wertesystem SW/WW
public:
    SwWW8WrTabu( USHORT nDelMax, USHORT nAddMax, USHORT nLeftPara );
    ~SwWW8WrTabu();

    void Add( const SvxTabStop & rTS );
    void Del( const SvxTabStop & rTS );
    void PutAll( SwWW8Writer& rWW8Wrt );
};

SwWW8WrTabu::SwWW8WrTabu( USHORT nDelMax, USHORT nAddMax, USHORT nLeftPara )
    : nAdd( 0 ), nDel( 0 ), nLeftParaMgn( nLeftPara )
{
    pDel = ( nDelMax ) ? new BYTE[ nDelMax * 2 ] : 0;
    pAddPos = new BYTE[ nAddMax * 2 ];
    pAddTyp = new BYTE[ nAddMax ];
}

SwWW8WrTabu::~SwWW8WrTabu()
{
    delete[] pAddTyp;
    delete[] pAddPos;
    delete[] pDel;
}

// Add( const SvxTabStop & rTS ) fuegt einen Tab in die WW-Struktur ein
void SwWW8WrTabu::Add( const SvxTabStop & rTS )
{
    // Tab-Position eintragen
    ShortToSVBT16( (USHORT)rTS.GetTabPos() + nLeftParaMgn,
                   pAddPos + ( nAdd * 2 ) );

    // Tab-Typ eintragen
    BYTE nPara = 0;
    switch( rTS.GetAdjustment() )
    {
    case SVX_TAB_ADJUST_RIGHT:      nPara = 2;  break;
    case SVX_TAB_ADJUST_CENTER:     nPara = 1;  break;
    case SVX_TAB_ADJUST_DECIMAL:
            nPara = ',' == rTS.GetDecimal() ? 3 : 1;
            break;
    }

    switch( rTS.GetFill() )
    {
    case '.':   nPara |= 1 << 3; break;     // dotted leader
    case '_':   nPara |= 3 << 3; break;     // Single line leader
    case '-':   nPara |= 2 << 3; break;     // hyphenated leader
    case '=':   nPara |= 4 << 3; break;     // heavy line leader
    }

    ByteToSVBT8( nPara, pAddTyp + nAdd );
    ++nAdd;
}

// Del( const SvxTabStop & rTS ) fuegt einen zu loeschenden Tab
// in die WW-Struktur ein
void SwWW8WrTabu::Del( const SvxTabStop & rTS )
{
                                        // Tab-Position eintragen
    ShortToSVBT16( (USHORT)rTS.GetTabPos() + nLeftParaMgn,
                   pDel + ( nDel * 2 ) );
    ++nDel;
}

//  PutAll( SwWW8Writer& rWW8Wrt ) schreibt das Attribut nach rWrt.pO
void SwWW8WrTabu::PutAll( SwWW8Writer& rWrt )
{
    if( nAdd > 255 )
    {
        ASSERT( !this, "+ mehr als 255 Tabs dazu ?????" );
        nAdd = 255;
    }
    if( nDel > 255 )
    {
        ASSERT( !this, "+ mehr als 255 Tabs weg ?????" );
        nDel = 255;
    }

    USHORT nSiz = 2 * nDel + 3 * nAdd + 2;
    if( nSiz > 255 )
        nSiz = 255;

    if( rWrt.bWrtWW8 )
        rWrt.InsUInt16( 0xC60D );
    else
        rWrt.pO->Insert( 15, rWrt.pO->Count() );
    rWrt.pO->Insert( (BYTE)nSiz, rWrt.pO->Count() );    // cch eintragen

    // DelArr schreiben
    rWrt.pO->Insert( (BYTE)nDel, rWrt.pO->Count() );    // nDel eintragen
    rWrt.OutSprmBytes( pDel, nDel * 2 );
    // InsArr schreiben
    rWrt.pO->Insert( (BYTE)nAdd, rWrt.pO->Count() );    // nAdd schreiben
    rWrt.OutSprmBytes( pAddPos, 2 * nAdd );         // AddPosArray
    rWrt.OutSprmBytes( pAddTyp, nAdd );             // AddTypArray
}


static void OutWW8_SwTabStopAdd( Writer& rWrt, const SvxTabStopItem& rTStops,
                                 USHORT nLParaMgn  )
{
    SwWW8WrTabu aTab( 0, rTStops.Count(), nLParaMgn );

    for( USHORT n = 0; n < rTStops.Count(); n++ )
    {
        const SvxTabStop& rTS = rTStops[ n ];
        if( SVX_TAB_ADJUST_DEFAULT != rTS.GetAdjustment() ) // Def-Tabs ignorieren
            aTab.Add( rTS );
    }
    aTab.PutAll( (SwWW8Writer&)rWrt );
}

static void OutWW8_SwTabStopDelAdd( Writer& rWrt, const SvxTabStopItem& rTOld,
                                const SvxTabStopItem& rTNew, USHORT nLParaMgn )
{
    SwWW8WrTabu aTab( rTOld.Count(), rTNew.Count(), nLParaMgn );

    USHORT nO = 0;      // rTOld Index
    USHORT nN = 0;      // rTNew Index

    do {
        const SvxTabStop* pTO;
        long nOP;
        if( nO < rTOld.Count() )                    // alt noch nicht am Ende ?
        {
            pTO = &rTOld[ nO ];
            nOP = pTO->GetTabPos();
            if( SVX_TAB_ADJUST_DEFAULT == pTO->GetAdjustment() )
            {
                nO++;                                // Default-Tab ignorieren
                continue;
            }
        }
        else
        {
            pTO = 0;
            nOP = LONG_MAX;
        }

        const SvxTabStop* pTN;
        long nNP;
        if( nN < rTNew.Count() )                    // neu noch nicht am Ende
        {
            pTN = &rTNew[ nN ];
            nNP = pTN->GetTabPos();
            if( SVX_TAB_ADJUST_DEFAULT == pTN->GetAdjustment() )
            {
                nN++;                               // Default-Tab ignorieren
                continue;
            }
        }
        else
        {
            pTN = 0;
            nNP = LONG_MAX;
        }

        if( nOP == LONG_MAX && nNP == LONG_MAX )
            break;                                  // alles fertig

        if( nOP < nNP )                             // naechster Tab ist alt
        {
            aTab.Del( *pTO );                       // muss geloescht werden
            nO++;
        }
        else if( nNP < nOP )                        // naechster Tab ist neu
        {
            aTab.Add( *pTN );                       // muss eigefuegt werden
            nN++;
        }
        else if ( pTO->IsEqual( *pTN ) )            // Tabs sind gleich
        {
            nO++;                                   // nichts zu tun
            nN++;
        }
        else                                        // Tabs selbe Pos, diff Typ
        {
            aTab.Del( *pTO );                       // alten loeschen
            aTab.Add( *pTN );                       // neuen einfuegen
            nO++;
            nN++;
        }
    } while( 1 );

    aTab.PutAll( (SwWW8Writer&)rWrt );
}

static Writer& OutWW8_SwTabStop( Writer& rWrt, const SfxPoolItem& rHt )
{
    SwWW8Writer& rWW8Wrt = (SwWW8Writer&)rWrt;
    const SvxTabStopItem & rTStops = (const SvxTabStopItem&)rHt;
    const SfxPoolItem* pLR = rWW8Wrt.HasItem( RES_LR_SPACE );
    USHORT nOffset = pLR ? ((const SvxLRSpaceItem*)pLR)->GetTxtLeft() : 0;

    const SfxPoolItem* pItem = 0;

    if( rWW8Wrt.bStyDef             // StyleDef -> "einfach" eintragen
        || !rWW8Wrt.pStyAttr        // keine Style-Attrs -> dito
        || ( SFX_ITEM_SET != rWW8Wrt.pStyAttr->GetItemState(
            RES_PARATR_TABSTOP, TRUE, &pItem  ) ) ) // kein Tab-Attr in Styles -> dito
    {
        OutWW8_SwTabStopAdd( rWW8Wrt, rTStops, nOffset );
    }
    else if ( pItem )       // Harte Attribute: Differenzen zum Style eintragen
    {
        OutWW8_SwTabStopDelAdd( rWW8Wrt, *(const SvxTabStopItem*)pItem,
                                rTStops, nOffset );
    }
    return rWrt;
}

//-----------------------------------------------------------------------

/*
 * lege hier die Tabellen fuer die WW-Funktions-Pointer auf
 * die Ausgabe-Funktionen an.
 * Es sind lokale Strukturen, die nur innerhalb
 * bekannt sein muessen.
 */

SwAttrFnTab aWW8AttrFnTab = {
/* RES_CHRATR_CASEMAP   */          OutWW8_SwCaseMap,
/* RES_CHRATR_CHARSETCOLOR */       0,
/* RES_CHRATR_COLOR */              OutWW8_SwColor,
/* RES_CHRATR_CONTOUR   */          OutWW8_SwContour,
/* RES_CHRATR_CROSSEDOUT    */      OutWW8_SwCrossedOut,
/* RES_CHRATR_ESCAPEMENT    */      OutWW8_SwEscapement,
/* RES_CHRATR_FONT  */              OutWW8_SwFont,
/* RES_CHRATR_FONTSIZE  */          OutWW8_SwSize,
/* RES_CHRATR_KERNING   */          OutWW8_SwKerning,
/* RES_CHRATR_LANGUAGE  */          OutWW8_SwLanguage,
/* RES_CHRATR_POSTURE   */          OutWW8_SwPosture,
/* RES_CHRATR_PROPORTIONALFONTSIZE*/0,
/* RES_CHRATR_SHADOWED  */          OutWW8_SwShadow,
/* RES_CHRATR_UNDERLINE */          OutWW8_SwUnderline,
/* RES_CHRATR_WEIGHT    */          OutWW8_SwWeight,
/* RES_CHRATR_WORDLINEMODE   */     0,   // Wird bei Underline mitbehandelt
/* RES_CHRATR_AUTOKERN   */         OutWW8_SvxAutoKern,
/* RES_CHRATR_BLINK */              0, // neu: blinkender Text
/* RES_CHRATR_NOHYPHEN  */          0, // Neu: nicht trennen
/* RES_CHRATR_NOLINEBREAK */        0, // Neu: nicht umbrechen
/* RES_CHRATR_BACKGROUND */         OutWW8_SwFmtCharBackground,
/* RES_CHRATR_CJK_FONT */           0,
/* RES_CHRATR_CJK_FONTSIZE */       0,
/* RES_CHRATR_CJK_LANGUAGE */       0,
/* RES_CHRATR_CJK_POSTURE */        0,
/* RES_CHRATR_CJK_WEIGHT */         0,
/* RES_CHRATR_CTL_FONT */           0,
/* RES_CHRATR_CTL_FONTSIZE */       0,
/* RES_CHRATR_CTL_LANGUAGE */       0,
/* RES_CHRATR_CTL_POSTURE */        0,
/* RES_CHRATR_CTL_WEIGHT */         0,
/* RES_CHRATR_WRITING_DIRECTION */  0,
/* RES_CHRATR_DUMMY2 */             0,
/* RES_CHRATR_DUMMY3 */             0,
/* RES_CHRATR_DUMMY4 */             0,
/* RES_CHRATR_DUMMY5 */             0,
/* RES_CHRATR_DUMMY1 */             0, // Dummy:

/* RES_TXTATR_INETFMT */            OutSwFmtINetFmt,
/* RES_TXTATR_DUMMY */              0,
/* RES_TXTATR_REFMARK */            0,      // handel by SwAttrIter
/* RES_TXTATR_TOXMARK   */          0,      // handel by SwAttrIter
/* RES_TXTATR_CHARFMT   */          OutWW8_SwTxtCharFmt,
/* RES_TXTATR_TWO_LINES */          0,
/* RES_TXTATR_CJK_RUBY */           0,
/* RES_TXTATR_UNKNOWN_CONTAINER */  0,
/* RES_TXTATR_DUMMY5 */             0,
/* RES_TXTATR_DUMMY6 */             0,

/* RES_TXTATR_FIELD */              OutWW8_SwField,
/* RES_TXTATR_FLYCNT    */          OutWW8_SwFlyCntnt,
/* RES_TXTATR_FTN       */          OutWW8_SwFtn,
/* RES_TXTATR_SOFTHYPH */           0,  // old attr. - coded now by character
/* RES_TXTATR_HARDBLANK */          OutWW8_SwHardBlank,
/* RES_TXTATR_DUMMY1 */             0, // Dummy:
/* RES_TXTATR_DUMMY2 */             0, // Dummy:

/* RES_PARATR_LINESPACING   */      OutWW8_SvxLineSpacing,
/* RES_PARATR_ADJUST    */          OutWW8_SvxAdjust,
/* RES_PARATR_SPLIT */              OutWW8_SvxFmtSplit,
/* RES_PARATR_ORPHANS   */          0, // OutW4W_SwOrphans, // kann WW nicht unabhaengig von Widows
/* RES_PARATR_WIDOWS    */          OutWW8_SvxWidows,
/* RES_PARATR_TABSTOP   */          OutWW8_SwTabStop,
/* RES_PARATR_HYPHENZONE*/          OutWW8_SvxHyphenZone,
/* RES_PARATR_DROP */               0,
/* RES_PARATR_REGISTER */           0, // neu:  Registerhaltigkeit
/* RES_PARATR_NUMRULE */            OutWW8_SwNumRuleItem,
/* RES_PARATR_DUMMY2 */             0, // Dummy:

/* RES_FILL_ORDER   */              0, // OutW4W_SwFillOrder,
/* RES_FRM_SIZE */                  OutWW8_SwFrmSize,
/* RES_PAPER_BIN   */               OutWW8_SvxPaperBin,
/* RES_LR_SPACE */                  OutWW8_SwFmtLRSpace,
/* RES_UL_SPACE */                  OutWW8_SwFmtULSpace,
/* RES_PAGEDESC */                  0,  // wird bei OutBreaks beachtet
/* RES_BREAK */                     OutWW8_SwFmtBreak,
/* RES_CNTNT */                     0, /* 0, // OutW4W_??? */
/* RES_HEADER */                    0,  // wird bei der PageDesc ausgabe beachtet
/* RES_FOOTER */                    0,  // wird bei der PageDesc ausgabe beachtet
/* RES_PRINT */                     0, // OutW4W_SwFmtPrint,
/* RES_OPAQUE */                    0, // OutW4W_SwFmtOpaque, // kann WW nicht
/* RES_PROTECT */                   0, // OutW4W_SwFmtProtect,
/* RES_SURROUND */                  OutWW8_SwFmtSurround,
/* RES_VERT_ORIENT */               OutWW8_SwFmtVertOrient,
/* RES_HORI_ORIENT */               OutWW8_SwFmtHoriOrient,
/* RES_ANCHOR */                    OutWW8_SwFmtAnchor,
/* RES_BACKGROUND */                OutWW8_SwFmtBackground,
/* RES_BOX  */                      OutWW8_SwFmtBox,
/* RES_SHADOW */                    0, // Wird bei SwFmtBox mitbehandelt
/* RES_FRMMACRO */                  0, /* 0, // OutW4W_??? */
/* RES_COL */                       OutWW8_SwFmtCol,
/* RES_KEEP */                      OutWW8_SvxFmtKeep,
/* RES_URL */                       0, // URL
/* RES_EDIT_IN_READONLY */          0,
/* RES_LAYOUT_SPLIT */              0,
/* RES_CHAIN */                     0,
/* RES_FRMATR_DUMMY2 */             0, // Dummy:
/* RES_LINENUMBER */                OutWW8_SwFmtLineNumber, // Line Numbering
/* RES_FRMATR_DUMMY4 */             0, // Dummy:
/* RES_FRMATR_DUMMY5 */             0, // Dummy:
/* RES_FRMATR_DUMMY6 */             0, // Dummy:
/* RES_FRMATR_DUMMY7 */             0, // Dummy:
/* RES_FRMATR_DUMMY8 */             0, // Dummy:
/* RES_FRMATR_DUMMY9 */             0, // Dummy:


/* RES_GRFATR_MIRRORGRF */          0, // OutW4W_SwMirrorGrf,
/* RES_GRFATR_CROPGRF   */          0, // OutW4W_SwCropGrf
/* RES_GRFATR_ROTATION */           0,
/* RES_GRFATR_LUMINANCE */          0,
/* RES_GRFATR_CONTRAST */           0,
/* RES_GRFATR_CHANNELR */           0,
/* RES_GRFATR_CHANNELG */           0,
/* RES_GRFATR_CHANNELB */           0,
/* RES_GRFATR_GAMMA */              0,
/* RES_GRFATR_INVERT */             0,
/* RES_GRFATR_TRANSPARENCY */       0,
/* RES_GRFATR_DRWAMODE */           0,
/* RES_GRFATR_DUMMY1 */             0,
/* RES_GRFATR_DUMMY2 */             0,
/* RES_GRFATR_DUMMY3 */             0,
/* RES_GRFATR_DUMMY4 */             0,
/* RES_GRFATR_DUMMY5 */             0,

/* RES_BOXATR_FORMAT */             0,
/* RES_BOXATR_FORMULA */            0,
/* RES_BOXATR_VALUE */              0,

/* RES_UNKNOWNATR_CONTAINER */      0
};


/*************************************************************************

      $Log: not supported by cvs2svn $
      Revision 1.51  2000/09/18 16:04:58  willem.vandorp
      OpenOffice header added.

      Revision 1.50  2000/08/21 10:14:14  khz
      Export Line Numbering (restart on new section)

      Revision 1.49  2000/08/04 10:56:44  jp
      Soft-/HardHyphens & HardBlanks changed from attribute to unicode character

      Revision 1.48  2000/07/31 19:24:54  jp
      new attributes for CJK/CTL and graphic

      Revision 1.47  2000/07/25 14:46:38  khz
      #76811# save AutoHyphenation flag in Document Properties

      Revision 1.46  2000/07/06 11:05:03  khz
      Export *result* of field nonexisting in WW as either Unicode or 8bit text

      Revision 1.45  2000/06/19 09:30:59  khz
      Export the new WW2000 _underlining_ features

      Revision 1.44  2000/06/09 16:30:26  jp
      Write correct edit-/create-/print-/change - datetime fields

      Revision 1.43  2000/05/12 16:14:18  jp
      Changes for Unicode

      Revision 1.42  2000/04/18 12:58:03  khz
      Task #75183# to set char language use sprmCRgLid0 rather than sprmCLid

      Revision 1.41  2000/03/03 15:20:01  os
      StarView remainders removed

      Revision 1.40  2000/02/21 13:05:36  jp
      #70473# changes for unicode

      Revision 1.39  2000/02/11 14:40:03  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.38  1999/12/20 17:41:37  jp
      Bug #70749#: Date/Time-Numberformats in german format from the formatter

      Revision 1.37  1999/12/15 17:06:22  jp
      Bug #70913#: write Ftn-/EndNoteInfo - at end of section or page/doc

      Revision 1.36  1999/12/08 13:53:01  jp
      Task #70258#: textattr for XMLAttrContainer

      Revision 1.35  1999/11/29 09:09:49  jp
      InsertSpecialChar: ask for ChpIter

      Revision 1.34  1999/11/25 21:22:33  jp
      Bug #70131#: OutFields: append the charattributes of the node to the sprms

      Revision 1.33  1999/11/24 13:14:25  jp
      remove GetTimePara/GetDatePara, ReplaceCr: insert char at row end

      Revision 1.32  1999/11/22 18:26:04  jp
      export of TOX and TOX entries

      Revision 1.31  1999/11/12 16:07:12  jp
      write foot-/endnote attributes with correct charfmts

      Revision 1.30  1999/11/12 13:23:25  jp
      Escapement: write AUTO-Escapment correct

      Revision 1.29  1999/11/10 16:09:54  jp
      Bug #67922#: write header/footer for w95

      Revision 1.28  1999/10/29 17:45:57  jp
      export of 'complex'(vert. merged) tables

      Revision 1.26  1999/10/14 21:06:13  jp
      Bug #68617#,#68705# and other little things

*************************************************************************/




diff --git a/sw/source/filter/ww8/ww8glsy.cxx b/sw/source/filter/ww8/ww8glsy.cxx
new file mode 100644
index 0000000..a587376
--- /dev/null
+++ b/sw/source/filter/ww8/ww8glsy.cxx
@@ -0,0 +1,426 @@
/*************************************************************************
 *
 *  $RCSfile: ww8glsy.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:58 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#ifndef _RTL_TENCINFO_H
#include <rtl/tencinfo.h>
#endif
#ifndef _SVSTDARR_HXX
#define _SVSTDARR_STRINGS
#include <svtools/svstdarr.hxx>
#endif

#ifndef _SWSWERROR_H
#include <swerror.h>
#endif
#ifndef _WW8GLSY_HXX
#include <ww8glsy.hxx>
#endif
#ifndef _WW8PAR_HXX
#include <ww8par.hxx>
#endif
#ifndef _NDTXT
#include <ndtxt.hxx>
#endif
#include <pam.hxx>
#ifndef SVTOOLS_URIHELPER_HXX
#include <svtools/urihelper.hxx>
#endif
#ifndef _URLOBJ_HXX
#include <tools/urlobj.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _FMTANCHR_HXX //autogen wg. SwFmtAnchor
#include <fmtanchr.hxx>
#endif
#ifndef _FRMFMT_HXX //autogen wg. SwFrmFmt
#include <frmfmt.hxx>
#endif
#ifndef _DOC_HXX //autogen wg. SwDoc
#include <doc.hxx>
#endif
#ifndef _DOCARY_HXX //autogen wg. SwDoc
#include <docary.hxx>
#endif


WW8Glossary::WW8Glossary(SvStorageStreamRef &refStrm,BYTE nVersion,
    SvStorage *pStg) : rStrm(refStrm), xStg(pStg), nStrings( 0 )
{
    refStrm->SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );
    WW8Fib aWwFib( *refStrm, nVersion );

    String sTblNm( WW8_ASCII2STR( "1Table" ));
    if( 1 != aWwFib.fWhichTblStm )
        sTblNm.SetChar( 0, '0' );

    xTableStream = pStg->OpenStream( sTblNm, STREAM_STD_READ );
    xTableStream->SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );
    pGlossary = new WW8GlossaryFib( *refStrm, nVersion,*xTableStream, aWwFib );
}

BOOL WW8Glossary::HasBareGraphicEnd(SwDoc *pDoc,SwNodeIndex &rIdx)
{
    BOOL bRet=FALSE;
    for( USHORT nCnt = pDoc->GetSpzFrmFmts()->Count(); nCnt; )
    {
        SwFrmFmt* pFrmFmt = (*pDoc->GetSpzFrmFmts())[ --nCnt ];
        if ( RES_FLYFRMFMT != pFrmFmt->Which() &&
            RES_DRAWFRMFMT != pFrmFmt->Which() )
                continue;
        const SwFmtAnchor& rAnchor = pFrmFmt->GetAnchor();
        const SwPosition* pAPos;
        if( ( FLY_AT_CNTNT == rAnchor.GetAnchorId() ||
            FLY_AUTO_CNTNT == rAnchor.GetAnchorId() ) &&
            0 != ( pAPos = rAnchor.GetCntntAnchor()) &&
            rIdx == pAPos->nNode.GetIndex() )
            {
                bRet=TRUE;
                break;
            }
    }
    return bRet;
}

BOOL WW8Glossary::MakeEntries( SwDoc *pD, SwTextBlocks &rBlocks,
                                BOOL bSaveRelFile, SvStrings& rStrings,
                                SvStrings& rExtra )
{
    // this code will be called after reading all text into the
    // empty sections
    const String aOldURL( INetURLObject::GetBaseURL() );
    BOOL bRet=FALSE;
    if( bSaveRelFile )
    {
        INetURLObject::SetBaseURL(
            URIHelper::SmartRelToAbs( rBlocks.GetFileName()));
    }
    else
        INetURLObject::SetBaseURL( aEmptyStr );

    SwNodeIndex aDocEnd( pD->GetNodes().GetEndOfContent() );
    SwNodeIndex aStart( *aDocEnd.GetNode().StartOfSectionNode(), 1 );

    // search the first NormalStartNode
    while( !( aStart.GetNode().IsStartNode() && SwNormalStartNode ==
           aStart.GetNode().GetStartNode()->GetStartNodeType()) &&
            aStart < aDocEnd )
        aStart++;

    if( aStart < aDocEnd )
    {
        SwTxtFmtColl* pColl = pD->GetTxtCollFromPool(
            RES_POOLCOLL_STANDARD );
        USHORT nGlosEntry = 0;
        SwCntntNode* pCNd = 0;
        do {
            SwPaM aPam( aStart );
            {
                SwNodeIndex& rIdx = aPam.GetPoint()->nNode;
                rIdx++;
                if( 0 == ( pCNd = rIdx.GetNode().GetTxtNode() ) )
                {
                    if( rIdx.GetNode().IsTableNode() )
                        pCNd = pD->GetNodes().GoNext( &rIdx );
                    else
                    {
                        pCNd = pD->GetNodes().MakeTxtNode( rIdx, pColl );
                        rIdx = *pCNd;
                    }
                }
            }
            aPam.GetPoint()->nContent.Assign( pCNd, 0 );
            aPam.SetMark();
            {
                SwNodeIndex& rIdx = aPam.GetPoint()->nNode;
                rIdx = aStart.GetNode().EndOfSectionIndex() - 1;
                if(( 0 == ( pCNd = rIdx.GetNode().GetCntntNode() ) )
                        || HasBareGraphicEnd(pD,rIdx))
                {
                    rIdx++;
                    pCNd = pD->GetNodes().MakeTxtNode( rIdx, pColl );
                    rIdx = *pCNd;
                }
            }
            aPam.GetPoint()->nContent.Assign( pCNd, pCNd->Len() );

            // now we have the right selection for one entry.
            // Copy this to the definied TextBlock, but only if
            // it is not an autocorrection entry (== -1)
            // otherwise the group indicates the group in
            // the sttbfglsystyle list that this entry belongs
            // to. Unused at the moment
            INT16 group = rExtra[nGlosEntry]->ToInt32() + 2;
            if (group != -1)
            {
                rBlocks.ClearDoc();
                String sLNm( *rStrings[nGlosEntry] );
                if( rBlocks.BeginPutDoc( rBlocks.GetValidShortCut(sLNm,TRUE), sLNm ))
                {
                    SwDoc* pGlDoc = rBlocks.GetDoc();
                    SwNodeIndex aIdx( pGlDoc->GetNodes().GetEndOfContent(),
                        -1 );
                    pCNd = aIdx.GetNode().GetCntntNode();
                    SwPosition aPos( aIdx, SwIndex( pCNd, pCNd->Len() ));
                    pD->Copy( aPam, aPos );
                    rBlocks.PutDoc();
                }
            }
            aStart = aStart.GetNode().EndOfSectionIndex() + 1;
            ++nGlosEntry;
        } while( aStart.GetNode().IsStartNode() &&
                SwNormalStartNode == aStart.GetNode().
                    GetStartNode()->GetStartNodeType());
        bRet=TRUE;
    }

// this code will be called after reading all text into the empty sections

    INetURLObject::SetBaseURL( aOldURL );
    return bRet;
}


BOOL WW8Glossary::Load( SwTextBlocks &rBlocks, BOOL bSaveRelFile )
{
    BOOL bRet = FALSE;
    if( pGlossary->IsGlossaryFib() && rBlocks.StartPutMuchBlockEntries() )
    {
        //read the names of the autotext entries
        SvStrings aStrings( 0, 64 ), aExtra( 0, 64 );

        rtl_TextEncoding eStructCharSet = 0x0100 == pGlossary->chseTables
                                            ? RTL_TEXTENCODING_APPLE_ROMAN
                                            : rtl_getTextEncodingFromWindowsCharset(
                                                pGlossary->chseTables );

        WW8ReadSTTBF( TRUE, *xTableStream,
                        pGlossary->fcSttbfglsy, pGlossary->lcbSttbfglsy, 0,
                        eStructCharSet, aStrings, &aExtra );
        rStrm->Seek(0);

    //  SwDoc *pD = new SwDoc;
    //  pD->SetDocShell(new SwDocShell(SFX_CREATE_MODE_INTERNAL));
        SfxObjectShellRef xDocSh( new SwDocShell( SFX_CREATE_MODE_INTERNAL));
        if( xDocSh->DoInitNew( 0 ) )
        {
            SwDoc *pD =  ((SwDocShell*)(&xDocSh))->GetDoc();
            SwWW8ImplReader* pRdr = new
                SwWW8ImplReader( pGlossary->nVersion , xStg, &rStrm, *pD, TRUE );

            SwNodeIndex
                aIdx( *pD->GetNodes().GetEndOfContent().StartOfSectionNode(), 1 );
            if( !aIdx.GetNode().IsTxtNode() )
            {
                ASSERT( !this, "wo ist der TextNode?" );
                pD->GetNodes().GoNext( &aIdx );
            }
            SwPaM aPamo( aIdx );
            aPamo.GetPoint()->nContent.Assign( aIdx.GetNode().GetCntntNode(), 0 );
            pRdr->LoadDoc(aPamo,this);

            bRet = MakeEntries( pD, rBlocks, bSaveRelFile, aStrings, aExtra );

            delete pRdr;
        }
        xDocSh->DoClose();
        rBlocks.EndPutMuchBlockEntries();

        nStrings = aStrings.Count();
        aStrings.DeleteAndDestroy( 0, nStrings );
        aExtra.DeleteAndDestroy( 0, aExtra.Count() );
    }
    return bRet;
}


BOOL WW8GlossaryFib::IsGlossaryFib()
{
    if( !nFibError )
    {
        INT16 nFibMin;
        INT16 nFibMax;
        switch( nVersion )  // beachte: 6 steht fuer "6 ODER 7",
                            // 7 steht fuer "NUR 7"
            {
        case 6:
            nFibMin = 0x0065;   // von 101 WinWord 6.0
            //     102    "
            // und 103 WinWord 6.0 fuer Macintosh
            //     104    "
            nFibMax = 0x0069;   // bis 105 WinWord 95
            break;
        case 7:
            nFibMin = 0x0069;   // von 105 WinWord 95
            nFibMax = 0x0069;   // bis 105 WinWord 95
            break;
        case 8:
            nFibMin = 0x006A;   // von 106 WinWord 97
            nFibMax = 0x00c1;   // bis 193 WinWord 97 (?)
            break;
        default:
            nFibMin = 0;            // Programm-Fehler!
            nFibMax = 0;
            nFib    = 1;
        }
        if(    ( nFib < nFibMin )
            || ( nFib > nFibMax ) )
            nFibError = ERR_SWG_READ_ERROR; // Error melden
    }
    return(0 == nFibError);
}

UINT32 WW8GlossaryFib::FindGlossaryFibOffset(SvStream &rTableStrm,
        SvStream &rStrm, const WW8Fib &rFib)
{
    WW8PLCF aPlc( &rTableStrm, rFib.fcPlcfsed, rFib.lcbPlcfsed, 12 );
    long start,ende;
    void *pData;
    aPlc.Get(start,ende,pData);
    UINT32 nPo = SVBT32ToLong((BYTE *)pData+2);
    //*pOut << hex << "Offset of last SEPX is " << nPo << endl;

    UINT16 nLen;
    if (nPo != 0xFFFFFFFF)
    {
        rStrm.Seek(nPo);
        rStrm >> nLen;
    }
    else
    {
        nPo=0;
        nLen=0;
    }

//  *pOut << hex << "Ends at " << nPo+len << endl;
    nPo+=nLen;
    UINT32 nEndLastPage;
    if (nPo%512)
    {
        nEndLastPage = (nPo)/512;
        nEndLastPage = (nEndLastPage+1)*512;
    }
    else
        nEndLastPage = nPo;

    //*pOut << hex << "SECOND FIB SHOULD BE FOUND at " << k << endl;

    WW8PLCF xcPLCF( &rTableStrm, rFib.fcPlcfbteChpx,
            rFib.lcbPlcfbteChpx, (8 > rFib.nVersion) ? 2 : 4);

    xcPLCF.Get(start,ende,pData);

    nPo = SVBT32ToLong((BYTE *)pData);
    //*pOut << hex << "Offset of last CHPX is " << (nPo+1) *512<< endl;
    if (((nPo+1)*512) > nEndLastPage) nEndLastPage = (nPo+1)*512;

    WW8PLCF xpPLCF( &rTableStrm, rFib.fcPlcfbtePapx,
            rFib.lcbPlcfbtePapx, (8 > rFib.nVersion) ? 2 : 4);
    xpPLCF.Get(start,ende,pData);
    nPo = SVBT32ToLong((BYTE *)pData);
    //*pOut << hex << "Offset of last PAPX is " << nPo *512 << endl;
    if (((nPo+1)*512) > nEndLastPage) nEndLastPage = (nPo+1)*512;

    //*pOut << hex << "SECOND FIB SHOULD BE FOUND at " << nEndLastPage << endl;
    return nEndLastPage;
}

/*************************************************************************
      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ww8/ww8glsy.cxx,v 1.1.1.1 2000-09-18 17:14:58 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.8  2000/09/18 16:04:59  willem.vandorp
      OpenOffice header added.

      Revision 1.7  2000/06/26 12:59:10  os
      INetURLObject::SmartRelToAbs removed

      Revision 1.6  2000/05/18 10:58:34  jp
      Changes for Unicode

      Revision 1.5  2000/05/16 11:08:03  khz
      Unicode code-conversion

      Revision 1.4  2000/03/13 10:22:14  jp
      Bug #72579#: little/big endian problem

      Revision 1.3  2000/03/03 14:03:39  os
      precompiled header

      Revision 1.2  2000/02/28 08:33:46  cmc
      #72579# Enable Glossary Import

      Revision 1.1  2000/02/14 09:05:56  cmc
      #72579# added ww8glsy.cxx


*************************************************************************/
diff --git a/sw/source/filter/ww8/ww8glsy.hxx b/sw/source/filter/ww8/ww8glsy.hxx
new file mode 100644
index 0000000..4bb5fc7
--- /dev/null
+++ b/sw/source/filter/ww8/ww8glsy.hxx
@@ -0,0 +1,134 @@
/*************************************************************************
 *
 *  $RCSfile: ww8glsy.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:58 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _WW8GLSY_HXX
#define _WW8GLSY_HXX

#ifndef _SVSTOR_HXX
#include <so3/svstor.hxx>
#endif

#ifndef _SHELLIO_HXX
#include <shellio.hxx>
#endif

#ifndef _WW8SCAN_HXX
#include <ww8scan.hxx>
#endif


class SwTextBlocks;
class SwNodeIndex;
class SwSpzFrmFmts;

/*
 * GlossaryFib takes the document fib and finds the glossary fib which may
 * not exist. The glossary fib has the offsets into the autotext subdocument
 * which is at the end of template .dot's
 */
class WW8GlossaryFib : public WW8Fib
{
public:
    WW8GlossaryFib( SvStream& rStrm, BYTE nWantedVersion ,
        SvStream& rTableStrm, const WW8Fib &rFib) : WW8Fib(rStrm,
        nWantedVersion,FindGlossaryFibOffset(rTableStrm,rStrm,rFib)) {}
    BOOL IsGlossaryFib();
private:
    UINT32 FindGlossaryFibOffset(SvStream &rTableStrm,SvStream &rStrm,
        const WW8Fib &rFib);
};

/*
 * Imports glossaries from word, given the document it gets the usual word
 * doc information, then the glossary fib and uses the usual reader class to
 * wrap the autotext into a star doc. Afterwards taking each section entry and
 * making it a single star autotext entry.
 *
 * ToDo currently all autotext entries become resource hungry star autotext
 * formatted text, need to use a flag in the ww8reader class to determine if
 * an entry is formatted or not.
 */
class WW8Glossary
{
public:
    WW8Glossary( SvStorageStreamRef &refStrm, BYTE nVersion, SvStorage *pStg=0);
    BOOL Load( SwTextBlocks &rBlocks, BOOL bSaveRelFile );
    ~WW8Glossary()                  { delete pGlossary; }
    WW8GlossaryFib *GetFib()        { return pGlossary; }
    USHORT GetNoStrings() const     { return nStrings; }

private:
    WW8GlossaryFib *pGlossary;
    SvStorageStreamRef xTableStream;
    SvStorageStreamRef &rStrm;
    SvStorageRef xStg;
    USHORT nStrings;

    BOOL MakeEntries( SwDoc *pD, SwTextBlocks &rBlocks, BOOL bSaveRelFile,
                        SvStrings& rStrings, SvStrings& rExtra);
    BOOL HasBareGraphicEnd(SwDoc *pD,SwNodeIndex &rIdx);
};





#endif
diff --git a/sw/source/filter/ww8/ww8graf.cxx b/sw/source/filter/ww8/ww8graf.cxx
new file mode 100644
index 0000000..b72e5ae
--- /dev/null
+++ b/sw/source/filter/ww8/ww8graf.cxx
@@ -0,0 +1,3174 @@
/*************************************************************************
 *
 *  $RCSfile: ww8graf.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:58 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#pragma hdrstop

#include <math.h>

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _SVX_FMGLOB_HXX
#include <svx/fmglob.hxx>
#endif
#ifndef _UCBHELPER_CONTENT_HXX
#include <ucbhelper/content.hxx>
#endif
#ifndef SVTOOLS_URIHELPER_HXX
#include <svtools/urihelper.hxx>
#endif
#ifndef _SDTAITM_HXX
#include <svx/sdtaitm.hxx>
#endif
#ifndef _SVSTDARR_HXX
#define _SVSTDARR_SHORTS
#include <svtools/svstdarr.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_UDLNITEM_HXX //autogen
#include <svx/udlnitem.hxx>
#endif
#ifndef _SVX_XLINIIT_HXX //autogen
#include <svx/xlineit.hxx>
#endif
#ifndef _SVX_FILLITEM_HXX //autogen
#include <svx/xfillit.hxx>
#endif
#ifndef _SVDMODEL_HXX //autogen
#include <svx/svdmodel.hxx>
#endif
#ifndef _SDTAITM_HXX //autogen
#include <svx/sdtaitm.hxx>
#endif
#ifndef _SVDCAPT_HXX //autogen
#include <svx/svdocapt.hxx>
#endif
#ifndef _SXCTITM_HXX //autogen
#include <svx/sxctitm.hxx>
#endif
#ifndef _MyEDITENG_HXX
#include <svx/editeng.hxx>
#endif
#ifndef _SVDPAGE_HXX //autogen
#include <svx/svdpage.hxx>
#endif
#ifndef _SVDOPATH_HXX //autogen
#include <svx/svdopath.hxx>
#endif
#ifndef _SVDOCIRC_HXX //autogen
#include <svx/svdocirc.hxx>
#endif
#ifndef _OUTLOBJ_HXX //autogen
#include <svx/outlobj.hxx>
#endif
#ifndef _SVDOGRP_HXX //autogen
#include <svx/svdogrp.hxx>
#endif
#ifndef _SVDOGRAF_HXX
#include <svx/svdograf.hxx>
#endif
#ifndef _SVDOOLE2_HXX
#include <svx/svdoole2.hxx>
#endif
#ifndef _SVX_COLRITEM_HXX
#include <svx/colritem.hxx>
#endif
#ifndef _SVX_FHGTITEM_HXX
#include <svx/fhgtitem.hxx>
#endif
#ifndef _SVX_POSTITEM_HXX
#include <svx/postitem.hxx>
#endif
#ifndef _SVX_ADJITEM_HXX
#include <svx/adjitem.hxx>
#endif
#ifndef _SVX_WGHTITEM_HXX
#include <svx/wghtitem.hxx>
#endif
#ifndef _SVX_CRSDITEM_HXX
#include <svx/crsditem.hxx>
#endif
#ifndef _SVX_CNTRITEM_HXX
#include <svx/cntritem.hxx>
#endif
#ifndef _SVX_SHDDITEM_HXX
#include <svx/shdditem.hxx>
#endif
#ifndef _SVX_FONTITEM_HXX
#include <svx/fontitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _TOOLS_URLOBJ_HXX
#include <tools/urlobj.hxx>
#endif
#ifndef _SVX_IMPGRF_HXX
#include <svx/impgrf.hxx>
#endif
#ifndef _MSDFFIMP_HXX
#include <svx/msdffimp.hxx>
#endif
#ifndef _SVDOATTR_HXX
#include <svx/svdoattr.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX
#include <svx/brshitem.hxx>
#endif
#ifndef _SVX_RECTENUM_HXX //autogen
#include <svx/rectenum.hxx>
#endif
#ifndef _SVX_XFLTRIT_HXX
#include <svx/xfltrit.hxx>
#endif
#ifndef _SVX_OPAQITEM_HXX //autogen
#include <svx/opaqitem.hxx>
#endif
#ifndef _SVX_SHADITEM_HXX //autogen
#include <svx/shaditem.hxx>
#endif
#ifndef _SVX_SHADITEM_HXX //autogen
#include <svx/shaditem.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#include <svx/boxitem.hxx>
#endif

#ifndef _IPOBJ_HXX //autogen
#include <so3/ipobj.hxx>
#endif

#ifndef _WW8STRUC_HXX
#include <ww8struc.hxx>
#endif
#ifndef _WW8SCAN_HXX
#include <ww8scan.hxx>
#endif
#ifndef _WW8PAR_HXX
#include <ww8par.hxx>           // class SwWWImplReader
#endif
#ifndef _WW8GRAF_HXX
#include <ww8graf.hxx>
#endif
#ifndef _WW8PAR2_HXX
#include <ww8par2.hxx>          // SwWW8StyInf
#endif
#ifndef _GRFATR_HXX
#include <grfatr.hxx>           // class SwCropGrf
#endif
#ifndef _FMTORNT_HXX
#include <fmtornt.hxx>
#endif
#ifndef _FMTCNTNT_HXX //autogen
#include <fmtcntnt.hxx>
#endif
#ifndef _FRMFMT_HXX //autogen
#include <frmfmt.hxx>
#endif
#ifndef _FMTANCHR_HXX //autogen
#include <fmtanchr.hxx>
#endif
#ifndef _PAM_HXX
#include <pam.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _NDGRF_HXX
#include <ndgrf.hxx>
#endif
#ifndef _DCONTACT_HXX
#include <dcontact.hxx>
#endif
#ifndef _MDIEXP_HXX
#include <mdiexp.hxx>           // Progress
#endif
#ifndef _FLTSHELL_HXX
#include <fltshell.hxx>
#endif
#ifndef _FMTCNCT_HXX
#include <fmtcnct.hxx>
#endif

using namespace ::com::sun::star;
using namespace ::com::sun::star::ucb;
using namespace ::com::sun::star::uno;
using namespace ::ucb;
using namespace ::rtl;

// Hilfsroutinen

// inline geht bei BLC leider nicht mit "for"
/*inline*/ Color WW8TransCol( SVBT32 nWC )
{
#if 1               // 1 = Vordefinierte Farben benutzen, 0 = ignorieren

    // Farbtabelle zum Umrechnen RGB-Werte in vordefinierte Farben
    // ( Damit bei der Writer-UI die Farbnamen stimmen )
    // Die Tabelle int im *3er-System* aufgeteilt. Die Grauwerte fehlen,
    // da sie nicht ins 3er-System passen ( 4 Werte: sw, ws, 2 * grau )
    static ColorData eColA[] = {                    //  B G R  B G R  B G R
        COL_BLACK, COL_RED, COL_LIGHTRED,           //  0 0 0, 0 0 1, 0 0 2
        COL_GREEN, COL_BROWN, COL_BLACK,            //  0 1 0, 0 1 1, 0 1 2
        COL_LIGHTGREEN, COL_BLACK, COL_YELLOW,      //  0 2 0, 0 2 1, 0 2 2
        COL_BLUE, COL_MAGENTA, COL_BLACK,           //  1 0 0, 1 0 1, 1 0 2
        COL_CYAN, COL_LIGHTGRAY, COL_BLACK,         //  1 1 0, 1 1 1, 1 1 2
        COL_BLACK, COL_BLACK, COL_BLACK,            //  1 2 0, 1 2 1, 1 2 2
        COL_LIGHTBLUE, COL_BLACK, COL_LIGHTMAGENTA, //  2 0 0, 2 0 1, 2 0 2
        COL_BLACK, COL_BLACK, COL_BLACK,            //  2 1 0, 2 1 1, 2 1 2
        COL_LIGHTCYAN, COL_BLACK, COL_WHITE };      //  2 2 0, 2 2 1, 2 2 2

    // In nWC[3] steht ein Byte, dass in der WW-Doku nicht beschrieben ist.
    // Die Bedeutung ist anscheinend folgende: Bei 0 ist es eine normale
    // Farbe, dessen RGB-Wert in nWC[0..2] steht. stehen in nWC[3] die
    // Werte 0x1, 0x7d oder 0x83, dann ist es ein Grauwert, dessen
    // Schwarzanteil in 1/2 % in nWC[0] steht.
    // Ich vermute, dass es auf Bit0 in nWV[3] ankommt, ob es RGB oder Grau ist.

    if( !( nWC[3] & 0x1 ) &&                        // keine Spezial-Farbe (grau)
        (    ( nWC[0] == 0 ||  nWC[0]== 0x80 || nWC[0] == 0xff )    // R-Anteil
          && ( nWC[1] == 0 ||  nWC[1]== 0x80 || nWC[1] == 0xff )    // G-Anteil
          && ( nWC[2] == 0 ||  nWC[2]== 0x80 || nWC[2] == 0xff ) ) ){// B-Anteil
        int nIdx = 0;       // und nun: Idx-Berechnung im 3er-System
        for( int i = 2; i >= 0; i-- ){
            nIdx *= 3;
            if( nWC[i] )
                nIdx += ( ( nWC[i] == 0xff ) ? 2 : 1 );
        }
        if( eColA[ nIdx ] != COL_BLACK )
            return Color( eColA[ nIdx ] );  // Standard-Color
    }
#endif
    if( nWC[3] & 0x1 ){                             // Spezialfarbe: Grau
#ifdef VCL
        register BYTE u = (BYTE)( (ULONG)( 200 - nWC[0] ) * 256 / 200 );
#else
        register USHORT u = (USHORT)( (ULONG)( 200 - nWC[0] ) * 65535L / 200 );
#endif
        return Color( u, u, u );
    }
                    // User-Color
    return Color( (USHORT)nWC[0] << 8, (USHORT)nWC[1] << 8,
                  (USHORT)nWC[2] << 8 );
}



// MakeUniqueGraphName erzeugt einen einzigartigen Namen fuer eine Grafik
//                     ( nur falls nicht bNew gesetzt ist )

BOOL SwWW8ImplReader::MakeUniqueGraphName( String& rName,
                                            const String& rFixedPart )
{
    if( !bNew )
        return FALSE;
    nImportedGraphicsCount++;
    rName = WW8_ASCII2STR( "G" );
    rName += String::CreateFromInt32( nImportedGraphicsCount );
    rName += WW8_ASCII2STR( ": " );
    rName += rFixedPart;
    return TRUE;
}



// ReadGrafStart liest die ObjektDaten ein und erzeugt falls noetig einen Anker

BOOL SwWW8ImplReader::ReadGrafStart( void* pData, short nDataSiz, WW8_DPHEAD* pHd,
                             WW8_DO* pDo )
{
    if( (INT16)SVBT16ToShort( pHd->cb )
        < (short)sizeof( WW8_DPHEAD ) + nDataSiz ){
        ASSERT( !this, "+Grafik-Element: Size ?" );
        pStrm->SeekRel( (INT16)SVBT16ToShort( pHd->cb ) - sizeof( WW8_DPHEAD ) );
        return FALSE;
    }
    pStrm->Read( pData, nDataSiz );

    RndStdIds eAnchor = ( SVBT8ToByte( pDo->by ) < 2 ) ? FLY_PAGE : FLY_AT_CNTNT;
    if( (bIsHeader || bIsFooter) && (FLY_AT_CNTNT != eAnchor) )
    {
        eAnchor = FLY_AT_CNTNT;
        pNode_FLY_AT_CNTNT = &pPaM->GetPoint()->nNode.GetNode();
    }

    pDrawFmt->SetAttr( SwFmtAnchor( eAnchor, 1 ) );
    pCtrlStck->NewAttr( *pPaM->GetPoint(), SwFltAnchor( pDrawFmt ) );
    pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_FLTR_ANCHOR );

    nDrawXOfs2 = nDrawXOfs;
    nDrawYOfs2 = nDrawYOfs;

    if( eAnchor == FLY_AT_CNTNT ){
        if( SVBT8ToByte( pDo->bx ) == 1 )       // Pos: echt links
            nDrawXOfs2 -= nPgLeft;
        if( bTable )                            // Obj in Table
            nDrawXOfs2 -= GetTableLeft();       // -> siehe Kommentar
                                                // bei GetTableLeft()
    }else{
        if( SVBT8ToByte( pDo->bx ) != 1 )
            nDrawXOfs2 += nPgLeft;
        if( SVBT8ToByte( pDo->by ) == 0 )
            nDrawYOfs2 += nPgTop;
    }

    return TRUE;
}

// SetStdAttr() setzt die Attribute, die jedes Objekt hat

static void SetStdAttr( SfxItemSet& rSet, WW8_DP_LINETYPE& rL,
                        WW8_DP_SHADOW& rSh )
{
    if( SVBT16ToShort( rL.lnps ) == 5 ){            // unsichtbar
        rSet.Put( XLineStyleItem( XLINE_NONE ) );
    }else{                                          // sichtbar
        Color aCol( WW8TransCol( rL.lnpc ) );           // LinienFarbe
        rSet.Put( XLineColorItem( aEmptyStr, aCol ) );
        rSet.Put( XLineWidthItem( SVBT16ToShort( rL.lnpw ) ) );
                                                    // LinienDicke
        if( SVBT16ToShort( rL.lnps ) >= 1
            && SVBT16ToShort(rL.lnps ) <= 4 ){      // LinienStil
            rSet.Put( XLineStyleItem( XLINE_DASH ) );
            INT16 nLen = SVBT16ToShort( rL.lnpw );
            XDash aD( XDASH_RECT, 1, 2 * nLen, 1, 5 * nLen, 5 * nLen );
            switch( SVBT16ToShort( rL.lnps ) ){
            case 1: aD.SetDots( 0 );            // Dash
                    aD.SetDashLen( 6 * nLen );
                    aD.SetDistance( 4 * nLen );
                    break;
            case 2: aD.SetDashes( 0 ); break;   // Dot
            case 3: break;                      // Dash Dot
            case 4: aD.SetDots( 2 ); break;     // Dash Dot Dot
            }
            rSet.Put( XLineDashItem( aEmptyStr, aD ) );
        }else{
            rSet.Put( XLineStyleItem( XLINE_SOLID ) );  // noetig fuer TextBox
        }
    }
    if( SVBT16ToShort( rSh.shdwpi ) ){                  // Schatten
        rSet.Put( SdrShadowItem( TRUE ) );
        rSet.Put( SdrShadowXDistItem( SVBT16ToShort( rSh.xaOffset ) ) );
        rSet.Put( SdrShadowYDistItem( SVBT16ToShort( rSh.yaOffset ) ) );
    }
}

// SetFill setzt Fuellattribute wie Vordergrund- und Hintergrund-Farbe
// und Muster durch Reduktion auf eine Farbe.
// SetFill() setzt z.Zt kein Muster, da Sdr das nur sehr umstaendlich kann
// und die Sdr-Schraffur ( XDash ) noch nicht fertig ist.
// Statt dessen wird eine Mischfarbe gewaehlt, die auf den entsprechenden
// Farbton zwischen den Farben liegt.

static void SetFill( SfxItemSet& rSet, WW8_DP_FILL& rFill )
{
    static BYTE nPatA[] = { 0, 0, 5, 10, 20, 25, 30, 40, 50, 60, 70, 75, 80,
                        90, 50, 50, 50, 50,50, 50, 33, 33, 33, 33, 33, 33 };
    register short nPat = SVBT16ToShort( rFill.flpp );

    if( nPat == 0 ){                            // durchsichtig
        rSet.Put( XFillStyleItem( XFILL_NONE ) );
    }else{
        rSet.Put( XFillStyleItem( XFILL_SOLID ) );  // noetig fuer TextBox
        if( nPat <= 1 || nPat > sizeof( nPatA ) ){  // solid Bg oder unbekannt
            rSet.Put( XFillColorItem( aEmptyStr, WW8TransCol( rFill.dlpcBg ) ) );
        }else{                                      // Brush -> Farbmischung
            Color aB( WW8TransCol( rFill.dlpcBg ) );
            Color aF( WW8TransCol( rFill.dlpcFg ) );
#ifdef VCL
            aB.SetRed( (BYTE)( ( (ULONG)aF.GetRed() * nPatA[nPat]
                        + (ULONG)aB.GetRed() * ( 100 - nPatA[nPat] ) ) / 100 ) );
            aB.SetGreen( (BYTE)( ( (ULONG)aF.GetGreen() * nPatA[nPat]
                        + (ULONG)aB.GetGreen() * ( 100 - nPatA[nPat] ) ) / 100 ) );
            aB.SetBlue( (BYTE)( ( (ULONG)aF.GetBlue() * nPatA[nPat]
                        + (ULONG)aB.GetBlue() * ( 100 - nPatA[nPat] ) ) / 100 ) );
#else
            aB.SetRed( (USHORT)( ( (ULONG)aF.GetRed() * nPatA[nPat]
                        + (ULONG)aB.GetRed() * ( 100 - nPatA[nPat] ) ) / 100 ) );
            aB.SetGreen( (USHORT)( ( (ULONG)aF.GetGreen() * nPatA[nPat]
                        + (ULONG)aB.GetGreen() * ( 100 - nPatA[nPat] ) ) / 100 ) );
            aB.SetBlue( (USHORT)( ( (ULONG)aF.GetBlue() * nPatA[nPat]
                        + (ULONG)aB.GetBlue() * ( 100 - nPatA[nPat] ) ) / 100 ) );
#endif
            rSet.Put( XFillColorItem( aEmptyStr, aB ) );
        }
    }
}

static void SetLineEndAttr( SfxItemSet& rSet, WW8_DP_LINEEND& rLe,
                            WW8_DP_LINETYPE& rLt )
{
    UINT16 aSB = SVBT16ToShort( rLe.aStartBits );
    if( aSB & 0x3 ){
        XPolygon aXP(3);
        aXP[0] = Point( 0, 330 );
        aXP[1] = Point( 100, 0 );
        aXP[2] = Point( 200, 330 );
        rSet.Put( XLineEndItem( aEmptyStr, aXP ) );
        USHORT nSiz = SVBT16ToShort( rLt.lnpw )
                        * ( ( aSB >> 2 & 0x3 ) + ( aSB >> 4 & 0x3 ) );
        if( nSiz < 220 ) nSiz = 220;
        rSet.Put( XLineEndWidthItem( nSiz ) );
        rSet.Put( XLineEndCenterItem( FALSE ) );
    }

    UINT16 aEB = SVBT16ToShort( rLe.aEndBits );
    if( aEB & 0x3 ){
        XPolygon aXP(3);
        aXP[0] = Point( 0, 330 );
        aXP[1] = Point( 100, 0 );
        aXP[2] = Point( 200, 330 );
        rSet.Put( XLineStartItem( aEmptyStr, aXP ) );
        USHORT nSiz = SVBT16ToShort( rLt.lnpw )
                        * ( ( aEB >> 2 & 0x3 ) + ( aEB >> 4 & 0x3 ) );
        if( nSiz < 220 ) nSiz = 220;
        rSet.Put( XLineStartWidthItem( nSiz ) );
        rSet.Put( XLineStartCenterItem( FALSE ) );
    }
}

// Parallel zu dem Obj-Array im Dokument baue ich ein Array auf,
// dass die Ww-Height ( -> Wer ueberdeckt wen ) beinhaltet.
// Anhand dieses VARARR wird die Einfuegeposition ermittelt.
// Der Offset bei Datei in bestehendes Dokument mit Grafiklayer einfuegen
// muss der Aufrufer den Index um nDrawObjOfs erhoeht werden, damit die
// neuen Objekte am Ende landen ( Einfuegen ist dann schneller )
static USHORT SearchPos( SvShorts* pHeight, short nWwHeight )
{
    USHORT i, nMax = pHeight->Count();
    for( i=0; i<nMax; i++ )     // lineare Suche: langsam
        if( ( pHeight->GetObject( i ) & 0x1fff ) > ( nWwHeight & 0x1fff ) )
            return i;           // vor i-tem Objekt einfuegen
    return nMax;                // am Ende anhaengen
}

// InsertObj() fuegt das Objekt in die Sw-Page ein und merkt sich die Z-Pos in
// einem VarArr

void SwWW8ImplReader::InsertObj( SdrObject* pObj, short nWwHeight )
{
    if( pDrawGroup )
        pDrawGroup->InsertObject( pObj, 0 );        // Group: Vorne einfuegen
    else
    {
        SwDrawContact* pContact = new SwDrawContact( pDrawFmt, pObj );
        USHORT nPos = SearchPos( pDrawHeight, nWwHeight );
        if( nWwHeight & 0x2000 )                    // Heaven ?
            pObj->SetLayer( nDrawHeaven );
        else
        {
            pObj->SetLayer( nDrawHell );
            pDrawFmt->SetAttr( SvxOpaqueItem( RES_OPAQUE, FALSE ) );
        }
        pDrawFmt->SetAttr( SwFmtSurround( SURROUND_THROUGHT ) );

        pDrawPg->InsertObject( pObj, nDrawObjOfs + nPos );
        pDrawHeight->Insert( nWwHeight, nPos ); // Pflege WW-Height-Array mit

            // Wenn es sich um seitengebundene Anker handelt, muss man noch
            // ein Problem umpopeln: Da ich die Seitennummer nicht weiss,
            // stecke ich den PaM stattdessen in den Anker. MA setzt das
            // bei der Formatierung dann um. Bis die Formatierung beim Anker
            // ist, liegen alle seitengebundenen Grafiken auf der 1. Seite,
            // dann verschwinden sie.
            // Abhilfe: AnkerPos initial weit auuserhalb des sichtbaren Bereiches
            // stellen, nach der Formatierung korrigiert MA sie.
            // schneller waere: ImpSetAnchor() statt NbcSetAnchor, allerdings
            // muesste dann die Relative Pos aller Objekte um die Ankerpos
            // korrigiert werden.
        pObj->NbcSetAnchorPos( Point( USHRT_MAX, USHRT_MAX ) );

        pContact->ConnectToLayout( &pDrawFmt->GetAnchor() );
    }
}

// Ab hier folgen die Routinen fuer die einzelnen Objekte

void SwWW8ImplReader::ReadLine( WW8_DPHEAD* pHd, WW8_DO* pDo )
{
    WW8_DP_LINE aLine;

    if( !ReadGrafStart( (void*)&aLine, sizeof( aLine ), pHd, pDo ) )
        return;

    Point aP[2];
    {
        Point& rP0 = aP[0];
        Point& rP1 = aP[1];

        rP0.X() = (INT16)SVBT16ToShort( pHd->xa ) + nDrawXOfs2;
        rP0.Y() = (INT16)SVBT16ToShort( pHd->ya ) + nDrawYOfs2;
        rP1 = rP0;
        rP0.X() += (INT16)SVBT16ToShort( aLine.xaStart );
        rP0.Y() += (INT16)SVBT16ToShort( aLine.yaStart );
        rP1.X() += (INT16)SVBT16ToShort( aLine.xaEnd );
        rP1.Y() += (INT16)SVBT16ToShort( aLine.yaEnd );
    }
    SdrObject* pObj = new SdrPathObj( OBJ_LINE, XPolygon( Polygon( 2, aP ) ) );
    InsertObj( pObj, SVBT16ToShort( pDo->dhgt ) );

    SfxAllItemSet aSet( pDrawModel->GetItemPool() );

    SetStdAttr( aSet, aLine.aLnt, aLine.aShd );
    SetLineEndAttr( aSet, aLine.aEpp, aLine.aLnt );

    pObj->SetAttributes( aSet, FALSE );
}

void SwWW8ImplReader::ReadRect( WW8_DPHEAD* pHd, WW8_DO* pDo )
{
    WW8_DP_RECT aRect;

    if( !ReadGrafStart( (void*)&aRect, sizeof( aRect ), pHd, pDo ) )
        return;

    Point aP0( (INT16)SVBT16ToShort( pHd->xa ) + nDrawXOfs2,
               (INT16)SVBT16ToShort( pHd->ya ) + nDrawYOfs2 );
    Point aP1( aP0 );
    aP1.X() += (INT16)SVBT16ToShort( pHd->dxa );
    aP1.Y() += (INT16)SVBT16ToShort( pHd->dya );

    SdrObject* pObj = new SdrRectObj( Rectangle( aP0, aP1 ) );
    InsertObj( pObj, SVBT16ToShort( pDo->dhgt ) );

    SfxAllItemSet aSet( pDrawModel->GetItemPool() );

    SetStdAttr( aSet, aRect.aLnt, aRect.aShd );
    SetFill( aSet, aRect.aFill );

    pObj->SetAttributes( aSet, FALSE );
}

void SwWW8ImplReader::ReadElipse( WW8_DPHEAD* pHd, WW8_DO* pDo )
{
    WW8_DP_ELIPSE aElipse;

    if( !ReadGrafStart( (void*)&aElipse, sizeof( aElipse ), pHd, pDo ) )
        return;

    Point aP0( (INT16)SVBT16ToShort( pHd->xa ) + nDrawXOfs2,
               (INT16)SVBT16ToShort( pHd->ya ) + nDrawYOfs2 );
    Point aP1( aP0 );
    aP1.X() += (INT16)SVBT16ToShort( pHd->dxa );
    aP1.Y() += (INT16)SVBT16ToShort( pHd->dya );

    SdrObject* pObj = new SdrCircObj( OBJ_CIRC, Rectangle( aP0, aP1 ) );
    InsertObj( pObj, SVBT16ToShort( pDo->dhgt ) );

    SfxAllItemSet aSet( pDrawModel->GetItemPool() );

    SetStdAttr( aSet, aElipse.aLnt, aElipse.aShd );
    SetFill( aSet, aElipse.aFill );

    pObj->SetAttributes( aSet, FALSE );
}

void SwWW8ImplReader::ReadArc( WW8_DPHEAD* pHd, WW8_DO* pDo )
{
    WW8_DP_ARC aArc;

    if( !ReadGrafStart( (void*)&aArc, sizeof( aArc ), pHd, pDo ) )
        return;

    Point aP0( (INT16)SVBT16ToShort( pHd->xa ) + nDrawXOfs2,
               (INT16)SVBT16ToShort( pHd->ya ) + nDrawYOfs2 );
    Point aP1( aP0 );
    aP1.X() += (INT16)SVBT16ToShort( pHd->dxa ) * 2;
    aP1.Y() += (INT16)SVBT16ToShort( pHd->dya ) * 2;

    short nA[] = { 2, 3, 1, 0 };
    short nW = nA[ ( ( SVBT8ToByte( aArc.fLeft ) & 1 ) << 1 )
                    + ( SVBT8ToByte( aArc.fUp ) & 1 ) ];
    if( !SVBT8ToByte( aArc.fLeft ) ){
        aP0.Y() -= (INT16)SVBT16ToShort( pHd->dya );
        aP1.Y() -= (INT16)SVBT16ToShort( pHd->dya );
    }
    if( SVBT8ToByte( aArc.fUp ) ){
        aP0.X() -= (INT16)SVBT16ToShort( pHd->dxa );
        aP1.X() -= (INT16)SVBT16ToShort( pHd->dxa );
    }

    SdrObject* pObj = new SdrCircObj( OBJ_SECT, Rectangle( aP0, aP1 ),
                               nW * 9000, ( ( nW + 1 ) & 3 ) * 9000 );
    InsertObj( pObj, SVBT16ToShort( pDo->dhgt ) );

    SfxAllItemSet aSet( pDrawModel->GetItemPool() );

    SetStdAttr( aSet, aArc.aLnt, aArc.aShd );
    SetFill( aSet, aArc.aFill );

    pObj->SetAttributes( aSet, FALSE );
}

void SwWW8ImplReader::ReadPolyLine( WW8_DPHEAD* pHd, WW8_DO* pDo )
{
    WW8_DP_POLYLINE aPoly;

    if( !ReadGrafStart( (void*)&aPoly, sizeof( aPoly ), pHd, pDo ) )
        return;

    UINT16 nCount = SVBT16ToShort( aPoly.aBits1 ) >> 1 & 0x7fff;
    SVBT16 *pP = new SVBT16[nCount * 2];
    pStrm->Read( pP, nCount * 4 );      // Punkte einlesen
    Polygon aP( nCount );
    Point aPt;
    USHORT i;

    for( i=0; i<nCount; i++ ){
        aPt.X() = SVBT16ToShort( pP[i << 1] ) + nDrawXOfs2
                  + (INT16)SVBT16ToShort( pHd->xa );
        aPt.Y() = SVBT16ToShort( pP[( i << 1 ) + 1] ) + nDrawYOfs2
                  + (INT16)SVBT16ToShort( pHd->ya );
        aP[i] = aPt;
    }
    delete[]( pP );

    SdrObject* pObj = new SdrPathObj(
                ( SVBT16ToShort( aPoly.aBits1 ) & 0x1 ) ? OBJ_POLY : OBJ_PLIN,
                                XPolygon( aP ) );

    InsertObj( pObj, SVBT16ToShort( pDo->dhgt ) );

    SfxAllItemSet aSet( pDrawModel->GetItemPool() );

    SetStdAttr( aSet, aPoly.aLnt, aPoly.aShd );
    SetFill( aSet, aPoly.aFill );

    pObj->SetAttributes( aSet, FALSE );
}

ESelection SwWW8ImplReader::GetESelection( long nCpStart, long nCpEnd )
{
    USHORT nPCnt = pDrawEditEngine->GetParagraphCount();
    USHORT nSP = 0;
    USHORT nEP = 0;
    while(      (nSP < nPCnt)
            &&  (nCpStart >= pDrawEditEngine->GetTextLen( nSP ) + 1) )
    {
        nCpStart -= pDrawEditEngine->GetTextLen( nSP ) + 1;
        nSP++;
    }
        // Beim Ende erst 1 Zeichen spaeter auf naechste Zeile umschalten,
        // da sonst Zeilenattribute immer eine Zeile zu weit reichen.
    while(      (nEP < nPCnt)
            &&  (nCpEnd > pDrawEditEngine->GetTextLen( nEP ) + 1) )
    {
        nCpEnd -= pDrawEditEngine->GetTextLen( nEP ) + 1;
        nEP++;
    }
    return ESelection( nSP, (USHORT)nCpStart, nEP, (USHORT)nCpEnd );
}

// GetTxbxCharAttrs() setzt die harten Zeichen-Attribute in den angegebenen Set.
// Toggle-Attribute werden z.Zt. nicht beruecksichtigt
void SwWW8ImplReader::GetTxbxPapAndCharAttrs( SfxItemSet& rS,
                                              const WW8PLCFManResult& rRes )
{
    static SvxAdjust aAdjArr[] = {  SVX_ADJUST_LEFT,
                                    SVX_ADJUST_CENTER,
                                    SVX_ADJUST_RIGHT,
                                    SVX_ADJUST_BLOCK  };

    BYTE* pData = rRes.pMemPos + 1  + (8 > pWwFib->nVersion ? 0 : 1)
                                    + WW8SprmDataOfs( rRes.nSprmId );

    switch( rRes.nSprmId )
    {
    //
    // PAP attributes
    //
    case  5:
    case 0x2403: rS.Put(SvxAdjustItem(
                            aAdjArr[pData[0]&0x3], EE_PARA_JUST ) );
                 // "&0x3 gegen Tabellenueberlauf bei Stuss-Werten
                 break;
    case 21:
    case 0xA413:
    case 22:
    case 0xA414:
        {
            short nPara = SVBT16ToShort( pData );
            if( nPara < 0 )
                nPara = -nPara;

            SvxULSpaceItem aUL((SvxULSpaceItem&)rS.Get(EE_PARA_ULSPACE, TRUE));

            if( 1 & rRes.nSprmId )      // 21, 0xA413 resp.
                aUL.SetUpper( nPara );
            else                        // 22, 0xA414 resp.
                aUL.SetLower( nPara );
            rS.Put( aUL );
        };
        break;
    //
    // CHAR attributes
    //
    case      85:
    case  0x0835: rS.Put( SvxWeightItem( (*pData & 0x1)?WEIGHT_BOLD:WEIGHT_NORMAL,
                         EE_CHAR_WEIGHT ) );
                 break;
    case      86:
    case  0x0836: rS.Put( SvxPostureItem( (*pData & 0x1)?ITALIC_NORMAL:ITALIC_NONE,
                         EE_CHAR_ITALIC ) );
                 break;
    case      87:
    case  0x0837: rS.Put( SvxCrossedOutItem( (*pData & 0x1)?STRIKEOUT_SINGLE:STRIKEOUT_NONE,
                         EE_CHAR_STRIKEOUT ) );
                 break;
    case      88:
    case  0x0838: rS.Put( SvxContourItem( *pData & 0x1, EE_CHAR_OUTLINE));
                 break;
    case      89:
    case  0x0839: rS.Put( SvxShadowedItem( *pData & 0x1, EE_CHAR_SHADOW));
                 break;
    case      94:
    case  0x2A3E:if(    (1 > *pData)
                    ||
                        (     (4 <  *pData)
                           && (6 != *pData) ) )
                    rS.Put( SvxUnderlineItem(UNDERLINE_NONE,
                                             EE_CHAR_UNDERLINE) );
                else
                {
                    if( 6 == *pData )
                        rS.Put( SvxWeightItem(WEIGHT_BOLD,
                                              EE_CHAR_WEIGHT) );
                    rS.Put( SvxUnderlineItem(UNDERLINE_SINGLE,
                                             EE_CHAR_UNDERLINE) );
                }
                break;
    case      98:
    case  0x2A42: rS.Put( SvxColorItem( Color( GetCol( pData[0] ) ),
                           EE_CHAR_COLOR ) );
                 break;
    case      99:
    case  0x4A43:{
                    USHORT nFSize = SVBT16ToShort( pData );
                                // Font-Groesse in halben Point
                            //  10 = 1440 / ( 72 * 2 )
                    rS.Put( SvxFontHeightItem(
                                (const ULONG) ( (ULONG) nFSize * 10 ),
                                100, EE_CHAR_FONTHEIGHT ) );
                 }
                 break;
    case 93:
    case 0x4A4F:{
                    USHORT nFCode = SVBT16ToShort( pData ); // Font-Nummer
                    FontFamily eFamily;
                    String aName;
                    FontPitch ePitch;
                    CharSet eSrcCharSet;

                    if( GetFontParams( nFCode, eFamily, aName, ePitch,
                                       eSrcCharSet ) )
                    {
                        rS.Put( SvxFontItem( eFamily, aName, aEmptyStr, ePitch,
                                             eSrcCharSet, EE_CHAR_FONTINFO ) );
                    }
                }
                 break;
    }
}

/*
// InsertTxbxCharAttrs() setzt die harten Zeichen-Attribute
void SwWW8ImplReader::InsertTxbxCharAttrs( long nStartCp, long nEndCp, BOOL bONLYnPicLocFc )
{
    nStartCp += nDrawCpO;
    nEndCp   += nDrawCpO;
    WW8PLCFx_Cp_FKP* pChp = pPlcxMan->GetChpPLCF();
    pChp->SeekPos( nStartCp );

    nPicLocFc = LONG_MAX;
    WW8_CP nStart = pChp->Where();
    while( nStart <= nEndCp )
    {
        SfxItemSet aS( pDrawEditEngine->GetEmptyItemSet() );
        WW8PLCFxDesc aDesc;
        pChp->GetSprms( &aDesc );
        (*pChp)++;
        WW8_CP nNextEnd = pChp->Where();
        WW8_CP nEnd     = ( nNextEnd < nEndCp ) ? nNextEnd : nEndCp;

        if( aDesc.nSprmsLen && aDesc.pMemPos )  // Attribut(e) vorhanden?
            GetTxbxCharAttrs( aS, aDesc, bONLYnPicLocFc );

        if( bONLYnPicLocFc ) // Picture-Position-Attribut gefunden?
        {
            if( LONG_MAX != nPicLocFc ) break;
        //  ==================================
        }
        else
            if( aS.Count() && !bONLYnPicLocFc )
                pDrawEditEngine->QuickSetAttribs( aS,
                        GetESelection( nStart - nStartCp, nEnd - nStartCp ) );
        nStart = nNextEnd;
    }
    if( LONG_MAX == nPicLocFc ) nPicLocFc = 0;
}

// GetTxbxParaAttrs() setzt die harten Para-Attribute in den angegebenen Set.
// z.Zt. wird nur Justify beachtet, da einfacher
void SwWW8ImplReader::GetTxbxParaAttrs( SfxItemSet& rS, const WW8PLCFxDesc& rD )
{
    static SvxAdjust aAdjArr[] = { SVX_ADJUST_LEFT,
                     SVX_ADJUST_CENTER, SVX_ADJUST_RIGHT, SVX_ADJUST_BLOCK };

    long  nLen  = rD.nSprmsLen;
    BYTE* pSprm = rD.pMemPos;

    while( nLen >= 2 )
    {
        BYTE   nDelta;
        USHORT nId = WW8GetSprmId( pWwFib->nVersion, pSprm, &nDelta );

        short nSL = WW8GetSprmSizeBrutto( pWwFib->nVersion, pSprm, &nId );

        if( nLen < nSL )
            return;                 // nicht mehr genug Bytes ueber

        BYTE* pData = pSprm + 1 + nDelta + WW8SprmDataOfs( nId );

        switch( nId )
        {
        case  5:
        case 0x2403: rS.Put(SvxAdjustItem(
                                aAdjArr[pData[0]&0x3], EE_PARA_JUST ) );
                     // "&0x3 gegen Tabellenueberlauf bei Stuss-Werten
                     break;
        case 21:
        case 0xA413:
        case 22:
        case 0xA414:
            {
                short nPara = SVBT16ToShort( pData );
                if( nPara < 0 )
                    nPara = -nPara;

                SvxULSpaceItem aUL( (SvxULSpaceItem&)rS.Get(EE_PARA_ULSPACE,TRUE ));

                switch( nId ){                // keine Versuche
                case 21:
                case 0xA413: aUL.SetUpper( nPara ); break;
                case 22:
                case 0xA414: aUL.SetLower( nPara ); break;
                };
                rS.Put( aUL );
            };
            break;
        }
        pSprm += nSL;
        nLen -= nSL;
    }
}
*/
// InsertTxbxStyAttrs() setzt die Style-Attribute in den uebergebenen ItemSet.
// Es werden die SW-Styles genommen, die Import-WW-Styles sind zu diesem
// Zeitpunkt schon destruiert.
// Die SW-Styles werden per Tiefensuche, d.h. mit Parent-Styles nach den
// in aSrcTab angegebenen Attributen untersucht. Diese werden per Clone
// dupliziert, bei den Duplikaten werden die Which-IDs
// gemaess der Tabelle aDstTab umgesetzt, damit die EditEngine sie nicht
// ignoriert.
// Es werden hierbei sowohl Para- wie auch Zeichen-Attribute in den
// ItemSet gestopft.
void SwWW8ImplReader::InsertTxbxStyAttrs( SfxItemSet& rS, USHORT nColl )
{
    static USHORT __READONLY_DATA aSrcTab[] = {
        ITEMID_FONT,
        ITEMID_POSTURE,
        ITEMID_WEIGHT,
        ITEMID_SHADOWED,
        ITEMID_CONTOUR,
        ITEMID_CROSSEDOUT,
        ITEMID_UNDERLINE,
        ITEMID_FONTHEIGHT,
        ITEMID_COLOR,
        ITEMID_WORDLINEMODE,
        ITEMID_ESCAPEMENT,
        ITEMID_AUTOKERN,
        ITEMID_KERNING,
        ITEMID_ADJUST,
        ITEMID_LINESPACING,
        ITEMID_TABSTOP,
        ITEMID_LRSPACE,
        ITEMID_ULSPACE };

    static USHORT __READONLY_DATA aDstTab[] = {
        EE_CHAR_FONTINFO,
        EE_CHAR_ITALIC,
        EE_CHAR_WEIGHT,
        EE_CHAR_SHADOW,
        EE_CHAR_OUTLINE,
        EE_CHAR_STRIKEOUT,
        EE_CHAR_UNDERLINE,
        EE_CHAR_FONTHEIGHT,
        EE_CHAR_COLOR,
        EE_CHAR_WLM,
        EE_CHAR_ESCAPEMENT,
        EE_CHAR_PAIRKERNING,
        EE_CHAR_KERNING,
        EE_PARA_JUST,
        EE_PARA_SBL,
        EE_PARA_TABS,
        EE_PARA_LRSPACE,
        EE_PARA_ULSPACE };

    if( nColl < nColls && pCollA[nColl].pFmt && pCollA[nColl].bColl ){
        const SfxPoolItem* pItem;
        for( USHORT i = 0; i < sizeof(aSrcTab)/sizeof(aSrcTab[0]); i++ ){
            if( SFX_ITEM_SET == pCollA[nColl].pFmt->GetItemState(
                                   aSrcTab[i], TRUE, &pItem ) ){
                SfxPoolItem* pCopy = pItem->Clone();
                pCopy->SetWhich( aDstTab[i] );
                rS.Put( *pCopy );
                delete pCopy;
            }
        }
    }

}
/*
// InsertTxbxParaAttrs() setzt zwischen StartCp und EndCp die Style-
// uns Absatz-Attribute. Dabei werden Style-Attribute als harte Attribute
// gesetzt, da die EditEngine-Styles im SW UI-maessig nicht benutzt
// werden und der Import daher das auch nicht soll.
// Es werden also harte Para-Attrs und *alle* Style-Attrs gesetzt.
void SwWW8ImplReader::InsertTxbxParaAttrs( long nStartCp, long nEndCp )
{
    nStartCp += nDrawCpO;
    nEndCp   += nDrawCpO;
    WW8PLCFx_Cp_FKP* pPap = pPlcxMan->GetPapPLCF();
    pPap->SeekPos( nStartCp );

    WW8_CP nStart = pPap->Where();
    while( nStart <= nEndCp )
    {
        SfxItemSet aS( pDrawEditEngine->GetEmptyItemSet() );
        WW8PLCFxDesc aDesc;
        pPap->GetSprms( &aDesc );
        (*pPap)++;
        WW8_CP nNextEnd = pPap->Where();
        WW8_CP nEnd = ( nNextEnd < nEndCp ) ? nNextEnd : nEndCp;

        InsertTxbxStyAttrs( aS, pPap->GetIstd() );  // Style-Kram rein

        if( aDesc.nSprmsLen && aDesc.pMemPos )  // Attribut(e) vorhanden
            GetTxbxParaAttrs( aS, aDesc );

        if( aS.Count() )
            pDrawEditEngine->QuickSetAttribs( aS,
                GetESelection( nStart - nStartCp, nEnd - nStartCp ) );
        nStart = nNextEnd;
    }
}
*/
// InsertTxbxAttrs() setzt zwischen StartCp und EndCp die Attribute.
// Dabei werden Style-Attribute als harte Attribute, Absatz- und Zeichen-
// attribute gesetzt.
void SwWW8ImplReader::InsertTxbxAttrs( long nStartCp,
                                       long nEndCp,
                                       BOOL bONLYnPicLocFc )
{
    WW8PLCFManResult aRes;
    SfxItemSet aS( pDrawEditEngine->GetEmptyItemSet() );

    nStartCp += nDrawCpO;
    nEndCp   += nDrawCpO;
    WW8ReaderSave aSave(this,nStartCp);


    WW8_CP nStart = pPlcxMan->Where();
    WW8_CP nNext;
    WW8_CP nEnd;
    USHORT nIstd     = pPlcxMan->GetPapPLCF()->GetIstd();
    USHORT nNextIstd = USHRT_MAX;

    // store the *first* Style's SPRMs
    InsertTxbxStyAttrs( aS, nIstd );

    while( nStart <= nEndCp )
    {
        // get position of next SPRM
        if(    pPlcxMan->Get( &aRes )
            && aRes.pMemPos && aRes.nSprmId )
        {
            if( bONLYnPicLocFc )
            {
                if(    (    68 == aRes.nSprmId)
                    || (0x6A03 == aRes.nSprmId) )
                {
                    Read_PicLoc( aRes.nSprmId,
                                 aRes.pMemPos
                                 + 1
                                 + (8 > pWwFib->nVersion ? 0 : 1)
                                 + WW8SprmDataOfs( aRes.nSprmId ),
                                 4 );
                    // Ok, that's it.  Now let's get out of here!
                    break;
                }
            }
            else if( aRes.nSprmId && (    (    256 >  aRes.nSprmId )
                                       || ( 0x0800 <= aRes.nSprmId ) ) )
            {
                GetTxbxPapAndCharAttrs( aS, aRes );
            }
        }

        (*pPlcxMan)++;
        nNext = pPlcxMan->Where();

        if( (nNext != nStart) && !bONLYnPicLocFc )
        {
            nNextIstd = pPlcxMan->GetPapPLCF()->GetIstd();
            if( nNextIstd != nIstd )
            {
                nIstd = nNextIstd;
                // store the *next* Style's SPRMs
                InsertTxbxStyAttrs( aS, nIstd );
            }

            nEnd = ( nNext < nEndCp ) ? nNext : nEndCp;
            // put the attrs into the doc
            if( aS.Count() )
                pDrawEditEngine->QuickSetAttribs( aS,
                    GetESelection( nStart - nStartCp, nEnd - nStartCp ) );
        }
        nStart = nNext;
    }

    aSave.Restore(this);
}

BOOL SwWW8ImplReader::GetTxbxTextSttEndCp( long& rStartCp, long& rEndCp,
                                            USHORT nTxBxS, USHORT nSequence )
{
    // rasch den TextBox-PLCF greifen
    WW8PLCFspecial* pT = pPlcxMan->GetTxbx();
    if( !pT )
    {
        ASSERT( !this, "+Wo ist der Grafik-Text (1) ?" );
        return FALSE;
    }

    // ggfs. zuerst die richtige TextBox-Story finden
    BOOL bCheckTextBoxStory = ( nTxBxS && pT->GetIMax() >= nTxBxS );
    if(  bCheckTextBoxStory )
        pT->SetIdx( nTxBxS-1 );

    // dann Start und Ende ermitteln
    void* pT0;
    if( !pT->Get( rStartCp, pT0 ) )
    {
        ASSERT( !this, "+Wo ist der Grafik-Text (2) ?" );
        return FALSE;
    }

    if( bCheckTextBoxStory )
    {
        BOOL bReusable = (0 != SVBT16ToShort( ((WW8_TXBXS*)pT0)->fReusable ));
        while( bReusable )
        {
            (*pT)++;
            if( !pT->Get( rStartCp, pT0 ) )
            {
                ASSERT( !this, "+Wo ist der Grafik-Text (2-a) ?" );
                return FALSE;
            }
            bReusable = (0 != SVBT16ToShort( ((WW8_TXBXS*)pT0)->fReusable ));
        }
    }
    (*pT)++;
    if( !pT->Get( rEndCp, pT0 ) )
    {
        ASSERT( !this, "+Wo ist der Grafik-Text (3) ?" );
        return FALSE;
    }

    // jetzt ggfs. die passende Page in der Break-Table finden
    if( bCheckTextBoxStory )
    {
        // Sonderfall: gesamte(!) Kette soll ermittelt werden,
        //             dann sind wir hier schon fertig!
        if( USHRT_MAX > nSequence )
        {
            long nMinStartCp = rStartCp;
            long nMaxEndCp   = rEndCp;
            // rasch den TextBox-Break-Deskriptor-PLCF greifen
            pT = pPlcxMan->GetTxbxBkd();
            if (!pT) //It can occur on occasion, Caolan
                return FALSE;

            // den ersten Eintrag fuer diese TextBox-Story finden
            if( !pT->SeekPos( rStartCp ) )
            {
                ASSERT( !this, "+Wo ist der Grafik-Text (4) ?" );
                return FALSE;
            }
            // ggfs. entsprechende Anzahl Eintraege weitergehen
            for(USHORT iSequence = 0; iSequence < nSequence; iSequence++) (*pT)++;
            // dann die tatsaechlichen Start und Ende ermitteln
            if(    (!pT->Get( rStartCp, pT0 ))
                || ( nMinStartCp > rStartCp  ) )
            {
                ASSERT( !this, "+Wo ist der Grafik-Text (5) ?" );
                return FALSE;
            }
            if( rStartCp >= nMaxEndCp )
                rEndCp = rStartCp;  // kein Error: leerer String!
            else
            {
                (*pT)++;
                if(    (!pT->Get( rEndCp, pT0 ))
                    || ( nMaxEndCp < rEndCp-1  ) )
                {
                    ASSERT( !this, "+Wo ist der Grafik-Text (6) ?" );
                    return FALSE;
                }
                rEndCp -= 1;
            }
        }
        else
            rEndCp -= 1;
    }
    else
        rEndCp -= 2;
    return TRUE;
}

// TxbxText() holt aus WW-File den Text und gibt diesen und den Anfangs- und
// den um -2 (bzw. -1 bei Ver8) korrigierten End-Cp zurueck


BOOL SwWW8ImplReader::GetTxbxText( String& rString,
                                   long nStartCp, long nEndCp )
{
    nDrawTxbx++;
    BOOL bOk = FALSE;
    if( nStartCp > nEndCp )
    {
        ASSERT( !this, "+Wo ist der Grafik-Text (7) ?" );
    }
    else
    if( nStartCp == nEndCp )
        rString.Erase();      // leerer String: durchaus denkbar!
    else
    {
        // den Text einlesen: kann sich ueber mehrere Pieces erstrecken!!!
        USHORT nLen = pSBase->WW8ReadString( *pStrm, rString,
                                            nStartCp + nDrawCpO,
                                            nEndCp   - nStartCp,
                                            eTextCharSet );
        if( !nLen )
        {
            ASSERT( !this, "+Wo ist der Grafik-Text (8) ?" );
        }
        else
        {
            bOk = TRUE;
            if( 0x0d == rString.GetChar(nLen - 1) )
                rString.Erase(nLen - 1);
        }
    }
    return bOk;
}


// InsertTxbxText() fuegt fuer TextBoxen und CaptionBoxen den Text
// und die Attribute ein
SwFrmFmt* SwWW8ImplReader::InsertTxbxText(SdrTextObj* pTextObj,
                                     Size*       pObjSiz,
                                     USHORT      nTxBxS,
                                     USHORT      nSequence,
                                     long        nPosCp,
                                     SwFrmFmt*   pOldFlyFmt,
                                     BOOL        bMakeSdrGrafObj,
                                     BOOL&       rbEraseTextObj,
                                     BOOL*       pbTestTxbxContainsText,
                                     long*       pnStartCp,
                                     long*       pnEndCp,
                                     SvxMSDffImportRec* pRecord)
{
    SwFrmFmt* pFlyFmt = 0;
    ULONG nOld = pStrm->Tell();

    rbEraseTextObj = FALSE;

    String aString;
    long nStartCp, nEndCp, nNewStartCp;
    BOOL bTextWasRead = GetTxbxTextSttEndCp( nStartCp, nEndCp,
                                             nTxBxS, nSequence ) &&
                        GetTxbxText( aString, nStartCp, nEndCp );
    nNewStartCp = nStartCp;

    if( !pbTestTxbxContainsText )
    {
        if( bTextWasRead )
            while( STRING_NOTFOUND != aString.SearchAndReplace( 0xb, ' ' ))
                ;   // HardNewline kann EE noch nicht in der EE-Core

        if( !pDrawEditEngine )
#if SUPD>601
            pDrawEditEngine = new EditEngine(0);
#else
            pDrawEditEngine = new EditEngine;
#endif
        if( pObjSiz )
            pDrawEditEngine->SetPaperSize( *pObjSiz );
    }

    if( bTextWasRead )
    {
        for(USHORT i=0; i < aString.Len(); i++)
        {
            if( 0x13 == aString.GetChar( i ) )
            {
                do
                {
                    aString.Erase( i, 1 );
                    nNewStartCp++;
                }
                while(              aString.Len()
                        && (   i  < aString.Len())
                        && (0x14 != aString.GetChar( i ) )
                        && (0x15 != aString.GetChar( i ) ) );
                if( aString.Len() )
                {
                    if( 0x14 == aString.GetChar( i ) )
                    {
                        aString.Erase( i, 1 );
                        nNewStartCp++;
                        do
                        {
                            i++;
                        }
                        while(              aString.Len()
                                && (   i  < aString.Len())
                                && (0x15 != aString.GetChar( i ) ) );
                        if( i < aString.Len() )
                            aString.Erase( i, 1 );
                    }
                    else if( 0x15 == aString.GetChar( i ) )
                    {
                        aString.Erase( i, 1 );
                    }
                }
            }
        }
        if (1 == aString.Len())
        {
            BOOL bDone = TRUE;
            switch( aString.GetChar(0) )
            {
                case 0x1:if( !pbTestTxbxContainsText )
                        {
                            WW8ReaderSave aSave(this,nNewStartCp + nDrawCpO -1);
                            BOOL bOldEmbeddObj = bEmbeddObj;
                            //bEmbedd Ordinarily would have been set by field
                            //parse, but this is impossible here so...
                            bEmbeddObj = TRUE;

                            // 1st look for OLE- or Graph-Indicator Sprms
                            WW8PLCFx_Cp_FKP* pChp = pPlcxMan->GetChpPLCF();
                            WW8PLCFxDesc aDesc;
                            pChp->GetSprms( &aDesc );
                            WW8SprmIter aSprmIter( aDesc.pMemPos, aDesc.nSprmsLen,
                                                   GetFib().nVersion );

                            //BOOL bRead_Obj    = FALSE;
                            //BOOL bRead_PicLoc = FALSE;
                            BYTE* pParams = aSprmIter.GetAktParams();
                            for( int nLoop = 0; nLoop < 2; ++nLoop )
                            {
                                while(     aSprmIter.GetSprms()
                                        && (0 != (pParams = aSprmIter.GetAktParams())) )
                                {
                                    USHORT nAktId = aSprmIter.GetAktId();
                                    switch( nAktId )
                                    {
                                        case     75:
                                        case    118:
                                        case 0x080A:
                                        case 0x0856:
                                            //if( !bRead_Obj )
                                            //{
                                                Read_Obj(nAktId, pParams, 1);
                                            //  bRead_Obj = TRUE;
                                            //}
                                            break;
                                        case     68:  // Read_Pic()
                                        case 0x6A03:
                                        case 0x680E:
                                            //if( !bRead_PicLoc )
                                            //{
                                                Read_PicLoc(nAktId, pParams, 1);
                                            //  bRead_PicLoc = TRUE;
                                            //}
                                            break;
                                    }
                                    aSprmIter++;
                                }

                                //if( bRead_Obj || bRead_PicLoc ) break;
                                if( !nLoop )
                                {
                                    pChp->GetPCDSprms(  aDesc );
                                    aSprmIter.SetSprms( aDesc.pMemPos,
                                        aDesc.nSprmsLen );
                                }
                                //if( bRead_Obj || bRead_PicLoc ) break;
                            }
                            aSave.Restore(this);
                            bEmbeddObj=bOldEmbeddObj;

                            // then import either an OLE of a Graphic
                            if( bObj )
                                {
                                pFlyFmt = ImportOle();
                                bObj=FALSE;
                                }
                            else
                            {
                                InsertTxbxAttrs(nNewStartCp,
                                                nNewStartCp+1,
                                                TRUE);
                                //InsertTxbxCharAttrs(nNewStartCp, nNewStartCp+1, TRUE);
                                pFlyFmt = ImportGraf(
                                            bMakeSdrGrafObj ? pTextObj : 0,
                                            pOldFlyFmt,
                                            pTextObj
                                          ? (nDrawHell == pTextObj->GetLayer())
                                          : FALSE );
                            }
                        }
                        break;
                case 0x8:if( !pbTestTxbxContainsText )
                        {
                            if( !bObj )
                                 pFlyFmt = Read_GrafLayer( nPosCp );
                        }
                        break;
                default:bDone = FALSE;
                        break;
            }
            if( bDone )
            {
                if( pFlyFmt )
                {
                    if( pRecord )
                    {
                        SfxItemSet aFlySet( rDoc.GetAttrPool(), RES_FRMATR_BEGIN, RES_FRMATR_END-1 );

                        Rectangle aInnerDist(   pRecord->nDxTextLeft,
                                                pRecord->nDyTextTop,
                                                pRecord->nDxTextRight,
                                                pRecord->nDyTextBottom  );
                        MatchSdrItemsIntoFlySet( pTextObj,
                                                 aFlySet,
                                                 pRecord->eLineStyle,
                                                 aInnerDist,
                                                 !pRecord->bLastBoxInChain );

                        pFlyFmt->SetAttr( aFlySet );


                        MatchWrapDistancesIntoFlyFmt( pRecord, pFlyFmt );
                    }

                }
                aString.Erase();
                rbEraseTextObj = (0 != pFlyFmt);
            }
        }

    }

    if( pbTestTxbxContainsText )
    {
        if( pnStartCp ) *pnStartCp = nStartCp;
        if( pnEndCp   ) *pnEndCp   = nEndCp;
        *pbTestTxbxContainsText    =    bTextWasRead
                                     && ! rbEraseTextObj;
    }
    else if( !rbEraseTextObj )
    {
        if( bTextWasRead )
        {
            pDrawEditEngine->SetText( aString );
            InsertTxbxAttrs( nStartCp, nEndCp, FALSE );
    //      pDrawEditEngine->QuickFormatDoc();  // nach MT nicht noetig
        }

#if SUPD>600
#if SUPD>601
        OutlinerParaObject* pOp = new OutlinerParaObject( *pDrawEditEngine->CreateTextObject() );
#else
        OutlinerParaObject* pOp = new OutlinerParaObject( *pDrawEditEngine );
#endif
        pTextObj->NbcSetOutlinerParaObject( pOp );
#endif

        // Fuer die naechste Textbox noch die alten Absatz-Attribute
        // und Styles entfernen, sonst startet die naechste Box
        // mit falschen Attributen.
        // Vorgehen: Text loeschen = auf 1 Absatz reduzieren
        // und an diesem Absatz die Absatzattribute und Styles loeschen
        // (Empfehlung JOE)
        pDrawEditEngine->SetText( aEmptyStr );
        pDrawEditEngine->SetParaAttribs( 0, pDrawEditEngine->GetEmptyItemSet() );
#if SUPD>600
#if SUPD>601
        pDrawEditEngine->SetStyleSheet(  0, 0 );
#else
        pDrawEditEngine->SetStyleSheet(  0, aEmptyStr, SFX_STYLE_FAMILY_PARA );
#endif
#endif
    }

    pStrm->Seek( nOld );
    return pFlyFmt;
}

BOOL SwWW8ImplReader::TxbxChainContainsRealText( USHORT nTxBxS,
                                                 long&  rStartCp,
                                                 long&  rEndCp )
{
    BOOL bErase, bContainsText;
    InsertTxbxText( 0,0,nTxBxS,USHRT_MAX,0,0,0, bErase,
                                                &bContainsText,
                                                &rStartCp,
                                                &rEndCp );
    return bContainsText;
}


// TextBoxes only for Ver67 !!
void SwWW8ImplReader::ReadTxtBox( WW8_DPHEAD* pHd, WW8_DO* pDo )
{
    BOOL bDummy;
    WW8_DP_TXTBOX aTxtB;

    if( !ReadGrafStart( (void*)&aTxtB, sizeof( aTxtB ), pHd, pDo ) )
        return;

    Point aP0( (INT16)SVBT16ToShort( pHd->xa ) + nDrawXOfs2,
               (INT16)SVBT16ToShort( pHd->ya ) + nDrawYOfs2 );
    Point aP1( aP0 );
    aP1.X() += (INT16)SVBT16ToShort( pHd->dxa );
    aP1.Y() += (INT16)SVBT16ToShort( pHd->dya );

    SdrTextObj* pObj = new SdrRectObj( OBJ_TEXT, Rectangle( aP0, aP1 ) );
    Size aSize( (INT16)SVBT16ToShort( pHd->dxa ) ,
                                 (INT16)SVBT16ToShort( pHd->dya ) );

    InsertTxbxText(pObj, &aSize, 0, 0, 0, 0, FALSE, bDummy );

    InsertObj( pObj, SVBT16ToShort( pDo->dhgt ) );

    SfxAllItemSet aSet( pDrawModel->GetItemPool() );

    SetStdAttr( aSet, aTxtB.aLnt, aTxtB.aShd );
    SetFill( aSet, aTxtB.aFill );

    aSet.Put(SdrTextFitToSizeTypeItem( SDRTEXTFIT_NONE ));
    aSet.Put( SdrTextAutoGrowWidthItem(  FALSE ) );
    aSet.Put( SdrTextAutoGrowHeightItem( FALSE ) );
    aSet.Put( SdrTextLeftDistItem(  MIN_BORDER_DIST*2 ) );
    aSet.Put( SdrTextRightDistItem( MIN_BORDER_DIST*2 ) );
    aSet.Put( SdrTextUpperDistItem( MIN_BORDER_DIST ) );
    aSet.Put( SdrTextLowerDistItem( MIN_BORDER_DIST ) );

    pObj->SetAttributes( aSet, FALSE );
}


void SwWW8ImplReader::ReadCaptionBox( WW8_DPHEAD* pHd, WW8_DO* pDo )
{
    static SdrCaptionType aCaptA[] = { SDRCAPT_TYPE1, SDRCAPT_TYPE2,
                                       SDRCAPT_TYPE3, SDRCAPT_TYPE4 };

    WW8_DP_CALLOUT_TXTBOX aCallB;

    if( !ReadGrafStart( (void*)&aCallB, sizeof( aCallB ), pHd, pDo ) )
        return;

    UINT16 nCount = SVBT16ToShort( aCallB.dpPolyLine.aBits1 ) >> 1 & 0x7fff;
    SVBT16 *pP = new SVBT16[nCount * 2];
    pStrm->Read( pP, nCount * 4 );      // Punkte einlesen
    BYTE nTyp = (BYTE)nCount - 1;
    if( nTyp == 1 && SVBT16ToShort( pP[0] ) == SVBT16ToShort( pP[2] ) )
        nTyp = 0;

    Point aP0( (INT16)SVBT16ToShort( pHd->xa ) +
               (INT16)SVBT16ToShort( aCallB.dpheadTxbx.xa ) + nDrawXOfs2,
               (INT16)SVBT16ToShort( pHd->ya )
               + (INT16)SVBT16ToShort( aCallB.dpheadTxbx.ya ) + nDrawYOfs2 );
    Point aP1( aP0 );
    aP1.X() += (INT16)SVBT16ToShort( aCallB.dpheadTxbx.dxa );
    aP1.Y() += (INT16)SVBT16ToShort( aCallB.dpheadTxbx.dya );
    Point aP2( (INT16)SVBT16ToShort( pHd->xa )
                + (INT16)SVBT16ToShort( aCallB.dpheadPolyLine.xa )
                + nDrawXOfs2 + (INT16)SVBT16ToShort( pP[0] ),
               (INT16)SVBT16ToShort( pHd->ya )
               + (INT16)SVBT16ToShort( aCallB.dpheadPolyLine.ya )
               + nDrawYOfs2 + (INT16)SVBT16ToShort( pP[1] ) );
    delete[]( pP );

    SdrCaptionObj* pObj = new SdrCaptionObj( Rectangle( aP0, aP1 ), aP2 );
    Size aSize( (INT16)SVBT16ToShort( aCallB.dpheadTxbx.dxa ),
                           (INT16)SVBT16ToShort(  aCallB.dpheadTxbx.dya ) );
    BOOL bEraseThisObject;

    InsertTxbxText(pObj, &aSize, 0, 0, 0, 0, FALSE, bEraseThisObject );

    InsertObj( pObj, SVBT16ToShort( pDo->dhgt ) );

    SfxAllItemSet aSet( pDrawModel->GetItemPool() );

    if( SVBT16ToShort( aCallB.dptxbx.aLnt.lnps ) != 5 ) // Umrandung sichtbar ?
        SetStdAttr( aSet, aCallB.dptxbx.aLnt, aCallB.dptxbx.aShd );
    else                                                // nein -> Nimm Linie
        SetStdAttr( aSet, aCallB.dpPolyLine.aLnt, aCallB.dptxbx.aShd );
    SetFill( aSet, aCallB.dptxbx.aFill );
    aSet.Put( SdrCaptionTypeItem( aCaptA[nTyp] ) );

    pObj->SetAttributes( aSet, FALSE );
}


void SwWW8ImplReader::ReadGroup( WW8_DPHEAD* pHd, WW8_DO* pDo )
{
    INT16 nGrouped;

    if( !ReadGrafStart( (void*)&nGrouped, sizeof( nGrouped ), pHd, pDo ) )
        return;

#ifdef __BIGENDIAN
    nGrouped = (INT16)SWAPSHORT( nGrouped );
#endif

    nDrawXOfs += (INT16)SVBT16ToShort( pHd->xa );
    nDrawYOfs += (INT16)SVBT16ToShort( pHd->ya );

    SdrObject* pObj = new SdrObjGroup;

    InsertObj( pObj, SVBT16ToShort( pDo->dhgt ) );

    SdrObjList* pOldGroup = pDrawGroup;
    pDrawGroup = pObj->GetSubList();

    short nLeft = (INT16)SVBT16ToShort( pHd->cb ) - sizeof( WW8_DPHEAD );
    for( int i = 0; i < nGrouped; i++ )
        ReadGrafPrimitive( nLeft, pDo );

    pDrawGroup = pOldGroup;
    nDrawXOfs -= (INT16)SVBT16ToShort( pHd->xa );
    nDrawYOfs -= (INT16)SVBT16ToShort( pHd->ya );
}

void SwWW8ImplReader::ReadGrafPrimitive( short& rLeft, WW8_DO* pDo )
{
    WW8_DPHEAD aHd;                         // Lese Draw-Primitive-Header
    pStrm->Read( &aHd, sizeof( WW8_DPHEAD ) );

    if( rLeft >= (INT16)SVBT16ToShort( aHd.cb ) )   // Vorsichtsmassmahme
    {
        switch( (INT16)SVBT16ToShort( aHd.dpk ) & 0xff )
        {
        case 0:  ReadGroup( &aHd, pDo );
                 break;
        case 1:  ReadLine( &aHd, pDo );
                 break;
        case 2:  ReadTxtBox( &aHd, pDo );
                 break;
        case 3:  ReadRect( &aHd, pDo );
                 break;
        case 4:  ReadElipse( &aHd, pDo );
                 break;
        case 5:  ReadArc( &aHd, pDo );
                 break;
        case 6:  ReadPolyLine( &aHd, pDo );
                 break;
        case 7:  ReadCaptionBox( &aHd, pDo );
                 break;
        default:                            // unbekannt
                 pStrm->SeekRel( (INT16)SVBT16ToShort( aHd.cb )
                                 - sizeof( WW8_DPHEAD )  );
                 break;
        }
    }
    else
    {
        ASSERT( !this, "+Grafik-Overlap" );
    }
    rLeft -= (INT16)SVBT16ToShort( aHd.cb );
}

void SwWW8ImplReader::ReadGrafLayer1( WW8PLCFspecial* pPF, long nGrafAnchorCp )
{
    pPF->SeekPos( nGrafAnchorCp );
    long nStartFc;
    void* pF0;
    if( !pPF->Get( nStartFc, pF0 ) )
    {
        ASSERT( !this, "+Wo ist die Grafik (2) ?" );
        return;
    }
    WW8_FDOA* pF = (WW8_FDOA*)pF0;
    if( !SVBT32ToLong( pF->fc ) )
    {
        ASSERT( !this, "+Wo ist die Grafik (3) ?" );
        return;
    }
    WW8_DO aDo;
    pStrm->Seek( SVBT32ToLong( pF->fc ) );                  // Lese Draw-Header
    pStrm->Read( &aDo, sizeof( WW8_DO ) );

    short nLeft = SVBT16ToShort( aDo.cb ) - sizeof( WW8_DO );
    while( nLeft > sizeof( WW8_DPHEAD ) )
    {
        ReadGrafPrimitive( nLeft, &aDo );
    }
}

BOOL SwWW8ImplReader::MatchSdrBoxIntoFlyBoxItem(const Color& rLineColor,
                                                MSO_LineStyle eLineStyle,
                                                USHORT      nLineWidth,
                                                SvxBoxItem& rBox )
{   // Deklarationen gemaess BOXITEM.HXX
    WW8_DECL_LINETAB_ARRAY

    BOOL   bRet = FALSE;
    USHORT nIdx = USHRT_MAX;

    if( nLineWidth )
    {
        /*
            Beachte: im Gegensatz zu den Winword-ueblichen Tabellen- und
            Rahmen-Randbreiten-Angaben, bei denen jeweils aus der Staerke
            *einer* Linie die Gesamt-Randbreite zu errechnen ist,
            liegen die aus dem ESCHER stammenden Daten bereits als
            Gesamt-Breite [twips] vor!

            Der Winword default ist 15 tw. Wir nehmen hierfuer unsere 20 tw Linie.
            ( 0.75 pt uns 1.0 pt sehen sich auf dem Ausdruck naemlich
              aehnlicher als etwas 0.75 pt und unsere 0.05 pt Haarlinie. )
            Die Haarlinie setzen wir nur bei Winword-Staerken bis zu
            maximal 0.5 pt ein.
        */
        switch( eLineStyle )
        {
        // zuerst die Einzel-Linien
        case mso_lineSimple:     if( nLineWidth < 11) nIdx =            0;//   1 Twip bei uns
                            else if( nLineWidth < 46) nIdx =            1;//  20 Twips
                            else if( nLineWidth < 66) nIdx =            2;//  50
                            else if( nLineWidth < 91) nIdx =            3;//  80
                            else if( nLineWidth <126) nIdx =            4;// 100
                            // Pfusch: fuer die ganz dicken Linien muessen
                            //         wir doppelte Linien malen, weil unsere
                            //               Einfach-Linie nicht dicker als 5 Punkt wird
                            else if( nLineWidth <166) nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+2;// 150
                            else                      nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+5;// 180
                            break;
        // dann die Doppel-Linien, fuer die wir feine Entsprechungen haben :-)))
        case mso_lineDouble:     if( nLineWidth <  46) nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 0;//  22 Twips bei uns
                            else if( nLineWidth < 106) nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 1;//  60
                            else                       nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 2;// 150
                            break;
        case mso_lineThickThin:  if( nLineWidth <  87) nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 8;//  71 Twips bei uns
                            else if( nLineWidth < 117) nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 9;// 101
                            else if( nLineWidth < 166) nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+10;// 131
                            else                       nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 5;// 180
                            break;
        case mso_lineThinThick:  if( nLineWidth < 137) nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 4;//  90 Twips bei uns
                            else                       nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 6;// 180
                            break;
        // zu guter Letzt die Dreifach-Linien, an deren Stelle wir eine Doppel-Linie setzen
        case mso_lineTriple:     if( nLineWidth <  46) nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 0;//  22 Twips bei uns
                            else if( nLineWidth < 106) nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 1;//  60
                            else if( nLineWidth < 166) nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 2;// 150
                            else                       nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 5;// 180
                            break;
        // no line style is set
        case (MSO_LineStyle)USHRT_MAX:
                            break;
        // erroneously not implemented line style is set
        default: ASSERT( !this, "eLineStyle is not (yet) implemented!" );
        }
    }

    if( USHRT_MAX != nIdx )
    {
        SvxBorderLine aLine;
        aLine.SetColor( rLineColor );

        const WW8_BordersSO& rBorders = nLineTabVer8[ nIdx ];
        aLine.SetOutWidth( rBorders.Out  );
        aLine.SetInWidth ( rBorders.In   );
        aLine.SetDistance( rBorders.Dist );

        for(USHORT nLine = 0; nLine < 4; ++nLine)
            rBox.SetLine(new SvxBorderLine( aLine ), nLine);

        bRet = TRUE;
    }
    return bRet;
}


#define WW8ITEMVALUE(ItemSet,Id,Cast)  ((const Cast&)(ItemSet).Get(Id)).GetValue()

void SwWW8ImplReader::MatchSdrItemsIntoFlySet( SdrObject* pSdrObj,
                                               SfxItemSet& rFlySet,
                                               MSO_LineStyle eLineStyle,
                                               Rectangle& rInnerDist,
                                               BOOL bFixSize )
{   /*
        am Rahmen zu setzende Frame-Attribute
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        SwFmtFrmSize            falls noch nicht gesetzt, hier setzen
        SvxLRSpaceItem          hier setzen
        SvxULSpaceItem          hier setzen
        SvxOpaqueItem           (Derzeit bei Rahmen nicht moeglich! khz 10.2.1999)
        SwFmtSurround           bereits gesetzt
        SwFmtVertOrient         bereits gesetzt
        SwFmtHoriOrient         bereits gesetzt
        SwFmtAnchor             bereits gesetzt
        SvxBoxItem              hier setzen
        SvxBrushItem            hier setzen
        SvxShadowItem           hier setzen
    */

    // 1. GrafikObjekt des Docs?
    if( !pDrawModel )
        GrafikCtor();


    // im Sdr-Objekt eingestellten Attribute greifen
    SfxItemSet aOldSet(pDrawModel->GetItemPool());
    pSdrObj->TakeAttributes( aOldSet, FALSE, FALSE );

    BOOL bIsAAttrObj = pSdrObj->ISA(SdrAttrObj);
    const XLineAttrSetItem* pLineAttrSetItem
        = bIsAAttrObj ? ((SdrAttrObj*)pSdrObj)->GetLineAttrSetItem() : 0;
    const XFillAttrSetItem* pFillAttrSetItem
        = bIsAAttrObj ? ((SdrAttrObj*)pSdrObj)->GetFillAttrSetItem() : 0;



    // einige Items koennen direkt so uebernommen werden
    const USHORT nDirectMatch = 2;
    static RES_FRMATR __READONLY_DATA aDirectMatch[ nDirectMatch ] =
    {
        RES_LR_SPACE,   // Aussenabstand links/rechts: SvxLRSpaceItem
        RES_UL_SPACE    // Aussenabstand Oben/unten:   SvxULSpaceItem
    };
    const SfxPoolItem* pPoolItem;
    for(USHORT nItem = 0; nItem < nDirectMatch; ++nItem)
        if( SFX_ITEM_SET == aOldSet.GetItemState( aDirectMatch[ nItem ],
                                                  FALSE,
                                                  &pPoolItem) )
        {
            rFlySet.Put( *pPoolItem );
        }


    // jetzt die Umrandung berechnen und die Box bauen:
    //       Das Mass wird fuer die Rahmen-GROESSE benoetigt!
    SvxBoxItem aBox;
    // dashed oder solid wird zu solid
    USHORT nLineWidth = 0;

    // check if LineStyle is *really* set!
    const SfxPoolItem* pItem;

    if( pLineAttrSetItem )
    {
        SfxItemState eState = pLineAttrSetItem->GetItemSet().GetItemState(
                                                              XATTR_LINESTYLE,
                                                              TRUE, &pItem );
        if( eState == SFX_ITEM_SET )
        {
            // Now, that we know there is a line style we will make use the
            // parameter given to us when calling the method...  :-)
            /*
            const XLineStyle eLineStyle =
                                ((const XLineStyleItem*)pItem)->GetValue();
            if( XLINE_NONE != eLineStyle )

            {
            */
                const Color aLineColor
                                = WW8ITEMVALUE( pLineAttrSetItem->GetItemSet(),
                                                XATTR_LINECOLOR,
                                                XLineColorItem );

                nLineWidth
                    = (USHORT)(WW8ITEMVALUE( pLineAttrSetItem->GetItemSet(),
                                             XATTR_LINEWIDTH, XLineWidthItem ));

                if( !nLineWidth )
                    nLineWidth = 15; // WW-default: 0.75 pt

                MatchSdrBoxIntoFlyBoxItem( aLineColor, eLineStyle, nLineWidth, aBox);
            //}
        }
    }

    // set distances from box's border to text contained within the box
    if( 0 < rInnerDist.Left() )
        aBox.SetDistance( (USHORT)rInnerDist.Left(), BOX_LINE_LEFT );
    if( 0 < rInnerDist.Top() )
        aBox.SetDistance( (USHORT)rInnerDist.Top(), BOX_LINE_TOP );
    if( 0 < rInnerDist.Right() )
        aBox.SetDistance( (USHORT)rInnerDist.Right(), BOX_LINE_RIGHT );
    if( 0 < rInnerDist.Bottom() )
        aBox.SetDistance( (USHORT)rInnerDist.Bottom(), BOX_LINE_BOTTOM );

    // Groesse: SwFmtFrmSize
    if( SFX_ITEM_SET != rFlySet.GetItemState(RES_FRM_SIZE, FALSE) )
    {
        const Rectangle& rSnapRect = pSdrObj->GetSnapRect();
        // ggfs. Breite und Position des Rahmens anpassen:
        // Der beschreibbare Innenraum soll trotz breitem Rand
        // gleich gross bleiben.
        long nWidth  = rSnapRect.GetWidth()  + 2*nLineWidth;
        long nHeight = rSnapRect.GetHeight() + 2*nLineWidth;
        rFlySet.Put( SwFmtFrmSize(bFixSize ? ATT_FIX_SIZE : ATT_MIN_SIZE,
                        rSnapRect.GetWidth()  + 2*nLineWidth,
                        rSnapRect.GetHeight() + 2*nLineWidth) );
    }

    /*
        Traurig: das SvxOpaqueItem macht bei Rahmen etwas ganz anderes,
        als in /svx/inc/opaqitem.hxx angegeben:

        Statt den Rahmen (un)durchsichtig zu machen, bewirkt es, dass er
        einfach bloss in einen anderen Layer (Hell/Heaven) gestellt wird.
        Fuer unsere Zwecke ist es also nicht zu gebrauchen.

        Da auch das Transparent-Flag am SvxBrushItem wirkungslos ist,
        koennen wir das WinWord-Attribut "Halbtransparent" leider nicht
        umsetzen.

        :-((
    */
    // Durchsichtigkeit: SvxOpaqueItem

    //  INT16 nFillTransparence
    //      = WW8ITEMVALUE(aOldSet, XATTR_FILLTRANSPARENCE, XFillTransparenceItem);
    //  if( 0x032 <= nFillTransparence )
    //      rFlySet.Put( SvxOpaqueItem(RES_OPAQUE, FALSE) );
    //

    // jetzt die Umrandung setzen
    rFlySet.Put( aBox );

    // Schattenwurf der Box: SvxShadowItem
    if( WW8ITEMVALUE(aOldSet, SDRATTR_SHADOW, SdrShadowItem) )
    {
        SvxShadowItem aShadow;

        const Color aShdColor = WW8ITEMVALUE(aOldSet, SDRATTR_SHADOWCOLOR,
                                                        SdrShadowColorItem);

        const INT32 nShdDistX = WW8ITEMVALUE(aOldSet, SDRATTR_SHADOWXDIST,
                                                        SdrShadowXDistItem);
        const INT32 nShdDistY = WW8ITEMVALUE(aOldSet, SDRATTR_SHADOWYDIST,
                                                        SdrShadowYDistItem);

        const USHORT nShdTrans= WW8ITEMVALUE(aOldSet, SDRATTR_SHADOWTRANSPARENCE,
                                                        SdrShadowTransparenceItem);
        // diese gibt es im Writer nicht  :-(
        // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        //
        // SfxVoidItem( SDRATTR_SHADOW3D    )
        // SfxVoidItem( SDRATTR_SHADOWPERSP )

        aShadow.SetColor( Color( aShdColor ) );

        aShadow.SetWidth( (Abs( nShdDistX ) + Abs( nShdDistY )) / 2 );

        SvxShadowLocation eShdPosi;
        if( 0 <= nShdDistX )
        {
            if( 0 <= nShdDistY )
                eShdPosi = SVX_SHADOW_BOTTOMRIGHT;
            else
                eShdPosi = SVX_SHADOW_TOPRIGHT;
        }
        else
        {
            if( 0 <= nShdDistY )
                eShdPosi = SVX_SHADOW_BOTTOMLEFT;
            else
                eShdPosi = SVX_SHADOW_TOPLEFT;
        }
        aShadow.SetLocation( eShdPosi );

        rFlySet.Put( aShadow );
    }

    // Hintergrund: SvxBrushItem
    if( pFillAttrSetItem )
    {
        SfxItemState eState = pFillAttrSetItem->GetItemSet().GetItemState(
                                                              XATTR_FILLSTYLE,
                                                              TRUE, &pItem );
        if( eState == SFX_ITEM_SET )
        {

            const XFillStyle eFillStyle =
                                ((const XFillStyleItem*)pItem)->GetValue();

            if(eFillStyle != XFILL_NONE)
            {
                SvxBrushItem aBrushItem;
                BOOL bBrushItemOk = FALSE;

                switch( eFillStyle )
                {
                case XFILL_NONE     :
                    {
                        aBrushItem.SetColor( Color( COL_TRANSPARENT ) );
                        bBrushItemOk = TRUE;
                    }break;
                case XFILL_SOLID    :
                    {
                        const Color aColor =
                                WW8ITEMVALUE( pFillAttrSetItem->GetItemSet(),
                                              XATTR_FILLCOLOR,
                                              XFillColorItem );
                        aBrushItem.SetColor( aColor );
                        bBrushItemOk = TRUE;
                    }break;
                case XFILL_GRADIENT :
                                    break;
                case XFILL_HATCH    :
                                    break;
                case XFILL_BITMAP   :
                    {
                        const Graphic aGraphic(
                                WW8ITEMVALUE( pFillAttrSetItem->GetItemSet(),
                                              XATTR_FILLBITMAP,
                                              XFillBitmapItem ).GetBitmap() );

                        BOOL bTile =
                                WW8ITEMVALUE( pFillAttrSetItem->GetItemSet(),
                                              XATTR_FILLBMP_TILE,
                                              SfxBoolItem );
                        aBrushItem.SetGraphic( aGraphic );
                        aBrushItem.SetGraphicPos(  bTile
                                                 ? GPOS_TILED
                                                 : GPOS_AREA );
                        bBrushItemOk = TRUE;
                    }break;
                }
                if( bBrushItemOk )
                    rFlySet.Put( aBrushItem, RES_BACKGROUND );
            }
        }
    }

}


void SwWW8ImplReader::MatchWrapDistancesIntoFlyFmt( SvxMSDffImportRec* pRecord,
                                                    SwFrmFmt*          pFlyFmt )
{
    if( pRecord->nDxWrapDistLeft || pRecord->nDxWrapDistRight )
    {
        SvxLRSpaceItem aLR;
        aLR.SetLeft(    (USHORT)pRecord->nDxWrapDistLeft );
        aLR.SetRight(   (USHORT)pRecord->nDxWrapDistRight );
        pFlyFmt->SetAttr( aLR );
    }
    if( pRecord->nDyWrapDistTop || pRecord->nDyWrapDistBottom )
    {
        SvxULSpaceItem aUL;
        aUL.SetUpper(   (USHORT)pRecord->nDyWrapDistTop );
        aUL.SetLower(   (USHORT)pRecord->nDyWrapDistBottom );
        pFlyFmt->SetAttr( aUL );
    }
}


void SwWW8ImplReader::SetCropAtGrfNode( SvxMSDffImportRec* pRecord,
                                        SwFrmFmt*          pFlyFmt,
                                        WW8_FSPA*          pF )
{
    if( pRecord->nCropFromTop ||
        pRecord->nCropFromBottom ||
        pRecord->nCropFromLeft ||
        pRecord->nCropFromRight )
    {

        const SwNodeIndex* pIdx = pFlyFmt->GetCntnt( FALSE ).GetCntntIdx();
        SwGrfNode* pGrfNd;
        if( pIdx && 0 != (pGrfNd = rDoc.GetNodes()[ pIdx->GetIndex()
                                                        + 1 ]->GetGrfNode() ))
        {
            Size aSz( pGrfNd->GetTwipSize() );
            ULONG rHeight = aSz.Height();
            ULONG rWidth  = aSz.Width();
            if( !rWidth )
                rWidth  = pF->nXaRight  - pF->nXaLeft;
            else if( !rHeight )
                rHeight = pF->nYaBottom - pF->nYaTop;
#if SUPD>601

            SwCropGrf aCrop;            // Cropping is stored in 'fixed floats'
                                        // 16.16 (it est fraction times total
            if( pRecord->nCropFromTop ) //        image width or height resp.)
                aCrop.SetTop(
                (   ( (pRecord->nCropFromTop    >> 16   ) * rHeight )
                  + (((pRecord->nCropFromTop    & 0xffff) * rHeight ) >> 16) ));
            if( pRecord->nCropFromBottom )
                aCrop.SetBottom(
                (   ( (pRecord->nCropFromBottom >> 16   ) * rHeight )
                  + (((pRecord->nCropFromBottom & 0xffff) * rHeight ) >> 16) ));
            if( pRecord->nCropFromLeft )
                aCrop.SetLeft(
                (   ( (pRecord->nCropFromLeft   >> 16   ) * rWidth  )
                  + (((pRecord->nCropFromLeft   & 0xffff) * rWidth  ) >> 16) ));
            if( pRecord->nCropFromRight )
                aCrop.SetRight(
                (   ( (pRecord->nCropFromRight  >> 16   ) * rWidth  )
                  + (((pRecord->nCropFromRight  & 0xffff) * rWidth  ) >> 16) ));

            pGrfNd->SetAttr( aCrop );
#endif
        }
    }
}



SdrObject* SwWW8ImplReader::CreateContactObject( SwFlyFrmFmt* pFlyFmt )
{
    if( pFlyFmt )
    {
        SdrObject* pNewObject = pFlyFmt->FindSdrObject();
        if( !pNewObject )
        {
            SwFlyDrawContact* pContactObject
                = new SwFlyDrawContact( pFlyFmt, pDrawModel);
            pNewObject = pContactObject->GetMaster();
        }
        return pNewObject;
    }
    return 0;
}


#pragma optimize("",off)
SwFrmFmt* SwWW8ImplReader::Read_GrafLayer( long nGrafAnchorCp )
{
    SwFrmFmt* pRetFrmFmt = 0;
    if( nIniFlags & WW8FL_NO_GRAFLAYER )
        return pRetFrmFmt;

    ::SetProgressState( nProgress, rDoc.GetDocShell() );     // Update

    nDrawCpO =    pWwFib->ccpText + pWwFib->ccpFtn
                + pWwFib->ccpHdr  + pWwFib->ccpMcr
                + pWwFib->ccpAtn  + pWwFib->ccpEdn;
    if( pPlcxMan->GetManType() == MAN_HDFT ) nDrawCpO += pWwFib->ccpTxbx;

    if( bVer67 )
    {
        if(  bHdFtFtnEdn )          // kann der Writer z.Zt. leider nicht
            return pRetFrmFmt;
    //  if( pFlyPara )              // sicherheitshalber
    //      return;
    //  if( bTable )                // sicherheitshalber
    //      return;

    //  if( bTable )
    //      return;                         // geht z.Zt. nicht


        if( !pDrawModel )           // 1. GrafikObjekt des Docs
            GrafikCtor();

        WW8PLCFspecial* pPF = pPlcxMan->GetFdoa();
        if( !pPF ){
            ASSERT( !this, "+Wo ist die Grafik (1) ?" );
            return pRetFrmFmt;
        }
        long nOldPos = pStrm->Tell();
        if( !pDrawHeight ){                             // 1. Aufruf
            pDrawHeight = new SvShorts;
            nDrawObjOfs = pDrawPg->GetObjCount();
        }
        nDrawXOfs = nDrawYOfs = 0;
        pDrawFmt = rDoc.MakeDrawFrmFmt( WW8_ASCII2STR( "DrawObject" ),
                                        rDoc.GetDfltFrmFmt() );
        ReadGrafLayer1( pPF, nGrafAnchorCp );
        pStrm->Seek( nOldPos );
    }
    else
    {
        WW8PLCFspecial* pPF = pPlcxMan->GetFdoa();
        if( !pPF ){
            ASSERT( !this, "+Wo ist die Grafik (1) ?" );
            return pRetFrmFmt;
        }
        pPF->SeekPos( nGrafAnchorCp );

        long nStartFc;
        void* pF0;
        if( !pPF->Get( nStartFc, pF0 ) ){
            ASSERT( !this, "+Wo ist die Grafik (2) ?" );
            return pRetFrmFmt;
        }

        WW8_FSPA_SHADOW* pFS = (WW8_FSPA_SHADOW*)pF0;
        WW8_FSPA*        pF;
#ifdef __WW8_NEEDS_COPY
        WW8_FSPA aFSFA;
        pF = &aFSFA;
        WW8FSPAShadowToReal( pFS, pF );
#else
        pF = (WW8_FSPA*)pFS;
#endif // defined __WW8_NEEDS_COPY
        if( !pF->nSpId )
        {
            ASSERT( !this, "+Wo ist die Grafik (3) ?" );
            return pRetFrmFmt;
        }

        if( !pDrawModel )// 1. GrafikObjekt des Docs
            GrafikCtor();

        if( !pMSDffManager->GetModel() )
             pMSDffManager->SetModel(pDrawModel, 1440);

        SdrObject* pObject = 0;

        Rectangle aRect(pF->nXaLeft,  pF->nYaTop,
                        pF->nXaRight, pF->nYaBottom);
        SvxMSDffImportData aData( aRect );

        if(     pMSDffManager->GetShape( pF->nSpId, pObject, aData )
            &&  pObject )
        {
            const SdrObject* pOrgShapeObject = pObject;
            SvxMSDffImportRec* pRecord;
            BOOL bDone = FALSE;
            SdrObject* pOurNewObject = 0;
            BOOL bSetCrop     = FALSE;
            BOOL bOrgObjectWasReplace
                = (    (SdrInventor == pObject->GetObjInventor())
                    && (    (UINT16( OBJ_GRAF ) == pObject->GetObjIdentifier())
                         || (UINT16( OBJ_OLE2 ) == pObject->GetObjIdentifier()) ) );

            //FormControl Text, cmc
            UINT32 nTextId =
                pMSDffManager->GetPropertyValue(DFF_Prop_pictureId,0);
            if (nTextId)
                bOrgObjectWasReplace=TRUE;


            // Umfluss-Modus ermitteln
            SfxItemSet aFlySet( rDoc.GetAttrPool(), RES_FRMATR_BEGIN, RES_FRMATR_END-1 );
            SwSurround eSurround = SURROUND_PARALLEL;
            BOOL bContour = FALSE;
            switch( pF->nwr )
            {
            case 0: ;                                       //0 like 2, but doesn't require absolute object
            case 2: eSurround = SURROUND_PARALLEL;  break;  //2 wrap around absolute object
            case 1: eSurround = SURROUND_NONE;      break;  //1 no text next to shape
            case 3: eSurround = SURROUND_THROUGHT;  break;  //3 wrap as if no object present
            case 4: ;                                       //4 wrap tightly around object
            case 5:
                {
                    eSurround = SURROUND_PARALLEL;          //5 wrap tightly, but allow holes

                    // ensure the object will be conterted
                    // into a Writer structure!
                    // the Writer doesn't support Contour on Sdr objects
                    if( bOrgObjectWasReplace )
                        bContour = TRUE;
                }
                break;
            }
            // bei Modus 2 oder 4 auch den Zusatzparameter beruecksichtigen
            if( ( 2 == pF->nwr ) || ( 4 == pF->nwr ) )
            {
                switch( pF->nwrk )
                {
                case 0: eSurround = SURROUND_PARALLEL;  break;  //0 wrap both sides
                case 1: eSurround = SURROUND_LEFT;      break;  //1 wrap only on left
                case 2: eSurround = SURROUND_RIGHT;     break;  //2 wrap only on right
                case 3: eSurround = SURROUND_IDEAL;     break;  //3 wrap only on largest side
                }
            }
            SwFmtSurround aSur( eSurround );
            aSur.SetContour( bContour );
            aSur.SetOutside( TRUE ); // Winword kann nur Aussen-Konturen
            aFlySet.Put( aSur );

            if( bOrgObjectWasReplace )
            {
                long nWidthTw  = pF->nXaRight -pF->nXaLeft;
                if( 0>nWidthTw ) nWidthTw =0;
                long nHeightTw = pF->nYaBottom - pF->nYaTop;
                if( 0>nHeightTw) nHeightTw=0;

                aFlySet.Put( SwFmtAnchor( FLY_AT_CNTNT ) );

                if( nbxRelPageBorder == pF->nbx )
                {
                    pF->nXaLeft -= nPgLeft;
                    if( bTable )
                        pF->nXaLeft -= GetTableLeft();
                }
                aFlySet.Put(
                    SwFmtHoriOrient( pF->nXaLeft, HORI_NONE, FRAME ) );
                aFlySet.Put(
                    SwFmtVertOrient( pF->nYaTop,  VERT_NONE, FRAME ) );

                aFlySet.Put( SwFmtFrmSize( ATT_VAR_SIZE, nWidthTw, nHeightTw ));

                pRecord = (    aData.HasRecords()
                            && (1 == aData.GetRecCount() ) )
                        ? aData.GetRecord( 0 ) : 0;

                if( pRecord )
                {
                    Rectangle aInnerDist(   pRecord->nDxTextLeft,
                                            pRecord->nDyTextTop,
                                            pRecord->nDxTextRight,
                                            pRecord->nDyTextBottom  );

                    MatchSdrItemsIntoFlySet( pObject,
                                             aFlySet,
                                             pRecord->eLineStyle,
                                             aInnerDist,
                                             !pRecord->bLastBoxInChain );
                }

                XubString aObjectName( pObject->GetName() );
                SwFrmFmt *pControl=NULL;
                if( UINT16( OBJ_OLE2 ) == pObject->GetObjIdentifier() )
                {
                    SvInPlaceObjectRef xIPRef(
                                ((SdrOle2Obj*)pObject)->GetObjRef() );

                    // kein GrafSet uebergeben, da nur fuer Cropping sinnvoll, was die
                    // UI derzeit (27.1.99) noch nicht kann khz.
                    pRetFrmFmt = rDoc.Insert( *pPaM, &xIPRef, &aFlySet );
                }
                else if (nTextId) //i.e. This is possibly a FormControl or graphic
                {
                    UINT16 nTxBxS = (UINT16)(nTextId >> 16);
                    UINT16 nSequence = (UINT16)nTextId;
                    pRecord = aData.GetRecord(0);

                    SdrObject* pTrueObject
                        = (    bOrgObjectWasReplace
                            && (pOrgShapeObject == pRecord->pObj) )
                        ? pOurNewObject
                        : pRecord->pObj;

                    if( bOrgObjectWasReplace && pTrueObject )
                    {
                        if( pF->bBelowText )
                            pTrueObject->SetLayer( nDrawHell );
                        else
                            pTrueObject->SetLayer( nDrawHeaven );
                    }

                    if( pTrueObject == pRecord->pObj )
                    {
                        MatchWrapDistancesIntoFlyFmt(    pRecord, pRetFrmFmt );
                        if( bSetCrop )
                            SetCropAtGrfNode( pRecord, pRetFrmFmt, pF );
                    }

                    SdrTextObj* pSdrTextObj =
                        PTR_CAST(SdrTextObj,pRecord->pObj);

                    if( pSdrTextObj )
                    {
                        Size aObjSize(
                            pSdrTextObj->GetSnapRect().GetWidth(),
                            pSdrTextObj->GetSnapRect().GetHeight());

                        BOOL bEraseThisObject=FALSE;
                        BOOL bOldFloatingCtrl=bFloatingCtrl;
                        bFloatingCtrl=TRUE;
                        pControl = InsertTxbxText(
                            pSdrTextObj,
                            &aObjSize,
                            nTxBxS,
                            nSequence,
                            nGrafAnchorCp,
                            pRetFrmFmt,
                            FALSE,
                            bEraseThisObject,
                            FALSE,0,0,
                            pRecord );

                        if ((pControl) && (RES_DRAWFRMFMT==pControl->Which()))
                        {
                            SdrObject *pObj = pControl->FindSdrObject();
                            if ((pObj) && (FmFormInventor == pObj->GetObjInventor()))
                            {
                                /*have a control*/
                                pControl->SetAttr(aFlySet.Get(RES_VERT_ORIENT));
                                pControl->SetAttr(aFlySet.Get(RES_HORI_ORIENT));
                            }
                        }
                        bFloatingCtrl=bOldFloatingCtrl;
                    bDone=TRUE;
                    }
                }


                if ((UINT16( OBJ_GRAF ) == pObject->GetObjIdentifier()) && (!pControl))
                {
                    const Graphic& rGraph = ((SdrGrafObj*)pObject)->GetGraphic();
                    bSetCrop = TRUE;
                    BOOL bDone2 = FALSE;

                    if( ((SdrGrafObj*)pObject)->IsLinkedGraphic() )
                    {
                        String aGrfName(
                            INetURLObject::RelToAbs(
                                ((SdrGrafObj*)pObject)->GetFileName() ) );

                        BOOL bExist = FALSE;
                        INetURLObject aGrURL(URIHelper::SmartRelToAbs(aGrfName));
                        try
                        {
                            ::ucb::Content aTestContent(
                                aGrURL.GetMainURL(),
                                uno::Reference< XCommandEnvironment >());
                            bExist = aTestContent.isDocument();
                        }
                        catch(...){}


                        if(    bExist
                            || (GRAPHIC_NONE == rGraph.GetType()))
                        {
                            pRetFrmFmt = rDoc.Insert( *pPaM,
                                                aGrfName,
                                                aEmptyStr,
                                                0,          // Graphic*
                                                &aFlySet,
                                                0 );        // SwFrmFmt*
                            bDone2 = TRUE;
                        }
                    }
                    if( !bDone2 )
                        pRetFrmFmt = rDoc.Insert( *pPaM,
                                            aEmptyStr,
                                            aEmptyStr,
                                            &rGraph,
                                            &aFlySet,
                                            0 );        // SwFrmFmt*
                    bDone = TRUE;
                }


                if( pRetFrmFmt )
                {
                    if( pRecord )
                    {
                        MatchWrapDistancesIntoFlyFmt(    pRecord, pRetFrmFmt );
                        if( bSetCrop ) SetCropAtGrfNode( pRecord, pRetFrmFmt, pF );
                    }
                    // mehrfaches Auftreten gleicher Grafik-Namen vermeiden
                    if( aObjectName.Len() )
                    {
                        String aName;
                        if( MakeUniqueGraphName( aName, aObjectName ))
                            pRetFrmFmt->SetName( aName );
                    }
                }
                // falls alles Ok, Zeiger auf neues Objekt ermitteln und
                // Z-Order-Liste entsprechend korrigieren (oder Eintrag loeschen)
                pOurNewObject = CreateContactObject( (SwFlyFrmFmt*)pRetFrmFmt );

                // altes Objekt aus der Z-Order-Liste entfernen
                pMSDffManager->RemoveFromShapeOrder( pObject );
                // aus der Drawing-Page rausnehmen
                if( pObject->GetPage() )
                    pDrawPg->RemoveObject( pObject->GetOrdNum() );

                // und das Objekt loeschen
                DELETEZ( pObject );
                /*
                    Achtung: ab jetzt nur noch pOrgShapeObject abfragen!
                */


                // Kontakt-Objekt in die Z-Order-Liste und die Page aufnehmen
                if( pOurNewObject )
                {
                    if( !bHdFtFtnEdn )
                        pMSDffManager->StoreShapeOrder( pF->nSpId, 0, pOurNewObject, 0 );
                    // Das Kontakt-Objekt MUSS in die Draw-Page gesetzt werden,
                    // damit in SwWW8ImplReader::LoadDoc1() die Z-Order
                    // festgelegt werden kann !!!
                    pDrawPg->InsertObject( pOurNewObject );
                }
            }
            else
            {
                // eingelesenes Objekt (kann eine ganze Gruppe sein)
                // jetzt korrekt positionieren usw.
                if( pF->bRcaSimple )
                {
                    pF->nbx = nbxRelPageBorder;
                    pF->nby = nbyRelPageBorder;
                }

                RndStdIds eAnchor = FLY_AT_CNTNT;  //FLY_PAGE
                if( (nbyRelText != pF->nby) )
                {
                    if( bIsHeader || bIsFooter)
                    {
                        if( bIsHeader && (nPgTop < pF->nYaTop))
                            pF->nYaTop -= nPgTop;
                        else
                            pF->nYaTop = 0;
                        pNode_FLY_AT_CNTNT = &pPaM->GetPoint()->nNode.GetNode();
                    }
                    else
                        eAnchor = FLY_PAGE;
                }
                SwFmtAnchor aAnchor( eAnchor );
                aAnchor.SetAnchor( pPaM->GetPoint() );
                aFlySet.Put( aAnchor );


                /*
                    Hilfs-Attribute setzen, damit MA die Werte im Layout umrechnen kann
                    ( bugdoc:59640 )
                */
                static SwRelationOrient __READONLY_DATA aOrientTab[] = {
                        REL_PG_PRTAREA,         // == nbxRelPgMargin
                        REL_PG_FRAME,           // == nbxRelPageBorder
                        FRAME                   // == nbxRelText
                };

                if( 3 > pF->nby )
                    aFlySet.Put( SwFmtVertOrient( pF->nYaTop, VERT_NONE,
                                                aOrientTab[ pF->nby ] ) );
                if( 3 > pF->nbx )
                    aFlySet.Put( SwFmtHoriOrient( pF->nXaLeft, HORI_NONE,
                                                aOrientTab[ pF->nbx ] ) );



                if( !(nIniFlags1 & WW8FL_NO_FLY_FOR_TXBX) ) // Wer nicht will, der hat gewollt!
                {
                    BOOL bTextThere = FALSE;
                    pRecord = (    aData.HasRecords()
                                && (1 == aData.GetRecCount() ) )
                            ? aData.GetRecord( 0 ) : 0;
                    long nStartCpFly;
                    long nEndCpFly;
                    if( pRecord && pRecord->bReplaceByFly )
                    {
                        // Pruefen, ob in dieser Textbox-Kette denn Text enthalten ist.
                        //   ( Umwandeln einer leeren Kette in Rahmen waere Unsinn. )
                        //
                        bTextThere = TxbxChainContainsRealText( pRecord->aTextId.nTxBxS,
                                                                nStartCpFly,
                                                                nEndCpFly );
                        if( bTextThere )
                        {
                            // Der Text wird nicht in das SdrTextObj eingelesen!
                            // Stattdessen wird ein Rahmen eingefuegt und der Text
                            // von nStartCpFly bis nEndCpFy dort hinein gelesen.
                            //
                            // Vorteil: im Rahmen sind viel mehr Attribute moeglich
                            //          als in der Edit-Enging, und es koennen
                            //          auch Felder, OLEs oder Grafiken darin sein...

                            Rectangle aInnerDist(   pRecord->nDxTextLeft,
                                                    pRecord->nDyTextTop,
                                                    pRecord->nDxTextRight,
                                                    pRecord->nDyTextBottom  );
                            MatchSdrItemsIntoFlySet( pObject,
                                                     aFlySet,
                                                     pRecord->eLineStyle,
                                                     aInnerDist,
                                                     !pRecord->bLastBoxInChain );

                            pRetFrmFmt = rDoc.MakeFlySection( eAnchor, pPaM->GetPoint(), &aFlySet );

                            MatchWrapDistancesIntoFlyFmt( pRecord, pRetFrmFmt );

                            // falls alles Ok, Zeiger auf neues Objekt ermitteln und
                            // Z-Order-Liste entsprechend korrigieren (oder Eintrag loeschen)
                            pOurNewObject = CreateContactObject( (SwFlyFrmFmt*)pRetFrmFmt );

                            // altes Objekt aus der Z-Order-Liste entfernen
                            pMSDffManager->RemoveFromShapeOrder( pObject );

                            // und das Objekt loeschen
                            DELETEZ( pObject );
                            /*
                                Achtung: ab jetzt nur noch pOrgShapeObject abfragen!
                            */


                            if( pOurNewObject )
                            {
                                pMSDffManager->StoreShapeOrder(
                                    pF->nSpId,
                                      (((ULONG)pRecord->aTextId.nTxBxS) << 16)
                                    + pRecord->aTextId.nSequence,
                                    pOurNewObject,
                                    (SwFlyFrmFmt*)pRetFrmFmt,
                                      nActSectionNo
                                    + bIsHeader ? 1 : 0
                                    + bIsFooter ? 2 : 0 );
                                // Das Kontakt-Objekt MUSS in die Draw-Page gesetzt werden,
                                // damit in SwWW8ImplReader::LoadDoc1() die Z-Order
                                // festgelegt werden kann !!!
                                pDrawPg->InsertObject( pOurNewObject );
                            }

                            // Damit die Frames bei Einfuegen in existierendes Doc erzeugt werden,
                            // wird in fltshell.cxx beim Setzen des FltAnchor-Attributes
                            // pFlyFrm->MakeFrms() gerufen
                            if( FLY_IN_CNTNT != eAnchor )
                                pCtrlStck->NewAttr( *pPaM->GetPoint(), SwFltAnchor( pRetFrmFmt ) );

                            // Box-0 erhaelt den Text fuer die ganze Kette!
                            if( !pRecord->aTextId.nSequence )
                            {
#if 0
                                // merke Pos im Haupttext
                                SwPosition aMainTextPos( *pPaM->GetPoint() );

                                // schliesse Attribute auf dem End-Stack
                                pEndStck->SetAttr( *pPaM->GetPoint(), 0, FALSE );

                                SwWW8FltControlStack* pOldStck = pCtrlStck;
                                pCtrlStck = new SwWW8FltControlStack( &rDoc, nFieldFlags );

                                // rette die Attributverwaltung
                                WW8PLCFxSaveAll aPLCFxSave;
                                pPlcxMan->SaveAllPLCFx( &aPLCFxSave );
                                WW8PLCFMan* pOldPlcxMan = pPlcxMan;

#endif
                                // rette Flags u.ae. und setze sie zurueck
                                WW8ReaderSave aSave( this );
                                // setze Pam in den FlyFrame
                                const SwFmtCntnt& rCntnt = pRetFrmFmt->GetCntnt();
                                ASSERT( rCntnt.GetCntntIdx(), "Kein Inhalt vorbereitet." );
                                pPaM->GetPoint()->nNode = rCntnt.GetCntntIdx()->GetIndex() + 1;
                                pPaM->GetPoint()->nContent.Assign( pPaM->GetCntntNode(), 0 );


                                // lies den Text ein
                                bTxbxFlySection = TRUE;
                                ReadText( nStartCpFly,
                                          (nEndCpFly-nStartCpFly),
                                          MAN_MAINTEXT == pPlcxMan->GetManType()
                                        ? MAN_TXBX
                                        : MAN_TXBX_HDFT );

#if 0
                                // schliesse alle Attribute, da sonst Attribute
                                // entstehen koennen, die aus dem Fly rausragen
                                pCtrlStck->SetAttr( *pPaM->GetPoint(), 0, FALSE );
                                pEndStck->SetAttr(  *pPaM->GetPoint(), 0, FALSE );

                                // stelle  die Writer-Flags wieder her
                                aSave.Restore( this );
                                DeleteCtrlStk();
                                pCtrlStck = pOldStck;

                                *pPaM->GetPoint() = aMainTextPos;

                                // restauriere die Attributverwaltung
                                pPlcxMan = pOldPlcxMan;
                                pPlcxMan->RestoreAllPLCFx( &aPLCFxSave );
#else
                                aSave.Restore( this );
#endif
                            }
                            bDone = TRUE;
                        }
                    }
                }
                if( !bDone )
                {
                    if( pF->bBelowText )
                        pObject->SetLayer( nDrawHell );
                    else
                        pObject->SetLayer( nDrawHeaven );

                    pDrawPg->InsertObject( pObject );
                    pRetFrmFmt = rDoc.Insert( *pPaM, *pObject, &aFlySet );
                }
            }


            /*
                Innen- und Aussen-Rand-Abstaende einstellen
                und ggfs. Text in enthaltene Textbox(en) einlesen
            */
            if( !bDone && aData.HasRecords() )
            {
                USHORT nRecCount = aData.GetRecCount();
                for(USHORT nTxbx=0; nTxbx < nRecCount; nTxbx++ )
                {
                    pRecord = aData.GetRecord( nTxbx );
                    if( pRecord && pRecord->pObj )
                    {
                        SdrObject* pTrueObject
                            = (    bOrgObjectWasReplace
                                && (pOrgShapeObject == pRecord->pObj) )
                            ? pOurNewObject
                            : pRecord->pObj;

                        if( bOrgObjectWasReplace && pTrueObject )
                        {
                            if( pF->bBelowText )
                                pTrueObject->SetLayer( nDrawHell );
                            else
                                pTrueObject->SetLayer( nDrawHeaven );
                        }

                        if( pTrueObject == pRecord->pObj )
                        {
                            MatchWrapDistancesIntoFlyFmt(    pRecord, pRetFrmFmt );
                            if( bSetCrop ) SetCropAtGrfNode( pRecord, pRetFrmFmt, pF );

                            /*
                            if( pRecord->pClientDataBuffer )
                            {
                                //Auswertung des  Client Data Puffers

                            }
                            */
                        }

                        if( pRecord->aTextId.nTxBxS && !bOrgObjectWasReplace )
                        {
                            SdrTextObj* pSdrTextObj;
                            // Pruefen, ob Gruppenobjekt (z.B. zwei Klammern) vorliegt
                            SdrObjGroup* pThisGroup
                                = PTR_CAST(SdrObjGroup, pRecord->pObj);
                            //if(pRecord->pObj->ISA(SdrObjGroup))
                            if( pThisGroup )
                            {
                                // Gruppenobjekte haben keinen Text. Fuege ein Textobjekt in die
                                // Gruppe ein, um den Text zu halten.
                                pSdrTextObj =
                                    new SdrRectObj(OBJ_TEXT, pThisGroup->GetBoundRect());

                                SfxItemSet aSet(pDrawModel->GetItemPool());
                                aSet.Put(XFillStyleItem(XFILL_NONE));
                                aSet.Put(XLineStyleItem(XLINE_NONE));
                                //SdrFitToSizeType eFTS = SDRTEXTFIT_PROPORTIONAL;
                                /*
                                aSet.Put(SdrTextVertAdjustItem( SDRTEXTVERTADJUST_TOP ));
                                aSet.Put(SdrTextHorzAdjustItem( SDRTEXTHORZADJUST_LEFT ));
                                */
                                aSet.Put(SdrTextFitToSizeTypeItem( SDRTEXTFIT_NONE ));
                                aSet.Put(SdrTextAutoGrowHeightItem( FALSE ));
                                aSet.Put(SdrTextAutoGrowWidthItem(  FALSE ));
                                pSdrTextObj->NbcSetAttributes(aSet, FALSE);

                                long nAngle = pRecord->nTextRotationAngle;
                                if(  nAngle )
                                {
                                    double a = nAngle*nPi180;
                                    pSdrTextObj->NbcRotate( pSdrTextObj->GetBoundRect().Center(),
                                                            nAngle, sin(a), cos(a) );
                                }

                                pSdrTextObj->NbcSetLayer( pThisGroup->GetLayer() );
                                pThisGroup->GetSubList()->NbcInsertObject( pSdrTextObj );
                            }
                            else
                            {
                                pSdrTextObj = PTR_CAST(SdrTextObj, pRecord->pObj);
                                /*
                                    Die Frage: was tun, wenn hier FALSE hereuskommt,
                                                z.B. bei 3D-Objekten (nicht von SdrTextObj abgeleitet)

                                    Wunsch: neues SdrTextObj hinzufuegen, das mit dem alten
                                            in einer neu zu schaffenden Gruppe geklammert wird.

                                    Implementierung: nicht zur 5.1 (jp und khz am 11.02.1999)

                                if( !pSdrTextObj )
                                {
                                    ...
                                }
                                */
                            }

                            if( pSdrTextObj )
                            {
                                Size aObjSize(
                                        pSdrTextObj->GetSnapRect().GetWidth(),
                                        pSdrTextObj->GetSnapRect().GetHeight());

                                // Objekt ist Bestandteil einer Gruppe?
                                SdrObject* pGroupObject = pSdrTextObj->GetUpGroup();

                                UINT32 nOrdNum = pSdrTextObj->GetOrdNum();
                                BOOL bEraseThisObject;
                                InsertTxbxText( pSdrTextObj,
                                                &aObjSize,
                                                pRecord->aTextId.nTxBxS,
                                                pRecord->aTextId.nSequence,
                                                nGrafAnchorCp,
                                                pRetFrmFmt,
                                                   (pSdrTextObj != pTrueObject)
                                                || (0 != pGroupObject),
                                                bEraseThisObject,
                                                FALSE,0,0,
                                                pRecord );

                                // wurde dieses Objekt ersetzt ??
                                if( bEraseThisObject )
                                {
                                    if(    pGroupObject
                                        || (pSdrTextObj != pTrueObject) )
                                    {
                                        // Objekt wurde bereits (in der Gruppe und)
                                        // der Drawing-Page durch ein neues
                                        // SdrGrafObj ersetzt.

                                        SdrObject* pNewObj =
                                              pGroupObject
                                            ? pGroupObject->GetSubList()->GetObj(
                                                nOrdNum )
                                            : pTrueObject;
                                        // Objekt in der Z-Order-Liste ersetzen
                                        pMSDffManager->ExchangeInShapeOrder(
                                            pSdrTextObj, 0,0, pNewObj );
                                        // Objekt jetzt noch loeschen
                                        delete pRecord->pObj;
                                        // und das neue Objekt merken.
                                        pRecord->pObj = pNewObj;
                                    }
                                    else
                                    {
                                        // Objekt aus der Z-Order-Liste loeschen
                                        pMSDffManager->RemoveFromShapeOrder( pSdrTextObj );
                                        // Objekt aus der Drawing-Page rausnehmen
                                        if( pSdrTextObj->GetPage() )
                                            pDrawPg->RemoveObject( pSdrTextObj->GetOrdNum() );
                                        // und FrameFormat entfernen, da durch Grafik
                                        // ersetzt (dies loescht auch das Objekt)
                                        rDoc.DelFrmFmt( pRetFrmFmt );
                                        // auch den Objektmerker loeschen
                                        pRecord->pObj = 0;
                                    }
                                }
                                else
                                {
                                    // ww8-default Randabstand einsetzen
                                    SfxItemSet aItemSet( pDrawModel->GetItemPool(),
                                                         SDRATTR_TEXT_LEFTDIST,
                                                         SDRATTR_TEXT_LOWERDIST );
                                    aItemSet.Put( SdrTextLeftDistItem(  pRecord->nDxTextLeft   ) );
                                    aItemSet.Put( SdrTextRightDistItem( pRecord->nDxTextRight  ) );
                                    aItemSet.Put( SdrTextUpperDistItem( pRecord->nDyTextTop    ) );
                                    aItemSet.Put( SdrTextLowerDistItem( pRecord->nDyTextBottom ) );
                                    pSdrTextObj->SetAttributes( aItemSet, FALSE );
                                }
                            }
                        }
                    }
                }
            }
        }
        else
        {
            ASSERT( !this, "+Wo ist das Shape ?" );
            return 0;
        }
    }
    return pRetFrmFmt;
}
#pragma optimize("",on)


void SwWW8ImplReader::GrafikCtor()  // Fuer SVDraw und VCControls und Escher
{
    rDoc.MakeDrawModel( );
    pDrawModel  = rDoc.GetDrawModel();ASSERT( pDrawModel,
                                              "Kann DrawModel nicht anlegen" );
    pDrawPg     = pDrawModel->GetPage( 0 );
    nDrawHeaven = rDoc.GetHeavenId();
    nDrawHell   = rDoc.GetHellId();
}

void SwWW8ImplReader::GrafikDtor()
{
    DELETEZ( pDrawEditEngine ); // evtl. von Grafik angelegt
    DELETEZ( pDrawHeight );     // dito
}

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ww8/ww8graf.cxx,v 1.1.1.1 2000-09-18 17:14:58 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.93  2000/09/18 16:04:59  willem.vandorp
      OpenOffice header added.

      Revision 1.92  2000/08/28 14:55:42  khz
      #64941# store Hd./Ft./Section info to prevent prohibited TxBx linkage

      Revision 1.91  2000/08/24 14:39:04  khz
      #78052# don't store SwFlyDrawContact in ShapeOrder array if bHdFtFtnEdn set

      Revision 1.90  2000/08/24 12:32:54  os
      Outliner/EditEngine changes

      Revision 1.89  2000/08/24 10:48:52  jp
      crop export to svx

      Revision 1.88  2000/06/26 12:59:11  os
      INetURLObject::SmartRelToAbs removed

      Revision 1.87  2000/06/15 15:23:38  cmc
      #75669# 97Controls Import fixes

      Revision 1.86  2000/06/13 08:24:46  os
      using UCB

      Revision 1.85  2000/05/16 12:12:53  jp
      ASS_FALSE define removed

      Revision 1.84  2000/05/16 11:14:00  khz
      Unicode code-conversion

      Revision 1.83  2000/03/08 10:20:26  khz
      Task #73362# WW6: restore stream position after readind content of textbox

      Revision 1.82  2000/03/03 15:20:01  os
      StarView remainders removed

      Revision 1.81  2000/02/22 16:00:02  khz
      Task #72647# Import attributes of winword 6 TEXT OBJECTS

      Revision 1.80  2000/02/22 13:54:32  khz
      Task #73096# look for OLE- or Graphic-Indicator-Sprms

      Revision 1.79  2000/02/22 11:59:02  khz
      Task #73096# erase TextObj only when OLE or Graphic propperly imported

      Revision 1.78  2000/02/18 09:35:05  cmc
      #69372# Improved Hyperlink Importing for WW97


      Revision 1.77  2000/02/14 14:36:32  jp
      #70473# changes for unicode

      Revision 1.76  2000/02/14 08:25:21  cmc
      #72579 TxtBox NULL test crash fix, revealed by glossary addition

      Revision 1.74  2000/02/09 08:57:16  khz
      Task #72647# Read SPRMs that are stored in piece table grpprls (2)

      Revision 1.73  2000/01/14 11:28:03  khz
      Task #68832# -- CORRECTION: Task Number of rev below should have been: 68832 !

      Revision 1.72  2000/01/14 11:11:38  khz
      Task #71343# look for Sprm 37 (not 5) to recognize APO

      Revision 1.71  2000/01/07 12:29:46  khz
      Task #64574# believe Layerflag in Winword Struct rather than the one in Escher Data (2)

      Revision 1.70  2000/01/07 12:27:19  khz
      Task #64574# believe Layerflag in Winword Struct rather than the one in Escher Data

      Revision 1.69  1999/12/14 14:22:45  khz
      Task #70815# Avoid typecast when calling MatchSdrItemsIntoFlySet()

      Revision 1.68  1999/12/06 16:38:08  khz
      Task #67435# Import FillStyle on OLE and Graphic viaSdrAttrObj::GetFillAttrSetItem()

      Revision 1.67  1999/12/01 10:18:36  khz
      Task #67435# Use GetItemState() to find border of graphic

      Revision 1.66  1999/11/23 18:56:17  khz
      Task #67963# New method SvxMSDffManager::ImportObj() used by Draw, Writer, Calc

      Revision 1.65  1999/11/19 15:02:42  khz
      Special Task! Use new method to import Shapes: SvxMSDffManager::ImportObj()

      Revision 1.64  1999/09/20 14:24:27  khz
      Mussaenderung wg. TH apichange 10.09.1999

      Revision 1.63  1999/08/30 19:53:00  JP
      Bug #68219#: no static members - be reentrant


      Rev 1.62   30 Aug 1999 21:53:00   JP
   Bug #68219#: no static members - be reentrant

      Rev 1.61   09 Aug 1999 14:16:02   JP
   read W95 format from stream

      Rev 1.60   27 Jul 1999 14:41:56   KHZ
   Task #67886# Import Textboxes without #14 in it's field code

      Rev 1.59   15 Jul 1999 10:56:00   KHZ
   Task #67659# Do *not* set FillStyle on box with Default fill style

      Rev 1.58   06 Jul 1999 16:38:14   KHZ
   Task #67435# Borderattributes of graphics that are connected to a #1 char

      Rev 1.57   22 Jun 1999 17:40:22   KHZ
   Task #64574# adjust z-order for grouped objects2

      Rev 1.56   09 Jun 1999 18:25:04   KHZ
   use FOUR different inner distances with SvxBoxItem

      Rev 1.55   02 Jun 1999 09:32:24   KHZ
   Task #66227# a) kein Unicode bei Ver67 ;-)  b) Grafik in grupp. Textbox

      Rev 1.54   29 Apr 1999 12:45:40   KHZ
   Task #65561# (versehentlich war Zuweisung von pRecord auskommentiert)

      Rev 1.53   26 Apr 1999 17:40:22   KHZ
   Task #61381# Attribute von Textboxen in denen NUR EINE Grafik steht

      Rev 1.52   10 Mar 1999 18:23:12   KHZ
   Task #63093# Bei FLY_IN_CNTNT nach MakeFlySection *kein* Ankerattribut setzen!

      Rev 1.51   10 Mar 1999 15:11:18   KHZ
   Task #62521# Einlesen von Sonderzeichen

      Rev 1.50   18 Feb 1999 20:43:48   KHZ
   Task #61681# in InsertObjekt() immer SURROUND_TROUGH setzen

      Rev 1.49   18 Feb 1999 20:24:38   KHZ
   Task #61659# Umlauf im Hintergrund

      Rev 1.48   18 Feb 1999 18:52:38   JP
   Bug #61659#/#61660#: Objecte in einer Gruppe NIE im LayoutConnecten

      Rev 1.47   17 Feb 1999 17:34:26   KHZ
   Task #61982# Zugriff auf freigegebenen Speicher nach ReplaceObject

      Rev 1.46   17 Feb 1999 15:24:16   KHZ
   Task #61382# jetzt auch Textbox-Grafiken im Hintergrund ( SvxOpaqItem(FALSE) )

      Rev 1.45   16 Feb 1999 13:03:24   KHZ
   Task #60326# nur das erste von mehreren PicLoc-Attributen einer Char-Pos ist ok

      Rev 1.44   15 Feb 1999 21:40:04   KHZ
   Task #61381# jetzt include von boxitem.hxx fuer WW8_DECL_LINETAB_ARRAY

      Rev 1.43   12 Feb 1999 16:51:06   KHZ
   Task #61381# Ersetzen von Sdr-Text-Objekten im Writer durch Rahmen (3)

      Rev 1.42   05 Feb 1999 19:37:02   KHZ
   Task #61381# Ersetzen von Sdr-Text-Objekten im Writer durch Rahmen (2)

      Rev 1.41   05 Feb 1999 10:33:48   KHZ
   Task #61381# Ersetzen von Sdr-Text-Objekten im Writer durch Rahmen

      Rev 1.40   28 Jan 1999 17:10:46   KHZ
   Task #60715# in SdrTextObj verankerte Grafiken und OLEs (4)

      Rev 1.39   27 Jan 1999 10:58:02   KHZ
   Task #60715# in SdrTextObj verankerte Grafiken und OLEs (2)

      Rev 1.38   25 Jan 1999 10:25:46   KHZ
   Task #60715# in Textobjekt verankerte Grafik als Grafik importieren

      Rev 1.37   19 Jan 1999 10:53:06   KHZ
   Task #60715# in Textbox verankerte Grafiken und OLEs (1)

      Rev 1.36   06 Jan 1999 10:51:52   KHZ
   Task #59858# Testreihenfolge der While-Schleifen geaendert

      Rev 1.35   22 Dec 1998 09:08:38   KHZ
   Task #60395# (4) StoreShapeOrder wieder angeklemmt

      Rev 1.34   21 Dec 1998 16:00:42   KHZ
   StoreShapeOrder voruebergehend abgeklemmt

      Rev 1.33   18 Dec 1998 12:27:22   KHZ
   Task #60395# (3) jetzt DOCH Layer und Z-Order fuer Grafik oder OLE-Objekt  :-)

      Rev 1.32   17 Dec 1998 10:41:26   KHZ
   Task #60395# (2) KEINE Positionierung bei geloeschten Objekten (Grafik, OLE)

      Rev 1.31   15 Dec 1998 19:54:06   KHZ
   Task #60395# Positionierung vor/hinter dem Text je nach pRecord->bDrawHell

      Rev 1.30   07 Dec 1998 16:29:38   JP
   Bug #58766#/#59640#: Zeichenobjecte nach WW97 Import richtig positionieren

      Rev 1.29   05 Dec 1998 17:11:26   KHZ
   Task #59580# Unicode (3)

      Rev 1.28   04 Dec 1998 20:19:46   KHZ
   Task #58766# Textboxen mit Unicode-Inhalt

      Rev 1.27   30 Nov 1998 17:46:52   JP
   Task #59822#: OLE-Objecte importieren

      Rev 1.26   27 Nov 1998 09:45:22   JP
   Task #59822#: OLE-Objecte importieren - Namen korrekt ermitteln

      Rev 1.25   25 Nov 1998 18:45:40   JP
   Compilerfehler unter UNX

      Rev 1.24   24 Nov 1998 20:45:04   JP
   Task #59822#: OLE-Objecte einlesen

      Rev 1.23   20 Nov 1998 22:04:52   JP
   Task #59476#: Crop-Werte bei Grafiken setzen

      Rev 1.22   20 Nov 1998 16:35:30   KHZ
   Task #59640# Hilfsattribute SwFmtVertOrient und SwFmtHoriOrient (2)

      Rev 1.21   20 Nov 1998 16:18:10   KHZ
   Task #59735# Innen- und Aussenabstaende zwischen Text und Shape (bzw. Grafik)

      Rev 1.20   20 Nov 1998 09:44:54   KHZ
   Task #59640# Hilfsattribute SwFmtVertOrient und SwFmtHoriOrient eingesetzt

      Rev 1.19   29 Oct 1998 15:28:54   KHZ
   Task #58199# gedrehter Text in Shapes und Text in Gruppen jetzt moeglich

      Rev 1.18   28 Oct 1998 10:49:30   KHZ
   Task #55189# Text jetzt auch bei Group-Autoformen (Doppelklammer...) moeglich

      Rev 1.17   21 Oct 1998 13:55:52   KHZ
   Task #55189# Abstand des Textbereich vom Shape-Rand ist jetzt WW8 Default

      Rev 1.16   20 Oct 1998 17:21:56   KHZ
   Task #57704# Text-Umlauf um Grafiken und Escher-Objekte

      Rev 1.15   03 Sep 1998 22:14:22   KHZ
   Task #55189# Textboxen

      Rev 1.14   27 Aug 1998 10:12:30   KHZ
   Task #55189# Escher-Import fuer Draw, Calc und Writer

      Rev 1.13   05 Aug 1998 17:16:24   KHZ
   Task #53614# komprimierte WMF, Enh.Metafile und PICT Grafiken

      Rev 1.12   31 Jul 1998 20:43:06   KHZ
   Task #52607# Fehler wg. Compiler-Optimierung!

      Rev 1.11   30 Jul 1998 23:15:02   KHZ
   Task #53614# Grafiken in Data und Dokumentstream gemischt

      Rev 1.10   30 Jul 1998 20:52:36   KHZ
   Task #52607# GPF unter Unix behoben

      Rev 1.9   28 Jul 1998 23:48:20   KHZ
   Task #52607# Grafik-Textboxen und Absatzformatierung verbessert

      Rev 1.8   28 Jul 1998 11:01:48   KHZ
   Task #52607# nummerierte Listen (Teil 1)

      Rev 1.7   22 Jul 1998 15:36:18   KHZ
   Task #52607#

      Rev 1.6   21 Jul 1998 14:51:50   KHZ
   Task #52607# (WW 97 Import)

      Rev 1.5   21 Jul 1998 12:33:38   KHZ
   als MSDrawingObject eingebettete Grafik (Teil 1)

      Rev 1.4   13 Jul 1998 15:29:16   KHZ
   Task #52607# embeded Grafiken (NICHT UEBER den Text gelegte)

      Rev 1.3   30 Jun 1998 21:33:24   KHZ
   Header/Footer/Footnotes weitgehend ok

      Rev 1.2   23 Jun 1998 11:24:26   KHZ
   Zwischenstand: die meisten Zeichenattribute Ok!

      Rev 1.1   18 Jun 1998 09:47:14   KHZ
   Zwischenstand fur 396c

      Rev 1.0   16 Jun 1998 11:06:34   KHZ
   Initial revision.

*************************************************************************/



diff --git a/sw/source/filter/ww8/ww8graf.hxx b/sw/source/filter/ww8/ww8graf.hxx
new file mode 100644
index 0000000..34dcd715
--- /dev/null
+++ b/sw/source/filter/ww8/ww8graf.hxx
@@ -0,0 +1,194 @@
/*************************************************************************
 *
 *  $RCSfile: ww8graf.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:58 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _WW8GRAF_HXX
#define _WW8GRAF_HXX


#define nbxRelPageBorder    1 // Blatt-Rand
#define nbxRelPgMargin      0 // Page Print Area
#define nbxRelText          2 // Spalten (Absatz) -Rand   = FRAME Print Area

#define nbyRelPageBorder    1
#define nbyRelPgMargin      0
#define nbyRelText          2


struct WW8_FSPA
{
    long nSpId;     //Shape Identifier. Used in conjunction with the office art data (found via fcDggInfo in the FIB) to find the actual data for this shape.
    long nXaLeft;   //left of rectangle enclosing shape relative to the origin of the shape
    long nYaTop;        //top of rectangle enclosing shape relative to the origin of the shape
    long nXaRight;  //right of rectangle enclosing shape relative to the origin of the shape
    long nYaBottom;//bottom of the rectangle enclosing shape relative to the origin of the shape
    USHORT bHdr:1;
    //0001 1 in the undo doc when shape is from the header doc, 0 otherwise (undefined when not in the undo doc)
    USHORT nbx:2;
    //0006 x position of shape relative to anchor CP
    //0 relative to page margin
    //1 relative to top of page
    //2 relative to text (column for horizontal text; paragraph for vertical text)
    //3 reserved for future use
    USHORT nby:2;
    //0018 y position of shape relative to anchor CP
    //0 relative to page margin
    //1 relative to top of page
    //2 relative to text (paragraph for horizontal text; column for vertical text)
    USHORT nwr:4;
    //01E0 text wrapping mode
    //0 like 2, but doesn't require absolute object
    //1 no text next to shape
    //2 wrap around absolute object
    //3 wrap as if no object present
    //4 wrap tightly around object
    //5 wrap tightly, but allow holes
    //6-15 reserved for future use
    USHORT nwrk:4;
    //1E00 text wrapping mode type (valid only for wrapping modes 2 and 4
    //0 wrap both sides
    //1 wrap only on left
    //2 wrap only on right
    //3 wrap only on largest side
    USHORT bRcaSimple:1;
    //2000 when set, temporarily overrides bx, by, forcing the xaLeft, xaRight, yaTop, and yaBottom fields to all be page relative.
    USHORT bBelowText:1;
    //4000
    //1 shape is below text
    //0 shape is above text
    USHORT bAnchorLock:1;
    //8000  1 anchor is locked
    //      0 anchor is not locked
    long nTxbx; //count of textboxes in shape (undo doc only)
};


struct WW8_FSPA_SHADOW  // alle Member an gleicher Position und Groesse,
{                                               // wegen:  pF = (WW8_FSPA*)pFS;
    SVBT32 nSpId;
    SVBT32 nXaLeft;
    SVBT32 nYaTop;
    SVBT32 nXaRight;
    SVBT32 nYaBottom;
    SVBT16 aBits1;
    SVBT32 nTxbx;
};

struct WW8_TXBXS
{
    SVBT32 cTxbx__iNextReuse;
    SVBT32 cReusable;
    SVBT16 fReusable;
    SVBT32 reserved;
    SVBT32 ShapeId;
    SVBT32 txidUndo;
};

void WW8FSPAShadowToReal( WW8_FSPA_SHADOW* pFSPAS, WW8_FSPA* pPic );


/*************************************************************************
      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ww8/ww8graf.hxx,v 1.1.1.1 2000-09-18 17:14:58 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.11  2000/09/18 16:04:59  willem.vandorp
      OpenOffice header added.

      Revision 1.10  2000/05/16 11:35:11  khz
      Unicode code-conversion

      Revision 1.9  1998/11/25 17:50:46  JP
      Compilerfehler unter UNX


      Rev 1.8   25 Nov 1998 18:50:46   JP
   Compilerfehler unter UNX

      Rev 1.7   20 Nov 1998 17:56:00   KHZ
   Task #59640# Hilfsattribute SwFmtVertOrient und SwFmtHoriOrient (2)

      Rev 1.6   29 Oct 1998 15:27:26   KHZ
   Task #58199# defines fuer rel. Abstand-Orientierung von Shapes geaendert

      Rev 1.5   03 Sep 1998 22:14:22   KHZ
   Task #55189# Textboxen

      Rev 1.4   27 Aug 1998 10:12:30   KHZ
   Task #55189# Escher-Import fuer Draw, Calc und Writer

      Rev 1.3   22 Jul 1998 16:14:16   HR
   ww8graf fuer UNX

      Rev 1.2   21 Jul 1998 14:51:48   KHZ
   Task #52607# (WW 97 Import)

      Rev 1.1   21 Jul 1998 12:33:28   KHZ
   als MSDrawingObject eingebettete Grafik (Teil 1)

      Rev 1.0   16 Jun 1998 10:56:50   KHZ
   Initial revision.

*************************************************************************/
#endif

diff --git a/sw/source/filter/ww8/ww8graf2.cxx b/sw/source/filter/ww8/ww8graf2.cxx
new file mode 100644
index 0000000..2771ffd
--- /dev/null
+++ b/sw/source/filter/ww8/ww8graf2.cxx
@@ -0,0 +1,1363 @@
/*************************************************************************
 *
 *  $RCSfile: ww8graf2.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:58 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifdef PCH
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif


#ifndef _TOOLS_TEMPFILE_HXX
#include <tools/tempfile.hxx>
#endif
#ifndef _SVX_IMPGRF_HXX //autogen
#include <svx/impgrf.hxx>
#endif
#ifndef _SVDPAGE_HXX //autogen
#include <svx/svdpage.hxx>
#endif
#ifndef _SVDMODEL_HXX //autogen
#include <svx/svdmodel.hxx>
#endif
#ifndef _SVDOGRAF_HXX
#include <svx/svdograf.hxx>
#endif
#ifndef _SVDOOLE2_HXX
#include <svx/svdoole2.hxx>
#endif
#ifndef _SVX_OPAQITEM_HXX //autogen
#include <svx/opaqitem.hxx>
#endif

#ifndef _MSDFFIMP_HXX
#include <svx/msdffimp.hxx>
#endif


#ifndef _SFXAPP_HXX
#include <sfx2/app.hxx>
#endif

#ifndef _SFXDOCFILE_HXX
#include <sfx2/docfile.hxx>
#endif

#ifndef _SFX_FCONTNR_HXX
#include <sfx2/fcontnr.hxx>
#endif


#ifndef _IPOBJ_HXX //autogen
#include <so3/ipobj.hxx>
#endif

#ifndef _SV_SVAPP_HXX //autogen
#include <vcl/svapp.hxx>
#endif

#ifndef _DCONTACT_HXX
#include <dcontact.hxx>
#endif

#ifndef _GRFATR_HXX
#include <grfatr.hxx>           // class SwCropGrf
#endif
#ifndef _FMTFLCNT_HXX //autogen
#include <fmtflcnt.hxx>
#endif
#ifndef _FMTANCHR_HXX //autogen
#include <fmtanchr.hxx>
#endif
#ifndef _FRMFMT_HXX //autogen
#include <frmfmt.hxx>
#endif
#ifndef _FLTSHELL_HXX
#include <fltshell.hxx>
#endif
#ifndef _WW8STRUC_HXX
#include <ww8struc.hxx>
#endif
#ifndef _WW8SCAN_HXX
#include <ww8scan.hxx>
#endif
#ifndef _WW8PAR_HXX
#include <ww8par.hxx>           // class SwWWImplReader
#endif
#ifndef _WW8PAR2_HXX
#include <ww8par2.hxx>          // struct WWFlyPara
#endif
#ifndef _WW8GRAF_HXX
#include <ww8graf.hxx>
#endif
#ifndef _PAM_HXX
#include <pam.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _NDTXT_HXX
#include <ndtxt.hxx>            // class SwTxtNode
#endif
#ifndef _MDIEXP_HXX
#include <mdiexp.hxx>           // Progress
#endif
#ifndef _FSYS_HXX
#include <tools/fsys.hxx>
#endif


#ifdef __WW8_NEEDS_COPY
extern void WW8PicShadowToReal(  WW8_PIC_SHADOW*  pPicS,  WW8_PIC*  pPic );
#endif // defined __WW8_NEEDS_COPY


//-----------------------------------------
//              los gehts
//-----------------------------------------


#ifdef USE_WMF_GRAF_FILE    // Definieren fuer Import WMF ueber File
                            // ( alte Version, kann kein MAC-PICT )
struct WmfFileHd
{                     // Vorsicht: Struktur ist nicht aligned
    SVBT16 nTyp;            // 0 = Mem, 1 = File
    SVBT16 nHdSiz;          // 0x009
    SVBT16 nVersion;        // 0x300
    SVBT32 nSize;           // filesize in bytes
    SVBT16 nNoObj;          // Number of Objects that exist at same time
    SVBT32 nMaxRecLen;      // largest record
    SVBT16 nNoParas;        // not used
};
#define WMF_FILE_HD_SIZ 18    // Groesse der Struktur WmfFileHd

ULONG SwWW8ImplReader::ReadWmfHeader( WmfFileHd* pHd, long nPos )
{
    pStrm->Seek( nPos );
    pStrm->Read( pHd, sizeof( *pHd ) );
    return SVBT32ToLong( pHd->nSize ) * 2;       // FileSize in Bytes
}

#endif // USE_WMF_GRAF_FILE




struct METAFILEHEADER       // ist aligned, deshalb gehts fuer alle Platformen
{
    UINT32  key;
    UINT16  hmf;
    UINT16  left;
    UINT16  top;
    UINT16  right;
    UINT16  bottom;
    UINT16  inch;
    UINT32  reserved;
    UINT16  checksum;
};


#define METAFILEHEADER_SIZE 22


static void WriteWmfPreHd( long nWidth, long nHeight, SvStream& rOStream )
{
    METAFILEHEADER aHeader;

    aHeader.key = 0x9AC6CDD7L;
    aHeader.hmf = 0;
    aHeader.left = 0;
    aHeader.top = 0;
    aHeader.right =  (UINT16)( nWidth * 100 / 144 );
    aHeader.bottom =  (UINT16)( nHeight * 100 / 144 );
    aHeader.inch= 1000;
    aHeader.reserved = 0;
    aHeader.checksum = 0;
    for( USHORT n=0; n < 10; n++ )
        aHeader.checksum ^= *(((UINT16*)&aHeader)+n);

#ifdef __BIGENDIAN
    aHeader.key = SWAPLONG( aHeader.key );
    aHeader.left = 0;
    aHeader.top = 0;
    aHeader.right = SWAPSHORT( aHeader.right );
    aHeader.bottom = SWAPSHORT( aHeader.bottom );
    aHeader.inch = SWAPSHORT( aHeader.inch );
    aHeader.checksum = SWAPSHORT( aHeader.checksum );
#endif // __BIGENDIAN

    rOStream.Write( (char*)&aHeader, METAFILEHEADER_SIZE );
}


#define WWBUFSIZ 4096           //  512 <= WWBUFSIZE <= UINT16_MAX !!!

static void _CopyFilePiece( SvStream* pDst, SvStream* pSrc, ULONG nRead,
                              void* pBuf, UINT16 nBufSize )
{
    UINT16 nRead1;
    do{
        nRead1 = ( nRead > nBufSize ) ? nBufSize : (UINT16)nRead;
        pSrc->Read( pBuf, nRead1 );
        pDst->Write( pBuf, nRead1 );
        nRead -= nRead1;
    }while( nRead );
}

BOOL SwWW8ImplReader::ReadGrafFile( String& rFileName, Graphic*& rpGraphic,
    const WW8_PIC& rPic,    SvStream* pSt, ULONG nFilePos, BOOL* pbInDoc )
{                                                  // Grafik in File schreiben
    ASSERT( WWBUFSIZ >= 512,
             "Au weia, Puffergroesse < 512, keine Mac-Picts moeglich" );

    *pbInDoc = TRUE;                               // default

    ULONG nPosFc = nFilePos + rPic.cbHeader;

    switch( rPic.MFP.mm ){
    case 94:                        // BMP-File ( nicht embeddet ) oder GIF
    case 99:
        {   // TIFF-File ( nicht embeddet )
            pSt->Seek( nPosFc );
            String aStr( WW8ReadPString( *pSt, eStructCharSet, 0 ) );// Name als P-String einlesen
            rFileName = aStr.GetChar( 0 );      // Wandeln in SV-String
            *pbInDoc = FALSE;       // Datei anschliessend nicht loeschen
            return rFileName.Len() != 0;        // Einlesen OK
        }
    }
#ifndef USE_WMF_GRAF_FILE
                            // Neu:WMF - Variante ohne File
    {
        GDIMetaFile aWMF;
        pSt->Seek( nPosFc );
        BOOL bOk = ReadWindowMetafile( *pSt, aWMF );
                    // *pSt >> aWMF; geht nicht ohne placable header
        if( !bOk || pSt->GetError() || !aWMF.GetActionCount() ){
//          ASSERT( bOk, "ReadWindowMetafile ging schief" );
//          ASSERT( !pSt->GetError(), "WMF einlesen ging schief ( Stream-Error )" );
//          ASSERT( aWMF.GetActionCount(), "WMF einlesen ging schief ( No Meta-Action )" );
            return FALSE;
        }
        if( pWwFib->envr != 1 ){            // !MAC als Creator

            aWMF.SetPrefMapMode( MapMode( MAP_100TH_MM ) );
            // MetaFile auf neue Groesse skalieren und
            // neue Groesse am MetaFile setzen
            Size        aOldSiz( aWMF.GetPrefSize() );
            Size        aNewSiz( rPic.MFP.xExt, rPic.MFP.yExt );
            Fraction    aFracX( aNewSiz.Width(), aOldSiz.Width() );
            Fraction    aFracY( aNewSiz.Height(), aOldSiz.Height() );

            aWMF.Scale( aFracX, aFracY );
            aWMF.SetPrefSize( aNewSiz );

            rpGraphic = new Graphic( aWMF );
            return TRUE;
        }
        // MAC - Word als Creator
        // im WMF steht nur "Benutzen sie Word 6.0c"
        // Mac-Pict steht dahinter
        // allerdings ohne die ersten 512 Bytes,
        // bei einem MAC-PICT egal sind ( werden nicht ausgewertet )

        long nCopy = rPic.lcb - ( pSt->Tell() - nPosFc );
        if( nCopy <= 0 || WWBUFSIZ < 512 )
            return FALSE;

        BYTE* pBuf = new BYTE[WWBUFSIZ];
        String sExt(WW8_ASCII2STR("pct"));
        TempFile aTempFile(aEmptyStr, &sExt);
        aTempFile.EnableKillingFile();
        {
            SvFileStream aOut(aTempFile.GetName(), STREAM_READ|STREAM_WRITE|STREAM_TRUNC);
            memset( pBuf, 0, 512 );
            aOut.Write( pBuf, 512 );        // Anfang Pict: 512 Byte Muell
            _CopyFilePiece( &aOut, pSt, nCopy, pBuf, WWBUFSIZ );    // Pict-Inhalt
            delete( pBuf );
        }

        GraphicFilter& rGF = *::GetGrfFilter(); // lese ueber Filter ein
        rpGraphic = new Graphic();
#if SUPD<591
        bOk = ( rGF.ImportGraphic( *rpGraphic, DirEntry(aTempFile.GetName()), GRFILTER_FORMAT_DONTKNOW )
                == 0 );
#else
        bOk = ( rGF.ImportGraphic( *rpGraphic, INetURLObject(aTempFile.GetName()), GRFILTER_FORMAT_DONTKNOW )
                == 0 );
#endif
        if( !bOk )
            DELETEZ( rpGraphic );

        return bOk;                 // Grafik drin
    }
#else   // ! USE_WMF_GRAF_FILE
                    // alt: ueber File mit selbstgebasteltem Header
    ULONG nMaxSize = rPic.lcb - rPic.cbHeader;
    WmfFileHd aHd;                              // lies Header
    ULONG nSiz = ReadWmfHeader( &aHd, nPosFc ); // FileSize in Bytes

    if( nSiz > nMaxSize )
        return FALSE;                           // irgendwas ist schiefgegangen

    DirEntry aFN = GetTmpFileName();
    aFN.SetExtension( String( "wmf" ) );
    aFN.ToAbs();
    rFileName = aFN.GetFull();

    SvFileStream aOut( rFileName, STREAM_WRITE );


    WriteWmfPreHd( rPic.dxaGoal, rPic.dyaGoal, aOut );  // Placeable WMF-Header

    ULONG nRead = nSiz;
    UINT16 nRead1;
    BYTE* pBuf = new BYTE[WWBUFSIZ];
    pSt->Seek( nPosFc );
    do{
        nRead1 = ( nRead > WWBUFSIZ ) ? WWBUFSIZ : (UINT16)nRead;
        pSt->Read( pBuf, nRead1 );
        aOut.Write( pBuf, nRead1 );
        nRead -= nRead1;
    }while( nRead );

    delete( pBuf );

    return TRUE;
#endif  // ! USE_WMF_GRAF_FILE
}

struct WW8PicDesc
{
    INT16 nCL, nCR, nCT, nCB;
    long nWidth, nHeight;

    WW8PicDesc( const WW8_PIC& rPic );
};

WW8PicDesc::WW8PicDesc( const WW8_PIC& rPic )
{
    long nOriWidth = (long)rPic.dxaGoal;        // Groesse in 1/100 mm ?
    long nOriHeight = (long)rPic.dyaGoal;

    nCL = rPic.dxaCropLeft;
    nCR = rPic.dxaCropRight;
    nCT = rPic.dyaCropTop;
    nCB = rPic.dyaCropBottom;

    long nAddWidth  = nOriWidth + nCL + nCR;        // Groesse nach Crop
    long nAddHeight = nOriHeight + nCT + nCB;
    if(!nAddWidth  )
        nAddWidth  = 1;
    if(!nAddHeight )
        nAddHeight = 1;

    nCL = (short)((long)nCL * nOriWidth / nAddWidth );// Crop absolut
    nCR = (short)((long)nCR * nOriWidth / nAddWidth );// -> skaliert
    nCT = (short)((long)nCT * nOriWidth / nAddWidth );// auf Original-ImageSize
    nCB = (short)((long)nCB * nOriWidth / nAddWidth );

    nWidth = nAddWidth * rPic.mx / 1000;        // entgueltige Sw-Groesse
    nHeight = nAddHeight * rPic.my / 1000;
}

/*
WW8PicDesc::WW8PicDesc( const WW8_FSPA& rFSPA )
{
    //long nOriWidth  = (long)rPic.dxaGoal;     // Groesse in 1/100 mm ?
    //long nOriHeight = (long)rPic.dyaGoal;

    nCL = rFSPA.nXaLeft;
    nCR = rFSPA.nXaRight;
    nCT = rFSPA.nYaTop;
    nCB = rFSPA.nYaBottom;

    //long nAddWidth  = nOriWidth  + nCL + nCR;     // Groesse nach Crop
    //long nAddHeight = nOriHeight + nCT + nCB;

    //nCL = (short)((long)nCL * nOriWidth / nAddWidth );// Crop absolut
    //nCR = (short)((long)nCR * nOriWidth / nAddWidth );// -> skaliert
    //nCT = (short)((long)nCT * nOriWidth / nAddWidth );// auf Original-ImageSize
    //nCB = (short)((long)nCB * nOriWidth / nAddWidth );

    nWidth  = nCR - nCL;
    nHeight = nCB - nCT;
}   */


// MakeGrafByFlyFmt setzt eine nicht-Zeichengebundene Grafik
SwFrmFmt* SwWW8ImplReader::MakeGrafByFlyFmt( SdrTextObj* pReplaceTextObj,
                                        const SwFrmFmt& rOldFmt, const WW8PicDesc& rPD,
                                        const Graphic* pGraph, const String& rFileName,
                                        const String& rGrName, const SfxItemSet& rGrfSet,
                                        const BOOL bSetToBackground )
{
    SwFrmFmt* pRet = 0;
    if( pReplaceTextObj )
    {
        // SdrGrafObj anstatt des SdrTextObj in dessen Gruppe einsetzen
        SdrObject* pGroupObject = pReplaceTextObj->GetUpGroup();
        if( pGroupObject )
        {
            SdrObjList* pObjectList = pGroupObject->GetSubList();

            // neues Sdr-Grafik-Objekt erzeugen und konfigurieren
            SdrGrafObj* pGrafObj = new SdrGrafObj;

            if( pGraph )
                pGrafObj->SetGraphic( *pGraph );

            if( !pDrawModel )   // 1. GrafikObjekt des Docs
                GrafikCtor();

            pGrafObj->SetModel( pDrawModel );

            pGrafObj->SetLogicRect( pReplaceTextObj->GetBoundRect() );

            pGrafObj->SetLayer( pReplaceTextObj->GetLayer() );


            /*
                schade: Wir koennen bisher keine SdrGrafObjekte mit Umrandung,
                        Schatten oder Hintergrundfuellung,
                        entsprechende Imports aus dem MS-Office muessen daher
                        auf die UEbernahme dieser Attribute verzichten.  :-(

            SfxItemSet aOldSet(pDrawModel->GetItemPool(),
                            // Box
                            XATTR_LINE_FIRST, XATTR_LINE_LAST,
                            // Shadow
                            SDRATTR_SHADOW_FIRST, SDRATTR_SHADOW_LAST,
                            // Fill
                            XATTR_FILL_FIRST, XATTR_FILL_LAST,
                            0 );
            pReplaceTextObj->TakeAttributes( aOldSet, FALSE, TRUE );
            */


            if( rFileName.Len() )
            {
                ((SdrGrafObj*)pGrafObj)->SetFileName( rFileName );
                if( !pGraph )
                    pGrafObj->SetGraphicLink( rFileName, aEmptyStr );
            }
            // altes Objekt raus aus Gruppen-Liste und neues rein
            // (dies tauscht es ebenfalls in der Drawing-Page aus)
            pObjectList->ReplaceObject( pGrafObj, pReplaceTextObj->GetOrdNum() );


            /*
                schade: Wir koennen bisher keine SdrGrafObjekte mit Umrandung,
                        Schatten oder Hintergrundfuellung,
                        entsprechende Imports aus dem MS-Office muessen daher
                        auf die UEbernahme dieser Attribute verzichten.  :-(

            // Attribute aus dem alten SdrTextObjekt am SdrGrafObjekt setzen
            pGrafObj->SetAttributes( aOldSet, FALSE );
            */

        }
        else
        {
            // Riesenmist !!!
            ASSERT( !this, "keine Gruppe ? (wieso dann Ersetzen?)" );

            // wir haben derzeit nur Ersetzen vorgesehen, falls es ein Gruppen-Obj. ist !!!
        }
    }
    else
    {
        SfxItemSet aFlySet( rOldFmt.GetAttrSet() );

        if( bSetToBackground )
            aFlySet.Put( SvxOpaqueItem(RES_OPAQUE, FALSE) );

        // Groesse des alten Frames als Grafik-Groesse nehmen
        aFlySet.Put( SwFmtFrmSize( ATT_FIX_SIZE, rPD.nWidth, rPD.nHeight ) );

        // ggfs. horiz. Positionierungs-Relation korrigieren
        const SwFmtHoriOrient &rHori = rOldFmt.GetHoriOrient();
        if( FRAME == rHori.GetRelationOrient() )
            aFlySet.Put( SwFmtHoriOrient( rHori.GetPos(), HORI_NONE,
                                                          REL_PG_PRTAREA ) );
        // und rein damit ins Doc
        pRet = rDoc.Insert( *pPaM,  rFileName, aEmptyStr,
                            pGraph, &aFlySet,  &rGrfSet );

        // ggfs. fuer eindeutigen Grafik-Namen sorgen
        if( rGrName.Len() )
        {
            String aName;
            if(MakeUniqueGraphName(aName, rGrName))
                pRet->SetName( aName );
        }

        // bei Einfuegen in existierendes Doc: Frames erzeugen:
        if(     rDoc.GetRootFrm()
            &&  (FLY_AT_CNTNT == pRet->GetAnchor().GetAnchorId()) )
            pRet->MakeFrms();
    }
    return pRet;
}


// MakeGrafNotInCntnt setzt eine nicht-Zeichengebundene Grafik
// ( bGrafApo == TRUE )
SwFrmFmt* SwWW8ImplReader::MakeGrafNotInCntnt( const WW8PicDesc& rPD,
                   const Graphic* pGraph, const String& rFileName,
                   const String& rGrName, const SfxItemSet& rGrfSet )
{

    UINT32 nWidth = rPD.nWidth;
    UINT32 nHeight = rPD.nHeight;
//  nWidth += pSFlyPara->nLeMgn + pSFlyPara->nRiMgn;
//            + pSFlyPara->nLeLMgn + pSFlyPara->nRiLMgn;// bei bGrafApo ???
//  nHeight += pSFlyPara->nUpMgn + pSFlyPara->nLoMgn;
//            + pSFlyPara->nUpLMgn + pSFlyPara->nLoLMgn;// bei bGrafApo ???

                        // Vertikale Verschiebung durch Zeilenabstand
    INT32 nNetHeight = nHeight + rPD.nCT + rPD.nCB;
    if( pSFlyPara->nLineSpace && pSFlyPara->nLineSpace > nNetHeight )
        pSFlyPara->nYPos =
            (USHORT)( pSFlyPara->nYPos + pSFlyPara->nLineSpace - nNetHeight );

    WW8FlySet aFlySet( *this, pWFlyPara, pSFlyPara, TRUE );

    SwFmtAnchor aAnchor( pSFlyPara->eAnchor );
    aAnchor.SetAnchor( pPaM->GetPoint() );
    aFlySet.Put( aAnchor );

    aFlySet.Put( SwFmtFrmSize( ATT_FIX_SIZE, nWidth, nHeight ) );

    SwFlyFrmFmt* pFlyFmt = rDoc.Insert( *pPaM,
                    rFileName, aEmptyStr,   // Name der Grafik !!
                    pGraph,
                    &aFlySet,               // Attribute fuer den FlyFrm
                    &rGrfSet );             // Attribute fuer die Grafik
    if( rGrName.Len() )
    {
        String aName;
        if(MakeUniqueGraphName(aName, rGrName))
            pFlyFmt->SetName( aName );
    }

    // Damit die Frames bei Einfuegen in existierendes Doc erzeugt werden:
    if(     rDoc.GetRootFrm()
        &&  (FLY_AT_CNTNT == pFlyFmt->GetAnchor().GetAnchorId()) )
        pFlyFmt->MakeFrms();
    return pFlyFmt;
}


// MakeGrafInCntnt fuegt zeichengebundene Grafiken ein
SwFrmFmt* SwWW8ImplReader::MakeGrafInCntnt( const WW8_PIC& rPic, const WW8PicDesc& rPD,
                       const Graphic* pGraph, const String& rFileName,
                       const String& rGrName, const SfxItemSet& rGrfSet )
{
    WW8FlySet aFlySet( *this, pPaM, rPic, rPD.nWidth, rPD.nHeight );

    SwFrmFmt* pFlyFmt = 0;

    if( !rFileName.Len() && nObjLocFc )     // dann sollte ists ein OLE-Object
        pFlyFmt = ImportOle( pGraph, &aFlySet );


    if( !pFlyFmt )                          // dann eben als Graphic
        pFlyFmt = rDoc.Insert( *pPaM,
                    rFileName, aEmptyStr,   // Name der Grafik !!
                    pGraph,
                    &aFlySet,               // Attribute fuer den FlyFrm
                    &rGrfSet );             // Attribute fuer die Grafik

    if( rGrName.Len() )
    {
        String aName;
        if( MakeUniqueGraphName( aName, rGrName ))
            pFlyFmt->SetName( aName );
    }

    // Grafik im Rahmen ? ok, Rahmen auf Bildgroesse vergroessern
    //  ( nur wenn Auto-Breite )
    if( pSFlyPara )
        pSFlyPara->BoxUpWidth( rPD.nWidth );
    return pFlyFmt;
}

SwFrmFmt* SwWW8ImplReader::ImportGraf1( WW8_PIC& rPic, SvStream* pSt,
                                             ULONG nFilePos )
{
    SwFrmFmt* pRet = 0;
    if( pSt->IsEof() || rPic.fError || rPic.MFP.mm == 99 )
        return pRet;

    String aFileName;
    BOOL bInDoc;
    Graphic* pGraph = 0;
    BOOL bOk = ReadGrafFile( aFileName, pGraph, rPic, pSt, nFilePos, &bInDoc );

    if ( !bOk )
    {   delete pGraph;
        return pRet;                        // Grafik nicht korrekt eingelesen
    }

    WW8PicDesc aPD( rPic );


    SwAttrSet aGrfSet( rDoc.GetAttrPool(), RES_GRFATR_BEGIN, RES_GRFATR_END-1);
    if( aPD.nCL || aPD.nCR || aPD.nCT || aPD.nCB )
    {
        SwCropGrf aCrop( aPD.nCL, aPD.nCR, aPD.nCT, aPD.nCB) ;
        aGrfSet.Put( aCrop );
    }

    if( pWFlyPara && pWFlyPara->bGrafApo )
        pRet = MakeGrafNotInCntnt( aPD, pGraph, aFileName, aEmptyStr, aGrfSet );
    else
        pRet = MakeGrafInCntnt( rPic, aPD, pGraph, aFileName, aEmptyStr, aGrfSet );
    delete pGraph;
    return pRet;
}



BOOL SwWW8ImplReader::WW8QuickHackForMSDFF_DirectBLIPImport(SvStream& rSt,
                                                            WW8_PIC& rPic,
                                                            Graphic& rData,
                                                            String& rGraphName)
{
    BOOL bOk = FALSE;
    ULONG nFilePos = 0;
    ULONG nBLIPLen = 0;
    ULONG nLength;
    ULONG nSpContainerLen;
    ULONG nCode;
    rSt >> nSpContainerLen;

    pMSDffManager->RetrieveNameOfBLIP( rSt,
                                       rGraphName,
                                       nSpContainerLen );
    rSt.SeekRel( nSpContainerLen );
    rSt >> nCode;
    if(0xF0070000 == (nCode & 0xFFFF0000))
    {
        ULONG nLenFBSE;
        rSt >> nLength;

        const ULONG nSkipBLIPLen  = 20; // bis zu nBLIPLen zu ueberspringende Bytes
        const ULONG nSkipShapePos =  4; // dahinter bis zu nShapePos zu skippen
        const ULONG nSkipBLIP           =  4; // dahinter schliesst dann das BLIP an

        nLenFBSE = nLength;

        // ist FBSE gross genug fuer unsere Daten
        BOOL bOk2 = ( nSkipBLIPLen + 4 + nSkipShapePos + 4 <= nLenFBSE );
        if( bOk2 )
        {
            rSt.SeekRel( nSkipBLIPLen );
            rSt >> nBLIPLen;
            rSt.SeekRel( nSkipShapePos );
            rSt >> nFilePos;                        // FilePos des Shape!
            rSt.SeekRel( nSkipBLIP );
            bOk2 = (0 == rSt.GetError());
            nLength -= nSkipBLIPLen+ 4 + nSkipShapePos + 4;
            if( 0 > nLength )
                nLength = 0;
        }
        if( bOk2 )
        {
            // das BLIP Atom steht im Daten Stream unmittelbar hinter dem FBSE
            //
            bOk = pMSDffManager->GetBLIPDirect( rSt, rData );
        }
    }
    return bOk;
}

BOOL SwWW8ImplReader::ImportURL(String &sURL,String &sMark,WW8_CP nStart)
{
    BOOL bRet=FALSE;
    /*
     * Save the reader state and process the sprms for this anchor cp.
     * Doing so will set the nPicLocFc to the offset to find the hypertext
     * data in the data stream.
     */
    WW8_CP nEndCp = nStart+1; //Only interested in the single 0x01 character

    WW8ReaderSave aSave(this,nStart);

    WW8PLCFManResult aRes;
    nStart = pPlcxMan->Where();
    while(nStart <= nEndCp)
    {
        if ( pPlcxMan->Get(&aRes)
            && aRes.pMemPos && aRes.nSprmId )
        {
            //only interested in sprms which would set nPicLocFc
            if ( (68 == aRes.nSprmId) || (0x6A03 == aRes.nSprmId) )
            {
                Read_PicLoc( aRes.nSprmId, aRes.pMemPos+ 1+
                (8 > pWwFib->nVersion ? 0 : 1) + WW8SprmDataOfs(aRes.nSprmId),
                4);
                break;
            }
        }
        (*pPlcxMan)++;
        nStart = pPlcxMan->Where();
    }
    long nOffset = nPicLocFc;
    aSave.Restore(this);

    long nOldPos = pDataStream->Tell();
    WW8_PIC aPic;
    pDataStream->Seek( nOffset);
#ifdef __WW8_NEEDS_COPY
    WW8_PIC_SHADOW aPicS;
    pDataStream->Read( &aPicS, sizeof( aPicS ) );
    WW8PicShadowToReal( &aPicS, &aPic );
#else
    pDataStream->Read( &aPic, sizeof( aPic ) );
#endif
    if((aPic.lcb > 0x44) && !pDataStream->GetError() )
    {
#ifdef DEBUG
        pDataStream->SeekRel( 3 );
        const BYTE MAGIC_A[16] =
        {
            0xd0, 0xc9, 0xea, 0x79, 0xf9, 0xba, 0xce, 0x11,
            0x8c, 0x82, 0x00, 0xaa, 0x00, 0x4b, 0xa9, 0x0b
        };
        BYTE test[16];

        pDataStream->Read( test, 16 );
        ASSERT(!memcmp(MAGIC_A,test,16),
            "Found a different MAGIC_A, cause for concern");
#else
        pDataStream->SeekRel(19);
#endif
        ULONG nLen,nFlags;
        *pDataStream >> nLen;
        ASSERT(nLen == 2,"Wrong flag len, cause for concern");
        *pDataStream >> nFlags;
        /* all bits zero except for the bottom 4 bits which are...
         * 0: always set. bottom bit set to denote a link ?
         * 1: set to denote an absolute link
         * 2: never set ?
         * 3: set to denote an anchor
         */

        const BYTE MAGIC_B[16] =
        {
            0xe0, 0xc9, 0xea, 0x79, 0xf9, 0xba, 0xce, 0x11,
            0x8c, 0x82, 0x00, 0xaa, 0x00, 0x4b, 0xa9, 0x0b
        };
        const BYTE MAGIC_C[18] =
        {
            0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46,
            0x00, 0x00
        };

        BYTE testb[16];
        int nVersion=-1;

        pDataStream->Read( testb, 16 );
        if (memcmp(MAGIC_B,testb,16) == 0)
            nVersion=1;
        else if (memcmp(MAGIC_C,testb,16) == 0)
            nVersion=2;
        else
        {
            ASSERT(!this,"Found neither MAGIC_B or C, cause for concern");
            nVersion=-1;
        }

        switch(nVersion)
        {
            case 1:
                {
                    *pDataStream >> nLen;
                    sURL = WW8Read_xstz( *pDataStream, (USHORT)nLen/2, FALSE );
                    if (nFlags & 0x08)
                    {
                    long pos = pDataStream->Tell();
                    *pDataStream >> nLen;
                    sMark = WW8Read_xstz( *pDataStream, (USHORT)nLen, FALSE );
                    bRet = TRUE;
                    }
                }
                break;
            case 2:
                {
                    pDataStream->SeekRel(2); // skip over the last two bytes
                    *pDataStream >> nLen;
                    pDataStream->SeekRel(nLen); // skip over the 1st filename
                    pDataStream->SeekRel(24); // skip over MAGIC_D

                    *pDataStream >> nLen;   //full len
                    *pDataStream >> nLen;   //real str len
                    pDataStream->SeekRel(2); // skip over the value 00 03
                    sURL = WW8Read_xstz( *pDataStream, (USHORT)nLen/2, FALSE );
                    if (nFlags & 0x08)
                    {
                    *pDataStream >> nLen;
                    sMark = WW8Read_xstz( *pDataStream, (USHORT)nLen, FALSE );
                    bRet = TRUE;
                    }
                }
                break;
        }
    }
    return( bRet );
}


SwFrmFmt* SwWW8ImplReader::ImportGraf( SdrTextObj* pTextObj,
                                       SwFrmFmt* pOldFlyFmt,
                                       BOOL bSetToBackground )
{
    SwFrmFmt* pRet = 0;
    if(    ( ( pStrm == pDataStream ) && !nPicLocFc )
            || ( nIniFlags & WW8FL_NO_GRAF )                )
        return pRet;

    ::SetProgressState( nProgress, rDoc.GetDocShell() );         // Update

    /*
        kleiner Spass von Microsoft: manchmal existiert ein Stream Namens DATA
        Dieser enthaelt dann den PICF und die entsprechende Grafik !!!
        Wir mappen ansonsten die Variable pDataStream auf pStream.
    */

    long nOldPos = pDataStream->Tell();
    WW8_PIC aPic;
    pDataStream->Seek( nPicLocFc );
#ifdef __WW8_NEEDS_COPY
    WW8_PIC_SHADOW aPicS;
    pDataStream->Read( &aPicS, sizeof( aPicS ) );
    WW8PicShadowToReal( &aPicS, &aPic );
#else
    pDataStream->Read( &aPic, sizeof( aPic ) );
#endif // defined __WW8_NEEDS_COPY

        // Plausibilitaetstest ist noetig, da z.B. bei CheckBoxen im
        // Feld-Result ein WMF-aehnliches Struct vorkommt.
    if(     (aPic.lcb >= 58)
            && !pDataStream->GetError() )
    {
        if( pFlyFmtOfJustInsertedGraphic )
        {
            // Soeben haben wir einen Grafik-Link ins Doc inserted.
            // Wir muessen ihn jetzt noch Positioniern und Skalieren.
            //
            WW8PicDesc aPD( aPic );

            WW8FlySet aFlySet( *this, pPaM, aPic, aPD.nWidth, aPD.nHeight );

            pFlyFmtOfJustInsertedGraphic->SetAttr( aFlySet );


            // ACHTUNG: Zuschneiden ist hier noch nicht implementiert!

            // einfach die Crop-Infos bauen und in aFlySet setzen ???
            /*
            if( aPD.nCL || aPD.nCR || aPD.nCT || aPD.nCB )
            {
                SwCropGrf aCrop;
                aCrop.Left()   = aPD.nCL;
                aCrop.Right()  = aPD.nCR;
                aCrop.Top()    = aPD.nCT;
                aCrop.Bottom() = aPD.nCB;
                pFlyFmtOfJustInsertedGraphic->SetAttr( aCrop ); // ? ? ?
            }
            */


            pFlyFmtOfJustInsertedGraphic = 0;
        }
        else if((0x64 == aPic.MFP.mm) || (0x66 == aPic.MFP.mm))
        {
            pDataStream->SeekRel( 2 );
            // Tja, da haben wir wohl ein MSO Drawing File Format am Bein.
            //
            SdrObject* pObject = 0;
            WW8PicDesc aPD( aPic );
            String aGrName;
            if( 0x66 == aPic.MFP.mm )   // verlinkte Grafik im Escher-Objekt
            {                           // ================    =============
                BYTE nNameLen;
                *pDataStream >> nNameLen;
                pDataStream->SeekRel( nNameLen );

                Rectangle aRect( 0,0, aPD.nWidth,  aPD.nHeight);
                SvxMSDffImportData aData( aRect );
                pObject =
//                  pMSDffManager->ImportObjAtCurrentStreamPos(*pDataStream,
//                                                              aData );
                    pMSDffManager->ImportObj(*pDataStream, &aData, &aRect);
                if( pObject )
                {
                    // fuer den Rahmen
                    SfxItemSet aAttrSet( rDoc.GetAttrPool(),
                                         RES_FRMATR_BEGIN,
                                         RES_FRMATR_END-1 );
                    // fuer die Grafik
                    SfxItemSet aGrSet( rDoc.GetAttrPool(),
                                       RES_GRFATR_BEGIN,
                                       RES_GRFATR_END-1 );

                    if( aPD.nCL || aPD.nCR || aPD.nCT || aPD.nCB )
                    {
                        SwCropGrf aCrop( aPD.nCL, aPD.nCR, aPD.nCT, aPD.nCB );
                        aGrSet.Put( aCrop );
                    }

                    SwFrmFmt* pNewFlyFmt = 0;
                    BOOL bTextObjWasGrouped = FALSE;
                    // Groesse aus der WinWord PIC-Struktur als Grafik-Groesse nehmen
                    aAttrSet.Put( SwFmtFrmSize( ATT_FIX_SIZE, aPD.nWidth, aPD.nHeight ) );

                    // ggfs. altes AttrSet uebernehmen und
                    // horiz. Positionierungs-Relation korrigieren
                    if( pOldFlyFmt )
                    {
                        aAttrSet.Put( pOldFlyFmt->GetAttrSet() );
                        const SwFmtHoriOrient &rHori = pOldFlyFmt->GetHoriOrient();
                        if( FRAME == rHori.GetRelationOrient() )
                            aAttrSet.Put( SwFmtHoriOrient( rHori.GetPos(),
                                                          HORI_NONE,
                                                          REL_PG_PRTAREA ) );
                    }

                    XubString aObjectName( pObject->GetName() );
                    if( UINT16( OBJ_OLE2 ) == pObject->GetObjIdentifier() )
                    {
                        SvInPlaceObjectRef xIPRef(
                                    ((SdrOle2Obj*)pObject)->GetObjRef() );

                        // kein GrafSet uebergeben, da nur fuer Cropp sinnvoll,
                        // was die UI derzeit (27.1.99) noch nicht kann khz.
                        pNewFlyFmt = rDoc.Insert( *pPaM, &xIPRef, &aAttrSet );
                    }
                    else
                    {
                        SdrGrafObj* pGraphObject = 0;
                        pGraphObject = PTR_CAST(SdrGrafObj, pObject);
                        if( pGraphObject )
                        {
                            // Nun den Link bzw. die Grafik ins Doc stopfen
                            const Graphic& rGraph = pGraphObject->GetGraphic();
                            BOOL bDone = FALSE;

                            if( pGraphObject->IsLinkedGraphic() )
                            {
                                aGrName = pGraphObject->GetFileName();
                                DirEntry aGrfFileEntry( aGrName );
                                if(    aGrfFileEntry.Exists()
                                    || (GRAPHIC_NONE == rGraph.GetType()))
                                {
                                    if( pOldFlyFmt && pTextObj && pTextObj->GetUpGroup() )
                                    {
                                        bTextObjWasGrouped = TRUE;
                                        /*
                                            Hier *nichts* ins Doc inserten!
                                            ( lediglich in der DrawPage statt
                                              dem Sdr-Text-Objekt einen Grafik-
                                              Link einbauen )
                                        */
                                        pNewFlyFmt= MakeGrafByFlyFmt(
                                                        pTextObj, *pOldFlyFmt,
                                                        aPD, 0, aGrName,
                                                        aEmptyStr, aGrSet,
                                                        bSetToBackground );
                                    }
                                    else
                                        pNewFlyFmt= rDoc.Insert(*pPaM,
                                                                aGrName,
                                                                aEmptyStr,
                                                                0,          // Graphic*
                                                                &aAttrSet,  // SfxItemSet* Rahmen
                                                                &aGrSet );  // SfxItemSet* Grafik
                                    bDone = TRUE;
                                }
                            }

                            if( !bDone )
                                pNewFlyFmt= rDoc.Insert(*pPaM,
                                                        aEmptyStr,
                                                        aEmptyStr,
                                                        &rGraph,
                                                        &aAttrSet,      // SfxItemSet* Rahmen
                                                        &aGrSet );      // SfxItemSet* Grafik

                        }
                    }
                    if( pNewFlyFmt )  // also nur, wenn wir ein *Insert* gemacht haben
                    {
                        pRet = pNewFlyFmt;
                        // mehrfaches Auftreten gleicher Grafik-Namen vermeiden
                        if( aObjectName.Len() )
                        {
                            String aName;
                            if( MakeUniqueGraphName( aName, aObjectName ))
                                pNewFlyFmt->SetName( aName );
                        }
                        // Zeiger auf neues Objekt ermitteln und
                        // Z-Order-Liste entsprechend korrigieren (oder Eintrag loeschen)
                        SdrObject* pOurNewObject = pNewFlyFmt->FindSdrObject();
                        if( !pOurNewObject )
                        {
                            if( !pDrawModel )   // 1. GrafikObjekt des Docs
                                GrafikCtor();

                            SwFlyDrawContact* pContactObject
                                = new SwFlyDrawContact( (SwFlyFrmFmt*)pNewFlyFmt,
                                                        pDrawModel );
                            pOurNewObject = pContactObject->GetMaster();
                        }
                        if( pOurNewObject )
                        {
                            pMSDffManager->ExchangeInShapeOrder( pObject, 0, 0, pOurNewObject );
                            // Das Kontakt-Objekt MUSS in die Draw-Page gesetzt werden,
                            // damit in SwWW8ImplReader::LoadDoc1() die Z-Order
                            // festgelegt werden kann !!!
                            pDrawPg->InsertObject( pOurNewObject );

                            // altes SdrGrafObj aus der Page loeschen und zerstoeren
                            pDrawPg->RemoveObject( pObject->GetOrdNum() );
                            delete pObject;
                        }
                        else
                            pMSDffManager->RemoveFromShapeOrder( pObject );
                    }
                    else
                        pMSDffManager->RemoveFromShapeOrder( pObject );

                    // auch das ggfs. uebergebene alte Sdr-Text-Objekt aus der Page
                    // loeschen, falls nicht gruppiert,
                    if( pTextObj && !bTextObjWasGrouped )
                    {
                        pDrawPg->RemoveObject( pTextObj->GetOrdNum() );
                    }
                }
            }
            else                        // eingebettete Grafik im Escher-Objekt
            {                           // ===================    =============
                Graphic aGraph;
                ULONG nCode;
                *pDataStream >> nCode;
                if(0xF004000F == nCode)
                {
                    if( !WW8QuickHackForMSDFF_DirectBLIPImport(
                                        *pDataStream, aPic, aGraph, aGrName) )
                    {
                        ASSERT( !this, "Wo ist die Grafik ?" );
                    }
                    else
                    {
                        // Positionieren, Skalieren und Zuschneiden des Pictures
                        //
                        SfxItemSet aGrfSet(rDoc.GetAttrPool(), RES_GRFATR_BEGIN,
                                                               RES_GRFATR_END-1);
                        if( aPD.nCL || aPD.nCR || aPD.nCT || aPD.nCB )
                        {
                            SwCropGrf aCrop( aPD.nCL, aPD.nCR, aPD.nCT, aPD.nCB );
                            aGrfSet.Put( aCrop );
                        }
                        if( pOldFlyFmt )
                            pRet = MakeGrafByFlyFmt(pTextObj, *pOldFlyFmt, aPD,
                                                    &aGraph,
                                                    aEmptyStr,
                                                    aGrName,
                                                    aGrfSet, bSetToBackground);
                        else
                            if( pWFlyPara && pWFlyPara->bGrafApo )
                                pRet = MakeGrafNotInCntnt( aPD, &aGraph, aEmptyStr, aGrName, aGrfSet );
                            else
                                pRet = MakeGrafInCntnt( aPic, aPD, &aGraph, aEmptyStr, aGrName, aGrfSet );
                    }
                }
                else
                {
                    // leider verloren...
                    ASSERT( !this, "Wo ist das Shape fuer die Grafik ?" );
                }
            }
        }
        else if(   (aPic.lcb >= 58)
                 && aPic.MFP.xExt
                 && aPic.MFP.yExt )
        {
            pRet = ImportGraf1( aPic, pDataStream, nPicLocFc );
        }
    }
    pDataStream->Seek( nOldPos );
    return pRet;
}

#ifdef __WW8_NEEDS_COPY

void WW8PicShadowToReal( WW8_PIC_SHADOW * pPicS, WW8_PIC * pPic )
{
    pPic->lcb = SVBT32ToLong( pPicS->lcb );
    pPic->cbHeader = SVBT16ToShort( pPicS->cbHeader );
    pPic->MFP.mm = SVBT16ToShort( pPicS->MFP.mm );
    pPic->MFP.xExt = SVBT16ToShort( pPicS->MFP.xExt );
    pPic->MFP.yExt = SVBT16ToShort( pPicS->MFP.yExt );
    pPic->MFP.hMF = SVBT16ToShort( pPicS->MFP.hMF );
    for( USHORT i = 0; i < 14 ; i++ )
        pPic->rcWinMF[i] = SVBT8ToByte( pPicS->rcWinMF[i] );
    pPic->dxaGoal = SVBT16ToShort( pPicS->dxaGoal );
    pPic->dyaGoal = SVBT16ToShort( pPicS->dyaGoal );
    pPic->mx = SVBT16ToShort( pPicS->mx );
    pPic->my = SVBT16ToShort( pPicS->my );
    pPic->dxaCropLeft = SVBT16ToShort( pPicS->dxaCropLeft );
    pPic->dyaCropTop = SVBT16ToShort( pPicS->dyaCropTop );
    pPic->dxaCropRight = SVBT16ToShort( pPicS->dxaCropRight );
    pPic->dyaCropBottom = SVBT16ToShort( pPicS->dyaCropBottom );
    pPic->brcl = pPicS->aBits1[0] & 0x0f;
    pPic->fFrameEmpty = (pPicS->aBits1[0] & 0x10) >> 4;
    pPic->fBitmap = (pPicS->aBits1[0] & 0x20) >> 5;
    pPic->fDrawHatch = (pPicS->aBits1[0] & 0x40) >> 6;
    pPic->fError = (pPicS->aBits1[0] & 0x80) >> 7;
    pPic->bpp = pPicS->aBits2[0];
    for( USHORT j = 0; j < 4; j++ ){
        pPic->rgbrc[j].aBits1[0] = pPicS->rgbrc[j].aBits1[0];
        pPic->rgbrc[j].aBits1[1] = pPicS->rgbrc[j].aBits1[1];
    }
    pPic->dxaOrigin = SVBT16ToShort( pPicS->dxaOrigin );
    pPic->dyaOrigin = SVBT16ToShort( pPicS->dyaOrigin );
}

void WW8FSPAShadowToReal( WW8_FSPA_SHADOW * pFSPAS, WW8_FSPA * pFSPA )
{
    //long nSpId;       //Shape Identifier. Used in conjunction with the office art data (found via fcDggInfo in the FIB) to find the actual data for this shape.
    //long nXaLeft; //left of rectangle enclosing shape relative to the origin of the shape
    //long nYaTop;      //top of rectangle enclosing shape relative to the origin of the shape
    //long nXaRight;    //right of rectangle enclosing shape relative to the origin of the shape
    //long nYaBottom;//bottom of the rectangle enclosing shape relative to the origin of the shape
    //USHORT bHdr:1;
    //USHORT nbx:2;
    //USHORT nby:2;
    //USHORT nwr:4;
    //USHORT nwrk:4;
    //USHORT bRcaSimple:1;
    //USHORT bAnchorLock:1;
    //long nTxbx; //count of textboxes in shape (undo doc only)


    pFSPA->nSpId        = SVBT32ToLong( pFSPAS->nSpId );
    pFSPA->nXaLeft      = SVBT32ToLong( pFSPAS->nXaLeft );
    pFSPA->nYaTop       = SVBT32ToLong( pFSPAS->nYaTop );
    pFSPA->nXaRight     = SVBT32ToLong( pFSPAS->nXaRight );
    pFSPA->nYaBottom    = SVBT32ToLong( pFSPAS->nYaBottom );

    USHORT nBits            = (USHORT)SVBT16ToShort( pFSPAS->aBits1 );

    pFSPA->bHdr         = 0 !=  ( nBits & 0x0001 );
    pFSPA->nbx          =       ( nBits & 0x0006 ) >> 1;
    pFSPA->nby          =       ( nBits & 0x0018 ) >> 3;
    pFSPA->nwr          =       ( nBits & 0x01E0 ) >> 5;
    pFSPA->nwrk         =       ( nBits & 0x1E00 ) >> 9;
    pFSPA->bRcaSimple   = 0 !=  ( nBits & 0x2000 );
    pFSPA->bBelowText   = 0 !=  ( nBits & 0x4000 );
    pFSPA->bAnchorLock  = 0 !=  ( nBits & 0x8000 );
    pFSPA->nTxbx = SVBT32ToLong( pFSPAS->nTxbx );
}
#endif // defined __WW8_NEEDS_COPY


/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ww8/ww8graf2.cxx,v 1.1.1.1 2000-09-18 17:14:58 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.39  2000/09/18 16:04:59  willem.vandorp
      OpenOffice header added.

      Revision 1.38  2000/09/12 13:19:04  kz
      add. include tools/fsys.hxx

      Revision 1.37  2000/08/25 12:27:43  jp
      Graphic Crop-Attribut exported to SVX

      Revision 1.36  2000/08/17 10:24:12  khz
      #77690# prevent division by zero if Picture Size is zero

      Revision 1.35  2000/06/13 08:24:46  os
      using UCB

      Revision 1.34  2000/05/25 08:07:01  khz
      Piece Table optimization, Unicode changes, Bugfixes

      Revision 1.33  2000/05/16 12:12:57  jp
      ASS_FALSE define removed

      Revision 1.32  2000/05/16 11:14:50  khz
      Unicode code-conversion

      Revision 1.31  2000/04/04 16:05:17  hr
      #65293#: WW8PicShadowToReal()

      Revision 1.30  2000/02/21 13:08:19  jp
      #70473# changes for unicode

      Revision 1.29  2000/02/18 09:35:10  cmc
      #69372# Improved Hyperlink Importing for WW97

      Revision 1.28  2000/02/11 14:40:08  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.27  1999/11/19 15:02:46  khz
      Special Task! Use new method to import Shapes: SvxMSDffManager::ImportObj()

      Revision 1.26  1999/08/09 12:16:04  JP
      read W95 format from stream


      Rev 1.25   09 Aug 1999 14:16:04   JP
   read W95 format from stream

      Rev 1.24   06 Aug 1999 18:06:36   KHZ
   Task #65322# Changes in WW8FSPAShadowToReal() (#2)

      Rev 1.23   08 Jun 1999 19:05:50   KHZ
   Task #65322# Changes in WW8FSPAShadowToReal()

      Rev 1.22   02 Jun 1999 09:32:26   KHZ
   Task #66227# a) kein Unicode bei Ver67 ;-)  b) Grafik in grupp. Textbox

      Rev 1.21   26 Apr 1999 17:40:24   KHZ
   Task #61381# Attribute von Textboxen in denen NUR EINE Grafik steht

      Rev 1.20   18 Feb 1999 20:24:38   KHZ
   Task #61659# Umlauf im Hintergrund

      Rev 1.19   17 Feb 1999 15:23:42   KHZ
   Task #61382# jetzt auch Textbox-Grafiken im Hintergrund ( SvxOpaqItem(FALSE) )

      Rev 1.18   12 Feb 1999 16:51:06   KHZ
   Task #61381# Ersetzen von Sdr-Text-Objekten im Writer durch Rahmen (3)

      Rev 1.17   05 Feb 1999 10:32:46   KHZ
   Task #61381# in SdrTextObj verankerte Grafiken und OLEs (5)

      Rev 1.16   28 Jan 1999 17:10:48   KHZ
   Task #60715# in SdrTextObj verankerte Grafiken und OLEs (4)

      Rev 1.15   27 Jan 1999 12:22:40   KHZ
   Task #60715# in SdrTextObj verankerte Grafiken und OLEs (3)

      Rev 1.14   27 Jan 1999 10:58:02   KHZ
   Task #60715# in SdrTextObj verankerte Grafiken und OLEs (2)

      Rev 1.13   25 Jan 1999 10:25:46   KHZ
   Task #60715# in Textobjekt verankerte Grafik als Grafik importieren

      Rev 1.12   30 Nov 1998 17:46:54   JP
   Task #59822#: OLE-Objecte importieren

      Rev 1.11   24 Nov 1998 20:46:22   JP
   Task #59822#: OLE-Objecte einlesen

      Rev 1.10   03 Sep 1998 22:14:22   KHZ
   Task #55189# Textboxen

      Rev 1.9   05 Aug 1998 17:16:24   KHZ
   Task #53614# komprimierte WMF, Enh.Metafile und PICT Grafiken

      Rev 1.8   30 Jul 1998 20:52:38   KHZ
   Task #52607# GPF unter Unix behoben

      Rev 1.7   30 Jul 1998 14:31:34   KHZ
   Task #52607# Grafikimport ueber Quick-Hack auch fuer WMF

      Rev 1.6   30 Jul 1998 00:03:10   KHZ
   Task #53614# Grafiken, die NICHT ueber dem Text liegen (MSDFF-Quick-Hack)

      Rev 1.5   22 Jul 1998 16:16:04   HR
   ww8graf fuer UNX

      Rev 1.4   21 Jul 1998 14:52:10   KHZ
   Task #52607# (WW 97 Import)

      Rev 1.3   21 Jul 1998 12:33:46   KHZ
   als MSDrawingObject eingebettete Grafik (Teil 1)

      Rev 1.2   13 Jul 1998 15:29:16   KHZ
   Task #52607# embeded Grafiken (NICHT UEBER den Text gelegte)

      Rev 1.1   30 Jun 1998 21:33:18   KHZ
   Header/Footer/Footnotes weitgehend ok

      Rev 1.0   16 Jun 1998 11:06:48   KHZ
   Initial revision.

*************************************************************************/




diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx
new file mode 100644
index 0000000..988c30ee
--- /dev/null
+++ b/sw/source/filter/ww8/ww8par.cxx
@@ -0,0 +1,2996 @@
/*************************************************************************
 *
 *  $RCSfile: ww8par.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:58 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PCH
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#define _SVSTDARR_STRINGSDTOR

#ifndef _SOLAR_H
#include <tools/solar.h>
#endif

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _APP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _SVSTOR_HXX //autogen
#include <so3/svstor.hxx>
#endif
#ifndef _SFXDOCINF_HXX //autogen
#include <sfx2/docinf.hxx>
#endif
#ifndef _SVX_TSTPITEM_HXX //autogen
#include <svx/tstpitem.hxx>
#endif
#ifndef _SVX_CSCOITEM_HXX //autogen
#include <svx/cscoitem.hxx>
#endif

#ifndef _SVX_SVDOBJ_HXX
#include <svx/svdobj.hxx>
#endif
#ifndef _SVDPAGE_HXX //autogen
#include <svx/svdpage.hxx>
#endif

#ifndef _SVX_PAPERINF_HXX //autogen
#include <svx/paperinf.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX
#include <svx/lrspitem.hxx> // SvxLRSpaceItem
#endif
#ifndef _MSDFFIMP_HXX
#include <svx/msdffimp.hxx>
#endif

#ifndef _SVX_LANGITEM_HXX //autogen
#include <svx/langitem.hxx>
#endif

#ifndef _SVXMSBAS_HXX
#include <svx/svxmsbas.hxx>
#endif

#ifdef DEBUG
#   ifndef _SOUND_HXX //autogen
#       include <vcl/sound.hxx>
#   endif
#endif

#ifndef _RTL_TENCINFO_H
#include <rtl/tencinfo.h>
#endif
#ifndef _OFA_FLTRCFG_HXX
#include <offmgr/fltrcfg.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif

#ifndef _FMTFTN_HXX //autogen
#include <fmtftn.hxx>
#endif
#ifndef _FMTFLD_HXX
#include <fmtfld.hxx>
#endif
#ifndef _BOOKMRK_HXX
#include <bookmrk.hxx>
#endif
#ifndef _FTNIDX_HXX
#include <ftnidx.hxx>
#endif
#ifndef _REFFLD_HXX
#include <reffld.hxx>
#endif
#ifndef _TXTFTN_HXX //autogen
#include <txtftn.hxx>
#endif
#ifndef _FMTHDFT_HXX //autogen
#include <fmthdft.hxx>
#endif
#ifndef _FMTCNTNT_HXX //autogen
#include <fmtcntnt.hxx>
#endif
#ifndef _FMTCNCT_HXX
#include <fmtcnct.hxx>
#endif
#ifndef _FMTPDSC_HXX //autogen
#include <fmtpdsc.hxx>
#endif
#ifndef _FMTHBSH_HXX //autogen
#include <fmthbsh.hxx>
#endif
#ifndef _FTNINFO_HXX //autogen
#include <ftninfo.hxx>
#endif
#ifndef _WW8PAR2_HXX
#include <ww8par2.hxx>          // class WW8RStyle, class WW8AnchorPara
#endif
#ifndef _WW8PAR_HXX
#include <ww8par.hxx>
#endif
#ifndef _PAM_HXX
#include <pam.hxx>              // fuer SwPam
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _NDTXT_HXX
#include <ndtxt.hxx>            // class SwTxtNode
#endif
#ifndef _PAGEDESC_HXX
#include <pagedesc.hxx>         // class SwPageDesc
#endif
#ifndef _NUMRULE_HXX //autogen
#include <numrule.hxx>
#endif
#ifndef _PARATR_HXX //autogen
#include <paratr.hxx>
#endif
#ifndef _FMTCOL_HXX
#include <fmtcol.hxx>           // ReadFilterFlags
#endif
#ifndef _FMTCLDS_HXX //autogen
#include <fmtclds.hxx>
#endif
#ifndef _SECTION_HXX
#include <section.hxx>
#endif
#ifndef _FMTCLBL_HXX
#include <fmtclbl.hxx>
#endif
#ifndef _FLTINI_HXX
#include <fltini.hxx>           // ReadFilterFlags
#endif
#ifndef _SWDOCSH_HXX //autogen
#include <docsh.hxx>
#endif
#ifndef _DOCUFLD_HXX //autogen
#include <docufld.hxx>
#endif

#ifdef DEBUG
#ifndef _DOCARY_HXX //autogen
#include <docary.hxx>
#endif
#ifndef _FMTANCHR_HXX //autogen
#include <fmtanchr.hxx>
#endif

#endif

#ifndef _MDIEXP_HXX
#include <mdiexp.hxx>           // Progress
#endif
#ifndef _STATSTR_HRC
#include <statstr.hrc>          // ResId fuer Statusleiste
#endif
#ifndef _SWSWERROR_H
#include <swerror.h>            // ERR_WW8_...
#endif


//-----------------------------------------
//              diverses
//-----------------------------------------


#define MM_250 1417             // WW-Default fuer Hor. Seitenraender: 2.5 cm
#define MM_200 1134             // WW-Default fuer u.Seitenrand: 2.0 cm





SwMSDffManager::SwMSDffManager( SwWW8ImplReader& rRdr )
    : SvxMSDffManager( *rRdr.pTableStream,
                        rRdr.pWwFib->fcDggInfo,
                        rRdr.pDataStream, 0, 0,
                        COL_WHITE, 12 /* in Point */,
                        rRdr.pStrm ),
    rReader( rRdr )
{
    const OfaFilterOptions* pOpt = OFF_APP()->GetFilterOptions();
#if SUPD>593
    nSvxMSDffOLEConvFlags = GetFilterFlags();
#endif
}

UINT32 SwMSDffManager::GetFilterFlags()
{
#if SUPD>593
    UINT32 nFlags;
    const OfaFilterOptions* pOpt = OFF_APP()->GetFilterOptions();
    if( pOpt->IsMathType2StarMath() )
        nFlags |= OLE_MATHTYPE_2_STARMATH;
    if( pOpt->IsWinWord2StarWriter() )
        nFlags |= OLE_WINWORD_2_STARWRITER;
    if( pOpt->IsExcel2StarCalc() )
        nFlags |= OLE_EXCEL_2_STARCALC;
    if( pOpt->IsPowerPoint2StarImpress() )
        nFlags |= OLE_POWERPOINT_2_STARIMPRESS;
    return nFlags;
#endif
}
/***************************************************************************
#  Spezial FastSave - Attribute
#**************************************************************************/

#if 0
typedef BYTE Bit256[32];

inline BOOL GetBit( Bit256& rBits, BYTE nBitNo )
{
    return ( rBits[nBitNo >> 3] >> ( nBitNo & 0x7 ) ) & 0x1;
}

inline void SetBit( Bit256& rBits, BYTE nBitNo, BOOL bInp )
{
    if( bInp )
        rBits[nBitNo >> 3] |= 1 << ( nBitNo & 0x7 );
    else
        rBits[nBitNo >> 3] &= ~( 1 << ( nBitNo & 0x7 ) );
}
#endif

void SwWW8ImplReader::Read_StyleCode( USHORT, BYTE* pData, short nLen )
{
    if( nLen < 0 )
    {
        bCpxStyle = FALSE;
        return;
    }
    INT16 nColl = SVBT16ToShort( pData );
    if( (USHORT)nColl < nColls )
    {
        SetTxtFmtCollAndListLevel( *pPaM, pCollA[ nColl ] );
        bCpxStyle = TRUE;
    }
}

// Read_Majority ist fuer Majority ( 103 ) und Majority50 ( 108 )
void SwWW8ImplReader::Read_Majority( USHORT, BYTE* pData, short nLen )
{
    if( nLen < 0 ){
        return;
    }
}

//-----------------------------------------
//           temp. Test
//-----------------------------------------

long SwWW8ImplReader::Read_Piece( WW8PLCFManResult* pRes, BOOL bStartAttr )
{
    if( !bStartAttr )
        return 0;
//  pStrm->Seek( WW8Cp2Fc( pRes->nCp2OrIdx, 0 ) );  // nAktCp   //!!!Mogel
    return 0;
}



//-----------------------------------------
//            Stack
//-----------------------------------------
BOOL SwWW8FltControlStack::IsFtnEdnBkmField(SwFmtFld& rFmtFld, USHORT& nBkmNo)
{
    const SwField* pFld = rFmtFld.GetFld();
    USHORT nSubType;
    return(    pFld
            && (RES_GETREFFLD == pFld->Which())
            && (   (REF_FOOTNOTE == (nSubType = pFld->GetSubType()))
                || (REF_ENDNOTE  == nSubType))
            && ((SwGetRefField*)pFld)->GetSetRefName().Len()
                // find Sequence No of corresponding Foot-/Endnote
            && (USHRT_MAX != (nBkmNo = pDoc->FindBookmark(
                                ((SwGetRefField*)pFld)->GetSetRefName() ))));
}

void SwWW8FltControlStack::NewAttr(const SwPosition& rPos, const SfxPoolItem& rAttr)
{
    USHORT nBkmNo;
    if(    (RES_TXTATR_FIELD == rAttr.Which())
        && IsFtnEdnBkmField((SwFmtFld&)rAttr, nBkmNo) )
    {
        SwFltStackEntry *pTmp = new SwFltStackEntry(rPos, rAttr.Clone());
        Insert(pTmp, Count());
    }
    else
        SwFltControlStack::NewAttr(rPos, rAttr);
}

void SwWW8FltControlStack::SetAttrInDoc(const SwPosition& rTmpPos, SwFltStackEntry* pEntry)
{
    switch( pEntry->pAttr->Which() )
    {
        case RES_LR_SPACE:
        {
            SwPaM aRegion( rTmpPos );
            if (pEntry->MakeRegion(pDoc, aRegion, FALSE))
            {
                SvxLRSpaceItem aLR( *(SvxLRSpaceItem*)pEntry->pAttr );
                BOOL bChange1stLine = 1 == aLR.GetTxtFirstLineOfst();
                ULONG nStart = aRegion.Start()->nNode.GetIndex();
                ULONG nEnd   = aRegion.End()->nNode.GetIndex();
                const SwNumRule* pRule;
                const SwNodeNum* pNum;
                for(; nStart <= nEnd; ++nStart)
                {
                    SwNode* pNode = pDoc->GetNodes()[ nStart ];
                    if( pNode->IsTxtNode() )
                    {
                        if( bChange1stLine )
                        {
                            if(    0 != (pNum = ((SwTxtNode*)pNode)->GetNum() )
                                && (MAXLEVEL > pNum->GetLevel())
                                && 0 != (pRule = ((SwTxtNode*)pNode)->GetNumRule() ) )
                            {
                                const SwNumFmt rNumFmt = pRule->Get( pNum->GetLevel() );
                                aLR.SetTxtFirstLineOfst( rNumFmt.GetFirstLineOffset() );
                            }
                            else
                                aLR.SetTxtFirstLineOfst( 0 );
                        }
                        ((SwCntntNode*)pNode)->SetAttr( aLR );

                        // wenn wir dies nicht tun, ueberschreibt die NumRule uns alle
                        // harten L-Randeinstellungen
                        pNode->SetNumLSpace( FALSE );
                    }
                }
            }
        }
        break;
        case RES_TXTATR_FIELD:
        {
            SwFmtFld& rFmtFld   = *(SwFmtFld*)pEntry->pAttr;
            const SwField* pFld = rFmtFld.GetFld();
            USHORT nBkmNo;
            if( IsFtnEdnBkmField(rFmtFld, nBkmNo) )
            {
                SwBookmark& rBkMrk = pDoc->GetBookmark( nBkmNo );

                const SwPosition& rBkMrkPos = rBkMrk.GetPos();

                SwTxtNode* pTxt = rBkMrkPos.nNode.GetNode().GetTxtNode();
                if( pTxt && rBkMrkPos.nContent.GetIndex() )
                {
                    SwTxtAttr* pFtn = pTxt->GetTxtAttr( rBkMrkPos.nContent.GetIndex()-1,
                                                        RES_TXTATR_FTN );
                    if( pFtn )
                    {
                        USHORT nRefNo = ((SwTxtFtn*)pFtn)->GetSeqRefNo();

                        ((SwGetRefField*)pFld)->SetSeqNo( nRefNo );

                        if( pFtn->GetFtn().IsEndNote() )
                            ((SwGetRefField*)pFld)->SetSubType( REF_ENDNOTE );
                    }
                }
                /*
                const SwStartNode* pSearchNode =
                  rBkMrkPos.nNode.GetNode().FindFootnoteStartNode();

                if( pSearchNode )
                {
                    const SwFtnIdxs& rFtnIdxs = pDoc->GetFtnIdxs();

                    const USHORT nFtnCnt = rFtnIdxs.Count();

                    for(USHORT n = 0; n < nFtnCnt; ++n )
                    {
                        SwTxtFtn* pFtn = rFtnIdxs[ n ];
                        const SwNodeIndex* pSttIdx =
                            ((SwTxtFtn*)pFtn)->GetStartNode();
                        if( pSttIdx &&
                            (pSearchNode ==
                                pSttIdx->GetNode().GetStartNode()) )
                        {
                            USHORT nRefNo = pFtn->SetSeqRefNo();

                            ((SwGetRefField*)pFld)->SetSeqNo( nRefNo );

                        }
                    }
                }
                */
            }
            SwNodeIndex aIdx( pEntry->nMkNode, +1 );
            SwPaM aPaM( aIdx, pEntry->nMkCntnt );
            pDoc->Insert(aPaM, *pEntry->pAttr);
        }
        break;
        default: SwFltControlStack::SetAttrInDoc(rTmpPos, pEntry);
    }
}



//-----------------------------------------
//            Tabs
//-----------------------------------------
#define DEF_TAB_ANZ 13          // So viele Default-Tabs

#if 0           // Nach MA 5.8.96 nicht mehr noetig
void SwWW8ImplReader::SetImplicitTab()
{
    SvxTabStopItem aTabs( *(SvxTabStopItem*)GetFmtAttr( RES_PARATR_TABSTOP ));
    aTabs.Insert( SvxTabStop( 0, SVX_TAB_ADJUST_DEFAULT ) );
    NewAttr( aTabs );
}
#endif

void SwWW8ImplReader::Read_Tab( USHORT nId, BYTE* pData, short nLen )
{
    if( nLen < 0 ){
        pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_PARATR_TABSTOP );
        return;
    }

    // Para L-Space
    short nLeftPMgn    = ( pAktColl ) ? pCollA[nAktColl].nLeftParaMgn
                                      : nLeftParaMgn;

    // Para L-Space OR Left Margin of Para's first line respectively
    short nLeftMostPos = ( pAktColl ) ? pCollA[nAktColl].nTxtFirstLineOfst
                                      : nTxtFirstLineOfst;
    if( 0 < nLeftMostPos )
        nLeftMostPos = 0;

    short i;
    BYTE* pDel = pData + 1;                     // Del - Array
    BYTE nDel = pData[0];
    BYTE* pIns = pData + 2*nDel + 2;            // Ins - Array
    BYTE nIns = pData[nDel*2+1];
    WW8_TBD* pTyp = (WW8_TBD*)(pData + 2*nDel + 2*nIns + 2);// Typ - Array

    SvxTabStopItem aAttr( 0, 0, SVX_TAB_ADJUST_DEFAULT );

    SwTxtFmtColl* pSty = 0;
    USHORT nTabBase;
    if( pAktColl ){                             // StyleDef
        nTabBase = pCollA[nAktColl].nBase;
        if( nTabBase < nColls ){                // Based On
            pSty = (SwTxtFmtColl*)pCollA[nTabBase].pFmt;
        }
    }else{                                      // Text
        nTabBase = nAktColl;
        pSty = (SwTxtFmtColl*)pCollA[nAktColl].pFmt;
    }

    BOOL bFound = FALSE;
    while( pSty && !bFound ){
        const SfxPoolItem* pTabs;
        bFound = pSty->GetAttrSet().GetItemState( RES_PARATR_TABSTOP, FALSE, &pTabs )
                   == SFX_ITEM_SET;
        if( bFound ){
            aAttr = *((const SvxTabStopItem*)pTabs);
        }else{
            if( nTabBase < nColls                   // Based On
                &&  (nTabBase = pCollA[nTabBase].nBase) < nColls )                  // Based On
                pSty = (SwTxtFmtColl*)pCollA[nTabBase].pFmt;
            else
                pSty = 0;                           // gib die Suche auf
        }
    }

    SvxTabStop aTabStop;

    for( i=0; i<nDel; i++ ){
        USHORT nPos = aAttr.GetPos( SVBT16ToShort( pDel + i*2 ) - nLeftPMgn );
        if( nPos != SVX_TAB_NOTFOUND )
            aAttr.Remove( nPos, 1 );
    }
    for( i=0; i<nIns; i++ )
    {
        short nPos = SVBT16ToShort( pIns + i*2 ) - nLeftPMgn;
        if( nPos < nLeftMostPos )
            continue;
        aTabStop.GetTabPos() = nPos;
        switch( SVBT8ToByte( pTyp[i].aBits1 ) & 0x7 ){      // pTyp[i].jc
        case 0: aTabStop.GetAdjustment() = SVX_TAB_ADJUST_LEFT; break;
        case 1: aTabStop.GetAdjustment() = SVX_TAB_ADJUST_CENTER; break;
        case 2: aTabStop.GetAdjustment() = SVX_TAB_ADJUST_RIGHT; break;
        case 3: aTabStop.GetAdjustment() = SVX_TAB_ADJUST_DECIMAL; break;
        case 4: continue;                   // ignoriere Bar
        }

        switch( SVBT8ToByte( pTyp[i].aBits1 ) >> 3 & 0x7 ){ // pTyp[i].tlc
        case 0: aTabStop.GetFill() = ' '; break;
        case 1: aTabStop.GetFill() = '.'; break;
        case 2: aTabStop.GetFill() = '-'; break;
        case 3:
        case 4: aTabStop.GetFill() = '_'; break;
        }

        USHORT nPos2 = aAttr.GetPos( nPos );
        if( nPos2 != SVX_TAB_NOTFOUND )
            aAttr.Remove( nPos2, 1 );       // sonst weigert sich das Insert()

        aAttr.Insert( aTabStop );
    }
    NewAttr( aAttr );
}

//-----------------------------------------
//              DOP
//-----------------------------------------

void SwWW8ImplReader::ImportDop( BOOL bNewDoc )
{
    if( bNewDoc )
    {
        // correct the LastPrinted date in DocumentInfo
        if( rDoc.GetpInfo() )
        {
            DateTime aLastPrinted( WW8ScannerBase::WW8DTTM2DateTime( pWDop->dttmLastPrint ));
            SfxDocumentInfo* pNeuDocInf = new SfxDocumentInfo( *rDoc.GetpInfo() );
            SfxStamp aPrinted( pNeuDocInf->GetPrinted() );
            if( aPrinted.GetTime() != aLastPrinted)
            {
                // check if WW8 date was set
                if( aLastPrinted == DateTime(Date( 0 ), Time( 0 )))
                    // create "invalid" value for SfxStamp
                    // (as seen in sfx2/DOSINF.HXX)
                    aPrinted.SetTime(DateTime(Date( 1, 1, 1601 ), Time( 0, 0, 0 )));
                else
                    aPrinted.SetTime( aLastPrinted );
                pNeuDocInf->SetPrinted( aPrinted );
                rDoc.SetInfo( *pNeuDocInf );
                delete( pNeuDocInf );
            }
        }

        // Import Default-Tabs
        long nDefTabSiz = pWDop->dxaTab;
        if( nDefTabSiz < 56 )
            nDefTabSiz = 709;

        // wir wollen genau einen DefaultTab
        SvxTabStopItem aNewTab( 1, USHORT(nDefTabSiz), SVX_TAB_ADJUST_DEFAULT );
        ((SvxTabStop&)aNewTab[0]).GetAdjustment() = SVX_TAB_ADJUST_DEFAULT;

        rDoc.GetAttrPool().SetPoolDefaultItem( aNewTab );

        // set default language (from FIB)
        rDoc.GetAttrPool().SetPoolDefaultItem(
            SvxLanguageItem( (const LanguageType)pWwFib->lid )  );
    }
}



//-----------------------------------------
//      Fuss- und Endnoten
//-----------------------------------------

WW8ReaderSave::WW8ReaderSave( SwWW8ImplReader* pRdr ,WW8_CP nStartCp)
: aTmpPos(*pRdr->pPaM->GetPoint())
{
    pWFlyPara       = pRdr->pWFlyPara;
    pSFlyPara       = pRdr->pSFlyPara;
    pTableDesc      = pRdr->pTableDesc;
    cSymbol         = pRdr->cSymbol;
    bSymbol         = pRdr->bSymbol;
    bIgnoreText     = pRdr->bIgnoreText;
    bDontCreateSep  = pRdr->bDontCreateSep;
    bHdFtFtnEdn     = pRdr->bHdFtFtnEdn;
    bApo            = pRdr->bApo;
    bTxbxFlySection = pRdr->bTxbxFlySection;
    bTable          = pRdr->bTable ;
    bTableInApo     = pRdr->bTableInApo;
    bAnl            = pRdr->bAnl;
    nAktColl        = pRdr->nAktColl;

                                    // Tracking beginnt neu
    pRdr->bHdFtFtnEdn = TRUE;
    pRdr->bApo = pRdr->bTxbxFlySection
               = pRdr->bTable = bTableInApo = pRdr->bAnl = FALSE;
    pRdr->pWFlyPara = 0;
    pRdr->pSFlyPara = 0;
    pRdr->pTableDesc = 0;

    // schliesse Attribute auf dem End-Stack
    pRdr->pEndStck->SetAttr( *pRdr->pPaM->GetPoint(), 0, FALSE );

    pOldStck = pRdr->pCtrlStck;
    pRdr->pCtrlStck = new SwWW8FltControlStack(&pRdr->rDoc, pRdr->nFieldFlags);

    // rette die Attributverwaltung: dies ist noetig, da der neu anzulegende
    // PLCFx Manager natuerlich auf die gleichen FKPs zugreift, wie der alte
    // und deren Start-End-Positionen veraendert...
    pRdr->pPlcxMan->SaveAllPLCFx( aPLCFxSave );

    pOldPlcxMan = pRdr->pPlcxMan;

    if (nStartCp != -1)
        pRdr->pPlcxMan = new WW8PLCFMan( pRdr->pSBase,
            pOldPlcxMan->GetManType(), nStartCp );
}

void WW8ReaderSave::Restore( SwWW8ImplReader* pRdr )
{
    pRdr->pWFlyPara     = pWFlyPara;
    pRdr->pSFlyPara     = pSFlyPara;
    pRdr->pTableDesc    = pTableDesc;
    pRdr->cSymbol       = cSymbol;
    pRdr->bSymbol       = bSymbol;
    pRdr->bIgnoreText   = bIgnoreText;
    pRdr->bDontCreateSep= bDontCreateSep;
    pRdr->bHdFtFtnEdn   = bHdFtFtnEdn;
    pRdr->bApo          = bApo;
    pRdr->bTxbxFlySection=bTxbxFlySection;
    pRdr->bTable        = bTable ;
    pRdr->bTableInApo   = bTableInApo;
    pRdr->bAnl          = bAnl;
    pRdr->nAktColl      = nAktColl;

    // schliesse alle Attribute, da sonst Attribute
    // entstehen koennen, die aus dem Fly rausragen
    pRdr->pCtrlStck->SetAttr( *pRdr->pPaM->GetPoint(), 0, FALSE );
    pRdr->pEndStck->SetAttr(  *pRdr->pPaM->GetPoint(), 0, FALSE );

    pRdr->DeleteCtrlStk();
    pRdr->pCtrlStck = pOldStck;

    *pRdr->pPaM->GetPoint() = aTmpPos;

    DELETEZ( pRdr->pPlcxMan );

    // restauriere die Attributverwaltung
    pRdr->pPlcxMan = pOldPlcxMan;
    pRdr->pPlcxMan->RestoreAllPLCFx( aPLCFxSave );
}

void SwWW8ImplReader::Read_HdFtFtnText( const SwNodeIndex* pSttIdx, long nStartCp,
                                long nLen, short nType )
{
#if 0
    pEndStck->SetAttr( *pPaM->GetPoint(), 0, FALSE );
    SwWW8FltControlStack* pOldStck = pCtrlStck;
    pCtrlStck = new SwWW8FltControlStack( &rDoc, nFieldFlags );
#endif
    WW8ReaderSave aSave( this );        // rettet Flags u.ae. u. setzt sie zurueck

    pPaM->GetPoint()->nNode = pSttIdx->GetIndex() + 1;      //
    pPaM->GetPoint()->nContent.Assign( pPaM->GetCntntNode(), 0 );

    // dann Text fuer Header, Footer o. Footnote einlesen

    ReadText( nStartCp, nLen, nType );              // Sepx dabei ignorieren
#if 0
    pEndStck->SetAttr( *pPaM->GetPoint(), 0, FALSE );
                        // und zum Schluss Writer-Kram restoren
    aSave.Restore( this );
    DeleteCtrlStk();
    pCtrlStck = pOldStck;
#else
    aSave.Restore( this );
#endif
}

long SwWW8ImplReader::Read_Ftn( WW8PLCFManResult* pRes, BOOL )
{
    BOOL bFtEdOk = FALSE;

    if( nIniFlags & WW8FL_NO_FTN )
        return 0;

    if ( pPaM->GetPoint()->nNode < rDoc.GetNodes().GetEndOfExtras().GetIndex() )
        return 0;       // ignoriere Footnote ausserhalb des normalen Textes

    USHORT nType;
    BOOL bAutoNum = TRUE;
    if( 257 == pRes->nSprmId )
    {
        nType = MAN_EDN;
        if( pPlcxMan->GetEdn() )
            bAutoNum = 0 != *(short*)pPlcxMan->GetEdn()->GetData();
    }
    else
    {
        nType = MAN_FTN;
        if( pPlcxMan->GetFtn() )
            bAutoNum = 0 != *(short*)pPlcxMan->GetFtn()->GetData();
    }

    WW8PLCFxSaveAll aSave;
    pPlcxMan->SaveAllPLCFx( aSave );
    WW8PLCFMan* pOldPlcxMan = pPlcxMan;

    SwFmtFtn aFtn( 257 == pRes->nSprmId ) ;         // erzeuge Fussnote
    rDoc.Insert( *pPaM, aFtn );

    SwPosition aTmpPos( *pPaM->GetPoint() );    // merke alte Cursorposition

    pPaM->Move( fnMoveBackward, fnGoCntnt );    // hole Index auf Fussnoteninhalt
    SwTxtNode* pTxt = pPaM->GetNode()->GetTxtNode();
    SwTxtAttr* pFN = pTxt->GetTxtAttr( pPaM->GetPoint()->nContent.GetIndex(),
                                        RES_TXTATR_FTN );
    ASSERT(pFN, "Probleme beim Anlegen des Fussnoten-Textes");
    if( pFN )
    {
        const SwNodeIndex* pSttIdx = ((SwTxtFtn*)pFN)->GetStartNode();
        ASSERT(pSttIdx, "Probleme beim Anlegen des Fussnoten-Textes");

        ((SwTxtFtn*)pFN)->SetSeqNo( rDoc.GetFtnIdxs().Count() );

        BOOL bOld = bFtnEdn;
        bFtnEdn = TRUE;

        // read content of Ft-/End-Note
        Read_HdFtFtnText( pSttIdx, pRes->nCp2OrIdx, pRes->nMemLen, nType );
        bFtEdOk = TRUE;
        bFtnEdn = bOld;

        // falls keine automatische Numerierung eingestellt ist, so hole
        // das 1. Zeichen aus der Fuss-/End-Note und setze das als Zeichen
        if( !bAutoNum )
        {
            SwNodeIndex& rNIdx = pPaM->GetPoint()->nNode;
            rNIdx = pSttIdx->GetIndex() + 1;
            SwTxtNode* pTNd = rNIdx.GetNode().GetTxtNode();
            if( pTNd )
            {
                String sNo( pTNd->GetTxt().GetChar( 0 ));
                ((SwTxtFtn*)pFN)->SetNumber( 0, &sNo );
                pPaM->GetPoint()->nContent.Assign( pTNd, 0 );
                pPaM->SetMark();
                pPaM->GetMark()->nContent++;
                rDoc.Delete( *pPaM );
                pPaM->DeleteMark();
            }
        }
    }
    *pPaM->GetPoint() = aTmpPos;                // restore Cursor

    pPlcxMan = pOldPlcxMan;             // Attributverwaltung restoren
    pPlcxMan->RestoreAllPLCFx( aSave );

    if( bSymbol )
    {
        pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_CHRATR_FONT );
        bSymbol = FALSE;
    }

    // insert Section to get this Ft-/End-Note at the end of the section,
    // when there is no open section at the moment
       if( bFtEdOk && pLastPgDeskIdx && !pBehindSection )
    {
        const SwNodeIndex aOrgLastPgDeskIdx( *pLastPgDeskIdx );

        (*pLastPgDeskIdx)++;
        SwPosition aSectStart( *pLastPgDeskIdx );
        aSectStart.nContent.Assign( pLastPgDeskIdx->GetNode().GetCntntNode(), 0 );

        SwPaM aSectPaM( aSectStart, *pPaM->GetPoint() );
        InsertSectionWithWithoutCols( aSectPaM, 0 );
        pPaM->Move( fnMoveBackward );
        DELETEZ( pLastPgDeskIdx );
        // set attributes to correct position
        pCtrlStck->MoveAttrsToNextNode( aOrgLastPgDeskIdx );
    }

    return 1;       // das Fussnotenzeichen ueberlesen!
}

// JP 03.12.98 - Anmerkungen einlesen
// - Als default wird erstmal das Initial als Author benutzt. Im Writer wird
//  auch immer das Initial benutzt!
#undef AUTHOR_AS_AUTHOR
#define INITIAL_AS_AUTHOR

long SwWW8ImplReader::Read_And( WW8PLCFManResult* pRes, BOOL )
{
    WW8PLCFx_SubDoc* pSD = pPlcxMan->GetAtn();
    if( !pSD )
        return 0;

    String sAuthor;
    if( bVer67 )
    {
        const WW67_ATRD* pDescri = (WW67_ATRD*)pSD->GetData();
#ifdef AUTHOR_AS_AUTHOR
        const String* pA = GetAnnotationAuthor( SVBT16ToShort( pDescri->ibst ) );
        if( pA )
            sAuthor = *pA;
#endif

#ifdef INITIAL_AS_AUTHOR
        sAuthor = String( pDescri->xstUsrInitl + 1,
                        (USHORT)pDescri->xstUsrInitl[0] );
#endif
    }
    else
    {
        const WW8_ATRD* pDescri = (const WW8_ATRD*)pSD->GetData();

#ifdef AUTHOR_AS_AUTHOR
        const String* pA = GetAnnotationAuthor( SVBT16ToShort( pDescri->ibst ) );
        if( pA )
            sAuthor = *pA;
#endif

#ifdef INITIAL_AS_AUTHOR
        BYTE nLen = (BYTE)SVBT16ToShort( pDescri->xstUsrInitl[0] );
        String aTmp;
        sal_Unicode* pData = aTmp.AllocBuffer( nLen );
        sal_Unicode* pWork = pData;

        for( BYTE nIdx = 1; nIdx <= nLen; ++nIdx, ++pWork )
            *pWork = SVBT16ToShort( pDescri->xstUsrInitl[ nIdx ] );
//      {
//          UINT16 nChar = SVBT16ToShort( pDescri->xstUsrInitl[ nIdx ] );
//          if( 0xF000 == (nChar & 0xFF00))
//              nChar &= 0x00FF;
//          *pWStr = nChar;
//      }
//      sAuthor = String( aTmp, CHARSET_ANSI );     // ANSI???

// 2000/03/30 KHZ UNICODE
// still missing: unicode-back conversion AND 0xF0.. specials

#endif
    }

    WW8PLCFxSaveAll aSave;
    pPlcxMan->SaveAllPLCFx( aSave );
    WW8PLCFMan* pOldPlcxMan = pPlcxMan;

    SwNodeIndex aNdIdx( rDoc.GetNodes().GetEndOfExtras() );
    aNdIdx = *rDoc.GetNodes().MakeTextSection( aNdIdx, SwNormalStartNode,
                            rDoc.GetTxtCollFromPool( RES_POOLCOLL_STANDARD ));

    SwPosition aTmpPos( *pPaM->GetPoint() );    // merke alte Cursorposition
    Read_HdFtFtnText( &aNdIdx, pRes->nCp2OrIdx, pRes->nMemLen, MAN_AND );
                                                // lese Inhalt ein
    *pPaM->GetPoint() = aTmpPos;                // restore Cursor

    // erzeuge das PostIt
    Date aDate;
    String sTxt;


    {   // Text aus den Nodes in den String uebertragen
        SwNodeIndex aIdx( aNdIdx, 1 ),
                    aEnd( *aNdIdx.GetNode().EndOfSectionNode() );
        SwTxtNode* pTxtNd;
        while( aIdx != aEnd )
        {
            if( 0 != ( pTxtNd = aIdx.GetNode().GetTxtNode() ))
            {
                if( sTxt.Len() )
                    sTxt += '\x0a';     // Zeilenumbruch
                sTxt += pTxtNd->GetExpandTxt();
            }
            aIdx++;
        }
        rDoc.DeleteSection( &aNdIdx.GetNode() );
    }

    rDoc.Insert( *pPaM, SwFmtFld( SwPostItField(
                    (SwPostItFieldType*)rDoc.GetSysFldType( RES_POSTITFLD ),
                    sAuthor, sTxt, aDate )));

    pPlcxMan = pOldPlcxMan;             // Attributverwaltung restoren
    pPlcxMan->RestoreAllPLCFx( aSave );
    return 0;
}

//-----------------------------------------
//      Header und Footer
//-----------------------------------------

void SwWW8ImplReader::Read_HdFtText( long nStartCp, long nLen, SwPageDesc* pPD,
                             BOOL bUseLeft, BOOL bFooter )
{
    SwFrmFmt* pFmt = ( bUseLeft ) ? &pPD->GetLeft() : &pPD->GetMaster();
    SwFrmFmt* pHdFtFmt;

    if( bFooter ){
        bIsFooter = TRUE;
        pFmt->SetAttr( SwFmtFooter( TRUE ) );
        pHdFtFmt = (SwFrmFmt*)pFmt->GetFooter().GetFooterFmt();
    }else{
        bIsHeader = TRUE;
        pFmt->SetAttr( SwFmtHeader( TRUE ) );
        pHdFtFmt = (SwFrmFmt*)pFmt->GetHeader().GetHeaderFmt();
    }

    const SwNodeIndex* pSttIdx = pHdFtFmt->GetCntnt().GetCntntIdx();
    if( !pSttIdx ) return;

    SwPosition aTmpPos( *pPaM->GetPoint() );    // merke alte Cursorposition

    Read_HdFtFtnText( pSttIdx, nStartCp, nLen - 1, MAN_HDFT );

    *pPaM->GetPoint() = aTmpPos;
    bIsHeader = bIsFooter = FALSE;
}

BYTE SwWW8ImplReader::HdFtCorrectPara( BYTE nPara )
{
    WW8_CP start;
    long nLen;
    BYTE nNewPara = nPara;

    for( BYTE nI = 0x20; nI; nI >>= 1 )
        if(     ( nI & nPara )
            &&  pHdFt
            &&  ( !pHdFt->GetTextPos( nPara, nI, start, nLen ) || nLen <= 2 ) )

        {
            nNewPara &= ~nI;        // leere KF-Texte nicht anlegen
        }

// Wenn im Doc keine Facing Pages vorhanden sind, sollen
// die geraden Header/Footer ignoriert werden.
// Die Facing Pages lassen sich nur Doc-weit,
// nicht aber abschnittsweise umschalten !
    if( pWDop->fFacingPages )
    {       // Wenn pDoc->FacingPages
//      if( nNewPara & WW8_HEADER_ODD )     // und ungerader Header vorhanden
//          nNewPara |= WW8_HEADER_EVEN;        // ... dann muss auch ein gerader
                                            // Header erzeugt werden
//      if( nNewPara & WW8_FOOTER_ODD )     // Footer ebenso.
//          nNewPara |= WW8_FOOTER_EVEN;
    }
    else
    {
        nNewPara &= ~( WW8_HEADER_EVEN |  WW8_FOOTER_EVEN ); // ergibt bEven = 0
    }
    return nNewPara;
}

void SwWW8ImplReader::Read_HdFt1( BYTE nPara, BYTE nWhichItems, SwPageDesc* pPD )
{
    if( pHdFt )
    {
        WW8_CP start;
        long nLen;
        BYTE nNumber = 5;

        for( BYTE nI = 0x20; nI; nI >>= 1, nNumber-- )
            if( nI & nWhichItems )
            {
                BOOL bOk = TRUE;
                if( bVer67 )
                    bOk = ( pHdFt->GetTextPos( nPara, nI, start, nLen ) && nLen > 2 );
                else
                {
                    pHdFt->GetTextPosExact(nNumber+ (nActSectionNo+1)*6, start, nLen);
                    bOk = ( 2 < nLen );
                }
                if( bOk )
                {
                    BOOL bUseLeft
                        = (nI & ( WW8_HEADER_EVEN | WW8_FOOTER_EVEN )) ? TRUE : FALSE;
                    BOOL bFooter
                        = (nI & ( WW8_FOOTER_EVEN | WW8_FOOTER_ODD | WW8_FOOTER_FIRST )) ? TRUE : FALSE;
                    Read_HdFtText( start, nLen, pPD, bUseLeft, bFooter );
                }
            }
    }
}

static BYTE ReadBSprm( const WW8PLCFx_SEPX* pSep, USHORT nId, BYTE nDefaultVal )
{
    BYTE* pS = pSep->HasSprm( nId );            // sprm da ?
    BYTE nVal = ( pS ) ? SVBT8ToByte( pS ) : nDefaultVal;
    return nVal;
}

void SwWW8ImplReader::SetHdFt( SwPageDesc* pPageDesc0, SwPageDesc* pPageDesc1,
                               const WW8PLCFx_SEPX* pSep, BYTE nIPara )
{
    if( !nCorrIhdt || ( pAktColl != 0 ) )   // Header / Footer nicht da
                                            // oder StyleDef
        return;

    long nOldDoc = pStrm->Tell(     );      // WW-Scanner: alles retten
    long nOldTbl = pTableStream->Tell();    // WW-Scanner: alles retten
    WW8PLCFxSaveAll aSave;
    pPlcxMan->SaveAllPLCFx( aSave );        // Attributverwaltung sichern
    WW8PLCFMan* pOldPlcxMan = pPlcxMan;

    if( !pPageDesc1 ){          // 1 Pagedesc reicht

        Read_HdFt1( nIPara,
                    nCorrIhdt & ~( WW8_HEADER_FIRST | WW8_FOOTER_FIRST ),
                    pPageDesc0 );

    }else{                      // 2 Pagedescs noetig: 1.Seite und folgende


                                // 1. Seite einlesen
        Read_HdFt1( nIPara,
                    nCorrIhdt & ( WW8_HEADER_FIRST | WW8_FOOTER_FIRST ),
                    pPageDesc0 );

                                // Folgeseiten einlesen
        Read_HdFt1( nIPara,
                    nCorrIhdt & ~( WW8_HEADER_FIRST | WW8_FOOTER_FIRST ),
                    pPageDesc1 );
    }
                                // dann WW-Scanner-Kram restoren
    pPlcxMan = pOldPlcxMan;             // Attributverwaltung restoren
    pPlcxMan->RestoreAllPLCFx( aSave );
    pStrm->Seek(      nOldDoc );                // FilePos dito (Sprms)
    pTableStream->Seek( nOldTbl );              // FilePos dito (Sprms)
}

//-----------------------------------------
//          PageDescs
//-----------------------------------------


void SwWW8ImplReader::SetLastPgDeskIdx()
{
    if(    0 == pWDop->epc      // store NodeIndex for adding section when FT-/End-Note
        || 2 == pWDop->fpc )    // found that shall be on end of section.
    {
        if(  pLastPgDeskIdx )
            *pLastPgDeskIdx = pPaM->GetPoint()->nNode;
        else
            pLastPgDeskIdx = new SwNodeIndex( pPaM->GetPoint()->nNode );
        (*pLastPgDeskIdx)--;
    }
}


SwPageDesc* SwWW8ImplReader::CreatePageDesc( SwPageDesc* pFirstPageDesc,
                                             SwPaM** ppPaMWanted )
{
    ASSERT( pFirstPageDesc || ppPaMWanted, "!pFirstPageDesc but NO ppPaMWanted" );


    BOOL bFollow = ( pFirstPageDesc != 0 );
    SwPageDesc* pNewPD;
    USHORT nPos;

    if(    bFollow
        && pFirstPageDesc->GetFollow() != pFirstPageDesc )
        return pFirstPageDesc;      // Fehler: hat schon Follow

    // compose name of PageDescriptor
    String aNm( WW8_ASCII2STR( "Konvert " ) );
    if ( bFollow )
        aNm.AppendAscii( "Folge" );
    USHORT nPageDescCount = rDoc.GetPageDescCnt();
    aNm += String::CreateFromInt32( nPageDescCount );

    nPos = rDoc.MakePageDesc( aNm,
                        bFollow // && (pFirstPageDesc != &rDoc._GetPageDesc( 0 ))
                        ? pFirstPageDesc
                        : 0 );
    pNewPD = &rDoc._GetPageDesc( nPos );

    if ( bFollow ){             // Dieser ist der folgende von pPageDesc
        pFirstPageDesc->SetFollow( pNewPD );
        pNewPD->SetFollow( pNewPD );
    }
    else
    {                       // setze PgDesc-Attr ins Doc
        if( bApo || bTxbxFlySection )
        {               // PageDesc *muss* ausserhalb des Apo stehen
            if( pSFlyPara && pSFlyPara->pMainTextPos )
            {
                SwPaM aMyPaM( *pSFlyPara->GetMainTextPos() );
                if( 1 < nPageDescCount )
                    rDoc.AppendTxtNode( *aMyPaM.GetPoint() );
                SwFmtCol* pCol;
                RemoveCols(  *pNewPD, pCol );
                rDoc.Insert( aMyPaM, SwFmtPageDesc( pNewPD ) );
                if( ppPaMWanted )
                    *ppPaMWanted = new SwPaM( aMyPaM );
                if( pCol )
                {
                    InsertSectionWithWithoutCols( aMyPaM, pCol );
                    delete pCol;
                }
                else
                    SetLastPgDeskIdx();
            }
        }
        else
        {
            if( 0 < pPaM->GetPoint()->nContent.GetIndex() )
                rDoc.AppendTxtNode( *pPaM->GetPoint() );
            SwFmtCol* pCol;
            RemoveCols(  *pNewPD, pCol );
            if( ppPaMWanted )
                *ppPaMWanted = new SwPaM( *pPaM );

            rDoc.Insert( *pPaM, SwFmtPageDesc( pNewPD ) );
            if( pCol )
            {
                InsertSectionWithWithoutCols( *pPaM, pCol );
                delete pCol;
            }
            else
                SetLastPgDeskIdx();
        }
    }
    return pNewPD;
}

// UpdatePageDescs muss am Ende des Einlesevorganges aufgerufen werden, damit
// der Writer den Inhalt der Pagedescs wirklich akzeptiert
void SwWW8ImplReader::UpdatePageDescs( USHORT nPageDescOffset )
{
    USHORT i;

    // Pagedescriptoren am Dokument updaten (nur so werden auch die
    // linken Seiten usw. eingestellt).

    // PageDesc "Standard"
    rDoc.ChgPageDesc( 0, rDoc.GetPageDesc( 0 ));

    // PageDescs "Konvert..."
    for ( i=nPageDescOffset; i < rDoc.GetPageDescCnt(); i++ )
    {
        const SwPageDesc* pPD = &rDoc.GetPageDesc( i );
        rDoc.ChgPageDesc( i, *pPD );
    }
}

//-----------------------------------------
//              Text
//-----------------------------------------

// TestApo() ist die aus ProcessSpecial() herausgeloeste Apo-Abfrage.
// sie wird auch beim Aufbau der Tabellen-Struktur (ww8par6.cxx)
// verwendet.
// Die Parameter rbStartApo, rbStopApo und rbNowStyleApo sind reine
// Rueckgabeparameter
BYTE* SwWW8ImplReader::TestApo( BOOL& rbStartApo, BOOL& rbStopApo,
                                BOOL& rbNowStyleApo,
                                BOOL  bInTable,   BOOL bTableRowEnd,
                                BOOL  bStillInTable )
{
    BYTE* pSprm37;
    BYTE* pSprm29;
    rbNowStyleApo = (0 != pCollA[nAktColl].pWWFly); // Apo in StyleDef

    if( bInTable && rbNowStyleApo )
    {
        pSprm37       = 0;
        pSprm29       = 0;
        rbNowStyleApo = FALSE;
    }
    else
    {
        pSprm37 = pPlcxMan->HasParaSprm( bVer67 ? 37 : 0x2423 );
        pSprm29 = pPlcxMan->HasParaSprm( bVer67 ? 29 : 0x261B );
    }

    // here Apo
    BOOL bNowApo = rbNowStyleApo || pSprm29 || pSprm37;
    BOOL bApoContinuedInTabCell2ndParagraph
            = (bApo && bTableInApo && bStillInTable) && !bNowApo;
    bNowApo |= bApoContinuedInTabCell2ndParagraph;

    rbStartApo = bNowApo && !bApo && !bTableRowEnd; // normal APO-start
    rbStopApo  = bApo && !bNowApo && !bTableRowEnd; // normal APO-end

    if( bApo && bNowApo && !bTableRowEnd
        && !bApoContinuedInTabCell2ndParagraph
        && !TestSameApo( pSprm29, rbNowStyleApo ) )
    {
        rbStopApo = rbStartApo = TRUE;              // aneinandergrenzende APOs
    };
    return pSprm29;
}

BOOL SwWW8ImplReader::ProcessSpecial( BOOL bAllEnd, BOOL* pbReSync )    // Apo / Table / Anl
{
    *pbReSync = FALSE;
    if( bAllEnd ){
        if( bAnl )
            StopAnl();                  // -> bAnl = FALSE
        if( bTable && !bFtnEdn )        // Tabelle in FtnEdn nicht erlaubt
            StopTable();
        if( bApo )
            StopApo();
        bTable = bApo = FALSE;
        return FALSE;
    }

    BOOL bTableRowEnd = ( pPlcxMan->HasParaSprm( ( bVer67 ? 25 : 0x2417 )) != 0 );  // TabRowEnd

// es muss leider fuer jeden Absatz zuerst nachgesehen werden,
// ob sich unter den sprms
// das sprm 29 (bzw. 0x261B) befindet, das ein APO einleitet.
// Alle weiteren sprms  beziehen sich dann naemlich auf das APO und nicht
// auf den normalen Text drumrum.
// Dasselbe gilt fuer eine Tabelle ( sprm 24 (bzw. 0x2416) )
// und Anls ( sprm 13 ).
// WW: Tabelle in APO geht ( Beide Anfaende treten gleichzeitig auf )
// WW: APO in Tabelle geht nicht
// d.h. Wenn eine Tabelle Inhalt eines Apo ist, dann muss der
// Apo-Anfang zuerst bearbeitet werden, damit die Tabelle im Apo steht
// und nicht umgekehrt. Am Ende muss dagegen zuerst das Tabellenende
// bearbeitet werden, da die Apo erst nach der Tabelle abgeschlossen
// werden darf ( sonst wird das Apo-Ende nie gefunden ).
// Dasselbe gilt fuer Fly / Anl, Tab / Anl, Fly / Tab / Anl.
//
// Wenn die Tabelle in einem Apo steht, fehlen im TabRowEnd-Bereich
// die Apo-Angaben. Damit hier die Apo nicht beendet wird, wird
// ProcessApo dann nicht aufgerufen.

// KHZ: When there is a table inside the Apo the Apo-flags are also
//      missing for the 2nd, 3rd... paragraphs of each cell.


//  1st look for in-table flag
    BYTE* pSprm24 = pPlcxMan->HasParaSprm(  bVer67
                                          ? 24
                                          : 0x2416 ); // Flag: Absatz in(!) Tabelle

//  then look if we are in an Apo

    BOOL bStartApo, bStopApo, bNowStyleApo;
    BYTE* pSprm29 = TestApo( bStartApo, bStopApo, bNowStyleApo,
                                bTable, (bTableRowEnd && bTableInApo),
                                bTable && (pSprm24 != 0) );

//  look if we are in a Tabelle

    BOOL bStartTab = pSprm24 && !bTable && !bFtnEdn; // Table in FtnEdn nicht erlaubt

    BOOL bStopTab = bTable && (bWasTabRowEnd && !pSprm24) && !bFtnEdn;

    bWasTabRowEnd = FALSE;  // must be deactivated right here to prevent next
                            // WW8TabDesc::TableCellEnd() from making nonsense

    if( bTable && !bStopTab && ( bStartApo || bStopApo ) )
    {                                   // Wenn Apowechsel in Tabelle
        bStopTab = bStartTab = TRUE;    // ... dann auch neue Tabelle
    }

//          Dann auf Anl (Nummerierung) testen
//          und dann alle Ereignisse in der richtigen Reihenfolge bearbeiten

    if( bAnl && !bTableRowEnd )
    {
        BYTE* pSprm13 = pPlcxMan->HasParaSprm( 13 );
        if( pSprm13 )
        {                                   // Noch Anl ?
            BYTE nT = GetNumType( *pSprm13 );
            if( ( nT != WW8_Pause && nT != nWwNumType ) // Anl-Wechsel
                || bStopApo  || bStopTab                // erzwungenes Anl-Ende
                || bStartApo || bStartTab )
            {
                StopAnl();          // Anl-Restart ( = Wechsel ) ueber sprms
            }
            else
            {
                NextAnlLine( pSprm13 );                 // naechste Anl-Zeile
            }
        }
        else
        {                                           // Anl normal zuende
            StopAnl();                                  // Wirkliches Ende
        }
    }
    if( bStopTab )
    {
        StopTable();
        bTable = FALSE;
    }
    if( bStopApo )
    {
        StopApo();
        bApo = FALSE;
    }

    if( bStartApo && !( nIniFlags & WW8FL_NO_APO ) )
    {
        bApo = StartApo( pSprm29, bNowStyleApo );
        *pbReSync = TRUE;                   // nach StartApo ist ein ReSync
                                            // noetig ( eigentlich nur, falls
                                            // die Apo ueber eine FKP-Grenze
                                            // geht
    }
    if( bStartTab && !( nIniFlags & WW8FL_NO_TABLE ) ){
        if( bAnl )                          // Nummerierung ueber Zellengrenzen
            StopAnl();                      // fuehrt zu Absturz -> keine Anls
                                            // in Tabellen
        bTable = StartTable();
        *pbReSync = TRUE;                   // nach StartTable ist ein ReSync
                                            // noetig ( eigentlich nur, falls
                                            // die Tabelle ueber eine
                                            // FKP-Grenze geht
        bTableInApo = bTable && bApo;
    }
    return bTableRowEnd;
}


#if defined OS2
// eigentlich besser inline, aber das kann der BLC nicht
static UCHAR ConvOs2( UCHAR ch, CharSet eDst )
{
    switch( ch ){
    case 132:
    case 148: return ( eDst == CHARSET_IBMPC_865 ) ? '"' : 175;
                            // typographische "(links) gegen aehnliche
                            // im OS/2-Charset
    case 147: return ( eDst == CHARSET_IBMPC_865 ) ? '"' : 174;
    case 173:               // kurze, mittellange und lange Striche gegen Minus
    case 150:
    case 151: return  '-';
    case 130: return ',';
    case 145:
    case 146: return '\'';  // typographische ' gegen normale
    case 139: return '<';
    case 155: return '>';
    case 152: return '~';
    }                       // ansonsten macht noch TM AErger.

    return 0;               // kenn ick nich
}
#endif

// Returnwert: TRUE fuer keine Sonderzeichen
BOOL SwWW8ImplReader::ReadPlainChars( long& rPos, long nEnd, long nCpOfs )
{
    // Unicode-Flag neu setzen und notfalls File-Pos korrigieren
    // merke: Seek kostet nicht viel, da inline geprueft wird,
    //        ob die korrekte FilePos nicht schon erreicht ist.
    WW8_FC nStreamPos = pSBase->WW8Cp2Fc(nCpOfs+rPos, &bIsUnicode);
    pStrm->Seek( nStreamPos );

    // ammount of characters to read == length to next attribut
    ULONG nLen = nEnd - rPos;

    CharSet eSrcCharSet = ( eHardCharSet != RTL_TEXTENCODING_DONTKNOW )
                        ? eHardCharSet
                        : eFontSrcCharSet;

    // (re)alloc UniString data
    String sPlainCharsBuf;

    sal_Unicode* pWork = sPlainCharsBuf.AllocBuffer( nLen );

    // read the stream data
    BYTE   nBCode;
    UINT16 nUCode;
    for( ULONG nL2 = 0; nL2 < nLen; ++nL2, ++pWork )
    {
        if( bIsUnicode )
            *pStrm >> nUCode;   // unicode  --> read 2 bytes
        else
        {
            *pStrm >> nBCode;   // old code --> read 1 byte
            nUCode = nBCode;
        }

        if( 0 != pStrm->GetError() )
        {
            rPos = LONG_MAX-10;     // -> eof or other error
            sPlainCharsBuf.ReleaseBufferAccess( 0 );
            return TRUE;
        }

        if( (32 > nUCode) || (0xa0 == nUCode) )
        {
            pStrm->SeekRel( bIsUnicode ? -2 : -1 );
            sPlainCharsBuf.ReleaseBufferAccess( nL2 );
            break;              // Sonderzeichen < 32, == 0xa0 gefunden
        }

        if( bIsUnicode )
            *pWork = nUCode;
        else
            *pWork = ByteString::ConvertToUnicode( nBCode, eSrcCharSet );
    }
    if( sPlainCharsBuf.Len() )
        rDoc.Insert( *pPaM, sPlainCharsBuf );

    rPos += nL2;
    return nL2 >= nLen;
}


// Returnwert: TRUE fuer Zeilenende
BOOL SwWW8ImplReader::ReadChars( long& rPos, long nNextAttr, long nTextEnd, long nCpOfs )
{
    long nEnd = ( nNextAttr < nTextEnd ) ? nNextAttr : nTextEnd;

    if( bSymbol || bIgnoreText )
    {
        if( bSymbol )   // Spezialzeichen einfuegen
        {
            for(USHORT nCh = 0; nCh < nEnd - rPos; ++nCh)
                rDoc.Insert( *pPaM, cSymbol );
            pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_CHRATR_FONT );
        }
        pStrm->SeekRel( nEnd- rPos );
        rPos = nEnd;    // ignoriere bis Attributende
        return FALSE;
    }
    while( TRUE )
    {
        if( ReadPlainChars( rPos, nEnd, nCpOfs ) )
            return FALSE;                   // Fertig, kein CR

        BOOL bStartLine = ReadChar( rPos, nCpOfs );
        rPos++;
        if( bPgSecBreak || bStartLine || rPos == nEnd ) // CR oder Fertig
            return bStartLine;
    }
}

BOOL SwWW8ImplReader::ReadChar( long nPosCp, long nCpOfs )
{
    // Unicode-Flag neu setzen und notfalls File-Pos korrigieren
    // merke: Seek kostet nicht viel, da inline geprueft wird,
    //        ob die korrekte FilePos nicht schon erreicht ist.
    pStrm->Seek( pSBase->WW8Cp2Fc(nCpOfs+nPosCp, &bIsUnicode) );

    BYTE   nBCode;
    UINT16 nWCharVal;
    if( bIsUnicode )
        *pStrm >> nWCharVal;    // unicode  --> read 2 bytes
    else
    {
        *pStrm  >>  nBCode;     // old code --> read 1 byte
        nWCharVal = nBCode;
    }

    sal_Char cInsert = '\x0';
    BOOL bRet = FALSE;
    switch( nWCharVal )
    {
    case 0xe:  {
                    SwTxtNode* pNd = pPaM->GetCntntNode()->GetTxtNode();
                    if ( pNd )
                    {
                        const SfxItemSet* pSet = pNd->GetpSwAttrSet();
                        if ( pSet && ( SFX_ITEM_ON == pSet->GetItemState(
                                                    RES_PAGEDESC, FALSE ) ) )
                        {
                            rDoc.AppendTxtNode( *pPaM->GetPoint() );
                        }
                        else
                        {
                            const SwPosition* pPos  = pPaM->GetPoint();
                            const SwTxtNode* pSttNd = rDoc.GetNodes()[ pPos->nNode ]->GetTxtNode();
                            USHORT nCntPos          = pPos->nContent.GetIndex();
                            if( nCntPos && pSttNd->GetTxt().Len() )
                                rDoc.SplitNode( *pPos );
                        }
                    }
                    rDoc.Insert( *pPaM,     // column break
                        SvxFmtBreakItem( SVX_BREAK_COLUMN_BEFORE ) );
                }
                break;

    case 0x7:   TabCellEnd();       // table cell end (Flags abfragen!)
                if( bWasTabRowEnd )
                    pSBase->SetNoAttrScan( 0 );
                break;

    case 0xf:   if( !bSpec )        // "Satellit"
                    cInsert = '\xa4';
                break;

    case 0x14:  if( !bSpec )        // "Para-Ende"-Zeichen
                    cInsert = '\xb5';
                break;

    case 0x15:  if( !bSpec )        // Juristenparagraph
                    cInsert = '\xa7';
                break;

    case 0x9:   cInsert = '\x9';    // Tab
                break;

    case 0xb:   cInsert = '\xa';    // Hard NewLine
                break;

    case 0xc:   bPgSecBreak = TRUE;
                // new behavior: insert additional node only WHEN the Pagebreak
                // ( #74468# )   is in a NODE that is NOT EMPTY
                if( 0 < pPaM->GetPoint()->nContent.GetIndex() )
                    bRet = TRUE;
                pCtrlStck->KillUnlockedAttrs( *pPaM->GetPoint() );
                break;

    case 0x1e:  rDoc.Insert( *pPaM, CHAR_HARDHYPHEN );// Non-breaking hyphen
                break;
    case 0x1f:  rDoc.Insert( *pPaM, CHAR_SOFTHYPHEN );   // Non-required hyphens
                break;
    case 0xa0:  rDoc.Insert( *pPaM, CHAR_HARDBLANK );// Non-breaking spaces
                break;

    case 0x1:   if( bObj )
                    ImportOle();
                else if( bEmbeddObj )
                {
                    // wenn der OLE-Import nicht klappt, dann versuche
                    // zumindest die Grafik zu importieren
                    if( !ImportOle() )
                        ImportGraf();
                }
                else
                    ImportGraf();
                bObj = bEmbeddObj = FALSE;      // das Flag auf immer zurueck setzen
                nObjLocFc = 0;
                break;

    case 0x8:   if( !bObj )
                    Read_GrafLayer( nPosCp );
                break;

    case 0xd:   bRet = TRUE;    break;              // line end

    case 0x5:                           // Annotation reference
    case 0x13:
    case 0x2:   break;                  // Auto-Fussnoten-Nummer

#ifdef DEBUG
    default:
        {
            String sUnknown( '<' );
            sUnknown += String::CreateFromInt32( nWCharVal );
            sUnknown += '>';
            rDoc.Insert( *pPaM, sUnknown );
        }
#endif
               break;
    }
    if( '\x0' != cInsert )
        rDoc.Insert( *pPaM, ByteString::ConvertToUnicode(
                                        cInsert, RTL_TEXTENCODING_MS_1252 ) );
    return bRet;
}


void SwWW8ImplReader::ProcessAktCollChange( WW8PLCFManResult& rRes,
                                            BOOL* pStartAttr,
                                            BOOL bCallProcessSpecial )
{
    USHORT nOldColl = nAktColl;
    nAktColl = pPlcxMan->GetColl();

    if( bIsHeader )             // Fuer Kopfzeilenabstaende
        nHdTextHeight += pPlcxMan->GetPapPLCF()->GetParaHeight();
    else
    if( bIsFooter )             // Fuer Kopfzeilenabstaende
        nFtTextHeight += pPlcxMan->GetPapPLCF()->GetParaHeight();

    if( nAktColl >= nColls || !pCollA[nAktColl].pFmt
        || !pCollA[nAktColl].bColl )
    {
        nAktColl = 0;           // Unguelige Style-Id
    }
    else
    {
        nLeftParaMgn      = pCollA[nAktColl].nLeftParaMgn;
        nTxtFirstLineOfst = pCollA[nAktColl].nTxtFirstLineOfst;
    }
    BOOL bTabRowEnd = FALSE;
    if( pStartAttr && bCallProcessSpecial )
    {
        BOOL bReSync;
        bTabRowEnd = ProcessSpecial( FALSE, &bReSync );// Apo / Table / Anl
        if( bReSync )
            *pStartAttr = pPlcxMan->Get( &rRes ); // hole Attribut-Pos neu
    }
    if( !bTabRowEnd )
    {
        SetTxtFmtCollAndListLevel( *pPaM, pCollA[ nAktColl ]);

        ChkToggleAttr( pCollA[ nOldColl ].n81Flags,
                       pCollA[ nAktColl ].n81Flags );
    }

    eFontSrcCharSet = pCollA[nAktColl].eFontSrcCharSet; // aus P-Style
}


long SwWW8ImplReader::ReadTextAttr( long& rTxtPos, BOOL& rbStartLine )
{
    long nOld = pStrm->Tell();
    long nSkipChars = 0;
    WW8PLCFManResult aRes;

    BOOL bStartAttr = pPlcxMan->Get( &aRes ); // hole Attribut-Pos

    if( aRes.nFlags & MAN_MASK_NEW_SEP ){   // neue Section
        CreateSep( rTxtPos );               // PageDesc erzeugen und fuellen
        bPgSecBreak = FALSE;                // -> 0xc war ein Sectionbreak, aber
    }                                       // kein Pagebreak;

    if(    ( aRes.nFlags & MAN_MASK_NEW_PAP )   // neuer Absatz ueber Plcx.Fkp.papx
            || rbStartLine )
    {                   // oder ueber 0x0d o.ae. im Text
        ProcessAktCollChange(
                        aRes,
                        &bStartAttr,
                            MAN_MASK_NEW_PAP == (aRes.nFlags & MAN_MASK_NEW_PAP)
                        &&  !bIgnoreText );
        rbStartLine = FALSE;
    }

    // position of last CP that's to be ignored
    long nSkipPos = -1;
    BOOL bOldDontCreateSep = bDontCreateSep;

    if( 0 < aRes.nSprmId )                      // leere Attrs ignorieren
    {
        if( ( 256 > aRes.nSprmId ) || ( 0x0800 <= aRes.nSprmId ) )
        {
            if( bStartAttr )                            // WW-Attribute
            {
                if( aRes.nMemLen >= 0 )
                {   // Attr anschalten
                    ImportSprm( aRes.pMemPos, (short)aRes.nMemLen, aRes.nSprmId );
                }
            }
            else
                EndSprm( aRes.nSprmId );        // Attr ausschalten
        }
        else if( aRes.nSprmId < 0x800 ) // eigene Hilfs-Attribute
        {
            aRes.nAktCp = rTxtPos;              // Akt. Cp-Pos
            nSkipChars = ImportExtSprm( &aRes, bStartAttr );
            if( 256 <= aRes.nSprmId && 258 >= aRes.nSprmId )
            {
                rTxtPos += nSkipChars;          // Felder/Ftn-/End-Note hier ueberlesen
                nSkipPos = rTxtPos-1;
            }
        }
    }

    if( bVer8 || nSkipChars || aRes.nSprmId == 260 )
        // Feld oder Piece
        // um nSkipChars bewegen bei Feldern und Pieces
        pStrm->Seek( pSBase->WW8Cp2Fc( pPlcxMan->GetCpOfs() + rTxtPos, &bIsUnicode));
    else
    {
        // sonst alte Pos wiederherstellen und Unicode-Flag ermitteln
        pStrm->Seek( nOld );
    }

    // Find next Attr position (and Skip attributes of field contents if needed)
    if( nSkipChars && !bIgnoreText )
        pCtrlStck->MarkAllAttrsOld();
    BOOL  bOldIgnoreText = bIgnoreText;
    bIgnoreText          = TRUE;
    USHORT nOldColl = nAktColl;
    BOOL bDoPlcxManPlusPLus = TRUE;
    long nNext;
    do
    {
        if( bDoPlcxManPlusPLus )
            (*pPlcxMan)++;
        nNext = pPlcxMan->Where();
        if( (0 <= nNext) && (nSkipPos >= nNext) )
        {
            nNext = ReadTextAttr( rTxtPos, rbStartLine );
            bDoPlcxManPlusPLus = FALSE;
            bIgnoreText = TRUE;
        }
    }
    while( nSkipPos >= nNext );
    bIgnoreText    = bOldIgnoreText;
    bDontCreateSep = bOldDontCreateSep;
    if( nSkipChars )
    {
        pCtrlStck->KillUnlockedAttrs( *pPaM->GetPoint() );
        if( nOldColl != pPlcxMan->GetColl() )
            ProcessAktCollChange(aRes, 0, FALSE);
    }

    return nNext;
}

void SwWW8ImplReader::ReadAttrs( long& rNext, long& rTxtPos, BOOL& rbStartLine )
{
    if( rTxtPos >= rNext )
    {           // Stehen Attribute an ?

        do
        {
            rNext = ReadTextAttr( rTxtPos, rbStartLine );
        }while( rTxtPos >= rNext );

    }
    else if ( rbStartLine )
    {
// keine Attribute, aber trotzdem neue Zeile
// wenn eine Zeile mit einem Seitenumbruch aufhoert und sich keine
// Absatzattribute / Absatzvorlagen aendern, ist das Zeilenende
// nicht im Plcx.Fkp.papx eingetragen, d.h. ( nFlags & MAN_MASK_NEW_PAP )
// ist FALSE. Deshalb muss als Sonderbehandlung hier die Vorlage gesetzt
// werden.
        if( !bCpxStyle )
        {
            SetTxtFmtCollAndListLevel( *pPaM, pCollA[ nAktColl ] );
        }
        rbStartLine = FALSE;
    }
}

// ReadAttrEnds zum Lesen nur der Attributenden am Ende eines Textes oder
// Textbereiches ( Kopfzeile, Fussnote, ...). Attributanfaenge, Felder
// werden ignoriert.
void SwWW8ImplReader::ReadAttrEnds( long& rNext, long& rTxtPos )
{

    while( rTxtPos >= rNext )
    {
        WW8PLCFManResult aRes;

        BOOL b = pPlcxMan->Get( &aRes );     // hole Attribut-Pos

        if(    !b
            && (aRes.nSprmId >=  0)     // nur Attributenden noch bearbeiten,
            && (    (aRes.nSprmId <     256)
                 || (aRes.nSprmId >= 0x0800) )
            )
        {                                                           // Anfaenge gehoeren zum naechsten Spezialtext
            EndSprm( aRes.nSprmId );                                // Fussnoten und Felder ignorieren
        }
        (*pPlcxMan)++;
        rNext = pPlcxMan->Where();
    }
    BOOL bDummyReSync;
    ProcessSpecial( TRUE, &bDummyReSync );
}

void SwWW8ImplReader::ReadText( long nStartCp, long nTextLen, short nType )
{
    if( nIniFlags & WW8FL_NO_TEXT )
        return;

    BOOL bStartLine = TRUE;
    short nCrCount = 0;

    nAktColl    =  0;
    pAktItemSet =  0;
    nCharFmt    = -1;
    bSpec = FALSE;
    nHdTextHeight = nFtTextHeight = 0;

    pPlcxMan = new WW8PLCFMan( pSBase, nType, nStartCp );
    long nCpOfs = pPlcxMan->GetCpOfs(); // Offset fuer Header/Footer, Footnote

    WW8_CP nNext = pPlcxMan->Where();

    pStrm->Seek( pSBase->WW8Cp2Fc( nStartCp + nCpOfs, &bIsUnicode ) );

    if(    (0 == nStartCp+nCpOfs)
        && SetCols( 0, pPlcxMan->GetSepPLCF(), 0, TRUE   ) )
    {
        // Start of text:
        //
        // look for cols and insert a section at the very beginning...
        //
        if( !pPageDesc )
            pPageDesc = &rDoc._GetPageDesc( 0 );
        SwFrmFmt &rFmt = pPageDesc->GetMaster();
        USHORT nLIdx = ( ( pWwFib->lid & 0xff ) == 0x9 ) ? 1 : 0;
        SetPage1( pPageDesc, rFmt, pPlcxMan->GetSepPLCF(), nLIdx, FALSE );
        const SwFmtCol& rCol = rFmt.GetCol();
        // if PageDesc has been inserted and has cols
        // insert a *section* with cols instead
        if( rCol.GetNumCols() )
        {
            InsertSectionWithWithoutCols( *pPaM, &rCol );
            // remove columns from PageDesc
            SwFmtCol aCol;
            rFmt.SetAttr( aCol );
        }
    }

    WW8_CP l = nStartCp;
    while ( l<nStartCp+nTextLen )
    {

        ReadAttrs( nNext, l, bStartLine );// behandelt auch Section-Breaks

        if( bPgSecBreak ) // Pagebreak, aber kein Sectionbreak
        {
            SwPosition&  rPt = *pPaM->GetPoint();
            // new behavior: insert additional node only WHEN the Pagebreak
            // ( #74468# )   is contained in a NODE that is NOT EMPTY
            if(    (nLastFlyNode == rPt.nNode.GetIndex())
                || (0             < rPt.nContent.GetIndex()) )
            {
                rDoc.AppendTxtNode( rPt );
            }
            rDoc.Insert( *pPaM, SvxFmtBreakItem( SVX_BREAK_PAGE_BEFORE ) );
            bPgSecBreak = FALSE;
        }
        if( l>= nStartCp + nTextLen )
            break;

        bStartLine = ReadChars( l, nNext, nStartCp+nTextLen, nCpOfs );

        if( bStartLine ) // Zeilenende
        {
            rDoc.AppendTxtNode( *pPaM->GetPoint() );

            if( ( nCrCount++ & 0x40 ) == 0          // alle 64 CRs aufrufen
                && nType == MAN_MAINTEXT ){         // nicht fuer Header u. ae.
                nProgress = (USHORT)( l * 100 / nTextLen );
                ::SetProgressState( nProgress, rDoc.GetDocShell() ); // Update
            }
        }
    }
    ReadAttrEnds( nNext, l );
    JoinNode( pPaM );
    if( nType == MAN_MAINTEXT )
        UpdatePageDescs( nPageDescOffset ); // muss passieren, solange es den
                                            // PlcxMan noch gibt
    DELETEZ( pPlcxMan );
}

/***************************************************************************
#           class SwWW8ImplReader
#**************************************************************************/

SwWW8ImplReader::SwWW8ImplReader( BYTE nVersionPara,
                                    SvStorage* pStorage, SvStream* pSt,
                                    SwDoc& rD, BOOL bNewDoc )
    : pStg( pStorage ), rDoc( rD ), pStrm( pSt ), bNew( 0 != bNewDoc ),
    pMSDffManager( 0 ), pAtnNames( 0 ), pAuthorInfos( 0 ), pLastPgDeskIdx( 0 ),
    pDataStream( 0 ),   pTableStream( 0 )
{
    pStrm->SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );
    nWantedVersion = nVersionPara;
    pCtrlStck   = 0;
    pEndStck    = 0;
    pRefFldStck = 0;
    pFonts          = 0;
    pSBase          = 0;
    pPlcxMan        = 0;
    pStyles         = 0;
    pAktColl        = 0;
    pLstManager = 0;
    pAktItemSet = 0;
    pCollA          = 0;
    pHdFt           = 0;
    pWFlyPara       = 0;
    pSFlyPara       = 0;
    pFlyFmtOfJustInsertedGraphic = 0;
    nColls = nAktColl = 0;
    nObjLocFc = nPicLocFc = 0;
    bReadNoTbl = bPgSecBreak = bSpec = bObj = bApo = bTxbxFlySection
               = bHasBorder = bSymbol = bIgnoreText = bDontCreateSep = bTable
               = bTableInApo = bWasTabRowEnd = bTxtCol = FALSE;
    bShdTxtCol = bCharShdTxtCol = bAnl = bHdFtFtnEdn = bFtnEdn
               = bIsHeader = bIsFooter = bSectionHasATitlePage
               = bIsUnicode = bCpxStyle = bStyNormal = bWWBugNormal  = FALSE;
    bNoAttrImport = bPgChpLevel = bEmbeddObj = bFloatingCtrl = FALSE;
    bAktAND_fNumberAcross = FALSE;
    bNoLnNumYet = TRUE;
    bRestartLnNumPerSection = FALSE;
    nProgress = 0;
    nHdTextHeight = nFtTextHeight = 0;
    nPgWidth = lA4Width;
    nPgLeft = nPgRight = nPgTop = MM_250;
    nCorrIhdt = 0;
    nSwNumLevel = nWwNumType = 0xff;
    pTableDesc = 0;
    pNumRule = 0;
    pNumOlst = 0;
    pBehindSection = 0;
    pNewSection    = 0;
    pNode_FLY_AT_CNTNT = 0;
    pDrawFmt = 0;
    pDrawModel = 0;
    pDrawPg = 0;
    pDrawGroup = 0;
    pDrawHeight = 0;
    nDrawTxbx = 0;
    pDrawEditEngine = 0;
    pFormImpl = 0;
    nLeftParaMgn = 0;
    nTxtFirstLineOfst = 0;
    pNumFldType = 0;
    nFldNum = 0;

    nLastFlyNode = ULONG_MAX;
    nImportedGraphicsCount = 0;

    nLFOPosition = USHRT_MAX;
    nListLevel   = nWW8MaxListLevel;

    eFontSrcCharSet = RTL_TEXTENCODING_DONTKNOW;
    eFontDstCharSet = RTL_TEXTENCODING_DONTKNOW;
    eHardCharSet = RTL_TEXTENCODING_DONTKNOW;
    pPageDesc = 0;

    nNfcPgn = nPgChpDelim = nPgChpLevel = 0;

#ifdef DEBUG
    Sound::Beep();
#endif
}

void SwWW8ImplReader::DeleteStk(SwFltControlStack* pStck)
{
    if( pStck )
    {
        pStck->SetAttr( *pPaM->GetPoint(), 0, FALSE );
        pStck->SetAttr( *pPaM->GetPoint(), 0, FALSE );
        delete pStck;
    }
    else
    {
        ASSERT( !this, "WW-Stack bereits geloescht" );
    }
}

ULONG SwWW8ImplReader::LoadDoc1( SwPaM& rPaM ,WW8Glossary *pGloss)
{
    ULONG nErrRet = 0;

    if( bNew && pStg && !pGloss)
        ReadDocInfo();

    pPaM = new SwPaM( *rPaM.GetPoint() );

    pCtrlStck = new SwWW8FltControlStack( &rDoc, nFieldFlags );

    /*
        Endestack: haelt z.B. Bookmarks und Variablen solange vor,
        bis er den Befehl zum inserten bekommt.
    */
    pEndStck    = new SwFltEndStack(        &rDoc, nFieldFlags );
    /*
        fieldstack holds Reference Fields until the very end of file import
    */
    pRefFldStck = new SwWW8FltControlStack( &rDoc, nFieldFlags );

    nPageDescOffset = rDoc.GetPageDescCnt();

    SwNodeIndex aSttNdIdx( rDoc.GetNodes() );
    SwRelNumRuleSpaces aRelNumRule( rDoc, bNew );

    USHORT eMode = REDLINE_SHOW_INSERT;

    // enum-para mitgeben, welche Versions-Nummern erlaubt sind: ww6, ww8, ...

    if (pGloss)
        pWwFib = pGloss->GetFib();
    else
        pWwFib = new WW8Fib( *pStrm, nWantedVersion );  // Fib einlesen

    if ( pWwFib->nFibError )
    {           // ERR_NO_WW8_FILE
        nErrRet = ERR_SWG_READ_ERROR;               // oder ERR_SW6_READ_ERROR
    }
    else if( pWwFib->fEncrypted )
    {
        nErrRet = ERR_SW6_PASSWD;                   // gecryptet geht nicht



        // Annotation:  Crypted files  C O U L D  be imported if we used the methods
        //              provided by Caolan Mc Nammara.
        //              Written permission (my e-mail) was given by him
        //              but no special document has been signed...
        //              27. Sept. 1999, K.-H. Zimmer


    }
    else if( ( nIniFlags & WW8FL_NO_COMPLEX ) && pWwFib->fComplex )
    {
        nErrRet = WARN_WW6_FASTSAVE_ERR;            // Warning melden
    }
    else
    {
        // praktische Hilfsvariablen besetzen:
        bVer67 = (     (6 == pWwFib->nVersion)
                                || (7 == pWwFib->nVersion) );   // z.B.: altes Sprm-Id-Format!
        bVer6  =  (6 == pWwFib->nVersion);
        bVer7  =  (7 == pWwFib->nVersion);
        bVer8  =  (8 == pWwFib->nVersion);

        SvStorageStreamRef xTableStream, xDataStream;

        // Nachdem wir nun den FIB eingelesen haben, wissen wir ja,
        // welcher Table-Stream gueltig ist.
        // Diesen oeffnen wir nun.
        switch( pWwFib->nVersion )  // 6 steht fuer "6 ODER 7",  7 steht fuer "NUR 7"
        {
        case 6:
        case 7: pTableStream = pStrm;
                pDataStream = pStrm;
                break;

        case 8:
                if( !pStg )
                {
                    ASSERT( pStg, "Version 8 muss immer einen Storage haben!" );
                    nErrRet = ERR_SWG_READ_ERROR;
                    break;
                }
                xTableStream = pStg->OpenStream(
                        String(   (1 == pWwFib->fWhichTblStm)
                                ? "1Table"
                                : "0Table",
                                RTL_TEXTENCODING_MS_1252 ),
                        STREAM_STD_READ );
                pTableStream = &xTableStream;
                pTableStream->SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );

                xDataStream = pStg->OpenStream(
                                    String( "Data", RTL_TEXTENCODING_MS_1252 ),
                                    STREAM_STD_READ | STREAM_NOCREATE );
                if( xDataStream.Is() && SVSTREAM_OK == xDataStream->GetError() )
                {
                    pDataStream = &xDataStream;
                    pDataStream->SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );
                }
                else
                    pDataStream = pStrm;

                if( pWwFib->lcbPlcfspaHdr || pWwFib->lcbPlcfspaMom )
                    pMSDffManager = new SwMSDffManager( *this );
                break;

        default:// Programm-Fehler!
                        ASSERT( !this, "Es wurde vergessen, nVersion zu kodieren!" );
                        nErrRet = ERR_SWG_READ_ERROR;
        }

        if( ERR_SWG_READ_ERROR != nErrRet )
        {
            if( 0x0100 == pWwFib->chse )
                eTextCharSet   = RTL_TEXTENCODING_APPLE_ROMAN;
            else
                eTextCharSet   = rtl_getTextEncodingFromWindowsCharset( pWwFib->chse );
            if( 0x0100 == pWwFib->chseTables )
                eStructCharSet = RTL_TEXTENCODING_APPLE_ROMAN;
            else
                eStructCharSet = rtl_getTextEncodingFromWindowsCharset( pWwFib->chseTables );

            bWWBugNormal = pWwFib->nProduct == 0xc03d;

            if( !bNew )
                aSttNdIdx = pPaM->GetPoint()->nNode;

            ::StartProgress( STR_STATSTR_W4WREAD, 0, 100, rDoc.GetDocShell() );


            rDoc.SetParaSpaceMax( TRUE, TRUE ); // Abstand zwischen zwei Absaetzen ist
            // die SUMME von unterem Abst. des ersten und oberem Abst. des zweiten


            // read Font Table
            pFonts = new WW8Fonts( *pTableStream, *pWwFib );


            pWDop = new WW8Dop( *pTableStream, pWwFib->nFib, pWwFib->fcDop, pWwFib->lcbDop  );      // Document Properties
            ImportDop( bNew != 0 );


            /*
                Import revisioning data: author names
            */
            if( pWwFib->lcbSttbfRMark )
                ReadRevMarkAuthorStrTabl( *pTableStream,
                                            pWwFib->fcSttbfRMark,
                                            pWwFib->lcbSttbfRMark, rDoc );

            /*
                zuerst(!) alle Styles importieren   (siehe WW8PAR2.CXX)
                    VOR dem Import der Listen !!
            */
            ::SetProgressState( nProgress, rDoc.GetDocShell() );    // Update
            pStyles = new WW8RStyle( *pWwFib, this );   // Styles
            pStyles->Import();
            ::SetProgressState( nProgress, rDoc.GetDocShell() );    // Update



            /*
                jetzt erst alle Listen importieren  (siehe WW8PAR3.CXX)
                    NACH dem Import der Styles !!
            */
            pLstManager = new WW8ListManager( *pTableStream, *this );
            ::SetProgressState( nProgress, rDoc.GetDocShell() );    // Update



            /*
                zu guter Letzt:                     (siehe ebenfalls WW8PAR3.CXX)
                ===============
                alle Styles durchgehen und ggfs. zugehoeriges Listen-Format anhaengen
                    NACH dem Import der Styles und NACH dem Import der Listen !!
            */
            pStyles->RegisterNumFmts();


            pSBase = new WW8ScannerBase( pStrm, pTableStream, pDataStream,
                                         pWwFib );
            static SvxExtNumType __READONLY_DATA eNumTA[16] = {
                SVX_NUM_ARABIC, SVX_NUM_ROMAN_UPPER, SVX_NUM_ROMAN_LOWER, SVX_NUM_CHARS_UPPER_LETTER_N,
                SVX_NUM_CHARS_LOWER_LETTER_N, SVX_NUM_ARABIC, SVX_NUM_ARABIC, SVX_NUM_ARABIC,
                SVX_NUM_ARABIC, SVX_NUM_ARABIC,
                SVX_NUM_ARABIC, SVX_NUM_ARABIC,
                SVX_NUM_ARABIC, SVX_NUM_ARABIC,
                SVX_NUM_ARABIC, SVX_NUM_ARABIC };

            if( pSBase->AreThereFootnotes() ){
                static SwFtnNum __READONLY_DATA eNumA[4] = {
                    FTNNUM_DOC, FTNNUM_CHAPTER, FTNNUM_PAGE, FTNNUM_DOC };

                SwFtnInfo aInfo;
                aInfo = rDoc.GetFtnInfo();      // Copy-Ctor privat

                aInfo.ePos = FTNPOS_PAGE;
                aInfo.eNum = eNumA[pWDop->rncFtn];
                aInfo.aFmt.eType = eNumTA[pWDop->nfcFtnRef];
                if( pWDop->nFtn )
                    aInfo.nFtnOffset = pWDop->nFtn - 1;
                rDoc.SetFtnInfo( aInfo );
            }
            if( pSBase->AreThereEndnotes() ){
                SwEndNoteInfo aInfo;
                aInfo = rDoc.GetEndNoteInfo();  // parallel zu Ftn

                // Ich kann nicht setzen, wann neu nummerieren...
                //  aInfo.eNum = eNumA[pWDop->pDop->rncEdn];
                aInfo.aFmt.eType = eNumTA[pWDop->nfcEdnRef];
                if( pWDop->nEdn )
                    aInfo.nFtnOffset = pWDop->nEdn - 1;
                rDoc.SetEndNoteInfo( aInfo );
            }

            if( pWwFib->lcbPlcfhdd )
                pHdFt = new WW8PLCF_HdFt( pTableStream, *pWwFib, *pWDop );

            if( !bNew ){        // in ein Dokument einfuegen ?
                                // Da immer ganze Zeile eingelesen werden, muessen
                                // evtl. Zeilen eingefuegt / aufgebrochen werden
                const SwPosition* pPos = pPaM->GetPoint();
                const SwTxtNode* pSttNd = rDoc.GetNodes()[ pPos->nNode ]->GetTxtNode();
                USHORT nCntPos = pPos->nContent.GetIndex();

                if( nCntPos && pSttNd->GetTxt().Len() ) // EinfuegePos nicht in leerer Zeile
                    rDoc.SplitNode( *pPos );            // neue Zeile erzeugen

                if( pSttNd->GetTxt().Len() )
                {   // EinfuegePos nicht am Ende der Zeile
                    rDoc.SplitNode( *pPos );    // neue Zeile
                    pPaM->Move( fnMoveBackward );   // gehe in leere Zeile
                }

                // verhinder das Einlesen von Tabellen in Fussnoten / Tabellen
                ULONG nNd = pPos->nNode.GetIndex();
                bReadNoTbl = 0 != pSttNd->FindTableNode() ||
                                        ( nNd < rDoc.GetNodes().GetEndOfInserts().GetIndex() &&
                    rDoc.GetNodes().GetEndOfInserts().StartOfSectionIndex() < nNd );

            }

            ::SetProgressState( nProgress, rDoc.GetDocShell() );    // Update

            if (pGloss) // loop for each glossary entry and add dummy section node
            {
                WW8PLCF aPlc(&xTableStream,pWwFib->fcPlcfglsy,
                                pWwFib->lcbPlcfglsy,0 );

                WW8_CP nStart, nEnd;
                void* pDummy;

                for (int i=0;i<pGloss->GetNoStrings();i++,aPlc++)
                //for (int i=0;i<1;i++,aPlc++)
                {
                    SwNodeIndex aIdx( rDoc.GetNodes().GetEndOfContent());
                    SwTxtFmtColl* pColl =
                        rDoc.GetTxtCollFromPool( RES_POOLCOLL_STANDARD);
                    SwStartNode *pNode =
                        rDoc.GetNodes().MakeTextSection(aIdx,
                        SwNormalStartNode,pColl);
                    pPaM->GetPoint()->nNode = pNode->GetIndex()+1;
                    pPaM->GetPoint()->nContent.Assign(pPaM->GetCntntNode(),0);
                    aPlc.Get( nStart, nEnd, pDummy );
                    ReadText(nStart,nEnd-nStart-1,MAN_MAINTEXT);
                    //ReadText( 0, pWwFib->ccpText, MAN_MAINTEXT );
                }
            }
            else //ordinary case
            {
                ReadText( 0, pWwFib->ccpText, MAN_MAINTEXT );
            }

            ::SetProgressState( nProgress, rDoc.GetDocShell() );    // Update

            if( pCollA )
            {
                SwNumRule aOutlineRule( *rDoc.GetOutlineNumRule() );

                USHORT nI;
                // Bitfeld, welche Outline-Level bereits an einem
                // Style gesetzt wurden (vermeiden von Doppeltvergabe)
                USHORT nFlagsStyleOutlLevel = 0;
                if( !bNew )
                {
                    const SwTxtFmtColls& rColls = *rDoc.GetTxtFmtColls();
                    for( nI = 0; nI < rColls.Count(); nI++ )
                    {
                        const SwTxtFmtColl& rColl = *rColls[ nI ];
                        if( MAXLEVEL > rColl.GetOutlineLevel() )
                        {
                            nFlagsStyleOutlLevel |= 1 << rColl.GetOutlineLevel();
                        }
                    }
                }
                USHORT nIa=10;
                USHORT nIz=nColls;
                for( USHORT nJ = 0; nJ < 2; nJ++ )
                {
                    for( nI = nIa; nI < nIz; nI++ )
                    {
                        SwWW8StyInf& rSI = pCollA[ nI ];

                        if(    ( MAXLEVEL > rSI.nOutlineLevel )
                            && rSI.pOutlineNumrule
                            && rSI.pFmt )
                        {
                            USHORT nAktFlags = 1 << rSI.nOutlineLevel;
                            if( nAktFlags & nFlagsStyleOutlLevel )
                            {
                                rSI.pFmt->SetAttr(
                                    SwNumRuleItem( rSI.pOutlineNumrule->GetName() ) );
                                ((SwTxtFmtColl*)rSI.pFmt)->SetOutlineLevel( NO_NUMBERING );
                            }
                            else
                            // die Default-Styles im ZWEITEN Durchgang auf jeden Fall
                            // nehmen, die User-definierten nur, wenn auch verwendet.
                            if( nJ || rSI.pFmt->GetDepends() )
                            {
                                // Numformat aus der NumRule nehmen
                                // und bei der OutlineRule setzen.
                                aOutlineRule.Set(
                                    rSI.nOutlineLevel,
                                    rSI.pOutlineNumrule->Get( rSI.nOutlineLevel ) );
                                // am Style die Outlinenummer eintragen
                                ((SwTxtFmtColl*)rSI.pFmt)->SetOutlineLevel( rSI.nOutlineLevel );
                                // Flag verodern, um Doppeltvergabe zu vermeiden
                                nFlagsStyleOutlLevel |= nAktFlags;
                            }
                        }
                    }
                    nIa = 1;
                    nIz = 10;
                }
                if( nFlagsStyleOutlLevel )
                    rDoc.SetOutlineNumRule( aOutlineRule );

                /*  // wird nun ueber D'tor erledigt!
                for( nI = 0; nI < nColls; nI++ ){
                    if( pCollA[nI].pWWFly )
                        delete( pCollA[nI].pWWFly );
                }
                */
                delete[] pCollA;
            }

            if( pDrawPg && pMSDffManager && pMSDffManager->GetShapeOrders() )
            {
                // Hilfsarray zum Verketten der (statt SdrTxtObj) eingefuegten Rahmen
                SvxMSDffShapeTxBxSort aTxBxSort;

                // korrekte Z-Order der eingelesen Escher-Objekte sicherstellen
                USHORT nShapeCount = pMSDffManager->GetShapeOrders()->Count();
                USHORT nNewObjNum = 0;
                for (USHORT nShapeNum=0; nShapeNum < nShapeCount; nShapeNum++)
                {
                    SvxMSDffShapeOrder& rOrder = *(SvxMSDffShapeOrder*)
                        (pMSDffManager->GetShapeOrders()->GetObject( nShapeNum ));
                    if( rOrder.pObj )
                    {
                        ULONG nOldObjNum = rOrder.pObj->GetOrdNum();
                        if(    (nOldObjNum != nNewObjNum )
                            && (pDrawPg->GetObj( nOldObjNum )) )
                            pDrawPg->NbcSetObjectOrdNum( nOldObjNum, nNewObjNum );
                        ++nNewObjNum;
                    }
                    // Pointer in neues Sort-Array einfuegen
                    if( rOrder.nTxBxComp && rOrder.pFly )
                        aTxBxSort.Insert( &rOrder );
                }
                // zu verkettende Rahmen jetzt verketten
                USHORT nTxBxCount = aTxBxSort.Count();
                if( nTxBxCount )
                {
                    SwFmtChain aChain;
                    for (USHORT nTxBxNum=0; nTxBxNum < nTxBxCount; nTxBxNum++)
                    {
                        SvxMSDffShapeOrder& rOrder =
                            *(SvxMSDffShapeOrder*)(aTxBxSort.GetObject( nTxBxNum ));

                        // Fly-Frame-Formate initialisieren
                        SwFlyFrmFmt* pFlyFmt     = rOrder.pFly;
                        SwFlyFrmFmt* pNextFlyFmt = 0;
                        SwFlyFrmFmt* pPrevFlyFmt = 0;
                        // ggfs. Nachfolger ermitteln
                        if( 1+nTxBxNum < nTxBxCount )
                        {
                            SvxMSDffShapeOrder& rNextOrder =
                                *(SvxMSDffShapeOrder*)(aTxBxSort.GetObject( nTxBxNum+1 ));
                            if(       (0xFFFF0000 &     rOrder.nTxBxComp)
                                   == (0xFFFF0000 & rNextOrder.nTxBxComp)
                                &&    rOrder.nHdFtSection
                                   == rNextOrder.nHdFtSection  )
                                pNextFlyFmt = rNextOrder.pFly;
                        }
                        // ggfs. Vorgaenger ermitteln
                        if( nTxBxNum )
                        {
                            SvxMSDffShapeOrder& rPrevOrder =
                                *(SvxMSDffShapeOrder*)(aTxBxSort.GetObject( nTxBxNum-1 ));
                            if(       (0xFFFF0000 &     rOrder.nTxBxComp)
                                   == (0xFFFF0000 & rPrevOrder.nTxBxComp)
                                &&    rOrder.nHdFtSection
                                   == rPrevOrder.nHdFtSection  )
                                pPrevFlyFmt = rPrevOrder.pFly;
                        }
                        // Falls Nachfolger oder Vorgaenger vorhanden,
                        // die Verkettung am Fly-Frame-Format eintragen
                        if( pNextFlyFmt || pPrevFlyFmt )
                        {
                            aChain.SetNext( pNextFlyFmt );
                            aChain.SetPrev( pPrevFlyFmt );
                            pFlyFmt->SetAttr( aChain );
                        }
                    }

                }

            }

            if( bNew )
            {
                if( pWDop->fRevMarking )
                    eMode |= REDLINE_ON;
                if( pWDop->fRMView )
                    eMode |= REDLINE_SHOW_DELETE;
                if(pStg && !pGloss) /*meaningless for a glossary, cmc*/
                {
                    const OfaFilterOptions* pVBAFlags = OFF_APP()->GetFilterOptions();
                    SvxImportMSVBasic aVBasic(*rDoc.GetDocShell(),*pStg,
                                    pVBAFlags->IsLoadWordBasicCode(),
                                    pVBAFlags->IsLoadWordBasicStorage() );
                    String s1( String::CreateFromAscii(
                                RTL_CONSTASCII_STRINGPARAM( "Macros" )));
                    String s2( String::CreateFromAscii(
                                RTL_CONSTASCII_STRINGPARAM( "VBA" )));
                    int nRet = aVBasic.Import( s1, s2 );
                    if( 2 & nRet )
                        rDoc.SetContainsMSVBasic( TRUE );
                  }
            }

            DELETEZ( pStyles );

            if( pFormImpl )
                DeleteFormImpl();
            GrafikDtor();
            DELETEZ( pMSDffManager );
            DELETEZ( pHdFt );
            DELETEZ( pLstManager );
            DELETEZ( pSBase );
            DELETEZ( pWDop );
            DELETEZ( pFonts );
            DELETEZ( pAtnNames );
            DELETEZ( pAuthorInfos );
            DELETEZ( pLastPgDeskIdx );
            ::EndProgress( rDoc.GetDocShell() );
        }
        pDataStream = 0;
        pTableStream = 0;
    }
    DELETEZ( pBehindSection );
    if (!pGloss)
        DELETEZ( pWwFib );
    DeleteCtrlStk();
    DeleteEndStk();
    DeleteRefFldStk();

    // set NoBallanced flag on last inserted section
    if( pNewSection )
    {
        pNewSection->GetFmt()->SetAttr( SwFmtNoBalancedColumns( TRUE ) );
    }

    // NumRules koennen erst nach dem setzen aller Attribute korrgiert werden
#ifdef DEBUG
    {
    ULONG nN = rDoc.GetNodes().Count();
    for( ULONG iN = 0; iN < nN; ++iN )
    {
        SwTxtNode* pN = rDoc.GetNodes()[ iN ]->GetTxtNode();
        if( pN && pN->GetNum() )
        {
            const SwNumRuleItem& rItem
                    = (SwNumRuleItem&)(pN->SwCntntNode::GetAttr( RES_PARATR_NUMRULE ) );
            if( !rItem.GetValue().Len() )
                ASSERT( !this, "NdNum gesetzt, aber KEIN NumRuleItem" );
        }
    }
    }
#endif

#ifdef DEBUG
    {
    const SwSpzFrmFmts& rFmts = *rDoc.GetSpzFrmFmts();
    for( ULONG iN = 0, nN = rFmts.Count(); iN < nN; ++iN )
    {
        const SwFmtAnchor& rA = rFmts[ iN ]->GetAnchor();
        if( FLY_IN_CNTNT == rA.GetAnchorId() &&
            !rA.GetCntntAnchor())
        {
            int x = 0;
        }
    }
    }
#endif

    aRelNumRule.SetNumRelSpaces( rDoc );
    if( !bNew && !nErrRet && aSttNdIdx.GetIndex() )
    {
        aSttNdIdx++;
        aRelNumRule.SetOultineRelSpaces( aSttNdIdx,
                                    pPaM->GetPoint()->nNode );
    }

    UpdateFields();

    DELETEZ( pPaM );
    // delete the pam before the call for hide all redlines (Bug 73683)
    if( bNew )
        rDoc.SetRedlineMode( eMode );

    return nErrRet;
}

const String* SwWW8ImplReader::GetAnnotationAuthor( short nIdx )
{
    if( !pAtnNames && pWwFib->lcbGrpStAtnOwners )
    {
        // Authoren bestimmen: steht im TableStream
        pAtnNames = new SvStringsDtor( 4, 4 );
        SvStream& rStrm = *pTableStream;

        long nOldPos = rStrm.Tell();
        rStrm.Seek( pWwFib->fcGrpStAtnOwners );

        long nRead = 0, nCount = pWwFib->lcbGrpStAtnOwners;
        String* pAutName;
        while( nRead < nCount )
        {
            if( bVer67 )
            {
                pAutName = new String( WW8ReadPString( rStrm, FALSE ) );
                nRead += pAutName->Len() + 1;   // Laenge + BYTE Count
            }
            else
            {
                pAutName = new String( WW8Read_xstz( rStrm, 0, FALSE ) );
                nRead += pAutName->Len() * 2 + 2;// UNICode: doppelte Laenge + USHORT Count
            }
            pAtnNames->Insert( pAutName, pAtnNames->Count() );
        }
        rStrm.Seek( nOldPos );
    }

    return pAtnNames && nIdx < pAtnNames->Count() ? (*pAtnNames)[ nIdx ] : 0;
}


#pragma optimize( "", off )

ULONG SwWW8ImplReader::LoadDoc( SwPaM& rPaM,WW8Glossary *pGloss)
{
    ULONG nErrRet = 0;

    pAktColl    = 0;
    pAktItemSet = 0;
    nIniFlags = ReadFilterFlags( "WW" );
    nIniFlags1= ReadFilterFlags( "WW8" );
//  nIniHdSiz = ReadFilterFlags( "WWHD" );
    nIniFtSiz = ReadFilterFlags( "WWFT" );
    // schiebt Flys um x twips nach rechts o. links
    nIniFlyDx = ReadFilterFlags( "WWFLX" );
    nIniFlyDy = ReadFilterFlags( "WWFLY" );// nach oben o. unten
    Read_FieldIniFlags();

    UINT16 nMagic;
    *pStrm >> nMagic;

    switch( nWantedVersion )    // beachte: 6 steht fuer "6 ODER 7",  7 steht fuer "NUR 7"
    {
    case 6:
    case 7:
            if( 0xa5dc != nMagic )
            {
                //JP 06.05.99: teste auf eigenen 97-Fake!
                if( pStg && 0xa5ec == nMagic )
                {
                    ULONG nCurPos = pStrm->Tell();
                    UINT32 nfcMin;
                    if( pStrm->Seek( nCurPos + 22 ) )
                    {
                        *pStrm >> nfcMin;
                        if( 0x300 != nfcMin )
                            nErrRet = ERR_WW6_NO_WW6_FILE_ERR;
                    }
                    pStrm->Seek( nCurPos );
                }
                else
                    nErrRet = ERR_WW6_NO_WW6_FILE_ERR;
            }
            break;
    case 8: if( 0xa5ec != nMagic )
                nErrRet = ERR_WW8_NO_WW8_FILE_ERR;
            break;

    default:
        nErrRet = ERR_WW8_NO_WW8_FILE_ERR;
        ASSERT( !this, "Es wurde vergessen, nVersion zu kodieren!" );
    }

    if( !nErrRet )
        nErrRet = LoadDoc1( rPaM ,pGloss);

#ifdef DEBUG
    Sound::Beep();
#endif

    return nErrRet;                 // return Errorcode
}


ULONG WW8Reader::Read( SwDoc &rDoc, SwPaM &rPam,
                    const String & /* FileName, falls benoetigt wird */ )
{
    USHORT nOldBuffSize = 32768;
    BOOL bNew = !bInsertMode;               // Neues Doc ( kein Einfuegen )


    SvStorageStreamRef refStrm;         // damit uns keiner den Stream klaut
    SvStream* pIn = pStrm;

    ULONG nRet = 0;
    BYTE nVersion = 8;

    String sFltName = GetFltName();
    if( sFltName.EqualsAscii( "WW6" ) )
    {
        if( pStrm )
            nVersion = 6;
        else
        {
            ASSERT( FALSE, "WinWord 95 Reader-Read ohne Stream" );
            nRet = ERR_SWG_READ_ERROR;
        }
    }
    else
    {
        if( sFltName.EqualsAscii( "CWW6" ) )
            nVersion = 6;
        else if( sFltName.EqualsAscii( "CWW7" ) )
            nVersion = 7;

        if( pStg )
        {
            nRet = OpenMainStream( refStrm, nOldBuffSize );
            pIn = &refStrm;
        }
        else
        {
            ASSERT( FALSE, "WinWord 95/97 Reader-Read ohne Storage" );
            nRet = ERR_SWG_READ_ERROR;
        }
    }

    if( !nRet )
    {
        //JP 18.01.96: Alle Ueberschriften sind normalerweise ohne
        //              Kapitelnummer. Darum hier explizit abschalten
        //              weil das Default jetzt wieder auf AN ist.
        if( bNew )
        {
            Reader::SetNoOutlineNum( rDoc );
            // MIB 27.09.96: Umrandung uns Abstaende aus Frm-Vorlagen entf.
            Reader::ResetFrmFmts( rDoc );
        }
        SwWW8ImplReader* pRdr = new SwWW8ImplReader( nVersion, pStg,
                                                        pIn, rDoc, bNew );
        nRet = pRdr->LoadDoc( rPam );
        delete pRdr;

        if( refStrm.Is() )
        {
            refStrm->SetBufferSize( nOldBuffSize );
            refStrm.Clear();
        }
    }
    return nRet;
}

int WW8Reader::GetReaderType()
{
    return SW_STORAGE_READER | SW_STREAM_READER;
}

BOOL WW8Reader::HasGlossaries() const
{
    return TRUE;
}


BOOL WW8Reader::ReadGlossaries( SwTextBlocks& rBlocks, BOOL bSaveRelFiles ) const
{
    USHORT nOldBuffSize = 32768;
    SvStorageStreamRef refStrm;

    WW8Reader *pThis = (WW8Reader *)this;
    ULONG nRet = pThis->OpenMainStream( refStrm, nOldBuffSize );

    WW8Glossary aGloss( refStrm, 8, pStg );
    return aGloss.Load(rBlocks, bSaveRelFiles );
}


#pragma optimize( "", off )


BOOL SwMSDffManager::GetOLEStorageName( long nOLEId, String& rStorageName,
                                        SvStorageRef& rSrcStorage,
                                        SvStorageRef& rDestStorage ) const
{
    BOOL bRet = FALSE;

    long nPictureId = 0;
    if( !( rReader.nIniFlags & WW8FL_NO_OLE ) && rReader.pStg )
    {
        // dann holen wir uns mal ueber den TextBox-PLCF die richtigen
        // Char Start-/End-Positionen. In dem Bereich sollte dann
        // das EinbettenFeld und die entsprechenden Sprms zu finden
        // sein. Wir brauchen hier aber nur das Sprm fuer die Picture Id
        long nOldPos = rReader.pStrm->Tell();
        {
            long nStartCp, nEndCp;
            rReader.GetTxbxTextSttEndCp( nStartCp, nEndCp,
                                        ( nOLEId >> 16 ) & 0xFFFF,
                                        nOLEId & 0xFFFF );

            WW8PLCFxSaveAll aSave;
            memset( &aSave, 0, sizeof( aSave ) );
            rReader.pPlcxMan->SaveAllPLCFx( aSave );

            nStartCp += rReader.nDrawCpO;
            nEndCp   += rReader.nDrawCpO;
            WW8PLCFx_Cp_FKP* pChp = rReader.pPlcxMan->GetChpPLCF();
            pChp->SeekPos( nStartCp );

            WW8_CP nStart = pChp->Where();
            while( nStart <= nEndCp && !nPictureId )
            {
                WW8PLCFxDesc aDesc;
                pChp->GetSprms( &aDesc );
                (*pChp)++;
                WW8_CP nNextEnd = pChp->Where();
                WW8_CP nEnd = ( nNextEnd < nEndCp ) ? nNextEnd : nEndCp;

                if( aDesc.nSprmsLen && aDesc.pMemPos )  // Attribut(e) vorhanden
                {
                    long nLen = aDesc.nSprmsLen;
                    BYTE* pSprm = aDesc.pMemPos;

                    while( nLen >= 2 && !nPictureId )
                    {
                        BYTE   nDelta;
                        USHORT nId = WW8GetSprmId( rReader.pWwFib->nVersion,
                                                    pSprm, &nDelta );
                        short nSL = WW8GetSprmSizeBrutto(
                                    rReader.pWwFib->nVersion, pSprm, &nId );

                        if( nLen < nSL )
                            break;              // nicht mehr genug Bytes uebrig

                        if( 0x6A03 == nId && 0 < nLen )
                        {
                            nPictureId = SVBT32ToLong( pSprm + 1 +
                                    nDelta + WW8SprmDataOfs( nId ) );
                            bRet = TRUE;
                        }
                        pSprm += nSL;
                        nLen -= nSL;
                    }
                }
                nStart = nNextEnd;
            }

            rReader.pPlcxMan->RestoreAllPLCFx( aSave );
        }
        rReader.pStrm->Seek( nOldPos );
    }

    if( bRet )
    {
        ( rStorageName = '_' ) += String::CreateFromInt32( nPictureId );
        rSrcStorage = rReader.pStg->OpenStorage( WW8_ASCII2STR( "ObjectPool" ) );
        SwDocShell *pDocShell = rReader.rDoc.GetDocShell();
        if (pDocShell == 0)
            bRet=FALSE;
        else
            rDestStorage = pDocShell->GetStorage();
    }
    return bRet;
}

BOOL SwMSDffManager::ShapeHasText( ULONG nShapeId, ULONG nFilePos ) const
{
    // Zur Zeit des Einlesens einer einzelnen Box, die womoeglich Teil einer
    // Gruppe ist, liegen noch nicht genuegend Informationen vor, um
    // entscheiden zu koennen, ob wir sie nicht doch als Textfeld benoetigen.
    // Also vorsichtshalber mal alle umwandeln:
    return TRUE;
}
/*
void SwMSDffManager::ProcessClientAnchor2( SvStream& rSt, DffRecordHeader& rHd, void* pData, DffObjData& rObj )
{
    if( rHd.nRecLen && rObj.nShapeId )
    {
        SvxMSDffImportData& rData = *(SvxMSDffImportData*)pData;

        SvxMSDffImportRec* pImpRec = 0;
        // find out if this shape did get a Record already
        USHORT nRecCnt = rData.GetRecCount();
        if( nRecCnt )
        {
            for(USHORT i = nRecCnt; i; )
            {
                i--;
                SvxMSDffImportRec* pRec = rData.GetRecord( i );
                if( pRec && (rObj.nShapeId == pRec->nShapeId) )
                {
                    // Nun hab ich Dich, Du Wicht!
                    pImpRec = pRec;
                    break;
                }
            }
        }
        if( !pImpRec )
        {
            SvxMSDffImportRec* pTmpRec = new SvxMSDffImportRec;
            pTmpRec->nShapeId = rObj.nShapeId;
            rData.aRecords.Insert( pTmpRec );
            pImpRec = rData.GetRecord( nRecCnt );
            if( !pImpRec )
                delete pTmpRec;
        }
        if( pImpRec )
        {
            // new
            pImpRec->pClientAnchorBuffer    =   new char[ rHd.nRecLen ];
            pImpRec->nClientAnchorLen       =   rHd.nRecLen;
            rSt.Read( pImpRec->pClientAnchorBuffer, rHd.nRecLen );
        }
    }
}
*/
/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ww8/ww8par.cxx,v 1.1.1.1 2000-09-18 17:14:58 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.143  2000/09/18 16:04:59  willem.vandorp
      OpenOffice header added.

      Revision 1.142  2000/08/28 14:54:44  khz
      #64941# compare Hd./Ft./Section info to prevent prohibited TxBx linkage

      Revision 1.141  2000/08/22 17:08:54  cmc
      #77743# OLE Import, bad seek & bad FilterOptions

      Revision 1.140  2000/08/18 09:48:24  khz
      Import Line Numbering (restart on new section)

      Revision 1.139  2000/08/18 06:47:22  khz
      Import Line Numbering

      Revision 1.138  2000/08/04 10:56:49  jp
      Soft-/HardHyphens & HardBlanks changed from attribute to unicode character

      Revision 1.137  2000/07/28 15:37:14  khz
      #73796# don't delete NumRule from Attr but set it into pDoc

      Revision 1.136  2000/07/27 10:21:30  khz
      #73796# stop ANList when opening next cell in a row and !pAktANLD->fNumberAcross

      Revision 1.135  2000/07/17 13:47:00  khz
      #73987# check if sprmSNfcPgn should cause section change or not

      Revision 1.134  2000/07/12 12:20:30  khz
      #76503# use SwFltStackEntry.bOld to mark attributes before skipping field

      Revision 1.133  2000/07/10 12:52:37  jp
      new Errormessage

      Revision 1.132  2000/06/29 20:59:03  jp
      new MS Filteroptions - change OLE-Objects to StarOffice Objects

      Revision 1.131  2000/06/28 08:07:44  khz
      #70915# Insert Section if end-note with flag 'on end of section' found

      Revision 1.130  2000/06/23 10:30:01  khz
      #71707# Make sure pNdNum is set to zero when no numbering on node

      Revision 1.129  2000/06/21 12:19:15  khz
      Task #74876 teilbehoben.

      Revision 1.128  2000/05/31 12:22:50  khz
      Changes for Unicode

      Revision 1.127  2000/05/25 08:06:41  khz
      Piece Table optimization, Unicode changes, Bugfixes

      Revision 1.126  2000/05/18 10:58:55  jp
      Changes for Unicode

      Revision 1.125  2000/05/16 12:13:01  jp
      ASS_FALSE define removed

      Revision 1.124  2000/05/16 11:21:54  khz
      Unicode code-conversion

      Revision 1.123  2000/05/05 16:26:00  cmc
      #75358# WW8 97Controls Import Fix

      Revision 1.122  2000/05/05 15:59:24  khz
      Task #74474# don't create Sections while skipping result of multi-column index-field

      Revision 1.121  2000/05/04 07:43:51  khz
      Task #75379# use new Save() and Restore()

      Revision 1.120  2000/04/17 12:01:57  khz
      Task #74837# prevent from breaking table (in Apo) when Apo-flag is missing

      Revision 1.119  2000/04/12 11:08:31  khz
      Task #74260# import FLY_PAGE-frames in Header/Footer as FLY_AT_CNTNT

      Revision 1.118  2000/04/07 09:38:20  khz
      Task #74468# insert new node when Pagebreak is in NOT EMPTY node

      Revision 1.117  2000/03/01 13:32:20  jp
      Bug #73683#: LoadDoc1 - call setredlinemode after the destroying of the pam

      Revision 1.116  2000/02/25 15:03:33  jp
      Task #72781#: new filter options for MS-filters

      Revision 1.115  2000/02/22 16:23:23  khz
      Task #72987# Ignore Sprms covering ONLY a Tab-Row-End Char #7

      Revision 1.114  2000/02/21 13:08:23  jp
      #70473# changes for unicode

      Revision 1.113  2000/02/18 09:35:14  cmc
      #69372# Improved Hyperlink Importing for WW97

      Revision 1.107  2000/02/09 11:24:20  khz
      Task #70473# char_t --> sal_Unicode

      Revision 1.106  2000/02/02 18:12:04  jp
      Task #72579#: WW8Reader can import glossaries

      Revision 1.105  2000/02/02 18:07:35  khz
      Task #69885# Read SPRMs that are stored in piece table grpprls

      Revision 1.104  2000/01/26 18:55:59  jp
      Task #72268#: flag for stored M$-VBasic storage

      Revision 1.103  2000/01/26 10:27:09  cmc
      #72268# Visual Basic Decompression

      Revision 1.102  2000/01/14 11:27:56  khz
      Task #68832# -- CORRECTION: Task Number of rev below should have been: 68832 !

      Revision 1.101  2000/01/14 11:11:31  khz
      Task #71343# look for Sprm 37 (not 5) to recognize APO

      Revision 1.100  2000/01/10 13:38:52  jp
      Task #64574#: LoadDoc1 - calculate the correct Z-Order for the SDR-Objects

      Revision 1.99  2000/01/10 12:01:58  jp
      Task #69283#: LoadDoc1 - set redline mode after the last content/attribut is inserted

      Revision 1.98  2000/01/06 15:23:41  khz
      Task #71411# Let last Section be unbalanced

      Revision 1.97  1999/12/23 16:08:47  khz
      Task #70788# Set bStartLine on each char 0x0c

      Revision 1.96  1999/12/23 14:02:58  khz
      Task #68143# avoid attributes atached solely to Cell-End marks

      Revision 1.95  1999/12/22 18:03:09  khz
      Task #70919# look if ParaStyle is different behind filed than it was before

      Revision 1.94  1999/12/21 09:25:51  khz
      Task #71111# Prevent from reading CONTENT when skiping field attributes

*************************************************************************/
diff --git a/sw/source/filter/ww8/ww8par.hxx b/sw/source/filter/ww8/ww8par.hxx
new file mode 100644
index 0000000..8c68d6f
--- /dev/null
+++ b/sw/source/filter/ww8/ww8par.hxx
@@ -0,0 +1,1287 @@
/*************************************************************************
 *
 *  $RCSfile: ww8par.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:58 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _WW8PAR_HXX
#define _WW8PAR_HXX


//#ifndef _COM_SUN_STAR_DRAWING_XSHAPE_HPP_
//#include <com/sun/star/drawing/XShape.hpp>
//#endif
//#ifndef _COM_SUN_STAR_FORM_XFORMCOMPONENT_HPP_
//#include <com/sun/star/form/XFormComponent.hpp>
//#endif
//#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
//#include <com/sun/star/beans/XPropertySet.hpp>
//#endif

#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif
#ifndef _VCL_COLOR_HXX
#include <vcl/color.hxx>
#endif
#ifndef _SV_FONTTYPE_HXX //autogen
#include <vcl/fonttype.hxx>
#endif
#ifndef _SVSTOR_HXX //autogen
#include <so3/svstor.hxx>
#endif

#ifndef _FLTSHELL_HXX
#include <fltshell.hxx>         // fuer den Attribut Stack
#endif
#ifndef _WW8STRUC_HXX
#include <ww8struc.hxx>     // WW8_BRC ( Forward-Declaration mit anschliessender
#endif                      // Benutzung von WW8_BRC[4] in Deklaration will der
                            // doofe Os2Blci nicht )
#ifndef _WW8SCAN_HXX
#include <ww8scan.hxx>  // WW8Fib
#endif

#ifndef _WW8GLSY_HXX
#include <ww8glsy.hxx>
#endif

#ifndef _MSDFFIMP_HXX
#include <svx/msdffimp.hxx>
#endif

#ifndef _MSOCXIMP_HXX
#include <msocximp.hxx>
#endif


#define WW8_ASCII2STR(s) String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM(s))


class SvStringsDtor;
class SwDoc;
class SwPaM;
class SfxPoolItem;
class SwTxtFmtColl;
class SwPageDesc;
class SvxBoxItem;
class SwFmt;
class SwNodeIndex;
class SwFlyFrmFmt;
class SvxTabStopItem;
class SwAttrSet;
class SwNumRule;
class SwFrmFmt;

//class WW8CtrlStack;
class SwFltControlStack;
//class WW8EndStack;
class SwFltEndStack;
class SwWW8StyInf;
class WW8Fib;
class WW8PLCFMan;
struct WW8PLCFManResult;
class WW8Fonts;
class WW8RStyle;
class WW8PLCF_HdFt;
class Plcx_Fkp;
class WW8PLCFx_SEPX;
class WW8Dop;
class WW8ScannerBase;
struct WW8FieldDesc;
struct WW8FlyPara;
struct WW8SwFlyPara;
struct WmfFileHd;
struct WW8_PIC;
class WW8TabDesc;
struct WW8_SHD;
struct WW8_OLST;
class SwNumFmt;
struct WW8_ANLD;
struct WW8_ANLV;
struct WW8_DO;
struct WW8_DPHEAD;
struct WW8_FSPA;
class Plc1;
class SwDrawFrmFmt;
class SdrModel;
class SdrPage;
class SdrObjList;
class SdrObject;
class SdrTextObj;
class Size;
class EditEngine;
struct SwPosition;
class SvShorts;
class WW8ReaderSave;
struct WW8PicDesc;
class Graphic;
//class String;
class SwFieldType;
class SvStorage;
// alt: class SvStorageRef;
class SwFlyFrmFmt;
class SwAttrSet;
class GDIMetaFile;
struct ESelection;
class SfxItemSet;
struct WW8PLCFxDesc;

struct WW8ULSpaceData;
class SdrAttrObj;
struct WW8ULSpaceData;

namespace com{namespace sun {namespace star{
    namespace beans{ class XPropertySet;}
    namespace form { class XFormComponent;}
    namespace drawing{class XShape;}
    namespace lang{class XMultiServiceFactory;}
}}}

//#define WW8_CHARBUF_SIZE 1040 // Lese-Puffer fuer nackten Text

// defines nur fuer die WW8-variable der INI-Datei

#define WW8FL_NO_TEXT        1
#define WW8FL_NO_STYLES      2
#define WW8FL_NO_ZSTYLES     4  // keine Zeichenstyles importieren
#define WW8FL_NO_APO         8
#define WW8FL_NO_HDFT     0x10
#define WW8FL_NO_FTN      0x20
#define WW8FL_NO_FLD      0x40  // keine Felder
#define WW8FL_NO_GRAF     0x80
#define WW8FL_NO_DEFTABS 0x100  // keine impliziten Tabs
#define WW8FL_NO_LRUL    0x200


#define WW8FL_NO_DEFSTYLES        0x400 // falls gestetzt, werden fuer Writer-Def-Styles
                                        // neue Styles mit den WW8-Def-Style-Eigenschaften
                                        // erzeugt, statt die Writer-Standards zu ueberschreiben

#define WW8FL_NO_TABLE            0x800
#define WW8FL_NO_OUTLINE         0x1000
#define WW8FL_NO_NUMRULE         0x2000
#define WW8FL_NO_IMPLPASP        0x4000  // no implicit para space
#define WW8FL_NO_GRAFLAYER       0x8000
#define WW8FL_NO_COMPLEX        0x10000
#define WW8FL_NO_OLE            0x20000
#define WW8FL_OLE_TO_GRAF       0x40000
#define WW8FL_NO_VCCONTROLS     0x80000
#define WW8FL_NO_STD_STY_DYA   0x100000
#define WW8FL_NO_COLS          0x200000
#define WW8FL_NO_TOX           0x400000
#define WW8FL_NO_IMPORT      0x20000000
#define WW8FL_WRITE_TO_FILE  0x40000000
#define WW8FL_NOWARN_COMPLEX 0x80000000

// Zusatz-Filter-Flags, gueltig ab Winword 8
#define WW8FL_NO_FLY_FOR_TXBX         1
#define EQUAL_TAB_BORDERDISTS         2


//-----------------------------------------
//            Listen-Manager (ab Ver8)
//-----------------------------------------

struct WW8LSTInfo;
struct WW8LFOInfo;

typedef WW8LSTInfo* WW8LSTInfo_Ptr;
typedef WW8LFOInfo* WW8LFOInfo_Ptr;
// Zeichenattribute aus GrpprlChpx
typedef SfxItemSet* WW8aISet[nWW8MaxListLevel ];
// Zeichen Style Pointer
typedef SwCharFmt* WW8aCFmt[ nWW8MaxListLevel ];
// Redlining: match WinWord author ids to StarWriter author ids
struct WW8AuthorInfo;
typedef WW8AuthorInfo* WW8AuthorInfo_Ptr;

SV_DECL_PTRARR_SORT_DEL(WW8LSTInfos,    WW8LSTInfo_Ptr,     16,16);
SV_DECL_PTRARR_DEL(     WW8LFOInfos,    WW8LFOInfo_Ptr,     16,16);
SV_DECL_PTRARR_SORT_DEL(WW8AuthorInfos, WW8AuthorInfo_Ptr,  16,16);

class SwWW8ImplReader;
class WW8ListManager
{
    SwWW8ImplReader& rReader;
    SwDoc&           rDoc;
    const WW8Fib&    rFib;
    SvStream&        rSt;
    WW8LSTInfos* pLSTInfos;// Daten aus PLCF LST, sortiert nach LST Id
    WW8LFOInfos* pLFOInfos;// D. aus PLF LFO, sortiert genau wie im WW8 Stream
    USHORT       nLSTInfos;// geht schneller als Abfrage von pLSTInfos->Count()
    USHORT       nLFOInfos;// dito
    BYTE* GrpprlHasSprm(USHORT nId, BYTE& rSprms, BYTE nLen);
    WW8LSTInfo* GetLSTByStreamPos( USHORT nStreamPos ) const;
    WW8LSTInfo* GetLSTByListId(    ULONG  nIdLst     ) const;
    BOOL ReadLVL(   BYTE nLevel,
                    SwNumFmt& rNumFmt,
                    SfxItemSet*& rpItemSet,
                    USHORT nLevelStyle,
                    BOOL bSetStartNo );
    void AdjustLVL( BYTE       nLevel,
                    SwNumRule& rNumRule,
                    WW8aISet&  rListItemSet,
                    WW8aCFmt&  aCharFmt,
                    BOOL&      bNewCharFmtCreated,  // Ausgabe-Parameter
                    String     aPrefix = aEmptyStr );
    BOOL LFOequaltoLST(WW8LFOInfo& rLFOInfo);
public:
    WW8ListManager(SvStream& rSt_, SwWW8ImplReader& rReader_);
    ~WW8ListManager();
    SwNumRule* GetNumRuleForActivation(USHORT nLFOPosition) const;
    BOOL IsSimpleList(USHORT nLFOPosition) const;
};



//-----------------------------------------
//            Stack
//-----------------------------------------
class SwWW8FltControlStack : public SwFltControlStack
{
    USHORT nToggleAttrFlags;
protected:
    virtual void SetAttrInDoc(const SwPosition& rTmpPos, SwFltStackEntry* pEntry);

public:
    SwWW8FltControlStack( SwDoc* pDo, ULONG nFieldFl ) :
        SwFltControlStack( pDo, nFieldFl ), nToggleAttrFlags( 0 )
    {}

    BOOL IsFtnEdnBkmField(SwFmtFld& rFmtFld, USHORT& nBkmNo);
    void NewAttr(const SwPosition& rPos, const SfxPoolItem& rAttr);
    void SetToggleAttr( BYTE nId, BOOL bOn )
    {
        if( bOn )
            nToggleAttrFlags |= (1 << nId);
        else
            nToggleAttrFlags &= ~(1 << nId);
    }
    USHORT GetToggleAttrFlags() const { return nToggleAttrFlags; }
};



//-----------------------------------------
//     Redlining Authors
//-----------------------------------------
struct WW8AuthorInfo
{
    USHORT nWWAuthorId;
    USHORT nOurId;

    WW8AuthorInfo(USHORT nWWAuthorId_, USHORT nOurId_ = 0):
        nWWAuthorId( nWWAuthorId_ ),
        nOurId(      nOurId_ )
        {}
    BOOL operator==( const WW8AuthorInfo& rEntry ) const
    {
        return (nWWAuthorId == rEntry.nWWAuthorId);
    }
    BOOL operator<( const WW8AuthorInfo& rEntry ) const
    {
        return (nWWAuthorId < rEntry.nWWAuthorId);
    }
};



//-----------------------------------------
//    Mini-Merker fuer einige Flags
//-----------------------------------------
class WW8ReaderSave
{
    SwPosition aTmpPos;
    SwWW8FltControlStack* pOldStck;
    WW8PLCFxSaveAll aPLCFxSave;
    WW8PLCFMan* pOldPlcxMan;

    WW8FlyPara* pWFlyPara;
    WW8SwFlyPara* pSFlyPara;
    WW8TabDesc* pTableDesc;
    USHORT nAktColl;
    sal_Unicode cSymbol;
    BOOL bIgnoreText    : 1;
    BOOL bDontCreateSep : 1;
    BOOL bSymbol        : 1;
    BOOL bHdFtFtnEdn    : 1;
    BOOL bApo           : 1;
    BOOL bTxbxFlySection: 1;
    BOOL bTable         : 1;
    BOOL bTableInApo    : 1;
    BOOL bAnl           : 1;
public:
    WW8ReaderSave( SwWW8ImplReader* pRdr, WW8_CP nStart=-1 );
    void Restore( SwWW8ImplReader* pRdr );
};



enum eF_ResT{ F_OK, F_TEXT, F_TAGIGN, F_TAGTXT, F_READ_FSPA };

struct SwWW8Shade{
    Color aColor;
    BOOL  bWhiteText;
    SwWW8Shade( BOOL bVer67, const WW8_SHD& rSHD );
};


//-----------------------------------------
//    Formulas
//-----------------------------------------
enum SwWw8ControlType
{
    WW8_CT_EDIT,
    WW8_CT_CHECKBOX,
    WW8_CT_COMBOBOX
};


class WW8FormulaControl : public OCX_Control
{
public:
    WW8FormulaControl(const UniString& sN,SwWW8ImplReader &rR)
        : OCX_Control(sN), rRdr(rR) {}
    void WW8FormulaControl::SetOthersFromDoc(com::sun::star::uno::Reference <com::sun::star::form::XFormComponent> &rFComp,
        com::sun::star::awt::Size &rSz,
        com::sun::star::uno::Reference <com::sun::star::beans::XPropertySet> &rPropSet);

    UINT8   fToolTip:1;
    UINT8   fNoMark:1;
    UINT8   fUseSize:1;
    UINT8   fNumbersOnly:1;
    UINT8   fDateOnly:1;
    UINT8   fUnused:3;
    UINT16  nSize;

    UINT16  hpsCheckBox;
    UINT16 nChecked;

    UniString sTitle;
    UniString sDefault;
    UniString sFormatting;
    UniString sHelp;
    UniString sToolTip;

    void Read(SwWw8ControlType nWhich,SvStream *pD);
private:
    SwWW8ImplReader &rRdr;
};

class WW8FormulaCheckBox: public WW8FormulaControl
{
public:
    WW8FormulaCheckBox(SwWW8ImplReader &rR)
        : WW8FormulaControl( WW8_ASCII2STR( "CheckBox" ), rR)
        {}
    BOOL Convert(const com::sun::star::uno::Reference <com::sun::star::lang::XMultiServiceFactory> &rServiceFactory,
        com::sun::star::uno::Reference <com::sun::star::form::XFormComponent> &rFComp,com::sun::star::awt::Size &rSz);

};

class WW8FormulaEditBox: public WW8FormulaControl
{
public:
    WW8FormulaEditBox(SwWW8ImplReader &rR)
        : WW8FormulaControl( WW8_ASCII2STR( "TextField" ) ,rR)
        {}
    BOOL Convert(const com::sun::star::uno::Reference <com::sun::star::lang::XMultiServiceFactory> &rServiceFactory,
        com::sun::star::uno::Reference <com::sun::star::form::XFormComponent> &rFComp,com::sun::star::awt::Size &rSz);

};

class SwImportControls : public SwImportOCX
{
public:
    SwImportControls( SfxObjectShell *pDSh,SwPaM *pP ) :
        SwImportOCX( pDSh,pP ) {}
        BOOL InsertFormula( WW8FormulaControl &rFormula,
                            com::sun::star::uno::Reference <com::sun::star::drawing::XShape> *pShapeRef=0 );
};

class SwMSDffManager : public SvxMSDffManager
{
    SwWW8ImplReader& rReader;
    virtual BOOL GetOLEStorageName( long nOLEId, String& rStorageName,
                                    SvStorageRef& rSrcStorage,
                                    SvStorageRef& rDestStorage ) const;
    virtual BOOL ShapeHasText( ULONG nShapeId, ULONG nFilePos ) const;
//  virtual void ProcessClientAnchor2( SvStream& rStData, DffRecordHeader& rHd, void* pData, DffObjData& );

public:
    SwMSDffManager( SwWW8ImplReader& rRdr );
    static UINT32 GetFilterFlags();
};


//-----------------------------------------
//            Storage-Reader
//-----------------------------------------
class SwWW8ImplReader
{
friend class WW8RStyle;
friend class WW8TabDesc;
friend class WW8ReaderSave;
friend struct WW8FlyPara;
friend struct WW8SwFlyPara;
friend class WW8FlySet;
friend class SwMSDffManager;
friend class WW8FormulaControl;

    SvStorage* pStg;                // Input-Storage
    SvStream* pStrm;                // Input-(Storage)Stream
    SvStream* pTableStream;         // Input-(Storage)Stream
    SvStream* pDataStream;          // Input-(Storage)Stream

// allgemeines
    SwDoc& rDoc;
    SwPaM* pPaM;

    SwWW8FltControlStack* pCtrlStck;    // Stack fuer die Attribute
    SwFltEndStack*        pEndStck;     // End-Stack fuer die Attribute
    SwWW8FltControlStack* pRefFldStck;  // for Reference Fields

//  BYTE* pCharBuf;             // Puffer fuer nackten Text
    SwImportControls *pFormImpl;    // Control-Implementierung

    SwFlyFrmFmt* pFlyFmtOfJustInsertedGraphic;
    WW8Fib* pWwFib;
    WW8Fonts* pFonts;
    WW8Dop* pWDop;
    WW8ListManager* pLstManager;
    WW8ScannerBase* pSBase;
    WW8PLCFMan* pPlcxMan;

    WW8RStyle* pStyles;             // Pointer auf die Style-Einleseklasse
    SwFmt* pAktColl;                // gerade zu erzeugende Collection
                                    // ( ist ausserhalb einer Style-Def immer 0 )
    SfxItemSet* pAktItemSet;        // gerade einzulesende Zeichenattribute
                                    // ( ausserhalb des WW8ListManager Ctor's immer 0 )
    SwWW8StyInf* pCollA;            // UEbersetzungs-Array der Styles
    const SwTxtFmtColl* pDfltTxtFmtColl;    // Default
    SwFmt* pStandardFmtColl;        // "Standard"

    SwPageDesc* pPageDesc;      // fuer uebernommene KF-Zeilen
    WW8PLCF_HdFt* pHdFt;        // Pointer auf Header / Footer - Scannerklasse

    WW8FlyPara* pWFlyPara;      // WW-Parameter
    WW8SwFlyPara* pSFlyPara;    // daraus erzeugte Sw-Parameter

    WW8TabDesc* pTableDesc;     // Beschreibung der Tabelleneigenschaften

    SwNumRule* pNumRule;        // fuer Nummerierung / Aufzaehlungen im Text
    WW8_OLST* pNumOlst;         // Gliederung im Text
    SwNodeIndex* pBehindSection;// Node-Index zum Zuruecksetzen des PaM nach einem Bereich
    SwSection*   pNewSection;   // last Section that was inserted into the doc

    SwNode*      pNode_FLY_AT_CNTNT; // set: WW8SwFlyPara()   read: CreateSwTable()

    SwDrawFrmFmt *pDrawFmt;     // wie FlyFrmFmt
    SdrModel* pDrawModel;
    SdrPage* pDrawPg;
    SdrObjList* pDrawGroup;
    SvShorts* pDrawHeight;      // Welches Objekt ueberdeckt welches ?
    EditEngine* pDrawEditEngine;

    SwFieldType* pNumFldType;   // fuer Nummernkreis

    SvxMSDffManager* pMSDffManager;

    SvStringsDtor* pAtnNames;

    WW8AuthorInfos* pAuthorInfos;

    SwNodeIndex* pLastPgDeskIdx;// for inserting a section when Ft-/End-Note
                                // with flag 'on end of section' set

                                // Ini-Flags:
    ULONG nIniFlags;            // Flags aus der writer.ini
    ULONG nIniFlags1;           // dito ( zusaetzliche Flags )
//  ULONG nIniHdSiz;            // dito fuer Header
    ULONG nIniFtSiz;            // dito fuer Default-Size Footer
    ULONG nFieldFlags;          // dito fuer Feldern
    ULONG nFieldTagAlways[3];   // dito fuers Taggen von Feldern
    ULONG nFieldTagBad[3];      // dito fuers Taggen von nicht importierbaren F.

    ULONG nLastFlyNode;         // Node number of last imported Fly

    ULONG nImportedGraphicsCount;   // benoetigt fuer MakeUniqueGraphName()

    ULONG nHdTextHeight;        // Hoehe des eingelesenen Headers
    ULONG nFtTextHeight;        // Hoehe des eingelesenen Footers

    ULONG nDrawObjOfs;
    long nDrawCpO;              // Anfang der Txbx-SubDocs

    long nPicLocFc;             // Picture Location in File (FC)
    long nObjLocFc;             // Object Location in File (FC)

    INT32 nIniFlyDx;            // X-Verschiebung von Flys
    INT32 nIniFlyDy;            // Y-Verschiebung von Flys

    rtl_TextEncoding eTextCharSet;      // Default-Charset fuer Text
    rtl_TextEncoding eStructCharSet;        // rtl_TextEncoding fuer interne Strukturen
    rtl_TextEncoding eFontSrcCharSet;   // Source-rtl_TextEncoding fuer aktuellen Font
    rtl_TextEncoding eFontDstCharSet;   // Dest-rtl_TextEncoding fuer aktuellen Font
    rtl_TextEncoding eHardCharSet;       // Hartes rtl_TextEncoding-Attribut

    USHORT nProgress;           // %-Angabe fuer Progressbar
    USHORT nColls;              // Groesse des Arrays
    USHORT nAktColl;            // gemaess WW-Zaehlung
    USHORT nPageDescOffset;     // fuer UpdatePageDescs
    USHORT nDrawTxbx;           // Nummer der Textbox ( noetig ?? )
    USHORT nFldNum;             // laufende Nummer dafuer
    USHORT nLFOPosition;

    short nActSectionNo;        // aktuelle Abschnitts-Nummer (in CreateSep() gesetzt)
    short nCharFmt;             // gemaess WW-Zaehlung, <0 fuer keine
    short nAlign2;
    short nPgWidth;
    short nPgTop;               // fuer APOs
    short nPgLeft;              // Seitenraender, z.B. fuer APOs, Tabellen
    short nPgRight;             // dito

    short nLeftParaMgn;         // Absatz L-Space
    short nTxtFirstLineOfst;    // Absatz 1st line ofset

    short nDrawXOfs, nDrawYOfs;
    short nDrawXOfs2, nDrawYOfs2;

    sal_Unicode cSymbol;        // aktuell einzulesendes Symbolzeichen


    BYTE nWantedVersion;        // urspruenglich vom Writer
                                // angeforderte WW-Doc-Version


    BYTE nSwNumLevel;           // LevelNummer fuer Outline / Nummerierung
    BYTE nWwNumType;            // Gliederung / Nummerg / Aufzaehlg
    BYTE nDrawHeaven, nDrawHell;
    BYTE nListLevel;

    BYTE nNfcPgn;               // Formatting of PageNum
    BYTE nPgChpDelim;           // ChapterDelim from PageNum
    BYTE nPgChpLevel;           // ChapterLevel of Heading from PageNum

    BYTE nCorrIhdt;             // used in CreateSep()
    BOOL bSectionHasATitlePage; // used in CreateSep()

    BOOL bNew;              // Neues Dokument ?
    BOOL bReadNoTbl;        // Keine Tabellen
    BOOL bPgSecBreak;       // Page- oder Sectionbreak ist noch einzufuegen
    BOOL bSpec;             // Special-Char im Text folgt
    BOOL bObj;              // Obj im Text
    BOOL bApo;              // FlyFrame, der wegen Winword APO eingefuegt wurde
    BOOL bTxbxFlySection;   // FlyFrame, der als Ersatz fuer Winword Textbox eingefuegt wurde
    BOOL bHasBorder;        // fuer Buendelung der Border
    BOOL bSymbol;           // z.B. Symbol statt Times
    BOOL bIgnoreText;       // z.B. fuer FieldVanish
    BOOL bDontCreateSep;    // e.g. when skipping result of multi-column index-field
     BOOL bTable;           // wird gerade eine Tabelle eingelesen
    BOOL bTableInApo;       // Table is contained in Apo
    BOOL bWasTabRowEnd;     // Tabelle : Row End Mark
    BOOL bTxtCol;           // TextFarbe direkt gesetzt
    BOOL bShdTxtCol;        // Textfarbe indirekt gesetzt ( Hintergrund sw )
    BOOL bCharShdTxtCol;    // Textfarbe indirekt gesetzt ( Zeichenhintergrund sw )
    BOOL bAnl;              // Nummerierung in Bearbeitung
                                // Anl heisst Autonumber level

    BOOL bHdFtFtnEdn;       // Spezialtext: Kopf- Fuss- usw.
    BOOL bFtnEdn;           // Fussnote oder Endnote
    BOOL bIsHeader;         // Text aus Header wird gelesen ( Zeilenhoehe )
    BOOL bIsFooter;         // Text aus Footer wird gelesen ( Zeilenhoehe )

    BOOL bIsUnicode;            // aktuelles Text-Stueck ist als 2-Bytiger-Unicode kodiert
                                // bitte NICHT als Bitfeld kodieren!

    BOOL bCpxStyle;         // Style im Complex Part
    BOOL bStyNormal;        // Style mit Id 0 wird gelesen
    BOOL bWWBugNormal;      // WW-Version nit Bug Dya in Style Normal
    BOOL bNoAttrImport;     // Attribute ignorieren zum Ignorieren v. Styles

    // praktische Hilfsvariablen:
    BOOL bVer67;            // ( (6 == nVersion) || (7 == nVersion) );
    BOOL bVer6;             //   (6 == nVersion);
    BOOL bVer7;             //   (7 == nVersion);
    BOOL bVer8;             //   (8 == nVersion);

    BOOL bPgChpLevel;       // ChapterLevel of Heading from PageNum
    BOOL bEmbeddObj;        // EmbeddField gelesen
    BOOL bFloatingCtrl;     // Whether to anchor imported controls as char or para

    BOOL bAktAND_fNumberAcross; // current active Annotated List Deskriptor - ROW flag

    BOOL bNoLnNumYet;       // no Line Numbering has been activated yet (we import
                            //     the very 1st Line Numbering and ignore the rest)
    BOOL bRestartLnNumPerSection;




//---------------------------------------------

    void SetLastPgDeskIdx();

    SwPageDesc* CreatePageDesc( SwPageDesc* pFirstPageDesc,
                                SwPaM** ppPaMWanted = 0 );
    void RemoveCols( SwPageDesc& rPageDesc, SwFmtCol*& rpCol );
    BOOL SetCols( SwFrmFmt* pFmt, const WW8PLCFx_SEPX* pSep,
                    USHORT nNettoWidth,
                    BOOL bTestOnly = FALSE );
    void SetPage1( SwPageDesc* pPageDesc, SwFrmFmt &rFmt,
                   const WW8PLCFx_SEPX* pSep, USHORT nLIdx,
                   BOOL bIgnoreCols );
    void SetHdFt( SwPageDesc* pPageDesc0, SwPageDesc* pPageDesc1,
                  const WW8PLCFx_SEPX* pSep, BYTE nIPara );
    void GetPageULData( const  WW8PLCFx_SEPX* pSep,
                        USHORT nLIdx,
                        BOOL   bFirst,
                        WW8ULSpaceData& rData );
    void SetPageULSpaceItems( SwFrmFmt &rFmt, WW8ULSpaceData& rData );

    void SetPageBorder( SwPageDesc* pPageDesc0, SwPageDesc* pPageDesc1,
                        const WW8PLCFx_SEPX* pSep, USHORT nLIdx );
    void SetUseOn( SwPageDesc* pPageDesc0, SwPageDesc* pPageDesc1,
                   const WW8PLCFx_SEPX* pSep, BYTE nHdFt );
    void InsertSectionWithWithoutCols( SwPaM& rMyPaM, const SwFmtCol* pCol );
    void CreateSep( const long nTxtPos );

    void CopyPageDescHdFt( const SwPageDesc* pOrgPageDesc,
                           SwPageDesc* pNewPageDesc, BYTE nCode );

    void UpdatePageDescs( USHORT nPageDescOffset );

    void DeleteStk(SwFltControlStack* prStck);
    void DeleteCtrlStk()    { DeleteStk( pCtrlStck  ); pCtrlStck   = 0; }
    void DeleteEndStk()     { DeleteStk( pEndStck   ); pEndStck    = 0; }
    void DeleteRefFldStk()  { DeleteStk( pRefFldStck); pRefFldStck = 0; }

    BOOL ReadChar( long nPosCp, long nCpOfs );
    BOOL ReadPlainChars( long& rPos, long nEnd, long nCpOfs );
    BOOL ReadChars( long& rPos, long nNextAttr, long nTextEnd, long nCpOfs );


    void ReadPlainText( long nStartCp, long nTextLen );
    void ProcessAktCollChange(  WW8PLCFManResult& rRes,
                                BOOL* pStartAttr,
                                BOOL bCallProcessSpecial );
    long ReadTextAttr( long& rTxtPos, BOOL& rbStartLine );
    void ReadAttrs( long& rNext, long& rTxtPos, BOOL& rbStartLine );
    void ReadAttrEnds( long& rNext, long& rTxtPos );
    void ReadText( long nStartCp, long nTextLen, short nType );

    void ReadRevMarkAuthorStrTabl( SvStream& rStrm, INT32 nTblPos, INT32 nTblSiz, SwDoc& rDoc );

    void Read_HdFtFtnText( const SwNodeIndex* pSttIdx, long nStartCp,
                           long nLen, short nType );
    void Read_HdFt1( BYTE nPara, BYTE nWhichItems, SwPageDesc* pPD );
    void Read_HdFtText( long nStartCp, long nLen, SwPageDesc* pPD,
                             BOOL bUseLeft, BOOL bFooter );

    BYTE* ReadUntilToken( USHORT& rStrLen, USHORT nMaxLen, BYTE nToken );
    void ImportTox( int nFldId, String aStr );

    void EndSprm( USHORT nId );
    void NewAttr( const SfxPoolItem& rAttr );

    BOOL GetFontParams( USHORT, FontFamily&, String&, FontPitch&, rtl_TextEncoding& );
    BOOL SetNewFontAttr( USHORT nFCode, BOOL bSetEnums=TRUE );
    void ResetCharSetVars();

    const SfxPoolItem* GetFmtAttr( USHORT nWhich );
    BYTE HdFtCorrectPara( BYTE nPara );
    BOOL JoinNode( SwPaM* pPam, BOOL bStealAttr = FALSE );

    BOOL IsBorder( const WW8_BRC* pbrc, BOOL bChkBtwn=FALSE );
    BOOL SetBorder( SvxBoxItem& pBox, const WW8_BRC* pbrc, BOOL bChkBtwn=FALSE );
    void GetBorderDistance( WW8_BRC* pbrc, Rectangle& rInnerDist );
    BOOL SetShadow( SvxShadowItem& rShadow, const SvxBoxItem& rBox, const WW8_BRC pbrc[4] );

    void SetFlyBordersShadow( SfxItemSet& rFlySet,
                              const WW8_BRC pbrc[4], USHORT nInnerMgn );

    BOOL MatchSdrBoxIntoFlyBoxItem( const Color& rLineColor,
                                    MSO_LineStyle eLineStyle,
                                    USHORT      nLineWidth,
                                    SvxBoxItem& rBox );
    void MatchSdrItemsIntoFlySet( SdrObject*    pSdrObj,
                                  SfxItemSet&   aFlySet,
                                  MSO_LineStyle eLineStyle,
                                  Rectangle&    rInnerDist,
                                  BOOL          bFixSize );
    void MatchWrapDistancesIntoFlyFmt( SvxMSDffImportRec* pRecord,
                                       SwFrmFmt*          pFlyFmt );

    void SetCropAtGrfNode( SvxMSDffImportRec* pRecord,
                           SwFrmFmt*          pFlyFmt,
                           WW8_FSPA*          pF );

    BOOL StartApo( BYTE* pSprm29, BOOL bNowStyleApo );
    void StopApo();
    BOOL TestSameApo( BYTE* pSprm29, BOOL bNowStyleApo );
    BYTE* TestApo( BOOL& rbStartApo, BOOL& rbStopApo, BOOL& rbNowStyleApo,
                   BOOL bInTable,    BOOL bTableRowEnd,
                   BOOL bStillInTable );
    BOOL ProcessSpecial( BOOL bAllEnd, BOOL* pbReSync );

    ULONG ReadWmfHeader( WmfFileHd* pHd, long nPos );
    BOOL ReadGrafFile( String& rFileName, Graphic*& rpGraphic,
       const WW8_PIC& rPic, SvStream* pSt, ULONG nFilePos, BOOL* pDelIt );

    SwFrmFmt* MakeGrafByFlyFmt( SdrTextObj* pReplaceTextObj,
                                const SwFrmFmt& rOldFmt,const WW8PicDesc& rPD,
                                const Graphic*  pGraph, const String& rFileName,
                                const String&   rGrName,const SfxItemSet& rGrfSet,
                                const BOOL  bSetToBackground );
    SwFrmFmt* MakeGrafNotInCntnt(const WW8PicDesc& rPD,
                                 const Graphic* pGraph, const String& rFileName,
                                 const String&  rGrName,const SfxItemSet& rGrfSet );
    SwFrmFmt* MakeGrafInCntnt(const WW8_PIC& rPic,   const WW8PicDesc& rPD,
                              const Graphic* pGraph, const String& rFileName,
                              const String&  rGrName,const SfxItemSet& rGrfSet );

    SwFrmFmt* ImportGraf1( WW8_PIC& rPic, SvStream* pSt, ULONG nFilePos );
    SwFrmFmt* ImportGraf(  SdrTextObj* pTextObj = 0,
                           SwFrmFmt*   pFlyFmt = 0,
                           BOOL        bSetToBackground = FALSE );
    BOOL ImportURL(String &sURL,String &sMark,WW8_CP nStart);

    SwFrmFmt* ImportOle( const Graphic* = 0, const SfxItemSet* pFlySet = 0 );

    BOOL ImportFormulaControl(WW8FormulaControl &rBox,WW8_CP nStart,
        SwWw8ControlType nWhich);

    void ImportDop( BOOL bNewDoc );
    void SetImplicitTab();
    ULONG LoadDoc1( SwPaM& rPaM ,WW8Glossary *pGloss);

    BOOL StartTable();
    void TabCellEnd();
    void StopTable();
    short GetTableLeft();
    BOOL IsInvalidOrToBeMergedTabCell() const;

//  Brush* Shade1( SwWW8Shade& rRet, WW8_SHD* pS );

    ColorData GetCol( BYTE nIco );

// Nummerierungen / Aufzaehlungen ( Autonumbered List Data Descriptor )
// Liste:        ANLD ( Autonumbered List Data Descriptor )
//   eine Ebene: ANLV ( Autonumber Level Descriptor )
//
// Chg7-8:
// Listen sind in WW8 eigene Strukturen, die ueber folgende drei Tabellen
// verwaltet werden: rglst, hpllfo und hsttbListNames
// die Strukturen hierfuer sind: LSTF, LVLF, LFO LFOLVL

    void SetAnlvStrings( SwNumFmt* pNum, WW8_ANLV* pAV, BYTE* pTxt,
                            BOOL bOutline );
    void SetAnld( SwNumRule* pNumR, WW8_ANLD* pAD, BYTE nSwLevel, BOOL bOutLine );
    void SetNumOlst( SwNumRule* pNumR, WW8_OLST* pO, BYTE nSwLevel );
    SwNumRule* GetStyRule();

    void StartAnl( BYTE* pSprm13 );
    void NextAnlLine( BYTE* pSprm13, BYTE* pS12 = 0 );
    void StopAnl( BOOL bGoBack = TRUE );

// GrafikLayer

    BOOL MakeUniqueGraphName(String& rName, const String& rFixedPart);

    BOOL ReadGrafStart( void* pData, short nDataSiz, WW8_DPHEAD* pHd,
                        WW8_DO* pDo );
    void InsertObj( SdrObject* pObj, short nWwHeight );
    void ReadLine( WW8_DPHEAD* pHd, WW8_DO* pDo );
    void ReadRect( WW8_DPHEAD* pHd, WW8_DO* pDo );
    void ReadElipse( WW8_DPHEAD* pHd, WW8_DO* pDo );
    void ReadArc( WW8_DPHEAD* pHd, WW8_DO* pDo );
    void ReadPolyLine( WW8_DPHEAD* pHd, WW8_DO* pDo );
    ESelection GetESelection( long nCpStart, long nCpEnd );
    /*
    void GetTxbxCharAttrs( SfxItemSet& rS, const WW8PLCFxDesc& rD, BOOL bONLYnPicLocFc );
    void GetTxbxParaAttrs( SfxItemSet& rS, const WW8PLCFxDesc& rD );
    */
    void GetTxbxPapAndCharAttrs( SfxItemSet& rS, const WW8PLCFManResult& rRes );
    //void InsertTxbxCharAttrs( long nStartCp, long nEndCp, BOOL bONLYnPicLocFc );
    void InsertTxbxStyAttrs( SfxItemSet& rS, USHORT nColl );
    //void InsertTxbxParaAttrs( long nStartCp, long nEndCp );
    void InsertTxbxAttrs( long nStartCp, long nEndCp, BOOL bONLYnPicLocFc );

    BOOL GetTxbxTextSttEndCp( long& rStartCp, long& rEndCp,
                                USHORT nTxBxS, USHORT nSequence );
    BOOL GetTxbxText( String& rString, long StartCp, long nEndCp );
    SwFrmFmt* InsertTxbxText(SdrTextObj*    pTextObj,
                        Size*       pObjSiz,
                        USHORT      nTxBxS,
                        USHORT      nSequence,
                        long        nPosCp,
                        SwFrmFmt*   pFlyFmt,
                        BOOL        bMakeSdrGrafObj,
                        BOOL&       rbEraseTextObj,
                        BOOL*       pbTestTxbxContainsText = 0,
                        long*       pnStartCp      = 0,
                        long*       pnEndCp        = 0,
                        SvxMSDffImportRec* pRecord = 0);
    BOOL TxbxChainContainsRealText( USHORT nTxBxS,
                                    long&  rStartCp,
                                    long&  rEndCp );
    void ReadTxtBox( WW8_DPHEAD* pHd, WW8_DO* pDo );
    void ReadCaptionBox( WW8_DPHEAD* pHd, WW8_DO* pDo );
    void ReadGroup( WW8_DPHEAD* pHd, WW8_DO* pDo );
    void ReadGrafPrimitive( short& rLeft, WW8_DO* pDo );
    void ReadGrafLayer1( WW8PLCFspecial* pPF, long nGrafAnchorCp );
    SdrObject* CreateContactObject( SwFlyFrmFmt* pFlyFmt );
    SwFrmFmt* Read_GrafLayer( long nGrafAnchorCp );
    void GrafikCtor();
    void GrafikDtor();

// anderes
    String GetFieldResult( WW8FieldDesc* pF );
    void QuoteChar( String& rStr, const sal_Unicode _c, BOOL bAllowCr );
    void QuoteString( String& rStr, const String& rOrg );
    void MakeTagString( String& rStr, const String& rOrg );
    void Read_FieldIniFlags();
    void UpdateFields();
//  void ConvertFName( String& rName );
    void ConvertFFileName( String& rName, const String& rRaw );
    long Read_F_Tag( WW8FieldDesc* pF );
    void InsertTagField( const USHORT nId, const String& rTagText );
    long ImportExtSprm( WW8PLCFManResult* pRes, BOOL bStart );
    void ReadDocInfo();

// Ver8-Listen

    void RegisterNumFmtOnTxtNode(   USHORT nActLFO,
                                    BYTE   nActLevel,
                                    BOOL   bSetAttr = TRUE );
    void RegisterNumFmtOnStyle(     SwWW8StyInf& rStyleInfo,
                                    USHORT nActLFO   = USHRT_MAX,
                                    BYTE   nActLevel = nWW8MaxListLevel );
    void RegisterNumFmt(USHORT nActLFO, BYTE nActLevel);

// Pictures mit Kode 100, die ueber MsoftbSpContainer abgespeichert sind.
    BOOL WW8QuickHackForMSDFF_DirectBLIPImport( SvStream&   rSt,
                                                WW8_PIC&    rPic,
                                                Graphic&    rData,
                                                String&     rGraphName);
// spaeter zu ersetzen durch Aufruf in entsprechend erweiterten SvxMSDffManager


    const String* GetAnnotationAuthor( short nId );

    // Schnittstellen fuer die Toggle-Attribute
    void SetToggleAttr( BYTE nAttrId, BOOL bOn );
    void _ChkToggleAttr( USHORT nOldStyle81Mask, USHORT nNewStyle81Mask );

    void ChkToggleAttr( USHORT nOldStyle81Mask, USHORT nNewStyle81Mask )
    {
        if( nOldStyle81Mask != nNewStyle81Mask &&
            pCtrlStck->GetToggleAttrFlags() )
            _ChkToggleAttr( nOldStyle81Mask, nNewStyle81Mask );
    }

public:     // eigentlich private, geht aber leider nur public
    void ConvertUFName( String& rName );

    long Read_Ftn( WW8PLCFManResult* pRes, BOOL );
    long Read_Field( WW8PLCFManResult* pRes, BOOL );
    long Read_Book( WW8PLCFManResult* pRes, BOOL bStartAttr );
    long Read_Piece( WW8PLCFManResult* pRes, BOOL bStartAttr );
    long Read_And( WW8PLCFManResult* pRes, BOOL bStartAttr );

                                        // Attribute

    void Read_Special(          USHORT, BYTE*, short nLen );
    void Read_Obj(              USHORT, BYTE*, short nLen );
    void Read_PicLoc(           USHORT nId, BYTE* pData, short nLen );
    void Read_BoldUsw(          USHORT nId, BYTE*, short nLen );
    void Read_SubSuper(         USHORT, BYTE*, short nLen );
    void Read_SubSuperProp(     USHORT, BYTE*, short nLen );
    void Read_Underline(        USHORT, BYTE*, short nLen );
    void Read_TxtColor(         USHORT, BYTE*, short nLen );
    void Read_FontCode(         USHORT, BYTE*, short nLen );
    void Read_FontSize(         USHORT, BYTE*, short nLen );
    void Read_CharSet(          USHORT nId, BYTE* pData, short nLen );
    void Read_Language(         USHORT, BYTE*, short nLen );
    void Read_CColl(            USHORT, BYTE*, short nLen );
    void Read_Kern(             USHORT, BYTE* pData, short nLen );
    void Read_FontKern(         USHORT, BYTE* pData, short nLen );
    void Read_Invisible(        USHORT, BYTE* pData, short nLen );

    void Read_NoLineNumb(       USHORT nId, BYTE* pData, short nLen );

    void Read_LR(               USHORT nId, BYTE*, short nLen );
    void Read_UL(               USHORT nId, BYTE*, short nLen );
    void Read_LineSpace(        USHORT, BYTE*, short nLen );
    void Read_Justify(          USHORT, BYTE*, short nLen );
    void Read_Hyphenation(      USHORT, BYTE* pData, short nLen );
    void Read_WidowControl(     USHORT, BYTE* pData, short nLen );
    void Read_KeepLines(        USHORT, BYTE* pData, short nLen );
    void Read_KeepParas(        USHORT, BYTE* pData, short nLen );
    void Read_BreakBefore(      USHORT, BYTE* pData, short nLen );
    void Read_ApoPPC(           USHORT, BYTE* pData, short nLen );

    void Read_Border(           USHORT nId, BYTE* pData, short nLen );
    void Read_Tab(              USHORT nId, BYTE* pData, short nLen );
    void Read_TabCellDelete(    USHORT nId, BYTE* pData, short nLen );
    void Read_TabCellInsert(    USHORT nId, BYTE* pData, short nLen );
    void Read_Symbol(           USHORT nId, BYTE* pData, short nLen );
    void Read_FldVanish(        USHORT nId, BYTE* pData, short nLen );

    // Revision Marks ( == Redlining )

    // insert or delete content (change char attributes resp.)
    void Read_CRevisionMark(SwRedlineType eType,
                            USHORT nId,
                            BYTE* pData,
                            short nLen );
    // insert new content
    void Read_CFRMark(          USHORT nId, BYTE* pData, short nLen );
    // delete old content
    void Read_CFRMarkDel(       USHORT nId, BYTE* pData, short nLen );
    // change properties of content (e.g. char formating)
    void Read_CPropRMark(       USHORT nId, BYTE* pData, short nLen ); // complex!


    void Read_TabRowEnd(        USHORT, BYTE* pData, short nLen );
    void Read_Shade(            USHORT, BYTE* pData, short nLen );
    void Read_ANLevelNo(        USHORT, BYTE* pData, short nLen );
    void Read_ANLevelDesc(      USHORT, BYTE* pData, short nLen );

    void Read_POutLvl( USHORT nId, BYTE* pData, short nLen ); // Gliederungsebene Ver8

    void Read_OLST(             USHORT, BYTE* pData, short nLen );

    void Read_CharShadow(       USHORT, BYTE* pData, short nLen );
    void Read_CharHighlight(    USHORT, BYTE* pData, short nLen );
                                        // Ver8-Listen

    void Read_ListLevel(        USHORT nId, BYTE* pData, short nLen);
    void Read_LFOPosition(      USHORT nId, BYTE* pData, short nLen);
    BOOL SetTxtFmtCollAndListLevel( const SwPaM& rRg,
                                    SwWW8StyInf& rStyleInfo,
                                    BOOL         bReset = TRUE );

                                        // FastSave-Attribute

    void Read_StyleCode(        USHORT, BYTE* pData, short nLen );
    void Read_Majority(         USHORT, BYTE* pData, short nLen );

                                        // Felder

    eF_ResT Read_F_Nul( WW8FieldDesc*, String& rStr );
    eF_ResT Read_F_Input( WW8FieldDesc*, String& rStr );
    eF_ResT Read_F_InputVar( WW8FieldDesc*, String& rStr );
    eF_ResT Read_F_ANumber( WW8FieldDesc*, String& );
    eF_ResT Read_F_DocInfo( WW8FieldDesc* pF, String& rStr );
    eF_ResT Read_F_Author( WW8FieldDesc*, String& );
    eF_ResT Read_F_TemplName( WW8FieldDesc*, String& );
    eF_ResT Read_F_DateTime( WW8FieldDesc*, String& rStr );
    eF_ResT Read_F_FileName( WW8FieldDesc*, String& );
    eF_ResT Read_F_Anz( WW8FieldDesc* pF, String& );
    eF_ResT Read_F_CurPage( WW8FieldDesc*, String& );
    eF_ResT Read_F_Ref( WW8FieldDesc* pF, String& );

    eF_ResT Read_F_Set( WW8FieldDesc*, String& rStr );
    eF_ResT Read_F_PgRef( WW8FieldDesc*, String& rStr );
    eF_ResT Read_F_NoteReference( WW8FieldDesc* pF, String& rStr );

    eF_ResT Read_F_Tox( WW8FieldDesc* pF, String& rStr );
    eF_ResT Read_F_Symbol( WW8FieldDesc*, String& rStr );
    eF_ResT Read_F_Embedd( WW8FieldDesc*, String& rStr );
    eF_ResT Read_F_FormTextBox( WW8FieldDesc* pF, String& rStr );
    eF_ResT Read_F_FormCheckBox( WW8FieldDesc* pF, String& rStr );
    eF_ResT Read_F_FormListBox( WW8FieldDesc* pF, String& rStr );
    eF_ResT Read_F_Macro( WW8FieldDesc*, String& rStr );
    eF_ResT Read_F_DBField( WW8FieldDesc*, String& rStr );
    eF_ResT Read_F_DBNext( WW8FieldDesc*, String& );
    eF_ResT Read_F_DBNum( WW8FieldDesc*, String& );
    eF_ResT Read_F_IncludePicture( WW8FieldDesc*, String& rStr );
    eF_ResT Read_F_IncludeText(    WW8FieldDesc*, String& rStr );
    eF_ResT Read_F_Seq( WW8FieldDesc*, String& rStr );

    eF_ResT Read_F_OCX( WW8FieldDesc*, String& rStr );
    eF_ResT Read_F_Hyperlink( WW8FieldDesc*, String& rStr );

    ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape> InsertControl(
            const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormComponent>& rFComp,
            const ::com::sun::star::awt::Size& rSize,
            //const ::com::sun::star::uno::Reference< ::com::sun::star::size::XSize>& rSize,
            BOOL bFloatingCtrl = FALSE );

    void BuildInputField( USHORT eType, const String& rParam );
    void DeleteFormImpl();

                                // Ver8: Listen Manager
    short ImportSprm( BYTE* pPos, short nSprmsLen, USHORT nId = 0 );

    const WW8Fib& GetFib() const    { return *pWwFib; }
    SwDoc& GetDoc() const           { return rDoc;          }
    USHORT GetNAktColl()  const     { return nAktColl;  }
    void SetNAktColl( USHORT nColl ) { nAktColl = nColl;    }
    //SfxItemSet* GetAktItemSet()   { return pAktItemSet;   }
    void SetAktItemSet( SfxItemSet* pItemSet ) { pAktItemSet = pItemSet;    }
    const USHORT StyleUsingLFO(      USHORT nLFOIndex ) const ;
    const SwFmt* GetStyleWithOrgWWName( String& rName    ) const ;



    SwWW8ImplReader( BYTE nVersionPara, SvStorage* pStorage,
                     SvStream* pSt, SwDoc& rD, BOOL bNewDoc );

    const ULONG GetFieldFlags() const{ return nFieldFlags; }
    const ULONG GetIniFlags()   const{ return nIniFlags; }
    const ULONG GetIniFlags1()  const{ return nIniFlags1; }

    // Laden eines kompletten DocFiles
    ULONG LoadDoc( SwPaM&,WW8Glossary *pGloss=0);
};



/*************************************************************************

    Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ww8/ww8par.hxx,v 1.1.1.1 2000-09-18 17:14:58 hr Exp $
      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.95  2000/09/18 16:05:00  willem.vandorp
      OpenOffice header added.

      Revision 1.94  2000/08/22 17:40:57  cmc
      #77315# 95 Formulas, bad string read

      Revision 1.93  2000/08/22 17:08:58  cmc
      #77743# OLE Import, bad seek & bad FilterOptions

      Revision 1.92  2000/08/18 09:48:28  khz
      Import Line Numbering (restart on new section)

      Revision 1.91  2000/08/18 06:47:26  khz
      Import Line Numbering

      Revision 1.90  2000/07/28 15:37:19  khz
      #73796# don't delete NumRule from Attr but set it into pDoc

      Revision 1.89  2000/07/27 10:21:26  khz
      #73796# stop ANList when opening next cell in a row and !pAktANLD->fNumberAcross

      Revision 1.88  2000/07/25 15:16:25  khz
      #76811# read/write AutoHyphenation flag from/into Document Properties

      Revision 1.87  2000/07/17 13:46:56  khz
      #73987# check if sprmSNfcPgn should cause section change or not

      Revision 1.86  2000/07/11 11:39:10  khz
      #76673# prepare implementation of sprmTDelete and sprmTInsert

      Revision 1.85  2000/07/07 12:48:54  jp
      must changes VCL

      Revision 1.84  2000/06/28 08:07:39  khz
      #70915# Insert Section if end-note with flag 'on end of section' found

      Revision 1.83  2000/06/15 15:23:39  cmc
      #75669# 97Controls Import fixes

      Revision 1.82  2000/05/31 12:22:57  khz
      Changes for Unicode

      Revision 1.81  2000/05/25 08:06:45  khz
      Piece Table optimization, Unicode changes, Bugfixes

      Revision 1.80  2000/05/24 08:56:06  jp
      Bugfixes for Unicode

      Revision 1.79  2000/05/17 16:41:43  khz
      Changes for unicode (2)

      Revision 1.78  2000/05/16 11:06:17  khz
      Unicode code-conversion

      Revision 1.77  2000/03/27 15:55:24  cmc
      #74329# Ported WW97 Controls to uno codebase

      Revision 1.76  2000/03/24 10:50:36  khz
      Task #74368# IsInvalidOrToBeMergedTabCell() stops duplicate reset of NumRule

      Revision 1.75  2000/03/21 15:04:57  os
      UNOIII

      Revision 1.74  2000/03/10 14:29:32  khz
      Task #65529# improve detection if Section is identical with previous

      Revision 1.73  2000/03/03 15:20:02  os
      StarView remainders removed

      Revision 1.72  2000/02/18 09:36:56  cmc
      #69372# Improved Hyperlink Importing for WW97

      Revision 1.71  2000/02/14 14:39:02  jp
      #70473# changes for unicode

      Revision 1.70  2000/02/14 09:10:28  cmc
      #72579# working glossary implementation

      Revision 1.68  2000/02/09 08:57:23  khz
      Task #72647# Read SPRMs that are stored in piece table grpprls (2)

      Revision 1.67  2000/02/02 18:07:39  khz
      Task #69885# Read SPRMs that are stored in piece table grpprls

      Revision 1.66  2000/01/06 15:23:45  khz
      Task #71411# Let last Section be unbalanced

      Revision 1.65  1999/12/23 14:03:10  khz
      Task #68143# avoid attributes atached solely to Cell-End marks

      Revision 1.64  1999/12/22 18:03:16  khz
      Task #70919# look if ParaStyle is different behind filed than it was before

      Revision 1.63  1999/12/14 14:22:38  khz
      Task #70815# Avoid typecast when calling MatchSdrItemsIntoFlySet()

      Revision 1.62  1999/12/09 19:12:20  khz
      Task #65551# nSkipPos had erroneously been a member instead of local variable

      Revision 1.61  1999/12/09 16:46:29  khz
      Task #69180# allow Tabs if right of 1st-line-start OR right of paragraph margin

      Revision 1.60  1999/12/01 14:35:45  khz
      Task #68488# Graphics in Sections with more than one Column

      Revision 1.59  1999/11/29 11:09:36  khz
      Task #70177# SetDerivedFrom( RES_POOL_COL_STANDARD )

      Revision 1.58  1999/11/19 14:57:07  khz
      Task #68651# Store state of bSymbol and nSymbol in WW8ReaderSave class

      Revision 1.57  1999/11/12 13:04:59  jp
      new: read sprmCHighlight

      Revision 1.56  1999/11/05 17:05:28  khz
      prevent from erroneous Table-Restart when sprm24 missing

      Revision 1.55  1999/11/02 15:59:34  khz
      import new TOX_CONTENT and TOX_INDEX features (2)

      Revision 1.54  1999/10/29 12:07:35  khz
      import new TOX_CONTENT and TOX_INDEX features

      Revision 1.53  1999/10/08 09:25:39  khz
      Import Redlining

      Revision 1.52  1999/08/30 19:52:58  JP
      Bug #68219#: no static members - be reentrant


      Rev 1.51   30 Aug 1999 21:52:58   JP
   Bug #68219#: no static members - be reentrant

      Rev 1.50   12 Aug 1999 13:57:52   KHZ
   Task #67668# TestApo() modified

      Rev 1.49   09 Aug 1999 14:16:08   JP
   read W95 format from stream

      Rev 1.48   12 Jul 1999 16:58:20   KHZ
   Task #66194# 1. Sections with cols, 2. App.Node before PgBreak if Fly in node

      Rev 1.47   05 Jul 1999 19:30:52   KHZ
   Task #66194# Sections with columns

      Rev 1.46   21 Jun 1999 10:24:40   KHZ
   Reference field (page, bookmark, footnote) part#2

      Rev 1.45   18 Jun 1999 15:53:50   KHZ
   Reference field (page, bookmark, footnote) part#1

      Rev 1.44   10 Jun 1999 17:58:52   KHZ
   use FOUR different inner distances with SvxBoxItem

      Rev 1.43   09 Jun 1999 18:25:00   KHZ
   use FOUR different inner distances with SvxBoxItem

      Rev 1.42   26 Apr 1999 17:40:20   KHZ
   Task #61381# Attribute von Textboxen in denen NUR EINE Grafik steht

      Rev 1.41   09 Apr 1999 18:01:38   KHZ
   Task #64348# Bei Listen-Overrides nur bei Ungleichheit neue Liste anlegen!

      Rev 1.40   18 Mar 1999 09:56:52   JP
   Task #63049#: Numerierung mit rel. Einzuegen

      Rev 1.39   10 Mar 1999 15:11:10   KHZ
   Task #62521# Einlesen von Sonderzeichen

      Rev 1.38   08 Mar 1999 11:51:30   KHZ
   Task #57749# Writer kann jetzt spaltige Bereiche

      Rev 1.37   26 Feb 1999 14:43:38   KHZ
   Task #59715# Behandlung von Section breaks

      Rev 1.36   17 Feb 1999 15:23:42   KHZ
   Task #61382# jetzt auch Textbox-Grafiken im Hintergrund ( SvxOpaqItem(FALSE) )

*************************************************************************/

#endif

diff --git a/sw/source/filter/ww8/ww8par2.cxx b/sw/source/filter/ww8/ww8par2.cxx
new file mode 100644
index 0000000..3a42cb8
--- /dev/null
+++ b/sw/source/filter/ww8/ww8par2.cxx
@@ -0,0 +1,3084 @@
/*************************************************************************
 *
 *  $RCSfile: ww8par2.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:58 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#define ITEMID_BOXINFO      SID_ATTR_BORDER_INNER
#include <tools/solar.h>
#include "pam.hxx"              // fuer SwPam
#include "doc.hxx"

#ifndef _DOCARY_HXX
#include "docary.hxx"
#endif

#include "ndtxt.hxx"            // class SwTxtNode
#include "hintids.hxx"
#include "paratr.hxx"           // SwNumRuleItem

// Folgende sollten demnaechst ins Precompiled-Header-File
#include "poolfmt.hxx"          // RES_POOLCOLL_STANDARD
#include "swtable.hxx"          // class SwTableLines, ...
#include "tblsel.hxx"           // class _SwSelBox
#include "mdiexp.hxx"           // Progress

#ifndef _APP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _SFXDOCINF_HXX //autogen
#include <sfx2/docinf.hxx>
#endif
#ifndef _SVX_ORPHITEM_HXX //autogen
#include <svx/orphitem.hxx>
#endif
#ifndef _SVX_WIDWITEM_HXX //autogen
#include <svx/widwitem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_FHGTITEM_HXX //autogen
#include <svx/fhgtitem.hxx>
#endif
#ifndef _SVX_FHGTITEM_HXX //autogen
#include <svx/fhgtitem.hxx>
#endif
#ifndef _SVX_HYZNITEM_HXX //autogen
#include <svx/hyznitem.hxx>
#endif
#ifndef _FMTPDSC_HXX //autogen
#include <fmtpdsc.hxx>
#endif
#ifndef _FRMFMT_HXX //autogen
#include <frmfmt.hxx>
#endif
#ifndef _CHARFMT_HXX //autogen
#include <charfmt.hxx>
#endif
#ifdef DEBUG
#ifndef _SV_SOUND_HXX //autogen
 #include <vcl/sound.hxx>
#endif
#endif

// Folgende bleiben hier
#include "fltshell.hxx"         // fuer den Attribut Stack
#include "ww8struc.hxx"         // struct TC
#include "ww8par.hxx"
#include "ww8par2.hxx"

#ifndef _SV_FONTTYPE_HXX //autogen
#include <vcl/fonttype.hxx>
#endif
#ifndef _SV_FONT_HXX //autogen
#include <vcl/font.hxx>
#endif


#define DELETEAZ( p ) { delete[]( p ); p = 0; };




//-----------------------------------------
//              Tabellen
//-----------------------------------------


#define MAX_COL 64  // WW6-Beschreibung: 32, WW6-UI: 31
                                        // WW8-UI: 63!

struct WW8SelBoxInfo: public SwSelBoxes_SAR
{
    short nGroupXStart;
    short nGroupWidth;

    WW8SelBoxInfo( short nXCenter, short nWidth ): nGroupXStart( nXCenter ), nGroupWidth( nWidth ){}
};

typedef WW8SelBoxInfo* WW8SelBoxInfoPtr;

SV_DECL_PTRARR_DEL(WW8MergeGroups, WW8SelBoxInfoPtr, 16,16);
SV_IMPL_PTRARR(    WW8MergeGroups, WW8SelBoxInfoPtr       );

struct WW8TabBandDesc{
    WW8TabBandDesc* pNextBand;
    short nGapHalf;
    short nLineHeight;
    short nRows;
    short nCenter[MAX_COL + 1]; // X-Rand aller Zellen dieses Bandes
    short nWidth[MAX_COL + 1];  // Laenge aller Zellen dieses Bandes
    short nWwCols;      // BYTE wuerde reichen, alignment -> short
    short nSwCols;      // SW: so viele Spalten fuer den Writer
    BOOL bLEmptyCol;    // SW: Links eine leere Zusatz-Spalte
    BOOL bREmptyCol;    // SW: dito rechts
    WW8_TCell* pTCs;
    WW8_SHD* pSHDs;


    // nur fuer WW6-7: diese Zelle hat WW-Flag bMerged (horizontal) gesetzt
    //BOOL bWWMergedVer6[MAX_COL];


    BOOL bExist[MAX_COL];           // Existiert diese Zelle ?
    UINT8 nTransCell[MAX_COL + 2];  // UEbersetzung WW-Index -> SW-Index

    WW8TabBandDesc() {  memset( this, 0, sizeof( *this ) ); };
    WW8TabBandDesc( WW8TabBandDesc& rBand );    // tief kopieren
    ~WW8TabBandDesc() { delete[]( pTCs ); pTCs = 0; delete[]( pSHDs ); };
    void ReadDef( BOOL bVer67, BYTE* pS );
    void ProcessSprmTSetBRC( BOOL bVer67, BYTE* pParamsTSetBRC );
    void ProcessSprmTDxaCol( BOOL bVer67, BYTE* pParamsTDxaCol );
    void ProcessSprmTDelete( BOOL bVer67, BYTE* pParamsTDelete );
    void ReadShd( SVBT16* pS );
};

class WW8TabDesc
{
    WW8_BRC aDefBrcs[6];

    SvStringsDtor aNumRuleNames;

    SwWW8ImplReader* pIo;

    WW8TabBandDesc* pFirstBand;
    WW8TabBandDesc* pActBand;

    SwPosition* pTmpPos;

    const SwTable* pTable;          // Tabelle
    SwTableNode* pTblNd;            // Tabellen-Node
    const SwTableLines* pTabLines;  // Zeilen-Array davon
    SwTableLine* pTabLine;          // akt. Zeile
    SwTableBoxes* pTabBoxes;        // Boxen-Array in akt. Zeile
    SwTableBox* pTabBox;            // akt. Zelle

    WW8MergeGroups* pMergeGroups;   // Listen aller zu verknuepfenden Zellen

    WW8_TCell* pAktWWCell;

    short nRows;
    short nDefaultSwCols;
    short nBands;
    short nMinLeft;
    short nMaxRight;
    short nSwWidth;

    BOOL bOk;
    BOOL bHeader;
    BOOL bBorderDefaults;
    BOOL bClaimLineFmt;
    SwHoriOrient eOri;
                                // 2. allgemeine Verwaltungsinfo
    short nAktRow;
    short nAktBandRow;          // SW: in dieser Zeile des akt. Bandes bin ich
                                // 3. Verwaltungsinfo fuer Writer
    short nAktCol;


    // 4. Methoden

    USHORT GetLogicalWWCol() const;
    void SetTabBorders( SwTableBox* pBox, short nIdx );
    void SetTabShades( SwTableBox* pBox, short nWwIdx );
    void CalcDefaults();
    BOOL SetPamInCell( short nWwCol, BOOL bPam, BOOL bCheckForMerge );
    void DeleteCells( short nDelete );
    void InsertCells( short nIns );
    void AdjustNewBand( SwWW8ImplReader* pReader );

    // durchsucht pMergeGroups, meldet Index der ersten, passenden Gruppe bzw. -1
    // Details siehe bei der Implementierung
    BOOL FindMergeGroup( short nX1, short nWidth, BOOL bExact, short& nMGrIdx );

    // einzelne Box ggfs. in eine Merge-Gruppe aufnehmen
    // (die Merge-Gruppen werden dann spaeter auf einen Schlag abgearbeitet)
    SwTableBox* UpdateTableMergeGroup(  WW8_TCell&     rCell,
                                                                            WW8SelBoxInfo* pActGroup,
                                                                            SwTableBox*    pActBox,
                                                                            USHORT         nCol );
public:
    BOOL IsValidCell( short nCol ) const;

    WW8TabDesc( SwWW8ImplReader* pIoClass );
    BOOL Ok() const { return bOk; }
    void CreateSwTable();
    void TableCellEnd();
    void FinishSwTable();
    short GetMinLeft() const { return nMinLeft; }
    ~WW8TabDesc();

    const WW8_TCell* GetAktWWCell() const { return pAktWWCell; }
    const short GetAktCol() const { return nAktCol; }
    const String& GetNumRuleName() const;  // find name of numrule valid for current WW-COL
    void SetNumRuleName( const String& rName );
};






//---------------------------------------------------------------------
//   Hilfroutinen fuer Kapitelnummerierung und Aufzaehlung / Gliederung
//---------------------------------------------------------------------

static void SetBaseAnlv( SwNumFmt* pNum, WW8_ANLV* pAV )
{
    static SvxExtNumType eNumA[8] = { SVX_NUM_ARABIC, SVX_NUM_ROMAN_UPPER, SVX_NUM_ROMAN_LOWER,
        SVX_NUM_CHARS_UPPER_LETTER_N, SVX_NUM_CHARS_LOWER_LETTER_N, SVX_NUM_ARABIC,
        SVX_NUM_ARABIC, SVX_NUM_ARABIC };

    static SvxAdjust eAdjA[4] = { SVX_ADJUST_LEFT,
        SVX_ADJUST_RIGHT, SVX_ADJUST_LEFT, SVX_ADJUST_LEFT };
//          eigentlich folgende 2, aber Writer-UI bietet es nicht an
//      SVX_ADJUST_CENTER, SVX_ADJUST_BLOCKLINE };

    pNum->eType = ( SVBT8ToByte( pAV->nfc ) < 8 ) ?
                    eNumA[SVBT8ToByte( pAV->nfc ) ] : SVX_NUM_NUMBER_NONE;
//  pNum->bInclUpperLevel = pAV->fPrev;
    pNum->SetInclUpperLevel( ( SVBT8ToByte( pAV->aBits1 ) & 0x4 ) >> 2 );
    pNum->SetStartValue( (USHORT)SVBT16ToShort( pAV->iStartAt ) );
//  pNum->eNumAdjust = eAdjA[pAV->jc];
    pNum->SetAdjust( eAdjA[SVBT8ToByte( pAV->aBits1 ) & 0x3] );

    pNum->SetCharTextOffset( (USHORT)SVBT16ToShort( pAV->dxaSpace ) );
    INT16 nIndent = Abs((INT16)SVBT16ToShort( pAV->dxaIndent ));
    if( SVBT8ToByte( pAV->aBits1 ) & 0x08 ){    // fHang
        pNum->SetFirstLineOffset( -nIndent );
        pNum->SetLSpace( nIndent );
        pNum->SetAbsLSpace( nIndent );
    }else{
        pNum->SetCharTextOffset( nIndent );     // Breite der Nummer fehlt
    }
    if( SVBT8ToByte( pAV->nfc ) == 5 || SVBT8ToByte( pAV->nfc ) == 7 )
    {
        String sP( pNum->GetPostfix() );
        sP.Insert( '.', 0 );
        pNum->SetPostfix( sP ); // Ordinalzahlen
    }
}

void SwWW8ImplReader::SetAnlvStrings( SwNumFmt* pNum, WW8_ANLV* pAV, BYTE* pTxt,
                            BOOL bOutline )
{
    BOOL bInsert = FALSE;                       // Default
    CharSet eCharSet = eStructCharSet;

    const WW8_FFN* pF = pFonts->GetFont( SVBT16ToShort( pAV->ftc ) ); // FontInfo
    BOOL bSymbol = pF && ( pF->chs == 2 );      // Symbol/WingDings/...

    String sTxt( (sal_Char*)pTxt,  SVBT8ToByte( pAV->cbTextBefore )
                                 + SVBT8ToByte( pAV->cbTextAfter  ), eCharSet );

    if( bOutline )
    {                             // Gliederung
        if( !pNum->IsInclUpperLevel()           // es sind  <= 1 Nummern anzuzeigen
            || pNum->eType == SVX_NUM_NUMBER_NONE ){    // oder dieser Level hat keine
                                                // eigenen Ziffern
            bInsert = TRUE;                     // -> dann uebernehme Zeichen

            // replace by simple Bullet ?
            if( bSymbol )
                //JP 14.08.96: cBulletChar benutzen, damit auf dem MAC
                //              richtig gemappt wird
                sTxt.Fill(  SVBT8ToByte( pAV->cbTextBefore )
                          + SVBT8ToByte( pAV->cbTextAfter  ), cBulletChar );
            }
    }
    else
    {                                       // Nummerierung / Aufzaehlung
        bInsert = TRUE;
//      if( SVBT16ToShort( pAV->ftc ) == 1
//          || SVBT16ToShort( pAV->ftc ) == 3 ){    // Symbol / WingDings
        if( bSymbol )
        {
            FontFamily eFamily;
            String aName;
            FontPitch ePitch;

            if( GetFontParams( SVBT16ToShort( pAV->ftc ), eFamily, aName,
                                ePitch, eCharSet ) ){
//              USHORT nSiz = ( SVBT16ToShort( pAV->hps ) ) ?
//                          SVBT16ToShort( pAV->hps ) : 24; // Groesse in 1/2 Pt
//                      darf nach JP nicht gesetzt werden, da immer die Size
//                      genommen wird, die am ZeilenAnfang benutzt wird
                Font aFont;
                aFont.SetName( aName );
                aFont.SetFamily( eFamily );
//              aFont.SetPitch( ePitch );       // darf nach JP nicht
                aFont.SetCharSet( eCharSet );
                pNum->eType = SVX_NUM_CHAR_SPECIAL;
//              if( pAV->ico )      // geht in UI und SWG-Writer/Reader nicht
//                  aFont.SetColor( Color( GetCol( pAV->ico ) ) );
                pNum->SetBulletFont( &aFont );

                // take only the very first character
                if( pAV->cbTextBefore || pAV->cbTextAfter)
                    pNum->SetBulletChar( sTxt.GetChar( 0 ) );
                else
                    pNum->SetBulletChar( 0xF000 + 183 );
            }
        }
    }
    if( bInsert )
    {
        if( pAV->cbTextBefore )
        {
            String sP( sTxt.Copy( 0, SVBT8ToByte( pAV->cbTextBefore ) ) );
            pNum->SetPrefix( sP );
        }
        if( SVBT8ToByte( pAV->cbTextAfter ) )
        {
            String sP( pNum->GetPostfix() );
            sP.Insert( sTxt.Copy( SVBT8ToByte( pAV->cbTextBefore ),
                                  SVBT8ToByte( pAV->cbTextAfter  ) ) );
            pNum->SetPostfix( sP );
        }
// Die Zeichen vor und hinter mehreren Ziffern koennen leider nicht uebernommen
// werden, da sie der Writer ganz anders behandelt und das Ergebnis i.A.
// schlechter als ohne waere.
    }
}

// SetAnld bekommt einen WW-ANLD-Descriptor und einen Level und modifiziert
// die durch pNumR anggebeben NumRules. Wird benutzt fuer alles ausser
// Gliederung im Text
void SwWW8ImplReader::SetAnld( SwNumRule* pNumR, WW8_ANLD* pAD, BYTE nSwLevel,
                       BOOL bOutLine )
{
    SwNumFmt aNF;
    if( pAD )
    {                                   // Es gibt einen Anld-Sprm
        bAktAND_fNumberAcross = 0 != SVBT8ToByte( pAD->fNumberAcross );
        WW8_ANLV* pAV = &pAD->eAnlv;
        SetBaseAnlv( &aNF, pAV );       // Setze Basis-Format
        SetAnlvStrings( &aNF, pAV, pAD->rgchAnld, bOutLine );// und Rest
    }
    pNumR->Set( nSwLevel, aNF );
}



//-------------------------------------------------------
//          Kapitelnummerierung und Kapitelbullets
//-------------------------------------------------------
// Kapitelnummerierung findet in Styledefinionen statt. Sprm 13 gibt den Level
// an, Sprm 12 den Inhalt

SwNumRule* SwWW8ImplReader::GetStyRule()
{
    if( pStyles->pStyRule )         // Bullet-Style bereits vorhanden
        return pStyles->pStyRule;

    const String aBaseName(WW8_ASCII2STR( "WW8StyleNum" ));
    const String aName( rDoc.GetUniqueNumRuleName( &aBaseName, FALSE ) );

    USHORT nRul = rDoc.MakeNumRule( aName );
    pStyles->pStyRule = rDoc.GetNumRuleTbl()[nRul];
    pStyles->pStyRule->SetAutoRule( FALSE );// Auto == FALSE -> Nummerierungsvorlage

    return pStyles->pStyRule;
}

void SwWW8ImplReader::Read_ANLevelNo( USHORT, BYTE* pData, short nLen ) // Sprm 13
{
    nSwNumLevel = 0xff; // Default: ungueltig

    if( nLen <= 0 )
        return;

    // StyleDef ?
    if( pAktColl )
    {
        if(      pCollA[nAktColl].bColl     // nur fuer SwTxtFmtColl, nicht CharFmt
                && *pData                                       // WW: 0 = no Numbering
                && !( nIniFlags & WW8FL_NO_OUTLINE ) )
        {
        if(      *pData <= MAXLEVEL     // Bereich WW:1..9 -> SW:0..8
                    && *pData <= 9 )                // keine Aufzaehlung / Nummerierung
            {
                nSwNumLevel = *pData - 1;
                if( !bNoAttrImport )
                    ((SwTxtFmtColl*)pAktColl)->SetOutlineLevel( nSwNumLevel );
                    // Bei WW-NoNumbering koennte auch NO_NUMBERING gesetzt
                    // werden. ( Bei normaler Nummerierung muss NO_NUM gesetzt
                    // werden: NO_NUM : Nummerierungs-Pause,
                    // NO_NUMBERING : ueberhaupt keine Nummerierung )

            }
            else if( *pData == 10 || *pData == 11 )
            {
                pStyles->nWwNumLevel = *pData;      // Typ merken, der Rest
                                                                                    // geschieht bei Sprm 12
            }
        }
    }
    else
    {                               // !StyleDef
        if( !bAnl && !( nIniFlags & WW8FL_NO_NUMRULE ) )
        {
            StartAnl( pData );      // Anfang der Gliederung / Aufzaehlung
        }
    }
}

void SwWW8ImplReader::Read_ANLevelDesc( USHORT, BYTE* pData, short nLen ) // Sprm 12
{
    if( !pAktColl || nLen <= 0                  // nur bei Styledef
        || !pCollA[nAktColl].bColl              // CharFmt -> ignorieren
        || ( nIniFlags & WW8FL_NO_OUTLINE ) ){
        nSwNumLevel = 0xff;
        return;
    }
    if( nSwNumLevel <= MAXLEVEL         // Bereich WW:1..9 -> SW:0..8
        && nSwNumLevel <= 9 ){      // keine Aufzaehlung / Nummerierung

                                        // Falls bereits direkt oder durch
                                        // Vererbung NumruleItems gesetzt sind,
                                        // dann jetzt ausschalten #56163
        pAktColl->SetAttr( SwNumRuleItem() );

        String aName(WW8_ASCII2STR( "Outline" ));
        SwNumRule aNR( rDoc.GetUniqueNumRuleName(&aName), OUTLINE_RULE );
        aNR = *rDoc.GetOutlineNumRule();

        SetAnld( &aNR, (WW8_ANLD*)pData, nSwNumLevel, TRUE );

            // fehlende Level muessen nicht aufgefuellt werden

        rDoc.SetOutlineNumRule( aNR );
    }else if( pStyles->nWwNumLevel == 10 || pStyles->nWwNumLevel == 11 ){
        SwNumRule* pNR = GetStyRule();
        SetAnld( pNR, (WW8_ANLD*)pData, 0, FALSE );
        pAktColl->SetAttr( SwNumRuleItem( pNR->GetName() ) );
        pCollA[nAktColl].bHasStyNumRule = TRUE;
    }
}

//-----------------------------------------
//      Nummerierung / Aufzaehlung
//-----------------------------------------

// SetNumOlst() traegt die Numrules fuer diese Zeile ins SwNumFmt ein
// ( nur fuer Gliederungen im Text; Aufzaehlungen / Nummerierungen laufen
// ueber ANLDs )
// dabei wird die Info aus dem OLST geholt und nicht aus dem ANLD ( s.u. )
void SwWW8ImplReader::SetNumOlst( SwNumRule* pNumR, WW8_OLST* pO, BYTE nSwLevel )
{
    SwNumFmt aNF;
    WW8_ANLV* pAV = &pO->rganlv[nSwLevel];
    SetBaseAnlv( &aNF, pAV );               // Setze Basis-Format
                                            // ... und nun die Strings
    int i, nTxtOfs = 0;
    register WW8_ANLV* pAV1;                 // suche String-Positionen
    for( i = 0, pAV1 = pO->rganlv; i < nSwLevel; i++, pAV1++ ){
        nTxtOfs += SVBT8ToByte( pAV1->cbTextBefore )
                    + SVBT8ToByte( pAV1->cbTextAfter );
    }

    SetAnlvStrings( &aNF, pAV, pO->rgch + nTxtOfs, TRUE ); // und rein
    pNumR->Set( nSwLevel, aNF );
}




// der OLST kommt am Anfang jeder Section, die Gliederungen enthaelt. Die ANLDs,
// die an jeder Gliederungszeile haengen, enthalten nur Stuss, also werden die
// OLSTs waehrend der Section gemerkt, damit die Informationen beim Auftreten
// von Gliederungsabsaetzen zugreifbar ist.
void SwWW8ImplReader::Read_OLST( USHORT, BYTE* pData, short nLen )
{
    if( nIniFlags & WW8FL_NO_NUMRULE )
        return;
    if( nLen <= 0 ){
        DELETEZ( pNumOlst );
        return;
    }
    if( pNumOlst )
        delete( pNumOlst );                 // nur sicherheitshalber
    pNumOlst = new WW8_OLST;
    if( nLen < sizeof( WW8_OLST ) )         // auffuellen, falls zu kurz
        memset( pNumOlst, 0, sizeof( *pNumOlst ) );
    *pNumOlst = *(WW8_OLST*)pData;
}

// StartAnl wird am Anfang eines Zeilenbereichs gerufen,
//  der Gliederung / Nummerierung / Aufzaehlung enthaelt
#define MAX_ANLV_NUM 12
void SwWW8ImplReader::StartAnl( BYTE* pSprm13 )
{
    bAktAND_fNumberAcross = FALSE;

    BYTE nT = GetNumType( *pSprm13 );
    if( nT == WW8_Pause || nT == WW8_None )
        return;

    nWwNumType = nT;

    // check for COL numbering:
    BYTE* pS12 = 0;// sprmAnld
    String sNumRule;
    if( pTableDesc )
    {
        sNumRule = pTableDesc->GetNumRuleName();
        if( sNumRule.Len() )
        {
            pNumRule = rDoc.FindNumRulePtr( sNumRule );
            if( !pNumRule )
                sNumRule.Erase();
            else
            {
                // this is ROW numbering ?
                pS12 = pPlcxMan->HasParaSprm( 12 ); // sprmAnld
                if( pS12 && 0 != SVBT8ToByte( ((WW8_ANLD*)pS12)->fNumberAcross) )
                    sNumRule.Erase();
            }
        }
    }
    if( !sNumRule.Len() )
    {
        //sNumRule = rDoc.GetUniqueNumRuleName();
        pNumRule = rDoc.GetNumRuleTbl()[ rDoc.MakeNumRule( sNumRule ) ];
        if( pTableDesc )
        {
            if( !pS12 )
                pS12 = pPlcxMan->HasParaSprm( 12 ); // sprmAnld
            if( !pS12 || !SVBT8ToByte( ((WW8_ANLD*)pS12)->fNumberAcross ) )
                pTableDesc->SetNumRuleName( pNumRule->GetName() );
        }
    }

    bAnl = TRUE;

    NextAnlLine( pSprm13, pS12 );                       // Einstellungen fuer 1. Zeile

                                                // NumRules ueber Stack setzen
    pCtrlStck->NewAttr( *pPaM->GetPoint(),
            SfxStringItem( RES_FLTR_NUMRULE, pNumRule->GetName() ) );
}


// NextAnlLine() wird fuer jede Zeile einer
// Gliederung / Nummerierung / Aufzaehlung einmal gerufen
void SwWW8ImplReader::NextAnlLine( BYTE* pSprm13, BYTE* pS12 )
{
    if( !bAnl )
        return;         // pNd->UpdateNum ohne Regelwerk gibt GPF spaetestens
                        // beim Speichern als sdw3

    if( *pSprm13 == 10 || *pSprm13 == 11 )      // WW:10 = Nummerierung -> SW:0
                                                // WW:11 = Auffzaehlung -> SW:0
    {
        nSwNumLevel = 0;
        if( !pNumRule->GetNumFmt( nSwNumLevel ) )
        {                                               // noch nicht definiert
            if( !pS12 )
                pS12 = pPlcxMan->HasParaSprm( 12 ); // sprmAnld o. 0
            SetAnld( pNumRule, (WW8_ANLD*)pS12, nSwNumLevel, FALSE );
        }
    }
    else if( *pSprm13 <= MAXLEVEL )             // Bereich WW:1..9 -> SW:0..8
    {
        nSwNumLevel = *pSprm13 - 1;             // Gliederung
        if( !pNumRule->GetNumFmt( nSwNumLevel ) )           // noch nicht definiert
        {
            if( pNumOlst )                      // es gab ein OLST
            {
                SetNumOlst( pNumRule, pNumOlst , nSwNumLevel );
            }
            else                                // kein Olst, nimm Anld
            {
                if( !pS12 )
                    pS12 = pPlcxMan->HasParaSprm( 12 ); // sprmAnld
                SetAnld( pNumRule, (WW8_ANLD*)pS12, nSwNumLevel, FALSE );
            }
        }
    }
    else
    {
        nSwNumLevel = 0xff;                 // keine Nummer
    }
    BYTE nLevel = ( nSwNumLevel < MAXLEVEL ) ? nSwNumLevel : NO_NUMLEVEL;
    SwNodeNum aNum( nLevel );
    SwTxtNode* pNd = pPaM->GetNode()->GetTxtNode();
    pNd->UpdateNum( aNum );
}

// StopAnl() wird am Ende des Zeilenbereiches gerufen
void SwWW8ImplReader::StopAnl( BOOL bGoBack )
{
    if( bGoBack )
    {
        SwPosition aTmpPos( *pPaM->GetPoint() );    // eine Zeile zu spaet
        // gehe zurueck
        pPaM->Move( fnMoveBackward, fnGoCntnt );
        pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_FLTR_NUMRULE ); // Setze NumRules in Stack
        // restore Pam
        *pPaM->GetPoint() = aTmpPos;
    }
    else
        pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_FLTR_NUMRULE ); // Setze NumRules in Stack

    nSwNumLevel = 0xff;
    nWwNumType = WW8_None;
    bAnl = FALSE;
}


// Bei der Zaehlung der Tabellenzellen gibt es einige Merkwuerdigkeiten:
// 1) Ist in einer Zeile eine besondere Zellenumrandung vorhanden, dann werden
//    die WW8_TCell's vom WW generiert, sonst nicht.
// 2) Existieren die TCs, dann ist bei nicht existenten Zellen fMerged gesetzt.
//    Im Text existieren diese Zellen nicht, d.h. die Indices muessen nicht
//    korrigiert werden. ( Im sprmTDefTable sind die nicht existenten Zellen
//    jedoch vorhanden ). Fuer diese Zellen ist bExist[] TRUE, da keine
//    Anpassung der Indices beim Einlesen der Inhalte passieren muss.
// 3) Existieren die TCs einer Zeile nicht, dann werden nicht existente Zellen
//    als Zellen mit 0-Breite dargestellt, die auch jeweils einen leeren Absatz
//    beinhalten. Werden diese Zellen mit Breite 0 nicht importiert ( was sehr
//    empfehlenswert ist ), dann muessen die ZellenNummern korrigiert werden.
//    Der Index kann ueber nTransCell[] nachgesehen werden. Fuer diese Zellen
//    ist bExist[] FALSE.
// 4) Da WW Zellen mit ausgefransten Raendern darstellen kann, der SW aber
//    nicht, werden hier ggfs. leere Zellen links und rechts angefuegt. Auch
//    hier muessen die Zellennummern korrigiert werden.
//
// -> bExist[] enthaelt Info darueber, ob im WW vorhandene Zellen im SW fehlen
//    ( Fall 3 )
// -> nTransCell[] ist die UEbersetzung von WW-Indices auf SW-Indizes
//    ( unterschiedlich bei Fall 3 und 4 )

static BOOL IsEqual( WW8TabBandDesc* p1, WW8TabBandDesc* p2 )
{
    if( !p1 || !p2 )
        return FALSE;
#if 0   // dieses waere der schnellste Vergleich, aber ich bin mir nicht sicher,
        // ob gewisse Systeme die struct-Elemente nicht umsortieren oder
        // Luecken lassen
    if( !memcmp( &p1->nGapHalf, &p2->nGapHalf,
        (BYTE*)&p1->pTCs - (BYTE*)&p1->nGapHalf ) )
        return FALSE;
#endif
    if( p1->nWwCols != p2->nWwCols )
        return FALSE;

    if( p1->nLineHeight != p2->nLineHeight )
        return FALSE;

    if( p1->nGapHalf != p2->nGapHalf )  // koennte auch mit Toleranz arbeiten ( noetig ? )
        return FALSE;

    for( int i = 0; i <= p1->nWwCols; i++ )     // nCols+1 Angaben
        if( p1->nCenter[i] != p2->nCenter[i] )  // Toleranz bei nCenter ?
            return FALSE;

    if( p1->pTCs || p2->pTCs ){         // mindestens einer mit TCs
        if( !p1->pTCs || !p2->pTCs )
            return FALSE;                   // einer ohne TCs

        if( memcmp( p1->pTCs, p2->pTCs, ( p1->nWwCols ) * sizeof( WW8_TCell ) ) )
            return FALSE;
    }
    if( p1->pSHDs || p2->pSHDs ){           // mindestens einer mit SHDs
        if( !p1->pSHDs || !p2->pSHDs )
            return FALSE;                   // einer ohne SHDs

        if( memcmp( p1->pSHDs, p2->pSHDs, ( p1->nWwCols ) * sizeof( WW8_SHD ) ) )
            return FALSE;
    }
    return TRUE;
}

WW8TabBandDesc::WW8TabBandDesc( WW8TabBandDesc& rBand )
{
    *this = rBand;
    if( rBand.pTCs ){
        pTCs = new WW8_TCell[nWwCols];
        memcpy( pTCs, rBand.pTCs, nWwCols * sizeof( WW8_TCell ) );
    }
    if( rBand.pSHDs ){
        pSHDs = new WW8_SHD[nWwCols];
        memcpy( pSHDs, rBand.pSHDs, nWwCols * sizeof( WW8_SHD ) );
    }
}

// ReadDef liest die Zellenpositionen und ggfs die Umrandungen eines Bandes ein
void WW8TabBandDesc::ReadDef( BOOL bVer67, BYTE* pS )
{
    int i;

    if( !bVer67 ) pS++;

    short nLen = (INT16)SVBT16ToShort( pS - 2 ); // nicht schoen
    BYTE nCols = *pS;                       // Anzahl der Zellen
    short nOldCols = nWwCols;

    if( nCols > MAX_COL )
        return;

    nWwCols = nCols;

    BYTE* pT = &pS[1];
    nLen --;
    for( i=0; i<=nCols; i++, pT+=2 ){
        nCenter[i] = (INT16)SVBT16ToShort( pT );    // X-Raender
    }
    nLen -= 2 * ( nCols + 1 );
    if( nCols != nOldCols ){            // andere Spaltenzahl
        DELETEAZ( pTCs );
        DELETEAZ( pSHDs );
    }

    short nFileCols = nLen / ( bVer67 ? 10 : 20 );      // wirklich abgespeichert


    if( !pTCs )
    {
        // lege leere TCs an
        pTCs = new WW8_TCell[nCols];
        memset( pTCs, 0, nCols * sizeof( WW8_TCell ) );
    }


    if( nFileCols )
    {
        // lies TCs ein

        /*
            Achtung: ab Ver8 ist ein reserve-ushort je TC eingefuegt und auch
                     der Border-Code ist doppelt so gross, daher ist hier
                             kein simples kopieren moeglich,
                             d.h.: pTCs[i] = *pTc;  geht leider nicht.
            ---
            Vorteil: Arbeitstruktur ist jetzt viel bequemer zu handhaben!
        */
        WW8_TCell* pAktTC  = pTCs;
        if( bVer67 )
        {
            WW8_TCellVer6* pTc = (WW8_TCellVer6*)pT;
            for( i=0; i<nCols; i++, ++pAktTC )
            {
                memset( pAktTC, 0, sizeof( WW8_TCell ) );
                if( i < nFileCols )
                {               // TC aus File ?
                    BYTE aBits1 = SVBT8ToByte( pTc->aBits1Ver6 );
                    pAktTC->bFirstMerged    = ( ( aBits1 & 0x01 ) != 0 );
                    pAktTC->bMerged     = ( ( aBits1 & 0x02 ) != 0 );
                    memcpy( pAktTC->rgbrc[ WW8_TOP      ].aBits1,
                                    pTc->rgbrcVer6[ WW8_TOP     ].aBits1, sizeof( SVBT16 ) );
                    memcpy( pAktTC->rgbrc[ WW8_LEFT     ].aBits1,
                                    pTc->rgbrcVer6[ WW8_LEFT    ].aBits1, sizeof( SVBT16 ) );
                    memcpy( pAktTC->rgbrc[ WW8_BOT      ].aBits1,
                                    pTc->rgbrcVer6[ WW8_BOT     ].aBits1, sizeof( SVBT16 ) );
                    memcpy( pAktTC->rgbrc[ WW8_RIGHT    ].aBits1,
                                    pTc->rgbrcVer6[ WW8_RIGHT   ].aBits1, sizeof( SVBT16 ) );
                    if(    ( pAktTC->bMerged )
                            && ( i > 0             ) )
                    {
                        // Cell gemerged -> merken
                        //bWWMergedVer6[i] = TRUE;
                        memcpy( pTCs[i-1].rgbrc[ WW8_RIGHT ].aBits1,
                                pTc->rgbrcVer6[  WW8_RIGHT ].aBits1, sizeof( SVBT16 ) );
                            // right Border in vorige Zelle uebernehmen
                            // Hier darf bExist nicht auf FALSE gesetzt werden, da WW
                            // in den Textboxen diese Zellen nicht mitzaehlt....
                    }
                    if( i+1 < nFileCols )
                        pTc++;
                }
            }
        }
        else
        {
            WW8_TCellVer8* pTc = (WW8_TCellVer8*)pT;
            for( i=0; i<nCols; i++, ++pAktTC )
            {
                memset( pAktTC, 0, sizeof( WW8_TCell ) );
                if( i < nFileCols )
                {               // TC aus File ?
                    UINT16 aBits1 = (UINT16)SVBT16ToShort( pTc->aBits1Ver8 );
                    pAktTC->bFirstMerged    = ( ( aBits1 & 0x0001 ) != 0 );
                    pAktTC->bMerged         = ( ( aBits1 & 0x0002 ) != 0 );
                    pAktTC->bVertical       = ( ( aBits1 & 0x0004 ) != 0 );
                    pAktTC->bBackward       = ( ( aBits1 & 0x0008 ) != 0 );
                    pAktTC->bRotateFont     = ( ( aBits1 & 0x0010 ) != 0 );
                    pAktTC->bVertMerge      = ( ( aBits1 & 0x0020 ) != 0 );
                    pAktTC->bVertRestart    = ( ( aBits1 & 0x0040 ) != 0 );
                    pAktTC->nVertAlign      = ( ( aBits1 & 0x0180 ) >> 7 );
                    // am Rande: im aBits1 verstecken sich noch 7 Reserve-Bits,
                    //           anschliessend folgen noch 16 weitere Reserve-Bits

                    // In Version 8 koennen wir alle Bordercodes auf einmal kopieren!
                    memcpy( pAktTC->rgbrc, pTc->rgbrcVer8, 4 * sizeof( WW8_BRC ) );
                    // Zellen-Mergeinfo braucht hier nicht extra vermerkt zu werden,
                    // da dies ab Ver8 ja ueber Merge-Gruppen verwaltet wird.
                    if( i+1 < nFileCols )
                        pTc++;
                }
            }
        }
    }
}


void WW8TabBandDesc::ProcessSprmTSetBRC( BOOL bVer67, BYTE* pParamsTSetBRC )
{
    if( pParamsTSetBRC && pTCs ) // set one or more cell border(s)
    {
        BYTE nitcFirst= pParamsTSetBRC[0];// first col to be changed
        BYTE nitcLim  = pParamsTSetBRC[1];// (last col to be changed)+1
        BYTE nFlag    = *(pParamsTSetBRC+2);

        BOOL bChangeRight  = nFlag & 0x08;
        BOOL bChangeBottom = nFlag & 0x04;
        BOOL bChangeLeft   = nFlag & 0x02;
        BOOL bChangeTop    = nFlag & 0x01;

        WW8_TCell* pAktTC  = pTCs + nitcFirst;
        if( bVer67 )
        {
            WW8_BRCVer6* pBRC = (WW8_BRCVer6*)(pParamsTSetBRC+3);

            for( int i = nitcFirst; i < nitcLim; i++, ++pAktTC )
            {
                if( bChangeTop )
                    memcpy( pAktTC->rgbrc[ WW8_TOP  ].aBits1,
                            pBRC->aBits1,
                            sizeof( SVBT16 ) );
                if( bChangeLeft )
                    memcpy( pAktTC->rgbrc[ WW8_LEFT ].aBits1,
                            pBRC->aBits1,
                            sizeof( SVBT16 ) );
                if( bChangeBottom )
                    memcpy( pAktTC->rgbrc[ WW8_BOT  ].aBits1,
                            pBRC->aBits1,
                            sizeof( SVBT16 ) );
                if( bChangeRight )
                    memcpy( pAktTC->rgbrc[ WW8_RIGHT].aBits1,
                            pBRC->aBits1,
                            sizeof( SVBT16 ) );
            }
        }
        else
        {
            WW8_BRC* pBRC = (WW8_BRC*)(pParamsTSetBRC+3);

            for( int i = nitcFirst; i < nitcLim; i++, ++pAktTC )
            {
                if( bChangeTop )
                    memcpy( pAktTC->rgbrc[ WW8_TOP  ].aBits1,
                            pBRC->aBits1,
                            sizeof( WW8_BRC ) );
                if( bChangeLeft )
                    memcpy( pAktTC->rgbrc[ WW8_LEFT ].aBits1,
                            pBRC->aBits1,
                            sizeof( WW8_BRC ) );
                if( bChangeBottom )
                    memcpy( pAktTC->rgbrc[ WW8_BOT  ].aBits1,
                            pBRC->aBits1,
                            sizeof( WW8_BRC ) );
                if( bChangeRight )
                    memcpy( pAktTC->rgbrc[ WW8_RIGHT].aBits1,
                            pBRC->aBits1,
                            sizeof( WW8_BRC ) );
            }



        }
    }
}


void WW8TabBandDesc::ProcessSprmTDxaCol( BOOL bVer67, BYTE* pParamsTDxaCol )
{
    // sprmTDxaCol (opcode 0x7623) changes the width of cells
    // whose index is within a certain range to be a certain value.

    if( nWwCols && pParamsTDxaCol ) // set one or more cell length(s)
    {
        BYTE nitcFirst= pParamsTDxaCol[0]; // first col to be changed
        BYTE nitcLim  = pParamsTDxaCol[1]; // (last col to be changed)+1
        short nDxaCol = (INT16)SVBT16ToShort( pParamsTDxaCol + 2 );
        short nOrgWidth;
        short nDelta;

        for( int i = nitcFirst; i < nitcLim, i < nWwCols; i++ )
        {
            nOrgWidth  = nCenter[i+1] - nCenter[i];
            nDelta     = nDxaCol - nOrgWidth;
            for( int j = i+1; j < nWwCols; j++ )
            {
                nCenter[j] += nDelta;
            }
        }
    }
}


void WW8TabBandDesc::ProcessSprmTDelete( BOOL bVer67, BYTE* pParamsTDelete )
{
    // sprmTDxaCol (opcode 0x7623) changes the width of cells
    // whose index is within a certain range to be a certain value.

    if( nWwCols && pParamsTDelete )        // set one or more cell length(s)
    {
        BYTE nitcFirst= pParamsTDelete[0]; // first col to be deleted
        BYTE nitcLim  = pParamsTDelete[1]; // (last col to be deleted)+1

        BYTE nShlCnt  = nWwCols - nitcLim; // count of cells to be shifted


        WW8_TCell* pAktTC  = pTCs + nitcFirst;
        int i = 0;
        for( ; i < nShlCnt; i++, ++pAktTC )
        {
            // adjust the left x-position
            nCenter[nitcFirst + i] = nCenter[nitcLim + i];

            // adjust the cell's borders
            *pAktTC = pTCs[ nitcLim + i];
        }
        // adjust the left x-position of the dummy at the very end
        nCenter[nitcFirst + i] = nCenter[nitcLim + i];

        nWwCols -= (nitcLim - nitcFirst);
    }
}

void SwWW8ImplReader::Read_TabCellDelete( USHORT, BYTE* pData, short nLen )
{
    // implementation missing: #76673#
    //
    // could we use part of ProcessSprmTDelete()  ???
}

void SwWW8ImplReader::Read_TabCellInsert( USHORT, BYTE* pData, short nLen )
{
    // implementation missing, analoguous to #76673#
}



// ReadShd liest ggfs die Hintergrundfarben einer Zeile ein.
// Es muss vorher ReadDef aufgerufen worden sein
void WW8TabBandDesc::ReadShd( SVBT16* pS )
{
    BYTE nLen = ( pS ) ? *( (BYTE*)pS - 1 ) : 0 ;
    if( !nLen )
        return;

#if 0
    if( !pS || *( pS - 1 ) < nWwCols * sizeof( WW8_SHD )  )
    {
        DELETEAZ( pSHDs );              // nicht vollstaendig -> ignorieren
        return;
    }
#endif

    if( !pSHDs )
    {
        pSHDs = new WW8_SHD[nWwCols];
        memset( pSHDs, 0, nWwCols * sizeof( WW8_SHD ) );
    }

    BYTE nAnz = nLen >> 1;
    if( nAnz > nWwCols )
        nAnz = (BYTE)nWwCols;
    int i;
    SVBT16* pShd;
    for( i=0, pShd = pS; i<nAnz; i++, pShd++ )
        pSHDs[i].SetWWValue( *pShd );

    //pSHDs[i]  = *pShd;
}



static BOOL SearchRowEnd( BOOL bVer67, BOOL bComplex, WW8PLCFx_Cp_FKP* pPap )
{
    BYTE* pB;

    while(     (    ( bVer67 && !bComplex )
                 || ( pPap->GetPCDIdx() < pPap->GetPCDIMax()) )
            && pPap->HasFkp() )
    {
        if( pPap->Where() != LONG_MAX )
        {
            pB = pPap->HasSprm( bVer67 ? 25 : 0x2417 );
            if(     pB
                && *pB == 1 )
                return TRUE;    // RowEnd found
        }
        (*pPap)++;
    }
    return FALSE;
}



WW8TabDesc::WW8TabDesc( SwWW8ImplReader* pIoClass )
    : pIo( pIoClass ),
    pFirstBand( 0 ),
    pActBand( 0 ),
    pTmpPos( 0 ),
    pTable( 0 ),
    pTblNd( 0 ),
    pTabLines( 0 ),
    pTabLine( 0 ),
    pTabBoxes( 0 ),
    pTabBox( 0 ),
    pMergeGroups( 0 ),
    pAktWWCell( 0 ),
    nRows( 0 ),
    nDefaultSwCols( 0 ),
    nBands( 0 ),
    nMinLeft( 0 ),
    nMaxRight( 0 ),
    nSwWidth( 0 ),
    bOk( TRUE ),
    bHeader( FALSE ),
    bBorderDefaults( FALSE ),
    bClaimLineFmt( FALSE ),
    eOri( HORI_NONE ),
    nAktRow( 0 ),
    nAktBandRow( 0 ),
    nAktCol( 0 )
{
    pIo->bAktAND_fNumberAcross = FALSE;

    static SwHoriOrient aOriArr[] = {
                        HORI_LEFT, HORI_CENTER, HORI_RIGHT, HORI_CENTER };

    BOOL bVer67   = pIo->bVer67;
    BOOL bComplex = pIo->pWwFib->fComplex;

    WW8TabBandDesc* pNewBand = new WW8TabBandDesc;


                            // Dies ist auch eine moegliche Erkennung
                            // fuer Dok-Start ( hat immer PageDesc ).
                            // Allerdings werden die PageDescs
                            // bei Bereichswechsel nicht erkannt
//  bStartDoc = ( pIo->pPaM->GetPoint()->nNode.GetIndex()
//               == pIo->rDoc.GetNodes().EndOfIcons.GetIndex() + 2 );

    WW8PLCFxSave1 aSave;
    pIoClass->pPlcxMan->GetPap()->Save( aSave );

    WW8PLCFx_Cp_FKP* pPap = pIoClass->pPlcxMan->GetPapPLCF();

    // process pPap until end of table found
    do{
        short nTabeDxaNew     = SHRT_MAX;
        eOri                  = HORI_LEFT;
        pNewBand->nGapHalf    = 0;
        pNewBand->nLineHeight = 0;
        BOOL bTabRowJustRead  = FALSE;
        BYTE* pShadeSprm      = 0;
        BYTE* pTabDxaColSprm  = 0;


        if( !SearchRowEnd( bVer67, bComplex, pPap ) )   // Suche Ende einer TabZeile
        {
            bOk = FALSE;
            break;
        }


        // Get the SPRM chains:
        // first from PAP and then from PCD (of the Piece Table)
        WW8PLCFxDesc aDesc;
        pPap->GetSprms( &aDesc );
        WW8SprmIter aSprmIter( aDesc.pMemPos, aDesc.nSprmsLen,
                               pIo->GetFib().nVersion );

        BYTE* pParams = aSprmIter.GetAktParams();
        for( int nLoop = 0; nLoop < 2; ++nLoop )
        {
            while(     aSprmIter.GetSprms()
                    && (0 != (pParams = aSprmIter.GetAktParams())) )
            {
                switch( aSprmIter.GetAktId() )
                {
                case 187:
                case 0xD605:
                    if( !nRows )
                    {
                        // sprmTTableBorders
                        if( bVer67 )
                            for( int i = 0; i < 6; ++i )
                            {
                                aDefBrcs[i].aBits1[0] = pParams[   2*i ];
                                aDefBrcs[i].aBits1[1] = pParams[ 1+2*i ];
                            }
                        else
                            memcpy( aDefBrcs, pParams, 24 ); // aDefBrcs = *(BRC(*)[6])pS;
                        bBorderDefaults = TRUE;
                    }
                    break;
                case 186:
                case 0x3404:
                    if( nRows == 0 )  // only 1. Line is Header
                    {
                        // sprmTTableHeader
                        bHeader = TRUE;
                    }
                    break;
                case 182:
                case 0x5400:
                    if( nRows == 0 )
                    {
                        // sprmTJc  -  Justification Code
                        eOri = aOriArr[ *pParams & 0x3 ];
                    }
                    break;
                case 184:
                case 0x9602:
                    {
                        // sprmTDxaGapHalf
                        pNewBand->nGapHalf = (INT16)SVBT16ToShort( pParams );
                    }
                    break;
                case 189:
                case 0x9407:
                    {
                        // sprmTDyaRowHeight
                        pNewBand->nLineHeight = (INT16)SVBT16ToShort( pParams ); // DyaRowHeight
                        bClaimLineFmt = TRUE;
                    }
                    break;
                case 190:
                case 0xD608:
                    {
                        // DefineTabRow
                        pNewBand->ReadDef( bVer67, pParams );
                        bTabRowJustRead = TRUE;
                    }
                    break;
                case 191:
                case 0xD609:
                    {
                        // TableShades
                        pShadeSprm = pParams;
                    }
                    break;
                //
                // * * * * Bug #69885#: the following codes were added * * * *
                //                      (khz, 1.Feb.2000)
                case 183:
                case 0x9601:
                    {
                        // sprmTDxaLeft
                        //
                        // our Writer cannot shift single table lines horizontally
                        // so we have to find the smallest parameter (meaning the
                        // left-most position) and then
                        // shift the whole table to that margin (see below)
                        short nDxaNew = (INT16)SVBT16ToShort( pParams );
                        if( nDxaNew < nTabeDxaNew )
                            nTabeDxaNew = nDxaNew;
                    }
                    break;
                case 193:
                case 0xD620:
                    {
                        // sprmTSetBrc
                        pNewBand->ProcessSprmTSetBRC( bVer67, pParams );
                    }
                    break;
                case 196:
                case 0x7623:
                    {
                        // sprmTDxaCol
                        pTabDxaColSprm = pParams;
                    }
                    break;
                /*              the following is processed by a separate methode
                case 195:       while reading the table's content...
                case 0x5622:
                    {
                        // sprmTDelete
                    }
                    break;
                */
                }
                aSprmIter++;
            }

            if( !nLoop )
            {
                pPap->GetPCDSprms(  aDesc );
                aSprmIter.SetSprms( aDesc.pMemPos, aDesc.nSprmsLen );
            }
        }


                            // #55171: WW-Tabellen koennen Fly-Wechsel
                            // beinhalten
                            // daher hier Tabellen abbrechen und neu beginnen
                            // noch steht *pPap noch vor TabRowEnd, daher
                            // kann TestApo() mit letztem Parameter FALSE
                            // und damit wirksam gerufen werden.


        if( bTabRowJustRead && pShadeSprm )
            pNewBand->ReadShd( (SVBT16*)pShadeSprm );

        if( nTabeDxaNew < SHRT_MAX )
        {
            short* pCenter  = pNewBand->nCenter;
            for( int i = 0; i < pNewBand->nWwCols; i++, ++pCenter )
                // Shift left x-position
                *pCenter += nTabeDxaNew;
        }

        if( pTabDxaColSprm )
            pNewBand->ProcessSprmTDxaCol( bVer67, pTabDxaColSprm );


     // Bei Unterschieden gibt es ein neues Band
     // Zweite Zeile bekommt immer ein neues Band, damit die erste allein ist
        if( nRows == 1 || !IsEqual( pNewBand, pActBand ) )
        {
            if( !pActBand )
            {
                pActBand = pFirstBand = pNewBand;
            }
            else
            {
                pActBand->pNextBand = pNewBand;
                pActBand = pNewBand;
            }
            pNewBand = new WW8TabBandDesc;
            nBands++;
        }
        else
        {
            delete pNewBand;
            pNewBand = new WW8TabBandDesc;
        }
        nRows++;
        pActBand->nRows++;

        (*pPap)++;
        if(    ( pPap->Where() == LONG_MAX )
            || (    ( !bVer67 || bComplex )
                 && ( pPap->GetPCDIdx() >= pPap->GetPCDIMax() ) ) )
        {
            bOk = FALSE;
            break;
        }

        // InTable
        if(     (0 == (pParams = pPap->HasSprm( bVer67 ? 24 : 0x2416 ) ) )
            ||  (1 != *pParams) )
            break;


        BOOL bStartApo, bStopApo, bNowStyleApo;
        pIoClass->TestApo( bStartApo, bStopApo,
                           bNowStyleApo, TRUE, FALSE, TRUE );
        if( bStopApo )  // Wenn Apo-Ende oder Apo-Wechsel, dann
            break;      // hoert die Tabelle hier auf

    }while( 1 );

    if( bOk )
    {
        if( pActBand->nRows > 1 )
        {   // Letztes Band hat mehr als 1 Zeile
            delete( pNewBand );
            pNewBand = new WW8TabBandDesc( *pActBand ); // neues machen
            pActBand->nRows--;      // wegen Sonderbehandlung Raender-Defaults
            pNewBand->nRows = 1;
            pActBand->pNextBand = pNewBand; // am Ende einschleifen
            nBands++;
            pNewBand = 0;                   // nicht loeschen
        }

        CalcDefaults();
    }
    delete( pNewBand );

    pIoClass->pPlcxMan->GetPap()->Restore( aSave );
}

WW8TabDesc::~WW8TabDesc()
{
    WW8TabBandDesc* pR = pFirstBand;
    WW8TabBandDesc* pR2;

    while( pR ){
        pR2 = pR->pNextBand;
        delete( pR );
        pR = pR2;
    }
    if( pMergeGroups ) DELETEZ( pMergeGroups );
}

void WW8TabDesc::CalcDefaults()
{
    short nMinCols = SHRT_MAX;
    register WW8TabBandDesc* pR;

    nMinLeft = SHRT_MAX;
    nMaxRight = SHRT_MIN;

                        // 1. Durchlauf: aeusserste L- und R-Grenzen finden
    for( pR = pFirstBand; pR; pR = pR->pNextBand ){
        if( pR->nCenter[0] < nMinLeft )
            nMinLeft = pR->nCenter[0];
        if( pR->nCenter[pR->nWwCols] > nMaxRight )
            nMaxRight = pR->nCenter[pR->nWwCols];
    }
    nSwWidth = nMaxRight - nMinLeft;
                        // 2. Durchlauf: Zahl der Writer-Spalten feststellen
                        // Die Zahl der Writer Spalten kann um bis zu 2 hoeher
                        // sein als im WW, da der SW im Gegensatz zu WW keine
                        // ausgefransten linken und rechten Raender kann und
                        // diese durch leere Boxen aufgefuellt werden.
                        // Durch nichtexistente Zellen koennen auch Zellen
                        // wegfallen

    for( pR = pFirstBand; pR; pR = pR->pNextBand ){
        pR->nSwCols = pR->nWwCols;
        pR->bLEmptyCol = pR->nCenter[0] - nMinLeft > MINLAY;
        pR->bREmptyCol = nMaxRight - pR->nCenter[pR->nWwCols] > MINLAY;

        short nAddCols = pR->bLEmptyCol + pR->bREmptyCol;
        USHORT i;
        USHORT j = ( pR->bLEmptyCol ) ? 1 : 0;
        for( i = 0; i < pR->nWwCols; i++ ){
            pR->nTransCell[i] = (INT8)j;
            if(    ( pR->nCenter[i] < pR->nCenter[i+1] )
                    //&& !pR->bWWMergedVer6[i]
                    )
            {       //  Zelle existiert wirklich
                pR->bExist[i] = TRUE;
                j++;
            }
            else
            {
                pR->bExist[i] = FALSE;
                nAddCols--;
            }
        }
        pR->nTransCell[i++] = (INT8)(j++);  // Wird u.a. wegen bREmptyCol um
        pR->nTransCell[i] = (INT8)j;        // max. 2 ueberindiziert

        pR->nSwCols += nAddCols;
        if( pR->nSwCols < nMinCols )
            nMinCols = pR->nSwCols;
    }
                        // 3. Durchlauf: Wo noetig die Umrandungen durch die
                        // Defaults ersetzen
    if( bBorderDefaults ){
        for( pR = pFirstBand ; pR; pR = pR->pNextBand ){
            if( !pR->pTCs ){
                pR->pTCs = new WW8_TCell[ pR->nWwCols ];
                memset( pR->pTCs, 0, pR->nWwCols * sizeof( WW8_TCell ) );
            }
            int k;
            for( k = 0; k < pR->nWwCols; k++ ){
                register WW8_TCell* pT = &pR->pTCs[k];
                int i, j;
                for( i = 0; i < 4; i ++ ){
#ifdef DEBUG
// nur fuer Ver67
                    USHORT nBBrc = SVBT16ToShort( pT->rgbrc[i].aBits1 );
                    USHORT nBWidth = nBBrc >> 0 & 0x7;
                    USHORT nBType = nBBrc >> 3 & 0x3;
                    USHORT nBShadow = nBBrc >> 5 & 0x1;
                    USHORT nBIco = nBBrc >> 6 & 0x1f;
                    USHORT nBSpace = nBBrc >> 11 & 0x1f;
#endif
                    if(   pIo->bVer67
                        ? (( SVBT16ToShort( pT->rgbrc[i].aBits1 ) >> 3 & 0x3 ) == 0)
                        : (( SVBT16ToShort( pT->rgbrc[i].aBits1 )   & 0xFF00 ) == 0) )
                    {   // brcType == 0 nichts explizit gesetzt
                        j = i;
                        switch( i )
                        {
                        case 0: j = (pR == pFirstBand    ) ? 0 : 4; // Aussen oben  / Innen waagerecht
                                break;
                        case 1: j = ( k                  ) ? 5 : 1; // Aussen links / Innen senkrecht
                                break;
                        case 2: j = ( pR->pNextBand      ) ? 4 : 2; // Aussen unten / Innen waagerecht
                                break;
                        case 3: j = (k == pR->nWwCols - 1) ? 3 : 5; // Aussen rechts/ Innen senkrecht
                                break;
                        }
#ifdef DEBUG
// nur fuer Ver67
                        USHORT nDBrc = SVBT16ToShort( aDefBrcs[j].aBits1 );
                        USHORT nDWidth = nDBrc >> 0 & 0x7;
                        USHORT nDType = nDBrc >> 3 & 0x3;
                        USHORT nDShadow = nDBrc >> 5 & 0x1;
                        USHORT nDIco = nDBrc >> 6 & 0x1f;
                        USHORT nDSpace = nDBrc >> 11 & 0x1f;
#endif
                        pT->rgbrc[i] = aDefBrcs[j]; // mangel mit Defaults ueber
                    }
                }
            }
        }
    }
    // 4. Ausrichtung der Tabelle
    long nMidTab  = ( (long)nMinLeft  + nMaxRight ) / 2; // TabellenMitte
    long nRight   = pIo->nPgWidth - pIo->nPgRight - pIo->nPgLeft;

     // set Position if not on adjusted to left border
    if((MINLAY < nMinLeft) && (HORI_LEFT == eOri))
    {
        if(MINLAY > abs(nMidTab - nRight/2))// very near the center IS centered
            eOri = HORI_CENTER;
        else
        if(MINLAY > abs(nMaxRight - nRight))// very near r.border IS r.adjusted
            eOri = HORI_RIGHT;
        else
            eOri = HORI_LEFT_AND_WIDTH;     //  absolutely positioned
    }

    nDefaultSwCols = nMinCols;  // da Zellen einfuegen billiger ist als Mergen
    if( nDefaultSwCols == 0 )
        bOk = FALSE;
    pActBand = pFirstBand;
    nAktBandRow = 0;
    ASSERT( pActBand, "pActBand ist 0" );
}

void WW8TabDesc::CreateSwTable()
{

    ::SetProgressState( pIo->nProgress, pIo->rDoc.GetDocShell() );   // Update
#ifdef DEBUG
//  Sound::Beep();
#endif

    // if there is already some content on the Node
    // append new node to ensure that this content remains
    // ABOVE the table
    SwPosition* pPoint = pIo->pPaM->GetPoint();
    BOOL bInsNode = ( pPoint->nContent.GetIndex() );
    if(    !bInsNode
        && pIo->pNode_FLY_AT_CNTNT == &pPoint->nNode.GetNode() )
    {
        bInsNode = TRUE;
        // minimize Fontsize to minimize height growth of the header/footer
        SvxFontHeightItem aSz( 20 );
        pIo->NewAttr( aSz );
        pIo->pCtrlStck->SetAttr( *pPoint, RES_CHRATR_FONTSIZE );
    }
    if( bInsNode )
    {
        // set font size to 1 point to minimize y-growth of Hd/Ft
        pIo->rDoc.AppendTxtNode( *pPoint );
    }


    pTmpPos = new SwPosition( *pIo->pPaM->GetPoint() );


    // Abfrage, ob im Node, in dem die Tabelle eingefuegt werden soll,
    // bereits ein Pagedesc steht. Dann wuerde der PageDesc in die
    // naechste Zeile hinter der Tabelle rutschen, wo er nichts zu
    // suchen hat.
    // -> loeschen und spaeter an das Tabellenformat setzen
    SfxPoolItem *pSetAttr = 0;
    SwTxtNode* pNd = pIo->rDoc.GetNodes()[pTmpPos->nNode]->GetTxtNode();
    if ( pNd ){
        const SfxItemSet* pSet = pNd->GetpSwAttrSet();
        const SfxPoolItem* pItem;
        if( pSet ){
            if( SFX_ITEM_SET == pSet->GetItemState( RES_PAGEDESC, FALSE, &pItem ))
            {
                pSetAttr = new SwFmtPageDesc( *(SwFmtPageDesc*)pItem );
                pNd->ResetAttr( RES_PAGEDESC );
            }
            if( SFX_ITEM_SET == pSet->GetItemState( RES_BREAK, FALSE, &pItem ) )
            {
                pSetAttr = new SvxFmtBreakItem( *(SvxFmtBreakItem*)pItem );
                pNd->ResetAttr( RES_BREAK );
            }
        }
    }


    // Die Tabelle ist beim Einfuegen noch recht klein:
    // Zahl der Spalten ist die kleinste Spaltenanzahl des Originals,
    // da Spalten einfuegen schneller geht als Loeschen
    // Zahl der Zeilen ist die Zahl der Baender, da sich die
    // (identischen) Zeilen eines Bandes prima duplizieren lassen
    pTable = pIo->rDoc.InsertTable( *pTmpPos, nBands, nDefaultSwCols, eOri );
    SwFrmFmt* pFrmFmt = pTable->GetFrmFmt();

    // evtl den PageDesc/Break jetzt an der Tabelle setzen
    if( pSetAttr )
    {
        pFrmFmt->SetAttr( *pSetAttr );
        delete pSetAttr;
    }

    if( nMaxRight - nMinLeft > MINLAY * nDefaultSwCols ) // Gesamtbreite der Tabelle
    {
        pFrmFmt->SetAttr( SwFmtFrmSize( ATT_VAR_SIZE, nSwWidth ) );//FIX
    }

    if(HORI_LEFT_AND_WIDTH == eOri)
    {
        SvxLRSpaceItem aL;
        aL.SetLeft( nMinLeft );
        pFrmFmt->SetAttr( aL );
    }

    if( pIo->pSFlyPara ){   // Ist Tabelle im Rahmen ?
                            // ok, Rahmen auf Bildgroesse vergroessern
                            //  ( nur wenn Auto-Breite )
        pIo->pSFlyPara->BoxUpWidth( nSwWidth );
    }

    // globale Varis initialisieren
    pTabLines = &pTable->GetTabLines();
    nAktRow = nAktCol
            = nAktBandRow
            = 0;

    pTblNd  = (SwTableNode*)(*pTabLines)[0]->GetTabBoxes()[0]->GetSttNd()->FindTableNode();
    ASSERT( pTblNd, "wo ist mein TabellenNode" );
    pTblNd->GetTable().SetHeadlineRepeat( bHeader );

    // ggfs. Zusatz-Zellen einfuegen u.dgl.
    AdjustNewBand( pIo );

    // jetzt den PaM korrekt setzen und ggfs. erste Mergegruppe vorbereiten...
    SetPamInCell( nAktCol, TRUE, TRUE );

    pIo->bWasTabRowEnd = FALSE;
}

void WW8TabDesc::FinishSwTable()
{
    *pIo->pPaM->GetPoint() = *pTmpPos;
    delete( pTmpPos );
    pTmpPos = 0;
    pIo->bWasTabRowEnd = FALSE;
    if( pIo->rDoc.GetRootFrm() )
    {
        // exitiert schon ein Layout, dann muss an dieser Tabelle die
        // BoxFrames neu erzeugt werden.
        pTblNd->DelFrms();
        pTblNd->MakeFrms( &pIo->pPaM->GetPoint()->nNode );
    }
    // falls noetig, zu mergende Zellen gruppenweise zusammenfassen
    if( pMergeGroups )
    {
        // bearbeite alle Merge-Gruppen nacheinander
        SwTableBox*    pTargetBox;
        WW8SelBoxInfo* pActMGroup;
        USHORT         nActBoxCount;
        for( USHORT iGr = 0; iGr < pMergeGroups->Count(); iGr++ )
        {
            pActMGroup   = (*pMergeGroups)[ iGr ];
            // Anzahl der zu mergenden Boxen PLUS Eins (fuer die TargetBox)
            nActBoxCount = pActMGroup->Count();

            if( ( 1 < nActBoxCount ) && pActMGroup && (*pActMGroup)[ 0 ] )
            {
                // beachten: der 0. Eintrag ist die ebenso wie
                // die obere, linke Box formatierte Target-Box !!!
                pTargetBox = (*pActMGroup)[ 0 ];
                //
                // Target-Box verschoenern: unteren Rand der letzten Box nehmen
                //
                SwFrmFmt* pTargetFrmFmt = pTargetBox->GetFrmFmt();
                SvxBoxItem aBoxItem( pTargetFrmFmt->GetBox() );
                aBoxItem.SetLine(
                    (*pActMGroup)[ nActBoxCount-1 ]->GetFrmFmt()->GetBox().GetBottom(),
                    BOX_LINE_BOTTOM );
                pTargetFrmFmt->SetAttr( aBoxItem );

                // oeffne Merge-Array mit passender Groesse
                SwSelBoxes aBoxes( nActBoxCount-1 );

                // alle Boxen dieser Gruppe in aBoxes versammeln
                aBoxes.Insert( pActMGroup->GetData()+1, nActBoxCount-1 );

                // Sicherheitspruefung: Gruppe mit nur EINER Box fuehrt beim Mergen
                // zum Programmabsturz, deshalb diesen unsinnigen Fall abfangen!
                USHORT nMergeTest;
                if( 2 == nActBoxCount )
                    // nur 1 Zelle in der Merge-Gruppe: wahrscheinlich Word-Bug
                    nMergeTest = TBLMERGE_TOOCOMPLEX;
                else
                {   //
                    // Vorsicht: erstmal austesten,
                    // ob sich die aBoxes ueberhaupt mergen lassen wuerden...
                    //
                    nMergeTest = CheckMergeSel( aBoxes );   // siehe   /SW/INC/TBLSEL.HXX
                    BYTE  nTry = 1;
                    //
                    // Falls das Merge so nicht machbar ist,
                    // pruefen, ob es ginge, wenn wir die letzte Box
                    // oder die beiden letzten Boxen
                    // oder gar die drei letzten Boxen
                    // aus der Merge-Gruppe rausnehmen wuerden
                    while(     ( TBLMERGE_TOOCOMPLEX == nMergeTest )
                                    && ( 4 > nTry                          )
                                    && ( 3 < nActBoxCount /* wichtig ! */  ) )
                    {
                        nTry++;
                        nActBoxCount--;
                        // letzte Box aus der Gruppe rausnehmen
                        aBoxes.Remove( nActBoxCount-1 );
                        // und nachsehen, ob Merge nun moeglich waere
                        nMergeTest = CheckMergeSel( aBoxes );
                    }
                }
                //
                // Genug geprueft - wir schreiten zur Tat...
                //
                switch( nMergeTest )
                {
                case TBLMERGE_OK:
                    //
                    // You succeed at last...
                    //
                    ((SwTable*)pTable)->Merge( &pIo->rDoc, aBoxes, pTargetBox );
                    break;
                case TBLMERGE_NOSELECTION:
                    /*NOP*/     // war wohl nix?
                    break;
                case TBLMERGE_TOOCOMPLEX:
                    // Pech: Trotz aller Probiererei geht das Merge immer noch nicht!
                    //
                    // Beachten: die Daten der Gruppe schlummern bereits
                    // in der Target-Box. Da kein Merge moeglich ist,
                    // setzen wir die Target-Box in die Tabelle an
                    // die Stelle der oberen linken Box.
                    {
                        const SwTableBox* pBox  = (*pActMGroup)[ 1 ];
                        SwTableLine*      pLine = (SwTableLine*)pBox->GetUpper();

                        USHORT nPos = pLine->GetTabBoxes().GetPos( pBox );

                        ASSERT( USHRT_MAX != nPos, "GetPos fehlgeschlagen");

                        SwStartNode* pSttNd = (SwStartNode*)pBox->GetSttNd();

                        ASSERT( pSttNd, "Box ohne Start-Node ?!");

                        pTargetBox->ChgFrmFmt(
                            (SwTableBoxFmt*)pBox->GetFrmFmt() );
                        pTargetBox->SetUpper(  pLine );

                        // erst die Box loeschen!!
                        pLine->GetTabBoxes().DeleteAndDestroy( nPos );
                        // dann die pTargetBox einfuegen
                        pLine->GetTabBoxes().C40_INSERT( SwTableBox, pTargetBox, nPos );
                        // dann die Nodes loeschen!!
                        pIo->rDoc.DeleteSection( pSttNd );
                    }
                    break;
                default:            // was wollen wir denn hier ???
                    ASSERT( !this, "CheckMergeSel() with undefined return value" );
                    break;
                }
            }
        }
        DELETEZ( pMergeGroups );
    }
    // nun noch ggfs. die doppelten Innenraender korrigieren (Bug #53525#)
    if( pTable )
        ((SwTable*)pTable)->GCBorderLines();    // Garbage Collect
}


// durchsucht pMergeGroups, meldet Index der ersten, passenden Gruppe bzw. -1
//
// Parameter: nXcenter  = Mittenposition der anfragenden Box
//            nWidth    = Breite der anfragenden Box
//            bExact    = Flag, ob Box in dieser Gruppe passen muss,
//                          oder diese nur zu tangieren braucht
//
BOOL WW8TabDesc::FindMergeGroup( short nX1, short nWidth, BOOL bExact, short& nMGrIdx )
{
    nMGrIdx = -1;
    if( pMergeGroups )
    {
        // noch als gueltig angesehener Bereich in der Naehe der Grenzen
        const short nToleranz = 4;
        // die aktuell untersuchte Gruppe
        WW8SelBoxInfoPtr pActGroup;
        // Boxgrenzen
        short nX2 = nX1 + nWidth;
        // ungefaehre Gruppengrenzen
        short nGrX1;
        short nGrX2;

        for( USHORT iGr = 0; iGr < pMergeGroups->Count(); iGr++ )
        {
            // die aktuell untersuchte Gruppe
            pActGroup = (*pMergeGroups)[ iGr ];
            if( -999 < pActGroup->nGroupXStart  )
            {
                // ungefaehre Gruppengrenzen mit Toleranz nach *aussen* hin
                nGrX1 = pActGroup->nGroupXStart - nToleranz;
                nGrX2 = pActGroup->nGroupXStart
                             +pActGroup->nGroupWidth  + nToleranz;
                //
                // Falls Box reinpasst, melde auf jeden Fall den Erfolg
                //
                if( ( nX1 > nGrX1 ) && ( nX2 < nGrX2 ) )
                {
                    nMGrIdx = iGr;  break;
                }
                //
                // hat die Box Bereiche mit der Gruppe gemeinsam?
                //
                if( !bExact )
                {
                    // melde Erfolg, wenn nX1 *oder* nX2 innerhalb der Gruppe liegen
                    if(    (     ( nX1 > nGrX1 )
                                        && ( nX1 < nGrX2 - 2*nToleranz ) )
                            || (     ( nX2 > nGrX1 + 2*nToleranz )
                                        && ( nX2 < nGrX2 ) )
                            // oder nX1 und nX2 die Gruppe umfassen
                            || (     ( nX1 <=nGrX1 )
                                        && ( nX2 >=nGrX2 ) ) )
                    {
                        nMGrIdx = iGr;  break;
                    }
                }
            }
        }
    }
    return BOOL( -1 < nMGrIdx );
}


BOOL WW8TabDesc::IsValidCell( short nCol ) const
{
    return     pActBand->bExist[ nCol ]
           && (USHORT)nAktRow < pTabLines->Count();
}


BOOL WW8TabDesc::SetPamInCell( short nWwCol, BOOL bPam, BOOL bCheckForMerge )
{
    ASSERT( pActBand, "pActBand ist 0" );

    if( !IsValidCell( nWwCol ) )
        return FALSE;

    USHORT nCol = pActBand->nTransCell[nWwCol];

    pTabLine = (*pTabLines)[nAktRow];
    pTabBoxes = &pTabLine->GetTabBoxes();
    if ( nCol >= pTabBoxes->Count() )
        return FALSE;
    pTabBox = (*pTabBoxes)[nCol];
    if( !pTabBox->GetSttNd() )
    {
        ASSERT(pTabBox->GetSttNd(), "Probleme beim Aufbau der Tabelle");
        return FALSE;
    }
    if( bPam )
    {
        pAktWWCell = &pActBand->pTCs[ nWwCol ];
        pIo->pPaM->GetPoint()->nNode = pTabBox->GetSttIdx() + 1;
        pIo->pPaM->GetPoint()->nContent.Assign( pIo->pPaM->GetCntntNode(), 0 );

        // Zur Sicherheit schon jetzt setzen, da bei den Zellen, die
        // zum Randausgleich eingefuegt werden, sonst der Style
        // nicht gesetzt wird.
        pIo->rDoc.SetTxtFmtColl( *pIo->pPaM, (SwTxtFmtColl*)pIo->pDfltTxtFmtColl );
        // uebrigens: da diese Zellen unsichtbare Hilfskonstruktionen sind,
        //            und nur dazu dienen, zerfranste Aussehen der WW-Tabelle
        //            nachzuahmen, braucht NICHT SetTxtFmtCollAndListLevel()
        //            verwendet zu werden.
    }
    //
    // ggfs. aktuelle Box in entsprechende Merge-Gruppe eintragen
    //
    if( bCheckForMerge && pActBand->pTCs /*&& !pIo->bVer67*/ )
    {
        SwTableBox* pTargetBox;
        WW8SelBoxInfoPtr pActMGroup = 0;
        //
        // ggfs. eine neue Merge-Gruppe beginnen
        //
        WW8_TCell& rCell = pAktWWCell ? *pAktWWCell : pActBand->pTCs[ nWwCol ];
        // ist dies die obere, linke-Zelle einer Merge-Gruppe ?
        if( rCell.bFirstMerged || ( rCell.bVertRestart && !rCell.bMerged ) )
        {
            short nX1    = pActBand->nCenter[ nWwCol ];
            short nWidth = pActBand->nWidth[  nWwCol ];
            if( !pMergeGroups )
                // 0. falls noetig das Array fuer die Merge-Gruppen anlegen
                pMergeGroups = new WW8MergeGroups;
            else
            {
                // 1. ggfs. alte Mergegruppe(n) schliessen, die den von
                //    unserer neuen Gruppe betroffenen X-Bereich ueberdecken
                short nMGrIdx;
                while( FindMergeGroup( nX1, nWidth, FALSE, nMGrIdx ) )
                {
                    (*pMergeGroups)[ nMGrIdx ]->nGroupXStart = -999;
                }
            }

            // 2. aktuelle Merge-Gruppe anlegen
            pActMGroup = new WW8SelBoxInfo( nX1, nWidth );

            // 3. und in Gruppen-Array eintragen
            pMergeGroups->Insert( pActMGroup, pMergeGroups->Count() );

            // 4. Target-Box anlegen und als 0. in Merge-Group setzen
            pIo->rDoc.GetNodes().InsBoxen(pTblNd,
                                pTabLine,
                                (SwTableBoxFmt*)pTabBox->GetFrmFmt(),
                                (SwTxtFmtColl*)pIo->rDoc.GetDfltTxtFmtColl(),
                                0,
                                nCol );

            pTargetBox = (*pTabBoxes)[ nCol ];

            // eingefuegte Box wieder aus der Row entfernen
            // (wird vom Merge() dann endgueltig richtig eingebaut)
            pTabBoxes->Remove( nCol );

            // und ab damit in die Merge-Group
            pActMGroup->Insert( pTargetBox, pActMGroup->Count() );
            //
            // 5. Target-Box formatieren
            //
            pTargetBox->SetUpper( 0 );

            // eigenes Frame-Format fuer diese Box anlegen
            SwFrmFmt* pNewFrmFmt = pTargetBox->ClaimFrmFmt();

            // Border der O-L-Box der Gruppe wird Border der Targetbox
            pNewFrmFmt->SetAttr( pTabBox->GetFrmFmt()->GetBox() );

            // Gesamtbreite ermitteln und zuweisen
            short nSizCell = pActBand->nWidth[  nWwCol ];
            for(USHORT i = nWwCol+1; i < pActBand->nWwCols; i++ )
                if(     pActBand->pTCs[ i ].bMerged
                        && !pActBand->pTCs[ i ].bFirstMerged    )
                    nSizCell += pActBand->nWidth[ i ];
                else
                    break;
            pActMGroup->nGroupWidth = nSizCell;
            pNewFrmFmt->SetAttr( SwFmtFrmSize( ATT_VAR_SIZE, pActMGroup->nGroupWidth ));
        }

        // ggfs. akt. Box zu einer Merge-Gruppe hinzufuegen
        // (dies kann eine soeben angelegte, oder eine andere Gruppe sein)
        pTargetBox = UpdateTableMergeGroup( rCell, pActMGroup, pTabBox, nWwCol );
        if( pTargetBox )
        {
            // den pCurPaM jetzt ans Ende der Target-Box setzen,
            // damit der Text direkt in die richtige Box gelesen wird.

            const SwNode* pEndNd =
                    pTargetBox->GetSttNd()->EndOfSectionNode();

            ASSERT(pEndNd, "Gruppen-TargetBox ohne Start-Node ?");

            if( bPam )
            {
                pIo->pPaM->GetPoint()->nNode = pEndNd->GetIndex();
                pIo->pPaM->Move( fnMoveBackward );
            }
        }
    }
    return TRUE;
}

#if 0               // wird fuer FastSave-Files noch gebraucht
void WW8TabDesc::DeleteCells( short nDelete )
{
    short nMergeCol = nDefaultSwCols - nDelete - 1;

    SwSelBoxes aBoxes;
    short i;

    for (i = nMergeCol; i < nMergeCol + nDelete + 1; i++ ){
        if( !SetPamInCell( i, FALSE, FALSE ) )
            return;
        _SwSelBox a_SelBox( pTabBox->GetSttIdx(), pTabBox );
        aBoxes.Insert( a_SelBox );
    }

    SetPamInCell( nMergeCol, FALSE, FALSE ); // Cursor u.AE. an alte Pos
    pIo->rDoc.GetNodes().InsBoxen( pTblNd, pTabLine, pTabBox->GetFrmFmt(),
                            (SwTxtFmtColl*)pIo->rDoc.GetDfltTxtFmtColl(),
                            0, nMergeCol );
    SwTableBox* pNewBox = (*pTabBoxes)[nMergeCol];
    pTabBoxes->Remove( nMergeCol );     // wieder austragen
    pNewBox->SetUpper( 0 );
    pNewBox->ClaimFrmFmt();

    pIo->pPaM->GetPoint()->nContent.Assign( 0, 0 ); // Melde ContentIndex pCurPaM ab

    ((SwTable*)pTable)->Merge( &pIo->rDoc, aBoxes, pNewBox );
}
#endif

void WW8TabDesc::InsertCells( short nIns )
{
        pTabLine = (*pTabLines)[nAktRow];
        pTabBoxes = &pTabLine->GetTabBoxes();
        pTabBox = (*pTabBoxes)[0];

    pIo->rDoc.GetNodes().InsBoxen( pTblNd, pTabLine, (SwTableBoxFmt*)pTabBox->GetFrmFmt(),
                            (SwTxtFmtColl*)pIo->pDfltTxtFmtColl, 0, pTabBoxes->Count(), nIns );
    // mit dem Dritten Parameter wird das FrmFmt der Boxen angegeben.
    // hier kann man auch noch optimieren, um FrmFmts zu sparen
}

void WW8TabDesc::SetTabBorders( SwTableBox* pBox, short nWwIdx )
{
    if( nWwIdx < 0 || nWwIdx >= pActBand->nWwCols )
        return;                 // kuenstlich erzeugte Zellen -> Kein Rand

    SvxBoxItem aFmtBox;

    // nGapHalf bedeutet bei WW ein *horizontaler* Abstand zwischen
    // Tabellenzelle und -Inhalt

    short nHorDist  = (short)pActBand->nGapHalf;
    short nVertDist = 0;

    if( pActBand->pTCs ) // neither Cell Border nor Default Border defined ?
    {
        WW8_TCell* pT = &pActBand->pTCs[nWwIdx];
        if( pIo->IsBorder( pT->rgbrc ) )
        {
            pIo->SetBorder( aFmtBox, pT->rgbrc );
            if ( nHorDist < MIN_BORDER_DIST )
                nHorDist = MIN_BORDER_DIST; // Border -> min. MIN_BORDER_DIST
        }
    }

    // Vertikal benutzt WW den Absatzabstand oben und unten, um einen Abstand
    // zu schaffen. Dieser ist hier leider noch unbekannt.  :-(


    // Frueher stand hier das Hypo-Flag:
    // Hypo-Tabellen alles einheitlich !
    // if ( SwFltGetFlag( pIo->GetFieldFlags(), SwFltControlStack::HYPO ) )

    // jetzt musz das alte Verhalten auch von HYPO gesondert aktiviert werden !
    if( SwFltGetFlag( pIo->GetIniFlags1(), EQUAL_TAB_BORDERDISTS ) )
    {
        if ( nHorDist < MIN_BORDER_DIST )
            nHorDist = MIN_BORDER_DIST; // Border -> min. MIN_BORDER_DIST
        nVertDist = nHorDist;
    }
    else
    {
        if( !nVertDist )            // kein Abstand gesetzt
            nVertDist = 18;         // ca. 0.03 cm
    }

    aFmtBox.SetDistance( nHorDist, BOX_LINE_LEFT    );
    aFmtBox.SetDistance( nVertDist, BOX_LINE_TOP    );

    aFmtBox.SetDistance( nHorDist, BOX_LINE_RIGHT   );
    aFmtBox.SetDistance( nVertDist, BOX_LINE_BOTTOM );

    pBox->GetFrmFmt()->SetAttr( aFmtBox );
}

void WW8TabDesc::SetTabShades( SwTableBox* pBox, short nWwIdx )
{
    if( nWwIdx < 0 || nWwIdx >= pActBand->nWwCols )
        return;                 // kuenstlich erzeugte Zellen -> Keine Farbe
    WW8_SHD& rSHD = pActBand->pSHDs[nWwIdx];
    if( !rSHD.GetValue() )      // alles weiss
        return;

    SwWW8Shade aSh( pIo->bVer67, rSHD );

    pBox->GetFrmFmt()->SetAttr( SvxBrushItem( aSh.aColor ) );
}

void WW8TabDesc::AdjustNewBand( SwWW8ImplReader* pReader )
{
    if( pActBand->nSwCols > nDefaultSwCols )        // Zellen splitten
        InsertCells( pActBand->nSwCols - nDefaultSwCols );

    SetPamInCell( 0, FALSE, FALSE );
    ASSERT( pTabBoxes && pTabBoxes->Count() == (USHORT)pActBand->nSwCols,
            "Falsche Spaltenzahl in Tabelle" )

    if( bClaimLineFmt ){
        pTabLine->ClaimFrmFmt();            // noetig wg. Zeilenhoehe
#if 1

        SwFmtFrmSize aF( ATT_MIN_SIZE, 0, 0 );  // default

        if( pActBand->nLineHeight == 0 ){       // 0 = Auto
            aF.SetSizeType( ATT_VAR_SIZE );
        }else{
            if( pActBand->nLineHeight < 0 ){    // Pos = min, Neg = exakt
                aF.SetSizeType( ATT_FIX_SIZE );
                pActBand->nLineHeight = -pActBand->nLineHeight;
            }
            if( pActBand->nLineHeight < MINLAY ) // nicht erlaubte Zeilenhoehe
                pActBand->nLineHeight = MINLAY;

            aF.SetHeight( pActBand->nLineHeight );// Min- / Exakt-Hoehe setzen
        }
        pTabLine->GetFrmFmt()->SetAttr( aF );
#else
        SwFrmSize eSiz = ATT_MIN_SIZE;      // Default

        if( pActBand->nLineHeight < 0 ){    // Pos = min; Neg = exakt
            pActBand->nLineHeight = -pActBand->nLineHeight;
            eSiz = ATT_FIX_SIZE;
        }

        if( pActBand->nLineHeight >= MINLAY ){  // erlaubte Zeilenhoehe, nicht auto
            pTabLine->GetFrmFmt()->SetAttr(
                SwFmtFrmSize( eSiz, 0, pActBand->nLineHeight ) );
        }else{                              // Auto oder ungueltig
            pTabLine->GetFrmFmt()->SetAttr( SwFmtFrmSize( ATT_VAR_SIZE, 0 ) );
        }
#endif
    }

    short i;    // SW-Index
    short j;    // WW-Index
    short nW;   // Breite

    SwFmtFrmSize aFS( ATT_FIX_SIZE );
    j = -pActBand->bLEmptyCol;
    for( i = 0; i < pActBand->nSwCols; i++ )
    {
        // setze Zellenbreite
        if( j < 0 )
            nW = pActBand->nCenter[0] - nMinLeft;
        else
        {
            if( j < pActBand->nWwCols )
                nW = pActBand->nCenter[j+1] - pActBand->nCenter[j];
            else
                nW = nMaxRight - pActBand->nCenter[j];
            pActBand->nWidth[ j ] = nW;
        }

        register SwTableBox* pBox = (*pTabBoxes)[i];
        pBox->ClaimFrmFmt();    // liesse sich durch intelligentes Umhaengen
                                                    // der FrmFmts noch weiter verringern
        // naemlich so: pFrmFmt->Add( pBox );
        // gibt der Box pBox das FrameFormat pFrmFmt


        //pMergeCtrl[ j ].nRowWidth = nW;
        aFS.SetWidth( nW );
        pBox->GetFrmFmt()->SetAttr( aFS );

                                            // setze Umrandung und Hintergrund
        SetTabBorders( pBox, j );           // und Abstand
        if( pActBand->pSHDs )
            SetTabShades( pBox, j );
        j++;
        // ueberspringe nicht existente Zellen
        while( ( j < pActBand->nWwCols ) && !pActBand->bExist[j] )
        {
            //pActBand->nWidth[  j ] =    0;
            pActBand->nWidth[  j ] = pActBand->nCenter[j+1] - pActBand->nCenter[j];
            pActBand->nCenter[ j ] = -999;
            j++;
        }
    }
}

void WW8TabDesc::TableCellEnd()
{
    ::SetProgressState( pIo->nProgress, pIo->rDoc.GetDocShell() );   // Update

    // neue Zeile
//  BOOL bRowEnded = pIo->bWasTabRowEnd;
    if( pIo->bWasTabRowEnd )  // bWasTabRowEnd will be deactivated
    {                         // in SwWW8ImplReader::ProcessSpecial()

        USHORT iCol = GetLogicalWWCol();
        if( iCol < aNumRuleNames.Count() )
            aNumRuleNames.DeleteAndDestroy( iCol, aNumRuleNames.Count()-iCol );

        pIo->pCtrlStck->SetAttr( *pIo->pPaM->GetPoint(), 0, FALSE );

        nAktCol = 0;
        nAktRow++;
        nAktBandRow++;
        ASSERT( pActBand , "pActBand ist 0" );
        if( pActBand )
        {
            if( nAktRow >= nRows )  // am Tabellenende gibt's nichts sinnvolles
                return;                 // mehr zu tun

            BOOL bNewBand = nAktBandRow >= pActBand->nRows;
            if( bNewBand )
            {                       // neues Band noetig ?
                pActBand = pActBand->pNextBand; //
                nAktBandRow = 0;
                ASSERT( pActBand, "pActBand ist 0" );
                AdjustNewBand( pIo );
            }
            else
            {
                SwTableBox* pBox = (*pTabBoxes)[0];
                SwSelBoxes aBoxes;
                pIo->rDoc.InsertRow( pTable->SelLineFromBox( pBox, aBoxes ) );
            }
        }
    }
    else
    {                       // neue Spalte ( Zelle )
        nAktCol++;
    }
    SetPamInCell( nAktCol, TRUE, TRUE );

    // finish Annotated Level Numbering ?
    if( pIo->bAnl && !pIo->bAktAND_fNumberAcross )
        pIo->StopAnl( IsValidCell( nAktCol ) );//FALSE );//!bRowEnded ); //
}


// ggfs. die Box in fuer diese Col offene Merge-Gruppe eintragen
SwTableBox* WW8TabDesc::UpdateTableMergeGroup(  WW8_TCell&     rCell,
                                                WW8SelBoxInfo* pActGroup,
                                                SwTableBox*    pActBox,
                                                USHORT         nCol )
{
    // Rueckgabewert defaulten
    SwTableBox* pResult = 0;

    // pruefen, ob die Box zu mergen ist
    if(    rCell.bFirstMerged
        || rCell.bMerged
        || rCell.bVertMerge
        || rCell.bVertRestart )
    {
        // passende Merge-Gruppe ermitteln
        WW8SelBoxInfo* pTheMergeGroup = 0;
        if( pActGroup )
            // Gruppe uebernehmen
            pTheMergeGroup = pActGroup;
        else
        {
            // Gruppe finden
            short nMGrIdx;
            if( FindMergeGroup( pActBand->nCenter[ nCol ],
                                pActBand->nWidth[  nCol ], TRUE, nMGrIdx ) )
                pTheMergeGroup = (*pMergeGroups)[ nMGrIdx ];
        }
        if( pTheMergeGroup )
        {
            // aktuelle Box der Merge-Gruppe hinzufuegen
            pTheMergeGroup->Insert( pActBox, pTheMergeGroup->Count() );

            // Target-Box zurueckmelden
            pResult = (*pTheMergeGroup)[ 0 ];
        }
    }
    return pResult;
}


USHORT WW8TabDesc::GetLogicalWWCol() const // returns number of col as INDICATED within WW6 UI status line -1
{
    USHORT nCol = 0;
    if( pActBand && pActBand->pTCs)
    {
        for( USHORT iCol = 1; iCol <= nAktCol; ++iCol )
        {
            if( !pActBand->pTCs[ iCol-1 ].bMerged )
                ++nCol;
        }
    }
    return nCol;
}

const String& WW8TabDesc::GetNumRuleName() const // find name of numrule valid for current WW-COL
{
    USHORT nCol = GetLogicalWWCol();
    const String*   pName =   aNumRuleNames.Count()  > nCol
                            ? aNumRuleNames.GetObject( nCol )
                            : 0;
    return pName ? *pName : aEmptyStr;
}

void WW8TabDesc::SetNumRuleName( const String& rName )
{
    USHORT nCol = GetLogicalWWCol();
    String* pName = 0;
    while( aNumRuleNames.Count() <= nCol )
    {
        aNumRuleNames.Insert( pName, aNumRuleNames.Count() );
    }
    String* pOldName = aNumRuleNames.GetObject( nCol );
    pName = new String( rName );
    aNumRuleNames.Replace( pName, nCol );
    if( pOldName )
        delete pOldName;
}




BOOL SwWW8ImplReader::StartTable()
{
    if(    pTableDesc       // keine rekursiven Tabellen
        || bReadNoTbl )     // Nicht bei EinfuegenDatei in Tabelle
        return FALSE;       // oder Fussnote

    pTableDesc = new WW8TabDesc( this );
    if( pTableDesc->Ok() )
        pTableDesc->CreateSwTable();
    else
    {
        delete pTableDesc;
        pTableDesc = 0;
    }
    return 0 != pTableDesc;
}

void SwWW8ImplReader::TabCellEnd()
{
    if( bTable && pTableDesc )
        pTableDesc->TableCellEnd();
}

void SwWW8ImplReader::Read_TabRowEnd( USHORT, BYTE* pData, short nLen ) // Sprm25
{
    if( ( nLen > 0 ) && ( *pData == 1 ) )
    {
        bWasTabRowEnd = TRUE;
        pSBase->SetNoAttrScan( 1 );
    }
}

void SwWW8ImplReader::StopTable()
{
    pTableDesc->FinishSwTable();
    delete( pTableDesc );
    pTableDesc = 0;
}

// GetTableLeft() wird fuer absatzgebundene Grafikobjekte in Tabellen
// gebraucht.
// WW nimmt bei eingerueckten Tabellen den Absatzrand, der ohne Tabelle
// gueltig waere, als Basis; SW benutzt den linken Tabellenrand.
short SwWW8ImplReader::GetTableLeft()
{
    return (pTableDesc) ? pTableDesc->GetMinLeft() : 0;
}


BOOL SwWW8ImplReader::IsInvalidOrToBeMergedTabCell() const
{
    if( !pTableDesc )
        return FALSE;

    const WW8_TCell* pCell = pTableDesc->GetAktWWCell();

    return     !pTableDesc->IsValidCell( pTableDesc->GetAktCol() )
            || (    pCell
                 && (    !pCell->bFirstMerged
                      && (    pCell->bMerged
                           || (    pCell->bVertMerge
                                && !pCell->bVertRestart
                              )
                         )
                    )
                );
}


const USHORT SwWW8ImplReader::StyleUsingLFO( USHORT nLFOIndex ) const
{
    USHORT nRes = USHRT_MAX;
    if( pCollA )
    {
        for(USHORT nI = 0; nI < pStyles->GetCount(); nI++ )
            if(    pCollA[ nI ].bValid
                && (nLFOIndex == pCollA[ nI ].nLFOIndex) )
                nRes = nI;
    }
    return nRes;
}


const SwFmt* SwWW8ImplReader::GetStyleWithOrgWWName( String& rName ) const
{
    SwFmt* pRet = 0;
    if( pCollA )
    {
        for(USHORT nI = 0; nI < pStyles->GetCount(); nI++ )
            if(    pCollA[ nI ].bValid
                && (rName.Equals( pCollA[ nI ].GetOrgWWName())) )
            {
                pRet = pCollA[ nI ].pFmt;
                break;
            }
    }
    return pRet;
}



//-----------------------------------------
//          class WW8RStyle
//-----------------------------------------

BYTE* WW8RStyle::HasParaSprm( USHORT nId ) const
{
    if( !pParaSprms || !nSprmsLen )
        return 0;

    BYTE* pSprms = pParaSprms;
    BYTE nDelta;
    short i, x;

    for( i=0; i<nSprmsLen;   )
    {
        USHORT nAktId = WW8GetSprmId( rFib.nVersion, pSprms, &nDelta );
        // Sprm gefunden?
        if( nAktId == nId )
            //alt: if( *pSprms == nId )
            return pSprms + 1 + nDelta + WW8SprmDataOfs( nId ); // Zeiger auf Daten
        x = WW8GetSprmSizeBrutto( rFib.nVersion, pSprms, &nAktId );
        i += x;
        pSprms += x;
    }
    return 0;                               // Sprm nicht gefunden
}


void WW8RStyle::ImportSprms( long nPosFc, short nLen, BOOL bPap )
{
    if( pStStrm->IsEof() )
        return;

    BYTE *pSprms0 = new BYTE[nLen];
    if( bPap )
    {
        pParaSprms = pSprms0;   // fuer HasParaSprms()
        nSprmsLen = nLen;
    }
    BYTE* pSprms1 = pSprms0;
    pStStrm->Seek( nPosFc );
    pStStrm->Read( pSprms0, nLen );

    while ( nLen > 0 )
    {
        USHORT nL1 = pIo->ImportSprm( pSprms1, nLen );
        nLen -= nL1;
        pSprms1 += nL1;
    }
    delete[]( pSprms0 );
    pParaSprms = 0;
    nSprmsLen = 0;
}


short WW8RStyle::ImportUPX( short nLen, BOOL bPAP )
{
    INT16 cbUPX;

    if( 0 < nLen ) // Empty ?
    {
        nLen -= WW8SkipOdd( pStStrm );

        *pStStrm >> cbUPX;

        nLen-=  2;

        if ( cbUPX > nLen )
            cbUPX = nLen;       // !cbUPX auf nLen verkleinert!

        if( (1 < cbUPX) || ( (0 < cbUPX) && !bPAP ) )
        {
            if( bPAP )
            {
                UINT16 id;
                *pStStrm >> id;

                cbUPX-=  2;
                nLen-=  2;
            }

            if( 0 < cbUPX )
            {
                ULONG nPos = pStStrm->Tell();   // falls etwas falsch interpretiert
                                                // wird, gehts danach wieder richtig
                ImportSprms( nPos, cbUPX, bPAP );

                if ( pStStrm->Tell() != nPos + cbUPX )
                    pStStrm->Seek( nPos+cbUPX );

                nLen -= cbUPX;
            }
        }
    }
    return nLen;
}


void WW8RStyle::ImportGrupx( short nLen, BOOL bPara )
{
    if( nLen <= 0 )
        return;

//  if( rFib.nVersion < 8 )
        nLen -= WW8SkipOdd( pStStrm );

    if( bPara ) nLen = ImportUPX( nLen, TRUE ); // Grupx.Papx
    ImportUPX( nLen, FALSE );                   // Grupx.Chpx
}

WW8RStyle::WW8RStyle( WW8Fib& rFib, SwWW8ImplReader* pI )
    : WW8Style( *pI->pTableStream, rFib ), pIo( pI ),
    pStStrm( pI->pTableStream ),
nWwNumLevel( 0 ), pStyRule( 0 )
{
    pIo->pCollA = new SwWW8StyInf[ cstd ]; // Style-UEbersetzung WW->SW
    pIo->nColls = cstd;
}


void WW8RStyle::Set1StyleDefaults()
{
    if( !bFontChanged )                         // Style hat keinen Font ?
    {
        short nWwDefaultFont = ftcStandardChpStsh;
        pIo->SetNewFontAttr( nWwDefaultFont );  // ... dann hart 'reinsetzen
    }
    if( pIo->bNoAttrImport )
        return;
    if( !bFSizeChanged )
    {                                           // Style hat keine FontSize ?
        SvxFontHeightItem aSz( 200 );           // WW-Default: 10pt
        pIo->pAktColl->SetAttr( aSz );
    }
    if( pIo->pWDop->fWidowControl && !bWidowsChanged )  // Widows ?
    {
        pIo->pAktColl->SetAttr( SvxWidowsItem( 2 ) );
        pIo->pAktColl->SetAttr( SvxOrphansItem( 2 ) );
    }
}

//-----------------------------------------
//      Zeichenvorlagen
//-----------------------------------------
SwCharFmt* WW8RStyle::SearchCharFmt( const String& rName )
{
    USHORT n;
                            // Suche zuerst in den Doc-Styles
    for( n = pIo->rDoc.GetCharFmts()->Count(); n > 0; )
        if( (*pIo->rDoc.GetCharFmts())[ --n ]->GetName().Equals( rName ) )
            return (*pIo->rDoc.GetCharFmts())[ n ];

                    // Collection noch nicht gefunden, vielleicht im Pool ?
    n = pIo->rDoc.GetPoolId( rName , GET_POOLID_CHRFMT );
    if ( n != USHRT_MAX )       // gefunden oder Standard
        return pIo->rDoc.GetCharFmtFromPool( n );

    return 0;
}

SwCharFmt* WW8RStyle::MakeNewCharFmt( WW8_STD* pStd, const String& rName )
{
    String aName( rName );
    SwCharFmt* pFmt = 0;

    if( pStd->sti != STI_USER           // eingebauter Style, den wir nicht kennen ?
        || SearchCharFmt( aName ) ){    // oder Namen gibts schon ?

        if( !aName.EqualsAscii( "WW-", 0, 3 ) ) // noch kein "WW-"
            aName.InsertAscii( "WW-", 0 );      // dann aender ihn

        if( SearchCharFmt( aName ) )                // Namen gibt's immer noch ?
            for( USHORT n = 1; n < 1000; n++ ){     // dann bastel neuen
                String aName1( aName );
                aName1 += String::CreateFromInt32( n );
                if( ( pFmt = SearchCharFmt( aName1 ) ) == 0 ){
                    aName = aName1;
                    break;                          // unbenutzten Namen gefunden
                }
            }
    }
    if( !pFmt )   // unbenutzter Collection-Name gefunden, erzeuge neue Coll
        pFmt = pIo->rDoc.MakeCharFmt( aName,
            ( SwCharFmt*)pIo->rDoc.GetDfltCharFmt() ); // const Wegcasten

    return pFmt;
}


SwCharFmt* WW8RStyle::MakeOrGetCharFmt( BOOL* pbStyExist, WW8_STD* pStd, const String& rName )
{
#define RES_NO RES_POOLCHR_END

    static USHORT __READONLY_DATA aArr1[]={
        RES_POOLCHR_FOOTNOTE, 0, RES_POOLCHR_LINENUM,
        RES_POOLCHR_PAGENO, RES_POOLCHR_ENDNOTE };

    static USHORT __READONLY_DATA aArr2[]={
        RES_POOLCHR_INET_NORMAL, RES_POOLCHR_INET_VISIT,
        RES_POOLCHR_HTML_STRONG, RES_POOLCHR_HTML_EMPHASIS };

    if(     pIo->bNew               // Einfuegen: immer neue Styles generieren
        && !( pIo->nIniFlags & WW8FL_NO_DEFSTYLES ) )   // nicht abgeschaltet
    {
        SwCharFmt* pFmt = 0;

        // Default-Style bekannt ?
        short nIdx = pStd->sti - 38;
        if(    nIdx >= 0 && nIdx < 5
            && aArr1[nIdx]!=0 )
            pFmt = pIo->rDoc.GetCharFmtFromPool( aArr1[ nIdx ] );
        else
        {
            nIdx = pStd->sti - 85;
            if(    nIdx >= 0
                && nIdx <  4 )
                pFmt = pIo->rDoc.GetCharFmtFromPool( aArr2[ nIdx ] );
        }
        if( pFmt )
        {
            *pbStyExist = TRUE;
            return pFmt;
        }
    }
    {
        *pbStyExist = FALSE;
        String aName( rName );
        USHORT nPos = aName.Search( ',' );
        if( nPos )  // mehrere Namen mit Komma getrennt gibts im SW nicht
            aName.Erase( nPos );
        return MakeNewCharFmt( pStd, aName );   // nicht gefunden
    }
}

//-----------------------------------------
//      Absatzvorlagen
//-----------------------------------------

SwTxtFmtColl* WW8RStyle::SearchFmtColl( const String& rName )
{
                            // Suche zuerst in den Doc-Styles
    SwTxtFmtColl* pColl = pIo->rDoc.FindTxtFmtCollByName( rName );
    if( !pColl )
    {
                    // Collection noch nicht gefunden, vielleicht im Pool ?
        USHORT n = pIo->rDoc.GetPoolId( rName , GET_POOLID_TXTCOLL );
        if ( n != USHRT_MAX )       // gefunden oder Standard
            pColl = pIo->rDoc.GetTxtCollFromPool( n );
    }
    return pColl;
}

SwTxtFmtColl* WW8RStyle::MakeNewFmtColl( WW8_STD* pStd, const String& rName )
{
    String aName( rName );
    SwTxtFmtColl* pColl = 0;

    if( pStd->sti != STI_USER           // eingebauter Style, den wir nicht kennen
        || SearchFmtColl( aName ) ){    // oder Namen gibts schon ?

        if( !aName.EqualsIgnoreCaseAscii( "WW-", 0, 3 ) )   // noch kein "WW-"
            aName.Insert( WW8_ASCII2STR( "WW-" ), 0 );  // dann AEnder ihn

        if( SearchFmtColl( aName ) )                    // Namen gibt's immer noch ?
            for( USHORT n = 1; n < 1000; n++ ){     // dann bastel neuen
                String aName1( aName );
                aName += String::CreateFromInt32( n );
                if( ( pColl = SearchFmtColl( aName1 ) ) == 0 ){
                    aName = aName1;
                    break;                          // unbenutzten Namen gefunden
                }
            }
    }
    if( !pColl )   // unbenutzter Collection-Name gefunden, erzeuge neue Coll
        pColl = pIo->rDoc.MakeTxtFmtColl( aName,
            ( SwTxtFmtColl*)pIo->rDoc.GetDfltTxtFmtColl() ); // const Wegcasten

    return pColl;
}

SwTxtFmtColl* WW8RStyle::MakeOrGetFmtColl( BOOL* pbStyExist, WW8_STD* pStd, const String& rName )
{
#define RES_NONE RES_POOLCOLL_DOC_END

    static const RES_POOL_COLLFMT_TYPE aArr[]={
        RES_POOLCOLL_STANDARD, RES_POOLCOLL_HEADLINE1, RES_POOLCOLL_HEADLINE2,                                  // Ueberschrift 2
        RES_POOLCOLL_HEADLINE3, RES_POOLCOLL_HEADLINE4, RES_POOLCOLL_HEADLINE5,
        RES_POOLCOLL_HEADLINE6, RES_POOLCOLL_HEADLINE7, RES_POOLCOLL_HEADLINE8,
        RES_POOLCOLL_HEADLINE9,

        RES_POOLCOLL_TOX_IDX1, RES_POOLCOLL_TOX_IDX2, RES_POOLCOLL_TOX_IDX3,
        RES_NONE, RES_NONE, RES_NONE, RES_NONE, RES_NONE, RES_NONE,
        RES_POOLCOLL_TOX_CNTNT1,

        RES_POOLCOLL_TOX_CNTNT2, RES_POOLCOLL_TOX_CNTNT3, RES_POOLCOLL_TOX_CNTNT4,
        RES_POOLCOLL_TOX_CNTNT5, RES_POOLCOLL_TOX_CNTNT6, RES_POOLCOLL_TOX_CNTNT7,
        RES_POOLCOLL_TOX_CNTNT8, RES_POOLCOLL_TOX_CNTNT9,
        RES_NONE, RES_POOLCOLL_FOOTNOTE,

        RES_NONE, RES_POOLCOLL_HEADER, RES_POOLCOLL_FOOTER, RES_POOLCOLL_TOX_IDXH,
        RES_NONE, RES_NONE, RES_POOLCOLL_JAKETADRESS, RES_POOLCOLL_SENDADRESS,
        RES_NONE, RES_NONE,

        RES_NONE, RES_NONE, RES_NONE, RES_POOLCOLL_ENDNOTE, RES_NONE, RES_NONE, RES_NONE,
        RES_POOLCOLL_LISTS_BEGIN, RES_NONE, RES_NONE,

        RES_NONE, RES_NONE, RES_NONE, RES_NONE, RES_NONE,
        RES_NONE, RES_NONE, RES_NONE, RES_NONE, RES_NONE,

        RES_NONE,RES_NONE, RES_POOLCOLL_DOC_TITEL, RES_NONE, RES_POOLCOLL_SIGNATURE, RES_NONE,
        RES_POOLCOLL_TEXT, RES_POOLCOLL_TEXT_MOVE, RES_NONE, RES_NONE,

        RES_NONE, RES_NONE, RES_NONE, RES_NONE, RES_POOLCOLL_DOC_SUBTITEL };


    ASSERT( ( sizeof( aArr ) / sizeof( RES_POOL_COLLFMT_TYPE ) == 75 ),
            "Style-UEbersetzungstabelle hat falsche Groesse" );

#if 1
    if( pStd->sti < sizeof( aArr ) / sizeof( RES_POOL_COLLFMT_TYPE )
        && aArr[pStd->sti]!=RES_NONE    // Default-Style bekannt
        && !( pIo->nIniFlags & WW8FL_NO_DEFSTYLES ) ){ // nicht abgeschaltet

        SwTxtFmtColl* pCol = pIo->rDoc.GetTxtCollFromPool( aArr[pStd->sti] );
        if( pCol ){
            *pbStyExist = TRUE;
            return pCol;
        }
    }
    {
        String aName( rName );
        USHORT nPos = aName.Search( ',' );
        if( nPos )  // mehrere Namen mit Komma getrennt gibts im SW nicht
            aName.Erase( nPos );
        SwTxtFmtColl* pCol = SearchFmtColl( aName );
        if( pCol ){
            *pbStyExist = TRUE;
            return pCol;
        }
        *pbStyExist = FALSE;
        return MakeNewFmtColl( pStd, aName );   // nicht gefunden
    }
#else // 1
    if( pIo->bNew                   // Einfuegen: immer neue Styles generieren
        && pStd->sti < sizeof( aArr ) / sizeof( RES_POOL_COLLFMT_TYPE )
        && aArr[pStd->sti]!=RES_NONE    // Default-Style bekannt
        && !( pIo->nIniFlags & WW8FL_NO_DEFSTYLES ) ){ // nicht abgeschaltet

        SwTxtFmtColl* pCol = pIo->rDoc.GetTxtCollFromPool( aArr[pStd->sti] );
        if( pCol ){
            *pbStyExist = TRUE;
            return pCol;
        }
    }
    {
        *pbStyExist = FALSE;
        String aName( rName );
        USHORT nPos = aName.Search( ',' );
        if( nPos )  // mehrere Namen mit Komma getrennt gibts im SW nicht
            aName.Erase( nPos );
        return MakeNewFmtColl( pStd, aName );   // nicht gefunden
    }
#endif // !1
}

void WW8RStyle::Import1Style( USHORT nNr )
{
    SwWW8StyInf* pSI = &pIo->pCollA[nNr];

    if( pSI->bImported || !pSI->bValid )
        return;

    pSI->bImported = TRUE;                      // jetzt schon Flag setzen
                                                                        // verhindert endlose Rekursion
    if( pSI->nBase < cstd                           // gueltig und nicht NIL
        && !pIo->pCollA[pSI->nBase].bImported ) // und noch nicht Importiert
        Import1Style( pSI->nBase );

    pStStrm->Seek( pSI->nFilePos );

    short nSkip, cbStd;
    String sName;

    WW8_STD* pStd = Read1Style( nSkip, &sName, &cbStd );// lies Style

    if( pStd )
        pSI->SetOrgWWIdent( sName, pStd->sti );

    if(    !pStd
        || (0 == sName.Len())                       // no Name or unused Slot
        || ((1 != pStd->sgc) && (2 != pStd->sgc)) ) // unknown Style
    {
        pStStrm->SeekRel( nSkip );
        return;
    }
                                                // echter Para- oder Char-Style
    SwFmt* pColl;
    BOOL bStyExist;
    if( pStd->sgc == 1 )                // Para-Style
        pColl = MakeOrGetFmtColl( &bStyExist, pStd, sName );
    else                                // Char-Style
        pColl = MakeOrGetCharFmt( &bStyExist, pStd, sName );

    BOOL bImport = !bStyExist || pIo->bNew; // Inhalte Importieren ?
    BOOL bOldNoImp = pIo->bNoAttrImport;
    pSI->bImportSkipped = !bImport;

    if( !bImport ){
        pIo->bNoAttrImport = TRUE;
    }
    else
    {
        if( bStyExist )
            pColl->ResetAllAttr();
        pColl->SetAuto( FALSE );            // nach Empfehlung JP
    }                                   // macht die UI aber anders
    pIo->pAktColl = pColl;
    pSI->pFmt = pColl;                  // UEbersetzung WW->SW merken
    pSI->bImportSkipped = !bImport;

    // Setze Based on
    USHORT j = pSI->nBase;
    if(     j != nNr                                // sinnvoller Index ?
        &&  j < cstd )
    {
        SwWW8StyInf* pj = &pIo->pCollA[j];
        if (
                    pSI->pFmt && pj->pFmt           // Beide Formate ok ?
                &&  pSI->bColl == pj->bColl )       // beides gleicher Typ ?
        {
            pSI->pFmt->SetDerivedFrom( pj->pFmt );  // ok, Based on eintragen
            pSI->eFontSrcCharSet = pj->eFontSrcCharSet; // CharSet als Default
        }
    }
    else if( pIo->bNew && bStyExist )
    {
        if( pStd->sgc == 1 )
            pSI->pFmt->SetDerivedFrom( pIo->pStandardFmtColl );
        else
            pSI->pFmt->SetDerivedFrom( pIo->rDoc.GetDfltCharFmt() );
    }

    pSI->nFollow = pStd->istdNext;              // Follow merken

    long nPos = pStStrm->Tell();        // falls etwas falsch interpretiert
                                    // wird, gehts danach wieder richtig

    pStyRule = 0;                   // falls noetig, neu anlegen
    bFontChanged = bFSizeChanged = bWidowsChanged = FALSE;
    pIo->SetNAktColl( nNr );
    pIo->bStyNormal = nNr == 0;

    if( pStd && ( pStd->sgc == 1 || pStd->sgc == 2 ) ){
        ImportGrupx( nSkip, pStd->sgc == 1 ); // Import des Style-Inhalts
                        // Alle moeglichen Attribut-Flags zuruecksetzen,
                        // da es in Styles keine Attr-Enden gibt
        pIo->bHasBorder = pIo->bTxtCol = pIo->bShdTxtCol = pIo->bCharShdTxtCol
        = pIo->bSpec = pIo->bObj = pIo->bSymbol = FALSE;
        pIo->nCharFmt = -1;
    }

//  if( pStd && pStd->istdBase == 0xfff     // Style basiert auf Nichts
//      && pStd->sgc == 1 ){                //! Char-Styles funktionieren aus

    if( pStd
        && ( pSI->nBase >= cstd // Style basiert auf Nichts
          || pIo->pCollA[pSI->nBase].bImportSkipped ) // oder Basis ignoriert
        && pStd->sgc == 1 ){                //! Char-Styles funktionieren aus
                                            // unerfindlichen Gruenden nicht
                                            // -> dann evtl. harte WW-Defaults
                                            // reinsetzen
        Set1StyleDefaults();
    }

    pStyRule = 0;                   // zur Sicherheit
    pIo->bStyNormal = FALSE;
    pIo->SetNAktColl( 0 );
    pIo->bNoAttrImport = bOldNoImp;
    // rasch nochmal die Listen-Merk-Felder zuruecksetzen,
    // fuer den Fall dass sie beim einlesen des Styles verwendet wurden
    pIo->nLFOPosition = USHRT_MAX;
    pIo->nListLevel   = nWW8MaxListLevel;

    pStStrm->Seek( nPos+nSkip );

    DELETEZ( pStd );
}


void WW8RStyle::RegisterNumFmts()
{
    for(USHORT i=0; i < cstd; i++)
    {
        SwWW8StyInf* pSI = &pIo->pCollA[ i ];
        if( pSI )
            pIo->RegisterNumFmtOnStyle( *pSI );
    }
}


void WW8RStyle::ScanStyles()        // untersucht Style-Abhaengigkeiten
{                               // und ermittelt die Filepos fuer jeden Style
/*
    WW8_FC nStyleStart = rFib.fcStshf;
    pStStrm->Seek( nStyleStart );
    */
    USHORT i;
    for( i=0; i<cstd; i++ ){
        short nSkip;
        SwWW8StyInf* pSI = &pIo->pCollA[i];

        pSI->nFilePos = pStStrm->Tell();        // merke FilePos
        WW8_STD* pStd = Read1Style( nSkip, 0, 0 );  // read STD
        pSI->bValid   = ( 0 != pStd );
        if( pSI->bValid
            && !(pStd->sgc == 2 && ( pIo->nIniFlags & WW8FL_NO_ZSTYLES ) ) ){
            pSI->nBase = pStd->istdBase;        // merke Basis
            pSI->bColl = ( pStd->sgc == 1 );    // Para-Style
            pSI->bValid = TRUE;
        }
        else
            memset( &pSI , 0, sizeof( &pSI ) );

        delete pStd;
        pStStrm->SeekRel( nSkip );              // ueberlese Namen und Sprms
    }
}

void WW8RStyle::Import()
{
    pIo->pDfltTxtFmtColl  = pIo->rDoc.GetDfltTxtFmtColl();
    pIo->pStandardFmtColl = pIo->rDoc.GetTxtCollFromPool( RES_POOLCOLL_STANDARD );

    if( pIo->nIniFlags & WW8FL_NO_STYLES )
        return;

    ScanStyles();                       // Scanne Based On

    USHORT i;
    for( i=0; i<cstd; i++ ) // Styles importieren
        if( pIo->pCollA[i].bValid )
            Import1Style( i );

    for( i=0; i<cstd; i++ )
    {   // Follow einstellen
        SwWW8StyInf* pi = &pIo->pCollA[i];
        USHORT j = pi->nFollow;
        if( j < cstd )
        {
            SwWW8StyInf* pj = &pIo->pCollA[j];
            if ( j != i                             // sinnvoller Index ?
                 && pi->pFmt                        // Format ok ?
                 && pj->pFmt                        // Derived-Format ok ?
                 && pi->bColl                       // geht nur bei Absatz-Vorlagen (WW)
                 && pj->bColl ){                    // beides gleicher Typ ?
                    ( (SwTxtFmtColl*)pi->pFmt )->SetNextTxtFmtColl(
                     *(SwTxtFmtColl*)pj->pFmt );    // ok, eintragen
            }
        }
    }
// Die Sonderbehandlung zur Setzen der
// Default-Zeichenvorlage "Absatz-Standardschriftart" ( Style-ID 65 ) fehlt
// Sie ist aber defaultmaessig leer ( WW6 dt und US ) und von der
// WW-UI nicht zu veraendern, so dass das nicht stoert.
// Der Mechanismus waere folgender:
//  if( bNew ) rDoc.SetDefault( pDefCharFmt->GetAttrSet() );
//
    // fuer z.B. Tabellen wird ein immer gueltiger Std-Style gebraucht

    if( pIo->pCollA[0].pFmt && pIo->pCollA[0].bColl && pIo->pCollA[0].bValid )
        pIo->pDfltTxtFmtColl = (SwTxtFmtColl*)pIo->pCollA[0].pFmt;
    else
        pIo->pDfltTxtFmtColl = pIo->rDoc.GetDfltTxtFmtColl();


    // set Hyphenation flag on BASIC para-style
    if(    pIo->bNew
        && pIo->pWDop->fAutoHyphen
        && pIo->pStandardFmtColl
        && SFX_ITEM_SET != pIo->pStandardFmtColl->GetItemState(
                                            RES_PARATR_HYPHENZONE, FALSE ) )
    {
        SvxHyphenZoneItem aAttr( TRUE );
        aAttr.GetMinLead()    = 2;
        aAttr.GetMinTrail()   = 2;
        aAttr.GetMaxHyphens() = 0;

        pIo->pStandardFmtColl->SetAttr( aAttr );
    }

    // wir sind jetzt nicht mehr beim Style einlesen:
    pIo->pAktColl = 0;
}


//-----------------------------------------
//      Document Info
//-----------------------------------------

// ReadDocInfo() liegt hier und nicht nicht in wwpar.cxx::LoadDoc1(),
// da hier das noetige sfxcore.hxx bereits includet ist.

void SwWW8ImplReader::ReadDocInfo()
{
    if( pStg )
    {
        SfxDocumentInfo* pNeu;
        if( rDoc.GetpInfo() )                           // soo ein Umstand......
            pNeu = new SfxDocumentInfo( *rDoc.GetpInfo() );
        else
            pNeu = new SfxDocumentInfo();

        pNeu->LoadPropertySet( pStg );  // DocInfo laden
        rDoc.SetInfo( *pNeu );
        delete( pNeu );
    }
}

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ww8/ww8par2.cxx,v 1.1.1.1 2000-09-18 17:14:58 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.80  2000/09/18 16:05:00  willem.vandorp
      OpenOffice header added.

      Revision 1.79  2000/08/17 13:49:28  khz
      #77316# set Default Char Format if no Base Format known

      Revision 1.78  2000/07/28 15:37:27  khz
      #73796# don't delete NumRule from Attr but set it into pDoc

      Revision 1.77  2000/07/27 10:21:36  khz
      #73796# stop ANList when opening next cell in a row and !bAktAND_fNumberAcross

      Revision 1.76  2000/07/25 15:17:45  khz
      #76811# read/write AutoHyphenation flag from/into Document Properties

      Revision 1.75  2000/07/24 12:56:38  jp
      Bug #76561#: convert Bulletchar to unicode

      Revision 1.74  2000/07/11 11:39:06  khz
      #76673# prepare implementation of sprmTDelete and sprmTInsert

      Revision 1.73  2000/07/11 11:30:55  khz
      #76673# prepare implementation of sprmTDelete and sprmTInsert

      Revision 1.72  2000/06/08 16:12:55  khz
      Piece table optimization only when piece table exists ;-)

      Revision 1.71  2000/05/31 12:23:09  khz
      Changes for Unicode

      Revision 1.70  2000/05/25 08:06:48  khz
      Piece Table optimization, Unicode changes, Bugfixes

      Revision 1.69  2000/05/18 10:58:59  jp
      Changes for Unicode

      Revision 1.68  2000/05/16 12:13:04  jp
      ASS_FALSE define removed

      Revision 1.67  2000/05/16 11:06:21  khz
      Unicode code-conversion

      Revision 1.66  2000/05/04 07:40:47  khz
      Task #75379# use new Save() and Restore()

      Revision 1.65  2000/04/17 12:01:32  khz
      Task #74837# prevent from breaking table (in Apo) when Apo-flag is missing

*************************************************************************/




diff --git a/sw/source/filter/ww8/ww8par2.hxx b/sw/source/filter/ww8/ww8par2.hxx
new file mode 100644
index 0000000..542d2e0
--- /dev/null
+++ b/sw/source/filter/ww8/ww8par2.hxx
@@ -0,0 +1,371 @@
/*************************************************************************
 *
 *  $RCSfile: ww8par2.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:58 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _WW8PAR2_HXX
#define _WW8PAR2_HXX

#ifndef SWTYPES_HXX
 #include "swtypes.hxx" // enum RndStdIds
#endif


#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _FMTORNT_HXX //autogen
#include <fmtornt.hxx>
#endif
#ifndef _FMTSRND_HXX //autogen
#include <fmtsrnd.hxx>
#endif

class SwCharFmt;

#ifndef WW8PAR_HXX
#include <ww8par.hxx>   // WW8_BRC5
#endif

#ifndef WW8SCAN_HXX
#include <ww8scan.hxx>  // class WW8Style
#endif

class WW8RStyle;

struct WW8FlyPara
{                       // WinWord-Attribute
                        // Achtung: *Nicht* umsortieren, da Teile mit
                        // memcmp verglichen werden
    BOOL bVer67;
    INT16 nSp26, nSp27;         // rohe Position
    INT16 nSp45, nSp28;         // Breite / Hoehe
    INT16 nSp48, nSp49;         // Raender
    BYTE nSp29;                 // rohe Bindung + Alignment
    BYTE nSp37;                 // Wrap-Mode ( 1 / 2; 0 = no Apo ? )
    WW8_BRC5 brc;               // Umrandung Top, Left, Bottom, Right, Between
    BOOL bBorderLines;          // Umrandungslinien
    BOOL bBorder;               // Umrandungs-/Schatten-Struct vorhanden
    BOOL bDropCap;              // Rahmen als DropCap
    BOOL bGrafApo;              // TRUE: Dieser Rahmen dient allein dazu, die
                                // enthaltene Grafik anders als zeichengebunden
                                // zu positionieren

    WW8FlyPara( BOOL bIsVer67, const WW8FlyPara* pSrc = 0 );
    int operator == ( const WW8FlyPara& rSrc ) const;
    BOOL Read( BYTE* pSprm29, WW8PLCFx_Cp_FKP* pPap );
    BOOL ReadFull( BYTE* pSprm29, SwWW8ImplReader* pIo );
    BOOL Read( BYTE* pSprm29, WW8RStyle* pStyle );
};

struct WW8SwFlyPara
{
    SwFrmFmt* pFlyFmt;

                // 1. Teil: daraus abgeleitete Sw-Attribute
    INT16 nXPos, nYPos;         // Position
    INT16 nLeMgn, nRiMgn;       // Raender
    INT16 nUpMgn, nLoMgn;       // Raender
    INT16 nWidth, nHeight;      // Groesse
    INT16 nNettoWidth;
    INT16 nInnerMgn;            // Rand innen

    SwFrmSize eHeightFix;       // Hoehe Fix oder Min
    RndStdIds eAnchor;          // Bindung
    SwRelationOrient eHRel;     // Seite oder Seitenrand
    SwRelationOrient eVRel;     // Seite oder Seitenrand
    SwVertOrient eVAlign;       // Oben, unten, mittig
    SwHoriOrient eHAlign;       // links, rechts, mittig
    SwSurround eSurround;       // Wrap-Mode

    BYTE nXBind, nYBind;        // relativ zu was gebunden

                // 2.Teil: sich waehrend des Einlesens ergebende AEnderungen
    long nNewNettoWidth;
    SwPosition* pMainTextPos;   // um nach Apo in Haupttext zurueckzukehren
    USHORT nLineSpace;          // LineSpace in tw fuer Graf-Apos
    BOOL bAutoWidth;
    BOOL bToggelPos;


    WW8SwFlyPara( SwPaM& rPaM, SwWW8ImplReader& rIo, WW8FlyPara& rWW,
                  short nPgTop,
                  short nPgLeft,
                  short nPgWidth, INT32 nIniFlyDx, INT32 nIniFlyDy );

    void BoxUpWidth( long nWidth );
    const SwPosition* GetMainTextPos() const    // Fuer PageDesc aus Apo
                { return pMainTextPos; };
};


class SwWW8StyInf
{
    String      sWWStyleName;
    USHORT      nWWStyleId;
public:
    SwFmt*      pFmt;
    WW8FlyPara* pWWFly;
    SwNumRule*  pOutlineNumrule;
    long        nFilePos;
    short       nLeftParaMgn;
    short       nTxtFirstLineOfst;
    USHORT      nBase;
    USHORT      nFollow;
    USHORT      nLFOIndex;
    rtl_TextEncoding eFontSrcCharSet;   // rtl_TextEncoding fuer den Font
    BYTE        nListLevel;
    BYTE        nOutlineLevel;      // falls Gliederungs-Style
    BYTE        n81Flags;           // Fuer Bold, Italic, ...
    BOOL        bValid          :1; // leer oder Valid
    BOOL        bImported       :1; // fuers rekursive Importieren
    BOOL        bColl           :1; // TRUE -> pFmt ist SwTxtFmtColl
    BOOL        bImportSkipped  :1; // nur TRUE bei !bNewDoc && vorh. Style
    BOOL        bHasStyNumRule  :1; // TRUE -> Benannter NumRule in Style

    SwWW8StyInf() :
        sWWStyleName( aEmptyStr ),
        nWWStyleId( 0 ),
        pFmt( 0 ),
        pWWFly( 0 ),
        pOutlineNumrule( 0 ),
        nFilePos( 0 ),
        nLeftParaMgn( 0 ),
        nTxtFirstLineOfst( 0 ),
        nBase( 0 ),
        nFollow( 0 ),
        nLFOIndex( USHRT_MAX ),
        eFontSrcCharSet( 0 ),
        nListLevel( nWW8MaxListLevel ),
        nOutlineLevel( MAXLEVEL ),
        n81Flags( 0 ),
        bValid( FALSE ),
        bImported( FALSE ),
        bColl( FALSE ),
        bImportSkipped( FALSE ),
        bHasStyNumRule( FALSE )
    {}

    ~SwWW8StyInf()
    {
        delete( pWWFly );
    }

    void SetOrgWWIdent( const String& rName, const USHORT nId )
    {
        sWWStyleName = rName;
        nWWStyleId = nId;
    }
    const USHORT GetWWStyleId() const { return nWWStyleId; }
    const String& GetOrgWWName() const
    {
        return sWWStyleName;
    }
};


class WW8RStyle: public WW8Style
{
friend class SwWW8ImplReader;
    SwWW8ImplReader* pIo;   // Parser-Klasse
    SvStream* pStStrm;      // Input-File

    SwNumRule* pStyRule;    // Bullets und Aufzaehlungen in Styles

    BYTE* pParaSprms;           // alle ParaSprms des UPX falls UPX.Papx
    short nSprmsLen;            // Laenge davon

    BYTE nWwNumLevel;           // fuer Bullets und Aufzaehlungen in Styles

    BOOL bFontChanged   : 1;    // Fuer Simulation Default-Font
    BOOL bFSizeChanged  : 1;    // Fuer Simulation Default-FontSize
    BOOL bWidowsChanged : 1;    // Fuer Simulation Default-Widows / Orphans

    void ImportSprms( long nPosFc, short nLen, BOOL bPap );
    void ImportGrupx( short nLen, BOOL bPara );
    short ImportUPX( short nLen, BOOL bPAP );


    SwCharFmt* SearchCharFmt( const String& rName );
    SwCharFmt* MakeNewCharFmt( WW8_STD* pStd, const String& rName );
    SwCharFmt* MakeOrGetCharFmt( BOOL* pbStyExist, WW8_STD* pStd, const String& rName );

    SwTxtFmtColl* SearchFmtColl( const String& rName );
    SwTxtFmtColl* MakeNewFmtColl( WW8_STD* pStd, const String& rName );
    SwTxtFmtColl* MakeOrGetFmtColl( BOOL* pbStyExist, WW8_STD* pStd, const String& rName );

    void Set1StyleDefaults();
    void Import1Style( USHORT nNr );
    void ScanStyles();
public:
    WW8RStyle( WW8Fib& rFib, SwWW8ImplReader* pI );
    void Import();
    void RegisterNumFmts();
    BYTE* HasParaSprm( USHORT nId ) const;
};

class WW8FlySet: public SfxItemSet
{
public:
    WW8FlySet( SwWW8ImplReader& rReader, /*const*/ WW8FlyPara* pFW,
              /*const*/ WW8SwFlyPara* pFS, BOOL bGraf );
    WW8FlySet( SwWW8ImplReader& rReader, const SwPaM* pPaM,
              const WW8_PIC& rPic, long nWidth, long nHeight );
};

enum WW8LvlType { WW8_None, WW8_Outline, WW8_Numbering, WW8_Sequence, WW8_Pause };

inline WW8LvlType GetNumType( BYTE nWwLevelNo )
{
    WW8LvlType nRet = WW8_None;
    if( nWwLevelNo == 12 )
        nRet = WW8_Pause;
    else if( nWwLevelNo == 10 )
        nRet = WW8_Numbering;
    else if( nWwLevelNo == 11 )
        nRet = WW8_Sequence;
    else if( nWwLevelNo > 0 && nWwLevelNo <= 9 )
        nRet = WW8_Outline;
    return nRet;
}

#define STI_USER 0xffe

/*************************************************************************
      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ww8/ww8par2.hxx,v 1.1.1.1 2000-09-18 17:14:58 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.22  2000/09/18 16:05:00  willem.vandorp
      OpenOffice header added.

      Revision 1.21  2000/05/16 12:03:56  jp
      Changes for unicode

      Revision 1.20  2000/05/16 11:14:53  khz
      Unicode code-conversion

      Revision 1.19  2000/04/12 11:06:17  khz
      Task #74260# import FLY_PAGE-frames in Header/Footer as FLY_AT_CNTNT

      Revision 1.18  1999/12/09 16:46:32  khz
      Task #69180# allow Tabs if right of 1st-line-start OR right of paragraph margin

      Revision 1.17  1999/12/09 14:52:30  khz
      Task #67145# Don't set NumRule if OutlineNumrule is set on Style

      Revision 1.16  1999/12/01 14:35:48  khz
      Task #68488# Graphics in Sections with more than one Column

      Revision 1.15  1999/11/05 17:04:13  khz
      import new TOX_CONTENT and TOX_INDEX features (4)

      Revision 1.14  1999/11/05 10:22:15  khz
      import new TOX_CONTENT and TOX_INDEX features (3)

      Revision 1.13  1999/11/02 15:59:42  khz
      import new TOX_CONTENT and TOX_INDEX features (2)

      Revision 1.12  1999/04/28 21:03:30  KHZ
      Task #65245# Breite eines Rahmens bei WW \'automatisch\' muss PRTAREA sein


      Rev 1.11   28 Apr 1999 23:03:30   KHZ
   Task #65245# Breite eines Rahmens bei WW 'automatisch' muss PRTAREA sein

      Rev 1.10   28 Jan 1999 17:10:42   KHZ
   Task #60715# in SdrTextObj verankerte Grafiken und OLEs (4)

      Rev 1.9   25 Jan 1999 10:24:58   KHZ
   Task #60715# in Textobjekt verankerte Grafik als Grafik importieren

      Rev 1.8   08 Dec 1998 18:26:52   KHZ
   Task #59580# TOC-Import

      Rev 1.7   04 Dec 1998 17:56:40   JP
   Bug #59619#: falls ein Rahmen eine Umrandung hat, darf der Absatz keine bekommen

      Rev 1.6   19 Nov 1998 22:34:46   JP
   Task #59476#: Umstellungen fuers korrekte lesen von Umrandungen/Schatten

      Rev 1.5   15 Sep 1998 12:58:24   HJS
   '#56161#

      Rev 1.4   28 Jul 1998 11:02:06   KHZ
   Task #52607# nummerierte Listen (Teil 1)

      Rev 1.3   14 Jul 1998 16:33:04   KHZ
   Task #52607# Absatz- und Zeichen-Styles

      Rev 1.2   30 Jun 1998 21:33:24   KHZ
   Header/Footer/Footnotes weitgehend ok

      Rev 1.1   16 Jun 1998 18:34:56   KHZ
   DaSi-Stand

      Rev 1.0   16 Jun 1998 10:57:16   KHZ
   Initial revision.

*************************************************************************/
#endif


diff --git a/sw/source/filter/ww8/ww8par3.cxx b/sw/source/filter/ww8/ww8par3.cxx
new file mode 100644
index 0000000..28de294
--- /dev/null
+++ b/sw/source/filter/ww8/ww8par3.cxx
@@ -0,0 +1,2191 @@
/*************************************************************************
 *
 *  $RCSfile: ww8par3.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:58 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PCH
#include "filt_pch.hxx"
#endif


#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _COM_SUN_STAR_FORM_XFORMSSUPPLIER_HPP_
#include <com/sun/star/form/XFormsSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_XFORM_HPP_
#include <com/sun/star/form/XForm.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_XIMAGEPRODUCERSUPPLIER_HPP_
#include <com/sun/star/form/XImageProducerSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_XFORMCONTROLLER_HPP_
#include <com/sun/star/form/XFormController.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_XFORMCOMPONENT_HPP_
#include <com/sun/star/form/XFormComponent.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_XFORMCONTROLLERLISTENER_HPP_
#include <com/sun/star/form/XFormControllerListener.hpp>
#endif
#ifndef _COM_SUN_STAR_FRAME_XSTORABLE_HPP_
#include <com/sun/star/frame/XStorable.hpp>
#endif
#ifndef _COM_SUN_STAR_FRAME_XMODEL_HPP_
#include <com/sun/star/frame/XModel.hpp>
#endif
#ifndef _COM_SUN_STAR_DRAWING_XCONNECTABLESHAPE_HPP_
#include <com/sun/star/drawing/XConnectableShape.hpp>
#endif
#ifndef _COM_SUN_STAR_DRAWING_XCONNECTORSHAPE_HPP_
#include <com/sun/star/drawing/XConnectorShape.hpp>
#endif
#ifndef _COM_SUN_STAR_DRAWING_XSHAPE_HPP_
#include <com/sun/star/drawing/XShape.hpp>
#endif
#ifndef _COM_SUN_STAR_DRAWING_XCONTROLSHAPE_HPP_
#include <com/sun/star/drawing/XControlShape.hpp>
#endif
#ifndef _COM_SUN_STAR_DRAWING_XSHAPEALIGNER_HPP_
#include <com/sun/star/drawing/XShapeAligner.hpp>
#endif
#ifndef _COM_SUN_STAR_DRAWING_XSHAPEGROUP_HPP_
#include <com/sun/star/drawing/XShapeGroup.hpp>
#endif
#ifndef _COM_SUN_STAR_DRAWING_XSHAPEDESCRIPTOR_HPP_
#include <com/sun/star/drawing/XShapeDescriptor.hpp>
#endif
#ifndef _COM_SUN_STAR_DRAWING_XUNIVERSALSHAPEDESCRIPTOR_HPP_
#include <com/sun/star/drawing/XUniversalShapeDescriptor.hpp>
#endif
#ifndef _COM_SUN_STAR_DRAWING_XSHAPEMIRROR_HPP_
#include <com/sun/star/drawing/XShapeMirror.hpp>
#endif
#ifndef _COM_SUN_STAR_DRAWING_XSHAPEARRANGER_HPP_
#include <com/sun/star/drawing/XShapeArranger.hpp>
#endif
#ifndef _COM_SUN_STAR_DRAWING_XDRAWPAGE_HPP_
#include <com/sun/star/drawing/XDrawPage.hpp>
#endif
//#ifndef _COM_SUN_STAR_DRAWING_XSHAPEBINDER_HPP_
//#include <com/sun/star/drawing/XShapeBinder.hpp>
//#endif
#ifndef _COM_SUN_STAR_DRAWING_XSHAPES_HPP_
#include <com/sun/star/drawing/XShapes.hpp>
#endif
//#ifndef _COM_SUN_STAR_DRAWING_XSHAPEGROUPER_HPP_
//#include <com/sun/star/drawing/XShapeGrouper.hpp>
//#endif
//#ifndef _COM_SUN_STAR_DRAWING_XSHAPECOMBINER_HPP_
//#include <com/sun/star/drawing/XShapeCombiner.hpp>
//#endif
#ifndef _COM_SUN_STAR_DRAWING_XDRAWPAGESUPPLIER_HPP_
#include <com/sun/star/drawing/XDrawPageSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_LANG_XMULTISERVICEFACTORY_HPP_
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#endif
#ifndef _COM_SUN_STAR_LANG_XSINGLESERVICEFACTORY_HPP_
#include <com/sun/star/lang/XSingleServiceFactory.hpp>
#endif
//#ifndef _COM_SUN_STAR_LOADER_XIMPLEMENTATIONLOADER_HPP_
//#include <com/sun/star/loader/XImplementationLoader.hpp>
//#endif
//#ifndef _COM_SUN_STAR_LOADER_CANNOTACTIVATEFACTORYEXCEPTION_HPP_
//#include <com/sun/star/loader/CannotActivateFactoryException.hpp>
//#endif
#ifndef _COM_SUN_STAR_CONTAINER_XINDEXCONTAINER_HPP_
#include <com/sun/star/container/XIndexContainer.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_VERTORIENTATION_HPP_
#include <com/sun/star/text/VertOrientation.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_TEXTCONTENTANCHORTYPE_HPP_
#include <com/sun/star/text/TextContentAnchorType.hpp>
#endif

#ifndef _SFXITEMITER_HXX //autogen
#include <svtools/itemiter.hxx>
#endif

#ifndef _SVX_FONTITEM_HXX
#include <svx/fontitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif


#ifndef _SVX_FHGTITEM_HXX
#include <svx/fhgtitem.hxx>
#endif
#ifndef _SVX_COLRITEM_HXX
#include <svx/colritem.hxx>
#endif
#ifndef _SVX_WGHTITEM_HXX
#include <svx/wghtitem.hxx>
#endif
#ifndef _SVX_CRSDITEM_HXX
#include <svx/crsditem.hxx>
#endif
#ifndef _SVX_UDLNITEM_HXX
#include <svx/udlnitem.hxx>
#endif
#ifndef _SVX_POSTITEM_HXX
#include <svx/postitem.hxx>
#endif

#ifndef _SV_SVAPP_HXX
#include <vcl/svapp.hxx>
#endif
#ifndef _SV_WRKWIN_HXX
#include <vcl/wrkwin.hxx>
#endif
#ifndef _SV_OUTDEV_HXX
#include <vcl/outdev.hxx>
#endif

/*
#ifndef _TOOLKIT_UNOIFACE_HXX
#include <toolkit/unoiface.hxx>
#endif
*/

#ifndef _TOOLKIT_UNOHLP_HXX
#include <toolkit/helper/vclunohelper.hxx>
#endif

#ifndef _ERRHDL_HXX //autogen
#include <errhdl.hxx>
#endif
#ifndef _UNOOBJ_HXX //autogen
#include <unoobj.hxx>
#endif
#ifndef _DOC_HXX //autogen
#include <doc.hxx>
#endif
#ifndef _DOCARY_HXX
#include <docary.hxx>
#endif
#ifndef _SWDOCSH_HXX //autogen
#include <docsh.hxx>
#endif
#ifndef _NUMRULE_HXX //autogen
#include <numrule.hxx>
#endif
#ifndef _PARATR_HXX //autogen
#include <paratr.hxx>
#endif
#ifndef _CHARATR_HXX //autogen
#include <charatr.hxx>
#endif
#ifndef _CHARFMT_HXX //autogen
#include <charfmt.hxx>
#endif
#ifndef _NDTXT_HXX //autogen
#include <ndtxt.hxx>
#endif

#ifndef _WW8PAR_HXX
#include <ww8par.hxx>
#endif
#ifndef _WW8PAR2_HXX
#include <ww8par2.hxx>  // wg. Listen-Attributen in Styles
#endif

#ifndef _MSOCXIMP_HXX
#include <msocximp.hxx>
#endif

#ifdef __WW8_NEEDS_COPY
void WW8PicShadowToReal(  WW8_PIC_SHADOW*  pPicS,  WW8_PIC*  pPic );
#endif // defined __WW8_NEEDS_COPY

using namespace ::com::sun::star;


//-----------------------------------------
//            UNO-Controls
//-----------------------------------------

#define WW8_DFLT_EDIT_WIDTH 2750
#define WW8_DFLT_EDIT_HEIGHT 500
#define WW8_DFLT_CHECKBOX_WIDTH 320
#define WW8_DFLT_CHECKBOX_HEIGHT 320

static sal_Char sWW8_form[] = "WW-Standard";
static sal_Char sWW8_edit[] = "TextBox";
static sal_Char sWW8_checkbox[] = "CheckBox";



uno::Reference< drawing::XShape> SwWW8ImplReader::InsertControl(
        //const uno::Reference< form::XFormComponent > & rFComp,
        const uno::Reference< form::XFormComponent > & rFComp,
        const awt::Size& rSize,
        BOOL bFloatingCtrl )
{
    return pFormImpl->InsertControl( rFComp, rSize, bFloatingCtrl  );
}


void SwWW8ImplReader::BuildInputField( sal_uInt16 nType, const String& rParam )
{
    if( nIniFlags & WW8FL_NO_VCCONTROLS )
    {
#ifdef DEBUG
        rDoc.Insert( *pPaM, sal_Unicode ('#') );
        static long l;
        l++;
#endif
        return;
    }

    if( !pDrawModel )               // MIB: Braucht man das?
        GrafikCtor();
    if( !pFormImpl )
        pFormImpl = new SwImportControls(rDoc.GetDocShell(),pPaM);

    const uno::Reference< lang::XMultiServiceFactory > & rServiceFactory =
        pFormImpl->GetServiceFactory();
    if(!rServiceFactory.is())
        return;

    String sType;
    switch( (SwWw8ControlType)nType )
    {
    case WW8_CT_CHECKBOX:
        sType.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "CheckBox" ));
        break;
//  case WW8_CT_EDIT:
    default:
        sType.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "TextField" ));
                                // see change in ../html/htmlform.cxx
        break;                  // as of 1999/11/25 11:20:16 made by O.Specht
    }

    String sServiceName( WW8_ASCII2STR( "com.sun.star.form.component." ));
    sServiceName.Append( sType );
    uno::Reference< uno::XInterface >  xCreate = rServiceFactory->createInstance( sServiceName );
    if( !xCreate.is() )
        return;

    uno::Reference< form::XFormComponent > xFComp( xCreate, uno::UNO_QUERY );
    if( !xFComp.is() )
        return;

    com::sun::star::awt::Size aSz;
    String sName;
    sal_uInt16 nControl;
    switch( (SwWw8ControlType)nType )
    {
    case WW8_CT_EDIT:
        aSz.Width = WW8_DFLT_EDIT_WIDTH; // etwas 20 Zeichen
        aSz.Height = WW8_DFLT_EDIT_HEIGHT;
        sName.AssignAscii( sWW8_edit );
        nControl = pFormImpl->GetEditNum();
        break;

    case WW8_CT_CHECKBOX:
        aSz.Width = WW8_DFLT_CHECKBOX_WIDTH;
        aSz.Height = WW8_DFLT_CHECKBOX_HEIGHT;
        sName.AssignAscii( sWW8_checkbox );
        nControl = pFormImpl->GetCheckboxNum();
        break;
    }

    uno::Reference< beans::XPropertySet >  xPropSet( xCreate, uno::UNO_QUERY );

    String sTmp( nControl );
    UniString sWTmp( sTmp );
    sName += sWTmp;
    uno::Any aTmp;
    rtl::OUString uTmp(sName);
    aTmp <<= uTmp;
    xPropSet->setPropertyValue( WW8_ASCII2STR( "Name" ), aTmp );

    InsertControl( xFComp, aSz );
}

//cmc, OCX i.e. word 97 form controls
eF_ResT SwWW8ImplReader::Read_F_OCX( WW8FieldDesc*, String& rStr )
{
    if( bObj && nPicLocFc )
        nObjLocFc = nPicLocFc;
    bEmbeddObj = TRUE;
    return F_TEXT;
}

eF_ResT SwWW8ImplReader::Read_F_FormTextBox( WW8FieldDesc* pF, String& rStr )
{
    if (0x01 == rStr.GetChar( pF->nLCode-1 ))
    {
        WW8FormulaEditBox aFormula(*this);
        if (ImportFormulaControl(aFormula,pF->nSCode+pF->nLCode-1, WW8_CT_EDIT))
        {
            if( !pFormImpl )
                pFormImpl = new SwImportControls(rDoc.GetDocShell(),pPaM);
            if (pFormImpl->InsertFormula(aFormula))
                return F_OK;
        }
    }
    ASSERT(0,"New Formula Code Failed!\n");
    BuildInputField( WW8_CT_EDIT, rStr );
    return F_OK;

}

eF_ResT SwWW8ImplReader::Read_F_FormCheckBox( WW8FieldDesc* pF, String& rStr )
{
    if (0x01 == rStr.GetChar( pF->nLCode-1 ))
    {
        WW8FormulaCheckBox aFormula(*this);
        if (ImportFormulaControl(aFormula,pF->nSCode+pF->nLCode-1,
            WW8_CT_CHECKBOX))
        {
            if( !pFormImpl )
                pFormImpl = new SwImportControls(rDoc.GetDocShell(),pPaM);
            if (pFormImpl->InsertFormula(aFormula))
                return F_OK;
        }
    }
    ASSERT(!this,"New Formula Code Failed!\n");
    BuildInputField( WW8_CT_CHECKBOX, rStr );
    return F_OK;
}

eF_ResT SwWW8ImplReader::Read_F_FormListBox( WW8FieldDesc*, String& rStr )
{
    return F_TAGIGN;
}


void SwWW8ImplReader::DeleteFormImpl()
{
    delete pFormImpl;
    pFormImpl = 0;
}

//----------------------------------------------------------------------------
//          WW8ListManager          oeffentliche Methoden stehen ganz am Ende
//------------------------- ============ --------------- ============ --------



// Hilfs-Deklarationen ///////////////////////////////////////////////////////
//
// Style Id's for each level
typedef sal_uInt16 WW8aIdSty[    nWW8MaxListLevel];
// Zeichenattribute aus GrpprlChpx
typedef SfxItemSet* WW8aISet[nWW8MaxListLevel];
// Zeichen Style Pointer
typedef SwCharFmt* WW8aCFmt[ nWW8MaxListLevel];

struct WW8LST   // nur DIE Eintraege, die WIR benoetigen!
{
    WW8aIdSty   aIdSty;     // Style Id's for each level,
                            //   nIStDNil if no style linked
    sal_uInt32      nIdLst;     // Unique List ID
    sal_uInt32      nTplC;      // Unique template code - Was ist das bloss?
    sal_Bool        bSimpleList:1;  // Flag: Liste hat nur EINEN Level
    sal_Bool        bRestartHdn:1;  // WW6-Kompatibilitaets-Flag:
                                                        //   true if the list should start numbering over
};                                                      //   at the beginning of each section

struct WW8LFO   // nur DIE Eintraege, die WIR benoetigen!
{
    SwNumRule*  pNumRule;   // Parent NumRule
    sal_uInt32      nIdLst;     // Unique List ID
    sal_uInt8       nLfoLvl;    // count of levels whose format is overridden
    sal_Bool        bSimpleList;
};

#define nIStDNil 0x0FFF // d.h. KEIN Style ist an den Level gelinkt
#define nSizeOfLST 0x1C

struct WW8LVL   // nur DIE Eintraege, die WIR benoetigen!
{
    long    nStartAt;       // start at value for this value
    long    nV6DxaSpace;// Ver6-Compatible: min Space between Num anf ::com::sun::star::text::Paragraph
    long    nV6Indent;  // Ver6-Compatible: Breite des Prefix Textes; ggfs. zur
                        // Definition d. Erstzl.einzug nutzen!
    // Absatzattribute aus GrpprlPapx
    sal_uInt16  nDxaLeft;               // linker Einzug
    short   nDxaLeft1;          // Erstzeilen-Einzug

    sal_uInt8   nNFC;               // number format code
    sal_uInt8   aOfsNumsXCH[nWW8MaxListLevel];// Offset der Feldkodes im Num-X-String
    sal_uInt8   nLenGrpprlChpx; // length, in bytes, of the LVL's grpprlChpx
    sal_uInt8   nLenGrpprlPapx; // length, in bytes, of the LVL's grpprlPapx
    sal_uInt8   nAlign: 2;  // alignment (left, right, centered) of the number
    sal_Bool    bLegal: 1;  // egal
    sal_Bool    bNoRest:1;  // egal
    sal_Bool    bV6Prev:1;  // Ver6-Compatible: number will include previous levels
    sal_Bool    bV6PrSp:1;  // Ver6-Compatible: egal
    sal_Bool    bV6:        1;  // falls sal_True, beachte die V6-Compatible Eintraege!
    sal_uInt8   bDummy: 1;  // (macht das Byte voll)

};

struct WW8LFOLVL
{
    long nStartAt;          // start-at value if bFormat==false and bStartAt == true
                                            // (if bFormat==true, the start-at is stored in the LVL)
    sal_uInt8 nLevel;               // the level to be overridden
    // dieses Byte ist _absichtlich_ nicht in das folgende Byte hineingepackt   !!
    // (siehe Kommentar unten bei struct WW8LFOInfo)

    sal_Bool bStartAt :1;       // true if the start-at value is overridden
    sal_Bool bFormat    :1;     // true if the formatting is overriden
};



// in den ListenInfos zu speichernde Daten ///////////////////////////////////
//
struct WW8LSTInfo   // sortiert nach nIdLst (in WW8 verwendete Listen-Id)
{
    WW8aIdSty   aIdSty;          // Style Id's for each level
    WW8aISet    aItemSet;        // Zeichenattribute aus GrpprlChpx
    WW8aCFmt    aCharFmt;        // Zeichen Style Pointer

    SwNumRule*  pNumRule;        // Zeiger auf entsprechende Listenvorlage im Writer
    sal_uInt32      nIdLst;          // WW8Id dieser Liste
    sal_uInt16      nStreamPos;  // Reihenfolge des Auftretens des LST im PLCF LST
                                                     // siehe auch "WW8ListManager::GetLSTByStreamPos()"
    sal_Bool        bSimpleList:1;// Flag, ob diese NumRule nur einen Level verwendet
    sal_Bool        bUsedInDoc :1;// Flag, ob diese NumRule im Doc verwendet wird,
                                                     //   oder beim Reader-Ende geloescht werden sollte

    // Hilfs Ctor, benoetigt innerhalb von WW8ListManager::GetLSTByListId()
    WW8LSTInfo(sal_uInt32 nIdLst_): nIdLst( nIdLst_){}

    // normaler Ctor
    WW8LSTInfo(SwNumRule* pNumRule_, WW8LST& aLST, sal_uInt16 nStreamPos_):
        nIdLst(         aLST.nIdLst         ),
        nStreamPos( nStreamPos_         ),
        pNumRule(       pNumRule_               ),
        bSimpleList(aLST.bSimpleList),
        bUsedInDoc( 0 )
    {
        memcpy( aIdSty, aLST.aIdSty, sizeof( aIdSty   ));
        memset(&aItemSet, 0,  sizeof( aItemSet ));
        memset(&aCharFmt, 0,  sizeof( aCharFmt ));
    }

    sal_Bool operator==( const WW8LSTInfo& rEntry ) const
    {   return nIdLst == rEntry.nIdLst; }
    sal_Bool operator<( const WW8LSTInfo& rEntry ) const
    {   return nIdLst < rEntry.nIdLst;  }
};

SV_IMPL_OP_PTRARR_SORT(WW8LSTInfos, WW8LSTInfo_Ptr)


// in den ListenFormatOverrideInfos zu speichernde Daten /////////////////////
//
struct WW8LFOInfo   // unsortiert, d.h. Reihenfolge genau wie im WW8 Stream
{
    SwNumRule* pNumRule;         // Zeiger auf entsprechende Listenvorlage im Writer
                                                     // entweder: Liste in LSTInfos oder eigene Liste
                                                     // (im Ctor erstmal die aus den LSTInfos merken)

    sal_uInt32  nIdLst;          // WW8-Id der betreffenden Liste
    sal_uInt8   nLfoLvl;             // count of levels whose format is overridden
    // Ja, ich natuerlich koennten wir nLfoLvl (mittels :4) noch in das folgende
    // Byte mit hineinpacken, doch waere das eine ziemliche Fehlerquelle,
    // an dem Tag, wo MS ihr Listenformat auf mehr als 15 Level aufbohren.

    sal_Bool    bOverride   :1;// Flag, ob die NumRule nicht in pLSTInfos steht,
                                                     //   sondern fuer pLFOInfos NEU angelegt wurde
    sal_Bool    bSimpleList:1;// Flag, ob diese NumRule nur einen Level verwendet
    sal_Bool    bUsedInDoc  :1;// Flag, ob diese NumRule im Doc verwendet wird,
                                                     //   oder beim Reader-Ende geloescht werden sollte
    sal_Bool    bLSTbUIDSet :1;// Flag, ob bUsedInDoc in pLSTInfos gesetzt wurde,
                                                     //   und nicht nochmals gesetzt zu werden braucht
    WW8LFOInfo( const WW8LFO& rLFO ):
        nIdLst(         rLFO.nIdLst             ),
        pNumRule(       rLFO.pNumRule           ),// hier bloss die Parent NumRule
        nLfoLvl(        rLFO.nLfoLvl            ),
        bOverride(  rLFO.nLfoLvl ? sal_True : sal_False ),
        bSimpleList(rLFO.bSimpleList            ),
        bUsedInDoc(             0               ),
        bLSTbUIDSet(            0               ){}
};

SV_IMPL_PTRARR( WW8LFOInfos, WW8LFOInfo_Ptr );


// Hilfs-Methoden ////////////////////////////////////////////////////////////
//

// finden der Sprm-Parameter-Daten, falls Sprm im Grpprl enthalten
sal_uInt8* WW8ListManager::GrpprlHasSprm(sal_uInt16 nId, sal_uInt8& rSprms, sal_uInt8 nLen)
{
    sal_uInt8* pSprms = &rSprms;
    for(sal_uInt8 i=0; i<nLen; )
    {
        sal_uInt8 nDelta;
        sal_uInt16 nAktId = WW8GetSprmId(rFib.nVersion, pSprms, &nDelta );
        if( nAktId == nId ) // Sprm gefunden
            return pSprms + 1 + nDelta + WW8SprmDataOfs( nId );
                                                // gib Zeiger auf Daten
        short x = WW8GetSprmSizeBrutto(rFib.nVersion, pSprms, &nAktId );
        i += x;
        pSprms += x;
    }
    return 0;                           // Sprm nicht gefunden
}

// Zugriff ueber die List-Id des LST Eintrags
WW8LSTInfo* WW8ListManager::GetLSTByListId( sal_uInt32 nIdLst ) const
{
    WW8LSTInfo aEntry( nIdLst );
    sal_uInt16 nPos;
    if( !pLSTInfos->Seek_Entry( &aEntry, &nPos ) ) return 0;
    return pLSTInfos->GetObject( nPos );
}

// Zugriff ueber Reihenfolge der LST Eintraege im PLCF LST (Null basiert)
WW8LSTInfo* WW8ListManager::GetLSTByStreamPos( sal_uInt16 nStreamPos ) const
{
    if( !pLSTInfos ) return 0;
    WW8LSTInfo* pEntry;
    for(sal_uInt16 nPos = nLSTInfos; nPos; )
    {
        pEntry = pLSTInfos->GetObject( --nPos );
        if( pEntry && ( pEntry->nStreamPos == nStreamPos )) return pEntry;
    }
    return 0;
}

sal_Bool WW8ListManager::ReadLVL( sal_uInt8 nLevel,
                              SwNumFmt& rNumFmt,
                              SfxItemSet*& rpItemSet,
                              sal_uInt16 nLevelStyle,
                              sal_Bool bSetStartNo )
{
    sal_uInt8           aBits1;
    sal_uInt8           nUpperLevel = 0;    // akt. Anzeigetiefe fuer den Writer
    sal_uInt16          nStartNo    = 0;    // Start-Nr. fuer den Writer
    SvxExtNumType   eType;              // Writer-Num-Typ
    SvxAdjust       eAdj;               // Ausrichtung (Links/rechts/zent.)
    sal_Unicode     cBullet;
    String          aPrefix;
    String          aPostfix;
    WW8LVL          aLVL;
    //
    // 1. LVLF einlesen
    //
    memset(&aLVL, 0, sizeof( aLVL ));
    rSt >> aLVL.nStartAt;
    rSt >> aLVL.nNFC;
    rSt >> aBits1;
    if( 0 != rSt.GetError() ) return sal_False;
    aLVL.nAlign = (aBits1 & 0x03);
    if( aBits1 & 0x10 ) aLVL.bV6Prev    = sal_True;
    if( aBits1 & 0x20 ) aLVL.bV6PrSp    = sal_True;
    if( aBits1 & 0x40 ) aLVL.bV6        = sal_True;
    sal_Bool bLVLOkB = sal_True;
    for(sal_uInt8 nLevelB = 0; nLevelB < nWW8MaxListLevel; nLevelB++)
    {
        rSt >> aLVL.aOfsNumsXCH[ nLevelB ];
        if( 0 != rSt.GetError() )
        {
            bLVLOkB = sal_False;
            break;
        }
        if( !nUpperLevel && !aLVL.aOfsNumsXCH[ nLevelB ] )
        {
            nUpperLevel = nLevelB;
        }
    }
    if( !bLVLOkB ) return sal_False;

    // falls kein NULL als Terminierungs-Char kam,
    // ist die Liste voller Indices, d.h. alle Plaetze sind besetzt,
    // also sind alle Level anzuzeigen
    if( !nUpperLevel )
        nUpperLevel = nWW8MaxListLevel;


    rSt.SeekRel( 1 );
    rSt >> aLVL.nV6DxaSpace;
    rSt >> aLVL.nV6Indent;
    rSt >> aLVL.nLenGrpprlChpx;
    rSt >> aLVL.nLenGrpprlPapx;
    rSt.SeekRel( 2 );
    if( 0 != rSt.GetError()) return sal_False;

    //
    // 2. ggfs. PAPx einlesen und nach Einzug-Werten suchen
    //
    if( aLVL.nLenGrpprlPapx )
    {
        sal_uInt8 aGrpprlPapx[ 255 ];
        if(aLVL.nLenGrpprlPapx != rSt.Read(&aGrpprlPapx,
                                            aLVL.nLenGrpprlPapx )) return sal_False;
        // "sprmPDxaLeft"  pap.dxaLeft;dxa;word;
        sal_uInt8* pSprm;
        if( (pSprm = GrpprlHasSprm(0x840F,aGrpprlPapx[0],
                                    aLVL.nLenGrpprlPapx)) )
        {
            short nDxaLeft = SVBT16ToShort( pSprm );
            aLVL.nDxaLeft =   (0 < nDxaLeft)
                            ? (sal_uInt16)nDxaLeft
                            : (sal_uInt16)(-nDxaLeft);
        }
        // "sprmPDxaLeft1" pap.dxaLeft1;dxa;word;
        if( (pSprm = GrpprlHasSprm(0x8411,aGrpprlPapx[0],
                                    aLVL.nLenGrpprlPapx)) )
            aLVL.nDxaLeft1 = SVBT16ToShort(  pSprm );
    }
    //
    // 3. ggfs. CHPx einlesen und
    //
    if( aLVL.nLenGrpprlChpx )
    {
        sal_uInt8 aGrpprlChpx[ 255 ];
        memset(&aGrpprlChpx, 0, sizeof( aGrpprlChpx ));
        if(aLVL.nLenGrpprlChpx != rSt.Read(&aGrpprlChpx,
                                            aLVL.nLenGrpprlChpx)) return sal_False;
        // neues ItemSet fuer die Zeichenattribute anlegen
        rpItemSet = new SfxItemSet( rDoc.GetAttrPool(), RES_CHRATR_BEGIN,
                                                        RES_CHRATR_END - 1 );
        // Reader-ItemSet-Pointer darauf zeigen lassen
        rReader.SetAktItemSet( rpItemSet );
        // Reader-Style auf den Style dieses Levels setzen
        sal_uInt16 nOldColl = rReader.GetNAktColl();
        sal_uInt16 nNewColl = nLevelStyle;
        if( nIStDNil == nNewColl )
            nNewColl = 0;
        rReader.SetNAktColl( nNewColl );

        // Nun den GrpprlChpx einfach durchnudeln: die Read_xy() Methoden
        // in WW8PAR6.CXX rufen ganz normal ihr NewAttr() oder GetFmtAttr()
        // und diese merken am besetzten Reader-ItemSet-Pointer, dass dieser
        // spezielle ItemSet relevant ist - und nicht ein Stack oder Style!
        short nLen      = aLVL.nLenGrpprlChpx;
        sal_uInt8* pSprms1  = &aGrpprlChpx[0];
        while( 0 < nLen )
        {
            sal_uInt16 nL1 = rReader.ImportSprm( pSprms1, nLen );
            nLen      -= nL1;
            pSprms1   += nL1;
        }
        // Reader-ItemSet-Pointer und Reader-Style zuruecksetzen
        rReader.SetAktItemSet( 0 );
        rReader.SetNAktColl( nOldColl );
    }
    //
    // 4. den Nummerierungsstring einlesen: ergibt Prefix und Postfix
    //
    String sNumString( WW8Read_xstz(rSt, 0, FALSE) );

    //
    // 5. gelesene Werte in Writer Syntax umwandeln
    //
    if( 0 <= aLVL.nStartAt )
        nStartNo = (sal_uInt16)aLVL.nStartAt;

    switch( aLVL.nNFC )
    {
    case   0: eType = SVX_NUM_ARABIC;               break;
    case   1: eType = SVX_NUM_ROMAN_UPPER;          break;
    case   2: eType = SVX_NUM_ROMAN_LOWER;          break;
    case   3: eType = SVX_NUM_CHARS_UPPER_LETTER_N; break;
    case   4: eType = SVX_NUM_CHARS_LOWER_LETTER_N; break;
    case   5: eType = SVX_NUM_ARABIC;               break;  // eigentlich: ORDINAL
    case  23: eType = SVX_NUM_CHAR_SPECIAL;         break;
    case 255: eType = SVX_NUM_NUMBER_NONE;          break;
     default: // nimm default
                eType = SVX_NUM_ARABIC;             break;
    }

    if( SVX_NUM_CHAR_SPECIAL == eType )
    {
        cBullet = sNumString.Len() ? sNumString.GetChar( 0 ) : 0xF0B7;

        if( !cBullet )  // unsave control code?
            cBullet = 0xF0B7;

        aPrefix  = aEmptyStr;
        aPostfix = aEmptyStr;
    }
    else
    {
        if( 1 >= aLVL.aOfsNumsXCH[ 0 ] )
            aPrefix = aEmptyStr;
        else
            aPrefix = sNumString.Copy( 1, aLVL.aOfsNumsXCH[ 0 ]-1 );

        if( nUpperLevel && ( sNumString.Len() > aLVL.aOfsNumsXCH[ nUpperLevel-1 ] ) )
        {
            sNumString += String::CreateFromInt32(
                                    aLVL.aOfsNumsXCH[ nUpperLevel-1 ] );
            aPostfix = sNumString.Copy( 1 );
        }
        else
            aPostfix.Erase();
    }

    switch( aLVL.nAlign )
    {
    case 0: eAdj = SVX_ADJUST_LEFT;     break;
    case 1: eAdj = SVX_ADJUST_CENTER;   break;
    case 2: eAdj = SVX_ADJUST_RIGHT;    break;
    case 3: eAdj = SVX_ADJUST_LEFT;     break;// Writer kann hier kein Block
     default:// undefinierter Wert
                        ASSERT( !this, "Value of aLVL.nAlign is not supported" );
                        // nimm default
                        eAdj = SVX_ADJUST_LEFT;
                        break;
    }
    //
    // 6. entsprechendes NumFmt konfigurieren
    //
    if( bSetStartNo )
        rNumFmt.SetStartValue( nStartNo );
    rNumFmt.eType = eType;
    rNumFmt.SetAdjust( eAdj );

    if( SVX_NUM_CHAR_SPECIAL == eType )
    {
        // erstes Zeichen des Prefix-Textes ist das Bullet
        rNumFmt.SetBulletChar( cBullet );
        // nicht vergessen: unten, nach dem Bauen eventueller Styles
        //                  auch noch SetBulletFont() rufen !!!
    }
    else
    {
        if( aPrefix.Len() )
        // erinnern: Garnix ist default Prefix
            rNumFmt.SetPrefix( aPrefix );
        // erinnern: Punkt ist default  Postfix
        rNumFmt.SetPostfix( aPostfix );
        rNumFmt.SetUpperLevel( nUpperLevel );
    }

    rNumFmt.SetAbsLSpace( aLVL.nDxaLeft );
    if( 0 < aLVL.nDxaLeft1 )
        aLVL.nDxaLeft1 = aLVL.nDxaLeft1 * -1;
    rNumFmt.SetFirstLineOffset( aLVL.nDxaLeft1 );

    return sal_True;
}



void WW8ListManager::AdjustLVL( sal_uInt8       nLevel,
                                SwNumRule& rNumRule,
                                WW8aISet&  rListItemSet,
                                WW8aCFmt&  rCharFmt,
                                sal_Bool&      bNewCharFmtCreated,
                                String     aPrefix )
{
    bNewCharFmtCreated = sal_False;
    SfxItemSet* pThisLevelItemSet;
    SfxItemSet* pLowerLevelItemSet;
    sal_uInt8        nIdenticalItemSetLevel;
    const SfxPoolItem* pItem;

    SwNumFmt aNumFmt  = rNumRule.Get( nLevel );

    pThisLevelItemSet = rListItemSet[ nLevel ];

    if( pThisLevelItemSet && pThisLevelItemSet->Count())
    {
        nIdenticalItemSetLevel = nWW8MaxListLevel;
        SfxItemIter aIter( *pThisLevelItemSet );
        for( sal_uInt8 nLowerLevel = 0; nLowerLevel < nLevel; nLowerLevel++)
        {
            pLowerLevelItemSet = rListItemSet[ nLowerLevel ];
            if(     pLowerLevelItemSet
                && (pLowerLevelItemSet->Count() == pThisLevelItemSet->Count()) )
            {
                nIdenticalItemSetLevel = nLowerLevel;
                sal_uInt16 nWhich = aIter.GetCurItem()->Which();
                while( sal_True )
                {
                    if(  // ggfs. passenden pItem im pLowerLevelItemSet finden
                         (SFX_ITEM_SET != pLowerLevelItemSet->GetItemState(
                                            nWhich, sal_False, &pItem ) )
                        || // virtuellen "!=" Operator anwenden
                         (*pItem != *aIter.GetCurItem() ) )
                    // falls kein Item mit gleicher nWhich gefunden oder Werte
                    // der Items ungleich, Ungleichheit merken und abbrechen!
                    {
                        nIdenticalItemSetLevel = nWW8MaxListLevel;
                        break;
                    }
                    if( aIter.IsAtEnd() )
                        break;
                    nWhich = aIter.NextItem()->Which();
                }

                if( nIdenticalItemSetLevel != nWW8MaxListLevel )
                    break;
            }
        }

        SwCharFmt* pFmt;
        if( nWW8MaxListLevel == nIdenticalItemSetLevel )
        {
            // Style definieren
            String aName( aPrefix.Len() ? aPrefix : rNumRule.GetName() );
            (aName += 'z') += String::CreateFromInt32( nLevel );

            pFmt = rDoc.MakeCharFmt( aName,
                            (SwCharFmt*)rDoc.GetDfltCharFmt() ); // const Wegcasten
            bNewCharFmtCreated = sal_True;
            // Attribute reinsetzen
            pFmt->SetAttr( *pThisLevelItemSet );
        }
        else
        {
            // passenden Style hier anhaengen
            pFmt = rCharFmt[ nIdenticalItemSetLevel ];
        }

        // merken
        rCharFmt[ nLevel ] = pFmt;

        //
        // Style an das NumFormat haengen
        //
        aNumFmt.SetCharFmt( pFmt );
    }
    //
    // ggfs. Bullet Font an das NumFormat haengen
    //
    if( SVX_NUM_CHAR_SPECIAL == aNumFmt.eType )
    {
        SwCharFmt* pFmt = aNumFmt.GetCharFmt();
        Font aFont;
        if( !pFmt )
            aFont = SwNumRule::GetDefBulletFont();
        else
        {
            const SvxFontItem& rFontItem = pFmt->GetFont();
            aFont.SetFamily(    rFontItem.GetFamily()     );
            aFont.SetName(      rFontItem.GetFamilyName() );
            aFont.SetStyleName( rFontItem.GetStyleName()  );
            aFont.SetPitch(     rFontItem.GetPitch()      );
            aFont.SetCharSet(   rFontItem.GetCharSet()    );
        }
        aNumFmt.SetBulletFont( &aFont );
    }
    //
    // und wieder rein in die NumRule
    //
    rNumRule.Set(nLevel, aNumFmt);
}


sal_Bool WW8ListManager::LFOequaltoLST(WW8LFOInfo& rLFOInfo)
{
    sal_Bool bRes = sal_False;
    WW8LSTInfo* pLSTInfo = GetLSTByListId( rLFOInfo.nIdLst );
    if(    pLSTInfo
        && pLSTInfo->pNumRule
        && rLFOInfo.pNumRule
        && (rLFOInfo.nLfoLvl <= (pLSTInfo->bSimpleList ? 1 : nWW8MaxListLevel)))
    {
        const SwNumRule& rLSTRule = *pLSTInfo->pNumRule;
        const SwNumRule& rLFORule = *rLFOInfo.pNumRule;
        bRes = sal_True;
        for(sal_uInt16 nLevel = 0; bRes && (nLevel < rLFOInfo.nLfoLvl); ++nLevel)
        {
            const SwNumFmt& rLSTNumFmt = rLSTRule.Get( nLevel );
            const SwNumFmt& rLFONumFmt = rLFORule.Get( nLevel );
            const SwCharFmt* pLSTCharFmt = rLSTNumFmt.GetCharFmt();
            const SwCharFmt* pLFOCharFmt = rLFONumFmt.GetCharFmt();
            if( pLSTCharFmt && pLFOCharFmt )
            {
                // erst Char-Styles inhaltlich vergleichen,
                // ( siehe: ...\svtools\source\items\itemset.cxx )
                // falls identische Einstellungen, kurz den LFO-Style umhaengen,
                // damit '( rLSTNumFmt == rLFONumFmt )' funktioniert
                if( pLSTCharFmt->GetAttrSet() == pLFOCharFmt->GetAttrSet() )
                    ((SwNumFmt&)rLFONumFmt).SetCharFmt( (SwCharFmt*)pLSTCharFmt );
                else
                {
                    bRes = sal_False;
                    break;
                }
            }
            if(     (    (0 == pLSTCharFmt)
                      != (0 == pLFOCharFmt)
                    )
                ||  !(rLSTNumFmt == rLFONumFmt) )
                bRes = sal_False;
            // vermurksten LFO-Style wieder zuruecksetzen
            if( pLFOCharFmt )
                ((SwNumFmt&)rLFONumFmt).SetCharFmt( (SwCharFmt*)pLFOCharFmt );
        }
    }
    return bRes;
}



// oeffentliche Methoden /////////////////////////////////////////////////////
//
WW8ListManager::WW8ListManager(SvStream& rSt_, SwWW8ImplReader& rReader_)
: pLSTInfos( 0 ),
    pLFOInfos( 0 ),
    nLSTInfos( 0 ), nLFOInfos( 0 ), rSt( rSt_ ),
    rReader( rReader_ ),
    rDoc( rReader.GetDoc() ),
    rFib( rReader.GetFib() )
{
    if(    ( 8 > rFib.nVersion )                    // LST und LFO gibts erst ab WW8
            || ( rFib.fcPlcfLst == rFib.fcPlfLfo )
            || ( !rFib.lcbPlcfLst )
            || ( !rFib.lcbPlfLfo ) ) return;    // offensichtlich keine Listen da

    // Arrays anlegen
    pLSTInfos = new WW8LSTInfos;
    pLFOInfos = new WW8LFOInfos;
    sal_uInt16 nList;
    sal_uInt16 nLfo;
    sal_Bool   bLVLOk;
    sal_uInt8   aBits1;
    String aPrefix;     // wird erstmal zur Bildung des Style Namens genommen
    String aPostfix;

    long nOriginalPos = rSt.Tell();
    //
    // 1. PLCF LST auslesen und die Listen Vorlagen im Writer anlegen
    //
    rSt.Seek( rFib.fcPlcfLst );
    sal_uInt16 nListCount;
    rSt >> nListCount;
    sal_Bool bOk = 0 < nListCount;
    if( bOk )
    {
        WW8LST aLST;
        //
        // 1.1 alle LST einlesen
        //
        for(nList = 0; nList < nListCount; nList++)
        {
            bOk = sal_False;
            memset(&aLST, 0, sizeof( aLST ));
            sal_uInt16 nLevel;
            //
            // 1.1.1 Daten einlesen
            //
            rSt >> aLST.nIdLst;
            rSt >> aLST.nTplC;
            for(nLevel = 0; nLevel < nWW8MaxListLevel; nLevel++)
            {
                rSt >> aLST.aIdSty[ nLevel ];
            }

            rSt >> aBits1;
            rSt.SeekRel( 1 );

            if( 0 != rSt.GetError() ) break;

            if( aBits1 & 0x01 ) aLST.bSimpleList = sal_True;
            if( aBits1 & 0x02 ) aLST.bRestartHdn = sal_True;
            //
            // 1.1.2 neue NumRule ins Doc einsetzen und WW8LSTInfo vermerken
            //
            aPrefix  = WW8_ASCII2STR( "WW8Num" );
            aPrefix += String::CreateFromInt32( nList+1 );
            sal_uInt16 nRul =
                rDoc.MakeNumRule(rDoc.GetUniqueNumRuleName( &aPrefix ));
            SwNumRule* pMyNumRule =
                rDoc.GetNumRuleTbl()[nRul];
            pMyNumRule->SetAutoRule( sal_False );

            WW8LSTInfo* pLSTInfo = new WW8LSTInfo(pMyNumRule, aLST, nList);
            pLSTInfos->Insert( pLSTInfo );
            nLSTInfos++;
            bOk = sal_True;
        }
    }

    if( bOk )
    {
        //
        // 1.2 alle LVL aller aLST einlesen
        //
        sal_uInt8 nLevel;
        for(nList = 0; nList < nLSTInfos; nList++)
        {
            bOk = sal_False;
            WW8LSTInfo* pListInfo = GetLSTByStreamPos( nList );
            if( !pListInfo || !pListInfo->pNumRule ) break;
            SwNumRule& rMyNumRule = *pListInfo->pNumRule;
            //
            // 1.2.1 betreffende(n) LVL(s) fuer diese aLST einlesen
            //
            sal_uInt16 nLvlCount = pListInfo->bSimpleList ? 1 : nWW8MaxListLevel;
            for(nLevel = 0; nLevel < nLvlCount; nLevel++)
            {
                SwNumFmt aNumFmt( rMyNumRule.Get( nLevel ) );
                // LVLF einlesen
                bLVLOk = ReadLVL(   nLevel,
                                    aNumFmt,
                                    pListInfo->aItemSet[ nLevel ],
                                    pListInfo->aIdSty[   nLevel ],
                                    sal_True );
                if( !bLVLOk ) break;
                // und in die rMyNumRule aufnehmen
                rMyNumRule.Set( nLevel, aNumFmt );
            }
            if( !bLVLOk ) break;
            //
            // 1.2.2 die ItemPools mit den CHPx Einstellungen der verschiedenen
            //       Level miteinander vergleichen und ggfs. Style(s) erzeugen
            //
            sal_Bool bDummy;
            for(nLevel = 0; nLevel < nLvlCount; nLevel++)
                AdjustLVL( nLevel, rMyNumRule, pListInfo->aItemSet,
                                               pListInfo->aCharFmt, bDummy );
            //
            // 1.2.3 ItemPools leeren und loeschen
            //
            for(nLevel = 0; nLevel < nLvlCount; nLevel++)
                delete pListInfo->aItemSet[ nLevel ];
            bOk = sal_True;
        }
    }
    if( !bOk )
    {
        // Fehler aufgetreten - LSTInfos abraeumen !!!

        ;
    }
    //
    // 2. PLF LFO auslesen und speichern
    //
    long nLfoCount;
    if( bOk )
    {
        nLfoCount = 0;
        rSt.Seek( rFib.fcPlfLfo );
        rSt >> nLfoCount;
        if( 0 >= nLfoCount ) bOk = sal_False;
    }
    sal_uInt16 nTotalLfoLevels = 0;
    if( bOk )
    {
        WW8LFO aLFO;
        //
        // 2.1 alle LFO einlesen
        //
        for(nLfo = 0; nLfo < nLfoCount; nLfo++)
        {
            bOk = sal_False;
            memset(&aLFO, 0, sizeof( aLFO ));
            rSt >> aLFO.nIdLst;
            rSt.SeekRel( 8 );
            rSt >> aLFO.nLfoLvl;
            rSt.SeekRel( 3 );
            if(    (nWW8MaxListLevel < aLFO.nLfoLvl) // soviele Overrides existieren
                && ( 0 != rSt.GetError() )
              ) break;

            // die Parent NumRule der entsprechenden Liste ermitteln
            WW8LSTInfo* pParentListInfo = GetLSTByListId( aLFO.nIdLst );
            if( !pParentListInfo ) break;
            // hier, im ersten Schritt, erst mal diese NumRule festhalten
            aLFO.pNumRule = pParentListInfo->pNumRule;
            if( !aLFO.pNumRule ) break;
            // hat die Liste mehrere Level ?
            aLFO.bSimpleList = pParentListInfo->bSimpleList;
            // und rein ins Merk-Array mit dem Teil
            WW8LFOInfo* pLFOInfo = new WW8LFOInfo( aLFO );
            pLFOInfos->Insert(pLFOInfo, pLFOInfos->Count());
            nLFOInfos++;
            bOk = sal_True;
        }
    }
    if( bOk )
    {
        //
        // 2.2 fuer alle LFO die zugehoerigen LFOLVL einlesen
        //
        WW8LFOLVL aLFOLVL;
        for(nLfo = 0; nLfo < nLFOInfos; nLfo++)
        {
            bOk = sal_False;
            WW8LFOInfo* pLFOInfo = pLFOInfos->GetObject( nLfo );
            if( !pLFOInfo ) break;
            if( pLFOInfo->bOverride )   // stehen hierfuer ueberhaupt LFOLVL an ?
            {
                WW8LSTInfo* pParentListInfo = GetLSTByListId( pLFOInfo->nIdLst );
                if( !pParentListInfo ) break;
                //
                // 2.2.1 eine neue NumRule fuer diese Liste anlegen
                //
                SwNumRule* pParentNumRule = pLFOInfo->pNumRule;
                if( !pParentNumRule )
                    break;
                // Nauemsprefix aufbauen: fuer NumRule-Name (eventuell)
                // und (falls vorhanden) fuer Style-Name (dann auf jeden Fall)
                aPrefix.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "WW8NumSt" ));
                aPrefix += String::CreateFromInt32( nLfo + 1 );
                // jetzt dem pNumRule seinen RICHTIGEN Wert zuweisen !!!
                // (bis dahin war hier die Parent NumRule vermerkt )
                //
                // Dazu erst mal nachsehen, ob ein Style diesen LFO referenziert:
                if( USHRT_MAX > rReader.StyleUsingLFO( nLfo ) )
                {
                    sal_uInt16 nRul =
                        rDoc.MakeNumRule(rDoc.GetUniqueNumRuleName( &aPrefix ), pParentNumRule);
                    pLFOInfo->pNumRule = rDoc.GetNumRuleTbl()[ nRul ];
                    pLFOInfo->pNumRule->SetAutoRule( sal_False );
                }
                else
                {
                    sal_uInt16 nRul = rDoc.MakeNumRule(
                        rDoc.GetUniqueNumRuleName(), pParentNumRule);
                    pLFOInfo->pNumRule = rDoc.GetNumRuleTbl()[ nRul ];
                    pLFOInfo->pNumRule->SetAutoRule( sal_True );    // = default
                }
                //
                // 2.2.2 alle LFOLVL (und ggfs. LVL) fuer die neue NumRule einlesen
                //
                WW8aISet aItemSet;       // Zeichenattribute aus GrpprlChpx
                WW8aCFmt aCharFmt;       // Zeichen Style Pointer
                memset(&aItemSet, 0,  sizeof( aItemSet ));
                memset(&aCharFmt, 0,  sizeof( aCharFmt ));

                for(sal_uInt8 nLevel = 0; nLevel < pLFOInfo->nLfoLvl; nLevel++)
                {
                    bLVLOk = sal_False;
                    memset(&aLFOLVL, 0, sizeof( aLFOLVL ));

                    //
                    // 2.2.2.0 fuehrende 0xFF ueberspringen
                    //
                    sal_uInt8 n1;
                    do{
                        rSt >> n1;
                        if( 0 != rSt.GetError() ) break;
                    }
                    while( 0xFF == n1 );
                    rSt.SeekRel( -1 );

                    //
                    // 2.2.2.1 den LFOLVL einlesen
                    //
                    rSt >> aLFOLVL.nStartAt;
                    rSt >> aBits1;
                    rSt.SeekRel( 3 );
                    if( 0 != rSt.GetError() ) break;

                    // beachte: Die Witzbolde bei MS quetschen die Override-Level-Nummer
                    //          in vier Bits hinein, damit sie wieder einen Grund haben,
                    //          ihr Dateiformat zu aendern, falls ihnen einfaellt, dass
                    //          sie eigentlich doch gerne bis zu 16 Listen-Level haetten.
                    // Wir tun das *nicht* (siehe Kommentar oben bei "struct WW8LFOInfo")
                    aLFOLVL.nLevel = aBits1 & 0x0F;
                    if(    (0xFF > aBits1)
                        && (0    <= aLFOLVL.nLevel)
                        && (nWW8MaxListLevel > aLFOLVL.nLevel) )
                    {
//                      aLFOLVL.nLevel--;
                        if( aBits1 & 0x10 )
                            aLFOLVL.bStartAt = sal_True;
                        //
                        // 2.2.2.2 eventuell auch den zugehoerigen LVL einlesen
                        //
                        SwNumFmt aNumFmt( pLFOInfo->pNumRule->Get( aLFOLVL.nLevel ) );
                        if( aBits1 & 0x20 )
                        {
                            aLFOLVL.bFormat = sal_True;
                            // falls bStartup sal_True, hier den Startup-Level durch
                            // den im LVL vermerkten ersetzen
                            // LVLF einlesen
                            bLVLOk= ReadLVL(aLFOLVL.nLevel,
                                            aNumFmt,
                                            aItemSet[ nLevel ],
                                            pParentListInfo->aIdSty[   nLevel ],
                                            aLFOLVL.bStartAt );
                            if( !bLVLOk ) break;
                        }
                        else
                        if( aLFOLVL.bStartAt )
                            aNumFmt.SetStartValue( (sal_uInt16)aLFOLVL.nStartAt );
                        //
                        // 2.2.2.3 das NumFmt in die NumRule aufnehmen
                        //
                        pLFOInfo->pNumRule->Set( nLevel, aNumFmt );
                    }
                    bLVLOk = sal_True;
                }
                if( !bLVLOk ) break;
                //
                // 2.2.3 die LVL der neuen NumRule anpassen
                //
                sal_uInt16 aFlagsNewCharFmt = 0;
                sal_Bool bNewCharFmtCreated = sal_False;
                for(nLevel = 0; nLevel < pLFOInfo->nLfoLvl; nLevel++)
                {
                    AdjustLVL( nLevel, *pLFOInfo->pNumRule,
                                        aItemSet,
                                        aCharFmt,
                                        bNewCharFmtCreated,
                                        aPrefix );
                    if( bNewCharFmtCreated )
                        aFlagsNewCharFmt += (1 << nLevel);
                }
                //
                // 2.2.4 ItemPools leeren und loeschen
                //
                for(nLevel = 0; nLevel < pLFOInfo->nLfoLvl; nLevel++)
                    delete aItemSet[ nLevel ];
                //
                // 2.2.5 falls diese NumRule identische Einstellungen und
                //       Formatierungen hat wie ihre Parent-Rule, loeschen
                //       wir sie wieder und nehmen stattdessen die alte.
                //
                if( LFOequaltoLST( *pLFOInfo ) )
                {
                    // 2.2.5.1 ggfs die an den einzelnen Leveln haengenden
                    //         Char-Formate freigeben und loeschen
                    //
                    for(nLevel = 0; nLevel < pLFOInfo->nLfoLvl; nLevel++)
                        if( aFlagsNewCharFmt & (1 << nLevel) )
                            rDoc.DelCharFmt(
                                pLFOInfo->pNumRule->Get( nLevel ).GetCharFmt() );
                    //
                    // 2.2.5.2 jetzt die NumRule freigeben und die alte nehmen
                    //
                    rDoc.DelNumRule( pLFOInfo->pNumRule->GetName() );
                    pLFOInfo->pNumRule = pParentNumRule;
                }
                bOk = sal_True;
            }
        }
    }
    if( !bOk )
    {
        // Fehler aufgetreten - LSTInfos und LFOInfos abraeumen !!!

        ;
    }
    // und schon sind wir fertig!
    rSt.Seek( nOriginalPos );
}


WW8ListManager::~WW8ListManager()
{
/*
    benannte Liste bleiben im Doc drin !!!

    unbenannte Listen werden bei Nicht-Verwendung geloescht

    pLSTInfos und pLFOInfos werden auf jeden Fall destruiert
*/
    sal_uInt16 nInfo;
    if( pLSTInfos )
    {
        for(nInfo = pLSTInfos->Count(); nInfo; )
        {
            WW8LSTInfo& rActInfo = *pLSTInfos->GetObject( --nInfo );
            if(     rActInfo.pNumRule
                    && !rActInfo.bUsedInDoc
                    &&  rActInfo.pNumRule->IsAutoRule()
                )
                rDoc.DelNumRule( rActInfo.pNumRule->GetName() );
        }
        delete pLSTInfos;
    }
    if( pLFOInfos )
    {
        for(nInfo = pLFOInfos->Count(); nInfo; )
        {
            WW8LFOInfo& rActInfo = *pLFOInfos->GetObject( --nInfo );
            if(     rActInfo.bOverride
                    &&  rActInfo.pNumRule
                    && !rActInfo.bUsedInDoc
                    &&  rActInfo.pNumRule->IsAutoRule()
                )
                rDoc.DelNumRule( rActInfo.pNumRule->GetName() );
        }
        delete pLFOInfos;
    }
}



SwNumRule* WW8ListManager::GetNumRuleForActivation(sal_uInt16 nLFOPosition) const
{
    if( nLFOInfos <= nLFOPosition ) return 0;

    WW8LFOInfo* pLFOInfo = pLFOInfos->GetObject( nLFOPosition );

    if( !pLFOInfo )                 return 0;

    pLFOInfo->bUsedInDoc = sal_True;

    if( !pLFOInfo->pNumRule )       return 0;

    if( (!pLFOInfo->bOverride) && (!pLFOInfo->bLSTbUIDSet) )
    {
        WW8LSTInfo* pParentListInfo = GetLSTByListId( pLFOInfo->nIdLst );
        if( pParentListInfo )
            pParentListInfo->bUsedInDoc = sal_True;
        pLFOInfo->bLSTbUIDSet = sal_True;
    }
                                    return pLFOInfo->pNumRule;
}



sal_Bool WW8ListManager::IsSimpleList(sal_uInt16 nLFOPosition) const
{
    if( nLFOInfos <= nLFOPosition ) return sal_False;

    WW8LFOInfo* pLFOInfo = pLFOInfos->GetObject( nLFOPosition );

    if( !pLFOInfo )                 return sal_False;

                                    return pLFOInfo->bSimpleList;
}




//----------------------------------------------------------------------------
//          SwWW8ImplReader:  anhaengen einer Liste an einen Style oder Absatz
//----------------------------------------------------------------------------


sal_Bool SwWW8ImplReader::SetTxtFmtCollAndListLevel(const SwPaM& rRg,
                                                SwWW8StyInf& rStyleInfo,
                                                sal_Bool         bReset)
{
    sal_Bool bRes = sal_True;
    if( rStyleInfo.pFmt && rStyleInfo.bColl )
    {
        bRes = rDoc.SetTxtFmtColl(rRg, (SwTxtFmtColl*)rStyleInfo.pFmt);

        if( !rStyleInfo.pOutlineNumrule )
        {
            SwTxtNode* pTxtNode = pPaM->GetNode()->GetTxtNode();
            ASSERT( pTxtNode, "Kein Text-Node an PaM-Position" );

            if( !IsInvalidOrToBeMergedTabCell() )
                pTxtNode->SwCntntNode::ResetAttr( RES_PARATR_NUMRULE );

            if(    (USHRT_MAX        > rStyleInfo.nLFOIndex )
                && (nWW8MaxListLevel > rStyleInfo.nListLevel) )
                RegisterNumFmtOnTxtNode( rStyleInfo.nLFOIndex,
                                         rStyleInfo.nListLevel, sal_False);
            else
                pTxtNode->UpdateNum( SwNodeNum(NO_NUMBERING) );

            if( rStyleInfo.bHasStyNumRule && pTxtNode )
            {
                pTxtNode->SetNumLSpace( sal_False );
            }
        }
    }
    return bRes;
}

void SwWW8ImplReader::RegisterNumFmtOnStyle(SwWW8StyInf& rStyleInfo,
                                            sal_uInt16       nActLFO,
                                            sal_uInt8         nActLevel)
{
    if( rStyleInfo.bValid )
    {
        // Phase 1: Nummerierungsattribute beim Einlesen einer StyleDef
        if( pAktColl )
        {
                // jetzt nur die Parameter vermerken: die tatsaechliche Liste wird
                // spaeter drangehaengt, wenn die Listendefinitionen gelesen sind...
            if( (USHRT_MAX > nActLFO) && (nWW8MaxListLevel > nActLevel))
            {
                rStyleInfo.nLFOIndex  = nActLFO;
                rStyleInfo.nListLevel = nActLevel;
            }
        }
        else
        // Phase 2: aktualisieren der StyleDef nach einlesen aller Listen
        {
            sal_uInt16 nLFO;
            sal_uInt8   nLevel;
            if( (USHRT_MAX > nActLFO) && (nWW8MaxListLevel > nActLevel))
            {
                // Plan A: die Werte fuer Listen- und Level-Nummer wurden uebergeben
                nLFO   = nActLFO;
                nLevel = nActLevel;
            }
            else
            {
                // Plan B: die vorhin in Phase 1 gespeicherten Werte sind zu nehmen
                nLFO   = rStyleInfo.nLFOIndex;
                nLevel = rStyleInfo.nListLevel;
            }
            if( (USHRT_MAX > nLFO) && (nWW8MaxListLevel > nLevel))
            {
                SwNumRule* pNumRule = pLstManager->GetNumRuleForActivation( nLFO );
                if( pNumRule )
                {
                    if( MAXLEVEL > rStyleInfo.nOutlineLevel )
                    {
                        rStyleInfo.pOutlineNumrule = pNumRule;
                    }
                    else
                    {
                        rStyleInfo.pFmt->SetAttr( SwNumRuleItem( pNumRule->GetName() ) );
                        rStyleInfo.bHasStyNumRule = sal_True;
                    }
                }
            }
        }
    }
}

void SwWW8ImplReader::RegisterNumFmtOnTxtNode(sal_uInt16 nActLFO,
                                              sal_uInt8   nActLevel,
                                              sal_Bool   bSetAttr)
{
    // beachte: die Methode haengt die NumRule an den Text Node, falls bSetAttr
    //          (dann muessen natuerlich vorher die Listen gelesen sein)
    //                  stellt sie NUR den Level ein, im Vertrauen darauf, dass am STYLE
    //                  eine NumRule haengt - dies wird NICHT ueberprueft !!!

    if( pLstManager ) // sind die Listendeklarationen gelesen?
    {
        const SwNumRule* pNumRule
            = bSetAttr ? pLstManager->GetNumRuleForActivation( nActLFO ) : 0;

        if( pNumRule || !bSetAttr )
        {
            SwTxtNode* pTxtNode = pPaM->GetNode()->GetTxtNode();
            ASSERT( pTxtNode, "Kein Text-Node an PaM-Position" );

            if( bSetAttr )
                pTxtNode->SwCntntNode::SetAttr(SwNumRuleItem( pNumRule->GetName() ));

            SvxLRSpaceItem aLR( *(SvxLRSpaceItem*)GetFmtAttr( RES_LR_SPACE ));
            if( 1 < aLR.GetTxtFirstLineOfst() )
            {
                aLR.SetTxtFirstLineOfst( 1 );
                NewAttr( aLR );
            }

            pTxtNode->SetNumLSpace( bSetAttr );

            pTxtNode->UpdateNum( SwNodeNum( nActLevel ) );
        }
    }
}

void SwWW8ImplReader::RegisterNumFmt(sal_uInt16 nActLFO, sal_uInt8 nActLevel)
{
    // sind wir erst beim Einlesen der StyleDef ?
    if( pAktColl )
        RegisterNumFmtOnStyle(pCollA[ nAktColl ], nActLFO, nActLevel);
    else
        RegisterNumFmtOnTxtNode(nActLFO, nActLevel);
}



void SwWW8ImplReader::Read_ListLevel(sal_uInt16 nId, sal_uInt8* pData, short nLen)
{
    if( nLen < 0 )
    {
        // aktuelle Liste ist hier zu Ende, was ist zu tun ???
        nListLevel = nWW8MaxListLevel;
    }
    else
    {
        // Sicherheitspruefung auf NIL Pointer
        if( !pData ) return;
        // die Streamdaten sind hier Null basiert, so wie wir es brauchen
        nListLevel = *pData;
        if( nWW8MaxListLevel <= nListLevel )
            nListLevel = nWW8MaxListLevel;
        else
        if( (USHRT_MAX > nLFOPosition) && (nWW8MaxListLevel > nListLevel))
        {
            RegisterNumFmt(nLFOPosition, nListLevel);
            nLFOPosition = USHRT_MAX;
            nListLevel   = nWW8MaxListLevel;
        }
    }
}



void SwWW8ImplReader::Read_LFOPosition(sal_uInt16 nId, sal_uInt8* pData, short nLen)
{
    if( nLen < 0 )
    {
        // aktueller Level ist hier zu Ende, was ist zu tun ???
        nLFOPosition = USHRT_MAX;
        nListLevel   = nWW8MaxListLevel;
    }
    else
    {
        // Sicherheitspruefung auf NIL Pointer
        if( !pData ) return;
        short nData = SVBT16ToShort( pData );
        if( 0 >= nData )
        {
            // expliziet die Numerierung abschalten
            // sind wir erst beim Einlesen der StyleDef ?
            if( pAktColl )
                pAktColl->SetAttr( *GetDfltAttr( RES_PARATR_NUMRULE ) );
            else
            {
                SwTxtNode* pTxtNode = pPaM->GetNode()->GetTxtNode();
                if( pTxtNode )
                {
                    pTxtNode->SwCntntNode::SetAttr(
                                *GetDfltAttr( RES_PARATR_NUMRULE ) );
                    pTxtNode->UpdateNum( SwNodeNum( NO_NUMBERING ) );
                }
            }

            nLFOPosition = USHRT_MAX;
        }
        else
        {
            // die Streamdaten sind hier 1 basiert, wir ziehen EINS ab
            nLFOPosition = (sal_uInt16)nData-1;
            if( USHRT_MAX > nLFOPosition)
            {
                /*
                    traurig: WW8 speichert manchmal keine Level-Attribute ab, auch wenn
                                     die Liste *nicht* bSimpleList hat.
                    daher: nach Auftreten von sprmPIlfo sofort die Liste anklemmen, auch
                                 wenn kein sprmPIlvl vorher kam!

                    schoener waere gewesen:
                            if(    (nWW8MaxListLevel == nListLevel)
                                    && pLstManager
                                    && pLstManager->IsSimpleList(   nLFOPosition ) )
                                nListLevel = 0;
                */
                if(nWW8MaxListLevel == nListLevel)
                    nListLevel = 0;
                if(nWW8MaxListLevel > nListLevel)
                {
                    RegisterNumFmt(nLFOPosition, nListLevel);
                    nLFOPosition = USHRT_MAX;
                    nListLevel   = nWW8MaxListLevel;
                }
            }
        }
    }
}

// -------------------------------------------------------------------
// ------------------------- Reading Controls ------------------------
// -------------------------------------------------------------------

BOOL SwWW8ImplReader::ImportFormulaControl(WW8FormulaControl &aFormula,
                                WW8_CP nStart, SwWw8ControlType nWhich )
{
    BOOL bRet=FALSE;
    /*
     * Save the reader state and process the sprms for this anchor cp.
     * Doing so will set the nPicLocFc to the offset to find the hypertext
     * data in the data stream.
     */
    WW8_CP nEndCp = nStart+1; //Only interested in the single 0x01 character

    WW8ReaderSave aSave(this,nStart);

    WW8PLCFManResult aRes;
    nStart = pPlcxMan->Where();
    while(nStart <= nEndCp)
    {
        if ( pPlcxMan->Get(&aRes)
            && aRes.pMemPos && aRes.nSprmId )
        {
            //only interested in sprms which would set nPicLocFc
            if ( (68 == aRes.nSprmId) || (0x6A03 == aRes.nSprmId) )
            {
                Read_PicLoc( aRes.nSprmId, aRes.pMemPos+ 1+
                (8 > pWwFib->nVersion ? 0 : 1) + WW8SprmDataOfs(aRes.nSprmId),
                4);
                break;
            }
        }
        (*pPlcxMan)++;
        nStart = pPlcxMan->Where();
    }
    long nOffset = nPicLocFc;
    aSave.Restore(this);

    long nOldPos = pDataStream->Tell();
    WW8_PIC aPic;
    pDataStream->Seek( nOffset);
#ifdef __WW8_NEEDS_COPY
    WW8_PIC_SHADOW aPicS;
    pDataStream->Read( &aPicS, sizeof( aPicS ) );
    WW8PicShadowToReal( &aPicS, &aPic );
#else
    pDataStream->Read( &aPic, sizeof( aPic ) );
#endif

    if((aPic.lcb > 0x3A) && !pDataStream->GetError() )
    {
        pDataStream->Seek( nPicLocFc + aPic.cbHeader );
        aFormula.Read(nWhich,pDataStream);
        bRet=TRUE;
    }

    /*There is a problem with aPic, the WW8_PIC is always used even though it
     *is too big for the WW95 files, it needs to be modified to check the
     version C.*/
    return(bRet);
}

BOOL SwImportControls::InsertFormula(WW8FormulaControl &rFormula,
    uno::Reference <drawing::XShape> *pShapeRef)
{
    BOOL bRet=FALSE;

    awt::Size aSz;
    uno::Reference< form::XFormComponent> xFComp;
    uno::Reference < drawing::XShape> xShape;

    const uno::Reference< lang::XMultiServiceFactory > & rServiceFactory =
        GetServiceFactory();

    //const XMultiServiceFactoryRef& rServiceFactory =
    //  GetServiceFactory();
    if(!rServiceFactory.is())
        return(FALSE);
    if (bRet = rFormula.Convert(rServiceFactory, xFComp, aSz))
    {
        xShape = InsertControl( xFComp, aSz, FALSE );
        if (pShapeRef)
            *pShapeRef = xShape;
    }
    return bRet;
}

void WW8FormulaControl::Read(SwWw8ControlType nWhich,SvStream *pDataStream)
{
    UINT8 nField;
    UINT8 nTest;

    int nType=0;
    pDataStream->Read(&nTest, 1);
    if (nTest == 0xFF) //Guesswork time, difference between 97 and 95 ?
    {
        pDataStream->SeekRel(4);
        nType=1;
    }
    *pDataStream >> nField;
    fToolTip = nField & 0x01;
    fNoMark = (nField & 0x02)>>1;
    fUseSize = (nField & 0x04)>>2;
    fNumbersOnly= (nField & 0x08)>>3;
    fDateOnly = (nField & 0x10)>>4;
    fUnused = (nField & 0xE0)>>5;
    *pDataStream >> nSize;

    *pDataStream >> hpsCheckBox;
    if (nType == 0)
        pDataStream->SeekRel(2); //Guess

    rtl_TextEncoding eEnc = rRdr.eStructCharSet;
    sTitle = !nType ? WW8ReadPString( *pDataStream, eEnc, TRUE )
                    : WW8Read_xstz(   *pDataStream, 0,    TRUE );

    if (nWhich == WW8_CT_CHECKBOX)
        *pDataStream >> nChecked;
    else
        sDefault = !nType ? WW8ReadPString( *pDataStream, eEnc, TRUE )
                          : WW8Read_xstz(   *pDataStream, 0,    TRUE );

    sFormatting = !nType ? WW8ReadPString( *pDataStream, eEnc, TRUE )
                           : WW8Read_xstz(   *pDataStream, 0,    TRUE );

    sHelp = !nType ? WW8ReadPString( *pDataStream, eEnc, TRUE )
                     : WW8Read_xstz(   *pDataStream, 0,    TRUE );

    if( fToolTip )
        sToolTip = !nType ? WW8ReadPString( *pDataStream, eEnc, TRUE )
                               : WW8Read_xstz(   *pDataStream, 0,    TRUE );
}

BOOL WW8FormulaCheckBox::Convert(
            const uno::Reference <lang::XMultiServiceFactory> &rServiceFactory,
            uno::Reference <form::XFormComponent> &rFComp,
            com::sun::star::awt::Size &rSz )
{
    String sServiceName = WW8_ASCII2STR( "com.sun.star.form.component.CheckBox" );
    uno::Reference< uno::XInterface > xCreate = rServiceFactory->createInstance( sServiceName );
    if( !xCreate.is() )
        return FALSE;

    rFComp = uno::Reference< form::XFormComponent >( xCreate, uno::UNO_QUERY );
    if( !rFComp.is() )
        return FALSE;

    uno::Reference< beans::XPropertySet > xPropSet( xCreate, uno::UNO_QUERY );

    rSz.Width = 16 * hpsCheckBox;
    rSz.Height = 16 * hpsCheckBox;

    uno::Any aTmp;
    if (sTitle.Len())
    {
        //UniString sTmp(pName,RTL_TEXTENCODING_ASCII_US);
        aTmp <<= rtl::OUString(sTitle);
    }
    else
        aTmp <<= rtl::OUString(sName);
    xPropSet->setPropertyValue( WW8_ASCII2STR( "Name" ), aTmp );

    aTmp <<= (sal_Int16)nChecked;
    xPropSet->setPropertyValue( WW8_ASCII2STR( "DefaultState" ), aTmp);

    if( sToolTip.Len() )
    {
        aTmp <<= rtl::OUString( sToolTip );
        xPropSet->setPropertyValue( WW8_ASCII2STR( "HelpText" ), aTmp );
    }

    return TRUE;

}

void WW8FormulaControl::SetOthersFromDoc(uno::Reference< form::XFormComponent >& rFComp, com::sun::star::awt::Size &rSz,
    uno::Reference< beans::XPropertySet >& rPropSet)
{
    const struct CtrlFontMapEntry
    {
        USHORT nWhichId;
        const sal_Char* pPropNm;
    }
    aMapTable [] =
    {
        RES_CHRATR_COLOR,           "TextColor",
        RES_CHRATR_COLOR,           "TextColor",
        RES_CHRATR_FONT,            "FontName",
        RES_CHRATR_FONTSIZE,        "FontHeight",
        RES_CHRATR_WEIGHT,          "FontWeight",
        RES_CHRATR_UNDERLINE,       "FontUnderline",
        RES_CHRATR_CROSSEDOUT,      "FontStrikeout",
        RES_CHRATR_POSTURE,         "FontSlant",
        0,                          0
    };


    USHORT nDefSize;
    Font aFont;
    uno::Reference< beans::XPropertySetInfo > xPropSetInfo = rPropSet->getPropertySetInfo();
    if (nSize)
        nDefSize = nSize;
    else if( sDefault.Len() )
        nDefSize = sDefault.Len();
    else
        nDefSize = 18;           //no chars, ms actually uses
                                //5 0x96 chars (-) as its default, but thats
                                //the default for an empty text area, which
                                //stretchs in size as text is entered so...

    uno::Any aTmp;
    for( const CtrlFontMapEntry* pMap = aMapTable; pMap->nWhichId; ++pMap )
    {
        BOOL bSet = TRUE;
        const SfxPoolItem* pItem = rRdr.GetFmtAttr( pMap->nWhichId );

        switch ( pMap->nWhichId )
        {
        case RES_CHRATR_COLOR:
            aTmp <<= (sal_Int32)((SvxColorItem*)pItem)->GetValue().GetRGBColor();
            aFont.SetColor( ((SvxColorItem*)pItem)->GetValue() );
            break;

        case RES_CHRATR_FONT:
            {
                const SvxFontItem *pFontItem = (SvxFontItem *)pItem;
                String pNm;
                if( xPropSetInfo->hasPropertyByName( pNm = WW8_ASCII2STR( "FontStyleName" ) ) )
                {
                    aTmp <<= rtl::OUString( pFontItem->GetStyleName() );
                    rPropSet->setPropertyValue( pNm, aTmp );
                }
                if( xPropSetInfo->hasPropertyByName( pNm = WW8_ASCII2STR( "FontFamily" ) ) )
                {
                    aTmp <<= (sal_Int16)pFontItem->GetFamily();
                    rPropSet->setPropertyValue( pNm, aTmp );
                }
                if( xPropSetInfo->hasPropertyByName( pNm = WW8_ASCII2STR( "FontCharset" ) ) )
                {
                    aTmp <<= (sal_Int16)pFontItem->GetCharSet();
                    rPropSet->setPropertyValue( pNm, aTmp );
                }
                if( xPropSetInfo->hasPropertyByName( pNm = WW8_ASCII2STR( "FontPitch" ) ) )
                {
                    aTmp <<= (sal_Int16)pFontItem->GetPitch();
                    rPropSet->setPropertyValue( pNm, aTmp );
                }

                aTmp <<= rtl::OUString( pFontItem->GetFamilyName());
                aFont.SetName( pFontItem->GetFamilyName() );
                aFont.SetStyleName( pFontItem->GetStyleName() );
                aFont.SetFamily( pFontItem->GetFamily() );
                aFont.SetCharSet( pFontItem->GetCharSet() );
                aFont.SetPitch( pFontItem->GetPitch() );
            }
            break;

        case RES_CHRATR_FONTSIZE:
            {
                Size aSize( aFont.GetSize().Width(),
                            ((SvxFontHeightItem*)pItem)->GetHeight() );
                aTmp <<= ((float)aSize.Height()) / 20. ;

                aFont.SetSize( OutputDevice::LogicToLogic( aSize,
                                            MAP_TWIP, MAP_100TH_MM ) );
            }
            break;

        case RES_CHRATR_WEIGHT:
                aTmp <<= (float)VCLUnoHelper::ConvertFontWeight(
                                        ((SvxWeightItem*)pItem)->GetWeight() );
            aFont.SetWeight( ((SvxWeightItem*)pItem)->GetWeight() );
            break;

        case RES_CHRATR_UNDERLINE:
                aTmp <<= (sal_Int16)( ((SvxUnderlineItem*)pItem)->GetUnderline() );
            aFont.SetUnderline( ((SvxUnderlineItem*)pItem)->GetUnderline() );
            break;

        case RES_CHRATR_CROSSEDOUT:
            aTmp <<= (sal_Int16)( ((SvxCrossedOutItem*)pItem)->GetStrikeout() );
            aFont.SetStrikeout( ((SvxCrossedOutItem*)pItem)->GetStrikeout() );
            break;

        case RES_CHRATR_POSTURE:
            aTmp <<= (sal_Int16)( ((SvxPostureItem*)pItem)->GetPosture() );
            aFont.SetItalic( ((SvxPostureItem*)pItem)->GetPosture() );
            break;

        default:
            bSet = FALSE;
            break;
        }

        if( bSet && xPropSetInfo->hasPropertyByName(
                        WW8_ASCII2STR( pMap->pPropNm ) ) )
            rPropSet->setPropertyValue( WW8_ASCII2STR( pMap->pPropNm ), aTmp );
    }
    // now calculate the size of the control
    String sExpText;
    sExpText.Fill( nDefSize, 'M' );
    OutputDevice* pOut = Application::GetDefaultDevice();
    pOut->Push( PUSH_FONT | PUSH_MAPMODE );
    pOut->SetMapMode( MapMode( MAP_100TH_MM ));
    pOut->SetFont( aFont );
    rSz.Width  = pOut->GetTextWidth( sExpText );
    rSz.Height = pOut->GetTextHeight();

    pOut->Pop();
}


BOOL WW8FormulaEditBox::Convert(const uno::Reference< lang::XMultiServiceFactory >& rServiceFactory,
        uno::Reference< form::XFormComponent >& rFComp, com::sun::star::awt::Size &rSz)
{
    rtl::OUString sServiceName = WW8_ASCII2STR( "com.sun.star.form.component.TextField" );
    uno::Reference< uno::XInterface >  xCreate = rServiceFactory->createInstance( sServiceName );
    if( !xCreate.is() )
        return FALSE;

    rFComp = uno::Reference< form::XFormComponent >( xCreate, uno::UNO_QUERY );
    if( !rFComp.is() )
        return FALSE;

    uno::Reference< beans::XPropertySet > xPropSet( xCreate, uno::UNO_QUERY );

    uno::Any aTmp;
    if( sTitle.Len() )
    {
        //UniString sTmp(pName,RTL_TEXTENCODING_ASCII_US);
        aTmp <<= rtl::OUString( sTitle );
    }
    else
        aTmp <<= rtl::OUString( sName );
    xPropSet->setPropertyValue( WW8_ASCII2STR( "Name" ), aTmp );

    BOOL bTemp = FALSE;
    aTmp.setValue(&bTemp, ::getBooleanCppuType());
    xPropSet->setPropertyValue( WW8_ASCII2STR( "MultiLine" ), aTmp);

    aTmp <<= (sal_Int16)0;  //No Border
    xPropSet->setPropertyValue( WW8_ASCII2STR( "Border" ), aTmp);

    if( sDefault.Len() )
    {
        aTmp <<= rtl::OUString( sDefault );
        xPropSet->setPropertyValue( WW8_ASCII2STR( "DefaultText" ), aTmp);
    }

    rSz.Width = 300;
    rSz.Height = 200;

    aTmp <<= (sal_Int32)(0x00C0C0C0);
    xPropSet->setPropertyValue( WW8_ASCII2STR( "BackgroundColor" ), aTmp);

    SetOthersFromDoc(rFComp,rSz,xPropSet);

    aTmp <<= (sal_Int16)nSize;
    xPropSet->setPropertyValue( WW8_ASCII2STR( "MaxTextLen" ), aTmp);

    if( sToolTip.Len() )
    {
        aTmp <<= rtl::OUString( sToolTip );
        xPropSet->setPropertyValue( WW8_ASCII2STR( "HelpText" ), aTmp );
    }

    return TRUE;
}


/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ww8/ww8par3.cxx,v 1.1.1.1 2000-09-18 17:14:58 hr Exp $


      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.53  2000/09/18 16:05:00  willem.vandorp
      OpenOffice header added.

      Revision 1.52  2000/08/22 17:41:01  cmc
      #77315# 95 Formulas, bad string read

      Revision 1.51  2000/07/20 14:47:21  khz
      #75709# Remove NumRule from Node wit no/invalid LFO

      Revision 1.50  2000/06/26 09:58:42  jp
      must change: GetAppWindow->GetDefaultDevice

      Revision 1.49  2000/06/23 10:29:55  khz
      #71707# Make sure pNdNum is set to zero when no numbering on node

      Revision 1.48  2000/05/25 08:06:52  khz
      Piece Table optimization, Unicode changes, Bugfixes

      Revision 1.47  2000/05/24 08:56:11  jp
      Bugfixes for Unicode

      Revision 1.46  2000/05/18 14:02:21  khz
      UNO3 conversion: use rtl::OUString - not UString

      Revision 1.45  2000/05/16 11:24:13  khz
      Unicode code-conversion

      Revision 1.44  2000/03/27 15:35:59  cmc
      #74329# Ported WW97 Controls to uno codebase

      Revision 1.43  2000/03/24 12:05:52  khz
      Task #74368# IsInvalidOrToBeMergedTabCell() stops duplicate reset of NumRule

      Revision 1.42  2000/03/21 15:04:57  os
      UNOIII

      Revision 1.41  2000/03/02 16:57:48  khz
      Task #70716# Set AbsLSpace and FirstLineOffset *allways* on SwNumFmt

      Revision 1.40  2000/02/23 17:10:46  khz
      Task #71704# multiply negative aLVL.nDxaLeft by -1

      Revision 1.39  2000/02/11 14:40:20  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.38  2000/02/09 11:29:46  khz
      Task #70473# char_t --> sal_Unicode

      Revision 1.37  1999/12/21 09:56:55  khz
      Task #71144# ...component.Edit -> ...component.TextField

      Revision 1.36  1999/12/09 14:52:33  khz
      Task #67145# Don't set NumRule if OutlineNumrule is set on Style

      Revision 1.35  1999/12/03 16:52:17  khz
      Task #67145# Don't set NumRule if OutlineNumrule is set on Style

      Revision 1.34  1999/11/29 17:50:28  khz
      Task #70168# rNumFmt.SetFirstLineOffset() must get negative parameter

      Revision 1.33  1999/11/29 11:28:25  jp
      compiler error - missing include

      Revision 1.32  1999/11/22 15:22:33  os
      headers added

      Revision 1.31  1999/11/19 16:40:21  os
      modules renamed

      Revision 1.30  1999/11/19 15:13:16  khz
      Code Review: Replace WW8ReadByte()... by rSt >> nVari and remove rSt.GetError() calls

      Revision 1.29  1999/10/08 09:26:15  khz
      Import Redlining

      Revision 1.28  1999/06/21 13:27:34  JP
      Bug #60448#: Read_LFOPosition - set empty numrule item


      Rev 1.27   21 Jun 1999 15:27:34   JP
   Bug #60448#: Read_LFOPosition - set empty numrule item

      Rev 1.26   21 Jun 1999 09:37:56   JP
   AdjustLVL: break the charfmt search at first equal charfmt and save it at current level

      Rev 1.25   09 Apr 1999 18:01:40   KHZ
   Task #64348# Bei Listen-Overrides nur bei Ungleichheit neue Liste anlegen!

      Rev 1.24   07 Apr 1999 16:31:40   KHZ
   Task #64355# Nummerierungs-Postfix-String jetzt auch bei 1-stuf. Nummerierung

      Rev 1.23   31 Mar 1999 20:19:20   KHZ
   Task #61646# Falls Num. gesetzt, darf 1st-Zl-Einzuege am Abs. nur negativ sein.

      Rev 1.22   30 Mar 1999 07:51:24   MIB
   #62984#: XServiceManager -> XMultiServiceFactory

      Rev 1.21   09 Mar 1999 11:07:56   MIB
   #62980#: TF_ONE51-Umstallungen fuer Controls beendet

      Rev 1.20   05 Mar 1999 20:50:44   KHZ
   WICHTIGE UMBENENNUNG: VertOrientation_TOP (war: VerticalOrientation_TOP)

      Rev 1.19   27 Feb 1999 13:35:02   KHZ
   Task #62367# fuehrende 0xFF vor List-Format-Overrides ueberspringen

      Rev 1.18   24 Feb 1999 14:28:50   KHZ
   Bug #60733#: UpdateAll - vorm erzeugen des Textes die NumRules aktualisieren

      Rev 1.17   17 Feb 1999 15:26:26   TJ
   uno::Reference< XShapeFactory >  raus

      Rev 1.16   09 Feb 1999 17:01:54   HR
   uno::Any: & eingefuegt

      Rev 1.15   27 Jan 1999 09:45:06   OS
   #56371# TF_ONE51

      Rev 1.14   15 Dec 1998 11:08:46   KHZ
   Tasks #59580# #58561# #58961# (Nachzieher aus SRV506) (2)

      Rev 1.13   15 Dec 1998 10:44:18   KHZ
   Tasks #59580# #58561# #58961# (Nachzieher aus SRV506)

      Rev 1.12   03 Dec 1998 14:16:42   JP
   Bug #58961#: Teilfix - Char.._N Format verwenden

      Rev 1.11   02 Dec 1998 13:29:10   KHZ
   Task #59837# ungueltiger Listenbasisstyle 0x0FFF auf Standardstyle gesetzt

      Rev 1.10   17 Nov 1998 10:48:54   OS
   #58263# NumType durch SvxExtNumType ersetzt

      Rev 1.9   30 Oct 1998 10:29:20   KHZ
   Task #57836# GPF, da irrtuemlich 255 gesetzt statt nWW8MaxListLevel

      Rev 1.8   23 Sep 1998 09:52:00   KHZ
   Syntaxfehler fuer OS/2

      Rev 1.7   16 Sep 1998 15:56:42   MIB
   #56513#: VC-Controls -> UNO-Controls

      Rev 1.6   15 Sep 1998 12:58:36   HJS
   '#56161#

      Rev 1.5   05 Aug 1998 09:36:54   KHZ
   Task #54382# hart attributierte L-Einzuege bei Listen

      Rev 1.4   29 Jul 1998 13:55:34   KHZ
   Task #52607# numm. Listen

      Rev 1.3   28 Jul 1998 22:27:14   KHZ
   Task #52607# nummerierte Listen (Teil 3)

      Rev 1.2   28 Jul 1998 13:02:04   KHZ
   Task #52607# nummerierte Listen (Teil 2)

      Rev 1.1   28 Jul 1998 11:06:04   KHZ
   Task #52607# nummerierte Listen (Teil 1)

      Rev 1.0   16 Jun 1998 11:08:02   KHZ
   Initial revision.

*************************************************************************/
diff --git a/sw/source/filter/ww8/ww8par4.cxx b/sw/source/filter/ww8/ww8par4.cxx
new file mode 100644
index 0000000..b0b35bd2
--- /dev/null
+++ b/sw/source/filter/ww8/ww8par4.cxx
@@ -0,0 +1,777 @@
/*************************************************************************
 *
 *  $RCSfile: ww8par4.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:58 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PCH
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#include <tools/solar.h>

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _TOOLS_TEMPFILE_HXX
#include <tools/tempfile.hxx>
#endif
#ifndef _APP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _SVSTOR_HXX //autogen
#include <so3/svstor.hxx>
#endif
#ifndef _FILTER_HXX //autogen
#include <svtools/filter.hxx>
#endif
#ifndef _SVDOOLE2_HXX //autogen
#include <svx/svdoole2.hxx>
#endif
#ifndef _MSDFFIMP_HXX
#include <svx/msdffimp.hxx>
#endif
#ifndef _SVX_IMPGRF_HXX
#include <svx/impgrf.hxx>
#endif

#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _FMTANCHR_HXX //autogen
#include <fmtanchr.hxx>
#endif
#ifndef _FMTCNTNT_HXX //autogen wg. SwFmtCntnt
#include <fmtcntnt.hxx>
#endif
#ifndef _FRMFMT_HXX //autogen
#include <frmfmt.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _PAM_HXX
#include <pam.hxx>
#endif
#ifndef _NDGRF_HXX //autogen wg. SwGrfNode
#include <ndgrf.hxx>
#endif
/*
#ifndef _SHELLIO_HXX
#include <shellio.hxx>
#endif*/
#ifndef _DOCSH_HXX
#include <docsh.hxx>            // fuer Ole-Node
#endif
#ifndef _MDIEXP_HXX
#include <mdiexp.hxx>           // Progress
#endif
#ifndef _WW8SCAN_HXX
#include <ww8scan.hxx>          // __WW_NEEDS_COPY
#endif
#ifndef _WW8PAR_HXX
#include <ww8par.hxx>
#endif
#ifndef _WW8PAR2_HXX
#include <ww8par2.hxx>          // WWFlyPara::BoxUpWidth()
#endif
/*
#ifndef _REDLENUM_HXX
#include <redlenum.hxx>
#endif*/
#ifndef _REDLINE_HXX
#include <redline.hxx>
#endif
#ifndef _FLTSHELL_HXX
#include <fltshell.hxx>
#endif
#ifndef _MSOCXIMP_HXX
#include <msocximp.hxx>
#endif
#ifndef _UNODRAW_HXX
#include <unodraw.hxx>
#endif

#ifndef _COM_SUN_STAR_DRAWING_XSHAPE_HPP_
#include <com/sun/star/drawing/XShape.hpp>
#endif


struct OLE_MFP
{
    INT16 mm;       // 0x6  int
    INT16 xExt;     // 0x8  int in 1/100 mm
    INT16 yExt;     // 0xa  int in 1/100 mm
    INT16 hMF;      // 0xc  int
};


SV_IMPL_OP_PTRARR_SORT(WW8AuthorInfos, WW8AuthorInfo_Ptr)


static BOOL SwWw8ReadScaling( INT16& rX, INT16& rY, SvStorageRef& rSrc1 )
{
    // Skalierungsfaktoren holen:
    //      Informationen in PIC-Stream ( durch ausprobieren )
    //      0x0  (l)cb
    //      0x08 .. 0x0a Flags ??
    //      0x08 Inh: 1 / 0
    //      0x09 Inh: 0,8,0x18
    //      0x0a Inh: immer 8, MAP_ANISOTROPIC ???
    //      0x0b Inh: immer 0
    //      0x0c, 0x10 Originalgroesse x,y in 1/100 mm
    //      0x14, 0x16 Originalgroesse x,y in tw
    //      0x2c, 0x30 Skalierung x,y in Promille
    //      0x34, 0x38, 0x3c, 0x40 Crop Left, Top, Right, Bot in tw

    SvStorageStreamRef xSrc3 = rSrc1->OpenStream( WW8_ASCII2STR( "\3PIC" ));
    SvStorageStream* pS = xSrc3;
    pS->SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );
    pS->Seek( STREAM_SEEK_TO_END );

    ASSERT( pS->Tell() >=  76, "+OLE-PIC-Stream is shorter than 76 Byte" );

    INT32 nOrgWidth,
          nOrgHeight,
          nScaleX,
          nScaleY,
          nCropLeft,
          nCropTop,
          nCropRight,
          nCropBottom;
    pS->Seek( 0x14 );
    *pS >> nOrgWidth    // Original Size in 1/100 mm
        >> nOrgHeight;
    pS->Seek( 0x2c );
    *pS >> nScaleX      // Scaling in Promille
        >> nScaleY
        >> nCropLeft    // Cropping in 1/100 mm
        >> nCropTop
        >> nCropRight
        >> nCropBottom;

    rX = nOrgWidth  - nCropLeft - nCropRight;
    rY = nOrgHeight - nCropTop  - nCropBottom;
    if(       10 > nScaleX
        || 65536 < nScaleX
        ||    10 > nScaleY
        || 65536 < nScaleY)
    {
        ASSERT( !pS, "+OLE-Scalinginformation in PIC-Stream wrong" );
        return FALSE;
    }
    else
    {
        rX = (INT16)( (long)rX * nScaleX / 1000 );
        rY = (INT16)( (long)rY * nScaleY / 1000 );
    }
    return TRUE;
}

static BOOL SwWw6ReadMetaStream( GDIMetaFile& rWMF, OLE_MFP* pMfp,
                         SvStorageRef& rSrc1 )
{
    SvStorageStreamRef xSrc2 = rSrc1->OpenStream( WW8_ASCII2STR( "\3META" ));
    SvStorageStream* pSt = xSrc2;
    pSt->SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );
    ULONG nRead = pSt->Read( pMfp, sizeof(*pMfp ) );
                                // Mini-Placable-Header lesen
    if( nRead != sizeof( *pMfp ) )
        return FALSE;

#if defined  __BIGENDIAN
    pMfp->mm = SWAPSHORT( pMfp->mm );
    pMfp->xExt = SWAPSHORT( pMfp->xExt );
    pMfp->yExt = SWAPSHORT( pMfp->yExt );
#endif // __BIGENDIAN

    if( pMfp->mm == 94 || pMfp->mm == 99 )
    {
        ASSERT( !pSt, "+OLE: Falscher Metafile-Typ" );
        return FALSE;
    }
    if( pMfp->mm != 8 )
    {
        ASSERT( !pSt, "+OLE: Falscher Metafile-Typ ( nicht Anisotropic )" );
    }
    if( !pMfp->xExt || !pMfp->yExt )
    {
        ASSERT( !pSt, "+OLE: Groesse von 0 ???" );
        return FALSE;
    }
    BOOL bOk = ReadWindowMetafile( *pSt, rWMF );    // WMF lesen
                    // *pSt >> aWMF  geht nicht ohne placable Header
    if( !bOk || pSt->GetError() || rWMF.GetActionCount() == 0 ){
        ASSERT( !pSt, "+OLE: Konnte Metafile nicht lesen" );
        return FALSE;
    }

    rWMF.SetPrefMapMode( MapMode( MAP_100TH_MM ) );


    // MetaFile auf neue Groesse skalieren und
    // neue Groesse am MetaFile setzen
    Size        aOldSiz( rWMF.GetPrefSize() );
    Size        aNewSiz( pMfp->xExt, pMfp->yExt );
    Fraction    aFracX( aNewSiz.Width(), aOldSiz.Width() );
    Fraction    aFracY( aNewSiz.Height(), aOldSiz.Height() );

    rWMF.Scale( aFracX, aFracY );
    rWMF.SetPrefSize( aNewSiz );

    return TRUE;
}

static BOOL SwWw6ReadMacPICTStream( Graphic& rGraph, SvStorageRef& rSrc1 )
{
        // 03-META-Stream nicht da. Vielleicht ein 03-PICT ?
    SvStorageStreamRef xSrc4 = rSrc1->OpenStream( WW8_ASCII2STR( "\3PICT" ));
    SvStorageStream* pStp = xSrc4;
    pStp->SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );
    BYTE aTestA[10];        // Ist der 01Ole-Stream ueberhaupt vorhanden
    ULONG nReadTst = pStp->Read( aTestA, sizeof( aTestA ) );
    if(nReadTst != sizeof(aTestA))
        return FALSE;

    pStp->Seek( STREAM_SEEK_TO_BEGIN );

            // Mac-Pict steht im 03PICT-StorageStream
            // allerdings ohne die ersten 512 Bytes, die
            // bei einem MAC-PICT egal sind ( werden nicht ausgewertet )
    String sExt(WW8_ASCII2STR( "pct" ));
    TempFile aTempFile(aEmptyStr, &sExt);
    aTempFile.EnableKillingFile();
    {
        SvFileStream aOut( aTempFile.GetName(),
                            STREAM_READ|STREAM_WRITE|STREAM_TRUNC );


        BYTE* pBuf = new BYTE[512];
        memset( pBuf, 0, 512 );
        aOut.Write( pBuf, 512 );        // Anfang Pict: 512 Byte Muell
        delete( pBuf );
        aOut << *pStp;                  // Storage-Stream rausschreiben
    }

    GraphicFilter& rGF = *::GetGrfFilter(); // lese ueber Filter ein
#if SUPD<591
    BOOL bOk = 0 == rGF.ImportGraphic( rGraph, DirEntry(aTempFile.GetName()), GRFILTER_FORMAT_DONTKNOW );
#else
    BOOL bOk = 0 == rGF.ImportGraphic( rGraph, INetURLObject(aTempFile.GetName()), GRFILTER_FORMAT_DONTKNOW );
#endif
    return bOk;
}


using namespace ::com::sun::star;


SwFrmFmt* SwWW8ImplReader::ImportOle( const Graphic* pGrf,
                                     const SfxItemSet* pFlySet )
{
    SwFrmFmt* pFmt = 0;
    if( !(nIniFlags & WW8FL_NO_OLE ))
    {
        ASSERT( pStg, "ohne storage geht hier fast gar nichts!" );

        ::SetProgressState( nProgress, rDoc.GetDocShell() );     // Update

        INT16 nX, nY;               // nX, nY ist Ziel-Groesse
        BOOL bOleOk = TRUE;
        Graphic aGraph;

        String aSrcStgName = '_';
        aSrcStgName += String::CreateFromInt32( nObjLocFc );        // ergibt Name "_4711"

        SvStorageRef xSrc0 = pStg->OpenStorage( WW8_ASCII2STR( "ObjectPool" ) );

        if( pGrf )
        {
            aGraph = *pGrf;
            const Size aSizeTwip = OutputDevice::LogicToLogic(
                                        aGraph.GetPrefSize(),
                                        aGraph.GetPrefMapMode(),
                                        MAP_TWIP );
            nX = (INT16) aSizeTwip.Width();
            nY = (INT16) aSizeTwip.Height();
        }
        else
        {
            SvStorageRef xSrc1 = xSrc0->OpenStorage( aSrcStgName,
                                STREAM_READWRITE| STREAM_SHARE_DENYALL );
            OLE_MFP aMfp;
            GDIMetaFile aWMF;
            if( SwWw6ReadMetaStream( aWMF, &aMfp, xSrc1 ) )
            {
                /* ignore size, take Size in SwWw8ReadScaling instead!
                INT16 nXO = (INT16)( (long)aMfp.xExt * 144 / 254 );
                INT16 nYO = (INT16)( (long)aMfp.yExt * 144 / 254 );
                */
                SwWw8ReadScaling( nX, nY, xSrc1 );
                aGraph = Graphic( aWMF );
            }
            // 03-META-Stream nicht da. Vielleicht ein 03-PICT ?
            else if( SwWw6ReadMacPICTStream( aGraph, xSrc1 ) )
            {
                const Size aSizeTwip = OutputDevice::LogicToLogic(
                                            aGraph.GetPrefSize(),
                                            aGraph.GetPrefMapMode(),
                                            MAP_TWIP );
                nX = (INT16) aSizeTwip.Width();
                nY = (INT16) aSizeTwip.Height();
                bOleOk = FALSE;         // PICT: kein WMF da -> Grafik statt OLE
            }
#if 0
//JP 23.06.99 - if the OLE-Storage does not contained the streams META
//              or PICT, then import the grafic from the escher.
//              But the Question is, is the OLE-Storage then a valid
//              OLE-Object and is the user be able to activate it. So it's
//              better to import it as grafic.

            else
            {
                ULONG nOldObjLocFc = nOldObjLocFc;
                nObjLocFc = 0;

                SwFrmFmt* pGrfFmt = ImportGraf();
                if( pGrfFmt )
                {
                    const SwNodeIndex* pCntIdx = pGrfFmt->GetCntnt( FALSE ).
                                            GetCntntIdx();
                    if( pCntIdx )
                    {
                        SwNodeIndex aIdx( *pCntIdx, 1 );
                        if( aIdx.GetNode().IsGrfNode() )
                        {
                            // get the grafic of the node and delete it
                            // then complete, because its become a OLE-Object
                            aGraph = aIdx.GetNode().GetGrfNode()->GetGrf();
                            Size aSz( aIdx.GetNode().GetGrfNode()->GetTwipSize() );
                            nX = (INT16) aSz.Width();
                            nY = (INT16) aSz.Height();

                            rDoc.DelLayoutFmt( pGrfFmt );
                            pGrfFmt = 0;
                        }
                    }
                    pFmt = pGrfFmt;
                }
                nObjLocFc = nOldObjLocFc;
            }
#endif
        }       // StorageStreams wieder zu

//#ifdef DEBUG
        SvStorageRef xSrc1 = xSrc0->OpenStorage( aSrcStgName,
            STREAM_READWRITE| STREAM_SHARE_DENYALL );

        if(!pFormImpl)
            pFormImpl = new SwImportControls(rDoc.GetDocShell(),pPaM);
        uno::Reference< drawing::XShape > xRef;
        if (pFormImpl->ReadOCXStream(xSrc1,&xRef,bFloatingCtrl))
        {
            bOleOk = FALSE;
            uno::Reference< beans::XPropertySet >  xPropSet( xRef, uno::UNO_QUERY );
            uno::Reference< lang::XUnoTunnel> xTunnel( xPropSet, uno::UNO_QUERY);
            SwXShape *pSwShape = 0;
            if(xTunnel.is())
            {
                pSwShape = (SwXShape*)xTunnel->getSomething(SwXShape::getUnoTunnelId());
            }
            return pSwShape ? (SwFrmFmt*)(pSwShape->GetRegisteredIn()) : 0;
        }
//#endif


        if( GRAPHIC_GDIMETAFILE == aGraph.GetType() ||
            GRAPHIC_BITMAP == aGraph.GetType() )
        {
            ::SetProgressState( nProgress, rDoc.GetDocShell() );     // Update

            Point aTmpPoint;
            Rectangle aRect( aTmpPoint, Size( nX, nY ) );
            SwAttrSet aFlySet( rDoc.GetAttrPool(), RES_FRMATR_BEGIN,
                                                    RES_FRMATR_END-1);
            if( !pFlySet )
            {
                pFlySet = &aFlySet;

                if( !bNew )
                    Reader::ResetFrmFmtAttrs( aFlySet );    // Abstand/Umrandung raus

                SwFmtAnchor aAnchor( FLY_IN_CNTNT );
                aAnchor.SetAnchor( pPaM->GetPoint() );
                aFlySet.Put( aAnchor );

                aFlySet.Put( SwFmtFrmSize( ATT_FIX_SIZE, nX, nY ) );
                aFlySet.Put( SwFmtVertOrient( 0, VERT_TOP, FRAME ));

                if( pSFlyPara )         // OLE im Rahmen ?
                {                       // ok, Rahmen auf Bildgroesse vergroessern
                                        //  ( nur wenn Auto-Breite )
                    pSFlyPara->BoxUpWidth( nX );
                }
            }
            else
            {
                const SwFmtFrmSize* pSize = (SwFmtFrmSize*)pFlySet->GetItem(
                                            RES_FRM_SIZE, FALSE );
                if( pSize )
                    aRect.SetSize( pSize->GetSize() );
            }


            if( bOleOk && !( nIniFlags & WW8FL_OLE_TO_GRAF ))
            {
                ULONG nOldPos = pDataStream->Tell();

                pDataStream->Seek(STREAM_SEEK_TO_END);
                SvStream *pTmpData;
                if (nObjLocFc < pDataStream->Tell())
                {
                    pTmpData = pDataStream;
                    pTmpData->Seek( nObjLocFc );
                }
                else
                    pTmpData = 0;
                SvStorageRef xDst0( rDoc.GetDocShell()->GetStorage() );
                SdrOle2Obj* pRet = SvxMSDffManager::CreateSdrOLEFromStorage(
                                        aSrcStgName, xSrc0, xDst0,
                                        aGraph, aRect, pTmpData,
                                        SwMSDffManager::GetFilterFlags());
                if( pRet )      // Ole-Object wurde eingefuegt
                {
                    pFmt = rDoc.Insert( *pPaM, &pRet->GetObjRef(), pFlySet );
                    delete pRet;        // das brauchen wir nicht mehr
                }
                else
                    bOleOk = FALSE;
                pDataStream->Seek( nOldPos );
            }

            if( !bOleOk || (nIniFlags & WW8FL_OLE_TO_GRAF) )
                pFmt = rDoc.Insert( *pPaM,
                            aEmptyStr, aEmptyStr,   // Name der Grafik !!
                            &aGraph,
                            pFlySet,                // Attribute fuer den FlyFrm
                            0 );                    // Attribute fuer die Grafik
        }
    }
    return pFmt;
}


void SwWW8ImplReader::ReadRevMarkAuthorStrTabl( SvStream& rStrm,
                                                INT32 nTblPos,
                                                INT32 nTblSiz,
                                                SwDoc& rDoc )
{
    SvStrings aAuthorNames( 0, 16 );
    WW8ReadSTTBF( !bVer67, rStrm, nTblPos, nTblSiz, bVer67 ? 2 : 0,
                    eStructCharSet, aAuthorNames );

    for( USHORT nAuthor = 0; nAuthor < aAuthorNames.Count(); ++nAuthor )
    {
        // Store author in doc
        USHORT nSWId = rDoc.InsertRedlineAuthor( *aAuthorNames[ nAuthor ] );
        // Store matchpair
        if( !pAuthorInfos )
            pAuthorInfos = new WW8AuthorInfos;
        WW8AuthorInfo* pAutorInfo = new WW8AuthorInfo( nAuthor, nSWId );
        if( 0 == pAuthorInfos->Insert( pAutorInfo ) )
            delete pAutorInfo;
    }
    aAuthorNames.DeleteAndDestroy( 0, aAuthorNames.Count() );
}

/*
   Revision Marks ( == Redlining )
*/
// insert or delete content (change char attributes resp.)
void SwWW8ImplReader::Read_CRevisionMark(SwRedlineType eType, USHORT nId, BYTE* pData, short nLen )
{
    // there *must* be a SprmCIbstRMark[Del] and a SprmCDttmRMark[Del]
    // pointing to the very same char position as our SprmCFRMark[Del]
    if( !pPlcxMan ) return;
    const BYTE* pSprmCIbstRMark;
    const BYTE* pSprmCDttmRMark;
//  const BYTE* pSprmCIdslRMark;
    if( REDLINE_FORMAT == eType )
    {
        pSprmCIbstRMark = pData+1;
        pSprmCDttmRMark = pData+3;
    }
    else
    {
        BOOL bIns = (REDLINE_INSERT == eType);
        if( bVer67 )
        {
            pSprmCIbstRMark = pPlcxMan->HasCharSprm( 69 );
            pSprmCDttmRMark = pPlcxMan->HasCharSprm( 70 );
        }
        else
        {
            pSprmCIbstRMark = pPlcxMan->HasCharSprm( bIns ? 0x4804 : 0x4863 );
            pSprmCDttmRMark = pPlcxMan->HasCharSprm( bIns ? 0x6805 : 0x6864 );
//          pSprmCIdslRMark = pPlcxMan->HasCharSprm( bIns ? 0x4807 : 0x4867 );
        }
    }
    if( !pSprmCIbstRMark || !pSprmCDttmRMark ) return;

    if( nLen < 0 )
    {
        // end of current revision mark
        pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_FLTR_REDLINE );
    }
    else
    {
        // start of new revision mark
        USHORT nWWAutNo = SVBT16ToShort( pSprmCIbstRMark );
        UINT32 nWWDate  = SVBT32ToLong(  pSprmCDttmRMark );
        WW8AuthorInfo aEntry( nWWAutNo );
        USHORT nPos;
        if( pAuthorInfos->Seek_Entry( &aEntry, &nPos ) )
        {
            const WW8AuthorInfo* pAuthor = pAuthorInfos->GetObject( nPos );
            if( pAuthor )
            {
                USHORT        nAutorNo = pAuthor->nOurId;
                DateTime      aStamp(WW8ScannerBase::WW8DTTM2DateTime(nWWDate));

                SwFltRedline  aNewAttr(eType, nAutorNo, aStamp);

                const SwFltRedline* pOldAttr =
                    (const SwFltRedline*)pCtrlStck->GetOpenStackAttr(
                                                        *pPaM->GetPoint(),
                                                        RES_FLTR_REDLINE );
                // 1st look if there is already another redline Attribute
                // set on this text-region
                // If so, we take it's data and store it as 'previous'
                //                              or the other way around
                if( pOldAttr )
                {           // Insert on top of Delete ?  This is not allowed !
                    BOOL bDateWrongWayAround
                            =    (REDLINE_INSERT == eType)
                              && (REDLINE_DELETE == pOldAttr->eType);
                    if(    bDateWrongWayAround
                        || (      (aStamp < pOldAttr->aStamp)
                             && ! (    (REDLINE_INSERT == pOldAttr->eType)
                                    && (REDLINE_DELETE == eType)
                                  )
                           )
                      )
                    {
                        if(     bDateWrongWayAround
                            && !(nAutorNo == pOldAttr->nAutorNo) )
                        {
                            aNewAttr.eTypePrev    = eType;
                            aNewAttr.nAutorNoPrev = nAutorNo;
                            aNewAttr.aStampPrev   = aStamp;
                            aNewAttr.eType        = pOldAttr->eType;
                            aNewAttr.nAutorNo     = pOldAttr->nAutorNo;
                            aNewAttr.aStamp       = pOldAttr->aStamp;
                        }
                        // else do nothing: so only the INSERT will be stored!
                    }
                    else
                    {
                        aNewAttr.eTypePrev    = pOldAttr->eType;
                        aNewAttr.nAutorNoPrev = pOldAttr->nAutorNo;
                        aNewAttr.aStampPrev   = pOldAttr->aStamp;
                    }
                }
                NewAttr( aNewAttr );
            }
        }
    }
}
// insert new content
void SwWW8ImplReader::Read_CFRMark(   USHORT nId, BYTE* pData, short nLen )
{
    Read_CRevisionMark( REDLINE_INSERT, nId, pData, nLen );
}
// delete old content
void SwWW8ImplReader::Read_CFRMarkDel(   USHORT nId, BYTE* pData, short nLen )
{
    Read_CRevisionMark( REDLINE_DELETE, nId, pData, nLen );
}
// change properties of content ( == char formating)
void SwWW8ImplReader::Read_CPropRMark( USHORT nId, BYTE* pData, short nLen )
{
    // complex (len is always 7)
    // 1 byte  - chp.fPropRMark
    // 2 bytes - chp.ibstPropRMark
    // 4 bytes - chp.dttmPropRMark;
    Read_CRevisionMark( REDLINE_FORMAT, nId, pData, nLen );
}


/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ww8/ww8par4.cxx,v 1.1.1.1 2000-09-18 17:14:58 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.31  2000/09/18 16:05:01  willem.vandorp
      OpenOffice header added.

      Revision 1.30  2000/08/22 17:09:02  cmc
      #77743# OLE Import, bad seek & bad FilterOptions

      Revision 1.29  2000/06/29 20:59:11  jp
      new MS Filteroptions - change OLE-Objects to StarOffice Objects

      Revision 1.28  2000/06/13 08:24:46  os
      using UCB

      Revision 1.27  2000/05/18 11:01:01  jp
      Changes for Unicode

      Revision 1.26  2000/05/16 11:06:24  khz
      Unicode code-conversion

      Revision 1.25  2000/05/05 14:06:55  cmc
      #75358# WW8 97Controls Import Fix

      Revision 1.24  2000/04/03 15:29:02  cmc
      #74329# Floating Form Controls

      Revision 1.23  2000/03/27 11:45:31  cmc
      #74329# Added OCX Reader to ImportOle

      Revision 1.22  2000/03/22 14:35:32  khz
      Task #74390# release pAutorInfo in case Insert() was not sucessful

      Revision 1.21  2000/02/28 12:04:32  khz
      Task #73544#: Use size and cropping from \3PIC stream rather than \3META

      Revision 1.20  2000/02/21 13:08:27  jp
      #70473# changes for unicode

      Revision 1.19  2000/02/11 14:40:23  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.18  1999/10/21 15:36:41  khz
      Import Redlining (4)

      Revision 1.17  1999/10/13 21:04:34  khz
      Import Redlining (3)

      Revision 1.16  1999/10/13 13:27:45  khz
      Import Redlining (2)

      Revision 1.15  1999/10/08 09:26:19  khz
      Import Redlining

      Revision 1.14  1999/09/08 13:26:09  khz
      Better performance by reducing use of SWAP..() and SVBT..To..() methods

      Revision 1.13  1999/08/30 19:53:06  JP
      Bug #68219#: no static members - be reentrant


      Rev 1.12   30 Aug 1999 21:53:06   JP
   Bug #68219#: no static members - be reentrant

      Rev 1.11   09 Aug 1999 14:16:10   JP
   read W95 format from stream

      Rev 1.10   30 Jul 1999 13:59:28   JP
   Bug #60140#: CreateSdrOLEFromStorage - read OLE1-Objects

      Rev 1.9   23 Jun 1999 12:46:58   JP
   delete unused variables

      Rev 1.8   26 Apr 1999 19:22:54   JP
   Bug #65298#: Grf/Ole bei Zeichenbindung immer Oben zu Grundline anordnen

      Rev 1.7   12 Jan 1999 12:29:54   MH
   chg: Syntax GCC

      Rev 1.6   30 Nov 1998 18:18:20   JP
   Task #59822#: OLE-Objecte importieren

      Rev 1.5   30 Nov 1998 17:46:54   JP
   Task #59822#: OLE-Objecte importieren

      Rev 1.4   27 Nov 1998 09:45:22   JP
   Task #59822#: OLE-Objecte importieren - Namen korrekt ermitteln

      Rev 1.3   25 Nov 1998 11:29:14   JP
   Task #59822#: OLE-Objecte einlesen - SetVisArea soll kein modified setzen

      Rev 1.2   24 Nov 1998 20:47:50   JP
   Task #59822#: OLE-Objecte einlesen

      Rev 1.1   18 Sep 1998 13:10:10   JP
   Bug #56310#: ImportOLE - die Zeichenbindung nicht doppelt machen

      Rev 1.0   16 Jun 1998 11:08:16   KHZ
   Initial revision.

*************************************************************************/




diff --git a/sw/source/filter/ww8/ww8par5.cxx b/sw/source/filter/ww8/ww8par5.cxx
new file mode 100644
index 0000000..9685eb0
--- /dev/null
+++ b/sw/source/filter/ww8/ww8par5.cxx
@@ -0,0 +1,3270 @@
/*************************************************************************
 *
 *  $RCSfile: ww8par5.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:58 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PCH
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#include <ctype.h>              // tolower
#include <stdio.h>              // sscanf()

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef SVTOOLS_URIHELPER_HXX
#include <svtools/urihelper.hxx>
#endif
#ifndef _UCBHELPER_CONTENT_HXX
#include <ucbhelper/content.hxx>
#endif
#include <tools/solar.h>
#ifndef _SVX_FONTITEM_HXX //autogen
#include <svx/fontitem.hxx>
#endif
#ifndef _SVX_FHGTITEM_HXX //autogen
#include <svx/fhgtitem.hxx>
#endif
#ifndef _URLOBJ_HXX //autogen
#include <tools/urlobj.hxx>
#endif
#ifndef _LINKMGR_HXX //autogen
#include <so3/linkmgr.hxx>
#endif

#ifndef _ZFORLIST_HXX
#include <svtools/zforlist.hxx>
#endif
#ifndef _SVX_LANGITEM_HXX //autogen
#include <svx/langitem.hxx>
#endif
#ifndef _UNOTOOLS_CHARCLASS_HXX
#include <unotools/charclass.hxx>
#endif

#ifndef _FMTFLD_HXX //autogen
#include <fmtfld.hxx>
#endif
#ifndef _FMTHBSH_HXX //autogen
#include <fmthbsh.hxx>
#endif
#ifndef _FMTANCHR_HXX //autogen
#include <fmtanchr.hxx>
#endif
#ifndef _PAM_HXX
#include <pam.hxx>              // fuer SwPam
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _CHARATR_HXX
#include <charatr.hxx>          // class SwFmtFld
#endif
#ifndef _FLDDAT_HXX
#include <flddat.hxx>           // class SwDateTimeField
#endif
#ifndef _DOCUFLD_HXX
#include <docufld.hxx>          // class SwPageNumberField
#endif
#ifndef _REFFLD_HXX
#include <reffld.hxx>           // class SwGetRefField
#endif
#ifndef _BOOKMRK_HXX            // class SwBookmark
#include <bookmrk.hxx>
#endif
#ifndef _EXPFLD_HXX
#include <expfld.hxx>           // class SwSetExpField
#endif
#ifndef _DBFLD_HXX
#include <dbfld.hxx>            // class SwDBField
#endif
#ifndef _FINDER_HXX
#include <finder.hxx>           // class SwPathFinder, GetTOIName()
#endif
#ifndef _TOX_HXX
#include <tox.hxx>
#endif
#ifndef _FLTINI_HXX
#include <fltini.hxx>           // ReadFilterFlags
#endif
#ifndef _SECTION_HXX
#include <section.hxx>          // class SwSection
#endif
#ifndef _WW8SCAN_HXX
#include <ww8scan.hxx>          // WW8FieldDesc
#endif
#ifndef _FLTSHELL_HXX
#include <fltshell.hxx>         // fuer den Attribut Stack
#endif
#ifndef _WW8PAR_HXX
#include <ww8par.hxx>
#endif
#ifndef _NDTXT_HXX
#include <ndtxt.hxx>
#endif
#ifndef _FMTINFMT_HXX
#include <fmtinfmt.hxx>
#endif
#ifndef _CHPFLD_HXX
#include <chpfld.hxx>
#endif
#ifndef _FTNIDX_HXX
#include <ftnidx.hxx>
#endif
#ifndef _TXTFTN_HXX
#include <txtftn.hxx>
#endif
#ifndef _VIEWSH_HXX
#include <viewsh.hxx>
#endif
#ifndef _SHELLRES_HXX
#include <shellres.hxx>
#endif

#define WWF_INVISIBLE 86            // Bit-Nummer fuer Invisible ( IniFlags )
#define MAX_FIELDLEN 64000


using namespace ::com::sun::star;
using namespace ::com::sun::star::ucb;
using namespace ::com::sun::star::uno;
using namespace ::ucb;
using namespace ::rtl;

extern void sw3io_ConvertFromOldField( SwDoc& rDoc, USHORT& rWhich,
                                USHORT& rSubType, ULONG &rFmt,
                                USHORT nVersion );



class _ReadFieldParams
{
    String aData;
    xub_StrLen nLen, nFnd, nNext, nSavPtr;
//  sal_Unicode cLastChar;

public:
    _ReadFieldParams( const String& rData );
    ~_ReadFieldParams();

    xub_StrLen GoToTokenParam();
    long SkipToNextToken();
    xub_StrLen GetTokenSttPtr() const   { return nFnd;  }
    void SetNextPtr( xub_StrLen _nNext ) { nNext = _nNext; }

    xub_StrLen FindNextStringPiece( xub_StrLen _nStart = STRING_NOTFOUND );
    BOOL GetTokenSttFromTo(xub_StrLen* _pFrom, xub_StrLen* _pTo, xub_StrLen _nMax);

    String GetResult() const;
};


_ReadFieldParams::_ReadFieldParams( const String& _rData )
    : aData( _rData ), nLen( _rData.Len() ), nNext( 0 )
{
    /*
        erstmal nach einer oeffnenden Klammer oder einer Leerstelle oder einem
        Anfuehrungszeichen oder einem Backslash suchen, damit der Feldbefehl
        (also INCLUDEPICTURE bzw EINFUeGENGRAFIK bzw ...) ueberlesen wird
    */
    while( (nLen > nNext) && (aData.GetChar( nNext ) == ' ') )
        ++nNext;

    sal_Unicode c;
    while(     nLen > nNext
            && (c = aData.GetChar( nNext )) != ' '
            && c != '"'
            && c != '\\'
            && c != 132  )
        ++nNext;

    nFnd      = nNext;
    nSavPtr   = nNext;
//  cLastChar = aData.GetChar( nSavPtr );
}


_ReadFieldParams::~_ReadFieldParams()
{
//  aData.SetChar( nSavPtr, cLastChar );
}


String _ReadFieldParams::GetResult() const
{
    return    (STRING_NOTFOUND == nFnd)
            ? aEmptyStr
            : aData.Copy( nFnd, (nSavPtr - nFnd) );
}


xub_StrLen _ReadFieldParams::GoToTokenParam()
{
    xub_StrLen nOld = nNext;
    if( -2 == SkipToNextToken() )
        return GetTokenSttPtr();
    nNext = nOld;
    return STRING_NOTFOUND;
}

long _ReadFieldParams::SkipToNextToken() // ret: -2: NOT a '\' parameter but normal Text
{
    long nRet = -1;     // Ende
//  aData.SetChar( nSavPtr, cLastChar );
    if(    (STRING_NOTFOUND != nNext)
        && (nLen > nNext)
        && STRING_NOTFOUND != ( nFnd = FindNextStringPiece( nNext ) ))
    {
        nSavPtr = nNext;
//      cLastChar = aData.GetChar( nSavPtr );

        if(    '\\' == aData.GetChar( nFnd )
            && '\\' != aData.GetChar( nFnd + 1 ) ) // Options-Parameter gefunden
        {
            nRet = aData.GetChar( ++nFnd );
            nNext = ++nFnd;             // und dahinter setzen
        }
        else
        {
            nRet = -2;
            if(    (STRING_NOTFOUND != nSavPtr )
                && ('"' == aData.GetChar( nSavPtr - 1 )) )
            {
                nSavPtr--;
//              cLastChar = aData.GetChar( nSavPtr );
            }
//          aData.SetChar( nSavPtr, 0 );
        }
    }
    return nRet;
}

// FindNextPara sucht naechsten Backslash-Parameter oder naechste Zeichenkette
// bis zum Blank oder naechsten "\" oder zum schliessenden Anfuehrungszeichen
// oder zum String-Ende von pStr.
//
// Ausgabe ppNext (falls ppNext != 0) Suchbeginn fuer naechsten Parameter bzw. 0
//
// Returnwert: 0 falls String-Ende erreicht,
//             ansonsten Anfang des Paramters bzw. der Zeichenkette
//
xub_StrLen _ReadFieldParams::FindNextStringPiece(const xub_StrLen nStart)
{
    xub_StrLen  n = ( STRING_NOTFOUND == nStart ) ? nFnd : nStart;  // Anfang
    xub_StrLen n2;          // Ende

    nNext = STRING_NOTFOUND;        // Default fuer nicht gefunden

    while( (nLen > n) && (aData.GetChar( n ) == ' ') )
        ++n;

    if( nLen == n )
        return STRING_NOTFOUND;     // String End reached!

    if(     (aData.GetChar( n ) == '"')     // Anfuehrungszeichen vor Para?
        ||  (aData.GetChar( n ) == 132) )
    {
        n++;                        // Anfuehrungszeichen ueberlesen
        n2 = n;                     // ab hier nach Ende suchen
        while(     (nLen > n2)
                && (aData.GetChar( n2 ) != '"')
                && (aData.GetChar( n2 ) != 147) )
            n2++;                   // Ende d. Paras suchen
    }
    else                        // keine Anfuehrungszeichen
    {
        n2 = n;                     // ab hier nach Ende suchen
        while( (nLen > n2) && (aData.GetChar( n2 ) != ' ') ) // Ende d. Paras suchen
        {
            if( aData.GetChar( n2 ) == '\\' )
            {
                if( aData.GetChar( n2+1 ) == '\\' )
                    n2 += 2;        // Doppel-Backslash -> OK
                else
                {
                    if( n2 > n )
                        n2--;
                    break;          // einfach-Backslash -> Ende
                }
            }
            else
                n2++;               // kein Backslash -> OK
        }
    }
    if( nLen > n2 )
    {
        if(aData.GetChar( n2 ) != ' ') n2++;
        nNext = n2;
    }
    return n;
}



// read parameters "1-3" or 1-3 with both values between 1 and nMax
BOOL _ReadFieldParams::GetTokenSttFromTo(USHORT* pFrom, USHORT* pTo, USHORT nMax)
{
    USHORT nStart = 0;
    USHORT nEnd   = 0;
    xub_StrLen n = GoToTokenParam();
    if( STRING_NOTFOUND != n )
    {

        String sParams( GetResult() );

        xub_StrLen nIndex = 0;
        String sStart( sParams.GetToken(0, '-', nIndex) );
        if( STRING_NOTFOUND != nIndex )
        {
            nStart = sStart.ToInt32();
            nEnd   = sParams.Copy( nIndex ).ToInt32();
        }
    }
    if( pFrom ) *pFrom = nStart;
    if( pTo )   *pTo   = nEnd;

    return nStart && nEnd && (nMax >= nStart) && (nMax >= nEnd);
}




/*  */


//----------------------------------------
//    Initialisieren der Feld-FilterFlags
//----------------------------------------

void SwWW8ImplReader::Read_FieldIniFlags()
{
    USHORT i;
    nFieldFlags = ReadFilterFlags( "WWF" );
    if ( SwFltGetFlag( nFieldFlags, SwFltControlStack::HYPO ) ){
        SwFltSetFlag( nFieldFlags, SwFltControlStack::BOOK_TO_VAR_REF );
        SwFltSetFlag( nFieldFlags, SwFltControlStack::TAGS_DO_ID );
        SwFltSetFlag( nFieldFlags, SwFltControlStack::TAGS_IN_TEXT );
        SwFltSetFlag( nFieldFlags, SwFltControlStack::ALLOW_FLD_CR );
        for( i = 0; i < 3; i++ ){
            nFieldTagAlways[i] = 0;         // Hypo-Default: bekannte Felder
        }                                   // nicht taggen
        nFieldTagBad[0] = 0xffffffff;       // unbekannte Felder taggen
        nFieldTagBad[1] = 0xffffffff;       //
        nFieldTagBad[2] = 0xffffffef;       // "EinfuegenText" nicht taggen
    }else{
        nFieldTagAlways[0] = ReadFilterFlags( "WWFA0" );
        nFieldTagAlways[1] = ReadFilterFlags( "WWFA1" );
        nFieldTagAlways[2] = ReadFilterFlags( "WWFA2" );
        nFieldTagBad[0] = ReadFilterFlags( "WWFB0" );
        nFieldTagBad[1] = ReadFilterFlags( "WWFB1" );
        nFieldTagBad[2] = ReadFilterFlags( "WWFB2" );
    }
}

//----------------------------------------
//              Bookmarks
//----------------------------------------

long SwWW8ImplReader::Read_Book( WW8PLCFManResult* pRes, BOOL bStartAttr )
{
    if( !bStartAttr )
    {
        ASSERT( bStartAttr, "Read_Book::Nanu ?" );
        pEndStck->SetAttr( *pPaM->GetPoint(), RES_FLTR_BOOKMARK );
        return 0;
    }
    WW8PLCFx_Book* pB = pPlcxMan->GetBook();    // muesste auch ueber pRes.nCo2OrIdx gehen
    if( !pB ){
        ASSERT( pB, "WW8PLCFx_Book - Pointer nicht da" );
        return 0;
    }

    if( pB->GetIsEnd() ){
#if 0
        rDoc.Insert( *pPaM, 'E', CHARSET_ANSI );
#endif
        pEndStck->SetAttr( *pPaM->GetPoint(), RES_FLTR_BOOKMARK,
                           TRUE, pB->GetHandle() );
        return 0;
    }

    eBookStatus eB = pB->GetStatus();
    if( ( eB & BOOK_IGNORE ) != 0 )
        return 0;                               // Bookmark zu ignorieren
#if 0
        rDoc.Insert( *pPaM, 'A', CHARSET_ANSI );
#endif

    const String* pName = pB->GetName();
    if(    !pName
        || pName->EqualsIgnoreCaseAscii( "_Toc" ) ) // "_Toc*" ist ueberfluessig
        return 0;

//JP 16.11.98: ToUpper darf auf keinen Fall gemacht werden, weil der Bookmark-
//              name ein Hyperlink-Ziel sein kann!

    // Fuer UEbersetzung Bookmark -> Variable setzen
    long nLen = pB->GetLen();
    if( nLen > MAX_FIELDLEN )
        nLen = MAX_FIELDLEN;

    String sTxt;
    long nOldPos = pStrm->Tell();
    nLen = pSBase->WW8ReadString( *pStrm, sTxt, pB->GetStartPos(), nLen,
                                    eStructCharSet );

    pStrm->Seek( nOldPos );
    String aVal;
    QuoteString( aVal, sTxt );          // Nur druckbare Zeichen !
                                        // incl. Zeichensatz - UEbersetzung

    pEndStck->NewAttr( *pPaM->GetPoint(), SwFltBookmark( *pName, aVal,
                        pB->GetHandle(), ( eB & BOOK_ONLY_REF ) != 0 ) );
    return 0;
}

//----------------------------------------------------------------------
//    allgemeine Hilfsroutinen zum Auseinanderdroeseln der Parameter
//----------------------------------------------------------------------

// ConvertFFileName uebersetzt FeldParameter-Namen u. ae. in den
// System-Zeichensatz.
// Gleichzeitig werden doppelte Backslashes in einzelne uebersetzt.
void SwWW8ImplReader::ConvertFFileName( String& rName, const String& rOrg )
{
    rName = rOrg;
    rName.SearchAndReplaceAllAscii( "\\\\", String( '\\' ));

    // ggfs. anhaengende Anfuehrungszeichen entfernen
    if( rName.Len() &&  '"' == rName.GetChar( rName.Len()-1 ))
        rName.Erase( rName.Len()-1, 1);
}

// ConvertUFNneme uebersetzt FeldParameter-Namen u. ae. in den
// System-Zeichensatz und Upcased sie ( z.B. fuer Ref-Felder )
void SwWW8ImplReader::ConvertUFName( String& rName )
{
    GetAppCharClass().toUpper( rName );
}

void lcl_ConvertSequenceName( SwWW8ImplReader& rReader, String& rSequenceName )
{
    rReader.ConvertUFName( rSequenceName );
    if(    '0' <= rSequenceName.GetChar( 0 )
        && '9' >= rSequenceName.GetChar( 0 ) )
        rSequenceName.Insert('_', 0);
}
/*
// FindNextPara sucht Naechsten Parameter und setzt
// eine 0 hinter sein Ende ( im Original-String )!
// Bei Anfuehrungszeichen
// ( normal oder typographisch ) wird der ganze String genommen.
// Escape-Chars ( Backslash ) werden nicht beachtet.
// Rueckgabe: wenn ppNext != 0 dann Suchbeginn fuer naechsten Parameter
//            Return 0 fuer nicht gefunden oder Anfang des Paramters
static char* FindNextPara( char* pStr, char** ppNext = 0 )
{
    if( ppNext )
        *ppNext = 0;                // Default fuer nicht gefunden
    char* p = pStr;                 // Anfang
    char* p2;                       // Ende

    while( *p == ' ' )              // Spaces vor Para ueberlesen
        p++;
    if( !*p )
        return 0;
    if( *p == '"' || *(BYTE*)p == 132 ){    // Anfuehrungszeichen vor Para
        p++;                        // Anfuehrungszeichen ueberlesen
        p2 = p;                     // ab hier nach Ende suchen
        while( *p2 != '"' && *(BYTE*)p2 != 147 && *p2 != 0 )
            p2++;                   // Ende d. Paras suchen
    }else{                          // keine Anfuehrungszeichen
        p2 = p;                     // ab hier nach Ende suchen
        while( *p2 != ' ' && *p2 != 0 ){ // Ende d. Paras suchen
            if( *p2 == '\\' ){
                if( *(p2 + 1) == '\\' )
                    p2 += 2;        // Doppel-Backslash -> OK
                else
                    break;          // einfach-Backslash -> Ende
            }else{
                p2++;               // kein Backslash -> OK
            }
        }
    }
    *p2 = 0;                        // p ist jetzt String auf Para
    if( ppNext )
        *ppNext = p2 + 1;
    return p;
}

// FindNextPara2 funktioniert wie FindNextPara, jedoch wird beim
// Weglassen von Anfuehrungszeichen bis zum Backslash gesucht
// und nicht nur bis zum Space. Wird fuer Macro-AnzeigeTexte benutzt.
static char* FindNextPara2( char* pStr, char** ppNext = 0 )
{
    if( ppNext )
        *ppNext = 0;                // Default fuer nicht gefunden
                                    // #64447#
    char* p = pStr;                 // Anfang
    char* p2;                       // Ende

    while( *p == ' ' )              // Spaces vor Para ueberlesen
        p++;
    if( !*p )
        return 0;
    if( *p == '"' || *(BYTE*)p == 132 ){    // Anfuehrungszeichen vor Para
        p++;                        // Anfuehrungszeichen ueberlesen
        p2 = p;                     // ab hier nach Ende suchen
        while( *p2 != '"' && *(BYTE*)p2 != 147 && *p2 != 0 )
            p2++;                   // Ende d. Paras suchen
    }else{                          // keine Anfuehrungszeichen
        p2 = p;                     // ab hier nach Ende suchen
        while( *p2 != 0 && *p2 != '\\' )
            p2++;                   // Ende d. Paras suchen
    }
    *p2 = 0;                        // p ist jetzt String auf Para
    if( ppNext )
        *ppNext = p2 + 1;
    return p;
}

// Find1stPara sucht 1. Parameter und setzt
// eine 0 hinter sein Ende ( im Original-String )!
// Dabei wird das 2. Wort des Strings gesucht. Bei Anfuehrungszeichen
// ( normal oder typographisch ) wird der ganze String genommen.
// Escape-Chars ( Backslash ) werden nicht beachtet.
// Rueckgabe: wenn ppNext != 0 dann Suchbeginn fuer naechsten Parameter
//            Return 0 fuer nicht gefunden oder Anfang des Paramters
static char* Find1stPara( char* pStr, char** ppNext = 0 )
{
    // Anfang
    char* p = pStr;

    while( *p == ' ' )              // evtl. Spaces vor Feldtyp ueberlesen
        p++;
    while( *p != ' ' && *p != 0     // FeldTyp ueberlesen
           && *p != '"' && *(BYTE*)p != 132 )

        p++;

    // Ende
    char* p2 = pStr;

    while( *p == ' ' )              // Spaces vor Para ueberlesen
        p++;
    if( !*p )
        return 0;
    if( *p == '"' || *(BYTE*)p == 132 ){    // Anfuehrungszeichen vor Para
        p++;                        // Anfuehrungszeichen ueberlesen
        p2 = p;                     // ab hier nach Ende suchen
        while( *p2 != '"' && *(BYTE*)p2 != 147 && *p2 != 0 )
            p2++;                   // Ende d. Paras suchen
    }else{                          // keine Anfuehrungszeichen
        p2 = p;                     // ab hier nach Ende suchen
        while( *p2 != ' ' && *p2 != 0 )
            p2++;                   // Ende d. Paras suchen
    }
    *p2 = 0;                        // p ist jetzt String auf Para
    if( ppNext )
        *ppNext = p2 + 1;
    return p;
}
*/

// FindParaStart() finds 1st Parameter that follows '\' and cToken
// and returns start of this parameter or STRING_NOT_FOUND.
xub_StrLen FindParaStart( const String& rStr, sal_Unicode cToken, sal_Unicode cToken2 )
{
    BOOL bStr = FALSE;          // innerhalb String ignorieren

    for( xub_StrLen nBuf=0; nBuf+1 < rStr.Len(); nBuf++ )
    {
        if( rStr.GetChar( nBuf ) == '"' )
            bStr = !bStr;

        if(    !bStr
            && rStr.GetChar( nBuf ) == '\\'
            && (    rStr.GetChar( nBuf + 1 ) == cToken
                 || rStr.GetChar( nBuf + 1 ) == cToken2 ) )
        {
            nBuf += 2;
            // skip spaces between cToken and it's parameters
            while(    nBuf < rStr.Len()
                   && rStr.GetChar( nBuf ) == ' ' )
                nBuf++;
            return nBuf < rStr.Len() ? nBuf : STRING_NOTFOUND; // return start of parameters
        }
    }
    return STRING_NOTFOUND;
}

// FindPara() findet den ersten Parameter mit '\' und cToken. Es wird
// ein neuer String allokiert ( der vom Aufrufer deallokiert werden muss )
// und alles, was zum Parameter gehoert, wird in ihm zurueckgeliefert.
String FindPara( const String& rStr, sal_Unicode cToken, sal_Unicode cToken2 )
{
    xub_StrLen n2;                                          // Ende
    xub_StrLen n = FindParaStart( rStr, cToken, cToken2 );  // Anfang
    if( STRING_NOTFOUND == n )
        return aEmptyStr;

    if(    rStr.GetChar( n ) == '"'
        || rStr.GetChar( n ) == 132 )
    {                               // Anfuehrungszeichen vor Para
        n++;                        // Anfuehrungszeichen ueberlesen
        n2 = n;                     // ab hier nach Ende suchen
        while(     n2 < rStr.Len()
                && rStr.GetChar( n2 ) != 147
                && rStr.GetChar( n2 ) != '"' )
            n2++;                   // Ende d. Paras suchen
    }
    else
    {                           // keine Anfuehrungszeichen
        n2 = n;                     // ab hier nach Ende suchen
        while(     n2 < rStr.Len()
                && rStr.GetChar( n2 ) != ' ' )
            n2++;                   // Ende d. Paras suchen
    }
    return rStr.Copy( n, n2-n );
}


static SvxExtNumType GetNumTypeFromName( const String& rStr, BOOL bAllowPageDesc = FALSE )
{
    SvxExtNumType eTyp = bAllowPageDesc ? SVX_NUM_PAGEDESC : SVX_NUM_ARABIC;
    if( rStr.EqualsIgnoreCaseAscii( "Arabi", 0, 5 ) )  // Arabisch, Arabic
        eTyp = SVX_NUM_ARABIC;
    else if( rStr.EqualsIgnoreCaseAscii( "misch", 2, 5 ) )  // r"omisch
        eTyp = SVX_NUM_ROMAN_LOWER;
    else if( rStr.EqualsIgnoreCaseAscii( "MISCH", 2, 5 ) )  // R"OMISCH
        eTyp = SVX_NUM_ROMAN_UPPER;
    else if( rStr.EqualsIgnoreCaseAscii( "alphabeti", 0, 9 ) )// alphabetisch, alphabetic
        eTyp =  ( rStr.GetChar( 0 ) == 'A' )
                ? SVX_NUM_CHARS_UPPER_LETTER_N
                : SVX_NUM_CHARS_LOWER_LETTER_N;
    else if( rStr.EqualsIgnoreCaseAscii( "roman", 0, 5 ) )  // us
        eTyp =  ( rStr.GetChar( 0 ) == 'R' )
                ? SVX_NUM_ROMAN_UPPER
                : SVX_NUM_ROMAN_LOWER;
    return eTyp;
}


static SvxExtNumType GetNumberPara( String& rStr, BOOL bAllowPageDesc = FALSE )
{
    String s( FindPara( rStr, '*', '*' ) );     // Ziffernart
    SvxExtNumType aType = GetNumTypeFromName( s, bAllowPageDesc );
    return aType;
}


ULONG MSDateTimeFormatToSwFormat( String& rParams, SwDoc& rDoc, USHORT nLang )
{
    // get Doc Numberformatter
    SvNumberFormatter* pFormatter = rDoc.GetNumberFormatter();

    // tell the Formatter about the new entry
    UINT16 nCheckPos = 0;
    INT16  nType = NUMBERFORMAT_DEFINED;
    ULONG  nKey = 0;

//  if( !
    pFormatter->PutandConvertEntry(  rParams, nCheckPos, nType, nKey,
            nLang, LANGUAGE_SYSTEM )
;//)
//      nKey = 0;

    return nKey;
}

static short GetTimeDatePara( SwDoc& rDoc, String& rStr, ULONG& rFormat )
{
    String aParams( FindPara( rStr, '@', '@' ) );// Date/Time
    if( 0 == aParams.Len() )
    {                               // No Date / Time
        rFormat =  NF_DATE_SYS_NNNNDMMMMYYYY;
        return NUMBERFORMAT_DATE;
    }

    const SvxLanguageItem& rLang = (SvxLanguageItem&)(rDoc.GetAttrPool().
                    GetDefaultItem( RES_CHRATR_LANGUAGE ));

    ULONG nNumFmtIdx = MSDateTimeFormatToSwFormat( aParams, rDoc,
                                                    rLang.GetValue() );

    short nNumFmtType = NUMBERFORMAT_UNDEFINED;
    if( nNumFmtIdx )
    {
        SvNumberFormatter* pFormatter = rDoc.GetNumberFormatter();
        nNumFmtType = pFormatter->GetType( nNumFmtIdx );
    }
    rFormat = nNumFmtIdx;

    return nNumFmtType;

}


/*
    Class ''WW8FldParaGuess'' removed as obsolete.    (khz, 05/15/2000)

    We are using class ''_ReadFieldParams'' instead.

//-----------------------------------------------------------------------
//       class WW8FldParaGuess
// Erraten von Parametern, auch bei weggelassenen oder typographischen
// Anfuehrungszeichen. Es wird versucht, dem WW-Interpreter in allen
// zweifelhafen Faellen moeglichst nahe zu kommen....
//-----------------------------------------------------------------------

// class WW8FldParaGuess uebernimmt die Feld-Parametererkennung,
// z.Zt. nur fuer INHALT- und XE-PseudoFelder und fuer TOX-Felder.
// Der Default-Parameter ( ohne "\" ) wird mit, ohne und mit typographischen
// Anfuehrungszeichen erkannt. Andere Parameter genauso.
// Dabei ist die Toleranz der Erkennung ( Falsche oder teilweise
// Anfuehrungszeichen, Switches vorne oder hinten, ... ) dem WW-Interpreter
// so weit wie moeglich angepasst.

class WW8FldParaGuess{
    unsigned char* pFld;                // FeldCode
    unsigned char* pEnd;                // Ende FeldCode
    unsigned char* pStdPara;            // Pointer in pFld auf Standard-Parameter
    unsigned char **ppSwitch;       // Array von Zeigern in pFld auf Switch-Inhalte
    BYTE nSwitches;         // Anzahl der zu erkennenden Switches
    BOOL bOk;
    BOOL bVanish;

    void InitSwitches( const char* pSwitchPara );

public:
    //WW8FldParaGuess( SvStream& rStrm, const char* pSwitchPara, WW8_FC fcMin );
    WW8FldParaGuess( unsigned char* pCode, const char* pSwitchPara );
    ~WW8FldParaGuess();
    BOOL Ok() const { return bOk; };
    const unsigned char* GetStdPara() const { return ( bOk ) ? pStdPara : 0; };
    const unsigned char* GetSwitch( BYTE nIdx ) const
                { return ( nIdx < nSwitches ) ? ppSwitch[nIdx] : 0; };
    const BOOL GetSwitchRange( BYTE nIdx, USHORT* pnStart, USHORT* pnEnd )
        const;
};

// WWIsQuote( c ) : ist c ein normales oder typographisches Anfuehrungszeichen ?
inline static BOOL WWIsQuote( char c )
{
    return c == '"' || (BYTE)c == 132 || (BYTE)c == 147;
}

// WWIsQuoteEnd( c ) : ist c ein normales oder typographisches Anfuehrungszeichen
// oder eine \0 ?
inline static BOOL WWIsQuoteEnd( char c )
{
    return c == '"' || (BYTE)c == 132 || (BYTE)c == 147 || c == 0;
}

// WWIsNoQuoteEnd( c ) : ist c ein Space oder ein normales oder typographisches
// Anfuehrungszeichen oder eine \0 ?
inline static BOOL WWIsNoQuoteEnd( char c )
{
    return c == ' ' || c == '"' || (BYTE)c == 132 || (BYTE)c == 147 || c == 0;
}

void WW8FldParaGuess::InitSwitches( const char* pSwitchPara )
{
    pStdPara = 0;
    ppSwitch = 0;

    nSwitches = ( pSwitchPara ) ? strlen( pSwitchPara ) : 0;
    if( nSwitches ){
        ppSwitch = new unsigned char*[nSwitches];
        memset( ppSwitch, 0, sizeof( unsigned char* ) * nSwitches );
    }
#ifdef DEBUG
    unsigned char* (*ppSwitchD)[10]
        = (unsigned char*(*)[10])ppSwitch;  // zum Ansehen im Debugger
    typedef unsigned char* WWCharPtr;
    typedef WWCharPtr WW10CharPtr[10];
    typedef WW10CharPtr* WWp10CharPtr;
    WWp10CharPtr ppSD = (WWp10CharPtr)ppSwitch;
#endif

    unsigned char* p;
    for( p = pFld; p < pEnd; p++ ){
        while( *p == ' ' )                  // Spaces ueberlesen
            p++;
        BOOL bTok = p[0] == '\\' && p[1] != '\\';
        BYTE nSw = 0;
        if( bTok ){
            for( nSw = 0; nSw < nSwitches; nSw++ ){
                unsigned char c = pSwitchPara[nSw];
                if ( p[1] == c || p[1] == toupper(c) )  // keine Umlaute noetig
                    break;                              // OK, gueltiges Token
            }
            bTok = nSw < nSwitches;         // doch kein gueltiges Token ?
        }
        if( bTok ){                         // Token isolieren
            unsigned char* p2 = p + 2;
            while( *p2 == ' ' )             // Spaces vor Parameter ueberlesen
                p2++;
            if( WWIsQuote( *p2 ) ){         // in " eingeschlossen
                unsigned char *p3 = p2 + 1; // Anfang gefunden
                if( nSwitches )
                    ppSwitch[nSw] = p3;     // bei mehreren gleichen gilt der letzte
                while( !WWIsQuoteEnd( *p3 ) )// Ende suchen
                    p3++;
                *p3 = 0;                    // Ende markieren
                p = p3;                     // ab hier weitersuchen
            }
            else
            {                           // nicht gequotet
                unsigned char *p3 = p2;
                if( nSwitches )
                    ppSwitch[nSw] = p2;     // Anfang gefunden ( letzter gilt )
                while( (p3 < pEnd) && !WWIsNoQuoteEnd( *p3 ) )  // Ende suchen
                    p3++;
                *p3 = 0;                    // Ende markieren
                p = p3;                     // ab hier weitersuchen
            }
        }else if( !pStdPara ){              // nur der erste kommt durch
            unsigned char* p2;
            if( WWIsQuote( *p ) ){          // in " eingeschlossen
                p2 = pStdPara = p + 1;      // Anfang gefunden
                while( !WWIsQuoteEnd( *p2 ) )// Ende suchen
                    p2++;
            }
            else
            {                           // nicht gequotet
                p2 = pStdPara = p;
                while( (p2 < pEnd) && !WWIsNoQuoteEnd( *p2 ) )  // Ende suchen
                    p2++;
            }
            *p2 = 0;                        // Ende markieren
            p = p2;                         // ab hier weitersuchen
        }
    }
}


// ctor WW8FldParaGuess, Erklaerung siehe anderer ctor.
WW8FldParaGuess::WW8FldParaGuess( unsigned char* pCode,
                                    const char* pSwitchPara )
:pStdPara( 0 ), ppSwitch( 0 ), nSwitches( 0 ), bOk( TRUE ), bVanish( FALSE )
{
    pFld = pEnd = pCode;
    // search field code end
    while( *pEnd && (0x014 != *pEnd) && (0x015 != *pEnd) )
        ++pEnd;
    InitSwitches( pSwitchPara );
}

WW8FldParaGuess::~WW8FldParaGuess()
{
    if( bVanish )               // ja -> ctor hat alloziert
        delete[] ( pFld );
    delete[] ( ppSwitch );
}

// GetSwitchRange() interpretiert Parameter, die zwingend ein '-' zwischen
// 2 USHORTs haben, z.B. VERZEICHNIS \o "1-3"
const BOOL WW8FldParaGuess::GetSwitchRange( BYTE nIdx, USHORT* pnStart,
USHORT* pnEnd ) const
{
    if( nIdx >= nSwitches )
        return FALSE;
    unsigned char* p = ppSwitch[nIdx];
    if( !p )
        return FALSE;
    unsigned char* p1 = (unsigned char*)strchr( (char*)p, '-' );
    if( !p1 )
        return FALSE;
    *p1++ = 0;
    int nVal;
    sscanf( (char*)p, "%d", &nVal );
    *pnStart = (USHORT)nVal;
    sscanf( (char*)p1, "%d", &nVal );
    *pnEnd = (USHORT)nVal;
    return TRUE;
}
*/

//-----------------------------------------
//              Felder
//-----------------------------------------
// Am Ende des Einlesens entsprechende Felder updaten ( z.Zt. die Referenzen )
void SwWW8ImplReader::UpdateFields()
{
//  rDoc.GetSysFldType( RES_GETREFFLD )->UpdateFlds();  // Referenzen
//  rDoc.UpdateFlds();                                  // SetExp-Fields
//  rDoc.UpdateFlds();              // alles ???
//  rDoc.UpdateExpFlds();                               // SetExp-Fields
    rDoc.SetUpdateExpFldStat();                 // JP: neu fuer alles wichtige
    rDoc.SetInitDBFields( TRUE );               // Datenbank-Felder auch
}

typedef eF_ResT (SwWW8ImplReader:: *FNReadField)( WW8FieldDesc*, String& );
static FNReadField aWW8FieldTab[93] = {
0,
0,
0,
&SwWW8ImplReader::Read_F_Ref,               // 3
0,
0,
&SwWW8ImplReader::Read_F_Set,               // 6
0,
&SwWW8ImplReader::Read_F_Tox,               // 8
0,
0,
0,
&SwWW8ImplReader::Read_F_Seq,               // 12
&SwWW8ImplReader::Read_F_Tox,               // 13
&SwWW8ImplReader::Read_F_DocInfo,           // 14
&SwWW8ImplReader::Read_F_DocInfo,           // 15
&SwWW8ImplReader::Read_F_DocInfo,           // 16
&SwWW8ImplReader::Read_F_Author,            // 17
&SwWW8ImplReader::Read_F_DocInfo,           // 18
&SwWW8ImplReader::Read_F_DocInfo,           // 19
&SwWW8ImplReader::Read_F_DocInfo,           // 20
&SwWW8ImplReader::Read_F_DocInfo,           // 21
&SwWW8ImplReader::Read_F_DocInfo,           // 22
&SwWW8ImplReader::Read_F_DocInfo,           // 23
&SwWW8ImplReader::Read_F_DocInfo,           // 24
&SwWW8ImplReader::Read_F_DocInfo,           // 25
&SwWW8ImplReader::Read_F_Anz,               // 26
&SwWW8ImplReader::Read_F_Anz,               // 27
&SwWW8ImplReader::Read_F_Anz,               // 28
&SwWW8ImplReader::Read_F_FileName,          // 29
&SwWW8ImplReader::Read_F_TemplName,         // 30
&SwWW8ImplReader::Read_F_DateTime,          // 31
&SwWW8ImplReader::Read_F_DateTime,          // 32
&SwWW8ImplReader::Read_F_CurPage,           // 33
0,
0,
0,
&SwWW8ImplReader::Read_F_PgRef,             // 37
&SwWW8ImplReader::Read_F_InputVar,          // 38
&SwWW8ImplReader::Read_F_Input,             // 39
0,
&SwWW8ImplReader::Read_F_DBNext,            // 41
0,
0,
&SwWW8ImplReader::Read_F_DBNum,             // 44
0,
0,
0,
0,
0,
0,
&SwWW8ImplReader::Read_F_Macro,             // 51
&SwWW8ImplReader::Read_F_ANumber,           // 52
&SwWW8ImplReader::Read_F_ANumber,           // 53
&SwWW8ImplReader::Read_F_ANumber,           // 54
0,


0,      // 56: VERKNUePFUNG     // fehlt noch !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


&SwWW8ImplReader::Read_F_Symbol,            // 57
&SwWW8ImplReader::Read_F_Embedd,            // 58
&SwWW8ImplReader::Read_F_DBField,           // 59
0,
0,
0,
0,
0,
0,
0,
&SwWW8ImplReader::Read_F_IncludePicture,    // 67
&SwWW8ImplReader::Read_F_IncludeText,       // 68
0,
&SwWW8ImplReader::Read_F_FormTextBox,       // 70
&SwWW8ImplReader::Read_F_FormCheckBox,      // 71
&SwWW8ImplReader::Read_F_NoteReference,     // 72
0, /*&SwWW8ImplReader::Read_F_Tox*/
0,
0,
0,
0,
0,
0,
0,
0,
0,
&SwWW8ImplReader::Read_F_FormListBox,       // 83
0,                                          // 84
&SwWW8ImplReader::Read_F_DocInfo,           // 85
0,                                          // 86
&SwWW8ImplReader::Read_F_OCX,               // 87
&SwWW8ImplReader::Read_F_Hyperlink,         // 88
0,                                          // 89
0,                                          // 90
0,                                          // 91
0                                           // 92 - Dummy leer Methode
 };                                         // 92   == alle ueber 91



// Read_Field liest ein Feld ein oder, wenn es nicht gelesen werden kann,
// wird 0 zurueckgegeben, so dass das Feld vom Aufrufer textuell gelesen wird.
// Returnwert: Gesamtlaenge des Feldes ( zum UEberlesen )
long SwWW8ImplReader::Read_Field( WW8PLCFManResult* pRes, BOOL )
{
    ASSERT( ( sizeof( aWW8FieldTab ) / sizeof( *aWW8FieldTab ) == 93 ),
            "FeldFunc-Tabelle stimmt nicht" );
    if( nIniFlags & WW8FL_NO_FLD )
        return 0;

    WW8FieldDesc aF;

    WW8PLCFx_FLD* pF = pPlcxMan->GetFld();
    ASSERT( pF, "WW8PLCFx_FLD - Pointer nicht da" );
    if( !pF ) return 0;

    BOOL bOk = pF->GetPara( pRes->nCp2OrIdx, aF );

    USHORT n = ( aF.nId <= 91 ) ? aF.nId : 92; // alle > 91 werden 92
    USHORT nI = n / 32;                     // # des UINT32
    ULONG nMask = 1 << ( n % 32 );          // Maske fuer Bits

    if( nFieldTagAlways[nI] & nMask )       // Flag: Tag it
        return Read_F_Tag( &aF );           // Resultat nicht als Text

    if( !bOk || !aF.nId )                   // Feld kaputt
        return aF.nLen;                     // -> ignorieren

    if( aF.nId > 91
//      || ( aF.nOpt & 0x40 )               // 0x40-Result Nest -> OK
                             )              // WW: Nested Field
        if( nFieldTagBad[nI] & nMask )      // Flag: Tag it when bad
            return Read_F_Tag( &aF );       // Resultat nicht als Text
        else
            return aF.nLen;

    if( aWW8FieldTab[aF.nId] == 0           // keine Routine vorhanden
        || aF.bCodeNest )
    {
        if( nFieldTagBad[nI] & nMask )      // Flag: Tag it when bad
            return Read_F_Tag( &aF );       // Resultat nicht als Text
                                            // Lese nur Resultat
        if( aF.bResNest )
            return aF.nLen;                 // Result nested -> nicht brauchbar

        return aF.nLen - aF.nLRes - 1;  // so viele ueberlesen, das Resultfeld
                                        // wird wie Haupttext eingelesen

    }
    else
    {                                   // Lies Feld
        long nOldPos = pStrm->Tell();
        String aStr;
        aF.nLCode = pSBase->WW8ReadString( *pStrm, aStr, pPlcxMan->GetCpOfs()+
                                            aF.nSCode, aF.nLCode, eTextCharSet );

        eF_ResT eRes = (this->*aWW8FieldTab[aF.nId])( &aF, aStr );
        pStrm->Seek( nOldPos );

        switch ( eRes )
        {
        case F_OK:
                    return aF.nLen;                     // alles OK

        case F_TEXT:
                    return aF.nLen - aF.nLRes - 2;      // so viele ueberlesen,
                            // das Resultfeld wird wie Haupttext eingelesen
                            //JP 15.07.99: attributes can start at char 0x14
                            // so skip one char more back == "-2"

        case F_TAGTXT:
                    if(  ( nFieldTagBad[nI] & nMask ) ) // Flag: Tag bad
                        return Read_F_Tag( &aF );       // Taggen
                    return aF.nLen - aF.nLRes - 2;  // oder Text-Resultat

        case F_TAGIGN:
                    if(  ( nFieldTagBad[nI] & nMask ) ) // Flag: Tag bad
                        return Read_F_Tag( &aF );       // Taggen
                    return aF.nLen;                 // oder ignorieren

        case F_READ_FSPA:
                return aF.nLen - aF.nLRes - 2; // auf Char 1 positionieren

        default:    return aF.nLen;                     // ignorieren
        }
    }
/*
    if( !bOk || !aF.nId  || aF.nId > 84
        || ( aF.nOpt & 0x40 ) )             // WW sagt: Nested Field
        return aF.nLen;


    if( ( ( aF.nOpt & 0x08 ) )              // User Edited
        || aF.nId > 84                      // unbekannte Id
        || aWW8FieldTab[aF.nId] == 0            // keine Routine vorhanden
        || aF.bCodeNest ){


                                            // Lese nur Resultat
        if( aF.bResNest )
            return aF.nLen;                 // Result nested -> nicht brauchbar
        else
            return aF.nLen - aF.nLRes - 1;  // so viele ueberlesen, das Resultfeld
                                            // wird wie Haupttext eingelesen

    }else{                                  // Lese Feld
        long nOldPos = pStrm->Tell();
        pStrm->Seek( WW8Cp2Fc( pPlcxMan->GetCpOfs() + aF.nSCode,
                            pWwFib->fcMin ) );
        char* p = new char[ aF.nLCode + 10 ];
        pStrm->Read( p, aF.nLCode );
        for( long i=aF.nLCode; i < aF.nLCode + 10; i++ )
            p[i] = 0;                   // Nullen dahinter
        (this->*aWW8FieldTab[aF.nId])( &aF, p );
        delete[] p;
        pStrm->Seek( nOldPos );
    }
    return aF.nLen;
*/
}

//-----------------------------------------
//        Felder Taggen
//-----------------------------------------

// QuoteChar ist ohne Laengenschutz

void SwWW8ImplReader::QuoteChar( String& rStr, const sal_Unicode c, BOOL bAllowCr )
{
    if ( c < 0x0020 || c == 0x00fe || c == 0x00ff )  // < 32, >0xfe
    {
        switch( c )
        {
        case 0x0b:
        case 0x0c:
        case 0x0d: if(  bAllowCr )
                   {
                     rStr += '\n';
                     break;
                   }
                    // no break
        default:{
                    // als Hex-Zahl mit \x  davor
                    String sTmp( String::CreateFromInt32( c, 16 ) );
                    if( 1 == sTmp.Len() )
                        sTmp.Insert( '0', 0 );
                    rStr.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "\\x" ) );
                    rStr += sTmp;
                }
        }
    }
    else
        rStr += c;                  // normaler Text
}

// QuoteString() wandelt CRs abhaengig von nFieldIniFlags in '\n' oder "\0x0d"
void SwWW8ImplReader::QuoteString( String& rStr, const String& rOrg )
{
    BOOL bAllowCr = SwFltGetFlag( nFieldFlags, SwFltControlStack::ALLOW_FLD_CR );
    xub_StrLen nMax = rOrg.Len();
    xub_StrLen i = 0;
    while( nMax > i && ( rStr.Len() < MAX_FIELDLEN - 4 ) )
    {
        QuoteChar( rStr, rOrg.GetChar( i ), bAllowCr );
        i++;
    }
}

// MakeTagString() gibt als Returnwert die Position des ersten
// CR / Zeilenende / Seitenumbruch in pText und wandelt auch nur bis dort
// Wenn keins dieser Sonderzeichen enthalten ist, wird 0 zurueckgeliefert.
void SwWW8ImplReader::MakeTagString( String& rStr, const String& rOrg )
{
    BOOL bAllowCr = SwFltGetFlag( nFieldFlags, SwFltControlStack::TAGS_IN_TEXT )
                    || SwFltGetFlag( nFieldFlags, SwFltControlStack::ALLOW_FLD_CR );


    xub_StrLen nMax = rOrg.Len();
    xub_StrLen i = 0;
    while( nMax > i && ( rStr.Len() < MAX_FIELDLEN - 4 ) )
    {
        sal_Unicode c = rOrg.GetChar( i );
        switch( c )
        {
            case 132:                       // Typographische Anfuehrungszeichen
            case 148:                       // gegen normale tauschen
            case 147: rStr += '"'; break;
            case 19:  rStr += '{'; break;   // 19..21 zu {|}
            case 20:  rStr += '|'; break;
            case 21:  rStr += '}'; break;
            case '\\':                      // \{|} per \ Taggen
            case '{':
            case '|':
            case '}': rStr += '\\'; rStr += c; break;
            default:  SwWW8ImplReader::QuoteChar( rStr, c, bAllowCr ); break;
        }
        i++;
    }
}

void SwWW8ImplReader::InsertTagField( const USHORT nId, const String& rTagText )
{
    String aName( WW8_ASCII2STR( "WwFieldTag" ) );
    if( SwFltGetFlag( nFieldFlags, SwFltControlStack::TAGS_DO_ID ) ) // Nummer?
        aName += String::CreateFromInt32( nId );                    // ausgeben ?

    if( SwFltGetFlag(nFieldFlags, SwFltControlStack::TAGS_IN_TEXT))
    {
        aName += rTagText;                                          // als Txt taggen
        rDoc.Insert( *pPaM, aName, FALSE );
    }
    else
    {                                                   // normal tagggen

        SwFieldType* pFT = rDoc.InsertFldType(
                                SwSetExpFieldType( &rDoc, aName, GSE_STRING ) );
        SwSetExpField aFld( (SwSetExpFieldType*)pFT, rTagText );                            // SUB_INVISIBLE
        USHORT nSubType = ( SwFltGetFlag( nFieldFlags, SwFltControlStack::TAGS_VISIBLE ) ) ? 0 : SUB_INVISIBLE;
        aFld.SetSubType(nSubType);

        rDoc.Insert( *pPaM, SwFmtFld( aFld ) );
    }
}

long SwWW8ImplReader::Read_F_Tag( WW8FieldDesc* pF )
{
    long nOldPos = pStrm->Tell();

    WW8_CP nStart = pF->nSCode - 1;         // mit 0x19 am Anfang
    long nL = pF->nLen;                     // Gesamtlaenge mit Resultat u. Nest
    if( nL > MAX_FIELDLEN )
        nL = MAX_FIELDLEN;                  // MaxLaenge, durch Quoten
                                            // max. 4* so gross
    String sFTxt;
    nL = pSBase->WW8ReadString( *pStrm, sFTxt,
                                pPlcxMan->GetCpOfs() + nStart, nL, eStructCharSet);


    String aTagText;
    MakeTagString( aTagText, sFTxt );
    InsertTagField( pF->nId, aTagText );

    pStrm->Seek( nOldPos );
    return pF->nLen;
}


//-----------------------------------------
//        normale Felder
//-----------------------------------------

// Read_F_Nul() dient dazu, Felder, die ein belegtes ResultatFeld haben, dieses
// aber trotzdem keinen Text darstellt, sondern z.B. Variablen-Werte, komplett
// zu ignorieren.
// Noetig z.B. fuer Feld 6 "Set" == "Bestimmen".
eF_ResT SwWW8ImplReader::Read_F_Nul( WW8FieldDesc*, String& rStr )
{
    return F_OK;
}

eF_ResT SwWW8ImplReader::Read_F_Input( WW8FieldDesc* pF, String& rStr )
{
    String aDef;
    String aQ;
    long nRet;
    _ReadFieldParams aReadParam( rStr );
    while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
    {
        switch( nRet )
        {
        case -2:
            if( !aQ.Len() )
                aQ = aReadParam.GetResult();
            break;
        case 'd':
        case 'D':
            {
                xub_StrLen n = aReadParam.GoToTokenParam();
                if( STRING_NOTFOUND != n )
                    aDef = aReadParam.GetResult();
            }
            break;
        }
    }
    if( !aDef.Len() )
        aDef = GetFieldResult( pF );

    SwInputField aFld( (SwInputFieldType*)rDoc.GetSysFldType( RES_INPUTFLD ),
                        aDef, aQ, INP_TXT, 0 ); // sichtbar ( geht z.Zt. nicht anders )
    rDoc.Insert( *pPaM, SwFmtFld( aFld ) );

    return F_OK;
}

// GetFieldResult alloziert einen String und liest das Feld-Resultat ein
String SwWW8ImplReader::GetFieldResult( WW8FieldDesc* pF )
{
    long nOldPos = pStrm->Tell();

    WW8_CP nStart = pF->nSRes;              // Start Resultat
    long nL = pF->nLRes;                    // Laenge Resultat
    if( !nL )
        return aEmptyStr;                           // kein Resultat

    if( nL > MAX_FIELDLEN )
        nL = MAX_FIELDLEN;                  // MaxLaenge, durch Quoten
                                            // max. 4* so gross

    String sRes;
    nL = pSBase->WW8ReadString( *pStrm, sRes, pPlcxMan->GetCpOfs() + nStart,
                                nL, eStructCharSet );

    pStrm->Seek( nOldPos );
    return sRes;
}

// "FRAGE"
eF_ResT SwWW8ImplReader::Read_F_InputVar( WW8FieldDesc* pF, String& rStr )
{
    String aVar;
    String aQ;
    String aDef;
    long nRet;
    _ReadFieldParams aReadParam( rStr );
    while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
    {
        switch( nRet )
        {
        case -2:
            if( !aVar.Len() )
                aVar = aReadParam.GetResult();
            else if( !aQ.Len() )
                aQ = aReadParam.GetResult();
            break;
        case 'd':
        case 'D':
            {
                xub_StrLen n = aReadParam.GoToTokenParam();
                if( STRING_NOTFOUND != n )
                    aDef = aReadParam.GetResult();
            }
            break;
        }
    }
    if( !aVar.Len() )
        return F_TAGIGN;  // macht ohne Textmarke keinen Sinn
    if( !aDef.Len() )
        aDef = GetFieldResult( pF );



    SwFieldType* pFT = rDoc.InsertFldType( SwSetExpFieldType( &rDoc, aVar, GSE_STRING ) );
    SwSetExpField aFld( (SwSetExpFieldType*)pFT, aVar );
    aFld.SetSubType(SUB_INVISIBLE);
    aFld.SetInputFlag( TRUE );
    aFld.SetPromptText( aQ );
    aFld.SetPar2( aDef );
    pPlcxMan->GetBook()->SetStatus( pF->nSCode, pF->nSCode + pF->nLen,
                aVar, BOOK_ONLY_REF );
    rDoc.Insert( *pPaM, SwFmtFld( aFld ) );


    return F_OK;
}

// "AUTONR"
eF_ResT SwWW8ImplReader::Read_F_ANumber( WW8FieldDesc*, String& rStr )
{
    if( !pNumFldType ){     // 1. Mal
        SwSetExpFieldType aT( &rDoc, WW8_ASCII2STR("AutoNr"), GSE_SEQ );
        pNumFldType = rDoc.InsertFldType( aT );
    }
    SwSetExpField aFld( (SwSetExpFieldType*)pNumFldType, aEmptyStr,
                        GetNumberPara( rStr ) );
    aFld.SetValue( ++nFldNum );
    rDoc.Insert( *pPaM, SwFmtFld( aFld ) );
    return F_OK;
}

// "SEQ"
eF_ResT SwWW8ImplReader::Read_F_Seq( WW8FieldDesc*, String& rStr )
{
    String aSequenceName;
    String aBook;
    BOOL bHidden    = FALSE;
    BOOL bFormat    = FALSE;
    BOOL bShowLast  = FALSE;
    BOOL bCountOn   = TRUE;
    String sStart, sLevel;
    SvxExtNumType eNumFormat = SVX_NUM_ARABIC;
    long nRet;
    _ReadFieldParams aReadParam( rStr );
    while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
    {
        switch( nRet )
        {
        case -2:
            if( !aSequenceName.Len() )
                aSequenceName = aReadParam.GetResult();
            else if( !aBook.Len() )
                aBook = aReadParam.GetResult();
            break;

        case 'h':
            if( !bFormat )
                bHidden = TRUE;             // Hidden-Flag aktivieren
            break;

        case '*':
            bFormat = TRUE;                 // Format-Flag aktivieren
            bHidden = FALSE;                // Hidden-Flag deaktivieren
            nRet = aReadParam.SkipToNextToken();
            if( -2 == nRet )
                eNumFormat = GetNumTypeFromName( aReadParam.GetResult() );
            break;

        case 'r':
            bShowLast = FALSE;              // Zaehler neu setzen
            bCountOn  = FALSE;
            nRet = aReadParam.SkipToNextToken();
            if( -2 == nRet )
                sStart = aReadParam.GetResult();
            break;

        case 'c':
            bShowLast = TRUE;               // zuletzt verwendete Nummer anzeigen
            bCountOn  = FALSE;
            break;

        case 'n':
            bCountOn  = TRUE;               // Nummer um eins erhoehen (default)
            bShowLast = FALSE;
            break;

        case 's':                       // Outline Level
            if( -2 == aReadParam.SkipToNextToken() )
                sLevel = aReadParam.GetResult();
            break;
        }
    }
    if(    !aSequenceName.Len()
        || !aBook.Len() )
        return F_TAGIGN;

    SwSetExpFieldType* pFT = (SwSetExpFieldType*)rDoc.InsertFldType(
                        SwSetExpFieldType( &rDoc, aSequenceName, GSE_SEQ ) );
    SwSetExpField aFld( pFT, aEmptyStr, eNumFormat );

    if( sStart.Len() )
        aFld.SetFormula( ( aSequenceName += '=' ) += sStart );

    if( sLevel.Len() )
    {
        USHORT nLvl = (USHORT)sLevel.ToInt32();
        if( nLvl )
        {
            if( MAXLEVEL <= --nLvl )
                nLvl = MAXLEVEL - 1;
            pFT->SetOutlineLvl( nLvl );
        }
    }

    rDoc.Insert( *pPaM, SwFmtFld( aFld ) );
    return F_OK;
}


eF_ResT SwWW8ImplReader::Read_F_DocInfo( WW8FieldDesc* pF, String& rStr )
{
    USHORT nSub;
    USHORT nReg = DI_SUB_AUTHOR;    // RegInfoFormat, DefaultFormat fuer DocInfoFelder
    BOOL   bDateTime = FALSE;

    if( 85 == pF->nId )
    {
        /*
        There are up to 26 fields that may be meant by 'DocumentProperty'.
        Which of them is to be inserted here ?
        This Problem can only be solved by implementing a name matching
        method that compares the given Parameter String with the four
        possible name sets (english, german, french, spanish)
        */
        String aStr( rStr );
        xub_StrLen nPos1 = aStr.Search( '"' );
        if( (STRING_NOTFOUND != nPos1) && (nPos1+1 < aStr.Len()) )
        {
            xub_StrLen nPos2 = aStr.SearchAndReplace( '"', '\0', nPos1+1 );
            if( STRING_NOTFOUND != nPos2 )
            {
                aStr.Erase(0, nPos1+1);
                static sal_Char __READONLY_DATA* aName10 = "\x0F"; // SW field code
                static sal_Char  __READONLY_DATA* aName11 // German
                    = "TITEL";
                static sal_Char  __READONLY_DATA* aName12 // French
                    = "TITRE";
                static sal_Char  __READONLY_DATA* aName13 // English
                    = "TITLE";
                static sal_Char  __READONLY_DATA* aName14 // Spanish
                    = "TITRO";
                static sal_Char  __READONLY_DATA* aName20 = "\x15"; // SW filed code
                static sal_Char  __READONLY_DATA* aName21 // German
                    = "ERSTELLDATUM";
                static sal_Char  __READONLY_DATA* aName22 // French
                    = "CRÉÉ";
                static sal_Char  __READONLY_DATA* aName23 // English
                    = "CREATED";
                static sal_Char  __READONLY_DATA* aName24 // Spanish
                    = "CREADO";
                static sal_Char  __READONLY_DATA* aName30 = "\x16"; // SW filed code
                static sal_Char  __READONLY_DATA* aName31 // German
                    = "ZULETZTGESPEICHERTZEIT";
                static sal_Char  __READONLY_DATA* aName32 // French
                    = "DERNIERENREGISTREMENT";
                static sal_Char  __READONLY_DATA* aName33 // English
                    = "SAVED";
                static sal_Char  __READONLY_DATA* aName34 // Spanish
                    = "MODIFICADO";
                static sal_Char  __READONLY_DATA* aName40 = "\x17"; // SW filed code
                static sal_Char  __READONLY_DATA* aName41 // German
                    = "ZULETZTGEDRUCKT";
                static sal_Char  __READONLY_DATA* aName42 // French
                    = "DERNIÈREIMPRESSION";
                static sal_Char  __READONLY_DATA* aName43 // English
                    = "LASTPRINTED";
                static sal_Char  __READONLY_DATA* aName44 // Spanish
                    = "HUPS PUPS";
                static sal_Char  __READONLY_DATA* aName50 = "\x18"; // SW filed code
                static sal_Char  __READONLY_DATA* aName51 // German
                    = "ÜBERARBEITUNGSNUMMER";
                static sal_Char  __READONLY_DATA* aName52 // French
                    = "NUMÉRODEREVISION";
                static sal_Char  __READONLY_DATA* aName53 // English
                    = "REVISIONNUMBER";
                static sal_Char  __READONLY_DATA* aName54 // Spanish
                    = "SNUBBEL BUBBEL";
                static const USHORT nFldCnt  = 5;




                // additional fields are to be coded soon!   :-)




                static const USHORT nLangCnt = 4;
                static const sal_Char * aNameSet_26[nFldCnt][nLangCnt+1] = {
                    {aName10, aName11, aName12, aName13, aName14},
                    {aName20, aName21, aName22, aName23, aName24},
                    {aName30, aName31, aName32, aName33, aName34},
                    {aName40, aName41, aName42, aName43, aName44},
                    {aName50, aName51, aName52, aName53, aName54}
                };
                BOOL   bFldFound= FALSE;
                USHORT nFIdx;
                for(USHORT nLIdx=1; !bFldFound && (nLangCnt > nLIdx); ++nLIdx)
                {
                    for(nFIdx = 0;  !bFldFound && (nFldCnt  > nFIdx); ++nFIdx)
                    {
                        if( aStr.EqualsIgnoreCaseAscii( aNameSet_26[nFIdx][nLIdx] ) )
                        {
                            bFldFound = TRUE;
                            pF->nId   = aNameSet_26[nFIdx][0][0];
                        }
                    }
                }
                if( !bFldFound )
                    return F_TAGTXT; // Error: show field as string
            }
        }
    }

    switch( pF->nId )
    {
        case 14: nSub = DI_KEYS;        /* kann alle INFO-Vars!! */      break;
        case 15: nSub = DI_TITEL;                                        break;
        case 16: nSub = DI_THEMA;                                        break;
        case 18: nSub = DI_KEYS;                                         break;
        case 19: nSub = DI_COMMENT;                                      break;
        case 20: nSub = DI_CHANGE; nReg = DI_SUB_AUTHOR;                 break;
        case 21: nSub = DI_CREATE; nReg = DI_SUB_DATE; bDateTime = TRUE; break;
        case 23: nSub = DI_PRINT;  nReg = DI_SUB_DATE; bDateTime = TRUE; break;
        case 24: nSub = DI_DOCNO;                                        break;
        case 22: nSub = DI_CHANGE; nReg = DI_SUB_DATE; bDateTime = TRUE; break;
        case 25: nSub = DI_CHANGE; nReg = DI_SUB_TIME; bDateTime = TRUE; break;
    }

    ULONG nFormat = 0;

    if( bDateTime )
    {
        short nDT = GetTimeDatePara( rDoc, rStr, nFormat );
        switch( nDT )
        {
        case NUMBERFORMAT_DATE:     nReg = DI_SUB_DATE; break;
        case NUMBERFORMAT_TIME:     nReg = DI_SUB_TIME; break;
        case NUMBERFORMAT_DATETIME: nReg = DI_SUB_DATE; break;
        default:
            {
                nReg = DI_SUB_DATE;
            }
        }
    }

    SwDocInfoField aFld( (SwDocInfoFieldType*)
                    rDoc.GetSysFldType( RES_DOCINFOFLD ), nSub|nReg, nFormat );
    rDoc.Insert( *pPaM, SwFmtFld( aFld ) );
    return F_OK;
}

eF_ResT SwWW8ImplReader::Read_F_Author( WW8FieldDesc*, String& )
{
        // SH: Das SwAuthorField bezeichnet nicht den urspruenglichen
        // Autor, sondern den aktuellen Benutzer, also besser ueber DocInfo
        // (#56149)
    SwDocInfoField aFld( (SwDocInfoFieldType*)
                     rDoc.GetSysFldType( RES_DOCINFOFLD ),
                     DI_CREATE|DI_SUB_AUTHOR );
    rDoc.Insert( *pPaM, SwFmtFld( aFld ) );
    return F_OK;
}

eF_ResT SwWW8ImplReader::Read_F_TemplName( WW8FieldDesc*, String& )
{
    SwTemplNameField aFld( (SwTemplNameFieldType*)
                     rDoc.GetSysFldType( RES_TEMPLNAMEFLD ), FF_NAME );
    rDoc.Insert( *pPaM, SwFmtFld( aFld ) );
    return F_OK;
}

// Sowohl das Datum- wie auch das Uhrzeit-Feld kann fuer Datum, fuer Uhrzeit
// oder fuer beides benutzt werden.
eF_ResT SwWW8ImplReader::Read_F_DateTime( WW8FieldDesc*pF, String& rStr )
{                                               // Datum/Uhrzeit - Feld
    ULONG nFormat = 0;

    short nDT = GetTimeDatePara( rDoc, rStr, nFormat );

    if( NUMBERFORMAT_UNDEFINED == nDT )             // no D/T-Formatstring
    {
        if( 32 == pF->nId )
        {
            nDT     = NUMBERFORMAT_TIME;
            nFormat = rDoc.GetNumberFormatter()->GetFormatIndex(
                        NF_TIME_START, LANGUAGE_SYSTEM );
        }
        else
        {
            nDT     = NUMBERFORMAT_DATE;
            nFormat = rDoc.GetNumberFormatter()->GetFormatIndex(
                        NF_DATE_START, LANGUAGE_SYSTEM );
        }
    }

    if( nDT & NUMBERFORMAT_DATE )
    {
        SwDateTimeField aFld( (SwDateTimeFieldType*)
                        rDoc.GetSysFldType( RES_DATETIMEFLD ), DATEFLD, nFormat );
        rDoc.Insert( *pPaM, SwFmtFld( aFld ) );
    }
    else if( nDT == NUMBERFORMAT_TIME )
    {
        SwDateTimeField aFld( (SwDateTimeFieldType*)
                        rDoc.GetSysFldType( RES_DATETIMEFLD ), TIMEFLD, nFormat );
        rDoc.Insert( *pPaM, SwFmtFld( aFld ) );
    }

    return F_OK;
}

eF_ResT SwWW8ImplReader::Read_F_FileName( WW8FieldDesc*, String& )
{
    SwFileNameField aFld( (SwFileNameFieldType*)
                          rDoc.GetSysFldType( RES_FILENAMEFLD ) );
    rDoc.Insert( *pPaM, SwFmtFld( aFld ) );
    return F_OK;
}

eF_ResT SwWW8ImplReader::Read_F_Anz( WW8FieldDesc* pF, String& rStr )
{                                               // SeitenZahl - Feld
    USHORT nSub = DS_PAGE;
    switch ( pF->nId ){
    case 27: nSub = DS_WORD; break;             // Wordzahl
    case 28: nSub = DS_CHAR; break;             // Zeichenzahl
    }
    SwDocStatField aFld( (SwDocStatFieldType*)
                         rDoc.GetSysFldType( RES_DOCSTATFLD ), nSub,
                         GetNumberPara( rStr ) );
    rDoc.Insert( *pPaM, SwFmtFld( aFld ) );
    return F_OK;
}

eF_ResT SwWW8ImplReader::Read_F_CurPage( WW8FieldDesc*, String& rStr )
{
    // zusaetzlich mit Kapitelnummer?
    if( bPgChpLevel )
    {
        SwChapterField aFld( (SwChapterFieldType*)
                    rDoc.GetSysFldType( RES_CHAPTERFLD ), CF_NUMBER );
        aFld.SetLevel( nPgChpLevel );
        rDoc.Insert( *pPaM, SwFmtFld( aFld ) );

        static sal_Char __READONLY_DATA aDelim[] = "-.:\x97\x96";
        BYTE nDelim = nPgChpDelim;
        if( nDelim > 4 )
            nDelim = 0;

        sal_Unicode c = ByteString::ConvertToUnicode( aDelim[ nDelim ],
                                        RTL_TEXTENCODING_MS_1252 );
        if( '-' == c )
            rDoc.Insert( *pPaM, CHAR_HARDHYPHEN );
        else
            rDoc.Insert( *pPaM, SwFmtHardBlank( c ));
    }
                                               // Seitennummer
    SwPageNumberField aFld( (SwPageNumberFieldType*)
                    rDoc.GetSysFldType( RES_PAGENUMBERFLD ), PG_RANDOM,
                    GetNumberPara( rStr, TRUE ) );
    rDoc.Insert( *pPaM, SwFmtFld( aFld ) );
    return F_OK;
}

eF_ResT SwWW8ImplReader::Read_F_Symbol( WW8FieldDesc*, String& rStr )
{                                               // Symbol-Zeichensatz
/*
    char* p;
    char* pQ = Find1stPara( pStr, &p );         // 1. Para ist Ascii-Wert
    USHORT nC = String( pQ );
    if( !nC )                                   // ungueltige Syntax
        return F_TAGIGN;                        // -> kein 0-Zeichen in Text
    char* pCSet = FindPara( p, 'f', 'F' );          // \f -> Zeichensatz
    char* pSiz = FindPara( p, 's', 'S' );           // \s -> FontSize
    if( pCSet ){                                // Charset angegeben ?
        String aName( pCSet );
        if( eStructCharSet != eSysCharSet )             // OS2, WIN mit Mac-Doc,...
            aName.Convert( eStructCharSet, eSysCharSet );
        SvxFontItem aFont(  FAMILY_DONTKNOW, aName, // "WingDings",
                            aEmptyStr,
                            PITCH_DONTKNOW, CHARSET_SYMBOL);
        NewAttr( aFont );              // neuer Font
    }
    if( pSiz ){                                 // Size angegeben ?
        ULONG nSiz = String( pSiz );            // in pt
        SvxFontHeightItem aSz( nSiz * 20 );     // pT -> twip
        NewAttr( aSz );
    }
*/
    String aQ;
    String aName;
    String aSiz;
    long nRet;
    _ReadFieldParams aReadParam( rStr );
    while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
    {
        switch( nRet )
        {
        case -2:
            if( !aQ.Len() )
                aQ = aReadParam.GetResult();
            break;
        case 'f':
        case 'F':
            {
                xub_StrLen n = aReadParam.GoToTokenParam();
                if( STRING_NOTFOUND != n )
                    aName = aReadParam.GetResult();
            }
            break;
        case 's':
        case 'S':
            {
                xub_StrLen n = aReadParam.GoToTokenParam();
                if( STRING_NOTFOUND != n )
                    aSiz = aReadParam.GetResult();
            }
            break;
        }
    }
    if( !aQ.Len() )
        return F_TAGIGN;                        // -> kein 0-Zeichen in Text

    if( aName.Len() )                           // Font Name angegeben ?
    {
        SvxFontItem aFont(  FAMILY_DONTKNOW, aName, // "WingDings",
                            aEmptyStr,
                            PITCH_DONTKNOW, RTL_TEXTENCODING_SYMBOL );
        NewAttr( aFont );                       // neuer Font
    }

    if( aSiz.Len() )                            // Size angegeben ?
    {
        SvxFontHeightItem aSz( aSiz.ToInt32() * 20 ); // pT -> twip
        NewAttr( aSz );
    }

    rDoc.Insert( *pPaM, aQ.GetChar( 0 ) );

    if( aSiz.Len() )
        pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_CHRATR_FONTSIZE );
    if( aName.Len() )
        pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_CHRATR_FONT );

    return F_OK;
}


// "EINBETTEN"
eF_ResT SwWW8ImplReader::Read_F_Embedd( WW8FieldDesc*, String& rStr )
{
    String sHost;

    long nRet;
    _ReadFieldParams aReadParam( rStr );
    while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
    {
        switch( nRet )
        {
        case -2:
            sHost = aReadParam.GetResult();
            break;

        case 's':
            // use ObjectSize
            break;
        }
    }

    if( bObj && nPicLocFc )
        nObjLocFc = nPicLocFc;
    bEmbeddObj = TRUE;
    return F_TEXT;
}


// "BESTIMMEN"
eF_ResT SwWW8ImplReader::Read_F_Set( WW8FieldDesc* pF, String& rStr )
{
    String aName;
    String aVal;
    long nRet;
    _ReadFieldParams aReadParam( rStr );
    while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
    {
        switch( nRet )
        {
        case -2:
            if( !aName.Len() )
                aName = aReadParam.GetResult();
            else if( !aVal.Len() )
                aVal = aReadParam.GetResult();
            break;
        }
    }
    SwFieldType* pFT = rDoc.InsertFldType(
                            SwSetExpFieldType( &rDoc, aName, GSE_STRING ) );
    SwSetExpField aFld( (SwSetExpFieldType*)pFT, aVal );
    aFld.SetSubType(SUB_INVISIBLE);
    pPlcxMan->GetBook()->SetStatus( pF->nSCode, pF->nSCode + pF->nLen,
         aName, BOOK_IGNORE );
    rDoc.Insert( *pPaM, SwFmtFld( aFld ) );
    return F_OK;
}

// "REF"
eF_ResT SwWW8ImplReader::Read_F_Ref( WW8FieldDesc*, String& rStr )
{                                                       // Reference - Field
    String aBkmName;
    BOOL bChapterNr = FALSE;
    BOOL bObenUnten = FALSE;

    long nRet;
    _ReadFieldParams aReadParam( rStr );
    while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
    {
        switch( nRet )
        {
        case -2:
            if( !aBkmName.Len() ) // get name of bookmark
            {
                aBkmName = aReadParam.GetResult();
            }
            break;

        case 'r':
            bChapterNr = TRUE; // activate flag 'Chapter Number'
            break;

        case 'p':
            bObenUnten = TRUE;
            break;
        case 'h':
            break;
        default:
            // unimplemented switch: just do 'nix nought nothing'  :-)
            break;
        }
    }

    if ( SwFltGetFlag( nFieldFlags, SwFltControlStack::HYPO ) )
    {
        SwGetExpField aFld( (SwGetExpFieldType*)
                        rDoc.GetSysFldType( RES_GETEXPFLD ),
                        aBkmName, GSE_STRING, VVF_SYS );
        rDoc.Insert( *pPaM, SwFmtFld( aFld ) );
        pEndStck->SetBookRef( aBkmName, FALSE );
    }
    else
    {
        SwGetRefField aFld( (SwGetRefFieldType*)
                    rDoc.GetSysFldType( RES_GETREFFLD ),
                    aBkmName,
                    REF_BOOKMARK,
                    0,
                    REF_CONTENT );
        rDoc.Insert( *pPaM, SwFmtFld( aFld ) );
        if( bObenUnten )
        {
            SwGetRefField aFld2( (SwGetRefFieldType*)
                        rDoc.GetSysFldType( RES_GETREFFLD ),
                        aBkmName,
                        REF_BOOKMARK,
                        0,
                        REF_UPDOWN );
            rDoc.Insert( *pPaM, SwFmtFld( aFld2 ) );
        }
    }
    return F_OK;
}

eF_ResT SwWW8ImplReader::Read_F_NoteReference( WW8FieldDesc*, String& rStr )
{                                                   // Note Reference - Field
    String aBkmName;
    BOOL bChapterNr = FALSE;
    BOOL bObenUnten = FALSE;

    long nRet;
    _ReadFieldParams aReadParam( rStr );
    while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
    {
        switch( nRet )
        {
        case -2:
            if( !aBkmName.Len() ) // get name of foot/endnote
            {
                aBkmName = aReadParam.GetResult();
            }
            break;

        case 'r':
            bChapterNr = TRUE; // activate flag 'Chapter Number'
            break;

        case 'p':
            bObenUnten = TRUE;
            break;
        case 'h':
            break;
        default:
            // unimplemented switch: just do 'nix nought nothing'  :-)
            break;
        }
    }

    if ( SwFltGetFlag( nFieldFlags, SwFltControlStack::HYPO ) )
    {
        SwGetExpField aFld( (SwGetExpFieldType*)
                        rDoc.GetSysFldType( RES_GETEXPFLD ),
                        aBkmName, GSE_STRING, VVF_SYS );
        rDoc.Insert( *pPaM, SwFmtFld( aFld ) );
        pEndStck->SetBookRef( aBkmName, FALSE );
    }
    else
    {   // set Sequence No of corresponding Foot-/Endnote to Zero
        // (will be corrected in
        SwGetRefField aFld( (SwGetRefFieldType*)
                    rDoc.GetSysFldType( RES_GETREFFLD ),
                    aBkmName,
                    REF_FOOTNOTE,
                    0,
                    REF_ONLYNUMBER
                    );
        pRefFldStck->NewAttr(*pPaM->GetPoint(), SwFmtFld( aFld ));
        if( bObenUnten )
        {
//          rDoc.Insert( *pPaM, SwFmtHardBlank(' ') );
            SwGetRefField aFld2( (SwGetRefFieldType*)
                        rDoc.GetSysFldType( RES_GETREFFLD ),
                        aBkmName,
                        REF_FOOTNOTE,
                        0,
                        REF_UPDOWN
                        );
            pRefFldStck->NewAttr(*pPaM->GetPoint(), SwFmtFld( aFld2 ));
        }
    }
    return F_OK;
}

// "SEITENREF"
eF_ResT SwWW8ImplReader::Read_F_PgRef( WW8FieldDesc*, String& rStr )
{
    String aName;
    long nRet;
    _ReadFieldParams aReadParam( rStr );
    while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
    {
        switch( nRet )
        {
        case -2:
            if( !aName.Len() )
                aName = aReadParam.GetResult();
            break;
        }
    }
    if ( SwFltGetFlag( nFieldFlags, SwFltControlStack::HYPO ) )
    {
        SwGetRefField aFld( (SwGetRefFieldType*)
                        rDoc.GetSysFldType( RES_GETREFFLD ), aName, 0, 0,
                        REF_PAGE );
        rDoc.Insert( *pPaM, SwFmtFld( aFld ) );
        pEndStck->SetBookRef( aName, TRUE );
    }
    else
    {
        SwGetRefField aFld( (SwGetRefFieldType*)
                    rDoc.GetSysFldType( RES_GETREFFLD ),
                    aName,
                    REF_BOOKMARK,
                    0,
                    REF_PAGE );
        rDoc.Insert( *pPaM, SwFmtFld( aFld ) );
    }
    return F_OK;
}

// "MACROSCHALTFL"ACHE"
eF_ResT SwWW8ImplReader::Read_F_Macro( WW8FieldDesc*, String& rStr )
{
    String aName;
    String aVText;
    long nRet;
    BOOL bNewVText = TRUE;
    BOOL bBracket  = FALSE;
    _ReadFieldParams aReadParam( rStr );
    while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
    {
        switch( nRet )
        {
        case -2:
            if( !aName.Len() )
                aName = aReadParam.GetResult();
            else if( !aVText.Len() || bBracket )
            {
                if( bBracket )
                    aVText += ' ';
                aVText += aReadParam.GetResult();
                if( bNewVText )
                {
                    bBracket  = aVText.EqualsIgnoreCaseAscii('[', 1, 0);
                    bNewVText = FALSE;
                }
                else if( aVText.GetChar( aVText.Len()-1 ) == ']' )
                    bBracket  = FALSE;
            }
            break;
        }
    }
    if( !aName.Len() )
        return F_TAGIGN;  // makes no sense without Makro-Name

    aName.InsertAscii( "StarOffice.Standard.Modul1.", 0 );

    SwMacroField aFld( (SwMacroFieldType*)
                    rDoc.GetSysFldType( RES_MACROFLD ), aName, aVText );
    rDoc.Insert( *pPaM, SwFmtFld( aFld ) );
    return F_OK;
}

// "EINF"UGENGRAFIK"
eF_ResT SwWW8ImplReader::Read_F_IncludePicture( WW8FieldDesc*, String& rStr )
{
    String aGrfName;
    BOOL bEmbedded = TRUE;

    long nRet;
    _ReadFieldParams aReadParam( rStr );
    while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
    {
        switch( nRet )
        {
        case -2:
            if( !aGrfName.Len() )
            {
                ConvertFFileName( aGrfName, aReadParam.GetResult() );
                aGrfName = INetURLObject::RelToAbs( aGrfName );
            }
            break;

        case 'd':
            bEmbedded = FALSE;          // Embedded-Flag deaktivieren
            break;

        case 'c':// den Converter-Namen ueberlesen
            aReadParam.FindNextStringPiece();
            break;
        }
    }

    BOOL bExist = FALSE;
    INetURLObject aGrURL(URIHelper::SmartRelToAbs(aGrfName));
/*  try
    {
        ::ucb::Content aTestContent(
            aGrURL.GetMainURL(),
            uno::Reference< XCommandEnvironment >());
        bExist = aTestContent.isDocument();
    }
    catch(...){}
*/
    if( bExist || !bEmbedded )
    {
        /*
            Besonderheit:

            Wir setzen jetzt den Link ins Doc und merken uns den SwFlyFrmFmt.
            Da wir ja unten auf jjeden Fall mit Return-Wert F_READ_FSPA enden,
            wird der Skip-Wert so bemessen, dass das folgende Char-1 eingelesen
            wird.
            Wenn wir dann in SwWW8ImplReader::ImportGraf() reinlaufen, wird
            erkannt, dass wir soeben einen Grafik-Link inserted haben und
            das passende SwAttrSet wird ins Frame-Format eingesetzt.
        */
        SfxItemSet aFlySet( rDoc.GetAttrPool(), RES_FRMATR_BEGIN, RES_FRMATR_END-1 );
        aFlySet.Put( SwFmtAnchor( FLY_IN_CNTNT ) );
        aFlySet.Put( SwFmtVertOrient( 0, VERT_TOP, FRAME ));
        pFlyFmtOfJustInsertedGraphic = rDoc.Insert( *pPaM,
                                                    aGrfName,
                                                    aEmptyStr,
                                                    0,          // Graphic*
                                                    &aFlySet,
                                                    0);         // SwFrmFmt*
        String aName;
        if(MakeUniqueGraphName(aName, aGrURL.GetBase()))
            pFlyFmtOfJustInsertedGraphic->SetName( aName );
    }
    return F_READ_FSPA;
}

// "EINFUEGENTEXT"
eF_ResT SwWW8ImplReader::Read_F_IncludeText( WW8FieldDesc*, String& rStr )
{
    String aPara;
    String aBook;
    long nRet;
    _ReadFieldParams aReadParam( rStr );
    while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
    {
        switch( nRet )
        {
        case -2:
            if( !aPara.Len() )
                aPara = aReadParam.GetResult();
            else if( !aBook.Len() )
                aBook = aReadParam.GetResult();
            break;
        }
    }
    ConvertFFileName( aPara, aPara );
    aPara = INetURLObject::RelToAbs( aPara );

    if( aBook.Len() && aBook.GetChar( 0 ) != '\\' )
    {
        // Bereich aus Quelle ( kein Switch ) ?
        ConvertUFName( aBook );
        aPara += cTokenSeperator;
        aPara += cTokenSeperator;
        aPara += aBook;
    }
    String aStr(WW8_ASCII2STR( "WW" ));
    SwSection* pSection = new SwSection( FILE_LINK_SECTION,
                                    rDoc.GetUniqueSectionName( &aStr ) );
    pSection->SetLinkFileName( aPara );
    pSection->SetProtect( TRUE );
    NewAttr( SwFltSection( pSection ) );
    pEndStck->SetAttr( *pPaM->GetPoint(), RES_FLTR_SECTION );

//  rDoc.AppendTxtNode( *pPaM->GetPoint() );
    return F_OK;
}

// "SERIENDRUCKFELD"
eF_ResT SwWW8ImplReader::Read_F_DBField( WW8FieldDesc*, String& rStr )
{
    String aName;
    long nRet;
    _ReadFieldParams aReadParam( rStr );
    while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
    {
        switch( nRet )
        {
        case -2:
            if( !aName.Len() )
                aName = aReadParam.GetResult();
            break;
        }
    }
    SwDBFieldType aD( &rDoc, aName, aEmptyStr );    // Datenbank: Nichts
    SwFieldType* pFT = rDoc.InsertFldType( aD );
    SwDBField aFld( (SwDBFieldType*)pFT );
    rDoc.Insert( *pPaM, SwFmtFld( aFld ) );
    return F_OK;
}

// "N"ACHSTER"
eF_ResT SwWW8ImplReader::Read_F_DBNext( WW8FieldDesc*, String& )
{
    SwDBNextSetFieldType aN;
    SwFieldType* pFT = rDoc.InsertFldType( aN );
    SwDBNextSetField aFld( (SwDBNextSetFieldType*)pFT, aEmptyStr, aEmptyStr,
                            aEmptyStr );        // Datenbank: Nichts
    rDoc.Insert( *pPaM, SwFmtFld( aFld ) );
    return F_OK;
}

// "DATENSATZ"
eF_ResT SwWW8ImplReader::Read_F_DBNum( WW8FieldDesc*, String& )
{
    SwDBSetNumberFieldType aN;
    SwFieldType* pFT = rDoc.InsertFldType( aN );
    SwDBSetNumberField aFld( (SwDBSetNumberFieldType*)pFT,
                           aEmptyStr );         // Datenbank: Nichts
    rDoc.Insert( *pPaM, SwFmtFld( aFld ) );
    return F_OK;
}

//-----------------------------------------
//        Verzeichnis-Felder
//-----------------------------------------

void lcl_toxMatchACSwitch(  SwWW8ImplReader& rReader,
                            SwDoc& rDoc,
                            SwTOXBase& rBase,
                            _ReadFieldParams& rParam,
                            SwCaptionDisplay eCaptionType)
{
    xub_StrLen n = rParam.GoToTokenParam();
    if( STRING_NOTFOUND != n )
    {
        SwTOXType* pType = (SwTOXType*)rDoc.GetTOXType( TOX_ILLUSTRATIONS, 0);
        pType->Add( &rBase );
        rBase.SetCaptionDisplay( eCaptionType );
        // Read Sequence Name and store in TOXBase
        String sSeqName( rParam.GetResult() );
        lcl_ConvertSequenceName( rReader, sSeqName );
        rBase.SetSequenceName( sSeqName );
    }
}


void lcl_toxMatchTSwitch(SwWW8ImplReader& rReader,
                         SwTOXBase& rBase,
                         _ReadFieldParams& rParam)
{
    xub_StrLen n = rParam.GoToTokenParam();
    if( STRING_NOTFOUND != n )
    {
        String sParams( rParam.GetResult() );
        if( sParams.Len() )
        {
            xub_StrLen nIndex = 0;

            String sTemplate( sParams.GetToken(0, ';', nIndex) );
            if( STRING_NOTFOUND == nIndex )
            {
                const SwFmt* pStyle
                        = rReader.GetStyleWithOrgWWName( sTemplate );
                if( pStyle )
                {
                    sTemplate = pStyle->GetName();
                }
                // Store Style for Level 0 into TOXBase
                rBase.SetStyleNames( sTemplate, 0 );
            }
            else while( STRING_NOTFOUND != nIndex )
            {
                xub_StrLen nLevel = sParams.GetToken(0, ';', nIndex).ToInt32();

                if( (0 < nLevel) && (MAXLEVEL >= nLevel) )
                {
                    nLevel--;
                    // Store Style and Level into TOXBase
                    const SwFmt* pStyle
                            = rReader.GetStyleWithOrgWWName( sTemplate );
                    if( pStyle )
                    {
                        sTemplate = pStyle->GetName();
                    }
                    String sStyles( rBase.GetStyleNames( nLevel ) );
                    if( sStyles.Len() )
                        sStyles += TOX_STYLE_DELIMITER;
                    sStyles += sTemplate;
                    rBase.SetStyleNames( sStyles, nLevel );
                }
                // read next style name...
                sTemplate = sParams.GetToken(0, ';', nIndex);
            }
        }
    }
}


eF_ResT SwWW8ImplReader::Read_F_Tox( WW8FieldDesc* pF, String& rStr )
{
    if( nIniFlags & WW8FL_NO_TOX )
        return F_OK;            // abgeschaltet -> ignorieren
    if( ( pF->nLRes < 3 ) )
        return F_TAGIGN;        // Nur Stuss -> ignorieren

    TOXTypes eTox;                              // Baue ToxBase zusammen
    switch( pF->nId )
    {
        case  8: eTox = TOX_INDEX; break;
        case 13: eTox = TOX_CONTENT; break;
        default: eTox = TOX_USER; break;
    }
    USHORT nCreateOf = (eTox == TOX_CONTENT) ? TOX_OUTLINELEVEL
                                             : TOX_MARK;
    USHORT nIndexCols = 0;
    const SwTOXType* pType = rDoc.GetTOXType( eTox, 0 );
    SwForm aForm( eTox );
    SwTOXBase* pBase = new SwTOXBase( pType, aForm, nCreateOf, aEmptyStr );
                                // Name des Verzeichnisses
    switch( eTox ){
    case TOX_INDEX:
        {
            USHORT eOptions = TOI_SAME_ENTRY | TOI_CASE_SENSITIVE;


            // TOX_OUTLINELEVEL setzen wir genau dann, wenn
            // die Parameter \o in 1 bis 9 liegen
            // oder der Parameter \f existiert
            // oder GARKEINE Switches Parameter angegeben sind.
            USHORT eCreateFrom = 0;
            USHORT nMaxLevel = 0;
            long nRet;
            _ReadFieldParams aReadParam( rStr );
            while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
            {
                switch( nRet )
                {
                case 'c':
                    {
                        xub_StrLen n = aReadParam.GoToTokenParam();
                        if( STRING_NOTFOUND != n )
                        {
                            String sParams( aReadParam.GetResult() );
                            if( sParams.Len() ) // if NO String just ignore the \c
                                nIndexCols = sParams.ToInt32();
                        }
                    }
                    break;
                case 'e':
                    {
                        xub_StrLen n = aReadParam.GoToTokenParam();
                        if( STRING_NOTFOUND != n )  // if NO String just ignore the \e
                        {
                            String sDelimiter( aReadParam.GetResult() );
                            SwForm aForm( pBase->GetTOXForm() );

                            // Attention: if TOX_CONTENT brave
                            //            GetFormMax() returns MAXLEVEL + 1  !!
                            USHORT nEnd = aForm.GetFormMax()-1;

                            for(USHORT nLevel = 1;
                                   nLevel <= nEnd;
                                   ++nLevel)
                            {
                                // Levels count from 1
                                // Level 0 is reserved for CAPTION

                                // Delimiter statt Tabstop vor der Seitenzahl einsetzen,
                                // falls es eine Seitenzahl gibt:
                                FormTokenType ePrevType = TOKEN_END;
                                FormTokenType eType;
                                SwFormTokenEnumerator aEnumer =
                                    aForm.CreateTokenEnumerator( nLevel );
                                do
                                {
                                    eType = aEnumer.GetNextTokenType();
                                    switch( eType )
                                    {
                                        case TOKEN_PAGE_NUMS:
                                        {
                                            if( TOKEN_TAB_STOP == ePrevType )
                                            {
                                                // remove Tab
                                                aEnumer.GetPrevTokenType();
                                                aEnumer.RemoveCurToken();
                                                // insert new Token
                                                if( 0x09 == sDelimiter.GetChar( 0 ) )
                                                {
                                                    SwFormToken aToken( TOKEN_TAB_STOP );
                                                    aToken.eTabAlign = SVX_TAB_ADJUST_END;
                                                    aEnumer.InsertToken( aToken );
                                                }
                                                else
                                                {
                                                    SwFormToken aToken( TOKEN_TEXT );
                                                    aToken.sText = sDelimiter;
                                                    aEnumer.InsertToken( aToken );
                                                }
                                                aForm.SetPattern( nLevel,
                                                        aEnumer.GetPattern() );
                                            }
                                            eType = TOKEN_END;
                                            break;
                                        }
                                    }
                                    ePrevType = eType;
                                }
                                while( TOKEN_END != eType );
                            }
                            pBase->SetTOXForm( aForm );
                        }
                    }
                    break;
                case 'h':
                    {
                        eOptions |= TOI_ALPHA_DELIMITTER;
                    }
                    break;
                case 'r':
                    {
                        SwForm aForm( pBase->GetTOXForm() );
                        aForm.SetCommaSeparated( TRUE );
                        pBase->SetTOXForm( aForm );
                    }
                    break;
                /*
                // the following switches are not (yet) supported
                // by good old StarWriter:
                case 'b':
                case 'd':
                case 'f':
                case 'g':
                case 'I':
                case 'p':
                case 's':
                    break;
                */
                }
            }
            /*
            const TOXTypes eType = pBase->GetTOXType()->GetType();
            switch( eType )
            {
                case TOX_CONTENT:
                    if( eCreateFrom )
                        pBase->SetCreate( eCreateFrom );
                    break;
                case TOX_ILLUSTRATIONS:
                    if( !eCreateFrom )
                        eCreateFrom = TOX_SEQUENCE;
                    pBase->SetCreate( eCreateFrom );
                    break;
            }
            */
            pBase->SetOptions( eOptions );
        }
        break;





    case TOX_CONTENT:
        {
            // TOX_OUTLINELEVEL setzen wir genau dann, wenn
            // die Parameter \o in 1 bis 9 liegen
            // oder der Parameter \f existiert
            // oder GARKEINE Switches Parameter angegeben sind.
            USHORT eCreateFrom = 0;
            USHORT nMaxLevel = 0;
            long nRet;
            _ReadFieldParams aReadParam( rStr );
            while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
            {
                switch( nRet )
                {
                case 'a':
                case 'c':
                    lcl_toxMatchACSwitch(*this, rDoc, *pBase, aReadParam,
                                           ('c' == nRet)
                                         ? CAPTION_COMPLETE
                                         : CAPTION_TEXT );
                    break;
                case 'o':
                    {
                        USHORT nVal;
                        if( !aReadParam.GetTokenSttFromTo(0, &nVal, MAXLEVEL) )
                        {
                            nVal = aForm.GetFormMax()-1;
                        }
                        if( nMaxLevel < nVal )
                            nMaxLevel = nVal;
                        eCreateFrom |= TOX_OUTLINELEVEL;
                    }
                    break;
                case 'f':
                    eCreateFrom |= TOX_MARK;
                    break;
                case 'l':
                    {
                        USHORT nVal;
                        if( aReadParam.GetTokenSttFromTo(0, &nVal, MAXLEVEL) )
                        {
                            if( nMaxLevel < nVal )
                                nMaxLevel = nVal;
                            eCreateFrom |= TOX_MARK;
                        }
                    }
                    break;
                case 't': // paragraphs using special styles shall
                          // provide the TOX's content
                    lcl_toxMatchTSwitch(*this, *pBase, aReadParam);
                    eCreateFrom |= TOX_TEMPLATE;
                    break;
                case 'p':
                    {
                        xub_StrLen n = aReadParam.GoToTokenParam();
                        if( STRING_NOTFOUND != n )  // if NO String just ignore the \p
                        {
                            String sDelimiter( aReadParam.GetResult() );
                            SwForm aForm( pBase->GetTOXForm() );

                            // Attention: if TOX_CONTENT brave
                            //            GetFormMax() returns MAXLEVEL + 1  !!
                            USHORT nEnd = aForm.GetFormMax()-1;

                            for(USHORT nLevel = 1;
                                   nLevel <= nEnd;
                                   ++nLevel)
                            {
                                // Levels count from 1
                                // Level 0 is reserved for CAPTION

                                // Delimiter statt Tabstop vor der Seitenzahl einsetzen,
                                // falls es eine Seitenzahl gibt:
                                FormTokenType ePrevType = TOKEN_END;
                                FormTokenType eType;
                                SwFormTokenEnumerator aEnumer =
                                    aForm.CreateTokenEnumerator( nLevel );
                                do
                                {
                                    eType = aEnumer.GetNextTokenType();
                                    switch( eType )
                                    {
                                        case TOKEN_PAGE_NUMS:
                                        {
                                            if( TOKEN_TAB_STOP == ePrevType )
                                            {
                                                // remove Tab
                                                aEnumer.GetPrevTokenType();
                                                aEnumer.RemoveCurToken();
                                                // insert new Token
                                                SwFormToken aToken( TOKEN_TEXT );
                                                aToken.sText = sDelimiter;

                                                aEnumer.InsertToken( aToken );
                                                aForm.SetPattern( nLevel,
                                                        aEnumer.GetPattern() );
                                            }
                                            eType = TOKEN_END;
                                            break;
                                        }
                                    }
                                    ePrevType = eType;
                                }
                                while( TOKEN_END != eType );
                            }
                            pBase->SetTOXForm( aForm );
                        }
                    }
                    break;
                case 'n': // don't print page numbers
                    {
                        // read START and END param
                        USHORT nStart, nEnd;
                        if( !aReadParam.GetTokenSttFromTo(  &nStart,
                                                            &nEnd,
                                                            MAXLEVEL ) )
                        {
                            nStart = 1;
                            nEnd = aForm.GetFormMax()-1;
                        }
                        // remove page numbers from this levels
                        SwForm aForm( pBase->GetTOXForm() );
                        if( aForm.GetFormMax() <= nEnd)
                            nEnd = aForm.GetFormMax()-1;
                        for(USHORT nLevel = nStart;
                               nLevel <= nEnd;
                               ++nLevel)
                        {
                            // Levels count from 1
                            // Level 0 is reserved for CAPTION

                            // Seitenzahl und ggfs. davorstehenden Tabstop entfernen:
                            FormTokenType eType;
                            SwFormTokenEnumerator aEnumer =
                                aForm.CreateTokenEnumerator( nLevel );
                            do
                            {
                                eType = aEnumer.GetNextTokenType();
                                switch( eType )
                                {
                                    case TOKEN_PAGE_NUMS:
                                    {
                                        aEnumer.RemoveCurToken();
                                        if( TOKEN_TAB_STOP
                                            == aEnumer.GetPrevTokenType() )
                                        {
                                            aEnumer.RemoveCurToken();
                                            aForm.SetPattern( nLevel,
                                                    aEnumer.GetPattern() );
                                        }
                                        eType = TOKEN_END;
                                        break;
                                    }
                                }
                            }
                            while( TOKEN_END != eType );
                        }
                        pBase->SetTOXForm( aForm );
                    }
                    break;

                /*
                // the following switches are not (yet) supported
                // by good old StarWriter:
                case 'b':
                case 's':
                case 'd':
                    break;
                */
                }
            }
            if( !nMaxLevel )
                nMaxLevel = MAXLEVEL;
            pBase->SetLevel( nMaxLevel );

            const TOXTypes eType = pBase->GetTOXType()->GetType();
            switch( eType )
            {
                case TOX_CONTENT:
                    if( eCreateFrom )
                        pBase->SetCreate( eCreateFrom );
                    break;
                case TOX_ILLUSTRATIONS:
                    if( !eCreateFrom )
                        eCreateFrom = TOX_SEQUENCE;
                    pBase->SetCreate( eCreateFrom );
                    break;
            }
        }
        break;
    case TOX_USER:
        break;
    } // ToxBase fertig

    // Update fuer TOX anstossen
    rDoc.SetUpdateTOX( TRUE );

    const SwPosition* pPos = pPaM->GetPoint();

    SwFltTOX aFltTOX( pBase, nIndexCols );

    // test if there is already a break item on this node
    SwCntntNode* pNd = pPos->nNode.GetNode().GetCntntNode();
    if( pNd )
    {
        const SfxItemSet* pSet = pNd->GetpSwAttrSet();
        if( pSet )
        {
            if( SFX_ITEM_SET == pSet->GetItemState( RES_BREAK, FALSE ) )
                aFltTOX.SetHadBreakItem( TRUE );
            if( SFX_ITEM_SET == pSet->GetItemState( RES_PAGEDESC, FALSE ) )
                aFltTOX.SetHadPageDescItem( TRUE );
        }
    }

    // Setze Anfang in Stack
    pEndStck->NewAttr( *pPos, aFltTOX );
    if( 1 < nIndexCols )
        bDontCreateSep = TRUE;

    // Setze Ende in Stack
    pEndStck->SetAttr( *pPos, RES_FLTR_TOX );

    return F_OK;
}

eF_ResT SwWW8ImplReader::Read_F_Hyperlink( WW8FieldDesc* pF, String& rStr )
{
    eF_ResT eRet = F_OK;
    String sURL, sTarget, sMark;
    BOOL bDataImport=FALSE;

    // JP 02.12.98: es gibt Hyperlink-Felder, die am Ende eine '\x01' stehen
    //              haben. Die wollen wir aber nicht beachten
    /*
    if( pStr[ pF->nLCode - 1 ] < ' ' )
        pStr[ pF->nLCode - 1 ] = 0;
    */



/*
    //caolan
    if( rStr.GetChar( pF->nLCode - 1 ) < ' ' )
    {
#if DEBUG
        if( 0x01 == rStr.GetChar( pF->nLCode-1 ) )
            bDataImport=ImportURL( sURL, sMark, pF->nSCode + pF->nLCode-1 );
#endif
        rStr.SetChar( pF->nLCode - 1, 0 );
    }
*/

    rStr.EraseTrailingChars( 1 );



    if (!bDataImport)
    {
        long nRet;
        _ReadFieldParams aReadParam( rStr );
        while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
            switch( nRet )
            {
            case -2:
                if( !sURL.Len() )
                {
                    ConvertFFileName( sURL, aReadParam.GetResult() );
                    sURL = INetURLObject::RelToAbs( sURL );
                }
                break;

            case 'n':
                sTarget = WW8_ASCII2STR( "_blank" );
                break;

            case 'l':
                nRet = aReadParam.SkipToNextToken();
                if( -2 == nRet )
                {
                    sMark = aReadParam.GetResult();
                    if( sMark.Len() && '"' == sMark.GetChar( sMark.Len()-1 ))
                        sMark.Erase( sMark.Len() - 1 );

                }
                break;

            case 'h':
            case 'm':
            case 's':
            case 't':
                ASSERT( !this, "Auswertung fehlt noch - Daten unbekannt" );
                break;
            }
    }

    String sDef( GetFieldResult( pF ) );                // das Resultat uebernehmen
    if( ( sURL.Len() || sMark.Len() ) && sDef.Len() )
    {
        if( sMark.Len() )
            ( sURL += INET_MARK_TOKEN ) += sMark;
        SwFmtINetFmt aURL( sURL, sTarget );
//      aURL.SetVisitedFmt( "??" );
//      aURL.SetINetFmt( "??" );
        pEndStck->NewAttr( *pPaM->GetPoint(), aURL );

        // das Ende als "relative" Pos auf den Stack setzen
        pPaM->SetMark();
        pPaM->GetMark()->nContent += sDef.Len();
        pEndStck->SetAttr( *pPaM->GetMark(), RES_TXTATR_INETFMT, FALSE );
        pPaM->DeleteMark();
        eRet = F_TEXT;
    }
    return eRet;
}


void SwWW8ImplReader::ImportTox( int nFldId, String aStr )
{
    BOOL bIdx = ( nFldId != 9 );
    TOXTypes eTox = ( !bIdx ) ? TOX_CONTENT : TOX_INDEX;    // Default

    USHORT nLevel = 1;

    xub_StrLen n;
    String sKey1;
    long nRet;
    _ReadFieldParams aReadParam( aStr );
    while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
        switch( nRet )
        {
        case -2:
            if( !sKey1.Len() )
            {
                sKey1 = aReadParam.GetResult().GetToken(0, ':');
                if( !sKey1.Len() )
                    sKey1 = aReadParam.GetResult(); // PrimaryKey ohne ":", 2nd dahinter
            }
            break;

        case 'f':
            n = aReadParam.GoToTokenParam();
            if( STRING_NOTFOUND != n )
            {
                String sParams( aReadParam.GetResult() );
                if( 'C' != sParams.GetChar(0) && 'c' != sParams.GetChar(0) )
                    eTox = TOX_USER;
            }
            break;

        case 'l':
            n = aReadParam.GoToTokenParam();
            if( STRING_NOTFOUND != n )
            {
                String sParams( aReadParam.GetResult() );
                if(    sParams.Len() // if NO String just ignore the \l
                    && sParams.GetChar( 0 ) > '0'
                    && sParams.GetChar( 0 ) <= '9' )
                {
                    nLevel = (USHORT)sParams.ToInt32();
                }
            }
            break;
        }


/*
    WW8FldParaGuess aG( pStr, ( bIdx ) ? 0 : "fl" );
    const char* pFld = (const char*)aG.GetStdPara();
    if( !aG.Ok() || !pFld )
        return;

    char* pKey1 = (char*)strchr( pFld, ':' );
    if( pKey1 )
    {
        *pKey1++ = '\0';
    }

    USHORT nLevel = 1;

    if( !bIdx ){                            // Inhalts- oder Abbildungsverzeichnis
        const unsigned char* pFlg = aG.GetSwitch( 0 );// Switch 'f'
        if( pFlg && toupper(*pFlg) != 'C' )
            eTox = TOX_USER;                // z.B. F = Abbildungsverzeichnis
        pFlg = aG.GetSwitch( 1 );           // Switch 'l'
        if( pFlg && *pFlg > '0' && *pFlg <= '9' )
            nLevel = *pFlg - '0';
    }
*/
    ASSERT( rDoc.GetTOXTypeCount( eTox ), "Doc.GetTOXTypeCount() == 0  :-(" );

    const SwTOXType* pT = rDoc.GetTOXType( eTox, 0 );
    SwTOXMark aM( pT );
    if( eTox != TOX_INDEX )
        aM.SetLevel( nLevel );

    if( sKey1.Len() )
    {
        aM.SetAlternativeText( sKey1 );     // WW/SW: unterschiedliche Reihenfolge
                                            // Text mit Key1 tauschen
        aM.SetPrimaryKey( aStr );

    }
    else
        aM.SetAlternativeText( aStr );

    if( !aM.IsAlternativeText() )
    {
        pPaM->SetMark();
        pPaM->GetMark()->nContent += aStr.Len();
    }
    rDoc.Insert( *pPaM, aM );
    if( !aM.IsAlternativeText() )
        pPaM->DeleteMark();
}

void SwWW8ImplReader::Read_FldVanish( USHORT, BYTE*, short nLen )
{
    // Vorsicht: Bei Feldnamen mit Umlauten geht das MEMICMP nicht!
    const static sal_Char *aFldNames[] = {  "\x06""INHALT", "\x02""XE", // dt.
                                            "\x02""TC"  };              // us
    const static BYTE  aFldId[] = { 9, 4, 9 };

    if( nIniFlags & WW8FL_NO_FLD )
        return;

    if( nLen < 0 )
    {
        bIgnoreText = FALSE;
        return;
    }

    // our methode was called from
    // ''Skip attributes of field contents'' loop within ReadTextAttr()
    if( bIgnoreText )
        return;

    bIgnoreText = TRUE;
    long nOldPos = pStrm->Tell();
    USHORT nFieldLen;

    WW8_CP nStartCp = pSBase->WW8Fc2Cp( nOldPos );
    String sFieldName;
    nFieldLen = pSBase->WW8ReadString( *pStrm, sFieldName, nStartCp,
                                         500, eStructCharSet );
    pStrm->Seek( nOldPos );

    xub_StrLen nC = 0;
    if( 0x13 != sFieldName.GetChar( nC )) // Field Start Mark
    {
        if( 0x15 == sFieldName.GetChar( nC ))       // Field End Mark found
            bIgnoreText = FALSE;
//      delete( pFieldName );
        return;                 // kein Feld zu finden
    }

    nC++;
    while( ' '  == sFieldName.GetChar( nC ))
        nC++;

    for( int i = 0; i < 2; i++ )
    {
        const sal_Char* pName = aFldNames[i];
        USHORT nNameLen = *pName++;
        if( sFieldName.EqualsIgnoreCaseAscii( pName, 0, nNameLen ) )
        {
            ImportTox( aFldId[i], sFieldName.Copy( nNameLen ) );
            break;                  // keine Mehrfachnennungen moeglich
        }
    }
    bIgnoreText = TRUE;
    pStrm->Seek( nOldPos );
}

// Read_Invisible ist fuer das "Unsichtbar"-Zeichenattribut. Mangels
// entsprechender Funktion im SW evtl. als Tag.
//
// ACHTUNG: Methode gelegentlich umstellen: unsichtbaren Text als
//                  *Feld* integrieren...
//
void SwWW8ImplReader::Read_Invisible( USHORT, BYTE* pData, short nLen )
{
    USHORT n = WWF_INVISIBLE;               // Bit-Nummer fuer Invisible
    USHORT nI = n / 32;                     // # des UINT32
    ULONG nMask = 1 << ( n % 32 );  // Maske fuer Bits

    if(    ( nFieldTagBad[    nI ] & nMask )
        || ( nFieldTagAlways[ nI ] & nMask ) )
    {
        String aTag( WW8_ASCII2STR( "{INVISIBLE " ) );

        if( nLen < 0 )
            aTag.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "END}" ) );
        else
            aTag.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "START}" ) );

        InsertTagField( n, aTag );
    }
}


/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ww8/ww8par5.cxx,v 1.1.1.1 2000-09-18 17:14:58 hr Exp $


      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.71  2000/09/18 16:05:01  willem.vandorp
      OpenOffice header added.

      Revision 1.70  2000/08/31 06:29:28  jp
      use CharClass instead of international

      Revision 1.69  2000/08/04 10:56:54  jp
      Soft-/HardHyphens & HardBlanks changed from attribute to unicode character

      Revision 1.68  2000/07/24 16:39:08  khz
      #75701# set Break or PageDesc item BEHIND TOX if not found before the #0x0C

      Revision 1.67  2000/06/26 12:59:11  os
      INetURLObject::SmartRelToAbs removed

      Revision 1.66  2000/06/15 15:57:31  khz
      Prevent FindParaStart() from calling rStr.GetChar() behind end of string

      Revision 1.65  2000/06/13 08:25:46  os
      using UCB

      Revision 1.64  2000/06/06 15:00:34  khz
      Changes for Unicode

      Revision 1.63  2000/05/18 10:59:02  jp
      Changes for Unicode

      Revision 1.62  2000/05/17 16:40:46  khz
      Changes for unicode (2)

      Revision 1.60  2000/05/16 12:03:45  jp
      Changes for unicode

      Revision 1.59  2000/05/16 11:06:28  khz
      Unicode code-conversion

      Revision 1.58  2000/05/08 09:25:49  khz
      Task #74474# Find TRUE end of field code in WW8FldParaGuess class

      Revision 1.57  2000/05/05 16:07:41  khz
      Task #74474# don't create Sections while skipping result of multi-column index-field

      Revision 1.56  2000/03/27 11:44:40  cmc
      #74329# Added OCX Field Reader

      Revision 1.55  2000/03/22 09:55:35  khz
      Task #74378# release memory that was allocated by FindPara()

      Revision 1.54  2000/02/18 09:38:12  cmc
      #69372# Improved Hyperlink Importing for WW97

      Revision 1.53  2000/02/11 14:40:28  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.52  2000/01/17 11:22:15  khz
      Task #62941# import DateTime as single field (before 2 field separated by space)

      Revision 1.51  2000/01/11 10:17:43  khz
      Task #62941# import different formats for date- and time-fields

      Revision 1.50  2000/01/04 16:48:36  khz
      Task #70863# Indexes: parameter >> \e '0x09' << shows page-num at right col-margin

      Revision 1.49  1999/12/23 17:01:22  khz
      Task #70788# *De*activate bIgnoreText in Read_FldVanish() when 0x15 reached

      Revision 1.48  1999/12/21 09:25:48  khz
      Task #71111# Prevent from reading CONTENT when skiping field attributes

      Revision 1.47  1999/12/06 09:35:05  khz
      Task #70486# Now \t param on INDEX field may have one single NAME (without LEVEL)

      Revision 1.46  1999/12/02 16:39:28  khz
      Task #69857# Removed TOI_FF from default TOX_INDEX flags

      Revision 1.45  1999/11/26 12:51:17  khz
      Task #69898# TOC parameter \o will include *all* levels when no levels specified

      Revision 1.44  1999/11/26 12:27:21  khz
      Task #69892# TOC parameter \n will modify *all* levels when no levels specified

      Revision 1.43  1999/11/02 15:59:45  khz
      import new TOX_CONTENT and TOX_INDEX features (2)

      Revision 1.42  1999/10/29 12:07:39  khz
      import new TOX_CONTENT and TOX_INDEX features

      Revision 1.41  1999/10/13 21:09:26  khz
      Import Table Of Contents (0)

      Revision 1.40  1999/08/30 19:53:08  JP
      Bug #68219#: no static members - be reentrant


      Rev 1.39   30 Aug 1999 21:53:08   JP
   Bug #68219#: no static members - be reentrant

      Rev 1.38   09 Aug 1999 14:16:12   JP
   read W95 format from stream

      Rev 1.37   30 Jul 1999 17:53:36   KHZ
   Task #62955# name matching for docinfo fields (1)

      Rev 1.36   27 Jul 1999 11:23:44   KHZ
   Task #62941# find number format for date/time fields

      Rev 1.35   15 Jul 1999 19:03:48   JP
   Read_Field: if read only result then skip one char more back

      Rev 1.34   07 Jul 1999 08:08:20   OS
   extended indexes: Index names in ShellRes

      Rev 1.33   21 Jun 1999 12:16:12   KHZ
   Reference field (page, bookmark, footnote) part#2

      Rev 1.32   18 Jun 1999 15:53:52   KHZ
   Reference field (page, bookmark, footnote) part#1

      Rev 1.31   03 Jun 1999 16:59:56   KHZ
   Task #66418# UEberfluessiges ''xStrm->Seek( nOldPos );'' entfernt

      Rev 1.30   02 Jun 1999 09:32:24   KHZ
   Task #66227# a) kein Unicode bei Ver67 ;-)  b) Grafik in grupp. Textbox

      Rev 1.29   27 Apr 1999 14:39:10   KHZ
   Task #65353# ueberfluessiges AppendTxtNode in Read_F_IncludeText entfernt


      Rev 1.28   26 Apr 1999 19:22:54   JP
   Bug #65298#: Grf/Ole bei Zeichenbindung immer Oben zu Grundline anordnen

      Rev 1.27   18 Feb 1999 12:44:38   KHZ
   Task #61675# Falsche Offsetberechnung bei ImportTox() in Read_FldVanish()

      Rev 1.26   23 Dec 1998 16:15:00   KHZ
   Task #60444# Inhaltverzeichnis jetzt auch bei fehlenden Switches

      Rev 1.25   15 Dec 1998 10:50:44   KHZ
   Tasks #59580# und #58766# (Nachzieher aus SRV506)

      Rev 1.24   07 Dec 1998 11:27:28   KHZ
   Task #58766# Unicode in benutzerdef. Verzeichnissen

      Rev 1.23   02 Dec 1998 20:06:34   JP
   Bug #60045#: Marks von Hyperlinks einlesen

      Rev 1.22   02 Dec 1998 11:41:06   KHZ
   Task #59834# ein vergessenes >>delete[]( pDef )><<

      Rev 1.21   24 Nov 1998 21:11:22   JP
   Task #59822#: OLE-Objecte einlesen

      Rev 1.20   19 Nov 1998 10:37:02   TRI
   OS2 Anpassungen

      Rev 1.19   18 Nov 1998 16:29:46   HR
   doppeltes const raus

      Rev 1.18   18 Nov 1998 10:33:28   KHZ
   Task #59078# Compilerfehler unter Unix

      Rev 1.17   17 Nov 1998 20:25:12   JP
   #58263# NumType durch SvxExtNumType ersetzt

      Rev 1.16   17 Nov 1998 20:05:56   JP
   Task #59476#: Seitenumrandung / Seitennummern / Seitennummernformat lesen

      Rev 1.15   17 Nov 1998 10:48:54   OS
   #58263# NumType durch SvxExtNumType ersetzt

      Rev 1.14   16 Nov 1998 18:59:18   KHZ
   Task #59078# Feldimport SEQ (fertig)

      Rev 1.13   16 Nov 1998 18:34:22   KHZ
   Task #59078# Feldimport SEQ (Teil 1)

      Rev 1.12   16 Nov 1998 13:19:52   JP
   Task #59476#: Hyperlinks lesen, ImportGrf vereinfacht, Bookmarks kein ToUpper

      Rev 1.11   05 Nov 1998 13:07:36   KHZ
   Task #58993# Befehl INCLUDEPICTURE liefert jetzt korrekten String

      Rev 1.10   30 Oct 1998 16:13:48   KHZ
   Task #57836# Beliebige Parameterreihenfolge bei Feld INCLUDEPICTURE moeglich

      Rev 1.9   30 Oct 1998 16:10:54   KHZ

      Rev 1.8   29 Oct 1998 15:12:24   KHZ
   Task #58620# GPF bei Feld EINFUEGENGRAFIK in Doc mit UNICODE

      Rev 1.7   15 Sep 1998 19:35:46   JP
   Bug #56310#: Teilfix - kein GPF mehr

      Rev 1.6   13 Sep 1998 15:50:22   HJS
   #56149# authorfield

      Rev 1.5   03 Sep 1998 22:16:14   KHZ
   Task #55189# Textboxen

      Rev 1.4   11 Aug 1998 14:39:46   KHZ
   Task #52607# neue Numerierungstypen (siehe auch WWPAR.CXX und Bug 54796)

      Rev 1.3   05 Aug 1998 09:32:08   KHZ
   Task #52607# Kodepflege

      Rev 1.2   30 Jun 1998 21:33:24   KHZ
   Header/Footer/Footnotes weitgehend ok

      Rev 1.1   23 Jun 1998 11:15:28   KHZ
   memicmp ersetzt durch MEMICMP

      Rev 1.0   16 Jun 1998 11:08:28   KHZ
   Initial revision.

*************************************************************************/




diff --git a/sw/source/filter/ww8/ww8par6.cxx b/sw/source/filter/ww8/ww8par6.cxx
new file mode 100644
index 0000000..2c788b2
--- /dev/null
+++ b/sw/source/filter/ww8/ww8par6.cxx
@@ -0,0 +1,4883 @@
/*************************************************************************
 *
 *  $RCSfile: ww8par6.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:59 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include <stdlib.h>

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SVSTDARR_HXX
#define _SVSTDARR_USHORTS
#define _SVSTDARR_USHORTSSORT
#include <svtools/svstdarr.hxx>
#endif

#define ITEMID_BOXINFO      SID_ATTR_BORDER_INNER
#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _APP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _SVX_LSPCITEM_HXX //autogen
#include <svx/lspcitem.hxx>
#endif
#ifndef _SVX_WRLMITEM_HXX //autogen
#include <svx/wrlmitem.hxx>
#endif
#ifndef _SVX_UDLNITEM_HXX //autogen
#include <svx/udlnitem.hxx>
#endif
#ifndef _SVX_KERNITEM_HXX //autogen
#include <svx/kernitem.hxx>
#endif
#ifndef _SVX_LANGITEM_HXX //autogen
#include <svx/langitem.hxx>
#endif
#ifndef _SVX_CMAPITEM_HXX //autogen
#include <svx/cmapitem.hxx>
#endif
#ifndef _SVX_SHDDITEM_HXX //autogen
#include <svx/shdditem.hxx>
#endif
#ifndef _SVX_CNTRITEM_HXX //autogen
#include <svx/cntritem.hxx>
#endif
#ifndef _SVX_CRSDITEM_HXX //autogen
#include <svx/crsditem.hxx>
#endif
#ifndef _SVX_POSTITEM_HXX //autogen
#include <svx/postitem.hxx>
#endif
#ifndef _SVX_WGHTITEM_HXX //autogen
#include <svx/wghtitem.hxx>
#endif
#ifndef _SVX_ADJITEM_HXX //autogen
#include <svx/adjitem.hxx>
#endif
#ifndef _SVX_COLRITEM_HXX //autogen
#include <svx/colritem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _SVX_SPLTITEM_HXX //autogen
#include <svx/spltitem.hxx>
#endif
#ifndef _SVX_KEEPITEM_HXX //autogen
#include <svx/keepitem.hxx>
#endif
#ifndef _SVX_ORPHITEM_HXX //autogen
#include <svx/orphitem.hxx>
#endif
#ifndef _SVX_WIDWITEM_HXX //autogen
#include <svx/widwitem.hxx>
#endif
#ifndef _SVX_ADJITEM_HXX //autogen
#include <svx/adjitem.hxx>
#endif
#ifndef _SVX_ESCPITEM_HXX //autogen
#include <svx/escpitem.hxx>
#endif
#ifndef _SVX_FHGTITEM_HXX //autogen
#include <svx/fhgtitem.hxx>
#endif
#ifndef _SVX_FONTITEM_HXX //autogen
#include <svx/fontitem.hxx>
#endif
#ifndef _SVX_SHADITEM_HXX //autogen
#include <svx/shaditem.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_AKRNITEM_HXX //autogen
#include <svx/akrnitem.hxx>
#endif
#ifndef _SVX_PAPERINF_HXX //autogen
#include <svx/paperinf.hxx>
#endif

#ifndef _SVX_PBINITEM_HXX
#include <svx/pbinitem.hxx>
#endif

#ifndef _SVX_HYZNITEM_HXX //autogen
#include <svx/hyznitem.hxx>
#endif

#ifndef _RTL_TENCINFO_H
#include <rtl/tencinfo.h>
#endif

#ifndef _FMTPDSC_HXX //autogen
#include <fmtpdsc.hxx>
#endif
#ifndef _NODE_HXX //autogen
#include <node.hxx>
#endif
#ifndef _NDTXT_HXX
#include <ndtxt.hxx> // SwTxtNode, siehe unten: JoinNode()
#endif
#ifndef _PAM_HXX
#include <pam.hxx>              // fuer SwPam
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _SHELLIO_HXX
#include <shellio.hxx>
#endif
#ifndef _PAGEDESC_HXX
#include <pagedesc.hxx>         // class SwPageDesc
#endif
#ifndef _FMTANCHR_HXX //autogen
#include <fmtanchr.hxx>
#endif
#ifndef _FMTCNTNT_HXX //autogen
#include <fmtcntnt.hxx>
#endif
#ifndef _FCHRFMT_HXX //autogen
#include <fchrfmt.hxx>
#endif
#ifndef _FMTHDFT_HXX //autogen
#include <fmthdft.hxx>
#endif
#ifndef _FMTCLDS_HXX //autogen
#include <fmtclds.hxx>
#endif
#ifndef _FMTFTNTX_HXX
#include <fmtftntx.hxx>
#endif
#ifndef _FRMATR_HXX
#include <frmatr.hxx>
#endif
#ifndef _FLTSHELL_HXX
#include <fltshell.hxx>         // fuer den Attribut Stack
#endif
#ifndef _FLTINI_HXX
#include <fltini.hxx>
#endif
#ifndef _SECTION_HXX
#include <section.hxx>
#endif
#ifndef SW_LINEINFO_HXX
#include <lineinfo.hxx>
#endif
#ifndef SW_FMTLINE_HXX
#include <fmtline.hxx>
#endif
#ifndef _WW8SCAN_HXX
#include <ww8scan.hxx>
#endif
#ifndef _WW8PAR2_HXX
#include <ww8par2.hxx>          // class WW8RStyle, class WwAnchorPara
#endif


#define NEW_MINHDSIZ            // Definieren zum Ausnutzen der minimalen
                                // Header- und Footerhoehe


static ColorData __FAR_DATA eSwWW8ColA[] = {
        COL_BLACK, COL_BLACK, COL_LIGHTBLUE,
        COL_LIGHTCYAN, COL_LIGHTGREEN, COL_LIGHTMAGENTA, COL_LIGHTRED,
        COL_YELLOW, COL_WHITE, COL_BLUE, COL_CYAN, COL_GREEN,
        COL_MAGENTA, COL_RED, COL_BROWN, COL_GRAY, COL_LIGHTGRAY };


#ifdef HP9000
#define INLINE_AUSSER_HP
#else
#define INLINE_AUSSER_HP inline
#endif


//-----------------------------------------
//              diverses
//-----------------------------------------

#define MM_250 1417             // WW-Default fuer Hor. Seitenraender: 2.5 cm
#define MM_200 1134             // WW-Default fuer u.Seitenrand: 2.0 cm
#define MM_125 709              // WW-Default fuer vert. K/F-Pos: 1.25 cm

BOOL lcl_ReadBorders( BOOL bVer67, WW8_BRC* brc,
                            WW8PLCFx_Cp_FKP* pPap,
                            const WW8RStyle* pSty = 0,
                            const WW8PLCFx_SEPX* pSep = 0 );


ColorData SwWW8ImplReader::GetCol( BYTE nIco )
{
    return eSwWW8ColA[nIco];
}

/***************************************************************************
#  Seiten - Attribute, die nicht ueber die Attribut-Verwaltung, sondern
#   ueber ...->HasSprm abgearbeitet werden
#   ( ausser OLST, dass weiterhin ein normales Attribut ist )
#**************************************************************************/

static short ReadSprm( const WW8PLCFx_SEPX* pSep, USHORT nId, short nDefaultVal )
{
    BYTE* pS = pSep->HasSprm( nId );            // sprm da ?
    short nVal = ( pS ) ? SVBT16ToShort( pS ) : nDefaultVal;
    return nVal;
}

static USHORT ReadUSprm( const WW8PLCFx_SEPX* pSep, USHORT nId, short nDefaultVal )
{
    BYTE* pS = pSep->HasSprm( nId );            // sprm da ?
    USHORT nVal = ( pS ) ? SVBT16ToShort( pS ) : nDefaultVal;
    return nVal;
}

static BYTE ReadBSprm( const WW8PLCFx_SEPX* pSep, USHORT nId, BYTE nDefaultVal )
{
    BYTE* pS = pSep->HasSprm( nId );            // sprm da ?
    BYTE nVal = ( pS ) ? SVBT8ToByte( pS ) : nDefaultVal;
    return nVal;
}

// dito, aber mit Return, ob vorhanden
static BOOL ReadBSprmRet( BYTE& rnRet, const WW8PLCFx_SEPX* pSep, USHORT nId,
                       BYTE nDefaultVal )
{
    BYTE* pS = pSep->HasSprm( nId );            // sprm da ?
    if( pS ){
        rnRet = SVBT8ToByte( pS );
        return TRUE;
    }else{
        rnRet = nDefaultVal;
        return FALSE;
    }
}

static short ReadULSprm( const WW8PLCFx_SEPX* pSep, USHORT nId, short nDefaultVal )
{
    BYTE* pS = pSep->HasSprm( nId );            // sprm da ?
    short nVal = ( pS ) ? SVBT16ToShort( pS ) : nDefaultVal;
    if( nVal < 0 )      // < 0 bedeutet: nicht verschieben, wenns nicht passt
        nVal = -nVal;
    return nVal;
}

static short ReadLRSprm( const WW8PLCFx_SEPX* pSep, USHORT nId, short nDefaultVal )
{
    BYTE* pS = pSep->HasSprm( nId );            // sprm da ?
    short nVal = ( pS ) ? SVBT16ToShort( pS ) : nDefaultVal;
    if( nVal < 0 )      // < 0 ist beim SW nicht erlaubt
        nVal = 0;
    return nVal;
}


// WW nimmt es mit den Groessen nicht so genau. Wird dieses nicht
// korrigiert, dann erkennt es der Writer nur als Benutzergroesse
// statt als richtiges Papierformat
// AdjustSize() sucht nahe Papiergroessen raus, stark abweichende
// Werte bleiben unveraendert.
static SwTwips AdjustSize( USHORT nPara )
{
    static SwTwips aSizA[] = { lA3Height, lA3Width, lA4Width, lA5Width,
            lB4Height, lB4Width, lB5Width, lB6Width, lC4Width, lC4Height,
            lC5Width, lC6Width, lC65Width, lDLWidth, lDLHeight,lLetterWidth,
            lLetterHeight, lLegalHeight, lTabloidWidth, lTabloidHeight };


    SwTwips nSi = nPara;
    for( USHORT i = 0; i < sizeof( aSizA ) / sizeof( aSizA[0] ); i++ ){
        if( ( nSi - aSizA[i] < 5 )
            && ( nSi - aSizA[i] > -5 ) ){
            nSi = aSizA[i];
            break;
        }
    }
    return nSi;
}


void SwWW8ImplReader::RemoveCols( SwPageDesc& rPageDesc, SwFmtCol*& rpCol )
{
    SwFrmFmt &rFmt0 = rPageDesc.GetMaster();
    const SwFmtCol rCol = rFmt0.GetCol();
    if( rCol.GetNumCols() )
    {
        rpCol = new SwFmtCol( rCol );
        SwFmtCol aCol;
        rFmt0.SetAttr( aCol );
        rPageDesc.GetLeft().SetAttr( aCol );
    }
    else
        rpCol = 0;
}


BOOL SwWW8ImplReader::SetCols(  SwFrmFmt* pFmt,
                                const WW8PLCFx_SEPX* pSep,
                                USHORT nNettoWidth,
                                BOOL bTestOnly  )
{
    if( nIniFlags & WW8FL_NO_COLS )         // ausgeschaltet
        return FALSE;

    //sprmSCcolumns - Anzahl der Spalten - 1
    USHORT nCols = ReadSprm( pSep, (bVer67 ? 144 : 0x500B), 0 );

    nCols ++;                           // Zahl der SW-Spalten
    if( nCols < 2 )
        return FALSE;                   // keine oder bloedsinnige Spalten

    if( bTestOnly )
        return TRUE;

    if( !pFmt )
    {
        ASSERT( !this, "code error:  pFmt hat Zero value!" );
        return FALSE;
    }

    SwFmtCol aCol;                      // Erzeuge SwFmtCol

    //sprmSDxaColumns   - Default-Abstand 1.25 cm
    USHORT nColSpace = ReadUSprm( pSep, (bVer67 ? 145 : 0x900C), 708 );

    // sprmSLBetween
    if( ReadBSprm( pSep, (bVer67 ? 158 : 0x3019), 0 ) )
    {
        aCol.SetLineAdj( COLADJ_TOP );      // Line
        aCol.SetLineHeight( 100 );
        aCol.SetLineColor( Color( COL_BLACK ));
        aCol.SetLineWidth( 1 );
    }

    // sprmSFEvenlySpaced
    BOOL bEven = ReadBSprm( pSep, (bVer67 ? 138 : 0x3005), 1 );

    if( bEven )                         // alle Spalten sind gleich
        aCol.Init( nCols, nColSpace, nNettoWidth );
    else
    {
        aCol.Init( nCols, nColSpace, USHRT_MAX );
        // Spalten unterschiedlich breit: fein, das kann der Writer inzwischen!
        USHORT nWishWidth = 0, nLeftDist = 0, nRightDist = 0;
        USHORT i;
        for( i = 0; i < nCols; i++ )
        {
            SwColumn* pCol = aCol.GetColumns()[ i ];
            pCol->SetLeft( nLeftDist );

            if( i < nCols-1 )
            {
                //sprmSDxaColSpacing
                BYTE* pSD = pSep->HasSprm( (bVer67 ? 137 : 0xF204), BYTE( i ) );

                ASSERT( pSD, "+Sprm 137 (bzw. 0xF204) (Colspacing) fehlt" );
                if( pSD )
                {
                    USHORT nSp = SVBT16ToShort( pSD + 1 );
                    nRightDist = nSp / 2;

                    pCol->SetRight( nSp - nRightDist );
                }
            }
            else
                nRightDist = 0; // letzte Spalte hat keinen Zwischenraum mehr

            //sprmSDxaColWidth
            BYTE* pSW = pSep->HasSprm( (bVer67 ? 136 : 0xF203), BYTE( i ) );

            ASSERT( pSW, "+Sprm 136 (bzw. 0xF203) (ColWidth) fehlt" );
            if( pSW )
                pCol->SetWishWidth(   SVBT16ToShort( pSW + 1 )
                                    + nLeftDist
                                    + pCol->GetRight() );
            // aufsummierte Spaltenbreiten ergeben Gesamtbreite
            nWishWidth += pCol->GetWishWidth();
            // Halber Abstand ist an naechster Spalte noch zu setzen
            nLeftDist = nRightDist;
        }
        aCol.SetWishWidth( nWishWidth );

#ifdef niemalsdef
        // beim RTF-Import:
        aCol._SetOrtho( FALSE );
        USHORT nWishWidth = 0, nHalfPrev = 0;
        for( USHORT n = 0, i = 0; n < aColumns.Count(); n += 2, ++i )
        {
            SwColumn* pCol = aCol.GetColumns()[ i ];
            pCol->SetLeft( nHalfPrev );
            USHORT nSp = aColumns[ n+1 ];
            nHalfPrev = nSp / 2;
            pCol->SetRight( nSp - nHalfPrev );
            pCol->SetWishWidth( aColumns[ n ] +
                                pCol->GetLeft() + pCol->GetRight() );
            nWishWidth += pCol->GetWishWidth();
        }
        aCol.SetWishWidth( nWishWidth );
#endif
    }
    pFmt->SetAttr( aCol );
    return TRUE;
}

// SetPage1() setzt Orientierung, Papiergroesse, LRRaender, Spalten
void SwWW8ImplReader::SetPage1( SwPageDesc* pPageDesc, SwFrmFmt &rFmt,
                                const WW8PLCFx_SEPX* pSep, USHORT nLIdx,
                                BOOL bIgnoreCols )
{
    if( nIniFlags & WW8FL_NO_LRUL )             // Abgeschaltet
        return;

    static USHORT __READONLY_DATA aVer67Ids[] = {
/*sprmSBOrientation*/               162,
/*sprmSXaPage*/                     164,
/*sprmSYaPage*/                     165,
/*sprmSDxaLeft*/                    166,
/*sprmSDxaRight*/                   167,
/*sprmSDzaGutter*/                  170
        };

    static USHORT __READONLY_DATA aVer8Ids[] = {
/*sprmSBOrientation*/               0x301d,
/*sprmSXaPage*/                     0xB01F,
/*sprmSYaPage*/                     0xB020,
/*sprmSDxaLeft*/                    0xB021,
/*sprmSDxaRight*/                   0xB022,
/*sprmSDzaGutter*/                  0xB025
        };

    const USHORT* pIds = bVer67 ? aVer67Ids : aVer8Ids;

                                            // 1. Orientierung
    pPageDesc->SetLandscape( 0 != ReadBSprm( pSep, pIds[0], 0 ) );

                                                // 2. Papiergroesse
    SwFmtFrmSize aSz( rFmt.GetFrmSize() );
    aSz.SetWidth( AdjustSize( ReadUSprm( pSep,  pIds[1], (USHORT)lLetterWidth )));

    nPgWidth = (short)aSz.GetWidth();       // Merken fuer Tabellen u. ae.
    aSz.SetHeight( AdjustSize( ReadUSprm( pSep, pIds[2], (USHORT)lLetterHeight )));

    rFmt.SetAttr( aSz );

    // 3. LR-Raender
    // Default-Raender fuer verschiedene nationale Versionen
    static USHORT __READONLY_DATA nLef[] = { MM_250, 1800 };
    static USHORT __READONLY_DATA nRig[] = { MM_250, 1800 };

    short nWWLe = ReadULSprm( pSep, pIds[3], nLef[nLIdx] );
    short nWWRi = ReadULSprm( pSep, pIds[4], nRig[nLIdx] );
    short nWWGu = ReadULSprm( pSep, pIds[5], 0 );

    nWWLe += nWWGu;

                                            // Left / Right
    rFmt.SetAttr( SvxLRSpaceItem( nWWLe, nWWRi ) );

    nPgLeft = nWWLe;
    nPgRight = nWWRi;

    if( !bIgnoreCols )
    {
        // 4. Spalten
        SetCols( &rFmt, pSep, aSz.GetWidth() - nWWLe - nWWRi );
    }
}




struct WW8ULSpaceData
{
    BOOL  bHasHeader, bHasFooter;
    short nSwHLo, nHdUL,
          nSwFUp, nFtUL,
          nSwUp,  nSwLo;
    WW8ULSpaceData(): bHasHeader( FALSE ), bHasFooter( FALSE ){}
};

void SwWW8ImplReader::GetPageULData( const  WW8PLCFx_SEPX* pSep,
                                     USHORT nLIdx,
                                     BOOL   bFirst,
                                     WW8ULSpaceData& rData )
{
    if( nIniFlags & WW8FL_NO_LRUL )         // abgeschaltet
        return;

            // Default-Raender fuer verschiedene nationale Versionen
    static USHORT __READONLY_DATA nTop[] = { MM_250, 1440 };
    static USHORT __READONLY_DATA nBot[] = { MM_200, 1440 };

    // Einlesen der WW-Einstellungen

    static USHORT __READONLY_DATA aVer67Ids[] = {
/*sprmSDyaTop*/         168,
/*sprmSDyaBottom*/      169,
/*sprmSDyaHdrTop*/      156,
/*sprmSDyaHdrBottom*/   157
        };
    static USHORT __READONLY_DATA aVer8Ids[] = {
/*sprmSDyaTop*/         0x9023,
/*sprmSDyaBottom*/      0x9024,
/*sprmSDyaHdrTop*/      0xB017,
/*sprmSDyaHdrBottom*/   0xB018
        };

    const USHORT* pIds = bVer67 ? aVer67Ids : aVer8Ids;

    short nWWUp = ReadULSprm( pSep, pIds[0], nTop[nLIdx] );
    short nWWLo = ReadULSprm( pSep, pIds[1], nBot[nLIdx] );
    short nWWHTop = ReadULSprm( pSep, pIds[2], MM_125 );
    short nWWFBot = ReadULSprm( pSep, pIds[3], MM_125 );

    if( bFirst )
        rData.bHasHeader = (nCorrIhdt &   WW8_HEADER_FIRST                )!=0;
    else
        rData.bHasHeader = (nCorrIhdt & (WW8_HEADER_EVEN | WW8_HEADER_ODD))!=0;

    if( rData.bHasHeader )
    {
        rData.nSwUp  = nWWHTop;             // Header -> umrechnen
        rData.nSwHLo = nWWUp - nWWHTop;
#ifdef NEW_MINHDSIZ
        if( rData.nSwHLo < MINLAY )
            rData.nSwHLo = MINLAY;
#else //  NEW_MINHDSIZ
        if( nIniHdSiz )
            rData.nSwHLo -= (short)nIniHdSiz;
        else if( nHdTextHeight )
            rData.nSwHLo -= (short)nHdTextHeight;
        else
            rData.nSwHLo -= 240;

        if( rData.nSwHLo < 0 )
            rData.nSwHLo = 0;
#endif // NEW_MINHDSIZ
    }
    else // kein Header -> Up einfach uebernehmen
        rData.nSwUp = nWWUp;

    if( bFirst )
        rData.bHasFooter = (nCorrIhdt &  WW8_FOOTER_FIRST                 )!=0;
    else
        rData.bHasFooter = (nCorrIhdt & (WW8_FOOTER_EVEN | WW8_FOOTER_ODD))!=0;

    if( rData.bHasFooter )
    {
        rData.nSwLo = nWWFBot;              // Footer -> Umrechnen
        rData.nSwFUp = nWWLo - nWWFBot;

#if 0
        if( rData.nSwFUp < MINLAY )
            rData.nSwFUp = MINLAY;
#else //  0
        if( nIniFtSiz )
            rData.nSwFUp -= (short)nIniFtSiz;
        else if( nFtTextHeight )
            rData.nSwFUp -= (short)nFtTextHeight;
        else
            rData.nSwFUp -= 240;

        if( rData.nSwFUp < 0 )
            rData.nSwFUp = 0;
#endif // !0
    }
    else // kein Footer -> Lo einfach uebernehmen
        rData.nSwLo = nWWLo;

    nPgTop = rData.nSwUp;
}


void SwWW8ImplReader::SetPageULSpaceItems( SwFrmFmt &rFmt, WW8ULSpaceData& rData )
{
    if( nIniFlags & WW8FL_NO_LRUL )         // deactivated ?
        return;

    if( rData.bHasHeader )              // ... und Header-Lower setzen
    {
        SwFrmFmt* pHdFmt = (SwFrmFmt*)rFmt.GetHeader().GetHeaderFmt();
        if( pHdFmt )
        {
#ifdef NEW_MINHDSIZ
//              Kopfzeilenhoehe minimal sezten
            pHdFmt->SetAttr( SwFmtFrmSize( ATT_MIN_SIZE, 0, rData.nSwHLo ) );
#else //  NEW_MINHDSIZ
            SvxULSpaceItem aHdUL( pHdFmt->GetULSpace() );
            aHdUL.SetLower(  rData.nSwHLo );
            pHdFmt->SetAttr( aHdUL );
#endif // NEW_MINHDSIZ
        }
    }

    if( rData.bHasFooter )              // ... und Footer-Upper setzen
    {
        SwFrmFmt* pFtFmt = (SwFrmFmt*)rFmt.GetFooter().GetFooterFmt();
        if( pFtFmt )
        {
#if 0
//              Fusszeilenhoehe minimal sezten
            pFtFmt->SetAttr( SwFmtFrmSize( ATT_MIN_SIZE, 0, rData.nSwFUp ) );
#else // 0
            SvxULSpaceItem aFtUL( pFtFmt->GetULSpace() );
            aFtUL.SetUpper(  rData.nSwFUp );
            pFtFmt->SetAttr( aFtUL );
#endif // !0
        }
    }
    SvxULSpaceItem aUL( rData.nSwUp, rData.nSwLo ); // Page-UL setzen
    rFmt.SetAttr( aUL );
}




void SwWW8ImplReader::SetPageBorder( SwPageDesc* pPageDesc0,
                                     SwPageDesc* pPageDesc1,
                            const WW8PLCFx_SEPX* pSep,
                                     USHORT      nLIdx )
{
    WW8_BRC brc[4];
    if( !bVer67 && ::lcl_ReadBorders( bVer67, brc, 0, 0, pSep ) &&
        IsBorder( brc ))
    {
        short nPgbProp = ReadSprm( pSep, 0x522F, 0 );   //sprmSPgbProp

        // ogbProp - pgbApplyTo
        //  0 all Pages in this Section
        //  1 first Page in this Section
        //  2 all Pages in this Section but first
        //  3 whole document (all Sections)
        if( !pPageDesc0 && pPageDesc1 &&
            ( 2 == (nPgbProp & 0x7 ) || 1 == (nPgbProp & 0x7 )) )
        {
            // dann muss aber einer angelegt werden
            SwPaM* pPageDeskPaM = 0;
            pPageDesc0 = CreatePageDesc( 0, &pPageDeskPaM );



            // if PageDesc was inserted check for cols
            // and insert section instead
            if( pPageDeskPaM )
            {
                SwFrmFmt &rFmt = pPageDesc0->GetMaster();
                SetPage1( pPageDesc0, rFmt, pSep, nLIdx, FALSE );
                const SwFmtCol& rCol = rFmt.GetCol();
                // if PageDesc has been inserted and has cols
                // insert a *section* with cols instead
                if( rCol.GetNumCols() )
                {
                    InsertSectionWithWithoutCols( *pPaM, &rCol );
                    // remove columns from PageDesc
                    SwFmtCol aCol;
                    rFmt.SetAttr( aCol );
                }
                delete pPageDeskPaM;
            }



            rDoc.CopyPageDesc( *pPageDesc1, *pPageDesc0, FALSE );
            pPageDesc0->SetFollow( pPageDesc1 );
            pPageDesc1->SetFollow( pPageDesc1 );
        }

        SwFrmFmt* pFmt0 = 0, *pFmt1 = 0;
        if( 2 != (nPgbProp & 0x7 ) && pPageDesc0 )
            pFmt0 = &pPageDesc0->GetMaster();

        if( 1 != (nPgbProp & 0x7 ) && pPageDesc1 )
            pFmt1 = &pPageDesc1->GetMaster();

        SvxBoxItem aBox;
        SetBorder( aBox, brc );

        Rectangle aInnerDist;
        GetBorderDistance( brc, aInnerDist );

        if(    aInnerDist.Left()  || aInnerDist.Top()
            || aInnerDist.Right() || aInnerDist.Bottom() )
        {
            // das muss natuerlich von den Raendern abgezogen werden!
            SwFrmFmt* pFmt = pFmt0;
            for( int i = 0; i < 2; ++i, pFmt = pFmt1 )
                if( pFmt )
                {
                    SvxLRSpaceItem aLR( pFmt->GetLRSpace() );
                    SvxULSpaceItem aUL( pFmt->GetULSpace() );

                    if( 0x20 == ( nPgbProp & 0xe0 ))        // distance from pageborder
                    {
                        // Left
                        if( aInnerDist.Left() < aLR.GetLeft() )
                        {
                            aLR.SetLeft( (USHORT)(aLR.GetLeft()
                                            - aInnerDist.Left() ) );
                            aBox.SetDistance( (USHORT)aInnerDist.Left(),
                                                BOX_LINE_LEFT );
                        }
                        else
                        {
                            aBox.SetDistance( aLR.GetLeft(), BOX_LINE_LEFT );
                            aLR.SetLeft( 0 );
                        }
                        // Right
                        if( aInnerDist.Right() < aLR.GetRight() )
                        {
                            aLR.SetRight( (USHORT)(aLR.GetRight()
                                            - aInnerDist.Right() ) );
                            aBox.SetDistance( (USHORT)aInnerDist.Right(),
                                                BOX_LINE_RIGHT );
                        }
                        else
                        {
                            aBox.SetDistance( aLR.GetRight(), BOX_LINE_RIGHT );
                            aLR.SetRight( 0 );
                        }
                        // Top
                        if( aInnerDist.Top() < aUL.GetUpper() )
                        {
                            aUL.SetUpper( (USHORT)(aUL.GetUpper()
                                            - aInnerDist.Top() ) );
                            aBox.SetDistance( (USHORT)aInnerDist.Top(),
                                                BOX_LINE_TOP );
                        }
                        else
                        {
                            aBox.SetDistance( aUL.GetUpper(), BOX_LINE_TOP );
                            aUL.SetUpper( 0 );
                        }
                        // Bottom
                        if( aInnerDist.Bottom() < aUL.GetLower() )
                        {
                            aUL.SetLower( (USHORT)(aUL.GetLower()
                                            - aInnerDist.Bottom() ) );
                            aBox.SetDistance( (USHORT)aInnerDist.Bottom(),
                                                BOX_LINE_BOTTOM );
                        }
                        else
                        {
                            aBox.SetDistance( aUL.GetLower(), BOX_LINE_BOTTOM );
                            aUL.SetLower( 0 );
                        }

                        pFmt->SetAttr( aLR );
                        pFmt->SetAttr( aUL );
                        pFmt->SetAttr( aBox );
                    }
                    else                                    // distance from text
                    {
                        // Left
                        aBox.SetDistance( (USHORT)aInnerDist.Left(),
                                            BOX_LINE_LEFT );
                        aLR.SetLeft( Max((long)0, (long)(aLR.GetLeft()
                                            - (USHORT)aInnerDist.Left() )));
                        // Right
                        aBox.SetDistance( (USHORT)aInnerDist.Right(),
                                            BOX_LINE_RIGHT );
                        aLR.SetRight(Max((long)0, (long)(aLR.GetRight()
                                            - (USHORT)aInnerDist.Right() )));
                        // Top
                        aBox.SetDistance( (USHORT)aInnerDist.Top(),
                                            BOX_LINE_TOP );
                        aUL.SetUpper(Max(0, aUL.GetUpper()
                                            - (USHORT)aInnerDist.Top() ));
                        // Bottom
                        aBox.SetDistance( (USHORT)aInnerDist.Bottom(),
                                            BOX_LINE_BOTTOM );
                        aUL.SetLower(Max(0, aUL.GetLower()
                                            - (USHORT)aInnerDist.Bottom() ));

                        pFmt->SetAttr( aLR );
                        pFmt->SetAttr( aUL );
                        pFmt->SetAttr( aBox );
                    }
                }

        }
        else
        {
            if( pFmt0 ) pFmt0->SetAttr( aBox );
            if( pFmt1 ) pFmt1->SetAttr( aBox );
        }


        SvxShadowItem aS;
        if( SetShadow( aS, aBox, brc))
        {
            if( pFmt0 ) pFmt0->SetAttr( aS );
            if( pFmt1 ) pFmt1->SetAttr( aS );
        }
    }

//  if( nSwUp > rBox.GetDistance()) nSwUp -= rBox.GetDistance(); else nSwUp = 0;
//  if( nSwLo > rBox.GetDistance()) nSwLo -= rBox.GetDistance(); else nSwLo = 0;
}

void SwWW8ImplReader::SetUseOn( SwPageDesc* pPageDesc0, SwPageDesc* pPageDesc1,
                                const WW8PLCFx_SEPX* pSep, BYTE nCorrIhdt )
{
    BOOL bEven = nCorrIhdt & ( WW8_HEADER_EVEN |  WW8_FOOTER_EVEN );

    UseOnPage eUseBase = ( pWDop->fMirrorMargins ) ? PD_MIRROR : PD_ALL;
    UseOnPage eUse = eUseBase;
    if( !bEven )
        eUse = (UseOnPage)( eUse | PD_HEADERSHARE | PD_FOOTERSHARE );

    if( !pPageDesc1 ){                      // 1 Pagedesc reicht

        pPageDesc0->WriteUseOn( eUse );     // alle Seiten
    }else{                                  // 2 Pagedescs noetig
        pPageDesc0->WriteUseOn( (UseOnPage) // 1. Seite
                    ( eUseBase | PD_HEADERSHARE | PD_FOOTERSHARE ) );
        pPageDesc1->WriteUseOn( eUse );     // Folgeseiten
    }
}


void SwWW8ImplReader::InsertSectionWithWithoutCols( SwPaM& rMyPaM, const SwFmtCol* pCol )
{
    // if this Node is not empty create a new Node befor inserting the Section
    const SwPosition* pPos  = rMyPaM.GetPoint();
    const SwTxtNode* pSttNd = pPos->nNode.GetNode().GetTxtNode();
    USHORT nCntPos          = pPos->nContent.GetIndex();
    if( nCntPos && pSttNd->GetTxt().Len() )
    {
        if( rMyPaM.HasMark() ) // do we have a SELECTION ?
        {
            SwNodeIndex aMarkNd( rMyPaM.GetMark()->nNode, -1 );
            xub_StrLen nMarkCnt = rMyPaM.GetMark()->nContent.GetIndex();
            rDoc.SplitNode( *pPos );

            rMyPaM.Move( fnMoveBackward );
            aMarkNd++;
            rMyPaM.GetMark()->nNode = aMarkNd;
            rMyPaM.GetMark()->nContent.Assign( aMarkNd.GetNode().GetCntntNode(), nMarkCnt );
        }
        else
            rDoc.SplitNode( *pPos );
    }

    SwSection aSection( CONTENT_SECTION, rDoc.GetUniqueSectionName() );

    SfxItemSet aSet( rDoc.GetAttrPool(), aFrmFmtSetRange );

    if( pCol )
        aSet.Put( *pCol );

    if( 2 == pWDop->fpc )
        aSet.Put( SwFmtFtnAtTxtEnd( FTNEND_ATTXTEND ));
    if( 0 == pWDop->epc )
        aSet.Put( SwFmtEndAtTxtEnd( FTNEND_ATTXTEND ));

    pNewSection = rDoc.Insert( rMyPaM, aSection, &aSet );
    ASSERT( !pBehindSection, "pBehindSection ungleich Null! why Recursion?");


    // set PaM into first Node of the new Section
    const SwSectionNode* pSectionNode =
        pNewSection->GetFmt()->GetSectionNode();
    ASSERT( pSectionNode, "Kein Inhalt vorbereitet." );


    pBehindSection = new SwNodeIndex( *pSectionNode->EndOfSectionNode(), 1 );


    rMyPaM.GetPoint()->nNode =
        pSectionNode->GetIndex()+1;
    rMyPaM.GetPoint()->nContent.Assign(
        rMyPaM.GetCntntNode(), 0 );
}



// Bei jedem Abschnittswechsel ( auch am Anfang eines Dokuments ) wird
// CreateSep gerufen, dass dann den / die Pagedesc(s) erzeugt und
// mit Attributen un KF-Texten fuellt.
// Dieses Vorgehen ist noetig geworden, da die UEbersetzung der verschiedenen
// Seiten-Attribute zu stark verflochten ist.

void SwWW8ImplReader::CreateSep(const long nTxtPos)
{/*static BYTE __READONLY_DATA nHdFtType[] =
        { WW8_HEADER_EVEN,  WW8_HEADER_ODD,
            WW8_FOOTER_EVEN,  WW8_FOOTER_ODD,
            WW8_HEADER_FIRST, WW8_FOOTER_FIRST };*/

    if( bTxbxFlySection || bDontCreateSep )
    {
        return;
    }


    BYTE nLastSectionCorrIhdt      = nCorrIhdt;
    BOOL bLastSectionHadATitlePage = bSectionHasATitlePage;

    // Might we have to close a section first?
    BOOL bSectionWasJustClosed = pBehindSection && nTxtPos;
    if( bSectionWasJustClosed )
    {
        // remove preceeding Node
        // if a  0x0d  came immediately before
        if( 0 == pPaM->GetPoint()->nContent.GetIndex() )
            JoinNode( pPaM );
        // set PaM behind section
        pPaM->GetPoint()->nNode = *pBehindSection;
        pPaM->GetPoint()->nContent.Assign(
            pPaM->GetCntntNode(), 0 );

        DELETEZ( pBehindSection );
        DELETEZ( pLastPgDeskIdx );
    }

    SwPageDesc* pOldPageDesc = pPageDesc;
    SwPageDesc* pPageDesc1   = 0;
    WW8PLCFx_SEPX* pSep = pPlcxMan->GetSepPLCF();


    // check if Line Numbering must be activated or resetted
    BYTE* pSprmSNLnnMod = bNew ? pSep->HasSprm( bVer67 ? 154 : 0x5015 ) : 0;
    if( pSprmSNLnnMod && *pSprmSNLnnMod )
    {
        // restart-numbering-mode: 0 per page, 1 per section, 2 never restart
        BYTE* pSprmSLnc = pSep->HasSprm( bVer67 ? 152 : 0x3013 );
        bRestartLnNumPerSection =  pSprmSLnc && 1 == *pSprmSLnc;

        if( bNoLnNumYet )
        {
            SwLineNumberInfo aInfo( rDoc.GetLineNumberInfo() );

            aInfo.SetPaintLineNumbers( TRUE );

            aInfo.SetRestartEachPage( !pSprmSLnc || 0 == *pSprmSLnc );

            BYTE* pSprmSDxaLnn = pSep->HasSprm( bVer67 ? 155:0x9016 );
            if( pSprmSDxaLnn )
            {
                INT16 nSDxaLnn = SVBT16ToShort( pSprmSDxaLnn );
                aInfo.SetPosFromLeft( nSDxaLnn );
            }

            aInfo.SetCountBy( *pSprmSNLnnMod ); //Paint only for every n line


            // to be defaulted features ( HARDCODED in MS Word 6,7,8,9 )
            aInfo.SetCountBlankLines(  TRUE );
            aInfo.SetCountInFlys(      FALSE );
            aInfo.SetPos( LINENUMBER_POS_LEFT );
            SwNumType aNumType; // this sets SVX_NUM_ARABIC per default
            aInfo.SetNumType( aNumType );


            // to be ingnored features ( NOT existing in MS Word 6,7,8,9 )
    //      aInfo.SetDividerCountBy( nDividerCountBy );
    //      aInfo.SetDivider( sDivider );
    //      aInfo.SetCharFmt( pChrFmt );

            rDoc.SetLineNumberInfo( aInfo );
            bNoLnNumYet = FALSE;
        }

        BYTE* pSprmSLnnMin = pSep->HasSprm( bVer67 ? 160:0x501B );
        if(    (    pSprmSLnnMin
                 && 0 < *pSprmSLnnMin )
            || (    bRestartLnNumPerSection
                 && !bNoLnNumYet ) )
        {
            SwFmtLineNumber aLN;
            if( pSprmSLnnMin )
                aLN.SetStartValue( 1 + *pSprmSLnnMin );
            else
                aLN.SetStartValue( 1 );

            NewAttr( aLN );
            pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_LINENUMBER );
        }
        bNoLnNumYet = FALSE;
    }


    // pruefen, ob und wie umzubrechen ist          break code: 0 No break
                                                            //  1 New column
    BYTE* pSprmBkc = pSep->HasSprm( bVer67 ? 142 : 0x3009 );//  2 New page
    BYTE nBreakCode = pSprmBkc ? *pSprmBkc : 2; //              3 Even page
    BOOL bContinuousBreak=(0 == nBreakCode); //                 4 Odd page

    // im wievielten Abschnitt stehen wir denn eigentlich?
    nActSectionNo = (short)( pSep->GetIdx() & 0x00007fff );



    /*
        Welche Kopf-/Fuss-Bereiche sind
        identisch mit dem Vorgaenger-Abschnitt?
    */                                                // sprmSFTitlePage
    bSectionHasATitlePage = (0 != ReadBSprm( pSep, bVer67 ? 143 : 0x300A, 0 ));

    BYTE nIPara;

    BYTE nJustCopyHdFt = 0; // HdFt that are stored in previous WW section prop
                            //           and were NOT USED but may be copied now
    BYTE nSameHdFt     = 0; // HdFt that WERE the same in previous WW section

    short aOldSectionNo[ 6 ];
    memset( &aOldSectionNo, 0, sizeof( aOldSectionNo ) );

    if( bVer67 )
    {
        // sprmSGprfIhdt
        BOOL bSameHdFt = ( !ReadBSprmRet( nIPara, pSep, 153, 0 ) );

        // Leere Hd/Ft will ich nicht
        nCorrIhdt = pHdFt ? HdFtCorrectPara( nIPara ) : 0;
        if( bSameHdFt )
        {
            nSameHdFt = 0xff;
            nJustCopyHdFt = nSameHdFt;
        }
    }
    else
    {
        if( !pHdFt )
            nCorrIhdt = 0;
        else
        {
            // nCorrIhdt ermitteln: WELCHE Hd/Ft sind ueberhaupt zu aktivieren?
            //
            nCorrIhdt = WW8_HEADER_ODD | WW8_FOOTER_ODD;

            if( bSectionHasATitlePage )
                nCorrIhdt |=  WW8_HEADER_FIRST | WW8_FOOTER_FIRST;

            if( pWDop->fFacingPages )
                nCorrIhdt |= WW8_HEADER_EVEN   | WW8_FOOTER_EVEN;

            // den PLCF analysieren:
            //
            // Hd/Ft ist gleich, wenn die Laenge des Eintrags NULL ist
            //                   oder die Ziel-Offsets identisch sind.
            //
            WW8_CP nStart;
            WW8_CP nOldStart;
            long nLen;
            long nOldLen;
            BYTE nHdFtInfosStored=0;

            for( BYTE nI = 0, nMask = 1; nI < 6; nI++, nMask <<= 1 )
            {
                // 1st find ALL Hd/Ft infos that are stored in this WW section
                //     -- or in the sections before this one --
                //     regardless whether they are used in this section or not
                pHdFt->GetTextPosExact( nI+ (nActSectionNo+1)*6, nStart, nLen );
                if( !nLen || nActSectionNo )
                {
                    short nOldSectionNo = nActSectionNo;
                    do
                    {
                        --nOldSectionNo;
                        pHdFt->GetTextPosExact( nI + (nOldSectionNo+1)*6,
                                                nOldStart,
                                                nOldLen);
                        if( nOldLen )
                            aOldSectionNo[ nI ] = nOldSectionNo;
                    }
                    while( nOldSectionNo && !nOldLen );
                }
                if( nLen || nOldLen )
                    nHdFtInfosStored |= nMask;


                if( nCorrIhdt & nMask )
                {
                    if( nActSectionNo )
                    {
                        if(    !nLen
                            || (    (nOldStart == nStart)
                                 && (nOldLen   == nLen  ) ) )
                        {
                            // same Hd/Ft as in previous Section or NO Hd/Ft
                            if( nHdFtInfosStored & nMask )
                            {
                                // prev. sect. really DID have and USE the Hd/Ft
                                if( nLastSectionCorrIhdt & nMask )
                                    nJustCopyHdFt |= nMask;
                                // Hd/Ft may be found in one of prev. sections
                                nSameHdFt |= nMask;
                            }
                            else
                                nCorrIhdt &= ~nMask;// NO prev. Hd/Ft at all
                        }
                    }
                    else
                        if( !nLen )
                            nCorrIhdt &= ~nMask;// 0 in 1.Sect.: Hd/Ft undefined
                }
            }
        }
        // Einlese-Flag auf Use-On-Flag setzen
        nIPara = nCorrIhdt;
    }


    USHORT nLIdx = ( ( pWwFib->lid & 0xff ) == 0x9 ) ? 1 : 0;

    // sprmSNfcPgn
    BYTE nLastNfcPgn = nNfcPgn;
    nNfcPgn = ReadBSprm( pSep, (bVer67 ? 147 : 0x300E), 0 );
    if( nNfcPgn > 4 ) nNfcPgn = 0;


    /*
        Pruefen, ob wir uns den neuen Abschnitt schenken koennen, da kein
        Umbruch erforderlich ist.
    */
    if( pSep->GetIMax() > 1 )
    {
        if( nActSectionNo )
        {
            // Index eins zurueck setzen
            pSep->SetIdx( nActSectionNo-1 );
            // Attribute von vorigem Abschnitt einlesen
            WW8PLCFxDesc aOther;
            pSep->GetSprms( &aOther );
            long nOtherSprmsLen = aOther.nSprmsLen;
            // Kopie der vorigen Attr. anlegen, da sie gleich ueberschrieben werden
            BYTE* pOtherMem = new BYTE[ nOtherSprmsLen ];
            memcpy( pOtherMem, aOther.pMemPos, nOtherSprmsLen );
            // Index wieder richtig setzen
            pSep->SetIdx( nActSectionNo );
            // aktuelle Attribute einlesen
            WW8PLCFxDesc aCur;
            pSep->GetSprms( &aCur );
            // zu ignorierende Attribute sammeln
            SvUShortsSort aIgnore(9, 1);
            if( bContinuousBreak )
            {
                /*
                    zu 'sprmSBkc':
                    Wir sehen zwei WW-Abschnitte auch dann als gleich an,
                    wenn sie sich lediglich im break code unterscheiden.
                    Natuerlich muessen die Kopf/Fuss-Bereiche identisch sein.

                    Ignoriert werden auch die folgenden,
                    spaltenbezogene Flags:
                    SCcolumns, SDxaColumns, SDxaColWidth,
                    SDxaColSpacing, SFEvenlySpaced, SLBetween
                    und: SFFacingCol (nur bei Ver8)

                    We will also ignore a different formatting of the page number here.

                    We will also ignore different line numbering settings here
                    since only the very 1st line numbering settings are taken
                    into account anyway, see: bNoLnNum
                */
                static USHORT __READONLY_DATA aVer67Ids[ 13 ] =
                    {136, 137, 138, 139, 142, 144, 145, 147, 152, 154, 155, 158, 160};//sortiert!
                static USHORT __READONLY_DATA aVer8Ids[  14] =
                    {0x3005, 0x3006, 0x3009, 0x300E, 0x3013, 0x3019, 0x3229, 0x500B, 0x5015, 0x501B,
                     0x900C, 0x9016, 0xF203, 0xF204};//sortiert!
                if( bVer67 )
                    aIgnore.Insert( aVer67Ids, 13);
                else
                    aIgnore.Insert( aVer8Ids,  14);
            }

            // nachschauen, ob die nicht zu ignor. Attr. gleich sind
            BOOL bEqual =    (bSectionHasATitlePage ==bLastSectionHadATitlePage)
                          && (nCorrIhdt == nLastSectionCorrIhdt)
                          && (nCorrIhdt == (nCorrIhdt & nJustCopyHdFt))
                          && (nNfcPgn   == nLastNfcPgn)
                          && pSep->CompareSprms(pOtherMem,
                                                nOtherSprmsLen,
                                                &aIgnore);
            // Kopie der vorigen Attr. wieder freigeben
            delete pOtherMem;

            if( bEqual )
            {
                switch( nBreakCode )
                {
                case 0:
                    {
                        if( 0 < pPaM->GetPoint()->nContent.GetIndex() )
                            rDoc.AppendTxtNode( *pPaM->GetPoint() );
                        // Abschnittsweschsel: neuer Bereich
                        SwSection aSection( CONTENT_SECTION,
                                            rDoc.GetUniqueSectionName() );

                        SfxItemSet aSet( rDoc.GetAttrPool(), aFrmFmtSetRange );
                        if( 2 == pWDop->fpc )
                            aSet.Put( SwFmtFtnAtTxtEnd( FTNEND_ATTXTEND ));
                        if( 3 == pWDop->epc )
                            aSet.Put( SwFmtEndAtTxtEnd( FTNEND_ATTXTEND ));

                        pNewSection = rDoc.Insert( *pPaM, aSection, &aSet );
                        pBehindSection = new SwNodeIndex( pPaM->GetPoint()->nNode );

                        // Anzahl der Spalten einstellen
                        if( pPageDesc )
                        {
                            SwFrmFmt& rFmt = pPageDesc->GetMaster();
                            const SwFmtFrmSize&   rSz = rFmt.GetFrmSize();
                            const SvxLRSpaceItem& rLR = rFmt.GetLRSpace();
                            SwTwips nWidth = rSz.GetWidth();
                            USHORT  nLeft  = rLR.GetTxtLeft();
                            USHORT  nRight = rLR.GetRight();
                            SetCols( pNewSection->GetFmt(), pSep, nWidth - nLeft - nRight );
                        }
                        // PaM in Node der Section setzen
                        const SwSectionNode* pSectionNode =
                            pNewSection->GetFmt()->GetSectionNode();
                        ASSERT( pSectionNode, "Kein Inhalt vorbereitet." );
                        pPaM->GetPoint()->nNode =
                            pSectionNode->GetIndex()+1;
                        pPaM->GetPoint()->nContent.Assign(
                            pPaM->GetCntntNode(), 0 );
                    }

                    break;
                case 1: if( bNew )
                            rDoc.Insert(*pPaM,
                                SvxFmtBreakItem( SVX_BREAK_COLUMN_BEFORE ));
                        break;
                //case 2:
                //case 3:   // alle drei Faelle -> PgDesc-Format-Einfuegung
                //case 4:
                default: {
                            /*
                                Wir koennen den aktuellen PgDesk einsetzen,
                                da dies immer der 1st-Page Deskriptor ist,
                                nie der Follow!
                                So geht es, auch wenn der Break auf Seite 7
                                kommt, wieder mit einer ERSTEN Seite weiter.
                            */
                            if( bNew )
                            {
                                if( 0 < pPaM->GetPoint()->nContent.GetIndex() )
                                    rDoc.AppendTxtNode( *pPaM->GetPoint() );

                                if( pPageDesc )
                                    rDoc.Insert(*pPaM, SwFmtPageDesc( pPageDesc ));
                                else
                                    // kein voriger PgDesc vorhanden?
                                    rDoc.Insert(*pPaM,
                                                SvxFmtBreakItem( SVX_BREAK_PAGE_BEFORE ));
                                SetLastPgDeskIdx();
                            }
                         }break;
                }
                return;
            // ========  Das war's Freunde, jetzt nichts wie weg hier!
            }
        }
        if(    bNew
            && (    bSectionWasJustClosed
                 || (pPageDesc != &rDoc._GetPageDesc( 0 )) ) )
        {
            // Create and *insert* PageDesc
            SwPaM* pPageDeskPaM = 0;
            pPageDesc = CreatePageDesc( 0, &pPageDeskPaM );
            SwFrmFmt &rFmt = pPageDesc->GetMaster();
            SetPage1( pPageDesc, rFmt, pSep, nLIdx, FALSE );
            // if PageDesc has been inserted and has cols
            // insert a *section* with cols instead
            if( pPageDeskPaM )
            {
                const SwFmtCol& rCol = rFmt.GetCol();
                if( rCol.GetNumCols() )
                {
                    InsertSectionWithWithoutCols( *pPaM, &rCol );
                    // remove columns from PageDesc
                    SwFmtCol aCol;
                    rFmt.SetAttr( aCol );
                }
                delete pPageDeskPaM;
            }
        }
    }
    else
        if( bNew )
            pPageDesc = &rDoc._GetPageDesc( 0 );    // Standard

    if( !bNew )
        return;


    // Seitennummernformat speichern
    {
        static SvxExtNumType __READONLY_DATA aNumTyp[ 5 ] = {
            SVX_NUM_ARABIC, SVX_NUM_ROMAN_UPPER, SVX_NUM_ROMAN_LOWER,
            SVX_NUM_CHARS_UPPER_LETTER_N, SVX_NUM_CHARS_LOWER_LETTER_N };

        SwNumType aType; aType.eType = aNumTyp[ nNfcPgn ];
        pPageDesc->SetNumType( aType );
    }

    if( !bVer67 )
    {
        // Seitennummer neu starten - sprmSFPgnRestart
        {
            BYTE nfPgnRestart = ReadBSprm( pSep, 0x3011, 0 );
            if( nfPgnRestart )
            {
                const SfxPoolItem* pItem;
                const SfxItemSet* pSet;
                if(     ( 0 != (pSet = pPaM->GetCntntNode()->GetpSwAttrSet()) )
                     && ( SFX_ITEM_SET ==
                          pSet->GetItemState(RES_PAGEDESC, FALSE, &pItem) ) )
                {
                    // read Pagination Start attribute - sprmSPgnStart
                    BYTE nPgnStart = ReadBSprm( pSep, 0x501C, 0 );
                    ((SwFmtPageDesc*)pItem)->SetNumOffset( nPgnStart );
                }
                else
                if( pPageDesc == &rDoc.GetPageDesc( 0 ) )
                {
                    // read Pagination Start attribute - sprmSPgnStart
                    BYTE nPgnStart = ReadBSprm( pSep, 0x501C, 0 );
                    SwFmtPageDesc aPgDesc( pPageDesc );
                    aPgDesc.SetNumOffset( nPgnStart );
                    rDoc.Insert( *pPaM, aPgDesc );
                    SetLastPgDeskIdx();
                }
            }
        }

        // Chapterlevel und Chapterdelimiter ? (sprmScnsPgn & sprmSiHeadingPgn)
        BYTE* p = pSep->HasSprm( 0x3001 );
        if( p && *p )
        {
            bPgChpLevel = TRUE;
            nPgChpLevel = *p - 1;
            if( MAXLEVEL <= nPgChpLevel )
                nPgChpLevel = MAXLEVEL - 1;

            if( 0 != (p = pSep->HasSprm( 0x3000 )) )
                nPgChpDelim = *p;
            else
                nPgChpDelim = 0;
        }
        else
            bPgChpLevel = FALSE;
    }

    // Vorsicht: gibt es ueberhaupt einen vorigen Page Descriptor?
    if( !pOldPageDesc )
        nSameHdFt = 0;

    SwFrmFmt &rFmt0 = pPageDesc->GetMaster();

    if( !bSectionHasATitlePage )
    {
        // Gegebenenfalls Einstellungen des vorigen PgDesc uebernehmen
        // und das Einlese-Flag entsprechend korrigieren,
        // damit nur noch die Eintraege gelesen werden, die NICHT
        // vom vorigen PgDesc zu uebernehmen sind.
        //
        if( 0 < nSameHdFt )
        {
            CopyPageDescHdFt( pOldPageDesc, pPageDesc, nSameHdFt );
            if( bVer67 )
                nIPara  =  0;
            else
                nIPara &= ~nSameHdFt;
        }

        WW8ULSpaceData aULData;
        GetPageULData( pSep, nLIdx, FALSE, aULData );

        // dann Header / Footer lesen, falls noch noetig
        //
        if( nIPara )
        {
            SetHdFt( pPageDesc, 0, pSep, nIPara );
        }
        // und uebrige Einstellungen updaten
        //

        SetPage1( pPageDesc, // Orientierung, Hoehe, Breite, Vertikale Formatierung
                  rFmt0,
                  pSep,
                  nLIdx,
                  TRUE );

        SetPageULSpaceItems( rFmt0, aULData );
        SetPageBorder( 0, pPageDesc, pSep, nLIdx );
    }
    else
    {
        // Hier beachten:
        // ==============
        //
        //      pPageDesc  = erste Seite
        //      pPageDesc1 = Folge-Seiten
        //


        // erst folgende PageDesc-Werte einstellen:
        //
        //    Orientierung, Hoehe, Breite
        //
        SetPage1( pPageDesc, // Orientierung, Hoehe, Breite, Vertikale Formatierung
                    rFmt0,
                    pSep,
                    nLIdx,
                    TRUE );

        // dann den PageDesc1 anlegen fuer Folge-Seiten
        //
        pPageDesc1 = CreatePageDesc( pPageDesc );

        // Gegebenenfalls Einstellungen des/der vorigen PgDesc uebernehmen
        //
        if( 0 < nSameHdFt )
        {
            // ggfs. erst den alten 1st-Seite-PgDesc suchen und dessen
            // Einstellungen uebernehmen
            //
            if( nSameHdFt & (WW8_HEADER_FIRST | WW8_FOOTER_FIRST) )
            {

/*
                // suchen
                const SwPageDesc* pOld1stPageDesc = 0;

                USHORT nSize = rDoc.GetPageDescCnt();
                if( nSize )
                {
                    for( USHORT n = 0; n < nSize; ++n )
                    {
                        const SwPageDesc& rPageDesc = rDoc.GetPageDesc( n );
                        if(    (&rPageDesc            != pOldPageDesc)
                            && (rPageDesc.GetFollow() == pOldPageDesc) )
                        {
                            pOld1stPageDesc = &rPageDesc;
                            break;
                        }
                    }
                }
                // uebernehmen
                if( pOld1stPageDesc )
                {
                    CopyPageDescHdFt( pOld1stPageDesc, pPageDesc,
                        nSameHdFt & (WW8_HEADER_FIRST | WW8_FOOTER_FIRST) );
                }
                else
                {
*/

                if( pOldPageDesc == pOldPageDesc->GetFollow() )
                {
                    // hoppla, die vorige Section hatte keine 1st Page?
                    //
                    // also: auslesen der in WW8 fuer die nicht vorhandene
                    //       1st Page gespeicherten Hd/Ft-Einstellungen...
                    //
                    // Beachte: pPageDesc1 MUSS hier mit uebergeben werden,
                    //          obwohl wir dessen Werte ja eigentlich hier
                    //          gar nicht einlesen wollen!
                    //          Das macht aber nichts, denn wir stellen den
                    //          "SetHdFt( nIPara )"-Parameter so ein, dass
                    //          nur der 1.-Seite-PgDesc eingelesen wird.
                    //
                    short nSaveSectionNo = nActSectionNo;
                    if( bVer67 )
                        --nActSectionNo;
                    else
                        nActSectionNo =   aOldSectionNo[ 4 ]
                                        ? aOldSectionNo[ 4 ]    // Hd 1st
                                        : aOldSectionNo[ 5 ];   // Ft 1st
                    SetHdFt( pPageDesc, pPageDesc1, pSep,
                             nSameHdFt & (WW8_HEADER_FIRST | WW8_FOOTER_FIRST) );
                    nActSectionNo = nSaveSectionNo;
                }
                else
                    CopyPageDescHdFt( pOldPageDesc, pPageDesc,
                        nSameHdFt & (WW8_HEADER_FIRST | WW8_FOOTER_FIRST) );
            }

            // ggfs. Werte des vorigen PgDesc fuer Folge-Seiten uebernehmen
            //
            if( nSameHdFt & (   WW8_HEADER_EVEN  | WW8_HEADER_ODD
                              | WW8_FOOTER_EVEN  | WW8_FOOTER_ODD ) )
            {
                CopyPageDescHdFt( pOldPageDesc, pPageDesc1,
                    nSameHdFt & (   WW8_HEADER_EVEN  | WW8_HEADER_ODD
                                  | WW8_FOOTER_EVEN  | WW8_FOOTER_ODD ) );
            }
            // das Einlese-Flag entsprechend korrigieren,
            // damit nur noch die Eintraege gelesen werden, die NICHT
            // von vorigem/n PgDesc(s) zu uebernehmen sind.
            //
            if( bVer67 )
                nIPara  =  0;
            else
                nIPara &= ~nSameHdFt;
        }

        SwFrmFmt &rFmt1 = pPageDesc1->GetMaster();

        WW8ULSpaceData aULData0, aULData1;
        GetPageULData( pSep, nLIdx, TRUE,  aULData0 ); // Vertikale Formatierung
        GetPageULData( pSep, nLIdx, FALSE, aULData1 ); // einzeln, da KF evtl. verschieden

        // dann Header / Footer lesen, falls noch noetig
        //
        if( nIPara )
        {
            SetHdFt( pPageDesc, pPageDesc1, pSep, nIPara );
        }

        // und uebrige Einstellungen updaten
        //
        SetPageULSpaceItems( rFmt0, aULData0 ); // Vertikale Formatierung
        SetPageULSpaceItems( rFmt1, aULData1 ); // einzeln, da KF evtl. verschieden
        SetPageBorder( pPageDesc, pPageDesc1, pSep, nLIdx );
    }


    SetUseOn( pPageDesc, pPageDesc1, pSep, nCorrIhdt );


    static BYTE __READONLY_DATA aPaperBinIds[ 17 ] =
        {5,2,4,0,3,0,0,0,0,0,0,0,0,0,0,0,1};
        // WW                          SW
        // ------------------------------
        //  0 == default                5
        //  1 == Upper paper tray       2
        //  2 == Lower paper tray       4
        //  4 == Manual paper feed      3
        // 15 == Automatically select   0
        // 16 == First tray available   1

    BYTE* pSprmSDmBinFirst = pSep->HasSprm( bVer67 ? 140 : 0x5007 );
    BYTE* pSprmSDmBinOther = pSep->HasSprm( bVer67 ? 141 : 0x5008  );
    if( pSprmSDmBinFirst && (17 > *pSprmSDmBinFirst) )
    {
        SvxPaperBinItem aItem( ITEMID_PAPERBIN, aPaperBinIds[ *pSprmSDmBinFirst ] );
        pPageDesc->GetMaster().SetAttr( aItem );
    }
    if( pSprmSDmBinOther && (17 > *pSprmSDmBinOther) )
    {
        SvxPaperBinItem aItem( ITEMID_PAPERBIN, aPaperBinIds[ *pSprmSDmBinOther ] );
        SwFrmFmt &rFmtOther = pPageDesc1 ? pPageDesc1->GetMaster() : pPageDesc->GetLeft();
        rFmtOther.SetAttr( aItem );
    }

    // Kopf / Fuss - Index Updaten
    if( pHdFt )
        pHdFt->UpdateIndex( nCorrIhdt );    // Damit der Index auch spaeter noch stimmt

    // Die Attribute OLST
    // werden weiterhin ueber die WWSprmTab abgehandelt
}


void SwWW8ImplReader::CopyPageDescHdFt( const SwPageDesc* pOrgPageDesc,
                                        SwPageDesc* pNewPageDesc, BYTE nCode )
{
    // copy first header content section
    if( nCode & WW8_HEADER_FIRST )
    {
        rDoc.CopyHeader(pOrgPageDesc->GetMaster(),
                        pNewPageDesc->GetMaster());
    }
    // copy first footer content section
    if( nCode & WW8_FOOTER_FIRST )
    {
        rDoc.CopyFooter(pOrgPageDesc->GetMaster(),
                        pNewPageDesc->GetMaster());
    }
    if( nCode & (   WW8_HEADER_ODD  | WW8_FOOTER_ODD
                  | WW8_HEADER_EVEN | WW8_FOOTER_EVEN ) )
    {
        // determine PageDesc of follow pages
        const SwPageDesc* pOrgFollowPageDesc = pOrgPageDesc->GetFollow();
        // copy odd header content section
        if( nCode & WW8_HEADER_ODD )
        {
            rDoc.CopyHeader(pOrgFollowPageDesc->GetMaster(),
                            pNewPageDesc->GetMaster() );
        }
        // copy odd footer content section
        if( nCode & WW8_FOOTER_ODD )
        {
            rDoc.CopyFooter(pOrgFollowPageDesc->GetMaster(),
                            pNewPageDesc->GetMaster());
        }
        // copy even header content section
        if( nCode & WW8_HEADER_EVEN )
        {
            rDoc.CopyHeader(pOrgFollowPageDesc->GetLeft(),
                            pNewPageDesc->GetLeft());
        }
        // copy even footer content section
        if( nCode & WW8_FOOTER_EVEN )
        {
            rDoc.CopyFooter(pOrgFollowPageDesc->GetLeft(),
                            pNewPageDesc->GetLeft());
        }
    }
}


//------------------------------------------------------
//   Hilfsroutinen fuer Grafiken und Apos und Tabellen
//------------------------------------------------------

static BOOL _SetWW8_BRC( BOOL bVer67, WW8_BRC& rVar, BYTE* pS )
{
    if( pS )
        if( bVer67 )
            (WW8_BRCVer6&)rVar = *((WW8_BRCVer6*)pS);
        else
            rVar = *((WW8_BRC*)pS);
    else
    {
        *(USHORT*)rVar.aBits1 = 0;
        *(USHORT*)rVar.aBits2 = 0;
    }

    return 0 != pS;
}

BOOL lcl_ReadBorders( BOOL bVer67, WW8_BRC* brc,
                            WW8PLCFx_Cp_FKP* pPap,
                            const WW8RStyle* pSty,
                            const WW8PLCFx_SEPX* pSep )
{
// Ausgegend von diesen defines:
//      #define WW8_TOP 0
//      #define WW8_LEFT 1
//      #define WW8_BOT 2
//      #define WW8_RIGHT 3
//      #define WW8_BETW 4

    BOOL bBorder = FALSE;
    if( pSep )
    {
        if( !bVer67 )
        {
             BYTE* pSprm[4];

            //  sprmSBrcTop, sprmSBrcLeft, sprmSBrcBottom, sprmSBrcRight
             if( pSep->Find4Sprms(  0x702B,   0x702C,   0x702D,   0x702E,
                                    pSprm[0], pSprm[1], pSprm[2], pSprm[3] ) )
             {
                for( int i = 0; i < 4; ++i )
                    bBorder |= _SetWW8_BRC( bVer67, brc[ i ], pSprm[ i ] );
             }
        }
    }
    else
    {

        static USHORT __READONLY_DATA aVer67Ids[5] =
                { 38, 39, 40, 41, 42 };

        static USHORT __READONLY_DATA aVer8Ids[5] =
                { 0x6424, 0x6425, 0x6426, 0x6427, 0x6428 };

        const USHORT* pIds = bVer67 ? aVer67Ids : aVer8Ids;

        if( pPap )
        {
            for( int i = 0; i < 5; ++i, ++pIds )
                bBorder |= _SetWW8_BRC( bVer67, brc[ i ], pPap->HasSprm( *pIds ));
        }
        else if( pSty )
        {
            for( int i = 0; i < 5; ++i, ++pIds )
                bBorder |= _SetWW8_BRC( bVer67, brc[ i ], pSty->HasParaSprm( *pIds ));
        }
        else
            ASSERT( pSty || pPap, "WW8PLCFx_Cp_FKP and WW8RStyle "
                               "and WW8PLCFx_SEPX is 0" );
    }

    return bBorder;
}



static SvxBorderLine& Set1Border( BOOL bVer67, SvxBorderLine& rLine,
                                    const WW8_BRC& rBor )
{
    // Deklarationen gemaess BOXITEM.HXX
    WW8_DECL_LINETAB_ARRAY

    // Match-Tabelle: verwandelt Ver67 Border Codes in Ver8-Typen
    static USHORT __READONLY_DATA nTabBorderCode67ToCode8[] = // Aussenlinie
    {
        0, 0, 0, 0, 0, 0, 0, 0, 0,
        1, 1,   2, 2, 3, 0, 0, 0, 1, 2, 3, 4, 4, 1, 1,
        WW8_DECL_LINETAB_OFS_DOUBLE +0,
        WW8_DECL_LINETAB_OFS_DOUBLE +1,
        WW8_DECL_LINETAB_OFS_DOUBLE +1,
        WW8_DECL_LINETAB_OFS_DOUBLE +2,
        WW8_DECL_LINETAB_OFS_DOUBLE +2,
        WW8_DECL_LINETAB_OFS_DOUBLE +3,
        WW8_DECL_LINETAB_OFS_DOUBLE +0,
        WW8_DECL_LINETAB_OFS_DOUBLE +0
    };


        // Vor Aufruf muss sichergestellt werden, dass aBor & 0x1f != 0 ist,
        // d.h. ueberhaupt eine Linie vorhanden ist

//  short nIdx = ( aBrc1 & 0x7 )        // aBor.dxpLineWidth ( Liniendicke )
//          + 8 * ( aBrc1 >> 3 & 0x3 ); // brcType, 0 = none / dotted / dashed
                                        // 1 = single width, 2 = double width
                                        // 3 = doppelte Linie ( = 3-fache Dicke )

    BYTE nCol;
    short nIdx;

    if( bVer67 )
    {
        UINT16 aBrc1 = SVBT16ToShort( rBor.aBits1 );
        nIdx = nTabBorderCode67ToCode8[ aBrc1 & 0x1f ];
        nCol = ( (aBrc1 >> 6) & 0x1f ); // aBor.ico
    }
    else
    {
        // Sicherheitsmassnahme (Kodes ueber 25 sind undokumentiert)
        nIdx = rBor.aBits1[1];
        if( 25 < nIdx )
            nIdx = 1;

        // Angabe in 8tel Punkten, also mal 2.5, da 1 Punkt = 20 Twips
        short nMSLineWidth  = rBor.aBits1[ 0 ] * 20 / 8;
        short nMSTotalWidth = nMSLineWidth;

        // erst die Gesamt-Randbreite errechnen, zur weiteren Entscheidungsgrundlage
        switch( nIdx )
        {
            /*
            // Einzel-Linien sind Wurst
            case  1:
            case  2:
            case  5:
            case  6:
            case 22:
            case  7:
            case  8:
            case  9:
            // Schraffurbalken dito
            case 23:
            */
            // Mehrfach- und Spezial-Linien, die wir wie besonders behandeln
            // (in der Reihenfolge, in der sie im Winword-97-Dialog erscheinen)
            case  3: nMSTotalWidth = 3*nMSLineWidth;break;
            case 10: nMSTotalWidth = 5*nMSLineWidth;break;
            case 18:
            case 17: nMSTotalWidth = 7*nMSLineWidth;break;
            case 16:
            case 19: nMSTotalWidth =12*nMSLineWidth;break;
            case 20: nMSTotalWidth = 4*nMSLineWidth;break;
            case 12:
            case 11:
            case 21: nMSTotalWidth = 6*nMSLineWidth;break;
            case 13:
            case 15:
            case 14:
            case 24:
            case 25: nMSTotalWidth = 8*nMSLineWidth;break;
        }

        // dann auf unsere Randtypen mappen
        switch( nIdx )
        {
            // zuerst die Einzel-Linien
            case  1:
            case  2:
            case  5:
            case  6:
            case 22:
            case  7:
            case  8:
            case  9:
            // UND die Sonderfaelle, die wir durch eine Einzel-Linie
            case 13:                // bzw. notfalls durch eine Doppel-Linie darstellen
            case 16:
            case 19:
            case 24:
            case 25:         if( nMSTotalWidth < 11) nIdx =            0;//   1 Twip bei uns
                            else if( nMSTotalWidth < 46) nIdx =            1;//  20 Twips
                            else if( nMSTotalWidth < 66) nIdx =            2;//  50
                            else if( nMSTotalWidth < 91) nIdx =            3;//  80
                            else if( nMSTotalWidth <126) nIdx =            4;// 100
                            // Pfusch: fuer die ganz dicken Linien muessen
                            //         wir doppelte Linien malen, weil unsere
                            //               Einfach-Linie nicht dicker als 5 Punkt wird
                            else if( nMSTotalWidth <166) nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+2;// 150
                            else                         nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+5;// 180
                            break;
            // dann den Schraffurbalken, den wir durch eine doppelte Linie darstellen
            case 23:    nIdx =  6;
                                break;
            // dann die Doppel-Linien, fuer die wir feine Entsprechungen haben :-)))
            case  3:
            case 10:         if( nMSTotalWidth <  46) nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 0;//  22 Twips bei uns
                            else if( nMSTotalWidth < 106) nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 1;//  60
                            else                          nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 2;// 150
                            break;
            case 12:         if( nMSTotalWidth <  87) nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 8;//  71 Twips bei uns
                            else if( nMSTotalWidth < 117) nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 9;// 101
                            else if( nMSTotalWidth < 166) nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+10;// 131
                            else                          nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 5;// 180
                            break;
            case 11:         if( nMSTotalWidth < 137) nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 4;//  90 Twips bei uns
                            else                          nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 6;// 180
                            break;
            case 15:         if( nMSTotalWidth <  46) nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 0;//  22 Twips bei uns
                            else if( nMSTotalWidth < 106) nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 1;//  60
                            else if( nMSTotalWidth < 166) nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 2;// 150
                            else                          nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 5;// 180
                            break;
            case 14:         if( nMSTotalWidth <  46) nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 0;//  22 Twips bei uns
                            else if( nMSTotalWidth <  76) nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 1;//  60
                            else if( nMSTotalWidth < 121) nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 4;//  90
                            else if( nMSTotalWidth < 166) nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 2;// 150
                            else                          nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 6;// 180
                            break;
            case 18:         if( nMSTotalWidth <  46) nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 0;//  22 Twips bei uns
                            else if( nMSTotalWidth <  62) nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 7;//  52
                            else if( nMSTotalWidth <  87) nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 8;//  71
                            else if( nMSTotalWidth < 117) nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 9;// 101
                            else if( nMSTotalWidth < 156) nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+10;// 131
                            else                          nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 5;// 180
                            break;
            case 17:         if( nMSTotalWidth <  46) nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 0;//  22 Twips bei uns
                            else if( nMSTotalWidth <  72) nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 7;//  52
                            else if( nMSTotalWidth < 137) nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 4;//  90
                            else                          nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 6;// 180
                            break;
            case 20:         if( nMSTotalWidth <  46) nIdx =             1;//  20 Twips bei uns
                            else                          nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 1;//  60
                            break;
            case 21:                                  nIdx = WW8_DECL_LINETAB_OFS_DOUBLE+ 1;//  60 Twips bei uns
                            break;

            default: nIdx = 0;
        }

        nCol  = rBor.aBits2[0]; // aBor.ico
    }

    const WW8_BordersSO& rBorders = nLineTabVer8[ nIdx ];
    rLine.SetOutWidth( rBorders.Out  );
    rLine.SetInWidth ( rBorders.In   );
    rLine.SetDistance( rBorders.Dist );
    rLine.SetColor( eSwWW8ColA[ nCol ] );

    /*
        Achtung:  noch zu tun!!!
        ========
        eigentlich sollten wir uns jetzt die kumulierte Randbreite merken
        ( als da waere:  rBorders.Out + rBorders.In + rBorders.Dist )
        und sie nach draussen melden, damit die aufrufenden Methoden ggfs.
        die Objekt-Breiten entsprechend vergroessern!

        Warum?
        ======
        Weil Winword die Raender  a u s s e n  drauf malt, wir hingegen sie
        innen rein zeichnen, was bei uns zu einem kleineren Innenraum fuehrt!
    */

    return rLine;
}


BOOL lcl_IsBorder( BOOL bVer67, const WW8_BRC* pbrc, BOOL bChkBtwn=FALSE )
{
    if( bVer67  )
        return ( pbrc[WW8_TOP  ].aBits1[0] & 0x18 ) ||  // brcType  != 0
               ( pbrc[WW8_LEFT ].aBits1[0] & 0x18 ) ||
               ( pbrc[WW8_BOT  ].aBits1[0] & 0x18 ) ||
               ( pbrc[WW8_RIGHT].aBits1[0] & 0x18 ) ||
               ( bChkBtwn && ( pbrc[WW8_BETW ].aBits1[0] & 0x18 ));
                    // Abfrage auf 0x1f statt 0x18 ist noetig, da zumindest einige
                    // WW-Versionen ( 6.0 US ) bei dotted brcType auf 0 setzen
    else
        return pbrc[WW8_TOP  ].aBits1[1] ||         // brcType  != 0
               pbrc[WW8_LEFT ].aBits1[1] ||
               pbrc[WW8_BOT  ].aBits1[1] ||
               pbrc[WW8_RIGHT].aBits1[1] ||
               (bChkBtwn && pbrc[WW8_BETW ].aBits1[1]);
}

BOOL SwWW8ImplReader::IsBorder( const WW8_BRC* pbrc, BOOL bChkBtwn )
{
    return lcl_IsBorder( bVer67, pbrc, bChkBtwn );
}

BOOL SwWW8ImplReader::SetBorder( SvxBoxItem& rBox, const WW8_BRC* pbrc,
                                    BOOL bChkBtwn )
{
    SvxBorderLine aLine;
    BOOL bChange = FALSE;
    static USHORT __READONLY_DATA aIdArr[ 10 ] = {
            WW8_TOP,    BOX_LINE_TOP,
            WW8_LEFT,   BOX_LINE_LEFT,
            WW8_RIGHT,  BOX_LINE_RIGHT,
            WW8_BOT,    BOX_LINE_BOTTOM,
            WW8_BETW,   BOX_LINE_BOTTOM };


    for( int i = 0, nEnd = 8; i < nEnd; i += 2 )
    {
        // ungueltige Borders ausfiltern
        const WW8_BRC& rB = pbrc[ aIdArr[ i ] ];
        if( !(( rB.aBits1[0] == 0xff && rB.aBits1[1] == 0xff ) ||
                0 == ( bVer67
                        ? ( rB.aBits1[0] & 0x001f )     // Version 6/7
                        : rB.aBits1[1] ) ))             // Version 8
        {
            rBox.SetLine( &Set1Border( bVer67, aLine, rB ), aIdArr[ i+1 ] );
            bChange = TRUE;
        }
        else if( 6 == i && bChkBtwn )   // wenn Botton nichts war,
            nEnd += 2;                  // dann ggfs. auch Between befragen
    }
    return bChange;
}


BOOL SwWW8ImplReader::SetShadow( SvxShadowItem& rShadow,
                                const SvxBoxItem& rBox, const WW8_BRC pbrc[4] )
{
    BOOL bRet = ( bVer67 ? (pbrc[WW8_RIGHT].aBits1[ 1 ] & 0x20 )
                         : (pbrc[WW8_RIGHT].aBits2[ 1 ] & 0x20 ) ) &&
                rBox.GetRight();
    if( bRet )
    {
        rShadow.SetColor( Color( COL_BLACK ));

//          aS.SetWidth( 28 );
// JP 19.11.98: abhaengig von der Breite der rechten Kante der Box
        const SvxBorderLine& rLine = *rBox.GetRight();
        rShadow.SetWidth( ( rLine.GetOutWidth() + rLine.GetInWidth() +
                        rLine.GetDistance() ) );

        rShadow.SetLocation( SVX_SHADOW_BOTTOMRIGHT );
        bRet = TRUE;
    }
    return bRet;
}

void SwWW8ImplReader::GetBorderDistance( WW8_BRC* pbrc, Rectangle& rInnerDist )
{
    //USHORT nInnerMargn = 0;

    // 'dptSpace' is stored in 3 bits of 'Border Code (BRC)'
    if( bVer67 )
        rInnerDist = Rectangle(((pbrc[ 0 ].aBits1[1] >> 3) & 0x1f) * 20,
                               ((pbrc[ 1 ].aBits1[1] >> 3) & 0x1f) * 20,
                               ((pbrc[ 2 ].aBits1[1] >> 3) & 0x1f) * 20,
                               ((pbrc[ 3 ].aBits1[1] >> 3) & 0x1f) * 20 );
    else
        rInnerDist = Rectangle( (pbrc[ 0 ].aBits2[1]       & 0x1f) * 20,
                                (pbrc[ 1 ].aBits2[1]       & 0x1f) * 20,
                                (pbrc[ 2 ].aBits2[1]       & 0x1f) * 20,
                                (pbrc[ 3 ].aBits2[1]       & 0x1f) * 20 );

    /*
        for( int n = 0; n < 4; ++n )
            nInnerMargn += ( pbrc[ n ].aBits2[1]       & 0x1f); // dxpSpace
    //return nInnerMargn * 5;           // von Pt nach Twips / 4 Kanten
    */
}


void SwWW8ImplReader::SetFlyBordersShadow(  SfxItemSet& rFlySet,
                                            const WW8_BRC pbrc[4],
                                            USHORT nInnerMgn )
{
    if( IsBorder( pbrc ) )
    {
        SvxBoxItem aBox;
        SetBorder( aBox, pbrc );

        if( nInnerMgn )
            aBox.SetDistance( nInnerMgn );          // Rand innen
        rFlySet.Put( aBox );

        // fShadow
        SvxShadowItem aShadow;
        if( SetShadow( aShadow, aBox, pbrc ))
            rFlySet.Put( aShadow );
    }
}



//-----------------------------------------
//              APOs
//-----------------------------------------
                            // fuer Berechnung der minimalen FrameSize
#define MAX_BORDER_SIZE 210         // so breit ist max. der Border
#define MAX_EMPTY_BORDER 10         // fuer +-1-Fehler, mindestens 1


static short GetLineWidth( BOOL bVer67, const WW8_BRC& rBor )
{
/*
    register UINT16 nBits = SVBT16ToShort( rBor.aBits1 );
    register short n = nBits & 0x7;      // dxpLineWidth
    if( n >= 6 )
        n = 1;
    return n * ( ( nBits >> 3 & 0x3 ) + 1 ) * 15;   // aBor.brcType
                            // brcType Linien mit je n * 3/4 point Dicke
*/

/*
JP 19.11.98: wenn dann muss es so richtig sein, die Version MUSS beachtet werden
    UINT16 nIdx = bVer67 ? ((rBor.aBits1[ 0 ] & 0x18) >> 3) + 1
                         : rBor.aBits1[ 1 ];
    UINT16 nWidth = bVer67  ? ((rBor.aBits1[ 0 ] & 0x7) * 15 )  // 3/4pt
                            : (rBor.aBits1[ 0 ] * 5 / 2);       // 1/8pt
    return nIdx * nWidth;
*/

//JP 19.11.98: aber warum werden nicht die SW-Borders zu Berechnung
//              herangezogen??
    SvxBorderLine aLine;
    ::Set1Border( bVer67, aLine, rBor );
    return aLine.GetOutWidth() + aLine.GetInWidth() + aLine.GetDistance();
}

static void FlySecur1( short& rSize, const short nMgn1, const short nMgn2,
                       const BOOL bBorder )
{
    register short nMin = MINFLY
            + ( bBorder ) ? MAX_BORDER_SIZE : MAX_EMPTY_BORDER;

    if ( rSize < nMin )
        rSize = nMin;
}

INLINE_AUSSER_HP BOOL SetValSprm( short* pVar, WW8PLCFx_Cp_FKP* pPap,
                                  USHORT nId )
{
    register BYTE* pS = pPap->HasSprm( nId );
    if( pS )
        *pVar = (INT16)SVBT16ToShort( pS );
    return ( pS != 0 );
}

INLINE_AUSSER_HP BOOL SetValSprm( short* pVar, const WW8RStyle* pStyle,
                                  USHORT nId )
{
    register BYTE* pS = pStyle->HasParaSprm( nId );
    if( pS )
        *pVar = (INT16)SVBT16ToShort( pS );
    return ( pS != 0 );
}

WW8FlyPara::WW8FlyPara( BOOL bIsVer67, const WW8FlyPara* pSrc /* = 0 */ )
{
    if ( pSrc )
        memcpy( this, pSrc, sizeof( WW8FlyPara ) ); // Copy-Ctor
    else
    {
        memset( this, 0, sizeof( WW8FlyPara ) );    // Default-Ctor
        nSp37 = 2;                                  // Default: Umfluss
    }
    bVer67 = bIsVer67;
}


// WW8FlyPara::operator == vergleicht alles, was in der Definition vor
// den Borders steht!
// dieses wird u.a. fuer TestSameApo benoetigt.
int WW8FlyPara::operator == ( const WW8FlyPara& rSrc ) const
{
    ASSERT( ( (BYTE*)rSrc.brc - (BYTE*)&rSrc < sizeof( WW8FlyPara ) ),
            "WW8FlyPara::operator == geht schief" );
    return !memcmp( this, &rSrc, (BYTE*)rSrc.brc - (BYTE*)&rSrc );
            // memcmp ist moeglich, da die gesamte Struktur beim Initialisieren
            // incl. Luecken mit 0 gefuellt wird und sich damit durch die
            // Luecken keine falschen Unterschiede ergeben koennen.
            // Ausserdem sind alle Elemente aligned, so dass keine Luecken
            // existieren
}


// Read fuer normalen Text

BOOL WW8FlyPara::Read( BYTE* pSprm29, WW8PLCFx_Cp_FKP* pPap )
{
//  WW8PLCFx_Cp_FKP* pPap = pPlcxMan->GetPapPLCF();

    if( pSprm29 )
        nSp29 = *pSprm29;                           // PPC ( Bindung )

    BYTE* pS = 0;

    if( bVer67 )
    {
        SetValSprm( &nSp26,         pPap, 26 ); // X-Position       //sprmPDxaAbs
        SetValSprm( &nSp27,         pPap, 27 ); // Y-Position       //sprmPDyaAbs
        SetValSprm( (short*)&nSp45, pPap, 45 ); // Hoehe                //sprmPWHeightAbs
        SetValSprm( (short*)&nSp28, pPap, 28 ); // Breite               //sprmPDxaWidth
        SetValSprm( &nSp49,         pPap, 49 ); // L/R-Raender  //sprmPDxaFromText
        SetValSprm( &nSp48,         pPap, 48 ); // U/L-Raender  //sprmPDyaFromText

        pS = pPap->HasSprm( 37 );                               // Umfluss          //sprmPWr
        if( pS )
            nSp37 = *pS;

        pS = pPap->HasSprm( 46 );                               // DropCap          //sprmPDcs
    }
    else
    {
        SetValSprm( &nSp26,         pPap, 0x8418 ); // X-Position
        SetValSprm( &nSp27,         pPap, 0x8419 ); // Y-Position
        SetValSprm( (short*)&nSp45, pPap, 0x442B ); // Hoehe
        SetValSprm( (short*)&nSp28, pPap, 0x841A ); // Breite
        SetValSprm( &nSp49,         pPap, 0x842F ); // L/R-Raender
        SetValSprm( &nSp48,         pPap, 0x842E ); // U/L-Raender

        pS = pPap->HasSprm( 0x2423 );                               // Umfluss
        if( pS )
            nSp37 = *pS;

        pS = pPap->HasSprm( 0x442C );                               // DropCap
    }

    bDropCap = pS != 0;

    if( !nSp29 && !nSp27 && !nSp49 && !nSp37 )      // alles 0 heisst
        return FALSE;                               // Apo ist nicht vorhanden

    if( ::lcl_ReadBorders( bVer67, brc, pPap ))     // Umrandung
    {
        bBorderLines = ::lcl_IsBorder( bVer67, brc );
        bBorder = TRUE;
    }
    else
        bBorderLines = bBorder = FALSE;
    return TRUE;
}

BOOL WW8FlyPara::ReadFull( BYTE* pSprm29, SwWW8ImplReader* pIo )
{
    WW8PLCFMan* pPlcxMan = pIo->pPlcxMan;
    WW8PLCFx_Cp_FKP* pPap = pPlcxMan->GetPapPLCF();

    BOOL bOk = Read( pSprm29, pPap );   // Lies Apo-Parameter

    do{             // Block zum rausspringen
        if( !bOk )                      // schiefgegangen
            break;
        if( nSp45 != 0 /* || nSp28 != 0 */ )
            break;                      // bGrafApo nur bei Hoehe automatisch
        if( pIo->pWwFib->fComplex )
            break;                      // (*pPap)++ geht bei FastSave schief
                                        // -> bei FastSave kein Test auf Grafik-APO
        SvStream* pIoStrm = pIo->pStrm;
        ULONG nPos = pIoStrm->Tell();
        WW8PLCFxSave1 aSave;
        pPlcxMan->GetPap()->Save( aSave );
        bGrafApo = FALSE;

        do{             // Block zum rausspringen

            BYTE nTxt[2];

            pIoStrm->Read( nTxt, 2 );                   // lies Text
            if( nTxt[0] != 0x01 || nTxt[1] != 0x0d )// nur Grafik + CR ?
                break;                              // Nein

            (*pPap)++;                              // Naechste Zeile

            // In APO ?
            //sprmPPc
            BYTE* pS = pPap->HasSprm( bVer67 ? 29 : 0x261B );

            // Nein -> Grafik-Apo
            if( !pS ){
                bGrafApo = TRUE;
                break;                              // Ende des APO
            }
            USHORT nColl = pPap->GetIstd();
            if( nColl >= pIo->nColls || !pIo->pCollA[nColl].pFmt
                || !pIo->pCollA[nColl].bColl )
                nColl = 0;                          // Unguelige Style-Id

            BOOL bNowStyleApo = pIo->pCollA[nColl].pWWFly != 0; // Apo in StyleDef
    //      BOOL bNowApo = bNowStyleApo || ( pS != 0 ); // hier Apo
            WW8FlyPara aF( bVer67, bNowStyleApo ? pIo->pCollA[nColl].pWWFly : 0 );
                                                    // Neuer FlaPara zum Vergleich
            aF.Read( pS, pPap );                    // WWPara fuer neuen Para
            if( !( aF == *this ) )                  // selber APO ? ( oder neuer ? )
                bGrafApo = TRUE;                    // nein -> 1-zeiliger APO
                                                    //      -> Grafik-APO
        }
        while( 0 );                                 // Block zum rausspringen

        pPlcxMan->GetPap()->Restore( aSave );
        pIoStrm->Seek( nPos );
    }while( 0 );                                    // Block zum rausspringen
    return bOk;
}


// Read fuer Apo-Defs in Styledefs
BOOL WW8FlyPara::Read( BYTE* pSprm29, WW8RStyle* pStyle )
{
    if( pSprm29 )
        nSp29 = *pSprm29;                           // PPC ( Bindung )

    BYTE* pS = 0;
    if( bVer67 )
    {
        SetValSprm( &nSp26,         pStyle, 26 );   // X-Position
        SetValSprm( &nSp27,         pStyle, 27 );   // Y-Position
        SetValSprm( (short*)&nSp45, pStyle, 45 );   // Hoehe
        SetValSprm( (short*)&nSp28, pStyle, 28 );   // Breite
        SetValSprm( &nSp49,         pStyle, 49 );   // L/R-Raender
        SetValSprm( &nSp48,         pStyle, 48 );   // U/L-Raender

        pS = pStyle->HasParaSprm( 37 );             // Umfluss
        if( pS )
            nSp37 = *pS;

        pS = pStyle->HasParaSprm( 46 );             // DropCap
    }
    else
    {
        SetValSprm( &nSp26,         pStyle, 0x8418 );   // X-Position
        SetValSprm( &nSp27,         pStyle, 0x8419 );   // Y-Position
        SetValSprm( (short*)&nSp45, pStyle, 0x442B );   // Hoehe
        SetValSprm( (short*)&nSp28, pStyle, 0x841A );   // Breite
        SetValSprm( &nSp49,         pStyle, 0x842F );   // L/R-Raender
        SetValSprm( &nSp48,         pStyle, 0x842E );   // U/L-Raender

        pS = pStyle->HasParaSprm( 0x2423 );             // Umfluss
        if( pS )
            nSp37 = *pS;

        pS = pStyle->HasParaSprm( 0x442C );             // DropCap
    }

    bDropCap = pS != 0;

    if( !nSp29 && !nSp27 && !nSp49 && !nSp37 )      // alles 0 heisst
        return FALSE;                               // Apo ist nicht vorhanden

    if( ::lcl_ReadBorders( bVer67, brc, 0, pStyle ) )       // Umrandung
    {
        bBorderLines = ::lcl_IsBorder( bVer67, brc );
        bBorder = TRUE;
    }
    else
        bBorderLines = bBorder = FALSE;
    return TRUE;
}




WW8SwFlyPara::WW8SwFlyPara( SwPaM& rPaM,
                            SwWW8ImplReader& rIo,
                            WW8FlyPara& rWW,
                            short nPgTop,
                            short nPgLeft,
                            short nPgWidth,
                            INT32 nIniFlyDx, INT32 nIniFlyDy )
{
    memset( this, 0, sizeof( WW8SwFlyPara ) );  // Initialisieren
    nNewNettoWidth = MINFLY;                    // Minimum

    eSurround = ( rWW.nSp37 > 1 ) ? SURROUND_PARALLEL : SURROUND_NONE;

    nHeight = rWW.nSp45;
    if( nHeight & 0x8000 )
    {
        nHeight &= 0x7fff;
        eHeightFix = ATT_MIN_SIZE;
    }
    else
        eHeightFix = ATT_FIX_SIZE;

    if( nHeight <= MINFLY )
    {                           // keine Angabe oder Stuss
        eHeightFix = ATT_MIN_SIZE;
        nHeight = MINFLY;
    }

    nWidth = nNettoWidth = rWW.nSp28;
    if( nWidth <= 10 )                              // Auto-Breite
    {
        bAutoWidth = TRUE;
        nWidth = nNettoWidth =
            rWW.bDropCap ? MINFLY : (nPgWidth ? nPgWidth : 2268); // 4 cm
    }
    if( nWidth <= MINFLY )
        nWidth = nNettoWidth = MINFLY;              // Minimale Breite

    eVAlign = VERT_NONE;                            // Defaults
    eHAlign = HORI_NONE;
    nYPos = 0;
    nXPos = 0;

    nRiMgn = nLeMgn = rWW.nSp49;
    nLoMgn = nUpMgn = rWW.nSp48;

                // Wenn der Fly links, rechts, oben oder unten aligned ist,
                // wird der aeussere Textabstand ignoriert, da sonst
                // der Fly an falscher Position landen wuerde
                // JP 18.11.98: Problematisch wird es nur bei Innen/Aussen

    switch( rWW.nSp27 )             // besondere Y-Positionen ?
    {
    case -4:  eVAlign = VERT_TOP;       nUpMgn = 0; break;  // oben
    case -8:  eVAlign = VERT_CENTER;                break;  // zentriert
    case -12: eVAlign = VERT_BOTTOM;    nLoMgn = 0; break;  // unten
    default:  nYPos = rWW.nSp27 + (short)nIniFlyDy; break;  // Korrekturen per Ini-Datei
    }

    switch( rWW.nSp26 )                 // besondere X-Positionen ?
    {
    case 0:     eHAlign = HORI_LEFT;        nLeMgn = 0; break;  // links
    case -4:    eHAlign = HORI_CENTER;                  break;  // zentriert
    case -8:    eHAlign = HORI_RIGHT;       nRiMgn = 0; break;  // rechts
    case -12:   eHAlign = HORI_LEFT; bToggelPos = TRUE; break;  // innen
    case -16:   eHAlign = HORI_RIGHT; bToggelPos = TRUE;break;  // aussen
    default:  nXPos = rWW.nSp26 + (short)nIniFlyDx;     break;  // Korrekturen per Ini-Datei
    }

    // Bindung
    BYTE nYBind = (( rWW.nSp29 & 0x30 ) >> 4);
    switch ( nYBind )
    {                                       // Y - Bindung bestimmt Sw-Bindung
    case 0: eAnchor = FLY_PAGE;             // Vert Margin
            eVRel = REL_PG_PRTAREA;
            break;
    case 1: eAnchor = FLY_PAGE;             // Vert Page
            eVRel = REL_PG_FRAME;
            break;                          // 2=Vert. Paragraph, 3=Use Default
    default:eAnchor = FLY_AT_CNTNT;
            eVRel = PRTAREA;
            if( nYPos < 0 )
                nYPos = 0;                  // koennen wir nicht
            break;
    }

    if( (rIo.bIsHeader || rIo.bIsFooter) && (FLY_AT_CNTNT != eAnchor) )
    {
        eAnchor = FLY_AT_CNTNT;
        if( rIo.bIsHeader )
        {
            nYPos -= nPgTop;
            // nXPos will be decreased at the very end of this C'tor
        }
        else
        {
            nYPos = 0;
        }
        rIo.pNode_FLY_AT_CNTNT = &rPaM.GetPoint()->nNode.GetNode();
    }

    BYTE nXBind = ( rWW.nSp29 & 0xc0 ) >> 6;
    switch ( nXBind )           // X - Bindung -> Koordinatentransformation
    {
    case 0:                                 // Hor. Spalte
    case 1:                                 // Hor. Absatz
            eHRel = (FLY_PAGE == eAnchor) ? REL_PG_PRTAREA : PRTAREA;
            break;
/*  case 2:*/                               // Hor. Seite
/*  case 3:*/                               // Use Default
    default:{
                eHRel = (FLY_PAGE == eAnchor) ? REL_PG_FRAME : FRAME;

                // important: allways set REL_PG_FRAME in sections with columns
                if( eHRel != REL_PG_FRAME )
                {
                    const SwSectionNode* pSectNd
                        = rPaM.GetPoint()->nNode.GetNode().FindSectionNode();
                    if( pSectNd )
                    {
                        const SwSectionFmt* pFmt
                            = pSectNd->GetSection().GetFmt();
                        if( pFmt )
                        {
                            if( 1 < pFmt->GetCol().GetNumCols() )
                                eHRel = REL_PG_FRAME;
                        }
                    }
                }
            }
            break;
    }

    INT16 nLeLMgn = 0, nRiLMgn = 0;     // aus Liniendicke entstehende Raender

    if( rWW.bBorder )                   // Raender innerhalb der Umrandung
    {
        WW8_BRC5& rBrc = rWW.brc;

        // dxpSpace aller 4 Borders bestimmen, zum InnerMargin aufaddieren
        // und die linken/rechten zur Groesse dazu rechnen
        // Die Angaben sind in Point
        short nLeft, nRight;
        if( rWW.bVer67 )
        {
            nLeft  = (rBrc[WW8_LEFT ].aBits1[1] >> 3) & 0x1f;   // dxpSpace
            nRight = (rBrc[WW8_RIGHT].aBits1[1] >> 3) & 0x1f;   // dxpSpace
            // muessen obere / untere Liniendicken auch beruecksichtigt werden ???

            nInnerMgn = (( rBrc[WW8_TOP].aBits1[1] ) >> 3 & 0x1f) +
                        (( rBrc[WW8_BOT].aBits1[1] ) >> 3 & 0x1f);
        }
        else
        {
            nLeft  = rBrc[WW8_LEFT ].aBits2[1] & 0x1f;      // dxpSpace
            nRight = rBrc[WW8_RIGHT].aBits2[1] & 0x1f;      // dxpSpace
            // muessen obere / untere Liniendicken auch beruecksichtigt werden ???

            nInnerMgn = (rBrc[WW8_TOP].aBits2[1] & 0x1f) +
                        (rBrc[WW8_BOT].aBits2[1] & 0x1f);
        }

        nLeLMgn += 20 * nLeft;          // dxpSpace
        nRiLMgn += 20 * nRight;         // dxpSpace

        nLeLMgn += GetLineWidth( rWW.bVer67, rBrc[WW8_LEFT] );
        nRiLMgn += GetLineWidth( rWW.bVer67, rBrc[WW8_RIGHT] );

        nInnerMgn += nLeft + nRight;
        nInnerMgn *= 5;     // Mittelwert in Twips (20 * 4 Kanten)
    }
                                            // Raender ausserhalb der Umrandung
    nWidth += nLeLMgn + nRiLMgn;
//  nHeight += nUpLMgn + nLoLMgn;

    FlySecur1( nWidth, nLeMgn, nRiMgn, rWW.bBorderLines );          // passen Raender ?
    FlySecur1( nHeight, nUpMgn, nLoMgn, rWW.bBorderLines );

            // Seitenrand-Bindung: Wenn die Position mit der jetzigen
            // SW-Bindung nicht zu erreichen ist, dann waehle andere Bindung
            // Absatz-Bindung: Nicht anfassen
    if(     (eAnchor == FLY_PAGE      ) // Bindung: Seitenrand
        &&  (eHRel   == REL_PG_PRTAREA) // und abs. positioniert
        &&  (eVAlign == VERT_NONE     )
        &&  (eHAlign == HORI_NONE     ) )
    {
        if( nYPos < nPgTop )            // echter neg. Y-Wert
            eHRel = eVRel = REL_PG_FRAME;
        if( nXPos < nPgLeft )           // echter neg. X-Wert
            eHRel = eVRel = REL_PG_FRAME;
    }


            // Sicherheitsabfragen, damit der der Writer nichts unverdauliches
            // bekommt
    if( nYPos < 0 )
        nYPos = 0;

    if( nXPos < 0 )
        nXPos = 0;
    /*
        // eine Writer-Kuriositaet: auch wenn Abstaende vom Seitenrand
        // gezaehlt werden sollen, muessen die Positionen als Abstaende vom
        // Papierrand angegeben werden
        // bei Absatzgebundenen Frames geht die Zaehlung immer von
        // der Printarea aus
    */
    if( (FRAME == eHRel) && (FLY_AT_CNTNT == eAnchor) )
    {
        // hier duerfen neg. Werte bis minimal -nPgLeft entstehen
        nXPos -= nPgLeft;
        if( rIo.bTable )
            nXPos -= rIo.GetTableLeft();
    }
}

// hat ein Fly in WW eine automatische Breite, dann muss das durch
// nachtraegliches Anpassen der ( im SW festen ) Fly-Breite simuliert werden.
// Dabei kann die Fly-Breite groesser oder kleiner werden, da der Default-Wert
// ohne Wissen ueber den Inhalt eingesetzt wird.
void WW8SwFlyPara::BoxUpWidth( long nWidth )
{
    if( bAutoWidth && nWidth > nNewNettoWidth )
        nNewNettoWidth = nWidth;
};

// Die Klasse WW8FlySet ist von SfxItemSet abgeleitet und stellt auch
// im Prizip nicht mehr zur Verfuegung, ist aber fuer mich besser
// zu handeln
// WW8FlySet-ctor fuer Apos und Graf-Apos
WW8FlySet::WW8FlySet( SwWW8ImplReader& rReader, /*const*/ WW8FlyPara* pFW,
                    /*const*/ WW8SwFlyPara* pFS, BOOL bGraf )
:SfxItemSet( rReader.rDoc.GetAttrPool(), RES_FRMATR_BEGIN, RES_FRMATR_END-1 )

{
    if( !rReader.bNew )
        Reader::ResetFrmFmtAttrs( *this );  // Abstand/Umrandung raus

                                            // Position
    Put( SwFmtHoriOrient( pFS->nXPos, pFS->eHAlign, pFS->eHRel, pFS->bToggelPos ));
    Put( SwFmtVertOrient( pFS->nYPos, pFS->eVAlign, pFS->eVRel ) );

    if( pFS->nLeMgn || pFS->nRiMgn )        // Raender setzen
    {
        SvxLRSpaceItem aLR;
        aLR.SetTxtLeft( pFS->nLeMgn );
        aLR.SetRight( pFS->nRiMgn );
        Put( aLR );
    }
    if( pFS->nUpMgn || pFS->nLoMgn )
    {
        SvxULSpaceItem aUL;
        aUL.SetUpper( pFS->nUpMgn );
        aUL.SetLower( pFS->nLoMgn );
        Put( aUL );
    }


    SwFmtSurround aSur( pFS->eSurround );   // Umfluss

//  GoldCut umfliesst inzwischen nur dann auf beiden Seiten, wenn der Fly
//  schmaler als ca. 1.5cm ist. Also entspricht normales Parallel besser
//  dem WW-Verhalten.
//  aSur.SetGoldCut( pFS->eSurround == SURROUND_PARALLEL );

    Put( aSur );

    rReader.SetFlyBordersShadow( *this, (WW8_BRC*)pFW->brc,
                                          pFS->nInnerMgn );
            // der 5. Parameter ist immer 0, daher geht beim Cast nix verloren

    if( !bGraf ){           // Textrahmen->Anker und Groesse einstellen
        Put( SwFmtAnchor( pFS->eAnchor, 1 ) );
                                            // Groesse einstellen
        Put( SwFmtFrmSize( pFS->eHeightFix, pFS->nWidth, pFS->nHeight ));
    }
}

// WW8FlySet-ctor fuer zeichengebundene Grafiken
WW8FlySet::WW8FlySet( SwWW8ImplReader& rReader, const SwPaM* pPaM,
                    const WW8_PIC& rPic, long nWidth, long nHeight )
:SfxItemSet( rReader.rDoc.GetAttrPool(), RES_FRMATR_BEGIN, RES_FRMATR_END-1 )
{
    if( !rReader.bNew )
        Reader::ResetFrmFmtAttrs( *this );  // Abstand/Umrandung raus

    SwFmtAnchor aAnchor( FLY_IN_CNTNT );
    aAnchor.SetAnchor( pPaM->GetPoint() );
    Put( aAnchor );
    Put( SwFmtFrmSize( ATT_FIX_SIZE, nWidth, nHeight ) );

//  Put( SwFmtHoriOrient( 0, HORI_NONE, REL_CHAR, FALSE ));
//  Put( SwFmtVertOrient( 0, VERT_NONE, REL_CHAR ) );
    Put( SwFmtVertOrient( 0, VERT_TOP, FRAME ));

    rReader.SetFlyBordersShadow( *this, rPic.rgbrc, 0 );
}


BOOL SwWW8ImplReader::StartApo( BYTE* pSprm29, BOOL bNowStyleApo )
{
    pWFlyPara = new WW8FlyPara ( bVer67, bNowStyleApo  ?  pCollA[nAktColl].pWWFly : 0 );

    // APO-Parameter ermitteln und Test auf bGrafApo
    if( !pWFlyPara->ReadFull( pSprm29, this ) )
    {
        DELETEZ( pWFlyPara );
        return FALSE;
    }


    pSFlyPara = new WW8SwFlyPara( *pPaM,
                                  *this,
                                  *pWFlyPara,
                                  nPgTop,
                                  nPgLeft,
                                  (nPgWidth - nPgRight - nPgLeft),
                                  nIniFlyDx,
                                  nIniFlyDy );
        // nPg... nicht aus PageDesc, da bei Defaultraendern noch nicht gesetzt

    if( !pWFlyPara->bGrafApo )
    {

        // Innerhalb des GrafApo muessen Textattribute
        // ignoriert werden, da sie sonst auf den
        // folgenden Zeilen landen.
        // Der Rahmen wird nur eingefuegt, wenn er
        // *nicht* nur zum Positionieren einer einzelnen
        // Grafik dient.
        // Ist es ein Grafik-Rahmen, dann werden
        // pWFlyPara und pSFlyPara behalten und die
        // daraus resultierenden Attribute beim
        // Einfuegen der Grafik auf die Grafik angewendet.

//      SwAttrSet aFlySet( rDoc.GetAttrPool(), RES_FRMATR_BEGIN, RES_FRMATR_END - 1 );
//      SetApoCharacteristics( aFlySet, pWFlyPara, pSFlyPara );
        WW8FlySet aFlySet( *this, pWFlyPara, pSFlyPara, FALSE );

        pSFlyPara->pFlyFmt = rDoc.MakeFlySection( pSFlyPara->eAnchor,
                                              pPaM->GetPoint(), &aFlySet );
        if( FLY_IN_CNTNT != pSFlyPara->eAnchor )
            pCtrlStck->NewAttr( *pPaM->GetPoint(), SwFltAnchor( pSFlyPara->pFlyFmt ) );

                                // merke Pos im Haupttext
        pSFlyPara->pMainTextPos = new SwPosition( *pPaM->GetPoint() );
        nLastFlyNode = pSFlyPara->pMainTextPos->nNode.GetIndex();

                                // Alle Attribute schliessen, da sonst
                                // Attribute entstehen koennen, die
                                // in Flys reinragen
        pCtrlStck->SetAttr( *pPaM->GetPoint(), 0, FALSE );
        pEndStck->SetAttr( *pPaM->GetPoint(), 0, FALSE );


                                // Setze Pam in den FlyFrame
        const SwFmtCntnt& rCntnt = pSFlyPara->pFlyFmt->GetCntnt();
        ASSERT( rCntnt.GetCntntIdx(), "Kein Inhalt vorbereitet." );
        pPaM->GetPoint()->nNode = rCntnt.GetCntntIdx()->GetIndex() + 1;
        pPaM->GetPoint()->nContent.Assign( pPaM->GetCntntNode(), 0 );

        // 1) ReadText() wird nicht wie beim W4W-Reader rekursiv aufgerufen,
        //    da die Laenge des Apo zu diesen Zeitpunkt noch nicht feststeht,
        //    ReadText() diese Angabe aber braucht.
        // 2) Der CtrlStck wird nicht neu erzeugt.
        //    die Char-Attribute laufen weiter ( AErger mit SW-Attributen )
        //    Paraattribute muessten am Ende jeden Absatzes zurueckgesetzt
        //    sein, d.h. es duerften am Absatzende keine Paraattribute
        //    auf dem Stack liegen
    }
    return TRUE;
}

BOOL SwWW8ImplReader::JoinNode( SwPaM* pPam, BOOL bStealAttr )
{
    BOOL bRet = FALSE;
    pPam->GetPoint()->nContent = 0;         // an den Anfang der Zeile gehen

    SwNodeIndex aPref( pPam->GetPoint()->nNode, -1 );

    SwTxtNode* pNode = aPref.GetNode().GetTxtNode();
    if( pNode )
    {
        pPaM->GetPoint()->nNode = aPref;
        pPaM->GetPoint()->nContent.Assign( pNode, pNode->GetTxt().Len() );

        if( bStealAttr )
            pCtrlStck->StealAttr( pPam->GetPoint() );
        pNode->JoinNext();
        bRet = TRUE;
    }
    return bRet;
}

void SwWW8ImplReader::StopApo()
{
    if( pWFlyPara->bGrafApo ){  // Grafik-Rahmen, der *nicht* eingefuegt wurde
                                // leeren Absatz incl. Attributen entfernen
        JoinNode( pPaM, TRUE );

    }
    else
    {                           // Der Rahmen wurde nur eingefuegt, wenn er
                                // *nicht* nur zum Positionieren einer einzelnen
                                // Grafik dient.
        JoinNode( pPaM, FALSE );// UEberfluessigen Absatz entfernen

        if( !pSFlyPara->pMainTextPos || !pWFlyPara ){
            ASSERT( pSFlyPara->pMainTextPos, "StopApo: pMainTextPos ist 0" );
            ASSERT( pWFlyPara, "StopApo: pWFlyPara ist 0" );
            return;
        }
                                // Alle Attribute schliessen, da sonst
                                // Attribute entstehen koennen, die
                                // aus Flys rausragen
        pCtrlStck->SetAttr( *pPaM->GetPoint(), 0, FALSE );
        pEndStck->SetAttr( *pPaM->GetPoint(), 0, FALSE );


// Ist die Fly-Breite durch eine innenliegende Grafik vergroessert worden
// ( bei automatischer Breite des Flys ), dann muss die Breite des SW-Flys
// entsprechend umgesetzt werden, da der SW keine automatische Breite kennt.

        if( pSFlyPara->nNewNettoWidth > MINFLY )    // BoxUpWidth ?
        {
            long nW = pSFlyPara->nNewNettoWidth;
            nW += pSFlyPara->nWidth - pSFlyPara->nNettoWidth;   // Rand dazu
            pSFlyPara->pFlyFmt->SetAttr(
                SwFmtFrmSize( pSFlyPara->eHeightFix, nW, pSFlyPara->nHeight ) );
        }
        else if( !pWFlyPara->nSp28 )  // *no* width set ->> automatic width
        {
            SfxItemSet aFlySet( pSFlyPara->pFlyFmt->GetAttrSet() );
            aFlySet.ClearItem( RES_FRM_SIZE );
            CalculateFlySize( aFlySet, pSFlyPara->pMainTextPos->nNode, nPgWidth );

            pSFlyPara->pFlyFmt->SetAttr( aFlySet.Get( RES_FRM_SIZE ) );
        }

        *pPaM->GetPoint() = *pSFlyPara->pMainTextPos;
        DELETEZ( pSFlyPara->pMainTextPos );

// Damit die Frames bei Einfuegen in existierendes Doc erzeugt werden,
// wird in fltshell.cxx beim Setzen des FltAnchor-Attributes
// pFlyFrm->MakeFrms() gerufen

    }
    DELETEZ( pSFlyPara );
    DELETEZ( pWFlyPara );
}

// TestSameApo() beantwortet die Frage, ob es dasselbe APO oder ein neues ist
BOOL SwWW8ImplReader::TestSameApo( BYTE* pSprm29, BOOL bNowStyleApo )
{
    if( !pWFlyPara )
    {
        ASSERT( pWFlyPara, " Wo ist mein pWFlyPara ? " );
        return TRUE;
    }

                        // Es muss ein kompletter Vergleich ( ausser Borders )
                        // stattfinden, um alle Kombinationen Style / Hart
                        // richtig einzuordnen. Deshalb wird ein temporaerer
                        // WW8FlyPara angelegt ( abh. ob Style oder nicht ),
                        // darauf die harten Attrs angewendet, und
                        // dann verglichen

    WW8FlyPara aF( bVer67, bNowStyleApo ? pCollA[nAktColl].pWWFly : 0 ); // Zum Vergleich
    aF.Read( pSprm29, pPlcxMan->GetPapPLCF() );         // WWPara fuer akt. Para
    return aF == *pWFlyPara;
}



/***************************************************************************
#       Attribut - Verwaltung
#**************************************************************************/

void SwWW8ImplReader::NewAttr( const SfxPoolItem& rAttr )
{
    if( !bNoAttrImport ){   // zum Ignorieren von Styles beim Doc-Einfuegen
        if( pAktColl )
            pAktColl->SetAttr( rAttr );
        else
        if( pAktItemSet )
            pAktItemSet->Put( rAttr );
        else
            pCtrlStck->NewAttr( *pPaM->GetPoint(), rAttr );
    }
}

// holt Attribut aus der FmtColl / Stack / Doc
const SfxPoolItem* SwWW8ImplReader::GetFmtAttr( USHORT nWhich )
{
    if( pAktColl )
        return &pAktColl->GetAttr( nWhich );
    else
    if( pAktItemSet )
        return pAktItemSet->GetItem( nWhich );
    else
        return pCtrlStck->GetFmtAttr( *pPaM->GetPoint(), nWhich );
}

#if 0
// holt Attribut aus der FmtColl / Stack, return 0 wenn nicht gefunden
const SfxPoolItem* SwWW8ImplReader::GetFmtStkAttr( USHORT nWhich )
{
    if( pAktColl )
        return &pAktColl->GetAttr( nWhich );
    else
        return pCtrlStck->GetFmtStkAttr( *pPaM->GetPoint(), nWhich );
}
#endif

/***************************************************************************
#       eigentliche Attribute
#
# Die Methoden erhalten die Token-Id und die Laenge der noch folgenden
# Parameter gemaess Tabelle in WWScan.cxx als Parameter
#**************************************************************************/

/***************************************************************************
#  Spezial WW - Attribute
#**************************************************************************/

void SwWW8ImplReader::Read_Special( USHORT, BYTE* pData, short nLen )
{
    if( nLen < 0 ){
        bSpec = FALSE;
        return;
    }
    bSpec = ( *pData != 0 );
}

// Read_Obj wird fuer fObj und fuer fOle2 benutzt !
void SwWW8ImplReader::Read_Obj( USHORT nId, BYTE* pData, short nLen )
{
    if( nLen < 0 )
        bObj = FALSE;
    else
    {
        bObj = 0 != *pData;

        if( bObj && nPicLocFc && bEmbeddObj )
            nObjLocFc = nPicLocFc;
    }
}

void SwWW8ImplReader::Read_PicLoc( USHORT nId, BYTE* pData, short nLen )
{
    if( nLen < 0 )
    {
        nPicLocFc = 0;
        bSpec = FALSE;  // Stimmt das immer ?
    }
    else
    {
        nPicLocFc = SVBT32ToLong( pData );
        bSpec = TRUE;

        if( bObj && nPicLocFc && bEmbeddObj )
            nObjLocFc = nPicLocFc;
    }
}


void SwWW8ImplReader::Read_POutLvl( USHORT nId, BYTE* pData, short nLen )
{
    if( pAktColl && (0 < nLen) )
    {
        SwWW8StyInf* pSI = &pCollA[nAktColl];
        pSI->nOutlineLevel =
              ( (1 <= pSI->GetWWStyleId()) && (9 >= pSI->GetWWStyleId()) )
            ? pSI->GetWWStyleId()-1
            : (pData ? *pData : 0);
    }
}


void SwWW8ImplReader::Read_Symbol( USHORT nId, BYTE* pData, short nLen )
{
    if( !bIgnoreText )
    {
        if( nLen < 0 )
            bSymbol = FALSE;
        else
        {
            // neues Font-Atribut aufmachen
            // (wird in SwWW8ImplReader::ReadChars() geschlossen)
            if( SetNewFontAttr( SVBT16ToShort( pData ), FALSE ))
            {
                if( bVer67 )
                    cSymbol = ByteString::ConvertToUnicode(
                                *(sal_Char*)(pData+2), RTL_TEXTENCODING_MS_1252 );
                else
                    cSymbol = SVBT16ToShort( pData+2 );
                bSymbol = TRUE;
            }
        }
    }
}

/***************************************************************************
#  Zeichen - Attribute
#**************************************************************************/

static USHORT __FAR_DATA nEndIds[ 8 ] = {
        RES_CHRATR_WEIGHT,          RES_CHRATR_POSTURE,
        RES_CHRATR_CROSSEDOUT,      RES_CHRATR_CONTOUR,
        RES_CHRATR_SHADOWED,        RES_CHRATR_CASEMAP,
        RES_CHRATR_CASEMAP,         RES_CHRATR_CROSSEDOUT
    };

// Read_BoldUsw fuer Italic, Bold, Kapitaelchen, Versalien, durchgestrichen,
// Contour und Shadow
void SwWW8ImplReader::Read_BoldUsw( USHORT nId, BYTE* pData, short nLen )
{
    BYTE nI;
    // die Attribut-Nr fuer "doppelt durchgestrichen" tanzt aus der Reihe
    if( 0x2A53 != nId )
        nI = bVer67 ? nId - 85 : nId - 0x0835;  // Index 0..6
    else
        nI = 7;                                                                 // Index 7 (Doppelt durchgestrichen)

    BYTE nMask = 1 << nI;

    if( nLen < 0 )
    {
        pCtrlStck->SetAttr( *pPaM->GetPoint(), nEndIds[ nI ] );
        pCtrlStck->SetToggleAttr( nI, FALSE );
        return;
    }
                            // Wert: 0 = Aus, 1 = An,
                            //       128 = Wie Style, 129 entgegen Style
    BOOL bOn = *pData & 1;
    SwWW8StyInf* pSI = &pCollA[nAktColl];

    if( pAktColl )                          // StyleDef -> Flags merken
    {
        if( pSI->nBase < nColls             // Style Based on
            && ( *pData & 0x80 )            // Bit 7 gesetzt ?
            && ( pCollA[pSI->nBase].n81Flags & nMask ) ) // BasisMaske ?
            bOn = !bOn;                     // umdrehen

        if( bOn )
            pSI->n81Flags |= nMask;         // Flag setzen
        else
            pSI->n81Flags &= ~nMask;        // Flag loeschen
    }
    else
    {                                       // im Text -> Flags abfragen
        if( *pData & 0x80 )                 // Bit 7 gesetzt ?
        {
            if( pSI->n81Flags & nMask )     // und in StyleDef an ?
                bOn = !bOn;                 // dann invertieren
            // am Stack vermerken, das dieses ein Toggle-Attribut ist
            pCtrlStck->SetToggleAttr( nI, TRUE );
        }
    }

    SetToggleAttr( nI, bOn );
}

void SwWW8ImplReader::SetToggleAttr( BYTE nAttrId, BOOL bOn )
{
    switch( nAttrId )
    {
    case 0: NewAttr( SvxWeightItem( bOn ? WEIGHT_BOLD : WEIGHT_NORMAL ) );
            break;
    case 1: NewAttr( SvxPostureItem( bOn ? ITALIC_NORMAL : ITALIC_NONE ) );
            break;
    case 2: NewAttr( SvxCrossedOutItem( bOn ? STRIKEOUT_SINGLE : STRIKEOUT_NONE ) );
            break;
    case 3: NewAttr( SvxContourItem( bOn ) );
            break;
    case 4: NewAttr( SvxShadowedItem( bOn ) );
            break;
    case 5: NewAttr( SvxCaseMapItem( bOn ? SVX_CASEMAP_KAPITAELCHEN
                                          : SVX_CASEMAP_NOT_MAPPED ) );
            break;
    case 6: NewAttr( SvxCaseMapItem( bOn ? SVX_CASEMAP_VERSALIEN
                                         : SVX_CASEMAP_NOT_MAPPED ) );
            break;
    case 7: NewAttr( SvxCrossedOutItem( bOn ? STRIKEOUT_DOUBLE
                                            : STRIKEOUT_NONE ) );
            break;
    }
}

void SwWW8ImplReader::_ChkToggleAttr( USHORT nOldStyle81Mask,
                                        USHORT nNewStyle81Mask )
{
    USHORT i = 1, nToggleAttrFlags = pCtrlStck->GetToggleAttrFlags();
    BYTE n = 0;
    for( ; n < 7; ++n, i <<= 1 )
        if( (i & nToggleAttrFlags) &&
            ( (i & nOldStyle81Mask) != (i & nNewStyle81Mask)))
        {
            SetToggleAttr( n, 0 != (i & nOldStyle81Mask ) );
        }
}

void SwWW8ImplReader::Read_SubSuper( USHORT, BYTE* pData, short nLen )
{
    if( nLen < 0 ){
        pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_CHRATR_ESCAPEMENT );
        return;
    }

    short nEs;
    BYTE nProp;
    switch( *pData ){
    case 1:  nEs = DFLT_ESC_AUTO_SUPER; nProp = DFLT_ESC_PROP; break;
    case 2:  nEs = DFLT_ESC_AUTO_SUB; nProp = DFLT_ESC_PROP; break;
    default: nEs = 0; nProp = 100; break;
    }
    NewAttr( SvxEscapementItem( nEs, nProp ) );
}

void SwWW8ImplReader::Read_SubSuperProp( USHORT, BYTE* pData, short nLen )
{
    if( nLen < 0 ){
        pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_CHRATR_ESCAPEMENT );
        return;
    }

    short nPos = SVBT16ToShort( pData );    // Font-Position in HalfPoints
    INT32 nPos2 = nPos * ( 10 * 100 );      // HalfPoints in 100 * tw
    SvxFontHeightItem* pF
        = (SvxFontHeightItem*)GetFmtAttr( RES_CHRATR_FONTSIZE );
    nPos2 /= (INT32)pF->GetHeight();        // ... nun in % ( gerundet )
    if( nPos2 > 100 )                       // zur Sicherheit
        nPos2 = 100;
    if( nPos2 < -100 )
        nPos2 = -100;
    SvxEscapementItem aEs( (short)nPos2, 100 );
    NewAttr( aEs );
}

void SwWW8ImplReader::Read_Underline( USHORT, BYTE* pData, short nLen )
{
    FontUnderline eUnderline = UNDERLINE_NONE;
    BOOL bWordLine = FALSE;
    if( pData )
    {
        // Parameter:  0 = none,    1 = single,  2 = by Word,
                    // 3 = double,  4 = dotted,  5 = hidden
                    // 6 = thick,   7 = dash,    8 = dot(not used)
                    // 9 = dotdash 10 = dotdotdash 11 = wave


        // pruefe auf Sonderfall "fett+unterstrichen"
        BOOL bAlsoBold = /*( 6 == b )*/FALSE;
        // erst mal ggfs. *bold* einschalten!
        if( bAlsoBold )
        {
            BYTE nOn = 1;
            Read_BoldUsw( 0x0835, &nOn, nLen );
            eUnderline = UNDERLINE_SINGLE;
        }
        else
        {
            switch( *pData )
            {
            case 2: bWordLine = TRUE;       // kein break;
            case 1: eUnderline = (FontUnderline)UNDERLINE_SINGLE;       break;
            case 3: eUnderline = (FontUnderline)UNDERLINE_DOUBLE;       break;
            case 4: eUnderline = (FontUnderline)UNDERLINE_DOTTED;       break;
            case 7: eUnderline = (FontUnderline)UNDERLINE_DASH;         break;
            case 9: eUnderline = (FontUnderline)UNDERLINE_DASHDOT;      break;
            case 10:eUnderline = (FontUnderline)UNDERLINE_DASHDOTDOT;   break;
            case 6: eUnderline = (FontUnderline)UNDERLINE_BOLD;         break;
            case 11:eUnderline = (FontUnderline)UNDERLINE_WAVE;         break;
            case 20:eUnderline = (FontUnderline)UNDERLINE_BOLDDOTTED;   break;
            case 23:eUnderline = (FontUnderline)UNDERLINE_BOLDDASH;     break;
            case 39:eUnderline = (FontUnderline)UNDERLINE_LONGDASH;     break;
            case 55:eUnderline = (FontUnderline)UNDERLINE_BOLDLONGDASH; break;
            case 25:eUnderline = (FontUnderline)UNDERLINE_BOLDDASHDOT;  break;
            case 26:eUnderline = (FontUnderline)UNDERLINE_BOLDDASHDOTDOT;break;
            case 27:eUnderline = (FontUnderline)UNDERLINE_BOLDWAVE;     break;
            case 43:eUnderline = (FontUnderline)UNDERLINE_DOUBLEWAVE;   break;
            }
        }
    }

    // dann Stack ggfs. verwursteln und exit!
    if( nLen < 0 )
    {
        pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_CHRATR_UNDERLINE );
        pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_CHRATR_WORDLINEMODE );
    }
    else
    {
        NewAttr( SvxUnderlineItem( eUnderline ));
        if( bWordLine )
            NewAttr( SvxWordLineModeItem( TRUE ));
    }
}

void SwWW8ImplReader::Read_TxtColor( USHORT, BYTE* pData, short nLen )
{
    if( nLen < 0 )
    {
        pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_CHRATR_COLOR );
        bTxtCol = FALSE;

        if( bCharShdTxtCol || bShdTxtCol )
            // dann muss die wieder eingeschaltet werden!!
            NewAttr( SvxColorItem( Color( COL_WHITE ) ) );  // -> weisse Schrift
    }
    else
    {
        BYTE b = *pData;            // Parameter: 0 = Auto, 1..16 Farben

        if( b > 16 )                // unbekannt -> Black
            b = 0;                  // Auto -> Black

        NewAttr( SvxColorItem( Color( eSwWW8ColA[b] ) ) );
        bTxtCol = TRUE;                         // SHD darf nicht Farbe einschalten
    }
}

BOOL SwWW8ImplReader::GetFontParams( USHORT nFCode, FontFamily& reFamily,
        String& rName, FontPitch& rePitch, CharSet& reCharSet )
{
    // Die Defines, aus denen diese Tabellen erzeugt werden, stehen in windows.h
    static FontPitch __READONLY_DATA ePitchA[]
    = { PITCH_DONTKNOW, PITCH_FIXED, PITCH_VARIABLE, PITCH_DONTKNOW };

    static FontFamily __READONLY_DATA eFamilyA[]
    = { FAMILY_DONTKNOW, FAMILY_ROMAN, FAMILY_SWISS, FAMILY_MODERN,
        FAMILY_SCRIPT, FAMILY_DECORATIVE };


    const WW8_FFN* pF = pFonts->GetFont( nFCode );  // Info dazu
    if( !pF )                                   // FontNummer unbekannt ?
        return FALSE;                           // dann ignorieren

    rName = String( pF->sFontname );

#if defined( OS2 )
            if (   rName.EqualsIgnoreCaseAscii( "Helv"  )
                || rName.EqualsIgnoreCaseAscii( "Arial" ) )
                rName.AssignAscii( "Helvetica" );
            else if (    rName.EqualsIgnoreCaseAscii( "Tms Rmn"         )
                      || rName.EqualsIgnoreCaseAscii( "Times New Roman" ) )
                rName.AssignAscii( "Times New Roman" );
            else if ( rName.EqualsIgnoreCaseAscii( "Courier New" ) )
                rName.AssignAscii( "Courier" );
            else if ( rName.EqualsIgnoreCaseAscii( "Symbol" ) )
                rName.AssignAscii( "Symbol Set" );
#endif // OS2
#if defined( MAC )
            if (   rName.EqualsIgnoreCaseAscii( "Helv"  )
                || rName.EqualsIgnoreCaseAscii( "Arial" ))
                rName.AssignAscii( "Helvetica" );
            else if (  rName.EqualsIgnoreCaseAscii( "Tms Rmn" )
                    || rName.EqualsIgnoreCaseAscii( "Times New Roman" ) )
                rName.AssignAscii( "Times" );
            else if ( rName.EqualsIgnoreCaseAscii( "Courier New"  ) )
                rName.AssignAscii( "Courier" );
#endif // MAC

    // pF->prg : Pitch
    rePitch = ePitchA[pF->prg];

    // pF->chs: Charset
    if( 77 == pF->chs )             // Mac-Font im Mac-Charset oder
        reCharSet = eTextCharSet;   // auf ANSI-Charset uebersetzt
    else
        reCharSet = rtl_getTextEncodingFromWindowsCharset( pF->chs );

    // pF->ff : Family
    BYTE b = pF->ff;

    // make sure Font Family Code is set correctly
    // at least for the most important fonts
    // ( might be set wrong when Doc was not created by
    //   Winword but by third party program like Applixware... )
        /*
        0: FAMILY_DONTKNOW
        1: FAMILY_ROMAN
        2: FAMILY_SWISS
        3: FAMILY_MODERN
        4: FAMILY_SCRIPT
        5: FAMILY_DECORATIVE
    */
#define FONTNAMETAB_SZ    14
#define MAX_FONTNAME_ROMAN 6
    static sal_Char __READONLY_DATA
        // first comes ROMAN
        sFontName0[] = "\x07""Tms Rmn",
        sFontName1[] = "\x07""Timmons",
        sFontName2[] = "\x08""CG Times",
        sFontName3[] = "\x08""MS Serif",
        sFontName4[] = "\x08""Garamond",
        sFontName5[] = "\x11""Times Roman",
        sFontName6[] = "\x15""Times New Roman",
        // from here SWISS --> see above: #define MAX_FONTNAME_ROMAN 6
        sFontName7[] = "\x04""Helv",
        sFontName8[] = "\x05""Arial",
        sFontName9[] = "\x07""Univers",
        sFontName10[]= "\x11""LinePrinter",
        sFontName11[]= "\x11""Lucida Sans",
        sFontName12[]= "\x11""Small Fonts",
        sFontName13[]= "\x13""MS Sans Serif";
    static const sal_Char* __READONLY_DATA aFontNameTab[ FONTNAMETAB_SZ ] =
    {
        sFontName0,  sFontName1,  sFontName2,  sFontName3,
        sFontName4,  sFontName5,  sFontName6,  sFontName7,
        sFontName8,  sFontName9,  sFontName10, sFontName11,
        sFontName12, sFontName13
    };

    for( USHORT n = 0;  n < FONTNAMETAB_SZ; n++ )
    {
        const sal_Char* pCmp = aFontNameTab[ n ];
        int nLen = *pCmp++;
        if( rName.EqualsIgnoreCaseAscii(pCmp, 0, nLen) )
        {
            b = n <= MAX_FONTNAME_ROMAN ? 1 : 2;
            break;
        }
    }
    if( b < sizeof( eFamilyA ) )
        reFamily = eFamilyA[b];
    else
        reFamily = FAMILY_DONTKNOW;

    return TRUE;
}

BOOL SwWW8ImplReader::SetNewFontAttr( USHORT nFCode, BOOL bSetEnums )
{
    FontFamily eFamily;
    String aName;
    FontPitch ePitch;
    CharSet eSrcCharSet;

    if( !GetFontParams( nFCode, eFamily, aName, ePitch, eSrcCharSet ) )
        return FALSE;

    CharSet eDstCharSet = eSrcCharSet;

    SvxFontItem aFont( eFamily, aName, aEmptyStr, ePitch, eDstCharSet );

    if( bSetEnums )
    {
        if( pAktColl )
        {                                   // StyleDef
            pCollA[nAktColl].eFontSrcCharSet = eSrcCharSet;
        }
        else
        {
            eFontSrcCharSet = eSrcCharSet;
        }
    }

    NewAttr( aFont );                       // ...und 'reinsetzen


    return TRUE;
}

void SwWW8ImplReader::ResetCharSetVars()
{
    if( nCharFmt >= 0 )
    {
        eFontSrcCharSet = pCollA[nCharFmt].eFontSrcCharSet; // aus C-Style
    }
    else
    {
        eFontSrcCharSet = RTL_TEXTENCODING_DONTKNOW;
    }
    if( eFontSrcCharSet == RTL_TEXTENCODING_DONTKNOW )
        eFontSrcCharSet = pCollA[nAktColl].eFontSrcCharSet; // aus P-Style
}

/*
    Font ein oder ausschalten:
*/
void SwWW8ImplReader::Read_FontCode( USHORT, BYTE* pData, short nLen )
{
    if( !bSymbol && !bIgnoreText )  // falls bSymbol, gilt der am Symbol
    {                               // (siehe sprmCSymbol) gesetzte Font !
        if( nLen < 0 )
        {                   // Ende des Attributes
            pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_CHRATR_FONT );
            ResetCharSetVars();
            return;
        }

        USHORT nFCode = SVBT16ToShort( pData ); // Font-Nummer

        if( SetNewFontAttr( nFCode )        // Lies Inhalt
            && pAktColl && pStyles )        // Style-Def ?
            pStyles->bFontChanged = TRUE;   // merken zur Simulation Default-Font
    }
}




void SwWW8ImplReader::Read_FontSize( USHORT, BYTE* pData, short nLen )
{
    if( nLen < 0 ){                 // Ende des Attributes
        pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_CHRATR_FONTSIZE );
        return;
    }

//  USHORT nFSize = bVer67 ? SVBT16ToShort( pData ) : *pData;         // Font-Groesse in halben Point
    USHORT nFSize = SVBT16ToShort( pData );         // Font-Groesse in halben Point

                                                //  10 = 1440 / ( 72 * 2 )
    SvxFontHeightItem aSz( (const ULONG)( (ULONG)nFSize * 10 ) );
    NewAttr( aSz );
    if( pAktColl && pStyles )           // Style-Def ?
        pStyles->bFSizeChanged = TRUE;  // merken zur Simulation Default-FontSize
}



void SwWW8ImplReader::Read_CharSet( USHORT nId, BYTE* pData, short nLen )
{
    if( nLen < 0 ){                 // Ende des Attributes
        eHardCharSet = RTL_TEXTENCODING_DONTKNOW;
        return;
    }
    BYTE nfChsDiff = SVBT8ToByte( pData );

    if( nfChsDiff )
        eHardCharSet = rtl_getTextEncodingFromWindowsCharset( *(pData + 1) );
    else
        eHardCharSet = RTL_TEXTENCODING_DONTKNOW;
}

void SwWW8ImplReader::Read_Language( USHORT, BYTE* pData, short nLen )
{
    if( nLen < 0 ){                 // Ende des Attributes
        pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_CHRATR_LANGUAGE );
        return;
    }
    USHORT nLang = SVBT16ToShort( pData );  // Language-Id

    NewAttr( SvxLanguageItem( (const LanguageType)nLang ) );
}



/*
    Einschalten des Zeichen-Styles:
*/
void SwWW8ImplReader::Read_CColl( USHORT, BYTE* pData, short nLen )
{
    if( nLen < 0 ){                 // Ende des Attributes
        pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_TXTATR_CHARFMT );
        nCharFmt = -1;
        return;
    }
    USHORT nId = SVBT16ToShort( pData );    // Style-Id (NICHT Sprm-Id!)

    if( nId >= nColls || !pCollA[nId].pFmt  // ungueltige Id ?
        || pCollA[nId].bColl )              // oder Para-Style ?
        return;                             // dann ignorieren

    NewAttr( SwFmtCharFmt( (SwCharFmt*)pCollA[nId].pFmt ) );
    nCharFmt = (short) nId;
}


/*
    enger oder weiter als normal:
*/
void SwWW8ImplReader::Read_Kern( USHORT, BYTE* pData, short nLen )
{
    if( nLen < 0 ){                 // Ende des Attributes
        pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_CHRATR_KERNING );
        return;
    }
    INT16 nKern = SVBT16ToShort( pData );    // Kerning in Twips
    NewAttr( SvxKerningItem( nKern ) );
}

void SwWW8ImplReader::Read_FontKern( USHORT, BYTE* pData, short nLen )
{
    if( nLen < 0 )
                        // Ende des Attributes
        pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_CHRATR_AUTOKERN );
    else
        NewAttr( SvxAutoKernItem( TRUE ) );
}

void SwWW8ImplReader::Read_CharShadow(  USHORT, BYTE* pData, short nLen )
{
    if( nLen <= 0 )
    {
        pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_CHRATR_BACKGROUND );
        if( bCharShdTxtCol )
        {
            pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_CHRATR_COLOR );  // Zeichenfarbe auch
            bCharShdTxtCol = FALSE;
        }
    }
    else
    {
        WW8_SHD aSHD;
        aSHD.SetWWValue( *(SVBT16*)pData );
        SwWW8Shade aSh( bVer67, aSHD );

        NewAttr( SvxBrushItem( aSh.aColor, RES_CHRATR_BACKGROUND ));

        // weisse Schrift und nicht ueberattributiert
        if( aSh.bWhiteText && !bTxtCol && !bShdTxtCol )
        {
            NewAttr( SvxColorItem( Color( COL_WHITE ) ) );  // -> weisse Schrift
            bCharShdTxtCol = TRUE;
        }
    }
}

void SwWW8ImplReader::Read_CharHighlight( USHORT, BYTE* pData, short nLen )
{
    if( nLen <= 0 )
    {
        pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_CHRATR_BACKGROUND );
        if( bCharShdTxtCol )
        {
            pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_CHRATR_COLOR );  // Zeichenfarbe auch
            bCharShdTxtCol = FALSE;
        }
    }
    else
    {
        BYTE b = *pData;            // Parameter: 0 = Auto, 1..16 Farben

        if( b > 16 )                // unbekannt -> Black
            b = 0;                  // Auto -> Black

        Color aCol( eSwWW8ColA[b] );
        NewAttr( SvxBrushItem( aCol , RES_CHRATR_BACKGROUND ));

        // weisse Schrift und nicht ueberattributiert
        if( COL_BLACK == aCol.GetColor() && !bTxtCol && !bShdTxtCol )
        {
            NewAttr( SvxColorItem( Color( COL_WHITE ) ) );  // -> weisse Schrift
            bCharShdTxtCol = TRUE;
        }
    }
}


/***************************************************************************
#  Absatz - Attribute
#**************************************************************************/

void SwWW8ImplReader::Read_NoLineNumb( USHORT nId, BYTE* pData, short nLen )
{
    if( nLen < 0 )  // Ende des Attributes
    {
        pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_LINENUMBER );
        return;
    }
    SwFmtLineNumber aLN;
    aLN.SetCountLines( pData && (0 == *pData) );
    NewAttr( aLN );
}

void SwWW8ImplReader::Read_LR( USHORT nId, BYTE* pData, short nLen ) // Sprm 16, 17
{
    if( nIniFlags & WW8FL_NO_LRUL )
        return;

    if( nLen < 0 )  // Ende des Attributes
    {
        pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_LR_SPACE );
        return;
    }

    short nPara = SVBT16ToShort( pData );

    SvxLRSpaceItem aLR( *(SvxLRSpaceItem*)GetFmtAttr( RES_LR_SPACE ));

    switch( nId )
    {
    //sprmPDxaLeft
    case     17:
    case 0x840F:
        if( nPara < 0 )
            nPara = 0;
        if( !aLR.GetTxtFirstLineOfst() )
            aLR.SetTxtFirstLineOfst( 1 );
        else
        if( aLR.GetTxtFirstLineOfst() < -nPara )
            // Erstzeileneinzug anpassen, sonst weigert sich SetTxtLeft()
            aLR.SetTxtFirstLineOfst( -nPara );

        aLR.SetTxtLeft( nPara );
        if( pAktColl )
        {
            pCollA[nAktColl].nLeftParaMgn      = nPara; // fuer Tabs merken
            pCollA[nAktColl].nTxtFirstLineOfst = aLR.GetTxtFirstLineOfst();
        }
        else
        {
            nLeftParaMgn      = nPara; // fuer Tabs merken
            nTxtFirstLineOfst = aLR.GetTxtFirstLineOfst();
        }
        break;
    //sprmPDxaLeft1
    case     19:
    case 0x8411:
        if( -nPara > (short)aLR.GetTxtLeft() )
            nPara = -(short)aLR.GetTxtLeft();
        aLR.SetTxtFirstLineOfst( nPara );
        if( pAktColl )
        {
            pCollA[nAktColl].nTxtFirstLineOfst = nPara; // fuer Tabs merken
        }
        else
        {
            nTxtFirstLineOfst = nPara; // fuer Tabs merken
        }
        break;
    //sprmPDxaRight
    case     16:
    case 0x840E:
        if( nPara < 0 )
            nPara = 0;
        aLR.SetRight( nPara );
        break;
    default: return;
    }
    NewAttr( aLR );
}

void SwWW8ImplReader::Read_LineSpace( USHORT, BYTE* pData, short nLen ) // Sprm 20
{
// Kommentear siehe Read_UL()
    if( bStyNormal && ( bWWBugNormal || ( nIniFlags & WW8FL_NO_STD_STY_DYA ) ) )
        return;

    if( nLen < 0 ){
        pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_PARATR_LINESPACING );
        if( !( nIniFlags & WW8FL_NO_IMPLPASP ) )
            pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_UL_SPACE );
        return;
    }
    short nSpace = SVBT16ToShort( pData );
    short nMulti = SVBT16ToShort( pData + 2 );

    SvxLineSpace eLnSpc;
    if( 0 > nSpace )
    {
        nSpace = -nSpace;
        eLnSpc = SVX_LINE_SPACE_FIX;
    }
    else
        eLnSpc = SVX_LINE_SPACE_MIN;

// WW hat einen impliziten zusaetzlichen Absatzabstand abhaengig vom
// Zeilenabstand. Er betraegt bei "genau", 0.8*Zeilenabstand "vor" und
// 0.2*Zeilenabstand "nach".
// Bei "Mindestens" sind es 1*Zeilenabstand "vor" und 0*Zeilenabstand "nach".
// Bei Mehrfach sind es 0 "vor" und min( 0cm, FontSize*(nFach-1) ) "nach".
//
// SW hat auch einen impliziten Zeilenabstand. er betraegt bei "mindestens"
// 1*Zeilenabstand "vor" und 0 "nach"
// bei proportional betraegt er min( 0cm, FontSize*(nFach-1) ) sowohl "vor"
// wie auch "nach"

    USHORT nWwPre = 0;
    USHORT nWwPost = 0;
    USHORT nSwPre = 0;
    USHORT nSwPost = 0;
    USHORT nSpaceTw = 0;

    SvxLineSpacingItem aLSpc;

    if( 1 == nMulti )               // MultilineSpace ( proportional )
    {
        long n = nSpace * 10 / 24;  // WW: 240 = 100%, SW: 100 = 100%

//JP 03.12.98: nach Absprache mit AMA ist die Begrenzung unsinnig
        if( n>200 ) n = 200;        // SW_UI-Maximum
        aLSpc.SetPropLineSpace( (const BYTE)n );
        SvxFontHeightItem* pH = (SvxFontHeightItem*)
            GetFmtAttr( RES_CHRATR_FONTSIZE );
        nSpaceTw = (USHORT)( n * pH->GetHeight() / 100 );

        if( n > 100 )
            nWwPost = nSwPre = nSwPost = (USHORT)( ( n - 100 )
                                                    * pH->GetHeight() / 100 );
    }
    else                            // Fixed / Minimum
    {
        // bei negativen Space ist der Abstand exakt, sonst minimum
        nSpaceTw = (USHORT)nSpace;
        aLSpc.SetLineHeight( nSpaceTw );
        aLSpc.GetLineSpaceRule() = eLnSpc;
        nSwPre = nSpace;

        if( SVX_LINE_SPACE_FIX == eLnSpc )                  // Genau
        {
            nWwPre = (USHORT)( 8L * nSpace / 10 );
            nWwPost = (USHORT)( 2L * nSpace / 10 );
            nSwPre = nSpace;
        }
        else                                                // Minimum
        {
            nWwPre = (USHORT)( 129L * nSpace / 100 - 95 );// erst bei groesseren
                                                          // Zeilenabstaenden
        }
    }
    NewAttr( aLSpc );
    if( pSFlyPara )
        pSFlyPara->nLineSpace = nSpaceTw;   // LineSpace fuer Graf-Apos

    if( ( nWwPre > nSwPre || nWwPost > nSwPost )
            && !( nIniFlags & WW8FL_NO_IMPLPASP ) )
    {
        SvxULSpaceItem aUL( *(SvxULSpaceItem*)GetFmtAttr( RES_UL_SPACE ));
        short nDU = aUL.GetUpper() + nWwPre - nSwPre;
        short nDL = aUL.GetLower() + nWwPost - nSwPost;
        if( nDU > 0 )
            aUL.SetUpper( nDU );
        else
            nDL += nDU;

        if( nDL > 0 )
            aUL.SetLower( nDL );
        NewAttr( aUL );
    }
}

void SwWW8ImplReader::Read_UL( USHORT nId, BYTE* pData, short nLen ) // Sprm 21, 22
{
    if( nIniFlags & WW8FL_NO_LRUL )
        return;

// Nun eine Umpopelung eines WW-Fehlers: Bei nProduct == 0c03d wird
// faelschlicherweise ein DyaAfter 240 ( delta y abstand after, amn.d.b.)
// im Style "Normal" eingefuegt, der
// gar nicht da ist. Ueber das IniFlag WW8FL_NO_STY_DYA laesst sich dieses
// Verhalten auch fuer andere WW-Versionen erzwingen
//  ASSERT( !bStyNormal || bWWBugNormal, "+Dieses Doc deutet evtl. auf einen \
//Fehler in der benutzten WW-Version hin. Wenn sich die Styles <Standard> bzw. \
//<Normal> zwischen WW und SW im Absatz- oder Zeilenabstand unterscheiden, \
//dann bitte dieses Doc SH zukommen lassen." );

//  if( bStyNormal && ( bWWBugNormal || ( nIniFlags & WW8FL_NO_STD_STY_DYA ) ) )
//      return;
// bWWBugNormal ist kein hinreichendes Kriterium dafuer, dass der
// angegebene Abstand falsch ist

    if( bStyNormal && ( nIniFlags & WW8FL_NO_STD_STY_DYA ) )
        return;

    if( nLen < 0 ){                 // Ende des Attributes
        pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_UL_SPACE );
        return;
    }
    short nPara = SVBT16ToShort( pData );
    if( nPara < 0 )
        nPara = -nPara;

    SvxULSpaceItem aUL( *(SvxULSpaceItem*)GetFmtAttr( RES_UL_SPACE ));

    switch( nId ){                // keine Versuche
        //sprmPDyaBefore
        case     21:
        case 0xA413: aUL.SetUpper( nPara ); break;
        //sprmPDyaAfter
        case     22:
        case 0xA414: aUL.SetLower( nPara ); break;
        default: return;
    };
#if 0
    // nIniFlags stehen in c:\winnt40\soffice.ini[user]
    // siehe wwpar.hxx
    // und SwWW8ImplReader::LoadDoc( SwPaM& rPaM )
    //
    if( nIniFlags & WW8FL_NO_IMPLPASP ){
        switch( nId ){                // keine Versuche
            case 21:
            case 0xA413: aUL.SetUpper( nPara ); break;
            case 22:
            case 0xA414: aUL.SetLower( nPara ); break;
            default: return;
        };
    }else{
    // auf alte Werte addieren wg. implizitem Absatzabstand
    // ( siehe Read_LineSpace() )
        switch( nId ){
            case 21:
            case 0xA413: aUL.SetUpper( aUL.GetUpper() + nPara ); break;
            case 22:
            case 0xA414: aUL.SetLower( aUL.GetLower() + nPara ); break;
            default: return;
        };
    }
#endif
    NewAttr( aUL );
}

void SwWW8ImplReader::Read_Justify( USHORT, BYTE* pData, short nLen )
{
    static SvxAdjust aAdjArr[] = { SVX_ADJUST_LEFT,  SVX_ADJUST_CENTER,
                                   SVX_ADJUST_RIGHT, SVX_ADJUST_BLOCK };

    if( nLen < 0 ){
        pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_PARATR_ADJUST );
        return;
    }
    BYTE b = *pData;

    NewAttr( SvxAdjustItem( aAdjArr[b&0x3] ) ); // "&0x3 gegen Tabellenueberlauf
}                                               // bei Stuss-Werten




SwWW8Shade::SwWW8Shade( BOOL bVer67, const WW8_SHD& rSHD )
{
static ULONG __READONLY_DATA eMSGrayScale[] = {
        // Nul-Brush
           0,   // 0
        // Solid-Brush
        1000,   // 1
        // promillemaessig abgestufte Schattierungen
          50,   // 2
         100,   // 3
         200,   // 4
         250,   // 5
         300,   // 6
         400,   // 7
         500,   // 8
         600,   // 9
         700,   // 10
         750,   // 11
         800,   // 12
         900,   // 13
         333, // 14 Dark Horizontal
         333, // 15 Dark Vertical
         333, // 16 Dark Forward Diagonal
         333, // 17 Dark Backward Diagonal
         333, // 18 Dark Cross
         333, // 19 Dark Diagonal Cross
         333, // 20 Horizontal
         333, // 21 Vertical
         333, // 22 Forward Diagonal
         333, // 23 Backward Diagonal
         333, // 24 Cross
         333, // 25 Diagonal Cross
         // neun Nummern ohne Bedeutung in Ver8
         500, // 26
         500, // 27
         500, // 28
         500, // 29
         500, // 30
         500, // 31
         500, // 32
         500, // 33
         500, // 34
         // und weiter gehts mit tollen Schattierungen ;-)
          25,   // 35
          75,   // 36
         125,   // 37
         150,   // 38
         175,   // 39
         225,   // 40
         275,   // 41
         325,   // 42
         350,   // 43
         375,   // 44
         425,   // 45
         450,   // 46
         475,   // 47
         525,   // 48
         550,   // 49
         575,   // 50
         625,   // 51
         650,   // 52
         675,   // 53
         725,   // 54
         775,   // 55
         825,   // 56
         850,   // 57
         875,   // 58
         925,   // 59
         950,   // 60
         975,   // 61
         // und zu guter Letzt:
         970};// 62
    ColorData nFore;
    ColorData nBack;
    ULONG     nWW8BrushStyle;
    short     b;

    b = rSHD.GetFore();
    if ( b >= 17 )
        b = 0;
    nFore = eSwWW8ColA[b];
                                        // Vordergrund: Auto = Schwarz
    b = rSHD.GetBack();
    if( b >=  17 )
        b = 0;
    if( b == 0 )
        b = 8;                          // Hintergrund: Auto = Weiss
    nBack = eSwWW8ColA[b];

    b = rSHD.GetStyle( bVer67 );

    if( b >= sizeof( eMSGrayScale ) / sizeof ( eMSGrayScale[ 0 ] ) )
        b = 0;

    nWW8BrushStyle = eMSGrayScale[b];

    switch( nWW8BrushStyle )
    {
        case 0: // Null-Brush
            aColor.SetColor( nBack );
            break;
        case 1000:
            aColor.SetColor( nFore );
            break;
        default:
            {
                Color aForeColor = Color( nFore );
                Color aBackColor = Color( nBack );
                ULONG   nRed        = aForeColor.GetRed()    *      nWW8BrushStyle;
                ULONG   nGreen  = aForeColor.GetGreen()  *      nWW8BrushStyle;
                ULONG   nBlue       = aForeColor.GetBlue()   *      nWW8BrushStyle;
                nRed   += (ULONG)(aBackColor.GetRed()  *(1000-nWW8BrushStyle));
                nGreen += (ULONG)(aBackColor.GetGreen()*(1000-nWW8BrushStyle));
                nBlue  += (ULONG)(aBackColor.GetBlue() *(1000-nWW8BrushStyle));

                aColor.SetColor( RGB_COLORDATA( nRed/1000, nGreen/1000, nBlue/1000 ) );
            }
            break;
    }
    // schwarzer Hintergrund -> weisse Schrift
    bWhiteText =    (nFore == COL_BLACK) && ( 800 <= nWW8BrushStyle )
                 || (nBack == COL_BLACK) && ( 200 >= nWW8BrushStyle );
}


void SwWW8ImplReader::Read_Shade( USHORT, BYTE* pData, short nLen )
{
    if( nLen <= 0 )
    {       // Ende des Attributes
        pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_BACKGROUND );
        if( bShdTxtCol )
        {
            pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_CHRATR_COLOR );  // Zeichenfarbe auch
            bShdTxtCol = FALSE;
        }
    }
    else
    {
        WW8_SHD aSHD;
        aSHD.SetWWValue( *(SVBT16*)pData );
        SwWW8Shade aSh( bVer67, aSHD );

        NewAttr( SvxBrushItem( aSh.aColor ) );

        // weisse Schrift und nicht ueberattributiert
        if( aSh.bWhiteText && !bTxtCol )
        {
            NewAttr( SvxColorItem( Color( COL_WHITE ) ) );  // -> weisse Schrift
            bShdTxtCol = TRUE;
        }
    }
}

void SwWW8ImplReader::Read_Border( USHORT nId, BYTE* pData, short nLen )
{
    if( nLen < 0 )
    {
        if( bHasBorder )
        {
            pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_BOX );
            pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_SHADOW );
            bHasBorder = FALSE;
        }
    }
    else if( !bHasBorder )
    {
                            // die Borders auf allen 4 Seiten werden gebuendelt.
                            // dieses vereinfacht die Verwaltung, d.h. die
                            // Box muss nicht 4 mal auf den CtrlStack und wieder
                            // runter
        bHasBorder = TRUE;

        WW8_BRC5 aBrcs; // Top, Left, Bottom, Right, Between
        BOOL bBorder;

        if( pAktColl )
            bBorder = ::lcl_ReadBorders( bVer67, aBrcs, 0, pStyles );
        else
            bBorder = ::lcl_ReadBorders( bVer67, aBrcs, pPlcxMan->GetPapPLCF() );

        if( bBorder )                                   // Border
        {
            BOOL bIsB = IsBorder( aBrcs, TRUE );
            if( !bApo || !bIsB || ( pWFlyPara && !pWFlyPara->bBorderLines ))
            {
                // in Apo keine Umrandungen *ein*-schalten, da ich
                // sonst die Flyumrandungen doppelt bekomme
                // JP 04.12.98: aber nur wenn am Fly ein gesetzt ist, keine
                //              uebernehmen. Sonst wird gar keine gesetzt!
                //              Bug #59619#

                // auch wenn kein Rand gesetzt ist, muss das Attribut gesetzt
                // werden, sonst ist kein hartes Ausschalten von Style-Attrs
                // moeglich
                SvxBoxItem aBox;
                SetBorder( aBox, aBrcs, TRUE );

                Rectangle aInnerDist;
                GetBorderDistance( aBrcs, aInnerDist );

                aBox.SetDistance( (USHORT)aInnerDist.Left(), BOX_LINE_LEFT );
                aBox.SetDistance( (USHORT)aInnerDist.Top(), BOX_LINE_TOP );
                aBox.SetDistance( (USHORT)aInnerDist.Right(), BOX_LINE_RIGHT );
                aBox.SetDistance( (USHORT)aInnerDist.Bottom(), BOX_LINE_BOTTOM );

                NewAttr( aBox );

                SvxShadowItem aS;
                if( SetShadow( aS, aBox, aBrcs ) )
                    NewAttr( aS );
            }
        }
    }
}

void SwWW8ImplReader::Read_Hyphenation( USHORT, BYTE* pData, short nLen )
{
    // set Hyphenation flag
    if( nLen <= 0 )
        pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_PARATR_HYPHENZONE );
    else
    {
        SvxHyphenZoneItem aAttr(
            *(SvxHyphenZoneItem*)GetFmtAttr( RES_PARATR_HYPHENZONE ) );

        aAttr.SetHyphen( 0 == *pData ); // sic !

        if( !*pData )
        {
            aAttr.GetMinLead()    = 2;
            aAttr.GetMinTrail()   = 2;
            aAttr.GetMaxHyphens() = 0;
        }

        NewAttr( aAttr );
    }
}

void SwWW8ImplReader::Read_WidowControl( USHORT, BYTE* pData, short nLen )
{
    if( nLen <= 0 )
    {
        pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_PARATR_WIDOWS );
        pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_PARATR_ORPHANS );
    }
    else
    {
        BYTE nL = ( *pData & 1 ) ? 2 : 0;

        NewAttr( SvxWidowsItem( nL ) );     // Aus -> nLines = 0
        NewAttr( SvxOrphansItem( nL ) );

        if( pAktColl && pStyles )           // Style-Def ?
            pStyles->bWidowsChanged = TRUE; // merken zur Simulation
                                            // Default-Widows
    }
}

void SwWW8ImplReader::Read_KeepLines( USHORT, BYTE* pData, short nLen )
{
    if( nLen <= 0 )
        pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_PARATR_SPLIT );
    else
        NewAttr( SvxFmtSplitItem( ( *pData & 1 ) == 0 ) );
}

void SwWW8ImplReader::Read_KeepParas( USHORT, BYTE* pData, short nLen )
{
    if( nLen <= 0 )
        pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_KEEP );
    else
        NewAttr( SvxFmtKeepItem( ( *pData & 1 ) != 0 ) );
}

void SwWW8ImplReader::Read_BreakBefore( USHORT, BYTE* pData, short nLen )
{
    if( nLen <= 0 )
        pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_BREAK );
    else
        NewAttr( SvxFmtBreakItem(
                ( *pData & 1 ) ? SVX_BREAK_PAGE_BEFORE : SVX_BREAK_NONE ) );
}

void SwWW8ImplReader::Read_ApoPPC( USHORT, BYTE* pData, short nLen )
{
    if( pAktColl ){                 // nur fuer Styledef, sonst anders geloest
        SwWW8StyInf& rSI = pCollA[nAktColl];
        WW8FlyPara* pFly = rSI.pWWFly;
        if( !pFly ){
            pFly = ( rSI.nBase >= nColls ) ?
                        new WW8FlyPara( bVer67 )                                                        // !based on
                    : new WW8FlyPara( bVer67, pCollA[rSI.nBase].pWWFly );   // based on
            pCollA[nAktColl].pWWFly = pFly;
            if( !pFly->Read( pData, pStyles ) )     // Lese Style-Apo-Parameter
                DELETEZ( pCollA[nAktColl].pWWFly );
        }
    }
}

/***************************************************************************
#  Seiten - Attribute werden nicht mehr als Attribute gehandhabt
#   ( ausser OLST )
#**************************************************************************/


/***************************************************************************
#       Arrays zum Lesen der erweiterten ( selbstdefinierten ) SPRMs
#**************************************************************************/
typedef long (SwWW8ImplReader:: *FNReadRecordExt)( WW8PLCFManResult*, BOOL );

static FNReadRecordExt aWwSprmTab2[] = {
/* 0 (256) */   &SwWW8ImplReader::Read_Ftn,     // FootNote
/* 1 (257) */   &SwWW8ImplReader::Read_Ftn,     // EndNote
/* 2 (258) */   &SwWW8ImplReader::Read_Field,   // Feld
/* 3 (259) */   &SwWW8ImplReader::Read_Book,    // Bookmark
/* 4 (260) */   &SwWW8ImplReader::Read_Piece,   // Piece-Anfang / Ende
/* 5 (261) */   &SwWW8ImplReader::Read_And      // Annotation
};

long SwWW8ImplReader::ImportExtSprm( WW8PLCFManResult* pRes, BOOL bStart )
{
    if( pRes->nSprmId < 280 )
    {
        BYTE nIdx = pRes->nSprmId - 256;
        if( nIdx < sizeof( aWwSprmTab2 ) / sizeof( *aWwSprmTab2 )
            && aWwSprmTab2[nIdx] )
            return (this->*aWwSprmTab2[nIdx])( pRes, bStart );
        else
            return 0;
    }
    else
        return 0;
}



/***************************************************************************
#       Arrays zum Lesen der SPRMs
#**************************************************************************/

// Funktion zum Einlesen von Sprms. Par1: SprmId
//typedef void (SwWW8ImplReader:: *FNReadRecord) ( BYTE, BYTE*, short );




typedef void (SwWW8ImplReader:: *FNReadRecord)( USHORT, BYTE*, short );

struct SprmReadInfo
{
    USHORT       nId;
    FNReadRecord pReadFnc;
};

SprmReadInfo& WW8GetSprmReadInfo( USHORT nId );



SprmReadInfo aSprmReadTab[] = {
   0, (FNReadRecord)0, // "??0" Default bzw. Error wird uebersprungen! ,
   2, &SwWW8ImplReader::Read_StyleCode, // "sprmPIstd",  // pap.istd (style code)

   3, (FNReadRecord)0, // "sprmPIstdPermute", // pap.istd   permutation
   4, (FNReadRecord)0, //  "sprmPIncLv1", // pap.istddifference
   5, &SwWW8ImplReader::Read_Justify, //  "sprmPJc", // pap.jc (justification)
   6, (FNReadRecord)0, //  "sprmPFSideBySide", // pap.fSideBySide
   7, &SwWW8ImplReader::Read_KeepLines, //  "sprmPFKeep", // pap.fKeep
   8, &SwWW8ImplReader::Read_KeepParas, //  "sprmPFKeepFollow ", // pap.fKeepFollow
   9, &SwWW8ImplReader::Read_BreakBefore, //  "sprmPPageBreakBefore", // pap.fPageBreakBefore

  10, (FNReadRecord)0, // "sprmPBrcl", //   pap.brcl
  11, (FNReadRecord)0, // "sprmPBrcp ", // pap.brcp
  12, &SwWW8ImplReader::Read_ANLevelDesc, // "sprmPAnld", //    pap.anld (ANLD structure)
  13, &SwWW8ImplReader::Read_ANLevelNo, //  "sprmPNLvlAnm", // pap.nLvlAnm nn
  14, &SwWW8ImplReader::Read_NoLineNumb, //  "sprmPFNoLineNumb", //ap.fNoLnn

//??
  15, &SwWW8ImplReader::Read_Tab, //   "?sprmPChgTabsPapx", // pap.itbdMac, ...
  16, &SwWW8ImplReader::Read_LR, //  "sprmPDxaRight", // pap.dxaRight
  17, &SwWW8ImplReader::Read_LR, //  "sprmPDxaLeft", // pap.dxaLeft
  18, (FNReadRecord)0, //  "sprmPNest", // pap.dxaLeft
  19, &SwWW8ImplReader::Read_LR, //  "sprmPDxaLeft1", // pap.dxaLeft1

  20, &SwWW8ImplReader::Read_LineSpace, // "sprmPDyaLine", // pap.lspd  an LSPD
  21, &SwWW8ImplReader::Read_UL, //  "sprmPDyaBefore", // pap.dyaBefore
  22, &SwWW8ImplReader::Read_UL, //  "sprmPDyaAfter", //    pap.dyaAfter

//??
  23, (FNReadRecord)0, // "?sprmPChgTabs", // pap.itbdMac, pap.rgdxaTab, ...
  24, (FNReadRecord)0, //  "sprmPFInTable", // pap.fInTable
  25, &SwWW8ImplReader::Read_TabRowEnd, //  "sprmPTtp", // pap.fTtp
  26, (FNReadRecord)0, //  "sprmPDxaAbs", // pap.dxaAbs
  27, (FNReadRecord)0, //  "sprmPDyaAbs", // pap.dyaAbs
  28, (FNReadRecord)0, // "sprmPDxaWidth", // pap.dxaWidth
  29, &SwWW8ImplReader::Read_ApoPPC, // "sprmPPc", // pap.pcHorz, pap.pcVert

  30, (FNReadRecord)0, // "sprmPBrcTop10", // pap.brcTop BRC10
  31, (FNReadRecord)0, // "sprmPBrcLeft10", // pap.brcLeft BRC10
  32, (FNReadRecord)0, // "sprmPBrcBottom10", // pap.brcBottom BRC10

  33, (FNReadRecord)0, // "sprmPBrcRight10", // pap.brcRight BRC10
  34, (FNReadRecord)0, // "sprmPBrcBetween10", // pap.brcBetween BRC10
  35, (FNReadRecord)0, // "sprmPBrcBar10", // pap.brcBar BRC10
  36, (FNReadRecord)0, // "sprmPFromText10", // pap.dxaFromText dxa
  37, (FNReadRecord)0, // "sprmPWr", // pap.wr wr
  38, &SwWW8ImplReader::Read_Border, // "sprmPBrcTop", // pap.brcTop BRC
  39, &SwWW8ImplReader::Read_Border, // "sprmPBrcLeft", // pap.brcLeft BRC

  40, &SwWW8ImplReader::Read_Border, // "sprmPBrcBottom", // pap.brcBottom BRC
  41, &SwWW8ImplReader::Read_Border, // "sprmPBrcRight", // pap.brcRight BRC
  42, &SwWW8ImplReader::Read_Border, // "sprmPBrcBetween", // pap.brcBetween BRC
  43, (FNReadRecord)0, // "sprmPBrcBar",//pap.brcBar BRC word
  44, &SwWW8ImplReader::Read_Hyphenation, // "sprmPFNoAutoHyph",//pap.fNoAutoHyph
  45, (FNReadRecord)0, // "sprmPWHeightAbs",//pap.wHeightAbs w
  46, (FNReadRecord)0, // "sprmPDcs",//pap.dcs DCS
  47, &SwWW8ImplReader::Read_Shade, // "sprmPShd",//pap.shd SHD
  48, (FNReadRecord)0, //  "sprmPDyaFromText",//pap.dyaFromText dya
  49, (FNReadRecord)0, //  "sprmPDxaFromText",//pap.dxaFromText dxa

  50, (FNReadRecord)0, //  "sprmPFLocked", // pap.fLocked 0 or 1 byte
  51, &SwWW8ImplReader::Read_WidowControl, //  "sprmPFWidowControl", // pap.fWidowControl 0 or 1 byte

//??
  52, (FNReadRecord)0, // "?sprmPRuler 52", //???
  53, (FNReadRecord)0, // "??53",
  54, (FNReadRecord)0, // "??54",
  55, (FNReadRecord)0, // "??55",
  56, (FNReadRecord)0, // "??56",
  57, (FNReadRecord)0, // "??57",
  58, (FNReadRecord)0, // "??58",
  59, (FNReadRecord)0, // "??59",

  60, (FNReadRecord)0, // "??60",
  61, (FNReadRecord)0, // "??61",
  62, (FNReadRecord)0, // "??62",
  63, (FNReadRecord)0, // "??63",
  64, (FNReadRecord)0, // "??64",
  65, &SwWW8ImplReader::Read_CFRMarkDel, //  "sprmCFStrikeRM", // chp.fRMarkDel 1 or 0 bit
  66, &SwWW8ImplReader::Read_CFRMark,    //  "sprmCFRMark", // chp.fRMark 1 or 0 bit
  67, &SwWW8ImplReader::Read_FldVanish, //  "sprmCFFldVanish", // chp.fFldVanish 1 or 0 bit
  68, &SwWW8ImplReader::Read_PicLoc, // "sprmCPicLocation", // chp.fcPic and chp.fSpec
  69, (FNReadRecord)0, // "sprmCIbstRMark", // chp.ibstRMark index into sttbRMark

  70, (FNReadRecord)0, // "sprmCDttmRMark", // chp.dttm DTTM long
  71, (FNReadRecord)0, //  "sprmCFData", // chp.fData 1 or 0 bit
  72, (FNReadRecord)0, // "sprmCRMReason", // chp.idslRMReason an index to a table
  73, &SwWW8ImplReader::Read_CharSet, // "sprmCChse", // chp.fChsDiff and chp.chse see below 3 bytes
  74, &SwWW8ImplReader::Read_Symbol, // "sprmCSymbol", // chp.fSpec, chp.chSym and chp.ftcSym
  75, &SwWW8ImplReader::Read_Obj, //  "sprmCFOle2", // chp.fOle2 1 or 0 bit
  76, (FNReadRecord)0, // "??76",
  77, (FNReadRecord)0, // "??77",
  78, (FNReadRecord)0, // "??78",
  79, (FNReadRecord)0, // "??79",

  80, &SwWW8ImplReader::Read_CColl, // "sprmCIstd", // chp.istd istd, see stylesheet definition short
  81, (FNReadRecord)0, // "sprmCIstdPermute", // chp.istd permutation vector (see below)
  82, (FNReadRecord)0, // "sprmCDefault", // whole CHP (see below) none variable length
  83, (FNReadRecord)0, // "sprmCPlain", // whole CHP (see below) none 0
  84, (FNReadRecord)0, // "??84",
  85, &SwWW8ImplReader::Read_BoldUsw, // "sprmCFBold", // chp.fBold 0,1, 128, or 129 (see below) byte
  86, &SwWW8ImplReader::Read_BoldUsw, // "sprmCFItalic", // chp.fItalic 0,1, 128, or 129 (see below) byte
  87, &SwWW8ImplReader::Read_BoldUsw, // "sprmCFStrike", // chp.fStrike 0,1, 128, or 129 (see below) byte
  88, &SwWW8ImplReader::Read_BoldUsw, // "sprmCFOutline", // chp.fOutline 0,1, 128, or 129 (see below) byte
  89, &SwWW8ImplReader::Read_BoldUsw, // "sprmCFShadow", // chp.fShadow 0,1, 128, or 129 (see below) byte

  90, &SwWW8ImplReader::Read_BoldUsw, // "sprmCFSmallCaps", // chp.fSmallCaps 0,1, 128, or 129 (see below) byte
  91, &SwWW8ImplReader::Read_BoldUsw, // "sprmCFCaps", // chp.fCaps 0,1, 128, or 129 (see below) byte

  92, &SwWW8ImplReader::Read_Invisible, // "sprmCFVanish", // chp.fVanish 0,1, 128, or 129 (see below) byte

  93, &SwWW8ImplReader::Read_FontCode, // "sprmCFtc", // chp.ftc ftc word
  94, &SwWW8ImplReader::Read_Underline, // "sprmCKul", // chp.kul kul byte
  95, (FNReadRecord)0, // "sprmCSizePos", // chp.hps, chp.hpsPos (see below) 3 bytes
  96, &SwWW8ImplReader::Read_Kern,   //  "sprmCDxaSpace", // chp.dxaSpace dxa word
  97, &SwWW8ImplReader::Read_Language, //  "sprmCLid", // chp.lid LID word
  98, &SwWW8ImplReader::Read_TxtColor, //  "sprmCIco", // chp.ico ico byte
  99, &SwWW8ImplReader::Read_FontSize, // "sprmCHps", // chp.hps hps word!


 100, (FNReadRecord)0, //  "sprmCHpsInc", // chp.hps (see below) byte
 101, &SwWW8ImplReader::Read_SubSuperProp, //  "sprmCHpsPos", // chp.hpsPos hps byte
 102, (FNReadRecord)0, //  "sprmCHpsPosAdj", // chp.hpsPos hps (see below) byte

//??
 103, &SwWW8ImplReader::Read_Majority, // "?sprmCMajority", // chp.fBold, chp.fItalic, chp.fSmallCaps, ...
 104, &SwWW8ImplReader::Read_SubSuper, //  "sprmCIss", // chp.iss iss byte
 105, (FNReadRecord)0, // "sprmCHpsNew50", // chp.hps hps variable width, length always recorded as 2
 106, (FNReadRecord)0, // "sprmCHpsInc1", // chp.hps complex (see below) variable width, length always recorded as 2
 107, &SwWW8ImplReader::Read_FontKern, // "sprmCHpsKern", // chp.hpsKern hps short
 108, &SwWW8ImplReader::Read_Majority, // "sprmCMajority50", // chp.fBold, chp.fItalic, chp.fSmallCaps, chp.fVanish, ...
 109, (FNReadRecord)0, // "sprmCHpsMul", // chp.hps percentage to grow hps short

 110, (FNReadRecord)0, // "sprmCCondHyhen", // chp.ysri ysri short
 111, (FNReadRecord)0, // "??111",
 112, (FNReadRecord)0, // "??112",
 113, (FNReadRecord)0, // "??113",
 114, (FNReadRecord)0, // "??114",
 115, (FNReadRecord)0, // "??115",
 116, (FNReadRecord)0, // "??116",
 117, &SwWW8ImplReader::Read_Special, //  "sprmCFSpec", // chp.fSpec  1 or 0 bit
 118, &SwWW8ImplReader::Read_Obj,       //  "sprmCFObj", // chp.fObj 1 or 0 bit
 119, (FNReadRecord)0, // "sprmPicBrcl", // pic.brcl brcl (see PIC structure definition) byte

 120,   (FNReadRecord)0, // "sprmPicScale", // pic.mx, pic.my, pic.dxaCropleft,
 121, (FNReadRecord)0, // "sprmPicBrcTop", // pic.brcTop BRC word
 122, (FNReadRecord)0, // "sprmPicBrcLeft", // pic.brcLeft BRC word
 123, (FNReadRecord)0, // "sprmPicBrcBottom", // pic.brcBottom BRC word
 124, (FNReadRecord)0, // "sprmPicBrcRight", // pic.brcRight BRC word
 125, (FNReadRecord)0, // "??125",
 126, (FNReadRecord)0, // "??126",
 127, (FNReadRecord)0, // "??127",
 128, (FNReadRecord)0, // "??128",
 129, (FNReadRecord)0, // "??129",

 130, (FNReadRecord)0, // "??130",
 131, (FNReadRecord)0, //  "sprmSScnsPgn", // sep.cnsPgn cns byte
 132, (FNReadRecord)0, // "sprmSiHeadingPgn", // sep.iHeadingPgn heading number level byte
 133, &SwWW8ImplReader::Read_OLST, // "sprmSOlstAnm", // sep.olstAnm OLST variable length
 134, (FNReadRecord)0, // "??135",
 135, (FNReadRecord)0, // "??135",
 136, (FNReadRecord)0, // "sprmSDxaColWidth", // sep.rgdxaColWidthSpacing complex (see below) 3 bytes
 137, (FNReadRecord)0, // "sprmSDxaColSpacing", // sep.rgdxaColWidthSpacing complex (see below) 3 bytes
 138, (FNReadRecord)0, // "sprmSFEvenlySpaced", // sep.fEvenlySpaced 1 or 0 byte
 139, (FNReadRecord)0, // "sprmSFProtected", // sep.fUnlocked 1 or 0 byte
 140, (FNReadRecord)0, // "sprmSDmBinFirst", // sep.dmBinFirst  word
 141, (FNReadRecord)0, // "sprmSDmBinOther", // sep.dmBinOther  word
 142, (FNReadRecord)0, // "sprmSBkc", // sep.bkc bkc byte BreakCode
 143, (FNReadRecord)0, // "sprmSFTitlePage", // sep.fTitlePage 0 or 1 byte
 144, (FNReadRecord)0, // "sprmSCcolumns", // sep.ccolM1 # of cols - 1 word
 145, (FNReadRecord)0, // "sprmSDxaColumns", // sep.dxaColumns dxa word
 146, (FNReadRecord)0, // "sprmSFAutoPgn", // sep.fAutoPgn obsolete byte
 147, (FNReadRecord)0, // "sprmSNfcPgn", // sep.nfcPgn nfc byte
 148, (FNReadRecord)0, // "sprmSDyaPgn", // sep.dyaPgn dya short
 149, (FNReadRecord)0, // "sprmSDxaPgn", // sep.dxaPgn dya short

 150, (FNReadRecord)0, // "sprmSFPgnRestart", // sep.fPgnRestart 0 or 1 byte
 151, (FNReadRecord)0, // "sprmSFEndnote", // sep.fEndnote 0 or 1 byte
 152, (FNReadRecord)0, // "sprmSLnc", // sep.lnc lnc byte
 153, (FNReadRecord)0, // "sprmSGprfIhdt", // sep.grpfIhdt grpfihdt (see Headers and Footers topic) byte
 154, (FNReadRecord)0, // "sprmSNLnnMod", // sep.nLnnMod non-neg int. word

 155, (FNReadRecord)0, // "sprmSDxaLnn", // sep.dxaLnn dxa word
 156, (FNReadRecord)0, // "sprmSDyaHdrTop", // sep.dyaHdrTop dya word
 157, (FNReadRecord)0, // "sprmSDyaHdrBottom", // sep.dyaHdrBottom dya word
 158, (FNReadRecord)0, // "sprmSLBetween", // sep.fLBetween 0 or 1 byte
 159, (FNReadRecord)0, // "sprmSVjc", // sep.vjc vjc byte

 160, (FNReadRecord)0, // "sprmSLnnMin", // sep.lnnMin lnn word
 161, (FNReadRecord)0, // "sprmSPgnStart", // sep.pgnStart pgn word
 162, (FNReadRecord)0, // "sprmSBOrientation", // sep.dmOrientPage dm byte

//??
 163, (FNReadRecord)0, // "?SprmSBCustomize 163", //???
 164, (FNReadRecord)0, // "sprmSXaPage", // sep.xaPage xa word
 165, (FNReadRecord)0, // "sprmSYaPage", // sep.yaPage ya word
 166, (FNReadRecord)0, // "sprmSDxaLeft", // sep.dxaLeft dxa word
 167, (FNReadRecord)0, // "sprmSDxaRight", // sep.dxaRight dxa word
 168, (FNReadRecord)0, // "sprmSDyaTop", // sep.dyaTop dya word
 169, (FNReadRecord)0, // "sprmSDyaBottom", // sep.dyaBottom dya word

 170, (FNReadRecord)0, // "sprmSDzaGutter", // sep.dzaGutter dza word
 171, (FNReadRecord)0, // "sprmSDMPaperReq", // sep.dmPaperReq dm word
 172, (FNReadRecord)0, // "??172",
 173, (FNReadRecord)0, // "??173",
 174, (FNReadRecord)0, // "??174",
 175, (FNReadRecord)0, // "??175",
 176, (FNReadRecord)0, // "??176",
 177, (FNReadRecord)0, // "??177",
 178, (FNReadRecord)0, // "??178",
 179, (FNReadRecord)0, // "??179",

 180, (FNReadRecord)0, // "??180",
 181, (FNReadRecord)0, // "??181",
 182, (FNReadRecord)0, //  "sprmTJc", // tap.jc jc word (low order byte is significant)
 183, (FNReadRecord)0, //  "sprmTDxaLeft", // tap.rgdxaCenter (see below) dxa word
 184, (FNReadRecord)0, //  "sprmTDxaGapHalf", // tap.dxaGapHalf, tap.rgdxaCenter (see below) dxa word
 185, (FNReadRecord)0, //  "sprmTFCantSplit", // tap.fCantSplit 1 or 0 byte
 186, (FNReadRecord)0, //  "sprmTTableHeader", // tap.fTableHeader 1 or 0 byte
 187, (FNReadRecord)0, // "sprmTTableBorders", // tap.rgbrcTable complex(see below) 12 bytes
 188, (FNReadRecord)0, // "sprmTDefTable10", // tap.rgdxaCenter, tap.rgtc complex (see below) variable length
 189, (FNReadRecord)0, //  "sprmTDyaRowHeight", // tap.dyaRowHeight dya word


//??
 190, (FNReadRecord)0, // "?sprmTDefTable", // tap.rgtc complex (see below)

//??
 191, (FNReadRecord)0, // "?sprmTDefTableShd", // tap.rgshd complex (see below)
 192, (FNReadRecord)0, // "sprmTTlp", // tap.tlp TLP 4 bytes
 193, (FNReadRecord)0, // "sprmTSetBrc", // tap.rgtc[].rgbrc complex (see below) 5 bytes
 194, (FNReadRecord)0, // "sprmTInsert", // tap.rgdxaCenter,tap.rgtc complex (see below) 4 bytes
 195, (FNReadRecord)0, // "sprmTDelete", // tap.rgdxaCenter, tap.rgtc complex (see below) word
 196, (FNReadRecord)0, // "sprmTDxaCol", // tap.rgdxaCenter complex (see below) 4 bytes
 197, (FNReadRecord)0, // "sprmTMerge", // tap.fFirstMerged, tap.fMerged complex (see below) word
 198, (FNReadRecord)0, // "sprmTSplit", // tap.fFirstMerged, tap.fMerged complex (see below) word
 199, (FNReadRecord)0, // "sprmTSetBrc10", // tap.rgtc[].rgbrc complex (see below) 5 bytes

 200, (FNReadRecord)0, // "sprmTSetShd", // tap.rgshd complex (see below) 4 bytes

#if 0
// ab hier Selbstdefinierte Ids

/* 0 (256) */   &SwWW8ImplReader::Read_Ftn,     // FootNote
/* 1 (257) */   &SwWW8ImplReader::Read_Ftn,     // EndNote
/* 2 (258) */   &SwWW8ImplReader::Read_Field,   // Feld
/* 3 (259) */   &SwWW8ImplReader::Read_Book,    // Bookmark
/* 4 (260) */   &SwWW8ImplReader::Read_Piece    // Piece-Anfang / Ende


// ab hier Selbstdefinierte Ids

    256, (FnOut)0, "FootNote",
    257, (FnOut)0, "EndNote",
    258, (FnOut)0, "??258 selbstdef.",
    259, (FnOut)0, "??259 selbstdef.",
    260, (FnOut)0, "Field",
#endif
//- neue ab Ver8 ------------------------------------------------------------

    0x4600, &SwWW8ImplReader::Read_StyleCode, //"sprmPIstd" // pap.istd;istd (style code);short;
    0xC601, (FNReadRecord)0, //"sprmPIstdPermute" // pap.istd;permutation vector (see below);variable length;
    0x2602, (FNReadRecord)0, //"sprmPIncLvl" // pap.istd, pap.lvl;difference between istd of base PAP and istd of PAP to be produced (see below);byte;
    0x2403, &SwWW8ImplReader::Read_Justify, //"sprmPJc" // pap.jc;jc (justification);byte;
    0x2404, (FNReadRecord)0, //"sprmPFSideBySide" // pap.fSideBySide;0 or 1;byte;
    0x2405, &SwWW8ImplReader::Read_KeepLines, //"sprmPFKeep" // pap.fKeep;0 or 1;byte;
    0x2406, &SwWW8ImplReader::Read_KeepParas, //"sprmPFKeepFollow" // pap.fKeepFollow;0 or 1;byte;
    0x2407, &SwWW8ImplReader::Read_BreakBefore, //"sprmPFPageBreakBefore" // pap.fPageBreakBefore;0 or 1;byte;
    0x2408, (FNReadRecord)0, //"sprmPBrcl" // pap.brcl;brcl;byte;
    0x2409, (FNReadRecord)0, //"sprmPBrcp" // pap.brcp;brcp;byte;
    0x260A, &SwWW8ImplReader::Read_ListLevel,       //"sprmPIlvl" // pap.ilvl;ilvl;byte;
    0x460B, &SwWW8ImplReader::Read_LFOPosition, //"sprmPIlfo" // pap.ilfo;ilfo (list index) ;short;
    0x240C, &SwWW8ImplReader::Read_NoLineNumb, //"sprmPFNoLineNumb" // pap.fNoLnn;0 or 1;byte;
    0xC60D, &SwWW8ImplReader::Read_Tab, //"sprmPChgTabsPapx" // pap.itbdMac, pap.rgdxaTab, pap.rgtbd;complex - see below;variable length
    0x840E, &SwWW8ImplReader::Read_LR, //"sprmPDxaRight" // pap.dxaRight;dxa;word;
    0x840F, &SwWW8ImplReader::Read_LR, //"sprmPDxaLeft" // pap.dxaLeft;dxa;word;
    0x4610, (FNReadRecord)0, //"sprmPNest" // pap.dxaLeft;dxa-see below;word;
    0x8411, &SwWW8ImplReader::Read_LR, //"sprmPDxaLeft1" // pap.dxaLeft1;dxa;word;
    0x6412, &SwWW8ImplReader::Read_LineSpace, //"sprmPDyaLine" // pap.lspd;an LSPD, a long word structure consisting of a short of dyaLine followed by a short of fMultLinespace - see below;long;
    0xA413, &SwWW8ImplReader::Read_UL, //"sprmPDyaBefore" // pap.dyaBefore;dya;word;
    0xA414, &SwWW8ImplReader::Read_UL, //"sprmPDyaAfter" // pap.dyaAfter;dya;word;
    0xC615, (FNReadRecord)0, //"sprmPChgTabs" // pap.itbdMac, pap.rgdxaTab, pap.rgtbd;complex - see below;variable length;
    0x2416, (FNReadRecord)0, //"sprmPFInTable" // pap.fInTable;0 or 1;byte;
    0x2417, &SwWW8ImplReader::Read_TabRowEnd, //"sprmPFTtp" // // pap.fTtp;0 or 1;byte;
    0x8418, (FNReadRecord)0, //"sprmPDxaAbs" // pap.dxaAbs;dxa;word;
    0x8419, (FNReadRecord)0, //"sprmPDyaAbs" // pap.dyaAbs;dya;word;
    0x841A, (FNReadRecord)0, //"sprmPDxaWidth" // pap.dxaWidth;dxa;word;
    0x261B, &SwWW8ImplReader::Read_ApoPPC, //"sprmPPc" // pap.pcHorz, pap.pcVert;complex - see below;byte;
    0x461C, (FNReadRecord)0, //"sprmPBrcTop10" // pap.brcTop;BRC10;word;
    0x461D, (FNReadRecord)0, //"sprmPBrcLeft10" // pap.brcLeft;BRC10;word;
    0x461E, (FNReadRecord)0, //"sprmPBrcBottom10" // pap.brcBottom;BRC10;word;
    0x461F, (FNReadRecord)0, //"sprmPBrcRight10" // pap.brcRight;BRC10;word;
    0x4620, (FNReadRecord)0, //"sprmPBrcBetween10" // pap.brcBetween;BRC10;word;
    0x4621, (FNReadRecord)0, //"sprmPBrcBar10" // pap.brcBar;BRC10;word;
    0x4622, (FNReadRecord)0, //"sprmPDxaFromText10" // pap.dxaFromText;dxa;word;
    0x2423, (FNReadRecord)0, //"sprmPWr" // pap.wr;wr (see description of PAP for definition;byte;
    0x6424, &SwWW8ImplReader::Read_Border, //"sprmPBrcTop" // pap.brcTop;BRC;long;
    0x6425, &SwWW8ImplReader::Read_Border, //"sprmPBrcLeft" // pap.brcLeft;BRC;long;
    0x6426, &SwWW8ImplReader::Read_Border, //"sprmPBrcBottom" // pap.brcBottom;BRC;long;
    0x6427, &SwWW8ImplReader::Read_Border, //"sprmPBrcRight" // pap.brcRight;BRC;long;
    0x6428, &SwWW8ImplReader::Read_Border, //"sprmPBrcBetween" // pap.brcBetween;BRC;long;
    0x6629, (FNReadRecord)0, //"sprmPBrcBar" // pap.brcBar;BRC;long;
    0x242A, &SwWW8ImplReader::Read_Hyphenation, //"sprmPFNoAutoHyph" // pap.fNoAutoHyph;0 or 1;byte;
    0x442B, (FNReadRecord)0, //"sprmPWHeightAbs" // pap.wHeightAbs;w;word;
    0x442C, (FNReadRecord)0, //"sprmPDcs" // pap.dcs;DCS;short;
    0x442D, &SwWW8ImplReader::Read_Shade, //"sprmPShd" // pap.shd;SHD;word;
    0x842E, (FNReadRecord)0, //"sprmPDyaFromText" // pap.dyaFromText;dya;word;
    0x842F, (FNReadRecord)0, //"sprmPDxaFromText" // pap.dxaFromText;dxa;word;
    0x2430, (FNReadRecord)0, //"sprmPFLocked" // pap.fLocked;0 or 1;byte;
    0x2431, &SwWW8ImplReader::Read_WidowControl, //"sprmPFWidowControl" // pap.fWidowControl;0 or 1;byte;
    0xC632, (FNReadRecord)0, //"sprmPRuler" // ;;variable length;
    0x2433, (FNReadRecord)0, //"sprmPFKinsoku" // pap.fKinsoku;0 or 1;byte;
    0x2434, (FNReadRecord)0, //"sprmPFWordWrap" // pap.fWordWrap;0 or 1;byte;
    0x2435, (FNReadRecord)0, //"sprmPFOverflowPunct" // pap.fOverflowPunct;0 or 1;byte;
    0x2436, (FNReadRecord)0, //"sprmPFTopLinePunct" // pap.fTopLinePunct;0 or 1;byte;
    0x2437, (FNReadRecord)0, //"sprmPFAutoSpaceDE" // pap.fAutoSpaceDE;0 or 1;byte;
    0x2438, (FNReadRecord)0, //"sprmPFAutoSpaceDN" // pap.fAutoSpaceDN;0 or 1;byte;
    0x4439, (FNReadRecord)0, //"sprmPWAlignFont" // pap.wAlignFont;iFa (see description of PAP for definition);word;
    0x443A, (FNReadRecord)0, //"sprmPFrameTextFlow" // pap.fVertical pap.fBackward pap.fRotateFont;complex (see description of PAP for definition);word;
    0x243B, (FNReadRecord)0, //"sprmPISnapBaseLine" // obsolete: not applicable in Word97 and later versions;;byte;
    0xC63E, &SwWW8ImplReader::Read_ANLevelDesc, //"sprmPAnld" // pap.anld;;variable length;
    0xC63F, (FNReadRecord)0, //"sprmPPropRMark" // pap.fPropRMark;complex (see below);variable length;
    0x2640,  &SwWW8ImplReader::Read_POutLvl, //"sprmPOutLvl" // pap.lvl;has no effect if pap.istd is < 1 or is > 9;byte;
    0x2441, (FNReadRecord)0, //"sprmPFBiDi" // ;;byte;
    0x2443, (FNReadRecord)0, //"sprmPFNumRMIns" // pap.fNumRMIns;1 or 0;bit;
    0x2444, (FNReadRecord)0, //"sprmPCrLf" // ;;byte;
    0xC645, (FNReadRecord)0, //"sprmPNumRM" // pap.numrm;;variable length;
    0x6645, (FNReadRecord)0, //"sprmPHugePapx" // see below;fc in the data stream to locate the huge grpprl (see below);long;
    0x6646, (FNReadRecord)0, //"sprmPHugePapx" // see below;fc in the data stream to locate the huge grpprl (see below);long;
    0x2447, (FNReadRecord)0, //"sprmPFUsePgsuSettings" // pap.fUsePgsuSettings;1 or 0;byte;
    0x2448, (FNReadRecord)0, //"sprmPFAdjustRight" // pap.fAdjustRight;1 or 0;byte;
    0x0800, &SwWW8ImplReader::Read_CFRMarkDel, //"sprmCFRMarkDel" // chp.fRMarkDel;1 or 0;bit;
    0x0801, &SwWW8ImplReader::Read_CFRMark,    //"sprmCFRMark" // chp.fRMark;1 or 0;bit;
    0x0802, &SwWW8ImplReader::Read_FldVanish, //"sprmCFFldVanish" // chp.fFldVanish;1 or 0;bit;
    0x6A03, &SwWW8ImplReader::Read_PicLoc, //"sprmCPicLocation" // chp.fcPic and chp.fSpec;see below;variable length, length recorded is always 4;
    0x4804, (FNReadRecord)0, //"sprmCIbstRMark" // chp.ibstRMark;index into sttbRMark;short;
    0x6805, (FNReadRecord)0, //"sprmCDttmRMark" // chp.dttmRMark;DTTM;long;
    0x0806, (FNReadRecord)0, //"sprmCFData" // chp.fData;1 or 0;bit;
    0x4807, (FNReadRecord)0, //"sprmCIdslRMark" // chp.idslRMReason;an index to a table of strings defined in Word 6.0 executables;short;
    0xEA08, &SwWW8ImplReader::Read_CharSet, //"sprmCChs" // chp.fChsDiff and chp.chse;see below;3 bytes;
    0x6A09, &SwWW8ImplReader::Read_Symbol, //"sprmCSymbol" // chp.fSpec, chp.xchSym and chp.ftcSym;see below;variable length, length recorded is always 4;
    0x080A, &SwWW8ImplReader::Read_Obj, //"sprmCFOle2" // chp.fOle2;1 or 0;bit;
//0x480B, obsolete,"sprmCIdCharType", // obsolete: not applicable in Word97 and later versions;;;
    0x2A0C, &SwWW8ImplReader::Read_CharHighlight, //"sprmCHighlight" // chp.fHighlight, chp.icoHighlight;ico (fHighlight is set to 1 iff ico is not 0);byte;
    0x680E, &SwWW8ImplReader::Read_PicLoc, //"sprmCObjLocation" // chp.fcObj;FC;long;
//0x2A10, ? ? ?  , "sprmCFFtcAsciSymb", // ;;;
    0x4A30, &SwWW8ImplReader::Read_CColl, //"sprmCIstd" // chp.istd;istd, see stylesheet definition;short;
    0xCA31, (FNReadRecord)0, //"sprmCIstdPermute" // chp.istd;permutation vector (see below);variable length;
    0x2A32, (FNReadRecord)0, //"sprmCDefault" // whole CHP (see below);none;variable length;
    0x2A33, (FNReadRecord)0, //"sprmCPlain" // whole CHP (see below);none; Laenge: 0;
//0x2A34, ? ? ?, "sprmCKcd", // ;;;

    0x0835, &SwWW8ImplReader::Read_BoldUsw, //"sprmCFBold" // chp.fBold;0,1, 128, or 129 (see below);byte;
    0x0836, &SwWW8ImplReader::Read_BoldUsw, //"sprmCFItalic" // chp.fItalic;0,1, 128, or 129 (see below);byte;
    0x0837, &SwWW8ImplReader::Read_BoldUsw, //"sprmCFStrike" // chp.fStrike;0,1, 128, or 129 (see below);byte;
    0x0838, &SwWW8ImplReader::Read_BoldUsw, //"sprmCFOutline" // chp.fOutline;0,1, 128, or 129 (see below);byte;
    0x0839, &SwWW8ImplReader::Read_BoldUsw, //"sprmCFShadow" // chp.fShadow;0,1, 128, or 129 (see below);byte;
    0x083A, &SwWW8ImplReader::Read_BoldUsw, //"sprmCFSmallCaps" // chp.fSmallCaps;0,1, 128, or 129 (see below);byte;
    0x083B, &SwWW8ImplReader::Read_BoldUsw, //"sprmCFCaps" // chp.fCaps;0,1, 128, or 129 (see below);byte;

    0x083C, &SwWW8ImplReader::Read_Invisible, //"sprmCFVanish" // chp.fVanish;0,1, 128, or 129 (see below);byte;

//0x4A3D, (FNReadRecord)0, //"sprmCFtcDefault" // ;ftc, only used internally, never stored in file;word;
    0x2A3E, &SwWW8ImplReader::Read_Underline, //"sprmCKul" // chp.kul;kul;byte;
    0xEA3F, (FNReadRecord)0, //"sprmCSizePos" // chp.hps, chp.hpsPos;(see below);3 bytes;
    0x8840, &SwWW8ImplReader::Read_Kern, //"sprmCDxaSpace" // chp.dxaSpace;dxa;word;
    0x4A41, &SwWW8ImplReader::Read_Language, //"sprmCLid" // ;only used internally never stored;word;
    0x2A42, &SwWW8ImplReader::Read_TxtColor, //"sprmCIco" // chp.ico;ico;byte;
    0x4A43, &SwWW8ImplReader::Read_FontSize, //"sprmCHps" // chp.hps;hps;byte;
    0x2A44, (FNReadRecord)0, //"sprmCHpsInc" // chp.hps;(see below);byte;
    0x4845, &SwWW8ImplReader::Read_SubSuperProp, //"sprmCHpsPos" // chp.hpsPos;hps;byte;
    0x2A46, (FNReadRecord)0, //"sprmCHpsPosAdj" // chp.hpsPos;hps (see below);byte;
    0xCA47, &SwWW8ImplReader::Read_Majority, //"sprmCMajority" // chp.fBold, chp.fItalic, chp.fSmallCaps, chp.fVanish, chp.fStrike, chp.fCaps, chp.rgftc, chp.hps, chp.hpsPos, chp.kul, chp.dxaSpace, chp.ico, chp.rglid;complex (see below);variable length, length byte plus size of following grpprl;
    0x2A48, &SwWW8ImplReader::Read_SubSuper, //"sprmCIss" // chp.iss;iss;byte;
    0xCA49, (FNReadRecord)0, //"sprmCHpsNew50" // chp.hps;hps;variable width, length always recorded as 2;
    0xCA4A, (FNReadRecord)0, //"sprmCHpsInc1" // chp.hps;complex (see below);variable width, length always recorded as 2;
    0x484B, &SwWW8ImplReader::Read_FontKern, //"sprmCHpsKern" // chp.hpsKern;hps;short;
    0xCA4C, &SwWW8ImplReader::Read_Majority, //"sprmCMajority50" // chp.fBold, chp.fItalic, chp.fSmallCaps, chp.fVanish, chp.fStrike, chp.fCaps, chp.ftc, chp.hps, chp.hpsPos, chp.kul, chp.dxaSpace, chp.ico,;complex (see below);variable length;
    0x4A4D, (FNReadRecord)0, //"sprmCHpsMul" // chp.hps;percentage to grow hps;short;
    0x484E, (FNReadRecord)0, //"sprmCYsri" // chp.ysri;ysri;short;
    0x4A4F, &SwWW8ImplReader::Read_FontCode, //"sprmCRgFtc0" // chp.rgftc[0];ftc for ASCII text (see below);short;
    0x4A50, &SwWW8ImplReader::Read_FontCode, //"sprmCRgFtc1" // chp.rgftc[1];ftc for Far East text (see below);short;
    0x4A51, &SwWW8ImplReader::Read_FontCode, //"sprmCRgFtc2" // chp.rgftc[2];ftc for non-Far East text (see below);short;
//0x4852, ? ? ?  , "sprmCCharScale", // ;;;
    0x2A53, &SwWW8ImplReader::Read_BoldUsw, //"sprmCFDStrike" // chp.fDStrike;;byte;
    0x0854, (FNReadRecord)0, //"sprmCFImprint" // chp.fImprint;1 or 0;bit;
    0x0855, &SwWW8ImplReader::Read_Special, //"sprmCFSpec" // chp.fSpec ;1 or 0;bit;
    0x0856, &SwWW8ImplReader::Read_Obj, //"sprmCFObj" // chp.fObj;1 or 0;bit;
    0xCA57, &SwWW8ImplReader::Read_CPropRMark, //"sprmCPropRMark" // chp.fPropRMark, chp.ibstPropRMark, chp.dttmPropRMark;Complex (see below);variable length always recorded as 7 bytes;
    0x0858, (FNReadRecord)0, //"sprmCFEmboss" // chp.fEmboss;1 or 0;bit;
    0x2859, (FNReadRecord)0, //"sprmCSfxText" // chp.sfxtText;text animation;byte;
//0x085A, ? ? ?  , "sprmCFBiDi", // ;;;
//0x085B, ? ? ?  , "sprmCFDiacColor", // ;;;
//0x085C, ? ? ?  , "sprmCFBoldBi", // ;;;
//0x085D, ? ? ?  , "sprmCFItalicBi", // ;;;
//0x4A5E, ? ? ?  , "sprmCFtcBi", // ;;;
//0x485F, ? ? ?  , "sprmCLidBi", // ;;;
//0x4A60, ? ? ?  , "sprmCIcoBi", // ;;;
//0x4A61, ? ? ?  , "sprmCHpsBi", // ;;;
    0xCA62, (FNReadRecord)0, //"sprmCDispFldRMark" // chp.fDispFldRMark, chp.ibstDispFldRMark, chp.dttmDispFldRMark ;Complex (see below);variable length always recorded as 39 bytes;
    0x4863, (FNReadRecord)0, //"sprmCIbstRMarkDel" // chp.ibstRMarkDel;index into sttbRMark;short;
    0x6864, (FNReadRecord)0, //"sprmCDttmRMarkDel" // chp.dttmRMarkDel;DTTM;long;
    0x6865, (FNReadRecord)0, //"sprmCBrc" // chp.brc;BRC;long;
    0x4866, &SwWW8ImplReader::Read_CharShadow, //"sprmCShd" // chp.shd;SHD;short;
    0x4867, (FNReadRecord)0, //"sprmCIdslRMarkDel" // chp.idslRMReasonDel;an index to a table of strings defined in Word 6.0 executables;short;
    0x0868, (FNReadRecord)0, //"sprmCFUsePgsuSettings" // chp.fUsePgsuSettings;1 or 0;bit;
    0x486B, (FNReadRecord)0, //"sprmCCpg" // ;;word;
    0x486D, &SwWW8ImplReader::Read_Language, //"sprmCRgLid0" // chp.rglid[0];LID: for non-Far East text;word;
    0x486E, (FNReadRecord)0, //"sprmCRgLid1" // chp.rglid[1];LID: for Far East text;word;
    0x286F, (FNReadRecord)0, //"sprmCIdctHint" // chp.idctHint;IDCT: (see below);byte;
    0x2E00, (FNReadRecord)0, //"sprmPicBrcl" // pic.brcl;brcl (see PIC structure definition);byte;
    0xCE01, (FNReadRecord)0, //"sprmPicScale" // pic.mx, pic.my, pic.dxaCropleft, pic.dyaCropTop pic.dxaCropRight, pic.dyaCropBottom;Complex (see below);length byte plus 12 bytes;
    0x6C02, (FNReadRecord)0, //"sprmPicBrcTop" // pic.brcTop;BRC;long;
    0x6C03, (FNReadRecord)0, //"sprmPicBrcLeft" // pic.brcLeft;BRC;long;
    0x6C04, (FNReadRecord)0, //"sprmPicBrcBottom" // pic.brcBottom;BRC;long;
    0x6C05, (FNReadRecord)0, //"sprmPicBrcRight" // pic.brcRight;BRC;long;
    0x3000, (FNReadRecord)0, //"sprmScnsPgn" // sep.cnsPgn;cns;byte;
    0x3001, (FNReadRecord)0, //"sprmSiHeadingPgn" // sep.iHeadingPgn;heading number level;byte;
    0xD202, &SwWW8ImplReader::Read_OLST, //"sprmSOlstAnm" // sep.olstAnm;OLST;variable length;
    0xF203, (FNReadRecord)0, //"sprmSDxaColWidth" // sep.rgdxaColWidthSpacing;complex (see below);3 bytes;
    0xF204, (FNReadRecord)0, //"sprmSDxaColSpacing" // sep.rgdxaColWidthSpacing;complex (see below);3 bytes;
    0x3005, (FNReadRecord)0, //"sprmSFEvenlySpaced" // sep.fEvenlySpaced;1 or 0;byte;
    0x3006, (FNReadRecord)0, //"sprmSFProtected" // sep.fUnlocked;1 or 0;byte;
    0x5007, (FNReadRecord)0, //"sprmSDmBinFirst" // sep.dmBinFirst;;word;
    0x5008, (FNReadRecord)0, //"sprmSDmBinOther" // sep.dmBinOther;;word;
    0x3009, (FNReadRecord)0, //"sprmSBkc" // sep.bkc;bkc;byte;
    0x300A, (FNReadRecord)0, //"sprmSFTitlePage" // sep.fTitlePage;0 or 1;byte;
    0x500B, (FNReadRecord)0, //"sprmSCcolumns" // sep.ccolM1;# of cols - 1;word;
    0x900C, (FNReadRecord)0, //"sprmSDxaColumns" // sep.dxaColumns;dxa;word;
    0x300D, (FNReadRecord)0, //"sprmSFAutoPgn" // sep.fAutoPgn;obsolete;byte;
    0x300E, (FNReadRecord)0, //"sprmSNfcPgn" // sep.nfcPgn;nfc;byte;
    0xB00F, (FNReadRecord)0, //"sprmSDyaPgn" // sep.dyaPgn;dya;short;
    0xB010, (FNReadRecord)0, //"sprmSDxaPgn" // sep.dxaPgn;dya;short;
    0x3011, (FNReadRecord)0, //"sprmSFPgnRestart" // sep.fPgnRestart;0 or 1;byte;
    0x3012, (FNReadRecord)0, //"sprmSFEndnote" // sep.fEndnote;0 or 1;byte;
    0x3013, (FNReadRecord)0, //"sprmSLnc" // sep.lnc;lnc;byte;
    0x3014, (FNReadRecord)0, //"sprmSGprfIhdt" // sep.grpfIhdt;grpfihdt (see Headers and Footers topic);byte;
    0x5015, (FNReadRecord)0, //"sprmSNLnnMod" // sep.nLnnMod;non-neg int.;word;
    0x9016, (FNReadRecord)0, //"sprmSDxaLnn" // sep.dxaLnn;dxa;word;
    0xB017, (FNReadRecord)0, //"sprmSDyaHdrTop" // sep.dyaHdrTop;dya;word;
    0xB018, (FNReadRecord)0, //"sprmSDyaHdrBottom" // sep.dyaHdrBottom;dya;word;
    0x3019, (FNReadRecord)0, //"sprmSLBetween" // sep.fLBetween;0 or 1;byte;
    0x301A, (FNReadRecord)0, //"sprmSVjc" // sep.vjc;vjc;byte;
    0x501B, (FNReadRecord)0, //"sprmSLnnMin" // sep.lnnMin;lnn;word;
    0x501C, (FNReadRecord)0, //"sprmSPgnStart" // sep.pgnStart;pgn;word;
    0x301D, (FNReadRecord)0, //"sprmSBOrientation" // sep.dmOrientPage;dm;byte;
//0x301E, ? ? ?  , "sprmSBCustomize", // ;;;
    0xB01F, (FNReadRecord)0, //"sprmSXaPage" // sep.xaPage;xa;word;
    0xB020, (FNReadRecord)0, //"sprmSYaPage" // sep.yaPage;ya;word;
    0x2205, (FNReadRecord)0, //"sprmSDxaLeft" // sep.dxaLeft;dxa;word;
    0xB022, (FNReadRecord)0, //"sprmSDxaRight" // sep.dxaRight;dxa;word;
    0x9023, (FNReadRecord)0, //"sprmSDyaTop" // sep.dyaTop;dya;word;
    0x9024, (FNReadRecord)0, //"sprmSDyaBottom" // sep.dyaBottom;dya;word;
    0xB025, (FNReadRecord)0, //"sprmSDzaGutter" // sep.dzaGutter;dza;word;
    0x5026, (FNReadRecord)0, //"sprmSDmPaperReq" // sep.dmPaperReq;dm;word;
    0xD227, (FNReadRecord)0, //"sprmSPropRMark" // sep.fPropRMark, sep.ibstPropRMark, sep.dttmPropRMark ;complex (see below);variable length always recorded as 7 bytes;
//0x3228, ? ? ?  , "sprmSFBiDi", // ;;;
//0x3229, ? ? ?  , "sprmSFFacingCol", // ;;;
//0x322A, ? ? ?  , "sprmSFRTLGutter", // ;;;
    0x702B, (FNReadRecord)0, //"sprmSBrcTop" // sep.brcTop;BRC;long;
    0x702C, (FNReadRecord)0, //"sprmSBrcLeft" // sep.brcLeft;BRC;long;
    0x702D, (FNReadRecord)0, //"sprmSBrcBottom" // sep.brcBottom;BRC;long;
    0x702E, (FNReadRecord)0, //"sprmSBrcRight" // sep.brcRight;BRC;long;
    0x522F, (FNReadRecord)0, //"sprmSPgbProp" // sep.pgbProp;;word;
    0x7030, (FNReadRecord)0, //"sprmSDxtCharSpace" // sep.dxtCharSpace;dxt;long;
    0x9031, (FNReadRecord)0, //"sprmSDyaLinePitch" // sep.dyaLinePitch;dya;  WRONG:long;  RIGHT:short;  !!!
//0x5032, ? ? ?  , "sprmSClm", // ;;;
    0x5033, (FNReadRecord)0, //"sprmSTextFlow" // sep.wTextFlow;complex (see below);short;
    0x5400, (FNReadRecord)0, //"sprmTJc" // tap.jc;jc;word (low order byte is significant);
    0x9601, (FNReadRecord)0, //"sprmTDxaLeft" // tap.rgdxaCenter (see below);dxa;word;
    0x9602, (FNReadRecord)0, //"sprmTDxaGapHalf" // tap.dxaGapHalf, tap.rgdxaCenter (see below);dxa;word;
    0x3403, (FNReadRecord)0, //"sprmTFCantSplit" // tap.fCantSplit;1 or 0;byte;
    0x3404, (FNReadRecord)0, //"sprmTTableHeader" // tap.fTableHeader;1 or 0;byte;
    0xD605, (FNReadRecord)0, //"sprmTTableBorders" // tap.rgbrcTable;complex(see below);24 bytes;
    0xD606, (FNReadRecord)0, //"sprmTDefTable10" // tap.rgdxaCenter, tap.rgtc;complex (see below);variable length;
    0x9407, (FNReadRecord)0, //"sprmTDyaRowHeight" // tap.dyaRowHeight;dya;word;
    0xD608, (FNReadRecord)0, //"sprmTDefTable" // tap.rgtc;complex (see below);;
    0xD609, (FNReadRecord)0, //"sprmTDefTableShd" // tap.rgshd;complex (see below);;
    0x740A, (FNReadRecord)0, //"sprmTTlp" // tap.tlp;TLP;4 bytes;
//0x560B, ? ? ?  , "sprmTFBiDi", // ;;;
//0x740C, ? ? ?  , "sprmTHTMLProps", // ;;;
    0xD620, (FNReadRecord)0, //"sprmTSetBrc" // tap.rgtc[].rgbrc;complex (see below);5 bytes;
    0x7621, &SwWW8ImplReader::Read_TabCellInsert, //"sprmTInsert" // tap.rgdxaCenter, tap.rgtc;complex (see below);4 bytes;
    0x5622, &SwWW8ImplReader::Read_TabCellDelete, //"sprmTDelete" // tap.rgdxaCenter, tap.rgtc;complex (see below);word;
    0x7623, (FNReadRecord)0, //"sprmTDxaCol" // tap.rgdxaCenter;complex (see below);4 bytes;
    0x5624, (FNReadRecord)0, //"sprmTMerge" // tap.fFirstMerged, tap.fMerged;complex (see below);word;
    0x5625, (FNReadRecord)0, //"sprmTSplit" // tap.fFirstMerged, tap.fMerged;complex (see below);word;
    0xD626, (FNReadRecord)0, //"sprmTSetBrc10" // tap.rgtc[].rgbrc;complex (see below);5 bytes;
    0x7627, (FNReadRecord)0, //"sprmTSetShd" // tap.rgshd;complex (see below);4 bytes;
    0x7628, (FNReadRecord)0, //"sprmTSetShdOdd" // tap.rgshd;complex (see below);4 bytes;
    0x7629, (FNReadRecord)0, //"sprmTTextFlow" // tap.rgtc[].fVerticaltap.rgtc[].fBackwardtap.rgtc[].fRotateFont;0 or 10 or 10 or 1;word;
//0xD62A, ? ? ?  , "sprmTDiagLine", // ;;;
    0xD62B, (FNReadRecord)0, //"sprmTVertMerge" // tap.rgtc[].vertMerge;complex (see below);variable length always recorded as 2 bytes;
    0xD62C, (FNReadRecord)0, //"sprmTVertAlign" // tap.rgtc[].vertAlign;complex (see below);variable length always recorded as 3 byte;
};

//-----------------------------------------
//      Hilfsroutinen : SPRM finden
//-----------------------------------------

static int
#if defined( WNT )
 __cdecl
#endif
#if defined( ICC )
 _Optlink
#endif
    CompSprmReadId( const void *pFirst, const void *pSecond)
{
    return( ((SprmReadInfo*)pFirst )->nId - ((SprmReadInfo*)pSecond)->nId );
}


SprmReadInfo& WW8GetSprmReadInfo( USHORT nId )
{
    // ggfs. Tab sortieren
    static BOOL bInit = FALSE;
    if( !bInit )
    {
        qsort( (void*)aSprmReadTab,
            sizeof( aSprmReadTab      ) / sizeof (aSprmReadTab[ 0 ]),
            sizeof( aSprmReadTab[ 0 ] ),
            CompSprmReadId );
        bInit = TRUE;
    }
    // Sprm heraussuchen
    void* pFound;
    SprmReadInfo aSrch;
    aSrch.nId = nId;
    if( 0 == ( pFound = bsearch( (BYTE *) &aSrch,
                        (void*) aSprmReadTab,
                        sizeof( aSprmReadTab      ) / sizeof (aSprmReadTab[ 0 ]),
                        sizeof( aSprmReadTab[ 0 ] ),
                        CompSprmReadId )))
    {
        // im Fehlerfall auf Nulltes Element verweisen
        pFound = (void*)aSprmReadTab;
    }
    return *(SprmReadInfo*) pFound;
}



//-----------------------------------------
//      Hilfsroutinen : SPRMs
//-----------------------------------------

void SwWW8ImplReader::EndSprm( USHORT nId )
{
    if( ( nId > 255 ) && ( nId < 0x0800 ) ) return;

    SprmReadInfo& rSprm = WW8GetSprmReadInfo( nId );
    /*
    if ( aWwSprmTab[nId] == 0 )
        return;

    (this->*SprmReadInfo)( nId, 0, -1 );
    */
    if( rSprm.pReadFnc )
        (this->*rSprm.pReadFnc)( nId, 0, -1 );
}

/*
// ein bzw. zwei Byte am Anfang des Sprm sind die Id
USHORT WW8GetSprmId( BYTE nVersion, BYTE* pSp, BYTE* pDelta )
{
    USHORT nId = 0;
    switch( nVersion )  // beachte: 6 steht fuer "6 ODER 7",  7 steht fuer "NUR 7"
    {
        case 6:
        case 7: nId = *pSp;
                if( pDelta ) *pDelta = 0;
                break;
        case 8: nId = SVBT16ToShort( &pSp[ 0 ] );
                if( pDelta ) *pDelta = 1;
                break;
        default:ASSERT( nId, "Es wurde vergessen, nVersion zu kodieren!" );
    }
    return nId;
}
*/

short SwWW8ImplReader::ImportSprm( BYTE* pPos, short nSprmsLen, USHORT nId )
{
    BYTE nDelta;
    BYTE nV = pWwFib->nVersion;

    if( nId )
        nDelta = bVer67 ? 0 : 1;
    else
        nId = WW8GetSprmId( nV, pPos, &nDelta );


#ifdef DEBUG
    ASSERT( nId != 0xff, "Sprm FF !!!!" );
#endif //DEBUG

    SprmReadInfo& rSprm = WW8GetSprmReadInfo( nId );


    short nFixedLen = 1 + nDelta + WW8SprmDataOfs( nId );
    short nL = WW8GetSprmSizeBrutto( nV, pPos, &nId );

    if( rSprm.pReadFnc )
    {
        (this->*rSprm.pReadFnc)( nId, pPos + nFixedLen, nL - nFixedLen );
    }
    return nL;
}




/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ww8/ww8par6.cxx,v 1.1.1.1 2000-09-18 17:14:59 hr Exp $


      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.104  2000/09/18 16:05:01  willem.vandorp
      OpenOffice header added.

      Revision 1.103  2000/08/24 13:20:54  kz
      Max (long, long)

      Revision 1.102  2000/08/21 15:03:09  khz
      #77692# import page orientation

      Revision 1.101  2000/08/18 09:48:33  khz
      Import Line Numbering (restart on new section)

      Revision 1.100  2000/08/18 06:47:29  khz
      Import Line Numbering

      Revision 1.99  2000/07/25 15:16:29  khz
      #76811# read/write AutoHyphenation flag from/into Document Properties

      Revision 1.98  2000/07/17 13:47:04  khz
      #73987# check if sprmSNfcPgn should cause section change or not

      Revision 1.97  2000/07/11 11:30:59  khz
      #76673# prepare implementation of sprmTDelete and sprmTInsert

      Revision 1.96  2000/06/28 08:07:48  khz
      #70915# Insert Section if end-note with flag 'on end of section' found

      Revision 1.95  2000/05/25 08:06:57  khz
      Piece Table optimization, Unicode changes, Bugfixes

      Revision 1.94  2000/05/16 12:03:50  jp
      Changes for unicode

      Revision 1.93  2000/05/16 11:23:49  khz
      Unicode code-conversion

      Revision 1.92  2000/03/21 10:37:08  khz
      Task #74319# - do NOT close just inserted (still empty!) section in CreateSep()
                   - closing of old section may cause the creation of a new one
      Task #66529# improve Header/Footer import

      Revision 1.91  2000/03/10 14:27:15  khz
      Task #65529# improve detection if Section is identical with previous

      Revision 1.90  2000/03/03 15:20:02  os
      StarView remainders removed

      Revision 1.89  2000/02/23 17:43:03  cmc
      #68832# Consider endnotes for header footer code

      Revision 1.88  2000/02/22 14:55:19  khz
      partial fix of #66832#

      Revision 1.87  2000/02/21 13:08:30  jp
      #70473# changes for unicode

      Revision 1.86  2000/02/15 16:09:28  jp
      #70473# changes for unicode

      Revision 1.85  2000/02/09 11:43:31  khz
      no Task Id: code cleaned for of annoying warning

      Revision 1.84  2000/01/21 16:42:44  khz
      Task #69155# set pPaM when inserting section with/without columns

      Revision 1.83  2000/01/19 17:08:51  khz
      Task #69178# never insert Fontattribute when skipping text content

      Revision 1.82  2000/01/14 11:27:59  khz
      Task #68832# -- CORRECTION: Task Number of rev below should have been: 68832 !

      Revision 1.81  2000/01/14 11:11:34  khz
      Task #71343# look for Sprm 37 (not 5) to recognize APO

      Revision 1.80  2000/01/06 15:23:49  khz
      Task #71411# Let last Section be unbalanced

      Revision 1.79  1999/12/23 15:10:46  jp
      Task #70915#: set Ftn-/End-TxtAtEnd attributes at sections

      Revision 1.78  1999/12/23 14:03:42  khz
      Task #68143# avoid attributes atached solely to Cell-End marks

      Revision 1.77  1999/12/23 10:24:53  khz
      Task #71209# avoid accessing pPageDesk if it's 0 ;-)

      Revision 1.76  1999/12/22 18:03:35  khz
      Task #70919# look if ParaStyle is different behind filed than it was before

      Revision 1.75  1999/12/09 16:46:36  khz
      Task #69180# allow Tabs if right of 1st-line-start OR right of paragraph margin

      Revision 1.74  1999/12/07 14:28:56  khz
      Task #69508# import sprmPHugePapx by reading DATA stream

      Revision 1.73  1999/12/01 14:35:52  khz
      Task #68488# Graphics in Sections with more than one Column

      Revision 1.72  1999/11/25 12:28:37  khz
      Task #68482# Store data in member *after* memset(this,0,...) in WW8FlyPara()

      Revision 1.71  1999/11/24 12:33:15  khz
      Task #66194# don't consider Sect-Properties to be unequal when one is protected

      Revision 1.70  1999/11/12 15:29:25  khz
      Task #69204#: prevent from inserting '?' when ConvertFromUnicode() fails

      Revision 1.69  1999/11/12 13:05:03  jp
      new: read sprmCHighlight

      Revision 1.68  1999/11/02 15:59:49  khz
      import new TOX_CONTENT and TOX_INDEX features (2)

      Revision 1.67  1999/10/13 21:06:12  khz
      Import Redlining (3)

      Revision 1.66  1999/10/08 09:26:23  khz
      Import Redlining

      Revision 1.65  1999/09/10 15:36:35  khz
      CharSet matching made by TENCINFO.H::rtl_getTextEncodingFromWindowsCharset()

      Revision 1.64  1999/09/09 18:16:25  khz
      CharSet matching now done in central methode WW8SCAN.HXX::WW8GetCharSet()

      Revision 1.63  1999/08/10 13:16:26  KHZ
      Task #66019# corrction of Font Family by analyzing Font Name

*************************************************************************/
diff --git a/sw/source/filter/ww8/ww8scan.cxx b/sw/source/filter/ww8/ww8scan.cxx
new file mode 100644
index 0000000..a501002
--- /dev/null
+++ b/sw/source/filter/ww8/ww8scan.cxx
@@ -0,0 +1,6326 @@
/*************************************************************************
 *
 *  $RCSfile: ww8scan.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:59 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/




//#define KHZ_TEST0






#include <stdlib.h>

#ifdef PCH
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#include <string.h>         // memset()

#define _SVSTDARR_SHORTS
#define _SVSTDARR_USHORTS
#define _SVSTDARR_USHORTSSORT
#define _SVSTDARR_SVSTRINGS
#include <svtools/svstdarr.hxx>

#ifndef _RTL_TENCINFO_H
#include <rtl/tencinfo.h>
#endif

#ifdef DUMP

#define ERR_SWG_READ_ERROR 1234
#include <assert.h>
#define ASSERT( a, b )

#else                                   // dump

#ifndef _SWSWERROR_H
#include <swerror.h>        // ERR_WW6_...
#endif
#ifndef _ERRHDL_HXX
#include <errhdl.hxx>           // ASSERT()
#endif
#ifndef _SWTYPES_HXX
#include <swtypes.hxx>      // DELETEZ
#endif

#endif                                  // dump

#ifndef _DEBUG_HXX //autogen
#include <tools/debug.hxx>
#endif
#ifndef _APP_HXX //autogen
#include <vcl/svapp.hxx>
#endif

#ifndef _WW8SCAN_HXX
#include <ww8scan.hxx>
#endif




#ifdef __WW8_NEEDS_PACK
#    pragma pack(2)
#endif
struct WW8_PCD1
{
    INT16 fNoParaLast;  // when 1, means that piece contains no end of paragraph marks.
    INT32 fc;           // file offset of beginning of piece. The size of the
    INT16 prm;          // PRM contains either a single sprm or else an index number
};
#ifdef __WW8_NEEDS_PACK
#    pragma pack()
#  endif




USHORT WW8GetSprmId( BYTE nVersion, BYTE* pSp, BYTE* pDelta );



WW8SprmIter::WW8SprmIter(BYTE* pSprms_,     short nLen_,       BYTE nVersion_ )
                    :  pSprms( pSprms_), nRemLen( nLen_), nVersion( nVersion_),
                       nDelta( ( 8 > nVersion ) ? 0 : 1 )
{
    UpdateMyMembers();
}

void WW8SprmIter::SetSprms(BYTE* pSprms_, short nLen_)
{
    pSprms  = pSprms_;
    nRemLen = nLen_;
    UpdateMyMembers();
}

BYTE* WW8SprmIter::operator ++( int )
{
    if( 0 < nRemLen )
    {
        pSprms  += nAktSizeBrutto;
        nRemLen -= nAktSizeBrutto;
        UpdateMyMembers();
    }
    return pSprms;
}

void WW8SprmIter::UpdateMyMembers()
{
    if( pSprms && (0 < nRemLen) )
    {
        nAktId         = WW8GetSprmId( nVersion, pSprms );
        pAktParams     = pSprms + 1 + nDelta + WW8SprmDataOfs( nAktId );
        nAktSizeBrutto = WW8GetSprmSizeBrutto( nVersion, pSprms, &nAktId );
    }
    else
    {
        nAktId         = 0;
        pAktParams     = 0;
        nAktSizeBrutto = 0;
        nRemLen        = 0;
    }
}



//-----------------------------------------
//      temporaerer Test
//-----------------------------------------
// WW8PLCFx_PCDAttrs halten sich an WW8PLCF_Pcd fest und besitzen deshalb keine
// eigenen Iteratoren. Alle sich auf Iteratoren beziehenden Methoden
// sind deshalb Dummies.

WW8PLCFx_PCDAttrs::WW8PLCFx_PCDAttrs( BYTE nVersion, WW8PLCFx_PCD* pPLCFx_PCD, WW8ScannerBase* pBase )
: WW8PLCFx( nVersion, TRUE ),
  pPcd( pPLCFx_PCD ),
  pGrpprls( pBase->pPieceGrpprls ),
  nGrpprls( pBase->nPieceGrpprls ),
  pPcdI( pPLCFx_PCD->GetPLCFIter() )
{
}

WW8PLCFx_PCDAttrs::~WW8PLCFx_PCDAttrs()
{
}

ULONG WW8PLCFx_PCDAttrs::GetIdx() const
{
    return 0;
}

void WW8PLCFx_PCDAttrs::SetIdx( ULONG )
{
}

BOOL WW8PLCFx_PCDAttrs::SeekPos( WW8_CP n )
{
    return TRUE;
}

WW8PLCFx& WW8PLCFx_PCDAttrs::operator ++( int )
{
    return *this;
}

WW8_CP WW8PLCFx_PCDAttrs::Where()
{
    return ( pPcd ) ? pPcd->Where() : LONG_MAX;
}

void WW8PLCFx_PCDAttrs::GetSprms( WW8PLCFxDesc* p )
{
    void* pData;

    p->bRealLineEnd = FALSE;
    if(     !pPcdI
         || !pPcdI->Get( p->nStartPos, p->nEndPos, pData ))
    {
        p->nStartPos = p->nEndPos = LONG_MAX;       // PLCF fertig abgearbeitet
        p->pMemPos = 0;
        return;
    }
    UINT16 nPrm = SVBT16ToShort( ( (WW8_PCD*)pData )->prm );

    if ( nPrm & 1 )
    {   // PRM Variante 2
        UINT16 nSprmIdx = nPrm >> 1;

        if( nSprmIdx >= nGrpprls ){
            p->nStartPos = p->nEndPos = LONG_MAX;       // Bloedsinniger Index
            p->pMemPos = 0;
            return;
        }
        BYTE* pSprms = pGrpprls[ nSprmIdx ];

        p->nSprmsLen = SVBT16ToShort( pSprms ); // Laenge
        pSprms += 2;
        p->pMemPos = pSprms;                    // Position
    }
    else
    {   // PRM Variante 1:  Sprm wird direkt in Member-Var abgelegt
        /*
            Dies sind die Attr, die in der Piece-Table stehen, statt im Text !
        */

        if(8 > GetVersion())
        {
            aShortSprm[0] = (BYTE)( ( nPrm & 0xfe) >> 1 );
            aShortSprm[1] = (BYTE)(   nPrm         >> 8 );
            p->nSprmsLen = ( nPrm ) ? 2 : 0;        // Laenge

            // store Postion of internal mini storage in Data Pointer
            p->pMemPos = aShortSprm;
        }
        else
        {
            p->pMemPos = 0;
            BYTE nSprmListIdx = (BYTE)((nPrm & 0xfe) >> 1);
            if( nSprmListIdx )
            {
                // process Sprm Id Matching as explained in MS Doku
                //
                // ''Property Modifier(variant 1) (PRM)''
                // see file: s62f39.htm
                //
                // Since isprm is 7 bits, rgsprmPrm can hold 0x80 entries.
                static USHORT __READONLY_DATA aSprmId[0x80] = {
                         0,     0,     0,     0,// sprmNoop, sprmNoop, sprmNoop, sprmNoop
                    0x2402,0x2403,0x2404,0x2405,// sprmPIncLvl, sprmPJc, sprmPFSideBySide, sprmPFKeep
                    0x2406,0x2407,0x2408,0x2409,// sprmPFKeepFollow, sprmPFPageBreakBefore, sprmPBrcl, sprmPBrcp
                    0x260A,     0,0x240C,     0,// sprmPIlvl, sprmNoop, sprmPFNoLineNumb, sprmNoop
                         0,     0,     0,     0,// sprmNoop, sprmNoop, sprmNoop, sprmNoop
                         0,     0,     0,     0,// sprmNoop, sprmNoop, sprmNoop, sprmNoop
                    0x2416,0x2417,     0,     0,// sprmPFInTable, sprmPFTtp, sprmNoop, sprmNoop
                         0,0x261B,     0,     0,// sprmNoop, sprmPPc,  sprmNoop, sprmNoop
                         0,     0,     0,     0,// sprmNoop, sprmNoop, sprmNoop, sprmNoop
                         0,0x2423,     0,     0,// sprmNoop, sprmPWr,  sprmNoop, sprmNoop
                         0,     0,     0,     0,// sprmNoop, sprmNoop, sprmNoop, sprmNoop
                    0x242A,     0,     0,     0,// sprmPFNoAutoHyph, sprmNoop, sprmNoop, sprmNoop
                         0,     0,0x2430,0x2431,// sprmNoop, sprmNoop, sprmPFLocked, sprmPFWidowControl
                         0,0x2433,0x2434,0x2435,// sprmNoop, sprmPFKinsoku, sprmPFWordWrap, sprmPFOverflowPunct
                    0x2436,0x2437,0x2438,     0,// sprmPFTopLinePunct, sprmPFAutoSpaceDE, sprmPFAutoSpaceDN, sprmNoop
                         0,0x243B,     0,     0,// sprmNoop, sprmPISnapBaseLine, sprmNoop, sprmNoop
                         0,0x0800,0x0801,0x0802,// sprmNoop, sprmCFStrikeRM, sprmCFRMark, sprmCFFldVanish
                         0,     0,     0,0x0806,// sprmNoop, sprmNoop, sprmNoop, sprmCFData
                         0,     0,     0,0x080A,// sprmNoop, sprmNoop, sprmNoop, sprmCFOle2
                         0,0x2A0C,0x0858,0x2859,// sprmNoop, sprmCHighlight, sprmCFEmboss, sprmCSfxText
                         0,     0,     0,0x2A33,// sprmNoop, sprmNoop, sprmNoop, sprmCPlain
                         0,0x0835,0x0836,0x0837,// sprmNoop, sprmCFBold, sprmCFItalic, sprmCFStrike
                    0x0838,0x0839,0x083a,0x083b,// sprmCFOutline, sprmCFShadow, sprmCFSmallCaps, sprmCFCaps,
                    0x083C,     0,0x2A3E,     0,// sprmCFVanish, sprmNoop, sprmCKul, sprmNoop,
                         0,     0,0x2A42,     0,// sprmNoop, sprmNoop, sprmCIco, sprmNoop,
                    0x2A44,     0,0x2A46,     0,// sprmCHpsInc, sprmNoop, sprmCHpsPosAdj, sprmNoop,
                    0x2A48,     0,     0,     0,// sprmCIss, sprmNoop, sprmNoop, sprmNoop,
                         0,     0,     0,     0,// sprmNoop, sprmNoop, sprmNoop, sprmNoop,
                         0,     0,     0,0x2A53,// sprmNoop, sprmNoop, sprmNoop, sprmCFDStrike,
                    0x0854,0x0855,0x0856,0x2E00,// sprmCFImprint, sprmCFSpec, sprmCFObj, sprmPicBrcl,
                    0x2640,     0,     0,     0,// sprmPOutLvl, sprmNoop, sprmNoop, sprmNoop,
                         0,     0,     0,     0 // sprmNoop, sprmNoop, sprmPPnbrRMarkNot
                };                              //                     ^^^^^^^^^^^^^^^^^ unknown name!

                // find real Sprm Id:
                USHORT nSprmId = aSprmId[ nSprmListIdx ];

                if( nSprmId )
                {
                    // move Sprm Id and Sprm Param to internal mini storage:
                    aShortSprm[0] = (BYTE)( ( nSprmId & 0x00ff)      );
                    aShortSprm[1] = (BYTE)( ( nSprmId & 0xff00) >> 8 );
                    aShortSprm[2] = (BYTE)( nPrm >> 8 );

                    // store Sprm Length in member:
                    p->nSprmsLen = ( nPrm ) ? 3 : 0;

                    // store Postion of internal mini storage in Data Pointer
                    p->pMemPos = aShortSprm;
                }
            }
        }
    }
}

//------------------------------------------------------------------------

WW8PLCFx_PCD::WW8PLCFx_PCD( BYTE nVersion, WW8PLCFpcd* pPLCFpcd,
                            WW8_CP nStartCp, BOOL bVer67P )
    : WW8PLCFx( nVersion, FALSE )
{
    pPcdI = new WW8PLCFpcd_Iter( *pPLCFpcd, nStartCp ); // eigenen Iterator konstruieren
    bVer67= bVer67P;
}

WW8PLCFx_PCD::~WW8PLCFx_PCD()
{                                   // pPcd-Dtor wird in WW8ScannerBase gerufen
    delete( pPcdI );
}

ULONG WW8PLCFx_PCD::GetIMax() const
{
    return ( pPcdI ) ? pPcdI->GetIMax() : 0;
}

ULONG WW8PLCFx_PCD::GetIdx() const
{
    return ( pPcdI ) ? pPcdI->GetIdx() : 0;
}

void WW8PLCFx_PCD::SetIdx( ULONG nIdx )
{
    if( pPcdI )
        pPcdI->SetIdx( nIdx );
}

BOOL WW8PLCFx_PCD::SeekPos( WW8_CP nCpPos )
{
    return ( pPcdI ) ? pPcdI->SeekPos( nCpPos ) : FALSE;
}

WW8_CP WW8PLCFx_PCD::Where()
{
    return ( pPcdI ) ? pPcdI->Where() : LONG_MAX;
}

long WW8PLCFx_PCD::GetNoSprms( long& rStart, long& rEnd, long& rLen )
{
    void* pData;
    rLen = 0;

    if(     !pPcdI
         || !pPcdI->Get( rStart, rEnd, pData ) )
    {
        rStart = rEnd = LONG_MAX;
        return -1;
    }
    return pPcdI->GetIdx();
}

WW8PLCFx& WW8PLCFx_PCD::operator ++( int )
{
    if( !pPcdI ){
        ASSERT( !this, "pPcdI fehlt");
    }else{
        (*pPcdI)++;
    }
    return *this;
}

WW8_FC WW8PLCFx_PCD::AktPieceStartCp2Fc( WW8_CP nCp )
{
    WW8_CP nCpStart, nCpEnd;
    void* pData;

    if ( !pPcdI->Get( nCpStart, nCpEnd, pData ) ){
        ASSERT( !this, "AktPieceStartCp2Fc() mit falschem Cp gerufen (1)" );
        return LONG_MAX;
    }

    ASSERT( nCp >= nCpStart && nCp < nCpEnd,
            "AktPieceCp2Fc() mit falschem Cp gerufen (2)" );

    if( nCp < nCpStart )
        nCp = nCpStart;
    if( nCp >= nCpEnd )
        nCp = nCpEnd - 1;

    BOOL bIsUnicode = FALSE;
    WW8_FC nFC = SVBT32ToLong( ((WW8_PCD*)pData)->fc );
    if( !bVer67 )
        nFC = WW8PLCFx_PCD::TransformPieceAddress( nFC, bIsUnicode );

    return nFC + (nCp - nCpStart) * (bIsUnicode ? 2 : 1);
}


eCutT WW8PLCFx_PCD::AktPieceFc2Cp( long& rStartPos, long& rEndPos )
{
    WW8_CP nCpStart, nCpEnd;
    void* pData;
    eCutT eRet = CUT_NONE;

    if ( !pPcdI->Get( nCpStart, nCpEnd, pData ) ){
        ASSERT( !this, "AktPieceFc2Cp() - Fehler" );
        rStartPos = rEndPos = LONG_MAX;
        return CUT_BOTH;
    }

    BOOL bIsUnicode = FALSE;
    INT32 nFcStart  = SVBT32ToLong( ((WW8_PCD*)pData)->fc );
    if( !bVer67 )
        nFcStart = WW8PLCFx_PCD::TransformPieceAddress( nFcStart, bIsUnicode );

    INT32 nUnicodeFactor = bIsUnicode ? 2 : 1;

    if( rStartPos < nFcStart )
    {
        rStartPos = nFcStart;
        eRet = (eCutT)( eRet | CUT_START );
    }
    if( rStartPos >= nFcStart + (nCpEnd - nCpStart)  * nUnicodeFactor )
    {
        rStartPos = nFcStart + (nCpEnd - nCpStart - 1) * nUnicodeFactor;
        eRet = (eCutT)( eRet | CUT_START );
    }
    // jetzt CP berechnen
    rStartPos = nCpStart + (rStartPos - nFcStart) / nUnicodeFactor;


    if( rEndPos < nFcStart )
    {
        rEndPos = nFcStart;
        eRet = (eCutT)( eRet | CUT_END );
    }
    if( rEndPos > nFcStart + (nCpEnd - nCpStart) * nUnicodeFactor )
    {
        rEndPos = nFcStart + (nCpEnd - nCpStart) * nUnicodeFactor;
        eRet = (eCutT)( eRet | CUT_END );
    }
    // jetzt CP berechnen
    rEndPos = nCpStart + (rEndPos - nFcStart) / nUnicodeFactor;
#ifdef DEBUG
    if (0 > rStartPos)
    {
        BOOL i = 5;
    }
    ASSERT( (0 <= rStartPos), "AktPieceFc2Cp() - rStartPos kleiner Null!" );
#endif
    return eRet;
}

WW8_CP WW8PLCFx_PCD::AktPieceStartFc2Cp( WW8_FC nStartPos )
{
    WW8_CP nCpStart, nCpEnd;
    void* pData;
/*
    if( nStartPos == LONG_MAX )
        return LONG_MAX;
*/
    if ( !pPcdI->Get( nCpStart, nCpEnd, pData ) )
    {
         ASSERT( !this, "AktPieceStartFc2Cp() - Fehler" );
        return LONG_MAX;
    }
    BOOL bIsUnicode = FALSE;
    INT32 nFcStart  = SVBT32ToLong( ((WW8_PCD*)pData)->fc );
    if( !bVer67 )
        nFcStart = WW8PLCFx_PCD::TransformPieceAddress( nFcStart, bIsUnicode );


    INT32 nUnicodeFactor = bIsUnicode ? 2 : 1;

    if( nStartPos < nFcStart )
        nStartPos = nFcStart;

    if( nStartPos >= nFcStart + (nCpEnd - nCpStart)     * nUnicodeFactor )
        nStartPos  = nFcStart + (nCpEnd - nCpStart - 1) * nUnicodeFactor;

    return nCpStart + (nStartPos - nFcStart) / nUnicodeFactor;
}



//-----------------------------------------
//      Hilfsroutinen fuer alle
//-----------------------------------------

DateTime WW8ScannerBase::WW8DTTM2DateTime(long lDTTM)
{
/*
mint    short   :6  0000003F    minutes (0-59)
hr      short   :5  000007C0    hours (0-23)
dom     short   :5  0000F800    days of month (1-31)
mon     short   :4  000F0000    months (1-12)
yr      short   :9  1FF00000    years (1900-2411)-1900
wdy     short   :3  E0000000    weekday(Sunday=0
                                        Monday=1
( wdy can be ignored )                  Tuesday=2
                                        Wednesday=3
                                        Thursday=4
                                        Friday=5
                                        Saturday=6)
*/
    DateTime aDateTime(Date( 0 ), Time( 0 ));
    if( lDTTM )
    {
        USHORT lMin =(USHORT)(lDTTM & 0x0000003F);
        lDTTM >>= 6;
        USHORT lHour=(USHORT)(lDTTM & 0x0000001F);
        lDTTM >>= 5;
        USHORT lDay =(USHORT)(lDTTM & 0x0000001F);
        lDTTM >>= 5;
        USHORT lMon =(USHORT)(lDTTM & 0x0000000F);
        lDTTM >>= 4;
        USHORT lYear=(USHORT)(lDTTM & 0x000001FF) + 1900;
        aDateTime = DateTime(Date(lDay, lMon, lYear), Time(lHour, lMin));
    }
    return aDateTime;
}

WW8_CP WW8ScannerBase::WW8Fc2Cp( WW8_FC nFcPos ) const
{
    if( nFcPos == LONG_MAX )
        return LONG_MAX;

    if( pPieceIter )
    {                               // Complex File ?
        ULONG nOldPos = pPieceIter->GetIdx();
        pPieceIter->SetIdx( 0 );
        while( 1 )
        {
            long nCpStart, nCpEnd;
            void* pData;
            if( !pPieceIter->Get( nCpStart, nCpEnd, pData ) )
            {   // ausserhalb PLCFfpcd ?
                ASSERT( !this, "PLCFpcd-WW8Fc2Cp() ging schief" );
                break;
//              pPieceIter->SetIdx( nOldPos );
//              return 0;
            }
            BOOL bIsUnicode = FALSE;
            INT32 nFcStart  = SVBT32ToLong( ((WW8_PCD*)pData)->fc );
            if( 8 <= pWw8Fib->nVersion )
                nFcStart = WW8PLCFx_PCD::TransformPieceAddress( nFcStart,
                                                                bIsUnicode );

            INT32 nLen = (nCpEnd - nCpStart) * (bIsUnicode ? 2 : 1);

            if( nFcPos >= nFcStart && nFcPos < nFcStart + nLen )
            {   // gefunden
                pPieceIter->SetIdx( nOldPos );

                return nCpStart + ((nFcPos - nFcStart) / (bIsUnicode ? 2 : 1));
            }
            (*pPieceIter)++;
        }
        pPieceIter->SetIdx( nOldPos );      // nicht gefunden
        return LONG_MAX;
    }
    // No complex file
    return nFcPos - pWw8Fib->fcMin;
}

WW8_FC WW8ScannerBase::WW8Cp2Fc( WW8_CP nCpPos, BOOL* pIsUnicode,
                                WW8_CP* pNextPieceCp, BOOL* pTestFlag ) const
{
    if( pTestFlag )
        *pTestFlag = TRUE;
    if( LONG_MAX == nCpPos )
        return LONG_MAX;

    if( pPieceIter )
    {   // Complex File
        if( pNextPieceCp )
            *pNextPieceCp = LONG_MAX;

        if( !pPieceIter->SeekPos( nCpPos ) )
        {
            if( pTestFlag )
                *pTestFlag = FALSE;
            else
                ASSERT( !this, "Falscher CP an WW8Cp2Fc() uebergeben" );
            return LONG_MAX;
        }
        long nCpStart, nCpEnd;
        void* pData;
        if( !pPieceIter->Get( nCpStart, nCpEnd, pData ) )
        {
            if( pTestFlag )
                *pTestFlag = FALSE;
            else
                ASSERT( !this, "PLCFfpcd-Get ging schief" );
            return LONG_MAX;
        }
        if( pNextPieceCp )
            *pNextPieceCp = nCpEnd;
        BOOL bIsUnicode;
        if( !pIsUnicode )
            pIsUnicode = &bIsUnicode;

        WW8_FC nRet = SVBT32ToLong( ((WW8_PCD*)pData)->fc );
        if( 8 > pWw8Fib->nVersion )
            *pIsUnicode = FALSE;
        else
            nRet = WW8PLCFx_PCD::TransformPieceAddress( nRet, *pIsUnicode );


        nRet += (nCpPos - nCpStart) * (*pIsUnicode ? 2 : 1);

        return nRet;
    }

    // No complex file
    if( pIsUnicode )
        *pIsUnicode = FALSE;
    return nCpPos + pWw8Fib->fcMin;
}

//-----------------------------------------
//      class WW8ScannerBase
//-----------------------------------------

WW8PLCFpcd* WW8ScannerBase::OpenPieceTable( SvStream* pStr, WW8Fib* pWwF )
{
    if(    (    (8 > pWw8Fib->nVersion)
             && !pWwF->fComplex
           )
        || !pWwF->lcbClx ) return 0;

    WW8_FC nClxPos = pWwF->fcClx;
    INT32 nClxLen = pWwF->lcbClx;
    register INT32 nLeft = nClxLen;
    INT16 nGrpprl = 0;
    BYTE clxt;

    pStr->Seek( nClxPos );
    while( 1 ){                                 // Zaehle Zahl der Grpprls
        *pStr >> clxt;
        nLeft--;
        if( 2 == clxt )                         // PLCFfpcd ?
            break;                              // PLCFfpcd gefunden
        if( 1 == clxt )                         // clxtGrpprl ?
            nGrpprl++;
        UINT16 nLen;
        *pStr >> nLen;
        nLeft -= 2 + nLen;
        if( nLeft < 0 )
            return 0;                           // schiefgegangen
        pStr->SeekRel( nLen );                  // ueberlies grpprl
    }
    pStr->Seek( nClxPos );
    nLeft = nClxLen;
    pPieceGrpprls = new BYTE*[nGrpprl + 1];
    memset( pPieceGrpprls, 0, ( nGrpprl + 1 ) * 4 );
    nPieceGrpprls = nGrpprl;
    INT16 nAktGrpprl = 0;                       // lies Grpprls ein
    while( 1 )
    {
        *pStr >> clxt;
        nLeft--;
        if( 2 == clxt)                          // PLCFfpcd ?
            break;                              // PLCFfpcd gefunden
        UINT16 nLen;
        *pStr >> nLen;
        nLeft -= 2 + nLen;
        if( nLeft < 0 )
            return 0;                           // schiefgegangen
        if( 1 == clxt )                         // clxtGrpprl ?
        {
            BYTE* p = new BYTE[nLen+2];         // alloziere
            memcpy( p, &nLen, 2 );              // trage Laenge ein
            pStr->Read( p+2, nLen );            // lies grpprl
            pPieceGrpprls[nAktGrpprl++] = p;    // trage in Array ein
        }
        else
            pStr->SeekRel( nLen );              // ueberlies nicht-Grpprl
    }
    // lies Piece Table PLCF ein
    INT32 nPLCFfLen;
    *pStr >> nPLCFfLen;
    ASSERT( 65536 > nPLCFfLen, "PLCFfpcd ueber 64 k" );
    return new WW8PLCFpcd( pStr, pStr->Tell(), nPLCFfLen, 8 );
}

void WW8ScannerBase::DeletePieceTable()
{
    if( pPieceGrpprls )
    {
        for( BYTE** p = pPieceGrpprls; *p; p++ )
            delete[]( *p );
        delete[]( pPieceGrpprls );
        pPieceGrpprls = 0;
    }
}

WW8ScannerBase::WW8ScannerBase( SvStream* pSt, SvStream* pTblSt, SvStream* pDataSt,
                                WW8Fib* pWwFib )
    : pWw8Fib( pWwFib ), pPieceGrpprls( 0 ),
    pMainFdoa( 0 ), pHdFtFdoa( 0 ),
    pMainTxbx( 0 ), pMainTxbxBkd( 0 ), pHdFtTxbx( 0 ), pHdFtTxbxBkd( 0 ),
    nNoAttrScan( 0 )
{
    pPiecePLCF = OpenPieceTable( pTblSt, pWw8Fib );             // Complex
    if( pPiecePLCF )
    {
        pPieceIter      = new WW8PLCFpcd_Iter( *pPiecePLCF );
        pPLCFx_PCD      = new WW8PLCFx_PCD( pWwFib->nVersion, pPiecePLCF, 0,
                                            8 > pWw8Fib->nVersion );
        pPLCFx_PCDAttrs = new WW8PLCFx_PCDAttrs( pWwFib->nVersion, pPLCFx_PCD, this);
    }
    else
    {
        pPieceIter      = 0;
        pPLCFx_PCD      = 0;
        pPLCFx_PCDAttrs = 0;
    }

    // pChpPLCF and pPapPLCF may NOT be created before pPLCFx_PCD !!
    pChpPLCF = new WW8PLCFx_Cp_FKP( pSt, pTblSt, pDataSt, *this, CHP ); // CHPX
    pPapPLCF = new WW8PLCFx_Cp_FKP( pSt, pTblSt, pDataSt, *this, PAP ); // PAPX

    pSepPLCF = new WW8PLCFx_SEPX(   pSt, pTblSt, *pWwFib, 0 );          // SEPX

    // Footnotes
    pFtnPLCF = new WW8PLCFx_SubDoc( pTblSt, pWwFib->nVersion, 0,
                                pWwFib->fcPlcffndRef, pWwFib->lcbPlcffndRef,
                                pWwFib->fcPlcffndTxt, pWwFib->lcbPlcffndTxt,
                                2 );
    // Endnotes
    pEdnPLCF = new WW8PLCFx_SubDoc( pTblSt, pWwFib->nVersion, 0,
                                pWwFib->fcPlcfendRef, pWwFib->lcbPlcfendRef,
                                pWwFib->fcPlcfendTxt, pWwFib->lcbPlcfendTxt,
                                2 );
    // Anmerkungen
    pAndPLCF = new WW8PLCFx_SubDoc( pTblSt, pWwFib->nVersion, 0,
                                pWwFib->fcPlcfandRef, pWwFib->lcbPlcfandRef,
                                pWwFib->fcPlcfandTxt, pWwFib->lcbPlcfandTxt,
                                (8 > pWwFib->nVersion) ? 20 : 30 );

    // Fields Main Text
    pFldPLCF    = new WW8PLCFx_FLD( pTblSt, *pWwFib, MAN_MAINTEXT, 0 );
    // Fields Header / Footer
    pFldHdFtPLCF= new WW8PLCFx_FLD( pTblSt, *pWwFib, MAN_HDFT,     0 );
    // Fields Footnote
    pFldFtnPLCF = new WW8PLCFx_FLD( pTblSt, *pWwFib, MAN_FTN,      0 );
    // Fields Endnote
    pFldEdnPLCF = new WW8PLCFx_FLD( pTblSt, *pWwFib, MAN_EDN,      0 );
    // Fields Anmerkungen
    pFldAndPLCF = new WW8PLCFx_FLD( pTblSt, *pWwFib, MAN_AND,      0 );
    // Fields in Textboxes in Main Text
    pFldTxbxPLCF= new WW8PLCFx_FLD( pTblSt, *pWwFib, MAN_TXBX,     0 );
    // Fields in Textboxes in Header / Footer
    pFldTxbxHdFtPLCF=new WW8PLCFx_FLD(pTblSt,*pWwFib,MAN_TXBX_HDFT,0 );

    switch( pWw8Fib->nVersion ) // beachte: 6 steht fuer "6 ODER 7",  7 steht fuer "NUR 7"
    {
    case 6:
    case 7: if( pWwFib->fcPlcfdoaMom && pWwFib->lcbPlcfdoaMom )
                        pMainFdoa = new WW8PLCFspecial( pTblSt, pWwFib->fcPlcfdoaMom,
                                                pWwFib->lcbPlcfdoaMom, 6 );
                    if( pWwFib->fcPlcfdoaHdr && pWwFib->lcbPlcfdoaHdr )
                        pHdFtFdoa = new WW8PLCFspecial( pTblSt, pWwFib->fcPlcfdoaHdr,
                                                pWwFib->lcbPlcfdoaHdr, 6 );
                    break;
    case 8:
        if( pWwFib->fcPlcfspaMom && pWwFib->lcbPlcfspaMom )
            pMainFdoa = new WW8PLCFspecial( pTblSt, pWwFib->fcPlcfspaMom,
                                                    pWwFib->lcbPlcfspaMom, 26 );
        if( pWwFib->fcPlcfspaHdr && pWwFib->lcbPlcfspaHdr )
            pHdFtFdoa = new WW8PLCFspecial( pTblSt, pWwFib->fcPlcfspaHdr,
                                                    pWwFib->lcbPlcfspaHdr, 26 );
        // PLCF fuer TextBox-Break-Deskriptoren im Maintext
        if( pWwFib->fcPlcftxbxBkd && pWwFib->lcbPlcftxbxBkd )
            pMainTxbxBkd = new WW8PLCFspecial( pTblSt,
                                                pWwFib->fcPlcftxbxBkd,
                                                pWwFib->lcbPlcftxbxBkd, 0);
        // PLCF fuer TextBox-Break-Deskriptoren im Header-/Footer-Bereich
        if( pWwFib->fcPlcfHdrtxbxBkd && pWwFib->lcbPlcfHdrtxbxBkd )
            pHdFtTxbxBkd = new WW8PLCFspecial( pTblSt,
                                                pWwFib->fcPlcfHdrtxbxBkd,
                                                pWwFib->lcbPlcfHdrtxbxBkd, 0);
        break;


    default:ASSERT( !this, "Es wurde vergessen, nVersion zu kodieren!" );
    }

    // PLCF fuer TextBox-Stories im Maintext
    long nLenTxBxS = (8 > pWw8Fib->nVersion) ? 0 : 22;
    if( pWwFib->fcPlcftxbxTxt && pWwFib->lcbPlcftxbxTxt )
        pMainTxbx = new WW8PLCFspecial( pTblSt, pWwFib->fcPlcftxbxTxt,
                              pWwFib->lcbPlcftxbxTxt, nLenTxBxS );

    // PLCF fuer TextBox-Stories im Header-/Footer-Bereich
    if( pWwFib->fcPlcfHdrtxbxTxt && pWwFib->lcbPlcfHdrtxbxTxt )
        pHdFtTxbx = new WW8PLCFspecial( pTblSt, pWwFib->fcPlcfHdrtxbxTxt,
                              pWwFib->lcbPlcfHdrtxbxTxt, nLenTxBxS );

    pBook = new WW8PLCFx_Book( pSt, pTblSt, *pWwFib, 0 );
}

WW8ScannerBase::~WW8ScannerBase()
{
    DeletePieceTable();
    delete pPLCFx_PCDAttrs;
    delete pPLCFx_PCD;
    delete pPieceIter;
    delete pPiecePLCF;
    delete pBook;
    delete pFldEdnPLCF;
    delete pFldFtnPLCF;
    delete pFldAndPLCF;
    delete pFldHdFtPLCF;
    delete pFldPLCF;
    delete pFldTxbxPLCF;
    delete pFldTxbxHdFtPLCF;
    delete pEdnPLCF;
    delete pFtnPLCF;
    delete pAndPLCF;
    delete pSepPLCF;
    delete pPapPLCF;
    delete pChpPLCF;
    // vergessene Schaeflein
    delete pMainFdoa;
    delete pHdFtFdoa;
    delete pMainTxbx;
    delete pMainTxbxBkd;
    delete pHdFtTxbx;
    delete pHdFtTxbxBkd;
}

//-----------------------------------------
//      Stack fuer shorts
//-----------------------------------------

class UShortStk: private SvShorts
{
public:
    UShortStk():SvShorts( 10, 10 ) {}
    ~UShortStk() {}
    void Push( USHORT s ) { Insert( (USHORT)s, SvShorts::Count() ); }
    inline USHORT Top();
    inline USHORT Pop();
    USHORT Count() { return SvShorts::Count(); }
};

inline USHORT UShortStk::Top()
{
    USHORT nPos = SvShorts::Count() - 1;
    USHORT s = (*this)[ nPos ];
    return s;
}

inline USHORT UShortStk::Pop()
{
    USHORT nPos = SvShorts::Count() - 1;
    USHORT s = (*this)[ nPos ];
    Remove( nPos );
    return s;
}


//-----------------------------------------
//          Fields
//-----------------------------------------

static BOOL WW8SkipField( WW8PLCFspecial& rPLCF )
{
    void* pData;
    long nP;

    if( !rPLCF.Get( nP, pData ) )                   // Ende des PLCFspecial ?
        return FALSE;

    rPLCF++;

    if((((BYTE*)pData)[0] & 0x1f ) != 0x13 )        // Kein Anfang ?
        return TRUE;                                // Bei Fehler nicht abbrechen

    if( !rPLCF.Get( nP, pData ) )
        return FALSE;


    while((((BYTE*)pData)[0] & 0x1f ) == 0x13 ){    // immer noch neue (nested) Anfaenge ?
        WW8SkipField( rPLCF );                      // nested Field im Beschreibungsteil
        if( !rPLCF.Get( nP, pData ) )
            return FALSE;
    }

    if((((BYTE*)pData)[0] & 0x1f ) == 0x14 ){       // Field Separator ?
        rPLCF++;

        if( !rPLCF.Get( nP, pData ) )
            return FALSE;

        while((((BYTE*)pData)[0] & 0x1f ) == 0x13 ){// immer noch neue (nested) Anfaenge ?
            WW8SkipField( rPLCF );                  // nested Field im Resultatteil
            if( !rPLCF.Get( nP, pData ) )
                return FALSE;
        }
    }
    rPLCF++;

    return TRUE;
}

BOOL WW8GetFieldPara( BYTE nVersion, WW8PLCFspecial& rPLCF, WW8FieldDesc& rF )
{
    void* pData;
    ULONG nOldIdx = rPLCF.GetIdx();

    rF.nLen = rF.nId = rF.nOpt = rF.bCodeNest = rF.bResNest = 0;

    if( !rPLCF.Get( rF.nSCode, pData ) )             // Ende des PLCFspecial ?
        goto Err;

    rPLCF++;

    if((((BYTE*)pData)[0] & 0x1f ) != 0x13 )        // Kein Anfang ?
        goto Err;

    rF.nId = ((BYTE*)pData)[1];

    if( !rPLCF.Get( rF.nLCode, pData ) )
        goto Err;

    rF.nSRes = rF.nLCode;                           // Default
    rF.nSCode++;                                    // ohne Marken
    rF.nLCode -= rF.nSCode;                         // Pos zu Laenge

    while((((BYTE*)pData)[0] & 0x1f ) == 0x13 ){    // immer noch neue (nested) Anfaenge ?
        WW8SkipField( rPLCF );                      // nested Field im Beschreibungsteil
        rF.bCodeNest = TRUE;
        if( !rPLCF.Get( rF.nSRes, pData ) )
            goto Err;
    }

    if((((BYTE*)pData)[0] & 0x1f ) == 0x14 ){       // Field Separator ?
        rPLCF++;

        if( !rPLCF.Get( rF.nLRes, pData ) )
            goto Err;

        while((((BYTE*)pData)[0] & 0x1f ) == 0x13 ){// immer noch neue (nested) Anfaenge ?
            WW8SkipField( rPLCF );                  // nested Field im Resultatteil
            rF.bResNest = TRUE;
            if( !rPLCF.Get( rF.nLRes, pData ) )
                goto Err;
        }
        rF.nLen = rF.nLRes - rF.nSCode + 2;         // nLRes ist noch die Endposition
        rF.nLRes -= rF.nSRes;                       // nun: nLRes = Laenge
        rF.nSRes++;                                 // Endpos encl. Marken
        rF.nLRes--;

    }else{
        rF.nLRes = 0;                               // Kein Result vorhanden
        rF.nLen = rF.nSRes - rF.nSCode + 2;         // Gesamtlaenge
    }

    rPLCF++;
    if((((BYTE*)pData)[0] & 0x1f ) == 0x15 ){       // Field Ende ?
                                                    // INDEX-Fld hat Bit7 gesetzt!?!
        rF.nOpt = ((BYTE*)pData)[1];                // Ja -> Flags uebernehmen
    }else{
        rF.nId = 0;                                 // Nein -> Feld ungueltig
    }

    rPLCF.SetIdx( nOldIdx );
    return TRUE;
Err:
    rPLCF.SetIdx( nOldIdx );
    return FALSE;
}


//-----------------------------------------


// WW8ReadPString liest einen Pascal-String ein und gibt ihn zurueck. Der Pascal-
// String hat am Ende ein \0, der aber im Laengenbyte nicht mitgezaehlt wird.
// Der Speicher fuer den Pascalstring wird alloziert.
String WW8ReadPString( SvStream& rStrm, rtl_TextEncoding eEnc, BOOL bAtEndSeekRel1 )
{
    UINT8 b;
    rStrm >> b;

    ByteString aByteStr;    // Alloc methode automatically sets Zero at the end
    sal_Char*  pByteData = aByteStr.AllocBuffer( b );

    sal_Size nWasRead = rStrm.Read( pByteData, b );
    if( bAtEndSeekRel1 )
        rStrm.SeekRel( 1 ); // ueberspringe das Null-Byte am Ende.

    if( nWasRead != b )
        aByteStr.ReleaseBufferAccess( nWasRead );

    return String( aByteStr, eEnc );
}


String WW8Read_xstz( SvStream& rStrm, USHORT nChars, BOOL bAtEndSeekRel1 )
{
    UINT16 b;

    if( nChars )
        b = nChars;
    else
        rStrm >> b;

    String aStr;           // Alloc methode automatically sets Zero at the end
    sal_Unicode* pData = aStr.AllocBuffer( b );

    sal_Size nWasRead = rStrm.Read( (sal_Char*)pData, b * 2 );
    if( nWasRead != b*2 )
        aStr.ReleaseBufferAccess( b = (nWasRead / 2) );

#ifdef __BIGENDIAN
    ULONG n;
    sal_Unicode *pWork;
    for( n = 0, pWork = pData; n < b; ++n, ++pWork )
        *pWork = SWAPSHORT( *pWork );
#endif // ifdef __BIGENDIAN

// 2000/03/27 KHZ UNICODE
// still missing: unicode-back conversion AND 0xF0.. specials

    if( bAtEndSeekRel1 )
        rStrm.SeekRel( 2 ); // ueberspringe das Null-Character am Ende.

    return aStr;
}


USHORT WW8ScannerBase::WW8ReadString( SvStream& rStrm, String& rStr,
                                      WW8_CP nAktStartCp, long nTotalLen,
                                      rtl_TextEncoding eEnc ) const
                                      // , unsigned -c-h-a-r-** ppStr ) const
{
    // Klartext einlesen, der sich ueber mehrere Pieces erstrecken kann
    rStr.Erase();

    long   nTotalRead = 0;
    WW8_CP nBehindTextCp = nAktStartCp + nTotalLen;
    WW8_CP nNextPieceCp  = nBehindTextCp; // Initialisierung wichtig fuer Ver6
    do {
        BOOL bIsUnicode, bPosOk;
        WW8_FC fcAct = WW8Cp2Fc( nAktStartCp, &bIsUnicode,
                                 &nNextPieceCp, &bPosOk);

        if( !bPosOk ) break;  // vermutlich uebers Dateiende hinaus gezielt, macht nix!

        rStrm.Seek( fcAct );

        long nLen = (    (nNextPieceCp < nBehindTextCp)
                        ? nNextPieceCp
                        : nBehindTextCp
                    )
                    - nAktStartCp;

        if( 0 >= nLen ) break;

        if( nLen > USHRT_MAX - 1 )
            nLen = USHRT_MAX - 1;

        if( bIsUnicode )
            rStr.Append( WW8Read_xstz( rStrm, (USHORT)nLen, FALSE ) );
        else
        {
            ByteString aByteStr;    // Alloc methode automatically sets Zero at the end
            sal_Char*  pByteData = aByteStr.AllocBuffer( nLen );

            sal_Size nWasRead = rStrm.Read( pByteData, nLen );
            if( nWasRead != nLen )
                aByteStr.ReleaseBufferAccess( nWasRead );

            rStr += String( aByteStr, eEnc );
        }
        nTotalRead  += nLen;
        nAktStartCp += nLen;
        if( nTotalRead != rStr.Len() ) break;
    }
    while( nTotalRead < nTotalLen );

    return rStr.Len();
}


//-----------------------------------------
//              WW8PLCFspecial
//-----------------------------------------

// Bei nStartPos < 0 wird das erste Element des PLCFs genommen
WW8PLCFspecial::WW8PLCFspecial( SvStream* pSt, long nFilePos, long nPLCF,
            long nStruct, long nStartPos, BOOL bNoEnd )
:nIdx( 0 ), nStru( nStruct )
{
    nIMax = ( nPLCF - 4 ) / ( 4 + nStruct );
    pPLCF_PosArray = new INT32[ ( nPLCF + 3 ) / 4 ];    // Pointer auf Pos- u. Struct-Array

    long nOldPos = pSt->Tell();

    pSt->Seek( nFilePos );
    pSt->Read( pPLCF_PosArray, nPLCF );
#ifdef __BIGENDIAN
    for( nIdx = 0; nIdx <= nIMax; nIdx++ ){
        pPLCF_PosArray[nIdx] = SWAPLONG( pPLCF_PosArray[nIdx] );
    }
    nIdx = 0;
#endif // __BIGENDIAN
    if( bNoEnd ) nIMax++;
    if( nStruct )
        pPLCF_Contents = (BYTE*)&pPLCF_PosArray[nIMax + 1]; // Pointer auf Inhalts-Array
    else
        pPLCF_Contents = 0;                         // kein Inhalt
    if( nStartPos >= 0 )
        SeekPos( nStartPos );

    pSt->Seek( nOldPos );
}

// WW8PLCFspecial::SeekPos() stellt den WW8PLCFspecial auf die Stelle nPos, wobei auch noch der
// Eintrag benutzt wird, der vor nPos beginnt und bis hinter nPos reicht.
// geeignet fuer normale Attribute. Allerdings wird der Attributanfang nicht
// auf die Position nPos korrigiert.
BOOL WW8PLCFspecial::SeekPos( long nPos )
{
    long nP = nPos;

    if( nP < pPLCF_PosArray[0] )
    {
        nIdx = 0;
        return FALSE;                   // Nicht gefunden: nPos unterhalb kleinstem Eintrag
    }

    // Search from beginning?
    if( (1 > nIdx) || (nP < pPLCF_PosArray[ nIdx-1 ]) )
        nIdx = 1;

    long nI   = nIdx ? nIdx : 1;
    long nEnd = nIMax;
#ifndef KHZ_TEST0
    for(int n = (1==nIdx ? 1 : 2); n; --n )
    {
        for( ; nI <=nEnd; ++nI)
        {                                   // Suchen mit um 1 erhoehtem Index
            if( nP < pPLCF_PosArray[nI] )
            {                               // Position gefunden
                nIdx = nI - 1;              // nI - 1 ist der richtige Index
                return TRUE;                // ... und fertig
            }
        }
        nI   = 1;
        nEnd = nIdx-1;
    }
#else
    for( nI=1; nI<=nIMax; nI++){        // Suchen mit um 1 erhoehtem Index
        if( nP < pPLCF_PosArray[nI] ){          // Position gefunden
            nIdx = nI - 1;              // nI - 1 ist der richtige Index
            return TRUE;                // ... und fertig
        }
    }
#endif
    nIdx = nIMax;                       // Nicht gefunden, groesser als alle Eintraege
    return FALSE;
}

// WW8PLCFspecial::SeekPosExact() wie SeekPos(), aber es wird sichergestellt, dass kein
// Attribut angeschnitten wird, d.h. das naechste gelieferte Attribut beginnt
// auf oder hinter nPos. Wird benutzt fuer Felder + Bookmarks.
BOOL WW8PLCFspecial::SeekPosExact( long nPos )
{
    long nP = nPos;

    if( nP < pPLCF_PosArray[0] )
    {
        nIdx = 0;
        return FALSE;                   // Nicht gefunden: nPos unterhalb kleinstem Eintrag
    }
    // Search from beginning?
    if( nP <=pPLCF_PosArray[nIdx] )
        nIdx = 0;

    long nI   = nIdx ? nIdx-1 : 0;
    long nEnd = nIMax;
#ifndef KHZ_TEST0
    for(int n = (0==nIdx ? 1 : 2); n; --n )
    {
        for( ; nI < nEnd; ++nI)
        {
            if( nP <=pPLCF_PosArray[nI] )
            {                           // Position gefunden
                nIdx = nI;              // nI     ist der richtige Index
                return TRUE;            // ... und fertig
            }
        }
        nI   = 0;
        nEnd = nIdx;
    }
#else
    for( nI=0; nI<nIMax; nI++){         // Suchen
        if( nP <= pPLCF_PosArray[nI] ){         // Position gefunden
            nIdx = nI;                  // nI ist der richtige Index
            return TRUE;                // ... und fertig
        }
    }
#endif
    nIdx = nIMax;                       // Nicht gefunden, groesser als alle Eintraege
    return FALSE;
}

BOOL WW8PLCFspecial::Get( long& rPos, void*& rpValue )
{
    if ( nIdx >= nIMax ){
        rPos = LONG_MAX;
        return FALSE;
    }
    rPos = pPLCF_PosArray[nIdx];
    rpValue = pPLCF_Contents ? (void*)&pPLCF_Contents[nIdx * nStru] : 0;
    return TRUE;
}

BOOL WW8PLCFspecial::GetData( long nIdx, long& rPos, void*& rpValue )
{
    if ( nIdx >= nIMax ){
        rPos = LONG_MAX;
        return FALSE;
    }
    rPos = pPLCF_PosArray[nIdx];
    rpValue = pPLCF_Contents ? (void*)&pPLCF_Contents[nIdx * nStru] : 0;
    return TRUE;
}

//-----------------------------------------
//              WW8PLCF z.B. fuer SEPX
//-----------------------------------------

// Ctor fuer *andere* als Fkps
// Bei nStartPos < 0 wird das erste Element des PLCFs genommen
WW8PLCF::WW8PLCF( SvStream* pSt, long nFilePos, long nPLCF,
          long nStruct, long nStartPos )
:nIdx( 0 ), nStru( nStruct )
{
    ASSERT( nPLCF, "WW8PLCF: nPLCF ist Null!" );

    nIMax = ( nPLCF - 4 ) / ( 4 + nStruct );

    ReadPLCF( pSt, nFilePos, nPLCF );

    if( nStartPos >= 0 )
        SeekPos( nStartPos );
}

// Ctor *nur* fuer Fkps
// Die letzten 2 Parameter sind fuer PLCF.Chpx und PLCF.Papx noetig.
// ist ncpN != 0, dann wird ein unvollstaendiger PLCF vervollstaendigt.
// Das ist bei WW6 bei Resourcenmangel und bei WordPad (W95) immer noetig.
// Bei nStartPos < 0 wird das erste Element des PLCFs genommen
WW8PLCF::WW8PLCF( SvStream* pSt, long nFilePos, long nPLCF,
          long nStruct, long nStartPos, long nPN, long ncpN )
:nIdx( 0 ), nStru( nStruct )
{
    nIMax = ( nPLCF - 4 ) / ( 4 + nStruct );

    if( nIMax >= (long) ncpN )
        ReadPLCF( pSt, nFilePos, nPLCF );
    else
        GeneratePLCF( pSt, nPN, ncpN );

    if( nStartPos >= 0 )
        SeekPos( nStartPos );

// Damit man sich den Inhalt im Debugger ansehen kann
#ifdef DEBUG
    INT32  (*p1)[200] = (INT32  (*)[200])pPLCF_PosArray;
    USHORT (*p2)[200] = (USHORT (*)[200])pPLCF_Contents;
    p2 = p2;
#endif
}

void WW8PLCF::ReadPLCF( SvStream* pSt, long nFilePos, long nPLCF )
{
    pPLCF_PosArray = new INT32[ ( nPLCF + 3 ) / 4 ];    // Pointer auf Pos-Array

    long nOldPos = pSt->Tell();

    pSt->Seek( nFilePos );
    pSt->Read( pPLCF_PosArray, nPLCF );
#ifdef __BIGENDIAN
    for( nIdx = 0; nIdx <= nIMax; nIdx++ ){
      pPLCF_PosArray[nIdx] = SWAPLONG( pPLCF_PosArray[nIdx] );
    }
    nIdx = 0;
#endif // __BIGENDIAN
    pPLCF_Contents = (BYTE*)&pPLCF_PosArray[nIMax + 1];     // Pointer auf Inhalts-Array

    pSt->Seek( nOldPos );
}

void WW8PLCF::GeneratePLCF( SvStream* pSt, long nPN,
                       long ncpN )
{
    ASSERT( nIMax < (long)ncpN, "Pcl.Fkp: Warum ist PLCF zu gross ?" );
    nIMax = ncpN;
    long nSiz = 6 * nIMax + 4;
    pPLCF_PosArray = new INT32[ ( nSiz + 3 ) / 4 ]; // Pointer auf Pos-Array
    memset( pPLCF_PosArray, 0, (size_t)nSiz );

    INT32 nFc;
    USHORT i;

    for( i = 0; i < ncpN; i++ ){        // Baue FC-Eintraege
        pSt->Seek( ( nPN + i ) << 9 );  // erster FC-Eintrag jedes Fkp
        *pSt >> nFc;
        pPLCF_PosArray[i] = nFc;
    }
    ULONG nLastFkpPos = ( ( nPN + nIMax - 1 ) << 9 );
    pSt->Seek( nLastFkpPos + 511 );     // Anz. Fkp-Eintraege des letzten Fkp
    BYTE nb;
    *pSt >> nb;
    pSt->Seek( nLastFkpPos + nb * 4 );  // letzer FC-Eintrag des letzten Fkp
    *pSt >> nFc;
    pPLCF_PosArray[nIMax] = nFc;        // Ende des letzten Fkp

    pPLCF_Contents = (BYTE*)&pPLCF_PosArray[nIMax + 1]; // Pointer auf Inhalts-Array
    USHORT* p = (USHORT*)pPLCF_Contents;

    for( i = 0; i < ncpN; i++ )         // Baue PNs
        p[i] = nPN + i;

#ifdef DEBUG    // Damit man sich den Inhalt im Debugger ansehen kann
    INT32  (*p1)[200] = (INT32  (*)[200])pPLCF_PosArray;
    USHORT (*p2)[200] = (USHORT (*)[200])pPLCF_Contents;
    p2 = p2;
#endif
}

BOOL WW8PLCF::SeekPos( long nPos )
{
    long nP = nPos;

    if( nP < pPLCF_PosArray[0] )
    {
        nIdx = 0;
        return FALSE;                   // Nicht gefunden: nPos unterhalb kleinstem Eintrag
    }
    // Search from beginning?
    if( (1 > nIdx) || (nP < pPLCF_PosArray[ nIdx-1 ]) )
        nIdx = 1;

    long nI   = nIdx ? nIdx : 1;
    long nEnd = nIMax;
#ifndef KHZ_TEST0
    for(int n = (1==nIdx ? 1 : 2); n; --n )
    {
        for( ; nI <=nEnd; ++nI)             // Suchen mit um 1 erhoehtem Index
        {
            if( nP < pPLCF_PosArray[nI] )   // Position gefunden
            {
                nIdx = nI - 1;              // nI - 1 ist der richtige Index
                return TRUE;                // ... und fertig
            }
        }
        nI   = 1;
        nEnd = nIdx-1;
    }
#else
    for( nI=1; nI<=nIMax; nI++){
        if( nP < pPLCF_PosArray[nI] ){
            nIdx = nI - 1;              // nI - 1 ist der richtige Index
            return TRUE;                // ... und fertig
        }
    }
#endif
    nIdx = nIMax;                       // Nicht gefunden, groesser als alle Eintraege
    return FALSE;
}//4,11,0,11,4,0,0,0,0,0,11,11,11,11,

BOOL WW8PLCF::Get( long& rStart, long& rEnd, void*& rpValue )
{
    if ( nIdx >= nIMax )
    {
        rStart = rEnd = LONG_MAX;
        return FALSE;
    }
    rStart = pPLCF_PosArray[ nIdx     ];
    rEnd   = pPLCF_PosArray[ nIdx + 1 ];
    rpValue = (void*)&pPLCF_Contents[nIdx * nStru];
    return TRUE;
}

long WW8PLCF::Where()
{
    if ( nIdx >= nIMax )
        return LONG_MAX;

    return pPLCF_PosArray[nIdx];
}

//-----------------------------------------
//              WW8PLCFpcd
//-----------------------------------------

WW8PLCFpcd::WW8PLCFpcd( SvStream* pSt, long nFilePos, long nPLCF, long nStruct )
:nStru( nStruct )
{
    nIMax = ( nPLCF - 4 ) / ( 4 + nStruct );
    pPLCF_PosArray = new INT32[ ( nPLCF + 3 ) / 4 ];    // Pointer auf Pos-Array

    long nOldPos = pSt->Tell();

    pSt->Seek( nFilePos );
    pSt->Read( pPLCF_PosArray, nPLCF );
#ifdef __BIGENDIAN
    {
        for( long nI = 0; nI <= nIMax; nI++ )
          pPLCF_PosArray[nI] = SWAPLONG( pPLCF_PosArray[nI] );
    }
#endif // __BIGENDIAN

    pPLCF_Contents = (BYTE*)&pPLCF_PosArray[nIMax + 1]; // Pointer auf Inhalts-Array

    for( INT32 nI = 0; nI < nIMax; nI++ )
    {
        ULONG nKey = (ULONG)(0x8FFFFFFF & ((WW8_PCD1&)pPLCF_Contents[nI * nStru]).fc);
        aFC_sort.Insert( nKey, nI );
    }

    pSt->Seek( nOldPos );
}


ULONG WW8PLCFpcd::FindIdx( WW8_FC nFC ) const
{
    ULONG nFound;
    if( !aFC_sort.SearchKey( nFC, &nFound ) )
    {
        if( !nFound )
            nFound = ULONG_MAX;
        else
            --nFound;  // we were behind the list because nFc is greater max. list entry
    }
    return ULONG_MAX == nFound ? ULONG_MAX : aFC_sort.GetObject( nFound );
}


// Bei nStartPos < 0 wird das erste Element des PLCFs genommen
WW8PLCFpcd_Iter::WW8PLCFpcd_Iter( WW8PLCFpcd& rPLCFpcd, long nStartPos /* = -1 */ )
:rPLCF( rPLCFpcd ), nIdx( 0 )
{
    if( nStartPos >= 0 )
        SeekPos( nStartPos );
}

BOOL WW8PLCFpcd_Iter::SeekPos( long nPos )
{
    long nP = nPos;

    if( nP < rPLCF.pPLCF_PosArray[0] )
    {
        nIdx = 0;
        return FALSE;                   // Nicht gefunden: nPos unterhalb kleinstem Eintrag
    }
    // Search from beginning?
    if( (1 > nIdx) || (nP < rPLCF.pPLCF_PosArray[ nIdx-1 ]) )
        nIdx = 1;

    long nI   = nIdx ? nIdx : 1;
    long nEnd = rPLCF.nIMax;
#ifndef KHZ_TEST0
    for(int n = (1==nIdx ? 1 : 2); n; --n )
    {
        for( ; nI <=nEnd; ++nI)
        {                               // Suchen mit um 1 erhoehtem Index
            if( nP < rPLCF.pPLCF_PosArray[nI] )
            {                           // Position gefunden
                nIdx = nI - 1;          // nI - 1 ist der richtige Index
                return TRUE;            // ... und fertig
            }
        }
        nI   = 1;
        nEnd = nIdx-1;
    }
#else
    for( nI=1; nI<=rPLCF.nIMax; nI++){  // Suchen mit um 1 erhoehtem Index
        if( nP < rPLCF.pPLCF_PosArray[nI] ){// Position gefunden
            nIdx = nI - 1;              // nI - 1 ist der richtige Index
            return TRUE;                // ... und fertig
        }
    }
#endif
    nIdx = rPLCF.nIMax;                 // Nicht gefunden, groesser als alle Eintraege
    return FALSE;
}//0,0,...0,1,0,0,1,0,0,1,1,...1,2,1,1,2,1,1,2,2,...2,4,2,2,3,2,2,3,3,...3,5,7,8,d,10,11,

/*
BOOL WW8PLCFpcd_Iter::SeekMaxMainFC( WW8Fib& rWwF, long& rMaxPosData )
{
    long nCpStart, nCpEnd;
    void* pData;
    nIdx = rPLCF.nIMax-1;
    if( !Get( nCpStart, nCpEnd, pData ) )
    {
        ASSERT( !this, "SeekMaxMainFC findet Eintrag zu nIdx nicht" );
        return FALSE;
    }
    BOOL bIsUnicode;
    WW8_FC nActPosData = WW8PLCFx_PCD::TransformPieceAddress(
                                        SVBT32ToLong( ( (WW8_PCD*)pData )->fc ),
                                        &bIsUnicode );

//  rMaxPosData = nActPosData + ((rWwF.ccpText - nCpStart) * (bIsUnicode ? 2 : 1));

    rMaxPosData = nActPosData + rWwF.ccpText - nCpStart;

    return (0 < rMaxPosData);
}
*/

BOOL WW8PLCFpcd_Iter::Get( long& rStart, long& rEnd, void*& rpValue )
{
    if( nIdx >= rPLCF.nIMax )
    {
        rStart = rEnd = LONG_MAX;
        return FALSE;
    }
    rStart = rPLCF.pPLCF_PosArray[nIdx];
    rEnd = rPLCF.pPLCF_PosArray[nIdx + 1];
    rpValue = (void*)&rPLCF.pPLCF_Contents[nIdx * rPLCF.nStru];
#ifdef DEBUG
    WW8_PCD1* p = (WW8_PCD1*)rpValue;
    p = p;
#endif
    return TRUE;
}

long WW8PLCFpcd_Iter::Where()
{
    if ( nIdx >= rPLCF.nIMax )
        return LONG_MAX;

    return rPLCF.pPLCF_PosArray[nIdx];
}

//-----------------------------------------

WW8PLCFx_Fc_FKP::WW8Fkp::WW8Fkp( BYTE nFibVer, SvStream* pSt, SvStream* pDataSt,
                                 long _nFilePos, long nItemSiz,
                                 ePLCFT ePl, WW8_FC nStartFc )
:nItemSize( nItemSiz ), nFilePos( _nFilePos ), ePLCF( ePl ), nIdx( 0 )
{
    nVersion = nFibVer;

    pFkp = (BYTE*)new INT32[128]; // 512 Byte

    long nOldPos = pSt->Tell();

    pSt->Seek( nFilePos );
    pSt->Read( pFkp, 512 );
    nIMax = pFkp[511];
#ifdef __BIGENDIAN
    register UINT32* p;
    for( nIdx = 0, p = (UINT32*)pFkp; nIdx <= nIMax; nIdx++, p++ )
        *p = SWAPLONG( *p );
#endif // __BIGENDIAN


    // Pointer auf Offset-Bereich in *pFkp
    BYTE* pOfs = pFkp + (nIMax + 1) * 4;

    pGrpprl = new WW8Grpprl[nIMax];
    memset( pGrpprl, 0, sizeof( WW8Grpprl )*nIMax );

    WW8Grpprl* pTmpGrpprl = pGrpprl;
    for( nIdx = 0; nIdx < nIMax; nIdx++, pTmpGrpprl++ )
    {
        USHORT nOfs = (*(pOfs + nIdx * nItemSize)) * 2;

        if ( nOfs )
        {
            switch ( ePLCF )
            {
            case CHP:
                    pTmpGrpprl->nLen  = (short)pFkp[ nOfs ];
                    pTmpGrpprl->pData = pFkp + nOfs + 1;
                    break;
            case PAP:
                    BYTE nDelta = 0;//(8 > nVersion) ? 0 : 1;
                    pTmpGrpprl->nLen = pFkp[ nOfs ];
                    if( 8 <= nVersion && !pTmpGrpprl->nLen )
                    {
                        pTmpGrpprl->nLen = pFkp[ nOfs+1 ];
                        nDelta++;
                    }
                    pTmpGrpprl->nIStd = SVBT16ToShort( (BYTE*) pFkp+nOfs+1+nDelta );
                    pTmpGrpprl->pData = pFkp + nOfs + 3+nDelta ;
                    USHORT nSpId = WW8GetSprmId( nVersion, pTmpGrpprl->pData );
                    if( 0x6645 == nSpId || 0x6646 == nSpId )
                    {
                        UINT32 nPos  = *(UINT32*)(pTmpGrpprl->pData + 2);
                        UINT32 nCurr = pDataSt->Tell();
                        pDataSt->Seek( nPos );
                        *pDataSt >> pTmpGrpprl->nLen;
                        pTmpGrpprl->pData = new BYTE[pTmpGrpprl->nLen];
                        pTmpGrpprl->bMustDelete = TRUE;
                        pDataSt->Read( pTmpGrpprl->pData, pTmpGrpprl->nLen );

                        pDataSt->Seek( nCurr );
                    }
                    else
                    {
                        pTmpGrpprl->nLen *= 2;
                        pTmpGrpprl->nLen -= 2;
                    }
                    break;
            }
        }
    }

    nIdx = 0;

    if( nStartFc >= 0 )
        SeekPos( nStartFc );

    pSt->Seek( nOldPos );
}

WW8PLCFx_Fc_FKP::WW8Fkp::~WW8Fkp()
{
    WW8Grpprl* pTmpGrpprl = pGrpprl;
    for( nIdx = 0; nIdx < nIMax; nIdx++, pTmpGrpprl++ )
    {
        if( pTmpGrpprl->bMustDelete )
            delete pTmpGrpprl->pData;
    }
    delete pGrpprl;
    delete pFkp;
}

BOOL WW8PLCFx_Fc_FKP::WW8Fkp::SeekPos( WW8_FC nFc )
{
    if( nFc < ((WW8_FC*)pFkp)[0] )
    {
        nIdx = 0;
        return FALSE;                   // Nicht gefunden: nPos unterhalb kleinstem Eintrag
    }
    // Search from beginning?
    if( (1 > nIdx) || (nFc < ((WW8_FC*)pFkp)[ nIdx-1 ]) )
        nIdx = 1;

    long nI   = nIdx ? nIdx : 1;
    long nEnd = nIMax;
#ifndef KHZ_TEST0
    for(int n = (1==nIdx ? 1 : 2); n; --n )
    {
        for( ; nI <=nEnd; ++nI)
        {                               // Suchen mit um 1 erhoehtem Index
            if( nFc < ((WW8_FC*)pFkp)[nI] )
            {                           // Position gefunden
                nIdx = nI - 1;          // nI - 1 ist der richtige Index
                return TRUE;            // ... und fertig
            }
        }
        nI   = 1;
        nEnd = nIdx-1;
    }
#else
    for( nI=1; nI<=nIMax; nI++){        // Suchen mit um 1 erhoehtem Index
        if( nFc < ((WW8_FC*)pFkp)[nI] ){    // Position gefunden
            nIdx = nI - 1;              // nI - 1 ist der richtige Index
            return TRUE;                // ... und fertig
        }
    }
#endif
    nIdx = nIMax;                       // Nicht gefunden, groesser als alle Eintraege
    return FALSE;
}//32,0,1,32,0,0,1,1,2,2,3,4,5,

BYTE* WW8PLCFx_Fc_FKP::WW8Fkp::Get( WW8_FC& rStart, WW8_FC& rEnd, short& rLen )
{
    rLen = 0;

    if( nIdx >= nIMax ){
        rStart = LONG_MAX;
        return 0;
    }

    rStart = ((WW8_FC*)pFkp)[nIdx  ];
    rEnd   = ((WW8_FC*)pFkp)[nIdx+1];

    BYTE* pSprms = GetLenAndIStdAndSprms( rLen );
    return pSprms;
}

void WW8PLCFx_Fc_FKP::WW8Fkp::SetIdx( ULONG nI )
{
    if( nI < nIMax) nIdx = (short)nI;
}

BYTE* WW8PLCFx_Fc_FKP::WW8Fkp::GetLenAndIStdAndSprms(short& rLen)
{
    WW8Grpprl* pTmpGrpprl = pGrpprl + nIdx;

    rLen  = pTmpGrpprl->nLen;

    return pTmpGrpprl->pData;
}


BYTE* WW8FindSprm( USHORT nId, long nLen, BYTE* pSprms, BYTE nVersion )
{
    WW8SprmIter aSprmIter( pSprms, nLen, nVersion );

    while( aSprmIter.GetSprms() )
    {
        if( aSprmIter.GetAktId() == nId )
            return aSprmIter.GetAktParams();    // SPRM found!
        aSprmIter++;
    }

    return 0;                                   // SPRM _not_ found
}


BYTE* WW8PLCFx_Fc_FKP::WW8Fkp::HasSprm( USHORT nId )
{
    if( nIdx >= nIMax )
        return 0;

    short nLen;
    BYTE* pSprms = GetLenAndIStdAndSprms( nLen );

    return WW8FindSprm( nId, nLen, pSprms, nVersion );
}

ULONG WW8PLCFx_Fc_FKP::WW8Fkp::GetParaHeight() const
{
    if( ePLCF != PAP ){
        ASSERT( !this, "Fkp::GetParaHeight: Falscher Fkp" );
        return 0;
    }
    if( nIdx >= nIMax )
        return 0;

    WW8_PHE_Base* pPhe = (WW8_PHE_Base*)( (pFkp + (nIMax + 1) * 4)
                                        + ( nIdx * nItemSize ) + 1 );

    if( pPhe->aBits1 & 0x2 )                    // fUnk
        return 0;                               // invalid

    if( pPhe->aBits1 & 0x4 ){                   // fDiffLines
        return SVBT16ToShort( pPhe->dyl );      // Gesamthoehe
    }else{                                      // nlMac gleich hohe Zeilen
        INT32 nH = (INT16)SVBT16ToShort( pPhe->dyl );   // Zeilenhoehe
        if( nH < 0 )                            // negative Werte wollen wir
            nH = 0;                             // nicht
        nH *= (INT32)pPhe->nlMac;               // Hoehe einer Zeile * Zeilen
        return (ULONG)nH;
    }
}

//-----------------------------------------

void WW8PLCFx::GetSprms( WW8PLCFxDesc* p )
{
    ASSERT( !this, "Falsches GetSprms gerufen" );
    p->nStartPos = p->nEndPos = LONG_MAX;
    p->nSprmsLen = 0;
    p->pMemPos = 0;
    p->bRealLineEnd = FALSE;
    return;
}

long WW8PLCFx::GetNoSprms( long& rStart, long& rEnd, long& rLen )
{
    ASSERT( !this, "Falsches GetNoSprms gerufen" );
    rStart = rEnd = LONG_MAX;
    rLen = 0;
    return 0;
}

// ...Idx2: Default: ignorieren
ULONG WW8PLCFx::GetIdx2() const
{
    return 0;
}

void WW8PLCFx::SetIdx2( ULONG nIdx )
{
}

//-----------------------------------------
BOOL WW8PLCFx_Fc_FKP::NewFkp()
{
    long nPLCFStart, nPLCFEnd;
    void* pPage;

    static int __READONLY_DATA WW8FkpSizeTabVer6[ PLCF_END ] = {
                                                    1,  7, 0 /*, 0, 0, 0*/ };
    static int __READONLY_DATA WW8FkpSizeTabVer8[ PLCF_END ] = {
                                                    1, 13, 0 /*, 0, 0, 0*/ };
    const int* pFkpSizeTab;
    switch( GetVersion() )
    {
    case 6:
    case 7: pFkpSizeTab = WW8FkpSizeTabVer6;
            break;
    case 8: pFkpSizeTab = WW8FkpSizeTabVer8;
            break;
    default:// Programm-Fehler!
            ASSERT( !this, "Es wurde vergessen, nVersion zu kodieren!" );
            return FALSE;
    }

    if (!pPLCF->Get( nPLCFStart, nPLCFEnd, pPage ))
    {
        DELETEZ( pFkp );
        return FALSE;                                   // PLCF fertig abgearbeitet
    }
    (*pPLCF)++;
    long nPo = SVBT16ToShort( (unsigned char *)pPage );
    nPo <<= 9;                                          // shift als LONG

    long nAktFkpFilePos = pFkp ? pFkp->GetFilePos() : -1;
    if( nAktFkpFilePos != nPo )
    {
        DELETEZ( pFkp );
        pFkp = new WW8Fkp( GetVersion(), pFKPStrm, pDataStrm, nPo,
                            pFkpSizeTab[ ePLCF ],
                            ePLCF, nStartFc );
    }
    else // khz test1 //
    {
        pFkp->SetIdx( 0 );
        if( nStartFc >= 0 )
            pFkp->SeekPos( nStartFc );
    }

    nStartFc = -1;                                  // Nur das erste Mal
    return TRUE;
}

WW8PLCFx_Fc_FKP::WW8PLCFx_Fc_FKP(SvStream* pSt, SvStream* pTblSt,
                                 SvStream* pDataSt, WW8Fib& rFib, ePLCFT ePl,
                                 WW8_FC nStartFcL,
                                 WW8PLCFx_PCDAttrs* pPLCFx_PCDAttrs_)
    : WW8PLCFx( rFib.nVersion, TRUE ),
    pFKPStrm( pSt ),
    pDataStrm( pDataSt ),
    ePLCF( ePl ),
    pFkp( 0 ),
    nStartFc( nStartFcL ),
    pPCDAttrs( pPLCFx_PCDAttrs_)
{
    long nLenStruct = (8 > rFib.nVersion) ? 2 : 4;
    if( ePl == CHP )
        pPLCF = new WW8PLCF( pTblSt, rFib.fcPlcfbteChpx,
                        rFib.lcbPlcfbteChpx,
                        nLenStruct,
                        nStartFc,
                        rFib.pnChpFirst,
                        rFib.cpnBteChp );
    else
        pPLCF = new WW8PLCF( pTblSt, rFib.fcPlcfbtePapx,
                        rFib.lcbPlcfbtePapx,
                        nLenStruct,
                        nStartFc,
                        rFib.pnPapFirst,
                        rFib.cpnBtePap );
}

WW8PLCFx_Fc_FKP::~WW8PLCFx_Fc_FKP()
{
    delete pFkp;
    delete pPLCF;
}


ULONG WW8PLCFx_Fc_FKP::GetIdx() const
{
    ULONG u = pPLCF->GetIdx() << 8;
    if( pFkp )
        u |= pFkp->GetIdx();
    return u;
}

void WW8PLCFx_Fc_FKP::SetIdx( ULONG nIdx )
{
    if( !( nIdx & 0xffffff00L ) )
    {
        pPLCF->SetIdx( nIdx >> 8 );
        DELETEZ( pFkp );

    }
    else
    {                                   // Es gab einen Fkp
                                        // Lese PLCF um 1 Pos zurueck, um
        pPLCF->SetIdx( ( nIdx >> 8 ) - 1 );  // die Adresse des Fkp wiederzubekommen
        if ( NewFkp() )                     // und lese Fkp wieder ein
            pFkp->SetIdx( nIdx & 0xff );    // Dann stelle Fkp-Pos wieder ein
    }
}


BOOL WW8PLCFx_Fc_FKP::SeekPos( WW8_FC nFcPos )
{
    // StartPos for next Where()
    nStartFc = nFcPos;

    // find StartPos for next pPLCF->Get()
    BOOL bRet = pPLCF->SeekPos( nFcPos );

    // make FKP invalid?
    long nPLCFStart, nPLCFEnd;
    void* pPage;
    if( pFkp && pPLCF->Get( nPLCFStart, nPLCFEnd, pPage ) )
    {
        long nPo = SVBT16ToShort( (unsigned char *)pPage );
        nPo <<= 9;                                          // shift als LONG
        if( nPo != pFkp->GetFilePos() )
            DELETEZ( pFkp );
        else
            pFkp->SeekPos( nFcPos );
    }
    return bRet;
}

WW8_FC WW8PLCFx_Fc_FKP::Where()
{
//  if( bDontModify )
//      return pFkp ? pFkp->Where() : 0;

    if( !pFkp )
    {
        if( !NewFkp() )
            return LONG_MAX;
    }
    WW8_FC nP = pFkp->Where();
    if( nP != LONG_MAX )
        return nP;

    DELETEZ( pFkp );                    // FKP beendet -> hole neuen
    return Where();                     // am einfachsten rekursiv
}



BYTE* WW8PLCFx_Fc_FKP::GetSprms( WW8_FC& rStart, WW8_FC& rEnd, long& rLen )
{
    rLen = 0;                               // Default
    rStart = rEnd = LONG_MAX;

    if( !pFkp ){                            // Fkp nicht da ?
        if( !NewFkp() )
            return 0;
    }

    short nLen;
    BYTE* pPos = pFkp->Get( rStart, rEnd, nLen );
    if( rStart == LONG_MAX )
    {               // nicht gefunden
        return 0;
    }
    rLen = nLen;
    return pPos;
}



WW8PLCFx& WW8PLCFx_Fc_FKP::operator ++( int )
{
    if( !pFkp ){
//      ASSERT( FALSE, "pFkp fehlt");
//      return *this;
        if( !NewFkp() )
            return *this;
    }

    (*pFkp)++;
    if( pFkp->Where() == LONG_MAX ){
        NewFkp();
    }
    return *this;
}

USHORT WW8PLCFx_Fc_FKP::GetIstd() const
{
    return (pFkp) ? pFkp->GetIstd() : 0xffff;
}


void WW8PLCFx_Fc_FKP::GetPCDSprms( WW8PLCFxDesc& rDesc )
{
    rDesc.pMemPos   = 0;
    rDesc.nSprmsLen = 0;
    if( pPCDAttrs )
    {
        if( !pFkp )
        {
            DBG_WARNING( "+Problem: GetPCDSprms: NewFkp noetig ( kein const moeglich )" );
            if( !NewFkp() )
                return;
        }

        long nFcPos, nEnd;              // FCs
        short nLen;
        pFkp->Get( nFcPos, nEnd, nLen );

        WW8PLCFpcd_Iter* pIter = pPCDAttrs->GetIter();

    /**************************************/
        ULONG nSaveIdx = pIter->GetIdx();
        for( int nLoop = 0; 2 > nLoop; ++nLoop )
        {
            long nCpStart, nCpEnd;
            void* pData;

            if( pIter->Get( nCpStart, nCpEnd, pData ) )
            {
                BOOL bIsUnicode = FALSE;
                INT32 nFcStart  = SVBT32ToLong( ((WW8_PCD*)pData)->fc );
                if( 7 < GetVersion() )
                    nFcStart = WW8PLCFx_PCD::TransformPieceAddress( nFcStart, bIsUnicode );

                INT32 nLen = (nCpEnd - nCpStart) * (bIsUnicode ? 2 : 1);

                if( nFcPos >= nFcStart && nFcPos < nFcStart + nLen )
                {
                    // gefunden
                    pPCDAttrs->GetSprms( &rDesc );
                    break;
                }
            }
            if( !nLoop )
            {
                ULONG nFoundIdx = pIter->FindIdx( nFcPos );
                if( nFoundIdx > pIter->GetIMax())
                {
                    break;
                }
                pIter->SetIdx( nFoundIdx );
            }
        }
        pIter->SetIdx( nSaveIdx );
    /**************************************/
    }
}


BYTE* WW8PLCFx_Fc_FKP::HasSprm( USHORT nId )
{                                       // const waere schoener, aber dafuer
                                        // muesste NewFkp() ersetzt werden
                                        // oder wegfallen
    if( !pFkp )
    {
        DBG_WARNING( "+Motz: HasSprm: NewFkp noetig ( kein const moeglich )" );
                // Passiert bei BugDoc 31722
        if( !NewFkp() )
            return 0;
    }

    BYTE* pRes = pFkp->HasSprm( nId );

    if( !pRes )
    {
        WW8PLCFxDesc aDesc;
        GetPCDSprms( aDesc );

        if( aDesc.pMemPos )
        {
            pRes = WW8FindSprm( nId, aDesc.nSprmsLen,
                                aDesc.pMemPos, pFkp->GetVersion() );
        }
    }
    return pRes;
}


ULONG WW8PLCFx_Fc_FKP::GetParaHeight() const
{
    if( !pFkp ){
        ASSERT( !this, "GetParaHeight: pFkp nicht da" );
        return 0;
    }
    return pFkp->GetParaHeight();
}

//-----------------------------------------

WW8PLCFx_Cp_FKP::WW8PLCFx_Cp_FKP( SvStream* pSt, SvStream* pTblSt, SvStream* pDataSt,
                                    const WW8ScannerBase& rBase,
                                    ePLCFT ePl )
    : WW8PLCFx_Fc_FKP( pSt, pTblSt, pDataSt, *rBase.pWw8Fib, ePl,
                        rBase.WW8Cp2Fc( 0 ),
                        rBase.pPLCFx_PCDAttrs ),
    rSBase( rBase ),
//  nFcMin( rBase.pWrFib.fcMin ),
    nAttrStart( -1 ), nAttrEnd( -1 ),
    bLineEnd( FALSE ),
    bComplex( (7 < rBase.pWw8Fib->nVersion) || (0 != rBase.pWw8Fib->fComplex) )
{
    ResetAttrStartEnd();
    pPcd = rSBase.pPiecePLCF ? new WW8PLCFx_PCD(
                                rBase.pWw8Fib->nVersion, rBase.pPiecePLCF, 0,
                                ((6 == GetVersion()) || (7 == GetVersion())) )
                           : 0;
}

WW8PLCFx_Cp_FKP::~WW8PLCFx_Cp_FKP()
{
    delete pPcd;
}

void WW8PLCFx_Cp_FKP::ResetAttrStartEnd()
{
  nAttrStart = -1;
  nAttrEnd   = -1;
  bLineEnd   = FALSE;
}

ULONG WW8PLCFx_Cp_FKP::GetPCDIMax() const
{
    return pPcd ? pPcd->GetIMax() : 0;
}

ULONG WW8PLCFx_Cp_FKP::GetPCDIdx() const
{
    return pPcd ? pPcd->GetIdx() : 0;
}

void WW8PLCFx_Cp_FKP::SetPCDIdx( ULONG nIdx )
{
    if( pPcd )
        pPcd->SetIdx( nIdx );
}

BOOL WW8PLCFx_Cp_FKP::SeekPos( WW8_CP nCpPos )
{
/*
    WW8_FC nTargetFc = WW8Cp2Fc( nCpPos, nFcMin );
    return (LONG_MAX != nTargetFc)
        && WW8PLCFx_Fc_FKP::SeekPos( nTargetFc );
*/
    if( pPcd )  // Complex
    {
        if( !pPcd->SeekPos( nCpPos ) )  // Piece setzen
            return FALSE;
        return WW8PLCFx_Fc_FKP::SeekPos( pPcd->AktPieceStartCp2Fc( nCpPos ) );
    }
                                    // KEINE Piece-Table !!!
    return WW8PLCFx_Fc_FKP::SeekPos( rSBase.WW8Cp2Fc( nCpPos /*,TRUE*/ ) );
}

WW8_CP WW8PLCFx_Cp_FKP::Where()
{
    WW8_FC nFc = WW8PLCFx_Fc_FKP::Where();
/*  if( LONG_MAX == nFc )
        return LONG_MAX;*/
    if( pPcd )
        return pPcd->AktPieceStartFc2Cp( nFc ); // Piece ermitteln
    return rSBase.WW8Fc2Cp( nFc/*,TRUE*/ );     // KEINE Piece-Table !!!
}

void WW8PLCFx_Cp_FKP::GetSprms( WW8PLCFxDesc* p )
{
    p->pMemPos = WW8PLCFx_Fc_FKP::GetSprms( p->nStartPos, p->nEndPos, p->nSprmsLen );

#ifdef DEBUG
    if( ePLCF == PAP ) // um hier einen Brechpunkt zu setzen
        ePLCF = PAP;
#endif

    if( pPcd )  // Piece-Table vorhanden !!!
    {
        if(    (nAttrStart >  nAttrEnd)
            || (nAttrStart ==       -1) )  // Init ( noch kein ++ gerufen )
        {
            eCutT eC = pPcd->AktPieceFc2Cp( p->nStartPos, p->nEndPos );
            p->bRealLineEnd = !( eC & CUT_END ) && ePLCF == PAP;
        }
        else
        {
            p->nStartPos = nAttrStart;
            p->nEndPos = nAttrEnd;
            p->bRealLineEnd = bLineEnd;
        }
    }
    else        // KEINE Piece-Table !!!
    {
        p->nStartPos = rSBase.WW8Fc2Cp( p->nStartPos/*,TRUE*/ );
        p->nEndPos   = rSBase.WW8Fc2Cp( p->nEndPos/*,TRUE*/ );
        p->bRealLineEnd = ePLCF == PAP;
    }
}


// WW8PLCF_Cp_Fkp::SearchParaEnd kann einfacher durchgefuehrt werden, wenn das
// Flag "Zeilenende im Piece" in der Piecetable ausgewertet wird.
void WW8PLCFx_Cp_FKP::SearchParaEnd( long nOldEndCp )
{
    if( !bComplex )
    {
        ASSERT( !this, "SearchParaEnd fuer Non-Complex File gerufen" );
        return;
    }
    if( ePLCF != PAP )
    {
        ASSERT( !this, "SearchParaEnd fuer Non-PAP gerufen" );
        return;
    }
    long nFkpLen;                           // Fkp-Eintrag
    long nPcdStart, nPcdEnd;                // Piece-Grenzen

    WW8PLCFx_Fc_FKP::GetSprms( nAttrStart, nAttrEnd, nFkpLen ); // Fkp-Eintrag holen
/*  if( (LONG_MAX == nAttrStart) || (LONG_MAX == nAttrEnd) )
    {
        return;
    }*/
    eCutT eC = pPcd->AktPieceFc2Cp( nAttrStart, nAttrEnd );
    if( eC == CUT_NONE )            // neuer Eintrag ganz im akt. Piece
    {
        ASSERT( !this, "Nanu?" );
        return;                             // und fertig
    }
    WW8PLCFpcd_Iter* pIter = pPcd->GetPLCFIter();
    void* pData;
    do{
        (*pPcd)++;                                      //  naechstes Piece


        if( GetPCDIdx() >= GetPCDIMax() )
        {
            nAttrStart = nAttrEnd = LONG_MAX;   // kein Piece mehr vorhanden
            return;
        }


        if( !pIter->Get( nPcdStart, nPcdEnd, pData ) ){ // Piece-Grenzen holen
#ifdef DEBUG
            WW8_PCD1* p = (WW8_PCD1*)pData;
            p = p;
#endif
            nAttrStart = nAttrEnd = LONG_MAX;   // kein Piece mehr vorhanden
            return;
        }
#ifdef DEBUG
        WW8_PCD1* p = (WW8_PCD1*)pData;
        p = p;
#endif

    }while( SVBT8ToByte( ( (WW8_PCD*)pData )->aBits1 ) & 0x1 );
                                                // bis NL in Piece

    long nPos = rSBase.WW8Cp2Fc( nPcdStart);
    if( !WW8PLCFx_Fc_FKP::SeekPos( nPos ) )
    {
//      ASSERT( !this, " Can't seek to Piece Start" );
//      nAttrStart = nAttrEnd = LONG_MAX;   // kein Piece mehr vorhanden
        return;
    }
    WW8PLCFx_Fc_FKP::GetSprms( nAttrStart, nAttrEnd, nFkpLen ); // Fkp-Eintrag holen
    eC = pPcd->AktPieceFc2Cp(  nAttrStart, nAttrEnd );  // wird in CPs gebraucht

    nAttrStart = nOldEndCp;     // Aufziehen ueber ganzen Absatz, unabhaengig
                                // davon, wieviel Pieces das sind
}

WW8PLCFx& WW8PLCFx_Cp_FKP::operator ++( int )
{
    WW8PLCFx_Fc_FKP::operator ++( 0 );
    if(    !bComplex
        || !pPcd )                              // !pPcd: Notbremse
        return *this;

    if( GetPCDIdx() >= GetPCDIMax() )           // End of PLCF
    {
        nAttrStart = nAttrEnd = LONG_MAX;
        return *this;
    }

// ohoho
    long nFkpLen;                               // Fkp-Eintrag
    long nPcdStart, nPcdEnd, nPcdLen;           // Piece-Grenzen
    long nOldEndCp = nAttrEnd;

    WW8PLCFx_Fc_FKP::GetSprms( nAttrStart, nAttrEnd, nFkpLen ); // Fkp-Eintrag holen
    eCutT eC = pPcd->AktPieceFc2Cp( nAttrStart, nAttrEnd );
    bLineEnd = !( eC & CUT_END ) && ePLCF == PAP;
    if( !( eC & CUT_START ) ){                  // neuer Eintrag faengt im
                                                // akt. Piece an
#ifdef DEBUG
        if( ePLCF == PAP )
            ePLCF = PAP;                    // um hier einen Brechpunkt zu setzen
        if( ePLCF == CHP )
            ePLCF = CHP;                    // um hier einen Brechpunkt zu setzen
#endif
        return *this;               // und fertig
    }
                                    // naechster Eintrag im naechsten Piece

    if( ePLCF == PAP )
    {
        SearchParaEnd( nOldEndCp );
        bLineEnd = TRUE;
        return *this;
    }

    //  naechstes Piece
    bLineEnd = FALSE;
    (*pPcd)++;
    pPcd->GetNoSprms( nPcdStart, nPcdEnd, nPcdLen );
    // Piece-Grenzen holen
    if( !WW8PLCFx_Fc_FKP::SeekPos( rSBase.WW8Cp2Fc( nPcdStart ) ) )
    {
        ASSERT( nPcdStart == LONG_MAX, "Chp-SeekPos ging schief" );
        nAttrStart = nAttrEnd = LONG_MAX;
        goto Ret;
    }
    // Fkp-Eintrag holen
    WW8PLCFx_Fc_FKP::GetSprms( nAttrStart, nAttrEnd, nFkpLen );
    eC  = pPcd->AktPieceFc2Cp( nAttrStart, nAttrEnd );
Ret:
    return *this;
}

//-----------------------------------------
//-----------------------------------------

WW8PLCFx_SEPX::WW8PLCFx_SEPX( SvStream* pSt, SvStream* pTblSt, WW8Fib& rFib, WW8_CP nStartCp )
: pStrm( pSt ), WW8PLCFx( rFib.nVersion, TRUE ), nArrMax( 256 ), nSprmSiz( 0 )
{
    pPLCF =   rFib.lcbPlcfsed
            ? new WW8PLCF( pTblSt, rFib.fcPlcfsed,
                            rFib.lcbPlcfsed,
                            12, nStartCp )
            : 0;

    pSprms = new BYTE[nArrMax];     // maximale Laenge
}

WW8PLCFx_SEPX::~WW8PLCFx_SEPX()
{
    delete pPLCF;
    delete pSprms;
}

ULONG WW8PLCFx_SEPX::GetIdx() const
{
    return pPLCF ? pPLCF->GetIdx() : 0;
}

void WW8PLCFx_SEPX::SetIdx( ULONG nIdx )
{
    if( pPLCF ) pPLCF->SetIdx( nIdx );
}

BOOL WW8PLCFx_SEPX::SeekPos( WW8_CP nCpPos )
{
    return pPLCF ? pPLCF->SeekPos( nCpPos ) : 0;
}

WW8_CP WW8PLCFx_SEPX::Where()
{
    return pPLCF ? pPLCF->Where() : 0;
}

void WW8PLCFx_SEPX::GetSprms( WW8PLCFxDesc* p )
{
    if( !pPLCF ) return;

    void* pData;

    p->bRealLineEnd = FALSE;
    if (!pPLCF->Get( p->nStartPos, p->nEndPos, pData ))
    {
        p->nStartPos = p->nEndPos = LONG_MAX;       // PLCF fertig abgearbeitet
        p->pMemPos = 0;
    }
    else
    {
        long nPo =  SVBT32ToLong( (BYTE*)pData+2 );
        if ( nPo == 0xffffffffL )
        {
            p->nStartPos = p->nEndPos = LONG_MAX;       // Sepx empty
            p->pMemPos = 0;
        }
        else
        {
            pStrm->Seek( nPo );
            *pStrm >> nSprmSiz; // read len

            if( nSprmSiz > nArrMax )
            {               // passt nicht
                delete( pSprms );
                nArrMax = nSprmSiz;                 // Hole mehr Speicher
                pSprms = new BYTE[nArrMax];
            }
            pStrm->Read( pSprms, nSprmSiz );        // read Sprms

            p->nSprmsLen = nSprmSiz;
            p->pMemPos = pSprms;                    // return Position
        }
    }
}


WW8PLCFx& WW8PLCFx_SEPX::operator ++( int )
{
    if( pPLCF )
        (*pPLCF)++;
    return *this;
}


BYTE* WW8PLCFx_SEPX::HasSprm( USHORT nId ) const
{
    return pPLCF ? WW8FindSprm( nId, nSprmSiz, pSprms, GetVersion() )
                 : 0;
}


BYTE* WW8PLCFx_SEPX::HasSprm( USHORT nId, BYTE*  pOtherSprms,
                                          long   nOtherSprmSiz ) const
{
    return pPLCF ? WW8FindSprm( nId, nOtherSprmSiz, pOtherSprms, GetVersion() )
                 : 0;
}



BOOL WW8PLCFx_SEPX::Find4Sprms(USHORT nId1, USHORT nId2, USHORT nId3, USHORT nId4,
                               BYTE*& p1,   BYTE*& p2,   BYTE*& p3,   BYTE*& p4 ) const
{
    if( !pPLCF ) return 0;

    BOOL bFound = FALSE;
    p1 = 0;
    p2 = 0;
    p3 = 0;
    p4 = 0;

    BYTE* pSp = pSprms;
    short i;
    BYTE nDelta = ( 8 > GetVersion()) ? 0 : 1;
    for( i=0; i+1+nDelta < nSprmSiz;    )
    {
        // Sprm gefunden?
        USHORT nAktId = WW8GetSprmId( GetVersion(), pSp );
        BOOL bOk = TRUE;
        if( nAktId  == nId1 )
            p1 = pSp
                + 1 + nDelta
                + WW8SprmDataOfs( nId1 );
        else
        if( nAktId  == nId2 )
            p2 = pSp
                + 1 + nDelta
                + WW8SprmDataOfs( nId2 );
        else
        if( nAktId  == nId3 )
            p3 = pSp
                + 1 + nDelta
                + WW8SprmDataOfs( nId3 );
        else
        if( nAktId  == nId4 )
            p4 = pSp
                + 1 + nDelta
                + WW8SprmDataOfs( nId4 );
        else
            bOk = FALSE;
        bFound |= bOk;
        // erhoehe Zeiger, so dass er auf naechsten Sprm zeigt
        short x = WW8GetSprmSizeBrutto( GetVersion(), pSp, &nAktId  );
        i += x;
        pSp += x;
    }
    return bFound;
}

BYTE* WW8PLCFx_SEPX::HasSprm( USHORT nId, BYTE n2nd ) const
{
    if( !pPLCF ) return 0;

    BYTE* pSp = pSprms;
    short i;
    BYTE nDelta = ( 8 > GetVersion()) ? 0 : 1;

    for( i=0; i+1+nDelta < nSprmSiz;    )
    {
        // Sprm gefunden?
        USHORT nAktId = WW8GetSprmId( GetVersion(), pSp );
        if(    ( nAktId            == nId  )
                && ( pSp[ 1 + nDelta ] == n2nd ) )
            return pSp
                    + 1 + nDelta
                    + WW8SprmDataOfs( nId );
        // erhoehe Zeiger, so dass er auf naechsten Sprm zeigt
        short x = WW8GetSprmSizeBrutto( GetVersion(), pSp, &nAktId );
        i += x;
        pSp += x;
    }
    return 0;   // Sprm nicht gefunden
}

//-----------------------------------------
//-----------------------------------------

WW8PLCFx_SubDoc::WW8PLCFx_SubDoc( SvStream* pSt, BYTE nVersion,
                                    WW8_CP nStartCp,
                                    long nFcRef, long nLenRef,
                                    long nFcTxt, long nLenTxt,
                                    long nStruct )
    : WW8PLCFx( nVersion, FALSE ), pRef( 0 ), pTxt( 0 )
{
    if( nLenRef && nLenTxt )
    {
        pRef = new WW8PLCF( pSt, nFcRef, nLenRef, nStruct, nStartCp );
        pTxt = new WW8PLCF( pSt, nFcTxt, nLenTxt, 0, nStartCp );
    }
}

WW8PLCFx_SubDoc::~WW8PLCFx_SubDoc()
{
    delete pRef;
    delete pTxt;
}

ULONG WW8PLCFx_SubDoc::GetIdx() const
{
    if( pRef )
        return ( pRef->GetIdx() << 16
                 | pTxt->GetIdx() );        // Wahrscheinlich pTxt... nicht noetig
    return 0;
}

void WW8PLCFx_SubDoc::SetIdx( ULONG nIdx )
{
    if( pRef )
    {
        pRef->SetIdx( nIdx >> 16 );
        pTxt->SetIdx( nIdx & 0xffff );      // Wahrscheinlich pTxt... nicht noetig
    }
}

BOOL WW8PLCFx_SubDoc::SeekPos( WW8_CP nCpPos )
{
    return ( pRef ) ? pRef->SeekPos( nCpPos ) : FALSE;
}

WW8_CP WW8PLCFx_SubDoc::Where()
{
    return ( pRef ) ? pRef->Where() : LONG_MAX;
}

long WW8PLCFx_SubDoc::GetNoSprms( WW8_CP& rStart, long& rEnd, long& rLen )
{
    void* pData;
    long nSt, nE;
    rEnd = LONG_MAX;

    if ( !pRef )
    {
        rStart  = LONG_MAX;             // Es gibt keine Noten
        rLen = 0;
        return -1;
    }

    ULONG nNr = pRef->GetIdx();

    if (!pRef->Get( rStart, nE, pData ))
    {
        rStart = LONG_MAX;              // PLCF fertig abgearbeitet
        rLen = 0;
        return -1;
    }
    pTxt->SetIdx( nNr );

    if(!pTxt->Get( nSt, rLen, pData ))
    {
        rStart = LONG_MAX;              // PLCF fertig abgearbeitet
        rLen = 0;
        return -1;
    }

    rLen -= nSt;
    return nSt;
}

WW8PLCFx& WW8PLCFx_SubDoc::operator ++( int )
{
    if( pRef && pTxt )
    {
        (*pRef)++;
        (*pTxt)++;
    }
    return *this;
}


//-----------------------------------------
//          Felder
//-----------------------------------------

WW8PLCFx_FLD::WW8PLCFx_FLD( SvStream* pSt, WW8Fib& rMyFib,
                            short nType, WW8_CP nStartCp )
    : WW8PLCFx( rMyFib.nVersion, FALSE ), rFib( rMyFib ), pPLCF( 0 )
{

    long nFc, nLen;

    switch( nType )
    {
    case MAN_HDFT: nFc = rFib.fcPlcffldHdr;
                   nLen = rFib.lcbPlcffldHdr;
                   break;
    case MAN_FTN:  nFc = rFib.fcPlcffldFtn;
                   nLen = rFib.lcbPlcffldFtn;
                   break;
    case MAN_EDN:  nFc = rFib.fcPlcffldEdn;
                   nLen = rFib.lcbPlcffldEdn;
                   break;
    case MAN_AND:  nFc = rFib.fcPlcffldAtn;
                   nLen = rFib.lcbPlcffldAtn;
                   break;
    case MAN_TXBX: nFc = rFib.fcPlcffldTxbx;
                   nLen = rFib.lcbPlcffldTxbx;
                   break;
    case MAN_TXBX_HDFT:
                   nFc = rFib.fcPlcffldHdrTxbx;
                   nLen = rFib.lcbPlcffldHdrTxbx;
                   break;
    default:       nFc = rFib.fcPlcffldMom;
                   nLen = rFib.lcbPlcffldMom;
                   break;
    }

    if( nLen )
        pPLCF = new WW8PLCFspecial( pSt, nFc, nLen, 2 );
}

WW8PLCFx_FLD::~WW8PLCFx_FLD()
{
    delete pPLCF;
}

ULONG WW8PLCFx_FLD::GetIdx() const
{
    return ( pPLCF ) ? pPLCF->GetIdx() : 0;
}

void WW8PLCFx_FLD::SetIdx( ULONG nIdx )
{
    if( pPLCF )
        pPLCF->SetIdx( nIdx );
}

BOOL WW8PLCFx_FLD::SeekPos( WW8_CP nCpPos )
{
    return ( pPLCF ) ? pPLCF->SeekPosExact( nCpPos ) : FALSE;
}

WW8_CP WW8PLCFx_FLD::Where()
{
    return ( pPLCF ) ? pPLCF->Where() : LONG_MAX;
}

long WW8PLCFx_FLD::GetNoSprms( WW8_CP& rStart, long& rEnd, long& rLen )
{
    void* pData;
    ULONG nIdx;

    rLen = 0;
    rEnd = LONG_MAX;                            // Es gibt keine Ende

    if ( !pPLCF ){
        rStart = LONG_MAX;                      // Es gibt keine Felder
        return -1;
    }

    if (!pPLCF->Get( rStart, pData )){
        rStart = LONG_MAX;                      // PLCF fertig abgearbeitet
        return -1;
    }

    nIdx = pPLCF->GetIdx();

    return (long)nIdx;
}

WW8PLCFx& WW8PLCFx_FLD::operator ++( int )
{
    WW8SkipField( *pPLCF );                     // gehe zum naechsten Feld
    return *this;
}

BOOL WW8PLCFx_FLD::GetPara( long nIdx, WW8FieldDesc& rF )
{
    ASSERT( pPLCF, "Aufruf ohne Feld PLCFspecial" );
    if( !pPLCF )
        return FALSE;

    ULONG n = pPLCF->GetIdx();
    pPLCF->SetIdx( (ULONG)nIdx );

    BOOL bOk = WW8GetFieldPara( rFib.nVersion, *pPLCF, rF );
    pPLCF->SetIdx( n );
    return bOk;
}

//-----------------------------------------
//      class WW8PLCF_Book
//-----------------------------------------

/*  to be optimized like this:    */
void WW8ReadSTTBF(  BOOL bVer8, SvStream& rStrm,
                    UINT32 nStart, INT32 nLen, USHORT nSkip,
                    rtl_TextEncoding eCS,
                    SvStrings &rArray, SvStrings* pExtraArray  )
{
    ULONG nOldPos = rStrm.Tell();
    rStrm.Seek( nStart );

    String* pWork;

    UINT16 nLen2;
    rStrm >> nLen2; // bVer67: total length of structure
                    // bVer8 : count of strings

    if( bVer8 )
    {
        UINT16 nStrings;
        BOOL bUnicode = (0xFFFF == nLen2);
        if( bUnicode )
            rStrm >> nStrings;
        else
            nStrings = nLen2;

        UINT16 nExtraLen;
        rStrm >> nExtraLen;

        for( USHORT i=0; i < nStrings; i++ )
        {
            if( bUnicode )
                pWork = new String( WW8Read_xstz( rStrm, 0, FALSE ));
            else
            {
                BYTE nBChar;
                rStrm >> nBChar;
                ByteString aTmp;
                BYTE nWasRead = rStrm.Read( aTmp.AllocBuffer( nBChar ), nBChar );
                if( nWasRead != nBChar )
                    aTmp.ReleaseBufferAccess( nWasRead );
                pWork = new String( aTmp, eCS );
            }

            rArray.Insert( pWork, rArray.Count() );

            // Skip the extra data
            if( nExtraLen )
            {
                if( pExtraArray )
                {
                    ByteString aTmp;
                    BYTE nWasRead = rStrm.Read( aTmp.AllocBuffer( nExtraLen ), nExtraLen );
                    if( nWasRead != nExtraLen )
                        aTmp.ReleaseBufferAccess( nWasRead );
                    pWork = new String( aTmp, eCS );
                    pExtraArray->Insert( pWork, pExtraArray->Count() );
                }
                else
                    rStrm.SeekRel( nExtraLen );
            }
        }
    }
    else
    {
        BYTE nBChar;
        if( nLen2 != nLen )
        {
            ASSERT( nLen2 == nLen, "Fib lenght and read length are different" );
            nLen2 = nLen;
        }
        UINT16 nRead = 0;
        for( nLen2 -= 2; nRead < nLen2;  )
        {
            rStrm >> nBChar; ++nRead;
            if( nBChar )
            {
                ByteString aTmp;
                BYTE nWasRead = rStrm.Read( aTmp.AllocBuffer( nBChar ), nBChar );
                if( nWasRead != nBChar )
                    aTmp.ReleaseBufferAccess( nWasRead );
                pWork = new String( aTmp, eCS );
                nRead += nWasRead;
            }
            else
                pWork = new String;
            rArray.Insert( pWork, rArray.Count() );
        }
    }
    rStrm.Seek( nOldPos );
}


WW8PLCFx_Book::WW8PLCFx_Book( SvStream* pSt, SvStream* pTblSt, WW8Fib& rFib, WW8_CP nStartCp )
: WW8PLCFx( rFib.nVersion, FALSE ), nIsEnd( 0 ),  pStatus( 0 )
{
    if( !rFib.fcPlcfbkf || !rFib.lcbPlcfbkf
        || !rFib.fcPlcfbkl || !rFib.lcbPlcfbkl
        || !rFib.fcSttbfbkmk || !rFib.lcbSttbfbkmk )
    {
        pBook[0] = pBook[1] = 0;
        nIMax = 0;
    }
    else
    {
        pBook[0] = new WW8PLCFspecial( pTblSt, rFib.fcPlcfbkf,
                               rFib.lcbPlcfbkf, 4 );

        pBook[1] = new WW8PLCFspecial( pTblSt, rFib.fcPlcfbkl,
                             rFib.lcbPlcfbkl, 0, -1, TRUE );

        rtl_TextEncoding eStructCharSet = 0x0100 == rFib.chseTables
                                            ? RTL_TEXTENCODING_APPLE_ROMAN
                                            : rtl_getTextEncodingFromWindowsCharset(
                                                rFib.chseTables );

        WW8ReadSTTBF( (7 < rFib.nVersion), *pTblSt,
                        rFib.fcSttbfbkmk, rFib.lcbSttbfbkmk, 0,
                        eStructCharSet, aBookNames );
        nIMax = aBookNames.Count();

        if( pBook[0]->GetIMax() < nIMax )   // Anzahl der Bookmarks
            nIMax = pBook[0]->GetIMax();
        if( pBook[1]->GetIMax() < nIMax )
            nIMax = pBook[1]->GetIMax();
        pStatus = new eBookStatus[ nIMax ];
        memset( pStatus, 0, nIMax * sizeof( eBookStatus ) );
    }
}

WW8PLCFx_Book::~WW8PLCFx_Book()
{
    delete[] ( pStatus );
    aBookNames.DeleteAndDestroy( 0, aBookNames.Count());
    delete( pBook[1] );
    delete( pBook[0] );
}

ULONG WW8PLCFx_Book::GetIdx() const
{
    return nIMax ? pBook[0]->GetIdx() : 0;
}

void WW8PLCFx_Book::SetIdx( ULONG nI )
{
    if( nIMax )
        pBook[0]->SetIdx( nI );
}

ULONG WW8PLCFx_Book::GetIdx2() const
{
    return ( nIMax )
            ? ( pBook[1]->GetIdx() | ( ( nIsEnd ) ? 0x80000000 : 0 ) )
            : 0;
}

void WW8PLCFx_Book::SetIdx2( ULONG nI )
{
    if( nIMax )
    {
        pBook[1]->SetIdx( nI & 0x7fffffff );
        nIsEnd = (USHORT)( ( nI >> 31 ) & 1 );  // 0 oder 1
    }
}

BOOL WW8PLCFx_Book::SeekPos( WW8_CP nCpPos )
{
    if( !pBook[0] )
        return FALSE;
    BOOL bOk = pBook[0]->SeekPosExact( nCpPos );
    bOk &= pBook[1]->SeekPosExact( nCpPos );
    nIsEnd = 0;

    return bOk;
}

WW8_CP WW8PLCFx_Book::Where()
{
    return pBook[nIsEnd]->Where();
}

long WW8PLCFx_Book::GetNoSprms( long& rStart, long& rEnd, long& rLen )
{
    void* pData;
    rEnd = LONG_MAX;
    rLen = 0;

    if ( !pBook[0] || !pBook[1] || !nIMax
         || (long)(pBook[nIsEnd]->GetIdx()) >= nIMax ){
        rStart = rEnd = LONG_MAX;
        return -1;
    }

    pBook[nIsEnd]->Get( rStart, pData );    // Pos. abfragen

    return pBook[nIsEnd]->GetIdx();
}

// Der Operator ++ hat eine Tuecke: Wenn 2 Bookmarks aneinandergrenzen, dann
// sollte erst das Ende des ersten und dann der Anfang des 2. erreicht werden.
// Liegen jedoch 2 Bookmarks der Laenge 0 aufeinander, *muss* von jedem Bookmark
// erst der Anfang und dann das Ende gefunden werden.
// Der Fall: ][
//            [...]
//           ][
// ist noch nicht geloest, dabei muesste ich in den Anfangs- und Endindices
// vor- und zurueckspringen, wobei ein weiterer Index oder ein Bitfeld
// oder etwas aehnliches zum Merken der bereits abgearbeiteten Bookmarks
// noetig wird.
WW8PLCFx& WW8PLCFx_Book::operator ++( int )
{
    if( pBook[0] && pBook[1] && nIMax )
    {
        (*pBook[nIsEnd])++;

        register ULONG l0 = pBook[0]->Where();
        register ULONG l1 = pBook[1]->Where();
        if( l0 < l1 )
            nIsEnd = 0;
        else if( l1 < l0 )
            nIsEnd = 1;
        else
            nIsEnd = ( nIsEnd ) ? 0 : 1;

//      nIsEnd = ( pBook[1]->Where() <= pBook[0]->Where() ) ? 1 : 0;
    }
    return *this;
}

long WW8PLCFx_Book::GetLen() const
{
    if( nIsEnd ){
        ASSERT( !this, "Falscher Aufruf (1) von PLCF_Book::GetLen()" );
        return 0;
    }
    void * p;
    WW8_CP nStartPos;
    if( !pBook[0]->Get( nStartPos, p ) ){
        ASSERT( !this, "Falscher Aufruf (2) von PLCF_Book::GetLen()" );
        return 0;
    }
    USHORT nEndIdx = SVBT16ToShort( *((SVBT16*)p) );
//  USHORT nEndIdx = *(USHORT*)p;
    return pBook[1]->GetPos( nEndIdx ) - nStartPos;
}

// IgnoreBook ist dafuer da, bei Feldern mit implizitem WW-Bookmark
// die Bookmarks zwischen Anfang und Ende des Feldes zu ignorieren,
// die den angegebenen Namen tragen.
BOOL WW8PLCFx_Book::SetStatus( WW8_CP nStartRegion, WW8_CP nEndRegion,
                               const String& rName,
                               eBookStatus eStat )
{
    ASSERT( nStartRegion < LONG_MAX && nEndRegion < LONG_MAX,
            "IgnoreBook mit falschen Parametern" );

    if( !pBook[0] || !pBook[1] )
        return FALSE;

    BOOL bFound = FALSE;
    long i = 0;
    WW8_CP nStartAkt, nEndAkt;
    do{
        void* p;
        USHORT nEndIdx;

        if( pBook[0]->GetData( i, nStartAkt, p ) && p ){
            nEndIdx = SVBT16ToShort( *((SVBT16*)p) );
        }
        else
        {
            ASSERT( !this, "Bookmark-EndIdx nicht lesbar" );
            nEndIdx = (USHORT)i;
        }
        nEndAkt = pBook[1]->GetPos( nEndIdx );
        if(    (nStartAkt >= nStartRegion)
            && (nEndAkt   <= nEndRegion)
            && (rName.Equals( *aBookNames[ i ] )) )
        {
            pStatus[nEndIdx] = (eBookStatus)( pStatus[nEndIdx] | eStat );
            bFound = TRUE;
        }
        i++;
    }
    while( nStartAkt <= nEndRegion && i < pBook[0]->GetIMax() );
    return bFound;
}

eBookStatus WW8PLCFx_Book::GetStatus() const
{
    if( !pStatus )
        return BOOK_NORMAL;
    long nEndIdx = GetHandle();
    return ( nEndIdx < nIMax ) ? pStatus[nEndIdx] : BOOK_NORMAL;
}

long WW8PLCFx_Book::GetHandle() const
{
    if( !pBook[0] || !pBook[1] )
        return LONG_MAX;

    if( nIsEnd ){
        return pBook[1]->GetIdx();
    }else{
//  BOOL     Get( long& rStart, void*& rpValue );
        const void* p = pBook[0]->GetData( pBook[0]->GetIdx() );
        if( p )
        {
            return SVBT16ToShort( *((SVBT16*)p) );
//          return *((USHORT*)p);
        }
        else
            return LONG_MAX;
    }
}

//-----------------------------------------
//          WW8PLCFMan
//-----------------------------------------

#ifndef DUMP

// Am Ende eines Absatzes reichen bei WW6 die Attribute bis hinter das <CR>.
// Das wird fuer die Verwendung mit dem SW um 1 Zeichen zurueckgesetzt, wenn
// dadurch kein AErger zu erwarten ist.
void WW8PLCFMan::AdjustEnds( WW8PLCFxDesc& rDesc )
{
    if ( (&rDesc == pPap) && rDesc.bRealLineEnd )
    {
        if ( pPap->nEndPos != LONG_MAX )    // Para adjust
        {
            nLineEnd = pPap->nEndPos;       // nLineEnd zeigt *hinter* das <CR>
            pPap->nEndPos--;                // Absatzende um 1 Zeichen verkuerzen

            if( pChp->nEndPos == nLineEnd ) // gibt es bereits ein CharAttr-Ende,
                                            // das auf das jetzige Absatzende zeigt ?
                pChp->nEndPos--;            // ... dann auch um 1 Zeichen verkuerzen

            if( pSep->nEndPos == nLineEnd ) // gibt es bereits ein Sep-Ende,
                                            // das auf das jetzige Absatzende zeigt ?
                pSep->nEndPos--;            // ... dann auch um 1 Zeichen verkuerzen
        }
    }
    else
    if(    (&rDesc == pChp)
        || (&rDesc == pSep) )
    {                                       // Char Adjust oder Sep Adjust
        if(     (rDesc.nEndPos == nLineEnd) // Wenn Ende Char-Attr == Absatzende ...
             && (rDesc.nEndPos > rDesc.nStartPos) )
            rDesc.nEndPos--;                    // ... dann um 1 Zeichen verkuerzen
    }

    if( rDesc.nStartPos > rDesc.nEndPos ){  // allgemeiner Plausibilitaetstest

        //if( gfhdf

        ASSERT( !this, "+Anfang und Ende des WW86-Attributes stehen ueber Kreuz" );
        rDesc.nEndPos = rDesc.nStartPos;
    }
}

void WW8PLCFMan::GetNewSprms( WW8PLCFxDesc& rDesc )
{
    rDesc.pPLCFx->GetSprms( &rDesc );

    //if( rDesc.nStartPos <= rDesc.nEndPos

    ASSERT((LONG_MAX == rDesc.nStartPos) || (rDesc.nStartPos <= rDesc.nEndPos),
            "Attr-Anfang und -Ende ueber Kreuz" );

    if( rDesc.nStartPos != LONG_MAX ) rDesc.nStartPos -= rDesc.nCpOfs;
    if( rDesc.nEndPos   != LONG_MAX ) rDesc.nEndPos   -= rDesc.nCpOfs;

    rDesc.bFirstSprm = TRUE;

    AdjustEnds( rDesc );
}

void WW8PLCFMan::GetNewNoSprms( WW8PLCFxDesc& rDesc )
{
    rDesc.nCp2OrIdx =
        rDesc.pPLCFx->GetNoSprms(rDesc.nStartPos, rDesc.nEndPos,
                                                rDesc.nSprmsLen);

    ASSERT((LONG_MAX == rDesc.nStartPos) || (rDesc.nStartPos <= rDesc.nEndPos),
            "Attr-Anfang und -Ende ueber Kreuz" );

    if( rDesc.nStartPos != LONG_MAX ) rDesc.nStartPos -= rDesc.nCpOfs;
    if( rDesc.nEndPos   != LONG_MAX ) rDesc.nEndPos   -= rDesc.nCpOfs;
    rDesc.bFirstSprm = TRUE;
}

static USHORT GetId( BYTE nVersion, WW8PLCFxDesc* p )
{
    USHORT nId;

    if( p->nSprmsLen > 0 )
        nId = WW8GetSprmId( nVersion, p->pMemPos );
    else
        nId = 0;        // Id = 0 fuer leeres Attribut
    return nId;
}

WW8PLCFMan::WW8PLCFMan( WW8ScannerBase* pBase, short nType, long nStartCp )
{
    pWwFib      = pBase->pWw8Fib;
    pNoAttrScan = &pBase->nNoAttrScan;

    nLastWhereIdxCp = 0;
    memset( aD, 0, sizeof( aD ) );
    nLineEnd = LONG_MAX;
    nManType = nType;
    USHORT i;

    if( MAN_MAINTEXT == nType )
    {
        // Suchreihenfolge der Attribute
        nPLCF = MAN_ANZ_PLCF;
        pFld = &aD[0];
        pBkm = &aD[1];
        pEdn = &aD[2];
        pFtn = &aD[3];
        pAnd = &aD[4];
        pChp = &aD[5];
        pPap = &aD[6];
        pSep = &aD[7];
        pPcd = ( pBase->pPLCFx_PCD ) ? &aD[8] : 0;
        pPcdA = ( pBase->pPLCFx_PCDAttrs ) ? &aD[9] : 0;
        pSep->pPLCFx = pBase->pSepPLCF;
        pFtn->pPLCFx = pBase->pFtnPLCF;
        pEdn->pPLCFx = pBase->pEdnPLCF;
        pBkm->pPLCFx = pBase->pBook;
        pAnd->pPLCFx = pBase->pAndPLCF;
    }
    else
    {
        // Suchreihenfolge der Attribute
        nPLCF = 7;
        pFld = &aD[0];
        pBkm = ( pBase->pBook ) ? &aD[1] : 0;
        pChp = &aD[2];
        pPap = &aD[3];
        pSep = &aD[4];          // Dummy
        pPcd = ( pBase->pPLCFx_PCD ) ? &aD[5] : 0;
        pPcdA= ( pBase->pPLCFx_PCDAttrs ) ? &aD[6] : 0;
        pAnd = pFtn = pEdn = 0;     // unbenutzt bei SpezText
    }

    pChp->pPLCFx = pBase->pChpPLCF;
    pPap->pPLCFx = pBase->pPapPLCF;
    if( pPcd )
        pPcd->pPLCFx = pBase->pPLCFx_PCD;
    if( pPcdA )
        pPcdA->pPLCFx= pBase->pPLCFx_PCDAttrs;
    if( pBkm )
        pBkm->pPLCFx = pBase->pBook;

    switch( nType )                 // Feld-Initialisierung
    {
    case MAN_HDFT: pFld->pPLCFx = pBase->pFldHdFtPLCF;
                   nCpO     = pWwFib->ccpText + pWwFib->ccpFtn;
                   pFdoa    = pBase->pHdFtFdoa;
                   pTxbx    = pBase->pHdFtTxbx;
                   pTxbxBkd = pBase->pHdFtTxbxBkd;
                   break;
    case MAN_FTN:  pFld->pPLCFx = pBase->pFldFtnPLCF;
                   nCpO     = pWwFib->ccpText;
                   pFdoa    = pTxbx = pTxbxBkd = 0;
                   break;
    case MAN_EDN:  pFld->pPLCFx = pBase->pFldEdnPLCF;
                   nCpO     = pWwFib->ccpText + pWwFib->ccpFtn
                            + pWwFib->ccpHdr + pWwFib->ccpAtn;
                   pFdoa = pTxbx = pTxbxBkd = 0;
                   break;
    case MAN_AND:  pFld->pPLCFx = pBase->pFldAndPLCF;
                   nCpO = pWwFib->ccpText + pWwFib->ccpFtn
                            + pWwFib->ccpHdr;
                   pFdoa = pTxbx = pTxbxBkd = 0;
                   break;


    case MAN_TXBX: pFld->pPLCFx = pBase->pFldTxbxPLCF;
                   nCpO     = pWwFib->ccpText + pWwFib->ccpFtn
                            + pWwFib->ccpHdr + pWwFib->ccpMcr
                            + pWwFib->ccpAtn + pWwFib->ccpEdn;
                   pTxbx    = pBase->pMainTxbx;
                   pTxbxBkd = pBase->pMainTxbxBkd;
                   pFdoa = 0;
                   break;
    case MAN_TXBX_HDFT:
                   pFld->pPLCFx = pBase->pFldTxbxHdFtPLCF;
                   nCpO     = pWwFib->ccpText + pWwFib->ccpFtn
                            + pWwFib->ccpHdr + pWwFib->ccpMcr
                            + pWwFib->ccpAtn + pWwFib->ccpEdn
                            + pWwFib->ccpTxbx;
                   pTxbx    = pBase->pHdFtTxbx;
                   pTxbxBkd = pBase->pHdFtTxbxBkd;
                   pFdoa = 0;
                   break;


    default: pFld->pPLCFx = pBase->pFldPLCF;
                   nCpO = 0;
                   pFdoa    = pBase->pMainFdoa;
                   pTxbx    = pBase->pMainTxbx;
                   pTxbxBkd = pBase->pMainTxbxBkd;
                   break;
    }

    if( nStartCp || nCpO )
        SeekPos( nStartCp );    // PLCFe auf Text-StartPos einstellen

    // initialisieren der Member-Vars Low-Level
    GetChpPLCF()->ResetAttrStartEnd();
    GetPapPLCF()->ResetAttrStartEnd();
    for( i=0; i<nPLCF; i++)
    {
        register WW8PLCFxDesc* p = &aD[i];

        p->nCpOfs = ( p == pChp || p == pPap || p == pBkm ) ? nCpO : 0;
        p->nCp2OrIdx = 0;
        p->bFirstSprm = FALSE;
        p->pIdStk = 0;
        p->nStartPos = p->nEndPos = LONG_MAX;
    }

    // initialisieren der Member-Vars High-Level
    for( i=0; i<nPLCF; i++){
        register WW8PLCFxDesc* p = &aD[i];

        if( !p->pPLCFx )
            continue;

        if( p->pPLCFx->IsSprm() )
        {
            p->pIdStk = new UShortStk;  // Vorsicht: nEndPos muss bereits
            GetNewSprms( *p );          // bei allen PLCFen initialisiert sein
        }
        else
        {
            if( p->pPLCFx )
                GetNewNoSprms( *p );
        }
    }
}

WW8PLCFMan::~WW8PLCFMan()
{
    for( USHORT i=0; i<nPLCF; i++)
        delete aD[i].pIdStk;
}

// 0. welche Attr.-Klasse,
// 1. ob ein Attr.-Start ist,
// 2. CP, wo ist naechste Attr.-Aenderung
short WW8PLCFMan::WhereIdx( BOOL* pbStart, long* pPos )
{
    BOOL bIgnore;
    long next = LONG_MAX;   // SuchReihenfolge:
    short nextIdx = -1;     // erst Enden finden ( CHP, PAP, ( SEP ) ),
    BOOL bStart = TRUE;     // dann Anfaenge finden ( ( SEP ), PAP, CHP )
    short i;
    register WW8PLCFxDesc* pD;
    for( i=0; i<(short)nPLCF; i++)
    {
        pD = &aD[i];
        if(     ( pD->nEndPos    < next     )
            &&  ( pD->nStartPos == LONG_MAX ) )
        {   // sonst ist Anfang = Ende
            next = pD->nEndPos;
            nextIdx = i;
            bStart = FALSE;
        }
    }
    for( i=(short)nPLCF-1; i>=0; i--)
    {
        bIgnore = FALSE;
        pD = &aD[i];
        if( pD->nStartPos < next )
        {
            // StartPos of Attribute is inside a range of CPs to be ignored?
            if(    pD->pMemPos
                && pNoAttrScan
                && *pNoAttrScan
                && pD->nStartPos == nLastWhereIdxCp )
            {
                // Check if the EndPos of this Attribute is BEHIND the scope
                // of CPs to be ignored: if so  shift the StartPos accordingly!
                ULONG nOldIdx = pD->pPLCFx->GetIdx();
                pD->pPLCFx->SetIdx( nOldIdx+1 );

                const long nNASEnd = pD->nStartPos + *pNoAttrScan;

                if( nNASEnd < pD->pPLCFx->Where() )
                {
                    pD->nStartPos = nNASEnd;
                    bIgnore = TRUE;
                }

                pD->pPLCFx->SetIdx( nOldIdx );
            }

            if( !bIgnore )
            {
                next = pD->nStartPos;
                nextIdx = i;
                bStart = TRUE;
            }
        }
    }
    if( pPos )
        *pPos = next;
    nLastWhereIdxCp = next;
    if( pbStart )
        *pbStart = bStart;
    return nextIdx;
}

WW8_CP WW8PLCFMan::Where()      // gibt die CP-Pos der naechsten Attribut-Aenderung zurueck
{
    long l;
    WhereIdx( 0, &l );
    return l;
}


void WW8PLCFMan::SeekPos( long nNewCp )
{
    pChp->pPLCFx->SeekPos( nNewCp + nCpO ); // Attribute neu
    pPap->pPLCFx->SeekPos( nNewCp + nCpO ); // aufsetzen
    pFld->pPLCFx->SeekPos( nNewCp );
    if( pPcd )
        pPcd->pPLCFx->SeekPos( nNewCp + nCpO );
    if( pBkm )
        pBkm->pPLCFx->SeekPos( nNewCp + nCpO );
}


void WW8PLCFx::Save( WW8PLCFxSave1& rSave ) const
{
     rSave.nPLCFxPos    = GetIdx();
    rSave.nPLCFxPos2   = GetIdx2();
    rSave.nPLCFxMemOfs = 0;
}

void WW8PLCFx::Restore( const WW8PLCFxSave1& rSave )
{
    SetIdx(  rSave.nPLCFxPos  );
    SetIdx2( rSave.nPLCFxPos2 );
}



ULONG WW8PLCFx_Cp_FKP::GetIdx2() const
{
    return GetPCDIdx();
}

void WW8PLCFx_Cp_FKP::SetIdx2( ULONG nIdx )
{
    SetPCDIdx( nIdx );
}


void WW8PLCFx_Cp_FKP::Save( WW8PLCFxSave1& rSave ) const
{
    WW8PLCFx::Save( rSave );

    rSave.nAttrStart = nAttrStart;
    rSave.nAttrEnd   = nAttrEnd;
    rSave.bLineEnd   = bLineEnd;
}

void WW8PLCFx_Cp_FKP::Restore( const WW8PLCFxSave1& rSave )
{
    WW8PLCFx::Restore( rSave );

    nAttrStart = rSave.nAttrStart;
    nAttrEnd   = rSave.nAttrEnd;
    bLineEnd   = rSave.bLineEnd;
}


void WW8PLCFxDesc::Save( WW8PLCFxSave1& rSave ) const
{
    if( pPLCFx )
    {
        pPLCFx->Save( rSave );
        if( pPLCFx->IsSprm() )
        {
            WW8PLCFxDesc aD;
            pPLCFx->GetSprms( &aD );
            rSave.nPLCFxMemOfs = pMemPos - aD.pMemPos;
        }
    }
}

void WW8PLCFxDesc::Restore( const WW8PLCFxSave1& rSave )
{
    if( pPLCFx )
    {
        pPLCFx->Restore( rSave );
        if( pPLCFx->IsSprm() )
        {
            WW8PLCFxDesc aD;
            pPLCFx->GetSprms( &aD );
            pMemPos = aD.pMemPos + rSave.nPLCFxMemOfs;
        }
    }
}
/*
void WW8PLCFMan::Save1PLCFx( WW8PLCFxDesc* p, WW8PLCFxSave1* pSave ) const
{
    if( !p->pPLCFx )
        return;
    pSave->nPLCFxPos = p->pPLCFx->GetIdx();
    pSave->nPLCFxPos2 = p->pPLCFx->GetIdx2();
    if( p->pPLCFx->IsSprm() )
    {
        WW8PLCFxDesc aD;
        p->pPLCFx->GetSprms( &aD );
        pSave->nPLCFxMemOfs = p->pMemPos - aD.pMemPos;
    }
}

void WW8PLCFMan::Restore1PLCFx( WW8PLCFxDesc* p, WW8PLCFxSave1* pSave )
{
    if( !p->pPLCFx )
        return;
    p->pPLCFx->SetIdx( pSave->nPLCFxPos );          // restore PLCF-Pos
    p->pPLCFx->SetIdx2( pSave->nPLCFxPos2 );
    if( p->pPLCFx->IsSprm() )
    {
        WW8PLCFxDesc aD;
        p->pPLCFx->GetSprms( &aD );
        p->pMemPos = aD.pMemPos + pSave->nPLCFxMemOfs;
    }
}
*/
void WW8PLCFMan::SaveAllPLCFx( WW8PLCFxSaveAll& rSave ) const
{
    USHORT i, n=0;
    if( pPcd )
        pPcd->Save(  rSave.aS[n++] );
    if( pPcdA )
        pPcdA->Save( rSave.aS[n++] );

    for(i=0; i<nPLCF; ++i)
        if( pPcd != &aD[i] && pPcdA != &aD[i] )
            aD[i].Save( rSave.aS[n++] );
}

void WW8PLCFMan::RestoreAllPLCFx( const WW8PLCFxSaveAll& rSave )
{
    USHORT i, n=0;
    if( pPcd )
        pPcd->Restore(  rSave.aS[n++] );
    if( pPcdA )
        pPcdA->Restore( rSave.aS[n++] );

    for(i=0; i<nPLCF; ++i)
        if( pPcd != &aD[i] && pPcdA != &aD[i] )
            aD[i].Restore( rSave.aS[n++] );
}

void WW8PLCFMan::GetSprmStart( short nIdx, WW8PLCFManResult* pRes )
{
    memset( pRes, 0, sizeof( WW8PLCFManResult ) );

    // Pruefen !!!

    pRes->nMemLen = 0;

    register WW8PLCFxDesc* p = &aD[nIdx];

    if(    !*pNoAttrScan
        || (*pNoAttrScan < (p->nEndPos - p->nStartPos + 1)) )
    {
        if( p->bFirstSprm )                         // erster Sprm einer Gruppe
        {
            if( p == pPap )                         // Anfang neuer Pap ?
                pRes->nFlags |= MAN_MASK_NEW_PAP;   // dann muss Aufrufer auf neuen
                                                    // Style testen
            else if( p == pSep )                    // Anfang neuer Sep ?
                pRes->nFlags |= MAN_MASK_NEW_SEP;   // dann muss Aufrufer eine neue
                                                    // Section / Pagedesc erzeugen
        }
        pRes->pMemPos = p->pMemPos;
        pRes->nSprmId = GetId( pWwFib->nVersion, p );
        if( p->nSprmsLen )
            pRes->nMemLen = WW8GetSprmSizeBrutto( pWwFib->nVersion,
                                                pRes->pMemPos,
                                                &pRes->nSprmId ); // Laenge des akt. Sprm
    }
}

void WW8PLCFMan::GetSprmEnd( short nIdx, WW8PLCFManResult* pRes )
{
    memset( pRes, 0, sizeof( WW8PLCFManResult ) );

    register WW8PLCFxDesc* p = &aD[nIdx];

    if(    !*pNoAttrScan
        || (*pNoAttrScan < (p->nEndPos - p->nStartPos + 1)) )
    {
        if( p->pIdStk->Count() )
            pRes->nSprmId = p->pIdStk->Top();       // hole Ende-Position
        else
        {
            ASSERT( !this, "Keine Id auf dem Stack" );
            pRes->nSprmId = 0;
        }
    }
}

void WW8PLCFMan::GetNoSprmStart( short nIdx, WW8PLCFManResult* pRes )
{

    // Pruefen !!!

    register WW8PLCFxDesc* p = &aD[nIdx];
//  long nEnd;

//  p->nCp2OrIdx = p->pPLCFx->GetNoSprms( pRes->nCpPos, nEnd, pRes->nMemLen );
//  p->nCp2OrIdx = p->pPLCFx->GetNoSprms( p->nStartPos, p->nEndPos,
//                                              p->nSprmsLen );
//  GetNoSprms( nIdx );
    pRes->nCpPos = p->nStartPos;
    pRes->nMemLen = p->nSprmsLen;
    pRes->nCp2OrIdx = p->nCp2OrIdx;

    if( p == pFld )
        pRes->nSprmId = 258;
    else if( p == pFtn )
        pRes->nSprmId = 256;
    else if( p == pEdn )
        pRes->nSprmId = 257;
    else if( p == pBkm )
        pRes->nSprmId = 259;
    else if( p == pPcd )
        pRes->nSprmId = 260;
    else if( p == pAnd )
        pRes->nSprmId = 261;
    else
        pRes->nSprmId = 0;          // default: nicht gefunden
}

void WW8PLCFMan::GetNoSprmEnd( short nIdx, WW8PLCFManResult* pRes )
{

    // Pruefen !!!

    if( &aD[nIdx] == pBkm )
        pRes->nSprmId = 259;
    else if( &aD[nIdx] == pPcd )
        pRes->nSprmId = 260;
    else
        pRes->nSprmId = 0;

    pRes->nMemLen = -1;     // Ende-Kennzeichen
}


//
void WW8PLCFMan::AdvSprm( short nIdx, BOOL bStart )
{
    register WW8PLCFxDesc* p = &aD[nIdx];   // Sprm-Klasse(!) ermitteln

    p->bFirstSprm = FALSE;
    if( bStart )
    {
        USHORT nLastId = GetId( pWwFib->nVersion, p );
        p->pIdStk->Push( nLastId ); // merke Id fuer Attribut-Ende

        if( p->nSprmsLen )
        {   /*
                Pruefe, ob noch Sprm(s) abzuarbeiten sind
            */
            if( p->pMemPos )
            {
                // Laenge des letzten Sprm
                short nSprmL = WW8GetSprmSizeBrutto( pWwFib->nVersion, p->pMemPos, &nLastId );

                // Gesamtlaenge Sprms um SprmLaenge verringern
                p->nSprmsLen -= nSprmL;

                // Pos des evtl. naechsten Sprm
                if( p->nSprmsLen <= 0 )
                    p->pMemPos = 0;     // sicherheitshalber auf Null setzen, da Enden folgen!
                else
                    p->pMemPos += nSprmL;
            }
            else
                p->nSprmsLen = 0;
        }
        if( p->nSprmsLen <= 0 )
            p->nStartPos = LONG_MAX;    // es folgen Enden
    }
    else
    {
        if( p->pIdStk->Count() )
            p->pIdStk->Pop();
        if( !p->pIdStk->Count() )
        {                       // Kein weiterer Sprm auf dieser Pos ?
            (*p->pPLCFx)++;     // naechste Gruppe von Sprms
            p->pMemPos = 0;     // !!!
            GetNewSprms( *p );
            ASSERT( p->nStartPos <= p->nEndPos, "Attribut ueber Kreuz" );
        }
    }
}

void WW8PLCFMan::AdvNoSprm( short nIdx, BOOL bStart )
{

    // Pruefen !!!

    register WW8PLCFxDesc* p = &aD[nIdx];

    if( p == pPcd ){                        // NoSprm mit Ende
        if( bStart ){
            p->nStartPos = LONG_MAX;
        }else{                              // naechster NoSprm mit Ende
            (*p->pPLCFx)++;
            p->pMemPos = 0;                 // MemPos ungueltig
            GetNewNoSprms( *p );
//          p->nCp2OrIdx = p->pPLCFx->GetNoSprms( p->nStartPos, p->nEndPos,
//                                              p->nSprmsLen );
        }
    }else{                                  // NoSprm ohne Ende
        (*p->pPLCFx)++;
        p->pMemPos = 0;                     // MemPos ungueltig
        GetNewNoSprms( *p );
//      p->nCp2OrIdx = p->pPLCFx->GetNoSprms( p->nStartPos, p->nEndPos,
//                                          p->nSprmsLen );
    }
}

WW8PLCFMan& WW8PLCFMan::operator ++(int)
{
    BOOL bStart;
    short nIdx = WhereIdx( &bStart, 0 );
    if( nPLCF > nIdx )
    {
        register WW8PLCFxDesc* p = &aD[nIdx];

        p->bFirstSprm = TRUE;                       // Default

        if( p->pPLCFx->IsSprm() )
            AdvSprm( nIdx, bStart );
        else                                        // NoSprm
            AdvNoSprm( nIdx, bStart );
    }
    return *this;
}

// Rueckgabe TRUE fuer Anfang eines Attributes oder Fehler,
//           FALSE fuer Ende d. Attr
// Restliche Rueckgabewerte werden in der vom Aufrufer zu stellenden Struktur
// WW8PclxManResults geliefert.
BOOL WW8PLCFMan::Get( WW8PLCFManResult* pRes )
{
    memset( pRes, 0, sizeof( WW8PLCFManResult ) );
    BOOL bStart;
    short nIdx = WhereIdx( &bStart, 0 );

    if( nIdx < 0 ){
        ASSERT( !this, "Position nicht gefunden" );
        return TRUE;
    }

    if( aD[nIdx].pPLCFx->IsSprm() )
    {
        if( bStart )
        {
            GetSprmStart( nIdx, pRes );
            return TRUE;
        }
        else
        {
            GetSprmEnd( nIdx, pRes );
            return FALSE;
        }
    }else{
/*
        if( &aD[nIdx] == pPcd ){            // Piece-Ende
            pRes->nId = -4;
            pRes->nMemLen = ( bStart ) ? 0 : -1;
            return bStart;
        }else
*/
        if( bStart ){
            GetNoSprmStart( nIdx, pRes );
            return TRUE;
        }else{
            GetNoSprmEnd( nIdx, pRes );
            return FALSE;
        }
    }
}

USHORT WW8PLCFMan::GetColl() const
{
    if( pPap->pPLCFx ){
        return  pPap->pPLCFx->GetIstd();
    }else{
        ASSERT( !this, "GetColl ohne PLCF_Pap" );
        return 0;
    }
}

WW8PLCFx_FLD* WW8PLCFMan::GetFld() const
{
    return (WW8PLCFx_FLD*)pFld->pPLCFx;
}

BYTE* WW8PLCFMan::HasParaSprm( USHORT nId ) const
{
    return ((WW8PLCFx_Cp_FKP*)pPap->pPLCFx)->HasSprm( nId );
}

BYTE* WW8PLCFMan::HasCharSprm( USHORT nId ) const
{
    return ((WW8PLCFx_Cp_FKP*)pChp->pPLCFx)->HasSprm( nId );
}

#endif // !DUMP

//-----------------------------------------


WW8Fib::WW8Fib( SvStream& rSt, BYTE nWantedVersion,UINT32 nOffset ): nFibError( 0 )
{
    BYTE aBits1;
    BYTE aBits2;
    BYTE aVer8Bits1;    // nur ab WinWord 8 benutzt
    rSt.Seek( nOffset );
    /*
        Wunsch-Nr vermerken, File-Versionsnummer ermitteln
        und gegen Wunsch-Nr. checken !
    */
    nVersion = nWantedVersion;
    rSt >> wIdent;
    rSt >> nFib;
    rSt >> nProduct;
    if( 0 != rSt.GetError() )
    {
        INT16 nFibMin;
        INT16 nFibMax;
        switch( nVersion )  // beachte: 6 steht fuer "6 ODER 7",  7 steht fuer "NUR 7"
            {
        case 6: nFibMin = 0x0065;   // von 101 WinWord 6.0
                                                            //     102    "
                                                            // und 103 WinWord 6.0 fuer Macintosh
                                                            //     104    "
                    nFibMax = 0x0069;   // bis 105 WinWord 95
                        break;
        case 7: nFibMin = 0x0069;   // von 105 WinWord 95
                        nFibMax = 0x0069;   // bis 105 WinWord 95
                        break;
        case 8: nFibMin = 0x006A;   // von 106 WinWord 97
                        nFibMax = 0x00c1;   // bis 193 WinWord 97 (?)
                        break;
        default:nFibMin = 0;            // Programm-Fehler!
                        nFibMax = 0;
                        nFib    = 1;
                        ASSERT( !this, "Es wurde vergessen, nVersion zu kodieren!" );
        }
        if(    ( nFib < nFibMin )
            || ( nFib > nFibMax ) )
        {
            nFibError = ERR_SWG_READ_ERROR; // Error melden
            return;                         // und hopp raus!
        }
    }

    // praktische Hilfsvariablen:
    BOOL bVer67 = ((6 == nVersion) || (7 == nVersion));
    BOOL bVer8  =  (8 == nVersion);

    // Hilfs-Varis fuer Ver67:
    INT16 pnChpFirst_Ver67;
    INT16 pnPapFirst_Ver67;
    INT16 cpnBteChp_Ver67;
    INT16 cpnBtePap_Ver67;

    // und auf gehts: FIB einlesen
    rSt >> lid;
    rSt >> pnNext;
    rSt >> aBits1;
    rSt >> aBits2;
    rSt >> nFibBack;
    rSt >> lKey1;
    rSt >> lKey2;
    rSt >> envr;
    rSt >> aVer8Bits1;      // unter Ver67  nur leeres Reservefeld
                // Inhalt von aVer8Bits1
                //
                // BYTE fMac              :1;
                // BYTE fEmptySpecial     :1;
                // BYTE fLoadOverridePage :1;
                // BYTE fFuturesavedUndo  :1;
                // BYTE fWord97Saved      :1;
                // BYTE :3;
    rSt >> chse;
    rSt >> chseTables;
    rSt >> fcMin;
    rSt >> fcMac;

// Einschub fuer WW8 *****************************************************
    if( !bVer67 )
    {
        rSt >> csw;

        // Marke: "rgsw"  Beginning of the array of shorts
        rSt >> wMagicCreated;
        rSt >> wMagicRevised;
        rSt >> wMagicCreatedPrivate;
        rSt >> wMagicRevisedPrivate;
        rSt.SeekRel( 9 * sizeof( INT16 ) );

        /*
        // dies sind die 9 unused Felder:
        && (bVer67 || WW8ReadINT16(  rSt, pnFbpChpFirst_W6          ))  // 1
        && (bVer67 || WW8ReadINT16(  rSt, pnChpFirst_W6                 ))  // 2
        && (bVer67 || WW8ReadINT16(  rSt, cpnBteChp_W6                  ))  // 3
        && (bVer67 || WW8ReadINT16(  rSt, pnFbpPapFirst_W6          ))  // 4
        && (bVer67 || WW8ReadINT16(  rSt, pnPapFirst_W6                 ))  // 5
        && (bVer67 || WW8ReadINT16(  rSt, cpnBtePap_W6                  ))  // 6
        && (bVer67 || WW8ReadINT16(  rSt, pnFbpLvcFirst_W6          ))  // 7
        && (bVer67 || WW8ReadINT16(  rSt, pnLvcFirst_W6                 ))  // 8
        && (bVer67 || WW8ReadINT16(  rSt, cpnBteLvc_W6                  ))  // 9
        */
        rSt >> lidFE;
        rSt >> clw;
    }

// Ende des Einschubs fuer WW8 *******************************************

        // Marke: "rglw"  Beginning of the array of longs
    rSt >> cbMac;

        // 2 Longs uebergehen, da unwichtiger Quatsch
    rSt.SeekRel( 2 * sizeof( INT32) );

        // weitere 2 Longs nur bei Ver67 ueberspringen
    if( bVer67 )
        rSt.SeekRel( 2 * sizeof( INT32) );

    rSt >> ccpText;
    rSt >> ccpFtn;
    rSt >> ccpHdr;
    rSt >> ccpMcr;
    rSt >> ccpAtn;
    rSt >> ccpEdn;
    rSt >> ccpTxbx;
    rSt >> ccpHdrTxbx;

        // weiteres Long nur bei Ver67 ueberspringen
    if( bVer67 )
        rSt.SeekRel( 1 * sizeof( INT32) );
    else
    {
// Einschub fuer WW8 *****************************************************
        rSt >> pnFbpChpFirst;
        rSt >> pnChpFirst;
        rSt >> cpnBteChp;
        rSt >> pnFbpPapFirst;
        rSt >> pnPapFirst;
        rSt >> cpnBtePap;
        rSt >> pnFbpLvcFirst;
        rSt >> pnLvcFirst;
        rSt >> cpnBteLvc;
        rSt >> fcIslandFirst;
        rSt >> fcIslandLim;
        rSt >> cfclcb;
    }

// Ende des Einschubs fuer WW8 *******************************************

        // Marke: "rgfclcb" Beginning of array of FC/LCB pairs.
    rSt >> fcStshfOrig;
    rSt >> lcbStshfOrig;
    rSt >> fcStshf;
    rSt >> lcbStshf;
    rSt >> fcPlcffndRef;
    rSt >> lcbPlcffndRef;
    rSt >> fcPlcffndTxt;
    rSt >> lcbPlcffndTxt;
    rSt >> fcPlcfandRef;
    rSt >> lcbPlcfandRef;
    rSt >> fcPlcfandTxt;
    rSt >> lcbPlcfandTxt;
    rSt >> fcPlcfsed;
    rSt >> lcbPlcfsed;
    rSt >> fcPlcfpad;
    rSt >> lcbPlcfpad;
    rSt >> fcPlcfphe;
    rSt >> lcbPlcfphe;
    rSt >> fcSttbfglsy;
    rSt >> lcbSttbfglsy;
    rSt >> fcPlcfglsy;
    rSt >> lcbPlcfglsy;
    rSt >> fcPlcfhdd;
    rSt >> lcbPlcfhdd;
    rSt >> fcPlcfbteChpx;
    rSt >> lcbPlcfbteChpx;
    rSt >> fcPlcfbtePapx;
    rSt >> lcbPlcfbtePapx;
    rSt >> fcPlcfsea;
    rSt >> lcbPlcfsea;
    rSt >> fcSttbfffn;
    rSt >> lcbSttbfffn;
    rSt >> fcPlcffldMom;
    rSt >> lcbPlcffldMom;
    rSt >> fcPlcffldHdr;
    rSt >> lcbPlcffldHdr;
    rSt >> fcPlcffldFtn;
    rSt >> lcbPlcffldFtn;
    rSt >> fcPlcffldAtn;
    rSt >> lcbPlcffldAtn;
    rSt >> fcPlcffldMcr;
    rSt >> lcbPlcffldMcr;
    rSt >> fcSttbfbkmk;
    rSt >> lcbSttbfbkmk;
    rSt >> fcPlcfbkf;
    rSt >> lcbPlcfbkf;
    rSt >> fcPlcfbkl;
    rSt >> lcbPlcfbkl;
    rSt >> fcCmds;
    rSt >> lcbCmds;
    rSt >> fcPlcfmcr;
    rSt >> lcbPlcfmcr;
    rSt >> fcSttbfmcr;
    rSt >> lcbSttbfmcr;
    rSt >> fcPrDrvr;
    rSt >> lcbPrDrvr;
    rSt >> fcPrEnvPort;
    rSt >> lcbPrEnvPort;
    rSt >> fcPrEnvLand;
    rSt >> lcbPrEnvLand;
    rSt >> fcWss;
    rSt >> lcbWss;
    rSt >> fcDop;
    rSt >> lcbDop;
    rSt >> fcSttbfAssoc;
    rSt >> cbSttbfAssoc;
    rSt >> fcClx;
    rSt >> lcbClx;
    rSt >> fcPlcfpgdFtn;
    rSt >> lcbPlcfpgdFtn;
    rSt >> fcAutosaveSource;
    rSt >> lcbAutosaveSource;
    rSt >> fcGrpStAtnOwners;
    rSt >> lcbGrpStAtnOwners;
    rSt >> fcSttbfAtnbkmk;
    rSt >> lcbSttbfAtnbkmk;

        // weiteres short nur bei Ver67 ueberspringen
    if( bVer67 )
    {
        rSt.SeekRel( 1*sizeof( INT16) );

        // folgende 4 Shorts existieren nur bei Ver67;
        rSt >> pnChpFirst_Ver67;
        rSt >> pnPapFirst_Ver67;
        rSt >> cpnBteChp_Ver67;
        rSt >> cpnBtePap_Ver67;
    }

    rSt >> fcPlcfdoaMom;
    rSt >> lcbPlcfdoaMom;
    rSt >> fcPlcfdoaHdr;
    rSt >> lcbPlcfdoaHdr;
    rSt >> fcPlcfspaMom;
    rSt >> lcbPlcfspaMom;
    rSt >> fcPlcfspaHdr;
    rSt >> lcbPlcfspaHdr;

    rSt >> fcPlcfAtnbkf;
    rSt >> lcbPlcfAtnbkf;
    rSt >> fcPlcfAtnbkl;
    rSt >> lcbPlcfAtnbkl;
    rSt >> fcPms;
    rSt >> lcbPMS;
    rSt >> fcFormFldSttbf;
    rSt >> lcbFormFldSttbf;
    rSt >> fcPlcfendRef;
    rSt >> lcbPlcfendRef;
    rSt >> fcPlcfendTxt;
    rSt >> lcbPlcfendTxt;
    rSt >> fcPlcffldEdn;
    rSt >> lcbPlcffldEdn;
    rSt >> fcPlcfpgdEdn;
    rSt >> lcbPlcfpgdEdn;
    rSt >> fcDggInfo;
    rSt >> lcbDggInfo;
    rSt >> fcSttbfRMark;
    rSt >> lcbSttbfRMark;
    rSt >> fcSttbfCaption;
    rSt >> lcbSttbfCaption;
    rSt >> fcSttbAutoCaption;
    rSt >> lcbSttbAutoCaption;
    rSt >> fcPlcfwkb;
    rSt >> lcbPlcfwkb;
    rSt >> fcPlcfspl;
    rSt >> lcbPlcfspl;
    rSt >> fcPlcftxbxTxt;
    rSt >> lcbPlcftxbxTxt;
    rSt >> fcPlcffldTxbx;
    rSt >> lcbPlcffldTxbx;
    rSt >> fcPlcfHdrtxbxTxt;
    rSt >> lcbPlcfHdrtxbxTxt;
    rSt >> fcPlcffldHdrTxbx;
    rSt >> lcbPlcffldHdrTxbx;

    if( 0 == rSt.GetError() )
    {
        // Bit-Flags setzen
        fDot        =   aBits1 & 0x01       ;
        fGlsy       = ( aBits1 & 0x02 ) >> 1;
        fComplex    = ( aBits1 & 0x04 ) >> 2;
        fHasPic     = ( aBits1 & 0x08 ) >> 3;
        cQuickSaves = ( aBits1 & 0xf0 ) >> 4;
        fEncrypted  =   aBits2 & 0x01       ;
        fWhichTblStm= ( aBits2 & 0x02 ) >> 1;
        // dummy    = ( aBits2 & 0x0e ) >> 1;
        fExtChar    = ( aBits2 & 0x10 ) >> 4;
        // dummy    = ( aBits2 & 0xe0 ) >> 5;

        /*
            ggfs. Ziel-Varaiblen, aus xxx_Ver67 fuellen
            oder Flags setzen
        */
        if( bVer67 )
        {
            pnChpFirst = pnChpFirst_Ver67;
            pnPapFirst = pnPapFirst_Ver67;
            cpnBteChp  = cpnBteChp_Ver67;
            cpnBtePap  = cpnBtePap_Ver67;
        }
        else if( bVer8 )
        {
          fMac              =   aVer8Bits1  & 0x01           ;
          fEmptySpecial     = ( aVer8Bits1  & 0x02 ) >> 1;
          fLoadOverridePage = ( aVer8Bits1  & 0x04 ) >> 2;
          fFuturesavedUndo  = ( aVer8Bits1  & 0x08 ) >> 3;
          fWord97Saved      = ( aVer8Bits1  & 0x10 ) >> 4;

            /*
                speziell fuer WW8:
                ermittle die Werte fuer PLCF LST und PLF LFO
                und PLCF fuer TextBox-Break-Deskriptoren
            */
            long nOldPos = rSt.Tell();
            rSt.Seek( 0x02e2 );
            rSt >> fcPlcfLst;
            rSt >> lcbPlcfLst;
            rSt >> fcPlfLfo;
            rSt >> lcbPlfLfo;
            rSt >> fcPlcftxbxBkd;
            rSt >> lcbPlcftxbxBkd;
            rSt >> fcPlcfHdrtxbxBkd;
            rSt >> lcbPlcfHdrtxbxBkd;
            if( 0 != rSt.GetError() )
            {
                nFibError = ERR_SWG_READ_ERROR;
            }

            rSt.Seek( 0x372 );          // fcSttbListNames
            rSt >>  fcSttbListNames;
            rSt >> lcbSttbListNames;
            if( 0 != rSt.GetError() )
                nFibError = ERR_SWG_READ_ERROR;

            rSt.Seek( nOldPos );
        }
    }
    else
    {
        nFibError = ERR_SWG_READ_ERROR;     // Error melden
    }
}


WW8Fib::WW8Fib( BYTE nVer )
{
    memset( this, 0, sizeof( *this ));
    nVersion = nVer;
    if( 8 == nVer )
    {
        fcMin = 0x400;
        wIdent = 0xa5ec;
        nFib = nFibBack = 0xc1;
        nProduct = 0x49;

        csw = 0x0e;     // muss das sein ???
        cfclcb = 0x5d;  //      -""-
        clw = 0x16;     //      -""-
        pnFbpChpFirst = pnFbpPapFirst = pnFbpLvcFirst = 0x000fffff;
        fExtChar = TRUE;

// diese Flags muessen nicht gesetzt werden; koennen aber.
//      wMagicCreated = wMagicRevised = 0x6a62;
//      wMagicCreatedPrivate = wMagicRevisedPrivate = 0xb3b2;
//      fWord97Saved = TRUE;
    }
    else
    {
        fcMin = 0x300;
        wIdent = 0xa5dc;
        nFib = nFibBack = 0x65;
        nProduct = 0xc02d;
    }

    lid = 0x407;
}


BOOL WW8Fib::Write( SvStream& rStrm )
{
    BYTE* pData = new BYTE[ fcMin ];
    BYTE* pDataPtr = pData;
    memset( pData, 0, fcMin );

    BOOL bVer8 = 8 == nVersion;

    ULONG nPos = rStrm.Tell();
    cbMac = rStrm.Seek( STREAM_SEEK_TO_END );
    rStrm.Seek( nPos );

    Set_UInt16( pData, wIdent );
    Set_UInt16( pData, nFib );
    Set_UInt16( pData, nProduct );
    Set_UInt16( pData, lid );
    Set_UInt16( pData, pnNext );

    UINT16 nBits16 = 0;
    if( fDot )          nBits16 |= 0x0001;
    if( fGlsy)          nBits16 |= 0x0002;
    if( fComplex )      nBits16 |= 0x0004;
    if( fHasPic )       nBits16 |= 0x0008;
    nBits16 |= (0xf0 & ( cQuickSaves << 4 ));
    if( fEncrypted )    nBits16 |= 0x0100;
    if( fWhichTblStm )  nBits16 |= 0x0200;
    if( fExtChar )      nBits16 |= 0x1000;
    Set_UInt16( pData, nBits16 );

    Set_UInt16( pData, nFibBack );
    Set_UInt16( pData, lKey1 );
    Set_UInt16( pData, lKey2 );
    Set_UInt8( pData, envr );

    BYTE nBits8 = 0;
    if( bVer8 )
    {
        if( fMac )                  nBits8 |= 0x0001;
        if( fEmptySpecial )         nBits8 |= 0x0002;
        if( fLoadOverridePage )     nBits8 |= 0x0004;
        if( fFuturesavedUndo )      nBits8 |= 0x0008;
        if( fWord97Saved )          nBits8 |= 0x0010;
    }
    Set_UInt8( pData, nBits8  );                // unter Ver67  nur leeres Reservefeld

    Set_UInt16( pData, chse );
    Set_UInt16( pData, chseTables );
    Set_UInt32( pData, fcMin );
    Set_UInt32( pData, fcMac );

// Einschub fuer WW8 *****************************************************

        // Marke: "rgsw"  Beginning of the array of shorts
    if( bVer8 )
    {
        Set_UInt16( pData, csw );
        Set_UInt16( pData, wMagicCreated );
        Set_UInt16( pData, wMagicRevised );
        Set_UInt16( pData, wMagicCreatedPrivate );
        Set_UInt16( pData, wMagicRevisedPrivate );
        pData += 9 * sizeof( INT16 );
        Set_UInt16( pData, lidFE );
        Set_UInt16( pData, clw );
    }

// Ende des Einschubs fuer WW8 *******************************************

        // Marke: "rglw"  Beginning of the array of longs
    Set_UInt32( pData, cbMac );

    // 2 Longs uebergehen, da unwichtiger Quatsch
    pData += 2 * sizeof( INT32);

        // weitere 2 Longs nur bei Ver67 ueberspringen
    if( !bVer8 ) pData += 2 * sizeof( INT32);

    Set_UInt32( pData, ccpText );
    Set_UInt32( pData, ccpFtn );
    Set_UInt32( pData, ccpHdr );
    Set_UInt32( pData, ccpMcr );
    Set_UInt32( pData, ccpAtn );
    Set_UInt32( pData, ccpEdn );
    Set_UInt32( pData, ccpTxbx );
    Set_UInt32( pData, ccpHdrTxbx );

        // weiteres Long nur bei Ver67 ueberspringen
    if( !bVer8 ) pData += 1 * sizeof( INT32);

// Einschub fuer WW8 *****************************************************
    if( bVer8 )
    {
        Set_UInt32( pData, pnFbpChpFirst );
        Set_UInt32( pData, pnChpFirst );
        Set_UInt32( pData, cpnBteChp );
        Set_UInt32( pData, pnFbpPapFirst );
        Set_UInt32( pData, pnPapFirst );
        Set_UInt32( pData, cpnBtePap );
        Set_UInt32( pData, pnFbpLvcFirst );
        Set_UInt32( pData, pnLvcFirst );
        Set_UInt32( pData, cpnBteLvc );
        Set_UInt32( pData, fcIslandFirst );
        Set_UInt32( pData, fcIslandLim );
        Set_UInt16( pData, cfclcb );
    }
// Ende des Einschubs fuer WW8 *******************************************

        // Marke: "rgfclcb" Beginning of array of FC/LCB pairs.
    Set_UInt32( pData, fcStshfOrig );
    Set_UInt32( pData, lcbStshfOrig );
    Set_UInt32( pData, fcStshf );
    Set_UInt32( pData, lcbStshf );
    Set_UInt32( pData, fcPlcffndRef );
    Set_UInt32( pData, lcbPlcffndRef );
    Set_UInt32( pData, fcPlcffndTxt );
    Set_UInt32( pData, lcbPlcffndTxt );
    Set_UInt32( pData, fcPlcfandRef );
    Set_UInt32( pData, lcbPlcfandRef );
    Set_UInt32( pData, fcPlcfandTxt );
    Set_UInt32( pData, lcbPlcfandTxt );
    Set_UInt32( pData, fcPlcfsed );
    Set_UInt32( pData, lcbPlcfsed );
    Set_UInt32( pData, fcPlcfpad );
    Set_UInt32( pData, lcbPlcfpad );
    Set_UInt32( pData, fcPlcfphe );
    Set_UInt32( pData, lcbPlcfphe );
    Set_UInt32( pData, fcSttbfglsy );
    Set_UInt32( pData, lcbSttbfglsy );
    Set_UInt32( pData, fcPlcfglsy );
    Set_UInt32( pData, lcbPlcfglsy );
    Set_UInt32( pData, fcPlcfhdd );
    Set_UInt32( pData, lcbPlcfhdd );
    Set_UInt32( pData, fcPlcfbteChpx );
    Set_UInt32( pData, lcbPlcfbteChpx );
    Set_UInt32( pData, fcPlcfbtePapx );
    Set_UInt32( pData, lcbPlcfbtePapx );
    Set_UInt32( pData, fcPlcfsea );
    Set_UInt32( pData, lcbPlcfsea );
    Set_UInt32( pData, fcSttbfffn );
    Set_UInt32( pData, lcbSttbfffn );
    Set_UInt32( pData, fcPlcffldMom );
    Set_UInt32( pData, lcbPlcffldMom );
    Set_UInt32( pData, fcPlcffldHdr );
    Set_UInt32( pData, lcbPlcffldHdr );
    Set_UInt32( pData, fcPlcffldFtn );
    Set_UInt32( pData, lcbPlcffldFtn );
    Set_UInt32( pData, fcPlcffldAtn );
    Set_UInt32( pData, lcbPlcffldAtn );
    Set_UInt32( pData, fcPlcffldMcr );
    Set_UInt32( pData, lcbPlcffldMcr );
    Set_UInt32( pData, fcSttbfbkmk );
    Set_UInt32( pData, lcbSttbfbkmk );
    Set_UInt32( pData, fcPlcfbkf );
    Set_UInt32( pData, lcbPlcfbkf );
    Set_UInt32( pData, fcPlcfbkl );
    Set_UInt32( pData, lcbPlcfbkl );
    Set_UInt32( pData, fcCmds );
    Set_UInt32( pData, lcbCmds );
    Set_UInt32( pData, fcPlcfmcr );
    Set_UInt32( pData, lcbPlcfmcr );
    Set_UInt32( pData, fcSttbfmcr );
    Set_UInt32( pData, lcbSttbfmcr );
    Set_UInt32( pData, fcPrDrvr );
    Set_UInt32( pData, lcbPrDrvr );
    Set_UInt32( pData, fcPrEnvPort );
    Set_UInt32( pData, lcbPrEnvPort );
    Set_UInt32( pData, fcPrEnvLand );
    Set_UInt32( pData, lcbPrEnvLand );
    Set_UInt32( pData, fcWss );
    Set_UInt32( pData, lcbWss );
    Set_UInt32( pData, fcDop );
    Set_UInt32( pData, lcbDop );
    Set_UInt32( pData, fcSttbfAssoc );
    Set_UInt32( pData, cbSttbfAssoc );
    Set_UInt32( pData, fcClx );
    Set_UInt32( pData, lcbClx );
    Set_UInt32( pData, fcPlcfpgdFtn );
    Set_UInt32( pData, lcbPlcfpgdFtn );
    Set_UInt32( pData, fcAutosaveSource );
    Set_UInt32( pData, lcbAutosaveSource );
    Set_UInt32( pData, fcGrpStAtnOwners );
    Set_UInt32( pData, lcbGrpStAtnOwners );
    Set_UInt32( pData, fcSttbfAtnbkmk );
    Set_UInt32( pData, lcbSttbfAtnbkmk );

        // weiteres short nur bei Ver67 ueberspringen
    if( !bVer8 )
    {
        pData += 1*sizeof( INT16);
        Set_UInt16( pData, (UINT16)pnChpFirst );
        Set_UInt16( pData, (UINT16)pnPapFirst );
        Set_UInt16( pData, (UINT16)cpnBteChp );
        Set_UInt16( pData, (UINT16)cpnBtePap );
    }

    Set_UInt32( pData, fcPlcfdoaMom ); // nur bei Ver67, in Ver8 unused
    Set_UInt32( pData, lcbPlcfdoaMom ); // nur bei Ver67, in Ver8 unused
    Set_UInt32( pData, fcPlcfdoaHdr ); // nur bei Ver67, in Ver8 unused
    Set_UInt32( pData, lcbPlcfdoaHdr ); // nur bei Ver67, in Ver8 unused

    Set_UInt32( pData, fcPlcfspaMom ); // in Ver67 leere Reserve
    Set_UInt32( pData, lcbPlcfspaMom ); // in Ver67 leere Reserve
    Set_UInt32( pData, fcPlcfspaHdr ); // in Ver67 leere Reserve
    Set_UInt32( pData, lcbPlcfspaHdr ); // in Ver67 leere Reserve

    Set_UInt32( pData, fcPlcfAtnbkf );
    Set_UInt32( pData, lcbPlcfAtnbkf );
    Set_UInt32( pData, fcPlcfAtnbkl );
    Set_UInt32( pData, lcbPlcfAtnbkl );
    Set_UInt32( pData, fcPms );
    Set_UInt32( pData, lcbPMS );
    Set_UInt32( pData, fcFormFldSttbf );
    Set_UInt32( pData, lcbFormFldSttbf );
    Set_UInt32( pData, fcPlcfendRef );
    Set_UInt32( pData, lcbPlcfendRef );
    Set_UInt32( pData, fcPlcfendTxt );
    Set_UInt32( pData, lcbPlcfendTxt );
    Set_UInt32( pData, fcPlcffldEdn );
    Set_UInt32( pData, lcbPlcffldEdn );
    Set_UInt32( pData, fcPlcfpgdEdn );
    Set_UInt32( pData, lcbPlcfpgdEdn );
    Set_UInt32( pData, fcDggInfo ); // in Ver67 leere Reserve
    Set_UInt32( pData, lcbDggInfo ); // in Ver67 leere Reserve
    Set_UInt32( pData, fcSttbfRMark );
    Set_UInt32( pData, lcbSttbfRMark );
    Set_UInt32( pData, fcSttbfCaption );
    Set_UInt32( pData, lcbSttbfCaption );
    Set_UInt32( pData, fcSttbAutoCaption );
    Set_UInt32( pData, lcbSttbAutoCaption );
    Set_UInt32( pData, fcPlcfwkb );
    Set_UInt32( pData, lcbPlcfwkb );
    Set_UInt32( pData, fcPlcfspl ); // in Ver67 leere Reserve
    Set_UInt32( pData, lcbPlcfspl ); // in Ver67 leere Reserve
    Set_UInt32( pData, fcPlcftxbxTxt );
    Set_UInt32( pData, lcbPlcftxbxTxt );
    Set_UInt32( pData, fcPlcffldTxbx );
    Set_UInt32( pData, lcbPlcffldTxbx );
    Set_UInt32( pData, fcPlcfHdrtxbxTxt );
    Set_UInt32( pData, lcbPlcfHdrtxbxTxt );
    Set_UInt32( pData, fcPlcffldHdrTxbx );
    Set_UInt32( pData, lcbPlcffldHdrTxbx );

    if( bVer8 )
    {
        pData += 0x2e2 - 0x27a;             // Pos + Offset (fcPlcfLst - fcStwUser)
        Set_UInt32( pData, fcPlcfLst );
        Set_UInt32( pData, lcbPlcfLst );
        Set_UInt32( pData, fcPlfLfo );
        Set_UInt32( pData, lcbPlfLfo );
        Set_UInt32( pData, fcPlcftxbxBkd );
        Set_UInt32( pData, lcbPlcftxbxBkd );
        Set_UInt32( pData, fcPlcfHdrtxbxBkd );
        Set_UInt32( pData, lcbPlcfHdrtxbxBkd );

        pData += 0x372 - 0x302;             // Pos + Offset (fcSttbListNames - fcDocUndo)
        Set_UInt32( pData, fcSttbListNames );
        Set_UInt32( pData, lcbSttbListNames );
    }

    rStrm.Write( pDataPtr, fcMin );
    delete pDataPtr;
    return 0 == rStrm.GetError();
}

WW8Style::WW8Style( SvStream& rStream, WW8Fib& rFibPara ): rSt( rStream ), rFib( rFibPara )
{
    nStyleStart = rFib.fcStshf;
    nStyleLen   = rFib.lcbStshf;

    rSt.Seek( nStyleStart );

    USHORT cbStshi = 0; //  2 bytes size of the following STSHI structure

    // alte Version ?
    if ( rFib.nFib < 67 )
    {
        cbStshi = 4;    // -> Laengenfeld fehlt
    }
    else    // neue Version:
        // lies die Laenge der in der Datei gespeicherten Struktur
        rSt >> cbStshi;

    UINT16 nRead = cbStshi;
    do
    {
        UINT16 a16Bit;

        if(  2 > nRead ) break;
        rSt >> cstd;

        if(  4 > nRead ) break;
        rSt >> cbSTDBaseInFile;

        if(  6 > nRead ) break;
        rSt >> a16Bit;
        fStdStylenamesWritten = a16Bit & 0x0001;

        if(  8 > nRead ) break;
        rSt >> stiMaxWhenSaved;

        if( 10 > nRead ) break;
        rSt >> istdMaxFixedWhenSaved;

        if( 12 > nRead ) break;
        rSt >> nVerBuiltInNamesWhenSaved;

        if( 14 > nRead ) break;
        rSt >> ftcStandardChpStsh;

        // ggfs. den Rest ueberlesen
        if( 14 < nRead )
            rSt.SeekRel( nRead-14 );
    }
    while( !this ); // Trick: obiger Block wird genau einmal durchlaufen
                                    //   und kann vorzeitig per "break" verlassen werden.

    if( 0 != rSt.GetError() )
    {
        // wie denn nun den Error melden?
    }
}


// Read1STDFixed() liest ein Style ein. Wenn der Style vollstaendig vorhanden
// ist, d.h. kein leerer Slot, dann wird Speicher alloziert und ein Pointer auf
// die ( evtl. mit Nullen aufgefuellten ) STD geliefert. Ist es ein leerer
// Slot, dann wird ein Nullpointer zurueckgeliefert.
WW8_STD* WW8Style::Read1STDFixed( short& rSkip, short* pcbStd )
{
    WW8_STD* pStd = (WW8_STD*)0;

    UINT16 cbStd;
    rSt >> cbStd;   // lies Laenge

    UINT16 nRead = cbSTDBaseInFile;
    if( cbStd >= cbSTDBaseInFile ){ // Fixed part vollst. vorhanden

        // read fixed part of STD
        pStd = new WW8_STD;
        memset( pStd, 0, sizeof( *pStd ) );

        do
        {
            UINT16 a16Bit;

            if( 2 > nRead ) break;
            rSt >> a16Bit;
            pStd->sti          =        a16Bit & 0x0fff  ;
            pStd->fScratch     = 0 != ( a16Bit & 0x1000 );
            pStd->fInvalHeight = 0 != ( a16Bit & 0x2000 );
            pStd->fHasUpe      = 0 != ( a16Bit & 0x4000 );
            pStd->fMassCopy    = 0 != ( a16Bit & 0x8000 );

            if( 4 > nRead ) break;
            rSt >> a16Bit;
            pStd->sgc      =   a16Bit & 0x000f       ;
            pStd->istdBase = ( a16Bit & 0xfff0 ) >> 4;

            if( 6 > nRead ) break;
            rSt >> a16Bit;
            pStd->cupx     =   a16Bit & 0x000f       ;
            pStd->istdNext = ( a16Bit & 0xfff0 ) >> 4;

            if( 8 > nRead ) break;
            rSt >> pStd->bchUpe;

            // ab Ver8 sollten diese beiden Felder dazukommen:
            if(10 > nRead ) break;
            rSt >> a16Bit;
            pStd->fAutoRedef =   a16Bit & 0x0001       ;
            pStd->fHidden    = ( a16Bit & 0x0002 ) >> 2;

            // man kann nie wissen: vorsichtshalber ueberlesen
            // wir eventuelle Fuellsel, die noch zum BASE-Part gehoeren...
            if( 10 < nRead )
                rSt.SeekRel( nRead-10 );
        }
        while( !this ); // Trick: obiger Block wird genau einmal durchlaufen
                                        //   und kann vorzeitig per "break" verlassen werden.

        if(    (0 != rSt.GetError())
            || !nRead )
            DELETEZ( pStd );        // per NULL den Error melden

      rSkip = cbStd - cbSTDBaseInFile;
    }
    else
    {           // Fixed part zu kurz
        if( cbStd )
            rSt.SeekRel( cbStd );           // ueberlies Reste
        rSkip = 0;
    }
    if( pcbStd )
        *pcbStd = cbStd;
    return pStd;
}

WW8_STD* WW8Style::Read1Style( short& rSkip, String* pString, short* pcbStd )
{
    // OS2, or WIN with Mac-Doc,...
    // Attention: MacWord-Documents have their Stylenames
    // always in ANSI, even if eStructCharSet == CHARSET_MAC !!

    WW8_STD* pStd;

    pStd = Read1STDFixed( rSkip, pcbStd );          // lese STD

    // String gewuenscht ?
    if( pString )
    {   // echter Style ?
        if ( pStd )
        {

            switch( rFib.nVersion ) // beachte: 6 steht fuer "6 ODER 7",  7 steht fuer "NUR 7"
            {
            case 6:
            case 7: // lies Pascal-String
                            *pString = WW8ReadPString( rSt,
                                                    RTL_TEXTENCODING_MS_1252 );
                                        // leading len and trailing zero --> 2
                            rSkip   -= 2+ pString->Len();
                            break;
            case 8: // lies Unicode-String mit fuehrendem Laengenbyte and trailing zero
                            *pString = WW8Read_xstz( rSt, 0, TRUE );
                            rSkip   -= (pString->Len() + 2) * 2;
                            break;
            default:ASSERT( !this, "Es wurde vergessen, nVersion zu kodieren!" );
            }

        }
        else
            *pString = aEmptyStr;   // Kann keinen Namen liefern
    }
    return pStd;
}


//-----------------------------------------


struct WW8_FFN_Ver6 : public WW8_FFN_BASE
{
    // ab Ver6
    sal_Char szFfn[65]; // 0x6 bzw. 0x40 ab Ver8 zero terminated string that
                        // records name of font.
                        // Maximal size of szFfn is 65 characters.
                        // Vorsicht: Dieses Array kann auch kleiner sein!!!
                        // Possibly followed by a second sz which records the
                        // name of an alternate font to use if the first named
                        // font does not exist on this system.
};
struct WW8_FFN_Ver8 : public WW8_FFN_BASE
{
    // ab Ver8 sind folgende beiden Felder eingeschoben,
    // werden von uns ignoriert.
    sal_Char panose[ 10 ];  //  0x6   PANOSE
    sal_Char fs[ 24     ];  //  0x10  FONTSIGNATURE

    // ab Ver8 als Unicode
    UINT16 szFfn[65];// 0x6 bzw. 0x40 ab Ver8 zero terminated string that
                                        // records name of font.
                                        // Maximal size of szFfn is 65 characters.
                                        // Vorsicht: Dieses Array kann auch kleiner sein!!!
                                        // Possibly followed by a second sz which records the
                                        // name of an alternate font to use if the first named
                                        // font does not exist on this system.
};


WW8Fonts::WW8Fonts( SvStream& rSt, WW8Fib& rFib )
{
    // OS2, or WIN with Mac-Doc,...
    // Attention: MacWord-Documents have their Fontnames
    // always in ANSI, even if eStructCharSet == CHARSET_MAC !!
    if( rFib.lcbSttbfffn <= 2 )
    {
        ASSERT( !this, "Fonttabelle kaputt! (rFib.lcbSttbfffn < 2)" );
        pFontA = 0;
        nMax = 0;
        return;
    }

    BOOL bVer67 = (8 > rFib.nVersion);

    rSt.Seek( rFib.fcSttbfffn );

    // allocate Font Array
    BYTE* pA   = new BYTE[ rFib.lcbSttbfffn - 2 ];
    WW8_FFN* p = (WW8_FFN*)pA;

    if( !bVer67 )
    {
        // bVer8: read the count of strings in nMax
        rSt >> nMax;
    }

    // Ver8:  skip undefined uint16
    // Ver67: skip the herein stored total byte of structure
    //        - we already got that information in rFib.lcbSttbfffn
    rSt.SeekRel( 2 );

    // read all font information
    rSt.Read( pA, rFib.lcbSttbfffn - 2 );

    if( bVer67 )
    {
        // try to figure out how many fonts are defined here
        nMax = 0;
        long nLeft = rFib.lcbSttbfffn - 2;
        for(;;)
        {
            short nNextSiz;

            nNextSiz = p->cbFfnM1 + 1;
            if( nNextSiz > nLeft )
                break;
            nMax++;
            nLeft -= nNextSiz;
            if( nLeft < 1 )     // can we read the given ammount of bytes ?
                break;
            // increase p by nNextSiz Bytes
            p = (WW8_FFN *)( ( (BYTE*)p ) + nNextSiz );
        }
    }

    if( nMax )
    {
        // allocate Index Array
        pFontA = new WW8_FFN[ nMax ];
        p = pFontA;

        if( bVer67 )
        {
            WW8_FFN_Ver6* pVer6 = (WW8_FFN_Ver6*)pA;
            for(USHORT i=0; i<nMax; ++i, ++p)
            {
                p->cbFfnM1   = pVer6->cbFfnM1;
                p->prg       = pVer6->prg;
                p->fTrueType = pVer6->fTrueType;
                p->ff        = pVer6->ff;
                p->wWeight   = SVBT16ToShort( *(SVBT16*)&pVer6->wWeight );
                p->chs       = pVer6->chs;
                p->ibszAlt   = pVer6->ibszAlt;
                p->sFontname = String( pVer6->szFfn, RTL_TEXTENCODING_MS_1252 );
                pVer6 = (WW8_FFN_Ver6*)(  ((BYTE*)pVer6)
                                        + pVer6->cbFfnM1 + 1 );
            }
        }
        else
        {
            WW8_FFN_Ver8* pVer8 = (WW8_FFN_Ver8*)pA;
            BYTE c2;
            for(USHORT i=0; i<nMax; ++i, ++p)
            {
                p->cbFfnM1   = pVer8->cbFfnM1;
                c2           = *(((BYTE*)pVer8) + 1);

                p->prg       =  c2 & 0x02;
                p->fTrueType = (c2 & 0x04) >> 2;
                // ein Reserve-Bit ueberspringen
                p->ff        = (c2 & 0x70) >> 4;

                p->wWeight   = SVBT16ToShort( *(SVBT16*)&pVer8->wWeight );
                p->chs       = pVer8->chs;
                p->ibszAlt   = pVer8->ibszAlt;

#ifdef __WW8_NEEDS_COPY
                {
                    for(UINT16* pTmp = pVer8->szFfn; *pTmp; ++pTmp )
                        *pTmp = SVBT16ToShort( *(SVBT16*)pTmp );
                }
#endif // defined __WW8_NEEDS_COPY

                p->sFontname = pVer8->szFfn;

                // Zeiger auf Ursprungsarray einen Font nach hinten setzen
                pVer8 = (WW8_FFN_Ver8*)( ( (BYTE*)pVer8 ) +  pVer8->cbFfnM1 + 1 );
            }
        }
    }
    delete pA;
}

const WW8_FFN* WW8Fonts::GetFont( USHORT nNum ) const
{
    if( !pFontA || nNum > nMax )
        return 0;

    return &pFontA[ nNum ];
}



//-----------------------------------------


// Suche zu einem Header / Footer den Index in der WW-Liste von Headern / Footern
//
// Pferdefuesse bei WinWord6 und -7:
// 1) Am Anfang des Einlesens muss WWPLCF_HdFt mit Fib und Dop konstruiert werden
// 2) Der Haupttext muss sequentiell ueber alle Sections gelesen werden
// 3) Fuer jedes vorkommende Header / Footer - Attribut des Haupttextes
//  ( Darf pro Section maximal eins sein ) muss UpdateIndex() genau einmal
//  mit dem Parameter des Attributes gerufen werden. Dieser Aufruf muss *nach*
//  dem letzten Aufruf von GetTextPos() passieren.
// 4) GetTextPos() darf mit genau einem der obenstehen WW_... aufgerufen werden
//   ( nicht verodern ! )
// -> dann liefert GetTextPos() vielleicht auch ein richtiges Ergebnis

WW8PLCF_HdFt::WW8PLCF_HdFt( SvStream* pSt, WW8Fib& rFib, WW8Dop& rDop )
: aPLCF( pSt, rFib.fcPlcfhdd , rFib.lcbPlcfhdd , 0 )
{
    nIdxOffset = 0;

//  for( BYTE nI = 0x80; nI >= 0x20; nI >>= 1 ) // Beschreibung stimmt nicht

//  for( BYTE nI = 0x1; nI <= 0x4; nI <<= 1 )   // Vorsicht: Beschreibung stimmt nicht


     /*
      cmc 23/02/2000: This dop.grpfIhdt has a bit set for each special
      footnote *and endnote!!* seperator,continuation seperator, and
      continuation notice entry, the documentation does not mention the
      endnote seperators, the documentation also gets the index numbers
      backwards when specifiying which bits to test. The bottom six bits
      of this value must be tested and skipped over. Each section's
      grpfIhdt is then tested for the existence of the appropiate headers
      and footers, at the end of each section the nIdxOffset must be updated
      to point to the beginning of the next section's group of headers and
      footers in this PLCF, UpdateIndex does that task.
      */
    for( BYTE nI = 0x1; nI <= 0x20; nI <<= 1 )
        if( nI & rDop.grpfIhdt )                // Bit gesetzt ?
            nIdxOffset++;

    nTextOfs = rFib.ccpText + rFib.ccpFtn; // Groesse des Haupttextes
                                                        // und der Fussnoten
}

BOOL WW8PLCF_HdFt::GetTextPos( BYTE grpfIhdt, BYTE nWhich, WW8_CP& rStart, long& rLen )
{
    BYTE nI = 0x1;
    short nIdx = nIdxOffset;
    while( TRUE ){
        if( nI & nWhich )
            break;                  // gefunden
        if( grpfIhdt & nI )
            nIdx++;                 // uninteressanter Header / Footer
        nI <<= 1;                   // naechstes Bit testen
        if( nI > 0x20 )
            return FALSE;       // nicht gefunden
    }
                                            // nIdx ist HdFt-Index
    WW8_CP ende;
    void* pData;

    aPLCF.SetIdx( nIdx );               // dann suche passenden CP
    aPLCF.Get( rStart, ende, pData );
    rLen = ende - rStart;
// Der letzte Header/Footer hat eine Laenge, die um 1 Zeichen zu gross ist
// ( folgendes CR ). Um diesen passend zu kuerzen muesste man den Index
// dieses K/F-Textes finden ( es ist nicht der letzte im PLCF ! ).
//  if( (long)aPLCF.GetIdx() == aPLCF.GetIMax() )   // Falsch!
//      rLen--;                         // Letztes Element ist 1 zu gross
    aPLCF++;
    return TRUE;
}

BOOL WW8PLCF_HdFt::GetTextPosExact( short nIdx, WW8_CP& rStart, long& rLen )
{
    WW8_CP ende;
    void* pData;

    aPLCF.SetIdx( nIdx );               // dann suche passenden CP
    aPLCF.Get( rStart, ende, pData );
    rLen = ende - rStart;
// Der letzte Header/Footer hat eine Laenge, die um 1 Zeichen zu gross ist
// ( folgendes CR ). Um diesen passend zu kuerzen muesste man den Index
// dieses K/F-Textes finden ( es ist nicht der letzte im PLCF ! ).
//  if( (long)aPLCF.GetIdx() == aPLCF.GetIMax() )   // Falsch!
//      rLen--;                         // Letztes Element ist 1 zu gross
    return TRUE;
}

void WW8PLCF_HdFt::UpdateIndex( BYTE grpfIhdt )
{
    for( BYTE nI = 0x1; nI <= 0x20; nI <<= 1 )  // Vorsicht: Beschreibung stimmt nicht
        if( nI & grpfIhdt )
            nIdxOffset++;
}

//-----------------------------------------
//          WW8Dop
//-----------------------------------------



WW8Dop::WW8Dop( SvStream& rSt, INT16 nFib, INT32 nPos, INT32 nSize )
{
    BYTE* pData = new BYTE[ 500 ];
    BYTE* pDataPtr = pData;
    UINT32 nRead = 500 < nSize ? 500 : nSize;
    rSt.Seek( nPos );
    if( 2 > nSize || nRead != rSt.Read( pData, nRead ))
    {
        memset( &nDataStart, 0, (&nDataEnd - &nDataStart) );
        nDopError = ERR_SWG_READ_ERROR;     // Error melden
    }
    else
    {
        if( 500 > nRead )
            memset( pData + nRead, 0, 500 - nRead );

        // dann mal die Daten auswerten
        UINT32 a32Bit;
        UINT16 a16Bit;
        BYTE   a8Bit;

        a16Bit = Get_UShort( pData );
        fFacingPages        = 0 != ( a16Bit  &  0x0001 )     ;
        fWidowControl       = 0 != ( a16Bit  &  0x0002 )     ;
        fPMHMainDoc         = 0 != ( a16Bit  &  0x0004 )     ;
        grfSuppression      =      ( a16Bit  &  0x0018 ) >> 3;
        fpc                 =      ( a16Bit  &  0x0060 ) >> 5;
        grpfIhdt            =      ( a16Bit  &  0xff00 ) >> 8;

        a16Bit = Get_UShort( pData );
        rncFtn              =   a16Bit  &  0x0003        ;
        nFtn                = ( a16Bit  & ~0x0003 ) >> 2 ;

        a8Bit = Get_Byte( pData );
        fOutlineDirtySave      = 0 != ( a8Bit  &  0x01   );

        a8Bit = Get_Byte( pData );
        fOnlyMacPics           = 0 != ( a8Bit  &  0x01   );
        fOnlyWinPics           = 0 != ( a8Bit  &  0x02   );
        fLabelDoc              = 0 != ( a8Bit  &  0x04   );
        fHyphCapitals          = 0 != ( a8Bit  &  0x08   );
        fAutoHyphen            = 0 != ( a8Bit  &  0x10   );
        fFormNoFields          = 0 != ( a8Bit  &  0x20   );
        fLinkStyles            = 0 != ( a8Bit  &  0x40   );
        fRevMarking            = 0 != ( a8Bit  &  0x80   );

        a8Bit = Get_Byte( pData );
        fBackup                = 0 != ( a8Bit  &  0x01   );
        fExactCWords           = 0 != ( a8Bit  &  0x02   );
        fPagHidden             = 0 != ( a8Bit  &  0x04   );
        fPagResults            = 0 != ( a8Bit  &  0x08   );
        fLockAtn               = 0 != ( a8Bit  &  0x10   );
        fMirrorMargins         = 0 != ( a8Bit  &  0x20   );
        fReadOnlyRecommended   = 0 != ( a8Bit  &  0x40   );
        fDfltTrueType          = 0 != ( a8Bit  &  0x80   );

        a8Bit = Get_Byte( pData );
        fPagSuppressTopSpacing = 0 != ( a8Bit  &  0x01   );
        fProtEnabled           = 0 != ( a8Bit  &  0x02   );
        fDispFormFldSel        = 0 != ( a8Bit  &  0x04   );
        fRMView                = 0 != ( a8Bit  &  0x08   );
        fRMPrint               = 0 != ( a8Bit  &  0x10   );
        fWriteReservation      = 0 != ( a8Bit  &  0x20   );
        fLockRev               = 0 != ( a8Bit  &  0x40   );
        fEmbedFonts            = 0 != ( a8Bit  &  0x80   );


        a8Bit = Get_Byte( pData );
        copts_fNoTabForInd           = 0 != ( a8Bit  &  0x01   );
        copts_fNoSpaceRaiseLower     = 0 != ( a8Bit  &  0x02   );
        copts_fSupressSpbfAfterPgBrk = 0 != ( a8Bit  &  0x04   );
        copts_fWrapTrailSpaces       = 0 != ( a8Bit  &  0x08   );
        copts_fMapPrintTextColor     = 0 != ( a8Bit  &  0x10   );
        copts_fNoColumnBalance       = 0 != ( a8Bit  &  0x20   );
        copts_fConvMailMergeEsc      = 0 != ( a8Bit  &  0x40   );
        copts_fSupressTopSpacing     = 0 != ( a8Bit  &  0x80   );

        a8Bit = Get_Byte( pData );
        copts_fOrigWordTableRules    = 0 != ( a8Bit  &  0x01   );
        copts_fTransparentMetafiles  = 0 != ( a8Bit  &  0x02   );
        copts_fShowBreaksInFrames    = 0 != ( a8Bit  &  0x04   );
        copts_fSwapBordersFacingPgs  = 0 != ( a8Bit  &  0x08   );

        dxaTab = Get_Short( pData );
        wSpare = Get_UShort( pData );
        dxaHotZ = Get_UShort( pData );
        cConsecHypLim = Get_UShort( pData );
        wSpare2 = Get_UShort( pData );
        dttmCreated = Get_Long( pData );
        dttmRevised = Get_Long( pData );
        dttmLastPrint = Get_Long( pData );
        nRevision = Get_Short( pData );
        tmEdited = Get_Long( pData );
        cWords = Get_Long( pData );
        cCh = Get_Long( pData );
        cPg = Get_Short( pData );
        cParas = Get_Long( pData );

        a16Bit = Get_UShort( pData );
        rncEdn =   a16Bit &  0x0003       ;
        nEdn   = ( a16Bit & ~0x0003 ) >> 2;

        a16Bit = Get_UShort( pData );
        epc            =   a16Bit &  0x0003       ;
        nfcFtnRef      = ( a16Bit &  0x003c ) >> 2;
        nfcEdnRef      = ( a16Bit &  0x03c0 ) >> 6;
        fPrintFormData = 0 != ( a16Bit &  0x0400 );
        fSaveFormData  = 0 != ( a16Bit &  0x0800 );
        fShadeFormData = 0 != ( a16Bit &  0x1000 );
        fWCFtnEdn      = 0 != ( a16Bit &  0x8000 );

        cLines = Get_Long( pData );
        cWordsFtnEnd = Get_Long( pData );
        cChFtnEdn = Get_Long( pData );
        cPgFtnEdn = Get_Short( pData );
        cParasFtnEdn = Get_Long( pData );
        cLinesFtnEdn = Get_Long( pData );
        lKeyProtDoc = Get_Long( pData );

        a16Bit = Get_UShort( pData );
        wvkSaved    =   a16Bit &  0x0007        ;
        wScaleSaved = ( a16Bit &  0x0ff8 ) >> 3 ;
        zkSaved     = ( a16Bit &  0x3000 ) >> 12;

        /*
            bei nFib >= 103 gehts weiter:
        */
        if( nFib >= 103 )
        {
            a32Bit = Get_ULong( pData );
            fNoTabForInd                = ( a32Bit &  0x00000001 )       ;
            fNoSpaceRaiseLower          = ( a32Bit &  0x00000002 ) >>  1 ;
            fSupressSpbfAfterPageBreak  = ( a32Bit &  0x00000004 ) >>  2 ;
            fWrapTrailSpaces            = ( a32Bit &  0x00000008 ) >>  3 ;
            fMapPrintTextColor          = ( a32Bit &  0x00000010 ) >>  4 ;
            fNoColumnBalance            = ( a32Bit &  0x00000020 ) >>  5 ;
            fConvMailMergeEsc           = ( a32Bit &  0x00000040 ) >>  6 ;
            fSupressTopSpacing          = ( a32Bit &  0x00000080 ) >>  7 ;
            fOrigWordTableRules         = ( a32Bit &  0x00000100 ) >>  8 ;
            fTransparentMetafiles       = ( a32Bit &  0x00000200 ) >>  9 ;
            fShowBreaksInFrames         = ( a32Bit &  0x00000400 ) >> 10 ;
            fSwapBordersFacingPgs       = ( a32Bit &  0x00000800 ) >> 11 ;
            fSuppressTopSpacingMac5     = ( a32Bit &  0x00010000 ) >> 16 ;
            fTruncDxaExpand             = ( a32Bit &  0x00020000 ) >> 17 ;
            fPrintBodyBeforeHdr         = ( a32Bit &  0x00040000 ) >> 18 ;
            fNoLeading                  = ( a32Bit &  0x00080000 ) >> 19 ;
            fMWSmallCaps                = ( a32Bit &  0x00200000 ) >> 21 ;
        }

        /*
            bei nFib > 105 gehts weiter:
        */
        if( nFib > 105 )
        {
            adt = Get_Short( pData );

            memcpy( &doptypography, pData, sizeof( WW8_DOPTYPOGRAPHY ));
            pData += sizeof( WW8_DOPTYPOGRAPHY );

            memcpy( &dogrid, pData, sizeof( WW8_DOGRID ));
            pData += sizeof( WW8_DOGRID );

            a16Bit = Get_UShort( pData );
            // die untersten 9 Bit sind uninteressant
            fHtmlDoc                = ( a16Bit &  0x0200 ) >>  9 ;
            fSnapBorder             = ( a16Bit &  0x0800 ) >> 11 ;
            fIncludeHeader          = ( a16Bit &  0x1000 ) >> 12 ;
            fIncludeFooter          = ( a16Bit &  0x2000 ) >> 13 ;
            fForcePageSizePag       = ( a16Bit &  0x4000 ) >> 14 ;
            fMinFontSizePag         = ( a16Bit &  0x8000 ) >> 15 ;

            a16Bit = Get_UShort( pData );
            fHaveVersions   = 0 != ( a16Bit  &  0x0001 );
            fAutoVersion    = 0 != ( a16Bit  &  0x0002 );

            pData += 12;

            cChWS = Get_Long( pData );
            cChWSFtnEdn = Get_Long( pData );
            grfDocEvents = Get_Long( pData );

            pData += 4+30+8;

            cDBC = Get_Long( pData );
            cDBCFtnEdn = Get_Long( pData );

            pData += 1 * sizeof( long );

            nfcFtnRef = Get_Short( pData );
            nfcEdnRef = Get_Short( pData );
            hpsZoonFontPag = Get_Short( pData );
            dywDispPag = Get_Short( pData );
        }
    }
    delete pDataPtr;
}

WW8Dop::WW8Dop()
{
    // erstmal alles auf 0 defaulten
    memset( &nDataStart, 0, (&nDataEnd - &nDataStart) );

    fWidowControl = 1;
    fpc = 1;
    nFtn = 1;
    fOutlineDirtySave = 1;
    fHyphCapitals = 1;
    fBackup = 1;
    fPagHidden = 1;
    fPagResults = 1;
    fDfltTrueType = 1;
    fRMView = 1;
    fRMPrint = 1;
    dxaTab = 0x2d0;
    dxaHotZ = 0x168;
    dttmCreated = 0x45FBAC69;
    dttmRevised = 0x45FBAC69;
    nRevision = 1;
    nEdn = 1;

    epc = 3;
    nfcEdnRef = 2;
    fShadeFormData = 1;

    wvkSaved = 2;
    wScaleSaved = 100;
    zkSaved = 0;

    lvl = 9;
    fIncludeHeader = 1;
    fIncludeFooter = 1;

    cChWS = /**!!**/ 0;
    cChWSFtnEdn = /**!!**/ 0;

    cDBC = /**!!**/ 0;
    cDBCFtnEdn = /**!!**/ 0;
}

BOOL WW8Dop::Write( SvStream& rStrm, WW8Fib& rFib )
{
    INT32 nLen = 8 == rFib.nVersion ? 500 : 84;
    rFib.fcDop =  rStrm.Tell();
    rFib.lcbDop = nLen;

    BYTE aData[ 500 ];
    memset( aData, 0, 500 );
    BYTE* pData = aData;

    // dann mal die Daten auswerten
    UINT32 a32Bit;
    UINT16 a16Bit;
    BYTE   a8Bit;

    a16Bit = 0;
    if( fFacingPages )      a16Bit |= 0x0001;
    if( fWidowControl )     a16Bit |= 0x0002;
    if( fPMHMainDoc )       a16Bit |= 0x0004;
    a16Bit |= ( 0x0018 & (grfSuppression << 3));
    a16Bit |= ( 0x0060 & (fpc << 5));
    a16Bit |= ( 0xff00 & (grpfIhdt << 8));
    Set_UInt16( pData, a16Bit );

    a16Bit = 0;
    a16Bit |= ( 0x0003 & rncFtn );
    a16Bit |= ( ~0x0003 & (nFtn << 2));
    Set_UInt16( pData, a16Bit );

    a8Bit = 0;
    if( fOutlineDirtySave ) a8Bit |= 0x01;
    Set_UInt8( pData, a8Bit );

    a8Bit = 0;
    if( fOnlyMacPics )  a8Bit |= 0x01;
    if( fOnlyWinPics )  a8Bit |= 0x02;
    if( fLabelDoc )     a8Bit |= 0x04;
    if( fHyphCapitals ) a8Bit |= 0x08;
    if( fAutoHyphen )   a8Bit |= 0x10;
    if( fFormNoFields ) a8Bit |= 0x20;
    if( fLinkStyles )   a8Bit |= 0x40;
    if( fRevMarking )   a8Bit |= 0x80;
    Set_UInt8( pData, a8Bit );

    a8Bit = 0;
    if( fBackup )               a8Bit |= 0x01;
    if( fExactCWords )          a8Bit |= 0x02;
    if( fPagHidden )            a8Bit |= 0x04;
    if( fPagResults )           a8Bit |= 0x08;
    if( fLockAtn )              a8Bit |= 0x10;
    if( fMirrorMargins )        a8Bit |= 0x20;
    if( fReadOnlyRecommended )  a8Bit |= 0x40;
    if( fDfltTrueType )         a8Bit |= 0x80;
    Set_UInt8( pData, a8Bit );

    a8Bit = 0;
    if( fPagSuppressTopSpacing )    a8Bit |= 0x01;
    if( fProtEnabled )              a8Bit |= 0x02;
    if( fDispFormFldSel )           a8Bit |= 0x04;
    if( fRMView )                   a8Bit |= 0x08;
    if( fRMPrint )                  a8Bit |= 0x10;
    if( fWriteReservation )         a8Bit |= 0x20;
    if( fLockRev )                  a8Bit |= 0x40;
    if( fEmbedFonts )               a8Bit |= 0x80;
    Set_UInt8( pData, a8Bit );


    a8Bit = 0;
    if( copts_fNoTabForInd )            a8Bit |= 0x01;
    if( copts_fNoSpaceRaiseLower )      a8Bit |= 0x02;
    if( copts_fSupressSpbfAfterPgBrk )  a8Bit |= 0x04;
    if( copts_fWrapTrailSpaces )        a8Bit |= 0x08;
    if( copts_fMapPrintTextColor )      a8Bit |= 0x10;
    if( copts_fNoColumnBalance )        a8Bit |= 0x20;
    if( copts_fConvMailMergeEsc )       a8Bit |= 0x40;
    if( copts_fSupressTopSpacing )      a8Bit |= 0x80;
    Set_UInt8( pData, a8Bit );

    a8Bit = 0;
    if( copts_fOrigWordTableRules )     a8Bit |= 0x01;
    if( copts_fTransparentMetafiles )   a8Bit |= 0x02;
    if( copts_fShowBreaksInFrames )     a8Bit |= 0x04;
    if( copts_fSwapBordersFacingPgs )   a8Bit |= 0x08;
    Set_UInt8( pData, a8Bit );

    Set_UInt16( pData, dxaTab );
    Set_UInt16( pData, wSpare );
    Set_UInt16( pData, dxaHotZ );
    Set_UInt16( pData, cConsecHypLim );
    Set_UInt16( pData, wSpare2 );
    Set_UInt32( pData, dttmCreated );
    Set_UInt32( pData, dttmRevised );
    Set_UInt32( pData, dttmLastPrint );
    Set_UInt16( pData, nRevision );
    Set_UInt32( pData, tmEdited );
    Set_UInt32( pData, cWords );
    Set_UInt32( pData, cCh );
    Set_UInt16( pData, cPg );
    Set_UInt32( pData, cParas );

    a16Bit = 0;
    a16Bit |= ( 0x0003 & rncEdn );
    a16Bit |= (~0x0003 & ( nEdn << 2));
    Set_UInt16( pData, a16Bit );

    a16Bit = 0;
    a16Bit |= (0x0003 & epc );
    a16Bit |= (0x003c & (nfcFtnRef << 2));
    a16Bit |= (0x03c0 & (nfcEdnRef << 6));
    if( fPrintFormData )    a16Bit |= 0x0400;
    if( fSaveFormData )     a16Bit |= 0x0800;
    if( fShadeFormData )    a16Bit |= 0x1000;
    if( fWCFtnEdn )         a16Bit |= 0x8000;
    Set_UInt16( pData, a16Bit );

    Set_UInt32( pData, cLines );
    Set_UInt32( pData, cWordsFtnEnd );
    Set_UInt32( pData, cChFtnEdn );
    Set_UInt16( pData, cPgFtnEdn );
    Set_UInt32( pData, cParasFtnEdn );
    Set_UInt32( pData, cLinesFtnEdn );
    Set_UInt32( pData, lKeyProtDoc );

    a16Bit = 0;
    if( wvkSaved )  a16Bit |= 0x0007;
    a16Bit |= (0x0ff8 & (wScaleSaved << 3));
    a16Bit |= (0x3000 & (zkSaved << 12));
    Set_UInt16( pData, a16Bit );

    if( 8 == rFib.nVersion )
    {
        a32Bit = 0;
        if( fNoTabForInd )                  a32Bit |= 0x00000001;
        if( fNoSpaceRaiseLower )            a32Bit |= 0x00000002;
        if( fSupressSpbfAfterPageBreak )    a32Bit |= 0x00000004;
        if( fWrapTrailSpaces )              a32Bit |= 0x00000008;
        if( fMapPrintTextColor )            a32Bit |= 0x00000010;
        if( fNoColumnBalance )              a32Bit |= 0x00000020;
        if( fConvMailMergeEsc )             a32Bit |= 0x00000040;
        if( fSupressTopSpacing )            a32Bit |= 0x00000080;
        if( fOrigWordTableRules )           a32Bit |= 0x00000100;
        if( fTransparentMetafiles )         a32Bit |= 0x00000200;
        if( fShowBreaksInFrames )           a32Bit |= 0x00000400;
        if( fSwapBordersFacingPgs )         a32Bit |= 0x00000800;
        if( fSuppressTopSpacingMac5 )       a32Bit |= 0x00010000;
        if( fTruncDxaExpand )               a32Bit |= 0x00020000;
        if( fPrintBodyBeforeHdr )           a32Bit |= 0x00040000;
        if( fNoLeading )                    a32Bit |= 0x00080000;
        if( fMWSmallCaps )                  a32Bit |= 0x00200000;
        Set_UInt32( pData, a32Bit );

        Set_UInt16( pData, adt );

        memcpy( pData, &doptypography, sizeof( WW8_DOPTYPOGRAPHY ));
        pData += sizeof( WW8_DOPTYPOGRAPHY );

        memcpy( pData, &dogrid, sizeof( WW8_DOGRID ));
        pData += sizeof( WW8_DOGRID );

        a16Bit = 0x12;      // lvl auf 9 setzen
        if( fHtmlDoc )          a16Bit |= 0x0200;
        if( fSnapBorder )       a16Bit |= 0x0800;
        if( fIncludeHeader )    a16Bit |= 0x1000;
        if( fIncludeFooter )    a16Bit |= 0x2000;
        if( fForcePageSizePag ) a16Bit |= 0x4000;
        if( fMinFontSizePag )   a16Bit |= 0x8000;
        Set_UInt16( pData, a16Bit );

        a16Bit = 0;
        if( fHaveVersions ) a16Bit |= 0x0001;
        if( fAutoVersion )  a16Bit |= 0x0002;
        Set_UInt16( pData, a16Bit );

        pData += 12;

        Set_UInt32( pData, cChWS );
        Set_UInt32( pData, cChWSFtnEdn );
        Set_UInt32( pData, grfDocEvents );

        pData += 4+30+8;

        Set_UInt32( pData, cDBC );
        Set_UInt32( pData, cDBCFtnEdn );

        pData += 1 * sizeof( long );

        Set_UInt16( pData, nfcFtnRef );
        Set_UInt16( pData, nfcEdnRef );
        Set_UInt16( pData, hpsZoonFontPag );
        Set_UInt16( pData, dywDispPag );
    }
    rStrm.Write( aData, nLen );
    return 0 == rStrm.GetError();
}

/***************************************************************************
#       Array zum Bestimmen der Laenge der SPRMs
#**************************************************************************/


/*
    Werte fuer SprmInfo.nVari
*/
#define L_FIX  0
#define L_VAR  1
#define L_VAR2 2

struct SprmInfo
{
    USHORT nId;
    BYTE   nLen : 6;
    BYTE   nVari: 2;
};


/*
    Zweck: Laenge und Parameter-Offset eines Sprm erfahren
*/
static SprmInfo aWwSprmTab[] = {
       0, 0, L_FIX, // "Default-sprm",  // wird uebersprungen
       2, 2, L_FIX, // "sprmPIstd",  // pap.istd (style code)
       3, 3, L_VAR, // "sprmPIstdPermute", // pap.istd  permutation
       4, 1, L_FIX, //  "sprmPIncLv1", // pap.istddifference
       5, 1, L_FIX, //  "sprmPJc", // pap.jc (justification)
       6, 1, L_FIX, //  "sprmPFSideBySide", // pap.fSideBySide
       7, 1, L_FIX, //  "sprmPFKeep", // pap.fKeep
       8, 1, L_FIX, //  "sprmPFKeepFollow ", // pap.fKeepFollow
       9, 1, L_FIX, //  "sprmPPageBreakBefore", // pap.fPageBreakBefore

      10, 1, L_FIX, // "sprmPBrcl", //  pap.brcl
      11, 1, L_FIX, // "sprmPBrcp ", // pap.brcp
      12, 0, L_VAR, // "sprmPAnld", //  pap.anld (ANLD structure)
      13, 1, L_FIX, //  "sprmPNLvlAnm", // pap.nLvlAnm nn
      14, 1, L_FIX, //  "sprmPFNoLineNumb", //ap.fNoLnn


      // ???
      15, 0, L_VAR, //   "?sprmPChgTabsPapx", // pap.itbdMac, ...


      16, 2, L_FIX, //  "sprmPDxaRight", // pap.dxaRight
      17, 2, L_FIX, //  "sprmPDxaLeft", // pap.dxaLeft
      18, 2, L_FIX, //  "sprmPNest", // pap.dxaLeft
      19, 2, L_FIX, //  "sprmPDxaLeft1", // pap.dxaLeft1

      20, 4, L_FIX, //  "sprmPDyaLine", // pap.lspd an LSPD
      21, 2, L_FIX, //  "sprmPDyaBefore", // pap.dyaBefore
      22, 2, L_FIX, //  "sprmPDyaAfter", // pap.dyaAfter


      // ???
      23, 0, L_VAR, // "?sprmPChgTabs", // pap.itbdMac, pap.rgdxaTab, ...


      24, 1, L_FIX, //  "sprmPFInTable", // pap.fInTable
      25, 1, L_FIX, //  "sprmPTtp", // pap.fTtp
      26, 2, L_FIX, //  "sprmPDxaAbs", // pap.dxaAbs
      27, 2, L_FIX, //  "sprmPDyaAbs", // pap.dyaAbs
      28, 2, L_FIX, // "sprmPDxaWidth", // pap.dxaWidth
      29, 1, L_FIX, // "sprmPPc", // pap.pcHorz, pap.pcVert

      30, 2, L_FIX, // "sprmPBrcTop10", // pap.brcTop BRC10
      31, 2, L_FIX, // "sprmPBrcLeft10", // pap.brcLeft BRC10
      32, 2, L_FIX, // "sprmPBrcBottom10", // pap.brcBottom BRC10
      33, 2, L_FIX, // "sprmPBrcRight10", // pap.brcRight BRC10
      34, 2, L_FIX, // "sprmPBrcBetween10", // pap.brcBetween BRC10
      35, 2, L_FIX, // "sprmPBrcBar10", // pap.brcBar BRC10
      36, 2, L_FIX, // "sprmPFromText10", // pap.dxaFromText dxa
      37, 1, L_FIX, // "sprmPWr", // pap.wr wr
      38, 2, L_FIX, // "sprmPBrcTop", // pap.brcTop BRC
      39, 2, L_FIX, // "sprmPBrcLeft", // pap.brcLeft BRC

      40, 2, L_FIX, // "sprmPBrcBottom", // pap.brcBottom BRC
      41, 2, L_FIX, // "sprmPBrcRight", // pap.brcRight BRC
      42, 2, L_FIX, // "sprmPBrcBetween", // pap.brcBetween BRC
      43, 2, L_FIX, // "sprmPBrcBar",//pap.brcBar BRC word
      44, 1, L_FIX, //  "sprmPFNoAutoHyph",//pap.fNoAutoHyph
      45, 2, L_FIX, //  "sprmPWHeightAbs",//pap.wHeightAbs w
      46, 2, L_FIX, // "sprmPDcs",//pap.dcs DCS
      47, 2, L_FIX, // "sprmPShd",//pap.shd SHD
      48, 2, L_FIX, //  "sprmPDyaFromText",//pap.dyaFromText dya
      49, 2, L_FIX, //  "sprmPDxaFromText",//pap.dxaFromText dxa

      50, 1, L_FIX, //  "sprmPFLocked", // pap.fLocked 0 or 1 byte

      51, 1, L_FIX, //  "sprmPFWidowControl", // pap.fWidowControl 0 or 1 byte


      // ???
    52, 0, L_FIX, // "?sprmPRuler 52", //???


      65, 1, L_FIX, //  "sprmCFStrikeRM", // chp.fRMarkDel 1 or 0 bit
      66, 1, L_FIX, //  "sprmCFRMark", // chp.fRMark 1 or 0 bit
      67, 1, L_FIX, //  "sprmCFFldVanish", // chp.fFldVanish 1 or 0 bit
      68, 0, L_VAR, // "sprmCPicLocation", // chp.fcPic and chp.fSpec
      69, 2, L_FIX, // "sprmCIbstRMark", // chp.ibstRMark index into sttbRMark

      70, 4, L_FIX, // "sprmCDttmRMark", // chp.dttm DTTM long
      71, 1, L_FIX, //  "sprmCFData", // chp.fData 1 or 0 bit
      72, 2, L_FIX, // "sprmCRMReason", // chp.idslRMReason an index to a table
      73, 3, L_FIX, // "sprmCChse", // chp.fChsDiff and chp.chse see below 3 bytes
      74, 0, L_VAR, // "sprmCSymbol", // chp.fSpec, chp.chSym and chp.ftcSym
      75, 1, L_FIX, //  "sprmCFOle2", // chp.fOle2 1 or 0   bit

      80, 2, L_FIX, // "sprmCIstd", // chp.istd istd, see stylesheet definition short
      81, 0, L_VAR, // "sprmCIstdPermute", // chp.istd permutation vector (see below)
      82, 0, L_VAR, // "sprmCDefault", // whole CHP (see below) none variable length
      83, 0, L_FIX, // "sprmCPlain", // whole CHP (see below) none 0
      85, 1, L_FIX, // "sprmCFBold", // chp.fBold 0,1, 128, or 129 (see below) byte
      86, 1, L_FIX, //"sprmCFItalic", // chp.fItalic 0,1, 128, or 129 (see below) byte
      87, 1, L_FIX, // "sprmCFStrike", // chp.fStrike 0,1, 128, or 129 (see below) byte
      88, 1, L_FIX, // "sprmCFOutline", // chp.fOutline 0,1, 128, or 129 (see below) byte
      89, 1, L_FIX, // "sprmCFShadow", // chp.fShadow 0,1, 128, or 129 (see below) byte

      90, 1, L_FIX, // "sprmCFSmallCaps", // chp.fSmallCaps 0,1, 128, or 129 (see below) byte
      91, 1, L_FIX, // "sprmCFCaps", // chp.fCaps 0,1, 128, or 129 (see below) byte
      92, 1, L_FIX, // "sprmCFVanish", // chp.fVanish 0,1, 128, or 129 (see below) byte
      93, 2, L_FIX, // "sprmCFtc", // chp.ftc ftc word
      94, 1, L_FIX, // "sprmCKul", // chp.kul kul byte
      95, 3, L_FIX, // "sprmCSizePos", // chp.hps, chp.hpsPos (see below) 3 bytes
      96, 2, L_FIX, //  "sprmCDxaSpace", // chp.dxaSpace dxa word
      97, 2, L_FIX, //  "sprmCLid", // chp.lid LID word
      98, 1, L_FIX, //  "sprmCIco", // chp.ico ico byte
      99, 2, L_FIX, // "sprmCHps", // chp.hps hps !word!


     100, 1, L_FIX, //  "sprmCHpsInc", // chp.hps (see below) byte
     101, 2, L_FIX, //  "sprmCHpsPos", // chp.hpsPos hps !word!
     102, 1, L_FIX, //  "sprmCHpsPosAdj", // chp.hpsPos hps (see below) byte


     // ???
     103, 0, L_VAR, // "?sprmCMajority", // chp.fBold, chp.fItalic, chp.fSmallCaps, ...


     104, 1, L_FIX, //  "sprmCIss", // chp.iss iss byte
     105, 0, L_VAR, // "sprmCHpsNew50", // chp.hps hps variable width, length always recorded as 2
     106, 0, L_VAR, // "sprmCHpsInc1", // chp.hps complex (see below) variable width, length always recorded as 2
     107, 2, L_FIX, // "sprmCHpsKern", // chp.hpsKern hps short
     108, 0, L_VAR, // "sprmCMajority50", // chp.fBold, chp.fItalic, chp.fSmallCaps, chp.fVanish, ...
     109, 2, L_FIX, // "sprmCHpsMul", // chp.hps percentage to grow hps short

     110, 2, L_FIX, // "sprmCCondHyhen", // chp.ysri ysri short
     117, 1, L_FIX, //  "sprmCFSpec", // chp.fSpec  1 or 0 bit
     118, 1, L_FIX, //  "sprmCFObj", // chp.fObj 1 or 0 bit
     119, 1, L_FIX, // "sprmPicBrcl", // pic.brcl brcl (see PIC structure definition) byte

     120,12, L_VAR, // "sprmPicScale", // pic.mx, pic.my, pic.dxaCropleft,
     121, 2, L_FIX, // "sprmPicBrcTop", // pic.brcTop BRC word
     122, 2, L_FIX, // "sprmPicBrcLeft", // pic.brcLeft BRC word
     123, 2, L_FIX, // "sprmPicBrcBottom", // pic.brcBottom BRC word
     124, 2, L_FIX, // "sprmPicBrcRight", // pic.brcRight BRC word

     131, 1, L_FIX, //  "sprmSScnsPgn", // sep.cnsPgn cns byte
     132, 1, L_FIX, // "sprmSiHeadingPgn", // sep.iHeadingPgn heading number level byte
     133, 0, L_VAR, // "sprmSOlstAnm", // sep.olstAnm OLST variable length
     136, 3, L_FIX, // "sprmSDxaColWidth", // sep.rgdxaColWidthSpacing complex (see below) 3 bytes
     137, 3, L_FIX, // "sprmSDxaColSpacing", // sep.rgdxaColWidthSpacing complex (see below) 3 bytes
     138, 1, L_FIX, //  "sprmSFEvenlySpaced", // sep.fEvenlySpaced 1 or 0 byte
     139, 1, L_FIX, //  "sprmSFProtected", // sep.fUnlocked 1 or 0 byte

     140, 2, L_FIX, //  "sprmSDmBinFirst", // sep.dmBinFirst  word
     141, 2, L_FIX, //  "sprmSDmBinOther", // sep.dmBinOther  word
     142, 1, L_FIX, //  "sprmSBkc", // sep.bkc bkc byte
     143, 1, L_FIX, //  "sprmSFTitlePage", // sep.fTitlePage 0 or 1 byte
     144, 2, L_FIX, //  "sprmSCcolumns", // sep.ccolM1 # of cols - 1 word
     145, 2, L_FIX, //  "sprmSDxaColumns", // sep.dxaColumns dxa word
     146, 1, L_FIX, // "sprmSFAutoPgn", // sep.fAutoPgn obsolete byte
     147, 1, L_FIX, //  "sprmSNfcPgn", // sep.nfcPgn nfc byte
     148, 2, L_FIX, // "sprmSDyaPgn", // sep.dyaPgn dya short
     149, 2, L_FIX, // "sprmSDxaPgn", // sep.dxaPgn dya short


     150, 1, L_FIX, //  "sprmSFPgnRestart", // sep.fPgnRestart 0 or 1 byte
     151, 1, L_FIX, //  "sprmSFEndnote", // sep.fEndnote 0 or 1 byte
     152, 1, L_FIX, //  "sprmSLnc", // sep.lnc lnc byte
     153, 1, L_FIX, // "sprmSGprfIhdt", // sep.grpfIhdt grpfihdt (see Headers and Footers topic) byte
     154, 2, L_FIX, //  "sprmSNLnnMod", // sep.nLnnMod non-neg int. word
     155, 2, L_FIX, // "sprmSDxaLnn", // sep.dxaLnn dxa word
     156, 2, L_FIX, //  "sprmSDyaHdrTop", // sep.dyaHdrTop dya word
     157, 2, L_FIX, //  "sprmSDyaHdrBottom", // sep.dyaHdrBottom dya word
     158, 1, L_FIX, //  "sprmSLBetween", // sep.fLBetween 0 or 1 byte
     159, 1, L_FIX, //  "sprmSVjc", // sep.vjc vjc byte

     160, 2, L_FIX, //  "sprmSLnnMin", // sep.lnnMin lnn word
     161, 2, L_FIX, //  "sprmSPgnStart", // sep.pgnStart pgn word
     162, 1, L_FIX, //  "sprmSBOrientation", // sep.dmOrientPage dm byte
     163, 0, L_FIX, //  "?SprmSBCustomize 163", //???
     164, 2, L_FIX, //  "sprmSXaPage", // sep.xaPage xa word
     165, 2, L_FIX, //  "sprmSYaPage", // sep.yaPage ya word
     166, 2, L_FIX, //  "sprmSDxaLeft", // sep.dxaLeft dxa word
     167, 2, L_FIX, //  "sprmSDxaRight", // sep.dxaRight dxa word
     168, 2, L_FIX, //  "sprmSDyaTop", // sep.dyaTop dya word
     169, 2, L_FIX, //  "sprmSDyaBottom", // sep.dyaBottom dya word

     170, 2, L_FIX, //  "sprmSDzaGutter", // sep.dzaGutter dza word
     171, 2, L_FIX, //  "sprmSDMPaperReq", // sep.dmPaperReq dm word

     182, 2, L_FIX, //  "sprmTJc", // tap.jc jc word (low order byte is significant)
     183, 2, L_FIX, //  "sprmTDxaLeft", // tap.rgdxaCenter (see below) dxa word
     184, 2, L_FIX, //  "sprmTDxaGapHalf", // tap.dxaGapHalf, tap.rgdxaCenter (see below) dxa word
     185, 1, L_FIX, //  "sprmTFCantSplit", // tap.fCantSplit 1 or 0 byte
     186, 1, L_FIX, //  "sprmTTableHeader", // tap.fTableHeader 1 or 0 byte
     187,12, L_FIX, // "sprmTTableBorders", // tap.rgbrcTable complex(see below) 12 bytes
     188, 0, L_VAR, // "sprmTDefTable10", // tap.rgdxaCenter, tap.rgtc complex (see below) variable length
     189, 2, L_FIX, //  "sprmTDyaRowHeight", // tap.dyaRowHeight dya word

     190, 0, L_VAR2, // "sprmTDefTable", // tap.rgtc complex (see below)
     191, 1, L_VAR, // "sprmTDefTableShd", // tap.rgshd complex (see below)
     192, 4, L_FIX, // "sprmTTlp", // tap.tlp TLP 4 bytes
     193, 5, L_FIX, // "sprmTSetBrc", // tap.rgtc[].rgbrc complex (see below) 5 bytes
     194, 4, L_FIX, // "sprmTInsert", // tap.rgdxaCenter,tap.rgtc complex (see below) 4 bytes
     195, 2, L_FIX, // "sprmTDelete", // tap.rgdxaCenter, tap.rgtc complex (see below) word
     196, 4, L_FIX, // "sprmTDxaCol", // tap.rgdxaCenter complex (see below) 4 bytes
     197, 2, L_FIX, // "sprmTMerge", // tap.fFirstMerged, tap.fMerged complex (see below) word
     198, 2, L_FIX, // "sprmTSplit", // tap.fFirstMerged, tap.fMerged complex (see below) word
     199, 5, L_FIX, // "sprmTSetBrc10", // tap.rgtc[].rgbrc complex (see below) 5 bytes

     200, 4, L_FIX, // "sprmTSetShd", // tap.rgshd complex (see below) 4 bytes

//- neue ab Ver8 ------------------------------------------------------------
    /*
        Die neuen Kodes werden einfach hier an die Liste angehaengt.
        So kann ein und dieselbe Liste fuer Ver6 und Ver8 gemeinsam verwendet werden.
        MS hat gluecklicherweise darauf geachtet, fuer Ver8 einen anderen Nummernkreis
        zu nehmen als fuer Ver6-7.
    */
    0x4600, 2, L_FIX, // "sprmPIstd" pap.istd;istd (style code);short;
    0xC601, 0, L_VAR, // "sprmPIstdPermute" pap.istd;permutation vector (see below);variable length;
    0x2602, 1, L_FIX, // "sprmPIncLvl" pap.istd, pap.lvl;difference between istd of base PAP and istd of PAP to be produced (see below);byte;
    0x2403, 1, L_FIX, // "sprmPJc" pap.jc;jc (justification);byte;
    0x2404, 1, L_FIX, // "sprmPFSideBySide" pap.fSideBySide;0 or 1;byte;
    0x2405, 1, L_FIX, // "sprmPFKeep" pap.fKeep;0 or 1;byte;
    0x2406, 1, L_FIX, // "sprmPFKeepFollow" pap.fKeepFollow;0 or 1;byte;
    0x2407, 1, L_FIX, // "sprmPFPageBreakBefore" pap.fPageBreakBefore;0 or 1;byte;
    0x2408, 1, L_FIX, // "sprmPBrcl" pap.brcl;brcl;byte;
    0x2409, 1, L_FIX, // "sprmPBrcp" pap.brcp;brcp;byte;
    0x260A, 1, L_FIX, // "sprmPIlvl" pap.ilvl;ilvl;byte;
    0x460B, 2, L_FIX, // "sprmPIlfo" pap.ilfo;ilfo (list index) ;short;
    0x240C, 1, L_FIX, // "sprmPFNoLineNumb" pap.fNoLnn;0 or 1;byte;
    0xC60D, 0, L_VAR, // "sprmPChgTabsPapx" pap.itbdMac, pap.rgdxaTab, pap.rgtbd;complex - see below;variable length
    0x840E, 2, L_FIX, // "sprmPDxaRight" pap.dxaRight;dxa;word;
    0x840F, 2, L_FIX, // "sprmPDxaLeft" pap.dxaLeft;dxa;word;
    0x4610, 2, L_FIX, // "sprmPNest" pap.dxaLeft;dxa-see below;word;
    0x8411, 2, L_FIX, // "sprmPDxaLeft1" pap.dxaLeft1;dxa;word;
    0x6412, 4, L_FIX, // "sprmPDyaLine" pap.lspd;an LSPD, a long word structure consisting of a short of dyaLine followed by a short of fMultLinespace - see below;long;
    0xA413, 2, L_FIX, // "sprmPDyaBefore" pap.dyaBefore;dya;word;
    0xA414, 2, L_FIX, // "sprmPDyaAfter" pap.dyaAfter;dya;word;
    0xC615, 0, L_VAR, // "sprmPChgTabs" pap.itbdMac, pap.rgdxaTab, pap.rgtbd;complex - see below;variable length;
    0x2416, 1, L_FIX, // "sprmPFInTable" pap.fInTable;0 or 1;byte;
    0x2417, 1, L_FIX, // "sprmPFTtp" pap.fTtp;0 or 1;byte;
    0x8418, 2, L_FIX, // "sprmPDxaAbs" pap.dxaAbs;dxa;word;
    0x8419, 2, L_FIX, // "sprmPDyaAbs" pap.dyaAbs;dya;word;
    0x841A, 2, L_FIX, // "sprmPDxaWidth" pap.dxaWidth;dxa;word;
    0x261B, 1, L_FIX, // "sprmPPc" pap.pcHorz, pap.pcVert;complex - see below;byte;
    0x461C, 2, L_FIX, // "sprmPBrcTop10" pap.brcTop;BRC10;word;
    0x461D, 2, L_FIX, // "sprmPBrcLeft10" pap.brcLeft;BRC10;word;
    0x461E, 2, L_FIX, // "sprmPBrcBottom10" pap.brcBottom;BRC10;word;
    0x461F, 2, L_FIX, // "sprmPBrcRight10" pap.brcRight;BRC10;word;
    0x4620, 2, L_FIX, // "sprmPBrcBetween10" pap.brcBetween;BRC10;word;
    0x4621, 2, L_FIX, // "sprmPBrcBar10" pap.brcBar;BRC10;word;
    0x4622, 2, L_FIX, // "sprmPDxaFromText10" pap.dxaFromText;dxa;word;
    0x2423, 1, L_FIX, // "sprmPWr" pap.wr;wr (see description of PAP for definition;byte;
    0x6424, 4, L_FIX, // "sprmPBrcTop" pap.brcTop;BRC;long;
    0x6425, 4, L_FIX, // "sprmPBrcLeft" pap.brcLeft;BRC;long;
    0x6426, 4, L_FIX, // "sprmPBrcBottom" pap.brcBottom;BRC;long;
    0x6427, 4, L_FIX, // "sprmPBrcRight" pap.brcRight;BRC;long;
    0x6428, 4, L_FIX, // "sprmPBrcBetween" pap.brcBetween;BRC;long;
    0x6629, 4, L_FIX, // "sprmPBrcBar" pap.brcBar;BRC;long;
    0x242A, 1, L_FIX, // "sprmPFNoAutoHyph" pap.fNoAutoHyph;0 or 1;byte;
    0x442B, 2, L_FIX, // "sprmPWHeightAbs" pap.wHeightAbs;w;word;
    0x442C, 2, L_FIX, // "sprmPDcs" pap.dcs;DCS;short;
    0x442D, 2, L_FIX, // "sprmPShd" pap.shd;SHD;word;
    0x842E, 2, L_FIX, // "sprmPDyaFromText" pap.dyaFromText;dya;word;
    0x842F, 2, L_FIX, // "sprmPDxaFromText" pap.dxaFromText;dxa;word;
    0x2430, 1, L_FIX, // "sprmPFLocked" pap.fLocked;0 or 1;byte;
    0x2431, 1, L_FIX, // "sprmPFWidowControl" pap.fWidowControl;0 or 1;byte;
    0xC632, 0, L_VAR, // "sprmPRuler" ;;variable length;
    0x2433, 1, L_FIX, // "sprmPFKinsoku" pap.fKinsoku;0 or 1;byte;
    0x2434, 1, L_FIX, // "sprmPFWordWrap" pap.fWordWrap;0 or 1;byte;
    0x2435, 1, L_FIX, // "sprmPFOverflowPunct" pap.fOverflowPunct;0 or 1;byte;
    0x2436, 1, L_FIX, // "sprmPFTopLinePunct" pap.fTopLinePunct;0 or 1;byte;
    0x2437, 1, L_FIX, // "sprmPFAutoSpaceDE" pap.fAutoSpaceDE;0 or 1;byte;
    0x2438, 1, L_FIX, // "sprmPFAutoSpaceDN" pap.fAutoSpaceDN;0 or 1;byte;
    0x4439, 2, L_FIX, // "sprmPWAlignFont" pap.wAlignFont;iFa (see description of PAP for definition);word;
    0x443A, 2, L_FIX, // "sprmPFrameTextFlow" pap.fVertical pap.fBackward pap.fRotateFont;complex (see description of PAP for definition);word;
    0x243B, 1, L_FIX, // "sprmPISnapBaseLine" obsolete: not applicable in Word97 and later versions;;byte;
    0xC63E, 0, L_VAR, // "sprmPAnld" pap.anld;;variable length;
    0xC63F, 0, L_VAR, // "sprmPPropRMark" pap.fPropRMark;complex (see below);variable length;
    0x2640, 1, L_FIX, // "sprmPOutLvl" pap.lvl;has no effect if pap.istd is < 1 or is > 9;byte;
    0x2441, 1, L_FIX, // "sprmPFBiDi" ;;byte;
    0x2443, 1, L_FIX, // "sprmPFNumRMIns" pap.fNumRMIns;1 or 0;bit;
    0x2444, 1, L_FIX, // "sprmPCrLf" ;;byte;
    0xC645, 0, L_VAR, // "sprmPNumRM" pap.numrm;;variable length;
    0x6645, 4, L_FIX, // "sprmPHugePapx" see below;fc in the data stream to locate the huge grpprl (see below);long;
    0x6646, 4, L_FIX, // "sprmPHugePapx" see below;fc in the data stream to locate the huge grpprl (see below);long;
    0x2447, 1, L_FIX, // "sprmPFUsePgsuSettings" pap.fUsePgsuSettings;1 or 0;byte;
    0x2448, 1, L_FIX, // "sprmPFAdjustRight" pap.fAdjustRight;1 or 0;byte;
    0x0800, 1, L_FIX, // "sprmCFRMarkDel" chp.fRMarkDel;1 or 0;bit;
    0x0801, 1, L_FIX, // "sprmCFRMark" chp.fRMark;1 or 0;bit;
    0x0802, 1, L_FIX, // "sprmCFFldVanish" chp.fFldVanish;1 or 0;bit;

// wahrscheinlich falsch:
//0x6A03, 0, L_VAR, // "sprmCPicLocation" chp.fcPic and chp.fSpec;see below;variable length, length recorded is always 4;

// eher so:
    0x6A03, 4, L_FIX, // "sprmCPicLocation" chp.fcPic and chp.fSpec;see below;
                                        // variable length,
                                        // ????????
                                        // length recorded is always 4;
                                        // ======             =========

    0x4804, 2, L_FIX, // "sprmCIbstRMark" chp.ibstRMark;index into sttbRMark;short;
    0x6805, 4, L_FIX, // "sprmCDttmRMark" chp.dttmRMark;DTTM;long;
    0x0806, 1, L_FIX, // "sprmCFData" chp.fData;1 or 0;bit;
    0x4807, 2, L_FIX, // "sprmCIdslRMark" chp.idslRMReason;an index to a table of strings defined in Word 6.0 executables;short;
    0xEA08, 1, L_FIX, // "sprmCChs" chp.fChsDiff and chp.chse;see below;3 bytes;
    0x6A09, 4, L_FIX, // "sprmCSymbol" chp.fSpec, chp.xchSym and chp.ftcSym;see below;variable length, length recorded is always 4;
    0x080A, 1, L_FIX, // "sprmCFOle2" chp.fOle2;1 or 0;bit;
//0x480B, 0, L_FIX, // "sprmCIdCharType" obsolete: not applicable in Word97 and later versions;;;
    0x2A0C, 1, L_FIX, // "sprmCHighlight" chp.fHighlight, chp.icoHighlight;ico (fHighlight is set to 1 iff ico is not 0);byte;
    0x680E, 4, L_FIX, // "sprmCObjLocation" chp.fcObj;FC;long;
//0x2A10, 0, L_FIX, // "sprmCFFtcAsciSymb" ;;;
    0x4A30, 2, L_FIX, // "sprmCIstd" chp.istd;istd, see stylesheet definition;short;
    0xCA31, 0, L_VAR, // "sprmCIstdPermute" chp.istd;permutation vector (see below);variable length;
    0x2A32, 0, L_VAR, // "sprmCDefault" whole CHP (see below);none;variable length;
    0x2A33, 0, L_FIX, // "sprmCPlain" whole CHP (see below);none;0;
//0x2A34, 0, L_FIX, // "sprmCKcd" ;;;
    0x0835, 1, L_FIX, // "sprmCFBold" chp.fBold;0,1, 128, or 129 (see below);byte;
    0x0836, 1, L_FIX, // "sprmCFItalic" chp.fItalic;0,1, 128, or 129 (see below);byte;
    0x0837, 1, L_FIX, // "sprmCFStrike" chp.fStrike;0,1, 128, or 129 (see below);byte;
    0x0838, 1, L_FIX, // "sprmCFOutline" chp.fOutline;0,1, 128, or 129 (see below);byte;
    0x0839, 1, L_FIX, // "sprmCFShadow" chp.fShadow;0,1, 128, or 129 (see below);byte;
    0x083A, 1, L_FIX, // "sprmCFSmallCaps" chp.fSmallCaps;0,1, 128, or 129 (see below);byte;
    0x083B, 1, L_FIX, // "sprmCFCaps" chp.fCaps;0,1, 128, or 129 (see below);byte;
    0x083C, 1, L_FIX, // "sprmCFVanish" chp.fVanish;0,1, 128, or 129 (see below);byte;
    0x4A3D, 2, L_FIX, // "sprmCFtcDefault" ;ftc, only used internally, never stored in file;word;
    0x2A3E, 1, L_FIX, // "sprmCKul" chp.kul;kul;byte;
    0xEA3F, 3, L_FIX, // "sprmCSizePos" chp.hps, chp.hpsPos;(see below);3 bytes;
    0x8840, 2, L_FIX, // "sprmCDxaSpace" chp.dxaSpace;dxa;word;
    0x4A41, 2, L_FIX, // "sprmCLid" ;only used internally never stored;word;
    0x2A42, 1, L_FIX, // "sprmCIco" chp.ico;ico;byte;
    0x4A43, 2, L_FIX, // "sprmCHps" chp.hps;hps;byte; ACHTUNG: ich nehme mal lieber ein: word;
    0x2A44, 1, L_FIX, // "sprmCHpsInc" chp.hps;(see below);byte;
    0x4845, 1, L_FIX, // "sprmCHpsPos" chp.hpsPos;hps;byte;
    0x2A46, 1, L_FIX, // "sprmCHpsPosAdj" chp.hpsPos;hps (see below);byte;
    0xCA47, 0, L_VAR, // "sprmCMajority" chp.fBold, chp.fItalic, chp.fSmallCaps, chp.fVanish, chp.fStrike, chp.fCaps, chp.rgftc, chp.hps, chp.hpsPos, chp.kul, chp.dxaSpace, chp.ico, chp.rglid;complex (see below);variable length, length byte plus size of following grpprl;
    0x2A48, 1, L_FIX, // "sprmCIss" chp.iss;iss;byte;
    0xCA49, 0, L_VAR, // "sprmCHpsNew50" chp.hps;hps;variable width, length always recorded as 2;
    0xCA4A, 0, L_VAR, // "sprmCHpsInc1" chp.hps;complex (see below);variable width, length always recorded as 2;
    0x484B, 2, L_FIX, // "sprmCHpsKern" chp.hpsKern;hps;short;
    0xCA4C, 2, L_FIX, // "sprmCMajority50" chp.fBold, chp.fItalic, chp.fSmallCaps, chp.fVanish, chp.fStrike, chp.fCaps, chp.ftc, chp.hps, chp.hpsPos, chp.kul, chp.dxaSpace, chp.ico,;complex (see below);variable length;
    0x4A4D, 2, L_FIX, // "sprmCHpsMul" chp.hps;percentage to grow hps;short;
    0x484E, 2, L_FIX, // "sprmCYsri" chp.ysri;ysri;short;
    0x4A4F, 2, L_FIX, // "sprmCRgFtc0" chp.rgftc[0];ftc for ASCII text (see below);short;
    0x4A50, 2, L_FIX, // "sprmCRgFtc1" chp.rgftc[1];ftc for Far East text (see below);short;
    0x4A51, 2, L_FIX, // "sprmCRgFtc2" chp.rgftc[2];ftc for non-Far East text (see below);short;
//0x4852, 0, L_FIX, // "sprmCCharScale" ;;;
    0x2A53, 1, L_FIX, // "sprmCFDStrike" chp.fDStrike;;byte;
    0x0854, 1, L_FIX, // "sprmCFImprint" chp.fImprint;1 or 0;bit;
    0x0855, 1, L_FIX, // "sprmCFSpec" chp.fSpec ;1 or 0;bit;
    0x0856, 1, L_FIX, // "sprmCFObj" chp.fObj;1 or 0;bit;
    0xCA57, 0, L_VAR, // "sprmCPropRMark" chp.fPropRMark, chp.ibstPropRMark, chp.dttmPropRMark;Complex (see below);variable length always recorded as 7 bytes;
    0x0858, 1, L_FIX, // "sprmCFEmboss" chp.fEmboss;1 or 0;bit;
    0x2859, 1, L_FIX, // "sprmCSfxText" chp.sfxtText;text animation;byte;
//0x085A, 0, L_FIX, // "sprmCFBiDi" ;;;
//0x085B, 0, L_FIX, // "sprmCFDiacColor" ;;;
//0x085C, 0, L_FIX, // "sprmCFBoldBi" ;;;
//0x085D, 0, L_FIX, // "sprmCFItalicBi" ;;;
//0x4A5E, 0, L_FIX, // "sprmCFtcBi" ;;;
//0x485F, 0, L_FIX, // "sprmCLidBi" ;;;
//0x4A60, 0, L_FIX, // "sprmCIcoBi" ;;;
//0x4A61, 0, L_FIX, // "sprmCHpsBi" ;;;
    0xCA62, 0, L_VAR, // "sprmCDispFldRMark" chp.fDispFldRMark, chp.ibstDispFldRMark, chp.dttmDispFldRMark ;Complex (see below);variable length always recorded as 39 bytes;
    0x4863, 2, L_FIX, // "sprmCIbstRMarkDel" chp.ibstRMarkDel;index into sttbRMark;short;
    0x6864, 4, L_FIX, // "sprmCDttmRMarkDel" chp.dttmRMarkDel;DTTM;long;
    0x6865, 4, L_FIX, // "sprmCBrc" chp.brc;BRC;long;
    0x4866, 2, L_FIX, // "sprmCShd" chp.shd;SHD;short;
    0x4867, 2, L_FIX, // "sprmCIdslRMarkDel" chp.idslRMReasonDel;an index to a table of strings defined in Word 6.0 executables;short;
    0x0868, 1, L_FIX, // "sprmCFUsePgsuSettings" chp.fUsePgsuSettings;1 or 0;bit;
    0x486B, 2, L_FIX, // "sprmCCpg" ;;word;
    0x486D, 2, L_FIX, // "sprmCRgLid0" chp.rglid[0];LID: for non-Far East text;word;
    0x486E, 2, L_FIX, // "sprmCRgLid1" chp.rglid[1];LID: for Far East text;word;
    0x286F, 1, L_FIX, // "sprmCIdctHint" chp.idctHint;IDCT: (see below);byte;
    0x2E00, 1, L_FIX, // "sprmPicBrcl" pic.brcl;brcl (see PIC structure definition);byte;
    0xCE01, 0, L_VAR, // "sprmPicScale" pic.mx, pic.my, pic.dxaCropleft, pic.dyaCropTop pic.dxaCropRight, pic.dyaCropBottom;Complex (see below);length byte plus 12 bytes;
    0x6C02, 4, L_FIX, // "sprmPicBrcTop" pic.brcTop;BRC;long;
    0x6C03, 4, L_FIX, // "sprmPicBrcLeft" pic.brcLeft;BRC;long;
    0x6C04, 4, L_FIX, // "sprmPicBrcBottom" pic.brcBottom;BRC;long;
    0x6C05, 4, L_FIX, // "sprmPicBrcRight" pic.brcRight;BRC;long;
    0x3000, 1, L_FIX, // "sprmScnsPgn" sep.cnsPgn;cns;byte;
    0x3001, 1, L_FIX, // "sprmSiHeadingPgn" sep.iHeadingPgn;heading number level;byte;
    0xD202, 0, L_VAR, // "sprmSOlstAnm" sep.olstAnm;OLST;variable length;
    0xF203, 3, L_FIX, // "sprmSDxaColWidth" sep.rgdxaColWidthSpacing;complex (see below);3 bytes;
    0xF204, 3, L_FIX, // "sprmSDxaColSpacing" sep.rgdxaColWidthSpacing;complex (see below);3 bytes;
    0x3005, 1, L_FIX, // "sprmSFEvenlySpaced" sep.fEvenlySpaced;1 or 0;byte;
    0x3006, 1, L_FIX, // "sprmSFProtected" sep.fUnlocked;1 or 0;byte;
    0x5007, 2, L_FIX, // "sprmSDmBinFirst" sep.dmBinFirst;;word;
    0x5008, 2, L_FIX, // "sprmSDmBinOther" sep.dmBinOther;;word;
    0x3009, 1, L_FIX, // "sprmSBkc" sep.bkc;bkc;byte;
    0x300A, 1, L_FIX, // "sprmSFTitlePage" sep.fTitlePage;0 or 1;byte;
    0x500B, 2, L_FIX, // "sprmSCcolumns" sep.ccolM1;# of cols - 1;word;
    0x900C, 2, L_FIX, // "sprmSDxaColumns" sep.dxaColumns;dxa;word;
    0x300D, 1, L_FIX, // "sprmSFAutoPgn" sep.fAutoPgn;obsolete;byte;
    0x300E, 1, L_FIX, // "sprmSNfcPgn" sep.nfcPgn;nfc;byte;
    0xB00F, 2, L_FIX, // "sprmSDyaPgn" sep.dyaPgn;dya;short;
    0xB010, 2, L_FIX, // "sprmSDxaPgn" sep.dxaPgn;dya;short;
    0x3011, 1, L_FIX, // "sprmSFPgnRestart" sep.fPgnRestart;0 or 1;byte;
    0x3012, 1, L_FIX, // "sprmSFEndnote" sep.fEndnote;0 or 1;byte;
    0x3013, 1, L_FIX, // "sprmSLnc" sep.lnc;lnc;byte;
    0x3014, 1, L_FIX, // "sprmSGprfIhdt" sep.grpfIhdt;grpfihdt (see Headers and Footers topic);byte;
    0x5015, 2, L_FIX, // "sprmSNLnnMod" sep.nLnnMod;non-neg int.;word;
    0x9016, 2, L_FIX, // "sprmSDxaLnn" sep.dxaLnn;dxa;word;
    0xB017, 2, L_FIX, // "sprmSDyaHdrTop" sep.dyaHdrTop;dya;word;
    0xB018, 2, L_FIX, // "sprmSDyaHdrBottom" sep.dyaHdrBottom;dya;word;
    0x3019, 1, L_FIX, // "sprmSLBetween" sep.fLBetween;0 or 1;byte;
    0x301A, 1, L_FIX, // "sprmSVjc" sep.vjc;vjc;byte;
    0x501B, 2, L_FIX, // "sprmSLnnMin" sep.lnnMin;lnn;word;
    0x501C, 2, L_FIX, // "sprmSPgnStart" sep.pgnStart;pgn;word;
    0x301D, 1, L_FIX, // "sprmSBOrientation" sep.dmOrientPage;dm;byte;
//0x301E, 0, L_FIX, // "sprmSBCustomize" ;;;

    0xB01F, 2, L_FIX, // "sprmSXaPage" sep.xaPage;xa;word;
    0xB020, 2, L_FIX, // "sprmSYaPage" sep.yaPage;ya;word;
    0xB021, 2, L_FIX, // "sprmSDxaLeft" sep.dxaLeft;dxa;word;
    0xB022, 2, L_FIX, // "sprmSDxaRight" sep.dxaRight;dxa;word;
    0x9023, 2, L_FIX, // "sprmSDyaTop" sep.dyaTop;dya;word;
    0x9024, 2, L_FIX, // "sprmSDyaBottom" sep.dyaBottom;dya;word;

    0xB025, 2, L_FIX, // "sprmSDzaGutter" sep.dzaGutter;dza;word;
    0x5026, 2, L_FIX, // "sprmSDmPaperReq" sep.dmPaperReq;dm;word;
    0xD227, 0, L_VAR, // "sprmSPropRMark" sep.fPropRMark, sep.ibstPropRMark, sep.dttmPropRMark ;complex (see below);variable length always recorded as 7 bytes;
//0x3228, 0, L_FIX, // "sprmSFBiDi" ;;;
//0x3229, 0, L_FIX, // "sprmSFFacingCol" ;;;
//0x322A, 0, L_FIX, // "sprmSFRTLGutter" ;;;
    0x702B, 4, L_FIX, // "sprmSBrcTop" sep.brcTop;BRC;long;
    0x702C, 4, L_FIX, // "sprmSBrcLeft" sep.brcLeft;BRC;long;
    0x702D, 4, L_FIX, // "sprmSBrcBottom" sep.brcBottom;BRC;long;
    0x702E, 4, L_FIX, // "sprmSBrcRight" sep.brcRight;BRC;long;
    0x522F, 2, L_FIX, // "sprmSPgbProp" sep.pgbProp;;word;
    0x7030, 4, L_FIX, // "sprmSDxtCharSpace" sep.dxtCharSpace;dxt;long;
    0x9031, 2, L_FIX, // "sprmSDyaLinePitch" sep.dyaLinePitch;dya;  WRONG:long;  RIGHT:short;  !!!
//0x5032, 0, L_FIX, // "sprmSClm" ;;;
    0x5033, 2, L_FIX, // "sprmSTextFlow" sep.wTextFlow;complex (see below);short;
    0x5400, 2, L_FIX, // "sprmTJc" tap.jc;jc;word (low order byte is significant);
    0x9601, 2, L_FIX, // "sprmTDxaLeft" tap.rgdxaCenter (see below);dxa;word;
    0x9602, 2, L_FIX, // "sprmTDxaGapHalf" tap.dxaGapHalf, tap.rgdxaCenter (see below);dxa;word;
    0x3403, 1, L_FIX, // "sprmTFCantSplit" tap.fCantSplit;1 or 0;byte;
    0x3404, 1, L_FIX, // "sprmTTableHeader" tap.fTableHeader;1 or 0;byte;
    0xD605, 0, L_VAR, // "sprmTTableBorders" tap.rgbrcTable;complex(see below);24 bytes;
    0xD606, 0, L_VAR, // "sprmTDefTable10" tap.rgdxaCenter, tap.rgtc;complex (see below);variable length;
    0x9407, 2, L_FIX, // "sprmTDyaRowHeight" tap.dyaRowHeight;dya;word;
    0xD608, 0, L_VAR, // "sprmTDefTable" tap.rgtc;complex (see below);;
    0xD609, 0, L_VAR, // "sprmTDefTableShd" tap.rgshd;complex (see below);;
    0x740A, 2, L_FIX, // "sprmTTlp" tap.tlp;TLP;4 bytes;
//0x560B, 0, L_FIX, // "sprmTFBiDi" ;;;
//0x740C, 0, L_FIX, // "sprmTHTMLProps" ;;;
    0xD620, 0, L_VAR, // "sprmTSetBrc" tap.rgtc[].rgbrc;complex (see below);5 bytes;
    0x7621, 4, L_FIX, // "sprmTInsert" tap.rgdxaCenter, tap.rgtc;complex (see below);4 bytes;
    0x5622, 2, L_FIX, // "sprmTDelete" tap.rgdxaCenter, tap.rgtc;complex (see below);word;
    0x7623, 2, L_FIX, // "sprmTDxaCol" tap.rgdxaCenter;complex (see below);4 bytes;
    0x5624, 0, L_VAR, // "sprmTMerge" tap.fFirstMerged, tap.fMerged;complex (see below);word;
    0x5625, 0, L_VAR, // "sprmTSplit" tap.fFirstMerged, tap.fMerged;complex (see below);word;
    0xD626, 0, L_VAR, // "sprmTSetBrc10" tap.rgtc[].rgbrc;complex (see below);5 bytes;
    0x7627, 0, L_VAR, // "sprmTSetShd" tap.rgshd;complex (see below);4 bytes;
    0x7628, 0, L_VAR, // "sprmTSetShdOdd" tap.rgshd;complex (see below);4 bytes;
    0x7629, 0, L_VAR, // "sprmTTextFlow" tap.rgtc[].fVerticaltap.rgtc[].fBackwardtap.rgtc[].fRotateFont;0 or 10 or 10 or 1;word;
//0xD62A, 0, L_FIX, // "sprmTDiagLine" ;;;
    0xD62B, 0, L_VAR, // "sprmTVertMerge" tap.rgtc[].vertMerge;complex (see below);variable length always recorded as 2 bytes;
        0xD62C, 0, L_VAR, // "sprmTVertAlign" tap.rgtc[].vertAlign;complex (see below);variable length always recorded as 3 byte;

};



static int
#if defined( WNT )
 __cdecl
#endif
#if defined( ICC )
 _Optlink
#endif
    CompSprmId( const void *pFirst, const void *pSecond)
{
    return( ((SprmInfo*)pFirst )->nId - ((SprmInfo*)pSecond)->nId );
}


SprmInfo& WW8GetSprmInfo( USHORT nId )
{
    // ggfs. Tab sortieren
    static BOOL bInit = FALSE;
    if( !bInit )
    {
        qsort( (void*)aWwSprmTab,
            sizeof( aWwSprmTab      ) / sizeof (aWwSprmTab[ 0 ]),
            sizeof( aWwSprmTab[ 0 ] ),
            CompSprmId );
        bInit = TRUE;
    }
    // Sprm heraussuchen
    void* pFound;
    SprmInfo aSrch;
    aSrch.nId = nId;
    if( 0 == ( pFound = bsearch( (char *) &aSrch,
                        (void*) aWwSprmTab,
                        sizeof( aWwSprmTab      ) / sizeof (aWwSprmTab[ 0 ]),
                        sizeof( aWwSprmTab[ 0 ] ),
                        CompSprmId )))
    {
        // im Fehlerfall auf Nulltes Element verweisen
        pFound = (void*)aWwSprmTab;
    }
    return *(SprmInfo*) pFound;
}



//-----------------------------------------
//              Sprms
//-----------------------------------------

static short WW8GetSprmSize0( USHORT nId, BYTE* pSprm, BYTE nDelta)
{
    SprmInfo& rSprm = WW8GetSprmInfo( nId );
    short nL = 0;                       // soviel Bytes sind zu lesen

    //sprmPChgTabs
    switch( nId )
    {
    case 23:
    case 0xC615:
        if( SVBT16ToShort( &pSprm[1 + nDelta] ) != 255 )
            nL = SVBT16ToShort( &pSprm[1 + nDelta] ) + rSprm.nLen - 1;
        else
        {
            BYTE nDel = pSprm[2 + nDelta];
            BYTE nIns = pSprm[3 + nDelta + 4 * nDel];

            nL = 2 + 4 * nDel + 3 * nIns;
        }
        break;

    case 0xd608:
        nL = SVBT16ToShort( &pSprm[1 + nDelta] );
        break;

    default:
        switch ( rSprm.nVari )
        {
        case L_FIX: nL = rSprm.nLen;        // Excl. Token
                    break;
        case L_VAR: nL = (short)pSprm[1 + nDelta]// Variable 1-Byte Laenge?
                     + rSprm.nLen;      // Excl. Token + Var-Laengenbyte
                    break;
    //  case L_VAR2: nL = ( *(short*)&pSprm[1 + nDelta] )   // Variable 2-Byte Laenge?
        case L_VAR2: nL = SVBT16ToShort( &pSprm[1 + nDelta] )   // Variable 2-Byte Laenge?
                     + rSprm.nLen - 1;  // Excl. Token + Var-Laengenbyte
                    break;
        }
        break;
    }
    return nL;
}


USHORT WW8CountSprms( BYTE   nVersion,
                      BYTE*  pSp,
                      long   nSprmSiz,
                      const  SvUShortsSort* pIgnoreSprms )
{
    BYTE nDelta = ( 8 > nVersion ) ? 0 : 1;
    USHORT nMySprms = 0;
    for(short i=0; i+1+nDelta < nSprmSiz;  )
    {
        USHORT nSpId = WW8GetSprmId( nVersion, pSp );

        if( !nSpId )
            break;

        short nSpLen = WW8GetSprmSizeBrutto( nVersion, pSp, &nSpId  );
        // erhoehe Zeiger, so dass er auf naechsten Sprm zeigt
        i += nSpLen;
        pSp += nSpLen;

        if( !pIgnoreSprms || USHRT_MAX == pIgnoreSprms->Seek_Entry( nSpId ) )
        {
            ++nMySprms;
        }
    }
    return nMySprms;
}

BOOL WW8PLCFx_SEPX::CompareSprms( BYTE*  pOtherSprms,
                                  long   nOtherSprmSiz,
                                  const  SvUShortsSort* pIgnoreSprms ) const
{
    BOOL bRes = FALSE;
    BYTE* pSp   = pSprms;
    short i;
    BYTE nDelta = ( 8 > GetVersion()) ? 0 : 1;

    if(    WW8CountSprms(GetVersion(), pSp, nSprmSiz, pIgnoreSprms)
        == WW8CountSprms(GetVersion(), pOtherSprms, nOtherSprmSiz, pIgnoreSprms) )
    {
        bRes = TRUE;
        for( i=0; i+1+nDelta < nSprmSiz;    )
        {
            USHORT nSpId = WW8GetSprmId( GetVersion(), pSp );

            if( !nSpId )
                break;

            short nSpLen = WW8GetSprmSizeBrutto( GetVersion(), pSp, &nSpId  );

            if( !pIgnoreSprms || !pIgnoreSprms->Seek_Entry( nSpId ) )
            {
                BYTE* pOtherSp = HasSprm( nSpId, pOtherSprms, nOtherSprmSiz );

                if(    ( !pOtherSp )
                    || (0 != memcmp( pSp + 1 + nDelta + WW8SprmDataOfs( nSpId ),
                                     pOtherSp,
                                     WW8GetSprmSize0( nSpId, pSp, nDelta ) ) ) )
                {
                    bRes = FALSE;
                    break;
                }
            }
            // erhoehe Zeiger, so dass er auf naechsten Sprm zeigt
            i += nSpLen;
            pSp += nSpLen;
        }
    }
    return bRes;    // unterschiedliche Sprms ?
}


// ein bzw. zwei Byte am Anfang des Sprm sind die Id
USHORT WW8GetSprmId( BYTE nVersion, BYTE* pSp, BYTE* pDelta )
{
    USHORT nId = 0;
    if( pSp )
    {
        switch( nVersion )  // 6 steht fuer "6 ODER 7",  7 steht fuer "NUR 7"
        {
            case 6:
            case 7: nId = *pSp;
                    if( 0x0100 < nId ) nId = 0;
                    if( pDelta ) *pDelta = 0;
                    break;
            case 8: nId = SVBT16ToShort( &pSp[ 0 ] );
                    if( 0x0800 > nId )
                        nId = 0;
                    if( pDelta )
                        *pDelta = 1;
                    break;
            default:ASSERT( nId, "Es wurde vergessen, nVersion zu kodieren!" );
        }
    }
    return nId;
}


// ohne Token und LaengenByte
short WW8GetSprmSizeNetto( BYTE nVersion, BYTE* pSprm, USHORT* pId )
{
    BYTE   nDelta = ( 8 > nVersion ) ? 0 : 1;
    USHORT nId = pId ? *pId : WW8GetSprmId( nVersion, pSprm );
    return WW8GetSprmSize0( nId, pSprm, nDelta );
}


// mit Token und LaengenByte
short WW8GetSprmSizeBrutto( BYTE nVersion, BYTE* pSprm, USHORT* pId )
{
    BYTE   nDelta = ( 8 > nVersion ) ? 0 : 1;
    USHORT nId = pId ? *pId : WW8GetSprmId( nVersion, pSprm );
    return WW8GetSprmSize0( nId, pSprm, nDelta )
            + 1 + nDelta
            + WW8GetSprmInfo( nId ).nVari;
}

BYTE WW8SprmDataOfs( USHORT nId )
{
    return WW8GetSprmInfo( nId ).nVari;
}


/*************************************************************************
      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ww8/ww8scan.cxx,v 1.1.1.1 2000-09-18 17:14:59 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.106  2000/09/18 16:05:02  willem.vandorp
      OpenOffice header added.

      Revision 1.105  2000/08/24 06:42:57  khz
      #75708# advance StartPos of attributes starting on a Table-Row-End by 1

      Revision 1.104  2000/08/22 12:25:11  khz
      #77550# prevent invalid SPRMs from setting pMemPos to 0x00000001

      Revision 1.103  2000/08/21 15:03:01  khz
      #77692# import page orientation

      Revision 1.102  2000/08/18 09:49:57  khz
      Skip trailing WORD (instead of BYTE) in WW8Read_xstz

      Revision 1.101  2000/07/28 08:01:46  khz
      #77183# avoid accessing pPcd when there is NO Piece Table

      Revision 1.100  2000/07/19 10:36:50  khz
      ##76458# wrong parameter calling WW8Read_xstz in WW8ReadSTTBF() ctor fixed

      Revision 1.99  2000/07/12 12:24:27  khz
      #76503# use WW8PLCFx_Cp_FKP::?etIdx2() to save/restore nIdx of pPcd

      Revision 1.98  2000/06/07 12:43:18  khz
      Changes for Unicode

      Revision 1.97  2000/05/31 12:23:01  khz
      Changes for Unicode

      Revision 1.96  2000/05/25 09:55:51  hr
      workaound for Solaris Workshop compiler, SWAPLONG -> SWAPSHORT

      Revision 1.95  2000/05/25 08:06:31  khz
      Piece Table optimization, Unicode changes, Bugfixes

      Revision 1.94  2000/05/18 10:58:46  jp
      Changes for Unicode

      Revision 1.93  2000/05/16 12:13:09  jp
      ASS_FALSE define removed

      Revision 1.92  2000/05/16 11:07:52  khz
      Unicode code-conversion

      Revision 1.91  2000/05/04 07:39:27  khz
      Task #75379# added Save() and Restore() to WW8PLCFx, WW8PLCFx_Cp_FKP, WW8PLCFxDesc (2)

      Revision 1.90  2000/05/04 07:32:46  khz
      Task #75379# added Save() and Restore() to WW8PLCFx, WW8PLCFx_Cp_FKP, WW8PLCFxDesc

      Revision 1.89  2000/03/06 16:57:48  khz
      Task #73790# Convert Filenames by methode regarding byte order (2)

      Revision 1.88  2000/03/03 15:54:08  khz
      Task #73790# Convert Filenames by methode regarding byte order

      Revision 1.87  2000/02/29 13:33:19  cmc
      #73671# Fix: Error in endnote seperator skip code

      Revision 1.86  2000/02/23 17:42:59  cmc
      #68832# Consider endnotes for header footer code

      Revision 1.85  2000/02/23 13:33:48  khz
      Task #70473# changes for unicode

      Revision 1.83  2000/02/22 16:23:19  khz
      Task #72987# Ignore Sprms covering ONLY a Tab-Row-End Char #7

      Revision 1.82  2000/02/22 10:39:56  cmc
      #73289# RowEnd Search failing due to lack of atributes of piece

      Revision 1.81  2000/02/18 15:10:27  khz
      #70473# changes for unicode

      Revision 1.80  2000/02/15 09:12:54  khz
      Task #71565# workaround because String::ConvertFromWChar cannot convert 0xF0..

      Revision 1.79  2000/02/14 09:11:34  cmc
      #72579# removed old glossary test code

      Revision 1.77  2000/02/09 11:31:50  khz
      Task #70473# char_t --> sal_Unicode

      Revision 1.76  2000/02/09 08:57:28  khz
      Task #72647# Read SPRMs that are stored in piece table grpprls (2)

      Revision 1.75  2000/02/03 10:08:30  cmc
      #72268# Allow create fib from offset, added data to STTBF

      Revision 1.74  2000/02/02 18:07:47  khz
      Task #69885# Read SPRMs that are stored in piece table grpprls

      Revision 1.73  1999/12/21 08:02:45  khz
      Task #68143# nIdx set to Zero caused Hd/Ft to get wrong sprms

      Revision 1.72  1999/12/07 14:29:00  khz
      Task #69508# import sprmPHugePapx by reading DATA stream

      Revision 1.71  1999/12/07 09:53:04  khz
      Task #67979# typo-error corrected (was '==' instead of '=')

      Revision 1.70  1999/12/06 19:34:27  khz
      Task #67979# Absolute Positioned Object must have SPRM 5 or SPRM 29

      Revision 1.69  1999/11/19 15:09:24  khz
      Task #69910# Use extra PLCF structure for field!

      Revision 1.68  1999/11/03 17:20:04  khz
      Task #68676# GPF when loading file under Solaris (reading FFN structures)

      Revision 1.67  1999/10/21 15:36:25  khz
      Import Redlining (4)

      Revision 1.66  1999/10/13 21:06:47  khz
      Import Redlining (3)

      Revision 1.65  1999/10/08 09:25:29  khz
      Import Redlining

      Revision 1.64  1999/09/10 15:36:43  khz
      CharSet matching made by TENCINFO.H::rtl_getTextEncodingFromWindowsCharset()

      Revision 1.63  1999/09/09 18:16:17  khz
      CharSet matching now done in central methode WW8SCAN.HXX::WW8GetCharSet()

      Revision 1.62  1999/09/08 13:26:13  khz
      Better performance by reducing use of SWAP..() and SVBT..To..() methods

      Revision 1.61  1999/08/30 19:53:02  JP
      Bug #68219#: no static members - be reentrant


      Rev 1.60   30 Aug 1999 21:53:02   JP
   Bug #68219#: no static members - be reentrant

      Rev 1.59   09 Aug 1999 18:34:38   KHZ
   Task #67543# Import of Property Modifier(variant 1) (PRM) in WW8 docs

      Rev 1.58   18 Jun 1999 15:53:56   KHZ
   Reference field (page, bookmark, footnote) part#1

      Rev 1.57   15 Jun 1999 14:34:56   JP
   for Export: FIB - read/write SttbListNames

      Rev 1.56   14 Jun 1999 16:00:18   KHZ
   Task #66411# allow import of document even when SEPX is missing completely

      Rev 1.55   03 Jun 1999 16:58:56   KHZ
   Task #66418# Nach C'tor WW8Fkp ein ''pSt->Seek( nOldPos );'' ausfuehren!

      Rev 1.54   03 Jun 1999 11:42:46   KHZ
   Task #66398# Variante 1 fuer PRM ist bei Ver67 Ok.

      Rev 1.53   02 Jun 1999 17:07:46   KHZ
   Task #66393# in WW8Cp2Fc ist *pIsUnicode bei bVer67 zu initialisieren

      Rev 1.52   02 Jun 1999 09:32:44   KHZ
   Task #66227# a) kein Unicode bei Ver67 ;-)  b) Grafik in grupp. Textbox

      Rev 1.51   28 May 1999 09:59:12   JP
   Fib-CTOR: wichtige Flags fuer den W97-Export setzen

      Rev 1.50   28 May 1999 09:19:22   KHZ
   Task #66395# Return-Adresse kein komplexer Ausdruck mehr

      Rev 1.49   26 May 1999 10:58:02   JP
   Fib: einige Konstanten nachgetragen

      Rev 1.48   21 May 1999 01:58:08   JP
   Export von WW97 Format: DOP in TableStream

      Rev 1.47   19 May 1999 11:12:54   JP
   WinWord97-ExportFilter

      Rev 1.46   11 May 1999 17:15:32   KHZ
   Task #66019# FontFamily: andere Bitreihenfolge auf Solaris beachten

      Rev 1.45   14 Apr 1999 14:20:12   KHZ
   Task #61268# Solaris-Problem wegen drei vergessenen SVBT16-Umwandlungen

      Rev 1.44   13 Apr 1999 16:02:28   KHZ
   Task #61268# SVBT16 statt USHORT bei Bookmarks eingesetzt

      Rev 1.43   10 Mar 1999 15:11:12   KHZ
   Task #62521# Einlesen von Sonderzeichen

      Rev 1.42   08 Mar 1999 11:48:48   KHZ
   Task #57749# Writer kann jetzt spaltige Bereiche

      Rev 1.41   26 Feb 1999 14:43:38   KHZ
   Task #59715# Behandlung von Section breaks

      Rev 1.40   25 Jan 1999 10:22:38   KHZ
   Task #60715# in Textobjekt verankerte Grafik als Grafik importieren

      Rev 1.39   19 Jan 1999 10:47:42   KHZ
   Task #60878# WW8Cp2Fc setzt *pIsUniCode bei Non-Complex auf FALSE

      Rev 1.38   18 Jan 1999 08:57:08   KHZ
   Task #60878# WW8Dp2Fc nur dann Assertion, wenn kein pTestFlag

      Rev 1.37   11 Dec 1998 11:12:38   JP
   Task #59580# Unicode (3) - Bug behoben beim Read_Xstz

      Rev 1.36   10 Dec 1998 21:29:00   JP
   Bug #59643#: benutzerdefinierte Zeichen von Fuss-/EndNoten verarbeiten

      Rev 1.35   07 Dec 1998 18:17:06   KHZ
   Task #59580# falsches Feldende: WW8SkipField verglich mit 0x7f statt 0x1f

      Rev 1.34   05 Dec 1998 17:10:26   KHZ
   Task #59580# Unicode (3)

      Rev 1.33   04 Dec 1998 20:19:50   KHZ
   Task #58766# Textboxen mit Unicode-Inhalt

      Rev 1.32   03 Dec 1998 19:10:02   KHZ
   Task #58766# Unicode-Import (2)

      Rev 1.31   03 Dec 1998 10:39:50   JP
   Task #60063#: Kommentare als PostIts einlesen

      Rev 1.30   02 Dec 1998 16:57:02   JP
   Task #60063#: Kommentare als PostIts einlesen

      Rev 1.29   30 Nov 1998 17:46:50   JP
   Task #59822#: OLE-Objecte importieren

      Rev 1.28   30 Nov 1998 17:30:36   KHZ
   Task #54828# Unicode-Import

      Rev 1.27   03 Nov 1998 18:29:54   KHZ
   Task #57243# Performance-Gewinn durch Vermeiden ueberfluessiger WW8GetSprmId()

      Rev 1.26   02 Nov 1998 17:58:32   KHZ
   Task #57017# Textmarken-Namen als UNICODE-Strings

      Rev 1.25   16 Oct 1998 16:12:34   KHZ
   Task #53520# ueberpruefe Feld DRUCKDATUM in DocInfo anhand von WW-internem Feld

      Rev 1.24   22 Sep 1998 19:37:42   KHZ
   Bug #57018# Fontnamen wurden unrichtig importiert

      Rev 1.23   22 Sep 1998 17:40:24   KHZ
   Bug #56310# Kopf-/Fusszeilen in Unicode-Dokumenten jetzt korrekt

      Rev 1.22   03 Sep 1998 22:15:40   KHZ
   Task #55189# Textboxen

      Rev 1.21   27 Aug 1998 10:12:28   KHZ
   Task #55189# Escher-Import fuer Draw, Calc und Writer

      Rev 1.20   11 Aug 1998 12:26:16   KHZ
   Task #52607# Optimierung in AdjustEnds(), GetNewSprms(), GetNoNewSprms()

      Rev 1.19   30 Jul 1998 14:47:24   JP
   Bug #54385#: wchar_t ist unter UNX ein long und kein UINT16

      Rev 1.18   30 Jul 1998 00:02:54   KHZ
   Task #53614# Grafiken, die NICHT ueber dem Text liegen (MSDFF-Quick-Hack)

      Rev 1.17   29 Jul 1998 16:53:18   KHZ
   Task #52607# Fehler in FKP (Teil 2)

      Rev 1.16   29 Jul 1998 13:56:10   KHZ
   Task #52607# Fehler in FKP

      Rev 1.15   28 Jul 1998 22:27:28   KHZ
   Task #52607# nummerierte Listen (Teil 3)

      Rev 1.14   28 Jul 1998 11:05:46   KHZ
   Task #52607# nummerierte Listen (Teil 1)

      Rev 1.13   22 Jul 1998 15:32:56   KHZ
   Task #52607#

      Rev 1.12   21 Jul 1998 14:52:28   KHZ
   Task #52607# (WW 97 Import)

      Rev 1.11   21 Jul 1998 12:32:52   KHZ
   als MSDrawingObject eingebettete Grafik (Teil 1)

      Rev 1.10   16 Jul 1998 21:50:14   KHZ
   Task #52607# Compilererror wg. (rLen *= 2) -= 2

      Rev 1.9   15 Jul 1998 15:47:18   KHZ
   Task #52607# Felder

      Rev 1.8   14 Jul 1998 16:34:18   KHZ
   Task #52607# Absatz- und Zeichen-Styles

      Rev 1.7   13 Jul 1998 15:29:46   KHZ
   Task #52607# Seitenvorlage fuer 1st Page, embed. Grafik (NICHT UEBER Text)

      Rev 1.6   30 Jun 1998 21:33:20   KHZ
   Header/Footer/Footnotes weitgehend ok

      Rev 1.5   26 Jun 1998 20:50:22   KHZ
   Absatz-Attribute jetzt weitestgehend ok

      Rev 1.4   23 Jun 1998 20:49:26   KHZ
   verarbeitet jetzt auch mehrere FKPs

      Rev 1.3   23 Jun 1998 11:24:28   KHZ
   Zwischenstand: die meisten Zeichenattribute Ok!

      Rev 1.2   18 Jun 1998 09:47:12   KHZ
   Zwischenstand fur 396c

      Rev 1.1   16 Jun 1998 18:35:30   KHZ
   DaSi-Stand

      Rev 1.0   16 Jun 1998 10:57:24   KHZ
   Initial revision.

      Rev 1.1   10 Jun 1998 17:22:32   KHZ
   Zwischenstand-Sicherung Dumper

      Rev 1.0   27 May 1998 15:29:02   KHZ
   Initial revision.


*************************************************************************/
diff --git a/sw/source/filter/ww8/ww8scan.hxx b/sw/source/filter/ww8/ww8scan.hxx
new file mode 100644
index 0000000..04c00a1
--- /dev/null
+++ b/sw/source/filter/ww8/ww8scan.hxx
@@ -0,0 +1,1729 @@
/*************************************************************************
 *
 *  $RCSfile: ww8scan.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:59 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _WW8SCAN_HXX
#define _WW8SCAN_HXX


#ifndef LONG_MAX
#include <limits.h>
#endif
#ifndef _SAL_TYPES_H
#include <sal/types.h>
#endif
#ifndef _SOLAR_H
#include <tools/solar.h>        // UINTXX
#endif
#ifndef _TABLE_HXX //autogen
#include <tools/table.hxx>
#endif
#ifndef _DATETIME_HXX //autogen
#include <tools/datetime.hxx>
#endif
#ifndef _STREAM_HXX //autogen
#include <tools/stream.hxx>
#endif
#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif


#define _SVSTDARR_STRINGS
#include <svtools/svstdarr.hxx>

#ifndef WW8STRUC_HXX
#include <ww8struc.hxx>     // FIB, STSHI, STD
#endif

#ifndef DELETEZ
#define DELETEZ( p ) ( delete( p ), p = 0 )
#endif


//class SvStream;
class  UShortStk;
class  WW8Fib;
class  WW8ScannerBase;
class  WW8PLCFspecial;
struct WW8PLCFxDesc;
class  WW8PLCFx_PCD;
class  SvUShortsSort;


String WW8ReadPString( SvStream& rStrm, rtl_TextEncoding eEnc,
                       BOOL bAtEndSeekRel1 = TRUE );

// Folgende Methode liest einen 2-byter-UNICODE-String ein:
// - falls bAtEndSeekRel1 gesetzt ist, wird am Ende genau EIN Byte uebersprungen,
// - falls nChars (die Zeichen-Anzahl, NICHT die Byte-Anzahl) nicht gesetzt ist,
//   wird das erste USHORT als Lannengenangabe interpretiert,
//   ansonsten als erstes String-Zeichen genommen.
String WW8Read_xstz(SvStream& rStrm,
                    USHORT nChars,
                    BOOL   bAtEndSeekRel1);


// read array of strings (see MS documentation: STring TaBle stored in File)
// returns NOT the original pascal strings but an array of converted char*
//
// attention: the *extra data* of each string are SKIPPED and ignored

/*  to be optimized like this:    */
void WW8ReadSTTBF(  BOOL bVer8, SvStream& rStrm,
                    UINT32 nStart, INT32 nLen, USHORT nSkip,
                    rtl_TextEncoding eCS,
                    SvStrings &rArray, SvStrings* pExtraArray = 0 );



USHORT WW8GetSprmId(        BYTE nVersion, BYTE* pSp,   BYTE*   pDelta = 0 );
short WW8GetSprmSizeNetto(  BYTE nVersion, BYTE* pSprm, USHORT* pId );
short WW8GetSprmSizeBrutto( BYTE nVersion, BYTE* pSprm, USHORT* pId );
BYTE WW8SprmDataOfs( USHORT nId );

struct WW8FieldDesc
{
    long nLen;              // Gesamtlaenge ( zum Text ueberlesen )
    WW8_CP nSCode;           // Anfang Befehlscode
    long nLCode;            // Laenge
    WW8_CP nSRes;           // Anfang Ergebnis
    long nLRes;             // Laenge ( == 0, falls kein Ergebnis )
    USHORT nId;             // WW-Id fuer Felder
    BYTE nOpt;              // WW-Flags ( z.B.: vom User geaendert )
    BOOL bCodeNest:1;       // Befehl rekursiv verwendet
    BOOL bResNest:1;        // Befehl in Resultat eingefuegt
};

BOOL WW8GetFieldPara( BYTE nVersion, WW8PLCFspecial& rPLCF, WW8FieldDesc& rF );


struct WW8PLCFxSave1
{
    ULONG nPLCFxPos;
    ULONG nPLCFxPos2;       // fuer PLCF_Cp_Fkp: PieceIter-Pos
    long nPLCFxMemOfs;
    WW8_CP nAttrStart;
    WW8_CP nAttrEnd;
    BOOL   bLineEnd;
};


/*
    u.a. fuer Felder, also genausoviele Attr wie Positionen,
    falls Ctor-Param bNoEnd = false
*/
class WW8PLCFspecial        // Iterator fuer PLCFs
{
    INT32* pPLCF_PosArray;  // Pointer auf Pos-Array und auf ganze Struktur
    BYTE*  pPLCF_Contents;  // Pointer auf Inhalts-Array-Teil des Pos-Array
    long nIMax;         // Anzahl der Elemente
    long nIdx;          // Merker, wo wir gerade sind
    long nStru;

public:
    WW8PLCFspecial( SvStream* pSt, long nFilePos, long nPLCF,
          long nStruct, long nStartPos = -1, BOOL bNoEnd = FALSE );
    ~WW8PLCFspecial(){ delete( pPLCF_PosArray ); pPLCF_PosArray = 0; }
    ULONG GetIdx() const { return (ULONG)nIdx; }
    void SetIdx( ULONG nI ) { nIdx = (long)nI; }    // geht ueber Nummer
    long GetIMax(){ return nIMax; }
    BOOL SeekPos( long nPos );          // geht ueber FC- bzw. CP-Wert
                                                                    // bzw. naechste groesseren Wert
    BOOL SeekPosExact( long nPos );
    long Where() { return ( nIdx >= nIMax ) ? LONG_MAX : pPLCF_PosArray[nIdx]; }
    BOOL Get( long& rStart, void*& rpValue );
    BOOL GetData( long nIdx, long& rPos, void*& rpValue );

    const void* GetData( long nIdx ) const {
        return ( nIdx >= nIMax ) ? 0 : (const void*)&pPLCF_Contents[nIdx * nStru]; }
    long GetPos( long nIdx ){
        return ( nIdx >= nIMax ) ? LONG_MAX : pPLCF_PosArray[nIdx]; }

    WW8PLCFspecial& operator ++( int ) { nIdx++; return *this; }
    WW8PLCFspecial& operator --( int ) { nIdx--; return *this; }
};




/*
    simple Iterator for SPRMs
*/
class WW8SprmIter
{
    // these members will be updated
    BYTE*   pSprms;     // remaining part of the SPRMs ( == start of akt. SPRM)
    BYTE*   pAktParams; // start of akt. SPRM's parameters
    USHORT  nAktId;
    short   nAktSizeBrutto;

    // these members will *not* be updated by UpdateMyMembers()
    BYTE    nVersion;
    BYTE    nDelta;
    short   nRemLen;    // length of remaining SPRMs (including akt. SPRM)

    void UpdateMyMembers();
public:
    WW8SprmIter( BYTE* pSprms_, short nLen_, BYTE nVersion_ );
    void   SetSprms( BYTE* pSprms_, short nLen_ );
    BYTE*  operator ++( int );
    BYTE*  GetSprms()     const { return ( pSprms && (0 < nRemLen) )
                                ? pSprms
                                : 0; }
    BYTE*  GetAktParams() const { return pAktParams; }
    USHORT GetAktId()     const { return nAktId; }
};



/*
    u.a. fuer FKPs auf normale Attr., also ein Attr weniger als Positionen
*/
class WW8PLCF                       // Iterator fuer PLCFs
{
    INT32* pPLCF_PosArray;  // Pointer auf Pos-Array und auf ganze Struktur
    BYTE* pPLCF_Contents;       // Pointer auf Inhalts-Array-Teil des Pos-Array
    long nIMax;                         // Anzahl der Elemente
    long nIdx;
    long nStru;

    void ReadPLCF( SvStream* pSt, long nFilePos, long nPLCF );

    /*
        Falls im Dok ein PLC fehlt und die FKPs solo dastehen,
        machen wir uns hiermit einen PLC:
    */
    void GeneratePLCF( SvStream* pSt, long nPN, long ncpN );

public:
    WW8PLCF( SvStream* pSt, long nFilePos, long nPLCF,
        long nStruct, long nStartPos = -1 );

    /*
        folgender Ctor generiert ggfs. einen PLC aus nPN und ncpN
    */
    WW8PLCF( SvStream* pSt, long nFilePos, long nPLCF,
        long nStruct, long nStartPos, long nPN, long ncpN );

    ~WW8PLCF(){ delete( pPLCF_PosArray ); pPLCF_PosArray = 0; }
    ULONG GetIdx() const { return (ULONG)nIdx; }
    void SetIdx( ULONG nI ) { nIdx = (long)nI; }
    long GetIMax(){ return nIMax; }
    BOOL SeekPos( long nPos );
    long Where();
    BOOL Get( long& rStart, long& rEnd, void*& rpValue );
    WW8PLCF& operator ++( int ) { if( nIdx < nIMax ) nIdx++; return *this; }

    const void* GetData( long nIdx ) const {
        return ( nIdx >= nIMax ) ? 0 : (const void*)&pPLCF_Contents[nIdx * nStru]; }
};


DECLARE_TABLE( WW8Pcd_FC_sortArr, INT32 )


/*
    fuer Piece Table (bei Schnellspeicherung)
*/
class WW8PLCFpcd
{
friend class WW8PLCFpcd_Iter;
    WW8Pcd_FC_sortArr aFC_sort; // sorted PCD entries by FC
    INT32* pPLCF_PosArray;  // Pointer auf Pos-Array und auf ganze Struktur
    BYTE*  pPLCF_Contents;  // Pointer auf Inhalts-Array-Teil des Pos-Array
    long nIMax;
    long nStru;

public:
    WW8PLCFpcd( SvStream* pSt, long nFilePos, long nPLCF, long nStruct );
    ~WW8PLCFpcd(){ delete( pPLCF_PosArray ); }
    ULONG FindIdx( WW8_FC nFC ) const;
};

/*
    mehrere WW8PLCFpcd_Iter koennen auf die gleiche WW8PLCFpcd zeigen !!!
*/
class WW8PLCFpcd_Iter
{
    WW8PLCFpcd& rPLCF;
    long nIdx;

public:
    WW8PLCFpcd_Iter( WW8PLCFpcd& rPLCFpcd, long nStartPos = -1 );
//  ~WW8PLCFpcd_Iter() {}
    ULONG GetIdx() const { return (ULONG)nIdx; }
    void SetIdx( ULONG nI ) { nIdx = (long)nI; }
    long GetIMax(){ return rPLCF.nIMax; }
    BOOL SeekPos( long nPos );
//  BOOL SeekMaxMainFC( WW8Fib& rWwF, long& rMaxPosData );
    long Where();
    BOOL Get( long& rStart, long& rEnd, void*& rpValue );
    ULONG FindIdx( WW8_FC nFC ) const { return rPLCF.FindIdx( nFC ); }
    WW8PLCFpcd_Iter& operator ++( int ) { if( nIdx < rPLCF.nIMax ) nIdx++; return *this; }
};

// PLCF-Typ:
enum ePLCFT{ CHP=0, PAP, SEP, /*HED, FNR, ENR,*/ PLCF_END };

/*
    pure virtual:
*/
class WW8PLCFx              // virtueller Iterator fuer Piece Table Exceptions
{
    BYTE nVersion;              // Versionsnummer des FIB
    BOOL bIsSprm;               // PLCF von Sprms oder von anderem ( Footnote, ... )

public:
    WW8PLCFx( BYTE nFibVersion, BOOL bSprm )
        { bIsSprm = bSprm; nVersion = nFibVersion; }

//  virtual ~WW8PLCFx() {}
    BOOL IsSprm() { return bIsSprm; }
    virtual ULONG GetIdx() const = 0;
    virtual void SetIdx( ULONG nIdx ) = 0;
    virtual ULONG GetIdx2() const;
    virtual void SetIdx2( ULONG nIdx );
    virtual BOOL SeekPos( WW8_CP nCpPos ) = 0;
    virtual long Where() = 0;
//  virtual BYTE* GetSprms( long& rStart, long& rEnd, long& rLen );
    virtual void GetSprms( WW8PLCFxDesc* p );
    virtual long GetNoSprms( long& rStart, long&, long& rLen );
    virtual WW8PLCFx& operator ++( int ) = 0;
    virtual USHORT GetIstd() const { return 0xffff; }
    virtual void Save(          WW8PLCFxSave1& rSave ) const;
    virtual void Restore( const WW8PLCFxSave1& rSave );
    BYTE GetVersion() const { return nVersion; }
};

enum eCutT { CUT_NONE = 0, CUT_START, CUT_END, CUT_BOTH };

class WW8PLCFx_PCDAttrs : public WW8PLCFx
{
    WW8PLCFpcd_Iter* pPcdI;
    WW8PLCFx_PCD* pPcd;
    BYTE** pGrpprls;            // Attribute an Piece-Table
    SVBT32 aShortSprm;          // mini storage: can contain ONE sprm with
                                // 1 byte param
    UINT16 nGrpprls;            // Attribut Anzahl davon

public:
    WW8PLCFx_PCDAttrs( BYTE nVersion, WW8PLCFx_PCD* pPLCFx_PCD, WW8ScannerBase* pBase );
    virtual ~WW8PLCFx_PCDAttrs();
    virtual ULONG GetIdx() const;
    virtual void SetIdx( ULONG nI );
    virtual BOOL SeekPos( WW8_CP nCpPos );
    virtual long Where();
    virtual void GetSprms( WW8PLCFxDesc* p );
    virtual WW8PLCFx& operator ++( int );

    WW8PLCFpcd_Iter* GetIter() const { return pPcdI; }
};

class WW8PLCFx_PCD : public WW8PLCFx            // Iterator fuer Piece Table
{
    WW8PLCFpcd_Iter* pPcdI;
    BOOL bVer67;

public:
    WW8PLCFx_PCD( BYTE nVersion, WW8PLCFpcd* pPLCFpcd, WW8_CP nStartCp, BOOL bVer67P );
    virtual ~WW8PLCFx_PCD();
    virtual ULONG GetIMax() const;
    virtual ULONG GetIdx() const;
    virtual void SetIdx( ULONG nI );
    virtual BOOL SeekPos( WW8_CP nCpPos );
    virtual long Where();
//  virtual void GetSprms( WW8PLCFxDesc* p );
    virtual long GetNoSprms( long& rStart, long&, long& rLen );
    virtual WW8PLCFx& operator ++( int );
    WW8_CP AktPieceStartFc2Cp( WW8_FC nStartPos );
    WW8_FC AktPieceStartCp2Fc( WW8_CP nCp );
    eCutT AktPieceFc2Cp( long& rStartPos, long& rEndPos );
    WW8PLCFpcd_Iter* GetPLCFIter() { return pPcdI; }

    static INT32 TransformPieceAddress(long nfc, BOOL& bIsUnicodeAddress)
    {
        bIsUnicodeAddress = 0 == (0x40000000 & nfc);
        return bIsUnicodeAddress
            ?  nfc
            : (nfc & 0x3fffFFFF) / 2;
    }
    BOOL IsVersion67() const { return bVer67; }
};


class WW8PLCFx_Fc_FKP : public WW8PLCFx     // Iterator fuer Piece Table Exceptions of Fkps
                                // arbeitet nur auf FCs, nicht auf CPs !
                                // ( Low-Level )
{


        class WW8Fkp        // Iterator fuer Formatted Disk Page
        {
            struct WW8Grpprl
            {
                BYTE*  pData;
                USHORT nLen;
                USHORT nIStd; // nur bei Fkp.Papx gueltig (aktuelle Style-Nr)
                BOOL   bMustDelete;
            };

            WW8Grpprl* pGrpprl;     // Pointer of Meta Array (pointing

            BYTE* pFkp;         // gesamter Fkp

            long nItemSize;     // entweder 1 Byte oder ein komplettes BX
            long nFilePos;      // Offset in Stream where last read of 52 bytes took place
            short nIdx;         // Pos-Merker
            ePLCFT ePLCF;
            BYTE nIMax;         // Anzahl der Eintraege
            BYTE nVersion;

        public:
            WW8Fkp( BYTE nFibVer, SvStream* pFKPStrm, SvStream* pDataStrm,
                    long _nFilePos, long nItemSiz,
                    ePLCFT ePl, WW8_FC nStartFc = -1 );
            ~WW8Fkp();
            long GetFilePos() const { return nFilePos; }
            ULONG GetIdx() const { return (ULONG)nIdx; }
            void SetIdx( ULONG nI );
            BOOL SeekPos( long nPos );
            WW8_FC Where() { return (  nIdx<nIMax)
                                     ? ((WW8_FC*)pFkp)[nIdx]
                                     : LONG_MAX; }
            WW8Fkp& operator ++( int ) { if( nIdx < nIMax ) nIdx++;
                                         return *this; }
            BYTE* Get( WW8_FC& rStart, WW8_FC& rEnd, short& rLen );
            USHORT GetIstd() const { return pGrpprl[ nIdx ].nIStd; }

            /*
                liefert einen echten Pointer auf das Sprm vom Typ nId,
                falls ein solches im Fkp drin ist.
            */
            BYTE* GetLenAndIStdAndSprms(short& rLen);

            /*
                ruft GetLenAndIStdAndSprms() auf...
            */
            BYTE* HasSprm( USHORT nId );

            ULONG GetParaHeight() const;    // fuer Header/Footer bei Papx-Fkps

            BYTE GetVersion() const { return nVersion; }
        };


    WW8PLCFx_PCDAttrs* pPCDAttrs;
    SvStream* pFKPStrm;         // Input-File
    SvStream* pDataStrm;        // Input-File
    WW8PLCF* pPLCF;
    WW8Fkp* pFkp;
    WW8_FC nStartFc;

    BOOL NewFkp();

protected:
    ePLCFT ePLCF;

public:
    WW8PLCFx_Fc_FKP( SvStream* pSt, SvStream* pTblSt, SvStream* pDataSt,
                     WW8Fib& rFib, ePLCFT ePl, WW8_FC nStartFcL,
                     WW8PLCFx_PCDAttrs* pPLCFx_PCD );
    virtual ~WW8PLCFx_Fc_FKP();
    virtual ULONG GetIdx() const;
    virtual void SetIdx( ULONG nIdx );
    virtual BOOL SeekPos( WW8_FC nFcPos );
    virtual WW8_FC Where();
    BYTE* GetSprms( WW8_FC& rStart, WW8_FC& rEnd, long& rLen );
    virtual WW8PLCFx& operator ++( int );
    virtual USHORT GetIstd() const;
    void GetPCDSprms( WW8PLCFxDesc& rDesc );
    BYTE* HasSprm( USHORT nId );
    ULONG GetParaHeight() const;
    BOOL HasFkp() { return (0 != pFkp); }
};

// Iterator fuer Piece Table Exceptions of Fkps arbeitet auf CPs (High-Level)
class WW8PLCFx_Cp_FKP : public WW8PLCFx_Fc_FKP
{
    const WW8ScannerBase& rSBase;
    WW8PLCFx_PCD* pPcd;
    WW8_CP nAttrStart, nAttrEnd;
    BOOL bLineEnd : 1;
    BOOL bComplex : 1;

    void SearchParaEnd( long nOldEndCp );

public:
    WW8PLCFx_Cp_FKP( SvStream* pSt, SvStream* pTblSt, SvStream* pDataSt, const WW8ScannerBase&
                        rBase,  ePLCFT ePl );
    virtual ~WW8PLCFx_Cp_FKP();
    void ResetAttrStartEnd();
    ULONG GetPCDIMax() const;
    ULONG GetPCDIdx() const;
    void SetPCDIdx( ULONG nIdx );
    virtual ULONG GetIdx2() const;
    virtual void  SetIdx2( ULONG nIdx );
    virtual BOOL SeekPos( WW8_CP nCpPos );
    virtual WW8_CP Where();
    virtual void GetSprms( WW8PLCFxDesc* p );
    virtual WW8PLCFx& operator ++( int );
    virtual void Save(          WW8PLCFxSave1& rSave ) const;
    virtual void Restore( const WW8PLCFxSave1& rSave );
};



class WW8PLCFx_SEPX : public WW8PLCFx           // Iterator fuer Piece Table Exceptions of Sepx
{
    SvStream* pStrm;
    WW8PLCF* pPLCF;
    BYTE* pSprms;
    USHORT nArrMax;
    UINT16 nSprmSiz;

public:
    WW8PLCFx_SEPX( SvStream* pSt, SvStream* pTblxySt, WW8Fib& rFib, WW8_CP nStartCp );
    virtual ~WW8PLCFx_SEPX();
    virtual ULONG GetIdx() const;
    virtual void SetIdx( ULONG nIdx );
    long GetIMax() const { return ( pPLCF ) ? pPLCF->GetIMax() : 0; }
    virtual BOOL SeekPos( WW8_CP nCpPos );
    virtual long Where();
    virtual void GetSprms( WW8PLCFxDesc* p );
    virtual WW8PLCFx& operator ++( int );
    BYTE* HasSprm( USHORT nId ) const;
    BYTE* HasSprm( USHORT nId, BYTE n2nd ) const;
    BYTE* HasSprm( USHORT nId, BYTE* pOtherSprms, long nOtherSprmSiz ) const;
    BOOL Find4Sprms(USHORT nId1, USHORT nId2, USHORT nId3, USHORT nId4,
                    BYTE*& p1,   BYTE*& p2,   BYTE*& p3,   BYTE*& p4 ) const;
    BOOL CompareSprms( BYTE* pOtherSprms,
                       long nOtherSprmSiz,
                       const SvUShortsSort* pIgnoreSprms = 0 ) const;
};

// Iterator fuer Fuss-/Endnoten und Anmerkungen
class WW8PLCFx_SubDoc : public WW8PLCFx
{
    WW8PLCF* pRef;
    WW8PLCF* pTxt;

public:
    WW8PLCFx_SubDoc( SvStream* pSt, BYTE nVersion, WW8_CP nStartCp,
                    long nFcRef, long nLenRef,
                    long nFcTxt, long nLenTxt, long nStruc = 0 );
    virtual ~WW8PLCFx_SubDoc();
    virtual ULONG GetIdx() const;
    virtual void SetIdx( ULONG nIdx );
    virtual BOOL SeekPos( WW8_CP nCpPos );
    virtual long Where();

    // liefert Reference Descriptoren
    const void* GetData( long nIdx = -1 ) const
        {
            return pRef ? pRef->GetData( -1L == nIdx ? pRef->GetIdx()
                                                     : nIdx ) : 0;
        }

    /*
        liefert Angabe, wo Kopf und Fusszeilen-Text zu finden ist
    */
    BOOL Get( long& rStart, void*& rpValue );
    virtual long GetNoSprms( long& rStart, long&, long& rLen );
    virtual WW8PLCFx& operator ++( int );
    long Count() { return ( pRef ) ? pRef->GetIMax() : 0; }
};

class WW8PLCFx_FLD : public WW8PLCFx            // Iterator fuer Fuss- und Endnoten
{
    WW8PLCFspecial* pPLCF;
    WW8Fib& rFib;

public:
    WW8PLCFx_FLD( SvStream* pSt, WW8Fib& rMyFib, short nType, WW8_CP nStartCp );
    virtual ~WW8PLCFx_FLD();
    virtual ULONG GetIdx() const;
    virtual void SetIdx( ULONG nIdx );
    virtual BOOL SeekPos( WW8_CP nCpPos );
    virtual long Where();
    virtual long GetNoSprms( long& rStart, long&, long& rLen );
    virtual WW8PLCFx& operator ++( int );
    BOOL GetPara( long nIdx, WW8FieldDesc& rF );
};

enum eBookStatus { BOOK_NORMAL = 0, BOOK_IGNORE = 0x1, BOOK_ONLY_REF = 0x2 };

class WW8PLCFx_Book : public WW8PLCFx           // Iterator fuer Booknotes
{
    WW8PLCFspecial* pBook[2];           // Start- und EndPosition
    SvStrings aBookNames;               // Name
    eBookStatus* pStatus;
    long nIMax;                         // Anzahl der Booknotes
    USHORT nIsEnd;
public:
    WW8PLCFx_Book( SvStream* pSt, SvStream* pTblSt, WW8Fib& rFib, WW8_CP nStartCp );
    virtual ~WW8PLCFx_Book();
    long GetIMax(){ return nIMax; }
    virtual ULONG GetIdx() const;
    virtual void SetIdx( ULONG nI );
    virtual ULONG GetIdx2() const;
    virtual void SetIdx2( ULONG nIdx );
    virtual BOOL SeekPos( WW8_CP nCpPos );
    virtual long Where();
    virtual long GetNoSprms( long& rStart, long& rEnd, long& rLen );
    virtual WW8PLCFx& operator ++( int );
    const String* GetName() const
        { return ( !nIsEnd && ( (long)(pBook[0]->GetIdx()) < nIMax ) )
                        ? aBookNames[ pBook[0]->GetIdx() ]
                        : 0;
        }
    WW8_CP GetStartPos() const
        { return ( nIsEnd ) ? LONG_MAX : pBook[0]->Where(); }
    long GetLen() const;
    BOOL GetIsEnd() const { return ( nIsEnd ) ? TRUE : FALSE; }
    long GetHandle() const;
    BOOL SetStatus( WW8_CP nStartRegion, WW8_CP nEndRegion, const String& rName,
                    eBookStatus eStat );
    eBookStatus GetStatus() const;
};

/*
    hiermit arbeiten wir draussen:
*/
struct WW8PLCFManResult
{
    WW8_CP nCpPos;      // Attribut-Anfangsposition
    long nMemLen;       // Laenge dazu
    long nCp2OrIdx;     // footnote-textpos oder Index in PLCF
    WW8_CP nAktCp;      // wird nur vom Aufrufer benutzt
    BYTE* pMemPos;      // Mem-Pos fuer Sprms
    USHORT nSprmId;     // Sprm-Id ( 0 = ungueltige Id -> ueberspringen! )
                                        // (2..255) oder Pseudo-Sprm-Id (256..260)
                                        // bzw. ab Winword-Ver8 die Sprm-Id (800..)
    BYTE nFlags;        // Absatz- oder Section-Anfang
};

#define MAN_ANZ_PLCF 12

#define MAN_MASK_NEW_PAP 1      // neue Zeile
#define MAN_MASK_NEW_SEP 2      // neue Section


#define MAN_MAINTEXT 0          // Defines fuer PLCFMan-ctor
#define MAN_FTN 1
#define MAN_EDN 2
#define MAN_HDFT 3
#define MAN_AND 4
#define MAN_TXBX 5
#define MAN_TXBX_HDFT 6

struct WW8PLCFxSaveAll
{
    WW8PLCFxSave1 aS[MAN_ANZ_PLCF];
};

/*
    hiermit arbeitet der Manager drinnen:
*/
struct WW8PLCFxDesc
{
    WW8PLCFx* pPLCFx;
    UShortStk* pIdStk;// Speicher fuer Attr-Id fuer Attr-Ende(n)
    BYTE* pMemPos;      // wo liegen die Sprm(s)
    long nStartPos;
    long nEndPos;
    long nCp2OrIdx;     // wo liegen die NoSprm(s)
    long nSprmsLen;     // wie viele Bytes fuer weitere Sprms / Laenge Fussnote
    long nCpOfs;        // fuer Offset Header .. Footnote
    BOOL bFirstSprm;    // fuer Erkennung erster Sprm einer Gruppe
    BOOL bRealLineEnd;  // FALSE bei Pap-Piece-Ende
    void Save(          WW8PLCFxSave1& rSave ) const;
    void Restore( const WW8PLCFxSave1& rSave );
};


#ifndef DUMP

class WW8PLCFMan
{
    long nCpO;      // Origin Cp -- the basis for nNewCp

    long nLineEnd;                  // zeigt *hinter* das <CR>
    long nLastWhereIdxCp;           // last result of WhereIdx()
    USHORT nPLCF;                   // so viele PLCFe werden verwaltet
    short nManType;

    WW8PLCFxDesc aD[MAN_ANZ_PLCF];
    WW8PLCFxDesc *pChp, *pPap, *pSep, *pFld, *pFldTxbx, *pFldTxbxHdft,
                 *pFtn, *pEdn,
                 *pBkm, *pPcd, *pPcdA, *pAnd;
    WW8PLCFspecial *pFdoa, *pTxbx, *pTxbxBkd;

    WW8Fib* pWwFib;
    USHORT* pNoAttrScan; // Attribute komplett(!) ignorieren, die ueber n CPs
                        // aufgespannt sind; z.B. bei Char #7 (Zellen-/Zeilenende)

    short WhereIdx( BOOL* pbStart, long* pPos );
    void AdjustEnds(    WW8PLCFxDesc& rDesc );
    void GetNewSprms(   WW8PLCFxDesc& rDesc );
    void GetNewNoSprms( WW8PLCFxDesc& rDesc );
    void GetSprmStart( short nIdx, WW8PLCFManResult* pRes );
    void GetSprmEnd( short nIdx, WW8PLCFManResult* pRes );
    void GetNoSprmStart( short nIdx, WW8PLCFManResult* pRes );
    void GetNoSprmEnd( short nIdx, WW8PLCFManResult* pRes );
    void AdvSprm(   short nIdx, BOOL bStart );
    void AdvNoSprm( short nIdx, BOOL bStart );

public:
    WW8PLCFMan( WW8ScannerBase* pBase, short nType, long nStartCp );
    ~WW8PLCFMan();

    /*
        Where fragt, an welcher naechsten Position sich irgendein
        Attr aendert...
    */
    long Where();

    BOOL Get( WW8PLCFManResult* pResult );
    WW8PLCFMan& operator ++( int );
    USHORT GetColl() const; // liefert aktuellen Style
    WW8PLCFx_FLD* GetFld() const;
    WW8PLCFx_SubDoc* GetEdn() const { return (WW8PLCFx_SubDoc*)pEdn->pPLCFx; }
    WW8PLCFx_SubDoc* GetFtn() const { return (WW8PLCFx_SubDoc*)pFtn->pPLCFx; }
    WW8PLCFx_SubDoc* GetAtn() const { return (WW8PLCFx_SubDoc*)pAnd->pPLCFx; }
    WW8PLCFx_Book* GetBook() const { return (WW8PLCFx_Book*)pBkm->pPLCFx; }
    long GetCpOfs() const { return pChp->nCpOfs; }  // fuer Header/Footer...

    /*
        fragt, ob *aktueller Absatz* einen Sprm diesen Typs hat
    */
    BYTE* HasParaSprm( USHORT nId ) const;

    /*
        fragt, ob *aktueller Textrun* einen Sprm diesen Typs hat
    */
    BYTE* HasCharSprm( USHORT nId ) const;

    WW8PLCFx_Cp_FKP* GetChpPLCF(){ return (WW8PLCFx_Cp_FKP*)pChp->pPLCFx; }
    WW8PLCFx_Cp_FKP* GetPapPLCF(){ return (WW8PLCFx_Cp_FKP*)pPap->pPLCFx; }
    WW8PLCFx_SEPX* GetSepPLCF(){   return (WW8PLCFx_SEPX*)pSep->pPLCFx; }
    WW8PLCFxDesc* GetPap(){ return pPap; }
    void SeekPos( long nNewCp );
    void SaveAllPLCFx(                   WW8PLCFxSaveAll& rSave ) const;
    void RestoreAllPLCFx(          const WW8PLCFxSaveAll& rSave );
    WW8PLCFspecial* GetFdoa()   { return pFdoa;     }
    WW8PLCFspecial* GetTxbx()   { return pTxbx;     }
    WW8PLCFspecial* GetTxbxBkd(){ return pTxbxBkd;  }
    short GetManType() { return nManType; }
};

#endif // !DUMP

class WW8ScannerBase
{
friend WW8PLCFx_PCDAttrs::WW8PLCFx_PCDAttrs( BYTE nVersion, WW8PLCFx_PCD* pPLCFx_PCD, WW8ScannerBase* pBase );
friend WW8PLCFx_Cp_FKP::WW8PLCFx_Cp_FKP( SvStream*, SvStream*, SvStream*,
                                        const WW8ScannerBase&, ePLCFT );

#ifdef DUMP
friend static void DumpPLCFText( WW8_FC nPos, long nLen, long nOfs, sal_Char* pName,
                                WW8ScannerBase* pBase );
friend static void DumpFtnShort( short nId, long nPos, long nFieldLen );
#else
friend WW8PLCFMan::WW8PLCFMan( WW8ScannerBase*, short, long );
friend class SwWw8ImplReader;
#endif

    WW8Fib* pWw8Fib;
    WW8PLCFx_Cp_FKP*  pChpPLCF;         // Character-Attrs
    WW8PLCFx_Cp_FKP*  pPapPLCF;         // Para-Attrs
    WW8PLCFx_SEPX*    pSepPLCF;         // Section-Attrs
    WW8PLCFx_SubDoc*  pFtnPLCF;         // Footnotes
    WW8PLCFx_SubDoc*  pEdnPLCF;         // EndNotes
    WW8PLCFx_SubDoc*  pAndPLCF;         // Anmerkungen
    WW8PLCFx_FLD*     pFldPLCF;         // Fields in Main Text
    WW8PLCFx_FLD*     pFldHdFtPLCF;     // Fields in Header / Footer
    WW8PLCFx_FLD*     pFldTxbxPLCF;     // Fields in Textboxes in Main Text
    WW8PLCFx_FLD*     pFldTxbxHdFtPLCF; // Fields in Textboxes in Header / Footer
    WW8PLCFx_FLD*     pFldFtnPLCF;      // Fields in Footnotes
    WW8PLCFx_FLD*     pFldEdnPLCF;      // Fields in Endnotes
    WW8PLCFx_FLD*     pFldAndPLCF;      // Fields in Anmerkungen
    WW8PLCFspecial*   pMainFdoa;        // Graphic Primitives in Main Text
    WW8PLCFspecial*   pHdFtFdoa;        // Graphic Primitives in Header / Footer
    WW8PLCFspecial*   pMainTxbx;        // Textboxen in Main Text
    WW8PLCFspecial*   pMainTxbxBkd;     // Break-Deskriptoren fuer diese
    WW8PLCFspecial*   pHdFtTxbx;        // TextBoxen in Header / Footer
    WW8PLCFspecial*   pHdFtTxbxBkd;     // Break-Deskriptoren fuer diese
    WW8PLCFx_Book*    pBook;            // Bookmarks

    WW8PLCFpcd*         pPiecePLCF; // fuer FastSave ( Basis-PLCF ohne Iterator )
    WW8PLCFpcd_Iter*    pPieceIter; // fuer FastSave ( Iterator dazu )
    WW8PLCFx_PCD*       pPLCFx_PCD;     // dito
    WW8PLCFx_PCDAttrs*  pPLCFx_PCDAttrs;
    BYTE**              pPieceGrpprls;  // Attribute an Piece-Table
    UINT16              nPieceGrpprls;  // Anzahl davon
    USHORT              nNoAttrScan;    // Attribute komplett(!) ignorieren, die ueber n CPs
                                        // aufgespannt sind; z.B. bei Char #7 (Zellen-/Zeilenende)

    WW8PLCFpcd* OpenPieceTable( SvStream* pStr, WW8Fib* pWwF );
    void DeletePieceTable();

public:
    WW8ScannerBase( SvStream* pSt, SvStream* pTblSt, SvStream* pDataSt,
                    WW8Fib* pWwF );
    ~WW8ScannerBase();
    BOOL AreThereFootnotes() { return pFtnPLCF->Count() > 0; };
    BOOL AreThereEndnotes()  { return pEdnPLCF->Count() > 0; };
    static DateTime WW8DTTM2DateTime(long lDTTM);

    WW8_CP WW8Fc2Cp( WW8_FC nFcPos ) const ;
    WW8_FC WW8Cp2Fc( WW8_CP nCpPos, BOOL* pIsUnicode = 0,
                     WW8_CP* pNextPieceCp = 0, BOOL* pTestFlag = 0 ) const;
    void SetNoAttrScan( USHORT nValue ) { nNoAttrScan = nValue; };

    USHORT WW8ReadString( SvStream& rStrm, String& rStr,
                            WW8_CP nAktStartCp, long nTotalLen,
                            rtl_TextEncoding eEnc ) const;
};




class WW8Fib
{
public:
    /*
        von uns verlangte Programm-Version:
        in Ctor wird geprueft, ob sie zu nFib passt
    */
    BYTE nVersion;  // 6 steht fuer "WinWord 6 oder WinWord 95",
                                    // 7 steht fuer "nur WinWord 95"
                                    // 8 steht fuer "nur WinWord 97"
    /*
        Fehlerstatus
    */
    ULONG nFibError;
    /*
        vom Ctor aus dem FIB gelesene Daten
        (entspricht nur ungefaehr der tatsaechlichen Struktur
         des Winword-FIB)
    */
    UINT16 wIdent;      // 0x0 int magic number
    UINT16 nFib;        // 0x2 FIB version written
    UINT16 nProduct;    // 0x4 product version written by
    INT16 lid;          // 0x6 language stamp---localized version;
    WW8_PN pnNext;          // 0x8

    UINT16 fDot :1;     // 0xa 0001
    UINT16 fGlsy :1;
    UINT16 fComplex :1; // 0004 when 1, file is in complex, fast-saved format.
    UINT16 fHasPic :1;  // 0008 file contains 1 or more pictures
    UINT16 cQuickSaves :4; // 00F0 count of times file was quicksaved
    UINT16 fEncrypted :1; //0100 1 if file is encrypted, 0 if not
    UINT16 fWhichTblStm :1; //0200 When 0, this fib refers to the table stream
                                                    // named "0Table", when 1, this fib refers to the
                                                    // table stream named "1Table". Normally, a file
                                                    // will have only one table stream, but under unusual
                                                    // circumstances a file may have table streams with
                                                    // both names. In that case, this flag must be used
                                                    // to decide which table stream is valid.
    // UINT16 u1 :2;
    UINT16 fExtChar :1; // 1000 =1, when using extended character set in file
    // UINT16 u2 :3;

    UINT16 nFibBack;    // 0xc
    INT16 lKey1;            // 0xe  file encrypted key, only valid if fEncrypted.
    INT16 lKey2;            // 0x10  key in 2 Portionen wg. Misalignment
    UINT8 envr;         // 0x12 environment in which file was created
                                    //      0 created by Win Word / 1 created by Mac Word
    BYTE fMac              :1;          // 0x13 when 1, this file was last saved in the Mac environment
    BYTE fEmptySpecial     :1;
    BYTE fLoadOverridePage :1;
    BYTE fFuturesavedUndo  :1;
    BYTE fWord97Saved      :1;
    BYTE :3;

    UINT16 chse;        // 0x14 default extended character set id for text in document stream. (overidden by chp.chse)
                        //      0 = ANSI  / 256 Macintosh character set.
    UINT16 chseTables;  // 0x16 default extended character set id for text in
                        //      internal data structures: 0 = ANSI, 256 = Macintosh
    WW8_FC fcMin;           // 0x18 file offset of first character of text
    WW8_FC fcMac;           // 0x1c file offset of last character of text + 1

    // Einschub fuer WW8 *****************************************************
    UINT16 csw;             // Count of fields in the array of "shorts"

    // Marke: "rgsw" Beginning of the array of shorts
    UINT16 wMagicCreated;                   // unique number Identifying the File's creator
                                                                // 0x6A62 is the creator ID for Word and is reserved.
                                                                // Other creators should choose a different value.
    UINT16 wMagicRevised;                   // identifies the File's last modifier
  UINT16 wMagicCreatedPrivate;  // private data
    UINT16 wMagicRevisedPrivate;    // private data
    /*
    INT16  pnFbpChpFirst_W6;            // not used
    INT16  pnChpFirst_W6;                   // not used
    INT16  cpnBteChp_W6;                    // not used
    INT16  pnFbpPapFirst_W6;            // not used
    INT16  pnPapFirst_W6;                   // not used
    INT16  cpnBtePap_W6;                    // not used
    INT16  pnFbpLvcFirst_W6;            // not used
    INT16  pnLvcFirst_W6;                   // not used
    INT16  cpnBteLvc_W6;                    // not used
    */
    INT16  lidFE;                                   // Language id if document was written by Far East version
                                                                // of Word (i.e. FIB.fFarEast is on)
    UINT16 clw;                                     // Number of fields in the array of longs

    // Ende des Einschubs fuer WW8 *******************************************

    // Marke: "rglw" Beginning of the array of longs
    WW8_FC cbMac;           // 0x20 file offset of last byte written to file + 1.

    // WW8_FC u4[4];            // 0x24
    WW8_CP ccpText;         // 0x34 length of main document text stream
    WW8_CP ccpFtn;          // 0x38 length of footnote subdocument text stream
    WW8_CP ccpHdr;          // 0x3c length of header subdocument text stream
    WW8_CP ccpMcr;          // 0x40 length of macro subdocument text stream
    WW8_CP ccpAtn;          // 0x44 length of annotation subdocument text stream
    WW8_CP ccpEdn;          // 0x48 length of endnote subdocument text stream
    WW8_CP ccpTxbx;         // 0x4c length of textbox subdocument text stream
    WW8_CP ccpHdrTxbx;      // 0x50 length of header textbox subdocument text stream

    // Einschub fuer WW8 *****************************************************
    INT32  pnFbpChpFirst;   // when there was insufficient memory for Word to expand
                                                // the PLCFbte at save time, the PLCFbte is written
                                                // to the file in a linked list of 512-byte pieces
                                                // starting with this pn.
    /*
    // folgende Felder existieren zwar so in der Datei,
    // wir benutzen jedoch unten deklarierte General-Variablen
    // fuer Ver67 und Ver8 gemeinsam.
    INT32  pnChpFirst;      // the page number of the lowest numbered page in the
                                                        // document that records CHPX FKP information
    INT32  cpnBteChp;           // count of CHPX FKPs recorded in file. In non-complex
                                                        // files if the number of entries in the PLCFbteChpx
                                                        // is less than this, the PLCFbteChpx is incomplete.
    */
    INT32  pnFbpPapFirst;   // when there was insufficient memory for Word to expand
                                                // the PLCFbte at save time, the PLCFbte is written to
                                                // the file in a linked list of 512-byte pieces
                                                // starting with this pn
    /*
    // folgende Felder existieren zwar so in der Datei,
    // wir benutzen jedoch unten deklarierte General-Variablen
    // fuer Ver67 und Ver8 gemeinsam.
    INT32  pnPapFirst;      // the page number of the lowest numbered page in the
                                                        // document that records PAPX FKP information
    INT32  cpnBtePap;       // count of PAPX FKPs recorded in file. In non-complex
                                                        // files if the number of entries in the PLCFbtePapx is
                                                        // less than this, the PLCFbtePapx is incomplete.
    */
    INT32  pnFbpLvcFirst;   // when there was insufficient memory for Word to expand
                                                // the PLCFbte at save time, the PLCFbte is written to
                                                // the file in a linked list of 512-byte pieces
                                                // starting with this pn
    INT32  pnLvcFirst;          // the page number of the lowest numbered page in the
                                                // document that records LVC FKP information
    INT32  cpnBteLvc;           // count of LVC FKPs recorded in file. In non-complex
                                                // files if the number of entries in the PLCFbtePapx is
                                                // less than this, the PLCFbtePapx is incomplete.
    INT32  fcIslandFirst;   // ?
    INT32  fcIslandLim;     // ?
    UINT16 cfclcb;              // Number of fields in the array of FC/LCB pairs.

    // Ende des Einschubs fuer WW8 *******************************************

    // Marke: "rgfclcb" Beginning of array of FC/LCB pairs.
    WW8_FC fcStshfOrig;     // file offset of original allocation for STSH in table
                                                // stream. During fast save Word will attempt to reuse
                                                // this allocation if STSH is small enough to fit.
    INT32 lcbStshfOrig; // 0x5c count of bytes of original STSH allocation
    WW8_FC fcStshf;         // 0x60 file offset of STSH in file.
    INT32 lcbStshf;     // 0x64 count of bytes of current STSH allocation
    WW8_FC fcPlcffndRef;    // 0x68 file offset of footnote reference PLCF.
    INT32 lcbPlcffndRef;    // 0x6c count of bytes of footnote reference PLCF
                        //      == 0 if no footnotes defined in document.

    WW8_FC fcPlcffndTxt;    // 0x70 file offset of footnote text PLCF.
    INT32 lcbPlcffndTxt;    // 0x74 count of bytes of footnote text PLCF.
                        //      == 0 if no footnotes defined in document

    WW8_FC fcPlcfandRef;    // 0x78 file offset of annotation reference PLCF.
    INT32 lcbPlcfandRef;    // 0x7c count of bytes of annotation reference PLCF.

    WW8_FC fcPlcfandTxt;    // 0x80 file offset of annotation text PLCF.
    INT32 lcbPlcfandTxt;    // 0x84 count of bytes of the annotation text PLCF

    WW8_FC fcPlcfsed;       // 8x88 file offset of section descriptor PLCF.
    INT32 lcbPlcfsed;   // 0x8c count of bytes of section descriptor PLCF.

    WW8_FC fcPlcfpad;       // 0x90 file offset of paragraph descriptor PLCF
    INT32 lcbPlcfpad;   // 0x94 count of bytes of paragraph descriptor PLCF.
                        // ==0 if file was never viewed in Outline view.
                        // Should not be written by third party creators

    WW8_FC fcPlcfphe;       // 0x98 file offset of PLCF of paragraph heights.
    INT32 lcbPlcfphe;   // 0x9c count of bytes of paragraph height PLCF.
                        // ==0 when file is non-complex.

    WW8_FC fcSttbfglsy;     // 0xa0 file offset of glossary string table.
    INT32 lcbSttbfglsy; // 0xa4 count of bytes of glossary string table.
                        //      == 0 for non-glossary documents.
                        //      !=0 for glossary documents.

    WW8_FC fcPlcfglsy;      // 0xa8 file offset of glossary PLCF.
    INT32 lcbPlcfglsy;  // 0xac count of bytes of glossary PLCF.
                        //      == 0 for non-glossary documents.
                        //      !=0 for glossary documents.

    WW8_FC fcPlcfhdd;       // 0xb0 byte offset of header PLCF.
    INT32 lcbPlcfhdd;   // 0xb4 count of bytes of header PLCF.
                        //      == 0 if document contains no headers

    WW8_FC fcPlcfbteChpx;   // 0xb8 file offset of character property bin table.PLCF.
    INT32 lcbPlcfbteChpx;// 0xbc count of bytes of character property bin table PLCF.

    WW8_FC fcPlcfbtePapx;   // 0xc0 file offset of paragraph property bin table.PLCF.
    INT32 lcbPlcfbtePapx;// 0xc4 count of bytes of paragraph  property bin table PLCF.

    WW8_FC fcPlcfsea;       // 0xc8 file offset of PLCF reserved for private use. The SEA is 6 bytes long.
    INT32 lcbPlcfsea;   // 0xcc count of bytes of private use PLCF.

    WW8_FC fcSttbfffn;      // 0xd0 file offset of font information STTBF. See the FFN file structure definition.
    INT32 lcbSttbfffn;  // 0xd4 count of bytes in sttbfffn.

    WW8_FC fcPlcffldMom;    // 0xd8 offset in doc stream to the PLCF of field positions in the main document.
    INT32 lcbPlcffldMom;    // 0xdc

    WW8_FC fcPlcffldHdr;    // 0xe0 offset in doc stream to the PLCF of field positions in the header subdocument.
    INT32 lcbPlcffldHdr;    // 0xe4

    WW8_FC fcPlcffldFtn;    // 0xe8 offset in doc stream to the PLCF of field positions in the footnote subdocument.
    INT32 lcbPlcffldFtn;    // 0xec

    WW8_FC fcPlcffldAtn;    // 0xf0 offset in doc stream to the PLCF of field positions in the annotation subdocument.
    INT32 lcbPlcffldAtn;    // 0xf4

    WW8_FC fcPlcffldMcr;    // 0xf8 offset in doc stream to the PLCF of field positions in the macro subdocument.
    INT32 lcbPlcffldMcr;    // 9xfc

    WW8_FC fcSttbfbkmk; // 0x100 offset in document stream of the STTBF that records bookmark names in the main document
    INT32 lcbSttbfbkmk; // 0x104

    WW8_FC fcPlcfbkf;   // 0x108 offset in document stream of the PLCF that records the beginning CP offsets of bookmarks in the main document. See BKF
    INT32 lcbPlcfbkf;   // 0x10c

    WW8_FC fcPlcfbkl;   // 0x110 offset in document stream of the PLCF that records the ending CP offsets of bookmarks recorded in the main document. See the BKL structure definition.
    INT32 lcbPlcfbkl;   // 0x114 INT32

    WW8_FC fcCmds;      // 0x118 FC
    INT32 lcbCmds;      // 0x11c

    WW8_FC fcPlcfmcr;       // 0x120 FC
    INT32 lcbPlcfmcr;       // 0x124

    WW8_FC fcSttbfmcr;  // 0x128 FC
    INT32 lcbSttbfmcr;  // 0x12c

    WW8_FC fcPrDrvr;        // 0x130 file offset of the printer driver information (names of drivers, port etc...)
    INT32 lcbPrDrvr;        // 0x134 count of bytes of the printer driver information (names of drivers, port etc...)

    WW8_FC fcPrEnvPort; // 0x138 file offset of the print environment in portrait mode.
    INT32 lcbPrEnvPort; // 0x13c count of bytes of the print environment in portrait mode.

    WW8_FC fcPrEnvLand; // 0x140 file offset of the print environment in landscape mode.
    INT32 lcbPrEnvLand; // 0x144 count of bytes of the print environment in landscape mode.

    WW8_FC fcWss;       // 0x148 file offset of Window Save State data structure. See WSS.
    INT32 lcbWss;       // 0x14c count of bytes of WSS. ==0 if unable to store the window state.

    WW8_FC fcDop;       // 0x150 file offset of document property data structure.
    INT32 lcbDop;       // 0x154 count of bytes of document properties.
        // cbDOP is 84 when nFib < 103


    WW8_FC fcSttbfAssoc;    // 0x158 offset to STTBF of associated strings. See STTBFASSOC.
    INT32 cbSttbfAssoc; // 0x15C

    WW8_FC fcClx;           // 0x160 file  offset of beginning of information for complex files.
    INT32 lcbClx;       // 0x164 count of bytes of complex file information. 0 if file is non-complex.

    WW8_FC fcPlcfpgdFtn;    // 0x168 file offset of page descriptor PLCF for footnote subdocument.
    INT32 lcbPlcfpgdFtn;    // 0x16C count of bytes of page descriptor PLCF for footnote subdocument.
                        //  ==0 if document has not been paginated. The length of the PGD is 8 bytes.

    WW8_FC fcAutosaveSource;    // 0x170 file offset of the name of the original file.
    INT32 lcbAutosaveSource;    // 0x174 count of bytes of the name of the original file.

    WW8_FC fcGrpStAtnOwners;    // 0x178 group of strings recording the names of the owners of annotations
    INT32 lcbGrpStAtnOwners;    // 0x17C count of bytes of the group of strings

    WW8_FC fcSttbfAtnbkmk;  // 0x180 file offset of the sttbf that records names of bookmarks in the annotation subdocument
    INT32 lcbSttbfAtnbkmk;  // 0x184 length in bytes of the sttbf that records names of bookmarks in the annotation subdocument

    // Einschubs fuer WW67 ***************************************************

    // INT16 wSpare4Fib;    // Reserve, muss hier nicht deklariert werden

    /*
    // folgende Felder existieren zwar so in der Datei,
    // wir benutzen jedoch unten deklarierte General-Variablen
    // fuer Ver67 und Ver8 gemeinsam.
    WW8_PN pnChpFirst;  // the page number of the lowest numbered page in
                                                        // the document that records CHPX FKP information
    WW8_PN pnPapFirst;  // the page number of the lowest numbered page in
                                                        // the document that records PAPX FKP information

    WW8_PN cpnBteChp;       // count of CHPX FKPs recorded in file. In non-complex
                                                        // files if the number of entries in the PLCFbteChpx is
                                                        // less than this, the PLCFbteChpx  is incomplete.
    WW8_PN cpnBtePap;       // count of PAPX FKPs recorded in file. In non-complex
                                                        // files if the number of entries in the PLCFbtePapx is
                                                        // less than this, the PLCFbtePapx  is incomplete.
    */

    // Ende des Einschubs fuer WW67 ******************************************

    WW8_FC fcPlcfdoaMom;    // 0x192 file offset of the  FDOA (drawn object) PLCF for main document.
                        //  ==0 if document has no drawn objects. The length of the FDOA is 6 bytes.
                        // ab Ver8 unused
    INT32 lcbPlcfdoaMom;    // 0x196 length in bytes of the FDOA PLCF of the main document
                                                // ab Ver8 unused
    WW8_FC fcPlcfdoaHdr;    // 0x19A file offset of the  FDOA (drawn object) PLCF for the header document.
                        //  ==0 if document has no drawn objects. The length of the FDOA is 6 bytes.
                        // ab Ver8 unused
    INT32 lcbPlcfdoaHdr;    // 0x19E length in bytes of the FDOA PLCF of the header document
                                                // ab Ver8 unused

    WW8_FC fcPlcfspaMom;        // offset in table stream of the FSPA PLCF for main document.
                                                // == 0 if document has no office art objects
                                                        // war in Ver67 nur leere Reserve
    INT32 lcbPlcfspaMom;        // length in bytes of the FSPA PLCF of the main document
                                                        // war in Ver67 nur leere Reserve
    WW8_FC fcPlcfspaHdr;        // offset in table stream of the FSPA PLCF for header document.
                                                // == 0 if document has no office art objects
                                                        // war in Ver67 nur leere Reserve
    INT32 lcbPlcfspaHdr;        // length in bytes of the FSPA PLCF of the header document
                                                        // war in Ver67 nur leere Reserve

    WW8_FC fcPlcfAtnbkf;    // 0x1B2 file offset of BKF (bookmark first) PLCF of the annotation subdocument
    INT32 lcbPlcfAtnbkf;    // 0x1B6 length in bytes of BKF (bookmark first) PLCF of the annotation subdocument

    WW8_FC fcPlcfAtnbkl;    // 0x1BA file offset of BKL (bookmark last) PLCF of the annotation subdocument
    INT32 lcbPlcfAtnbkl;    // 0x1BE length in bytes of BKL (bookmark first) PLCF of the annotation subdocument

    WW8_FC fcPms;       // 0x1C2 file offset of PMS (Print Merge State) information block
    INT32 lcbPMS;       // 0x1C6 length in bytes of PMS

    WW8_FC fcFormFldSttbf;  // 0x1CA file offset of form field Sttbf which contains strings used in form field dropdown controls
    INT32 lcbFormFldSttbf;  // 0x1CE length in bytes of form field Sttbf

    WW8_FC fcPlcfendRef;    // 0x1D2 file offset of PLCFendRef which points to endnote references in the main document stream
    INT32 lcbPlcfendRef;    // 0x1D6

    WW8_FC fcPlcfendTxt;    // 0x1DA file offset of PLCFendRef which points to endnote text  in the endnote document
                        //       stream which corresponds with the PLCFendRef
    INT32 lcbPlcfendTxt;    // 0x1DE

    WW8_FC fcPlcffldEdn;    // 0x1E2 offset to PLCF of field positions in the endnote subdoc
    INT32 lcbPlcffldEdn;    // 0x1E6

    WW8_FC  fcPlcfpgdEdn;   // 0x1EA offset to PLCF of page boundaries in the endnote subdoc.
    INT32 lcbPlcfpgdEdn;        // 0x1EE


    WW8_FC fcDggInfo;           // offset in table stream of the office art object table data.
                                                // The format of office art object table data is found in a separate document.
                                                        // war in Ver67 nur leere Reserve
    INT32 lcbDggInfo;           // length in bytes of the office art object table data
                                                        // war in Ver67 nur leere Reserve

    WW8_FC fcSttbfRMark;        // 0x1fa offset to STTBF that records the author abbreviations...
    INT32 lcbSttbfRMark;        // 0x1fe
    WW8_FC fcSttbfCaption;  // 0x202 offset to STTBF that records caption titles...
    INT32 lcbSttbfCaption;  // 0x206
    WW8_FC fcSttbAutoCaption;   // offset in table stream to the STTBF that records the object names and
                                                        // indices into the caption STTBF for objects which get auto captions.
    INT32 lcbSttbAutoCaption;   // 0x20e

    WW8_FC fcPlcfwkb;       // 0x212 offset to PLCF that describes the boundaries of contributing documents...
    INT32 lcbPlcfwkb;       // 0x216

    WW8_FC fcPlcfspl;       // offset in table stream of PLCF (of SPLS structures) that records spell check state
                                                        // war in Ver67 nur leere Reserve
    INT32 lcbPlcfspl;                   // war in Ver67 nur leere Reserve

    WW8_FC fcPlcftxbxTxt;   // 0x222 ...PLCF of beginning CP in the text box subdoc
    INT32 lcbPlcftxbxTxt;   // 0x226
    WW8_FC fcPlcffldTxbx;   // 0x22a ...PLCF of field boundaries recorded in the textbox subdoc.
    INT32 lcbPlcffldTxbx;   // 0x22e
    WW8_FC fcPlcfHdrtxbxTxt;// 0x232 ...PLCF of beginning CP in the header text box subdoc
    INT32 lcbPlcfHdrtxbxTxt;// 0x236
    WW8_FC fcPlcffldHdrTxbx;// 0x23a ...PLCF of field boundaries recorded in the header textbox subdoc.
    INT32 lcbPlcffldHdrTxbx;// 0x23e

    /*
        spezielle Listenverwaltung fuer WW8
    */
    WW8_FC fcPlcfLst;       // 0x02e2 offset in the table stream of list format information.
    INT32 lcbPlcfLst;       // 0x02e6 length
    WW8_FC fcPlfLfo;        // 0x02ea offset in the table stream of list format override information.
    INT32 lcbPlfLfo;        // 0x02ee length
    /*
        spezielle Break-Verwaltung fuer Text-Box-Stories in WW8
    */
    WW8_FC fcPlcftxbxBkd;   // 0x02f2 PLCF fuer TextBox-Break-Deskriptoren im Maintext
    INT32 lcbPlcftxbxBkd;   // 0x02f6
    WW8_FC fcPlcfHdrtxbxBkd;// 0x02fa PLCF fuer TextBox-Break-Deskriptoren im Header-/Footer-Bereich
    INT32 lcbPlcfHdrtxbxBkd;// 0x02fe

    // 0x302 - 372 == ignore
    /*
        ListNames (skip to here!)
    */
    WW8_FC fcSttbListNames;// 0x0372 PLCF for Listname Table
    INT32 lcbSttbListNames;// 0x0376
    /*
        General-Varaiblen, die fuer Ver67 und Ver8 verwendet werden,
        obwohl sie in der jeweiligen DATEI verschiedene Groesse haben:
    */
    INT32 pnChpFirst;
    INT32 pnPapFirst;
    INT32 cpnBteChp;
    INT32 cpnBtePap;
    /*
        nun wird lediglich noch ein Ctor benoetigt
    */
    WW8Fib( SvStream& rStrm, BYTE nWantedVersion,UINT32 nOffset=0 );

    /* leider falsch, man braucht auch noch einen fuer den Export */
    WW8Fib( BYTE nVersion = 6 );
    BOOL Write( SvStream& rStrm );
};


class WW8Style
{
protected:
    WW8Fib& rFib;
    SvStream& rSt;
    long nStyleStart;
    long nStyleLen;
//  WW8_STSHI* pStishi;

    UINT16  cstd;                               // Count of styles in stylesheet
    UINT16  cbSTDBaseInFile;        // Length of STD Base as stored in a file
    UINT16  fStdStylenamesWritten : 1;  // Are built-in stylenames stored?
    UINT16  : 15;                   // Spare flags
    UINT16  stiMaxWhenSaved;        // Max sti known when this file was written
    UINT16  istdMaxFixedWhenSaved;  // How many fixed-index istds are there?
    UINT16  nVerBuiltInNamesWhenSaved;  // Current version of built-in stylenames
    UINT16  ftcStandardChpStsh;     // ftc used by StandardChpStsh for this document

public:
    WW8Style( SvStream& rSt, WW8Fib& rFibPara );
//  ~WW8Style(){ delete( pStishi ); pStishi = 0; }
    WW8_STD* Read1STDFixed( short& rSkip, short* pcbStd );
    WW8_STD* Read1Style( short& rSkip, String* pString, short* pcbStd );
    const UINT16 GetCount() const { return cstd; }
};


class WW8Fonts
{
protected:
    WW8_FFN* pFontA;        // Array of Pointers to Font Description
    // Hilfs-Vari
    USHORT nMax;        // Array-Groesse
public:
    WW8Fonts( SvStream& rSt, WW8Fib& rFib );
    ~WW8Fonts(){ if( pFontA ) __DELETE( nMax )pFontA; }
    const WW8_FFN* GetFont( USHORT nNum ) const;
    USHORT GetMax() const { return nMax; }
};


#define WW8_HEADER_EVEN 0x1
#define WW8_HEADER_ODD 0x2
#define WW8_FOOTER_EVEN 0x4
#define WW8_FOOTER_ODD 0x8
#define WW8_HEADER_FIRST 0x10
#define WW8_FOOTER_FIRST 0x20

class WW8Dop            // Document Properties
{
public:
    /*
        Fehlerstatus
    */
    ULONG nDopError;
    /*
        vom Ctor aus dem FIB gelesene Daten
        (entspricht nur ungefaehr der tatsaechlichen Struktur
         des Winword-FIB)
    */
    // Initialisier-Dummy:
    BYTE    nDataStart;
    //-------------------------
    UINT16  fFacingPages : 1;   // 1 when facing pages should be printed
    UINT16  fWidowControl : 1;  // 1 when widow control is in effect. 0 when widow control disabled.
    UINT16  fPMHMainDoc : 1;    // 1 when doc is a main doc for Print Merge Helper, 0 when not; default=0
    UINT16  grfSuppression : 2; // 0 Default line suppression storage; 0= form letter line suppression; 1= no line suppression; default=0
    UINT16  fpc : 2;            // 1 footnote position code: 0 as endnotes, 1 at bottom of page, 2 immediately beneath text
    UINT16  : 1;                // 0 unused
    //-------------------------
    UINT16  grpfIhdt : 8;           // 0 specification of document headers and footers. See explanation under Headers and Footers topic.
    //-------------------------
    UINT16  rncFtn : 2;         // 0 restart index for footnotes, 0 don't restart note numbering, 1 section, 2 page
    UINT16  nFtn : 14;          // 1 initial footnote number for document
    UINT16  fOutlineDirtySave : 1; // when 1, indicates that information in the hPLCFpad should be refreshed since outline has been dirtied
    UINT16  : 7;                //   reserved
    UINT16  fOnlyMacPics : 1;   //   when 1, Word believes all pictures recorded in the document were created on a Macintosh
    UINT16  fOnlyWinPics : 1;   //   when 1, Word believes all pictures recorded in the document were created in Windows
    UINT16  fLabelDoc : 1;      //   when 1, document was created as a print merge labels document
    UINT16  fHyphCapitals : 1;  //   when 1, Word is allowed to hyphenate words that are capitalized. When 0, capitalized may not be hyphenated
    UINT16  fAutoHyphen : 1;    //   when 1, Word will hyphenate newly typed text as a background task
    UINT16  fFormNoFields : 1;
    UINT16  fLinkStyles : 1;    //   when 1, Word will merge styles from its template
    UINT16  fRevMarking : 1;    //   when 1, Word will mark revisions as the document is edited
    UINT16  fBackup : 1;        //   always make backup when document saved when 1.
    UINT16  fExactCWords : 1;
    UINT16  fPagHidden : 1;     //
    UINT16  fPagResults : 1;
    UINT16  fLockAtn : 1;       //   when 1, annotations are locked for editing
    UINT16  fMirrorMargins : 1; //   swap margins on left/right pages when 1.
    UINT16  fReadOnlyRecommended : 1;// user has recommended that this doc be opened read-only when 1
    UINT16  fDfltTrueType : 1;  //   when 1, use TrueType fonts by default (flag obeyed only when doc was created by WinWord 2.x)
    UINT16  fPagSuppressTopSpacing : 1;//when 1, file created with SUPPRESSTOPSPACING=YES in win.ini. (flag obeyed only when doc was created by WinWord 2.x).
    UINT16  fProtEnabled : 1;   //   when 1, document is protected from edit operations
    UINT16  fDispFormFldSel : 1;//   when 1, restrict selections to occur only within form fields
    UINT16  fRMView : 1;        //   when 1, show revision markings on screen
    UINT16  fRMPrint : 1;       //   when 1, print revision marks when document is printed
    UINT16  fWriteReservation : 1;
    UINT16  fLockRev : 1;       //   when 1, the current revision marking state is locked
    UINT16  fEmbedFonts : 1;    //   when 1, document contains embedded True Type fonts
    //    compatability options
    UINT16 copts_fNoTabForInd : 1;          //    when 1, don’t add automatic tab stops for hanging indent
    UINT16 copts_fNoSpaceRaiseLower : 1;        //    when 1, don’t add extra space for raised or lowered characters
    UINT16 copts_fSupressSpbfAfterPgBrk : 1;    // when 1, supress the paragraph Space Before and Space After options after a page break
    UINT16 copts_fWrapTrailSpaces : 1;      //    when 1, wrap trailing spaces at the end of a line to the next line
    UINT16 copts_fMapPrintTextColor : 1;        //    when 1, print colors as black on non-color printers
    UINT16 copts_fNoColumnBalance : 1;      //    when 1, don’t balance columns for Continuous Section starts
    UINT16 copts_fConvMailMergeEsc : 1;
    UINT16 copts_fSupressTopSpacing : 1;        //    when 1, supress extra line spacing at top of page
    UINT16 copts_fOrigWordTableRules : 1;   //    when 1, combine table borders like Word 5.x for the Macintosh
    UINT16 copts_fTransparentMetafiles : 1; //    when 1, don’t blank area between metafile pictures
    UINT16 copts_fShowBreaksInFrames : 1;   //    when 1, show hard page or column breaks in frames
    UINT16 copts_fSwapBordersFacingPgs : 1; //    when 1, swap left and right pages on odd facing pages

    INT16  dxaTab;              // 720 twips    default tab width
    UINT16 wSpare;              //
    UINT16 dxaHotZ;         //      width of hyphenation hot zone measured in twips
    UINT16 cConsecHypLim;       //      number of lines allowed to have consecutive hyphens
    UINT16 wSpare2;         //      reserved
    INT32   dttmCreated;        // DTTM date and time document was created
    INT32   dttmRevised;        // DTTM date and time document was last revised
    INT32   dttmLastPrint;      // DTTM date and time document was last printed
    INT16   nRevision;          //      number of times document has been revised since its creation
    INT32   tmEdited;           //      time document was last edited
    INT32   cWords;             //      count of words tallied by last Word Count execution
    INT32   cCh;                //      count of characters tallied by last Word Count execution
    INT16   cPg;                //      count of pages tallied by last Word Count execution
    INT32   cParas;             //      count of paragraphs tallied by last Word Count execution
    UINT16 rncEdn : 2;          //      restart endnote number code: 0 don’t restart endnote numbering, 1 section, 2 page
    UINT16 nEdn : 14;           //      beginning endnote number
    UINT16 epc : 2;         //      endnote position code: 0 at end of section, 3 at end of document
    // UINT16 nfcFtnRef : 4;        //      number format code for auto footnotes: 0 Arabic, 1 Upper case Roman, 2 Lower case Roman
                                //      3 Upper case Letter, 4 Lower case Letter
                                // ersetzt durch gleichlautendes Feld unten
    // UINT16 nfcEdnRef : 4;        //      number format code for auto endnotes: 0 Arabic, 1 Upper case Roman, 2 Lower case Roman
                                //      3 Upper case Letter, 4 Lower case Letter
                                // ersetzt durch gleichlautendes Feld unten
    UINT16 fPrintFormData : 1;  //      only print data inside of form fields
    UINT16 fSaveFormData : 1;   //      only save document data that is inside of a form field.
    UINT16 fShadeFormData : 1;  //      shade form fields
    UINT16 : 2;             //      reserved
    UINT16 fWCFtnEdn : 1;       //      when 1, include footnotes and endnotes in word count
    INT32   cLines;             //      count of lines tallied by last Word Count operation
    INT32   cWordsFtnEnd;       //      count of words in footnotes and endnotes tallied by last Word Count operation
    INT32   cChFtnEdn;          //      count of characters in footnotes and endnotes tallied by last Word Count operation
    INT16   cPgFtnEdn;          //      count of pages in footnotes and endnotes tallied by last Word Count operation
    INT32   cParasFtnEdn;       //      count of paragraphs in footnotes and endnotes tallied by last Word Count operation
    INT32   cLinesFtnEdn;       //      count of paragraphs in footnotes and endnotes tallied by last Word Count operation
    INT32   lKeyProtDoc;        //      document protection password key, only valid if dop.fProtEnabled, dop.fLockAtn or dop.fLockRev are 1.
    UINT16  wvkSaved : 3;       //      document view kind: 0 Normal view, 1 Outline view, 2 Page View
    UINT16  wScaleSaved : 9;    //
    UINT16  zkSaved : 2;

    // hier sollte bei nFib < 103   Schluss sein, sonst ist Datei fehlerhaft!

    /*
        bei nFib >= 103 gehts weiter:
    */
    UINT32 fNoTabForInd                             :1; // see above in compatability options
    UINT32 fNoSpaceRaiseLower                   :1; // see above
    UINT32 fSupressSpbfAfterPageBreak   :1; // see above
    UINT32 fWrapTrailSpaces                     :1; // see above
    UINT32 fMapPrintTextColor                   :1; // see above
    UINT32 fNoColumnBalance                     :1; // see above
    UINT32 fConvMailMergeEsc                    :1; // see above
    UINT32 fSupressTopSpacing                   :1; // see above
    UINT32 fOrigWordTableRules              :1; // see above
    UINT32 fTransparentMetafiles            :1; // see above
    UINT32 fShowBreaksInFrames              :1; // see above
    UINT32 fSwapBordersFacingPgs            :1; // see above
    UINT32                                                      :4; // reserved
    UINT32 fSuppressTopSpacingMac5      :1; // Suppress extra line spacing at top
                                                                                // of page like MacWord 5.x
    UINT32 fTruncDxaExpand                      :1; // Expand/Condense by whole number of points
    UINT32 fPrintBodyBeforeHdr              :1; // Print body text before header/footer
    UINT32 fNoLeading                                   :1; // Don't add extra spacebetween rows of text
    UINT32                                                      :1; // reserved
    UINT32 fMWSmallCaps                             :1; // Use larger small caps like MacWord 5.x
    UINT32                                                   :10;// reserved

    // hier sollte bei nFib <= 105  Schluss sein, sonst ist Datei fehlerhaft!

    /*
        bei nFib > 105 gehts weiter:
    */
    INT16   adt;                            // Autoformat Document Type:
                                                    // 0 for normal. 1 for letter, and 2 for email.
    WW8_DOPTYPOGRAPHY doptypography;    // siehe WW8STRUC.HXX
    WW8_DOGRID        dogrid;                   // siehe WW8STRUC.HXX
    UINT16                      :1; // reserved
    UINT16 lvl                  :4; // Which outline levels are showing in outline view
    UINT16                      :4; // reserved
    UINT16 fHtmlDoc             :1; // This file is based upon an HTML file
    UINT16                      :1; // reserved
    UINT16 fSnapBorder          :1; // Snap table and page borders to page border
    UINT16 fIncludeHeader       :1; // Place header inside page border
    UINT16 fIncludeFooter       :1; // Place footer inside page border
    UINT16 fForcePageSizePag    :1; // Are we in online view
    UINT16 fMinFontSizePag      :1; // Are we auto-promoting
                                                                // fonts to >= hpsZoonFontPag?
    UINT16 fHaveVersions            :1; // versioning is turned on
    UINT16 fAutoVersion             :1; // autoversioning is enabled
    UINT16                                   :14;   // reserved
    // hier 12 Byte ueberspringen: ASUMI
    INT32 cChWS;
    INT32 cChWSFtnEdn;
    INT32 grfDocEvents;
    // hier 4+30+8 Bytes ueberspringen
    INT32 cDBC;
    INT32 cDBCFtnEdn;
    // hier 4 Bytes ueberspringen
    INT16 nfcFtnRef;
    INT16 nfcEdnRef;
    INT16 hpsZoonFontPag;
    INT16 dywDispPag;

    // 2. Initialisier-Dummy:
    BYTE    nDataEnd;

    /*
        nun wird lediglich noch ein Ctor benoetigt,
        dem die FIB-Nummer uebergeben werden muss
    */
    WW8Dop( SvStream& rSt, INT16 nFib, INT32 nPos, INT32 nSize );

    /* leider falsch, man braucht auch noch einen fuer den Export */
    WW8Dop();
    BOOL Write( SvStream& rStrm, WW8Fib& rFib );
};


inline short WW8SkipOdd(SvStream* pSt )
{
#if defined HP9000 || defined SINIX
    short bRet = pSt->Tell() & 0x1;
    if (bRet) {
        UINT8 c;
        pSt->Read( &c, 1 );
    }
    return bRet;
#else
    if ( pSt->Tell() & 0x1 ){
        UINT8 c;
        pSt->Read( &c, 1 );
        return 1;
    }
    return 0;
#endif
}


class WW8PLCF_HdFt
{
    WW8PLCF aPLCF;
    long nTextOfs;
    short nIdxOffset;

public:
    WW8PLCF_HdFt( SvStream* pSt, WW8Fib& rFib, WW8Dop& rDop );
//  ~WW8PLCF_HdFt() {}
    BOOL GetTextPos( BYTE grpfIhdt, BYTE nWhich, WW8_CP& rStart, long& rLen );
    BOOL GetTextPosExact( short nIdx, WW8_CP& rStart, long& rLen );
    void UpdateIndex( BYTE grpfIhdt );
};


/*************************************************************************
      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ww8/ww8scan.hxx,v 1.1.1.1 2000-09-18 17:14:59 hr Exp $


      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.58  2000/09/18 16:05:02  willem.vandorp
      OpenOffice header added.

      Revision 1.57  2000/08/24 06:43:01  khz
      #75708# advance StartPos of attributes starting on a Table-Row-End by 1

      Revision 1.56  2000/07/12 12:24:54  khz
      #76503# use WW8PLCFx_Cp_FKP::?etIdx2() to save/restore nIdx of pPcd

      Revision 1.55  2000/05/31 12:23:05  khz
      Changes for Unicode

      Revision 1.54  2000/05/25 08:06:37  khz
      Piece Table optimization, Unicode changes, Bugfixes

      Revision 1.53  2000/05/18 10:58:50  jp
      Changes for Unicode

      Revision 1.52  2000/05/16 12:13:13  jp
      ASS_FALSE define removed

      Revision 1.51  2000/05/16 11:07:47  khz
      Unicode code-conversion

      Revision 1.50  2000/05/12 08:29:03  khz
      Changes for Unicode

      Revision 1.49  2000/05/04 07:32:05  khz
      Task #75379# added Save() and Restore() to WW8PLCFx, WW8PLCFx_Cp_FKP, WW8PLCFxDesc

      Revision 1.48  2000/02/22 16:23:14  khz
      Task #72987# Ignore Sprms covering ONLY a Tab-Row-End Char #7

      Revision 1.47  2000/02/09 08:57:36  khz
      Task #72647# Read SPRMs that are stored in piece table grpprls (2)

      Revision 1.46  2000/02/03 10:08:31  cmc
      #72268# Allow create fib from offset, added data to STTBF

      Revision 1.45  2000/02/02 18:07:51  khz
      Task #69885# Read SPRMs that are stored in piece table grpprls

      Revision 1.44  1999/12/07 14:29:04  khz
      Task #69508# import sprmPHugePapx by reading DATA stream

      Revision 1.43  1999/11/19 15:09:24  khz
      Task #69910# Use extra PLCF structure for field!

      Revision 1.42  1999/11/03 17:18:02  khz
      import new TOX_CONTENT and TOX_INDEX features (2)

      Revision 1.41  1999/10/21 15:36:21  khz
      Import Redlining (4)

      Revision 1.40  1999/10/13 21:06:47  khz
      Import Redlining (3)

      Revision 1.39  1999/10/08 09:25:29  khz
      Import Redlining

      Revision 1.38  1999/09/10 15:36:39  khz
      CharSet matching made by TENCINFO.H::rtl_getTextEncodingFromWindowsCharset()

      Revision 1.37  1999/09/09 18:16:13  khz
      CharSet matching now done in central methode WW8SCAN.HXX::WW8GetCharSet()

      Revision 1.36  1999/09/08 13:26:17  khz
      Better performance by reducing use of SWAP..() and SVBT..To..() methods

      Revision 1.35  1999/08/30 19:53:04  JP
      Bug #68219#: no static members - be reentrant


      Rev 1.34   30 Aug 1999 21:53:04   JP
   Bug #68219#: no static members - be reentrant

      Rev 1.33   09 Aug 1999 18:35:10   KHZ
   Task #67543# Import of Property Modifier(variant 1) (PRM) in WW8 docs

      Rev 1.32   15 Jun 1999 14:34:58   JP
   for Export: FIB - read/write SttbListNames

      Rev 1.31   02 Jun 1999 09:32:44   KHZ
   Task #66227# a) kein Unicode bei Ver67 ;-)  b) Grafik in grupp. Textbox

      Rev 1.30   19 May 1999 11:12:56   JP
   WinWord97-ExportFilter

      Rev 1.29   28 Apr 1999 23:03:28   KHZ
   Task #65245# Breite eines Rahmens bei WW 'automatisch' muss PRTAREA sein

      Rev 1.28   26 Feb 1999 14:43:36   KHZ
   Task #59715# Behandlung von Section breaks

      Rev 1.27   25 Jan 1999 10:22:38   KHZ
   Task #60715# in Textobjekt verankerte Grafik als Grafik importieren

      Rev 1.26   18 Jan 1999 08:53:08   KHZ
   Task #60878# WW8Read_xstz nur dann Assertion, wenn kein pTestFlag

      Rev 1.25   10 Dec 1998 21:29:02   JP
   Bug #59643#: benutzerdefinierte Zeichen von Fuss-/EndNoten verarbeiten

      Rev 1.24   05 Dec 1998 17:10:26   KHZ
   Task #59580# Unicode (3)

      Rev 1.23   04 Dec 1998 20:19:48   KHZ
   Task #58766# Textboxen mit Unicode-Inhalt

      Rev 1.22   03 Dec 1998 19:10:00   KHZ
   Task #58766# Unicode-Import (2)

      Rev 1.20   30 Nov 1998 17:46:52   JP
   Task #59822#: OLE-Objecte importieren

      Rev 1.21   02 Dec 1998 15:34:32   JP
   Task #60063#: Kommentare als PostIts einlesen

      Rev 1.20   30 Nov 1998 17:46:52   JP
   Task #59822#: OLE-Objecte importieren

      Rev 1.19   30 Nov 1998 17:30:36   KHZ
   Task #54828# Unicode-Import

      Rev 1.18   03 Nov 1998 18:29:52   KHZ
   Task #57243# Performance-Gewinn durch Vermeiden ueberfluessiger WW8GetSprmId()

      Rev 1.17   02 Nov 1998 17:58:32   KHZ
   Task #57017# Textmarken-Namen als UNICODE-Strings

      Rev 1.16   16 Oct 1998 16:12:34   KHZ
   Task #53520# ueberpruefe Feld DRUCKDATUM in DocInfo anhand von WW-internem Feld

      Rev 1.15   22 Sep 1998 17:40:22   KHZ
   Bug #56310# Kopf-/Fusszeilen in Unicode-Dokumenten jetzt korrekt

      Rev 1.14   03 Sep 1998 22:15:40   KHZ
   Task #55189# Textboxen

      Rev 1.13   11 Aug 1998 12:25:16   KHZ
   Task #52607# Optimierung in AdjustEnds(), GetNewSprms(), GetNoNewSprms()

      Rev 1.12   30 Jul 1998 00:02:54   KHZ
   Task #53614# Grafiken, die NICHT ueber dem Text liegen (MSDFF-Quick-Hack)

      Rev 1.11   28 Jul 1998 11:05:46   KHZ
   Task #52607# nummerierte Listen (Teil 1)

      Rev 1.10   22 Jul 1998 15:39:32   KHZ
   Task #52607#

      Rev 1.9   22 Jul 1998 15:33:28   KHZ
   Task #52607#

      Rev 1.8   21 Jul 1998 14:52:30   KHZ
   Task #52607# (WW 97 Import)

      Rev 1.7   21 Jul 1998 12:32:54   KHZ
   als MSDrawingObject eingebettete Grafik (Teil 1)

      Rev 1.6   09 Jul 1998 20:14:56   KHZ
   Tabellen: verbundene Zellen und Zellen-Hintergrundfarbe jetzt Ok.

      Rev 1.5   30 Jun 1998 21:33:22   KHZ
   Header/Footer/Footnotes weitgehend ok

      Rev 1.4   26 Jun 1998 20:50:20   KHZ
   Absatz-Attribute jetzt weitestgehend ok

      Rev 1.3   23 Jun 1998 20:49:24   KHZ
   verarbeitet jetzt auch mehrere FKPs

      Rev 1.2   23 Jun 1998 11:24:20   KHZ
   Zwischenstand: die meisten Zeichenattribute Ok!

      Rev 1.1   16 Jun 1998 18:37:14   KHZ
   DaSi-Stand

      Rev 1.0   16 Jun 1998 11:12:10   KHZ
   Initial revision.

      Rev 1.1   10 Jun 1998 17:22:34   KHZ
   Zwischenstand-Sicherung Dumper

      Rev 1.0   27 May 1998 15:29:16   KHZ
   Initial revision.


*************************************************************************/

#endif

diff --git a/sw/source/filter/ww8/ww8struc.hxx b/sw/source/filter/ww8/ww8struc.hxx
new file mode 100644
index 0000000..37af596
--- /dev/null
+++ b/sw/source/filter/ww8/ww8struc.hxx
@@ -0,0 +1,930 @@
/*************************************************************************
 *
 *  $RCSfile: ww8struc.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:59 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _WW8STRUC_HXX
#define _WW8STRUC_HXX

#ifndef _STRING_HXX
#include <tools/string.hxx>
#endif


// max. Anzahl der Listen-Level in WW8: 1..9
#define nWW8MaxListLevel 9


inline BYTE Get_Byte( BYTE *& p )
    { BYTE n = SVBT8ToByte( *(SVBT8*)p );       p += 1; return n; }

inline short Get_Short( BYTE *& p )
    { short n = SVBT16ToShort( *(SVBT16*)p );   p += 2; return n; }
inline USHORT Get_UShort( BYTE *& p )
    { USHORT n = SVBT16ToShort( *(SVBT16*)p );  p += 2; return n; }

inline long Get_Long( BYTE *& p )
    { long n = SVBT32ToLong( *(SVBT32*)p );     p += 4; return n; }
inline ULONG Get_ULong( BYTE *& p )
    { ULONG n = SVBT32ToLong( *(SVBT32*)p );        p += 4; return n; }

inline void Set_UInt8( BYTE *& p, UINT8 n )
    { ByteToSVBT8( n, *(SVBT8*)p );  p+= 1; }

inline void Set_UInt16( BYTE *& p, UINT16 n )
    { ShortToSVBT16( n, *(SVBT16*)p );  p+= 2; }

inline void Set_UInt32( BYTE *& p, UINT32 n )
    { LongToSVBT32( n, *(SVBT32*)p );  p+= 4; }


#if defined  __BIGENDIAN || __ALIGNMENT4 > 2 || defined UNX
#define __WW8_NEEDS_COPY
#else
#if defined WNT || defined WIN || defined OS2
#define __WW8_NEEDS_PACK
#pragma pack(2)
#endif
#endif

typedef INT16 WW8_PN;
typedef INT32 WW8_FC;
typedef INT32 WW8_CP;

// STD: STyle Definition
//   The STD contains the entire definition of a style.
//   It has two parts, a fixed-length base (cbSTDBase bytes long)
//   and a variable length remainder holding the name, and the upx and upe
//   arrays (a upx and upe for each type stored in the style, std.cupx)
//   Note that new fields can be added to the BASE of the STD without
//   invalidating the file format, because the STSHI contains the length
//   that is stored in the file.  When reading STDs from an older version,
//   new fields will be zero.
struct WW8_STD
{
    // Base part of STD:
    UINT16  sti : 12;          // invariant style identifier
    UINT16  fScratch : 1;      // spare field for any temporary use,
                                                         // always reset back to zero!
    UINT16  fInvalHeight : 1;  // PHEs of all text with this style are wrong
    UINT16  fHasUpe : 1;       // UPEs have been generated
    UINT16  fMassCopy : 1;     // std has been mass-copied; if unused at
                                                         // save time, style should be deleted
    UINT16  sgc : 4;           // style type code
    UINT16  istdBase : 12;     // base style
    UINT16  cupx : 4;          // # of UPXs (and UPEs)
    UINT16  istdNext : 12;     // next style
    UINT16  bchUpe;            // offset to end of upx's, start of upe's
    //-------- jetzt neu:
    // ab Ver8 gibts zwei Felder mehr:
  UINT16    fAutoRedef : 1;    /* auto redefine style when appropriate */
  UINT16    fHidden : 1;       /* hidden from UI? */
  UINT16    : 14;              /* unused bits */

    // Variable length part of STD:
    //  UINT8   stzName[2];        /* sub-names are separated by chDelimStyle
    // char grupx[];
            // the UPEs are not stored on the file; they are a cache of the based-on
        // chain
    // char grupe[];
};

/*
    Basis zum Einlesen UND zum Arbeiten (wird jeweils unter
    schiedlich beerbt)
*/
struct WW8_FFN_BASE     // Font Descriptor
{
    // ab Ver6
    BYTE    cbFfnM1;        //  0x0     total length of FFN - 1.

    BYTE    prg: 2;         //  0x1:03  pitch request
    BYTE    fTrueType : 1;  //  0x1:04  when 1, font is a TrueType font
                            //  0x1:08  reserved
    BYTE    ff : 3;         //  0x1:70  font family id
                            //  0x1:80  reserved

    short wWeight;          //  0x2     base weight of font
    BYTE    chs;            //  0x4     character set identifier
    BYTE    ibszAlt;        //  0x5     index into ffn.szFfn to the name of the alternate font
};

/*
    Hiermit arbeiten wir im Parser (und Dumper)
*/
struct WW8_FFN : public WW8_FFN_BASE
{
    // ab Ver8 als Unicode
    UniString sFontname;// 0x6 bzw. 0x40 ab Ver8 zero terminated string that
                                        // records name of font.
                                        // Maximal size of szFfn is 65 characters.
                                        // Vorsicht: Dieses Array kann auch kleiner sein!!!
                                        // Possibly followed by a second sz which records the
                                        // name of an alternate font to use if the first named
                                        // font does not exist on this system.
};



struct WW8_BRCVer6  // alter Border Code
{
    SVBT16 aBits1;
//  UINT16 dxpLineWidth : 3;// 0007 When dxpLineWidth is 0, 1, 2, 3, 4, or 5, this field is the width of
                            //      a single line of border in units of 0.75 points
                            //      Must be nonzero when brcType is nonzero.
                            //      6 == dotted, 7 == dashed.
//  UINT16 brcType : 2;     // 0018 border type code: 0 == none, 1 == single, 2 == thick, 3 == double
//  UINT16 fShadow : 1;     // 0020 when 1, border is drawn with shadow. Must be 0 when BRC is a substructure of the TC
//  UINT16 ico : 5;         // 07C0 color code (see chp.ico)
//  UINT16 dxpSpace : 5;    // F800 width of space to maintain between border and text within border.
                            //      Must be 0 when BRC is a substructure of the TC.  Stored in points for Windows.
};

struct WW8_BRC : public WW8_BRCVer6 // Border Code
{
    SVBT16 aBits2;
//  UINT16 dxpLineWidth : 3;// 0007 When dxpLineWidth is 0, 1, 2, 3, 4, or 5, this field is the width of
                            //      a single line of border in units of 0.75 points
                            //      Must be nonzero when brcType is nonzero.
                            //      6 == dotted, 7 == dashed.
//  UINT16 brcType : 2;     // 0018 border type code: 0 == none, 1 == single, 2 == thick, 3 == double
//  UINT16 fShadow : 1;     // 0020 when 1, border is drawn with shadow. Must be 0 when BRC is a substructure of the TC
//  UINT16 ico : 5;         // 07C0 color code (see chp.ico)
//  UINT16 dxpSpace : 5;    // F800 width of space to maintain between border and text within border.
                            //      Must be 0 when BRC is a substructure of the TC.  Stored in points for Windows.
};

typedef WW8_BRC WW8_BRC5[5];        // 5 * Border Code

#define WW8_TOP 0
#define WW8_LEFT 1
#define WW8_BOT 2
#define WW8_RIGHT 3
#define WW8_BETW 4





struct WW8_BordersSO            // fuer StarOffice-Border Code
{
    USHORT Out;
    USHORT In;
    USHORT Dist;
};


/*
// Linien-Defaults in Twips: fruehere Writer-Defaults,
//                           siehe auch <svx/boxitem.hxx>
#define DEF_LINE_WIDTH_0        1
#define DEF_LINE_WIDTH_1        20
#define DEF_LINE_WIDTH_2        50
#define DEF_LINE_WIDTH_3        80
#define DEF_LINE_WIDTH_4        100

#define DEF_MAX_LINE_WIDHT      DEF_LINE_WIDTH_4
#define DEF_MAX_LINE_DIST       DEF_LINE_WIDTH_2

#define DEF_DOUBLE_LINE0_OUT    DEF_LINE_WIDTH_0
#define DEF_DOUBLE_LINE0_IN     DEF_LINE_WIDTH_0
#define DEF_DOUBLE_LINE0_DIST   DEF_LINE_WIDTH_1

#define DEF_DOUBLE_LINE1_OUT    DEF_LINE_WIDTH_1
#define DEF_DOUBLE_LINE1_IN     DEF_LINE_WIDTH_1
#define DEF_DOUBLE_LINE1_DIST   DEF_LINE_WIDTH_1

#define DEF_DOUBLE_LINE2_OUT    DEF_LINE_WIDTH_2
#define DEF_DOUBLE_LINE2_IN     DEF_LINE_WIDTH_2
#define DEF_DOUBLE_LINE2_DIST   DEF_LINE_WIDTH_2

#define DEF_DOUBLE_LINE3_OUT    DEF_LINE_WIDTH_2
#define DEF_DOUBLE_LINE3_IN     DEF_LINE_WIDTH_1
#define DEF_DOUBLE_LINE3_DIST   DEF_LINE_WIDTH_2

#define DEF_DOUBLE_LINE4_OUT    DEF_LINE_WIDTH_1
#define DEF_DOUBLE_LINE4_IN     DEF_LINE_WIDTH_2
#define DEF_DOUBLE_LINE4_DIST   DEF_LINE_WIDTH_1

#define DEF_DOUBLE_LINE5_OUT    DEF_LINE_WIDTH_3
#define DEF_DOUBLE_LINE5_IN     DEF_LINE_WIDTH_2
#define DEF_DOUBLE_LINE5_DIST   DEF_LINE_WIDTH_2

#define DEF_DOUBLE_LINE6_OUT    DEF_LINE_WIDTH_2
#define DEF_DOUBLE_LINE6_IN     DEF_LINE_WIDTH_3
#define DEF_DOUBLE_LINE6_DIST   DEF_LINE_WIDTH_2

#define DEF_DOUBLE_LINE7_OUT    DEF_LINE_WIDTH_0
#define DEF_DOUBLE_LINE7_IN     DEF_LINE_WIDTH_0
#define DEF_DOUBLE_LINE7_DIST   DEF_LINE_WIDTH_2

#define DEF_DOUBLE_LINE8_OUT    DEF_LINE_WIDTH_1
#define DEF_DOUBLE_LINE8_IN     DEF_LINE_WIDTH_0
#define DEF_DOUBLE_LINE8_DIST   DEF_LINE_WIDTH_2

#define DEF_DOUBLE_LINE9_OUT    DEF_LINE_WIDTH_2
#define DEF_DOUBLE_LINE9_IN     DEF_LINE_WIDTH_0
#define DEF_DOUBLE_LINE9_DIST   DEF_LINE_WIDTH_2

#define DEF_DOUBLE_LINE10_OUT   DEF_LINE_WIDTH_3
#define DEF_DOUBLE_LINE10_IN    DEF_LINE_WIDTH_0
#define DEF_DOUBLE_LINE10_DIST  DEF_LINE_WIDTH_2
*/
// Deklarationen gemaess BOXITEM.HXX
#define WW8_DECL_LINETAB_ARRAY                                               \
    static WW8_BordersSO __READONLY_DATA nLineTabVer8[] =                    \
    {                                                                        \
/* 0*/  { DEF_LINE_WIDTH_0, 0, 0 },                                          \
/* 1*/  { DEF_LINE_WIDTH_1, 0, 0 },                                          \
/* 2*/  { DEF_LINE_WIDTH_2, 0, 0 },                                          \
/* 3*/  { DEF_LINE_WIDTH_3, 0, 0 },                                          \
/* 4*/  { DEF_LINE_WIDTH_4, 0, 0 },                                          \
/* 5*/  { DEF_DOUBLE_LINE0_OUT, DEF_DOUBLE_LINE0_IN, DEF_DOUBLE_LINE0_DIST },\
/* 6*/  { DEF_DOUBLE_LINE1_OUT, DEF_DOUBLE_LINE1_IN, DEF_DOUBLE_LINE1_DIST },\
/* 7*/  { DEF_DOUBLE_LINE2_OUT, DEF_DOUBLE_LINE2_IN, DEF_DOUBLE_LINE2_DIST },\
/* 8*/  { DEF_DOUBLE_LINE3_OUT, DEF_DOUBLE_LINE3_IN, DEF_DOUBLE_LINE3_DIST },\
/* 9*/  { DEF_DOUBLE_LINE4_OUT, DEF_DOUBLE_LINE4_IN, DEF_DOUBLE_LINE4_DIST },\
/*10*/  { DEF_DOUBLE_LINE5_OUT, DEF_DOUBLE_LINE5_IN, DEF_DOUBLE_LINE5_DIST },\
/*11*/  { DEF_DOUBLE_LINE6_OUT, DEF_DOUBLE_LINE6_IN, DEF_DOUBLE_LINE6_DIST },\
/*12*/  { DEF_DOUBLE_LINE7_OUT, DEF_DOUBLE_LINE7_IN, DEF_DOUBLE_LINE7_DIST },\
/*13*/  { DEF_DOUBLE_LINE8_OUT, DEF_DOUBLE_LINE8_IN, DEF_DOUBLE_LINE8_DIST },\
/*14*/  { DEF_DOUBLE_LINE9_OUT, DEF_DOUBLE_LINE9_IN, DEF_DOUBLE_LINE9_DIST },\
/*15*/  { DEF_DOUBLE_LINE10_OUT,DEF_DOUBLE_LINE10_IN,DEF_DOUBLE_LINE10_DIST} \
    };

#define WW8_DECL_LINETAB_OFS_DOUBLE 5   // Beginn des DOUBLE_LINE Abschnitts in meiner Liste




struct WW8_XCHAR    // Hilfs-Konstrukt fuer WW8_DOPTYPOGRAPHY
{
    sal_Char A;
    sal_Char B;
};

struct WW8_DOPTYPOGRAPHY
{   /*
        Document Typography Info (DOPTYPOGRAPHY)
        These options are Far East only, and are accessible
        through the Typography tab of the Tools/Options dialog.
    */



    /* a c h t u n g :     es duerfen keine solchen Bitfelder ueber einen eingelesenes Byte-Array
                            gelegt werden!!
                            stattdessen ist ein aBits1 darueber zu legen, das mit & auszulesen ist
    GRUND: Compiler auf Intel und Sparc sortieren die Bits unterschiedlich
    */



    short fKerningPunct  : 1;       // true if we're kerning punctuation
    short iJustification : 2;       // Kinsoku method of justification:
                                                                //  0 = always expand
                                                                //  1 = compress punctuation
                                                                //  2 = compress punctuation and kana.
    short iLevelOfKinsoku: 2;       // Level of Kinsoku:
                                                                //  0 = Level 1
                                                                //  1 = Level 2
                                                                //  2 = Custom
    short f2on1          : 1;       // 2-page-on-1 feature is turned on.
    short                :10;       // reserved
    short cchFollowingPunct;        // length of rgxchFPunct
    short cchLeadingPunct;          // length of rgxchLPunct

    WW8_XCHAR rgxchFPunct[101]; // array of characters that should
                                                            // never appear at the start of a line
    WW8_XCHAR rgxchLPunct[51];  // array of characters that should
                                                            // never appear at the end of a line
};

struct WW8_DOGRID
{
    short xaGrid;       // x-coord of the upper left-hand corner of the grid
    short yaGrid;       // y-coord of the upper left-hand corner of the grid
    short dxaGrid;  // width of each grid square
    short dyaGrid;  // height of each grid square



    /* a c h t u n g :     es duerfen keine solchen Bitfelder ueber einen eingelesenes Byte-Array
                            gelegt werden!!
                            stattdessen ist ein aBits1 darueber zu legen, das mit & auszulesen ist
    GRUND: Compiler auf Intel und Sparc sortieren die Bits unterschiedlich
    */



    short dyGridDisplay:7;  // the number of grid squares (in the y direction)
                                                    // between each gridline drawn on the screen. 0 means
                                                    // don't display any gridlines in the y direction.
    short fTurnItOff   :1;  // suppress display of gridlines
    short dxGridDisplay:7;  // the number of grid squares (in the x direction)
                                                    // between each gridline drawn on the screen. 0 means
                                                    // don't display any gridlines in the y direction.
    short fFollowMargins:1; // if true, the grid will start at the left and top
                                                    // margins and ignore xaGrid and yaGrid.
};

struct WW8_PIC
{
    INT32 lcb;          // 0x0 number of bytes in the PIC structure plus size of following picture data which may be a Window's metafile, a bitmap, or the filename of a TIFF file.
    UINT16 cbHeader;    // 0x4 number of bytes in the PIC (to allow for future expansion).
    struct {
        INT16 mm;       // 0x6  int
        INT16 xExt;     // 0x8  int
        INT16 yExt;     // 0xa  int
        INT16 hMF;      // 0xc  int
    }MFP;
//  BYTE bm[14];        // 0xe  BITMAP(14 bytes)    Window's bitmap structure when PIC describes a BITMAP.
    BYTE rcWinMF[14];   // 0xe  rc (rectangle - 8 bytes) rect for window origin
                        //      and extents when  metafile is stored -- ignored if 0
    INT16 dxaGoal;      // 0x1c horizontal  measurement in twips of the  rectangle the picture should be imaged within.
    INT16 dyaGoal;      // 0x1e vertical  measurement in twips of the  rectangle the picture should be imaged within.
    UINT16 mx;          // 0x20 horizontal scaling factor supplied by user in .1% units.
    UINT16 my;          // 0x22 vertical scaling factor supplied by user in .1% units.
    INT16 dxaCropLeft;  // 0x24 the amount the picture has been cropped on the left in twips.
    INT16 dyaCropTop;   // 0x26 the amount the picture has been cropped on the top in twips.
    INT16 dxaCropRight; // 0x28 the amount the picture has been cropped on the right in twips.
    INT16 dyaCropBottom;// 0x2a the amount the picture has been cropped on the bottom in twips.
    INT16 brcl : 4;     // 000F Obsolete, superseded by brcTop, etc.  In
    INT16 fFrameEmpty : 1;  // 0010 picture consists of a single frame
    INT16 fBitmap : 1;      // 0020 ==1, when picture is just a bitmap
    INT16 fDrawHatch : 1;   // 0040 ==1, when picture is an active OLE object
    INT16 fError : 1;       // 0080 ==1, when picture is just an error message
    INT16 bpp : 8;      // FF00 bits per pixel, 0 = unknown
    WW8_BRC rgbrc[4];
//  BRC brcTop;         // 0x2e specification for border above picture
//  BRC brcLeft;        // 0x30 specification for border to the left
//  BRC brcBottom;      // 0x32 specification for border below picture
//  BRC brcRight;       // 0x34 specification for border to the right
    INT16 dxaOrigin;    // 0x36 horizontal offset of hand annotation origin
    INT16 dyaOrigin;    // 0x38 vertical offset of hand annotation origin
//  BYTE rgb[];         // 0x3a variable array of bytes containing Window's metafile, bitmap or TIFF file filename.
};

struct WW8_PIC_SHADOW
{
    SVBT32 lcb;         // 0x0 number of bytes in the PIC structure plus size of following picture data which may be a Window's metafile, a bitmap, or the filename of a TIFF file.
    SVBT16 cbHeader;    // 0x4 number of bytes in the PIC (to allow for future expansion).
    struct {
        SVBT16 mm;      // 0x6  int
        SVBT16 xExt;        // 0x8  int
        SVBT16 yExt;        // 0xa  int
        SVBT16 hMF;     // 0xc  int
    }MFP;
//  SVBT8 bm[14];       // 0xe  BITMAP(14 bytes)    Window's bitmap structure when PIC describes a BITMAP.
    SVBT8 rcWinMF[14];  // 0xe  rc (rectangle - 8 bytes) rect for window origin
                        //      and extents when  metafile is stored -- ignored if 0
    SVBT16 dxaGoal;     // 0x1c horizontal  measurement in twips of the  rectangle the picture should be imaged within.
    SVBT16 dyaGoal;     // 0x1e vertical  measurement in twips of the  rectangle the picture should be imaged within.
    SVBT16 mx;          // 0x20 horizontal scaling factor supplied by user in .1% units.
    SVBT16 my;          // 0x22 vertical scaling factor supplied by user in .1% units.
    SVBT16 dxaCropLeft; // 0x24 the amount the picture has been cropped on the left in twips.
    SVBT16 dyaCropTop;  // 0x26 the amount the picture has been cropped on the top in twips.
    SVBT16 dxaCropRight;    // 0x28 the amount the picture has been cropped on the right in twips.
    SVBT16 dyaCropBottom;// 0x2a    the amount the picture has been cropped on the bottom in twips.
    SVBT8 aBits1; //0x2c
    SVBT8 aBits2;
    WW8_BRC rgbrc[4];
//  BRC brcTop;         // 0x2e specification for border above picture
//  BRC brcLeft;        // 0x30 specification for border to the left
//  BRC brcBottom;      // 0x32 specification for border below picture
//  BRC brcRight;       // 0x34 specification for border to the right
    SVBT16 dxaOrigin;   // 0x36 horizontal offset of hand annotation origin
    SVBT16 dyaOrigin;   // 0x38 vertical offset of hand annotation origin
//  SVBT8 rgb[];            // 0x3a variable array of bytes containing Window's metafile, bitmap or TIFF file filename.
};


struct WW8_TBD
{
    SVBT8 aBits1;
//  BYTE jc : 3;        // 0x07 justification code: 0=left tab, 1=centered tab, 2=right tab, 3=decimal tab, 4=bar
//  BYTE tlc : 3;       // 0x38 tab leader code: 0=no leader, 1=dotted leader,
                        // 2=hyphenated leader, 3=single line leader, 4=heavy line leader
//  *   int :2  C0  reserved
};

struct WW8_TCell    // hiermit wird weitergearbeitet (entspricht weitestgehend dem Ver8-Format)
{
    BOOL bFirstMerged   : 1;// 0001 set to 1 when cell is first cell of a range of cells that have been merged.
    BOOL bMerged        : 1;// 0002 set to 1 when cell has been merged with preceding cell.
    BOOL bVertical      : 1;// set to 1 when cell has vertical text flow
    BOOL bBackward      : 1;// for a vertical table cell, text flow is bottom to top when 1 and is bottom to top when 0.
    BOOL bRotateFont    : 1;// set to 1 when cell has rotated characters (i.e. uses @font)
    BOOL bVertMerge     : 1;// set to 1 when cell is vertically merged with the cell(s) above and/or below. When cells are vertically merged, the display area of the merged cells are consolidated. The consolidated area is used to display the contents of the first vertically merged cell (the cell with fVertRestart set to 1), and all other vertically merged cells (those with fVertRestart set to 0) must be empty. Cells can only be merged vertically if their left and right boundaries are (nearly) identical (i.e. if corresponding entries in rgdxaCenter of the table rows differ by at most 3).
    BOOL bVertRestart   : 1;// set to 1 when the cell is the first of a set of vertically merged cells. The contents of a cell with fVertStart set to 1 are displayed in the consolidated area belonging to the entire set of vertically merged cells. Vertically merged cells with fVertRestart set to 0 must be empty.
    BYTE nVertAlign     : 2;// specifies the alignment of the cell contents relative to text flow (e.g. in a cell with bottom to top text flow and bottom vertical alignment, the text is shifted horizontally to match the cell's right boundary):
                                                    //          0 top
                                                    //          1 center
                                                    //          2 bottom
    UINT16 fUnused      : 7;// reserved - nicht loeschen: macht das UINT16 voll !!

    WW8_BRC rgbrc[4];               // border codes
//notational convenience for referring to brcTop, brcLeft, etc fields.
//  BRC brcTop;             // specification of the top border of a table cell
//  BRC brcLeft;            // specification of left border of table row
//  BRC brcBottom;          // specification of bottom border of table row
//  BRC brcRight;           // specification of right border of table row.
};
// cbTC (count of bytes of a TC) is 18(decimal), 12(hex).


struct WW8_TCellVer6    // wird aus der Datei gelesen
{
    SVBT8  aBits1Ver6;
    SVBT8  aBits2Ver6;
//  UINT16 fFirstMerged : 1;// 0001 set to 1 when cell is first cell of a range of cells that have been merged.
//  UINT16 fMerged : 1;     // 0002 set to 1 when cell has been merged with preceding cell.
//  UINT16 fUnused : 14;    // FFFC reserved
    WW8_BRCVer6 rgbrcVer6[4];
// notational convenience for referring to brcTop, brcLeft, etc fields:
//          BRC brcTop;             // specification of the top border of a table cell
//          BRC brcLeft;            // specification of left border of table row
//          BRC brcBottom;          // specification of bottom border of table row
//          BRC brcRight;           // specification of right border of table row.
};
// cbTC (count of bytes of a TC) is 10(decimal), A(hex).

struct WW8_TCellVer8    // wird aus der Datei gelesen
{
    SVBT16 aBits1Ver8;      // Dokumentation siehe oben unter WW8_TCell
    SVBT16 aUnused;         // reserve
    WW8_BRC rgbrcVer8[4];   // Dokumentation siehe oben unter WW8_TCell
};
// cbTC (count of bytes of a TC) is 20(decimal), 14(hex).


struct WW8_SHD              // struct SHD fehlt in der Beschreibung
{
private:
    UINT16 aBits;
//  UINT16 nFore : 5;       // 0x001f ForegroundColor
//  UINT16 nBack : 5;       // 0x03e0 BackgroundColor
//  UINT16 nStyle : 5;      // 0x7c00 Percentage and Style
//  UINT16 nDontKnow : 1;   // 0x8000 ???   ab Ver8: ebenfalls fuer Style

public:
    WW8_SHD(){ aBits = 0; }

    BYTE GetFore()  const                           { return (BYTE)( aBits        & 0x1f); }
    BYTE GetBack()  const                           { return (BYTE)((aBits >> 5 ) & 0x1f); }
    BYTE GetStyle(BOOL bVer67)  const { return (BYTE)((aBits >> 10) & ( bVer67?0x1f:0x3f ) ); }

    UINT16 GetValue()   const                       { return aBits; }

    void SetValue(   UINT16 nVal ){ aBits = nVal; }
    void SetWWValue( SVBT16 nVal ){ aBits = (UINT16)SVBT16ToShort( nVal ); }

    void SetFore( BYTE nVal ){ aBits = (aBits & 0xffe0) |  (nVal & 0x1f);     }
    void SetBack( BYTE nVal ){ aBits = (aBits & 0xfc1f) | ((nVal & 0x1f)<<5); }
    void SetStyle( BOOL bVer67, BYTE nVal ){
                                         aBits = (aBits & ( bVer67?0x83ff:0x03ff ) )
                                                                                      | ((nVal & ( bVer67?0x1f:0x2f ))<<10); }
};


struct WW8_ANLV
{
    SVBT8 nfc;          // 0        number format code, 0=Arabic, 1=Upper case Roman, 2=Lower case Roman
                        //          3=Upper case Letter, 4=Lower case letter, 5=Ordinal
    SVBT8 cbTextBefore; // 1        offset into anld.rgch limit of prefix text
    SVBT8 cbTextAfter;  // 2
    SVBT8 aBits1;
//  BYTE jc : 2;        // 3 : 0x03 justification code, 0=left, 1=center, 2=right, 3=left and right justify
//  BYTE fPrev : 1;     //     0x04 when ==1, include previous levels
//  BYTE fHang : 1;     //     0x08 when ==1, number will be displayed using a hanging indent
//  BYTE fSetBold : 1;  //     0x10 when ==1, boldness of number will be determined by anld.fBold.
//  BYTE fSetItalic : 1;//     0x20 when ==1, italicness of number will be determined by anld.fItalic
//  BYTE fSetSmallCaps : 1;//  0x40 when ==1, anld.fSmallCaps will determine whether number will be displayed in small caps or not.
//  BYTE fSetCaps : 1;  //     0x80 when ==1, anld.fCaps will determine whether number will be displayed capitalized or not
    SVBT8 aBits2;
//  BYTE fSetStrike : 1;// 4 : 0x01 when ==1, anld.fStrike will determine whether the number will be displayed using strikethrough or not.
//  BYTE fSetKul : 1;   //     0x02 when ==1, anld.kul will determine the underlining state of the autonumber.
//  BYTE fPrevSpace : 1;//     0x04 when ==1, autonumber will be displayed with a single prefixing space character
//  BYTE fBold : 1;     //     0x08 determines boldness of autonumber when anld.fSetBold == 1.
//  BYTE fItalic : 1;   //     0x10 determines italicness of autonumber when anld.fSetItalic == 1.
//  BYTE fSmallCaps : 1;//     0x20 determines whether autonumber will be displayed using small caps when anld.fSetSmallCaps == 1.
//  BYTE fCaps : 1;     //     0x40 determines whether autonumber will be displayed using caps when anld.fSetCaps == 1.
//  BYTE fStrike : 1;   //     0x80 determines whether autonumber will be displayed using caps when anld.fSetStrike == 1.
    SVBT8 aBits3;
//  BYTE kul : 3;       // 5 : 0x07 determines whether  autonumber will be displayed with underlining when anld.fSetKul == 1.
//  BYTE ico : 5;       //     0xF1 color of autonumber
    SVBT16 ftc;         // 6        font code of  autonumber
    SVBT16 hps;         // 8        font half point size (or 0=auto)
    SVBT16 iStartAt;    // 0x0a     starting value (0 to 65535)
    SVBT16 dxaIndent;   // 0x0c     *short?* *USHORT?* width of prefix text (same as indent)
    SVBT16 dxaSpace;    // 0x0e     minimum space between number and paragraph
};
// *cbANLV (count of bytes of ANLV) is 16 (decimal), 10(hex).

struct WW8_ANLD
{
    WW8_ANLV eAnlv;     // 0
    SVBT8 fNumber1;     // 0x10     number only 1 item per table cell
    SVBT8 fNumberAcross;    // 0x11     number across cells in table rows(instead of down)
    SVBT8 fRestartHdn;  // 0x12     restart heading number on section boundary
    SVBT8 fSpareX;      // 0x13     unused( should be 0)
    BYTE  rgchAnld[32]; // 0x14 characters displayed before/after autonumber
};


struct WW8_OLST
{
    WW8_ANLV rganlv[9]; // 0    an array of 9 ANLV structures (heading levels)
    SVBT8 fRestartHdr;  // 0x90 when ==1, restart heading on section break
    SVBT8 fSpareOlst2;  // 0x91 reserved
    SVBT8 fSpareOlst3;  // 0x92 reserved
    SVBT8 fSpareOlst4;  // 0x93 reserved
    BYTE rgch[64];      // 0x94 array of 64 chars       text before/after number
};
// cbOLST is 212(decimal), D4(hex).

struct WW8_FDOA
{
    SVBT32 fc;          // 0  FC pointing to drawing object data
    SVBT16 ctxbx;       // 4  count of textboxes in the drawing object
};

struct WW8_DO
{
    SVBT16 dok;             // 0    Drawn Object Kind, currently this is always 0
    SVBT16 cb;              // 2    size (count of bytes) of the entire DO
    SVBT8  bx;              // 4    x position relative to anchor CP
    SVBT8  by;              // 5    y position relative to anchor CP
    SVBT16 dhgt;                // 6    height of DO
    SVBT16 aBits1;
//  UINT16 fAnchorLock : 1; // 8    1 if the DO anchor is locked
//  BYTE[] rgdp;            // 0xa  variable length array of drawing primitives
};

struct WW8_DPHEAD
{
    SVBT16 dpk;         //  0   Drawn Primitive Kind  REVIEW davebu
  //        0=start of grouping, 1=line, 2=textbox, 3=rectangle,
  //        4=arc, 5=elipse, 6=polyline, 7=callout textbox,
  //        8=end of grouping, 9=sample primitve holding default values
    SVBT16 cb;          // 2    size (count of bytes) of this DP
    SVBT16 xa;          // 4    These 2 points describe the rectangle
    SVBT16 ya;          // 6    enclosing this DP relative to the origin of
    SVBT16 dxa;         // 8    the DO
    SVBT16 dya;         // 0xa
};


struct WW8_DP_LINETYPE
{
    SVBT32 lnpc;            // LiNe Property Color -- RGB color value
    SVBT16 lnpw;            // line property weight in twips
    SVBT16 lnps;            // line property style : 0=Solid, 1=Dashed
                            // 2=Dotted, 3=Dash Dot, 4=Dash Dot Dot, 5=Hollow
};

struct WW8_DP_SHADOW    // Schattierung!
{
    SVBT16 shdwpi;          // Shadow Property Intensity
    SVBT16 xaOffset;        // x offset of shadow
    SVBT16 yaOffset;        // y offset of shadow
};

struct WW8_DP_FILL
{
    SVBT32 dlpcFg;          // FiLl Property Color ForeGround -- RGB color value
    SVBT32 dlpcBg;          // Property Color BackGround -- RGB color value
    SVBT16 flpp;            // FiLl Property Pattern REVIEW davebu
};

struct WW8_DP_LINEEND
{
    SVBT16 aStartBits;
//  UINT16 eppsStart : 2;   // Start EndPoint Property Style
                            // 0=None, 1=Hollow, 2=Filled
//  UINT16 eppwStart : 2;   // Start EndPoint Property Weight
//  UINT16 epplStart : 2;   // Start EndPoint Property length
//  UINT16 dummyStart : 10; // Alignment
    SVBT16 aEndBits;
//  UINT16 eppsEnd : 2;     // End EndPoint Property Style
//  UINT16 eppwEnd : 2;     // End EndPoint Property Weight
//  UINT16 epplEnd : 2;     // End EndPoint Property length
//  UINT16 dummyEnd : 10;   // Alignment
};

struct WW8_DP_LINE
{
//  WW8_DPHEAD dphead;      // 0    Common header for a drawing primitive
    SVBT16 xaStart;         // starting point for line
    SVBT16 yaStart;         //
    SVBT16 xaEnd;           // ending point for line
    SVBT16 yaEnd;
    WW8_DP_LINETYPE aLnt;
    WW8_DP_LINEEND aEpp;
    WW8_DP_SHADOW aShd;
};

struct WW8_DP_TXTBOX
{
    WW8_DP_LINETYPE aLnt;
    WW8_DP_FILL aFill;
    WW8_DP_SHADOW aShd;
    SVBT16 aBits1;
//  UINT16 fRoundCorners : 1; //0x24    0001    1 if the textbox has rounded corners
//  UINT16 zaShape : 15;    // 0x24     000e    REVIEW davebu
    SVBT16 dzaInternalMargin; // 0x26   REVIEW davebu
};

struct WW8_DP_RECT
{
    WW8_DP_LINETYPE aLnt;
    WW8_DP_FILL aFill;
    WW8_DP_SHADOW aShd;
    SVBT16 aBits1;
//  UINT16 fRoundCorners : 1; // 0x24   0001    1 if the textbox has rounded corners
//  UINT16 zaShape : 15; // 0x24 000e   REVIEW davebu
};

struct WW8_DP_ARC
{
    WW8_DP_LINETYPE aLnt;
    WW8_DP_FILL aFill;
    WW8_DP_SHADOW aShd;
    SVBT8 fLeft;        // 0x24 00ff    REVIEW davebu
    SVBT8 fUp;          // 0x24 ff00    REVIEW davebu
//  UINT16 fLeft : 8;   // 0x24 00ff    REVIEW davebu
//  UINT16 fUp : 8;     // 0x24 ff00    REVIEW davebu
};

struct WW8_DP_ELIPSE
{
    WW8_DP_LINETYPE aLnt;
    WW8_DP_FILL aFill;
    WW8_DP_SHADOW aShd;
};

struct WW8_DP_POLYLINE
{
    WW8_DP_LINETYPE aLnt;
    WW8_DP_FILL aFill;
    WW8_DP_LINEEND aEpp;
    WW8_DP_SHADOW aShd;
    SVBT16 aBits1;
//  UINT16 fPolygon : 1; // 0x28  0001  1 if this is a polygon
//  UINT16 cpt : 15;    // 0x28   00fe  count of points
//  short xaFirst;      // 0x2a These are the endpoints of the first line.
//  short yaFirst;      // 0x2c
//  short xaEnd;        // 0x2e
//  short yaEnd;        // 0x30
//  short rgpta[];      // 0x32 An array of xa,ya pairs for the remaining points
};

struct WW8_DP_CALLOUT_TXTBOX
{
    SVBT16 flags;               // 0x0c REVIEW davebu flags
    SVBT16 dzaOffset;           // 0x0e REVIEW davebu
    SVBT16 dzaDescent;          // 0x10 REVIEW davebu
    SVBT16 dzaLength;           // 0x12 REVIEW davebu
    WW8_DPHEAD dpheadTxbx;      // 0x14 DPHEAD for a textbox
    WW8_DP_TXTBOX dptxbx;       // 0x20 DP for a textbox
    WW8_DPHEAD dpheadPolyLine;  // 0x4c DPHEAD for a Polyline
    WW8_DP_POLYLINE dpPolyLine; // 0x48 DP for a polyline
};

struct WW8_DP_DEFAULTS
{
    WW8_DP_LINETYPE aLnt;
    WW8_DP_FILL aFill;
    WW8_DP_LINEEND aEpp;
    WW8_DP_SHADOW aShd;
    SVBT16 dzaOffset;       // 0x2a REVIEW davebu
    SVBT16 dzaDescent;      // 0x2c REVIEW davebu
    SVBT16 dzaLength;       // 0x2e REVIEW davebu

    SVBT16 aBits3;
//  UINT16 fRoundCorners : 1;   // 0x30 0001    1 if the textbox has rounded corners
//  UINT16 zaShape : 15;        // 0x30 000fe   REVIEW davebu
    SVBT16 dzaInternalMargin;   // 0x32 REVIEW davebu
};


struct WW8_PCD
{
    SVBT8 aBits1;
//  BYTE fNoParaLast : 1;   // when 1, means that piece contains no end of paragraph marks.
//  BYTE fPaphNil : 1;      // used internally by Word
//  BYTE fCopied : 1;       // used internally by Word
//          *   int :5
    SVBT8 aBits2;           // fn int:8, used internally by Word
    SVBT32 fc;              // file offset of beginning of piece. The size of the
                            // ithpiece can be determined by subtracting rgcp[i] of
                            // the containing plcfpcd from its rgcp[i+1].
    SVBT16 prm;             // PRM contains either a single sprm or else an index number
                            // of the grpprl which contains the sprms that modify the
                            // properties of the piece.
};

struct WW8_PHE_Base
{
    BYTE aBits1;            //
//                              0   0   fSpare  int :1  0001    reserved
//                              fUnk    int :1  0002    phe entry is invalid
//                                                      when == 1
//                              fDiffLines  int :1  0004    when 1, total
//                               height of paragraph is known but lines in
//                               paragraph have different heights.
//                              *   int :5  00F8    reserved
    BYTE nlMac;             //  when fDiffLines is 0 is number of lines in
//                          //  paragraph
    SVBT16 dxaCol;          //  width of lines in paragraph
    SVBT16 dyl;
//                              4   4   dylLine int when fDiffLines is 0,
//                              is height of every line in paragraph.in pixels
//                              4   4 dylHeight uns when fDiffLines is 1,
//                              is the total height in pixels of the paragraph
};

/*
eigentlich muessten wir das jetzt in etwa *so* praezisieren:

            struct WW8_PHE_Ver6 : public WW8_PHE_Base
            {
                //  6 Bytes gross
            };
            struct WW8_PHE_Ver6 : public WW8_PHE_Base
            {
                SVBT16 a;
                SVBT16 b;
                SVBT16 c;   // 12 Byte gross
            };
*/

// AnnoTation Refernce Descriptor (ATRD)
struct WW8_ATRD                 // fuer die 8-Version
{
    SVBT16 xstUsrInitl[ 10 ];       // pascal-style String holding initials
                                    // of annotation author
    SVBT16 ibst;                    // index into GrpXstAtnOwners
    SVBT16 ak;                      // not used
    SVBT16 grfbmc;                  // not used
    SVBT32 ITagBkmk;                // when not -1, this tag identifies the
                                    // annotation bookmark that locates the
                                    // range of CPs in the main document which
                                    // this annotation references.
};

struct WW67_ATRD                // fuer die 6/7-Version
{
    sal_Char xstUsrInitl[ 10 ];     // pascal-style String holding initials
                                    // of annotation author
    SVBT16 ibst;                    // index into GrpXstAtnOwners
    SVBT16 ak;                      // not used
    SVBT16 grfbmc;                  // not used
    SVBT32 ITagBkmk;                // when not -1, this tag identifies the
                                    // annotation bookmark that locates the
                                    // range of CPs in the main document which
                                    // this annotation references.
};


#ifdef __WW8_NEEDS_PACK
#pragma pack()
#endif

/*************************************************************************
      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/ww8/ww8struc.hxx,v 1.1.1.1 2000-09-18 17:14:59 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.20  2000/09/18 16:05:02  willem.vandorp
      OpenOffice header added.

      Revision 1.19  2000/05/12 07:54:23  khz
      Changes for Unicode

      Revision 1.18  2000/02/11 14:40:36  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.17  1999/11/19 14:48:49  mib
      #70009#: export Solaris

      Revision 1.16  1999/06/16 17:54:56  JP
      Change interface of base class Writer, Export of W97 NumRules


      Rev 1.15   16 Jun 1999 19:54:56   JP
   Change interface of base class Writer, Export of W97 NumRules

      Rev 1.14   19 May 1999 11:12:56   JP
   WinWord97-ExportFilter

      Rev 1.13   11 May 1999 17:15:24   KHZ
   Task #66019# FontFamily: andere Bitreihenfolge auf Solaris beachten

      Rev 1.12   15 Feb 1999 21:36:50   KHZ
   Task #61381# Korrektur der Korrektur: jetzt include boxitem.hxx in ww8graf.cxx

      Rev 1.11   15 Feb 1999 20:54:44   KHZ
   Task #61381# Korrektur zur -r1.10: UEbernahme der defines statt der includes

      Rev 1.10   15 Feb 1999 18:19:44   HR
   <svx/eeitem.hxx> und <svx/boxitem.hxx> includen

      Rev 1.9   12 Feb 1999 16:51:38   KHZ
   Task #61381# Ersetzen von Sdr-Text-Objekten im Writer durch Rahmen (3)

      Rev 1.8   03 Dec 1998 10:39:52   JP
   Task #60063#: Kommentare als PostIts einlesen

      Rev 1.7   02 Dec 1998 15:34:28   JP
   Task #60063#: Kommentare als PostIts einlesen

      Rev 1.6   23 Oct 1998 15:37:02   KHZ
   Task #58199# jetzt kein GPF mehr bei nicht existenten Tabellenzellen :-)

      Rev 1.5   30 Jul 1998 14:28:34   KHZ
   Task #52607# Einrueckungen der Defines beseitigt

      Rev 1.4   09 Jul 1998 20:14:58   KHZ
   Tabellen: verbundene Zellen und Zellen-Hintergrundfarbe jetzt Ok.

      Rev 1.3   03 Jul 1998 16:14:54   KHZ
   ( Zwischenstand zur DaSi )

      Rev 1.2   30 Jun 1998 21:33:18   KHZ
   Header/Footer/Footnotes weitgehend ok

      Rev 1.1   26 Jun 1998 20:50:10   KHZ
   Absatz-Attribute jetzt weitestgehend ok

      Rev 1.0   16 Jun 1998 10:57:08   KHZ
   Initial revision.

      Rev 1.1   10 Jun 1998 17:22:38   KHZ
   Zwischenstand-Sicherung Dumper

      Rev 1.0   27 May 1998 15:29:34   KHZ
   Initial revision.

*************************************************************************/

#endif
diff --git a/sw/source/filter/xml/makefile.mk b/sw/source/filter/xml/makefile.mk
new file mode 100644
index 0000000..1534f01
--- /dev/null
+++ b/sw/source/filter/xml/makefile.mk
@@ -0,0 +1,144 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:59 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=..$/..$/..

PRJNAME=sw
TARGET=xml

PROJECTPCH=filt_pch
PROJECTPCHSOURCE=..\filt_1st\filt_pch

# --- Settings -----------------------------------------------------

.INCLUDE :  $(PRJ)$/inc$/swpre.mk
.INCLUDE :  settings.mk
.INCLUDE :  $(PRJ)$/inc$/sw.mk

.IF "$(mydebug)" != ""
CDEFS=$(CDEFS) -Dmydebug
.ENDIF

# --- Files --------------------------------------------------------

CXXFILES = \
        swxml.cxx      \
        xmlimp.cxx      \
        wrtxml.cxx      \
        xmlexp.cxx      \
        xmlectxt.cxx      \
        xmltext.cxx      \
        xmltbli.cxx      \
        xmltble.cxx      \
        xmlfmt.cxx      \
        xmlfmte.cxx      \
        xmlmeta.cxx      \
        xmlnum.cxx      \
        xmlitemm.cxx	\
        xmlitemi.cxx	\
        xmliteme.cxx	\
        swxmlat.cxx      \
        hintlist.cxx	\
        xmlbrsh.cxx

SLOFILES =  \
        $(SLO)$/swxml.obj \
        $(SLO)$/xmlimp.obj \
        $(SLO)$/wrtxml.obj \
        $(SLO)$/xmlexp.obj \
        $(SLO)$/xmlectxt.obj \
        $(SLO)$/xmltext.obj \
        $(SLO)$/xmltbli.obj \
        $(SLO)$/xmltble.obj \
        $(SLO)$/xmlfmt.obj \
        $(SLO)$/xmlfmte.obj \
        $(SLO)$/xmlmeta.obj \
        $(SLO)$/xmlnum.obj \
        $(SLO)$/xmlitemm.obj \
        $(SLO)$/xmlitemi.obj \
        $(SLO)$/xmliteme.obj \
        $(SLO)$/swxmlat.obj \
        $(SLO)$/hintlist.obj \
        $(SLO)$/xmlbrsh.obj

EXCEPTIONSFILES= \
        $(SLO)$/swxml.obj \
        $(SLO)$/xmlimp.obj \
        $(SLO)$/wrtxml.obj \
        $(SLO)$/xmlexp.obj \
        $(SLO)$/xmlectxt.obj \
        $(SLO)$/xmltext.obj \
        $(SLO)$/xmltbli.obj \
        $(SLO)$/xmltble.obj \
        $(SLO)$/xmlfmt.obj \
        $(SLO)$/xmlfmte.obj \
        $(SLO)$/xmlmeta.obj \
        $(SLO)$/xmlnum.obj \
        $(SLO)$/xmlitemi.obj \
        $(SLO)$/xmliteme.obj \
        $(SLO)$/swxmlat.obj \
        $(SLO)$/xmlbrsh.obj

# --- Tagets -------------------------------------------------------

.INCLUDE :  target.mk

diff --git a/sw/source/filter/xml/swxml.cxx b/sw/source/filter/xml/swxml.cxx
new file mode 100644
index 0000000..d5f514b
--- /dev/null
+++ b/sw/source/filter/xml/swxml.cxx
@@ -0,0 +1,314 @@
/*************************************************************************
 *
 *  $RCSfile: swxml.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:59 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/


#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#ifndef _RSCSFX_HXX
#include <rsc/rscsfx.hxx>
#endif

#ifndef _UNOTOOLS_PROCESSFACTORY_HXX_
#include <unotools/processfactory.hxx>
#endif
#ifndef _COM_SUN_STAR_XML_SAX_INPUTSOURCE_HPP_
#include <com/sun/star/xml/sax/InputSource.hpp>
#endif
#ifndef _COM_SUN_STAR_XML_SAX_XPARSER_HPP_
#include <com/sun/star/xml/sax/XParser.hpp>
#endif

#ifndef _SFXDOCFILE_HXX //autogen wg. SfxMedium
#include <sfx2/docfile.hxx>
#endif

#ifndef _SWSWERROR_H
#include <swerror.h>
#endif
#ifndef _ERRHDL_HXX //autogen wg. ASSERT
#include <errhdl.hxx>
#endif
#ifndef _FLTINI_HXX //autogen wg. XMLReader
#include <fltini.hxx>
#endif
#ifndef _DOC_HXX //autogen wg. SwDoc
#include <doc.hxx>
#endif
#ifndef _DOCSH_HXX //autogen wg. SwDoc
#include <docsh.hxx>
#endif

#ifndef _XMLIMP_HXX
#include "xmlimp.hxx"
#endif

using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::rtl;

XMLReader::XMLReader()
{
}

sal_uInt32 XMLReader::Read( SwDoc &rDoc, SwPaM &rPaM, const String & rName )
{
    Reference< lang::XMultiServiceFactory > xServiceFactory =
            utl::getProcessServiceFactory();
    ASSERT( xServiceFactory.is(),
            "XMLReader::Read: got no service manager" );
    if( !xServiceFactory.is() )
        return ERR_SWG_READ_ERROR;

    // Get model
    SwDocShell *pDocSh = rDoc.GetDocShell();
    ASSERT( pDocSh, "XMLReader::Read: got no doc shell" );
    if( !pDocSh )
        return ERR_SWG_READ_ERROR;

    Reference< frame::XModel > xModel = pDocSh->GetModel();
    ASSERT( xModel.is(),
            "XMLReader::Read: got no model" );
    if( !xModel.is() )
        return ERR_SWG_READ_ERROR;

    // Get data source ...
    Reference< io::XActiveDataSource > xSource;
    if( pMedium /* && pMedium->GetLoadEnvironment_Impl() */ )
    {
        // if there is a medium and if this medium has a load environment,
        // we get an active data source from the medium.
        xSource = pMedium->GetDataSource();
        ASSERT( xSource.is(), "XMLReader:: got no data source from medium" );
    }
    if( !xSource.is() )
    {
        // If we didn't get a data source from a medium, we have to create
        // one.
        Reference< XInterface > xFactory = xServiceFactory->createInstance(
            OUString::createFromAscii("com.sun.star.frame.DataSourceFactory") );
        if( xFactory.is() )
        {
            Reference< lang::XMultiServiceFactory > xMFactory( xFactory,
                                                               UNO_QUERY );
            if( xMFactory.is() )
            {
                OUString sURL( rName );
                Sequence< Any > aArgs(1);
                Any* pArgs = aArgs.getArray();
                *pArgs <<= sURL;

                Reference< XInterface > xSrc =
                    xMFactory->createInstanceWithArguments( sURL, aArgs );
                if( xSrc.is() )
                {
                    Reference< io::XActiveDataSource > xTmp( xSrc, UNO_QUERY );
                    xSource = xTmp;
                }
            }
        }
    }

    // get data source
    ASSERT( xSource.is(), "XMLReader::Read: data source missing" );
    if( !xSource.is() )
        return ERR_SWG_READ_ERROR;

    // get parser
    Reference< XInterface > xXMLParser = xServiceFactory->createInstance(
            OUString::createFromAscii("com.sun.star.xml.sax.Parser") );
    ASSERT( xXMLParser.is(),
            "XMLReader::Read: com.sun.star.xml.sax.Parser service missing" );
    if( !xXMLParser.is() )
        return ERR_SWG_READ_ERROR;

    // get a pipe for connecting the data source to the parser
    Reference< XInterface > xPipe = xServiceFactory->createInstance(
            OUString::createFromAscii("com.sun.star.io.Pipe") );
    ASSERT( xPipe.is(),
            "XMLReader::Read: com.sun.star.io.Pipe service missing" );
    if( !xPipe.is() )
        return ERR_SWG_READ_ERROR;

    sal_uInt16 nStyleFamilyMask = SFX_STYLE_FAMILY_ALL;
    sal_Bool bLoadDoc;
    sal_Bool bInsert;
    if( aOpt.IsFmtsOnly() )
    {
        bLoadDoc = sal_False;
        bInsert = aOpt.IsMerge();
        nStyleFamilyMask = 0U;
        if( aOpt.IsFrmFmts() )
            nStyleFamilyMask |= SFX_STYLE_FAMILY_FRAME;
        if( aOpt.IsPageDescs() )
            nStyleFamilyMask |= SFX_STYLE_FAMILY_PAGE;
        if( aOpt.IsTxtFmts() )
            nStyleFamilyMask |= (SFX_STYLE_FAMILY_CHAR|SFX_STYLE_FAMILY_PARA);
        if( aOpt.IsNumRules() )
            nStyleFamilyMask |= SFX_STYLE_FAMILY_PSEUDO;
    }
    else
    {
        bLoadDoc = sal_True;
        bInsert = bInsertMode;
        nStyleFamilyMask = SFX_STYLE_FAMILY_ALL;
    }
    aOpt.ResetAllFmtsOnly();

    // get filter
    Reference< xml::sax::XDocumentHandler > xFilter =
            new SwXMLImport( rDoc, rPaM, bLoadDoc, bInsert, nStyleFamilyMask,
                               xModel );

    // connect pipe's output stream to the data source
    Reference< io::XOutputStream > xPipeOutput( xPipe, UNO_QUERY );
    xSource->setOutputStream( xPipeOutput );

    // connect pipe's input stream to the parser
     xml::sax::InputSource aParserInput;
    Reference< io::XInputStream > xPipeInput( xPipe, UNO_QUERY );
    aParserInput.aInputStream = xPipeInput;
    aParserInput.sSystemId = rName;

    // connect parser and filter
    Reference< xml::sax::XParser > xParser( xXMLParser, UNO_QUERY );
    xParser->setDocumentHandler( xFilter );

    rDoc.AddLink(); // prevent deletion
    sal_uInt32 nRet = 0;

    // parse
    Reference< io::XActiveDataControl > xSourceControl( xSource, UNO_QUERY );
    xSourceControl->start();
    try
    {
        xParser->parseStream( aParserInput );
    }
    catch( xml::sax::SAXParseException& )
    {
        nRet = ERR_SWG_READ_ERROR;
    }
    catch( xml::sax::SAXException&)
    {
        nRet = ERR_SWG_READ_ERROR;
    }
    catch( io::IOException& )
    {
        nRet = ERR_SWG_READ_ERROR;
    }

    rDoc.RemoveLink();

    return nRet;
}


/*************************************************************************

      $Log: not supported by cvs2svn $
      Revision 1.13  2000/09/18 16:05:04  willem.vandorp
      OpenOffice header added.

      Revision 1.12  2000/07/07 13:58:36  mib
      text styles using StarOffice API

      Revision 1.11  2000/05/03 12:08:05  mib
      unicode

      Revision 1.10  2000/03/21 15:10:56  os
      UNOIII

      Revision 1.9  2000/03/13 14:33:43  mib
      UNO3

      Revision 1.8  2000/02/11 14:40:44  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.7  1999/11/26 11:15:20  mib
      loading of styles only and insert mode

      Revision 1.6  1999/11/19 16:40:21  os
      modules renamed

      Revision 1.5  1999/11/19 15:27:05  mib
      Opt: using OUString constructor instead of StringToOUString

      Revision 1.4  1999/09/23 11:53:47  mib
      i18n, token maps and hard paragraph attributes

      Revision 1.3  1999/08/19 14:51:30  HR
      #65293#: fixed exception macro usage


      Rev 1.2   19 Aug 1999 16:51:30   HR
   #65293#: fixed exception macro usage

      Rev 1.1   17 Aug 1999 16:31:26   MIB
   import

      Rev 1.0   12 Aug 1999 12:28:08   MIB
   Initial revision.

*************************************************************************/

diff --git a/sw/source/filter/xml/wrtxml.cxx b/sw/source/filter/xml/wrtxml.cxx
new file mode 100644
index 0000000..feb0e82
--- /dev/null
+++ b/sw/source/filter/xml/wrtxml.cxx
@@ -0,0 +1,238 @@
/*************************************************************************
 *
 *  $RCSfile: wrtxml.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:59 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#ifndef _UNOTOOLS_PROCESSFACTORY_HXX_
#include <unotools/processfactory.hxx>
#endif

#ifndef _XMLOFF_XMLKYWD_HXX
#include <xmloff/xmlkywd.hxx>
#endif

#ifndef _SFXDOCFILE_HXX //autogen wg. SfxMedium
#include <sfx2/docfile.hxx>
#endif
#ifndef _PAM_HXX //autogen wg. SwPaM
#include <pam.hxx>
#endif
#ifndef _DOC_HXX //autogen wg. SwDoc
#include <doc.hxx>
#endif
#ifndef _DOCSH_HXX //autogen wg. SwDoc
#include <docsh.hxx>
#endif

#ifndef _ERRHDL_HXX //autogen wg. ASSERT
#include <errhdl.hxx>
#endif
#ifndef _SWSWERROR_H
#include <swerror.h>
#endif
#ifndef _WRTXML_HXX
#include <wrtxml.hxx>
#endif
#ifndef _XMLEXP_HXX
#include <xmlexp.hxx>
#endif

using namespace ::rtl;
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;

SwXMLWriter::SwXMLWriter()
{
}


__EXPORT SwXMLWriter::~SwXMLWriter()
{
}

sal_uInt32 SwXMLWriter::WriteStream()
{
    ASSERT( !this, "SwXMLWriter::WriteStream: use Write!" );

    return ERR_SWG_WRITE_ERROR;
}

sal_uInt32 SwXMLWriter::Write( SwPaM& rPaM, SfxMedium& rMed,
                               const String* pFileName )
{
    Reference< lang::XMultiServiceFactory > xServiceFactory =
            utl::getProcessServiceFactory();
    ASSERT( xServiceFactory.is(),
            "SwXMLWriter::Write: got no service manager" );
    if( !xServiceFactory.is() )
        return ERR_SWG_WRITE_ERROR;

    Reference< XInterface > xWriter = xServiceFactory->createInstance(
            OUString::createFromAscii("com.sun.star.xml.sax.Writer") );
    ASSERT( xWriter.is(),
            "SwXMLWriter::Write: com.sun.star.xml.sax.Writer service missing" );
    if(!xWriter.is())
        return ERR_SWG_WRITE_ERROR;

    Reference< frame::XModel > xModel = rPaM.GetDoc()->GetDocShell()->GetModel();
    ASSERT( xModel.is(),
            "XMLWriter::Write: got no model" );
    if( !xModel.is() )
        return ERR_SWG_WRITE_ERROR;

    Reference< io::XOutputStream > xOut = rMed.GetDataSink();
    Reference< io::XActiveDataSource > xSrc( xWriter, UNO_QUERY );
    xSrc->setOutputStream( xOut );

    Reference< xml::sax::XDocumentHandler > xHandler( xWriter, UNO_QUERY );

    SwXMLExport *pExp = new SwXMLExport( xModel, rPaM, *pFileName, xHandler,
                                         bWriteAll, bWriteOnlyFirstTable,
                                         bShowProgress );

    sal_uInt32 nRet = pExp->exportDoc( sXML_text );

    delete pExp;

    ResetWriter();

    return nRet;
}

// -----------------------------------------------------------------------

void GetXMLWriter( const String&, WriterRef& xRet )
{
    xRet = new SwXMLWriter;
}

// -----------------------------------------------------------------------

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/xml/wrtxml.cxx,v 1.1.1.1 2000-09-18 17:14:59 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.17  2000/09/18 16:05:04  willem.vandorp
      OpenOffice header added.

      Revision 1.16  2000/07/21 12:55:15  mib
      text import/export using StarOffice API

      Revision 1.15  2000/06/08 09:45:54  aw
      changed to use functionality from xmloff project now

      Revision 1.14  2000/05/03 12:08:05  mib
      unicode

      Revision 1.13  2000/03/21 15:10:56  os
      UNOIII

      Revision 1.12  2000/03/13 14:33:44  mib
      UNO3

      Revision 1.11  2000/03/03 16:07:54  pl
      #73771# workaround for c50 intel compiler

      Revision 1.10  2000/02/11 14:40:52  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.9  1999/11/26 11:09:47  mib
      progress, export-flags

      Revision 1.8  1999/11/19 16:40:21  os
      modules renamed

      Revision 1.7  1999/10/26 13:34:30  mib
      removed 'using namespace' from header files

      Revision 1.6  1999/10/25 10:41:48  mib
      Using new OUString ASCII methods

      Revision 1.5  1999/10/15 14:48:25  hr
      export() -> exportDoc()

      Revision 1.4  1999/10/15 12:36:39  mib
      added document class attribute

      Revision 1.3  1999/10/08 11:47:06  mib
      moved some file to SVTOOLS/SVX

      Revision 1.2  1999/09/22 11:56:36  mib
      string -> wstring

      Revision 1.1  1999/08/12 10:28:26  MIB
      Initial revision.


      Rev 1.0   12 Aug 1999 12:28:26   MIB
   Initial revision.

*************************************************************************/

diff --git a/sw/source/filter/xml/wrtxml.hxx b/sw/source/filter/xml/wrtxml.hxx
new file mode 100644
index 0000000..bdc91f0
--- /dev/null
+++ b/sw/source/filter/xml/wrtxml.hxx
@@ -0,0 +1,89 @@
/*************************************************************************
 *
 *  $RCSfile: wrtxml.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:59 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _WRTXML_HXX
#define _WRTXML_HXX

#ifndef _SHELLIO_HXX
#include <shellio.hxx>
#endif

class SwDoc;
class SwPaM;
class SfxMedium;

class SwXMLWriter : public Writer
{
protected:
    virtual sal_uInt32 WriteStream();

public:

    SwXMLWriter();
    virtual ~SwXMLWriter();

    virtual sal_uInt32 Write( SwPaM& rPam, SfxMedium& rMed,
                              const String* pFileName );
};


#endif  //  _WRTXML_HXX

diff --git a/sw/source/filter/xml/xmlbrsh.cxx b/sw/source/filter/xml/xmlbrsh.cxx
new file mode 100644
index 0000000..e500fc8
--- /dev/null
+++ b/sw/source/filter/xml/xmlbrsh.cxx
@@ -0,0 +1,318 @@
/*************************************************************************
 *
 *  $RCSfile: xmlbrsh.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:59 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#include "hintids.hxx"
#include <tools/debug.hxx>

#include <xmloff/nmspmap.hxx>
#include <xmloff/xmlnmspe.hxx>
#include <xmloff/xmlkywd.hxx>
#include <xmloff/xmlimp.hxx>
#include <xmloff/xmltkmap.hxx>

#ifndef _SVX_UNOMID_HXX
#include <svx/unomid.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX
#include <svx/brshitem.hxx>
#endif

#include "xmlbrshi.hxx"
#include "xmlbrshe.hxx"

using namespace ::rtl;
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;

enum SvXMLTokenMapAttrs
{
    XML_TOK_BGIMG_HREF,
    XML_TOK_BGIMG_TYPE,
    XML_TOK_BGIMG_ACTUATE,
    XML_TOK_BGIMG_SHOW,
    XML_TOK_BGIMG_POSITION,
    XML_TOK_BGIMG_REPEAT,
    XML_TOK_BGIMG_FILTER,
    XML_TOK_NGIMG_END=XML_TOK_UNKNOWN
};

static __FAR_DATA SvXMLTokenMapEntry aBGImgAttributesAttrTokenMap[] =
{
    { XML_NAMESPACE_XLINK, sXML_href,       XML_TOK_BGIMG_HREF      },
    { XML_NAMESPACE_XLINK, sXML_type,       XML_TOK_BGIMG_TYPE      },
    { XML_NAMESPACE_XLINK, sXML_actuate,    XML_TOK_BGIMG_ACTUATE   },
    { XML_NAMESPACE_XLINK, sXML_show,       XML_TOK_BGIMG_SHOW      },
    { XML_NAMESPACE_STYLE, sXML_position,   XML_TOK_BGIMG_POSITION  },
    { XML_NAMESPACE_STYLE, sXML_repeat,     XML_TOK_BGIMG_REPEAT    },
    { XML_NAMESPACE_STYLE, sXML_filter_name,XML_TOK_BGIMG_FILTER    },
    XML_TOKEN_MAP_END
};

TYPEINIT1( SwXMLBrushItemImportContext, SvXMLImportContext );

void SwXMLBrushItemImportContext::ProcessAttrs(
        const Reference< xml::sax::XAttributeList >& xAttrList,
        const SvXMLUnitConverter& rUnitConv )
{
    SvXMLTokenMap aTokenMap( aBGImgAttributesAttrTokenMap );

    sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
    for( sal_Int16 i=0; i < nAttrCount; i++ )
    {
        const OUString& rAttrName = xAttrList->getNameByIndex( i );
        OUString aLocalName;
        sal_uInt16 nPrefix =
            GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
                                                            &aLocalName );
        const OUString& rValue = xAttrList->getValueByIndex( i );

        switch( aTokenMap.Get( nPrefix, aLocalName ) )
        {
        case XML_TOK_BGIMG_HREF:
            pItem->importXML( rValue, MID_GRAPHIC_LINK, rUnitConv );
            break;
        case XML_TOK_BGIMG_TYPE:
        case XML_TOK_BGIMG_ACTUATE:
        case XML_TOK_BGIMG_SHOW:
            break;
        case XML_TOK_BGIMG_POSITION:
            pItem->importXML( rValue, MID_GRAPHIC_POSITION, rUnitConv );
            break;
        case XML_TOK_BGIMG_REPEAT:
            pItem->importXML( rValue, MID_GRAPHIC_REPEAT, rUnitConv );
            break;
        case XML_TOK_BGIMG_FILTER:
            pItem->importXML( rValue, MID_GRAPHIC_FILTER, rUnitConv );
            break;
        }
    }

    if( !(pItem->GetGraphicLink() || pItem->GetGraphic() ) )
        pItem->SetGraphicPos( GPOS_NONE );
    else if( GPOS_NONE == pItem->GetGraphicPos() )
        pItem->SetGraphicPos( GPOS_TILED );
}

SwXMLBrushItemImportContext::SwXMLBrushItemImportContext(
        SvXMLImport& rImport, sal_uInt16 nPrfx,
        const OUString& rLName,
        const Reference< xml::sax::XAttributeList >& xAttrList,
        const SvXMLUnitConverter& rUnitConv,
        const SvxBrushItem& rItem ) :
    SvXMLImportContext( rImport, nPrfx, rLName ),
    pItem( new SvxBrushItem( rItem ) )
{
    // delete any grephic that is existing
    pItem->SetGraphicPos( GPOS_NONE );

    ProcessAttrs( xAttrList, rUnitConv );
}

SwXMLBrushItemImportContext::SwXMLBrushItemImportContext(
        SvXMLImport& rImport, sal_uInt16 nPrfx,
        const OUString& rLName,
        const Reference< xml::sax::XAttributeList > & xAttrList,
        const SvXMLUnitConverter& rUnitConv,
        sal_uInt16 nWhich ) :
    SvXMLImportContext( rImport, nPrfx, rLName ),
    pItem( new SvxBrushItem( nWhich ) )
{
    ProcessAttrs( xAttrList, rUnitConv );
}

SwXMLBrushItemImportContext::~SwXMLBrushItemImportContext()
{
    delete pItem;
}

OUString SwXMLBrushItemExport::GetQNameByKey(
        sal_uInt16 nKey,
         const OUString& rLocalName ) const
{
    if( pNamespaceMap )
        return pNamespaceMap->GetQNameByKey( nKey, rLocalName );
    else
        return rLocalName;
}

void SwXMLBrushItemExport::ClearAttrList()
{
    pAttrList->Clear();
}

#ifndef PRODUCT
void SwXMLBrushItemExport::CheckAttrList()
{
    DBG_ASSERT( !pAttrList->getLength(),
                "SvxXMLBrsuhItemExport::CheckAttrList: list is not empty" );
}
#endif

void SwXMLBrushItemExport::AddAttribute( sal_uInt16 nPrefixKey,
                                          const sal_Char *pName,
                                          const OUString& rValue )
{
    OUString sName( OUString::createFromAscii( pName ) );

    pAttrList->AddAttribute( GetQNameByKey( nPrefixKey, sName ),
                             sCDATA, rValue );
}

SwXMLBrushItemExport::SwXMLBrushItemExport(
        const Reference< xml::sax::XDocumentHandler >& rHandler,
        const SvXMLUnitConverter& rUnitConverter ) :
    sCDATA( OUString::createFromAscii( sXML_CDATA ) ),
    pNamespaceMap( 0 ),
    rUnitConv( rUnitConverter ),
    pAttrList( new SvXMLAttributeList )
{
    xHandler = rHandler;
    xAttrList = pAttrList;
}

SwXMLBrushItemExport::~SwXMLBrushItemExport()
{
}

void SwXMLBrushItemExport::exportXML( const SvxBrushItem& rItem,
                                         const SvXMLNamespaceMap& rNamespaceMap )
{
    pNamespaceMap = &rNamespaceMap;

    CheckAttrList();

    OUString sValue;
    if( rItem.exportXML( sValue, MID_GRAPHIC_LINK, rUnitConv ) )
    {
        AddAttribute( XML_NAMESPACE_XLINK, sXML_href, sValue );
        AddAttribute( XML_NAMESPACE_XLINK, sXML_type,
                      OUString::createFromAscii(sXML_simple) );
//      AddAttribute( XML_NAMESPACE_XLINK, sXML_show, ACP2WS(sXML_embed) );
        AddAttribute( XML_NAMESPACE_XLINK, sXML_actuate,
                      OUString::createFromAscii(sXML_onLoad) );

        if( rItem.exportXML( sValue, MID_GRAPHIC_POSITION, rUnitConv ) )
            AddAttribute( XML_NAMESPACE_STYLE, sXML_position, sValue );

        if( rItem.exportXML( sValue, MID_GRAPHIC_REPEAT, rUnitConv ) )
            AddAttribute( XML_NAMESPACE_STYLE, sXML_repeat, sValue );

        if( rItem.exportXML( sValue, MID_GRAPHIC_FILTER, rUnitConv ) )
            AddAttribute( XML_NAMESPACE_STYLE, sXML_filter_name, sValue );
    }

    OUString sElem( GetQNameByKey( XML_NAMESPACE_STYLE,
                        OUString::createFromAscii(sXML_background_image) ) );
    xHandler->startElement( sElem, xAttrList );
    ClearAttrList();
    xHandler->endElement( sElem );

    pNamespaceMap = 0;
}

/*************************************************************************

      Source Code Control ::com::sun::star::chaos::System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/xml/xmlbrsh.cxx,v 1.1.1.1 2000-09-18 17:14:59 hr Exp $

      Source Code Control ::com::sun::star::chaos::System - Update

      $Log: not supported by cvs2svn $
      Revision 1.2  2000/09/18 16:05:05  willem.vandorp
      OpenOffice header added.

      Revision 1.1  2000/08/02 14:52:38  mib
      text export continued

      Revision 1.2  2000/06/26 08:29:55  mib
      no SVX dependency any longer

      Revision 1.1  2000/06/08 09:14:25  aw
      new export classes from svx

      Revision 1.5  2000/05/02 10:04:19  mib
      unicode

      Revision 1.4  2000/03/13 14:38:56  cl
      uno3

      Revision 1.3  2000/02/10 20:09:32  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.2  2000/01/06 14:59:19  mib
      #70271#:separation of text/layout, cond. styles, adaptions to wd-xlink-19991229

      Revision 1.1  1999/12/13 08:11:18  mib
      #70271#: XML brush item import/export

      Revision 1.1  1999/12/04 16:47:25  cl
      #70271# added support for exporting tab-stop elements in xml


*************************************************************************/

diff --git a/sw/source/filter/xml/xmlbrshe.hxx b/sw/source/filter/xml/xmlbrshe.hxx
new file mode 100644
index 0000000..813991d
--- /dev/null
+++ b/sw/source/filter/xml/xmlbrshe.hxx
@@ -0,0 +1,122 @@
/*************************************************************************
 *
 *  $RCSfile: xmlbrshe.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:59 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _XMLBRSHE_HXX
#define _XMLBRSHE_HXX

#ifndef _RTL_USTRING_HXX_
#include <rtl/ustring.hxx>
#endif

#ifndef _XMLOFF_ATTRLIST_HXX
#include <xmloff/attrlist.hxx>
#endif


class SvXMLNamespaceMap;
class SvXMLUnitConverter;
class SvxBrushItem;

class SwXMLBrushItemExport
{
    const ::rtl::OUString sCDATA;

    // the handler
    ::com::sun::star::uno::Reference<
        ::com::sun::star::xml::sax::XDocumentHandler >  xHandler;

    // a common attribute list and an interface of it
    SvXMLAttributeList          *pAttrList;
    ::com::sun::star::uno::Reference<
        ::com::sun::star::xml::sax::XAttributeList >    xAttrList;

    const SvXMLNamespaceMap     *pNamespaceMap; // the namepspace map
    const SvXMLUnitConverter&   rUnitConv;

protected:

    // Check if common attribute list is empty.
#ifdef PRODUCT
    void CheckAttrList() {}
#else
    void CheckAttrList();
#endif
    void ClearAttrList();
    void AddAttribute( sal_uInt16 nPrefixKey, const sal_Char *pName,
                       const ::rtl::OUString& rValue );
    ::rtl::OUString GetQNameByKey( sal_uInt16 nKey,
                                   const ::rtl::OUString& rLocalName ) const;
public:

    SwXMLBrushItemExport(
            const ::com::sun::star::uno::Reference<
                    ::com::sun::star::xml::sax::XDocumentHandler > & rHandler,
               const SvXMLUnitConverter& rUnitConverter );
    ~SwXMLBrushItemExport();

    // core API
    void exportXML( const SvxBrushItem& rItem,
                    const SvXMLNamespaceMap& rNamespMap );
};


#endif  //  _XMLBRSHE_HXX

diff --git a/sw/source/filter/xml/xmlbrshi.hxx b/sw/source/filter/xml/xmlbrshi.hxx
new file mode 100644
index 0000000..13c7a62
--- /dev/null
+++ b/sw/source/filter/xml/xmlbrshi.hxx
@@ -0,0 +1,113 @@
/*************************************************************************
 *
 *  $RCSfile: xmlbrshi.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:15:00 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _XMLBRSHI_HXX
#define _XMLBRSHI_HXX

#ifndef _XMLOFF_XMLICTXT_HXX
#include "xmlictxt.hxx"
#endif

class SvXMLImport;
class SvXMLUnitConverter;
class SvxBrushItem;

namespace rtl { class OUString; }

class SwXMLBrushItemImportContext : public SvXMLImportContext
{
private:
    SvxBrushItem                *pItem;

    void ProcessAttrs(
            const ::com::sun::star::uno::Reference<
                    ::com::sun::star::xml::sax::XAttributeList > & xAttrList,
               const SvXMLUnitConverter& rUnitConv );

public:
    TYPEINFO();

    SwXMLBrushItemImportContext(
            SvXMLImport& rImport,
            sal_uInt16 nPrfx,
            const ::rtl::OUString& rLName,
            const ::com::sun::star::uno::Reference<
                    ::com::sun::star::xml::sax::XAttributeList > & xAttrList,
            const SvXMLUnitConverter& rUnitConv,
               const SvxBrushItem& rItem    );

    SwXMLBrushItemImportContext(
            SvXMLImport& rImport,
            sal_uInt16 nPrfx,
            const ::rtl::OUString& rLName,
            const ::com::sun::star::uno::Reference<
                    ::com::sun::star::xml::sax::XAttributeList > & xAttrList,
            const SvXMLUnitConverter& rUnitConv,
            sal_uInt16 nWhich   );

    virtual ~SwXMLBrushItemImportContext();

    const SvxBrushItem& GetItem() const { return *pItem; }
};


#endif  //  _XMLBRSHI_HXX

diff --git a/sw/source/filter/xml/xmlexp.cxx b/sw/source/filter/xml/xmlexp.cxx
new file mode 100644
index 0000000..e09dfdf
--- /dev/null
+++ b/sw/source/filter/xml/xmlexp.cxx
@@ -0,0 +1,550 @@
/*************************************************************************
 *
 *  $RCSfile: xmlexp.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:15:00 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#ifndef _NODE_HXX //autogen wg. SwTableNode
#include <node.hxx>
#endif
#ifndef _NDTXT_HXX //autogen wg. SwTxtNode
#include <ndtxt.hxx>
#endif
#ifndef _PAM_HXX //autogen wg. SwPaM
#include <pam.hxx>
#endif
#ifndef _DOC_HXX //autogen wg. SwDoc
#include <doc.hxx>
#endif
#ifndef _MDIEXP_HXX
#include <mdiexp.hxx>       // ...Percent()
#endif
#ifndef _STATSTR_HRC
#include <statstr.hrc>      // ResId fuer Statusleiste
#endif
#ifndef _SHL_HXX //autogen wg. SHL_WRITER
#include <tools/shl.hxx>
#endif
#ifndef _SWMODULE_HXX //autogen wg. SW_MOD
#include <swmodule.hxx>
#endif

#ifndef _SWDOCSH_HXX
#include <docsh.hxx>
#endif

#ifndef _COM_SUN_STAR_TEXT_XTEXTDOCUMENT_HPP_
#include <com/sun/star/text/XTextDocument.hpp>
#endif

#ifndef _COM_SUN_STAR_TEXT_XTEXT_HPP_
#include <com/sun/star/text/XText.hpp>
#endif

#ifndef _XMLOFF_NMSPMAP_HXX
#include <xmloff/nmspmap.hxx>
#endif

#ifndef _XMLOFF_XMLNMSPE_HXX
#include <xmloff/xmlnmspe.hxx>
#endif

#ifndef _XMLOFF_XMLKYWD_HXX
#include <xmloff/xmlkywd.hxx>
#endif

#ifndef _XMLOFF_XMLCNITM_HXX
#include <xmloff/xmlcnitm.hxx>
#endif

#ifndef _XMLOFF_XMLASTPL_HXX
#include <xmloff/xmlastpl.hxx>
#endif

#ifndef _XMLOFF_TXTFLDE_HXX
#include <xmloff/txtflde.hxx>
#endif

#ifndef _XMLOFF_XMLNUMFE_HXX
#include <xmloff/xmlnumfe.hxx>
#endif

#ifndef _COM_SUN_STAR_UTIL_XNUMBERFORMATSSUPPLIER_HPP
#include <com/sun/star/util/XNumberFormatsSupplier.hpp>
#endif

#ifndef _XMLOFF_TXTPARAE_HXX
#include <xmloff/txtparae.hxx>
#endif
#ifndef _XMLOFF_XMLASTPLP_HXX
#include <xmloff/xmlaustp.hxx>
#endif
#ifndef _XMLOFF_TXTPRMAP_HXX
#include <xmloff/txtprmap.hxx>
#endif
#ifndef _XMLOFF_FAMILIES_HXX_
#include <xmloff/families.hxx>
#endif

#ifndef _XMLNUME_HXX
#include <xmlnume.hxx>
#endif
#ifndef _XMLFMTE_HXX
#include <xmlfmte.hxx>
#endif
#ifndef _XMLTEXTE_HXX
#include <xmltexte.hxx>
#endif
#ifndef _XMLEXP_HXX
#include <xmlexp.hxx>
#endif

using namespace ::rtl;
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::frame;
using namespace ::com::sun::star::text;

#ifdef XML_CORE_API
void SwXMLExport::SetCurPaM( SwPaM& rPaM, sal_Bool bWhole, sal_Bool bTabOnly )
{
    if( !pCurPaM )
    {
        pCurPaM = new SwPaM( *rPaM.End(), *rPaM.Start() );
    }
    else
    {
        *pCurPaM->GetPoint() = *rPaM.Start();
        *pCurPaM->GetMark() = *rPaM.End();
    }

    // Set PaM to table/section start node if whole doc should be exported
    if( bWhole )
    {
        SwTableNode *pTblNd = pCurPaM->GetNode()->FindTableNode();
        if( pTblNd )
        {
            pCurPaM->GetPoint()->nNode = *pTblNd;

            if( bTabOnly )
                pCurPaM->GetMark()->nNode = *pTblNd->EndOfSectionNode();
        }

        SwSectionNode * pSectNd = pCurPaM->GetNode()->FindSectionNode();
        while( pSectNd )
        {
            pCurPaM->GetPoint()->nNode = *pSectNd;

            // SwSectionNode::FindSectionNode() returns the section node itself
            pSectNd = pSectNd->FindStartNode()->FindSectionNode();
        }
    }
}
#endif

SwXMLExport::SwXMLExport( const Reference< XModel >& rModel, SwPaM& rPaM,
             const OUString& rFileName,
             const Reference< xml::sax::XDocumentHandler > & rHandler,
             sal_Bool bExpWholeDoc, sal_Bool bExpFirstTableOnly,
             sal_Bool bShowProg ) :
    SvXMLExport( rFileName, rHandler, rModel,
                 SW_MOD()->GetMetric( rPaM.GetDoc()->IsHTMLMode() ) ),
    pDoc( rPaM.GetDoc() ),
#ifdef XML_CORE_API
    pCurPaM( 0 ),
    pOrigPaM( &rPaM ),
    pParaItemMapper( 0 ),
#endif
    pTableItemMapper( 0 ),
#ifdef XML_CORE_API
    pItemSetAutoStylePool( new SwXMLAutoStylePool ),
    pListElements( 0 ),
    pExportedLists( 0 ),
#endif
    pTableLines( 0 ),
    bExportWholeDoc( bExpWholeDoc ),
    bExportFirstTableOnly( bExpFirstTableOnly ),
    bShowProgress( bShowProg )
#ifdef XML_CORE_API
    , pTextFieldExport( 0 ),
    pNumberFormatExport( 0 )
#endif
{
//  _GetNamespaceMap().AddAtIndex( XML_NAMESPACE_TEXT, sXML_np_text,
//                                 sXML_n_text, XML_NAMESPACE_TEXT );
//  _GetNamespaceMap().AddAtIndex( XML_NAMESPACE_TABLE, sXML_np_table,
//                                 sXML_n_table, XML_NAMESPACE_TABLE );

    const SfxPoolItem* pItem;
    const SfxItemPool& rPool = pDoc->GetAttrPool();
    sal_uInt16 nItems = rPool.GetItemCount( RES_UNKNOWNATR_CONTAINER );
    sal_Bool bExtended = sal_False;
    for( sal_uInt16 i = 0; i < nItems; ++i )
    {
        if( 0 != (pItem = rPool.GetItem( RES_UNKNOWNATR_CONTAINER, i ) ) )
        {
            const SvXMLAttrContainerItem *pUnknown =
                        (const SvXMLAttrContainerItem *)pItem;
            if( (pUnknown->GetAttrCount() > 0) )
            {
                sal_uInt16 nIdx = pUnknown->GetFirstNamespaceIndex();
                while( USHRT_MAX != nIdx )
                {
                    const OUString& rPrefix = pUnknown->GetPrefix( nIdx );
                    if( USHRT_MAX ==
                                GetNamespaceMap().GetIndexByPrefix( rPrefix ) )
                    {
                        // Add namespace declaration for unknown attributes if
                        // there aren't existing ones for the prefix used by the
                        // attibutes
                        _GetNamespaceMap().Add( rPrefix,
                                                pUnknown->GetNamespace( nIdx ),
                                                XML_NAMESPACE_UNKNOWN );
                    }
                    nIdx = pUnknown->GetNextNamespaceIndex( nIdx );
                }

                bExtended = sal_True;
            }
        }
    }

    SetExtended( bExtended );

#ifdef XML_CORE_API
    SetCurPaM( rPaM, bExportWholeDoc, bExportFirstTableOnly );
#endif

    _InitItemExport();

    if( bShowProgress )
        ::StartProgress( STR_STATSTR_W4WWRITE, 0, pDoc->GetNodes().Count(),
                         pDoc->GetDocShell() );

#ifdef XML_CORE_API
    Reference< util::XNumberFormatsSupplier > xNumFmtSupp(
        pDoc->GetDocShell()->GetBaseModel(), UNO_QUERY);
    pNumberFormatExport = new SvXMLNumFmtExport( rHandler, xNumFmtSupp );

    pTextFieldExport = new XMLTextFieldExport( *this );
#endif

    SfxObjectShell* pObjSh = pDoc->GetDocShell();
    if( pObjSh )
        pObjSh->UpdateDocInfoForSave();     // update information
}

#ifndef XML_CORE_API
XMLTextParagraphExport* SwXMLExport::CreateTextParagraphExport()
{
    return new SwXMLTextParagraphExport( *this, *GetAutoStylePool().get() );
}
#endif

__EXPORT SwXMLExport::~SwXMLExport()
{
#ifdef XML_CORE_API
    delete pItemSetAutoStylePool;
#endif

#ifdef XML_CORE_API
    delete pTextFieldExport;
    delete pNumberFormatExport;
#endif

    if( bShowProgress )
        ::EndProgress( pDoc->GetDocShell() );

#ifdef XML_CORE_API
    if( pCurPaM )
    {
        while( pCurPaM->GetNext() != pCurPaM )
            delete pCurPaM->GetNext();
        delete pCurPaM;
    }
#endif
    _FinitItemExport();
#ifdef XML_CORE_API
    _FinitNumRuleExport();
#endif
    ASSERT( !pTableLines, "there are table columns infos left" );
}


void SwXMLExport::_ExportContent()
{
#ifdef XML_CORE_API
    // export field declarations
//  pTextFieldExport->ExportFieldDeclarations();

    // export all PaMs
    SwPaM *pPaM = pOrigPaM;
    sal_Bool bContinue = sal_True;
    do
    {
        // export PaM content
        ExportCurPaM( bExportWholeDoc );

        bContinue = pPaM->GetNext() != pOrigPaM;

        if( bContinue )
        {
            pPaM = (SwPaM *)pPaM->GetNext();
            SetCurPaM( *pPaM, bExportWholeDoc, bExportFirstTableOnly );
        }

    } while( bContinue );
#else
    GetTextParagraphExport()->exportTextDeclarations();
    Reference < XTextDocument > xTextDoc( GetModel(), UNO_QUERY );
    Reference < XText > xText = xTextDoc->getText();

    GetTextParagraphExport()->exportFramesBoundToPage();
    GetTextParagraphExport()->exportText( xText );
#endif
}

#ifdef XML_CORE_API
void SwXMLExport::ExportCurPaM( sal_Bool bExportWholePaM )
{
    sal_Bool bFirstNode = sal_True;
    sal_Bool bExportWholeNode = bExportWholePaM;

    SwXMLNumRuleInfo aPrevNumInfo;
    SwXMLNumRuleInfo aNextNumInfo;

    while( pCurPaM->GetPoint()->nNode.GetIndex() <
                                pCurPaM->GetMark()->nNode.GetIndex() ||
           ( pCurPaM->GetPoint()->nNode.GetIndex() ==
                                pCurPaM->GetMark()->nNode.GetIndex() &&
             pCurPaM->GetPoint()->nContent.GetIndex() <=
                                pCurPaM->GetMark()->nContent.GetIndex() ) )
    {
        SwNode *pNd = pCurPaM->GetNode();

        aNextNumInfo.Set( *pNd );
        ExportListChange( aPrevNumInfo, aNextNumInfo );

        ASSERT( !(pNd->IsGrfNode() || pNd->IsOLENode()),
                "SwXMLExport::exportCurPaM: grf or OLE node unexpected" );
        if( pNd->IsTxtNode() )
        {
            SwTxtNode* pTxtNd = pNd->GetTxtNode();

            if( !bFirstNode )
                pCurPaM->GetPoint()->nContent.Assign( pTxtNd, 0 );

            ExportTxtNode( *pTxtNd, 0, STRING_LEN, bExportWholeNode );
        }
        else if( pNd->IsTableNode() )
        {
            ExportTable( *pNd->GetTableNode() );
        }
        else if( pNd->IsSectionNode() )
        {
            ExportSection( *pNd->GetSectionNode() );
        }
        else if( pNd == &pDoc->GetNodes().GetEndOfContent() )
            break;

        pCurPaM->GetPoint()->nNode++;   // next node

        sal_uInt32 nPos = pCurPaM->GetPoint()->nNode.GetIndex();
        if( bShowProgress )
            ::SetProgressState( nPos, pDoc->GetDocShell() );

        // if not everything should be exported, the WriteAll flag must be
        // set for all but the first and last node anyway.
        bExportWholeNode = bExportWholePaM ||
                           nPos != pCurPaM->GetMark()->nNode.GetIndex();
        bFirstNode = sal_False;

        aPrevNumInfo = aNextNumInfo;
    }
    aNextNumInfo.Reset();
    ExportListChange( aPrevNumInfo, aNextNumInfo );
}
#endif


/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/xml/xmlexp.cxx,v 1.1.1.1 2000-09-18 17:15:00 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.35  2000/09/18 16:05:05  willem.vandorp
      OpenOffice header added.

      Revision 1.34  2000/09/18 11:58:02  mib
      text frames/graphics import and export continued

      Revision 1.33  2000/08/15 11:55:56  kz
      #65293# del. 2. Parameter

      Revision 1.32  2000/08/10 10:22:15  mib
      #74404#: Adeptions to new XSL/XLink working draft

      Revision 1.31  2000/08/02 14:52:39  mib
      text export continued

      Revision 1.30  2000/07/31 09:42:35  mib
      text export continued

      Revision 1.29  2000/07/27 08:06:33  mib
      text import continued

      Revision 1.28  2000/07/26 05:11:20  mib
      text import/export continued

      Revision 1.27  2000/07/24 12:01:21  dvo
      - field declarations now exported at content beginning

      Revision 1.26  2000/07/24 10:19:02  dvo
      - textfield export for XML_CORE_API

      Revision 1.25  2000/07/21 12:55:15  mib
      text import/export using StarOffice API

      Revision 1.24  2000/06/08 09:45:54  aw
      changed to use functionality from xmloff project now

      Revision 1.23  2000/05/03 12:08:05  mib
      unicode

      Revision 1.22  2000/03/13 14:33:44  mib
      UNO3

      Revision 1.21  2000/02/11 14:40:57  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.20  2000/02/07 10:03:28  mib
      #70271#: tables

      Revision 1.19  2000/01/20 10:03:15  mib
      #70271#: Lists reworked

      Revision 1.18  2000/01/12 15:00:22  mib
      #70271#: lists

      Revision 1.17  2000/01/06 15:08:27  mib
      #70271#:separation of text/layout, cond. styles, adaptions to wd-xlink-19991229

      Revision 1.16  1999/12/06 14:49:49  mib
      #70271#: office:version attribute

      Revision 1.15  1999/12/06 11:41:33  mib
      #70258#: Container item for unkown attributes

      Revision 1.14  1999/11/26 11:08:59  mib
      progress, export-flags

      Revision 1.13  1999/11/22 15:52:34  os
      headers added

      Revision 1.12  1999/11/17 20:07:53  nn
      document language

      Revision 1.11  1999/11/12 14:50:28  mib
      meta import and export reactivated

      Revision 1.10  1999/11/10 15:08:09  mib
      Import now uses XMLItemMapper

      Revision 1.9  1999/11/09 15:40:29  mib
      Using XMLItemMapper for export

      Revision 1.8  1999/11/05 19:43:18  nn
      _ExportMeta

      Revision 1.7  1999/10/26 13:34:30  mib
      removed 'using namespace' from header files

      Revision 1.6  1999/10/08 11:47:09  mib
      moved some file to SVTOOLS/SVX

      Revision 1.5  1999/09/22 11:56:47  mib
      string -> wstring

      Revision 1.4  1999/08/17 14:28:22  MIB
      namespace map methods renamed consistently


      Rev 1.3   17 Aug 1999 16:28:22   MIB
   namespace map methods renamed consistently

      Rev 1.2   13 Aug 1999 16:21:14   MIB
   new base class XMLExport, styles and sections

      Rev 1.1   12 Aug 1999 18:05:20   MIB
   Export ofSvxFontItem, SvxFontHeightItem and SvxLRSpaceItem

      Rev 1.0   12 Aug 1999 12:28:54   MIB
   Initial revision.

*************************************************************************/

diff --git a/sw/source/filter/xml/xmlexp.hxx b/sw/source/filter/xml/xmlexp.hxx
new file mode 100644
index 0000000..9926723
--- /dev/null
+++ b/sw/source/filter/xml/xmlexp.hxx
@@ -0,0 +1,254 @@
/*************************************************************************
 *
 *  $RCSfile: xmlexp.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:15:00 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _XMLEXP_HXX
#define _XMLEXP_HXX

#ifndef _XMLOFF_XMLEXP_HXX
#include <xmloff/xmlexp.hxx>
#endif

#ifndef _XMLOFF_XMLITMAP_HXX
#include <xmloff/xmlitmap.hxx>
#endif
#ifndef _UNIVERSALL_REFERENCE_HXX
#include <xmloff/uniref.hxx>
#endif

class SwDoc;
class SwPaM;
class SwTxtNode;
class SwSectionNode;
class SwFmt;
class SwFrmFmt;
class SvXMLUnitConverter;
class SvXMLExportItemMapper;
class SwXMLAutoStylePool;
class SvXMLAutoStylePool;
class SvXMLAutoStylePoolP;
class SwNodeNum;
class SfxPoolItem;
class SfxItemSet;
class SwXMLNumRuleInfo;
class OUStrings_Impl;
class OUStringsSort_Impl;
class SwTableLine;
class SwTableLines;
class SwTableBox;
class SwXMLTableColumn_Impl;
class SwXMLTableLines_Impl;
class SwXMLTableLinesCache_Impl;
class SwXMLTableColumnsSortByWidth_Impl;
class SwXMLTableFrmFmtsSort_Impl;
class SwTableNode;
#ifdef XML_CORE_API
class SvXMLNumFmtExport;
class XMLTextFieldExport;
#endif
class XMLPropertySetMapper;
class SwXMLTextParagraphExport;

class SwXMLExport : public SvXMLExport
{
    friend class SwXMLExpContext;

    SwDoc                       *pDoc;          // the current doc
#ifdef XML_CORE_API
    SwPaM                       *pCurPaM;       // the current PaM
    SwPaM                       *pOrigPaM;      // the original PaM
#endif

    SvXMLUnitConverter          *pTwipUnitConv;

#ifdef XML_CORE_API
    SvXMLExportItemMapper       *pParaItemMapper;
#endif
    SvXMLExportItemMapper       *pTableItemMapper;
#ifdef XML_CORE_API
    SwXMLAutoStylePool          *pItemSetAutoStylePool;
    OUStrings_Impl              *pListElements;
    OUStringsSort_Impl          *pExportedLists;
#endif
    SwXMLTableLinesCache_Impl   *pTableLines;
#ifdef XML_CORE_API
    SvXMLNumFmtExport           *pNumberFormatExport;
    XMLTextFieldExport          *pTextFieldExport;
#endif

    SvXMLItemMapEntriesRef      xTableItemMap;
    SvXMLItemMapEntriesRef      xTableRowItemMap;
    SvXMLItemMapEntriesRef      xTableCellItemMap;
    UniReference < XMLPropertySetMapper > xParaPropMapper;

    sal_Bool                    bExportWholeDoc : 1;// export whole document?
    sal_Bool                    bExportFirstTableOnly : 1;
    sal_Bool                    bShowProgress : 1;

    void _InitItemExport();
    void _FinitItemExport();
#ifdef XML_CORE_API
    void _FinitNumRuleExport();

    void AddTextAutoStyle( const SfxPoolItem& rItem );
    void AddParaAutoStyle( const ::rtl::OUString& rParent,
                           const SfxItemSet& rItemSet );
    ::rtl::OUString FindTextAutoStyle( const SfxPoolItem& rItem );
    ::rtl::OUString FindParaAutoStyle( const ::rtl::OUString& rParent,
                                       const SfxItemSet& rItemSet );

    void ExportCurPaMAutoStyles( sal_Bool bExportWholePaM=sal_True );
    void ExportTxtNodeAutoStyles( const SwTxtNode& rTxtNd, xub_StrLen nStart,
                                  xub_StrLen nEnd, sal_Bool bExportWholeNode );
    void ExportSectionAutoStyles( const SwSectionNode& rSectNd );
#endif
    void ExportTableLinesAutoStyles( const SwTableLines& rLines,
                                 sal_uInt32 nAbsWidth,
                                 sal_uInt32 nBaseWidth,
                                 const ::rtl::OUString& rNamePrefix,
                                 SwXMLTableColumnsSortByWidth_Impl& rExpCols,
                                 SwXMLTableFrmFmtsSort_Impl& rExpRows,
                                 SwXMLTableFrmFmtsSort_Impl& rExpCells,
                                 sal_Bool bTop=sal_False );

#ifdef XML_CORE_API
    void ExportCurPaM( sal_Bool bExportWholePaM=sal_True );
    void ExportTxtNode( const SwTxtNode& rTxtNd, xub_StrLen nStart,
                        xub_StrLen nEnd, sal_Bool bExportWholeNode );
    void ExportSection( const SwSectionNode& rSectNd );
#endif

    void ExportFmt( const SwFmt& rFmt, const sal_Char *pFamily = 0 );
    void ExportTableFmt( const SwFrmFmt& rFmt, sal_uInt32 nAbsWidth );
#ifdef XML_CORE_API
    void ExportNumRules( sal_Bool bAuto, sal_Bool bUsed );
    void ExportNodeNum( const SwNodeNum& rNdNum );
    void ExportListChange( const SwXMLNumRuleInfo& rPrvInfo,
                           const SwXMLNumRuleInfo& rNextInfo );
#endif

    void ExportTableColumnStyle( const SwXMLTableColumn_Impl& rCol );
    void ExportTableBox( const SwTableBox& rBox, sal_uInt16 nColSpan );
    void ExportTableLine( const SwTableLine& rLine,
                          const SwXMLTableLines_Impl& rLines );
    void ExportTableLines( const SwTableLines& rLines,
                           sal_Bool bHeadline=sal_False );

//  virtual void _ExportMeta();
    virtual void _ExportStyles( sal_Bool bUsed );
    virtual void _ExportAutoStyles();
    virtual void _ExportMasterStyles();
    virtual void _ExportContent();

#ifdef XML_CORE_API
    void SetCurPaM( SwPaM& rPaM, sal_Bool bWhole, sal_Bool bTabOnly );
#endif

protected:

#ifndef XML_CORE_API
    virtual XMLTextParagraphExport* CreateTextParagraphExport();
    virtual SvXMLAutoStylePoolP* CreateAutoStylePool();
#endif

public:

    SwXMLExport( const ::com::sun::star::uno::Reference<
                     ::com::sun::star::frame::XModel > & rModel,
                 SwPaM& rPaM, const ::rtl::OUString& rFileName,
                 const ::com::sun::star::uno::Reference<
                     ::com::sun::star::xml::sax::XDocumentHandler > & rHandler,
                 sal_Bool bExpWholeDoc, sal_Bool bExpFirstTableOnly,
                 sal_Bool bShowProgr );
    virtual ~SwXMLExport();

    inline const SvXMLUnitConverter& GetTwipUnitConverter() const;

    void ExportTableAutoStyles( const SwTableNode& rTblNd );
    void ExportTable( const SwTableNode& rTblNd );

#ifdef XML_CORE_API
    SvXMLExportItemMapper& GetParaItemMapper() { return *pParaItemMapper; }
#endif
    SvXMLExportItemMapper& GetTableItemMapper() { return *pTableItemMapper; }
    const UniReference < XMLPropertySetMapper >& GetParaPropMapper()
    {
        return xParaPropMapper;
    }
#ifdef XML_CORE_API
    SwXMLAutoStylePool& GetItemSetAutoStylePool() { return *pItemSetAutoStylePool; }
#endif

#ifdef XML_CORE_API
    SvXMLNumFmtExport& GetNumberFormatExport() { return *pNumberFormatExport; }
    XMLTextFieldExport& GetTextFieldExport() { return *pTextFieldExport; }
#endif

    SwDoc& GetDoc() { return *pDoc; }
};

inline const SvXMLUnitConverter& SwXMLExport::GetTwipUnitConverter() const
{
    return *pTwipUnitConv;
}


#endif  //  _XMLEXP_HXX

diff --git a/sw/source/filter/xml/xmlfmt.cxx b/sw/source/filter/xml/xmlfmt.cxx
new file mode 100644
index 0000000..2a8d964
--- /dev/null
+++ b/sw/source/filter/xml/xmlfmt.cxx
@@ -0,0 +1,1814 @@
/*************************************************************************
 *
 *  $RCSfile: xmlfmt.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:15:00 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#ifndef _RTL_USTRBUF_HXX_
#include <rtl/ustrbuf.hxx>
#endif

#ifndef _URLOBJ_HXX
#include <tools/urlobj.hxx>
#endif

#ifndef _SVSTDARR_STRINGSSORT_DECL
#define _SVSTDARR_STRINGSSORT
#include <svtools/svstdarr.hxx>
#endif

#ifndef _XMLOFF_NMSPMAP_HXX
#include <xmloff/nmspmap.hxx>
#endif

#ifndef _FORMAT_HXX //autogen wg. SwFmt
#include <format.hxx>
#endif
#ifndef _FMTCOL_HXX //autogen wg. SwTxtFmtColl
#include <fmtcol.hxx>
#endif
#ifndef _HINTS_HXX //autogen wg. SwFmtChg
#include <hints.hxx>
#endif

#ifndef _POOLFMT_HXX //autogen wg. RES_POOL_CHRFMT_TYPE
#include <poolfmt.hxx>
#endif
#ifndef _CHARFMT_HXX //autogen wg. SwCharFmt
#include <charfmt.hxx>
#endif
#ifndef _FRMFMT_HXX //autogen wg. SwFrmFmt
#include <frmfmt.hxx>
#endif
#ifndef _PARATR_HXX
#include <paratr.hxx>
#endif

#ifndef _DOC_HXX //autogen wg. SwDoc
#include <doc.hxx>
#endif
#include "docary.hxx"
#ifndef _UNOSTYLE_HXX
#include "unostyle.hxx"
#endif

#ifndef _XMLOFF_XMLNMSPE_HXX
#include <xmloff/xmlnmspe.hxx>
#endif
#ifndef _XMLOFF_I18NMAP_HXX
#include <xmloff/i18nmap.hxx>
#endif
#ifndef _XMLOFF_XMLTKMAP_HXX
#include <xmloff/xmltkmap.hxx>
#endif
#ifndef _XMLOFF_XMLITEM_HXX
#include <xmloff/xmlitem.hxx>
#endif
#ifndef _XMLOFF_XMLSTYLE_HXX
#include <xmloff/xmlstyle.hxx>
#endif
#ifndef _XMLOFF_XMLKYWD_HXX
#include <xmloff/xmlkywd.hxx>
#endif
#ifndef _XMLOFF_TXTSTYLI_HXX
#include <xmloff/txtstyli.hxx>
#endif
#ifndef _XMLOFF_TXTIMP_HXX
#include <xmloff/txtimp.hxx>
#endif
#ifndef _XMLOFF_FAMILIES_HXX
#include <xmloff/families.hxx>
#endif

#ifndef _NUMRULE_HXX
#include <numrule.hxx>
#endif
#ifndef _XMLIMP_HXX
#include "xmlimp.hxx"
#endif
#ifndef _XMLNUM_HXX
#include "xmlnum.hxx"
#endif
#ifndef _XMLTBLI_HXX
#include "xmltbli.hxx"
#endif

using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::style;
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::container;
using namespace ::rtl;

class SwXMLConditionParser_Impl
{
    OUString sInput;

    sal_uInt32 nCondition;
    sal_uInt32 nSubCondition;

    sal_Int32 nPos;
    sal_Int32 nLength;

    inline sal_Bool SkipWS();
    inline sal_Bool MatchChar( sal_Unicode c );
    inline sal_Bool MatchName( OUString& rName );
    inline sal_Bool MatchNumber( sal_uInt32& rNumber );

public:

    SwXMLConditionParser_Impl( const OUString& rInp );

    sal_Bool IsValid() const { return 0 != nCondition; }

    sal_uInt32 GetCondition() const { return nCondition; }
    sal_uInt32 GetSubCondition() const { return nSubCondition; }
};

inline sal_Bool SwXMLConditionParser_Impl::SkipWS()
{
    while( nPos < nLength && ' ' == sInput[nPos] )
        nPos++;
    return sal_True;
}

inline sal_Bool SwXMLConditionParser_Impl::MatchChar( sal_Unicode c )
{
    sal_Bool bRet = sal_False;
    if( nPos < nLength && c == sInput[nPos] )
    {
        nPos++;
        bRet = sal_True;
    }
    return bRet;
}

inline sal_Bool SwXMLConditionParser_Impl::MatchName( OUString& rName )
{
    OUStringBuffer sBuffer( nLength );
    while( nPos < nLength &&
           ( ('a' <= sInput[nPos] && sInput[nPos] <= 'z') ||
              '-' == sInput[nPos] ) )
    {
        sBuffer.append( sInput[nPos] );
        nPos++;
    }
    rName = sBuffer.makeStringAndClear();
    return rName.getLength() > 0;
}

inline sal_Bool SwXMLConditionParser_Impl::MatchNumber( sal_uInt32& rNumber )
{
    OUStringBuffer sBuffer( nLength );
    while( nPos < nLength && '0' <= sInput[nPos] && sInput[nPos] <= '9' )
    {
        sBuffer.append( sInput[nPos] );
        nPos++;
    }

    OUString sNum( sBuffer.makeStringAndClear() );
    if( sNum.getLength() )
        rNumber = sNum.toInt32();
    return sNum.getLength() > 0;
}

SwXMLConditionParser_Impl::SwXMLConditionParser_Impl( const OUString& rInp ) :
    sInput( rInp ),
    nPos( 0 ),
    nLength( rInp.getLength() ),
    nCondition( 0 ),
    nSubCondition( 0 )
{
    OUString sFunc;
    sal_Bool bHasSub = sal_False;
    sal_uInt32 nSub = 0;
    sal_Bool bOK = SkipWS() && MatchName( sFunc ) && SkipWS() &&
               MatchChar( '(' ) && SkipWS() && MatchChar( ')' ) && SkipWS();
    if( bOK && MatchChar( '=' ) )
    {
        bOK = SkipWS() && MatchNumber( nSub ) && SkipWS();
        bHasSub = sal_True;
    }

    bOK &= nPos == nLength;

    if( bOK )
    {
        switch( sFunc[0] )
        {
        case 'e':
            if( sFunc.compareToAscii( sXML_endnote ) == 0 && !bHasSub )
                nCondition = PARA_IN_ENDNOTE;
            break;

        case 'f':
            if( sFunc.compareToAscii( sXML_footer ) == 0 && !bHasSub )
                nCondition = PARA_IN_FOOTER;
            else if( sFunc.compareToAscii( sXML_table_header ) == 0 &&
                     !bHasSub )
                nCondition = PARA_IN_FOOTENOTE;
            break;

        case 'h':
            if( sFunc.compareToAscii( sXML_header ) == 0 && !bHasSub )
                nCondition = PARA_IN_HEADER;
            break;

        case 'l':
            if( sFunc.compareToAscii( sXML_list_level ) == 0 &&
                nSub >=1 && nSub < MAXLEVEL )
            {
                nCondition = PARA_IN_LIST;
                nSubCondition = nSub-1;
            }
            break;

        case 'o':
            if( sFunc.compareToAscii( sXML_outline_level ) == 0 &&
                nSub >=1 && nSub < MAXLEVEL )
            {
                nCondition = PARA_IN_OUTLINE;
                nSubCondition = nSub-1;
            }
            break;

        case 's':
            if( sFunc.compareToAscii( sXML_section ) == 0 && !bHasSub )
            {
                nCondition = PARA_IN_SECTION;
            }
            break;

        case 't':
            if( sFunc.compareToAscii( sXML_table ) == 0 && !bHasSub )
            {
                nCondition = PARA_IN_TABLEBODY;
            }
            else if( sFunc.compareToAscii( sXML_table_header ) == 0 &&
                     !bHasSub )
            {
                nCondition = PARA_IN_TABLEHEAD;
            }
            else if( sFunc.compareToAscii( sXML_text_box ) == 0 && !bHasSub )
            {
                nCondition = PARA_IN_FRAME;
            }
            break;
        }
    }
}

// ---------------------------------------------------------------------

class SwXMLConditionContext_Impl : public SvXMLImportContext
{
    sal_uInt32 nCondition;
    sal_uInt32 nSubCondition;

    OUString sApplyStyle;

    void ParseCondition( const OUString& rCond );

public:

    SwXMLConditionContext_Impl(
            SvXMLImport& rImport, sal_uInt16 nPrfx,
            const OUString& rLName,
            const Reference< xml::sax::XAttributeList > & xAttrList );
    virtual ~SwXMLConditionContext_Impl();

    sal_Bool IsValid() const { return 0 != nCondition; }

    sal_uInt32 GetCondition() const { return nCondition; }
    sal_uInt32 GetSubCondition() const { return nSubCondition; }
    const OUString& GetApplyStyle() const { return sApplyStyle; }
};

SwXMLConditionContext_Impl::SwXMLConditionContext_Impl(
            SvXMLImport& rImport, sal_uInt16 nPrfx,
            const OUString& rLName,
            const Reference< xml::sax::XAttributeList > & xAttrList ) :
    SvXMLImportContext( rImport, nPrfx, rLName ),
    nCondition( 0 ),
    nSubCondition( 0 )
{
    sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
    for( sal_Int16 i=0; i < nAttrCount; i++ )
    {
        const OUString& rAttrName = xAttrList->getNameByIndex( i );
        OUString aLocalName;
        sal_uInt16 nPrefix =
            GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
                                                            &aLocalName );
        const OUString& rValue = xAttrList->getValueByIndex( i );

        // TODO: use a map here
        if( XML_NAMESPACE_STYLE == nPrefix )
        {
            if( aLocalName.compareToAscii( sXML_condition ) == 0 )
            {
                SwXMLConditionParser_Impl aCondParser( rValue );
                if( aCondParser.IsValid() )
                {
                    nCondition = aCondParser.GetCondition();
                    nSubCondition = aCondParser.GetSubCondition();
                }
            }
            else if( aLocalName.compareToAscii( sXML_apply_style_name ) == 0 )
            {
                sApplyStyle = rValue;
            }
        }
    }
}

SwXMLConditionContext_Impl::~SwXMLConditionContext_Impl()
{
}

// ---------------------------------------------------------------------

typedef SwXMLConditionContext_Impl *SwXMLConditionContextPtr;
SV_DECL_PTRARR( SwXMLConditions_Impl, SwXMLConditionContextPtr, 5, 2 );

#ifndef XML_CORE_API

class SwXMLTextStyleContext_Impl : public XMLTextStyleContext
{
    SwXMLConditions_Impl    *pConditions;

protected:

    virtual Reference < XStyle > Create();

public:

    TYPEINFO();

    SwXMLTextStyleContext_Impl( SwXMLImport& rImport, sal_uInt16 nPrfx,
            const OUString& rLName,
            const Reference< xml::sax::XAttributeList > & xAttrList,
            sal_uInt16 nFamily,
            SvXMLStylesContext& rStyles );
    virtual ~SwXMLTextStyleContext_Impl();

    virtual SvXMLImportContext *CreateChildContext(
            sal_uInt16 nPrefix,
            const OUString& rLocalName,
            const Reference< xml::sax::XAttributeList > & xAttrList );

    virtual void Finish( sal_Bool bOverwrite );
};

TYPEINIT1( SwXMLTextStyleContext_Impl, XMLTextStyleContext );

Reference < XStyle > SwXMLTextStyleContext_Impl::Create()
{
    Reference < XStyle > xNewStyle;

    if( pConditions && XML_STYLE_FAMILY_TEXT_PARAGRAPH == GetFamily() )
    {
        Reference< XMultiServiceFactory > xFactory( GetImport().GetModel(),
                                                    UNO_QUERY );
        if( xFactory.is() )
        {
            OUString sServiceName( RTL_CONSTASCII_USTRINGPARAM(
                        "com.sun.star.style.ConditionalParagraphStyle" ) );
            Reference < XInterface > xIfc =
                xFactory->createInstance( sServiceName );
            if( xIfc.is() )
                xNewStyle = Reference < XStyle >( xIfc, UNO_QUERY );
        }
    }
    else
    {
        xNewStyle = XMLTextStyleContext::Create();
    }

    return xNewStyle;
}

SwXMLTextStyleContext_Impl::SwXMLTextStyleContext_Impl( SwXMLImport& rImport,
        sal_uInt16 nPrfx, const OUString& rLName,
        const Reference< xml::sax::XAttributeList > & xAttrList,
        sal_uInt16 nFamily,
        SvXMLStylesContext& rStyles ) :
    XMLTextStyleContext( rImport, nPrfx, rLName, xAttrList, rStyles ),
    pConditions( 0 )
{
    SetFamily( nFamily );
}

SwXMLTextStyleContext_Impl::~SwXMLTextStyleContext_Impl()
{
    if( pConditions )
    {
        while( pConditions->Count() )
        {
            SwXMLConditionContext_Impl *pCond = pConditions->GetObject(0);
            pConditions->Remove( 0UL );
            pCond->ReleaseRef();
        }
        delete pConditions;
    }
}

SvXMLImportContext *SwXMLTextStyleContext_Impl::CreateChildContext(
        sal_uInt16 nPrefix,
        const OUString& rLocalName,
        const Reference< xml::sax::XAttributeList > & xAttrList )
{
    SvXMLImportContext *pContext = 0;

    if( XML_NAMESPACE_STYLE == nPrefix &&
        rLocalName.compareToAscii( sXML_map ) == 0 )
    {
        SwXMLConditionContext_Impl *pCond =
            new SwXMLConditionContext_Impl( GetImport(), nPrefix,
                                            rLocalName, xAttrList );
        if( pCond->IsValid() )
        {
            if( !pConditions )
               pConditions = new SwXMLConditions_Impl;
            pConditions->Insert( pCond, pConditions->Count() );
            pCond->AddRef();
        }
        pContext = pCond;
    }

    if( !pContext )
        pContext = XMLTextStyleContext::CreateChildContext( nPrefix, rLocalName,
                                                          xAttrList );

    return pContext;
}

void SwXMLTextStyleContext_Impl::Finish( sal_Bool bOverwrite )
{
    XMLTextStyleContext::Finish( bOverwrite );

    if( !pConditions || XML_STYLE_FAMILY_TEXT_PARAGRAPH != GetFamily() )
        return;

    Reference < XStyle > xStyle = GetStyle();
    if( !xStyle.is() )
        return;

    const SwXStyle* pStyle = 0;
    Reference<XUnoTunnel> xStyleTunnel( xStyle, UNO_QUERY);
    if( xStyleTunnel.is() )
    {
        pStyle = (SwXStyle*)xStyleTunnel->getSomething(
                                            SwXStyle::getUnoTunnelId() );
    }
    if( !pStyle )
        return;

    SwDoc& rDoc = ((SwXMLImport&)GetImport()).GetDoc();

    const OUString& rName =
                SwXStyleFamilies::GetUIName( GetName(), SFX_STYLE_FAMILY_PARA );
    SwTxtFmtColl *pColl = rDoc.FindTxtFmtCollByName( rName );
    ASSERT( pColl, "Text collection not found" );
    if( !pColl || RES_CONDTXTFMTCOLL != pColl->Which() )
        return;

    sal_uInt16 nCount = pConditions->Count();
    for( sal_uInt16 i = 0; i < nCount; i++ )
    {
        const SwXMLConditionContext_Impl *pCond = (*pConditions)[i];
        const OUString& rName =
                SwXStyleFamilies::GetUIName( pCond->GetApplyStyle(),
                                             SFX_STYLE_FAMILY_PARA  );
        SwTxtFmtColl* pCondColl = rDoc.FindTxtFmtCollByName( rName );
        ASSERT( pCondColl,
            "SwXMLItemSetStyleContext_Impl::ConnectConditions: cond coll missing" );
        if( pCondColl )
        {
            SwCollCondition aCond( pCondColl, pCond->GetCondition(),
                                              pCond->GetSubCondition() );
            ((SwConditionTxtFmtColl*)pColl)->InsertCondition( aCond );
        }
    }
}
#endif

// ---------------------------------------------------------------------

class SwXMLItemSetStyleContext_Impl : public SvXMLStyleContext
{
#ifdef XML_CORE_API
    OUString                sListStyleName;
    SwFmt                   *pFmt;
#endif
    SfxItemSet              *pItemSet;

#ifdef XML_CORE_API
    SwXMLConditions_Impl    *pConditions;

    sal_uInt16  nPoolId;                    // PoolId
    sal_Bool    bAutoUpdate;
#endif

    SvXMLImportContext *CreateItemSetContext(
            sal_uInt16 nPrefix,
            const OUString& rLName,
            const Reference< xml::sax::XAttributeList > & xAttrList);

protected:

#ifdef XML_CORE_API
    virtual void SetAttribute( sal_uInt16 nPrefixKey,
                               const OUString& rLocalName,
                               const OUString& rValue );
#endif

    const SwXMLImport& GetSwImport() const
            { return (const SwXMLImport&)GetImport(); }
    SwXMLImport& GetSwImport() { return (SwXMLImport&)GetImport(); }

public:

    TYPEINFO();

    SwXMLItemSetStyleContext_Impl(
            SwXMLImport& rImport, sal_uInt16 nPrfx,
            const OUString& rLName,
            const Reference< xml::sax::XAttributeList > & xAttrList
#ifndef XML_CORE_API
            ,sal_uInt16 nFamily
#endif
                                 );
    virtual ~SwXMLItemSetStyleContext_Impl();

    virtual SvXMLImportContext *CreateChildContext(
            sal_uInt16 nPrefix,
            const OUString& rLocalName,
            const Reference< xml::sax::XAttributeList > & xAttrList );

#ifdef XML_CORE_API
    sal_uInt16 GetPoolId() const { return nPoolId; }
    sal_Bool IsAutoUpdate() const { return bAutoUpdate; }
#endif

    // The item set may be empty!
    SfxItemSet *GetItemSet() { return pItemSet; }
    const SfxItemSet *GetItemSet() const { return pItemSet; }

#ifdef XML_CORE_API
    SwFmt *GetFmt() { return pFmt; }
    void SetFmt( SwFmt *p ) { pFmt = p; }

    SwTxtFmtColl* GetColl();

    sal_Bool HasConditions() const { return 0 != pConditions &&
                                 pConditions->Count() > 0; }
    const OUString& GetListStyle() const { return sListStyleName; }

    void ConnectParent();
    void ConnectFollow();
    void ConnectConditions();
    void ConnectListStyle();
    void ConnectAutoListStyle();
#endif
};

#ifdef XML_CORE_API
void SwXMLItemSetStyleContext_Impl::SetAttribute( sal_uInt16 nPrefixKey,
                                           const OUString& rLocalName,
                                           const OUString& rValue )
{
    // TODO: use a map here
    if( XML_NAMESPACE_STYLE == nPrefixKey )
    {
        if( rLocalName.compareToAscii( sXML_family ) == 0 )
        {
            SfxStyleFamily eFamily = SFX_STYLE_FAMILY_ALL;
            sal_uInt16 nSubFamily = 0U;
            if( rValue.compareToAscii( sXML_paragraph ) == 0 )
            {
                eFamily = SFX_STYLE_FAMILY_PARA;
            }
            else if( rValue.compareToAscii( sXML_text ) == 0 )
            {
                eFamily = SFX_STYLE_FAMILY_CHAR;
            }
            else if( 0 == rValue.compareToAscii( sXML_table, 5L ) )
            {
                eFamily = SFX_STYLE_FAMILY_FRAME;
                if( 5L == rValue.getLength() )
                    nSubFamily = SW_STYLE_SUBFAMILY_TABLE;
                else if( rValue.compareToAscii( sXML_table_column ) == 0 )
                    nSubFamily = SW_STYLE_SUBFAMILY_TABLE_COL;
                else if( rValue.compareToAscii( sXML_table_row ) == 0 )
                    nSubFamily = SW_STYLE_SUBFAMILY_TABLE_LINE;
                else if( rValue.compareToAscii( sXML_table_cell ) == 0 )
                    nSubFamily = SW_STYLE_SUBFAMILY_TABLE_BOX;
                else
                    eFamily = SFX_STYLE_FAMILY_ALL;
            }

            if( SFX_STYLE_FAMILY_ALL != eFamily )
            {
                SetFamily( eFamily );
                SetSubFamily( nSubFamily );
            }
        }
        else if( rLocalName.compareToAscii( sXML_pool_id ) == 0 )
        {
            sal_Int32 nTmp = rValue.toInt32();
            nPoolId =
                (nTmp < 0L) ? 0U : ( (nTmp > USHRT_MAX) ? USHRT_MAX
                                                        : (sal_uInt16)nTmp );
        }
        else if( rLocalName.compareToAscii( sXML_auto_update ) == 0 )
        {
            if( rValue.compareToAscii( sXML_true ) == 0 )
                bAutoUpdate = sal_True;
        }
        else if( rLocalName.compareToAscii( sXML_list_style_name ) == 0 )
        {
            sListStyleName = rValue;
        }
        else
        {
            SvXMLStyleContext::SetAttribute( nPrefixKey, rLocalName, rValue );
        }
    }
    else
    {
        SvXMLStyleContext::SetAttribute( nPrefixKey, rLocalName, rValue );
    }
}
#endif

SvXMLImportContext *SwXMLItemSetStyleContext_Impl::CreateItemSetContext(
        sal_uInt16 nPrefix, const OUString& rLName,
        const Reference< xml::sax::XAttributeList > & xAttrList )
{
    ASSERT( !pItemSet,
            "SwXMLItemSetStyleContext_Impl::CreateItemSetContext: item set exists" );

    SvXMLImportContext *pContext = 0;
    SfxItemPool& rItemPool = GetSwImport().GetDoc().GetAttrPool();

#ifdef XML_CORE_API
    switch( GetFamily() )
    {
    case SFX_STYLE_FAMILY_PARA:
        pItemSet = new SfxItemSet( rItemPool, aTxtFmtCollSetRange );
        pContext = GetSwImport().CreateParaItemImportContext(
                                nPrefix, rLName, xAttrList, *pItemSet );
        break;

    case SFX_STYLE_FAMILY_CHAR:
        pItemSet = new SfxItemSet( rItemPool, aCharFmtSetRange );
        pContext = GetSwImport().CreateParaItemImportContext(
                                nPrefix, rLName, xAttrList, *pItemSet );
        break;

    case SFX_STYLE_FAMILY_FRAME:
        {
            switch( GetSubFamily() )
            {
            case SW_STYLE_SUBFAMILY_TABLE:
                pItemSet = new SfxItemSet( rItemPool, aTableSetRange );
                break;
            case SW_STYLE_SUBFAMILY_TABLE_COL:
                pItemSet = new SfxItemSet( rItemPool, RES_FRM_SIZE,
                                           RES_FRM_SIZE, 0 );
                break;
            case SW_STYLE_SUBFAMILY_TABLE_LINE:
                pItemSet = new SfxItemSet( rItemPool, aTableLineSetRange );
                break;
            case SW_STYLE_SUBFAMILY_TABLE_BOX:
                pItemSet = new SfxItemSet( rItemPool, aTableBoxSetRange );
                break;
            }
            if( pItemSet )
                pContext = GetSwImport().CreateTableItemImportContext(
                                    nPrefix, rLName, xAttrList, GetSubFamily(),
                                    *pItemSet );
            ASSERT( pItemSet,
        "SwXMLItemSetStyleContext_Impl::CreateItemSetContext: frames are unsopprted");
        }
        break;

    default:
        ASSERT( !this,
        "SwXMLItemSetStyleContext_Impl::CreateItemSetContext: unknown family" );
        break;
    }
#else
    switch( GetFamily() )
    {
    case XML_STYLE_FAMILY_TABLE_TABLE:
        pItemSet = new SfxItemSet( rItemPool, aTableSetRange );
        break;
    case XML_STYLE_FAMILY_TABLE_COLUMN:
        pItemSet = new SfxItemSet( rItemPool, RES_FRM_SIZE, RES_FRM_SIZE, 0 );
        break;
    case XML_STYLE_FAMILY_TABLE_ROW:
        pItemSet = new SfxItemSet( rItemPool, aTableLineSetRange );
        break;
    case XML_STYLE_FAMILY_TABLE_CELL:
        pItemSet = new SfxItemSet( rItemPool, aTableBoxSetRange );
        break;
    default:
        ASSERT( !this,
        "SwXMLItemSetStyleContext_Impl::CreateItemSetContext: unknown family" );
        break;
    }
    if( pItemSet )
        pContext = GetSwImport().CreateTableItemImportContext(
                                nPrefix, rLName, xAttrList, GetFamily(),
                                *pItemSet );
#endif

    if( !pContext )
    {
        delete pItemSet;
        pItemSet = 0;
    }

    return pContext;
}

TYPEINIT1( SwXMLItemSetStyleContext_Impl, SvXMLStyleContext );

SwXMLItemSetStyleContext_Impl::SwXMLItemSetStyleContext_Impl( SwXMLImport& rImport,
        sal_uInt16 nPrfx, const OUString& rLName,
        const Reference< xml::sax::XAttributeList > & xAttrList
#ifndef XML_CORE_API
        ,sal_uInt16 nFamily
#endif
        ) :
    SvXMLStyleContext( rImport, nPrfx, rLName, xAttrList ),
#ifdef XML_CORE_API
    nPoolId( USHRT_MAX ),
    bAutoUpdate( sal_False ),
    pFmt( 0 ),
    pConditions( 0 ),
#endif
    pItemSet( 0 )
{
#ifndef XML_CORE_API
    SetFamily( nFamily );
#endif
}

SwXMLItemSetStyleContext_Impl::~SwXMLItemSetStyleContext_Impl()
{
    delete pItemSet;
#ifdef XML_CORE_API
    if( pConditions )
    {
        while( pConditions->Count() )
        {
            SwXMLConditionContext_Impl *pCond = pConditions->GetObject(0);
            pConditions->Remove( 0UL );
            pCond->ReleaseRef();
        }
        delete pConditions;
    }
#endif
}

SvXMLImportContext *SwXMLItemSetStyleContext_Impl::CreateChildContext(
        sal_uInt16 nPrefix,
        const OUString& rLocalName,
        const Reference< xml::sax::XAttributeList > & xAttrList )
{
    SvXMLImportContext *pContext = 0;

    if( XML_NAMESPACE_STYLE == nPrefix )
    {
        if( rLocalName.compareToAscii( sXML_properties ) == 0 )
        {
            pContext = CreateItemSetContext( nPrefix, rLocalName, xAttrList );
        }
#ifdef XML_CORE_API
        else if( rLocalName.compareToAscii( sXML_map ) == 0 )
        {
            SwXMLConditionContext_Impl *pCond =
                new SwXMLConditionContext_Impl( GetSwImport(), nPrefix,
                                                   rLocalName, xAttrList );
            if( pCond->IsValid() )
            {
                if( !pConditions )
                   pConditions = new SwXMLConditions_Impl;
                pConditions->Insert( pCond, pConditions->Count() );
                pCond->AddRef();
            }
            pContext = pCond;
        }
#endif
    }

    if( !pContext )
        pContext = SvXMLStyleContext::CreateChildContext( nPrefix, rLocalName,
                                                          xAttrList );

    return pContext;
}

#ifdef XML_CORE_API
SwTxtFmtColl* SwXMLItemSetStyleContext_Impl::GetColl()
{
    return (GetFamily() & SFX_STYLE_FAMILY_PARA) != 0
            ? (SwTxtFmtColl*) pFmt
            : NULL;
}

void SwXMLItemSetStyleContext_Impl::ConnectParent()
{
    if( !pFmt )
        return;

    SwDoc *pDoc = pFmt->GetDoc();
    String aName( GetSwImport().GetI18NMap().Get( GetFamily(), GetParent() ) );

//  String aName( SwXStyleFamilies::GetUIName( GetParent(),
//                                             (SfxStyleFamily)GetFamily() ) );
    SwFmt* pParent;
    switch( GetFamily() )
    {
    case SFX_STYLE_FAMILY_PARA:
        if( aName.Len() )
            pParent = pDoc->FindTxtFmtCollByName( aName );
        else
            pParent = (*pDoc->GetTxtFmtColls())[ 0 ];
        break;

    case SFX_STYLE_FAMILY_FRAME:
        if( aName.Len() )
            pParent = pDoc->FindFrmFmtByName( aName );
        else
            pParent = (*pDoc->GetFrmFmts())[ 0 ];
        break;

    case SFX_STYLE_FAMILY_CHAR:
        if( aName.Len() )
            pParent = pDoc->FindCharFmtByName( aName );
        else
            pParent = (*pDoc->GetCharFmts())[ 0 ];
        break;
    }

    if( pParent )
        pFmt->SetDerivedFrom( pParent );
}

void SwXMLItemSetStyleContext_Impl::ConnectFollow()
{
    if( !pFmt || GetFamily() != SFX_STYLE_FAMILY_PARA )
        return;

    SwDoc *pDoc = pFmt->GetDoc();
    String aName( GetSwImport().GetI18NMap().Get( GetFamily(), GetFollow() ) );
//  String aName( SwXStyleFamilies::GetUIName( GetFollow(), (SfxStyleFamily)GetFamily() ) );

    SwTxtFmtColl* pFollow;
    if( aName.Len() )
        pFollow = pDoc->FindTxtFmtCollByName( aName );
    else
        pFollow = GetColl();
    if( pFollow )
        GetColl()->SetNextTxtFmtColl( *pFollow );
}

void SwXMLItemSetStyleContext_Impl::ConnectConditions()
{
    if( !pFmt || GetFamily() != SFX_STYLE_FAMILY_PARA || !pConditions ||
         RES_CONDTXTFMTCOLL != pFmt->Which() )
        return;

    SwDoc *pDoc = pFmt->GetDoc();
    SvI18NMap& rI18NMap = ((SwXMLImport&)GetImport()).GetI18NMap();

    sal_uInt16 nCount = pConditions->Count();
    for( sal_uInt16 i = 0; i < nCount; i++ )
    {
        const SwXMLConditionContext_Impl *pCond = (*pConditions)[i];
        OUString sName( rI18NMap.Get( SFX_STYLE_FAMILY_PARA,
                                         pCond->GetApplyStyle() ) );
//      OUString sName( SwXStyleFamilies::GetUIName(
//                  pCond->GetApplyStyle(), SFX_STYLE_FAMILY_PARA ) );
        SwTxtFmtColl* pCondColl = pDoc->FindTxtFmtCollByName( sName );
        ASSERT( pCondColl,
            "SwXMLItemSetStyleContext_Impl::ConnectConditions: cond coll missing" );
        if( pCondColl )
        {
            SwCollCondition aCond( pCondColl, pCond->GetCondition(),
                                              pCond->GetSubCondition() );
            ((SwConditionTxtFmtColl*)pFmt)->InsertCondition( aCond );
        }
    }
}

void SwXMLItemSetStyleContext_Impl::ConnectListStyle()
{
    if( !pFmt || GetFamily() != SFX_STYLE_FAMILY_PARA ||
        !GetListStyle().getLength() )
        return;

    SwDoc *pDoc = pFmt->GetDoc();
    String aName( GetSwImport().GetI18NMap().Get( SFX_STYLE_FAMILY_PSEUDO,
                                                  GetListStyle() ) );
//  String aName( SwXStyleFamilies::GetUIName(
//                  GetListStyle(), SFX_STYLE_FAMILY_PSEUDO ) );
    // Styles must not reference automatic num rules
    SwNumRule *pNumRule = pDoc->FindNumRulePtr( aName );
    if( pNumRule && !pNumRule->IsAutoRule() )
        GetColl()->SetAttr( SwNumRuleItem(aName) );
}

void SwXMLItemSetStyleContext_Impl::ConnectAutoListStyle()
{
    if( GetFamily() != SFX_STYLE_FAMILY_PARA || !GetListStyle().getLength() )
        return;

    SwDoc& rDoc = GetSwImport().GetDoc();
    String aName( GetSwImport().GetI18NMap().Get( SFX_STYLE_FAMILY_PSEUDO,
                                                  GetListStyle() ) );
//  String aName( SwXStyleFamilies::GetUIName(
//                  GetListStyle(), SFX_STYLE_FAMILY_PSEUDO ) );
    if( rDoc.FindNumRulePtr( aName ) )
    {
        if( !pItemSet )
        {
            SfxItemPool& rItemPool = rDoc.GetAttrPool();
            pItemSet = new SfxItemSet( rItemPool, aTxtFmtCollSetRange );
        }
        pItemSet->Put( SwNumRuleItem(aName) );
    }
}
#endif

// ---------------------------------------------------------------------

#ifdef XML_CORE_API
enum SwXMLStyleStylesElemTokens
{
    SW_XML_TOK_STYLE_STYLE,
    SW_XML_TOK_TEXT_LIST_STYLE,
    SW_XML_TOK_TEXT_OUTLINE,
    SW_XML_TOK_STYLE_STYLES_ELEM_END=XML_TOK_UNKNOWN
};

static __FAR_DATA SvXMLTokenMapEntry aStyleStylesElemTokenMap[] =
{
    { XML_NAMESPACE_STYLE,  sXML_style,         SW_XML_TOK_STYLE_STYLE },
    { XML_NAMESPACE_TEXT,   sXML_list_style,    SW_XML_TOK_TEXT_LIST_STYLE},
    { XML_NAMESPACE_TEXT,   sXML_outline_style, SW_XML_TOK_TEXT_OUTLINE },
    XML_TOKEN_MAP_END
};

const SvXMLTokenMap& SwXMLImport::GetStyleStylesElemTokenMap()
{
    if( !pStyleStylesElemTokenMap )
        pStyleStylesElemTokenMap =
            new SvXMLTokenMap( aStyleStylesElemTokenMap );

    return *pStyleStylesElemTokenMap;
}
#endif

// ---------------------------------------------------------------------
//
class SwXMLStylesContext_Impl : public SvXMLStylesContext
{
    SwXMLItemSetStyleContext_Impl *GetSwStyle( sal_uInt16 i ) const;
#ifdef XML_CORE_API
    SwXMLListStyleContext *GetSwListStyle( sal_uInt16 i ) const;

    SwFmt *FindFmtByName( const String& rName,
                          sal_uInt16 eFamily ) const;
    SwXMLItemSetStyleContext_Impl *FindByPoolId( sal_uInt16 nPoolId ) const;
#endif

    SwXMLImport& GetSwImport() { return (SwXMLImport&)GetImport(); }
    const SwXMLImport& GetSwImport() const
            { return (const SwXMLImport&)GetImport(); }

protected:

#ifdef XML_CORE_API
    // Create a style context.
    virtual SvXMLStyleContext *CreateStyleChildContext(
            sal_uInt16 nPrefix,
            const OUString& rLocalName,
            const Reference< xml::sax::XAttributeList > & xAttrList );
#else
    virtual SvXMLStyleContext *CreateStyleStyleChildContext( sal_uInt16 nFamily,
        sal_uInt16 nPrefix, const OUString& rLocalName,
        const Reference< xml::sax::XAttributeList > & xAttrList );
    // HACK
    virtual UniReference < SvXMLImportPropertyMapper > GetImportPropertyMapper(
                        sal_uInt16 nFamily ) const;

    virtual ::com::sun::star::uno::Reference <
                    ::com::sun::star::container::XNameContainer >
        GetStylesContainer( sal_uInt16 nFamily ) const;
    virtual ::rtl::OUString GetServiceName( sal_uInt16 nFamily ) const;
    // HACK
#endif

public:

    TYPEINFO();

    SwXMLStylesContext_Impl(
            SwXMLImport& rImport, sal_uInt16 nPrfx,
            const OUString& rLName ,
            const Reference< xml::sax::XAttributeList > & xAttrList );
    virtual ~SwXMLStylesContext_Impl();

    virtual sal_Bool InsertStyleFamily( sal_uInt16 nFamily ) const;
#ifdef XML_CORE_API
    void CopyStylesToDoc();
    void CopyAutoStylesToDoc();
#endif
};

TYPEINIT1( SwXMLStylesContext_Impl, SvXMLStylesContext );

inline SwXMLItemSetStyleContext_Impl *SwXMLStylesContext_Impl::GetSwStyle(
        sal_uInt16 i ) const
{
    return PTR_CAST( SwXMLItemSetStyleContext_Impl, GetStyle( i ) );
}

#ifdef XML_CORE_API
inline SwXMLListStyleContext *SwXMLStylesContext_Impl::GetSwListStyle(
        sal_uInt16 i ) const
{
    return PTR_CAST( SwXMLListStyleContext, GetStyle( i ) );
}

sal_Bool lcl_xmlfmt_isValidPoolId( sal_uInt16 nPoolId, sal_uInt16 eFamily )
{
    sal_Bool bValid = sal_False;

    // check if pool id is valid
    if( eFamily & SFX_STYLE_FAMILY_CHAR )
    {
        bValid = (RES_POOLCHR_NORMAL_BEGIN <= nPoolId &&
                                        nPoolId < RES_POOLCHR_NORMAL_END) ||
                 (RES_POOLCHR_HTML_BEGIN <= nPoolId &&
                                        nPoolId < RES_POOLCHR_HTML_END);
    }
    else if( eFamily & SFX_STYLE_FAMILY_FRAME )
    {
        bValid = RES_POOLFRM_BEGIN <= nPoolId && nPoolId < RES_POOLFRM_END;
    }
    else if( eFamily & SFX_STYLE_FAMILY_PARA )
    {
        bValid = (RES_POOLCOLL_TEXT_BEGIN <= nPoolId &&
                                    nPoolId < RES_POOLCOLL_TEXT_END) ||
                 (RES_POOLCOLL_LISTS_BEGIN <= nPoolId &&
                                    nPoolId < RES_POOLCOLL_LISTS_END) ||
                 (RES_POOLCOLL_EXTRA_BEGIN <= nPoolId &&
                                    nPoolId < RES_POOLCOLL_EXTRA_END) ||
                 (RES_POOLCOLL_REGISTER_BEGIN <= nPoolId &&
                                    nPoolId < RES_POOLCOLL_REGISTER_END) ||
                 (RES_POOLCOLL_DOC_BEGIN <= nPoolId &&
                                    nPoolId < RES_POOLCOLL_DOC_END) ||
                 (RES_POOLCOLL_HTML_BEGIN <= nPoolId &&
                                    nPoolId < RES_POOLCOLL_HTML_END);
    }

    return bValid;
}

SwFmt *SwXMLStylesContext_Impl::FindFmtByName( const String& rName,
                                               sal_uInt16 eFamily ) const
{
    const SwDoc& rDoc = GetSwImport().GetDoc();
    SwFmt *pFmt = 0;
    switch( eFamily )
    {
    case SFX_STYLE_FAMILY_PARA:
        pFmt = rDoc.FindTxtFmtCollByName( rName );
        break;
    case SFX_STYLE_FAMILY_FRAME:
        pFmt = rDoc.FindFrmFmtByName( rName );
        break;
    case SFX_STYLE_FAMILY_CHAR:
        pFmt = rDoc.FindCharFmtByName( rName );
        break;
    }

    return pFmt;
}

SwXMLItemSetStyleContext_Impl *SwXMLStylesContext_Impl::FindByPoolId(
        sal_uInt16 nPoolId ) const
{
    SwXMLItemSetStyleContext_Impl *pStyle = 0;
    sal_uInt16 nCount = GetStyleCount();
    for( sal_uInt16 i=0; i < nCount && !pStyle; i++ )
    {
        SwXMLItemSetStyleContext_Impl *pTmp = GetSwStyle( i );
        if( pTmp && pTmp->GetPoolId() == nPoolId )
            pStyle = pTmp;
    }

    return pStyle;
}

SvXMLStyleContext *SwXMLStylesContext_Impl::CreateStyleChildContext(
        sal_uInt16 nPrefix, const OUString& rLocalName,
        const Reference< xml::sax::XAttributeList > & xAttrList )
{
    SvXMLStyleContext *pStyle = 0;

    const SvXMLTokenMap& rTokenMap = GetSwImport().GetStyleStylesElemTokenMap();
    switch( rTokenMap.Get( nPrefix, rLocalName ) )
    {
    case SW_XML_TOK_STYLE_STYLE:
        pStyle = new SwXMLItemSetStyleContext_Impl( GetSwImport(), nPrefix, rLocalName,
                                                xAttrList);
        break;
    case SW_XML_TOK_TEXT_LIST_STYLE:
        pStyle = new SwXMLListStyleContext( GetSwImport(), nPrefix,
                                            rLocalName, xAttrList );
        break;
    case SW_XML_TOK_TEXT_OUTLINE:
        pStyle = new SwXMLListStyleContext( GetSwImport(), nPrefix,
                                            rLocalName, xAttrList, sal_True );
        break;
    default:
        pStyle = SvXMLStylesContext::CreateStyleChildContext( nPrefix,
                                                              rLocalName,
                                                              xAttrList );
        break;
    }

    return pStyle;
}
#else
SvXMLStyleContext *SwXMLStylesContext_Impl::CreateStyleStyleChildContext(
        sal_uInt16 nFamily, sal_uInt16 nPrefix, const OUString& rLocalName,
        const Reference< xml::sax::XAttributeList > & xAttrList )
{
    SvXMLStyleContext *pStyle = 0;

    switch( nFamily )
    {
    case XML_STYLE_FAMILY_TEXT_PARAGRAPH:
        pStyle = new SwXMLTextStyleContext_Impl( GetSwImport(), nPrefix,
                            rLocalName, xAttrList, nFamily, *this );
        break;
    case XML_STYLE_FAMILY_TABLE_TABLE:
    case XML_STYLE_FAMILY_TABLE_COLUMN:
    case XML_STYLE_FAMILY_TABLE_ROW:
    case XML_STYLE_FAMILY_TABLE_CELL:
        pStyle = new SwXMLItemSetStyleContext_Impl( GetSwImport(), nPrefix,
                            rLocalName, xAttrList, nFamily  );
        break;
    case XML_STYLE_FAMILY_SD_GRAPHICS_ID:
        // HACK until CL is back again
        pStyle = new XMLTextStyleContext( GetImport(), nPrefix,
                            rLocalName, xAttrList, *this );
        break;
    default:
        pStyle = SvXMLStylesContext::CreateStyleStyleChildContext( nFamily,
                                                                   nPrefix,
                                                              rLocalName,
                                                              xAttrList );
        break;
    }

    return pStyle;
}
#endif

SwXMLStylesContext_Impl::SwXMLStylesContext_Impl(
        SwXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName,
        const Reference< xml::sax::XAttributeList > & xAttrList ) :
    SvXMLStylesContext( rImport, nPrfx, rLName, xAttrList )
{
}

SwXMLStylesContext_Impl::~SwXMLStylesContext_Impl()
{
}

#ifndef XML_CORE_API
sal_Bool SwXMLStylesContext_Impl::InsertStyleFamily( sal_uInt16 nFamily ) const
{
    const SwXMLImport& rSwImport = GetSwImport();
    sal_uInt16 nStyleFamilyMask = rSwImport.GetStyleFamilyMask();

    sal_Bool bIns = sal_True;
    switch( nFamily )
    {
    case XML_STYLE_FAMILY_TEXT_PARAGRAPH:
        bIns = (nStyleFamilyMask & SFX_STYLE_FAMILY_PARA) != 0;
        break;
    case XML_STYLE_FAMILY_TEXT_TEXT:
        bIns = (nStyleFamilyMask & SFX_STYLE_FAMILY_CHAR) != 0;
        break;
    case XML_STYLE_FAMILY_SD_GRAPHICS_ID:
        bIns = (nStyleFamilyMask & SFX_STYLE_FAMILY_FRAME) != 0;
        break;
    case XML_STYLE_FAMILY_TEXT_LIST:
        bIns = (nStyleFamilyMask & SFX_STYLE_FAMILY_PSEUDO) != 0;
        break;
    case XML_STYLE_FAMILY_TEXT_OUTLINE:
        bIns = !(rSwImport.IsInsertMode() || rSwImport.IsStylesOnlyMode());
        break;
    default:
        bIns = SvXMLStylesContext::InsertStyleFamily( nFamily );
        break;
    }

    return bIns;
}

UniReference < SvXMLImportPropertyMapper > SwXMLStylesContext_Impl::GetImportPropertyMapper(
                        sal_uInt16 nFamily ) const
{
    UniReference < SvXMLImportPropertyMapper > xMapper;
    if( XML_STYLE_FAMILY_SD_GRAPHICS_ID == nFamily )
        xMapper = ((SvXMLImport *)&GetImport())->GetTextImport()
                     ->GetFrameImportPropertySetMapper();
    else
        xMapper = SvXMLStylesContext::GetImportPropertyMapper( nFamily );

    return xMapper;
}

Reference < XNameContainer > SwXMLStylesContext_Impl::GetStylesContainer(
                                                sal_uInt16 nFamily ) const
{
    Reference < XNameContainer > xStyles;
    if( XML_STYLE_FAMILY_SD_GRAPHICS_ID == nFamily )
        xStyles = ((SvXMLImport *)&GetImport())->GetTextImport()->GetFrameStyles();
    else
        xStyles = SvXMLStylesContext::GetStylesContainer( nFamily );

    return xStyles;
}

OUString SwXMLStylesContext_Impl::GetServiceName( sal_uInt16 nFamily ) const
{
    String sServiceName;
    if( XML_STYLE_FAMILY_SD_GRAPHICS_ID == nFamily )
        sServiceName = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.style.FrameStyle") );
    else
        sServiceName = SvXMLStylesContext::GetServiceName( nFamily );

    return sServiceName;
}
#endif

#ifdef XML_CORE_API
void SwXMLStylesContext_Impl::CopyStylesToDoc()
{
    SwXMLImport& rSwImport = GetSwImport();
    SwDoc& rDoc = rSwImport.GetDoc();
    SvI18NMap& rI18NMap = rSwImport.GetI18NMap();
    sal_Bool bInsertMode = rSwImport.IsInsertMode();
    sal_uInt16 nStyleFamilyMask = rSwImport.GetStyleFamilyMask();

    // The following families are of interest for pass 1
    sal_uInt16 nFamilies = nStyleFamilyMask &
                       ( SFX_STYLE_FAMILY_FRAME|SFX_STYLE_FAMILY_PARA|
                         SFX_STYLE_FAMILY_CHAR );

    // pass 1: create text, paragraph and frame styles
    sal_uInt16 nCount = GetStyleCount();
    for( sal_uInt16 i=0; i<nCount; i++ )
    {
        SwXMLItemSetStyleContext_Impl *pStyle = GetSwStyle( i );
        if( !pStyle )
        {
            continue;
        }

        sal_uInt16 eFamily = pStyle->GetFamily();
        if( !(nFamilies & eFamily) )
        {
            pStyle->SetValid( sal_False );
            continue;
        }

        const OUString& rName = pStyle->GetName();
        if( 0 == rName.getLength() )
        {
            pStyle->SetValid( sal_False );
            continue;
        }
        OUString sName =
            SwXStyleFamilies::GetUIName( rName, (SfxStyleFamily)eFamily );

//      sal_uInt16 nPoolId = pStyle->GetPoolId();

        sal_Bool bNewFmt = sal_False;
        SwFmt *pFmt = FindFmtByName( sName, eFamily );
        if( !pFmt )
        {
            // it is a new format
            SwGetPoolIdFromName eNameType;
            if( eFamily & SFX_STYLE_FAMILY_CHAR )
                eNameType = GET_POOLID_CHRFMT;
            else if( eFamily & SFX_STYLE_FAMILY_FRAME )
                eNameType = GET_POOLID_FRMFMT;
            else
                eNameType = GET_POOLID_TXTCOLL;

            sal_uInt16 nPoolId = rDoc.GetPoolId( sName, eNameType );
            bNewFmt = sal_True;
//          sal_Bool bIsUserDefined = (nPoolId & USER_FMT) != 0;
            sal_Bool bIsUserDefined = nPoolId == USHRT_MAX;
#if 0
            if( !bIsUserDefined )
            {
                bIsUserDefined = !lcl_xmlfmt_isValidPoolId( nPoolId, eFamily );
                if( bIsUserDefined )
                {
                    // If the pool id is invalid create a user style
                    nPoolId |= (USHRT_MAX &
                                ~(COLL_GET_RANGE_BITS + POOLGRP_NOCOLLID));
                }
            }
            else
            {
                // The style is not a pool style, but maybe there is
                // a pool style with this name now?
                SwGetPoolIdFromName eNameType;
                if( eFamily & SFX_STYLE_FAMILY_CHAR )
                    eNameType = GET_POOLID_CHRFMT;
                else if( eFamily & SFX_STYLE_FAMILY_FRAME )
                    eNameType = GET_POOLID_FRMFMT;
                else
                    eNameType = GET_POOLID_TXTCOLL;
                sal_uInt16 nId = rDoc.GetPoolId( rName, eNameType );
                if( nId != USHRT_MAX )
                {
                    if( FindByPoolId( nId ) )
                    {
                        // There is a style with the new pool id, too.
                        // This means, that the user style will be ignored.
                        continue;
                    }
                    else
                    {
                        bIsUserDefined = sal_False;
                        nPoolId = nId;
                    }
                }
            }
#endif

            if( bIsUserDefined )
            {
                if( eFamily & SFX_STYLE_FAMILY_CHAR )
                {
                    pFmt = rDoc.MakeCharFmt( rName, NULL );
                    pFmt->SetAuto( sal_False );
                }
                else if( eFamily & SFX_STYLE_FAMILY_FRAME )
                {
                    pFmt = rDoc.MakeFrmFmt( rName, NULL );
                    pFmt->SetAuto( sal_False );
                }
                else if( pStyle->HasConditions() )
                {
                    SwTxtFmtColl* pDer = (*rDoc.GetTxtFmtColls())[ 0 ];
                    pFmt = rDoc.MakeCondTxtFmtColl( rName, pDer );
                }
                else
                {
                    SwTxtFmtColl* pDer = (*rDoc.GetTxtFmtColls())[ 0 ];
                    pFmt = rDoc.MakeTxtFmtColl( rName, pDer );
                }

//              pFmt->SetPoolFmtId( nPoolId );
//              if( pStyle->GetHelpFile().getLength() )
//                  pFmt->SetPoolHlpFileId
//                      ( (sal_Int8) rDoc.SetDocPattern(
//                                          pStyle->GetHelpFile() ) );
//              pFmt->SetPoolHelpId( (sal_uInt16)pStyle->GetHelpId() );
            }
            else
            {
                if( eFamily & SFX_STYLE_FAMILY_CHAR )
                {
                    sal_uInt16 nStyleCnt = rDoc.GetCharFmts()->Count();
                    pFmt = rDoc.GetCharFmtFromPool( nPoolId );
                    bNewFmt = nStyleCnt != rDoc.GetCharFmts()->Count();
                }
                else if( eFamily & SFX_STYLE_FAMILY_FRAME )
                {
                    sal_uInt16 nStyleCnt = rDoc.GetFrmFmts()->Count();
                    pFmt = rDoc.GetFrmFmtFromPool( nPoolId );
                    bNewFmt = nStyleCnt != rDoc.GetFrmFmts()->Count();
                }
                else
                {
                    sal_uInt16 nStyleCnt = rDoc.GetTxtFmtColls()->Count();
                    pFmt = rDoc.GetTxtCollFromPool( nPoolId );
                    bNewFmt = nStyleCnt != rDoc.GetTxtFmtColls()->Count();
                }

                // If the name of the pool style has been changed, add
                // a i18n map entry.
                if( String(rName) != pFmt->GetName() )
                    rI18NMap.Add( eFamily, pStyle->GetName(), pFmt->GetName() );
            }
        }
#if 0
        else if( (nPoolId & USER_FMT) != 0 )
        {
            // If a pool style has been renamed it may have the same
            // name a a user style. If this is the case, the user style
            // will be ignored.
            sal_uInt16 nId = pFmt->GetPoolFmtId();
            SwXMLItemSetStyleContext_Impl *pTmp;
            if( nId != nPoolId && (nId & USER_FMT) == 0 &&
                (pTmp = FindByPoolId( nPoolId )) != 0 &&
                pTmp->GetFmt() == pFmt )
            {
                pStyle->SetValid( sal_False );
                continue;
            }
        }
#endif

        pStyle->SetFmt( pFmt );

        if( !bInsertMode || bNewFmt )
        {
            if( pStyle->GetItemSet() )
            {
                pFmt->ResetAllAttr(); // delete default attributes

                ((SwAttrSet&) pFmt->GetAttrSet()).Put( *pStyle->GetItemSet() );
            }
            SwTxtFmtColl* pColl = pStyle->GetColl();
            if( pColl )
            {
                ((SwAttrSet&) pColl->GetAttrSet()).SetModifyAtAttr( pColl );
            }
            pFmt->SetAutoUpdateFmt( pStyle->IsAutoUpdate() );
        }
        else
        {
            pStyle->SetValid( sal_False );
        }
    }

    // pass 2: connect parent/next styles and create list styles
    for( i=0; i<nCount; i++ )
    {
        SwXMLItemSetStyleContext_Impl *pStyle = GetSwStyle( i );
        if( !pStyle )
        {
            if( (nStyleFamilyMask & SFX_STYLE_FAMILY_PSEUDO) != 0 )
            {
                SwXMLListStyleContext *pListStyle = GetSwListStyle( i );
                if( pListStyle )
                    pListStyle->InsertNumRule( sal_False );
            }
            continue;
        }
        else if( !pStyle->IsValid() )
            continue;

        sal_uInt16 eFamily = pStyle->GetFamily();
        if( (nFamilies & eFamily) != 0 )
        {
            pStyle->ConnectParent();
            pStyle->ConnectFollow();

            // The format has been changed
            SwFmtChg aHint( pStyle->GetFmt() );
            pStyle->GetFmt()->Modify( &aHint, &aHint );
        }
    }

    // pass 3: connect conditions and list styles
    for( i=0; i<nCount; i++ )
    {
        SwXMLItemSetStyleContext_Impl *pStyle = GetSwStyle( i );
        if( pStyle && pStyle->IsValid() &&
            (nFamilies & pStyle->GetFamily()) != 0 )
        {
            pStyle->ConnectListStyle();
            if( pStyle->HasConditions() )
                pStyle->ConnectConditions();
        }
    }
}

void SwXMLStylesContext_Impl::CopyAutoStylesToDoc()
{
    // pass 1: create list styles
    sal_uInt16 nCount = GetStyleCount();
    if( (GetSwImport().GetStyleFamilyMask() & SFX_STYLE_FAMILY_PSEUDO) != 0 )
    {
        for( sal_uInt16 i=0; i<nCount; i++ )
        {
            SwXMLListStyleContext *pListStyle = GetSwListStyle( i );
            if( pListStyle && !pListStyle->IsOutline() )
                pListStyle->InsertNumRule( sal_True );
        }
    }

    // pass 3: connect list styles
    if( (GetSwImport().GetStyleFamilyMask() & SFX_STYLE_FAMILY_PARA) != 0 )
    {
        for( sal_uInt16 i=0; i<nCount; i++ )
        {
            SwXMLItemSetStyleContext_Impl *pStyle = GetSwStyle( i );
            if( pStyle && SFX_STYLE_FAMILY_PARA == pStyle->GetFamily() )
            {
                pStyle->ConnectAutoListStyle();
            }
        }
    }
}
#endif

// ---------------------------------------------------------------------

SvXMLImportContext *SwXMLImport::CreateStylesContext(
        const OUString& rLocalName,
        const Reference< xml::sax::XAttributeList > & xAttrList,
        sal_Bool bAuto )
{
    SvXMLImportContext *pContext =
        new SwXMLStylesContext_Impl( *this, XML_NAMESPACE_OFFICE, rLocalName,
                                       xAttrList );
    if( bAuto )
        xAutoStyles = pContext;
    else
        xStyles = pContext;

    return pContext;
}

void SwXMLImport::InsertStyles()
{
    sal_Bool bStylesValid = xStyles.Is();
    bAutoStylesValid  = xAutoStyles.Is();

    if( bStylesValid )
#ifdef XML_CORE_API
        ((SwXMLStylesContext_Impl *)&xStyles)->CopyStylesToDoc();
#else
        ((SwXMLStylesContext_Impl *)&xStyles)->CopyStylesToDoc(
                                                !IsInsertMode() );
#endif
    xStyles = 0;

    if( bAutoStylesValid )
#ifdef XML_CORE_API
        ((SwXMLStylesContext_Impl *)&xAutoStyles)->CopyAutoStylesToDoc();
#else
        GetTextImport()->SetAutoStyles( (SwXMLStylesContext_Impl *)&xAutoStyles );
#endif
    else
        xAutoStyles = 0;
}

sal_Bool SwXMLImport::FindAutomaticStyle(
#ifdef XML_CORE_API
        SfxStyleFamily eFamily,
        sal_uInt16 nSubFamily,
#else
        sal_uInt16 nFamily,
#endif
        const OUString& rName,
        const SfxItemSet **ppItemSet,
        OUString *pParent ) const
{
    const SwXMLItemSetStyleContext_Impl *pStyle = 0;
    if( bAutoStylesValid && xAutoStyles.Is() )
    {
#ifdef XML_CORE_API
        pStyle = PTR_CAST( SwXMLItemSetStyleContext_Impl,
              ((SwXMLStylesContext_Impl *)&xAutoStyles)->
                    FindStyleChildContext( eFamily, nSubFamily, rName,
                                           sal_True ) );
#else
        pStyle = PTR_CAST( SwXMLItemSetStyleContext_Impl,
              ((SwXMLStylesContext_Impl *)&xAutoStyles)->
                    FindStyleChildContext( nFamily, rName,
                                           sal_True ) );
#endif
        if( pStyle )
        {
            if( ppItemSet )
                (*ppItemSet) = pStyle->GetItemSet();
            if( pParent )
                *pParent = pStyle->GetParent();
        }
    }

    return pStyle != 0;
}

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/xml/xmlfmt.cxx,v 1.1.1.1 2000-09-18 17:15:00 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.42  2000/09/18 16:05:05  willem.vandorp
      OpenOffice header added.

      Revision 1.41  2000/09/18 11:58:02  mib
      text frames/graphics import and export continued

      Revision 1.40  2000/08/31 14:26:32  mib
      conditional styles

      Revision 1.39  2000/08/24 11:16:41  mib
      text import continued

      Revision 1.38  2000/08/10 10:22:15  mib
      #74404#: Adeptions to new XSL/XLink working draft

      Revision 1.37  2000/07/27 08:06:34  mib
      text import continued

      Revision 1.36  2000/07/21 12:55:15  mib
      text import/export using StarOffice API

      Revision 1.35  2000/07/07 13:58:36  mib
      text styles using StarOffice API

      Revision 1.34  2000/06/26 08:31:15  mib
      removed SfxStyleFamily

      Revision 1.33  2000/06/08 09:45:54  aw
      changed to use functionality from xmloff project now

      Revision 1.32  2000/05/03 12:08:05  mib
      unicode

      Revision 1.31  2000/03/13 14:33:44  mib
      UNO3

      Revision 1.30  2000/03/06 10:46:10  mib
      #72585#: toInt32

      Revision 1.29  2000/02/18 09:20:12  mib
      #70271#: initialization of pContext was missing

      Revision 1.28  2000/02/17 14:40:30  mib
      #70271#: XML table import

      Revision 1.26  2000/01/27 08:59:02  mib
      #70271#: outline numbering

      Revision 1.25  2000/01/20 10:03:15  mib
      #70271#: Lists reworked

      Revision 1.24  2000/01/06 15:08:27  mib
      #70271#:separation of text/layout, cond. styles, adaptions to wd-xlink-19991229

      Revision 1.23  1999/12/13 08:28:25  mib
      #70271#: Support for element items added

      Revision 1.22  1999/12/06 11:41:33  mib
      #70258#: Container item for unkown attributes

      Revision 1.21  1999/11/26 11:13:57  mib
      loading of styles only and insert mode

      Revision 1.20  1999/11/22 15:52:34  os
      headers added

      Revision 1.19  1999/11/17 20:08:49  nn
      document language

      Revision 1.18  1999/11/12 14:50:28  mib
      meta import and export reactivated

      Revision 1.17  1999/11/12 11:43:03  mib
      using item mapper, part iii

      Revision 1.16  1999/11/10 15:08:09  mib
      Import now uses XMLItemMapper

      Revision 1.15  1999/11/09 15:40:08  mib
      Using XMLItemMapper for export

      Revision 1.14  1999/11/05 19:44:11  nn
      handle office:meta

      Revision 1.13  1999/11/01 11:38:50  mib
      List style import

      Revision 1.12  1999/10/25 10:41:48  mib
      Using new OUString ASCII methods

      Revision 1.11  1999/10/22 09:49:16  mib
      List style export

      Revision 1.10  1999/10/15 12:37:05  mib
      integrated SvXMLStyle into SvXMLStyleContext

      Revision 1.9  1999/10/08 11:47:45  mib
      moved some file to SVTOOLS/SVX

      Revision 1.8  1999/10/01 13:02:51  mib
      no comparisons between OUString and char* any longer

      Revision 1.7  1999/09/28 10:47:58  mib
      char fmts again

      Revision 1.6  1999/09/28 08:31:15  mib
      char fmts, hints

      Revision 1.5  1999/09/23 11:53:58  mib
      i18n, token maps and hard paragraph attributes

      Revision 1.4  1999/09/22 11:56:57  mib
      string -> wstring

      Revision 1.3  1999/08/19 12:57:42  MIB
      attribute import added


      Rev 1.2   19 Aug 1999 14:57:42   MIB
   attribute import added

      Rev 1.1   18 Aug 1999 17:03:36   MIB
   Style import

      Rev 1.0   13 Aug 1999 16:18:10   MIB
   Initial revision.


*************************************************************************/

diff --git a/sw/source/filter/xml/xmlfmte.cxx b/sw/source/filter/xml/xmlfmte.cxx
new file mode 100644
index 0000000..ebac28e
--- /dev/null
+++ b/sw/source/filter/xml/xmlfmte.cxx
@@ -0,0 +1,1144 @@
/*************************************************************************
 *
 *  $RCSfile: xmlfmte.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:15:00 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTS_HXX //autogen wg. SwFmtChg
#include <hints.hxx>
#endif

#ifndef _COM_SUN_STAR_TEXT_XTEXTDOCUMENT_HPP_
#include <com/sun/star/text/XTextDocument.hpp>
#endif

#ifndef _COM_SUN_STAR_TEXT_XTEXT_HPP_
#include <com/sun/star/text/XText.hpp>
#endif
#ifndef _RTL_USTRBUF_HXX_
#include <rtl/ustrbuf.hxx>
#endif

#ifndef _SVSTDARR_STRINGSSORT_DECL
#define _SVSTDARR_STRINGSSORT
#include <svtools/svstdarr.hxx>
#endif

#ifndef _XMLOFF_XMLNMSPE_HXX
#include <xmloff/xmlnmspe.hxx>
#endif

#ifndef _XMLOFF_ATTRLIST_HXX
#include <xmloff/attrlist.hxx>
#endif

#ifndef _XMLOFF_XMLASTPL_HXX
#include <xmloff/xmlastpl.hxx>
#endif

#ifndef _XMLOFF_XMLITMPR_HXX
#include <xmloff/xmlexpit.hxx>
#endif

#ifndef _XMLOFF_XMLKYWD_HXX
#include <xmloff/xmlkywd.hxx>
#endif

#ifndef _XMLOFF_NMSPMAP_HXX
#include <xmloff/nmspmap.hxx>
#endif

#ifndef _XMLOFF_TXTSTYLE_HXX
#include <xmloff/txtstyle.hxx>
#endif

#ifndef _XMLOFF_XMLPROPERTYSETMAPPER_HXX
#include <xmloff/xmlprmap.hxx>
#endif
#ifndef _XMLOFF_XMLPROPMAPPINGTYPES_HXX
#include <xmloff/maptype.hxx>
#endif
#ifndef _XMLOFF_XMLTYPES_HXX
#include <xmloff/xmltypes.hxx>
#endif
#ifndef _XMLOFF_TXTPARAE_HXX
#include <xmloff/txtparae.hxx>
#endif
#ifndef _XMLOFF_TXTPRMAP_HXX
#include <xmloff/txtprmap.hxx>
#endif
#ifndef _XMLOFF_XMLEXPPR_HXX
#include <xmloff/xmlexppr.hxx>
#endif
#ifndef _XMLOFF_XMLASTPLP_HXX
#include <xmloff/xmlaustp.hxx>
#endif
#ifndef _XMLOFF_FAMILIES_HXX_
#include <xmloff/families.hxx>
#endif

#ifndef _FORMAT_HXX //autogen wg. SwFmt
#include <format.hxx>
#endif
#ifndef _FMTCOL_HXX //autogen wg. SwTxtFmtColl
#include <fmtcol.hxx>
#endif
#ifndef _CHARFMT_HXX //autogen wg. SwCharFmt
#include <charfmt.hxx>
#endif
#ifndef _PARATR_HXX
#include <paratr.hxx>
#endif

#ifndef _DOC_HXX //autogen wg. SwDoc
#include <doc.hxx>
#endif
#include "docary.hxx"
#ifndef _NDTXT_HXX //autogen wg. SwTxtNode
#include <ndtxt.hxx>
#endif
#ifndef _SECTION_HXX //autogen wg. SwSection
#include <section.hxx>
#endif
#ifndef _PAM_HXX //autogen wg. SwPaM
#include <pam.hxx>
#endif
#ifndef _TXATBASE_HXX
#include <txatbase.hxx>
#endif
#ifndef _XMLEXP_HXX
#include "xmlexp.hxx"
#endif
#ifndef _XMLECTXT_HXX
#include "xmlectxt.hxx"
#endif
#ifndef _XMLFMTE_HXX
#include "xmlfmte.hxx"
#endif
#ifndef _XMLTEXTE_HXX
#include "xmltexte.hxx"
#endif

#ifndef _SWDOCSH_HXX
#include "docsh.hxx"
#endif
#ifndef _COM_SUN_STAR_FRAME_XMODEL_HPP_
#include <com/sun/star/frame/XModel.hpp>
#endif
#ifndef _XMLOFF_XMLUCONV_HXX
#include <xmloff/xmluconv.hxx>
#endif
#ifndef XML_CORE_API
#ifndef _XMLOFF_XMLTEXTLISTAUTOSTYLEPOOL_HXX
#include <xmloff/XMLTextListAutoStylePool.hxx>
#endif
#endif

#ifndef _COM_SUN_STAR_TEXT_XTEXTFIELD_HPP_
#include <com/sun/star/text/XTextField.hpp>
#endif

#ifndef _UNOFIELD_HXX
#include <unofield.hxx>
#endif

#ifndef _XMLOFF_TXTFLDE_HXX
#include <xmloff/txtflde.hxx>
#endif

#ifndef _XMLOFF_XMLNUMFE_HXX
#include <xmloff/xmlnumfe.hxx>
#endif

#ifndef _UNOSTYLE_HXX
#include "unostyle.hxx"
#endif


using namespace rtl;
using namespace ::com::sun::star;
using namespace ::com::sun::star::xml::sax;
using namespace ::com::sun::star::style;
using namespace ::com::sun::star::frame;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::text;

void SwXMLExport::ExportFmt( const SwFmt& rFmt, const char *pFamily )
{
    // <style:style ...>
    CheckAttrList();

    // style:family="..."
    const sal_Char *pStr = pFamily;
#ifdef XML_CORE_API
    SfxStyleFamily eFamily = SFX_STYLE_FAMILY_ALL;
    switch( rFmt.Which() )
    {
    case RES_CHRFMT:
        if( !pStr )
            pStr = sXML_text;
        eFamily = SFX_STYLE_FAMILY_CHAR;
        break;
    case RES_FRMFMT:
        if( !pStr )
            pStr = sXML_frame;
        eFamily = SFX_STYLE_FAMILY_FRAME;
        break;
    case RES_TXTFMTCOLL:
    case RES_CONDTXTFMTCOLL:
        if( !pStr )
            pStr = sXML_paragraph;
        eFamily = SFX_STYLE_FAMILY_PARA;
        break;
    case RES_FLYFRMFMT:
    case RES_GRFFMTCOLL:
        DBG_ASSERT( pStr, "SwXMLExport::ExportFmt: which id unexpected" );
        break;
    default:
        DBG_ASSERT( pStr, "SwXMLExport::ExportFmt: which id unknown" );
        break;
    }
    // style:name="..."
    AddAttribute( XML_NAMESPACE_STYLE, sXML_name,
            SwXStyleFamilies::GetProgrammaticName( rFmt.GetName(), eFamily ) );
#else
    DBG_ASSERT( RES_FRMFMT==rFmt.Which(), "frame format expected" );
    if( RES_FRMFMT != rFmt.Which() )
        return;
    DBG_ASSERT( pStr, "family must be specified" );
    // style:name="..."
    AddAttribute( XML_NAMESPACE_STYLE, sXML_name, rFmt.GetName() );
#endif

    if( pStr )
        AddAttributeASCII( XML_NAMESPACE_STYLE, sXML_family, pStr );

#ifdef XML_CORE_API
    // register name to prevent it from beeing reused as an automtic
    // style name
    if( SFX_STYLE_FAMILY_ALL != eFamily )
        pItemSetAutoStylePool->RegisterName( eFamily, rFmt.GetName() );
#endif

    // style:parent-style-name="..." (if its not the default only)
    const SwFmt* pParent = rFmt.DerivedFrom();
    // Parent-Namen nur uebernehmen, wenn kein Default
    if( pParent && !pParent->IsDefault() )
    {
#ifdef XML_CORE_API
        AddAttribute( XML_NAMESPACE_STYLE, sXML_parent_style_name,
            SwXStyleFamilies::GetProgrammaticName( pParent->GetName(),
                                                   eFamily ) );
#else
        AddAttribute( XML_NAMESPACE_STYLE, sXML_parent_style_name,
                      pParent->GetName() );
#endif
    }

#ifdef XML_CORE_API
    // style:next-style-name="..."
    // (if its not the default and not the same style only)
    if( RES_TXTFMTCOLL == rFmt.Which() || RES_CONDTXTFMTCOLL == rFmt.Which() )
    {
        const SwTxtFmtColl& rFollow =
            ((const SwTxtFmtColl&)rFmt).GetNextTxtFmtColl();
        if( !rFollow.IsDefault() && &rFollow != &rFmt )
        {
            AddAttribute( XML_NAMESPACE_STYLE, sXML_next_style_name,
                SwXStyleFamilies::GetProgrammaticName( rFollow.GetName(),
                                                       eFamily ) );
        }
    }

#if 0
    // style:pool-id="..."
    if( USHRT_MAX != rFmt.GetPoolFmtId() )
    {
        OUStringBuffer sTmp( 5L );
        sTmp.append( (sal_Int32)rFmt.GetPoolFmtId() );
        AddAttribute( XML_NAMESPACE_STYLE, sXML_pool_id,
                      sTmp.makeStringAndClear() );
    }

    // style:help-file-name="..." and style:help-id="..."
    if( UCHAR_MAX != rFmt.GetPoolHlpFileId() )
    {
        AddAttribute( XML_NAMESPACE_STYLE, sXML_help_file_name,
                      *pDoc->GetDocPattern( rFmt.GetPoolHlpFileId() ) );
        OUStringBuffer sTmp( 5L );
        sTmp.append( (sal_Int32)rFmt.GetPoolHelpId() );
        AddAttribute( XML_NAMESPACE_STYLE, sXML_help_id,
                      sTmp.makeStringAndClear() );
    }
#endif

    // style:auto-update="..."
    if( rFmt.IsAutoUpdateFmt() )
    {
        AddAttributeASCII( XML_NAMESPACE_STYLE, sXML_auto_update, sXML_true );
    }

    // text:list-style-name
    if( RES_TXTFMTCOLL == rFmt.Which() || RES_CONDTXTFMTCOLL == rFmt.Which() )
    {
        const SfxPoolItem *pItem;
        if( SFX_ITEM_SET == rFmt.GetAttrSet().GetItemState( RES_PARATR_NUMRULE,
                                                            sal_False, &pItem ) )
        {
            AddAttribute( XML_NAMESPACE_STYLE, sXML_list_style_name,
                SwXStyleFamilies::GetProgrammaticName(
                    ((const SwNumRuleItem *)pItem)->GetValue(),
                    SFX_STYLE_FAMILY_PSEUDO ) );
        }
    }
#else
    ASSERT( USHRT_MAX == rFmt.GetPoolFmtId(), "pool ids arent'supported" );
    ASSERT( UCHAR_MAX == rFmt.GetPoolHlpFileId(), "help ids aren't supported" );
#endif

    {
        SvXMLElementExport aElem( *this, XML_NAMESPACE_STYLE, sXML_style,
                                  sal_True, sal_True );

#ifdef XML_CORE_API
        switch( rFmt.Which() )
        {
        case RES_TXTFMTCOLL:
        case RES_CONDTXTFMTCOLL:
        case RES_CHRFMT:
            GetParaItemMapper().exportXML( GetDocHandler(),
                                           rFmt.GetAttrSet(),
                                           GetTwipUnitConverter(),
                                           GetNamespaceMap(),
                                           XML_EXPORT_FLAG_IGN_WS );
            break;
        case RES_FRMFMT:
            {
#endif
                SvXMLItemMapEntriesRef xItemMap;
                if( sXML_table == pStr )
                    xItemMap = xTableItemMap;
                else if( sXML_table_row == pStr )
                    xItemMap = xTableRowItemMap;
                else if( sXML_table_cell == pStr )
                    xItemMap = xTableCellItemMap;

                if( xItemMap.Is() )
                {
                    SvXMLExportItemMapper& rItemMapper = GetTableItemMapper();
                    rItemMapper.setMapEntries( xItemMap );

                    GetTableItemMapper().exportXML( GetDocHandler(),
                                                   rFmt.GetAttrSet(),
                                                   GetTwipUnitConverter(),
                                                   GetNamespaceMap(),
                                                   XML_EXPORT_FLAG_IGN_WS );
                }
#ifdef XML_CORE_API
            }
            break;
        default:
            DBG_ASSERT( !this,
                        "SwXMLExport::ExportFmt: attribute export missing" );
            break;
        }

        if( RES_CONDTXTFMTCOLL == rFmt.Which() )
        {
            const SwFmtCollConditions& rConditions =
                ((SwConditionTxtFmtColl&)rFmt). GetCondColls();
            for( sal_uInt16 i=0; i < rConditions.Count(); i++ )
            {
                const SwCollCondition& rCond = *rConditions[i];

                const sal_Char *pFunc = 0;
                OUStringBuffer sBuffer( 20 );
                switch( rCond.GetCondition() )
                {
                case PARA_IN_LIST:
                    pFunc = sXML_list_level;
                    sBuffer.append( (sal_Int32)(rCond.GetSubCondition()+1) );
                    break;
                case PARA_IN_OUTLINE:
                    pFunc = sXML_outline_level;
                    sBuffer.append( (sal_Int32)(rCond.GetSubCondition()+1) );
                    break;
                case PARA_IN_FRAME:
                    pFunc = sXML_text_box;
                    break;
                case PARA_IN_TABLEHEAD:
                    pFunc = sXML_table_header;
                    break;
                case PARA_IN_TABLEBODY:
                    pFunc = sXML_table;
                    break;
                case PARA_IN_SECTION:
                    pFunc = sXML_section;
                    break;
                case PARA_IN_FOOTENOTE:
                    pFunc = sXML_footnote;
                    break;
                case PARA_IN_FOOTER:
                    pFunc = sXML_footer;
                    break;
                case PARA_IN_HEADER:
                    pFunc = sXML_header;
                    break;
                case PARA_IN_ENDNOTE:
                    pFunc = sXML_endnote;
                    break;
                }
                OUString sVal( sBuffer.makeStringAndClear() );

                DBG_ASSERT( pFunc, "SwXMLExport::ExportFmt: unknon condition" );
                if( pFunc )
                {
                    sBuffer.appendAscii( pFunc );
                    sBuffer.append( (sal_Unicode)'(' );
                    sBuffer.append( (sal_Unicode)')' );
                    if( sVal.getLength() )
                    {
                        sBuffer.append( (sal_Unicode)'=' );
                        sBuffer.append( sVal );
                    }

                    AddAttribute( XML_NAMESPACE_STYLE, sXML_condition,
                                  sBuffer.makeStringAndClear() );
                    const String& rName =
                        SwXStyleFamilies::GetProgrammaticName(
                                    rCond.GetTxtFmtColl()->GetName(),
                                    SFX_STYLE_FAMILY_PARA );
                    AddAttribute( XML_NAMESPACE_STYLE, sXML_apply_style_name,
                                  rName );
                    SvXMLElementExport aElem( *this, XML_NAMESPACE_STYLE,
                                              sXML_map, sal_True, sal_True );
                }
            }
        }
#endif
    }
}

#ifndef XML_CORE_API

SwXMLTextParagraphExport::SwXMLTextParagraphExport(
        SwXMLExport& rExp,
         SvXMLAutoStylePoolP& rAutoStylePool ) :
    XMLTextParagraphExport( rExp, rAutoStylePool ),
    sTextTable( RTL_CONSTASCII_USTRINGPARAM( "TextTable" ) )
{
}

SwXMLTextParagraphExport::~SwXMLTextParagraphExport()
{
}

void SwXMLTextParagraphExport::exportStyleContent(
        const Reference< XStyle > & rStyle )
{

    const SwXStyle* pStyle = 0;
    Reference<XUnoTunnel> xStyleTunnel( rStyle, UNO_QUERY);
    if( xStyleTunnel.is() )
    {
        pStyle = (SwXStyle*)xStyleTunnel->getSomething(
                                            SwXStyle::getUnoTunnelId() );
    }
    if( pStyle && SFX_STYLE_FAMILY_PARA == pStyle->GetFamily() )
    {
        const SwDoc& rDoc = ((SwXMLExport&)GetExport()).GetDoc();
        const SwTxtFmtColl *pColl =
            rDoc.FindTxtFmtCollByName( SwXStyleFamilies::GetUIName( pStyle->GetStyleName(), SFX_STYLE_FAMILY_PARA ) );
        ASSERT( pColl, "There is the text collection?" );
        if( pColl && RES_CONDTXTFMTCOLL == pColl->Which() )
        {
            const SwFmtCollConditions& rConditions =
                ((const SwConditionTxtFmtColl *)pColl)->GetCondColls();
            for( sal_uInt16 i=0; i < rConditions.Count(); i++ )
            {
                const SwCollCondition& rCond = *rConditions[i];

                const sal_Char *pFunc = 0;
                OUStringBuffer sBuffer( 20 );
                switch( rCond.GetCondition() )
                {
                case PARA_IN_LIST:
                    pFunc = sXML_list_level;
                    sBuffer.append( (sal_Int32)(rCond.GetSubCondition()+1) );
                    break;
                case PARA_IN_OUTLINE:
                    pFunc = sXML_outline_level;
                    sBuffer.append( (sal_Int32)(rCond.GetSubCondition()+1) );
                    break;
                case PARA_IN_FRAME:
                    pFunc = sXML_text_box;
                    break;
                case PARA_IN_TABLEHEAD:
                    pFunc = sXML_table_header;
                    break;
                case PARA_IN_TABLEBODY:
                    pFunc = sXML_table;
                    break;
                case PARA_IN_SECTION:
                    pFunc = sXML_section;
                    break;
                case PARA_IN_FOOTENOTE:
                    pFunc = sXML_footnote;
                    break;
                case PARA_IN_FOOTER:
                    pFunc = sXML_footer;
                    break;
                case PARA_IN_HEADER:
                    pFunc = sXML_header;
                    break;
                case PARA_IN_ENDNOTE:
                    pFunc = sXML_endnote;
                    break;
                }
                OUString sVal( sBuffer.makeStringAndClear() );

                DBG_ASSERT( pFunc, "SwXMLExport::ExportFmt: unknon condition" );
                if( pFunc )
                {
                    sBuffer.appendAscii( pFunc );
                    sBuffer.append( (sal_Unicode)'(' );
                    sBuffer.append( (sal_Unicode)')' );
                    if( sVal.getLength() )
                    {
                        sBuffer.append( (sal_Unicode)'=' );
                        sBuffer.append( sVal );
                    }

                    GetExport().AddAttribute( XML_NAMESPACE_STYLE,
                                sXML_condition,
                                sBuffer.makeStringAndClear() );
                    const String& rName =
                        SwXStyleFamilies::GetProgrammaticName(
                                    rCond.GetTxtFmtColl()->GetName(),
                                    SFX_STYLE_FAMILY_PARA );
                    GetExport().AddAttribute( XML_NAMESPACE_STYLE,
                                sXML_apply_style_name, rName );
                    SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_STYLE,
                                              sXML_map, sal_True, sal_True );
                }
            }
        }
    }
}

#endif

void SwXMLExport::_ExportStyles( sal_Bool bUsed )
{
#ifdef XML_CORE_API
    // text collections
    SvStringsSort *pCollNames = bUsed ? new SvStringsSort : 0;
    sal_uInt16 nCount = pDoc->GetTxtFmtColls()->Count();
    sal_uInt16 i;
    for( i=0; i<nCount; i++ )
    {
        const SwTxtFmtColl *pColl = (*pDoc->GetTxtFmtColls())[i];
        if( ( !bUsed || pDoc->IsUsed( *pColl ) ) && !pColl->IsDefault() )
        {
            ExportFmt( *pColl );
            if( pCollNames )
                pCollNames->Insert( (String *)&pColl->GetName() );
        }
    }
    if( bUsed )
    {
        // Even if some next styles have not been used, they have to be
        // exported.
        for( i = 0; i < nCount; i++ )
        {
            const SwTxtFmtColl* pColl = (*pDoc->GetTxtFmtColls())[ i ];
            if( pColl != &pColl->GetNextTxtFmtColl() &&
                !pCollNames->Seek_Entry(
                    (String *)&pColl->GetNextTxtFmtColl().GetName() ) )
            {
                ExportFmt( pColl->GetNextTxtFmtColl() );
                pCollNames->Insert(
                    (String *)&pColl->GetNextTxtFmtColl().GetName() );
            }
        }
        delete pCollNames;
    }

    // char fmts
    nCount = pDoc->GetCharFmts()->Count();
    for( i=0; i<nCount; i++ )
    {
        const SwCharFmt *pFmt = (*pDoc->GetCharFmts())[i];
        if( ( !bUsed || pDoc->IsUsed( *pFmt ) ) && !pFmt->IsDefault() )
            ExportFmt( *pFmt );
    }

    // num rules
    ExportNumRules( sal_False, bUsed );
#else
    GetTextParagraphExport()->exportTextStyles( bUsed );
#endif
}

// ---------------------------------------------------------------------

#ifdef XML_CORE_API
void SwXMLExport::AddTextAutoStyle( const SfxPoolItem& rItem )
{
    SfxItemSet aItemSet( pDoc->GetAttrPool(),
                         RES_CHRATR_BEGIN,      RES_CHRATR_END - 1,
                         RES_UNKNOWNATR_BEGIN,  RES_UNKNOWNATR_END - 1, 0 );
    aItemSet.Put( rItem );
    pItemSetAutoStylePool->Add( SFX_STYLE_FAMILY_CHAR, aItemSet );
}

void SwXMLExport::AddParaAutoStyle( const OUString& rParent,
                                    const SfxItemSet& rItemSet )
{
    pItemSetAutoStylePool->Add( SFX_STYLE_FAMILY_PARA,
        SwXStyleFamilies::GetProgrammaticName(rParent, SFX_STYLE_FAMILY_PARA ),
           rItemSet );
}

OUString SwXMLExport::FindTextAutoStyle( const SfxPoolItem& rItem )
{
    SfxItemSet aItemSet( pDoc->GetAttrPool(),
                         RES_CHRATR_BEGIN,      RES_CHRATR_END - 1,
                         RES_UNKNOWNATR_BEGIN,  RES_UNKNOWNATR_END - 1, 0 );
    aItemSet.Put( rItem );
    return pItemSetAutoStylePool->Find( SFX_STYLE_FAMILY_CHAR, aItemSet );
}

OUString SwXMLExport::FindParaAutoStyle( const OUString& rParent,
                                         const SfxItemSet& rItemSet )
{
    return pItemSetAutoStylePool->Find(
        SFX_STYLE_FAMILY_PARA,
        SwXStyleFamilies::GetProgrammaticName(rParent, SFX_STYLE_FAMILY_PARA ),
         rItemSet );
}

void SwXMLExport::ExportTxtNodeAutoStyles( const SwTxtNode& rTxtNd,
                                           xub_StrLen nStart, xub_StrLen nEnd,
                                           sal_Bool bExportWholeNode )
{
    const SfxItemSet *pItemSet = rTxtNd.GetpSwAttrSet();
    if( pItemSet )
    {
        const SwFmtColl& rColl = rTxtNd.GetAnyFmtColl();
        OUString sParent( rColl.GetName() );
        AddParaAutoStyle( sParent, *pItemSet );

        if( rTxtNd.GetCondFmtColl() &&
             &rColl != rTxtNd.GetFmtColl() )
        {
            const SwFmtColl *pColl = rTxtNd.GetFmtColl();
            sParent = pColl->GetName();
            AddParaAutoStyle( sParent, *pItemSet );
        }
    }

    xub_StrLen nPos = pCurPaM->GetPoint()->nContent.GetIndex();
    xub_StrLen nEndPos = rTxtNd.GetTxt().Len();
    if( pCurPaM->GetPoint()->nNode == pCurPaM->GetMark()->nNode )
        nEndPos = pCurPaM->GetMark()->nContent.GetIndex();

    const SwpHints *pHints = rTxtNd.GetpSwpHints();
    sal_uInt16 nHintCount = pHints ? pHints->Count() : 0;
    sal_uInt16 nHintPos = 0;
    const SwTxtAttr * pTxtAttr = 0;

    if( nHintCount && nPos > *( pTxtAttr = (*pHints)[0] )->GetStart() )
    {
        do
        {
            nHintPos++;
            sal_uInt16 nWhich = pTxtAttr->Which();
            if( pTxtAttr->GetEnd() &&
                ( (nWhich >= RES_CHRATR_BEGIN && nWhich < RES_CHRATR_END) ||
                  (nWhich >= RES_UNKNOWNATR_BEGIN &&
                                             nWhich < RES_UNKNOWNATR_END) ) )
            {
                xub_StrLen nHtEnd = *pTxtAttr->GetEnd(),
                       nHtStt = *pTxtAttr->GetStart();
                if( (bExportWholeNode || nHtEnd > nPos) &&
                    nHtEnd != nHtStt )
                {
                    AddTextAutoStyle( pTxtAttr->GetAttr() );
                }
            }

        }
        while( nHintPos < nHintCount &&
               nPos > *( pTxtAttr = (*pHints)[nHintPos ] )->GetStart() );
    }

    for( ; nPos < nEndPos; nPos++ )
    {
        if( nHintPos < nHintCount && *pTxtAttr->GetStart() == nPos
            && nPos != nEndPos )
        {
            do
            {
                sal_uInt16 nWhich = pTxtAttr->Which();
                if( pTxtAttr->GetEnd() && *pTxtAttr->GetEnd() != nPos &&
                    ( (nWhich >= RES_CHRATR_BEGIN && nWhich < RES_CHRATR_END) ||
                      (nWhich >= RES_UNKNOWNATR_BEGIN &&
                                             nWhich < RES_UNKNOWNATR_END) ) )
                {
                    AddTextAutoStyle( pTxtAttr->GetAttr() );
                } else if( nWhich == RES_TXTATR_FIELD ) {
                    // text field found: export AutoStyle
#ifdef XML_CORE_API
//                  Reference < text::XTextField > xFld = new SwXTextField(
//                      ((const SwFmtFld&)pTxtAttr->GetAttr()), &GetDoc() );
//
//                  GetTextFieldExport().ExportFieldAutoStyle( xFld );
#endif
                }
            }
            while( ++nHintPos < nHintCount &&
                  nPos == *( pTxtAttr = (*pHints)[nHintPos] )->GetStart() );
        }
    }
}

void SwXMLExport::ExportSectionAutoStyles( const SwSectionNode& rSectNd )
{
    SwNode *pStartNd = pDoc->GetNodes()[rSectNd.GetIndex() + 1];
    SwNode *pEndNd = pDoc->GetNodes()[rSectNd.EndOfSectionIndex() - 1];

    {
        SwXMLExpContext aContext( *this, *pStartNd, *pEndNd, 0, STRING_LEN );
        ExportCurPaMAutoStyles();
    }

    pCurPaM->GetPoint()->nNode = *rSectNd.EndOfSectionNode();
}

void SwXMLExport::ExportCurPaMAutoStyles( sal_Bool bExportWholePaM )
{
    sal_Bool bFirstNode = sal_True;
    sal_Bool bExportWholeNode = bExportWholePaM;

    while( pCurPaM->GetPoint()->nNode.GetIndex() <
                                pCurPaM->GetMark()->nNode.GetIndex() ||
           ( pCurPaM->GetPoint()->nNode.GetIndex() ==
                                pCurPaM->GetMark()->nNode.GetIndex() &&
             pCurPaM->GetPoint()->nContent.GetIndex() <=
                                pCurPaM->GetMark()->nContent.GetIndex() ) )
    {
        SwNode *pNd = pCurPaM->GetNode();

        ASSERT( !(pNd->IsGrfNode() || pNd->IsOLENode()),
                "SwXMLExport::exportCurPaM: grf or OLE node unexpected" );
        if( pNd->IsTxtNode() )
        {
            SwTxtNode* pTxtNd = pNd->GetTxtNode();

            if( !bFirstNode )
                pCurPaM->GetPoint()->nContent.Assign( pTxtNd, 0 );

            ExportTxtNodeAutoStyles( *pTxtNd, 0, STRING_LEN, bExportWholeNode );
        }
        else if( pNd->IsTableNode() )
        {
            ExportTableAutoStyles( *pNd->GetTableNode() );
        }
        else if( pNd->IsSectionNode() )
        {
            ExportSectionAutoStyles( *pNd->GetSectionNode() );
        }
        else if( pNd == &pDoc->GetNodes().GetEndOfContent() )
            break;

        pCurPaM->GetPoint()->nNode++;   // next node

        // if not everything should be exported, the WriteAll flag must be
        // set for all but the first and last node anyway.
        bExportWholeNode = bExportWholePaM ||
                           pCurPaM->GetPoint()->nNode.GetIndex() !=
                           pCurPaM->GetMark()->nNode.GetIndex();
        bFirstNode = sal_False;
    }
}
#endif

void SwXMLExport::_ExportAutoStyles()
{
#ifdef XML_CORE_API
    // export all PaMs
    SwPaM *pPaM = pOrigPaM;
    sal_Bool bContinue = sal_True;
    do
    {
        // export PaM content
        ExportCurPaMAutoStyles( bExportWholeDoc );

        bContinue = pPaM->GetNext() != pOrigPaM;

        // the current PaM must be at the start if this loop finishes
        pPaM = (SwPaM *)pPaM->GetNext();
        SetCurPaM( *pPaM, bExportWholeDoc, bExportFirstTableOnly );

    } while( bContinue );

    // text collections
    ((SvXMLAutoStylePool *)pItemSetAutoStylePool)->exportXML( SFX_STYLE_FAMILY_PARA,
                                                       GetParaItemMapper(),
                                                       GetDocHandler(),
                                                       GetTwipUnitConverter(),
                                                       GetNamespaceMap() );

    // char fmts
    ((SvXMLAutoStylePool *)pItemSetAutoStylePool)->exportXML( SFX_STYLE_FAMILY_CHAR,
                                                       GetParaItemMapper(),
                                                       GetDocHandler(),
                                                       GetTwipUnitConverter(),
                                                       GetNamespaceMap() );

    // num rules
    ExportNumRules( sal_True, sal_False );

    // text field styles
//  GetNumberFormatExport().Export( GetNamespaceMap() );

#else
    Reference < XTextDocument > xTextDoc( GetModel(), UNO_QUERY );
    Reference < XText > xText = xTextDoc->getText();

    GetTextParagraphExport()->collectFrameBoundToPageAutoStyles();
    GetTextParagraphExport()->collectTextAutoStyles( xText );
    GetTextParagraphExport()->exportTextAutoStyles();
    exportAutoDataStyles();

#endif

}

void SwXMLExport::_ExportMasterStyles()
{
}

// ---------------------------------------------------------------------

#ifdef XML_CORE_API
void SwXMLAutoStylePool::exportXML( SvXMLAttributeList& rAttrList,
                            SfxStyleFamily eFamily, const SfxItemSet& rItemSet,
                            const SvXMLUnitConverter& rUnitConverter,
                            const SvXMLNamespaceMap& rNamespaceMap ) const
{
    if( SFX_STYLE_FAMILY_PARA == eFamily )
    {
        const SfxPoolItem *pItem;
        if( SFX_ITEM_SET == rItemSet.GetItemState( RES_PARATR_NUMRULE, sal_False,
                                                   &pItem ) )
        {
            OUString sName( rNamespaceMap.GetQNameByKey( XML_NAMESPACE_STYLE,
                    OUString::createFromAscii(sXML_list_style_name) ) );
            rAttrList.AddAttribute( sName,
                                    OUString::createFromAscii( sXML_CDATA ),
                                      ((const SwNumRuleItem *)pItem)->GetValue() );
        }
    }
}

SwXMLAutoStylePool::~SwXMLAutoStylePool()
{
}
#else

class SwXMLAutoStylePoolP : public SvXMLAutoStylePoolP
{
    SvXMLExport& rExport;
    const OUString sListStyleName;
    const OUString sCDATA;

protected:

    virtual void exportStyleAttributes(
            SvXMLAttributeList& rAttrList,
            sal_Int32 nFamily,
            const ::std::vector< XMLPropertyState >& rProperties,
            const SvXMLExportPropertyMapper& rPropExp,
            const SvXMLUnitConverter& rUnitConverter,
            const SvXMLNamespaceMap& rNamespaceMap) const;
public:

    SwXMLAutoStylePoolP( SvXMLExport& rExport );
    virtual ~SwXMLAutoStylePoolP();
};

void SwXMLAutoStylePoolP::exportStyleAttributes(
            SvXMLAttributeList& rAttrList,
            sal_Int32 nFamily,
            const ::std::vector< XMLPropertyState >& rProperties,
            const SvXMLExportPropertyMapper& rPropExp,
            const SvXMLUnitConverter& rUnitConverter,
            const SvXMLNamespaceMap& rNamespaceMap) const
{
    if( XML_STYLE_FAMILY_TEXT_PARAGRAPH == nFamily )
    {
        for( ::std::vector< XMLPropertyState >::const_iterator
                    aProperty = rProperties.begin();
             aProperty != rProperties.end();
              aProperty++ )
        {
            switch( rPropExp.getPropertySetMapper()->
                        GetEntryContextId( aProperty->mnIndex ) )
            {
            case CTF_NUMBERINGSTYLENAME:
                {
                    OUString sStyleName;
                    aProperty->maValue >>= sStyleName;
                    if( sStyleName.getLength() )
                    {
                        OUString sTmp = rExport.GetTextParagraphExport()->GetListAutoStylePool().Find( sStyleName );
                        if( sTmp.getLength() )
                            sStyleName = sTmp;
                        OUString sName( rNamespaceMap.GetQNameByKey(
                                XML_NAMESPACE_STYLE, sListStyleName ) );
                        rAttrList.AddAttribute( sName, sCDATA, sStyleName );
                    }
                }
                break;
            }
        }
    }
}

SwXMLAutoStylePoolP::SwXMLAutoStylePoolP(SvXMLExport& rExp ) :
    SvXMLAutoStylePoolP(),
    rExport( rExp ),
    sListStyleName( RTL_CONSTASCII_USTRINGPARAM( sXML_list_style_name) ),
    sCDATA( RTL_CONSTASCII_USTRINGPARAM( sXML_CDATA) )
{
}


SwXMLAutoStylePoolP::~SwXMLAutoStylePoolP()
{
}

SvXMLAutoStylePoolP* SwXMLExport::CreateAutoStylePool()
{
    return new SwXMLAutoStylePoolP( *this );
}
#endif

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/xml/xmlfmte.cxx,v 1.1.1.1 2000-09-18 17:15:00 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.23  2000/09/18 16:05:06  willem.vandorp
      OpenOffice header added.

      Revision 1.22  2000/09/18 11:58:02  mib
      text frames/graphics import and export continued

      Revision 1.21  2000/09/07 05:29:00  mib
      #78555#: Search paragraph styles by programmatic name instead of UI name

      Revision 1.20  2000/08/24 11:16:41  mib
      text import continued

      Revision 1.19  2000/08/21 11:02:50  dvo
      - fixed data style export (for textfields)

      Revision 1.18  2000/08/10 10:22:16  mib
      #74404#: Adeptions to new XSL/XLink working draft

      Revision 1.17  2000/08/02 14:52:39  mib
      text export continued

      Revision 1.16  2000/07/31 09:42:35  mib
      text export continued

      Revision 1.15  2000/07/27 08:06:34  mib
      text import continued

      Revision 1.14  2000/07/26 05:11:20  mib
      text import/export continued

      Revision 1.13  2000/07/24 10:19:02  dvo
      - textfield export for XML_CORE_API

      Revision 1.12  2000/07/21 12:55:15  mib
      text import/export using StarOffice API

      Revision 1.11  2000/07/10 06:58:49  mib
      text styles

      Revision 1.10  2000/07/07 13:58:36  mib
      text styles using StarOffice API

      Revision 1.9  2000/06/08 09:45:54  aw
      changed to use functionality from xmloff project now

      Revision 1.8  2000/05/03 12:08:05  mib
      unicode

      Revision 1.7  2000/03/13 14:33:44  mib
      UNO3

      Revision 1.6  2000/03/06 10:46:11  mib
      #72585#: toInt32

      Revision 1.5  2000/02/11 14:41:57  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.4  2000/02/07 10:03:28  mib
      #70271#: tables

      Revision 1.3  2000/01/20 10:03:16  mib
      #70271#: Lists reworked

      Revision 1.2  2000/01/12 15:00:23  mib
      #70271#: lists

      Revision 1.1  2000/01/06 15:03:40  mib
      #70271#:separation of text/layout, cond. styles, adaptions to wd-xlink-19991229

      Revision 1.23  1999/12/13 08:28:25  mib
      #70271#: Support for element items added

      Revision 1.22  1999/12/06 11:41:33  mib
      #70258#: Container item for unkown attributes

      Revision 1.21  1999/11/26 11:13:57  mib
      loading of styles only and insert mode

      Revision 1.20  1999/11/22 15:52:34  os
      headers added

      Revision 1.19  1999/11/17 20:08:49  nn
      document language

      Revision 1.18  1999/11/12 14:50:28  mib
      meta import and export reactivated

      Revision 1.17  1999/11/12 11:43:03  mib
      using item mapper, part iii

      Revision 1.16  1999/11/10 15:08:09  mib
      Import now uses XMLItemMapper

      Revision 1.15  1999/11/09 15:40:08  mib
      Using XMLItemMapper for export

      Revision 1.14  1999/11/05 19:44:11  nn
      handle office:meta

      Revision 1.13  1999/11/01 11:38:50  mib
      List style import

      Revision 1.12  1999/10/25 10:41:48  mib
      Using new OUString ASCII methods

      Revision 1.11  1999/10/22 09:49:16  mib
      List style export

      Revision 1.10  1999/10/15 12:37:05  mib
      integrated SvXMLStyle into SvXMLStyleContext

      Revision 1.9  1999/10/08 11:47:45  mib
      moved some file to SVTOOLS/SVX

      Revision 1.8  1999/10/01 13:02:51  mib
      no comparisons between OUString and char* any longer

      Revision 1.7  1999/09/28 10:47:58  mib
      char fmts again

      Revision 1.6  1999/09/28 08:31:15  mib
      char fmts, hints

      Revision 1.5  1999/09/23 11:53:58  mib
      i18n, token maps and hard paragraph attributes

      Revision 1.4  1999/09/22 11:56:57  mib
      string -> wstring

      Revision 1.3  1999/08/19 12:57:42  MIB
      attribute import added


      Rev 1.2   19 Aug 1999 14:57:42   MIB
   attribute import added

      Rev 1.1   18 Aug 1999 17:03:36   MIB
   Style import

      Rev 1.0   13 Aug 1999 16:18:10   MIB
   Initial revision.


*************************************************************************/

diff --git a/sw/source/filter/xml/xmlimp.cxx b/sw/source/filter/xml/xmlimp.cxx
new file mode 100644
index 0000000..41743bc
--- /dev/null
+++ b/sw/source/filter/xml/xmlimp.cxx
@@ -0,0 +1,570 @@
/*************************************************************************
 *
 *  $RCSfile: xmlimp.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:15:00 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#ifndef _PAM_HXX //autogen wg. SwPaM
#include <pam.hxx>
#endif

#ifndef _XMLOFF_NMSPMAP_HXX
#include <xmloff/nmspmap.hxx>
#endif

#ifndef _XMLOFF_XMLNMSPE_HXX
#include <xmloff/xmlnmspe.hxx>
#endif

#ifndef _XMLOFF_I18NMAP_HXX
#include <xmloff/i18nmap.hxx>
#endif

#ifndef _XMLOFF_XMLTKMAP_HXX
#include <xmloff/xmltkmap.hxx>
#endif

#ifndef _XMLOFF_XMLKYWD_HXX
#include <xmloff/xmlkywd.hxx>
#endif

#ifndef _XMLOFF_XMLICTXT_HXX
#include <xmloff/xmlictxt.hxx>
#endif
#ifndef _XMLOFF_TXTIMP_HXX
#include <xmloff/txtimp.hxx>
#endif


#ifndef _COM_SUN_STAR_TEXT_XTEXTRANGE_HPP_
#include <com/sun/star/text/XTextRange.hpp>
#endif

#ifndef _COM_SUN_STAR_TEXT_XTEXT_HPP_
#include <com/sun/star/text/XText.hpp>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _UNOOBJ_HXX
#include <unoobj.hxx>
#endif
#ifndef _POOLFMT_HXX
#include <poolfmt.hxx>
#endif
#ifndef _NDTXT_HXX
#include <ndtxt.hxx>
#endif
#ifndef _XMLIMP_HXX
#include "xmlimp.hxx"
#endif

using namespace ::rtl;
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::text;

sal_Char __READONLY_DATA sXML_np__text[] = "text";
sal_Char __READONLY_DATA sXML_np__table[] = "table";

//----------------------------------------------------------------------------

enum SwXMLDocTokens
{
    XML_TOK_DOC_STYLES,
    XML_TOK_DOC_AUTOSTYLES,
    XML_TOK_DOC_MASTERSTYLES,
    XML_TOK_DOC_META,
    XML_TOK_DOC_BODY,
    XML_TOK_OFFICE_END=XML_TOK_UNKNOWN
};

static __FAR_DATA SvXMLTokenMapEntry aDocTokenMap[] =
{
    { XML_NAMESPACE_OFFICE, sXML_styles,     XML_TOK_DOC_STYLES     },
    { XML_NAMESPACE_OFFICE, sXML_automatic_styles, XML_TOK_DOC_AUTOSTYLES   },
    { XML_NAMESPACE_OFFICE, sXML_master_styles,  XML_TOK_DOC_MASTERSTYLES   },
    { XML_NAMESPACE_OFFICE, sXML_meta,       XML_TOK_DOC_META       },
    { XML_NAMESPACE_OFFICE, sXML_body,       XML_TOK_DOC_BODY       },
    XML_TOKEN_MAP_END
};

class SwXMLDocContext_Impl : public SvXMLImportContext
{
    const SwXMLImport& GetSwImport() const
        { return (const SwXMLImport&)GetImport(); }
    SwXMLImport& GetSwImport() { return (SwXMLImport&)GetImport(); }

public:

    SwXMLDocContext_Impl( SwXMLImport& rImport, sal_uInt16 nPrfx,
                const OUString& rLName,
                const Reference< xml::sax::XAttributeList > & xAttrList );
    virtual ~SwXMLDocContext_Impl();

    virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
                const OUString& rLocalName,
                const Reference< xml::sax::XAttributeList > & xAttrList );
};

SwXMLDocContext_Impl::SwXMLDocContext_Impl( SwXMLImport& rImport,
                sal_uInt16 nPrfx, const OUString& rLName,
                const Reference< xml::sax::XAttributeList > & xAttrList ) :
    SvXMLImportContext( rImport, nPrfx, rLName )
{
}

SwXMLDocContext_Impl::~SwXMLDocContext_Impl()
{
}

SvXMLImportContext *SwXMLDocContext_Impl::CreateChildContext(
        sal_uInt16 nPrefix,
        const OUString& rLocalName,
        const Reference< xml::sax::XAttributeList > & xAttrList )
{
    SvXMLImportContext *pContext = 0;

    const SvXMLTokenMap& rTokenMap = GetSwImport().GetDocElemTokenMap();
    switch( rTokenMap.Get( nPrefix, rLocalName ) )
    {
    case XML_TOK_DOC_STYLES:
        pContext = GetSwImport().CreateStylesContext( rLocalName, xAttrList,
                                                      sal_False );
        break;
    case XML_TOK_DOC_AUTOSTYLES:
        pContext = GetSwImport().CreateStylesContext( rLocalName, xAttrList,
                                                      sal_True );
        break;
//  case XML_TOK_DOC_USESTYLES:
//      pContext = GetSwImport().CreateUseStylesContext( rLocalName,
//                                                       xAttrList );
//      break;
    case XML_TOK_DOC_MASTERSTYLES:
//      pContext = GetSwImport().CreateMasterStylesContext( rLocalName,
//                                                       xAttrList );
        break;
    case XML_TOK_DOC_META:
        pContext = GetSwImport().CreateMetaContext( rLocalName );
        break;
    case XML_TOK_DOC_BODY:
        pContext = GetSwImport().CreateBodyContext( rLocalName );
        break;
    }

    if( !pContext )
        pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );


    return pContext;
}

//----------------------------------------------------------------------------

const SvXMLTokenMap& SwXMLImport::GetDocElemTokenMap()
{
    if( !pDocElemTokenMap )
        pDocElemTokenMap = new SvXMLTokenMap( aDocTokenMap );

    return *pDocElemTokenMap;
}

SvXMLImportContext *SwXMLImport::CreateContext(
        sal_uInt16 nPrefix,
        const OUString& rLocalName,
        const Reference< xml::sax::XAttributeList > & xAttrList )
{
    SvXMLImportContext *pContext = 0;

    if( XML_NAMESPACE_OFFICE==nPrefix &&
        rLocalName.compareToAscii( sXML_document ) == 0 )
        pContext = new SwXMLDocContext_Impl( *this, nPrefix, rLocalName,
                                             xAttrList );
    else
        pContext = SvXMLImport::CreateContext( nPrefix, rLocalName, xAttrList );

    return pContext;
}

SwXMLImport::SwXMLImport(
        SwDoc& rDoc, const SwPaM& rPaM,
        sal_Bool bLDoc, sal_Bool bInsertMode, sal_uInt16 nStyleFamMask,
        const ::com::sun::star::uno::Reference<
                 ::com::sun::star::frame::XModel > & rModel ) :
    SvXMLImport( rModel ),
    bLoadDoc( bLDoc ),
    bInsert( bInsertMode ),
    nStyleFamilyMask( nStyleFamMask ),
    pDoc( &rDoc ),
    pPaM( new SwPaM( *rPaM.GetPoint() )  ),
#ifdef XML_CORE_API
    pI18NMap( new SvI18NMap ),
    pUnusedNumRules( 0 ),
#endif
    pDocElemTokenMap( 0 ),
#ifdef XML_CORE_API
    pBodyElemTokenMap( 0 ),
    pStyleStylesElemTokenMap( 0 ),
    pTextPElemTokenMap( 0 ),
    pTextPAttrTokenMap( 0 ),
    pTextListBlockAttrTokenMap( 0 ),
    pTextListBlockElemTokenMap( 0 ),
#endif
    pTableElemTokenMap( 0 ),
#ifdef XML_CORE_API
    pParaItemMapper( 0 ),
#endif
    pTableItemMapper( 0 ),
    pSttNdIdx( 0 ),
    bAutoStylesValid( sal_False )
{
//  GetNamespaceMap().AddAtIndex( XML_NAMESPACE_TEXT, sXML_np__text,
//                                sXML_n_text, XML_NAMESPACE_TEXT );
//  GetNamespaceMap().AddAtIndex( XML_NAMESPACE_TABLE, sXML_np__table,
//                                sXML_n_table, XML_NAMESPACE_TABLE );

    _InitItemImport();

    if( !IsStylesOnlyMode() )
    {
        pSttNdIdx = new SwNodeIndex( pDoc->GetNodes() );
        if( IsInsertMode() )
        {
            const SwPosition* pPos = pPaM->GetPoint();

            // Split once and remember the node that has been splitted.
            pDoc->SplitNode( *pPos );
            *pSttNdIdx = pPos->nNode.GetIndex()-1;

            // Split again.
            pDoc->SplitNode( *pPos );

            // Insert all content into the new node
            pPaM->Move( fnMoveBackward );
            pDoc->SetTxtFmtColl( *pPaM,
                             pDoc->GetTxtCollFromPool(RES_POOLCOLL_STANDARD) );
        }
    }
    Reference < XTextRange > xTextRange =
        CreateTextRangeFromPosition( pDoc, *rPaM.GetPoint(), 0 );
    Reference < XText > xText = xTextRange->getText();
    Reference < XTextCursor > xTextCursor =
        xText->createTextCursorByRange( xTextRange );
    GetTextImport()->SetCursor( xTextCursor );
}

SwXMLImport::~SwXMLImport()
{
    GetTextImport()->ResetCursor();

    if( !IsStylesOnlyMode() )
    {
        if( IsInsertMode() && pSttNdIdx->GetIndex() )
        {
            // If we are in insert mode, join the splitted node that is in front
            // of the new content with the first new node.
            SwTxtNode* pTxtNode = pSttNdIdx->GetNode().GetTxtNode();
            SwNodeIndex aNxtIdx( *pSttNdIdx );
            if( pTxtNode && pTxtNode->CanJoinNext( &aNxtIdx ))
            {
                xub_StrLen nStt = pTxtNode->GetTxt().Len();

                // If the PaM points to the first new node, move the PaM to the
                // end of the previous node.
                if( pPaM->GetPoint()->nNode == aNxtIdx )
                {
                    pPaM->GetPoint()->nNode = *pSttNdIdx;
                    pPaM->GetPoint()->nContent.Assign( pTxtNode, nStt );
                }

#ifndef PRODUCT
                // !!! This should be impossible !!!!
                ASSERT( pSttNdIdx->GetIndex()+1 !=
                                        pPaM->GetBound( sal_True ).nNode.GetIndex(),
                        "PaM.Bound1 point to new node " );
                ASSERT( pSttNdIdx->GetIndex()+1 !=
                                        pPaM->GetBound( sal_False ).nNode.GetIndex(),
                        "PaM.Bound2 points to new node" );

                if( pSttNdIdx->GetIndex()+1 ==
                                        pPaM->GetBound( sal_True ).nNode.GetIndex() )
                {
                    sal_uInt16 nCntPos =
                            pPaM->GetBound( sal_True ).nContent.GetIndex();
                    pPaM->GetBound( sal_True ).nContent.Assign( pTxtNode,
                            pTxtNode->GetTxt().Len() + nCntPos );
                }
                if( pSttNdIdx->GetIndex()+1 ==
                                pPaM->GetBound( sal_False ).nNode.GetIndex() )
                {
                    sal_uInt16 nCntPos =
                            pPaM->GetBound( sal_False ).nContent.GetIndex();
                    pPaM->GetBound( sal_False ).nContent.Assign( pTxtNode,
                            pTxtNode->GetTxt().Len() + nCntPos );
                }
#endif
                // If the first new node isn't empty, convert  the node's text
                // attributes into hints. Otherwise, set the new node's paragraph
                // style at the previous (empty) node.
                SwTxtNode* pDelNd = aNxtIdx.GetNode().GetTxtNode();
                if( pTxtNode->GetTxt().Len() )
                    pDelNd->FmtToTxtAttr( pTxtNode );
                else
                    pTxtNode->ChgFmtColl( pDelNd->GetTxtColl() );
                pTxtNode->JoinNext();
            }
        }

        SwPosition* pPos = pPaM->GetPoint();
        if( !pPos->nContent.GetIndex() )
        {
            SwTxtNode* pCurrNd;
            sal_uInt32 nNodeIdx = pPos->nNode.GetIndex();

            if( !IsInsertMode() )
            {
                if( pDoc->GetNodes()[nNodeIdx -1]->IsCntntNode() )
                {
                    SwCntntNode* pCNd = pPaM->GetCntntNode();
                    if( pCNd && pCNd->StartOfSectionIndex()+2 <
                        pCNd->EndOfSectionIndex() )
                    {
                        pPaM->GetBound(sal_True).nContent.Assign( 0, 0 );
                        pPaM->GetBound(sal_False).nContent.Assign( 0, 0 );
                        pDoc->GetNodes().Delete( pPaM->GetPoint()->nNode );
                    }
                }
            }
            else if( 0 != (pCurrNd = pDoc->GetNodes()[nNodeIdx]->GetTxtNode()) )
            {
                if( pCurrNd->CanJoinNext( &pPos->nNode ))
                {
                    SwTxtNode* pNextNd = pPos->nNode.GetNode().GetTxtNode();
                    pPos->nContent.Assign( pNextNd, 0 );
                    pPaM->SetMark(); pPaM->DeleteMark();
                    pNextNd->JoinPrev();
                }
                else if( !pCurrNd->GetTxt().Len() )
                {
                    pPos->nContent.Assign( 0, 0 );
                    pPaM->SetMark(); pPaM->DeleteMark();
                    pDoc->GetNodes().Delete( pPos->nNode, 1 );
                    pPaM->Move( fnMoveBackward );
                }
            }
        }
        else if( IsInsertMode() )
        {
            pPaM->Move( fnMoveForward, fnGoNode );
            SwTxtNode* pTxtNode = pPos->nNode.GetNode().GetTxtNode();
            SwNodeIndex aPrvIdx( pPos->nNode );
            if( pTxtNode && pTxtNode->CanJoinPrev( &aPrvIdx ) &&
                *pSttNdIdx <= aPrvIdx )
            {
                // In fact, we should do an JoinNext here, but the Cursor and
                // many other stuff is registered to the current node. That for
                // the node should remain and we do an JoinPrev here.

                // Convert paragraph attributes into hints and set paragraph
                // style at the next node.
                SwTxtNode* pPrev = aPrvIdx.GetNode().GetTxtNode();
                pTxtNode->ChgFmtColl( pPrev->GetTxtColl() );
                pTxtNode->FmtToTxtAttr( pPrev );
                pTxtNode->SwCntntNode::ResetAllAttr();

                if( pPrev->GetpSwAttrSet() )
                    pTxtNode->SwCntntNode::SetAttr( *pPrev->GetpSwAttrSet() );

                if( &pPaM->GetBound(sal_True).nNode.GetNode() == pPrev )
                    pPaM->GetBound(sal_True).nContent.Assign( pTxtNode, 0 );
                if( &pPaM->GetBound(sal_False).nNode.GetNode() == pPrev )
                    pPaM->GetBound(sal_False).nContent.Assign( pTxtNode, 0 );

                pTxtNode->JoinPrev();
            }
        }
    }

#ifdef XML_CORE_API
    RemoveUnusedNumRules();
#endif

    delete pSttNdIdx;
    delete pPaM;
    delete pDocElemTokenMap;
#ifdef XML_CORE_API
    delete pI18NMap;
    delete pBodyElemTokenMap;
    delete pTextPElemTokenMap;
    delete pTextPAttrTokenMap;
    delete pStyleStylesElemTokenMap;
    delete pTextListBlockAttrTokenMap;
    delete pTextListBlockElemTokenMap;
#endif
    delete pTableElemTokenMap;
    _FinitItemImport();
}

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/xml/xmlimp.cxx,v 1.1.1.1 2000-09-18 17:15:00 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.30  2000/09/18 16:05:06  willem.vandorp
      OpenOffice header added.

      Revision 1.29  2000/08/29 07:33:47  mib
      text import continued

      Revision 1.28  2000/08/24 11:16:41  mib
      text import continued

      Revision 1.27  2000/08/10 10:22:16  mib
      #74404#: Adeptions to new XSL/XLink working draft

      Revision 1.26  2000/07/31 09:42:35  mib
      text export continued

      Revision 1.25  2000/07/21 12:55:15  mib
      text import/export using StarOffice API

      Revision 1.24  2000/07/07 13:58:36  mib
      text styles using StarOffice API

      Revision 1.23  2000/06/08 09:45:54  aw
      changed to use functionality from xmloff project now

      Revision 1.22  2000/05/15 16:53:17  jp
      Changes for Unicode

      Revision 1.21  2000/05/03 12:08:05  mib
      unicode

      Revision 1.20  2000/03/13 14:33:44  mib
      UNO3

      Revision 1.19  2000/02/17 14:40:30  mib
      #70271#: XML table import

      Revision 1.17  2000/01/27 08:59:02  mib
      #70271#: outline numbering

      Revision 1.16  2000/01/20 10:03:16  mib
      #70271#: Lists reworked

      Revision 1.15  2000/01/06 15:08:27  mib
      #70271#:separation of text/layout, cond. styles, adaptions to wd-xlink-19991229

      Revision 1.14  1999/11/26 11:12:51  mib
      loading of styles only and insert mode

      Revision 1.13  1999/11/22 15:53:39  mib
      split/join nodes correctly

      Revision 1.12  1999/11/12 11:43:03  mib
      using item mapper, part iii

      Revision 1.11  1999/11/10 15:08:09  mib
      Import now uses XMLItemMapper

      Revision 1.10  1999/11/01 11:38:50  mib
      List style import

      Revision 1.9  1999/10/15 12:39:11  mib
      moved styles element from style to office namespace

      Revision 1.8  1999/10/08 11:47:49  mib
      moved some file to SVTOOLS/SVX

      Revision 1.7  1999/10/05 14:31:14  hr
      #65293#: removed redundant const

      Revision 1.6  1999/09/28 10:46:58  mib
      memory leak

      Revision 1.5  1999/09/23 11:54:16  mib
      i18n, token maps and hard paragraph attributes

      Revision 1.4  1999/09/22 11:57:14  mib
      string -> wstring

      Revision 1.3  1999/08/19 12:57:42  MIB
      attribute import added


      Rev 1.2   19 Aug 1999 14:57:42   MIB
   attribute import added

      Rev 1.1   18 Aug 1999 17:05:20   MIB
   Style import

      Rev 1.0   17 Aug 1999 16:32:52   MIB
   Initial revision.

*************************************************************************/

diff --git a/sw/source/filter/xml/xmlimp.hxx b/sw/source/filter/xml/xmlimp.hxx
new file mode 100644
index 0000000..5bb6842
--- /dev/null
+++ b/sw/source/filter/xml/xmlimp.hxx
@@ -0,0 +1,283 @@
/*************************************************************************
 *
 *  $RCSfile: xmlimp.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:15:00 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _XMLIMP_HXX
#define _XMLIMP_HXX

#ifndef _RSCSFX_HXX
#include <rsc/rscsfx.hxx>
#endif

#ifndef _XMLOFF_XMLICTXT_HXX
#include <xmloff/xmlictxt.hxx>
#endif

#ifndef _XMLOFF_XMLITMAP_HXX
#include <xmloff/xmlitmap.hxx>
#endif

#ifndef _XMLOFF_XMLIMP_HXX
#include <xmloff/xmlimp.hxx>
#endif

class SwDoc;
class SwPaM;
class SvXMLUnitConverter;
class SvI18NMap;
class SvXMLTokenMap;
class SvXMLImportItemMapper;
class SvXMLStyleContext;
class SwXMLListBlockContext;
class SwXMLListItemContext;
class SfxItemSet;
class SwNodeIndex;
class SwNumRule;
class SwNumRulesSort_Impl;
class XMLTextImportHelper;

class SwXMLImport: public SvXMLImport
{
    SwDoc                   *pDoc;
    SwPaM                   *pPaM;      // SwPosition ??
    SwNodeIndex             *pSttNdIdx;

    SvXMLUnitConverter      *pTwipUnitConv;
#ifdef XML_CORE_API
    SvXMLImportItemMapper   *pParaItemMapper;// paragraph item import
#endif
    SvXMLImportItemMapper   *pTableItemMapper;// paragraph item import
#ifdef XML_CORE_API
    SvI18NMap               *pI18NMap;          // name mapping for I18N
    SwNumRulesSort_Impl     *pUnusedNumRules;
#endif
    SvXMLTokenMap           *pDocElemTokenMap;
#ifdef XML_CORE_API
    SvXMLTokenMap           *pBodyElemTokenMap;
    SvXMLTokenMap           *pTextPElemTokenMap;
    SvXMLTokenMap           *pTextPAttrTokenMap;
    SvXMLTokenMap           *pStyleStylesElemTokenMap;
    SvXMLTokenMap           *pTextListBlockAttrTokenMap;
    SvXMLTokenMap           *pTextListBlockElemTokenMap;
#endif
    SvXMLTokenMap           *pTableElemTokenMap;

    SvXMLItemMapEntriesRef  xTableItemMap;
    SvXMLItemMapEntriesRef  xTableColItemMap;
    SvXMLItemMapEntriesRef  xTableRowItemMap;
    SvXMLItemMapEntriesRef  xTableCellItemMap;

    SvXMLImportContextRef   xStyles;
    SvXMLImportContextRef   xAutoStyles;
#ifdef XML_CORE_API
    SvXMLImportContextRef   xListBlock;
    SvXMLImportContextRef   xListItem;
#endif

    sal_uInt16              nStyleFamilyMask;// Mask of styles to load
    sal_Bool                bLoadDoc : 1;   // Load doc or styles only
    sal_Bool                bInsert : 1;    // Insert mode. If styles are
                                            // loaded only sal_False means that
                                            // existing styles will be
                                            // overwritten.
    sal_Bool                bAutoStylesValid : 1;


    void                    _InitItemImport();
    void                    _FinitItemImport();
#ifdef XML_CORE_API
    void                    RemoveUnusedNumRules();
#endif

    void                    InsertStyles();

protected:

    // This method is called after the namespace map has been updated, but
    // before a context for the current element has been pushed.
    virtual SvXMLImportContext *CreateContext( sal_uInt16 nPrefix,
                  const ::rtl::OUString& rLocalName,
                  const ::com::sun::star::uno::Reference<
                    ::com::sun::star::xml::sax::XAttributeList > & xAttrList );

    virtual XMLTextImportHelper* CreateTextImport();

public:

    SwXMLImport( SwDoc& rDoc, const SwPaM& rPaM, sal_Bool bLoadDoc,
                 sal_Bool bInsertMode, sal_uInt16 nStyleFamMask,
                 const ::com::sun::star::uno::Reference<
                     ::com::sun::star::frame::XModel > & rModel );

    ~SwXMLImport();

    // namespace office
    SvXMLImportContext *CreateMetaContext( const ::rtl::OUString& rLocalName );
    SvXMLImportContext *CreateStylesContext(
                const ::rtl::OUString& rLocalName,
                const ::com::sun::star::uno::Reference<
                    ::com::sun::star::xml::sax::XAttributeList > & xAttrList,
                sal_Bool bAuto );
    SvXMLImportContext *CreateBodyContext( const ::rtl::OUString& rLocalName );


#ifdef XML_CORE_API
    SwPaM& GetPaM() { return *pPaM; }
#endif
    SwDoc& GetDoc() { return *pDoc; }
    const SwDoc& GetDoc() const { return *pDoc; }

    sal_uInt16 GetStyleFamilyMask() const { return nStyleFamilyMask; }
    sal_Bool IsInsertMode() const { return bInsert; }
    sal_Bool IsStylesOnlyMode() const { return !bLoadDoc; }

#ifdef XML_CORE_API
    SvI18NMap& GetI18NMap() { return *pI18NMap; }
#endif

    inline const SvXMLUnitConverter& GetTwipUnitConverter() const;
#ifdef XML_CORE_API
    inline const SvXMLImportItemMapper& GetParaItemMapper() const;
#endif
    inline const SvXMLImportItemMapper& GetTableItemMapper() const;
#ifdef XML_CORE_API
    SvXMLImportContext *CreateParaItemImportContext( sal_uInt16 nPrefix,
                 const ::rtl::OUString& rLocalName,
                 const ::com::sun::star::uno::Reference<
                    ::com::sun::star::xml::sax::XAttributeList > & xAttrList,
                SfxItemSet& rItemSet );
#endif
    SvXMLImportContext *CreateTableItemImportContext( sal_uInt16 nPrefix,
                const ::rtl::OUString& rLocalName,
                const ::com::sun::star::uno::Reference<
                    ::com::sun::star::xml::sax::XAttributeList > & xAttrList,
                sal_uInt16 nSubFamily, SfxItemSet& rItemSet );

    const SvXMLTokenMap& GetDocElemTokenMap();
#ifdef XML_CORE_API
    const SvXMLTokenMap& GetBodyElemTokenMap();
    const SvXMLTokenMap& GetTextPElemTokenMap();
    const SvXMLTokenMap& GetTextPAttrTokenMap();
    const SvXMLTokenMap& GetStyleStylesElemTokenMap();
    const SvXMLTokenMap& GetTextListBlockAttrTokenMap();
    const SvXMLTokenMap& GetTextListBlockElemTokenMap();
#endif
    const SvXMLTokenMap& GetTableElemTokenMap();

#ifdef XML_CORE_API
    inline sal_Bool FindAutomaticStyle( SfxStyleFamily eFamily,
                             const ::rtl::OUString& rName,
                             const SfxItemSet **ppItemSet=0,
                             ::rtl::OUString *pParent=0 ) const;
    sal_Bool FindAutomaticStyle( SfxStyleFamily eFamily,
                             sal_uInt16 nSubStyle,
                             const ::rtl::OUString& rName,
                             const SfxItemSet **ppItemSet=0,
                             ::rtl::OUString *pParent=0 ) const;
#else
    sal_Bool FindAutomaticStyle( sal_uInt16 nFamily,
                             const ::rtl::OUString& rName,
                             const SfxItemSet **ppItemSet=0,
                             ::rtl::OUString *pParent=0 ) const;
#endif

#ifdef XML_CORE_API
    SwXMLListBlockContext *GetListBlock();
    sal_Bool IsInList() const { return xListBlock.Is(); }
    void SetListBlock( SwXMLListBlockContext *pListBlock );

    SwXMLListItemContext *GetListItem();
    sal_Bool HasListItem() const { return xListItem.Is(); }
    void SetListItem( SwXMLListItemContext *pListItem );

    void AddUnused( const SwNumRule& rNumRule );
    void SetUsed( const SwNumRule& rNumRule );
#endif
};

inline const SvXMLUnitConverter& SwXMLImport::GetTwipUnitConverter() const
{
    return *pTwipUnitConv;
}

#ifdef XML_CORE_API
inline const SvXMLImportItemMapper& SwXMLImport::GetParaItemMapper() const
{
    return *pParaItemMapper;
}
#endif

inline const SvXMLImportItemMapper& SwXMLImport::GetTableItemMapper() const
{
    return *pTableItemMapper;
}

#ifdef XML_CORE_API
inline sal_Bool SwXMLImport::FindAutomaticStyle( SfxStyleFamily eFamily,
                             const ::rtl::OUString& rName,
                             const SfxItemSet **ppItemSet,
                             ::rtl::OUString *pParent ) const
{
    return FindAutomaticStyle( eFamily, 0U, rName, ppItemSet, pParent );
}
#endif


#endif  //  _XMLIMP_HXX
diff --git a/sw/source/filter/xml/xmliteme.cxx b/sw/source/filter/xml/xmliteme.cxx
new file mode 100644
index 0000000..e952d9f
--- /dev/null
+++ b/sw/source/filter/xml/xmliteme.cxx
@@ -0,0 +1,490 @@
/*************************************************************************
 *
 *  $RCSfile: xmliteme.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:59 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#include <hintids.hxx>

#ifndef _RTL_USTRING_HXX_
#include <rtl/ustring.hxx>
#endif
#ifndef _RTL_USTRBUF_HXX_
#include <rtl/ustrbuf.hxx>
#endif

#ifndef _SHL_HXX //autogen wg. SHL_WRITER
#include <tools/shl.hxx>
#endif

#ifndef _XMLOFF_XMLUCONV_HXX
#include <xmloff/xmluconv.hxx>
#endif
#ifndef _XMLOFF_XMLITMPR_HXX
#include <xmloff/xmlexpit.hxx>
#endif
#ifndef _XMLOFF_XMLKYWD_HXX
#include <xmloff/xmlkywd.hxx>
#endif
#ifndef _XMLOFF_NMSPMAP_HXX
#include <xmloff/nmspmap.hxx>
#endif
#ifndef _XMLOFF_XMLTABE_HXX
#include <xmloff/xmltabe.hxx>
#endif
#ifndef _XMLBRSHE_HXX
#include "xmlbrshe.hxx"
#endif

#ifndef _SVX_TSPTITEM_HXX
#include <svx/tstpitem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX
#include <svx/brshitem.hxx>
#endif
#ifndef _SVX_UNOMID_HXX
#include <svx/unomid.hxx>
#endif

#ifndef _VCL_FLDUNIT_HXX
#include <vcl/fldunit.hxx>
#endif

#ifndef _SWMODULE_HXX //autogen wg. SW_MOD
#include <swmodule.hxx>
#endif
#ifndef _DOC_HXX //autogen wg. SwDoc
#include <doc.hxx>
#endif
#ifndef _FMTORNT_HXX
#include "fmtornt.hxx"
#endif
#ifndef _UNOMID_H
#include <unomid.h>
#endif
#ifndef _FRMFMT_HXX
#include "frmfmt.hxx"
#endif
#ifndef _FMTFSIZE_HXX
#include "fmtfsize.hxx"
#endif
#ifndef _SWRECT_HXX
#include "swrect.hxx"
#endif

#ifndef _XMLDROPE_HXX
#include "xmldrope.hxx"
#endif
#ifndef _XMLEXP_HXX
#include "xmlexp.hxx"
#endif

using namespace ::rtl;
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;

#ifdef XML_CORE_API
extern SvXMLItemMapEntry aXMLParaItemMap[];
#endif
extern SvXMLItemMapEntry aXMLTableItemMap[];
extern SvXMLItemMapEntry aXMLTableRowItemMap[];
extern SvXMLItemMapEntry aXMLTableCellItemMap[];

#ifdef XML_CORE_API
class SwXMLTextItemMapper_Impl: public SvXMLExportItemMapper
{
protected:
    SvXMLUnitConverter& mrUnitConverter;
    const Reference< xml::sax::XDocumentHandler > & mrHandler;
    SvxXMLTabStopExport maTabStopExport;

public:

    SwXMLTextItemMapper_Impl(
            SvXMLItemMapEntriesRef rMapEntries,
            SvXMLUnitConverter& rUnitConverter,
            const Reference< xml::sax::XDocumentHandler > & rHandler );

    virtual ~SwXMLTextItemMapper_Impl();

    virtual void handleElementItem(
            const Reference< xml::sax::XDocumentHandler > & rHandler,
            const SvXMLItemMapEntry& rEntry,
            const SfxPoolItem& rItem,
            const SvXMLUnitConverter& rUnitConverter,
            const SvXMLNamespaceMap& rNamespaceMap,
            const SfxItemSet& rSet,
            sal_uInt16 nFlags ) const;
};

SwXMLTextItemMapper_Impl::SwXMLTextItemMapper_Impl(
                SvXMLItemMapEntriesRef rMapEntries,
                SvXMLUnitConverter& rUnitConverter,
                const Reference< xml::sax::XDocumentHandler > & rHandler ) :
    SvXMLExportItemMapper( rMapEntries ),
    mrUnitConverter(rUnitConverter),
    mrHandler( rHandler ),
    maTabStopExport( rHandler, rUnitConverter )
{
}

SwXMLTextItemMapper_Impl::~SwXMLTextItemMapper_Impl()
{
}

/** this method is called for every item that has the
    MID_FLAG_ELEMENT_EXPORT flag set */
void SwXMLTextItemMapper_Impl::handleElementItem(
    const Reference< xml::sax::XDocumentHandler > & rHandler,
    const SvXMLItemMapEntry& rEntry,
    const SfxPoolItem& rItem,
    const SvXMLUnitConverter& rUnitConverter,
    const SvXMLNamespaceMap& rNamespaceMap,
    const SfxItemSet&,
    sal_uInt16 ) const
{
    switch( rEntry.nWhichId )
    {
    case RES_PARATR_TABSTOP:
        {
            SvxXMLTabStopExport aTabStopExport( rHandler, rUnitConverter );

            Any aAny;
            rItem.QueryValue( aAny, 0 );
            aTabStopExport.Export( aAny, rNamespaceMap );
        }
        break;
    case RES_PARATR_DROP:
        {
            SwXMLFmtDropExport aFmtDropExport( rHandler, rUnitConverter );
            aFmtDropExport.exportXML( (const SwFmtDrop&)rItem, rNamespaceMap );
        }
        break;
    case RES_BACKGROUND:
        {
            SwXMLBrushItemExport aBrushItemExport( rHandler, rUnitConverter );
            aBrushItemExport.exportXML( (const SvxBrushItem&)rItem,
                                         rNamespaceMap );
        }
        break;
    }
}
#endif

// ----------------------------------------------------------------------------

class SwXMLTableItemMapper_Impl: public SvXMLExportItemMapper
{
    const OUString sCDATA;

protected:
    SvXMLUnitConverter& mrUnitConverter;
    const Reference< xml::sax::XDocumentHandler > & mrHandler;

    sal_uInt32 nAbsWidth;

    void AddAttribute( sal_uInt16 nPrefix, const sal_Char *pLName,
                       const OUString& rValue,
                       const SvXMLNamespaceMap& rNamespaceMap,
                       SvXMLAttributeList& rAttrList ) const;

public:

    SwXMLTableItemMapper_Impl(
            SvXMLItemMapEntriesRef rMapEntries,
            SvXMLUnitConverter& rUnitConverter,
            const Reference< xml::sax::XDocumentHandler > & rHandler );

    virtual ~SwXMLTableItemMapper_Impl();

    virtual void handleSpecialItem( SvXMLAttributeList& rAttrList,
                                    const SvXMLItemMapEntry& rEntry,
                                    const SfxPoolItem& rItem,
                                    const SvXMLUnitConverter& rUnitConverter,
                                    const SvXMLNamespaceMap& rNamespaceMap,
                                    const SfxItemSet *pSet = NULL ) const;

    virtual void handleElementItem(
            const Reference< xml::sax::XDocumentHandler > & rHandler,
            const SvXMLItemMapEntry& rEntry,
            const SfxPoolItem& rItem,
            const SvXMLUnitConverter& rUnitConverter,
            const SvXMLNamespaceMap& rNamespaceMap,
            const SfxItemSet& rSet,
            sal_uInt16 nFlags ) const;

    inline void SetAbsWidth( sal_uInt32 nAbs );
};

SwXMLTableItemMapper_Impl::SwXMLTableItemMapper_Impl(
        SvXMLItemMapEntriesRef rMapEntries,
        SvXMLUnitConverter& rUnitConverter,
        const Reference< xml::sax::XDocumentHandler > & rHandler ) :
    SvXMLExportItemMapper( rMapEntries ),
    sCDATA( OUString::createFromAscii( sXML_CDATA ) ),
    mrUnitConverter(rUnitConverter),
    mrHandler( rHandler ),
    nAbsWidth( USHRT_MAX )
{
}

SwXMLTableItemMapper_Impl::~SwXMLTableItemMapper_Impl()
{
}

void SwXMLTableItemMapper_Impl::AddAttribute( sal_uInt16 nPrefix,
        const sal_Char *pLName,
        const OUString& rValue,
        const SvXMLNamespaceMap& rNamespaceMap,
        SvXMLAttributeList& rAttrList ) const
{
    OUString sLName( OUString::createFromAscii(pLName) );
    OUString sName( rNamespaceMap.GetQNameByKey( nPrefix, sLName ) );
    rAttrList.AddAttribute( sName, sCDATA, rValue );
}

void SwXMLTableItemMapper_Impl::handleSpecialItem(
        SvXMLAttributeList& rAttrList,
        const SvXMLItemMapEntry& rEntry,
        const SfxPoolItem& rItem,
        const SvXMLUnitConverter& rUnitConverter,
        const SvXMLNamespaceMap& rNamespaceMap,
        const SfxItemSet *pSet ) const
{
    switch( rEntry.nWhichId )
    {
    case RES_LR_SPACE:
        {
            const SfxPoolItem *pItem;
            if( pSet &&
                SFX_ITEM_SET == pSet->GetItemState( RES_HORI_ORIENT, sal_True,
                                                    &pItem ) )
            {
                SwHoriOrient eHoriOrient =
                    ((const SwFmtHoriOrient *)pItem)->GetHoriOrient();
                sal_Bool bExport = sal_False;
                sal_uInt32 nMemberId = rEntry.nMemberId & MID_FLAG_MASK;
                switch( nMemberId )
                {
                case MID_L_MARGIN:
                    bExport = HORI_NONE == eHoriOrient ||
                              HORI_LEFT_AND_WIDTH == eHoriOrient;
                    break;
                case MID_R_MARGIN:
                    bExport = HORI_NONE == eHoriOrient;
                    break;
                }
                OUString sValue;
                if( bExport && rItem.exportXML( sValue, nMemberId,
                                                rUnitConverter ) )
                {
                    AddAttribute( rEntry.nNameSpace, rEntry.pLocalName, sValue,
                                  rNamespaceMap, rAttrList );
                }
            }
        }
        break;

    case RES_FRM_SIZE:
        {
            sal_uInt32 nMemberId = rEntry.nMemberId & MID_FLAG_MASK;
            switch( nMemberId )
            {
            case MID_FRMSIZE_WIDTH:
                if( nAbsWidth )
                {
                    OUStringBuffer sBuffer;
                    rUnitConverter.convertMeasure( sBuffer, nAbsWidth );
                    AddAttribute( rEntry.nNameSpace, rEntry.pLocalName,
                                  sBuffer.makeStringAndClear(),
                                  rNamespaceMap, rAttrList );
                }
                break;
            case MID_FRMSIZE_REL_WIDTH:
                {
                    OUString sValue;
                    if( rItem.exportXML( sValue, nMemberId, rUnitConverter ) )
                    {
                        AddAttribute( rEntry.nNameSpace, rEntry.pLocalName,
                                      sValue, rNamespaceMap, rAttrList );
                    }
                }
                break;
            }
        }
        break;
    }
}

/** this method is called for every item that has the
    MID_FLAG_ELEMENT_EXPORT flag set */
void SwXMLTableItemMapper_Impl::handleElementItem(
        const Reference< xml::sax::XDocumentHandler > & rHandler,
        const SvXMLItemMapEntry& rEntry,
        const SfxPoolItem& rItem,
        const SvXMLUnitConverter& rUnitConverter,
        const SvXMLNamespaceMap& rNamespaceMap,
        const SfxItemSet&,
        sal_uInt16 ) const
{
    switch( rEntry.nWhichId )
    {
    case RES_BACKGROUND:
        {
            SwXMLBrushItemExport aBrushItemExport( rHandler, rUnitConverter );
            aBrushItemExport.exportXML( (const SvxBrushItem&)rItem,
                                         rNamespaceMap );
        }
        break;
    }
}

inline void SwXMLTableItemMapper_Impl::SetAbsWidth( sal_uInt32 nAbs )
{
    nAbsWidth = nAbs;
}

// ----------------------------------------------------------------------------

void SwXMLExport::_InitItemExport()
{
    pTwipUnitConv = new SvXMLUnitConverter( MAP_TWIP,
                                GetMM100UnitConverter().getXMLMeasureUnit() );

#ifdef XML_CORE_API
    SvXMLItemMapEntriesRef xParaItemMap =
        new SvXMLItemMapEntries( aXMLParaItemMap );

    pParaItemMapper = new SwXMLTextItemMapper_Impl( xParaItemMap,
                                                      *pTwipUnitConv,
                                                      GetDocHandler() );
#endif

    xTableItemMap = new SvXMLItemMapEntries( aXMLTableItemMap );
    xTableRowItemMap = new SvXMLItemMapEntries( aXMLTableRowItemMap );
    xTableCellItemMap = new SvXMLItemMapEntries( aXMLTableCellItemMap );

    pTableItemMapper = new SwXMLTableItemMapper_Impl( xTableItemMap,
                                                       *pTwipUnitConv,
                                                       GetDocHandler() );
}

void SwXMLExport::_FinitItemExport()
{
#ifdef XML_CORE_API
    delete pParaItemMapper;
#endif
    delete pTableItemMapper;
    delete pTwipUnitConv;
}

void SwXMLExport::ExportTableFmt( const SwFrmFmt& rFmt, sal_uInt32 nAbsWidth )
{
    ((SwXMLTableItemMapper_Impl *)pTableItemMapper)
        ->SetAbsWidth( nAbsWidth );
    ExportFmt( rFmt, sXML_table );
}

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/xml/xmliteme.cxx,v 1.1.1.1 2000-09-18 17:14:59 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.10  2000/09/18 16:05:07  willem.vandorp
      OpenOffice header added.

      Revision 1.9  2000/08/02 14:52:39  mib
      text export continued

      Revision 1.8  2000/07/31 09:42:35  mib
      text export continued

      Revision 1.7  2000/06/08 09:45:54  aw
      changed to use functionality from xmloff project now

      Revision 1.6  2000/05/03 12:08:05  mib
      unicode

      Revision 1.5  2000/03/13 14:33:44  mib
      UNO3

      Revision 1.4  2000/02/11 14:41:45  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.3  2000/02/07 10:03:28  mib
      #70271#: tables

      Revision 1.2  2000/01/20 14:03:58  mib
      #70271#: deletion of unit converter

      Revision 1.1  1999/12/14 07:32:49  mib
      #70271#: XML import/export of drop cap/register/language item, splitted swxmlat


*************************************************************************/

diff --git a/sw/source/filter/xml/xmlitemi.cxx b/sw/source/filter/xml/xmlitemi.cxx
new file mode 100644
index 0000000..4fae5b3
--- /dev/null
+++ b/sw/source/filter/xml/xmlitemi.cxx
@@ -0,0 +1,638 @@
/*************************************************************************
 *
 *  $RCSfile: xmlitemi.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:15:00 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#include <hintids.hxx>

#ifndef _RTL_USTRING_HXX_
#include <rtl/ustring.hxx>
#endif
#ifndef _RSCSFX_HXX
#include <rsc/rscsfx.hxx>
#endif

#ifndef _XMLOFF_XMLITMAP_HXX
#include <xmloff/xmlitmap.hxx>
#endif
#ifndef _XMLOFF_XMLIMPIT_HXX
#include <xmloff/xmlimpit.hxx>
#endif
#ifndef _XMLOFF_XMLITEM_HXX
#include <xmloff/xmlitem.hxx>
#endif
#ifndef _XMLOFF_I18NMAP_HXX
#include <xmloff/i18nmap.hxx>
#endif
#ifndef _XMLOFF_XMLUCONV_HXX
#include <xmloff/xmluconv.hxx>
#endif
#ifndef _XMLOFF_FAMILIES_HXX
#include <xmloff/families.hxx>
#endif

#ifndef _SVX_UNOMID_HXX
#include <svx/unomid.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_FONTITEM_HXX
#include <svx/fontitem.hxx>
#endif
#ifndef _SVX_TSPTITEM_HXX
#include <svx/tstpitem.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX
#include <svx/brshitem.hxx>
#endif
#ifndef _SVX_LANGITEM_HXX
#include <svx/langitem.hxx>
#endif

#ifndef _XMLOFF_XMLTABI_HXX
//#include <xmloff/xmltabi.hxx>
#endif

#ifndef _XMLBRSHI_HXX
#include "xmlbrshi.hxx"
#endif

#ifndef _PARATR_HXX
#include <paratr.hxx>
#endif
#ifndef _DOC_HXX //autogen wg. SwDoc
#include <doc.hxx>
#endif
#ifndef _UNOMID_H
#include <unomid.h>
#endif

#ifndef _XMDROPI_HXX
#include "xmldropi.hxx"
#endif
#ifdef XML_CORE_API
#ifndef _XMLTBLI_HXX
#include "xmltbli.hxx"
#endif
#endif
#ifndef _XMLIMP_HXX
#include "xmlimp.hxx"
#endif

using namespace ::rtl;
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;

#ifdef XML_CORE_API
extern SvXMLItemMapEntry aXMLParaItemMap[];
#endif
extern SvXMLItemMapEntry aXMLTableItemMap[];
extern SvXMLItemMapEntry aXMLTableColItemMap[];
extern SvXMLItemMapEntry aXMLTableRowItemMap[];
extern SvXMLItemMapEntry aXMLTableCellItemMap[];

#ifdef XML_CORE_API
class SwXMLImportTextItemMapper_Impl: public SvXMLImportItemMapper
{
    SvI18NMap&  rI18NMap;
    SwDoc& rDoc;

public:

    SwXMLImportTextItemMapper_Impl( SvXMLItemMapEntriesRef rMapEntries,
                                SwDoc& rD, SvI18NMap& rI18NMap );
    virtual ~SwXMLImportTextItemMapper_Impl();

    virtual sal_Bool handleSpecialItem( const SvXMLItemMapEntry& rEntry,
                                SfxPoolItem& rItem,
                                SfxItemSet& rSet,
                                const OUString& rValue,
                                const SvXMLUnitConverter& rUnitConverter,
                                const SvXMLNamespaceMap& rNamespaceMap ) const;

    virtual void finished( SfxItemSet& rSet ) const;
};

SwXMLImportTextItemMapper_Impl::SwXMLImportTextItemMapper_Impl(
                                        SvXMLItemMapEntriesRef rMapEntries,
                                        SwDoc& rD, SvI18NMap& rI18NM ) :
    SvXMLImportItemMapper( rMapEntries, RES_UNKNOWNATR_CONTAINER),
    rDoc( rD ),
    rI18NMap( rI18NM )
{
}

SwXMLImportTextItemMapper_Impl::~SwXMLImportTextItemMapper_Impl()
{
}

sal_Bool SwXMLImportTextItemMapper_Impl::handleSpecialItem(
                                        const SvXMLItemMapEntry& rEntry,
                                        SfxPoolItem& rItem,
                                        SfxItemSet& rItemSet,
                                        const OUString& rValue,
                                        const SvXMLUnitConverter& rUnitConv,
                                        const SvXMLNamespaceMap& ) const
{
    sal_Bool bRet = sal_False;
    switch( rItem.Which() )
    {
    case RES_TXTATR_CHARFMT:
        DBG_ASSERT( !this,
    "SwXMLImportTextItemMapper_Impl::handleSpecialItem: char fmt unexpected" );
        break;

    case RES_PARATR_NUMRULE:
        if( rValue.getLength() )
        {
            OUString sName( rI18NMap.Get( SFX_STYLE_FAMILY_PSEUDO, rValue ) );
            ((SwNumRuleItem&)rItem).SetValue( sName );
            bRet = sal_True;
        }
        break;

    case RES_CHRATR_LANGUAGE:
        // If the item is not contained in the item set, its the default
        // value. To set language and contry individually, we have to clear
        // its value.
        if( SFX_ITEM_SET != rItemSet.GetItemState( RES_CHRATR_LANGUAGE,
                                                   sal_False ) )
        {
            ((SvxLanguageItem &)rItem).SetLanguage( LANGUAGE_NONE );
        }
        bRet = rItem.importXML( rValue, rEntry.nMemberId, rUnitConv );
        break;
    }

    return bRet;
}

void SwXMLImportTextItemMapper_Impl::finished( SfxItemSet& rSet ) const
{
    const SfxPoolItem *pItem;

    if( SFX_ITEM_SET == rSet.GetItemState( RES_CHRATR_FONT, sal_False,
                                           &pItem ) )
    {
        const SvxFontItem *pFont = (const SvxFontItem *)pItem;
        // delete font items that have no family name
         if( 0 == pFont->GetFamilyName().Len() )
            rSet.ClearItem( RES_CHRATR_FONT );
        else if( RTL_TEXTENCODING_DONTKNOW == pFont->GetCharSet() )
        {
            SvxFontItem aFont( *pFont );
            aFont.GetCharSet() = gsl_getSystemTextEncoding();
            rSet.Put( aFont );
        }
    }

    // ensure that box item have a distance to a border.
    if( SFX_ITEM_SET == rSet.GetItemState( RES_BOX, sal_False, &pItem ) )
    {
        const SvxBoxItem *pBox = (const SvxBoxItem *)pItem;
        sal_uInt16 aLines[4] = { BOX_LINE_TOP, BOX_LINE_BOTTOM,
                             BOX_LINE_LEFT, BOX_LINE_RIGHT };
        sal_uInt16 i;
        for( i=0; i<4; i++ )
        {
            if( pBox->GetLine( aLines[i] ) &&
                pBox->GetDistance( aLines[i] ) < MIN_BORDER_DIST )
                break;
        }
        if( i < 4 )
        {
            SvxBoxItem aBox( *pBox );
            for( /*i=0*/; i<4; i++ )    // i points to the mod. line
            {
                if( aBox.GetLine( aLines[i] ) &&
                    aBox.GetDistance( aLines[i] ) < MIN_BORDER_DIST )
                    aBox.SetDistance( MIN_BORDER_DIST, aLines[i] );
            }
            rSet.Put( aBox );
        }
    }
}
#endif

// ---------------------------------------------------------------------

class SwXMLImportTableItemMapper_Impl: public SvXMLImportItemMapper
{

public:

    SwXMLImportTableItemMapper_Impl( SvXMLItemMapEntriesRef rMapEntries );
    virtual ~SwXMLImportTableItemMapper_Impl();

    virtual sal_Bool handleSpecialItem( const SvXMLItemMapEntry& rEntry,
                                SfxPoolItem& rItem,
                                SfxItemSet& rSet,
                                const OUString& rValue,
                                const SvXMLUnitConverter& rUnitConverter,
                                const SvXMLNamespaceMap& rNamespaceMap ) const;
    virtual void finished( SfxItemSet& rSet ) const;
};

SwXMLImportTableItemMapper_Impl::SwXMLImportTableItemMapper_Impl(
                                        SvXMLItemMapEntriesRef rMapEntries ) :
    SvXMLImportItemMapper( rMapEntries, RES_UNKNOWNATR_CONTAINER)
{
}

SwXMLImportTableItemMapper_Impl::~SwXMLImportTableItemMapper_Impl()
{
}

sal_Bool SwXMLImportTableItemMapper_Impl::handleSpecialItem(
                                        const SvXMLItemMapEntry& rEntry,
                                        SfxPoolItem& rItem,
                                        SfxItemSet& rItemSet,
                                        const OUString& rValue,
                                        const SvXMLUnitConverter& rUnitConv,
                                        const SvXMLNamespaceMap& ) const
{
    sal_Bool bRet = sal_False;
    sal_uInt16 nMemberId = rEntry.nMemberId & MID_FLAG_MASK;
    switch( rItem.Which() )
    {
    case RES_FRM_SIZE:
        switch( nMemberId )
        {
        case MID_FRMSIZE_COL_WIDTH:
            // If the item is existing already, a relative value has been set
            // already that must be preserved.
            if( SFX_ITEM_SET != rItemSet.GetItemState( RES_FRM_SIZE,
                                                       sal_False ) )
                bRet = rItem.importXML( rValue, nMemberId, rUnitConv );
            break;
        }
    }

    return bRet;
}

void SwXMLImportTableItemMapper_Impl::finished( SfxItemSet& rSet ) const
{
#if 0
    const SfxPoolItem *pItem;

    // ensure that box item have a distance to a border.
    if( SFX_ITEM_SET == rSet.GetItemState( RES_BOX, sal_False, &pItem ) )
    {
        const SvxBoxItem *pBox = (const SvxBoxItem *)pItem;
        sal_uInt16 aLines[4] = { BOX_LINE_TOP, BOX_LINE_BOTTOM,
                             BOX_LINE_LEFT, BOX_LINE_RIGHT };
        sal_uInt16 i;
        for( i=0; i<4; i++ )
        {
            if( pBox->GetLine( aLines[i] ) &&
                pBox->GetDistance( aLines[i] ) < MIN_BORDER_DIST )
                break;
        }
        if( i < 4 )
        {
            SvxBoxItem aBox( *pBox );
            for( /*i=0*/; i<4; i++ )    // i points to the mod. line
            {
                if( aBox.GetLine( aLines[i] ) &&
                    aBox.GetDistance( aLines[i] ) < MIN_BORDER_DIST )
                    aBox.SetDistance( MIN_BORDER_DIST, aLines[i] );
            }
            rSet.Put( aBox );
        }
    }
#endif
}

// ---------------------------------------------------------------------

class SwXMLItemSetContext_Impl : public SvXMLItemSetContext
{
    SvXMLImportContextRef xBackground;
#ifdef XML_CORE_API
    SvXMLImportContextRef xTabStop;
    SvXMLImportContextRef xDropCap;
#endif

public:
    SwXMLItemSetContext_Impl( SwXMLImport& rImport, sal_uInt16 nPrfx,
                  const OUString& rLName,
                  const Reference< xml::sax::XAttributeList > & xAttrList,
                  SfxItemSet&  rItemSet,
                  const SvXMLImportItemMapper& rIMapper,
                  const SvXMLUnitConverter& rUnitConv );
    virtual ~SwXMLItemSetContext_Impl();

    virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
                   const OUString& rLocalName,
                   const Reference< xml::sax::XAttributeList > & xAttrList,
                   SfxItemSet&  rItemSet,
                   const SvXMLItemMapEntry& rEntry,
                   const SvXMLUnitConverter& rUnitConv );
};

SwXMLItemSetContext_Impl::SwXMLItemSetContext_Impl(
                 SwXMLImport& rImport, sal_uInt16 nPrfx,
                 const OUString& rLName,
                 const Reference< xml::sax::XAttributeList > & xAttrList,
                 SfxItemSet&  rItemSet,
                 const SvXMLImportItemMapper& rIMapper,
                 const SvXMLUnitConverter& rUnitConv ) :
    SvXMLItemSetContext( rImport, nPrfx, rLName, xAttrList,
                         rItemSet, rIMapper, rUnitConv )
{
}

SwXMLItemSetContext_Impl::~SwXMLItemSetContext_Impl()
{
#ifdef XML_CORE_API
    if( xTabStop.Is() )
    {
        Any aAny;
        ((SvxXMLTabStopImportContext*)&xTabStop)->fillTabStops( aAny );
        SvxTabStopItem aTabStop( RES_PARATR_TABSTOP );
        ((SfxPoolItem *)&aTabStop)->PutValue( aAny, 0 );
        rItemSet.Put( aTabStop );
    }
    if( xDropCap.Is() )
    {
        const SwFmtDrop& rItem =
            ((SwXMLFmtDropImportContext*)&xDropCap)->GetItem();
        rItemSet.Put( rItem );
    }
#endif
    if( xBackground.Is() )
    {
        const SvxBrushItem& rItem =
            ((SwXMLBrushItemImportContext*)&xBackground)->GetItem();
        rItemSet.Put( rItem );
    }
}

SvXMLImportContext *SwXMLItemSetContext_Impl::CreateChildContext(
                   sal_uInt16 nPrefix,
                   const OUString& rLocalName,
                   const Reference< xml::sax::XAttributeList > & xAttrList,
                   SfxItemSet&  rItemSet,
                   const SvXMLItemMapEntry& rEntry,
                   const SvXMLUnitConverter& rUnitConv )
{
    SvXMLImportContext *pContext = 0;

    switch( rEntry.nWhichId )
    {
#ifdef XML_CORE_API
    case RES_PARATR_TABSTOP:
        pContext = new SvxXMLTabStopImportContext( GetImport(), nPrefix,
                                                   rLocalName, rUnitConv );
        xTabStop = pContext;
        break;

    case RES_PARATR_DROP:
        pContext = new SwXMLFmtDropImportContext( (SwXMLImport&)GetImport(),
                                                  nPrefix, rLocalName,
                                                  xAttrList, rUnitConv,
                                                  RES_PARATR_DROP );
        xDropCap = pContext;
        break;
#endif

    case RES_BACKGROUND:
        {
            const SfxPoolItem *pItem;
            if( SFX_ITEM_SET == rItemSet.GetItemState( RES_BACKGROUND,
                                                       sal_False, &pItem ) )
            {
                pContext = new SwXMLBrushItemImportContext(
                                GetImport(), nPrefix, rLocalName, xAttrList,
                                rUnitConv, *(const SvxBrushItem *)pItem );
            }
            else
            {
                pContext = new SwXMLBrushItemImportContext(
                                GetImport(), nPrefix, rLocalName, xAttrList,
                                rUnitConv, RES_BACKGROUND );
            }
            xBackground = pContext;
        }
        break;
    }

    if( !pContext )
        pContext = SvXMLItemSetContext::CreateChildContext( nPrefix, rLocalName,
                                                            xAttrList, rItemSet,
                                                            rEntry, rUnitConv );

    return pContext;
}

// ---------------------------------------------------------------------

void SwXMLImport::_InitItemImport()
{
    pTwipUnitConv = new SvXMLUnitConverter( MAP_TWIP, MAP_TWIP );

#ifdef XML_CORE_API
    SvXMLItemMapEntriesRef xParaItemMapEntries =
        new SvXMLItemMapEntries( aXMLParaItemMap );

    pParaItemMapper = new SwXMLImportTextItemMapper_Impl( xParaItemMapEntries,
                                                      GetDoc(), GetI18NMap() );
#endif

    xTableItemMap = new SvXMLItemMapEntries( aXMLTableItemMap );
    xTableColItemMap = new SvXMLItemMapEntries( aXMLTableColItemMap );
    xTableRowItemMap = new SvXMLItemMapEntries( aXMLTableRowItemMap );
    xTableCellItemMap = new SvXMLItemMapEntries( aXMLTableCellItemMap );

    pTableItemMapper = new SwXMLImportTableItemMapper_Impl( xTableItemMap );
}

void SwXMLImport::_FinitItemImport()
{
#ifdef XML_CORE_API
    delete pParaItemMapper;
#endif
    delete pTableItemMapper;
    delete pTwipUnitConv;
}

#ifdef XML_CORE_API
SvXMLImportContext *SwXMLImport::CreateParaItemImportContext(
                  sal_uInt16 nPrefix,
                  const OUString& rLocalName,
                  const Reference< xml::sax::XAttributeList > & xAttrList,
                  SfxItemSet& rItemSet )
{
    return new SwXMLItemSetContext_Impl( *this, nPrefix, rLocalName,
                                            xAttrList, rItemSet,
                                            GetParaItemMapper(),
                                            GetTwipUnitConverter() );
}
#endif

SvXMLImportContext *SwXMLImport::CreateTableItemImportContext(
                  sal_uInt16 nPrefix,
                  const OUString& rLocalName,
                  const Reference< xml::sax::XAttributeList > & xAttrList,
#ifdef XML_CORE_API
                  sal_uInt16 nSubFamily,
#else
                  sal_uInt16 nFamily,
#endif
                  SfxItemSet& rItemSet )
{
    SvXMLItemMapEntriesRef xItemMap;

#ifdef XML_CORE_API
    switch( nSubFamily )
#else
    switch( nFamily )
#endif
    {
#ifdef XML_CORE_API
    case SW_STYLE_SUBFAMILY_TABLE:
#else
    case XML_STYLE_FAMILY_TABLE_TABLE:
#endif
        xItemMap = xTableItemMap;
        break;
#ifdef XML_CORE_API
    case SW_STYLE_SUBFAMILY_TABLE_COL:
#else
    case XML_STYLE_FAMILY_TABLE_COLUMN:
#endif
        xItemMap = xTableColItemMap;
        break;
#ifdef XML_CORE_API
    case SW_STYLE_SUBFAMILY_TABLE_LINE:
#else
    case XML_STYLE_FAMILY_TABLE_ROW:
#endif
        xItemMap = xTableRowItemMap;
        break;
#ifdef XML_CORE_API
    case SW_STYLE_SUBFAMILY_TABLE_BOX:
#else
    case XML_STYLE_FAMILY_TABLE_CELL:
#endif
        xItemMap = xTableCellItemMap;
        break;
    }

    pTableItemMapper->setMapEntries( xItemMap );

    return new SwXMLItemSetContext_Impl( *this, nPrefix, rLocalName,
                                            xAttrList, rItemSet,
                                            GetTableItemMapper(),
                                            GetTwipUnitConverter() );
}

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/xml/xmlitemi.cxx,v 1.1.1.1 2000-09-18 17:15:00 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.11  2000/09/18 16:05:07  willem.vandorp
      OpenOffice header added.

      Revision 1.10  2000/08/24 11:16:41  mib
      text import continued

      Revision 1.9  2000/08/02 14:52:39  mib
      text export continued

      Revision 1.8  2000/06/08 09:45:54  aw
      changed to use functionality from xmloff project now

      Revision 1.7  2000/05/03 12:08:05  mib
      unicode

      Revision 1.6  2000/03/13 14:33:44  mib
      UNO3

      Revision 1.5  2000/02/17 14:40:30  mib
      #70271#: XML table import

      Revision 1.3  2000/01/20 14:03:57  mib
      #70271#: deletion of unit converter

      Revision 1.2  2000/01/06 15:08:28  mib
      #70271#:separation of text/layout, cond. styles, adaptions to wd-xlink-19991229

      Revision 1.1  1999/12/14 07:32:58  mib
      #70271#: XML import/export of drop cap/register/language item, splitted swxmlat


*************************************************************************/

diff --git a/sw/source/filter/xml/xmlitemm.cxx b/sw/source/filter/xml/xmlitemm.cxx
new file mode 100644
index 0000000..a8f210f
--- /dev/null
+++ b/sw/source/filter/xml/xmlitemm.cxx
@@ -0,0 +1,548 @@
/*************************************************************************
 *
 *  $RCSfile: xmlitemm.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:15:00 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#include <hintids.hxx>

#ifndef _SVX_UNOMID_HXX
#include <svx/unomid.hxx>
#endif

#ifndef _XMLOFF_XMLNMSPE_HXX
#include <xmloff/xmlnmspe.hxx>
#endif
#ifndef _XMLOFF_XMLITMAP_HXX
#include <xmloff/xmlitmap.hxx>
#endif
#ifndef _XMLOFF_XMLKYWD_HXX
#include <xmloff/xmlkywd.hxx>
#endif

#ifndef _UNOMID_H
#include <unomid.h>
#endif

#define M_E( p, l, w, m ) \
    { XML_NAMESPACE_##p, sXML_##l, w, m }
#define M_E_SI( p, l, w, m ) \
    { XML_NAMESPACE_##p, sXML_##l, w, MID_FLAG_SPECIAL_ITEM_IMPORT|m }
#define M_E_SE( p, l, w, m ) \
    { XML_NAMESPACE_##p, sXML_##l, w, MID_FLAG_SPECIAL_ITEM_EXPORT|m }

#ifdef XML_CORE_API
SvXMLItemMapEntry aXMLParaItemMap[] =
{
    // RES_CHRATR_CASEMAP
    M_E( FO,    font_variant,       RES_CHRATR_CASEMAP, MID_CASEMAP_VARIANT ),
    M_E( FO,    text_transform,     RES_CHRATR_CASEMAP, MID_CASEMAP_TRANS ),
    // RES_CHRATR_COLOR
    M_E( FO,    color,              RES_CHRATR_COLOR,   0 ),
    // RES_CHRATR_CONTOUR
    M_E( STYLE, text_outline,       RES_CHRATR_CONTOUR, 0 ),
    // RES_CHRATR_CROSSEDOUT
    M_E( STYLE, text_crossing_out,  RES_CHRATR_CROSSEDOUT, 0 ),
    // RES_CHRATR_ESCAPEMENT
    M_E( STYLE, text_position,      RES_CHRATR_ESCAPEMENT, 0 ),
    // RES_CHRATR_FONT
    M_E( FO,    font_family,        RES_CHRATR_FONT,    MID_FONT_FAMILY_NAME ),
    M_E( STYLE, font_style_name,    RES_CHRATR_FONT,    MID_FONT_STYLE_NAME ),
    M_E( STYLE, font_family_generic,RES_CHRATR_FONT,    MID_FONT_FAMILY ),
    M_E( STYLE, font_pitch,         RES_CHRATR_FONT,    MID_FONT_PITCH ),
    M_E( STYLE, font_charset,       RES_CHRATR_FONT,    MID_FONT_CHAR_SET ),
    // RES_CHRATR_FONTSIZE
    M_E( FO,    font_size,          RES_CHRATR_FONTSIZE, 0 ),
    // RES_CHRATR_KERNING
    M_E( FO,    letter_spacing,     RES_CHRATR_KERNING, 0 ),
    // RES_CHRATR_LANGUAGE
    M_E_SI( FO, language,           RES_CHRATR_LANGUAGE,    MID_LANGUAGE ),
    M_E_SI( FO, country,            RES_CHRATR_LANGUAGE,    MID_COUNTRY ),
    // RES_CHRATR_POSTURE
    M_E( FO,    font_style,         RES_CHRATR_POSTURE, 0 ),
    // RES_CHRATR_PROPORTIONALFONTSIZE
    // TODO: not used?
    // RES_CHRATR_SHADOWED
    M_E( FO,    text_shadow,        RES_CHRATR_SHADOWED, 0 ),
    // RES_CHRATR_UNDERLINE
    M_E( STYLE, text_underline,     RES_CHRATR_UNDERLINE, 0 ),
    // RES_CHRATR_WEIGHT
    M_E( FO,    font_weight,        RES_CHRATR_WEIGHT,  0 ),
    // RES_CHRATR_WORDLINEMODE
    M_E( FO,    score_spaces,       RES_CHRATR_WORDLINEMODE, 0 ),
    // RES_CHRATR_AUTOKERN
    M_E( STYLE, letter_kerning,     RES_CHRATR_AUTOKERN, 0 ),
    // RES_CHRATR_BLINK
    M_E( STYLE, text_blinking,      RES_CHRATR_BLINK,   0 ),
    // RES_CHRATR_NOHYPHEN
    // TODO: not used?
    // RES_CHRATR_NOLINEBREAK
    // TODO: not used?
    // RES_CHRATR_BACKGROUND
    M_E( FO,    text_background_color, RES_CHRATR_BACKGROUND, MID_BACK_COLOR ),
    // RES_TXTATR_INETFMT
    // TODO
    // RES_TXTATR_REFMARK
    // TODO
    // RES_TXTATR_TOXMARK
    // TODO
    // RES_TXTATR_CHARFMT
    M_E_SI( TEXT,   style_name,         RES_TXTATR_CHARFMT, 0 ),
    // RES_TXTATR_FIELD
    // TODO
    // RES_TXTATR_FLYCNT
    // TODO
    // RES_TXTATR_FTN
    // TODO
    // RES_TXTATR_SOFTHYPH
    // TODO
    // RES_TXTATR_HARDBLANK
    // TODO

    // RES_PARATR_LINESPACING
    M_E( FO,    line_height,            RES_PARATR_LINESPACING, MID_LS_FIXED ),
    M_E( STYLE, line_height_at_least,   RES_PARATR_LINESPACING, MID_LS_MINIMUM ),
    M_E( STYLE, line_spacing,           RES_PARATR_LINESPACING, MID_LS_DISTANCE ),
    // RES_PARATR_ADJUST
    M_E( FO,    text_align,         RES_PARATR_ADJUST,  MID_PARA_ADJUST ),
    M_E( FO,    text_align_last,    RES_PARATR_ADJUST,  MID_LAST_LINE_ADJUST ),
    M_E( STYLE, justify_single_word,RES_PARATR_ADJUST,  MID_EXPAND_SINGLE ),
    // RES_PARATR_SPLIT
    M_E( STYLE, break_inside,       RES_PARATR_SPLIT,   0 ),
    // RES_PARATR_ORPHANS
    M_E( FO,    orphans,            RES_PARATR_ORPHANS, 0 ),
    // RES_PARATR_WIDOWS
    M_E( FO,    widows,             RES_PARATR_WIDOWS,  0 ),
    // RES_PARATR_TABSTOP
    M_E( STYLE, tabstop_tab_stops,  RES_PARATR_TABSTOP, MID_FLAG_ELEMENT_ITEM ),
    // RES_PARATR_HYPHENZONE
    M_E( FO,    hyphenate,                      RES_PARATR_HYPHENZONE,
                                                MID_IS_HYPHEN ),
    M_E( FO,    hyphenation_remain_char_count,  RES_PARATR_HYPHENZONE,
                                                MID_HYPHEN_MIN_LEAD ),
    M_E( FO,    hyphenation_push_char_count,    RES_PARATR_HYPHENZONE,
                                                MID_HYPHEN_MIN_TRAIL ),
    M_E( FO,    hyphenation_ladder_count,       RES_PARATR_HYPHENZONE,
                                                MID_HYPHEN_MAX_HYPHENS ),
    // RES_PARATR_DROP
    M_E( STYLE, drop_cap,           RES_PARATR_DROP,    MID_FLAG_ELEMENT_ITEM ),
    // RES_PARATR_REGISTER
    M_E( STYLE, register_true,      RES_PARATR_REGISTER,    0 ),
    // RES_PARATR_NUMRULE
    // not required

    // RES_FILL_ORDER
    // not required
    // RES_FRM_SIZE
    // not required
    // RES_PAPER_BIN
    // not required
    // RES_LR_SPACE
    M_E( FO,    margin_left,        RES_LR_SPACE,   MID_L_MARGIN ),
    M_E( FO,    margin_right,       RES_LR_SPACE,   MID_R_MARGIN ),
    M_E( FO,    text_indent,        RES_LR_SPACE,   MID_FIRST_LINE_INDENT ),
    M_E( STYLE, auto_text_indent,   RES_LR_SPACE,   MID_FIRST_AUTO ),
    // RES_UL_SPACE
    M_E( FO,    margin_top,         RES_UL_SPACE,   MID_UP_MARGIN ),
    M_E( FO,    margin_bottom,      RES_UL_SPACE,   MID_LO_MARGIN ),
    // RES_PAGEDESC
    // TODO
    // RES_BREAK
    M_E( FO,    break_before,       RES_BREAK,  MID_BREAK_BEFORE ),
    M_E( FO,    break_after,        RES_BREAK,  MID_BREAK_AFTER ),
    // RES_CNTNT
    // not required
    // RES_HEADER
    // not required
    // RES_FOOTER
    // not required
    // RES_PRINT
    // not required
    // RES_OPAQUE
    // not required
    // RES_PROTECT
    // not required
    // RES_SURROUND
    // not required
    // RES_VERT_ORIENT
    // not required
    // RES_HORI_ORIENT
    // not required
    // RES_ANCHOR
    // not required
    // RES_BACKGROUND
    M_E( FO,    background_color,       RES_BACKGROUND, MID_BACK_COLOR ),
    M_E( STYLE, background_image,       RES_BACKGROUND, MID_FLAG_ELEMENT_ITEM ),
    // RES_BOX
    M_E( STYLE, border_line_width,        RES_BOX, ALL_BORDER_LINE_WIDTH ),
    M_E( STYLE, border_line_width_left,   RES_BOX, LEFT_BORDER_LINE_WIDTH ),
    M_E( STYLE, border_line_width_right,  RES_BOX, RIGHT_BORDER_LINE_WIDTH ),
    M_E( STYLE, border_line_width_top,    RES_BOX, TOP_BORDER_LINE_WIDTH ),
    M_E( STYLE, border_line_width_bottom, RES_BOX, BOTTOM_BORDER_LINE_WIDTH ),
    M_E( FO,    padding,                  RES_BOX, ALL_BORDER_PADDING ),
    M_E( FO,    padding_left,             RES_BOX, LEFT_BORDER_PADDING ),
    M_E( FO,    padding_right,            RES_BOX, RIGHT_BORDER_PADDING ),
    M_E( FO,    padding_top,              RES_BOX, TOP_BORDER_PADDING ),
    M_E( FO,    padding_bottom,           RES_BOX, BOTTOM_BORDER_PADDING ),
    M_E( FO,    border,                   RES_BOX, ALL_BORDER ),
    M_E( FO,    border_left,              RES_BOX, LEFT_BORDER ),
    M_E( FO,    border_right,             RES_BOX, RIGHT_BORDER ),
    M_E( FO,    border_top,               RES_BOX, TOP_BORDER ),
    M_E( FO,    border_bottom,            RES_BOX, BOTTOM_BORDER ),
    // RES_SHADOW
    M_E( STYLE, shadow,             RES_SHADOW, 0 ),
    // RES_FRMMACRO
    // not required
    // RES_COL
    // not required
    // RES_KEEP
    M_E( FO, keep_with_next,        RES_KEEP, 0 ),
    // RES_URL
    // not required
    // RES_EDIT_IN_READONLY
    // not required
    // RES_LAYOUT_SPLIT
    // not required
    // RES_CHAIN
    // not required
    // RES_LINENUMBER
    // TODO
    // RES_FTN_AT_TXTEND
    // not required
    // RES_END_AT_TXTEND
    // not required
    // RES_UNKNOWNATR_CONTAINER
    M_E_SE( TEXT, xmlns, RES_UNKNOWNATR_CONTAINER, 0 ),
    {0,0,0,0 }
};
#endif

SvXMLItemMapEntry aXMLTableItemMap[] =
{
    // RES_FILL_ORDER
    // not required
    // RES_FRM_SIZE
    M_E_SE( STYLE,  width,          RES_FRM_SIZE,   MID_FRMSIZE_WIDTH ),
    M_E_SE( STYLE,  rel_width,      RES_FRM_SIZE,   MID_FRMSIZE_REL_WIDTH ),
    // RES_PAPER_BIN
    // not required
    // TODO: RES_LR_SPACE
    M_E_SE( FO, margin_left,        RES_LR_SPACE,   MID_L_MARGIN ),
    M_E_SE( FO, margin_right,       RES_LR_SPACE,   MID_R_MARGIN ),
    // RES_UL_SPACE
    M_E( FO,    margin_top,         RES_UL_SPACE,   MID_UP_MARGIN ),
    M_E( FO,    margin_bottom,      RES_UL_SPACE,   MID_LO_MARGIN ),
    // RES_PAGEDESC
    // TODO
    // RES_BREAK
    M_E( FO,    break_before,       RES_BREAK,  MID_BREAK_BEFORE ),
    M_E( FO,    break_after,        RES_BREAK,  MID_BREAK_AFTER ),
    // RES_CNTNT
    // not required
    // RES_HEADER
    // not required
    // RES_FOOTER
    // not required
    // RES_PRINT
    // not required
    // RES_OPAQUE
    // not required
    // RES_PROTECT
    // not required
    // RES_SURROUND
    // not required
    // RES_VERT_ORIENT
    // not required
    // RES_HORI_ORIENT
    M_E( TABLE, align,                  RES_HORI_ORIENT, 0 ),
    // RES_ANCHOR
    // not required
    // RES_BACKGROUND
    M_E( FO,    background_color,       RES_BACKGROUND, MID_BACK_COLOR ),
    M_E( STYLE, background_image,       RES_BACKGROUND, MID_FLAG_ELEMENT_ITEM ),
    // RES_BOX
    // not required
    // RES_SHADOW
    M_E( STYLE, shadow,             RES_SHADOW, 0 ),
    // RES_FRMMACRO
    // not required
    // RES_COL
    // not required
    // RES_KEEP
    M_E( FO, keep_with_next,        RES_KEEP, 0 ),
    // RES_URL
    // not required
    // RES_EDIT_IN_READONLY
    // not required
    // RES_LAYOUT_SPLIT
    M_E( STYLE, may_break_between_rows, RES_LAYOUT_SPLIT, 0 ),
    // RES_CHAIN
    // not required
    // RES_LINENUMBER
    // not required
    // RES_FTN_AT_TXTEND
    // not required
    // RES_END_AT_TXTEND
    // not required
    // RES_UNKNOWNATR_CONTAINER
    M_E_SE( TEXT, xmlns, RES_UNKNOWNATR_CONTAINER, 0 ),
    {0,0,0,0 }
};

SvXMLItemMapEntry aXMLTableColItemMap[] =
{
    M_E_SI( STYLE,  column_width,     RES_FRM_SIZE, MID_FRMSIZE_COL_WIDTH ),
    M_E( STYLE,     rel_column_width, RES_FRM_SIZE, MID_FRMSIZE_REL_COL_WIDTH ),
    {0,0,0,0 }
};

SvXMLItemMapEntry aXMLTableRowItemMap[] =
{
    // RES_FILL_ORDER
    // not required
    // RES_FRM_SIZE
    M_E( STYLE, row_height,         RES_FRM_SIZE,   MID_FRMSIZE_FIX_HEIGHT ),
    M_E( STYLE, min_row_height,     RES_FRM_SIZE,   MID_FRMSIZE_MIN_HEIGHT ),
    // RES_PAPER_BIN
    // not required
    // RES_LR_SPACE
    // not required
    // RES_UL_SPACE
    // not required
    // RES_PAGEDESC
    // not required
    // RES_BREAK
    // not required
    // RES_CNTNT
    // not required
    // RES_HEADER
    // not required
    // RES_FOOTER
    // not required
    // RES_PRINT
    // not required
    // RES_OPAQUE
    // not required
    // RES_PROTECT
    // not required
    // RES_SURROUND
    // not required
    // RES_VERT_ORIENT
    // not required
    // RES_HORI_ORIENT
    // not required
    // RES_ANCHOR
    // not required
    // RES_BACKGROUND
    M_E( FO,    background_color,       RES_BACKGROUND, MID_BACK_COLOR ),
    M_E( STYLE, background_image,       RES_BACKGROUND, MID_FLAG_ELEMENT_ITEM ),
    // RES_BOX
    // not required
    // RES_ANCHOR
    // not required
    // RES_SHADOW
    // not required
    // RES_FRMMACRO
    // not required
    // RES_COL
    // not required
    // RES_KEEP
    // not required
    // RES_URL
    // not required
    // RES_EDIT_IN_READONLY
    // not required
    // RES_LAYOUT_SPLIT
    // not required
    // RES_CHAIN
    // not required
    // RES_LINENUMBER
    // not required
    // RES_FTN_AT_TXTEND
    // not required
    // RES_END_AT_TXTEND
    // not required
    // RES_UNKNOWNATR_CONTAINER
    M_E_SE( TEXT, xmlns, RES_UNKNOWNATR_CONTAINER, 0 ),
    {0,0,0,0 }
};

SvXMLItemMapEntry aXMLTableCellItemMap[] =
{
    // RES_FILL_ORDER
    // not required
    // RES_FRM_SIZE
    // not required
    // RES_PAPER_BIN
    // not required
    // RES_LR_SPACE
    // not required
    // RES_UL_SPACE
    // not required
    // RES_PAGEDESC
    // not required
    // RES_BREAK
    // not required
    // RES_CNTNT
    // not required
    // RES_HEADER
    // not required
    // RES_FOOTER
    // not required
    // RES_PRINT
    // not required
    // RES_OPAQUE
    // not required
    // RES_PROTECT
    // not required
    // RES_SURROUND
    // not required
    // RES_VERT_ORIENT
    M_E( TABLE, vertical_align,                 RES_VERT_ORIENT, 0 ),
    // RES_HORI_ORIENT
    // not required
    // RES_ANCHOR
    // not required
    // RES_BACKGROUND
    M_E( FO,    background_color,       RES_BACKGROUND, MID_BACK_COLOR ),
    M_E( STYLE, background_image,       RES_BACKGROUND, MID_FLAG_ELEMENT_ITEM ),
    // RES_BOX
    M_E( STYLE, border_line_width,        RES_BOX, ALL_BORDER_LINE_WIDTH ),
    M_E( STYLE, border_line_width_left,   RES_BOX, LEFT_BORDER_LINE_WIDTH ),
    M_E( STYLE, border_line_width_right,  RES_BOX, RIGHT_BORDER_LINE_WIDTH ),
    M_E( STYLE, border_line_width_top,    RES_BOX, TOP_BORDER_LINE_WIDTH ),
    M_E( STYLE, border_line_width_bottom, RES_BOX, BOTTOM_BORDER_LINE_WIDTH ),
    M_E( FO,    padding,                  RES_BOX, ALL_BORDER_PADDING ),
    M_E( FO,    padding_left,             RES_BOX, LEFT_BORDER_PADDING ),
    M_E( FO,    padding_right,            RES_BOX, RIGHT_BORDER_PADDING ),
    M_E( FO,    padding_top,              RES_BOX, TOP_BORDER_PADDING ),
    M_E( FO,    padding_bottom,           RES_BOX, BOTTOM_BORDER_PADDING ),
    M_E( FO,    border,                   RES_BOX, ALL_BORDER ),
    M_E( FO,    border_left,              RES_BOX, LEFT_BORDER ),
    M_E( FO,    border_right,             RES_BOX, RIGHT_BORDER ),
    M_E( FO,    border_top,               RES_BOX, TOP_BORDER ),
    M_E( FO,    border_bottom,            RES_BOX, BOTTOM_BORDER ),
    // RES_SHADOW
    // not required
    // RES_FRMMACRO
    // not required
    // RES_COL
    // not required
    // RES_KEEP
    // not required
    // RES_URL
    // not required
    // RES_EDIT_IN_READONLY
    // not required
    // RES_LAYOUT_SPLIT
    // not required
    // RES_CHAIN
    // not required
    // RES_LINENUMBER
    // not required
    // RES_FTN_AT_TXTEND
    // not required
    // RES_END_AT_TXTEND
    // not required
    // RES_UNKNOWNATR_CONTAINER
    M_E_SE( TEXT, xmlns, RES_UNKNOWNATR_CONTAINER, 0 ),
    {0,0,0,0 }
};

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/xml/xmlitemm.cxx,v 1.1.1.1 2000-09-18 17:15:00 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.8  2000/09/18 16:05:07  willem.vandorp
      OpenOffice header added.

      Revision 1.7  2000/08/24 11:16:41  mib
      text import continued

      Revision 1.6  2000/08/10 10:22:16  mib
      #74404#: Adeptions to new XSL/XLink working draft

      Revision 1.5  2000/06/08 09:45:54  aw
      changed to use functionality from xmloff project now

      Revision 1.4  2000/02/17 14:40:30  mib
      #70271#: XML table import

      Revision 1.3  2000/02/07 10:03:28  mib
      #70271#: tables

      Revision 1.2  2000/01/12 15:00:23  mib
      #70271#: lists

      Revision 1.1  1999/12/14 07:33:08  mib
      #70271#: XML import/export of drop cap/register/language item, splitted swxmlat


*************************************************************************/

diff --git a/sw/source/filter/xml/xmlmeta.cxx b/sw/source/filter/xml/xmlmeta.cxx
new file mode 100644
index 0000000..9ea5033
--- /dev/null
+++ b/sw/source/filter/xml/xmlmeta.cxx
@@ -0,0 +1,227 @@
/*************************************************************************
 *
 *  $RCSfile: xmlmeta.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:15:00 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#include <hintids.hxx>

#ifndef _COM_SUN_STAR_FRAME_XMODEL_HPP_
#include <com/sun/star/frame/XModel.hpp>
#endif
#ifndef _COM_SUN_STAR_DOCUMENT_XDOCUMENTINFOSUPPLIER_HPP_
#include <com/sun/star/document/XDocumentInfoSupplier.hpp>
#endif

#ifndef _XMLOFF_XMLNMSPE_HXX
#include <xmloff/xmlnmspe.hxx>
#endif

#ifndef _XMLOFF_XMLMETAI_HXX
#include <xmloff/xmlmetai.hxx>
#endif

#ifndef _XMLOFF_XMLMETAE_HXX
#include <xmloff/xmlmetae.hxx>
#endif

#ifndef _SVX_LANGITEM_HXX
#include <svx/langitem.hxx>
#endif

#ifndef _SWDOCSH_HXX
#include "docsh.hxx"
#endif
#ifndef _DOC_HXX //autogen wg. SwDoc
#include <doc.hxx>
#endif

#ifndef _XMLIMP_HXX
#include "xmlimp.hxx"
#endif
#ifndef _XMLEXP_HXX
#include "xmlexp.hxx"
#endif

using namespace ::rtl;
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;

// ---------------------------------------------------------------------

#if 0
class SwXMLMetaContext_Impl : public SfxXMLMetaContext
{
public:
    SwXMLMetaContext_Impl( SwXMLImport& rImport, sal_uInt16 nPrfx,
            const OUString& rLName,
            const Reference< document::XDocumentInfo > & rInfo ) :
        SfxXMLMetaContext( rImport, nPrfx, rLName, rInfo )
    {}

    virtual void SetDocLanguage( LanguageType eLang );
};

void SwXMLMetaContext_Impl::SetDocLanguage( LanguageType eLang )
{
    SwDoc& rDoc = ((SwXMLImport&)GetImport()).GetDoc();

    rDoc.SetDefault( SvxLanguageItem( eLang, RES_CHRATR_LANGUAGE ) );
}
#endif

// ---------------------------------------------------------------------

SvXMLImportContext *SwXMLImport::CreateMetaContext(
                                       const OUString& rLocalName )
{
    SvXMLImportContext *pContext = 0;

    if( !(IsStylesOnlyMode() || IsInsertMode()) )
    {
        pContext = new SfxXMLMetaContext( *this,
                                    XML_NAMESPACE_OFFICE, rLocalName,
                                    GetModel() );
#if 0
        SfxObjectShell* pObjSh = pDoc->GetDocShell();
        if( pObjSh )
        {
            Reference< frame::XModel >  xModel = pObjSh->GetBaseModel();
            Reference< document::XDocumentInfoSupplier > xSupp( xModel,
                                                                UNO_QUERY );
            if( xSupp.is() )
                pContext = new SwXMLMetaContext_Impl( *this,
                                    XML_NAMESPACE_OFFICE, rLocalName,
                                    xSupp->getDocumentInfo() );
        }
#endif
    }

    if( !pContext )
        pContext = new SvXMLImportContext( *this, XML_NAMESPACE_OFFICE,
                                              rLocalName );

    return pContext;
}

// ---------------------------------------------------------------------

#if 0
void SwXMLExport::_ExportMeta()
{
    SfxObjectShell* pObjSh = pDoc->GetDocShell();
    if( pObjSh )
    {
        pObjSh->UpdateDocInfoForSave();     // update information

        LanguageType eDocLang = ((const SvxLanguageItem&)
                pDoc->GetDefault(RES_CHRATR_LANGUAGE)).GetLanguage();

        Reference< frame::XModel >  xModel = pObjSh->GetBaseModel();
        Reference< document::XDocumentInfoSupplier >  xSupp( xModel,
                                                            UNO_QUERY );
        if( xSupp.is() )
        {
            SfxXMLMetaExport aMeta( GetDocHandler(), xSupp->getDocumentInfo(),
                                    eDocLang );
            aMeta.Export( GetNamespaceMap() );
        }
    }
}
#endif


/*************************************************************************

      Source Code Control chaos::System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/xml/xmlmeta.cxx,v 1.1.1.1 2000-09-18 17:15:00 hr Exp $

      Source Code Control chaos::System - Update

      $Log: not supported by cvs2svn $
      Revision 1.7  2000/09/18 16:05:07  willem.vandorp
      OpenOffice header added.

      Revision 1.6  2000/08/02 14:52:39  mib
      text export continued

      Revision 1.5  2000/06/08 09:45:54  aw
      changed to use functionality from xmloff project now

      Revision 1.4  2000/05/03 12:08:05  mib
      unicode

      Revision 1.3  2000/03/13 14:33:44  mib
      UNO3

      Revision 1.2  2000/02/11 14:42:04  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.1  2000/01/06 15:03:49  mib
      #70271#:separation of text/layout, cond. styles, adaptions to wd-xlink-19991229


*************************************************************************/

diff --git a/sw/source/filter/xml/xmltble.cxx b/sw/source/filter/xml/xmltble.cxx
new file mode 100644
index 0000000..7f33e1b
--- /dev/null
+++ b/sw/source/filter/xml/xmltble.cxx
@@ -0,0 +1,1085 @@
/*************************************************************************
 *
 *  $RCSfile: xmltble.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:15:00 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#include <hintids.hxx>

#ifndef _RTL_USTRBUF_HXX_
#include <rtl/ustrbuf.hxx>
#endif

#ifndef _COM_SUN_STAR_TEXT_XTEXTTABLE_HPP_
#include <com/sun/star/text/XTextTable.hpp>
#endif

#ifndef _XMLOFF_XMLNMSPE_HXX
#include <xmloff/xmlnmspe.hxx>
#endif

#ifndef _XMLOFF_XMLKYWD_HXX
#include <xmloff/xmlkywd.hxx>
#endif

#ifndef _XMLOFF_XMLUCONV_HXX
#include <xmloff/xmluconv.hxx>
#endif

#ifndef _CNTRSRT_HXX
#include <svtools/cntnrsrt.hxx>
#endif

#ifndef _SVX_BRSHITEM_HXX
#include <svx/brshitem.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX
#include <svx/boxitem.hxx>
#endif

#ifndef _SWTABLE_HXX
#include "swtable.hxx"
#endif
#ifndef _DOC_HXX
#include "doc.hxx"
#endif
#ifndef _PAM_HXX
#include "pam.hxx"
#endif
#ifndef _FRMFMT_HXX
#include "frmfmt.hxx"
#endif
#ifndef _WRTSWTBL_HXX
#include "wrtswtbl.hxx"
#endif
#ifndef _FMTFSIZE_HXX
#include "fmtfsize.hxx"
#endif
#ifndef _FMTORNT_HXX
#include "fmtornt.hxx"
#endif

#ifndef _UNOOBJ_HXX
#include "unoobj.hxx"
#endif
#ifndef _UNOTBL_HXX
#include "unotbl.hxx"
#endif

#ifndef _XMLTEXTE_HXX
#include "xmltexte.hxx"
#endif
#ifndef _XMLEXP_HXX
#include "xmlexp.hxx"
#endif
#ifndef _XMLECTXT_HXX
#include "xmlectxt.hxx"
#endif

using namespace ::rtl;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::text;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::lang;

#ifndef XML_CORE_API
Reference < XText > lcl_xml_CreateTableBoxText(
        const SwStartNode& rBoxSttNd )
{
    SwPaM aPaM( *rBoxSttNd.EndOfSectionNode() );
    aPaM.Move( fnMoveBackward, fnGoNode );
    aPaM.SetMark();
    aPaM.GetPoint()->nNode.Assign( rBoxSttNd );
    aPaM.Move( fnMoveForward, fnGoNode );

    Reference < XTextRange > xTextRange =
        CreateTextRangeFromPosition( aPaM.GetDoc(), *aPaM.GetPoint(),
                                     aPaM.GetMark() );
    return xTextRange->getText();
}
#endif

class SwXMLTableColumn_Impl : public SwWriteTableCol
{
    OUString    sStyleName;
    sal_uInt32  nRelWidth;

public:


    SwXMLTableColumn_Impl( sal_uInt16 nPosition ) :
        SwWriteTableCol( nPosition ),
        nRelWidth( 0UL )
    {};

    void SetStyleName( const OUString& rName ) { sStyleName = rName; }
    const OUString& GetStyleName() const { return sStyleName; }

    void SetRelWidth( sal_uInt32 nSet ) { nRelWidth = nSet; }
    sal_uInt32 GetRelWidth() const { return nRelWidth; }
};

sal_Int32 SwXMLTableColumnCmpWidth_Impl( const SwXMLTableColumn_Impl& r1,
                                           const SwXMLTableColumn_Impl& r2 )
{
    sal_Int32 n = (sal_Int32)r1.GetWidthOpt() - (sal_Int32)r2.GetWidthOpt();
    if( !n )
        n = (sal_Int32)r1.GetRelWidth() - (sal_Int32)r2.GetRelWidth();
    return n;
}

// ---------------------------------------------------------------------

typedef SwXMLTableColumn_Impl *SwXMLTableColumnPtr;
SV_DECL_PTRARR_SORT_DEL( SwXMLTableColumns_Impl, SwXMLTableColumnPtr, 5, 5 )
SV_IMPL_OP_PTRARR_SORT( SwXMLTableColumns_Impl, SwXMLTableColumnPtr )

DECLARE_CONTAINER_SORT( SwXMLTableColumnsSortByWidth_Impl,
                        SwXMLTableColumn_Impl )
IMPL_CONTAINER_SORT( SwXMLTableColumnsSortByWidth_Impl, SwXMLTableColumn_Impl,
                     SwXMLTableColumnCmpWidth_Impl )

class SwXMLTableLines_Impl
{
    SwXMLTableColumns_Impl  aCols;
    const SwTableLines      *pLines;
    sal_uInt32              nWidth;

public:

    SwXMLTableLines_Impl( const SwTableLines& rLines );

    ~SwXMLTableLines_Impl() {}

    sal_uInt32 GetWidth() const { return nWidth; }
    const SwTableLines *GetLines() const { return pLines; }

    const SwXMLTableColumns_Impl& GetColumns() const { return aCols; }
};

SwXMLTableLines_Impl::SwXMLTableLines_Impl( const SwTableLines& rLines ) :
    pLines( &rLines ),
    nWidth( 0UL )
{
#ifndef PRODUCT
    sal_uInt16 nEndCPos = 0U;
#endif
    sal_uInt16 nLines = rLines.Count();
    sal_uInt16 nLine;
    for( nLine=0U; nLine<nLines; nLine++ )
    {
        const SwTableLine *pLine = rLines[nLine];
        const SwTableBoxes& rBoxes = pLine->GetTabBoxes();
        sal_uInt16 nBoxes = rBoxes.Count();

        sal_uInt16 nCPos = 0U;
        for( sal_uInt16 nBox=0U; nBox<nBoxes; nBox++ )
        {
            const SwTableBox *pBox = rBoxes[nBox];

            sal_uInt16 nOldCPos = nCPos;

            if( nBox < nBoxes-1U || nWidth==0UL )
            {
                nCPos += (sal_uInt16)SwWriteTable::GetBoxWidth( pBox );
                SwXMLTableColumn_Impl *pCol =
                    new SwXMLTableColumn_Impl( nCPos );

                if( !aCols.Insert( pCol ) )
                    delete pCol;

                if( nBox==nBoxes-1U )
                {
                    ASSERT( nLine==0U && nWidth==0UL,
                            "parent width will be lost" );
                    nWidth = nCPos;
                }
            }
            else
            {
#ifndef PRODUCT
                sal_uInt16 nCheckPos =
                    nCPos + (sal_uInt16)SwWriteTable::GetBoxWidth( pBox );
                if( !nEndCPos )
                {
                    nEndCPos = nCheckPos;
                }
                else
                {
                    /*
                    ASSERT( SwXMLTableColumn_impl(nCheckPos) ==
                                        SwXMLTableColumn_Impl(nEndCPos),
                    "rows have different total widths" );
                    */
                }
#endif
                nCPos = nWidth;
#ifndef PRODUCT
                SwXMLTableColumn_Impl aCol( nWidth );
                ASSERT( aCols.Seek_Entry(&aCol), "couldn't find last column" );
                ASSERT( SwXMLTableColumn_Impl(nCheckPos) ==
                                            SwXMLTableColumn_Impl(nCPos),
                        "rows have different total widths" );
#endif
            }
        }
    }
}

typedef SwXMLTableLines_Impl *SwXMLTableLinesPtr;
DECLARE_LIST( SwXMLTableLinesCache_Impl, SwXMLTableLinesPtr )

// ---------------------------------------------------------------------

typedef SwFrmFmt *SwFrmFmtPtr;
DECLARE_LIST( SwXMLFrmFmts_Impl, SwFrmFmtPtr )

class SwXMLTableFrmFmtsSort_Impl : public SwXMLFrmFmts_Impl
{
public:
    SwXMLTableFrmFmtsSort_Impl ( sal_uInt16 nInit, sal_uInt16 nGrow ) :
        SwXMLFrmFmts_Impl( nInit, nGrow )
    {}

    sal_Bool AddRow( SwFrmFmt& rFrmFmt, const OUString& rNamePrefix, sal_uInt32 nLine );
    sal_Bool AddCell( SwFrmFmt& rFrmFmt, const OUString& rNamePrefix,
                  sal_uInt32 nCol, sal_uInt32 nRow, sal_Bool bTop );
};

sal_Bool SwXMLTableFrmFmtsSort_Impl::AddRow( SwFrmFmt& rFrmFmt,
                                         const OUString& rNamePrefix,
                                            sal_uInt32 nLine )
{
    const SwFmtFrmSize *pFrmSize = 0;
    const SvxBrushItem *pBrush = 0;

    const SfxItemSet& rItemSet = rFrmFmt.GetAttrSet();
    const SfxPoolItem *pItem;
    if( SFX_ITEM_SET == rItemSet.GetItemState( RES_FRM_SIZE, sal_False, &pItem ) )
        pFrmSize = (const SwFmtFrmSize *)pItem;

    if( SFX_ITEM_SET == rItemSet.GetItemState( RES_BACKGROUND, sal_False, &pItem ) )
        pBrush = (const SvxBrushItem *)pItem;

    // empty styles have not to be exported
    if( !pFrmSize && !pBrush )
        return sal_False;

    // order is: -/brush, size/-, size/brush
    sal_uInt32 nCount = Count();
    sal_Bool bInsert = sal_True;
    sal_uInt32 i;
    for( i=0; i<nCount; i++ )
    {
        const SwFmtFrmSize *pTestFrmSize = 0;
        const SvxBrushItem *pTestBrush = 0;
        const SwFrmFmt *pTestFmt = GetObject(i);
        const SfxItemSet& rTestSet = pTestFmt->GetAttrSet();
        if( SFX_ITEM_SET == rTestSet.GetItemState( RES_FRM_SIZE, sal_False,
                                                  &pItem ) )
        {
            if( !pFrmSize )
                break;

            pTestFrmSize = (const SwFmtFrmSize *)pItem;
        }
        else
        {
            if( pFrmSize )
                continue;
        }

        if( SFX_ITEM_SET == rTestSet.GetItemState( RES_BACKGROUND, sal_False,
                                                  &pItem ) )
        {
            if( !pBrush )
                break;

            pTestBrush = (const SvxBrushItem *)pItem;
        }
        else
        {
            if( pBrush )
                continue;
        }

        if( pFrmSize &&
            ( pFrmSize->GetSizeType() != pTestFrmSize->GetSizeType() ||
              pFrmSize->GetHeight() != pTestFrmSize->GetHeight() ) )
            continue;

        if( pBrush && !pBrush->equalsXML( *pTestBrush ) )
            continue;

        // found!
        const String& rFmtName = pTestFmt->GetName();
        rFrmFmt.SetName( rFmtName );
        bInsert = sal_False;
        break;
    }

    if( bInsert )
    {
        OUStringBuffer sBuffer( rNamePrefix.getLength() + 4UL );
        sBuffer.append( rNamePrefix );
        sBuffer.append( (sal_Unicode)'.' );
        sBuffer.append( (sal_Int32)(nLine+1UL) );

        rFrmFmt.SetName( sBuffer.makeStringAndClear() );
        Insert( &rFrmFmt, i );
    }

    return bInsert;
}

void lcl_GetTblBoxColStr( sal_uInt16 nCol, String& rNm );
void lcl_xmltble_appendBoxPrefix( OUStringBuffer& rBuffer,
                                  const OUString& rNamePrefix,
                                  sal_uInt16 nCol, sal_uInt16 nRow, sal_Bool bTop )
{
    rBuffer.append( rNamePrefix );
    rBuffer.append( (sal_Unicode)'.' );
    if( bTop )
    {
        String sTmp;
        lcl_GetTblBoxColStr( nCol, sTmp );
        rBuffer.append( sTmp );
    }
    else
    {
        rBuffer.append( (sal_Int32)(nCol + 1));
        rBuffer.append( (sal_Unicode)'.' );
    }
    rBuffer.append( (sal_Int32)(nRow + 1));
}

sal_Bool SwXMLTableFrmFmtsSort_Impl::AddCell( SwFrmFmt& rFrmFmt,
                                         const OUString& rNamePrefix,
                                            sal_uInt32 nCol, sal_uInt32 nRow, sal_Bool bTop )
{
    const SwFmtVertOrient *pVertOrient = 0;
    const SvxBrushItem *pBrush = 0;
    const SvxBoxItem *pBox = 0;

    const SfxItemSet& rItemSet = rFrmFmt.GetAttrSet();
    const SfxPoolItem *pItem;
    if( SFX_ITEM_SET == rItemSet.GetItemState( RES_VERT_ORIENT, sal_False,
                                               &pItem ) )
        pVertOrient = (const SwFmtVertOrient *)pItem;

    if( SFX_ITEM_SET == rItemSet.GetItemState( RES_BACKGROUND, sal_False, &pItem ) )
        pBrush = (const SvxBrushItem *)pItem;

    if( SFX_ITEM_SET == rItemSet.GetItemState( RES_BOX, sal_False, &pItem ) )
        pBox = (const SvxBoxItem *)pItem;

    // empty styles have not to be exported
    if( !pVertOrient && !pBrush && !pBox )
        return sal_False;

    // order is: -/-/box, -/brush/-, -/brush/box,
    //           vert/-/-, vert/-/box, vert/brush/-, vert/brush/box
    sal_uInt32 nCount = Count();
    sal_Bool bInsert = sal_True;
    sal_uInt32 i;
    for( i=0; i<nCount; i++ )
    {
        const SwFmtVertOrient *pTestVertOrient = 0;
        const SvxBrushItem *pTestBrush = 0;
        const SvxBoxItem *pTestBox = 0;
        const SwFrmFmt *pTestFmt = GetObject(i);
        const SfxItemSet& rTestSet = pTestFmt->GetAttrSet();
        if( SFX_ITEM_SET == rTestSet.GetItemState( RES_VERT_ORIENT, sal_False,
                                                  &pItem ) )
        {
            if( !pVertOrient )
                break;

            pTestVertOrient = (const SwFmtVertOrient *)pItem;
        }
        else
        {
            if( pVertOrient )
                continue;
        }

        if( SFX_ITEM_SET == rTestSet.GetItemState( RES_BACKGROUND, sal_False,
                                                  &pItem ) )
        {
            if( !pBrush )
                break;

            pTestBrush = (const SvxBrushItem *)pItem;
        }
        else
        {
            if( pBrush )
                continue;
        }

        if( SFX_ITEM_SET == rTestSet.GetItemState( RES_BOX, sal_False, &pItem ) )
        {
            if( !pBox )
                break;

            pTestBox = (const SvxBoxItem *)pItem;
        }
        else
        {
            if( pBox )
                continue;
        }

        if( pVertOrient &&
            pVertOrient->GetVertOrient() != pTestVertOrient->GetVertOrient() )
            continue;

        if( pBrush && !pBrush->equalsXML( *pTestBrush ) )
            continue;

        if( pBox && !pBox->equalsXML( *pTestBox ) )
            continue;

        // found!
        const String& rFmtName = pTestFmt->GetName();
        rFrmFmt.SetName( rFmtName );
        bInsert = sal_False;
        break;
    }

    if( bInsert )
    {
        OUStringBuffer sBuffer( rNamePrefix.getLength() + 8UL );
        lcl_xmltble_appendBoxPrefix( sBuffer, rNamePrefix, nCol, nRow, bTop );
        rFrmFmt.SetName( sBuffer.makeStringAndClear() );
        Insert( &rFrmFmt, i );
    }

    return bInsert;
}
// ---------------------------------------------------------------------


void SwXMLExport::ExportTableColumnStyle( const SwXMLTableColumn_Impl& rCol )
{
    // <style:style ...>
    CheckAttrList();

    // style:name="..."
    AddAttribute( XML_NAMESPACE_STYLE, sXML_name, rCol.GetStyleName() );

    // style:family="table-column"
    AddAttributeASCII( XML_NAMESPACE_STYLE, sXML_family, sXML_table_column );

    {
        SvXMLElementExport aElem( *this, XML_NAMESPACE_STYLE, sXML_style, sal_True,
                                  sal_True );
        OUStringBuffer sValue;
        if( rCol.GetWidthOpt() )
        {
            GetTwipUnitConverter().convertMeasure( sValue, rCol.GetWidthOpt() );
            AddAttribute( XML_NAMESPACE_STYLE, sXML_column_width,
                          sValue.makeStringAndClear() );
        }
        if( rCol.GetRelWidth() )
        {
            sValue.append( (sal_Int32)rCol.GetRelWidth() );
            sValue.append( (sal_Unicode)'*' );
            AddAttribute( XML_NAMESPACE_STYLE, sXML_rel_column_width,
                          sValue.makeStringAndClear() );
        }

        {
            SvXMLElementExport aElem( *this, XML_NAMESPACE_STYLE,
                                      sXML_properties, sal_True, sal_True );
        }
    }
}

void SwXMLExport::ExportTableLinesAutoStyles( const SwTableLines& rLines,
                                    sal_uInt32 nAbsWidth, sal_uInt32 nBaseWidth,
                                    const OUString& rNamePrefix,
                                    SwXMLTableColumnsSortByWidth_Impl& rExpCols,
                                    SwXMLTableFrmFmtsSort_Impl& rExpRows,
                                    SwXMLTableFrmFmtsSort_Impl& rExpCells,
                                      sal_Bool bTop )
{
    // pass 1: calculate columns
    SwXMLTableLines_Impl *pLines =
        new SwXMLTableLines_Impl( rLines );
    if( !pTableLines )
        pTableLines = new SwXMLTableLinesCache_Impl( 5, 5 );
    pTableLines->Insert( pLines, pTableLines->Count() );

    OUStringBuffer sBuffer( rNamePrefix.getLength() + 8L );

    // pass 2: export column styles
    {
        const SwXMLTableColumns_Impl& rCols = pLines->GetColumns();
        sal_uInt16 nCPos = 0U;
        sal_uInt16 nColumns = rCols.Count();
        for( sal_uInt16 nColumn=0U; nColumn<nColumns; nColumn++ )
        {
            SwXMLTableColumn_Impl *pColumn = rCols[nColumn];

            sal_uInt16 nOldCPos = nCPos;
            nCPos = pColumn->GetPos();

            sal_uInt32 nWidth = nCPos - nOldCPos;

            // If a base width is given, the table has either an automatic
            // or margin alignment, or an percentage width. In either case,
            // relative widths should be exported.
            if( nBaseWidth )
            {
                pColumn->SetRelWidth( nWidth );
            }

            // If an absolute width is given, the table either has a fixed
            // width, or the current width is known from the layout. In the
            // later case, a base width is set in addition and must be used
            // to "absoultize" the relative column width.
            if( nAbsWidth )
            {
                sal_uInt32 nColAbsWidth = nWidth;
                if( nBaseWidth )
                {
                    nColAbsWidth *= nAbsWidth;
                    nColAbsWidth += (nBaseWidth/2UL);
                    nColAbsWidth /= nBaseWidth;
                }
                pColumn->SetWidthOpt( nColAbsWidth, sal_False );
            }

            sal_uInt32 nExpPos = 0;
            if( rExpCols.Seek_Entry( pColumn, &nExpPos ) )
            {
                pColumn->SetStyleName(
                        rExpCols.GetObject(nExpPos)->GetStyleName() );
            }
            else
            {
                sBuffer.append( rNamePrefix );
                sBuffer.append( (sal_Unicode)'.' );
                if( bTop )
                {
                    String sTmp;
                    lcl_GetTblBoxColStr( nColumn, sTmp );
                    sBuffer.append( sTmp );
                }
                else
                {
                    sBuffer.append( (sal_Int32)(nColumn + 1U) );
                }

                pColumn->SetStyleName( sBuffer.makeStringAndClear() );
                ExportTableColumnStyle( *pColumn );
                rExpCols.Insert( pColumn );
            }
        }
    }

    // pass 3: export line/rows
    sal_uInt16 nLines = rLines.Count();
    for( sal_uInt16 nLine=0U; nLine<nLines; nLine++ )
    {
        SwTableLine *pLine = rLines[nLine];

        SwFrmFmt *pFrmFmt = pLine->GetFrmFmt();
        if( rExpRows.AddRow( *pFrmFmt, rNamePrefix, nLine ) )
            ExportFmt( *pFrmFmt, sXML_table_row );

        const SwTableBoxes& rBoxes = pLine->GetTabBoxes();
        sal_uInt16 nBoxes = rBoxes.Count();

        sal_uInt16 nCPos = 0U;
        sal_uInt16 nCol = 0U;
        for( sal_uInt16 nBox=0U; nBox<nBoxes; nBox++ )
        {
            const SwTableBox *pBox = rBoxes[nBox];

            sal_uInt16 nOldCPos = nCPos;
            if( nBox < nBoxes-1U )
                nCPos += (sal_uInt16)SwWriteTable::GetBoxWidth( pBox );
            else
                nCPos = pLines->GetWidth();


            // Und ihren Index
            sal_uInt16 nOldCol = nCol;
            SwXMLTableColumn_Impl aCol( nCPos );
            sal_Bool bFound = pLines->GetColumns().Seek_Entry( &aCol, &nCol );
            ASSERT( bFound, "couldn't find column" );

            const SwStartNode *pBoxSttNd = pBox->GetSttNd();
            if( pBoxSttNd )
            {
#ifdef XML_CORE_API
                SwNode *pStartNd = pDoc->GetNodes()[pBoxSttNd->GetIndex()+1];
                SwNode *pEndNd =
                            pDoc->GetNodes()[pBoxSttNd->EndOfSectionIndex()-1];
                SwXMLExpContext aContext( *this, *pStartNd, *pEndNd,
                                          0, STRING_LEN );
#endif

                SwFrmFmt *pFrmFmt = pBox->GetFrmFmt();
                if( rExpCells.AddCell( *pFrmFmt, rNamePrefix, nOldCol, nLine,
                                       bTop) )
                    ExportFmt( *pFrmFmt, sXML_table_cell );

#ifdef XML_CORE_API
                ExportCurPaMAutoStyles();
#else
                GetTextParagraphExport()->collectTextAutoStyles(
                        lcl_xml_CreateTableBoxText( *pBoxSttNd ) );
#endif
            }
            else
            {
                lcl_xmltble_appendBoxPrefix( sBuffer, rNamePrefix, nOldCol,
                                             nLine, bTop );

                ExportTableLinesAutoStyles( pBox->GetTabLines(),
                                            nAbsWidth, nBaseWidth,
                                            sBuffer.makeStringAndClear(),
                                            rExpCols, rExpRows, rExpCells );
            }

            nCol++;
        }
    }
}

void SwXMLExport::ExportTableAutoStyles( const SwTableNode& rTblNd )
{
    const SwTable& rTbl = rTblNd.GetTable();
    const SwFrmFmt *pTblFmt = rTbl.GetFrmFmt();

    if( pTblFmt )
    {
        SwHoriOrient eTabHoriOri = pTblFmt->GetHoriOrient().GetHoriOrient();
        const SwFmtFrmSize& rFrmSize = pTblFmt->GetFrmSize();

        sal_uInt32 nAbsWidth = rFrmSize.GetSize().Width();
        sal_uInt32 nBaseWidth = 0UL;
        sal_Int8 nPrcWidth = rFrmSize.GetWidthPercent();

        sal_Bool bFixAbsWidth = nPrcWidth != 0 || HORI_NONE == eTabHoriOri
                                           || HORI_FULL == eTabHoriOri;
        if( bFixAbsWidth )
        {
            nBaseWidth = nAbsWidth;
            nAbsWidth = pTblFmt->FindLayoutRect(sal_True).Width();
            if( !nAbsWidth )
            {
                // TODO???
            }
        }
        ExportTableFmt( *pTblFmt, nAbsWidth );

        OUString sName( pTblFmt->GetName() );
        SwXMLTableColumnsSortByWidth_Impl aExpCols( 10, 10 );
        SwXMLTableFrmFmtsSort_Impl aExpRows( 10, 10 );
        SwXMLTableFrmFmtsSort_Impl aExpCells( 10, 10 );
        ExportTableLinesAutoStyles( rTbl.GetTabLines(), nAbsWidth, nBaseWidth,
                                    sName, aExpCols, aExpRows, aExpCells,
                                    sal_True );
    }

#ifdef XML_CORE_API
    pCurPaM->GetPoint()->nNode = *rTblNd.EndOfSectionNode();
#endif
}

// ---------------------------------------------------------------------

void SwXMLExport::ExportTableBox( const SwTableBox& rBox, sal_uInt16 nColSpan )
{
    const SwStartNode *pBoxSttNd = rBox.GetSttNd();
    if( pBoxSttNd )
    {
        const SwFrmFmt *pFrmFmt = rBox.GetFrmFmt();
        if( pFrmFmt )
        {
            const String& rName = pFrmFmt->GetName();
            if( rName.Len() )
            {
                AddAttribute( XML_NAMESPACE_TABLE, sXML_style_name, rName );
            }
        }
    }

    if( nColSpan != 1 )
    {
        OUStringBuffer sTmp;
        sTmp.append( (sal_Int32)nColSpan );
        AddAttribute( XML_NAMESPACE_TABLE, sXML_number_columns_spanned,
                      sTmp.makeStringAndClear() );
    }

    {
        SvXMLElementExport aElem( *this, XML_NAMESPACE_TABLE,
                                  sXML_table_cell, sal_True, sal_True );
        if( pBoxSttNd )
        {
#ifdef XML_CORE_API
            SwNode *pStartNd = pDoc->GetNodes()[pBoxSttNd->GetIndex()+1];
            SwNode *pEndNd = pDoc->GetNodes()[pBoxSttNd->EndOfSectionIndex()-1];
            SwXMLExpContext aContext( *this, *pStartNd, *pEndNd,
                                      0, STRING_LEN );
            ExportCurPaM();
#else
            GetTextParagraphExport()->exportText(
                lcl_xml_CreateTableBoxText( *pBoxSttNd ) );
#endif
        }
        else
        {
            SvXMLElementExport aElem( *this, XML_NAMESPACE_TABLE,
                                      sXML_sub_table, sal_True, sal_True );
            ExportTableLines( rBox.GetTabLines() );
        }
    }
}

void SwXMLExport::ExportTableLine( const SwTableLine& rLine,
                                   const SwXMLTableLines_Impl& rLines )
{
    const SwFrmFmt *pFrmFmt = rLine.GetFrmFmt();
    if( pFrmFmt )
    {
        const String& rName = pFrmFmt->GetName();
        if( rName.Len() )
        {
            AddAttribute( XML_NAMESPACE_TABLE, sXML_style_name, rName );
        }
    }

    {
        SvXMLElementExport aElem( *this, XML_NAMESPACE_TABLE,
                                  sXML_table_row, sal_True, sal_True );
        const SwTableBoxes& rBoxes = rLine.GetTabBoxes();
        sal_uInt16 nBoxes = rBoxes.Count();

        sal_uInt16 nCPos = 0U;
        sal_uInt16 nCol = 0U;
        for( sal_uInt16 nBox=0U; nBox<nBoxes; nBox++ )
        {
            const SwTableBox *pBox = rBoxes[nBox];

            sal_uInt16 nOldCPos = nCPos;
            if( nBox < nBoxes-1U )
                nCPos += (sal_uInt16)SwWriteTable::GetBoxWidth( pBox );
            else
                nCPos = rLines.GetWidth();

            // Und ihren Index
            sal_uInt16 nOldCol = nCol;
            SwXMLTableColumn_Impl aCol( nCPos );
            sal_Bool bFound = rLines.GetColumns().Seek_Entry( &aCol, &nCol );
            ASSERT( bFound, "couldn't find column" );

            sal_uInt16 nColSpan = nCol - nOldCol + 1U;
            ExportTableBox( *pBox, nColSpan );
            for( sal_uInt16 i=nOldCol; i<nCol; i++ )
            {
                SvXMLElementExport aElem( *this, XML_NAMESPACE_TABLE,
                                          sXML_covered_table_cell, sal_True,
                                          sal_False );
            }

            nCol++;
        }
    }
}

void SwXMLExport::ExportTableLines( const SwTableLines& rLines,
                                    sal_Bool bHeadline )
{
    ASSERT( pTableLines && pTableLines->Count(),
            "SwXMLExport::ExportTableLines: table columns infos missing" );
    if( !pTableLines || 0 == pTableLines->Count() )
        return;

    SwXMLTableLines_Impl *pLines = 0;
    sal_uInt16 nInfoPos;
    for( nInfoPos=0; nInfoPos < pTableLines->Count(); nInfoPos++ )
    {
        if( pTableLines->GetObject( nInfoPos )->GetLines() == &rLines )
        {
            pLines = pTableLines->GetObject( nInfoPos );
            break;
        }
    }
    ASSERT( pLines,
            "SwXMLExport::ExportTableLines: table columns info missing" );
    ASSERT( 0==nInfoPos,
            "SwXMLExport::ExportTableLines: table columns infos are unsorted" );
    if( !pLines )
        return;

    // pass 2: export columns
    const SwXMLTableColumns_Impl& rCols = pLines->GetColumns();
    sal_uInt16 nColumn = 0U;
    sal_uInt16 nColumns = rCols.Count();
    sal_uInt16 nColRep = 1U;
    SwXMLTableColumn_Impl *pColumn = (nColumns > 0) ? rCols[0U] : 0;
    while( pColumn )
    {
        nColumn++;
        SwXMLTableColumn_Impl *pNextColumn =
            (nColumn < nColumns) ? rCols[nColumn] : 0;
        if( pNextColumn &&
            pNextColumn->GetStyleName() == pColumn->GetStyleName() )
        {
            nColRep++;
        }
        else
        {
            AddAttribute( XML_NAMESPACE_TABLE, sXML_style_name,
                          pColumn->GetStyleName() );

            if( nColRep > 1U )
            {
                OUStringBuffer sTmp(4);
                sTmp.append( (sal_Int32)nColRep );
                AddAttribute( XML_NAMESPACE_TABLE, sXML_number_columns_repeated,
                              sTmp.makeStringAndClear() );
            }

            {
                SvXMLElementExport aElem( *this, XML_NAMESPACE_TABLE,
                                          sXML_table_column, sal_True, sal_True );
            }

            nColRep = 1U;
        }
        pColumn = pNextColumn;
    }

    // pass 3: export line/rows
    sal_uInt16 nLines = rLines.Count();
    for( sal_uInt16 nLine=0U; nLine<nLines; nLine++ )
    {
        const SwTableLine *pLine = rLines[nLine];
        if( bHeadline && 0U==nLine )
        {
            SvXMLElementExport aElem( *this, XML_NAMESPACE_TABLE,
                                      sXML_table_header_rows, sal_True, sal_True );
            ExportTableLine( *pLine, *pLines );
        }
        else
        {
            ExportTableLine( *pLine, *pLines );
        }
    }

    pTableLines->Remove( nInfoPos );
    if( 0 == pTableLines->Count() )
    {
        delete pTableLines ;
        pTableLines = 0;
    }
    delete pLines;
}

sal_Bool lcl_xmltble_ClearName_Line( const SwTableLine*& rpLine, void* );

sal_Bool lcl_xmltble_ClearName_Box( const SwTableBox*& rpBox, void* )
{
    if( !rpBox->GetSttNd() )
    {
        ((SwTableBox *)rpBox)->GetTabLines().ForEach(
                                            &lcl_xmltble_ClearName_Line, 0 );
    }
    else
    {
        SwFrmFmt *pFrmFmt = ((SwTableBox *)rpBox)->GetFrmFmt();
        if( pFrmFmt && pFrmFmt->GetName().Len() )
            pFrmFmt->SetName( aEmptyStr );
    }

    return sal_True;
}

sal_Bool lcl_xmltble_ClearName_Line( const SwTableLine*& rpLine, void* )
{
    ((SwTableLine *)rpLine)->GetTabBoxes().ForEach(
                                            &lcl_xmltble_ClearName_Box, 0 );

    return sal_True;
}

void SwXMLExport::ExportTable( const SwTableNode& rTblNd )
{
    const SwTable& rTbl = rTblNd.GetTable();
    const SwFrmFmt *pTblFmt = rTbl.GetFrmFmt();
    if( pTblFmt && pTblFmt->GetName().Len() )
    {
        AddAttribute( XML_NAMESPACE_TABLE, sXML_name, pTblFmt->GetName() );
        AddAttribute( XML_NAMESPACE_TABLE, sXML_style_name,
                      pTblFmt->GetName() );
    }

    {
        SvXMLElementExport aElem( *this, XML_NAMESPACE_TABLE, sXML_table,
                                  sal_True, sal_True );
        ExportTableLines( rTbl.GetTabLines(), rTbl.IsHeadlineRepeat() );

        ((SwTable &)rTbl).GetTabLines().ForEach( &lcl_xmltble_ClearName_Line,
                                                 0 );
    }

#ifdef XML_CORE_API
    pCurPaM->GetPoint()->nNode = *rTblNd.EndOfSectionNode();
#endif
}

#ifndef XML_CORE_API
void SwXMLTextParagraphExport::exportTable(
        const Reference < XTextContent > & rTextContent,
        sal_Bool bAutoStyles )
{
//  Reference < XPropertySet > xPropSet( rTextContent, UNO_QUERY );
//  Any aAny = xPropSet->getPropertyValue( sTextTable );

    Reference < XTextTable > xTxtTbl( rTextContent, UNO_QUERY );
//  aAny >>= xTxtTbl;
    DBG_ASSERT( xTxtTbl.is(), "text table missing" );
    if( xTxtTbl.is() )
    {
        const SwXTextTable *pXTable = 0;
        Reference<XUnoTunnel> xTableTunnel( rTextContent, UNO_QUERY);
        if( xTableTunnel.is() )
        {
            pXTable = (SwXTextTable*)xTableTunnel->getSomething(
                                            SwXTextTable::getUnoTunnelId() );
            ASSERT( pXTable, "SwXTextTable missing" );
        }
        if( pXTable )
        {
            SwFrmFmt *pFmt = pXTable->GetFrmFmt();
            ASSERT( pFmt, "table format missing" );
            const SwTable *pTbl = SwTable::FindTable( pFmt );
            ASSERT( pTbl, "table missing" );
            const SwTableNode *pTblNd = pTbl->GetTableNode();
            ASSERT( pTblNd, "table node missing" );
            if( bAutoStyles )
            {
                ((SwXMLExport&)GetExport()).ExportTableAutoStyles( *pTblNd );
            }
            else
            {
                ((SwXMLExport&)GetExport()).ExportTable( *pTblNd );
            }
        }
    }
}
#endif

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/xml/xmltble.cxx,v 1.1.1.1 2000-09-18 17:15:00 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.11  2000/09/18 16:05:07  willem.vandorp
      OpenOffice header added.

      Revision 1.10  2000/09/05 09:51:10  mib
      #78063#: table lines cache is sorted now

      Revision 1.9  2000/07/31 09:42:35  mib
      text export continued

      Revision 1.8  2000/07/21 12:55:15  mib
      text import/export using StarOffice API

      Revision 1.7  2000/06/08 09:45:54  aw
      changed to use functionality from xmloff project now

      Revision 1.6  2000/05/03 12:08:05  mib
      unicode

      Revision 1.5  2000/03/13 14:33:44  mib
      UNO3

      Revision 1.4  2000/02/11 17:08:37  kz
      #65293# cast Syntax

      Revision 1.3  2000/02/11 14:42:15  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.2  2000/02/08 06:47:09  mib
      #70271#: remove temporary table cell format names

      Revision 1.1  2000/02/07 10:02:55  mib
      #70271#: table export


*************************************************************************/

diff --git a/sw/source/filter/xml/xmltbli.cxx b/sw/source/filter/xml/xmltbli.cxx
new file mode 100644
index 0000000..a9205ee
--- /dev/null
+++ b/sw/source/filter/xml/xmltbli.cxx
@@ -0,0 +1,2229 @@
/*************************************************************************
 *
 *  $RCSfile: xmltbli.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:15:00 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#include "hintids.hxx"

#include <limits.h>

#ifndef _COM_SUN_STAR_LANG_XMULTISERVICEFACTORY_HPP_
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXTTABLE_HPP_
#include <com/sun/star/text/XTextTable.hpp>
#endif

#ifndef _COM_SUN_STAR_TABLE_XCELLRANGE_HPP_
#include <com/sun/star/table/XCellRange.hpp>
#endif

#ifndef _SFXITEMSET_HXX
#include <svtools/itemset.hxx>
#endif

#ifndef _XMLOFF_XMLNMSPE_HXX
#include <xmloff/xmlnmspe.hxx>
#endif

#ifndef _XMLOFF_XMLKYWD_HXX
#include <xmloff/xmlkywd.hxx>
#endif

#ifndef _XMLOFF_XMLTKMAP_HXX
#include <xmloff/xmltkmap.hxx>
#endif

#ifndef _XMLOFF_NMSPMAP_HXX
#include <xmloff/nmspmap.hxx>
#endif

#ifndef _XMLOFF_FAMILIES_HXX
#include <xmloff/families.hxx>
#endif

#ifndef _POOLFMT_HXX
#include "poolfmt.hxx"
#endif
#ifndef _FMTFSIZE_HXX
#include "fmtfsize.hxx"
#endif
#ifndef _FMTORNT_HXX
#include "fmtornt.hxx"
#endif
#ifndef _FMTFORDR_HXX
#include "fmtfordr.hxx"
#endif
#ifndef _DOC_HXX
#include "doc.hxx"
#endif
#ifndef _SWTABLE_HXX
#include "swtable.hxx"
#endif
#ifndef _SWTBLFMT_HXX
#include "swtblfmt.hxx"
#endif
#ifndef _PAM_HXX
#include "pam.hxx"
#endif
#ifndef _UNOTBL_HXX
#include "unotbl.hxx"
#endif
#ifndef _UNOCRSR_HXX
#include "unocrsr.hxx"
#endif

#ifndef _XMLTEXTI_HXX
#include "xmltexti.hxx"
#endif
#ifndef _XMLNUM_HXX
#include "xmlnum.hxx"
#endif
#ifndef _XMLIMP_HXX
#include "xmlimp.hxx"
#endif
#ifndef _XMLTBLI_HXX
#include "xmltbli.hxx"
#endif

using namespace ::rtl;
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::text;
using namespace ::com::sun::star::frame;
using namespace ::com::sun::star::table;
using namespace ::com::sun::star::xml::sax;

enum SwXMLTableElemTokens
{
    XML_TOK_TABLE_HEADER_COLS,
    XML_TOK_TABLE_COLS,
    XML_TOK_TABLE_COL,
    XML_TOK_TABLE_HEADER_ROWS,
    XML_TOK_TABLE_ROWS,
    XML_TOK_TABLE_ROW,
    XML_TOK_TABLE_ELEM_END=XML_TOK_UNKNOWN
};

static __FAR_DATA SvXMLTokenMapEntry aTableElemTokenMap[] =
{
    { XML_NAMESPACE_TABLE, sXML_table_header_columns,
            XML_TOK_TABLE_HEADER_COLS },
    { XML_NAMESPACE_TABLE, sXML_table_columns,          XML_TOK_TABLE_COLS },
    { XML_NAMESPACE_TABLE, sXML_table_column,           XML_TOK_TABLE_COL },
    { XML_NAMESPACE_TABLE, sXML_table_header_rows,
            XML_TOK_TABLE_HEADER_ROWS },
    { XML_NAMESPACE_TABLE, sXML_table_rows,             XML_TOK_TABLE_ROWS },
    { XML_NAMESPACE_TABLE, sXML_table_row,              XML_TOK_TABLE_ROW },
    XML_TOKEN_MAP_END
};

const SvXMLTokenMap& SwXMLImport::GetTableElemTokenMap()
{
    if( !pTableElemTokenMap )
        pTableElemTokenMap = new SvXMLTokenMap( aTableElemTokenMap );

    return *pTableElemTokenMap;
}

// ---------------------------------------------------------------------

class SwXMLTableCell_Impl
{
    OUString aStyleName;

    SvXMLImportContextRef   xSubTable;

    const SwStartNode *pStartNode;
    sal_uInt32 nRowSpan;
    sal_uInt32 nColSpan;

    sal_Bool bProtected : 1;

public:

    SwXMLTableCell_Impl( sal_uInt32 nRSpan=1UL, sal_uInt32 nCSpan=1UL ) :
        nRowSpan( nRSpan ),
        nColSpan( nCSpan ),
        pStartNode( 0 ),
        bProtected( sal_False )
        {}

    inline void Set( const OUString& rStyleName,
                      sal_uInt32 nRSpan, sal_uInt32 nCSpan,
                     const SwStartNode *pStNd, SwXMLTableContext *pTable  );

    sal_Bool IsUsed() const { return pStartNode!=0 ||
                                     xSubTable.Is() || bProtected;}

    sal_uInt32 GetRowSpan() const { return nRowSpan; }
    void SetRowSpan( sal_uInt32 nSet ) { nRowSpan = nSet; }
    sal_uInt32 GetColSpan() const { return nColSpan; }
    const OUString& GetStyleName() const { return aStyleName; }

    const SwStartNode *GetStartNode() const { return pStartNode; }
    inline void SetStartNode( const SwStartNode *pSttNd );

    inline SwXMLTableContext *GetSubTable() const;

    inline void Dispose();
};

inline void SwXMLTableCell_Impl::Set( const OUString& rStyleName,
                                      sal_uInt32 nRSpan, sal_uInt32 nCSpan,
                                      const SwStartNode *pStNd,
                                      SwXMLTableContext *pTable )
{
    aStyleName = rStyleName;
    nRowSpan = nRSpan;
    nColSpan = nCSpan;
    pStartNode = pStNd;
    xSubTable = pTable;
}

inline void SwXMLTableCell_Impl::SetStartNode( const SwStartNode *pSttNd )
{
    pStartNode = pSttNd;
    xSubTable = 0;
}

inline SwXMLTableContext *SwXMLTableCell_Impl::GetSubTable() const
{
    return (SwXMLTableContext *)&xSubTable;
}

inline void SwXMLTableCell_Impl::Dispose()
{
    if( xSubTable.Is() )
        xSubTable = 0;
}

// ---------------------------------------------------------------------

typedef SwXMLTableCell_Impl* SwXMLTableCellPtr;
SV_DECL_PTRARR_DEL(SwXMLTableCells_Impl,SwXMLTableCellPtr,5,5)
SV_IMPL_PTRARR(SwXMLTableCells_Impl,SwXMLTableCellPtr)

class SwXMLTableRow_Impl
{
    OUString aStyleName;

    SwXMLTableCells_Impl aCells;

    sal_Bool bSplitable;

public:

    SwXMLTableRow_Impl( const OUString& rStyleName, sal_uInt32 nCells );
    ~SwXMLTableRow_Impl() {}

    inline SwXMLTableCell_Impl *GetCell( sal_uInt32 nCol ) const;

    inline void Set( const OUString& rStyleName );

    void Expand( sal_uInt32 nCells, sal_Bool bOneCell );

    void SetSplitable( sal_Bool bSet ) { bSplitable = bSet; }
    sal_Bool IsSplitable() const { return bSplitable; }


    const OUString& GetStyleName() const { return aStyleName; }

    void Dispose();
};

SwXMLTableRow_Impl::SwXMLTableRow_Impl( const OUString& rStyleName,
                                        sal_uInt32 nCells ) :
    aStyleName( rStyleName ),
    bSplitable( sal_False )
{
    ASSERT( nCells <= USHRT_MAX,
            "SwXMLTableRow_Impl::SwXMLTableRow_Impl: too many cells" );
    if( nCells > USHRT_MAX )
        nCells = USHRT_MAX;

    for( sal_uInt16 i=0U; i<nCells; i++ )
    {
        aCells.Insert( new SwXMLTableCell_Impl, aCells.Count() );
    }
}

inline SwXMLTableCell_Impl *SwXMLTableRow_Impl::GetCell( sal_uInt32 nCol ) const
{
    ASSERT( nCol < USHRT_MAX,
            "SwXMLTableRow_Impl::GetCell: column number is to big" );
    return aCells[(sal_uInt16)nCol];
}

void SwXMLTableRow_Impl::Expand( sal_uInt32 nCells, sal_Bool bOneCell )
{
    ASSERT( nCells <= USHRT_MAX,
            "SwXMLTableRow_Impl::Expand: too many cells" );
    if( nCells > USHRT_MAX )
        nCells = USHRT_MAX;

    sal_uInt32 nColSpan = nCells - aCells.Count();
    for( sal_uInt16 i=aCells.Count(); i<nCells; i++ )
    {
        aCells.Insert( new SwXMLTableCell_Impl( 1UL,
                                                bOneCell ? nColSpan : 1UL ),
                       aCells.Count() );
        nColSpan--;
    }

    ASSERT( nCells<=aCells.Count(),
            "SwXMLTableRow_Impl::Expand: wrong number of cells" );
}

inline void SwXMLTableRow_Impl::Set( const OUString& rStyleName )
{
    aStyleName = rStyleName;
}

void SwXMLTableRow_Impl::Dispose()
{
    for( sal_uInt16 i=0; i < aCells.Count(); i++ )
        aCells[i]->Dispose();
}

// ---------------------------------------------------------------------

class SwXMLTableCellContext_Impl : public SvXMLImportContext
{
    OUString aStyleName;

    SvXMLImportContextRef   xMyTable;

    sal_uInt32                  nRowSpan;
    sal_uInt32                  nColSpan;

    sal_Bool                    bHasContent;

    SwXMLTableContext *GetTable() { return (SwXMLTableContext *)&xMyTable; }

    sal_Bool HasContent() const { return bHasContent; }
    inline void InsertContentIfNotThere();
    inline void InsertContent( SwXMLTableContext *pTable );

public:

    SwXMLTableCellContext_Impl(
            SwXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName,
            const Reference< xml::sax::XAttributeList > & xAttrList,
            SwXMLTableContext *pTable );

    virtual ~SwXMLTableCellContext_Impl();

    virtual SvXMLImportContext *CreateChildContext(
            sal_uInt16 nPrefix, const OUString& rLocalName,
            const Reference< xml::sax::XAttributeList > & xAttrList );
    virtual void EndElement();

    SwXMLImport& GetSwImport() { return (SwXMLImport&)GetImport(); }
};

SwXMLTableCellContext_Impl::SwXMLTableCellContext_Impl(
        SwXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName,
        const Reference< xml::sax::XAttributeList > & xAttrList,
        SwXMLTableContext *pTable ) :
    SvXMLImportContext( rImport, nPrfx, rLName ),
    xMyTable( pTable ),
    nRowSpan( 1UL ),
    nColSpan( 1UL ),
    bHasContent( sal_False )
{
    sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
    for( sal_Int16 i=0; i < nAttrCount; i++ )
    {
        const OUString& rAttrName = xAttrList->getNameByIndex( i );

        OUString aLocalName;
        sal_uInt16 nPrefix =
            GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
                                                            &aLocalName );
        const OUString& rValue = xAttrList->getValueByIndex( i );
        if( XML_NAMESPACE_TABLE == nPrefix )
        {
            if( aLocalName.compareToAscii( sXML_style_name ) == 0 )
                aStyleName = rValue;
            else if( aLocalName.compareToAscii(
                                        sXML_number_columns_spanned ) == 0 )
            {
                nColSpan = (sal_uInt32)rValue.toInt32();
                if( nColSpan < 1UL )
                    nColSpan = 1UL;
            }
            else if( aLocalName.compareToAscii(
                                        sXML_number_rows_spanned ) == 0 )
            {
                nRowSpan = (sal_uInt32)rValue.toInt32();
                if( nRowSpan < 1UL )
                    nRowSpan = 1UL;
            }
        }
    }
}

SwXMLTableCellContext_Impl::~SwXMLTableCellContext_Impl()
{
}

inline void SwXMLTableCellContext_Impl::InsertContentIfNotThere()
{
    if( !bHasContent )
    {
        GetTable()->InsertCell( aStyleName, nRowSpan, nColSpan,
                                GetTable()->InsertTableSection() );
        bHasContent = sal_True;
    }
}

inline void SwXMLTableCellContext_Impl::InsertContent(
                                                SwXMLTableContext *pTable )
{
    GetTable()->InsertCell( aStyleName, nRowSpan, nColSpan, 0, pTable );
    bHasContent = sal_True;
}

SvXMLImportContext *SwXMLTableCellContext_Impl::CreateChildContext(
        sal_uInt16 nPrefix,
        const OUString& rLocalName,
        const Reference< xml::sax::XAttributeList > & xAttrList )
{
    SvXMLImportContext *pContext = 0;

#ifdef XML_CORE_API
    const SvXMLTokenMap& rTokenMap = GetSwImport().GetBodyElemTokenMap();
    sal_Bool bOrdered = sal_False;
    sal_Bool bHeading = sal_False;
    switch( rTokenMap.Get( nPrefix, rLocalName ) )
    {
    case XML_TOK_SW_H:
        bHeading = sal_True;
    case XML_TOK_SW_P:
        InsertContentIfNotThere();
        pContext = new SwXMLParaContext( GetSwImport(),nPrefix, rLocalName,
                                         xAttrList, bHeading );
        break;
    case XML_TOK_SW_ORDERED_LIST:
        bOrdered = sal_True;
    case XML_TOK_SW_UNORDERED_LIST:
        InsertContentIfNotThere();
        pContext = new SwXMLListBlockContext( GetSwImport(),nPrefix, rLocalName,
                                              xAttrList, bOrdered );
        break;

    case XML_TOK_TABLE_SUBTABLE:
        if( !HasContent() )
        {
            SwXMLTableContext *pTblContext =
                new SwXMLTableContext( GetSwImport(), nPrefix, rLocalName,
                                       xAttrList, GetTable() );
            pContext = pTblContext;
            InsertContent( pTblContext );
        }
        break;
    }
#else
    if( XML_NAMESPACE_TABLE == nPrefix &&
        0 == rLocalName.compareToAscii( sXML_sub_table ) )
    {
        if( !HasContent() )
        {
            SwXMLTableContext *pTblContext =
                new SwXMLTableContext( GetSwImport(), nPrefix, rLocalName,
                                       xAttrList, GetTable() );
            pContext = pTblContext;
            InsertContent( pTblContext );
        }
    }
    else
    {
        InsertContentIfNotThere();
        pContext = GetImport().GetTextImport()->CreateTextChildContext(
                        GetImport(), nPrefix, rLocalName, xAttrList,
                        XML_TEXT_TYPE_CELL  );
    }
#endif

    if( !pContext )
        pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );

    return pContext;
}

void SwXMLTableCellContext_Impl::EndElement()
{
    if( bHasContent )
    {
#ifdef XML_CORE_API
        SwPaM& rPaM = GetSwImport().GetPaM();
        SwCntntNode* pCNd = rPaM.GetCntntNode();
        if( pCNd && pCNd->StartOfSectionIndex() + 2UL <
            pCNd->EndOfSectionIndex() )
        {
            rPaM.GetPoint()->nContent.Assign( 0, 0U );
            rPaM.SetMark();
            rPaM.DeleteMark();
            GetSwImport().GetDoc().GetNodes().Delete( rPaM.GetPoint()->nNode );
            rPaM.Move( fnMoveBackward, fnGoNode );
        }
#else
        if( GetImport().GetTextImport()->GetCursor()->goLeft( 1, sal_True ) )
        {
            OUString sEmpty;
            GetImport().GetTextImport()->GetText()->insertString(
                GetImport().GetTextImport()->GetCursorAsRange(), sEmpty,
                sal_True );
        }
#endif
    }
    else
    {
        InsertContentIfNotThere();
    }
}

// ---------------------------------------------------------------------

class SwXMLTableColContext_Impl : public SvXMLImportContext
{
    SvXMLImportContextRef   xMyTable;

    SwXMLTableContext *GetTable() { return (SwXMLTableContext *)&xMyTable; }

public:

    SwXMLTableColContext_Impl(
            SwXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName,
            const Reference< xml::sax::XAttributeList > & xAttrList,
            SwXMLTableContext *pTable );

    virtual ~SwXMLTableColContext_Impl();

    SwXMLImport& GetSwImport() { return (SwXMLImport&)GetImport(); }
};

SwXMLTableColContext_Impl::SwXMLTableColContext_Impl(
        SwXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName,
        const Reference< xml::sax::XAttributeList > & xAttrList,
        SwXMLTableContext *pTable ) :
    SvXMLImportContext( rImport, nPrfx, rLName ),
    xMyTable( pTable )
{
    sal_uInt32 nColRep = 1UL;
    OUString aStyleName;

    sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
    for( sal_Int16 i=0; i < nAttrCount; i++ )
    {
        const OUString& rAttrName = xAttrList->getNameByIndex( i );

        OUString aLocalName;
        sal_uInt16 nPrefix =
            GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
                                                            &aLocalName );
        const OUString& rValue = xAttrList->getValueByIndex( i );
        if( XML_NAMESPACE_TABLE == nPrefix )
        {
            if( aLocalName.compareToAscii( sXML_style_name ) == 0 )
                aStyleName = rValue;
            else if( aLocalName.compareToAscii(
                            sXML_number_columns_repeated ) == 0 )
                nColRep = (sal_uInt32)rValue.toInt32();
        }
    }

    sal_Int32 nWidth = MINLAY;
    sal_Bool bRelWidth = sal_True;
    if( aStyleName.getLength() )
    {
        const SfxPoolItem *pItem;
        const SfxItemSet *pAutoItemSet = 0;
        if( GetSwImport().FindAutomaticStyle(
#ifdef XML_CORE_API
                    SFX_STYLE_FAMILY_FRAME, SW_STYLE_SUBFAMILY_TABLE_COL,
#else
                    XML_STYLE_FAMILY_TABLE_COLUMN,
#endif
                                              aStyleName, &pAutoItemSet ) &&
            pAutoItemSet &&
            SFX_ITEM_SET == pAutoItemSet->GetItemState( RES_FRM_SIZE, sal_False,
                                                        &pItem ) )
        {
            const SwFmtFrmSize *pSize = ((const SwFmtFrmSize *)pItem);
            nWidth = pSize->GetWidth();
            bRelWidth = ATT_VAR_SIZE == pSize->GetSizeType();
        }
    }

    if( nWidth )
    {
        while( nColRep-- && GetTable()->IsInsertColPossible() )
            GetTable()->InsertColumn( nWidth, bRelWidth );
    }
}

SwXMLTableColContext_Impl::~SwXMLTableColContext_Impl()
{
}

// ---------------------------------------------------------------------

class SwXMLTableColsContext_Impl : public SvXMLImportContext
{
    SvXMLImportContextRef   xMyTable;
    sal_Bool bHeader;

    SwXMLTableContext *GetTable() { return (SwXMLTableContext *)&xMyTable; }

public:

    SwXMLTableColsContext_Impl(
            SwXMLImport& rImport, sal_uInt16 nPrfx,
            const OUString& rLName,
            const Reference< xml::sax::XAttributeList > & xAttrList,
            SwXMLTableContext *pTable,
            sal_Bool bHead );

    virtual ~SwXMLTableColsContext_Impl();

    virtual SvXMLImportContext *CreateChildContext(
            sal_uInt16 nPrefix, const OUString& rLocalName,
            const Reference< xml::sax::XAttributeList > & xAttrList );

    SwXMLImport& GetSwImport() { return (SwXMLImport&)GetImport(); }
};

SwXMLTableColsContext_Impl::SwXMLTableColsContext_Impl(
        SwXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName,
        const Reference< xml::sax::XAttributeList > & xAttrList,
        SwXMLTableContext *pTable, sal_Bool bHead ) :
    SvXMLImportContext( rImport, nPrfx, rLName ),
    xMyTable( pTable ),
    bHeader( bHead )
{
}

SwXMLTableColsContext_Impl::~SwXMLTableColsContext_Impl()
{
}

SvXMLImportContext *SwXMLTableColsContext_Impl::CreateChildContext(
        sal_uInt16 nPrefix,
        const OUString& rLocalName,
        const Reference< xml::sax::XAttributeList > & xAttrList )
{
    SvXMLImportContext *pContext = 0;

    if( XML_NAMESPACE_TABLE == nPrefix &&
        rLocalName.compareToAscii( sXML_table_column ) == 0 &&
        GetTable()->IsInsertColPossible() )
        pContext = new SwXMLTableColContext_Impl( GetSwImport(), nPrefix,
                                                  rLocalName, xAttrList,
                                                  GetTable() );

    if( !pContext )
        pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );

    return pContext;
}

// ---------------------------------------------------------------------

class SwXMLTableRowContext_Impl : public SvXMLImportContext
{
    SvXMLImportContextRef   xMyTable;

    SwXMLTableContext *GetTable() { return (SwXMLTableContext *)&xMyTable; }

public:

    SwXMLTableRowContext_Impl(
            SwXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName,
            const Reference< xml::sax::XAttributeList > & xAttrList,
            SwXMLTableContext *pTable, sal_Bool bInHead=sal_False );

    virtual ~SwXMLTableRowContext_Impl();

    virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
            const OUString& rLocalName,
            const Reference< xml::sax::XAttributeList > & xAttrList );

    virtual void EndElement();

    SwXMLImport& GetSwImport() { return (SwXMLImport&)GetImport(); }
};

SwXMLTableRowContext_Impl::SwXMLTableRowContext_Impl( SwXMLImport& rImport,
        sal_uInt16 nPrfx,
        const OUString& rLName,
        const Reference< xml::sax::XAttributeList > & xAttrList,
        SwXMLTableContext *pTable,
        sal_Bool bInHead ) :
    SvXMLImportContext( rImport, nPrfx, rLName ),
    xMyTable( pTable )
{
    OUString aStyleName;

    sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
    for( sal_Int16 i=0; i < nAttrCount; i++ )
    {
        const OUString& rAttrName = xAttrList->getNameByIndex( i );

        OUString aLocalName;
        sal_uInt16 nPrefix =
            GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
                                                            &aLocalName );
        const OUString& rValue = xAttrList->getValueByIndex( i );
        if( XML_NAMESPACE_TABLE == nPrefix &&
            aLocalName.compareToAscii( sXML_style_name ) == 0 )
        {
            aStyleName = rValue;
        }
    }
    GetTable()->InsertRow( aStyleName, bInHead );
}

void SwXMLTableRowContext_Impl::EndElement()
{
    GetTable()->FinishRow();
}

SwXMLTableRowContext_Impl::~SwXMLTableRowContext_Impl()
{
}

SvXMLImportContext *SwXMLTableRowContext_Impl::CreateChildContext(
        sal_uInt16 nPrefix, const OUString& rLocalName,
        const Reference< xml::sax::XAttributeList > & xAttrList )
{
    SvXMLImportContext *pContext = 0;

    if( XML_NAMESPACE_TABLE == nPrefix )
    {
        if( rLocalName.compareToAscii( sXML_table_cell ) == 0 )
        {
            if( GetTable()->IsInsertCellPossible() )
                pContext = new SwXMLTableCellContext_Impl( GetSwImport(),
                                                           nPrefix,
                                                           rLocalName,
                                                           xAttrList,
                                                           GetTable() );
        }
        else if( rLocalName.compareToAscii( sXML_covered_table_cell ) == 0 )
            pContext = new SvXMLImportContext( GetImport(), nPrefix,
                                               rLocalName );
    }

    if( !pContext )
        pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );

    return pContext;
}

// ---------------------------------------------------------------------

class SwXMLTableRowsContext_Impl : public SvXMLImportContext
{
    SvXMLImportContextRef   xMyTable;

    sal_Bool bHeader;

    SwXMLTableContext *GetTable() { return (SwXMLTableContext *)&xMyTable; }

public:

    SwXMLTableRowsContext_Impl( SwXMLImport& rImport, sal_uInt16 nPrfx,
            const OUString& rLName,
            const Reference< xml::sax::XAttributeList > & xAttrList,
            SwXMLTableContext *pTable,
            sal_Bool bHead );

    virtual ~SwXMLTableRowsContext_Impl();

    virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
            const OUString& rLocalName,
            const Reference< xml::sax::XAttributeList > & xAttrList );

    SwXMLImport& GetSwImport() { return (SwXMLImport&)GetImport(); }
};

SwXMLTableRowsContext_Impl::SwXMLTableRowsContext_Impl( SwXMLImport& rImport,
        sal_uInt16 nPrfx,
        const OUString& rLName,
        const Reference< xml::sax::XAttributeList > & xAttrList,
        SwXMLTableContext *pTable,
        sal_Bool bHead ) :
    SvXMLImportContext( rImport, nPrfx, rLName ),
    xMyTable( pTable ),
    bHeader( bHead )
{
}

SwXMLTableRowsContext_Impl::~SwXMLTableRowsContext_Impl()
{
}

SvXMLImportContext *SwXMLTableRowsContext_Impl::CreateChildContext(
        sal_uInt16 nPrefix,
        const OUString& rLocalName,
        const Reference< xml::sax::XAttributeList > & xAttrList )
{
    SvXMLImportContext *pContext = 0;

    if( XML_NAMESPACE_TABLE == nPrefix &&
        rLocalName.compareToAscii( sXML_table_row ) == 0 &&
        GetTable()->IsInsertRowPossible() )
        pContext = new SwXMLTableRowContext_Impl( GetSwImport(), nPrefix,
                                                  rLocalName, xAttrList,
                                                  GetTable(),
                                                  bHeader );

    if( !pContext )
        pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );

    return pContext;
}

// ---------------------------------------------------------------------

typedef SwXMLTableRow_Impl* SwXMLTableRowPtr;
SV_DECL_PTRARR_DEL(SwXMLTableRows_Impl,SwXMLTableRowPtr,5,5)
SV_IMPL_PTRARR(SwXMLTableRows_Impl,SwXMLTableRowPtr)

SwXMLTableCell_Impl *SwXMLTableContext::GetCell( sal_uInt32 nRow,
                                                 sal_uInt32 nCol ) const
{
    return (*pRows)[nRow]->GetCell( nCol );
}

SwXMLTableContext::SwXMLTableContext( SwXMLImport& rImport,
        sal_uInt16 nPrfx,
        const OUString& rLName,
        const Reference< xml::sax::XAttributeList > & xAttrList ) :
    SvXMLImportContext( rImport, nPrfx, rLName ),
    pRows( new SwXMLTableRows_Impl ),
    pTableNode( 0 ),
    pBox1( 0 ),
    pSttNd1( 0 ),
    pBoxFmt( 0 ),
    pLineFmt( 0 ),
    nCurRow( 0UL ),
    nCurCol( 0UL ),
    nWidth( 0UL ),
    bFirstSection( sal_True ),
    bRelWidth( sal_True ),
    bHasHeading( sal_False )
{
    OUString aName;

    sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
    for( sal_Int16 i=0; i < nAttrCount; i++ )
    {
        const OUString& rAttrName = xAttrList->getNameByIndex( i );

        OUString aLocalName;
        sal_uInt16 nPrefix =
            GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
                                                            &aLocalName );
        const OUString& rValue = xAttrList->getValueByIndex( i );
        if( XML_NAMESPACE_TABLE == nPrefix )
        {
            if( aLocalName.compareToAscii( sXML_style_name ) == 0 )
                aStyleName = rValue;
            else if( aLocalName.compareToAscii( sXML_name ) == 0 )
                aName = rValue;
        }
    }

    SwXMLImport& rSwImport = GetSwImport();
    SwDoc& rDoc = rSwImport.GetDoc();

    String sTblName;
    if( aName.getLength() )
    {
        const SwTableFmt *pTblFmt = rDoc.FindTblFmtByName( aName );
        if( !pTblFmt )
            sTblName = aName;
    }
    if( !sTblName.Len() )
        sTblName = rDoc.GetUniqueTblName();

#ifdef XML_CORE_API
    const SwTable* pSwTable = rDoc.InsertTable( *rSwImport.GetPaM().GetPoint(),
                                                1U, 1U, HORI_LEFT );
    pTableNode = pSwTable->GetTableNode();

    SwFrmFmt *pTblFrmFmt = pSwTable->GetFrmFmt();
    pTblFrmFmt->SetName( sTblName );

    rSwImport.GetPaM().Move( fnMoveBackward );
#else
    Reference< XTextTable > xTable;

    const SwXTextTable *pXTable = 0;
    Reference<XMultiServiceFactory> xFactory( GetImport().GetModel(),
                                              UNO_QUERY );
    ASSERT( xFactory.is(), "factory missing" );
    if( xFactory.is() )
    {
        OUString sService(
                RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.text.TextTable" ) );
        Reference<XInterface> xIfc = xFactory->createInstance( sService );
        ASSERT( xIfc.is(), "Couldn't create a table" );

        if( xIfc.is() )
            xTable = Reference< XTextTable > ( xIfc, UNO_QUERY );
    }

    if( xTable.is() )
    {
        xTable->initialize( 1, 1 );

        Reference< XTextContent > xTxtCnt( xTable, UNO_QUERY );
        GetImport().GetTextImport()->InsertTextContent( xTxtCnt );

        Reference<XUnoTunnel> xTableTunnel( xTable, UNO_QUERY);
        if( xTableTunnel.is() )
        {
            pXTable = (SwXTextTable*)xTableTunnel->getSomething(
                                            SwXTextTable::getUnoTunnelId() );
            ASSERT( pXTable, "SwXTextTable missing" );
        }

        Reference < XCellRange > xCellRange( xTable, UNO_QUERY );
        Reference < XCell > xCell = xCellRange->getCellByPosition( 0, 0 );
        Reference < XText> xText( xCell, UNO_QUERY );
        xOldCursor = GetImport().GetTextImport()->GetCursor();
        GetImport().GetTextImport()->SetCursor( xText->createTextCursor() );

    }
    if( pXTable )
    {
        SwFrmFmt *pTblFrmFmt = pXTable->GetFrmFmt();
        ASSERT( pTblFrmFmt, "table format missing" );
        SwTable *pTbl = SwTable::FindTable( pTblFrmFmt );
        ASSERT( pTbl, "table missing" );
        pTableNode = pTbl->GetTableNode();
        ASSERT( pTableNode, "table node missing" );

        pTblFrmFmt->SetName( sTblName );

        SwTableLine *pLine1 = pTableNode->GetTable().GetTabLines()[0U];
        pBox1 = pLine1->GetTabBoxes()[0U];
        pSttNd1 = pBox1->GetSttNd();
    }
#endif
}

SwXMLTableContext::SwXMLTableContext( SwXMLImport& rImport,
        sal_uInt16 nPrfx,
        const OUString& rLName,
        const Reference< xml::sax::XAttributeList > & xAttrList,
        SwXMLTableContext *pTable ) :
    SvXMLImportContext( rImport, nPrfx, rLName ),
    xParentTable( pTable ),
    pRows( new SwXMLTableRows_Impl ),
    pTableNode( pTable->pTableNode ),
    pBox1( 0 ),
    pSttNd1( 0 ),
    pBoxFmt( 0 ),
    pLineFmt( 0 ),
    nCurRow( 0UL ),
    nCurCol( 0UL ),
    nWidth( 0UL ),
    bFirstSection( sal_False ),
    bRelWidth( sal_True ),
    bHasHeading( sal_False )
{
}

SwXMLTableContext::~SwXMLTableContext()
{
}

SvXMLImportContext *SwXMLTableContext::CreateChildContext( sal_uInt16 nPrefix,
        const OUString& rLocalName,
        const Reference< xml::sax::XAttributeList > & xAttrList )
{
    SvXMLImportContext *pContext = 0;

    const SvXMLTokenMap& rTokenMap = GetSwImport().GetTableElemTokenMap();
    sal_Bool bHeader = sal_False;
    switch( rTokenMap.Get( nPrefix, rLocalName ) )
    {
    case XML_TOK_TABLE_HEADER_COLS:
        bHeader = sal_True;
    case XML_TOK_TABLE_COLS:
        pContext = new SwXMLTableColsContext_Impl( GetSwImport(), nPrefix,
                                                   rLocalName, xAttrList,
                                                   this, bHeader );
        break;
    case XML_TOK_TABLE_COL:
        if( IsInsertColPossible() )
            pContext = new SwXMLTableColContext_Impl( GetSwImport(), nPrefix,
                                                      rLocalName, xAttrList,
                                                      this );
        break;
    case XML_TOK_TABLE_HEADER_ROWS:
        bHeader = sal_True;
    case XML_TOK_TABLE_ROWS:
        pContext = new SwXMLTableRowsContext_Impl( GetSwImport(), nPrefix,
                                                   rLocalName, xAttrList,
                                                   this, bHeader );
        break;
    case XML_TOK_TABLE_ROW:
        if( IsInsertRowPossible() )
            pContext = new SwXMLTableRowContext_Impl( GetSwImport(), nPrefix,
                                                      rLocalName, xAttrList,
                                                      this );
        break;
    }

    if( !pContext )
        pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );

    return pContext;
}

void SwXMLTableContext::InsertColumn( sal_Int32 nWidth, sal_Bool bRelWidth )
{
    ASSERT( nCurCol < USHRT_MAX,
            "SwXMLTableContext::InsertColumn: no space left" );
    if( nCurCol >= USHRT_MAX )
        return;

    if( nWidth < MINLAY )
        nWidth = MINLAY;
    else if( nWidth > USHRT_MAX )
        nWidth = USHRT_MAX;
    aColumnWidths.Insert( (sal_uInt16)nWidth, aColumnWidths.Count() );
    aColumnRelWidths.Insert( bRelWidth, aColumnRelWidths.Count() );
}

sal_Int32 SwXMLTableContext::GetColumnWidth( sal_uInt32 nCol,
                                             sal_uInt32 nColSpan ) const
{
    sal_uInt32 nLast = nCol+nColSpan;
    if( nLast > aColumnWidths.Count() )
        nLast = aColumnWidths.Count();

    sal_Int32 nWidth = 0L;
    for( sal_uInt16 i=nCol; i < nLast; i++ )
        nWidth += aColumnWidths[i];

    return nWidth;
}

void SwXMLTableContext::InsertCell( const OUString& rStyleName,
                                    sal_uInt32 nRowSpan, sal_uInt32 nColSpan,
                                    const SwStartNode *pStartNode,
                                    SwXMLTableContext *pTable )
{
    ASSERT( nCurCol < GetColumnCount(),
            "SwXMLTableContext::InsertCell: row is full" );
    ASSERT( nCurRow < USHRT_MAX,
            "SwXMLTableContext::InsertCell: table is full" );
    if( nCurCol >= USHRT_MAX || nCurRow > USHRT_MAX )
        return;

    ASSERT( nRowSpan >=1UL, "SwXMLTableContext::InsertCell: row span is 0" );
    if( 0UL == nRowSpan )
        nRowSpan = 1UL;
    ASSERT( nColSpan >=1UL, "SwXMLTableContext::InsertCell: col span is 0" );
    if( 0UL == nColSpan )
        nColSpan = 1UL;

    sal_uInt32 i, j;

    // Until it is possible to add columns here, fix the column span.
    sal_uInt32 nColsReq = nCurCol + nColSpan;
    if( nColsReq > GetColumnCount() )
    {
        nColSpan = GetColumnCount() - nCurCol;
        nColsReq = GetColumnCount();
    }

    // Check whether there are cells from a previous line already that reach
    // into the current row.
    if( nCurRow > 0UL && nColSpan > 1UL )
    {
        SwXMLTableRow_Impl *pCurRow = (*pRows)[(sal_uInt16)nCurRow];
        sal_uInt32 nLastCol = GetColumnCount() < nColsReq ? GetColumnCount()
                                                     : nColsReq;
        for( i=nCurCol+1UL; i<nLastCol; i++ )
        {
            if( pCurRow->GetCell(i)->IsUsed() )
            {
                // If this cell is used, the column span is truncated
                nColSpan = i - nCurCol;
                nColsReq = i;
                break;
            }
        }
    }

    sal_uInt32 nRowsReq = nCurRow + nRowSpan;
    if( nRowsReq > USHRT_MAX )
    {
        nRowSpan = USHRT_MAX - nCurRow;
        nRowsReq = USHRT_MAX;
    }

    // Add columns: TODO: This should never happen, since we require
    // column definitions!
    for( i=GetColumnCount(); i<nColsReq; i++ )
    {
        aColumnWidths.Insert( MINLAY, aColumnWidths.Count() );
        aColumnRelWidths.Insert( sal_True, aColumnRelWidths.Count() );
    }
    for( i=0; i<pRows->Count(); i++ )
        (*pRows)[(sal_uInt16)i]->Expand( nColsReq, i<nCurRow );

    // Add rows
    if( pRows->Count() < nRowsReq )
    {
        OUString aStyleName;
        for( i=pRows->Count(); i<nRowsReq; i++ )
            pRows->Insert( new SwXMLTableRow_Impl(aStyleName,GetColumnCount()),
                           pRows->Count() );
    }

    // Fill the cells
    for( i=nColSpan; i>0UL; i-- )
        for( j=nRowSpan; j>0UL; j-- )
            GetCell( nRowsReq-j, nColsReq-i )
                ->Set( rStyleName, j, i, pStartNode, pTable );

    // Set current col to the next (free) column
    nCurCol = nColsReq;
    while( nCurCol<GetColumnCount() && GetCell(nCurRow,nCurCol)->IsUsed() )
        nCurCol++;
}

void SwXMLTableContext::InsertRow( const OUString& rStyleName,
                                   sal_Bool bInHead )
{
    ASSERT( nCurRow < USHRT_MAX,
            "SwXMLTableContext::InsertRow: no space left" );
    if( nCurRow >= USHRT_MAX )
        return;

    if( nCurRow < pRows->Count() )
    {
        // The current row has already been inserted because of a row span
        // of a previous row.
        (*pRows)[nCurRow]->Set( rStyleName );
    }
    else
    {
        // add a new row
        pRows->Insert( new SwXMLTableRow_Impl( rStyleName, GetColumnCount()),
                       pRows->Count() );
    }

    // We start at the first column ...
    nCurCol=0UL;

    // ... but this cell may be occupied already.
    while( nCurCol<GetColumnCount() && GetCell(nCurRow,nCurCol)->IsUsed() )
        nCurCol++;

    if( 0UL == nCurRow )
        bHasHeading = bInHead;
}

void SwXMLTableContext::FinishRow()
{
    // Insert an empty cell at the end of the line if the row is not complete
    if( nCurCol < GetColumnCount() )
    {
        OUString aStyleName;
        InsertCell( aStyleName, 1U, GetColumnCount() - nCurCol,
                    InsertTableSection() );
    }

    // Move to the next row.
    nCurRow++;
}

const SwStartNode *SwXMLTableContext::GetPrevStartNode( sal_uInt32 nRow,
                                                        sal_uInt32 nCol ) const
{
    const SwXMLTableCell_Impl *pPrevCell = 0;
    if( GetColumnCount() == nCol )
    {
        // The last cell is the right one here.
        pPrevCell = GetCell( pRows->Count()-1U, GetColumnCount()-1UL );
    }
    else if( 0UL == nRow )
    {
        // There are no vertically merged cells within the first row, so the
        // previous cell is the right one always.
        if( nCol > 0UL )
            pPrevCell = GetCell( nRow, nCol-1UL );
    }
    else
    {
        // If there is a previous cell in the current row that is not spanned
        // from the previous row, its the right one.
        const SwXMLTableRow_Impl *pPrevRow = (*pRows)[(sal_uInt16)nRow-1U];
        sal_uInt32 i = nCol;
        while( !pPrevCell &&  i > 0UL )
        {
            i--;
            if( 1UL == pPrevRow->GetCell( i )->GetRowSpan() )
                pPrevCell = GetCell( nRow, i );
        }

        // Otherwise, the last cell from the previous row is the right one.
        if( !pPrevCell )
            pPrevCell = pPrevRow->GetCell( GetColumnCount()-1UL );
    }

    const SwStartNode *pSttNd;
    if( pPrevCell )
    {
        if( pPrevCell->GetStartNode() )
            pSttNd = pPrevCell->GetStartNode();
        else
            pSttNd = pPrevCell->GetSubTable()->GetLastStartNode();
    }

    return pSttNd;
}

void SwXMLTableContext::FixRowSpan( sal_uInt32 nRow, sal_uInt32 nCol,
                                    sal_uInt32 nColSpan )
{
    sal_uInt32 nLastCol = nCol + nColSpan;
    for( sal_uInt16 i = nCol; i < nLastCol; i++ )
    {
        sal_uInt32 j = nRow;
        sal_uInt32 nRowSpan = 1UL;
        SwXMLTableCell_Impl *pCell = GetCell( j, i );
        while( pCell && pCell->GetRowSpan() > 1UL )
        {
            pCell->SetRowSpan( nRowSpan++ );
            pCell = j > 0UL ? GetCell( --j, i ) : 0;
        }
    }
}

void SwXMLTableContext::ReplaceWithEmptyCell( sal_uInt32 nRow, sal_uInt32 nCol )
{
    const SwStartNode *pPrevSttNd = GetPrevStartNode( nRow, nCol );
    const SwStartNode *pSttNd = InsertTableSection( pPrevSttNd );

    const SwXMLTableCell_Impl *pCell = GetCell( nRow, nCol );
    sal_uInt32 nLastRow = nRow + pCell->GetRowSpan();
    sal_uInt32 nLastCol = nCol + pCell->GetColSpan();

    for( sal_uInt32 i=nRow; i<nLastRow; i++ )
    {
        SwXMLTableRow_Impl *pRow = (*pRows)[i];
        for( sal_uInt32 j=nCol; j<nLastCol; j++ )
            pRow->GetCell( j )->SetStartNode( pSttNd );
    }
}

SwTableBox *SwXMLTableContext::NewTableBox( const SwStartNode *pStNd,
                                             SwTableLine *pUpper )
{
    SwTableBox *pBox;

    if( pBox1 &&
        pBox1->GetSttNd() == pStNd )
    {
        // wenn der StartNode dem StartNode der initial angelegten Box
        // entspricht nehmen wir diese Box
        pBox = pBox1;
        pBox->SetUpper( pUpper );
        pBox1 = 0;
    }
    else
        pBox = new SwTableBox( pBoxFmt, *pStNd, pUpper );

    return pBox;
}

SwTableBox *SwXMLTableContext::MakeTableBox( SwTableLine *pUpper,
                                              sal_uInt32 nTopRow,
                                             sal_uInt32 nLeftCol,
                                              sal_uInt32 nBottomRow,
                                             sal_uInt32 nRightCol )
{
    SwTableBox *pBox = new SwTableBox( pBoxFmt, 0, pUpper );

    // TODO: Share formats!
    SwFrmFmt *pFrmFmt = pBox->ClaimFrmFmt();
    SwFmtFillOrder aFillOrder( pFrmFmt->GetFillOrder() );
    pFrmFmt->ResetAllAttr();
    pFrmFmt->SetAttr( aFillOrder );

    SwTableLines& rLines = pBox->GetTabLines();
    sal_Bool bSplitted = sal_False;

    while( !bSplitted )
    {
        sal_uInt32 nStartRow = nTopRow;
        for( sal_uInt32 i=nTopRow; i<nBottomRow; i++ )
        {
            // Could the table be splitted behind the current row?
            sal_Bool bSplit = sal_True;
            SwXMLTableRow_Impl *pRow = (*pRows)[(sal_uInt16)i];
            for( sal_uInt32 j=nLeftCol; j<nRightCol; j++ )
            {
                bSplit = ( 1UL == pRow->GetCell(j)->GetRowSpan() );
                if( !bSplit )
                    break;
            }
            if( bSplit && (nStartRow>nTopRow || i+1UL<nBottomRow) )
            {
                SwTableLine *pLine =
                    MakeTableLine( pBox, nStartRow, nLeftCol, i+1UL,
                                   nRightCol );

                rLines.C40_INSERT( SwTableLine, pLine, rLines.Count() );

                nStartRow = i+1UL;
                bSplitted = sal_True;
            }
        }
        if( !bSplitted )
        {
            // No splitting was possible. That for, we have to force it.
            // Ruthless!

            nStartRow = nTopRow;
            while( nStartRow < nBottomRow )
            {
                sal_uInt32 nMaxRowSpan = 0UL;
                SwXMLTableRow_Impl *pStartRow = (*pRows)[(sal_uInt16)nStartRow];
                SwXMLTableCell_Impl *pCell;
                for( i=nLeftCol; i<nRightCol; i++ )
                    if( ( pCell=pStartRow->GetCell(i),
                          pCell->GetRowSpan() > nMaxRowSpan ) )
                        nMaxRowSpan = pCell->GetRowSpan();

                nStartRow += nMaxRowSpan;
                if( nStartRow<nBottomRow )
                {
                    SwXMLTableRow_Impl *pPrevRow =
                                        (*pRows)[(sal_uInt16)nStartRow-1U];
                    i = nLeftCol;
                    while( i < nRightCol )
                    {
                        if( pPrevRow->GetCell(i)->GetRowSpan() > 1UL )
                        {
                            const SwXMLTableCell_Impl *pCell =
                                GetCell( nStartRow, i );
                            sal_uInt32 nColSpan = pCell->GetColSpan();
                            FixRowSpan( nStartRow-1UL, i, nColSpan );
                            ReplaceWithEmptyCell( nStartRow, i );
                            i += nColSpan;
                        }
                        else
                        {
                            i++;
                        }
                    }
                }
            }
            // und jetzt nochmal von vorne ...
        }
    }

    return pBox;
}

SwTableBox *SwXMLTableContext::MakeTableBox(
        SwTableLine *pUpper, const SwXMLTableCell_Impl *pCell,
        sal_uInt32 nTopRow, sal_uInt32 nLeftCol, sal_uInt32 nBottomRow,
        sal_uInt32 nRightCol )
{
    SwTableBox *pBox;
    sal_uInt32 nColSpan = nRightCol - nLeftCol;
    sal_uInt32 nRowSpan = nBottomRow - nTopRow;
    sal_Int32 nColWidth = GetColumnWidth( nLeftCol, nColSpan );

    if( pCell->GetStartNode() )
    {
        pBox = NewTableBox( pCell->GetStartNode(), pUpper );
    }
    else
    {
        // und die ist eine Tabelle: dann bauen wir eine neue
        // Box und fuegen die Zeilen der Tabelle in die Zeilen
        // der Box ein
        pBox = new SwTableBox( pBoxFmt, 0, pUpper );
        pCell->GetSubTable()->MakeTable( pBox, nColWidth );
    }

    // TODO: Share formats!
    SwFrmFmt *pFrmFmt = pBox->ClaimFrmFmt();
    SwFmtFillOrder aFillOrder( pFrmFmt->GetFillOrder() );
    pFrmFmt->ResetAllAttr();
    pFrmFmt->SetAttr( aFillOrder );

    const SfxItemSet *pAutoItemSet = 0;
    const OUString& rStyleName = pCell->GetStyleName();
    if( pCell->GetStartNode() && rStyleName &&
        GetSwImport().FindAutomaticStyle(
#ifdef XML_CORE_API
            SFX_STYLE_FAMILY_FRAME, SW_STYLE_SUBFAMILY_TABLE_BOX,
#else
            XML_STYLE_FAMILY_TABLE_CELL,
#endif
                                          pCell->GetStyleName(),
                                          &pAutoItemSet ) )
    {
        if( pAutoItemSet )
            pFrmFmt->SetAttr( *pAutoItemSet );
    }

    pFrmFmt->SetAttr( SwFmtFrmSize( ATT_VAR_SIZE, nColWidth ) );

    return pBox;
}

SwTableLine *SwXMLTableContext::MakeTableLine( SwTableBox *pUpper,
                                                  sal_uInt32 nTopRow,
                                               sal_uInt32 nLeftCol,
                                                  sal_uInt32 nBottomRow,
                                               sal_uInt32 nRightCol )
{
    SwTableLine *pLine;
    if( !pUpper && 0UL==nTopRow )
    {
        pLine = pTableNode->GetTable().GetTabLines()[0U];
    }
    else
    {
        pLine = new SwTableLine( pLineFmt, 0, pUpper );
    }

    // TODO: Share formats!
    SwFrmFmt *pFrmFmt = pLine->ClaimFrmFmt();
    SwFmtFillOrder aFillOrder( pFrmFmt->GetFillOrder() );
    pFrmFmt->ResetAllAttr();
    pFrmFmt->SetAttr( aFillOrder );

    const SfxItemSet *pAutoItemSet = 0;
    const OUString& rStyleName = (*pRows)[nTopRow]->GetStyleName();
    if( 1UL == (nBottomRow - nTopRow) &&
        rStyleName.getLength() &&
        GetSwImport().FindAutomaticStyle(
#ifdef XML_CORE_API
            SFX_STYLE_FAMILY_FRAME, SW_STYLE_SUBFAMILY_TABLE_LINE,
#else
            XML_STYLE_FAMILY_TABLE_ROW,
#endif
                                          rStyleName, &pAutoItemSet ) )
    {
        if( pAutoItemSet )
            pFrmFmt->SetAttr( *pAutoItemSet );
    }

    SwTableBoxes& rBoxes = pLine->GetTabBoxes();

    sal_uInt32 nStartCol = nLeftCol;
    while( nStartCol < nRightCol )
    {
        for( sal_uInt32 nRow=nTopRow; nRow<nBottomRow; nRow++ )
            (*pRows)[(sal_uInt16)nRow]->SetSplitable( sal_True );

        sal_uInt32 nCol = nStartCol;
        sal_uInt32 nSplitCol = nRightCol;
        sal_Bool bSplitted = sal_False;
        while( !bSplitted )
        {
            ASSERT( nCol < nRightCol, "Zu weit gelaufen" );

            // Kann hinter der aktuellen HTML-Tabellen-Spalte gesplittet
            // werden? Wenn ja, koennte der enstehende Bereich auch noch
            // in Zeilen zerlegt werden, wenn man die naechste Spalte
            // hinzunimmt?
            sal_Bool bSplit = sal_True;
            sal_Bool bHoriSplitMayContinue = sal_False;
            sal_Bool bHoriSplitPossible = sal_False;
            for( sal_uInt32 nRow=nTopRow; nRow<nBottomRow; nRow++ )
            {
                SwXMLTableCell_Impl *pCell = GetCell(nRow,nCol);
                // Could the table fragment be splitted horizontally behind
                // the current line?
                sal_Bool bHoriSplit = (*pRows)[(sal_uInt16)nRow]->IsSplitable() &&
                                  nRow+1UL < nBottomRow &&
                                  1UL == pCell->GetRowSpan();
                (*pRows)[(sal_uInt16)nRow]->SetSplitable( bHoriSplit );

                // Could the table fragment be splitted vertically behind the
                // current column (uptp the current line?
                bSplit &= ( 1UL == pCell->GetColSpan() );
                if( bSplit )
                {
                    bHoriSplitPossible |= bHoriSplit;

                    // Could the current table fragment be splitted
                    // horizontally behind the next collumn, too?
                    bHoriSplit &= (nCol+1UL < nRightCol &&
                                   1UL == GetCell(nRow,nCol+1UL)->GetRowSpan());
                    bHoriSplitMayContinue |= bHoriSplit;
                }
            }

#ifndef PRODUCT
            if( nCol == nRightCol-1UL )
            {
                ASSERT( bSplit, "Split-Flag falsch" );
                ASSERT( !bHoriSplitMayContinue,
                        "HoriSplitMayContinue-Flag falsch" );
                SwXMLTableCell_Impl *pCell = GetCell( nTopRow, nStartCol );
                ASSERT( pCell->GetRowSpan() != (nBottomRow-nTopRow) ||
                        !bHoriSplitPossible, "HoriSplitPossible-Flag falsch" );
            }
#endif
            ASSERT( !bHoriSplitMayContinue || bHoriSplitPossible,
                    "bHoriSplitMayContinue, aber nicht bHoriSplitPossible" );

            if( bSplit )
            {
                SwTableBox* pBox = 0;
                SwXMLTableCell_Impl *pCell = GetCell( nTopRow, nStartCol );
                if( pCell->GetRowSpan() == (nBottomRow-nTopRow) &&
                    pCell->GetColSpan() == (nCol+1UL-nStartCol) )
                {
                    // The remaining box neither contains lines nor rows (i.e.
                    // is a content box
                    nSplitCol = nCol + 1UL;

#if 0
                    // eventuell ist die Zelle noch leer
                    if( !pCell->GetContents() )
                    {
                        ASSERT( 1UL==pCell->GetRowSpan(),
                                "leere Box ist nicht 1 Zeile hoch" );
                        const SwStartNode* pPrevStNd =
                            GetPrevBoxStartNode( nTopRow, nStartCol );
                        HTMLTableCnts *pCnts = new HTMLTableCnts(
                            pParser->InsertTableSection(pPrevStNd) );
                        SwHTMLTableLayoutCnts *pCntsLayoutInfo =
                            pCnts->CreateLayoutInfo();

                        pCell->SetContents( pCnts );
                        pLayoutInfo->GetCell( nTopRow, nStartCol )
                                   ->SetContents( pCntsLayoutInfo );

                        // ggf. COLSPAN beachten
                        for( sal_uInt16 j=nStartCol+1; j<nSplitCol; j++ )
                        {
                            GetCell(nTopRow,j)->SetContents( pCnts );
                            pLayoutInfo->GetCell( nTopRow, j )
                                       ->SetContents( pCntsLayoutInfo );
                        }
                    }
#endif
                    pBox = MakeTableBox( pLine, pCell,
                                         nTopRow, nStartCol,
                                         nBottomRow, nSplitCol );
                    bSplitted = sal_True;
                }
                else if( bHoriSplitPossible && bHoriSplitMayContinue )
                {
                    // The table fragment could be splitted behind the current
                    // column, and the remaining fragment could be divided
                    // into lines. Anyway, it could be that this applies to
                    // the next column, too. That for, we check the next
                    // column but rememeber the current one as a good place to
                    // split.
                    nSplitCol = nCol + 1UL;
                }
                else
                {
                    // If the table resulting table fragment could be divided
                    // into lines if spllitting behind the current column, but
                    // this doesn't apply for thr next column, we split begind
                    // the current column. This applies for the last column,
                    // too.
                    // If the resulting box cannot be splitted into rows,
                    // the split at the last split position we remembered.
                    if( bHoriSplitPossible || nSplitCol > nCol+1 )
                    {
                        ASSERT( !bHoriSplitMayContinue,
                                "bHoriSplitMayContinue==sal_True" );
                        ASSERT( bHoriSplitPossible || nSplitCol == nRightCol,
                                "bHoriSplitPossible-Flag sollte gesetzt sein" );

                        nSplitCol = nCol + 1UL;
                    }

                    pBox = MakeTableBox( pLine, nTopRow, nStartCol,
                                         nBottomRow, nSplitCol );
                    bSplitted = sal_True;
                }
                if( pBox )
                    rBoxes.C40_INSERT( SwTableBox, pBox, rBoxes.Count() );
            }
            nCol++;
        }
        nStartCol = nSplitCol;
    }

    return pLine;
}

void SwXMLTableContext::_MakeTable( SwTableBox *pBox )
{
    // fix column widths
    sal_uInt32 i;
    sal_uInt32 nCols = GetColumnCount();

    // If there are empty rows (because of some row span of previous rows)
    // the have to be deleted. The previous rows have to be truncated.

    if( pRows->Count() > nCurRow )
    {
        SwXMLTableRow_Impl *pPrevRow = (*pRows)[(sal_uInt16)nCurRow-1U];
        SwXMLTableCell_Impl *pCell;
        for( i=0UL; i<nCols; i++ )
        {
            if( ( pCell=pPrevRow->GetCell(i), pCell->GetRowSpan() > 1UL ) )
            {
                FixRowSpan( nCurRow-1UL, i, 1UL );
            }
        }
        for( i=(sal_uInt32)pRows->Count()-1UL; i>=nCurRow; i-- )
            pRows->DeleteAndDestroy( i );
    }

    // Make sure there is at least one column.
    if( 0UL == nCols )
    {
        InsertColumn( USHRT_MAX, sal_True );
        nCols = 1UL;
    }
    if( 0UL == pRows->Count() )
    {
        OUString aStyleName;
        InsertCell( aStyleName, 1U, nCols, InsertTableSection() );
    }

    // TODO: Do we have to keep both values, the realtive and the absolute
    // width?
    sal_Int32 nAbsWidth = 0L;
    sal_Int32 nMinAbsColWidth = 0L;
    sal_Int32 nRelWidth = 0L;
    sal_Int32 nMinRelColWidth = 0L;
    sal_uInt32 nRelCols = 0UL;
    for( i=0U; i < nCols; i++ )
    {
        sal_Int32 nColWidth = aColumnWidths[i];
        if( aColumnRelWidths[i] )
        {
            nRelWidth += nColWidth;
            if( 0L == nMinRelColWidth || nColWidth < nMinRelColWidth )
                nMinRelColWidth = nColWidth;
            nRelCols++;
        }
        else
        {
            nAbsWidth += nColWidth;
            if( 0L == nMinAbsColWidth || nColWidth < nMinAbsColWidth )
                nMinAbsColWidth = nColWidth;
        }
    }
    sal_uInt32 nAbsCols = nCols - nRelCols;

    if( bRelWidth )
    {
        // If there a columns that have an absolute width, we have to
        // calculate a relative one for them.
        if( nAbsCols > 0UL )
        {
            // All column that have absolute widths get relative widths;
            // these widths relate to each over like the original absolute
            // widths. The smallest column gets a width that hat the same
            // value as the smallest column that has an relative width
            // already.
            if( 0L == nMinRelColWidth )
                nMinRelColWidth = MINLAY;

            for( i=0UL; nAbsCols > 0UL && i < nCols; i++ )
            {
                if( !aColumnRelWidths[(sal_uInt16)i] )
                {
                    sal_Int32 nRelCol = (aColumnWidths[i] * nMinRelColWidth) /
                                   nMinAbsColWidth;
                    aColumnWidths.Replace( (sal_uInt16)nRelCol, (sal_uInt16)i );
                    nRelWidth += nRelCol;
                    nAbsCols--;
                }
            }
        }

        if( !nWidth )
        {
            // If no width has been specified by now, we may use any value
            nWidth = nRelWidth > USHRT_MAX ? USHRT_MAX : nRelWidth;
        }
        if( nRelWidth != nWidth )
        {
            double n = (double)nWidth / (double)nRelWidth;
            nRelWidth = 0L;
            for( i=0U; i < nCols-1UL; i++ )
            {
                sal_Int32 nW = (sal_Int32)(aColumnWidths[i] * n);
                aColumnWidths.Replace( (sal_uInt16)nW, i );
                nRelWidth += nW;
            }
            aColumnWidths.Replace( (sal_uInt16)(nWidth-nRelWidth),
                                   (sal_uInt16)nCols-1UL );
        }
    }
    else
    {
        // If there are columns that have relative widths, we have to
        // calculate a absolute widths for them.
        if( nRelCols > 0UL )
        {
            // The absolute space that is available for all columns with a
            // relative width.
            sal_Int32 nAbsForRelWidth =
                    nWidth > nAbsWidth ? nWidth - nAbsWidth : 0L;

            // The relative width that has to be distributed in addition to
            // equally widthed columns.
            sal_Int32 nExtraRel = nRelWidth - (nRelCols * nMinRelColWidth);

            // The absolute space that may be distributed in addition to
            // minumum widthed columns.
            sal_Int32 nMinAbs = nRelCols * MINLAY;
            sal_Int32 nExtraAbs =
                    nAbsForRelWidth > nMinAbs ? nAbsForRelWidth - nMinAbs : 0L;

            sal_Bool bMin = sal_False;      // Do all columns get the mininum width?
            sal_Bool bMinExtra = sal_False; // Do all columns get the minimum width plus
                                    // some extra space?

            if( nAbsForRelWidth <= nMinAbs )
            {
                // If there is not enough space left for all columns to
                // get the minimum width, they get the minimum width, anyway.
                nAbsForRelWidth = nMinAbs;
                bMin = sal_True;
            }
            else if( nAbsForRelWidth <= (nRelWidth * MINLAY) /
                                        nMinRelColWidth )
            {
                // If there is enougth space for all columns to get the
                // minimum width, but not to get a width that takes the
                // relative width into account, each column gets the minimum
                // width plus some extra space that is based on the additional
                // space that is available.
                bMinExtra = sal_True;
            }
            // Otherwise, if there is enouth space for every column, every
            // column gets this space.

            for( i=0UL; nRelCols > 0UL && i < nCols; i++ )
            {
                if( aColumnRelWidths[(sal_uInt16)i] )
                {
                    sal_Int32 nAbsCol;
                    if( 1UL == nRelCols )
                    {
                        // The last column that has a relative width gets
                        // all absolute space that is left.
                        nAbsCol = nAbsForRelWidth;
                    }
                    else
                    {
                        if( bMin )
                        {
                            nAbsCol = MINLAY;
                        }
                        else if( bMinExtra )
                        {
                            sal_Int32 nExtraRelCol =
                                aColumnWidths[i] - nMinRelColWidth;
                            nAbsCol = MINLAY + (nExtraRelCol * nExtraAbs) /
                                                 nExtraRel;
                        }
                        else
                        {
                            nAbsCol = (aColumnWidths[i] * nAbsForRelWidth) /
                                      nRelWidth;
                        }
                    }
                    aColumnWidths.Replace( (sal_uInt16)nAbsCol, (sal_uInt16)i );
                    nAbsForRelWidth -= nAbsCol;
                    nAbsWidth += nAbsCol;
                    nRelCols--;
                }
            }
        }

        if( nAbsWidth < nWidth )
        {
            // If the table's width is larger than the absolute column widths,
            // every column get some extra width.
            sal_Int32 nExtraAbs = nWidth - nAbsWidth;
            sal_Int32 nAbsLastCol =
                    aColumnWidths[(sal_uInt16)nCols-1U] + nExtraAbs;
            for( i=0UL; i < nCols-1UL; i++ )
            {
                sal_Int32 nAbsCol = aColumnWidths[i];
                sal_Int32 nExtraAbsCol = (nAbsCol * nExtraAbs) /
                                         nAbsWidth;
                nAbsCol += nExtraAbsCol;
                aColumnWidths.Replace( (sal_uInt16)nAbsCol, i );
                nAbsLastCol -= nExtraAbsCol;
            }
            aColumnWidths.Replace( (sal_uInt16)nAbsLastCol, (sal_uInt16)nCols-1U );
        }
        else if( nAbsWidth > nWidth )
        {
            // If the table's width is smaller than the absolute column
            // widths, every column gets the minimum width plus some extra
            // width.
            sal_Int32 nExtraAbs = nWidth - (nCols * MINLAY);
            sal_Int32 nAbsLastCol = MINLAY + nExtraAbs;
            for( i=0UL; i < nCols-1UL; i++ )
            {
                sal_Int32 nAbsCol = aColumnWidths[i];
                sal_Int32 nExtraAbsCol = (nAbsCol * nExtraAbs) /
                                         nAbsWidth;
                nAbsCol = MINLAY + nExtraAbsCol;
                aColumnWidths.Replace( (sal_uInt16)nAbsCol, i );
                nAbsLastCol -= nExtraAbsCol;
            }
            aColumnWidths.Replace( (sal_uInt16)nAbsLastCol, (sal_uInt16)nCols-1U );
        }
    }

    SwTableLines& rLines =
        pBox ? pBox->GetTabLines()
             : pTableNode->GetTable().GetTabLines();

    sal_uInt32 nStartRow = 0UL;
    sal_uInt32 nRows = pRows->Count();
    for( i=0UL; i<nRows; i++ )
    {
        // Could we split the table behind the current line?
        sal_Bool bSplit = sal_True;
        SwXMLTableRow_Impl *pRow = (*pRows)[(sal_uInt16)i];
        for( sal_uInt32 j=0UL; j<nCols; j++ )
        {
            bSplit = ( 1UL == pRow->GetCell(j)->GetRowSpan() );
            if( !bSplit )
                break;
        }

        if( bSplit )
        {
            SwTableLine *pLine =
                MakeTableLine( pBox, nStartRow, 0UL, i+1UL, nCols );
            if( pBox || nStartRow>0UL )
                rLines.C40_INSERT( SwTableLine, pLine, rLines.Count() );
            nStartRow = i+1UL;
        }
    }
}

void SwXMLTableContext::MakeTable()
{
    SwXMLImport& rSwImport = GetSwImport();

    SwFrmFmt *pFrmFmt = pTableNode->GetTable().GetFrmFmt();

    SwHoriOrient eHoriOrient = HORI_FULL;
    sal_Bool bSetHoriOrient = sal_False;

    sal_uInt16 nPrcWidth = 0U;
    sal_Bool bCalcWidth = sal_False;
    sal_Bool bSetWidth = sal_False;

    pTableNode->GetTable().SetHeadlineRepeat( bHasHeading );

    const SfxItemSet *pAutoItemSet = 0;
    if( aStyleName.getLength() &&
        rSwImport.FindAutomaticStyle(
#ifdef XML_CORE_API
            SFX_STYLE_FAMILY_FRAME, SW_STYLE_SUBFAMILY_TABLE,
#else
            XML_STYLE_FAMILY_TABLE_TABLE,
#endif
                                      aStyleName, &pAutoItemSet ) &&
         pAutoItemSet )
    {
        const SfxPoolItem *pItem;
        const SvxLRSpaceItem *pLRSpace = 0;
        if( SFX_ITEM_SET == pAutoItemSet->GetItemState( RES_LR_SPACE, sal_False,
                                                        &pItem ) )
            pLRSpace = (const SvxLRSpaceItem *)pItem;

        if( SFX_ITEM_SET == pAutoItemSet->GetItemState( RES_HORI_ORIENT, sal_False,
                                                        &pItem ) )
        {
            eHoriOrient = ((const SwFmtHoriOrient *)pItem)->GetHoriOrient();
            switch( eHoriOrient )
            {
            case HORI_FULL:
                if( pLRSpace )
                {
                    eHoriOrient = HORI_NONE;
                    bSetHoriOrient = sal_True;
                }
                break;
            case HORI_LEFT:
                if( pLRSpace )
                {
                    eHoriOrient = HORI_LEFT_AND_WIDTH;
                    bSetHoriOrient = sal_True;
                }
                break;
            }
        }
        else
        {
            bSetHoriOrient = sal_True;
        }

        if( SFX_ITEM_SET == pAutoItemSet->GetItemState( RES_FRM_SIZE, sal_False,
                                                        &pItem ) )
        {
            const SwFmtFrmSize *pSize = (const SwFmtFrmSize *)pItem;
            switch( eHoriOrient )
            {
            case HORI_FULL:
                nWidth = USHRT_MAX;
                break;
            case HORI_NONE:
                // The width will be set in _MakeTable
                break;
            default:
                if( pSize->GetWidthPercent() )
                {
                    // The width will be set in _MakeTable
                    nPrcWidth = pSize->GetWidthPercent();
                }
                else
                {
                    nWidth = pSize->GetWidth();
                    if( nWidth < GetColumnCount() * MINLAY )
                    {
                        nWidth = GetColumnCount() * MINLAY;
                    }
                    else if( nWidth > USHRT_MAX )
                    {
                        nWidth = USHRT_MAX;
                    }
                    bRelWidth = sal_False;
                }
                break;
            }
        }
        else
        {
            eHoriOrient = HORI_FULL;
            bSetHoriOrient = sal_True;
            nWidth = USHRT_MAX;
        }

        pFrmFmt->SetAttr( *pAutoItemSet );
    }
    else
    {
        bSetHoriOrient = sal_True;
        nWidth = USHRT_MAX;
    }

    SwTableLine *pLine1 = pTableNode->GetTable().GetTabLines()[0U];
#ifdef XML_CORE_API
    pBox1 = pLine1->GetTabBoxes()[0U];
#else
    DBG_ASSERT( pBox1 == pLine1->GetTabBoxes()[0U],
                "Why is box 1 change?" );
    pBox1->pSttNd = pSttNd1;
#endif
    pLine1->GetTabBoxes().Remove(0U);

    pLineFmt = (SwTableLineFmt*)pLine1->GetFrmFmt();
    pBoxFmt = (SwTableBoxFmt*)pBox1->GetFrmFmt();

    _MakeTable();

    if( bSetHoriOrient )
        pFrmFmt->SetAttr( SwFmtHoriOrient( 0, eHoriOrient ) );

    // This must be bahind the call to _MakeTable, because nWidth might be
    // changed there.
    pFrmFmt->LockModify();
    SwFmtFrmSize aSize( ATT_VAR_SIZE, nWidth );
    aSize.SetWidthPercent( (sal_Int8)nPrcWidth );
    pFrmFmt->SetAttr( aSize );
    pFrmFmt->UnlockModify();


    for( sal_uInt16 i=0; i<pRows->Count(); i++ )
        (*pRows)[i]->Dispose();

    if( rSwImport.GetDoc().GetRootFrm() )
    {
        pTableNode->DelFrms();
        SwNodeIndex aIdx( *pTableNode->EndOfSectionNode(), 1 );
        pTableNode->MakeFrms( &aIdx );
    }
}

void SwXMLTableContext::MakeTable( SwTableBox *pBox, sal_Int32 nW )
{
    pLineFmt = GetParentTable()->pLineFmt;
    pBoxFmt = GetParentTable()->pBoxFmt;
    nWidth = nW;
    bRelWidth = GetParentTable()->bRelWidth;

    _MakeTable( pBox );
}

const SwStartNode *SwXMLTableContext::InsertTableSection(
                                            const SwStartNode *pPrevSttNd )
{
    const SwStartNode *pStNd;
#ifdef XML_CORE_API
    SwPaM& rPaM = GetSwImport().GetPaM();
    if( bFirstSection )
    {
        // The PaM already is in the first section
        pStNd = rPaM.GetNode()->FindTableBoxStartNode();
        bFirstSection = sal_False;
    }
    else
    {
        SwDoc& rDoc = GetSwImport().GetDoc();
        const SwEndNode *pEndNd = pPrevSttNd ? pPrevSttNd->EndOfSectionNode()
                                             : pTableNode->EndOfSectionNode();
        sal_uInt32 nOffset = pPrevSttNd ? 1UL : 0UL;
        SwNodeIndex aIdx( *pEndNd, nOffset );
        SwTxtFmtColl *pColl = rDoc.GetTxtCollFromPool( RES_POOLCOLL_STANDARD );
        pStNd = rDoc.GetNodes().MakeTextSection( aIdx, SwTableBoxStartNode,
                                                 pColl );
        if( !pPrevSttNd )
        {
            rPaM.GetPoint()->nNode.Assign( *pStNd, 1UL );
            rPaM.GetPoint()->nContent.Assign( rPaM.GetCntntNode(), 0U );
        }
    }
#else
    Reference<XUnoTunnel> xCrsrTunnel( GetImport().GetTextImport()->GetCursor(),
                                       UNO_QUERY);
    ASSERT( xCrsrTunnel.is(), "missing XUnoTunnel for Cursor" );
    SwXTextCursor *pTxtCrsr =
            (SwXTextCursor*)xCrsrTunnel->getSomething(
                                            SwXTextCursor::getUnoTunnelId() );
    ASSERT( pTxtCrsr, "SwXTextCursor missing" );

    if( bFirstSection )
    {
        // The Cursor already is in the first section
        pStNd = pTxtCrsr->GetCrsr()->GetNode()->FindTableBoxStartNode();
        bFirstSection = sal_False;
    }
    else
    {
        SwDoc& rDoc = GetSwImport().GetDoc();
        const SwEndNode *pEndNd = pPrevSttNd ? pPrevSttNd->EndOfSectionNode()
                                             : pTableNode->EndOfSectionNode();
        sal_uInt32 nOffset = pPrevSttNd ? 1UL : 0UL;
        SwNodeIndex aIdx( *pEndNd, nOffset );
        SwTxtFmtColl *pColl = rDoc.GetTxtCollFromPool( RES_POOLCOLL_STANDARD );
        pStNd = rDoc.GetNodes().MakeTextSection( aIdx, SwTableBoxStartNode,
                                                 pColl );
        if( !pPrevSttNd )
        {
            pBox1->pSttNd = pStNd;
            SwCntntNode *pCNd = rDoc.GetNodes()[ pStNd->GetIndex() + 1 ]
                                                            ->GetCntntNode();
            SwPosition aPos( *pCNd );
            aPos.nContent.Assign( pCNd, 0U );

            Reference < XTextRange > xTextRange =
                CreateTextRangeFromPosition( &rDoc, aPos, 0 );
            Reference < XText > xText = xTextRange->getText();
            Reference < XTextCursor > xTextCursor =
                xText->createTextCursorByRange( xTextRange );
            GetImport().GetTextImport()->SetCursor( xTextCursor );
        }
    }

#endif

    return pStNd;
}

void SwXMLTableContext::EndElement()
{
    if( !xParentTable.Is() )
    {
        MakeTable();
#ifdef XML_CORE_API
        GetSwImport().GetPaM().Move( fnMoveForward );
#else
        GetImport().GetTextImport()->SetCursor( xOldCursor );
#endif
    }
}

#ifndef XML_CORE_API
class SwXMLTextImportHelper : public XMLTextImportHelper
{
protected:
    virtual SvXMLImportContext *CreateTableChildContext(
                SvXMLImport& rImport,
                sal_uInt16 nPrefix, const OUString& rLocalName,
                const Reference< XAttributeList > & xAttrList );

public:
    SwXMLTextImportHelper(
            const Reference < XModel>& rModel,
            sal_Bool bInsertM, sal_Bool bStylesOnlyM );
    ~SwXMLTextImportHelper();
};

SwXMLTextImportHelper::SwXMLTextImportHelper(
        const Reference < XModel>& rModel,
        sal_Bool bInsertM, sal_Bool bStylesOnlyM ) :
    XMLTextImportHelper( rModel, bInsertM, bStylesOnlyM )
{
}

SwXMLTextImportHelper::~SwXMLTextImportHelper()
{
}

SvXMLImportContext *SwXMLTextImportHelper::CreateTableChildContext(
                SvXMLImport& rImport,
                sal_uInt16 nPrefix, const OUString& rLocalName,
                const Reference< XAttributeList > & xAttrList )
{
    return new SwXMLTableContext(
                (SwXMLImport&)rImport, nPrefix, rLocalName, xAttrList );
}

XMLTextImportHelper* SwXMLImport::CreateTextImport()
{
    return new SwXMLTextImportHelper( GetModel(), IsInsertMode(),
                                      IsStylesOnlyMode() );
}

#endif

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/xml/xmltbli.cxx,v 1.1.1.1 2000-09-18 17:15:00 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.11  2000/09/18 16:05:07  willem.vandorp
      OpenOffice header added.

      Revision 1.10  2000/09/18 11:58:02  mib
      text frames/graphics import and export continued

      Revision 1.9  2000/08/24 11:16:42  mib
      text import continued

      Revision 1.8  2000/08/10 10:22:16  mib
      #74404#: Adeptions to new XSL/XLink working draft

      Revision 1.7  2000/07/21 12:55:15  mib
      text import/export using StarOffice API

      Revision 1.6  2000/06/08 09:45:55  aw
      changed to use functionality from xmloff project now

      Revision 1.5  2000/05/03 12:08:05  mib
      unicode

      Revision 1.4  2000/03/13 14:33:44  mib
      UNO3

      Revision 1.3  2000/03/10 11:15:04  mib
      #72721#: Made table import much more robust, rowspan

      Revision 1.2  2000/02/17 15:17:57  mib
      #70271#: headline repeat

      Revision 1.1  2000/02/17 14:40:01  mib
      #70271#: XML table import


*************************************************************************/

diff --git a/sw/source/filter/xml/xmltbli.hxx b/sw/source/filter/xml/xmltbli.hxx
new file mode 100644
index 0000000..fae90ba
--- /dev/null
+++ b/sw/source/filter/xml/xmltbli.hxx
@@ -0,0 +1,211 @@
/*************************************************************************
 *
 *  $RCSfile: xmltbli.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:15:00 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _XMLTBLI_HXX
#define _XMLTBLI_HXX

#ifndef _XMLOFF_XMLICTXT_HXX
#include <xmloff/xmlictxt.hxx>
#endif

#if !defined(_SVSTDARR_USHORTS_DECL) || !defined(_SVSTDARR_BOOLS_DECL)
#define _SVSTDARR_USHORTS
#define _SVSTDARR_BOOLS
#include <svtools/svstdarr.hxx>
#endif

class SwXMLImport;
class SwTableNode;
class SwTableBox;
class SwTableLine;
class SwStartNode;
class SwTableBoxFmt;
class SwTableLineFmt;
class SwXMLTableCell_Impl;
class SwXMLTableRows_Impl;


#ifdef XML_CORE_API
enum SwXMLStyleSubFamily
{
    SW_STYLE_SUBFAMILY_TABLE = 0x0001,
    SW_STYLE_SUBFAMILY_TABLE_LINE = 0x0002,
    SW_STYLE_SUBFAMILY_TABLE_BOX = 0x0004,
    SW_STYLE_SUBFAMILY_TABLE_COL = 0x0008
};
#endif


class SwXMLTableContext : public SvXMLImportContext
{
    ::rtl::OUString     aStyleName;

    SvUShorts           aColumnWidths;
    SvBools             aColumnRelWidths;

#ifndef XML_CORE_API
    ::com::sun::star::uno::Reference <
        ::com::sun::star::text::XTextCursor > xOldCursor;
#endif
    SwXMLTableRows_Impl *pRows;

    SwTableNode         *pTableNode;
    SwTableBox          *pBox1;
    const SwStartNode   *pSttNd1;

    SwTableBoxFmt       *pBoxFmt;
    SwTableLineFmt      *pLineFmt;

    SvXMLImportContextRef   xParentTable;   // if table ia a sub table

    sal_Bool            bFirstSection : 1;
    sal_Bool            bRelWidth : 1;
    sal_Bool            bHasHeading : 1;

    sal_uInt32          nCurRow;
    sal_uInt32          nCurCol;
    sal_Int32           nWidth;

    SwTableBox *NewTableBox( const SwStartNode *pStNd,
                             SwTableLine *pUpper );
    SwTableBox *MakeTableBox( SwTableLine *pUpper,
                              const SwXMLTableCell_Impl *pStartNode,
                              sal_uInt32 nTopRow, sal_uInt32 nLeftCol,
                              sal_uInt32 nBottomRow, sal_uInt32 nRightCol );
    SwTableBox *MakeTableBox( SwTableLine *pUpper,
                              sal_uInt32 nTopRow, sal_uInt32 nLeftCol,
                              sal_uInt32 nBottomRow, sal_uInt32 nRightCol );
    SwTableLine *MakeTableLine( SwTableBox *pUpper,
                                sal_uInt32 nTopRow, sal_uInt32 nLeftCol,
                                sal_uInt32 nBottomRow, sal_uInt32 nRightCol );

    void _MakeTable( SwTableBox *pBox=0 );
    void MakeTable( SwTableBox *pBox, sal_Int32 nWidth );
    void MakeTable();

    inline SwXMLTableContext *GetParentTable() const;

    const SwStartNode *GetPrevStartNode( sal_uInt32 nRow,
                                         sal_uInt32 nCol ) const;
    inline const SwStartNode *GetLastStartNode() const;
    void FixRowSpan( sal_uInt32 nRow, sal_uInt32 nCol, sal_uInt32 nColSpan );
    void ReplaceWithEmptyCell( sal_uInt32 nRow, sal_uInt32 nCol );

public:

    SwXMLTableContext( SwXMLImport& rImport, sal_uInt16 nPrfx,
                   const ::rtl::OUString& rLName,
                const ::com::sun::star::uno::Reference<
                    ::com::sun::star::xml::sax::XAttributeList > & xAttrList );
    SwXMLTableContext( SwXMLImport& rImport, sal_uInt16 nPrfx,
                   const ::rtl::OUString& rLName,
                  const ::com::sun::star::uno::Reference<
                    ::com::sun::star::xml::sax::XAttributeList > & xAttrList,
                SwXMLTableContext *pTable );

    virtual ~SwXMLTableContext();

    virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
                const ::rtl::OUString& rLocalName,
                const ::com::sun::star::uno::Reference<
                    ::com::sun::star::xml::sax::XAttributeList > & xAttrList );

    SwXMLImport& GetSwImport() { return (SwXMLImport&)GetImport(); }

    void InsertColumn( sal_Int32 nWidth, sal_Bool bRelWidth );
    sal_Int32 GetColumnWidth( sal_uInt32 nCol, sal_uInt32 nColSpan=1UL ) const;
    inline sal_uInt32 GetColumnCount() const;

    sal_Bool IsInsertCellPossible() const { return nCurCol < GetColumnCount(); }
    sal_Bool IsInsertColPossible() const { return nCurCol < USHRT_MAX; }
    sal_Bool IsInsertRowPossible() const { return nCurRow < USHRT_MAX; }


    void InsertCell( const ::rtl::OUString& rStyleName,
                     sal_uInt32 nRowSpan=1U, sal_uInt32 nColSpan=1U,
                     const SwStartNode *pStNd=0,
                     SwXMLTableContext *pTable=0 );
    void InsertRow( const ::rtl::OUString& rStyleName,
                    sal_Bool bInHead );
    void FinishRow();
    SwXMLTableCell_Impl *GetCell( sal_uInt32 nRow, sal_uInt32 nCol ) const;
    const SwStartNode *InsertTableSection( const SwStartNode *pPrevSttNd=0 );

    virtual void EndElement();
};

inline SwXMLTableContext *SwXMLTableContext::GetParentTable() const
{
    return (SwXMLTableContext *)&xParentTable;
}

inline sal_uInt32 SwXMLTableContext::GetColumnCount() const
{
    return aColumnWidths.Count();
}

inline const SwStartNode *SwXMLTableContext::GetLastStartNode() const
{
    return GetPrevStartNode( 0UL, GetColumnCount() );
}


#endif
diff --git a/sw/source/filter/xml/xmltext.cxx b/sw/source/filter/xml/xmltext.cxx
new file mode 100644
index 0000000..ff25789
--- /dev/null
+++ b/sw/source/filter/xml/xmltext.cxx
@@ -0,0 +1,1647 @@
/*************************************************************************
 *
 *  $RCSfile: xmltext.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:15:00 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "filt_pch.hxx"
#endif

#pragma hdrstop

#include "hintids.hxx"

#ifndef _RTL_STRBUF_HXX_
#include <rtl/strbuf.hxx>
#endif
#ifndef _RTL_USTRBUF_HXX_
#include <rtl/ustrbuf.hxx>
#endif

#ifndef _RSCSFX_HXX
#include <rsc/rscsfx.hxx>
#endif

#ifndef _XMLOFF_NMSPMAP_HXX
#include <xmloff/nmspmap.hxx>
#endif

#ifndef _XMLOFF_XMLNMSPE_HXX
#include <xmloff/xmlnmspe.hxx>
#endif

#ifndef _XMLOFF_I18NMAP_HXX
#include <xmloff/i18nmap.hxx>
#endif

#ifndef _XMLOFF_XMLITEM_HXX
#include <xmloff/xmlitem.hxx>
#endif

#ifndef _XMLOFF_XMLIMPIT_HXX
#include <xmloff/xmlimpit.hxx>
#endif

#ifndef _XMLOFF_XMLITMPR_HXX
#include <xmloff/xmlexpit.hxx>
#endif

#ifndef _XMLOFF_XMLKYWD_HXX
#include <xmloff/xmlkywd.hxx>
#endif

#ifndef _XMLOFF_XMLASTPL_HXX
#include <xmloff/xmlastpl.hxx>
#endif
#ifndef _XMLOFF_TXTIMP_HXX
#include <xmloff/txtimp.hxx>
#endif

#ifndef _XMLOFF_TXTFLDE_HXX
#include <xmloff/txtflde.hxx>
#endif

#ifndef _XMLOFF_TXTVFLDI_HXX
//#include <xmloff/txtvfldi.hxx>
#endif

#ifndef _UNOFIELD_HXX
#include <unofield.hxx>
#endif

#ifndef _SVX_FONTITEM_HXX //autogen wg. SvxFontItem
#include <svx/fontitem.hxx>
#endif

#ifndef _NDTXT_HXX //autogen wg. SwTxtNode
#include <ndtxt.hxx>
#endif
#ifndef _SECTION_HXX //autogen wg. SwSection
#include <section.hxx>
#endif
#ifndef _DOC_HXX //autogen wg. SwDoc
#include <doc.hxx>
#endif
#ifndef _PAM_HXX //autogen wg. SwPaM
#include <pam.hxx>
#endif
#ifndef _TXATBASE_HXX
#include <txatbase.hxx>
#endif
#ifndef _CHARATR_HXX
#include <charatr.hxx>
#endif
#ifndef _CHARFMT_HXX
#include <charfmt.hxx>
#endif
#ifndef _PARATR_HXX
#include <paratr.hxx>
#endif
#ifndef _FLDBAS_HXX
#include <fldbas.hxx>
#endif
#ifndef _FMTFLD_HXX
#include <fmtfld.hxx>
#endif
#ifndef _FCHRFMT_HXX
#include <fchrfmt.hxx>
#endif
#ifndef _UNOSTYLE_HXX
#include "unostyle.hxx"
#endif

#ifndef _XMLECTXT_HXX
#include "xmlectxt.hxx"
#endif
#ifndef _HINTLIST_HXX
#include "hintlist.hxx"
#endif
#ifndef _XMLIMP_HXX
#include "xmlimp.hxx"
#endif
#ifndef _XMLEXP_HXX
#include "xmlexp.hxx"
#endif
#ifndef _XMLNUM_HXX
#include "xmlnum.hxx"
#endif
#ifndef _XMLTBLI_HXX
#include "xmltbli.hxx"
#endif
#ifndef _XMLFMTE_HXX
#include "xmlfmte.hxx"
#endif
#ifndef _XMLTEXTI_HXX
#include "xmltexti.hxx"
#endif

using namespace ::rtl;
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::text;

#ifdef XML_CORE_API
enum SwXMLTextPElemTokens
{
    XML_TOK_SW_SPAN,
    XML_TOK_SW_TAB_STOP,
    XML_TOK_SW_LINE_BREAK,
    XML_TOK_SW_S,
    XML_TOK_SW_P_ELEM_END=XML_TOK_UNKNOWN
};

static __FAR_DATA SvXMLTokenMapEntry aTextPElemTokenMap[] =
{
    { XML_NAMESPACE_TEXT, sXML_span, XML_TOK_SW_SPAN },
    { XML_NAMESPACE_TEXT, sXML_tab_stop, XML_TOK_SW_TAB_STOP },
    { XML_NAMESPACE_TEXT, sXML_line_break, XML_TOK_SW_LINE_BREAK },
    { XML_NAMESPACE_TEXT, sXML_s, XML_TOK_SW_S },
    XML_TOKEN_MAP_END
};

const SvXMLTokenMap& SwXMLImport::GetTextPElemTokenMap()
{
    if( !pTextPElemTokenMap )
        pTextPElemTokenMap = new SvXMLTokenMap( aTextPElemTokenMap );

    return *pTextPElemTokenMap;
}

// ---------------------------------------------------------------------

class SwXMLHint_Impl
{
    SfxItemSet aItemSet;
    xub_StrLen nStart;
    xub_StrLen nEnd;

public:

    SwXMLHint_Impl( SfxItemPool& rPool, xub_StrLen nPos ) :
        aItemSet( rPool, RES_CHRATR_BEGIN,      RES_CHRATR_END - 1,
                            RES_TXTATR_BEGIN,       RES_TXTATR_END - 1,
                         RES_UNKNOWNATR_BEGIN,  RES_UNKNOWNATR_END - 1,  0 ),
        nStart( nPos ),
        nEnd( nPos )
    {}

    SfxItemSet& GetItemSet() { return aItemSet; }
    xub_StrLen GetStart() const { return nStart; }
    xub_StrLen GetEnd() const { return nEnd; }
    void SetEnd( xub_StrLen nPos ) { nEnd = nPos; }
};

typedef SwXMLHint_Impl *SwXMLHint_ImplPtr;
SV_DECL_PTRARR_DEL( SwXMLHints_Impl, SwXMLHint_ImplPtr, 5, 5 )
SV_IMPL_PTRARR( SwXMLHints_Impl, SwXMLHint_ImplPtr )

// ---------------------------------------------------------------------

class SwXMLImpCharContext_Impl : public SvXMLImportContext
{
public:

    SwXMLImpCharContext_Impl(
            SwXMLImport& rImport, sal_uInt16 nPrfx,
            const OUString& rLName,
            const Reference< xml::sax::XAttributeList > & xAttrList,
            sal_Unicode c,
            sal_Bool bCount );

    virtual ~SwXMLImpCharContext_Impl();

    SwXMLImport& GetSwImport() { return (SwXMLImport&)GetImport(); }
};

SwXMLImpCharContext_Impl::SwXMLImpCharContext_Impl(
        SwXMLImport& rImport,
        sal_uInt16 nPrfx,
        const OUString& rLName,
        const Reference< xml::sax::XAttributeList > & xAttrList,
        sal_Unicode c,
        sal_Bool bCount ) :
    SvXMLImportContext( rImport, nPrfx, rLName )
{
    sal_uInt16 nCount = 1;

    if( bCount )
    {
        sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
        for( sal_Int16 i=0; i < nAttrCount; i++ )
        {
            const OUString& rAttrName = xAttrList->getNameByIndex( i );

            OUString aLocalName;
            sal_uInt16 nPrefix =
                GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
                                                                &aLocalName );
            if( XML_NAMESPACE_TEXT == nPrefix &&
                aLocalName.compareToAscii( sXML_c ) == 0 )
            {
                sal_Int32 nTmp = xAttrList->getValueByIndex(i).toInt32();
                if( nTmp > 0L )
                {
                    if( nTmp > USHRT_MAX )
                        nCount = USHRT_MAX;
                    else
                        nCount = (sal_uInt16)nTmp;
                }
            }
        }
    }

    if( 1U == nCount )
    {
        GetSwImport().GetDoc().Insert( GetSwImport().GetPaM(), c );
    }
    else
    {
        OUStringBuffer sBuff( nCount );
        while( nCount-- )
            sBuff.append( c );

        GetSwImport().GetDoc().Insert( GetSwImport().GetPaM(),
                                       sBuff.makeStringAndClear() );
    }
}

SwXMLImpCharContext_Impl::~SwXMLImpCharContext_Impl()
{
}

// ---------------------------------------------------------------------

class SwXMLImpSpanContext_Impl : public SvXMLImportContext
{
    SwXMLHints_Impl&    rHints;
    SwXMLHint_Impl      *pHint;

    sal_Bool&           rIgnoreLeadingSpace;

public:

    SwXMLImpSpanContext_Impl(
            SwXMLImport& rImport, sal_uInt16 nPrfx,
            const OUString& rLName,
            const Reference< xml::sax::XAttributeList > & xAttrList,
            SwXMLHints_Impl& rHnts,
            sal_Bool& rIgnLeadSpace );

    virtual ~SwXMLImpSpanContext_Impl();

    virtual SvXMLImportContext *CreateChildContext(
            sal_uInt16 nPrefix, const OUString& rLocalName,
            const Reference< xml::sax::XAttributeList > & xAttrList );

    virtual void Characters( const OUString& rChars );

    SwXMLImport& GetSwImport() { return (SwXMLImport&)GetImport(); }
};

SwXMLImpSpanContext_Impl::SwXMLImpSpanContext_Impl(
        SwXMLImport& rImport,
        sal_uInt16 nPrfx,
        const OUString& rLName,
        const Reference< xml::sax::XAttributeList > & xAttrList,
        SwXMLHints_Impl& rHnts,
        sal_Bool& rIgnLeadSpace ) :
    SvXMLImportContext( rImport, nPrfx, rLName ),
    rHints( rHnts ),
    rIgnoreLeadingSpace( rIgnLeadSpace ),
    pHint( 0  )
{
    OUString aStyleName;

    sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
    for( sal_Int16 i=0; i < nAttrCount; i++ )
    {
        const OUString& rAttrName = xAttrList->getNameByIndex( i );

        OUString aLocalName;
        sal_uInt16 nPrefix =
            GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
                                                            &aLocalName );
        if( XML_NAMESPACE_TEXT == nPrefix &&
            aLocalName.compareToAscii( sXML_style_name ) == 0 )
            aStyleName = xAttrList->getValueByIndex( i );
    }

    if( aStyleName.getLength() )
    {
        SwDoc& rDoc = GetSwImport().GetDoc();

        // try to find a matching automatic style
        const SfxItemSet *pAutoItemSet = 0;
        OUString sParentStyle;
        if( GetSwImport().FindAutomaticStyle( SFX_STYLE_FAMILY_CHAR,
                                              aStyleName, &pAutoItemSet,
                                              &sParentStyle ) )
        {
            aStyleName = sParentStyle;
        }

        // if an automatic style has not been found or has been found and
        // has a parent style, try to find this one.
        SwCharFmt *pCharFmt = 0;
        if( aStyleName.getLength() )
        {
            const SvI18NMap& rI18NMap = GetSwImport().GetI18NMap();
            String sName( rI18NMap.Get( SFX_STYLE_FAMILY_CHAR,
                                             aStyleName) );
            pCharFmt = rDoc.FindCharFmtByName( sName );
        }

        if( pAutoItemSet || pCharFmt )
        {
            xub_StrLen nPos =
                GetSwImport().GetPaM().GetPoint()->nContent.GetIndex();
            pHint = new SwXMLHint_Impl( rDoc.GetAttrPool(), nPos );
            rHints.Insert( pHint, rHints.Count() );
            if( pAutoItemSet )
                pHint->GetItemSet().Put( *pAutoItemSet );
            if( pCharFmt )
            {
                SwFmtCharFmt aCharFmt( pCharFmt );
                pHint->GetItemSet().Put( aCharFmt );
            }
        }
    }
}

SwXMLImpSpanContext_Impl::~SwXMLImpSpanContext_Impl()
{
    if( pHint )
    {
        xub_StrLen nPos =
            GetSwImport().GetPaM().GetPoint()->nContent.GetIndex();
        pHint->SetEnd( nPos );
    }
}

SvXMLImportContext *SwXMLImpSpanContext_Impl::CreateChildContext(
        sal_uInt16 nPrefix, const OUString& rLocalName,
        const Reference< xml::sax::XAttributeList > & xAttrList )
{
    SvXMLImportContext *pContext = 0;

    const SvXMLTokenMap& rTokenMap = GetSwImport().GetTextPElemTokenMap();
    switch( rTokenMap.Get( nPrefix, rLocalName ) )
    {
    case XML_TOK_SW_SPAN:
        pContext = new SwXMLImpSpanContext_Impl( GetSwImport(), nPrefix,
                                                 rLocalName, xAttrList,
                                                 rHints,
                                                 rIgnoreLeadingSpace );
        break;

    case XML_TOK_SW_TAB_STOP:
        pContext = new SwXMLImpCharContext_Impl( GetSwImport(), nPrefix,
                                                 rLocalName, xAttrList,
                                                 0x0009, sal_False );
        rIgnoreLeadingSpace = sal_False;
        break;

    case XML_TOK_SW_LINE_BREAK:
        pContext = new SwXMLImpCharContext_Impl( GetSwImport(), nPrefix,
                                                 rLocalName, xAttrList,
                                                 0x000A, sal_False );
        rIgnoreLeadingSpace = sal_False;
        break;

    case XML_TOK_SW_S:
        pContext = new SwXMLImpCharContext_Impl( GetSwImport(), nPrefix,
                                                 rLocalName, xAttrList,
                                                 0x0020, sal_True );
        break;

    default:
        // ignore unknown content
        pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
        break;
    }

    return pContext;
}

void SwXMLImpSpanContext_Impl::Characters( const OUString& rChars )
{
    sal_Int32 nLen = rChars.getLength();
    OUStringBuffer sChars( nLen );

    for( sal_Int32 i=0; i < nLen; i++ )
    {
        sal_Unicode c = rChars[i];
        switch( c )
        {
            case 0x20:
            case 0x09:
            case 0x0a:
            case 0x0d:
                if( !rIgnoreLeadingSpace )
                    sChars.append( (sal_Unicode)0x20 );
                rIgnoreLeadingSpace = sal_True;
                break;
            default:
                rIgnoreLeadingSpace = sal_False;
                sChars.append( c );
                break;
        }
    }

    GetSwImport().GetDoc().Insert( GetSwImport().GetPaM(),
                                   sChars.makeStringAndClear() );
}

// ---------------------------------------------------------------------

enum SwXMLTextPAttrTokens
{
    XML_TOK_SW_P_STYLE_NAME,
    XML_TOK_SW_P_COND_STYLE_NAME,
    XML_TOK_SW_P_LEVEL,
    XML_TOK_SW_P_END=XML_TOK_UNKNOWN
};

static __FAR_DATA SvXMLTokenMapEntry aTextPAttrTokenMap[] =
{
    { XML_NAMESPACE_TEXT, sXML_style_name,  XML_TOK_SW_P_STYLE_NAME },
    { XML_NAMESPACE_TEXT, sXML_cond_style_name,
                                            XML_TOK_SW_P_COND_STYLE_NAME },
    { XML_NAMESPACE_TEXT, sXML_level,       XML_TOK_SW_P_LEVEL },
    XML_TOKEN_MAP_END
};

SwXMLParaContext::SwXMLParaContext(
        SwXMLImport& rImport,
        sal_uInt16 nPrfx,
        const OUString& rLName,
        const Reference< xml::sax::XAttributeList > & xAttrList,
        sal_Bool bHead ) :
    SvXMLImportContext( rImport, nPrfx, rLName ),
    pItemSet( 0 ),
    pHints( 0 ),
    bIgnoreLeadingSpace( sal_True ),
    bHeading( bHead )
{
    const SvXMLTokenMap& rTokenMap = GetSwImport().GetTextPAttrTokenMap();

    OUString aStyleName, aCondStyleName;
    sal_uInt8 nOutlineLevel = NO_NUMBERING;

    sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
    for( sal_Int16 i=0; i < nAttrCount; i++ )
    {
        const OUString& rAttrName = xAttrList->getNameByIndex( i );
        const OUString& rValue = xAttrList->getValueByIndex( i );

        OUString aLocalName;
        sal_uInt16 nPrefix =
            GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
                                                            &aLocalName );
        switch( rTokenMap.Get( nPrefix, aLocalName ) )
        {
        case XML_TOK_SW_P_STYLE_NAME:
            aStyleName = rValue;
            break;
        case XML_TOK_SW_P_COND_STYLE_NAME:
            aCondStyleName = rValue;
            break;
        case XML_TOK_SW_P_LEVEL:
            {
                sal_Int32 nTmp = rValue.toInt32() - 1L;
                if( nTmp >= 0L )
                {
                    if( nTmp > MAXLEVEL )
                        nTmp = MAXLEVEL;
                    nOutlineLevel = (sal_uInt8)nTmp;
                }
            }

        }
    }

    if( aCondStyleName.getLength() )
    {
        OUString sTmp( aStyleName );
        aStyleName = aCondStyleName;
        aCondStyleName = sTmp;
    }

    if( aStyleName.getLength() )
    {
        const SfxItemSet *pAutoItemSet = 0;
        OUString sParentStyle;
        if( GetSwImport().FindAutomaticStyle( SFX_STYLE_FAMILY_PARA,
                                              aStyleName, &pAutoItemSet,
                                                 &sParentStyle ) )
        {
            aStyleName = sParentStyle;
        }

        if( pAutoItemSet )
        {
            if( !pItemSet )
                pItemSet = new SfxItemSet( GetSwImport().GetDoc().GetAttrPool(),
                                           aTxtNodeSetRange );
            pItemSet->Put( *pAutoItemSet );
        }

        if( aStyleName.getLength() )
        {
            const SvI18NMap& rI18NMap = GetSwImport().GetI18NMap();
            String sName( rI18NMap.Get( SFX_STYLE_FAMILY_PARA, aStyleName ) );
            SwDoc& rDoc = GetSwImport().GetDoc();
            SwTxtFmtColl *pColl = rDoc.FindTxtFmtCollByName( sName );
            if( pColl )
            {
                sal_uInt8 nCollOutlineLevel = pColl->GetOutlineLevel();
                if( bHeading && !( GetSwImport().IsInsertMode() ||
                                      GetSwImport().IsStylesOnlyMode() ) &&
                    NO_NUMBERING != nOutlineLevel &&
                    ( NO_NUMBERING == nCollOutlineLevel ||
                      GetRealLevel(nCollOutlineLevel) != nOutlineLevel ) )
                {
                    sal_uInt16 nArrLen = rDoc.GetTxtFmtColls()->Count();
                    for( sal_uInt16 i=0; i<nArrLen; i++ )
                    {
                        SwTxtFmtColl* pCur = (*rDoc.GetTxtFmtColls())[i];
                        sal_uInt8 nCurLevel = pCur->GetOutlineLevel();
                        if( nCurLevel != NO_NUMBERING &&
                            GetRealLevel(nCurLevel) == nOutlineLevel )
                        {
                            if( pColl != pCur )
                                pCur->SetOutlineLevel( NO_NUMBERING );
                            break;
                        }
                    }
                    pColl->SetOutlineLevel( nOutlineLevel );
                }
                rDoc.SetTxtFmtColl( GetSwImport().GetPaM(), pColl );
            }
        }
    }
}

SwXMLParaContext::~SwXMLParaContext()
{
#ifndef PRODUCT
    SwCntntNode *pTTTNd = GetSwImport().GetPaM().GetNode()->GetCntntNode();
#endif

    // Start a new node.
    SwDoc& rDoc = GetSwImport().GetDoc();
    rDoc.AppendTxtNode( *GetSwImport().GetPaM().GetPoint() );

    // Create a "attribute" PaM and move it to the previous node.
    SwPaM aPaM( GetSwImport().GetPaM() );
    aPaM.Move( fnMoveBackward, fnGoCntnt );
    aPaM.SetMark();
    SwCntntNode *pCNd = aPaM.GetNode()->GetCntntNode();
    ASSERT( pCNd,
       "SwXMLParaContext::~SwXMLParaContext: no content node" );
#ifndef PRODUCT
    ASSERT( pTTTNd == pCNd,
       "SwXMLParaContext::~SwXMLParaContext: wrong content node" );
    ASSERT( (const SwIndexReg*)pTTTNd == aPaM.GetPoint()->nContent.GetIdxReg(),
       "SwXMLParaContext::~SwXMLParaContext: wrong content node" );
#endif

    aPaM.GetPoint()->nContent.Assign( pCNd, 0 );

    // Set paragraph attributes.
    if( pItemSet )
        rDoc.Insert( aPaM, *pItemSet );
    delete pItemSet;

    // Set numbering rules
    SwTxtNode *pTxtNd = pCNd->GetTxtNode();
    const SwNumRule *pNumRule = pTxtNd->GetNumRule();
    if( GetSwImport().IsInList() )
    {
        SwXMLListBlockContext *pListBlock = GetSwImport().GetListBlock();
        String sStyleName( GetSwImport().GetI18NMap().Get(
                        SFX_STYLE_FAMILY_PSEUDO,pListBlock->GetStyleName()) );
        if( !pNumRule ||
            ( !pListBlock->HasGeneratedStyle() &&
              pNumRule->GetName() != sStyleName ) )
        {
            rDoc.Insert( aPaM, SwNumRuleItem( sStyleName ) );
            pNumRule = pTxtNd->GetNumRule();
        }

        ASSERT( pNumRule, "SwXMLParaContext::~SwXMLParaContext: no num rule" );
        GetSwImport().SetUsed( *pNumRule );

        SwXMLListItemContext *pListItem = GetSwImport().GetListItem();

        sal_uInt8 nLevel = pListBlock->GetLevel() > MAXLEVEL
                            ? MAXLEVEL
                            : (sal_uInt8)pListBlock->GetLevel();
        if( !pListItem )
            nLevel |= NO_NUMLEVEL;

        SwNodeNum aNodeNum( nLevel );
        if( pListBlock->IsRestartNumbering() )
        {
            aNodeNum.SetStart();
            pListBlock->ResetRestartNumbering();
        }
        if( pListItem && pListItem->HasStartValue() )
        {
            aNodeNum.SetSetValue( pListItem->GetStartValue() );
        }

        pTxtNd->UpdateNum( aNodeNum );

        GetSwImport().SetListItem( 0 );
    }
    else
    {
        // If the paragraph is not in a list but its style, remove it from
        // the list.
        if( pNumRule )
            rDoc.Insert( aPaM, SwNumRuleItem() );
    }

    if( pHints && pHints->Count() )
    {
        for( sal_uInt16 i=0; i<pHints->Count(); i++ )
        {
            SwXMLHint_Impl *pHint = (*pHints)[i];
            xub_StrLen nStt = pHint->GetStart();
            xub_StrLen nEnd = pHint->GetEnd();
            if( nStt != nEnd )
            {
                aPaM.GetPoint()->nContent.Assign( pCNd, nEnd );
                aPaM.SetMark();
                aPaM.GetPoint()->nContent.Assign( pCNd, nStt );
                rDoc.Insert( aPaM, pHint->GetItemSet() );
            }
        }
    }
    delete pHints;
}

SvXMLImportContext *SwXMLParaContext::CreateChildContext(
        sal_uInt16 nPrefix, const OUString& rLocalName,
        const Reference< xml::sax::XAttributeList > & xAttrList )
{
    SvXMLImportContext *pContext = 0;

    const SvXMLTokenMap& rTokenMap = GetSwImport().GetTextPElemTokenMap();
    switch( rTokenMap.Get( nPrefix, rLocalName ) )
    {
    case XML_TOK_SW_SPAN:
        if( !pHints )
            pHints = new SwXMLHints_Impl;
        pContext = new SwXMLImpSpanContext_Impl( GetSwImport(), nPrefix,
                                                 rLocalName, xAttrList,
                                                 *pHints, bIgnoreLeadingSpace );
        break;

    case XML_TOK_SW_TAB_STOP:
        pContext = new SwXMLImpCharContext_Impl( GetSwImport(), nPrefix,
                                                 rLocalName, xAttrList,
                                                 0x0009, sal_False );
        bIgnoreLeadingSpace = sal_False;
        break;

    case XML_TOK_SW_LINE_BREAK:
        pContext = new SwXMLImpCharContext_Impl( GetSwImport(), nPrefix,
                                                 rLocalName, xAttrList,
                                                 0x000A, sal_False );
        bIgnoreLeadingSpace = sal_False;
        break;

    case XML_TOK_SW_S:
        pContext = new SwXMLImpCharContext_Impl( GetSwImport(), nPrefix,
                                                 rLocalName, xAttrList,
                                                 0x0020, sal_True );
        break;

    default:
        // ignore unknown content
        pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
        break;
    }

    return pContext;
}

void SwXMLParaContext::Characters( const OUString& rChars )
{
    sal_Int32 nLen = rChars.getLength();
    OUStringBuffer sChars( nLen );

    for( sal_Int32 i=0; i < nLen; i++ )
    {
        sal_Unicode c = rChars[ i ];
        switch( c )
        {
            case 0x20:
            case 0x09:
            case 0x0a:
            case 0x0d:
                if( !bIgnoreLeadingSpace )
                    sChars.append( (sal_Unicode)0x20 );
                bIgnoreLeadingSpace = sal_True;
                break;
            default:
                bIgnoreLeadingSpace = sal_False;
                sChars.append( c );
                break;
        }
    }

    GetSwImport().GetDoc().Insert( GetSwImport().GetPaM(),
                                   sChars.makeStringAndClear() );
}

const SvXMLTokenMap& SwXMLImport::GetTextPAttrTokenMap()
{
    if( !pTextPAttrTokenMap )
        pTextPAttrTokenMap = new SvXMLTokenMap( aTextPAttrTokenMap );

    return *pTextPAttrTokenMap;
}
#endif

// ---------------------------------------------------------------------

#ifdef XML_CORE_API
static __FAR_DATA SvXMLTokenMapEntry aBodyElemTokenMap[] =
{
    { XML_NAMESPACE_TEXT, sXML_p,               XML_TOK_SW_P                },
    { XML_NAMESPACE_TEXT, sXML_h,               XML_TOK_SW_H                },
    { XML_NAMESPACE_TEXT, sXML_ordered_list,    XML_TOK_SW_ORDERED_LIST },
    { XML_NAMESPACE_TEXT, sXML_unordered_list,  XML_TOK_SW_UNORDERED_LIST },
    { XML_NAMESPACE_TABLE,sXML_table,           XML_TOK_TABLE_TABLE         },
    { XML_NAMESPACE_TABLE,sXML_sub_table,       XML_TOK_TABLE_SUBTABLE      },
    XML_TOKEN_MAP_END
};
#endif

class SwXMLBodyContext_Impl : public SvXMLImportContext
{
#ifdef XML_CORE_API
    const SwXMLImport& GetSwImport() const
            { return (const SwXMLImport&)GetImport(); }
#endif
    SwXMLImport& GetSwImport() { return (SwXMLImport&)GetImport(); }

public:

    SwXMLBodyContext_Impl( SwXMLImport& rImport, sal_uInt16 nPrfx,
                             const OUString& rLName );
    virtual ~SwXMLBodyContext_Impl();

    virtual SvXMLImportContext *CreateChildContext(
            sal_uInt16 nPrefix, const OUString& rLocalName,
            const Reference< xml::sax::XAttributeList > & xAttrList );
};

SwXMLBodyContext_Impl::SwXMLBodyContext_Impl( SwXMLImport& rImport,
                                              sal_uInt16 nPrfx,
                                                   const OUString& rLName ) :
    SvXMLImportContext( rImport, nPrfx, rLName )
{
}

SwXMLBodyContext_Impl::~SwXMLBodyContext_Impl()
{
}

SvXMLImportContext *SwXMLBodyContext_Impl::CreateChildContext(
        sal_uInt16 nPrefix, const OUString& rLocalName,
        const Reference< xml::sax::XAttributeList > & xAttrList )
{
    SvXMLImportContext *pContext = 0;

#ifndef XML_CORE_API
    pContext = GetSwImport().GetTextImport()->CreateTextChildContext(
            GetImport(), nPrefix, rLocalName, xAttrList,
               XML_TEXT_TYPE_BODY );
#else
    const SvXMLTokenMap& rTokenMap = GetSwImport().GetBodyElemTokenMap();
    sal_Bool bOrdered = sal_False;
    sal_Bool bHeading = sal_False;

    switch( rTokenMap.Get( nPrefix, rLocalName ) )
    {
    case XML_TOK_SW_H:
        bHeading = sal_True;
    case XML_TOK_SW_P:
        pContext = new SwXMLParaContext( GetSwImport(),nPrefix, rLocalName,
                                         xAttrList, bHeading );
        break;
    case XML_TOK_SW_ORDERED_LIST:
        bOrdered = sal_True;
    case XML_TOK_SW_UNORDERED_LIST:
        pContext = new SwXMLListBlockContext( GetSwImport(),nPrefix, rLocalName,
                                              xAttrList, bOrdered );
        break;
    case XML_TOK_TABLE_TABLE:
        if( !GetSwImport().GetPaM().GetNode()->FindTableNode() )
            pContext = new SwXMLTableContext( GetSwImport(),nPrefix, rLocalName,
                                              xAttrList );
        break;
    }
#endif

    if( !pContext )
        pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );

    return pContext;
}

#ifdef XML_CORE_API
const SvXMLTokenMap& SwXMLImport::GetBodyElemTokenMap()
{
    if( !pBodyElemTokenMap )
        pBodyElemTokenMap = new SvXMLTokenMap( aBodyElemTokenMap );

    return *pBodyElemTokenMap;
}
#endif

SvXMLImportContext *SwXMLImport::CreateBodyContext(
                                       const OUString& rLocalName )
{
    // styles nun einfuegen!
    InsertStyles();

    SvXMLImportContext *pContext = 0;

    if( !IsStylesOnlyMode() )
         pContext = new SwXMLBodyContext_Impl( *this, XML_NAMESPACE_OFFICE,
                                              rLocalName );
    else
        pContext = new SvXMLImportContext( *this, XML_NAMESPACE_OFFICE,
                                           rLocalName );

    return pContext;
}

// ---------------------------------------------------------------------

#ifdef XML_CORE_API
class SwXMLHintEndPosList : public SwHintEndPosList
{
    OUString sQSpan;
    SwXMLExport& rExport;

public:

    SwXMLHintEndPosList( SwXMLExport& rExp );
    ~SwXMLHintEndPosList();

    void Insert( const SfxPoolItem& rItem, xub_StrLen nStart, xub_StrLen nEnd );

    sal_Bool HasStartingOrEndingHints( xub_StrLen nPos );

    sal_Bool ExportStartingHints( xub_StrLen nPos );
    sal_Bool ExportEndingHints( xub_StrLen nPos );
};

SwXMLHintEndPosList::SwXMLHintEndPosList( SwXMLExport& rExp ) :
    rExport( rExp )
{
    OUString sLName( OUString::createFromAscii( sXML_span ) );
    sQSpan = rExp.GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_TEXT, sLName );
}

SwXMLHintEndPosList::~SwXMLHintEndPosList()
{
}

void SwXMLHintEndPosList::Insert( const SfxPoolItem& rItem,
                                  xub_StrLen nStart, xub_StrLen nEnd )
{
    // empty hints will be ignored
    if( nStart != nEnd )
    {
        InsertHint( rItem, nStart, nEnd );
    }
}

sal_Bool SwXMLHintEndPosList::ExportStartingHints( xub_StrLen nPos )
{
    sal_Bool bRet = sal_False;

    // Hints in the start list are sorted ascending.

    sal_uInt16 nCount = GetStartingCount();
    for( sal_uInt16 i=0; i< nCount; i++ )
    {
        SwHintSttEndPos *pPos = GetStartingHint( i );
        xub_StrLen nStart = pPos->GetStart();
        if( nStart > nPos )
        {
            // This and all following hint will be started later
            break;
        }
        else if( nStart == nPos )
        {
            // export hint's start
//          if( bIWSOutside )
//              rExport.GetDocHandler()->ignorableWhitespace( rExport.sWS );
            const SfxPoolItem& rItem = pPos->GetItem();
            if( (rItem.Which() >= RES_CHRATR_BEGIN &&
                                        rItem.Which() < RES_CHRATR_END) ||
                (rItem.Which() >= RES_UNKNOWNATR_BEGIN &&
                                        rItem.Which() < RES_UNKNOWNATR_END) )
            {
                SfxItemSet aItemSet( rExport.GetDoc().GetAttrPool(),
                                 RES_CHRATR_BEGIN,      RES_CHRATR_END - 1,
                                 RES_UNKNOWNATR_BEGIN,  RES_UNKNOWNATR_END - 1,
                                 0 );
                aItemSet.Put( rItem );
                OUString sName( rExport.GetItemSetAutoStylePool().Find(
                                    SFX_STYLE_FAMILY_CHAR, aItemSet ) );
                ASSERT( sName.getLength(), "no automatic style found" );
                if( sName.getLength() )
                    rExport.AddAttribute( XML_NAMESPACE_TEXT, sXML_style_name,
                                          sName );
            }
            else
            {
                rExport.GetParaItemMapper().exportXML(
                            rExport.GetAttrList(), rItem,
                            rExport.GetTwipUnitConverter(),
                            rExport.GetNamespaceMap() );
            }

            rExport.GetDocHandler()->startElement( sQSpan,
                                                   rExport.GetXAttrList() );
            rExport.ClearAttrList();

            bRet = sal_True;
        }
    }

    return bRet;
}

sal_Bool SwXMLHintEndPosList::ExportEndingHints( xub_StrLen nPos )
{
    sal_Bool bRet = sal_False;

    // Hints in the end list are sorted ascending
    sal_uInt16 i=0;
    while( i < GetEndingCount() )
    {
        SwHintSttEndPos *pPos = GetEndingHint( i );
        xub_StrLen nEnd = pPos->GetEnd();

        if( STRING_LEN==nPos || nEnd == nPos )
        {
//          if( bIgnWS )
//              rExport.GetDocHandler()->ignorableWhitespace( rExport.sWS );
            rExport.GetDocHandler()->endElement( sQSpan );
            _RemoveHint( i );

            bRet = sal_True;
        }
        else if( nEnd > nPos )
        {
            // This and all hints that are following will be closed later
            break;
        }
        else
        {
            // This hint should have been exported already!
            ASSERT( nEnd >= nPos,
                    "SwXMLHintEndPosLst::OutEndAttrs: hint overseen" );
            i++;
        }
    }

    return bRet;
}

sal_Bool SwXMLHintEndPosList::HasStartingOrEndingHints( xub_StrLen nPos )
{
    sal_Bool bRet = sal_False;

    // Hints in the start list are sorted ascending.

    sal_uInt16 nCount = GetStartingCount();
    for( sal_uInt16 i=0; i< nCount; i++ )
    {
        SwHintSttEndPos *pPos = GetStartingHint( i );
        xub_StrLen nStart = pPos->GetStart();
        if( nStart == nPos )
        {
            bRet = sal_True;
            break;
        }
        else if( nStart > nPos )
        {
            // This and all following hint will be started later
            break;
        }
    }

    if( !bRet )
    {
        nCount = GetEndingCount();
        for( i=0; i < nCount; i++ )
        {
            SwHintSttEndPos *pPos = GetEndingHint( i );
            xub_StrLen nEnd = pPos->GetEnd();

            if( nEnd == nPos )
            {
                bRet = sal_True;
                break;
            }
            else if( nEnd > nPos )
            {
                // This and all hints that are following will be closed later
                break;
            }
        }
    }

    return bRet;
}

void SwXMLExport::ExportTxtNode( const SwTxtNode& rTxtNd, xub_StrLen nStart,
                                 xub_StrLen nEnd, sal_Bool bExportWholeNode )
{
    // <text:p ...>
    CheckAttrList();

    const SfxItemSet *pItemSet = rTxtNd.GetpSwAttrSet();

    // text:style-name="..."
    // If the text collection is a conditional style, the current style
    // is written as style-name rather than the master style.
    const SwFmtColl& rColl = rTxtNd.GetAnyFmtColl();
    OUString sStyleName( rColl.GetName() );
    if( pItemSet )
        sStyleName = FindParaAutoStyle( sStyleName, *pItemSet );
    else
        sStyleName = SwXStyleFamilies::GetProgrammaticName( sStyleName,
                                                    SFX_STYLE_FAMILY_PARA );
    ASSERT( sStyleName.getLength(), "auto para style not found" );
    AddAttribute( XML_NAMESPACE_TEXT, sXML_style_name, sStyleName );

    sal_uInt8 nOutlineLevel = ((const SwTxtFmtColl&)rColl).GetOutlineLevel();

    // text:cond-style-name="..."
    if( rTxtNd.GetCondFmtColl() )
    {
        // master style
        const SwFmtColl *pColl = rTxtNd.GetFmtColl();
        OUString sCondStyleName;
        if( &rColl == pColl )
        {
            sCondStyleName = sStyleName;
        }
        else
        {
            sCondStyleName = pColl->GetName();
            if( pItemSet )
                sCondStyleName = FindParaAutoStyle( sCondStyleName, *pItemSet );
            else
                sCondStyleName = SwXStyleFamilies::GetProgrammaticName(
                                                    sCondStyleName,
                                                    SFX_STYLE_FAMILY_PARA );
            ASSERT( sCondStyleName.getLength(), "auto para style not found" );
            nOutlineLevel = ((const SwTxtFmtColl *)pColl)->GetOutlineLevel();
        }
        AddAttribute( XML_NAMESPACE_TEXT, sXML_cond_style_name,
                      sCondStyleName );
    }

    if( NO_NUMBERING != nOutlineLevel )
    {
        OUStringBuffer sTmp;
        sTmp.append( GetRealLevel(nOutlineLevel)+1L );
        AddAttribute( XML_NAMESPACE_TEXT, sXML_level,
                      sTmp.makeStringAndClear() );
    }

    {
        const sal_Char *pElem =
            NO_NUMBERING == nOutlineLevel ? sXML_p : sXML_h;
        SvXMLElementExport aElem( *this, XML_NAMESPACE_TEXT, pElem, sal_True,
                                  sal_False );
        xub_StrLen nOffset = 0;

        const String& rText = rTxtNd.GetTxt();
        xub_StrLen nPos = pCurPaM->GetPoint()->nContent.GetIndex();
        xub_StrLen nEndPos = rText.Len();
        if( pCurPaM->GetPoint()->nNode == pCurPaM->GetMark()->nNode )
            nEndPos = pCurPaM->GetMark()->nContent.GetIndex();

        const SwpHints *pHints = rTxtNd.GetpSwpHints();
        sal_uInt16 nHintCount = pHints ? pHints->Count() : 0;
        sal_uInt16 nHintPos = 0;
        SwXMLHintEndPosList aHintLst( *this );

        // export all hints before the current text position
        const SwTxtAttr * pTxtAttr = 0;
        if( nHintCount && nPos > *( pTxtAttr = (*pHints)[0] )->GetStart() )
        {
            do
            {
                nHintPos++;

                if( pTxtAttr->GetEnd() )
                {
                    DBG_ASSERT( RES_TXTATR_FIELD == pTxtAttr->Which(),
                                "ignore fields" );
                    xub_StrLen nHtEnd = *pTxtAttr->GetEnd(),
                           nHtStt = *pTxtAttr->GetStart();
                    if( (!bExportWholeNode && nHtEnd <= nPos) ||
                         nHtEnd == nHtStt )
                        continue;

                    // add hint to hint list
                    if( bExportWholeNode )
                    {
                        aHintLst.Insert( pTxtAttr->GetAttr(), nHtStt + nOffset,
                                         nHtEnd + nOffset );
                    }
                    else
                    {
                        xub_StrLen nTmpStt = nHtStt < nPos ? nPos : nHtStt;
                        xub_StrLen nTmpEnd = nHtEnd < nEndPos ? nHtEnd : nEndPos;
                        aHintLst.Insert( pTxtAttr->GetAttr(), nTmpStt + nOffset,
                                            nTmpEnd + nOffset );
                    }
                }

            }
            while( nHintPos < nHintCount &&
                   nPos > *( pTxtAttr = (*pHints)[nHintPos ] )->GetStart() );
        }

        xub_StrLen nExpStartPos = nPos;
        sal_Bool bCurrCharIsSpace = sal_False;
        xub_StrLen nSpaceChars = 0;
        for( ; nPos < nEndPos; nPos++ )
        {
            sal_Bool bExpCharAsText = sal_True;
            const SwTxtAttr * pTxtAttrWOEnd = 0;
            if( nHintPos < nHintCount && *pTxtAttr->GetStart() == nPos
                && nPos != nEndPos )
            {
                do
                {
                    if( pTxtAttr->GetEnd() )
                    {
                        if( *pTxtAttr->GetEnd() != nPos )
                        {
                            // insert hint into the hint list if its not
                            // empty
                            aHintLst.Insert( pTxtAttr->GetAttr(),
                                             nPos + nOffset,
                                                *pTxtAttr->GetEnd() + nOffset );
                        }
                    }
                    else
                    {
                        // hints without end must be exported after all
                        // other hints that start at this position
                        ASSERT( !pTxtAttrWOEnd,
                        "SwXMLExport::ExportTxtNode: There is a hint already" );
                        pTxtAttrWOEnd = pTxtAttr;
                        bExpCharAsText = sal_False;     // ignore 0xff
                    }
                }
                while( ++nHintPos < nHintCount &&
                      nPos == *( pTxtAttr = (*pHints)[nHintPos] )->GetStart() );
            }

            // Some characters require some extra work ...
            sal_Bool bExpCharAsElement = sal_False;
            sal_Bool bPrevCharIsSpace = bCurrCharIsSpace;
            bCurrCharIsSpace = sal_False;
            if( bExpCharAsText )
            {
                switch( rText.GetChar(nPos) )
                {
                case 0x0009:    // Tab
                case 0x000A:    // LF
                    // These characters are exported as text.
                    bExpCharAsElement = sal_True;
                    bExpCharAsText = sal_False;
                    break;
                case 0x0020:    // Blank
                    if( bPrevCharIsSpace )
                    {
                        // If the previous character is a space character,
                        // too, export a special space element.
                        bExpCharAsText = sal_False;
                    }
                    bCurrCharIsSpace = sal_True;
                    break;
                }
            }

            // If the current character is not exported as text or if there
            // are hints starting or ending before the current position,
            // the text that has not been exported by now has to be exported
            // now.
            if( nPos > nExpStartPos &&
                ( !bExpCharAsText ||
                  aHintLst.HasStartingOrEndingHints( nPos+nOffset ) ) )
            {
                ASSERT( 0==nSpaceChars,
                        "SwXMLExport::ExportTxtNode: pending spaces" );
                String sExp( rText.Copy( nExpStartPos,
                                         nPos - nExpStartPos ) );
                GetDocHandler()->characters( sExp );
                nExpStartPos = nPos;
            }

            // If there are spaces left that have not been exported and the
            // current chracter is either not a space or there are some
            // hints starting or ending, the pending spaces have to be
            // exported now.
            if( nSpaceChars > 0 &&
                ( !bCurrCharIsSpace ||
                  aHintLst.HasStartingOrEndingHints( nPos+nOffset ) ) )
            {
                ASSERT( nExpStartPos == nPos,
                        "SwXMLExport::ExportTxtNode: pending characters" );

                if( nSpaceChars > 1 )
                {
                    OUStringBuffer sTmp;
                    sTmp.append( (sal_Int32)nSpaceChars );
                    AddAttribute( XML_NAMESPACE_TEXT, sXML_c,
                                  sTmp.makeStringAndClear() );
                }

                SvXMLElementExport aElem( *this, XML_NAMESPACE_TEXT,
                                        sXML_s, sal_False, sal_False );

                nSpaceChars = 0;
            }

            // Before the text or tag of the current element, ending and
            // starting hints have to be exported.
            aHintLst.ExportEndingHints( nPos + nOffset );
            aHintLst.ExportStartingHints( nPos + nOffset );

            // If the current character has to be exported as a special
            // element, the elemnt will be exported now.
            if( bExpCharAsElement )
            {
                switch( rText.GetChar(nPos) )
                {
                case 0x0009:    // Tab
                    {
                        SvXMLElementExport aElem( *this, XML_NAMESPACE_TEXT,
                                                  sXML_tab_stop, sal_False,
                                                  sal_False );
                    }
                    break;
                case 0x000A:    // LF
                    {
                        SvXMLElementExport aElem( *this, XML_NAMESPACE_TEXT,
                                                  sXML_line_break, sal_False,
                                                  sal_False );
                    }
                    break;
                }
            }
            if( pTxtAttrWOEnd  )
            {
                // TODO: This is a hack as long as if there is no field
                // export.
                if( RES_TXTATR_FIELD == pTxtAttrWOEnd->Which() )
                {
                    const SwField *pFld =
                        ((const SwFmtFld&)pTxtAttrWOEnd->GetAttr()).GetFld();
                    if( pFld )
                    {
                        GetDocHandler()->characters( pFld->Expand() );
                    }
#ifdef XML_CORE_API
//                  Reference < XTextField > xFld = new SwXTextField(
//                      ((const SwFmtFld&)pTxtAttrWOEnd->GetAttr()),
//                      &GetDoc() );
//
//                  GetTextFieldExport().ExportField( xFld );
#endif
                }
            }

            // If the current character is a space, and the previous one
            // is a space, too, the number of pending spaces is incremented
            // only.
            if( bCurrCharIsSpace && bPrevCharIsSpace )
                nSpaceChars++;

            // If the currect character is not exported as text, the start
            // position for text is the position behind the current position.
            if( !bExpCharAsText )
            {
                ASSERT( nExpStartPos == nPos, "wrong export start pos" );
                nExpStartPos = nPos+1;
            }
        }

        // If there is some text left, it has to be exported now.
        if( nExpStartPos < nEndPos )
        {
            ASSERT( 0==nSpaceChars,
                    "SwXMLExport::ExportTxtNode: pending spaces " );
            String sExp( rText.Copy( nExpStartPos, nEndPos - nExpStartPos ) );
            GetDocHandler()->characters( sExp );
        }

        // If there are some spaces left, they have to be exported now.
        if( nSpaceChars > 0 )
        {
            if( nSpaceChars > 1 )
            {
                OUStringBuffer sTmp;
                sTmp.append( (sal_Int32)nSpaceChars );
                AddAttribute( XML_NAMESPACE_TEXT, sXML_c,
                              sTmp.makeStringAndClear() );
            }

            SvXMLElementExport aElem( *this, XML_NAMESPACE_TEXT, sXML_s,
                                      sal_False, sal_False );
        }

        // The same applies to all hints that are currently open.
        aHintLst.ExportEndingHints( STRING_LEN );
    }
}

void SwXMLExport::ExportSection( const SwSectionNode& rSectNd )
{
#if 0
    const SwSection& rSection = rSectNd.GetSection();
    const SwSectionFmt *pSectFmt = rSection.GetFmt();
    ASSERT( pSectFmt, "SwXMLExport::ExportSection: section without a format?" );

    // <text:section-desc ...>
    CheckAttrList();

    // text:name="..."
    AddAttribute( XML_NAMESPACE_TEXT, sXML_name, S2WS(rSection.GetName()) );

    // text:hidden="..."
    if( rSection.IsHidden() )
    {
        AddAttributeASCII( XML_NAMESPACE_TEXT, sXML_hidden, sXML_true );

        // text:condition="..."
        if( rSection.IsCondHidden() )
        {
            AddAttribute( XML_NAMESPACE_TEXT, sXML_condition,
                          S2WS(rSection.GetCondition()) );
        }
    }

    {
        SvXMLElementExport aElem( *this, XML_NAMESPACE_TEXT, sXML_section_desc,
                                sal_True, sal_True );
//      TODO
//      pSectionItemExport->Export( pSectFmt->GetAttrSet(), XML_ITEM_IGN_WS );
    }

    // <text:section ...>
    CheckAttrList();

    // text:name="..."
    AddAttribute( XML_NAMESPACE_TEXT, sXML_section_name,
                  S2WS(rSection.GetName()) );
#endif

    SwNode *pStartNd = pDoc->GetNodes()[rSectNd.GetIndex() + 1];
    SwNode *pEndNd = pDoc->GetNodes()[rSectNd.EndOfSectionIndex() - 1];

    {
#if 0
        SvXMLElementExport aElem( *this, XML_NAMESPACE_TEXT, sXML_section,
                                sal_True, sal_True );
#endif
        SwXMLExpContext aContext( *this, *pStartNd, *pEndNd, 0, STRING_LEN );
        ExportCurPaM();
    }

    pCurPaM->GetPoint()->nNode = *rSectNd.EndOfSectionNode();
}
#endif

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/filter/xml/xmltext.cxx,v 1.1.1.1 2000-09-18 17:15:00 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.48  2000/09/18 16:05:08  willem.vandorp
      OpenOffice header added.

      Revision 1.47  2000/09/18 11:58:03  mib
      text frames/graphics import and export continued

      Revision 1.46  2000/08/24 11:16:42  mib
      text import continued

      Revision 1.45  2000/08/10 10:22:16  mib
      #74404#: Adeptions to new XSL/XLink working draft

      Revision 1.44  2000/08/04 11:39:54  dvo
      - field declarations import removed from CORE API import

      Revision 1.43  2000/08/03 18:03:58  dvo
      - variable field declarations import added

      Revision 1.42  2000/07/31 09:42:35  mib
      text export continued

      Revision 1.41  2000/07/24 10:19:02  dvo
      - textfield export for XML_CORE_API

      Revision 1.40  2000/07/21 12:55:15  mib
      text import/export using StarOffice API

      Revision 1.39  2000/07/11 11:17:59  dvo
      text field export added

      Revision 1.38  2000/06/08 09:45:55  aw
      changed to use functionality from xmloff project now

      Revision 1.37  2000/05/24 12:08:11  mib
      unicode bug fix

      Revision 1.36  2000/05/03 12:08:05  mib
      unicode

      Revision 1.35  2000/03/13 14:33:45  mib
      UNO3

      Revision 1.34  2000/03/06 10:46:11  mib
      #72585#: toInt32

      Revision 1.33  2000/02/21 12:51:07  mib
      #70271#: Export of section element removed

      Revision 1.32  2000/02/17 14:40:30  mib
      #70271#: XML table import

      Revision 1.30  2000/01/27 08:59:02  mib
      #70271#: outline numbering

      Revision 1.29  2000/01/20 10:03:16  mib
      #70271#: Lists reworked

      Revision 1.28  2000/01/12 15:00:23  mib
      #70271#: lists

      Revision 1.27  2000/01/06 15:08:28  mib
      #70271#:separation of text/layout, cond. styles, adaptions to wd-xlink-19991229

      Revision 1.26  1999/12/14 09:47:51  mib
      #70271#: Export field content as text

      Revision 1.25  1999/12/13 08:29:07  mib
      #70271#: Support for element items added, background and brush item

      Revision 1.24  1999/12/08 10:44:21  cl
      #70271# added first support for importing tab-stops

      Revision 1.23  1999/12/06 11:41:33  mib
      #70258#: Container item for unkown attributes

      Revision 1.22  1999/11/26 11:11:49  mib
      export-flags, loading of styles only

      Revision 1.21  1999/11/19 15:27:59  mib
      Opt: using C++ arrays instead of string buffers

      Revision 1.20  1999/11/12 11:43:03  mib
      using item mapper, part iii

      Revision 1.19  1999/11/10 15:08:09  mib
      Import now uses XMLItemMapper

      Revision 1.18  1999/11/09 15:40:08  mib
      Using XMLItemMapper for export

      Revision 1.17  1999/11/03 11:13:50  mib
      list style import continued

      Revision 1.16  1999/11/01 11:38:50  mib
      List style import

      Revision 1.15  1999/10/26 13:33:50  mib
      list styles continued

      Revision 1.14  1999/10/25 10:41:48  mib
      Using new OUString ASCII methods

      Revision 1.13  1999/10/15 12:38:01  mib
      XML_TOK_SW_LINE_FEED -> XML_TOK_SW_LINE_BREAK

      Revision 1.12  1999/10/08 11:47:56  mib
      moved some file to SVTOOLS/SVX

      Revision 1.11  1999/10/06 06:48:06  mib
      WS stripping

      Revision 1.10  1999/10/01 14:12:02  mib
      tab, line break and space

      Revision 1.9  1999/09/28 10:47:05  mib
      memory leak

      Revision 1.8  1999/09/28 08:31:47  mib
      char fmts, hints

      Revision 1.7  1999/09/23 11:54:28  mib
      i18n, token maps and hard paragraph attributes

      Revision 1.6  1999/09/22 11:57:46  mib
      string -> wstring

      Revision 1.5  1999/08/18 15:03:38  MIB
      Style import


      Rev 1.4   18 Aug 1999 17:03:38   MIB
   Style import

      Rev 1.3   17 Aug 1999 16:29:24   MIB
   import of text nodes started

      Rev 1.2   13 Aug 1999 16:19:42   MIB
   styles and sections

      Rev 1.1   12 Aug 1999 18:06:22   MIB
   Export ofSvxFontItem, SvxFontHeightItem and SvxLRSpaceItem

      Rev 1.0   12 Aug 1999 12:29:28   MIB
   Initial revision.

*************************************************************************/

diff --git a/sw/source/filter/xml/xmltexte.hxx b/sw/source/filter/xml/xmltexte.hxx
new file mode 100644
index 0000000..0c22b3e
--- /dev/null
+++ b/sw/source/filter/xml/xmltexte.hxx
@@ -0,0 +1,100 @@
/*************************************************************************
 *
 *  $RCSfile: xmltexte.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:15:00 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _XMLTEXTE_HXX
#define _XMLTEXTE_HXX

#ifndef XML_CORE_API

#ifndef _XMLOFF_TEXTPARAE_HXX_
#include <xmloff/txtparae.hxx>
#endif

class SwXMLExport;
class SvXMLAutoStylePoolP;

namespace com { namespace sun { namespace star { namespace style {
                class XStyle; } } } }

class SwXMLTextParagraphExport : public XMLTextParagraphExport
{
    const ::rtl::OUString sTextTable;

protected:
    virtual void exportStyleContent(
            const ::com::sun::star::uno::Reference<
                ::com::sun::star::style::XStyle > & rStyle );

    virtual void exportTable(
        const ::com::sun::star::uno::Reference <
            ::com::sun::star::text::XTextContent > & rTextContent,
        sal_Bool bAutoStyles );

public:
    SwXMLTextParagraphExport(
        SwXMLExport& rExp,
         SvXMLAutoStylePoolP& rAutoStylePool );
    ~SwXMLTextParagraphExport();
};
#endif


#endif  //  _XMLTEXTE_HXX
diff --git a/sw/source/filter/xml/xmltexti.hxx b/sw/source/filter/xml/xmltexti.hxx
new file mode 100644
index 0000000..f11faf0
--- /dev/null
+++ b/sw/source/filter/xml/xmltexti.hxx
@@ -0,0 +1,125 @@
/*************************************************************************
 *
 *  $RCSfile: xmltexti.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:15:00 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _XMLTEXTI_HXX
#define _XMLTEXTI_HXX

#ifndef _RTL_USTRING_HXX
#include <rtl/ustring.hxx>
#endif

#ifndef _XMLOFF_XMLTKMAP_HXX
#include <xmloff/xmltkmap.hxx>
#endif

#ifndef _XMLOFF_XMLICTXT_HXX
#include <xmloff/xmlictxt.hxx>
#endif

#ifdef XML_CORE_API
class SfxItemSet;
class SwXMLHints_Impl;
class SwXMLImport;
namespace com { namespace sun { namespace star { namespace xml {
                namespace sax { class XAttributeList; } } } } }


enum SwXMLBodyElemTokens
{
    XML_TOK_SW_P,
    XML_TOK_SW_H,
    XML_TOK_SW_ORDERED_LIST,
    XML_TOK_SW_UNORDERED_LIST,
    XML_TOK_TABLE_TABLE,
    XML_TOK_TABLE_SUBTABLE,
    XML_TOK_SW_ELEM_END=XML_TOK_UNKNOWN
};

class SwXMLParaContext : public SvXMLImportContext
{
    SfxItemSet              *pItemSet;
    SwXMLHints_Impl         *pHints;
    sal_Bool                bIgnoreLeadingSpace;
    sal_Bool                bHeading;

public:

    SwXMLParaContext( SwXMLImport& rImport, sal_uInt16 nPrfx,
                const ::rtl::OUString& rLName,
                const ::com::sun::star::uno::Reference<
                    ::com::sun::star::xml::sax::XAttributeList > & xAttrList,
                sal_Bool bHeading );

    virtual ~SwXMLParaContext();

    virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
                const ::rtl::OUString& rLocalName,
                const ::com::sun::star::uno::Reference<
                    ::com::sun::star::xml::sax::XAttributeList > & xAttrList );

    virtual void Characters( const ::rtl::OUString& rChars );

    SwXMLImport& GetSwImport() { return (SwXMLImport&)GetImport(); }
};
#endif


#endif  //  _XMLTEXTI_HXX
diff --git a/sw/source/ui/app/app.src b/sw/source/ui/app/app.src
new file mode 100644
index 0000000..4aab929
--- /dev/null
+++ b/sw/source/ui/app/app.src
@@ -0,0 +1,2966 @@
/*************************************************************************
 *
 *  $RCSfile: app.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:31 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/



#include <svtools/style.hrc>
#include <sfx2/sfx.hrc>
#include <svx/dialogs.hrc>
#include <svx/globlmn.hrc>
#include <basctl/basicide.hrc>
#include <offmgr/sba.hrc>
#include "cmdid.h"
#include "globals.hrc"
#include "app.hrc"
#include "statstr.hrc"
#include "swstyle.h"
#include "comcore.hrc"
#include "shells.hrc"


#define IMAGE_STDBTN_COLOR Color { Red = 0xC000; Green = 0xC000; Blue = 0xC000; }

String RID_SW_NAME
{
    TEXT = "StarWriter" ;
};

String STR_PRINT_MERGE_MACRO
{
    TEXT = "Serienbriefe drucken" ;
    TEXT [ English ] = "Print merge" ;
    Text [ english_us ] = "Print form letters" ;
    Text [ italian ] = "Stampa in serie" ;
    Text [ spanish ] = "Imprimir cartas en serie" ;
    Text [ french ] = "Imprimer un mailing" ;
    Text [ dutch ] = "Standaardbrieven afdrukken" ;
    Text [ swedish ] = "Skriv ut standardbrev" ;
    Text [ danish ] = "Udskriv flettede breve" ;
    Text [ portuguese_brazilian ] = "Serienbriefe drucken" ;
    Text [ portuguese ] = "Imprimir cartas em série" ;
    Text[ chinese_simplified ] = "´òÓ¡ÓʼþºÏ²¢";
    Text[ language_user1 ] = " ";
    Text[ russian ] = "Ïå÷àòü ñëèÿíèÿ";
    Text[ polish ] = "Drukuj listy seryjne";
    Text[ japanese ] = "·‚µž‚݈óü";
    Text[ chinese_traditional ] = "¦X¨Ö¦C¦L";
    Text[ arabic ] = "ØÈÇÚÉ ÎØÇÈÇÊ ãÓáÓáÉ";
    Text[ dutch ] = "Standaardbrieven afdrukken";
    Text[ chinese_simplified ] = "´òÓ¡ÓʼþºÏ²¢";
    Text[ greek ] = "Åêôýðùóç ïìáäéêÞò åðéóôïëÞò";
    Text[ korean ] = "¿¬¼ÓÆíÁö Àμâ";
    Text[ turkish ] = "Standart mektup yazdýr";
};

String STR_PAGE_COUNT_MACRO
{
    TEXT = "Änderung der Seitenanzahl" ;
    TEXT [ English ] = "Page count changed" ;
    Text [ english_us ] = "Changing the page count" ;
    Text [ portuguese_brazilian ] = "Änderung der Seitenanzahl" ;
    Text [ swedish ] = "Ändring av sidantal" ;
    Text [ danish ] = "Modificer sideantal" ;
    Text [ italian ] = "Modifica del numero delle pagine" ;
    Text [ spanish ] = "Modificación del número de páginas" ;
    Text [ french ] = "Modification du nombre de pages" ;
    Text [ dutch ] = "Wijziging van het aantal pagina's" ;
    Text [ portuguese ] = "Modificar número de páginas" ;
    Text[ chinese_simplified ] = "¸ü¸ÄÒ³Êý";
    Text[ russian ] = "Èçìåíåíèå êîëè÷åñòâà ñòðàíèö";
    Text[ polish ] = "Zmiana liczby stron";
    Text[ japanese ] = "Íß°¼Þ”‚̕ύX";
    Text[ chinese_traditional ] = "Åܧ󭶼Æ";
    Text[ arabic ] = "ÊÛííÑ ÚÏÏ ÇáÕÝÍÇÊ";
    Text[ dutch ] = "Wijziging van het aantal pagina's";
    Text[ chinese_simplified ] = "¸ü¸ÄÒ³Êý";
    Text[ greek ] = "Äéüñèùóç ðëÞèïõò óåëéäþí";
    Text[ korean ] = "ÆäÀÌÁö Ä«¿îÆ® º¯°æ";
    Text[ turkish ] = "Sayfa sayýsýnýn deðiþtirilmesi";
    Text[ language_user1 ] = " ";
};

 // Image-Liste ----------------------------------------------------------------
 //Dafuer gibt es jetzt eine Vorsortierung:
 //1. SID_
 //2. RID_
 //3. FN_
 //4. Ids, die noch aus der Default-Liste entfernt werden muessen

#define IMAGELIST_AND_COUNT             \
    IdList = {                          \
        SID_SELECTALL                   ;\
        SID_NEWDOCDIRECT                ;\
        SID_DOCINFO                     ;\
        SID_CLOSEDOCS                   ;\
        SID_MAIL_SENDDOC                ;\
        SID_PRINTPREVIEW                ;\
                                        \
           SID_INSERT_GRAPHIC               ;\
           SID_INSERT_DRAW                  ;\
        SID_DOCTEMPLATE                 ;\
        SID_AUTOFORMAT                  ;\
        SID_AUTOSPELL_CHECK             ;\
        SID_EXTENDEDHELP                ;\
        SID_ATTR_CHAR_FONT              ;\
        SID_ATTR_CHAR_FONTHEIGHT        ;\
        SID_ATTR_CHAR_STRIKEOUT         ;\
        SID_ATTR_CHAR_SHADOWED          ;\
        SID_OBJECT_HELL                 ;\
        SID_OBJECT_HEAVEN               ;\
        SID_ATTR_FILL_STYLE             ;\
        SID_ATTR_LINE_STYLE             ;\
        SID_ATTR_LINE_WIDTH             ;\
         SID_ATTR_LINE_COLOR                ;\
        SID_ATTR_LINEEND_STYLE          ;\
         SID_BACKGROUND_COLOR           ;\
         SID_FRAME_LINESTYLE                ;\
         SID_FRAME_LINECOLOR                ;\
        SID_SIM_START                   ;\
        SID_ATTR_ZOOM                   ;\
        SID_WIN_FULLSCREEN              ;\
        SID_FRAME_TO_TOP                ;\
        SID_FRAME_TO_BOTTOM             ;\
        SID_SBA_ADDRPI                  ;\
        SID_FONTWORK                    ;\
                                        \
        SID_ATTR_TRANSFORM              ;\
        SID_ATTR_CHAR_COLOR2;\
        SID_ATTR_CHAR_COLOR_BACKGROUND ;\
                                        \
        FN_NUMBER_BULLETS               ;\
        FN_NUM_BULLET_DOWN              ;\
         FN_NUM_BULLET_UP               ;\
         FN_NUM_BULLET_MOVEUP           ;\
         FN_NUM_BULLET_MOVEDOWN             ;\
         FN_NUM_BULLET_NONUM                ;\
         FN_NUM_BULLET_OFF              ;\
         FN_NUM_BULLET_OUTLINE_DOWN         ;\
         FN_NUM_BULLET_OUTLINE_UP       ;\
         FN_NUM_BULLET_OUTLINE_MOVEUP   ;\
         FN_NUM_BULLET_OUTLINE_MOVEDOWN     ;\
        FN_NUMBER_NEWSTART ;\
          FN_INSERT_FIELD                   ;\
        FN_VIEW_FIELDS                  ;\
        FN_VIEW_FIELDNAME               ;\
        FN_VIEW_GRAPHIC                 ;\
        FN_VIEW_MARKS                   ;\
           FN_VIEW_META_CHARS               ;\
           FN_INSERT_TABLE                  ;\
           FN_INSERT_FRAME_INTERACT     ;\
           FN_INSERT_FRAME_INTERACT_NOCOL   ;\
           FN_FRAME_CHAIN                   ;\
           FN_FRAME_UNCHAIN             ;\
           FN_INSERT_FRAME                  ;\
         FN_TOOL_ANKER                  ;\
        FN_SET_SUPER_SCRIPT             ;\
        FN_SET_SUB_SCRIPT               ;\
        FN_UNDERLINE_DOUBLE             ;\
        SID_ATTR_PARA_ADJUST_BLOCK              ;\
        FN_FORMAT_FRAME_DLG             ;\
        FN_FRAME_NOWRAP                 ;\
        FN_FRAME_WRAP                   ;\
        FN_FRAME_WRAPTHRU               ;\
        FN_FRAME_WRAP_IDEAL             ;\
        FN_FRAME_WRAP_LEFT              ;\
        FN_FRAME_WRAP_RIGHT             ;\
        FN_FRAME_WRAP_CONTOUR           ;\
        SID_CONTOUR_DLG                 ;\
        FN_FRAME_ALIGN_HORZ_LEFT        ;\
        FN_FRAME_ALIGN_HORZ_RIGHT       ;\
        FN_FRAME_ALIGN_HORZ_CENTER      ;\
        FN_FRAME_ALIGN_VERT_TOP         ;\
        FN_FRAME_ALIGN_VERT_BOTTOM      ;\
        FN_FRAME_ALIGN_VERT_CENTER      ;\
        FN_TABLE_INSERT_ROW             ;\
        FN_TABLE_INSERT_COL             ;\
        FN_TABLE_DELETE_ROW             ;\
        FN_TABLE_DELETE_COL             ;\
        FN_TABLE_SPLIT_CELLS            ;\
        FN_TABLE_MERGE_CELLS            ;\
        FN_TABLE_SELECT_ROW             ;\
        FN_TABLE_SELECT_COL             ;\
        FN_TABLE_SELECT_ALL             ;\
        FN_OPTIMIZE_TABLE ;\
        FN_TABLE_OPTIMAL_HEIGHT;\
        FN_TABLE_BALANCE_ROWS  ;\
        FN_TABLE_ADJUST_CELLS  ;\
        FN_TABLE_BALANCE_CELLS ;\
        FN_PAGE_STYLE_SET_COLS          ;\
        FN_FLIP_HORZ_GRAFIC             ;\
        FN_FLIP_VERT_GRAFIC             ;\
        FN_SPELLING_DLG                 ;\
        FN_START_TABLE                  ;\
        FN_END_TABLE                    ;\
        FN_FORMULA_CALC                 ;\
        FN_FORMULA_CANCEL               ;\
         FN_FORMULA_APPLY               ;\
        SID_NAVIGATOR               ;\
        FN_PAGEUP                       ;\
        FN_PAGEDOWN                     ;\
        FN_START_OF_DOCUMENT            ;\
        FN_END_OF_DOCUMENT              ;\
        FN_SHOW_TWO_PAGES               ;\
        FN_SHOW_FOUR_PAGES              ;\
        FN_FORMAT_PAGE_DLG              ;\
        FN_PRINT_PAGEPREVIEW            ;\
        FN_FAX                          ;\
        FN_QRY_MERGE                    ;\
        FN_EDIT_FORMULA; \
        FN_INSERT_CTRL       ;\
        FN_INSERT_OBJ_CTRL   ;\
        FN_INSERT_FIELD_CTRL ;\
        SID_SOURCEVIEW;\
        FN_TABLE_VERT_NONE;\
        FN_TABLE_VERT_CENTER;\
        FN_TABLE_VERT_BOTTOM;\
        FN_TABLE_MODE_FIX      ;\
        FN_TABLE_MODE_FIX_PROP ;\
        FN_TABLE_MODE_VARIABLE ;\
        FN_PRINT_LAYOUT ;\
        FN_INSERT_HEADER;\
        FN_INSERT_FOOTER;\
        FN_TABLE_AUTOSUM;\
        FN_PREVIEW_PRINT_OPTIONS;\
        FN_PREVIEW_ZOOM;\
                                        \
        SID_STYLE_APPLY                 ;\
        SID_STYLE_NEW_BY_EXAMPLE        ;\
        SID_STYLE_UPDATE_BY_EXAMPLE ;\
         SID_ATTR_BORDER                    ;\
        SID_PLAYMACRO                   ;\
        SID_CHAR_DLG                    ;\
        SID_PARA_DLG                    ;\
        SID_INSERT_PREVIEW ; \
        SID_INSERT_SPINBUTTON ;\
        SID_INSERT_HSCROLLBAR ;\
        SID_INSERT_VSCROLLBAR ;\
           FN_QRY                           ;\
           FN_INSERT_OBJECT_DLG         ;\
           FN_INSERT_SYMBOL             ;\
           FN_POSTIT                        ;\
        FN_GROW_FONT_SIZE               ;\
        FN_SHRINK_FONT_SIZE             ;\
        FN_THESAURUS_DLG                ;\
        FN_HYPHENATE_OPT_DLG            ;\
        FN_GLOSSARY_DLG                 ;\
        SID_INSERT_URLBUTTON            ;\
                                                    \
        FN_INSERT_FLD_DATE    ;\
        FN_INSERT_FLD_TIME    ;\
        FN_INSERT_FLD_PGNUMBER;\
        FN_INSERT_FLD_PGCOUNT ;\
        FN_INSERT_FLD_TOPIC   ;\
        FN_INSERT_FLD_TITLE   ;\
        FN_INSERT_FLD_AUTHOR  ;\
        FN_INSERT_SIM;        \
        FN_INSERT_SMA;        \
        FN_INSERT_FOOTNOTE;    \
        FN_INSERT_ENDNOTE;    \
        FN_INSERT_IDX_ENTRY_DLG;\
        FN_INSERT_BOOKMARK;      \
        SID_SEARCH_DLG; \
        SID_INSERTDOC;              \
        SID_INSERT_FLOATINGFRAME;\
        FN_SHADOWCURSOR;\
        FN_INSERT_CAPTION;\
        FN_INSERT_REF_FIELD;\
        FN_INSERT_COLUMN_SECTION;\
                                        \
                                        \
        };                              \
    IdCount = {                         \
        172;                            \
    };



ImageList RID_DEFAULTIMAGELIST_SC
{
    ImageBitmap = Bitmap
    {
        File = "sc_out.bmp" ;
        File [ english ] = "sc_out01.bmp" ;
        File [ english_us ] = "sc_out01.bmp" ;
        File [ dutch ] = "sc_out31.bmp" ;
        File [ french ] = "sc_out33.bmp" ;
        File [ spanish ] = "sc_out34.bmp" ;
        File [ italian ] = "sc_out39.bmp" ;
        File [ swedish ] = "sc_out46.bmp" ;
        File [ danish ] = "sc_out45.bmp" ;
        File [ russian ] = "sc_out07.bmp" ;
        File [ polish ] = "sc_out48.bmp" ;
        File [ greek ] = "sc_out30.bmp" ;
        File [ japanese ] = "sc_out81.bmp" ;
        File [ portuguese ] = "sc_out03.bmp" ;
    };
    MaskColor = IMAGE_STDBTN_COLOR ;
    IMAGELIST_AND_COUNT
};
ImageList RID_DEFAULTIMAGELIST_LC
{
    ImageBitmap = Bitmap
    {
        File = "lc_out.bmp" ;
        File [ english ] = "lc_out01.bmp" ;
        File [ english_us ] = "lc_out01.bmp" ;
        File [ dutch ] = "lc_out31.bmp" ;
        File [ french ] = "lc_out33.bmp" ;
        File [ spanish ] = "lc_out34.bmp" ;
        File [ italian ] = "lc_out39.bmp" ;
        File [ swedish ] = "lc_out46.bmp" ;
        File [ danish ] = "lc_out45.bmp" ;
        File [ russian ] = "lc_out07.bmp" ;
        File [ polish ] = "lc_out48.bmp" ;
        File [ greek ] = "lc_out30.bmp" ;
        File [ japanese ] = "lc_out81.bmp" ;
        File [ portuguese ] = "lc_out03.bmp" ;
    };
    MaskColor = IMAGE_STDBTN_COLOR ;
    IMAGELIST_AND_COUNT
};

 // Vorlagen
SfxStyleFamilies DLG_STYLE_DESIGNER
{
    StyleFamilyList =
    {
        SfxStyleFamilyItem
        {
            StyleImage = Image
            {
                ImageBitmap = Bitmap { File = "catpar.bmp" ; };
                MaskColor = IMAGE_STDBTN_COLOR ;
            };
            Text = "Absatzvorlagen" ;
            Text [ ENGLISH ] = "Paragraph Styles" ;
            Text [ norwegian ] = "Avsnittsmaler" ;
            Text [ italian ] = "Modelli di paragrafo" ;
            Text [ portuguese_brazilian ] = "Estilos de parágrafo" ;
            Text [ portuguese ] = "Estilos de parágrafo" ;
            Text [ finnish ] = "Kappaletyylit" ;
            Text [ danish ] = "Afsnitstypografier" ;
            Text [ french ] = "Styles de paragraphe" ;
            Text [ swedish ] = "Styckeformatmallar" ;
            Text [ dutch ] = "Alinea-opmaakprofielen" ;
            Text [ spanish ] = "Estilos de párrafo" ;
            Text [ english_us ] = "Paragraph Styles" ;
            StyleFamily = SFX_STYLE_FAMILY_PARA ;
            FilterList =
            {
                < "Automatisch" ; SFXSTYLEBIT_AUTO ; > ;
                < "Alle Vorlagen" ; SFXSTYLEBIT_ALL ; > ;
                < "Verwendete Vorlagen" ; SFXSTYLEBIT_USED ; > ;
                < "Benutzervorlagen" ; SFXSTYLEBIT_USERDEF ; > ;
                < "Textvorlagen" ; SWSTYLEBIT_TEXT ; > ;
                < "Kapitelvorlagen" ; SWSTYLEBIT_CHAPTER ; > ;
                < "Listenvorlagen" ; SWSTYLEBIT_LIST ; > ;
                < "Verzeichnisvorlagen" ; SWSTYLEBIT_IDX ; > ;
                < "Vorlagen Sonderbereiche" ; SWSTYLEBIT_EXTRA ; > ;
                < "HTML Vorlagen" ; SWSTYLEBIT_HTML ; > ;
                < "Bedingte Vorlagen" ; SWSTYLEBIT_CONDCOLL ; > ;
            };
            FilterList [ ENGLISH ] =
            {
                < "Automatisch" ; SFXSTYLEBIT_AUTO ; > ;
                < "Alle Vorlagen" ; SFXSTYLEBIT_ALL ; > ;
                < "Verwendete Vorlagen" ; SFXSTYLEBIT_USED ; > ;
                < "Benutzervorlagen" ; SFXSTYLEBIT_USERDEF ; > ;
                < "Textvorlagen" ; SWSTYLEBIT_TEXT ; > ;
                < "Kapitelvorlagen" ; SWSTYLEBIT_CHAPTER ; > ;
                < "Listenvorlagen" ; SWSTYLEBIT_LIST ; > ;
                < "Verzeichnisvorlagen" ; SWSTYLEBIT_IDX ; > ;
                < "Vorlagen Sonderbereiche" ; SWSTYLEBIT_EXTRA ; > ;
                < "HTML Vorlagen" ; SWSTYLEBIT_HTML ; > ;
                < "Bedingte Vorlagen" ; SWSTYLEBIT_CONDCOLL ; > ;
            };
            filterlist [ english_us ] =
            {
                < "Automatic" ; SFXSTYLEBIT_AUTO ; > ;
                < "All Styles" ; SFXSTYLEBIT_ALL ; > ;
                < "Applied Styles" ; SFXSTYLEBIT_USED ; > ;
                < "Custom Styles" ; SFXSTYLEBIT_USERDEF ; > ;
                < "Text Styles" ; SWSTYLEBIT_TEXT ; > ;
                < "Chapter Styles" ; SWSTYLEBIT_CHAPTER ; > ;
                < "List Styles" ; SWSTYLEBIT_LIST ; > ;
                < "Index Styles" ; SWSTYLEBIT_IDX ; > ;
                < "Special Styles" ; SWSTYLEBIT_EXTRA ; > ;
                < "HTML Styles" ; SWSTYLEBIT_HTML ; > ;
                < "Conditional Styles" ; SWSTYLEBIT_CONDCOLL ; > ;
            };
            filterlist [ portuguese_brazilian ] =
            {
                < "Automatisch" ; SFXSTYLEBIT_AUTO ; > ;
                < "Alle Vorlagen" ; SFXSTYLEBIT_ALL ; > ;
                < "Verwendete Vorlagen" ; SFXSTYLEBIT_USED ; > ;
                < "Benutzervorlagen" ; SFXSTYLEBIT_USERDEF ; > ;
                < "Textvorlagen" ; SWSTYLEBIT_TEXT ; > ;
                < "Kapitelvorlagen" ; SWSTYLEBIT_CHAPTER ; > ;
                < "Listenvorlagen" ; SWSTYLEBIT_LIST ; > ;
                < "Verzeichnisvorlagen" ; SWSTYLEBIT_IDX ; > ;
                < "Vorlagen Sonderbereiche" ; SWSTYLEBIT_EXTRA ; > ;
                < "HTML Vorlagen" ; SWSTYLEBIT_HTML ; > ;
                < "Bedingte Vorlagen" ; SWSTYLEBIT_CONDCOLL ; > ;
            };
            filterlist [ swedish ] =
            {
                < "Automatiskt" ; SFXSTYLEBIT_AUTO ; > ;
                < "Alla formatmallar" ; SFXSTYLEBIT_ALL ; > ;
                < "Använda formatmallar" ; SFXSTYLEBIT_USED ; > ;
                < "Användardefinierade formatmallar" ; SFXSTYLEBIT_USERDEF ; > ;
                < "Textformatmallar" ; SWSTYLEBIT_TEXT ; > ;
                < "Kapitelformatmallar" ; SWSTYLEBIT_CHAPTER ; > ;
                < "Listformatmallar" ; SWSTYLEBIT_LIST ; > ;
                < "Förteckningsformatmallar" ; SWSTYLEBIT_IDX ; > ;
                < "Formatmallar specialområde" ; SWSTYLEBIT_EXTRA ; > ;
                < "HTML formatmallar" ; SWSTYLEBIT_HTML ; > ;
                < "Villkorliga formatmallar" ; SWSTYLEBIT_CONDCOLL ; > ;
            };
            filterlist [ danish ] =
            {
                < "Automatisk" ; SFXSTYLEBIT_AUTO ; > ;
                < "Alle typografier" ; SFXSTYLEBIT_ALL ; > ;
                < "Anvendte typografier" ; SFXSTYLEBIT_USED ; > ;
                < "Brugerdefinerede typografier" ; SFXSTYLEBIT_USERDEF ; > ;
                < "Teksttypografier" ; SWSTYLEBIT_TEXT ; > ;
                < "Kapiteltypografier" ; SWSTYLEBIT_CHAPTER ; > ;
                < "Listetypografier" ; SWSTYLEBIT_LIST ; > ;
                < "Indekstypografier" ; SWSTYLEBIT_IDX ; > ;
                < "Typografi særområder" ; SWSTYLEBIT_EXTRA ; > ;
                < "HTML-typografier" ; SWSTYLEBIT_HTML ; > ;
                < "Betingede typografier" ; SWSTYLEBIT_CONDCOLL ; > ;
            };
            filterlist [ italian ] =
            {
                < "Automatico" ; SFXSTYLEBIT_AUTO ; > ;
                < "Tutti i modelli" ; SFXSTYLEBIT_ALL ; > ;
                < "Modelli usati" ; SFXSTYLEBIT_USED ; > ;
                < "Modelli utente" ; SFXSTYLEBIT_USERDEF ; > ;
                < "Modelli di testo" ; SWSTYLEBIT_TEXT ; > ;
                < "Modelli di capitolo" ; SWSTYLEBIT_CHAPTER ; > ;
                < "Modelli di elenchi" ; SWSTYLEBIT_LIST ; > ;
                < "Modelli di indice" ; SWSTYLEBIT_IDX ; > ;
                < "Modelli aree speciali" ; SWSTYLEBIT_EXTRA ; > ;
                < "Modelli HTML" ; SWSTYLEBIT_HTML ; > ;
                < "Modelli condizionati" ; SWSTYLEBIT_CONDCOLL ; > ;
            };
            filterlist [ spanish ] =
            {
                < "Automático" ; SFXSTYLEBIT_AUTO ; > ;
                < "Todos los estilos" ; SFXSTYLEBIT_ALL ; > ;
                < "Estilos aplicados" ; SFXSTYLEBIT_USED ; > ;
                < "Estilos del usuario" ; SFXSTYLEBIT_USERDEF ; > ;
                < "Estilos de texto" ; SWSTYLEBIT_TEXT ; > ;
                < "Estilos de capítulos" ; SWSTYLEBIT_CHAPTER ; > ;
                < "Estilos de listas" ; SWSTYLEBIT_LIST ; > ;
                < "Estilos de índices" ; SWSTYLEBIT_IDX ; > ;
                < "Estilos de áreas especiales" ; SWSTYLEBIT_EXTRA ; > ;
                < "Estilos HTML" ; SWSTYLEBIT_HTML ; > ;
                < "Estilos condicionados" ; SWSTYLEBIT_CONDCOLL ; > ;
            };
            filterlist [ french ] =
            {
                < "Automatiquement" ; SFXSTYLEBIT_AUTO ; > ;
                < "Tous les styles" ; SFXSTYLEBIT_ALL ; > ;
                < "Styles utilisés" ; SFXSTYLEBIT_USED ; > ;
                < "Styles personnalisés" ; SFXSTYLEBIT_USERDEF ; > ;
                < "Styles de texte" ; SWSTYLEBIT_TEXT ; > ;
                < "Styles de chapitre" ; SWSTYLEBIT_CHAPTER ; > ;
                < "Styles de liste" ; SWSTYLEBIT_LIST ; > ;
                < "Styles d'index/de tables des matières" ; SWSTYLEBIT_IDX ; > ;
                < "Styles pour zones spéciales" ; SWSTYLEBIT_EXTRA ; > ;
                < "Styles HTML" ; SWSTYLEBIT_HTML ; > ;
                < "Styles conditionnels" ; SWSTYLEBIT_CONDCOLL ; > ;
            };
            filterlist [ dutch ] =
            {
                < "Automatisch" ; SFXSTYLEBIT_AUTO ; > ;
                < "Alle opmaakprofielen" ; SFXSTYLEBIT_ALL ; > ;
                < "Gebruikte opmaakprofielen" ; SFXSTYLEBIT_USED ; > ;
                < "Eigen opmaakprofielen" ; SFXSTYLEBIT_USERDEF ; > ;
                < "Tekstopmaakprofielen" ; SWSTYLEBIT_TEXT ; > ;
                < "Opmaakprofielen voor hoofdtukken" ; SWSTYLEBIT_CHAPTER ; > ;
                < "Lijstopmaakprofielen" ; SWSTYLEBIT_LIST ; > ;
                < "Indexopmaakprofielen" ; SWSTYLEBIT_IDX ; > ;
                < "Opmaakprof. speciale bereiken" ; SWSTYLEBIT_EXTRA ; > ;
                < "HTML-opmaakprofielen" ; SWSTYLEBIT_HTML ; > ;
                < "Conditionele opmaakprofielen" ; SWSTYLEBIT_CONDCOLL ; > ;
            };
            filterlist [ portuguese ] =
            {
                < "Automático" ; SFXSTYLEBIT_AUTO ; > ;
                < "Estilos todos" ; SFXSTYLEBIT_ALL ; > ;
                < "Estilos usados" ; SFXSTYLEBIT_USED ; > ;
                < "Estilos personalizados" ; SFXSTYLEBIT_USERDEF ; > ;
                < "Estilos de texto" ; SWSTYLEBIT_TEXT ; > ;
                < "Estilos de capítulos" ; SWSTYLEBIT_CHAPTER ; > ;
                < "Estilos de listas" ; SWSTYLEBIT_LIST ; > ;
                < "Estilos de índices" ; SWSTYLEBIT_IDX ; > ;
                < "Estilos de áreas especiais" ; SWSTYLEBIT_EXTRA ; > ;
                < "Estilos HTML" ; SWSTYLEBIT_HTML ; > ;
                < "Estilos condicionados" ; SWSTYLEBIT_CONDCOLL ; > ;
            };
            Text[ chinese_simplified ] = "¶ÎÂäÑùʽ";
            FilterList [ chinese_simplified ] =
        {
            < "×Ô¶¯" ; SFXSTYLEBIT_AUTO ; > ;
            < "È«²¿Ñùʽ" ; SFXSTYLEBIT_ALL ; > ;
            < "ʹÓõÄÑùʽ" ; SFXSTYLEBIT_USED ; > ;
            < "×Ô¶¨Ñùʽ" ; SFXSTYLEBIT_USERDEF ; > ;
            < "ÎÄ×ÖÑùʽ" ; SWSTYLEBIT_TEXT ; > ;
            < "ÕÂÑùʽ" ; SWSTYLEBIT_CHAPTER ; > ;
            < "Áе¥Ñùʽ" ; SWSTYLEBIT_LIST ; > ;
            < "Ë÷ÒýÑùʽ" ; SWSTYLEBIT_IDX ; > ;
            < "ÑùÊ½ÌØÊâÇøÓò" ; SWSTYLEBIT_EXTRA ; > ;
            < "HTML Ñùʽ" ; SWSTYLEBIT_HTML ; > ;
            < "ÓÐÌõ¼þµÄÑùʽ" ; SWSTYLEBIT_CONDCOLL ; > ;
        };
        FilterList [ language_user1 ] =
        {
            < " " ; SFXSTYLEBIT_AUTO ; > ;
            < " " ; SFXSTYLEBIT_ALL ; > ;
            < " " ; SFXSTYLEBIT_USED ; > ;
            < " " ; SFXSTYLEBIT_USERDEF ; > ;
            < " " ; SWSTYLEBIT_TEXT ; > ;
            < " " ; SWSTYLEBIT_CHAPTER ; > ;
            < " " ; SWSTYLEBIT_LIST ; > ;
            < " " ; SWSTYLEBIT_IDX ; > ;
            < " " ; SWSTYLEBIT_EXTRA ; > ;
            < " " ; SWSTYLEBIT_HTML ; > ;
            < " " ; SWSTYLEBIT_CONDCOLL ; > ;
        };
        FilterList [ language_user1 ] =
        {
            < " " ; SFXSTYLEBIT_AUTO ; > ;
            < " " ; SFXSTYLEBIT_ALL ; > ;
            < " " ; SFXSTYLEBIT_USED ; > ;
            < " " ; SFXSTYLEBIT_USERDEF ; > ;
            < " " ; SWSTYLEBIT_TEXT ; > ;
            < " " ; SWSTYLEBIT_CHAPTER ; > ;
            < " " ; SWSTYLEBIT_LIST ; > ;
            < " " ; SWSTYLEBIT_IDX ; > ;
            < " " ; SWSTYLEBIT_EXTRA ; > ;
            < " " ; SWSTYLEBIT_HTML ; > ;
            < " " ; SWSTYLEBIT_CONDCOLL ; > ;
        };
        Text[ language_user1 ] = " ";
            Text[ russian ] = "Ñòèëè àáçàöà";
            Text[ polish ] = "Style akapitu";
            Text[ japanese ] = "’i—޽À²Ù";
            FilterList [ russian ] =
        {
            < "Àâòîìàòè÷åñêè" ; SFXSTYLEBIT_AUTO ; > ;
            < "Âñå ñòèëè" ; SFXSTYLEBIT_ALL ; > ;
            < "Ïðèìåíåííûå ñòèëè" ; SFXSTYLEBIT_USED ; > ;
            < "Ñòèëè ïîëüçîâàòåëÿ" ; SFXSTYLEBIT_USERDEF ; > ;
            < "Ñòèëè òåêñòà" ; SWSTYLEBIT_TEXT ; > ;
            < "Ñòèëè ãëàâû" ; SWSTYLEBIT_CHAPTER ; > ;
            < "Ñòèëè ñïèñêà" ; SWSTYLEBIT_LIST ; > ;
            < "Ñòèëè óêàçàòåëÿ" ; SWSTYLEBIT_IDX ; > ;
            < "Ñòèëè ñïåöèàëüíûõ îáëàñòåé" ; SWSTYLEBIT_EXTRA ; > ;
            < "Ñòèëè HTML" ; SWSTYLEBIT_HTML ; > ;
            < "Óñëîâíûå ñòèëè" ; SWSTYLEBIT_CONDCOLL ; > ;
        };
        FilterList [ polish ] =
        {
            < "Automatycznie" ; SFXSTYLEBIT_AUTO ; > ;
            < "Wszystkie style" ; SFXSTYLEBIT_ALL ; > ;
            < "U¿yte style" ; SFXSTYLEBIT_USED ; > ;
            < "Style u¿ytkownika" ; SFXSTYLEBIT_USERDEF ; > ;
            < "Style tekstu" ; SWSTYLEBIT_TEXT ; > ;
            < "Style rozdzia³u" ; SWSTYLEBIT_CHAPTER ; > ;
            < "Style listy" ; SWSTYLEBIT_LIST ; > ;
            < "Style indeksu" ; SWSTYLEBIT_IDX ; > ;
            < "Style dla specjalnych zadañ" ; SWSTYLEBIT_EXTRA ; > ;
            < "Style HTML" ; SWSTYLEBIT_HTML ; > ;
            < "Warunkowe style" ; SWSTYLEBIT_CONDCOLL ; > ;
        };
        FilterList [ japanese ] =
        {
            < "Ž©“®" ; SFXSTYLEBIT_AUTO ; > ;
            < "‚·‚ׂĂ̽À²Ù" ; SFXSTYLEBIT_ALL ; > ;
            < "Žg—p‚µ‚½½À²Ù" ; SFXSTYLEBIT_USED ; > ;
            < "Õ°»Þ°’è‹`‚̽À²Ù" ; SFXSTYLEBIT_USERDEF ; > ;
            < "•¶‘½À²Ù" ; SWSTYLEBIT_TEXT ; > ;
            < "Í‚̽À²Ù" ; SWSTYLEBIT_CHAPTER ; > ;
            < "ؽĂ̽À²Ù" ; SWSTYLEBIT_LIST ; > ;
            < "õˆø½À²Ù" ; SWSTYLEBIT_IDX ; > ;
            < "“Á•ʔ͈͂̽À²Ù" ; SWSTYLEBIT_EXTRA ; > ;
            < "HTML½À²Ù" ; SWSTYLEBIT_HTML ; > ;
            < "ðŒ•t‚«½À²Ù" ; SWSTYLEBIT_CONDCOLL ; > ;
        };
        Text[ chinese_traditional ] = "¬q¸¨¼Ë¦¡";
            FilterList [ chinese_traditional ] =
        {
            < "¦Û°Ê" ; SFXSTYLEBIT_AUTO ; > ;
            < "¥þ³¡¼Ë¦¡" ; SFXSTYLEBIT_ALL ; > ;
            < "¨Ï¥Îªº¼Ë¦¡" ; SFXSTYLEBIT_USED ; > ;
            < "¦Û­q¼Ë¦¡" ; SFXSTYLEBIT_USERDEF ; > ;
            < "¤å¦r¼Ë¦¡" ; SWSTYLEBIT_TEXT ; > ;
            < "³¹¼Ë¦¡" ; SWSTYLEBIT_CHAPTER ; > ;
            < "²M³æ¼Ë¦¡" ; SWSTYLEBIT_LIST ; > ;
            < "¥Ø¿ý¼Ë¦¡" ; SWSTYLEBIT_IDX ; > ;
            < "¼Ë¦¡¯S®í°Ï°ì" ; SWSTYLEBIT_EXTRA ; > ;
            < "HTML ¼Ë¦¡" ; SWSTYLEBIT_HTML ; > ;
            < "¦³±ø¥óªº¼Ë¦¡" ; SWSTYLEBIT_CONDCOLL ; > ;
        };
        Text[ arabic ] = "ÃäãÇØ ÝÞÑÉ";
            FilterList [ arabic ] =
        {
            < "ÊáÞÇÆí" ; SFXSTYLEBIT_AUTO ; > ;
            < "ßá ÇáÃäãÇØ" ; SFXSTYLEBIT_ALL ; > ;
            < "ÃäãÇØ ÞíÏ ÇáÇÓÊÎÏÇã" ; SFXSTYLEBIT_USED ; > ;
            < "ÃäãÇØ ãÎÕÕÉ" ; SFXSTYLEBIT_USERDEF ; > ;
            < "ÃäãÇØ äÕ" ; SWSTYLEBIT_TEXT ; > ;
            < "ÃäãÇØ ÇáÝÕá" ; SWSTYLEBIT_CHAPTER ; > ;
            < "ÃäãÇØ ÇáÞÇÆãÉ" ; SWSTYLEBIT_LIST ; > ;
            < "ÃäãÇØ ÝåÑÓ" ; SWSTYLEBIT_IDX ; > ;
            < "ÃäãÇØ äØÇÞÇÊ ÎÇÕÉ" ; SWSTYLEBIT_EXTRA ; > ;
            < "ÃäãÇØ  HTML" ; SWSTYLEBIT_HTML ; > ;
            < "ÃäãÇØ ãÔÑæØÉ" ; SWSTYLEBIT_CONDCOLL ; > ;
        };
        Text[ dutch ] = "Alinea-opmaakprofielen";
            Text[ chinese_simplified ] = "¶ÎÂäÑùʽ";
            FilterList [ dutch ] =
        {
            < "Automatisch" ; SFXSTYLEBIT_AUTO ; > ;
            < "Alle opmaakprofielen" ; SFXSTYLEBIT_ALL ; > ;
            < "Gebruikte opmaakprofielen" ; SFXSTYLEBIT_USED ; > ;
            < "Eigen opmaakprofielen" ; SFXSTYLEBIT_USERDEF ; > ;
            < "Tekstopmaakprofielen" ; SWSTYLEBIT_TEXT ; > ;
            < "Opmaakprofielen voor hoofdtukken" ; SWSTYLEBIT_CHAPTER ; > ;
            < "Lijstopmaakprofielen" ; SWSTYLEBIT_LIST ; > ;
            < "Indexopmaakprofielen" ; SWSTYLEBIT_IDX ; > ;
            < "Opmaakprof. speciale bereiken" ; SWSTYLEBIT_EXTRA ; > ;
            < "HTML-opmaakprofielen" ; SWSTYLEBIT_HTML ; > ;
            < "Conditionele opmaakprofielen" ; SWSTYLEBIT_CONDCOLL ; > ;
        };
        FilterList [ chinese_simplified ] =
        {
            < "×Ô¶¯" ; SFXSTYLEBIT_AUTO ; > ;
            < "È«²¿Ñùʽ" ; SFXSTYLEBIT_ALL ; > ;
            < "ʹÓõÄÑùʽ" ; SFXSTYLEBIT_USED ; > ;
            < "×Ô¶¨Ñùʽ" ; SFXSTYLEBIT_USERDEF ; > ;
            < "ÎÄ×ÖÑùʽ" ; SWSTYLEBIT_TEXT ; > ;
            < "ÕÂÑùʽ" ; SWSTYLEBIT_CHAPTER ; > ;
            < "Áе¥Ñùʽ" ; SWSTYLEBIT_LIST ; > ;
            < "Ë÷ÒýÑùʽ" ; SWSTYLEBIT_IDX ; > ;
            < "ÑùÊ½ÌØÊâÇøÓò" ; SWSTYLEBIT_EXTRA ; > ;
            < "HTML Ñùʽ" ; SWSTYLEBIT_HTML ; > ;
            < "ÓÐÌõ¼þµÄÑùʽ" ; SWSTYLEBIT_CONDCOLL ; > ;
        };
        Text[ greek ] = "Ðñüôõðá ðáñáãñÜöùí";
            Text[ korean ] = "´Ü¶ô À¯Çü";
            FilterList [ greek ] =
        {
            < "Áõôüìáôá" ; SFXSTYLEBIT_AUTO ; > ;
            < "¼ëá ôá ðñüôõðá" ; SFXSTYLEBIT_ALL ; > ;
            < "ÅöáñìïóìÝíá óôõë" ; SFXSTYLEBIT_USED ; > ;
            < "Ðñüôõðá ÷ñÞóôç" ; SFXSTYLEBIT_USERDEF ; > ;
            < "Ðñüôõðï êåéìÝíïõ" ; SWSTYLEBIT_TEXT ; > ;
            < "Ðñüôõðá êåöáëáßùí" ; SWSTYLEBIT_CHAPTER ; > ;
            < "Óôõë ëßóôáò" ; SWSTYLEBIT_LIST ; > ;
            < "Ðñüôõðá åõñåôçñßùí" ; SWSTYLEBIT_IDX ; > ;
            < "Ðñüôõðá åéäéêþí ðåñéï÷þí" ; SWSTYLEBIT_EXTRA ; > ;
            < "Ðñüôõðá HTML" ; SWSTYLEBIT_HTML ; > ;
            < "Ðñüôõðá õðü üñïõò" ; SWSTYLEBIT_CONDCOLL ; > ;
        };
        FilterList [ korean ] =
        {
            < "ÀÚµ¿" ; SFXSTYLEBIT_AUTO ; > ;
            < "Àüü À¯Çü" ; SFXSTYLEBIT_ALL ; > ;
            < "À¯ÇüÀÌ Àû¿ëµÇ¾ú½À´Ï´Ù." ; SFXSTYLEBIT_USED ; > ;
            < "»ç¿ëÀÚ Á¤ÀÇ À¯Çü" ; SFXSTYLEBIT_USERDEF ; > ;
            < "ÅØ½ºÆ® À¯Çü" ; SWSTYLEBIT_TEXT ; > ;
            < "Àå À¯Çü" ; SWSTYLEBIT_CHAPTER ; > ;
            < "¸®½ºÆ® À¯Çü" ; SWSTYLEBIT_LIST ; > ;
            < "»öÀÎ À¯Çü" ; SWSTYLEBIT_IDX ; > ;
            < "Ưº° Áö¿ª À¯Çü" ; SWSTYLEBIT_EXTRA ; > ;
            < "HTML À¯Çü" ; SWSTYLEBIT_HTML ; > ;
            < "Á¶°ÇÀû À¯Çü" ; SWSTYLEBIT_CONDCOLL ; > ;
        };
        Text[ turkish ] = "Paragraf biçimi";
            FilterList [ turkish ] =
        {
            < "Otomatik" ; SFXSTYLEBIT_AUTO ; > ;
            < "Bütün biçimler" ; SFXSTYLEBIT_ALL ; > ;
            < "Kullanýlan biçim" ; SFXSTYLEBIT_USED ; > ;
            < "Kullanýcý biçimi" ; SFXSTYLEBIT_USERDEF ; > ;
            < "Metin biçimi" ; SWSTYLEBIT_TEXT ; > ;
            < "Bölüm biçimi" ; SWSTYLEBIT_CHAPTER ; > ;
            < "Liste biçimi" ; SWSTYLEBIT_LIST ; > ;
            < "Dizin biçimi" ; SWSTYLEBIT_IDX ; > ;
            < "Özel bölüm biçimi" ; SWSTYLEBIT_EXTRA ; > ;
            < "HTML biçimi" ; SWSTYLEBIT_HTML ; > ;
            < "Koþullu biçim" ; SWSTYLEBIT_CONDCOLL ; > ;
        };
    };
        SfxStyleFamilyItem
        {
            StyleImage = Image
            {
                ImageBitmap = Bitmap { File = "catabc.bmp" ; };
                MaskColor = IMAGE_STDBTN_COLOR ;
            };
            Text = "Zeichenvorlagen" ;
            Text [ ENGLISH ] = "Character Styles" ;
            Text [ norwegian ] = "Tegnmaler" ;
            Text [ italian ] = "Modelli di carattere" ;
            Text [ portuguese_brazilian ] = "Estilo de Caracter" ;
            Text [ portuguese ] = "Estilos de caracteres" ;
            Text [ finnish ] = "Merkkityylit" ;
            Text [ danish ] = "Tegntypografier" ;
            Text [ french ] = "Styles de caractère" ;
            Text [ swedish ] = "Teckenformatmallar" ;
            Text [ dutch ] = "Tekenopmaakprofielen" ;
            Text [ spanish ] = "Estilos de caracteres" ;
            Text [ english_us ] = "Character Styles" ;
            StyleFamily = SFX_STYLE_FAMILY_CHAR ;
            FilterList =
            {
                < "Alle" ; SFXSTYLEBIT_ALL ; > ;
                < "Verwendete Vorlagen" ; SFXSTYLEBIT_USED ; > ;
                < "Benutzervorlagen" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            FilterList [ ENGLISH ] =
            {
                < "Alle" ; SFXSTYLEBIT_ALL ; > ;
                < "Verwendete Vorlagen" ; SFXSTYLEBIT_USED ; > ;
                < "Benutzervorlagen" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ dutch ] =
            {
                < "Alle" ; SFXSTYLEBIT_ALL ; > ;
                < "Gebruikte opmaakprofielen" ; SFXSTYLEBIT_USED ; > ;
                < "Eigen opmaakprofielen" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ english_us ] =
            {
                < "All" ; SFXSTYLEBIT_ALL ; > ;
                < "Applied Styles" ; SFXSTYLEBIT_USED ; > ;
                < "Custom Styles" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ italian ] =
            {
                < "Tutti" ; SFXSTYLEBIT_ALL ; > ;
                < "Modelli usati" ; SFXSTYLEBIT_USED ; > ;
                < "Modelli utente" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ spanish ] =
            {
                < "Todos" ; SFXSTYLEBIT_ALL ; > ;
                < "Estilos aplicados" ; SFXSTYLEBIT_USED ; > ;
                < "Estilos del usuario" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ french ] =
            {
                < "Tous les styles" ; SFXSTYLEBIT_ALL ; > ;
                < "Styles utilisés" ; SFXSTYLEBIT_USED ; > ;
                < "Styles personnalisés" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ portuguese_brazilian ] =
            {
                < "Alle" ; SFXSTYLEBIT_ALL ; > ;
                < "Verwendete Vorlagen" ; SFXSTYLEBIT_USED ; > ;
                < "Benutzervorlagen" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ swedish ] =
            {
                < "Alla" ; SFXSTYLEBIT_ALL ; > ;
                < "Använda formatmallar" ; SFXSTYLEBIT_USED ; > ;
                < "Användardefinierade formatmallar" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ danish ] =
            {
                < "Alle" ; SFXSTYLEBIT_ALL ; > ;
                < "Anvendte typografier" ; SFXSTYLEBIT_USED ; > ;
                < "Brugerdefinerede typografier" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ portuguese ] =
            {
                < "Todos" ; SFXSTYLEBIT_ALL ; > ;
                < "Estilos utilizados" ; SFXSTYLEBIT_USED ; > ;
                < "Estilos personalizados" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            Text[ chinese_simplified ] = "×Ö·ûÑùʽ";
            FilterList [ chinese_simplified ] =
        {
            < "È«²¿" ; SFXSTYLEBIT_ALL ; > ;
            < "ʹÓõÄÑùʽ" ; SFXSTYLEBIT_USED ; > ;
            < "×Ô¶¨Ñùʽ" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        FilterList [ language_user1 ] =
        {
            < "Alle" ; SFXSTYLEBIT_ALL ; > ;
            < " " ; SFXSTYLEBIT_USED ; > ;
            < " " ; SFXSTYLEBIT_USERDEF ; > ;
        };
        FilterList [ language_user1 ] =
        {
            < "Alle" ; SFXSTYLEBIT_ALL ; > ;
            < " " ; SFXSTYLEBIT_USED ; > ;
            < " " ; SFXSTYLEBIT_USERDEF ; > ;
        };
        Text[ language_user1 ] = " ";
            Text[ russian ] = "Ñòèëè çíàêîâ";
            Text[ polish ] = "Style znaku";
            Text[ japanese ] = "•¶Žš½À²Ù";
            FilterList [ russian ] =
        {
            < "Âñå" ; SFXSTYLEBIT_ALL ; > ;
            < "Ïðèìåíåííûå ñòèëè" ; SFXSTYLEBIT_USED ; > ;
            < "Ñòèëè ïîëüçîâàòåëÿ" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        FilterList [ polish ] =
        {
            < "Wszystkie" ; SFXSTYLEBIT_ALL ; > ;
            < "U¿yte style" ; SFXSTYLEBIT_USED ; > ;
            < "Style u¿ytkownika" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        FilterList [ japanese ] =
        {
            < "‚·‚ׂÄ" ; SFXSTYLEBIT_ALL ; > ;
            < "Žg—p‚µ‚½½À²Ù" ; SFXSTYLEBIT_USED ; > ;
            < "Õ°»Þ°’è‹`‚̽À²Ù" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        Text[ chinese_traditional ] = "¤å¦r¼Ë¦¡";
            FilterList [ chinese_traditional ] =
        {
            < "¥þ³¡" ; SFXSTYLEBIT_ALL ; > ;
            < "¨Ï¥Îªº¼Ë¦¡" ; SFXSTYLEBIT_USED ; > ;
            < "¦Û­q¼Ë¦¡" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        Text[ arabic ] = "ÃäãÇØ ÃÍÑÝ";
            FilterList [ arabic ] =
        {
            < "Çáßá" ; SFXSTYLEBIT_ALL ; > ;
            < "ÃäãÇØ ÞíÏ ÇáÇÓÊÎÏÇã" ; SFXSTYLEBIT_USED ; > ;
            < "ÃäãÇØ ãÎÕÕÉ" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        Text[ dutch ] = "Tekenopmaakprofielen";
            Text[ chinese_simplified ] = "×Ö·ûÑùʽ";
            FilterList [ dutch ] =
        {
            < "Alle" ; SFXSTYLEBIT_ALL ; > ;
            < "Gebruikte opmaakprofielen" ; SFXSTYLEBIT_USED ; > ;
            < "Eigen opmaakprofielen" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        FilterList [ chinese_simplified ] =
        {
            < "È«²¿" ; SFXSTYLEBIT_ALL ; > ;
            < "ʹÓõÄÑùʽ" ; SFXSTYLEBIT_USED ; > ;
            < "×Ô¶¨Ñùʽ" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        Text[ greek ] = "Óôõë ÷áñáêôÞñùí";
            Text[ korean ] = "¹®ÀÚ À¯Çü";
            FilterList [ greek ] =
        {
            < "¼ëá" ; SFXSTYLEBIT_ALL ; > ;
            < "ÅöáñìïóìÝíá óôõë" ; SFXSTYLEBIT_USED ; > ;
            < "Ðñüôõðá ÷ñÞóôç" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        FilterList [ korean ] =
        {
            < "ÀüºÎ" ; SFXSTYLEBIT_ALL ; > ;
            < "À¯ÇüÀÌ Àû¿ëµÇ¾ú½À´Ï´Ù." ; SFXSTYLEBIT_USED ; > ;
            < "»ç¿ëÀÚ Á¤ÀÇ À¯Çü" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        Text[ turkish ] = "Karakter biçimi";
            FilterList [ turkish ] =
        {
            < "Tümü" ; SFXSTYLEBIT_ALL ; > ;
            < "Uygulanan biçim" ; SFXSTYLEBIT_USED ; > ;
            < "Kullanýcý biçimi" ; SFXSTYLEBIT_USERDEF ; > ;
        };
    };
        SfxStyleFamilyItem
        {
            StyleImage = Image
            {
                ImageBitmap = Bitmap { File = "catfrm.bmp" ; };
                MaskColor = IMAGE_STDBTN_COLOR ;
            };
            Text = "Rahmenvorlagen" ;
            Text [ ENGLISH ] = "Frame Styles" ;
            Text [ norwegian ] = "Rammemaler" ;
            Text [ italian ] = "Modelli di cornice" ;
            Text [ portuguese_brazilian ] = "Estilos de Moldura" ;
            Text [ portuguese ] = "Estilos de molduras" ;
            Text [ finnish ] = "Kehystyylit" ;
            Text [ danish ] = "Rammetypografier" ;
            Text [ french ] = "Styles de cadre" ;
            Text [ swedish ] = "Ramformatmallar" ;
            Text [ dutch ] = "Kaderopmaakprofielen" ;
            Text [ spanish ] = "Estilos de marcos" ;
            Text [ english_us ] = "Frame Styles" ;
            StyleFamily = SFX_STYLE_FAMILY_FRAME ;
            FilterList =
            {
                < "Alle" ; SFXSTYLEBIT_ALL ; > ;
                < "Verwendete Vorlagen" ; SFXSTYLEBIT_USED ; > ;
                < "Benutzervorlagen" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            FilterList [ ENGLISH ] =
            {
                < "Alle" ; SFXSTYLEBIT_ALL ; > ;
                < "Verwendete Vorlagen" ; SFXSTYLEBIT_USED ; > ;
                < "Benutzervorlagen" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ dutch ] =
            {
                < "Alle" ; SFXSTYLEBIT_ALL ; > ;
                < "Gebruikte opmaakprofielen" ; SFXSTYLEBIT_USED ; > ;
                < "Eigen opmaakprofielen" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ english_us ] =
            {
                < "All" ; SFXSTYLEBIT_ALL ; > ;
                < "Applied Styles" ; SFXSTYLEBIT_USED ; > ;
                < "Custom Styles" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ italian ] =
            {
                < "Tutti" ; SFXSTYLEBIT_ALL ; > ;
                < "Modelli usati" ; SFXSTYLEBIT_USED ; > ;
                < "Modelli utente" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ spanish ] =
            {
                < "Todos" ; SFXSTYLEBIT_ALL ; > ;
                < "Estilos aplicados" ; SFXSTYLEBIT_USED ; > ;
                < "Estilos del usuario" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ french ] =
            {
                < "Tous les styles" ; SFXSTYLEBIT_ALL ; > ;
                < "Styles utilisés" ; SFXSTYLEBIT_USED ; > ;
                < "Styles personnalisés" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ portuguese_brazilian ] =
            {
                < "Alle" ; SFXSTYLEBIT_ALL ; > ;
                < "Verwendete Vorlagen" ; SFXSTYLEBIT_USED ; > ;
                < "Benutzervorlagen" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ swedish ] =
            {
                < "Alla" ; SFXSTYLEBIT_ALL ; > ;
                < "Använda formatmallar" ; SFXSTYLEBIT_USED ; > ;
                < "Användardefinierade formatmallar" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ danish ] =
            {
                < "Alle" ; SFXSTYLEBIT_ALL ; > ;
                < "Anvendte typografier" ; SFXSTYLEBIT_USED ; > ;
                < "Brugerdefinerede typografier" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ portuguese ] =
            {
                < "Todos" ; SFXSTYLEBIT_ALL ; > ;
                < "Estilos usados" ; SFXSTYLEBIT_USED ; > ;
                < "Estilos personalizados" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            Text[ chinese_simplified ] = "¿òÑùʽ";
            FilterList [ chinese_simplified ] =
        {
            < "È«²¿" ; SFXSTYLEBIT_ALL ; > ;
            < "ʹÓõÄÑùʽ" ; SFXSTYLEBIT_USED ; > ;
            < "×Ô¶¨Ñùʽ" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        FilterList [ language_user1 ] =
        {
            < "Alle" ; SFXSTYLEBIT_ALL ; > ;
            < " " ; SFXSTYLEBIT_USED ; > ;
            < " " ; SFXSTYLEBIT_USERDEF ; > ;
        };
        FilterList [ language_user1 ] =
        {
            < "Alle" ; SFXSTYLEBIT_ALL ; > ;
            < " " ; SFXSTYLEBIT_USED ; > ;
            < " " ; SFXSTYLEBIT_USERDEF ; > ;
        };
        Text[ language_user1 ] = " ";
            Text[ russian ] = "Ñòèëè ðàìîê";
            Text[ polish ] = "Style ramek";
            Text[ japanese ] = "˜g½À²Ù";
            FilterList [ russian ] =
        {
            < "Âñå" ; SFXSTYLEBIT_ALL ; > ;
            < "Ïðèìåíåííûå ñòèëè" ; SFXSTYLEBIT_USED ; > ;
            < "Ñòèëè ïîëüçîâàòåëÿ" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        FilterList [ polish ] =
        {
            < "Wszystkie" ; SFXSTYLEBIT_ALL ; > ;
            < "U¿yte style" ; SFXSTYLEBIT_USED ; > ;
            < "Style u¿ytkownika" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        FilterList [ japanese ] =
        {
            < "‚·‚ׂÄ" ; SFXSTYLEBIT_ALL ; > ;
            < "Žg—p‚µ‚½½À²Ù" ; SFXSTYLEBIT_USED ; > ;
            < "Õ°»Þ°’è‹`‚̽À²Ù" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        Text[ chinese_traditional ] = "®Ø¼Ë¦¡";
            FilterList [ chinese_traditional ] =
        {
            < "¥þ³¡" ; SFXSTYLEBIT_ALL ; > ;
            < "¨Ï¥Îªº¼Ë¦¡" ; SFXSTYLEBIT_USED ; > ;
            < "¦Û­q¼Ë¦¡" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        Text[ arabic ] = "ÃäãÇØ ÅØÇÑ";
            FilterList [ arabic ] =
        {
            < "Çáßá" ; SFXSTYLEBIT_ALL ; > ;
            < "ÃäãÇØ ÞíÏ ÇáÇÓÊÎÏÇã" ; SFXSTYLEBIT_USED ; > ;
            < "ÃäãÇØ ãÎÕÕÉ" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        Text[ dutch ] = "Kaderopmaakprofielen";
            Text[ chinese_simplified ] = "¿òÑùʽ";
            FilterList [ dutch ] =
        {
            < "Alle" ; SFXSTYLEBIT_ALL ; > ;
            < "Gebruikte opmaakprofielen" ; SFXSTYLEBIT_USED ; > ;
            < "Eigen opmaakprofielen" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        FilterList [ chinese_simplified ] =
        {
            < "È«²¿" ; SFXSTYLEBIT_ALL ; > ;
            < "ʹÓõÄÑùʽ" ; SFXSTYLEBIT_USED ; > ;
            < "×Ô¶¨Ñùʽ" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        Text[ greek ] = "Ðñüôõðá ðëáéóßïõ";
            Text[ korean ] = "ÇÁ·¹ÀÓ À¯Çü";
            FilterList [ greek ] =
        {
            < "¼ëá" ; SFXSTYLEBIT_ALL ; > ;
            < "ÅöáñìïóìÝíá óôõë" ; SFXSTYLEBIT_USED ; > ;
            < "Ðñüôõðá ÷ñÞóôç" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        FilterList [ korean ] =
        {
            < "ÀüºÎ" ; SFXSTYLEBIT_ALL ; > ;
            < "À¯ÇüÀÌ Àû¿ëµÇ¾ú½À´Ï´Ù." ; SFXSTYLEBIT_USED ; > ;
            < "»ç¿ëÀÚ Á¤ÀÇ À¯Çü" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        Text[ turkish ] = "Çerçeve biçimi";
            FilterList [ turkish ] =
        {
            < "Tümü" ; SFXSTYLEBIT_ALL ; > ;
            < "Uygulanan biçim" ; SFXSTYLEBIT_USED ; > ;
            < "Kullanýcý biçimi" ; SFXSTYLEBIT_USERDEF ; > ;
        };
    };
        SfxStyleFamilyItem
        {
            StyleImage = Image
            {
                ImageBitmap = Bitmap { File = "catpag.bmp" ; };
                MaskColor = IMAGE_STDBTN_COLOR ;
            };
            Text = "Seitenvorlagen" ;
            Text [ ENGLISH ] = "Page Styles" ;
            Text [ norwegian ] = "Sidetyper" ;
            Text [ italian ] = "Modelli di pagina" ;
            Text [ portuguese_brazilian ] = "Estilos da Página" ;
            Text [ portuguese ] = "Estilos de página" ;
            Text [ finnish ] = "Sivutyylit" ;
            Text [ danish ] = "Sidetypografier" ;
            Text [ french ] = "Styles de page" ;
            Text [ swedish ] = "Sidformatmallar" ;
            Text [ dutch ] = "Pagina-opmaakprofielen" ;
            Text [ spanish ] = "Estilos de página" ;
            Text [ english_us ] = "Page Styles" ;
            StyleFamily = SFX_STYLE_FAMILY_PAGE ;
            FilterList =
            {
                < "Alle" ; SFXSTYLEBIT_ALL ; > ;
                < "Verwendete Vorlagen" ; SFXSTYLEBIT_USED ; > ;
                < "Benutzervorlagen" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            FilterList [ ENGLISH ] =
            {
                < "Alle" ; SFXSTYLEBIT_ALL ; > ;
                < "Verwendete Vorlagen" ; SFXSTYLEBIT_USED ; > ;
                < "Benutzervorlagen" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ dutch ] =
            {
                < "Alle" ; SFXSTYLEBIT_ALL ; > ;
                < "Gebruikte opmaakprofielen" ; SFXSTYLEBIT_USED ; > ;
                < "Eigen opmaakprofielen" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ english_us ] =
            {
                < "All" ; SFXSTYLEBIT_ALL ; > ;
                < "Applied Styles" ; SFXSTYLEBIT_USED ; > ;
                < "Custom Styles" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ italian ] =
            {
                < "Tutti" ; SFXSTYLEBIT_ALL ; > ;
                < "Modeli usati" ; SFXSTYLEBIT_USED ; > ;
                < "Modelli utente" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ spanish ] =
            {
                < "Todos" ; SFXSTYLEBIT_ALL ; > ;
                < "Estilos aplicados" ; SFXSTYLEBIT_USED ; > ;
                < "Estilos del usuario" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ french ] =
            {
                < "Tous les styles" ; SFXSTYLEBIT_ALL ; > ;
                < "Styles utilisés" ; SFXSTYLEBIT_USED ; > ;
                < "Styles personnalisés" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ portuguese_brazilian ] =
            {
                < "Alle" ; SFXSTYLEBIT_ALL ; > ;
                < "Verwendete Vorlagen" ; SFXSTYLEBIT_USED ; > ;
                < "Benutzervorlagen" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ swedish ] =
            {
                < "Alla" ; SFXSTYLEBIT_ALL ; > ;
                < "Använda formatmallar" ; SFXSTYLEBIT_USED ; > ;
                < "Användardefinierade formatmallar" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ danish ] =
            {
                < "Alle" ; SFXSTYLEBIT_ALL ; > ;
                < "Anvendte typografier" ; SFXSTYLEBIT_USED ; > ;
                < "Brugerdefinerede typografier" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ portuguese ] =
            {
                < "Todos" ; SFXSTYLEBIT_ALL ; > ;
                < "Estilos usados" ; SFXSTYLEBIT_USED ; > ;
                < "Estilos personalizados" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            FilterList [ chinese_simplified ] =
        {
            < "È«²¿" ; SFXSTYLEBIT_ALL ; > ;
            < "ʹÓÃÑùʽ" ; SFXSTYLEBIT_USED ; > ;
            < "×Ô¶¨Ñùʽ" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        FilterList [ language_user1 ] =
        {
            < "Alle" ; SFXSTYLEBIT_ALL ; > ;
            < " " ; SFXSTYLEBIT_USED ; > ;
            < " " ; SFXSTYLEBIT_USERDEF ; > ;
        };
        FilterList [ language_user1 ] =
        {
            < "Alle" ; SFXSTYLEBIT_ALL ; > ;
            < " " ; SFXSTYLEBIT_USED ; > ;
            < " " ; SFXSTYLEBIT_USERDEF ; > ;
        };
        FilterList [ russian ] =
        {
            < "Âñå" ; SFXSTYLEBIT_ALL ; > ;
            < "Ïðèìåíåííûå ñòèëè" ; SFXSTYLEBIT_USED ; > ;
            < "Ñòèëè ïîëüçîâàòåëÿ" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        FilterList [ polish ] =
        {
            < "Wszystkie" ; SFXSTYLEBIT_ALL ; > ;
            < "U¿yte style" ; SFXSTYLEBIT_USED ; > ;
            < "Style u¿ytkownika" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        FilterList [ japanese ] =
        {
            < "‚·‚ׂÄ" ; SFXSTYLEBIT_ALL ; > ;
            < "Žg—p‚µ‚½½À²Ù" ; SFXSTYLEBIT_USED ; > ;
            < "Õ°»Þ°’è‹`‚̽À²Ù" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        FilterList [ chinese_traditional ] =
        {
            < "¥þ³¡" ; SFXSTYLEBIT_ALL ; > ;
            < "¦Û­q¼Ë¦¡" ; SFXSTYLEBIT_USED ; > ;
            < "¦Û­q¼Ë¦¡" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        Text[ russian ] = "Ñòèëè ñòðàíèöû";
            Text[ polish ] = "Style strony";
            Text[ japanese ] = "Íß°¼Þ½À²Ù";
            Text[ chinese_simplified ] = "Ò³ÃæÑùʽ";
            Text[ chinese_traditional ] = "­¶­±¼Ë¦¡";
            Text[ arabic ] = "ÃäãÇØ ÕÝÍÉ";
            FilterList [ arabic ] =
        {
            < "Çáßá" ; SFXSTYLEBIT_ALL ; > ;
            < "ÃäãÇØ ÞíÏ ÇáÇÓÊÎÏÇã" ; SFXSTYLEBIT_USED ; > ;
            < "ÃäãÇØ ãÎÕÕÉ" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        Text[ dutch ] = "Pagina-opmaakprofielen";
            Text[ chinese_simplified ] = "Ò³ÃæÑùʽ";
            FilterList [ dutch ] =
        {
            < "Alle" ; SFXSTYLEBIT_ALL ; > ;
            < "Gebruikte opmaakprofielen" ; SFXSTYLEBIT_USED ; > ;
            < "Eigen opmaakprofielen" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        FilterList [ chinese_simplified ] =
        {
            < "È«²¿" ; SFXSTYLEBIT_ALL ; > ;
            < "ʹÓÃÑùʽ" ; SFXSTYLEBIT_USED ; > ;
            < "×Ô¶¨Ñùʽ" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        Text[ greek ] = "Ðñüôõðá óåëéäþí";
            Text[ korean ] = "ÆäÀÌÁö À¯Çü";
            FilterList [ greek ] =
        {
            < "¼ëá" ; SFXSTYLEBIT_ALL ; > ;
            < "ÅöáñìïóìÝíá óôõë" ; SFXSTYLEBIT_USED ; > ;
            < "Ðñüôõðá ÷ñÞóôç" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        FilterList [ korean ] =
        {
            < "ÀüºÎ" ; SFXSTYLEBIT_ALL ; > ;
            < "À¯ÇüÀÌ Àû¿ëµÇ¾ú½À´Ï´Ù." ; SFXSTYLEBIT_USED ; > ;
            < "»ç¿ëÀÚ Á¤ÀÇ À¯Çü" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        Text[ turkish ] = "Sayfa biçimi";
            FilterList [ turkish ] =
        {
            < "Tümü" ; SFXSTYLEBIT_ALL ; > ;
            < "Uygulanan biçim" ; SFXSTYLEBIT_USED ; > ;
            < "Kullanýcý biçimi" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        Text[ language_user1 ] = " ";
        };
        SfxStyleFamilyItem
        {
            StyleImage = Image
            {
                ImageBitmap = Bitmap { File = "catnum.bmp" ; };
                MaskColor = IMAGE_STDBTN_COLOR ;
            };
            Text = "Nummerierungsvorlagen" ;
            Text [ ENGLISH ] = "Number Styles" ;
            StyleFamily = SFX_STYLE_FAMILY_PSEUDO ;
            FilterList =
            {
                < "Alle" ; SFXSTYLEBIT_ALL ; > ;
                < "Verwendete Vorlagen" ; SFXSTYLEBIT_USED ; > ;
                < "Benutzervorlagen" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            FilterList [ ENGLISH ] =
            {
                < "Alle" ; SFXSTYLEBIT_ALL ; > ;
                < "Verwendete Vorlagen" ; SFXSTYLEBIT_USED ; > ;
                < "Benutzervorlagen" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ dutch ] =
            {
                < "Alle" ; SFXSTYLEBIT_ALL ; > ;
                < "Gebruikte opmaakprofielen" ; SFXSTYLEBIT_USED ; > ;
                < "Eigen opmaakprofielen" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ english_us ] =
            {
                < "All" ; SFXSTYLEBIT_ALL ; > ;
                < "Applied Styles" ; SFXSTYLEBIT_USED ; > ;
                < "Custom Styles" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ italian ] =
            {
                < "Tutti" ; SFXSTYLEBIT_ALL ; > ;
                < "Modeli usati" ; SFXSTYLEBIT_USED ; > ;
                < "Modelli utente" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ spanish ] =
            {
                < "Todos" ; SFXSTYLEBIT_ALL ; > ;
                < "Estilos aplicados" ; SFXSTYLEBIT_USED ; > ;
                < "Estilos del usuario" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ french ] =
            {
                < "Tous" ; SFXSTYLEBIT_ALL ; > ;
                < "Styles utilisés" ; SFXSTYLEBIT_USED ; > ;
                < "Styles personnalisés" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ portuguese_brazilian ] =
            {
                < "Alle" ; SFXSTYLEBIT_ALL ; > ;
                < "Verwendete Vorlagen" ; SFXSTYLEBIT_USED ; > ;
                < "Benutzervorlagen" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ swedish ] =
            {
                < "Alla" ; SFXSTYLEBIT_ALL ; > ;
                < "Använda formatmallar" ; SFXSTYLEBIT_USED ; > ;
                < "Användardefinierade formatmallar" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ danish ] =
            {
                < "Alle" ; SFXSTYLEBIT_ALL ; > ;
                < "Anvendte typografier" ; SFXSTYLEBIT_USED ; > ;
                < "Brugerdefinerede typografier" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            filterlist [ portuguese ] =
            {
                < "Todos" ; SFXSTYLEBIT_ALL ; > ;
                < "Estilos usados" ; SFXSTYLEBIT_USED ; > ;
                < "Estilos personalizados" ; SFXSTYLEBIT_USERDEF ; > ;
            };
            Text [ portuguese ] = "Estilos de numeração" ;
            Text [ english_us ] = "Numbering Styles" ;
            Text [ portuguese_brazilian ] = "Numerierungsvorlagen" ;
            Text [ swedish ] = "Numreringsformatmallar" ;
            Text [ danish ] = "Nummereringstypografier" ;
            Text [ italian ] = "Modelli di numerazione" ;
            Text [ spanish ] = "Estilos de numeración" ;
            Text [ french ] = "Styles de numérotation" ;
            Text [ dutch ] = "Opmaakprofielen voor nummering" ;
            Text[ chinese_simplified ] = "±àºÅÑùʽ";
            FilterList [ chinese_simplified ] =
        {
            < "È«²¿" ; SFXSTYLEBIT_ALL ; > ;
            < "ʹÓõÄÑùʽ" ; SFXSTYLEBIT_USED ; > ;
            < "×Ô¶¨Ñùʽ" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        FilterList [ language_user1 ] =
        {
            < " " ; SFXSTYLEBIT_ALL ; > ;
            < " " ; SFXSTYLEBIT_USED ; > ;
            < " " ; SFXSTYLEBIT_USERDEF ; > ;
        };
        FilterList [ language_user1 ] =
        {
            < " " ; SFXSTYLEBIT_ALL ; > ;
            < " " ; SFXSTYLEBIT_USED ; > ;
            < " " ; SFXSTYLEBIT_USERDEF ; > ;
        };
        Text[ language_user1 ] = "èë? ñòèë? òèE";
            Text[ russian ] = "Ñòèëè íóìåðàöèè";
            Text[ polish ] = "Style numeracji";
            Text[ japanese ] = "”ԍ†•t‚¯½À²Ù";
            FilterList [ russian ] =
        {
            < "Âñå" ; SFXSTYLEBIT_ALL ; > ;
            < "Ïðèìåíåííûå ñòèëè" ; SFXSTYLEBIT_USED ; > ;
            < "Ñòèëè ïîëüçîâàòåëÿ" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        FilterList [ polish ] =
        {
            < "Wszystkie" ; SFXSTYLEBIT_ALL ; > ;
            < "U¿yte style" ; SFXSTYLEBIT_USED ; > ;
            < "Style u¿ytkownika" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        FilterList [ japanese ] =
        {
            < "‚·‚ׂÄ" ; SFXSTYLEBIT_ALL ; > ;
            < "Žg—p‚µ‚½½À²Ù" ; SFXSTYLEBIT_USED ; > ;
            < "Õ°»Þ°’è‹`‚̽À²Ù" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        Text[ chinese_traditional ] = "½s¸¹¼Ë¦¡";
            FilterList [ chinese_traditional ] =
        {
            < "¥þ³¡" ; SFXSTYLEBIT_ALL ; > ;
            < "¨Ï¥Îªº¼Ë¦¡" ; SFXSTYLEBIT_USED ; > ;
            < "¦Û­q¼Ë¦¡" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        Text[ arabic ] = "ÃäãÇØ ÇáÊÑÞíã";
            FilterList [ arabic ] =
        {
            < "Çáßá" ; SFXSTYLEBIT_ALL ; > ;
            < "ÃäãÇØ ÞíÏ ÇáÇÓÊÎÏÇã" ; SFXSTYLEBIT_USED ; > ;
            < "ÇáÃäãÇØ ÇáãÎÕÕÉ" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        Text[ dutch ] = "Opmaakprofielen voor nummering";
            Text[ chinese_simplified ] = "±àºÅÑùʽ";
            FilterList [ dutch ] =
        {
            < "Alle" ; SFXSTYLEBIT_ALL ; > ;
            < "Gebruikte opmaakprofielen" ; SFXSTYLEBIT_USED ; > ;
            < "Eigen opmaakprofielen" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        FilterList [ chinese_simplified ] =
        {
            < "È«²¿" ; SFXSTYLEBIT_ALL ; > ;
            < "ʹÓõÄÑùʽ" ; SFXSTYLEBIT_USED ; > ;
            < "×Ô¶¨Ñùʽ" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        Text[ greek ] = "Óôõë áñßèìçóçò";
            Text[ korean ] = "¹øÈ£ ¸Å±â±â À¯Çü";
            FilterList [ greek ] =
        {
            < "¼ëá" ; SFXSTYLEBIT_ALL ; > ;
            < "ÅöáñìïóìÝíá óôõë" ; SFXSTYLEBIT_USED ; > ;
            < "Ðñüôõðá ÷ñÞóôç" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        FilterList [ korean ] =
        {
            < "ÀüºÎ" ; SFXSTYLEBIT_ALL ; > ;
            < "À¯Çü Àû¿ë" ; SFXSTYLEBIT_USED ; > ;
            < "»ç¿ëÀÚ Á¤ÀÇ À¯Çü" ; SFXSTYLEBIT_USERDEF ; > ;
        };
        Text[ turkish ] = "Numaralama biçimi";
            FilterList [ turkish ] =
        {
            < "Tümü" ; SFXSTYLEBIT_ALL ; > ;
            < "Kullanýlan biçim" ; SFXSTYLEBIT_USED ; > ;
            < "Kullanýcý biçimi" ; SFXSTYLEBIT_USERDEF ; > ;
        };
    };
    };
};



 // Default Bitmap fuer Toolbox
BITMAP BMP_FEHLT { FILE = "x.bmp" ; };
 // Bitmap fuer die NumerierungsVorlagen im Organizer
Bitmap BMP_STYLES_FAMILY_NUM { File = "styfamnu.bmp" ; };

String STR_ENV_TITLE
{
    Text = "Briefumschlag" ;
    Text [ English ] = "Envelop" ;
    Text [ norwegian ] = "Konvolutt" ;
    Text [ italian ] = "Busta" ;
    Text [ portuguese_brazilian ] = "Envelope" ;
    Text [ portuguese ] = "Envelope" ;
    Text [ finnish ] = "Kirjekuori" ;
    Text [ danish ] = "Konvolut" ;
    Text [ french ] = "Enveloppe" ;
    Text [ swedish ] = "Kuvert" ;
    Text [ dutch ] = "Envelop" ;
    Text [ spanish ] = "Sobre" ;
    Text [ english_us ] = "Envelope" ;
    Text[ chinese_simplified ] = "ÐÅ·â";
    Text[ russian ] = "Êîíâåðò";
    Text[ polish ] = "Koperta";
    Text[ japanese ] = "••“›";
    Text[ chinese_traditional ] = "«H«Ê";
    Text[ arabic ] = "ÙÑÝ";
    Text[ dutch ] = "Envelop";
    Text[ chinese_simplified ] = "ÐÅ·â";
    Text[ greek ] = "ÖÜêåëïò";
    Text[ korean ] = "ºÀÅõ";
    Text[ turkish ] = "Zarf";
    Text[ language_user1 ] = " ";
};

String STR_LAB_TITLE
{
    Text = "Etiketten" ;
    Text [ English ] = "Labels" ;
    Text [ norwegian ] = "Etiketter" ;
    Text [ italian ] = "Etichette" ;
    Text [ portuguese_brazilian ] = "Etiquetas" ;
    Text [ portuguese ] = "Etiquetas" ;
    Text [ finnish ] = "Tarrat" ;
    Text [ danish ] = "Etiketter" ;
    Text [ french ] = "Étiquettes" ;
    Text [ swedish ] = "Etiketter" ;
    Text [ dutch ] = "Etiketten" ;
    Text [ spanish ] = "Etiquetas" ;
    Text [ english_us ] = "Labels" ;
    Text[ chinese_simplified ] = "±êÇ©";
    Text[ russian ] = "Íàêëåéêè";
    Text[ polish ] = "Etykiety";
    Text[ japanese ] = "×ÍÞÙ";
    Text[ chinese_traditional ] = "¶K¼Ð";
    Text[ arabic ] = "ÈØÇÞÇÊ ÚäæäÉ";
    Text[ dutch ] = "Etiketten";
    Text[ chinese_simplified ] = "±êÇ©";
    Text[ greek ] = "ÅôéêÝôåò";
    Text[ korean ] = "¶óº§";
    Text[ turkish ] = "Etiket";
    Text[ language_user1 ] = " ";
};

 // ShortName!!!
String STR_HUMAN_SWDOC_NAME
{
    /* ### ACHTUNG: Neuer Text in Resource? Text : Dokument */
    Text = "Text" ;
    Text [ English ] = "Text" ;
    Text [ english_us ] = "Text" ;
    Text [ swedish ] = "Text" ;
    Text [ danish ] = "Tekst" ;
    Text [ italian ] = "Testo" ;
    Text [ spanish ] = "Texto" ;
    Text [ french ] = "Texte" ;
    Text [ dutch ] = "Tekst" ;
    Text [ portuguese_brazilian ] = "Text" ;
    Text [ portuguese ] = "Texto" ;
    Text[ chinese_simplified ] = "ÎÄ×Ö";
    Text[ russian ] = "Òåêñò";
    Text[ polish ] = "Tekst";
    Text[ japanese ] = "÷½Ä";
    Text[ chinese_traditional ] = "¤å¦r";
    Text[ arabic ] = "ÇáäÕ";
    Text[ dutch ] = "Tekst";
    Text[ chinese_simplified ] = "ÎÄ×Ö";
    Text[ greek ] = "Êåßìåíï";
    Text[ korean ] = "ÅØ½ºÆ®";
    Text[ turkish ] = "Metin";
    Text[ language_user1 ] = " ";
};

String STR_WRITER_DOCUMENT_FULLTYPE_31
{
    Text = "StarOffice 3.0 Text" ;
    Text [ English ] = "StarOffice 3.0 Text" ;
    Text [ english_us ] = "Text (StarOffice 3.0)" ;
    Text [ portuguese_brazilian ] = "StarOffice 3.0 Text" ;
    Text [ swedish ] = "StarOffice 3.0 text" ;
    Text [ danish ] = "StarOffice 3.0 tekst" ;
    Text [ italian ] = "Test StarOffice 3.0" ;
    Text [ spanish ] = "Texto de StarOffice 3.0" ;
    Text [ french ] = "Texte StarOffice 3.0" ;
    Text [ dutch ] = "StarOffice 3.0 Tekst" ;
    Text [ portuguese ] = "StarOffice 3.0 Text" ;
    Text[ chinese_simplified ] = "StarOffice 3.0 Îı¾";
    Text[ russian ] = "Òåêñò â StarOffice 3.0";
    Text[ polish ] = "Tekst StarOffice 3.0";
    Text[ japanese ] = "StarOffice 3.0 ÷½Ä";
    Text[ chinese_traditional ] = "StarOffice 3.0 ¤å¦r¤å¥ó";
    Text[ arabic ] = "äÕ ãä StarOffice 3.0";
    Text[ dutch ] = "StarOffice 3.0 Tekst";
    Text[ chinese_simplified ] = "StarOffice 3.0 Îı¾";
    Text[ greek ] = "Êåßìåíï (StarOffice 3.0)";
    Text[ korean ] = "ÅØ½ºÆ® (StarOffice 3.0)";
    Text[ turkish ] = "StarOffice 3.0 metni";
    Text[ language_user1 ] = " ";
};

String STR_WRITER_DOCUMENT_FULLTYPE_40
{
    Text = "StarOffice 4.0 Text" ;
    Text [ English ] = "StarOffice 4.0 Text" ;
    Text [ english_us ] = "Text (StarOffice 4.0)" ;
    Text [ portuguese_brazilian ] = "StarOffice 4.0 Text" ;
    Text [ swedish ] = "StarOffice 4.0 text" ;
    Text [ danish ] = "StarOffice 4.0 tekst" ;
    Text [ italian ] = "Testo StarOffice 4.0" ;
    Text [ spanish ] = "Texto de StarOffice 4.0" ;
    Text [ french ] = "Texte StarOffice 4.0" ;
    Text [ dutch ] = "StarOffice 4.0 Tekst" ;
    Text [ portuguese ] = "Texto (StarOffice 4.0)" ;
    Text[ chinese_simplified ] = "StarOffice 4.0 Îı¾";
    Text[ language_user1 ] = " ";
    Text[ russian ] = "Òåêñò â StarOffice 4.0";
    Text[ polish ] = "Tekst StarOffice 4.0";
    Text[ japanese ] = "StarOffice 4.0 ÷½Ä";
    Text[ chinese_traditional ] = "StarOffice 4.0 ¤å¦r¤å¥ó";
    Text[ arabic ] = "äÕ ãä StarOffice 4.0";
    Text[ dutch ] = "StarOffice 4.0 Tekst";
    Text[ chinese_simplified ] = "StarOffice 4.0 Îı¾";
    Text[ greek ] = "Êåßìåíï (StarOffice 4.0)";
    Text[ korean ] = "ÅØ½ºÆ® (StarOffice 4.0)";
    Text[ turkish ] = "StarOffice 4.0 metni";
};

String STR_WRITER_DOCUMENT_FULLTYPE
{
    Text = "StarOffice 5.0 Text" ;
    Text [ English ] = "StarOffice 5.0 Text" ;
    Text [ english_us ] = "Text (StarOffice 5.0)" ;
    Text [ portuguese_brazilian ] = "StarOffice 4.0 Text" ;
    Text [ swedish ] = "StarOffice 5.0 text" ;
    Text [ danish ] = "StarOffice 4.0 tekst" ;
    Text [ italian ] = "Testo StarOffice 5.0" ;
    Text [ spanish ] = "Texto de StarOffice 5.0" ;
    Text [ french ] = "Texte StarOffice 5.0" ;
    Text [ dutch ] = "StarOffice 5.0 Tekst" ;
    Text [ portuguese ] = "Texto (StarOffice 5.0)" ;
    Text[ chinese_simplified ] = "StarOffice 5.0 Îı¾";
    Text[ russian ] = "Òåêñò â StarOffice 5.0";
    Text[ polish ] = "Tekst StarOffice 5.0";
    Text[ japanese ] = "StarOffice 5.0 ÷½Ä";
    Text[ chinese_traditional ] = "StarOffice 5.0 ¤å¦r¤å¥ó";
    Text[ arabic ] = "äÕ ãä StarOffice 5.0";
    Text[ dutch ] = "StarOffice 5.0 Tekst";
    Text[ chinese_simplified ] = "StarOffice 5.0 Îı¾";
    Text[ greek ] = "Êåßìåíï (StarOffice 5.0)";
    Text[ korean ] = "ÅØ½ºÆ® (StarOffice 5.0)";
    Text[ turkish ] = "StarOffice 5.0 metni";
    Text[ language_user1 ] = " ";
};


String STR_CANTOPEN
{
    TEXT = "Kann das Dokument nicht öffnen." ;
    TEXT [ English ] = "Can't open document." ;
    TEXT [ norwegian ] = "Kan ikke åpne dokumentet." ;
    TEXT [ italian ] = "Impossibile aprire il documento" ;
    TEXT [ portuguese_brazilian ] = "Não posso abrir o documento." ;
    TEXT [ portuguese ] = "Impossível abrir o documento." ;
    TEXT [ finnish ] = "Asiakirjaa ei voi avata." ;
    TEXT [ danish ] = "Kan ikke åbne dokument." ;
    TEXT [ french ] = "Impossible d'ouvrir le document." ;
    TEXT [ swedish ] = "Kan inte öppna dokumentet." ;
    TEXT [ dutch ] = "Document kan niet worden geopend." ;
    TEXT [ spanish ] = "No es posible abrir el documento." ;
    TEXT [ english_us ] = "Cannot open document." ;
    TEXT[ chinese_simplified ] = "ÎÞ·¨´ò¿ªÕâ¸öÎĵµ¡£";
    TEXT[ russian ] = "Îòêðûòü äîêóìåíò íåâîçìîæíî.";
    TEXT[ polish ] = "Nie mo¿e otworzyæ dokumentu.";
    TEXT[ japanese ] = "ÄÞ·­ÒÝĂðŠJ‚­‚±‚Æ‚ª‚Å‚«‚Ü‚¹‚ñ";
    TEXT[ chinese_traditional ] = "µLªk¶}±Ò³o­Ó¤å¥ó¡C";
    TEXT[ arabic ] = "áÇ íÓÊØíÚ ÝÊÍ ÇáãÓÊäÏ.";
    TEXT[ dutch ] = "Document kan niet worden geopend.";
    TEXT[ chinese_simplified ] = "ÎÞ·¨´ò¿ªÕâ¸öÎĵµ¡£";
    TEXT[ greek ] = "Äåí åßíáé äõíáôüí íá áíïé÷èåß ôï Ýããñáöï.";
    TEXT[ korean ] = "¹®¼­¸¦ ¿­¼ö ¾ø½À´Ï´Ù.";
    TEXT[ turkish ] = "Belge açýlamýyor.";
    TEXT[ language_user1 ] = " ";
};

String STR_CANTCREATE
{
    TEXT = "Das Dokument konnte nicht erzeugt werden." ;
    TEXT [ English ] = "Can't create document." ;
    TEXT[ italian ] = "Impossibile creare un documento";
    TEXT[ portuguese_brazilian ] = "Can't create document.";
    TEXT[ portuguese ] = "Foi impossível criar documento.";
    TEXT[ danish ] = "Det var ikke muligt at oprette dokumentet.";
    TEXT[ french ] = "Impossible de créer le document.";
    TEXT[ swedish ] = "Dokumentet kunde inte skapas.";
    TEXT[ dutch ] = "Het document kon niet worden gemaakt.";
    TEXT[ spanish ] = "El documento no pudo ser creado.";
    TEXT[ english_us ] = "Can't create document.";
    TEXT[ chinese_simplified ] = "ÎÞ·¨Éú³ÉÎĵµ";
    TEXT[ russian ] = "Ýòîò äîêóìåíò ñîçäàòü íåâîçìîæíî.";
    TEXT[ polish ] = "Dokument nie móg³ zostaæ utworzony.";
    TEXT[ japanese ] = "ÄÞ·­ÒÝĂðì¬‚Å‚«‚Ü‚¹‚ñB";
    TEXT[ chinese_traditional ] = "µLªk¥Í¦¨¤å¥ó";
    TEXT[ arabic ] = "ÊÚÐÑ ÅäÔÇÁ ÇáãÓÊäÏ.";
    TEXT[ dutch ] = "Het document kon niet worden gemaakt.";
    TEXT[ chinese_simplified ] = "ÎÞ·¨Éú³ÉÎĵµ";
    TEXT[ greek ] = "Äåí åßíáé äõíáôÞ ç äçìéïõñãßá ôïõ åããñÜöïõ.";
    TEXT[ korean ] = "¹®¼­¸¦ ¸¸µé ¼ö ¾ø½À´Ï´Ù.";
    TEXT[ turkish ] = "Belge oluþturulamadý.";
    TEXT[ language_user1 ] = " ";
};
String STR_DLLNOTFOUND
{
    TEXT = "Filter nicht gefunden." ;
    TEXT [ English ] = "Filter not found." ;
    TEXT [ norwegian ] = "Finner ikke filter." ;
    TEXT [ italian ] = "Filtro non trovato." ;
    TEXT [ portuguese_brazilian ] = "Filtro não encontrado." ;
    TEXT [ portuguese ] = "Filtro não encontrado." ;
    TEXT [ finnish ] = "Suodinta ei löydy." ;
    TEXT [ danish ] = "Filter blev ikke fundet." ;
    TEXT [ french ] = "Filtre introuvable." ;
    TEXT [ swedish ] = "Filter hittades ej." ;
    TEXT [ dutch ] = "Filter niet gevonden." ;
    TEXT [ spanish ] = "No se encontró el filtro." ;
    TEXT [ english_us ] = "Filter not found." ;
    TEXT[ chinese_simplified ] = "ûÓÐÕÒµ½É¸Ñ¡¡£";
    TEXT[ russian ] = "Ôèëüòð íåíàéäåí.";
    TEXT[ polish ] = "Filtru nie znaleziono.";
    TEXT[ japanese ] = "̨ÙÀ‚ªŒ©‚‚©‚è‚Ü‚¹‚ñ";
    TEXT[ chinese_traditional ] = "¨S¦³§ä¨ì¿z¿ï¡C";
    TEXT[ arabic ] = "ÊÚÐÑ ÇáÚ辄 Úáì ÇáÝáÊÑ.";
    TEXT[ dutch ] = "Filter niet gevonden.";
    TEXT[ chinese_simplified ] = "ûÓÐÕÒµ½É¸Ñ¡¡£";
    TEXT[ greek ] = "Äåí âñÝèçêå ôï ößëôñï.";
    TEXT[ korean ] = "ÇÊÅͰ¡ ¹ß°ßµÇÁö ¾Ê½À´Ï´Ù.";
    TEXT[ turkish ] = "Filtre bulunamadý.";
    TEXT[ language_user1 ] = " ";
};


String STR_UNBENANNT
{
    TEXT = "Unbenannt" ;
    TEXT [ English ] = "Untitled" ;
    TEXT [ norwegian ] = "Uten tittel" ;
    TEXT [ italian ] = "Senza nome" ;
    TEXT [ portuguese_brazilian ] = "Sem título" ;
    TEXT [ portuguese ] = "Sem nome" ;
    TEXT [ finnish ] = "Nimetön" ;
    TEXT [ danish ] = "Ikke-navngivet" ;
    TEXT [ french ] = "Sans titre" ;
    TEXT [ swedish ] = "Namnlös" ;
    TEXT [ dutch ] = "Naamloos" ;
    TEXT [ spanish ] = "Sin nombre" ;
    TEXT [ english_us ] = "Untitled" ;
    TEXT[ chinese_simplified ] = "δÃüÃû";
    TEXT[ russian ] = "Áåç èìåíè";
    TEXT[ polish ] = "Bez tytu³u";
    TEXT[ japanese ] = "–³‘è";
    TEXT[ chinese_traditional ] = "¥¼©R¦W";
    TEXT[ arabic ] = "ÈÏæä ÚäæÇä";
    TEXT[ dutch ] = "Naamloos";
    TEXT[ chinese_simplified ] = "δÃüÃû";
    TEXT[ greek ] = "Äß÷ùò üíïìá";
    TEXT[ korean ] = "Á¦¸ñ ¾øÀ½";
    TEXT[ turkish ] = "Adsýz";
    TEXT[ language_user1 ] = " ";
};


String STR_LOAD_GLOBAL_DOC
{
    TEXT = "Name und Pfad des Globaldokuments" ;
    TEXT [ English ] = "Name and path of the global document" ;
    Text [ english_us ] = "Name and Path of Master Document" ;
    Text [ portuguese_brazilian ] = "Name und Pfad des Globaldokuments" ;
    Text [ swedish ] = "Samlingsdokumentets namn och sökväg" ;
    Text [ danish ] = "Hoveddokumentets navn og sti" ;
    Text [ italian ] = "Nome e percorso del documento master" ;
    Text [ spanish ] = "Nombre y ruta del documento maestro" ;
    Text [ french ] = "Nom et chemin du document maître" ;
    Text [ dutch ] = "Naam en pad van het master-document" ;
    Text [ portuguese ] = "Nome e atalho do documento-mestre" ;
    Text[ chinese_simplified ] = "Ö÷¿ØÎĵµµÄÃû³ÆºÍ·¾¶";
    Text[ russian ] = "Èìÿ è ïóòü ãëàâíîãî äîêóìåíòà";
    Text[ polish ] = "Nazwa i œcie¿ka dokumentu g³ównego";
    Text[ japanese ] = "ϽÀ°ÄÞ·­ÒÝĂ̖¼‘O‚ÆÊß½";
    Text[ chinese_traditional ] = "¥D±±¤å¥óªº¦WºÙ©M¸ô®|";
    Text[ arabic ] = "ÇÓã æãÓÇÑ ÇáãÓÊäÏ ÇáÔÇãá";
    Text[ dutch ] = "Naam en pad van het master-document";
    Text[ chinese_simplified ] = "Ö÷¿ØÎĵµµÄÃû³ÆºÍ·¾¶";
    Text[ greek ] = "¼íïìá êáé äéáäñïìÞ ôïõ êõñßïõ åããñÜöïõ";
    Text[ korean ] = "¸¶½ºÅ¸ ¹®¼­ÀÇ À̸§°ú °æ·Î";
    Text[ turkish ] = "Ana belgenin adý ve veri yolu";
    Text[ language_user1 ] = " ";
};

String STR_LOAD_HTML_DOC
{
    TEXT = "Name und Pfad des HTML Dokuments" ;
    TEXT [ English ] = "Name and path of the html document" ;
    Text [ english_us ] = "Name and path of the html document" ;
    Text [ portuguese_brazilian ] = "Name und Pfad des HTML Dokuments" ;
    Text [ swedish ] = "HTML-dokumentets namn och sökväg" ;
    Text [ danish ] = "HTML-dokumentets navn og sti" ;
    Text [ italian ] = "Nome e percorso del documento HTML " ;
    Text [ spanish ] = "Nombre y ruta del documento HTML " ;
    Text [ french ] = "Nom et chemin du document HTML" ;
    Text [ dutch ] = "Naam en pad van het HTML document" ;
    Text [ portuguese ] = "Nome e atalho do documento HTML" ;
    Text[ chinese_simplified ] = "HTML ÎĵµÃû³ÆºÍ·¾¶";
    Text[ russian ] = "Èìÿ è ïóòü äîêóìåíòà HTML";
    Text[ polish ] = "Nazwa i œcie¿ka dokumentu HTML";
    Text[ japanese ] = "HTMLŒ`Ž®ÄÞ·­ÒÝĂ̖¼‘O‚ÆÊß½";
    Text[ chinese_traditional ] = "HTML ¤å¥ó¦WºÙ©M¸ô®|";
    Text[ arabic ] = "ÇÓã æãÓÇÑ ãÓÊäÏ   HTML";
    Text[ dutch ] = "Naam en pad van het HTML document";
    Text[ chinese_simplified ] = "HTML ÎĵµÃû³ÆºÍ·¾¶";
    Text[ greek ] = "¼íïìá êáé äéáäñïìÞ ôïõ åããñÜöïõ HTML";
    Text[ korean ] = "HTML ¸¶½ºÅ¸ ¹®¼­ÀÇ À̸§°ú °æ·Î";
    Text[ turkish ] = "HTML belgesinin adý ve veri yolu";
    Text[ language_user1 ] = " ";
};

InfoBox MSG_ERROR_SEND_MAIL
{
    BUTTONS = WB_OK ;
    DEFBUTTON = WB_DEF_OK ;
    MESSAGE = "Fehler beim Versenden der Nachricht." ;
    MESSAGE [ English ] = "Error while sending mail." ;
    MESSAGE [ norwegian ] = "Feil ved sending av mail." ;
    MESSAGE [ italian ] = "Errore durante l'invio di un messaggio." ;
    MESSAGE [ portuguese_brazilian ] = "Erro ao enviar correio." ;
    MESSAGE [ portuguese ] = "Erro ao enviar correio." ;
    MESSAGE [ finnish ] = "Virhe sähköpostia lähetettäessä." ;
    MESSAGE [ danish ] = "Fejl ved afsendelse af meddelelsen." ;
    MESSAGE [ french ] = "Erreur lors de l'envoi du message." ;
    MESSAGE [ swedish ] = "Fel vid sändning av meddelande." ;
    MESSAGE [ dutch ] = "Fout bij verzenden van bericht." ;
    MESSAGE [ spanish ] = "Error al enviar el mensaje." ;
    MESSAGE [ english_us ] = "Error sending mail." ;
    MESSAGE[ chinese_simplified ] = "Ôڼķ¢µç×ÓÓʼþʱ·¢Éú´íÎó¡£";
    MESSAGE[ language_user1 ] = " ";
    MESSAGE[ russian ] = "Îøèáêà ïðè îòïðàâëåíèè ñîîáùåíèÿ.";
    MESSAGE[ polish ] = "B³¹d przy wysy³aniu wiadomoœci.";
    MESSAGE[ japanese ] = "Ұّ—M‚̍ۂ̴װ";
    MESSAGE[ chinese_traditional ] = "¦b±Hµo¹q¤l¶l¥ó®Éµo¥Í¿ù»~¡C";
    MESSAGE[ arabic ] = "ÎØÃ ÃËäÇÁ ÅÑÓÇá ÇáÑÓÇáÉ.";
    MESSAGE[ dutch ] = "Fout bij verzenden van bericht.";
    MESSAGE[ chinese_simplified ] = "Ôڼķ¢µç×ÓÓʼþʱ·¢Éú´íÎó¡£";
    MESSAGE[ greek ] = "ÓöÜëìá êáôÜ ôçí áðïóôïëÞ ôïõ ìçíýìáôïò.";
    MESSAGE[ korean ] = "¸ÞÀÏ º¸³»±â ¿À·ù.";
    MESSAGE[ turkish ] = "Ýleti gönderilirken hata oluþtu.";
};
InfoBox MSG_ERROR_PASSWD
{
    BUTTONS = WB_OK ;
    DEFBUTTON = WB_DEF_OK ;
    MESSAGE = "Fehlerhaftes Passwort." ;
    MESSAGE [ English ] = "Password doesn't match." ;
    MESSAGE [ norwegian ] = "Passord passer ikke." ;
    MESSAGE [ italian ] = "La password non corrisponde." ;
    MESSAGE [ portuguese_brazilian ] = "A senha não combina." ;
    MESSAGE [ portuguese ] = "A senha não é válida." ;
    MESSAGE [ finnish ] = "Salasana ei kelpaa." ;
    MESSAGE [ danish ] = "Fejagtig adgangskode" ;
    MESSAGE [ french ] = "Mot de passe incorrect." ;
    MESSAGE [ swedish ] = "Felaktigt lösenord." ;
    MESSAGE [ dutch ] = "Wachtwoord niet correct." ;
    MESSAGE [ spanish ] = "Contraseña no válida" ;
    MESSAGE [ english_us ] = "Invalid password." ;
    MESSAGE[ chinese_simplified ] = "´íÎóµÄ¿ÚÁî¡£";
    MESSAGE[ russian ] = "Îøèáêà â ïàðîëå.";
    MESSAGE[ polish ] = "Nieprawid³owe has³o.";
    MESSAGE[ japanese ] = "³‚µ‚­‚È‚¢Ê߽ܰÄÞ";
    MESSAGE[ chinese_traditional ] = "±K½XµL®Ä¡C";
    MESSAGE[ arabic ] = "ßáãÉ ÓÑ ÛíÑ ÕÇáÍÉ.";
    MESSAGE[ dutch ] = "Wachtwoord niet correct.";
    MESSAGE[ chinese_simplified ] = "´íÎóµÄ¿ÚÁî¡£";
    MESSAGE[ greek ] = "ÅóöáëìÝíïò êùäéêüò ðñüóâáóçò.";
    MESSAGE[ korean ] = "À¯È¿ÇÏÁö ¾ÊÀº ÆÐ½º¿öµå";
    MESSAGE[ turkish ] = "Yanlýþ þifre.";
    MESSAGE[ language_user1 ] = " ";
};

/*
 * auskommentiert, da die Toolbox z. Zt. nicht aus der Resource
 * geladen werden kann
Window WIN_TOOLBOX {
HelpText [English] = "";
HelpText [norwegian] = "";
HelpText [italian] = "";
HelpText [portuguese_brazilian] = "";
HelpText [portuguese] = "";
HelpText [finnish] = "";
HelpText [danish] = "";
HelpText [french] = "";
HelpText [swedish] = "";
HelpText [dutch] = "";
HelpText [spanish] = "";
HelpText [english_us] = "";
HelpText = "Die Objektleiste enthält, je nach Bedarf, Buttons für die "
       "Bearbeitung von Text, Rahmen, Grafik, Tabellen oder "
       "Numerierungen.";
HelpText[English] = "The objectbar contains, depending on your current "
            "working context, buttons for the editing of text, "
            "frames, graphics, tables or numberings.";
HelpText[norwegian] = "Objektlinjen inneholder, avhengig av  din aktuelle arbeidssituasjon, "
            "knapper for redigering av tekst,"
            " rammer, grafikker, tabeller eller nummereringer.";
HelpText[italian] = "La barra dell'oggetto attivo contiene, in base al proprio"
            "contesto lavorativo, pulsanti per la modifica del testo,"
            "cornici, grafici, tabelle o numerazioni..";
HelpText[portuguese_brazilian] = "A barra de objetos conter , dependendo do contexto de trabalho "
            "atual, bot es para edição de texto, "
            "molduras, gráficos, tabelas ou numeração.";
HelpText[portuguese] = "A barra de objectos conterá, dependendo do contexto de trabalho "
            "actual, botões para edição de texto, "
            "molduras, gráficos, tabelas ou numeração.";
HelpText[finnish] = "Toimintorivillä on tilanteen mukaan painikkeita, "
            "joilla muokataan tekstiä, kehyksiä, kuvia, "
            "taulukoita tai numeronteja.";
HelpText[danish] = "Afhængig af din aktuelle arbejdskontekst"
            " rummer ikonbåndet knapper for redigering af tekst, "
            "tekstruder, grafik, tabeller eller nummereringer.";
HelpText[french] = "Selon votre contexte de travail, la barre d'objets "
            "contient des boutons de modification du texte, des "
            "cadres, des graphiques, des tables ou des numérotations.";
HelpText[swedish] = "Objektlisten innehåller, beroende på aktuellt"
            "arbetsområde, knappar för redigering av text,"
            "ramar, bilder, tabeller eller numreringar.";
HelpText[dutch] = "Afhankelijk van de huidige werkomgeving bevat de objectbalk "
            "knoppen voor het bewerken van tekst, kaders, illustraties "
            "of nummeringen.";
HelpText[spanish] = "La barra de objetos contiene, dependiendo del contexto "
            "de trabajo actual, botones para la edición de texto, "
            "marcos, gráficos, tablas o numeraciones.";
HelpText[english_us] = "The objectbar contains, depending on your current "
            "working context, buttons for the editing of text, "
            "frames, graphics, tables or numberings.";
    OUTPUTSIZE = TRUE;
    BORDER = TRUE;
    Size = (28,27);
};
 */



















String RID_BUILDVERSION
{
    TEXT = UPDVER ;
};


String STR_FMT_STD
{
    TEXT = "(keins)" ;
    TEXT [ English ] = "(none)" ;
    TEXT [ norwegian ] = "(ingen)" ;
    TEXT [ italian ] = "(senza)" ;
    TEXT [ portuguese_brazilian ] = "(nenhum)" ;
    TEXT [ portuguese ] = "(nenhum)" ;
    TEXT [ finnish ] = "(ei mitään)" ;
    TEXT [ danish ] = "(ingen)" ;
    TEXT [ french ] = "(aucun(e))" ;
    TEXT [ swedish ] = "(ingen)" ;
    TEXT [ dutch ] = "(geen)" ;
    TEXT [ spanish ] = "(ninguna)" ;
    TEXT [ english_us ] = "(none)" ;
    TEXT[ chinese_simplified ] = "(ÎÞ)";
    TEXT[ russian ] = "(áåç)";
    TEXT[ polish ] = "(brak)";
    TEXT[ japanese ] = "(‚È‚µ)";
    TEXT[ chinese_traditional ] = "(µL)";
    TEXT[ arabic ] = "(ÈÏæä)";
    TEXT[ dutch ] = "(geen)";
    TEXT[ chinese_simplified ] = "(ÎÞ)";
    TEXT[ greek ] = "(êáíÝíá)";
    TEXT[ korean ] = "(¾øÀ½)";
    TEXT[ turkish ] = "(yok)";
    TEXT[ language_user1 ] = " ";
};

String STR_DOC_STAT
{
    TEXT = "Statistik" ;
    TEXT [ English ] = "Statistics" ;
    TEXT [ norwegian ] = "Statistics" ;
    TEXT [ italian ] = "Statistiche" ;
    TEXT [ portuguese_brazilian ] = "Estatística" ;
    TEXT [ portuguese ] = "Estatística" ;
    TEXT [ finnish ] = "Tilasto" ;
    TEXT [ danish ] = "Statistik" ;
    TEXT [ french ] = "Statistique" ;
    TEXT [ swedish ] = "Statistik" ;
    TEXT [ dutch ] = "Statistiek" ;
    TEXT [ spanish ] = "Estadística" ;
    TEXT [ english_us ] = "Statistics" ;
    TEXT[ chinese_simplified ] = "ͳ¼Æ";
    TEXT[ russian ] = "Ñòàòèñòèêà";
    TEXT[ polish ] = "Statystyka";
    TEXT[ japanese ] = "“Œv";
    TEXT[ chinese_traditional ] = "²Î­p";
    TEXT[ arabic ] = "ÅÍÕÇÆíÇÊ";
    TEXT[ dutch ] = "Statistiek";
    TEXT[ chinese_simplified ] = "ͳ¼Æ";
    TEXT[ greek ] = "ÓôáôéóôéêÜ";
    TEXT[ korean ] = "Åë°è";
    TEXT[ turkish ] = "Ýstatistik";
    TEXT[ language_user1 ] = " ";
};

 // ----------------------------
 // Statusleisten-Ueberschriften
 // ----------------------------

String STR_STATSTR_W4WREAD
{
    Text = "Dokument wird importiert..." ;
    Text [ English ] = "Importing..." ;
    Text [ norwegian ] = "Importerer..." ;
    Text [ italian ] = "Il documento viene importato..." ;
    Text [ portuguese_brazilian ] = "Importando..." ;
    Text [ portuguese ] = "A importar documento..." ;
    Text [ finnish ] = "Tuonti..." ;
    Text [ danish ] = "Importerer dokument..." ;
    Text [ french ] = "Import du document en cours..." ;
    Text [ swedish ] = "Dokument importeras..." ;
    Text [ dutch ] = "Document wordt geïmporteerd..." ;
    Text [ spanish ] = "Importando el documento..." ;
    Text [ english_us ] = "Importing document..." ;
    Text[ chinese_simplified ] = "ÊäÈëÎĵµ...";
    Text[ russian ] = "Èìïîðò äîêóìåíòà...";
    Text[ polish ] = "Importowanie dokumentu...";
    Text[ japanese ] = "•¶‘‚̲ÝÎß°Ä...";
    Text[ chinese_traditional ] = "¿é¤J¤å¥ó...";
    Text[ arabic ] = "ÌÇÑí ÇÓÊíÑÇÏ ÇáãÓÊäÏ...";
    Text[ dutch ] = "Document wordt geïmporteerd...";
    Text[ chinese_simplified ] = "ÊäÈëÎĵµ...";
    Text[ greek ] = "ÅéóáãùãÞ åããñÜöïõ...";
    Text[ korean ] = "¹®¼­ °¡Á®¿À±â...";
    Text[ turkish ] = "Belge içe aktarýlýyor...";
    Text[ language_user1 ] = " ";
};

String STR_STATSTR_W4WWRITE
{
    Text = "Dokument wird exportiert..." ;
    Text [ English ] = "Exporting..." ;
    Text [ norwegian ] = "Eksporterer..." ;
    Text [ italian ] = "Il documento viene esportato..." ;
    Text [ portuguese_brazilian ] = "Exportando..." ;
    Text [ portuguese ] = "A exportar documento..." ;
    Text [ finnish ] = "Vienti..." ;
    Text [ danish ] = "Eksporterer dokument" ;
    Text [ french ] = "Export du document en cours..." ;
    Text [ swedish ] = "Dokument exporteras..." ;
    Text [ dutch ] = "Document wordt geëxporteerd..." ;
    Text [ spanish ] = "Exportando el documento..." ;
    Text [ english_us ] = "Exporting document..." ;
    Text[ chinese_simplified ] = "Êä³öÎĵµ...";
    Text[ russian ] = "Ýêñïîðò äîêóìåíòà...";
    Text[ polish ] = "Eksportowanie dokumentu...";
    Text[ japanese ] = "•¶‘‚Ì´¸½Îß°Ä...";
    Text[ chinese_traditional ] = "¿é¥X¤å¥ó...";
    Text[ arabic ] = "ÌÇÑí ÊÕÏíÑ ÇáãÓÊäÏ...";
    Text[ dutch ] = "Document wordt geëxporteerd...";
    Text[ chinese_simplified ] = "Êä³öÎĵµ...";
    Text[ greek ] = "ÅîáãùãÞ åããñÜöïõ...";
    Text[ korean ] = "¹®¼­ º¸³»±â...";
    Text[ turkish ] = "Belge dýþa aktarýlýyor...";
    Text[ language_user1 ] = " ";
};

String STR_STATSTR_SWGREAD
{
    Text = "Dokument wird geladen..." ;
    Text [ English ] = "Loading..." ;
    Text [ norwegian ] = "Laster inn..." ;
    Text [ italian ] = "Il documento viene caricato..." ;
    Text [ portuguese_brazilian ] = "Carregando..." ;
    Text [ portuguese ] = "A carregar documento..." ;
    Text [ finnish ] = "Lataus..." ;
    Text [ danish ] = "Indlæser dokument..." ;
    Text [ french ] = "Document en cours de chargement..." ;
    Text [ swedish ] = "Dokument laddas..." ;
    Text [ dutch ] = "Document wordt gemaakt..." ;
    Text [ spanish ] = "Cargando el documento..." ;
    Text [ english_us ] = "Loading document..." ;
    Text[ chinese_simplified ] = "×°ÔØÎĵµ...";
    Text[ language_user1 ] = " ";
    Text[ russian ] = "Äîêóìåíò çàãðóæàåòñÿ...";
    Text[ polish ] = "£adowanie dokumentu...";
    Text[ japanese ] = "•¶‘‚̓ǂݍž‚Ý...";
    Text[ chinese_traditional ] = "¸Ë¸ü¤å¥ó...";
    Text[ arabic ] = "ÌÇÑí ÊÍãíá ÇáãÓÊäÏ...";
    Text[ dutch ] = "Document wordt gemaakt...";
    Text[ chinese_simplified ] = "×°ÔØÎĵµ...";
    Text[ greek ] = "Ôï Ýããñáöï öïñôþíåôáé...";
    Text[ korean ] = "¹®¼­ ·Îµù...";
    Text[ turkish ] = "Belge yükleniyor...";
};

String STR_STATSTR_SWGWRITE
{
    Text = "Dokument wird gespeichert..." ;
    Text [ English ] = "Saving..." ;
    Text [ norwegian ] = "Lagrer..." ;
    Text [ italian ] = "Il documento viene salvato..." ;
    Text [ portuguese_brazilian ] = "Gravando..." ;
    Text [ portuguese ] = "A guardar documento..." ;
    Text [ finnish ] = "Tallennus..." ;
    Text [ danish ] = "Gemmer dokument..." ;
    Text [ french ] = "Enreg. du document en cours..." ;
    Text [ swedish ] = "Dokument sparas..." ;
    Text [ dutch ] = "Document wordt opgeslagen..." ;
    Text [ spanish ] = "Guardando el documento..." ;
    Text [ english_us ] = "Saving document..." ;
    Text = "Dokument wird gespeichert..." ;
    Text[ chinese_simplified ] = "´æÅÌÎĵµ...";
    Text[ russian ] = "Äîêóìåíò ñîõðàíÿåòñÿ...";
    Text[ polish ] = "Zapisywanie dokumentu...";
    Text[ japanese ] = "•¶‘‚̕ۑ¶...";
    Text[ chinese_traditional ] = "¥¿¦bÀx¦s¤å¥ó...";
    Text[ arabic ] = "ÌÇÑí ÍÝÙ ÇáãÓÊäÏ...";
    Text[ dutch ] = "Document wordt opgeslagen...";
    Text[ chinese_simplified ] = "´æÅÌÎĵµ...";
    Text[ greek ] = "ÁðïèÞêåõóç åããñÜöïõ...";
    Text[ korean ] = "¹®¼­ ÀúÀå...";
    Text[ turkish ] = "Belge kaydediliyor...";
    Text[ language_user1 ] = " ";
};

String STR_STATSTR_REFORMAT
{
    TEXT = "Neuformatierung des Dokumentes..." ;
    TEXT [ English ] = "Repaginating..." ;
    TEXT [ norwegian ] = "Gjør sidenummerering på nyttRepaginating..." ;
    TEXT [ italian ] = "Riformattazione del documento..." ;
    TEXT [ portuguese_brazilian ] = "Repaginando..." ;
    TEXT [ portuguese ] = "Nova formatação do documento..." ;
    TEXT [ finnish ] = "Sivutus..." ;
    TEXT [ danish ] = "Genformatering af dokumentet..." ;
    TEXT [ french ] = "Repagination du document..." ;
    TEXT [ swedish ] = "Omformatering av dokumentet..." ;
    TEXT [ dutch ] = "Bezig met nieuwe opmaak..." ;
    TEXT [ spanish ] = "Reformateado del documento..." ;
    TEXT [ english_us ] = "Repagination..." ;
    TEXT[ chinese_simplified ] = "ÖØÐÂÖÆ×÷Îĵµ¸ñʽ...";
    TEXT[ language_user1 ] = " ";
    TEXT[ russian ] = "Íîâîå ôîðìàòèðîâàíèå äîêóìåíòà...";
    TEXT[ polish ] = "Ponowne formatowanie dokumentu...";
    TEXT[ japanese ] = "ÄÞ·­ÒÝĂ̐V‹K‘Ž®Ý’è...";
    TEXT[ chinese_traditional ] = "­«·s¨î§@¤å¥ó®æ¦¡...";
    TEXT[ arabic ] = "ÅÚÇÏÉ ÊäÓíÞ ÇáãÓÊäÏ...";
    TEXT[ dutch ] = "Bezig met nieuwe opmaak...";
    TEXT[ chinese_simplified ] = "ÖØÐÂÖÆ×÷Îĵµ¸ñʽ...";
    TEXT[ greek ] = "Ìïñöïðïßçóç åê íÝïõ ôïõ åããñÜöïõ...";
    TEXT[ korean ] = "ÆäÀÌÁö ¸Å±â±â...";
    TEXT[ turkish ] = "Belge yeniden formatlanýyor...";
};

String STR_STATSTR_AUTOFORMAT
{
    TEXT = "Autoformatierung des Dokumentes..." ;
    TEXT [ English ] = "Autoformatting..." ;
    TEXT [ norwegian ] = "Autoformaterer..." ;
    TEXT [ italian ] = "Formattazione automatica..." ;
    TEXT [ portuguese_brazilian ] = "Formatação automática..." ;
    TEXT [ portuguese ] = "A formatar documento automaticamente..." ;
    TEXT [ finnish ] = "Automaattimuotoilu..." ;
    TEXT [ danish ] = "Autoformatering af dokumentet..." ;
    TEXT [ french ] = "Mise en forme automatique du document..." ;
    TEXT [ swedish ] = "Autoformatering av dokumentet..." ;
    TEXT [ dutch ] = "Bezig met automatisch opmaken..." ;
    TEXT [ spanish ] = "AutoFormato del documento..." ;
    TEXT [ english_us ] = "Formatting document automatically..." ;
    TEXT[ chinese_simplified ] = "Îĵµ×Ô¶¯¸ñʽ»¯...";
    TEXT[ language_user1 ] = " ";
    TEXT[ russian ] = "Àâòîôîðìàòèðîâàíèå äîêóìåíòà...";
    TEXT[ polish ] = "Autoformatowanie dokumentu";
    TEXT[ japanese ] = "ÄÞ·­ÒÝĂ̵°ÄÌ«°Ï¯Ä...";
    TEXT[ chinese_traditional ] = "ª«¥ó¦Û°Ê®æ¦¡¤Æ...";
    TEXT[ arabic ] = "ÊäÓíÞ ÊáÞÇÆí ááãÓÊäÏ...";
    TEXT[ dutch ] = "Bezig met automatisch opmaken...";
    TEXT[ chinese_simplified ] = "Îĵµ×Ô¶¯¸ñʽ»¯...";
    TEXT[ greek ] = "Áõôüìáôç ìïñöïðïßçóç ôïõ åããñÜöïõ...";
    TEXT[ korean ] = "ÀÚµ¿ ¹®¼­ ¼­½Ä ¼³Á¤...";
    TEXT[ turkish ] = "Otomatik belge formatlama...";
};

String STR_STATSTR_IMPGRF
{
    Text = "Grafik wird importiert..." ;
    Text [ English ] = "Importing picture..." ;
    Text [ norwegian ] = "Importerer bilde..." ;
    Text [ italian ] = "L'immagine viene importata..." ;
    Text [ portuguese_brazilian ] = "Importando figura..." ;
    Text [ portuguese ] = "A importar imagem..." ;
    Text [ finnish ] = "Kuvan tuonti..." ;
    Text [ danish ] = "Importerer billede..." ;
    Text [ french ] = "Import de l'image en cours..." ;
    Text [ swedish ] = "Grafik importeras..." ;
    Text [ dutch ] = "Afbeelding wordt geïmporteerd..." ;
    Text [ spanish ] = "Importando imagen..." ;
    Text [ english_us ] = "Importing graphics..." ;
    Text[ chinese_simplified ] = "ÊäÈëͼÐÎ...";
    Text[ russian ] = "Èìïîðò ãðàôèêè...";
    Text[ polish ] = "Importowanie grafiki...";
    Text[ japanese ] = "}‚̲ÝÎ߰dž...";
    Text[ chinese_traditional ] = "¿é¤J¹Ï¤ù...";
    Text[ arabic ] = "ÌÇÑí ÇÓÊíÑÇÏ ÇáÑÓã...";
    Text[ dutch ] = "Afbeelding wordt geïmporteerd...";
    Text[ chinese_simplified ] = "ÊäÈëͼÐÎ...";
    Text[ greek ] = "ÅéóáãùãÞ ãñáöéêïý...";
    Text[ korean ] = "±×·¡ÇÈ °¡Á®¿À±â...";
    Text[ turkish ] = "Grafik içe aktarýlýyor...";
    Text[ language_user1 ] = " ";
};

String STR_STATSTR_SEARCH
{
    Text = "Suche..." ;
    Text [ English ] = "search..." ;
    Text [ norwegian ] = "Søker..." ;
    Text [ italian ] = "Cerca..." ;
    Text [ portuguese_brazilian ] = "buscar..." ;
    Text [ portuguese ] = "A localizar..." ;
    Text [ finnish ] = "Etsintä..." ;
    Text [ danish ] = "Søger..." ;
    Text [ french ] = "Recherche..." ;
    Text [ swedish ] = "Söker..." ;
    Text [ dutch ] = "Bezig met zoeken..." ;
    Text [ spanish ] = "Búsqueda..." ;
    Text [ english_us ] = "Search..." ;
    Text[ chinese_simplified ] = "ËÑѰ...";
    Text[ language_user1 ] = " ";
    Text[ russian ] = "Ïîèñê...";
    Text[ polish ] = "Szukaj...";
    Text[ japanese ] = "ŒŸõ...";
    Text[ chinese_traditional ] = "´M§ä...";
    Text[ arabic ] = "ÈÍË...";
    Text[ dutch ] = "Bezig met zoeken...";
    Text[ chinese_simplified ] = "ËÑѰ...";
    Text[ greek ] = "ÁíáæÞôçóç...";
    Text[ korean ] = "ã±â...";
    Text[ turkish ] = "Ara...";
};

String STR_STATSTR_FORMAT
{
    Text = "Formatiere..." ;
    Text [ English ] = "Formatting..." ;
    Text [ norwegian ] = "Formaterer..." ;
    Text [ italian ] = "Formattazione..." ;
    Text [ portuguese_brazilian ] = "Formatando..." ;
    Text [ portuguese ] = "A formatar..." ;
    Text [ finnish ] = "Muotoilu..." ;
    Text [ danish ] = "Formaterer..." ;
    Text [ french ] = "Formatage..." ;
    Text [ swedish ] = "Formaterar..." ;
    Text [ dutch ] = "Bezig met opmaken..." ;
    Text [ spanish ] = "Formateando..." ;
    Text [ english_us ] = "Formatting..." ;
    Text[ chinese_simplified ] = "¸ñʽ»¯...";
    Text[ language_user1 ] = " ";
    Text[ russian ] = "Ôîðìàò...";
    Text[ polish ] = "Formatuj";
    Text[ japanese ] = "‘Ž®Ý’è...";
    Text[ chinese_traditional ] = "®æ¦¡¤Æ...";
    Text[ arabic ] = "ÊäÓíÞ...";
    Text[ dutch ] = "Bezig met opmaken...";
    Text[ chinese_simplified ] = "¸ñʽ»¯...";
    Text[ greek ] = "Ìïñöïðïßçóç...";
    Text[ korean ] = "¼­½Ä ¼³Á¤...";
    Text[ turkish ] = "Formatlanýyor...";
};

String STR_STATSTR_PRINT
{
    Text = "Drucke..." ;
    Text [ English ] = "Printing..." ;
    Text [ norwegian ] = "Skriver ut..." ;
    Text [ italian ] = "Stampa..." ;
    Text [ portuguese_brazilian ] = "Imprimindo..." ;
    Text [ portuguese ] = "A imprimir..." ;
    Text [ finnish ] = "Tulostus..." ;
    Text [ danish ] = "Udskriver..." ;
    Text [ french ] = "Impression..." ;
    Text [ swedish ] = "Skriver ut ..." ;
    Text [ dutch ] = "Bezig met afdrukken..." ;
    Text [ spanish ] = "Imprimiendo..." ;
    Text [ english_us ] = "Printing..." ;
    Text[ chinese_simplified ] = "´òÓ¡...";
    Text[ russian ] = "Ïå÷àòü...";
    Text[ polish ] = "Drukuj...";
    Text[ japanese ] = "ˆóü...";
    Text[ chinese_traditional ] = "¦C¦L...";
    Text[ arabic ] = "ØÈÇÚÉ...";
    Text[ dutch ] = "Bezig met afdrukken...";
    Text[ chinese_simplified ] = "´òÓ¡...";
    Text[ greek ] = "Åêôýðùóç...";
    Text[ korean ] = "Àμâ...";
    Text[ turkish ] = "Yazdýrýlýyor...";
    Text[ language_user1 ] = " ";
};

String STR_STATSTR_LAYOUTINIT
{
    Text = "Konvertiere..." ;
    Text [ English ] = "Converting..." ;
    Text [ norwegian ] = "Konverterer..." ;
    Text [ italian ] = "Converti..." ;
    Text [ portuguese_brazilian ] = "Convertendo..." ;
    Text [ portuguese ] = "A converter..." ;
    Text [ finnish ] = "Muunto..." ;
    Text [ danish ] = "Konverterer..." ;
    Text [ french ] = "Conversion..." ;
    Text [ swedish ] = "Konverterar..." ;
    Text [ dutch ] = "Bezig met converteren..." ;
    Text [ spanish ] = "Convirtiendo..." ;
    Text [ english_us ] = "Converting..." ;
    Text[ chinese_simplified ] = "ת»»...";
    Text[ russian ] = "Ïðåîáðàçîâàíèå...";
    Text[ polish ] = "Konwertuj...";
    Text[ japanese ] = "•ÏŠ·...";
    Text[ chinese_traditional ] = "Âà´«...";
    Text[ arabic ] = "ÊÍæíá...";
    Text[ dutch ] = "Bezig met converteren...";
    Text[ chinese_simplified ] = "ת»»...";
    Text[ greek ] = "ÌåôáôñïðÞ...";
    Text[ korean ] = "º¯È¯...";
    Text[ turkish ] = "Dönüþtürülüyor...";
    Text[ language_user1 ] = " ";
};

String STR_STATSTR_LETTER
{
    Text = "Brief" ;
    Text [ English ] = "Letter" ;
    Text [ english_us ] = "Letter" ;
    Text [ italian ] = "Lettera" ;
    Text [ spanish ] = "Carta" ;
    Text [ french ] = "Lettre" ;
    Text [ dutch ] = "Brief" ;
    Text [ swedish ] = "Brev" ;
    Text [ danish ] = "Brev" ;
    Text [ portuguese_brazilian ] = "Brief" ;
    Text [ portuguese ] = "Carta" ;
    Text[ chinese_simplified ] = "Ðź¯";
    Text[ russian ] = "Ïèñüìî";
    Text[ polish ] = "List";
    Text[ japanese ] = "ÚÀ°";
    Text[ chinese_traditional ] = "«H¨ç";
    Text[ arabic ] = "ÎØÇÈ";
    Text[ dutch ] = "Brief";
    Text[ chinese_simplified ] = "Ðź¯";
    Text[ greek ] = "ÅðéóôïëÞ";
    Text[ korean ] = "ÆíÁö";
    Text[ turkish ] = "Mektup";
    Text[ language_user1 ] = " ";
};

String STR_STATSTR_SPELL
{
    Text = "Rechtschreibprüfung..." ;
    Text [ English ] = "Spelling..." ;
    Text [ english_us ] = "Spellcheck..." ;
    Text [ italian ] = "Controllo ortografico..." ;
    Text [ spanish ] = "Revisión ortográfica..." ;
    Text [ french ] = "Orthographe..." ;
    Text [ dutch ] = "Bezig met spellingcontrole..." ;
    Text [ swedish ] = "Rättstavningskontroll..." ;
    Text [ danish ] = "Stavekontrol..." ;
    Text [ portuguese_brazilian ] = "Rechtschreibprüfung..." ;
    Text [ portuguese ] = "Verificação ortográfica..." ;
    Text[ chinese_simplified ] = "Õý×Ö·¨¼ì²é...";
    Text[ russian ] = "Ïðîâåðêà îðôîãðàôèè...";
    Text[ polish ] = "Sprawdzanie pisowni...";
    Text[ japanese ] = "•¶ÍZ³...";
    Text[ chinese_traditional ] = "«÷¦r...";
    Text[ arabic ] = "ÊÏÞíÞ ÅãáÇÆí...";
    Text[ dutch ] = "Bezig met spellingcontrole...";
    Text[ chinese_simplified ] = "Õý×Ö·¨¼ì²é...";
    Text[ greek ] = "¸ëåã÷ïò ïñèïãñáößáò...";
    Text[ korean ] = "¸ÂÃã¹ý °Ë»ç...";
    Text[ turkish ] = "Yazým denetimi...";
    Text[ language_user1 ] = " ";
};

String STR_STATSTR_HYPHEN
{
    Text = "Silbentrennung..." ;
    Text [ English ] = "Hyphenating..." ;
    Text [ english_us ] = "Hyphenation..." ;
    Text [ dutch ] = "Woordafbreking..." ;
    Text [ italian ] = "Sillabazione..." ;
    Text [ spanish ] = "Separación silábica..." ;
    Text [ french ] = "Coupure de mots..." ;
    Text [ swedish ] = "Avstavning..." ;
    Text [ danish ] = "Orddeling..." ;
    Text [ portuguese_brazilian ] = "Silbentrennung..." ;
    Text [ portuguese ] = "Divisão silábica..." ;
    Text[ chinese_simplified ] = "Á¬×Ö·û...";
    Text[ russian ] = "Ðàññòàíîâêà ïåðåíîñîâ...";
    Text[ polish ] = "Dzielenie wyrazów";
    Text[ japanese ] = "ʲÌȰ¼®Ý...";
    Text[ chinese_traditional ] = "³s±µ²Å...";
    Text[ arabic ] = "ÝÕá ÇáãÞÇØÚ...";
    Text[ dutch ] = "Woordafbreking...";
    Text[ chinese_simplified ] = "Á¬×Ö·û...";
    Text[ greek ] = "Óõëëáâéóìüò...";
    Text[ korean ] = "ÇÏÀÌÇÂ ...";
    Text[ turkish ] = "Heceleme...";
    Text[ language_user1 ] = " ";
};

String STR_STATSTR_TOX_INSERT
{
    Text = "Verzeichnis wird eingefügt..." ;
    Text [ English ] = "Inserting Index..." ;
    Text [ english_us ] = "Inserting Index..." ;
    Text [ italian ] = "L'indice viene inserito..." ;
    Text [ spanish ] = "Insertando directorio..." ;
    Text [ french ] = "Index en cours d'insertion..." ;
    Text [ dutch ] = "Index wordt ingevoegd..." ;
    Text [ swedish ] = "Förteckning infogas..." ;
    Text [ danish ] = "Indsætter indeks..." ;
    Text [ portuguese_brazilian ] = "Verzeichnis wird eingefügt..." ;
    Text [ portuguese ] = "Inserindo índice..." ;
    Text[ chinese_simplified ] = "²åÈëË÷Òý...";
    Text[ language_user1 ] = " ";
    Text[ russian ] = "Âñòàâêà óêàçàòåëÿ...";
    Text[ polish ] = "Wstawianie indeksu...";
    Text[ japanese ] = "õˆø‚Ì‘}“ü...";
    Text[ chinese_traditional ] = "´¡¤J¥Ø¿ý...";
    Text[ arabic ] = "ÌÇÑí ÅÏÑÇÌ ÇáÝåÑÓ...";
    Text[ dutch ] = "Index wordt ingevoegd...";
    Text[ chinese_simplified ] = "²åÈëË÷Òý...";
    Text[ greek ] = "ÅéóáãùãÞ êáôáëüãïõ...";
    Text[ korean ] = "»öÀÎ »ðÀÔ...";
    Text[ turkish ] = "Dizin ekleniyor...";
};

String STR_STATSTR_TOX_UPDATE
{
    Text = "Verzeichnis wird aktualisiert..." ;
    Text [ English ] = "Updating Index..." ;
    Text [ english_us ] = "Updating Index..." ;
    Text [ italian ] = "L'indice viene aggiornato..." ;
    Text [ spanish ] = "Actualizando directorio..." ;
    Text [ french ] = "Index en cours d'actualisation..." ;
    Text [ dutch ] = "Index wordt geactualiseerd..." ;
    Text [ swedish ] = "Förteckning uppdateras..." ;
    Text [ danish ] = "Opdaterer indeks..." ;
    Text [ portuguese_brazilian ] = "Verzeichnis wird aktualisiert..." ;
    Text [ portuguese ] = "Actualizando índice..." ;
    Text[ chinese_simplified ] = "¸üÐÂË÷Òý...";
    Text[ language_user1 ] = " ";
    Text[ russian ] = "Îáíîâëåíèå óêàçàòåëÿ...";
    Text[ polish ] = "Aktualizacja indeksu...";
    Text[ japanese ] = "õˆø‚̍XV...";
    Text[ chinese_traditional ] = "§ó·s¥Ø¿ý...";
    Text[ arabic ] = "ÌÇÑí ÊÍÏíË ÇáÝåÑÓ...";
    Text[ dutch ] = "Index wordt geactualiseerd...";
    Text[ chinese_simplified ] = "¸üÐÂË÷Òý...";
    Text[ greek ] = "ÅíçìÝñùóç êáôáëüãïõ...";
    Text[ korean ] = "»öÀÎ ¾÷ µ¥ÀÌÆ®...";
    Text[ turkish ] = "Dizin güncelleniyor...";
};

String STR_STATSTR_SUMMARY
{
    Text = "Abstrakt wird erstellt..." ;
    Text [ English ] = "Creating summary..." ;
    Text [ english_us ] = "Creating abstract..." ;
    Text [ portuguese_brazilian ] = "Abstrakt wird erstellt..." ;
    Text [ swedish ] = "Utdrag skapas..." ;
    Text [ danish ] = "Opretter abstract..." ;
    Text [ italian ] = "Il sunto viene creato..." ;
    Text [ spanish ] = "Creando el extracto..." ;
    Text [ french ] = "Synthèse en cours de création..." ;
    Text [ dutch ] = "Overzicht wordt gemaakt..." ;
    Text [ portuguese ] = "A criar Sumário..." ;
    Text[ chinese_simplified ] = "ÖÆ×÷ÕªÒª...";
    Text[ language_user1 ] = " ";
    Text[ russian ] = "Èäåò ñîçäàíèå ïðîñìîòðà äîêóìåíòà...";
    Text[ polish ] = "Tworzenie Abstraktu...";
    Text[ japanese ] = "—v–ñ‚̍쐬...";
    Text[ chinese_traditional ] = "»s§@ºK­n...";
    Text[ arabic ] = "ÌÇÑí ÅäÔÇÁ ÇáÊáÎíÕ...";
    Text[ dutch ] = "Overzicht wordt gemaakt...";
    Text[ chinese_simplified ] = "ÖÆ×÷ÕªÒª...";
    Text[ greek ] = "Äçìéïõñãßá abstract...";
    Text[ korean ] = "¿ä¾à ¸¸µé±â...";
    Text[ turkish ] = "Özet oluþturuluyor...";
};

String STR_STATSTR_SWGPRTOLENOTIFY
{
    Text = "Objekte Anpassen..." ;
    Text [ English ] = "Adjust Objects..." ;
    Text[ english_us ] = "Adapt Objects...";
    Text[ portuguese ] = "Ajustar objectos...";
    Text[ russian ] = "Âûðîâíÿòü îáúåêòû...";
    Text[ dutch ] = "Objecten aanpassen...";
    Text[ french ] = "Adapter les objets...";
    Text[ spanish ] = "Ajustar objetos...";
    Text[ italian ] = "Adatta oggetti...";
    Text[ danish ] = "Tilpas objekter...";
    Text[ swedish ] = "Anpassa objekt...";
    Text[ polish ] = "Dopasuj obiekty...";
    Text[ portuguese_brazilian ] = "Adjust Objects...";
    Text[ japanese ] = "µÌÞ¼Þª¸Ä‚Ì’²®...";
    Text[ chinese_simplified ] = "µ÷Õû¶ÔÏó...";
    Text[ chinese_traditional ] = "½Õ¾ãª«¥ó...";
    Text[ arabic ] = "ÖÈØ ßÇÆäÇÊ...";
    Text[ dutch ] = "Objecten aanpassen...";
    Text[ chinese_simplified ] = "µ÷Õû¶ÔÏó...";
    Text[ greek ] = "ÐñïóáñìïãÞ áíôéêåéìÝíùí...";
    Text[ korean ] = "°³Ã¼ Á¶Á¤...";
    Text[ turkish ] = "Nesneleri uyarla...";
    Text[ language_user1 ] = " ";
};


QueryBox MSG_COMCORE_ASKSEARCH
{
    Buttons = WB_YES_NO_CANCEL ;
    DefButton = WB_DEF_YES ;
    Message = "Diese Aktion benötigt fürs Undo sehr viel Speicher.\nWollen Sie das Undo abschalten?" ;
    Message [ English ] = "This action needs for undo many memory.\nWould you disable undo?" ;
    Message [ norwegian ] = "Hvis du vil angre denne handlingen trenger du mye minne.\nVil du sperre angrefunksjonen?" ;
    Message [ italian ] = "L'annullamento di questa azione occorre molta memoria.\nVolete disattivare la possibilità di annullare?" ;
    Message [ portuguese_brazilian ] = "Esta ação requer muita memória para desfazer.\nDeseja desativar a função desfazer?" ;
    Message [ portuguese ] = "Para poder anular esta acção é necessária muita memória.\nDeseja cancelar esta função?" ;
    Message [ finnish ] = "Tämän toiminnon kumoamiseen tarvitaan paljon muistia.\nPoistetaanko kumoamismahdollisuus käytöstä?" ;
    Message [ danish ] = "Denne handling kræver megen hukommelse til fortryd-funktionen\nVil du slå fortryd-funktionen fra?" ;
    Message [ french ] = "Cette action nécessite beaucoup de mémoire pour l'annulation (Undo).\nVoulez-vous désactiver l'annulation ?" ;
    Message [ swedish ] = "Denna åtgärd kräver alltför mycket minne för Ångra-funktionen.\nVill Du stänga av Ångra-funktionen?" ;
    Message [ dutch ] = "Het ongedaan maken van deze bewerking beslaat veel geheugen.\nWilt U \"Ongedaan maken\" opheffen ?" ;
    Message [ spanish ] = "Esta acción necesita mucha memoria para la operación de Deshacer.\n¿Desea desactivar la opción de deshacer?" ;
    Message [ english_us ] = "A large amount of memory is required to undo this action.\nDo you want to cancel the undo?" ;
    Message[ chinese_simplified ] = "³·ÏûÃüÁÄÜÐèÒªºÜ¶àµÄÄÚ´æ¡£\nÄúҪʧ»î³·ÏûÃüÁÄÜÂð£¿";
    Message[ russian ] = "Ýòîìó äåéñòâèþ íåîáõîäèìî äëÿ îòìåíû ñëèøêîì ìíîãî ïàìÿòè.\nÂû õîòèòå îòêëþ÷èòü îòìåíó?";
    Message[ polish ] = "Cofniêcie tej akcji wymaga du¿ej iloœci pamiêci.\nCzy chcesz przerwaæ cofniêcie?";
    Message[ japanese ] = "‚±‚Ìì‹Æ‚ͤŒ³‚É–ß‚·‚½‚߂ɔñí‚É‘½‚­‚ÌÒÓØ‚ª•K—v‚Å‚·B\nŒ³‚É–ß‚·‚±‚Æ‚ðŽæ‚è‚â‚߂܂·‚©?";
    Message[ chinese_traditional ] = "´_­ì¥\\¯à»Ý­n«Ü¦hªº°O¾ÐÅé¡C\n±z­n¥¢¬¡´_­ì¥\\¯à¡H";
    Message[ arabic ] = "ÇáÊÑÇÌÚ Úä åÐÇ ÇáÅÌÑÇÁ íÊØáÈ ÐÇßÑÉ ßÈíÑÉ ÌÏÇð.\nåá ÊÑíÏ ÅáÛÇÁ ÇáÊÑÇÌÚ¿";
    Message[ dutch ] = "Het ongedaan maken van deze bewerking beslaat veel geheugen.\nWilt U \"Ongedaan maken\" opheffen ?";
    Message[ chinese_simplified ] = "³·ÏûÃüÁÄÜÐèÒªºÜ¶àµÄÄÚ´æ¡£\nÄúҪʧ»î³·ÏûÃüÁÄÜÂð£¿";
    Message[ greek ] = "Ç åêôÝëåóç áõôÞò ôçò åíÝñãåéáò áðáéôåß ìåãÜëç ðïóüôçôá ìíÞìçò.\nÈÝëåôå íá áêõñþóåôå ôçí áíáßñåóç;";
    Message[ korean ] = "ÀÌ ÀÛµ¿À» Ãë¼Ò¸¦ À§ÇÏ¿© ´ë¿ë·®ÀÇ ¸Þ¸ð¸®°¡ ¿ä±¸µË´Ï´Ù.\n½ÇÇàÃë¼Ò¸¦ Ãë¼ÒÇϽðڽÀ´Ï±î?";
    Message[ turkish ] = "Bu iþlemde geri alma için büyük miktarda bellek gerekiyor.\nGeri alma iþlevini kapatmak istiyor musunuz?";
    Message[ language_user1 ] = " ";
};

Bitmap RID_GRAPHIC_REPLACEBMP
{
    File = "grafikei.bmp" ;
};

Bitmap RID_GRAPHIC_ERRORBMP
{
    File = "grafikde.bmp" ;
};

String STR_TABLE_DEFNAME
{
    Text = "Tabelle" ;
    Text [ ENGLISH ] = "Table" ;
    Text [ norwegian ] = "Table" ;
    Text [ italian ] = "Tabella" ;
    Text [ portuguese_brazilian ] = "Tabela" ;
    Text [ portuguese ] = "Tabela" ;
    Text [ finnish ] = "Taulukko" ;
    Text [ danish ] = "Tabel" ;
    Text [ french ] = "Tableau" ;
    Text [ swedish ] = "Tabell" ;
    Text [ dutch ] = "Tabel" ;
    Text [ spanish ] = "Tabla" ;
    Text [ english_us ] = "Table" ;
    Text[ chinese_simplified ] = "±í¸ñ";
    Text[ russian ] = "Òàáëèöà";
    Text[ polish ] = "Tabela";
    Text[ japanese ] = "•\\";
    Text[ chinese_traditional ] = "ªí®æ";
    Text[ arabic ] = "ÌÏæá";
    Text[ dutch ] = "Tabel";
    Text[ chinese_simplified ] = "±í¸ñ";
    Text[ greek ] = "Ðßíáêáò";
    Text[ korean ] = "ǥ";
    Text[ turkish ] = "Tablo";
    Text[ language_user1 ] = " ";
};

String STR_GRAPHIC_DEFNAME
{
    TEXT = "Grafik" ;
    TEXT [ English ] = "Graphic" ;
    TEXT [ norwegian ] = "Graphic" ;
    TEXT [ italian ] = "Immagine" ;
    TEXT [ portuguese_brazilian ] = "Gráfico" ;
    TEXT [ portuguese ] = "Imagem" ;
    TEXT [ finnish ] = "Kuva" ;
    TEXT [ danish ] = "Grafik" ;
    TEXT [ french ] = "Image" ;
    TEXT [ swedish ] = "Grafik" ;
    TEXT [ dutch ] = "Afbeelding" ;
    TEXT [ spanish ] = "Imagen" ;
    TEXT [ english_us ] = "Graphic" ;
    TEXT[ chinese_simplified ] = "ͼÐÎ";
    TEXT[ russian ] = "Ðèñóíîê";
    TEXT[ polish ] = "Grafika";
    TEXT[ japanese ] = "}";
    TEXT[ chinese_traditional ] = "¹Ï¤ù";
    TEXT[ arabic ] = "ÕæÑÉ";
    TEXT[ dutch ] = "Afbeelding";
    TEXT[ chinese_simplified ] = "ͼÐÎ";
    TEXT[ greek ] = "Ãñáöéêü";
    TEXT[ korean ] = "±×·¡ÇÈ";
    TEXT[ turkish ] = "Grafik";
    TEXT[ language_user1 ] = " ";
};

String STR_OBJECT_DEFNAME
{
    TEXT = "Objekt" ;
    TEXT [ English ] = "Object" ;
    TEXT [ norwegian ] = "Object" ;
    TEXT [ italian ] = "Oggetto" ;
    TEXT [ portuguese_brazilian ] = "Objeto" ;
    TEXT [ portuguese ] = "Objecto" ;
    TEXT [ finnish ] = "Objekti" ;
    TEXT [ danish ] = "Objekt" ;
    TEXT [ french ] = "Objet" ;
    TEXT [ swedish ] = "Objekt" ;
    TEXT [ dutch ] = "Object" ;
    TEXT [ spanish ] = "Objeto" ;
    TEXT [ english_us ] = "Object" ;
    TEXT[ chinese_simplified ] = "¶ÔÏó";
    TEXT[ russian ] = "Îáúåêò";
    TEXT[ polish ] = "Obiekt";
    TEXT[ japanese ] = "µÌÞ¼Þª¸Ä";
    TEXT[ chinese_traditional ] = "ª«¥ó";
    TEXT[ arabic ] = "ßÇÆä";
    TEXT[ dutch ] = "Object";
    TEXT[ chinese_simplified ] = "¶ÔÏó";
    TEXT[ greek ] = "Áíôéêåßìåíï";
    TEXT[ korean ] = "°³Ã¼";
    TEXT[ turkish ] = "Nesne";
    TEXT[ language_user1 ] = " ";
};

String STR_FRAME_DEFNAME
{
    Text = "Rahmen" ;
    Text [ English ] = "Frames" ;
    Text [ norwegian ] = "Rammer" ;
    Text [ italian ] = "Cornice" ;
    Text [ portuguese_brazilian ] = "Molduras" ;
    Text [ portuguese ] = "Moldura" ;
    Text [ finnish ] = "Kehys" ;
    Text [ danish ] = "Ramme" ;
    Text [ french ] = "Cadre" ;
    Text [ swedish ] = "Ram" ;
    Text [ dutch ] = "Kader" ;
    Text [ spanish ] = "Marco" ;
    Text [ english_us ] = "Frame" ;
    Text[ chinese_simplified ] = "¿ò";
    Text[ russian ] = "Ðàìêà";
    Text[ polish ] = "Ramka";
    Text[ japanese ] = "÷½ÄÎÞ¯¸½";
    Text[ chinese_traditional ] = "¤å¦r¤è¶ô";
    Text[ arabic ] = "ÅØÇÑ";
    Text[ dutch ] = "Kader";
    Text[ chinese_simplified ] = "¿ò";
    Text[ greek ] = "Ðåñßãñáììá";
    Text[ korean ] = "ÇÁ·¹ÀÓ";
    Text[ turkish ] = "Çerçeve";
    Text[ language_user1 ] = " ";
};
String STR_REGION_DEFNAME
{
    Text = "Bereich" ;
    Text [ English ] = "section" ;
    Text [ norwegian ] = "section" ;
    Text [ italian ] = "Sezione" ;
    Text [ portuguese_brazilian ] = "seção" ;
    Text [ portuguese ] = "Secção" ;
    Text [ finnish ] = "osa" ;
    Text [ danish ] = "Område" ;
    Text [ french ] = "Section" ;
    Text [ swedish ] = "Område" ;
    Text [ dutch ] = "Bereik" ;
    Text [ spanish ] = "Area" ;
    Text [ english_us ] = "Section" ;
    Text[ chinese_simplified ] = "ÇøÓò";
    Text[ russian ] = "Îáëàñòü";
    Text[ polish ] = "Obszar";
    Text[ japanese ] = "”͈Í";
    Text[ chinese_traditional ] = "°Ï°ì";
    Text[ arabic ] = "äØÇÞ";
    Text[ dutch ] = "Bereik";
    Text[ chinese_simplified ] = "ÇøÓò";
    Text[ greek ] = "Åíüôçôá";
    Text[ korean ] = "±¸¿ª";
    Text[ turkish ] = "Bölüm";
    Text[ language_user1 ] = " ";
};
String STR_NUMRULE_DEFNAME
{
    Text = "Nummerierung" ;
    Text [ English ] = "Numbering" ;
    Text [ norwegian ] = "Numbering" ;
    Text [ italian ] = "Numerazione" ;
    Text [ portuguese_brazilian ] = "NumeraþÒo" ;
    Text [ portuguese ] = "Numeração" ;
    Text [ finnish ] = "Numerointi" ;
    Text [ danish ] = "Nummerering" ;
    Text [ french ] = "Numérotation" ;
    Text [ swedish ] = "Numrering" ;
    Text [ dutch ] = "Nummering" ;
    Text [ spanish ] = "Numeración" ;
    Text [ english_us ] = "Numbering" ;
    Text[ chinese_simplified ] = "񅧏";
    Text[ russian ] = "Íóìåðàöèÿ";
    Text[ polish ] = "Numeracja";
    Text[ japanese ] = "”ԍ†•t‚¯";
    Text[ chinese_traditional ] = "½s¸¹";
    Text[ arabic ] = "ÇáÊÑÞíã";
    Text[ dutch ] = "Nummering";
    Text[ chinese_simplified ] = "񅧏";
    Text[ greek ] = "Áñßèìçóç";
    Text[ korean ] = "¹øÈ£ ¸Å±â±â";
    Text[ turkish ] = "Numaralama";
    Text[ language_user1 ] = " ";
};
String STR_EMPTYPAGE
{
    Text = "leere Seite" ;
    Text [ English ] = "empty page" ;
    Text [ english_us ] = "blank page" ;
    Text [ portuguese_brazilian ] = "leere Seite" ;
    Text [ swedish ] = "tom sida" ;
    Text [ danish ] = "tom side" ;
    Text [ italian ] = "Pagina vuota" ;
    Text [ spanish ] = "Página vacía" ;
    Text [ french ] = "Page vide" ;
    Text [ dutch ] = "Lege pagina" ;
    Text [ portuguese ] = "página vazia" ;
    Text[ chinese_simplified ] = "¿Õ°×Ò³Ãæ";
    Text[ russian ] = "Ïóñòàÿ ñòðàíèöà";
    Text[ polish ] = "Pusta strona";
    Text[ japanese ] = "‹ó”’Íß°¼Þ";
    Text[ chinese_traditional ] = "ªÅ¥Õ­¶­±";
    Text[ arabic ] = "ÕÝÍÉ ÝÇÑÛÉ";
    Text[ dutch ] = "Lege pagina";
    Text[ chinese_simplified ] = "¿Õ°×Ò³Ãæ";
    Text[ greek ] = "êåíÞ óåëßäá";
    Text[ korean ] = "ºó ÆäÀÌÁö";
    Text[ turkish ] = "Boþ sayfa";
    Text[ language_user1 ] = " ";
};

QueryBox MSG_CLPBRD_CLEAR
{
    BUTTONS = WB_YES_NO ;
    DEFBUTTON = WB_DEF_NO ;
    MESSAGE = "Sie haben größere Datenmengen in die Zwischenablage gestellt.\nSoll der Inhalt der Zwischenablage anderen Applikationen zur Verfügung gestellt werden?" ;
    MESSAGE [ English ] = "Shall the Clipboard Content be available for other Applications?" ;
    MESSAGE [ norwegian ] = "Vil du at Innholdet på Utklippstavlen skal være tilgjengelig til andre applikasjoner?" ;
    MESSAGE [ italian ] = "Negli appunti ci sono molti dati.\nRendere il contenuto degli appunti disponibile per altre applicazioni?" ;
    MESSAGE [ portuguese_brazilian ] = "O Conteúdo do Clipboard deve estar disponível para outros Aplicativos?" ;
    MESSAGE [ portuguese ] = "Na área de transferência encontram-se grandes quantidades de dados.\nColocar o conteúdo da área de transferência à disposição de outras aplicações?" ;
    MESSAGE [ english_us ] = "You have a large amount of data saved in the clipboard.\nShould the clipboard contents remain available for other applications?" ;
    MESSAGE [ finnish ] = "Pitääkö leikepöydän sisällön olla muiden sovellusten käytettävissä?" ;
    MESSAGE [ danish ] = "Du har placeret en stor mængde data i udklipsholderen.\nSkal udklipholderens indhold være tilgængeligt for andre applikationer?" ;
    MESSAGE [ french ] = "Vous avez déposé un grand nombre de données dans le presse-papiers. \nSouhaitez-vous en conserver le contenu pour une utilisation ultérieure sous une autre application ?" ;
    MESSAGE [ swedish ] = "Du har stora datamängder i urklippet.\nSkall innehållet i urklippet göras tillgängligt för andra applikationer?" ;
    MESSAGE [ dutch ] = "U hebt een groot aantal gegevens op het Klembord geplaatst.\nWilt u dat de inhoud van het Klembord beschikbaar blijft voor andere toepassingen?" ;
    MESSAGE [ spanish ] = "Usted tiene muchos datos en el portapapeles.\n¿Desea mantener disponible el contenido del portapapeles para otras aplicaciones?" ;
    MESSAGE[ chinese_simplified ] = "Äú½«Ò»¸ö½Ï´óµÄÊý¾Ý¸´ÖƵ½¼ôÌù°å¡£\nÄúÏëÒªÈÃÆäËûµÄÓ¦ÓóÌÐòÒ²Äܹ»Ê¹ÓÃÕâ¸öÊý¾ÝÂð£¿";
    MESSAGE[ language_user1 ] = " ";
    MESSAGE[ russian ] = "Âû ñîõðàíèëè áîëüøåå êîëè÷åñòâî äàííûõ â áóôåðå îáìåíà.\nÄîëæíî ëè ñîäåðæèìîå áóôåðà îáìåíà áûòü äîñòóïíûì äëÿ äðóãèõ ïðèëîæåíèé?";
    MESSAGE[ polish ] = "W schowku zosta³y umieszczone wiêksze iloœci danych.\nCzy treœæ tych danych ma zostaæ udostêpniona innym aplikacjom?";
    MESSAGE[ japanese ] = "¸Ø¯ÌßÎÞ°Äނɑå—Ê‚ÌÃÞ°À‚ª•Û‘¶‚³‚ê‚Ä‚¢‚Ü‚·B\n¸Ø¯ÌßÎÞ°Äނ̓à—e‚𑼂̱Ìߨ¹°¼®Ý‚ÉŽg—p‚µ‚Ü‚·‚©?";
    MESSAGE[ chinese_traditional ] = "±z¤w¸g±N¤@­Ó¸û¤jªº¸ê®Æ½Æ»s¨ì°Å¶Kï¡C\n±z·Q­nÅý¨ä¥LªºÀ³¥Îµ{§Ç¤]¯à°÷¨Ï¥Î³o­Ó¸ê®Æ¡H";
    MESSAGE[ arabic ] = "áÞÏ ÞãÊ ÈÍÝÙ ßãíÇÊ ßÈíÑÉ ãä ÇáÈíÇäÇÊ Ýí ÇáÍÇÝÙÉ.\nåá ÊÑíÏ æÖÚ ãÍÊæíÇÊ ÇáÍÇÝÙÉ ÊÍÊ ÊÕÑÝ ÊØÈíÞÇÊ ÃÎÑì¿";
    MESSAGE[ dutch ] = "U hebt een groot aantal gegevens op het Klembord geplaatst.\nWilt u dat de inhoud van het Klembord beschikbaar blijft voor andere toepassingen?";
    MESSAGE[ chinese_simplified ] = "Äú½«Ò»¸ö½Ï´óµÄÊý¾Ý¸´ÖƵ½¼ôÌù°å¡£\nÄúÏëÒªÈÃÆäËûµÄÓ¦ÓóÌÐòÒ²Äܹ»Ê¹ÓÃÕâ¸öÊý¾ÝÂð£¿";
    MESSAGE[ greek ] = "¸÷åôå áðïèçêåýóåé ìåãÜëï áñéèìü äåäïìÝíùí óôï clipboard.\nÈÝëåôå íá ðáñáìåßíåé äéáèÝóéìï ôï ðåñéå÷üìåíï ôïõ clipboard ãéá Üëëåò åöáñìïãÝò;";
    MESSAGE[ korean ] = "Ŭ¸³º¸µå¾È¿¡ ÀúÀåµÈ ´ë¿ë·®ÀÇ µ¥ÀÌÅͰ¡ ÀÖ½À´Ï´Ù.\nŬ¸³º¸µåÀÇ ³»¿ëÀ» ´Ù¸¥ ÀÀ¿ëÇÁ·Î±×·¥¿¡¼­ À¯È¿Çϵµ·Ï ³²°ÜµÎ½Ã°Ú½À´Ï±î?";
    MESSAGE[ turkish ] = "Panoya büyük miktarda veri aktardýnýz.\nPano içeriðini baþka uygulamalarda kullanmak istiyor musunuz?";
};

QueryBox MSG_SAVE_HTML_QUERY
{
    BUTTONS = WB_YES_NO_CANCEL ;
    DEFBUTTON = WB_DEF_YES ;
    MESSAGE = "Die Umwandlung in das HTML-Format \nkann Informationsverlust verursachen. \nMöchten Sie das Dokument speichern?" ;
    MESSAGE [ English ] = "Conversion into HTML \nmay cause information loss. \nWould you like to save the document?" ;
    Message [ english_us ] = "Conversion into HTML format \nmay cause information loss. \nDo you want to save the document?" ;
    Message = "Die Umwandlung in das HTML-Format \nkann Informationsverlust verursachen. \nMöchten Sie das Dokument speichern?" ;
    Message [ italian ] = "La conversione nel formato HTML \npuò causare perdita di informazioni \nSalvare il documento?" ;
    Message [ spanish ] = "La transformación en el formato HTML \npuede causar la pérdida de información. \n¿Desea guardar el documento?" ;
    Message [ french ] = "La conversion au format HTML\npeut engendrer une perte d'informations. \nSouhaitez-vous enregistrer le document ?" ;
    Message [ dutch ] = "De convertering naar het HTML-formaat \nkan verlies van gegevens veroorzaken. \nWilt u het document opslaan?" ;
    Message [ swedish ] = "Omvandling till HTML-format \nkan förorsaka informationsförlust.\nSkall dokumentet sparas?" ;
    Message [ danish ] = "Konvertering til HTML-format\nkan medføre informationstab.\nVil du gemme dokumentet?" ;
    Message [ portuguese_brazilian ] = "Die Umwandlung in das HTML-Format \nkann Informationsverlust verursachen. \nMöchten Sie das Dokument speichern?" ;
    Message [ portuguese ] = "A conversão para o formato HTML pode \nprovocar perda de informação. \nGuardar o documento?" ;
    Message[ chinese_simplified ] = "Îļþת»»³É HTML ¸ñʽ\n¿ÉÄÜ»áÒýÆð×ÊÁÏËðʧ¡£\nÄúÒª´æÅÌÕâ¸öÎļþÂð?";
    Message[ russian ] = "Ïåðåõîä â ôîðìàò HTML \nìîæåò ïðèâåñòè ê ïîòåðå èíôîðìàöèè. \n Âû õîòèòå ñîõðàíèòü ýòîò äîêóìåíò?";
    Message[ polish ] = "Konwersja na format HTML \nmo¿e spowodowaæ utratê informacji. \nCzy chcesz zapisaæ dokument?";
    Message[ japanese ] = "HTMLŒ`Ž®‚ɕϊ·‚·‚邯\nî•ñ‚ªŽ¸‚í‚ê‚é‰Â”\\«‚ª‚ ‚è‚Ü‚·B\n‚±‚Ì•¶‘‚ð•Û‘¶‚µ‚Ü‚·‚©?";
    Message[ chinese_traditional ] = "ÀÉ®×Âà´«¦¨ HTML ®æ¦¡\n¥i¯à·|¤Þ°_¸ê®Æ·l¥¢¡C\n±z­nÀx¦s³o­ÓÀɮסH";
    Message[ arabic ] = "ÇáÊÍæá Åáì ÊäÓíÞ HTML \níãßä Ãä íÄÏí Åáì ÝÞÏÇä ÈÚÖ ÇáãÚáæãÇÊ. \nåá ÊÑíÏ ÍÝÙ ÇáãÓÊäÏ¿";
    Message[ dutch ] = "De convertering naar het HTML-formaat \nkan verlies van gegevens veroorzaken. \nWilt u het document opslaan?";
    Message[ chinese_simplified ] = "Îļþת»»³É HTML ¸ñʽ\n¿ÉÄÜ»áÒýÆð×ÊÁÏËðʧ¡£\nÄúÒª´æÅÌÕâ¸öÎļþÂð?";
    Message[ greek ] = "Ç ìåôáôñïðÞ óå ìïñöÞ HTML \nìðïñåß íá ðñïêáëÝóåé áðþëåéåò ðëçñïöïñéþí. \nÈÝëåôå íá áðïèçêåýóåôå ôï Ýããñáöï;";
    Message[ korean ] = "HTML ¼­½ÄÀ¸·Î º¯È¯Àº \nÁ¤º¸ ¼Õ½ÇÀÇ ¿øÀÎÀÌ µË´Ï´Ù. \n¹®¼­¸¦ ÀúÀåÇϽðڽÀ´Ï±î?";
    Message[ turkish ] = "HTML formatýna \ndönüþüm sonucunda veri kaybý olabilir. \nBelgeyi kaydetmek istiyor musunuz?";
    Message[ language_user1 ] = " ";
};

String STR_ABSTRACT_TITLE
{
    Text = "Abstrakt : " ;
    Text [ English ] = "Summary : " ;
    Text [ portuguese ] = "Abstracto : " ;
    Text [ english_us ] = "Abstract: " ;
    Text [ portuguese_brazilian ] = "Abstrakt : " ;
    Text [ swedish ] = "Utdrag:  " ;
    Text [ danish ] = "Abstract : " ;
    Text [ italian ] = "Sunto: " ;
    Text [ spanish ] = "Extracto:  " ;
    Text [ french ] = "Synthèse :  " ;
    Text [ dutch ] = "Extract :   " ;
    Text[ chinese_simplified ] = "ͻ񻣼 ";
    Text[ language_user1 ] = " ";
    Text[ russian ] = "Ïðîñìîòð :  ";
    Text[ polish ] = "Abstrakt :   ";
    Text[ japanese ] = "—v–ñ : ";
    Text[ chinese_traditional ] = "ºK­n¡G ";
    Text[ arabic ] = "ÇáÊáÎíÕ: ";
    Text[ dutch ] = "Extract :   ";
    Text[ chinese_simplified ] = "ͻ񻣼 ";
    Text[ greek ] = "Abstract: ";
    Text[ korean ] = "̧ȗ: ";
    Text[ turkish ] = "Özet: ";
};

String STR_FDLG_TEMPLATE_BUTTON
{
    Text = "Vorlage" ;
    Text [ English ] = "Template" ;
    Text [ english_us ] = "Style" ;
    Text [ portuguese_brazilian ] = "Vorlage" ;
    Text [ swedish ] = "Formatmall" ;
    Text [ danish ] = "Skabelon" ;
    Text [ italian ] = "Modello" ;
    Text [ spanish ] = "Plantilla" ;
    Text [ french ] = "Style" ;
    Text [ dutch ] = "Sjabloon" ;
    Text [ portuguese ] = "Estilo" ;
    Text[ chinese_simplified ] = "Ñùʽ";
    Text[ russian ] = "Øàáëîí";
    Text[ polish ] = "Szablon";
    Text[ japanese ] = "ÃÝÌßÚ°Ä";
    Text[ chinese_traditional ] = "¼Ë¦¡";
    Text[ arabic ] = "äãØ";
    Text[ dutch ] = "Sjabloon";
    Text[ chinese_simplified ] = "Ñùʽ";
    Text[ greek ] = "Ðñüôõðï";
    Text[ korean ] = "À¯Çü";
    Text[ turkish ] = "Biçim";
    Text[ language_user1 ] = " ";
};

String STR_FDLG_TEMPLATE_NAME
{
    Text = "Aktuelle Vorlage: " ;
    Text [ English ] = "Current template: " ;
    Text [ english_us ] = "Current Style: " ;
    Text [ portuguese_brazilian ] = "Aktuelle Vorlage: " ;
    Text [ swedish ] = "Aktuell formatmall:  " ;
    Text [ danish ] = "Aktuel skabelon: " ;
    Text [ italian ] = "Modello corrente: " ;
    Text [ spanish ] = "Plantilla actual:  " ;
    Text [ french ] = "Style actif : " ;
    Text [ dutch ] = "Actuele sjabloon  " ;
    Text [ portuguese ] = "Modelo actual: " ;
    Text[ chinese_simplified ] = "µ±Ç°µÄÑùʽ£º ";
    Text[ russian ] = "Òåêóùèé øàáëîí:  ";
    Text[ polish ] = "Aktualny szablon  ";
    Text[ japanese ] = "ì‹Æ’†‚ÌÃÝÌßڰāF ";
    Text[ chinese_traditional ] = "·í«eªº¼Ë¦¡¡G ";
    Text[ arabic ] = "ÇáäãØ ÇáÍÇáí: ";
    Text[ dutch ] = "Actuele sjabloon  ";
    Text[ chinese_simplified ] = "µ±Ç°µÄÑùʽ£º ";
    Text[ greek ] = "ÔñÝ÷ùí ðñüôõðï:  ";
    Text[ korean ] = "ÇöÀç ÅÛÇø®Æ®: ";
    Text[ turkish ] = "Yürürlükteki biçim: ";
    Text[ language_user1 ] = " ";
};

String STR_PAGEOFFSET
{
    Text = "Seitennummer: " ;
    Text [ English ] = "Page number: " ;
    Text [ english_us ] = "Page number: " ;
    Text [ portuguese_brazilian ] = "Seitennummer: " ;
    Text [ swedish ] = "Sidnummer:  " ;
    Text [ danish ] = "Sidetal: " ;
    Text [ italian ] = "Numero di pagina: " ;
    Text [ spanish ] = "Número de página:  " ;
    Text [ french ] = "Numéro de page : " ;
    Text [ dutch ] = "Paginanummer  " ;
    Text [ portuguese ] = "Número de página: " ;
    Text[ chinese_simplified ] = "Ò³Â룺 ";
    Text[ russian ] = "Íîìåð ñòðàíèöû:  ";
    Text[ polish ] = "Numer strony:  ";
    Text[ japanese ] = "Íß°¼Þ”ԍ†: ";
    Text[ chinese_traditional ] = "­¶½X¡G ";
    Text[ arabic ] = "ÑÞã ÇáÕÝÍÉ: ";
    Text[ dutch ] = "Paginanummer  ";
    Text[ chinese_simplified ] = "Ò³Â룺 ";
    Text[ greek ] = "Áñéèìüò óåëßäáò: ";
    Text[ korean ] = "ÆäÀÌÁö ¹øÈ£: ";
    Text[ turkish ] = "Sayfa numarasý: ";
    Text[ language_user1 ] = " ";
};
String STR_PAGEBREAK
{
    Text = "Umbruch vor neuer Seite" ;
    Text [ English ] = "Break before new page" ;
    Text [ norwegian ] = "Skift før ny side" ;
    Text [ italian ] = "Interrompi prima della pagina nuova" ;
    Text [ portuguese_brazilian ] = "Interromper antes de nova página" ;
    Text [ portuguese ] = "Quebra antes de nova página" ;
    Text [ finnish ] = "Väli ennen uutta sivua" ;
    Text [ danish ] = "Skift før ny side" ;
    Text [ french ] = "Saut avant nouvelle page" ;
    Text [ swedish ] = "Bryt före ny sida" ;
    Text [ dutch ] = "Einde voor nieuwe pagina" ;
    Text [ spanish ] = "Salto antes de página nueva" ;
    Text [ english_us ] = "Break before new page" ;
    Text[ chinese_simplified ] = "ÔÚÐÂһҳ֮ǰ»»Ò³";
    Text[ russian ] = "Ðàçðûâ ïåðåä íîâîé ñòðàíèöåé";
    Text[ polish ] = "Podzia³ przed now¹ stron¹";
    Text[ japanese ] = "V‚µ‚¢Íß°¼Þ‚Ì‘O‚Å‹æØ‚é";
    Text[ chinese_traditional ] = "¦b·s¤@­¶¤§«e´«­¶";
    Text[ arabic ] = "ÝÇÕá ÞÈá ÇáÕÝÍÉ ÇáÌÏíÏÉ";
    Text[ dutch ] = "Einde voor nieuwe pagina";
    Text[ chinese_simplified ] = "ÔÚÐÂһҳ֮ǰ»»Ò³";
    Text[ greek ] = "ÁëëáãÞ ðñéí áðü íÝá óåëßäá";
    Text[ korean ] = "»õ ÆäÀÌÁö ¾Õ¿¡¼­ Áß´Ü";
    Text[ turkish ] = "Yeni sayfa öncesi kesme";
    Text[ language_user1 ] = " ";
};

diff --git a/sw/source/ui/app/appenv.cxx b/sw/source/ui/app/appenv.cxx
new file mode 100644
index 0000000..19eb0c6
--- /dev/null
+++ b/sw/source/ui/app/appenv.cxx
@@ -0,0 +1,739 @@
/*************************************************************************
 *
 *  $RCSfile: appenv.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:31 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#if STLPORT_VERSION>=321
#include <cstdarg>
#endif

#define ITEMID_BOXINFO      SID_ATTR_BORDER_INNER
#include <hintids.hxx>

#include <svtools/svmedit.hxx>
#ifndef _APP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _WRKWIN_HXX //autogen
#include <vcl/wrkwin.hxx>
#endif
#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif
#ifndef _SFX_OBJFAC_HXX //autogen
#include <sfx2/docfac.hxx>
#endif
#ifndef _SFX_PRINTER_HXX //autogen
#include <sfx2/printer.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SFX_BINDINGS_HXX //autogen
#include <sfx2/bindings.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _SVX_PBINITEM_HXX //autogen
#include <svx/pbinitem.hxx>
#endif
#ifndef _SVX_PAPERINF_HXX
#include <svx/paperinf.hxx>
#endif
#ifndef _SVX_BRKITEM_HXX //autogen
#include <svx/brkitem.hxx>
#endif
#ifndef _SBASLTID_HRC //autogen
#include <offmgr/sbasltid.hrc>
#endif
#ifndef _FMTHDFT_HXX //autogen
#include <fmthdft.hxx>
#endif
#ifndef _SWWAIT_HXX
#include <swwait.hxx>
#endif

#include "paratr.hxx"
#include "swmodule.hxx"
#include "wrtsh.hxx"
#include "view.hxx"
#include "docsh.hxx"
#include "frmatr.hxx"
#include "fldbas.hxx"
#include "swundo.hxx"
#include "cmdid.h"
#include "globals.hrc"
#include "doc.hxx"
#include "dbmgr.hxx"
#include "envlop.hxx"
#include "fmtcol.hxx"
#include "frmmgr.hxx"
#include "fldmgr.hxx"
#include "pagedesc.hxx"
#include "poolfmt.hxx"
#include "expfld.hxx"
#include "app.hrc"
#include "poolfmt.hrc"

#define ENV_NEWDOC      RET_OK
#define ENV_INSERT      RET_USER
#define ENV_CANCEL      SHRT_MAX


// --------------------------------------------------------------------------


// Funktion wird fuer Etiketten und Briefumschlaege benutzt!
//  im applab.cxx und appenv.cxx
BOOL InsertLabEnvText( SwWrtShell& rSh, SwFldMgr& rFldMgr, const String& rText )
{
    BOOL bRet = FALSE;
    String aText(rText);
    aText.EraseAllChars( '\r' );


    USHORT nTokenPos = 0;
    while( STRING_NOTFOUND != nTokenPos )
    {
        String aLine = aText.GetToken( 0, '\n', nTokenPos );
        while ( aLine.Len() )
        {
            String sTmpText;
            BOOL bField = FALSE;

            USHORT nPos = aLine.Search( '<' );
            if ( nPos )
            {
                sTmpText = aLine.Copy( 0, nPos );
                aLine.Erase( 0, nPos );
//              sTmpText = aLine.Cut( 0, nPos );
            }
            else
            {
                nPos = aLine.Search( '>' );
                if ( nPos == STRING_NOTFOUND )
                {
                    sTmpText = aLine;
                    aLine.Erase();
//                  sTmpText = aLine.Cut();
                }
                else
                {
                    sTmpText = aLine.Copy( 0, nPos + 1);
                    aLine.Erase( 0, nPos + 1);
//                  sTmpText = aLine.Cut( 0, nPos + 1 );

                    // Datenbankfelder muesen mind. 3 Punkte beinhalten!
                    String sDBName( sTmpText.Copy( 1, sTmpText.Len() - 2));
                    USHORT nCnt = sDBName.GetTokenCount('.');
                    if (nCnt >= 3)
                    {
                        ::ReplacePoint(sDBName);
                        rFldMgr.InsertFld( TYP_DBFLD, 0, sDBName, aEmptyStr, 0, &rSh );
                        bRet = TRUE;
                        bField = TRUE;
                    }
                }
            }
            if ( !bField )
                rSh.Insert( sTmpText );
        }
        rSh.InsertLineBreak();
    }
    rSh.DelLeft();  // Letzten Linebreak wieder l”schen

    return bRet;
}

// ----------------------------------------------------------------------------


void lcl_CopyCollAttr(SwWrtShell* pOldSh, SwWrtShell* pNewSh, USHORT nCollId)
{
    USHORT nCollCnt = pOldSh->GetTxtFmtCollCount();
    SwTxtFmtColl* pColl;
    for( USHORT nCnt = 0; nCnt < nCollCnt; ++nCnt )
        if(nCollId == (pColl = &pOldSh->GetTxtFmtColl(nCnt))->GetPoolFmtId())
            pNewSh->GetTxtCollFromPool(nCollId)->SetAttr(pColl->GetAttrSet());
}

// ----------------------------------------------------------------------------


void SwModule::InsertEnv()
{
static USHORT nTitleNo = 0;

    SwDocShell      *pMyDocSh;
    SfxViewFrame    *pFrame;
    SwView          *pView;
    SwWrtShell      *pOldSh,
                    *pSh;

    //aktuelle Shell besorgen
    pMyDocSh = (SwDocShell*) SfxObjectShell::Current();
    pOldSh   = pMyDocSh ? pMyDocSh->GetWrtShell() : 0;

    // Neues Dokument erzeugen (kein Show!)
    SfxObjectShellRef xDocSh( new SwDocShell( SFX_CREATE_MODE_STANDARD ) );
    xDocSh->DoInitNew( 0 );
    pFrame = SFX_APP()->CreateViewFrame( *xDocSh, 0, TRUE );
    pView = (SwView*) pFrame->GetViewShell();
    pView->AttrChangedNotify( &pView->GetWrtShell() );//Damit SelectShell gerufen wird.
    pSh = pView->GetWrtShellPtr();

    String aTmp( SW_RES(STR_ENV_TITLE) );
    aTmp += String::CreateFromInt32( ++nTitleNo );
    xDocSh->SetTitle( aTmp );

    // Ggf. alte Collections "Absender" und "Empfaenger" in neues
    // Dokument kopieren
    if ( pOldSh )
    {
        ::lcl_CopyCollAttr(pOldSh, pSh, RES_POOLCOLL_JAKETADRESS);
        ::lcl_CopyCollAttr(pOldSh, pSh, RES_POOLCOLL_SENDADRESS);
    }

    // SwEnvItem aus Config lesen
    SwEnvCfgItem aEnvCfg;
    aEnvCfg.Initialize();

    //Haben wir schon einen Briefumschlag.
    BOOL bEnvChange = FALSE;

    SfxItemSet aSet(GetPool(), FN_ENVELOP, FN_ENVELOP, 0);
    aSet.Put(aEnvCfg.aEnvItem);

    SfxPrinter* pTempPrinter = pSh->GetPrt( TRUE );
    if(pOldSh )
    {
        const SwPageDesc& rCurPageDesc = pOldSh->GetPageDesc(pOldSh->GetCurPageDesc());
        String sJacket; GetDocPoolNm( RES_POOLPAGE_JAKET, sJacket );
        bEnvChange = rCurPageDesc.GetName() == sJacket;
        if(pOldSh->GetPrt(FALSE))
        {
            pSh->GetDoc()->SetJobsetup(*pOldSh->GetDoc()->GetJobsetup());
            //#69563# if it isn't the same printer then the pointer has been invalidated!
            pTempPrinter = pSh->GetPrt( TRUE );
        }
        pTempPrinter->SetPaperBin(rCurPageDesc.GetMaster().GetPaperBin().GetValue());

    }

    Window *pParent = pOldSh ? pOldSh->GetWin() : 0;
    SwEnvDlg* pDlg = new SwEnvDlg( pParent, aSet,
                                   pOldSh, pTempPrinter,
                                   !bEnvChange);

    short nMode = pDlg->Execute();

    if (nMode == ENV_NEWDOC || nMode == ENV_INSERT)
    {
        SwWait aWait( (SwDocShell&)*xDocSh, TRUE );

        // Dialog auslesen, Item in Config speichern
        const SwEnvItem& rItem = (const SwEnvItem&) pDlg->
                                            GetOutputItemSet()->Get(FN_ENVELOP);
        aEnvCfg.aEnvItem = rItem;
        aEnvCfg.SetDefault(FALSE);
        aEnvCfg.StoreConfig();

        //Wenn wir Drucken uebernehmen wir den eingestellten Jobsetup aus
        //dem Dialog. Die Informationen muessen hier vor dem evtl. zerstoeren
        //der neuen Shell gesetzt werden, weil deren Drucker an den Dialog
        //gereicht wurde.
        if ( nMode != ENV_NEWDOC )
        {
            ASSERT(pOldSh, "Kein Dokument - war 'Einfuegen' nicht disabled???");
            SvxPaperBinItem aItem;
            aItem.SetValue((BYTE)pSh->GetPrt()->GetPaperBin());
            pOldSh->GetPageDescFromPool(RES_POOLPAGE_JAKET)->GetMaster().SetAttr(aItem);
        }

        SwWrtShell *pTmp = nMode == ENV_INSERT ? pOldSh : pSh;
        const SwPageDesc* pFollow = 0;
        SwTxtFmtColl *pSend = pTmp->GetTxtCollFromPool( RES_POOLCOLL_SENDADRESS ),
                     *pAddr = pTmp->GetTxtCollFromPool( RES_POOLCOLL_JAKETADRESS);
        const String &rSendMark = pSend->GetName();
        const String &rAddrMark = pAddr->GetName();

        if (nMode == ENV_INSERT)
        {

            SetView(&pOldSh->GetView()); // Pointer auf oberste View restaurieren

            //Neues Dok wieder loeschen
            xDocSh->DoClose();
            pSh = pOldSh;

            // Los geht's (Einfuegen)
            pSh->StartUndo(UIUNDO_INSERT_ENVELOPE);
            pSh->StartAllAction();
            pSh->SwCrsrShell::SttDoc();

            if (bEnvChange)
            {
                // Folgevorlage: Seite 2
                pFollow = pSh->GetPageDesc(pSh->GetCurPageDesc()).GetFollow();

                // Text der ersten Seite loeschen
                if ( !pSh->SttNxtPg(TRUE) )
                    pSh->EndPg(TRUE);
                pSh->DelRight();
                // Rahmen der ersten Seite loeschen
                if( pSh->GotoFly( rSendMark ) )
                {
                    pSh->EnterSelFrmMode();
                    pSh->DelRight();
                }
                if ( pSh->GotoFly( rAddrMark ) )
                {
                    pSh->EnterSelFrmMode();
                    pSh->DelRight();
                }
                pSh->SwCrsrShell::SttDoc();
            }
            else
                // Folgevorlage: Seite 1
                pFollow = &pSh->GetPageDesc(pSh->GetCurPageDesc());

            // Seitenumbruch einfuegen
            if ( pSh->IsCrsrInTbl() )
            {
                pSh->SplitNode();
                pSh->Right();
                SfxItemSet aSet( pSh->GetAttrPool(), RES_BREAK, RES_BREAK, 0 );
                aSet.Put( SvxFmtBreakItem(SVX_BREAK_PAGE_BEFORE) );
                pSh->SetTblAttr( aSet );
            }
            else
                pSh->InsertPageBreak(0, FALSE);
            pSh->SwCrsrShell::SttDoc();
        }
        else
        {
            pFollow = &pSh->GetPageDesc(pSh->GetCurPageDesc());
            // Los geht's (Drucken)
            pSh->StartAllAction();
            pSh->DoUndo(FALSE);

            // Neue Collections "Absender" und "Empfaenger" wieder in neues
            // Dokument kopieren
            if ( pOldSh )
            {
                ::lcl_CopyCollAttr(pOldSh, pSh, RES_POOLCOLL_JAKETADRESS);
                ::lcl_CopyCollAttr(pOldSh, pSh, RES_POOLCOLL_SENDADRESS);
            }
        }

        SET_CURR_SHELL(pSh);
        pSh->SetNewDoc();       // Performanceprobleme vermeiden

        // Flys dieser Seite merken
        SvPtrarr aFlyArr(0, 5);
        if( ENV_NEWDOC != nMode && !bEnvChange )
            pSh->GetPageObjs( aFlyArr );

        // Page-Desc ermitteln
        SwPageDesc* pDesc = pSh->GetPageDescFromPool(RES_POOLPAGE_JAKET);
        SwFrmFmt&   rFmt  = pDesc->GetMaster();

        Printer *pPrt = pSh->GetPrt( TRUE );

        // Raender (setzen sich zusammen aus Shift-Offset und
        // Ausrichtung)
        Size aPaperSize = pPrt->PixelToLogic( pPrt->GetPaperSizePixel(),
                                              MAP_TWIP);
        if ( !aPaperSize.Width() && !aPaperSize.Height() )
        {
            aPaperSize.Width() = lA4Width;
            aPaperSize.Height()= lA4Height;
        }
        if ( aPaperSize.Width() > aPaperSize.Height() )
            Swap( aPaperSize );

        long lLeft  = rItem.lShiftRight,
             lUpper = rItem.lShiftDown;

        USHORT nPageW = (USHORT) Max(rItem.lWidth, rItem.lHeight),
               nPageH = (USHORT) Min(rItem.lWidth, rItem.lHeight);

        switch (rItem.eAlign)
        {
            case ENV_HOR_LEFT: break;
            case ENV_HOR_CNTR: lLeft  += Max(0L, long(aPaperSize.Width() - nPageW)) / 2;
                               break;
            case ENV_HOR_RGHT: lLeft  += Max(0L, long(aPaperSize.Width() - nPageW));
                               break;
            case ENV_VER_LEFT: lUpper += Max(0L, long(aPaperSize.Width() - nPageH));
                               break;
            case ENV_VER_CNTR: lUpper += Max(0L, long(aPaperSize.Width() - nPageH)) / 2;
                               break;
            case ENV_VER_RGHT: break;
        }
        SvxLRSpaceItem aLRMargin;
        SvxULSpaceItem aULMargin;
        aLRMargin.SetLeft ((USHORT) lLeft );
        aULMargin.SetUpper((USHORT) lUpper);
        aLRMargin.SetRight(0);
        aULMargin.SetLower(0);
        rFmt.SetAttr(aLRMargin);
        rFmt.SetAttr(aULMargin);

        // Kopf-, Fusszeilen
        rFmt.SetAttr(SwFmtHeader(BOOL(FALSE)));
        pDesc->ChgHeaderShare(FALSE);
        rFmt.SetAttr(SwFmtFooter(BOOL(FALSE)));
        pDesc->ChgFooterShare(FALSE);

        // Seitennumerierung
        pDesc->SetUseOn(PD_ALL);

        // Einstellen der Seitengroesse
        rFmt.SetAttr(SwFmtFrmSize(ATT_FIX_SIZE,
                                            nPageW + lLeft, nPageH + lUpper));

        // Einstellen der Numerierungsart der Seite
        SwNumType aType;
        aType.eType = SVX_NUM_NUMBER_NONE;
        pDesc->SetNumType(aType);

        // Folgevorlage
        if (pFollow)
            pDesc->SetFollow(pFollow);

        // Landscape
        pDesc->SetLandscape( rItem.eAlign >= ENV_VER_LEFT &&
                             rItem.eAlign <= ENV_VER_RGHT);

        // Page-Desc anwenden

        USHORT nPos;
        pSh->FindPageDescByName( pDesc->GetName(),
                                    FALSE,
                                    &nPos );


        pSh->ChgPageDesc( nPos, *pDesc);
        pSh->ChgCurPageDesc(*pDesc);

        // Rahmen einfuegen
        SwFlyFrmAttrMgr aMgr(FALSE, pSh, FRMMGR_TYPE_ENVELP);
        SwFldMgr aFldMgr;

        // Absender
        if (rItem.bSend)
        {
            pSh->SwCrsrShell::SttDoc();
            aMgr.SetSizeType(ATT_VAR_SIZE);

            //Defaults ueberschreiben!
            aMgr.GetAttrSet().Put( SvxBoxItem() );
            aMgr.SetULSpace( 0L, 0L );
            aMgr.SetLRSpace( 0L, 0L );

            aMgr.InsertFlyFrm(FLY_PAGE,
                Point(rItem.lSendFromLeft + lLeft, rItem.lSendFromTop  + lUpper),
                Size (rItem.lAddrFromLeft - rItem.lSendFromLeft, 0));

            pSh->EnterSelFrmMode();
            pSh->SetFlyName( rSendMark );
            pSh->UnSelectFrm();
            pSh->LeaveSelFrmMode();
            pSh->SetTxtFmtColl( pSend );
            InsertLabEnvText( *pSh, aFldMgr, rItem.aSendText );
            aMgr.UpdateAttrMgr();
        }

        // Empfaenger
        pSh->SwCrsrShell::SttDoc();

        aMgr.SetSizeType(ATT_VAR_SIZE);
        aMgr.InsertFlyFrm(FLY_PAGE,
            Point(rItem.lAddrFromLeft + lLeft, rItem.lAddrFromTop  + lUpper),
            Size (nPageW - rItem.lAddrFromLeft - 566, 0));
        pSh->EnterSelFrmMode();
        pSh->SetFlyName( rAddrMark );
        pSh->UnSelectFrm();
        pSh->LeaveSelFrmMode();
        pSh->SetTxtFmtColl( pAddr );
        InsertLabEnvText(*pSh, aFldMgr, rItem.aAddrText);

        // Flys auf die "alten" Seiten verschieben
        if (aFlyArr.Count())
            pSh->SetPageObjsNewPage(aFlyArr, 1);

        // Fertig
        pSh->SwCrsrShell::SttDoc();

        pSh->EndAllAction();

        if (nMode == ENV_NEWDOC)
            pSh->DoUndo(TRUE);
        else
            pSh->EndUndo(UIUNDO_INSERT_ENVELOPE);

        if (nMode == ENV_NEWDOC)
        {
            pFrame->GetFrame()->Appear();

            if ( rItem.aAddrText.Search('<') != STRING_NOTFOUND )
            {
                static USHORT __READONLY_DATA aInva[] =
                                    {
                                        SID_SBA_BRW_UPDATE,
                                        SID_SBA_BRW_INSERT,
                                        SID_SBA_BRW_MERGE,
                                        0
                                    };
                pFrame->GetBindings().Invalidate( aInva );

                // Datenbankbeamer oeffnen
                String sDBName(pSh->GetDBName());
                ShowDBObj(*pSh, sDBName);
            }
        }
    }
    else    //Abbruch
    {
        xDocSh->DoClose();
        --nTitleNo;

        // Pointer auf oberste View restaurieren
        if (pOldSh)
            SetView(&pOldSh->GetView());
    }
    delete pDlg;
}

/*-------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.103  2000/09/18 16:05:09  willem.vandorp
    OpenOffice header added.

    Revision 1.102  2000/09/07 15:59:19  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.101  2000/07/26 16:33:02  jp
    use the new function GetDocPoolNm to get the collectionames

    Revision 1.100  2000/07/18 12:50:07  os
    replace ofadbmgr

    Revision 1.99  2000/06/30 08:52:03  os
    #76541# string assertions removed

    Revision 1.98  2000/05/23 17:52:04  jp
    Bugfixes for Unicode

    Revision 1.97  2000/04/20 12:49:34  os
    GetName() returns String&

    Revision 1.96  2000/04/11 08:01:30  os
    UNICODE

    Revision 1.95  2000/03/08 17:21:49  os
    GetAppWindow() - misuse as parent window eliminated

    Revision 1.94  2000/02/11 14:42:22  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.93  1999/11/19 12:58:47  os
    #69563# after SetJobsetup the printer may be invalid

    Revision 1.92  1999/11/11 14:34:40  hr
    #65293# STLPORT 3.2.1

    Revision 1.91  1999/10/05 10:18:05  os
    #67889# some printer problems solved

    Revision 1.90  1999/10/01 13:36:53  os
    apply AutoText to business cards

    Revision 1.89  1999/07/08 13:59:32  MA
    Use internal object to toggle wait cursor


      Rev 1.88   08 Jul 1999 15:59:32   MA
   Use internal object to toggle wait cursor

      Rev 1.87   10 Jun 1999 10:52:08   JP
   have to change: no AppWin from SfxApp

      Rev 1.86   01 Mar 1999 16:20:52   MA
   #62490# Altlast entfernt (Drucken und Briefumschlaege/Etiketten und Datenbank)

      Rev 1.85   17 Nov 1998 10:49:46   OS
   #58263# NumType durch SvxExtNumType ersetzt

      Rev 1.84   12 Nov 1998 19:19:20   MA
   #59315# Tabelle am Dokumentanfang beruecksichtigen

      Rev 1.83   14 Mar 1998 17:05:12   OM
   Gelinkte Etiketten

      Rev 1.82   05 Feb 1998 16:34:32   OS
   Change: hidden ViewFrame anlegen

      Rev 1.81   24 Nov 1997 14:22:34   MA
   includes

      Rev 1.80   30 Sep 1997 08:40:28   OS
   include

      Rev 1.79   12 Sep 1997 10:38:30   OS
   ITEMID_* definiert

      Rev 1.78   02 Sep 1997 09:56:50   OM
   SDB-Headeranpassung

      Rev 1.77   01 Sep 1997 13:06:32   OS
   DLL-Umstellung

      Rev 1.76   15 Aug 1997 11:45:06   OS
   chartar/frmatr/txtatr aufgeteilt

      Rev 1.75   12 Aug 1997 14:42:40   OS
   Header-Umstellung

      Rev 1.74   08 Aug 1997 17:26:50   OM
   Headerfile-Umstellung

      Rev 1.73   07 Aug 1997 14:59:28   OM
   Headerfile-Umstellung

      Rev 1.72   08 Jul 1997 14:04:10   OS
   ConfigItems von der App ans Module

      Rev 1.71   11 Apr 1997 12:04:16   NF
   includes...

      Rev 1.70   08 Apr 1997 15:11:08   MH
   chg: header

      Rev 1.69   08 Apr 1997 08:32:20   MA
   includes

      Rev 1.68   13 Mar 1997 16:28:48   OM
   DB-Feldbefehle korrekt erkennen

      Rev 1.67   26 Feb 1997 03:46:12   OM
   #37071# Richtige Datenbank nach Briefumschlag und Etiketten anzeigen

      Rev 1.66   25 Feb 1997 22:48:58   OM
   Datenbankfelder richtig einfuegen

      Rev 1.65   11 Feb 1997 16:51:54   OM
   Eingabefeld ueber Basic ohne Dialog einfuegen

      Rev 1.64   16 Dec 1996 10:59:24   OM
   Drucken aus DB-Browser angefangen

      Rev 1.63   11 Dec 1996 09:26:14   MA
   Entschlackt

      Rev 1.62   06 Dec 1996 13:53:24   MA
   Umbrueche fuer Tabellen

      Rev 1.61   05 Dec 1996 15:23:54   OM
   Nach Briefumschlag und Etiketten DB-Browser oeffnen

      Rev 1.60   03 Dec 1996 17:41:12   AMA
   Chg: Der Drucker wird nur im !Browsemodus angelegt.

      Rev 1.59   08 Nov 1996 19:39:34   MA
   ResMgr

      Rev 1.58   08 Nov 1996 17:38:14   OM
   DB-Mode fuer Serienbriefe und Etiketten zum Teil wiederbelebt

      Rev 1.57   24 Oct 1996 13:36:04   JP
   String Umstellung: [] -> GetChar()

      Rev 1.56   18 Oct 1996 12:12:46   MA
   fixes und opts

      Rev 1.55   17 Oct 1996 16:54:36   MA
   #31660# und diverse weitere fixes

      Rev 1.54   26 Sep 1996 09:03:30   MA
   defautls fuer Rahmen + Aufraeumarbeiten

      Rev 1.53   25 Sep 1996 14:10:24   OM
   Neue Datenbanktrenner

-------------------------------------------------------------------------*/


diff --git a/sw/source/ui/app/apphdl.cxx b/sw/source/ui/app/apphdl.cxx
new file mode 100644
index 0000000..cf78e5e
--- /dev/null
+++ b/sw/source/ui/app/apphdl.cxx
@@ -0,0 +1,1389 @@
/*************************************************************************
 *
 *  $RCSfile: apphdl.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:31 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "hintids.hxx"

#ifndef _URLOBJ_HXX
#include <tools/urlobj.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif

#ifndef _SFXEVENT_HXX //autogen
#include <sfx2/event.hxx>
#endif

#ifndef _SFX_SAVEOPT_HXX //autogen
#include <sfx2/saveopt.hxx>
#endif

#define _SVSTDARR_STRINGSDTOR
#include <svtools/svstdarr.hxx>

#ifndef SVTOOLS_URIHELPER_HXX
#include <svtools/urihelper.hxx>
#endif
#ifndef _SVX_SRCHITEM_HXX
#include <svx/srchitem.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _SFX_WHITER_HXX //autogen
#include <svtools/whiter.hxx>
#endif
#ifndef _SFXSTBMGR_HXX //autogen
#include <sfx2/stbmgr.hxx>
#endif
#ifndef _SFXISETHINT_HXX //autogen
#include <svtools/isethint.hxx>
#endif
#ifndef _SVX_DLG_HYPERLINK_HXX //autogen
#include <offmgr/hyprlink.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _OFA_OSPLCFG_HXX //autogen
#include <offmgr/osplcfg.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _SVX_ADRITEM_HXX //autogen
#include <svx/adritem.hxx>
#endif
#ifndef _SV_CLIP_HXX //autogen
#include <vcl/clip.hxx>
#endif
#ifndef _DATAEX_HXX //autogen
#include <dataex.hxx>
#endif
#ifndef _VCL_MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _VCL_WRKWIN_HXX //autogen
#include <vcl/wrkwin.hxx>
#endif
#ifndef _SVX_INSCTRL_HXX //autogen
#include <svx/insctrl.hxx>
#endif
#ifndef _SVX_SELCTRL_HXX //autogen
#include <svx/selctrl.hxx>
#endif
#ifndef _NAVICFG_HXX
#include <navicfg.hxx>
#endif

#include "view.hxx"
#include "wrtsh.hxx"
#include "finder.hxx"
#include "docsh.hxx"
#include "cmdid.h"          // Funktion-Ids
#include "initui.hxx"
#include "uitool.hxx"
#include "swmodule.hxx"
#include "wdocsh.hxx"
#include "wview.hxx"
#include "wizzard.hxx"      // Wizzards
#include "usrpref.hxx"
#include "gloslst.hxx"      // SwGlossaryList
#include "glosdoc.hxx"      // SwGlossaryList
#include "doc.hxx"
#include "cfgitems.hxx"
#include "prtopt.hxx"
#include "srcvcfg.hxx"
#include "modcfg.hxx"
#include "globals.h"        // globale Konstanten z.B.
#include "cfgid.h"
#include "app.hrc"
#ifndef _USRPREF_HXX //autogen
#include <usrpref.hxx>
#endif
#ifndef _PRTOPT_HXX //autogen
#include <prtopt.hxx>
#endif
#ifndef _MODOPT_HXX //autogen
#include <modcfg.hxx>
#endif
#ifndef _FONTCFG_HXX //autogen
#include <fontcfg.hxx>
#endif
#include "barcfg.hxx"
#ifndef _UINUMS_HXX //autogen
#include <uinums.hxx>
#endif

#ifndef _LINGU_LNGPROPS_HHX_
#include <lingu/lngprops.hxx>
#endif
#ifndef _UNO_LINGU_HXX
#include <svx/unolingu.hxx>
#endif
#ifndef _SFX_SFXUNO_HXX
#include <sfx2/sfxuno.hxx>
#endif
#ifndef _COM_SUN_STAR_BEANS_PROPERTYVALUES_HPP_
#include <com/sun/star/beans/PropertyValues.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
#include <com/sun/star/beans/XPropertySet.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_PROPERTYVALUE_HPP_
#include <com/sun/star/beans/PropertyValue.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_PROPERTYSTATE_HPP_
#include <com/sun/star/beans/PropertyState.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSETINFO_HPP_
#include <com/sun/star/beans/XPropertySetInfo.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_XMULTIPROPERTYSET_HPP_
#include <com/sun/star/beans/XMultiPropertySet.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_XFASTPROPERTYSET_HPP_
#include <com/sun/star/beans/XFastPropertySet.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_XVETOABLECHANGELISTENER_HPP_
#include <com/sun/star/beans/XVetoableChangeListener.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSTATE_HPP_
#include <com/sun/star/beans/XPropertyState.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSTATECHANGELISTENER_HPP_
#include <com/sun/star/beans/XPropertyStateChangeListener.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_PROPERTYATTRIBUTE_HPP_
#include <com/sun/star/beans/PropertyAttribute.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_XPROPERTIESCHANGELISTENER_HPP_
#include <com/sun/star/beans/XPropertiesChangeListener.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYCHANGELISTENER_HPP_
#include <com/sun/star/beans/XPropertyChangeListener.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYACCESS_HPP_
#include <com/sun/star/beans/XPropertyAccess.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYCONTAINER_HPP_
#include <com/sun/star/beans/XPropertyContainer.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_PROPERTYSTATECHANGEEVENT_HPP_
#include <com/sun/star/beans/PropertyStateChangeEvent.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_PROPERTYCHANGEEVENT_HPP_
#include <com/sun/star/beans/PropertyChangeEvent.hpp>
#endif

using namespace ::com::sun::star;

#define C2S(cChar) String::CreateFromAscii(cChar)
/*--------------------------------------------------------------------
    Beschreibung: Slotmaps fuer Methoden der Applikation
 --------------------------------------------------------------------*/


// hier werden die SlotID's included
// siehe Idl-File
//
#define SwModule
#define ViewSettings
#define WebViewSettings
#define PrintSettings
#define _ExecAddress ExecOther
#define _StateAddress StateOther
#include "itemdef.hxx"
#include <svx/svxslots.hxx>
#include "swslots.hxx"


SFX_IMPL_INTERFACE( SwModule, SfxModule, SW_RES(RID_SW_NAME) )
{
    SFX_CHILDWINDOW_REGISTRATION(SvxHyperlinkDlgWrapper::GetChildWindowId());
    SFX_STATUSBAR_REGISTRATION(SW_RES(CFG_STATUSBAR));
}

/*------------------------------------------------------------------------
 Beschreibung:  Funktionen Ansicht
------------------------------------------------------------------------*/

void lcl_SetViewMetaChars( SwViewOption& rVOpt, sal_Bool bOn)
{
    rVOpt.SetViewMetaChars( bOn );
    if(bOn && !(rVOpt.IsParagraph()     ||
            rVOpt.IsTab()       ||
            rVOpt.IsLineBreak() ||
            rVOpt.IsBlank()))
    {
        rVOpt.SetParagraph(bOn);
        rVOpt.SetTab(bOn);
        rVOpt.SetLineBreak(bOn);
        rVOpt.SetBlank(bOn);
    }
}


sal_Bool lcl_IsViewMarks( const SwViewOption& rVOpt )
{
    return  rVOpt.IsHardBlank() &&
            rVOpt.IsSoftHyph() &&
            rVOpt.IsTox() &&
            rVOpt.IsFootNote() &&
            rVOpt.IsField();
}


void lcl_SetViewMarks(SwViewOption& rVOpt, sal_Bool bOn )
{
    rVOpt.SetHardBlank(bOn);
    rVOpt.SetSoftHyph(bOn);
    rVOpt.SetTox(bOn);
    rVOpt.SetFootNote(bOn);
    rVOpt.SetField(bOn);
    rVOpt.SetRef(bOn);
}

/*--------------------------------------------------------------------
    Beschreibung:   State mit CheckMark fuer ViewOptions
 --------------------------------------------------------------------*/


void SwModule::StateViewOptions(SfxItemSet &rSet)
{
    SfxWhichIter aIter(rSet);
    sal_uInt16 nWhich = aIter.FirstWhich();
    SfxBoolItem aBool;
    const SwViewOption* pOpt = 0;
    SwView* pActView = ::GetActiveView();
    SwDoc *pDoc = 0;
    if(pActView)
    {
        pOpt = pActView->GetWrtShell().GetViewOptions();
        pDoc = pActView->GetDocShell()->GetDoc();
    }

    while(nWhich)
    {
        if(pActView)
        {
            sal_Bool bReadonly = pActView->GetDocShell()->IsReadOnly();
            sal_Bool bBrowse = pDoc ? pDoc->IsBrowseMode() : sal_False;
            if ( bReadonly && nWhich != FN_VIEW_GRAPHIC )
            {
                rSet.DisableItem(nWhich);
                nWhich = 0;
            }
            switch(nWhich)
            {
                case FN_RULER:
                    aBool.SetValue( pActView->StatTab() );  break;
                case FN_VIEW_BOUNDS:
                    aBool.SetValue( pOpt->IsSubsLines() ); break;
                case FN_VIEW_GRAPHIC:
                    aBool.SetValue( !pOpt->IsGraphic() ); break;
                case FN_VIEW_FIELDS:
                    aBool.SetValue( pOpt->IsField() ); break;
                case FN_VIEW_FIELDNAME:
                    aBool.SetValue( pOpt->IsFldName() ); break;
                case FN_VIEW_MARKS:
                    aBool.SetValue( lcl_IsViewMarks(*pOpt) ); break;
                case FN_VIEW_META_CHARS:
                    aBool.SetValue( pOpt->IsViewMetaChars() ); break;
                case FN_VIEW_TABLEGRID:
                    aBool.SetValue( pOpt->IsSubsTable() ); break;
                case FN_VIEW_HIDDEN_PARA:
                    aBool.SetValue( pOpt->IsShowHiddenPara()); break;
                case SID_GRID_VISIBLE:
                    aBool.SetValue( pOpt->IsGridVisible() ); break;
                case SID_GRID_USE:
                    aBool.SetValue( pOpt->IsSnap() ); break;
                case SID_HELPLINES_MOVE:
                    aBool.SetValue( pOpt->IsCrossHair() ); break;
                case FN_VIEW_SMOOTH_SCROLL:
                    aBool.SetValue( pOpt->IsSmoothScroll()); break;
                case FN_VLINEAL:
                    aBool.SetValue( pActView->StatVLineal() ); break;
                case FN_HSCROLLBAR:
                    if(bBrowse)
                    {
                        rSet.DisableItem(nWhich);
                        nWhich = 0;
                    }
                    else
                        aBool.SetValue( pActView->StatHScrollbar() ); break;
                case FN_VSCROLLBAR:
                    aBool.SetValue( pActView->StatVScrollbar() ); break;
                case SID_AUTOSPELL_CHECK:
                    aBool.SetValue( pOpt->IsOnlineSpell() );
                break;
                case SID_AUTOSPELL_MARKOFF:
                    aBool.SetValue( pOpt->IsHideSpell() );
                break;
                case FN_SHADOWCURSOR:
                    if (pDoc == 0 || pDoc->IsBrowseMode())
                    {
                        rSet.DisableItem( nWhich );
                        nWhich = 0;
                    }
                    else
                        aBool.SetValue( pOpt->IsShadowCursor() );
                break;

            }
        }
        else
        {
            rSet.DisableItem( nWhich );
            nWhich = 0;
        }

        if( nWhich )
        {
            aBool.SetWhich( nWhich );
            rSet.Put( aBool );
        }
        nWhich = aIter.NextWhich();
    }
}

/*--------------------------------------------------------------------
    Beschreibung: Andere States
 --------------------------------------------------------------------*/


void SwModule::StateOther(SfxItemSet &rSet)
{
    SfxWhichIter aIter(rSet);
    sal_uInt16 nWhich = aIter.FirstWhich();

    SwView* pActView = ::GetActiveView();
    sal_Bool bWebView = 0 != PTR_CAST(SwWebView, pActView);

    while(nWhich)
    {
        switch(nWhich)
        {
            case FN_BUSINESS_CARD:
            case FN_LABEL:
            case FN_ENVELOP:
            {
                sal_Bool bDisable = sal_False;
                SfxViewShell* pView = SfxViewShell::Current();
                if( !pView || (pView && !pView->ISA(SwView)) )
                    bDisable = sal_True;
                SwDocShell *pDocSh = (SwDocShell*) SfxObjectShell::Current();
                if ( bDisable ||
                    (pDocSh &&    (pDocSh->IsReadOnly() ||
                                  pDocSh->GetCreateMode() == SFX_CREATE_MODE_EMBEDDED)) )
                    rSet.DisableItem( nWhich );

            }
            break;
            case FN_EDIT_FORMULA:
                {
                    SwWrtShell* pSh = 0;
                    int nSelection = 0;
                    if( pActView )
                        pSh = &pActView->GetWrtShell();
                    if( pSh )
                        nSelection = pSh->GetSelectionType();

                    if( (pSh && pSh->HasSelection()) ||
                        !(nSelection & (SwWrtShell::SEL_TXT | SwWrtShell::SEL_TBL)))
                        rSet.DisableItem(nWhich);
                }
            break;
            case SID_ATTR_ADDRESS:
            {
                rSet.Put(pPathFinder->GetAddress());
            }
            break;
            case SID_ATTR_UNDO_COUNT:
                rSet.Put(SfxUInt16Item( SID_ATTR_UNDO_COUNT, SwEditShell::GetUndoActionCount()));
            break;
            case SID_ATTR_METRIC:
                rSet.Put( SfxUInt16Item( SID_ATTR_METRIC, ::GetDfltMetric(bWebView)));
            break;
            case FN_SET_MODOPT_TBLNUMFMT:
                rSet.Put( SfxBoolItem( nWhich, pModuleConfig->
                                            IsInsTblFormatNum( bWebView )));
            break;

            default:
                DBG_ERROR("::StateOther: default");
        }
        nWhich = aIter.NextWhich();
    }
}

/*--------------------------------------------------------------------
    Beschreibung:   Wizzards
 --------------------------------------------------------------------*/


void SwModule::ExecWizzard(SfxRequest & rReq)
{
    Wizzard( rReq.GetSlot() );
}

/*--------------------------------------------------------------------
    Beschreibung:   Einstellungen fuer den Bildschirm
 --------------------------------------------------------------------*/



void SwModule::ExecViewOptions(SfxRequest &rReq)
{
    SwViewOption* pOpt = 0;
    OfficeApplication* pOffApp = OFF_APP();
    sal_Bool bModified = sal_True;
    if ( GetView() )
    {
        pOpt = new SwViewOption( *GetView()->GetWrtShell().GetViewOptions() );
        bModified = GetView()->GetWrtShell().IsModified();
    }
    else
    {
        pOpt = new SwViewOption();
        DBG_ERROR("ExecViewOptions: ohne View - falsche UsrPref?")
        MakeUsrPref(*pOpt, sal_False);
    }


    int eState = STATE_TOGGLE;
    sal_Bool bSet = sal_False;

    const SfxItemSet *pArgs = rReq.GetArgs();
    sal_uInt16 nSlot = rReq.GetSlot();
    const SfxPoolItem* pAttr;

    if( pArgs && SFX_ITEM_SET == pArgs->GetItemState( nSlot , sal_False, &pAttr ))
    {
        bSet = ((SfxBoolItem*)pAttr)->GetValue();
        eState = bSet ? STATE_ON : STATE_OFF;
    }


    int bFlag = STATE_ON == eState;
    // fuer die (WebViewSettings
    enum WebDepend
    {
        DEPEND_NONE,
        DEPEND_NOWEB,
        DEPEND_WEB
    }eWebDepend = DEPEND_NONE;

    uno::Reference< beans::XPropertySet >  xLngProp( ::GetLinguPropertySet() );

    switch ( nSlot )
    {
        case FN_VIEW_GRAPHIC:

                if( STATE_TOGGLE == eState )
                    bFlag = !pOpt->IsGraphic();
                pOpt->SetGraphic( bFlag );
                break;

        case FN_VIEW_FIELDS:
                if( STATE_TOGGLE == eState )
                    bFlag = !pOpt->IsField() ;

                pOpt->SetField( bFlag );
                pOpt->SetRef( bFlag );
                break;

        case FN_VIEW_BOUNDS:

                if( STATE_TOGGLE == eState )
                    bFlag = !pOpt->IsSubsLines();

                pOpt->SetSubsLines( bFlag );
                break;

        case SID_GRID_VISIBLE:
                if( STATE_TOGGLE == eState )
                    bFlag = !pOpt->IsGridVisible();

                pOpt->SetGridVisible( bFlag );
                break;

        case SID_GRID_USE:
                if( STATE_TOGGLE == eState )
                    bFlag = !pOpt->IsSnap();

                pOpt->SetSnap( bFlag );
                break;

        case SID_HELPLINES_MOVE:
                if( STATE_TOGGLE == eState )
                    bFlag = !pOpt->IsCrossHair();

                pOpt->SetCrossHair( bFlag );
                break;

        case FN_VIEW_HIDDEN_PARA:
                if ( STATE_TOGGLE == eState )
                    bFlag = !pOpt->IsShowHiddenPara();

                pOpt->SetShowHiddenPara( bFlag );
                break;

        case FN_VIEW_SMOOTH_SCROLL:

                if ( STATE_TOGGLE == eState )
                    bFlag = !pOpt->IsSmoothScroll();

                pOpt->SetSmoothScroll( bFlag );
                break;


        case FN_VLINEAL:
                if( STATE_TOGGLE == eState )
                    bFlag = !pOpt->IsViewVLin();

                pOpt->SetViewVLin( bFlag );
                break;

        case FN_VSCROLLBAR:
                if( STATE_TOGGLE == eState )
                    bFlag = !pOpt->IsViewVScrollBar();

                pOpt->SetViewVScrollBar( bFlag );
                break;

        case FN_HSCROLLBAR:
                if( STATE_TOGGLE == eState )
                    bFlag = !pOpt->IsViewHScrollBar();

                pOpt->SetViewHScrollBar( bFlag );
                break;
        case FN_RULER:
                if( STATE_TOGGLE == eState )
                    bFlag = !pOpt->IsViewTabwin();

                pOpt->SetViewTabwin( bFlag );
                break;

        case FN_VIEW_TABLEGRID:
                if( STATE_TOGGLE == eState )
                    bFlag = !pOpt->IsSubsTable();

                pOpt->SetSubsTable( bFlag );
                break;

        case FN_VIEW_FIELDNAME:
                if( STATE_TOGGLE == eState )
                    bFlag = !pOpt->IsFldName() ;

                pOpt->SetFldName( bFlag );
                break;
        case FN_VIEW_MARKS:
                if( STATE_TOGGLE == eState )
                    bFlag = !lcl_IsViewMarks(*pOpt) ;

                lcl_SetViewMarks( *pOpt, bFlag );
                break;
        case FN_VIEW_META_CHARS:
                if( STATE_TOGGLE == eState )
                    bFlag = !pOpt->IsViewMetaChars();

                lcl_SetViewMetaChars( *pOpt, bFlag );
        break;
        case SID_AUTOSPELL_CHECK:
            if( STATE_TOGGLE == eState )
                bFlag = bSet = !pOpt->IsOnlineSpell();

            pOpt->SetOnlineSpell(bSet);
            if (xLngProp.is())
            {
                uno::Any aVal(&bSet, ::getCppuBooleanType());
                xLngProp->setPropertyValue( C2S(UPN_IS_SPELL_AUTO), aVal );
            }
            //pOffApp->GetLinguConfig()->SetDefault( sal_False );

            if (!(STATE_TOGGLE == eState && bSet && ( pOpt->IsHideSpell() )))
                break;
        case SID_AUTOSPELL_MARKOFF:
            if( STATE_TOGGLE == eState )
                bFlag = bSet = !pOpt->IsHideSpell();

            pOpt->SetHideSpell(bSet);
            if (xLngProp.is())
            {
                uno::Any aVal(&bSet, ::getCppuBooleanType());
                xLngProp->setPropertyValue( C2S(UPN_IS_SPELL_HIDE), aVal );
            }
            //pOffApp->GetLinguConfig()->SetDefault( sal_False );
        break;

        case FN_SHADOWCURSOR:
            if( STATE_TOGGLE == eState )
                bFlag = bSet = !pOpt->IsShadowCursor();

            pOpt->SetShadowCursor(bSet);
        break;

        default:
            ASSERT(sal_False, Falsche Request-Methode);
            return;
    }

    // UserPrefs setzen Request als bearbeitet kennzeichnen
    SwView* pApplyView = GetView();
    sal_Bool bWebView =  0 != PTR_CAST(SwWebView, pApplyView);
    // die ViewSettings duerfen nur der View zugewiesen werden,
    // wenn es auch die richtigen sind
    if(pApplyView && DEPEND_NONE != eWebDepend)
    {
        if(bWebView && DEPEND_NOWEB == eWebDepend ||
            !bWebView && DEPEND_WEB == eWebDepend )
                pApplyView = 0;
    }
    if( pApplyView )
    {
        SwWrtShell &rSh = GetView()->GetWrtShell();
        rSh.StartAction();
        if( !(*rSh.GetViewOptions() == *pOpt ))
        {
            rSh.ApplyViewOptions( *pOpt );

            //Die UsrPref muessen als Modified gekennzeichnet werden.
            if(bWebView)
            {
                // fuer die Initialisierung
                if(!pWebUsrPref)
                    GetUsrPref(sal_True);
                pWebUsrPref->SetDefault( sal_False );
            }
            else
            {
                if(!pUsrPref)
                    GetUsrPref(sal_False);
                pUsrPref->SetDefault( sal_False );
            }
            SW_MOD()->CheckSpellChanges( pOpt->IsOnlineSpell(), sal_False, sal_False );

        }
        //OS:   Modified wieder zuruecksetzen, weil Ansicht/Felder
        //      das Doc modified setzt.
        if( !bModified )
            rSh.ResetModified();
    }
    sal_uInt16 nDest = VIEWOPT_DEST_VIEW;
    if(DEPEND_WEB == eWebDepend )
        nDest = VIEWOPT_DEST_WEB;
    else if(DEPEND_NOWEB == eWebDepend)
        nDest = VIEWOPT_DEST_TEXT;
    ApplyUsrPref( *pOpt, pApplyView, nDest );
    if ( pApplyView )
        pApplyView->GetWrtShell().EndAction();

    delete pOpt;
    Invalidate(rReq.GetSlot());
    if(!pArgs)
        rReq.AppendItem(SfxUInt16Item(nSlot, bFlag));
}

/*--------------------------------------------------------------------
    Beschreibung:   Felddialog starten
 --------------------------------------------------------------------*/


void SwModule::ExecOther(SfxRequest& rReq)
{
    const SfxItemSet *pArgs = rReq.GetArgs();
    const SfxPoolItem* pItem = 0;

    sal_uInt16 nWhich = rReq.GetSlot();
    switch (nWhich)
    {
        case FN_ENVELOP:
            InsertEnv();
            break;

        case FN_BUSINESS_CARD:
        case FN_LABEL:
            InsertLab(nWhich == FN_LABEL);
            break;

        case SID_SW_DOCMAN_PATH:
            {
                ASSERT(pArgs && pArgs->Count(), "fehlende Parameter GetDocManPath");
                if(!pArgs)
                    return;

                String aParam(((const SfxStringItem &)pArgs->Get(rReq.GetSlot())).GetValue());
                String aPath;

                if(aParam == C2S("~~~GetMacroPath"))
                {
                    aPath = SFX_INIMANAGER()->Get( SFX_KEY_CONFIG_DIR );
                    aPath = URIHelper::SmartRelToAbs(aPath);
                    if(aPath.Len())
                        aPath += INET_PATH_TOKEN;
                }
                else if(aParam == C2S("~~~GetDefDocExt"))
                    aPath =
#if defined(PM2) || defined(MAC_WITHOUT_EXT)
                    aEmptyStr;
#else
                    C2S(".sdw");
#endif
                else if(aParam == C2S("~~~SetNoFrameBeep"))
                {
                    SwView* pActView = ::GetActiveView();
                    if( pActView && pActView->GetDocShell() )
                        pActView->GetDocShell()->GetDoc()->SetFrmBeepEnabled( sal_False );
                }
                else if(aParam == C2S("~~~SetFrameBeep"))
                {
                    SwView* pActView = ::GetActiveView();
                    if( pActView && pActView->GetDocShell() )
                        pActView->GetDocShell()->GetDoc()->SetFrmBeepEnabled( sal_True );
                }
                rReq.SetReturnValue(SfxStringItem( SID_SW_DOCMAN_PATH, aPath ));
            }
            break;

        case SID_ATTR_ADDRESS:
        {
            if(pArgs && SFX_ITEM_SET == pArgs->GetItemState(nWhich, sal_False, &pItem))
            {
                pPathFinder->SetAddress( *(SvxAddressItem*)pItem );
            }
        }
        break;
        case SID_ATTR_UNDO_COUNT:
        if(pArgs && SFX_ITEM_SET == pArgs->GetItemState(nWhich, sal_False, &pItem))
        {
            const int nNew = ((SfxUInt16Item*)pItem)->GetValue();
            const int nOld = SwEditShell::GetUndoActionCount();
            if(!nNew || !nOld)
            {
                sal_Bool bUndo = nNew != 0;
                //ueber DocShells iterieren und Undo umschalten

                TypeId aType(TYPE(SwDocShell));
                SwDocShell* pDocShell = (SwDocShell*)SfxObjectShell::GetFirst(&aType);
                while( pDocShell )
                {
                    pDocShell->GetDoc()->DoUndo( bUndo );
                    pDocShell = (SwDocShell*)SfxObjectShell::GetNext(*pDocShell, &aType);
                }
            }
            SwEditShell::SetUndoActionCount( nNew );
            // intern kommt der Request aus dem Dialog, dort werden die Options gesetzt
            if(rReq.IsAPI())
                OFF_APP()->GetOptions().SetUndoCount(  nNew );
            break;
        }
        break;
        case SID_ATTR_METRIC:
        if(pArgs && SFX_ITEM_SET == pArgs->GetItemState(nWhich, sal_False, &pItem))
        {
            FieldUnit eUnit = (FieldUnit)((const SfxUInt16Item*)pItem)->GetValue();
            switch( eUnit )
            {
                case FUNIT_MM:
                case FUNIT_CM:
                case FUNIT_INCH:
                case FUNIT_PICA:
                case FUNIT_POINT:
                {
                    SwView* pActView = ::GetActiveView();
                    sal_Bool bWebView = 0 != PTR_CAST(SwWebView, pActView);
                    ::SetDfltMetric(eUnit, bWebView);
                    OFF_APP()->GetOptions().SetMetric(eUnit);
                }
                break;
            }
        }
        break;

        case FN_SET_MODOPT_TBLNUMFMT:
            {
                sal_Bool bWebView = 0 != PTR_CAST(SwWebView, ::GetActiveView() ),
                     bSet;

                if( pArgs && SFX_ITEM_SET == pArgs->GetItemState(
                        nWhich, sal_False, &pItem ))
                    bSet = ((SfxBoolItem*)pItem)->GetValue();
                else
                    bSet = !pModuleConfig->IsInsTblFormatNum( bWebView );

                pModuleConfig->SetInsTblFormatNum( bWebView, bSet );
            }
            break;
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

/*
SfxMacro *SwWriterApp::CreateMacro() const
{
    return BasicIDE::CreateMacro();
} */

/*--------------------------------------------------------------------
    Beschreibung: Notifies abfangen
 --------------------------------------------------------------------*/


    // Hint abfangen fuer DocInfo
void SwModule::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
{
    if( rHint.ISA( SfxEventHint ) )
    {
        SfxEventHint& rEvHint = (SfxEventHint&) rHint;
        SwDocShell* pDocSh = PTR_CAST( SwDocShell, rEvHint.GetObjShell() );
        if( pDocSh )
        {
            SwWrtShell* pWrtSh = pDocSh ? pDocSh->GetWrtShell() : 0;
            switch( rEvHint.GetEventId() )
            {
/*          MA 07. Mar. 96: UpdateInputFlds() nur noch bei Dokument neu.
                                (Und bei Einfuegen Textbaust.)
                case SFX_EVENT_OPENDOC:
                // dann am aktuellen Dokument die Input-Fedler updaten
                if( pWrtSh )
                    pWrtSh->UpdateInputFlds();
                break;
*/
            case SFX_EVENT_CREATEDOC:
                // alle FIX-Date/Time Felder auf akt. setzen
                if( pWrtSh )
                {
                    pWrtSh->SetFixFields();
                    pWrtSh->UpdateInputFlds();

                    // Sind Datenbankfelder enthalten?
                    // Erstmal alle verwendeten Datenbanken holen
                    SwDoc *pDoc = pDocSh->GetDoc();
                    SvStringsDtor aDBNameList;
                    pDoc->GetAllUsedDB( aDBNameList );
                    sal_uInt16 nCount = aDBNameList.Count();
                    if (nCount)
                    {   // Datenbankbeamer oeffnen
                        String sDBName = pDoc->GetDBName();
                        ShowDBObj(*pWrtSh, sDBName);
                    }
                }
                break;
            }
        }
    }
    else if(rHint.ISA(SfxItemSetHint))
    {
        if( SFX_ITEM_SET == ((SfxItemSetHint&)rHint).GetItemSet().GetItemState(SID_ATTR_PATHNAME))
        {
            ::GetGlossaries()->UpdateGlosPath( sal_False );
            SwGlossaryList* pList = ::GetGlossaryList();
            if(pList->IsActive())
                pList->Update();
        }

        const SfxPoolItem* pItem = 0;

        if( SFX_ITEM_SET == ((SfxItemSetHint&)rHint).GetItemSet().GetItemState(SID_ATTR_ADDRESS, sal_False, &pItem))
        {
            sActAuthor = ((const SvxAddressItem*)pItem)->GetFirstName();
            sActAuthor += ' ';
            sActAuthor += ((const SvxAddressItem*)pItem)->GetName();
        }
    }
    else if(rHint.ISA(SfxSimpleHint) &&
        ((SfxSimpleHint&)rHint).GetId() == SFX_HINT_DEINITIALIZING)
    {
        // Clipboard loslassen:
        if( pClipboard )
        {
            sal_Bool bFlushToSystem = sal_False;
            if( VclClipboard::ExistsSystemClipboard() )
            {
                if( pClipboard->IsBig() )
                {
                    QueryBox aBox( 0, SW_RES(MSG_CLPBRD_CLEAR) );
                    if( RET_YES == aBox.Execute() )
                        bFlushToSystem = sal_True;
                }
                else
                    bFlushToSystem = sal_True;
            }

            if ( pClipboard )
            {
                VclClipboard::ReleaseClipboard( bFlushToSystem );
                ASSERT( !pClipboard, "can't get off this Clipboard" );
            }
        }

        if(pSrcViewConfig)
        {
            if(!pSrcViewConfig->IsDefault())
                pSrcViewConfig->StoreConfig();
            DELETEZ( pSrcViewConfig );
        }

        DELETEZ(pWebUsrPref);
        DELETEZ(pUsrPref)   ;
        DELETEZ(pModuleConfig);
        DELETEZ(pPrtOpt)      ;
        DELETEZ(pWebPrtOpt)   ;
        DELETEZ(pChapterNumRules);
        DELETEZ(pStdFontConfig)     ;
        DELETEZ(pNavigationConfig)  ;
        DELETEZ(pToolbarConfig)     ;
        DELETEZ(pWebToolbarConfig)  ;
        DELETEZ(pAuthorNames)       ;
    }
}
void SwModule::FillStatusBar( StatusBar& rStatusBar )
{
    // Hier den StatusBar initialisieren
    // und Elemente reinschieben

    // Anzeige Seite
    String aTmp; aTmp.Fill( 10, 'X' );
    rStatusBar.InsertItem( FN_STAT_PAGE, rStatusBar.GetTextWidth(
                                    aTmp ), SIB_AUTOSIZE | SIB_LEFT);
    rStatusBar.SetHelpId(FN_STAT_PAGE, FN_STAT_PAGE);

    // Seitenvorlage
    aTmp.Fill( 15, 'X' );
    rStatusBar.InsertItem( FN_STAT_TEMPLATE, rStatusBar.GetTextWidth(
                                    aTmp ), SIB_AUTOSIZE | SIB_LEFT );
    rStatusBar.SetHelpId(FN_STAT_TEMPLATE, FN_STAT_TEMPLATE);

    // Zoomeinstellungen
    rStatusBar.InsertItem( SID_ATTR_ZOOM, rStatusBar.GetTextWidth(
                                                            C2S("1000%")) );
    rStatusBar.SetHelpId(SID_ATTR_ZOOM, SID_ATTR_ZOOM);

    // Insert/Overwrite
    rStatusBar.InsertItem( SID_ATTR_INSERT,
        SvxInsertStatusBarControl::GetDefItemWidth(rStatusBar));
    rStatusBar.SetHelpId(SID_ATTR_INSERT, SID_ATTR_INSERT);

    // awt::Selection-Modus
    rStatusBar.InsertItem( FN_STAT_SELMODE,
            SvxSelectionModeControl::GetDefItemWidth(rStatusBar));

    rStatusBar.SetHelpId(FN_STAT_SELMODE, FN_STAT_SELMODE);

    // Hyperlink ausfuehren/bearbeiten
    rStatusBar.InsertItem( FN_STAT_HYPERLINKS, rStatusBar.GetTextWidth(
                                                            C2S("HYP")) );
    rStatusBar.SetHelpId(FN_STAT_HYPERLINKS, FN_STAT_HYPERLINKS);

    // Dokument geaendert
    rStatusBar.InsertItem( SID_DOC_MODIFIED, rStatusBar.GetTextWidth(
                                                                C2S("*")));
    rStatusBar.SetHelpId(SID_DOC_MODIFIED, SID_DOC_MODIFIED);

    // den aktuellen Context anzeigen Uhrzeit / FrmPos / TabellenInfo
    aTmp.Fill( 25, sal_Unicode('X') );
    rStatusBar.InsertItem( SID_ATTR_SIZE, rStatusBar.GetTextWidth(
                    aTmp ), SIB_AUTOSIZE | SIB_LEFT | SIB_USERDRAW);
    rStatusBar.SetHelpId(SID_ATTR_SIZE, SID_ATTR_SIZE);
}

/*-----------------18.11.96 10.42-------------------

--------------------------------------------------*/

SwSrcViewConfig* SwModule::GetSourceViewConfig()
{
    if(!pSrcViewConfig)
    {
        pSrcViewConfig = new SwSrcViewConfig();
        pSrcViewConfig->Initialize();
    }
    return pSrcViewConfig;
}

/*-----------------30.01.97 08.30-------------------

--------------------------------------------------*/
const SwMasterUsrPref *SwModule::GetUsrPref(sal_Bool bWeb)
{
    if(bWeb && !pWebUsrPref)
    {
        // im Load der SwMasterUsrPref wird der SpellChecker gebraucht, dort darf
        // er aber nicht angelegt werden #58256#
        pWebUsrPref = new SwMasterUsrPref(CFG_SWWEB_USRPREF);
        pWebUsrPref->Initialize();
    }
    else if(!bWeb && !pUsrPref)
    {
        pUsrPref = new SwMasterUsrPref(CFG_USERPREF_ITEM);
        pUsrPref->Initialize();
    }
    return  bWeb ? pWebUsrPref : pUsrPref;
}

/*-------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.289  2000/09/18 16:05:09  willem.vandorp
    OpenOffice header added.

    Revision 1.288  2000/09/08 15:11:56  os
    use configuration service

    Revision 1.287  2000/07/18 12:50:07  os
    replace ofadbmgr

    Revision 1.286  2000/06/26 13:03:00  os
    INetURLObject::SmartRelToAbs removed

    Revision 1.285  2000/06/16 08:25:40  martin.hollmichel
    add: header

    Revision 1.284  2000/06/13 09:56:08  os
    using UCB

    Revision 1.283  2000/05/26 07:21:27  os
    old SW Basic API Slots removed

    Revision 1.282  2000/05/11 12:00:13  tl
    if[n]def ONE_LINGU und alte SUPD entfernt

    Revision 1.281  2000/05/10 11:52:26  os
    Basic API removed

    Revision 1.280  2000/05/09 14:40:15  os
    BASIC interface partially removed

    Revision 1.279  2000/05/08 11:23:33  os
    CreateSubObject

    Revision 1.278  2000/04/11 08:01:30  os
    UNICODE

    Revision 1.277  2000/03/21 15:47:50  os
    UNOIII


    Revision 1.276  2000/03/14 13:47:26  jp
    GetAppWindow() - misuse as parent window eliminated

    Revision 1.275  2000/03/08 17:21:49  os
    GetAppWindow() - misuse as parent window eliminated

    Revision 1.274  2000/01/31 10:14:56  tl
    #71447# workaround removed

    Revision 1.273  2000/01/11 16:24:13  jp
    Bug #71447#: set config as modified if AutoSpell-Flag is changed

    Revision 1.272  2000/01/11 10:20:04  tl
    #70735# CheckSpellChanges now called from SW_MOD for ONE_LINGU

    Revision 1.271  1999/11/30 10:18:55  jp
    Task #70259#: more entries into to the popup menus

    Revision 1.270  1999/11/29 14:39:27  tl
    fixed old header merge problem

    Revision 1.269  1999/11/25 09:27:46  tl
    SvxGetLinguPropertySet => ::GetLinguPropertySet

    Revision 1.266  1999/10/27 11:00:45  hr
    #65293#

    Revision 1.265  1999/10/25 19:36:26  tl
    ongoing ONE_LINGU implementation

    Revision 1.264  1999/10/21 17:45:23  jp
    have to change - SearchFile with SfxIniManager, dont use SwFinder for this

    Revision 1.263  1999/09/28 13:17:45  os
    #67382# separate dialog for business cards

    Revision 1.262  1999/08/31 08:33:52  TL
    #if[n]def ONE_LINGU inserted (for transition of lingu to StarOne)


      Rev 1.261   31 Aug 1999 10:33:52   TL
   #if[n]def ONE_LINGU inserted (for transition of lingu to StarOne)

      Rev 1.260   04 Feb 1999 21:13:04   JP
   Bug #61404#/61014#: neu: SetFixFields statt zweier Methoden

      Rev 1.259   04 Jan 1999 13:41:38   OS
   #60209# StatusBar: Groessen uber GetDefItemWidth am Controller ermitteln

      Rev 1.258   26 Nov 1998 15:20:44   MA
   #59896# Raster usw jetzt an der Application

      Rev 1.257   23 Nov 1998 17:36:52   JP
   Bug #59754#: TerminateHdl wird nicht mehr fuers Clipboard benoetigt

      Rev 1.256   05 Nov 1998 11:22:10   OS
   #58396# ConfigItems im Notify loeschen

      Rev 1.255   21 Oct 1998 15:29:20   OS
   #58256# Spellchecker vor dem Load der UsrPref anziehen

      Rev 1.254   05 Oct 1998 17:29:26   HR
   UPD->SUPD

      Rev 1.253   08 Sep 1998 16:48:10   OS
   #56134# Metric fuer Text und HTML getrennt

      Rev 1.252   15 Jul 1998 12:51:00   OS
   Navigator an der SwView registrieren #34794#

      Rev 1.251   09 Jul 1998 17:13:24   MA
   muss: kein docman mehr

      Rev 1.250   15 May 1998 17:26:10   OM
   #50043# DirectCursor nicht im OnlineLayout

      Rev 1.249   03 Apr 1998 14:39:16   OS
   RID_DEFAULTTOLOLBOX endlich entsorgt

      Rev 1.248   16 Mar 1998 19:09:12   OM
   Zugriff auf Ini optimiert

      Rev 1.247   12 Feb 1998 14:28:44   OS
   SID_TOGGLESTATUSBAR

      Rev 1.246   29 Jan 1998 14:20:38   OS
   SvxItemFactory an der DesktopApplication anlegen #46753#

      Rev 1.245   26 Jan 1998 09:12:54   OS
   neu: WebViewSettings

      Rev 1.244   22 Dec 1997 17:16:26   MA
   ShadowCursor

      Rev 1.243   10 Dec 1997 14:42:32   OM
   Fixe DocInfoFelder

      Rev 1.242   03 Dec 1997 17:01:24   OS
   Statuszeile per Basic geht wieder #45887#

      Rev 1.241   28 Nov 1997 14:17:14   MA
   includes

      Rev 1.240   28 Nov 1997 11:00:36   TJ
   include

      Rev 1.239   24 Nov 1997 14:22:46   MA
   includes

      Rev 1.238   11 Nov 1997 14:02:58   MA
   precomp entfernt

      Rev 1.237   03 Nov 1997 16:13:08   JP
   neu: Optionen/-Page/Basic-Schnittst. fuer ShadowCursor

      Rev 1.236   01 Sep 1997 13:06:38   OS
   DLL-Umstellung

      Rev 1.235   12 Aug 1997 14:42:40   OS
   Header-Umstellung

      Rev 1.234   08 Aug 1997 17:27:00   OM
   Headerfile-Umstellung

      Rev 1.233   05 Aug 1997 16:09:20   TJ
   include svx/srchitem.hxx

      Rev 1.232   08 Jul 1997 14:04:16   OS
   ConfigItems von der App ans Module

      Rev 1.231   11 Jun 1997 14:47:10   OM
   DB-Beamer bei Vorlagen mit DB-Feldern oeffnen

      Rev 1.230   09 Jun 1997 14:28:18   MA
   chg: Browse-Flag nur noch am Doc

      Rev 1.229   06 Jun 1997 12:43:18   MA
   chg: versteckte Absaetze ausblenden

      Rev 1.228   05 Jun 1997 09:32:50   OS
   FN_INSERT_HEADER/FOOTER invalidieren #40441#

      Rev 1.227   28 May 1997 18:17:28   HJS
   includes

      Rev 1.226   28 May 1997 08:13:06   OS
   SID_ATTR_METRIC am SwModule ausfuehren fr #40192#

      Rev 1.225   05 May 1997 08:02:14   OS
   SID_MAIL_NOTIFY mit richtigen Parametern im  StatusBar

      Rev 1.224   25 Apr 1997 09:19:52   OS
   SID_MAIL_NOTIFY in der Statuszeile

      Rev 1.223   11 Apr 1997 11:00:08   MA
   includes

      Rev 1.222   07 Apr 1997 15:31:10   MH
   chg: header

      Rev 1.221   01 Apr 1997 16:25:56   MH
   add: include sfxdcmn.hxx

      Rev 1.220   23 Mar 1997 23:47:42   OS
   Mail nicht mehr in der Statuszeile

      Rev 1.219   19 Mar 1997 09:26:22   NF
   includes (OS2)

      Rev 1.218   10 Mar 1997 09:29:48   JP
   neues Flag am Doc, um die Beeps aus dem LayoutPaint abzuschalten

      Rev 1.217   05 Feb 1997 18:47:20   MH
   inetdlg.hxx raus

      Rev 1.216   05 Feb 1997 13:34:44   OS
   PrintOptins auch fuer Web

      Rev 1.215   30 Jan 1997 11:10:30   OS
   UsrPrefs verdoppelt; neu: FN_PRINT_LAYOUT

      Rev 1.214   27 Jan 1997 16:25:58   OS
   HtmlMode entfernt

      Rev 1.213   14 Jan 1997 14:25:00   OS
   pModuleConfig immer anlegen

      Rev 1.212   13 Jan 1997 16:45:24   OS
   neu: SwModuleOptions

      Rev 1.211   19 Dec 1996 16:05:50   OS
   BrowseMode mit HtmlMode koppeln; SetPrinter nur, wenn keiner da ist

      Rev 1.210   13 Dec 1996 14:34:08   OS
   UndoCount wird aus der SfxApp besorgt

      Rev 1.209   12 Dec 1996 20:30:32   OS
   GetSbxObject und ItemFactories von der App an das Module

      Rev 1.208   12 Dec 1996 08:41:18   OS
   GetSpellChecker an der App rufen

      Rev 1.207   11 Dec 1996 14:17:40   OS
   View nicht von der App holen; Spell-Opts auch an der MiscConfig setzen

      Rev 1.206   03 Dec 1996 16:56:48   AMA
   Chg: Der Drucker wird nur im !Browsemodus angelegt.

      Rev 1.205   26 Nov 1996 19:44:40   OS
   GetDocManPath mit SID_SW_DOCMAN_PATH

      Rev 1.204   25 Nov 1996 10:30:40   MA
   apptitle ist desktop, dafuer name fuer interface

      Rev 1.203   22 Nov 1996 13:05:44   OS
   neue Ids fuer Wizards

      Rev 1.202   18 Nov 1996 14:15:26   OS
   neu: GetSourceViewConfig am Module

      Rev 1.201   08 Nov 1996 19:39:36   MA
   ResMgr

      Rev 1.200   07 Nov 1996 16:20:40   OS
   FillStatusBar jetzt am Module

      Rev 1.199   05 Nov 1996 15:28:40   OS
   FN_BASIC war auch ueberfluessig

      Rev 1.198   01 Nov 1996 18:02:40   MA
   Writer Module

      Rev 1.197   24 Oct 1996 16:55:52   MA
   #32609#

      Rev 1.196   23 Oct 1996 13:49:10   JP
   SVMEM -> SVSTDARR Umstellung

      Rev 1.195   18 Oct 1996 11:14:14   OS
   SID_RULER_PROTECT auch fuer Browser-Umschaltung invalidieren

      Rev 1.194   27 Sep 1996 13:59:48   OS
   Etiketten und Umschlaege nicht in Readonly-Docs

      Rev 1.193   27 Sep 1996 12:58:12   OS
   Aktualisieren der Autotexte nachdem die Pfade an der App veraendert wurden

      Rev 1.192   23 Sep 1996 08:21:54   OS
   Umschalten der Viewoptions nur noch per Bool

 -------------------------------------------------------------------------*/


diff --git a/sw/source/ui/app/applab.cxx b/sw/source/ui/app/applab.cxx
new file mode 100644
index 0000000..5c6f374
--- /dev/null
+++ b/sw/source/ui/app/applab.cxx
@@ -0,0 +1,759 @@
/*************************************************************************
 *
 *  $RCSfile: applab.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:31 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#if STLPORT_VERSION>=321
#include <cstdarg>
#endif

#define ITEMID_BOXINFO      SID_ATTR_BORDER_INNER
#include <hintids.hxx>

#ifndef _APP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _WRKWIN_HXX //autogen
#include <vcl/wrkwin.hxx>
#endif
#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SBASLTID_HRC //autogen
#include <offmgr/sbasltid.hrc>
#endif
#ifndef _SFX_BINDINGS_HXX //autogen
#include <sfx2/bindings.hxx>
#endif
#ifndef _SBA_SBAOBJ_HXX //autogen
#include <offmgr/sbaobj.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SFX_PRINTER_HXX //autogen
#include <sfx2/printer.hxx>
#endif
#ifndef _SVX_PBINITEM_HXX //autogen
#include <svx/pbinitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_PAPERINF_HXX
#include <svx/paperinf.hxx>
#endif
#ifndef _LINKMGR_HXX
#include <so3/linkmgr.hxx>
#endif
#ifndef _SVX_PROTITEM_HXX //autogen
#include <svx/protitem.hxx>
#endif
#ifndef _COM_SUN_STAR_FRAME_XSTORABLE_HPP_
#include <com/sun/star/frame/XStorable.hpp>
#endif
#ifndef _COM_SUN_STAR_FRAME_XMODEL_HPP_
#include <com/sun/star/frame/XModel.hpp>
#endif

#ifndef _FMTHDFT_HXX //autogen
#include <fmthdft.hxx>
#endif
#ifndef _FMTANCHR_HXX //autogen
#include <fmtanchr.hxx>
#endif
#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _FMTORNT_HXX //autogen
#include <fmtornt.hxx>
#endif
#ifndef _SWWAIT_HXX
#include <swwait.hxx>
#endif
#ifndef _GLOSHDL_HXX
#include <gloshdl.hxx>
#endif
#ifndef _GLOSSARY_HXX
#include <glossary.hxx>
#endif
#ifndef _MDIEXP_HXX
#include <mdiexp.hxx>
#endif
#ifndef _FRMATR_HXX
#include <frmatr.hxx>
#endif
#ifndef _PARATR_HXX
#include <paratr.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _FLDBAS_HXX
#include <fldbas.hxx>
#endif
#ifndef _SWUNDO_HXX
#include <swundo.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _DBMGR_HXX
#include <dbmgr.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _FMTCOL_HXX
#include <fmtcol.hxx>
#endif
#ifndef _EXPFLD_HXX
#include <expfld.hxx>
#endif
#ifndef _FLDMGR_HXX
#include <fldmgr.hxx>
#endif
#ifndef _LABEL_HXX
#include <label.hxx>
#endif
#ifndef _LABIMG_HXX
#include <labimg.hxx>
#endif
#ifndef _SECTION_HXX
#include <section.hxx>
#endif
#ifndef _PAGEDESC_HXX
#include <pagedesc.hxx>
#endif
#ifndef _POOLFMT_HXX
#include <poolfmt.hxx>
#endif

#ifndef _APP_HRC
#include <app.hrc>
#endif
#ifndef _POOLFMT_HRC
#include <poolfmt.hrc>
#endif

using namespace ::com::sun::star;
using namespace ::rtl;

// steht im appenv.cxx
extern sal_Bool InsertLabEnvText( SwWrtShell& , SwFldMgr& , const String& );

const char __FAR_DATA MASTER_LABEL[] = "MasterLabel";

// --------------------------------------------------------------------------

const SwFrmFmt *lcl_InsertBCText( SwWrtShell& rSh, const SwLabItem& rItem,
                        SwFrmFmt &rFmt,
                        sal_uInt16 nCol, sal_uInt16 nRow, sal_Bool bPage)
{
    SfxItemSet aSet(rSh.GetAttrPool(), RES_ANCHOR, RES_ANCHOR,
                        RES_VERT_ORIENT, RES_VERT_ORIENT, RES_HORI_ORIENT, RES_HORI_ORIENT, 0 );
    sal_uInt16 nPhyPageNum, nVirtPageNum;
    rSh.GetPageNum( nPhyPageNum, nVirtPageNum );

    aSet.Put(SwFmtAnchor(bPage ? FLY_IN_CNTNT : FLY_PAGE, nPhyPageNum));
    if (!bPage)
    {
        aSet.Put(SwFmtHoriOrient(rItem.lLeft + nCol * rItem.lHDist,
                                                    HORI_NONE, REL_PG_FRAME ));
        aSet.Put(SwFmtVertOrient(rItem.lUpper + nRow * rItem.lVDist,
                                                    VERT_NONE, REL_PG_FRAME ));
    }
    const SwFrmFmt *pFmt = rSh.NewFlyFrm(aSet, sal_True,  &rFmt );  // Fly einfuegen
    ASSERT( pFmt, "Fly not inserted" );

    rSh.UnSelectFrm();  //Rahmen wurde automatisch selektiert

    rSh.SetTxtFmtColl( rSh.GetTxtCollFromPool( RES_POOLCOLL_STANDARD ) );

    //
    if(!rItem.bSynchron || !(nCol|nRow))
    {
        SwGlossaryDlg::SetActGroup(rItem.sGlossaryGroup);
        SwGlossaryHdl* pGlosHdl = rSh.GetView().GetGlosHdl();
        pGlosHdl->SetCurGroup(rItem.sGlossaryGroup, sal_True);
        pGlosHdl->InsertGlossary( rItem.sGlossaryBlockName );
    }

    return pFmt;
}

const SwFrmFmt *lcl_InsertLabText( SwWrtShell& rSh, const SwLabItem& rItem,
                        SwFrmFmt &rFmt, SwFldMgr& rFldMgr,
                        sal_uInt16 nCol, sal_uInt16 nRow, sal_Bool bLast, sal_Bool bPage)
{
    SfxItemSet aSet(rSh.GetAttrPool(), RES_ANCHOR, RES_ANCHOR,
                        RES_VERT_ORIENT, RES_VERT_ORIENT, RES_HORI_ORIENT, RES_HORI_ORIENT, 0 );
    sal_uInt16 nPhyPageNum, nVirtPageNum;
    rSh.GetPageNum( nPhyPageNum, nVirtPageNum );

    aSet.Put(SwFmtAnchor(bPage ? FLY_IN_CNTNT : FLY_PAGE, nPhyPageNum));
    if (!bPage)
    {
        aSet.Put(SwFmtHoriOrient(rItem.lLeft + nCol * rItem.lHDist,
                                                    HORI_NONE, REL_PG_FRAME ));
        aSet.Put(SwFmtVertOrient(rItem.lUpper + nRow * rItem.lVDist,
                                                    VERT_NONE, REL_PG_FRAME ));
    }
    const SwFrmFmt *pFmt = rSh.NewFlyFrm(aSet, sal_True,  &rFmt );  // Fly einfuegen
    ASSERT( pFmt, "Fly not inserted" );

    rSh.UnSelectFrm();  //Rahmen wurde automatisch selektiert

    rSh.SetTxtFmtColl( rSh.GetTxtCollFromPool( RES_POOLCOLL_STANDARD ) );

    // Ggf. "Naechster Datensatz"
    if( (!rItem.bSynchron || !(nCol|nRow)) && InsertLabEnvText( rSh, rFldMgr, rItem.aWriting ) && !bLast )
        rFldMgr.InsertFld( TYP_DBNEXTSETFLD, 0, String::CreateFromAscii("sal_True"), aEmptyStr, 0, &rSh );

    return pFmt;
}

// ----------------------------------------------------------------------------


void SwModule::InsertLab(sal_Bool bLabel)
{
static sal_uInt16 nLabelTitleNo = 0;
static sal_uInt16 nBCTitleNo = 0;

    // DB-Manager anlegen
    SwNewDBMgr* pNewDBMgr = new SwNewDBMgr;

    // SwLabItem aus Config lesen
    SwLabCfgItem aLabCfg;
    aLabCfg.Initialize();

    // Dialog hochfahren
    SfxItemSet aSet( GetPool(), FN_LABEL, FN_LABEL, 0 );
    aSet.Put( bLabel ? aLabCfg.GetLabItem(): aLabCfg.GetBusinessItem() );

    SwLabDlg* pDlg = new SwLabDlg(0, aSet, pNewDBMgr, bLabel);

    if ( RET_OK == pDlg->Execute() )
    {
        // Dialog auslesen, Item in Config speichern
        const SwLabItem& rItem = (const SwLabItem&) pDlg->
                                            GetOutputItemSet()->Get(FN_LABEL);
        if(bLabel)
            aLabCfg.GetLabItem() = rItem;
        else
            aLabCfg.GetBusinessItem() = rItem;
        pDlg->MakeConfigItem( bLabel ? aLabCfg.GetLabItem() : aLabCfg.GetBusinessItem() );
        aLabCfg.SetDefault(sal_False);
        aLabCfg.StoreConfig();

        // Neues Dokument erzeugen.
        SfxObjectShellRef xDocSh( new SwDocShell( SFX_CREATE_MODE_STANDARD));
        xDocSh->DoInitNew( 0 );

        // Drucker
        Printer *pPrt = pDlg->GetPrt();
        if (pPrt)
        {
            SwDocShell *pDocSh = (SwDocShell*)(&*xDocSh);
            pDocSh->GetDoc()->SetJobsetup(pPrt->GetJobSetup());
        }

        SfxViewFrame *pFrame = SFX_APP()->CreateViewFrame( *xDocSh, 0, sal_True );
        SwView      *pView = (SwView*) pFrame->GetViewShell();
        pView->AttrChangedNotify( &pView->GetWrtShell() );//Damit SelectShell gerufen wird.

        // Dokumenttitel setzen
        String aTmp;
        if(bLabel)
        {
            aTmp = String(SW_RES( STR_LAB_TITLE));
            aTmp += String::CreateFromInt32(++nLabelTitleNo );
        }
        else
        {
            aTmp = pDlg->GetBusinessCardStr();
            aTmp += String::CreateFromInt32( ++nBCTitleNo );
        }
        xDocSh->SetTitle( aTmp );

        pFrame->GetFrame()->Appear();

        // Shell ermitteln
        SwWrtShell *pSh = pView->GetWrtShellPtr();
        ASSERT( pSh, "missing WrtShell" );

        {   // block for locks the dispatcher!!

            SwWait aWait( (SwDocShell&)*xDocSh, sal_True );

            SET_CURR_SHELL(pSh);
            pSh->DoUndo( sal_False );
            pSh->StartAllAction();

            pSh->SetNewDoc();       // Performanceprobleme vermeiden

            SwPageDesc aDesc = pSh->GetPageDesc( 0 );
            SwFrmFmt&  rFmt  = aDesc.GetMaster();

            // Raender
            SvxLRSpaceItem aLRMargin;
            SvxULSpaceItem aULMargin;
            aLRMargin.SetLeft ((sal_uInt16) rItem.lLeft );
            aULMargin.SetUpper((sal_uInt16) rItem.lUpper);
            aLRMargin.SetRight(0);
            aULMargin.SetLower(0);
            rFmt.SetAttr(aLRMargin);
            rFmt.SetAttr(aULMargin);

            // Kopf- und Fusszeilen
            rFmt.SetAttr(SwFmtHeader(sal_Bool(sal_False)));
            aDesc.ChgHeaderShare(sal_False);
            rFmt.SetAttr(SwFmtFooter(sal_Bool(sal_False)));
            aDesc.ChgFooterShare(sal_False);


            aDesc.SetUseOn(PD_ALL);             // Seitennumerierung

            // Einstellen der Seitengroesse
            rFmt.SetAttr(SwFmtFrmSize(ATT_FIX_SIZE,
                                        rItem.lLeft  + rItem.nCols * rItem.lHDist,
                                        rItem.lUpper + rItem.nRows * rItem.lVDist));

            // Numerierungsart
            SwNumType aType;
            aType.eType = SVX_NUM_NUMBER_NONE;
            aDesc.SetNumType( aType );

            // Folgevorlage
            const SwPageDesc &rFollow = pSh->GetPageDesc( pSh->GetCurPageDesc() );
            aDesc.SetFollow( &rFollow );

            pPrt = pSh->GetPrt( sal_True );
            SvxPaperBinItem aItem;
            aItem.SetValue((sal_Int8)pPrt->GetPaperBin());
            rFmt.SetAttr(aItem);

            aDesc.SetLandscape(ORIENTATION_LANDSCAPE == pPrt->GetOrientation());

            pSh->ChgPageDesc( 0, aDesc );

            // Rahmen einfuegen
            SwFldMgr*        pFldMgr = new SwFldMgr;
            pFldMgr->SetEvalExpFlds(sal_False);

            //fix(24446): Damit der Text der Ettiketten nicht im unbedruckbaren
            //Bereich landet stellen wir entsprechende Raender ein. Um das Handling
            //so Optimal wie moeglich zu halten stellen wir zunaechst an der
            //aktuellen Absatzvorlage keinen Rand als hartes Attribut ein (Damit die
            //Formatierung wg. der Zeichengeb. Rahmen passt. Dann stellen wir die
            //Standarabsatzvorlage anhand des unbedruckbaren Bereiches ein.
            const long nMin = pPrt->GetPageOffset().X() - rItem.lLeft;
            if ( nMin > 0 )
            {
                SvxLRSpaceItem aLR;
                pSh->SetAttr( aLR );
                SwFmt *pStandard = pSh->GetTxtCollFromPool( RES_POOLCOLL_STANDARD );
                aLR.SetLeft ( sal_uInt16(nMin) );
                aLR.SetRight( sal_uInt16(nMin) );
                pStandard->SetAttr( aLR );
            }

            // Rahmenvorlage vorbereiten
            SwFrmFmt* pFmt = pSh->GetFrmFmtFromPool( RES_POOLFRM_LABEL );
            SwFmtFrmSize aFrmSize(  ATT_FIX_SIZE,
                                    rItem.lHDist - (rItem.lHDist-rItem.lWidth),
                                    rItem.lVDist - (rItem.lVDist-rItem.lHeight));
            pFmt->SetAttr(aFrmSize);

            SvxLRSpaceItem aFrmLRSpace( 0, (sal_uInt16)(rItem.lHDist - rItem.lWidth),
                                        0, 0,
                                        RES_LR_SPACE);
            pFmt->SetAttr(aFrmLRSpace);

            SvxULSpaceItem aFrmULSpace( 0, (sal_uInt16)(rItem.lVDist - rItem.lHeight),
                                        RES_UL_SPACE);
            pFmt->SetAttr(aFrmULSpace);

            const SwFrmFmt *pFirstFlyFmt = 0;
            if ( rItem.bPage )
            {
                SwFmtVertOrient aFrmVertOrient( pFmt->GetVertOrient() );
                aFrmVertOrient.SetVertOrient( VERT_TOP );
                pFmt->SetAttr(aFrmVertOrient);

                for ( sal_uInt16 i = 0; i < rItem.nRows; ++i )
                {
                    for ( sal_uInt16 j = 0; j < rItem.nCols; ++j )
                    {
                        pSh->Push();
                        const SwFrmFmt *pTmp =
                                bLabel ?
                                lcl_InsertLabText( *pSh, rItem, *pFmt, *pFldMgr, j, i,
                                    i == rItem.nRows - 1 && j == rItem.nCols - 1,
                                    sal_True ) :
                                lcl_InsertBCText(*pSh, rItem, *pFmt, j, i, sal_True);
                        if (!(i|j))
                        {
                            pFirstFlyFmt = pTmp;

                            if (rItem.bSynchron)
                            {
                                // if there is no content in the fly then
                                // dont leave the fly!!!
                                pSh->Push();
                                pSh->SttDoc();
                                sal_Bool bInFly = 0 != pSh->WizzardGetFly();
                                pSh->Pop( bInFly );

                                if( bInFly )
                                    pSh->EndDoc(sal_True);  // select all content
                                                        // in the fly
                                else
                                    pSh->SetMark();     // set only the mark

                                SwSection aSect( CONTENT_SECTION,
                                                String::CreateFromAscii(MASTER_LABEL));
                                pSh->InsertSection(aSect);
                            }
                        }
                        else if (rItem.bSynchron)
                        {
                            SwSection aSect(FILE_LINK_SECTION, pSh->GetUniqueSectionName());
                            String sLinkName(cTokenSeperator);
                            sLinkName += cTokenSeperator;
                            sLinkName += String::CreateFromAscii(MASTER_LABEL);
                            aSect.SetLinkFileName(sLinkName);
                            aSect.SetProtect();
                            pSh->Insert(aDotStr);   // Dummytext zum Zuweisen der Section
                            pSh->SttDoc();
                            pSh->EndDoc(sal_True);  // Alles im Rahmen selektieren
                            pSh->InsertSection(aSect);
                        }
                        pSh->Pop( sal_False );
                    }
                    if ( i + 1 != rItem.nRows )
                        pSh->SplitNode(); // Kleine Optimierung
                }
            }
            else
            {
                pFirstFlyFmt = bLabel ?
                    lcl_InsertLabText( *pSh, rItem, *pFmt, *pFldMgr,
                            rItem.nCol - 1, rItem.nRow - 1, sal_True, sal_False ) :
                    lcl_InsertBCText(*pSh, rItem, *pFmt, rItem.nCol - 1, rItem.nRow - 1, sal_False);
            }

            //fill the user fields
            if(!bLabel)
            {
                uno::Reference< frame::XModel >  xModel = pSh->GetView().GetDocShell()->GetBaseModel();
                SwLabDlg::UpdateFieldInformation(xModel, rItem);
            }

            pFldMgr->SetEvalExpFlds(sal_True);
            pFldMgr->EvalExpFlds(pSh);

            delete pFldMgr;

            pSh->GotoFly(pFirstFlyFmt->GetName(), FLYCNTTYPE_ALL, sal_False);

            pSh->EndAllAction();
            pSh->DoUndo( sal_True );
            pSh->SetLabelDoc(rItem.bSynchron);
        }

        if( STRING_NOTFOUND != rItem.aWriting.Search( '<' ) )
        {
            // Datenbankbrowser mit zuletzt verwendeter Datenbank oeffnen
            ShowDBObj( *pSh, pSh->GetDBName() );
        }

        if( rItem.bSynchron )
        {
            SfxDispatcher* pDisp = pFrame->GetDispatcher();
            ASSERT(pDisp, "Heute kein Dispatcher am Frame?");
            pDisp->Execute(FN_SYNC_LABELS, SFX_CALLMODE_ASYNCHRON);
        }
    }
    delete pDlg;

    if( pNewDBMgr )
        delete pNewDBMgr;
}

/*-------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.111  2000/09/18 16:05:09  willem.vandorp
    OpenOffice header added.

    Revision 1.110  2000/07/18 12:50:07  os
    replace ofadbmgr

    Revision 1.109  2000/06/30 08:52:03  os
    #76541# string assertions removed

    Revision 1.108  2000/06/13 09:56:09  os
    using UCB

    Revision 1.107  2000/05/23 17:52:08  jp
    Bugfixes for Unicode

    Revision 1.106  2000/04/20 12:49:35  os
    GetName() returns String&

    Revision 1.105  2000/04/11 08:01:30  os
    UNICODE

    Revision 1.104  2000/03/21 15:47:50  os
    UNOIII

    Revision 1.103  2000/03/08 17:21:49  os
    GetAppWindow() - misuse as parent window eliminated

    Revision 1.102  2000/02/14 14:50:56  os
    #70473# Unicode

    Revision 1.101  2000/02/10 22:40:27  jp
    Bug #72760#: InsertLab - dont leave the fly of the first card or label

    Revision 1.100  2000/02/04 15:13:08  os
    #72715# document title of business cards corrected

    Revision 1.99  1999/12/01 09:45:27  os
    #70151# text blocks should always have content

    Revision 1.98  1999/11/29 14:56:12  os
    #70227# business card position corrected

    Revision 1.97  1999/11/19 16:40:21  os
    modules renamed

    Revision 1.96  1999/11/11 14:34:40  hr
    #65293# STLPORT 3.2.1

    Revision 1.95  1999/10/20 10:52:16  jp
    Bug #67821#: InsertLab - execute on not locked dispatcher

    Revision 1.94  1999/10/01 13:37:02  os
    apply AutoText to business cards

    Revision 1.93  1999/09/30 07:51:33  os
    Label config item and LabItem contain business information

    Revision 1.92  1999/09/28 13:17:45  os
    #67382# separate dialog for business cards

    Revision 1.91  1999/07/08 13:59:32  MA
    Use internal object to toggle wait cursor


      Rev 1.90   08 Jul 1999 15:59:32   MA
   Use internal object to toggle wait cursor

      Rev 1.89   10 Jun 1999 10:52:08   JP
   have to change: no AppWin from SfxApp

      Rev 1.88   10 Feb 1999 14:33:56   MA
   #61674# Direktdruck fuer Etiketten entfernt

      Rev 1.87   17 Nov 1998 10:49:44   OS
   #58263# NumType durch SvxExtNumType ersetzt

      Rev 1.86   04 Nov 1998 19:43:04   MA
   #58858# Format fuer MakeNewFly durchreichen

      Rev 1.85   07 Sep 1998 16:59:58   OM
   #55930# Einzelnes Etikett an der korrekten Position drucken

      Rev 1.84   19 Mar 1998 18:30:32   JP
   die neue Poolvorlage fuer Etiketten benutzen

      Rev 1.83   19 Mar 1998 13:32:08   OM
   Etiketten: Rahmenattribute synchronisieren

      Rev 1.82   18 Mar 1998 12:35:26   OM
   Rahmenvorlagen automatisch aktualisieren

      Rev 1.81   16 Mar 1998 16:19:30   OM
   Aktualisieren-Button kontextsensitiv

      Rev 1.80   15 Mar 1998 15:13:30   OM
   Synchron-Button

      Rev 1.79   14 Mar 1998 17:18:14   OM
   Gelinkte Etiketten

      Rev 1.78   14 Mar 1998 17:05:14   OM
   Gelinkte Etiketten

      Rev 1.77   05 Feb 1998 16:34:34   OS
   Change: hidden ViewFrame anlegen

      Rev 1.76   24 Nov 1997 14:22:38   MA
   includes

      Rev 1.75   30 Sep 1997 08:43:24   OS
   include

      Rev 1.74   12 Sep 1997 10:38:32   OS
   ITEMID_* definiert

      Rev 1.73   03 Sep 1997 11:54:00   JP
   zusaetzliches include von fmtcol

      Rev 1.72   02 Sep 1997 09:56:50   OM
   SDB-Headeranpassung

      Rev 1.71   01 Sep 1997 13:06:38   OS
   DLL-Umstellung

      Rev 1.70   15 Aug 1997 11:45:04   OS
   chartar/frmatr/txtatr aufgeteilt

      Rev 1.69   12 Aug 1997 15:58:36   OS
   frmitems/textitem/paraitem aufgeteilt

      Rev 1.68   08 Aug 1997 17:26:46   OM
   Headerfile-Umstellung

      Rev 1.67   07 Aug 1997 14:59:22   OM
   Headerfile-Umstellung

      Rev 1.66   21 Jul 1997 17:16:58   AMA
   Fix #38434#: Das FontListen-Update wird jetzt von SetPrt angestossen

      Rev 1.65   08 Jul 1997 14:04:10   OS
   ConfigItems von der App ans Module

      Rev 1.64   20 Jun 1997 14:23:38   OM
   Cursor in erstes Etikett stellen

      Rev 1.63   07 Apr 1997 15:30:36   MH
   chg: header

      Rev 1.62   21 Feb 1997 09:28:52   MA
   #36621# neue Umrandungstechnik beruecksichtigen

      Rev 1.61   20 Feb 1997 16:09:18   MA
   fix: PoolColl per RES_ und nicht STR_

      Rev 1.60   11 Feb 1997 16:51:54   OM
   Eingabefeld ueber Basic ohne Dialog einfuegen

      Rev 1.59   11 Dec 1996 09:26:16   MA
   Entschlackt

      Rev 1.58   05 Dec 1996 15:23:54   OM
   Nach Briefumschlag und Etiketten DB-Browser oeffnen

      Rev 1.57   03 Dec 1996 17:41:30   AMA
   Chg: Der Drucker wird nur im !Browsemodus angelegt.

      Rev 1.56   08 Nov 1996 19:39:36   MA
   ResMgr

      Rev 1.55   08 Nov 1996 17:38:14   OM
   DB-Mode fuer Serienbriefe und Etiketten zum Teil wiederbelebt

      Rev 1.54   24 Oct 1996 13:36:06   JP
   String Umstellung: [] -> GetChar()

      Rev 1.53   18 Oct 1996 12:12:56   MA
   fixes und opts

      Rev 1.52   26 Sep 1996 09:03:30   MA
   defautls fuer Rahmen + Aufraeumarbeiten

      Rev 1.51   25 Sep 1996 14:10:24   OM
   Neue Datenbanktrenner

      Rev 1.50   02 Sep 1996 16:20:22   OS
   GetViewShell() und Show() statt GetShell() und Appear()

      Rev 1.49   21 Aug 1996 10:53:24   OM
   Umstellung 322: CreateViewFrame

 -------------------------------------------------------------------------*/


diff --git a/sw/source/ui/app/appopt.cxx b/sw/source/ui/app/appopt.cxx
new file mode 100644
index 0000000..2bf010c
--- /dev/null
+++ b/sw/source/ui/app/appopt.cxx
@@ -0,0 +1,776 @@
/*************************************************************************
 *
 *  $RCSfile: appopt.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:31 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop
#include <sot/dtrans.hxx>
#include "uiparam.hxx"
#include "hintids.hxx"


#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif
#ifndef _SFX_PRINTER_HXX //autogen
#include <sfx2/printer.hxx>
#endif
#ifndef _SVX_HTMLMODE_HXX //autogen
#include <svx/htmlmode.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SFX_BINDINGS_HXX //autogen
#include <sfx2/bindings.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _SVX_TSTPITEM_HXX //autogen
#include <svx/tstpitem.hxx>
#endif
#ifndef _SVX_OPTGRID_HXX //autogen
#include <svx/optgrid.hxx>
#endif
#ifndef _SVX_BACKGRND_HXX //autogen
#include <svx/backgrnd.hxx>
#endif

#ifndef _OFF_OFAIDS_HRC
#include <offmgr/ofaids.hrc>
#endif
#ifndef _OPTPAGE_HXX //autogen
#include <optpage.hxx>
#endif
#define _SVSTDARR_STRINGSDTOR
#include <svtools/svstdarr.hxx>
#ifndef _OPTPAGE_HXX //autogen
#include <optpage.hxx>
#endif
#ifndef _SYSTEM_HXX //autogen
#include <vcl/system.hxx>
#endif

#include "optins.hxx"
#include "optload.hxx"
#include <edtwin.hxx>
#include "finder.hxx"
#include "swmodule.hxx"
#include "view.hxx"
#include "wrtsh.hxx"
#include "uitool.hxx"
#include "initui.hxx"                   // fuer ::GetGlossaries()
#include "fldbas.hxx"      //fuer UpdateFields
#include "cmdid.h"          // Funktion-Ids
#include "globals.hrc"
#include "globals.h"        // globale Konstanten z.B.
#include "wview.hxx"
#include "cfgitems.hxx"
#include "prtopt.hxx"
#include "pview.hxx"
#include "usrpref.hxx"
#include "modcfg.hxx"
#include "glosdoc.hxx"
#include "uiitems.hxx"



/* -----------------12.02.99 12:28-------------------
 *
 * --------------------------------------------------*/
SfxItemSet*  SwModule::CreateItemSet( USHORT nId )
{
    BOOL bTextDialog = (nId == SID_SW_EDITOPTIONS) ? TRUE : FALSE;

    // hier werden die Optionen fuer die Web- und den Textdialog zusmmengesetzt
        SwViewOption aViewOpt = *GetUsrPref(!bTextDialog);
        BOOL bFrameDoc = FALSE;
        //kein MakeUsrPref, da hier nur die Optionen von Textdoks genommen werden duerfen
        SwView* pAppView = GetView();
        if(pAppView)
        {
        // wenn Text dann nicht WebView und umgekehrt
            BOOL bWebView = 0 != PTR_CAST(SwWebView, pAppView);
            if( (bWebView &&  !bTextDialog) ||(!bWebView &&  bTextDialog))
            {
                aViewOpt = *pAppView->GetWrtShell().GetViewOptions();
                SfxFrameIterator aIter( *pAppView->GetViewFrame()->GetTopFrame() );
                if( aIter.FirstFrame() )
                    bFrameDoc = TRUE;
            }
            else
                pAppView = 0; // mit View kann hier nichts gewonnen werden
        }
    //  rApp.MakeUsrPref(aViewOpt);


    /********************************************************************/
    /*                                                                  */
    /* Optionen/Bearbeiten                                              */
    /*                                                                  */
    /********************************************************************/
    SfxItemSet* pRet = new SfxItemSet (GetPool(),   FN_PARAM_DOCDISP,       FN_PARAM_ELEM,
                                    SID_PRINTPREVIEW,       SID_PRINTPREVIEW,
                                    SID_ATTR_GRID_OPTIONS,  SID_ATTR_GRID_OPTIONS,
                                    FN_PARAM_PRINTER,       FN_PARAM_WRTSHELL,
                                    FN_PARAM_ADDPRINTER,    FN_PARAM_ADDPRINTER,
                                    SID_ATTR_METRIC,        SID_ATTR_METRIC,
                                    SID_ATTR_DEFTABSTOP,    SID_ATTR_DEFTABSTOP,
                                    RES_BACKGROUND,         RES_BACKGROUND,
                                    SID_HTML_MODE,          SID_HTML_MODE,
                                    FN_PARAM_SHADOWCURSOR,  FN_PARAM_SHADOWCURSOR,
                                    FN_PARAM_CRSR_IN_PROTECTED, FN_PARAM_CRSR_IN_PROTECTED,
                                    FN_VIEW_IN_FRAME,       FN_VIEW_IN_FRAME,
#ifndef PRODUCT
                                    FN_PARAM_SWTEST,        FN_PARAM_SWTEST,
#endif
                                    0);

    if(bFrameDoc)
        pRet->Put(SfxBoolItem(FN_VIEW_IN_FRAME, TRUE));
    pRet->Put( SwDocDisplayItem( aViewOpt, FN_PARAM_DOCDISP) );
    pRet->Put( SwElemItem( aViewOpt, FN_PARAM_ELEM) );
    if( bTextDialog )
    {
        pRet->Put( SwShadowCursorItem( aViewOpt, FN_PARAM_SHADOWCURSOR ));
        pRet->Put( SfxBoolItem(FN_PARAM_CRSR_IN_PROTECTED, aViewOpt.IsCursorInProtectedArea()));
    }

    SfxPrinter* pPrt = 0;
    if( pAppView )
    {
        SwWrtShell& rWrtShell = pAppView->GetWrtShell();

        SfxPrinter* pPrt = rWrtShell.GetPrt();
        if( pPrt )
            pRet->Put(SwPtrItem(FN_PARAM_PRINTER, pPrt));
        pRet->Put(SwPtrItem(FN_PARAM_WRTSHELL, &rWrtShell));

    }
    else
    {
/*      Der Drucker wird jetzt von der TabPage erzeugt und auch geloescht
 *      SfxItemSet* pSet = new SfxItemSet( SFX_APP()->GetPool(),
                    SID_PRINTER_NOTFOUND_WARN, SID_PRINTER_NOTFOUND_WARN,
                    SID_PRINTER_CHANGESTODOC, SID_PRINTER_CHANGESTODOC,
                    0 );

        pPrt = new SfxPrinter(pSet);
        pRet->Put(SwPtrItem(FN_PARAM_PRINTER, pPrt));*/
    }
    if(bTextDialog)
        pRet->Put(SwPtrItem(FN_PARAM_STDFONTS, GetStdFontConfig()));
    if( PTR_CAST( SwPagePreView, SfxViewShell::Current())!=0)
    {
        SfxBoolItem aBool(SfxBoolItem(SID_PRINTPREVIEW, TRUE));
        pRet->Put(aBool);
    }

    SwModuleOptions* pMCfg = GetModuleConfig();
    pRet->Put(SfxUInt16Item( SID_ATTR_METRIC, pMCfg->GetMetric(!bTextDialog)));
    if(bTextDialog)
    {
        if(pAppView)
        {
            const SvxTabStopItem& rDefTabs =
                    (const SvxTabStopItem&)pAppView->GetWrtShell().
                                        GetDefault(RES_PARATR_TABSTOP);
                pRet->Put( SfxUInt16Item( SID_ATTR_DEFTABSTOP, (USHORT)::GetTabDist(rDefTabs)));
        }
        else
            pRet->Put(SfxUInt16Item( SID_ATTR_DEFTABSTOP, pMCfg->GetDefTab()));
    }

    /*-----------------01.02.97 11.13-------------------
    Optionen fuer GridTabPage
    --------------------------------------------------*/

    SvxGridItem aGridItem( SID_ATTR_GRID_OPTIONS);

    aGridItem.SetUseGridSnap( aViewOpt.IsSnap());
    aGridItem.SetSynchronize( aViewOpt.IsSynchronize());
    aGridItem.SetGridVisible( aViewOpt.IsGridVisible());

    const Size& rSnapSize = aViewOpt.GetSnapSize();
    aGridItem.SetFldDrawX( (USHORT) (rSnapSize.Width() ));
    aGridItem.SetFldDrawY( (USHORT) (rSnapSize.Height()));

    aGridItem.SetFldDivisionX( aViewOpt.GetDivisionX());
    aGridItem.SetFldDivisionY( aViewOpt.GetDivisionY());

    pRet->Put(aGridItem);

    /*-----------------01.02.97 13.02-------------------
        Optionen fuer PrintTabPage
    --------------------------------------------------*/
    SwPrintOptions* pOpt = GetPrtOptions(!bTextDialog);
    SwAddPrinterItem aAddPrinterItem (FN_PARAM_ADDPRINTER, pOpt );
    pRet->Put(aAddPrinterItem);

    /*-----------------01.02.97 13.12-------------------
        Optionen fuer Web-Hintergrund
    --------------------------------------------------*/
    if(!bTextDialog)
    {
        pRet->Put(SvxBrushItem(aViewOpt.GetRetoucheColor(), RES_BACKGROUND));
    }

#ifndef PRODUCT
    /*-----------------01.02.97 13.02-------------------
        Test-Optionen
    --------------------------------------------------*/
        SwTestItem aTestItem(FN_PARAM_SWTEST);
        aTestItem.bTest1 = aViewOpt.IsTest1();
        aTestItem.bTest2 = aViewOpt.IsTest2();
        aTestItem.bTest3 = aViewOpt.IsTest3();
        aTestItem.bTest4 =  aViewOpt.IsTest4();
        aTestItem.bTest5 = aViewOpt.IsTest5();
        aTestItem.bTest6 = aViewOpt.IsTest6();
        aTestItem.bTest7 = aViewOpt.IsTest7();
        aTestItem.bTest8 = aViewOpt.IsTest8();
        aTestItem.bTest9 = SwViewOption::IsTest9();
        aTestItem.bTest10 = aViewOpt.IsTest10();
        pRet->Put(aTestItem);
#endif
    /*-----------------01.02.97 13.04-------------------

    --------------------------------------------------*/
    if(!bTextDialog)
        pRet->Put(SfxUInt16Item(SID_HTML_MODE, HTMLMODE_ON));
//  delete pPrt;
    return pRet;
}
/* -----------------12.02.99 12:28-------------------
 *
 * --------------------------------------------------*/
void SwModule::ApplyItemSet( USHORT nId, const SfxItemSet& rSet )
{
    BOOL bTextDialog = nId == SID_SW_EDITOPTIONS;
    SwView* pAppView = GetView();
    SwViewOption aViewOpt = *GetUsrPref(!bTextDialog);
    SwModuleOptions* pMCfg = GetModuleConfig();

        const SfxPoolItem* pItem;
        SfxBindings &rBnd = pAppView->GetViewFrame()->GetBindings();
        /*--------------------------------------------------------------------------
                Seite Dokumentansicht auswerten
        ----------------------------------------------------------------------------*/
            if( SFX_ITEM_SET == rSet.GetItemState(
                        FN_PARAM_DOCDISP, FALSE, &pItem ))
            {
                const SwDocDisplayItem* pDocDispItem = (const SwDocDisplayItem*)pItem;

                if(!aViewOpt.IsViewMetaChars())
                {
                    if(     !aViewOpt.IsTab( TRUE ) &&  pDocDispItem->bTab ||
                            !aViewOpt.IsBlank( TRUE ) && pDocDispItem->bSpace ||
                            !aViewOpt.IsParagraph( TRUE ) && pDocDispItem->bParagraphEnd ||
                            !aViewOpt.IsLineBreak( TRUE ) && pDocDispItem->bManualBreak )
                    {
                        aViewOpt.SetViewMetaChars(TRUE);
                        rBnd.Invalidate(FN_VIEW_META_CHARS);
                    }

                }
                pDocDispItem->FillViewOptions( aViewOpt );
                rBnd.Invalidate(FN_VIEW_GRAPHIC);
                rBnd.Invalidate(FN_VIEW_HIDDEN_PARA);
            }

        /*--------------------------------------------------------------------------
                    Elemente - Item auswerten
        ----------------------------------------------------------------------------*/

            if( SFX_ITEM_SET == rSet.GetItemState(
                                            FN_PARAM_ELEM, FALSE, &pItem ) )
            {
                const SwElemItem* pElemItem = (const SwElemItem*)pItem;
                pElemItem->FillViewOptions( aViewOpt );

            }

            if( SFX_ITEM_SET == rSet.GetItemState(SID_ATTR_METRIC,
                                                            FALSE, &pItem ) )
            {
                SFX_APP()->SetOptions(rSet);
                const SfxUInt16Item* pMetricItem = (const SfxUInt16Item*)pItem;
                ::SetDfltMetric((FieldUnit)pMetricItem->GetValue(), !bTextDialog);
            }

            if( SFX_ITEM_SET == rSet.GetItemState(SID_ATTR_DEFTABSTOP,
                                                            FALSE, &pItem ) )
            {
                USHORT nTabDist = ((const SfxUInt16Item*)pItem)->GetValue();
                pMCfg->SetDefTab(nTabDist);
                if(pAppView)
                {
                    SvxTabStopItem aDefTabs( 0, 0 );
                    MakeDefTabs( nTabDist, aDefTabs );
                    pAppView->GetWrtShell().SetDefault( aDefTabs );
                }
            }


        /*-----------------01.02.97 11.36-------------------
            Hintergrund nur im WebDialog
        --------------------------------------------------*/
            if(SFX_ITEM_SET == rSet.GetItemState(RES_BACKGROUND))
            {
                const SvxBrushItem& rBrushItem = (const SvxBrushItem&)rSet.Get(
                                        RES_BACKGROUND);
                aViewOpt.SetRetoucheColor( rBrushItem.GetColor() );
            }

        /*--------------------------------------------------------------------------
                    Seite Rastereinstellungen auswerten
        ----------------------------------------------------------------------------*/

            if( SFX_ITEM_SET == rSet.GetItemState(
                                        SID_ATTR_GRID_OPTIONS, FALSE, &pItem ))
            {
                const SvxGridItem* pGridItem = (const SvxGridItem*)pItem;

                aViewOpt.SetSnap( pGridItem->GetUseGridSnap() );
                aViewOpt.SetSynchronize(pGridItem->GetSynchronize());
                if( aViewOpt.IsGridVisible() != pGridItem->GetGridVisible() )
                    aViewOpt.SetGridVisible( pGridItem->GetGridVisible());
                Size aSize = Size( pGridItem->GetFldDrawX()  ,
                                    pGridItem->GetFldDrawY()  );
                if( aViewOpt.GetSnapSize() != aSize )
                    aViewOpt.SetSnapSize( aSize );
                short nDiv = (short)pGridItem->GetFldDivisionX() ;
                if( aViewOpt.GetDivisionX() != nDiv  )
                    aViewOpt.SetDivisionX( nDiv );
                nDiv = (short)pGridItem->GetFldDivisionY();
                if( aViewOpt.GetDivisionY() != nDiv  )
                    aViewOpt.SetDivisionY( nDiv  );

                rBnd.Invalidate(SID_GRID_VISIBLE);
                rBnd.Invalidate(SID_GRID_USE);
            }

    //--------------------------------------------------------------------------
    //      Writer Drucker Zusatzeinstellungen auswerten
    //----------------------------------------------------------------------------

            if( SFX_ITEM_SET == rSet.GetItemState(
                                        FN_PARAM_ADDPRINTER, FALSE, &pItem ))
            {
                SwPrintOptions* pOpt = GetPrtOptions(!bTextDialog);
                if (pOpt)
                {
                    const SwAddPrinterItem* pAddPrinterAttr = (const SwAddPrinterItem*)pItem;
                    pAddPrinterAttr->SetPrintOptions(pOpt);
                    pOpt->SetFaxName( pAddPrinterAttr->GetFax());
                }

            }

            if( SFX_ITEM_SET == rSet.GetItemState(
                                FN_PARAM_SHADOWCURSOR, FALSE, &pItem ))
            {
                ((SwShadowCursorItem*)pItem)->FillViewOptions( aViewOpt );
                rBnd.Invalidate(FN_SHADOWCURSOR);
            }

            if( SFX_ITEM_SET == rSet.GetItemState(
                                FN_PARAM_CRSR_IN_PROTECTED, FALSE, &pItem ))
            {
                aViewOpt.SetCursorInProtectedArea(((const SfxBoolItem*)pItem)->GetValue());
            }


#ifndef PRODUCT
    /*--------------------------------------------------------------------------
                Writer Testseite auswerten
    ----------------------------------------------------------------------------*/

            if( SFX_ITEM_SET == rSet.GetItemState(
                        FN_PARAM_SWTEST, FALSE, &pItem ))
            {
                const SwTestItem* pTestItem = (const SwTestItem*)pItem;
                aViewOpt.SetTest1((BOOL)pTestItem->bTest1);
                aViewOpt.SetTest2((BOOL)pTestItem->bTest2);
                aViewOpt.SetTest3((BOOL)pTestItem->bTest3);
                aViewOpt.SetTest4((BOOL)pTestItem->bTest4);
                aViewOpt.SetTest5((BOOL)pTestItem->bTest5);
                aViewOpt.SetTest6((BOOL)pTestItem->bTest6);
                aViewOpt.SetTest7((BOOL)pTestItem->bTest7);
                aViewOpt.SetTest8((BOOL)pTestItem->bTest8);
                SwViewOption::SetTest9((BOOL)pTestItem->bTest9);
                aViewOpt.SetTest10((BOOL)pTestItem->bTest10);
            }
#endif
        // dann an der akt. View und Shell die entsp. Elemente setzen
        ApplyUsrPref(aViewOpt, pAppView,
                     bTextDialog? VIEWOPT_DEST_TEXT : VIEWOPT_DEST_WEB);
}
/* -----------------12.02.99 12:28-------------------
 *
 * --------------------------------------------------*/
SfxTabPage*  SwModule::CreateTabPage( USHORT nId, Window* pParent, const SfxItemSet& rSet )
{
    SfxTabPage*  pRet = 0;

    switch(nId)
    {
        case RID_SW_TP_CONTENT_OPT:
        case RID_SW_TP_HTML_CONTENT_OPT:
        pRet = SwContentOptPage::Create(pParent, rSet); break;
        case RID_SW_TP_HTML_LAYOUT_OPT:
        case RID_SW_TP_LAYOUT_OPT:
            pRet = SwLayoutOptPage::Create(pParent, rSet);
        break;
        case RID_SW_TP_HTML_OPTGRID_PAGE:
        case RID_SVXPAGE_GRID:
            pRet = SvxGridTabPage::Create(pParent, rSet);
            ((SvxGridTabPage*)pRet)->HideSnapGrid();
        break;

        break;
        case RID_SW_TP_STD_FONT:        pRet = SwStdFontTabPage::Create(pParent, rSet); break;
        case RID_SW_TP_HTML_OPTPRINT_PAGE:
        case RID_SW_TP_OPTPRINT_PAGE:
        {
            pRet = SwAddPrinterTabPage::Create(pParent, rSet);
            SvStringsDtor aFaxList;
            const USHORT nCount = Printer::GetQueueCount();
            for (USHORT i = 0; i < nCount; ++i)
            {
                String* pString = new String( Printer::GetQueueInfo( i ).GetPrinterName());
                String* &rpString = pString;
                aFaxList.Insert(rpString, 0);
            }
            (( SwAddPrinterTabPage* )pRet)->SetFax( aFaxList );
        }
        break;
        case RID_SW_TP_HTML_OPTTABLE_PAGE:
        case RID_SW_TP_OPTTABLE_PAGE:
        {
            pRet = SwTableOptionsTabPage::Create(pParent, rSet);
            SwView* pView = GetView();
            if(pView)
            {
                // wenn Text dann nicht WebView und umgekehrt
                BOOL bWebView = 0 != PTR_CAST(SwWebView, pView);
                if( (bWebView &&  RID_SW_TP_HTML_OPTTABLE_PAGE == nId) ||
                    (!bWebView &&  RID_SW_TP_HTML_OPTTABLE_PAGE != nId) )
                {
                    ((SwTableOptionsTabPage*)pRet)->SetWrtShell(pView->GetWrtShellPtr());
                }
            }
        }
        break;
        case RID_SW_TP_OPTSHDWCRSR:     pRet = SwShdwCrsrOptionsTabPage::Create(pParent, rSet); break;
        case RID_SW_TP_REDLINE_OPT:     pRet = SwRedlineOptionsTabPage::Create(pParent, rSet); break;
        case RID_SW_TP_OPTINSERT_HTML_PAGE:
        case RID_SW_TP_OPTINSERT_PAGE:  pRet = SwInsertOptPage::Create(pParent, rSet); break;
        case RID_SW_TP_OPTLOAD_PAGE:    pRet = SwLoadOptPage::Create(pParent, rSet); break;
#ifndef PRODUCT
        case  RID_SW_TP_OPTTEST_PAGE:   pRet = SwTestTabPage::Create(pParent, rSet); break;
#endif
        case  RID_SW_TP_BACKGROUND:     pRet = SvxBackgroundTabPage::Create(pParent, rSet); break;
        case  RID_SW_TP_OPTSRCVIEW:     pRet = SwSourceViewOptionsTabPage::Create(pParent, rSet); break;
    }
    DBG_ASSERT(pRet, "Id unbekannt")
    return pRet;
}

/*-------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.163  2000/09/18 16:05:10  willem.vandorp
    OpenOffice header added.

    Revision 1.162  2000/09/07 15:59:19  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.161  2000/09/07 08:25:44  os
    FaxName now in SwPrintOptions

    Revision 1.160  2000/05/10 11:52:26  os
    Basic API removed

    Revision 1.159  2000/03/03 15:16:58  os
    StarView remainders removed

    Revision 1.158  2000/02/11 14:42:32  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.157  1999/06/25 06:34:50  OS
    #67193# default tabstop from current document


      Rev 1.156   25 Jun 1999 08:34:50   OS
   #67193# default tabstop from current document

      Rev 1.155   10 Jun 1999 10:52:08   JP
   have to change: no AppWin from SfxApp

      Rev 1.154   08 Jun 1999 15:29:16   OS
   #66606# HTML background: use WhichId

      Rev 1.153   19 Mar 1999 15:32:18   OS
   #63750# Tabellenmode auch wieder an der akt. Tabelle setzen

      Rev 1.152   04 Mar 1999 13:54:40   OS
   #62613# eigene Ids fuer alle HTML-Pages

      Rev 1.151   25 Feb 1999 10:19:04   OS
   #62329# eigene Id fuer Sw-Html-Einfuegen-Page

      Rev 1.150   17 Feb 1999 15:07:36   OS
   #61890# Methoden fuer alte Optionsdialoge geloescht

      Rev 1.149   16 Feb 1999 08:08:20   OS
   #61890# Syntaxfehler TestTabPage

      Rev 1.148   15 Feb 1999 09:20:36   OS
   #61890# Virt. Methoden fuer neuen Optionendialog ueberladen

      Rev 1.147   27 Jan 1999 10:05:22   OS
   #58677# Cursor in Readonly-Bereichen

      Rev 1.146   04 Dec 1998 13:35:26   OS
   #60117# Raster-Slots nach dem Dialog invalidieren

      Rev 1.145   08 Sep 1998 16:47:58   OS
   #56134# Metric fuer Text und HTML getrennt

      Rev 1.144   18 Aug 1998 16:48:54   TJ
   include

      Rev 1.143   13 Jul 1998 14:39:54   OS
   include #51814#

      Rev 1.142   13 Jul 1998 08:48:00   OS
   Dialog-Parent richtig setzen #51814#

      Rev 1.141   06 Jul 1998 14:53:46   OS
   Scrollbars in FrameDocs disablen

      Rev 1.140   29 Apr 1998 09:27:40   MA
   BackgroundBrush -> RetoucheColor

      Rev 1.139   05 Mar 1998 14:44:10   OM
   Redline-Attribute in Module-Cfg speichern

      Rev 1.138   02 Mar 1998 12:50:20   OS
   Schattencursor-Slot bei Bedarf invalidieren #47601#

      Rev 1.137   23 Feb 1998 12:40:06   OM
   Redlining-Optionen

      Rev 1.136   28 Nov 1997 14:26:52   MA
   includes

      Rev 1.135   24 Nov 1997 14:22:48   MA
   includes

      Rev 1.134   14 Nov 1997 17:14:04   OS
   TblChgMode auch an der akt. Tabelle setzen #45521#

      Rev 1.133   11 Nov 1997 14:02:58   MA
   precomp entfernt

      Rev 1.132   03 Nov 1997 16:13:08   JP
   neu: Optionen/-Page/Basic-Schnittst. fuer ShadowCursor

      Rev 1.131   09 Aug 1997 12:46:32   OS
   paraitem/frmitems/textitem aufgeteilt

      Rev 1.130   08 Aug 1997 17:26:54   OM
   Headerfile-Umstellung

      Rev 1.129   08 Jul 1997 14:04:14   OS
   ConfigItems von der App ans Module

      Rev 1.128   19 Jun 1997 16:02:42   OS
   DefPaqe an den Dialog weiterreichen #40584#

      Rev 1.127   11 Jun 1997 09:17:04   OS
   Def-Page-Item fuer den Optionsdialog wieder auswerten #40584#

      Rev 1.126   09 Jun 1997 14:28:26   MA
   chg: Browse-Flag nur noch am Doc

      Rev 1.125   06 Jun 1997 12:43:12   MA
   chg: versteckte Absaetze ausblenden

      Rev 1.124   25 Mar 1997 15:55:46   OS
   _if_ fuer Semikolon ?

      Rev 1.123   05 Feb 1997 13:34:46   OS
   PrintOptins auch fuer Web

      Rev 1.122   03 Feb 1997 12:07:22   OS
   kompletter Einstellungesdialog fuer HTML-Dok

      Rev 1.121   30 Jan 1997 11:10:08   OS
   UsrPrefs verdoppelt

      Rev 1.120   14 Jan 1997 14:26:48   OS
   TabDist auch an der Shell setzen

      Rev 1.119   14 Jan 1997 08:46:26   MA
   includes

      Rev 1.118   13 Jan 1997 16:46:06   OS
   Metric und TabStop am Module

      Rev 1.117   19 Dec 1996 17:38:38   OS
   werden MetaChars ausgewaehlt, muessen auch die Sonderzeichen eingeschaltet werden

      Rev 1.116   11 Dec 1996 14:16:46   OS
   Optionenumbau - Reste

      Rev 1.115   04 Dec 1996 14:56:10   OS
   Umbau Optionsdialoge

      Rev 1.114   04 Dec 1996 14:19:30   OS
   neue Ids fuer Optionendialoge

      Rev 1.113   03 Dec 1996 16:57:02   AMA
   Chg: Der Drucker wird nur im !Browsemodus angelegt.

      Rev 1.112   11 Nov 1996 19:32:06   OS
   alten Code entfernt

      Rev 1.111   06 Nov 1996 19:49:24   MH
   SwSplCfg -> OfaSplCfg

      Rev 1.110   01 Nov 1996 18:02:42   MA
   Writer Module

      Rev 1.109   21 Oct 1996 09:37:04   OS
   ColorTable sichern

      Rev 1.108   07 Sep 1996 13:49:52   OS
   Hintergrundpage auch ohne BrowseView

      Rev 1.107   04 Sep 1996 08:03:48   OS
   neu: Grundschriften-Tabpage

      Rev 1.106   03 Sep 1996 16:54:18   OS
   Tabpage Standardfonts

      Rev 1.105   03 Sep 1996 10:15:58   OS
   Reste

      Rev 1.104   31 Aug 1996 17:15:08   OS
   neue Optionendialoge

      Rev 1.103   30 Aug 1996 12:36:20   OS
   UpdateGlosPath kann Blockliste aktualisieren

      Rev 1.102   27 Aug 1996 11:50:54   OS
   alten cast entfernt

      Rev 1.101   26 Aug 1996 16:55:40   OS
   neu: Brush fuer BrowseView

      Rev 1.100   29 Jul 1996 19:37:42   MA
   includes

      Rev 1.99   17 Jul 1996 13:41:06   OS
   Printereinstellungen auch ohne View

      Rev 1.98   11 Jun 1996 16:44:52   OS
   UndoActionCount als Null uebergeben, wenn fuer die akt. Shell DoesUndo() == FALSE, Bug #28570#

      Rev 1.98   11 Jun 1996 16:33:22   OS
   UndoActionCount als Null uebergeben, wenn fuer die akt. Shell DoesUndo() == FALSE, Bug #28570#

      Rev 1.97   10 Jun 1996 13:03:02   OS
   Range fuer Optionendialog fuer neue Proxies erweitert

      Rev 1.96   24 May 1996 14:58:58   OS
   HelpIdas aktualisiert

      Rev 1.95   10 May 1996 11:35:52   NF
   Zeile 76 auskommentiert

      Rev 1.94   09 May 1996 12:38:00   OS
   Range fuer Optionendialog erweitert

      Rev 1.93   30 Apr 1996 14:00:02   OS
   Item fuer Preview schicken, DocDisplayTabPage nicht mehr on demand

      Rev 1.92   27 Apr 1996 17:01:52   OS
   MakeUsrPref benutzen

      Rev 1.91   25 Apr 1996 16:25:28   OS
   ViewOptions-Umbau: alle Aktionen an pVOpt

      Rev 1.90   24 Apr 1996 15:02:50   OS
   Umstellung UsrPref/ViewOption

 -------------------------------------------------------------------------*/


diff --git a/sw/source/ui/app/docsh.cxx b/sw/source/ui/app/docsh.cxx
new file mode 100644
index 0000000..5f8e618
--- /dev/null
+++ b/sw/source/ui/app/docsh.cxx
@@ -0,0 +1,1690 @@
/*************************************************************************
 *
 *  $RCSfile: docsh.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:31 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _MSGBOX_HXX
#include <vcl/msgbox.hxx>
#endif
#ifndef _APP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _WRKWIN_HXX //autogen
#include <vcl/wrkwin.hxx>
#endif
#ifndef _SV_JOBSET_HXX //autogen
#include <vcl/jobset.hxx>
#endif
#ifndef _URLOBJ_HXX //autogen
#include <tools/urlobj.hxx>
#endif
#ifndef _SFX_WHITER_HXX //autogen
#include <svtools/whiter.hxx>
#endif
#ifndef _ZFORLIST_HXX //autogen
#include <svtools/zforlist.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SFXSTRITEM_HXX
#include <svtools/stritem.hxx>
#endif
#ifndef _SBXCLASS_HXX //autogen
#include <svtools/sbx.hxx>
#endif
#ifndef _SFXDOCINF_HXX //autogen
#include <sfx2/docinf.hxx>
#endif
#ifndef _PASSWD_HXX
#include <sfx2/passwd.hxx>
#endif
#ifndef _SFX_BINDINGS_HXX //autogen
#include <sfx2/bindings.hxx>
#endif
#ifndef _SFXDOCFILE_HXX //autogen
#include <sfx2/docfile.hxx>
#endif
#ifndef _SFX_EVENTCONF_HXX //autogen
#include <sfx2/evntconf.hxx>
#endif
#ifndef _SFX_DOCFILT_HACK_HXX //autogen
#include <sfx2/docfilt.hxx>
#endif
#ifndef _SFX_PRINTER_HXX //autogen
#include <sfx2/printer.hxx>
#endif
#ifndef _SVXLINKMGR_HXX
#include <svx/linkmgr.hxx>
#endif
#ifndef _SVX_SRCHITEM_HXX
#include <svx/srchitem.hxx>
#endif
#ifndef _SVX_HTMLMODE_HXX
#include <svx/htmlmode.hxx>
#endif
#ifndef _SVXMSBAS_HXX
#include <svx/svxmsbas.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _OFA_HTMLCFG_HXX //autogen
#include <offmgr/htmlcfg.hxx>
#endif
#ifndef _OFA_FLTRCFG_HXX
#include <offmgr/fltrcfg.hxx>
#endif
#ifndef _SOERR_HXX
#include <so3/soerr.hxx>
#endif
#ifndef _SO_CLSIDS_HXX
#include <so3/clsids.hxx>
#endif
#ifndef _BASMGR_HXX //autogen
#include <basic/basmgr.hxx>
#endif
#ifndef _SB_SBMOD_HXX //autogen
#include <basic/sbmod.hxx>
#endif
//#ifndef _SB_SBJSMOD_HXX //autogen
//#include <basic/sbjsmod.hxx>
//#endif

#ifndef _SWEVENT_HXX //autogen
#include <swevent.hxx>
#endif
#ifndef _FMTPDSC_HXX //autogen
#include <fmtpdsc.hxx>
#endif
#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _NODE_HXX //autogen
#include <node.hxx>
#endif
#ifndef _SWWAIT_HXX
#include <swwait.hxx>
#endif

#ifndef _FRMATR_HXX
#include <frmatr.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>         // fuer die aktuelle Sicht
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>        // Verbindung zur Core
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>        // Dokumenterzeugung
#endif
#ifndef _BASESH_HXX
#include <basesh.hxx>
#endif
#ifndef _VIEWOPT_HXX
#include <viewopt.hxx>
#endif
#ifndef _WDOCSH_HXX
#include <wdocsh.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _GLOBDOC_HXX
#include <globdoc.hxx>
#endif
#ifndef _USRPREF_HXX
#include <usrpref.hxx>
#endif
#ifndef _SHELLIO_HXX
#include <shellio.hxx>      // I/O
#endif
#ifndef _SW3IO_HXX
#include <sw3io.hxx>        // I/O, Hausformat
#endif
#ifndef _DOCSTYLE_HXX
#include <docstyle.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _DATAEX_HXX
#include <dataex.hxx>
#endif
#ifndef _PAGEDESC_HXX
#include <pagedesc.hxx>
#endif
#ifndef _PVIEW_HXX
#include <pview.hxx>
#endif
#ifndef _MDIEXP_HXX
#include <mdiexp.hxx>
#endif
#ifndef _SWBASLNK_HXX
#include <swbaslnk.hxx>
#endif
#ifndef _SRCVIEW_HXX
#include <srcview.hxx>
#endif
#ifndef _NDINDEX_HXX
#include <ndindex.hxx>
#endif
#ifndef _NDOLE_HXX
#include <ndole.hxx>
#endif
#ifndef _ASCFLDLG_HXX
#include <ascfldlg.hxx>
#endif

#ifndef _SWSWERROR_H
#include <swerror.h>        // Fehlermeldungen
#endif
#ifndef _HELPID_H
#include <helpid.h>
#endif
#ifndef _CMDID_H
#include <cmdid.h>          //
#endif
#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif
#ifndef _APP_HRC
#include <app.hrc>
#endif

extern BOOL bNotLoadLayout;


#define SwDocShell
#ifndef _ITEMDEF_HXX
#include <itemdef.hxx>
#endif
#ifndef _SWSLOTS_HXX
#include <swslots.hxx>
#endif


class SwTmpPersist : public SvPersist
{
    SwDocShell* pDShell;
    virtual void FillClass( SvGlobalName * pClassName,
                            ULONG * pClipFormat,
                            String * pAppName,
                            String * pLongUserName,
                            String * pUserName,
                            long nFileFormat=SOFFICE_FILEFORMAT_NOW ) const;
    virtual BOOL Save();
    virtual BOOL SaveCompleted( SvStorage * );
public:
    SwTmpPersist( SwDocShell& rDSh ) : pDShell( &rDSh ) {}
};


SFX_IMPL_INTERFACE( SwDocShell, SfxObjectShell, SW_RES(0) )
{
    SwGlobalDocShell::Factory().RegisterHelpFile(String::CreateFromAscii("swriter.svh"));
    SwGlobalDocShell::Factory().RegisterHelpPIFile(String::CreateFromAscii("swriter.svh"));
}

/*--------------------------------------------------------------------
    Beschreibung:   Aller Filter registrieren
 --------------------------------------------------------------------*/

SFX_IMPL_OBJECTFACTORY_DLL(SwDocShell, SFXOBJECTSHELL_STD_NORMAL|SFXOBJECTSHELL_HASMENU,  \
//swriter3  0xDC5C7E40L, 0xB35C, 0x101B, 0x99, 0x61, 0x04, 0x02, 0x1C, 0x00, 0x70,0x02)
//swriter4  0x8b04e9b0,  0x420e, 0x11d0, 0xa4, 0x5e, 0x0,  0xa0, 0x24, 0x9d, 0x57,0xb1, Sw)
//swriter5  0xc20cf9d1, 0x85ae, 0x11d1, 0xaa, 0xb4, 0x0, 0x60, 0x97, 0xda, 0x56, 0x1a
  SvGlobalName(SO3_SW_CLASSID), Sw)      /*swriter5,*/

/*{
    ::RegisterFilterInSfxFactory( (SfxObjectFactory&)Factory(), RC_DOC_ICON );
}
  */


TYPEINIT2(SwDocShell, SfxObjectShell, SfxListener);

/*--------------------------------------------------------------------
    Beschreibung: Laden vorbereiten
 --------------------------------------------------------------------*/


Reader* SwDocShell::StartConvertFrom(SfxMedium& rMedium, SwReader** ppRdr,
                                    SwCrsrShell *pCrsrShell,
                                    SwPaM* pPaM )
{
    BOOL bAPICall = FALSE;
    const SfxPoolItem* pApiItem;
    const SfxItemSet* pMedSet;
    if( 0 != ( pMedSet = rMedium.GetItemSet() ) && SFX_ITEM_SET ==
            pMedSet->GetItemState( FN_API_CALL, TRUE, &pApiItem ) )
            bAPICall = ((const SfxBoolItem*)pApiItem)->GetValue();

    const SfxFilter* pFlt = rMedium.GetFilter();
    if( !pFlt )
    {
        if(!bAPICall)
        {
            InfoBox( 0, SW_RESSTR(STR_CANTOPEN)).Execute();
        }
        return 0;
    }
    String aFileName( rMedium.GetName() );
    SwRead pRead = SwIoSystem::GetReader( pFlt->GetUserData() );
    if( !pRead )
        return 0;

    if( rMedium.IsStorage()
        ? SW_STORAGE_READER & pRead->GetReaderType()
        : SW_STREAM_READER & pRead->GetReaderType() )
    {
        *ppRdr = pPaM ? new SwReader( rMedium, aFileName, *pPaM ) :
            pCrsrShell ?
                new SwReader( rMedium, aFileName, *pCrsrShell->GetCrsr() )
                    : new SwReader( rMedium, aFileName, pDoc );
    }
    else
        return 0;

    // PassWord Checken
    String aPasswd;
    if ((*ppRdr)->NeedsPasswd( *pRead ))
    {
        if(!bAPICall)
        {
            SfxPasswordDialog* pPasswdDlg =
                    new SfxPasswordDialog( 0 );
                if(RET_OK == pPasswdDlg->Execute())
                    aPasswd = pPasswdDlg->GetPassword();
        }
        else
        {
            const SfxItemSet* pSet = rMedium.GetItemSet();
            const SfxPoolItem *pPassItem;
            if(pSet && SFX_ITEM_SET == pSet->GetItemState(SID_PASSWORD, TRUE, &pPassItem))
                aPasswd = ((const SfxStringItem *)pPassItem)->GetValue();
        }

        if (!(*ppRdr)->CheckPasswd( aPasswd, *pRead ))
        {
            InfoBox( 0, SW_RES(MSG_ERROR_PASSWD)).Execute();
                delete *ppRdr;
//JP: SFX-Aenderung - kein close rufen
//            if( !rMedium.IsStorage() )
//                rMedium.CloseInStream();
            return 0;
        }
    }
    if(rMedium.IsStorage())
    {
        SvStorageRef aStor( rMedium.GetStorage() );
        const SfxItemSet* pSet = rMedium.GetItemSet();
        const SfxPoolItem *pItem;
        if(pSet && SFX_ITEM_SET == pSet->GetItemState(SID_PASSWORD, TRUE, &pItem))
        {
            DBG_ASSERT(pItem->IsA( TYPE(SfxStringItem) ), "Fehler Parametertype");
            ByteString aPasswd( ((const SfxStringItem *)pItem)->GetValue(),
                                gsl_getSystemTextEncoding() );
            aStor->SetKey( aPasswd );
        }
        // Fuer's Dokument-Einfuegen noch die FF-Version, wenn's der
        // eigene Filter ist.
        ASSERT( pRead != ReadSw3 || pFlt->GetVersion(),
                "Am Filter ist keine FF-Version gesetzt" );
        if( pRead == ReadSw3 && pFlt->GetVersion() )
            aStor->SetVersion( (long)pFlt->GetVersion() );
    }
    // beim Sw3-Reader noch den pIo-Pointer setzen
    if( pRead == ReadSw3 )
        ((Sw3Reader*)pRead)->SetSw3Io( pIo );

    if( pFlt->GetDefaultTemplate().Len() )
        pRead->SetTemplateName( pFlt->GetDefaultTemplate() );

    if( pRead == ReadAscii && 0 != rMedium.GetInStream() &&
        String::CreateFromAscii(FILTER_TEXT_DLG) == pFlt->GetUserData() )
    {
        SwAsciiOptions aOpt;
        const SfxItemSet* pSet;
        const SfxPoolItem* pItem;
        if( 0 != ( pSet = rMedium.GetItemSet() ) && SFX_ITEM_SET ==
            pSet->GetItemState( SID_FILE_FILTEROPTIONS, TRUE, &pItem ) )
            aOpt.ReadUserData( ((const SfxStringItem*)pItem)->GetValue() );
        else if(!bAPICall)
        {
            SwAsciiFilterDlg* pDlg = new SwAsciiFilterDlg( 0, *this,
                                                    rMedium.GetInStream() );

            if( RET_OK == pDlg->Execute() )
                // get the options and put it to the reader
                pDlg->FillOptions( aOpt );
            else
            {
                pRead = 0;
                SetError( ERRCODE_IO_ABORT );   // silent abort
            }
            delete pDlg;
        }

        if( pRead )
            pRead->GetReaderOpt().SetASCIIOpts( aOpt );
    }

    return pRead;
}

/*--------------------------------------------------------------------
    Beschreibung: Laden
 --------------------------------------------------------------------*/

BOOL SwDocShell::ConvertFrom( SfxMedium& rMedium )
{
    SwReader* pRdr;
    SwRead pRead = StartConvertFrom(rMedium, &pRdr);
    if (!pRead)
        return FALSE;

#ifdef _JP_LOADTIME
{
extern int bIsSttTime;
extern long nSttTime;
{
SvFileStream aStrm( "\\loadtime.txt", STREAM_WRITE );
aStrm.Seek( STREAM_SEEK_TO_END );
aStrm << "ConvertFrom: " << rMedium.GetName().GetStr() << endl;
}
bIsSttTime = TRUE;
nSttTime = Time().GetTime();
}
#endif

    SwWait aWait( *this, TRUE );

        // SfxProgress unterdruecken, wenn man Embedded ist
    SW_MOD()->SetEmbeddedLoadSave(
                            SFX_CREATE_MODE_EMBEDDED == GetCreateMode() );

    // fuer MD
    BOOL bSave = bNotLoadLayout;
    bNotLoadLayout = BOOL( !LoadLayout() );
#ifndef PRODUCT
    BOOL bWeb = 0 != PTR_CAST(SwWebDocShell, this);
    bNotLoadLayout |= SW_MOD()->GetUsrPref(bWeb)->IsTest1();
#endif

    pRdr->GetDoc()->SetHTMLMode( ISA(SwWebDocShell) );

    ULONG nErr = pRdr->Read( *pRead );
    bNotLoadLayout = bSave;
    // Evtl. ein altes Doc weg
    if( pDoc )
        RemoveLink();
    pDoc = pRdr->GetDoc();

    // die DocInfo vom Doc am DocShell-Medium setzen
    if( GetMedium()->GetFilter() &&
        GetMedium()->GetFilter()->UsesStorage() )
    {
        SvStorageRef aRef = GetMedium()->GetStorage();
        if( aRef.Is() )
            pDoc->GetInfo()->Save(aRef);
    }

    AddLink();

    ASSERT( !pBasePool, "wer hat seinen Pool nicht zerstoert?" );
    pBasePool = new SwDocStyleSheetPool( *pDoc,
                        SFX_CREATE_MODE_ORGANIZER == GetCreateMode() );
    UpdateFontList();
    InitDraw();

    delete pRdr;

    SW_MOD()->SetEmbeddedLoadSave( FALSE );

    SetError( nErr );
    BOOL bOk = !IsError( nErr );

    // StartFinishedLoading rufen. Nicht bei asynchronen Filtern!
    // Diese muessen das selbst rufen!
    if( bOk && !pDoc->IsInLoadAsynchron() )
        StartLoadFinishedTimer();

    return bOk;
}

/*--------------------------------------------------------------------
    Beschreibung: Sichern des Default-Formats, Stg vorhanden
 --------------------------------------------------------------------*/


BOOL SwDocShell::Save()
{
    SwWait aWait( *this, TRUE );
    ULONG nErr = ERR_SWG_WRITE_ERROR, nVBWarning = ERRCODE_NONE;
    if( SfxInPlaceObject::Save() )
    {
        switch( GetCreateMode() )
        {
        case SFX_CREATE_MODE_INTERNAL:
            nErr = 0;
            break;

        case SFX_CREATE_MODE_ORGANIZER:
            nErr = pIo->SaveStyles();
            break;

        case SFX_CREATE_MODE_EMBEDDED:
            // SfxProgress unterdruecken, wenn man Embedded ist
            SW_MOD()->SetEmbeddedLoadSave( TRUE );
            // kein break;

        case SFX_CREATE_MODE_STANDARD:
        case SFX_CREATE_MODE_PREVIEW:
        default:
            {
                if( pDoc->ContainsMSVBasic() )
                {
                    SvxImportMSVBasic aTmp( *this, *pIo->GetStorage() );
                    aTmp.SaveOrDelMSVBAStorage( FALSE, aEmptyStr );
                    if( OFF_APP()->GetFilterOptions()->IsLoadWordBasicStorage() )
                        nVBWarning = SvxImportMSVBasic::
                                        GetSaveWarningOfMSVBAStorage( *this );
                    pDoc->SetContainsMSVBasic( FALSE );
                }

                if( !ISA( SwGlobalDocShell ) && !ISA( SwWebDocShell ) &&
                    SFX_CREATE_MODE_EMBEDDED != GetCreateMode() )
                    AddXMLAsZipToTheStorage( *pIo->GetStorage() );

                // TabellenBox Edit beenden!
                if( pWrtShell )
                    pWrtShell->EndAllTblBoxEdit();

                WriterRef xWrt;
                ::GetSw3Writer( aEmptyStr, xWrt );
                ((Sw3Writer*)&xWrt)->SetSw3Io( pIo, FALSE );

                SwWriter aWrt( *pIo->GetStorage(), *pDoc );
                nErr = aWrt.Write( xWrt );
            }
            break;
        }
        SW_MOD()->SetEmbeddedLoadSave( FALSE );
    }
    SetError( nErr ? nErr : nVBWarning );

    const SfxStringItem aTmp( SID_DOC_MODIFIED, ' ' );
    pWrtShell->GetView().GetViewFrame()->GetBindings().SetState( aTmp );

    return !IsError( nErr );
}

/*--------------------------------------------------------------------
    Beschreibung: Sichern im Defaultformat
 --------------------------------------------------------------------*/


BOOL SwDocShell::SaveAs( SvStorage * pStor )
{
    SwWait aWait( *this, TRUE );

    if( pDoc->IsGlobalDoc() && !pDoc->IsGlblDocSaveLinks() )
        RemoveOLEObjects();

    {
        // Task 75666 - is the Document imported by our Microsoft-Filters?
        const SfxFilter* pOldFilter = GetMedium()->GetFilter();
        if( pOldFilter &&
            ( pOldFilter->GetUserData().EqualsAscii( FILTER_WW8 ) ||
              pOldFilter->GetUserData().EqualsAscii( "CWW6" ) ||
              pOldFilter->GetUserData().EqualsAscii( "WW6" ) ||
              pOldFilter->GetUserData().EqualsAscii( "WW1" ) ))
        {
            // when saving it in our own fileformat, then remove the template
            // name from the docinfo.
            SfxDocumentInfo aInfo = GetDocInfo();
            if( aInfo.GetTemplateName().Len() ||
                aInfo.GetTemplateFileName().Len() )
            {
                aInfo.SetTemplateName( aEmptyStr );
                aInfo.SetTemplateFileName( aEmptyStr );
                SetDocumentInfo( aInfo );
            }
        }
    }

    ULONG nErr = ERR_SWG_WRITE_ERROR, nVBWarning = ERRCODE_NONE;
    if( SfxInPlaceObject::SaveAs( pStor ) )
    {
        if( pDoc->ContainsMSVBasic() )
        {
            SvxImportMSVBasic aTmp( *this, *pIo->GetStorage() );
            aTmp.SaveOrDelMSVBAStorage( FALSE, aEmptyStr );
                    if( OFF_APP()->GetFilterOptions()->IsLoadWordBasicStorage() )
                        nVBWarning = SvxImportMSVBasic::
                                        GetSaveWarningOfMSVBAStorage( *this );
            pDoc->SetContainsMSVBasic( FALSE );
        }

        if( !ISA( SwGlobalDocShell ) && !ISA( SwWebDocShell ) &&
            SFX_CREATE_MODE_EMBEDDED != GetCreateMode() )
            AddXMLAsZipToTheStorage( *pStor );

        // TabellenBox Edit beenden!
        if( pWrtShell )
            pWrtShell->EndAllTblBoxEdit();

        // Modified-Flag merken und erhalten ohne den Link zu Callen
        // (fuer OLE; nach Anweisung von MM)
        BOOL bIsModified = pDoc->IsModified();
        Link aOldOLELnk( pDoc->GetOle2Link() );
        pDoc->SetOle2Link( Link() );

            // SfxProgress unterdruecken, wenn man Embedded ist
        SW_MOD()->SetEmbeddedLoadSave(
                            SFX_CREATE_MODE_EMBEDDED == GetCreateMode() );

        WriterRef xWrt;
        ::GetSw3Writer( aEmptyStr, xWrt );
        ((Sw3Writer*)&xWrt)->SetSw3Io( pIo, TRUE );

        SwWriter aWrt( *pStor, *pDoc );
        nErr = aWrt.Write( xWrt );

        if( bIsModified )
            pDoc->SetModified();
        pDoc->SetOle2Link( aOldOLELnk );

        SW_MOD()->SetEmbeddedLoadSave( FALSE );
    }
    SetError( nErr ? nErr : nVBWarning );

    return !IsError( nErr );
}

/*--------------------------------------------------------------------
    Beschreibung: Sichern aller Formate
 --------------------------------------------------------------------*/
SwSrcView* lcl_GetSourceView( SwDocShell* pSh )
{
    // sind wir in der SourceView?
    SfxViewFrame* pVFrame = SfxViewFrame::GetFirst( pSh );
    SfxViewShell* pViewShell = pVFrame ? pVFrame->GetViewShell() : 0;
    return PTR_CAST( SwSrcView, pViewShell);
}

BOOL SwDocShell::ConvertTo( SfxMedium& rMedium )
{
    const SfxFilter* pFlt = rMedium.GetFilter();
    if( !pFlt )
        return FALSE;

    WriterRef xWriter;
    SwIoSystem::GetWriter( pFlt->GetUserData(), xWriter );
    if( !xWriter.Is() )
    {   // Der Filter ist nicht vorhanden
        InfoBox( 0,
                 SW_RESSTR(STR_DLLNOTFOUND) ).Execute();
        return FALSE;
    }

    ULONG nVBWarning = 0;
    if( pDoc->ContainsMSVBasic() )
    {
        BOOL bSave = pFlt->GetUserData().EqualsAscii( "CWW8" )
             && OFF_APP()->GetFilterOptions()->IsLoadWordBasicStorage();

        SvStorage* pStg;
        if( xWriter->IsStgWriter() )
            pStg = rMedium.GetStorage();
        else
            pStg = pIo->GetStorage();
        SvxImportMSVBasic aTmp( *this, *pStg );
        nVBWarning = aTmp.SaveOrDelMSVBAStorage( bSave, String::CreateFromAscii("Macros") );
        pDoc->SetContainsMSVBasic( bSave );
    }

    // TabellenBox Edit beenden!
    if( pWrtShell )
        pWrtShell->EndAllTblBoxEdit();

    if( pFlt->GetUserData().EqualsAscii( "HTML") )
    {
        OfficeApplication* pOffApp = OFF_APP();
        OfaHtmlOptions* pHtmlOpt = pOffApp->GetHtmlOptions();
        if( !pHtmlOpt->IsStarBasic() && HasBasic())
        {
            BOOL bModules = FALSE;
            BasicManager *pBasicMan = GetBasicManager();

            for( USHORT i=0; i < pBasicMan->GetLibCount(); i++ )
            {
                StarBASIC *pBasic = pBasicMan->GetLib( i  );
                SbxArray *pModules = pBasic->GetModules();
                for( USHORT j = 0; j < pModules->Count(); j++ )
                {
                    const SbModule *pModule = PTR_CAST( SbModule, pModules->Get(j) );
                    bModules = TRUE;
                    break;
                }
            }

            if(bModules && pHtmlOpt->IsStarBasicWarning())
            {
                SetError(WARN_SWG_HTML_NO_MACROS);
            }
        }
        UpdateDocInfoForSave();
    }

    if( xWriter->IsStgWriter() && xWriter->IsSw3Writer() )
    {
        // eigenen Typ ermitteln
        BYTE nMyType = 0;
        if( ISA( SwWebDocShell) )
            nMyType = 1;
        else if( ISA( SwGlobalDocShell) )
            nMyType = 2;

        // gewuenschten Typ ermitteln
        BYTE nSaveType = 0;
        ULONG nSaveClipId = pFlt->GetFormat();
        if( SOT_FORMATSTR_ID_STARWRITERWEB_50 == nSaveClipId ||
            SOT_FORMATSTR_ID_STARWRITERWEB_40 == nSaveClipId )
            nSaveType = 1;
        else if( SOT_FORMATSTR_ID_STARWRITERGLOB_50 == nSaveClipId ||
                    SOT_FORMATSTR_ID_STARWRITERGLOB_40 == nSaveClipId )
            nSaveType = 2;

        // Flags am Dokument entsprechend umsetzen
        BOOL bIsHTMLModeSave = GetDoc()->IsHTMLMode();
        BOOL bIsGlobalDocSave = GetDoc()->IsGlobalDoc();
        BOOL bIsGlblDocSaveLinksSave = GetDoc()->IsGlblDocSaveLinks();
        if( nMyType != nSaveType )
        {
            GetDoc()->SetHTMLMode( 1 == nSaveType );
            GetDoc()->SetGlobalDoc( 2 == nSaveType );
            GetDoc()->SetGlblDocSaveLinks( FALSE );
        }

        // Jetzt das Dokument normal speichern
        BOOL bRet = SaveAs( rMedium.GetStorage() );

        if( nMyType != nSaveType )
        {
            GetDoc()->SetHTMLMode( bIsHTMLModeSave );
            GetDoc()->SetGlobalDoc( bIsGlobalDocSave );
            GetDoc()->SetGlblDocSaveLinks( bIsGlblDocSaveLinksSave );
        }

        if( bRet && nMyType != nSaveType )
        {
            SvGlobalName aClassName;
            ULONG nClipFormat;
            String aAppName, aLongUserName, aUserName;
            SfxObjectShellRef xDocSh;
            switch( nSaveType )
            {
            case 0:
                xDocSh = new SwDocShell( SFX_CREATE_MODE_INTERNAL );
                break;
            case 1:
                xDocSh = new SwWebDocShell( SFX_CREATE_MODE_INTERNAL );
                break;
            case 2:
                xDocSh = new SwGlobalDocShell( SFX_CREATE_MODE_INTERNAL );
                break;
            }
            xDocSh->FillClass( &aClassName, &nClipFormat, &aAppName,
                                &aLongUserName, &aUserName,
                                pFlt->GetVersion() );
            ASSERT( nClipFormat == nSaveClipId,
                    "FillClass hat falsche Clipboard-Id gesetzt" );
            rMedium.GetStorage()->SetClass( aClassName, nClipFormat,
                                            aUserName );
        }

        return bRet;
    }

    if( pFlt->GetUserData().EqualsAscii( FILTER_TEXT_DLG ) &&
        ( pWrtShell || !::lcl_GetSourceView( this ) ))
    {
        SwAsciiOptions aOpt;
        String sItemOpt;
        BOOL bShowDlg = FALSE;
        const SfxItemSet* pSet;
        const SfxPoolItem* pItem;
        if( 0 != ( pSet = rMedium.GetItemSet() ) )
        {
            if( SFX_ITEM_SET == pSet->GetItemState( SID_FILE_FILTEROPTIONS,
                                                    TRUE, &pItem ) )
                sItemOpt = ((const SfxStringItem*)pItem)->GetValue();
            if( SFX_ITEM_SET == pSet->GetItemState( SID_USE_FILTEROPTIONS,
                                                    TRUE, &pItem ) )
                bShowDlg = ((const SfxBoolItem*)pItem)->GetValue();
        }

        if( bShowDlg || !sItemOpt.Len() )
        {
            SwAsciiFilterDlg* pDlg = new SwAsciiFilterDlg( 0, *this, 0 );
            int nDlg = pDlg->Execute();

            if( RET_OK == nDlg )
                // get the options for the writer
                pDlg->FillOptions( aOpt );

            delete pDlg;

            if( RET_OK != nDlg )
            {
                SetError( ERRCODE_IO_ABORT );   // silent abort
                return FALSE;
            }
        }
        else
            aOpt.ReadUserData( sItemOpt );

        xWriter->SetAsciiOptions( aOpt );
    }

        // SfxProgress unterdruecken, wenn man Embedded ist
    SW_MOD()->SetEmbeddedLoadSave(
                            SFX_CREATE_MODE_EMBEDDED == GetCreateMode());

    // Kontext aufspannen, um die Anzeige der Selektion zu unterbinden
    ULONG nErrno;
    String aFileName( rMedium.GetName() );

    //Keine View also das ganze Dokument!
    if ( pWrtShell )
    {
        SwWait aWait( *this, TRUE );
        pWrtShell->StartAllAction();
        pWrtShell->Push();
        SwWriter aWrt( rMedium, *pWrtShell, TRUE );
        nErrno = aWrt.Write( xWriter, &aFileName );
        //JP 16.05.97: falls der SFX uns die View waehrend des speicherns
        //              entzieht
        if( pWrtShell )
        {
            pWrtShell->Pop(FALSE);
            pWrtShell->EndAllAction();
        }
    }
    else
    {
        // sind wir in der SourceView?
        SwSrcView* pSrcView = ::lcl_GetSourceView( this );
        if( pSrcView )
        {
            pSrcView->SaveContentTo(rMedium);
            nErrno = 0;
        }
        else
        {
            SwWriter aWrt( rMedium, *pDoc );
            nErrno = aWrt.Write( xWriter, &aFileName );
        }
    }

    SW_MOD()->SetEmbeddedLoadSave( FALSE );
    SetError( nErrno ? nErrno : nVBWarning );
    if( !rMedium.IsStorage() )
        rMedium.CloseOutStream();

    return !IsError( nErrno );
}

/*--------------------------------------------------------------------
    Beschreibung:   Haende weg
 --------------------------------------------------------------------*/


void SwDocShell::HandsOff()
{
    pIo->HandsOff();
    SfxInPlaceObject::HandsOff();
}

/*--------------------------------------------------------------------
    Beschreibung: ??? noch nicht zu aktivieren, muss TRUE liefern
 --------------------------------------------------------------------*/


BOOL SwDocShell::SaveCompleted( SvStorage * pStor )
{
    BOOL bRet = SfxInPlaceObject::SaveCompleted( pStor );
    if( bRet )
    {
        // erst hier entscheiden, ob das Speichern geklappt hat oder nicht
        if( IsModified() )
            pDoc->SetModified();
        else
            pDoc->ResetModified();

        bRet = pIo->SaveCompleted( pStor );
    }

    if( xOLEChildList.Is() )
    {
        BOOL bResetModified = IsEnableSetModified();
        if( bResetModified )
            EnableSetModified( FALSE );

        SvPersist* pPersist = this;
        const SvInfoObjectMemberList* pInfList = xOLEChildList->GetObjectList();

        for( ULONG n = pInfList->Count(); n; )
        {
            SvInfoObjectRef aRef( pInfList->GetObject( --n ));
            pPersist->Move( &aRef, aRef->GetStorageName() );
        }

        xOLEChildList.Clear();
        if( bResetModified )
            EnableSetModified( TRUE );
    }
    return bRet;
}

/*--------------------------------------------------------------------
    Beschreibung: Draw()-Overload fuer OLE2 (Sfx)
 --------------------------------------------------------------------*/

void SwDocShell::Draw( OutputDevice* pDev, const JobSetup& rSetup,
                               USHORT nAspect )
{
    //fix #25341# Draw sollte das Modified nicht beeinflussen
    BOOL bResetModified;
    if ( TRUE == (bResetModified = IsEnableSetModified()) )
        EnableSetModified( FALSE );

    //sollte am Document ein JobSetup haengen, dann kopieren wir uns diesen,
    //um nach dem PrtOle2 diesen wieder am Doc zu verankern.
    //Einen leeren JobSetup setzen wir nicht ein, denn der wuerde nur zu
    //fragwuerdigem Ergebnis nach teurer Neuformatierung fuehren (Preview!)
    JobSetup *pOrig = 0;
    if ( rSetup.GetPrinterName().Len() || ASPECT_THUMBNAIL != nAspect )
    {
        JobSetup* pOrig = (JobSetup*)pDoc->GetJobsetup();
        if( pOrig )         // dann kopieren wir uns den
            pOrig = new JobSetup( *pOrig );
        pDoc->SetJobsetup( rSetup );
    }

    Rectangle aRect( nAspect == ASPECT_THUMBNAIL ?
            GetVisArea( nAspect ) : ((SvEmbeddedObject*)this)->GetVisArea() );

    pDev->Push();
    pDev->SetFillColor();
    pDev->SetLineColor();
    pDev->SetBackground();
    BOOL bWeb = 0 != PTR_CAST(SwWebDocShell, this);
    ViewShell::PrtOle2( pDoc, SW_MOD()->GetUsrPref(bWeb), pDev, aRect );
    pDev->Pop();

    if( pOrig )
    {
        pDoc->SetJobsetup( *pOrig );
        delete pOrig;
    }
    if ( bResetModified )
        EnableSetModified( TRUE );
}


void SwDocShell::SetVisArea( const Rectangle &rRect )
{
    Rectangle aRect( rRect );
    if ( pView )
    {
        Size aSz( pView->GetDocSz() );
        aSz.Width() += DOCUMENTBORDER; aSz.Height() += DOCUMENTBORDER;
        long nMoveX = 0, nMoveY = 0;
        if ( aRect.Right() > aSz.Width() )
            nMoveX = aSz.Width() - aRect.Right();
        if ( aRect.Bottom() > aSz.Height() )
            nMoveY = aSz.Height() - aRect.Bottom();
        aRect.Move( nMoveX, nMoveY );
        nMoveX = aRect.Left() < 0 ? -aRect.Left() : 0;
        nMoveY = aRect.Top()  < 0 ? -aRect.Top()  : 0;
        aRect.Move( nMoveX, nMoveY );

        //Ruft das SfxInPlaceObject::SetVisArea()!
        pView->SetVisArea( aRect, TRUE );
    }
    else
        SfxInPlaceObject::SetVisArea( aRect );
}


Rectangle SwDocShell::GetVisArea( USHORT nAspect ) const
{
    if ( nAspect == ASPECT_THUMBNAIL )
    {
        //PreView: VisArea auf die erste Seite einstellen.

        //PageDesc besorgen, vom ersten Absatz oder den default.
        SwNodeIndex aIdx( pDoc->GetNodes().GetEndOfExtras(), 1 );
        SwCntntNode* pNd = pDoc->GetNodes().GoNext( &aIdx );
        const SwFmtPageDesc &rDesc = pNd->GetSwAttrSet().GetPageDesc();
        const SwPageDesc* pDesc = rDesc.GetPageDesc();
        if( !pDesc )
            pDesc = &pDoc->GetPageDesc( 0 );

        //Das Format wird evtl. von der virtuellen Seitennummer bestimmt.
        const USHORT nPgNum = rDesc.GetNumOffset();
        const BOOL bOdd = nPgNum % 2 ? TRUE : FALSE;
        const SwFrmFmt *pFmt = bOdd ? pDesc->GetRightFmt() : pDesc->GetLeftFmt();
        if ( !pFmt ) //#40568#
            pFmt = bOdd ? pDesc->GetLeftFmt() : pDesc->GetRightFmt();

        if ( pFmt->GetFrmSize().GetWidth() == LONG_MAX )
            //Jetzt wird es aber Zeit fuer die Initialisierung
            pDoc->GetPrt( TRUE );

        const SwFmtFrmSize& rFrmSz = pFmt->GetFrmSize();
        const Size aSz( rFrmSz.GetWidth(), rFrmSz.GetHeight() );
        const Point aPt( DOCUMENTBORDER, DOCUMENTBORDER );
        const Rectangle aRect( aPt, aSz );
        return aRect;
    }
    return SvEmbeddedObject::GetVisArea( nAspect );
}

Printer *SwDocShell::GetDocumentPrinter()
{
    return pDoc->GetPrt();
}

void SwDocShell::OnDocumentPrinterChanged( Printer * pNewPrinter )
{
    if ( pNewPrinter )
        GetDoc()->SetJobsetup( pNewPrinter->GetJobSetup() );
    else
        GetDoc()->SetPrt( 0 );
}

ULONG SwDocShell::GetMiscStatus() const
{
    return SfxInPlaceObject::GetMiscStatus() |
           SVOBJ_MISCSTATUS_RESIZEONPRINTERCHANGE;
}


/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwDocShell::GetState(SfxItemSet& rSet)
{
    SfxWhichIter aIter(rSet);
    USHORT  nWhich  = aIter.FirstWhich();

    while (nWhich)
    {
        switch (nWhich)
        {
        // MT: MakroChosser immer enablen, weil Neu moeglich
        // case SID_BASICCHOOSER:
        // {
        //  StarBASIC* pBasic = GetBasic();
        //  StarBASIC* pAppBasic = SFX_APP()->GetBasic();
        //  if ( !(pBasic->GetModules()->Count() ||
        //      pAppBasic->GetModules()->Count()) )
        //          rSet.DisableItem(nWhich);
        // }
        // break;
        case SID_PRINTPREVIEW:
        {
            FASTBOOL bDisable = GetProtocol().IsInPlaceActive();
            if ( !bDisable )
            {
                SfxViewFrame *pTmpFrm = SfxViewFrame::GetFirst(this);
                while (pTmpFrm)     // Preview suchen
                {
                    if ( PTR_CAST(SwView, pTmpFrm->GetViewShell()) &&
                         ((SwView*)pTmpFrm->GetViewShell())->GetWrtShell().
                                                    GetDoc()->IsBrowseMode())
                    {
                        bDisable = TRUE;
                        break;
                    }
                    pTmpFrm = pTmpFrm->GetNext(*pTmpFrm, this);
                }
            }
            if ( bDisable )
                rSet.DisableItem( SID_PRINTPREVIEW );
            else
            {
                SfxBoolItem aBool( SID_PRINTPREVIEW, FALSE );
                if( PTR_CAST( SwPagePreView, SfxViewShell::Current()) )
                    aBool.SetValue( TRUE );
                rSet.Put( aBool );
            }
        }
        break;
        case SID_SOURCEVIEW:
        {
            if(IsLoading())
                rSet.DisableItem(nWhich);
            else
            {
                SfxViewShell* pView = GetView() ? (SfxViewShell*)GetView()
                                            : SfxViewShell::Current();
                BOOL bSourceView = 0 != PTR_CAST(SwSrcView, pView);
                rSet.Put(SfxBoolItem(SID_SOURCEVIEW, bSourceView));
            }
        }
        break;
        case SID_HTML_MODE:
            rSet.Put(SfxUInt16Item(SID_HTML_MODE, ::GetHtmlMode(this)));
        break;

        case FN_ABSTRACT_STARIMPRESS:
        case FN_OUTLINE_TO_IMPRESS:
            if ( !SFX_APP()->HasFeature( SFX_FEATURE_SIMPRESS ) )
                rSet.DisableItem( nWhich );
            /* no break here */
        case FN_ABSTRACT_NEWDOC:
        case FN_OUTLINE_TO_CLIPBOARD:
            {
                if ( !GetDoc()->GetNodes().GetOutLineNds().Count() )
                    rSet.DisableItem( nWhich );
            }
            break;

        case SID_BROWSER_MODE:
            {
                SfxViewShell* pViewShell = SfxViewShell::Current();
                BOOL bDisable = PTR_CAST(SwPagePreView, pViewShell) != 0;

                if (bDisable)
                    rSet.DisableItem( nWhich );
                else
                    rSet.Put( SfxBoolItem( SID_BROWSER_MODE, GetDoc()->IsBrowseMode()));
                break;
            }
        case FN_PRINT_LAYOUT:
            {
                rSet.Put( SfxBoolItem( FN_PRINT_LAYOUT, !GetDoc()->IsBrowseMode()));
                break;
            }
        case FN_NEW_GLOBAL_DOC:
            if ( ISA(SwGlobalDocShell) )
                rSet.DisableItem( nWhich );
            break;

        case FN_NEW_HTML_DOC:
            // ??? oder sollte das immer gehen??
            if( ISA( SwWebDocShell ) )
                rSet.DisableItem( nWhich );
            break;

        case SID_ATTR_YEAR2000:
            rSet.Put(SfxUInt16Item(nWhich, pDoc->GetNumberFormatter(TRUE)->GetYear2000()));
        break;

        default: DBG_ASSERT(!this,"Hier darfst Du nicht hinein!");

        }
        nWhich = aIter.NextWhich();
    }
}

/*--------------------------------------------------------------------
    Beschreibung:   OLE-Hdls
 --------------------------------------------------------------------*/


IMPL_LINK( SwDocShell, Ole2ModifiedHdl, void *, p )
{
    // vom Doc wird der Status mitgegeben (siehe doc.cxx)
    //  Bit 0:  -> alter Zustand
    //  Bit 1:  -> neuer Zustand
    long nStatus = (long)p;
    if( IsEnableSetModified() )
        SetModified( (nStatus & 2) ? TRUE : FALSE );
    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:   Pool returnen Hier weil virtuelll
 --------------------------------------------------------------------*/


SfxStyleSheetBasePool*  SwDocShell::GetStyleSheetPool()
{
    return pBasePool;
}


void SwDocShell::SetView(SwView* pVw)
{
    if ( 0 != (pView = pVw) )
        pWrtShell = &pView->GetWrtShell();
    else
        pWrtShell = 0;
}


void SwDocShell::PrepareReload()
{
    ::RemoveFromBackgroundCache( *this, TRUE );
    ::DelAllGrfCacheEntries( pDoc );
    pDoc->GetLinkManager().PrepareReload();
}


void SwDocShell::StartLoadFinishedTimer()
{
    BOOL bSttTimer = FALSE;
    // ohne WrtShell haben wir eine WebDocShell und muessen uns die
    // Optionen vom Modul holen
    if( pWrtShell ? pWrtShell->GetViewOptions()->IsGraphic()
                  : SW_MOD()->GetUsrPref(TRUE)->IsGraphic() )
    {
        const SvxLinkManager& rLnkMgr = pDoc->GetLinkManager();
        const SvBaseLinks& rLnks = rLnkMgr.GetLinks();
        for( USHORT n = 0; n < rLnks.Count(); ++n )
        {
            SvBaseLink* pLnk = &(*rLnks[ n ]);
            if( pLnk && OBJECT_CLIENT_GRF == pLnk->GetObjType() &&
                pLnk->ISA( SwBaseLink ) )
            {
                SvPseudoObject* pLnkObj = pLnk->GetObj();
                if( !pLnkObj )
                {
                    String sFileNm;
                    if( rLnkMgr.GetDisplayNames( *pLnk, 0, &sFileNm, 0, 0 ))
                    {
                        INetURLObject aURL( sFileNm );
                        switch( aURL.GetProtocol() )
                        {
                        case INET_PROT_NOT_VALID:
                        case INET_PROT_FILE:
                        case INET_PROT_MAILTO:
                        case INET_PROT_NEWS:
                        case INET_PROT_CID:
                            break;

                        default:
                            ((SwBaseLink*)pLnk)->SwapIn();
                            ((SwBaseLink*)pLnk)->GetCntntNode()->SetAutoFmtLvl(1);
                            bSttTimer = TRUE;
                            break;
                        }
                    }
                }
                else
                {
                    ULONG nState = pLnkObj->GetUpToDateStatus();
                    if( ERRCODE_SO_FALSE == nState )
                    {
                        // falls aber nicht angetickert werden muss (liegt
                        // im QuickdrawCache)
                        if( !((SwBaseLink*)pLnk)->IsShowQuickDrawBmp() )
                        {
                            ((SwBaseLink*)pLnk)->SwapIn();
                            ((SwBaseLink*)pLnk)->GetCntntNode()->SetAutoFmtLvl(1);
                            bSttTimer = TRUE;
                        }
                        else
                        {
                            // dann muss aber auf jedenfall der Status
                            // an die Handler verschickt werden!
                            SvData aData( SvxLinkManager::RegisterStatusInfoId() );
                            aData.SetData( String::CreateFromInt32(STATE_LOAD_OK ));
                            pLnkObj->DataChanged( aData );
                        }
                    }
                    else if( ERRCODE_NONE != nState )
                        bSttTimer = TRUE;       // Pending?
                    else if( ((SwBaseLink*)pLnk)->IsShowQuickDrawBmp() )
                    {
                        // Wenn die Grafik aus dem QuickDrawCache kommt,
                        // wird sie nie angefordert!
                        // Dann muss aber auf jedenfall der Status
                        // an die Handler verschickt werden!
                        SvData aData( SvxLinkManager::RegisterStatusInfoId() );
                        aData.SetData( String::CreateFromInt32(STATE_LOAD_OK) );
                        pLnkObj->DataChanged( aData );
                    }
                }
            }
        }
    }

    if( bSttTimer )
    {
        aFinishedTimer.SetTimeoutHdl( STATIC_LINK( this, SwDocShell, IsLoadFinished ));
        aFinishedTimer.SetTimeout( 1000 );
        aFinishedTimer.Start();
        GetDoc()->StopIdleTimer();
    }
    FinishedLoading( SFX_LOADED_MAINDOCUMENT |
                    ( bSttTimer ? 0 : SFX_LOADED_IMAGES ));
    // jetzt noch testen, ob die SourceView noch geladen werden muá
    SfxViewFrame* pVFrame = SfxViewFrame::GetFirst(this);
    if(pVFrame)
    {
        SfxViewShell* pShell = pVFrame->GetViewShell();
        if(PTR_CAST(SwSrcView, pShell))
            ((SwSrcView*)pShell)->Load(this);
    }
}


IMPL_STATIC_LINK( SwDocShell, IsLoadFinished, void*, EMPTYARG )
{
    BOOL bSttTimer = FALSE;

    if( !pThis->IsAbortingImport() )
    {
        const SvxLinkManager& rLnkMgr = pThis->pDoc->GetLinkManager();
        const SvBaseLinks& rLnks = rLnkMgr.GetLinks();
        for( USHORT n = rLnks.Count(); n; )
        {
            SvBaseLink* pLnk = &(*rLnks[ --n ]);
            if( pLnk && OBJECT_CLIENT_GRF == pLnk->GetObjType() &&
                pLnk->ISA( SwBaseLink ) )
            {
                SvPseudoObject* pLnkObj = pLnk->GetObj();
                if( pLnkObj && ERRCODE_SO_PENDING == pLnkObj->GetUpToDateStatus() &&
                    !((SwBaseLink*)pLnk)->IsShowQuickDrawBmp() )
                {
                    bSttTimer = TRUE;
                    break;
                }
            }
        }
    }

    if( bSttTimer )
        pThis->aFinishedTimer.Start();
    else
    {
        BOOL bIsModifiedEnabled = pThis->IsEnableSetModified();
        pThis->EnableSetModified( FALSE );
        pThis->FinishedLoading( SFX_LOADED_MAINDOCUMENT | SFX_LOADED_IMAGES );
        pThis->EnableSetModified( bIsModifiedEnabled );

        pThis->GetDoc()->StartIdleTimer();
    }
    return 0;
}


// eine Uebertragung wird abgebrochen (wird aus dem SFX gerufen)
void SwDocShell::CancelTransfers()
{
    // alle Links vom LinkManager Canceln
    aFinishedTimer.Stop();
    pDoc->GetLinkManager().CancelTransfers();
    SfxObjectShell::CancelTransfers();
}

SwFEShell* SwDocShell::GetFEShell()
{
    return pWrtShell;
}

    // embedded alle lokalen Links (Bereiche/Grafiken)
BOOL SwDocShell::EmbedAllLinks()
{
    if( pWrtShell )
        return pWrtShell->EmbedAllLinks();
    return pDoc->EmbedAllLinks();
}


void SwDocShell::RemoveOLEObjects()
{
    SvPersist* pPersist = this;
    SwClientIter aIter( *(SwModify*)pDoc->GetDfltGrfFmtColl() );
    for( SwCntntNode* pNd = (SwCntntNode*)aIter.First( TYPE( SwCntntNode ) );
            pNd; pNd = (SwCntntNode*)aIter.Next() )
    {
        SwOLENode* pOLENd = pNd->GetOLENode();
        if( pOLENd && ( pOLENd->IsOLEObjectDeleted() ||
                        ( !pOLENd->GetOLEObj().IsOLELink() &&
                            pOLENd->IsInGlobalDocSection() )))
        {
            SvInfoObjectRef aRef( pPersist->Find(
                                    pOLENd->GetOLEObj().GetName() ) );
            if( aRef.Is() )
            {
                if( !xOLEChildList.Is() )
                {
                    xOLEChildList = new SwTmpPersist( *this );
                    xOLEChildList->DoInitNew( 0 );
                }

                xOLEChildList->Move( &aRef, aRef->GetStorageName() );

                pPersist->Remove( &aRef );
            }
        }
    }
}

void SwTmpPersist::FillClass( SvGlobalName * pClassName,
                            ULONG * pClipFormat,
                            String * pAppName,
                            String * pLongUserName,
                            String * pUserName,
                            long nFileFormat ) const
{
    pDShell->SwDocShell::FillClass( pClassName, pClipFormat, pAppName,
                                    pLongUserName, pUserName, nFileFormat );
}

BOOL SwTmpPersist::Save()
{
    if( SaveChilds() )
        return SvPersist::Save();
    return FALSE;
}

BOOL SwTmpPersist::SaveCompleted( SvStorage * pStor )
{
    if( SaveCompletedChilds( pStor ) )
        return SvPersist::SaveCompleted( pStor );
    return FALSE;
}


/*------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.388  2000/09/18 16:05:10  willem.vandorp
    OpenOffice header added.

    Revision 1.387  2000/09/07 15:59:19  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.386  2000/08/14 17:20:30  jp
    Task #77577#: new AddXMLAsZipToTheStorage

    Revision 1.385  2000/06/19 17:17:03  jp
    Must changes

    Revision 1.384  2000/06/13 09:56:09  os
    using UCB

    Revision 1.383  2000/05/26 07:21:27  os
    old SW Basic API Slots removed

    Revision 1.382  2000/05/10 11:52:42  os
    Basic API removed

    Revision 1.381  2000/05/08 11:32:54  jp
    Bug #75666#: SaveAs - remove templatename when a MS importet doc saved as SWG doc

    Revision 1.380  2000/05/03 13:06:34  jp
    Bug #75497#: warning for loosing the VBA Basic code

    Revision 1.379  2000/04/11 08:01:30  os
    UNICODE

    Revision 1.378  2000/03/16 16:39:35  kz
    remove include sbjsmod.hxx

    Revision 1.377  2000/03/08 17:26:34  os
    GetAppWindow() - misuse as parent window eliminated

    Revision 1.376  2000/03/06 15:10:58  os
    #73092# FN_API_CALL - prevent dialogs in inserting documents via API

    Revision 1.375  2000/03/03 16:14:15  pl
    #73771# workaround for c50 intel compiler

    Revision 1.374  2000/03/03 12:27:49  mib
    Removed JavaScript

    Revision 1.373  2000/02/14 14:50:56  os
    #70473# Unicode

    Revision 1.372  2000/02/10 17:02:52  jp
    Task #72781#: new filter options for MS-filters

    Revision 1.371  2000/02/02 17:00:29  jp
    Task #72579#: interface of SwReader is changed

    Revision 1.370  2000/01/26 18:55:34  jp
    Task #72268#: flag for stored M$-VBasic storage

    Revision 1.369  2000/01/11 19:26:33  jp
    Bug #71674#: IsLoadFinished - dont modifiy the modifyflag

    Revision 1.368  1999/10/21 12:46:06  os
    CHG: SfxPasswordDialog

    Revision 1.367  1999/09/08 13:44:47  jp
    ConvertTo: use set the filteroptions if it set and dont show the dialog

    Revision 1.366  1999/08/30 08:01:02  JP
    save Text with more options


      Rev 1.365   30 Aug 1999 10:01:02   JP
   save Text with more options

      Rev 1.364   26 Aug 1999 20:35:52   JP
   load and save Text with more options (charset/language/lineend/font)

      Rev 1.363   25 Aug 1999 19:47:32   JP
   StartConvertFrom: use new dialog for ASCII filter options

      Rev 1.362   30 Jul 1999 12:55:32   JP
   ConvertTo: call IsSw3Writer at Writer

      Rev 1.361   09 Jul 1999 11:14:10   JP
   StartLoadFinishedTimer - dont load file/mail/news - graphics

      Rev 1.360   08 Jul 1999 15:59:38   MA
   Use internal object to toggle wait cursor

      Rev 1.359   25 Jun 1999 11:58:52   OS
   #63132# Macros in HTML not saved: Warning code

      Rev 1.358   22 Jun 1999 17:03:10   KZ
   Anpass. fuer Linux

      Rev 1.357   10 Jun 1999 10:52:10   JP
   have to change: no AppWin from SfxApp

      Rev 1.356   04 May 1999 14:58:42   JP
   FilterExportklasse Writer von SvRef abgeleitet, damit sie immer zerstoert wird

      Rev 1.355   26 Apr 1999 11:19:54   KZ
   #include <svtools/sbx.hxx> eingefuegt

      Rev 1.354   11 Mar 1999 10:23:56   OS
   #63130# Basic-Warnmeldung auch fuer JScript

      Rev 1.353   05 Feb 1999 09:57:42   OS
   #61208# Warnung fuer Basic-Export abschaltbar

      Rev 1.352   02 Feb 1999 08:42:42   OS
   #61027# zweistellige Jahreszahlen

      Rev 1.351   26 Nov 1998 13:49:52   MA
   #54599# OLE: Drucker synchronisieren

      Rev 1.350   18 Nov 1998 15:17:44   JP
   Task #59398#: ClipboardFormatId Umstellungen

      Rev 1.349   18 Sep 1998 11:20:28   JP
   Bug #56312# StartFinishLoading - Anforderreihenfolge der Links umgestellt

      Rev 1.348   25 Aug 1998 14:19:50   JP
   Bug #55502#: Save/SaveAs - WaitObject vorm SFX-Speichern anlegen

      Rev 1.347   12 Aug 1998 18:02:32   HR
   #54781#: GCC braucht Temporary

      Rev 1.346   23 Jul 1998 17:03:46   OS
   StartConvertFrom kann auch mit SwPaM* aufgerufen werden  #52654#

      Rev 1.345   23 Jul 1998 11:14:36   JP
   Task #52654#: Einfuegen Doc nicht mit einer CrsrShell sondern mit einen PaM

      Rev 1.344   20 Jul 1998 10:43:42   MA
   #53013# Nach Anweisung abgeklemmt

      Rev 1.343   17 Jun 1998 16:57:34   OM
   #51260# Kein Online-Layout in Seitenvorschau

      Rev 1.342   29 Apr 1998 09:28:04   MA
   OLE Transparent

      Rev 1.341   24 Apr 1998 17:17:26   JP
   Bug #49791#: nur auf OLE casten wenn auch OLE drin ist (und nicht Grafik)

      Rev 1.340   23 Apr 1998 15:35:38   OM
   #49689 Aenderung der Seitenanzahl per Basic konfigurierbar

      Rev 1.339   21 Apr 1998 12:39:02   JP
   StartFinishedLoading: if abfrage korrigiert

      Rev 1.338   02 Apr 1998 10:07:44   MIB
   ConvertTo kann jetzt auch eigene Formate anderer Sw.*DocShells speichern

      Rev 1.337   26 Mar 1998 18:01:54   MA
   Draw: keinen Default-Jobsetup uebernehmen

      Rev 1.336   20 Mar 1998 13:23:28   MA
   OleVis2Page durch BrowseMode ersetzt

      Rev 1.335   17 Mar 1998 15:42:10   JP
   neu: NewHTMLDoc - aequivalent zum NewGlobalDoc

      Rev 1.334   12 Mar 1998 09:36:18   JP
   GlobalDoc ohne OLE-Object: Objecte bis zum SavePersist temp. in TempPersist verschieben

      Rev 1.333   09 Mar 1998 10:02:12   JP
   Bug GlobalDoc(speichern ohne Inhalt) -> OLE-Objecte aus den Sections nicht speichern

      Rev 1.332   02 Mar 1998 16:55:42   OS
   Fehlermeldung Makro in HTML korrigiert #47694#

      Rev 1.331   02 Mar 1998 12:51:32   OS
   Hilfedateiname fuer Globaldoc hart setzen #47604#

      Rev 1.330   25 Feb 1998 14:05:08   MIB
   GetFilter entfernt, weil ueberfluessig

      Rev 1.329   25 Feb 1998 11:31:10   MIB
   fix: Fileformat-Version fuer eigenen Reader im StartConvertFrom setzen

      Rev 1.328   17 Feb 1998 12:43:12   JP
   StartConvert: Templatenamen nur setzen, wenn der gesetzt ist

      Rev 1.327   02 Feb 1998 18:19:06   JP
   StartConvertFrom: DefaultTemplate am Reader setzen

      Rev 1.326   29 Jan 1998 21:33:48   JP
   GetEndOfIcons ersetzt durch GetEndOfExtras, das auf GetEndOfRedlines mappt

      Rev 1.325   23 Jan 1998 16:04:58   MA
   includes

      Rev 1.324   08 Jan 1998 08:48:32   OS
   QueryBox fuer ungspeicherte Basic-Makros #44706#

      Rev 1.323   07 Jan 1998 18:42:04   MIB
   5.0 Fileformat

      Rev 1.322   02 Dec 1997 13:56:10   MA
   includes

      Rev 1.321   28 Nov 1997 14:28:40   MA
   includes

      Rev 1.320   24 Nov 1997 14:22:40   MA
   includes

      Rev 1.319   03 Nov 1997 13:08:44   MA
   precomp entfernt

      Rev 1.318   09 Oct 1997 14:49:46   JP
   Umstellung NodeIndex/-Array/BigPtrArray

      Rev 1.317   01 Sep 1997 13:06:34   OS
   DLL-Umstellung

      Rev 1.316   16 Aug 1997 12:51:22   OS
   include

------------------------------------------------------------------------*/

diff --git a/sw/source/ui/app/docsh2.cxx b/sw/source/ui/app/docsh2.cxx
new file mode 100644
index 0000000..355c4f4
--- /dev/null
+++ b/sw/source/ui/app/docsh2.cxx
@@ -0,0 +1,1981 @@
/*************************************************************************
 *
 *  $RCSfile: docsh2.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:31 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#define ITEMID_COLOR_TABLE      SID_COLOR_TABLE

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _URLOBJ_HXX //autogen
#include <tools/urlobj.hxx>
#endif
#ifndef _TOOLS_TEMPFILE_HXX
#include <tools/tempfile.hxx>
#endif
#ifndef _SV_CLIP_HXX //autogen
#include <vcl/clip.hxx>
#endif
#ifndef _WRKWIN_HXX //autogen
#include <vcl/wrkwin.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _LCKBITEM_HXX
#include <svtools/lckbitem.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SFXMACITEM_HXX //autogen
#include <svtools/macitem.hxx>
#endif
#ifndef _ZFORLIST_HXX //autogen
#include <svtools/zforlist.hxx>
#endif
#ifndef _ZFORMAT_HXX //autogen
#include <svtools/zformat.hxx>
#endif
#ifndef _SFXDOCINF_HXX //autogen
#include <sfx2/docinf.hxx>
#endif
#ifndef _SFX_DINFDLG_HXX //autogen
#include <sfx2/dinfdlg.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SFXNEW_HXX //autogen
#include <sfx2/new.hxx>
#endif
#ifndef _IODLG_HXX
#include "sfx2/iodlg.hxx"
#endif
#ifndef _SFX_PRINTER_HXX //autogen
#include <sfx2/printer.hxx>
#endif
#ifndef _SFX_EVENTCONF_HXX //autogen
#include <sfx2/evntconf.hxx>
#endif
#ifndef _SFXECODE_HXX //autogen
#include <svtools/sfxecode.hxx>
#endif
#ifndef _SFXDOCFILE_HXX //autogen
#include <sfx2/docfile.hxx>
#endif
#ifndef _SFX_DOCFILT_HACK_HXX //autogen
#include <sfx2/docfilt.hxx>
#endif
#ifndef _SVX_SVXIDS_HRC //autogen
#include <svx/svxids.hrc>
#endif
#ifndef _SVX_DRAWITEM_HXX //autogen
#include <svx/drawitem.hxx>
#endif
#ifndef _MySVXACORR_HXX //autogen
#include <svx/svxacorr.hxx>
#endif
#ifndef _SVX_LANGITEM_HXX //autogen
#include <svx/langitem.hxx>
#endif
#ifndef _SVX_FMSHELL_HXX //autogen
#include <svx/fmshell.hxx>
#endif
#ifndef _OFA_HTMLCFG_HXX //autogen
#include <offmgr/htmlcfg.hxx>
#endif
#ifndef _OFF_OFAITEM_HXX //autogen
#include <offmgr/ofaitem.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif

#ifndef _SB_SBSTAR_HXX //autogen
#include <basic/sbstar.hxx>
#endif
#ifndef _BASMGR_HXX //autogen
#include <basic/basmgr.hxx>
#endif
#ifndef _SVSTOR_HXX //autogen
#include <so3/svstor.hxx>
#endif
#ifndef _SO_CLSIDS_HXX
#include <so3/clsids.hxx>
#endif

#ifndef _FMTCOL_HXX //autogen
#include <fmtcol.hxx>
#endif

#ifndef _SWEVENT_HXX //autogen
#include <swevent.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>         // fuer die aktuelle Sicht
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>        // Dokumenterzeugung
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _FLDBAS_HXX
#include <fldbas.hxx>
#endif
#ifndef _VIEWOPT_HXX
#include <viewopt.hxx>
#endif
#ifndef _GLOBDOC_HXX
#include <globdoc.hxx>
#endif
#ifndef _DOCSTDLG_HXX
#include <docstdlg.hxx>     // fuer Dokument Style
#endif
#ifndef _TMPLDLG_HXX
#include <tmpldlg.hxx>
#endif
#ifndef _FLDWRAP_HXX
#include <fldwrap.hxx>
#endif
#ifndef _REDLNDLG_HXX
#include <redlndlg.hxx>
#endif
#ifndef _ABSTRACT_HXX
#include <abstract.hxx>     // SwInsertAbstractDialog
#endif
#ifndef _DOCSTYLE_HXX
#include <docstyle.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _PAGEDESC_HXX
#include <pagedesc.hxx>
#endif
#ifndef _LTMPDLG_HXX
#include <ltmpdlg.hxx>
#endif
#ifndef _SHELLIO_HXX
#include <shellio.hxx>
#endif
#ifndef _SW3IO_HXX
#include <sw3io.hxx>
#endif
#ifndef _PVIEW_HXX
#include <pview.hxx>
#endif
#ifndef _SRCVIEW_HXX
#include <srcview.hxx>
#endif
#ifndef _POOLFMT_HXX
#include <poolfmt.hxx>
#endif
#ifndef _USRPREF_HXX
#include <usrpref.hxx>
#endif
#ifndef _WDOCSH_HXX
#include <wdocsh.hxx>
#endif
#ifndef _UNOTXDOC_HXX
#include <unotxdoc.hxx>
#endif
#ifndef _ACMPLWRD_HXX //autogen
#include <acmplwrd.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif


#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _GLOBALS_H
#include <globals.h>
#endif
#ifndef _HELPID_H
#include <helpid.h>
#endif
#ifndef _APP_HRC
#include <app.hrc>
#endif
#ifndef _POOLFMT_HRC
#include <poolfmt.hrc>
#endif
#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif

using namespace ::com::sun::star;
using namespace ::rtl;
extern FASTBOOL FindPhyStyle( SwDoc& , const String& , SfxStyleFamily );


/*--------------------------------------------------------------------
    Beschreibung:   DocInfo setzen am SFX
 --------------------------------------------------------------------*/


BOOL SwDocShell::SetDocumentInfo(const SfxDocumentInfo& rInfo)
{
    SfxDocumentInfo& rOldInfo = GetDocInfo();
    BOOL bRet = !(rOldInfo == rInfo);
    if( bRet )
    {
        rOldInfo = rInfo;
        Broadcast( SfxDocumentInfoHint( &rOldInfo ) );
    }
    return bRet;
}

/*--------------------------------------------------------------------
    Beschreibung:   DocInfo kreieren (virtuell)
 --------------------------------------------------------------------*/


SfxDocumentInfoDialog* SwDocShell::CreateDocumentInfoDialog(
                                Window *pParent, const SfxItemSet &rSet)
{
    SfxDocumentInfoDialog* pDlg = new SfxDocumentInfoDialog(pParent, rSet);
//  const SfxDocumentInfoItem& rItem = (const SfxDocumentInfoItem&)rSet.Get(SID_DOCINFO);
//  if(rItem.IsOwnFormat())
    //nur mit Statistik, wenn dieses Doc auch angezeigt wird, nicht
    //aus dem Doc-Manager
    SwDocShell* pDocSh = (SwDocShell*) SfxObjectShell::Current();
    if( pDocSh == this )
    {
        //Nicht fuer SourceView.
        SfxViewShell *pVSh = SfxViewShell::Current();
        if ( pVSh && !pVSh->ISA(SwSrcView) )
            pDlg->AddTabPage(TP_DOC_STAT, SW_RESSTR(STR_DOC_STAT),
                                                    SwDocStatPage::Create, 0);
    }
    return pDlg;
}

/*--------------------------------------------------------------------
    Beschreibung:   Benachrichtigung bei geaenderter DocInfo
 --------------------------------------------------------------------*/


void SwDocShell::Notify( SfxBroadcaster&, const SfxHint& rHint )
{
    if( !pDoc )
    {
//MA: Kommt bei der OLE-Registration vor!
//      ASSERT( !this, "DocShell ist nicht richtig initialisiert!" );
        return ;
    }

    if( rHint.ISA(SfxDocumentInfoHint) )
    {
        if( pWrtShell )
        {
            pWrtShell->LockView( TRUE );    //Sichtbaren bereich Locken.
            pWrtShell->StartAllAction();
        }
        pDoc->DocInfoChgd( *((SfxDocumentInfoHint&)rHint).GetObject() );
        if( pWrtShell )
        {
            pWrtShell->EndAllAction();
            pWrtShell->LockView( FALSE );
        }
    }
    else if ( rHint.ISA(SfxSimpleHint) )
    {
        switch( ((SfxSimpleHint&) rHint).GetId() )
        {
            case SFX_HINT_TITLECHANGED:
                if ( GetMedium() )
                {
                    if( pWrtShell )
                    {
                        pWrtShell->LockView( TRUE );
                        pWrtShell->StartAllAction();
                    }
                    pDoc->GetSysFldType( RES_FILENAMEFLD )->UpdateFlds();
                    if( pWrtShell )
                    {
                        pWrtShell->EndAllAction();
                        pWrtShell->LockView( FALSE );
                    }
                }
                break;
        }
    }

}

/*--------------------------------------------------------------------
    Beschreibung:   Benachrichtigung Doc schliessen
 --------------------------------------------------------------------*/


USHORT SwDocShell::PrepareClose( BOOL bUI, BOOL bForBrowsing )
{
    USHORT nRet = SfxObjectShell::PrepareClose( bUI, bForBrowsing );

    if( TRUE == nRet ) //Unbedingt auf TRUE abfragen! (RET_NEWTASK)
        EndListening( *this );

    return nRet;
}


void SwDoc::SetInfo( const SfxDocumentInfo& rInfo )
{
    if( pDocShell )
        pDocShell->SetDocumentInfo( rInfo );

    // sollte nur beim "Konvertieren" von Dokumenten hier ankommen!
    else
    {
        // dann setzen wir uns die DocInfo. Nach dem Konvertieren wird diese
        // am Medium gesetzt. Erst dann ist die DocShell bekannt.
        delete pSwgInfo;
        pSwgInfo = new SfxDocumentInfo( rInfo );

// wenn beim Einlesen, dann kein Modify verschicken, diese sollten dann
// richtig eingelesen werden oder spaetestens beim Expandieren die richtigen
// Werte finden.
//      GetSysFldType( RES_DOCINFOFLD )->UpdateFlds();
//      GetSysFldType( RES_TEMPLNAMEFLD )->UpdateFlds();
    }
}

/*--------------------------------------------------------------------
    Beschreibung:   Organizer
 --------------------------------------------------------------------*/


BOOL SwDocShell::Insert( SfxObjectShell &rSource,
    USHORT  nSourceIdx1,        // SourcePool: oberste Inhaltsebene (Vorlagen/Makros)
    USHORT  nSourceIdx2,        // Index in den Inhalt
    USHORT  nSourceIdx3,        // Index in die Inhaltsebene
    USHORT &rIdx1,              // und das gleiche fuer den DestinationPool
    USHORT &rIdx2,              //      ""
    USHORT &rIdx3,              //      ""
    USHORT &rRemovedIdx )       // falls doppelte geloescht werden, Pos zurueck
{
    BOOL bRet = FALSE;

    if (INDEX_IGNORE == rIdx1 && CONTENT_STYLE == nSourceIdx1)
        rIdx1 = CONTENT_STYLE;

    if (CONTENT_STYLE == nSourceIdx1 && CONTENT_STYLE == rIdx1)
    {
        SfxStyleSheetBasePool* pHisPool  = rSource.GetStyleSheetPool();
        SwDocStyleSheetPool* pMyPool =
            (SwDocStyleSheetPool*)GetStyleSheetPool();

        //  wir koennen nicht in uns selbst hin und her moven
        if( pHisPool == pMyPool )
            return FALSE;

        if( INDEX_IGNORE == rIdx2 )
            rIdx2 = pMyPool->Count();

        // erstmal auf die Such-Maske "positionieren"
        pHisPool->First();
        SfxStyleSheetBase* pHisSheet = (*pHisPool)[nSourceIdx2];

        // wenn so eine Vorlage schon existiert: loeschen!
        const String& rOldName = pHisSheet->GetName();
        SfxStyleFamily eOldFamily( pHisSheet->GetFamily() );

        // dflt. PageDesc und StandardZeichenvorlage nie loeschen !!!
        if( ( SFX_STYLE_FAMILY_PAGE == eOldFamily &&
              pDoc->GetPageDesc(0).GetName() == rOldName ) ||
              ( SFX_STYLE_FAMILY_CHAR == eOldFamily &&
                rOldName == *pDoc->GetTextNmArray()[ RES_POOLCOLL_STANDARD -
                                                RES_POOLCOLL_TEXT_BEGIN ] ))
            return FALSE;

        SfxStyleFamily eMyOldFamily( pMyPool->GetSearchFamily() );
        USHORT nMySrchMask = pMyPool->GetSearchMask();

        SfxStyleSheetBase* pExist;
        if( ::FindPhyStyle( *pDoc, rOldName, eOldFamily ) )
        {
            // Bug 20365: nur uebernehmen, wenn das gewuenscht ist!
            if( ERRCODE_BUTTON_OK != ErrorHandler::HandleError(
                *new MessageInfo( ERRCODE_SFXMSG_STYLEREPLACE, rOldName )) )
            {
                return FALSE;
            }

            // Da Replace den aStyleSheet-Member selbst benoetigt, muss
            // das Ergebnis vom Find kopiert werden (s.u.))
            SwDocStyleSheet aExist(
                    *(SwDocStyleSheet*)pMyPool->Find( rOldName, eOldFamily ) );
            pMyPool->Replace( *pHisSheet, aExist );

            // An der Reihenfolge der Vorlagen im Pool aendert sich nichts.
            rIdx2 = rIdx1 = INDEX_IGNORE;

            GetDoc()->SetModified();

            return TRUE;
        }

        pMyPool->SetSearchMask( eOldFamily, nMySrchMask );

        // MIB 18.12.98: SwDocStyleSheetPool::Make liefert einen
        // Pointer auf SwDocStyleSheetPool::aStyleSheet zurueck.
        // Der gleiche Member von SwDocStyleSheetPool::Find benutzt.
        // Deshalb muss hier mit einer Kopie gearbeitet werden.
        // Vorsicht: SfxStyleSheetBase::SetFollow ruft seinerseits
        // ein SwDocStyleSheetPool::Find auf, do dass es nicht genuegt
        // die Find-Aufrufe in dieser Methode zu eleminieren.

        SwDocStyleSheet aNewSheet( (SwDocStyleSheet&)pMyPool
                ->Make(rOldName, eOldFamily, pHisSheet->GetMask() ) );
        if( SFX_STYLE_FAMILY_PAGE == eOldFamily && rSource.ISA(SwDocShell) )
        {
            // gesondert behandeln!!
            SwPageDesc* pDestDsc = (SwPageDesc*)aNewSheet.GetPageDesc();
            SwPageDesc* pCpyDsc = (SwPageDesc*)((SwDocStyleSheet*)pHisSheet)->GetPageDesc();
            pDoc->CopyPageDesc( *pCpyDsc, *pDestDsc );
        }
        else
            // die neue Vorlage mit den Attributen fuellen
            aNewSheet.SetItemSet( pHisSheet->GetItemSet() );

        pMyPool->SetSearchMask( SFX_STYLE_FAMILY_ALL, nMySrchMask );

        if( aNewSheet.IsUserDefined() || aNewSheet.IsUsed() )
        {
            // Benutzte und Benutzer-definierte Vorlagen werden angezeigt.
            // Dshalb muss hier der Index der neuen Vorlage im Pool
            // ermittelt werden.
            pExist = pMyPool->First();
            USHORT nIdx = 0;
            while( pExist )
            {
                if( pExist->GetName() == rOldName &&
                   eOldFamily == pExist->GetFamily() )
                {
                    rIdx2 = nIdx;
                    break;
                }
                pExist = pMyPool->Next();
                nIdx++;
            }
        }
        else
        {
            // Andere Vorlagen werden nicht angezeigt.
            rIdx1 = rIdx2 = INDEX_IGNORE;
        }

/*        pMyPool->Count();       //interne Liste neu fuellen lassen!!!!!

        // suchen, um die richige Insert-Position returnen zu koennen
        pMyPool->Find( rOldName, SFX_STYLE_FAMILY_ALL, nMySrchMask );
        rIdx2 = pMyPool->GetFindPos();*/

        // wer bekommt den Neuen als Parent? wer benutzt den Neuen als Follow?
        // (immer nur ueber die Instanziierten!!!)
        pMyPool->SetSearchMask( eOldFamily, nMySrchMask );
        pMyPool->SetOrganizerMode( TRUE );
        SfxStyleSheetBase* pTestSheet = pMyPool->First();
        while (pTestSheet)
        {
            if (pTestSheet->GetFamily() == eOldFamily &&
                pTestSheet->HasParentSupport()        &&
                pTestSheet->GetParent() == rOldName)
            {
                pTestSheet->SetParent(rOldName); // Verknuepfung neu aufbauen
            }

            if (pTestSheet->GetFamily() == eOldFamily &&
                pTestSheet->HasFollowSupport()        &&
                pTestSheet->GetFollow() == rOldName)
            {
                pTestSheet->SetFollow(rOldName); // Verknuepfung neu aufbauen
            }

            pTestSheet = pMyPool->Next();
        }
        pMyPool->SetOrganizerMode( SFX_CREATE_MODE_ORGANIZER == GetCreateMode() );

        // hat der Neue einen Parent? wenn ja, mit gleichem Namen bei uns suchen
        if (pHisSheet->HasParentSupport())
        {
            const String& rParentName = pHisSheet->GetParent();
            if (0 != rParentName.Len())
            {
                SfxStyleSheetBase* pParentOfNew = pMyPool->Find(rParentName,
                                                                eOldFamily);
                if (pParentOfNew)
                {
                    aNewSheet.SetParent(rParentName);
                }
                pMyPool->SetSearchMask( eOldFamily, nMySrchMask );
            }
        }

        // hat der Neue einen Follow? wenn ja, mit gleichem Namen bei uns suchen
        if (pHisSheet->HasFollowSupport())
        {
            const String& rFollowName = pHisSheet->GetFollow();
            if (0 != rFollowName.Len())
            {
                SfxStyleSheetBase* pFollowOfNew = pMyPool->Find(rFollowName,
                                                                eOldFamily);
                if (pFollowOfNew)
                {
                    aNewSheet.SetFollow(rFollowName);
                }
                pMyPool->SetSearchMask( eOldFamily, nMySrchMask );
            }
        }

        // Bug 27347: alte Einstellung wieder setzen
        pMyPool->SetSearchMask( eMyOldFamily, nMySrchMask );

        // Model geaendert
        ASSERT(pDoc, "Doc fehlt");
        GetDoc()->SetModified();

        bRet = TRUE;
    }
    else
        bRet = SfxObjectShell::Insert( rSource,
                    nSourceIdx1,
                    nSourceIdx2,
                    nSourceIdx3,
                    rIdx1,
                    rIdx2,
                    rIdx3,
                    rRemovedIdx);

    return bRet;
}

/*--------------------------------------------------------------------
    Beschreibung:   Vorlagen Remove
 --------------------------------------------------------------------*/


BOOL SwDocShell::Remove(USHORT nIdx1,       // siehe Insert
                        USHORT nIdx2,
                        USHORT nIdx3)
{
    BOOL bRet = FALSE;

    if (CONTENT_STYLE == nIdx1)
    {
        SwDocStyleSheetPool* pMyPool = (SwDocStyleSheetPool*)GetStyleSheetPool();

        pMyPool->First();       // vorm Zugriff Pool aktualisieren!!
        SfxStyleSheetBase* pMySheet = (*pMyPool)[nIdx2];

        String aName( pMySheet->GetName() );
        SfxStyleFamily eFamily( pMySheet->GetFamily() );

        // dflt. PageDesc und StandardZeichenvorlage nie loeschen !!!
        if( ( SFX_STYLE_FAMILY_PAGE == eFamily &&
              pDoc->GetPageDesc(0).GetName() == aName ) ||
              ( SFX_STYLE_FAMILY_CHAR == eFamily &&
                aName == *pDoc->GetTextNmArray()[ RES_POOLCOLL_STANDARD -
                                                RES_POOLCOLL_TEXT_BEGIN ] ))
            return FALSE;

        // also loeschen
        pMyPool->Erase( pMySheet );

        // jetzt noch die Parents/Follows aller Instanziierten korrigieren
        pMyPool->SetOrganizerMode( TRUE );
        SfxStyleSheetBase* pTestSheet = pMyPool->First();
        while (pTestSheet)
        {
            if (pTestSheet->GetFamily() == eFamily &&
                pTestSheet->HasParentSupport()     &&
                pTestSheet->GetParent() == aName)
            {
                pTestSheet->SetParent( aEmptyStr ); // Verknuepfung aufloesen
            }

            if (pTestSheet->GetFamily() == eFamily &&
                pTestSheet->HasFollowSupport()        &&
                pTestSheet->GetFollow() == aName)
            {
                pTestSheet->SetFollow( aEmptyStr ); // Verknuepfung aufloesen
            }

            pTestSheet = pMyPool->Next();
        }
        pMyPool->SetOrganizerMode( SFX_CREATE_MODE_ORGANIZER == GetCreateMode() );

        bRet = TRUE;
    }
    else
        bRet = SfxObjectShell::Remove(  nIdx1,
                                        nIdx2,
                                        nIdx3 );


    // Model geaendert
    ASSERT(pDoc, "Doc fehlt");
    GetDoc()->SetModified();

    return bRet;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwDocShell::Execute(SfxRequest& rReq)
{
    const SfxItemSet* pArgs = rReq.GetArgs();
    const SfxPoolItem* pItem;
    USHORT nWhich = rReq.GetSlot();
    BOOL bDone = FALSE;
    switch ( nWhich )
    {
        case FN_AUTO_CORRECT_DLG:
        {
            OfficeApplication *pOApp = OFF_APP();

            SfxBoolItem aSwOptions( SID_AUTO_CORRECT_DLG, TRUE );
            SvxSwAutoFmtFlags* pAFlags = &pOApp->GetAutoCorrect()->GetSwFlags();
            SwAutoCompleteWord& rACW = SwDoc::GetAutoCompleteWords();

            BOOL bOldLocked = rACW.IsLockWordLstLocked(),
                 bOldAutoCmpltCollectWords = pAFlags->bAutoCmpltCollectWords;

            rACW.SetLockWordLstLocked( TRUE );

            SvStringsISortDtor aTmpLst;
            aTmpLst.Insert( &rACW.GetWordList() );
            pAFlags->pAutoCmpltList = &aTmpLst;

            pOApp->GetDispatcher().Execute( SID_AUTO_CORRECT_DLG,
                                     SFX_CALLMODE_SYNCHRON, &aSwOptions, 0L );

            rACW.SetLockWordLstLocked( bOldLocked );

            SwEditShell::SetAutoFmtFlags( pAFlags );
            rACW.SetMinWordLen( pAFlags->nAutoCmpltWordLen );
            rACW.SetMaxCount( pAFlags->nAutoCmpltListLen );
            if( pAFlags->pAutoCmpltList )  // any changes?
            {
                rACW.CheckChangedList( aTmpLst );
                // clear the temp WordList pointer
                pAFlags->pAutoCmpltList = 0;
            }
            // remove all pointer we never delete the strings
            aTmpLst.Remove( (USHORT)0, aTmpLst.Count() );

            if( !bOldAutoCmpltCollectWords && bOldAutoCmpltCollectWords !=
                pAFlags->bAutoCmpltCollectWords )
            {
                // call on all Docs the idle formatter to start
                // the collection of Words
                TypeId aType = TYPE(SwDocShell);
                for( SwDocShell *pDocSh = (SwDocShell*)SfxObjectShell::GetFirst(&aType);
                     pDocSh;
                     pDocSh = (SwDocShell*)SfxObjectShell::GetNext( *pDocSh, &aType ) )
                {
                    SwDoc* pTmp = pDocSh->GetDoc();
                    if ( pTmp->GetRootFrm() )
                        pTmp->InvalidateAutoCompleteFlag();
                }
            }
        }
        break;

        case SID_PRINTPREVIEW:
            {
                BOOL bSet = FALSE, bFound = FALSE, bOnly = TRUE;
                SfxViewFrame *pTmpFrm = SfxViewFrame::GetFirst(this);
                SfxViewShell* pViewShell = SfxViewShell::Current();
                SwView* pView = PTR_CAST( SwView, pViewShell );
                BOOL bCurrent = IS_TYPE( SwPagePreView, pViewShell );

                while( pTmpFrm )    // search PreView
                {
                    if( IS_TYPE( SwView, pTmpFrm->GetViewShell()) )
                        bOnly = FALSE;
                    else if( IS_TYPE( SwPagePreView, pTmpFrm->GetViewShell()))
                    {
                        pTmpFrm->GetFrame()->Appear();
                        bFound = TRUE;
                    }
                    if( bFound && !bOnly )
                        break;
                    pTmpFrm = pTmpFrm->GetNext(*pTmpFrm, this);
                }

                if( pArgs && SFX_ITEM_SET ==
                    pArgs->GetItemState( SID_PRINTPREVIEW, FALSE, &pItem ))
                    bSet = ((SfxBoolItem*)pItem)->GetValue();
                else
                    bSet = !bCurrent;

                USHORT nSlotId = 0;
                if( bSet && !bFound )   // Keine gefunden, daher neue Preview anlegen
                {
                    //Keine neue anlegen fuer BrowseView!
                    if( !GetDoc()->IsBrowseMode() )
                        nSlotId = SID_VIEWSHELL1;
                }
                else if( bFound && !bSet )
                    nSlotId = bOnly ? SID_VIEWSHELL0 : SID_VIEWSHELL1;

                if( nSlotId )
                {
                    if( pView && pView->GetDocShell() == this )
                        pTmpFrm = pView->GetViewFrame();
                    else
                        pTmpFrm = SfxViewFrame::GetFirst( this );

                    pTmpFrm->GetBindings().Execute( nSlotId, NULL, 0,
                                                    SFX_CALLMODE_ASYNCHRON );
                }
                rReq.SetReturnValue(SfxBoolItem(SID_PRINTPREVIEW, bSet ));
            }
            break;
        case SID_TEMPLATE_LOAD:
            {
                String aFileName;
                BOOL bText = FALSE;
                BOOL bFrame = FALSE;
                BOOL bPage = FALSE;
                BOOL bOverwrite = FALSE;
                BOOL bNumbering = FALSE;
                USHORT nRet = USHRT_MAX;
                SwLoadTemplateDlg* pDlg = new SwLoadTemplateDlg(0);
                pDlg->SetPath( SFX_INIMANAGER()->Get( SFX_KEY_WORK_PATH ));
                String sSW5(String::CreateFromAscii(FILTER_SW5));

                SfxObjectFactory &rFact = GetFactory();
                for( USHORT i = 0; i < rFact.GetFilterCount(); i++ )
                {
                    const SfxFilter* pFlt = rFact.GetFilter( i );
                    if( pFlt && pFlt->IsAllowedAsTemplate() )
                        pDlg->AddFilter( pFlt->GetUIName(),
                                    ((WildCard&)pFlt->GetWildcard())(),
                                    pFlt->GetTypeName() );

                    if( pFlt->GetUserData() == sSW5 )
                        pDlg->SetCurFilter( pFlt->GetUIName() );
                }

                nRet = pDlg->Execute();
                if( nRet == RET_OK )
                {
                    aFileName = pDlg->GetPath();
                }
                else if( nRet == RET_TEMPLATE )
                {
                    SfxNewFileDialog* pNewDlg = pDlg->GetNewFileDlg();

                    nRet = pNewDlg->Execute();
                    if( nRet == RET_OK )
                        aFileName = pNewDlg->GetTemplateFileName();
                }
                bText       = pDlg->IsTextStyle();
                bFrame      = pDlg->IsFrameStyle();
                bPage       = pDlg->IsPageStyle();
                bOverwrite  = pDlg->IsOverwrite();
                bNumbering  = pDlg->IsNumbering();
                USHORT nFlags = (USHORT)bText +
                                ((USHORT)bFrame << 1) +
                                ((USHORT)bPage << 2) +
                                ((USHORT)bOverwrite << 3) +
                                ((USHORT)bNumbering << 4);
                delete pDlg;
                if(aFileName.Len())
                {
                    // Create a URL from filename
                    INetURLObject aURLObj;
                    aURLObj.SetSmartProtocol( INET_PROT_FILE );
                    aURLObj.SetURL( aFileName );
                    if( INET_PROT_FILE != aURLObj.GetProtocol() )
                        break;

                    String sURL( aURLObj.GetMainURL() );

                    String sBaseURL( INetURLObject::GetBaseURL() );
                    INetURLObject::SetBaseURL( sURL );

                    SvStorageRef pStor;
                    SvFileStream* pStream = 0;
                    SwRead pRead = 0;
                    SwReader* pReader = 0;
                    if( SvStorage::IsStorageFile( aFileName ))
                    {
                        // Filter bestimmen:
                        const SfxFilter* pFlt = SwIoSystem::GetFileFilter(
                                                    aFileName, aEmptyStr );
                        pStor = new SvStorage( aFileName, STREAM_STD_READ );

                        if( pFlt && pFlt->GetVersion() )
                            pStor->SetVersion( (long)pFlt->GetVersion() );

                        pRead = ReadSw3;
                        pReader = new SwReader(*pStor, sURL,
                                               *pWrtShell->GetCrsr() );
                    }
                    else
                    {
                        const SfxFilter* pFlt = SwIoSystem::GetFileFilter(
                                                    aFileName, aEmptyStr );
                        if( pFlt )
                        {
                            if( pFlt->GetUserData() == String::CreateFromAscii(FILTER_SWG) ||
                                pFlt->GetUserData() == String::CreateFromAscii(FILTER_SWGV) )
                            {
                                pRead = ReadSwg;
                            }
                            else if( pFlt->GetUserData() == String::CreateFromAscii(FILTER_XML) )
                            {
                                pRead = ReadXML;
                            }
                        }

                        if( pRead )
                        {
                            pStream = new SvFileStream( aFileName,
                                                        STREAM_STD_READ );
                            pReader = new SwReader(*pStream, sURL, pDoc);
                        }
                    }
                    ASSERT( pRead, "no reader found" );
                    if( pRead )
                    {
                        pRead->GetReaderOpt().SetAllFmtsOnly();
                        pRead->GetReaderOpt().SetTxtFmts(bText);
                        pRead->GetReaderOpt().SetFrmFmts(bFrame);
                        pRead->GetReaderOpt().SetPageDescs(bPage);
                        pRead->GetReaderOpt().SetNumRules(bNumbering);
                        pRead->GetReaderOpt().SetMerge(!bOverwrite);

                        pWrtShell->StartAllAction();
                        SetError( pReader->Read( *pRead ));
                        pWrtShell->EndAllAction();
                    }


                    delete pReader;
                    delete pStream;

                    INetURLObject::SetBaseURL( sBaseURL );
                }
            }
            break;
            case SID_SOURCEVIEW:
            {
                SfxViewShell* pViewShell = GetView()
                                            ? (SfxViewShell*)GetView()
                                            : SfxViewShell::Current();
                SfxViewFrame*  pViewFrm = pViewShell->GetViewFrame();
                SwSrcView* pSrcView = PTR_CAST(SwSrcView, pViewShell);
                if(!pSrcView)
                {
                    if(!HasName())
                    {
                        const SfxBoolItem* pBool = (const SfxBoolItem*)
                                pViewFrm->GetDispatcher()->Execute(
                                        SID_SAVEASDOC, SFX_CALLMODE_SYNCHRON );
                        if(!pBool || !pBool->GetValue())
                            break;
                    }
                    else
                    {
                        pViewFrm->GetDispatcher()->Execute(
                                        SID_SAVEDOC, SFX_CALLMODE_SYNCHRON );
                    }
                }
#ifdef DBG_UTIL
                {
                    BOOL bWeb = 0 != PTR_CAST(SwWebDocShell, this);
                    DBG_ASSERT(bWeb == TRUE, "SourceView nur in der WebDocShell")
                }
#endif
                // die SourceView ist fuer die SwWebDocShell die 1
                USHORT nSlot = SID_VIEWSHELL1;
                BOOL bSetModified = FALSE;
                SfxPrinter* pSavePrinter = 0;
                if( 0 != pSrcView)
                {
                    SfxPrinter* pTemp = GetDoc()->GetPrt(FALSE);
                    if(pTemp)
                        pSavePrinter = new SfxPrinter(*pTemp);
                    bSetModified = IsModified() || pSrcView->IsModified();
                    if(pSrcView->IsModified()||pSrcView->HasSourceSaved())
                    {
                        TempFile aTempFile;
                        aTempFile.EnableKillingFile();
                        pSrcView->SaveContent(aTempFile.GetName());
                        bDone = TRUE;
                        SetActualSize(pSrcView->GetEditWin().GetSizePixel());
                        SfxEventConfiguration* pEvent = SFX_APP()->GetEventConfig();
                        SvxMacro aMac(aEmptyStr, aEmptyStr, STARBASIC);
                        pEvent->ConfigureEvent(SFX_EVENT_OPENDOC,       aMac, this);
                        pEvent->ConfigureEvent(SFX_EVENT_CLOSEDOC,      aMac, this);
                        pEvent->ConfigureEvent(SFX_EVENT_ACTIVATEDOC,   aMac, this);
                        pEvent->ConfigureEvent(SFX_EVENT_DEACTIVATEDOC, aMac, this);
                        ReloadFromHtml(aTempFile.GetName(), pSrcView);
                        nSlot = 0;
                    }
                    else
                    {
                        nSlot = SID_VIEWSHELL0;
                    }
                }
/*   OS 10.04.97 14.20: Im Web-Writer gibt es keinen Unterschied zwischen
                        Export in den SourceMode und dem Speichern des Docs
                else if(IsModified())
                {
                    USHORT nRet = QueryBox( SFX_APPWINDOW ,SW_RES(MSG_SAVE_HTML_QUERY)).Execute();
                    if(RET_YES == nRet)
                    {
                        S F X _DISPATCHER().Execute(SID_SAVEDOC,
                                    SFX_CALLMODE_SYNCHRON|SFX_CALLMODE_RECORD);
                        // der ReturnValue von SID_SAVEDOC ist etwas schwer verstaendlich
                        if(IsModified())
                            nSlot = 0;
                    }
                    else if( RET_CANCEL == nRet )
                    {
                        nSlot = 0;
                    }
                }*/
                if(nSlot)
                    pViewFrm->GetDispatcher()->Execute(nSlot, SFX_CALLMODE_SYNCHRON);
                if(bSetModified)
                    GetDoc()->SetModified();
                if(pSavePrinter)
                {
                    GetDoc()->SetPrt(pSavePrinter);
                    //pSavePrinter darf nicht wieder geloescht werden
                }
                pViewFrm->GetBindings().SetState(SfxBoolItem(SID_SOURCEVIEW, nSlot == SID_VIEWSHELL2));
            }
            break;
            case SID_GET_COLORTABLE:
            {
                SvxColorTableItem* pColItem = (SvxColorTableItem*)GetItem(SID_COLOR_TABLE);
                XColorTable* pTable = pColItem->GetColorTable();
                rReq.SetReturnValue(OfaPtrItem(SID_GET_COLORTABLE, pTable));
            }
            break;
        case FN_ABSTRACT_STARIMPRESS:
        case FN_ABSTRACT_NEWDOC:
        {
            SwInsertAbstractDlg* pDlg = new SwInsertAbstractDlg(0);
            if(RET_OK == pDlg->Execute())
            {
                BYTE nLevel = pDlg->GetLevel();
                BYTE nPara = pDlg->GetPara();
                SwDoc* pDoc = new SwDoc();
                SfxObjectShellRef xDocSh( new SwDocShell( pDoc, SFX_CREATE_MODE_STANDARD));
                xDocSh->DoInitNew( 0 );
                BOOL bImpress = FN_ABSTRACT_STARIMPRESS == nWhich;
                pWrtShell->Summary( pDoc, nLevel, nPara, bImpress );
                if( bImpress )
                {
                    WriterRef xWrt;
                    ::GetRTFWriter( aEmptyStr, xWrt );
                    SvMemoryStream *pStrm = new SvMemoryStream();
                    pStrm->SetBufferSize( 16348 );
                    SwWriter aWrt( *pStrm, *pDoc );
                    ErrCode eErr = aWrt.Write( xWrt );
                    if( !ERRCODE_TOERROR( eErr ) )
                    {
                        pStrm->Seek( STREAM_SEEK_TO_END );
                        *pStrm << '\0';
                        pStrm->Seek( STREAM_SEEK_TO_BEGIN );
                        //Die Lockbytes werden owner des Stream*
                        SvLockBytes *pLockBytes = new SvLockBytes( pStrm, TRUE );
                        //Das Item wird owner des LockBytes*
                        SfxLockBytesItem aItem( SID_OUTLINE_TO_IMPRESS, pLockBytes );
                        SfxModule *pMod = (*(SfxModule**)GetAppData(SHL_DRAW))->Load();
                        SfxItemSet aSet( pMod->GetPool(), SID_OUTLINE_TO_IMPRESS,
                                                            SID_OUTLINE_TO_IMPRESS );
                        aSet.Put( aItem );
                        SfxAllItemSet aArgs( pMod->GetPool() );
                        aArgs.Put( aSet );
                        SfxRequest aReq( SID_OUTLINE_TO_IMPRESS, 0, aArgs );
                        pMod->ExecuteSlot( aReq );
                    }
                    else
                        ErrorHandler::HandleError(ErrCode( eErr ));
                }
                else
                {
                    // Neues Dokument erzeugen.
                    SfxViewFrame *pFrame = SFX_APP()->CreateViewFrame( *xDocSh, 0 );
                    SwView      *pView = (SwView*) pFrame->GetViewShell();

                    // Dokumenttitel setzen
                    String aTmp( SW_RES(STR_ABSTRACT_TITLE) );
                    aTmp += GetTitle();
                    xDocSh->SetTitle( aTmp );
                    pView->GetWrtShell().SetNewDoc();
                    pFrame->Show();
                    pDoc->SetModified();
                }

            }
            delete pDlg;
        }
        break;
        case FN_OUTLINE_TO_CLIPBOARD:
        case FN_OUTLINE_TO_IMPRESS:
            {
                WriterRef xWrt;
                ::GetRTFWriter( 'O', xWrt );
                SvMemoryStream *pStrm = new SvMemoryStream();
                pStrm->SetBufferSize( 16348 );
                SwWriter aWrt( *pStrm, *GetDoc() );
                ErrCode eErr = aWrt.Write( xWrt );
                if( !ERRCODE_TOERROR( eErr ) )
                {
                    pStrm->Seek( STREAM_SEEK_TO_END );
                    *pStrm << '\0';
                    pStrm->Seek( STREAM_SEEK_TO_BEGIN );
                    if ( nWhich == FN_OUTLINE_TO_IMPRESS )
                    {
                        //Die Lockbytes werden owner des Stream*
                        SvLockBytes *pLockBytes = new SvLockBytes( pStrm, TRUE );
                        //Das Item wird owner des LockBytes*
                        SfxLockBytesItem aItem( SID_OUTLINE_TO_IMPRESS, pLockBytes );
                        SfxModule *pMod = (*(SfxModule**)GetAppData(SHL_DRAW))->Load();
                        SfxItemSet aSet( pMod->GetPool(), SID_OUTLINE_TO_IMPRESS,
                                                          SID_OUTLINE_TO_IMPRESS );
                        aSet.Put( aItem );
                        SfxAllItemSet aArgs( pMod->GetPool() );
                        aArgs.Put( aSet );
                        SfxRequest aReq( SID_OUTLINE_TO_IMPRESS, 0, aArgs );
                        pMod->ExecuteSlot( aReq );
                    }
                    else
                    {
                        Clipboard::Clear();
                        Clipboard::CopyData( pStrm->GetData(), pStrm->GetSize(),
                                             FORMAT_RTF );
                        delete pStrm;
                    }
                }
                else
                    ErrorHandler::HandleError(ErrCode( eErr ));
            }
            break;
            case SID_SPELLCHECKER_CHANGED:
                //! FALSE, TRUE, TRUE is on the save side but a probably overdone
                SW_MOD()->CheckSpellChanges(FALSE, TRUE, TRUE );
            break;

            case SID_BROWSER_MODE:
            case FN_PRINT_LAYOUT:   //Fuer Web, genau umgekehrt zum BrowserMode
            {
                int eState = STATE_TOGGLE;
                BOOL bSet;
                const SfxPoolItem* pAttr;
                if ( pArgs && SFX_ITEM_SET == pArgs->GetItemState( nWhich , FALSE, &pAttr ))
                {
                    bSet = ((SfxBoolItem*)pAttr)->GetValue();
                    if ( nWhich == FN_PRINT_LAYOUT )
                        bSet = !bSet;
                    eState = bSet ? STATE_ON : STATE_OFF;
                }

                if ( STATE_TOGGLE == eState )
                    bSet = !GetDoc()->IsBrowseMode();

                ToggleBrowserMode(bSet, 0);

                // OS: numerische Reihenfolge beachten!
                static USHORT __READONLY_DATA aInva[] =
                                    {
                                        SID_NEWWINDOW,
                                        SID_RULER_BORDERS, SID_RULER_PAGE_POS,
                                        SID_ATTR_LONG_LRSPACE,
                                        SID_HTML_MODE,
                                        SID_RULER_PROTECT,
                                        SID_AUTOSPELL_CHECK,
                                        SID_AUTOSPELL_MARKOFF,
                                        FN_RULER,       /*20211*/
                                        FN_VIEW_GRAPHIC,    /*20313*/
                                        FN_VIEW_BOUNDS,     /**/
                                        FN_VIEW_FIELDS,     /**/
                                        FN_VLINEAL,             /**/
                                        FN_VSCROLLBAR,      /**/
                                        FN_HSCROLLBAR,      /**/
                                        FN_VIEW_META_CHARS, /**/
                                        FN_VIEW_MARKS,      /**/
                                        FN_VIEW_FIELDNAME,  /**/
                                        FN_VIEW_TABLEGRID,  /**/
                                        FN_QRY_MERGE,   /*20364*/
                                        FN_STAT_HYPERLINKS, /*21186*/
                                        FN_INSERT_HEADER, /*21405*/
                                        FN_INSERT_FOOTER, /*21406*/
                                        0
                                    };
                pWrtShell->GetView().GetViewFrame()->GetBindings().Invalidate( aInva );
            }
            break;

        case SID_MAIL_PREPAREEXPORT:
            {
                pWrtShell->StartAllAction();
                pDoc->UpdateFlds( 0 );
                pDoc->EmbedAllLinks();
                pDoc->RemoveInvisibleContent();
                pWrtShell->EndAllAction();
            }
            break;

        case FN_NEW_HTML_DOC:
        case FN_NEW_GLOBAL_DOC:
            {
                bDone = FALSE;
                String aFileName, sTemplateName;

                const SwTxtFmtColl* pSplitColl = 0;

                SfxFileDialog* pFileDlg =
                    new SfxFileDialog( 0, WB_SAVEAS|WB_SVLOOK );
                const SfxFilter* pFlt;
                USHORT nStrId;

                if( FN_NEW_HTML_DOC == nWhich )
                {
                    // fuer HTML gibts es nur einen Filter!!
                    pFlt = SwIoSystem::GetFilterOfFormat( String::CreateFromAscii("HTML"),
                            SwWebDocShell::Factory().GetFilterContainer() );
                    nStrId = STR_LOAD_HTML_DOC;
                }
                else
                {
                    // Fuer Global-Dokumente bieten wir jetzt auch nur
                    // noch den aktuellen an.
                    pFlt = SwIoSystem::GetFilterOfFormat( String::CreateFromAscii(FILTER_SW5),
                            SwGlobalDocShell::Factory().GetFilterContainer() );
                    nStrId = STR_LOAD_GLOBAL_DOC;
                }

                if( pFlt )
                {
                    pFileDlg->AddFilter( pFlt->GetUIName(),
                                ((WildCard&)pFlt->GetWildcard())(),
                                pFlt->GetTypeName() );

                    pFileDlg->SetCurFilter( pFlt->GetUIName() );
                }

                Window *pTemplateFT = AddTemplateBtn(pFileDlg);
                pFileDlg->SetText( SW_RESSTR( nStrId ));
                pFileDlg->SetPath( SFX_INIMANAGER()->Get(
                                            SFX_KEY_WORK_PATH ) );

                if( RET_OK == pFileDlg->Execute() )
                {
                    aFileName = pFileDlg->GetPath();
                    sTemplateName = pTemplateFT->GetText();
                    sTemplateName.Erase(0, String(SW_RESSTR(STR_FDLG_TEMPLATE_NAME)).Len());

                    if (sTemplateName.Len())
                        pSplitColl = pDoc->FindTxtFmtCollByName(sTemplateName);
                }

                delete pFileDlg;

                if( aFileName.Len() )
                {
                    if( PrepareClose( FALSE ) &&
                        ( FN_NEW_HTML_DOC == nWhich
                            ? pWrtShell->GenerateHTMLDoc( aFileName, pSplitColl )
                            : pWrtShell->GenerateGlobalDoc( aFileName, pSplitColl )) )
                    {
                        bDone = TRUE;
                        DoClose();
                        SfxStringItem aName( SID_FILE_NAME, aFileName );
                        SfxStringItem aReferer( SID_REFERER, aEmptyStr );

                        SFX_APP()->GetDispatcher().Execute( SID_OPENDOC,
                            SFX_CALLMODE_SYNCHRON|SFX_CALLMODE_RECORD,
                                            &aName,
                                            &aReferer,
                                            0L );
                    }
                    else if( !rReq.IsAPI() )
                    {
                        InfoBox( 0,
                                    SW_RESSTR( STR_CANTCREATE )).Execute();
                    }
                }
            }
            rReq.SetReturnValue(SfxBoolItem( nWhich, bDone ));
            break;
        case SID_ATTR_YEAR2000:
            if ( pArgs && SFX_ITEM_SET == pArgs->GetItemState( nWhich , FALSE, &pItem ))
            {
                DBG_ASSERT(pItem->ISA(SfxUInt16Item), "falsches Item")
                USHORT nYear2K = ((SfxUInt16Item*)pItem)->GetValue();
                //ueber Views iterieren und den State an den FormShells setzen

                SfxViewFrame* pVFrame = SfxViewFrame::GetFirst( this );
                SfxViewShell* pViewShell = pVFrame ? pVFrame->GetViewShell() : 0;
                SwView* pView = PTR_CAST(SwView, pViewShell);
                while(pView)
                {
                    FmFormShell* pFormShell = pView->GetFormShell();
                    if(pFormShell)
                        pFormShell->SetY2KState(nYear2K);
                    pVFrame = SfxViewFrame::GetNext( *pVFrame, this );
                    pViewShell = pVFrame ? pVFrame->GetViewShell() : 0;
                    pView = PTR_CAST(SwView, pViewShell);
                }
                pDoc->GetNumberFormatter(TRUE)->SetYear2000(nYear2K);
            }
        break;

        default: DBG_ERROR("falscher Dispatcher");
    }
}


/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

long SwDocShell::DdeGetData( const String& rItem, SvData& rData )
{
    return pDoc->GetData( rItem, rData );
}


/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

long SwDocShell::DdeSetData( const String& rItem, const SvData& rData )
{
    return pDoc->ChangeData( rItem, rData );
}


/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SvPseudoObject* SwDocShell::DdeCreateHotLink( const String& rItem )
{
    return pDoc->CreateHotLink( rItem );
}


/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwDocShell::FillRegInfo( SvEmbeddedRegistryInfo*  pInfo )
{
    SfxInPlaceObject::FillRegInfo( pInfo );
    pInfo->aObjName = String::CreateFromAscii("StarWriterDocument");
    pInfo->nMajorVers = 5;
    pInfo->nMinorVers = 0;
    pInfo->aHumanShortTypeName = SW_RESSTR(STR_HUMAN_SWDOC_NAME);
    pInfo->nIconResId = REG_ICON_RESID_WRITER;
/*

JP 25.11.96: das sollte der SFX erledigen!

    SwFilterNms& rFltNms = *GetFilterNames();
    pInfo->aFilterList.Insert( SvFilter( Exchange::RegisterFormatName(
                                    rFltNms.GetSW4FltName()->aFilterName )) );

    SvFilter aFlt( Exchange::RegisterFormatName(
                                    rFltNms.GetSW3FltName()->aFilterName ));
    aFlt.SetExport( FALSE );
    pInfo->aFilterList.Insert( aFlt );
*/
}


/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwDocShell::FillClass( SvGlobalName * pClassName,
                                   ULONG * pClipFormat,
                                   String * pAppName,
                                   String * pLongUserName,
                                   String * pUserName,
                                   long nVersion ) const
{
    SfxInPlaceObject::FillClass(pClassName, pClipFormat, pAppName, pLongUserName,
                                pUserName, nVersion);

    if (nVersion == SOFFICE_FILEFORMAT_31)
    {
//        *pClassName       = SvGlobalName(0xDC5C7E40L, 0xB35C, 0x101B, 0x99, 0x61,
//                                     0x04, 0x02, 0x1C, 0x00, 0x70,0x02);
        *pClassName     = SvGlobalName( SO3_SW_CLASSID_30 );

        *pClipFormat    = SOT_FORMATSTR_ID_STARWRITER_30;
        *pAppName       = String::CreateFromAscii("Swriter 3.1");
        *pLongUserName  = SW_RESSTR(STR_WRITER_DOCUMENT_FULLTYPE_31);
    }
    else if (nVersion == SOFFICE_FILEFORMAT_40)
    {
//        *pClassName       = SvGlobalName(0xDC5C7E40L, 0xB35C, 0x101B, 0x99, 0x61,
//                                     0x04, 0x02, 0x1C, 0x00, 0x70,0x02);
        *pClassName     = SvGlobalName( SO3_SW_CLASSID_40 );

        *pClipFormat    = SOT_FORMATSTR_ID_STARWRITER_40;
        *pAppName       = String::CreateFromAscii("StarWriter 4.0");
        *pLongUserName  = SW_RESSTR(STR_WRITER_DOCUMENT_FULLTYPE_40);
    }
    else if (nVersion == SOFFICE_FILEFORMAT_NOW)
    {
        *pLongUserName = SW_RESSTR(STR_WRITER_DOCUMENT_FULLTYPE);
    }
    *pUserName = SW_RESSTR(STR_HUMAN_SWDOC_NAME);
}


/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwDocShell::SetModified( BOOL bSet )
{
    SfxInPlaceObject::SetModified( bSet );
    if( IsEnableSetModified() && !pDoc->IsInCallModified() )
    {
        EnableSetModified( FALSE );

        if( bSet )
        {
            BOOL bOld = pDoc->IsModified();
            pDoc->SetModified();
            if( !bOld )
                pDoc->SetUndoNoResetModified();
        }
        else
            pDoc->ResetModified();

        EnableSetModified( TRUE );
    }
    UpdateChildWindows();
    Broadcast(SfxSimpleHint(SFX_HINT_DOCCHANGED));
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwDocShell::UpdateChildWindows()
{
    // Flddlg ggf neu initialisieren (z.B. fuer TYP_SETVAR)
    if(!GetView())
        return;
    SfxViewFrame* pVFrame = GetView()->GetViewFrame();
    SwFldDlgWrapper *pWrp = (SwFldDlgWrapper*)pVFrame->
            GetChildWindow( SwFldDlgWrapper::GetChildWindowId() );
    if( pWrp )
        pWrp->ReInitDlg( this );

    // RedlineDlg ggf neu initialisieren
    SwRedlineAcceptChild *pRed = (SwRedlineAcceptChild*)pVFrame->
            GetChildWindow( SwRedlineAcceptChild::GetChildWindowId() );
    if( pRed )
        pRed->ReInitDlg( this );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwDocShell::ReloadFromHtml( const String& rStreamName, SwSrcView* pSrcView )
{
    BOOL bModified = IsModified();
    SvFileStream aStream(rStreamName, STREAM_READ);

    // MIB 23.6.97: Die HTTP-Header-Felder muessen geloescht werden,
    // sonst gibt es welche aus Meta-Tags hinter doppelt und dreifach.
    ClearHeaderAttributesForSourceViewHack();

    // MIB 24.07.97: Das Dokument-Basic muss auch noch d'ran glauben ...
    // Ein EnterBasicCall braucht man hier nicht, weil man nichts ruft und
    // in HTML-Dokument kein Dok-Basic vorhanden sein kann, das noch nicht
    // geladen wurde.
    OfficeApplication* pOffApp = OFF_APP();
    OfaHtmlOptions* pHtmlOptions = pOffApp->GetHtmlOptions();
    //#59620# HasBasic() zeigt an, dass es schon einen BasicManager an der DocShell
    //          gibt. Der wurde im HTML-Import immer angelegt, wenn Macros im Quelltext
    //          vorhanden sind.
    if( pHtmlOptions && pHtmlOptions->IsStarBasic() && HasBasic())
    {
        BasicManager *pBasicMan = GetBasicManager();
        if( pBasicMan && (pBasicMan != pOffApp->GetBasicManager()) )
        {
            USHORT nLibCount = pBasicMan->GetLibCount();
            while( nLibCount )
            {
                StarBASIC *pBasic = pBasicMan->GetLib( --nLibCount );
                if( pBasic )
                {
                    // Die IDE benachrichtigen
                    String aLibName( String::CreateFromAscii("[" ));
                    ((aLibName += GetTitle()) += String::CreateFromAscii("].")) += pBasic->GetName();
                    SfxStringItem aStrItem( SID_BASICIDE_ARG_LIBNAME, aLibName );

                    pSrcView->GetViewFrame()->GetDispatcher()->Execute( SID_BASICIDE_LIBREMOVED,
                                              SFX_CALLMODE_SYNCHRON,
                                              &aStrItem, 0L );

                    // Aus der Standard-Lib werden nur die Module geloescht
                    if( nLibCount )
                        pBasicMan->RemoveLib( nLibCount, TRUE );
                    else
                        pBasic->Clear();
                }
            }

            ASSERT( pBasicMan->GetLibCount() <= 1,
                    "Loschen des Basics hat nicht geklappt" );
        }
    }

    RemoveLink();
    delete pIo;
    pIo = 0;
    //jetzt muss auch das UNO-Model ueber das neue Doc informiert werden #51535#
    uno::Reference<text::XTextDocument> xDoc(GetBaseModel(), uno::UNO_QUERY);
    text::XTextDocument* pxDoc = xDoc.get();
    ((SwXTextDocument*)pxDoc)->InitNewDoc();


    AddLink();
    pSrcView->SetPool(&GetPool());

    String sBaseURL = INetURLObject::GetBaseURL();
    const String& rMedname = GetMedium()->GetName();
    INetURLObject::SetBaseURL( rMedname );

    // fix #51032#: Die HTML-Vorlage muss noch gesetzt werden
    SetHTMLTemplate( *GetDoc() );   //Styles aus HTML.vor

    SfxViewShell* pViewShell = GetView() ? (SfxViewShell*)GetView()
                                         : SfxViewShell::Current();
    SfxViewFrame*  pViewFrm = pViewShell->GetViewFrame();
    pViewFrm->GetDispatcher()->Execute( SID_VIEWSHELL0, SFX_CALLMODE_SYNCHRON );

    SubInitNew();

    SwReader aReader( aStream, rMedname, pDoc );
    aReader.Read( *ReadHTML );
    aStream.Close();
    INetURLObject::SetBaseURL(sBaseURL);


    // MIB 23.6.97: Die HTTP-Header-Attribute wieder in die DokInfo
    // uebernehmen. Die Base-URL ist hier egal, da TLX zum absolutieren die
    // vom Dokument nimmt.
    SetHeaderAttributesForSourceViewHack();

    if(bModified && !IsReadOnly())
        SetModified();
    else
        pDoc->ResetModified();
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

Window *SwDocShell::AddTemplateBtn(SfxFileDialog* pFileDlg)
{
    PushButton *pTemplateBtn = new PushButton( pFileDlg );
    pTemplateBtn->SetText( SW_RESSTR(STR_FDLG_TEMPLATE_BUTTON) );
    pTemplateBtn->SetClickHdl(LINK(this, SwDocShell, SelTemplateHdl));
    pTemplateBtn->SetHelpId(HID_SELECT_TEMPLATE);
#if (SUPD>503)
    pFileDlg->AddControl( pTemplateBtn, TRUE );
#else
    pFileDlg->AddControl( pTemplateBtn );
#endif
    pTemplateBtn->Show();

    FixedText *pTemplateFT = new FixedText( pFileDlg );

    String sName( SW_RES( STR_FDLG_TEMPLATE_NAME ));
    sName += SwSelTemplateDlg::GetStartTemplate( *pWrtShell );
    pTemplateFT->SetText(sName);

    pFileDlg->AddControl( pTemplateFT );
    pTemplateFT->SetSizePixel(Size(pTemplateFT->LogicToPixel(Size(160, 1), MAP_APPFONT).Width(), pTemplateFT->GetSizePixel().Height()));
    pTemplateFT->Show();

    pTemplateBtn->SetData(pTemplateFT); // Verweis auf den Template-Namen

    // Die hinzugefuegten Controls werden spaeter vom FileDlg geloescht
    return pTemplateFT;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwDocShell, SelTemplateHdl, PushButton *, pBtn )
{
    if (pWrtShell)
    {
        FixedText *pFT = (FixedText*)pBtn->GetData();
        String sFixName(SW_RES(STR_FDLG_TEMPLATE_NAME));

        String sName(pFT->GetText());
        sName.Erase(0, sFixName.Len());

        SwSelTemplateDlg aDlg( pBtn, pWrtShell, sName);

        if( aDlg.Execute() == RET_OK )
        {
            sFixName += sName;
            pFT->SetText(sFixName);
        }
    }

    return 0;
}
/* -----------------------------14.12.99 16:52--------------------------------

 ---------------------------------------------------------------------------*/
void    SwDocShell::ToggleBrowserMode(BOOL bSet, SwView* pView )
{
    GetDoc()->SetBrowseMode( bSet );
    SwView* pTempView = pView ? pView : (SwView*)GetView();
    pTempView->GetViewFrame()->GetBindings().Invalidate(FN_SHADOWCURSOR);
    UpdateFontList();
    if( pTempView )
    {
        if( !GetDoc()->GetPrt( FALSE ) )
            pTempView->SetPrinter( GetDoc()->GetPrt( TRUE ),
                    SFX_PRINTER_PRINTER|SFX_PRINTER_JOBSETUP );

        //Wenn wir die BrowseView einschalten, darf es nur diese eine
        //Sicht auf das Dokument geben, alle anderen werden geschlossen.
        SfxViewFrame *pTmpFrm = SfxViewFrame::GetFirst(this, 0, FALSE);
        do
        {   if ( pTmpFrm != pTempView->GetViewFrame() )
            {
                pTmpFrm->DoClose();
                pTmpFrm = SfxViewFrame::GetFirst(this, 0, FALSE);
            }
            else
                pTmpFrm = pTmpFrm->GetNext(*pTmpFrm, this, 0, FALSE);

        } while ( pTmpFrm );

        pTempView->GetWrtShell().CheckBrowseView( TRUE );
        pTempView->CheckVisArea();

        SvxZoomType eType;
        if ( GetDoc()->IsBrowseMode() &&
                SVX_ZOOM_PERCENT !=
                (eType = (SvxZoomType)pTempView->GetWrtShell().GetViewOptions()->GetZoomType()) )
        {
            ((SwView*)GetView())->SetZoom( eType );
        }
        pTempView->InvalidateBorder();
        pTempView->SetNewWindowAllowed(!bSet);
    }
}

/*------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.277  2000/09/18 16:05:10  willem.vandorp
    OpenOffice header added.

    Revision 1.276  2000/09/08 08:33:26  os
    check GetView()

    Revision 1.275  2000/09/08 08:12:50  os
    Change: Set/Toggle/Has/Knows/Show/GetChildWindow

    Revision 1.274  2000/09/07 15:59:20  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.273  2000/08/30 16:12:40  os
    #78341# save document before switching to source view

    Revision 1.272  2000/08/14 17:27:15  jp
    Task #77422#: PrintPreView in the same window

    Revision 1.271  2000/08/07 11:48:36  jp
    PagePreView replace the current view

    Revision 1.270  2000/06/09 08:10:13  os
    using tools/tempfile

    Revision 1.269  2000/05/30 13:39:55  os
    #70840# HTML source view: for saved documents only, call save as dialog if needed

    Revision 1.268  2000/05/26 07:21:27  os
    old SW Basic API Slots removed

    Revision 1.267  2000/04/19 12:56:33  os
    include sfx2/filedlg.hxx removed

    Revision 1.266  2000/04/11 08:01:30  os
    UNICODE

    Revision 1.265  2000/03/21 15:47:50  os
    UNOIII

    Revision 1.264  2000/03/08 17:26:34  os
    GetAppWindow() - misuse as parent window eliminated

    Revision 1.263  2000/03/03 16:16:32  pl
    #73771# workaround for c50 intel compiler

    Revision 1.262  2000/03/03 15:16:58  os
    StarView remainders removed

    Revision 1.261  2000/03/03 12:27:49  mib
    Removed JavaScript

    Revision 1.260  2000/02/24 17:01:58  hr
    #73447#: removed temporaries

    Revision 1.259  2000/02/11 14:43:03  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.258  2000/02/02 17:00:33  jp
    Task #72579#: interface of SwReader is changed

    Revision 1.257  2000/01/14 16:29:50  jp
    Task #71894#: new Options for SW-AutoComplete

    Revision 1.256  2000/01/13 21:27:22  jp
    Task #71894#: new Options for SW-AutoComplete

    Revision 1.255  2000/01/11 10:22:04  tl
    #70735# CheckSpellChanges moved to SwModule and called from there

    Revision 1.254  1999/12/14 16:11:08  os
    #70234# Set Browser Mode via API

    Revision 1.253  1999/11/26 10:58:35  mib
    Loading of styles from XML documents

    Revision 1.252  1999/11/11 10:40:03  jp
    SetModified: broadcast the hint DOCCHANGED

    Revision 1.251  1999/11/09 09:44:04  jp
    SetModified: do nothing if EnableSetModified is not set

    Revision 1.250  1999/10/29 11:31:31  os
    support XModifiable

    Revision 1.249  1999/10/25 19:37:25  tl
    ongoing ONE_LINGU implementation

    Revision 1.248  1999/10/21 17:45:27  jp
    have to change - SearchFile with SfxIniManager, dont use SwFinder for this

    Revision 1.247  1999/10/19 14:30:57  hr
    #65293#: sfxecode.hxx now in svtools

    Revision 1.246  1999/08/31 08:33:36  TL
    #if[n]def ONE_LINGU inserted (for transition of lingu to StarOne)


      Rev 1.245   31 Aug 1999 10:33:36   TL
   #if[n]def ONE_LINGU inserted (for transition of lingu to StarOne)

      Rev 1.244   22 Jun 1999 17:20:30   KZ
   Anpass. fuer Linux

      Rev 1.243   10 Jun 1999 10:52:10   JP
   have to change: no AppWin from SfxApp

      Rev 1.242   04 May 1999 14:58:44   JP
   FilterExportklasse Writer von SvRef abgeleitet, damit sie immer zerstoert wird

      Rev 1.241   20 Apr 1999 17:14:34   MA
   #63638# API-Aenderung PrepareClose

      Rev 1.240   16 Apr 1999 17:22:10   JP
   Bug #64928#: erfrage an der Vorlage, ob sie an einem Node gesetzt ist

      Rev 1.239   07 Apr 1999 14:13:18   OS
   #59615# ReleaseDocument aufrufen

      Rev 1.238   29 Mar 1999 15:57:42   OS
   #59615# InsertDocument am SfxJS rufen

      Rev 1.237   15 Mar 1999 15:07:30   JP
   Task #61405#: AutoCompleteList wurde statisch

      Rev 1.236   11 Mar 1999 23:59:42   JP
   Task #61405#: Optionen setzen

      Rev 1.235   09 Mar 1999 14:10:12   OS
   #62286# SetY2KState an die FormShell weiterleiten

      Rev 1.234   03 Mar 1999 09:44:46   MIB
   #60932#: Indizes vom Organizer nun richtig

      Rev 1.233   02 Mar 1999 16:01:48   AMA
   Fix #62568#: Invalidierungen so sparsam wie moeglich, so gruendlich wie noetig

      Rev 1.232   03 Feb 1999 11:46:48   JP
   Bug #61401#: am Storage die VersionsNummer vom Filter setzen

      Rev 1.231   02 Feb 1999 08:42:44   OS
   #61027# zweistellige Jahreszahlen

      Rev 1.230   01 Feb 1999 08:23:36   OS
   #56371# unnoetigen include wieder raus

      Rev 1.229   27 Jan 1999 09:51:50   OS
   #56371# TF_ONE51

      Rev 1.228   19 Jan 1999 12:05:00   OS
   #59620 vor GetBasicManager mit HasBasic pruefen

      Rev 1.227   14 Jan 1999 10:18:56   MIB
   #47231#: Organizer: Ersetzen von Vorlagen ohne Loeschen

      Rev 1.226   12 Jan 1999 12:49:24   OS
   #60705# AutoFormat-Dialog nicht asynchron aufrufen!

      Rev 1.225   18 Dec 1998 17:18:10   MIB
   #60483#: Poolvorlagen beim D&D im Organizer, Parents und Follows richtig setzen

      Rev 1.224   09 Dec 1998 16:37:54   OM
   #59628# Warnung anzeigen, wenn Dok nicht angelegt werden konnt

      Rev 1.223   09 Dec 1998 14:31:10   OS
   #56371# TF_ONE51

      Rev 1.222   25 Nov 1998 12:42:52   OS
   #59826# temp. Datei in der DocShell loeschen

      Rev 1.221   25 Nov 1998 11:26:56   OS
   #59240##59637# SubInitNew vor dem Import, kein TabStop fuer HTML

      Rev 1.220   17 Nov 1998 22:18:02   JP
   Task #59398#: ClipboardFormatId Umstellungen

      Rev 1.219   05 Nov 1998 10:08:50   OS
   #58996# SourceView: Flag fuers speichern

      Rev 1.218   22 Sep 1998 12:34:00   JP
   Bug #55959#: SetBase mit einer URL und keinem FileNamen - der Dialog liefert keine URL (ist eig. der Bug!)

      Rev 1.217   21 Sep 1998 11:57:36   JP
   Bug #55959#: beim Laden von Vorlagen, muss die BaseURL richtig gesetzt sein

      Rev 1.216   03 Sep 1998 13:27:44   OS
   #55662# AddControl mit NewLine

      Rev 1.215   23 Jul 1998 11:14:36   JP
   Task #52654#: Einfuegen Doc nicht mit einer CrsrShell sondern mit einen PaM

      Rev 1.214   09 Jul 1998 09:52:44   JP
   EmptyStr benutzen

      Rev 1.213   08 Jul 1998 16:21:00   JP
   Bug #52411#: ReturnWert vom Convert korrekt auswerten

      Rev 1.212   02 Jul 1998 14:34:40   MIB
   Fix #52035#: Beim Unschalten aus der Source-View View vor dem Import umschalten

      Rev 1.211   25 Jun 1998 11:52:22   OM
   #51665# Language fuer Zahlenformate

      Rev 1.210   23 Jun 1998 18:13:50   OS
   InitNewDoc - Member des XTextDocuments zuruecksetzen #51535#

      Rev 1.209   18 Jun 1998 11:02:40   OS
   FN_NEW_GLOBAL_DOC: ohne Vorlagennamen Null uebergeben

      Rev 1.208   18 Jun 1998 10:08:08   OS
   Global-Doc erzeugen: Ueberschrift 1 als default #51263#

      Rev 1.207   15 Jun 1998 09:54:50   MIB
   fix #51032#: HTML-Vorlage beim Umsch. aus der Source-View laden und Seitenvorlage setzen

      Rev 1.206   12 Jun 1998 09:45:58   OS
   Appear statt ToTop #50485#

      Rev 1.205   28 May 1998 17:40:52   OM
   Zahlenformat per Basic ermitteln

      Rev 1.204   19 May 1998 12:45:22   OM
   SvxMacro-Umstellung

      Rev 1.203   15 May 1998 17:26:12   OM
   #50043# DirectCursor nicht im OnlineLayout

      Rev 1.202   13 May 1998 14:52:34   OM
   Autokorrektur/Autoformat umgestaltet und zusammengefasst

      Rev 1.201   24 Apr 1998 16:01:04   OM
   Seitenvorschau auch im Html-Mode

      Rev 1.200   23 Apr 1998 15:35:36   OM
   #49689 Aenderung der Seitenanzahl per Basic konfigurierbar

      Rev 1.199   02 Apr 1998 10:09:52   MIB
   Beim Erzeugen eines Global-Dokuments nur noch den 5.0-Filter anbieten

      Rev 1.198   27 Mar 1998 14:12:32   OM
   ChildWindows im Modified-Hdl updaten

      Rev 1.197   20 Mar 1998 14:57:52   OM
   Vorlagentext verbreitert

      Rev 1.196   20 Mar 1998 14:42:42   OM
   Fehlender Include

      Rev 1.195   20 Mar 1998 12:41:58   OM
   Helpid fuer Template-Button

      Rev 1.194   20 Mar 1998 12:36:32   OM
   Globaldokument: Vorlage auswaehlen

      Rev 1.193   19 Mar 1998 17:40:56   OM
   Vorlage auswehlen

      Rev 1.192   17 Mar 1998 13:04:38   JP
   fuers GenerateHTMLDoc: nur den HTML-Filter anbieten

      Rev 1.191   17 Mar 1998 12:23:04   JP
   neu: GenerateHTMLDoc - aquivalent zu GenerateGlobalDoc

      Rev 1.190   12 Mar 1998 13:01:54   OS
   SID_NEWWINDOW nicht mehr ueberladen

      Rev 1.189   02 Feb 1998 13:53:26   OS
   SID_VIEWSH* am eigenen Dispatcher rufen #46862#

      Rev 1.188   19 Jan 1998 11:52:34   MBA
   CreateViewFrame verwenden

      Rev 1.187   07 Jan 1998 18:42:08   MIB
   5.0 Fileformat

      Rev 1.186   09 Dec 1997 08:19:06   OS
   Vorlagen laden: auch Numerierung

      Rev 1.185   29 Nov 1997 15:25:40   MA
   includes

      Rev 1.184   24 Nov 1997 14:22:48   MA
   includes

      Rev 1.183   11 Nov 1997 11:37:22   AMA
   Fix #44514#: Fuer die Druckvorschau braucht man einen Drucker

      Rev 1.182   30 Oct 1997 18:24:44   JP
   Options am Reader nicht mehr public

      Rev 1.181   28 Oct 1997 14:52:34   OS
   SetPool an der SourceView sofort nach AddLink rufen

      Rev 1.180   24 Oct 1997 15:18:58   OS
   ReloadFromHtml nur noch rufen, wenn das Doc im SourceMode veraendert wurde #44971#

      Rev 1.179   13 Oct 1997 17:23:22   MA
   #44630# Keine SwDokInfo fuer SrcView

      Rev 1.178   08 Oct 1997 14:28:20   OS
   PrintLayout funktioniert jetzt auch aus dem Basic

      Rev 1.177   15 Sep 1997 13:26:06   OS
   Events am Doc vor Reload loeschen #42231#

      Rev 1.176   12 Sep 1997 16:04:50   OS
   Vorlagen laden: EAs uebergeben, SW4-Filter als Standard #43699#

      Rev 1.175   01 Sep 1997 13:06:34   OS
   DLL-Umstellung

      Rev 1.174   14 Aug 1997 15:23:36   MA
   fix: DocShell ohne Doc bei OLE-Registration

------------------------------------------------------------------------*/



diff --git a/sw/source/ui/app/docshdrw.cxx b/sw/source/ui/app/docshdrw.cxx
new file mode 100644
index 0000000..3d2f593
--- /dev/null
+++ b/sw/source/ui/app/docshdrw.cxx
@@ -0,0 +1,194 @@
/*************************************************************************
 *
 *  $RCSfile: docshdrw.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:31 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "hintids.hxx"

#ifndef _SVX_SVXIDS_HRC //autogen
#include <svx/svxids.hrc>
#endif

#define ITEMID_COLOR_TABLE      SID_COLOR_TABLE
#define ITEMID_GRADIENT_LIST    SID_GRADIENT_LIST
#define ITEMID_HATCH_LIST       SID_HATCH_LIST
#define ITEMID_BITMAP_LIST      SID_BITMAP_LIST
#define ITEMID_DASH_LIST        SID_DASH_LIST
#define ITEMID_LINEEND_LIST     SID_LINEEND_LIST


#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _SVX_DRAWITEM_HXX //autogen
#include <svx/drawitem.hxx>
#endif
#ifndef _SVDMODEL_HXX //autogen
#include <svx/svdmodel.hxx>
#endif
#ifndef _SVDOUTL_HXX
#include <svx/svdoutl.hxx>
#endif

#ifndef _SVX_LANGITEM_HXX
#include <svx/langitem.hxx>
#endif

#include "docsh.hxx"
#include "doc.hxx"


/*--------------------------------------------------------------------
    Beschreibung: Document laden
 --------------------------------------------------------------------*/


void  SwDocShell::InitDraw()
{
    SdrModel *pDrDoc = pDoc->GetDrawModel();
    if( pDrDoc )
    {
        // Listen, bzw. Tables im ItemSet der DocShell anlegen
        PutItem( SvxGradientListItem( pDrDoc->GetGradientList() ) );
        PutItem( SvxHatchListItem( pDrDoc->GetHatchList() ) );
        PutItem( SvxBitmapListItem( pDrDoc->GetBitmapList() ) );
        PutItem( SvxDashListItem( pDrDoc->GetDashList() ) );
        PutItem( SvxLineEndListItem( pDrDoc->GetLineEndList() ) );

        Outliner& rOutliner = pDrDoc->GetDrawOutliner();
        rOutliner.SetHyphenator( ::GetHyphenator() );
        const SfxPoolItem& rItem = GetDoc()->GetDefault(RES_CHRATR_LANGUAGE);
        rOutliner.SetDefaultLanguage(((const SvxLanguageItem&)rItem).GetLanguage());

    }
    else
        PutItem( SvxColorTableItem( OFF_APP()->GetStdColorTable() ));
}

/*------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.18  2000/09/18 16:05:10  willem.vandorp
    OpenOffice header added.

    Revision 1.17  2000/02/09 10:14:12  os
    #72716# set hyphenator and language at the DrawOutliner

    Revision 1.16  1997/11/29 15:04:46  MA
    includes


      Rev 1.15   29 Nov 1997 16:04:46   MA
   includes

      Rev 1.14   24 Nov 1997 14:22:50   MA
   includes

      Rev 1.13   03 Sep 1997 15:53:54   OS
   DLL-Umbau

      Rev 1.12   14 Aug 1996 12:00:56   JP
   svdraw.hxx entfernt

      Rev 1.11   29 Jul 1996 19:37:38   MA
   includes

      Rev 1.10   07 Mar 1996 12:09:58   HJS
   2 defines zu viel

      Rev 1.9   07 Dec 1995 08:07:08   SWG
   clooks

      Rev 1.8   05 Dec 1995 09:17:10   JP
   InitDraw: keine Parameter mehr

      Rev 1.7   24 Nov 1995 16:56:52   OM
   PCH->PRECOMPILED

      Rev 1.6   17 Nov 1995 19:15:50   OS
   ColorTable immer von der App

      Rev 1.5   07 Nov 1995 15:25:50   AMA
   Fix: ColorTable an der DocShell setzen.

      Rev 1.4   03 Nov 1995 19:27:56   AMA
   Opt.StartUp: DrawView/Model erst bei Bedarf.

      Rev 1.3   22 Aug 1995 09:00:00   MA
   svxitems-header entfernt

      Rev 1.2   09 Aug 1995 16:39:14   MA
   drawing-undo-header rein

      Rev 1.1   21 Mar 1995 02:23:32   ER
   _svdorect_hxx definiert => _svdcapt_hxx definieren

      Rev 1.0   13 Feb 1995 12:20:30   MS
   Initial revision.
------------------------------------------------------------------------*/


diff --git a/sw/source/ui/app/docshini.cxx b/sw/source/ui/app/docshini.cxx
new file mode 100644
index 0000000..b223e6e
--- /dev/null
+++ b/sw/source/ui/app/docshini.cxx
@@ -0,0 +1,897 @@
/*************************************************************************
 *
 *  $RCSfile: docshini.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:31 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/


#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _SV_SYSTEM_HXX
#include <vcl/system.hxx>
#endif

//Statt uiparam.hxx selbst definieren, das spart keys
#ifndef _SVX_DIALOGS_HRC
#include <svx/dialogs.hrc>
#endif
#define ITEMID_FONTLIST         SID_ATTR_CHAR_FONTLIST

#ifndef _SOT_STORINFO_HXX
#include <sot/storinfo.hxx>
#endif
#ifndef _ZFORLIST_HXX //autogen
#include <svtools/zforlist.hxx>
#endif
#ifndef _CTRLTOOL_HXX //autogen
#include <svtools/ctrltool.hxx>
#endif
#ifndef _SFXDOCINF_HXX //autogen
#include <sfx2/docinf.hxx>
#endif
#ifndef _OFA_MISCCFG_HXX //autogen
#include <sfx2/misccfg.hxx>
#endif
#ifndef _SFX_PRINTER_HXX //autogen
#include <sfx2/printer.hxx>
#endif


#ifndef _LINGU_LNGPROPS_HHX_
#include <lingu/lngprops.hxx>
#endif
#ifndef _UNO_LINGU_HXX
#include <svx/unolingu.hxx>
#endif
#ifndef _SFX_SFXUNO_HXX
#include <sfx2/sfxuno.hxx>
#endif
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
#include <com/sun/star/beans/XPropertySet.hpp>
#endif

#ifndef _SFX_DOCFILT_HACK_HXX //autogen
#include <sfx2/docfilt.hxx>
#endif
#ifndef _XTABLE_HXX //autogen
#include <svx/xtable.hxx>
#endif
#ifndef _SVX_DRAWITEM_HXX //autogen
#define ITEMID_COLOR_TABLE SID_COLOR_TABLE
#include <svx/drawitem.hxx>
#endif
#ifndef _SVX_FONTITEM_HXX //autogen
#include <svx/fontitem.hxx>
#endif
#ifndef _SVX_FLSTITEM_HXX //autogen
#include <svx/flstitem.hxx>
#endif
#ifndef _SVX_TSTPITEM_HXX //autogen
#include <svx/tstpitem.hxx>
#endif
#ifndef _SVX_LANGITEM_HXX //autogen
#include <svx/langitem.hxx>
#endif
#ifndef _SVX_HYZNITEM_HXX //autogen
#include <svx/hyznitem.hxx>
#endif
#ifndef _MySVXACORR_HXX //autogen
#include <svx/svxacorr.hxx>
#endif

#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif


#ifndef _FMTCOL_HXX //autogen
#include <fmtcol.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _WDOCSH_HXX
#include <wdocsh.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _DOCFAC_HXX
#include <docfac.hxx>
#endif
#ifndef _DOCSTYLE_HXX
#include <docstyle.hxx>
#endif
#ifndef _SHELLIO_HXX
#include <shellio.hxx>
#endif
#ifndef _TOX_HXX
#include <tox.hxx>
#endif
#ifndef _SW3IO_HXX
#include <sw3io.hxx>        // I/O, Hausformat
#endif
#ifndef _SHELLIO_HXX
#include <shellio.hxx>
#endif
#ifndef _DATAEX_HXX
#include <dataex.hxx>
#endif
#ifndef _DBMGR_HXX
#include <dbmgr.hxx>
#endif
#ifndef _USRPREF_HXX
#include <usrpref.hxx>
#endif
#ifndef _FONTCFG_HXX
#include <fontcfg.hxx>
#endif
#ifndef _POOLFMT_HXX
#include <poolfmt.hxx>
#endif
#ifndef _MODCFG_HXX
#include <modcfg.hxx>
#endif
#ifndef _GLOBDOC_HXX
#include <globdoc.hxx>
#endif
#ifndef _NDOLE_HXX
#include <ndole.hxx>
#endif
#ifndef _MDIEXP_HXX
#include <mdiexp.hxx>
#endif
#ifndef _UNOTXDOC_HXX
#include <unotxdoc.hxx>
#endif
#ifndef _FLDUPDE_HXX
#include <fldupde.hxx>
#endif
#ifndef _LINKENUM_HXX
#include <linkenum.hxx>
#endif
#ifndef _SWWAIT_HXX
#include <swwait.hxx>
#endif

#ifndef _SWSWERROR_H
#include <swerror.h>
#endif
#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif

extern sal_Bool bNotLoadLayout;

#ifdef _JP_LOADTIME
extern int bIsSttTime = 0;
extern long nSttTime = 0;
#endif

using namespace ::com::sun::star;
using namespace ::rtl;
/*-----------------21.09.96 15.29-------------------

--------------------------------------------------*/


void lcl_SetColl(SwDoc* pDoc, sal_uInt16 nType,
                    SfxPrinter* pPrt, const String& rStyle)
{
    sal_Bool bDelete = sal_False;
    const SfxFont* pFnt = pPrt ? pPrt->GetFontByName(rStyle): 0;
    if(!pFnt)
    {
        pFnt = new SfxFont(FAMILY_DONTKNOW, rStyle);
        bDelete = sal_True;
    }
    SwTxtFmtColl *pColl = pDoc->GetTxtCollFromPool(nType);
    pColl->SetAttr(SvxFontItem(pFnt->GetFamily(), pFnt->GetName(),
                        aEmptyStr, pFnt->GetPitch(), pFnt->GetCharSet()));
    if(bDelete)
    {
        delete (SfxFont*) pFnt;
    }
}

/*--------------------------------------------------------------------
    Beschreibung: Document laden
 --------------------------------------------------------------------*/


sal_Bool SwDocShell::InitNew( SvStorage * pStor )
{
    sal_Bool bRet = SfxInPlaceObject::InitNew( pStor );
    SetMapUnit( MAP_TWIP );
    if( bRet )
    {
        AddLink();      // pDoc / pIo ggf. anlegen

        if ( ISA( SwWebDocShell ) )
            SetHTMLTemplate( *GetDoc() );   //Styles aus HTML.vor
        else if( ISA( SwGlobalDocShell ) )
            GetDoc()->SetGlobalDoc();       // Globaldokument

        // fuer alle

        SwStdFontConfig* pStdFont = SW_MOD()->GetStdFontConfig();
        SfxPrinter* pPrt = pDoc->GetPrt();

        String sEntry;
        if(!pStdFont->IsFontDefault(FONT_STANDARD))
        {
            sEntry = pStdFont->GetFontStandard();
            sal_Bool bDelete = sal_False;
            const SfxFont* pFnt = pPrt ? pPrt->GetFontByName(sEntry): 0;
            if(!pFnt)
            {
                pFnt = new SfxFont(FAMILY_DONTKNOW, sEntry);
                bDelete = sal_True;
            }
            pDoc->SetDefault(SvxFontItem(pFnt->GetFamily(), pFnt->GetName(),
                                aEmptyStr, pFnt->GetPitch(), pFnt->GetCharSet()));
            SwTxtFmtColl *pColl = pDoc->GetTxtCollFromPool(RES_POOLCOLL_STANDARD);
            pColl->ResetAttr(RES_CHRATR_FONT);
            if(bDelete)
            {
                delete (SfxFont*) pFnt;
                bDelete = sal_False;
            }

//              lcl_SetColl(pDoc, RES_POOLCOLL_STANDARD, pPrt, sEntry);
        }

        if(!pStdFont->IsFontDefault(FONT_OUTLINE))
        {
            sEntry = pStdFont->GetFontOutline();
            lcl_SetColl(pDoc, RES_POOLCOLL_HEADLINE_BASE, pPrt, sEntry);
        }

        if(!pStdFont->IsFontDefault(FONT_LIST))
        {
            sEntry = pStdFont->GetFontList();
            lcl_SetColl(pDoc, RES_POOLCOLL_NUMBUL_BASE, pPrt, sEntry);
        }

        if(!pStdFont->IsFontDefault(FONT_CAPTION))
        {
            sEntry = pStdFont->GetFontCaption();
            lcl_SetColl(pDoc, RES_POOLCOLL_LABEL, pPrt, sEntry);
        }

        if(!pStdFont->IsFontDefault(FONT_INDEX))
        {
            sEntry = pStdFont->GetFontIndex();
            lcl_SetColl(pDoc, RES_POOLCOLL_REGISTER_BASE, pPrt, sEntry);
        }


/*
        //JP 12.07.95: so einfach waere es fuer die neu Mimik
        pDoc->SetDefault( SvxTabStopItem( 1,
                    GetStar Writer App()->GetUsrPref()->GetDefTabDist(),
                    SVX_TAB_ADJUST_DEFAULT,
                    RES_PARATR_TABSTOP));
*/
        if ( GetCreateMode() ==  SFX_CREATE_MODE_EMBEDDED )
        {
            // fuer MWERKS (Mac-Compiler): kann nicht selbststaendig casten
            SvEmbeddedObject* pObj = this;
            SwDataExchange::InitOle( pObj, pDoc );
        }
        SubInitNew();
    }
    return bRet;
}

/*--------------------------------------------------------------------
    Beschreibung:   Ctor mit SfxCreateMode ?????
 --------------------------------------------------------------------*/


SwDocShell::SwDocShell(SfxObjectCreateMode eMode) :
    pDoc(0),
    pIo(0),
    pBasePool(0),
    pFontList(0),
    SfxObjectShell ( eMode ),
    pView( 0 ),
    pWrtShell( 0 )
{
    SetShell(this);
    SetBaseModel(new SwXTextDocument(this));
    // wir als BroadCaster werden auch unser eigener Listener
    // (fuer DocInfo/FileNamen/....)
    StartListening( *this );
}

/*--------------------------------------------------------------------
    Beschreibung: Ctor / Dtor
 --------------------------------------------------------------------*/


SwDocShell::SwDocShell( SwDoc *pD, SfxObjectCreateMode eMode ):
    pDoc(pD),
    pIo(0),
    pBasePool(0),
    pFontList(0),
    SfxObjectShell ( eMode ),
    pView( 0 ),
    pWrtShell( 0 )
{
    SetShell(this);
    SetBaseModel(new SwXTextDocument(this));
    // wir als BroadCaster werden auch unser eigener Listener
    // (fuer DocInfo/FileNamen/....)
    StartListening( *this );
}

/*--------------------------------------------------------------------
    Beschreibung:   Dtor
 --------------------------------------------------------------------*/


 SwDocShell::~SwDocShell()
{
    ::RemoveFromBackgroundCache( *this, sal_False );

    RemoveLink();
    delete pIo;
    delete pFontList;

    // wir als BroadCaster werden auch unser eigener Listener
    // (fuer DocInfo/FileNamen/....)
    EndListening( *this );
    SvxColorTableItem* pColItem = (SvxColorTableItem*)GetItem(SID_COLOR_TABLE);
    // wird nur die DocInfo fuer den Explorer gelesen, ist das Item nicht da
    if(pColItem)
    {
        XColorTable* pTable = pColItem->GetColorTable();
        // wurde eine neue Table angelegt, muss sie auch geloescht werden.
        if((void*)pTable  != (void*)(OFF_APP())->GetStdColorTable())
            delete pTable;
    }
}

/*--------------------------------------------------------------------
    Beschreibung: AddLink
 --------------------------------------------------------------------*/


void SwDocShell::AddLink()
{
    if( !pDoc )
    {
        SwDocFac aFactory;
        pDoc = aFactory.GetDoc();
        pDoc->AddLink();
        pDoc->SetHTMLMode( ISA(SwWebDocShell) );
    }
    else
        pDoc->AddLink();
    pDoc->SetDocShell( this );      // am Doc den DocShell-Pointer setzen
    uno::Reference< text::XTextDocument >  xDoc(GetBaseModel(), uno::UNO_QUERY);
    ((SwXTextDocument*)xDoc.get())->Reactivate(this);

    if( !pIo )
        pIo = new Sw3Io( *pDoc );
    else
        pIo->SetDoc( *pDoc );

    SetPool(&pDoc->GetAttrPool());

    // am besten erst wenn eine sdbcx::View erzeugt wird !!!
    pDoc->SetOle2Link(LINK(this, SwDocShell, Ole2ModifiedHdl));
}

/*--------------------------------------------------------------------
    Beschreibung:   neue FontList erzeugen Aenderung Drucker
 --------------------------------------------------------------------*/


void SwDocShell::UpdateFontList()
{
    ASSERT(pDoc, "Kein Doc keine FontList");
    if( pDoc )
    {
        SfxPrinter* pPrt = pDoc->GetPrt();
        delete pFontList;

        if( pPrt && pPrt->GetDevFontCount() && !pDoc->IsBrowseMode() )
            pFontList = new FontList( pPrt );
        else
            pFontList = new FontList( Application::GetDefaultDevice() );

        PutItem( SvxFontListItem( pFontList, SID_ATTR_CHAR_FONTLIST ) );
    }
}

/*--------------------------------------------------------------------
    Beschreibung: RemoveLink
 --------------------------------------------------------------------*/


void SwDocShell::RemoveLink()
{
    // Uno-Object abklemmen
    uno::Reference< text::XTextDocument >  xDoc(GetBaseModel(), uno::UNO_QUERY);
    ((SwXTextDocument*)xDoc.get())->Invalidate();
    aFinishedTimer.Stop();
    if(pDoc)
    {
        DELETEZ(pBasePool);
        sal_Int8 nRefCt = pDoc->RemoveLink();
        pDoc->SetOle2Link(Link());
        pDoc->SetDocShell( 0 );
        if( !nRefCt )
            delete pDoc;
        pDoc = 0;       // wir haben das Doc nicht mehr !!
    }
}


/*--------------------------------------------------------------------
    Beschreibung: Laden, Default-Format
 --------------------------------------------------------------------*/


sal_Bool  SwDocShell::Load(SvStorage* pStor)
{
    sal_Bool bRet = sal_False;
    if(SfxInPlaceObject::Load( pStor ))
    {
        if( pDoc )              // fuer Letzte Version !!
            RemoveLink();       // das existierende Loslassen

        AddLink();      // Link setzen und Daten updaten !!

        // Das Laden
        // fuer MD
        sal_Bool bSave = bNotLoadLayout;
        bNotLoadLayout = sal_Bool( !LoadLayout() );
#ifndef PRODUCT
        sal_Bool bWeb = 0 != PTR_CAST(SwWebDocShell, this);
        bNotLoadLayout |= SW_MOD()->GetUsrPref(bWeb)->IsTest1();
#endif
        SwWait aWait( *this, sal_True );
        sal_uInt32 nErr = ERR_SWG_READ_ERROR;
        switch( GetCreateMode() )
        {
//      case SFX_CREATE_MODE_INTERNAL:
//          nErr = 0;
//          break;

        case SFX_CREATE_MODE_ORGANIZER:
            nErr = pIo->LoadStyles( pStor );
            break;

        case SFX_CREATE_MODE_INTERNAL:
            bNotLoadLayout = sal_True;
            // kein break;

        case SFX_CREATE_MODE_EMBEDDED:
            // SfxProgress unterdruecken, wenn man Embedded ist
            SW_MOD()->SetEmbeddedLoadSave( sal_True );
            // kein break;

        case SFX_CREATE_MODE_STANDARD:
        case SFX_CREATE_MODE_PREVIEW:
            if( ReadSw3 )
            {
#ifdef _JP_LOADTIME
{
{
SvFileStream aStrm( "\\loadtime.txt", STREAM_WRITE );
aStrm.Seek( STREAM_SEEK_TO_END );
aStrm << "Load: " << pStor->GetName().GetStr() << endl;
}
bIsSttTime = sal_True;
nSttTime = util::Time().GetTime();
}
#endif
                // die DocInfo vom Doc am DocShell-Medium setzen
                {
                    SfxDocumentInfo aInfo;
                    aInfo.Load( pStor );
                    pDoc->DocInfoChgd( aInfo );
                }
                SwReader aRdr( *pStor, aEmptyStr, pDoc );
                nErr = aRdr.Read( *ReadSw3 );
            }
#ifndef PRODUCT
            else
                ASSERT( !this, "ohne Sw3Reader geht nichts" );
#endif
            break;

#ifndef PRODUCT
        default:
            ASSERT( !this, "Load: new CreateMode?" );
#endif

        }
        bNotLoadLayout = bSave;

        ASSERT( !pBasePool, "wer hat seinen Pool nicht zerstoert?" );
        pBasePool = new SwDocStyleSheetPool( *pDoc,
                        SFX_CREATE_MODE_ORGANIZER == GetCreateMode() );
        UpdateFontList();
        InitDraw();

        SetError( nErr );
        bRet = !IsError( nErr );

        // StartFinishedLoading rufen.
        if( bRet && !pDoc->IsInLoadAsynchron() &&
            GetCreateMode() == SFX_CREATE_MODE_STANDARD )
            StartLoadFinishedTimer();

        // SfxProgress unterdruecken, wenn man Embedded ist
        SW_MOD()->SetEmbeddedLoadSave( sal_False );

        if( pDoc->IsGlobalDoc() && !pDoc->IsGlblDocSaveLinks() )
        {
            // dann entferne alle nicht referenzierte OLE-Objecte
            SvStorageInfoList aInfoList;
            pStor->FillInfoList( &aInfoList );

            // erstmal alle nicht "OLE-Objecte" aus der Liste entfernen
            for( sal_uInt32 n = aInfoList.Count(); n; )
            {
                const String& rName = aInfoList.GetObject( --n ).GetName();
                // in ndole.cxx wird dieser PreFix benutzt
                if( 3 != rName.Match( String::CreateFromAscii("Obj") ))
                    aInfoList.Remove( n );
            }

            // dann alle referenzierten Object aus der Liste entfernen
            SwClientIter aIter( *(SwModify*)pDoc->GetDfltGrfFmtColl() );
            for( SwCntntNode* pNd = (SwCntntNode*)aIter.First( TYPE( SwCntntNode ) );
                    pNd; pNd = (SwCntntNode*)aIter.Next() )
            {
                SwOLENode* pOLENd = pNd->GetOLENode();
                if( pOLENd )
                {
                    const String& rOLEName = pOLENd->GetOLEObj().GetName();
                    for( n = aInfoList.Count(); n; )
                    {
                        const String& rName = aInfoList.GetObject( --n ).GetName();
                        if( rOLEName == rName )
                        {
                            aInfoList.Remove( n );
                            break;
                        }
                    }
                }
            }
            // und jetzt haben wir alle Objecte, die nicht mehr
            // referenziert werden
            SvPersist* p = this;
            for( n = aInfoList.Count(); n; )
            {
                const String& rName = aInfoList.GetObject( --n ).GetName();
                SvInfoObjectRef aRef( p->Find( rName ) );
                if( aRef.Is() )
                    p->Remove( &aRef );
            }
        }
    }
    return bRet;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


sal_Bool  SwDocShell::LoadFrom(SvStorage* pStor)
{
    sal_Bool bRet = sal_False;
    if( pDoc )
        RemoveLink();

    AddLink();      // Link setzen und Daten updaten !!

    do {        // middle check loop
        sal_uInt32 nErr = ERR_SWG_READ_ERROR;
        const String& rNm = pStor->GetName();
        if( pStor->IsStream( SfxStyleSheetBasePool::GetStreamName() ))
        {
            // Das Laden
            SwWait aWait( *this, sal_True );
            nErr = pIo->LoadStyles( pStor );
        }
        else
        {
            // sollte es sich um eine 2. Vrolage handeln ??
            if( SvStorage::IsStorageFile( rNm ) )
                break;

            const SfxFilter* pFltr = SwIoSystem::GetFileFilter( rNm, aEmptyStr );
            if( !pFltr || pFltr->GetUserData() != String::CreateFromAscii(FILTER_SWG) )
                break;

            SvFileStream aStrm( rNm, STREAM_STD_READ );
            if( 0 == ( nErr = aStrm.GetError() ) )
            {
                SwWait aWait( *this, sal_True );
                SwReader aRead( aStrm, rNm, pDoc );
                nErr = aRead.Read( *ReadSwg );
            }
        }

        ASSERT( !pBasePool, "wer hat seinen Pool nicht zerstoert?" );
        pBasePool = new SwDocStyleSheetPool( *pDoc,
                            SFX_CREATE_MODE_ORGANIZER == GetCreateMode() );

        SetError( nErr );
        bRet = !IsError( nErr );

    } while( sal_False );

    SfxObjectShell::LoadFrom( pStor );
    pDoc->ResetModified();
    return bRet;
}


SvDataMemberObjectRef  SwDocShell::CreateSnapshot()
{
    SvDataMemberObjectRef aRef;
    if( pDoc )
        aRef = new SwDataExchange( *pDoc );
    return aRef;
}


void SwDocShell::SubInitNew()
{
    ASSERT( !pBasePool, "wer hat seinen Pool nicht zerstoert?" );
    pBasePool = new SwDocStyleSheetPool( *pDoc,
                    SFX_CREATE_MODE_ORGANIZER == GetCreateMode() );
    UpdateFontList();
    InitDraw();

//  const SwModuleOptions& rModCfg = *SW_MOD()->GetModuleConfig();
//  pDoc->SetLinkUpdMode( rModCfg.GetLinkMode() );
//  pDoc->SetFldUpdateFlags( rModCfg.GetFldUpdateFlags() );
    pDoc->SetLinkUpdMode( GLOBALSETTING );
    pDoc->SetFldUpdateFlags( AUTOUPD_GLOBALSETTING );

    sal_Bool bWeb = ISA(SwWebDocShell);

    sal_uInt16 nRange[] =   {
                            RES_CHRATR_LANGUAGE, RES_CHRATR_LANGUAGE,
                            0, 0, 0  };
    if(!bWeb)
    {
        nRange[2] = RES_PARATR_TABSTOP;
        nRange[3] = RES_PARATR_HYPHENZONE;
    }
    SfxItemSet aDfltSet( pDoc->GetAttrPool(), nRange );
    uno::Reference< beans::XPropertySet >  xProp( ::GetLinguPropertySet() );

    sal_Int16 nVal;
    if (xProp.is())
    {
        xProp->getPropertyValue( OUString::createFromAscii(UPN_DEFAULT_LANGUAGE)) >>= nVal;
    }
    else
    {   // guess DefaultLanguage to be used from other sources
        nVal = Application::GetAppInternational().GetLanguage();
        if( nVal == LANGUAGE_SYSTEM )
            nVal = ::GetSystemLanguage();
    }

    aDfltSet.Put( SvxLanguageItem( nVal, RES_CHRATR_LANGUAGE ) );
    if(!bWeb)
    {
        SvxHyphenZoneItem aHyp( (SvxHyphenZoneItem&) pDoc->GetDefault(
                                                        RES_PARATR_HYPHENZONE) );
        if(xProp.is())
            xProp->getPropertyValue( OUString::createFromAscii(UPN_HYPH_MIN_LEADING) )>>= nVal;
        else
            nVal = 2;
        aHyp.GetMinLead()   = sal_Int8(nVal);
        if(xProp.is())
            xProp->getPropertyValue( OUString::createFromAscii(UPN_HYPH_MIN_TRAILING) ) >>= nVal;
        else
            nVal = 2;
        aHyp.GetMinTrail()  = sal_Int8(nVal);
        aDfltSet.Put( aHyp );

        sal_uInt16 nNewPos = SW_MOD()->GetModuleConfig()->GetDefTab();
        if( nNewPos )
            aDfltSet.Put( SvxTabStopItem( 1, nNewPos,
                                            SVX_TAB_ADJUST_DEFAULT ) );
    }
    pDoc->SetDefault( aDfltSet );
    pDoc->ResetModified();
}

/*------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.209  2000/09/18 16:05:11  willem.vandorp
    OpenOffice header added.

    Revision 1.208  2000/09/08 15:11:56  os
    use configuration service

    Revision 1.207  2000/07/13 12:36:19  os
    new: SwXTextDocument::reactivate()

    Revision 1.206  2000/07/05 10:28:14  os
    invalidate model in ::RemoveLink()

    Revision 1.205  2000/06/26 10:38:34  jp
    must change: GetAppWindow->GetDefaultDevice

    Revision 1.204  2000/04/11 08:01:30  os
    UNICODE

    Revision 1.203  2000/03/21 15:47:50  os
    UNOIII

    Revision 1.202  2000/03/03 15:16:58  os
    StarView remainders removed

    Revision 1.201  2000/02/02 17:00:37  jp
    Task #72579#: interface of SwReader is changed

    Revision 1.200  2000/01/19 18:26:37  jp
    Bug #72117#: create numberformatter only if he is needed

    Revision 1.199  1999/12/10 15:49:58  tl
    #70667# shadowing of variable fixed

    Revision 1.198  1999/12/10 13:05:52  tl
    #70383# SvxGetLinguPropertySet => ::GetLinguPropertySet

    Revision 1.197  1999/11/24 18:24:13  tl
    check for Service availability

    Revision 1.196  1999/11/19 16:40:22  os
    modules renamed

    Revision 1.195  1999/11/15 10:30:05  tl
    some property name changes for ONE_LINGU

    Revision 1.194  1999/10/25 19:10:08  tl
    ongoing ONE_LINGU implementation

    Revision 1.193  1999/08/31 08:34:00  TL
    #if[n]def ONE_LINGU inserted (for transition of lingu to StarOne)


      Rev 1.192   31 Aug 1999 10:34:00   TL
   #if[n]def ONE_LINGU inserted (for transition of lingu to StarOne)

      Rev 1.191   08 Jul 1999 15:59:34   MA
   Use internal object to toggle wait cursor

      Rev 1.190   07 Jul 1999 08:25:26   OS
   extended indexes: create index types in SwDoc::Ctor

      Rev 1.189   15 Mar 1999 15:07:32   JP
   Task #61405#: AutoCompleteList wurde statisch

      Rev 1.188   11 Mar 1999 23:58:40   JP
   Task #63171#: Optionen fuer Feld-/LinkUpdate Doc oder Modul lokal, Task #61405: Optionen setzen

      Rev 1.187   09 Mar 1999 15:36:10   OS
   #62742# Invalidate am Model rufen, nicht InitNewDoc

      Rev 1.186   04 Feb 1999 11:22:14   ER
   #61415# OfaMiscCfg nach SFX verschoben

      Rev 1.185   02 Feb 1999 08:42:48   OS
   #61027# zweistellige Jahreszahlen

      Rev 1.184   01 Feb 1999 08:23:24   OS
   #56371# unnoetigen include wieder raus

      Rev 1.183   27 Jan 1999 09:51:54   OS
   #56371# TF_ONE51

      Rev 1.182   10 Dec 1998 15:55:18   OS
   #56371# TF_ONE51 Zwischenstand

      Rev 1.181   25 Nov 1998 11:26:54   OS
   #59240##59637# SubInitNew vor dem Import, kein style::TabStop fuer HTML

      Rev 1.180   23 Nov 1998 16:12:16   OM
   #58216# Verknuepfungsoptionen pro Dokument

      Rev 1.179   11 Nov 1998 09:04:20   OS
   #59240# keine Defaults fuer style::TabStop und Hyphenation in der WebDocShell

      Rev 1.178   19 Aug 1998 15:18:28   OM
   #55274# Default-Datenbanknamen am Dokument nur OnDemand setzen

      Rev 1.177   24 Apr 1998 17:17:30   JP
   Bug #49791#: nur auf OLE casten wenn auch OLE drin ist (und nicht Grafik)

      Rev 1.176   21 Apr 1998 12:37:56   JP
   Bug #47798#: GlobalDocument ohne Inhalt laden - nicht referenzierte Objecte loeschen

      Rev 1.175   17 Feb 1998 09:19:04   TJ
   IFDEF TF _STARONE

      Rev 1.174   12 Feb 1998 15:00:10   OS
   Model im Dtor invalidieren

      Rev 1.173   11 Feb 1998 16:31:30   OS
   SwXTextDocument wieder aktiv

      Rev 1.172   04 Feb 1998 17:22:50   OS
   SetModel erstmal raus

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/app/docst.cxx b/sw/source/ui/app/docst.cxx
new file mode 100644
index 0000000..ba1cf1a
--- /dev/null
+++ b/sw/source/ui/app/docst.cxx
@@ -0,0 +1,1450 @@
/*************************************************************************
 *
 *  $RCSfile: docst.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:31 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include <hintids.hxx>

#ifndef _SFX_WHITER_HXX //autogen
#include <svtools/whiter.hxx>
#endif
#ifndef _SFX_TEMPLDLG_HXX //autogen
#include <sfx2/templdlg.hxx>
#endif
#ifndef _SFX_TPLPITEM_HXX //autogen
#include <sfx2/tplpitem.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _NEWSTYLE_HXX //autogen
#include <sfx2/newstyle.hxx>
#endif
#ifndef _SFX_SAVEOPT_HXX //autogen
#include <sfx2/saveopt.hxx>
#endif
#ifndef _SFXMACITEM_HXX //autogen
#include <svtools/macitem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif

#ifndef _SWWDOCSH_HXX //autogen
#include <wdocsh.hxx>
#endif
#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _FCHRFMT_HXX //autogen
#include <fchrfmt.hxx>
#endif
#ifndef _OFA_HTMLCFG_HXX //autogen
#include <offmgr/htmlcfg.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif


#include "view.hxx"
#include "wrtsh.hxx"
#include "docsh.hxx"
#include "uitool.hxx"
#include "cmdid.h"
#include "globals.hrc"
#include "viewopt.hxx"
#include "doc.hxx"
#include "swstyle.h"
#include "frmfmt.hxx"
#include "charfmt.hxx"
#include "poolfmt.hxx"
#include "pagedesc.hxx"
#include "tmpdlg.hxx"
#include "docstyle.hxx"
#include "uiitems.hxx"
#include "fmtcol.hxx"
#include "frmmgr.hxx"       //SwFrmValid
#include "swevent.hxx"
#include "edtwin.hxx"

#include "app.hrc"


/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void  SwDocShell::StateStyleSheet(SfxItemSet& rSet, SwWrtShell* pSh)
{
    SfxWhichIter aIter(rSet);
    USHORT  nWhich  = aIter.FirstWhich();
    USHORT nActualFamily = USHRT_MAX;

    SwWrtShell* pShell = pSh ? pSh : GetWrtShell();
    if(!pShell)
    {
        while (nWhich)
        {
            rSet.DisableItem(nWhich);
            nWhich = aIter.NextWhich();
        }
        return;
    }
    else
    {
        SfxViewFrame* pFrame = pShell->GetView().GetViewFrame();
        const ISfxTemplateCommon* pCommon = SFX_APP()->GetCurrentTemplateCommon(pFrame->GetBindings());
        if( pCommon )
            nActualFamily = pCommon->GetActualFamily();
    }

    while (nWhich)
    {
        // aktuelle Vorlage zu jeder Familie ermitteln
        //
        String aName;
        switch (nWhich)
        {
            case SID_STYLE_APPLY:
            {//hier wird die Vorlage und ihre Familie an die StyleBox
             //uebergeben, damit diese Familie angezeigt wird
                if(pShell->IsFrmSelected())
                {
                    SwFrmFmt* pFmt = pShell->GetCurFrmFmt();
                    if( pFmt )
                        aName = pFmt->GetName();
                }
                else
                {
                    SwTxtFmtColl* pColl = pShell->GetCurTxtFmtColl();
                    if(pColl)
                        aName = pColl->GetName();
                }
                rSet.Put(SfxTemplateItem(nWhich, aName));
            }
            break;
            case SID_STYLE_FAMILY1:
                if( !pShell->IsFrmSelected() )
                {
                    SwCharFmt* pFmt = pShell->GetCurCharFmt();
                    if(pFmt)
                        aName = pFmt->GetName();
                    else
                        aName = *pShell->GetDoc()->GetTextNmArray()[
                            RES_POOLCOLL_STANDARD - RES_POOLCOLL_TEXT_BEGIN ];

                    rSet.Put(SfxTemplateItem(nWhich, aName));
                }
                break;

            case SID_STYLE_FAMILY2:
                if(!pShell->IsFrmSelected())
                {
                    SwTxtFmtColl* pColl = pShell->GetCurTxtFmtColl();
                    if(pColl)
                        aName = pColl->GetName();

                    SfxTemplateItem aItem(nWhich, aName);

                    USHORT nMask = 0;
                    if( pDoc->IsHTMLMode() )
                        nMask = SWSTYLEBIT_HTML;
                    else
                    {
                        const int nSelection = pShell->GetFrmType(0,TRUE);
                        if(pShell->GetCurTOX())
                            nMask = SWSTYLEBIT_IDX  ;
                        else if(nSelection & FRMTYPE_HEADER     ||
                                nSelection & FRMTYPE_FOOTER     ||
                                nSelection & FRMTYPE_TABLE      ||
                                nSelection & FRMTYPE_FLY_ANY    ||
                                nSelection & FRMTYPE_FOOTNOTE   ||
                                nSelection & FRMTYPE_FTNPAGE)
                            nMask = SWSTYLEBIT_EXTRA;
                        else
                            nMask = SWSTYLEBIT_TEXT;
                    }

                    aItem.SetValue(nMask);
                    rSet.Put(aItem);
                }
                break;

            case SID_STYLE_FAMILY3:

                if( pDoc->IsHTMLMode() )
                    rSet.DisableItem( nWhich );
                else
                {
                    SwFrmFmt* pFmt = pShell->GetCurFrmFmt();
                    if(pFmt && pShell->IsFrmSelected())
                    {
                        aName = pFmt->GetName();
                        rSet.Put(SfxTemplateItem(nWhich, aName));
                    }
                }
                break;

            case SID_STYLE_FAMILY4:
            {
                OfaHtmlOptions* pHtmlOpt = OFF_APP()->GetHtmlOptions();
                if( pDoc->IsHTMLMode() && !pHtmlOpt->IsPrintLayoutExtension())
                    rSet.DisableItem( nWhich );
                else
                {
                    USHORT n = pShell->GetCurPageDesc( FALSE );
                    if( n < pShell->GetPageDescCnt() )
                        aName = pShell->GetPageDesc( n ).GetName();

                    rSet.Put(SfxTemplateItem(nWhich, aName));
                }
            }
            break;
            case SID_STYLE_FAMILY5:
                {
                    const SwNumRule* pRule = pShell->GetCurNumRule();
                    if( pRule )
                        aName = pRule->GetName();

                    rSet.Put(SfxTemplateItem(nWhich, aName));
                }
                break;

            case SID_STYLE_WATERCAN:
            {
                SwEditWin& rEdtWin = pView->GetEditWin();
                SwApplyTemplate* pApply = rEdtWin.GetApplyTemplate();
                rSet.Put(SfxBoolItem(nWhich, pApply && pApply->eType != 0));
                break;
            }

            case SID_STYLE_UPDATE_BY_EXAMPLE:
                if( pShell->IsFrmSelected()
                        ? SFX_STYLE_FAMILY_FRAME != nActualFamily
                        : ( SFX_STYLE_FAMILY_FRAME == nActualFamily ||
                            SFX_STYLE_FAMILY_PAGE == nActualFamily ||
                            (SFX_STYLE_FAMILY_PSEUDO == nActualFamily && !pShell->GetCurNumRule())) )
                {
                    rSet.DisableItem( nWhich );
                }
                break;

            case SID_STYLE_NEW_BY_EXAMPLE:
                if( (pShell->IsFrmSelected()
                        ? SFX_STYLE_FAMILY_FRAME != nActualFamily
                        : SFX_STYLE_FAMILY_FRAME == nActualFamily) ||
                    (SFX_STYLE_FAMILY_PSEUDO == nActualFamily && !pShell->GetCurNumRule()) )
                {
                    rSet.DisableItem( nWhich );
                }
                break;

            default:
                DBG_ERROR( "Invalid SlotId");
        }
        nWhich = aIter.NextWhich();
    }
}


/*--------------------------------------------------------------------
    Beschreibung:   StyleSheet-Requeste auswerten
 --------------------------------------------------------------------*/


void SwDocShell::ExecStyleSheet( SfxRequest& rReq )
{
    USHORT  nSlot   = rReq.GetSlot();
    USHORT  nRet    = 0xffff;

    const SfxItemSet* pArgs = rReq.GetArgs();
    const SfxPoolItem* pItem;
    SwWrtShell* pActShell = 0;
    SFX_APP()->GetOptions().SetMetric(::GetDfltMetric(0 != PTR_CAST(SwWebDocShell, this)));
    BOOL bSetReturn = TRUE;
    switch (nSlot)
    {
    case SID_STYLE_NEW:
        if( pArgs && SFX_ITEM_SET == pArgs->GetItemState( SID_STYLE_FAMILY,
            FALSE, &pItem ))
        {
            USHORT nFamily = ((const SfxUInt16Item*)pItem)->GetValue();

            String sName;
            USHORT nMask = 0;
            if( SFX_ITEM_SET == pArgs->GetItemState( SID_STYLE_NEW,
                FALSE, &pItem ))
                sName = ((const SfxStringItem*)pItem)->GetValue();
            if( SFX_ITEM_SET == pArgs->GetItemState( SID_STYLE_MASK,
                FALSE, &pItem ))
                nMask = ((const SfxUInt16Item*)pItem)->GetValue();
            String sParent;
            if( SFX_ITEM_SET == pArgs->GetItemState( SID_STYLE_REFERENCE,
                FALSE, &pItem ))
                sParent = ((const SfxStringItem*)pItem)->GetValue();

            nRet = Edit( sName, sParent, nFamily, nMask, TRUE, FALSE, 0, rReq.IsAPI() );
        }
        break;

        case SID_STYLE_APPLY:
            if( !pArgs )
            {
                GetView()->GetViewFrame()->GetDispatcher()->Execute(SID_STYLE_DESIGNER, FALSE);
                break;
            }   // Fall through
        case SID_STYLE_EDIT:
        case SID_STYLE_DELETE:
        case SID_STYLE_WATERCAN:
        case SID_STYLE_FAMILY:
        case SID_STYLE_UPDATE_BY_EXAMPLE:
        case SID_STYLE_NEW_BY_EXAMPLE:
        {
            String aParam;
            USHORT nFamily, nMask = 0;

            if( !pArgs )
            {
                nFamily = SFX_STYLE_FAMILY_PARA;

                switch (nSlot)
                {
                    case SID_STYLE_NEW_BY_EXAMPLE:
                    {
                        SfxNewStyleDlg *pDlg = new SfxNewStyleDlg( 0,
                                                    *GetStyleSheetPool());
                        if(RET_OK == pDlg->Execute())
                            aParam = pDlg->GetName();
                        delete pDlg;
                    }
                    break;

                    case SID_STYLE_UPDATE_BY_EXAMPLE:
                    case SID_STYLE_EDIT:
                    {
                        SwTxtFmtColl* pColl = GetWrtShell()->GetCurTxtFmtColl();
                        if(pColl)
                        {
                            aParam = pColl->GetName();
                            rReq.AppendItem(SfxStringItem(nSlot, aParam));
                        }
                    }
                    break;
                }
            }
            else
            {
                ASSERT( pArgs->Count(), "SfxBug ItemSet ist leer");

                SwWrtShell* pShell = GetWrtShell();
                if( SFX_ITEM_SET == pArgs->GetItemState(nSlot, FALSE, &pItem ))
                    aParam = ((const SfxStringItem*)pItem)->GetValue();

                if( SFX_ITEM_SET == pArgs->GetItemState(SID_STYLE_FAMILY,
                    FALSE, &pItem ))
                    nFamily = ((const SfxUInt16Item*)pItem)->GetValue();

                if( SFX_ITEM_SET == pArgs->GetItemState(SID_STYLE_MASK,
                    FALSE, &pItem ))
                    nMask = ((const SfxUInt16Item*)pItem)->GetValue();
                if( SFX_ITEM_SET == pArgs->GetItemState(FN_PARAM_WRTSHELL,
                    FALSE, &pItem ))
                    pActShell = pShell = (SwWrtShell*)((SwPtrItem*)pItem)->GetValue();

                if( nSlot == SID_STYLE_UPDATE_BY_EXAMPLE )
                {
                    switch( nFamily )
                    {
                        case SFX_STYLE_FAMILY_PARA:
                        {
                            SwTxtFmtColl* pColl = pShell->GetCurTxtFmtColl();
                            if(pColl)
                                aParam = pColl->GetName();
                        }
                        break;
                        case SFX_STYLE_FAMILY_FRAME:
                        {
                            SwFrmFmt* pFrm = pWrtShell->GetCurFrmFmt();
                            if( pFrm )
                                aParam = pFrm->GetName();
                        }
                        break;
                        case SFX_STYLE_FAMILY_CHAR:
                        {
                            SwCharFmt* pChar = pWrtShell->GetCurCharFmt();
                            if( pChar )
                                aParam = pChar->GetName();
                        }
                        break;
                        case SFX_STYLE_FAMILY_PSEUDO:
                        if(SFX_ITEM_SET == pArgs->GetItemState(SID_STYLE_UPD_BY_EX_NAME, FALSE, &pItem))
                        {
                            aParam = ((const SfxStringItem*)pItem)->GetValue();
                        }
                        break;
                    }
                    rReq.AppendItem(SfxStringItem(nSlot, aParam));
                }
            }
            if (aParam.Len() || nSlot == SID_STYLE_WATERCAN )
            {
                switch(nSlot)
                {
                    case SID_STYLE_EDIT:
                        nRet = Edit(aParam, aEmptyStr, nFamily, nMask, FALSE, FALSE, pActShell );
                        break;
                    case SID_STYLE_DELETE:
                        nRet = Delete(aParam, nFamily);
                        break;
                    case SID_STYLE_APPLY:
                        // Shellwechsel in ApplyStyles
                        nRet = ApplyStyles(aParam, nFamily, pActShell,
                               rReq.GetModifier() );
                        // nur, wenn es kein API-Call war
                        if(!pActShell)
                            pView->GetEditWin().GrabFocus();
                        break;
                    case SID_STYLE_WATERCAN:
                        nRet = DoWaterCan(aParam, nFamily);
                        break;
                    case SID_STYLE_UPDATE_BY_EXAMPLE:
                        nRet = UpdateStyle(aParam, nFamily, pActShell);
                        break;
                    case SID_STYLE_NEW_BY_EXAMPLE:
                    {
                        nRet = MakeByExample(aParam, nFamily, nMask, pActShell );
                        SfxTemplateDialog* pDlg = SFX_APP()->GetTemplateDialog();

                        if(pDlg && pDlg->IsVisible())
                            pDlg->Update();
                    }
                    break;

                    default:
                        DBG_ERROR( "Falsche Slot-Id");
                }
            }
            break;
        }
    }

    if(bSetReturn)
    {
        if(rReq.IsAPI()) // Basic bekommt nur TRUE oder FALSE
            rReq.SetReturnValue(SfxUInt16Item(nSlot, nRet !=0));
        else
            rReq.SetReturnValue(SfxUInt16Item(nSlot, nRet));
    }

}

/*--------------------------------------------------------------------
    Beschreibung:   Edit
 --------------------------------------------------------------------*/


USHORT SwDocShell::Edit( const String &rName, const String &rParent, USHORT nFamily, USHORT nMask,
                         BOOL bNew, BOOL bColumn, SwWrtShell* pActShell,
                         BOOL bBasic )
{
    ASSERT(GetWrtShell(), "Keine Shell, keine Styles");
    SfxStyleSheetBase *pStyle = 0;
    SFX_APP()->GetOptions().SetMetric(::GetDfltMetric(0 != PTR_CAST(SwWebDocShell, this)));

    USHORT nRet = nMask;
    BOOL bModified = pDoc->IsModified();

    if( bNew )
    {
        if( SFXSTYLEBIT_ALL != nMask && SFXSTYLEBIT_USED != nMask )
            nMask |= SFXSTYLEBIT_USERDEF;
        else
            nMask = SFXSTYLEBIT_USERDEF;

        pStyle = &pBasePool->Make( rName, (SfxStyleFamily)nFamily, nMask );

        // die aktuellen als Parent setzen
        SwDocStyleSheet* pDStyle = (SwDocStyleSheet*)pStyle;
        switch( nFamily )
        {
            case SFX_STYLE_FAMILY_PARA:
            {
                if(rParent.Len())
                {
                    SwTxtFmtColl* pColl = pWrtShell->FindTxtFmtCollByName( rParent );
                    pDStyle->GetCollection()->SetDerivedFrom( pColl );
                    pDStyle->PresetParent( rParent );
                }
                else
                {
                    SwTxtFmtColl* pColl = pWrtShell->GetCurTxtFmtColl();
                    pDStyle->GetCollection()->SetDerivedFrom( pColl );
                    if( pColl )
                        pDStyle->PresetParent( pColl->GetName() );
                }
            }
            break;
            case SFX_STYLE_FAMILY_CHAR:
            {
                if(rParent.Len())
                {
                    SwCharFmt* pCFmt = pWrtShell->FindCharFmtByName( rParent );

                    pDStyle->GetCharFmt()->SetDerivedFrom( pCFmt );
                    pDStyle->PresetParent( rParent );
                }
                else
                {
                    SwCharFmt* pCFmt = pWrtShell->GetCurCharFmt();
                    pDStyle->GetCharFmt()->SetDerivedFrom( pCFmt );
                        if( pCFmt )
                            pDStyle->PresetParent( pCFmt->GetName() );
                }
            }
            break;
            case SFX_STYLE_FAMILY_FRAME :
            {
                if(rParent.Len())
                {
                    SwFrmFmt* pFFmt = pWrtShell->GetDoc()->FindFrmFmtByName( rParent );
                    pDStyle->GetFrmFmt()->SetDerivedFrom( pFFmt );
                    pDStyle->PresetParent( rParent );
                }
            }
            break;
        }
    }
    else
    {
        pStyle = pBasePool->Find( rName, (SfxStyleFamily)nFamily );
        ASSERT(pStyle, "Vorlage nicht gefunden");
    }

    if(!pStyle)
        return FALSE;

    // Dialoge zusammenstoepseln
    //
    SwDocStyleSheet aTmp( *(SwDocStyleSheet*)pStyle );
    if( SFX_STYLE_FAMILY_PARA == nFamily )
    {
        SfxItemSet& rSet = aTmp.GetItemSet();
        ::SwToSfxPageDescAttr( rSet );
        // erstmal nur eine Null
        rSet.Put(SwBackgroundDestinationItem(SID_PARA_BACKGRND_DESTINATION, 0));
    }
/*  else if( SFX_STYLE_FAMILY_FRAME == nFamily )
    {
        // Auskommentiert wegen Bug #45776 (per default keine Breite&Groesse in Rahmenvorlagen)
        SfxItemSet& rSet = aTmp.GetItemSet();
        if( SFX_ITEM_SET != rSet.GetItemState( RES_FRM_SIZE ))
        {
            // dann sollten wir spaetesten hier eines anlegen
            SwFrmValid aFrmDefValues;
            rSet.Put( SwFmtFrmSize( ATT_VAR_SIZE, aFrmDefValues.nWidth,
                                    aFrmDefValues.nHeight ));
        }
    }*/
    else if( SFX_STYLE_FAMILY_CHAR == nFamily )
    {
        SfxItemSet& rSet = aTmp.GetItemSet();
        const SfxPoolItem *pTmpBrush;
        if( SFX_ITEM_SET == rSet.GetItemState( RES_CHRATR_BACKGROUND,
            TRUE, &pTmpBrush ) )
        {
            SvxBrushItem aTmpBrush( *((SvxBrushItem*)pTmpBrush) );
            aTmpBrush.SetWhich( RES_BACKGROUND );
            rSet.Put( aTmpBrush );
        }
    }
    if (!bBasic)
    {
        // vor dem Dialog wird der HtmlMode an der DocShell versenkt
        PutItem(SfxUInt16Item(SID_HTML_MODE, ::GetHtmlMode(this)));
        SwTemplateDlg* pDlg = new SwTemplateDlg( 0, aTmp, nFamily, bColumn,
                            pActShell ? pActShell : pWrtShell, bNew);
        if(RET_OK == pDlg->Execute())
        {
            GetWrtShell()->StartAllAction();

            // nur bei Absatz-Vorlagen die Maske neu setzen
            if( bNew )
            {
                nRet = SFX_STYLE_FAMILY_PARA == pStyle->GetFamily()
                        ? aTmp.GetMask()
                        : SFXSTYLEBIT_USERDEF;
            }
            else if( pStyle->GetMask() != aTmp.GetMask() )
                nRet = aTmp.GetMask();

            if( SFX_STYLE_FAMILY_PARA == nFamily )
            {
                SfxItemSet aSet( *pDlg->GetOutputItemSet() );
                ::SfxToSwPageDescAttr( *GetWrtShell(), aSet  );
                aTmp.SetItemSet( aSet );
            }
            else
            {
                SfxItemSet aTmpSet( *pDlg->GetOutputItemSet() );
                if( SFX_STYLE_FAMILY_CHAR == nFamily )
                {
                    const SfxPoolItem *pTmpBrush;
                    if( SFX_ITEM_SET == aTmpSet.GetItemState( RES_BACKGROUND,
                        FALSE, &pTmpBrush ) )
                    {
                        SvxBrushItem aTmpBrush( *((SvxBrushItem*)pTmpBrush) );
                        aTmpBrush.SetWhich( RES_CHRATR_BACKGROUND );
                        aTmpSet.Put( aTmpBrush );
                    }
                    aTmpSet.ClearItem( RES_BACKGROUND );
                }
                aTmp.SetItemSet( aTmpSet );
            }
            if(SFX_STYLE_FAMILY_PAGE == nFamily)
                pView->InvalidateRulerPos();

            if( bNew )
                pBasePool->Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_CREATED, aTmp ) );

            // JP 19.09.97:
            // Dialog vorm EndAction zerstoeren - bei Seitenvorlagen kann
            // muss der ItemSet zerstoert werden, damit die Cursor aus den
            // Kopf-/Fusszeilen entfernt werden. Sonst kommts zu GPFs!!!
            delete pDlg;

            pDoc->SetModified();
            if( !bModified )    // Bug 57028
                pDoc->SetUndoNoResetModified();

            GetWrtShell()->EndAllAction();
        }
        else
        {
            if( bNew )
                pBasePool->Erase( &aTmp );
            if( !bModified )
                pDoc->ResetModified();
            delete pDlg;
        }
    }
    else
    {
        // vor dem Dialog wird der HtmlMode an der DocShell versenkt
        PutItem(SfxUInt16Item(SID_HTML_MODE, ::GetHtmlMode(this)));

        GetWrtShell()->StartAllAction();

        // nur bei Absatz-Vorlagen die Maske neu setzen
        if( bNew )
        {
            nRet = SFX_STYLE_FAMILY_PARA == pStyle->GetFamily()
                    ? aTmp.GetMask()
                    : SFXSTYLEBIT_USERDEF;
        }
        else if( pStyle->GetMask() != aTmp.GetMask() )
            nRet = aTmp.GetMask();

        if( SFX_STYLE_FAMILY_PARA == nFamily )
            ::SfxToSwPageDescAttr( *GetWrtShell(), aTmp.GetItemSet() );
        else
        {
            SfxItemSet aTmpSet( aTmp.GetItemSet() );
            if( SFX_STYLE_FAMILY_CHAR == nFamily )
            {
                const SfxPoolItem *pTmpBrush;
                if( SFX_ITEM_SET == aTmpSet.GetItemState( RES_BACKGROUND,
                    FALSE, &pTmpBrush ) )
                {
                    SvxBrushItem aTmpBrush( *((SvxBrushItem*)pTmpBrush) );
                    aTmpBrush.SetWhich( RES_CHRATR_BACKGROUND );
                    aTmpSet.Put( aTmpBrush );
                }
                aTmpSet.ClearItem( RES_BACKGROUND );
            }
            aTmp.SetItemSet( aTmpSet );
        }
        if(SFX_STYLE_FAMILY_PAGE == nFamily)
            pView->InvalidateRulerPos();

        if( bNew )
            pBasePool->Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_CREATED, aTmp ) );

        pDoc->SetModified();
        if( !bModified )        // Bug 57028
            pDoc->SetUndoNoResetModified();
        GetWrtShell()->EndAllAction();
    }

    return nRet;
}

/*--------------------------------------------------------------------
    Beschreibung:   Delete
 --------------------------------------------------------------------*/


USHORT SwDocShell::Delete(const String &rName, USHORT nFamily)
{
    SfxStyleSheetBase *pStyle = pBasePool->Find(rName, (SfxStyleFamily)nFamily);

    if(pStyle)
    {
        ASSERT(GetWrtShell(), "Keine Shell, keine Styles");

        GetWrtShell()->StartAllAction();
        pBasePool->Erase(pStyle);
        GetWrtShell()->EndAllAction();

        return TRUE;
    }
    return FALSE;
}

/*--------------------------------------------------------------------
    Beschreibung:   Vorlage anwenden
 --------------------------------------------------------------------*/


USHORT SwDocShell::ApplyStyles(const String &rName, USHORT nFamily,
                               SwWrtShell* pShell, USHORT nMode )
{
    SwDocStyleSheet* pStyle =
        (SwDocStyleSheet*)pBasePool->Find(rName, (SfxStyleFamily)nFamily);

    ASSERT(pStyle, "Wo ist der StyleSheet");
    if(!pStyle)
        return FALSE;

    SwWrtShell *pSh = pShell ? pShell : GetWrtShell();

    ASSERT( pSh, "Keine Shell, keine Styles");

    pSh->StartAllAction();

    switch(nFamily)
    {
        case SFX_STYLE_FAMILY_CHAR:
        {
            SwFmtCharFmt aFmt(pStyle->GetCharFmt());
            pSh->SetAttr( aFmt, (nMode & KEY_SHIFT) ? SETATTR_DONTREPLACE : SETATTR_DEFAULT );
            break;
        }
        case SFX_STYLE_FAMILY_PARA:
        {
            pSh->SetTxtFmtColl(pStyle->GetCollection());
            break;
        }
        case SFX_STYLE_FAMILY_FRAME:
        {
            if ( pSh->IsFrmSelected() )
                pSh->SetFrmFmt( pStyle->GetFrmFmt() );
            break;
        }
        case SFX_STYLE_FAMILY_PAGE:
        {
            pSh->SetPageStyle(pStyle->GetPageDesc()->GetName());
            break;
        }
        case SFX_STYLE_FAMILY_PSEUDO:
        {
            pSh->SetCurNumRule( *pStyle->GetNumRule() );
            break;
        }
        default:
            DBG_ERROR("Unbekannte Familie");
    }
    pSh->EndAllAction();

    return nFamily;
}

/*--------------------------------------------------------------------
    Beschreibung:   Giesskanne starten
 --------------------------------------------------------------------*/



USHORT SwDocShell::DoWaterCan(const String &rName, USHORT nFamily)
{
    ASSERT(GetWrtShell(), "Keine Shell, keine Styles");

    SwEditWin& rEdtWin = pView->GetEditWin();
    SwApplyTemplate* pApply = rEdtWin.GetApplyTemplate();
    BOOL bWaterCan = !(pApply && pApply->eType != 0);
    if( !rName.Len() )
        bWaterCan = FALSE;
    SwApplyTemplate aTemplate;
    aTemplate.eType = nFamily;

    if(bWaterCan)
    {
        SwDocStyleSheet* pStyle =
            (SwDocStyleSheet*)pBasePool->Find(rName, (SfxStyleFamily)nFamily);

        ASSERT(pStyle, "Wo ist der StyleSheet");
        if(!pStyle) return nFamily;

        switch(nFamily)
        {
            case SFX_STYLE_FAMILY_CHAR:
                aTemplate.aColl.pCharFmt = pStyle->GetCharFmt();
                break;
            case SFX_STYLE_FAMILY_PARA:
                aTemplate.aColl.pTxtColl = pStyle->GetCollection();
                break;
            case SFX_STYLE_FAMILY_FRAME:
                aTemplate.aColl.pFrmFmt = pStyle->GetFrmFmt();
                break;
            case SFX_STYLE_FAMILY_PAGE:
                aTemplate.aColl.pPageDesc = (SwPageDesc*)pStyle->GetPageDesc();
                break;
            case SFX_STYLE_FAMILY_PSEUDO:
                aTemplate.aColl.pNumRule = (SwNumRule*)pStyle->GetNumRule();
                break;

            default:
                DBG_ERROR( "Unbekannte Familie");
        }
    }
    else
        aTemplate.eType = 0;

    // Template anwenden
    pView->GetEditWin().SetApplyTemplate(aTemplate);

    return nFamily;
}

/*--------------------------------------------------------------------
    Beschreibung:   Vorlage Updaten
 --------------------------------------------------------------------*/


USHORT SwDocShell::UpdateStyle(const String &rName, USHORT nFamily, SwWrtShell* pShell)
{
    SwWrtShell* pWrtShell = pShell ? pShell : GetWrtShell();
    ASSERT(GetWrtShell(), "Keine Shell, keine Styles");

    SwDocStyleSheet* pStyle =
        (SwDocStyleSheet*)pBasePool->Find(rName, (SfxStyleFamily)nFamily);

    if(!pStyle)
        return nFamily;

    switch(nFamily)
    {
        case SFX_STYLE_FAMILY_PARA:
        {
            SwTxtFmtColl* pColl = pStyle->GetCollection();
            if(pColl && !pColl->IsDefault())
            {
                GetWrtShell()->StartAllAction();
                GetWrtShell()->FillByEx(pColl);
                    // Vorlage auch anwenden, um harte Attributierung
                    // zu entfernen
                GetWrtShell()->SetTxtFmtColl( pColl );
                GetWrtShell()->EndAllAction();
            }
            break;
        }
        case SFX_STYLE_FAMILY_FRAME:
        {
            SwFrmFmt* pFrm = pStyle->GetFrmFmt();
            if( pWrtShell->IsFrmSelected() && pFrm && !pFrm->IsDefault() )
            {
                SfxItemSet aSet( GetPool(), aFrmFmtSetRange );
                pWrtShell->StartAllAction();
                pWrtShell->GetFlyFrmAttr( aSet );

                // JP 10.06.98: nur automatische Orientierungen uebernehmen
/*              #61359# jetzt auch wieder alle Orientierungen
 *              const SfxPoolItem* pItem;
                if( SFX_ITEM_SET == aSet.GetItemState( RES_VERT_ORIENT,
                    FALSE, &pItem ) &&
                    VERT_NONE == ((SwFmtVertOrient*)pItem)->GetVertOrient())
                    aSet.ClearItem( RES_VERT_ORIENT );

                if( SFX_ITEM_SET == aSet.GetItemState( RES_HORI_ORIENT,
                    FALSE, &pItem ) &&
                    HORI_NONE == ((SwFmtHoriOrient*)pItem)->GetHoriOrient())
                    aSet.ClearItem( RES_HORI_ORIENT );*/

                pFrm->SetAttr( aSet );

                    // Vorlage auch anwenden, um harte Attributierung
                    // zu entfernen
                pWrtShell->SetFrmFmt( pFrm, TRUE );
                pWrtShell->EndAllAction();
            }
        }
        break;
        case SFX_STYLE_FAMILY_CHAR:
        {
            SwCharFmt* pChar = pStyle->GetCharFmt();
            if( pChar && !pChar->IsDefault() )
            {
                pWrtShell->StartAllAction();
                pWrtShell->FillByEx(pChar);
                    // Vorlage auch anwenden, um harte Attributierung
                    // zu entfernen
                pWrtShell->EndAllAction();
            }

        }
        break;
        case SFX_STYLE_FAMILY_PSEUDO:
        {
            const SwNumRule* pCurRule;
            if( pStyle->GetNumRule() &&
                0 != ( pCurRule = pWrtShell->GetCurNumRule() ))
            {
                SwNumRule aRule( *pCurRule );
                aRule.SetName( pStyle->GetNumRule()->GetName() );
                pWrtShell->ChgNumRuleFmts( aRule );
            }
        }
        break;
    }
    return nFamily;
}

/*--------------------------------------------------------------------
    Beschreibung:   NewByExample
 --------------------------------------------------------------------*/


USHORT SwDocShell::MakeByExample( const String &rName, USHORT nFamily,
                                    USHORT nMask, SwWrtShell* pShell )
{
    SwWrtShell* pWrtShell = pShell ? pShell : GetWrtShell();
    SwDocStyleSheet* pStyle = (SwDocStyleSheet*)pBasePool->Find(
                                            rName, (SfxStyleFamily)nFamily );
    if(!pStyle)
    {
        // JP 07.07.95: behalte die akt. Maske vom PI bei, dadurch werden
        //              neue sofort in den sichtbaren Bereich einsortiert
        if( SFXSTYLEBIT_ALL == nMask || SFXSTYLEBIT_USED == nMask )
            nMask = SFXSTYLEBIT_USERDEF;
        else
            nMask |= SFXSTYLEBIT_USERDEF;

        pStyle = (SwDocStyleSheet*)&pBasePool->Make(rName,
                                (SfxStyleFamily)nFamily, nMask );
    }

    switch(nFamily)
    {
        case  SFX_STYLE_FAMILY_PARA:
        {
            SwTxtFmtColl* pColl = pStyle->GetCollection();
            if(pColl && !pColl->IsDefault())
            {
                pWrtShell->StartAllAction();
                pWrtShell->FillByEx(pColl);
                    // Vorlage auch anwenden, um harte Attributierung
                    // zu entfernen
                pColl->SetDerivedFrom(pWrtShell->GetCurTxtFmtColl());

                    // setze die Maske noch an der Collection:
                USHORT nId = pColl->GetPoolFmtId() & 0x87ff;
                switch( nMask & 0x0fff )
                {
                case SWSTYLEBIT_TEXT:
                    nId |= COLL_TEXT_BITS;
                    break;
                case SWSTYLEBIT_CHAPTER:
                    nId |= COLL_DOC_BITS;
                    break;
                case SWSTYLEBIT_LIST:
                    nId |= COLL_LISTS_BITS;
                    break;
                case SWSTYLEBIT_IDX:
                    nId |= COLL_REGISTER_BITS;
                    break;
                case SWSTYLEBIT_EXTRA:
                    nId |= COLL_EXTRA_BITS;
                    break;
                case SWSTYLEBIT_HTML:
                    nId |= COLL_HTML_BITS;
                    break;
                }
                pColl->SetPoolFmtId(nId);

                pWrtShell->SetTxtFmtColl(pColl);
                pWrtShell->EndAllAction();
            }
        }
        break;
        case SFX_STYLE_FAMILY_FRAME:
        {
            SwFrmFmt* pFrm = pStyle->GetFrmFmt();
            if(pWrtShell->IsFrmSelected() && pFrm && !pFrm->IsDefault())
            {
                pWrtShell->StartAllAction();

                SfxItemSet aSet(GetPool(), aFrmFmtSetRange );
                pWrtShell->GetFlyFrmAttr( aSet );

                // JP 10.06.98: nur automatische Orientierungen uebernehmen
/*              #61359# jetzt auch wieder alle Orientierungen
                const SfxPoolItem* pItem;
                if( SFX_ITEM_SET == aSet.GetItemState( RES_VERT_ORIENT,
                    FALSE, &pItem ) &&
                    VERT_NONE == ((SwFmtVertOrient*)pItem)->GetVertOrient())
                    aSet.ClearItem( RES_VERT_ORIENT );

                if( SFX_ITEM_SET == aSet.GetItemState( RES_HORI_ORIENT,
                    FALSE, &pItem ) &&
                    HORI_NONE == ((SwFmtHoriOrient*)pItem)->GetHoriOrient())
                    aSet.ClearItem( RES_HORI_ORIENT );
 */

                pFrm->SetAttr( aSet );
                    // Vorlage auch anwenden, um harte Attributierung
                    // zu entfernen
                pWrtShell->SetFrmFmt( pFrm );
                pWrtShell->EndAllAction();
            }
        }
        break;
        case SFX_STYLE_FAMILY_CHAR:
        {
            SwCharFmt* pChar = pStyle->GetCharFmt();
            if(pChar && !pChar->IsDefault())
            {
                pWrtShell->StartAllAction();
                pWrtShell->FillByEx( pChar );
                pChar->SetDerivedFrom( pWrtShell->GetCurCharFmt() );
                SwFmtCharFmt aFmt( pChar );
                pWrtShell->SetAttr( aFmt );
                pWrtShell->EndAllAction();
            }
        }
        break;

        case SFX_STYLE_FAMILY_PAGE:
        {
            pWrtShell->StartAllAction();
            USHORT nPgDsc = pWrtShell->GetCurPageDesc();
            SwPageDesc& rSrc = (SwPageDesc&)pWrtShell->GetPageDesc( nPgDsc );
            SwPageDesc& rDest = *(SwPageDesc*)pStyle->GetPageDesc();

            USHORT nPoolId = rDest.GetPoolFmtId();
            USHORT nHId = rDest.GetPoolHelpId();
            BYTE nHFId = rDest.GetPoolHlpFileId();

            pWrtShell->GetDoc()->CopyPageDesc( rSrc, rDest );

            // PoolId darf NIE kopiert werden!
            rDest.SetPoolFmtId( nPoolId );
            rDest.SetPoolHelpId( nHId );
            rDest.SetPoolHlpFileId( nHFId );

            // werden Kopf-/Fusszeilen angelegt, so gibt es kein Undo mehr!
            pWrtShell->GetDoc()->DelAllUndoObj();

            pWrtShell->EndAllAction();
        }
        break;

        case SFX_STYLE_FAMILY_PSEUDO:
        {
            pWrtShell->StartAllAction();

            SwNumRule aRule( *pWrtShell->GetCurNumRule() );
            String sOrigRule( aRule.GetName() );
            aRule.SetName( pStyle->GetNumRule()->GetName() );
            pWrtShell->ChgNumRuleFmts( aRule );

            pWrtShell->ReplaceNumRule( sOrigRule, aRule.GetName() );


            pWrtShell->EndAllAction();
        }
        break;
    }
    return nFamily;
}



void  SwDocShell::LoadStyles( SfxObjectShell& rSource )
{
/*  [Beschreibung]

    Diese Methode wird vom SFx gerufen, wenn aus einer Dokument-Vorlage
    Styles nachgeladen werden sollen. Bestehende Styles soll dabei
    "uberschrieben werden. Das Dokument mu"s daher neu formatiert werden.
    Daher werden die Applikationen in der Regel diese Methode "uberladen
    und in ihrer Implementierung die Implementierung der Basisklasse
    rufen.
*/
    // ist die Source unser Document, dann uebernehmen wir das
    // abpruefen selbst (wesentlich schneller und laeuft nicht ueber
    // die Kruecke SfxStylePool
    if( rSource.ISA( SwDocShell ))
    {
        //JP 28.05.99: damit die Kopf-/Fusszeilen nicht den fixen Inhalt
        //              der Vorlage erhalten, einmal alle FixFelder der
        //              Source aktualisieren
        ((SwDocShell&)rSource).pDoc->SetFixFields();
        if( pWrtShell )
        {
            pWrtShell->StartAllAction();
            pDoc->ReplaceStyles( *((SwDocShell&)rSource).pDoc );
            pWrtShell->EndAllAction();
        }
        else
        {
            BOOL bModified = pDoc->IsModified();
            pDoc->ReplaceStyles( *((SwDocShell&)rSource).pDoc );
            if( !bModified && pDoc->IsModified() && !pView )
            {
                // die View wird spaeter angelegt, ueberschreibt aber das
                // Modify-Flag. Per Undo ist sowieso nichts mehr zu machen
                pDoc->SetUndoNoResetModified();
            }
        }
    }
    else
        SfxObjectShell::LoadStyles( rSource );
}


void SwDocShell::FormatPage( const String& rPage, BOOL bColumn, SwWrtShell*     pActShell )
{
    Edit( rPage, aEmptyStr, SFX_STYLE_FAMILY_PAGE, 0, FALSE, bColumn, pActShell);
}

Bitmap __EXPORT SwDocShell::GetStyleFamilyBitmap( SfxStyleFamily eFamily )
{
    if( SFX_STYLE_FAMILY_PSEUDO == eFamily )
        return Bitmap( SW_RES( BMP_STYLES_FAMILY_NUM ));
    return SfxObjectShell::GetStyleFamilyBitmap( eFamily );
}

/*------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.149  2000/09/18 16:05:11  willem.vandorp
    OpenOffice header added.

    Revision 1.148  2000/09/07 15:59:20  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.147  2000/07/07 13:26:09  jp
    must changes VCL

    Revision 1.146  2000/05/26 07:21:28  os
    old SW Basic API Slots removed

    Revision 1.145  2000/04/20 12:53:37  os
    GetName() returns String&

    Revision 1.144  2000/02/11 14:42:41  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.143  1999/11/29 17:25:33  jp
    some changes for the compat. attribut

    Revision 1.142  1999/06/09 17:34:54  JP
    have to change: no cast from GetpApp to SfxApp/OffApp, SfxShell only subclass of SfxApp


      Rev 1.141   09 Jun 1999 19:34:54   JP
   have to change: no cast from GetpApp to SfxApp/OffApp, SfxShell only subclass of SfxApp

      Rev 1.140   28 May 1999 10:24:20   JP
   zu Bug #66327#: LoadStyles - FixFelder aktualisieren

      Rev 1.139   22 Feb 1999 11:28:06   OS
   #61359# freie Positionierung von Rahmen auch fuer Vorlagen wieder erlaubt

      Rev 1.138   27 Nov 1998 14:49:04   AMA
   Fix #59951#59825#: Unterscheiden zwischen Rahmen-,Seiten- und Bereichsspalten

      Rev 1.137   23 Oct 1998 13:17:20   OS
   #44617# Parentvorlage fuer SID_NEW_STYLE aus dem Gestalter

      Rev 1.136   24 Sep 1998 11:55:30   JP
   Bug #57028#: ggfs. das Undo veranlassen, kein Modified zurueck zu setzen

      Rev 1.135   08 Sep 1998 18:00:36   OS
   #56134# Metric fuer Text und HTML getrennt - auch im ::Edit

      Rev 1.134   08 Sep 1998 16:48:20   OS
   #56134# Metric fuer Text und HTML getrennt

      Rev 1.133   17 Aug 1998 16:06:36   OS
   GPF nach Shellwechsel waehrend Recording #55041#

      Rev 1.132   27 Jul 1998 16:55:20   JP
   Bug #45529#: LoadStyles muss ggfs. das Zuruecksetzen des ModifiedFlags verhindern

      Rev 1.131   26 Jun 1998 17:36:46   OS
   SwBGDestItem mit Which #51751#

      Rev 1.130   17 Jun 1998 18:19:46   OS
   SwBackgroundDestinationItem

      Rev 1.129   17 Jun 1998 08:34:34   OS
   im UpdateByExample sel. Eintrag mit eigener Id mitschicken #51141#

      Rev 1.128   10 Jun 1998 14:51:40   JP
   SetFrmFmt: zusaetzlicher Parameter - Orientierung beibehalten

      Rev 1.127   16 Apr 1998 16:00:42   OS
   Printing extensions fuer HTML

      Rev 1.126   31 Mar 1998 10:20:36   OM
   #45776 Per default kein Size-Item in Rahmenvorlagen

      Rev 1.125   14 Mar 1998 13:06:44   OS
   Chg: GetCurrentTemplateCommen mit SfxBindings&

      Rev 1.124   20 Jan 1998 15:31:52   OS
   RES_CHRATR:BACKGROUND hat jetzt SlotId

      Rev 1.123   08 Jan 1998 12:55:08   OS
   Zeichenhintergrund auch im Absatzformatdialog editierbar #46180#

      Rev 1.122   06 Jan 1998 07:27:08   OS
   New/UpdateByExample fuer Numererierung nur wenn sie gesetzt ist erlauben #46348#

      Rev 1.121   09 Dec 1997 16:50:20   JP
   neu: ReplaceNumRule fuer MakeByExample fuer NumerierungsVorlagen

      Rev 1.120   04 Dec 1997 12:27:58   OS
   Edit/FormatPage: WrtShell nicht mehr const

      Rev 1.119   24 Nov 1997 16:57:24   JP
   GetState: String in der Schleife anlegen

      Rev 1.118   24 Nov 1997 14:22:38   MA
   includes

      Rev 1.117   17 Nov 1997 10:20:10   JP
   Umstellung Numerierung

      Rev 1.116   11 Nov 1997 13:22:14   JP
   neu: NumRule-Vorlage

      Rev 1.115   05 Nov 1997 09:33:30   JP
   Bug #45341#: SetItemSet nie mit dem eigenen ItemSet aufrufen

      Rev 1.114   19 Sep 1997 14:31:24   JP
   GPF beim Abschalten der Kopf-/Fusszeilen behoben

      Rev 1.113   04 Sep 1997 17:13:36   MA
   includes

      Rev 1.112   03 Sep 1997 15:53:52   OS
   DLL-Umbau

      Rev 1.111   21 Aug 1997 16:09:10   OS
   Return fuer Basic nur noch Null und Eins #43004#

      Rev 1.110   15 Aug 1997 11:45:06   OS
   chartar/frmatr/txtatr aufgeteilt

      Rev 1.109   12 Aug 1997 15:58:36   OS
   frmitems/textitem/paraitem aufgeteilt

      Rev 1.108   08 Aug 1997 17:26:42   OM
   Headerfile-Umstellung

      Rev 1.107   07 Aug 1997 14:59:24   OM
   Headerfile-Umstellung

      Rev 1.106   01 Aug 1997 17:03:30   OM
   Basic: NewStyle ohne Dialog ausfuehren

      Rev 1.105   31 Jul 1997 10:13:54   OM
   #42247# Template-GPF behoben

      Rev 1.104   15 Jul 1997 11:34:20   OS
   MacroName auch als sub(lib.module)

      Rev 1.103   05 Jul 1997 09:57:26   OS
   Macro und Script an Rahmenvorlagen setzen/lesen

      Rev 1.102   18 Jun 1997 10:47:58   JP
   GetStateStyleSheet: der Stylist gibt die Family vor, NIE selbst bestimmen

      Rev 1.101   16 Jun 1997 15:50:26   MA
   #40739# kein Anchor bei UpdateByExample

      Rev 1.100   28 May 1997 08:15:36   OS
   Metric fuer Dialog nicht in der Statusmethode setzen, sondern im Execute

      Rev 1.99   21 Feb 1997 15:31:20   OS
   Watercan ueber den Pointer am EditWin erkennen

      Rev 1.98   19 Feb 1997 15:47:00   JP
   Execute: UpdateByExample/NewByExample - akt. Family wie beim Gestalter festlegen

      Rev 1.97   11 Feb 1997 14:31:46   JP
   GetState: Family umschalten wenn das ApplyFlag erfragt wird

      Rev 1.96   10 Feb 1997 14:21:52   JP
   Im HTML-Mode nur die HTML-Vorlagen anzeigen

      Rev 1.95   04 Feb 1997 13:53:58   JP
   StateStyle: kein Disable bei den Familien

      Rev 1.94   28 Jan 1997 16:30:42   OS
   vor dem StyleDialog den HtmlMode in die DocShell putten

      Rev 1.93   16 Jan 1997 16:37:22   OS
   Metric vor Dialogaufruf an der App setzen

      Rev 1.92   13 Jan 1997 14:57:50   JP
   virtuelle StandardZeichenvorlage im Gestalter

      Rev 1.91   13 Jan 1997 13:46:06   JP
   Umstellungen fuers Update

      Rev 1.90   12 Dec 1996 13:24:38   JP
   GetState: Numerierung schaltet den Gestalter bei Automatisch auf Text (nicht mehr Num.)

      Rev 1.89   04 Dec 1996 17:44:10   JP
   StateStyleSheet: im HTML-Mode den HTML-Bereich defaulten

      Rev 1.88   04 Dec 1996 15:05:26   JP
   PoolVorlagen: neuer Bereich - HTML

      Rev 1.87   14 Nov 1996 19:14:32   OS
   Umstellung SlotIds

      Rev 1.86   06 Nov 1996 10:20:14   JP
   NewByExample: PageDesc - PoolIds beibehalten

      Rev 1.85   04 Nov 1996 15:02:58   JP
   neu: NewByExample fuer PageDescs

      Rev 1.84   29 Oct 1996 12:12:06   AMA
   New: Zeichenvorlagen duerfen jetzt denselben Bereich umfassen (DONTREPLACE)

      Rev 1.83   28 Oct 1996 16:59:10   AMA
   New: Modifier durchreichen

      Rev 1.82   01 Oct 1996 13:40:12   AMA
   Fix: RES_CHRATR_BACKGROUND nur bei Aenderung setzen.

      Rev 1.81   18 Sep 1996 14:30:44   AMA
   Chg: Zeichenhintergrund

      Rev 1.80   17 Sep 1996 16:20:06   OS
   UI-Anpassung bedingte Vorlagen

      Rev 1.79   09 Sep 1996 15:10:40   OS
   StyleSheet-Slots koennen auch WrtShell mitbekommen - API-Aufruf von Hintergrund-Views

      Rev 1.78   23 Aug 1996 12:26:40   JP
   Bug #30613#: GetStyleState - auf die richtige Shelle zugreifen

      Rev 1.77   29 Jul 1996 19:37:30   MA
   includes

      Rev 1.76   29 Jul 1996 15:14:46   OS
   FormatPage und Edit mit akt. View

      Rev 1.75   12 Jun 1996 14:55:40   JP
   Bug #28625#: Edit - neue Vorlage -> Pool benachrictigen

      Rev 1.74   07 May 1996 23:01:44   JP
   Bug #27306#: LoadStyles - Start/End-AllAction nur wenn Shell vorhanden ist

      Rev 1.73   22 Apr 1996 16:48:16   JP
   Bug #26860#: Doc als nicht modifiziert kennzeichnen

      Rev 1.72   28 Mar 1996 19:03:38   OS
   nach PageStyleDialog Lineal invalidieren

      Rev 1.71   22 Mar 1996 13:55:04   HJS
   umstellung 311

      Rev 1.70   11 Mar 1996 09:58:46   OS
   StateStyleSheet hat jetzt opt. WrtShell* als 2. Param. wg. Basic

      Rev 1.69   20 Feb 1996 16:27:26   OS
   neu: FormatPage - ruft Seitenformatdialog ggf. mit Spaltenseite auf

      Rev 1.68   13 Feb 1996 14:30:12   OS
   ExecStyleSheet: ReturnValue immer am Request setzen

      Rev 1.67   12 Jan 1996 19:39:24   JP
   ExecStyleSheet: Mask wird vom SFX mit gegeben, Edit und NewByExample wollen es haben

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/app/docstyle.cxx b/sw/source/ui/app/docstyle.cxx
new file mode 100644
index 0000000..6c0b33b
--- /dev/null
+++ b/sw/source/ui/app/docstyle.cxx
@@ -0,0 +1,2782 @@
/*************************************************************************
 *
 *  $RCSfile: docstyle.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:31 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#define _SVSTDARR_USHORTS

#ifndef _UIPARAM_HXX
#include <uiparam.hxx>
#endif
#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _SFXITEMITER_HXX
#include <svtools/itemiter.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_NUMITEM_HXX //autogen
#include <svx/numitem.hxx>
#endif

#ifndef _FMTCOL_HXX //autogen
#include <fmtcol.hxx>
#endif
#ifndef _UITOOL_HXX
#include <uitool.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _ERRHDL_HXX
#include <errhdl.hxx>
#endif
#ifndef _FRMFMT_HXX
#include <frmfmt.hxx>
#endif
#ifndef _CHARFMT_HXX
#include <charfmt.hxx>
#endif
#ifndef _POOLFMT_HXX
#include <poolfmt.hxx>
#endif
#ifndef _PAGEDESC_HXX
#include <pagedesc.hxx>
#endif
#ifndef _DOCSTYLE_HXX
#include <docstyle.hxx>
#endif
#ifndef _DOCARY_HXX
#include <docary.hxx>
#endif
#ifndef _CCOLL_HXX
#include <ccoll.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _HINTS_HXX
#include <hints.hxx>
#endif
#ifndef _NUMRULE_HXX
#include <numrule.hxx>
#endif
#ifndef _UIITEMS_HXX
#include <uiitems.hxx>
#endif

#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _SWSTYLE_H
#include <swstyle.h>
#endif
#ifndef _APP_HRC
#include <app.hrc>
#endif


// MD 06.02.95: Die Formatnamen in der Liste aller Namen haben als
// erstes Zeichen die Familie:

#define cCHAR       (sal_Unicode)'c'
#define cPARA       (sal_Unicode)'p'
#define cFRAME      (sal_Unicode)'f'
#define cPAGE       (sal_Unicode)'g'
#define cNUMRULE    (sal_Unicode)'n'

// Dieses Zeichen wird bei der Herausgabe der Namen wieder entfernt und
// die Familie wird neu generiert.

// Ausserdem gibt es jetzt zusaetzlich das Bit bPhysical. Ist dieses Bit
// TRUE, werden die Pool-Formatnamen NICHT mit eingetragen.


class SwImplShellAction
{
    SwWrtShell* pSh;
    CurrShell* pCurrSh;
public:
    SwImplShellAction( SwDoc& rDoc );
    ~SwImplShellAction();

    SwWrtShell* GetSh() { return pSh; }
};

SwImplShellAction::SwImplShellAction( SwDoc& rDoc )
    : pCurrSh( 0 )
{
    if( rDoc.GetDocShell() )
        pSh = rDoc.GetDocShell()->GetWrtShell();
    else
        pSh = 0;

    if( pSh )
    {
        pCurrSh = new CurrShell( pSh );
        pSh->StartAllAction();
    }
}

SwImplShellAction::~SwImplShellAction()
{
    if( pCurrSh )
    {
        pSh->EndAllAction();
        delete pCurrSh;
    }
}

/*--------------------------------------------------------------------
    Beschreibung:   SwCharFormate finden/anlegen
                    evtl. Style fuellen
 --------------------------------------------------------------------*/

SwCharFmt* lcl_FindCharFmt( SwDoc& rDoc,
                            const String& rName,
                            SwDocStyleSheet* pStyle = 0,
                            FASTBOOL bCreate = TRUE )
{
    SwCharFmt*  pFmt = 0;
    if( rName.Len() )
    {
        pFmt = rDoc.FindCharFmtByName( rName );
        if( !pFmt && rName == *rDoc.GetTextNmArray()[ RES_POOLCOLL_STANDARD -
                                                RES_POOLCOLL_TEXT_BEGIN ] )
        {
            // Standard-Zeichenvorlage
            pFmt = (SwCharFmt*)rDoc.GetDfltCharFmt();
        }

        if( !pFmt && bCreate )
        {   // Pool abklappern
            const USHORT nId = rDoc.GetPoolId(rName, GET_POOLID_CHRFMT);
            if(nId != USHRT_MAX)
                pFmt = rDoc.GetCharFmtFromPool(nId);
        }
    }
    if(pStyle)
    {
        if(pFmt)
        {
            pStyle->SetPhysical(TRUE);
            SwFmt* p = pFmt->DerivedFrom();
            if( p && !p->IsDefault() )
                pStyle->PresetParent( p->GetName() );
            else
                pStyle->PresetParent( aEmptyStr );
        }
        else
            pStyle->SetPhysical(FALSE);
    }
    return pFmt;
}


/*--------------------------------------------------------------------
    Beschreibung:   ParaFormate finden/erzeugen
                    Style fuellen
 --------------------------------------------------------------------*/

SwTxtFmtColl* lcl_FindParaFmt(  SwDoc& rDoc,
                                const String& rName,
                                SwDocStyleSheet* pStyle = 0,
                                FASTBOOL bCreate = TRUE )
{
    SwTxtFmtColl*   pColl = 0;

    if( rName.Len() )
    {
        pColl = rDoc.FindTxtFmtCollByName( rName );
        if( !pColl && bCreate )
        {   // Pool abklappern
            const USHORT nId = rDoc.GetPoolId(rName, GET_POOLID_TXTCOLL);
            if(nId != USHRT_MAX)
                pColl = rDoc.GetTxtCollFromPool(nId);
        }
    }

    if(pStyle)
    {
        if(pColl)
        {
            pStyle->SetPhysical(TRUE);
            if( pColl->DerivedFrom() && !pColl->DerivedFrom()->IsDefault() )
                pStyle->PresetParent( pColl->DerivedFrom()->GetName() );
            else
                pStyle->PresetParent( aEmptyStr );

            SwTxtFmtColl& rNext = pColl->GetNextTxtFmtColl();
            pStyle->PresetFollow(rNext.GetName());
        }
        else
            pStyle->SetPhysical(FALSE);
    }
    return pColl;
}


/*--------------------------------------------------------------------
    Beschreibung:   Rahmenformate
 --------------------------------------------------------------------*/


SwFrmFmt* lcl_FindFrmFmt(   SwDoc& rDoc,
                            const String& rName,
                            SwDocStyleSheet* pStyle = 0,
                            FASTBOOL bCreate = TRUE )
{
    SwFrmFmt* pFmt = 0;
    if( rName.Len() )
    {
        pFmt = rDoc.FindFrmFmtByName( rName );
        if( !pFmt && bCreate )
        {   // Pool abklappern
            const USHORT nId = rDoc.GetPoolId(rName, GET_POOLID_FRMFMT);
            if(nId != USHRT_MAX)
                pFmt = rDoc.GetFrmFmtFromPool(nId);
        }
    }

    if(pStyle)
    {
        if(pFmt)
        {
            pStyle->SetPhysical(TRUE);
            if( pFmt->DerivedFrom() && !pFmt->DerivedFrom()->IsDefault() )
                pStyle->PresetParent( pFmt->DerivedFrom()->GetName() );
            else
                pStyle->PresetParent( aEmptyStr );
        }
        else
            pStyle->SetPhysical(FALSE);
    }
    return pFmt;
}

/*--------------------------------------------------------------------
    Beschreibung:   Seitendescriptoren
 --------------------------------------------------------------------*/


const SwPageDesc* lcl_FindPageDesc( SwDoc&  rDoc,
                                    const String&    rName,
                                    SwDocStyleSheet* pStyle = 0,
                                    FASTBOOL bCreate = TRUE )
{
    const SwPageDesc* pDesc = 0;

    if( rName.Len() )
    {
        pDesc = rDoc.FindPageDescByName( rName );
        if( !pDesc && bCreate )
        {
            USHORT nId = rDoc.GetPoolId(rName, GET_POOLID_PAGEDESC);
            if(nId != USHRT_MAX)
                pDesc = rDoc.GetPageDescFromPool(nId);
        }
    }

    if(pStyle)
    {
        if(pDesc)
        {
            pStyle->SetPhysical(TRUE);
            if(pDesc->GetFollow())
                pStyle->PresetFollow(pDesc->GetFollow()->GetName());
            else
                pStyle->PresetParent( aEmptyStr );
        }
        else
            pStyle->SetPhysical(FALSE);
    }
    return pDesc;
}

const SwNumRule* lcl_FindNumRule(   SwDoc&  rDoc,
                                    const String&    rName,
                                    SwDocStyleSheet* pStyle = 0,
                                    FASTBOOL bCreate = TRUE )
{
    const SwNumRule* pRule = 0;

    if( rName.Len() )
    {
        pRule = rDoc.FindNumRulePtr( rName );
        if( !pRule && bCreate )
        {
            USHORT nId = rDoc.GetPoolId(rName, GET_POOLID_NUMRULE);
            if(nId != USHRT_MAX)
                pRule = rDoc.GetNumRuleFromPool(nId);
        }
    }

    if(pStyle)
    {
        if(pRule)
        {
            pStyle->SetPhysical(TRUE);
            pStyle->PresetParent( aEmptyStr );
        }
        else
            pStyle->SetPhysical(FALSE);
    }
    return pRule;
}


USHORT lcl_FindName( const SwPoolFmtList& rLst, SfxStyleFamily eFam,
                        const String& rName )
{
    if( rLst.Count() )
    {
        // suchen
        String sSrch( ' ' );
        switch( eFam )
        {
        case SFX_STYLE_FAMILY_CHAR:  sSrch = cCHAR;     break;
        case SFX_STYLE_FAMILY_PARA:  sSrch = cPARA;     break;
        case SFX_STYLE_FAMILY_FRAME: sSrch = cFRAME;    break;
        case SFX_STYLE_FAMILY_PAGE:  sSrch = cPAGE;     break;
        case SFX_STYLE_FAMILY_PSEUDO: sSrch = cNUMRULE; break;
        }
        sSrch += rName;
        for( USHORT i=0; i < rLst.Count(); ++i )
            if( *rLst[i] == sSrch )
                return i;
    }
    return USHRT_MAX;
}

FASTBOOL FindPhyStyle( SwDoc& rDoc, const String& rName, SfxStyleFamily eFam )
{
    switch( eFam )
    {
    case SFX_STYLE_FAMILY_CHAR :
        return 0 != lcl_FindCharFmt( rDoc, rName, 0, FALSE );
    case SFX_STYLE_FAMILY_PARA :
        return 0 != lcl_FindParaFmt( rDoc, rName, 0, FALSE );
    case SFX_STYLE_FAMILY_FRAME:
        return 0 != lcl_FindFrmFmt( rDoc, rName, 0, FALSE );
    case SFX_STYLE_FAMILY_PAGE :
        return 0 != lcl_FindPageDesc( rDoc, rName, 0, FALSE );
    case SFX_STYLE_FAMILY_PSEUDO:
        return 0 != lcl_FindNumRule( rDoc, rName, 0, FALSE );
    }
    return FALSE;
}


/*--------------------------------------------------------------------
    Beschreibung:   Einfuegen von Strings in die Liste der Vorlagen
 --------------------------------------------------------------------*/


void SwPoolFmtList::Append( char cChar, const String& rStr )
{
    String* pStr = new String( cChar );
    *pStr += rStr;
    for ( USHORT i=0; i < Count(); ++i )
    {
        if( *operator[](i) == *pStr )
        {
            delete pStr;
            return;
        }
    }
    Insert( pStr, Count() );
}

/*--------------------------------------------------------------------
    Beschreibung:   Liste kompletti loeschen
 --------------------------------------------------------------------*/


void SwPoolFmtList::Erase()
{
    DeleteAndDestroy( 0, Count() );
}

/*  */

/*--------------------------------------------------------------------
    Beschreibung:  UI-seitige implementierung von StyleSheets
                   greift auf die Core-Engine zu
 --------------------------------------------------------------------*/

SwDocStyleSheet::SwDocStyleSheet(   SwDoc&          rDocument,
                                    const String&           rName,
                                    SwDocStyleSheetPool&    rPool,
                                    SfxStyleFamily          eFam,
                                    USHORT                  nMask) :

    SfxStyleSheetBase( rName, rPool, eFam, nMask ),
    rDoc(rDocument),
    pCharFmt(0),
    pFrmFmt(0),
    pColl(0),
    pDesc(0),
    pNumRule(0),
    bPhysical(FALSE),
    aCoreSet(GetPool().GetPool(),
            RES_CHRATR_BEGIN,       RES_CHRATR_END - 1,
            RES_PARATR_BEGIN,       RES_PARATR_END - 1,
            RES_FRMATR_BEGIN,       RES_FRMATR_END - 1,
            SID_ATTR_PAGE,          SID_ATTR_PAGE_EXT1,
            SID_ATTR_PAGE_HEADERSET,SID_ATTR_PAGE_FOOTERSET,
            SID_ATTR_BORDER_INNER,  SID_ATTR_BORDER_INNER,
            FN_PARAM_FTN_INFO,      FN_PARAM_FTN_INFO,
            SID_ATTR_PARA_MODEL,    SID_ATTR_PARA_MODEL,
            SID_ATTR_PARA_PAGENUM, SID_ATTR_PARA_PAGENUM,
            SID_SWREGISTER_MODE,    SID_SWREGISTER_COLLECTION,
            FN_COND_COLL,           FN_COND_COLL,
            SID_ATTR_AUTO_STYLE_UPDATE, SID_ATTR_AUTO_STYLE_UPDATE,
            SID_ATTR_NUMBERING_RULE,    SID_ATTR_NUMBERING_RULE,
            SID_PARA_BACKGRND_DESTINATION,  SID_ATTR_BRUSH_CHAR,
            SID_ATTR_NUMBERING_RULE,    SID_ATTR_NUMBERING_RULE,
            0)
{
    nHelpId = UCHAR_MAX;
}


SwDocStyleSheet::SwDocStyleSheet( const SwDocStyleSheet& rOrg) :
    SfxStyleSheetBase(rOrg),
    pCharFmt(rOrg.pCharFmt),
    pFrmFmt(rOrg.pFrmFmt),
    pColl(rOrg.pColl),
    pDesc(rOrg.pDesc),
    pNumRule(rOrg.pNumRule),
    rDoc(rOrg.rDoc),
    bPhysical(rOrg.bPhysical),
    aCoreSet(rOrg.aCoreSet)
{
}


 SwDocStyleSheet::~SwDocStyleSheet()
{
}

/*--------------------------------------------------------------------
    Beschreibung:   Zuruecksetzen
 --------------------------------------------------------------------*/


void  SwDocStyleSheet::Reset()
{
    aName.Erase();
    aFollow.Erase();
    aParent.Erase();
    SetPhysical(FALSE);
}

/*--------------------------------------------------------------------
    Beschreibung:   virtuelle Methoden
 --------------------------------------------------------------------*/


const String&  SwDocStyleSheet::GetParent() const
{
    if( !bPhysical )
    {
        // dann pruefe, ob schon im Doc vorhanden
        SwFmt* pFmt = 0;
        SwGetPoolIdFromName eGetType;
        switch(nFamily)
        {
        case SFX_STYLE_FAMILY_CHAR:
            pFmt = rDoc.FindCharFmtByName( aName );
            eGetType = GET_POOLID_CHRFMT;
            break;

        case SFX_STYLE_FAMILY_PARA:
            pFmt = rDoc.FindTxtFmtCollByName( aName );
            eGetType = GET_POOLID_TXTCOLL;
            break;

        case SFX_STYLE_FAMILY_FRAME:
            pFmt = rDoc.FindFrmFmtByName( aName );
            eGetType = GET_POOLID_FRMFMT;
            break;

        case SFX_STYLE_FAMILY_PAGE:
        case SFX_STYLE_FAMILY_PSEUDO:
        default:
            return aEmptyStr;       // es gibt keinen Parent
        }

        String sTmp;
        if( !pFmt )         // noch nicht vorhanden, also dflt. Parent
        {
            USHORT i = rDoc.GetPoolId( aName, eGetType );
            i = ::GetPoolParent( i );
            if( i && USHRT_MAX != i )
                SwDoc::GetPoolNm( i, sTmp );
        }
        else
        {
            SwFmt* p = pFmt->DerivedFrom();
            if( p && !p->IsDefault() )
                sTmp = p->GetName();
        }
        SwDocStyleSheet* pThis = (SwDocStyleSheet*)this;
        pThis->aParent = sTmp;
    }
    return aParent;
}

/*--------------------------------------------------------------------
   Beschreibung:    Nachfolger
 --------------------------------------------------------------------*/


const String&  SwDocStyleSheet::GetFollow() const
{
    if( !bPhysical )
    {
        SwDocStyleSheet* pThis = (SwDocStyleSheet*)this;
        pThis->FillStyleSheet( FillAllInfo );
    }
    return aFollow;
}

/*--------------------------------------------------------------------
    Beschreibung:   Welche Verkettung ist moeglich
 --------------------------------------------------------------------*/


BOOL  SwDocStyleSheet::HasFollowSupport() const
{
    switch(nFamily)
    {
        case SFX_STYLE_FAMILY_PARA :
        case SFX_STYLE_FAMILY_PAGE : return TRUE;
        case SFX_STYLE_FAMILY_FRAME:
        case SFX_STYLE_FAMILY_CHAR :
        case SFX_STYLE_FAMILY_PSEUDO: return FALSE;
        default:
            ASSERT(!this, "unbekannte Style-Familie");
    }
    return FALSE;
}

/*--------------------------------------------------------------------
    Beschreibung:   Parent ?
 --------------------------------------------------------------------*/


BOOL  SwDocStyleSheet::HasParentSupport() const
{
    BOOL bRet = FALSE;
    switch(nFamily)
    {
        case SFX_STYLE_FAMILY_CHAR :
        case SFX_STYLE_FAMILY_PARA :
        case SFX_STYLE_FAMILY_FRAME: bRet = TRUE;
    }
    return bRet;
}


BOOL  SwDocStyleSheet::HasClearParentSupport() const
{
    BOOL bRet = FALSE;
    switch(nFamily)
    {
        case SFX_STYLE_FAMILY_PARA :
        case SFX_STYLE_FAMILY_CHAR :
        case SFX_STYLE_FAMILY_FRAME: bRet = TRUE;
    }
    return bRet;
}

/*--------------------------------------------------------------------
    Beschreibung:   textuelle Beschreibung ermitteln
 --------------------------------------------------------------------*/
String  SwDocStyleSheet::GetDescription(SfxMapUnit eUnit)
{
    String sPlus(String::CreateFromAscii(" + "));
    if ( SFX_STYLE_FAMILY_PAGE == nFamily )
    {
        if( !pSet )
            GetItemSet();

        SfxItemIter aIter( *pSet );
        String aDesc;
        const SfxPoolItem* pItem = aIter.FirstItem();

        while ( pItem )
        {
            if(!IsInvalidItem(pItem))
                switch ( pItem->Which() )
                {
                    case RES_LR_SPACE:
                    case SID_ATTR_PAGE_SIZE:
                    case SID_ATTR_PAGE_MAXSIZE:
                    case SID_ATTR_PAGE_PAPERBIN:
                    case SID_ATTR_PAGE_APP:
                    case SID_ATTR_BORDER_INNER:
                        break;
                    default:
                    {
                        String aItemPresentation;
                        if ( !IsInvalidItem( pItem ) &&
                             rPool.GetPool().GetPresentation(
                                *pItem, SFX_ITEM_PRESENTATION_COMPLETE,
                                eUnit, aItemPresentation ) )
                        {
                            if ( aDesc.Len() && aItemPresentation.Len() )
                                aDesc += sPlus;
                            aDesc += aItemPresentation;
                        }
                    }
                }
            pItem = aIter.NextItem();
        }
        return aDesc;
    }
    else if ( SFX_STYLE_FAMILY_FRAME == nFamily ||
                    SFX_STYLE_FAMILY_PARA == nFamily)
    {
        if( !pSet )
            GetItemSet();

        SfxItemIter aIter( *pSet );
        String aDesc;
        const SfxPoolItem* pItem = aIter.FirstItem();

        String sPageNum, sModel, sBreak;

        while ( pItem )
        {
            if(!IsInvalidItem(pItem))
                switch ( pItem->Which() )
                {
                    case SID_ATTR_AUTO_STYLE_UPDATE:
                    case SID_PARA_BACKGRND_DESTINATION:
                    case RES_PAGEDESC:
                        break;
                    default:
                    {
                        String aItemPresentation;
                        if ( !IsInvalidItem( pItem ) &&
                             rPool.GetPool().GetPresentation(
                                *pItem, SFX_ITEM_PRESENTATION_COMPLETE,
                                eUnit, aItemPresentation ) )
                        {

                            switch ( pItem->Which() )
                            {
                                case SID_ATTR_PARA_PAGENUM:
                                    sPageNum = aItemPresentation;
                                    break;
                                case SID_ATTR_PARA_MODEL:
                                    sModel = aItemPresentation;
                                    break;
                                case RES_BREAK:
                                    sBreak = aItemPresentation;
                                    break;
                                default:
                                if ( aDesc.Len() && aItemPresentation.Len() )
                                    aDesc += sPlus;
                                aDesc += aItemPresentation;
                            }
                        }
                    }
                }
            pItem = aIter.NextItem();
        }
        //Sonderbehandlung fuer Umburch, Seitenvorlage und Seitenoffset
        if(sBreak.Len() && !sModel.Len())  // wemm Model. dann ist Break ungueltig
        {
            if(aDesc.Len())
                aDesc += sPlus;
            aDesc += sBreak;
        }
        if(sModel.Len())
        {
            if(aDesc.Len())
                aDesc += sPlus;
            aDesc += SW_RESSTR(STR_PAGEBREAK);
            aDesc += sPlus;
            aDesc += sModel;
            if(sPageNum != String(UniString::CreateFromInt32(0)))
            {
                aDesc += sPlus;
                aDesc += SW_RESSTR(STR_PAGEOFFSET);
                aDesc += sPageNum;
            }
        }
        return aDesc;
    }
    else if( SFX_STYLE_FAMILY_PSEUDO == nFamily )
    {
//      if( pNumRule )
//          return pNumRule->GetName();
        //os: was sollte man bei Numerierungen schon anzeigen?
        return aEmptyStr;
    }

    return SfxStyleSheetBase::GetDescription(eUnit);
}


String  SwDocStyleSheet::GetDescription()
{
    return GetDescription(SFX_MAPUNIT_CM);
}

/*--------------------------------------------------------------------
    Beschreibung:   Namen setzen
 --------------------------------------------------------------------*/


BOOL  SwDocStyleSheet::SetName( const String& rStr)
{
    if( !rStr.Len() )
        return FALSE;

    if( aName != rStr )
    {
        if( !SfxStyleSheetBase::SetName( rStr ))
            return FALSE;
    }
    else if(!bPhysical)
        FillStyleSheet( FillPhysical );

    int bChg = FALSE;
    switch(nFamily)
    {
        case SFX_STYLE_FAMILY_CHAR :
        {
            ASSERT(pCharFmt, "SwCharFormat fehlt!");
            if( pCharFmt && pCharFmt->GetName() != rStr )
            {
                pCharFmt->SetName( rStr );
                bChg = TRUE;
            }
            break;
        }
        case SFX_STYLE_FAMILY_PARA :
        {
            ASSERT(pColl, "Collektion fehlt!");
            if( pColl && pColl->GetName() != rStr )
            {
                pColl->SetName( rStr );
                bChg = TRUE;
            }
            break;
        }
        case SFX_STYLE_FAMILY_FRAME:
        {
            ASSERT(pFrmFmt, "FrmFmt fehlt!");
            if( pFrmFmt && pFrmFmt->GetName() != rStr )
            {
                pFrmFmt->SetName( rStr );
                bChg = TRUE;
            }
            break;
        }
        case SFX_STYLE_FAMILY_PAGE :
            ASSERT(pDesc, "PageDesc fehlt!");
            if( pDesc && pDesc->GetName() != rStr )
            {
                //PageDesc setzen - mit vorherigem kopieren - ist fuer das
                //setzen des Namens wohl nicht notwendig. Deshalb erlauben
                //wir hier mal einen cast.
                ((SwPageDesc*)pDesc)->SetName( rStr );
                rDoc.SetModified();
                bChg = TRUE;
            }
            break;
        case SFX_STYLE_FAMILY_PSEUDO:
            ASSERT(pNumRule, "NumRule fehlt!");
            if( pNumRule && pNumRule->GetName() != rStr )
            {
                ((SwNumRule*)pNumRule)->SetName( rStr );
                rDoc.SetModified();
                bChg = TRUE;
            }
            break;


#ifdef DBG_UTIL
        default:
            ASSERT(!this, "unbekannte Style-Familie");
#endif
    }

    if( bChg )
    {
        rPool.First();      // interne Liste muss geupdatet werden
        rPool.Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_MODIFIED, *this ) );
        SwEditShell* pSh = rDoc.GetEditShell();
        if( pSh )
            pSh->CallChgLnk();
    }
    return TRUE;
}

/*--------------------------------------------------------------------
    Beschreibung:   Ableitungshirachie
 --------------------------------------------------------------------*/


BOOL   SwDocStyleSheet::SetParent( const String& rStr)
{
    SwFmt* pFmt = 0, *pParent = 0;
    switch(nFamily)
    {
        case SFX_STYLE_FAMILY_CHAR :
            ASSERT( pCharFmt, "SwCharFormat fehlt!" )
            if( 0 != ( pFmt = pCharFmt ) && rStr.Len() )
                pParent = lcl_FindCharFmt(rDoc, rStr);
            break;

        case SFX_STYLE_FAMILY_PARA :
            ASSERT( pColl, "Collektion fehlt!")
            if( 0 != ( pFmt = pColl ) && rStr.Len() )
                pParent = lcl_FindParaFmt( rDoc, rStr );
            break;

        case SFX_STYLE_FAMILY_FRAME:
            ASSERT(pFrmFmt, "FrameFormat fehlt!");
            if( 0 != ( pFmt = pFrmFmt ) && rStr.Len() )
                pParent = lcl_FindFrmFmt( rDoc, rStr );
            break;

        case SFX_STYLE_FAMILY_PAGE:
        case SFX_STYLE_FAMILY_PSEUDO:
            break;
        default:
            ASSERT(!this, "unbekannte Style-Familie");
    }

    BOOL bRet = FALSE;
    if( pFmt && pFmt->DerivedFrom() &&
        pFmt->DerivedFrom()->GetName() != rStr )
    {
        {
            SwImplShellAction aTmp( rDoc );
            bRet = pFmt->SetDerivedFrom( pParent );
        }

        if( bRet )
        {
            aParent = rStr;
            rPool.Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_MODIFIED,
                            *this ) );
        }
    }

    return bRet;
}

/*--------------------------------------------------------------------
    Beschreibung:   Nachfolger detzen
 --------------------------------------------------------------------*/


BOOL   SwDocStyleSheet::SetFollow( const String& rStr)
{
    if( rStr.Len() && !SfxStyleSheetBase::SetFollow( rStr ))
        return FALSE;

    SwImplShellAction aTmpSh( rDoc );
    switch(nFamily)
    {
    case SFX_STYLE_FAMILY_PARA :
    {
        ASSERT(pColl, "Collection fehlt!");
        if( pColl )
        {
            SwTxtFmtColl* pFollow = pColl;
            if( rStr.Len() && 0 == (pFollow = lcl_FindParaFmt(rDoc, rStr) ))
                pFollow = pColl;

            pColl->SetNextTxtFmtColl(*pFollow);
        }
        break;
    }
    case SFX_STYLE_FAMILY_PAGE :
    {
        ASSERT(pDesc, "PageDesc fehlt!");
        if( pDesc )
        {
            const SwPageDesc* pFollowDesc = rStr.Len()
                                            ? lcl_FindPageDesc(rDoc, rStr)
                                            : 0;
            USHORT nId;
            if( rDoc.FindPageDescByName( pDesc->GetName(), &nId ))
            {
                SwPageDesc aDesc( *pDesc );
                aDesc.SetFollow( pFollowDesc );
                rDoc.ChgPageDesc( nId, aDesc );
                pDesc = &rDoc.GetPageDesc( nId );
            }
        }
        break;
    }
    case SFX_STYLE_FAMILY_CHAR:
    case SFX_STYLE_FAMILY_FRAME:
    case SFX_STYLE_FAMILY_PSEUDO:
        break;
    default:
        ASSERT(!this, "unbekannte Style-Familie");
    }

    return TRUE;
}

/*--------------------------------------------------------------------
    Beschreibung:   ueber Name und Family, Mask den ItemSet rausholen
 --------------------------------------------------------------------*/

SfxItemSet&   SwDocStyleSheet::GetItemSet()
{
    if(!bPhysical)
        FillStyleSheet( FillPhysical );

    switch(nFamily)
    {
        case SFX_STYLE_FAMILY_CHAR:
            {
                ASSERT(pCharFmt, "Wo ist das SwCharFmt");
                aCoreSet.Put(pCharFmt->GetAttrSet());
                if(pCharFmt->DerivedFrom())
                    aCoreSet.SetParent(&pCharFmt->DerivedFrom()->GetAttrSet());
            }
            break;
        case SFX_STYLE_FAMILY_PARA :
        case SFX_STYLE_FAMILY_FRAME:
            {
                SvxBoxInfoItem aBoxInfo;
                aBoxInfo.SetTable( FALSE );
                aBoxInfo.SetDist( TRUE);    // Abstandsfeld immer anzeigen
                aBoxInfo.SetMinDist( TRUE );// Minimalgroesse in Tabellen und Absaetzen setzen
                aBoxInfo.SetDefDist( MIN_BORDER_DIST );// Default-Abstand immer setzen
                    // Einzelne Linien koennen nur in Tabellen DontCare-Status haben
                aBoxInfo.SetValid( VALID_DISABLE, TRUE );
                if ( nFamily == SFX_STYLE_FAMILY_PARA )
                {
                    ASSERT(pColl, "Wo ist die Collektion");
                    aCoreSet.Put(pColl->GetAttrSet());
                    aCoreSet.Put( aBoxInfo );
                    aCoreSet.Put(SfxBoolItem(SID_ATTR_AUTO_STYLE_UPDATE, pColl->IsAutoUpdateFmt()));
                    if(pColl->DerivedFrom())
                        aCoreSet.SetParent(&pColl->DerivedFrom()->GetAttrSet());
                }
                else
                {
                    ASSERT(pFrmFmt, "Wo ist das FrmFmt");
                    aCoreSet.Put(pFrmFmt->GetAttrSet());
                    aCoreSet.Put( aBoxInfo );
                    aCoreSet.Put(SfxBoolItem(SID_ATTR_AUTO_STYLE_UPDATE, pFrmFmt->IsAutoUpdateFmt()));
                    if(pFrmFmt->DerivedFrom())
                        aCoreSet.SetParent(&pFrmFmt->DerivedFrom()->GetAttrSet());
                }
            }
            break;

        case SFX_STYLE_FAMILY_PAGE :
            {
                ASSERT(pDesc, "Kein PageDescriptor");
                ::PageDescToItemSet(*((SwPageDesc*)pDesc), aCoreSet);
            }
            break;

        case SFX_STYLE_FAMILY_PSEUDO:
            {
                ASSERT(pNumRule, "Keine NumRule");
                SvxNumRule aRule = pNumRule->MakeSvxNumRule();
                aCoreSet.Put(SvxNumBulletItem(aRule));
            }
            break;


#ifdef DBG_UTIL
        default:
            ASSERT(!this, "unbekannte Style-Familie");
#endif
    }
    // Member der Basisklasse
    pSet = &aCoreSet;

    return aCoreSet;
}

/*--------------------------------------------------------------------
    Beschreibung:   ItemSet setzen
 --------------------------------------------------------------------*/


void   SwDocStyleSheet::SetItemSet(const SfxItemSet& rSet)
{
    // gegebenenfalls Format erst ermitteln
    if(!bPhysical)
        FillStyleSheet( FillPhysical );

    SwImplShellAction aTmpSh( rDoc );

    ASSERT( &rSet != &aCoreSet, "SetItemSet mit eigenem Set ist nicht erlaubt" );

    SwFmt* pFmt = 0;
    SwPageDesc* pNewDsc = 0;
    USHORT nPgDscPos;

    switch(nFamily)
    {
        case SFX_STYLE_FAMILY_CHAR :
            {
                ASSERT(pCharFmt, "Wo ist das CharFormat");
                pFmt = pCharFmt;
            }
            break;

        case SFX_STYLE_FAMILY_PARA :
        {
            ASSERT(pColl, "Wo ist die Collection");
            const SfxPoolItem* pAutoUpdate;
            if(SFX_ITEM_SET == rSet.GetItemState(SID_ATTR_AUTO_STYLE_UPDATE,FALSE, &pAutoUpdate ))
            {
                pColl->SetAutoUpdateFmt(((const SfxBoolItem*)pAutoUpdate)->GetValue());
            }

            const SwCondCollItem* pCondItem;
            if( SFX_ITEM_SET != rSet.GetItemState( FN_COND_COLL, FALSE,
                (const SfxPoolItem**)&pCondItem ))
                pCondItem = 0;

            if( RES_CONDTXTFMTCOLL == pColl->Which() && pCondItem )
            {
                SwFmt* pFindFmt;
                const CommandStruct* pCmds = SwCondCollItem::GetCmds();
                for(USHORT i = 0; i < COND_COMMAND_COUNT; i++)
                {
                    SwCollCondition aCond( 0, pCmds[ i ].nCnd, pCmds[ i ].nSubCond );
                    ((SwConditionTxtFmtColl*)pColl)->RemoveCondition( aCond );
                    const String& rStyle = pCondItem->GetStyle( i );
                    if( rStyle.Len() &&
                        0 != ( pFindFmt = lcl_FindParaFmt( rDoc, rStyle, 0, TRUE )))
                    {
                        pFindFmt->Add( &aCond );
                        ((SwConditionTxtFmtColl*)pColl)->InsertCondition( aCond );
                    }
                }

                // Document auf die neue Bedingungen updaten
                SwCondCollCondChg aMsg( pColl );
                pColl->Modify( &aMsg, &aMsg );
            }
            else if( pCondItem && !pColl->GetDepends() )
            {
                // keine bedingte Vorlage, dann erstmal erzeugen und
                // alle wichtigen Werte uebernehmen
                SwConditionTxtFmtColl* pCColl = rDoc.MakeCondTxtFmtColl(
                        pColl->GetName(), (SwTxtFmtColl*)pColl->DerivedFrom() );
                if( pColl != &pColl->GetNextTxtFmtColl() )
                    pCColl->SetNextTxtFmtColl( pColl->GetNextTxtFmtColl() );

                pCColl->SetOutlineLevel( pColl->GetOutlineLevel() );

                SwTxtFmtColl* pFindFmt;
                const CommandStruct* pCmds = SwCondCollItem::GetCmds();
                for( USHORT i = 0; i < COND_COMMAND_COUNT; ++i )
                {
                    const String& rStyle = pCondItem->GetStyle( i );
                    if( rStyle.Len() &&
                        0 != ( pFindFmt = lcl_FindParaFmt( rDoc, rStyle, 0, TRUE )))
                    {
                        pCColl->InsertCondition( SwCollCondition( pFindFmt,
                                    pCmds[ i ].nCnd, pCmds[ i ].nSubCond ) );
                    }
                }

                rDoc.DelTxtFmtColl( pColl );
                pColl = pCColl;
            }
            pFmt = pColl;

            USHORT nId = pColl->GetPoolFmtId() &
                            ~ ( COLL_GET_RANGE_BITS | POOLGRP_NOCOLLID );
            switch( GetMask() & ( 0x0fff & ~SWSTYLEBIT_CONDCOLL ) )
            {
                case SWSTYLEBIT_TEXT:
                    nId |= COLL_TEXT_BITS;
                    break;
                case SWSTYLEBIT_CHAPTER:
                    nId |= COLL_DOC_BITS;
                    break;
                case SWSTYLEBIT_LIST:
                    nId |= COLL_LISTS_BITS;
                    break;
                case SWSTYLEBIT_IDX:
                    nId |= COLL_REGISTER_BITS;
                    break;
                case SWSTYLEBIT_EXTRA:
                    nId |= COLL_EXTRA_BITS;
                    break;
                case SWSTYLEBIT_HTML:
                    nId |= COLL_HTML_BITS;
                    break;
            }
            pColl->SetPoolFmtId( nId );
            break;
        }
        case SFX_STYLE_FAMILY_FRAME:
        {
            ASSERT(pFrmFmt, "Wo ist das FrmFmt");
            const SfxPoolItem* pAutoUpdate;
            if(SFX_ITEM_SET == rSet.GetItemState(SID_ATTR_AUTO_STYLE_UPDATE,FALSE, &pAutoUpdate ))
            {
                pFrmFmt->SetAutoUpdateFmt(((const SfxBoolItem*)pAutoUpdate)->GetValue());
            }
            pFmt = pFrmFmt;
        }
        break;

        case SFX_STYLE_FAMILY_PAGE :
            {
                ASSERT(pDesc, "Wo ist der PageDescriptor");

                if( rDoc.FindPageDescByName( pDesc->GetName(), &nPgDscPos ))
                {
                    pNewDsc = new SwPageDesc( *pDesc );
                    pFmt = &pNewDsc->GetMaster();
                }
            }
            break;

        case SFX_STYLE_FAMILY_PSEUDO:
            {
                ASSERT(pNumRule, "Wo ist die NumRule");
                const SfxPoolItem* pItem;
                switch( rSet.GetItemState( SID_ATTR_NUMBERING_RULE, FALSE, &pItem ))
                {
                case SFX_ITEM_SET:
                {
                    SvxNumRule* pSetRule = ((SvxNumBulletItem*)pItem)->GetNumRule();
                    pSetRule->UnLinkGraphics();
                    //SwNumRule aSetRule(rDoc.GetUniqueNumRuleName());
                    SwNumRule aSetRule(pNumRule->GetName());
                    aSetRule.SetSvxRule(*pSetRule, &rDoc);
                    rDoc.ChgNumRuleFmts( aSetRule );
                }
                break;
                case SFX_ITEM_DONTCARE:
                    // NumRule auf default Werte
                    // was sind die default Werte?
                    {
                        SwNumRule aRule( pNumRule->GetName() );
                        rDoc.ChgNumRuleFmts( aRule );
                    }
                    break;
                }
            }
            break;

#ifdef DBG_UTIL
        default:
            ASSERT(!this, "unbekannte Style-Familie");
#endif
    }

    if( pFmt && rSet.Count())
    {
        SfxItemIter aIter( rSet );
        const SfxPoolItem* pItem = aIter.GetCurItem();
        while( TRUE )
        {
            if( IsInvalidItem( pItem ) )            // Clearen
                pFmt->ResetAttr( rSet.GetWhichByPos(aIter.GetCurPos()));

            if( aIter.IsAtEnd() )
                break;
            pItem = aIter.NextItem();
        }
        SfxItemSet aSet(rSet);
        aSet.ClearInvalidItems();

        aCoreSet.ClearItem();

        if( pNewDsc )
        {
            ::ItemSetToPageDesc( aSet, *pNewDsc,
                                ::GetActiveWrtShell());
            rDoc.ChgPageDesc( nPgDscPos, *pNewDsc );
            pDesc = &rDoc.GetPageDesc( nPgDscPos );
            delete pNewDsc;
        }
        else
            pFmt->SetAttr( aSet );      // alles gesetzten Putten
    }
    else
    {
        aCoreSet.ClearItem();
        if( pNewDsc )           // den muessen wir noch vernichten!!
            delete pNewDsc;
    }
}

void lcl_SaveStyles( USHORT nFamily, SvPtrarr& rArr, SwDoc& rDoc )
{
    switch( nFamily )
    {
    case SFX_STYLE_FAMILY_CHAR:
        {
            const SwCharFmts& rTbl = *rDoc.GetCharFmts();
            for( sal_uInt16 n = 0, nCnt = rTbl.Count(); n < nCnt; ++n )
            {
                void* p = (void*)rTbl[ n ];
                rArr.Insert( p, n );
            }
        }
        break;
    case SFX_STYLE_FAMILY_PARA:
        {
            const SwTxtFmtColls& rTbl = *rDoc.GetTxtFmtColls();
            for( sal_uInt16 n = 0, nCnt = rTbl.Count(); n < nCnt; ++n )
            {
                void* p = (void*)rTbl[ n ];
                rArr.Insert( p, n );
            }
        }
        break;
    case SFX_STYLE_FAMILY_FRAME:
        {
            const SwFrmFmts& rTbl = *rDoc.GetFrmFmts();
            for( sal_uInt16 n = 0, nCnt = rTbl.Count(); n < nCnt; ++n )
            {
                void* p = (void*)rTbl[ n ];
                rArr.Insert( p, n );
            }
        }
        break;

    case SFX_STYLE_FAMILY_PAGE:
        {
            for( sal_uInt16 n = 0, nCnt = rDoc.GetPageDescCnt(); n < nCnt; ++n )
            {
                void* p = (void*)&rDoc.GetPageDesc( n );
                rArr.Insert( p, n );
            }
        }
        break;

    case SFX_STYLE_FAMILY_PSEUDO:
        {
            const SwNumRuleTbl& rTbl = rDoc.GetNumRuleTbl();
            for( sal_uInt16 n = 0, nCnt = rTbl.Count(); n < nCnt; ++n )
            {
                void* p = (void*)rTbl[ n ];
                rArr.Insert( p, n );
            }
        }
        break;
    }
}

void lcl_DeleteInfoStyles( USHORT nFamily, SvPtrarr& rArr, SwDoc& rDoc )
{
    sal_uInt16 n, nCnt;
    switch( nFamily )
    {
    case SFX_STYLE_FAMILY_CHAR:
        {
            SvUShorts aDelArr;
            const SwCharFmts& rTbl = *rDoc.GetCharFmts();
            for( sal_uInt16 n = 0, nCnt = rTbl.Count(); n < nCnt; ++n )
            {
                void* p = (void*)rTbl[ n ];
                if( USHRT_MAX == rArr.GetPos( p ))
                    aDelArr.Insert( n, 0 );
            }
            for( n = 0, nCnt = aDelArr.Count(); n < nCnt; ++n )
                rDoc.DelCharFmt( aDelArr[ n ] );
        }
        break;

    case SFX_STYLE_FAMILY_PARA :
        {
            SvUShorts aDelArr;
            const SwTxtFmtColls& rTbl = *rDoc.GetTxtFmtColls();
            for( sal_uInt16 n = 0, nCnt = rTbl.Count(); n < nCnt; ++n )
            {
                void* p = (void*)rTbl[ n ];
                if( USHRT_MAX == rArr.GetPos( p ))
                    aDelArr.Insert( n, 0 );
            }
            for( n = 0, nCnt = aDelArr.Count(); n < nCnt; ++n )
                rDoc.DelTxtFmtColl( aDelArr[ n ] );
        }
        break;

    case SFX_STYLE_FAMILY_FRAME:
        {
            SvPtrarr aDelArr;
            const SwFrmFmts& rTbl = *rDoc.GetFrmFmts();
            for( sal_uInt16 n = 0, nCnt = rTbl.Count(); n < nCnt; ++n )
            {
                void* p = (void*)rTbl[ n ];
                if( USHRT_MAX == rArr.GetPos( p ))
                    aDelArr.Insert( p, 0 );
            }
            for( n = 0, nCnt = aDelArr.Count(); n < nCnt; ++n )
                rDoc.DelFrmFmt( (SwFrmFmt*)aDelArr[ n ] );
        }
        break;

    case SFX_STYLE_FAMILY_PAGE:
        {
            SvUShorts aDelArr;
            for( n = 0, nCnt = rDoc.GetPageDescCnt(); n < nCnt; ++n )
            {
                void* p = (void*)&rDoc.GetPageDesc( n );
                if( USHRT_MAX == rArr.GetPos( p ))
                    aDelArr.Insert( n, 0 );
            }
            for( n = 0, nCnt = aDelArr.Count(); n < nCnt; ++n )
                rDoc.DelPageDesc( aDelArr[ n ] );
        }
        break;


    case SFX_STYLE_FAMILY_PSEUDO:
        {
            SvPtrarr aDelArr;
            const SwNumRuleTbl& rTbl = rDoc.GetNumRuleTbl();
            for( n = 0, nCnt = rTbl.Count(); n < nCnt; ++n )
            {
                void* p = (void*)rTbl[ n ];
                if( USHRT_MAX == rArr.GetPos( p ))
                    aDelArr.Insert( p, 0 );
            }
            for( n = 0, nCnt = aDelArr.Count(); n < nCnt; ++n )
                rDoc.DelNumRule( ((SwNumRule*)aDelArr[ n ])->GetName() );
        }
        break;
    }
}

/*--------------------------------------------------------------------
    Beschreibung:   Das Format ermitteln
 --------------------------------------------------------------------*/

BOOL SwDocStyleSheet::FillStyleSheet( FillStyleType eFType )
{
    BOOL bRet = FALSE;
    USHORT nPoolId = USHRT_MAX;
    SwFmt* pFmt = 0;

    BOOL bCreate = FillPhysical == eFType;
    BOOL bDeleteInfo = FALSE;
    BOOL bFillOnlyInfo = FillAllInfo == eFType;
    SvPtrarr aDelArr;

    switch(nFamily)
    {
    case SFX_STYLE_FAMILY_CHAR:
        pCharFmt = lcl_FindCharFmt(rDoc, aName, this, bCreate );
        bPhysical = 0 != pCharFmt;
        if( bFillOnlyInfo && !bPhysical )
        {
            bDeleteInfo = TRUE;
            ::lcl_SaveStyles( nFamily, aDelArr, rDoc );
            pCharFmt = lcl_FindCharFmt(rDoc, aName, this, TRUE );
        }

        pFmt = pCharFmt;
        if( !bCreate && !pFmt )
        {
            if( aName == *rDoc.GetTextNmArray()[ RES_POOLCOLL_STANDARD -
                                            RES_POOLCOLL_TEXT_BEGIN ] )
                nPoolId = 0;
            else
                nPoolId = rDoc.GetPoolId( aName, GET_POOLID_CHRFMT );
        }

        bRet = 0 != pCharFmt || USHRT_MAX != nPoolId;

        if( bDeleteInfo )
            pCharFmt = 0;
        break;

    case SFX_STYLE_FAMILY_PARA:
        {
            pColl = lcl_FindParaFmt(rDoc, aName, this, bCreate);
            bPhysical = 0 != pColl;
            if( bFillOnlyInfo && !bPhysical )
            {
                bDeleteInfo = TRUE;
                ::lcl_SaveStyles( nFamily, aDelArr, rDoc );
                pColl = lcl_FindParaFmt(rDoc, aName, this, TRUE );
            }

            pFmt = pColl;
            if( pColl )
                PresetFollow( pColl->GetNextTxtFmtColl().GetName() );
            else if( !bCreate )
                nPoolId = rDoc.GetPoolId( aName, GET_POOLID_TXTCOLL );

            bRet = 0 != pColl || USHRT_MAX != nPoolId;

            if( bDeleteInfo )
                pColl = 0;
        }
        break;

    case SFX_STYLE_FAMILY_FRAME:
        pFrmFmt = lcl_FindFrmFmt(rDoc,  aName, this, bCreate);
        bPhysical = 0 != pFrmFmt;
        if( bFillOnlyInfo && bPhysical )
        {
            bDeleteInfo = TRUE;
            ::lcl_SaveStyles( nFamily, aDelArr, rDoc );
            pFrmFmt = lcl_FindFrmFmt(rDoc, aName, this, TRUE );
        }
        pFmt = pFrmFmt;
        if( !bCreate && !pFmt )
            nPoolId = rDoc.GetPoolId( aName, GET_POOLID_FRMFMT );

        bRet = 0 != pFrmFmt || USHRT_MAX != nPoolId;

        if( bDeleteInfo )
            pFrmFmt = 0;
        break;

    case SFX_STYLE_FAMILY_PAGE:
        pDesc = lcl_FindPageDesc(rDoc, aName, this, bCreate);
        bPhysical = 0 != pDesc;
        if( bFillOnlyInfo && !pDesc )
        {
            bDeleteInfo = TRUE;
            ::lcl_SaveStyles( nFamily, aDelArr, rDoc );
            pDesc = lcl_FindPageDesc( rDoc, aName, this, TRUE );
        }

        if( pDesc )
        {
            nPoolId = pDesc->GetPoolFmtId();
            nHelpId = pDesc->GetPoolHelpId();
            if( pDesc->GetPoolHlpFileId() != UCHAR_MAX )
                aHelpFile = *rDoc.GetDocPattern( pDesc->GetPoolHlpFileId() );
            else
                aHelpFile.Erase();
        }
        else if( !bCreate )
            nPoolId = rDoc.GetPoolId( aName, GET_POOLID_PAGEDESC );
        SetMask( USER_FMT & nPoolId ? SFXSTYLEBIT_USERDEF : 0 );

        bRet = 0 != pDesc || USHRT_MAX != nPoolId;
        if( bDeleteInfo )
            pDesc = 0;
        break;

    case SFX_STYLE_FAMILY_PSEUDO:
        pNumRule = lcl_FindNumRule(rDoc, aName, this, bCreate);
        bPhysical = 0 != pNumRule;
        if( bFillOnlyInfo && !pNumRule )
        {
            bDeleteInfo = TRUE;
            ::lcl_SaveStyles( nFamily, aDelArr, rDoc );
            pNumRule = lcl_FindNumRule( rDoc, aName, this, TRUE );
        }

        if( pNumRule )
        {
            nPoolId = pNumRule->GetPoolFmtId();
            nHelpId = pNumRule->GetPoolHelpId();
            if( pNumRule->GetPoolHlpFileId() != UCHAR_MAX )
                aHelpFile = *rDoc.GetDocPattern( pNumRule->GetPoolHlpFileId() );
            else
                aHelpFile.Erase();
        }
        else if( !bCreate )
            nPoolId = rDoc.GetPoolId( aName, GET_POOLID_NUMRULE );
        SetMask( USER_FMT & nPoolId ? SFXSTYLEBIT_USERDEF : 0 );

        bRet = 0 != pNumRule || USHRT_MAX != nPoolId;

        if( bDeleteInfo )
            pNumRule = 0;
        break;
    }

    if( SFX_STYLE_FAMILY_CHAR == nFamily ||
        SFX_STYLE_FAMILY_PARA == nFamily ||
        SFX_STYLE_FAMILY_FRAME == nFamily )
    {
        if( pFmt )
            nPoolId = pFmt->GetPoolFmtId();

        USHORT nMask = 0;
        if( pFmt == rDoc.GetDfltCharFmt() )
            nMask |= SFXSTYLEBIT_READONLY;
        else if( USER_FMT & nPoolId )
            nMask |= SFXSTYLEBIT_USERDEF;

        switch ( COLL_GET_RANGE_BITS & nPoolId )
        {
        case COLL_TEXT_BITS:     nMask |= SWSTYLEBIT_TEXT;    break;
        case COLL_DOC_BITS :     nMask |= SWSTYLEBIT_CHAPTER; break;
        case COLL_LISTS_BITS:    nMask |= SWSTYLEBIT_LIST;    break;
        case COLL_REGISTER_BITS: nMask |= SWSTYLEBIT_IDX;     break;
        case COLL_EXTRA_BITS:    nMask |= SWSTYLEBIT_EXTRA;   break;
        case COLL_HTML_BITS:     nMask |= SWSTYLEBIT_HTML;    break;
        }

        if( pFmt )
        {
            ASSERT( bPhysical, "Format nicht gefunden" );

            nHelpId = pFmt->GetPoolHelpId();
            if( pFmt->GetPoolHlpFileId() != UCHAR_MAX )
                aHelpFile = *rDoc.GetDocPattern( pFmt->GetPoolHlpFileId() );
            else
                aHelpFile.Erase();

            if( RES_CONDTXTFMTCOLL == pFmt->Which() )
                nMask |= SWSTYLEBIT_CONDCOLL;
        }

        SetMask( nMask );
    }
    if( bDeleteInfo && bFillOnlyInfo )
        ::lcl_DeleteInfoStyles( nFamily, aDelArr, rDoc );
    return bRet;
}

/*--------------------------------------------------------------------
    Beschreibung:   Neues Format in der Core anlegen
 --------------------------------------------------------------------*/


void   SwDocStyleSheet::Create()
{
    switch(nFamily)
    {
        case SFX_STYLE_FAMILY_CHAR :
            pCharFmt = lcl_FindCharFmt( rDoc, aName );
            if( !pCharFmt )
                pCharFmt = rDoc.MakeCharFmt(aName,
                                            rDoc.GetDfltCharFmt());
            pCharFmt->SetAuto( FALSE );
            break;

        case SFX_STYLE_FAMILY_PARA :
            pColl = lcl_FindParaFmt( rDoc, aName );
            if( !pColl )
            {
                SwTxtFmtColl *pPar = (*rDoc.GetTxtFmtColls())[0];
                if( nMask & SWSTYLEBIT_CONDCOLL )
                    pColl = rDoc.MakeCondTxtFmtColl( aName, pPar );
                else
                    pColl = rDoc.MakeTxtFmtColl( aName, pPar );
            }
            break;

        case SFX_STYLE_FAMILY_FRAME:
            pFrmFmt = lcl_FindFrmFmt( rDoc, aName );
            if( !pFrmFmt )
                pFrmFmt = rDoc.MakeFrmFmt(aName, rDoc.GetDfltFrmFmt());
            pFrmFmt->SetAuto( FALSE );
            break;

        case SFX_STYLE_FAMILY_PAGE :
            pDesc = lcl_FindPageDesc( rDoc, aName );
            if( !pDesc )
            {
                USHORT nId = rDoc.MakePageDesc(aName);
                pDesc = &rDoc.GetPageDesc(nId);
            }
            break;

        case SFX_STYLE_FAMILY_PSEUDO:
            pNumRule = lcl_FindNumRule( rDoc, aName );
            if( !pNumRule )
            {
                //JP 05.02.99: temp Namen erzeugen, damit kein ASSERT kommt
                String sTmpNm( aName );
                if( !aName.Len() )
                    sTmpNm = rDoc.GetUniqueNumRuleName();

                SwNumRule* pRule = rDoc.GetNumRuleTbl()[
                                        rDoc.MakeNumRule( sTmpNm ) ];
                pRule->SetAutoRule( FALSE );
                if( !aName.Len() )
                    pRule->SetName( aName );
                pNumRule = pRule;
            }
            break;
    }
    bPhysical = TRUE;
    aCoreSet.ClearItem();
}

/*--------------------------------------------------------------------
    Beschreibung:   Konkrete Formate rausholen
 --------------------------------------------------------------------*/



SwCharFmt* SwDocStyleSheet::GetCharFmt()
{
    if(!bPhysical)
        FillStyleSheet( FillPhysical );
    return pCharFmt;
}


SwTxtFmtColl* SwDocStyleSheet::GetCollection()
{
    if(!bPhysical)
        FillStyleSheet( FillPhysical );
    return pColl;
}


const SwPageDesc* SwDocStyleSheet::GetPageDesc()
{
    if(!bPhysical)
        FillStyleSheet( FillPhysical );
    return pDesc;
}

const SwNumRule * SwDocStyleSheet::GetNumRule()
{
    if(!bPhysical)
        FillStyleSheet( FillPhysical );
    return pNumRule;
}

void SwDocStyleSheet::SetNumRule(const SwNumRule& rRule)
{
    DBG_ASSERT(pNumRule, "Wo ist die NumRule")
    rDoc.ChgNumRuleFmts( rRule );
}

// Namen UND Familie aus String re-generieren
// First() und Next() (s.u.) fuegen einen Kennbuchstaben an Pos.1 ein

void SwDocStyleSheet::PresetNameAndFamily(const String& rName)
{
    switch( rName.GetChar(0) )
    {
        case cPARA:     nFamily = SFX_STYLE_FAMILY_PARA; break;
        case cFRAME:    nFamily = SFX_STYLE_FAMILY_FRAME; break;
        case cPAGE:     nFamily = SFX_STYLE_FAMILY_PAGE; break;
        case cNUMRULE:  nFamily = SFX_STYLE_FAMILY_PSEUDO; break;
        default:        nFamily = SFX_STYLE_FAMILY_CHAR; break;
    }
    aName = rName;
    aName.Erase( 0, 1 );
}

/*--------------------------------------------------------------------
    Beschreibung:   Ist das Format physikalisch schon vorhanden
 --------------------------------------------------------------------*/


void SwDocStyleSheet::SetPhysical(BOOL bPhys)
{
    bPhysical = bPhys;

    if(!bPhys)
    {
        pCharFmt = 0;
        pColl    = 0;
        pFrmFmt  = 0;
        pDesc    = 0;
    }
}

SwFrmFmt* SwDocStyleSheet::GetFrmFmt()
{
    if(!bPhysical)
        FillStyleSheet( FillPhysical );
    return pFrmFmt;
}


BOOL  SwDocStyleSheet::IsUsed() const
{
    if( !bPhysical )
    {
        SwDocStyleSheet* pThis = (SwDocStyleSheet*)this;
        pThis->FillStyleSheet( FillOnlyName );
    }

    // immer noch nicht ?
    if( !bPhysical )
        return FALSE;

    const SwModify* pMod;
    switch( nFamily )
    {
    case SFX_STYLE_FAMILY_CHAR : pMod = pCharFmt;   break;
    case SFX_STYLE_FAMILY_PARA : pMod = pColl;      break;
    case SFX_STYLE_FAMILY_FRAME: pMod = pFrmFmt;    break;
    case SFX_STYLE_FAMILY_PAGE : pMod = pDesc;      break;

    case SFX_STYLE_FAMILY_PSEUDO:
            return pNumRule ? rDoc.IsUsed( *pNumRule ) : FALSE;

    default:
        ASSERT(!this, "unbekannte Style-Familie");
        return FALSE;
    }
    return rDoc.IsUsed( *pMod );
}


ULONG  SwDocStyleSheet::GetHelpId( String& rFile )
{
static String sTemplateHelpFile = String::CreateFromAscii("swrhlppi.hlp");

    USHORT nId, nPoolId;
    unsigned char nFileId = UCHAR_MAX;

    rFile = sTemplateHelpFile;

    const SwFmt* pTmpFmt = 0;
    switch( nFamily )
    {
    case SFX_STYLE_FAMILY_CHAR :
        if( !pCharFmt &&
            0 == (pCharFmt = lcl_FindCharFmt( rDoc, aName, 0, FALSE )) )
        {
            nId = rDoc.GetPoolId( aName, GET_POOLID_CHRFMT );
            return USHRT_MAX == nId ? 0 : nId;
        }
        pTmpFmt = pCharFmt;
        break;

    case SFX_STYLE_FAMILY_PARA:
        if( !pColl &&
            0 == ( pColl = lcl_FindParaFmt( rDoc, aName, 0, FALSE )) )
        {
            nId = rDoc.GetPoolId( aName, GET_POOLID_TXTCOLL );
            return USHRT_MAX == nId ? 0 : nId;
        }
        pTmpFmt = pColl;
        break;

    case SFX_STYLE_FAMILY_FRAME:
        if( !pFrmFmt &&
            0 == ( pFrmFmt = lcl_FindFrmFmt( rDoc, aName, 0, FALSE ) ) )
        {
            nId = rDoc.GetPoolId( aName, GET_POOLID_FRMFMT );
            return USHRT_MAX == nId ? 0 : nId;
        }
        pTmpFmt = pFrmFmt;
        break;

    case SFX_STYLE_FAMILY_PAGE:
        if( !pDesc &&
            0 == ( pDesc = lcl_FindPageDesc( rDoc, aName, 0, FALSE ) ) )
        {
            nId = rDoc.GetPoolId( aName, GET_POOLID_PAGEDESC );
            return USHRT_MAX == nId ? 0 : nId;
        }

        nId = pDesc->GetPoolHelpId();
        nFileId = pDesc->GetPoolHlpFileId();
        nPoolId = pDesc->GetPoolFmtId();
        break;

    case SFX_STYLE_FAMILY_PSEUDO:
        if( !pNumRule &&
            0 == ( pNumRule = lcl_FindNumRule( rDoc, aName, 0, FALSE ) ) )
        {
            nId = rDoc.GetPoolId( aName, GET_POOLID_NUMRULE );
            return USHRT_MAX == nId ? 0 : nId;
        }

        nId = pNumRule->GetPoolHelpId();
        nFileId = pNumRule->GetPoolHlpFileId();
        nPoolId = pNumRule->GetPoolFmtId();
        break;

    default:
        ASSERT(!this, "unbekannte Style-Familie");
        return 0;
    }

    if( pTmpFmt )
    {
        nId = pTmpFmt->GetPoolHelpId();
        nFileId = pTmpFmt->GetPoolHlpFileId();
        nPoolId = pTmpFmt->GetPoolFmtId();
    }

    if( UCHAR_MAX != nFileId )
    {
        const String *pTemplate = rDoc.GetDocPattern( nFileId );
        if( pTemplate )
        {
//          const String aHelpPath(MakeHelpPath(*pTemplate));
            rFile = *pTemplate;
        }
    }
    else if( !IsPoolUserFmt( nPoolId ) )
    {
        nId = nPoolId;
    }

    // weil sich der SFX so anstellt mit der HilfeId:
    if( USHRT_MAX == nId )
        nId = 0;        // entsp. keine Hilfe anzeigen

    return nId;
}


void  SwDocStyleSheet::SetHelpId( const String& r, ULONG nId )
{
    BYTE nFileId = rDoc.SetDocPattern( r );
    USHORT nHId = nId;      //!! SFX hat eigenmaechtig auf ULONG umgestellt!

    SwFmt* pTmpFmt = 0;
    switch( nFamily )
    {
    case SFX_STYLE_FAMILY_CHAR : pTmpFmt = pCharFmt;    break;
    case SFX_STYLE_FAMILY_PARA : pTmpFmt = pColl;       break;
    case SFX_STYLE_FAMILY_FRAME: pTmpFmt = pFrmFmt;     break;
    case SFX_STYLE_FAMILY_PAGE :
        ((SwPageDesc*)pDesc)->SetPoolHelpId( nHId );
        ((SwPageDesc*)pDesc)->SetPoolHlpFileId( nFileId );
        break;

    case SFX_STYLE_FAMILY_PSEUDO:
        ((SwNumRule*)pNumRule)->SetPoolHelpId( nHId );
        ((SwNumRule*)pNumRule)->SetPoolHlpFileId( nFileId );
        break;

    default:
        ASSERT(!this, "unbekannte Style-Familie");
        return ;
    }
    if( pTmpFmt )
    {
        pTmpFmt->SetPoolHelpId( nHId );
        pTmpFmt->SetPoolHlpFileId( nFileId );
    }
}


/*  */

/*--------------------------------------------------------------------
    Beschreibung:   Methoden fuer den DocStyleSheetPool
 --------------------------------------------------------------------*/

SwDocStyleSheetPool::SwDocStyleSheetPool( SwDoc& rDocument, BOOL bOrg )
    : SfxStyleSheetBasePool( rDocument.GetAttrPool() ),
    aStyleSheet( rDocument, aEmptyStr, *this, SFX_STYLE_FAMILY_CHAR, 0 ),
    rDoc( rDocument )
{
    bOrganizer = bOrg;
}

 SwDocStyleSheetPool::~SwDocStyleSheetPool()
{
}

SfxStyleSheetBase&   SwDocStyleSheetPool::Make(
        const String&   rName,
        SfxStyleFamily  eFam,
        USHORT          nMask,
        USHORT          nPos )
{
    aStyleSheet.PresetName(rName);
    aStyleSheet.PresetParent(aEmptyStr);
    aStyleSheet.PresetFollow(aEmptyStr);
    aStyleSheet.SetMask(nMask) ;
    aStyleSheet.SetFamily(eFam);
    aStyleSheet.SetPhysical(TRUE);
    aStyleSheet.Create();

    return aStyleSheet;
}


SfxStyleSheetBase*   SwDocStyleSheetPool::Create( const SfxStyleSheetBase& rOrg)
{
    ASSERT(!this , "Create im SW-Stylesheet-Pool geht nicht" );
    return NULL;
}


SfxStyleSheetBase*   SwDocStyleSheetPool::Create( const String &,
                                                SfxStyleFamily, USHORT )
{
    ASSERT( !this, "Create im SW-Stylesheet-Pool geht nicht" );
    return NULL;
}

void  SwDocStyleSheetPool::Replace( SfxStyleSheetBase& rSource,
                                            SfxStyleSheetBase& rTarget )
{
    SfxStyleFamily eFamily( rSource.GetFamily() );
    if( rSource.HasParentSupport())
    {
        const String& rParentName = rSource.GetParent();
        if( 0 != rParentName.Len() )
        {
            SfxStyleSheetBase* pParentOfNew = Find( rParentName, eFamily );
            if( pParentOfNew )
                rTarget.SetParent( rParentName );
        }
    }
    if( rSource.HasFollowSupport())
    {
        const String& rFollowName = rSource.GetFollow();
        if( 0 != rFollowName.Len() )
        {
            SfxStyleSheetBase* pFollowOfNew = Find( rFollowName, eFamily );
            if( pFollowOfNew )
                rTarget.SetFollow( rFollowName );
        }
    }

    SwImplShellAction aTmpSh( rDoc );

    BOOL bSwSrcPool = GetAppName() == rSource.GetPool().GetAppName();
    if( SFX_STYLE_FAMILY_PAGE == eFamily && bSwSrcPool )
    {
        // gesondert behandeln!!
        SwPageDesc* pDestDsc =
            (SwPageDesc*)((SwDocStyleSheet&)rTarget).GetPageDesc();
        SwPageDesc* pCpyDsc =
            (SwPageDesc*)((SwDocStyleSheet&)rSource).GetPageDesc();
        rDoc.CopyPageDesc( *pCpyDsc, *pDestDsc );
    }
    else
    {
        const SwFmt *pSourceFmt = 0;
        SwFmt *pTargetFmt = 0;
        SwPageDesc *pTargetDesc = 0;
        USHORT nPgDscPos = USHRT_MAX;
        switch( eFamily )
        {
        case SFX_STYLE_FAMILY_CHAR :
            if( bSwSrcPool )
                pSourceFmt = ((SwDocStyleSheet&)rSource).GetCharFmt();
            pTargetFmt = ((SwDocStyleSheet&)rTarget).GetCharFmt();
            break;
        case SFX_STYLE_FAMILY_PARA :
            if( bSwSrcPool )
                pSourceFmt = ((SwDocStyleSheet&)rSource).GetCollection();
            pTargetFmt = ((SwDocStyleSheet&)rTarget).GetCollection();
            break;
        case SFX_STYLE_FAMILY_FRAME:
            if( bSwSrcPool )
                pSourceFmt = ((SwDocStyleSheet&)rSource).GetFrmFmt();
            pTargetFmt = ((SwDocStyleSheet&)rTarget).GetFrmFmt();
            break;
        case SFX_STYLE_FAMILY_PAGE:
            if( bSwSrcPool )
                pSourceFmt = &((SwDocStyleSheet&)rSource).GetPageDesc()
                                ->GetMaster();
            {
                SwPageDesc *pDesc = rDoc.FindPageDescByName(
                    ((SwDocStyleSheet&)rTarget).GetPageDesc()->GetName(),
                    &nPgDscPos );

                if( pDesc )
                    pTargetFmt = &pDesc->GetMaster();
            }
            break;
        case SFX_STYLE_FAMILY_PSEUDO:
            // Eine NumRule besteht nur aus einem Item, also muss man
            // hier nichts loeschen.
            break;
        }
        if( pTargetFmt )
        {
            if( pSourceFmt )
                pTargetFmt->DelDiffs( *pSourceFmt );
            else if( USHRT_MAX != nPgDscPos )
                pTargetFmt->ResetAttr( RES_PAGEDESC, RES_FRMATR_END-1 );
            else
                pTargetFmt->ResetAllAttr();

            if( USHRT_MAX != nPgDscPos )
                rDoc.ChgPageDesc( nPgDscPos, rDoc.GetPageDesc(nPgDscPos) );
        }
        ((SwDocStyleSheet&)rTarget).SetItemSet( rSource.GetItemSet() );
    }
}

SfxStyleSheetIterator*  SwDocStyleSheetPool::CreateIterator(
                        SfxStyleFamily eFam, USHORT nMask )
{
    return new SwStyleSheetIterator( this, eFam, nMask );
}

void   SwDocStyleSheetPool::Erase( SfxStyleSheetBase* pStyle)
{
    if( !pStyle )
        return;

    BOOL bBroadcast = TRUE;
    SwImplShellAction aTmpSh( rDoc );
    const String& rName = pStyle->GetName();
    switch( pStyle->GetFamily() )
    {
    case SFX_STYLE_FAMILY_CHAR:
        {
            SwCharFmt* pFmt = lcl_FindCharFmt(rDoc, rName, 0, FALSE );
            if(pFmt)
                rDoc.DelCharFmt(pFmt);
        }
        break;
    case SFX_STYLE_FAMILY_PARA:
        {
            SwTxtFmtColl* pColl = lcl_FindParaFmt(rDoc, rName, 0, FALSE );
            if(pColl)
                rDoc.DelTxtFmtColl(pColl);
        }
        break;
    case SFX_STYLE_FAMILY_FRAME:
        {
            SwFrmFmt* pFmt = lcl_FindFrmFmt(rDoc, rName, 0, FALSE );
            if(pFmt)
                rDoc.DelFrmFmt(pFmt);
        }
        break;
    case SFX_STYLE_FAMILY_PAGE :
        {
            USHORT nPos;
            if( rDoc.FindPageDescByName( rName, &nPos ))
                rDoc.DelPageDesc( nPos );
        }
        break;

    case SFX_STYLE_FAMILY_PSEUDO:
        {
            if( !rDoc.DelNumRule( rName ) )
                // Broadcast nur versenden, wenn etwas geloescht wurde
                bBroadcast = FALSE;
        }
        break;

    default:
        ASSERT(!this, "unbekannte Style-Familie");
        bBroadcast = FALSE;
    }

    if( bBroadcast )
        Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_ERASED, *pStyle ) );
}



BOOL  SwDocStyleSheetPool::SetParent( SfxStyleFamily eFam,
                                const String &rStyle, const String &rParent )
{
    SwFmt* pFmt = 0, *pParent = 0;
    switch( eFam )
    {
    case SFX_STYLE_FAMILY_CHAR :
        if( 0 != ( pFmt = lcl_FindCharFmt( rDoc, rStyle ) ) && rParent.Len() )
            pParent = lcl_FindCharFmt(rDoc, rParent );
        break;

    case SFX_STYLE_FAMILY_PARA :
        if( 0 != ( pFmt = lcl_FindParaFmt( rDoc, rStyle ) ) && rParent.Len() )
            pParent = lcl_FindParaFmt( rDoc, rParent );
        break;

    case SFX_STYLE_FAMILY_FRAME:
        if( 0 != ( pFmt = lcl_FindFrmFmt( rDoc, rStyle ) ) && rParent.Len() )
            pParent = lcl_FindFrmFmt( rDoc, rParent );
        break;

    case SFX_STYLE_FAMILY_PAGE:
    case SFX_STYLE_FAMILY_PSEUDO:
        break;

    default:
        ASSERT(!this, "unbekannte Style-Familie");
    }

    BOOL bRet = FALSE;
    if( pFmt && pFmt->DerivedFrom() &&
        pFmt->DerivedFrom()->GetName() != rParent )
    {
        {
            SwImplShellAction aTmpSh( rDoc );
            bRet = pFmt->SetDerivedFrom( pParent );
        }

        if( bRet )
        {
            // nur fuer das Broadcasting
            aStyleSheet.PresetName( rStyle );
            aStyleSheet.PresetParent( rParent );
            if( SFX_STYLE_FAMILY_PARA == eFam )
                aStyleSheet.PresetFollow( ((SwTxtFmtColl*)pFmt)->
                        GetNextTxtFmtColl().GetName() );
            else
                aStyleSheet.PresetFollow( aEmptyStr );

            Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_MODIFIED,
                                            aStyleSheet ) );
        }
    }

    return bRet;
}

SfxStyleSheetBase* SwDocStyleSheetPool::Find( const String& rName,
                                            SfxStyleFamily eFam, USHORT n )
{
    USHORT nSMask = n;
    if( SFX_STYLE_FAMILY_PARA == eFam && rDoc.IsHTMLMode() )
    {
        // dann sind nur HTML-Vorlagen von Interesse
        if( USHRT_MAX == nSMask )
            nSMask = SWSTYLEBIT_HTML | SFXSTYLEBIT_USERDEF | SFXSTYLEBIT_USED;
        else
            nSMask &= SFXSTYLEBIT_USED | SFXSTYLEBIT_USERDEF |
                                SWSTYLEBIT_CONDCOLL | SWSTYLEBIT_HTML;
        if( !nSMask )
            nSMask = SWSTYLEBIT_HTML;
    }

    const BOOL bSearchUsed = ( n != SFXSTYLEBIT_ALL &&
                             n & SFXSTYLEBIT_USED ) ? TRUE : FALSE;
    const SwModify* pMod = 0;

    aStyleSheet.SetPhysical( FALSE );
    aStyleSheet.PresetName( rName );
    aStyleSheet.SetFamily( eFam );
    BOOL bFnd = aStyleSheet.FillStyleSheet( SwDocStyleSheet::FillOnlyName );

    if( aStyleSheet.IsPhysical() )
    {
        switch( eFam )
        {
        case SFX_STYLE_FAMILY_CHAR:
            pMod = aStyleSheet.GetCharFmt();
            break;

        case SFX_STYLE_FAMILY_PARA:
            pMod = aStyleSheet.GetCollection();
            break;

        case SFX_STYLE_FAMILY_FRAME:
            pMod = aStyleSheet.GetFrmFmt();
            break;

        case SFX_STYLE_FAMILY_PAGE:
            pMod = aStyleSheet.GetPageDesc();
            break;

        case SFX_STYLE_FAMILY_PSEUDO:
            {
                const SwNumRule* pRule = aStyleSheet.GetNumRule();
                if( pRule &&
                    !(bSearchUsed && (bOrganizer || rDoc.IsUsed(*pRule)) ) &&
                    (( nSMask & ~SFXSTYLEBIT_USED) == SFXSTYLEBIT_USERDEF
                            ? !(pRule->GetPoolFmtId() & USER_FMT)
                                // benutzte gesucht und keine gefunden
                            : bSearchUsed ))
                    bFnd = FALSE;
            }
            break;

        default:
            ASSERT(!this, "unbekannte Style-Familie");
        }
    }

    // dann noch die Maske auswerten:
    if( pMod && !(bSearchUsed && (bOrganizer || rDoc.IsUsed(*pMod)) ) )
    {
        const USHORT nId = SFX_STYLE_FAMILY_PAGE == eFam
                        ? ((SwPageDesc*)pMod)->GetPoolFmtId()
                        : ((SwFmt*)pMod)->GetPoolFmtId();

        if( ( nSMask & ~SFXSTYLEBIT_USED) == SFXSTYLEBIT_USERDEF
            ? !(nId & USER_FMT)
                // benutzte gesucht und keine gefunden
            : bSearchUsed )
            bFnd = FALSE;
    }
    return bFnd ? &aStyleSheet : 0;
}

/*  */

SwStyleSheetIterator::SwStyleSheetIterator( SwDocStyleSheetPool* pBase,
                                SfxStyleFamily eFam, USHORT n )
    : SfxStyleSheetIterator( pBase, eFam, n ),
    aIterSheet( pBase->GetDoc(), aEmptyStr, *pBase, SFX_STYLE_FAMILY_CHAR, 0 ),
    aStyleSheet( pBase->GetDoc(), aEmptyStr, *pBase, SFX_STYLE_FAMILY_CHAR, 0 )
{
    bFirstCalled = FALSE;
    nLastPos = 0;
    StartListening( *pBase );
}

 SwStyleSheetIterator::~SwStyleSheetIterator()
{
    EndListening( aIterSheet.GetPool() );
}

USHORT  SwStyleSheetIterator::Count()
{
    // Liste richtig fuellen lassen !!
    if( !bFirstCalled )
        First();
    return aLst.Count();
}

SfxStyleSheetBase*  SwStyleSheetIterator::operator[]( USHORT nIdx )
{
    // gefunden
    if( !bFirstCalled )
        First();
    aStyleSheet.PresetNameAndFamily( *aLst[ nIdx ] );
    aStyleSheet.SetPhysical( FALSE );
    aStyleSheet.FillStyleSheet( SwDocStyleSheet::FillOnlyName );

    return &aStyleSheet;
}

SfxStyleSheetBase*  SwStyleSheetIterator::First()
{
    // Alte Liste loeschen
    bFirstCalled = TRUE;
    nLastPos = 0;
    aLst.Erase();

    // aktuellen loeschen
    aIterSheet.Reset();

    SwDoc& rDoc = ((SwDocStyleSheetPool*)pBasePool)->GetDoc();
    const USHORT nSrchMask = nMask;
    const BOOL bSearchUsed = SearchUsed();

    const BOOL bOrganizer = ((SwDocStyleSheetPool*)pBasePool)->IsOrganizerMode();

    if( nSearchFamily == SFX_STYLE_FAMILY_CHAR
     || nSearchFamily == SFX_STYLE_FAMILY_ALL )
    {
        const USHORT nArrLen = rDoc.GetCharFmts()->Count();
        for( USHORT i = 0; i < nArrLen; i++ )
        {
            SwCharFmt* pFmt = (*rDoc.GetCharFmts())[ i ];
            if( pFmt->IsDefault() && pFmt != rDoc.GetDfltCharFmt() )
                continue;

            const BOOL  bUsed = bSearchUsed && (bOrganizer || rDoc.IsUsed(*pFmt));
            if( !bUsed )
            {
                // Standard ist keine Benutzervorlage #46181#
                const USHORT nId = rDoc.GetDfltCharFmt() == pFmt ?
                        RES_POOLCHR_INET_NORMAL :
                                pFmt->GetPoolFmtId();
                if( (nSrchMask & ~SFXSTYLEBIT_USED) == SFXSTYLEBIT_USERDEF
                    ? !(nId & USER_FMT)
                        // benutzte gesucht und keine gefunden
                    : bSearchUsed )
                continue;

                if( rDoc.IsHTMLMode() && !(nId & USER_FMT) &&
                    !( RES_POOLCHR_HTML_BEGIN <= nId &&
                          nId < RES_POOLCHR_HTML_END ) &&
                    RES_POOLCHR_INET_NORMAL != nId &&
                    RES_POOLCHR_INET_VISIT != nId &&
                    RES_POOLCHR_FOOTNOTE  != nId &&
                    RES_POOLCHR_ENDNOTE != nId )
                    continue;
            }

            aLst.Append( cCHAR, pFmt == rDoc.GetDfltCharFmt()
                        ? (const String&) *rDoc.GetTextNmArray()[ RES_POOLCOLL_STANDARD -
                                                RES_POOLCOLL_TEXT_BEGIN ]
                        : pFmt->GetName() );
        }

        // PoolFormate
        //
        if( nSrchMask == SFXSTYLEBIT_ALL )
        {
            if( !rDoc.IsHTMLMode() )
                AppendStyleList(rDoc.GetChrFmtNmArray(),
                                bSearchUsed, GET_POOLID_CHRFMT, cCHAR);
            else
            {
                aLst.Append( cCHAR, *rDoc.GetChrFmtNmArray()[
                        RES_POOLCHR_INET_NORMAL - RES_POOLCHR_BEGIN ] );
                aLst.Append( cCHAR, *rDoc.GetChrFmtNmArray()[
                        RES_POOLCHR_INET_VISIT - RES_POOLCHR_BEGIN ] );
                aLst.Append( cCHAR, *rDoc.GetChrFmtNmArray()[
                        RES_POOLCHR_ENDNOTE - RES_POOLCHR_BEGIN ] );
                aLst.Append( cCHAR, *rDoc.GetChrFmtNmArray()[
                        RES_POOLCHR_FOOTNOTE - RES_POOLCHR_BEGIN ] );
            }
            AppendStyleList(rDoc.GetHTMLChrFmtNmArray(),
                                bSearchUsed, GET_POOLID_CHRFMT, cCHAR);
        }
    }

    if( nSearchFamily == SFX_STYLE_FAMILY_PARA ||
        nSearchFamily == SFX_STYLE_FAMILY_ALL )
    {
        USHORT nSMask = nSrchMask;
        if( rDoc.IsHTMLMode() )
        {
            // dann sind nur HTML-Vorlagen von Interesse
            if( USHRT_MAX == nSMask )
                nSMask = SWSTYLEBIT_HTML | SFXSTYLEBIT_USERDEF |
                            SFXSTYLEBIT_USED;
            else
                nSMask &= SFXSTYLEBIT_USED | SFXSTYLEBIT_USERDEF |
                                SWSTYLEBIT_CONDCOLL | SWSTYLEBIT_HTML;
            if( !nSMask )
                nSMask = SWSTYLEBIT_HTML;
        }

        const USHORT nArrLen = rDoc.GetTxtFmtColls()->Count();
        for( USHORT i = 0; i < nArrLen; i++ )
        {
            SwTxtFmtColl* pColl = (*rDoc.GetTxtFmtColls())[ i ];

            if(pColl->IsDefault())
                continue;

            const BOOL bUsed = bOrganizer || rDoc.IsUsed(*pColl);
            if( !(bSearchUsed && bUsed ))
            {
                const USHORT nId = pColl->GetPoolFmtId();
                switch ( (nSMask & ~SFXSTYLEBIT_USED) )
                {
                case SFXSTYLEBIT_USERDEF:
                    if(!IsPoolUserFmt(nId)) continue;
                    break;
                case SWSTYLEBIT_TEXT:
                    if((nId & COLL_GET_RANGE_BITS) != COLL_TEXT_BITS) continue;
                    break;
                case SWSTYLEBIT_CHAPTER:
                    if((nId  & COLL_GET_RANGE_BITS) != COLL_DOC_BITS) continue;
                    break;
                case SWSTYLEBIT_LIST:
                    if((nId  & COLL_GET_RANGE_BITS) != COLL_LISTS_BITS) continue;
                    break;
                case SWSTYLEBIT_IDX:
                    if((nId  & COLL_GET_RANGE_BITS) != COLL_REGISTER_BITS) continue;
                    break;
                case SWSTYLEBIT_EXTRA:
                    if((nId  & COLL_GET_RANGE_BITS) != COLL_EXTRA_BITS) continue;
                    break;

                case SWSTYLEBIT_HTML | SFXSTYLEBIT_USERDEF:
                    if(IsPoolUserFmt(nId))
                        break;
                    // ansonten weiter
                case SWSTYLEBIT_HTML:
                    if( (nId  & COLL_GET_RANGE_BITS) != COLL_HTML_BITS)
                    {
                        // einige wollen wir aber auch in dieser Section sehen
                        BOOL bWeiter = TRUE;
                        switch( nId )
                        {
                        case RES_POOLCOLL_SENDADRESS:   //  --> ADDRESS
                        case RES_POOLCOLL_TABLE_HDLN:   //  --> TH
                        case RES_POOLCOLL_TABLE:        //  --> TD
                        case RES_POOLCOLL_TEXT:         //  --> P
                        case RES_POOLCOLL_HEADLINE_BASE://  --> H
                        case RES_POOLCOLL_HEADLINE1:    //  --> H1
                        case RES_POOLCOLL_HEADLINE2:    //  --> H2
                        case RES_POOLCOLL_HEADLINE3:    //  --> H3
                        case RES_POOLCOLL_HEADLINE4:    //  --> H4
                        case RES_POOLCOLL_HEADLINE5:    //  --> H5
                        case RES_POOLCOLL_HEADLINE6:    //  --> H6
                        case RES_POOLCOLL_STANDARD:     //  --> P
                        case RES_POOLCOLL_FOOTNOTE:
                        case RES_POOLCOLL_ENDNOTE:
                            bWeiter = FALSE;
                            break;
                        }
                        if( bWeiter )
                            continue;
                    }
                    break;
                case SWSTYLEBIT_CONDCOLL:
                    if( RES_CONDTXTFMTCOLL != pColl->Which() ) continue;
                    break;
                default:
                    // benutzte gesucht und keine gefunden
                    if( bSearchUsed )
                        continue;
                }
            }
            aLst.Append( cPARA, pColl->GetName() );
        }

        const BOOL bAll = nSMask == SFXSTYLEBIT_ALL;
        if ( bAll || (nSMask & ~SFXSTYLEBIT_USED) == SWSTYLEBIT_TEXT )
            AppendStyleList(rDoc.GetTextNmArray(),
                            bSearchUsed, GET_POOLID_TXTCOLL, cPARA );
        if ( bAll || (nSMask & ~SFXSTYLEBIT_USED) == SWSTYLEBIT_CHAPTER )
            AppendStyleList(rDoc.GetDocNmArray(),
                            bSearchUsed, GET_POOLID_TXTCOLL, cPARA ) ;
        if ( bAll || (nSMask & ~SFXSTYLEBIT_USED) == SWSTYLEBIT_LIST )
            AppendStyleList(rDoc.GetListsNmArray(),
                            bSearchUsed, GET_POOLID_TXTCOLL, cPARA ) ;
        if ( bAll || (nSMask & ~SFXSTYLEBIT_USED) == SWSTYLEBIT_IDX )
            AppendStyleList(rDoc.GetRegisterNmArray(),
                            bSearchUsed, GET_POOLID_TXTCOLL, cPARA ) ;
        if ( bAll || (nSMask & ~SFXSTYLEBIT_USED) == SWSTYLEBIT_EXTRA )
            AppendStyleList(rDoc.GetExtraNmArray(),
                            bSearchUsed, GET_POOLID_TXTCOLL, cPARA ) ;
        if ( bAll || (nSMask & ~SFXSTYLEBIT_USED) == SWSTYLEBIT_CONDCOLL )
        {
            if( !bSearchUsed ||
                rDoc.IsPoolTxtCollUsed( RES_POOLCOLL_TEXT ))
                aLst.Append( cPARA, *rDoc.GetTextNmArray()[
                        RES_POOLCOLL_TEXT - RES_POOLCOLL_TEXT_BEGIN ] );
        }
        if ( bAll ||
            (nSMask & ~SFXSTYLEBIT_USED) == SWSTYLEBIT_HTML ||
            (nSMask & ~SFXSTYLEBIT_USED) ==
                        (SWSTYLEBIT_HTML | SFXSTYLEBIT_USERDEF) )
        {
            AppendStyleList(rDoc.GetHTMLNmArray(),
                            bSearchUsed, GET_POOLID_TXTCOLL, cPARA ) ;
            if( !bAll )
            {
                // dann auch die, die wir mappen:
                static USHORT aPoolIds[] = {
                    RES_POOLCOLL_SENDADRESS,    //  --> ADDRESS
                    RES_POOLCOLL_TABLE_HDLN,    //  --> TH
                    RES_POOLCOLL_TABLE,     //  --> TD
                    RES_POOLCOLL_STANDARD,      //  --> P
                    RES_POOLCOLL_TEXT,          //  --> P
                    RES_POOLCOLL_HEADLINE_BASE, //  --> H
                    RES_POOLCOLL_HEADLINE1, //  --> H1
                    RES_POOLCOLL_HEADLINE2, //  --> H2
                    RES_POOLCOLL_HEADLINE3, //  --> H3
                    RES_POOLCOLL_HEADLINE4, //  --> H4
                    RES_POOLCOLL_HEADLINE5, //  --> H5
                    RES_POOLCOLL_HEADLINE6, //  --> H6
                    RES_POOLCOLL_FOOTNOTE,
                    RES_POOLCOLL_ENDNOTE,
                    0
                    };

                USHORT* pPoolIds = aPoolIds;
                String s;
                while( *pPoolIds )
                {
                    if( !bSearchUsed || rDoc.IsPoolTxtCollUsed( *pPoolIds ) )
                        aLst.Append( cPARA, rDoc.GetPoolNm( *pPoolIds, s ));
                    ++pPoolIds;
                }
            }
        }
    }

    if( nSearchFamily == SFX_STYLE_FAMILY_FRAME ||
        nSearchFamily == SFX_STYLE_FAMILY_ALL )
    {
        const USHORT nArrLen = rDoc.GetFrmFmts()->Count();
        for( USHORT i = 0; i < nArrLen; i++ )
        {
            SwFrmFmt* pFmt = (*rDoc.GetFrmFmts())[ i ];
            if(pFmt->IsDefault() || pFmt->IsAuto())
                continue;

            const USHORT nId = pFmt->GetPoolFmtId();
            BOOL bUsed = bSearchUsed && ( bOrganizer || rDoc.IsUsed(*pFmt));
            if( !bUsed )
            {
                if( (nSrchMask & ~SFXSTYLEBIT_USED) == SFXSTYLEBIT_USERDEF
                    ? !(nId & USER_FMT)
                    // benutzte gesucht und keine gefunden
                    : bSearchUsed )
                    continue;
            }

            aLst.Append( cFRAME, pFmt->GetName() );
        }

        // PoolFormate
        //
        if ( nSrchMask == SFXSTYLEBIT_ALL )
            AppendStyleList(rDoc.GetFrmFmtNmArray(),
                                    bSearchUsed, GET_POOLID_FRMFMT, cFRAME);
    }

    if( nSearchFamily == SFX_STYLE_FAMILY_PAGE ||
        nSearchFamily == SFX_STYLE_FAMILY_ALL )
    {
        const USHORT nCount = rDoc.GetPageDescCnt();
        for(USHORT i = 0; i < nCount; ++i)
        {
            const SwPageDesc& rDesc = rDoc.GetPageDesc(i);
            const USHORT nId = rDesc.GetPoolFmtId();
            BOOL bUsed = bSearchUsed && ( bOrganizer || rDoc.IsUsed(rDesc));
            if( !bUsed )
            {
                if( (nSrchMask & ~SFXSTYLEBIT_USED) == SFXSTYLEBIT_USERDEF
                    ? !(nId & USER_FMT)
                    // benutzte gesucht und keine gefunden
                    : bSearchUsed )
                    continue;
            }

            aLst.Append( cPAGE, rDesc.GetName() );
        }
        if ( nSrchMask == SFXSTYLEBIT_ALL )
            AppendStyleList(rDoc.GetPageDescNmArray(),
                            bSearchUsed, GET_POOLID_PAGEDESC, cPAGE);
    }

    if( nSearchFamily == SFX_STYLE_FAMILY_PSEUDO ||
        nSearchFamily == SFX_STYLE_FAMILY_ALL )
    {
        const SwNumRuleTbl& rNumTbl = rDoc.GetNumRuleTbl();
        for(USHORT i = 0; i < rNumTbl.Count(); ++i)
        {
            const SwNumRule& rRule = *rNumTbl[ i ];
            if( !rRule.IsAutoRule() )
            {
                BOOL bUsed = bSearchUsed && ( bOrganizer || rDoc.IsUsed(rRule) );
                if( !bUsed )
                {
                    if( (nSrchMask & ~SFXSTYLEBIT_USED) == SFXSTYLEBIT_USERDEF
                        ? !(rRule.GetPoolFmtId() & USER_FMT)
                        // benutzte gesucht und keine gefunden
                        : bSearchUsed )
                        continue;
                }

                aLst.Append( cNUMRULE, rRule.GetName() );
            }
        }
        if ( nSrchMask == SFXSTYLEBIT_ALL )
            AppendStyleList(rDoc.GetNumRuleNmArray(),
                            bSearchUsed, GET_POOLID_NUMRULE, cNUMRULE);
    }

    if(aLst.Count() > 0)
    {
        nLastPos = USHRT_MAX;
        return Next();
    }
    return 0;
}

SfxStyleSheetBase*  SwStyleSheetIterator::Next()
{
    nLastPos++;
    if(aLst.Count() > 0 && nLastPos < aLst.Count())
    {
        aIterSheet.PresetNameAndFamily(*aLst[nLastPos]);
        aIterSheet.SetPhysical( FALSE );
        aIterSheet.SetMask( nMask );
        if(aIterSheet.pSet)
        {
            aIterSheet.pSet->ClearItem(0);
            aIterSheet.pSet= 0;
        }
        return &aIterSheet;
    }
    return 0;
}

#ifndef ENABLEUNICODE
SfxStyleSheetBase*  SwStyleSheetIterator::Find( const String& rName )
#else
SfxStyleSheetBase*  SwStyleSheetIterator::Find( const UniString& rName )
#endif
{
    // suchen
    if( !bFirstCalled )
        First();

    nLastPos = lcl_FindName( aLst, nSearchFamily, rName );
    if( USHRT_MAX != nLastPos )
    {
        // gefunden
        aStyleSheet.PresetNameAndFamily(*aLst[nLastPos]);
        // neuer Name gesetzt, also bestimme seine Daten
        aStyleSheet.FillStyleSheet( SwDocStyleSheet::FillOnlyName );
        if( !aStyleSheet.IsPhysical() )
            aStyleSheet.SetPhysical( FALSE );

        return &aStyleSheet;
    }
    return 0;
}

void SwStyleSheetIterator::AppendStyleList(const SvStringsDtor& rList,
                                            BOOL    bTestUsed,
                                            USHORT nSection, char cType )
{
    if( bTestUsed )
    {
        SwDoc& rDoc = ((SwDocStyleSheetPool*)pBasePool)->GetDoc();
        for ( USHORT i=0; i < rList.Count(); ++i )
        {
            BOOL bUsed = FALSE;
            USHORT nId = rDoc.GetPoolId(*rList[i], (SwGetPoolIdFromName)nSection);
            switch ( nSection )
            {
                case GET_POOLID_TXTCOLL:
                        bUsed = rDoc.IsPoolTxtCollUsed( nId );
                        break;
                case GET_POOLID_CHRFMT:
                        bUsed = rDoc.IsPoolFmtUsed( nId );
                        break;
                case GET_POOLID_FRMFMT:
                        bUsed = rDoc.IsPoolFmtUsed( nId );
                case GET_POOLID_PAGEDESC:
                        bUsed = rDoc.IsPoolPageDescUsed( nId );
                        break;
                default:
                    ASSERT( !this, "unknown PoolFmt-Id" );
            }
            if ( bUsed )
                aLst.Append( cType, *rList[i] );
        }
    }
    else
        for ( USHORT i=0; i < rList.Count(); ++i )
            aLst.Append( cType, *rList[i] );
}

void  SwStyleSheetIterator::Notify( SfxBroadcaster&, const SfxHint& rHint )
{
    // suchen und aus der Anzeige-Liste entfernen !!
    if( rHint.ISA( SfxStyleSheetHint ) &&
        SFX_STYLESHEET_ERASED == ((SfxStyleSheetHint&) rHint).GetHint() )
    {
        SfxStyleSheetBase* pStyle = ((SfxStyleSheetHint&)rHint).GetStyleSheet();

        USHORT nTmpPos = lcl_FindName( aLst, pStyle->GetFamily(),
                                        pStyle->GetName() );
        if( nTmpPos < aLst.Count() )
            aLst.DeleteAndDestroy( nTmpPos );
    }
}

/*------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.157  2000/09/18 16:05:11  willem.vandorp
    OpenOffice header added.

    Revision 1.156  2000/06/28 13:04:04  jp
    FillStyleSheet dont create always a new Style

    Revision 1.155  2000/06/14 13:01:00  jp
    Bug #71738#: Changes on the templatename must be dispatch

    Revision 1.154  2000/04/20 12:49:35  os
    GetName() returns String&

    Revision 1.153  2000/04/18 15:23:06  os
    UNICODE

    Revision 1.152  2000/04/11 08:01:31  os
    UNICODE

    Revision 1.151  2000/03/10 14:10:27  jp
    Bug #74104#: SetItemSet - remove Dialog-Flag from the NumRules

    Revision 1.150  2000/02/11 14:42:51  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.149  2000/01/18 17:15:14  jp
    Bug #72023#: dont create CurrShell-Object with 0-Pointer

    Revision 1.148  1999/11/15 14:22:25  jp
    Bug #69833#: GetDescription - ignore hint Para-Bckgrnd-destination

    Revision 1.147  1999/02/05 16:43:58  JP
    Task #61467#/#61014#: neu FindPageDescByName


------------------------------------------------------------------------*/


diff --git a/sw/source/ui/app/error.src b/sw/source/ui/app/error.src
new file mode 100644
index 0000000..0d30d1e
--- /dev/null
+++ b/sw/source/ui/app/error.src
@@ -0,0 +1,1265 @@
/*************************************************************************
 *
 *  $RCSfile: error.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:31 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#define __RSC


 //#include <tools/errcode.hxx>
#include "globals.hrc"
#include "app.hrc"
#include "swerror.h"
#include "comcore.hrc" // MS:   Warum gibst auf der Core-Seite
 //         jetzt Resourcen

/*--------------------------------------------------------------------
    Beschreibung:   Strings
 --------------------------------------------------------------------*/

String STR_COMCORE_READERROR
{
    TEXT = "Lesefehler" ;
    TEXT [ English ] = "Read Error" ;
    TEXT [ norwegian ] = "Lesefeil" ;
    TEXT [ italian ] = "Errore di lettura" ;
    TEXT [ portuguese_brazilian ] = "Erro de Leitura" ;
    TEXT [ portuguese ] = "Erro de leitura" ;
    TEXT [ finnish ] = "Lukuvirhe" ;
    TEXT [ danish ] = "Læsefejl" ;
    TEXT [ french ] = "Erreur de lecture" ;
    TEXT [ swedish ] = "Läsfel" ;
    TEXT [ dutch ] = "Leesfout" ;
    TEXT [ spanish ] = "Error de lectura" ;
    TEXT [ english_us ] = "Read Error" ;
    TEXT[ chinese_simplified ] = "¶ÁÎļþʱ·¢Éú´íÎó";
    TEXT[ russian ] = "Îøèáêà ïðè ÷òåíèè";
    TEXT[ polish ] = "B³¹d odczytu";
    TEXT[ japanese ] = "“ǂݎæ‚è´×°";
    TEXT[ chinese_traditional ] = "ŪÀɮ׮ɵo¥Í¿ù»~";
    TEXT[ arabic ] = "ÍÏË ÎØÃ ÃËäÇÁ ÇáÞÑÇÁÉ";
    TEXT[ greek ] = "ÓöÜëìá áíÜãíùóçò";
    TEXT[ korean ] = "Àб⠿À·ù";
    TEXT[ turkish ] = "Okuma hatasý";
    TEXT[ language_user1 ] = " ";
};
String STR_COMCORE_CANT_SHOW
{
    TEXT = "Grafik nicht darstellbar." ;
    TEXT [ English ] = "Graphic cannot be displayed." ;
    TEXT [ norwegian ] = "Graphic cannot be displayed." ;
    TEXT [ italian ] = "L'immagine non è visualizzabile" ;
    TEXT [ portuguese_brazilian ] = "Graphic cannot be displayed." ;
    TEXT [ portuguese ] = "Impossível apresentar imagem." ;
    TEXT [ french ] = "Impossible d'afficher l'image !" ;
    TEXT [ dutch ] = "Afbeelding kan niet worden weergegeven" ;
    TEXT [ spanish ] = "No es posible presentar la imagen." ;
    TEXT [ danish ] = "Grafik kan ikke vises." ;
    TEXT [ swedish ] = "Grafik kan inte visas." ;
    TEXT [ finnish ] = "Graphic cannot be displayed." ;
    TEXT [ english_us ] = "Graphic cannot be displayed." ;
    TEXT[ chinese_simplified ] = "ÎÞ·¨ÏÔʾͼÐÎ";
    TEXT[ russian ] = "Ðèñóíîê ïðåäñòàâèòü íåâîçìîæíî";
    TEXT[ polish ] = "Grafiki nie mo¿na wyœwietliæ.";
    TEXT[ japanese ] = "¸Þ×̨¯¸‚ð•\\ަ‚Å‚«‚Ü‚¹‚ñB";
    TEXT[ chinese_traditional ] = "µLªkÅã¥Ü¹Ï¤ù";
    TEXT[ arabic ] = "áÇ íãßä ÚÑÖ ÇáÑÓæãÇÊ.";
    TEXT[ greek ] = "Äåí åßíáé äõíáôÞ ç ðáñïõóßáóç ôïõ ãñáöéêïý.";
    TEXT[ korean ] = "±×·¡ÇÈÀÌ Ç¥½ÃµÉ ¼ö ¾ø½À´Ï´Ù.";
    TEXT[ turkish ] = "Grafik görüntülenemiyor.";
    TEXT[ language_user1 ] = " ";
};
/*--------------------------------------------------------------------
    Beschreibung:   Boxes
 --------------------------------------------------------------------*/
InfoBox ERR_CLPBRD_WRITE
{
    MESSAGE = "Fehler beim Kopieren in die Zwischenablage." ;
    MESSAGE [ English ] = "Error while copying into the clipboard." ;
    MESSAGE [ norwegian ] = "Feil ved kopiering  til utklippstavlen." ;
    MESSAGE [ italian ] = "Errore durante la copia negli appunti" ;
    MESSAGE [ portuguese_brazilian ] = "Erro durante cópia para o clipboard." ;
    MESSAGE [ portuguese ] = "Erro ao copiar para a Área de Transferência." ;
    MESSAGE [ finnish ] = "Virhe kopioitaessa leikepöydälle." ;
    MESSAGE [ danish ] = "Fejl under kopiering til udskriftsholderen." ;
    MESSAGE [ french ] = "Erreur lors de la copie vers le presse-papiers." ;
    MESSAGE [ swedish ] = "Fel vid kopiering till urklippet." ;
    MESSAGE [ dutch ] = "Fout bij kopiëren naar Klembord." ;
    MESSAGE [ spanish ] = "Error al copiar al portapapeles." ;
    MESSAGE [ english_us ] = "Error while copying to the clipboard." ;
    MESSAGE[ chinese_simplified ] = "ÔÚ¸´ÖÆÊý¾Ýµ½¼ôÌù°åʱ·¢Éú´íÎó¡£";
    MESSAGE[ russian ] = "Îøèáêà ïðè êîïèðîâàíèè â áóôåð îáìåíà.";
    MESSAGE[ polish ] = "B³¹d podczas kopiowania do schowka.";
    MESSAGE[ japanese ] = "¸Ø¯ÌßÎÞ°ÄނɺËß°’†‚É´×°”­¶";
    MESSAGE[ chinese_traditional ] = "½Æ»s¸ê®Æ¨ì°Å¶Kï®Éµo¥Í¿ù»~¡C";
    MESSAGE[ arabic ] = "ÍÏË ÎØÃ ÃËäÇÁ ÇáäÓÎ Åáì ÇáÍÇÝÙÉ.";
    MESSAGE[ greek ] = "ÓöÜëìá êáôÜ ôçí áíôéãñáöÞ óôï clipboard.";
    MESSAGE[ korean ] = "Ŭ¸³º¸µå¿¡ º¹»ç Áß ¿À·ù.";
    MESSAGE[ turkish ] = "Panoya kopyalama hatasý.";
    MESSAGE[ language_user1 ] = " ";
};
InfoBox ERR_CLPBRD_READ
{
    MESSAGE = "Fehler beim Lesen aus der Zwischenablage." ;
    MESSAGE [ English ] = "Error while reading from the clipboard." ;
    MESSAGE [ norwegian ] = "Feil ved lesing fra utklippstavlen." ;
    MESSAGE [ italian ] = "Errore durante la lettura dagli appunti" ;
    MESSAGE [ portuguese_brazilian ] = "Erro durante leitura do clipboard." ;
    MESSAGE [ portuguese ] = "Erro durante a leitura da Área de Transferência." ;
    MESSAGE [ finnish ] = "Virhe luettaessa leikepöydältä." ;
    MESSAGE [ danish ] = "Fejl under læsning fra udskriftsholderen." ;
    MESSAGE [ french ] = "Erreur lors de la lecture du presse-papiers." ;
    MESSAGE [ swedish ] = "Fel vid läsning ur urklippet." ;
    MESSAGE [ dutch ] = "Fout bij lezen van Klembord." ;
    MESSAGE [ spanish ] = "Error al leer del portapapeles." ;
    MESSAGE [ english_us ] = "Error reading from the clipboard." ;
    MESSAGE[ chinese_simplified ] = "ÔÚ¶ÁÈ¡¼ôÌù°åʱ·¢Éú´íÎó¡£";
    MESSAGE[ russian ] = "Îøèáêà ïðè ÷òåíèè èç áóôåðà îáìåíà.";
    MESSAGE[ polish ] = "B³¹d odczytu ze schowka.";
    MESSAGE[ japanese ] = "¸Ø¯ÌßÎÞ°Äނ©‚ç‚̓ǂݎæ‚è´×°";
    MESSAGE[ chinese_traditional ] = "¦bŪ¨ú°Å¶Kï®Éµo¥Í¿ù»~¡C";
    MESSAGE[ arabic ] = "ÍÏË ÎØÃ ÃËäÇÁ ÇáÞÑÇÁÉ ãä ÇáÍÇÝÙÉ.";
    MESSAGE[ language_user1 ] = " ";
    MESSAGE[ greek ] = "ÓöÜëìá êáôÜ ôçí áíÜãíùóç áðü ôï Clipboard.";
    MESSAGE[ korean ] = "Ŭ¸³º¸µå·ÎºÎÅÍ Àб⠿À·ù.";
    MESSAGE[ turkish ] = "Panodan okuma hatasý.";
};


#define ERR_CODE( class, err )  (class | (err - ERROR_SW_BASE))
#define WARN_CODE( class, err ) (class | ( err - WARN_SW_BASE))

Resource RID_SW_ERRHDL
{
     // Import-Errors
    String ERR_CODE ( ERRCODE_CLASS_READ , ERR_SWG_FILE_FORMAT_ERROR )
    {
        TEXT = "Formatfehler in der Datei entdeckt" ;
        TEXT [ English ] = "File format error" ;
        TEXT [ norwegian ] = "Feil filformat format error" ;
        TEXT [ italian ] = "Errore nel formato del file" ;
        TEXT [ portuguese_brazilian ] = "Erro no formato do arquivo" ;
        TEXT [ portuguese ] = "Encontrado erro de formato no ficheiro" ;
        TEXT [ finnish ] = "Tiedostomuodon virhe" ;
        TEXT [ danish ] = "Opdaget formatfejl i filen" ;
        TEXT [ french ] = "Erreur de format de fichier" ;
        TEXT [ swedish ] = "Formatfel upptäckt i filen" ;
        TEXT [ dutch ] = "Formaatfout ontdekt in het bestand" ;
        TEXT [ spanish ] = "Se ha descubierto un error de formato en el archivo" ;
        TEXT [ english_us ] = "File format error found" ;
        TEXT[ chinese_simplified ] = "·¢ÏÖÁËÎļþ¸ñʽ´íÎó";
        TEXT[ russian ] = "Îáíàðóæåíà îøèáêà â ôîðìàòå ôàéëà";
        TEXT[ polish ] = "Znaleziono b³¹d formatu w pliku";
        TEXT[ japanese ] = "̧²Ù‚ɏ‘Ž®´×°‚ªŒ©‚‚©‚è‚Ü‚µ‚½B";
        TEXT[ chinese_traditional ] = "µo²{¤FÀɮ׮榡¿ù»~";
        TEXT[ arabic ] = "Êã ÇßÊÔÇÝ ÎØÃ ÊäÓíÞ Ýí ÇáãáÝ";
        TEXT[ greek ] = "ÂñÝèçêå óöÜëìá äéáìüñöùóçò óôï áñ÷åßï";
        TEXT[ korean ] = "ÆÄÀÏ ¼­½Ä ¿¡·¯°¡ ¹ß°ßµÇ¾ú½À´Ï´Ù.";
        TEXT[ turkish ] = "Dosya format hatasý bulundu";
        TEXT[ language_user1 ] = " ";
    };
    String ERR_CODE ( ERRCODE_CLASS_READ , ERR_SWG_READ_ERROR )
    {
        TEXT = "Fehler beim Lesen der Datei " ;
        TEXT [ English ] = "Error in reading file " ;
        TEXT [ norwegian ] = "Feil ved lesing av fil " ;
        TEXT [ italian ] = "Errore durante la lettura del file " ;
        TEXT [ portuguese_brazilian ] = "Erro na leitura de arquivo" ;
        TEXT [ portuguese ] = "Erro na leitura do ficheiro " ;
        TEXT [ finnish ] = "Virhe luettaessa tiedostoa " ;
        TEXT [ danish ] = "Fejl under læsning af filen " ;
        TEXT [ french ] = "Erreur de lecture du fichier " ;
        TEXT [ swedish ] = "Fel vid läsning av fil " ;
        TEXT [ dutch ] = "Fout bij lezen van het bestand  " ;
        TEXT [ spanish ] = "Error al leer el archivo " ;
        TEXT [ english_us ] = "Error reading file " ;
        TEXT[ chinese_simplified ] = "ÔÚ¶ÁÎļþʱ·¢Éú´íÎó ";
        TEXT[ russian ] = "Îøèáêà ïðè ÷òåíèè ôàéëà   ";
        TEXT[ polish ] = "B³¹d odczytu pliku ";
        TEXT[ japanese ] = "̧²Ù‚̓ǂݎæ‚è´×° ";
        TEXT[ chinese_traditional ] = "ŪÀɮ׮ɵo¥Í¿ù»~ ";
        TEXT[ arabic ] = "ÍÏË ÎØÃ ÃËäÇÁ ÞÑÇÁÉ ÇáãáÝ ";
        TEXT[ greek ] = "ÓöÜëìá êáôÜ ôçí áíÜãíùóç ôïõ áñ÷åßïõ ";
        TEXT[ korean ] = "ÆÄÀÏ Àб⠿À·ù ";
        TEXT[ turkish ] = "Dosya okuma hatasý ";
        TEXT[ language_user1 ] = " ";
    };
    String ERR_CODE ( ERRCODE_CLASS_READ , ERR_SW6_INPUT_FILE )
    {
        TEXT = "Fehler in der Eingabedatei" ;
        TEXT [ English ] = "Input file error" ;
        TEXT [ norwegian ] = "Feil i Innlesingsfil" ;
        TEXT [ italian ] = "Errore nel file di input" ;
        TEXT [ portuguese_brazilian ] = "Erro no arquivo de entrada" ;
        TEXT [ portuguese ] = "Erro no ficheiro de entrada" ;
        TEXT [ finnish ] = "Syöttötiedoston virhe" ;
        TEXT [ danish ] = "Fejl i inputfilen" ;
        TEXT [ french ] = "Erreur dans le fichier de saisie" ;
        TEXT [ swedish ] = "Fel på inmatningsfilen" ;
        TEXT [ dutch ] = "Fout in invoerbestand" ;
        TEXT [ spanish ] = "Error en el archivo de entrada" ;
        TEXT [ english_us ] = "Input file error" ;
        TEXT[ chinese_simplified ] = "ÊäÈëµÄÎļþº¬ÓдíÎó";
        TEXT[ russian ] = "Îøèáêà â ôàéëå ââîäà";
        TEXT[ polish ] = "B³¹d w pliku wejœciowym";
        TEXT[ japanese ] = "“ü—Í̧²Ù‚Ì’†‚É´×°";
        TEXT[ chinese_traditional ] = "¿é¤JªºÀÉ®×§t¦³¿ù»~";
        TEXT[ arabic ] = "ÍÏË ÎØÃ Ýí ãáÝ ÇáÅÏÎÇá";
        TEXT[ greek ] = "ÓöÜëìá óôï áñ÷åßï åéóáãùãÞò";
        TEXT[ korean ] = "ÆÄÀÏ »ðÀÔ ¿À·ù";
        TEXT[ turkish ] = "Girdi dosyasýnda hata";
        TEXT[ language_user1 ] = " ";
    };
    String ERR_CODE ( ERRCODE_CLASS_READ , ERR_SW6_NOWRITER_FILE )
    {
        TEXT = "Die Datei ist keine StarWriter-Datei" ;
        TEXT [ English ] = "This isn't a StarWriter file" ;
        TEXT [ norwegian ] = "Dette er ikke en Star Writer fil" ;
        TEXT [ italian ] = "Questo non è un file di StarOffice Writer" ;
        TEXT [ portuguese_brazilian ] = "Este não é um arquivo do StarOffice Writer" ;
        TEXT [ portuguese ] = "Este não é um ficheiro do StarOffice Writer" ;
        TEXT [ finnish ] = "Tämä ei ole StarWriter-tiedosto" ;
        TEXT [ danish ] = "Filen er ingen StarOffice Writer-fil" ;
        TEXT [ french ] = "Ceci n'est pas un fichier StarOffice Writer" ;
        TEXT [ swedish ] = "Detta är inte en StarOffice Writer-fil" ;
        TEXT [ dutch ] = "Dit bestand is geen StarOffice Writer-bestand" ;
        TEXT [ spanish ] = "El archivo no es uno de StarOffice Writer" ;
        TEXT [ english_us ] = "This is not a StarOffice Writer file" ;
        TEXT[ chinese_simplified ] = "Õâ²»ÊÇÒ»¸ö StarOffice Writer Îļþ";
        TEXT[ russian ] = "Ýòîò ôàéë íå ÿâëÿåòñÿ ôàéëîì StarOffice Writer";
        TEXT[ polish ] = "Ten plik nie jest plikiem StarOffice Writer";
        TEXT[ japanese ] = "‚±‚ê‚ÍStarOffice Writer‚Ì̧²Ù‚ł͂ ‚è‚Ü‚¹‚ñB";
        TEXT[ chinese_traditional ] = "³o¤£¬O¤@­Ó StarOffice Writer ÀÉ®×";
        TEXT[ arabic ] = "åÐÇ ÇáãáÝ áíÓ ãáÝ StarOffice Writer";
        TEXT[ greek ] = "Ôï áñ÷åßï áõôü äåí åßíáé áñ÷åßï ôïõ StarOffice Writer";
        TEXT[ korean ] = "ÀÌ ÆÄÀÏÀº  StarOffice Writer ÆÄÀÏÀÌ ¾Æ´Õ´Ï´Ù.";
        TEXT[ turkish ] = "Bu dosya StarOffice Writer dosyasý deðil";
        TEXT[ language_user1 ] = " ";
    };
    String ERR_CODE ( ERRCODE_CLASS_READ , ERR_SW6_UNEXPECTED_EOF )
    {
        TEXT = "Unerwartetes Dateiende" ;
        TEXT [ English ] = "Unexpected end of file" ;
        TEXT [ norwegian ] = "Uventet slutt på fil" ;
        TEXT [ italian ] = "Fine inattesa del file" ;
        TEXT [ portuguese_brazilian ] = "Fim de arquivo não esperado" ;
        TEXT [ portuguese ] = "Fim de ficheiro inesperado" ;
        TEXT [ finnish ] = "Tiedosto loppui kesken" ;
        TEXT [ danish ] = "Uventet filafslutning" ;
        TEXT [ french ] = "Fin de fichier imprévue" ;
        TEXT [ swedish ] = "Oväntat filslut" ;
        TEXT [ dutch ] = "Onverwacht bestandeinde" ;
        TEXT [ spanish ] = "Fin inesperado de archivo" ;
        TEXT [ english_us ] = "Unexpected end of file" ;
        TEXT[ chinese_simplified ] = "ÒâÍâµÄÎļþ½áβ";
        TEXT[ russian ] = "Íåîæèäàííûé êîíåö ôàéëà";
        TEXT[ polish ] = "Nieoczekiwany koniec pliku";
        TEXT[ japanese ] = "•s“K“–‚Ȩ̀²Ù––";
        TEXT[ chinese_traditional ] = "·N¥~ªºÀÉ®×µ²§À";
        TEXT[ arabic ] = "äåÇíÉ ÛíÑ ãÊæÞÚÉ ááãáÝ";
        TEXT[ greek ] = "Áðñïóäüêçôï ôÝëïò áñ÷åßïõ";
        TEXT[ korean ] = "ÆÄÀÏÀÇ ³¡ÀÌ À߸øµÇ¾ú½À´Ï´Ù.";
        TEXT[ turkish ] = "Beklenmeyen dosya sonu";
        TEXT[ language_user1 ] = " ";
    };
    String ERR_CODE ( ERRCODE_CLASS_READ , ERR_SW6_PASSWD )
    {
        /* ### ACHTUNG: Neuer Text in Resource? Passworte werden nicht unterstützt : Passworte werden nicht unterst³tzt */
        TEXT = "Passworte werden nicht unterstützt" ;
        TEXT [ English ] = "Files with passwords are not supported" ;
        TEXT [ norwegian ] = "Passordbeskyttet filer er ikke tilgjengelige" ;
        TEXT [ italian ] = "Le password non sono supportate" ;
        TEXT [ portuguese_brazilian ] = "Arquivos com senhas não s o comportados" ;
        TEXT [ portuguese ] = "As senhas não têm suporte" ;
        TEXT [ finnish ] = "Salasanalla suojattuja tiedostoja ei voi käsitellä" ;
        TEXT [ danish ] = "Adgangskoder understøttes ikke" ;
        TEXT [ french ] = "Les mots de passe ne sont pas supportés" ;
        TEXT [ swedish ] = "Lösenord stöds ej" ;
        TEXT [ dutch ] = "Wachtwoorden worden niet ondersteund" ;
        TEXT [ spanish ] = "Las contraseñas no son soportadas" ;
        TEXT [ english_us ] = "Passwords protected files are not supported" ;
        TEXT[ chinese_simplified ] = "²»Ö§³Ö¿ÚÁî";
        TEXT[ russian ] = "Ïàðîëè íå ïîääåðæèâàþòñÿ";
        TEXT[ polish ] = "Has³a nie bêd¹ obs³ugiwane";
        TEXT[ japanese ] = "Ê߽ܰÄނª»Î߰Ă³‚ê‚Ä‚¢‚Ü‚¹‚ñ";
        TEXT[ chinese_traditional ] = "¤£¤ä´©±K½X";
        TEXT[ arabic ] = "ßáãÇÊ ÇáÓÑ ÛíÑ ãÚÊãÏÉ";
        TEXT[ greek ] = "Äåí õðïóôçñßæåôáé ç ëåéôïõñãßá êùäéêïý ðñüóâáóçò";
        TEXT[ korean ] = "ÆÄÀÏ º¸È£ ÆÐ½º¿öµå°¡ Áö¿øµÇÁö ¾Ê½À´Ï´Ù.";
        TEXT[ turkish ] = "Þifre kullanýmý desteklenmiyor";
        TEXT[ language_user1 ] = " ";
    };
    String ERR_CODE ( ERRCODE_CLASS_READ , ERR_WW6_NO_WW6_FILE_ERR )
    {
        TEXT = "Die Datei ist keine WinWord6-Datei" ;
        TEXT [ English ] = "This isn't a WinWord6 file" ;
        TEXT [ norwegian ] = "Dette er ikke en WinWord6 fil" ;
        TEXT [ italian ] = "Questo non è un file di WinWord6" ;
        TEXT [ portuguese_brazilian ] = "Este não é um arquivo do WinWord6" ;
        TEXT [ portuguese ] = "Este não é um ficheiro do WinWord6" ;
        TEXT [ finnish ] = "Tämä ei ole WinWord6-tiedosto" ;
        TEXT [ danish ] = "Filen er ingen WinWord6-fil" ;
        TEXT [ french ] = "Ceci n'est pas un fichier WinWord6" ;
        TEXT [ swedish ] = "Detta är inte en WinWord6-fil" ;
        TEXT [ dutch ] = "Dit bestand is geen WinWord6-bestand" ;
        TEXT [ spanish ] = "El archivo no es uno de WinWord6" ;
        TEXT [ english_us ] = "This is not a WinWord6 file" ;
        TEXT[ chinese_simplified ] = "Õâ²»ÊÇÒ»¸ö WinWord6 Îļþ";
        TEXT[ russian ] = "Ýòîò ôàéë íå ÿâëÿåòñÿ ôàéëîì WinWord6";
        TEXT[ polish ] = "Ten plik nie jest plikiem WinWord6";
        TEXT[ japanese ] = "‚±‚ê‚Í WinWord6‚Ì̧²Ù‚ł͂ ‚è‚Ü‚¹‚ñ";
        TEXT[ chinese_traditional ] = "³o¤£¬O¤@­Ó WinWord6 ÀÉ®×";
        TEXT[ arabic ] = "åÐÇ ÇáãáÝ áíÓ ãáÝ WinWord6";
        TEXT[ greek ] = "Ôï áñ÷åßï áõôü äåí åßíáé áñ÷åßï ôïõ WinWord6";
        TEXT[ korean ] = "WinWord6 ÆÄÀÏÀÌ ¾Æ´Õ´Ï´Ù.";
        TEXT[ turkish ] = "Bu dosya WinWord6 dosyasý deðil";
        TEXT[ language_user1 ] = " ";
    };
    String ERR_CODE ( ERRCODE_CLASS_READ , ERR_WW6_FASTSAVE_ERR )
    {
        /* ### ACHTUNG: Neuer Text in Resource? Diese Datei wurde mit der WinWord-Option 'Schnellspeichern' gespeichert. Bitte schalten Sie in WinWord die Option 'Schnellspeichern zulassen' aus und speichern sie die Datei erneut mit WinWord : Diese Datei wurde mit der WinWord-Option ''Schnellspeichern'' gespeichert. Bitte schalten Sie in WinWord die Option ''Schnellspeichern zulassen'' aus und speichern sie die Datei erneut mit WinWord */
        /* ### ACHTUNG: Neuer Text in Resource? Diese Datei wurde mit der WinWord-Option 'Schnellspeichern' gespeichert. Bitte schalten Sie in WinWord die Option 'Schnellspeichern zulassen' aus und speichern sie die Datei erneut mit WinWord : Diese Datei wurde mit der WinWord-Option ''Schnellspeichern'' gespeichert. Bitte schalten Sie in WinWord die Option ''Schnellspeichern zulassen'' aus und speichern sie die Datei erneut mit WinWord */
        /* ### ACHTUNG: Neuer Text in Resource? Diese Datei wurde mit der WinWord-Option 'Schnellspeichern' gespeichert. Bitte schalten Sie in WinWord die Option 'Schnellspeichern zulassen' aus und speichern sie die Datei erneut mit WinWord : Diese Datei wurde mit der WinWord-Option ''Schnellspeichern'' gespeichert. Bitte schalten Sie in WinWord die Option ''Schnellspeichern zulassen'' aus und speichern sie die Datei erneut mit WinWord */
        /* ### ACHTUNG: Neuer Text in Resource? Diese Datei wurde mit der WinWord-Option 'Schnellspeichern' gespeichert. Bitte schalten Sie in WinWord die Option 'Schnellspeichern zulassen' aus und speichern sie die Datei erneut mit WinWord : Diese Datei wurde mit der WinWord-Option ''Schnellspeichern'' gespeichert. Bitte schalten Sie in WinWord die Option ''Schnellspeichern zulassen'' aus und speichern sie die Datei erneut mit WinWord */
        TEXT = "Diese Datei wurde mit der WinWord-Option 'Schnellspeichern' gespeichert. Bitte schalten Sie in WinWord die Option 'Schnellspeichern zulassen' aus und speichern sie die Datei erneut mit WinWord" ;
        TEXT [ English ] = "This file is stored with the WinWord-Option 'fastsave'. Please disable the WinWord option 'Allow Fast Saves' and use WinWord to save the file again" ;
        TEXT [ norwegian ] = "Denne filen er lagret med alternativet til WinWord 'hurtiglagre'. Sperr WinWord alternativet ' Tillat Hurtige Lagringer' og bruk WinWord for å lagre filen igjen" ;
        TEXT [ italian ] = "Questo file è stato salvato con l'opzione di Winword 'salvataggio veloce'. Disabilitate l'opzione di WinWord 'Salvataggio veloce' e utilizzate WinWord per salvare di nuovo il file." ;
        TEXT [ portuguese_brazilian ] = "Este arquivo foi armazenado com a opção do  WinWord 'fastsave'. Por favor desative a opção do WinWord 'Allow Fast Saves' e utilize o WinWord para gravar novamente o arquivo" ;
        TEXT [ portuguese ] = "Este ficheiro foi guardado com a opção do WinWord \"Guardar rápido\". Desactive a opção do WinWord \"Permitir Guardar rápido\" e guarde novamente o ficheiro em WinWord" ;
        TEXT [ finnish ] = "Tämä tiedosto on tallennettu käyttäen WinWordin pikatallennusta. Poista pikatallennus käytöstä WinWordissa ja tallennatiedosto uudelleen" ;
        TEXT [ danish ] = "Denne fil er blevet gemt med WinWord-indstillingen 'Gem hurtigt'. Deaktiver venligst indstillingen 'Gem hutigt' og gem filen igen med WinWord." ;
        TEXT [ french ] = "Ce fichier a été enregistré à l'aide de l'option 'Enregistrement rapide' de WinWord. Veuillez désactiver cette option et utiliser WinWord pour enregistrer à nouveau le fichier." ;
        TEXT [ swedish ] = "Denna fil är sparad med WinWord-alternativet 'snabbspara'. Stäng av WinWord-alternativet 'Tillåt snabbspara' och spara filen med WinWord igen" ;
        TEXT [ dutch ] = "Dit bestand werd met de WinWord- optie \"Snel opslaan\" opgeslagen. Schakel a.u.b in WinWord de optie \"Snel opslaan toestaan\" uit en sla het bestand opnieuw op met WinWord." ;
        TEXT [ spanish ] = "Este archivo ha sido guardado con la opción de WinWord 'guardar rápidamente' . Por favor desactive en WinWord la opción 'permitir guardar rápidamente' y guarde el archivo de nuevo en WinWord." ;
        TEXT [ english_us ] = "This file was saved with WinWord in 'Fast Save' mode. Please uncheck the option 'Allow Fast Saves' and save the file again." ;
        TEXT[ chinese_simplified ] = "Õâ¸öÎļþ´æÅ̲ÉÓõÄÊÇ WinWord Ñ¡Ïî '¿ìËÙ±£´æ'·½Ê½¡£ÇëÄúʧ»îÕâ¸öÑ¡ÏȻºóÔÚÖØÐ´æÅÌÕâ¸öÎļþ¡£";
        TEXT[ russian ] = "Ýòîò ôàéë ñîõðàíåí ïðè ïîìîùè ïàðàìåòðà WinWord 'Áûñòðîå ñîõðàíåíèå'. Ïîæàëóéñòà, îòêëþ÷èòå ïàðàìåòð 'Ðàçðåøèòü áûñòðîå ñîõðàíåíèå' è çàíîâî ñîõðàíèòå ýòîò ôàéë ñ ïîìîùüþ WinWord";
        TEXT[ polish ] = "Ten plik zosta³ zapisany za pomoc¹ opcji WinWord 'Szybkie zapisywanie'. Proszê w³³¹cz w WinWord opcjê 'Dopuœæ szybkie zapisywanie' i zapisz plik ponownie w WinWord";
        TEXT[ japanese ] = "‚±‚Ì̧²Ù‚́AWinWordµÌß¼®Ý‚Ì'‚‘¬•Û‘¶'‚ŕۑ¶‚³‚ê‚Ä‚¢‚Ü‚·BWinWord‚̵Ìß¼®Ý'‚‘¬•Û‘¶‚Ì'‚ðÁ‹Ž‚µ‚ā@̧²Ù‚ðV‚½‚ÉWinWord‚ŕۑ¶‚µ‚ĉº‚³‚¢B";
        TEXT[ chinese_traditional ] = "Àx¦sÀɮױĥΪº¬O WinWord ¿ï¶µ '§Ö³tÀx¦s'¤è¦¡¡C½Ð±z¥¢¬¡³o­Ó¿ï¶µ¡MµM«á¦b­«·sÀx¦s³o­Ó¤å¥ó¡C";
        TEXT[ arabic ] = "Êã ÍÝÙ åÐÇ ÇáãáÝ Úä ØÑíÞ ÎíÇÑ 'ÇáÍÝÙ ÇáÓÑíÚ' Ýí WinWord. ÇáÑÌÇÁ ÅíÞÇÝ ÎÇÕíÉ 'ÇáÓãÇÍ ÈÇáÍÝÙ ÇáÓÑíÚ' Ýí WinWord¡ Ëã Þã ÈÍÝÙ ÇáãáÝ ãä ÌÏíÏ ÈæÇÓØÉ WinWord.";
        TEXT[ greek ] = "Ôï áñ÷åßï áõôü áðïèçêåýôçêå ìå ôçí åðéëïãÞ 'ÃñÞãïñç áðïèÞêåõóç' ôïõ WinWord. Ðáñáêáëþ áðåíåñãïðïéÞóåôå ôçí åðéëïãÞ áõôÞ ôïõ WinWord êáé áðïèçêåýóôå ôï áñ÷åßï îáíÜ óôï WinWord.";
        TEXT[ korean ] = "ÀÌ ÆÄÀÏÀº  WinWord ÀÇ  'ºü¸¥ ÀúÀå' ¸ðµå·Î ÀúÀåµÇ¾î ÀÖ½À´Ï´Ù.  ¿É¼Ç 'ºü¸¥ ÀúÀå Çã¿ë' ¸¦ ÇØÁ¦Çϰí, ÆÄÀÏÀ» ´Ù½Ã ÀúÀåÇϽʽÿÀ .";
        TEXT[ turkish ] = "Bu dosya WinWord seçeneði 'Hýzlý kaydet' ile kaydedilmiþ. WinWord'de 'Hýzlý kaydetmeye olanak saðla' seçeneðini geçersiz kýlýp dosyayý yeniden WinWord ile kaydedin";
        TEXT[ language_user1 ] = " ";
    };
    String ERR_CODE ( ERRCODE_CLASS_READ , ERR_W4W_WRITE_TMP_ERROR )
    {
        TEXT = "Fehler beim Schreiben der Temporärdatei" ;
        TEXT [ English ] = "Error in writing temporary file " ;
        TEXT [ norwegian ] = "Feil ved skriving av midlertidig fil " ;
        TEXT [ italian ] = "Errore durante la scrittura del file temporaneo" ;
        TEXT [ portuguese_brazilian ] = "Erro na gravação de arquivo temporário" ;
        TEXT [ portuguese ] = "Erro ao gravar o ficheiro temporário" ;
        TEXT [ finnish ] = "Virhe kirjoitettaessa tilapäistiedostoa " ;
        TEXT [ danish ] = "Fejl under skrivning af midlertidig fil" ;
        TEXT [ french ] = "Erreur d'écriture du fichier temporaire" ;
        TEXT [ swedish ] = "Fel vid skrivning till temporär fil" ;
        TEXT [ dutch ] = "Fout bij het schrijven van tijdelijk bestand" ;
        TEXT [ spanish ] = "Error al escribir el archivo temporal" ;
        TEXT [ english_us ] = "Error writing temporary file" ;
        TEXT[ chinese_simplified ] = "ÔÚдÈëÔÝʱÎļþʱ·¢Éú´íÎó";
        TEXT[ russian ] = "Îøèáêà ïðè çàïèñè âðåìåííîãî ôàéëà";
        TEXT[ polish ] = "B³¹d zapisu pliku tymczasowego";
        TEXT[ japanese ] = "ÃÝÎßר ̧²Ù“ü—Í’†‚Ì´×°";
        TEXT[ chinese_traditional ] = "¦b¼g¤J¼È®ÉÀɮ׮ɵo¥Í¿ù»~";
        TEXT[ arabic ] = "ÍÏË ÎØÃ ÃËäÇÁ ßÊÇÈÉ ÇáãáÝ ÇáãÄÞÊ";
        TEXT[ greek ] = "ÓöÜëìá êáôÜ ôçí åããñáöÞ ðñïóùñéíïý áñ÷åßïõ";
        TEXT[ korean ] = "ÀÓ½ÃÆÄÀÏ¿¡ ¾²±â ¿À·ù";
        TEXT[ turkish ] = "Geçici dosya yazma hatasý";
        TEXT[ language_user1 ] = " ";
    };
    String ERR_CODE ( ERRCODE_CLASS_READ , ERR_EXCLOT_WRONG_RANGE )
    {
        TEXT = "Einfügebereich in Ini-Datei zu groß" ;
        TEXT [ English ] = "Import range from ini file to large" ;
        TEXT [ norwegian ] = "Import range from ini file to large" ;
        TEXT [ italian ] = "Area di inserimento del file ini troppo grande" ;
        TEXT [ portuguese_brazilian ] = "Import range from ini file to large" ;
        TEXT [ portuguese ] = "A área de inserção do ficheiro Ini é demasiado extensa" ;
        TEXT [ french ] = "Zone d'insertion dans le fichier Ini trop grande" ;
        TEXT [ dutch ] = "Invoegbereik in INI-bestand is te groot" ;
        TEXT [ spanish ] = "El área de inserción en el archivo Ini es demasiado grande" ;
        TEXT [ danish ] = "Importområdet i ini-filen er for stort" ;
        TEXT [ swedish ] = "Importområdet i Ini-filen är för stort" ;
        TEXT [ finnish ] = "Import range from ini file to large" ;
        TEXT [ english_us ] = "Inserted section in ini file too large" ;
        TEXT[ chinese_simplified ] = "Ini Îļþ²åÈëÇøÓòÌ«´ó";
        TEXT[ russian ] = "Îáëàñòü âñòàâêè â ôàéë Ini ñëèøêîì áîëüøàÿ";
        TEXT[ polish ] = "Obszar wstawiania do pliku Ini jest za du¿y";
        TEXT[ japanese ] = "Ini̧²Ù‚Ì‘}“ü”͈͂ª’·‚·‚¬‚Ü‚·B";
        TEXT[ chinese_traditional ] = "Ini ÀÉ®×´¡¤J°Ï°ì¤Ó¤j";
        TEXT[ arabic ] = "äØÇÞ ÇáÅÏÎÇá Ýí ÇáãáÝ Ini ßÈíÑ ÌÏÇð";
        TEXT[ greek ] = "Ç ðåñéï÷Þ åéóáãùãÞò óôï áñ÷åßï ini åßíáé ðïëý ìåãÜëç";
        TEXT[ korean ] = "ini ÆÄÀÏ¿¡ »ðÀÔµÈ ±¸¿ªÀÌ ³Ê¹« Å®´Ï´Ù.";
        TEXT[ turkish ] = "Ini dosyasý ekleme bölümü çok büyük";
        TEXT[ language_user1 ] = " ";
    };
    String ERR_CODE ( ERRCODE_CLASS_READ , ERR_FORMAT_ROWCOL )
    {
        TEXT = "Formatfehler an Position $(ARG1)(Zeile,Spalte) in der Datei entdeckt" ;
        TEXT [ English ] = "File format error at $(ARG1)(row,col)" ;
        Text [ english_us ] = "File format error found at $(ARG1)(row,col)" ;
        Text [ italian ] = "È stato trovato un errore di formato nel file alla posizione $(ARG1)(riga, colonna)" ;
        Text [ spanish ] = "Se ha descubierto un error de formato en el archivo en la posición $(ARG1)(fila,columna)" ;
        Text [ french ] = "Erreur de format à la position $(ARG1)(ligne,colonne) du fichier" ;
        Text [ dutch ] = "Formaatfout ontdekt op positie $(ARG1)(cel,kolom) in het bestand" ;
        Text [ swedish ] = "Formatfel vid position $(ARG1)(rad,kolumn) upptäckt i filen" ;
        Text [ danish ] = "Der blev opdaget en formatfejl i filen på position $(ARG1)(række,spalte)" ;
        Text [ portuguese ] = "Descoberto erro de formato na posição $(ARG1)(linha, coluna) do ficheiro" ;
        Text [ portuguese_brazilian ] = "Formatfehler an Position $(ARG1)(Zeile,Spalte) in der Datei entdeckt" ;
        Text[ chinese_simplified ] = "Îļþ¸ñʽ´íÎó $(ARG1)(ÐУ¬ÁÐ)";
        Text[ russian ] = "Â ìåñòå $(ARG1)(ñòðîêà,ñòîëáåö) îáíàðóæåíà îøèáêà ôîðìàòà ôàéëà";
        Text[ polish ] = "Znaleziono w pliku b³¹d formatu przy pozycji $(ARG1)(Wiersz, kolumna)";
        Text[ japanese ] = "̧²Ù‚Ì $(ARG1)(sA—ñ)‚ɏ‘Ž®´×°‚ªŒ©‚‚©‚è‚Ü‚µ‚½B";
        Text[ chinese_traditional ] = "Àɮ׮榡¿ù»~ $(ARG1)(¦æ¡A¦C)";
        Text[ arabic ] = "Êã ÇßÊÔÇÝ ÎØÃ Ýí ÇáãæÖÚ $(ARG1)(ÓØÑ¡ÚãæÏ) Ýí ÇáãáÝ";
        Text[ greek ] = "ÂñÝèçêå óöÜëìá ìïñöïðïßçóçò óôç èÝóç $(ARG1)(ãñáììÞ,óôÞëç) ôïõ áñ÷åßï";
        Text[ korean ] = "ÆÄÀϼ­½Ä ¿À·ù°¡ $(ARG1)(Çà,¿­)¿¡¼­ ¹ß°ß µË´Ï´Ù.";
        Text[ turkish ] = "Dosya format hatasý $(ARG1)(satýr, sütun) bulundu";
        Text[ language_user1 ] = " ";
    };
    String ERR_CODE ( ERRCODE_CLASS_READ , ERR_SWG_NEW_VERSION )
    {
        TEXT = "Datei wurde von einer neueren Version geschrieben" ;
        TEXT [ English ] = "File has been written by a newer version" ;
        Text [ english_us ] = "File has been written in a newer version" ;
        Text [ italian ] = "Il file è stato creato da una versione più recente" ;
        Text [ spanish ] = "El archivo se escribió en una versión más nueva" ;
        Text [ french ] = "Ce fichier a été créé à l'aide d'une version plus récente" ;
        Text [ dutch ] = "Bestand werd onder een nieuwere versie opgeslagen" ;
        Text [ swedish ] = "Filen är skriven i en nyare version" ;
        Text [ danish ] = "Filen er blevet skrevet af en nyere version" ;
        Text [ portuguese ] = "O ficheiro foi escrito numa versão mais moderna" ;
        Text [ portuguese_brazilian ] = "Datei wurde von einer neueren Version geschrieben" ;
        Text[ chinese_simplified ] = "ÎļþÒѾ­ÓÉÒ»¸öа汾¸üÐÂ";
        Text[ russian ] = "Ôàéë íàïèñàí â íîâîé âåðñèè";
        Text[ polish ] = "Plik zosta³ zapisany w nowszej wersji";
        Text[ japanese ] = "̧²Ù‚͐V‚µ‚¢ÊÞ°¼Þ®Ý‚ŏ‘‚©‚ê‚Ä‚¢‚Ü‚·";
        Text[ chinese_traditional ] = "Àɮפw¸g³Q¤@­Ó·sª©¥»§ó·s";
        Text[ arabic ] = "Êã ßÊÇÈÉ ÇáãáÝ Ýí ÅÕÏÇÑ ÃÍÏË";
        Text[ greek ] = "Ôï áñ÷åßï ãñÜöôçêå ìå íåüôåñç Ýêäïóç";
        Text[ korean ] = "ÆÄÀÏÀÌ ÃֽйöÁ¯¿¡ ÀÇÇØ ¾²¿©Á³½À´Ï´Ù.";
        Text[ turkish ] = "Dosya daha yeni bir sürüm ile yazýlmýþ";
        Text[ language_user1 ] = " ";
    };
    String ERR_CODE ( ERRCODE_CLASS_READ , ERR_WW8_NO_WW8_FILE_ERR )
    {
        TEXT = "Die Datei ist keine WinWord97-Datei" ;
        TEXT [ English ] = "This isn't a WinWord97 file" ;
        TEXT[ english_us ] = "This is not a WinWord97 file";
        TEXT[ portuguese ] = "Não é um ficheiro WinWord97";
        TEXT[ russian ] = "This isn't a WinWord97 file";
        TEXT[ greek ] = "Ôï áñ÷åßï áõôü äåí åßíáé ôýðïõ WinWord97";
        TEXT[ dutch ] = "Dit is geen WinWord97 bestand";
        TEXT[ french ] = "Il ne s'agit pas d'un fichier WinWord97 !";
        TEXT[ spanish ] = "This isn't a WinWord97 file";
        TEXT[ italian ] = "This isn't a WinWord97 file";
        TEXT[ danish ] = "Filen er ingen WinWord97-fil";
        TEXT[ swedish ] = "Filen är inte en WinWord97-fil";
        TEXT[ polish ] = "To nie jest plik WinWord97";
        TEXT[ portuguese_brazilian ] = "This isn't a WinWord97 file";
        TEXT[ japanese ] = "‚±‚ê‚Í WinWord97 ̧²Ù‚ł͂ ‚è‚Ü‚¹‚ñ";
        TEXT[ korean ] = "This isn't a WinWord97 file";
        TEXT[ chinese_simplified ] = "Õâ¸öÎļþ²»ÊÇÒ»¸ö WinWord97 Îļþ";
        TEXT[ chinese_traditional ] = "³o¤£¬O WinWord97 ÀÉ®×";
        TEXT[ turkish ] = "This isn't a WinWord97 file";
        TEXT[ arabic ] = "åÐÇ ÇáãáÝ áíÓ ãáÝ WinWord97";
    };
     // Export-Errors
    String ERR_CODE ( ERRCODE_CLASS_WRITE , ERR_SWG_WRITE_ERROR )
    {
        TEXT = "Fehler beim Schreiben der Datei " ;
        TEXT [ English ] = "Error in writing file " ;
        TEXT [ norwegian ] = "Feil ved skriving av fil " ;
        TEXT [ italian ] = "Errore durante la scrittura del file " ;
        TEXT [ portuguese_brazilian ] = "Erro na gravação de arquivo" ;
        TEXT [ portuguese ] = "Erro ao gravar o ficheiro " ;
        TEXT [ finnish ] = "Virhe kirjoitettaessa tiedostoa " ;
        TEXT [ danish ] = "Fejl under skrivning af filen " ;
        TEXT [ french ] = "Erreur d'écriture du fichier " ;
        TEXT [ swedish ] = "Fel vid skrivning till fil " ;
        TEXT [ dutch ] = "Fout bij het schrijven van het bestand  " ;
        TEXT [ spanish ] = "Error al escribir el archivo " ;
        TEXT [ english_us ] = "Error writing file " ;
        TEXT[ chinese_simplified ] = "дÈëÎļþʱ·¢Éú´íÎó ";
        TEXT[ russian ] = "Îøèáêà çàïèñè ôàéëà  ";
        TEXT[ polish ] = "B³¹d zapisu pliku  ";
        TEXT[ japanese ] = "̧²Ù“ü—Í’†‚Ì´×° ";
        TEXT[ chinese_traditional ] = "¼g¤JÀɮ׮ɵo¥Í¿ù»~ ";
        TEXT[ arabic ] = "ÍÏË ÎØÃ ÃËäÇÁ ßÊÇÈÉ ÇáãáÝ ";
        TEXT[ greek ] = "ÓöÜëìá êáôÜ ôçí åããñáöÞ áñ÷åßïõ ";
        TEXT[ korean ] = "ÆÄÀÏ ¾²±â ¿À·ù ";
        TEXT[ turkish ] = "Dosya yazma hatasý ";
        TEXT[ language_user1 ] = " ";
    };
    String ERR_CODE ( ERRCODE_CLASS_WRITE , ERR_SWG_OLD_GLOSSARY )
    {
        TEXT = "Das Autotextdokument hat falsche Version" ;
        TEXT [ English ] = "The glossary document has wrong version" ;
        Text [ dutch ] = "Het AutoTekst-document heeft de verkeerde versie" ;
        Text [ english_us ] = "Wrong AutoText document version" ;
        Text [ italian ] = "Il documento di testo automatico presenta una versione errata" ;
        Text [ spanish ] = "Versión errónea del documento de AutoTexto" ;
        Text [ french ] = "La version de l' AutoTexte utilisée est incorrecte" ;
        Text [ swedish ] = "AutoTextdokumentet har fel version" ;
        Text [ danish ] = "Forkert AutoTekst dokumentversion" ;
        Text [ portuguese ] = "O documento do AutoTexto tem a versão errada" ;
        Text [ portuguese_brazilian ] = "Das Autotextdokument hat falsche Version" ;
        Text[ chinese_simplified ] = "Õâ¸ö×Ô¶¯Í¼ÎÄÎĵµ°æ±¾ÎÞЧ";
        Text[ russian ] = "Íåïðàâèëüíàÿ âåðñèÿ äîêóìåíòà àâòîòåêñòà";
        Text[ polish ] = "Dokument autotekstu ma z³¹ wersjê";
        Text[ japanese ] = "“ü—ÍŽx‰‡ÄÞ·­ÒÝĂÌÊÞ°¼Þ®Ý‚ªˆá‚¢‚Ü‚·";
        Text[ chinese_traditional ] = "³o­Ó¦Û°Ê¹Ï¤å¶°¤å¥óª©¥»µL®Ä";
        Text[ arabic ] = "ÅÕÏÇÑ ÎÇØÆ áãÓÊäÏ ÇáäÕ ÇáÊáÞÇÆí";
        Text[ greek ] = "ËÜèïò Ýêäïóç ôïõ åããñÜöïõ ÁõôïÊåéìÝíïõ";
        Text[ korean ] = "À߸øµÈ ÀÚµ¿ ÅØ½ºÆ® ¹®¼­ ¹öÁ¯";
        Text[ turkish ] = "Otomatik metin belgesi sürümü yanlýþ";
        Text[ language_user1 ] = " ";
    };
    String ERR_CODE ( ERRCODE_CLASS_WRITE , ERR_SWG_CANNOT_WRITE )
    {
        TEXT = "Das Dokument kann nicht angelegt werden" ;
        TEXT [ English ] = "The document cannot be created" ;
        Text [ dutch ] = "Het document kan niet worden gemaakt" ;
        Text [ english_us ] = "The document cannot be created" ;
        Text [ italian ] = "Non è possibile creare il documento" ;
        Text [ spanish ] = "No se puede crear el documento" ;
        Text [ french ] = "Impossible de créer le document" ;
        Text [ swedish ] = "Dokumentet kan inte skapas" ;
        Text [ danish ] = "Dokumentet kan ikke oprettes" ;
        Text [ portuguese ] = "É impossível criar o documento" ;
        Text [ portuguese_brazilian ] = "Das Dokument kann nicht angelegt werden" ;
        Text[ chinese_simplified ] = "ÎÞ·¨Éú³ÉÕâ¸öÎĵµ¡£";
        Text[ russian ] = "Äîêóìåíò ñîçäàòü íåâîçìîæíî";
        Text[ polish ] = "Dokumentu nie mo¿na utworzyæ";
        Text[ japanese ] = "‚±‚ÌÄÞ·­ÒÝĂ͍쐬‚Å‚«‚Ü‚¹‚ñB";
        Text[ chinese_traditional ] = "µLªk¥Í¦¨³o­Ó¤å¥ó";
        Text[ arabic ] = "áÇ íãßä ÅäÔÇÁ ÇáãÓÊäÏ";
        Text[ greek ] = "Äåí Þôáí äõíáôÞ ç äçìéïõñãßá ôïõ åããñÜöïõ";
        Text[ korean ] = "¹®¼­°¡ ¸¸µé¾îÁú¼ö ¾ø½À´Ï´Ù.";
        Text[ turkish ] = "Belge oluþturulamýyor";
        Text[ language_user1 ] = " ";
    };
    String ERR_CODE ( ERRCODE_CLASS_WRITE , ERR_W4W_READ_TMP_ERROR )
    {
        TEXT = "Fehler beim Lesen der Temporärdatei" ;
        TEXT [ English ] = "Error in reading temporary file " ;
        TEXT [ norwegian ] = "eil ved lesing av midkertidig fil " ;
        TEXT [ italian ] = "Errore durante la lettura del file temporaneo" ;
        TEXT [ portuguese_brazilian ] = "Erro na leitura de arquivo temporário" ;
        TEXT [ portuguese ] = "Erro na leitura do ficheiro temporário" ;
        TEXT [ finnish ] = "Virhe luettaessa tilapäistiedostoa " ;
        TEXT [ danish ] = "Fejl under læsning af midlertidig fil" ;
        TEXT [ french ] = "Erreur de lecture du fichier temporaire" ;
        TEXT [ swedish ] = "Fel vid läsning av temporär fil" ;
        TEXT [ dutch ] = "Fout bij het lezen van tijdelijke bestanden" ;
        TEXT [ spanish ] = "Error al leer el archivo temporal" ;
        TEXT [ english_us ] = "Error reading temporary file" ;
        TEXT[ chinese_simplified ] = "ÔÚ¶ÁÈ¡ÔÝʱÎļþʱ·¢Éú´íÎó";
        TEXT[ russian ] = "Îøèáêà ïðè ÷òåíèè âðåìåííîãî ôàéëà";
        TEXT[ polish ] = "B³¹d odczytu pliku tymczasowego";
        TEXT[ japanese ] = "ÃÝÎß×ØÌ§²Ù“ǂݎæ‚è‚̍ۂ̴װ";
        TEXT[ chinese_traditional ] = "Ū¨ú¼È®ÉÀɮ׮ɵo¥Í¿ù»~";
        TEXT[ arabic ] = "ÍÏË ÎØÃ ÃËäÇÁ ÞÑÇÁÉ ÇáãáÝ ÇáãÄÞÊ";
        TEXT[ greek ] = "ÓöÜëìá êáôÜ ôï äéÜâáóìá ðñïóùñéíïý áñ÷åßïõ";
        TEXT[ korean ] = "ÀÓ½ÃÆÄÀÏ Àб⠿À·ù";
        TEXT[ turkish ] = "Geçici dosya okuma hatasý";
        TEXT[ language_user1 ] = " ";
    };
    String ERR_CODE ( ERRCODE_CLASS_WRITE , ERR_SWG_LARGE_DOC_ERROR )
    {
        TEXT = "Das Dokument überschreitet die mögliche 3.1/4.0-Textdokument-Größe" ;
        TEXT [ English ] = "The document's size exceeds the possible 3.1/4.0 document size" ;
        Text [ portuguese ] = "O documento ultrapassa o tamanho possível para um documento 3.1/4.0" ;
        Text [ english_us ] = "The document exceeds the allowed 3.1/4.0 text document size" ;
        Text [ portuguese_brazilian ] = "Das Dokument überschreitet die mögliche 3.1/4.0-Textdokument-Größe" ;
        Text [ swedish ] = "Dokumentet överskrider den möjliga 3.1/4.0-textdokumentstorleken" ;
        Text [ danish ] = "Dokumentet overskrider den mulige 3.1/4.0-tekstdokumentstørrelse" ;
        Text [ italian ] = "Il documento supera le dimensioni del testo possibili in 3.1/4.0" ;
        Text [ spanish ] = "El documento sobrepasa el tamaño posible 3.1/4.0 de documento" ;
        Text [ french ] = "Le document dépasse la taille maximum autorisée pour un document texte 3.1/4.0" ;
        Text [ dutch ] = "Het document overschrijdt de mogelijke 3.1/4.0-tekstdocumentgrootte" ;
        Text[ chinese_simplified ] = "Õâ¸öÎĵµ¿ÉÄܳ¬¹ý 3.1/4.0 °æ±¾ÎĵµµÄ´óС¡£";
        Text[ russian ] = "Äîêóìåíò ïðåâûøàåò âîçìîæíûé îáúåì 3.1/4.0, óñòàíîâëåííûé äëÿ òåêñòîâîãî äîêóìåíòà";
        Text[ polish ] = "Dokument przekracza dopuszczalny rozmiar dokumentu tekstowego 3.1/4.0";
        Text[ japanese ] = "‚±‚ÌÄÞ·­ÒÝẮA3.1/4.0‚É‚¨‚¢‚ĉ”\\‚È÷½ÄÄÞ·­ÒÝĂ̻²½Þ‚ð’´‚¦‚Ä‚¢‚Ü‚·B";
        Text[ chinese_traditional ] = "³o­Ó¤å¥ó¥i¯à¶W¹L 3.1/4.0 ª©¥»¤å¥óªº¤j¤p¡C";
        Text[ arabic ] = "íÊÌÇæÒ ÇáãÓÊäÏ ÍÌã ãÓÊäÏ ÇáäÕ 3.1/4.0";
        Text[ greek ] = "Ôï Ýããñáöï õðåñâáßíåé ôï åðéôñåðüìåíï üñéï ìåãÝèïõò åããñÜöïõ êåéìÝíïõ ãéá ôçí Ýêäïóç 3.1/4.0";
        Text[ korean ] = "¹®¼­°¡ Çô¿ëµÈ 3.1/4.0 ÅØ½ºÆ® ¹®ÀÚ Å©±â¸¦ Ãʰú Çß½À´Ï´Ù.";
        Text[ turkish ] = "Belge izin verilen 3.1/4.0 metin belgesi büyüklüðünü aþýyor";
        Text[ language_user1 ] = " ";
    };
     // Import-/Export-Errors
    String ERR_CODE ( ERRCODE_CLASS_READ , ERR_SWG_INTERNAL_ERROR )
    {
        TEXT = "Interner Fehler im StarWriter Dateiformat" ;
        TEXT [ English ] = "Internal Error in StarWriter file" ;
        TEXT [ norwegian ] = "Intern feil i StarWriter fil" ;
        TEXT [ italian ] = "Errore interno nel formato di file di StarOffice Writer" ;
        TEXT [ portuguese_brazilian ] = "Erro interno em arquivo do StarOffice Writer" ;
        TEXT [ portuguese ] = "Erro interno no formato de ficheiro do StarOffice Writer" ;
        TEXT [ finnish ] = "Sisäinen virhe StarWriter-tiedostossa" ;
        TEXT [ danish ] = "Intern fejl i StarOffice Writer-filformatet" ;
        TEXT [ french ] = "Erreur interne dans le format de fichier StarOffice Writer" ;
        TEXT [ swedish ] = "Internt fel i StarOffice Writer-filformatet" ;
        TEXT [ dutch ] = "Interne fout in StarOffice Writer bestandsformaat" ;
        TEXT [ spanish ] = "Error interno en el formato de archivo de StarOffice Writer" ;
        TEXT [ english_us ] = "Internal error in StarOffice Writer file format" ;
        TEXT[ chinese_simplified ] = "ÄÚ²¿µÄ StarOffice Writer Îļþ¸ñʽ´íÎó";
        TEXT[ russian ] = "Îøèáêà âíóòðè ôîðìàòà ôàéëà StarOffice Writer";
        TEXT[ polish ] = "Wewnêtrzny b³¹d w formacie pliku StarOffice Writer";
        TEXT[ japanese ] = "StarOffice Writer ̧²Ù‘Ž®‚Ì“à•”´×°";
        TEXT[ chinese_traditional ] = "¤º³¡ªº StarOffice Writer Àɮ׮榡¿ù»~";
        TEXT[ arabic ] = "ÍÏË ÎØÃ ÏÇÎáí Ýí ÊäÓíÞ ãáÝ StarOffice Writer";
        TEXT[ greek ] = "Åóùôåñéêü óöÜëìá óôç ìïñöÞ áñ÷åßïõ ôïõ StarOffice Writer";
        TEXT[ korean ] = "StarOffice WriterÆÄÀϼ­½Ä ÀÇ ³»ºÎ ¿À·ù";
        TEXT[ turkish ] = "Dahili StarOffice Writer dosyasý format hatasý";
        TEXT[ language_user1 ] = " ";
    };
    String ERR_CODE ( ERRCODE_CLASS_WRITE , ERR_SWG_INTERNAL_ERROR )
    {
        TEXT = "Interner Fehler im StarWriter Dateiformat" ;
        TEXT [ English ] = "Internal Error in StarWriter file" ;
        TEXT [ norwegian ] = "Intern feil i StarWriter fil" ;
        TEXT [ italian ] = "Errore interno nel formato di file di StarOffice Writer" ;
        TEXT [ portuguese_brazilian ] = "Erro interno em arquivo do StarOffice Writer" ;
        TEXT [ portuguese ] = "Erro interno no formato de ficheiro do StarOffice Writer" ;
        TEXT [ finnish ] = "Sisäinen virhe StarWriter-tiedostossa" ;
        TEXT [ danish ] = "Intern fejl i StarOffice Writer-filformatet" ;
        TEXT [ french ] = "Erreur interne dans le format de fichier StarOffice Writer" ;
        TEXT [ swedish ] = "Internt fel i StarOffice Writer-filformatet" ;
        TEXT [ dutch ] = "Interne fout in StarOffice Writer bestandsformaat" ;
        TEXT [ spanish ] = "Error interno en el formato de archivo de StarOffice Writer" ;
        TEXT [ english_us ] = "Internal Error in StarOffice Writer file format" ;
        TEXT[ chinese_simplified ] = "ÄÚ²¿µÄ StarOffice Writer Îļþ¸ñʽ´íÎó";
        TEXT[ russian ] = "Îøèáêà âíóòðè ôîðìàòà ôàéëà StarOffice Writer";
        TEXT[ polish ] = "Wewnêtrzny b³¹d w formacie pliku StarOffice Writer";
        TEXT[ japanese ] = "StarOffice Writer ̧²Ù‘Ž®‚Ì“à•”´×°";
        TEXT[ chinese_traditional ] = "¤º³¡ªº StarOffice Writer Àɮ׮榡¿ù»~";
        TEXT[ arabic ] = "ÍÏË ÎØÃ ÏÇÎáí Ýí ÊäÓíÞ ãáÝ StarOffice Writer";
        TEXT[ greek ] = "Åóùôåñéêü óöÜëìá óôç ìïñöÞ áñ÷åßïõ ôïõ StarOffice Writer";
        TEXT[ korean ] = "StarOffice Writer ÆÄÀϼ­½ÄÀÇ ³»ºÎ ¿À·ù";
        TEXT[ turkish ] = "Dahili StarOffice Writer dosyasý format hatasý";
        TEXT[ language_user1 ] = " ";
    };
    String ERR_CODE ( ERRCODE_CLASS_READ , ERR_W4W_MEM )
    {
        TEXT = "Nicht genügend Speicher vorhanden" ;
        TEXT [ English ] = "Out of memory" ;
        TEXT [ norwegian ] = "Ute av minne" ;
        TEXT [ italian ] = "Memoria disponibile insufficiente" ;
        TEXT [ portuguese_brazilian ] = "Sem memória" ;
        TEXT [ portuguese ] = "Memória insuficiente" ;
        TEXT [ finnish ] = "Muisti on lopussa" ;
        TEXT [ danish ] = "Ikke nok hukommelse" ;
        TEXT [ french ] = "Mémoire saturée" ;
        TEXT [ swedish ] = "Inte tillräckligt med minne" ;
        TEXT [ dutch ] = "Onvoldoende geheugen beschikbaar" ;
        TEXT [ spanish ] = "Memoria insuficiente" ;
        TEXT [ english_us ] = "Insufficient memory" ;
        TEXT[ chinese_simplified ] = "ÄÚ´æ²»×ã";
        TEXT[ russian ] = "Íåäîñòàòî÷íî ïàìÿòè";
        TEXT[ polish ] = "Za ma³o pamiêci";
        TEXT[ japanese ] = "\\•ª‚ȋ󂫗e—Ê‚ª‚ ‚è‚Ü‚¹‚ñ";
        TEXT[ chinese_traditional ] = "°O¾ÐÅ餣¨¬";
        TEXT[ arabic ] = "ÇáÐÇßÑÉ ÛíÑ ßÇÝíÉ";
        TEXT[ greek ] = "Ç ìíÞìç äåí åðáñêåß.";
        TEXT[ korean ] = "¸Þ¸ð¸®°¡ ºÎÁ·ÇÕ´Ï´Ù.";
        TEXT[ turkish ] = "Yetersiz bellek";
        TEXT[ language_user1 ] = " ";
    };
    String ERR_CODE ( ERRCODE_CLASS_WRITE , ERR_W4W_MEM )
    {
        TEXT = "Nicht genügend Speicher vorhanden" ;
        TEXT [ English ] = "Out of memory" ;
        TEXT [ norwegian ] = "Ute av minne" ;
        TEXT [ italian ] = "Memoria disponibile insufficiente" ;
        TEXT [ portuguese_brazilian ] = "Sem memória" ;
        TEXT [ portuguese ] = "Memória insuficiente" ;
        TEXT [ finnish ] = "Muisti on lopussa" ;
        TEXT [ danish ] = "Ikke nok hukommelse" ;
        TEXT [ french ] = "Mémoire saturée" ;
        TEXT [ swedish ] = "Inte tillräckligt med minne" ;
        TEXT [ dutch ] = "Onvoldoende geheugen beschikbaar" ;
        TEXT [ spanish ] = "Memoria insuficiente" ;
        TEXT [ english_us ] = "Insufficient memory" ;
        TEXT[ chinese_simplified ] = "ÄÚ´æ²»×ã";
        TEXT[ russian ] = "Íåäîñòàòî÷íî ïàìÿòè";
        TEXT[ polish ] = "Za ma³o pamiêci";
        TEXT[ japanese ] = "\\•ª‚ȋ󂫗e—Ê‚ª‚ ‚è‚Ü‚¹‚ñB";
        TEXT[ chinese_traditional ] = "°O¾ÐÅ餣¨¬";
        TEXT[ arabic ] = "ÇáÐÇßÑÉ ÛíÑ ßÇÝíÉ";
        TEXT[ greek ] = "Ç ìíÞìç äåí åðáñêåß.";
        TEXT[ korean ] = "¸Þ¸ð¸®°¡ ºÎÁ·ÇÕ´Ï´Ù.";
        TEXT[ turkish ] = "Yetersiz bellek";
        TEXT[ language_user1 ] = " ";
    };
    String ERR_CODE ( ERRCODE_CLASS_READ , ERR_W4W_WRITE_FULL )
    {
        TEXT = "Nicht genügend Platz auf dem Speichermedium" ;
        TEXT [ English ] = "Not enough space on disk" ;
        TEXT [ norwegian ] = "Ikke nok plass på disketten" ;
        TEXT [ italian ] = "Spazio su disco insufficiente" ;
        TEXT [ portuguese_brazilian ] = "Não há espaço suficiente em disco" ;
        TEXT [ portuguese ] = "Espaço do disco insuficiente" ;
        TEXT [ finnish ] = "Levytila ei riitä" ;
        TEXT [ danish ] = "Ikke tilstrækkelig diskplads" ;
        TEXT [ french ] = "Espace insuffisant sur le disque" ;
        TEXT [ swedish ] = "Inte tillräckligt med diskutrymme" ;
        TEXT [ dutch ] = "Onvoldoende vrije ruimte op opslagmedium" ;
        TEXT [ spanish ] = "No hay suficiente espacio en el disco" ;
        TEXT [ english_us ] = "Not enough disk space" ;
        TEXT[ chinese_simplified ] = "¿ÉÓÿռ䲻×ã";
        TEXT[ russian ] = "Íåäîñòàòî÷íî ìåñòà íà äèñêå";
        TEXT[ polish ] = "Brak miejsca na dysku";
        TEXT[ japanese ] = "ÒÓØ”}‘̂ɏ\\•ª‚ȋ󂫗e—Ê‚ª‚ ‚è‚Ü‚¹‚ñB";
        TEXT[ chinese_traditional ] = "¥i¥ÎªÅ¶¡¤£¨¬";
        TEXT[ arabic ] = "áÇ íæÌÏ ãÓÇÍÉ ßÇÝíÉ Úáì ãÍÑß ÇáÃÞÑÇÕ";
        TEXT[ greek ] = "Äåí õðÜñ÷åé áñêåôüò äéáèÝóéìïò ÷þñïò óôï ìÝóï áðïèÞêåõóçò";
        TEXT[ korean ] = "µð½ºÅ© °ø°£ÀÌ ºÎÁ·ÇÕ´Ï´Ù.";
        TEXT[ turkish ] = "Yeterli disk alaný yok";
        TEXT[ language_user1 ] = " ";
    };
    String ERR_CODE ( ERRCODE_CLASS_WRITE , ERR_W4W_WRITE_FULL )
    {
        TEXT = "Nicht genügend Platz auf dem Speichermedium" ;
        TEXT [ English ] = "Not enough space on disk" ;
        TEXT [ norwegian ] = "Ikke nok plass på disketten" ;
        TEXT [ italian ] = "Spazio su disco insufficiente" ;
        TEXT [ portuguese_brazilian ] = "Não há espaço suficiente em disco" ;
        TEXT [ portuguese ] = "Espaço do disco insuficiente" ;
        TEXT [ finnish ] = "Levytila ei riitä" ;
        TEXT [ danish ] = "Ikke tilstrækkelig diskplads" ;
        TEXT [ french ] = "Espace insuffisant sur le disque" ;
        TEXT [ swedish ] = "Inte tillräckligt med diskutrymme" ;
        TEXT [ dutch ] = "Onvoldoende vrije ruimte op opslagmedium" ;
        TEXT [ spanish ] = "No hay suficiente espacio en el disco" ;
        TEXT [ english_us ] = "Not enough disk space" ;
        TEXT[ chinese_simplified ] = "¿ÉÓÿռ䲻×ã";
        TEXT[ russian ] = "Íåäîñòàòî÷íî ìåñòà íà äèñêå";
        TEXT[ polish ] = "Brak miejsca na dysku";
        TEXT[ japanese ] = "ÒÓØ”}‘̂ɏ\\•ª‚ȋ󂫗e—Ê‚ª‚ ‚è‚Ü‚¹‚ñB";
        TEXT[ chinese_traditional ] = "¥i¥ÎªÅ¶¡¤£¨¬";
        TEXT[ arabic ] = "áÇ íæÌÏ ãÓÇÍÉ ßÇÝíÉ Úáì ãÍÑß ÇáÃÞÑÇÕ";
        TEXT[ greek ] = "Äåí õðÜñ÷åé áñêåôüò äéáèÝóéìïò ÷þñïò óôï ìÝóï áðïèÞêåõóçò";
        TEXT[ korean ] = "µð½ºÅ© °ø°£ÀÌ ÃæºÐÇÏÁö ¾Ê½À´Ï´Ù.";
        TEXT[ turkish ] = "Yeterli disk alaný yok";
        TEXT[ language_user1 ] = " ";
    };
    String ERR_CODE ( ERRCODE_CLASS_READ , ERR_W4W_INTERNAL_ERROR )
    {
        TEXT = "Unbekannter Fehler im W4W-Filter" ;
        TEXT [ English ] = "Internal Error in W4W filter" ;
        TEXT [ norwegian ] = "Intern feil I W4W filter" ;
        TEXT [ italian ] = "Errore sconosciuto nel filtro W4W" ;
        TEXT [ portuguese_brazilian ] = "Erro interno no filtro W4W" ;
        TEXT [ portuguese ] = "Erro desconhecido no filtro W4W" ;
        TEXT [ finnish ] = "Sisäinen virhe W4W-suotimessa" ;
        TEXT [ danish ] = "Intern fejl i W4W-filtret" ;
        TEXT [ french ] = "Erreur inconnue du filtre W4W" ;
        TEXT [ swedish ] = "Obekant fel i W4W-filter" ;
        TEXT [ dutch ] = "Onbekende fout in W4W-filter" ;
        TEXT [ spanish ] = "Error desconocido en el filtro W4W" ;
        TEXT [ english_us ] = "Unknown error in W4W filter" ;
        TEXT[ chinese_simplified ] = "W4W ¹ýÂËÆ÷·¢Éú²»Ã÷´íÎó¡£";
        TEXT[ russian ] = "Íåèçâåñòíàÿ îøèáêà â ôèëüòðå W4W";
        TEXT[ polish ] = "Nieznany b³¹d w filtrze W4W";
        TEXT[ japanese ] = "W4W̨ÙÀ‚É‚ ‚é•s–¾‚Ì´×°";
        TEXT[ chinese_traditional ] = "W4W ¹LÂo¾¹µo¥Í¤£©ú¿ù»~¡C";
        TEXT[ arabic ] = "ÍÏË ÎØÃ ÛíÑ ãÚÑæÝ Ýí ÝáÊÑ W4W";
        TEXT[ greek ] = "¢ãíùóôï óöÜëìá óôï ößëôñï W4W";
        TEXT[ korean ] = "W4W ÇÊÅÍ¿¡ ¾Ë·ÁÁöÁö ¾ÊÀº ¿À·ù";
        TEXT[ turkish ] = "W4W filtresinde bilinmeyen hata";
        TEXT[ language_user1 ] = " ";
    };
    String ERR_CODE ( ERRCODE_CLASS_WRITE , ERR_W4W_INTERNAL_ERROR )
    {
        TEXT = "Unbekannter Fehler im W4W-Filter" ;
        TEXT [ English ] = "Internal Error in W4W filter" ;
        TEXT [ norwegian ] = "Intern feil I W4W filter" ;
        TEXT [ italian ] = "Errore sconosciuto nel filtro W4W" ;
        TEXT [ portuguese_brazilian ] = "Erro interno no filtro W4W" ;
        TEXT [ portuguese ] = "Erro desconhecido no filtro W4W" ;
        TEXT [ finnish ] = "Sisäinen virhe W4W-suotimessa" ;
        TEXT [ danish ] = "Intern fejl i W4W-filtret" ;
        TEXT [ french ] = "Erreur inconnue dans le filtre W4W" ;
        TEXT [ swedish ] = "Obekant fel i W4W-filter" ;
        TEXT [ dutch ] = "Onbekende fout in W4W-filter" ;
        TEXT [ spanish ] = "Error desconocido en el filtro W4W" ;
        TEXT [ english_us ] = "Unknown error in W4W filter" ;
        TEXT[ chinese_simplified ] = "W4W ¹ýÂËÆ÷·¢Éú²»Ã÷´íÎó¡£";
        TEXT[ russian ] = "Íåèçâåñòíàÿ îøèáêà â ôèëüòðå W4W";
        TEXT[ polish ] = "Nieznany b³¹d w filtrze W4W";
        TEXT[ japanese ] = "W4W̨ÙÀ‚É‚ ‚é•s–¾‚Ì´×°";
        TEXT[ chinese_traditional ] = "W4W ¹LÂo¾¹µo¥Í¤£©ú¿ù»~¡C";
        TEXT[ arabic ] = "ÍÏË ÎØÃ ÛíÑ ãÚÑæÝ Ýí ÝáÊÑ W4W";
        TEXT[ greek ] = "¢ãíùóôï óöÜëìá óôï ößëôñï W4W";
        TEXT[ korean ] = "W4W ÇÊÅÍ¿¡ ¾Ë·ÁÁöÁö ¾ÊÀº ¿À·ù";
        TEXT[ turkish ] = "W4W filtresinde bilinmeyen hata";
        TEXT[ language_user1 ] = " ";
    };
    String ERR_CODE ( ERRCODE_CLASS_READ , ERR_W4W_DLL_ERROR )
    {
        TEXT = "Fehler beim Laden des Konverters" ;
        TEXT [ English ] = "Error in loading converter " ;
        TEXT [ norwegian ] = "Feil ved innlasting av omformer " ;
        TEXT [ italian ] = "Errore nel caricamento del convertitore" ;
        TEXT [ portuguese_brazilian ] = "Erro em carregar conversão" ;
        TEXT [ portuguese ] = "Erro ao carregar o conversor" ;
        TEXT [ finnish ] = "Virhe ladattaessa suodinta " ;
        TEXT [ danish ] = "Fejl under indlæsning af konverteren" ;
        TEXT [ french ] = "Erreur de chargement du convertisseur" ;
        TEXT [ swedish ] = "Fel vid laddning av konverteraren" ;
        TEXT [ dutch ] = "Fout bij het laden van de converter" ;
        TEXT [ spanish ] = "Error al cargar el convertidor" ;
        TEXT [ english_us ] = "Error loading converter" ;
        TEXT[ chinese_simplified ] = "ÔÚת»»Ê±·¢Éú´íÎó";
        TEXT[ russian ] = "Îøèáêà ïðè çàãðóçêå êîíâåðòîðà";
        TEXT[ polish ] = "B³¹d podczas ³adowania konwertera";
        TEXT[ japanese ] = "ºÝÊÞ°À“ǂݍž‚Ý’†‚Ì´×°";
        TEXT[ chinese_traditional ] = "Âà´«®Éµo¥Í¿ù»~";
        TEXT[ arabic ] = "ÍÏË ÎØÃ ÃËäÇÁ ÊÍãíá ÇáãÍæá";
        TEXT[ greek ] = "ÓöÜëìá êáôÜ ôç öüñôùóç ôïõ ìåôáôñïðÝá";
        TEXT[ korean ] = "º¯È¯ ·Îµå ¿À·ù";
        TEXT[ turkish ] = "Dönüþtürücü yükleme hatasý";
        TEXT[ language_user1 ] = " ";
    };
    String ERR_CODE ( ERRCODE_CLASS_WRITE , ERR_W4W_DLL_ERROR )
    {
        TEXT = "Fehler beim Laden des Konverters" ;
        TEXT [ English ] = "Error in loading converter " ;
        TEXT [ norwegian ] = "Feil ved innlasting av omformer " ;
        TEXT [ italian ] = "Errore nel caricamento del convertitore" ;
        TEXT [ portuguese_brazilian ] = "Erro em carregar conversão" ;
        TEXT [ portuguese ] = "Erro ao carregar o conversor" ;
        TEXT [ finnish ] = "Virhe ladattaessa suodinta " ;
        TEXT [ danish ] = "Fejl under indlæsning af konverteren" ;
        TEXT [ french ] = "Erreur de chargement du convertisseur" ;
        TEXT [ swedish ] = "Fel vid laddning av konverteraren" ;
        TEXT [ dutch ] = "Fout bij het laden van de converter" ;
        TEXT [ spanish ] = "Error al cargar el convertidor" ;
        TEXT [ english_us ] = "Error loading converter" ;
        TEXT[ chinese_simplified ] = "ת»»Ê±·¢Éú´íÎó";
        TEXT[ russian ] = "Îøèáêà ïðè çàãðóçêå êîíâåðòîðà";
        TEXT[ polish ] = "B³¹d podczas ³adowania konwertera";
        TEXT[ japanese ] = "ºÝÊÞ°À“ǂݍž‚Ý’†‚Ì´×°";
        TEXT[ chinese_traditional ] = "Âà´«®Éµo¥Í¿ù»~";
        TEXT[ arabic ] = "ÍÏË ÎØÃ ÃËäÇÁ ÊÍãíá ÇáãÍæá";
        TEXT[ greek ] = "ÓöÜëìá êáôÜ ôç öüñôùóç ôïõ ìåôáôñïðÝá";
        TEXT[ korean ] = "º¯È¯ ·Îµå ¿À·ù";
        TEXT[ turkish ] = "Dönüþtürücü yükleme hatasý";
        TEXT[ language_user1 ] = " ";
    };
    String ERR_CODE ( ERRCODE_CLASS_LOCKING , ERR_TXTBLOCK_NEWFILE_ERROR )
    {
        TEXT = "$(ARG1) hat sich geändert" ;
        TEXT [ English ] = "$(ARG1) has changed" ;
        Text [ dutch ] = "$(ARG1) is veranderd" ;
        Text [ english_us ] = "$(ARG1) has changed" ;
        Text [ italian ] = "$(ARG1) è cambiato" ;
        Text [ spanish ] = "$(ARG1) se ha modificado" ;
        Text [ french ] = "$(ARG1) a été modifié" ;
        Text [ swedish ] = "$(ARG1) har ändrats" ;
        Text [ danish ] = "$(ARG1) er ændret" ;
        Text [ portuguese ] = "$(ARG1) foi modificado" ;
        Text [ portuguese_brazilian ] = "$(ARG1) hat sich geändert" ;
        Text[ chinese_simplified ] = "$(ARG1) ÒѾ­¸ü¸Ä¡£";
        Text[ russian ] = "$(ARG1) èçìåíèëñÿ";
        Text[ polish ] = "$(ARG1) uleg³ zmianie";
        Text[ japanese ] = "$(ARG1)‚͕ύX‚³‚ê‚Ü‚µ‚½";
        Text[ chinese_traditional ] = "$(ARG1) ¤w¸gÅܧó¡C";
        Text[ arabic ] = "ÊÛíÑ $(ARG1)";
        Text[ greek ] = "$(ARG1) Ý÷åé áëëÜîåé";
        Text[ korean ] = "$(ARG1) ÀÌ º¯°æµÇ¾ú½À´Ï´Ù.";
        Text[ turkish ] = "$(ARG1) deðiþti";
        Text[ language_user1 ] = " ";
    };
    String ERR_CODE ( ERRCODE_CLASS_PATH , ERR_AUTOPATH_ERROR )
    {
        TEXT = "$(ARG1) existiert nicht" ;
        TEXT [ English ] = "$(ARG1) does not exist" ;
        Text [ dutch ] = "$(ARG1) bestaat niet" ;
        Text [ english_us ] = "$(ARG1) does not exist" ;
        Text [ italian ] = "$(ARG1) non esiste" ;
        Text [ spanish ] = "$(ARG1) no existe" ;
        Text [ french ] = "$(ARG1) n'existe pas" ;
        Text [ swedish ] = "$(ARG1) existerar inte" ;
        Text [ danish ] = "$(ARG1) eksisterer ikke" ;
        Text [ portuguese ] = "$(ARG1) não existe" ;
        Text [ portuguese_brazilian ] = "$(ARG1) existiert nicht" ;
        Text[ chinese_simplified ] = "$(ARG1) ²»´æÔÚ";
        Text[ russian ] = "$(ARG1) íå ñóùåñòâóåò";
        Text[ polish ] = "$(ARG1) nie istnieje";
        Text[ japanese ] = "$(ARG1)‚Í‚ ‚è‚Ü‚¹‚ñ";
        Text[ chinese_traditional ] = "$(ARG1) ¤£¦s¦b";
        Text[ arabic ] = "$(ARG1) ÛíÑ ãæÌæÏ";
        Text[ greek ] = "$(ARG1) äåí õðÜñ÷åé";
        Text[ korean ] = "$(ARG1) ÀÌ Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù.";
        Text[ turkish ] = "$(ARG1) mevcut deðil";
        Text[ language_user1 ] = " ";
    };
    String ERR_CODE ( ERRCODE_CLASS_NONE , ERR_TBLSPLIT_ERROR )
    {
        /* ### ACHTUNG: Neuer Text in Resource? Zellen können nicht mehr geteilt werden : Zellen k÷nnen nicht mehr geteilt werden */
        TEXT = "Zellen können nicht mehr geteilt werden" ;
        TEXT [ English ] = "Cells can not be split" ;
        Text [ dutch ] = "Cellen kunnen niet meer worden gesplitst" ;
        Text [ english_us ] = "Cells cannot be further split" ;
        Text [ italian ] = "Non è più possibile dividere le celle" ;
        Text [ spanish ] = "Las celdas no se pueden dividir más" ;
        Text [ french ] = "Impossible de scinder (davantage) les cellules" ;
        Text [ swedish ] = "Cellerna kan inte delas mer" ;
        Text [ danish ] = "Cellerne kan ikke deles mere" ;
        Text [ portuguese ] = "É impossível dividir mais as células" ;
        Text [ portuguese_brazilian ] = "Zellen können nicht mehr geteilt werden" ;
        Text[ chinese_simplified ] = "ÎÞ·¨·Ö¸ôµ¥Ôª¸ñ";
        Text[ russian ] = "Ðàçáèòü ÿ÷åéêè áîëüøå íåâîçìîæíî";
        Text[ polish ] = "Komórek nie mo¿na podzieliæ";
        Text[ japanese ] = "‚±‚êˆÈã¾Ù‚𕪊„‚Å‚«‚Ü‚¹‚ñ";
        Text[ chinese_traditional ] = "µLªk¤À¶}Àx¦s®æ";
        Text[ arabic ] = "áÇ íãßä ÊÞÓíã ÇáÎáÇíÇ ÃßËÑ ãä Ðáß";
        Text[ greek ] = "Ç åðéðëÝïí äéáßñåóç ôùí êåëéþí åßíáé áäýíáôç";
        Text[ korean ] = "¼¿ÀÌ ´õÀÌ»ó ³ª´©¾îÁöÁö ¾Ê½À´Ï´Ù.";
        Text[ turkish ] = "Hücreler daha fazla bölünemiyor";
        Text[ language_user1 ] = " ";
    };
    String ERR_CODE ( ERRCODE_CLASS_NONE , ERR_TBLINSCOL_ERROR )
    {
        /* ### ACHTUNG: Neuer Text in Resource? weitere Spalten können nicht eingefügt werden : weitere Spalten k÷nnen nicht eingef³gt werden */
        TEXT = "weitere Spalten können nicht eingefügt werden" ;
        TEXT [ English ] = "more Columns cannot be insertet" ;
        Text [ dutch ] = "Meer kolommen kunnen niet worden ingevoegd" ;
        Text [ english_us ] = "Additional columns cannot be inserted" ;
        Text [ italian ] = "Impossibile inserire altre colonne." ;
        Text [ spanish ] = "No se pueden insertar columnas adicionales" ;
        Text [ french ] = "Impossible d'insérer des colonnes supplémentaires" ;
        Text [ swedish ] = "Ytterligare kolumner kan inte infogas" ;
        Text [ danish ] = "Det er ikke muligt at indsætte flere kolonner" ;
        Text [ portuguese ] = "Impossível inserir colunas adicionais" ;
        Text [ portuguese_brazilian ] = "weitere Spalten können nicht eingefügt werden" ;
        Text[ chinese_simplified ] = "ÎÞ·¨²åÈëÆäËüµÄÁÐ";
        Text[ russian ] = "Äîïîëíèòåëüíûå ñòîëáöû âñòàâèòü íåâîçìîæíî";
        Text[ polish ] = "dodatkowych kolumn nie mo¿na wstawiæ";
        Text[ japanese ] = "’ljÁ‚Ì—ñ‚ð‘}“ü‚Å‚«‚Ü‚¹‚ñ";
        Text[ chinese_traditional ] = "µLªk´¡¤J¨ä¥¦Äæ";
        Text[ arabic ] = "áÇ íãßä ÅÏÑÇÌ ÇáãÒíÏ ãä ÇáÃÚãÏÉ";
        Text[ greek ] = "äåí ìðïñïýí íá åéóá÷èïýí ðåñéóóüôåñåò óôÞëåò";
        Text[ korean ] = "ºÎ°¡ÀûÀÎ ¿­ÀÌ »ðÀԵɼö ¾ø½À´Ï´Ù.";
        Text[ turkish ] = "Daha fazla sütun eklenemiyor";
        Text[ language_user1 ] = " ";
    };
    String ERR_CODE ( ERRCODE_CLASS_NONE , ERR_TBLDDECHG_ERROR )
    {
        TEXT = "Bei einer verknüpften Tabelle darf die Struktur nicht verändert werden" ;
        TEXT [ English ] = "The linked table could not be changed the structure" ;
        Text [ portuguese ] = "É impossível modificar a estrutura de uma tabela ligada" ;
        Text [ english_us ] = "The structure of a linked table cannot be modified" ;
        Text [ portuguese_brazilian ] = "Bei einer verknüpften Tabelle darf die Struktur nicht verändert werden" ;
        Text [ swedish ] = "Strukturen på en länkad tabell får inte ändras" ;
        Text [ danish ] = "En kædet tabels struktur må ikke ændres" ;
        Text [ italian ] = "In una tabella collegata non sono ammesse modifiche alla struttura." ;
        Text [ spanish ] = "No se puede modificar la estructura de una tabla vinculada" ;
        Text [ french ] = "La structure d'un tableau ne peut pas être modifiée s'il a fait l'objet d'un lien" ;
        Text [ dutch ] = "Bij een gekoppelde tabel mag de structuur niet worden veranderd." ;
        Text[ chinese_simplified ] = "²»Äܸü¸ÄÒ»¸öÁ´½ÓµÄ±í¸ñ½á¹¹";
        Text[ russian ] = "Èçìåíÿòü ñòðóêòóðó ñâÿçàííîé òàáëèöû íåëüçÿ";
        Text[ polish ] = "Przy po³¹czonej tabeli nie wolno zmieniaæ jej struktury";
        Text[ japanese ] = "ØÝ¸‚³‚ꂽ•\\‚̍\\‘¢‚͕ύX‚Å‚«‚Ü‚¹‚ñ";
        Text[ chinese_traditional ] = "¤£¯àÅܧó¤@­Ó³sµ²ªºªí®æµ²ºc";
        Text[ arabic ] = "áÇ íãßä ÊÚÏíá ÈäíÉ ÌÏæá ãÑÊÈØ";
        Text[ greek ] = "Äåí åßíáé äõíáôÞ ç áëëáãÞ äïìÞò åíüò óõíäåäåìÝíïõ ðßíáêá";
        Text[ korean ] = "¿¬°áµÈ Å×À̺íÀÇ ±¸Á¶°¡ ¼öÁ¤µÇ¾ú½À´Ï´Ù.";
        Text[ turkish ] = "Baðlantýlý bir tablonun yapýsý deðiþtirilmez";
        Text[ language_user1 ] = " ";
    };
     // -------------------- Warnings -----------------------------------
    String WARN_CODE ( ERRCODE_CLASS_READ , WARN_SWG_NO_DRAWINGS )
    {
        TEXT = "Es konnten keine Zeichnungen geladen werden" ;
        TEXT [ English ] = "No drawings could be read" ;
        Text [ english_us ] = "No drawings could be read" ;
        Text [ italian ] = "Non è stato possibile caricare alcun disegno" ;
        Text [ spanish ] = "No se pudo cargar ningún dibujo" ;
        Text [ french ] = "Impossible de charger des dessins" ;
        Text [ dutch ] = "Er konden geen tekeningen worden geladen" ;
        Text [ swedish ] = "Inga teckningar kunde laddas" ;
        Text [ danish ] = "Det var ikke muligt at indlæse nogen tegninger" ;
        Text [ portuguese ] = "Foi impossível carregar desenhos" ;
        Text [ portuguese_brazilian ] = "Es konnten keine Zeichnungen geladen werden" ;
        Text[ chinese_simplified ] = "ÎÞ·¨×°ÔØÍ¼Ïñ";
        Text[ russian ] = "Çàãðóçêà ðèñóíêîâ íåâîçìîæíà";
        Text[ polish ] = "¯adne rysunki nie mog³y zostaæ za³adowane";
        Text[ japanese ] = "}Œ`•`‰æ‚͓ǂݍž‚݂ł«‚Ü‚¹‚ñ‚Å‚µ‚½";
        Text[ chinese_traditional ] = "µLªk¸Ë¸ü¼v¹³";
        Text[ arabic ] = "ÊÚÐÑ ÊÍãíá ÃíÉ ÑÓæãÇÊ";
        Text[ greek ] = "Äåí Þôáí äõíáôÞ ç öüñôùóç ó÷åäßùí";
        Text[ korean ] = "±×¸®±â°¡ ÀÐÇôÁú ¼ö ¾ø½À´Ï´Ù.";
        Text[ turkish ] = "Çizim yüklenemedi";
        Text[ language_user1 ] = " ";
    };
    String WARN_CODE ( ERRCODE_CLASS_READ , WARN_WW6_FASTSAVE_ERR )
    {
        /* ### ACHTUNG: Neuer Text in Resource? Diese Datei wurde mit der WinWord-Option 'Schnellspeichern' gespeichert. Bitte schalten Sie in WinWord die Option 'Schnellspeichern zulassen' aus und speichern sie die Datei erneut mit WinWord : Diese Datei wurde mit der WinWord-Option ''Schnellspeichern'' gespeichert. Bitte schalten Sie in WinWord die Option ''Schnellspeichern zulassen'' aus und speichern sie die Datei erneut mit WinWord */
        /* ### ACHTUNG: Neuer Text in Resource? Diese Datei wurde mit der WinWord-Option 'Schnellspeichern' gespeichert. Bitte schalten Sie in WinWord die Option 'Schnellspeichern zulassen' aus und speichern sie die Datei erneut mit WinWord : Diese Datei wurde mit der WinWord-Option ''Schnellspeichern'' gespeichert. Bitte schalten Sie in WinWord die Option ''Schnellspeichern zulassen'' aus und speichern sie die Datei erneut mit WinWord */
        /* ### ACHTUNG: Neuer Text in Resource? Diese Datei wurde mit der WinWord-Option 'Schnellspeichern' gespeichert. Bitte schalten Sie in WinWord die Option 'Schnellspeichern zulassen' aus und speichern sie die Datei erneut mit WinWord : Diese Datei wurde mit der WinWord-Option ''Schnellspeichern'' gespeichert. Bitte schalten Sie in WinWord die Option ''Schnellspeichern zulassen'' aus und speichern sie die Datei erneut mit WinWord */
        /* ### ACHTUNG: Neuer Text in Resource? Diese Datei wurde mit der WinWord-Option 'Schnellspeichern' gespeichert. Bitte schalten Sie in WinWord die Option 'Schnellspeichern zulassen' aus und speichern sie die Datei erneut mit WinWord : Diese Datei wurde mit der WinWord-Option ''Schnellspeichern'' gespeichert. Bitte schalten Sie in WinWord die Option ''Schnellspeichern zulassen'' aus und speichern sie die Datei erneut mit WinWord */
        TEXT = "Diese Datei wurde mit der WinWord-Option 'Schnellspeichern' gespeichert. Bitte schalten Sie in WinWord die Option 'Schnellspeichern zulassen' aus und speichern sie die Datei erneut mit WinWord" ;
        TEXT [ English ] = "This file is stored with the WinWord-Option 'fastsave'. Please disable the WinWord option 'Allow Fast Saves' and use WinWord to save the file again" ;
        TEXT [ norwegian ] = "Denne filen er lagret med alternativet til WinWord 'hurtiglagre'. Sperr WinWord alternativet ' Tillat Hurtige Lagringer' og bruk WinWord for å lagre filen igjen" ;
        TEXT [ italian ] = "Questo file è stato salvato con l'opzione di Winword 'salvataggio veloce'. Disabilitate l'opzione di WinWord 'Salvataggio veloce' ed utilizzate WinWord per salvare di nuovo il file." ;
        TEXT [ portuguese_brazilian ] = "Este arquivo foi armazenado com a opção do  WinWord 'fastsave'. Por favor desative a opção do WinWord 'Allow Fast Saves' e utilize o WinWord para gravar novamente o arquivo" ;
        TEXT [ portuguese ] = "Este ficheiro foi guardado com a opção do WinWord \"Guardar rápido\". Desactive a opção do WinWord \"Permitir Guardar rápido\" e guarde novamente o ficheiro em WinWord" ;
        TEXT [ finnish ] = "Tämä tiedosto on tallennettu käyttäen WinWordin pikatallennusta. Poista pikatallennus käytöstä WinWordissa ja tallennatiedosto uudelleen" ;
        TEXT [ danish ] = "Denne fil er blevet gemt med WinWord-indstillingen 'Gem hurtigt'. Deaktiver venligst indstillingen 'Gem hutigt' og gem filen igen med WinWord." ;
        TEXT [ french ] = "Ce fichier a été enregistré à l'aide de l'option 'Enregistrement rapide' de WinWord. Veuillez désactiver cette option et utiliser WinWord pour enregistrer à nouveau le fichier." ;
        TEXT [ swedish ] = "Denna fil är sparad med WinWord-alternativet 'snabbspara'. Stäng av WinWord-alternativet 'Tillåt snabbspara' och spara filen med WinWord igen" ;
        TEXT [ dutch ] = "Dit bestand werd met de WinWord optie \"Snel opslaan\" opgeslagen. Schakel a.u.b in WinWord de optie \"Snel opslaan toestaan\" uit en sla het bestand opnieuw op met WinWord." ;
        TEXT [ spanish ] = "Este archivo ha sido guardado con la opción de WinWord 'guardar rápidamente' . Por favor desactive en WinWord la opción 'permitir guardar rápidamente' y guarde nuevamente el archivo con WinWord" ;
        TEXT [ english_us ] = "This file was saved with WinWord in 'Fast Save' mode. Please uncheck the option 'Allow Fast Saves' and save the file again." ;
        TEXT[ chinese_simplified ] = "Õâ¸öÎļþ´æÅ̲ÉÓõÄÊÇ WinWord Ñ¡Ïî '¿ìËÙ±£´æ'·½Ê½¡£ÇëÄúʧ»îÕâ¸öÑ¡ÏȻºóÔÚÖØÐ´æÅÌÕâ¸öÎļþ¡£";
        TEXT[ russian ] = "Ýòîò ôàéë ñîõðàíåí ïðè ïîìîùè ïàðàìåòðà WinWord 'Áûñòðîå ñîõðàíåíèå'. Ïîæàëóéñòà, îòêëþ÷èòå ïàðàìåòð 'Ðàçðåøèòü áûñòðîå ñîõðàíåíèå' è çàíîâî ñîõðàíèòå ýòîò ôàéë ñ ïîìîùüþ WinWord";
        TEXT[ polish ] = "Ten plik zosta³ zapisany za pomoc¹ opcji WinWord 'Szybkie zapisywanie'. Proszê wy³¹cz w WinWord opcjê 'Dopuœæ szybkie zapisywanie' i zapisz plik ponownie w WinWord.";
        TEXT[ japanese ] = "‚±‚Ì̧²Ù‚́AWinWordµÌß¼®Ý‚Ì'‚‘¬•Û‘¶'‚ŕۑ¶‚³‚ê‚Ä‚¢‚Ü‚·BWinWord‚̵Ìß¼®Ý '‚‘¬•Û‘¶' ‚ðµÌ‚É‚µ‚āA̧²Ù‚ðV‚½‚ÉWinWord‚ŕۑ¶‚µ‚ĉº‚³‚¢B";
        TEXT[ chinese_traditional ] = "Àx¦sÀɮױĥΪº¬O WinWord ¿ï¶µ '§Ö³tÀx¦s'¤è¦¡¡C½Ð±z¥¢¬¡³o­Ó¿ï¶µ¡MµM«á¦b­«·sÀx¦s³o­ÓÀɮסC";
        TEXT[ arabic ] = "Êã ÍÝÙ åÐÇ ÇáãáÝ Úä ØÑíÞ ÎíÇýÑ 'ÇáÍÝÙ ÇáÓÑíÚ' Ýí WinWord. ÇáÑÌÇÁ ÅíÞÇÝ ÎÇÕíÉ 'ÇáÓãÇÍ ÈÇáÍÝÙ ÇáÓÑíÚ' Ýí WinWord¡ Ëã  Þã ÈÍÝÙ ÇáãáÝ ãä ÌÏíÏ ÈæÇÓØÉ WinWord.";
        TEXT[ greek ] = "Ôï áñ÷åßï áõôü áðïèçêåýôçêå ìå ôçí åðéëïãÞ 'ÃñÞãïñç áðïèÞêåõóç' ôïõ WinWord. Ðáñáêáëþ áðåíåñãïðïéÞóåôå ôçí åðéëïãÞ áõôÞ ôïõ WinWord êáé áðïèçêåýóôå ôï áñ÷åßï îáíÜ óôï WinWord.";
        TEXT[ korean ] = "ÀÌ ÆÄÀÏÀº  WinWordÀÇ  'ºü¸¥ ÀúÀå' ¸ðµå·Î ÀúÀåµÇ¾î ÀÖ½À´Ï´Ù. ¿É¼Ç 'ºü¸¥ ÀúÀå Çã¿ë'À» ÇØÁ¦ÇÏ½Ã°í ÆÄÀÏÀ» ´Ù½Ã ÀúÀåÇϽʽÿÀ.";
        TEXT[ turkish ] = "Bu dosya WinWord seçeneði 'Hýzlý kaydet' ile kaydedilmiþ. WinWord'de 'Hýzlý kaydetmeye olanak saðla' seçeneðini geçersiz kýlýp dosyayý yeniden WinWord ile kaydedin";
        TEXT[ language_user1 ] = " ";
    };
    String WARN_CODE ( ERRCODE_CLASS_READ , WARN_SWG_FEATURES_LOST )
    {
        TEXT = "Es konnten nicht alle Attribute gelesen werden" ;
        TEXT [ English ] = "Not all attributes could be read" ;
        Text [ dutch ] = "Niet alle attributen konden worden ingelezen" ;
        Text [ english_us ] = "Not all attributes could be read" ;
        Text [ italian ] = "Non è stato possibile leggere tutti gli attributi" ;
        Text [ spanish ] = "No se pudieron leer todos los atributos" ;
        Text [ french ] = "Impossible de lire tous les attributs" ;
        Text [ swedish ] = "Alla attribut kunde inte läsas" ;
        Text [ danish ] = "Det var ikke muligt at læse alle attributter" ;
        Text [ portuguese ] = "Foi impossível ler todos os atributos" ;
        Text [ portuguese_brazilian ] = "Es konnten nicht alle Attribute gelesen werden" ;
        Text[ chinese_simplified ] = "ÎÞ·¨¶ÁÈ¡ËùÓеÄÊôÐÔ";
        Text[ russian ] = "Âñå àòðèáóòû ïðî÷èòàòü íåâîçìîæíî";
        Text[ polish ] = "Nie wszystkie atrybuty mog³y zostaæ odczytane";
        Text[ japanese ] = "‚·‚ׂĂ̑®«‚ð“ǂݎæ‚邱‚Ƃ͂ł«‚Ü‚¹‚ñ‚Å‚µ‚½";
        Text[ chinese_traditional ] = "µLªkŪ¨ú©Ò¦³ªºÄÝ©Ê";
        Text[ arabic ] = "ÊÚÐÑ ÞÑÇÁÉ ßá ÇáÓãÇÊ";
        Text[ greek ] = "Äåí Þôáí äõíáôÞ ç áíÜãíùóç üëùí ôùí ÷áñáêôçñéóôéêþí";
        Text[ korean ] = "¸ðµç ¼Ó¼ºÀÌ ÀÐÇô Áú¼ö ¾ø½À´Ï´Ù.";
        Text[ turkish ] = "Tüm öznitelikler okunamadý";
        Text[ language_user1 ] = " ";
    };
    String WARN_CODE ( ERRCODE_CLASS_WRITE , WARN_SWG_FEATURES_LOST )
    {
        TEXT = "Es konnten nicht alle Attribute geschrieben werden" ;
        TEXT [ English ] = "Not all attributes could be written" ;
        Text [ english_us ] = "Not all attributes could be recorded" ;
        Text [ italian ] = "Non è stato possibile scrivere tutti gli attributi" ;
        Text [ spanish ] = "No se pudieron grabar todos los atributos" ;
        Text [ french ] = "Impossible d'écrire tous les attributs" ;
        Text [ dutch ] = "Niet alle attributen konden worden geschreven" ;
        Text [ swedish ] = "Alla attribut kunde inte skrivas" ;
        Text [ danish ] = "Det var ikke muligt at skrive alle attributter" ;
        Text [ portuguese ] = "Foi impossível gravar todos os atributos" ;
        Text [ portuguese_brazilian ] = "Es konnten nicht alle Attribute geschrieben werden" ;
        Text[ chinese_simplified ] = "²»ÄÜдÈëËùÓеÄÊôÐÔ";
        Text[ russian ] = "Âñå àòðèáóòû çàïèñàòü íåâîçìîæíî";
        Text[ polish ] = "Nie wszystkie atrybuty mog³y zostaæ zapisane";
        Text[ japanese ] = "‚·‚ׂĂ̑®«‚ð‹L˜^‚·‚邱‚Ƃ͂ł«‚Ü‚¹‚ñ‚Å‚µ‚½";
        Text[ chinese_traditional ] = "¤£¯à¼g¤J©Ò¦³ªºÄÝ©Ê";
        Text[ arabic ] = "ÊÚÐÑ ßÊÇÈÉ ßá ÇáÓãÇÊ";
        Text[ greek ] = "Äåí Þôáí äõíáôÞ ç êáôáãñáöÞ üëùí ôùí ÷áñáêôçñéóôéêþí";
        Text[ korean ] = "¸ðµç ¼Ó¼ºÀÌ ±â·ÏµÉ ¼ö ¾ø½À´Ï´Ù.";
        Text[ turkish ] = "Tüm öznitelikler yazýlamadý";
        Text[ language_user1 ] = " ";
    };
    String WARN_CODE ( ERRCODE_CLASS_READ , WARN_SWG_OLE )
    {
        /* ### ACHTUNG: Neuer Text in Resource? Einige OLE-Objekte konnten nur als Grafiken übernommen werden : Einige OLE-Objekte konnten nur als Grafiken ³bernommen werden */
        TEXT = "Einige OLE-Objekte konnten nur als Grafiken übernommen werden" ;
        TEXT [ English ] = "Some OLE Objects could only be loaded as graphics" ;
        Text [ dutch ] = "Enkele OLE-objecten konden alleen als grafische objecten worden overgenomen" ;
        Text [ english_us ] = "Some OLE objects could only be loaded as graphics" ;
        Text [ italian ] = "Alcuni oggetti OLE sono stati prelevati solo come immagini" ;
        Text [ spanish ] = "Algunos objetos OLE se pudieron incluir solo como imágenes" ;
        Text [ french ] = "Certains objets OLE ont pu être chargés uniquement sous forme d'images" ;
        Text [ swedish ] = "Några OLE-objekt kunde bara övertas som grafiker" ;
        Text [ danish ] = "Nogle OLE-objekter kunne kun overtages som grafik" ;
        Text [ portuguese ] = "Alguns dos objectos OLE puderam ser apenas carregados como imagens" ;
        Text [ portuguese_brazilian ] = "Einige OLE-Objekte konnten nur als Grafiken übernommen werden" ;
        Text[ chinese_simplified ] = "һЩ OLE ¶ÔÏóÖ»ÄÜÒÔͼÏñ·½Ê½×°ÔØ";
        Text[ russian ] = "Çàãðóçêà íåêîòîðûõ îáúåêòîâ OLE âîçìîæíà òîëüêî â êà÷åñòâå ðèñóíêîâ";
        Text[ polish ] = "Niektóre obiekty OLE mog¹ zostaæ za³adowane tylko jako grafiki";
        Text[ japanese ] = "‚¢‚­‚‚©‚ÌOLEµÌÞ¼Þª¸Ä‚͸Þׯ̨¯¸½‚Æ‚µ‚Ă̂ݓǂݍž‚Þ‚±‚Æ‚ª‚Å‚«‚Ü‚·";
        Text[ chinese_traditional ] = "¤@¨Ç OLE-ª«¥ó¥u¯à¥H¹Ï¤ù¤è¦¡¸Ë¸ü";
        Text[ arabic ] = "áã íßä ãä Çáããßä ÊØÈíÞ ÈÚÖ ßÇÆäÇÊ OLE ÅáÇ ßÑÓæãÇÊ";
        Text[ greek ] = "ÌåñéêÜ áíôéêåßìåíá OLE ìðüñåóáí íá öïñôùèïýí ìüíï ùò ãñáöéêÜ";
        Text[ korean ] = "¾à°£ÀÇ OLE °³Ã¼µéÀº ±×·¡ÇÈÀ¸·Î¸¸ ·Îµå µÉ ¼ö ÀÖ½À´Ï´Ù.";
        Text[ turkish ] = "Bazý OLE nesneleri yalnýzca grafik olarak yüklenebildi";
        Text[ language_user1 ] = " ";
    };
    String WARN_CODE ( ERRCODE_CLASS_WRITE , WARN_SWG_OLE )
    {
        /* ### ACHTUNG: Neuer Text in Resource? Einige OLE-Objekte konnten nur als Grafiken übernommen werden : Einige OLE-Objekte konnten nur als Grafiken ³bernommen werden */
        TEXT = "Einige OLE-Objekte konnten nur als Grafiken übernommen werden" ;
        TEXT [ English ] = "Some OLE Objects could only be saved as graphics" ;
        Text [ english_us ] = "Some OLE objects could only be saved as graphics" ;
        Text [ italian ] = "Alcuni oggetti OLE sono stati prelevati solo come immagini" ;
        Text [ spanish ] = "Algunos objetos OLE se pudieron incluir solo como imágenes" ;
        Text [ french ] = "Certains objets OLE ont pu être chargés uniquement sous forme d'images" ;
        Text [ dutch ] = "Enkele OLE-objecten konden alleen als grafische objecten worden overgenomen" ;
        Text [ swedish ] = "Några OLE-objekt kunde bara övertas som grafiker" ;
        Text [ danish ] = "Nogle OLE-objekter kunne kun overtages som grafik" ;
        Text [ portuguese ] = "Alguns dos objectos OLE foram carregados apenas como imagens" ;
        Text [ portuguese_brazilian ] = "Einige OLE-Objekte konnten nur als Grafiken übernommen werden" ;
        Text[ chinese_simplified ] = "һЩ OLE ¶ÔÏóÎÞ·¨±»´æÅÌΪͼÐÎ";
        Text[ russian ] = "Çàãðóçêà íåêîòîðûõ îáúåêòîâ OLE âîçìîæíà òîëüêî â êà÷åñòâå ðèñóíêîâ";
        Text[ polish ] = "Niektóre obiekty OLE mog³y zostaæ za³adowane tylko jako grafiki";
        Text[ japanese ] = "‚¢‚­‚‚©‚ÌOLEµÌÞ¼Þª¸Ä‚͸Þ×̨¯¸½‚Æ‚µ‚Ă̂ݕۑ¶‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·";
        Text[ chinese_traditional ] = "¤@¨Ç OLE-ª«¥óµLªk³QÀx¦s¬°¹Ï¤ù";
        Text[ arabic ] = "áã íßä ãä Çáããßä ÊØÈíÞ ÈÚÖ ßÇÆäÇÊ OLE ÅáÇ ßÑÓæãÇÊ";
        Text[ greek ] = "ÌåñéêÜ áíôéêåßìåíá OLE ìðüñåóáí íá öïñôùèïýí ìüíï ùò ãñáöéêÜ";
        Text[ korean ] = "¾à°£ÀÇ OLE °³Ã¼µéÀº ±×·¡ÇÈÀ¸·Î¸¸ ÀúÀå µÉ ¼ö ÀÖ½À´Ï´Ù.";
        Text[ turkish ] = "Bazý OLE nesneleri yalnýzca grafik olarak yüklenebildi";
        Text[ language_user1 ] = " ";
    };
    String WARN_CODE ( ERRCODE_CLASS_READ , WARN_SWG_POOR_LOAD )
    {
        /* ### ACHTUNG: Neuer Text in Resource? Dokument konnte nicht vollständig geladen werden : Dokument konnte nicht vollstõndig geladen werden */
        TEXT = "Dokument konnte nicht vollständig geladen werden" ;
        TEXT [ English ] = "Document could not be loaded completely" ;
        Text [ dutch ] = "Document kon niet volledig worden geladen" ;
        Text [ english_us ] = "Document could not be completely loaded" ;
        Text [ italian ] = "Non è stato possibile caricare il file completamente" ;
        Text [ spanish ] = "No se pudo cargar completamente el documento" ;
        Text [ french ] = "Le document n'a pas pu être chargé dans son intégralité" ;
        Text [ swedish ] = "Dokumentet kunde inte laddas fullständigt" ;
        Text [ danish ] = "Det var ikke muligt at indlæse dokumentet helt" ;
        Text [ portuguese ] = "Foi impossível carregar o documento completamente" ;
        Text [ portuguese_brazilian ] = "Dokument konnte nicht vollständig geladen werden" ;
        Text[ chinese_simplified ] = "ÎÞ·¨ÍêÈ«×°ÔØÎĵµ";
        Text[ russian ] = "Ïîëíîñòüþ çàãðóçèòü äîêóìåíò íåâîçìîæíî";
        Text[ polish ] = "Dokument nie móg³ zostaæ ca³kowicie za³adowany";
        Text[ japanese ] = "ÄÞ·­ÒÝÄ‚ðŠ®‘S‚ɓǂݍž‚݂ł«‚Ü‚¹‚ñ‚Å‚µ‚½";
        Text[ chinese_traditional ] = "µLªk§¹¥þ¸Ë¸ü¤å¥ó";
        Text[ arabic ] = "ÊÚÐÑ ÊÍãíá ÇáãÓÊäÏ ÈÔßá ÊÇã";
        Text[ greek ] = "Äåí Þôáí äõíáôÞ ç öüñôùóç ïëüêëçñïõ ôïõ åããñÜöïõ";
        Text[ korean ] = "¹®¼­°¡ ¿ÏÀüÈ÷ ·ÎµåµÇÁö ¾Ê¾Ò½À´Ï´Ù.";
        Text[ turkish ] = "Belge tümüyle yüklenemedi";
        Text[ language_user1 ] = " ";
    };
    String WARN_CODE ( ERRCODE_CLASS_WRITE , WARN_SWG_POOR_LOAD )
    {
        /* ### ACHTUNG: Neuer Text in Resource? Dokument konnte nicht vollständig gespeichert werden : Dokument konnte nicht vollstõndig gespeichert werden */
        TEXT = "Dokument konnte nicht vollständig gespeichert werden" ;
        TEXT [ English ] = "Document could not be saved completely" ;
        Text [ english_us ] = "Document could not be completely saved" ;
        Text [ italian ] = "Non è stato possibile salvare il file completamente" ;
        Text [ spanish ] = "No se pudo guardar completamente el documento" ;
        Text [ french ] = "Le document n'a pas pu être enregistré dans son intégralité" ;
        Text [ dutch ] = "Document kon niet volledig worden opgeslagen" ;
        Text [ swedish ] = "Dokumentet kunde inte sparas fullständigt" ;
        Text [ danish ] = "Det var ikke muligt at gemme dokumentet helt" ;
        Text [ portuguese ] = "Foi impossível guardar o documento completamente" ;
        Text [ portuguese_brazilian ] = "Dokument konnte nicht vollständig gespeichert werden" ;
        Text[ chinese_simplified ] = "ÎÞ·¨ÍêÕûµØ´æÅÌÎĵµ";
        Text[ russian ] = "Ïîëíîñòüþ ñîõðàíèòü äîêóìåíò íåâîçìîæíî";
        Text[ polish ] = "Dokument nie móg³ zostaæ ca³kowicie zapisany";
        Text[ japanese ] = "ÄÞ·­ÒÝÄ‚ðŠ®‘S‚ɕۑ¶‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½";
        Text[ chinese_traditional ] = "µLªk§¹¾ãÀx¦s¤å¥ó";
        Text[ arabic ] = "ÊÚÐÑ ÍÝÙ ÇáãÓÊäÏ ÈÔßá ÊÇã";
        Text[ greek ] = "Äåí Þôáí äõíáôÞ ç áðïèÞêåõóç ïëüêëçñïõ ôïõ åããñÜöïõ";
        Text[ korean ] = "¹®¼­°¡ ¿ÏÀüÈ÷ ÀúÀåµÇÁö ¾Ê¾Ò½À´Ï´Ù.";
        Text[ turkish ] = "Belge tümüyle kaydedilemedi";
        Text[ language_user1 ] = " ";
    };
    String WARN_CODE ( ERRCODE_CLASS_WRITE , WARN_SWG_HTML_NO_MACROS)
    {
        Text = "Das HTML-Dokument enthält StarBasic Makros.\nSie wurden mit den aktuellen Exporteinstellungen nicht gespeichert." ;
        Text [ English ] = "This HTML document contains StarBasic macros.\nThey were not saved because of the current export options." ;
        Text[ english_us ] = "This HTML document contains StarOffice Basic macros.\nThey were not saved with the current export settings.";
        Text[ portuguese ] = "Este documento HTML contém macros StarOffice Basic.\nEstas não foram guardadas com as predefinições de exportação activas.";
        Text[ russian ] = "Ýòîò äîêóìåíò HTML ñîäåðæèò ìàêðîñû StarOffice Basic.\nÎíè íå ñîõðàíèëèñü ñ òåêóùèìè íàñòðîéêàìè ýêñïîðòà.";
        Text[ greek ] = "Ôï áñ÷åßï HTML ðåñéÝ÷åé ìáêñïåíôïëÝò ôïõ StarOffice Basic.\nÁõôÝò äåí áðïèçêåýôçêáí ìå ôéò ôñÝ÷ïõóåò ñõèìßóåéò åéóáãùãÞò.";
        Text[ dutch ] = "Dit HTML document bevat StarOffice Basic-macro's.\nDeze konden niet worden opgeslagen met de actuele exportinstellingen.";
        Text[ french ] = "Le document HTML contient des macros StarOffice Basic.\nCelles-ci n'ont pas été enregistrées avec les paramètres d'export actifs.";
        Text[ spanish ] = "El documento HTML contiene macros StarOffice Basic.\nNo se guardaron con la configuración actual de exportación.";
        Text[ italian ] = "Il documento HTML contiene macro StarOffice Basic che\nnon sono state salvate con le impostazioni attuali di esportazione.";
        Text[ danish ] = "Dette HTML-dokument indeholder StarOffice Basic-makroer.\nDe blev ikke gemt med de aktuelle eksportindstillinger.";
        Text[ swedish ] = "HTML-dokumentet innehåller StarOffice Basic-makron.\nDe sparades inte med de aktuella exportinställningarna.";
        Text[ polish ] = "Dokument HTML zawiera Makra StarOffice Basic.\nNie zosta³y one zapisane razem z aktualnymi ustawieniami ekspotru.";
        Text[ portuguese_brazilian ] = "This HTML document contains StarOffice Basic macros.\nThey were not saved because of the current export options.";
        Text[ japanese ] = "‚±‚ÌHTMLÄÞ·­ÒÝĂÍStarOffice Basic ϸۂðŠÜ‚ñ‚Å‚¢‚Ü‚·B\n‚»‚ê‚ç‚ÍŒ»Ý‚Ì´¸½Î߰Đݒè‚ł͕ۑ¶‚³‚ê‚Ä‚¢‚Ü‚¹‚ñB";
        Text[ korean ] = "ÀÌ HTML ¹®¼­´Â StarOffice Basic ¸ÅÅ©·Î¸¦ Æ÷ÇÔÇϰí ÀÖ½À´Ï´Ù.\nÇöÀçÀÇ º¸³»±â ¼³Á¤À¸·Î´Â ¸ÅÅ©·Î°¡ ÀúÀåµÇÁö ¾Ê½À´Ï´Ù.";
        Text[ chinese_simplified ] = "Õâ¸öHTMLÎĵµº¬ÓÐStarOffice Basicºê¡£\nÓÉÓÚµ±Ç°µÄÊä³öÉ趨¶ø²»ÄÜ´æÅÌÕâЩºê¡£";
        Text[ chinese_traditional ] = "HTML ¤å¥ó§t¦³ StarOffice Basic ¥¨¶°¡C\n¦]·í«eªº¿é¥X³]©w¦Ó¤£¯àÀx¦s¤å¥ó¡C";
        Text[ arabic ] = "íÍÊæí ÇáãÓÊäÏ HTML Úáì æÍÏÇÊ ãÇßÑæ StarOffice Basic.\náã íÊã ÍÝÙåÇ ÈÅÚÏÇÏÇÊ ÇáÊÕÏíÑ ÇáÍÇáíÉ.";
        Text[ turkish ] = "HTML belgesinde StarBasic makrolarý var.\nBu makrolar, yürürlükteki verme ayarlarý ile kaydedilmemiþ.";
        Text[ language_user1 ] = " ";
    };
};




diff --git a/sw/source/ui/app/mainwn.cxx b/sw/source/ui/app/mainwn.cxx
new file mode 100644
index 0000000..9efa9e5
--- /dev/null
+++ b/sw/source/ui/app/mainwn.cxx
@@ -0,0 +1,343 @@
/*************************************************************************
 *
 *  $RCSfile: mainwn.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:31 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop


#ifndef _SHL_HXX //autogen
#include <tools/shl.hxx>
#endif
#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif
#ifndef _SVARRAY_HXX
#include <svtools/svstdarr.hxx>
#endif
#ifndef _SFX_PROGRESS_HXX //autogen
#include <sfx2/progress.hxx>
#endif
#ifndef _RESID_HXX //autogen
#include <vcl/resid.hxx>
#endif

#ifndef _SWDOCSH_HXX //autogen
#include <docsh.hxx>
#endif
#ifndef _SWMODULE_HXX //autogen
#include <swmodule.hxx>
#endif
#include "swtypes.hxx"

class SwDocShell;

struct SwProgress
{
    long nStartValue,
         nStartCount;
    SwDocShell  *pDocShell;
    SfxProgress *pProgress;
};

static SvPtrarr *pProgressContainer = 0;

SwProgress *lcl_SwFindProgress( SwDocShell *pDocShell )
{
    for ( USHORT i = 0; i < pProgressContainer->Count(); ++i )
    {
        SwProgress *pTmp = (SwProgress*)(*pProgressContainer)[i];
        if ( pTmp->pDocShell == pDocShell )
            return pTmp;
    }
    return 0;
}


void StartProgress( USHORT nMessResId, long nStartValue, long nEndValue,
                    SwDocShell *pDocShell )
{
    if( !SW_MOD()->IsEmbeddedLoadSave() )
    {
        SwProgress *pProgress = 0;

        if ( !pProgressContainer )
            pProgressContainer = new SvPtrarr( 2, 2 );
        else
        {
            if ( 0 != (pProgress = lcl_SwFindProgress( pDocShell )) )
                ++pProgress->nStartCount;
        }
        if ( !pProgress )
        {
            pProgress = new SwProgress;
            pProgress->pProgress = new SfxProgress( pDocShell,
                                                    SW_RESSTR(nMessResId),
                                                    nEndValue - nStartValue,
                                                    FALSE,
                                                    TRUE );
            pProgress->nStartCount = 1;
            pProgress->pDocShell = pDocShell;
            pProgressContainer->Insert( (void*)pProgress, 0 );
        }
        pProgress->nStartValue = nStartValue;
    }
}


void SetProgressState( long nPosition, SwDocShell *pDocShell )
{
    if( pProgressContainer && !SW_MOD()->IsEmbeddedLoadSave() )
    {
        SwProgress *pProgress = lcl_SwFindProgress( pDocShell );
        if ( pProgress )
            pProgress->pProgress->SetState(nPosition - pProgress->nStartValue);
    }
}


void EndProgress( SwDocShell *pDocShell )
{
    if( pProgressContainer && !SW_MOD()->IsEmbeddedLoadSave() )
    {
        SwProgress *pProgress = 0;
        USHORT i;
        for ( i = 0; i < pProgressContainer->Count(); ++i )
        {
            SwProgress *pTmp = (SwProgress*)(*pProgressContainer)[i];
            if ( pTmp->pDocShell == pDocShell )
            {
                pProgress = pTmp;
                break;
            }
        }

        if ( pProgress && 0 == --pProgress->nStartCount )
        {
            pProgress->pProgress->Stop();
            pProgressContainer->Remove( i );
            delete pProgress->pProgress;
            delete pProgress;
            if ( !pProgressContainer->Count() )
                delete pProgressContainer, pProgressContainer = 0;
        }
    }
}


void SetProgressText( USHORT nId, SwDocShell *pDocShell )
{
    if( pProgressContainer && !SW_MOD()->IsEmbeddedLoadSave() )
    {
        SwProgress *pProgress = lcl_SwFindProgress( pDocShell );
        if ( pProgress )
            pProgress->pProgress->SetStateText( 0, SW_RESSTR(nId) );
    }
}


void RescheduleProgress( SwDocShell *pDocShell )
{
    if( pProgressContainer && !SW_MOD()->IsEmbeddedLoadSave() )
    {
        SwProgress *pProgress = lcl_SwFindProgress( pDocShell );
        if ( pProgress )
            pProgress->pProgress->Reschedule();
    }
}

/************************************************************************
    $Log: not supported by cvs2svn $
    Revision 1.44  2000/09/18 16:05:11  willem.vandorp
    OpenOffice header added.

    Revision 1.43  2000/02/11 14:42:46  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.42  2000/01/17 14:06:30  jp
    Bug #71812#: SetProgress call operator==() and not operator=()

    Revision 1.41  2000/01/05 18:21:57  jp
    Bug #71524#: EndProgress call operator==() and not operator=()

    Revision 1.40  1999/06/29 07:43:54  MA
    enable wait cursor


      Rev 1.39   29 Jun 1999 09:43:54   MA
   enable wait cursor

      Rev 1.38   28 Jun 1999 14:15:00   MA
   Blocking of Progress limited to one Document

      Rev 1.37   29 Jun 1998 17:16:14   MA
   #46809# Nachdem der SFX seinen Service noch immer nicht liefert der
   Hack jetzt auch in der aktuellen Version.

      Rev 1.36   28 Nov 1997 11:02:30   TJ
   include

      Rev 1.35   24 Nov 1997 14:22:44   MA
   includes

      Rev 1.34   09 Sep 1997 11:35:58   OS
   SwMainWin ueberfluessig

      Rev 1.33   01 Sep 1997 13:08:08   OS
   DLL-Umstellung

      Rev 1.32   08 Aug 1997 17:26:58   OM
   Headerfile-Umstellung

      Rev 1.31   06 Aug 1997 11:02:24   TRI
   GetpApp statt pApp

      Rev 1.30   13 Feb 1997 10:27:38   TRI
   includes

      Rev 1.29   10 Jan 1997 18:37:58   MA
   fix: Progress nicht zerstoren fuer Embedded

      Rev 1.28   14 Nov 1996 15:15:26   TRI
   includes

      Rev 1.27   08 Nov 1996 19:39:32   MA
   ResMgr

      Rev 1.26   09 Oct 1996 17:55:28   MA
   Progress

      Rev 1.25   29 Jul 1996 19:37:40   MA
   includes

      Rev 1.24   29 Feb 1996 12:55:52   OS
   im Close wird jetzt auch der ChartAutoPilot geschlossen

      Rev 1.23   14 Dec 1995 19:55:54   MIB
   neue Funktion Reschedule

      Rev 1.22   24 Nov 1995 16:56:50   OM
   PCH->PRECOMPILED

      Rev 1.21   22 Aug 1995 20:22:14   JP
   ueberfluessige includes entfernt

      Rev 1.20   15 Aug 1995 19:20:54   JP
   neu: IsEmbeddedFlag an SwWriterApp - keinen Progressbar anzeigen

      Rev 1.19   14 Aug 1995 18:26:44   MD
   SfxProgress-ctor erhaelt keinen ViewFrame mehr

      Rev 1.18   09 Aug 1995 21:41:34   ER
   static vor seg_eofglobals

      Rev 1.17   01 Aug 1995 19:35:22   OS
   StartWert fuer Progress auf 0 normalisieren

      Rev 1.16   20 Jul 1995 12:01:02   OS
   RechenleistenChildWindow im Close abschalten

      Rev 1.15   19 Jul 1995 17:31:12   OS
   Rechenleiste nicht mehr am Doc

      Rev 1.14   11 Jul 1995 15:43:58   OS
   Close ueberladen, um rechenleiste zu schliessen

      Rev 1.13   09 May 1995 11:29:44   OS
   -Disable/EnableCmdInterface

      Rev 1.12   08 May 1995 11:59:44   JP
   StatLineSetPercent: auf 0 - Pointer abfragen

      Rev 1.11   21 Apr 1995 19:04:10   JP
   BugId 12042: doppeltes Loeschen vom Pointer verhindern!

      Rev 1.10   11 Apr 1995 12:44:00   OS
   noch ein paar Kleinigkeiten

      Rev 1.9   07 Apr 1995 18:10:12   OS
   Rest auskommentiert

      Rev 1.8   07 Apr 1995 14:30:22   OS
   +SfxProgress

      Rev 1.7   26 Feb 1995 18:49:44   MA
   Laufbalken reanimiert.

      Rev 1.6   23 Feb 1995 22:18:00   ER
   sexport

      Rev 1.5   09 Jan 1995 16:06:34   ER
    del: globals hrc, app hrc

      Rev 1.4   25 Oct 1994 14:38:28   ER
   add: PCH

      Rev 1.3   20 Sep 1994 11:34:06   VB
   GetStarWriter inline, Flags nach swapp

      Rev 1.2   19 Sep 1994 15:25:00   MS
   Fix fuers Update
************************************************************************/


diff --git a/sw/source/ui/app/makefile.mk b/sw/source/ui/app/makefile.mk
new file mode 100644
index 0000000..a68c2d8
--- /dev/null
+++ b/sw/source/ui/app/makefile.mk
@@ -0,0 +1,179 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:31 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=..$/..$/..

PRJNAME=sw
TARGET=app

AUTOSEG=true

PROJECTPCH=ui_pch
PDBTARGET=ui_pch
PROJECTPCHSOURCE=..$/ui_1st$/ui_pch

LIBTARGET=NO

# future: DEMO\...

# --- Settings -----------------------------------------------------

.INCLUDE :  $(PRJ)$/inc$/swpre.mk
.INCLUDE :  settings.mk
.INCLUDE :  $(PRJ)$/inc$/sw.mk

.INCLUDE :  $(UPD)minor.mk
RSCUPDVER=$(RSCREVISION)(SV$(UPD)$(UPDMINOR))

IMGLST_SRS=$(SRS)$/app.srs
BMP_IN=$(PRJ)$/win/imglst

# --- Files --------------------------------------------------------

SRCFILES =\
        acc.src     \
        app.src     \
        mn.src      \
        mnport.src      \
        error.src


OBJFILES = \
        $(OBJ)$/swlib.obj   \
        $(OBJ)$/swcomlib.obj

SLOFILES = \
        $(SLO)$/appenv.obj   \
        $(SLO)$/apphdl.obj   \
        $(SLO)$/applab.obj   \
        $(SLO)$/appopt.obj   \
        $(SLO)$/docsh.obj    \
        $(SLO)$/docsh2.obj   \
        $(SLO)$/docshdrw.obj \
        $(SLO)$/docshini.obj \
        $(SLO)$/docst.obj    \
        $(SLO)$/docstyle.obj \
        $(SLO)$/mainwn.obj   \
        $(SLO)$/version.obj  \
        $(SLO)$/swmodule.obj \
        $(SLO)$/swmodul1.obj \
        $(SLO)$/swdll.obj	 \
        $(SLO)$/swwait.obj

EXCEPTIONSFILES= \
        $(SLO)$/swmodule.obj \
        $(SLO)$/swmodul1.obj \
        $(SLO)$/docsh2.obj   \

LIB1TARGET= $(SLB)$/app.lib

LIB1OBJFILES= \
        $(SLO)$/appenv.obj   \
        $(SLO)$/apphdl.obj   \
        $(SLO)$/applab.obj   \
        $(SLO)$/appopt.obj   \
        $(SLO)$/docsh.obj    \
        $(SLO)$/docsh2.obj   \
        $(SLO)$/docshdrw.obj \
        $(SLO)$/docshini.obj \
        $(SLO)$/docst.obj    \
        $(SLO)$/docstyle.obj \
        $(SLO)$/mainwn.obj   \
        $(SLO)$/swmodul1.obj \
        $(SLO)$/version.obj	 \
        $(SLO)$/swwait.obj


# --- Targets ------------------------------------------------------
.IF "$(depend)" == ""
all: \
    $(INCCOM)$/swdll0.hxx   \
     $(SLO)$/swdll.obj    \
    $(SLO)$/swmodule.obj \
    ALLTAR
.ENDIF

.INCLUDE :  target.mk

.IF "$(GUI)"=="OS2"
$(INCCOM)$/swdll0.hxx: makefile.mk
    echo #define DLL_NAME "sw$(UPD)$(DLLPOSTFIX)" >$@
.ENDIF

.IF "$(GUI)"=="MAC"
$(INCCOM)$/swdll0.hxx: makefile.mk
    echo "$(HASHMARK)define DLL_NAME ¶"sw$(UPD)$(DLLPOSTFIX).dll¶"" > $@
.ENDIF

.IF "$(GUIBASE)"=="WIN"
$(INCCOM)$/swdll0.hxx: makefile.mk
    echo #define DLL_NAME "sw$(UPD)$(DLLPOSTFIX).DLL" >$@
.ENDIF

.IF "$(GUI)"=="UNX"
$(INCCOM)$/swdll0.hxx: makefile.mk
    echo #define DLL_NAME \"libsw$(UPD)$(DLLPOSTFIX)$(DLLPOST)\" >$@
.ENDIF


$(SRS)$/app.srs: $(SOLARINCDIR)$/svx$/globlmn.hrc

diff --git a/sw/source/ui/app/mn.src b/sw/source/ui/app/mn.src
new file mode 100644
index 0000000..7d93f72
--- /dev/null
+++ b/sw/source/ui/app/mn.src
@@ -0,0 +1,599 @@
/*************************************************************************
 *
 *  $RCSfile: mn.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:31 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/



#include "swmn.hrc"

/*------------------------------------------------------------------------
 Beschreibung: Menu Window
------------------------------------------------------------------------*/


/*--Popups---------------------------------------------------------------*/

String MN_TEXT_POPUPMENU
{
    Text = "Text" ;
    Text [ English ] = "Text" ;
    Text [ norwegian ] = "Text" ;
    Text [ italian ] = "Testo" ;
    Text [ portuguese_brazilian ] = "Texto" ;
    Text [ portuguese ] = "Texto" ;
    Text [ finnish ] = "Teksti" ;
    Text [ danish ] = "Tekst" ;
    Text [ french ] = "Texte" ;
    Text [ swedish ] = "Text" ;
    Text [ dutch ] = "Tekst" ;
    Text [ spanish ] = "Texto" ;
    Text [ english_us ] = "Text" ;
    Text[ chinese_simplified ] = "ÎÄ×Ö";
    Text[ russian ] = "Òåêñò";
    Text[ polish ] = "tekst";
    Text[ japanese ] = "÷½Ä";
    Text[ chinese_traditional ] = "¤å¦r";
    Text[ arabic ] = "äÕ";
    Text[ greek ] = "Êåßìåíï";
    Text[ korean ] = "ÅØ½ºÆ®";
    Text[ turkish ] = "Metin";
};


String MN_TAB_POPUPMENU
{
    Text = "Tabelle" ;
    Text [ English ] = "Table" ;
    Text [ norwegian ] = "Table" ;
    Text [ italian ] = "Tabella" ;
    Text [ portuguese_brazilian ] = "Tabela" ;
    Text [ portuguese ] = "Tabela" ;
    Text [ finnish ] = "Taulukko" ;
    Text [ danish ] = "Tabel" ;
    Text [ french ] = "Tableau" ;
    Text [ swedish ] = "Tabell" ;
    Text [ dutch ] = "Tabel" ;
    Text [ spanish ] = "Tabla" ;
    Text [ english_us ] = "Table" ;
    Text[ chinese_simplified ] = "±í¸ñ";
    Text[ russian ] = "Òàáëèöà";
    Text[ polish ] = "tabela";
    Text[ japanese ] = "•\\";
    Text[ chinese_traditional ] = "ªí®æ";
    Text[ arabic ] = "ÌÏæá";
    Text[ greek ] = "Ðßíáêáò";
    Text[ korean ] = "ǥ";
    Text[ turkish ] = "Tablo";
};

Menu MN_TAB_POPUPMENU
{
    ItemList =
    {
        MN_RESET
        SEPARATOR ;
        MN_TEXT_ATTR
        SEPARATOR ;
        MenuItem
        {
            ITEM_FORMAT_CHAR_DLG
        };
        MenuItem
        {
            ITEM_FORMAT_PARA_DLG
        };
         //     MN_BB
        SEPARATOR ;
        MN_TAB1
        MN_TAB2
        MN_FRM_CAPTION_ITEM
         //     SEPARATOR;
        MenuItem
        {
            Identifier = FN_VIEW_TABLEGRID ;
            HelpID = FN_VIEW_TABLEGRID ;
            Text = "Tabellenbegrenz~ung" ;
            Text [ English ] = "Grid lines" ;
            Text [ norwegian ] = "Rutenettlinjer" ;
            Text [ italian ] = "Limte tabella" ;
            Text [ portuguese_brazilian ] = "Linhas da Grade" ;
            Text [ portuguese ] = "~Limites da tabela" ;
            Text [ finnish ] = "Taustaruudukko" ;
            Text [ danish ] = "Gitterlinjer" ;
            Text [ french ] = "Délimitations de t~ableau" ;
            Text [ swedish ] = "Tabellbegr~änsning" ;
            Text [ dutch ] = "Tabelbegren~zing" ;
            Text [ spanish ] = "~Límites de la tabla" ;
            Text [ english_us ] = "Table Limits" ;
            Text[ chinese_simplified ] = "±í¸ñ±ß½ç";
            Text[ russian ] = "Ãðàíèöû òàáëèöû";
            Text[ polish ] = "obramowanie tabeli";
            Text[ japanese ] = "•\\‚Ì‹«ŠE";
            Text[ chinese_traditional ] = "ªí®æÃä¬É";
            Text[ arabic ] = "ÍÏæÏ ÇáÌÏæá";
            Text[ greek ] = "¼~ñéá ðßíáêá";
            Text[ korean ] = "Ç¥ °æ°è";
            Text[ turkish ] = "Tablo sýnýrlamalarý";
        };
        MenuItem
        {
            Identifier = FN_SET_MODOPT_TBLNUMFMT ;
            HelpID = FN_SET_MODOPT_TBLNUMFMT ;
            Text = "Zahlen~erkennung" ;
            Text [ ENGLISH ] = "Number recognition" ;
            Text[ english_us ] = "~Number recognition";
            Text[ portuguese ] = "~Reconhecer números";
            Text[ russian ] = "Ðàñïîçíàíèå ÷èñëà";
            Text[ greek ] = "Áíáãíþñ~éóç áñéèìþí";
            Text[ dutch ] = "Getal~herkenning";
            Text[ french ] = "~Reconnaissance des nombres";
            Text[ spanish ] = "~Reconocimiento de número";
            Text[ italian ] = "Riconoscim~ento numeri";
            Text[ danish ] = "Talgenkendelse";
            Text[ swedish ] = "Talig~enkänning";
            Text[ polish ] = "Rozpoznawanie liczb";
            Text[ portuguese_brazilian ] = "Number recognition";
            Text[ japanese ] = "”Žš‚Ì”Fޝ";
            Text[ korean ] = "¼ýÀÚ ÀνÄ(~N)";
            Text[ chinese_simplified ] = "Êý×Öʶ±ð";
            Text[ chinese_traditional ] = "ÃѧO¼Æ¦r";
            Text[ arabic ] = "ÊÚÑíÝ ÇáÃÑÞÇã";
            Text[ turkish ] = "Sayý tanýma";
        };
    };
};


String MN_FRM_POPUPMENU
{
    Text = "Rahmen" ;
    Text [ English ] = "Frame" ;
    Text [ norwegian ] = "Ramme" ;
    Text [ italian ] = "Cornice" ;
    Text [ portuguese_brazilian ] = "Moldura" ;
    Text [ portuguese ] = "Moldura" ;
    Text [ finnish ] = "Kehys" ;
    Text [ danish ] = "Ramme" ;
    Text [ french ] = "Cadre" ;
    Text [ swedish ] = "Ram" ;
    Text [ dutch ] = "Kader" ;
    Text [ spanish ] = "Marco" ;
    Text [ english_us ] = "Frame" ;
    Text[ chinese_simplified ] = "¿ò";
    Text[ russian ] = "Ðàìêà";
    Text[ polish ] = "ramka";
    Text[ japanese ] = "÷½Ä ÎÞ¯¸½";
    Text[ chinese_traditional ] = "¤å¥»¤è¶ô";
    Text[ arabic ] = "ÅØÇÑ";
    Text[ greek ] = "Ðåñßãñáììá";
    Text[ korean ] = "ÇÁ·¹ÀÓ";
    Text[ turkish ] = "Çerçeve";
};

Menu MN_FRM_POPUPMENU
{
    ItemList =
    {
        MN_ALIGN_FRAME
        MN_MOUSE_FRAME_BEGIN
        MN_MOUSE_FRAME_END
        SEPARATOR ;
        MN_FRM
        MN_FRM_CAPTION_ITEM
    };
};

String MN_DRAW_POPUPMENU
{
    Text = "Grafik" ;
    Text [ English ] = "Graphic" ;
    Text [ norwegian ] = "Graphic" ;
    Text [ italian ] = "Grafico" ;
    Text [ portuguese_brazilian ] = "Gráfico" ;
    Text [ portuguese ] = "Imagem" ;
    Text [ finnish ] = "Kuva" ;
    Text [ danish ] = "Billede" ;
    Text [ french ] = "Image" ;
    Text [ swedish ] = "Grafik" ;
    Text [ dutch ] = "Afbeelding" ;
    Text [ spanish ] = "Imagen" ;
    Text [ english_us ] = "Graphic" ;
    Text[ chinese_simplified ] = "ͼÐÎ";
    Text[ russian ] = "Ðèñóíîê";
    Text[ polish ] = "Grafika";
    Text[ japanese ] = "¸Þ×̨¯¸";
    Text[ chinese_traditional ] = "¹Ï¤ù";
    Text[ arabic ] = "ÑÓæã";
    Text[ greek ] = "Ãñáöéêü";
    Text[ korean ] = "±×·¡ÇÈ";
    Text[ turkish ] = "Grafik";
};

Menu MN_DRAW_POPUPMENU
{
    ItemList =
    {
        MN_DRAW1
        MN_DRWTXTATTR
        MenuItem
        {
            ITEM_FORMAT_ATTR_TRANSFORM
        };
        SEPARATOR ;
        MN_DRAW5
        MN_WRAP_DRAW
        MN_ANCHOR
        MN_FRM_CAPTION_ITEM
        SEPARATOR ;
        MN_DRAW3
    };
};

String MN_DRAWFORM_POPUPMENU
{
    Text = "Kontrollfeld" ;
    Text [ English ] = "Control field" ;
    Text [ english_us ] = "Control" ;
    Text [ portuguese_brazilian ] = "Kontrollfeld" ;
    Text [ swedish ] = "Kontrollfält" ;
    Text [ danish ] = "Kontrolelement" ;
    Text [ italian ] = "Campo di controllo" ;
    Text [ spanish ] = "Campo de control" ;
    Text [ french ] = "Champ de contrôle" ;
    Text [ dutch ] = "Controleveld" ;
    Text [ portuguese ] = "Campo de controlo" ;
    Text[ chinese_simplified ] = "¿ØÖÆ";
    Text[ russian ] = "Ýëåìåíò óïðàâëåíèÿ";
    Text[ polish ] = "Pole kontrolne";
    Text[ japanese ] = "ºÝÄÛ°Ù";
    Text[ chinese_traditional ] = "±±¨î¶µ";
    Text[ arabic ] = "ÚäÕÑ ÊÍßã";
    Text[ greek ] = "Ðåäßï åëÝã÷ïõ";
    Text[ korean ] = "ÄÁÆ®·Ñ";
    Text[ turkish ] = "Komut alaný";
};

Menu MN_DRAWFORM_POPUPMENU
{
    ItemList =
    {
        MenuItem
        {
            ITEM_FORMAT_ATTR_TRANSFORM
        };
        MN_FORM
        SEPARATOR ;
        MN_DRAW6
        MN_WRAP_DRAW
        MN_ANCHOR
        SEPARATOR ;
        MN_DRAW3
    };
};

String MN_DRWTXT_POPUPMENU
{
    Text = "Zeichenobjekt Text" ;
    Text [ English ] = "Draw object text" ;
    Text [ english_us ] = "Draw Object text" ;
    Text [ italian ] = "Oggetto di disegno testo" ;
    Text [ spanish ] = "Texto del objeto de dibujo" ;
    Text [ french ] = "Texte objet de dessin" ;
    Text [ dutch ] = "Tekenobject tekst" ;
    Text [ swedish ] = "Ritobjekt text" ;
    Text [ danish ] = "Tegneobjekt tekst" ;
    Text [ portuguese ] = "Texto do objecto de desenho" ;
    Text [ portuguese_brazilian ] = "Zeichenobjekt Text" ;
    Text[ chinese_simplified ] = "»æÍ¼¶ÔÏó ÎÄ×Ö";
    Text[ russian ] = "Ãðàôè÷åñêèé îáúåêò Òåêñò";
    Text[ polish ] = "Tekst w obiekcie rysunkowym";
    Text[ japanese ] = "}Œ`µÌÞ¼Þª¸Ä@÷½Ä";
    Text[ chinese_traditional ] = "ø¹Ïª«¥ó ¤å¦r";
    Text[ arabic ] = "äÕ ßÇÆä ÑÓæãí";
    Text[ greek ] = "Êåßìåíï áíôéêåéìÝíïõ ó÷åäßáóçò";
    Text[ korean ] = "±×¸®±â °³Ã¼ ÅØ½ºÆ®";
    Text[ turkish ] = "Çizim nesnesi metni";
};

Menu MN_DRWTXT_POPUPMENU
{
    ItemList =
    {
        MN_RESET
        SEPARATOR ;
        MN_TEXT_ATTR
        SEPARATOR ;
        MN_DRWTXT
        MN_FRM_CAPTION_ITEM
    };
};

String MN_GRF_POPUPMENU
{
    Text = "Grafik" ;
    Text [ English ] = "Graphic" ;
    Text [ norwegian ] = "Graphic" ;
    Text [ italian ] = "Immagine" ;
    Text [ portuguese_brazilian ] = "Gráfico" ;
    Text [ portuguese ] = "Imagem" ;
    Text [ finnish ] = "Kuva" ;
    Text [ danish ] = "Billede" ;
    Text [ french ] = "Image" ;
    Text [ swedish ] = "Grafik" ;
    Text [ dutch ] = "Afbeelding" ;
    Text [ spanish ] = "Imagen" ;
    Text [ english_us ] = "Graphic" ;
    Text[ chinese_simplified ] = "ͼÐÎ";
    Text[ russian ] = "Ðèñóíîê";
    Text[ polish ] = "Grafika";
    Text[ japanese ] = "¸Þ×̨¯¸";
    Text[ chinese_traditional ] = "¹Ï¤ù";
    Text[ arabic ] = "ÑÓæã";
    Text[ greek ] = "Ãñáöéêü";
    Text[ korean ] = "±×·¡ÇÈ";
    Text[ turkish ] = "Grafik";
};

Menu MN_GRF_POPUPMENU
{
    ItemList =
    {
        MN_ALIGN_FRAME
        MN_MOUSE_FRAME_BEGIN
        MN_WRAP_CONTOUR
        MN_EDIT_CONTOUR
        MN_MOUSE_FRAME_END
        SEPARATOR ;
        MN_GRAFIC
        MN_FRM_CAPTION_ITEM
        MenuItem
        {
            ITEM_EDIT_IMAP
        };
    };
};

String MN_OLE_POPUPMENU
{
    Text = "Objekt" ;
    Text [ English ] = "Object" ;
    Text [ norwegian ] = "Object" ;
    Text [ italian ] = "Oggetto" ;
    Text [ portuguese_brazilian ] = "Objeto" ;
    Text [ portuguese ] = "Objecto" ;
    Text [ finnish ] = "Objekti" ;
    Text [ danish ] = "Objekt" ;
    Text [ french ] = "Objet" ;
    Text [ swedish ] = "Objekt" ;
    Text [ dutch ] = "Object" ;
    Text [ spanish ] = "Objeto" ;
    Text [ english_us ] = "Object" ;
    Text[ chinese_simplified ] = "¶ÔÏó";
    Text[ russian ] = "Îáúåêò";
    Text[ polish ] = "Obiekt";
    Text[ japanese ] = "µÌÞ¼Þª¸Ä";
    Text[ chinese_traditional ] = "ª«¥ó";
    Text[ arabic ] = "ßÇÆä";
    Text[ greek ] = "Áíôéêåßìåíï";
    Text[ korean ] = "°³Ã¼";
    Text[ turkish ] = "Nesne";
};


Menu MN_OLE_POPUPMENU
{
    ItemList =
    {
        MN_ALIGN_FRAME
        MN_MOUSE_FRAME_BEGIN
        MN_WRAP_CONTOUR
        MN_EDIT_CONTOUR
        MN_MOUSE_FRAME_END
        SEPARATOR ;
        MN_OLE
        MN_FRM_CAPTION_ITEM
    };
};

String MN_PPREVIEW_POPUPMENU
{
    Text = "Zeichenobjekt Text" ;
    Text [ English ] = "Draw object text" ;
    Text [ english_us ] = "Draw Object text" ;
    Text [ italian ] = "Oggetto di diesegno testo" ;
    Text [ spanish ] = "Texto del objeto de dibujo" ;
    Text [ french ] = "Texte objet de dessin" ;
    Text [ dutch ] = "Tekenobject tekst" ;
    Text [ swedish ] = "Ritobjekt text" ;
    Text [ danish ] = "Tegneobjekt" ;
    Text [ portuguese ] = "Texto do objecto de desenho" ;
    Text [ portuguese_brazilian ] = "Zeichenobjekt Text" ;
    Text[ chinese_simplified ] = "»æÍ¼¶ÔÏó ÎÄ×Ö";
    Text[ russian ] = "Òåêñò ãðàôè÷åñêîãî îáúåêòà";
    Text[ polish ] = "Tekst w obiekcie rysunkowym";
    Text[ japanese ] = "}Œ`µÌÞ¼Þª¸Ä ÷½Ä";
    Text[ chinese_traditional ] = "ø¹Ïª«¥ó ¤å¦r";
    Text[ arabic ] = "äÕ ßÇÆä ÑÓæãí";
    Text[ greek ] = "Êåßìåíï áíôéêåéìÝíïõ ó÷åäßáóçò";
    Text[ korean ] = "±×¸®±â °´Ã¼ ÅØ½ºÆ®";
    Text[ turkish ] = "Çizim nesnesi metni";
};

Menu MN_PPREVIEW_POPUPMENU
{
    ItemList =
    {
        MenuItem
        {
            Identifier = FN_PAGEUP ;
            HelpID = FN_PAGEUP ;
            Text = "Vorherige Seite" ;
            Text [ ENGLISH ] = "Previous page" ;
            Text [ dutch ] = "Vorige pagina" ;
            Text [ english_us ] = "Previous Page" ;
            Text [ italian ] = "Pagina precedente" ;
            Text [ spanish ] = "Página anterior" ;
            Text [ french ] = "Page précédente" ;
            Text [ swedish ] = "Föregående sida" ;
            Text [ danish ] = "Forrige side" ;
            Text [ portuguese_brazilian ] = "Vorherige Seite" ;
            Text [ portuguese ] = "Página anterior" ;
            Text[ chinese_simplified ] = "ÉÏÒ»Ò³";
            Text[ russian ] = "Ïðåäûäóùàÿ ñòðàíèöà";
            Text[ polish ] = "Poprzednia strona";
            Text[ japanese ] = "‘O‚ÌÍß°¼Þ";
            Text[ chinese_traditional ] = "¤W¤@­¶";
            Text[ arabic ] = "ÇáÕÝÍÉ ÇáÓÇÈÞÉ";
            Text[ greek ] = "Ðñïçãïýìåíç óåëßäá";
            Text[ korean ] = "ÀÌÀü ÆäÀÌÁö";
            Text[ turkish ] = "Önceki sayfa";
        };
        MenuItem
        {
            Identifier = FN_PAGEDOWN ;
            HelpID = FN_PAGEDOWN ;
            /* ### ACHTUNG: Neuer Text in Resource? Nächste Seite : Nõchste Seite */
            Text = "Nächste Seite" ;
            Text [ ENGLISH ] = "Next page" ;
            Text [ dutch ] = "Volgende pagina" ;
            Text [ english_us ] = "Next Page" ;
            Text [ italian ] = "Pagina successiva" ;
            Text [ spanish ] = "Página siguiente" ;
            Text [ french ] = "Page suivante" ;
            Text [ swedish ] = "Nästa sida" ;
            Text [ danish ] = "Næste side" ;
            Text [ portuguese_brazilian ] = "Nächste Seite" ;
            Text [ portuguese ] = "Página seguinte" ;
            Text[ chinese_simplified ] = "ÏÂÒ»Ò³";
            Text[ russian ] = "Ñëåäóþùàÿ ñòðàíèöà";
            Text[ polish ] = "Nastêpna strona";
            Text[ japanese ] = "ŽŸ‚ÌÍß°¼Þ";
            Text[ chinese_traditional ] = "¤U¤@­¶";
            Text[ arabic ] = "ÇáÕÝÍÉ ÇáÊÇáíÉ";
            Text[ greek ] = "Óôçí åðüìåíç óåëßäá";
            Text[ korean ] = "´ÙÀ½ ÆäÀÌÁö";
            Text[ turkish ] = "Sonraki sayfa";
        };
        MenuItem
        {
            ITEM_VIEW_ATTR_ZOOM
            /* ### ACHTUNG: Neuer Text in Resource? Schließt die Seitenvorschau : Schlie˜t die Seitenvorschau */
        };
        SEPARATOR ;
        MenuItem
        {
            Identifier = FN_PRINT_PAGEPREVIEW ;
            HelpID = FN_PRINT_PAGEPREVIEW ;
            Text = "Drucken Seitenansicht" ;
            Text [ ENGLISH ] = "Print page preview" ;
            Text [ dutch ] = "Afdrukvoorbeeld afdrukken" ;
            Text [ english_us ] = "Print" ;
            Text [ italian ] = "Stampa anteprima pagina" ;
            Text [ spanish ] = "Imprimir vista preliminar" ;
            Text [ french ] = "Imprimer l'aperçu" ;
            Text [ swedish ] = "Skriv ut förhandsgranskning" ;
            Text [ danish ] = "Udskriv vist udskrift" ;
            Text [ portuguese ] = "Imprimir Ver página" ;
            Text [ portuguese_brazilian ] = "Drucken Seitenansicht" ;
            Text[ chinese_simplified ] = "´òÓ¡Ò³ÃæÔ¤ÊÓ";
            Text[ russian ] = "Ïå÷àòü âèäà ñòðàíèöû";
            Text[ polish ] = "Drukuj widok strony";
            Text[ japanese ] = "ˆóüÌßÚËÞ­°";
            Text[ chinese_traditional ] = "¦C¦L­¶­±À˵ø";
            Text[ arabic ] = "ÇáØÈÇÚÉ ÍÓÈ ÇáãÚÇíäÉ";
            Text[ language_user1 ] = "ßíÝ ÓÊÚÑÝ Ãíä ØÈÇÚÉ \\æÃíä ãÚÇíäÉ ÇáÕÝÍÉ ÞÈá ØÈÇÚÊåÇ ¿¿¿¿";
            Text[ greek ] = "Åêôýðùóç ðñïåðéóêüðçóçò";
            Text[ korean ] = "Àμâ";
            Text[ turkish ] = "Yazdýr";
        };
        MenuItem
        {
            Identifier = FN_PREVIEW_PRINT_OPTIONS;
            HelpID = FN_PREVIEW_PRINT_OPTIONS;
            Text = "Druckoptionen" ;
            Text [ ENGLISH ] = "Print options" ;
            Text[ italian ] = "Opzioni di stampa";
            Text[ portuguese_brazilian ] = "Print options";
            Text[ portuguese ] = "Opções de impressão";
            Text[ danish ] = "Udskriftsindstillinger";
            Text[ french ] = "Options d'impression";
            Text[ swedish ] = "Skrivaralternativ";
            Text[ dutch ] = "Afdrukopties";
            Text[ spanish ] = "Opciones de impresión";
            Text[ english_us ] = "Print Options";
            Text[ chinese_simplified ] = "´òÓ¡Ñ¡Ïî";
            Text[ russian ] = "Ïàðàìåòðû ïå÷àòè";
            Text[ polish ] = "Opcje druku";
            Text[ japanese ] = "ˆóüµÌß¼®Ý";
            Text[ chinese_traditional ] = "¦C¦L¿ï¶µ";
            Text[ arabic ] = "ÎíÇÑÇÊ ÇáØÈÇÚÉ";
            Text[ greek ] = "ÅðéëïãÝò åêôýðùóçò";
            Text[ korean ] = "Àμ⠿ɼÇ";
            Text[ turkish ] = "Yazdýrma seçenekleri";
        };
        SEPARATOR ;
        MenuItem
        {
            ITEM_WINDOW_CLOSEWIN
            /* ### ACHTUNG: Neuer Text in Resource? Schließt die Seitenvorschau : Schlie˜t die Seitenvorschau */
        };
    };
};

diff --git a/sw/source/ui/app/swdll.cxx b/sw/source/ui/app/swdll.cxx
new file mode 100644
index 0000000..830c751
--- /dev/null
+++ b/sw/source/ui/app/swdll.cxx
@@ -0,0 +1,207 @@
/*************************************************************************
 *
 *  $RCSfile: swdll.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:31 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SVDOBJ_HXX //autogen
#include <svx/svdobj.hxx>
#endif


#include "swdll.hxx"
#ifndef _SWWDOCSH_HXX //autogen
#include <wdocsh.hxx>
#endif
#ifndef _SWGLOBDOCSH_HXX //autogen
#include <globdoc.hxx>
#endif
#ifndef _INITUI_HXX
#include <initui.hxx>
#endif
#ifndef _SWMODULE_HXX //autogen
#include <swmodule.hxx>
#endif
#ifndef _SWTYPES_HXX //autogen
#include <swtypes.hxx>
#endif
#ifndef _INIT_HXX
#include <init.hxx>
#endif
#ifndef _DOBJFAC_HXX //autogen
#include <dobjfac.hxx>
#endif
#ifndef _CFGID_H
#include <cfgid.h>
#endif

/*************************************************************************
|*
|* Init
|*
\************************************************************************/

void SwDLL::Init()
{
    // called directly after loading the DLL
    // do whatever you want, you may use Sw-DLL too

    // the SdModule must be created
    SwModuleDummy** ppShlPtr = (SwModuleDummy**) GetAppData(SHL_WRITER);

    SvFactory* pDocFact     = (SvFactory*)(*ppShlPtr)->pSwDocShellFactory;
    SvFactory* pWDocFact    = (SvFactory*)(*ppShlPtr)->pSwWebDocShellFactory;
    SvFactory* pGlobDocFact = (SvFactory*)(*ppShlPtr)->pSwGlobalDocShellFactory;
    delete (*ppShlPtr);
    SwModule* pModule = new SwModule(pDocFact, pWDocFact, pGlobDocFact);;
    (*ppShlPtr) = pModule;
    (*ppShlPtr)->pSwDocShellFactory         = pDocFact    ;
    (*ppShlPtr)->pSwWebDocShellFactory      = pWDocFact   ;
    (*ppShlPtr)->pSwGlobalDocShellFactory   = pGlobDocFact;

    SwDocShell::Factory().RegisterPluginMenuBar( SW_RES(CFG_SW_MENU_PORTAL));
    SwDocShell::Factory().RegisterMenuBar(SW_RES(CFG_SW_MENU));
    SwDocShell::Factory().RegisterAccel(SW_RES(CFG_SW_ACCEL));
    SwWebDocShell::Factory().RegisterPluginMenuBar( SW_RES(CFG_SWWEB_MENU_PORTAL));
    SwWebDocShell::Factory().RegisterMenuBar(SW_RES(CFG_SWWEB_MENU));
    SwWebDocShell::Factory().RegisterAccel(SW_RES(CFG_SWWEB_ACCEL));
    SwGlobalDocShell::Factory().RegisterMenuBar(SW_RES(CFG_SW_MENU));
    SwGlobalDocShell::Factory().RegisterAccel(SW_RES(CFG_SW_ACCEL));


    SdrObjFactory::InsertMakeObjectHdl( LINK( &aSwObjectFactory, SwObjectFactory, MakeObject ) );
    //Initialisierung der Statics
    ::_InitCore();
    ::_InitFilter();
    ::_InitUI();

    pModule->InitAttrPool();
    //jetzt darf das SwModule seinen Pool anlegen

    // register your view-factories here
    RegisterFactories();

    // register your shell-interfaces here
    RegisterInterfaces();

    // register your controllers here
    RegisterControls();

}



/*************************************************************************
|*
|* Exit
|*
\************************************************************************/

void SwDLL::Exit()
{
    // called directly befor unloading the DLL
    // do whatever you want, Sw-DLL is accessible

    // der Pool muss vor den statics geloescht werden
    SW_MOD()->RemoveAttrPool();

    ::_FinitUI();
    ::_FinitFilter();
    ::_FinitCore();
    // Objekt-Factory austragen
    SdrObjFactory::RemoveMakeObjectHdl(LINK(&aSwObjectFactory, SwObjectFactory, MakeObject ));
   // the SwModule must be destroyed
    SwModuleDummy** ppShlPtr = (SwModuleDummy**) GetAppData(SHL_WRITER);
    delete (*ppShlPtr);
    (*ppShlPtr) = NULL;
}


/*-------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.6  2000/09/18 16:05:12  willem.vandorp
    OpenOffice header added.

    Revision 1.5  2000/08/07 14:02:28  os
    portal menu added

    Revision 1.4  1999/04/20 10:22:10  OS
    #64980# eigener SwAttrPool fuer das SwModule


      Rev 1.3   20 Apr 1999 12:22:10   OS
   #64980# eigener SwAttrPool fuer das SwModule

      Rev 1.2   24 Nov 1997 14:22:36   MA
   includes

      Rev 1.1   07 Nov 1997 15:50:36   OS
   MakeObject-Link auch aus der richtigen Liste entfernen

      Rev 1.0   01 Sep 1997 13:09:42   OS
   Initial revision.


-------------------------------------------------------------------------*/

diff --git a/sw/source/ui/app/swmodul1.cxx b/sw/source/ui/app/swmodul1.cxx
new file mode 100644
index 0000000..6d1e3a2
--- /dev/null
+++ b/sw/source/ui/app/swmodul1.cxx
@@ -0,0 +1,1092 @@
/*************************************************************************
 *
 *  $RCSfile: swmodul1.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:31 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _UIPARAM_HXX
#include <uiparam.hxx>
#endif

#ifndef _SFXREQUEST_HXX
#include <sfx2/request.hxx>
#endif
#ifndef _CPPUHELPER_WEAK_HXX_
#include <cppuhelper/weak.hxx>
#endif
#ifndef _COM_SUN_STAR_UTIL_URL_HPP_
#include <com/sun/star/util/URL.hpp>
#endif
#ifndef _COM_SUN_STAR_FRAME_XDISPATCHPROVIDER_HPP_
#include <com/sun/star/frame/XDispatchProvider.hpp>
#endif
#ifndef _COM_SUN_STAR_FRAME_FRAMESEARCHFLAG_HPP_
#include <com/sun/star/frame/FrameSearchFlag.hpp>
#endif
#ifndef _COM_SUN_STAR_FRAME_XSTATUSLISTENER_HPP_
#include <com/sun/star/frame/XStatusListener.hpp>
#endif

#ifndef _SBASLTID_HRC //autogen
#include <offmgr/sbasltid.hrc>
#endif
#ifndef _SBA_SBAOBJ_HXX //autogen
#include <offmgr/sbaobj.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _SFXVIEWFRM_HXX //autogen
#include <sfx2/viewfrm.hxx>
#endif
#ifndef _SVX_WGHTITEM_HXX //autogen
#include <svx/wghtitem.hxx>
#endif
#ifndef _SVX_POSTITEM_HXX //autogen
#include <svx/postitem.hxx>
#endif
#ifndef _SVX_UDLNITEM_HXX //autogen
#include <svx/udlnitem.hxx>
#endif
#ifndef _SVX_CRSDITEM_HXX //autogen
#include <svx/crsditem.hxx>
#endif
#ifndef _SVX_CMAPITEM_HXX //autogen
#include <svx/cmapitem.hxx>
#endif
#ifndef _SVX_COLRITEM_HXX //autogen
#include <svx/colritem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _SDB_SDBSTAT_HXX
#include <sdb/sdbstat.hxx>
#endif

#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _USRPREF_HXX
#include <usrpref.hxx>
#endif
#ifndef _MODCFG_HXX
#include <modcfg.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _PVIEW_HXX
#include <pview.hxx>
#endif
#ifndef _WVIEW_HXX
#include <wview.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _DBMGR_HXX
#include <dbmgr.hxx>
#endif
#ifndef _UINUMS_HXX
#include <uinums.hxx>
#endif
#ifndef _PRTOPT_HXX
#include <prtopt.hxx>       // fuer PrintOptions
#endif
#ifndef _NAVICFG_HXX
#include <navicfg.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif

#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _APP_HRC
#include <app.hrc>
#endif
#ifndef _CPPUHELPER_IMPLBASE1_HXX_
#include <cppuhelper/implbase1.hxx> // helper for implementations
#endif
using namespace ::rtl;
using namespace ::com::sun::star;
/* -----------------------------05.01.00 15:14--------------------------------

 ---------------------------------------------------------------------------*/

class SwXDispatchStatusListener : public cppu::WeakImplHelper1
<
    frame::XStatusListener
>
{
    uno::Reference< frame::XStatusListener >            xSelf;
    util::URL                       aDispURL;
    uno::Reference< frame::XDispatch >              xDispatch;

    void            Invalidate();
public:
    SwXDispatchStatusListener(uno::Reference< frame::XDispatch > &  xDisp, const util::URL&     aURL);
    ~SwXDispatchStatusListener();

    //XStatusListener
    virtual void SAL_CALL statusChanged(const frame::FeatureStateEvent& Event) throw( uno::RuntimeException );

    //XEventListener
    virtual void SAL_CALL disposing(const lang::EventObject& Source) throw( uno::RuntimeException );
};
/* -----------------------------05.01.00 15:18--------------------------------

 ---------------------------------------------------------------------------*/
SwXDispatchStatusListener::SwXDispatchStatusListener(
                                uno::Reference< frame::XDispatch > & xDisp, const util::URL&    aURL) :
    xDispatch(xDisp),
    aDispURL(aURL)
{
    DBG_ASSERT(xDisp.is(),  "XDispatch not set")
    if(xDisp.is())
        xSelf = this;
}
/* -----------------------------05.01.00 15:19--------------------------------

 ---------------------------------------------------------------------------*/
SwXDispatchStatusListener::~SwXDispatchStatusListener()
{
}
/* -----------------------------05.01.00 15:21--------------------------------

 ---------------------------------------------------------------------------*/
void SwXDispatchStatusListener::disposing(const lang::EventObject& Source)
    throw( uno::RuntimeException )
{
    Invalidate();
}
/* -----------------------------05.01.00 15:22--------------------------------

 ---------------------------------------------------------------------------*/
void SwXDispatchStatusListener::statusChanged(const frame::FeatureStateEvent& rEvent)
    throw( uno::RuntimeException )
{
    if(rEvent.FeatureURL.Complete == aDispURL.Complete && rEvent.IsEnabled)
    {
        uno::Sequence <beans::PropertyValue > aArgs(0);
        xDispatch->dispatch(aDispURL, aArgs);
        Invalidate();
    }
}
/* -----------------------------05.01.00 15:45--------------------------------

 ---------------------------------------------------------------------------*/
void    SwXDispatchStatusListener::Invalidate()
{
    if(xDispatch.is())
    {
        try
        {
            xDispatch->removeStatusListener(xSelf, aDispURL);
        }
        catch(...)
        {
        }
    }
    xSelf = 0;
}
/*-----------------08/28/97 08:41pm-----------------

--------------------------------------------------*/
void lcl_SetUIPrefs(const SwViewOption* pPref, SwView* pView, ViewShell* pSh )
{
    // in FrameSets kann die tatsaechliche Sichtbarkeit von der Einstellung der ViewOptions abweichen
    sal_Bool bVScrollChanged = pPref->IsViewVScrollBar() != pSh->GetViewOptions()->IsViewVScrollBar();
    sal_Bool bHScrollChanged = pPref->IsViewHScrollBar() != pSh->GetViewOptions()->IsViewHScrollBar();;

    pSh->SetUIOptions(*pPref);

    const SwViewOption* pNewPref = pSh->GetViewOptions();

    // Scrollbars an / aus
    if(bVScrollChanged)
    {
        if(pNewPref->IsViewVScrollBar())
            pView->CreateVScrollbar();
        else
            pView->KillVScrollbar();
    }
    if(bHScrollChanged)
    {
        if ( pNewPref->IsViewHScrollBar() || pSh->IsBrowseMode() )
            pView->CreateHScrollbar();
        else
            pView->KillHScrollbar();
    }

    // Lineale an / aus
    if(pNewPref->IsViewVLin())
        pView->CreateVLineal();
    else
        pView->KillVLineal();

    // TabWindow an/aus
    if(pNewPref->IsViewTabwin())
        pView->CreateTab();
    else
        pView->KillTab();
}

/*--------------------------------------------------------------------
    Beschreibung:   Aktuelle SwWrtShell
 --------------------------------------------------------------------*/


SwWrtShell* GetActiveWrtShell()
{
    SwView *pActive = ::GetActiveView();
    if( pActive )
        return &pActive->GetWrtShell();
    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:   Pointer auf die aktuelle Sicht
 --------------------------------------------------------------------*/


SwView* GetActiveView()
{
    SfxViewShell* pView = SfxViewShell::Current();
    return PTR_CAST( SwView, pView );
}
/*--------------------------------------------------------------------
    Beschreibung:   Ueber Views iterieren - static
 --------------------------------------------------------------------*/

SwView* SwModule::GetFirstView()
{
    // liefert nur sichtbare SwViews
    const TypeId aTypeId = TYPE(SwView);
    SwView* pView = (SwView*)SfxViewShell::GetFirst(&aTypeId);
    return pView;
}


SwView* SwModule::GetNextView(SwView* pView)
{
    DBG_ASSERT(PTR_CAST(SwView, pView),"keine SwView uebergeben")
    const TypeId aTypeId = TYPE(SwView);
    // auf Sichtbarkeit pruefen, bis der Sfx das GetFirst/Next
    //mit bOnlyVisible implementiert hat
    SwView* pNView = (SwView*)SfxViewShell::GetNext(*pView, &aTypeId);
    while(pNView && !pNView->GetViewFrame()->IsVisible())
    {
        pNView = (SwView*)SfxViewShell::GetNext(*pNView, &aTypeId);
    }
    return pNView;
}

/*------------------------------------------------------------------------
 Beschreibung:  Liefert UsrPref mit den Einstellungen des aktuellen
                Fensters
------------------------------------------------------------------------*/


void SwModule::MakeUsrPref( SwViewOption &rToFill, sal_Bool bWeb ) const
{
        // Einstellungen Ansicht der Core setzen
    SwView* pView = ::GetActiveView();
    SwPagePreView* pPPView;

    if(pView)
    {
        rToFill = *(pView->GetWrtShell().GetViewOptions());
        SfxFrame* pTopFrame = pView->GetViewFrame()->GetTopFrame();
        if( pTopFrame->GetChildFrameCount() != 0 )
        {
            rToFill.SetViewTabwin(pUsrPref->IsViewTabwin());
            rToFill.SetViewVLin(pUsrPref->IsViewVLin());
        }
    }
    else if( 0 != (pPPView = PTR_CAST( SwPagePreView, SfxViewShell::Current())) )
        rToFill = *(pPPView->GetViewShell().GetViewOptions());
    else
        rToFill = *((SwModule*)this)->GetUsrPref( bWeb );
}


/*------------------------------------------------------------------------
 Beschreibung:  Neuer Master fuer die Einstellungen wird gesetzt;
                dieser wirkt sich auf die aktuelle Sicht und alle
                folgenden aus.
------------------------------------------------------------------------*/

void SwModule::ApplyUsrPref(const SwViewOption &rUsrPref, SwView* pActView,
                            sal_uInt16 nDest )
{
    SwView* pView = pActView;
    ViewShell* pSh = 0;
    sal_Bool bFrameDoc = sal_False;

    if ( pView )
    {
        //Fuer FrameViews wird das Umschalten der Grafiken in allen Frames
        //mit Writer-Dokumenten eingestellt.
        //Auserdem werden die UI-Prefs in allen Frames eingestellt.

        pSh = &pView->GetWrtShell();
        SfxFrameIterator aIter( *pView->GetViewFrame()->GetTopFrame() );
        SfxFrame *pChildFrame;
        if ( 0 != (pChildFrame = aIter.FirstFrame()) )
        {
            bFrameDoc = sal_True;
            sal_Bool bGraphic = rUsrPref.IsGraphic();
            do
            {
                SfxViewShell* pVShell = pChildFrame->GetCurrentViewFrame()
                                        ? pChildFrame->GetCurrentViewFrame()->GetViewShell()
                                        : 0;
                SwView* pFrameView = PTR_CAST(SwView, pVShell);
                if(!pFrameView || pFrameView == pView)
                    continue;

                SwWrtShell &rSh = pFrameView->GetWrtShell();
                const SwViewOption* pVOpt = rSh.GetViewOptions();
                SwViewOption aVOpt(*pVOpt);
                if(aVOpt.IsGraphic() != bGraphic)
                {
                    aVOpt.SetReadonly(pVOpt->IsReadonly());
                    aVOpt.SetGraphic( bGraphic );
                    rSh.ApplyViewOptions(aVOpt);
                }
                lcl_SetUIPrefs(&rUsrPref, pFrameView, &rSh );

            } while ( 0 != (pChildFrame = aIter.NextFrame( *pChildFrame )));
        }

    }

    SwMasterUsrPref* pPref = (SwMasterUsrPref*)GetUsrPref(
                                         VIEWOPT_DEST_WEB == nDest ? sal_True  :
                                         VIEWOPT_DEST_TEXT== nDest ? sal_False :
                                         pView && pView->ISA(SwWebView) );

    //per Uno soll nur die sdbcx::View, aber nicht das Module veraendert werden
    sal_Bool bViewOnly = VIEWOPT_DEST_VIEW_ONLY == nDest;
    //PreView abfruehstuecken
    SwPagePreView* pPPView;
    if( !pView && 0 != (pPPView = PTR_CAST( SwPagePreView, SfxViewShell::Current())) )
    {
        if(!bViewOnly)
            pPref->SetUIOptions( rUsrPref );
        if(pPref->IsViewVScrollBar())
            pPPView->CreateVScrollbar();
        else
            pPPView->KillVScrollbar();
        if(pPref->IsViewHScrollBar())
            pPPView->CreateHScrollbar();
        else
            pPPView->KillHScrollbar();
        if(!bViewOnly)
        {
            pPref->SetPagePrevRow(rUsrPref.GetPagePrevRow());
            pPref->SetPagePrevCol(rUsrPref.GetPagePrevCol());
        }
        return;
    }

    sal_Bool bViewHLin, bViewVLin;
    if(bFrameDoc)
    {
        //In Frame-Dokumenten soll die Linealumschaltung nicht in den
        //default uebernommen werden.
        const sal_uInt32 nUIOptions = pPref->GetUIOptions();
        bViewHLin = 0 != (nUIOptions & VIEWOPT_2_TABWIN);
        bViewVLin = 0 != (nUIOptions & VIEWOPT_2_VLIN);
    }

    if(!bViewOnly)
    {
        pPref->SetDefault( sal_False );
        pPref->SetUsrPref( rUsrPref );
    }

    if( !pView )
        return;

    // Weitergabe an die CORE
    const sal_Bool bReadonly = pView->GetDocShell()->IsReadOnly();
    SwViewOption* pViewOpt;
    if(!bViewOnly)
        pViewOpt = new SwViewOption( *pPref );
    else
        pViewOpt = new SwViewOption( rUsrPref );
    pViewOpt->SetReadonly( bReadonly );
    if( !(*pSh->GetViewOptions() == *pViewOpt) )
    {
        //Ist evtl. nur eine ViewShell
        pSh->StartAction();
        pSh->ApplyViewOptions( *pViewOpt );
        ((SwWrtShell*)pSh)->SetReadOnlyAvailable(pViewOpt->IsCursorInProtectedArea());
        pSh->EndAction();
    }
    if ( pSh->GetViewOptions()->IsReadonly() != bReadonly )
        pSh->SetReadonlyOption(bReadonly);

    lcl_SetUIPrefs(pViewOpt, pView, pSh);
    if(bFrameDoc && !bViewOnly)
    {
        pPref->SetViewTabwin(bViewHLin);
        pPref->SetViewVLin(bViewVLin);
    }
    // zum Schluss wird das Idle-Flag wieder gesetzt
    // #42510#
    pPref->SetIdle(sal_True);

}
/*-----------------13.11.96 11.57-------------------

--------------------------------------------------*/

SwNavigationConfig*  SwModule::GetNavigationConfig()
{
    if(!pNavigationConfig)
    {
        pNavigationConfig = new SwNavigationConfig;
    }
    return pNavigationConfig;
}

/*-----------------05.02.97 08.03-------------------

--------------------------------------------------*/

SwPrintOptions*     SwModule::GetPrtOptions(sal_Bool bWeb)
{
    if(bWeb && !pWebPrtOpt)
    {
        pWebPrtOpt = new SwPrintOptions(TRUE);
    }
    else if(!bWeb && !pPrtOpt)
    {
        pPrtOpt = new SwPrintOptions(FALSE);
    }

    return bWeb ? pWebPrtOpt : pPrtOpt;
}

/*-----------------26.06.97 07.52-------------------

--------------------------------------------------*/
SwChapterNumRules*  SwModule::GetChapterNumRules()
{
    if(!pChapterNumRules)
        pChapterNumRules = new SwChapterNumRules;
    return pChapterNumRules;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwModule::ExecDB(SfxRequest &rReq)
{
    const SfxItemSet *pArgs = rReq.GetArgs();
    SwNewDBMgr* pNewDBMgr = NULL;

    if (GetView())
        pNewDBMgr = GetView()->GetWrtShell().GetNewDBMgr();

    sal_uInt16 nSlot(rReq.GetSlot());

    switch (nSlot)
    {
        case FN_QRY_MERGE:
        case FN_QRY:
        {
            String sDBName;

            if (GetView())
            {
                SwWrtShell &rSh = GetView()->GetWrtShell();
                sDBName = rSh.GetDBName();
#ifdef REPLACE_OFADBMGR
#ifdef DEBUG
                sDBName = String::CreateFromAscii("Address Book File");
                sDBName += DB_DELIM;
                sDBName += String::CreateFromAscii("address");
#endif //DEBUG
#endif //REPLACE_OFADBMGR

                rSh.EnterStdMode(); // Wechsel in Textshell erzwingen; ist fuer
                                    // das Mischen von DB-Feldern notwendig.
                GetView()->AttrChangedNotify( &rSh );
                pNewDBMgr->SetMergeType( DBMGR_MERGE );
                ShowDBObj(rSh, sDBName, sal_True);
            }

            if (pNewDBMgr && nSlot == FN_QRY_MERGE)
            {
                SfxViewFrame* pVFrame = GetView()->GetViewFrame();
                uno::Reference< frame::XFrame >  xFrame = pVFrame->GetFrame()->GetFrameInterface();

                uno::Reference< frame::XFrame >  xBeamerFrame = xFrame->findFrame(
                    OUString::createFromAscii("_beamer"), frame::FrameSearchFlag::ALL);

                if(xBeamerFrame.is())
                {
                    uno::Reference< frame::XController >  xCtrl = xBeamerFrame->getController();
                    uno::Reference< frame::XDispatchProvider >  xDispProv(xCtrl, uno::UNO_QUERY);
                    if(xDispProv.is())
                    {
                        OUString uEmpty;
                         util::URL aURL;
                        aURL.Complete = OUString::createFromAscii(".uno:WriterDB/MailMerge");
                        uno::Reference< frame::XDispatch >  xDisp = xDispProv->queryDispatch(aURL, uEmpty, frame::FrameSearchFlag::AUTO);
                        if(xDisp.is())
                        {
                            uno::Reference< frame::XStatusListener >  xDispatchListener =
                                        new SwXDispatchStatusListener(xDisp, aURL);
                            xDisp->addStatusListener(xDispatchListener, aURL);
                        }
                    }
                }
            }
        }
        break;

        default:
            ASSERT(!this, falscher Dispatcher);
            return;
    }
}

/*--------------------------------------------------------------------
    Beschreibung: Schaut nach ob's min eine sdbcx::View gibt
 --------------------------------------------------------------------*/

void SwModule::StateIsView(SfxItemSet& rSet)
{
    SwView *pView = ::GetActiveView();

    // Ist ein Writer-Dok ganz oben?
    if( !pView || pView->GetDocShell()->GetProtocol().IsInPlaceActive() )
        rSet.DisableItem(FN_QRY);

    TypeId aType( TYPE(SwView) );
    if( !SfxViewShell::GetFirst(&aType) )   // Ist irgendein Writer-Dok vorhanden?
        rSet.DisableItem(FN_QRY_MERGE);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwModule::ShowDBObj(SwWrtShell& rSh, const String& rDBName, sal_Bool bShowError)
{
    String sDBName(rDBName.GetToken(0, DB_DELIM));

#ifdef REPLACE_OFADBMGR
        String sTable(rDBName.GetToken(1, DB_DELIM));
        rSh.GetNewDBMgr()->ShowInBeamer( sDBName, sTable, SW_DB_SELECT_UNKNOWN, aEmptyStr );
#else
    if (sDBName.Len())
    {
        OfaDBMgr *pDBMgr = OFF_APP()->GetOfaDBMgr();
        SbaDatabaseRef pConnection = pDBMgr->GetSbaObject()->
                                GetDatabase(sDBName, bShowError);
        if ( pConnection )
        {
            String sTable(rDBName.GetToken(1, DB_DELIM));
            DBObject eType;
            if( !pConnection->HasObject( eType = dbTable, sTable ) &&
                !pConnection->HasObject( eType = dbQuery , sTable ))
                eType = dbTable;

            //wenn keine Connection gefunden wurde, dann braucht man auch
            //den Beamer nicht
            pDBMgr->ShowInBeamer( sDBName, sTable, eType, aEmptyStr );
        }
    }
#endif
}

/*--------------------------------------------------------------------
    Beschreibung: Redlining
 --------------------------------------------------------------------*/

sal_uInt16 SwModule::GetRedlineAuthor()
{
    if (!bAuthorInitialised)
    {
        sActAuthor = SFX_APP()->GetIniManager()->GetUserFullName();
        bAuthorInitialised = sal_True;
    }

    return InsertRedlineAuthor(sActAuthor);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

const String& SwModule::GetRedlineAuthor(sal_uInt16 nPos)
{
    return *pAuthorNames->GetObject(nPos);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

sal_uInt16 SwModule::GetRedlineAuthorCount()
{
    return pAuthorNames->Count();
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

sal_uInt16 SwModule::InsertRedlineAuthor(const String& rAuthor)
{
    sal_uInt16 nPos = 0;

    while (nPos < pAuthorNames->Count() && *pAuthorNames->GetObject(nPos) != rAuthor)
        nPos++;

    if (nPos == pAuthorNames->Count())
        pAuthorNames->Insert(new String(rAuthor), nPos);

    return nPos;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void lcl_FillAuthorAttr( sal_uInt16 nAuthor, SfxItemSet &rSet,
                        const AuthorCharAttr &rAttr )
{
    Color aCol((ColorData)rAttr.nColor);

    if (rAttr.nColor == COL_TRANSPARENT)
    {
// dynamische Vergabe der Attribute
        static ColorData aColArr[ 10 ] = {
                COL_LIGHTRED,       COL_LIGHTBLUE,      COL_LIGHTMAGENTA,
                COL_GREEN,          COL_RED,            COL_BLUE,
                COL_BROWN,          COL_MAGENTA,        COL_CYAN };

        aCol.SetColor(aColArr[ nAuthor % 10 ]);
    }

    sal_Bool bBackGr = sal_False;

    if (rAttr.nColor == COL_NONE)
        bBackGr = sal_True;

    switch (rAttr.nItemId)
    {
        case SID_ATTR_CHAR_WEIGHT:
            rSet.Put(SvxWeightItem( (FontWeight)rAttr.nAttr, RES_CHRATR_WEIGHT));
            break;

        case SID_ATTR_CHAR_POSTURE:
            rSet.Put(SvxPostureItem((FontItalic)rAttr.nAttr, RES_CHRATR_POSTURE));
            break;

        case SID_ATTR_CHAR_UNDERLINE:
            rSet.Put(SvxUnderlineItem( (FontUnderline)rAttr.nAttr, RES_CHRATR_UNDERLINE));
            break;

        case SID_ATTR_CHAR_STRIKEOUT:
            rSet.Put(SvxCrossedOutItem( (FontStrikeout)rAttr.nAttr, RES_CHRATR_CROSSEDOUT));
            break;

        case SID_ATTR_CHAR_CASEMAP:
            rSet.Put(SvxCaseMapItem((SvxCaseMap)rAttr.nAttr, RES_CHRATR_CASEMAP));
            break;

        case SID_ATTR_BRUSH:
            rSet.Put(SvxBrushItem(aCol, RES_CHRATR_BACKGROUND));
            bBackGr = sal_True;
            break;
    }

    if (!bBackGr)
        rSet.Put(SvxColorItem(aCol));
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwModule::GetInsertAuthorAttr(sal_uInt16 nAuthor, SfxItemSet &rSet)
{
    lcl_FillAuthorAttr(nAuthor, rSet, pModuleConfig->GetInsertAuthorAttr());
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwModule::GetDeletedAuthorAttr(sal_uInt16 nAuthor, SfxItemSet &rSet)
{
    lcl_FillAuthorAttr(nAuthor, rSet, pModuleConfig->GetDeletedAuthorAttr());
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

const AuthorCharAttr& SwModule::GetInsertAuthorAttr() const
{
    return pModuleConfig->GetInsertAuthorAttr();
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

const AuthorCharAttr& SwModule::GetDeletedAuthorAttr() const
{
    return pModuleConfig->GetDeletedAuthorAttr();
}

/*--------------------------------------------------------------------
    Beschreibung: Fuer zukuenftige Erweiterung:
 --------------------------------------------------------------------*/

void SwModule::GetFormatAuthorAttr( sal_uInt16 nAuthor, SfxItemSet &rSet )
{
    lcl_FillAuthorAttr( nAuthor, rSet, pModuleConfig->GetFormatAuthorAttr() );
}

const AuthorCharAttr& SwModule::GetFormatAuthorAttr() const
{
    return pModuleConfig->GetFormatAuthorAttr();
}


/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

sal_uInt16 SwModule::GetRedlineMarkPos()
{
    return pModuleConfig->GetMarkAlignMode();
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

sal_Bool SwModule::IsInsTblFormatNum(sal_Bool bHTML) const
{
    return pModuleConfig->IsInsTblFormatNum(bHTML);
}

sal_Bool SwModule::IsInsTblChangeNumFormat(sal_Bool bHTML) const
{
    return pModuleConfig->IsInsTblChangeNumFormat(bHTML);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

sal_Bool SwModule::IsInsTblAlignNum(sal_Bool bHTML) const
{
    return pModuleConfig->IsInsTblAlignNum(bHTML);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

const Color &SwModule::GetRedlineMarkColor()
{
    return pModuleConfig->GetMarkAlignColor();
}

/*-----------------03.03.98 16:47-------------------

--------------------------------------------------*/
const SwViewOption* SwModule::GetViewOption(sal_Bool bWeb)
{
    return GetUsrPref( bWeb );
}

// returne den definierten DocStat - WordDelimiter
const String& SwModule::GetDocStatWordDelim() const
{
    return pModuleConfig->GetWordDelimiter();
}


// Durchreichen der Metric von der ModuleConfig (fuer HTML-Export)
sal_uInt16 SwModule::GetMetric( sal_Bool bWeb ) const
{
    return pModuleConfig->GetMetric( bWeb );
}

// Update-Stati durchreichen
sal_uInt16 SwModule::GetLinkUpdMode( sal_Bool ) const
{
    return pModuleConfig->GetLinkMode();
}

sal_uInt16 SwModule::GetFldUpdateFlags( sal_Bool ) const
{
    return pModuleConfig->GetFldUpdateFlags();
}

void SwModule::CheckSpellChanges( sal_Bool bOnlineSpelling,
        sal_Bool bIsSpellWrongAgain, sal_Bool bIsSpellAllAgain )
{
    sal_Bool bOnlyWrong = bIsSpellWrongAgain && !bIsSpellAllAgain;
    sal_Bool bInvalid = bOnlyWrong || bIsSpellAllAgain;
    if( bOnlineSpelling || bInvalid )
    {
        TypeId aType = TYPE(SwDocShell);
        for( SwDocShell *pDocSh = (SwDocShell*)SfxObjectShell::GetFirst(&aType);
             pDocSh;
             pDocSh = (SwDocShell*)SfxObjectShell::GetNext( *pDocSh, &aType ) )
        {
            SwDoc* pTmp = pDocSh->GetDoc();
            if ( pTmp->GetRootFrm() )
                pTmp->SpellItAgainSam( bInvalid, bOnlyWrong );
        }
//      pSpell->SetSpellWrongAgain( sal_False );
//      pSpell->SetSpellAllAgain( sal_False );
    }
}

/*-------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.50  2000/09/18 16:05:12  willem.vandorp
    OpenOffice header added.

    Revision 1.49  2000/09/08 15:11:56  os
    use configuration service

    Revision 1.48  2000/09/07 15:59:20  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.47  2000/09/07 08:25:24  os
    SwPrintOptions uses configuration service

    Revision 1.46  2000/07/18 12:50:07  os
    replace ofadbmgr

    Revision 1.45  2000/05/26 07:21:28  os
    old SW Basic API Slots removed

    Revision 1.44  2000/05/16 09:15:11  os
    project usr removed

    Revision 1.43  2000/05/11 12:05:29  tl
    if[n]def ONE_LINGU entfernt

    Revision 1.42  2000/03/30 13:28:04  os
    UNO III

    Revision 1.41  2000/03/29 12:46:55  jp
    Bug #74570#: ShowDBObj - if no table and no query exist, set default to table

    Revision 1.40  2000/03/21 15:47:50  os
    UNOIII

    Revision 1.39  2000/02/11 14:43:07  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.38  2000/02/09 07:58:08  os
    #72824# check if beamer is available

    Revision 1.37  2000/01/13 11:31:37  tl
    #70735# fixed CheckSpellChanges bug

    Revision 1.36  2000/01/11 10:33:54  tl
    #70735# CheckSpellChanges moved from SwDoc to here

    Revision 1.35  2000/01/06 12:54:01  hr
    #65293#: END_CATCH

    Revision 1.34  2000/01/06 07:32:38  os
    #71436# mail merge dialog: execute via status method disposed

    Revision 1.33  1999/06/22 15:37:58  JP
    Bug #43028#: disableflag for edit in mailbody


      Rev 1.32   22 Jun 1999 17:37:58   JP
   Bug #43028#: disableflag for edit in mailbody

      Rev 1.31   20 Apr 1999 18:59:24   JP
   Task #65061#: neu: ZahlenFormaterkennung abschaltbar

      Rev 1.30   12 Mar 1999 09:55:32   JP
   Task #61405#: Optionen setzen

      Rev 1.29   12 Mar 1999 09:45:04   OS
   #63044# Datenbank-Fehlermeldung anzeigen

      Rev 1.28   01 Mar 1999 16:20:52   MA
   #62490# Altlast entfernt (Drucken und Briefumschlaege/Etiketten und Datenbank)

      Rev 1.27   23 Feb 1999 16:19:38   OS
   #62281# UsrPrefs per UNO nur auf aktuelle sdbcx::View anwenden

      Rev 1.26   17 Feb 1999 08:37:24   OS
   #58158# Einfuegen TabPage auch in HTML-Docs

      Rev 1.25   27 Jan 1999 10:05:22   OS
   #58677# Cursor in Readonly-Bereichen

      Rev 1.24   26 Jan 1999 11:50:10   MIB
   #60875#: Beim HTML-Export Einheit aus Extras/Optionen/Text-/HTML-Dokument nehmen

      Rev 1.23   23 Nov 1998 17:36:52   JP
   Bug #59754#: TerminateHdl wird nicht mehr fuers Clipboard benoetigt

      Rev 1.22   20 Nov 1998 14:01:32   OM
   #59720# Neue Tabellenoptionen beim Einfuegen

      Rev 1.21   05 Oct 1998 17:16:54   OM
   #57458# Auch Queries ueber F4 anzeigen

      Rev 1.20   24 Sep 1998 13:33:02   OS
   #52654# #56685# XTerminateListener fuer die Anmeldung an der Application

      Rev 1.19   24 Aug 1998 12:20:54   OM
   #54552# Serienbriefdialog: Statusupdate immer erzwingen

      Rev 1.18   14 Jul 1998 12:09:06   OS
   Scrollbars nur umschalten, wenn sich die ViewOptions wirklich veraendert haben #52708#

      Rev 1.17   25 May 1998 12:41:28   JP
   nMergeType wurde private, ueber SetMergeType setzen

      Rev 1.16   15 May 1998 12:50:02   OM
   Worttrenner

      Rev 1.15   14 May 1998 16:46:00   OM
   Worttrenner konfigurierbar

      Rev 1.14   24 Apr 1998 19:36:54   JP
   neu: DocStat WordDelimiter aus der Configuration holen

      Rev 1.13   24 Mar 1998 17:45:28   OM
   Formataenderung anzeigen

      Rev 1.12   24 Mar 1998 13:43:56   JP
   neu: Redline fuer harte Attributierung

      Rev 1.11   16 Mar 1998 19:09:48   OM
   Zugriff auf Ini optimiert

      Rev 1.10   15 Mar 1998 16:57:22   MA
   #48342# richtig initialisieren

      Rev 1.9   10 Mar 1998 12:23:42   OM
   Get...AuthorAttr

      Rev 1.8   05 Mar 1998 14:44:08   OM
   Redline-Attribute in Module-Cfg speichern

      Rev 1.7   03 Mar 1998 17:00:46   OS
   GetViewOption

      Rev 1.6   28 Feb 1998 15:12:42   OM
   Accept / reject changes

      Rev 1.5   24 Feb 1998 15:32:04   OM
   Redline-Darstellungsoptionen setzen

      Rev 1.4   08 Dec 1997 11:46:16   OS
   benannte Numerierungen entfernt

      Rev 1.3   24 Nov 1997 14:22:36   MA
   includes

      Rev 1.2   18 Nov 1997 14:33:42   OM
   Sba-Umstellung 372

      Rev 1.1   02 Sep 1997 10:21:08   OS
   includes

      Rev 1.0   01 Sep 1997 13:09:16   OS
   Initial revision.


-------------------------------------------------------------------------*/

diff --git a/sw/source/ui/app/swmodule.cxx b/sw/source/ui/app/swmodule.cxx
new file mode 100644
index 0000000..1eddf1a
--- /dev/null
+++ b/sw/source/ui/app/swmodule.cxx
@@ -0,0 +1,664 @@
/*************************************************************************
 *
 *  $RCSfile: swmodule.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:31 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "hintids.hxx"
#include "uiparam.hxx"
#include "swerror.h"

#ifndef _SV_WRKWIN_HXX //autogen
#include <vcl/wrkwin.hxx>
#endif
#ifndef _SVDOBJ_HXX //autogen
#include <svx/svdobj.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _EHDL_HXX //autogen
#include <svtools/ehdl.hxx>
#endif
#ifndef _OFAACCFG_HXX //autogen
#include <offmgr/ofaaccfg.hxx>
#endif
#ifndef _SVX_FNTSZCTL_HXX //autogen
#include <svx/fntszctl.hxx>
#endif
#ifndef _SVX_FNTCTL_HXX //autogen
#include <svx/fntctl.hxx>
#endif
#ifndef _SVX_PSZCTRL_HXX //autogen
#include <svx/pszctrl.hxx>
#endif
#ifndef _SVX_INSCTRL_HXX //autogen
#include <svx/insctrl.hxx>
#endif
#ifndef _SVX_SELCTRL_HXX //autogen
#include <svx/selctrl.hxx>
#endif
#ifndef _SVX_LINECTRL_HXX //autogen
#include <svx/linectrl.hxx>
#endif
#include <basctl/btbxctl.hxx>           //z-Zt falscher includeschutz!
#include <svx/tbxctl.hxx>           //z-Zt falscher includeschutz!
#ifndef _FILLCTRL_HXX //autogen
#include <svx/fillctrl.hxx>
#endif
#ifndef _SVX_TBCONTRL_HXX //autogen
#include <svx/tbcontrl.hxx>
#endif
#ifndef _CONTDLG_HXX_ //autogen
#include <svx/contdlg.hxx>
#endif
#ifndef _SVX_LAYCTRL_HXX //autogen
#include <svx/layctrl.hxx>
#endif
#ifndef _SVX_FONTWORK_HXX //autogen
#include <svx/fontwork.hxx>
#endif
#ifndef _TBXALIGN_HXX //autogen
#include <svx/tbxalign.hxx>
#endif
#ifndef _SVX_GRAFCTRL_HXX
#include <svx/grafctrl.hxx>
#endif
#ifndef _SVX_DLG_HYPERLINK_HXX //autogen
#include <offmgr/hyprlink.hxx>
#endif
#ifndef _SVSTDARR_STRINGSDTOR
#define _SVSTDARR_STRINGSDTOR
#include <svtools/svstdarr.hxx>
#endif
#ifndef _COM_SUN_STAR_LANG_XMULTISERVICEFACTORY_HPP_
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#endif
#ifndef _COM_SUN_STAR_LANG_XSINGLESERVICEFACTORY_HPP_
#include <com/sun/star/lang/XSingleServiceFactory.hpp>
#endif
#ifndef _COM_SUN_STAR_SCANNER_XSCANNERMANAGER_HPP_
#include <com/sun/star/scanner/XScannerManager.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XSET_HPP_
#include <com/sun/star/container/XSet.hpp>
#endif
#ifndef _CPPUHELPER_FACTORY_HXX_
#include <cppuhelper/factory.hxx>
#endif
#ifndef _UNOTOOLS_PROCESSFACTORY_HXX_
#include <unotools/processfactory.hxx>
#endif
#include "docsh.hxx"
#include "swmodule.hxx"
#include <swtypes.hxx>
#include <swevent.hxx>
#include <swacorr.hxx>
#include "cmdid.h"
#include <dobjfac.hxx>
#include <init.hxx>
#ifndef _SWPVIEW_HXX //autogen
#include <pview.hxx>
#endif
#ifndef _SWWVIEW_HXX //autogen
#include <wview.hxx>
#endif
#ifndef _SWWDOCSH_HXX //autogen
#include <wdocsh.hxx>
#endif
#ifndef _SWGLOBDOCSH_HXX //autogen
#include <globdoc.hxx>
#endif
#ifndef _SRCVIEW_HXX //autogen
#include <srcview.hxx>
#endif
#ifndef _AUTODOC_HXX //autogen
#include <glshell.hxx>
#endif
#ifndef _SWTABSH_HXX //autogen
#include <tabsh.hxx>
#endif
#ifndef _SWLISTSH_HXX //autogen
#include <listsh.hxx>
#endif
#ifndef _SWGRFSH_HXX //autogen
#include <grfsh.hxx>
#endif
#ifndef _SWOLESH_HXX //autogen
#include <olesh.hxx>
#endif
#ifndef _SWDRAWSH_HXX //autogen
#include <drawsh.hxx>
#endif
#ifndef _SWWDRWFORMSH_HXX //autogen
#include <wformsh.hxx>
#endif
#ifndef _SWDRWTXTSH_HXX //autogen
#include <drwtxtsh.hxx>
#endif
#ifndef _SWBEZIERSH_HXX //autogen
#include <beziersh.hxx>
#endif
#ifndef _SWWTEXTSH_HXX //autogen
#include <wtextsh.hxx>
#endif
#ifndef _SWWFRMSH_HXX //autogen
#include <wfrmsh.hxx>
#endif
#include "drformsh.hxx"
#include "wgrfsh.hxx"
#include "wolesh.hxx"
#include "wlistsh.hxx"
#include "wtabsh.hxx"
#include "wdrwbase.hxx"
#ifndef _NAVIPI_HXX //autogen
#include <navipi.hxx>
#endif
#ifndef _SRCVCFG_HXX //autogen
#include <srcvcfg.hxx>
#endif
#ifndef _CHARTINS_HXX //autogen
#include <chartins.hxx>
#endif
#ifndef SW_INPUTWIN_HXX //autogen
#include <inputwin.hxx>
#endif
#ifndef _USRPREF_HXX //autogen
#include <usrpref.hxx>
#endif
#ifndef _UINUMS_HXX //autogen
#include <uinums.hxx>
#endif
#ifndef _PRTOPT_HXX //autogen
#include <prtopt.hxx>
#endif
#include "bookctrl.hxx"
#include "tmplctrl.hxx"
#include "tblctrl.hxx"
#include "zoomctrl.hxx"
#include "swstbctl.hxx"
#include "workctrl.hxx"
#include "numctrl.hxx"
#include "tbxanchr.hxx"
#include "fldwrap.hxx"
#include "redlndlg.hxx"
#include "syncbtn.hxx"
#ifndef _HDFTCTRL_HXX
#include <hdftctrl.hxx>
#endif
#ifndef _MODOPT_HXX //autogen
#include <modcfg.hxx>
#endif
#ifndef _FONTCFG_HXX //autogen
#include <fontcfg.hxx>
#endif
#ifndef _UNOMOD_HXX
#include <unomod.hxx>
#endif
#ifndef _UNOATXT_HXX
#include <unoatxt.hxx>
#endif
#ifndef _SFX_APPUNO_HXX //autogen
#include <sfx2/appuno.hxx>
#endif
#ifndef _SWATRSET_HXX //autogen
#include <swatrset.hxx>
#endif
#ifndef _IDXMRK_HXX
#include "idxmrk.hxx"
#endif
#ifndef _DLELSTNR_HXX_
#include <dlelstnr.hxx>
#endif

#include "barcfg.hxx"

#include <app.hrc>
#include "cfgid.h"

ResMgr *pSwResMgr = 0;
sal_Bool    bNoInterrupt    = sal_False;

#ifndef PROFILE
// Code zum Initialisieren von Statics im eigenen Code-Segment
#pragma code_seg( "SWSTATICS" )
#endif

#ifndef PROFILE
#pragma code_seg()
#endif

using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::scanner;
using namespace ::com::sun::star::lang;
using namespace ::rtl;
#define C2S(cChar) String::CreateFromAscii(cChar)

TYPEINIT1( SwModuleDummy, SfxModule );
TYPEINIT1( SwModule, SwModuleDummy );


//************************************************************************

SwModule::SwModule( SvFactory* pFact,
                    SvFactory* pWebFact,
                    SvFactory* pGlobalFact )
    : SwModuleDummy( SFX_APP()->CreateResManager( "sw" ), sal_False, pFact,
                     pWebFact, pGlobalFact ),
    pSrcViewConfig(0),
    pModuleConfig(0),
    pView(0),
    pChapterNumRules(0),
    pStdFontConfig(0),
    pNavigationConfig(0),
    pPrtOpt(0),
    pWebPrtOpt(0),
    pWebUsrPref(0),
    pUsrPref(0),
    pToolbarConfig(0),
    pWebToolbarConfig(0),
    pClipboard(0),
    pDragDrop(0),
    pAttrPool(0),
    bAuthorInitialised(sal_False)
{
    SetName( String::CreateFromAscii("StarWriter") );
    pSwResMgr = GetResMgr();
    pErrorHdl = new SfxErrorHandler( RID_SW_ERRHDL,
                                     ERRCODE_AREA_SW,
                                     ERRCODE_AREA_SW_END,
                                     pSwResMgr );
    OFF_APP()->RegisterEvent(SW_EVENT_MAIL_MERGE, SW_RES(STR_PRINT_MERGE_MACRO));
    OFF_APP()->RegisterEvent(SW_EVENT_PAGE_COUNT, SW_RES(STR_PAGE_COUNT_MACRO));
    pModuleConfig = new SwModuleOptions;
    pModuleConfig->Initialize();

    //Die brauchen wie sowieso
    pToolbarConfig = new SwToolbarConfigItem( sal_False );
    pToolbarConfig->Initialize();
    pWebToolbarConfig = new SwToolbarConfigItem( sal_True );
    pWebToolbarConfig->Initialize();

    pStdFontConfig = new SwStdFontConfig;

    pAuthorNames = new SvStringsDtor(5, 1); // Alle Redlining-Autoren

    //JP 18.10.96: SvxAutocorrect gegen die SwAutocorrect austauschen
    OfficeApplication* pOffApp = OFF_APP();
    OfaAutoCorrCfg* pACfg = pOffApp->GetAutoCorrConfig();
    if( pACfg )
    {
        const SvxAutoCorrect* pOld = pACfg->GetAutoCorrect();
        pACfg->SetAutoCorrect(new SwAutoCorrect( *pOld ));
    }
    StartListening( *pOffApp );

    xDicListEvtListener = uno::Reference< linguistic::XDictionaryListEventListener > (
            new SwDicListEvtListener( ::GetDictionaryList() ) );

    Reference< XMultiServiceFactory > xMgr( ::utl::getProcessServiceFactory() );
    if( xMgr.is() )
    {
        m_xScannerManager = Reference< XScannerManager >(
                        xMgr->createInstance( OUString::createFromAscii( "com.sun.star.scanner.ScannerManager" ) ),
                        UNO_QUERY );

//      if( m_xScannerManager.is() )
//      {
//          m_xScannerListener = Reference< lang::XEventListener >(
//                                      OWeakObject* ( new ScannerEventListener( this ) ), UNO_QUERY );
//      }
    }
}

//************************************************************************

SwModule::~SwModule()
{
    SetPool(0);
    delete pAttrPool;
    delete pErrorHdl;
    EndListening( *OFF_APP() );
}

//************************************************************************

void SwDLL::RegisterFactories()
{
    //Diese Id's duerfen nicht geaendert werden. Mittels der Id's wird vom
    //Sfx die sdbcx::View (Dokumentansicht wiederherstellen) erzeugt.
    SwView::RegisterFactory         ( 2 );
    SwWebView::RegisterFactory      ( 5 );
    SwSrcView::RegisterFactory      ( 6 );
    SwPagePreView::RegisterFactory  ( 7 );
}

//************************************************************************


void SwDLL::RegisterInterfaces()
{
    SwModule* pMod = SW_MOD();
    SwModule::RegisterInterface( pMod );
    SwDocShell::RegisterInterface( pMod );
    SwWebDocShell::RegisterInterface( pMod );
    SwGlosDocShell::RegisterInterface( pMod );
    SwWebGlosDocShell::RegisterInterface( pMod );
    SwView::RegisterInterface( pMod );
    SwWebView::RegisterInterface( pMod );
    SwPagePreView::RegisterInterface( pMod );
    SwSrcView::RegisterInterface( pMod );


    SwBaseShell::RegisterInterface(pMod);
    SwTextShell::RegisterInterface(pMod);
    SwTableShell::RegisterInterface(pMod);
    SwListShell::RegisterInterface(pMod);
    SwFrameShell::RegisterInterface(pMod);
    SwDrawBaseShell::RegisterInterface(pMod);
    SwDrawShell::RegisterInterface(pMod);
    SwDrawFormShell::RegisterInterface(pMod);
    SwDrawTextShell::RegisterInterface(pMod);
    SwBezierShell::RegisterInterface(pMod);
    SwGrfShell::RegisterInterface(pMod);
    SwOleShell::RegisterInterface(pMod);
    SwWebTextShell::RegisterInterface(pMod);
    SwWebFrameShell::RegisterInterface(pMod);
    SwWebGrfShell::RegisterInterface(pMod);
    SwWebListShell::RegisterInterface(pMod);
    SwWebTableShell::RegisterInterface(pMod);
    SwWebDrawBaseShell::RegisterInterface(pMod);
    SwWebDrawFormShell::RegisterInterface(pMod);
    SwWebOleShell::RegisterInterface(pMod);

    uno::Reference< lang::XMultiServiceFactory >  xMgr = utl::getProcessServiceFactory();
    uno::Reference< container::XSet >  xSet(xMgr, uno::UNO_QUERY);
    if (xSet.is())
    {
        OUString sString = C2S("com.sun.star.text.AutoTextContainer");

        uno::Reference< lang::XSingleServiceFactory >  xSingleFactory =
            cppu::createOneInstanceFactory(
                xMgr,
                OUString(),
                SwXAutoTextContainer_CreateInstance,
                uno::Sequence<OUString>(&sString, 1));

        if (xSingleFactory.is())
            xSet->insert(uno::Any(&xSingleFactory, ::getCppuType((uno::Reference< lang::XSingleServiceFactory> *)0)));

        sString = C2S("com.sun.star.text.StarWriter");
        xSingleFactory = cppu::createOneInstanceFactory(
                xMgr,
                OUString(),
                SwXModule_CreateInstance,
                uno::Sequence<OUString>(&sString, 1));

        if (xSingleFactory.is())
            xSet->insert(uno::Any(&xSingleFactory, ::getCppuType((uno::Reference< lang::XSingleServiceFactory>*)0)));
    }
}

//************************************************************************

void SwDLL::RegisterControls()
{
    SwModule* pMod = SW_MOD();
    SvxTbxCtlDraw::RegisterControl(SID_INSERT_DRAW, pMod );
    SvxTbxCtlAlign::RegisterControl(SID_OBJECT_ALIGN, pMod );
    SwTbxAnchor::RegisterControl(FN_TOOL_ANKER, pMod );
    SwTbxInsertCtrl::RegisterControl(FN_INSERT_CTRL, pMod );
    SwTbxInsertCtrl::RegisterControl(FN_INSERT_OBJ_CTRL, pMod );
    SwTbxAutoTextCtrl::RegisterControl(FN_INSERT_FIELD_CTRL, pMod );
    SwTbxAutoTextCtrl::RegisterControl(FN_GLOSSARY_DLG, pMod );

    SvxFillToolBoxControl::RegisterControl(SID_ATTR_FILL_STYLE, pMod );
    SvxLineStyleToolBoxControl::RegisterControl(SID_ATTR_LINE_STYLE, pMod );
    SvxLineWidthToolBoxControl::RegisterControl(SID_ATTR_LINE_WIDTH, pMod );
    SvxLineColorToolBoxControl::RegisterControl(SID_ATTR_LINE_COLOR, pMod );
    SvxLineEndToolBoxControl::RegisterControl(SID_ATTR_LINEEND_STYLE, pMod );

    SvxFontNameToolBoxControl::RegisterControl(SID_ATTR_CHAR_FONT, pMod );
    SvxFontHeightToolBoxControl::RegisterControl(SID_ATTR_CHAR_FONTHEIGHT, pMod );
    SvxFontColorToolBoxControl::RegisterControl(SID_ATTR_CHAR_COLOR, pMod );
    SvxFontColorExtToolBoxControl::RegisterControl(SID_ATTR_CHAR_COLOR2, pMod );
    SvxFontColorExtToolBoxControl::RegisterControl(SID_ATTR_CHAR_COLOR_BACKGROUND, pMod );
    SvxStyleToolBoxControl::RegisterControl(SID_STYLE_APPLY, pMod );
    SvxColorToolBoxControl::RegisterControl(SID_BACKGROUND_COLOR, pMod );
    SvxFrameToolBoxControl::RegisterControl(SID_ATTR_BORDER, pMod );
    SvxFrameLineStyleToolBoxControl::RegisterControl(SID_FRAME_LINESTYLE, pMod );
    SvxFrameLineColorToolBoxControl::RegisterControl(SID_FRAME_LINECOLOR, pMod );

    SvxColumnsToolBoxControl::RegisterControl(FN_INSERT_FRAME_INTERACT, pMod );
    SvxColumnsToolBoxControl::RegisterControl(FN_INSERT_FRAME, pMod );
    SvxColumnsToolBoxControl::RegisterControl(FN_INSERT_COLUMN_SECTION, pMod );
    SvxTableToolBoxControl::RegisterControl(FN_INSERT_TABLE, pMod );
    SvxTableToolBoxControl::RegisterControl(FN_PREVIEW_ZOOM, pMod );

    SvxFontMenuControl::RegisterControl(SID_ATTR_CHAR_FONT, pMod );
    SvxFontSizeMenuControl::RegisterControl(SID_ATTR_CHAR_FONTHEIGHT, pMod );

    SwZoomControl::RegisterControl(SID_ATTR_ZOOM, pMod );
    SwHyperlinkControl::RegisterControl(FN_STAT_HYPERLINKS, pMod );
    SvxPosSizeStatusBarControl::RegisterControl(0, pMod );
    SvxInsertStatusBarControl::RegisterControl(0, pMod );
    SvxSelectionModeControl::RegisterControl(FN_STAT_SELMODE, pMod );

    SwBookmarkControl::RegisterControl(FN_STAT_PAGE, pMod );
    SwTemplateControl::RegisterControl(FN_STAT_TEMPLATE, pMod );

    SwTableOptimizeCtrl::RegisterControl(FN_OPTIMIZE_TABLE, pMod);

    SfxMenuControl::RegisterControl(FN_FRAME_ALIGN_VERT_TOP, pMod );
    SfxMenuControl::RegisterControl(FN_FRAME_ALIGN_VERT_BOTTOM, pMod );
    SfxMenuControl::RegisterControl(FN_FRAME_ALIGN_VERT_CENTER, pMod );

    SwHeadFootMenuControl::RegisterControl( FN_INSERT_PAGEHEADER, pMod );
    SwHeadFootMenuControl::RegisterControl( FN_INSERT_PAGEFOOTER, pMod );

    SvxHyperlinkDlgWrapper::RegisterChildWindow( sal_False, pMod );
    SvxFontWorkChildWindow::RegisterChildWindow( sal_False, pMod );
    SwFldDlgWrapper::RegisterChildWindow( sal_False, pMod );
    SvxContourDlgChildWindow::RegisterChildWindow( sal_False, pMod );
    SwInsertChartChild::RegisterChildWindow( sal_False, pMod );
    SwNavigationChild::RegisterChildWindowContext( pMod );
    SwInputChild::RegisterChildWindow( sal_False, pMod );
    SwRedlineAcceptChild::RegisterChildWindow( sal_False, pMod );
    SwSyncChildWin::RegisterChildWindow( sal_True, pMod );
    SwInsertIdxMarkWrapper::RegisterChildWindow( sal_False, pMod );
    SwInsertAuthMarkWrapper::RegisterChildWindow( sal_False, pMod );

    SvxGrafRedToolBoxControl::RegisterControl( SID_ATTR_GRAF_RED, pMod );
    SvxGrafGreenToolBoxControl::RegisterControl( SID_ATTR_GRAF_GREEN, pMod );
    SvxGrafBlueToolBoxControl::RegisterControl( SID_ATTR_GRAF_BLUE, pMod );
    SvxGrafLuminanceToolBoxControl::RegisterControl( SID_ATTR_GRAF_LUMINANCE, pMod );
    SvxGrafContrastToolBoxControl::RegisterControl( SID_ATTR_GRAF_CONTRAST, pMod );
    SvxGrafGammaToolBoxControl::RegisterControl( SID_ATTR_GRAF_GAMMA, pMod );
    SvxGrafTransparenceToolBoxControl::RegisterControl( SID_ATTR_GRAF_TRANSPARENCE, pMod );
    SvxGrafModeToolBoxControl::RegisterControl( SID_ATTR_GRAF_MODE, pMod );
}


/*************************************************************************
|*
|* Modul laden (nur Attrappe fuer das Linken der DLL)
|*
\************************************************************************/


SfxModule* SwModuleDummy::Load()
{
    return (NULL);
}

SwModuleDummy::~SwModuleDummy()
{
}


/*************************************************************************
|*
|* Modul laden
|*
\************************************************************************/

SfxModule* SwModule::Load()
{
    return (this);
}

/*-----------------15.03.98 11:50-------------------

--------------------------------------------------*/
/*Reflection*   SwModule::GetReflection( UsrUik aUIK )
{
    DBG_ERROR("GetReflection - new method not yet available")
    return 0;

    if(aUIK == ::getCppuType((const uno::Reference< text::XModule >*)0))
        return ::getCppuType((const SwXModule*)0)();
    else if(aUIK == ::getCppuType((const uno::Reference< text::XAutoTextContainer >*)0)())
        return ::getCppuType((const SwXAutoTextContainer*)0)();
    else
        return SfxModule::GetReflection(aUIK);
}*/
/* -----------------20.04.99 10:46-------------------
 *
 * --------------------------------------------------*/
void    SwModule::InitAttrPool()
{
    DBG_ASSERT(!pAttrPool, "Pool ist schon da!")
    pAttrPool = new SwAttrPool(0);
    SetPool(pAttrPool);
}
/* -----------------20.04.99 10:46-------------------
 *
 * --------------------------------------------------*/
void    SwModule::RemoveAttrPool()
{
    SetPool(0);
    DELETEZ(pAttrPool);
}


/*-------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.75  2000/09/18 16:05:12  willem.vandorp
    OpenOffice header added.

    Revision 1.74  2000/09/08 15:11:56  os
    use configuration service

    Revision 1.73  2000/09/04 11:42:21  tbe
    basicide, isetbrw, si, vcdlged moved from svx to basctl

    Revision 1.72  2000/08/02 07:53:07  jp
    register GrafToolboxControls with SlotId

    Revision 1.71  2000/07/31 19:25:18  jp
    new attributes for CJK/CTL and graphic

    Revision 1.70  2000/06/08 09:40:08  os
    ContentBroker not in SwModule

    Revision 1.69  2000/06/07 13:17:07  os
    using UCB

    Revision 1.68  2000/05/29 08:03:59  os
    new scanner interface

    Revision 1.67  2000/05/26 07:21:28  os
    old SW Basic API Slots removed

    Revision 1.66  2000/05/16 09:15:11  os
    project usr removed

    Revision 1.65  2000/05/09 14:40:15  os
    BASIC interface partially removed

    Revision 1.64  2000/04/11 08:01:31  os
    UNICODE

    Revision 1.63  2000/03/30 10:48:58  os
    UNO III

    Revision 1.62  2000/03/21 15:47:51  os
    UNOIII

    Revision 1.61  2000/02/11 14:43:11  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.60  2000/02/01 09:51:46  os
    #72282# SwWebBaseShell removed

    Revision 1.59  2000/01/11 19:37:43  tl
    #70735# xDicListEvtListener added

    Revision 1.58  1999/11/23 11:20:12  os
    header corrected

-------------------------------------------------------------------------*/


diff --git a/sw/source/ui/app/swwait.cxx b/sw/source/ui/app/swwait.cxx
new file mode 100644
index 0000000..75ce524
--- /dev/null
+++ b/sw/source/ui/app/swwait.cxx
@@ -0,0 +1,118 @@
/*************************************************************************
 *
 *  $RCSfile: swwait.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:31 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SFXVIEWFRM_HXX //autogen wg. SfxViewFrame
#include <sfx2/viewfrm.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen wg. SfxDispatcher
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SWDOCSH_HXX //autogen wg. SwDocShell
#include <docsh.hxx>
#endif
#ifndef _SWWAIT_HXX
#include <swwait.hxx>
#endif


void SwDocShell::EnterWait( BOOL bLockDispatcher )
{
    SfxViewFrame *pFrame = SfxViewFrame::GetFirst( this, 0, FALSE );
    while ( pFrame )
    {
        pFrame->GetWindow().EnterWait();
        if ( bLockDispatcher )
            pFrame->GetDispatcher()->Lock( TRUE );
        pFrame = SfxViewFrame::GetNext( *pFrame, this, 0, FALSE );
    }
}

void SwDocShell::LeaveWait( BOOL bLockDispatcher )
{
    SfxViewFrame *pFrame = SfxViewFrame::GetFirst( this, 0, FALSE );
    while ( pFrame )
    {
        pFrame->GetWindow().LeaveWait();
        if ( bLockDispatcher )
            pFrame->GetDispatcher()->Lock( FALSE );
        pFrame = SfxViewFrame::GetNext( *pFrame, this, 0, FALSE );
    }
}

SwWait::SwWait( SwDocShell &rDocShell, BOOL bLockDispatcher ) :
    rDoc ( rDocShell ),
    bLock( bLockDispatcher )
{
    rDoc.EnterWait( bLock );
}

SwWait::~SwWait()
{
    rDoc.LeaveWait( bLock );
}


diff --git a/sw/source/ui/cctrl/actctrl.cxx b/sw/source/ui/cctrl/actctrl.cxx
new file mode 100644
index 0000000..c470b79d
--- /dev/null
+++ b/sw/source/ui/cctrl/actctrl.cxx
@@ -0,0 +1,231 @@
/*************************************************************************
 *
 *  $RCSfile: actctrl.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:32 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop


#ifndef _LIST_HXX //autogen
#include <tools/list.hxx>
#endif
#include "actctrl.hxx"



void NumEditAction::Action()
{
    aActionLink.Call( this );
}


long NumEditAction::Notify( NotifyEvent& rNEvt )
{
    long nHandled = 0;

    if ( rNEvt.GetType() == EVENT_KEYINPUT )
    {
        const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
        const KeyCode aKeyCode = pKEvt->GetKeyCode();
        const USHORT nModifier = aKeyCode.GetModifier();
        if( aKeyCode.GetCode() == KEY_RETURN &&
                !nModifier)
        {
            Action();
            nHandled = 1;
        }

    }
    if(!nHandled)
        NumericField::Notify( rNEvt );
    return nHandled;
}

/*------------------------------------------------------------------------
 Beschreibung:  KeyInput fuer ShortName - Edits ohne Spaces
------------------------------------------------------------------------*/


void NoSpaceEdit::KeyInput(const KeyEvent& rEvt)
{
    BOOL bCallParent = TRUE;
    if(rEvt.GetCharCode())
    {
        String sKey = rEvt.GetCharCode();
        if( STRING_NOTFOUND != sForbiddenChars.Search(sKey))
            bCallParent = FALSE;
    }
    if(bCallParent)
        Edit::KeyInput(rEvt);
}
/* -----------------------------11.02.00 15:28--------------------------------

 ---------------------------------------------------------------------------*/
void NoSpaceEdit::Modify()
{
    Selection aSel = GetSelection();
    String sTemp = GetText();
    for(USHORT i = 0; i < sForbiddenChars.Len(); i++)
    {
        sTemp.EraseAllChars( sForbiddenChars.GetChar(i) );
    }
    USHORT nDiff = GetText().Len() - sTemp.Len();
    if(nDiff)
    {
        aSel.setMin(aSel.getMin() - nDiff);
        aSel.setMax(aSel.getMin());
        SetText(sTemp);
        SetSelection(aSel);
    }
    if(GetModifyHdl().IsSet())
        GetModifyHdl().Call(this);
}

/*************************************************************************

    $Log: not supported by cvs2svn $
    Revision 1.67  2000/09/18 16:05:12  willem.vandorp
    OpenOffice header added.

    Revision 1.66  2000/07/10 09:25:33  os
    #76692# check CharCode first

    Revision 1.65  2000/02/21 07:16:20  os
    #73223# Call ModifyHdl in ::Modify

    Revision 1.64  2000/02/11 14:46:03  os
    #71914# Check content in ::Modify

    Revision 1.63  2000/02/01 10:08:25  os
    #71914# forbidden chars in table names: <>. and space

    Revision 1.62  1999/06/10 07:45:50  OS
    NoSpaceEdit: illegal characters can be set


      Rev 1.61   10 Jun 1999 09:45:50   OS
   NoSpaceEdit: illegal characters can be set

      Rev 1.60   05 Nov 1998 10:43:42   OS
   #58990# Notify sollte richtig auf KEYINPUT reagieren

      Rev 1.59   21 Apr 1998 08:43:20   OS
   NoSpaceEdit, TableNameEdit hierher verschoben

      Rev 1.58   30 Mar 1998 18:46:04   TJ
   chg: header wg. internal Comperror

      Rev 1.57   12 Nov 1997 17:29:42   MBA
   SP3:Notify,EVENT_KEYUP

      Rev 1.56   03 Nov 1997 13:09:44   MA
   precomp entfernt

      Rev 1.55   17 Oct 1997 08:22:12   OS
   Notify anstelle von KeyInput ueberladen #44732#

      Rev 1.54   13 Feb 1997 16:36:26   MA
   NameEdit entfernt

      Rev 1.53   28 Aug 1996 08:23:40   OS
   includes

      Rev 1.52   24 Nov 1995 16:57:36   OM
   PCH->PRECOMPILED

      Rev 1.51   08 Nov 1995 10:18:32   OS
   switch => if, keine member -> kein DTOR

      Rev 1.50   12 Oct 1995 15:27:26   MA
   Klasse EditAction entfernt

      Rev 1.49   21 Mar 1995 19:00:08   OS
   EditAction wieder drin

      Rev 1.48   20 Mar 1995 19:05:22   OS
   unbenutzte Funktionen entfernt

      Rev 1.47   15 Mar 1995 11:01:46   MS
   n.b. Ctors entfernt

      Rev 1.46   15 Mar 1995 10:36:46   MS
   ActionControlls reduziert

      Rev 1.45   04 Mar 1995 23:13:30   ER
   Help::EnableBalloonMode() hammernichmehr

      Rev 1.44   07 Feb 1995 19:23:44   ER
   #elif UNX  wird vielleicht wahr werden oder auch nicht..

      Rev 1.43   09 Jan 1995 16:17:44   ER
    del: ctype h

      Rev 1.42   25 Oct 1994 14:55:18   ER
   add: PCH

      Rev 1.41   22 Aug 1994 08:17:32   MS
   SPoints entfernt

*************************************************************************/


diff --git a/sw/source/ui/cctrl/makefile.mk b/sw/source/ui/cctrl/makefile.mk
new file mode 100644
index 0000000..69c49a9
--- /dev/null
+++ b/sw/source/ui/cctrl/makefile.mk
@@ -0,0 +1,97 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:32 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=..$/..$/..

PRJNAME=sw
TARGET=cctrl

AUTOSEG=true

PROJECTPCH=ui_pch
PDBTARGET=ui_pch
PROJECTPCHSOURCE=..\ui_1st\ui_pch

# --- Settings -----------------------------------------------------

.INCLUDE :  $(PRJ)$/inc$/swpre.mk
.INCLUDE :  settings.mk
.INCLUDE :  $(PRJ)$/inc$/sw.mk

# --- Files --------------------------------------------------------

CXXFILES = \
        actctrl.cxx \
        linbox.cxx \
        popbox.cxx \
        swlbox.cxx

SLOFILES =  \
        $(SLO)$/actctrl.obj \
        $(SLO)$/linbox.obj \
        $(SLO)$/popbox.obj \
        $(SLO)$/swlbox.obj

# --- Tagets -------------------------------------------------------

.INCLUDE :  target.mk

diff --git a/sw/source/ui/cctrl/popbox.cxx b/sw/source/ui/cctrl/popbox.cxx
new file mode 100644
index 0000000..bb723a4
--- /dev/null
+++ b/sw/source/ui/cctrl/popbox.cxx
@@ -0,0 +1,182 @@
/*************************************************************************
 *
 *  $RCSfile: popbox.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:32 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "cmdid.h"
#include "swtypes.hxx"
#include "segmentc.hxx"

#include "popbox.hxx"


// --- class SwHelpToolBox ---------------------------------------------


SwHelpToolBox::SwHelpToolBox( Window* pParent, const ResId& rResId ) :
                ToolBox( pParent, rResId )
{
}


void SwHelpToolBox::MouseButtonDown(const MouseEvent &rEvt)
{
        // Zuerst DoubleClick-Link auswerten
        // Dessen Returnwert entscheidet ueber andere Verarbeitung
        // Doppelclickhandler nur, wenn nicht auf einen Button geclickt wurde
    if(rEvt.GetButtons() == MOUSE_RIGHT &&
        0 == GetItemId(rEvt.GetPosPixel())) {
        aRightClickLink.Call((MouseEvent *)&rEvt);
        return;
    }
    else
        ToolBox::MouseButtonDown(rEvt);
}


long SwHelpToolBox::DoubleClick( ToolBox* pCaller )
{
        // kein Doppelklick auf einen Button
    if(0 == pCaller->GetCurItemId() && aDoubleClickLink.Call(0)) return TRUE;
    return FALSE;
}

/*-----------------26.02.94 00:36-------------------
 dtor ueberladen
--------------------------------------------------*/


SwHelpToolBox::~SwHelpToolBox() {}


BOOL    SwHelpToolBox::Drop( const DropEvent& rEvt)
{
    return GetParent()->Drop(rEvt);
}


BOOL    SwHelpToolBox::QueryDrop( DropEvent& rEvt)
{
    return GetParent()->QueryDrop(rEvt);
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.17  2000/09/18 16:05:12  willem.vandorp
    OpenOffice header added.

    Revision 1.16  2000/04/11 08:03:01  os
    UNICODE

    Revision 1.15  1997/11/03 12:09:46  MA
    precomp entfernt


      Rev 1.14   03 Nov 1997 13:09:46   MA
   precomp entfernt

      Rev 1.13   28 Aug 1996 08:23:42   OS
   includes

      Rev 1.12   19 Jun 1996 14:57:58   OS
   +Drop/QueryDrop

      Rev 1.11   16 Apr 1996 17:03:48   OM
   Unbenutzten Ctor entfernt

      Rev 1.10   24 Nov 1995 16:57:38   OM
   PCH->PRECOMPILED

      Rev 1.9   07 Jul 1995 09:27:26   OM
   Mouse_Contextmenu entfernt

      Rev 1.8   06 Jul 1995 22:52:36   ER
   Hack wg. MOUSE_CONTEXTMENU

      Rev 1.7   09 Mar 1995 14:46:30   MA
   Aufgeraeumt

      Rev 1.6   04 Mar 1995 23:14:18   ER
   Help::EnableBalloonMode() hammernichmehr

      Rev 1.5   25 Jan 1995 17:13:58   OS
   Timerinstrumentierung

      Rev 1.4   09 Jan 1995 16:24:12   ER
    del: initui hxx

      Rev 1.3   25 Oct 1994 14:55:16   ER
   add: PCH

      Rev 1.2   19 Oct 1994 13:14:08   MA
   Syntax

      Rev 1.1   19 Oct 1994 12:21:12   MA
   SV-ChangeXXX -> SetXXX.

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/cctrl/swlbox.cxx b/sw/source/ui/cctrl/swlbox.cxx
new file mode 100644
index 0000000..3328dd6
--- /dev/null
+++ b/sw/source/ui/cctrl/swlbox.cxx
@@ -0,0 +1,622 @@
/*************************************************************************
 *
 *  $RCSfile: swlbox.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:32 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _DEBUG_HXX //autogen
#include <tools/debug.hxx>
#endif
#ifndef _UNOTOOLS_CHARCLASS_HXX
#include <unotools/charclass.hxx>
#endif

#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _SWLBOX_HXX
#include <swlbox.hxx>
#endif


SV_IMPL_PTRARR(SwEntryLst, SwBoxEntry*)

/*--------------------------------------------------------------------
     Beschreibung: Ein ListboxElement
 --------------------------------------------------------------------*/


SwBoxEntry::SwBoxEntry() :
    bModified(FALSE),
    bNew(FALSE),
    nId(LISTBOX_APPEND)
{
}


SwBoxEntry::SwBoxEntry(const String& aNam, USHORT nIdx) :
    bModified(FALSE),
    bNew(FALSE),
    aName(aNam),
    nId(nIdx)
{
}


SwBoxEntry::SwBoxEntry(const SwBoxEntry& rOld) :
    aName(rOld.aName),
    nId(rOld.nId),
    bNew(rOld.bNew),
    bModified(rOld.bModified)
{

}

/*--------------------------------------------------------------------
     Beschreibung:
 --------------------------------------------------------------------*/


/*SwListBox::SwListBox(Window* pParent, const ResId& rId):
    ListBox(pParent, rId)
{
    DBG_ASSERT( 0 == (ListBox::GetStyle() & WB_SORT), "NIE sortiert aus der Resource lesen!" );
    // falls eine Liste ueber die Resource gelesen wurde, die interne
    // entsprechend updaten
    USHORT nCnt = ListBox::GetEntryCount();
    for( USHORT n = 0; n < nCnt; ++n )
    {
        const SwBoxEntry* pTmp = new SwBoxEntry( ListBox::GetEntry( n ), n );
        aEntryLst.Insert( pTmp, n );
    }
}

/*--------------------------------------------------------------------
     Beschreibung: Basisklasse Dtor
 --------------------------------------------------------------------*/


/*SwListBox::~SwListBox()
{
}

/*--------------------------------------------------------------------
     Beschreibung: Listen loeschen und Anzeige loeschen
 --------------------------------------------------------------------*/


/*void SwListBox::Clear()
{
    ListBox::Clear();
    aEntryLst.DeleteAndDestroy( 0, aEntryLst.Count() );
}

/*--------------------------------------------------------------------
     Beschreibung: Rund um die Entries
 --------------------------------------------------------------------*/


/*const SwBoxEntry& SwListBox::GetEntry(USHORT nPos) const
{
    if( nPos < aEntryLst.Count() )
        return *aEntryLst[ nPos ];

    return aDefault;
}

/*--------------------------------------------------------------------
     Beschreibung: aktullen Eintrag zurueckgeben
 --------------------------------------------------------------------*/


/*const SwBoxEntry& SwListBox::GetSelectEntry() const
{
    USHORT nPos = ListBox::GetSelectEntryPos();
    if( nPos < aEntryLst.Count() )
        return *aEntryLst[ nPos ];

    return aDefault;
}


void SwListBox::RemoveEntry( USHORT nPos )
{
    if( nPos < aEntryLst.Count() )
    {
        aEntryLst.DeleteAndDestroy( nPos, 1 );
        ListBox::RemoveEntry( nPos );
    }
}

/*--------------------------------------------------------------------
     Beschreibung: Eintrag in die ListBox aufnehmen
 --------------------------------------------------------------------*/


/*void SwListBox::InsertEntry( const SwBoxEntry& rEntry, USHORT nPos )
{
    if( nPos >= aEntryLst.Count() )
        nPos = aEntryLst.Count();

    SwBoxEntry* pEntry = new SwBoxEntry( rEntry );
    ListBox::InsertEntry( pEntry->aName, nPos );
    aEntryLst.C40_INSERT( SwBoxEntry, pEntry, nPos );
}

/*--------------------------------------------------------------------
     Beschreibung: Sortiert einfuegen
 --------------------------------------------------------------------*/


/*void SwListBox::InsertEntrySort( const SwBoxEntry& rEntry )
{
    USHORT nPos;
    if( !SeekEntry( rEntry, &nPos ) )
    {
        SwBoxEntry* pEntry = new SwBoxEntry( rEntry );
        ListBox::InsertEntry( pEntry->aName, nPos );
        aEntryLst.C40_INSERT( SwBoxEntry, pEntry, nPos );
    }
}


BOOL SwListBox::SeekEntry( const SwBoxEntry& rEntry, USHORT* pPos )
{
    register USHORT nO = aEntryLst.Count(), nM, nU = 0;
    if( nO > 0 )
    {
        nO--;
        while( nU <= nO )
        {
            nM = nU + ( nO - nU ) / 2;
            StringCompare eCmp = aEntryLst[ nM ]->aName.ICompare( rEntry.aName );
            if( COMPARE_EQUAL == eCmp )
            {
                if( pPos ) *pPos = nM;
                return TRUE;
            }
            else if( COMPARE_GREATER == eCmp )
                nU = nM + 1;
            else if( nM == 0 )
                break;
            else
                nO = nM - 1;
        }
    }
    if( pPos ) *pPos = nU;
    return FALSE;
}

/*  */


SwComboBox::SwComboBox(Window* pParent, const ResId& rId, USHORT nStyleBits ):
    ComboBox(pParent, rId),
    nStyle(nStyleBits)
{
    // Verwaltung fuer die Stringlist aus der Resource aufbauen
    USHORT nSize = GetEntryCount();
    for( USHORT i=0; i < nSize; ++i )
    {
        const SwBoxEntry* pTmp = new SwBoxEntry(ComboBox::GetEntry(i), i);
        aEntryLst.Insert(pTmp, aEntryLst.Count() );
    }
}

/*--------------------------------------------------------------------
     Beschreibung: Basisklasse Dtor
 --------------------------------------------------------------------*/


SwComboBox::~SwComboBox()
{
// das erledigen die Listen doch schon selbst im DTOR!
//  aEntryLst.DeleteAndDestroy(0,   aEntryLst.Count());
//  aDelEntryLst.DeleteAndDestroy(0, aDelEntryLst.Count());
}

/*--------------------------------------------------------------------
     Beschreibung: neue Eintraege verwalten
 --------------------------------------------------------------------*/


void SwComboBox::InsertNewEntry(const SwBoxEntry& rEntry)
{
    SwBoxEntry* pNew = new SwBoxEntry(rEntry);
    pNew->bNew = TRUE;
    InsertSorted(pNew);
}

/*--------------------------------------------------------------------
     Beschreibung: Eintrag in die ComboBox aufnehmen
 --------------------------------------------------------------------*/


void SwComboBox::InsertEntry(const SwBoxEntry& rEntry)
{
    InsertSorted(new SwBoxEntry(rEntry));
}

/*--------------------------------------------------------------------
     Beschreibung: Eintrag aus der Liste loeschen
 --------------------------------------------------------------------*/


void SwComboBox::RemoveEntry(USHORT nPos)
{
    if(nPos >= aEntryLst.Count())
        return;

    // Altes Element austragen
    SwBoxEntry* pEntry = aEntryLst[nPos];
    aEntryLst.Remove(nPos, 1);
    ComboBox::RemoveEntry(nPos);

    // keine neuen Eintraege in die Liste mit aufnehmen
    if(pEntry->bNew)
        return;

    // in DeleteListe eintragen
    aDelEntryLst.C40_INSERT(SwBoxEntry, pEntry, aDelEntryLst.Count());
}



/*--------------------------------------------------------------------
     Beschreibung: Position by Name
 --------------------------------------------------------------------*/

USHORT SwComboBox::GetEntryPos(const SwBoxEntry& rEntry) const
{
    return ComboBox::GetEntryPos(rEntry.aName);
}

/*--------------------------------------------------------------------
     Beschreibung: Rund um die Entries
 --------------------------------------------------------------------*/


const SwBoxEntry& SwComboBox::GetEntry(USHORT nPos) const
{
    if(nPos < aEntryLst.Count())
        return *aEntryLst[nPos];

    return aDefault;
}

/*--------------------------------------------------------------------
     Beschreibung: geloeschte Eintraege
 --------------------------------------------------------------------*/


USHORT SwComboBox::GetRemovedCount() const
{
    return aDelEntryLst.Count();
}


const SwBoxEntry& SwComboBox::GetRemovedEntry(USHORT nPos) const
{
    if(nPos < aDelEntryLst.Count())
        return *aDelEntryLst[nPos];

    return aDefault;
}

/*--------------------------------------------------------------------
     Beschreibung: Neue Entries begutachten
 --------------------------------------------------------------------*/


USHORT SwComboBox::GetNewCount() const
{
    USHORT nNew = 0;
    USHORT nSize = aEntryLst.Count();
    for(USHORT i=0; i < nSize; ++i)
        if(aEntryLst[i]->bNew)
            nNew++;

    return nNew;
}

/*--------------------------------------------------------------------
     Beschreibung:  Alle neuen Eintraege ueberpruefen
 --------------------------------------------------------------------*/


const SwBoxEntry& SwComboBox::GetNewEntry(USHORT nPos) const
{
    USHORT nSize = aEntryLst.Count();
    USHORT nNew  = 0;

    for(USHORT i=0; i < nSize; ++i)
        if( aEntryLst[i]->bNew && nNew++ == nPos )
            return *aEntryLst[i];

    return aDefault;
}

/*--------------------------------------------------------------------
     Beschreibung: Sortiert einfuegen
 --------------------------------------------------------------------*/


void SwComboBox::InsertSorted(SwBoxEntry* pEntry)
{
    ComboBox::InsertEntry(pEntry->aName);
    USHORT nPos = ComboBox::GetEntryPos(pEntry->aName);
    aEntryLst.C40_INSERT(SwBoxEntry, pEntry, nPos);
}


/*--------------------------------------------------------------------
    Beschreibung: Je nach Option bestimmte Zeichen ausblenden
 --------------------------------------------------------------------*/


void SwComboBox::KeyInput( const KeyEvent& rKEvt )
{
    USHORT nChar = rKEvt.GetCharCode();

    if(nStyle & CBS_FILENAME)
    {
#ifdef MAC
        if(nChar == ':')
            return;
#elif defined UNX
        if(nChar == '/' || nChar == ' ' )
            return;
#else
        if(nChar == ':' || nChar == '\\' || nChar == '.' || nChar == ' ')
            return;
#endif
    }
    ComboBox::KeyInput(rKEvt);
}



/*--------------------------------------------------------------------
    Beschreibung: Text nach Option konvertieren
 --------------------------------------------------------------------*/


String SwComboBox::GetText() const
{
    String aTxt( ComboBox::GetText() );

    if(nStyle & CBS_LOWER)
        GetAppCharClass().toLower( aTxt );
    else if( nStyle & CBS_UPPER )
        GetAppCharClass().toUpper( aTxt );

    return aTxt;
}


/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.52  2000/09/18 16:05:13  willem.vandorp
    OpenOffice header added.

    Revision 1.51  2000/08/30 16:45:51  jp
    use CharClass instead of international

    Revision 1.50  2000/04/11 08:03:01  os
    UNICODE

    Revision 1.49  2000/02/11 14:43:21  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.48  1997/11/03 12:09:46  MA
    precomp entfernt


      Rev 1.47   03 Nov 1997 13:09:46   MA
   precomp entfernt

      Rev 1.46   08 Aug 1997 17:29:48   OM
   Headerfile-Umstellung

      Rev 1.45   06 Aug 1997 11:28:38   TRI
   GetpApp statt pApp

      Rev 1.44   23 Apr 1997 10:39:28   OS
   ResId const

      Rev 1.43   07 Nov 1996 11:47:52   JP
   ASSERT korrigiert

      Rev 1.42   05 Nov 1996 15:36:36   JP
   SwListBox: Sortierung selbst uebernommen; ueberfluessiges entfernt/aufgeraeumt

      Rev 1.41   28 Aug 1996 08:23:42   OS
   includes

      Rev 1.40   16 Aug 1996 13:24:00   TRI
   C40_INSERT statt Insert

      Rev 1.39   25 Jun 1996 17:46:54   HJS
   include tlintl.hxx

      Rev 1.38   16 Apr 1996 16:46:10   OM
   SwEventListBox entfernt

      Rev 1.37   24 Nov 1995 16:57:38   OM
   PCH->PRECOMPILED

      Rev 1.36   17 Nov 1995 13:21:36   MA
   Segmentierung

      Rev 1.35   27 Jul 1995 10:44:42   mk
   an SCC4.0.1a angepasst (MDA)

      Rev 1.34   20 Mar 1995 19:03:20   OS
   unbenutzte Funktionen entfernt

      Rev 1.33   15 Dec 1994 20:21:28   SWG
   *ARR* Ersetzungen, svmem, __far_data etc.

      Rev 1.32   25 Oct 1994 14:55:22   ER
   add: PCH

      Rev 1.31   10 May 1994 13:48:44   MS
   boeser Fehler! bei sortierten SwlBoxen kam der Zugriff auf die EntryListe durcheinander

      Rev 1.30   06 May 1994 13:17:28   MS
   GetSelectEntryPos geandert

      Rev 1.29   02 Mar 1994 17:22:56   MS
   mit EntryPos

      Rev 1.28   02 Mar 1994 15:46:52   VB
   ListBox mit MouseButtonDown-Handler

      Rev 1.27   26 Feb 1994 02:59:36   ER
   virt. dtor mit export

      Rev 1.26   23 Feb 1994 12:07:04   ER
   SEXPORT

      Rev 1.25   17 Feb 1994 08:35:06   MI
   SEG_FUNCDEFS ausgefuellt

      Rev 1.24   16 Feb 1994 19:56:36   MI
   SEG_FUNCDEFS ausgefuellt

      Rev 1.23   16 Feb 1994 15:41:54   MI
   Pragmas zurechtgerueckt

      Rev 1.22   28 Jan 1994 11:36:26   MI
   TCOV() entfernt, SW_... nach SEG_... umbenannt

      Rev 1.21   13 Jan 1994 08:33:26   MI
   Segmentierung per #define ermoeglicht

      Rev 1.20   10 Jan 1994 09:38:36   MS
   UNX - Fehler behoben

      Rev 1.19   09 Jan 1994 21:06:46   MI
   Provisorische Segmentierung

      Rev 1.18   06 Jan 1994 13:14:38   MS
   Default-Options geaendert

      Rev 1.17   08 Dec 1993 11:21:38   MS
   SwBoxEntry() setz nId auf LISTBOX_ENTRY_NOTFOUND

      Rev 1.16   06 Dec 1993 11:47:10   VB
   Upper/Lower konvertieren ueber International

      Rev 1.15   24 Sep 1993 18:50:02   VB
   Segmentierung

      Rev 1.14   24 Sep 1993 08:59:44   MS
   Beschraenkung der Eingabe geaendert

      Rev 1.13   23 Sep 1993 17:33:46   MS
   ComboBox Namen im Edit begrenzen

      Rev 1.12   27 Apr 1993 08:18:20   OK
   NEU: #pragma hdrstop

      Rev 1.11   16 Feb 1993 08:52:18   MS
   fuer m800

      Rev 1.10   10 Feb 1993 19:42:08   VB
   Umstellung SV21

      Rev 1.9   06 Jan 1993 09:15:30   OK
   Anpassung an M70

      Rev 1.8   02 Dec 1992 17:39:46   MS
   neu SwMultiComboBox

      Rev 1.7   27 Nov 1992 16:04:52   MS
   RemoveEntry() korrigiert

      Rev 1.6   27 Nov 1992 15:55:48   MS
   mit InitComboBox

      Rev 1.5   27 Nov 1992 15:42:52   MS
   Init erweitert

      Rev 1.4   27 Nov 1992 14:42:38   MS
   mit const SwBoxEntr& Returns

      Rev 1.3   27 Nov 1992 13:43:54   MS
   GetCurEntry gerichtet

      Rev 1.2   27 Nov 1992 11:40:52   MS
   neu GetEntryPos

      Rev 1.1   27 Nov 1992 11:30:08   MS
   neu InitFromResource

      Rev 1.0   27 Nov 1992 10:49:58   MS
   Initial revision.

 ------------------------------------------------------------------------*/

diff --git a/sw/source/ui/chrdlg/break.cxx b/sw/source/ui/chrdlg/break.cxx
new file mode 100644
index 0000000..f3d7e076
--- /dev/null
+++ b/sw/source/ui/chrdlg/break.cxx
@@ -0,0 +1,408 @@
/*************************************************************************
 *
 *  $RCSfile: break.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:32 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif


#ifndef _SV_SVAPP_HXX
#include <vcl/svapp.hxx>
#endif
#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _UITOOL_HXX
#include <uitool.hxx>
#endif
#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _BASESH_HXX
#include <basesh.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _VIEWOPT_HXX
#include <viewopt.hxx>
#endif
#ifndef _BREAK_HXX
#include <break.hxx>
#endif
#ifndef _PAGEDESC_HXX
#include <pagedesc.hxx>
#endif
#ifndef _POOLFMT_HXX
#include <poolfmt.hxx>
#endif

#ifndef _BREAK_HRC
#include <break.hrc>
#endif
#ifndef _CHRDLG_HRC
#include <chrdlg.hrc>
#endif


void SwBreakDlg::Apply()
{
    String aTemplate( aEmptyStr );
    BOOL bTemplate = FALSE;
    if(aLineBtn.IsChecked())
    {
        rSh.InsertLineBreak();
    }
    else if(aColumnBtn.IsChecked())
    {
        rSh.InsertColumnBreak();
    }
    else if(aPageBtn.IsChecked())
    {
        rSh.StartAllAction();
        const USHORT nPos = aPageCollBox.GetSelectEntryPos();

        // auf Position 0 steht 'Ohne' Seitenvorlage.
        if(0 != nPos && LISTBOX_ENTRY_NOTFOUND != nPos)
        {
            aTemplate = aPageCollBox.GetSelectEntry();
            USHORT nPgNum = aPageNumBox.IsChecked() ? (USHORT)aPageNumEdit.GetValue()
                                                    : 0;
            rSh.InsertPageBreak(&aTemplate, nPgNum);
            bTemplate = TRUE;
        }
        else
            rSh.InsertPageBreak();
        rSh.EndAllAction();
    }
}


IMPL_LINK_INLINE_START( SwBreakDlg, ClickHdl, void *, EMPTYARG )
{
    CheckEnable();
    return 0;
}
IMPL_LINK_INLINE_END( SwBreakDlg, ClickHdl, void *, EMPTYARG )

/*------------------------------------------------------------------------
 Beschreibung:  Handler fuer Aendern Seitenummer
------------------------------------------------------------------------*/

IMPL_LINK_INLINE_START( SwBreakDlg, PageNumHdl, CheckBox *, pBox )
{
    if(pBox->IsChecked()) aPageNumEdit.SetValue(1);
    else aPageNumEdit.SetText(aEmptyStr);
    return 0;
}
IMPL_LINK_INLINE_END( SwBreakDlg, PageNumHdl, CheckBox *, pBox )

/*------------------------------------------------------------------------
 Beschreibung:  Durch Aendern der Seitennummer wird die Checkbox gecheckt.
------------------------------------------------------------------------*/

IMPL_LINK_INLINE_START( SwBreakDlg, PageNumModifyHdl, Edit *, EMPTYARG )
{
    aPageNumBox.Check();
    return 0;
}
IMPL_LINK_INLINE_END( SwBreakDlg, PageNumModifyHdl, Edit *, EMPTYARG )

/*------------------------------------------------------------------------
 Beschreibung:  Ok-Handler;
                prueft, ob die Seitenummer nPage eine legale Seitennummer
                ist (linke Seiten mit geraden Nummern etc. bei einer Seitenvorlage
                mit wechselnden Seiten)
------------------------------------------------------------------------*/

IMPL_LINK( SwBreakDlg, OkHdl, Button *, EMPTYARG )
{
    if(aPageNumBox.IsChecked()) {
            // wenn unterschiedliche Seitenvorlagen, testen auf Gueltigkeit
        const USHORT nPos = aPageCollBox.GetSelectEntryPos();
            // auf Position 0 steht 'Ohne'.
        const SwPageDesc *pPageDesc;
        if ( 0 != nPos && LISTBOX_ENTRY_NOTFOUND != nPos )
            pPageDesc = rSh.FindPageDescByName( aPageCollBox.GetSelectEntry(),
                                                TRUE );
        else
            pPageDesc = &rSh.GetPageDesc(rSh.GetCurPageDesc());

        ASSERT(pPageDesc, Seitenvorlage nicht gefunden.);
        const USHORT nUserPage = USHORT(aPageNumEdit.GetValue());
        BOOL bOk = TRUE;
        switch(pPageDesc->GetUseOn()) {
            case PD_MIRROR:
            case PD_ALL: break;
            case PD_LEFT: bOk = 0 == nUserPage % 2; break;
            case PD_RIGHT: bOk = nUserPage % 2; break;
        }
        if(!bOk) {
            InfoBox(this, SW_RES(MSG_ILLEGAL_PAGENUM)).Execute();
            aPageNumEdit.GrabFocus();
            return 0;
        }
    }
    EndDialog(RET_OK);
    return 0;
}

SwBreakDlg::SwBreakDlg( Window *pParent, SwWrtShell &rS ) :

    SvxStandardDialog( pParent,SW_RES(DLG_BREAK) ),

    rSh(rS),
    aLineBtn(this,SW_RES(RB_LINE)),
    aColumnBtn(this,SW_RES(RB_COL)),
    aPageBtn(this,SW_RES(RB_PAGE)),
    aPageCollText(this, SW_RES(FT_COLL)),
    aPageCollBox(this, SW_RES(LB_COLL)),
    aPageNumBox(this, SW_RES(CB_PAGENUM)),
    aPageNumEdit(this, SW_RES(ED_PAGENUM)),
    aBreakFrm(this,SW_RES(GB_BREAK)),
    aOkBtn(this,SW_RES(BT_OK)),
    aCancelBtn(this,SW_RES(BT_CANCEL)),
    aHelpBtn(this,SW_RES(BT_HELP)),
    bHtmlMode(0 != ::GetHtmlMode(rS.GetView().GetDocShell()))
{
    Link aLk = LINK(this,SwBreakDlg,ClickHdl);
    aPageBtn.SetClickHdl( aLk );
    aLineBtn.SetClickHdl( aLk );
    aColumnBtn.SetClickHdl( aLk );
    aPageCollBox.SetSelectHdl( aLk );

    aOkBtn.SetClickHdl(LINK(this,SwBreakDlg,OkHdl));
    aPageNumBox.SetClickHdl(LINK(this,SwBreakDlg,PageNumHdl));
    aPageNumEdit.SetModifyHdl(LINK(this,SwBreakDlg,PageNumModifyHdl));


    // Einfuegen der vorhandenen Seitenvorlagen in die Listbox
    const International& rInt = Application::GetAppInternational();
    const USHORT nCount = rSh.GetPageDescCnt();
    for(USHORT i = 0; i < nCount; ++i)
    {
        const SwPageDesc &rPageDesc = rSh.GetPageDesc(i);
        ::InsertStringSorted(rPageDesc.GetName(), aPageCollBox, TRUE, rInt);
    }

    String aFmtName;
    for(i = RES_POOLPAGE_BEGIN; i <= RES_POOLPAGE_REGISTER; ++i)
        if(LISTBOX_ENTRY_NOTFOUND == aPageCollBox.GetEntryPos(
                                    GetDocPoolNm( i, aFmtName )))
            ::InsertStringSorted(aFmtName, aPageCollBox, TRUE, rInt);

    CheckEnable();
    aPageNumEdit.SetText( aEmptyStr );
    FreeResource();
}


void SwBreakDlg::CheckEnable()
{
    BOOL bEnable = TRUE;
    if ( bHtmlMode )
    {
        aColumnBtn  .Enable(FALSE);
        aPageCollBox.Enable(FALSE);
        bEnable = FALSE;
    }
    else if(rSh.GetFrmType(0,TRUE)
        & (FRMTYPE_FLY_ANY | FRMTYPE_HEADER | FRMTYPE_FOOTER  | FRMTYPE_FOOTNOTE))
    {
        aPageBtn.Enable(FALSE);
        if(aPageBtn.IsChecked())
            aLineBtn.Check(TRUE);
        bEnable = FALSE;
    }
    const BOOL bPage = aPageBtn.IsChecked();
    aPageCollText.Enable( bPage );
    aPageCollBox.Enable ( bPage );

    bEnable &= bPage;
    if ( bEnable )
    {
        // auf Position 0 steht 'Ohne' Seitenvorlage.
        const USHORT nPos = aPageCollBox.GetSelectEntryPos();
        if ( 0 == nPos || LISTBOX_ENTRY_NOTFOUND == nPos )
            bEnable = FALSE;
    }
    aPageNumBox .Enable(bEnable);
    aPageNumEdit.Enable(bEnable);
}


SwBreakDlg::~SwBreakDlg() {}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.62  2000/09/18 16:05:13  willem.vandorp
    OpenOffice header added.

    Revision 1.61  2000/08/25 10:12:26  os
    #77214# style listbox sorted

    Revision 1.60  2000/07/26 16:32:15  jp
    use the new function GetDocPoolNm to get the collectionames

    Revision 1.59  2000/05/26 07:21:28  os
    old SW Basic API Slots removed

    Revision 1.58  2000/05/10 11:55:37  os
    Basic API removed

    Revision 1.57  2000/02/11 14:43:29  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.56  1999/06/18 13:45:28  OS
    #66704# wrong fix fixed


      Rev 1.55   18 Jun 1999 15:45:28   OS
   #66704# wrong fix fixed

      Rev 1.54   09 Jun 1999 08:47:48   OS
   #66704# no page breaks in header/footer/frame

      Rev 1.53   05 Feb 1999 17:44:20   JP
   Task #61467#/#61014#: neu FindPageDescByName

      Rev 1.52   21 Nov 1997 12:24:34   MA
   includes

      Rev 1.51   03 Nov 1997 13:10:20   MA
   precomp entfernt

      Rev 1.50   30 Jul 1997 18:15:32   HJS
   includes

      Rev 1.49   23 Jul 1997 20:22:14   HJS
   includes

      Rev 1.48   27 Jan 1997 16:14:42   OS
   HtmlMode wird ueber GetHtmlMode ermittelt

      Rev 1.47   18 Dec 1996 19:07:30   MA
   fix: richtiges enablen

      Rev 1.46   06 Dec 1996 13:53:20   MA
   Umbrueche fuer Tabellen

      Rev 1.45   11 Nov 1996 09:16:38   MA
   ResMgr

      Rev 1.44   10 Oct 1996 13:18:52   OS
   HtmlMode beruecksichtigen

      Rev 1.43   02 Oct 1996 08:36:16   MA
   Umstellung Enable/Disable

      Rev 1.42   28 Aug 1996 08:59:06   OS
   includes

      Rev 1.41   06 Feb 1996 15:18:38   JP
   Link Umstellung 305

      Rev 1.40   24 Nov 1995 16:57:32   OM
   PCH->PRECOMPILED

      Rev 1.39   08 Nov 1995 12:47:36   OM
   Change->Set

      Rev 1.38   23 Oct 1995 17:25:10   OS
   Umbrueche einfuegen recordable

      Rev 1.37   11 Sep 1995 18:47:40   OM
   Helpbutton eingefuegt

      Rev 1.36   30 Aug 1995 14:08:52   MA
   fix: sexport'iert

      Rev 1.35   21 Aug 1995 09:22:06   MA
   chg: swstddlg -> svxstandarddialog, Optimierungen

      Rev 1.34   05 Apr 1995 09:15:28   JP
   Benutzung vom Link-Makro eingeschraenkt

      Rev 1.33   25 Oct 1994 15:50:04   ER
   add: PCH

      Rev 1.32   05 Oct 1994 17:45:56   VB
   Umbruch freigeschaltet

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/chrdlg/break.hrc b/sw/source/ui/chrdlg/break.hrc
new file mode 100644
index 0000000..fa0dd208
--- /dev/null
+++ b/sw/source/ui/chrdlg/break.hrc
@@ -0,0 +1,75 @@
/*************************************************************************
 *
 *  $RCSfile: break.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:32 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#define RB_PAGE     1
#define RB_LINE     2
#define RB_COL      3
#define FT_COLL     4
#define LB_COLL     5
#define GB_BREAK    6
#define CB_PAGENUM  7
#define ED_PAGENUM  8

#define BT_OK       100
#define BT_CANCEL   101
#define BT_HELP     102


diff --git a/sw/source/ui/chrdlg/ccoll.cxx b/sw/source/ui/chrdlg/ccoll.cxx
new file mode 100644
index 0000000..e02185f
--- /dev/null
+++ b/sw/source/ui/chrdlg/ccoll.cxx
@@ -0,0 +1,593 @@
/*************************************************************************
 *
 *  $RCSfile: ccoll.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:32 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "cmdid.h"

#ifndef _LIST_HXX //autogen
#include <tools/list.hxx>
#endif
#include "swmodule.hxx"
#include "view.hxx"
#include "wrtsh.hxx"
#include "globals.hrc"
#include "helpid.h"


#ifndef _SFX_STYFITEM_HXX //autogen
#include <sfx2/styfitem.hxx>
#endif

#include "uitool.hxx"
#include "ccoll.hxx"
#include "fmtcol.hxx"
#include "hintids.hxx"
#include "docsh.hxx"
#include "docstyle.hxx"
#include "hints.hxx"

#include "chrdlg.hrc"
#include "ccoll.hrc"

#ifndef _SV_SVAPP_HXX //autogen
#include <vcl/svapp.hxx>
#endif

// Globals ******************************************************************

static USHORT __FAR_DATA aPageRg[] = {
    FN_COND_COLL, FN_COND_COLL,
    0
};

// Achtung im Code wird dieses Array direkt (0, 1, ...) indiziert
static long nTabs[] =
    {   2, // Number of Tabs
        0, 100
    };


CommandStruct SwCondCollItem::aCmds[] = {
         PARA_IN_TABLEHEAD, 0,
         PARA_IN_TABLEBODY, 0,
         PARA_IN_FRAME,     0,
         PARA_IN_SECTION,   0,
         PARA_IN_FOOTENOTE, 0,
         PARA_IN_ENDNOTE,   0,
         PARA_IN_HEADER,    0,
         PARA_IN_FOOTER,    0,
         PARA_IN_OUTLINE,   0,
         PARA_IN_OUTLINE,   1,
         PARA_IN_OUTLINE,   2,
         PARA_IN_OUTLINE,   3,
         PARA_IN_OUTLINE,   4,
         PARA_IN_OUTLINE,   5,
         PARA_IN_OUTLINE,   6,
         PARA_IN_OUTLINE,   7,
         PARA_IN_OUTLINE,   8,
         PARA_IN_OUTLINE,   9,
         PARA_IN_LIST,      0,
         PARA_IN_LIST,      1,
         PARA_IN_LIST,      2,
         PARA_IN_LIST,      3,
         PARA_IN_LIST,      4,
         PARA_IN_LIST,      5,
         PARA_IN_LIST,      6,
         PARA_IN_LIST,      7,
         PARA_IN_LIST,      8,
         PARA_IN_LIST,      9
    };



TYPEINIT1_AUTOFACTORY(SwCondCollItem, SfxPoolItem)


/****************************************************************************
Page: Ctor
****************************************************************************/


SwCondCollPage::SwCondCollPage(Window *pParent, const SfxItemSet &rSet)

    : SfxTabPage(pParent, SW_RES(TP_CONDCOLL), rSet),
    aConditionCB( this, SW_RES( CB_CONDITION ) ),
    aContextFT  ( this, SW_RES( FT_CONTEXT  ) ),
    aUsedFT     ( this, SW_RES( FT_USED         ) ),
    aTbLinks(     this, SW_RES( TB_CONDCOLLS ) ),
    aStyleFT    ( this, SW_RES( FT_STYLE    ) ),
    aStyleLB    ( this, SW_RES( LB_STYLE    ) ),
    aFilterLB   ( this, SW_RES( LB_FILTER   ) ),
    aRemovePB   ( this, SW_RES( PB_REMOVE   ) ),
    aAssignPB   ( this, SW_RES( PB_ASSIGN   ) ),
    sNoTmpl     (       SW_RES( STR_NOTEMPL  ) ),
    aStrArr     (       SW_RES( STR_REGIONS  ) ),
    rSh(::GetActiveView()->GetWrtShell()),
    pFmt(0),
    pCmds( SwCondCollItem::GetCmds() ),
    bNewTemplate(FALSE)
{
    FreeResource();
    SetExchangeSupport();

    // Handler installieren
    aConditionCB.SetClickHdl(   LINK(this, SwCondCollPage, OnOffHdl));
    aTbLinks.SetDoubleClickHdl( LINK(this, SwCondCollPage, AssignRemoveHdl ));
    aStyleLB.SetDoubleClickHdl( LINK(this, SwCondCollPage, AssignRemoveHdl ));
    aRemovePB.SetClickHdl(      LINK(this, SwCondCollPage, AssignRemoveHdl ));
    aAssignPB.SetClickHdl(      LINK(this, SwCondCollPage, AssignRemoveHdl ));
    aTbLinks.SetSelectHdl(      LINK(this, SwCondCollPage, SelectHdl));
    aStyleLB.SetSelectHdl(      LINK(this, SwCondCollPage, SelectHdl));
    aFilterLB.SetSelectHdl(     LINK(this, SwCondCollPage, SelectHdl));

    aTbLinks.SetWindowBits(WB_HSCROLL|WB_CLIPCHILDREN);
    aTbLinks.SetSelectionMode( SINGLE_SELECTION );
    aTbLinks.SetTabs( &nTabs[0], MAP_APPFONT );
    aTbLinks.Resize();  // OS: Hack fuer richtige Selektion
    aTbLinks.SetSpaceBetweenEntries( 0 );
    aTbLinks.SetHelpId(HID_COND_COLL_TABLIST);

    SfxStyleFamilies aFamilies(SW_RES(DLG_STYLE_DESIGNER));
    const SfxStyleFamilyItem* pFamilyItem;
    USHORT nCount = aFamilies.Count();

    for(USHORT i = 0; i < nCount; ++i)
    {
        if(SFX_STYLE_FAMILY_PARA == (USHORT)(pFamilyItem = aFamilies.GetObject(i))->GetFamily())
            break;
    }

    const SfxStyleFilter& rFilterList = pFamilyItem->GetFilterList();
    for( i = 0; i < rFilterList.Count(); ++i)
    {
        aFilterLB.InsertEntry(rFilterList.GetObject(i)->aName);
        USHORT* pFilter = new USHORT(rFilterList.GetObject(i)->nFlags);
        aFilterLB.SetEntryData(i, pFilter);
    }
    aFilterLB.SelectEntryPos(1);

    aTbLinks.Show();

}

/****************************************************************************
Page: Dtor
****************************************************************************/


__EXPORT SwCondCollPage::~SwCondCollPage()
{
    for(USHORT i = 0; i < aFilterLB.GetEntryCount(); ++i)
        delete (USHORT*)aFilterLB.GetEntryData(i);

}


int __EXPORT SwCondCollPage::DeactivatePage(SfxItemSet * pSet)
{
    FillItemSet(*pSet);

    return LEAVE_PAGE;
}

/****************************************************************************
Page: Factory
****************************************************************************/


SfxTabPage* __EXPORT SwCondCollPage::Create(Window *pParent, const SfxItemSet &rSet)
{
    return new SwCondCollPage(pParent, rSet);
}

/****************************************************************************
Page: FillItemSet-Overload
****************************************************************************/


BOOL __EXPORT SwCondCollPage::FillItemSet(SfxItemSet &rSet)
{
    BOOL bModified = TRUE;
    SwCondCollItem aCondItem;
    for(USHORT i = 0; i < aStrArr.Count(); i++)
    {
        String sEntry = aTbLinks.GetEntryText(i, 1);
        aCondItem.SetStyle( &sEntry, i);
    }
    rSet.Put(aCondItem);
    return bModified;
}

/****************************************************************************
Page: Reset-Overload
****************************************************************************/


void __EXPORT SwCondCollPage::Reset(const SfxItemSet &rSet)
{
    if(bNewTemplate)
        aConditionCB.Enable();
    if(RES_CONDTXTFMTCOLL == pFmt->Which())
        aConditionCB.Check();
    OnOffHdl(&aConditionCB);

    aTbLinks.Clear();

    SfxStyleSheetBasePool* pPool = rSh.GetView().GetDocShell()->GetStyleSheetPool();
    pPool->SetSearchMask(SFX_STYLE_FAMILY_PARA, SFXSTYLEBIT_ALL);
    aStyleLB.Clear();
    const SfxStyleSheetBase* pBase = pPool->First();
    while( pBase )
    {
        if(!pFmt || pBase->GetName() != pFmt->GetName())
            aStyleLB.InsertEntry(pBase->GetName());
        pBase = pPool->Next();
    }
    aStyleLB.SelectEntryPos(0);

    for( USHORT n = 0; n < aStrArr.Count(); n++)
    {
        String aEntry( aStrArr.GetString(n) );
        aEntry += '\t';

        const SwCollCondition* pCond;
        if( pFmt && RES_CONDTXTFMTCOLL == pFmt->Which() &&
            0 != ( pCond = ((SwConditionTxtFmtColl*)pFmt)->
            HasCondition( SwCollCondition( 0, pCmds[n].nCnd, pCmds[n].nSubCond ) ) )
            && pCond->GetTxtFmtColl() )
        {
            aEntry += pCond->GetTxtFmtColl()->GetName();
        }

        SvLBoxEntry* pE = aTbLinks.InsertEntry( aEntry, n );
        if(0 == n)
            aTbLinks.Select(pE);
    }

}

/****************************************************************************

****************************************************************************/


USHORT* __EXPORT SwCondCollPage::GetRanges()
{
    return aPageRg;
}


/****************************************************************************

****************************************************************************/


IMPL_LINK( SwCondCollPage, OnOffHdl, CheckBox*, pBox )
{
    const BOOL bEnable = pBox->IsChecked();
    aContextFT.Enable( bEnable );
    aUsedFT   .Enable( bEnable );
    aTbLinks  .Enable( bEnable );
    aStyleFT  .Enable( bEnable );
    aStyleLB  .Enable( bEnable );
    aFilterLB .Enable( bEnable );
    aRemovePB .Enable( bEnable );
    aAssignPB .Enable( bEnable );
    if( bEnable )
        SelectHdl(0);
    return 0;
}

/****************************************************************************

****************************************************************************/


IMPL_LINK( SwCondCollPage, AssignRemoveHdl, PushButton*, pBtn)
{
    SvLBoxEntry* pE = aTbLinks.FirstSelected();
    ULONG nPos;
    if( !pE || LISTBOX_ENTRY_NOTFOUND ==
        ( nPos = aTbLinks.GetModel()->GetAbsPos( pE ) ) )
    {
        ASSERT( pE, "wo kommt der leere Eintrag her?" );
        return 0;
    }

    String sSel = aStrArr.GetString( USHORT(nPos) );
    sSel += '\t';

    const BOOL bAssEnabled = pBtn != &aRemovePB && aAssignPB.IsEnabled();
    aAssignPB.Enable( !bAssEnabled );
    aRemovePB.Enable(  bAssEnabled );
    if ( bAssEnabled )
        sSel += aStyleLB.GetSelectEntry();

    aTbLinks.SetUpdateMode(FALSE);
    aTbLinks.GetModel()->Remove(pE);
    pE = aTbLinks.InsertEntry(sSel, nPos);
    aTbLinks.Select(pE);
    aTbLinks.MakeVisible(pE);
    aTbLinks.SetUpdateMode(TRUE);
    return 0;
}

/****************************************************************************

****************************************************************************/


IMPL_LINK( SwCondCollPage, SelectHdl, ListBox*, pBox)
{
    if(pBox == &aFilterLB)
    {
        aStyleLB.Clear();
        USHORT nSearchFlags = pBox->GetSelectEntryPos();
        nSearchFlags = *(USHORT*)aFilterLB.GetEntryData(nSearchFlags);
        SfxStyleSheetBasePool* pPool = rSh.GetView().GetDocShell()->GetStyleSheetPool();
        pPool->SetSearchMask(SFX_STYLE_FAMILY_PARA, nSearchFlags);
        const SfxStyleSheetBase* pBase = pPool->First();
        while( pBase )
        {
            if(!pFmt || pBase->GetName() != pFmt->GetName())
                aStyleLB.InsertEntry(pBase->GetName());
            pBase = pPool->Next();
        }
        aStyleLB.SelectEntryPos(0);
        SelectHdl(&aStyleLB);

    }
    else
    {
        String sTbEntry;
        SvLBoxEntry* pE = aTbLinks.FirstSelected();
        if(pE)
            sTbEntry = aTbLinks.GetEntryText(pE);
        sTbEntry = sTbEntry.GetToken(1, '\t');
        String sStyle = aStyleLB.GetSelectEntry();

        aAssignPB.Enable( sStyle != sTbEntry && aConditionCB.IsChecked() );

        if(pBox != &aStyleLB)
            aRemovePB.Enable( aConditionCB.IsChecked() && sTbEntry.Len() );
    }
    return 0;
}

/****************************************************************************

****************************************************************************/


void SwCondCollPage::SetCollection( SwFmt* pFormat, BOOL bNew )
{
    pFmt = pFormat;
    bNewTemplate = bNew;
}


/****************************************************************************
    Item fuer den Transport der Bedingungstabelle
****************************************************************************/


SwCondCollItem::SwCondCollItem(USHORT nWhich ) :
    SfxPoolItem(nWhich)
{

}
/****************************************************************************

****************************************************************************/


SwCondCollItem::~SwCondCollItem()
{
}

/****************************************************************************

****************************************************************************/


SfxPoolItem*   SwCondCollItem::Clone( SfxItemPool *pPool ) const
{
    return new SwCondCollItem(*this);
}

/****************************************************************************

****************************************************************************/


int SwCondCollItem::operator==( const SfxPoolItem& rItem) const
{
    DBG_ASSERT( SfxPoolItem::operator==(rItem), "unterschiedliche Typen" );
    BOOL bReturn = TRUE;
    for(USHORT i = 0; i < COND_COMMAND_COUNT; i++)
        if(sStyles[i] != ((SwCondCollItem&)rItem).sStyles[i])
        {
            bReturn = FALSE;
            break;
        }

    return bReturn;
}

/****************************************************************************

****************************************************************************/


const String&   SwCondCollItem::GetStyle(USHORT nPos) const
{
#ifndef IRIX
    return nPos < COND_COMMAND_COUNT ? sStyles[nPos] : aEmptyStr;
#else
    return nPos < COND_COMMAND_COUNT ? (String)sStyles[nPos] : aEmptyStr;
#endif
}

/****************************************************************************

****************************************************************************/


void SwCondCollItem::SetStyle(const String* pStyle, USHORT nPos)
{
    if( nPos < COND_COMMAND_COUNT )
#ifndef IRIX
        sStyles[nPos] = pStyle ? *pStyle : aEmptyStr;
#else
        sStyles[nPos] = pStyle ? (String)*pStyle : aEmptyStr;
#endif
}


/****************************************************************************

****************************************************************************/


const CommandStruct* SwCondCollItem::GetCmds()
{
    return aCmds;
}


/*************************************************************************

      $Log: not supported by cvs2svn $
      Revision 1.21  2000/09/18 16:05:13  willem.vandorp
      OpenOffice header added.

      Revision 1.20  2000/04/20 12:54:31  os
      GetName() returns String&

      Revision 1.19  2000/02/11 14:43:33  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.18  1999/05/06 07:52:58  OS
      #65847# Font an der TabListBox nicht aendern


      Rev 1.17   06 May 1999 09:52:58   OS
   #65847# Font an der TabListBox nicht aendern

      Rev 1.16   10 Jul 1998 13:46:30   MH
   internal comp.err

      Rev 1.15   21 Jan 1998 17:57:38   JP
   neu: neue Bedinung - Endnote

      Rev 1.14   17 Jan 1998 09:45:14   OS
   Numerierung und Gliederung bis 10.

      Rev 1.13   30 Sep 1997 15:53:30   TJ
   include

      Rev 1.12   01 Sep 1997 13:25:28   OS
   DLL-Umstellung

      Rev 1.11   09 Jul 1997 17:20:50   HJS
   includes

      Rev 1.10   06 Jun 1997 16:25:54   OS
   im Reset ::Clear auch an der Vorlagen-Box rufen

      Rev 1.9   05 Feb 1997 10:18:52   OM
   FillItemSet in DeactivatePage rufen

      Rev 1.8   14 Nov 1996 12:44:36   OS
   DLG_STYLE_DESIGNER

      Rev 1.7   14 Nov 1996 08:39:04   SWG
   neu: RES_TEMPLATE_FAMILIES

      Rev 1.6   11 Nov 1996 09:16:40   MA
   ResMgr

      Rev 1.5   02 Oct 1996 08:35:56   MA
   Umstellung Enable/Disable

      Rev 1.4   25 Sep 1996 11:20:32   PL
   IRIX

      Rev 1.3   23 Sep 1996 08:23:44   OS
   keine GroupBox fuer Bedingungs-TabPage

      Rev 1.2   18 Sep 1996 19:01:38   OS
   neu: HScrollBars, Disable/Enable-Bug behoben

      Rev 1.1   17 Sep 1996 16:19:18   OS
   UI-Anpassung bedingte Vorlagen

      Rev 1.0   06 Sep 1996 19:01:44   JP
   TabPage fuer bedingte Vorlagen

*************************************************************************/


diff --git a/sw/source/ui/chrdlg/ccoll.hrc b/sw/source/ui/chrdlg/ccoll.hrc
new file mode 100644
index 0000000..a327ff5
--- /dev/null
+++ b/sw/source/ui/chrdlg/ccoll.hrc
@@ -0,0 +1,84 @@
/*************************************************************************
 *
 *  $RCSfile: ccoll.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:32 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _CCOLL_HRC
#define _CCOLL_HRC

// #define ******************************************************************

#define CB_CONDITION        1
#define GB_CONDITION            2
#define FT_CONTEXT          3
#define FT_USED         4
#define TB_CONDCOLLS            5
#define FT_STYLE            6
#define LB_STYLE            7
#define LB_FILTER           8
#define PB_REMOVE           9
#define PB_ASSIGN          10
#define STR_REGIONS            11
#define STR_NOTEMPL        12


// ********************************************************************** EOF

#endif

diff --git a/sw/source/ui/chrdlg/ccoll.src b/sw/source/ui/chrdlg/ccoll.src
new file mode 100644
index 0000000..c198463
--- /dev/null
+++ b/sw/source/ui/chrdlg/ccoll.src
@@ -0,0 +1,949 @@
/*************************************************************************
 *
 *  $RCSfile: ccoll.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:32 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
 // #pragma ******************************************************************

 // #include *****************************************************************
#include "globals.hrc"
#include "chrdlg.hrc"
#include "ccoll.hrc"
#include "helpid.h"
 // TabPage ******************************************************************
TabPage TP_CONDCOLL
{
    HelpID = HID_COND_COLL ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Hide = TRUE ;
    CheckBox CB_CONDITION
    {
        Pos = MAP_APPFONT ( 12 , 10 ) ;
        Size = MAP_APPFONT ( 100 , 10 ) ;
        Text = "~Als bedingte Vorlage" ;
        Text [ English ] = "~As conditioned Style" ;
        TabStop = TRUE ;
        Disable = TRUE ;
        Text [ english_us ] = "~Conditional Style" ;
        Text [ italian ] = "Come modello condizionato" ;
        Text [ spanish ] = "C~omo estilo condicional" ;
        Text [ french ] = "Co~mme style conditionnel" ;
        Text [ dutch ] = "~Als conditioneel opmaakprofiel" ;
        Text [ swedish ] = "som villkorlig m~all" ;
        Text [ danish ] = "Som betinget typografi" ;
        Text [ portuguese_brazilian ] = "~Als bedingte Vorlage" ;
        Text [ portuguese ] = "~Estilo condicional" ;
        Text[ chinese_simplified ] = "µ±×÷ÓÐÌõ¼þµÄÑùʽ(~S)";
        Text[ russian ] = "Êàê óñëîâíûé ñòèëü";
        Text[ polish ] = "Jako warunkowy szablon";
        Text[ japanese ] = "ðŒ•t‚«½À²Ù‚Æ‚µ‚Ä(~S)";
        Text[ chinese_traditional ] = "·í§@¦³±ø¥óªº¼Ë¦¡(~S)";
        Text[ arabic ] = "ßäãØ ãÔÑæØ";
        Text[ greek ] = "Ùò åîáñôþìåíï ðñüôõðï";
        Text[ korean ] = "Á¶°ÇÀû À¯Çü(~C)";
        Text[ turkish ] = "~Koþullu biçim olarak";
        Text[ language_user1 ] = "\"Vorlagen\" Styles are capitalized. EM15.5.00";
    };
    FixedText FT_CONTEXT
    {
        Pos = MAP_APPFONT ( 12 , 25 ) ;
        Size = MAP_APPFONT ( 50 , 10 ) ;
        Text = "~Kontext" ;
        Text [ English ] = "~Context" ;
        Disable = TRUE ;
        Text [ dutch ] = "~Context" ;
        Text [ english_us ] = "Conte~xt" ;
        Text [ italian ] = "Contesto" ;
        Text [ spanish ] = "~Contexto" ;
        Text [ french ] = "~Contexte" ;
        Text [ swedish ] = "~Sammanhang" ;
        Text [ danish ] = "Kontekst" ;
        Text [ portuguese ] = "~Contexto" ;
        Text [ portuguese_brazilian ] = "~Kontext" ;
        Text[ chinese_simplified ] = "ÉÏÏÂÎÄ(~C)";
        Text[ russian ] = "~Êîíòåêñò";
        Text[ polish ] = "Kontekst";
        Text[ japanese ] = "ºÝ÷½Ä(~C)";
        Text[ chinese_traditional ] = "¤W¤U¤å(~C)";
        Text[ arabic ] = "ÇáÓíÇÞ";
        Text[ greek ] = "Óõìöñáæüìåíá";
        Text[ korean ] = "³»¿ë(~C)";
        Text[ turkish ] = "Baðlam";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_USED
    {
        Pos = MAP_APPFONT ( 100 , 25 ) ;
        Size = MAP_APPFONT ( 80 , 10 ) ;
        Text = "Verwendete Vorlage" ;
        Text [ English ] = "Used Style" ;
        Disable = TRUE ;
        Text [ dutch ] = "Gebruikt opmaakprofiel" ;
        Text [ english_us ] = "Applied Styles" ;
        Text [ italian ] = "Modello utilizzato" ;
        Text [ spanish ] = "Estilos utilizados" ;
        Text [ french ] = "Style utilisé" ;
        Text [ swedish ] = "Använda formatmallar" ;
        Text [ danish ] = "Anvendt typografi" ;
        Text [ portuguese ] = "Estilos em uso" ;
        Text [ portuguese_brazilian ] = "Verwendete Vorlage" ;
        Text[ chinese_simplified ] = "ʹÓõÄÑùʽ";
        Text[ russian ] = "Ïðèìåíåííûå ñòèëè";
        Text[ polish ] = "U¿yte style";
        Text[ japanese ] = "Žg—p‚³‚ꂽ½À²Ù";
        Text[ chinese_traditional ] = "¨Ï¥Îªº¼Ë¦¡";
        Text[ arabic ] = "ÃäãÇØ ÞíÏ ÇáÇÓÊÎÏÇã";
        Text[ greek ] = "ÅöáñìïóìÝíá ðñüôõðá";
        Text[ korean ] = "À¯ÇüÀÌ Àû¿ëµÇ¾ú½À´Ï´Ù.";
        Text[ turkish ] = "Uygulanan biçim";
        Text[ language_user1 ] = " ";
    };
    Control TB_CONDCOLLS
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 12 , 36 ) ;
        Size = MAP_APPFONT ( 173 , 80 ) ;
        TabStop = TRUE ;
        ClipChildren = TRUE ;
        Disable = TRUE ;
        Border = TRUE ;
    };
    FixedText FT_STYLE
    {
        Pos = MAP_APPFONT ( 190 , 25 ) ;
        Size = MAP_APPFONT ( 50 , 10 ) ;
        Text = "Absatzvorlagen" ;
        Text [ English ] = "Styles" ;
        Disable = TRUE ;
        Text [ dutch ] = "Alineaprofielen" ;
        Text [ english_us ] = "Paragraph Styles" ;
        Text [ italian ] = "Modelli di paragrafo" ;
        Text [ spanish ] = "Estilos de párrafo" ;
        Text [ french ] = "Styles de paragraphe" ;
        Text [ swedish ] = "Styckeformatmallar" ;
        Text [ danish ] = "Afsnitstypografier" ;
        Text [ portuguese ] = "Estilos de parágrafo" ;
        Text [ portuguese_brazilian ] = "Absatzvorlagen" ;
        Text[ chinese_simplified ] = "¶ÎÂäÑùʽ";
        Text[ russian ] = "Ñòèëè àáçàöà";
        Text[ polish ] = "Style akapitu";
        Text[ japanese ] = "’i—޽À²Ù";
        Text[ chinese_traditional ] = "¬q¸¨¼Ë¦¡";
        Text[ arabic ] = "ÃäãÇØ ÝÞÑÉ";
        Text[ greek ] = "Ðñüôõðá ðáñáãñÜöïõ";
        Text[ korean ] = "´Ü¶ô À¯Çü";
        Text[ turkish ] = "Paragraf biçimi";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_STYLE
    {
        Pos = MAP_APPFONT ( 188 , 36 ) ;
        Size = MAP_APPFONT ( 60 , 60 ) ;
        TabStop = TRUE ;
        Border = TRUE ;
        Sort = TRUE ;
        Disable = TRUE ;
        HScroll = TRUE ;
    };
    ListBox LB_FILTER
    {
        Pos = MAP_APPFONT ( 188 , 104 ) ;
        Size = MAP_APPFONT ( 60 , 50 ) ;
        DropDown = TRUE ;
        TabStop = TRUE ;
        Border = TRUE ;
        Disable = TRUE ;
        HScroll = TRUE ;
    };
    PushButton PB_REMOVE
    {
        Pos = MAP_APPFONT ( 129 , 119 ) ;
        Size = MAP_APPFONT ( 50 , 12 ) ;
        Text = "~Entfernen" ;
        Text [ English ] = "~Remove" ;
        TabStop = TRUE ;
        Disable = TRUE ;
        Text [ dutch ] = "~Verwijderen" ;
        Text [ english_us ] = "Re~move" ;
        Text [ italian ] = "~Rimuovi" ;
        Text [ spanish ] = "~Eliminar" ;
        Text [ french ] = "~Supprimer" ;
        Text [ swedish ] = "Ta ~bort" ;
        Text [ danish ] = "Fjern" ;
        Text [ portuguese ] = "~Remover" ;
        Text [ portuguese_brazilian ] = "~Entfernen" ;
        Text[ chinese_simplified ] = "ɾ³ý(~R)";
        Text[ russian ] = "~Óäàëèòü";
        Text[ polish ] = "~Usuñ";
        Text[ japanese ] = "íœ(~R)";
        Text[ chinese_traditional ] = "§R°£(~R)";
        Text[ arabic ] = "ÅÒÇáÉ";
        Text[ greek ] = "ÄéáãñáöÞ";
        Text[ korean ] = "Á¦°Å(~M)";
        Text[ turkish ] = "~Kaldýr";
        Text[ language_user1 ] = " ";
    };
    PushButton PB_ASSIGN
    {
        Pos = MAP_APPFONT ( 185 , 119 ) ;
        Size = MAP_APPFONT ( 50 , 12 ) ;
        Text = "~Zuweisen" ;
        Text [ English ] = "Assign" ;
        TabStop = TRUE ;
        Disable = TRUE ;
        Text [ dutch ] = "~Toewijzen" ;
        Text [ english_us ] = "~Apply" ;
        Text [ italian ] = "~Assegna" ;
        Text [ spanish ] = "~Asignar" ;
        Text [ french ] = "~Assigner" ;
        Text [ swedish ] = "Till~dela" ;
        Text [ danish ] = "Tildel" ;
        Text [ portuguese ] = "~Atribuir" ;
        Text [ portuguese_brazilian ] = "~Zuweisen" ;
        Text[ chinese_simplified ] = "Ö¸¶¨(~A)";
        Text[ russian ] = "~Íàçíà÷èòü";
        Text[ polish ] = "P~rzypisz";
        Text[ japanese ] = "Š„‚è“–‚Ä(~A)";
        Text[ chinese_traditional ] = "¤À°t(~A)";
        Text[ arabic ] = "ÊÚííä";
        Text[ greek ] = "Áíôéóôïß÷éóç";
        Text[ korean ] = "ÁöÁ¤(~A)";
        Text[ turkish ] = "~Ata";
        Text[ language_user1 ] = " ";
    };
    StringArray STR_REGIONS
    {
        ItemList =
        {
            < "Tabellen Kopfzeile" ; > ;
            < "Tabelle" ; > ;
            < "Rahmen" ; > ;
            < "Bereich" ; > ;
            /* ### ACHTUNG: Neuer Eintrag in Liste? 5 : Fußnote*/
            < "Fußnote" ; > ;
            < "Endnote" ; > ;
            < "Kopfzeile" ; > ;
            < "Fusszeile" ; > ;
            < " 1. Ebene Gliederung" ; > ;
            < " 2. Ebene Gliederung" ; > ;
            < " 3. Ebene Gliederung" ; > ;
            < " 4. Ebene Gliederung" ; > ;
            < " 5. Ebene Gliederung" ; > ;
            < " 6. Ebene Gliederung" ; > ;
            < " 7. Ebene Gliederung" ; > ;
            < " 8. Ebene Gliederung" ; > ;
            < " 9. Ebene Gliederung" ; > ;
            < "10. Ebene Gliederung" ; > ;
            < " 1. Ebene Nummerierung" ; > ;
            < " 2. Ebene Nummerierung" ; > ;
            < " 3. Ebene Nummerierung" ; > ;
            < " 4. Ebene Nummerierung" ; > ;
            < " 5. Ebene Nummerierung" ; > ;
            < " 6. Ebene Nummerierung" ; > ;
            < " 7. Ebene Nummerierung" ; > ;
            < " 8. Ebene Nummerierung" ; > ;
            < " 9. Ebene Nummerierung" ; > ;
            < "10. Ebene Nummerierung" ; > ;
        };
        ItemList [ English ] =
        {
            < "Tabellen Kopfzeile" ; > ;
            < "Tabelle" ; > ;
            < "Rahmen" ; > ;
            < "Bereich" ; > ;
            < "Fußnote" ; > ;
            < "Endnote" ; > ;
            < "Kopfzeile" ; > ;
            < "Fusszeile" ; > ;
            < " 1. Ebene Gliederung" ; > ;
            < " 2. Ebene Gliederung" ; > ;
            < " 3. Ebene Gliederung" ; > ;
            < " 4. Ebene Gliederung" ; > ;
            < " 5. Ebene Gliederung" ; > ;
            < " 6. Ebene Gliederung" ; > ;
            < " 7. Ebene Gliederung" ; > ;
            < " 8. Ebene Gliederung" ; > ;
            < " 9. Ebene Gliederung" ; > ;
            < "10. Ebene Gliederung" ; > ;
            < " 1. Ebene Numerierung" ; > ;
            < " 2. Ebene Numerierung" ; > ;
            < " 3. Ebene Numerierung" ; > ;
            < " 4. Ebene Numerierung" ; > ;
            < " 5. Ebene Numerierung" ; > ;
            < " 6. Ebene Numerierung" ; > ;
            < " 7. Ebene Numerierung" ; > ;
            < " 8. Ebene Numerierung" ; > ;
            < " 9. Ebene Numerierung" ; > ;
            < "10. Ebene Numerierung" ; > ;
        };
        itemlist [ portuguese ] =
        {
            < "Cabeçalho de folha" ; > ;
            < "Folha" ; > ;
            < "Moldura" ; > ;
            < "Secção" ; > ;
            < "Nota de rodapé" ; > ;
            < "Nota final" ; > ;
            < "Cabeçalho" ; > ;
            < "Rodapé" ; > ;
            < "1° nível do esquema" ; > ;
            < "2° nível do esquema" ; > ;
            < "3° nível do esquema" ; > ;
            < "4° nível do esquema" ; > ;
            < "5° nível do esquema" ; > ;
            < "6° nível do esquema" ; > ;
            < "7° nível do esquema" ; > ;
            < "8° nível do esquema" ; > ;
            < "9° nível do esquema" ; > ;
            < "10° nível do esquema" ; > ;
            < "1° nível de numeração" ; > ;
            < "2° nível de numeração" ; > ;
            < "3° nível de numeração" ; > ;
            < "4° nível de numeração" ; > ;
            < "5° nível de numeração" ; > ;
            < "6° nível de numeração" ; > ;
            < "7° nível de numeração" ; > ;
            < "8° nível de numeração" ; > ;
            < "9° nível de numeração" ; > ;
            < "10° nível de numeração" ; > ;
        };
        itemlist [ english_us ] =
        {
            < "Sheet Header" ; > ;
            < "Table" ; > ;
            < "Frame" ; > ;
            < "Section" ; > ;
            < "Footnote" ; > ;
            < "Endnote" ; > ;
            < "Header" ; > ;
            < "Footer" ; > ;
            < " 1st Outline Level" ; > ;
            < " 2nd Outline Level" ; > ;
            < " 3rd Outline Level" ; > ;
            < " 4th Outline Level" ; > ;
            < " 5th Outline Level" ; > ;
            < " 6th Outline Level" ; > ;
            < " 7th Outline Level" ; > ;
            < " 8th Outline Level" ; > ;
            < " 9th Outline Level" ; > ;
            < "10th Outline Level" ; > ;
            < " 1st Numbering Level" ; > ;
            < " 2nd Numbering Level" ; > ;
            < " 3rd Numbering Level" ; > ;
            < " 4th Numbering Level" ; > ;
            < " 5th Numbering Level" ; > ;
            < " 6th Numbering Level" ; > ;
            < " 7th Numbering Level" ; > ;
            < " 8th Numbering Level" ; > ;
            < " 9th Numbering Level" ; > ;
            < "10th Numbering Level" ; > ;
        };
        itemlist [ portuguese_brazilian ] =
        {
            < "Tabellen Kopfzeile" ; > ;
            < "Tabelle" ; > ;
            < "Rahmen" ; > ;
            < "Bereich" ; > ;
            < "Fußnote" ; > ;
            < "Kopfzeile" ; > ;
            < "Fusszeile" ; > ;
            < "1. Ebene Gliederung" ; > ;
            < "2. Ebene Gliederung" ; > ;
            < "3. Ebene Gliederung" ; > ;
            < "4. Ebene Gliederung" ; > ;
            < "5. Ebene Gliederung" ; > ;
            < "1. Ebene Numerierung" ; > ;
            < "2. Ebene Numerierung" ; > ;
            < "3. Ebene Numerierung" ; > ;
            < "4. Ebene Numerierung" ; > ;
            < "5. Ebene Numerierung" ; > ;
            < "10. Ebene Gliederung" ; > ;
            < "1. Ebene Numerierung" ; > ;
            < "2. Ebene Numerierung" ; > ;
            < "3. Ebene Numerierung" ; > ;
            < "4. Ebene Numerierung" ; > ;
            < "5. Ebene Numerierung" ; > ;
            < "6. Ebene Numerierung" ; > ;
            < "7. Ebene Numerierung" ; > ;
            < "8. Ebene Numerierung" ; > ;
            < "9. Ebene Numerierung" ; > ;
            < "10. Ebene Numerierung" ; > ;
        };
        itemlist [ swedish ] =
        {
            < "Sidhuvud tabell" ; > ;
            < "Tabell" ; > ;
            < "Ram" ; > ;
            < "Område" ; > ;
            < "Fotnot" ; > ;
            < "Slutnot" ; > ;
            < "Sidhuvud" ; > ;
            < "Sidfot" ; > ;
            < "1:a dispositionsnivån" ; > ;
            < "2:a dispositionsnivån" ; > ;
            < "3:e dispositionsnivån" ; > ;
            < "4:e dispositionsnivån" ; > ;
            < "5:e dispositionsnivån" ; > ;
            < "2:a dispositionsnivån" ; > ;
            < "7:e dispositionsnivån" ; > ;
            < "8:e dispositionsnivån" ; > ;
            < "9:e dispositionsnivån" ; > ;
            < "10:e dispositionsnivån" ; > ;
            < "1:a numreringsnivån" ; > ;
            < "2:a numreringsnivån" ; > ;
            < "3:e numreringsnivån" ; > ;
            < "4:e numreringsnivån" ; > ;
            < "5:e numreringsnivån" ; > ;
            < "6:e numreringsnivån" ; > ;
            < "7:e numreringsnivån" ; > ;
            < "8:e numreringsnivån" ; > ;
            < "9:e numreringsnivån" ; > ;
            < "10:e numreringsnivån" ; > ;
        };
        itemlist [ danish ] =
        {
            < "Tabelsidehoved" ; > ;
            < "Tabel" ; > ;
            < "Ramme" ; > ;
            < "Område" ; > ;
            < "Fodnote" ; > ;
            < "Slutnote" ; > ;
            < "Sidehoved" ; > ;
            < "Sidefod" ; > ;
            < "1. dispositionsniveau" ; > ;
            < "2. dispositionsniveau" ; > ;
            < "3. dispositionsniveau" ; > ;
            < "4. dispositionsniveau" ; > ;
            < "5. dispositionsniveau" ; > ;
            < "6. dispositionsniveau" ; > ;
            < "7. dispositionsniveau" ; > ;
            < "8. dispositionsniveau" ; > ;
            < "9. dispositionsniveau" ; > ;
            < "10. dispositionsniveau" ; > ;
            < "1. nummereringsniveau" ; > ;
            < "2. nummereringsniveau" ; > ;
            < "3. nummereringsniveau" ; > ;
            < "4. nummereringsniveau" ; > ;
            < "5. nummereringsniveau" ; > ;
            < "6. nummereringsniveau" ; > ;
            < "7. nummereringsniveau" ; > ;
            < "8. nummereringsniveau" ; > ;
            < "9. nummereringsniveau" ; > ;
            < "10. nummereringsniveau" ; > ;
        };
        itemlist [ italian ] =
        {
            < "Intestazione tabella" ; > ;
            < "Tabella" ; > ;
            < "Cornice" ; > ;
            < "Sezione" ; > ;
            < "Nota a piè pagina" ; > ;
            < "Nota di chiusura" ; > ;
            < "Riga d'intestazione" ; > ;
            < "Piè di pagina" ; > ;
            < "Livello struttura 1" ; > ;
            < "Livello struttura 2" ; > ;
            < "Livello struttura 3" ; > ;
            < "Livello struttura 4" ; > ;
            < "Livello struttura 5" ; > ;
            < "Livello struttura 6" ; > ;
            < "Livello struttura 7 " ; > ;
            < "Livello struttura 8" ; > ;
            < "Livello struttura 9" ; > ;
            < "10° livello di struttura" ; > ;
            < "1° livello di numerazione" ; > ;
            < "2° livello di numerazione" ; > ;
            < "3° livello di numerazione" ; > ;
            < "4° livello di numerazione" ; > ;
            < "5° livello di numerazione" ; > ;
            < "6° livello di numerazione" ; > ;
            < "7° livello di numerazione" ; > ;
            < "8° livello di numerazione" ; > ;
            < "9° livello di numerazione" ; > ;
            < "10° livello di numerazione" ; > ;
        };
        itemlist [ spanish ] =
        {
            < "Encabezamiento de la hoja" ; > ;
            < "Tabla" ; > ;
            < "Marco" ; > ;
            < "Area" ; > ;
            < "Nota al pie" ; > ;
            < "Nota al final" ; > ;
            < "Encabezamiento" ; > ;
            < "Pie de página" ; > ;
            < "1° nivel del esquema" ; > ;
            < "2° nivel del esquema" ; > ;
            < "3° nivel del esquema" ; > ;
            < "4° nivel del esquema" ; > ;
            < "5° nivel del esquema" ; > ;
            < "6° nivel del esquema" ; > ;
            < "7° nivel del esquema" ; > ;
            < "8° nivel del esquema" ; > ;
            < "9° nivel del esquema" ; > ;
            < "10° nivel del esquema" ; > ;
            < "1° nivel de la numeración" ; > ;
            < "2° nivel de la numeración" ; > ;
            < "3° nivel de la numeración" ; > ;
            < "4° nivel de la numeración" ; > ;
            < "5° nivel de la numeración" ; > ;
            < "6° nivel de la numeración" ; > ;
            < "7° nivel de la numeración" ; > ;
            < "8° nivel de la numeración" ; > ;
            < "9° nivel de la numeración" ; > ;
            < "10° nivel de numeración" ; > ;
        };
        itemlist [ french ] =
        {
            < "En-tête tableau" ; > ;
            < "Tableau" ; > ;
            < "Cadre" ; > ;
            < "Section" ; > ;
            < "Note de bas de page" ; > ;
            < "Note de fin" ; > ;
            < "En-tête" ; > ;
            < "Pied de page" ; > ;
            < "1er niveau de plan" ; > ;
            < "2ème niveau de plan" ; > ;
            < "3ème niveau de plan" ; > ;
            < "4ème niveau de plan" ; > ;
            < "5ème niveau de plan" ; > ;
            < "6ème niveau de plan" ; > ;
            < "7ème niveau de plan" ; > ;
            < "8ème niveau de plan" ; > ;
            < "9ème niveau de plan" ; > ;
            < "10ème niveau de plan" ; > ;
            < "1er niveau de numérotation" ; > ;
            < "2ème niveau de numérotation" ; > ;
            < "3ème niveau de numérotation" ; > ;
            < "4ème niveau de numérotation" ; > ;
            < "5ème niveau de numérotation" ; > ;
            < "6ème niveau de numérotation" ; > ;
            < "7ème niveau de numérotation" ; > ;
            < "8ème niveau de numérotation" ; > ;
            < "9ème niveau de numérotation" ; > ;
            < "10ème niveau de numérotation" ; > ;
        };
        itemlist [ dutch ] =
        {
            < "Koptekst tabel" ; > ;
            < "Tabel" ; > ;
            < "Kader" ; > ;
            < "Bereik" ; > ;
            < "Voetnoot" ; > ;
            < "Eindnoot" ; > ;
            < "Koptekst" ; > ;
            < "Voettekst" ; > ;
            < "1. niveau overzicht" ; > ;
            < "2. niveau overzicht" ; > ;
            < "3. niveau overzicht" ; > ;
            < "4. niveau overzicht" ; > ;
            < "5. niveau nummering" ; > ;
            < "6. niveau overzicht" ; > ;
            < "7. niveau overzicht" ; > ;
            < "8. niveau overzicht" ; > ;
            < "9. niveau overzicht" ; > ;
            < "10. niveau overzicht" ; > ;
            < "1. niveau nummering" ; > ;
            < "2.niveau nummering" ; > ;
            < "3.niveau nummering" ; > ;
            < "4. niveau nummering" ; > ;
            < "5. niveau nummering" ; > ;
            < "6. niveau nummering" ; > ;
            < "7. niveau nummering" ; > ;
            < "8. niveau nummering" ; > ;
            < "9. niveau nummering" ; > ;
            < "10. niveau nummering" ; > ;
        };
    ItemList [ chinese_simplified ] =
    {
            < "±í¸ñҳü" ; > ;
        < "±í¸ñ" ; > ;
        < "¿ò" ; > ;
        < "ÇøÓò" ; > ;
        < "×¢½Å" ; > ;
        < "βע" ; > ;
        < "ҳü" ; > ;
        < "Ò³½Å" ; > ;
        < "µÚÒ»¸ö´ó¸Ù¼¶" ; > ;
        < "µÚ¶þ¸ö´ó¸Ù¼¶" ; > ;
        < "µÚÈý¸ö´ó¸Ù¼¶" ; > ;
        < "µÚËĸö´ó¸Ù¼¶" ; > ;
        < "µÚÎå¸ö´ó¸Ù¼¶" ; > ;
        < "µÚÁù¸ö´ó¸Ù¼¶" ; > ;
        < "µÚÆß¸ö´ó¸Ù¼¶" ; > ;
        < "µÚ°Ë¸ö´ó¸Ù¼¶" ; > ;
        < "µÚ¾Å¸ö´ó¸Ù¼¶" ; > ;
        < "µÚÊ®¸ö´ó¸Ù¼¶" ; > ;
        < "µÚÒ»¼¶±àºÅ" ; > ;
        < "µÚ¶þ¼¶±àºÅ" ; > ;
        < "µÚÈý¼¶±àºÅ" ; > ;
        < "µÚËļ¶±àºÅ" ; > ;
        < "µÚÎå¼¶±àºÅ" ; > ;
        < "µÚÁù¼¶±àºÅ" ; > ;
        < "µÚÆß¼¶±àºÅ" ; > ;
        < "µÚ°Ë¼¶±àºÅ" ; > ;
        < "µÚ¾Å¼¶±àºÅ" ; > ;
        < "µÚÊ®¼¶±àºÅ" ; > ;
    };
    ItemList [ russian ] =
    {
            < "Âåðõíèé êîëîíòèòóë òàáëèöû" ; > ;
        < "Òàáëèöà" ; > ;
        < "Ðàìêà" ; > ;
        < "Îáëàñòü" ; > ;
        < "Ñíîñêà" ; > ;
        < "Êîíöåâàÿ ñíîñêà" ; > ;
        < "Âåðõíèé êîëîíòèòóë" ; > ;
        < "Íèæíèé êîëîíòèòóë" ; > ;
        < "1-ûé óðîâåíü ñòðóêòóðû" ; > ;
        < "2-îé óðîâåíü ñòðóêòóðû" ; > ;
        < "3-èé óðîâåíü ñòðóêòóðû" ; > ;
        < "4-ûé óðîâåíü ñòðóêòóðû" ; > ;
        < "5-ûé óðîâåíü ñòðóêòóðû" ; > ;
        < "6-îé óðîâåíü ñòðóêòóðû" ; > ;
        < "7-îé óðîâåíü ñòðóêòóðû" ; > ;
        < "8-îé óðîâåíü ñòðóêòóðû" ; > ;
        < "9-ûé óðîâåíü ñòðóêòóðû" ; > ;
        < "10-ûé óðîâåíü ñòðóêòóðû" ; > ;
        < "1-ûé óðîâåíü íóìåðàöèè" ; > ;
        < "2-îé óðîâåíü íóìåðàöèè" ; > ;
        < "3-èé óðîâåíü íóìåðàöèè" ; > ;
        < "4-ûé óðîâåíü íóìåðàöèè" ; > ;
        < "5-ûé óðîâåíü íóìåðàöèè" ; > ;
        < "6-îé óðîâåíü íóìåðàöèè" ; > ;
        < "7-îé óðîâåíü íóìåðàöèè" ; > ;
        < "8-îé óðîâåíü íóìåðàöèè" ; > ;
        < "9-ûé óðîâåíü íóìåðàöèè" ; > ;
        < "10-ûé óðîâåíü íóìåðàöèè" ; > ;
    };
    ItemList [ polish ] =
    {
            < "Tabele Nag³ówek" ; > ;
        < "Tabela" ; > ;
        < "Ramka" ; > ;
        < "Sekcja" ; > ;
        < "Przypis dolny" ; > ;
        < "Przypis koñc." ; > ;
        < "Nag³ówek" ; > ;
        < "Stopka" ; > ;
        < "1. Poziom kontekstu" ; > ;
        < "2. poziom konspektu" ; > ;
        < "3. Poziom konspektu" ; > ;
        < "4. Poziom konspektu" ; > ;
        < "5. Poziom konspektu" ; > ;
        < "6. Poziom konspektu" ; > ;
        < "7. Poziom konspektu" ; > ;
        < "8. Poziom konspektu" ; > ;
        < "9. Poziom konspektu" ; > ;
        < "10. Poziom konspektu" ; > ;
        < "1 Poziom numeracji" ; > ;
        < "2. Poziom numeracji" ; > ;
        < "3. Poziom numeracji" ; > ;
        < "4. Poziom numeracji" ; > ;
        < "5. Poziom numeracji" ; > ;
        < "6. Poziom numeracji" ; > ;
        < "7. Poziom numeracji" ; > ;
        < "8. Poziom numeracji" ; > ;
        < "9. Poziom numeracji" ; > ;
        < "10. Poziom numeracji" ; > ;
    };
    ItemList [ japanese ] =
    {
            < "•\\‚ÌͯÀÞ" ; > ;
        < "•\\" ; > ;
        < "˜g" ; > ;
        < "”͈Í" ; > ;
        < "‹r’" ; > ;
        < "•¶––‹r’" ; > ;
        < "ͯÀÞ" ; > ;
        < "̯À" ; > ;
        < "1ÚÍÞٖڂ̱³ÄײÝ" ; > ;
        < "2ÚÍÞٖڂ̱³ÄײÝ" ; > ;
        < "3ÚÍÞٖڂ̱³ÄײÝ" ; > ;
        < "4ÚÍÞٖڂ̱³ÄײÝ" ; > ;
        < "5ÚÍÞٖڂ̱³ÄײÝ" ; > ;
        < "6ÚÍÞٖڂ̱³ÄײÝ" ; > ;
        < "7ÚÍÞٖڂ̱³ÄײÝ" ; > ;
        < "8ÚÍÞٖڂ̱³ÄײÝ" ; > ;
        < "9ÚÍÞٖڂ̱³ÄײÝ" ; > ;
        < "10ÚÍÞٖڂ̱³ÄײÝ" ; > ;
        < "1ÚÍÞٖڂ̔ԍ†•t‚¯" ; > ;
        < "2ÚÍÞٖڂ̔ԍ†•t‚¯" ; > ;
        < "3ÚÍÞٖڂ̔ԍ†•t‚¯" ; > ;
        < "4ÚÍÞٖڂ̔ԍ†•t‚¯" ; > ;
        < "5ÚÍÞٖڂ̔ԍ†•t‚¯" ; > ;
        < "6ÚÍÞٖڂ̔ԍ†•t‚¯" ; > ;
        < "7ÚÍÞٖڂ̔ԍ†•t‚¯" ; > ;
        < "8ÚÍÞٖڂ̔ԍ†•t‚¯" ; > ;
        < "9ÚÍÞٖڂ̔ԍ†•t‚¯" ; > ;
        < "10ÚÍÞٖڂ̔ԍ†•t‚¯" ; > ;
    };
    ItemList [ chinese_traditional ] =
    {
            < "ªí®æ­¶­º" ; > ;
        < "ªí®æ" ; > ;
        < "¤å¦r¤è¶ô" ; > ;
        < "°Ï°ì" ; > ;
        < "µù¸}" ; > ;
        < "§Àª`" ; > ;
        < "­¶­º" ; > ;
        < "­¶§À" ; > ;
        < "²Ä¤@­Ó¤jºõ¯Å" ; > ;
        < "²Ä¤G­Ó¤jºõ¯Å" ; > ;
        < "²Ä¤T­Ó¤jºõ¯Å" ; > ;
        < "²Ä¥|­Ó¤jºõ¯Å" ; > ;
        < "²Ä¤­­Ó¤jºõ¯Å" ; > ;
        < "²Ä¤»­Ó¤jºõ¯Å" ; > ;
        < "²Ä¤C­Ó¤jºõ¯Å" ; > ;
        < "²Ä¤K­Ó¤jºõ¯Å" ; > ;
        < "²Ä¤E­Ó¤jºõ¯Å" ; > ;
        < "²Ä¤Q­Ó¤jºõ¯Å" ; > ;
        < "²Ä¤@¯Å½s¸¹" ; > ;
        < "²Ä¤G¯Å½s¸¹" ; > ;
        < "²Ä¤T¯Å½s¸¹" ; > ;
        < "²Ä¥|¯Å½s¸¹" ; > ;
        < "²Ä¤­¯Å½s¸¹" ; > ;
        < "²Ä¤»¯Å½s¸¹" ; > ;
        < "²Ä¤C¯Å½s¸¹" ; > ;
        < "²Ä¤K¯Å½s¸¹" ; > ;
        < "²Ä¤E¯Å½s¸¹" ; > ;
        < "²Ä¤Q¯Å½s¸¹" ; > ;
    };
    ItemList [ arabic ] =
    {
            < "ÑÃÓ ÇáÌÏæá" ; > ;
        < "ÌÏæá" ; > ;
        < "ÅØÇÑ" ; > ;
        < "äØÇÞ" ; > ;
        < "ÍÇÔíÉ ÓÝáíÉ" ; > ;
        < "ÊÚáíÞ ÎÊÇãí" ; > ;
        < "ÑÃÓ ÇáÕÝÍÉ" ; > ;
        < "ÊÐííá ÇáÕÝÍÉ" ; > ;
        < "Ãæá ãÓÊæì ÊÞÓíã" ; > ;
        < "ËÇäí ãÓÊæì ÊÞÓíã" ; > ;
        < "ËÇáË ãÓÊæì ÊÞÓíã" ; > ;
        < "ÑÇÈÚ ãÓÊæì ÊÞÓíã" ; > ;
        < "ÎÇãÓ ãÓÊæì ÊÞÓíã" ; > ;
        < "ÓÇÏÓ ãÓÊæì ÊÞÓíã" ; > ;
        < "ÓÇÈÚ ãÓÊæì ÊÞÓíã" ; > ;
        < "ËÇãä ãÓÊæì ÊÞÓíã" ; > ;
        < "ÊÇÓÚ ãÓÊæì ÊÞÓíã" ; > ;
        < "ÚÇÔÑ ãÓÊæì ÊÞÓíã" ; > ;
        < "Ãæá ãÓÊæì ÊÑÞíã" ; > ;
        < "ËÇäí ãÓÊæì ÊÑÞíã" ; > ;
        < "ËÇáË ãÓÊæì ÊÑÞíã" ; > ;
        < "ÑÇÈÚ ãÓÊæì ÊÑÞíã" ; > ;
        < "ÎÇãÓ ãÓÊæì ÊÑÞíã" ; > ;
        < "ÓÇÏÓ ãÓÊæì ÊÑÞíã" ; > ;
        < "ÓÇÈÚ ãÓÊæì ÊÑÞíã" ; > ;
        < "ËÇãä ãÓÊæì ÊÑÞíã" ; > ;
        < "ÊÇÓÚ ãÓÊæì ÊÑÞíã" ; > ;
        < "ÚÇÔÑ ãÓÊæì ÊÑÞíã" ; > ;
    };
    ItemList [ greek ] =
    {
            < "Êåöáëßäá ðßíáêá" ; > ;
        < "Ðßíáêáò" ; > ;
        < "Ðåñßãñáììá" ; > ;
        < "Åíüôçôá" ; > ;
        < "Õðïóçìåßùóç" ; > ;
        < "Óçìåßùóç ôÝëïõò" ; > ;
        < "Êåöáëßäá" ; > ;
        < "ÕðïóÝëéäï" ; > ;
        < "1ï Åðßðåäï õðïäéáßñåóçò" ; > ;
        < "2ï. Åðßðåäï õðïäéáßñåóçò" ; > ;
        < "3ï Åðßðåäï õðïäéáßñåóçò" ; > ;
        < "4ï Åðßðåäï õðïäéáßñåóçò" ; > ;
        < "5ï Åðßðåäï õðïäéáßñåóçò" ; > ;
        < "6ï Åðßðåäï õðïäéáßñåóçò" ; > ;
        < "7ï Åðßðåäï õðïäéáßñåóçò" ; > ;
        < "8ï Åðßðåäï õðïäéáßñåóçò" ; > ;
        < "9ï Åðßðåäï õðïäéáßñåóçò" ; > ;
        < "10ï Åðßðåäï õðïäéáßñåóçò" ; > ;
        < "1ï. Åðßðåäï áñßèìçóçò" ; > ;
        < "2ï. Åðßðåäï áñßèìçóçò" ; > ;
        < "3ï. Åðßðåäï áñßèìçóçò" ; > ;
        < "4ï. Åðßðåäï áñßèìçóçò" ; > ;
        < "5ï. Åðßðåäï áñßèìçóçò" ; > ;
        < "6ï. Åðßðåäï áñßèìçóçò" ; > ;
        < "7ï. Åðßðåäï áñßèìçóçò" ; > ;
        < "8ï. Åðßðåäï áñßèìçóçò" ; > ;
        < "9ï. Åðßðåäï áñßèìçóçò" ; > ;
        < "10ï. Åðßðåäï áñßèìçóçò" ; > ;
    };
    ItemList [ korean ] =
    {
            < "½ÃÆ® ¸Ó¸®¸»" ; > ;
        < "ǥ" ; > ;
        < "ÅØ½ºÆ® ¹Ú½º" ; > ;
        < "±¸¿ª" ; > ;
        < "°¢ÁÖ" ; > ;
        < "¹ÌÁÖ" ; > ;
        < "¸Ó¸®±Û" ; > ;
        < "¹Ù´Ú±Û" ; > ;
        < "1¹øÂ°°³¿ä¼öÁØ" ; > ;
        < "2¹øÂ°°³¿ä¼öÁØ" ; > ;
        < "3¹øÂ°°³¿ä¼öÁØ" ; > ;
        < "4¹øÂ°°³¿ä¼öÁØ" ; > ;
        < "5¹øÂ°°³¿ä¼öÁØ" ; > ;
        < "6¹øÂ°°³¿ä¼öÁØ" ; > ;
        < "7¹øÂ°°³¿ä¼öÁØ" ; > ;
        < "8¹øÂ°°³¿ä¼öÁØ" ; > ;
        < "9¹øÂ°°³¿ä¼öÁØ" ; > ;
        < "10¹øÂ°°³¿ä¼öÁØ" ; > ;
        < "1¹øÂ° ¹øÈ£ ¸Å±â±â ¼öÁØ" ; > ;
        < "2¹øÂ° ¹øÈ£ ¸Å±â±â ¼öÁØ" ; > ;
        < "3¹øÂ° ¹øÈ£ ¸Å±â±â ¼öÁØ" ; > ;
        < "4¹øÂ° ¹øÈ£ ¸Å±â±â ¼öÁØ" ; > ;
        < "5¹øÂ° ¹øÈ£ ¸Å±â±â ¼öÁØ" ; > ;
        < "6¹øÂ° ¹øÈ£ ¸Å±â±â ¼öÁØ" ; > ;
        < "7¹øÂ° ¹øÈ£ ¸Å±â±â ¼öÁØ" ; > ;
        < "8¹øÂ° ¹øÈ£ ¸Å±â±â ¼öÁØ" ; > ;
        < "9¹øÂ° ¹øÈ£ ¸Å±â±â ¼öÁØ" ; > ;
        < "10¹øÂ° ¹øÈ£ ¸Å±â±â ¼öÁØ" ; > ;
    };
    ItemList [ turkish ] =
    {
            < "Tablo baþlýðý" ; > ;
        < "Tablo" ; > ;
        < "Çerçeve" ; > ;
        < "Bölüm" ; > ;
        < "Dipnot" ; > ;
        < "Sonnot" ; > ;
        < "Üst bilgi" ; > ;
        < "Alt bilgi" ; > ;
        < "1. Anahat düzeyi" ; > ;
        < "2. Anahat düzeyi" ; > ;
        < "3. Anahat düzeyi" ; > ;
        < "4. Anahat düzeyi" ; > ;
        < "5. Anahat düzeyi" ; > ;
        < "6. Anahat düzeyi" ; > ;
        < "7. Anahat düzeyi" ; > ;
        < "8. Anahat düzeyi" ; > ;
        < "9. Anahat düzeyi" ; > ;
        < "10. Anahat düzeyi" ; > ;
        < "1. Numaralama düzeyi" ; > ;
        < "2. Numaralama düzeyi" ; > ;
        < "3. Numaralama düzeyi" ; > ;
        < "4. Numaralama düzeyi" ; > ;
        < "5. Numaralama düzeyi" ; > ;
        < "6. Numaralama düzeyi" ; > ;
        < "7. Numaralama düzeyi" ; > ;
        < "8. Numaralama düzeyi" ; > ;
        < "9. Numaralama düzeyi" ; > ;
        < "10. Numaralama düzeyi" ; > ;
    };
    ItemList [ language_user1 ] =
    {
            < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
    };
    };
    String STR_NOTEMPL
    {
        Text = "<keine>" ;
        Text [ English ] = "<none>" ;
        Text [ dutch ] = "<geen>" ;
        Text [ english_us ] = "<none>" ;
        Text [ italian ] = "<nessuno>" ;
        Text [ spanish ] = "<ninguno>" ;
        Text [ french ] = "<aucun(e)>" ;
        Text [ swedish ] = "<ingen>" ;
        Text [ danish ] = "<ingen>" ;
        Text [ portuguese ] = "<nenhum>" ;
        Text [ portuguese_brazilian ] = "<keine>" ;
        Text[ chinese_simplified ] = "<ÎÞ>";
        Text[ russian ] = "<íåò>";
        Text[ polish ] = "<brak>";
        Text[ japanese ] = "<‚È‚µ>";
        Text[ language_user1 ] = " ";
        Text[ chinese_traditional ] = "<µL>";
        Text[ arabic ] = "<ÈÏæä>";
        Text[ greek ] = "<êáíÝíá>";
        Text[ korean ] = "<¾øÀ½>";
        Text[ turkish ] = "<yok>";
    };
};
 // ********************************************************************** EOF
diff --git a/sw/source/ui/chrdlg/chardlg.cxx b/sw/source/ui/chrdlg/chardlg.cxx
new file mode 100644
index 0000000..a5d17ab
--- /dev/null
+++ b/sw/source/ui/chrdlg/chardlg.cxx
@@ -0,0 +1,520 @@
/*************************************************************************
 *
 *  $RCSfile: chardlg.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:32 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef SVTOOLS_URIHELPER_HXX
#include <svtools/urihelper.hxx>
#endif
#ifndef _SFXSTRITEM_HXX
#include <svtools/stritem.hxx>
#endif
#ifndef _IODLG_HXX
#include <sfx2/iodlg.hxx>
#endif
#ifndef _SVX_CHARDLG_HXX //autogen
#include <svx/chardlg.hxx>
#endif
#ifndef _SVX_BACKGRND_HXX //autogen
#include <svx/backgrnd.hxx>
#endif
#ifndef _SVX_HTMLMODE_HXX //autogen
#include <svx/htmlmode.hxx>
#endif

#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _HELPID_H
#include <helpid.h>
#endif
#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _UIPARAM_HXX
#include <uiparam.hxx>
#endif
#ifndef _ERRHDL_HXX
#include <errhdl.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _UITOOL_HXX
#include <uitool.hxx>
#endif
#ifndef _FMTINFMT_HXX //autogen
#include <fmtinfmt.hxx>
#endif
#ifndef _MACASSGN_HXX
#include <macassgn.hxx>
#endif
#ifndef _CHRDLG_HXX
#include <chrdlg.hxx>       // der Dialog
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _POOLFMT_HXX
#include <poolfmt.hxx>
#endif

#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif
#ifndef _CHRDLG_HRC
#include <chrdlg.hrc>
#endif
#ifndef _CHARDLG_HRC
#include <chardlg.hrc>
#endif


/*--------------------------------------------------------------------
    Beschreibung:   Der Traeger des Dialoges
 --------------------------------------------------------------------*/


SwCharDlg::SwCharDlg(Window* pParent, SwView& rVw, const SfxItemSet& rCoreSet,
                     const String* pStr, BOOL bIsDrwTxtDlg) :
    SfxTabDialog(pParent, SW_RES(DLG_CHAR), &rCoreSet, pStr != 0),
    rView(rVw),
    bIsDrwTxtMode(bIsDrwTxtDlg)
{
    FreeResource();

    // bspFonr fuer beide Bsp-TabPages

    if(pStr)
    {
        String aTmp( GetText() );
        aTmp += SW_RESSTR(STR_TEXTCOLL_HEADER);
        aTmp += *pStr;
        aTmp += ')';
        SetText(aTmp);
    }

    //OS: Unter OS/2 darf die erste TabPage nie per RemoveTabPage entfernt werden
    AddTabPage(TP_CHAR_STD, SvxCharStdPage::Create, 0);
    AddTabPage(TP_CHAR_EXT, SvxCharExtPage::Create, 0);
    AddTabPage(TP_CHAR_URL, SwCharURLPage::Create, 0);
    AddTabPage(TP_BACKGROUND,SvxBackgroundTabPage::Create,  0);
    if(bIsDrwTxtMode)
    {
        RemoveTabPage(TP_CHAR_URL);
        RemoveTabPage(TP_BACKGROUND);
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


SwCharDlg::~SwCharDlg()
{
}

/*--------------------------------------------------------------------
    Beschreibung:   FontList setzen
 --------------------------------------------------------------------*/



void SwCharDlg::PageCreated( USHORT nId, SfxTabPage &rPage )
{
    switch( nId )
    {
        case TP_CHAR_STD:
            ((SvxCharStdPage&)rPage).SetFontList( *( (SvxFontListItem*)
               ( rView.GetDocShell()->GetItem( SID_ATTR_CHAR_FONTLIST ) ) ) );
            break;
        case TP_CHAR_EXT:
            if(bIsDrwTxtMode)
                ((SvxCharExtPage&)rPage).DisableControls(DISABLE_CASEMAP);
            else
                ((SvxCharExtPage&)rPage).EnableFlash();
            break;
    }
}

/*-----------------14.08.96 11.28-------------------

--------------------------------------------------*/

SwCharURLPage::SwCharURLPage(   Window* pParent,
                                const SfxItemSet& rCoreSet ) :
    SfxTabPage( pParent, SW_RES( TP_CHAR_URL ), rCoreSet ),
    aURLGB (        this, SW_RES(GB_URL)),
    aURLFT(         this, SW_RES(FT_URL        )),
    aURLED(         this, SW_RES(ED_URL        )),
    aTextFT(        this, SW_RES(FT_TEXT          )),
    aTextED(        this, SW_RES(ED_TEXT          )),
    aNameFT(        this, SW_RES(FT_NAME    )),
    aNameED(        this, SW_RES(ED_NAME)),
    aTargetFrmFT(   this, SW_RES(FT_TARGET     )),
    aTargetFrmLB(   this, SW_RES(LB_TARGET    )),
    aStyleGB(       this, SW_RES(GB_STYLE      )),
    aVisitedFT(     this, SW_RES(FT_VISITED    )),
    aVisitedLB(     this, SW_RES(LB_VISITED    )),
    aNotVisitedFT(  this, SW_RES(FT_NOT_VISITED)),
    aNotVisitedLB(  this, SW_RES(LB_NOT_VISITED)),
    aEventPB(       this, SW_RES(PB_EVENT      )),
    aURLPB(         this, SW_RES(PB_URL        )),
    pINetItem(0),
    bModified(FALSE)

{
    FreeResource();

    const SfxPoolItem* pItem;
    SfxObjectShell* pShell;
    if(SFX_ITEM_SET == rCoreSet.GetItemState(SID_HTML_MODE, FALSE, &pItem) ||
        ( 0 != ( pShell = SfxObjectShell::Current()) &&
                    0 != (pItem = pShell->GetItem(SID_HTML_MODE))))
    {
        USHORT nHtmlMode = ((const SfxUInt16Item*)pItem)->GetValue();
        if(HTMLMODE_ON & nHtmlMode)
        {
            aStyleGB.Hide();
            aVisitedFT.Hide();
            aVisitedLB.Hide();
            aNotVisitedFT.Hide();
            aNotVisitedLB.Hide();
        }
    }

    aURLPB.SetClickHdl  (LINK( this, SwCharURLPage, InsertFileHdl));
    aEventPB.SetClickHdl(LINK( this, SwCharURLPage, EventHdl ));

    SwView *pView = ::GetActiveView();
    ::FillCharStyleListBox(aVisitedLB, pView->GetDocShell());
    ::FillCharStyleListBox(aNotVisitedLB, pView->GetDocShell());

    TargetList* pList = new TargetList;
    const SfxFrame* pFrame = pView->GetViewFrame()->GetTopFrame();
    pFrame->GetTargetList(*pList);
    USHORT nCount = (USHORT)pList->Count();
    if( nCount )
    {
        for ( USHORT i = 0; i < nCount; i++ )
        {
            aTargetFrmLB.InsertEntry(*pList->GetObject(i));
        }
        for ( i = nCount; i; i-- )
        {
            delete pList->GetObject( i - 1 );
        }
    }
    delete pList;


}

/*-----------------15.08.96 09.04-------------------

--------------------------------------------------*/

SwCharURLPage::~SwCharURLPage()
{
    delete pINetItem;
}

/*-----------------14.08.96 11.31-------------------

--------------------------------------------------*/

void SwCharURLPage::Reset(const SfxItemSet& rSet)
{
    const SfxPoolItem* pItem;
    if(SFX_ITEM_SET == rSet.GetItemState(RES_TXTATR_INETFMT, FALSE, &pItem))
    {
        const SwFmtINetFmt* pINetFmt = (const SwFmtINetFmt*)pItem;
        aURLED.SetText( INetURLObject::decode( pINetFmt->GetValue(),
                                        INET_HEX_ESCAPE,
                                           INetURLObject::DECODE_WITH_CHARSET,
                                        RTL_TEXTENCODING_UTF8 ));
        aURLED.SaveValue();
        aNameED.SetText(pINetFmt->GetName());
        String sEntry = pINetFmt->GetVisitedFmt();
        if( !sEntry.Len() )
            GetDocPoolNm( RES_POOLCHR_INET_VISIT, sEntry );
        aVisitedLB.SelectEntry(sEntry);
        sEntry = pINetFmt->GetINetFmt();
        if(!sEntry.Len())
            GetDocPoolNm( RES_POOLCHR_INET_NORMAL, sEntry );
        aNotVisitedLB.SelectEntry(sEntry);

        aTargetFrmLB.SetText(pINetFmt->GetTargetFrame());
        aVisitedLB.   SaveValue();
        aNotVisitedLB.SaveValue();
        aTargetFrmLB. SaveValue();
        pINetItem = new SvxMacroItem(FN_INET_FIELD_MACRO);

        if( pINetFmt->GetMacroTbl() )
            pINetItem->SetMacroTable( *pINetFmt->GetMacroTbl() );
    }
    if(SFX_ITEM_SET == rSet.GetItemState(FN_PARAM_SELECTION, FALSE, &pItem))
    {
        aTextED.SetText(((const SfxStringItem*)pItem)->GetValue());
        aTextFT.Enable( FALSE );
        aTextED.Enable( FALSE );
    }
}

/*-----------------14.08.96 11.32-------------------

--------------------------------------------------*/

BOOL SwCharURLPage::FillItemSet(SfxItemSet& rSet)
{
    String sURL = aURLED.GetText();
    if(sURL.Len())
        sURL = URIHelper::SmartRelToAbs(sURL);
    SwFmtINetFmt aINetFmt(sURL, aTargetFrmLB.GetText());
    aINetFmt.SetName(aNameED.GetText());
    SwWrtShell &rSh = ::GetActiveView()->GetWrtShell();
    bModified |= aURLED.GetText() != aURLED.GetSavedValue();
    bModified |= aNameED.IsModified();
    bModified |= aTargetFrmLB.GetSavedValue() != aTargetFrmLB.GetText();

    //zuerst die gueltigen Einstellungen setzen
    String sEntry = aVisitedLB.GetSelectEntry();
    USHORT nId = rSh.GetPoolId( sEntry, GET_POOLID_CHRFMT);
    aINetFmt.SetVisitedFmtId(nId);
    aINetFmt.SetVisitedFmt(nId == RES_POOLCHR_INET_VISIT ? aEmptyStr : sEntry);

    sEntry = aNotVisitedLB.GetSelectEntry();
    nId = rSh.GetPoolId( sEntry, GET_POOLID_CHRFMT);
    aINetFmt.SetINetFmtId( nId );
    aINetFmt.SetINetFmt(nId == RES_POOLCHR_INET_NORMAL ? aEmptyStr : sEntry);

    if( pINetItem && pINetItem->GetMacroTable().Count() )
        aINetFmt.SetMacroTbl( &pINetItem->GetMacroTable() );

    if(aVisitedLB.GetSavedValue() != aVisitedLB.GetSelectEntryPos())
        bModified = TRUE;

    if(aNotVisitedLB.GetSavedValue() != aNotVisitedLB.GetSelectEntryPos())
        bModified = TRUE;

    if(aTextED.IsModified())
    {
        bModified = TRUE;
        rSet.Put(SfxStringItem(FN_PARAM_SELECTION, aTextED.GetText()));
    }
    if(bModified)
        rSet.Put(aINetFmt);
    return bModified;
}


/*-----------------14.08.96 11.30-------------------

--------------------------------------------------*/

SfxTabPage* SwCharURLPage::Create(  Window* pParent,
                        const SfxItemSet& rAttrSet )
{
    return ( new SwCharURLPage( pParent, rAttrSet ) );
}

/*-----------------14.08.96 15.00-------------------

--------------------------------------------------*/

IMPL_LINK( SwCharURLPage, InsertFileHdl, PushButton *, pBtn )
{
    SfxFileDialog* pFileDlg = new SfxFileDialog(pBtn, WB_OPEN);
    pFileDlg->DisableSaveLastDirectory();
    pFileDlg->SetHelpId(HID_FILEDLG_CHARDLG);

    if(RET_OK == pFileDlg->Execute())
    {
        aURLED.SetText(URIHelper::SmartRelToAbs(pFileDlg->GetPath()));
    }
    delete pFileDlg;

    return 0;
}
/*-----------------14.08.96 15.00-------------------

--------------------------------------------------*/

IMPL_LINK( SwCharURLPage, EventHdl, PushButton *, EMPTYARG )
{
    bModified |= SwMacroAssignDlg::INetFmtDlg( this,
                    ::GetActiveView()->GetWrtShell(), pINetItem );
    return 0;
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.213  2000/09/18 16:05:13  willem.vandorp
    OpenOffice header added.

    Revision 1.212  2000/08/31 11:37:50  jp
    add missing include

    Revision 1.211  2000/08/17 13:48:23  jp
    UI with decode URL

    Revision 1.210  2000/07/26 16:32:19  jp
    use the new function GetDocPoolNm to get the collectionames

    Revision 1.209  2000/07/03 10:33:17  os
    #72742# resource warnings corrected

    Revision 1.208  2000/06/26 13:06:44  os
    INetURLObject::SmartRelToAbs removed

    Revision 1.207  2000/04/19 12:56:33  os
    include sfx2/filedlg.hxx removed

    Revision 1.206  2000/02/11 14:43:26  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.205  2000/01/24 12:53:41  os
    #72153# call SfxFileDialog::DisableSaveLastDirectory

    Revision 1.204  1999/02/19 07:48:02  MA
    #61949# CurrShell gibt es nicht mehr


      Rev 1.203   19 Feb 1999 08:48:02   MA
   #61949# CurrShell gibt es nicht mehr

      Rev 1.202   12 Feb 1999 07:35:36   OS
   #61800# Keine URL und kein Hintergrund fuer DrawText

      Rev 1.201   02 Sep 1998 14:11:10   OM
   #45378# HelpIDs fuer Dateidialoge

      Rev 1.200   09 Jul 1998 08:57:10   OS
   vor dem putten in jedem Fall Listbox-Inhalte auswerten #52425#

      Rev 1.199   29 Jun 1998 09:39:30   OS
   kein Blinken fuer DrawText#48019#

      Rev 1.198   15 Apr 1998 14:33:06   OS
   ::FillCharStyleListBox

      Rev 1.197   28 Nov 1997 15:01:48   MA
   includes

      Rev 1.196   01 Sep 1997 13:25:14   OS
   DLL-Umstellung

      Rev 1.195   15 Aug 1997 12:12:36   OS
   chartar/frmatr/txtatr aufgeteilt

      Rev 1.194   09 Aug 1997 13:01:46   OS
   paraitem/frmitems/textitem aufgeteilt

      Rev 1.193   08 Aug 1997 17:29:44   OM
   Headerfile-Umstellung

      Rev 1.192   18 Jun 1997 17:30:02   OS
   URL wird jetzt mit SfxFileDialog gesucht #40815#

      Rev 1.191   21 Apr 1997 16:27:00   OS
   TargetFrame jetzt in ComboBox

      Rev 1.190   08 Apr 1997 09:22:40   MA
   chg: falsche Definition entfernt

      Rev 1.189   07 Apr 1997 14:15:08   MH
   chg: header

      Rev 1.188   20 Mar 1997 16:58:20   OS
   Leerstring: URL zuruecksetzen

      Rev 1.187   10 Mar 1997 17:28:48   OS
   URL-Edit per GetSavedValue auf Modifikation testen

      Rev 1.186   14 Feb 1997 18:04:06   OM
   Zahlenformat-Dlg

      Rev 1.185   05 Feb 1997 13:31:32   OS
   keine Zeichenvorlagen fuer Hyperlinks im HTML


------------------------------------------------------------------------*/


diff --git a/sw/source/ui/chrdlg/chardlg.hrc b/sw/source/ui/chrdlg/chardlg.hrc
new file mode 100644
index 0000000..1a03e2a
--- /dev/null
+++ b/sw/source/ui/chrdlg/chardlg.hrc
@@ -0,0 +1,120 @@
/*************************************************************************
 *
 *  $RCSfile: chardlg.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:32 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#define FONT_FT        1
#define FONT_CB        2
#define FACE_FT        3
#define FACE_LB        4
#define SIZE_FT        5
#define SIZE_CB        6
#define OUTLINE_TB     7
#define SHADOW_TB      8
#define UNDERL_TB      9
#define STRIKETHRU_TB  10
#define COLOR_FT       11
#define COLOR_LB       12
#define LANG_FT        13
#define LANG_LB        14
#define EXAMPLE_WN     15
#define EXAMPLE_GB     16
#define CASEMAP_GB     17
#define NONE_RB        20
#define CAPS_RB        21
#define LOWERCASE_RB   22
#define SMALLCAPS_RB   23
#define TITEL_RB       24
#define HIGH_RB        25
#define NORMAL_RB      26
#define DEEP_RB        27
#define DEEPHIGHT_FT   28
#define DEEPHIGH_MF    29
#define RELSIZE_FT     30
#define RELSIZE_MF     31
#define KERN_LB        32
#define KERN_FT        33
#define KERN_MF        34
#define UNDERLINE_FT   35
#define UNDERLINE_LB   36
#define STRIKE_FT      37
#define STRIKE_LB      38
#define STRIKE_CB      39
#define EFFECT_GB      41
#define POS_GB         42
#define POSEXT_GB      43
#define KERN_GB        45
#define FONTTYPE_FT    46

#define GB_URL      50
#define FT_URL          51
#define ED_URL          52
#define GB_STYLE        53
#define FT_VISITED      55
#define LB_VISITED      56
#define FT_NOT_VISITED  57
#define LB_NOT_VISITED  58
#define PB_EVENT        59
#define PB_URL          60
#define LB_TARGET       61
#define FT_TARGET   62
#define FT_TEXT         63
#define ED_TEXT         64
#define FT_NAME         65
#define ED_NAME         66

diff --git a/sw/source/ui/chrdlg/chardlg.src b/sw/source/ui/chrdlg/chardlg.src
new file mode 100644
index 0000000..74cefc4
--- /dev/null
+++ b/sw/source/ui/chrdlg/chardlg.src
@@ -0,0 +1,615 @@
/*************************************************************************
 *
 *  $RCSfile: chardlg.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:32 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "globals.hrc"
#include "chrdlg.hrc"
#include "chardlg.hrc"
#include "helpid.h"

#define LBOX_DIFF 4
TabDialog DLG_CHAR
{
    OutputSize = TRUE ;
    SVLook = TRUE ;
    /* ### ACHTUNG: Neuer Text in Resource? Zeichen : Schrift */
    Text = "Zeichen" ;
    Text [ ENGLISH ] = "Character" ;
    Text [ norwegian ] = "Character" ;
    Text [ italian ] = "Carattere" ;
    Text [ portuguese_brazilian ] = "Caractere" ;
    Text [ portuguese ] = "Caracteres" ;
    Text [ finnish ] = "Merkki" ;
    Text [ danish ] = "Tegn" ;
    Text [ french ] = "Caractère" ;
    Text [ swedish ] = "Tecken" ;
    Text [ dutch ] = "Teken" ;
    Text [ spanish ] = "Caracteres" ;
    Text [ english_us ] = "Character" ;
    Moveable = TRUE ;
    TabControl 1
    {
        OutputSize = TRUE ;
        PageList =
        {
            PageItem
            {
                Identifier = TP_CHAR_STD ;
                Text = "Schrift" ;
                Text [ ENGLISH ] = "Character" ;
                Text [ norwegian ] = "Character" ;
                Text [ italian ] = "Carattere" ;
                Text [ portuguese_brazilian ] = "Caractere" ;
                Text [ portuguese ] = "Tipo de letra" ;
                Text [ finnish ] = "Merkki" ;
                Text [ danish ] = "Skrifttype" ;
                Text [ french ] = "Police" ;
                Text [ swedish ] = "Teckensnitt" ;
                Text [ dutch ] = "Lettertype" ;
                Text [ spanish ] = "Fuente" ;
                Text [ english_us ] = "Font" ;
                PageResID = TP_CHAR_STD ;
                Text[ chinese_simplified ] = "×ÖÌå";
                Text[ russian ] = "Øðèôò";
                Text[ polish ] = "Czcionka";
                Text[ japanese ] = "Ì«ÝÄ";
                Text[ chinese_traditional ] = "¦r«¬";
                Text[ arabic ] = "ÇáÎØ";
                Text[ dutch ] = "Lettertype";
                Text[ chinese_simplified ] = "×ÖÌå";
                Text[ greek ] = "ÃñáììáôïóåéñÜ";
                Text[ korean ] = "±Û²Ã";
                Text[ turkish ] = "Yazýtipi";
            };
            PageItem
            {
                Identifier = TP_CHAR_EXT ;
                Text = "Schrifteffekt" ;
                Text [ ENGLISH ] = "Character Extension" ;
                Text [ norwegian ] = "Character Extension" ;
                Text [ italian ] = "Effetto carattere" ;
                Text [ portuguese_brazilian ] = "Extensão de Caracter" ;
                Text [ portuguese ] = "Efeitos do tipo de letra" ;
                Text [ finnish ] = "Merkin tehosteet" ;
                Text [ danish ] = "Skrifteffekt" ;
                Text [ french ] = "Effet de caractère" ;
                Text [ swedish ] = "Teckensnittseffekt" ;
                Text [ dutch ] = "Schrifteffecten" ;
                Text [ spanish ] = "Efectos de fuente" ;
                Text [ english_us ] = "Font Effects" ;
                PageResID = TP_CHAR_EXT ;
                Text[ chinese_simplified ] = "×ÖÌåЧ¹û";
                Text[ russian ] = "Ýôôåêòû øðèôòà";
                Text[ polish ] = "Efekty czcionek";
                Text[ japanese ] = "Ì«ÝČø‰Ê";
                Text[ chinese_traditional ] = "¤å¦r®ÄªG";
                Text[ arabic ] = "ÊÃËíÑÇÊ ÇáÎØæØ";
                Text[ dutch ] = "Schrifteffecten";
                Text[ chinese_simplified ] = "×ÖÌåЧ¹û";
                Text[ greek ] = "ÅöÝ ÷áñáêôÞñùí";
                Text[ korean ] = "±Û²Ã È¿°ú";
                Text[ turkish ] = "Yazýtipi efektleri";
            };
            PageItem
            {
                Identifier = TP_CHAR_URL ;
                Text = "Hyperlink" ;
                Text [ ENGLISH ] = "Hyperlink" ;
                Text [ english_us ] = "Hyperlink" ;
                Text [ italian ] = "Hyperlink" ;
                Text [ spanish ] = "Hiperenlace" ;
                Text [ french ] = "Hyperlien" ;
                Text [ dutch ] = "Hyperlink" ;
                Text [ swedish ] = "Hyperlänk" ;
                Text [ danish ] = "Hyperlink" ;
                Text [ portuguese_brazilian ] = "Hyperlink" ;
                Text [ portuguese ] = "Hiperligação" ;
                Text[ chinese_simplified ] = "³¬Á´½Ó";
                Text[ russian ] = "Ãèïåðññûëêà";
                Text[ polish ] = "Hiper³¹cze";
                Text[ japanese ] = "ʲÊß°ØÝ¸";
                Text[ chinese_traditional ] = "¶W³sµ²";
                Text[ arabic ] = "ÇÑÊÈÇØ ÊÔÚÈí";
                Text[ dutch ] = "Hyperlink";
                Text[ chinese_simplified ] = "³¬Á´½Ó";
                Text[ greek ] = "Õðåñ-óýíäåóç";
                Text[ korean ] = "ÇÏÀÌÆÛ¸µÅ©";
                Text[ turkish ] = "Hyperlink";
            };
            PageItem
            {
                Identifier = TP_BACKGROUND ;
                Text = "Hintergrund" ;
                Text [ ENGLISH ] = "Background" ;
                Text [ norwegian ] = "Background" ;
                Text [ italian ] = "Sfondo" ;
                Text [ portuguese_brazilian ] = "Fundo" ;
                Text [ portuguese ] = "Plano de fundo" ;
                Text [ finnish ] = "Tausta" ;
                Text [ danish ] = "Baggrund" ;
                Text [ french ] = "Arrière-plan" ;
                Text [ swedish ] = "Bakgrund" ;
                Text [ dutch ] = "Achtergrond" ;
                Text [ spanish ] = "Fondo" ;
                Text [ english_us ] = "Background" ;
                PageResID = TP_BACKGROUND ;
                Text[ chinese_simplified ] = "±³¾°";
                Text[ russian ] = "Ôîí";
                Text[ polish ] = "T³o";
                Text[ japanese ] = "”wŒi";
                Text[ chinese_traditional ] = "­I´º";
                Text[ arabic ] = "ÇáÎáÝíÉ";
                Text[ dutch ] = "Achtergrond";
                Text[ chinese_simplified ] = "±³¾°";
                Text[ greek ] = "Öüíôï";
                Text[ korean ] = "¹è°æ";
                Text[ turkish ] = "Artalan";
            };
        };
    };
    Text[ chinese_simplified ] = "×Ö·û";
    Text[ russian ] = "Çíàê";
    Text[ polish ] = "Znak";
    Text[ japanese ] = "•¶Žš";
    Text[ language_user1 ] = "èëè: Ñèìâîë - -";
    Text[ chinese_traditional ] = "¦r¤¸";
    Text[ arabic ] = "ÇáÎØ";
    Text[ dutch ] = "Teken";
    Text[ chinese_simplified ] = "×Ö·û";
    Text[ greek ] = "×áñáêôÞñåò";
    Text[ korean ] = "¹®ÀÚ";
    Text[ turkish ] = "Karakter";
};
TabDialog DLG_DRAWCHAR
{
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Text = "Schrift" ;
    Text [ ENGLISH ] = "Character" ;
    Text [ norwegian ] = "Character" ;
    Text [ italian ] = "Carattere" ;
    Text [ portuguese_brazilian ] = "Caractere" ;
    Text [ portuguese ] = "Tipo de letra" ;
    Text [ finnish ] = "Merkki" ;
    Text [ danish ] = "Skrifttype" ;
    Text [ french ] = "Police" ;
    Text [ swedish ] = "Teckensnitt" ;
    Text [ dutch ] = "Lettertype" ;
    Text [ spanish ] = "Fuente" ;
    Text [ english_us ] = "Font" ;
    Moveable = TRUE ;
    Closeable = TRUE ;
    TabControl 1
    {
        OutputSize = TRUE ;
        PageList =
        {
            PageItem
            {
                Identifier = TP_CHAR_STD ;
                Text = "Schrift" ;
                Text [ ENGLISH ] = "Character" ;
                Text [ norwegian ] = "Character" ;
                Text [ italian ] = "Carattere" ;
                Text [ portuguese_brazilian ] = "Caractere" ;
                Text [ portuguese ] = "Tipo de letra" ;
                Text [ finnish ] = "Merkki" ;
                Text [ danish ] = "Skrifttype" ;
                Text [ french ] = "Police" ;
                Text [ swedish ] = "Teckensnitt" ;
                Text [ dutch ] = "Lettertype" ;
                Text [ spanish ] = "Fuente" ;
                Text [ english_us ] = "Font" ;
                PageResID = TP_CHAR_STD ;
                Text[ chinese_simplified ] = "×ÖÌå";
                Text[ russian ] = "Øðèôò";
                Text[ polish ] = "Czcionka";
                Text[ japanese ] = "Ì«ÝÄ";
                Text[ chinese_traditional ] = "¦r«¬";
                Text[ arabic ] = "ÇáÎØ";
                Text[ dutch ] = "Lettertype";
                Text[ chinese_simplified ] = "×ÖÌå";
                Text[ greek ] = "ÃñáììáôïóåéñÜ";
                Text[ korean ] = "±Û²Ã";
                Text[ turkish ] = "Yazýtipi";
            };
        };
    };
    Text[ chinese_simplified ] = "×ÖÌå";
    Text[ russian ] = "Øðèôò";
    Text[ polish ] = "Czcionka";
    Text[ japanese ] = "Ì«ÝÄ";
    Text[ chinese_traditional ] = "¦r«¬";
    Text[ arabic ] = "ÇáÎØ";
    Text[ dutch ] = "Lettertype";
    Text[ chinese_simplified ] = "×ÖÌå";
    Text[ greek ] = "ÃñáììáôïóåéñÜ";
    Text[ korean ] = "±Û²Ã";
    Text[ turkish ] = "Yazýtipi";
};
TabPage TP_CHAR_URL
{
    HelpID = HID_CHAR_URL ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Hide = TRUE ;
    GroupBox GB_URL
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 248 , 72 + LBOX_DIFF ) ;
        Text = "Hyperlink" ;
        Text [ English ] = "Hyperlink" ;
        Text [ english_us ] = "Hyperlink" ;
        Text [ italian ] = "Hyperlink" ;
        Text [ spanish ] = "Hiperenlace" ;
        Text [ french ] = "Hyperlien" ;
        Text [ dutch ] = "Hyperlink" ;
        Text [ swedish ] = "Hyperlänk" ;
        Text [ danish ] = "Hyperlink" ;
        Text [ portuguese_brazilian ] = "Hyperlink" ;
        Text [ portuguese ] = "Hiperligação" ;
        Text[ chinese_simplified ] = "³¬Á´½Ó";
        Text[ russian ] = "Ãèïåðññûëêà";
        Text[ polish ] = "Hiper³¹cze";
        Text[ japanese ] = "ʲÊß°ØÝ¸";
        Text[ chinese_traditional ] = "¶W³sµ²";
        Text[ arabic ] = "ÇÑÊÈÇØ ÊÔÚÈí";
        Text[ dutch ] = "Hyperlink";
        Text[ chinese_simplified ] = "³¬Á´½Ó";
        Text[ greek ] = "Õðåñ-óýíäåóç";
        Text[ korean ] = "ÇÏÀÌÆÛ¸µÅ©";
        Text[ turkish ] = "Hyperlink";
    };
    FixedText FT_URL
    {
        Pos = MAP_APPFONT ( 12 , 15 ) ;
        Size = MAP_APPFONT ( 63 , 10 ) ;
        Text = "U~RL" ;
        Text [ English ] = "U~RL" ;
        Text [ english_us ] = "~URL" ;
        Text [ italian ] = "U~RL" ;
        Text [ spanish ] = "~URL" ;
        Text [ french ] = "U~RL" ;
        Text [ dutch ] = "U~RL" ;
        Text [ swedish ] = "U~RL" ;
        Text [ danish ] = "URL" ;
        Text [ portuguese_brazilian ] = "U~RL" ;
        Text [ portuguese ] = "U~RL" ;
        Text[ chinese_simplified ] = "~URL";
        Text[ russian ] = "U~RL";
        Text[ polish ] = "URL";
        Text[ japanese ] = "URL(~U)";
        Text[ chinese_traditional ] = "~URL";
        Text[ arabic ] = "U~RL";
        Text[ dutch ] = "U~RL";
        Text[ chinese_simplified ] = "~URL";
        Text[ greek ] = "URL";
        Text[ korean ] = "~URL";
        Text[ turkish ] = "U~RL";
    };
    Edit ED_URL
    {
        Pos = MAP_APPFONT ( 78 , 14 ) ;
        Size = MAP_APPFONT ( 104 , 12 ) ;
        Border = TRUE ;
        TabStop = TRUE ;
    };
    PushButton PB_URL
    {
        Pos = MAP_APPFONT ( 188 , 14 ) ;
        Size = MAP_APPFONT ( 60 , 14 ) ;
        Text = "~Auswählen..." ;
        Text [ English ] = "~Browse..." ;
        TabStop = TRUE ;
        Text [ english_us ] = "~Browse..." ;
        Text [ portuguese_brazilian ] = "Durch~suchen..." ;
        Text [ swedish ] = "~Välj ut..." ;
        Text [ danish ] = "Gennemse..." ;
        Text [ italian ] = "~Sfoglia..." ;
        Text [ spanish ] = "~Seleccionar..." ;
        Text [ french ] = "~Sélectionner..." ;
        Text [ dutch ] = "~Selecteren..." ;
        Text [ portuguese ] = "~Pesquisar..." ;
        Text[ chinese_simplified ] = "Ñ¡Ôñ(~B)...";
        Text[ russian ] = "~Âûáðàòü...";
        Text[ polish ] = "Wybierz...";
        Text[ japanese ] = "‘I‘ð(~B)...";
        Text[ chinese_traditional ] = "¿ï¾Ü(~B)...";
        Text[ arabic ] = "ÇÓÊÚÑÇÖ...";
        Text[ dutch ] = "~Selecteren...";
        Text[ chinese_simplified ] = "Ñ¡Ôñ(~B)...";
        Text[ greek ] = "~ÅðéëïãÞ...";
        Text[ korean ] = "¼±ÅÃÇϱâ(~B)...";
        Text[ turkish ] = "A~raþtýr...";
    };
    FixedText FT_TEXT
    {
        Pos = MAP_APPFONT ( 12 , 30 ) ;
        Size = MAP_APPFONT ( 63 , 10 ) ;
        Text = "Te~xt" ;
        Text [ English ] = "Text" ;
        Text[ english_us ] = "Te~xt";
        Text[ portuguese ] = "Te~xto";
        Text[ russian ] = "Óêàçàíèå";
        Text[ greek ] = "Êåßìåíï";
        Text[ dutch ] = "~Opmerking";
        Text[ french ] = "~Texte";
        Text[ spanish ] = "In~dicación";
        Text[ italian ] = "Nota";
        Text[ danish ] = "Tekst";
        Text[ swedish ] = "Hänv~isning";
        Text[ polish ] = "Tekst";
        Text[ portuguese_brazilian ] = "H~inweis";
        Text[ japanese ] = "•¶Žš—ñ(~K)";
        Text[ korean ] = "¸Þ¸ð(~O)";
        Text[ chinese_simplified ] = "ÎÄ×Ö";
        Text[ chinese_traditional ] = "¤å¦r";
        Text[ turkish ] = "B~ilgi";
        Text[ arabic ] = "äÕ";
    };
    Edit ED_TEXT
    {
        Pos = MAP_APPFONT ( 78 , 29 ) ;
        Size = MAP_APPFONT ( 104 , 12 ) ;
        Border = TRUE ;
        TabStop = TRUE ;
        Group = TRUE ;
    };
    FixedText FT_NAME
    {
        Pos = MAP_APPFONT ( 12 , 45 ) ;
        Size = MAP_APPFONT ( 63 , 10 ) ;
        Text = "~Name" ;
        Text [ English ] = "~Name" ;
        Text [ english_us ] = "~Name" ;
        Text [ italian ] = "~Nome" ;
        Text [ spanish ] = "~Nombre" ;
        Text [ french ] = "~Nom" ;
        Text [ dutch ] = "~Naam" ;
        Text [ swedish ] = "~Namn" ;
        Text [ danish ] = "Navn" ;
        Text [ portuguese_brazilian ] = "~Name" ;
        Text [ portuguese ] = "~Nome" ;
        Text[ chinese_simplified ] = "Ãû³Æ(~N)";
        Text[ russian ] = "~Èìÿ";
        Text[ polish ] = "Nazwa";
        Text[ japanese ] = "–¼‘O(~N)";
        Text[ chinese_traditional ] = "¦WºÙ(~N)";
        Text[ arabic ] = "ÇáÇÓã";
        Text[ dutch ] = "~Naam";
        Text[ chinese_simplified ] = "Ãû³Æ(~N)";
        Text[ greek ] = "¼íïìá";
        Text[ korean ] = "À̸§(~N)";
        Text[ turkish ] = "~Ad";
    };
    Edit ED_NAME
    {
        Pos = MAP_APPFONT ( 78 , 44 ) ;
        Size = MAP_APPFONT ( 104 , 12 ) ;
        Border = TRUE ;
        TabStop = TRUE ;
        Group = TRUE ;
    };
    FixedText FT_TARGET
    {
        Pos = MAP_APPFONT ( 12 , 60 ) ;
        Size = MAP_APPFONT ( 63 , 10 ) ;
        Text = "~Frame" ;
        Text [ English ] = "Frame" ;
        Text [ english_us ] = "Target Frame" ;
        Text [ portuguese_brazilian ] = "~Targetframe" ;
        Text [ swedish ] = "~Ram" ;
        Text [ danish ] = "Frame" ;
        Text [ italian ] = "~Frame" ;
        Text [ spanish ] = "~Frame" ;
        Text [ french ] = "~Frame" ;
        Text [ dutch ] = "~Frame" ;
        Text [ portuguese ] = "~Frame" ;
        Text[ chinese_simplified ] = "¿ò¶ÔÏó";
        Text[ russian ] = "~Êàäð";
        Text[ polish ] = "Ramka";
        Text[ japanese ] = "ÌÚ°Ñ";
        Text[ chinese_traditional ] = "°T®Ø";
        Text[ arabic ] = "~Frame";
        Text[ dutch ] = "~Frame";
        Text[ chinese_simplified ] = "¿ò¶ÔÏó";
        Text[ greek ] = "Ðëáßóéï";
        Text[ korean ] = "¸ñÇ¥ ÇÁ·¹ÀÓ";
        Text[ turkish ] = "~Frame";
    };
    ComboBox LB_TARGET
    {
        Pos = MAP_APPFONT ( 78 , 59 ) ;
        Size = MAP_APPFONT ( 104 , 60 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        Sort = TRUE ;
        Group = TRUE ;
    };
    PushButton PB_EVENT
    {
        Pos = MAP_APPFONT ( 188 , 31 ) ;
        Size = MAP_APPFONT ( 60 , 14 ) ;
        TabStop = TRUE ;
        Text = "~Ereignisse..." ;
        Text [ English ] = "Events..." ;
        Text [ english_us ] = "~Events..." ;
        Text [ italian ] = "~Eventi" ;
        Text [ french ] = "~Événements..." ;
        Text [ dutch ] = "~Gebeurtenissen" ;
        Text [ swedish ] = "Händ~elser..." ;
        Text [ danish ] = "Begivenheder..." ;
        Text [ spanish ] = "~Acontecimientos..." ;
        Text [ portuguese_brazilian ] = "~Ereignisse..." ;
        Text [ portuguese ] = "~Eventos..." ;
        Text[ chinese_simplified ] = "ʼþ(~E)...";
        Text[ russian ] = "Ñîáûòèÿ...";
        Text[ polish ] = "Wy~darzenia...";
        Text[ japanese ] = "ŽÀsŒ_‹@(~E)...";
        Text[ chinese_traditional ] = "¬ù·|(~E)...";
        Text[ arabic ] = "ÃÍÏÇË...";
        Text[ dutch ] = "~Gebeurtenissen";
        Text[ chinese_simplified ] = "ʼþ(~E)...";
        Text[ greek ] = "Ãåãïíüôá...";
        Text[ korean ] = "À̺¥Æ®(~E)...";
        Text[ turkish ] = "Olaylar...";
    };
    GroupBox GB_STYLE
    {
        Pos = MAP_APPFONT ( 6 , 78 + LBOX_DIFF ) ;
        Size = MAP_APPFONT ( 248 , 42 + 2 * LBOX_DIFF ) ;
        Text = "Zeichenvorlagen" ;
        Text [ English ] = "Character styles" ;
        Text [ dutch ] = "Tekenopmaakprofielen" ;
        Text [ english_us ] = "Character Styles" ;
        Text [ italian ] = "Modelli di carattere" ;
        Text [ spanish ] = "Estilos de caracteres" ;
        Text [ french ] = "Styles de caractère" ;
        Text [ swedish ] = "Teckenformatmallar" ;
        Text [ danish ] = "Tegntypografier" ;
        Text [ portuguese_brazilian ] = "Zeichenvorlagen" ;
        Text [ portuguese ] = "Estilos de caracteres" ;
        Text[ chinese_simplified ] = "×Ö·ûÑùʽ";
        Text[ russian ] = "Ñòèëè çíàêîâ";
        Text[ polish ] = "Style znaku";
        Text[ japanese ] = "÷½Ä½À²Ù";
        Text[ chinese_traditional ] = "¦r¤¸¼Ë¦¡";
        Text[ arabic ] = "ÃäãÇØ ÃÍÑÝ";
        Text[ dutch ] = "Tekenopmaakprofielen";
        Text[ chinese_simplified ] = "×Ö·ûÑùʽ";
        Text[ greek ] = "Óôõë ÷áñáêôÞñùí";
        Text[ korean ] = "¹®ÀÚ À¯Çü";
        Text[ turkish ] = "Karakter biçimi";
    };
    FixedText FT_VISITED
    {
        Pos = MAP_APPFONT ( 12 , 91 + LBOX_DIFF ) ;
        Size = MAP_APPFONT ( 63 , 10 ) ;
        Text = "~Besuchter Link" ;
        Text [ English ] = "Visited link" ;
        Text [ dutch ] = "B~ezochte Link" ;
        Text [ english_us ] = "~Visited links" ;
        Text [ italian ] = "Per il ~sito visitato" ;
        Text [ spanish ] = "Vínculos ~visitados" ;
        Text [ french ] = "Lien ~visité" ;
        Text [ swedish ] = "~Besökt länk" ;
        Text [ danish ] = "Besøgt hyperlink" ;
        Text [ portuguese_brazilian ] = "~Besuchte Links" ;
        Text [ portuguese ] = "Links ~visitados" ;
        Text[ chinese_simplified ] = "·ÃÎʹýµÄÁ´½Ó(~V)";
        Text[ russian ] = "Ïîñåùåííûå ññûëêè";
        Text[ polish ] = "Odwiedzone ³¹cze";
        Text[ japanese ] = "ŠJ‚¢‚½‚±‚Ƃ̂ ‚éØÝ¸(~V)";
        Text[ chinese_traditional ] = "³X°Ý¹Lªº±¶®|(~V)";
        Text[ arabic ] = "ÇÑÊÈÇØ ÓÈÞ ÒíÇÑÊå";
        Text[ dutch ] = "B~ezochte Link";
        Text[ chinese_simplified ] = "·ÃÎʹýµÄÁ´½Ó(~V)";
        Text[ greek ] = "ÓõíäÝóåéò ðïõ Ý÷ïõí åðéóêåöèåß";
        Text[ korean ] = "¹æ¹®ÇÑ ¸µÅ©(~V)";
        Text[ turkish ] = "~Kullanýlmýþ baðlantý";
    };
    ListBox LB_VISITED
    {
        Pos = MAP_APPFONT ( 78 , 90 + LBOX_DIFF ) ;
        Size = MAP_APPFONT ( 104 , 60 ) ;
        Border = TRUE ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        Sort = TRUE ;
        Group = TRUE ;
    };
    FixedText FT_NOT_VISITED
    {
        Pos = MAP_APPFONT ( 12 , 106 + 2 * LBOX_DIFF ) ;
        Size = MAP_APPFONT ( 63 , 10 ) ;
        Text = "~Unbesuchter Link" ;
        Text [ English ] = "Unvisited link" ;
        Text [ english_us ] = "Unvisited ~links" ;
        Text [ italian ] = "Per il sito non ~visitato" ;
        Text [ spanish ] = "Vínculos no v~isitados" ;
        Text [ french ] = "Lien ~non visité" ;
        Text [ dutch ] = "N~iet-bezochte Link" ;
        Text [ swedish ] = "~Obesökt länk" ;
        Text [ danish ] = "Ubesøgt hyperlink" ;
        Text [ portuguese_brazilian ] = "~Unbesuchte Links" ;
        Text [ portuguese ] = "~Link não visitado" ;
        Text[ chinese_simplified ] = "ÉÐδ·ÃÎʹýµÄÁ´½Ó(~L)";
        Text[ russian ] = "Íåïîñåùåííûå ññûëêè";
        Text[ polish ] = "Nie odwiedzone ³¹cze";
        Text[ japanese ] = "ŠJ‚¢‚½‚±‚Ƃ̂Ȃ¢ØÝ¸(~L)";
        Text[ chinese_traditional ] = "¥¼³X°Ý¹Lªº±¶®|(~L)";
        Text[ arabic ] = "ÇÑÊÈÇØ áã íÓÈÞ ÒíÇÑÊå";
        Text[ dutch ] = "N~iet-bezochte Link";
        Text[ chinese_simplified ] = "ÉÐδ·ÃÎʹýµÄÁ´½Ó(~L)";
        Text[ greek ] = "ÓõíäÝóåéò ÷ùñßò åðßóêåøç";
        Text[ korean ] = "¹æ¹®ÇÏÁö ¾ÊÀº ¸µÅ©(~L)";
        Text[ turkish ] = "Kullanýl~mamýþ baðlantý";
    };
    ListBox LB_NOT_VISITED
    {
        Pos = MAP_APPFONT ( 78 , 105 + 2 * LBOX_DIFF ) ;
        Size = MAP_APPFONT ( 104 , 60 ) ;
        Border = TRUE ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        Sort = TRUE ;
        Group = TRUE ;
    };
};
diff --git a/sw/source/ui/chrdlg/chrdlg.src b/sw/source/ui/chrdlg/chrdlg.src
new file mode 100644
index 0000000..b210617
--- /dev/null
+++ b/sw/source/ui/chrdlg/chrdlg.src
@@ -0,0 +1,169 @@
/*************************************************************************
 *
 *  $RCSfile: chrdlg.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:32 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "chrdlg.hrc"
String STR_TEXTCOLL_HEADER
{
    TEXT = " (Absatzvorlage: " ;
    TEXT [ English ] = " (Paragraph Style: " ;
    TEXT [ norwegian ] = " (Avsnittsmal: " ;
    TEXT [ italian ] = "(Modello di paragrafo: " ;
    TEXT [ portuguese_brazilian ] = "(Estilo de Parágrafo: " ;
    TEXT [ portuguese ] = "(Estilo de parágrafo: " ;
    TEXT [ finnish ] = " (Kappaletyyli: " ;
    TEXT [ danish ] = "(Afsnitstypografi: " ;
    TEXT [ french ] = "(Style de paragraphe : " ;
    TEXT [ swedish ] = "(Styckeformatmall:  " ;
    TEXT [ dutch ] = "(Alinea-opmaakprofiel:  " ;
    TEXT [ spanish ] = "(Estilo de párrafo:  " ;
    TEXT [ english_us ] = "(Paragraph Style: " ;
    TEXT[ chinese_simplified ] = "(¶ÎÂäÑùʽ£º ";
    TEXT[ russian ] = "(Ñòèëü àáçàöà:  ";
    TEXT[ polish ] = "(Styl akapitu:  ";
    TEXT[ japanese ] = "(’i—޽À²Ù: ";
    TEXT[ chinese_traditional ] = "(¬q¸¨¼Ë¦¡¡G ";
    TEXT[ arabic ] = "(äãØ ÝÞÑÉ: ";
    TEXT[ greek ] = "(Ðñüôõðï ðáñáãñÜöïõ: ";
    TEXT[ korean ] = "(´Ü¶ô À¯Çü: ";
    TEXT[ turkish ] = "(Paragraf biçimi: ";
    TEXT[ language_user1 ] = " ";
};
String STR_PAGEFMT_HEADER
{
    TEXT = " (Seitenvorlage: " ;
    TEXT [ English ] = " (Page Style: " ;
    TEXT [ norwegian ] = " (Sidemal: " ;
    TEXT [ italian ] = "(Modello di pagina: " ;
    TEXT [ portuguese_brazilian ] = "(Estilo de Página: " ;
    TEXT [ portuguese ] = "(Estilo de página: " ;
    TEXT [ finnish ] = " (Sivutyyli: " ;
    TEXT [ danish ] = "(Sidetypografi: " ;
    TEXT [ french ] = "(Style de page : " ;
    TEXT [ swedish ] = "(Sidformatmall:  " ;
    TEXT [ dutch ] = "(Pagina-opmaakprofiel:  " ;
    TEXT [ spanish ] = "(Estilo de página:  " ;
    TEXT [ english_us ] = "(Page Style: " ;
    TEXT[ chinese_simplified ] = "(Ò³ÃæÑùʽ£º ";
    TEXT[ russian ] = "(Ñòèëü ñòðàíèöû:  ";
    TEXT[ polish ] = "(Styl strony:  ";
    TEXT[ japanese ] = "(Íß°¼Þ½À²Ù: ";
    TEXT[ chinese_traditional ] = "(­¶­±¼Ë¦¡¡G ";
    TEXT[ arabic ] = "(ÞÇáÈ ÇáÕÝÍÉ: ";
    TEXT[ greek ] = "(Ðñüôõðï óåëßäáò: ";
    TEXT[ korean ] = "(ÆäÀÌÁö À¯Çü: ";
    TEXT[ turkish ] = "(Sayfa biçimi: ";
    TEXT[ language_user1 ] = " ";
};
String SW_STR_NONE
{
    Text = "[Keine]" ;
    Text [ English ] = "[None]" ;
    Text [ norwegian ] = "[Ingen]" ;
    Text [ italian ] = "[Nessuno]" ;
    Text [ portuguese_brazilian ] = "[Nenhum]" ;
    Text [ portuguese ] = "[Nenhum]" ;
    Text [ finnish ] = "[Ei ole]" ;
    Text [ danish ] = "[Ingen]" ;
    Text [ french ] = "[Aucun(e)]" ;
    Text [ swedish ] = "[Ingen]" ;
    Text [ dutch ] = "[Geen]" ;
    Text [ spanish ] = "[Ninguno]" ;
    Text [ english_us ] = "[None]" ;
    Text[ chinese_simplified ] = "[ÎÞ]";
    Text[ russian ] = "[Áåç]";
    Text[ polish ] = "[brak]";
    Text[ japanese ] = "[‚È‚µ]";
    Text[ language_user1 ] = "èë? áå";
    Text[ chinese_traditional ] = "[µL]";
    Text[ arabic ] = "[ÈÏæä]";
    Text[ greek ] = "[ÊáíÝíá]";
    Text[ korean ] = "[¾øÀ½]";
    Text[ turkish ] = "[yok]";
};
InfoBox MSG_ILLEGAL_PAGENUM
{
    BUTTONS = WB_OK ;
    DEFBUTTON = WB_DEF_OK ;
    /* ### ACHTUNG: Neuer Text in Resource? Seitennummer kann nicht gesetzt werden. Auf linken Seiten dürfen nur gerade Seitenzahlen, auf rechten Seiten nur ungerade Seitenzahlen verwendet werden. : Seitennummer kann nicht gesetzt werden. Auf linken Seiten d³rfen nur gerade Seitenzahlen, auf rechten Seiten nur ungerade Seitenzahlen verwendet werden. */
    MESSAGE = "Seitennummer kann nicht gesetzt werden. Auf linken Seiten dürfen nur gerade Seitenzahlen, auf rechten Seiten nur ungerade Seitenzahlen verwendet werden." ;
    MESSAGE [ English ] = "Page number can't be applied to the actual page.  Even numbers can be used on left pages, odd numbers on right pages." ;
    MESSAGE [ norwegian ] = "Sidenummer kan ikke brukes på den aktuelle siden. Partall kan brukes på venstre sider, oddetall på høyre sider." ;
    MESSAGE [ italian ] = "Impossibile usare il numero pagina alla pagina corrente. I numeri pari possono essere usati sulle pagine sinistre, i numeri dispari sulle pagine destre." ;
    MESSAGE [ portuguese_brazilian ] = "Número de página não pode ser aplicado à página atual.  Números pares podem ser utilizados em páginas esquerdas, números ímpares em páginas direitas." ;
    MESSAGE [ portuguese ] = "Número de página não pode ser atribuído à página actual. Nas páginas da esquerda podem apenas ser usados números pares e nas páginas da direita números ímpares." ;
    MESSAGE [ finnish ] = "Sivunumeroa ei voi lisätä sivulle.  Parillista numeroa käytetään vasemmalla sivulla ja paritonta oikealla sivulla." ;
    MESSAGE [ danish ] = "Sidetallet kan ikke indsættes. Der må kun bruges lige sidetal på venstre side og ulige sidetal på højre sider." ;
    MESSAGE [ french ] = "Le numéro de page ne peut être assigné à cette page. Les nombres pairs ne peuvent être utilisés que sur des pages de gauche, les nombres impairs que sur celles de droite." ;
    MESSAGE [ swedish ] = "Sidnumret kan inte sättas in på den här sidan. På vänstersidor får bara jämna nummer användas, på högersidor bara udda nummer." ;
    MESSAGE [ dutch ] = "Dit paginanummer kan niet aan de actiuele pagina worden toegewezen. Linkerpagina's krijgen even nummers, rechterpagina's oneven nummers." ;
    MESSAGE [ spanish ] = "El número de la página no se puede colocar. En páginas izquierdas se pueden utilizar solo números pares, en las derechas solo impares." ;
    MESSAGE [ english_us ] = "Page numbers cannot be applied to the current page.  Even numbers can be used on left pages, odd numbers on right pages." ;
    MESSAGE[ chinese_simplified ] = "ÎÞ·¨É趨ҳÂë¡£ÔÚ×óÒ³ÉÏÖ»ÔÊÐí²ÉÓÃżÊýÒ³Â룬ÔÚÓÒÒ³ÉÏÖ»ÔÊÐí²ÉÓÃÆæÊýÒ³Âë¡£";
    MESSAGE[ russian ] = "Íîìåðà ñòðàíèö ïðîñòàâèòü íåâîçìîæíî. Ñ ëåâîé ñòîðîíû ìîãóò áûòü ïðîñòàâëåíû òîëüêî ÷åòíûå, ñ ïðàâîé - òîëüêî íå÷åòíûå öèôðû.";
    MESSAGE[ polish ] = "Nie mo¿na nanieœæ numeru stron. Na lewych stronach mo¿na nanieœæ tylko parzyste numery stron, na prawych tylko nieparzyste numery stron.";
    MESSAGE[ japanese ] = "Íß°¼Þ”ԍ†‚ª“K—p‚Å‚«‚Ü‚¹‚ñB¶Íß°¼Þ‚ɂ͋ô”¤‰EÍß°¼Þ‚ɂ͊‚ðŽg—p‚µ‚ĉº‚³‚¢B";
    MESSAGE[ chinese_traditional ] = "µLªk³]©w­¶½X¡C¦b¥ª­¶¥u¯à°÷³]©w°¸¼Æ¡A¦b¥k­¶¥u¯à³]©w©_¼Æ¡C";
    MESSAGE[ arabic ] = "áÇ íãßä ÅÏÑÇÌ ÃÑÞÇã ÇáÕÝÍÇÊ Ýí ÇáÕÝÍÉ ÇáÍÇáíÉ. Úáì ÇáÕÝÍÇÊ ÇáíÓÑì¡ íÓãÍ ÈÇÓÊÎÏÇã ÃÑÞÇã ÒæÌíÉ ÝÞØ¡ æÚáì ÇáÕÝÍÇÊ Çáíãäì¡ ÃÑÞÇã ÝÑÏíÉ ÝÞØ.";
    MESSAGE[ greek ] = "Äåí åßíáé äõíáôüí íá ôïðïèåôçèåß ï áñéèìüò óåëßäáò. Óå áñéóôåñÝò óåëßäåò åðéôñÝðåôáé ç ôïðïèÝôçóç ìüíï æõãþí áñéèìþí óåëßäáò, åíþ óå äåîéÝò óåëßäåò ìüíï áñôßùí áñéèìþí.";
    MESSAGE[ korean ] = "ÆäÀÌÁö ¹øÈ£´Â ÇöÀç ÆäÀÌÁö¿¡ Àû¿ëµÇÁö ¾Ê½À´Ï´Ù. ¦¼ö´Â ¿ÞÂÊ ÆäÀÌÁö¿¡ »ç¿ëµÇ°í,Ȧ¼ö´Â ¿À¸¥ÂÊ ÆäÀÌÁö¿¡ »ç¿ëµË´Ï´Ù.";
    MESSAGE[ turkish ] = "Sayfa numarasý verilemiyor. Sol sayfalarda yalnýzca çift sayfa numaralarý, sað sayfalarda ise yalnýzca tek sayfa numaralarý kullanýlabilir.";
    MESSAGE[ language_user1 ] = " ";
};
diff --git a/sw/source/ui/chrdlg/drpcps.cxx b/sw/source/ui/chrdlg/drpcps.cxx
new file mode 100644
index 0000000..ea8b4bf
--- /dev/null
+++ b/sw/source/ui/chrdlg/drpcps.cxx
@@ -0,0 +1,744 @@
/*************************************************************************
 *
 *  $RCSfile: drpcps.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:32 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include <hintids.hxx>
#define _SVSTDARR_STRINGSDTOR
#define _SVSTDARR_STRINGSISORTDTOR
#include <svtools/svstdarr.hxx>

#include "cmdid.h"
#include "swmodule.hxx"
#include "view.hxx"
#include "wrtsh.hxx"
#include "globals.hrc"


#ifndef _METRIC_HXX //autogen
#include <vcl/metric.hxx>
#endif

#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _SVX_FONTITEM_HXX //autogen
#include <svx/fontitem.hxx>
#endif
#ifndef _SVX_HTMLMODE_HXX //autogen
#include <svx/htmlmode.hxx>
#endif
#ifndef _SFX_OBJSH_HXX //autogen
#include <sfx2/objsh.hxx>
#endif

#include "charatr.hxx"
#include "viewopt.hxx"
#include "drpcps.hxx"
#include "paratr.hxx"
#include "uitool.hxx"
#include "charfmt.hxx"

#include "chrdlg.hrc"
#include "drpcps.hrc"

// Globals ******************************************************************

static USHORT __FAR_DATA aPageRg[] = {
    RES_PARATR_DROP, RES_PARATR_DROP,
    0
};



// class SwDropCapsPict *****************************************************

class SwDropCapsPict : public Control
{
    String aText;
    BYTE   nLines;
    USHORT nDistance;

    virtual void Paint(const Rectangle &rRect);

public:

     SwDropCapsPict(Window *pParent, const ResId &rResId) : Control(pParent, rResId) {}
    ~SwDropCapsPict();

    void SetText    (const String &rT) {aText     = rT; Invalidate();}
    void SetLines   (      BYTE    nL) {nLines    = nL; Invalidate();}
    void SetDistance(      USHORT  nD) {nDistance = nD; Invalidate();}
};


/****************************************************************************
Default-String aus Zeichenanzahl erzeugen (A, AB, ABC, ...)
****************************************************************************/


String GetDefaultString(USHORT nChars)
{
    String aStr;
    for (USHORT i = 0; i < nChars; i++)
        aStr += String((char) (i + 65));
    return aStr;
}

/****************************************************************************
Pict: Dtor
****************************************************************************/


 SwDropCapsPict::~SwDropCapsPict()
{
}

/****************************************************************************
Pict: Paint-Overload
****************************************************************************/

#define LINES  10
#define BORDER  2


void  SwDropCapsPict::Paint(const Rectangle &rRect)
{
    if (!IsVisible())
        return;

    SetMapMode(MapMode(MAP_PIXEL));
    SetLineColor();

    // Weisser Hintergrund
    SetFillColor(Color(COL_WHITE));
    DrawRect(Rectangle(Point(0, 0), GetOutputSizePixel()));
    SetClipRegion(Region(Rectangle(
        Point(BORDER, BORDER),
        Size (GetOutputSizePixel().Width () - 2 * BORDER,
              GetOutputSizePixel().Height() - 2 * BORDER))));

    // Graue Linien
    long nTotLineH = (GetOutputSizePixel().Height() - 2 * BORDER) / LINES,
         nLineH    = nTotLineH - 2;

    ASSERT(nLineH > 0, "So klein lassen wir uns nicht machen");
    long nY0 = (GetOutputSizePixel().Height() - (LINES * nTotLineH)) / 2;
    SetFillColor(Color(COL_LIGHTGRAY));
    for (USHORT i = 0; i < LINES; i++)
        DrawRect(Rectangle(Point(BORDER, nY0 + i * nTotLineH), Size(GetOutputSizePixel().Width() - 2 * BORDER, nLineH)));

    // Text berechnen
    Font aFont;
    {
        SwDropCapsPage *pPage = (SwDropCapsPage *) GetParent();
        if (!pPage->aTemplateBox.GetSelectEntryPos())
        {
            // Font an Absatzanfang erfragen
            pPage->rSh.SttCrsrMove();
            pPage->rSh.Push();
            pPage->rSh.ClearMark();
            pPage->rSh.MovePara(fnParaCurr,fnParaStart);

            SfxItemSet aSet(pPage->rSh.GetAttrPool(), RES_CHRATR_FONT, RES_CHRATR_FONT);
            pPage->rSh.GetAttr(aSet);
            SvxFontItem aFmtFont((SvxFontItem &) aSet.Get(RES_CHRATR_FONT));

            aFont.SetFamily (aFmtFont.GetFamily());
            aFont.SetName   (aFmtFont.GetFamilyName());
            aFont.SetPitch  (aFmtFont.GetPitch());
            aFont.SetCharSet(aFmtFont.GetCharSet());

            pPage->rSh.Pop(FALSE);
            pPage->rSh.EndCrsrMove();
        }
        else
        {
            // Font an Zeichenvorlage erfragen
            SwCharFmt *pFmt = pPage->rSh.GetCharStyle(
                                    pPage->aTemplateBox.GetSelectEntry(),
                                    SwWrtShell::GETSTYLE_CREATEANY );
            ASSERT(pFmt, "Zeichenvorlage existiert nicht!");
            const SvxFontItem &rFmtFont = pFmt->GetFont();

            aFont.SetFamily (rFmtFont.GetFamily());
            aFont.SetName   (rFmtFont.GetFamilyName());
            aFont.SetPitch  (rFmtFont.GetPitch());
            aFont.SetCharSet(rFmtFont.GetCharSet());
        }
    }

    long nTextH = nLines * nTotLineH;
    aFont.SetSize(Size(0, nTextH));
    aFont.SetTransparent(TRUE);
    SetFont(aFont);
    USHORT nLeading = (USHORT) GetFontMetric().GetLeading();
    aFont.SetSize(Size(0, aFont.GetSize().Height() + nLeading));
    SetFont(aFont);

    // Texthintergrund mit Abstand (240 twips ~ 1 Zeilenhoehe)

    ULONG lDistance = nDistance;
    USHORT nDistW = (USHORT) (ULONG) (((lDistance * 100) / 240) * nTotLineH) / 100;
    SetFillColor(Color(COL_WHITE));
    if(((SwDropCapsPage*)GetParent())->aDropCapsBox.IsChecked())
    {
        DrawRect(Rectangle(
        Point(BORDER, nY0),
        Size (GetTextWidth(aText) + nDistW, nTextH)));

    // Text zeichnen
        DrawText(Point(BORDER, nY0 - nLeading), aText);
    }

    SetClipRegion();
}

/****************************************************************************
Dlg: Ctor
****************************************************************************/


SwDropCapsDlg::SwDropCapsDlg(Window *pParent, const SfxItemSet &rSet ) :

    SfxSingleTabDialog(pParent, rSet, 0)

{
    SwDropCapsPage* pPage = (SwDropCapsPage*) SwDropCapsPage::Create(this, rSet);
    pPage->SetFormat(FALSE);
    SetTabPage(pPage);
}

/****************************************************************************
Dlg: Dtor
****************************************************************************/


 SwDropCapsDlg::~SwDropCapsDlg()
{
}

/****************************************************************************
Page: Ctor
****************************************************************************/


SwDropCapsPage::SwDropCapsPage(Window *pParent, const SfxItemSet &rSet) :

    SfxTabPage(pParent, SW_RES(TP_DROPCAPS), rSet),

    aDropCapsBox  (this, SW_RES(CB_SWITCH   )),
    aWholeWordCB  (this, SW_RES(CB_WORD     )),
    aSwitchText   (this, SW_RES(FT_DROPCAPS )),
    aDropCapsField(this, SW_RES(FLD_DROPCAPS)),
    aLinesText    (this, SW_RES(TXT_LINES   )),
    aLinesField   (this, SW_RES(FLD_LINES   )),
    aDistanceText (this, SW_RES(TXT_DISTANCE)),
    aDistanceField(this, SW_RES(FLD_DISTANCE)),
    aTextText     (this, SW_RES(TXT_TEXT    )),
    aTextEdit     (this, SW_RES(EDT_TEXT    )),
    aTemplateText (this, SW_RES(TXT_TEMPLATE)),
    aTemplateBox  (this, SW_RES(BOX_TEMPLATE)),
    aSettingsGroup(this, SW_RES(GRP_SETTINGS)),
    aPictBox      (this, SW_RES(BOX_PICT       )),
    aContentBox   (this, SW_RES(BOX_CONTENT )),
    pPict         (new SwDropCapsPict(this, SW_RES(CNT_PICT))),
    bModified(FALSE),
    bFormat(TRUE),
    rSh(::GetActiveView()->GetWrtShell())
{
    FreeResource();
    SetExchangeSupport();

    USHORT nHtmlMode = ::GetHtmlMode((const SwDocShell*)SfxObjectShell::Current());
    bHtmlMode = nHtmlMode & HTMLMODE_ON ? TRUE : FALSE;

    //Im Vorlagendialog kann der Text nicht beeinflusst werden
    aTextText.Enable( !bFormat );
    aTextEdit.Enable( !bFormat );

    // Metriken
    SetMetric( aDistanceField, GetDfltMetric(bHtmlMode) );

    // Handler installieren
    Link aLk = LINK(this, SwDropCapsPage, ModifyHdl);
    aDropCapsField.SetModifyHdl( aLk );
    aLinesField   .SetModifyHdl( aLk );
    aDistanceField.SetModifyHdl( aLk );
    aTextEdit     .SetModifyHdl( aLk );
    aDropCapsBox  .SetClickHdl (LINK(this, SwDropCapsPage, ClickHdl ));
    aTemplateBox  .SetSelectHdl(LINK(this, SwDropCapsPage, SelectHdl));
    aWholeWordCB  .SetClickHdl (LINK(this, SwDropCapsPage, WholeWordHdl ));
}

/****************************************************************************
Page: Dtor
****************************************************************************/


 SwDropCapsPage::~SwDropCapsPage()
{
    delete pPict;
}


int  SwDropCapsPage::DeactivatePage(SfxItemSet * pSet)
{
    if ( pSet )
        FillSet( *pSet );

    return LEAVE_PAGE;
}

/****************************************************************************
Page: Factory
****************************************************************************/


SfxTabPage*  SwDropCapsPage::Create(Window *pParent,
    const SfxItemSet &rSet)
{
    return new SwDropCapsPage(pParent, rSet);
}

/****************************************************************************
Page: FillItemSet-Overload
****************************************************************************/


BOOL  SwDropCapsPage::FillItemSet(SfxItemSet &rSet)
{
    if(bModified)
        FillSet(rSet);
    return bModified;
}

/****************************************************************************
Page: Reset-Overload
****************************************************************************/


void  SwDropCapsPage::Reset(const SfxItemSet &rSet)
{
    // Zeichen, Zeilen, Abstand und Text
    SwFmtDrop aFmtDrop((SwFmtDrop &) rSet.Get(RES_PARATR_DROP));
    if (aFmtDrop.GetLines() > 1)
    {
        aDropCapsField.SetValue(aFmtDrop.GetChars());
        aLinesField   .SetValue(aFmtDrop.GetLines());
        aDistanceField.SetValue(aDistanceField.Normalize(aFmtDrop.GetDistance()), FUNIT_TWIP);
        aWholeWordCB  .Check   (aFmtDrop.GetWholeWord());
    }
    else
    {
        aDropCapsField.SetValue(1);
        aLinesField   .SetValue(3);
        aDistanceField.SetValue(0);
    }

    // Preview
    pPict->SetText(aTextEdit.GetText());
    pPict->SetLines((BYTE )aLinesField.GetValue());
    pPict->SetDistance((USHORT)aDistanceField.Denormalize(aDistanceField.GetValue(FUNIT_TWIP)));

    ::FillCharStyleListBox(aTemplateBox, rSh.GetView().GetDocShell(), TRUE);

    aTemplateBox.InsertEntry(SW_RESSTR(SW_STR_NONE), 0);
    // Vorlage defaulten
    aTemplateBox.SelectEntryPos(0);
    if (aFmtDrop.GetCharFmt())
        aTemplateBox.SelectEntry(aFmtDrop.GetCharFmt()->GetName());

    // Controls enablen
    aDropCapsBox.Check(aFmtDrop.GetLines() > 1);
    const USHORT nVal = USHORT(aDropCapsField.GetValue());
    if (bFormat)
        aTextEdit.SetText(GetDefaultString(nVal));
    else
    {
        aTextEdit.SetText(rSh.GetDropTxt(nVal));
        aTextEdit.Enable();
        aTextText.Enable();
    }
    ClickHdl(&aDropCapsBox);
    bModified = FALSE;
}

/****************************************************************************
Page: Click-Handler der CheckBox
****************************************************************************/


IMPL_LINK( SwDropCapsPage, ClickHdl, Button *, EMPTYARG )
{
    BOOL bChecked = aDropCapsBox.IsChecked();

    aWholeWordCB  .Enable( bChecked && !bHtmlMode );

    aSwitchText.Enable( bChecked && !aWholeWordCB.IsChecked() );
    aDropCapsField.Enable( bChecked && !aWholeWordCB.IsChecked() );
    aLinesText   .Enable( bChecked );
    aLinesField   .Enable( bChecked );
    aDistanceText.Enable( bChecked );
    aDistanceField.Enable( bChecked );
    aTemplateText .Enable( bChecked );
    aTemplateBox  .Enable( bChecked );
    aTextEdit     .Enable( bChecked && !bFormat );
    aTextText     .Enable( bChecked && !bFormat );

    if ( bChecked )
    {
        ModifyHdl(&aDropCapsField);
        aDropCapsField.GrabFocus();
    }
    else
        pPict->SetText(aEmptyStr);

    bModified = TRUE;

    return 0;
}

/****************************************************************************
Page: Click-Handler der CheckBox
****************************************************************************/


IMPL_LINK( SwDropCapsPage, WholeWordHdl, CheckBox *, EMPTYARG )
{
    aDropCapsField.Enable( !aWholeWordCB.IsChecked() );

    ModifyHdl(&aDropCapsField);

    bModified = TRUE;

    return 0;
}

/****************************************************************************
Page: Modify-Handler der SpinFields
****************************************************************************/


IMPL_LINK( SwDropCapsPage, ModifyHdl, Edit *, pEdit )
{
    String sPreview;

    // Ggf. Text setzen
    if (pEdit == &aDropCapsField)
    {
        USHORT nVal;
        BOOL bSetText = FALSE;

        if (!aWholeWordCB.IsChecked())
            nVal = (USHORT)aDropCapsField.GetValue();
        else
            nVal = (USHORT)aDropCapsField.GetMax();

        if (bFormat || !rSh.GetDropTxt(1).Len())
            sPreview = GetDefaultString(nVal);
        else
        {
            bSetText = TRUE;
            sPreview = rSh.GetDropTxt(nVal);
        }

        String sEdit(aTextEdit.GetText());

        if (sEdit.Len() && sPreview.CompareTo(sEdit, sEdit.Len()) != COMPARE_EQUAL)
        {
            sPreview = sEdit.Copy(0, sPreview.Len());
            bSetText = FALSE;
        }

        if (aWholeWordCB.IsChecked())   // Nur erstes Wort anzeigen
        {
            USHORT nPos = sPreview.Search(' ');

            if (nPos != STRING_NOTFOUND)
                sPreview.Erase(nPos);
        }

        if (bSetText)
            aTextEdit.SetText(sPreview);
    }
    else if (pEdit == &aTextEdit)   // Ggf. Anzahl setzen
    {
        USHORT nTmp = aTextEdit.GetText().Len();
        aDropCapsField.SetValue(Max((USHORT)1, nTmp));

        sPreview = aTextEdit.GetText().Copy(0, nTmp);
    }

    // Bild anpassen
    if (pEdit == &aDropCapsField || pEdit == &aTextEdit)
        pPict->SetText (sPreview);
    else if (pEdit == &aLinesField)
        pPict->SetLines((BYTE)aLinesField.GetValue());
    else
        pPict->SetDistance((USHORT)aDistanceField.Denormalize(aDistanceField.GetValue(FUNIT_TWIP)));

    bModified = TRUE;

    return 0;
}

/****************************************************************************
Page: Select-Handler der Template-Box.
*****************************************************************************/


IMPL_LINK_INLINE_START( SwDropCapsPage, SelectHdl, ListBox *, EMPTYARG )
{
    pPict->Invalidate();
    bModified = TRUE;
    return 0;
}
IMPL_LINK_INLINE_END( SwDropCapsPage, SelectHdl, ListBox *, EMPTYARG )


USHORT*  SwDropCapsPage::GetRanges()
{
    return aPageRg;
}


void SwDropCapsPage::FillSet( SfxItemSet &rSet )
{
    if(bModified)
    {
        SwFmtDrop aFmt;

        BOOL bOn = aDropCapsBox.IsChecked();
        if(bOn)
        {
            // Anzahl, Zeilen, Abstand
            aFmt.GetChars()     = (BYTE) aDropCapsField.GetValue();
            aFmt.GetLines()     = (BYTE) aLinesField.GetValue();
            aFmt.GetDistance()  = (USHORT) aDistanceField.Denormalize(aDistanceField.GetValue(FUNIT_TWIP));
            aFmt.GetWholeWord() = aWholeWordCB.IsChecked();

            // Vorlage
            if (aTemplateBox.GetSelectEntryPos())
                aFmt.SetCharFmt(rSh.GetCharStyle(aTemplateBox.GetSelectEntry()));
        }
        else
        {
            aFmt.GetChars()    = 1;
            aFmt.GetLines()    = 1;
            aFmt.GetDistance() = 0;
        }

        // Attribute setzen
        const SfxPoolItem* pOldItem;
        if(0 == (pOldItem = GetOldItem( rSet, FN_FORMAT_DROPCAPS )) ||
                    aFmt != *pOldItem )
            rSet.Put(aFmt);

        // Harte Textformatierung
        // Bug 24974: In Gestalter/Vorlagenkatoplog macht das keinen Sinn!!
        if( !bFormat && aDropCapsBox.IsChecked() )
        {
            String sText(aTextEdit.GetText());

            if (!aWholeWordCB.IsChecked())
                sText.Erase(aDropCapsField.GetValue());

            SfxStringItem aStr(FN_PARAM_1, sText);
            rSet.Put( aStr );
        }
    }
}


/*--------------------------------------------------
  $Log: not supported by cvs2svn $
  Revision 1.100  2000/09/18 16:05:14  willem.vandorp
  OpenOffice header added.

  Revision 1.99  2000/08/25 10:13:51  os
  style listbox sorted

  Revision 1.98  2000/07/03 10:33:17  os
  #72742# resource warnings corrected

  Revision 1.97  2000/07/03 08:04:44  os
  #72742# resource warnings corrected

  Revision 1.96  2000/04/20 12:54:31  os
  GetName() returns String&

  Revision 1.95  2000/04/11 08:03:22  os
  UNICODE

  Revision 1.94  2000/03/03 15:16:58  os
  StarView remainders removed

  Revision 1.93  2000/02/11 14:43:37  hr
  #70473# changes for unicode ( patched by automated patchtool )

  Revision 1.92  1999/11/16 17:11:59  os
  use FillCharStyleListBox

  Revision 1.91  1998/09/08 14:49:16  OS
  #56134# Metric fuer Text und HTML getrennt


      Rev 1.90   08 Sep 1998 16:49:16   OS
   #56134# Metric fuer Text und HTML getrennt

      Rev 1.89   03 Apr 1998 17:06:10   OM
   #49189 Korrekte Initialenvorschau

      Rev 1.88   03 Apr 1998 16:59:36   OM
   #49189 Korrekte Initialenvorschau

      Rev 1.87   20 Mar 1998 17:43:28   OM
   Ganzes Wort als Initialie

      Rev 1.86   12 Sep 1997 10:35:36   OS
   ITEMID_* definiert

      Rev 1.85   09 Sep 1997 13:33:42   OS
   lokale class

      Rev 1.84   04 Sep 1997 17:16:22   MA
   includes

      Rev 1.83   01 Sep 1997 13:25:16   OS
   DLL-Umstellung

      Rev 1.82   15 Aug 1997 12:12:34   OS
   chartar/frmatr/txtatr aufgeteilt

      Rev 1.81   09 Aug 1997 13:01:26   OS
   paraitem/frmitems/textitem aufgeteilt

      Rev 1.80   08 Aug 1997 17:29:40   OM
   Headerfile-Umstellung

      Rev 1.79   09 Jul 1997 17:20:50   HJS
   includes

      Rev 1.78   24 Feb 1997 17:19:44   OS
   #36936# -> keine PoolId benutzen

      Rev 1.77   19 Feb 1997 19:11:54   MA
   fix: DropCap, Text per Item

      Rev 1.76   11 Feb 1997 16:35:04   OS
   Vorlagen in SvStringsISortDtor sortieren

      Rev 1.75   11 Dec 1996 15:46:50   JP
   neu: holen der HTML-CharVorlagen

      Rev 1.74   11 Nov 1996 09:16:38   MA
   ResMgr

      Rev 1.73   30 Oct 1996 08:12:10   MA
   includes

      Rev 1.72   29 Oct 1996 17:36:42   HJS
   includes

      Rev 1.71   24 Oct 1996 17:07:14   JP
   Optimierung: Find...ByName

      Rev 1.70   23 Oct 1996 13:49:12   JP
   SVMEM -> SVSTDARR Umstellung

      Rev 1.69   02 Oct 1996 08:36:14   MA
   Umstellung Enable/Disable

      Rev 1.68   28 Aug 1996 08:59:10   OS
   includes

      Rev 1.67   25 Jun 1996 13:57:34   MA
   atrpafnchxx entfernt

      Rev 1.66   04 Apr 1996 13:38:54   OS
   Bug 26699: neue Methode FillSet, die keine Aenderungen an der Shell vornimmt

      Rev 1.65   22 Feb 1996 08:28:36   OS
   Text beim Ausschalten zuruecksetzen

      Rev 1.64   21 Feb 1996 12:41:44   OS
   Dialog verschoenert, disable ist nicht mehr gleichbedeutend mit Inhalt loeschen

      Rev 1.63   06 Feb 1996 15:18:40   JP
   Link Umstellung 305

      Rev 1.62   30 Jan 1996 22:52:14   JP
   Bug #24974#: DropCaps-Text nie bei Vorlagen austauschen

      Rev 1.61   23 Jan 1996 11:27:38   OS
   richtige Reaktion auf Standard-Button im Formatdialog

      Rev 1.60   28 Nov 1995 21:15:16   JP
   UiSystem-Klasse aufgehoben, in initui/swtype aufgeteilt

--------------------------------------------------*/


diff --git a/sw/source/ui/chrdlg/drpcps.hrc b/sw/source/ui/chrdlg/drpcps.hrc
new file mode 100644
index 0000000..19b00fc
--- /dev/null
+++ b/sw/source/ui/chrdlg/drpcps.hrc
@@ -0,0 +1,86 @@
/*************************************************************************
 *
 *  $RCSfile: drpcps.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:32 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _DRPCPS_HRC
#define _DRPCPS_HRC

// #define ******************************************************************

#define FT_DROPCAPS   1
#define FLD_DROPCAPS   2
#define TXT_LINES      3
#define FLD_LINES      4
#define TXT_DISTANCE   5
#define FLD_DISTANCE   6
#define CNT_PICT       7
#define TXT_TEXT       8
#define EDT_TEXT       9
#define TXT_TEMPLATE  10
#define BOX_TEMPLATE  11
#define GRP_SETTINGS  12
#define CB_SWITCH     13
#define BOX_PICT      14
#define BOX_CONTENT   15
#define CB_WORD       16

#endif

// ********************************************************************** EOF
diff --git a/sw/source/ui/chrdlg/drpcps.src b/sw/source/ui/chrdlg/drpcps.src
new file mode 100644
index 0000000..c555432
--- /dev/null
+++ b/sw/source/ui/chrdlg/drpcps.src
@@ -0,0 +1,493 @@
/*************************************************************************
 *
 *  $RCSfile: drpcps.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:32 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
 // #pragma ******************************************************************

 // #include *****************************************************************
#include "globals.hrc"
#include "chrdlg.hrc"
#include "drpcps.hrc"
#include "helpid.h"
 // TabDialog ****************************************************************
TabDialog DLG_DROPCAPS
{
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Text = "Initialen" ;
    Text [ English ] = "Drop Caps" ;
    Text [ norwegian ] = "Drop Caps" ;
    Text [ italian ] = "Capolettera" ;
    Text [ portuguese_brazilian ] = "Capitulares descidas" ;
    Text [ portuguese ] = "Iniciais" ;
    Text [ finnish ] = "Anfangit" ;
    Text [ danish ] = "Initialer" ;
    Text [ french ] = "Lettrines" ;
    Text [ swedish ] = "Anfangsbokstäver" ;
    Text [ dutch ] = "Initialen" ;
    Text [ spanish ] = "Iniciales" ;
    Text [ english_us ] = "Drop Caps" ;
    Moveable = TRUE ;
    TabControl 1
    {
        OutputSize = TRUE ;
        PageList =
        {
            PageItem
            {
                Identifier = TP_DROPCAPS ;
                Text = "Initialen" ;
                Text [ ENGLISH ] = "Drop Caps" ;
                Text [ norwegian ] = "Drop Caps" ;
                Text [ italian ] = "Capolettera" ;
                Text [ portuguese_brazilian ] = "Capitulares descidas" ;
                Text [ portuguese ] = "Iniciais" ;
                Text [ finnish ] = "Anfangit" ;
                Text [ danish ] = "Initialer" ;
                Text [ french ] = "Lettrines" ;
                Text [ swedish ] = "Anfangsbokstäver" ;
                Text [ dutch ] = "Initialen" ;
                Text [ spanish ] = "Iniciales" ;
                Text [ english_us ] = "Drop Caps" ;
                PageResID = TP_DROPCAPS ;
                Text[ chinese_simplified ] = "×ÖÊ×´óд";
                Text[ russian ] = "Èíèöèàëû";
                Text[ polish ] = "Inicja³y";
                Text[ japanese ] = "ÄÞÛ¯Ìß·¬¯Ìß";
                Text[ chinese_traditional ] = "¦r­º¤j¼g";
                Text[ arabic ] = "ÇáÃÍÑÝ ÇáÇÓÊåáÇáíÉ";
                Text[ greek ] = "Áñ÷éãñÜììáôá";
                Text[ korean ] = "´Ü¶ô ù¹®ÀÚ Àå½Ä";
                Text[ turkish ] = "Baþharfler";
                Text[ language_user1 ] = " ";
            };
        };
    };
    Text[ chinese_simplified ] = "Æðʼ´óд×Öĸ";
    Text[ russian ] = "Èíèöèàëû";
    Text[ polish ] = "Inicja³y";
    Text[ japanese ] = "ÄÞÛ¯Ìß·¬¯Ìß";
    Text[ chinese_traditional ] = "¤j¼g¦r¥À";
    Text[ arabic ] = "ÇáÃÍÑÝ ÇáÇÓÊåáÇáíÉ";
    Text[ greek ] = "Áñ÷éãñÜììáôá";
    Text[ korean ] = "´Ü¶ô ù¹®ÀÚ Àå½Ä";
    Text[ turkish ] = "Baþharfler";
    Text[ language_user1 ] = " ";
};
 // TabPage ******************************************************************
TabPage TP_DROPCAPS
{
    HelpID = HID_DROPCAPS ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Hide = TRUE ;
    CheckBox CB_SWITCH
    {
        Pos = MAP_APPFONT ( 12 , 15 ) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "I~nitialen anzeigen" ;
        Text [ English ] = "Show Drop Caps" ;
        Text [ english_us ] = "Display drop caps" ;
        Text [ italian ] = "Mostra capolettera" ;
        Text [ spanish ] = "Mostrar iniciales" ;
        Text [ french ] = "~Première(s) lettre(s)" ;
        Text [ dutch ] = "I~nitialen weergeven" ;
        Text [ swedish ] = "Visa anfangsbokstäver" ;
        Text [ danish ] = "Vis initialer" ;
        Text [ portuguese_brazilian ] = "Initialen anzeigen" ;
        Text [ portuguese ] = "Mostrar i~niciais" ;
        Text[ chinese_simplified ] = "ÏÔʾ´óдÊ××Öĸ";
        Text[ russian ] = "Ïîêàçàòü èíèöèàëû";
        Text[ polish ] = "Po~ka¿ inicja³y";
        Text[ japanese ] = "ÄÞÛ¯Ìß·¬¯Ì߂̕\\ަ";
        Text[ chinese_traditional ] = "Åã¥Ü¦r­º¤j¼g";
        Text[ arabic ] = "ÅÙåÇÑ ÇáÃÍÑÝ ÇáÇÓÊåáÇáíÉ";
        Text[ greek ] = "ÅìöÜ~íéóç áñ÷éãñáììÜôùí";
        Text[ korean ] = "´Ü¶ô ù¹®ÀÚ Àå½Ä Ç¥½Ã(~O)";
        Text[ turkish ] = "Baþ harfleri vurgula";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_WORD
    {
        Pos = MAP_APPFONT ( 12 , 26 ) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "Ganzes ~Wort" ;
        Text [ English ] = "Whole Word" ;
        Text [ english_us ] = "~Whole word" ;
        Text [ portuguese_brazilian ] = "Ganzes ~Wort" ;
        Text [ swedish ] = "Helt ~ord" ;
        Text [ danish ] = "Helt ord" ;
        Text [ italian ] = "~Parola intera" ;
        Text [ spanish ] = "Toda la pala~bra" ;
        Text [ french ] = "~Mot entier" ;
        Text [ dutch ] = "Heel ~woord" ;
        Text [ portuguese ] = "~Palavra inteira" ;
        Text[ chinese_simplified ] = "Õû¸ö×Ö(~W)";
        Text[ russian ] = "Âñå ñëîâî";
        Text[ polish ] = "Ca³e s³owo";
        Text[ japanese ] = "Œê‘S‘Ì(~W)";
        Text[ chinese_traditional ] = "¾ã­Ó¦r(~W)";
        Text[ arabic ] = "ßáãÉ ßÇãáÉ";
        Text[ greek ] = "Ïëüêëçñç ëÝîç";
        Text[ korean ] = "Àüü ´Ü¾î(~W)";
        Text[ turkish ] = "Tam sözcük";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_DROPCAPS
    {
        Pos = MAP_APPFONT ( 12 , 39 ) ;
        Size = MAP_APPFONT ( 70 , 10 ) ;
        Text = "Anzahl der Ze~ichen" ;
        Text [ English ] = "Number of characters" ;
         //     Text[norwegian] = "~Drop Caps";
         //     Text[italian] = "~Annulla maiuscole.";
         //     Text[portuguese_brazilian] = "~Capitulares descidas";
         //     Text[portuguese] = "~Capitulares descidas";
         //     Text[finnish] = "~Anfangit";
         //     Text[danish] = "~Uncialer";
         //     Text[french] = "~Drop Caps";
         //     Text[swedish] = "~Anfanger";
         //     Text[dutch] = "~Initialen";
         //     Text[spanish] = "~Quitar mayúsculas";
         //     Text[english_us] = "~Drop Caps";
        Text [ english_us ] = "Number of ~characters:" ;
        Text [ italian ] = "Numero di caratteri" ;
        Text [ spanish ] = "~Número de caracteres" ;
        Text [ french ] = "~Largeur (en caractères)" ;
        Text [ dutch ] = "~Aantal tekens" ;
        Text [ swedish ] = "Antal te~cken" ;
        Text [ danish ] = "Antal tegn" ;
        Text [ portuguese_brazilian ] = "Anzahl der Ze~ichen" ;
        Text [ portuguese ] = "Quantidade de ~caracteres" ;
        Text[ chinese_simplified ] = "×Ö·ûÊýÄ¿(~C)";
        Text[ russian ] = "Êîëè÷åñòâî çíàêîâ";
        Text[ polish ] = "Liczba znaków";
        Text[ japanese ] = "•¶Žš”(~C)";
        Text[ chinese_traditional ] = "¦r¤¸¼Æ¥Ø(~C)";
        Text[ arabic ] = "ÚÏÏ ÇáÃÍÑÝ";
        Text[ greek ] = "Áñéèìüò ÷áñáêôÞñùí";
        Text[ korean ] = "¹®ÀÚ ¼ö:(~C)";
        Text[ turkish ] = "Karakter sayýsý";
        Text[ language_user1 ] = " ";
    };
    NumericField FLD_DROPCAPS
    {
        Border = TRUE ;
        First = 1 ;
        Last = 9 ;
        Left = TRUE ;
        Maximum = 9 ;
        Minimum = 1 ;
        Pos = MAP_APPFONT ( 89 , 37 ) ;
        Repeat = TRUE ;
        Size = MAP_APPFONT ( 36 , 12 ) ;
        Spin = TRUE ;
        TabStop = TRUE ;
    };
    FixedText TXT_LINES
    {
        Left = TRUE ;
        Pos = MAP_APPFONT ( 12 , 53 ) ;
        Size = MAP_APPFONT ( 70 , 10 ) ;
        Text = "Zei~len" ;
        Text [ English ] = "~Lines" ;
        Text [ norwegian ] = "~Linjer" ;
        Text [ italian ] = "Righe" ;
        Text [ portuguese_brazilian ] = "~Linhas" ;
        Text [ portuguese ] = "~Linhas" ;
        Text [ finnish ] = "~Viivat" ;
        Text [ danish ] = "Rækker" ;
        Text [ french ] = "~Hauteur (en lignes)" ;
        Text [ swedish ] = "~Rader" ;
        Text [ dutch ] = "~Regels" ;
        Text [ spanish ] = "~Líneas" ;
        Text [ english_us ] = "~Lines" ;
        Text[ chinese_simplified ] = "ÐÐ(~L)";
        Text[ russian ] = "Ñòðîêè";
        Text[ polish ] = "Wiersze";
        Text[ japanese ] = "s(~Lj";
        Text[ chinese_traditional ] = "¦æ(~L)";
        Text[ arabic ] = "ÃÓØÑ";
        Text[ greek ] = "ÃñáììÝò";
        Text[ korean ] = "¼±(~L)";
        Text[ turkish ] = "Satýr adedi";
        Text[ language_user1 ] = " ";
    };
    NumericField FLD_LINES
    {
        Border = TRUE ;
        First = 2 ;
        Last = 9 ;
        Left = TRUE ;
        Maximum = 9 ;
        Minimum = 2 ;
        Pos = MAP_APPFONT ( 89 , 51 ) ;
        Repeat = TRUE ;
        Size = MAP_APPFONT ( 36 , 12 ) ;
        Spin = TRUE ;
        TabStop = TRUE ;
    };
    FixedText TXT_DISTANCE
    {
        Left = TRUE ;
        Pos = MAP_APPFONT ( 12 , 67 ) ;
        Size = MAP_APPFONT ( 70 , 10 ) ;
        Text = "A~bstand zum Text" ;
        Text [ English ] = "D~istance" ;
        Text [ norwegian ] = "A~vstand" ;
        Text [ italian ] = "D~istanza dal testo" ;
        Text [ portuguese_brazilian ] = "D~istância" ;
        Text [ portuguese ] = "~Distância do texto" ;
        Text [ finnish ] = "~Etäisyys" ;
        Text [ danish ] = "Afstand til tekst" ;
        Text [ french ] = "~Écart du texte" ;
        Text [ swedish ] = "A~vstånd till text" ;
        Text [ dutch ] = "A~fstand tot tekst" ;
        Text [ spanish ] = "~Distancia hasta el texto" ;
        Text [ english_us ] = "Space to text" ;
        Text[ chinese_simplified ] = "ÖÁÕýÎĵľàÀë(~D)";
        Text[ russian ] = "Ðàññòîÿíèå îò òåêñòà";
        Text[ polish ] = "Odstêp do tekstu";
        Text[ japanese ] = "÷½Ä‚܂ł̊Ԋu(~D)";
        Text[ chinese_traditional ] = "¦Ü¤º¤åªº¶ZÖÃ(~D)";
        Text[ arabic ] = "ÇáãÓÇÝÉ ÍÊì ÇáäÕ";
        Text[ greek ] = "Á~ðüóôáóç áðü ôï êåßìåíï";
        Text[ korean ] = "ÅØ½ºÆ®·ÎºÎÅÍÀÇ °Å¸®(~D)";
        Text[ turkish ] = "Metne uzaklýk";
        Text[ language_user1 ] = " ";
    };
    MetricField FLD_DISTANCE
    {
        Border = TRUE ;
        DecimalDigits = 2 ;
        First = 0 ;
        Last = 200 ;
        Left = TRUE ;
        Maximum = 200 ;
        Minimum = 0 ;
        Pos = MAP_APPFONT ( 89 , 65 ) ;
        Repeat = TRUE ;
        Size = MAP_APPFONT ( 36 , 12 ) ;
        Spin = TRUE ;
        SpinSize = 10 ;
        TabStop = TRUE ;
        Unit = FUNIT_CM ;
    };
    GroupBox GRP_SETTINGS
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 125 , 79 ) ;
        Text = "Einstellungen" ;
        Text [ English ] = "Options" ;
        Text [ norwegian ] = "Options" ;
        Text [ italian ] = "Impostazioni" ;
        Text [ portuguese_brazilian ] = "Opções" ;
        Text [ portuguese ] = "Predefinições" ;
        Text [ finnish ] = "Määritykset" ;
        Text [ danish ] = "Indstillinger" ;
        Text [ french ] = "Paramètres" ;
        Text [ swedish ] = "Inställningar" ;
        Text [ dutch ] = "Instellingen" ;
        Text [ spanish ] = "Configuración" ;
        Text [ english_us ] = "Settings" ;
        Text[ chinese_simplified ] = "É趨";
        Text[ russian ] = "Íàñòðîéêè";
        Text[ polish ] = "Ustawienia";
        Text[ japanese ] = "Ý’è";
        Text[ chinese_traditional ] = "³]©w";
        Text[ arabic ] = "ÅÚÏÇÏÇÊ";
        Text[ greek ] = "Ñõèìßóåéò";
        Text[ korean ] = "¼³Á¤";
        Text[ turkish ] = "Ayarlar";
        Text[ language_user1 ] = " ";
    };
    Control CNT_PICT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 143 , 14 ) ;
        Size = MAP_APPFONT ( 105 , 62 ) ;
    };
    GroupBox BOX_PICT
    {
        Pos = MAP_APPFONT ( 137 , 3 ) ;
        Size = MAP_APPFONT ( 117 , 79 ) ;
        Text = "Beispiel" ;
        Text [ English ] = "Example" ;
        Text [ dutch ] = "Voorbeeld" ;
        Text [ english_us ] = "Preview" ;
        Text [ italian ] = "Esempio" ;
        Text [ spanish ] = "Ejemplo" ;
        Text [ french ] = "Exemple" ;
        Text [ swedish ] = "Exempel" ;
        Text [ danish ] = "Eksempel" ;
        Text [ portuguese_brazilian ] = "Beispiel" ;
        Text [ portuguese ] = "Exemplo" ;
        Text[ chinese_simplified ] = "Ô¤ÊÓ";
        Text[ russian ] = "Ïðèìåð";
        Text[ polish ] = "Przyk³ad";
        Text[ japanese ] = "—á";
        Text[ chinese_traditional ] = "¹wÄý";
        Text[ arabic ] = "äãæÐÌ";
        Text[ greek ] = "ÐáñÜäåéãìá";
        Text[ korean ] = "¹Ì¸®º¸±â";
        Text[ turkish ] = "Önizleme";
        Text[ language_user1 ] = " ";
    };
    FixedText TXT_TEXT
    {
        Left = TRUE ;
        Pos = MAP_APPFONT ( 12 , 96 ) ;
        Size = MAP_APPFONT ( 70 , 10 ) ;
        Text = "Initialen~text" ;
        Text [ English ] = "~Text" ;
        Text [ norwegian ] = "~Text" ;
        Text [ italian ] = "Testo" ;
        Text [ portuguese_brazilian ] = "~Texto" ;
        Text [ portuguese ] = "~Texto" ;
        Text [ finnish ] = "~Teksti" ;
        Text [ danish ] = "Initialtekst" ;
        Text [ french ] = "~Autre caractère" ;
        Text [ swedish ] = "Anfangs~text" ;
        Text [ dutch ] = "~Initialentekst" ;
        Text [ spanish ] = "Te~xto" ;
        Text [ english_us ] = "~Text" ;
        Text[ chinese_simplified ] = "´óд×Ö(~T)";
        Text[ russian ] = "Òåêñò";
        Text[ polish ] = "Tekst z inicja³ami";
        Text[ japanese ] = "ÄÞÛ¯Ìß·¬¯Ì߂Ì÷½Ä(~T)";
        Text[ chinese_traditional ] = "¤j¼g¦r(~T)";
        Text[ arabic ] = "ÇáäÕ";
        Text[ greek ] = "Êåßìåíï";
        Text[ korean ] = "ÅØ½ºÆ®(~T)";
        Text[ turkish ] = "Baþharf metni";
        Text[ language_user1 ] = " ";
    };
    Edit EDT_TEXT
    {
        Border = TRUE ;
        Left = TRUE ;
        Pos = MAP_APPFONT ( 143 , 95 ) ;
        Size = MAP_APPFONT ( 105 , 12 ) ;
        TabStop = TRUE ;
        MaxTextLength = 9 ;
    };
    FixedText TXT_TEMPLATE
    {
        Left = TRUE ;
        Pos = MAP_APPFONT ( 12 , 111 ) ;
        Size = MAP_APPFONT ( 70 , 10 ) ;
        Text = "Zeichen~vorlage" ;
        Text [ English ] = "Character st~yle" ;
        Text [ norwegian ] = "M~al" ;
        Text [ italian ] = "Modello di carattere" ;
        Text [ portuguese_brazilian ] = "Es~tilo" ;
        Text [ portuguese ] = "Es~tilo de caracteres" ;
        Text [ finnish ] = "~Tyyli" ;
        Text [ danish ] = "Tegntypografi" ;
        Text [ french ] = "~Style de caractères" ;
        Text [ swedish ] = "Tecken~formatmall" ;
        Text [ dutch ] = "~Tekenopmaakprofiel" ;
        Text [ spanish ] = "E~stilo de carácter" ;
        Text [ english_us ] = "Character St~yle" ;
        Text[ chinese_simplified ] = "×Ö·ûÑùʽ(~Y)";
        Text[ russian ] = "Ñòèëü òåêñòà";
        Text[ polish ] = "Styl znaku";
        Text[ japanese ] = "•¶Žš½À²Ù(~Y)";
        Text[ chinese_traditional ] = "¦r¤¸¼Ë¦¡(~Y)";
        Text[ arabic ] = "äãØ ÇáÃÍÑÝ";
        Text[ greek ] = "Óôõë ÷áñáêôÞñùí";
        Text[ korean ] = "¹®ÀÚ À¯Çü(~Y)";
        Text[ turkish ] = "Karakter ~biçimi";
        Text[ language_user1 ] = "All \"Vorlage\"/Styles are always written with capital S. 10.5.00EM";
    };
    ListBox BOX_TEMPLATE
    {
        Border = TRUE ;
        DropDown = TRUE ;
        Pos = MAP_APPFONT ( 143 , 110 ) ;
        Size = MAP_APPFONT ( 105 , 61 ) ;
        TabStop = TRUE ;
    };
    GroupBox BOX_CONTENT
    {
        Pos = MAP_APPFONT ( 6 , 85 ) ;
        Size = MAP_APPFONT ( 248 , 44 ) ;
        Text = "Inhalt" ;
        Text [ English ] = "Content" ;
        Text [ english_us ] = "Contents" ;
        Text [ italian ] = "Contenuto" ;
        Text [ spanish ] = "Contenido" ;
        Text [ french ] = "Contenu" ;
        Text [ dutch ] = "Inhoud" ;
        Text [ swedish ] = "Innehåll" ;
        Text [ danish ] = "Indhold" ;
        Text [ portuguese_brazilian ] = "Inhalt" ;
        Text [ portuguese ] = "Conteúdo" ;
        Text[ chinese_simplified ] = "ÄÚÈÝ";
        Text[ russian ] = "Ñîäåðæèìîå";
        Text[ polish ] = "ZawartoϾ";
        Text[ japanese ] = "“à—e";
        Text[ chinese_traditional ] = "¤º®e";
        Text[ arabic ] = "ÇáãÍÊæíÇÊ";
        Text[ greek ] = "Ðåñéå÷üìåíá";
        Text[ korean ] = "³»¿ë";
        Text[ turkish ] = "Ýçerik";
        Text[ language_user1 ] = " ";
    };
};
 // ********************************************************************** EOF
diff --git a/sw/source/ui/chrdlg/makefile.mk b/sw/source/ui/chrdlg/makefile.mk
new file mode 100644
index 0000000..a03e3cf
--- /dev/null
+++ b/sw/source/ui/chrdlg/makefile.mk
@@ -0,0 +1,112 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:32 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=..$/..$/..

PRJNAME=sw
TARGET=chrdlg

AUTOSEG=true

PROJECTPCH=ui_pch
PDBTARGET=ui_pch
PROJECTPCHSOURCE=..\ui_1st\ui_pch

# --- Settings -----------------------------------------------------

.INCLUDE :  $(PRJ)$/inc$/swpre.mk
.INCLUDE :  settings.mk
.INCLUDE :  $(PRJ)$/inc$/sw.mk

# --- Files --------------------------------------------------------

CXXFILES = \
        break.cxx \
        chardlg.cxx \
        drpcps.cxx \
        ccoll.cxx \
        pardlg.cxx \
        tblnumfm.cxx \
        numpara.cxx

SRCFILES =	\
        swbreak.src \
        chardlg.src \
        chrdlg.src \
        drpcps.src \
        ccoll.src \
        paradlg.src \
        numpara.src

SLOFILES =	\
        $(SLO)$/break.obj \
        $(SLO)$/chardlg.obj \
        $(SLO)$/drpcps.obj \
        $(SLO)$/ccoll.obj \
        $(SLO)$/pardlg.obj \
        $(SLO)$/tblnumfm.obj \
        $(SLO)$/numpara.obj

# --- Tagets -------------------------------------------------------

.INCLUDE :  target.mk

diff --git a/sw/source/ui/chrdlg/numpara.cxx b/sw/source/ui/chrdlg/numpara.cxx
new file mode 100644
index 0000000..b58efe9
--- /dev/null
+++ b/sw/source/ui/chrdlg/numpara.cxx
@@ -0,0 +1,366 @@
/*************************************************************************
 *
 *  $RCSfile: numpara.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:32 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "cmdid.h"
#include "swtypes.hxx"
#include "hintids.hxx"
#include "globals.hrc"
#include "helpid.h"

#ifndef _SFX_OBJSH_HXX //autogen
#include <sfx2/objsh.hxx>
#endif
#ifndef _SVX_HTMLMODE_HXX //autogen
#include <svx/htmlmode.hxx>
#endif
#ifndef _SVX_SVXIDS_HRC
#include <svx/svxids.hrc>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _SFXINTITEM_HXX //autogen
#include <svtools/intitem.hxx>
#endif
#ifndef SW_FMTLINE_HXX
#include <fmtline.hxx>
#endif
#include <numpara.hxx>
#include <numpara.hrc>

// Globals ******************************************************************

static USHORT __FAR_DATA aPageRg[] = {
    FN_NUMBER_NEWSTART, FN_NUMBER_NEWSTART_AT,
    0
};
/*-----------------31.01.98 08:34-------------------

--------------------------------------------------*/
SwParagraphNumTabPage::SwParagraphNumTabPage(Window* pParent,
                                                const SfxItemSet& rAttr ) :
    SfxTabPage(pParent, SW_RES(TP_NUMPARA), rAttr),
    aNumberStyleGB          ( this, ResId( GB_NUMBER_STYLE ) ),
    aNumberStyleLB          ( this, ResId( LB_NUMBER_STYLE ) ),
    aNewStartGB             ( this, ResId( GB_NEW_START ) ),
    aNewStartCB             ( this, ResId( CB_NEW_START ) ),
    aNewStartFT             ( this, ResId( FT_NEW_START ) ),
    aNewStartNF             ( this, ResId( NF_NEW_START ) ),
    aCountParaGB            ( this, ResId( GB_COUNT_PARA        ) ),
    aCountParaCB            ( this, ResId( CB_COUNT_PARA        ) ),
    aRestartParaCountCB     ( this, ResId( CB_RESTART_PARACOUNT ) ),
    aRestartFT              ( this, ResId( FT_RESTART_NO        ) ),
    aRestartNF              ( this, ResId( NF_RESTART_PARA      ) ),
    bModified(FALSE),
    bCurNumrule(FALSE)
{
    FreeResource();

    const SfxPoolItem* pItem;
    SfxObjectShell* pObjSh;
    if(SFX_ITEM_SET == rAttr.GetItemState(SID_HTML_MODE, FALSE, &pItem) ||
        ( 0 != ( pObjSh = SfxObjectShell::Current()) &&
                    0 != (pItem = pObjSh->GetItem(SID_HTML_MODE))))
    {
        USHORT nHtmlMode = ((const SfxUInt16Item*)pItem)->GetValue();
        if(HTMLMODE_ON & nHtmlMode)
        {
            aCountParaGB        .Hide();
            aCountParaCB        .Hide();
            aRestartParaCountCB .Hide();
            aRestartFT          .Hide();
            aRestartNF          .Hide();
        }
    }
    aNewStartCB.SetClickHdl(LINK(this, SwParagraphNumTabPage, NewStartHdl_Impl));
    aNumberStyleLB.SetSelectHdl(LINK(this, SwParagraphNumTabPage, StyleHdl_Impl));
    aCountParaCB.SetClickHdl(LINK(this,
                    SwParagraphNumTabPage, LineCountHdl_Impl));
    aRestartParaCountCB.SetClickHdl(
                    LINK(this, SwParagraphNumTabPage, LineCountHdl_Impl));
}
/*-----------------31.01.98 08:34-------------------

--------------------------------------------------*/
SwParagraphNumTabPage::~SwParagraphNumTabPage()
{
}

/*-----------------31.01.98 08:38-------------------

--------------------------------------------------*/
SfxTabPage* SwParagraphNumTabPage::Create(  Window* pParent,
                                const SfxItemSet& rSet )
{
    return new SwParagraphNumTabPage(pParent, rSet);
}

/*-----------------31.01.98 08:38-------------------

--------------------------------------------------*/
USHORT* SwParagraphNumTabPage::GetRanges()
{
    return aPageRg;
}

/*-----------------31.01.98 08:38-------------------

--------------------------------------------------*/
BOOL    SwParagraphNumTabPage::FillItemSet( SfxItemSet& rSet )
{
    if( aNumberStyleLB.GetSelectEntryPos() != aNumberStyleLB.GetSavedValue())
    {
        String aStyle;
        if(aNumberStyleLB.GetSelectEntryPos())
            aStyle = aNumberStyleLB.GetSelectEntry();
        const SfxStringItem* pOldRule = (const SfxStringItem*)GetOldItem( rSet, SID_ATTR_PARA_NUMRULE);
        SfxStringItem* pRule = (SfxStringItem*)pOldRule->Clone();
        pRule->SetValue(aStyle);
        rSet.Put(*pRule);
        delete pRule;
        bModified = TRUE;
    }
    if(aNewStartCB.GetState() != aNewStartCB.GetSavedValue() ||
        aNewStartNF.GetText() != aNewStartNF.GetSavedValue())
    {
        bModified = TRUE;
        rSet.Put(SfxBoolItem(FN_NUMBER_NEWSTART, aNewStartCB.GetState() == STATE_CHECK));
        rSet.Put(SfxUInt16Item(FN_NUMBER_NEWSTART_AT, (USHORT)aNewStartNF.GetValue()));
    }

    if(aCountParaCB.GetSavedValue() != aCountParaCB.GetState() ||
        aRestartParaCountCB.GetSavedValue() != aRestartParaCountCB.GetState() ||
            aRestartNF.GetSavedValue() != aRestartNF.GetText() )
    {
        SwFmtLineNumber aFmt;
        aFmt.SetStartValue( aRestartParaCountCB.GetState() == STATE_CHECK ?
                                aRestartNF.GetValue() : 0 );
        aFmt.SetCountLines( aCountParaCB.IsChecked() );
        rSet.Put(aFmt);
        bModified = TRUE;
    }
    return bModified;
}

/*-----------------31.01.98 08:38-------------------

--------------------------------------------------*/
void    SwParagraphNumTabPage::Reset( const SfxItemSet& rSet )
{
    SfxItemState eItemState = rSet.GetItemState( GetWhich(SID_ATTR_PARA_NUMRULE) );

    String aStyle;
    if( eItemState >= SFX_ITEM_AVAILABLE )
    {
        aStyle = ((const SfxStringItem &)rSet.Get( GetWhich(SID_ATTR_PARA_NUMRULE) )).GetValue();
        if(!aStyle.Len())
            aStyle = aNumberStyleLB.GetEntry(0);
        aNumberStyleLB.SelectEntry( aStyle );
    }
    else
    {
        aNumberStyleLB.SetNoSelection();
    }

    aNumberStyleLB.SaveValue();


    eItemState = rSet.GetItemState( FN_NUMBER_NEWSTART );
    if(eItemState > SFX_ITEM_AVAILABLE )
    {
        bCurNumrule = TRUE;
        aNewStartCB.SetState(
            ((const SfxBoolItem&)rSet.Get(FN_NUMBER_NEWSTART)).GetValue() ?
                        STATE_CHECK : STATE_NOCHECK );
        aNewStartCB.EnableTriState(FALSE);
    }
    else
        aNewStartCB.SetState(STATE_DONTKNOW);
    aNewStartCB.SaveValue();

    eItemState = rSet.GetItemState( FN_NUMBER_NEWSTART_AT);
    if( eItemState > SFX_ITEM_AVAILABLE )
    {
        USHORT nNewStart = ((const SfxUInt16Item&)rSet.Get(FN_NUMBER_NEWSTART_AT)).GetValue();
        if(USHRT_MAX == nNewStart)
            nNewStart = 1;
        aNewStartNF.SetValue(nNewStart);
        NewStartHdl_Impl(&aNewStartCB);
    }
    aNewStartNF.SaveValue();
    StyleHdl_Impl(&aNumberStyleLB);
    if( SFX_ITEM_AVAILABLE <= rSet.GetItemState(RES_LINENUMBER))
    {
        SwFmtLineNumber& rNum = (SwFmtLineNumber&)rSet.Get(RES_LINENUMBER);
        ULONG nStartValue = rNum.GetStartValue();
        BOOL bCount = rNum.IsCount();
        aCountParaCB.SetState( bCount ? STATE_CHECK : STATE_NOCHECK );
        aRestartParaCountCB.SetState( 0 != nStartValue ? STATE_CHECK : STATE_NOCHECK );
        aRestartNF.SetValue(nStartValue == 0 ? 1 : nStartValue);
        LineCountHdl_Impl(&aCountParaCB);
        aCountParaCB.EnableTriState(FALSE);
        aRestartParaCountCB.EnableTriState(FALSE);
    }
    else
    {
        aCountParaCB.SetState(STATE_DONTKNOW);
        aRestartParaCountCB.SetState(STATE_DONTKNOW);
    }
    aCountParaCB.SaveValue();
    aRestartParaCountCB.SaveValue();
    aRestartNF.SaveValue();

    bModified = FALSE;
}

/*-----------------31.01.98 08:38-------------------

--------------------------------------------------*/
void SwParagraphNumTabPage::EnableNewStart()
{
    aNewStartGB.Show();
    aNewStartCB.Show();
    aNewStartFT.Show();
    aNewStartNF.Show();
}

/*-----------------31.01.98 08:56-------------------

--------------------------------------------------*/
IMPL_LINK( SwParagraphNumTabPage, NewStartHdl_Impl, CheckBox*, pBox )
{
    BOOL bEnable = pBox->IsChecked();
    aNewStartFT.Enable(bEnable);
    aNewStartNF.Enable(bEnable);
    return 0;
}

/*-----------------05.02.98 10:01-------------------

--------------------------------------------------*/
IMPL_LINK( SwParagraphNumTabPage, LineCountHdl_Impl, CheckBox* , EMPTYARG)
{
    aRestartParaCountCB.Enable(aCountParaCB.IsChecked());

    BOOL bEnableRestartValue = aRestartParaCountCB.IsEnabled() &&
                                                aRestartParaCountCB.IsChecked();
    aRestartFT.Enable(bEnableRestartValue);
    aRestartNF.Enable(bEnableRestartValue);

    return 0;
}

/*-----------------05.02.98 13:39-------------------

--------------------------------------------------*/
IMPL_LINK( SwParagraphNumTabPage, StyleHdl_Impl, ListBox*, pBox )
{
    BOOL bEnable = bCurNumrule || pBox->GetSelectEntryPos() > 0;
    aNewStartCB.Enable(bEnable);
    NewStartHdl_Impl(&aNewStartCB);
    return 0;
}

/*************************************************************************

      $Log: not supported by cvs2svn $
      Revision 1.9  2000/09/18 16:05:14  willem.vandorp
      OpenOffice header added.

      Revision 1.8  2000/07/03 08:04:44  os
      #72742# resource warnings corrected

      Revision 1.7  1998/04/15 12:31:48  OS
      TriState-Boxen #49486#


      Rev 1.6   15 Apr 1998 14:31:48   OS
   TriState-Boxen #49486#

      Rev 1.5   17 Mar 1998 17:55:24   OS
   Vorlagenlistbox bei unbekannter Vorlage unselektiert #47570#

      Rev 1.4   03 Mar 1998 10:14:48   OS
   Zeilennumerierung nicht in HTML

      Rev 1.3   20 Feb 1998 11:23:42   MA
   Restarbeiten Zeilennummerierung

      Rev 1.2   05 Feb 1998 14:56:26   OS
   Paste-Fehler

      Rev 1.1   05 Feb 1998 14:43:30   OS
   Zeilennumerierung

      Rev 1.0   02 Feb 1998 09:15:52   OS
   Initial revision.

*************************************************************************/

diff --git a/sw/source/ui/chrdlg/numpara.hrc b/sw/source/ui/chrdlg/numpara.hrc
new file mode 100644
index 0000000..cbe4886
--- /dev/null
+++ b/sw/source/ui/chrdlg/numpara.hrc
@@ -0,0 +1,85 @@
/*************************************************************************
 *
 *  $RCSfile: numpara.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:32 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _NUMPARA_HRC
#define _NUMPARA_HRC

// #define ******************************************************************

#define LB_NUMBER_STYLE             1
#define GB_NUMBER_STYLE             2
#define CB_NEW_START                3
#define FT_NEW_START                4
#define GB_NEW_START                5
#define NF_NEW_START                6
#define GB_COUNT_PARA               7
#define CB_COUNT_PARA               8
#define CB_RESTART_PARACOUNT        9
#define FT_RESTART_NO              10
#define NF_RESTART_PARA            11

// **********************************************************************

#endif




diff --git a/sw/source/ui/chrdlg/numpara.src b/sw/source/ui/chrdlg/numpara.src
new file mode 100644
index 0000000..6c3a615
--- /dev/null
+++ b/sw/source/ui/chrdlg/numpara.src
@@ -0,0 +1,417 @@
/*************************************************************************
 *
 *  $RCSfile: numpara.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:32 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
 // #pragma ******************************************************************

 // #include *****************************************************************
#include "globals.hrc"
#include "chrdlg.hrc"
#include "numpara.hrc"
#include "helpid.h"
 // TabPage ******************************************************************
TabPage TP_NUMPARA
{
    HelpID = HID_NUMPARA ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Hide = TRUE ;
    GroupBox GB_NUMBER_STYLE
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 176 , 26 ) ;
        Text = "Nummerierungsvorlage" ;
        Text [ ENGLISH ] = "Number style" ;
        Text [ portuguese ] = "Estilo de numeração" ;
        Text [ english_us ] = "Numbering Style" ;
        Text [ portuguese_brazilian ] = "Numerierungsvorlage" ;
        Text [ swedish ] = "Numreringsformatmall" ;
        Text [ danish ] = "Nummereringstypografi" ;
        Text [ italian ] = "Modello di numerazione" ;
        Text [ spanish ] = "Estilo de numeración" ;
        Text [ french ] = "Style de numérotation" ;
        Text [ dutch ] = "Opmaakprofiel voor nummering" ;
        Text[ chinese_simplified ] = "±àºÅÑùʽ";
        Text[ russian ] = "Ñòèëü íóìåðàöèè";
        Text[ polish ] = "Styl numeracji";
        Text[ japanese ] = "”ԍ†•t‚¯‚̽À²Ù";
        Text[ chinese_traditional ] = "½s¸¹¼Ë¦¡";
        Text[ arabic ] = "äãØ ÇáÊÑÞíã";
        Text[ greek ] = "Óôõë áñßèìçóçò";
        Text[ korean ] = "¹øÈ£ ¸Å±â±â À¯Çü";
        Text[ turkish ] = "Numaralama biçimi";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_NUMBER_STYLE
    {
        Pos = MAP_APPFONT ( 12 , 12 ) ;
        Size = MAP_APPFONT ( 158 , 65 ) ;
        DropDown = TRUE ;
        Border = TRUE ;
        StringList =
        {
            < "keine" ; > ;
        };
        StringList [ ENGLISH ] =
        {
            < "keine" ; > ;
        };
        stringlist [ english_us ] =
        {
            < "None" ; > ;
        };
        stringlist [ portuguese_brazilian ] =
        {
            < "Nenhum" ; > ;
        };
        stringlist [ swedish ] =
        {
            < "ingen" ; > ;
        };
        stringlist [ danish ] =
        {
            < "ingen" ; > ;
        };
        stringlist [ italian ] =
        {
            < "senza" ; > ;
        };
        stringlist [ spanish ] =
        {
            < "Ninguno" ; > ;
        };
        stringlist [ french ] =
        {
            < "Aucun(e)" ; > ;
        };
        stringlist [ dutch ] =
        {
            < "geen" ; > ;
        };
        stringlist [ portuguese ] =
        {
            < "Nenhum" ; > ;
        };
    StringList [ chinese_simplified ] =
    {
             < "ÎÞ" ; > ;
    };
    StringList [ russian ] =
    {
             < "íåò" ; > ;
    };
    StringList [ polish ] =
    {
             < "brak" ; > ;
    };
    StringList [ japanese ] =
    {
             < "‚È‚µ" ; > ;
    };
    StringList [ chinese_traditional ] =
    {
             < "µL" ; > ;
    };
    StringList [ arabic ] =
    {
             < "ÈÏæä" ; > ;
    };
    StringList [ greek ] =
    {
             < "êáíÝíá" ; > ;
    };
    StringList [ korean ] =
    {
             < "¾øÀ½" ; > ;
    };
    StringList [ turkish ] =
    {
             < "yok" ; > ;
    };
    StringList [ language_user1 ] =
    {
             < " " ; > ;
    };
    };
    GroupBox GB_NEW_START
    {
        Pos = MAP_APPFONT ( 6 , 32 ) ;
        Size = MAP_APPFONT ( 176 , 40 ) ;
        Text = "Nummerierung" ;
        Text [ English ] = "Numbering" ;
        TabStop = TRUE ;
        Hide = TRUE ;
        Text [ portuguese ] = "Numeração" ;
        Text [ english_us ] = "Numbering" ;
        Text [ portuguese_brazilian ] = "Numerierung" ;
        Text [ swedish ] = "Numrering" ;
        Text [ danish ] = "Nummerering" ;
        Text [ italian ] = "Numerazione" ;
        Text [ spanish ] = "Numeración" ;
        Text [ french ] = "Numérotation" ;
        Text [ dutch ] = "Nummering" ;
        Text[ chinese_simplified ] = "񅧏";
        Text[ russian ] = "Íóìåðàöèÿ";
        Text[ polish ] = "Numeracja";
        Text[ japanese ] = "”ԍ†•t‚¯";
        Text[ chinese_traditional ] = "½s¸¹";
        Text[ arabic ] = "ÇáÊÑÞíã";
        Text[ greek ] = "Áñßèìçóç";
        Text[ korean ] = "¹øÈ£ ¸Å±â±â";
        Text[ turkish ] = "Numaralama";
        Text[ language_user1 ] = " ";
    };
    TriStateBox CB_NEW_START
    {
        Pos = MAP_APPFONT ( 12 , 44 ) ;
        Size = MAP_APPFONT ( 160 , 10 ) ;
        Text = "~An diesem Absatz neu beginnen" ;
        Text [ English ] = "~Restart at this paragraph" ;
        Hide = TRUE ;
        TabStop = TRUE ;
        Text [ portuguese ] = "~Recomeçar neste parágrafo" ;
        Text [ english_us ] = "R~estart at this paragraph" ;
        Text [ portuguese_brazilian ] = "~An diesem Absatz neu beginnen" ;
        Text [ swedish ] = "Börj~a om vid detta stycke" ;
        Text [ danish ] = "Begynd nyt ved dette afsnit" ;
        Text [ italian ] = "~Ricomincia con questo paragrafo" ;
        Text [ spanish ] = "~Volver a empezar en este párrafo" ;
        Text [ french ] = "~Commencer avec ce paragraphe" ;
        Text [ dutch ] = "~Bij deze alinea opnieuw beginnen" ;
        Text[ chinese_simplified ] = "´ÓÕâ¸ö¶ÎÂäÖØÐ¿ªÊ¼(~R)";
        Text[ russian ] = "Íà÷àòü ñ ýòîãî àáçàöà";
        Text[ polish ] = "Zacznij ponownie przy tym akapicie";
        Text[ japanese ] = "‚±‚Ì’i—ނŐV‚µ‚­Žn‚ß‚é(~R)";
        Text[ chinese_traditional ] = "±q³o­Ó¬q¸¨­«·s¶}©l(~R)";
        Text[ arabic ] = "ÇáÈÏÁ ãä ÌÏíÏ ÚäÏ åÐå ÇáÝÞÑÉ";
        Text[ greek ] = "Åð~áíåêêßíçóç áðü áõôÞ ôçí ðáñÜãñáöï";
        Text[ korean ] = "ÀÌ ´Ü¶ô¿¡¼­ ´Ù½Ã ½ÃÀÛ(~E)";
        Text[ turkish ] = "Bu paragraf ile yeniden baþla";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_NEW_START
    {
        Pos = MAP_APPFONT ( 12 , 56 ) ;
        Size = MAP_APPFONT ( 50 , 10 ) ;
        Text = "~Beginnen mit:" ;
        Text [ English ] = "~Start at:" ;
        Hide = TRUE ;
        Disable = TRUE ;
        Text [ portuguese ] = "~Começar com:" ;
        Text [ english_us ] = "~Start with:" ;
        Text [ portuguese_brazilian ] = "~Beginnen mit:" ;
        Text [ swedish ] = "~Börja med:" ;
        Text [ danish ] = "Begynd med:" ;
        Text [ italian ] = "~Inizia con..." ;
        Text [ spanish ] = "Empezar ~con:" ;
        Text [ french ] = "~Commencer avec :" ;
        Text [ dutch ] = "~Beginnen met:" ;
        Text[ chinese_simplified ] = "¿ªÊ¼´Ó(~S)";
        Text[ russian ] = "Íà÷àòü ñ:";
        Text[ polish ] = "Zacznij od:";
        Text[ japanese ] = "ŠJŽn:(~S)";
        Text[ chinese_traditional ] = "¶}©l±q(~S)";
        Text[ arabic ] = "ÇáÈÏÁ ÈÜ:";
        Text[ greek ] = "¸íáñîç áðü:";
        Text[ korean ] = "¿Í ÇÔ²² ½ÃÀÛ:(~S)";
        Text[ turkish ] = "~Baþlangýç deðeri:";
        Text[ language_user1 ] = " ";
    };
    NumericField NF_NEW_START
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 144 , 56 ) ;
        Size = MAP_APPFONT ( 26 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 0 ;
        Maximum = 9999 ;
        Value = 0 ;
        First = 0 ;
        Last = 9999 ;
        Hide = TRUE ;
        Disable = TRUE ;
    };
    GroupBox GB_COUNT_PARA
    {
        Pos = MAP_APPFONT ( 6 , 75 ) ;
        Size = MAP_APPFONT ( 176 , 53 ) ;
        Text = "Zeilennummerierung" ;
        Text [ English ] = "Line numbering" ;
        TabStop = TRUE ;
        Text [ portuguese ] = "Numeração de linhas" ;
        Text [ english_us ] = "Line Numbering" ;
        Text [ portuguese_brazilian ] = "Zeilennumerierung" ;
        Text [ swedish ] = "Radnumrering" ;
        Text [ danish ] = "Linjenummerering" ;
        Text [ italian ] = "Numerazione righe" ;
        Text [ spanish ] = "Numeración de líneas" ;
        Text [ french ] = "Numérotation de lignes" ;
        Text [ dutch ] = "Regelnummering" ;
        Text[ chinese_simplified ] = "ÐбàºÅ";
        Text[ russian ] = "Íóìåðàöèÿ ñòðîê";
        Text[ polish ] = "Numeracja wierszy";
        Text[ japanese ] = "s‚̔ԍ†•t‚¯";
        Text[ chinese_traditional ] = "¦æ½s¸¹";
        Text[ arabic ] = "ÊÑÞíã ÇáÃÓØÑ";
        Text[ greek ] = "Áñßèìçóç ãñáììþí";
        Text[ korean ] = "¼± ¹øÈ£ ¸Å±â±â";
        Text[ turkish ] = "Satýr numaralama";
        Text[ language_user1 ] = " ";
    };
    TriStateBox CB_COUNT_PARA
    {
        Pos = MAP_APPFONT ( 12 , 89 ) ;
        Size = MAP_APPFONT ( 160 , 10 ) ;
        Text = "~Die Zeilen dieses Absatzes mitzählen" ;
        Text [ English ] = "~Include this paragraph in line numbering" ;
        TabStop = TRUE ;
        Text [ english_us ] = "~Include this paragraph in line numbering" ;
        Text [ portuguese_brazilian ] = "~Die Zeilen dieses Absatzes mitzählen" ;
        Text [ swedish ] = "~Räkna med raderna i det här stycket" ;
        Text [ danish ] = "Inkluder dette afsnits rækker" ;
        Text [ italian ] = "~Conta le righe di questo paragrafo" ;
        Text [ spanish ] = "Con~tar las líneas de este párrafo" ;
        Text [ french ] = "~Inclure les lignes de ce paragraphe" ;
        Text [ dutch ] = "~De regels van deze alinea meetellen." ;
        Text [ portuguese ] = "~Incluir este parágrafo na numeração de linhas" ;
        Text[ chinese_simplified ] = "°üÀ¨Õâ¸ö¶ÎÂäµÄÐÐ(~I)";
        Text[ russian ] = "Ñ÷èòàòü, âêëþ÷àÿ ñòðîêè ýòîãî àáçàöà";
        Text[ polish ] = "W³¹cznie z wierszami tego akapitu";
        Text[ japanese ] = "‚±‚Ì’i—Ž‚Ìs”‚ðŠÜ‚ß‚é(~I)";
        Text[ chinese_traditional ] = "¥]¬A³o­Ó¬q¸¨ªº¦æ(~I)";
        Text[ arabic ] = "ÚÏ ÃÓØÑ åÐå ÇáÝÞÑÉ ÃíÖÇð";
        Text[ greek ] = "Íá óõìðåñéëçöèïýí ïé ãñáììÝò áõôÞò ôçò ðáñáãñÜöïõ";
        Text[ korean ] = "´Ü¶ô¿¡ ¼± ¹øÈ£ ¸Å±â±âÆ÷ÇÔ(~I)";
        Text[ turkish ] = "Bu paragrafýn da satýrlarýný numarala";
        Text[ language_user1 ] = " ";
    };
    TriStateBox CB_RESTART_PARACOUNT
    {
        Pos = MAP_APPFONT ( 12 , 101 ) ;
        Size = MAP_APPFONT ( 160 , 10 ) ;
        Text = "An diese~m Absatz neu beginnen" ;
        Text [ English ] = "~Restart at this paragraph" ;
        TabStop = TRUE ;
        Text [ portuguese ] = "~Recomeçar neste parágrafo" ;
        Text [ english_us ] = "Rest~art at this paragraph" ;
        Text [ portuguese_brazilian ] = "~An diesem Absatz neu beginnen" ;
        Text [ swedish ] = "Börj~a om vid detta stycke" ;
        Text [ danish ] = "Begynd nyt ved dette afsnit" ;
        Text [ italian ] = "~Ricomincia con questo paragrafo" ;
        Text [ spanish ] = "Volver a empe~zar en este párrafo" ;
        Text [ french ] = "~Recommencer avec ce paragraphe" ;
        Text [ dutch ] = "~Bij deze alinea opnieuw beginnen" ;
        Text[ chinese_simplified ] = "ÔÚÕâ¸ö¶ÎÂä´¦ÖØÐ¿ªÊ¼(~A)";
        Text[ russian ] = "Íà÷àòü ñ ýòîãî àáçàöà";
        Text[ polish ] = "Zacznij p~onownie przy tym akapicie";
        Text[ japanese ] = "‚±‚Ì’i—ނŐV‚µ‚­Žn‚ß‚é(~R)";
        Text[ chinese_traditional ] = "±q³o­Ó¬q¸¨­«·s¶}©l(~R)";
        Text[ arabic ] = "ÇáÈÏÁ ãä ÌÏíÏ ÚäÏ åÐå ÇáÝÞÑÉ";
        Text[ greek ] = "Åðáíåêêßíçóç áðü áõôÞ ôçí ðáñÜãñáöï";
        Text[ korean ] = "ÀÌ ´Ü¶ô¿¡¼­ ´Ù½Ã ½ÃÀÛ(~A)";
        Text[ turkish ] = "Bu paragraf ile yeniden baþla";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_RESTART_NO
    {
        Pos = MAP_APPFONT ( 12 , 113 ) ;
        Size = MAP_APPFONT ( 50 , 10 ) ;
        Text = "B~eginnen mit:" ;
        Text [ English ] = "~Start at:" ;
        Disable = TRUE ;
        Text [ portuguese ] = "~Começar com:" ;
        Text [ english_us ] = "~Start with:" ;
        Text [ portuguese_brazilian ] = "~Beginnen mit:" ;
        Text [ swedish ] = "~Börja med:" ;
        Text [ danish ] = "Begynd med:" ;
        Text [ italian ] = "~Inizia con..." ;
        Text [ spanish ] = "Empezar ~con:" ;
        Text [ french ] = "~Commencer avec :" ;
        Text [ dutch ] = "~Beginnen met:" ;
        Text[ chinese_simplified ] = "¿ªÊ¼´Ó(~S)£º";
        Text[ russian ] = "Íà÷àòü ñ:";
        Text[ polish ] = "Zacznij od:";
        Text[ japanese ] = "ŠJŽn”ԍ†(~S):";
        Text[ chinese_traditional ] = "¶}©l±q(~S)¡G";
        Text[ arabic ] = "ÇáÈÏÁ ÈÜ:";
        Text[ greek ] = "¸íáñîç ì~å:";
        Text[ korean ] = "¿Í ÇÔ²² ½ÃÀÛ:(~S)";
        Text[ turkish ] = "~Baþlangýç deðeri:";
        Text[ language_user1 ] = " ";
    };
    NumericField NF_RESTART_PARA
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 144 , 113 ) ;
        Size = MAP_APPFONT ( 26 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 1 ;
        Maximum = 65000 ;
        Value = 1 ;
        First = 1 ;
        Last = 65000 ;
        Disable = TRUE ;
    };
};
 // ********************************************************************** EOF
diff --git a/sw/source/ui/chrdlg/paradlg.hrc b/sw/source/ui/chrdlg/paradlg.hrc
new file mode 100644
index 0000000..b5736eb
--- /dev/null
+++ b/sw/source/ui/chrdlg/paradlg.hrc
@@ -0,0 +1,105 @@
/*************************************************************************
 *
 *  $RCSfile: paradlg.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:32 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#define TAB_CONTROL 55
#define INDENT_FRM 1
#define LEFT_LABEL 2
#define FLINE_LABEL 3
#define RIGHT_LABEL 4
#define LEFT_INDENT 5
#define FLINE_INDENT 6
#define RIGHT_INDENT 7
#define DIST_FRM 8
#define TOP_LABEL 9
#define TOP_DIST 10
#define BOTTOM_LABEL 11
#define BOTTOM_DIST 12
#define ALG_LEFT 13
#define ALG_RIGHT 50
#define ALG_CENTER 51
#define ALG_JUSTIFY 52
#define ALG_FRM 14
#define LINEDIST_FRM 15
#define LINEDIST_BOX 16
#define LINEDIST_AT_LABEL 17
#define LINEDIST_AT_PERCENTBOX 18
#define LINEDIST_AT_METRICBOX 19
#define HYPHEN_FRM 21
#define HYPHEN_BOX_AFTER 44
#define HYPHEN_BOX_BEFORE 22
#define EXTHYPHEN_BOX_AFTER 42
#define EXTHYPHEN_BOX_BEFORE 23
#define HYPHEN_LABEL_AFTER 43
#define HYPHEN_LABEL_BEFORE 24
#define EXTEND_FRM 25
#define PAGEBREAK_BOX 26
#define PAGEBREAK_DAVOR 27
#define PAGEBREAK_DAHINTER 28
#define KEEP_TOGETHER_BOX 29
#define WIDOW_BOX 31
#define WIDOW_ROW_NO 32
#define WIDOW_ROW_LABEL 33
#define ORPHAN_BOX 34
#define ORPHAN_ROW_NO 35
#define ORPHAN_ROW_LABEL 36
#define PAGE_COLL_BTN 40
#define PAGE_COLL_BOX 41
#define OK_BTN 50
#define CANCEL_BTN 51
diff --git a/sw/source/ui/chrdlg/paradlg.src b/sw/source/ui/chrdlg/paradlg.src
new file mode 100644
index 0000000..b71302d9
--- /dev/null
+++ b/sw/source/ui/chrdlg/paradlg.src
@@ -0,0 +1,446 @@
/*************************************************************************
 *
 *  $RCSfile: paradlg.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:32 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "globals.hrc"
#include "chrdlg.hrc"
#include "paradlg.hrc"
#define HelpText "error - hier keine HelpTexte HelpText"
 // #define DLG_PARA 256
TabDialog DLG_PARA
{
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Text = "Absatz" ;
    Text [ ENGLISH ] = "Paragraph" ;
    Text [ norwegian ] = "Avsnitt" ;
    Text [ italian ] = "Paragrafo" ;
    Text [ portuguese_brazilian ] = "Parágrafo" ;
    Text [ portuguese ] = "Parágrafo" ;
    Text [ finnish ] = "Kappale" ;
    Text [ danish ] = "Afsnit" ;
    Text [ french ] = "Paragraphe" ;
    Text [ swedish ] = "Stycke" ;
    Text [ dutch ] = "Alinea" ;
    Text [ spanish ] = "Párrafo" ;
    Text [ english_us ] = "Paragraph" ;
    Moveable = TRUE ;
    TabControl 1
    {
        OutputSize = TRUE ;
        PageList =
        {
            PageItem
            {
                Identifier = TP_PARA_STD ;
                /* ### ACHTUNG: Neuer Text in Resource? Einzüge und Abstände : Einz³ge und Abstõnde */
                Text = "Einzüge und Abstände" ;
                Text [ ENGLISH ] = "Paragraph" ;
                Text [ norwegian ] = "Avsnitt" ;
                Text [ italian ] = "Paragrafo" ;
                Text [ portuguese_brazilian ] = "Parágrafo" ;
                Text [ portuguese ] = "Avanços e espaçamento" ;
                Text [ finnish ] = "Kappale" ;
                Text [ danish ] = "Indrykning og mellemrum" ;
                Text [ french ] = "Retraits et écarts" ;
                Text [ swedish ] = "Indrag och avstånd" ;
                Text [ dutch ] = "Inspringen en afstanden" ;
                Text [ spanish ] = "Sangrías y espacios" ;
                Text [ english_us ] = "Indents & Spacing" ;
                PageResID = TP_PARA_STD ;
                Text[ chinese_simplified ] = "Ëõ½øºÍ¼ä¸ô";
                Text[ russian ] = "Îòñòóïû è èíòåðâàëû";
                Text[ polish ] = "Wciêcia i odstêpy";
                Text[ japanese ] = "²ÝÃÞÝĂƍsŠÔŠu";
                Text[ chinese_traditional ] = "ÁY±Æ©M¶¡¹j";
                Text[ arabic ] = "ÇáÅÒÇÍÉ æÇáÊÈÇÚÏ";
                Text[ greek ] = "Åóï÷Ýò êáé áðïóôÜóåéò";
                Text[ korean ] = "µé¿©¾²±â¿Í °£°Ý";
                Text[ turkish ] = "Girinti ve aralýklar";
                Text[ language_user1 ] = " ";
            };
#if SUPD>352
            PageItem
            {
                Identifier = TP_PARA_ALIGN ;
                Text = "Ausrichtung" ;
                Text [ ENGLISH ] = "Alignment" ;
                PageResID = TP_PARA_ALIGN ;
                Text [ english_us ] = "Alignment" ;
                Text [ portuguese_brazilian ] = "Ausrichtung" ;
                Text [ swedish ] = "Justering" ;
                Text [ danish ] = "Justering" ;
                Text [ italian ] = "Allineamento" ;
                Text [ spanish ] = "Alineación" ;
                Text [ french ] = "Alignement" ;
                Text [ dutch ] = "Uitlijning" ;
                Text [ portuguese ] = "Alinhamento" ;
                Text[ chinese_simplified ] = "¶ÔÆë";
                Text[ russian ] = "Âûðàâíèâàíèå";
                Text[ polish ] = "Wyrównanie";
                Text[ japanese ] = "”z’u";
                Text[ chinese_traditional ] = "¹ï»ô";
                Text[ arabic ] = "ÇáãÍÇÐÇÉ";
                Text[ greek ] = "Óôïß÷éóç";
                Text[ korean ] = "¸ÂÃã";
                Text[ turkish ] = "Hizalama";
                Text[ language_user1 ] = " ";
            };
#endif
            PageItem
            {
                Identifier = TP_PARA_EXT ;
                /* ### ACHTUNG: Neuer Text in Resource? Textfluß : Textflu˜ */
                Text = "Textfluss" ;
                Text [ ENGLISH ] = "Paragraph Extensions" ;
                Text [ norwegian ] = "Utvidelse av avsnitt" ;
                Text [ italian ] = "Flusso di testo" ;
                Text [ portuguese_brazilian ] = "Extens es de Parágrafo" ;
                Text [ portuguese ] = "Fluxo de texto" ;
                Text [ finnish ] = "Tekstin rivitys" ;
                Text [ danish ] = "Tekstretning" ;
                Text [ french ] = "Enchaînements" ;
                Text [ swedish ] = "Textflöde" ;
                Text [ dutch ] = "Tekstverloop" ;
                Text [ spanish ] = "Flujo del texto" ;
                Text [ english_us ] = "Text Flow" ;
                PageResID = TP_PARA_EXT ;
                Text[ chinese_simplified ] = "»»ÐкͷÖÒ³";
                Text[ russian ] = "Ïîëîæåíèå íà ñòðàíèöå";
                Text[ polish ] = "Tekst";
                Text[ japanese ] = "‘̍Ù";
                Text[ chinese_traditional ] = "´«¦æ©M¤À­¶";
                Text[ arabic ] = "ÇäÓíÇÈ ÇáäÕ";
                Text[ language_user1 ] = " ";
                Text[ greek ] = "ÑïÞ êåéìÝíïõ";
                Text[ korean ] = "ÅØ½ºÆ® È帧";
                Text[ turkish ] = "Metin akýþý";
            };
            PageItem
            {
                Identifier = TP_NUMPARA ;
                Text = "Nummerierung" ;
                Text [ ENGLISH ] = "Numbering" ;
                Text [ english_us ] = "Numbering" ;
                Text [ portuguese_brazilian ] = "Numerierung" ;
                Text [ swedish ] = "Numrering" ;
                Text [ danish ] = "Nummerering" ;
                Text [ italian ] = "Numerazione" ;
                Text [ spanish ] = "Numeración" ;
                Text [ french ] = "Numérotation" ;
                Text [ dutch ] = "Nummering" ;
                Text [ portuguese ] = "Numeração" ;
                Text[ chinese_simplified ] = "񅧏";
                Text[ russian ] = "Íóìåðàöèÿ";
                Text[ polish ] = "Numeracja";
                Text[ japanese ] = "”ԍ†•t‚¯";
                Text[ chinese_traditional ] = "½s¸¹";
                Text[ arabic ] = "ÇáÊÑÞíã";
                Text[ greek ] = "Áñßèìçóç";
                Text[ korean ] = "¹øÈ£ ¸Å±â±â";
                Text[ turkish ] = "Numaralama";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_TABULATOR ;
                Text = "Tabulator" ;
                Text [ ENGLISH ] = "Tab" ;
                Text [ norwegian ] = "Tab" ;
                Text [ italian ] = "Tabulazione" ;
                Text [ portuguese_brazilian ] = "Tabulação" ;
                Text [ portuguese ] = "Tabulação" ;
                Text [ finnish ] = "Sarkain" ;
                Text [ danish ] = "Tabulator" ;
                Text [ french ] = "Tabulation" ;
                Text [ swedish ] = "Tabulator" ;
                Text [ dutch ] = "Tab" ;
                Text [ spanish ] = "Tabulaciones" ;
                Text [ english_us ] = "Tabs" ;
                PageResID = TP_TABULATOR ;
                Text[ chinese_simplified ] = "ÖÆ±í·û";
                Text[ russian ] = "Òàáóëÿöèÿ";
                Text[ polish ] = "Tabulator";
                Text[ japanese ] = "ÀÌÞ";
                Text[ chinese_traditional ] = "»sªí²Å";
                Text[ arabic ] = "ÚáÇãÉ ÌÏæáÉ";
                Text[ greek ] = "ÓôçëïèÝôçò";
                Text[ korean ] = "ÅÇ";
                Text[ turkish ] = "Sekmeler";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_DROPCAPS ;
                Text = "Initialen" ;
                Text [ ENGLISH ] = "Drop caps" ;
                Text [ norwegian ] = "Drop caps" ;
                Text [ italian ] = "Capolettera" ;
                Text [ portuguese_brazilian ] = "Capitulares descidas" ;
                Text [ portuguese ] = "Iniciais" ;
                Text [ finnish ] = "Anfangit" ;
                Text [ danish ] = "Initialer" ;
                Text [ french ] = "Lettrines" ;
                Text [ swedish ] = "Anfangsbokstäver" ;
                Text [ dutch ] = "Initialen" ;
                Text [ spanish ] = "Iniciales" ;
                Text [ english_us ] = "Drop Caps" ;
                PageResID = TP_DROPCAPS ;
                Text[ chinese_simplified ] = "×ÖÊ×´óд";
                Text[ russian ] = "Èíèöèàëû";
                Text[ polish ] = "Inicja³y";
                Text[ japanese ] = "ÄÞÛ¯Ìß·¬¯Ìß";
                Text[ chinese_traditional ] = "¦r­º¤j¼g";
                Text[ arabic ] = "ÇáÃÍÑÝ ÇáÇÓÊåáÇáíÉ";
                Text[ greek ] = "Áñ÷éãñÜììáôá";
                Text[ korean ] = "´Ü¶ô ù¹®ÀÚ Àå½Ä";
                Text[ turkish ] = "Baþharfler";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_BORDER ;
                Text = "Umrandung" ;
                Text [ ENGLISH ] = "Border" ;
                Text [ norwegian ] = "Border" ;
                Text [ italian ] = "Bordo" ;
                Text [ portuguese_brazilian ] = "Borda" ;
                Text [ portuguese ] = "Contornos" ;
                Text [ finnish ] = "Reunaviiva" ;
                Text [ danish ] = "Ramme" ;
                Text [ french ] = "Bordure" ;
                Text [ swedish ] = "Inramning" ;
                Text [ dutch ] = "Omranding" ;
                Text [ spanish ] = "Borde" ;
                Text [ english_us ] = "Borders" ;
                PageResID = TP_BORDER ;
                Text[ chinese_simplified ] = "±ß¿ò";
                Text[ russian ] = "Îáðàìëåíèå";
                Text[ polish ] = "Obramowanie";
                Text[ japanese ] = "ŠO˜g";
                Text[ chinese_traditional ] = "Ã䮨";
                Text[ arabic ] = "ÇáÍÏæÏ";
                Text[ greek ] = "Ðåñßãñáììá";
                Text[ korean ] = "°æ°è¼±";
                Text[ turkish ] = "Kenarlýk";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_BACKGROUND ;
                Text = "Hintergrund" ;
                Text [ ENGLISH ] = "Background" ;
                Text [ norwegian ] = "Background" ;
                Text [ italian ] = "Sfondo" ;
                Text [ portuguese_brazilian ] = "Fundo" ;
                Text [ portuguese ] = "Plano de fundo" ;
                Text [ finnish ] = "Tausta" ;
                Text [ danish ] = "Baggrund" ;
                Text [ french ] = "Arrière-plan" ;
                Text [ swedish ] = "Bakgrund" ;
                Text [ dutch ] = "Achtergrond" ;
                Text [ spanish ] = "Fondo" ;
                Text [ english_us ] = "Background" ;
                PageResID = TP_BACKGROUND ;
                Text[ chinese_simplified ] = "±³¾°";
                Text[ russian ] = "Ôîí";
                Text[ polish ] = "T³o";
                Text[ japanese ] = "”wŒi";
                Text[ chinese_traditional ] = "­I´º";
                Text[ arabic ] = "ÇáÎáÝíÉ";
                Text[ greek ] = "Öüíôï";
                Text[ korean ] = "¹è°æ";
                Text[ turkish ] = "Artalan";
                Text[ language_user1 ] = " ";
            };
        };
    };
    Text[ chinese_simplified ] = "¶ÎÂä";
    Text[ russian ] = "Àáçàö";
    Text[ polish ] = "Akapit";
    Text[ japanese ] = "’i—Ž";
    Text[ chinese_traditional ] = "¬q¸¨";
    Text[ arabic ] = "ÝÞÑÉ";
    Text[ greek ] = "ÐáñÜãñáöïò";
    Text[ korean ] = "´Ü¶ô";
    Text[ turkish ] = "Paragraf";
    Text[ language_user1 ] = " ";
};
TabDialog DLG_DRAWPARA
{
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Text = "Absatz" ;
    Text [ ENGLISH ] = "Paragraph" ;
    Text [ norwegian ] = "Avsnitt" ;
    Text [ italian ] = "Paragrafo" ;
    Text [ portuguese_brazilian ] = "Parágrafo" ;
    Text [ portuguese ] = "Parágrafo" ;
    Text [ finnish ] = "Kappale" ;
    Text [ danish ] = "Afsnit" ;
    Text [ french ] = "Paragraphe" ;
    Text [ swedish ] = "Stycke" ;
    Text [ dutch ] = "Alinea" ;
    Text [ spanish ] = "Párrafo" ;
    Text [ english_us ] = "Paragraph" ;
    Moveable = TRUE ;
    TabControl 1
    {
        OutputSize = TRUE ;
        PageList =
        {
            PageItem
            {
                Identifier = TP_PARA_STD ;
                /* ### ACHTUNG: Neuer Text in Resource? Einzüge und Abstände : Einz³ge und Abstõnde */
                Text = "Einzüge und Abstände" ;
                Text [ ENGLISH ] = "Paragraph" ;
                Text [ norwegian ] = "Avsnitt" ;
                Text [ italian ] = "Rientri e spaziature" ;
                Text [ portuguese_brazilian ] = "Parágrafo" ;
                Text [ portuguese ] = "Avanços e espaçamento" ;
                Text [ finnish ] = "Kappale" ;
                Text [ danish ] = "Indrykning og mellemrum" ;
                Text [ french ] = "Retraits et écarts" ;
                Text [ swedish ] = "Indrag och avstånd" ;
                Text [ dutch ] = "Inspringingen en afstanden" ;
                Text [ spanish ] = "Sangrías y espacios" ;
                Text [ english_us ] = "Indents & Spacing" ;
                PageResID = TP_PARA_STD ;
                Text[ chinese_simplified ] = "Ëõ½øºÍ¼ä¸ô";
                Text[ russian ] = "Îòñòóïû è èíòåðâàëû";
                Text[ polish ] = "Wciêcia i odstêpy";
                Text[ japanese ] = "²ÝÃÞÝĂƍsŠÔŠu";
                Text[ chinese_traditional ] = "ÁY±Æ©M¶¡¹j";
                Text[ arabic ] = "ÇáÅÒÇÍÉ æÇáÊÈÇÚÏ";
                Text[ language_user1 ] = " ";
                Text[ greek ] = "Åóï÷Ýò êáé áðïóôÜóåéò";
                Text[ korean ] = "µé¿©¾²±â¿Í °£°Ý";
                Text[ turkish ] = "Girinti ve aralýklar";
            };
#if SUPD>352
            PageItem
            {
                Identifier = TP_PARA_ALIGN ;
                Text = "Ausrichtung" ;
                Text [ ENGLISH ] = "Alignment" ;
                PageResID = TP_PARA_ALIGN ;
                Text [ english_us ] = "Alignment" ;
                Text [ portuguese_brazilian ] = "Ausrichtung" ;
                Text [ swedish ] = "Justering" ;
                Text [ danish ] = "Justering" ;
                Text [ italian ] = "Allineamento" ;
                Text [ spanish ] = "Alineación" ;
                Text [ french ] = "Alignement" ;
                Text [ dutch ] = "Uitlijning" ;
                Text [ portuguese ] = "Alinhamento" ;
                Text[ chinese_simplified ] = "¶ÔÆë";
                Text[ russian ] = "Âûðàâíèâàíèå";
                Text[ polish ] = "Wyrównanie";
                Text[ japanese ] = "”z’u";
                Text[ chinese_traditional ] = "¹ï»ô";
                Text[ arabic ] = "ÇáãÍÇÐÇÉ";
                Text[ greek ] = "Óôïß÷éóç";
                Text[ korean ] = "¸ÂÃã";
                Text[ turkish ] = "Hizalama";
                Text[ language_user1 ] = " ";
            };
#endif
            PageItem
            {
                Identifier = TP_TABULATOR ;
                Text = "Tabulator" ;
                Text [ ENGLISH ] = "Tab" ;
                Text [ norwegian ] = "Tab" ;
                Text [ italian ] = "Tabulazione" ;
                Text [ portuguese_brazilian ] = "Tabulação" ;
                Text [ portuguese ] = "Tabulação" ;
                Text [ finnish ] = "Sarkain" ;
                Text [ danish ] = "Tabulator" ;
                Text [ french ] = "Tabulation" ;
                Text [ swedish ] = "Tabulator" ;
                Text [ dutch ] = "Tab" ;
                Text [ spanish ] = "Tabulaciones" ;
                Text [ english_us ] = "Tabs" ;
                PageResID = TP_TABULATOR ;
                Text[ chinese_simplified ] = "ÖÆ±í·û";
                Text[ russian ] = "Òàáóëÿöèÿ";
                Text[ polish ] = "Tabulator";
                Text[ japanese ] = "ÀÌÞ";
                Text[ chinese_traditional ] = "»sªí²Å";
                Text[ arabic ] = "ÚáÇãÉ ÌÏæáÉ";
                Text[ greek ] = "ÓôçëïèÝôçò";
                Text[ korean ] = "ÅÇ";
                Text[ turkish ] = "Sekmeler";
                Text[ language_user1 ] = " ";
            };
        };
    };
    Text[ chinese_simplified ] = "¶ÎÂä";
    Text[ russian ] = "Àáçàö";
    Text[ polish ] = "Akapit";
    Text[ japanese ] = "’i—Ž";
    Text[ chinese_traditional ] = "¬q¸¨";
    Text[ arabic ] = "ÝÞÑÉ";
    Text[ greek ] = "ÐáñÜãñáöïò";
    Text[ korean ] = "´Ü¶ô";
    Text[ turkish ] = "Paragraf";
    Text[ language_user1 ] = " ";
};
diff --git a/sw/source/ui/chrdlg/pardlg.cxx b/sw/source/ui/chrdlg/pardlg.cxx
new file mode 100644
index 0000000..6830eb5
--- /dev/null
+++ b/sw/source/ui/chrdlg/pardlg.cxx
@@ -0,0 +1,505 @@
/*************************************************************************
 *
 *  $RCSfile: pardlg.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:32 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "hintids.hxx"

#ifndef _SVX_TABSTPGE_HXX //autogen
#include <svx/tabstpge.hxx>
#endif
#ifndef _SVX_PARAGRPH_HXX //autogen
#include <svx/paragrph.hxx>
#endif
#ifndef _SVX_BACKGRND_HXX
#include <svx/backgrnd.hxx>
#endif
#ifndef _SVX_BORDER_HXX
#include <svx/border.hxx>
#endif
#ifndef _SVX_HTMLMODE_HXX
#include <svx/htmlmode.hxx>
#endif
#ifndef _SFXSTYLE_HXX //autogen
#include <svtools/style.hxx>
#endif
#ifndef _OFA_HTMLCFG_HXX //autogen
#include <offmgr/htmlcfg.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif

#ifndef _SVSTDARR_STRINGSISORTDTOR
#define _SVSTDARR_STRINGSISORTDTOR
#include <svtools/svstdarr.hxx>
#endif

#include "docsh.hxx"
#include "wrtsh.hxx"
#include "frmatr.hxx"
#include "view.hxx"
#include "globals.hrc"
#include "pardlg.hxx"
#include "pagedesc.hxx"
#include "paratr.hxx"
#include "drpcps.hxx"
#include "uitool.hxx"
#include "viewopt.hxx"

#ifndef _NUMPARA_HXX
#include <numpara.hxx>
#endif
#include "chrdlg.hrc"
#include "poolfmt.hrc"


// STATIC DATA -----------------------------------------------------------


SwParaDlg::SwParaDlg(Window *pParent,
                    SwView& rVw,
                    const SfxItemSet& rCoreSet,
                    BYTE nDialogMode,
                    const String *pTitle,
                    BOOL bDraw,
                    UINT16 nDefPage):

    SfxTabDialog(pParent, bDraw ? SW_RES(DLG_DRAWPARA) : SW_RES(DLG_PARA),
                    &rCoreSet,  0 != pTitle),

    rView(rVw),
    nDlgMode(nDialogMode),
    bDrawParaDlg(bDraw)

{
    FreeResource();

    nHtmlMode = ::GetHtmlMode(rVw.GetDocShell());
    BOOL bHtmlMode = nHtmlMode & HTMLMODE_ON;
    if(pTitle)
    {
            // Update des Titels
        String aTmp( GetText() );
        aTmp += SW_RESSTR(STR_TEXTCOLL_HEADER);
        aTmp += *pTitle;
        aTmp += ')';
        SetText(aTmp);
    }

    AddTabPage(TP_PARA_STD,  SvxStdParagraphTabPage::Create,SvxStdParagraphTabPage::GetRanges);
    AddTabPage(TP_PARA_ALIGN,  SvxParaAlignTabPage::Create,SvxParaAlignTabPage::GetRanges);

    OfaHtmlOptions* pHtmlOpt = OFF_APP()->GetHtmlOptions();
    if (!bDrawParaDlg && (!bHtmlMode || pHtmlOpt->IsPrintLayoutExtension()))
        AddTabPage(TP_PARA_EXT,  SvxExtParagraphTabPage::Create,SvxExtParagraphTabPage::GetRanges);
    else
        RemoveTabPage(TP_PARA_EXT);

    USHORT nWhich(rCoreSet.GetPool()->GetWhich(SID_ATTR_LRSPACE));
    BOOL bLRValid = SFX_ITEM_AVAILABLE <= rCoreSet.GetItemState(nWhich);
    if(bHtmlMode || !bLRValid)
        RemoveTabPage(TP_TABULATOR);
    else
        AddTabPage(TP_TABULATOR, SvxTabulatorTabPage::Create,   SvxTabulatorTabPage::GetRanges);

    if (!bDrawParaDlg)
    {
        if(!(nDlgMode & DLG_ENVELOP))
            AddTabPage(TP_NUMPARA,   SwParagraphNumTabPage::Create,SwParagraphNumTabPage::GetRanges);
        else
            RemoveTabPage(TP_NUMPARA);
        if(!bHtmlMode || (nHtmlMode & HTMLMODE_FULL_STYLES))
        {
            AddTabPage(TP_DROPCAPS,  SwDropCapsPage::Create,        SwDropCapsPage::GetRanges);
            AddTabPage(TP_BACKGROUND,SvxBackgroundTabPage::Create,  SvxBackgroundTabPage::GetRanges);
        }
        else
        {
            RemoveTabPage(TP_DROPCAPS);
            RemoveTabPage(TP_BACKGROUND);
        }
        if(!bHtmlMode || (nHtmlMode & HTMLMODE_PARA_BORDER))
            AddTabPage(TP_BORDER,    SvxBorderTabPage::Create,      SvxBorderTabPage::GetRanges);
        else
            RemoveTabPage(TP_BORDER);
    }

    if (nDefPage)
        SetCurPageId(nDefPage);
}


__EXPORT SwParaDlg::~SwParaDlg()
{
}


void __EXPORT SwParaDlg::PageCreated(USHORT nId, SfxTabPage& rPage)
{
    SwWrtShell& rSh = rView.GetWrtShell();

    // Bei Tabellenumrandung kann im Writer kein Schatten eingestellt werden
    if (nId == TP_BORDER)
    {
        ((SvxBorderTabPage&) rPage).SetSWMode(SW_BORDER_MODE_PARA);
    }
    else if( nId == TP_PARA_STD )
    {
        ((SvxStdParagraphTabPage&)rPage).SetPageWidth(
                                            rSh.GetAnyCurRect(RECT_PAGE_PRT).Width());
        if (!bDrawParaDlg)
        {
            ((SvxStdParagraphTabPage&)rPage).EnableRegisterMode();
            ((SvxStdParagraphTabPage&)rPage).EnableAutoFirstLine();
            ((SvxStdParagraphTabPage&)rPage).EnableAbsLineDist(MM50/2);
            ((SvxStdParagraphTabPage&)rPage).EnableNegativeMode();
        }
    }
    else if( TP_PARA_ALIGN == nId)
    {
        if (!bDrawParaDlg)
            ((SvxParaAlignTabPage&)rPage).EnableJustifyExt();
    }
    else if( TP_PARA_EXT == nId )
    {
        // Seitenumbruch nur, wenn der Cursor im Body-Bereich und nicht in
        // einer Tabelle steht
        const USHORT eType = rSh.GetFrmType(0,TRUE);
        if( !(FRMTYPE_BODY & eType) ||
            rSh.GetSelectionType() & SwWrtShell::SEL_TBL )
            ((SvxExtParagraphTabPage&)rPage).DisablePageBreak();
    }
    else if( TP_DROPCAPS == nId )
    {
        ((SwDropCapsPage&)rPage).SetFormat(FALSE);
    }
    else if( TP_BACKGROUND == nId )
    {
      if(!( nHtmlMode & HTMLMODE_ON ) ||
        nHtmlMode & HTMLMODE_SOME_STYLES)
            ((SvxBackgroundTabPage&)rPage).ShowSelector();
    }
    else if( TP_NUMPARA == nId)
    {
        ((SwParagraphNumTabPage&)rPage).EnableNewStart();
        ListBox & rBox = ((SwParagraphNumTabPage&)rPage).GetStyleBox();
        SfxStyleSheetBasePool* pPool = rView.GetDocShell()->GetStyleSheetPool();
        pPool->SetSearchMask(SFX_STYLE_FAMILY_PSEUDO, SFXSTYLEBIT_ALL);
        const SfxStyleSheetBase* pBase = pPool->First();
        SvStringsISortDtor aNames;
        while(pBase)
        {
            aNames.Insert(new String(pBase->GetName()));
            pBase = pPool->Next();
        }
        for(USHORT i = 0; i < aNames.Count(); i++)
            rBox.InsertEntry(*aNames.GetObject(i));
    }

}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.195  2000/09/18 16:05:14  willem.vandorp
    OpenOffice header added.

    Revision 1.194  2000/08/24 08:44:19  ama
    New: Negative margins

    Revision 1.193  1999/05/19 07:59:54  OS
    #66015# Absatzausrichtung: Erweiterungen nicht fuer Draw-Text


      Rev 1.192   19 May 1999 09:59:54   OS
   #66015# Absatzausrichtung: Erweiterungen nicht fuer Draw-Text

      Rev 1.191   27 Nov 1998 14:51:26   AMA
   Fix #59951#59825#: Unterscheiden zwischen Rahmen-,Seiten- und Bereichsspalten

      Rev 1.190   28 Apr 1998 09:08:54   OS
   Background: ShowSelector mit HTML-Beruecksichtigung #49862#

      Rev 1.189   21 Apr 1998 15:33:44   OS
   zwei ! an der falschen Stelle

      Rev 1.188   16 Apr 1998 16:00:10   OS
   Ranges der TabPages mitgeben #47097# Printing extensions fuer HTML

      Rev 1.187   05 Feb 1998 14:45:16   OS
   Remove-/AddTabPage alternativ, TableMode entsorgt, keine Numerierung fuer Umschlaege

      Rev 1.186   02 Feb 1998 09:13:32   OS
   neue Num-Tabpage

      Rev 1.185   09 Dec 1997 16:46:28   OS
   Numerierungsvorlagen sortieren

      Rev 1.184   04 Dec 1997 16:59:12   OS
   Numerierung im Absatzdialog

      Rev 1.183   28 Nov 1997 15:03:02   MA
   includes

      Rev 1.182   21 Nov 1997 12:24:36   MA
   includes

      Rev 1.181   02 Sep 1997 10:46:12   OS
   includes

      Rev 1.180   29 Aug 1997 17:30:02   HJS
   includes

      Rev 1.179   03 Jul 1997 12:55:34   OS
   SwSwMode jetzt mit BYTE #41255#

      Rev 1.178   11 Jun 1997 16:19:54   OS
   absolute Zeilenhoehe aktiviert

      Rev 1.177   10 Feb 1997 13:22:58   OS
   Absatz HG nur fuer FULL_STYLES

      Rev 1.176   05 Feb 1997 16:20:56   OS
   kein Hintergrund ohne Styles

      Rev 1.175   05 Feb 1997 13:32:12   OS
   im SW sind DropCaps auch fuer HTML erlaubt

      Rev 1.174   28 Jan 1997 16:32:54   OS
   alte defines entfernt

      Rev 1.173   27 Jan 1997 16:15:18   OS
   HtmlMode wird ueber GetHtmlMode ermittelt

      Rev 1.172   17 Jan 1997 12:56:34   OS
   neue Absatz-Tabpage ab 353: Ausrichtung

      Rev 1.171   16 Jan 1997 18:14:12   OM
   Tabulator-TP fuer DrawTextMode wiederbelebt

      Rev 1.170   08 Jan 1997 10:54:24   OS
   HtmlMode ueber GetHtmlMode ermitteln

      Rev 1.169   28 Nov 1996 14:57:32   OS
   keine Tabulatorpage mit uneindeutigen Absatzeinzuegen

      Rev 1.168   11 Nov 1996 09:16:40   MA
   ResMgr

      Rev 1.167   14 Oct 1996 17:43:56   HJS
   include

      Rev 1.166   14 Oct 1996 12:51:16   OS
   einige TabPages im Html-Mode verstecken

      Rev 1.165   12 Sep 1996 17:03:06   OS
   GetAnyCurRect() ersetzt GetCur*Rect

      Rev 1.164   28 Aug 1996 08:59:08   OS
   includes

      Rev 1.163   09 Aug 1996 11:38:06   OM
   #30084#GPF behoben

      Rev 1.162   23 Jul 1996 16:08:18   OS
   EnableRegisterMode am Absatzdialog setzen

      Rev 1.161   24 May 1996 14:31:50   OS
   Hintergrundgrafik enabled

      Rev 1.160   05 Feb 1996 17:27:14   OM
   #24879# Parent-Win in Ctor uebergeben

      Rev 1.159   28 Nov 1995 23:37:14   JP
   uisys.hxx gibt es nicht mehr

      Rev 1.158   24 Nov 1995 16:57:34   OM
   PCH->PRECOMPILED

      Rev 1.157   23 Nov 1995 17:57:00   OM
   Default-TabPage setzen

      Rev 1.156   09 Nov 1995 17:56:38   OS
   Format-Bit an der Initialen-Page FALSE setzen

      Rev 1.155   03 Nov 1995 20:17:10   MA
   GetUpper..Rect returne keine Objecte mehr

      Rev 1.154   31 Oct 1995 18:36:08   OM
   GetActive... entfernt

      Rev 1.153   07 Aug 1995 13:42:30   JP
   Breaks nur im Body-Bereich zulassen

      Rev 1.152   06 Aug 1995 18:26:46   OM
   DrawTextShell-Popup

      Rev 1.151   14 Jul 1995 17:47:04   OS
   Seitenbreite an der StdParagraphTabPage setzen

      Rev 1.150   07 Jul 1995 10:46:52   OS
   Seitenvorlagen werden jetzt vom Svx besorgt

      Rev 1.149   25 Apr 1995 17:21:52   OS
   PageModels fuellen BugFix 11100/11105

      Rev 1.148   30 Mar 1995 18:38:18   PK
   caption fuer absatzvorlagen

      Rev 1.147   29 Mar 1995 09:12:22   OS
   TabDialog - weniger Parameter

      Rev 1.146   01 Feb 1995 17:45:44   PK
   hideshadowcontrol()

      Rev 1.145   27 Jan 1995 06:59:44   MS
   HideShadowControls auskommentiert

      Rev 1.144   26 Jan 1995 17:36:26   PK
   hideshadowcontrols() scharfgeschaltet

      Rev 1.143   26 Jan 1995 17:00:34   PK
   pagecreated() ueberladen

      Rev 1.142   24 Jan 1995 12:51:14   SWG
   Map entfernt

      Rev 1.141   09 Jan 1995 16:31:52   ER
    del: paradlg hrc

      Rev 1.140   07 Dec 1994 09:44:04   MS
   Fix 122c

      Rev 1.139   06 Dec 1994 16:30:04   MS
   Einbau allgemeiner AbsatzDlg

      Rev 1.138   05 Dec 1994 16:54:16   MS
   Anpassung Tabdlg

      Rev 1.137   01 Dec 1994 16:49:58   MS
   GetActiveView

      Rev 1.136   01 Dec 1994 16:14:02   MS
   Id Tabpages in globals.hrc

      Rev 1.135   18 Nov 1994 15:31:58   MA
   min -> Min, max -> Max

      Rev 1.134   15 Nov 1994 09:02:36   SWG
   SetLineSpace static deklariert

      Rev 1.133   02 Nov 1994 11:25:38   AMA
   Reimport Absatzattr. als Svx (paraitem.hxx)
   SvxSizeItem->SvxFontHeight (textitem.hxx)

      Rev 1.132   28 Oct 1994 19:13:18   MA
   Reimport frmatr.

      Rev 1.131   25 Oct 1994 15:50:14   ER
   add: PCH

      Rev 1.130   14 Oct 1994 15:09:50   MS
   ctor umgestellt

      Rev 1.129   12 Oct 1994 08:12:14   MS
   Anpassung Sfx

      Rev 1.128   07 Oct 1994 10:50:02   PK
   sexport fuer dtor

      Rev 1.127   06 Oct 1994 12:09:12   VB
   Bugfix Aenderung Parent TabPages im Sfx

      Rev 1.126   06 Oct 1994 09:59:32   VB
   Bugfix Sfx

      Rev 1.125   05 Oct 1994 09:35:22   SWG
   Aenderungen Sfx

      Rev 1.124   04 Oct 1994 18:21:02   SWG
   Syntaxaederungen Sfx

      Rev 1.123   04 Oct 1994 18:07:50   SWG
   FillSet -> FillItemSet

      Rev 1.122   04 Oct 1994 16:49:40   VB
   Grenzwerte, Handler

      Rev 1.121   30 Sep 1994 16:50:32   VB
   Zwischensicherung

      Rev 1.120   29 Sep 1994 17:42:56   VB
   Syntaxprobleme

      Rev 1.119   29 Sep 1994 16:02:06   VB
   Umstellung SfxTabDlg

      Rev 1.118   28 Sep 1994 12:57:48   VB
   Absatzdialog als Huelle

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/chrdlg/swbreak.src b/sw/source/ui/chrdlg/swbreak.src
new file mode 100644
index 0000000..8ae0368
--- /dev/null
+++ b/sw/source/ui/chrdlg/swbreak.src
@@ -0,0 +1,412 @@
/*************************************************************************
 *
 *  $RCSfile: swbreak.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:32 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "chrdlg.hrc"
#include "break.hrc"
#include "cmdid.h"
#include "helpid.h"
 // #define DLG_BREAK 256
ModalDialog DLG_BREAK
{
    HelpID = FN_INSERT_BREAK_DLG ;
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 161 , 114 ) ;
    /* ### ACHTUNG: Neuer Text in Resource? Umbruch einfügen : Umbruch einf³gen */
    Text = "Umbruch einfügen" ;
    Text [ ENGLISH ] = "Insert Break" ;
    Text [ norwegian ] = "Sett inn Skift" ;
    Text [ italian ] = "Inserisci interruzione" ;
    Text [ portuguese_brazilian ] = "Inserir Interrupção" ;
    Text [ portuguese ] = "Inserir quebra" ;
    Text [ finnish ] = "Lisää vaihto" ;
    Text [ danish ] = "Indsæt skift" ;
    Text [ french ] = "Insérer un saut" ;
    Text [ swedish ] = "Infoga brytning" ;
    Text [ dutch ] = "Einde invoegen" ;
    Text [ spanish ] = "Insertar salto" ;
    Text [ english_us ] = "Insert Break" ;
    Moveable = TRUE ;
    OKButton BT_OK
    {
        Pos = MAP_APPFONT ( 105 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        Group = TRUE ;
        DefButton = TRUE ;
    };
    CancelButton BT_CANCEL
    {
        Pos = MAP_APPFONT ( 105 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        Group = TRUE ;
    };
    HelpButton BT_HELP
    {
        Pos = MAP_APPFONT ( 105 , 43 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        Group = TRUE ;
    };
    RadioButton RB_LINE
    {
        Pos = MAP_APPFONT ( 12 , 15 ) ;
        Size = MAP_APPFONT ( 63 , 10 ) ;
        Text = "~Zeilenumbruch" ;
        Text [ ENGLISH ] = "~Line break" ;
        Text [ norwegian ] = "~Linjeskift" ;
        Text [ italian ] = "I~nterruzione riga" ;
        Text [ portuguese_brazilian ] = "~Quebra de linha" ;
        Text [ portuguese ] = "~Quebra de linha" ;
        Text [ finnish ] = "~Rivinvaihto" ;
        Text [ danish ] = "Linjeskift" ;
        Text [ french ] = "R~envoi à la ligne" ;
        Text [ swedish ] = "~Radbrytning" ;
        Text [ dutch ] = "~Regeleinde" ;
        Text [ spanish ] = "Salto de ~línea" ;
        Text [ english_us ] = "~Line break" ;
        TabStop = TRUE ;
        Group = TRUE ;
        Text[ chinese_simplified ] = "»»ÐÐ(~L)";
        Text[ russian ] = "Ðàçðûâ ñòðîêè";
        Text[ polish ] = "Podzia³ ~wierszy";
        Text[ japanese ] = "‰üs(~L)";
        Text[ chinese_traditional ] = "´«¦æ(~L)";
        Text[ arabic ] = "ÝÇÕá ÃÓØÑ";
        Text[ greek ] = "ÁëëáãÞ ãñáììÞò";
        Text[ korean ] = "¼± ³ª´©±â(~L)";
        Text[ turkish ] = "Satýr sonu";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_PAGE
    {
        Pos = MAP_APPFONT ( 12 , 39 ) ;
        Size = MAP_APPFONT ( 63 , 10 ) ;
        Text = "~Seitenumbruch" ;
        Text [ ENGLISH ] = "~Page break" ;
        Text [ norwegian ] = "~Sideskift" ;
        Text [ italian ] = "In~terruzione pagina" ;
        Text [ portuguese_brazilian ] = "~Quebra de página" ;
        Text [ portuguese ] = "~Quebra de página" ;
        Text [ finnish ] = "~Sivunvaihto" ;
        Text [ danish ] = "Sideskift" ;
        Text [ french ] = "Saut de p~age" ;
        Text [ swedish ] = "~Sidbrytning" ;
        Text [ dutch ] = "~Pagina-einde" ;
        Text [ spanish ] = "Salto de ~página" ;
        Text [ english_us ] = "~Page break" ;
        TabStop = TRUE ;
        Check = TRUE ;
        Text[ chinese_simplified ] = "»»Ò³(~P)";
        Text[ russian ] = "Ðàçðûâ ñòðàíèöû";
        Text[ polish ] = "Podzia³ stron";
        Text[ japanese ] = "‰üÍß°¼Þ(~P)";
        Text[ chinese_traditional ] = "´«­¶(~P)";
        Text[ arabic ] = "ÝÇÕá ÕÝÍÇÊ";
        Text[ greek ] = "ÁëëáãÞ óåëßäáò";
        Text[ korean ] = "ÆäÀÌÁö ³ª´©±â(~P)";
        Text[ turkish ] = "~Sayfa sonu";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_COL
    {
        Pos = MAP_APPFONT ( 12 , 27 ) ;
        Size = MAP_APPFONT ( 69 , 10 ) ;
        Text = "S~paltenumbruch" ;
        Text [ ENGLISH ] = "~Column break" ;
        Text [ norwegian ] = "~Kolonneskift" ;
        Text [ italian ] = "Interr~uzione colonna" ;
        Text [ portuguese_brazilian ] = "~Quebra de coluna" ;
        Text [ portuguese ] = "~Quebra de coluna" ;
        Text [ finnish ] = "~Palstanvaihto" ;
        Text [ danish ] = "Spalteskift" ;
        Text [ french ] = "Saut de ~colonne" ;
        Text [ swedish ] = "Kolumnbrytning" ;
        Text [ dutch ] = "~Kolomeinde" ;
        Text [ spanish ] = "Salto de colu~mna" ;
        Text [ english_us ] = "~Column break" ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "»»À¸(~C)";
        Text[ russian ] = "Ðàçðûâ êîëîíêè";
        Text[ polish ] = "Podzia³ kolumny";
        Text[ japanese ] = "‰ü’i(~C)";
        Text[ chinese_traditional ] = "´«Äæ(~C)";
        Text[ arabic ] = "ÝÇÕá ÃÚãÏÉ";
        Text[ greek ] = "ÁëëáãÞ óôÞëçò";
        Text[ korean ] = "¿­ ³ª´©±â(~C)";
        Text[ turkish ] = "Sütun sonu";
        Text[ language_user1 ] = " ";
    };
    GroupBox GB_BREAK
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 93 , 105 ) ;
        Text = "Art" ;
        Text [ ENGLISH ] = "Type" ;
        Text [ norwegian ] = "Type" ;
        Text [ italian ] = "Tipo" ;
        Text [ portuguese_brazilian ] = "Tipo" ;
        Text [ portuguese ] = "Tipo" ;
        Text [ finnish ] = "Laji" ;
        Text [ danish ] = "Type" ;
        Text [ french ] = "Type" ;
        Text [ swedish ] = "Typ" ;
        Text [ dutch ] = "Type" ;
        Text [ spanish ] = "Tipo" ;
        Text [ english_us ] = "Type" ;
        Text[ chinese_simplified ] = "ÀàÐÍ";
        Text[ russian ] = "Òèï";
        Text[ polish ] = "Typ";
        Text[ japanese ] = "Ží—Þ";
        Text[ chinese_traditional ] = "Ãþ«¬";
        Text[ arabic ] = "ÇáäæÚ";
        Text[ greek ] = "Ôýðïò";
        Text[ korean ] = "ÇüÅÂ";
        Text[ turkish ] = "Tür";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_COLL
    {
        Pos = MAP_APPFONT ( 12 , 51 ) ;
        Size = MAP_APPFONT ( 30 , 8 ) ;
        Text = "~Vorlage" ;
        Text [ ENGLISH ] = "~Style" ;
        Text [ norwegian ] = "~Style" ;
        Text [ italian ] = "Modello" ;
        Text [ portuguese_brazilian ] = "~Estilo" ;
        Text [ portuguese ] = "~Estilo" ;
        Text [ finnish ] = "~Tyyli" ;
        Text [ danish ] = "Typografi" ;
        Text [ french ] = "~Style" ;
        Text [ swedish ] = "~Formatmall" ;
        Text [ dutch ] = "~Profiel" ;
        Text [ spanish ] = "~Estilo" ;
        Text [ english_us ] = "~Style" ;
        Group = TRUE ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "Ñùʽ(~S)";
        Text[ russian ] = "Øàáëîí";
        Text[ polish ] = "Szablon";
        Text[ japanese ] = "½À²Ù(~S)";
        Text[ chinese_traditional ] = "¼Ë¦¡(~S)";
        Text[ arabic ] = "äãØ";
        Text[ greek ] = "Ðñüôõðï";
        Text[ korean ] = "À¯Çü(~S)";
        Text[ turkish ] = "~Biçim";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_COLL
    {
        Pos = MAP_APPFONT ( 12 , 62 ) ;
        Size = MAP_APPFONT ( 75 , 50 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        CurPos = 0 ;
        StringList =
        {
            < "[Ohne]" ; > ;
        };
        StringList [ ENGLISH ] =
        {
            < "[Ohne]" ; > ;
        };
        StringList [ norwegian ] =
        {
            < "[Ohne]" ; > ;
        };
        StringList [ italian ] =
        {
            < "[Nessuno]" ; > ;
        };
        StringList [ portuguese_brazilian ] =
        {
            < "[Nenhum]" ; > ;
        };
        StringList [ portuguese ] =
        {
            < "[sem]" ; > ;
        };
        StringList [ finnish ] =
        {
            < "[Ohne]" ; > ;
        };
        StringList [ danish ] =
        {
            < "[Uden]" ; > ;
        };
        StringList [ french ] =
        {
            < "[Aucun]" ; > ;
        };
        StringList [ swedish ] =
        {
            < "[Utan]" ; > ;
        };
        StringList [ dutch ] =
        {
            < "[Geen]" ; > ;
        };
        StringList [ spanish ] =
        {
            < "[Sin]" ; > ;
        };
        StringList [ english_us ] =
        {
            < "[None]" ; > ;
        };
    StringList [ chinese_simplified ] =
    {
             < "[ÎÞ]" ; > ;
    };
    StringList [ russian ] =
    {
             < "[Áåç]" ; > ;
    };
    StringList [ polish ] =
    {
             < "[Brak]" ; > ;
    };
    StringList [ japanese ] =
    {
             < "[‚È‚µ]" ; > ;
    };
    StringList [ chinese_traditional ] =
    {
             < "[µL]" ; > ;
    };
    StringList [ arabic ] =
    {
             < "[ÈÏæä]" ; > ;
    };
    StringList [ greek ] =
    {
             < "[×ùñßò]" ; > ;
    };
    StringList [ korean ] =
    {
             < "[¾øÀ½]" ; > ;
    };
    StringList [ turkish ] =
    {
             < "[Yok]" ; > ;
    };
    StringList [ language_user1 ] =
    {
             < " " ; > ;
    };
    };
    CheckBox CB_PAGENUM
    {
        Pos = MAP_APPFONT ( 12 , 77 ) ;
        Size = MAP_APPFONT ( 84 , 10 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? Seitennummer ~ändern : Seitennummer ~õndern */
        Text = "Seitennummer ~ändern" ;
        Text [ English ] = "Change page number" ;
        Text [ norwegian ] = "Endre sidenummer" ;
        Text [ italian ] = "Cambia numero pagina" ;
        Text [ portuguese_brazilian ] = "Mudar número de página" ;
        Text [ portuguese ] = "Alterar número de página" ;
        Text [ finnish ] = "Muuttaa sivunumeroa" ;
        Text [ danish ] = "Modificer sidetal" ;
        Text [ french ] = "Modifier ~no. de page" ;
        Text [ swedish ] = "~Ändra sidnummer" ;
        Text [ dutch ] = "~Paginanummer wijzigen" ;
        Text [ spanish ] = "Cam~biar número de página" ;
        Text [ english_us ] = "Change page ~number" ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "¸ü¸ÄÒ³Âë(~N)";
        Text[ russian ] = "Èçìåíèòü íîìåð ñòðàíèöû";
        Text[ polish ] = "Zmieñ numer strony";
        Text[ japanese ] = "Íß°¼Þ”ԍ†‚̕ύX(~N)";
        Text[ chinese_traditional ] = "Åܧ󭶽X(~N)";
        Text[ arabic ] = "ÊÛííÑ ÑÞã ÇáÕÝÍÉ";
        Text[ greek ] = "ÁëëáãÞ áñéèìïý óåëßäáò";
        Text[ korean ] = "ÆäÀÌÁö ¹øÈ£ º¯°æ(~N)";
        Text[ turkish ] = "Sayfa numarasýný deðiþtir";
        Text[ language_user1 ] = " ";
    };
    NumericField ED_PAGENUM
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 12 , 90 ) ;
        Size = MAP_APPFONT ( 31 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 1 ;
        Maximum = 9999 ;
        Value = 1 ;
        First = 1 ;
        Last = 9999 ;
    };
    Text[ chinese_simplified ] = "²åÈë»»ÐÐ";
    Text[ russian ] = "Âñòàâèòü ðàçðûâ";
    Text[ polish ] = "Wstaw podzia³";
    Text[ japanese ] = "‹æØ‚è‚Ì‘}“ü";
    Text[ chinese_traditional ] = "´¡¤J´«¦æ";
    Text[ arabic ] = "ÅÏÑÇÌ ÝÇÕá";
    Text[ greek ] = "ÅéóáãùãÞ áëëáãÞò";
    Text[ korean ] = "³ª´©±â »ðÀÔ";
    Text[ turkish ] = "Kesme ekle";
    Text[ language_user1 ] = " ";
};
diff --git a/sw/source/ui/chrdlg/tblnumfm.cxx b/sw/source/ui/chrdlg/tblnumfm.cxx
new file mode 100644
index 0000000..1be5e38
--- /dev/null
+++ b/sw/source/ui/chrdlg/tblnumfm.cxx
@@ -0,0 +1,127 @@
/*************************************************************************
 *
 *  $RCSfile: tblnumfm.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:32 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop


#ifndef _SVX_SVXIDS_HRC //autogen
#include <svx/svxids.hrc>
#endif
#ifndef _SVX_NUMFMT_HXX //autogen
#include <svx/numfmt.hxx>
#endif

#include "swtypes.hxx"

#include "chrdlg.hrc"
#include "tblnumfm.hxx"


SwNumFmtDlg::SwNumFmtDlg(Window* pParent, SfxItemSet& rSet) :

    SfxSingleTabDialog(pParent, rSet, 0)

{
//    SetText(SW_RESSTR(STR_NUMFMT));

    // TabPage erzeugen
    SvxNumberFormatTabPage* pPage = (SvxNumberFormatTabPage*) SvxNumberFormatTabPage::Create(this, rSet);
    const SfxPoolItem& rInfoItem = pPage->GetItemSet().Get(SID_ATTR_NUMBERFORMAT_INFO);
    pPage->SetNumberFormatList((const SvxNumberInfoItem&)rInfoItem );

    SetTabPage(pPage);
}


SwNumFmtDlg::~SwNumFmtDlg()
{
}

/*************************************************************************

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.5  2000/09/18 16:05:15  willem.vandorp
      OpenOffice header added.

      Revision 1.4  1998/02/25 11:39:14  TJ
      include


      Rev 1.3   25 Feb 1998 12:39:14   TJ
   include

      Rev 1.2   21 Nov 1997 12:24:36   MA
   includes

      Rev 1.1   03 Nov 1997 13:10:22   MA
   precomp entfernt

      Rev 1.0   14 Feb 1997 18:05:02   OM
   Initial revision.

*************************************************************************/

diff --git a/sw/source/ui/config/barcfg.cxx b/sw/source/ui/config/barcfg.cxx
new file mode 100644
index 0000000..2bf41ce
--- /dev/null
+++ b/sw/source/ui/config/barcfg.cxx
@@ -0,0 +1,183 @@
/*************************************************************************
 *
 *  $RCSfile: barcfg.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:32 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _TOOLS_TABLE_HXX //autogen
#include <tools/table.hxx>
#endif
#ifndef _STREAM_HXX //autogen
#include <tools/stream.hxx>
#endif

#include "barcfg.hxx"
#include "cfgid.h"

#define BAR_VERSION  UINT16(1)

DECLARE_TABLE(CfgUSHORTTable,void*);

SwToolbarConfigItem::SwToolbarConfigItem( BOOL bWeb ) :
    SfxConfigItem( bWeb ? CFG_TOOLBARCONFIG_ITEM : CFG_WEBTOOLBARCONFIG_ITEM ),
    pTbl( new CfgUSHORTTable )
{
    SetInternal( TRUE );
}

SwToolbarConfigItem::~SwToolbarConfigItem()
{
    delete pTbl;
}

void SwToolbarConfigItem::SetTopToolbar( int nSelType, USHORT nBarId )
{
    if ( !pTbl->IsKeyValid( ULONG(nSelType) ) )
        pTbl->Insert( ULONG(nSelType), (void*)(ULONG)nBarId );
    else
        pTbl->Replace( ULONG(nSelType), (void*)(ULONG)nBarId );
}

USHORT SwToolbarConfigItem::GetTopToolbar( int nSelType )
{
    if ( !pTbl->IsKeyValid( ULONG(nSelType) ) )
        return USHRT_MAX;
    else
        return (USHORT)(ULONG)pTbl->Get( ULONG(nSelType) );
}

BOOL SwToolbarConfigItem::Store(SvStream& rStrm)
{
    rStrm << BAR_VERSION;
    rStrm << UINT16(pTbl->Count());

    if ( pTbl->Count() )
    {
        UINT16 nVal = UINT16((ULONG)pTbl->First());
        while ( nVal )
        {
            UINT16 nKey = UINT16((ULONG)pTbl->GetCurKey());
            rStrm << nKey << nVal;
            nVal = UINT16((ULONG)pTbl->Next());
        }
    }

    return SfxConfigItem::ERR_OK;
}


int SwToolbarConfigItem::Load(SvStream& rStrm)
{
    UINT16 nVersion;
    rStrm >> nVersion;

    if ( nVersion >= BAR_VERSION )
    {
        UINT16 nCount;
        rStrm >> nCount;
        if ( nCount )
        {
            for ( UINT16 i = 0; i < nCount; ++i )
            {
                UINT16 nKey, nVal;
                rStrm >> nKey >> nVal;
                pTbl->Insert( nKey, (void*)(ULONG)nVal );
            }
        }

        SetDefault(FALSE);
        return SfxConfigItem::ERR_OK;
    }
    else
        return SfxConfigItem::WARNING_VERSION;
}


void SwToolbarConfigItem::UseDefault()
{
    SfxConfigItem::UseDefault();
    pTbl->Clear();
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.4  2000/09/18 16:05:15  willem.vandorp
    OpenOffice header added.

    Revision 1.3  1998/04/08 11:46:42  OS
    einer noch..


      Rev 1.2   08 Apr 1998 13:46:42   OS
   einer noch..

      Rev 1.1   08 Apr 1998 13:41:32   OS
   Table mit void* -> fuer UNX und MAC

      Rev 1.0   02 Apr 1998 10:06:04   MA
   new: ToolbarCfg


------------------------------------------------------------------------*/
diff --git a/sw/source/ui/config/caption.cxx b/sw/source/ui/config/caption.cxx
new file mode 100644
index 0000000..e15b1cf
--- /dev/null
+++ b/sw/source/ui/config/caption.cxx
@@ -0,0 +1,238 @@
/*************************************************************************
 *
 *  $RCSfile: caption.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:32 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _TOOLS_DEBUG_HXX //autogen
#include <tools/debug.hxx>
#endif

#include "numrule.hxx"
#include "caption.hxx"

#define VERSION_01      1
#define CAPTION_VERSION VERSION_01

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

InsCaptionOpt::InsCaptionOpt(const SwCapObjType eType, const SvGlobalName* pOleId) :
    bUseCaption(FALSE),
    eObjType(eType),
    nNumType(SVX_NUM_ARABIC),
    nPos(1),
    nLevel(0),
    cSeparator('.'),
    bIgnoreSeqOpts(FALSE),
    bCopyAttributes(FALSE)
{
    if (pOleId)
        aOleId = *pOleId;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

InsCaptionOpt::InsCaptionOpt(const InsCaptionOpt& rOpt)
{
    *this = rOpt;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

InsCaptionOpt::~InsCaptionOpt()
{
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

InsCaptionOpt& InsCaptionOpt::operator=( const InsCaptionOpt& rOpt )
{
    bUseCaption = rOpt.bUseCaption;
    eObjType = rOpt.eObjType;
    aOleId = rOpt.aOleId;
    sCategory = rOpt.sCategory;
    nNumType = rOpt.nNumType;
    sCaption = rOpt.sCaption;
    nPos = rOpt.nPos;
    nLevel = rOpt.nLevel;
    cSeparator = rOpt.cSeparator;
    bIgnoreSeqOpts = rOpt.bIgnoreSeqOpts;
    bCopyAttributes = rOpt.bCopyAttributes;

    return *this;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

BOOL InsCaptionOpt::operator==( const InsCaptionOpt& rOpt ) const
{
    return (eObjType == rOpt.eObjType &&
            aOleId == rOpt.aOleId); // Damit gleiche Ole-IDs nicht mehrfach eingefuegt
                                    // werden koennen, auf nichts weiteres vergleichen


/*           &&
            sCategory == rOpt.sCategory &&
            nNumType == rOpt.nNumType &&
            sCaption == rOpt.sCaption &&
            nPos == rOpt.nPos &&
            nLevel == rOpt.nLevel &&
            cSeparator == rOpt.cSeparator);*/
}

/*************************************************************************
|*
|*    InsCaptionOpt::operator>>()
|*
|*    Beschreibung      Stream-Leseoperator
|*
*************************************************************************/

SvStream& operator>>( SvStream& rIStream, InsCaptionOpt& rCapOpt )
{
    rtl_TextEncoding eEncoding = gsl_getSystemTextEncoding();
    UINT16 nVal;
    BYTE   cVal;
    BYTE   nVersion;

    rIStream >> nVersion;
    rIStream >> cVal;               rCapOpt.UseCaption() = cVal != 0;
    rIStream >> nVal;               rCapOpt.eObjType = (SwCapObjType)nVal;
    rIStream >> rCapOpt.aOleId;

    rIStream.ReadByteString( rCapOpt.sCategory, eEncoding );
    rIStream >> nVal;               rCapOpt.nNumType = nVal;
    rIStream.ReadByteString( rCapOpt.sCaption, eEncoding );
    rIStream >> nVal;               rCapOpt.nPos = nVal;
    rIStream >> nVal;               rCapOpt.nLevel = nVal;

    rIStream >> cVal;
    rCapOpt.cSeparator = UniString( ByteString(cVal) , eEncoding).GetChar(0);

    return rIStream;
}

/*************************************************************************
|*
|*    InsCaptionOpt::operator<<()
|*
|*    Beschreibung      Stream-Schreiboperator
|*
*************************************************************************/

SvStream& operator<<( SvStream& rOStream, const InsCaptionOpt& rCapOpt )
{
    rtl_TextEncoding eEncoding = gsl_getSystemTextEncoding();
    rOStream    << (BYTE)CAPTION_VERSION
                << (BYTE)rCapOpt.UseCaption()
                << (UINT16)rCapOpt.eObjType
                << rCapOpt.aOleId;

    rOStream.WriteByteString( rCapOpt.sCategory, eEncoding );

    rOStream    << (UINT16)rCapOpt.nNumType;

    rOStream.WriteByteString( rCapOpt.sCaption, eEncoding );

    BYTE cSep = ByteString(UniString(rCapOpt.cSeparator), eEncoding).GetChar(0);
    rOStream    << (UINT16)rCapOpt.nPos
                << (UINT16)rCapOpt.nLevel
                << cSep;

    return rOStream;
}

/*--------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.5  2000/09/18 16:05:15  willem.vandorp
    OpenOffice header added.

    Revision 1.4  2000/04/11 08:02:23  os
    UNICODE

    Revision 1.3  1999/06/09 08:49:44  OS
    #66732# Insert caption: copy border and shadow optionally


      Rev 1.2   09 Jun 1999 10:49:44   OS
   #66732# Insert caption: copy border and shadow optionally

      Rev 1.1   17 Nov 1998 10:50:12   OS
   #58263# NumType durch SvxExtNumType ersetzt

      Rev 1.0   06 Nov 1998 17:01:32   OM
   Initial revision.

 --------------------------------------------------------------------*/
diff --git a/sw/source/ui/config/cfgitems.cxx b/sw/source/ui/config/cfgitems.cxx
new file mode 100644
index 0000000..e50d8860
--- /dev/null
+++ b/sw/source/ui/config/cfgitems.cxx
@@ -0,0 +1,855 @@
/*************************************************************************
 *
 *  $RCSfile: cfgitems.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:32 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef __SBX_SBXVARIABLE_HXX //autogen
#include <svtools/sbxvar.hxx>
#endif

#ifndef _SVX_SVXIDS_HRC //autogen
#include <svx/svxids.hrc>
#endif

#ifndef _SVX_SVXENUM_HXX //autogen
#include <svx/svxenum.hxx>
#endif


#include "viewopt.hxx"
#include "swtypes.hxx"
#include "cmdid.h"
#include "prtopt.hxx"
#include "cfgitems.hxx"
#include "crstate.hxx"



TYPEINIT1_AUTOFACTORY(SwDocDisplayItem, SfxPoolItem)
TYPEINIT1_AUTOFACTORY(SwElemItem, SfxPoolItem)
TYPEINIT1_AUTOFACTORY(SwAddPrinterItem, SfxPoolItem)
TYPEINIT1_AUTOFACTORY(SwShadowCursorItem, SfxPoolItem)


SwDocDisplayItem::SwDocDisplayItem( USHORT nWhich ) :
        SfxPoolItem(nWhich),
        aIndexBackgrndCol(COL_GRAY)
{
    bParagraphEnd       =
    bTab                =
    bSpace              =
    bNonbreakingSpace   =
    bSoftHyphen         =
    bHiddenText         =
    bManualBreak        =
    bIndexEntry         =
    bIndexBackground    =
    bFootnoteBackground =
    bField              =
    bTable              =
    bGraphic            =
    bDrawing            =
    bFieldName          =
    bNotes              =
    bShowHiddenPara     = FALSE;
};


/*------------OS 12.01.95 -------------------------------------------
    Item fuer Einstellungsdialog, Seite Dokumentansicht
--------------------------------------------------------------------*/

SwDocDisplayItem::SwDocDisplayItem( const SwDocDisplayItem& rDocDisplayItem ):
            SfxPoolItem(rDocDisplayItem)
{
    *this = rDocDisplayItem;
};

/*----------------------- -------------------------------------------

--------------------------------------------------------------------*/

SwDocDisplayItem::SwDocDisplayItem(const SwViewOption& rVOpt, USHORT nWhich ) :
            SfxPoolItem( nWhich )
{
    bParagraphEnd       = rVOpt.IsParagraph(TRUE);
    bTab                = rVOpt.IsTab(TRUE);
    bSpace              = rVOpt.IsBlank(TRUE);
    bNonbreakingSpace   = rVOpt.IsHardBlank();
    bSoftHyphen         = rVOpt.IsSoftHyph();
    bHiddenText         = rVOpt.IsHidden();
    bManualBreak        = rVOpt.IsLineBreak(TRUE);
    bIndexEntry         = rVOpt.IsTox();
    bIndexBackground    = rVOpt.IsIndexBackground();
    bFootnoteBackground = rVOpt.IsFootNote();
    bField              = rVOpt.IsField();
    bTable              = rVOpt.IsTable();
    bGraphic            = rVOpt.IsGraphic();
    bDrawing            = rVOpt.IsDraw() && rVOpt.IsControl();
    bFieldName          = rVOpt.IsFldName();
    bNotes              = rVOpt.IsPostIts();
    bShowHiddenPara     = rVOpt.IsShowHiddenPara();

    aIndexBackgrndCol = rVOpt.GetIndexBackgrndColor();

}
/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SfxPoolItem* SwDocDisplayItem::Clone( SfxItemPool*  ) const
{
    return new SwDocDisplayItem( *this );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

int SwDocDisplayItem::operator==( const SfxPoolItem& rAttr ) const
{
    DBG_ASSERT( SfxPoolItem::operator==(rAttr), "unterschiedliche Typen" );

    const SwDocDisplayItem& rItem = (SwDocDisplayItem&)rAttr;

    return (  bParagraphEnd         == rItem.bParagraphEnd       &&
              bTab                  == rItem.bTab                &&
              bSpace                == rItem.bSpace              &&
              bNonbreakingSpace     == rItem.bNonbreakingSpace   &&
              bSoftHyphen           == rItem.bSoftHyphen         &&
              bHiddenText           == rItem.bHiddenText         &&
              bManualBreak          == rItem.bManualBreak        &&
              bIndexEntry           == rItem.bIndexEntry         &&
              bIndexBackground      == rItem.bIndexBackground    &&
              bFootnoteBackground   == rItem.bFootnoteBackground &&
              bField                == rItem.bField              &&
              bTable                == rItem.bTable              &&
              bGraphic              == rItem.bGraphic            &&
              bDrawing              == rItem.bDrawing            &&
              bFieldName            == rItem.bFieldName          &&
              bNotes                == rItem.bNotes              &&
              bShowHiddenPara       == rItem.bShowHiddenPara     &&
              aIndexBackgrndCol     == rItem.aIndexBackgrndCol  );
}


/*-----------------31.08.96 14.14-------------------

--------------------------------------------------*/


void  SwDocDisplayItem::operator=( const SwDocDisplayItem& rDocDisplayItem)
{
    bParagraphEnd       = rDocDisplayItem.bParagraphEnd         ;
    bTab                = rDocDisplayItem.bTab                  ;
    bSpace              = rDocDisplayItem.bSpace                ;
    bNonbreakingSpace   = rDocDisplayItem.bNonbreakingSpace     ;
    bSoftHyphen         = rDocDisplayItem.bSoftHyphen           ;
    bHiddenText         = rDocDisplayItem.bHiddenText           ;
    bManualBreak        = rDocDisplayItem.bManualBreak          ;
    bIndexEntry         = rDocDisplayItem.bIndexEntry           ;
    bIndexBackground    = rDocDisplayItem.bIndexBackground      ;
    bFootnoteBackground = rDocDisplayItem.bFootnoteBackground   ;
    bField              = rDocDisplayItem.bField                ;
    bTable              = rDocDisplayItem.bTable                ;
    bGraphic            = rDocDisplayItem.bGraphic              ;
    bDrawing            = rDocDisplayItem.bDrawing              ;
    bFieldName          = rDocDisplayItem.bFieldName            ;
    bNotes              = rDocDisplayItem.bNotes                ;
    bShowHiddenPara     = rDocDisplayItem.bShowHiddenPara       ;
    aIndexBackgrndCol   = rDocDisplayItem.aIndexBackgrndCol     ;

}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwDocDisplayItem::FillViewOptions( SwViewOption& rVOpt) const
{
    rVOpt.SetParagraph  (bParagraphEnd      );
    rVOpt.SetTab        (bTab               );
    rVOpt.SetBlank      (bSpace             );
    rVOpt.SetHardBlank  (bNonbreakingSpace  );
    rVOpt.SetSoftHyph   (bSoftHyphen        );
    rVOpt.SetHidden     (bHiddenText        );
    rVOpt.SetLineBreak  (bManualBreak       );
    rVOpt.SetTox        (bIndexEntry        );
    rVOpt.SetFootNote   (bFootnoteBackground);
    rVOpt.SetIndexBackground(bIndexBackground);
    rVOpt.SetField      (bField             );
    rVOpt.SetTable      (bTable             );
    rVOpt.SetGraphic    (bGraphic           );
    rVOpt.SetDraw       (bDrawing           );
    rVOpt.SetControl    (bDrawing           );
    rVOpt.SetFldName    (bFieldName         );
    rVOpt.SetPostIts    (bNotes             );
    rVOpt.SetShowHiddenPara(bShowHiddenPara );

    rVOpt.SetIndexBackgrndColor(aIndexBackgrndCol);
}


/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


SwElemItem::SwElemItem( USHORT nWhich ) :
    SfxPoolItem(nWhich)
{
    bHorzScrollbar =
    bVertScrollbar =
    bHorzRuler     =
    bVertRuler     =
    bTableBounds   =
    bSectionBounds =
    bCrosshair     =
    bBounds        =
    bStatusLine    =
    bHandles       =
    bBigHandles     =
    bSmoothScroll  = FALSE;
}
/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SwElemItem::SwElemItem( const SwElemItem& rElemItem ):
            SfxPoolItem(rElemItem)
{
    *this = rElemItem;
}
/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SwElemItem::SwElemItem(const SwViewOption& rVOpt, USHORT nWhich) :
            SfxPoolItem( nWhich )
{
    bHorzScrollbar  = rVOpt.IsViewHScrollBar();
    bVertScrollbar  = rVOpt.IsViewVScrollBar();
    bHorzRuler      = rVOpt.IsViewTabwin();
    bVertRuler      = rVOpt.IsViewVLin();
    bTableBounds    = rVOpt.IsSubsTable();
    bSectionBounds  = rVOpt.IsSectionBounds();
    bCrosshair      = rVOpt.IsCrossHair();
    bBounds         = rVOpt.IsSubsLines();
    bHandles        = rVOpt.IsSolidMarkHdl();
    bBigHandles     = rVOpt.IsBigMarkHdl();
    bSmoothScroll   = rVOpt.IsSmoothScroll();

//  bStatusLine

}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SfxPoolItem* SwElemItem::Clone( SfxItemPool* ) const
{
    return new SwElemItem( *this );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

int SwElemItem::operator==( const SfxPoolItem& rAttr ) const
{
    DBG_ASSERT( SfxPoolItem::operator==(rAttr), "unterschiedliche Typen" );

    const SwElemItem& rItem = (SwElemItem&)rAttr;

    return (    bHorzScrollbar  == rItem.bHorzScrollbar &&
                bVertScrollbar  == rItem.bVertScrollbar &&
                bHorzRuler      == rItem.bHorzRuler     &&
                bVertRuler      == rItem.bVertRuler     &&
                bTableBounds    == rItem.bTableBounds   &&
                bSectionBounds  == rItem.bSectionBounds &&
                bCrosshair      == rItem.bCrosshair     &&
                bBounds         == rItem.bBounds        &&
                bStatusLine     == rItem.bStatusLine    &&
                bHandles        == rItem.bHandles       &&
                bBigHandles     == rItem.bBigHandles    &&
                bSmoothScroll   == rItem.bSmoothScroll );
}

/*-----------------31.08.96 14.13-------------------

--------------------------------------------------*/


void  SwElemItem::operator=( const SwElemItem& rElemItem)
{
    bHorzScrollbar  = rElemItem.  bHorzScrollbar    ;
    bVertScrollbar  = rElemItem.  bVertScrollbar    ;
    bHorzRuler      = rElemItem.  bHorzRuler        ;
    bVertRuler      = rElemItem.  bVertRuler        ;
    bTableBounds    = rElemItem.  bTableBounds      ;
    bSectionBounds  = rElemItem.  bSectionBounds    ;
    bCrosshair      = rElemItem.  bCrosshair        ;
    bBounds         = rElemItem.  bBounds           ;
    bStatusLine     = rElemItem.  bStatusLine       ;
    bHandles        = rElemItem.  bHandles          ;
    bBigHandles     = rElemItem.  bBigHandles       ;
    bSmoothScroll   = rElemItem.  bSmoothScroll     ;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwElemItem::FillViewOptions( SwViewOption& rVOpt) const
{
    rVOpt.SetViewHScrollBar(bHorzScrollbar );
    rVOpt.SetViewVScrollBar(bVertScrollbar );
    rVOpt.SetViewTabwin(bHorzRuler    );
    rVOpt.SetViewVLin(bVertRuler      );
    rVOpt.SetSubsTable(bTableBounds   );
    rVOpt.SetSectionBounds(bSectionBounds);
    rVOpt.SetCrossHair(bCrosshair     );
    rVOpt.SetSubsLines(bBounds        );
    rVOpt.SetSolidMarkHdl(bHandles    );
    rVOpt.SetBigMarkHdl(bBigHandles );
    rVOpt.SetSmoothScroll(bSmoothScroll);
//  bStatusLine
}


/*--------------------------------------------------------------------
    Beschreibung: CopyCTOR
 --------------------------------------------------------------------*/

SwAddPrinterItem::SwAddPrinterItem( const SwAddPrinterItem& rAddPrinterItem ):
            SfxPoolItem(rAddPrinterItem)
{
    bPrintGraphic       = rAddPrinterItem.bPrintGraphic  ;
    bPrintTable         = rAddPrinterItem.bPrintTable    ;
    bPrintDrawing       = rAddPrinterItem.bPrintDrawing  ;
    bPrintControl       = rAddPrinterItem.bPrintControl  ;
    bPrintLeftPage      = rAddPrinterItem.bPrintLeftPage ;
    bPrintRightPage     = rAddPrinterItem.bPrintRightPage;
    bPrintReverse       = rAddPrinterItem.bPrintReverse  ;
    bPaperFromSetup     = rAddPrinterItem.bPaperFromSetup;
    bPrintProspect      = rAddPrinterItem.bPrintProspect ;
    bPrintPageBackground= rAddPrinterItem.bPrintPageBackground;
    bPrintBlackFont     = rAddPrinterItem.bPrintBlackFont;
    bPrintSingleJobs    = rAddPrinterItem.bPrintSingleJobs;
    nPrintPostIts       = rAddPrinterItem.nPrintPostIts  ;
    sFaxName            = rAddPrinterItem.sFaxName       ;

};

/*--------------------------------------------------------------------
    Beschreibung: CTOR fuer leeres Item
 --------------------------------------------------------------------*/

SwAddPrinterItem::SwAddPrinterItem( USHORT nWhich):
                SfxPoolItem(nWhich),
                bPrintGraphic(FALSE),
                bPrintTable(FALSE),
                bPrintDrawing(FALSE),
                bPrintControl(FALSE),
                bPrintLeftPage(FALSE),
                bPrintRightPage(FALSE),
                bPrintReverse(FALSE),
                bPaperFromSetup(FALSE),
                bPrintProspect(FALSE),
                bPrintPageBackground(FALSE),
                nPrintPostIts(0),
                sFaxName( aEmptyStr )
{
}
/*--------------------------------------------------------------------
    Beschreibung: CTOR aus SwPrintOptions
 --------------------------------------------------------------------*/

SwAddPrinterItem::SwAddPrinterItem( USHORT nWhich, SwPrintOptions* pPrtOpt ) :
    SfxPoolItem(nWhich)
{
    bPrintGraphic  = pPrtOpt->IsPrintGraphic();
    bPrintTable    = pPrtOpt->IsPrintTable();
    bPrintDrawing  = pPrtOpt->IsPrintDraw();
    bPrintControl  = pPrtOpt->IsPrintControl();
    bPrintLeftPage = pPrtOpt->IsPrintLeftPage();
    bPrintRightPage= pPrtOpt->IsPrintRightPage();
    bPrintReverse  = pPrtOpt->IsPrintReverse();
    bPaperFromSetup= pPrtOpt->IsPaperFromSetup();
    bPrintProspect = pPrtOpt->IsPrintProspect();
    bPrintPageBackground= pPrtOpt->IsPrintPageBackground();
    nPrintPostIts       = pPrtOpt->GetPrintPostIts();
    bPrintBlackFont     = pPrtOpt->IsPrintBlackFont();
    bPrintSingleJobs    = pPrtOpt->IsPrintSingleJobs();
    sFaxName     = pPrtOpt->GetFaxName();
}
/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SfxPoolItem* SwAddPrinterItem::Clone( SfxItemPool* ) const
{
    return new SwAddPrinterItem( *this );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

int SwAddPrinterItem::operator==( const SfxPoolItem& rAttr ) const
{
    DBG_ASSERT( SfxPoolItem::operator==(rAttr), "unterschiedliche Typen" );

    const SwAddPrinterItem& rItem = (SwAddPrinterItem&)rAttr;

    return (    bPrintGraphic   == rItem.bPrintGraphic   &&
                bPrintDrawing   == rItem.bPrintDrawing   &&
                bPrintControl   == rItem.bPrintControl   &&
                bPrintTable     == rItem.bPrintTable     &&
                bPrintLeftPage  == rItem.bPrintLeftPage  &&
                bPrintRightPage == rItem.bPrintRightPage &&
                bPrintReverse   == rItem.bPrintReverse   &&
                bPaperFromSetup == rItem.bPaperFromSetup &&
                bPrintProspect  == rItem.bPrintProspect  &&
                bPrintPageBackground == rItem.bPrintPageBackground &&
                bPrintBlackFont == rItem.bPrintBlackFont &&
                bPrintSingleJobs== rItem.bPrintSingleJobs&&
                nPrintPostIts   == rItem.nPrintPostIts   &&
                sFaxName        == rItem.sFaxName    );
}
// -----------------------------------------------------------------------

void SwAddPrinterItem::SetPrintOptions( SwPrintOptions* pPrtOpt ) const
{
    pPrtOpt->SetPrintGraphic    (bPrintGraphic);
    pPrtOpt->SetPrintTable      (bPrintTable);
    pPrtOpt->SetPrintDraw       (bPrintDrawing);
    pPrtOpt->SetPrintControl    (bPrintControl);
    pPrtOpt->SetPrintLeftPage   (bPrintLeftPage);
    pPrtOpt->SetPrintRightPage  (bPrintRightPage);
    pPrtOpt->SetPrintReverse    (bPrintReverse);
    pPrtOpt->SetPaperFromSetup  (bPaperFromSetup);
    pPrtOpt->SetPrintPostIts    (nPrintPostIts);
    pPrtOpt->SetPrintProspect   (bPrintProspect);
    pPrtOpt->SetPrintPageBackground( bPrintPageBackground );
    pPrtOpt->SetPrintBlackFont( bPrintBlackFont );
    pPrtOpt->SetPrintSingleJobs( bPrintSingleJobs );
}


/*-----------------03.11.97 10:00-------------------
 Item fuer Einstellungsdialog, ShadowCursorSeite
--------------------------------------------------*/

SwShadowCursorItem::SwShadowCursorItem( USHORT nWhich )
    : SfxPoolItem( nWhich ),
    bOn( FALSE ), eMode( FILL_TAB ), aColor( COL_BLUE )
{
}

SwShadowCursorItem::SwShadowCursorItem( const SwShadowCursorItem& rCpy )
    : SfxPoolItem( rCpy.Which() ),
    bOn( rCpy.IsOn() ), eMode( rCpy.GetMode() ), aColor( rCpy.GetColor() )
{
}

SwShadowCursorItem::SwShadowCursorItem( const SwViewOption& rVOpt, USHORT nWhich )
    : SfxPoolItem( nWhich ),
    bOn( rVOpt.IsShadowCursor() ),
    eMode( rVOpt.GetShdwCrsrFillMode() ),
    aColor( rVOpt.GetShdwCrsrColor() )
{
}

SfxPoolItem* SwShadowCursorItem::Clone( SfxItemPool* ) const
{
    return new SwShadowCursorItem( *this );
}

int SwShadowCursorItem::operator==( const SfxPoolItem& rCmp ) const
{
    return  IsOn() == ((SwShadowCursorItem&)rCmp).IsOn() &&
            GetMode() == ((SwShadowCursorItem&)rCmp).GetMode() &&
            GetColor() == ((SwShadowCursorItem&)rCmp).GetColor();
}

void SwShadowCursorItem::operator=( const SwShadowCursorItem& rCpy )
{
    SetOn( rCpy.IsOn() );
    SetMode( rCpy.GetMode() );
    SetColor( rCpy.GetColor() );
}


void SwShadowCursorItem::FillViewOptions( SwViewOption& rVOpt ) const
{
    rVOpt.SetShadowCursor( bOn );
    rVOpt.SetShdwCrsrFillMode( eMode );
    rVOpt.SetShdwCrsrColor( aColor );
}

#ifndef PRODUCT
/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SwTestItem::SwTestItem( const SwTestItem& rTestItem ):
            SfxPoolItem(rTestItem)
{
    bTest1=rTestItem.bTest1;
    bTest2=rTestItem.bTest2;
    bTest3=rTestItem.bTest3;
    bTest4=rTestItem.bTest4;
    bTest5=rTestItem.bTest5;
    bTest6=rTestItem.bTest6;
    bTest7=rTestItem.bTest7;
    bTest8=rTestItem.bTest8;
    bTest9=rTestItem.bTest9;
    bTest10=rTestItem.bTest10;
};

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SfxPoolItem* SwTestItem::Clone( SfxItemPool* ) const
{
    return new SwTestItem( *this );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

int SwTestItem::operator==( const SfxPoolItem& rAttr ) const
{
    DBG_ASSERT( SfxPoolItem::operator==(rAttr), "unterschiedliche Typen" );

    const SwTestItem& rItem = (const SwTestItem&) rAttr;

    return ( bTest1==rItem.bTest1&&
             bTest2==rItem.bTest2&&
             bTest3==rItem.bTest3&&
             bTest4==rItem.bTest4&&
             bTest5==rItem.bTest5&&
             bTest6==rItem.bTest6&&
             bTest7==rItem.bTest7&&
             bTest8==rItem.bTest8&&
             bTest9==rItem.bTest9&&
             bTest10==rItem.bTest10);
}

#endif



/*------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.80  2000/09/18 16:05:15  willem.vandorp
    OpenOffice header added.

    Revision 1.79  2000/09/07 08:26:13  os
    FaxName now in SwPrintOptions

    Revision 1.78  2000/05/26 07:21:28  os
    old SW Basic API Slots removed

    Revision 1.77  1999/12/14 14:29:10  jp
    Bug #69595#: print can create single Jobs

    Revision 1.76  1999/09/22 12:37:43  os
    big handles

    Revision 1.75  1999/09/01 08:42:36  OS
    useless GetPresentation() removed


      Rev 1.74   01 Sep 1999 10:42:36   OS
   useless GetPresentation() removed

      Rev 1.73   16 Aug 1999 14:09:42   OS
   #68153# show drawings and controls: call SetControl()

      Rev 1.72   09 Jun 1999 13:20:54   OS
   index background

      Rev 1.71   27 Jan 1999 10:03:12   OS
   #58677# Cursor in Readonly-Bereichen

      Rev 1.70   05 Mar 1998 14:34:08   OM
   Redline-Attribute in Module-Cfg speichern

      Rev 1.69   20 Feb 1998 17:10:50   OM
   ConfigItem fuer Redlining-Darstellungsoptionen

      Rev 1.68   24 Nov 1997 17:58:50   MA
   include

      Rev 1.67   11 Nov 1997 14:04:30   MA
   precomp entfernt

      Rev 1.66   03 Nov 1997 16:12:16   JP
   neu: Optionen/-Page/Basic-Schnittst. fuer ShadowCursor

      Rev 1.65   19 Aug 1997 10:36:08   OS
   PrintPreview aus den ViewSettings raus #42797#

      Rev 1.64   16 Aug 1997 09:33:06   OS
   Col/RowPreView aus den PrintSettings entfernt #42797#

      Rev 1.63   09 Jun 1997 14:28:40   MA
   chg: Browse-Flag nur noch am Doc

      Rev 1.62   06 Jun 1997 12:44:30   MA
   chg: versteckte Absaetze ausblenden

      Rev 1.61   25 Feb 1997 10:21:16   OS
   farbige Handles

      Rev 1.60   27 Jan 1997 16:29:42   OS
   HtmlMode entfernt

      Rev 1.59   11 Dec 1996 18:16:28   NF
   Cut-Copy-Paste Fehler behoben !?

      Rev 1.58   11 Dec 1996 14:12:02   OS
   Warnings auch fuers Basic ausbauen

      Rev 1.57   10 Dec 1996 17:00:06   OS
   Warnungen von der OFA

      Rev 1.56   28 Nov 1996 15:20:24   OS
   neu: Schwarz drucken

      Rev 1.55   06 Sep 1996 14:31:54   OS
   Postits beruecksichtigen

      Rev 1.54   31 Aug 1996 17:14:02   OS
   neue Optionendialoge

      Rev 1.53   25 Jul 1996 15:34:56   OS
   neu: HtmlMode

      Rev 1.52   17 Jul 1996 13:41:44   OS
   PrintBackground auch fuer Basic

      Rev 1.51   16 Jul 1996 20:19:52   MA
   includes

      Rev 1.50   16 Jul 1996 15:52:20   MA
   new: PrintPageBackground

      Rev 1.49   25 Jun 1996 17:58:08   HJS
   include prtopt.hxx

      Rev 1.48   25 Apr 1996 16:23:14   OS
   ViewOptions-Umbau: ElemItem wird nur noch aus ViewOptions erzeugt

      Rev 1.47   15 Mar 1996 15:28:18   JP
   TestFlags erweitert

      Rev 1.46   07 Mar 1996 16:54:38   JP
   AddPrintItem um weiters Flag erweitert

      Rev 1.45   01 Feb 1996 16:42:42   OS
   Reihenfolge der Printoptionen berichtigt

      Rev 1.44   04 Dec 1995 16:09:14   OS
   Set/FillVariable impl.

      Rev 1.43   28 Nov 1995 23:37:36   JP
   uisys.hxx gibt es nicht mehr

      Rev 1.42   27 Nov 1995 19:50:50   JP
   TYPEINIT_AUTOFACTORY segmentiert

      Rev 1.41   27 Nov 1995 18:55:22   OS
   Umstellung 303a

      Rev 1.40   24 Nov 1995 16:58:50   OM
   PCH->PRECOMPILED

      Rev 1.39   23 Nov 1995 19:49:30   OS
   Typeinfo und Default CTOR

      Rev 1.38   16 Nov 1995 18:23:22   OS
   neu: Get/SetVariable, teilweise impl.

      Rev 1.37   06 Nov 1995 17:15:00   OS
   SwElemItem bearbeitet nur noch die ViewOptions, keine UsrPrefs

      Rev 1.36   17 Oct 1995 19:20:20   OS
   AddPrinterItem Ctor(SwPrintOptions) PageView-Member initalisieren

      Rev 1.35   10 Oct 1995 18:55:44   OS
   GridItem geloescht

      Rev 1.34   15 Sep 1995 12:39:10   OS
   GetName() implementiert und ColorSetItem entfernt

      Rev 1.33   04 Sep 1995 17:14:32   OS
   +include sbx.hxx

      Rev 1.32   04 Sep 1995 13:40:24   HJS
   add: #include <sbx.hxx>

      Rev 1.31   30 Aug 1995 16:31:48   OS
   Einbau Warnungen fuer Papiergroesse und -orientierung

      Rev 1.30   09 Aug 1995 19:00:28   AMA
   kein GetPresentation

      Rev 1.29   07 Aug 1995 18:19:24   AMA
   Umbau: GetValueText -> GetPresentation

      Rev 1.28   27 Jul 1995 10:39:54   OS
   bDraw auch in Viewopt setzen

      Rev 1.27   05 Jul 1995 19:10:50   OS
   +bCtrlFld fuer Kontrollfelder

      Rev 1.26   03 Jul 1995 19:28:36   OS
   CTOR TestItem korrigiert

      Rev 1.25   27 Jun 1995 19:11:20   OS
   bTest9 fuer MD

      Rev 1.24   27 Jun 1995 17:50:06   ER
   __EXPORT

      Rev 1.23   27 Jun 1995 14:47:48   ER
   segprag

      Rev 1.22   25 Jun 1995 19:31:24   OS
   cfgitems werden jetzt direkt mit swusrpref bzw. swviewoption bearbeitet

      Rev 1.21   24 Jun 1995 10:37:40   SWG
   syntax

      Rev 1.20   23 Jun 1995 17:49:52   OS
   AddPrinterItem setzt PrintOptions selbst, +bPrintDrawing

      Rev 1.19   20 Jun 1995 19:20:42   OS
   CrossHair vom Grid zum DocDisp

      Rev 1.18   24 May 1995 18:09:26   ER
   Segmentierung

      Rev 1.17   12 May 1995 18:15:58   OS
   -SVLook

      Rev 1.16   10 May 1995 19:03:14   OS
   AddPrinterItem umgestellt

      Rev 1.15   10 May 1995 10:59:48   OS
   == > =

      Rev 1.14   28 Apr 1995 17:07:48   OS
   AddPrinterItem veraendert und um Fax und Preview-Optionen erweitert

      Rev 1.13   27 Feb 1995 12:56:18   OS
   segdefs aktualisiert

      Rev 1.12   24 Feb 1995 17:27:34   OS
   Raster-Page vollstaendig

      Rev 1.11   24 Feb 1995 13:00:00   OS
   Grid Page

      Rev 1.10   24 Feb 1995 00:54:08   ER
   sexport

      Rev 1.9   24 Feb 1995 00:32:12   OS
   (ER) add: GridItems

      Rev 1.8   05 Feb 1995 16:08:56   OS
   NT und product

      Rev 1.7   05 Feb 1995 11:33:12   OS
   keine structs mehr

      Rev 1.6   03 Feb 1995 21:20:30   ER
   wegen unresolved externals bei product einige Funktionen
   vor das ifndef product gezogen
   an OS: checken, ob die bei product als inline in das .hxx sollen!

      Rev 1.5   03 Feb 1995 09:33:22   OS
   addprintoptions - item

      Rev 1.4   01 Feb 1995 20:01:16   OS
   SwxxxStruct statisch

      Rev 1.3   24 Jan 1995 19:33:38   OS
   pch Anpassung

      Rev 1.2   23 Jan 1995 07:36:44   OS
   struct in items erzeugt

      Rev 1.1   17 Jan 1995 19:22:18   OS
   Header eingefuegt

------------------------------------------------------------------------*/

diff --git a/sw/source/ui/config/config.hrc b/sw/source/ui/config/config.hrc
new file mode 100644
index 0000000..e7ee890
--- /dev/null
+++ b/sw/source/ui/config/config.hrc
@@ -0,0 +1,98 @@
/*************************************************************************
 *
 *  $RCSfile: config.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:33 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _CONFIG_HRC
#define _CONFIG_HRC

#include "rcid.hrc"

// Dialoge fuer die Konfiguration

// Strings fuer die Konfiguration
#define STR_CFG_SIGNATUR        (RC_CONFIG_BEGIN + 0)
#define DLG_CONFIG_VIEW         (RC_CONFIG_BEGIN + 1)
#define DLG_CONFIG_MISC         (RC_CONFIG_BEGIN + 2)
#define DLG_CONFIG_SAVE         (RC_CONFIG_BEGIN + 3)
#define DLG_CONFIG_PATH         (RC_CONFIG_BEGIN + 4)
#define DLG_CONFIG_MENU         (RC_CONFIG_BEGIN + 5)
#define DLG_CONFIG_KEY          (RC_CONFIG_BEGIN + 6)
#define DLG_CONFIG_TOOLBOX      (RC_CONFIG_BEGIN + 7)
#define DLG_CONFIG_COLOR        (RC_CONFIG_BEGIN + 8)
#define DLG_TBSEL               (RC_CONFIG_BEGIN + 9)
#define DLG_CFGSEL              (RC_CONFIG_BEGIN + 10)
#define DLG_CONFIG              (RC_CONFIG_BEGIN + 11)
#define DLG_MAC_ASSIGN          (RC_CONFIG_BEGIN + 12)

#define MSG_DOUBLE_MENU_ID      (RC_CONFIG_BEGIN + 13)
#define MSG_DOUBLE_ID           (RC_CONFIG_BEGIN + 14)
#define DLG_SYMBOL_SELECT       (RC_CONFIG_BEGIN + 15)
#define DLG_CONFIG_GRID         (RC_CONFIG_BEGIN + 16)
#define DLG_CONFIG_ADDR         (RC_CONFIG_BEGIN + 17)

#define STR_ERROR_PATH          (RC_CONFIG_BEGIN + 25)

#define CONFIG_ACT_END          STR_ERROR_PATH

#if CONFIG_ACT_END > RC_CONFIG_END
#error Resource-Id Ueberlauf in #file, #line
#endif


#endif
diff --git a/sw/source/ui/config/fontcfg.cxx b/sw/source/ui/config/fontcfg.cxx
new file mode 100644
index 0000000..bdfa096
--- /dev/null
+++ b/sw/source/ui/config/fontcfg.cxx
@@ -0,0 +1,240 @@
/*************************************************************************
 *
 *  $RCSfile: fontcfg.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:33 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _FONTCFG_HXX
#include <fontcfg.hxx>
#endif

#ifndef _TOOLS_DEBUG_HXX
#include <tools/debug.hxx>
#endif

#ifndef _COM_SUN_STAR_UNO_ANY_HXX_
#include <com/sun/star/uno/Any.hxx>
#endif
#ifndef _COM_SUN_STAR_UNO_SEQUENCE_HXX_
#include <com/sun/star/uno/Sequence.hxx>
#endif

using namespace utl;
using namespace rtl;
using namespace com::sun::star::uno;
#define C2S(cChar) String::CreateFromAscii(cChar)
#define C2U(cChar) OUString::createFromAscii(cChar)

/* -----------------------------08.09.00 15:52--------------------------------

 ---------------------------------------------------------------------------*/
Sequence<OUString> SwStdFontConfig::GetPropertyNames()
{
    static const char* aPropNames[] =
    {
        "Standard",    // 0
        "Heading",     // 1
        "List",        // 2
        "Caption",     // 3
        "Index",       // 4
    };
    const int nCount = 5;
    Sequence<OUString> aNames(nCount);
    OUString* pNames = aNames.getArray();
    for(int i = 0; i < nCount; i++)
    {
        pNames[i] = OUString::createFromAscii(aPropNames[i]);
    }
    return aNames;
}
/*-----------------03.09.96 15.00-------------------

--------------------------------------------------*/
SwStdFontConfig::SwStdFontConfig() :
    utl::ConfigItem(C2U("Office.Writer/DefaultFont"))
{
    String sDefFont = C2S("Times");
    sFontStandard = sFontList = sFontCaption = sFontIndex = sDefFont;
    sFontOutline = SwStdFontConfig::GetDefaultFor(FONT_OUTLINE);

    Sequence<OUString> aNames = GetPropertyNames();
    Sequence<Any> aValues = GetProperties(aNames);
//  EnableNotification(aNames);
    const Any* pValues = aValues.getConstArray();
    DBG_ASSERT(aValues.getLength() == aNames.getLength(), "GetProperties failed")
    if(aValues.getLength() == aNames.getLength())
    {
        for(int nProp = 0; nProp < aNames.getLength(); nProp++)
        {
            DBG_ASSERT(pValues[nProp].hasValue(), "property value missing")
            if(pValues[nProp].hasValue())
            {
                OUString sVal;
                pValues[nProp] >>= sVal;
                switch(nProp)
                {
                    case 0: sFontStandard= sVal;  break;
                    case 1: sFontOutline = sVal;  break;
                    case 2: sFontList    = sVal;  break;
                    case 3: sFontCaption = sVal;  break;
                    case 4: sFontIndex   = sVal;  break;
                }
            }
        }
    }
}
/* -----------------------------08.09.00 15:58--------------------------------

 ---------------------------------------------------------------------------*/
void    SwStdFontConfig::Commit()
{
    Sequence<OUString> aNames = GetPropertyNames();
    OUString* pNames = aNames.getArray();
    Sequence<Any> aValues(aNames.getLength());
    Any* pValues = aValues.getArray();
    for(int nProp = 0; nProp < aNames.getLength(); nProp++)
    {
        switch(nProp)
        {
            case 0: pValues[nProp] <<= OUString(sFontStandard);  break;
            case 1: pValues[nProp] <<= OUString(sFontOutline );  break;
            case 2: pValues[nProp] <<= OUString(sFontList    );  break;
            case 3: pValues[nProp] <<= OUString(sFontCaption );  break;
            case 4: pValues[nProp] <<= OUString(sFontIndex   );  break;
        }
    }
    PutProperties(aNames, aValues);
}
/* -----------------------------08.09.00 15:56--------------------------------

 ---------------------------------------------------------------------------*/
SwStdFontConfig::~SwStdFontConfig()
{}
/*-----------------18.01.97 10.05-------------------

--------------------------------------------------*/
BOOL SwStdFontConfig::IsFontDefault(USHORT nFontType) const
{
    BOOL bSame;
    const String rStd(C2S("Times"));
    switch( nFontType )
    {
        case FONT_STANDARD:
            bSame = sFontStandard == rStd;
        break;
        case FONT_OUTLINE :
#if defined(UNX)
            bSame = sFontOutline == C2S("helvetica");
#elif defined(WNT) || defined(WIN)
            bSame = sFontOutline == C2S("Arial");
#elif defined(MAC)
            bSame = sFontOutline == C2S("Helvetica");
#elif defined(PM20)
            bSame = sFontOutline == C2S("Helvetica");
#else
#error Defaultfont fuer diese Plattform?
#endif
        break;
        case FONT_LIST    :
            bSame = (sFontList == rStd) && (sFontStandard == rStd);
        break;
        case FONT_CAPTION :
            bSame = (sFontCaption == rStd) && (sFontStandard == rStd);
        break;
        case FONT_INDEX   :
            bSame = (sFontIndex == rStd) && (sFontStandard == rStd);
        break;
    }
    return bSame;
}

/* -----------------11.01.99 13:16-------------------
 * Standards auslesen
 * --------------------------------------------------*/
String  SwStdFontConfig::GetDefaultFor(USHORT nFontType)
{
    String sRet(C2S("Times"));
    switch( nFontType )
    {
        case FONT_STANDARD:
        case FONT_LIST    :
        case FONT_CAPTION :
        case FONT_INDEX   :
        break;
        case FONT_OUTLINE :
#if defined(UNX)
            sRet = C2S("helvetica");
#elif defined(WNT) || defined(WIN)
            sRet = C2S("Arial");
#elif defined(MAC)
            sRet = C2S("Helvetica");
#elif defined(PM20)
            sRet = C2S("Helvetica");
#else
#error Defaultfont fuer diese Plattform?
#endif
        break;
    }
    return sRet;
}
diff --git a/sw/source/ui/config/makefile.mk b/sw/source/ui/config/makefile.mk
new file mode 100644
index 0000000..a808bbd
--- /dev/null
+++ b/sw/source/ui/config/makefile.mk
@@ -0,0 +1,122 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:33 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=..$/..$/..

PRJNAME=sw
TARGET=config

AUTOSEG=true

PROJECTPCH=ui_pch
PDBTARGET=ui_pch
PROJECTPCHSOURCE=..\ui_1st\ui_pch

# --- Settings -----------------------------------------------------

.INCLUDE :  $(PRJ)$/inc$/swpre.mk
.INCLUDE :  settings.mk
.INCLUDE :  $(PRJ)$/inc$/sw.mk

# --- Files --------------------------------------------------------

CXXFILES = \
        barcfg.cxx \
        caption.cxx \
        cfgitems.cxx \
        fontcfg.cxx \
        modcfg.cxx \
        optins.cxx \
        optload.cxx \
        optpage.cxx \
        prtopt.cxx \
        uinums.cxx \
        srcvcfg.cxx \
        usrpref.cxx \
        viewopt.cxx

SRCFILES =	\
        optdlg.src \
        optins.src \
        optload.src \
        redlopt.src \
        cfgstr.src

SLOFILES =	\
        $(SLO)$/barcfg.obj \
        $(SLO)$/caption.obj \
        $(SLO)$/cfgitems.obj \
        $(SLO)$/fontcfg.obj \
        $(SLO)$/modcfg.obj \
        $(SLO)$/optins.obj \
        $(SLO)$/optload.obj \
        $(SLO)$/optpage.obj \
        $(SLO)$/prtopt.obj \
        $(SLO)$/uinums.obj \
        $(SLO)$/srcvcfg.obj \
        $(SLO)$/usrpref.obj \
        $(SLO)$/viewopt.obj

# --- Targets -------------------------------------------------------

.INCLUDE :  target.mk

diff --git a/sw/source/ui/config/modcfg.cxx b/sw/source/ui/config/modcfg.cxx
new file mode 100644
index 0000000..d2c755f
--- /dev/null
+++ b/sw/source/ui/config/modcfg.cxx
@@ -0,0 +1,573 @@
/*************************************************************************
 *
 *  $RCSfile: modcfg.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:33 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _STREAM_HXX //autogen
#include <tools/stream.hxx>
#endif
#ifndef _SV_SVAPP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _MAILENUM_HXX //autogen
#include <goodies/mailenum.hxx>
#endif
#ifndef _SVX_SVXIDS_HRC //autogen
#include <svx/svxids.hrc>
#endif
#ifndef _SVX_SVXENUM_HXX //autogen
#include <svx/svxenum.hxx>
#endif
#ifndef _WORDSEL_HXX
#include <svtools/wordsel.hxx>
#endif
#ifndef _TOOLS_DEBUG_HXX //autogen
#include <tools/debug.hxx>
#endif
#ifndef _FACTORY_HXX //autogen
#include <so3/factory.hxx>
#endif

#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _ITABENUM_HXX
#include <itabenum.hxx>
#endif
#ifndef _CFGID_H
#include <cfgid.h>
#endif
#ifndef _MODCFG_HXX
#include <modcfg.hxx>
#endif
#ifndef _CFGSTR_HRC
#include <cfgstr.hrc>
#endif
#ifndef _FLDUPDE_HXX
#include <fldupde.hxx>
#endif


#define VERSION_01      1
#define VERSION_02      2
#define VERSION_03      3
#define VERSION_04      4
#define VERSION_05      5
#define VERSION_06      6
#define VERSION_07      7
#define VERSION_08      8
#define VERSION_09      9
#define VERSION_10      10
#define VERSION_11      11
#define VERSION_12      12
#define VERSION_13      13
#define VERSION_14      14      //nFldUpdateFlags
#define VERSION_15      15      //Insert-Flags auch fuer HTML
#define VERSION_16      16      //Insert-Flags auch fuer HTML
#define VERSION_17      17      //Preview flags AutoText + Index
#define VERSION_18      18      //bDefaultFontsInCurrDocOnly
#define MODCFG_VERSION  VERSION_18

SV_IMPL_PTRARR_SORT(InsCapOptArr, InsCaptionOptPtr)

/* -----------------03.11.98 13:46-------------------
 *
 * --------------------------------------------------*/

InsCaptionOpt* InsCaptionOptArr::Find(const SwCapObjType eType, const SvGlobalName *pOleId) const
{
    for (USHORT i = 0; i < Count(); i++ )
    {
        InsCaptionOpt* pObj = GetObject(i);
        if (pObj->GetObjType() == eType &&
            (eType != OLE_CAP ||
             (pOleId &&
              (pObj->GetOleId() == *pOleId ||
               SvFactory::GetAutoConvertTo(pObj->GetOleId()) == *pOleId))))
            return pObj;
    }

    return 0;
}

/* -----------------03.11.98 15:05-------------------
 *
 * --------------------------------------------------*/

const InsCaptionOpt* SwModuleOptions::GetCapOption(BOOL bHTML, const SwCapObjType eType, const SvGlobalName *pOleId)
{
    return bHTML ? aHTMLCapOptions.Find(eType, pOleId) : aCapOptions.Find(eType, pOleId);
}

/* -----------------03.11.98 15:05-------------------
 *
 * --------------------------------------------------*/

BOOL SwModuleOptions::SetCapOption(BOOL bHTML, const InsCaptionOpt* pOpt)
{
    BOOL bRet = FALSE;

    if (pOpt)
    {
        InsCaptionOptArr& rArr = bHTML ? aHTMLCapOptions : aCapOptions;
        InsCaptionOpt *pObj = rArr.Find(pOpt->GetObjType(), &pOpt->GetOleId());

        if (pObj)
        {
            *pObj = *pOpt;
            SetDefault(FALSE);
        }
        else
            rArr.Insert(new InsCaptionOpt(*pOpt));

        SetDefault(FALSE);
        bRet = TRUE;
    }

    return bRet;
}

/*-----------------13.01.97 12.44-------------------

--------------------------------------------------*/

int SwModuleOptions::Load(SvStream& rStream)
{
    rtl_TextEncoding eEncoding = gsl_getSystemTextEncoding();
    int nRet;
    SetDefault(FALSE);
    UINT16 nVersion;
    rStream >> nVersion;
    if(nVersion >= VERSION_01)
    {
        UINT32 nColor;
        UINT16 nVal;
        rStream >>  nVal;
        nDefTab = nVal;

        rStream >>  nVal;
        nTblHMove = nVal;

        rStream >>  nVal;
        nTblVMove = nVal;

        rStream >> nVal;
        nTblHInsert = nVal;

        rStream >> nVal;
        nTblVInsert = nVal;

        BYTE bVal;
        rStream >> bVal;
        eUserMetric = (FieldUnit)bVal;
        if (nVersion >= VERSION_08)
        {
            rStream >> bVal;
            eWebUserMetric = (FieldUnit)bVal;
        }


        rStream >> bVal;
        eTblChgMode = (TblChgMode)bVal;

        if ( nVersion >= VERSION_02 )
        {
            rStream >> bVal;
            bGrfToGalleryAsLnk = BOOL(bVal);
        }
        if ( nVersion >= VERSION_03 )
        {
            rStream >> bVal;
            nMailingFormats = bVal;

            rStream >> bVal;
            bSinglePrintJob = BOOL(bVal);

            rStream >> bVal;
            bNumAlignSize = BOOL(bVal);
        }

        if ( nVersion >= VERSION_04 )
        {
            rStream >> bVal;
            bNameFromColumn = bVal;

            rStream.ReadByteString(sMailingPath, eEncoding);
            rStream.ReadByteString(sMailName, eEncoding);
        }
        if ( nVersion >= VERSION_05 )
        {

            rStream >> nVal;    aInsertAttr.nItemId = nVal;
            rStream >> nVal;    aInsertAttr.nAttr = nVal;
            rStream >> nColor;  aInsertAttr.nColor = nColor;

            rStream >> nVal;    aDeletedAttr.nItemId = nVal;
            rStream >> nVal;    aDeletedAttr.nAttr = nVal;
            rStream >> nColor;  aDeletedAttr.nColor = nColor;

            rStream >> nVal;    nMarkAlign = nVal;
            rStream >> nColor;  aMarkColor.SetColor(nColor);
        }

        if( nVersion >= VERSION_06 )
        {
            rStream >> nVal;    aFormatAttr.nItemId = nVal;
            rStream >> nVal;    aFormatAttr.nAttr = nVal;
            rStream >> nColor;  aFormatAttr.nColor = nColor;
        }

        if( nVersion >= VERSION_07 )
            rStream.ReadByteString(sWordDelimiter, eEncoding);

        if (nVersion >= VERSION_09)
        {
            rStream >> bVal;    bInsWithCaption = bVal;
            if (nVersion == VERSION_09)
                rStream >> bVal;    // Flag gibts nicht mehr

            if (nVersion < VERSION_13)
            {   // Flags gibts nicht mehr
                rStream >> bVal;
                rStream >> bVal;
            }

            rStream >> nVal;
            InsCaptionOpt aOpt;

            for (USHORT i = 0; i < nVal; i++)
            {
                rStream >> aOpt;
                aCapOptions.Insert(new InsCaptionOpt(aOpt));
            }
        }

        if (nVersion >= VERSION_10)
        {
            if (nVersion < VERSION_13)
                rStream >> bVal;    // Flag gibts nicht mehr

            if (nVersion >= VERSION_11)
            {
                rStream >> bVal;    bInsTblFormatNum = bVal;
                rStream >> bVal;    bInsTblAlignNum = bVal;
                rStream >> nVal;    nLinkMode = nVal;

                if (nVersion == VERSION_12)
                    rStream >> bVal;    // Flag gibts nicht mehr

                if (nVersion >= VERSION_13)
                {
                    rStream >> nVal;    nInsTblFlags = nVal;
                }
                if(nVersion >= VERSION_14)
                {
                    rStream>> nVal; nFldUpdateFlags = nVal;
                }
                else
                    nFldUpdateFlags = AUTOUPD_OFF;
                if(nVersion >= VERSION_15)
                {
                    rStream >> bVal; bHTMLInsWithCaption = bVal;
                    rStream >> bVal; bHTMLInsTblFormatNum = bVal;
                    rStream >> bVal; bHTMLInsTblAlignNum = bVal;
                    rStream >> nVal; nHTMLInsTblFlags = nVal;
                    rStream >> nVal;
                    InsCaptionOpt aOpt;

                    for (USHORT i = 0; i < nVal; i++)
                    {
                        rStream >> aOpt;
                        aHTMLCapOptions.Insert(new InsCaptionOpt(aOpt));
                    }
                }
                else
                {
                    bHTMLInsWithCaption = bHTMLInsTblAlignNum = FALSE;
                    bHTMLInsTblFormatNum = TRUE;
                    nHTMLInsTblFlags = ALL_TBL_INS_ATTR;
                }

                if( nVersion >= VERSION_16)
                {
                    rStream >> bVal;    bInsTblChangeNumFormat = bVal;
                    rStream >> bVal;    bHTMLInsTblChangeNumFormat = bVal;
                    if(nVersion >= VERSION_17)
                    {
                        rStream >> bVal;      bShowAutoTextPreview = bVal;
                        rStream >> bVal;      bShowIndexPreview = bVal;
                        if(nVersion >= VERSION_18)
                        {
                            rStream >> bVal;      bDefaultFontsInCurrDocOnly = bVal;
                        }
                    }
                }
            }
        }

        nRet = SfxConfigItem::ERR_OK;
    }
    else
        nRet = SfxConfigItem::WARNING_VERSION;

    return nRet;
}

/*-----------------13.01.97 12.44-------------------

--------------------------------------------------*/

BOOL SwModuleOptions::Store(SvStream& rStream)
{
    rtl_TextEncoding eEncoding = gsl_getSystemTextEncoding();
    rStream << (UINT16) MODCFG_VERSION;
    rStream << (UINT16) nDefTab;
    rStream << (UINT16) nTblHMove;
    rStream << (UINT16) nTblVMove;
    rStream << (UINT16) nTblHInsert;
    rStream << (UINT16) nTblVInsert;
    rStream << (BYTE)   eUserMetric;
    rStream << (BYTE)   eWebUserMetric;
    rStream << (BYTE)   eTblChgMode;
    rStream << (BYTE)   bGrfToGalleryAsLnk;
    rStream << (BYTE)   nMailingFormats;
    rStream << (BYTE)   bSinglePrintJob;
    rStream << (BYTE)   bNumAlignSize;
    rStream << (BYTE)   bNameFromColumn;
    rStream.WriteByteString(sMailingPath, eEncoding);
    rStream.WriteByteString(sMailName, eEncoding);
    rStream << (UINT16) aInsertAttr.nItemId;
    rStream << (UINT16) aInsertAttr.nAttr;
    rStream << (UINT32) aInsertAttr.nColor;
    rStream << (UINT16) aDeletedAttr.nItemId;
    rStream << (UINT16) aDeletedAttr.nAttr;
    rStream << (UINT32) aDeletedAttr.nColor;
    rStream << (UINT16) nMarkAlign;
    rStream << (UINT32) aMarkColor.GetColor();
    rStream << (UINT16) aFormatAttr.nItemId;
    rStream << (UINT16) aFormatAttr.nAttr;
    rStream << (UINT32) aFormatAttr.nColor;
    rStream.WriteByteString(sWordDelimiter, eEncoding);
    rStream << (BYTE)   bInsWithCaption;
    rStream << (UINT16) aCapOptions.Count();
    for (USHORT i = 0; i < aCapOptions.Count(); i++)
        rStream << *aCapOptions[i];
    rStream << (BYTE)   bInsTblFormatNum;
    rStream << (BYTE)   bInsTblAlignNum;
    rStream << (UINT16) nLinkMode;
    rStream << (UINT16) nInsTblFlags;
    rStream << (UINT16) nFldUpdateFlags;

    rStream << (BYTE)   bHTMLInsWithCaption;
    rStream << (BYTE)   bHTMLInsTblFormatNum;
    rStream << (BYTE)   bHTMLInsTblAlignNum;
    rStream << (UINT16) nHTMLInsTblFlags;
    rStream << (UINT16) aHTMLCapOptions.Count();
    for( i = 0; i < aHTMLCapOptions.Count(); i++)
        rStream << *aHTMLCapOptions[i];
    rStream << (BYTE)   bHTMLInsTblChangeNumFormat;
    rStream << (BYTE)   bInsTblChangeNumFormat;

    rStream << (BYTE)   bShowAutoTextPreview;
    rStream << (BYTE)   bShowIndexPreview;

    rStream << (BYTE)    bDefaultFontsInCurrDocOnly;
    return SfxConfigItem::ERR_OK;
}
/*-----------------13.01.97 12.44-------------------

--------------------------------------------------*/

void SwModuleOptions::UseDefault()
{
    MeasurementSystem eSys = Application::GetAppInternational().GetMeasurementSystem();
    if(MEASURE_METRIC != eSys)
    {
        eUserMetric = eWebUserMetric = FUNIT_INCH;
        nDefTab = 720;                  // 1/2"
        nTblHMove = nTblVMove = 360;    // 1/4"
        nTblHInsert = 360;              // 1/4"
        nTblVInsert = 1440;             // 1"
    }
    else
    {
        eUserMetric = eWebUserMetric = FUNIT_CM;
        nDefTab = 709;                  // 1,25 cm
        nTblHMove = nTblVMove = MM50;   // 0,5  cm
        nTblHInsert = MM50;             // 0,5  cm
        nTblVInsert = 1415;             // 2,5  cm
    }

    eTblChgMode = TBLVAR_CHGABS;

    aInsertAttr.nItemId = SID_ATTR_CHAR_UNDERLINE;
    aInsertAttr.nAttr = UNDERLINE_SINGLE;
    aInsertAttr.nColor = COL_TRANSPARENT;
    aDeletedAttr.nItemId = SID_ATTR_CHAR_STRIKEOUT;
    aDeletedAttr.nAttr = STRIKEOUT_SINGLE;
    aDeletedAttr.nColor = COL_TRANSPARENT;
    aFormatAttr.nItemId = SID_ATTR_CHAR_WEIGHT;
    aFormatAttr.nAttr = WEIGHT_BOLD;
    aFormatAttr.nColor = COL_BLACK;
    nMarkAlign = HORI_OUTSIDE;
    aMarkColor.SetColor(COL_BLACK);

    bGrfToGalleryAsLnk = TRUE;

    nMailingFormats = TXTFORMAT_OFFICE;
    bNumAlignSize = TRUE;
    bSinglePrintJob = FALSE;
    bNameFromColumn = FALSE;

    sWordDelimiter = String::CreateFromAscii("() \t\xa\x1");

    bHTMLInsWithCaption = bInsWithCaption = FALSE;

    nHTMLInsTblFlags = nInsTblFlags = ALL_TBL_INS_ATTR;
    bHTMLInsTblFormatNum = bInsTblFormatNum = TRUE;
    bHTMLInsTblChangeNumFormat = bInsTblChangeNumFormat = TRUE;
    bHTMLInsTblAlignNum = bInsTblAlignNum = TRUE;

    nLinkMode = MANUAL;
    nFldUpdateFlags = AUTOUPD_FIELD_ONLY;

    bShowAutoTextPreview = TRUE;
    bShowIndexPreview = TRUE;

    bDefaultFontsInCurrDocOnly = FALSE;

    aCapOptions.DeleteAndDestroy( 0, aCapOptions.Count() );
    aHTMLCapOptions.DeleteAndDestroy( 0, aCapOptions.Count() );

    SfxConfigItem::UseDefault();
}

/*-----------------13.01.97 12.44-------------------

--------------------------------------------------*/

SwModuleOptions::SwModuleOptions() :
    SfxConfigItem( CFG_SW_MODULE )
{
    UseDefault();
}

/*-----------------13.01.97 13.11-------------------

--------------------------------------------------*/

String SwModuleOptions::GetName() const
{
    return String(SW_RES(STR_CFG_MODULE));
}

/*--------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.34  2000/09/18 16:05:15  willem.vandorp
    OpenOffice header added.

    Revision 1.33  2000/07/20 13:16:58  jp
    change old txtatr-character to the two new characters

    Revision 1.32  2000/06/13 13:22:43  os
    #75770# Doc only flag in standard font TabPage now persistent

    Revision 1.31  2000/05/18 14:57:43  os
    append CH_TXTATR instead of 0xff in CreateFromAscii

    Revision 1.30  2000/04/11 08:02:23  os
    UNICODE

    Revision 1.29  2000/02/11 14:43:50  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.28  1999/12/29 07:54:07  os
    #71320# flags for AutoText and index preview

    Revision 1.27  1999/04/20 16:58:38  JP
    Task #65061#: neu: ZahlenFormaterkennung abschaltbar


      Rev 1.26   20 Apr 1999 18:58:38   JP
   Task #65061#: neu: ZahlenFormaterkennung abschaltbar

      Rev 1.25   15 Mar 1999 09:46:20   MA
   #63047# neue Defaults

      Rev 1.24   11 Mar 1999 23:56:40   JP
   Task #63171#: Optionen fuer Feld-/LinkUpdate Doc oder Modul lokal

      Rev 1.23   17 Feb 1999 08:37:56   OS
   #58158# Einfuegen TabPage auch in HTML-Docs

*************************************************************************/



diff --git a/sw/source/ui/config/optdlg.hrc b/sw/source/ui/config/optdlg.hrc
new file mode 100644
index 0000000..2085ae2
--- /dev/null
+++ b/sw/source/ui/config/optdlg.hrc
@@ -0,0 +1,263 @@
/*************************************************************************
 *
 *  $RCSfile: optdlg.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:33 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

/* TabPage Ansicht*/
#define GB_DISP         1
#define GB_NOPRINT              2
#define GB_WINDOW               3
#define GB_BACK                 4
#define GB_METRIC       5
#define ST_METRIC       6
#define GB_TAB          7
#define MF_TAB                  8

#define CB_GRF              1
#define CB_TBL                  2
#define CB_DRWFAST              3
#define CB_FIELD                4
#define CB_PARA                 5
#define CB_TAB                  6
#define CB_SPACE                7
#define CB_HSPACE               8
#define CB_SHYPH                9
#define CB_HIDDEN               10
#define CB_BREAK                11
#define CB_TXTBEG               12
#define CB_TABBEG               13
#define CB_CROSS        14
#define CB_HSCROLL              15
#define CB_VSCROLL              16
#define CB_HRULER               17
#define CB_VRULER               18
#define CB_IDX_ENTRY            19
#define CB_FOOTBACK             20
#define CB_FLDBACK              21
#define GB_LINE                 22
#define CB_POSTIT               23
#define LB_METRIC       24
#define CB_BIGHANDLE                  25

#define CB_TEST1        25
#define CB_TEST2        26
#define CB_TEST3        27
#define CB_TEST4        28
#define CB_TEST5        29
#define CB_TEST6        30
#define CB_TEST7        31
#define CB_TEST8        32
#define CB_TEST9        33
#define CB_TEST10       34
#define GB_TEST         35

#define CB_HIDDEN_PARA  36  //Mittendrin, damit die HelpIds zum FPII kompatibel bleiben
#define CB_SMOOTH_SCROLL 37

#define BT_OK           38
#define BT_CANCEL       39
#define BT_MORE         40
#define BT_GRID         41
#define MF_HFRAME       42
#define MF_VFRAME       43

#define CB_INDEX        44

#define LB_COLOR        50
#define GB_1            51
#define WIN_COLOR       52
#define ED_COLORNAME    53
#define GB_2            54
#define BT_EDIT         55
#define BT_NEW          56
#define BT_DELETE       57
#define BT_DEFAULT      58
#define CB_HANDLE       59
#define CB_SECT_BOUNDS  60
// Print-Extra-Page
#define CB_PGRF            61
#define CB_PTAB            62
#define CB_PDRAW           63
#define CB_LEFTP           64
#define CB_RIGHTP          65
#define CB_REVERSE         66
#define CB_PROSPECT        67
#define CB_SINGLEJOBS      68
#define CB_CTRLFLD         69
#define CB_PAPERFROMSETUP  70
#define GRP_1              71
#define GRP_2              72
#define GRP_3              73
#define GRP_4              74
#define GRP_5              75
#define GB_FAX             76
#define CB_BACKGROUND      79

#define RB_NO              80
#define RB_ONLY            81
#define RB_END             82
#define RB_PAGEEND         83
#define LB_FAX             86
#define CB_BLACK_FONT      87

//Grid-Page
#define GB_GRID             90
#define MTR_FLD_GRID        2
#define BTN_MORE            3
#define GRP_DRAWGRID        4
#define GRP_OPTIONS         5
#define GRP_SNAPGRID        6
#define GRP_ORIGIN          7
#define CBX_GRID_SNAP       8
#define CBX_SYNCHRONIZE     9
#define CBX_EQUAL_GRID     10
#define CBX_SNAPGRID       11
#define CBX_ORIGIN          12
#define CBX_GRID_VISIBLE    13
#define MTR_FLD_DRAW_Y      18
#define MTR_FLD_DRAW_X      21
#define MTR_FLD_DIVISION_X  22
#define MTR_FLD_DIVISION_Y  23
#define FT_DRAW_X           26
#define FT_DRAW_Y           27
#define FT_RESOLUTION       28
#define FT_DIVISION         29
#define CBX_CROSSHAIR       30
#define CB_RULER            31


// DefaultFarben
#define SW_COLOR_START              1
#define CL_BLACK                    (SW_COLOR_START +  0)
#define CL_BLUE                     (SW_COLOR_START +  1)
#define CL_GREEN                    (SW_COLOR_START +  2)
#define CL_CYAN                     (SW_COLOR_START +  3)
#define CL_RED                      (SW_COLOR_START +  4)
#define CL_MAGENTA                  (SW_COLOR_START +  5)
#define CL_BROWN                    (SW_COLOR_START +  6)
#define CL_GRAY                     (SW_COLOR_START +  7)
#define CL_LIGHTGRAY                (SW_COLOR_START +  8)
#define CL_LIGHTBLUE                (SW_COLOR_START +  9)
#define CL_LIGHTGREEN               (SW_COLOR_START + 10)
#define CL_LIGHTCYAN                (SW_COLOR_START + 11)
#define CL_LIGHTRED                 (SW_COLOR_START + 12)
#define CL_LIGHTMAGENTA             (SW_COLOR_START + 13)
#define CL_YELLOW                   (SW_COLOR_START + 14)
#define CL_WHITE                    (SW_COLOR_START + 15)
#define SW_COLOR_END                CL_WHITE

// Tabpage Grundschriften
#define FT_STANDARD         90
#define LB_STANDARD                     91
#define FT_TITLE                        92
#define LB_TITLE                        93
#define FT_LIST                         94
#define LB_LIST                         95
#define FT_LABEL                        96
#define LB_LABEL                        97
#define FT_IDX                          98
#define LB_IDX                          99
#define GB_STDCHR                      100
#define PB_STANDARD                    101
#define CB_DOCONLY                     102

//Tabpage Tabelle
#define GB_MOVE             110
#define FT_ROWMOVE                  111
#define MF_ROWMOVE                  112
#define FT_COLMOVE                  113
#define MF_COLMOVE                  114
#define GB_INSERT                   115
#define FT_ROWINSERT                    116
#define MF_ROWINSERT                    117
#define FT_COLINSERT                    118
#define MF_COLINSERT                    119
#define GB_HANDLING                     120
#define RB_FIX                      121
#define RB_FIXPROP                  122
#define RB_VAR                      123
#define FT_FIX                      124
#define FT_FIXPROP                  125
#define FT_VAR                      126
#define FT_DESC                     127

#define GB_COLOR                    130
#define FT_SGML                     131
#define LB_SGML                     132
#define FT_COMMENT                  133
#define LB_COMMENT                  134
#define FT_KEYWD                    135
#define LB_KEYWD                    136
#define FT_UNKNOWN                  137
#define LB_UNKNOWN                  138

#define GB_SHDWCRSFLAG                 1
#define CB_SHDWCRSONOFF                2
#define GB_SHDWCRSMODE                 3
#define FT_SHDWCRSFILLMODE             4
#define RB_SHDWCRSFILLMARGIN           5
#define RB_SHDWCRSFILLINDENT           6
#define RB_SHDWCRSFILLTAB              7
#define RB_SHDWCRSFILLSPACE            8
#define GB_SHDWCRSCOLOR                9
#define FT_SHDWCRSCOLOR               10
#define LB_SHDWCRSCOLOR               11
#define CB_ALLOW_IN_PROT              12
#define GB_CRSR_OPT                   13

diff --git a/sw/source/ui/config/optdlg.src b/sw/source/ui/config/optdlg.src
new file mode 100644
index 0000000..7b79894f
--- /dev/null
+++ b/sw/source/ui/config/optdlg.src
@@ -0,0 +1,3186 @@
/*************************************************************************
 *
 *  $RCSfile: optdlg.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:33 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
/* StarView ressource file */
#ifndef _SFX_HRC
#include <sfx2/sfx.hrc>
#endif
#ifndef _SVX_DIALOGS_HRC
#include <svx/dialogs.hrc>
#endif
#include "globals.hrc"
#include "config.hrc"
#include "optdlg.hrc"
#include "helpid.h"

/**************************************************************************/
/*                                                                        */
/*  TabPage Ansicht/Inhalt                                                */
/*                                                                        */
/**************************************************************************/
TabPage TP_CONTENT_OPT
{
    HelpID = HID_CONTENT_OPT ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Hide = TRUE ;
    GroupBox GB_DISP
    {
        Pos = MAP_APPFONT ( 6 , 2 ) ;
        Size = MAP_APPFONT ( 120 , 69 ) ;
        Text = "Anzeigen" ;
        Text [ ENGLISH ] = "Display" ;
        Text [ norwegian ] = "Display" ;
        Text [ italian ] = "Mostra" ;
        Text [ portuguese_brazilian ] = "Display" ;
        Text [ portuguese ] = "Ver" ;
        Text [ finnish ] = "Display" ;
        Text [ danish ] = "Vis" ;
        Text [ french ] = "Afficher" ;
        Text [ swedish ] = "Visa" ;
        Text [ dutch ] = "Weergeven" ;
        Text [ spanish ] = "Mostrar" ;
        Text [ english_us ] = "Display" ;
        Group = TRUE ;
        Text[ chinese_simplified ] = "ÏÔʾ";
        Text[ russian ] = "Ïîêàçàòü";
        Text[ polish ] = "Poka¿";
        Text[ japanese ] = "•\\ަ";
        Text[ chinese_traditional ] = "Åã¥Ü";
        Text[ arabic ] = "ÅÙåÇÑ";
        Text[ greek ] = "ÅìöÜíéóç";
        Text[ korean ] = "Ç¥½Ã";
        Text[ turkish ] = "Görüntüle";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_GRF
    {
        Pos = MAP_APPFONT ( 12 , 11 ) ;
        Size = MAP_APPFONT ( 108 , 10 ) ;
        Text = "~Grafiken und Objekte" ;
        Text [ ENGLISH ] = "Gra~phics and Objects" ;
        Text [ norwegian ] = "Gra~phics and Objects" ;
        Text [ italian ] = "~Immagini e oggetti" ;
        Text [ portuguese_brazilian ] = "Gra~phics and Objects" ;
        Text [ portuguese ] = "~Imagens e objectos" ;
        Text [ french ] = "~Images et objets" ;
        Text [ dutch ] = "~Afbeeldingen en objecten" ;
        Text [ spanish ] = "~Imágenes y objetos" ;
        Text [ danish ] = "Billeder og objekter" ;
        Text [ swedish ] = "~Grafiker och objekt" ;
        Text [ finnish ] = "Gra~phics and Objects" ;
        Text [ english_us ] = "~Graphics and objects" ;
        TabStop = TRUE ;
        Group = TRUE ;
        Text[ chinese_simplified ] = "ͼÐκͶÔÏó(~O)";
        Text[ russian ] = "Ðèñóíêè è îáúåêòû";
        Text[ polish ] = "Gr~afiki i obiekty";
        Text[ japanese ] = "}‚ƵÌÞ¼Þª¸Ä(~O)";
        Text[ chinese_traditional ] = "¹Ï¤ù©Mª«¥ó(~O)";
        Text[ arabic ] = "ÕæÑ æßÇÆäÇÊ";
        Text[ greek ] = "ÃñáöéêÜ êáé áíôéêåßìåíá";
        Text[ korean ] = "±×·¡ÇȰú °³Ã¼(~G)";
        Text[ turkish ] = "Grafik ve nesneler";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_TBL
    {
        Pos = MAP_APPFONT ( 12 , 23 ) ;
        Size = MAP_APPFONT ( 108 , 10 ) ;
        Text = "~Tabellen          " ;
        Text [ ENGLISH ] = "~Tables" ;
        Text [ norwegian ] = "~Tables" ;
        Text [ italian ] = "~Tabelle " ;
        Text [ portuguese_brazilian ] = "~Tabelas " ;
        Text [ portuguese ] = "~Tabelas " ;
        Text [ finnish ] = "~Taulukot" ;
        Text [ danish ] = "Tabeller " ;
        Text [ french ] = "~Tableaux " ;
        Text [ swedish ] = "Tabe~ller                  " ;
        Text [ dutch ] = "~Tabellen           " ;
        Text [ spanish ] = "~Tablas                    " ;
        Text [ english_us ] = "~Tables " ;
        Text[ chinese_simplified ] = "±í¸ñ(~A)";
        Text[ russian ] = "Òàáëèöû                    ";
        Text[ polish ] = "Ta~bele                              ";
        Text[ japanese ] = "•\\(~A)";
        Text[ chinese_traditional ] = "ªí®æ(~A)";
        Text[ arabic ] = "ÌÏÇæá          ";
        Text[ greek ] = "Ðßíáêåò          ";
        Text[ korean ] = "ǥ          (~T)";
        Text[ turkish ] = "Tablolar          ";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_DRWFAST
    {
        Pos = MAP_APPFONT ( 12 , 35 ) ;
        Size = MAP_APPFONT ( 108 , 10 ) ;
        Text = "Zeichnungen und ~Kontrollfelder" ;
        Text [ ENGLISH ] = "Dra~wings and controls" ;
        Text [ norwegian ] = "Dra~wings" ;
        Text [ italian ] = "~Disegni e controlli" ;
        Text [ portuguese_brazilian ] = "Dra~wings" ;
        Text [ portuguese ] = "~Desenhos e controlos" ;
        Text [ french ] = "~Dessins et champs de contrôle" ;
        Text [ dutch ] = "Tekeningen en ~controlevelden" ;
        Text [ spanish ] = "~Dibujos y campos de control" ;
        Text [ danish ] = "Tegninger og kontrolelementer" ;
        Text [ swedish ] = "Teckningar och ~kontrollfält" ;
        Text [ finnish ] = "Dra~wings" ;
        Text [ english_us ] = "Dra~wings and controls" ;
        Text[ chinese_simplified ] = "»æÍ¼ºÍ¿Ø¼þ×Ö¶Î(~D)";
        Text[ russian ] = "Ðèñóíêè è ýëåìåíòû óïðàâëåíèÿ";
        Text[ polish ] = "Rysunki i pola kontrolne";
        Text[ japanese ] = "}Œ`•`‰æ‚ƺÝÄÛ°Ù(~D)";
        Text[ chinese_traditional ] = "ø¹Ï©M±±¨î¶µ(~D)";
        Text[ arabic ] = "ÑÓæãÇÊ æÚäÇÕÑ ÊÍßã";
        Text[ greek ] = "Ó÷Ýäéá ~êáé Ðåäßá åëÝã÷ïõ";
        Text[ korean ] = "±×¸®±â¿Í ÄÁÆ®·Ñ(~W)";
        Text[ turkish ] = "Çizim ve ~komut alanlarý";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_FIELD
    {
        Pos = MAP_APPFONT ( 12 , 47 ) ;
        Size = MAP_APPFONT ( 108 , 10 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? F~eldname : F~eldname anzeigen */
        Text = "F~eldnamen" ;
        Text [ ENGLISH ] = "~Field names" ;
        Text [ english_us ] = "~Field codes" ;
        Text [ swedish ] = "Fält~namn" ;
        Text [ danish ] = "Feltnavne" ;
        Text [ italian ] = "Nome di campo" ;
        Text [ spanish ] = "~Nombres del campo" ;
        Text [ french ] = "~Noms de champ" ;
        Text [ dutch ] = "~Veldnaam" ;
        Text [ portuguese_brazilian ] = "F~eldnamen" ;
        Text [ portuguese ] = "Nomes de ~campo" ;
        Text[ chinese_simplified ] = "×Ö¶ÎÃû³Æ(~C)";
        Text[ russian ] = "Èìåíà ïîëÿ";
        Text[ polish ] = "Nazwy pól";
        Text[ japanese ] = "̨°ÙÄޖ¼(~C)";
        Text[ chinese_traditional ] = "Äæ¦ì¦WºÙ(~C)";
        Text[ arabic ] = "ÃÓãÇÁ ÇáÍÞá";
        Text[ greek ] = "Ïíüìáôá ðåäßùí";
        Text[ korean ] = "Çʵå ÄÚµå(~F)";
        Text[ turkish ] = "Alan adlarý";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_POSTIT
    {
        Pos = MAP_APPFONT ( 12 , 59 ) ;
        Size = MAP_APPFONT ( 108 , 10 ) ;
        Text = "N~otizen" ;
        Text [ ENGLISH ] = "N~otes" ;
        Text [ english_us ] = "~Notes" ;
        Text [ swedish ] = "Anteckninga~r" ;
        Text [ danish ] = "Noter" ;
        Text [ italian ] = "N~ote" ;
        Text [ spanish ] = "~Notas" ;
        Text [ french ] = "~Notes" ;
        Text [ dutch ] = "Aa~ntekeningen" ;
        Text [ portuguese_brazilian ] = "N~otizen" ;
        Text [ portuguese ] = "Anotações" ;
        Text[ chinese_simplified ] = "±¸×¢(~N)";
        Text[ russian ] = "Ïðèìå÷àíèÿ";
        Text[ polish ] = "No~tatki";
        Text[ japanese ] = "ÒӒ (~N)";
        Text[ chinese_traditional ] = "³Æª`(~N)";
        Text[ arabic ] = "ãáÇÍÙÇÊ";
        Text[ greek ] = "Óçìåéþóåéò";
        Text[ korean ] = "¸Þ¸ð(~N)";
        Text[ turkish ] = "Notlar";
        Text[ language_user1 ] = " ";
    };
    GroupBox GB_BACK
    {
        Pos = MAP_APPFONT ( 6 , 74 ) ;
        Size = MAP_APPFONT ( 120 , 57 ) ;
        Text = "Hinterlegung" ;
        Text [ ENGLISH ] = "Background" ;
        Text [ norwegian ] = "Background" ;
        Text [ italian ] = "Sfondo" ;
        Text [ portuguese_brazilian ] = "Fundo" ;
        Text [ portuguese ] = "Destaque" ;
        Text [ finnish ] = "Tausta" ;
        Text [ danish ] = "Underlægning" ;
        Text [ french ] = "Trame de fond" ;
        Text [ swedish ] = "Bakgrund" ;
        Text [ dutch ] = "Achtergrond" ;
        Text [ spanish ] = "Destacar" ;
        Text [ english_us ] = "Highlighting" ;
        Group = TRUE ;
        Text[ chinese_simplified ] = "»ÒÉ«±³¾°±ê¼Ç";
        Text[ russian ] = "Çàòåíåíèå";
        Text[ polish ] = "Cieniowanie";
        Text[ japanese ] = "ŠDF‚ÌÊÞ¯¸‚Å‹­’²";
        Text[ chinese_traditional ] = "¦Ç¦â­I´º¼Ð°O";
        Text[ arabic ] = "ÊÙáíá";
        Text[ language_user1 ] = " ";
        Text[ greek ] = "Óêßáóç ðåäßùí";
        Text[ korean ] = "°­Á¶";
        Text[ turkish ] = "Vurgu";
    };
    CheckBox CB_IDX_ENTRY
    {
        Pos = MAP_APPFONT ( 12 , 83 ) ;
        Size = MAP_APPFONT ( 108 , 10 ) ;
        Text = "Verzeichniseintr~äge" ;
        Text [ ENGLISH ] = "Index entries" ;
        Text [ norwegian ] = "Index entries" ;
        Text [ italian ] = "~Voci di indice" ;
        Text [ portuguese_brazilian ] = "Entradas do índice" ;
        Text [ portuguese ] = "~Entradas de índice" ;
        Text [ finnish ] = "Hakemistotekstit" ;
        Text [ danish ] = "Indekselementer" ;
        Text [ french ] = "E~ntrées d'index" ;
        Text [ swedish ] = "Förte~ckningsposter" ;
        Text [ dutch ] = "Inde~xgegevens" ;
        Text [ spanish ] = "~Entradas al índice" ;
        Text [ english_us ] = "~Index entries" ;
        Text[ chinese_simplified ] = "Ŀ¼ÌõÄ¿(~I)";
        Text[ russian ] = "Ýëåìåíòû óêàçàòåëÿ";
        Text[ polish ] = "Wpisy do indeksu";
        Text[ japanese ] = "–ÚŽŸ‚ƍõˆø‚̍€–Ú(~I)";
        Text[ chinese_traditional ] = "¥Ø¿ý±ø¥Ø(~I)";
        Text[ arabic ] = "ÇáÅÏÎÇáÇÊ ÇáÝåÑÓíÉ";
        Text[ greek ] = "Êáôá÷ùñßóåéò åõñåôçñßïõ";
        Text[ korean ] = "»öÀÎ Ç׸ñ(~I)";
        Text[ turkish ] = "Dizin giri~þleri";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_INDEX
    {
        Pos = MAP_APPFONT ( 12 , 95 ) ;
        Size = MAP_APPFONT ( 108 , 10 ) ;
        Text = "Verzeichn~isse" ;
        Text [ ENGLISH ] = "Indexes" ;
        Text[ english_us ] = "Inde~xes";
        Text[ portuguese ] = "~Índices";
        Text[ russian ] = "Óêàçàòåëè";
        Text[ greek ] = "ÅõñåôÞñéá";
        Text[ dutch ] = "Indi~ces";
        Text[ french ] = "~Index";
        Text[ spanish ] = "~Índices";
        Text[ italian ] = "~Indici";
        Text[ danish ] = "Indeks";
        Text[ swedish ] = "Förteckn~ingar";
        Text[ polish ] = "Indeksy";
        Text[ portuguese_brazilian ] = "Entradas do índice";
        Text[ japanese ] = "ÃÞ¨Ú¸ÄØ(~I)";
        Text[ korean ] = "»öÀÎ(~X)";
        Text[ chinese_simplified ] = "Ŀ¼(~I)";
        Text[ chinese_traditional ] = "¥Ø¿ý(~I)";
        Text[ arabic ] = "ÇáÝåÇÑÓ";
        Text[ turkish ] = "Di~zinler";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_FOOTBACK
    {
        Pos = MAP_APPFONT ( 12 , 107 ) ;
        Size = MAP_APPFONT ( 108 , 10 ) ;
        Text = "Fu~ßnoten" ;
        Text [ ENGLISH ] = "Footnotes" ;
        Text [ english_us ] = "Footnot~es" ;
        Text [ swedish ] = "F~otnoter" ;
        Text [ danish ] = "Fodnoter" ;
        Text [ italian ] = "Note a piè pagina" ;
        Text [ spanish ] = "Notas al ~pie" ;
        Text [ french ] = "Notes de ~bas de page" ;
        Text [ dutch ] = "V~oetnoten" ;
        Text [ portuguese_brazilian ] = "Fu~ßnoten" ;
        Text [ portuguese ] = "Notas de rodapé" ;
        Text[ chinese_simplified ] = "×¢½Å(~E)";
        Text[ russian ] = "Ñíîñêè";
        Text[ polish ] = "Przypisy ~dolne";
        Text[ japanese ] = "‹r’(~E)";
        Text[ chinese_traditional ] = "µù¸}(~E)";
        Text[ arabic ] = "ÇáÍæÇÔí ÇáÓÝáíÉ";
        Text[ greek ] = "Õðïóçìåéþóåéò";
        Text[ korean ] = "°¢ÁÖ(~E)";
        Text[ turkish ] = "Dipnotlar";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_FLDBACK
    {
        Pos = MAP_APPFONT ( 12 , 119 ) ;
        Size = MAP_APPFONT ( 108 , 10 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? ~Felder : ~Felder hinterlegen */
        Text = "~Felder" ;
        Text [ ENGLISH ] = "Fields" ;
        Text [ english_us ] = "Fie~lds" ;
        Text [ swedish ] = "~Fält" ;
        Text [ danish ] = "Felter" ;
        Text [ italian ] = "Campi" ;
        Text [ spanish ] = "~Campos" ;
        Text [ french ] = "~Champs" ;
        Text [ dutch ] = "Ve~lden" ;
        Text [ portuguese_brazilian ] = "~Felder" ;
        Text [ portuguese ] = "~Campos" ;
        Text[ chinese_simplified ] = "×Ö¶Î(~F)";
        Text[ russian ] = "Ïîëÿ";
        Text[ polish ] = "P~ola";
        Text[ japanese ] = "̨°ÙÄÞ(~F)";
        Text[ chinese_traditional ] = "Äæ¦ì(~F)";
        Text[ arabic ] = "ÇáÍÞæá";
        Text[ greek ] = "Ðåäßá";
        Text[ korean ] = "Çʵå(~L)";
        Text[ turkish ] = "Alanlar";
        Text[ language_user1 ] = " ";
    };
     //_----------------------------
    GroupBox GB_NOPRINT
    {
        Pos = MAP_APPFONT ( 134 , 2 ) ;
        Size = MAP_APPFONT ( 120 , 129 ) ;
        Text = "Nicht druckbare Zeichen" ;
        Text [ ENGLISH ] = "Unprintable Characters" ;
        Text [ norwegian ] = "Unprintable Characters" ;
        Text [ italian ] = "Caratteri non stampabili" ;
        Text [ portuguese_brazilian ] = "Unprintable Characters" ;
        Text [ portuguese ] = "Caracteres não imprimíveis" ;
        Text [ finnish ] = "Unprintable Characters" ;
        Text [ danish ] = "Tegn som ikke kan udskrives" ;
        Text [ french ] = "Caractères non imprimables " ;
        Text [ swedish ] = "Icke utskrivbara tecken" ;
        Text [ dutch ] = "Niet-afdrukbare tekens" ;
        Text [ spanish ] = "Caracteres no imprimibles" ;
        Text [ english_us ] = "Nonprinting characters" ;
        Group = TRUE ;
        Text[ chinese_simplified ] = "²»¿É´òÓ¡µÄ×Ö·û";
        Text[ russian ] = "Íåïå÷àòàåìûå ñèìâîëû";
        Text[ polish ] = "Znaki niedrukowalne";
        Text[ japanese ] = "ˆóü‚³‚ê‚È‚¢•¶Žš‚â‹L†‚Ì•\\ަ/”ñ•\\ަ";
        Text[ chinese_traditional ] = "±±¨î²Å";
        Text[ arabic ] = "ÃÍÑÝ áÇ ÊõØÈÚ";
        Text[ greek ] = "Ìç åêôõðþóéìïé ÷áñáêôÞñåò";
        Text[ korean ] = "ÀμâÇÒ¼ö ¾ø´Â ¹®ÀÚ";
        Text[ turkish ] = "Yazdýrýlmayan karakterler";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_PARA
    {
        Pos = MAP_APPFONT ( 140 , 12 ) ;
        Size = MAP_APPFONT ( 108 , 10 ) ;
        Text = "~Absatzende" ;
        Text [ ENGLISH ] = "Paragraph ends" ;
        Text [ norwegian ] = "Paragraph ends" ;
        Text [ italian ] = "Fine paragrafo" ;
        Text [ portuguese_brazilian ] = "Finais de parágrafo" ;
        Text [ portuguese ] = "~Fim de parágrafo" ;
        Text [ finnish ] = "Kappaleenvaihdot" ;
        Text [ danish ] = "Afsnitsslutning" ;
        Text [ french ] = "~Fin de paragraphe" ;
        Text [ swedish ] = "Styck~etecken" ;
        Text [ dutch ] = "~Einde alinea" ;
        Text [ spanish ] = "~Fin de párrafo" ;
        Text [ english_us ] = "Pa~ragraph end" ;
        TabStop = TRUE ;
        Group = TRUE ;
        Text[ chinese_simplified ] = "¶ÎÂäβ¶Ë (~M)";
        Text[ russian ] = "Êîíåö àáçàöà";
        Text[ polish ] = "Koniec akapitu";
        Text[ japanese ] = "’i—Ž–– (~M)";
        Text[ chinese_traditional ] = "¬q¸¨§ÀºÝ (~M)";
        Text[ arabic ] = "äåÇíÉ ÝÞÑÉ";
        Text[ greek ] = "ÔÝëïò ðáñáãñÜöïõ";
        Text[ korean ] = "´Ü¶ô ³¡(~R)";
        Text[ turkish ] = "Paragraf sonu";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_SHYPH
    {
        Pos = MAP_APPFONT ( 140 , 25 ) ;
        Size = MAP_APPFONT ( 108 , 10 ) ;
        Text = "~Weiche Trenner" ;
        Text [ ENGLISH ] = "Soft hyphens" ;
        Text [ norwegian ] = "Soft hyphens" ;
        Text [ italian ] = "Sillabazioni morbide" ;
        Text [ portuguese_brazilian ] = "Hífens soft" ;
        Text [ portuguese ] = "~Hífens opcionais" ;
        Text [ finnish ] = "Ehdolliset tavuviivat" ;
        Text [ danish ] = "Bløde skilletegn" ;
        Text [ french ] = "Traits d'union ~automatiques" ;
        Text [ swedish ] = "~Mjuka bindestreck" ;
        Text [ dutch ] = "Tij~delijke afbreektekens" ;
        Text [ spanish ] = "G~uiones opcionales" ;
        Text [ english_us ] = "Optional h~yphens" ;
        Text[ chinese_simplified ] = "ÈíÐÔÁ¬×Ö·û(~Y)";
        Text[ russian ] = "Ìÿãêèé ïåðåíîñ";
        Text[ polish ] = "Miêkkie znaki podzia³u";
        Text[ japanese ] = "—áŠO‚ÌʲÌÝ(~Y)";
        Text[ chinese_traditional ] = "¥i¿ï¥Îªº³s¦r²Å(~Y)";
        Text[ arabic ] = "æÇÕáÉ ÇÎÊíÇÑíÉ";
        Text[ greek ] = "¹~ðéá äéá÷ùñéóôéêÜ";
        Text[ korean ] = "¼±ÅÃÀû ÇÏÀÌÇÂ(~Y)";
        Text[ turkish ] = "Ay~ýrma iþareti";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_SPACE
    {
        Pos = MAP_APPFONT ( 140 , 38 ) ;
        Size = MAP_APPFONT ( 108 , 10 ) ;
        Text = "Lee~rzeichen" ;
        Text [ ENGLISH ] = "Spaces" ;
        Text [ norwegian ] = "Spaces" ;
        Text [ italian ] = "Spazi" ;
        Text [ portuguese_brazilian ] = "Espaçamentos" ;
        Text [ portuguese ] = "Espaçamentos" ;
        Text [ finnish ] = "Välilyönnit" ;
        Text [ danish ] = "Mellemrum" ;
        Text [ french ] = "Es~paces" ;
        Text [ swedish ] = "Bl~anksteg" ;
        Text [ dutch ] = "~Spaties" ;
        Text [ spanish ] = "Esp~acios" ;
        Text [ english_us ] = "Spa~ces" ;
        Text[ chinese_simplified ] = "¿Õ°××Ö·û(~S)";
        Text[ russian ] = "Ïðîáåëû";
        Text[ polish ] = "Spa~cje";
        Text[ japanese ] = "½Íß°½(~S)";
        Text[ chinese_traditional ] = "ªÅ¥Õ¦r¤¸(~S)";
        Text[ arabic ] = "ÃÍÑÝ ãÓÇÝÉ";
        Text[ greek ] = "Êåíü";
        Text[ korean ] = "°£°Ý(~C)";
        Text[ turkish ] = "~Boþluklar";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_HSPACE
    {
        Pos = MAP_APPFONT ( 140 , 51 ) ;
        Size = MAP_APPFONT ( 108 , 10 ) ;
        Text = "Ge~sch. Leerzeichen" ;
        Text [ ENGLISH ] = "Nonbreaking spaces" ;
        Text [ norwegian ] = "Nonbreaking spaces" ;
        Text [ italian ] = "Spazi protetti" ;
        Text [ portuguese_brazilian ] = "Espaços ininterruptos" ;
        Text [ portuguese ] = "Espaços p~rotegidos" ;
        Text [ finnish ] = "Sitovat välilyönnit" ;
        Text [ danish ] = "Beskyttede mellemrum" ;
        Text [ french ] = "~Espaces protégés" ;
        Text [ swedish ] = "~Skyddade blanksteg" ;
        Text [ dutch ] = "~Beveiligde spatie" ;
        Text [ spanish ] = "Espacios proteg~idos" ;
        Text [ english_us ] = "~Protected spaces" ;
        Text[ chinese_simplified ] = "Êܱ£»¤µÄ¿Õ°××Ö·û(~P)";
        Text[ russian ] = "Çàùèùåííûå ïðîáåëû";
        Text[ polish ] = "Zab~ezpieczone spacje";
        Text[ japanese ] = "•ÛŒì½Íß°½(~P)";
        Text[ chinese_traditional ] = "¨ü«OÅ@ªºªÅ¥Õ¦r¤¸(~P)";
        Text[ arabic ] = "ÃÍÑÝ ãÓÇÝÉ ãÍãíÉ";
        Text[ greek ] = "×áñáêôÞñå~ò êåíþí ìå ðñïóôáóßá";
        Text[ korean ] = "°£°Ý º¸È£(~P)";
        Text[ turkish ] = "Korunan boþluklar";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_TAB
    {
        Pos = MAP_APPFONT ( 140 , 64 ) ;
        Size = MAP_APPFONT ( 108 , 10 ) ;
        Text = "Ta~bulatoren" ;
        Text [ ENGLISH ] = "~Tabs" ;
        Text [ norwegian ] = "~Tabs" ;
        Text [ italian ] = "~Tabulazioni" ;
        Text [ portuguese_brazilian ] = "~Tabulações" ;
        Text [ portuguese ] = "~Tabulações" ;
        Text [ finnish ] = "~Sarkaimet" ;
        Text [ danish ] = "Tabulatorer" ;
        Text [ french ] = "~Tabulations" ;
        Text [ swedish ] = "Ta~bulatorer" ;
        Text [ dutch ] = "Tabsto~ps" ;
        Text [ spanish ] = "Ta~bulaciones" ;
        Text [ english_us ] = "Tabs" ;
        Text[ chinese_simplified ] = "ÖÆ±í·û(~B)";
        Text[ russian ] = "Òàáóëÿòîðû";
        Text[ polish ] = "Tabulatory";
        Text[ japanese ] = "ÀÌÞ(~B)";
        Text[ chinese_traditional ] = "»sªí²Å(~B)";
        Text[ arabic ] = "ÚáÇãÇÊ ÇáÌÏæáÉ";
        Text[ greek ] = "ÓôçëïèÝôåò";
        Text[ korean ] = "ÅÇ";
        Text[ turkish ] = "Sekmeler";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_BREAK
    {
        Pos = MAP_APPFONT ( 140 , 77 ) ;
        Size = MAP_APPFONT ( 108 , 10 ) ;
        Text = "Umbr~üche" ;
        Text [ ENGLISH ] = "Breaks" ;
        Text [ norwegian ] = "Breaks" ;
        Text [ italian ] = "Interruzioni" ;
        Text [ portuguese_brazilian ] = "Interrupções" ;
        Text [ portuguese ] = "Quebras" ;
        Text [ finnish ] = "Vaihdot" ;
        Text [ danish ] = "Skift" ;
        Text [ french ] = "~Sauts" ;
        Text [ swedish ] = "Br~ytningar" ;
        Text [ dutch ] = "Ve~randeringen" ;
        Text [ spanish ] = "~Saltos" ;
        Text [ english_us ] = "Brea~ks" ;
        Text[ chinese_simplified ] = "»»Ðзû(~K)";
        Text[ russian ] = "Ðàçðûâû";
        Text[ polish ] = "Podzia~³y";
        Text[ japanese ] = "‰üs(~K)";
        Text[ chinese_traditional ] = "´«¦æ²Å(~K)";
        Text[ arabic ] = "ÝæÇÕá";
        Text[ greek ] = "ÁëëáãÝò";
        Text[ korean ] = "³ª´©±â(~K)";
        Text[ turkish ] = "Kesmeler";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_HIDDEN
    {
        Pos = MAP_APPFONT ( 140 , 90 ) ;
        Size = MAP_APPFONT ( 108 , 10 ) ;
        Text = "Verste~ckter Text" ;
        Text [ ENGLISH ] = "~Hidden text" ;
        Text [ norwegian ] = "~Hidden text" ;
        Text [ italian ] = "Testo nascosto" ;
        Text [ portuguese_brazilian ] = "~Texto oculto" ;
        Text [ portuguese ] = "~Texto oculto" ;
        Text [ finnish ] = "~Piiloteksti" ;
        Text [ danish ] = "Skjult tekst" ;
        Text [ french ] = "Texte ~masqué" ;
        Text [ swedish ] = "Dold te~xt" ;
        Text [ dutch ] = "On~zichtbare tekst" ;
        Text [ spanish ] = "Te~xto oculto" ;
        Text [ english_us ] = "Hidden text" ;
        Text[ chinese_simplified ] = "ÒþÈëµÄÎÄ×Ö(~H)";
        Text[ russian ] = "Ñêðûòûé òåêñò";
        Text[ polish ] = "Ukryty tek~st";
        Text[ japanese ] = "‰B‚µÃ·½Ä(~H)";
        Text[ chinese_traditional ] = "Áô¤Jªº¤å¦r(~H)";
        Text[ arabic ] = "äÕ ãÎÝí";
        Text[ greek ] = "Êñõöü êåßìåíï";
        Text[ korean ] = "¼û°ÜÁø ÅØ½ºÆ®";
        Text[ turkish ] = "~Gizli metin";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_HIDDEN_PARA
    {
        Pos = MAP_APPFONT ( 140 , 103 ) ;
        Size = MAP_APPFONT ( 108 , 10 ) ;
        Text = "~Versteckte Absätze" ;
        Text [ ENGLISH ] = "H~idden paragraphs" ;
        Text [ english_us ] = "Hidden p~aragraphs" ;
        Text [ portuguese_brazilian ] = "~Versteckte Absätze" ;
        Text [ swedish ] = "~Dolda stycken" ;
        Text [ danish ] = "Skulte afsnit" ;
        Text [ italian ] = "~Paragrafi nascosti" ;
        Text [ spanish ] = "Pá~rrafos ocultos" ;
        Text [ french ] = "~Paragraphes masqués" ;
        Text [ dutch ] = "Verborgen al~inea´s" ;
        Text [ portuguese ] = "~Parágrafos ocultos" ;
        Text[ chinese_simplified ] = "ÒþÈëµÄ¶ÎÂä(~H)";
        Text[ russian ] = "Ñêðûòûå àáçàöû";
        Text[ polish ] = "~Uk~yte akapity";
        Text[ japanese ] = "‰B‚µ’i—Ž(~H)";
        Text[ chinese_traditional ] = "Áô¤Jªº¬q¸¨(~H)";
        Text[ arabic ] = "ÝÞÑÇÊ ãÎÝíÉ";
        Text[ language_user1 ] = " ";
        Text[ greek ] = "ÊñõöÞ ðáñÜãñáöïò";
        Text[ korean ] = "¼û°ÜÁø ´Ü¶ô(~A)";
        Text[ turkish ] = "Gizili paragraflar";
    };
};
/**************************************************************************/
/*                                                                        */
/* TabPage Anzeige/Layout                                                 */
/*                                                                        */
/**************************************************************************/
TabPage TP_LAYOUT_OPT
{
    HelpID = HID_LAYOUT_OPT ;
    SVLook = TRUE ;
    Hide = TRUE ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    GroupBox GB_LINE
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 120 , 93 ) ;
        Text = "Linien" ;
        Text [ ENGLISH ] = "Lines" ;
        Group = TRUE ;
        Text [ english_us ] = "Lines" ;
        Text [ italian ] = "Linee" ;
        Text [ spanish ] = "Líneas" ;
        Text [ french ] = "Lignes" ;
        Text [ dutch ] = "Lijnen" ;
        Text [ swedish ] = "Linjer" ;
        Text [ danish ] = "Linjer" ;
        Text [ portuguese_brazilian ] = "Linien" ;
        Text [ portuguese ] = "Linhas" ;
        Text[ chinese_simplified ] = "ÏßÌõ";
        Text[ russian ] = "Ëèíèè";
        Text[ polish ] = "Linie";
        Text[ japanese ] = "ü";
        Text[ chinese_traditional ] = "½u±ø";
        Text[ arabic ] = "ÎØæØ";
        Text[ greek ] = "ÃñáììÝò";
        Text[ korean ] = "¼±";
        Text[ turkish ] = "Çizgiler";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_TXTBEG
    {
        Pos = MAP_APPFONT ( 12 , 12 ) ;
        Size = MAP_APPFONT ( 108 , 10 ) ;
        Text = "Te~xtbegrenzungen" ;
        Text [ ENGLISH ] = "Text boundaries" ;
        Text [ norwegian ] = "Text boundaries" ;
        Text [ italian ] = "Limiti di ~testo" ;
        Text [ portuguese_brazilian ] = "Limites do texto" ;
        Text [ portuguese ] = "~Limites do texto" ;
        Text [ finnish ] = "Tekstin rajat" ;
        Text [ danish ] = "Tekstmargener" ;
        Text [ french ] = "Délimitations du te~xte" ;
        Text [ swedish ] = "Te~xtbegränsningar" ;
        Text [ dutch ] = "Tekst~begrenzingen" ;
        Text [ spanish ] = "Límites del ~texto" ;
        Text [ english_us ] = "Te~xt limits" ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "ÕýÎı߽ç(~X)";
        Text[ russian ] = "Ãðàíèöû òåêñòà";
        Text[ polish ] = "Granice tekstu";
        Text[ japanese ] = "÷½Ä‚Ì‹«ŠE(~X)";
        Text[ chinese_traditional ] = "¤º¤åÃä¬É(~X)";
        Text[ arabic ] = "ÍÏæÏ ÇáäÕ";
        Text[ greek ] = "¼ñéá êåéìÝíïõ";
        Text[ korean ] = "ÅØ½ºÆ® °æ°è(~X)";
        Text[ turkish ] = "Metin sýnýrlarý";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_TABBEG
    {
        Pos = MAP_APPFONT ( 12 , 25 ) ;
        Size = MAP_APPFONT ( 108 , 10 ) ;
        Text = "Tabelle~nbegrenzungen" ;
        Text [ ENGLISH ] = "~Table boundaries" ;
        Text [ norwegian ] = "~Table boundaries" ;
        Text [ italian ] = "Limiti ~tabella" ;
        Text [ portuguese_brazilian ] = "~Limites da tabela" ;
        Text [ portuguese ] = "~Limites da tabela" ;
        Text [ finnish ] = "~Taulukon rajat" ;
        Text [ danish ] = "Tabelgrænser" ;
        Text [ french ] = "~Bordures de tableau" ;
        Text [ swedish ] = "Tabellbegrä~nsningar" ;
        Text [ dutch ] = "~Tabelbegrenzingen" ;
        Text [ spanish ] = "Límites de la t~abla" ;
        Text [ english_us ] = "T~able limits" ;
        Text[ chinese_simplified ] = "±í¸ñ±ß½ç(~B)";
        Text[ russian ] = "Ãðàíèöû òàáëèöû";
        Text[ polish ] = "Ograniczenia tabeli";
        Text[ japanese ] = "•\\‚Ì‹«ŠE(~B)";
        Text[ chinese_traditional ] = "ªí®æÃä¬É(~B)";
        Text[ arabic ] = "ÍÏæÏ ÇáÌÏæá";
        Text[ greek ] = "¼ñéá ðßíáêá";
        Text[ korean ] = "Ç¥ °æ°è(~A)";
        Text[ turkish ] = "Tablo sýnýrlarý";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_SECT_BOUNDS
    {
        Pos = MAP_APPFONT ( 12 , 38 ) ;
        Size = MAP_APPFONT ( 108 , 10 ) ;
        Text = "~Bereichsbegrenzungen" ;
        Text [ ENGLISH ] = "~Section boundaries" ;
        Text[ english_us ] = "~Section limits";
        Text[ portuguese ] = "~Limites de área";
        Text[ russian ] = "Ãðàíèöû îáëàñòè";
        Text[ dutch ] = "~Bereiksgrenzen";
        Text[ french ] = "~Limites de sections";
        Text[ spanish ] = "~Límites de área";
        Text[ italian ] = "Limiti area";
        Text[ danish ] = "Områdegrænser";
        Text[ swedish ] = "Områdesbegränsningar";
        Text[ polish ] = "Ograniczenie obszaru";
        Text[ portuguese_brazilian ] = "~Section boundaries";
        Text[ japanese ] = "¾¸¼®Ý‹æØ‚è(~S)";
        Text[ chinese_simplified ] = "ÇøÓò±ß½ç(~S)";
        Text[ chinese_traditional ] = "°Ï°ìÃä¬É(~S)";
        Text[ arabic ] = "ÍÏæÏ ÇáäØÇÞ";
        Text[ greek ] = "¼ñéá ôïìÝá";
        Text[ korean ] = "±¸¿ª °æ°è(~S)";
        Text[ turkish ] = "~Bölüm sýnýrlarý";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_CROSS
    {
        Pos = MAP_APPFONT ( 12 , 51 ) ;
        Size = MAP_APPFONT ( 108 , 10 ) ;
        Text = "H~ilfslinien" ;
        Text [ ENGLISH ] = "~Crosshair" ;
        Text [ norwegian ] = "~Crosshair" ;
        Text [ italian ] = "Linee guida" ;
        Text [ portuguese_brazilian ] = "~Crosshair" ;
        Text [ portuguese ] = "~Guias" ;
        Text [ finnish ] = "~Ristikkäin" ;
        Text [ danish ] = "Hjælpelinjer" ;
        Text [ french ] = "~Repères" ;
        Text [ swedish ] = "Hj~älplinjer" ;
        Text [ dutch ] = "~Hulplijnen" ;
        Text [ spanish ] = "~Guías" ;
        Text [ english_us ] = "~Guides" ;
        Text[ chinese_simplified ] = "¸¨ÖúÏß(~G)";
        Text[ russian ] = "Íàïðàâëÿþùèå ëèíèè";
        Text[ polish ] = "Linie pomocnicze";
        Text[ japanese ] = "•⏕ü(~G)";
        Text[ chinese_traditional ] = "»²§U½u(~G)";
        Text[ arabic ] = "ÎØæØ ãÓÇÚÏÉ";
        Text[ greek ] = "ÂïçèçôéêÝò ãñáììÝò";
        Text[ korean ] = "¾È³»(~G)";
        Text[ turkish ] = "Kýlavuzlar";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_HANDLE
    {
        Pos = MAP_APPFONT ( 12 , 64 ) ;
        Size = MAP_APPFONT ( 108 , 10 ) ;
        Text = "~Einfache Griffe" ;
        Text [ ENGLISH ] = "Simple Handles" ;
        Text[ english_us ] = "~Simple control points";
        Text[ portuguese ] = "Guias sim~ples";
        Text[ russian ] = "Îáû÷íûå óçëû";
        Text[ greek ] = "ÁðëÜ óçì~åßá åëÝã÷ïõ";
        Text[ dutch ] = "~Eenvoudige handvatten";
        Text[ french ] = "~Poignées simples";
        Text[ spanish ] = "Agarraderas ~sencillas";
        Text[ italian ] = "~Maniglie semplici";
        Text[ danish ] = "Enkelte håndtag";
        Text[ swedish ] = "~Enkla handtag";
        Text[ polish ] = "Proste uchwyty";
        Text[ portuguese_brazilian ] = "~Farbige Handles";
        Text[ japanese ] = "¼ÝÌßقȻ²½Þ•ύXÊÝÄÞÙ(~S)";
        Text[ korean ] = "´Ü¼ø ÇÚµé(~S)";
        Text[ chinese_simplified ] = "±ê×¼¿Øµã";
        Text[ chinese_traditional ] = "¼Ð­ã±±ÂI(~S)";
        Text[ arabic ] = "ãÞÇÈÖ ÈÓíØÉ";
        Text[ turkish ] = "Basit çekme noktalarý";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_BIGHANDLE
    {
        Pos = MAP_APPFONT ( 12 , 77 ) ;
        Size = MAP_APPFONT ( 108 , 10 ) ;
        Text = "~Große Griffe" ;
        Text [ ENGLISH ] = "Big Handles" ;
        Text[ english_us ] = "Large co~ntrol points";
        Text[ portuguese ] = "~Guias grandes";
        Text[ russian ] = "Êðóïíûå óçëû";
        Text[ greek ] = "Ìå~ãÜëá óçìåßá åëÝã÷ïõ";
        Text[ dutch ] = "~Grote handvatten";
        Text[ french ] = "~Grandes poignées";
        Text[ spanish ] = "Agarrader~as grandes";
        Text[ italian ] = "Maniglie ~grandi";
        Text[ danish ] = "Store håndtag";
        Text[ swedish ] = "~Stora handtag";
        Text[ polish ] = "Du¿e uchwyty";
        Text[ portuguese_brazilian ] = "Big Handles";
        Text[ japanese ] = "‘å‚«‚¢»²½Þ•ύXÊÝÄÞÙ(~B)";
        Text[ korean ] = "´ëÇü ÇÚµé(~N)";
        Text[ chinese_simplified ] = "´ó¿Øµã";
        Text[ chinese_traditional ] = "¤j±±ÂI(~B)";
        Text[ arabic ] = "ãÞÇÈÖ ßÈíÑÉ";
        Text[ turkish ] = "~Büyük çekme noktalarý";
        Text[ language_user1 ] = " ";
    };
    GroupBox GB_WINDOW
    {
        Pos = MAP_APPFONT ( 134 , 3 ) ;
        Size = MAP_APPFONT ( 120 , 93 ) ;
        Text = "Fenster";
        Text [ italian ] = "Finestra";
        Text [ portuguese_brazilian ] = "Janela";
        Text [ portuguese ] = "Janela";
        Text [ danish ] = "Vindue";
        Text [ french ] = "Fenêtre";
        Text [ swedish ] = "Fönster";
        Text [ dutch ] = "Venster";
        Text [ spanish ] = "Ventana";
        Text [ english_us ] = "Window";
    Text[ chinese_simplified ] = "ÊÓ´°";
    Text[ russian ] = "Îêíî";
        Text[ polish ] = "Okno";
        Text[ japanese ] = "³¨ÝÄÞ³";
        Text [ norwegian ] = "Window" ;
        Text [ italian ] = "Finestra" ;
        Group = TRUE ;
        Text[ chinese_traditional ] = "µøµ¡";
        Text[ arabic ] = "äÇÝÐÉ";
        Text[ greek ] = "ÐáñÜèõñï";
        Text[ korean ] = "â";
        Text[ turkish ] = "Pencere";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_HSCROLL
    {
        Pos = MAP_APPFONT ( 140 , 12 ) ;
        Size = MAP_APPFONT ( 108 , 10 ) ;
        Text = "Horizontale Bildla~ufleiste" ;
        Text [ ENGLISH ] = "~Horizontal scrollbar" ;
        Text [ english_us ] = "H~orizontal scroll" ;
        Text [ italian ] = "Barra di scorrimento orizzontale" ;
        Text [ spanish ] = "Barra de desplazamiento ~horizontal" ;
        Text [ french ] = "Barre de défilement ~horizontale" ;
        Text [ dutch ] = "H~orizontale beeldschuifbalk" ;
        Text [ swedish ] = "H~orisontell bildrullningslist" ;
        Text [ danish ] = "Vandret rullepanel" ;
        Text [ portuguese_brazilian ] = "Horizontale Bildla~ufleiste" ;
        Text [ portuguese ] = "Barra de deslocação ~horizontal" ;
        Text[ chinese_simplified ] = "ˮƽÏò¹ö¶¯À¸(~H)";
        Text[ russian ] = "Ãîðèçîíòàëüíàÿ ïîëîñà ïðîêðóòêè";
        Text[ polish ] = "Poziomy pa~sek przewijania obrazu";
        Text[ japanese ] = "…•½½¸Û°ÙÊÞ°(~H)";
        Text[ chinese_traditional ] = "¤ô¥­¦V¨÷¶b(~H)";
        Text[ arabic ] = "ÔÑíØ ÊÍÑíß ÇáÕÝÍÉ ÃÝÞíÇð";
        Text[ greek ] = "Ïñéæüíôéá ãñáììÞ êýëéóçò";
        Text[ korean ] = "¼öÆò ½ºÅ©·Ñ(~O)";
        Text[ turkish ] = "Yatay kaydýrma ~çubuðu";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_VSCROLL
    {
        Pos = MAP_APPFONT ( 140 , 25 ) ;
        Size = MAP_APPFONT ( 108 , 10 ) ;
        Text = "~Vertikale Bildlaufleiste" ;
        Text [ ENGLISH ] = "~Vertical scrollbar" ;
        Text [ english_us ] = "~Vertical scroll" ;
        Text [ italian ] = "Barra di scorrimento verticale" ;
        Text [ spanish ] = "Barra de desplazamiento ~vertical" ;
        Text [ french ] = "Barre de défilement ~verticale" ;
        Text [ dutch ] = "~Verticale schuifbalk" ;
        Text [ swedish ] = "~Vertikal bildrullningslist" ;
        Text [ danish ] = "Lodret rullepanel" ;
        Text [ portuguese_brazilian ] = "~Vertikale Bildlaufleiste" ;
        Text [ portuguese ] = "Barra de deslocação ~vertical" ;
        Text[ chinese_simplified ] = "´¹Ö±Ïò¹ö¶¯À¸(~V)";
        Text[ russian ] = "Âåðòèêàëüíàÿ ïîëîñà ïðîêðóòêè";
        Text[ polish ] = "Piono~wy pasek przewijania obrazu";
        Text[ japanese ] = "‚’¼½¸Û°ÙÊÞ°(~V)";
        Text[ chinese_traditional ] = "««ª½¦¡¨÷¶b(~V)";
        Text[ arabic ] = "ÔÑíØ ÊÍÑíß ÇáÕÝÍÉ ÑÃÓíÇð";
        Text[ greek ] = "Êáôáêüñõöç ãñáììÞ êýëéóçò";
        Text[ korean ] = "¼öÁ÷ ½ºÅ©·Ñ(~V)";
        Text[ turkish ] = "Di~key kaydýrma çubuðu";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_HRULER
    {
        Pos = MAP_APPFONT ( 140 , 38 ) ;
        Size = MAP_APPFONT ( 108 , 10 ) ;
        Text = "Horizontales ~Lineal" ;
        Text [ ENGLISH ] = "~Horic. ruler" ;
        Text [ norwegian ] = "~Horic. ruler" ;
        Text [ italian ] = "Rig~hello orizzontale" ;
        Text [ portuguese_brazilian ] = "~Régua horizontal" ;
        Text [ portuguese ] = "~Régua horizontal" ;
        Text [ finnish ] = "~Vaakaviivain" ;
        Text [ danish ] = "Vandret lineal" ;
        Text [ french ] = "Règle hori~zontale" ;
        Text [ swedish ] = "Horisontell ~linjal" ;
        Text [ dutch ] = "Horizontale ~liniaal" ;
        Text [ spanish ] = "Regla  h~orizontal" ;
        Text [ english_us ] = "Hori~zontal ruler" ;
        Text[ chinese_simplified ] = "ˮƽ±ê³ß(~O)";
        Text[ russian ] = "Ãîðèçîíòàëüíàÿ ëèíåéêà";
        Text[ polish ] = "Linijka pozioma";
        Text[ japanese ] = "…•½Ù°×(~O)";
        Text[ chinese_traditional ] = "¤ô¥­¼Ð¤Ø(~O)";
        Text[ arabic ] = "ÇáãÓØÑÉ ÇáÃÝÞíÉ";
        Text[ greek ] = "Ïñéæüíôéïò ÷Üñáêáò";
        Text[ korean ] = "¼öÆò ´«±ÝÀÚ(~Z)";
        Text[ turkish ] = "Yatay cetvel";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_VRULER
    {
        Pos = MAP_APPFONT ( 140 , 51 ) ;
        Size = MAP_APPFONT ( 108 , 10 ) ;
        Text = "Verti~kales Lineal" ;
        Text [ ENGLISH ] = "~Vert. ruler" ;
        Text [ norwegian ] = "~Vert. ruler" ;
        Text [ italian ] = "Ri~ghello verticale" ;
        Text [ portuguese_brazilian ] = "~Régua vertical" ;
        Text [ portuguese ] = "~Régua vertical" ;
        Text [ finnish ] = "~Pystyviivain" ;
        Text [ danish ] = "Lodret lineal" ;
        Text [ french ] = "Règle verti~cale" ;
        Text [ swedish ] = "Verti~kal linjal" ;
        Text [ dutch ] = "Verticale l~iniaal" ;
        Text [ spanish ] = "Regla v~ertical" ;
        Text [ english_us ] = "V~ertical ruler" ;
        Text[ chinese_simplified ] = "´¹Ö±±ê³ß(~E)";
        Text[ russian ] = "Âåðòèêàëüíàÿ ëèíåéêà";
        Text[ polish ] = "Linij~ka pionowa";
        Text[ japanese ] = "‚’¼Ù°×(~E)";
        Text[ chinese_traditional ] = "««ª½¦¡¼Ð¤Ø(~E)";
        Text[ arabic ] = "ÇáãÓØÑÉ ÇáÑÃÓíÉ";
        Text[ greek ] = "Êáôáêüñõöïò ÷Üñáêáò";
        Text[ korean ] = "¼öÁ÷ ´«±ÝÀÚ(~E)";
        Text[ turkish ] = "Dikey cetvel";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_SMOOTH_SCROLL
    {
        Pos = MAP_APPFONT ( 140 , 64 ) ;
        Size = MAP_APPFONT ( 108 , 10 ) ;
        Text = "~Weiches Scrollen" ;
        Text [ ENGLISH ] = "S~mooth scroll" ;
        Text [ english_us ] = "S~mooth scroll" ;
        Text [ portuguese_brazilian ] = "~Weiches Scrollen" ;
        Text [ swedish ] = "~Mjuk rullning" ;
        Text [ danish ] = "Blød rulning" ;
        Text [ italian ] = "Scorrimento dolce" ;
        Text [ spanish ] = "Desplazamiento ~suave" ;
        Text [ french ] = "~Défilement doux" ;
        Text [ dutch ] = "~Zacht scrollen" ;
        Text [ portuguese ] = "~Mover suavemente" ;
        Text[ chinese_simplified ] = "ƽ»¬¹ö¶¯(~M)";
        Text[ russian ] = "Ìÿãêàÿ ïðîêðóòêà";
        Text[ polish ] = "Miêkkie przewijanie";
        Text[ japanese ] = "ŠŠ‚ç‚©‚Ƚ¸Û°Ù(~M)";
        Text[ chinese_traditional ] = "¥­·Æ±²°Ê(~M)";
        Text[ arabic ] = "ÇáÊÍÑíß ÇáãØÇæÚ";
        Text[ greek ] = "ÁðáëÞ êýëéóç";
        Text[ korean ] = "ºÎµå·´°Ô ½ºÅ©·Ñ(~M)";
        Text[ turkish ] = "Yavaþ kaydýrma";
        Text[ language_user1 ] = " ";
    };
    GroupBox GB_METRIC
    {
        Pos = MAP_APPFONT ( 6 , 101 ) ;
        Size = MAP_APPFONT ( 120 , 26 ) ;
        Text = "Maßeinheit";
        Text [ ENGLISH ] = "Metric Units" ;
        Text [ italian ] = "Unità di misura";
        Text [ portuguese_brazilian ] = "Unidades métricas";
        Text [ portuguese ] = "Unidades métricas";
        Text [ danish ] = "Måleenhed";
        Text [ french ] = "Unité de mesure";
        Text [ swedish ] = "Måttenhet";
        Text [ dutch ] = "Maateenheid";
        Text [ spanish ] = "Unidad de medida";
        Text [ english_us ] = "Meas. units";
        Text[ chinese_simplified ] = "¶ÈÁ¿µ¥Î»";
        Text[ russian ] = "Åäèíèöà èçìåðåíèÿ";
        Text[ polish ] = "Jednostka miary";
        Text[ japanese ] = "’PˆÊ";
        Text [ norwegian ] = "Metriske Enheter" ;
        Text [ finnish ] = "Metriset yksiköt" ;
        Text[ chinese_traditional ] = "«×¶q³æ¦ì";
        Text[ arabic ] = "æÍÏÉ ÇáÞíÇÓ";
        Text[ greek ] = "ÌïíÜäá ìÝôñçóçò";
        Text[ korean ] = "ÃøÁ¤ ´ÜÀ§";
        Text[ turkish ] = "Ölçü birimi";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_METRIC
    {
        Pos = MAP_APPFONT ( 12 , 112 ) ;
        Size = MAP_APPFONT ( 70 , 50 ) ;
        Border = TRUE ;
        DropDown = TRUE ;
    };
    StringArray ST_METRIC
    {
        ItemList =
        {
            < "Millimeter" ; FUNIT_MM ; > ;
            < "Zentimeter" ; FUNIT_CM ; > ;
            < "Meter" ; FUNIT_M ; > ;
            < "Kilometer" ; FUNIT_KM ; > ;
            < "Zoll" ; FUNIT_INCH ; > ;
            < "Fuß" ; FUNIT_FOOT ; > ;
            < "Meilen" ; FUNIT_MILE ; > ;
            < "Pica" ; FUNIT_PICA ; > ;
            < "Point" ; FUNIT_POINT ; > ;
        };
        ItemList [ English ] =
        {
            < "Millimeter" ; FUNIT_MM ; > ;
            < "Zentimeter" ; FUNIT_CM ; > ;
            < "Meter" ; FUNIT_M ; > ;
            < "Kilometer" ; FUNIT_KM ; > ;
            < "Zoll" ; FUNIT_INCH ; > ;
            < "Fuß" ; FUNIT_FOOT ; > ;
            < "Meilen" ; FUNIT_MILE ; > ;
            < "Pica" ; FUNIT_PICA ; > ;
            < "Point" ; FUNIT_POINT ; > ;
        };
        ItemList [ norwegian ] =
        {
            < "Millimeter" ; FUNIT_MM ; > ;
            < "Zentimeter" ; FUNIT_CM ; > ;
            < "Meter" ; FUNIT_M ; > ;
            < "Kilometer" ; FUNIT_KM ; > ;
            < "Zoll" ; FUNIT_INCH ; > ;
            < "Fuß" ; FUNIT_FOOT ; > ;
            < "Meilen" ; FUNIT_MILE ; > ;
            < "Pica" ; FUNIT_PICA ; > ;
            < "Point" ; FUNIT_POINT ; > ;
        };
        ItemList [ italian ] =
        {
            < "Millimetro" ; FUNIT_MM ; > ;
            < "Centimetro" ; FUNIT_CM ; > ;
            < "Metro" ; FUNIT_M ; > ;
            < "Chilometro" ; FUNIT_KM ; > ;
            < "Pollice" ; FUNIT_INCH ; > ;
            < "piede" ; FUNIT_FOOT ; > ;
            < "miglia" ; FUNIT_MILE ; > ;
            < "Pica" ; FUNIT_PICA ; > ;
            < "Punto" ; FUNIT_POINT ; > ;
        };
        ItemList [ portuguese_brazilian ] =
        {
            < "Millimeter" ; FUNIT_MM ; > ;
            < "Zentimeter" ; FUNIT_CM ; > ;
            < "Meter" ; FUNIT_M ; > ;
            < "Kilometer" ; FUNIT_KM ; > ;
            < "Zoll" ; FUNIT_INCH ; > ;
            < "Fuß" ; FUNIT_FOOT ; > ;
            < "Meilen" ; FUNIT_MILE ; > ;
            < "Pica" ; FUNIT_PICA ; > ;
            < "Ponto" ; FUNIT_POINT ; > ;
        };
        ItemList [ portuguese ] =
        {
            < "Milímetro" ; FUNIT_MM ; > ;
            < "Centímetro" ; FUNIT_CM ; > ;
            < "Metro" ; FUNIT_M ; > ;
            < "Quilómetro" ; FUNIT_KM ; > ;
            < "Polegada" ; FUNIT_INCH ; > ;
            < "Pé" ; FUNIT_FOOT ; > ;
            < "Milhas" ; FUNIT_MILE ; > ;
            < "Pica" ; FUNIT_PICA ; > ;
            < "Ponto" ; FUNIT_POINT ; > ;
        };
        ItemList [ french ] =
        {
            < "Millimètre" ; FUNIT_MM ; > ;
            < "Centimètre" ; FUNIT_CM ; > ;
            < "Mètre" ; FUNIT_M ; > ;
            < "Kilomètre" ; FUNIT_KM ; > ;
            < "Pouce" ; FUNIT_INCH ; > ;
            < "Pied" ; FUNIT_FOOT ; > ;
            < "Miles" ; FUNIT_MILE ; > ;
            < "Pica" ; FUNIT_PICA ; > ;
            < "Point" ; FUNIT_POINT ; > ;
        };
        ItemList [ dutch ] =
        {
            < "Millimeter" ; FUNIT_MM ; > ;
            < "Centimeter" ; FUNIT_CM ; > ;
            < "Meter" ; FUNIT_M ; > ;
            < "Kilometer" ; FUNIT_KM ; > ;
            < "Duim" ; FUNIT_INCH ; > ;
            < "Voet" ; FUNIT_FOOT ; > ;
            < "Mijlen" ; FUNIT_MILE ; > ;
            < "Pica" ; FUNIT_PICA ; > ;
            < "Punt" ; FUNIT_POINT ; > ;
        };
        ItemList [ spanish ] =
        {
            < "Milímetro" ; FUNIT_MM ; > ;
            < "Centímetro" ; FUNIT_CM ; > ;
            < "Metro" ; FUNIT_M ; > ;
            < "Kilómetro" ; FUNIT_KM ; > ;
            < "Pulgadas" ; FUNIT_INCH ; > ;
            < "Pie" ; FUNIT_FOOT ; > ;
            < "Millas" ; FUNIT_MILE ; > ;
            < "Pica" ; FUNIT_PICA ; > ;
            < "Punto" ; FUNIT_POINT ; > ;
        };
        ItemList [ danish ] =
        {
            < "Millimeter" ; FUNIT_MM ; > ;
            < "Centimeter" ; FUNIT_CM ; > ;
            < "Meter" ; FUNIT_M ; > ;
            < "Kilometer" ; FUNIT_KM ; > ;
            < "Tommer" ; FUNIT_INCH ; > ;
            < "Fod" ; FUNIT_FOOT ; > ;
            < "Mil" ; FUNIT_MILE ; > ;
            < "Pica" ; FUNIT_PICA ; > ;
            < "Punkt" ; FUNIT_POINT ; > ;
        };
        ItemList [ swedish ] =
        {
            < "Millimeter" ; FUNIT_MM ; > ;
            < "Centimeter" ; FUNIT_CM ; > ;
            < "Meter" ; FUNIT_M ; > ;
            < "Kilometer" ; FUNIT_KM ; > ;
            < "Tum" ; FUNIT_INCH ; > ;
            < "Fot" ; FUNIT_FOOT ; > ;
            < "Miles" ; FUNIT_MILE ; > ;
            < "Pica" ; FUNIT_PICA ; > ;
            < "Punkt" ; FUNIT_POINT ; > ;
        };
        ItemList [ finnish ] =
        {
            < "Millimeter" ; FUNIT_MM ; > ;
            < "Zentimeter" ; FUNIT_CM ; > ;
            < "Meter" ; FUNIT_M ; > ;
            < "Kilometer" ; FUNIT_KM ; > ;
            < "Zoll" ; FUNIT_INCH ; > ;
            < "Fuß" ; FUNIT_FOOT ; > ;
            < "Meilen" ; FUNIT_MILE ; > ;
            < "Pica" ; FUNIT_PICA ; > ;
            < "Point" ; FUNIT_POINT ; > ;
        };
        ItemList [ english_us ] =
        {
            < "Millimeter" ; FUNIT_MM ; > ;
            < "Centimeter" ; FUNIT_CM ; > ;
            < "Meter" ; FUNIT_M ; > ;
            < "Kilometer" ; FUNIT_KM ; > ;
            < "Inch" ; FUNIT_INCH ; > ;
            < "Foot" ; FUNIT_FOOT ; > ;
            < "Miles" ; FUNIT_MILE ; > ;
            < "Pica" ; FUNIT_PICA ; > ;
            < "Point" ; FUNIT_POINT ; > ;
        };
    ItemList [ chinese_simplified ] =
    {
            < "ºÁÃ×" ; FUNIT_MM ; > ;
        < "ÀåÃ×" ; FUNIT_CM ; > ;
        < "Ã×" ; FUNIT_M ; > ;
        < "¹«Àï" ; FUNIT_KM ; > ;
        < "Ó¢´ç" ; FUNIT_INCH ; > ;
        < "Ó¢³ß" ; FUNIT_FOOT ; > ;
        < "Ó¢Àï" ; FUNIT_MILE ; > ;
        < "Ƥ¿ÉÐÍ×Ö·û" ; FUNIT_PICA ; > ;
        < "µã" ; FUNIT_POINT ; > ;
    };
    ItemList [ russian ] =
    {
            < "Ìèëèìåòðû" ; FUNIT_MM ; > ;
        < "Ñàíòèìåòðû" ; FUNIT_CM ; > ;
        < "Ìåòðû" ; FUNIT_M ; > ;
        < "Êèëîìåòðû" ; FUNIT_KM ; > ;
        < "Äþéìû" ; FUNIT_INCH ; > ;
        < "Ôóòû" ; FUNIT_FOOT ; > ;
        < "Ìèëè" ; FUNIT_MILE ; > ;
        < "Ïèêè" ; FUNIT_PICA ; > ;
        < "Ïóíêò" ; FUNIT_POINT ; > ;
    };
    ItemList [ polish ] =
    {
            < "Milimetr" ; FUNIT_MM ; > ;
        < "Centymetr" ; FUNIT_CM ; > ;
        < "Metr" ; FUNIT_M ; > ;
        < "Kilometr" ; FUNIT_KM ; > ;
        < "Cal" ; FUNIT_INCH ; > ;
        < "Stopa" ; FUNIT_FOOT ; > ;
        < "Mile" ; FUNIT_MILE ; > ;
        < "Cycero" ; FUNIT_PICA ; > ;
        < "Punkt" ; FUNIT_POINT ; > ;
    };
    ItemList [ japanese ] =
    {
            < "ÐØÒ°ÄÙ" ; FUNIT_MM ; > ;
        < "¾ÝÁÒ°ÄÙ" ; FUNIT_CM ; > ;
        < "Ò°ÄÙ" ; FUNIT_M ; > ;
        < "·ÛÒ°ÄÙ" ; FUNIT_KM ; > ;
        < "²ÝÁ" ; FUNIT_INCH ; > ;
        < "̨°Ä" ; FUNIT_FOOT ; > ;
        < "ϲÙ" ; FUNIT_MILE ; > ;
        < "Êß²¶" ; FUNIT_PICA ; > ;
        < "Îß²ÝÄ" ; FUNIT_POINT ; > ;
    };
    ItemList [ chinese_traditional ] =
    {
            < "²@¦Ì" ; FUNIT_MM ; > ;
        < "Íù¦Ì" ; FUNIT_CM ; > ;
        < "¦Ì" ; FUNIT_M ; > ;
        < "¤½¨½" ; FUNIT_KM ; > ;
        < "­^¤o" ; FUNIT_INCH ; > ;
        < "­^¤Ø" ; FUNIT_FOOT ; > ;
        < "­^¨½" ; FUNIT_MILE ; > ;
        < "¥Ö¥i«¬¦r¤¸" ; FUNIT_PICA ; > ;
        < "ÂI" ; FUNIT_POINT ; > ;
    };
    ItemList [ arabic ] =
    {
            < "ãáíãÊÑ" ; FUNIT_MM ; > ;
        < "ÓäÊíãÊÑ" ; FUNIT_CM ; > ;
        < "ãÊÑ" ; FUNIT_M ; > ;
        < "ßíáæãÊÑ" ; FUNIT_KM ; > ;
        < "ÈæÕÉ" ; FUNIT_INCH ; > ;
        < "ÞÏã" ; FUNIT_FOOT ; > ;
        < "ÃãíÇá" ; FUNIT_MILE ; > ;
        < "ÈíßÇ" ; FUNIT_PICA ; > ;
        < "äÞØÉ" ; FUNIT_POINT ; > ;
    };
    ItemList [ greek ] =
    {
            < "×éëéïóôÜ" ; FUNIT_MM ; > ;
        < "ÅêáôïóôÜ" ; FUNIT_CM ; > ;
        < "ÌÝôñá" ; FUNIT_M ; > ;
        < "×éëéüìåôñá" ; FUNIT_KM ; > ;
        < "ºíôóåò" ; FUNIT_INCH ; > ;
        < "Ðüäé" ; FUNIT_FOOT ; > ;
        < "Ìßëéá" ; FUNIT_MILE ; > ;
        < "Pica" ; FUNIT_PICA ; > ;
        < "Óçìåßï" ; FUNIT_POINT ; > ;
    };
    ItemList [ korean ] =
    {
            < "¹Ð¸®¹ÌÅÍ" ; FUNIT_MM ; > ;
        < "¼¾Æ¼¹ÌÅÍ" ; FUNIT_CM ; > ;
        < "¹ÌÅÍ" ; FUNIT_M ; > ;
        < "ų·Î¹ÌÅÍ" ; FUNIT_KM ; > ;
        < "ÀÎÄ¡" ; FUNIT_INCH ; > ;
        < "ÇÇÆ®" ; FUNIT_FOOT ; > ;
        < "¸¶ÀÏ" ; FUNIT_MILE ; > ;
        < "ÆÄÀÌÄ«" ; FUNIT_PICA ; > ;
        < "Æ÷ÀÎÆ®" ; FUNIT_POINT ; > ;
    };
    ItemList [ turkish ] =
    {
            < "Milimetre" ; FUNIT_MM ; > ;
        < "Santimetre" ; FUNIT_CM ; > ;
        < "Metre" ; FUNIT_M ; > ;
        < "Kilometre" ; FUNIT_KM ; > ;
        < "Ýnç" ; FUNIT_INCH ; > ;
        < "Ft" ; FUNIT_FOOT ; > ;
        < "Mil" ; FUNIT_MILE ; > ;
        < "Pika" ; FUNIT_PICA ; > ;
        < "Nokta" ; FUNIT_POINT ; > ;
    };
    ItemList [ language_user1 ] =
    {
            < " " ; FUNIT_MM ; > ;
        < " " ; FUNIT_CM ; > ;
        < " " ; FUNIT_M ; > ;
        < " " ; FUNIT_KM ; > ;
        < " " ; FUNIT_INCH ; > ;
        < " " ; FUNIT_FOOT ; > ;
        < " " ; FUNIT_MILE ; > ;
        < " " ; FUNIT_PICA ; > ;
        < " " ; FUNIT_POINT ; > ;
    };
    };
    GroupBox GB_TAB
    {
        Pos = MAP_APPFONT ( 134 , 101 ) ;
        Size = MAP_APPFONT ( 120 , 26 ) ;
        Text = "Tabulatorenabstand";
        Text [ ENGLISH ] = "Default Tab distance" ;
        Text [ italian ] = "Intervallo di tabulazione";
        Text [ portuguese_brazilian ] = "Default Tab distance";
        Text [ portuguese ] = "Intervalo entre tabulações";
        Text [ danish ] = "Tabulatorafstand";
        Text [ french ] = "Tabulations";
        Text [ swedish ] = "Tabulatoravstånd";
        Text [ dutch ] = "Tabstops";
        Text [ spanish ] = "Distancia entre tabuladores";
        Text [ english_us ] = "Tab stops";
    Text[ chinese_simplified ] = "ÖÆ±í·û¼ä¸ô";
    Text[ russian ] = "Øàã òàáóëÿöèè";
        Text[ polish ] = "Odstêp tabulatorów";
        Text[ japanese ] = "ÀÌފԊu";
        Text [ norwegian ] = "Standard tabulatoravstand" ;
        Text [ finnish ] = "Default Tab distance" ;
        Group = TRUE ;
        Text[ chinese_traditional ] = "»sªí²Å¶¡¹j";
        Text[ arabic ] = "ÚáÇãÇÊ ÇáÌÏæáÉ";
        Text[ greek ] = "ÁðïóôÜóåéò óôçëïèåôþí";
        Text[ korean ] = "ÅÇ ¸ØÃã";
        Text[ turkish ] = "Sekme duraðý";
        Text[ language_user1 ] = " ";
    };
    MetricField MF_TAB
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 140 , 110 ) ;
        Size = MAP_APPFONT ( 45 , 12 ) ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        SpinSize = 10 ;
        Minimum = 50 ;
        Maximum = 9999 ;
        First = 50 ;
        Last = 2000 ;
    };
};
/**************************************************************************/
/*                                                                        */
/*                                                                        */
/*                                                                        */
/**************************************************************************/
TabPage TP_OPTPRINT_PAGE
{
    HelpID = HID_OPTPRINT_PAGE ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Hide = TRUE ;
    GroupBox GRP_1
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 78 , 92 ) ;
        Text = "Inhalt" ;
        Text [ ENGLISH ] = "Contents" ;
        Text [ norwegian ] = "Innhold  " ;
        Text [ italian ] = "Contenuto" ;
        Text [ portuguese_brazilian ] = "Conteúdo" ;
        Text [ portuguese ] = "Conteúdo" ;
        Text [ finnish ] = "Sisältö" ;
        Text [ danish ] = "Indhold" ;
        Text [ french ] = "Contenu" ;
        Text [ swedish ] = "Innehåll" ;
        Text [ dutch ] = "Inhoud" ;
        Text [ spanish ] = "Contenido" ;
        Text [ english_us ] = "Contents" ;
        Group = TRUE ;
        Text[ chinese_simplified ] = "ÄÚÈÝ";
        Text[ russian ] = "Ñîäåðæèìîå";
        Text[ polish ] = "TreϾ";
        Text[ japanese ] = "“à—e";
        Text[ chinese_traditional ] = "¤º®e";
        Text[ arabic ] = "ÇáãÍÊæíÇÊ";
        Text[ greek ] = "Ðåñéå÷üìåíá";
        Text[ korean ] = "³»¿ë";
        Text[ turkish ] = "Ýçerik";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_PGRF
    {
        Pos = MAP_APPFONT ( 12 , 14 ) ;
        Size = MAP_APPFONT ( 66 , 10 ) ;
        Text = "~Grafiken" ;
        Text [ ENGLISH ] = "~Graphics" ;
        Text [ norwegian ] = "~Graphics" ;
        Text [ italian ] = "~Immagini" ;
        Text [ portuguese_brazilian ] = "~Gráficos" ;
        Text [ portuguese ] = "~Imagens" ;
        Text [ finnish ] = "~Kuvat" ;
        Text [ danish ] = "Billeder" ;
        Text [ french ] = "~Images" ;
        Text [ swedish ] = "~Grafiker" ;
        Text [ dutch ] = "A~fbeeldingen" ;
        Text [ spanish ] = "~Imágenes" ;
        Text [ english_us ] = "~Graphics" ;
        TabStop = TRUE ;
        Group = TRUE ;
        Text[ chinese_simplified ] = "ͼÐÎ(~G)";
        Text[ russian ] = "Ãðàôèêè";
        Text[ polish ] = "Grafiki";
        Text[ japanese ] = "¸Þ×̨¯¸(~G)";
        Text[ chinese_traditional ] = "¹Ï¤ù(~G)";
        Text[ arabic ] = "ÕæÑ";
        Text[ greek ] = "ÃñáöéêÜ";
        Text[ korean ] = "±×·¡ÇÈ(~G)";
        Text[ turkish ] = "Grafik";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_PTAB
    {
        Pos = MAP_APPFONT ( 12 , 27 ) ;
        Size = MAP_APPFONT ( 66 , 10 ) ;
        Text = "~Tabellen" ;
        Text [ ENGLISH ] = "~Tables" ;
        Text [ norwegian ] = "~Tables" ;
        Text [ italian ] = "~Tabelle" ;
        Text [ portuguese_brazilian ] = "~Tabelas" ;
        Text [ portuguese ] = "~Tabelas" ;
        Text [ finnish ] = "~Taulukot" ;
        Text [ danish ] = "Tabeller" ;
        Text [ french ] = "~Tableaux" ;
        Text [ swedish ] = "~Tabeller" ;
        Text [ dutch ] = "~Tabellen" ;
        Text [ spanish ] = "~Tablas" ;
        Text [ english_us ] = "~Tables" ;
        Text[ chinese_simplified ] = "±í¸ñ(~T)";
        Text[ russian ] = "Òàáëèöû";
        Text[ polish ] = "Ta~bele";
        Text[ japanese ] = "•\\(~T)";
        Text[ chinese_traditional ] = "ªí®æ(~T)";
        Text[ arabic ] = "ÌÏÇæá";
        Text[ greek ] = "Ðßíáêåò";
        Text[ korean ] = "ǥ(~T)";
        Text[ turkish ] = "Tablo";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_PDRAW
    {
        Pos = MAP_APPFONT ( 12 , 40 ) ;
        Size = MAP_APPFONT ( 66 , 10 ) ;
        Text = "Zei~chnungen" ;
        Text [ ENGLISH ] = "~Drawings" ;
        Text [ norwegian ] = "~Drawings" ;
        Text [ italian ] = "~Disegni" ;
        Text [ portuguese_brazilian ] = "~Drawings" ;
        Text [ portuguese ] = "~Desenhos" ;
        Text [ finnish ] = "~Drawings" ;
        Text [ danish ] = "Tegninger" ;
        Text [ french ] = "~Dessins" ;
        Text [ swedish ] = "Te~ckningar" ;
        Text [ dutch ] = "T~ekeningen" ;
        Text [ spanish ] = "~Dibujos" ;
        Text [ english_us ] = "Dra~wings" ;
        Text[ chinese_simplified ] = "»æÍ¼(~W)";
        Text[ russian ] = "Ðèñóíêè";
        Text[ polish ] = "Rysunki";
        Text[ japanese ] = "}Œ`•`‰æ(~W)";
        Text[ chinese_traditional ] = "ø¹Ï(~W)";
        Text[ arabic ] = "ÑÓæãÇÊ";
        Text[ greek ] = "Ó÷Ýäéá";
        Text[ korean ] = "±×¸®±â(~W)";
        Text[ turkish ] = "Çizim";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_CTRLFLD
    {
        Pos = MAP_APPFONT ( 12 , 53 ) ;
        Size = MAP_APPFONT ( 66 , 10 ) ;
        Text = "Kontroll~felder" ;
        Text [ ENGLISH ] = "Controls" ;
        Text [ norwegian ] = "Kontroller" ;
        Text [ italian ] = "Campi di controllo" ;
        Text [ portuguese_brazilian ] = "Controles" ;
        Text [ portuguese ] = "Campos de controlo" ;
        Text [ english_us ] = "Controls" ;
        Text [ finnish ] = "Ohjausobjektit" ;
        Text [ danish ] = "Kontrolelementer" ;
        Text [ french ] = "~Champs de contrôle" ;
        Text [ swedish ] = "Kontroll~fält" ;
        Text [ dutch ] = "Controle~velden" ;
        Text [ spanish ] = "~Campos de control" ;
        Text[ chinese_simplified ] = "¿ØÖÆ(~F)";
        Text[ russian ] = "Ýëåìåíòû óïðàâëåíèÿ";
        Text[ polish ] = "Pola kon~trolne";
        Text[ japanese ] = "ºÝÄÛ-Ù(~F)";
        Text[ chinese_traditional ] = "±±¨î¶µ(~F)";
        Text[ arabic ] = "ÚäÇÕÑ ÊÍßã";
        Text[ greek ] = "Ðåäßá åëÝã÷ïõ";
        Text[ korean ] = "ÄÁÆ®·Ñ";
        Text[ turkish ] = "Komut alanlarý";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_BACKGROUND
    {
        Pos = MAP_APPFONT ( 12 , 66 ) ;
        Size = MAP_APPFONT ( 66 , 10 ) ;
        Text = "H~intergrund" ;
        Text [ ENGLISH ] = "Background" ;
        Text [ dutch ] = "A~chtergrond" ;
        Text [ english_us ] = "Ba~ckground" ;
        Text [ italian ] = "Sfondo" ;
        Text [ spanish ] = "~Fondo" ;
        Text [ french ] = "A~rrière-plan" ;
        Text [ swedish ] = "Bak~grund" ;
        Text [ danish ] = "Baggrund" ;
        Text [ portuguese ] = "~Plano de fundo" ;
        Text [ portuguese_brazilian ] = "H~intergrund" ;
        Text[ chinese_simplified ] = "±³¾°(~C)";
        Text[ russian ] = "Ôîí";
        Text[ polish ] = "T³o";
        Text[ japanese ] = "”wŒi(~C)";
        Text[ chinese_traditional ] = "­I´º(~C)";
        Text[ arabic ] = "ÇáÎáÝíÉ";
        Text[ greek ] = "Öüíôï";
        Text[ korean ] = "¹è°æ(~C)";
        Text[ turkish ] = "Artalan";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_BLACK_FONT
    {
        Pos = MAP_APPFONT ( 12 , 79 ) ;
        Size = MAP_APPFONT ( 66 , 10 ) ;
        Text = "Sch~warz drucken" ;
        Text [ ENGLISH ] = "Print black" ;
        Text [ english_us ] = "Print blac~k" ;
        Text [ swedish ] = "S~vart utskrift" ;
        Text [ danish ] = "Udskriv sort" ;
        Text [ italian ] = "Stampa in nero" ;
        Text [ spanish ] = "Imprimir ~en negro" ;
        Text [ french ] = "Imprimer en ~noir" ;
        Text [ dutch ] = "~Zwart afdrukken" ;
        Text [ portuguese_brazilian ] = "Sch~warz drucken" ;
        Text [ portuguese ] = "Imprimir ~preto" ;
        Text[ chinese_simplified ] = "´òÓ¡ºÚÉ«(~K)";
        Text[ russian ] = "×åðíûì öâåòîì";
        Text[ polish ] = "Drukuj czarnym kol.";
        Text[ japanese ] = "•‚ňóü(~K)";
        Text[ chinese_traditional ] = "¦C¦L¶Â¦â(~K)";
        Text[ arabic ] = "ÇáØÈÇÚÉ ÈÇáæä ÃÓæÏ";
        Text[ greek ] = "Åêôýðùóç óå ìáýñï";
        Text[ korean ] = "°ËÁ¤ Àμâ(~K)";
        Text[ turkish ] = "Siyah/beyaz yazdýr";
        Text[ language_user1 ] = " ";
    };
    GroupBox GRP_2
    {
        Pos = MAP_APPFONT ( 90 , 3 ) ;
        Size = MAP_APPFONT ( 78 , /*92*/66 ) ;
        Text = "Seiten" ;
        Text [ ENGLISH ] = "Pages" ;
        Text [ norwegian ] = "Pages" ;
        Text [ italian ] = "Pagine" ;
        Text [ portuguese_brazilian ] = "Páginas" ;
        Text [ portuguese ] = "Páginas" ;
        Text [ finnish ] = "Sivumäärä" ;
        Text [ danish ] = "Sider" ;
        Text [ french ] = "Pages" ;
        Text [ swedish ] = "Sidor" ;
        Text [ dutch ] = "Pagina's" ;
        Text [ spanish ] = "Páginas" ;
        Text [ english_us ] = "Pages" ;
        Group = TRUE ;
        Text[ chinese_simplified ] = "ҳ";
        Text[ russian ] = "Ñòðàíèöû";
        Text[ polish ] = "Strony";
        Text[ japanese ] = "Íß°¼Þ";
        Text[ chinese_traditional ] = "­¶";
        Text[ arabic ] = "ÇáÕÝÍÇÊ";
        Text[ greek ] = "Óåëßäåò";
        Text[ korean ] = "ÆäÀÌÁö";
        Text[ turkish ] = "Sayfa";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_LEFTP
    {
        Pos = MAP_APPFONT ( 96 , 14 ) ;
        Size = MAP_APPFONT ( 66 , 10 ) ;
        Text = "~Linke Seiten" ;
        Text [ ENGLISH ] = "~Left pages" ;
        Text [ norwegian ] = "~Left pages" ;
        Text [ italian ] = "Pa~gine sinistre" ;
        Text [ portuguese_brazilian ] = "~Páginas esquerdas" ;
        Text [ portuguese ] = "~Páginas esquerdas" ;
        Text [ finnish ] = "~Vasemmat sivut" ;
        Text [ danish ] = "Venstre sider" ;
        Text [ french ] = "Pages de ~gauche" ;
        Text [ swedish ] = "~Vänstersidor" ;
        Text [ dutch ] = "~Linker pagina's" ;
        Text [ spanish ] = "Páginas ~izquierdas" ;
        Text [ english_us ] = "~Left pages" ;
        TabStop = TRUE ;
        Group = TRUE ;
        Text[ chinese_simplified ] = "×óÒ³(~L)";
        Text[ russian ] = "Ëåâûå ñòðàíèöû";
        Text[ polish ] = "~Lewe strony";
        Text[ japanese ] = "¶Íß°¼Þ(~L)";
        Text[ chinese_traditional ] = "¥ª­¶(~L)";
        Text[ arabic ] = "ÇáÕÝÍÇÊ ÇáíÓÑì";
        Text[ greek ] = "ÁñéóôåñÝò óåëßäåò";
        Text[ korean ] = "¿ÞÂÊ ÆäÀÌÁö(~L)";
        Text[ turkish ] = "Sol sayfalar";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_RIGHTP
    {
        Pos = MAP_APPFONT ( 96 , 27 ) ;
        Size = MAP_APPFONT ( 66 , 10 ) ;
        Text = "~Rechte Seiten" ;
        Text [ ENGLISH ] = "~Right pages" ;
        Text [ norwegian ] = "~Right pages" ;
        Text [ italian ] = "Pagine ~destre" ;
        Text [ portuguese_brazilian ] = "~Páginas direitas" ;
        Text [ portuguese ] = "~Páginas direitas" ;
        Text [ finnish ] = "~Oikeat sivut" ;
        Text [ danish ] = "Højre sider" ;
        Text [ french ] = "Pages de ~droite" ;
        Text [ swedish ] = "Höge~rsidor" ;
        Text [ dutch ] = "~Rechter pagina's" ;
        Text [ spanish ] = "Páginas derec~has" ;
        Text [ english_us ] = "~Right pages" ;
        Text[ chinese_simplified ] = "ÓÒÒ³(~H)";
        Text[ russian ] = "Ïðàâûå ñòðàíèöû";
        Text[ polish ] = "Prawe ~strony";
        Text[ japanese ] = "‰EÍß°¼Þ(~H)";
        Text[ chinese_traditional ] = "¥k­¶(~H)";
        Text[ arabic ] = "ÇáÕÝÍÇÊ Çáíãäì";
        Text[ greek ] = "ÄåîéÝò óåëßäåò";
        Text[ korean ] = "¿À¸¥ÂÊ ÆäÀÌÁö(~R)";
        Text[ turkish ] = "Sað sayfalar";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_REVERSE
    {
        Pos = MAP_APPFONT ( 96 , 40 ) ;
        Size = MAP_APPFONT ( 66 , 10 ) ;
        Text = "~Umgekehrt" ;
        Text [ ENGLISH ] = "Re~versed" ;
        Text [ norwegian ] = "Re~versed" ;
        Text [ italian ] = "I~nvertito" ;
        Text [ portuguese_brazilian ] = "Re~vertido" ;
        Text [ portuguese ] = "~Inversão" ;
        Text [ finnish ] = "~Käänteinen" ;
        Text [ danish ] = "Omvendt" ;
        Text [ french ] = "Ordre in~versé" ;
        Text [ swedish ] = "~Omvänt" ;
        Text [ dutch ] = "~Omgekeerd" ;
        Text [ spanish ] = "In~vertido" ;
        Text [ english_us ] = "Re~versed" ;
        Text[ chinese_simplified ] = "·´Ïò(~V)";
        Text[ russian ] = "Íàîáîðîò";
        Text[ polish ] = "Odwrotnie";
        Text[ japanese ] = "ˆóü‡˜‚ð‹t‚É‚·‚é(~V)";
        Text[ chinese_traditional ] = "¤Ï¦V(~V)";
        Text[ arabic ] = "ÈÊÑÊíÈ ãÚßæÓ";
        Text[ greek ] = "Áíôßóôñïöá";
        Text[ korean ] = "°Å²Ù·Î(~V)";
        Text[ turkish ] = "Ters sýra";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_PROSPECT
    {
        Pos = MAP_APPFONT ( 96 , 53 ) ;
        Size = MAP_APPFONT ( 66 , 10 ) ;
        Text = "Pr~ospekt" ;
        Text [ ENGLISH ] = "Pr~ospectus" ;
        Text [ dutch ] = "~Prospectus" ;
        Text [ english_us ] = "Bro~chure" ;
        Text [ italian ] = "Depliant" ;
        Text [ spanish ] = "~Prospecto" ;
        Text [ french ] = "Pr~ospectus" ;
        Text [ swedish ] = "Pr~ospekt" ;
        Text [ danish ] = "Brochure" ;
        Text [ portuguese_brazilian ] = "Pr~ospekt" ;
        Text [ portuguese ] = "Pr~ospecto" ;
        Text[ chinese_simplified ] = "СÊÖ²á(~C)";
        Text[ russian ] = "Áðîøþðà";
        Text[ polish ] = "Brosz~ura";
        Text[ japanese ] = "ÊßÝÌÚ¯Ä(~C)";
        Text[ chinese_traditional ] = "¤p¤â¥U(~C)";
        Text[ arabic ] = "äÔÑÉ";
        Text[ greek ] = "ÐñïóðÝêôïõò";
        Text[ korean ] = "ÆÊÇ÷¿(~C)";
        Text[ turkish ] = "Broþür";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_NO
    {
        Pos = MAP_APPFONT ( 180 , 14 ) ;
        Size = MAP_APPFONT ( 68 , 10 ) ;
        Text = "~Keine" ;
        Text [ ENGLISH ] = "~None" ;
        Text [ norwegian ] = "~Ingen " ;
        Text [ italian ] = "~Senza" ;
        Text [ portuguese_brazilian ] = "~Nenhum" ;
        Text [ portuguese ] = "~Nenhum" ;
        Text [ finnish ] = "~Ei ole" ;
        Text [ danish ] = "Ingen" ;
        Text [ french ] = "~Aucun(e)" ;
        Text [ swedish ] = "~Inga" ;
        Text [ dutch ] = "~Geen" ;
        Text [ spanish ] = "~Sin" ;
        Text [ english_us ] = "~None" ;
        TabStop = TRUE ;
        Group = TRUE ;
        Text[ chinese_simplified ] = "ÎÞ(~N)";
        Text[ russian ] = "~Áåç";
        Text[ polish ] = "Brak";
        Text[ japanese ] = "‚È‚µ(~N)";
        Text[ chinese_traditional ] = "µL(~N)";
        Text[ arabic ] = "ÈÏæä";
        Text[ greek ] = "~×ùñßò";
        Text[ korean ] = "¾øÀ½(~N)";
        Text[ turkish ] = "~Yok";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_ONLY
    {
        Pos = MAP_APPFONT ( 180 , 27 ) ;
        Size = MAP_APPFONT ( 68 , 10 ) ;
        Text = "~Nur Notizen" ;
        Text [ ENGLISH ] = "~Notes only" ;
        Text [ norwegian ] = "~Notes only" ;
        Text [ italian ] = "~Solo note" ;
        Text [ portuguese_brazilian ] = "~Observações apenas" ;
        Text [ portuguese ] = "~Só anotações" ;
        Text [ finnish ] = "~Vain huomautukset" ;
        Text [ danish ] = "Kun noter" ;
        Text [ french ] = "~Notes uniquement" ;
        Text [ swedish ] = "~Endast anteckningar" ;
        Text [ dutch ] = "A~lleen aantekeningen" ;
        Text [ spanish ] = "Solo ~notas" ;
        Text [ english_us ] = "Notes ~only" ;
        Text[ chinese_simplified ] = "Ö»ÊDZ¸×¢(~O)";
        Text[ russian ] = "Òîëüêî ïðèìå÷àíèÿ";
        Text[ polish ] = "Tylko notatki";
        Text[ japanese ] = "ÒӒ ‚Ì‚Ý(~O)";
        Text[ chinese_traditional ] = "¶È¬O³Æª`(~O)";
        Text[ arabic ] = "ãáÇÍÙÇÊ ÝÞØ";
        Text[ greek ] = "Ìüíï óçìåéþóåéò";
        Text[ korean ] = "¸Þ¸ð¸¸(~O)";
        Text[ turkish ] = "~Yalnýzca not";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_END
    {
        Pos = MAP_APPFONT ( 180 , 40 ) ;
        Size = MAP_APPFONT ( 68 , 10 ) ;
        Text = "Dokument~ende" ;
        Text [ ENGLISH ] = "End of ~document" ;
        Text [ norwegian ] = "End of ~document" ;
        Text [ italian ] = "Fine ~documento" ;
        Text [ portuguese_brazilian ] = "Final do ~documento" ;
        Text [ portuguese ] = "Fim de ~documento" ;
        Text [ finnish ] = "~Asiakirjan loppu" ;
        Text [ danish ] = "Dokumentets slutn." ;
        Text [ french ] = "Fin du ~document" ;
        Text [ swedish ] = "~Dokumentslut" ;
        Text [ dutch ] = "~Documenteinde" ;
        Text [ spanish ] = "~Fin del documento" ;
        Text [ english_us ] = "End of docu~ment" ;
        Text[ chinese_simplified ] = "ÎĵµÎ²¶Ë(~M)";
        Text[ russian ] = "Â êîíöå äîêóìåíòà";
        Text[ polish ] = "Koniec dokumentu";
        Text[ japanese ] = "ÄÞ·­ÒÝĖ–(~M)";
        Text[ chinese_traditional ] = "¤å¥ó§ÀºÝ(~M)";
        Text[ arabic ] = "äåÇíÉ ÇáãÓÊäÏ";
        Text[ greek ] = "ÔÝëïò êåéìÝíïõ";
        Text[ korean ] = "¹®¼­ÀÇ ³¡(~M)";
        Text[ turkish ] = "Belge ~sonu";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_PAGEEND
    {
        Pos = MAP_APPFONT ( 180 , 53 ) ;
        Size = MAP_APPFONT ( 68 , 10 ) ;
        Text = "~Seitenende" ;
        Text [ ENGLISH ] = "End of ~page" ;
        Text [ norwegian ] = "End of ~page" ;
        Text [ italian ] = "Fine ~pagina" ;
        Text [ portuguese_brazilian ] = "Final de ~página" ;
        Text [ portuguese ] = "Fim de ~página" ;
        Text [ finnish ] = "~Sivun loppu" ;
        Text [ danish ] = "Sidens slutning" ;
        Text [ french ] = "Fin de la ~page" ;
        Text [ swedish ] = "~Sidslut" ;
        Text [ dutch ] = "Pag~ina-einde" ;
        Text [ spanish ] = "Fi~n de página" ;
        Text [ english_us ] = "~End of page" ;
        Text[ chinese_simplified ] = "ҳβ(~E)";
        Text[ russian ] = "Â êîíöå ñòðàíèöû";
        Text[ polish ] = "Konie~c strony";
        Text[ japanese ] = "Íß°¼Þ––(~E)";
        Text[ chinese_traditional ] = "­¶§À(~E)";
        Text[ arabic ] = "äåÇíÉ ÇáÕÝÍÉ";
        Text[ greek ] = "ÔÝëïò óåëßäáò";
        Text[ korean ] = "ÆäÀÌÁöÀÇ ³¡(~E)";
        Text[ turkish ] = "~Sayfa sonu";
        Text[ language_user1 ] = " ";
    };
    GroupBox GRP_3
    {
        Pos = MAP_APPFONT ( 174 , 3 ) ;
        Size = MAP_APPFONT ( 80 , /*92*/66 ) ;
        Text = "Notizen" ;
        Text [ ENGLISH ] = "Notes" ;
        Text [ norwegian ] = "Notes" ;
        Text [ italian ] = "Note" ;
        Text [ portuguese_brazilian ] = "Notas" ;
        Text [ portuguese ] = "Anotações" ;
        Text [ finnish ] = "Huomautukset" ;
        Text [ danish ] = "Noter" ;
        Text [ french ] = "Notes" ;
        Text [ swedish ] = "Anteckningar" ;
        Text [ dutch ] = "Aantekeningen" ;
        Text [ spanish ] = "Notas" ;
        Text [ english_us ] = "Notes" ;
        Group = TRUE ;
        Text[ chinese_simplified ] = "±¸×¢";
        Text[ russian ] = "Ïðèìå÷àíèÿ";
        Text[ polish ] = "Notatki";
        Text[ japanese ] = "ÒӒ ";
        Text[ chinese_traditional ] = "³Æª`";
        Text[ arabic ] = "ãáÇÍÙÇÊ";
        Text[ greek ] = "Óçìåéþóåéò";
        Text[ korean ] = "¸Þ¸ð";
        Text[ turkish ] = "Not";
        Text[ language_user1 ] = " ";
    };

    GroupBox GRP_5
    {
        Pos = MAP_APPFONT ( 90 , 70 ) ;
        Size = MAP_APPFONT ( 164 , 25 ) ;
        Text = "Ausgabe" ;
        Text [ ENGLISH ] = "Destination" ;
        Text [ english_us ] = "Output" ;
        Text [ italian ] = "Destinazione" ;
        Text [ spanish ] = "Destino" ;
        Text [ french ] = "Sortie" ;
        Text [ dutch ] = "Uitgave" ;
        Text [ swedish ] = "Utdata" ;
        Text [ danish ] = "Output" ;
        Text [ portuguese_brazilian ] = "Ausgabe" ;
        Text [ portuguese ] = "Destino" ;
        Text[ chinese_simplified ] = "Êä³ö";
        Text[ russian ] = "Âûâîä";
        Text[ polish ] = "Wyjœcie";
        Text[ japanese ] = "±³ÄÌ߯Ä";
        Text[ chinese_traditional ] = "¿é¥X";
        Text[ arabic ] = "ÇáÅÎÑÇÌ";
        Text[ greek ] = "ÅîáãùãÞ";
        Text[ korean ] = "Ãâ·Â";
        Text[ turkish ] = "Çýktý";
    };
    CheckBox CB_SINGLEJOBS
    {
        Pos = MAP_APPFONT ( 96 , 81 ) ;
        Size = MAP_APPFONT ( 152 , 10 ) ;
        Text = "Einzelne Druck~jobs erzeugen" ;
        Text [ ENGLISH ] = "Si~ngle print jobs" ;
        TabStop = TRUE ;
        Text [ english_us ] = "Create ~single print jobs" ;
        Text [ portuguese_brazilian ] = "Einzelne Druckjobs erzeugen" ;
        Text [ swedish ] = "Skapa enstaka utskrifts~jobb" ;
        Text [ danish ] = "Opret enkelte printerjob" ;
        Text [ italian ] = "Cr~ea singoli ordini di stampa" ;
        Text [ spanish ] = "Crear ~tareas individuales de impresión" ;
        Text [ french ] = "~Travaux d'impression individuels" ;
        Text [ dutch ] = "Af~zonderlijke afdrukjobs" ;
        Text [ portuguese ] = "C~riar tarefas de impressão individuais" ;
        Text[ chinese_simplified ] = "½¨Á¢µ¥¸ö´òÓ¡ÈÎÎñ(~S)";
        Text[ russian ] = "Ñîçäàòü îòäåëüíûå çàäàíèÿ ïå÷àòè";
        Text[ polish ] = "Utwórz pojedyncze zadania wydruku";
        Text[ japanese ] = "1‚‚¸‚ˆóü(~S)";
        Text[ chinese_traditional ] = "¥Í¦¨³æ­Ó¦C¦L¥ô°È(~S)";
        Text[ arabic ] = "ÅäÔÇÁ æÙÇÆÝ ØÈÇÚÉ ÝÑÏíÉ";
        Text[ greek ] = "Äçìéïõñãßá ìåìïíùìÝíùí åñãáóéþí åêôýðùóçò";
        Text[ korean ] = "´ÜÀÏ Àμâ ÀÛ¾÷¸¸µé±â(~S)";
        Text[ turkish ] = "Bi~reysel yazdýrma iþleri oluþtur";
    };

    CheckBox CB_PAPERFROMSETUP
    {
        Pos = MAP_APPFONT ( 138 , 112 ) ;
        Size = MAP_APPFONT ( 108 , 10 ) ;
        TabStop = TRUE ;
        Text = "aus ~Druckereinstellung" ;
        Text [ ENGLISH ] = "from printer ~setup" ;
        Text [ norwegian ] = "from printer ~setup" ;
        Text [ italian ] = "Come da  imposta~zione stampante" ;
        Text [ portuguese_brazilian ] = "da impressora ~setup" ;
        Text [ portuguese ] = "Da configuração da ~impressora" ;
        Text [ finnish ] = "kirjoittimen ~asetuksista" ;
        Text [ danish ] = "fra udskriftsindstillingerne" ;
        Text [ french ] = "d'après ~les paramètres de l'imprimante" ;
        Text [ swedish ] = "från ~skrivarinställning" ;
        Text [ dutch ] = "~uit printerinstelling" ;
        Text [ spanish ] = "De la c~onfiguración de la impresora" ;
        Text [ english_us ] = "From printer ~settings" ;
        Group = TRUE ;
        Text[ chinese_simplified ] = "²ÉÓôòÓ¡»úµÄÉ趨(~S)";
        Text[ russian ] = "èç íàñòðîéêè ïðèíòåðà";
        Text[ polish ] = "Z ustaw~ienia drukarki";
        Text[ japanese ] = "ÌߨÝÀ‚̐ݒ肩‚ç(~S)";
        Text[ chinese_traditional ] = "±Ä¥Î¦Lªí¾÷ªº³]©w(~S)";
        Text[ arabic ] = "ãä ÅÚÏÇÏÇÊ ÇáØÇÈÚÉ";
        Text[ greek ] = "áðü ôéò ñõèìßóåéò ôïõ åêôõðùôÞ";
        Text[ korean ] = "ÇÁ¸°ÅÍ ¼³Á¤À¸·Î ºÎÅÍ(~S)";
        Text[ turkish ] = "Yazýcý ayarlarýný kullan";
        Text[ language_user1 ] = " ";
    };
    GroupBox GRP_4
    {
        Pos = MAP_APPFONT ( 132 , 101 ) ;
        Size = MAP_APPFONT ( 122 , 29 ) ;
        Text = "Papierschacht" ;
        Text [ English ] = "Paper tray" ;
        Text [ norwegian ] = "Paper tray" ;
        Text [ italian ] = "Cassetto" ;
        Text [ portuguese_brazilian ] = "Bandeja para o papel" ;
        Text [ portuguese ] = "Tabuleiro de alimentação" ;
        Text [ finnish ] = "Paperilokero" ;
        Text [ danish ] = "Papirbakke" ;
        Text [ french ] = "Bac d'alimentation" ;
        Text [ swedish ] = "Pappersmagasin" ;
        Text [ dutch ] = "Papierinvoer" ;
        Text [ spanish ] = "Origen del papel" ;
        Text [ english_us ] = "Paper tray" ;
        Group = TRUE ;
        Text[ chinese_simplified ] = "Ö½ÕÅÀ´Ô´";
        Text[ russian ] = "Ïîäà÷à áóìàãè";
        Text[ polish ] = "Zasobnik papieru";
        Text[ japanese ] = "‹‹Ž†•û–@";
        Text[ chinese_traditional ] = "¯È±i¨Ó·½";
        Text[ arabic ] = "ÏÑÌ ÇáæÑÞ";
        Text[ greek ] = "Äßóêïò ÷áñôéïý";
        Text[ korean ] = "¿ëÁö °ø±Þ";
        Text[ turkish ] = "Kaðýt kaynaðý";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_FAX
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 12 , 112 ) ;
        Size = MAP_APPFONT ( 108 , 70 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        Sort = TRUE ;
        Group = TRUE ;
    };
    GroupBox GB_FAX
    {
        Pos = MAP_APPFONT ( 6 , 101 ) ;
        Size = MAP_APPFONT ( 120 , 29 ) ;
        Text = "Fax" ;
        Text[English] = "Fax" ;
        Group = TRUE ;
        Text[ english_us ] = "Fax";
        Text[ portuguese ] = "Fax";
        Text[ russian ] = "Ôàêñ";
        Text[ greek ] = "Fax";
        Text[ dutch ] = "Fax";
        Text[ french ] = "Fax";
        Text[ spanish ] = "Fax";
        Text[ italian ] = "Fax";
        Text[ danish ] = "Fax";
        Text[ swedish ] = "Fax";
        Text[ polish ] = "Faks";
        Text[ portuguese_brazilian ] = "Fax";
        Text[ japanese ] = "Fax";
        Text[ korean ] = "ÆÑ½º";
        Text[ chinese_simplified ] = "´«Õæ";
        Text[ chinese_traditional ] = "¶Ç¯u";
        Text[ arabic ] = "ÇáÝÇßÓ";
        Text[ turkish ] = "Faks";
        Text[ language_user1 ] = " ";
    };
};
/**************************************************************************/
/*                                                                        */
/*                                                                        */
/*                                                                        */
/**************************************************************************/
TabPage TP_STD_FONT
{
    HelpID = HID_STD_FONT ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Hide = TRUE ;
    GroupBox GB_STDCHR
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 159 , 113 ) ;
        Text = "Grundschriften" ;
        Text [ English ] = "Standard fonts" ;
        Text [ norwegian ] = "Standard fonts" ;
        Text [ italian ] = "Caratteri standard" ;
        Text [ portuguese_brazilian ] = "Fontes padrao" ;
        Text [ portuguese ] = "Tipos de letra padrão" ;
        Text [ finnish ] = "Vakiofontit" ;
        Text [ danish ] = "Standardskrifttyper" ;
        Text [ french ] = "Polices de base" ;
        Text [ swedish ] = "Standardteckensnitt" ;
        Text [ dutch ] = "Standaardlettertypen" ;
        Text [ spanish ] = "Fuentes estándar" ;
        Text [ english_us ] = "Default fonts" ;
        Text[ chinese_simplified ] = "±ê×¼×ÖÌå";
        Text[ russian ] = "Ñòàíäàðòíûå øðèôòû";
        Text[ polish ] = "Czcionki podstawowe";
        Text[ japanese ] = "Šù’è‚ÌÌ«ÝÄ";
        Text[ chinese_traditional ] = "¼Ð·Ç¦r«¬";
        Text[ arabic ] = "ÇáÎØæØ ÇáÃÓÇÓíÉ";
        Text[ greek ] = "ÂáóéêÝò ãñáììáôïóåéñÝò";
        Text[ korean ] = "±âº» ±Û²Ã";
        Text[ turkish ] = "Standart yazýtipi";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_STANDARD
    {
        Pos = MAP_APPFONT ( 12 , 15 ) ;
        Size = MAP_APPFONT ( 48 , 10 ) ;
        Text = "~Standard" ;
        Text [ English ] = "~Standard" ;
        Left = TRUE ;
        Text [ english_us ] = "~Standard" ;
        Text [ portuguese_brazilian ] = "~Standard" ;
        Text [ swedish ] = "~Standard" ;
        Text [ danish ] = "Standard" ;
        Text [ italian ] = "~Standard" ;
        Text [ spanish ] = "~Predeterminado" ;
        Text [ french ] = "~Standard" ;
        Text [ dutch ] = "~Standaard" ;
        Text [ portuguese ] = "~Padrão" ;
        Text[ chinese_simplified ] = "±ê×¼(~S)";
        Text[ russian ] = "Ñòàíäàðò";
        Text[ polish ] = "Domyœlnie";
        Text[ japanese ] = "•W€(~S)";
        Text[ chinese_traditional ] = "¼Ð·Ç(~S)";
        Text[ arabic ] = "ÞíÇÓí";
        Text[ greek ] = "ÐñïåðéëïãÞ";
        Text[ korean ] = "Ç¥ÁØ(~S)";
        Text[ turkish ] = "~Standart";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_TITLE
    {
        Pos = MAP_APPFONT ( 12 , 32 ) ;
        Size = MAP_APPFONT ( 48 , 10 ) ;
        Text = "~Überschrift" ;
        Text [ English ] = "~Title" ;
        Text [ norwegian ] = "~Tittel" ;
        Text [ italian ] = "~Intestazione" ;
        Text [ portuguese_brazilian ] = "~Título" ;
        Text [ portuguese ] = "~Título" ;
        Text [ finnish ] = "~Arvo" ;
        Text [ danish ] = "Overskrift" ;
        Text [ french ] = "~Titre" ;
        Text [ swedish ] = "~Överskrift" ;
        Text [ dutch ] = "~Kop" ;
        Text [ spanish ] = "~Encabezado" ;
        Text [ english_us ] = "~Heading" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "±êÌâ(~H)";
        Text[ russian ] = "Çàãîëîâîê";
        Text[ polish ] = "Nag³ówek";
        Text[ japanese ] = "Œ©o‚µ(~H)";
        Text[ chinese_traditional ] = "¼ÐÃD(~H)";
        Text[ arabic ] = "ÇáÚäæÇä";
        Text[ greek ] = "Åðéêåöáëßäá";
        Text[ korean ] = "¸Ó¸®±Û(~H)";
        Text[ turkish ] = "~Baþlýk";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_LIST
    {
        Pos = MAP_APPFONT ( 12 , 49 ) ;
        Size = MAP_APPFONT ( 48 , 10 ) ;
        Text = "~Liste" ;
        Text [ English ] = "~List" ;
        Text [ norwegian ] = "~List" ;
        Text [ italian ] = "~Elenco" ;
        Text [ portuguese_brazilian ] = "~Lista" ;
        Text [ portuguese ] = "~Lista" ;
        Text [ finnish ] = "~Luettelo" ;
        Text [ danish ] = "Liste" ;
        Text [ french ] = "L~iste" ;
        Text [ swedish ] = "~Lista" ;
        Text [ dutch ] = "~Lijst" ;
        Text [ spanish ] = "~Lista" ;
        Text [ english_us ] = "~List" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "Áе¥(~L)";
        Text[ russian ] = "Ñïèñîê";
        Text[ polish ] = "Lista";
        Text[ japanese ] = "ؽÄ(~L)";
        Text[ chinese_traditional ] = "²M³æ(~L)";
        Text[ arabic ] = "ÇáÞÇÆãÉ";
        Text[ greek ] = "Ëßóôá";
        Text[ korean ] = "¸®½ºÆ®(~L)";
        Text[ turkish ] = "~Liste";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_LABEL
    {
        Pos = MAP_APPFONT ( 12 , 66 ) ;
        Size = MAP_APPFONT ( 48 , 10 ) ;
        Text = "~Beschriftung" ;
        Text [ English ] = "Caption" ;
        Text [ norwegian ] = "Bildetekst" ;
        Text [ italian ] = "Dicitura" ;
        Text [ portuguese_brazilian ] = "Captura" ;
        Text [ portuguese ] = "~Legenda" ;
        Text [ finnish ] = "Selite" ;
        Text [ danish ] = "Billedtekst" ;
        Text [ french ] = "~Légende" ;
        Text [ swedish ] = "~Bildtext" ;
        Text [ dutch ] = "~Bijschrift" ;
        Text [ spanish ] = "E~tiqueta" ;
        Text [ english_us ] = "C~aption" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "±êÇ©(~A)";
        Text[ russian ] = "Íàçâàíèå";
        Text[ polish ] = "Opis";
        Text[ japanese ] = "×ÍÞÙ(~A)";
        Text[ chinese_traditional ] = "¼ÐÅÒ(~A)";
        Text[ arabic ] = "ÊÓãíÉ ÊæÖíÍíÉ";
        Text[ greek ] = "ÅðéãñáöÞ";
        Text[ korean ] = "ĸ¼Ç(~A)";
        Text[ turkish ] = "~Resim yazýsý";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_IDX
    {
        Pos = MAP_APPFONT ( 12 , 83 ) ;
        Size = MAP_APPFONT ( 48 , 10 ) ;
        Text = "~Verzeichnis" ;
        Text [ English ] = "~Index" ;
        Text [ norwegian ] = "~Index" ;
        Text [ italian ] = "~Indice" ;
        Text [ portuguese_brazilian ] = "~Índice" ;
        Text [ portuguese ] = "~Índice" ;
        Text [ finnish ] = "~Hakemisto" ;
        Text [ danish ] = "Indeks" ;
        Text [ french ] = "~Index" ;
        Text [ swedish ] = "~Katalog" ;
        Text [ dutch ] = "~Index" ;
        Text [ spanish ] = "Í~ndice" ;
        Text [ english_us ] = "~Index" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "Ŀ¼(~I)";
        Text[ russian ] = "Óêàçàòåëü";
        Text[ polish ] = "Indeks";
        Text[ japanese ] = "–ÚŽŸ‚ƍõˆø(~I)";
        Text[ chinese_traditional ] = "¥Ø¿ý(~I)";
        Text[ arabic ] = "ÇáÝåÑÓ";
        Text[ greek ] = "ÅõñåôÞñéï";
        Text[ korean ] = "»öÀÎ(~I)";
        Text[ turkish ] = "~Dizin";
        Text[ language_user1 ] = " ";
    };
    ComboBox LB_STANDARD
    {
        Pos = MAP_APPFONT ( 63 , 14 ) ;
        Size = MAP_APPFONT ( 96 , 73 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        Sort = TRUE ;
    };
    ComboBox LB_TITLE
    {
        Pos = MAP_APPFONT ( 63 , 31 ) ;
        Size = MAP_APPFONT ( 96 , 73 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        Sort = TRUE ;
    };
    ComboBox LB_LIST
    {
        Pos = MAP_APPFONT ( 63 , 48 ) ;
        Size = MAP_APPFONT ( 96 , 73 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        Sort = TRUE ;
    };
    ComboBox LB_LABEL
    {
        Pos = MAP_APPFONT ( 63 , 65 ) ;
        Size = MAP_APPFONT ( 96 , 73 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        Sort = TRUE ;
    };
    ComboBox LB_IDX
    {
        Pos = MAP_APPFONT ( 63 , 83 ) ;
        Size = MAP_APPFONT ( 96 , 73 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        Sort = TRUE ;
    };
    CheckBox CB_DOCONLY
    {
        Pos = MAP_APPFONT ( 12 , 100 ) ;
        Size = MAP_APPFONT ( 147 , 10 ) ;
        Text = "~Nur für das aktuelle Dokument" ;
        Text [ English ] = "Actual document only" ;
        Text [ dutch ] = "~Alleen in het actuele document" ;
        Text [ english_us ] = "C~urrent document only" ;
        Text [ italian ] = "Solo per il documento corrente" ;
        Text [ spanish ] = "Solo para el documento ~actual" ;
        Text [ french ] = "~Uniquement pour le document actif" ;
        Text [ swedish ] = "Bara för det ~aktuella dokumentet" ;
        Text [ danish ] = "Kun det aktuelle dokument" ;
        Text [ portuguese ] = "~Apenas para documento actual" ;
        Text [ portuguese_brazilian ] = "~Nur für das aktuelle Dokument" ;
        Text[ chinese_simplified ] = "Ö»ÓÃÓÚµ±Ç°µÄÎĵµ(~O)";
        Text[ russian ] = "Òîëüêî äëÿ òåêóùåãî äîêóìåíòà";
        Text[ polish ] = "Tylko dla aktualnego dokumentu";
        Text[ japanese ] = "Œ»Ýì‹Æ’†‚ÌÄÞ·­ÒÝĂ̂Ý(~O)";
        Text[ chinese_traditional ] = "¶ÈÓì¥Î©ó·í«eªº¤å¥ó(~O)";
        Text[ arabic ] = "ááãÓÊäÏ ÇáÍÇáí ÝÞØ";
        Text[ greek ] = "Ìüíï ãéá ôï ôñÝ÷ùí Ýããñáöï";
        Text[ korean ] = "ÇöÀç ¹®¼­ ¸¸(~U)";
        Text[ turkish ] = "Yalnýzca açýk belge için";
        Text[ language_user1 ] = " ";
    };
    PushButton PB_STANDARD
    {
        Pos = MAP_APPFONT ( 171 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        Text = "S~tandard" ;
        Text [ English ] = "S~tandard" ;
        Text [ english_us ] = "~Default" ;
        Text [ italian ] = "~Standard" ;
        Text [ spanish ] = "~Predeterminado" ;
        Text [ french ] = "P~ar défaut" ;
        Text [ dutch ] = "S~tandaard" ;
        Text [ swedish ] = "St~andard" ;
        Text [ danish ] = "Standard" ;
        Text [ portuguese_brazilian ] = "S~tandard" ;
        Text [ portuguese ] = "~Padrão" ;
        Text[ chinese_simplified ] = "±ê×¼(~D)";
        Text[ russian ] = "Ñòàíäàðò";
        Text[ polish ] = "Standardowy";
        Text[ japanese ] = "•W€(~D)";
        Text[ chinese_traditional ] = "¼Ð·Ç(~D)";
        Text[ arabic ] = "ÇÝÊÑÇÖí";
        Text[ greek ] = "ÐñïåðéëïãÞ";
        Text[ korean ] = "±âº»°ª(~D)";
        Text[ turkish ] = "S~tandart";
        Text[ language_user1 ] = " ";
    };
};
/**************************************************************************/
/*                                                                        */
/*                                                                        */
/*                                                                        */
/**************************************************************************/
TabPage TP_OPTTABLE_PAGE
{
    HelpID = HID_OPTTABLE_PAGE ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Hide = TRUE ;
    GroupBox GB_MOVE
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 120 , 39 ) ;
        Text = "Verschieben" ;
        Text [ English ] = "Move" ;
        Text [ english_us ] = "Shift" ;
        Text [ portuguese_brazilian ] = "Verschieben" ;
        Text [ swedish ] = "Flytta" ;
        Text [ danish ] = "Flyt" ;
        Text [ italian ] = "Sposta" ;
        Text [ spanish ] = "Desplazar" ;
        Text [ french ] = "Décaler" ;
        Text [ dutch ] = "Verplaatsen" ;
        Text [ portuguese ] = "Mover" ;
        Text[ chinese_simplified ] = "ÒÆ¶¯";
        Text[ russian ] = "Ïåðåìåñòèòü";
        Text[ polish ] = "Przesuñ";
        Text[ japanese ] = "ˆÚ“®";
        Text[ chinese_traditional ] = "²¾°Ê";
        Text[ arabic ] = "ÅÒÇÍÉ";
        Text[ greek ] = "Ìåôáêßíçóç";
        Text[ korean ] = "¹Ð±â";
        Text[ turkish ] = "Taþý";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_ROWMOVE
    {
        Pos = MAP_APPFONT ( 12 , 12 ) ;
        Size = MAP_APPFONT ( 51 , 10 ) ;
        Text = "~Zeile" ;
        Text [ English ] = "~Row" ;
        Text [ english_us ] = "~Row" ;
        Text [ portuguese_brazilian ] = "~Zeile" ;
        Text [ swedish ] = "~Rad" ;
        Text [ danish ] = "Række" ;
        Text [ italian ] = "Riga" ;
        Text [ spanish ] = "~Fila" ;
        Text [ french ] = "~Ligne" ;
        Text [ dutch ] = "~Rij" ;
        Text [ portuguese ] = "~Linha" ;
        Text[ chinese_simplified ] = "ÐÐ(~R)";
        Text[ russian ] = "Ñòðîêà";
        Text[ polish ] = "Wiersz";
        Text[ japanese ] = "s(~R)";
        Text[ chinese_traditional ] = "¦æ(~R)";
        Text[ arabic ] = "ÕÝ";
        Text[ greek ] = "ÃñáììÞ";
        Text[ korean ] = "Çà(~R)";
        Text[ turkish ] = "~Satýr";
        Text[ language_user1 ] = " ";
    };
    MetricField MF_ROWMOVE
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 66 , 11 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        SpinSize = 10 ;
        Minimum = 25 ;
        Maximum = 999 ;
        First = 25 ;
        Last = 2000 ;
    };
    FixedText FT_COLMOVE
    {
        Pos = MAP_APPFONT ( 12 , 27 ) ;
        Size = MAP_APPFONT ( 51 , 10 ) ;
        Text = "~Spalte" ;
        Text [ English ] = "~Column" ;
        Text [ english_us ] = "~Column" ;
        Text [ portuguese_brazilian ] = "~Spalte" ;
        Text [ swedish ] = "~Kolumn" ;
        Text [ danish ] = "Kolonne" ;
        Text [ italian ] = "Colonna" ;
        Text [ spanish ] = "~Columna" ;
        Text [ french ] = "C~olonne" ;
        Text [ dutch ] = "~Kolom" ;
        Text [ portuguese ] = "~Coluna" ;
        Text[ chinese_simplified ] = "ÁÐ(~C)";
        Text[ russian ] = "Êîëîíêà";
        Text[ polish ] = "Kolumna";
        Text[ japanese ] = "—ñ(~C)";
        Text[ chinese_traditional ] = "Äæ(~C)";
        Text[ arabic ] = "ÚãæÏ";
        Text[ greek ] = "ÓôÞëç";
        Text[ korean ] = "¿­(~C)";
        Text[ turkish ] = "S~ütun";
        Text[ language_user1 ] = " ";
    };
    MetricField MF_COLMOVE
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 66 , 26 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        SpinSize = 10 ;
        Minimum = 25 ;
        Maximum = 999 ;
        First = 25 ;
        Last = 2000 ;
    };
    GroupBox GB_INSERT
    {
        Pos = MAP_APPFONT ( 132 , 3 ) ;
        Size = MAP_APPFONT ( 120 , 39 ) ;
        Text = "Einfügen" ;
        Text [ English ] = "Insert" ;
        Text [ english_us ] = "Insert" ;
        Text [ portuguese_brazilian ] = "Einfügen" ;
        Text [ swedish ] = "Infoga" ;
        Text [ danish ] = "Indsæt" ;
        Text [ italian ] = "Inserisci" ;
        Text [ spanish ] = "Insertar" ;
        Text [ french ] = "Insérer" ;
        Text [ dutch ] = "Invoegen" ;
        Text [ portuguese ] = "Inserir" ;
        Text[ chinese_simplified ] = "²åÈë";
        Text[ russian ] = "Âñòàâèòü";
        Text[ polish ] = "Wstaw";
        Text[ japanese ] = "‘}“ü";
        Text[ chinese_traditional ] = "´¡¤J";
        Text[ arabic ] = "ÅÏÑÇÌ";
        Text[ greek ] = "ÅéóáãùãÞ";
        Text[ korean ] = "»ðÀÔ";
        Text[ turkish ] = "Ekle";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_ROWINSERT
    {
        Pos = MAP_APPFONT ( 138 , 12 ) ;
        Size = MAP_APPFONT ( 51 , 10 ) ;
        Text = "Z~eile" ;
        Text [ English ] = "Ro~w" ;
        Text [ english_us ] = "Ro~w" ;
        Text [ portuguese_brazilian ] = "Z~eile" ;
        Text [ swedish ] = "Ra~d" ;
        Text [ danish ] = "Række" ;
        Text [ italian ] = "Riga" ;
        Text [ spanish ] = "F~ila" ;
        Text [ french ] = "~Ligne" ;
        Text [ dutch ] = "R~ij" ;
        Text [ portuguese ] = "~Linha" ;
        Text[ chinese_simplified ] = "ÐÐ(~W)";
        Text[ russian ] = "Ñòðîêà";
        Text[ polish ] = "Wiersz";
        Text[ japanese ] = "s(~Wj";
        Text[ chinese_traditional ] = "¦æ(~W)";
        Text[ arabic ] = "ÕÝ";
        Text[ greek ] = "ÃñáììÞ";
        Text[ korean ] = "¿­(~W)";
        Text[ turkish ] = "S~atýr";
        Text[ language_user1 ] = " ";
    };
    MetricField MF_ROWINSERT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 192 , 11 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        SpinSize = 10 ;
        Minimum = 25 ;
        Maximum = 999 ;
        First = 25 ;
        Last = 2000 ;
    };
    FixedText FT_COLINSERT
    {
        Pos = MAP_APPFONT ( 138 , 27 ) ;
        Size = MAP_APPFONT ( 51 , 10 ) ;
        Text = "S~palte" ;
        Text [ English ] = "C~olumn" ;
        Text [ portuguese ] = "~Coluna" ;
        Text [ english_us ] = "Colu~mn" ;
        Text [ portuguese_brazilian ] = "S~palte" ;
        Text [ swedish ] = "K~olumn" ;
        Text [ danish ] = "Kolonne" ;
        Text [ italian ] = "Colonna" ;
        Text [ spanish ] = "C~olumna" ;
        Text [ french ] = "C~olonne" ;
        Text [ dutch ] = "K~olom" ;
        Text[ chinese_simplified ] = "ÁÐ(~M)";
        Text[ russian ] = "Êîëîíêà";
        Text[ polish ] = "Kolumna";
        Text[ japanese ] = "—ñ(~M)";
        Text[ chinese_traditional ] = "Äæ(~M)";
        Text[ arabic ] = "ÚãæÏ";
        Text[ greek ] = "ÓôÞëç";
        Text[ korean ] = "¿­(~M)";
        Text[ turkish ] = "~Sütun";
        Text[ language_user1 ] = " ";
    };
    MetricField MF_COLINSERT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 192 , 26 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        SpinSize = 10 ;
        Minimum = 25 ;
        Maximum = 999 ;
        First = 25 ;
        Last = 2000 ;
    };
    GroupBox GB_HANDLING
    {
        Pos = MAP_APPFONT ( 6 , 45 ) ;
        Size = MAP_APPFONT ( 246 , 74 ) ;
        Text = "Verhalten" ;
        Text [ English ] = "Behaviour" ;
        Text [ english_us ] = "Behavior" ;
        Text [ portuguese_brazilian ] = "Verhalten" ;
        Text [ swedish ] = "Effekt" ;
        Text [ danish ] = "Effekt" ;
        Text [ italian ] = "Effetto" ;
        Text [ spanish ] = "Comportamiento" ;
        Text [ french ] = "Fonctionnement" ;
        Text [ dutch ] = "Effect" ;
        Text [ portuguese ] = "Efeito" ;
        Text[ chinese_simplified ] = "·½Ê½";
        Text[ russian ] = "Ñâîéñòâà";
        Text[ polish ] = "Efekt";
        Text[ japanese ] = "•ύX‚Ő¶‚¶‚é‰e‹¿‚𒲐®";
        Text[ chinese_traditional ] = "¤è¦¡";
        Text[ arabic ] = "ÇáÊÃËíÑÇÊ";
        Text[ greek ] = "ÓõìðåñéöïñÜ";
        Text[ korean ] = "È¿°ú";
        Text[ turkish ] = "Etki";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_FIX
    {
        Pos = MAP_APPFONT ( 12 , 56 ) ;
        Size = MAP_APPFONT ( 78 , 10 ) ;
        Text = "~Fix" ;
        Text [ English ] = "~Fix" ;
        Text [ english_us ] = "~Fixed" ;
        Text [ portuguese_brazilian ] = "~Fix" ;
        Text [ swedish ] = "~Fast" ;
        Text [ danish ] = "Fast" ;
        Text [ italian ] = "~Fisso" ;
        Text [ spanish ] = "Fi~jo" ;
        Text [ french ] = "~Fixe" ;
        Text [ dutch ] = "Va~st" ;
        Text [ portuguese ] = "~Fixo" ;
        Text[ chinese_simplified ] = "¹Ì¶¨(~F)";
        Text[ russian ] = "Ôèêñ.";
        Text[ polish ] = "Sta³y";
        Text[ japanese ] = "΁Տ(~F)";
        Text[ chinese_traditional ] = "©T©w(~F)";
        Text[ arabic ] = "ËÇÈÊ";
        Text[ greek ] = "ÓôáèåñÜ";
        Text[ korean ] = "°íÁ¤µÊ(~F)";
        Text[ turkish ] = "Sab~it";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_FIX
    {
        Pos = MAP_APPFONT ( 93 , 56 ) ;
        Size = MAP_APPFONT ( 155 , 19 ) ;
        Text = "Veränderungen einer Zeile bzw. Spalte wirken sich nur auf den direkten Nachbarn aus" ;
        Text [ English ] = "Changes of a row and column respectively will affect the direct neighbor only" ;
        WordBreak = TRUE ;
        Text [ english_us ] = "Changes to a row or column affect the adjacent area only" ;
        Text [ portuguese_brazilian ] = "Veränderungen einer Zeile bzw. Spalte wirken sich nur auf den direkten Nachbarn aus" ;
        Text [ swedish ] = "Ändringar i en rad resp. kolumn påverkar endast den omedelbara omgivningen" ;
        Text [ danish ] = "Række- eller kolonneændringer påvirker kun den direkte nabo" ;
        Text [ italian ] = "Le modifiche di una riga si ripercuotono solo sulle aree adiacenti" ;
        Text [ spanish ] = "Las modificaciones en una fila o columna afectan solo a la fila o columna contigua" ;
        Text [ french ] = "Modifications de ligne/colonne n'affecteront que la plage adjacente" ;
        Text [ dutch ] = "Veranderingen in een rij of kolom beïnvloeden alleen de aangrenzende rij-/kolom" ;
        Text [ portuguese ] = "As modificações numa linha ou coluna afectam apenas a área adjacente" ;
        Text[ chinese_simplified ] = "ÐÐÁеĸü¸ÄÖ»»áÓ°Ïìµ½Ö±½ÓÁ¬½ÓµÄÇøÓò¡£";
        Text[ russian ] = "Èçìåíåíèÿ ñòðîêè èëè êîëîíêè ïîâëèÿþò òîëüêî íà íåïîñðåäñòâåííûõ ñîñåäåé";
        Text[ polish ] = "Zmiany wiersza lub kolumny wywieraj¹ wp³yw tylko na obszary przyleg³e";
        Text[ japanese ] = "s‚ ‚é‚¢‚Í—ñ‚̕ύX‚ͤ’¼Ú—אڂµ‚Ä‚¢‚é”͈͂ɂ̂ݍì—p";
        Text[ chinese_traditional ] = "Äæ¦CªºÅܧó¶È·|¼vÅT¨ìª½±µ³sµ²ªº°Ï°ì¡C";
        Text[ arabic ] = "ÊÄËÑ ÇáÊÛííÑÇÊ ÇáÍÇÏËÉ Ýí ÕÝ Ãæ ÚãæÏ Úáì ÇáãäØÞÉ ÇáãÌÇæÑÉ ÝÞØ";
        Text[ greek ] = "ÁëëáãÝò ìéáò óôÞëçò Þ ãñáììÞò åðéñåÜæïõí ìüíï ôçí Üìåóá ãåéôïíéêÞ ðåñéï÷Þ";
        Text[ korean ] = "¿­ ¶Ç´Â ÇàÀÇ º¯°æÀº ÀÎÁ¢ÇÑ ¿µ¿ª¿¡¸¸ ¿µÇâÀ» ÁÝ´Ï´Ù.";
        Text[ turkish ] = "Satýr ya da sütunlar üzerinde yapýlan deðiþiklikler yalnýzca bitiþik birimleri etkiler";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_FIXPROP
    {
        Pos = MAP_APPFONT ( 12 , 77 ) ;
        Size = MAP_APPFONT ( 78 , 10 ) ;
        Text = "F~ix, proportional" ;
        Text [ English ] = "F~ix, proportional" ;
        Text [ english_us ] = "Fi~xed, proportional" ;
        Text [ portuguese_brazilian ] = "F~ix, proportional" ;
        Text [ swedish ] = "Fast, ~proportionell" ;
        Text [ danish ] = "Fast, proportional" ;
        Text [ italian ] = "F~isso, proporzionale" ;
        Text [ spanish ] = "Fijo, ~proporcional" ;
        Text [ french ] = "F~ixe, proportionnel" ;
        Text [ dutch ] = "V~ast, proportioneel" ;
        Text [ portuguese ] = "F~ixo, proporcional" ;
        Text[ chinese_simplified ] = "¹Ì¶¨³É±ÈÀý(~X)";
        Text[ russian ] = "Ôèêñ., ïðîïîðöèîíàëüí.";
        Text[ polish ] = "Sta³y, p~roporcjonalny";
        Text[ japanese ] = "ŒÅ’èA”ä—á(~X)";
        Text[ chinese_traditional ] = "©T©w¦¨¤ñ¨Ò(~X)";
        Text[ arabic ] = "ËÇÈÊ¡ ãÊäÇÓÈ";
        Text[ greek ] = "ÓôáèåñÜ, áíáëïã~éêÜ";
        Text[ korean ] = "°íÁ¤µÊ,ºñ·Ê(~X)";
        Text[ turkish ] = "Sabi~t orantýlý";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_FIXPROP
    {
        Pos = MAP_APPFONT ( 93 , 77 ) ;
        Size = MAP_APPFONT ( 155 , 19 ) ;
        Text = "Veränderungen einer Zeile bzw. Spalte wirken sich auf die gesamte Tabelle aus" ;
        Text [ English ] = "Changes of a row and column respectively will affect the whole table" ;
        WordBreak = TRUE ;
        Text [ english_us ] = "Changes to a row or column may affect the entire table" ;
        Text [ portuguese_brazilian ] = "Veränderungen einer Zeile bzw. Spalte wirken sich auf die gesamte Tabelle aus" ;
        Text [ swedish ] = "Ändringar i en rad resp. kolumn påverkar hela tabellen" ;
        Text [ danish ] = "Række- eller kolonneændringer påvirker hele tabellen" ;
        Text [ italian ] = "Le modifiche di una riga o colonna si ripercuotono  sull'intera tabella" ;
        Text [ spanish ] = "Las modificaciones en una fila o columna afectan a toda la tabla" ;
        Text [ french ] = "Modifications de ligne/colonne affecteront la totalité du tableau " ;
        Text [ dutch ] = "Veranderingen in een rij of kolom beïnvloeden de hele tabel" ;
        Text [ portuguese ] = "As modificações numa linha ou coluna podem afectar a tabela inteira" ;
        Text[ chinese_simplified ] = "ÐÐÁеĸü¸Ä»áÓ°Ïìµ½Õû¸ö±í¸ñ¡£";
        Text[ russian ] = "Èçìåíåíèÿ ñòðîêè èëè êîëîíêè ïîâëèÿþò íà âñþ òàáëèöó";
        Text[ polish ] = "Zmiany wiersza lub kolumny wywieraj¹ wp³yw na ca³¹ tabelê";
        Text[ japanese ] = "s‚ ‚é‚¢‚Í—ñ‚̕ύX‚ͤ•\\‘S‘̂ɍì—p";
        Text[ chinese_traditional ] = "Äæ¦CªºÅܧó·|¼vÅT¨ì¾ã­Óªí®æ¡C";
        Text[ arabic ] = "ÊÄËÑ ÇáÊÛííÑÇÊ ÇáÍÇÏËÉ Ýí ÕÝ Ãæ ÚãæÏ Úáì ÇáÌÏæá ÈÃËÑå";
        Text[ greek ] = "ÁëëáãÝò ìéáò ãñáììÞò Þ óôÞëçò åðéñåÜæïõí ïëüêëçñï ôïí ðßíáêá";
        Text[ korean ] = "¿­ ¶Ç´Â ÇàÀÇ º¯°æÀº Àüü Ç¥¿¡  ¿µÇâÀ» ÁÝ´Ï´Ù.";
        Text[ turkish ] = "Satýr ya da sütunlar üzerinde yapýlan deðiþiklikler tablonun tümünü etkiler";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_VAR
    {
        Pos = MAP_APPFONT ( 12 , 98 ) ;
        Size = MAP_APPFONT ( 78 , 10 ) ;
        Text = "~Variabel" ;
        Text [ English ] = "~Variable" ;
        Text [ english_us ] = "~Variable" ;
        Text [ portuguese_brazilian ] = "~Variabel" ;
        Text [ swedish ] = "~Variabel" ;
        Text [ danish ] = "Variabel" ;
        Text [ italian ] = "~Variabile" ;
        Text [ spanish ] = "~Variable" ;
        Text [ french ] = "~Variable" ;
        Text [ dutch ] = "~Variabel" ;
        Text [ portuguese ] = "~Variável" ;
        Text[ chinese_simplified ] = "¿É±ä(~V)";
        Text[ russian ] = "Èçì.";
        Text[ polish ] = "Zmie~nny";
        Text[ japanese ] = "•ϐ”(~V)";
        Text[ chinese_traditional ] = "¥iÅÜ(~V)";
        Text[ arabic ] = "ãÊÛíÑ";
        Text[ greek ] = "ÌåôáâëçôÞ";
        Text[ korean ] = "º¯¼ö(~V)";
        Text[ turkish ] = "~Deðiþken";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_VAR
    {
        Pos = MAP_APPFONT ( 93 , 98 ) ;
        Size = MAP_APPFONT ( 155 , 16 ) ;
        Text = "Veränderungen einer Zeile bzw. Spalte wirken sich auf die Tabellengröße aus" ;
        Text [ English ] = "Changes of a row and column respectively will affect the table size" ;
        WordBreak = TRUE ;
        Text [ english_us ] = "Changes to a row or column may affect the table size" ;
        Text [ portuguese_brazilian ] = "Veränderungen einer Zeile bzw. Spalte wirken sich auf die Tabellengröße aus" ;
        Text [ swedish ] = "Ändringar i en rad resp. kolumn påverkar tabellstorleken" ;
        Text [ danish ] = "Række- eller kolonneændringer påvirker tabelstørrelsen" ;
        Text [ italian ] = "Le modifiche di una riga o colonna si ripercuotono sulle dimensioni della tabella" ;
        Text [ spanish ] = "Las modificaciones en una fila o columna afectan el tamaño de la tabla" ;
        Text [ french ] = "Modifications de ligne/colonne affecteront la taille du tableau" ;
        Text [ dutch ] = "Veranderingen in een rij of kolom beïnvloeden de tabelgrootte" ;
        Text [ portuguese ] = "As modificações numa linha ou coluna podem afectar o tamanho da tabela" ;
        Text[ chinese_simplified ] = "Ò»ÐкÍÁеĸü¸Ä»áÓ°Ïì±í¸ñµÄ´óС¡£";
        Text[ russian ] = "Èçìåíåíèÿ ñòðîêè èëè êîëîíêè ïîâëèÿþò íà ðàçìåð òàáëèöû";
        Text[ polish ] = "Zmiany wiersza lub kolumny wywieraj¹ wp³yw na rozmiar tabeli";
        Text[ japanese ] = "s‚ ‚é‚¢‚Í—ñ‚̕ύX‚ͤ•\\‚̑傫‚³‚ɍì—p";
        Text[ chinese_traditional ] = "¤@­ÓÄæ¦CªºÅܧó·|¼vÅTªí®æªº¤j¤p¡C";
        Text[ arabic ] = "ÊÄËÑ ÇáÊÛííÑÇÊ ÇáÍÇÏËÉ Ýí ÕÝ Ãæ ÚãæÏ Úáì ÍÌã ÇáÌÏæá";
        Text[ greek ] = "ÁëëáãÝò ìéáò ãñáììÞò Þ óôÞëçò åðéñåÜæïõí ôï ìÝãåèïò ôïõ ðßíáêá";
        Text[ korean ] = "¿­ ¶Ç´Â ÇàÀÇ º¯°æÀº Ç¥ÀÇ Å©±â¿¡ ¿µÇâÀ» ÁÝ´Ï´Ù.";
        Text[ turkish ] = "Satýr ya da sütunlar üzerinde yapýlan deðiþiklikler tablo boyutunu etkiler";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_DESC
    {
        Pos = MAP_APPFONT ( 12 , 121 ) ;
        Size = MAP_APPFONT ( 236 , 10 ) ;
        Text = "Diese Einstellungen sind bei der Tastaturbedienung wirksam." ;
        Text [ English ] = "These settings affect the keyboard handling." ;
        WordBreak = TRUE ;
        Text [ english_us ] = "These settings affect the keyboard handling." ;
        Text [ portuguese_brazilian ] = "Diese Einstellungen sind bei der Tastaturbedienung wirksam." ;
        Text [ swedish ] = "Dessa inställningar gäller för tangentbord." ;
        Text [ danish ] = "Disse indstillinger udfolder virkning ved tastaturbetjening" ;
        Text [ italian ] = "Queste impostazioni sono effettive con l'uso della tastiera" ;
        Text [ spanish ] = "Esta configuración es efectiva al usar el teclado." ;
        Text [ french ] = "Ces paramètres ne seront appliqués que pour l'utilisation du clavier." ;
        Text [ dutch ] = "Deze instellingen zijn bij de bediening van de tastatuur werkzaam." ;
        Text [ portuguese ] = "Estas predefinições podem ser activadas com o teclado." ;
        Text[ chinese_simplified ] = "Õâ¸öÉ趨¿ÉÓÃÓÚ¼üÅ̲Ù×÷¡£";
        Text[ russian ] = "Ýòè íàñòðîéêè äåéñòâóþò ïðè îáñëóæèâàíèè êëàâèàòóðû.";
        Text[ polish ] = "Ustawienia te s¹ uaktywnione podczas korzystania z klawiatury.";
        Text[ japanese ] = "‚±‚̐ݒè‚Í·°ÎÞ°Äޑ€ì‚ɍì—p‚µ‚Ü‚·";
        Text[ chinese_traditional ] = "³o­Ó³]©wÓì¥Î©óÁä½L¾Þ§@¡C";
        Text[ arabic ] = "ÓÊßæä åÐå ÇáÅÚÏÇÏÇÊ ÓÇÑíÉ ÇáãÝÚæá ÚäÏ ÇÓÊÎÏÇã áæÍÉ ÇáãÝÇÊíÍ.";
        Text[ greek ] = "ÁõôÝò ïé ñõèìßóåéò åðéñåÜæïõí ôïí ÷åéñéóìü ôïõ ðëçêôñïëïãßïõ.";
        Text[ korean ] = "ÀÌ·¯ÇÑ ¼³Á¤Àº Űº¸µå Á¦¾î¿¡¿µÇâÀ» ÁÝ´Ï´Ù .";
        Text[ turkish ] = "Bu ayarlar klavye kullanýmýný etkiler.";
        Text[ language_user1 ] = " ";
    };
};
/**************************************************************************/
/*                                                                        */
/*  TabPage SourceView                                                      */
/*                                                                        */
/**************************************************************************/
TabPage TP_OPTSRCVIEW
{
    HelpID = HID_OPTSRCVIEW ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Hide = TRUE ;
    GroupBox GB_COLOR
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 248 , 80 ) ;
        Text = "Farbzuordnung Syntax - Highlighting" ;
        Text [ English ] = "Color assignment syntax highlighting" ;
        Text [ english_us ] = "Colors for syntax highlighting" ;
        Text [ portuguese_brazilian ] = "Farbzuordnung Syntax - Highlighting" ;
        Text [ swedish ] = "Färgtilldelning för syntaxframhävning" ;
        Text [ danish ] = "Farvetildeling syntaks - fremhævning" ;
        Text [ italian ] = "Correlazione colori per evidenziazione sintassi" ;
        Text [ spanish ] = "Colores para sintaxis-destacado" ;
        Text [ french ] = "Couleurs pour marquage de syntaxe" ;
        Text [ dutch ] = "Kleuren voor Syntax - Highlighting" ;
        Text [ portuguese ] = "Cores para destaques de sintaxe" ;
        Text[ chinese_simplified ] = "ÓòÊɫͻ³öÏÔʾÓï·¨²¿·Ö";
        Text[ russian ] = "Öâåòà äëÿ âûäåëåíèÿ ñèíòàêñèñà";
        Text[ polish ] = "Kolory dla wyró¿niania sk³adni.";
        Text[ japanese ] = "\\•¶‹­’²‚̐F";
        Text[ chinese_traditional ] = "¥Î±m¦â¬ð¥XÅã¥Ü»yªk³¡¤À";
        Text[ arabic ] = "ÇáÃáæÇä ÇáãÓÊÎÏãÉ áÊãííÒ ÈäÇÁ ÇáÌãáÉ";
        Text[ greek ] = "Ïñéóìüò ÷ñùìÜôùí ãéá åðéóÞìáíóç óýíôáîçò";
        Text[ korean ] = "±¸¹® °­Á¶¸¦ À§ÇÑ »ö»ó";
        Text[ turkish ] = "Söz dizimi vurgusu için renk düzeni";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_SGML
    {
        Pos = MAP_APPFONT ( 12 , 16 ) ;
        Size = MAP_APPFONT ( 50 , 8 ) ;
        Text = "~SGML" ;
        Text [ English ] = "~SGML" ;
        Text [ english_us ] = "~SGML" ;
        Text [ portuguese_brazilian ] = "~SGML" ;
        Text [ swedish ] = "~SGML" ;
        Text [ danish ] = "SGML" ;
        Text [ italian ] = "~SGML" ;
        Text [ spanish ] = "~SGML" ;
        Text [ french ] = "~SGML" ;
        Text [ dutch ] = "~SGML" ;
        Text [ portuguese ] = "~SGML" ;
        Text[ chinese_simplified ] = "~SGML";
        Text[ russian ] = "~SGML";
        Text[ polish ] = "SGML";
        Text[ japanese ] = "~SGML";
        Text[ chinese_traditional ] = "~SGML";
        Text[ arabic ] = "SGML~";
        Text[ greek ] = "SGML";
        Text[ korean ] = "~SGML";
        Text[ turkish ] = "~SGML";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_SGML
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 188 , 16 ) ;
        Size = MAP_APPFONT ( 60 , 50 ) ;
        DropDown = TRUE ;
    };
    FixedText FT_COMMENT
    {
        Pos = MAP_APPFONT ( 12 , 31 ) ;
        Size = MAP_APPFONT ( 50 , 10 ) ;
        Text = "~Kommentar" ;
        Text [ English ] = "~Comment" ;
        Text [ portuguese ] = "~Comentário" ;
        Text [ english_us ] = "~Comment" ;
        Text [ portuguese_brazilian ] = "~Kommentar" ;
        Text [ swedish ] = "~Kommentar" ;
        Text [ danish ] = "Kommentar" ;
        Text [ italian ] = "~Commento" ;
        Text [ spanish ] = "~Comentario" ;
        Text [ french ] = "~Commentaire" ;
        Text [ dutch ] = "~Commentaar" ;
        Text[ chinese_simplified ] = "×¢½â(~C)";
        Text[ russian ] = "Êîììåíòàðèé";
        Text[ polish ] = "Komentarz";
        Text[ japanese ] = "ºÒÝÄ(~C)";
        Text[ chinese_traditional ] = "ª`¸Ñ(~C)";
        Text[ arabic ] = "ÊÚáíÞ";
        Text[ greek ] = "Ó÷üëéï";
        Text[ korean ] = "¸Þ¸ð(~C)";
        Text[ turkish ] = "Açýklama";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_COMMENT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 188 , 31 ) ;
        Size = MAP_APPFONT ( 60 , 50 ) ;
        DropDown = TRUE ;
    };
    FixedText FT_KEYWD
    {
        Pos = MAP_APPFONT ( 12 , 46 ) ;
        Size = MAP_APPFONT ( 70 , 10 ) ;
        Text = "Sch~lüsselwort" ;
        Text [ English ] = "~Keyword" ;
        Text [ english_us ] = "~Key word" ;
        Text [ portuguese_brazilian ] = "Sch~lüsselwort" ;
        Text [ swedish ] = "Nycke~lord" ;
        Text [ danish ] = "Nøgleord" ;
        Text [ italian ] = "Parola chiave" ;
        Text [ spanish ] = "~Palabra clave" ;
        Text [ french ] = "~Mot-clé" ;
        Text [ dutch ] = "S~leutelwoord" ;
        Text [ portuguese ] = "Palavra-~chave" ;
        Text[ chinese_simplified ] = "¹Ø¼ü×Ö(~K)";
        Text[ russian ] = "Êëþ÷åâîå ñëîâî";
        Text[ polish ] = "S³owo kluczowe";
        Text[ japanese ] = "·°Ü°ÄÞ(~K)";
        Text[ chinese_traditional ] = "ÃöÁä¦r(~K)";
        Text[ arabic ] = "ßáãÉ ÃÓÇÓíÉ";
        Text[ greek ] = "ËÝîç-êëåéäß";
        Text[ korean ] = "Ű ¿öµå(~K)";
        Text[ turkish ] = "Anahtar sözcük";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_KEYWD
    {
        Border = TRUE ;
        Pos = MAP_APPFONT (188 , 46 ) ;
        Size = MAP_APPFONT ( 60 , 50 ) ;
        DropDown = TRUE ;
    };
    FixedText FT_UNKNOWN
    {
        Pos = MAP_APPFONT ( 12 , 61 ) ;
        Size = MAP_APPFONT ( 50 , 10 ) ;
        Text = "~Unbekannt" ;
        Text [ English ] = "~Unknown" ;
        Text [ english_us ] = "~Unknown" ;
        Text [ portuguese_brazilian ] = "~Unbekannt" ;
        Text [ swedish ] = "~Okänd" ;
        Text [ danish ] = "Ukendt" ;
        Text [ italian ] = "~Sconosciuto" ;
        Text [ spanish ] = "~Desconocido" ;
        Text [ french ] = "~Inconnu" ;
        Text [ dutch ] = "~Onbekend" ;
        Text [ portuguese ] = "~Desconhecido" ;
        Text[ chinese_simplified ] = "²»Ã÷µÄ(~U)";
        Text[ russian ] = "~Íåèçâåñòíî";
        Text[ polish ] = "Nieznany";
        Text[ japanese ] = "•s–¾(~U)";
        Text[ chinese_traditional ] = "¤£©úªº(~U)";
        Text[ arabic ] = "ÛíÑ ãÚÑæÝ";
        Text[ greek ] = "¢ãíùóôï";
        Text[ korean ] = "¾Ë·ÁÁöÁö ¾ÊÀ½(~U)";
        Text[ turkish ] = "Bilinmeyen";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_UNKNOWN
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 188 , 61 ) ;
        Size = MAP_APPFONT ( 60 , 50 ) ;
        DropDown = TRUE ;
    };
};
/**************************************************************************/
/*                                                                        */
/*  TabPage ShadowCursor                                                  */
/*                                                                        */
/**************************************************************************/
TabPage TP_OPTSHDWCRSR
{
    HelpID = HID_OPTSHDWCRSR ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Hide = TRUE ;
    GroupBox GB_SHDWCRSFLAG
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 248 , 100 ) ;
        Text = "Direkt-Cursor" ;
        Text [ ENGLISH ] = "Direct cursor" ;
        Text [ english_us ] = "Direct Cursor" ;
        Text [ portuguese_brazilian ] = "Opۼes" ;
        Text [ swedish ] = "Direktmarkör" ;
        Text [ danish ] = "Direkt-markør" ;
        Text [ italian ] = "Cursore diretto" ;
        Text [ spanish ] = "Cursor directo" ;
        Text [ french ] = "Curseur direct" ;
        Text [ dutch ] = "Directcursor" ;
        Text [ portuguese ] = "Cursor directo" ;
        Text[ chinese_simplified ] = "Ö±½Ó¶¨Î»¹â±ê";
        Text[ russian ] = "Ñâîáîäíûé êóðñîð";
        Text[ polish ] = "Kursor bezpoœredni";
        Text[ japanese ] = "ÀÞ²Ú¸Ä ¶°¿Ù";
        Text[ chinese_traditional ] = "ª½±µ©w¦ì¥ú¼Ð";
        Text[ arabic ] = "ãÄÔÑ ãÈÇÔÑ";
        Text[ greek ] = "¢ìåóïò äñïìÝáò";
        Text[ korean ] = "¿É¼Ç";
        Text[ turkish ] = "Serbest imleç";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_SHDWCRSONOFF
    {
        Pos = MAP_APPFONT ( 12 , 15 ) ;
        Size = MAP_APPFONT ( 100 , 10 ) ;
        Text = "~Direkt-Cursor" ;
        Text [ ENGLISH ] = "~Direct cursor" ;
        TabStop = TRUE ;
        Group = TRUE ;
        Text [ portuguese ] = "Cursor ~directo" ;
        Text [ english_us ] = "~Direct cursor" ;
        Text [ portuguese_brazilian ] = "~Direkt-Cursor" ;
        Text [ swedish ] = "~Direktmarkör" ;
        Text [ danish ] = "Direkt-markør" ;
        Text [ italian ] = "Cursore ~diretto" ;
        Text [ spanish ] = "~Cursor directo" ;
        Text [ french ] = "Curseur ~direct" ;
        Text [ dutch ] = "~Direct-cursor" ;
        Text[ chinese_simplified ] = "Ö±½Ó¶¨Î»¹â±ê(~D)";
        Text[ russian ] = "Ñâîáîäíûé êóðñîð";
        Text[ polish ] = "Kursor bezpoœredni";
        Text[ japanese ] = "ÀÞ²Ú¸Ä ¶°¿Ù(~D)";
        Text[ chinese_traditional ] = "ª½±µ©w¦ì¥ú¼Ð(~D)";
        Text[ arabic ] = "ãÄÔÑ ãÈÇÔÑ";
        Text[ greek ] = "¢ìåóïò äñïìÝáò";
        Text[ korean ] = "Á÷Á¢ Ä¿¼­(~D)";
        Text[ turkish ] = "Serbest imleç";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_SHDWCRSFILLMODE
    {
        Pos = MAP_APPFONT ( 12 , 31 ) ;
        Size = MAP_APPFONT ( 48 , 10 ) ;
        Text = "Einfügen" ;
        Text [ English ] = "Insert" ;
        Left = TRUE ;
        Text [ english_us ] = "Insert" ;
        Text [ portuguese_brazilian ] = "Einfügen" ;
        Text [ swedish ] = "Infoga" ;
        Text [ danish ] = "Indsæt" ;
        Text [ italian ] = "Inserisci" ;
        Text [ spanish ] = "Insertar" ;
        Text [ french ] = "Insérer" ;
        Text [ dutch ] = "Invoegen" ;
        Text [ portuguese ] = "Inserir" ;
        Text[ chinese_simplified ] = "²åÈë";
        Text[ russian ] = "Âñòàâèòü";
        Text[ polish ] = "Wstaw";
        Text[ japanese ] = "‘}“ü";
        Text[ chinese_traditional ] = "´¡¤J";
        Text[ arabic ] = "ÅÏÑÇÌ";
        Text[ greek ] = "ÅéóáãùãÞ";
        Text[ korean ] = "»ðÀÔ";
        Text[ turkish ] = "Ekle";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_SHDWCRSFILLMARGIN
    {
        Pos = MAP_APPFONT ( 80 , 31 ) ;
        Size = MAP_APPFONT ( 100 , 10 ) ;
        Text = "~Absatzausrichtung" ;
        Text [ ENGLISH ] = "~Adjustment" ;
        TabStop = TRUE ;
        Group = TRUE ;
        Text [ english_us ] = "~Paragraph alignment" ;
        Text [ portuguese_brazilian ] = "~Absatzausrichtung" ;
        Text [ swedish ] = "St~yckejustering" ;
        Text [ danish ] = "Afsnitsjustering" ;
        Text [ italian ] = "~Allineamento paragrafo" ;
        Text [ spanish ] = "~Alineación de párrafo" ;
        Text [ french ] = "A~lignement de paragraphe" ;
        Text [ dutch ] = "~Alinea-uitlijning" ;
        Text [ portuguese ] = "~Alinhamento de parágrafos" ;
        Text[ chinese_simplified ] = "¶ÎÂä¶ÔÆë(~P)";
        Text[ russian ] = "Âûðàâíèâàíèå àáçàöà";
        Text[ polish ] = "Wyrównanie akapitu";
        Text[ japanese ] = "’i—Ž‚Ì”z’u(~P)";
        Text[ chinese_traditional ] = "¬q¸¨¹ï»ô(~P)";
        Text[ arabic ] = "ãÍÇÐÇÉ ÇáÝÞÑÉ";
        Text[ greek ] = "Óôïß÷éóç ðáñáãñÜöïõ";
        Text[ korean ] = "´Ü¶ô ¸ÂÃã(~P)";
        Text[ turkish ] = "Pa~ragraf hizalama";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_SHDWCRSFILLINDENT
    {
        Pos = MAP_APPFONT ( 80 , 44 ) ;
        Size = MAP_APPFONT ( 100 , 10 ) ;
        Text = "linker Absatz~rand" ;
        Text [ ENGLISH ] = "Left ~margin" ;
        Text [ english_us ] = "~Left paragraph margin" ;
        Text [ portuguese_brazilian ] = "linker Absatz~rand" ;
        Text [ swedish ] = "Vänster styckema~rginal" ;
        Text [ danish ] = "Venstre afsnitsmargen" ;
        Text [ italian ] = "Margine paragrafo ~sinistro" ;
        Text [ spanish ] = "~Margen izquierdo del párrafo" ;
        Text [ french ] = "~Marge gauche du paragraphe" ;
        Text [ dutch ] = "Linker alinea~rand" ;
        Text [ portuguese ] = "Margem ~esquerda do parágrafo" ;
        Text[ chinese_simplified ] = "¶ÎÂä×ó¼ä¸ô(~P)";
        Text[ russian ] = "ëåâûé êðàé àáçàöà";
        Text[ polish ] = "Lewy margines akapitu";
        Text[ japanese ] = "’i—Ž¶—]”’(~P)";
        Text[ chinese_traditional ] = "¬q¸¨¥ª¶¡¹j(~P)";
        Text[ arabic ] = "åÇãÔ ÇáÝÞÑÉ ÇáÃíÓÑ";
        Text[ greek ] = "áñéóôåñü ðåñéèþñéï ðáñáãñÜöïõ";
        Text[ korean ] = "´Ü¶ô ¿ÞÂÊ ¿©¹é(~L)";
        Text[ turkish ] = "Sol ~paragraf kenarý";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_SHDWCRSFILLTAB
    {
        Pos = MAP_APPFONT ( 80 , 57 ) ;
        Size = MAP_APPFONT ( 100 , 10 ) ;
        Text = "~Tabulator" ;
        Text [ ENGLISH ] = "~Tab" ;
        Text [ english_us ] = "~Tabs" ;
        Text [ portuguese_brazilian ] = "~Tabulator" ;
        Text [ swedish ] = "Ta~bulator" ;
        Text [ danish ] = "Tabulator" ;
        Text [ italian ] = "Tabulazione" ;
        Text [ spanish ] = "~Tabulación" ;
        Text [ french ] = "~Tabulation" ;
        Text [ dutch ] = "~Tabulator" ;
        Text [ portuguese ] = "~Tabulações" ;
        Text[ chinese_simplified ] = "ÖÆ±í·û(~T)";
        Text[ russian ] = "Òàáóëÿòîðû";
        Text[ polish ] = "Tabulator";
        Text[ japanese ] = "ÀÌÞ(~T)";
        Text[ chinese_traditional ] = "»sªí²Å(~T)";
        Text[ arabic ] = "ÚáÇãÉ ÌÏæáÉ";
        Text[ greek ] = "ÓôçëïèÝôçò";
        Text[ korean ] = "ÅÇ(~T)";
        Text[ turkish ] = "~Sekmeler";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_SHDWCRSFILLSPACE
    {
        Pos = MAP_APPFONT ( 80 , 70 ) ;
        Size = MAP_APPFONT ( 100 , 10 ) ;
        Text = "Tabulator und ~Leerzeichen" ;
        Text [ ENGLISH ] = "Tabs and ~space" ;
        Text [ english_us ] = "Tabs and ~spaces" ;
        Text [ portuguese_brazilian ] = "Tabulator und ~Leerzeichen" ;
        Text [ swedish ] = "Tabulator och b~lanksteg" ;
        Text [ danish ] = "Tabulator og mellemrum" ;
        Text [ italian ] = "Tabulazione e ~spazi" ;
        Text [ spanish ] = "Tabulación y ~espacios" ;
        Text [ french ] = "Tabulation et ~espaces" ;
        Text [ dutch ] = "Tabulator en ~spaties" ;
        Text [ portuguese ] = "Tabulações e ~espaços" ;
        Text[ chinese_simplified ] = "ÖÆ±í·ûºÍ¿Õ¸ñ(~S)";
        Text[ russian ] = "Òàáóëÿòîðû è ïðîáåëû";
        Text[ polish ] = "Tabulator i ~spacja";
        Text[ japanese ] = "ÀÌނƽÍß°½(~S)";
        Text[ chinese_traditional ] = "»sªí²Å©MªÅ®æ(~S)";
        Text[ arabic ] = "ÚáÇãÇÊ ÌÏæáÉ æÃÍÑÝ ãÓÇÝÉ";
        Text[ greek ] = "ÓôçëïèÝôåò êáé êåíÜ";
        Text[ korean ] = "Åǰú °£°Ý(~S)";
        Text[ turkish ] = "Sekmeler ve ~boþluklar";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_SHDWCRSCOLOR
    {
        Pos = MAP_APPFONT ( 12 , 86 ) ;
        Size = MAP_APPFONT ( 50 , 8 ) ;
        Text = "~Farbe" ;
        Text [ English ] = "~Color" ;
        Text [ english_us ] = "~Color" ;
        Text [ portuguese_brazilian ] = "~Farbe" ;
        Text [ swedish ] = "~Färg" ;
        Text [ danish ] = "Farve" ;
        Text [ italian ] = "~Colore" ;
        Text [ spanish ] = "~Color" ;
        Text [ french ] = "~Couleur" ;
        Text [ dutch ] = "~Kleur" ;
        Text [ portuguese ] = "~Cor" ;
        Text[ chinese_simplified ] = "ÑÕÉ«(~C)";
        Text[ russian ] = "Öâåò";
        Text[ polish ] = "Kolor";
        Text[ japanese ] = "F(~C)";
        Text[ chinese_traditional ] = "ÃC¦â(~C)";
        Text[ arabic ] = "Çááæä";
        Text[ greek ] = "×ñþìá";
        Text[ korean ] = "»ö»ó(~C)";
        Text[ turkish ] = "~Renk";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_SHDWCRSCOLOR
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 80 , 86 ) ;
        Size = MAP_APPFONT ( 60 , 50 ) ;
        DropDown = TRUE ;
    };
    GroupBox GB_CRSR_OPT
    {
        Pos = MAP_APPFONT ( 6 , 106 ) ;
        Size = MAP_APPFONT ( 248 , 25 ) ;
        Text = "Optionen" ;
        Text [ ENGLISH ] = "Options" ;
        Text [ NORWEGIAN ] = "Options" ;
        Text [ DANISH ] = "Indstillinger" ;
        Text [ ENGLISH_US ] = "Options" ;
        Text [ SPANISH ] = "Opciones" ;
        Text [ FINNISH ] = "Määritykset" ;
        Text [ FRENCH ] = "Options" ;
        Text [ ITALIAN ] = "Opzioni" ;
        Text [ DUTCH ] = "Opties" ;
        Text [ PORTUGUESE_BRAZILIAN ] = "Opۼes" ;
        Text [ SWEDISH ] = "Alternativ" ;
        Text [ PORTUGUESE ] = "Opções" ;
        Text[ chinese_simplified ] = "Ñ¡Ïî";
        Text[ russian ] = "Ïàðàìåòðû";
        Text[ polish ] = "Opcje";
        Text[ japanese ] = "µÌß¼®Ý";
        Text[ chinese_traditional ] = "¿ï¶µ";
        Text[ arabic ] = "ÎíÇÑÇÊ";
        Text[ greek ] = "ÅðéëïãÝò";
        Text[ korean ] = "¿É¼Ç";
        Text[ turkish ] = "Seçenekler";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_ALLOW_IN_PROT
    {
        Pos = MAP_APPFONT ( 12 , 118 ) ;
        Size = MAP_APPFONT ( 220 , 10 ) ;
        TabStop = TRUE ;
        Group = TRUE ;

        Text = "~Cursor in geschützten Zonen zulassen" ;
        Text [ ENGLISH ] = "~Allow cursor in protected areas" ;
        Text[ english_us ] = "~Allow cursor in protected areas";
        Text[ portuguese ] = "~Permitir cursor em zonas protegidas";
        Text[ russian ] = "Äîïóñê êóðñîðà â çàùèùåííûõ çîíàõ";
        Text[ dutch ] = "~Cursor in beveiligde zones toelaten";
        Text[ french ] = "~Autoriser l'utilisation du curseur dans les zones protégées";
        Text[ spanish ] = "~Permitir cursor en zonas protegidas";
        Text[ italian ] = "Permetti cursore in aree protette";
        Text[ danish ] = "Tillad markør i beskyttede områder";
        Text[ swedish ] = "Tillåt ~markören i skyddade områden";
        Text[ polish ] = "DopuϾ kursor w chronionych obszarach";
        Text[ portuguese_brazilian ] = "~Allow cursor in protected areas";
        Text[ japanese ] = "¶°¿Ù‚̕یì—̈æ‚ւ̐i“ü‹–‰Â(~A)";
        Text[ chinese_simplified ] = "ÔÊÐí¹â±ê¶¨Î»ÔÚ±£»¤ÇøÓò(~A)";
        Text[ chinese_traditional ] = "¤¹³\\¥ú¼Ð©w¦ì¦b«OÅ@°Ï°ì(~A)";
        Text[ arabic ] = "ÇáÓãÇÍ ÈÇÓÊÎÏÇã ÇáãÄÔÑ Ýí ãäÇØÞ ãÍãíÉ";
        Text[ greek ] = "Äõíáôüôçôá åéóáãùãÞò ôïõ äåßêôç óå ðñïóôáôåõüìåíåò ðåñéï÷Ýò";
        Text[ korean ] = "º¸È£µÈ ¿µ¿ª¿¡ Ä¿¼­ Çã¿ë(~A)";
        Text[ turkish ] = "Ýmlecin korumalý bölümlere girmesine izin ver";
        Text[ language_user1 ] = " ";
    };

};
/**************************************************************************/
/*                                                                        */
/*                                                                        */
/*                                                                        */
/**************************************************************************/
diff --git a/sw/source/ui/config/optload.cxx b/sw/source/ui/config/optload.cxx
new file mode 100644
index 0000000..5b5ef33
--- /dev/null
+++ b/sw/source/ui/config/optload.cxx
@@ -0,0 +1,311 @@
/*************************************************************************
 *
 *  $RCSfile: optload.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:33 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SHL_HXX
#include <tools/shl.hxx>
#endif

#ifndef _SWTYPES_HXX //autogen
#include <swtypes.hxx>
#endif

#ifndef _UIITEMS_HXX //autogen
#include <uiitems.hxx>
#endif

#include "swmodule.hxx"
#include "modcfg.hxx"
#include "wrtsh.hxx"

#include "globals.hrc"
#include "cmdid.h"

#include "optload.hrc"
#include "optload.hxx"

#ifndef _FLDUPDE_HXX
#include <fldupde.hxx>
#endif

/* -----------------22.10.98 15:12-------------------
 *
 * --------------------------------------------------*/

SwLoadOptPage::SwLoadOptPage( Window* pParent, const SfxItemSet& rSet ) :
    SfxTabPage(pParent, SW_RES(TP_OPTLOAD_PAGE), rSet),
    aAlwaysRB   (this, ResId(RB_ALWAYS  )),
    aRequestRB  (this, ResId(RB_REQUEST )),
    aNeverRB    (this, ResId(RB_NEVER   )),
    aLinkDocOnlyCB  (this, ResId(CB_LINK_DOCONLY )),
    aLinkGB     (this, ResId(GB_LINK    )),
    aAutoUpdateFields(this, ResId(CB_AUTO_UPDATE_FIELDS )),
    aAutoUpdateCharts(this, ResId(CB_AUTO_UPDATE_CHARTS )),
    aFldDocOnlyCB  (this, ResId(CB_FLD_DOCONLY )),
    aFldGB      (this, ResId(GB_FIELD   )),
    aMergeDistCB(this, ResId(CB_MERGE_PARA_DIST )),
    aMergeDistPageStartCB(this, ResId(CB_MERGE_PARA_DIST_PAGESTART  )),
    aCompatGB   (this, ResId(GB_COMPAT  )),

    pWrtShell   (0),
    nOldLinkMode(MANUAL)
{
    FreeResource();

    aAutoUpdateFields.SetClickHdl(LINK(this, SwLoadOptPage, UpdateHdl));
}

/*-----------------18.01.97 12.43-------------------

--------------------------------------------------*/

SwLoadOptPage::~SwLoadOptPage()
{
}
/* -----------------09.02.99 12:10-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK(  SwLoadOptPage, UpdateHdl, CheckBox*, pBox )
{
    aAutoUpdateCharts.Enable(pBox->IsChecked());
    return 0;
}

/*-----------------18.01.97 12.43-------------------

--------------------------------------------------*/

SfxTabPage* __EXPORT SwLoadOptPage::Create( Window* pParent,
                                const SfxItemSet& rAttrSet )
{
    return new SwLoadOptPage(pParent, rAttrSet );
}

/*-----------------18.01.97 12.42-------------------

--------------------------------------------------*/

BOOL __EXPORT SwLoadOptPage::FillItemSet( SfxItemSet& rSet )
{
    BOOL bRet = FALSE;
    SwModuleOptions* pModOpt = SW_MOD()->GetModuleConfig();
    BOOL bFldDocOnly = aFldDocOnlyCB.IsChecked();
    BOOL bLinkDocOnly = aLinkDocOnlyCB.IsChecked();

    USHORT nNewLinkMode;
    if (aNeverRB.IsChecked())
        nNewLinkMode = NEVER;
    else if (aRequestRB.IsChecked())
        nNewLinkMode = MANUAL;
    else if (aAlwaysRB.IsChecked())
        nNewLinkMode = AUTOMATIC;

    USHORT nFldFlags = aAutoUpdateFields.IsChecked() ?
        aAutoUpdateCharts.IsChecked() ? AUTOUPD_FIELD_AND_CHARTS : AUTOUPD_FIELD_ONLY : AUTOUPD_OFF;

    if(aAutoUpdateFields.IsChecked() != aAutoUpdateFields.GetSavedValue() ||
            aAutoUpdateCharts.IsChecked() != aAutoUpdateCharts.GetSavedValue())
    {
        if (!bFldDocOnly || !pWrtShell)
            pModOpt->SetFldUpdateFlags(nFldFlags);
        if(pWrtShell)
        {
            USHORT nSet = bFldDocOnly ? nFldFlags : AUTOUPD_GLOBALSETTING;
            pWrtShell->SetFldUpdateFlags(nSet);
            pWrtShell->SetModified();
        }
    }

    if (nNewLinkMode != nOldLinkMode)
    {
        if (!bLinkDocOnly || !pWrtShell)
            pModOpt->SetLinkMode(nNewLinkMode);

        if (pWrtShell)
        {
            USHORT nSet = bLinkDocOnly ? nNewLinkMode : (USHORT)GLOBALSETTING;
            pWrtShell->SetLinkUpdMode( nSet );
            pWrtShell->SetModified();
        }

        bRet = TRUE;
    }
    if (pWrtShell)
    {
        if(aMergeDistCB.IsChecked() != aMergeDistCB.GetSavedValue() ||
            aMergeDistPageStartCB.IsChecked() != aMergeDistPageStartCB.GetSavedValue())
        {
            pWrtShell->SetParaSpaceMax(aMergeDistCB.IsChecked(),
                                aMergeDistPageStartCB.IsChecked());
        }

    }
    return bRet;
}
/*-----------------18.01.97 12.42-------------------

--------------------------------------------------*/

void __EXPORT SwLoadOptPage::Reset( const SfxItemSet& rSet)
{
    const SwModuleOptions* pModOpt = SW_MOD()->GetModuleConfig();
    const SfxPoolItem* pItem;

    if(SFX_ITEM_SET == rSet.GetItemState(FN_PARAM_WRTSHELL, FALSE, &pItem))
        pWrtShell = (SwWrtShell*)((const SwPtrItem*)pItem)->GetValue();

    USHORT nFldFlags = AUTOUPD_GLOBALSETTING;
    nOldLinkMode = GLOBALSETTING;
    BOOL bFldDocOnly = TRUE;
    BOOL bLinkDocOnly = TRUE;
    if (pWrtShell)
    {
        nFldFlags = pWrtShell->GetFldUpdateFlags(TRUE);
        nOldLinkMode = pWrtShell->GetLinkUpdMode(TRUE);
        aMergeDistCB.Check(pWrtShell->IsParaSpaceMax());
        aMergeDistPageStartCB.Check(pWrtShell->IsParaSpaceMaxAtPages());

        aMergeDistCB.SaveValue();
        aMergeDistPageStartCB.SaveValue();
    }
    if(nOldLinkMode == GLOBALSETTING)
    {
        nOldLinkMode = pModOpt->GetLinkMode();
        bLinkDocOnly = FALSE;
    }
    if(nFldFlags == AUTOUPD_GLOBALSETTING)
    {
        nFldFlags = pModOpt->GetFldUpdateFlags();
        bFldDocOnly = FALSE;
    }

    aAutoUpdateFields.Check(nFldFlags != AUTOUPD_OFF);
    aAutoUpdateCharts.Check(nFldFlags == AUTOUPD_FIELD_AND_CHARTS);
    aAutoUpdateCharts.Enable(nFldFlags != AUTOUPD_OFF);

    aLinkDocOnlyCB.Enable(pWrtShell != 0);
    aLinkDocOnlyCB.Check(bLinkDocOnly);
    aFldDocOnlyCB.Enable(pWrtShell != 0);
    aFldDocOnlyCB.Check(bFldDocOnly);
    aMergeDistCB.Enable(pWrtShell != 0);
    aMergeDistPageStartCB.Enable(pWrtShell != 0);
    aCompatGB.Enable(pWrtShell != 0);

    switch (nOldLinkMode)
    {
        case NEVER:     aNeverRB.Check();   break;
        case MANUAL:    aRequestRB.Check(); break;
        case AUTOMATIC: aAlwaysRB.Check();  break;
    }

    aAutoUpdateFields.SaveValue();
    aAutoUpdateCharts.SaveValue();
}

/*--------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.12  2000/09/18 16:05:17  willem.vandorp
    OpenOffice header added.

    Revision 1.11  1999/10/01 06:04:24  os
    enable new compatibility button

    Revision 1.10  1999/09/30 09:59:56  os
    new compatibility option

    Revision 1.9  1999/09/30 09:45:35  os
    new compatibility option

    Revision 1.8  1999/03/15 15:22:58  OS
    #63171# Fieldpdate und LinkMode in getrennten Gruppen


      Rev 1.7   15 Mar 1999 16:22:58   OS
   #63171# Fieldpdate und LinkMode in getrennten Gruppen

      Rev 1.6   11 Mar 1999 23:56:38   JP
   Task #63171#: Optionen fuer Feld-/LinkUpdate Doc oder Modul lokal

      Rev 1.5   09 Feb 1999 15:19:10   OS
   #61404# Optionen fuer Felder/Charts aktualisieren

      Rev 1.4   07 Jan 1999 15:04:24   OS
   #60625# Absatzabstaende addieren

      Rev 1.3   03 Dec 1998 11:24:54   OM
   #58216# Verknuepfungsoptionen nur fuer aktuelles Dok

      Rev 1.2   30 Nov 1998 17:30:12   OM
   #59770# Tabellenoptionen: Ueberschrift nur auf erster Seite

      Rev 1.1   23 Nov 1998 16:13:42   OM
   #58216# Verknuepfungsoptionen pro Dokument

      Rev 1.0   20 Nov 1998 17:03:42   OM
   Initial revision.

 --------------------------------------------------------------------*/
diff --git a/sw/source/ui/config/optload.hrc b/sw/source/ui/config/optload.hrc
new file mode 100644
index 0000000..93a62aa
--- /dev/null
+++ b/sw/source/ui/config/optload.hrc
@@ -0,0 +1,75 @@
/*************************************************************************
 *
 *  $RCSfile: optload.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:33 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#define GB_LINK                 1
#define RB_ALWAYS               2
#define RB_REQUEST              3
#define RB_NEVER                4
#define CB_FLD_DOCONLY          5
#define CB_MERGE_PARA_DIST      6
#define GB_COMPAT               7
#define CB_AUTO_UPDATE_FIELDS   8
#define CB_AUTO_UPDATE_CHARTS   9
#define FT_UPDATE_LINKS         10
#define CB_LINK_DOCONLY         11
#define GB_FIELD                13
#define CB_MERGE_PARA_DIST_PAGESTART 14

diff --git a/sw/source/ui/config/optload.src b/sw/source/ui/config/optload.src
new file mode 100644
index 0000000..0d1cd4e
--- /dev/null
+++ b/sw/source/ui/config/optload.src
@@ -0,0 +1,413 @@
/*************************************************************************
 *
 *  $RCSfile: optload.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:33 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/



#include "globals.hrc"
#include "optload.hrc"
#include "helpid.h"

/**************************************************************************/
/*                                                                        */
/**************************************************************************/

TabPage TP_OPTLOAD_PAGE
{
    HelpID = HID_OPTLOAD_PAGE ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Hide = TRUE ;
/*  FixedText FT_UPDATE_LINKS
    {
        Pos = MAP_APPFONT ( 12 , 14 ) ;
        Size = MAP_APPFONT ( 150 , 10 ) ;
        Text = "Verknüpfungen beim Laden aktualisieren" ;
        Text [ English ] = "Update links while loading" ;
        Text[ italian ] = "Aggiorna collegamenti durante il caricamento";
        Text[ portuguese_brazilian ] = "Refresh links";
        Text[ portuguese ] = "Actualizar ligações ao carregar";
        Text[ danish ] = "Refresh links";
        Text[ french ] = "Actualiser les liens lors du chargement";
        Text[ swedish ] = "Uppdatera länkar vid laddning";
        Text[ dutch ] = "Verbindingen bij het laden actualiseren";
        Text[ spanish ] = "Actualizar vínculos al cargar";
        Text[ english_us ] = "Update links";
        Text[ chinese_simplified ] = "ÔÚ×°ÔØÊ±¸üÐÂÁ´½Ó";
        Text[ russian ] = "Îáíîâèòü ñâÿçè";
        Text[ polish ] = "Aktualizuj ³¹cza";
        Text[ japanese ] = "Verknüpfungen aktualisieren";
    };*/
    GroupBox GB_LINK
    {
        Pos = MAP_APPFONT ( 6 , 2 ) ;
        Size = MAP_APPFONT ( 248 , 37 ) ;
        Text = "Verknüpfungen aktualisieren" ;
        Text [ English ] = "Update links" ;
        Text[ english_us ] = "Update links";
        Text[ portuguese ] = "Actualizar ligações";
        Text[ russian ] = "Îáíîâèòü ññûëêè";
        Text[ dutch ] = "Verbindingen actualiseren";
        Text[ french ] = "Actualiser les liens";
        Text[ spanish ] = "Actualizar vínculos";
        Text[ italian ] = "Aggiorna collegamenti";
        Text[ danish ] = "Opdater kæder";
        Text[ swedish ] = "Uppdatera länkar";
        Text[ polish ] = "Aktualizuj ³¹cza";
        Text[ portuguese_brazilian ] = "Refresh links";
        Text[ japanese ] = "ØÝ¸‚̍XV";
        Text[ chinese_simplified ] = "¸üÐÂÁ´½Ó";
        Text[ chinese_traditional ] = "§ó·s±¶®|";
    Text[ arabic ] = "ÊÍÏíË ÇáÇÑÊÈÇØÇÊ";
    Text[ greek ] = "ÅíçìÝñùóç óõíäÝóåùí";
    Text[ korean ] = "¿¬°á ¾÷ µ¥ÀÌÆ®";
    Text[ turkish ] = "Baðlantýlarý güncelle";
    Text[ language_user1 ] = " ";
};
    RadioButton RB_ALWAYS
    {
        Pos = MAP_APPFONT ( 12 , 13 ) ;
        Size = MAP_APPFONT ( 75 , 10 ) ;
        Text = "~Immer" ;
        Text [ ENGLISH ] = "~Always" ;
        TabStop = TRUE ;
        Text[ italian ] = "Sempre";
        Text[ portuguese_brazilian ] = "~Always";
        Text[ portuguese ] = "~Sempre";
        Text[ danish ] = "Altid";
        Text[ french ] = "Toujours";
        Text[ swedish ] = "~Alltid";
        Text[ dutch ] = "~Altijd";
        Text[ spanish ] = "~Siempre";
        Text[ english_us ] = "Always";
        Text[ chinese_simplified ] = "×ÜÊÇ";
        Text[ russian ] = "Âñåãäà";
        Text[ polish ] = "Zawsze";
        Text[ japanese ] = "í‚É";
        Text[ chinese_traditional ] = "Á`¬O";
    Text[ arabic ] = "ÏÇÆãÇð";
    Text[ greek ] = "ÐÜíôá";
    Text[ korean ] = "Ç×»ó";
    Text[ turkish ] = "Her zaman";
    Text[ language_user1 ] = " ";
};
    RadioButton RB_REQUEST
    {
        Pos = MAP_APPFONT ( 90 , 13 ) ;
        Size = MAP_APPFONT ( 75 , 10 ) ;
        Text = "Auf Nach~frage" ;
        Text [ ENGLISH ] = "On request" ;
        TabStop = TRUE ;
        Text[ italian ] = "Su richiesta";
        Text[ portuguese_brazilian ] = "On request";
        Text[ portuguese ] = "A ~pedido";
        Text[ danish ] = "På anmodning";
        Text[ french ] = "Sur demande";
        Text[ swedish ] = "På ~begäran";
        Text[ dutch ] = "Op aan~vraag";
        Text[ spanish ] = "A ~petición";
        Text[ english_us ] = "On request";
        Text[ chinese_simplified ] = "ÔÚÇëÇóʱ";
        Text[ russian ] = "Ïî òðåáîâàíèþ";
        Text[ polish ] = "Gdy jest wymagane";
        Text[ japanese ] = "•K—v‚ɉž‚¶‚Ä";
        Text[ chinese_traditional ] = "¦b½Ð¨D®É";
    Text[ arabic ] = "ÈÚÏ ÇáÇÓÊÝÓÇÑ";
    Text[ greek ] = "Óå æÞôçóç";
    Text[ korean ] = "¿äû";
    Text[ turkish ] = "Ýstek üzerine";
    Text[ language_user1 ] = " ";
};
    RadioButton RB_NEVER
    {
        Pos = MAP_APPFONT ( 168 , 13 ) ;
        Size = MAP_APPFONT ( 75 , 10 ) ;
        Text = "~Nie" ;
        Text [ ENGLISH ] = "Never" ;
        TabStop = TRUE ;
        Text[ italian ] = "Mai";
        Text[ portuguese_brazilian ] = "Never";
        Text[ portuguese ] = "~Nunca";
        Text[ danish ] = "Aldrig";
        Text[ french ] = "Jamais";
        Text[ swedish ] = "Al~drig";
        Text[ dutch ] = "~Nooit";
        Text[ spanish ] = "~Nunca";
        Text[ english_us ] = "Never";
        Text[ chinese_simplified ] = "ÓÀÔ¶²»";
        Text[ russian ] = "Íèêîãäà";
        Text[ polish ] = "Nigdy";
        Text[ japanese ] = "•s•K—v";
        Text[ chinese_traditional ] = "¥Ã»·¤£";
    Text[ arabic ] = "ÈÊÇÊÇð";
    Text[ greek ] = "ÐïôÝ";
    Text[ korean ] = "ÀüÇô";
    Text[ turkish ] = "Hiçbir zaman";
    Text[ language_user1 ] = " ";
};
    CheckBox CB_LINK_DOCONLY
    {
        Pos = MAP_APPFONT ( 12 , 25) ;
        Size = MAP_APPFONT ( 220 , 10 ) ;
        Text = "Nur für das aktuelle ~Dokument" ;
        Text [ English ] = "Actual document only" ;
        Text [ dutch ] = "~Alleen in het actuele document" ;
        Text [ english_us ] = "Current document only" ;
        Text [ italian ] = "Solo per il documento corrente" ;
        Text [ spanish ] = "Solo para el documento ~actual" ;
        Text [ french ] = "Uniquement pour le document actif" ;
        Text [ swedish ] = "~Endast för det aktuella dokumentet" ;
        Text [ danish ] = "Kun for det aktuelle dokument" ;
        Text [ portuguese ] = "~Apenas para documento activo" ;
        Text[ portuguese_brazilian ] = "~Nur für das aktuelle Dokument";
        Text[ chinese_simplified ] = "Ö»ÓÃÓÚµ±Ç°µÄÎĵµ";
        Text[ russian ] = "Òîëüêî äëÿ òåêóùåãî äîêóìåíòà";
        Text[ polish ] = "Tylko dla aktualnego dokumentu";
        Text[ japanese ] = "Œ»Ý‚ÌÄÞ·­ÒÝĂ¾‚¯";
        Text[ chinese_traditional ] = "¥u¥Î©ó·í«eªº¤å¥ó";
    Text[ arabic ] = "ÇáãÓÊäÏ ÇáÍÇáí ÝÞØ";
    Text[ greek ] = "Ìüíï ãéá ôï ðáñüí Ýããñáöï";
    Text[ korean ] = "ÇöÀç ¹®¼­ ¸¸";
    Text[ language_user1 ] = " ";
    Text[ turkish ] = "Yalnýzca açýk belgede";
};
    GroupBox GB_FIELD
    {
        Pos = MAP_APPFONT ( 6 , 42 ) ;
        Size = MAP_APPFONT ( 248 , 53 ) ;
        Text = "Felder und Diagramme" ;
        Text [ English ] = "Update" ;
        Text[ english_us ] = "Fields and charts";
        Text[ portuguese ] = "Campos e gráficos";
        Text[ russian ] = "Ïîëÿ è äèàãðàììû";
        Text[ dutch ] = "Velden en diagrammen";
        Text[ french ] = "Champs et diagrammes";
        Text[ spanish ] = "Campos y diagramas";
        Text[ italian ] = "Campi e diagrammi";
        Text[ danish ] = "Felter og diagrammer";
        Text[ swedish ] = "Fält och diagram";
        Text[ polish ] = "Pola i diagramy";
        Text[ portuguese_brazilian ] = "Refresh links";
        Text[ japanese ] = "̨°ÙÄނƸÞ×Ì";
        Text[ chinese_simplified ] = "×ֶκÍͼ±í";
        Text[ chinese_traditional ] = "Äæ¦ì©M¹Ïªí";
    Text[ arabic ] = "ÍÞæá æÑÓæã ÈíÇäíÉ";
    Text[ greek ] = "Ðåäßá êáé äéáãñÜììáôá";
    Text[ korean ] = "Çʵå¿Í Â÷Æ®";
    Text[ turkish ] = "Alan ve þemalar";
    Text[ language_user1 ] = " ";
};
    CheckBox CB_AUTO_UPDATE_FIELDS
    {
        Pos = MAP_APPFONT ( 12 , 55) ;
        Size = MAP_APPFONT ( 213 , 10 ) ;
        Text = "F~eldbefehle automatisch aktualisieren" ;
        Text [ English ] = "Update fields automatically" ;
        Text[ english_us ] = "Update ~fields automatically";
        Text[ portuguese ] = "Actualizar ~campos automaticamente";
        Text[ russian ] = "Îáíîâëÿòü àâòîìàòè÷åñêè ïîëÿ";
        Text[ dutch ] = "V~eldopdrachten automatisch actualiseren";
        Text[ french ] = "Actualiser automatiquement les ~instructions de champ";
        Text[ spanish ] = "Actualizar ~campos automáticamente";
        Text[ italian ] = "Aggiorna i comandi di campo automaticamente";
        Text[ danish ] = "Opdater felter automatisk";
        Text[ swedish ] = "Uppdatera ~fältkommandon automatiskt";
        Text[ polish ] = "Aktualizuj pola automatycznie";
        Text[ portuguese_brazilian ] = "Update fields automatically";
        Text[ japanese ] = "̨°ÙÄÞ‚ðŽ©“®“I‚ɍXV(~F)";
        Text[ chinese_simplified ] = "×Ô¶¯¸üÐÂ×Ö¶ÎÃüÁî(~F)";
        Text[ chinese_traditional ] = "¦Û°Ê§ó·sÄæ¦ì©R¥O(~F)";
    Text[ arabic ] = "ÊÍÏíË ÇáÍÞæá ÊáÞÇÆíÇð";
    Text[ greek ] = "Áõôüìáôç åíçìÝñùóç åíôïëþí ðåäßùí";
    Text[ korean ] = "Çʵå ÀÚµ¿ ¾÷ µ¥ÀÌÆ®(~F)";
    Text[ turkish ] = "Alan öðelerini otomatik olarak güncelle";
    Text[ language_user1 ] = " ";
};
    CheckBox CB_AUTO_UPDATE_CHARTS
    {
        Pos = MAP_APPFONT ( 12 , 68) ;
        Size = MAP_APPFONT ( 213 , 10 ) ;
        Text = "Dia~gramme automatisch aktualisieren" ;
        Text [ English ] = "Update charts automatically" ;
        Text[ english_us ] = "Update ~charts automatically";
        Text[ portuguese ] = "Actualizar ~gráficos automaticamente";
        Text[ russian ] = "Îáíîâëÿòü àâòîìàòè÷åñêè äèàãðàììû";
        Text[ dutch ] = "~Diagrammen automatisch actualiseren";
        Text[ french ] = "Actualiser automatiquement les diagrammes";
        Text[ spanish ] = "Actualizar ~diagramas automáticamente";
        Text[ italian ] = "Aggiorna i diagrammi automaticamente";
        Text[ danish ] = "Opdater diagrammer automatisk";
        Text[ swedish ] = "Uppdatera ~diagram automatiskt";
        Text[ polish ] = "Aktualizuj wykresy automatycznie";
        Text[ portuguese_brazilian ] = "Update charts automatically";
        Text[ japanese ] = "¸Þ×Ì‚ðŽ©“®“I‚ɍXV(~C)";
        Text[ chinese_simplified ] = "×Ô¶¯¸üÐÂͼ±í(~C)";
        Text[ chinese_traditional ] = "¦Û°Ê§ó·s¹Ïªí(~C)";
    Text[ arabic ] = "ÊÍÏíË ÇáÑÓæã ÇáÈíÇäíÉ ÊáÞÇÆíÇð";
    Text[ greek ] = "Áõôüìáôç åíçìÝñùóç äéáãñáììÜôùí";
    Text[ korean ] = "Â÷Æ® ÀÚµ¿ ¾÷ µ¥ÀÌÆ®(~C)";
    Text[ turkish ] = "Þemalarý otomatik olarak güncelle";
    Text[ language_user1 ] = " ";
};
    CheckBox CB_FLD_DOCONLY
    {
        Pos = MAP_APPFONT ( 12 , 83) ;
        Size = MAP_APPFONT ( 213 , 10 ) ;
        Text = "Nur für das aktuelle D~okument" ;
        Text [ English ] = "Current document only" ;
        Text [ dutch ] = "~Alleen in het actuele document" ;
        Text [ english_us ] = "Current document only" ;
        Text [ italian ] = "Solo per il documento corrente" ;
        Text [ spanish ] = "Solo para el documento ~actual" ;
        Text [ french ] = "Uniquement pour le document actif" ;
        Text [ swedish ] = "~Endast för det aktuella dokumentet" ;
        Text [ danish ] = "Kun for det aktuelle dokument" ;
        Text [ portuguese ] = "~Apenas para documento actual" ;
        Text[ portuguese_brazilian ] = "~Nur für das aktuelle Dokument";
        Text[ chinese_simplified ] = "Ö»ÓÃÓÚµ±Ç°µÄÎĵµ";
        Text[ russian ] = "Òîëüêî äëÿ òåêóùåãî äîêóìåíòà";
        Text[ polish ] = "Tylko dla aktualnego dokumentu";
        Text[ japanese ] = "Œ»Ý‚ÌÄÞ·­ÒÝĂ¾‚¯";
        Text[ chinese_traditional ] = "¥u¥Î©ó·í«eªº¤å¥ó";
    Text[ arabic ] = "ÇáãÓÊäÏ ÇáÍÇáí ÝÞØ";
    Text[ greek ] = "Ìüíï ãéá ôï ðáñþí Ýããñáöï";
    Text[ korean ] = "ÇöÀç ¹®¼­ ¸¸";
    Text[ turkish ] = "Yalnýzca açýk belgede";
    Text[ language_user1 ] = " ";
};
    GroupBox GB_COMPAT
    {
        Pos = MAP_APPFONT ( 6 , 98 ) ;
        Size = MAP_APPFONT ( 248 , 33 ) ;
        Text = "Kompatibilität" ;
        Text [ English ] = "Compatibility" ;
        Text[ english_us ] = "Compatibility";
        Text[ portuguese ] = "Compatibilidade";
        Text[ russian ] = "Ñîâìåñòèìîñòü";
        Text[ dutch ] = "Compatibiliteit";
        Text[ french ] = "Compatibilité";
        Text[ spanish ] = "Compatibilidad";
        Text[ italian ] = "Compatibilità";
        Text[ danish ] = "Kompatibilitet";
        Text[ swedish ] = "Kompatibilitet";
        Text[ polish ] = "ZgodnoϾ";
        Text[ portuguese_brazilian ] = "Compatibility";
        Text[ japanese ] = "ŒÝŠ·«";
        Text[ chinese_simplified ] = "¼æÈÝ";
        Text[ chinese_traditional ] = "¬Û®e";
    Text[ arabic ] = "ÊæÇÝÞ";
    Text[ greek ] = "Óõìâáôüôçôá";
    Text[ korean ] = "ȣȯ";
    Text[ turkish ] = "Uyumluluk";
    Text[ language_user1 ] = " ";
};
    CheckBox CB_MERGE_PARA_DIST
    {
        Pos = MAP_APPFONT ( 12 , 109) ;
        Size = MAP_APPFONT ( 236 , 10 ) ;
        Text = "Im aktuellen Dokument alle Absatz- und Tabellen~abstände addieren";
        Text [ English ] = "Add ~distances between paragraphs and tables" ;
        Text[ english_us ] = "Add spacing between paragraphs and tables in the current document";
        Text[ portuguese ] = "Somar ~espaçamento entre parágrafos e tabelas no documento activo";
        Text[ russian ] = "Ñëîæèòü â òåêóùåì äîêóìåíòå âñå èíòåðâàëû àáçàöåâ è òàáëèö";
        Text[ dutch ] = "In het actuele document alle ~afstanden tussen alinea's en tabellen optellen";
        Text[ french ] = "Additionner les espaces entre paragraphes et tableaux dans le document actif";
        Text[ spanish ] = "Sumar ~espacios de párrafos y tablas en el documento actual";
        Text[ italian ] = "Aggiungi distanze tra i paragrafi e le tabelle nel documento attuale";
        Text[ danish ] = "Tæl alle afsnits- og tabelafstande i det aktuelle dokument sammen";
        Text[ swedish ] = "Addera alla stycke- och tabell~avstånd i det aktuella dokumentet";
        Text[ polish ] = "Dodaj w aktualnym dokumencie wszystkie odstêpy akapitów i tabel";
        Text[ portuguese_brazilian ] = "Add ~distances between paragraphs and tables";
        Text[ japanese ] = "Œ»Ý‚ÌÄÞ·­ÒÝĂɂ·‚ׂĂ̒i—Ž‚¨‚æ‚Ñ•\\‚ÌŠÔŠu‚ð•t‰Á‚·‚é";
        Text[ chinese_simplified ] = "ÔÚµ±Ç°ÎĵµÄÚÀ©´óËùÓжÎÂäºÍ±í¸ñÖ®¼äµÄ¼ä¸ô(~S)";
        Text[ chinese_traditional ] = "¦b·í«e¤å¥ó¤ºÂX¤j©Ò¦³¬q¸¨©Mªí®æ¤§¶¡ªº¶¡¹j(~S)";
    Text[ arabic ] = "ÅÖÇÝÉ ãÓÇÝÉ ÇáÊÈÇÚÏ Åáì ßá ÝÞÑÇÊ æÌÏÇæá ÇáãÓÊäÏ ÇáÍÇáí";
        Text[ greek ] = "¢èñïéóìá üëùí ôùí áðïóôÜóåùí ðáñáãñÜöùí êáé ðéíÜêùí óôï ôñÝ÷ùí Ýããñáöï";
    Text[ korean ] = "ÇöÀç ¹®¼­ÀÇ ´Ü¶ô°ú Ç¥ »çÀÌÀÇ °£°Ý Ãß°¡";
    Text[ turkish ] = "Açýk belgedeki tüm paragraf ve tablo aralýklarýný topla";
    Text[ language_user1 ] = " ";
};
    CheckBox CB_MERGE_PARA_DIST_PAGESTART
    {
        Pos = MAP_APPFONT ( 12 , 121) ;
        Size = MAP_APPFONT ( 236 , 10 ) ;
        Text = "A~bsatz- und Tabellenabstände an Seitenanfängen addieren";
        Text [ English ] = "Add distances at the beginning of pages" ;
        Text[ english_us ] = "Add paragraph and table spacing to start of pages";
    Text[ portuguese ] = "A~dicionar espaços de parágrafos e tabelas no início das páginas";
    Text[ russian ] = "Äîáàâèòü èíòåðâàëû àáçàöåâ è òàáëèö â íà÷àëå ñòðàíèöû";
    Text[ greek ] = "¢èñïéóìá ôùí áðïóôÜóåùí ôùí ðáñáãñÜöùí êáé ðéíÜêùí óôçí áñ÷Þ ôçò óåëßäáò";
    Text[ dutch ] = "~Alinea- en tabellenafstanden invoegen aan paginabegin.";
    Text[ french ] = "Additionner les ~espaces entre paragraphes et tableaux en début de page";
    Text[ spanish ] = "Su~mar espacios de tablas y párrafos a los comienzos de página";
    Text[ italian ] = "Aggiungi distanze paragrafi e tabelle a inizio pagina.";
    Text[ danish ] = "Læg afsnits- og tabelafstande til ved sidebegyndelser";
    Text[ swedish ] = "Lägg till stycke- och tabellavstånd vid början av sidor";
    Text[ polish ] = "Dodaj a~kapity i odstêpy tabeli do pocz¹tków stron";
    Text[ portuguese_brazilian ] = "Add distances at the beginning of pages";
    Text[ japanese ] = "’i—Ž‚¨‚æ‚Ñ•\\ŠÔŠu‚ðÍß°¼Þ‚ÌŽn‚߂ɕt‰Á‚·‚é";
    Text[ korean ] = "ÆäÀÌÁö ½ÃÀÛ¿¡ ´Ü¶ô°ú Ç¥ °£°Ý Ãß°¡";
    Text[ chinese_simplified ] = "ÔÚÒ³ÃæÆðʼ´¦Ôö¼Ó¶ÎÂäºÍ±í¸ñµÄ¼ä¸ô";
    Text[ chinese_traditional ] = "­¶­±¶}ºÝ³B¥[¤J¬q¸¨©Mªí®æ¶¡¹j";
    Text[ arabic ] = "ÅÖÇÝÉ ÇáÝÞÑÉ æÊÈÇÚÏ ÇáÌÏÇæá Åáì ÈÏÇíÉ ÇáÕÝÍÇÊ";
    Text[ turkish ] = "Paragraf ve tablo aralýklarýný sayfa baþlarýna ekle";
    Text[ language_user1 ] = " ";
};
};

diff --git a/sw/source/ui/config/optpage.cxx b/sw/source/ui/config/optpage.cxx
new file mode 100644
index 0000000..f1aa10c
--- /dev/null
+++ b/sw/source/ui/config/optpage.cxx
@@ -0,0 +1,2695 @@
/*************************************************************************
 *
 *  $RCSfile: optpage.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:33 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _UIPARAM_HXX
#include <uiparam.hxx>
#endif
#ifndef _CMDID_H
#include <cmdid.h>
#endif

#ifndef _SVSTDARR_HXX
#define _SVSTDARR_STRINGSDTOR
#include <svtools/svstdarr.hxx>
#endif

#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SVX_HTMLMODE_HXX //autogen
#include <svx/htmlmode.hxx>
#endif
#ifndef _SFX_PRINTER_HXX //autogen
#include <sfx2/printer.hxx>
#endif
#ifndef _SFX_BINDINGS_HXX //autogen
#include <sfx2/bindings.hxx>
#endif
#ifndef _XTABLE_HXX //autogen
#include <svx/xtable.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _SVX_FONTITEM_HXX //autogen
#include <svx/fontitem.hxx>
#endif
#ifndef _SVX_DLGUTIL_HXX //autogen
#include <svx/dlgutil.hxx>
#endif
#ifndef _SV_SYSTEM_HXX //autogen
#include <vcl/system.hxx>
#endif
#ifndef _SV_WALL_HXX
#include <vcl/wall.hxx>
#endif


#ifndef _FMTCOL_HXX //autogen
#include <fmtcol.hxx>
#endif
#ifndef _CHARATR_HXX
#include <charatr.hxx>
#endif
#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _UITOOL_HXX
#include <uitool.hxx>
#endif
#ifndef _SWATRSET_HXX
#include <swatrset.hxx>
#endif
#ifndef _OPTDLG_HXX
#include <optdlg.hxx>
#endif
#ifndef _CFGITEMS_HXX
#include <cfgitems.hxx> //Items fuer Sw-Seiten
#endif
#ifndef _FMTCOL_HXX
#include <fmtcol.hxx>
#endif
#ifndef _POOLFMT_HXX
#include <poolfmt.hxx>
#endif
#ifndef _UIITEMS_HXX
#include <uiitems.hxx>
#endif
#ifndef _INITUI_HXX
#include <initui.hxx>
#endif
#ifndef _OPTPAGE_HXX
#include <optpage.hxx>
#endif
#ifndef _SWPRTOPT_HXX
#include <swprtopt.hxx>
#endif
#ifndef _FONTCFG_HXX
#include <fontcfg.hxx>
#endif
#ifndef _MODCFG_HXX
#include <modcfg.hxx>
#endif
#ifndef _SRCVCFG_HXX
#include <srcvcfg.hxx>
#endif
#ifndef _SRCVIEW_HXX
#include <srcview.hxx>
#endif
#ifndef _SRCEDTW_HXX
#include <srcedtw.hxx>
#endif
#ifndef _CRSTATE_HXX
#include <crstate.hxx>
#endif

#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif
#ifndef _CONFIG_HRC
#include <config.hrc>
#endif
#ifndef _REDLOPT_HRC
#include <redlopt.hrc>
#endif
#ifndef _OPTDLG_HRC
#include <optdlg.hrc>
#endif

#define C2S(cChar) String::CreateFromAscii(cChar)
/*******************************************************
 ******************************************************/

/*-----------------31.08.96 10.16-------------------
    TabPage Anzeige/Inhalt
--------------------------------------------------*/

SwContentOptPage::SwContentOptPage( Window* pParent,
                                      const SfxItemSet& rCoreSet ) :
    SfxTabPage( pParent, SW_RES( TP_CONTENT_OPT ), rCoreSet ),
    aDispBox      ( this,   SW_RES( GB_DISP     ) ),
    aGrfCB        ( this,   SW_RES( CB_GRF          ) ),
    aTblCB        ( this,   SW_RES( CB_TBL      ) ),
    aDrwCB        ( this,   SW_RES( CB_DRWFAST   ) ),
    aFldNameCB    ( this,   SW_RES( CB_FIELD    ) ),
    aPostItCB     ( this,   SW_RES( CB_POSTIT   ) ),

    aUnprintBox   ( this,   SW_RES( GB_NOPRINT  ) ),
    aParaCB       ( this,   SW_RES( CB_PARA      ) ),
    aSHyphCB      ( this,   SW_RES( CB_SHYPH        ) ),
    aSpacesCB     ( this,   SW_RES( CB_SPACE    ) ),
    aHSpacesCB    ( this,   SW_RES( CB_HSPACE   ) ),
    aTabCB        ( this,   SW_RES( CB_TAB      ) ),
    aBreakCB      ( this,   SW_RES( CB_BREAK        ) ),
    aHiddenCB     ( this,   SW_RES( CB_HIDDEN   ) ),
    aHiddenParaCB ( this,   SW_RES( CB_HIDDEN_PARA ) ),

    aBackBox      ( this,   SW_RES( GB_BACK     ) ),
    aIdxEntryCB   ( this,   SW_RES( CB_IDX_ENTRY     ) ),
    aIdxBackCB   ( this,    SW_RES( CB_INDEX     ) ),
    aFootBackCB   ( this,   SW_RES( CB_FOOTBACK  ) ),
    aFldBackCB    ( this,   SW_RES( CB_FLDBACK      ) )
{
    FreeResource();
    const SfxPoolItem* pItem;
    if(SFX_ITEM_SET == rCoreSet.GetItemState(SID_HTML_MODE, FALSE, &pItem )
        && ((SfxUInt16Item*)pItem)->GetValue() & HTMLMODE_ON)
    {
        aFootBackCB .Hide();
        aIdxEntryCB .Hide();
        aIdxBackCB.Hide();
        aTabCB      .Hide();
        aHiddenCB   .Hide();
        aHiddenParaCB.Hide();
        aFldBackCB.SetPosPixel(aIdxEntryCB.GetPosPixel());
        aBreakCB.SetPosPixel(aTabCB.GetPosPixel());
    }
}

#undef _INIT

/*-----------------31.08.96 13.58-------------------

--------------------------------------------------*/


SwContentOptPage::~SwContentOptPage()
{
}

/*-----------------31.08.96 13.58-------------------

--------------------------------------------------*/


SfxTabPage* SwContentOptPage::Create( Window* pParent,
                                const SfxItemSet& rAttrSet)
{
    return new SwContentOptPage(pParent, rAttrSet);
}

/*-----------------31.08.96 13.58-------------------

--------------------------------------------------*/


void SwContentOptPage::Reset(const SfxItemSet& rSet)
{
    const SwDocDisplayItem* pDocDisplayAttr = 0;

    rSet.GetItemState( FN_PARAM_DOCDISP, FALSE,
                                    (const SfxPoolItem**)&pDocDisplayAttr );
    if(pDocDisplayAttr)
    {
        aParaCB     .Check  (pDocDisplayAttr->bParagraphEnd         );
        aTabCB      .Check  (pDocDisplayAttr->bTab                  );
        aSpacesCB   .Check  (pDocDisplayAttr->bSpace                );
        aHSpacesCB  .Check  (pDocDisplayAttr->bNonbreakingSpace     );
        aSHyphCB    .Check  (pDocDisplayAttr->bSoftHyphen           );
        aHiddenCB   .Check  (pDocDisplayAttr->bHiddenText           );
        aHiddenParaCB.Check (pDocDisplayAttr->bShowHiddenPara       );
        aBreakCB    .Check  (pDocDisplayAttr->bManualBreak          );
        aIdxEntryCB .Check  (pDocDisplayAttr->bIndexEntry           );
        aIdxBackCB.Check    (pDocDisplayAttr->bIndexBackground      );
        aFootBackCB .Check  (pDocDisplayAttr->bFootnoteBackground   );
        aFldBackCB  .Check  (pDocDisplayAttr->bField                );
        aTblCB      .Check  (pDocDisplayAttr->bTable                );
        aGrfCB      .Check  (pDocDisplayAttr->bGraphic              );
        aDrwCB      .Check  (pDocDisplayAttr->bDrawing              );
        aFldNameCB  .Check  (pDocDisplayAttr->bFieldName            );
        aPostItCB   .Check  (pDocDisplayAttr->bNotes                );
//                                            bHtmlMode
    }

}

/*-----------------31.08.96 13.58-------------------

--------------------------------------------------*/


BOOL SwContentOptPage::FillItemSet(SfxItemSet& rSet)
{
    const SwDocDisplayItem* pOldAttr = (const SwDocDisplayItem*)
                        GetOldItem(GetItemSet(), FN_PARAM_DOCDISP);

    SwDocDisplayItem aDisp;
    if(pOldAttr)
        aDisp = *pOldAttr;
    aDisp.bParagraphEnd         = aParaCB       .IsChecked();
    aDisp.bTab                  = aTabCB        .IsChecked();
    aDisp.bSpace                = aSpacesCB     .IsChecked();
    aDisp.bNonbreakingSpace     = aHSpacesCB    .IsChecked();
    aDisp.bSoftHyphen           = aSHyphCB      .IsChecked();
    aDisp.bHiddenText           = aHiddenCB     .IsChecked();
    aDisp.bShowHiddenPara       = aHiddenParaCB .IsChecked();
    aDisp.bManualBreak          = aBreakCB      .IsChecked();
    aDisp.bIndexEntry           = aIdxEntryCB   .IsChecked();
    aDisp.bIndexBackground      = aIdxBackCB    .IsChecked();
    aDisp.bFootnoteBackground   = aFootBackCB   .IsChecked();
    aDisp.bField                = aFldBackCB    .IsChecked();
    aDisp.bTable                = aTblCB        .IsChecked();
    aDisp.bGraphic              = aGrfCB        .IsChecked();
    aDisp.bDrawing              = aDrwCB        .IsChecked();
    aDisp.bFieldName            = aFldNameCB    .IsChecked();
    aDisp.bNotes                = aPostItCB     .IsChecked();


    BOOL bRet = !pOldAttr || aDisp != *pOldAttr;
    if(bRet)
        bRet = 0 != rSet.Put(aDisp);
    return bRet;
}

/*-----------------31.08.96 10.30-------------------
 TabPage Anzeige/Layout
--------------------------------------------------*/


// -----------------------------------------------------------------------


SwLayoutOptPage::SwLayoutOptPage( Window* pParent,
                                      const SfxItemSet& rCoreSet ) :
    SfxTabPage( pParent, SW_RES( TP_LAYOUT_OPT ), rCoreSet ),
    aLineGB       ( this,   SW_RES( GB_LINE     ) ),
    aTxtbegCB     ( this,   SW_RES( CB_TXTBEG   ) ),
    aTblbegCB     ( this,   SW_RES( CB_TABBEG   ) ),
    aSectBoundsCB( this,    SW_RES( CB_SECT_BOUNDS ) ),
    aCrossCB      ( this,   SW_RES( CB_CROSS     ) ),
    aSolidHandleCB( this,   SW_RES( CB_HANDLE   ) ),
    aBigHandleCB  ( this,   SW_RES( CB_BIGHANDLE) ),
    aWindowGB     ( this,   SW_RES( GB_WINDOW   ) ),
    aHScrollBox   ( this,   SW_RES( CB_HSCROLL   ) ),
    aVScrollBox   ( this,   SW_RES( CB_VSCROLL   ) ),
    aHRulerCBox   ( this,   SW_RES( CB_HRULER   ) ),
    aVRulerCBox   ( this,   SW_RES( CB_VRULER    ) ),
    aSmoothCBox   ( this,   SW_RES( CB_SMOOTH_SCROLL    ) ),
    aMetricLB     ( this,   SW_RES( LB_METRIC   ) ),
    aMetricGB     ( this,   SW_RES( GB_METRIC   ) ),
    aTabGB        ( this,   SW_RES( GB_TAB      ) ),
    aTabMF        ( this,   SW_RES( MF_TAB      ) ),
    aMetricArr    ( SW_RES( ST_METRIC ) ),
    nLastTab(0)
{
    FreeResource();
    for ( USHORT i = 0; i < aMetricArr.Count(); ++i )
    {
        String sMetric = aMetricArr.GetStringByPos( i );
        FieldUnit eFUnit = (FieldUnit)aMetricArr.GetValue( i );

        switch ( eFUnit )
        {
            case FUNIT_MM:
            case FUNIT_CM:
            case FUNIT_POINT:
            case FUNIT_PICA:
            case FUNIT_INCH:
            {
                // nur diese Metriken benutzen
                USHORT nPos = aMetricLB.InsertEntry( sMetric );
                aMetricLB.SetEntryData( nPos, (void*)(long)eFUnit );
            }
        }
    }
    aMetricLB.SetSelectHdl(LINK(this, SwLayoutOptPage, MetricHdl));
    const SfxPoolItem* pItem;
    if(SFX_ITEM_SET == rCoreSet.GetItemState(SID_HTML_MODE, FALSE, &pItem )
        && ((SfxUInt16Item*)pItem)->GetValue() & HTMLMODE_ON)
    {
        aTabGB.Hide();
        aTabMF.Hide();
    }

}

#undef _INIT

/*-----------------31.08.96 13.58-------------------

--------------------------------------------------*/

SwLayoutOptPage::~SwLayoutOptPage()
{
}

/*-----------------31.08.96 13.58-------------------

--------------------------------------------------*/


SfxTabPage* SwLayoutOptPage::Create( Window* pParent,
                                const SfxItemSet& rAttrSet)
{
    return new SwLayoutOptPage(pParent, rAttrSet);
}

/*-----------------31.08.96 13.58-------------------

--------------------------------------------------*/


void SwLayoutOptPage::Reset(const SfxItemSet& rSet)
{
    const SwElemItem* pElemAttr = 0;

    rSet.GetItemState( FN_PARAM_ELEM , FALSE,
                                    (const SfxPoolItem**)&pElemAttr );
    if(pElemAttr)
    {
        aTxtbegCB  .Check( pElemAttr->bBounds           );
        aTblbegCB  .Check( pElemAttr->bTableBounds      );
        aSectBoundsCB.Check( pElemAttr->bSectionBounds  );
        aCrossCB   .Check( pElemAttr->bCrosshair        );
        aSolidHandleCB.Check( !pElemAttr->bHandles          );
        aBigHandleCB.Check(pElemAttr->bBigHandles       );
        aHScrollBox.Check( pElemAttr->bHorzScrollbar     );
        aVScrollBox.Check( pElemAttr->bVertScrollbar     );
        aHRulerCBox.Check( pElemAttr->bHorzRuler         );
        aVRulerCBox.Check( pElemAttr->bVertRuler         );
        aSmoothCBox.Check( pElemAttr->bSmoothScroll      );
    }


    aMetricLB.SetNoSelection();
    if ( rSet.GetItemState( SID_ATTR_METRIC ) >= SFX_ITEM_AVAILABLE )
    {
        const SfxUInt16Item& rItem = (SfxUInt16Item&)rSet.Get( SID_ATTR_METRIC );
        FieldUnit eFieldUnit = (FieldUnit)rItem.GetValue();

        for ( USHORT i = 0; i < aMetricLB.GetEntryCount(); ++i )
        {
            if ( (int)aMetricLB.GetEntryData( i ) == (int)eFieldUnit )
            {
                aMetricLB.SelectEntryPos( i );
                break;
            }
        }
        ::SetFieldUnit(aTabMF, eFieldUnit);
    }
    aMetricLB.SaveValue();

    const SfxPoolItem* pItem;
    if(SFX_ITEM_SET == rSet.GetItemState(SID_ATTR_DEFTABSTOP, FALSE, &pItem))
    {
        nLastTab = ((SfxUInt16Item*)pItem)->GetValue();
        aTabMF.SetValue(aTabMF.Normalize(nLastTab), FUNIT_TWIP);
    }
    // in FrameDocs koennen Scrollbars nicht sinnvoll eingestellt werden
    if(SFX_ITEM_SET == rSet.GetItemState(FN_VIEW_IN_FRAME, FALSE, &pItem) &&
        ((const SfxBoolItem*)pItem)->GetValue())
    {
        aHScrollBox.Enable(FALSE);
        aVScrollBox.Enable(FALSE);
    }
    aTabMF.SaveValue();

}

/*-----------------31.08.96 13.58-------------------

--------------------------------------------------*/


BOOL SwLayoutOptPage::FillItemSet(SfxItemSet& rSet)
{
    const SwElemItem*   pOldAttr = (const SwElemItem*)
                        GetOldItem(GetItemSet(), FN_PARAM_ELEM);

    SwElemItem aElem;
    if(pOldAttr)
        aElem = *pOldAttr;

    aElem.bBounds        = aTxtbegCB  .IsChecked();
    aElem.bTableBounds   = aTblbegCB  .IsChecked();
    aElem.bSectionBounds = aSectBoundsCB.IsChecked();
    aElem.bCrosshair     = aCrossCB   .IsChecked();
    aElem.bHandles       = !aSolidHandleCB.IsChecked();
    aElem.bBigHandles    = aBigHandleCB.IsChecked();
    aElem.bHorzScrollbar = aHScrollBox.IsChecked();
    aElem.bVertScrollbar = aVScrollBox.IsChecked();
    aElem.bHorzRuler     = aHRulerCBox.IsChecked();
    aElem.bVertRuler     = aVRulerCBox.IsChecked();
    aElem.bSmoothScroll  = aSmoothCBox.IsChecked();

    BOOL bRet = !pOldAttr || aElem != *pOldAttr;
    if(bRet)
        bRet = 0 != rSet.Put(aElem);

    const USHORT nMPos = aMetricLB.GetSelectEntryPos();
    if ( nMPos != aMetricLB.GetSavedValue() )
    {
        // Doppel-Cast fuer VA3.0
        USHORT nFieldUnit = (USHORT)(long)aMetricLB.GetEntryData( nMPos );
        bRet |= 0 != rSet.Put( SfxUInt16Item( SID_ATTR_METRIC,
                                     (UINT16)nFieldUnit ) );
    }

    if(aTabMF.IsVisible() && aTabMF.GetText() != aTabMF.GetSavedValue())
        bRet |= 0 != rSet.Put(SfxUInt16Item(SID_ATTR_DEFTABSTOP,
                    (USHORT)aTabMF.Denormalize(aTabMF.GetValue(FUNIT_TWIP))));

    return bRet;
}

/*-----------------13.01.97 14.44-------------------
    Metric des Deftabstops umschalten
--------------------------------------------------*/

IMPL_LINK(SwLayoutOptPage, MetricHdl, ListBox*, EMPTYARG)
{
    const USHORT nMPos = aMetricLB.GetSelectEntryPos();
    if(nMPos != USHRT_MAX)
    {
        // Doppel-Cast fuer VA3.0
        FieldUnit eFieldUnit = (FieldUnit)(long)aMetricLB.GetEntryData( nMPos );
        BOOL bModified = aTabMF.IsModified();
        long nVal = bModified ?
            aTabMF.Denormalize( aTabMF.GetValue( FUNIT_TWIP ) ) :
                nLastTab;
        ::SetFieldUnit( aTabMF, eFieldUnit );
        aTabMF.SetValue( aTabMF.Normalize( nVal ), FUNIT_TWIP );
        if(!bModified)
            aTabMF.ClearModifyFlag();
    }

    return 0;
}

/*----------------- OS 27.01.95  -----------------------
 TabPage Drucker Zusatzeinstellungen
-------------------------------------------------------*/

// makro fuers init ------------------------------------------------------

#define _INIT \
    aGrfCB           (this, SW_RES(CB_PGRF)), \
    aTabCB           (this, SW_RES(CB_PTAB)), \
    aDrawCB          (this, SW_RES(CB_PDRAW)), \
    aCtrlFldCB       (this, SW_RES(CB_CTRLFLD)), \
    aBackgroundCB    (this, SW_RES(CB_BACKGROUND)),\
    aBlackFontCB     (this, SW_RES(CB_BLACK_FONT)),\
    aGroup1          (this, SW_RES(GRP_1)),  \
    aLeftPageCB      (this, SW_RES(CB_LEFTP)),\
    aRightPageCB     (this, SW_RES(CB_RIGHTP)),\
    aReverseCB       (this, SW_RES(CB_REVERSE)),\
    aProspectCB      (this, SW_RES(CB_PROSPECT)),\
    aGroup2          (this, SW_RES(GRP_2)),     \
    aNoRB            (this, SW_RES(RB_NO)),     \
    aOnlyRB          (this, SW_RES(RB_ONLY)),   \
    aEndRB           (this, SW_RES(RB_END)),    \
    aEndPageRB       (this, SW_RES(RB_PAGEEND)),\
    aGroup3          (this, SW_RES(GRP_3)),     \
    aPaperFromSetupCB(this, SW_RES(CB_PAPERFROMSETUP)),\
    aGroup5          (this, SW_RES(GRP_5)),     \
    aSingleJobsCB    (this, SW_RES(CB_SINGLEJOBS)),\
    aGroup4          (this, SW_RES(GRP_4)),  \
    aFaxLB           (this, SW_RES(LB_FAX)), \
    aFaxGB           (this, SW_RES(GB_FAX)), \
    bAttrModified( FALSE )

// -----------------------------------------------------------------------


SwAddPrinterTabPage::SwAddPrinterTabPage( Window* pParent,
                                      const SfxItemSet& rCoreSet) :
    SfxTabPage( pParent, SW_RES( TP_OPTPRINT_PAGE ), rCoreSet),
    bPreview  ( FALSE ),
    _INIT
{
    Init();
    FreeResource();

    Link aLk = LINK( this, SwAddPrinterTabPage, AutoClickHdl);
    aGrfCB.SetClickHdl( aLk );
    aRightPageCB.SetClickHdl( aLk );
    aLeftPageCB.SetClickHdl( aLk );
    aTabCB.SetClickHdl( aLk );
    aDrawCB.SetClickHdl( aLk );
    aCtrlFldCB.SetClickHdl( aLk );
    aBackgroundCB.SetClickHdl( aLk );
    aBlackFontCB.SetClickHdl( aLk );
    aReverseCB.SetClickHdl( aLk );
    aProspectCB.SetClickHdl( aLk );
    aPaperFromSetupCB.SetClickHdl( aLk );
    aEndPageRB.SetClickHdl( aLk );
    aEndRB.SetClickHdl( aLk );
    aOnlyRB.SetClickHdl( aLk );
    aNoRB.SetClickHdl( aLk );
    aSingleJobsCB.SetClickHdl( aLk );
    aFaxLB.SetSelectHdl( LINK( this, SwAddPrinterTabPage, SelectHdl ) );

    const SfxPoolItem* pItem;
    if(SFX_ITEM_SET == rCoreSet.GetItemState(SID_HTML_MODE, FALSE, &pItem )
        && ((SfxUInt16Item*)pItem)->GetValue() & HTMLMODE_ON)
    {
        aDrawCB      .Hide();
        aLeftPageCB  .Hide();
        aRightPageCB .Hide();
        aReverseCB.SetPosPixel(aLeftPageCB  .GetPosPixel());
        aProspectCB.SetPosPixel(aRightPageCB .GetPosPixel());
        aBlackFontCB.SetPosPixel(aBackgroundCB.GetPosPixel());
        aBackgroundCB.SetPosPixel(aCtrlFldCB.GetPosPixel());
        aCtrlFldCB.SetPosPixel(aDrawCB.GetPosPixel());
    }

}

#undef _INIT
//------------------------------------------------------------------------

void SwAddPrinterTabPage::SetPreview(BOOL bPrev)
{
    bPreview = bPrev;

    if (bPreview)
    {
        aLeftPageCB.Disable();
        aRightPageCB.Disable();
        aProspectCB.Disable();
        aGroup3.Disable();
        aNoRB.Disable();
        aOnlyRB.Disable();
        aEndRB.Disable();
        aEndPageRB.Disable();
    }
}

//------------------------------------------------------------------------

SfxTabPage* SwAddPrinterTabPage::Create( Window* pParent,
                                       const SfxItemSet& rAttrSet )
{
    return ( new SwAddPrinterTabPage( pParent, rAttrSet ) );
}
//------------------------------------------------------------------------


BOOL    SwAddPrinterTabPage::FillItemSet( SfxItemSet& rCoreSet )
{
    if ( bAttrModified )
    {
        SwAddPrinterItem aAddPrinterAttr (FN_PARAM_ADDPRINTER);
        aAddPrinterAttr.bPrintGraphic   = aGrfCB.IsChecked();
        aAddPrinterAttr.bPrintTable     = aTabCB.IsChecked();
        aAddPrinterAttr.bPrintDrawing   = aDrawCB.IsChecked();
        aAddPrinterAttr.bPrintControl   = aCtrlFldCB.IsChecked();
        aAddPrinterAttr.bPrintPageBackground = aBackgroundCB.IsChecked();
        aAddPrinterAttr.bPrintBlackFont = aBlackFontCB.IsChecked();

        aAddPrinterAttr.bPrintLeftPage  = aLeftPageCB.IsChecked();
        aAddPrinterAttr.bPrintRightPage = aRightPageCB.IsChecked();
        aAddPrinterAttr.bPrintReverse   = aReverseCB.IsChecked();
        aAddPrinterAttr.bPrintProspect  = aProspectCB.IsChecked();
        aAddPrinterAttr.bPaperFromSetup = aPaperFromSetupCB.IsChecked();
        aAddPrinterAttr.bPrintSingleJobs = aSingleJobsCB.IsChecked();

        if (aNoRB.IsChecked())  aAddPrinterAttr.nPrintPostIts =
                                                        POSTITS_NONE;
        if (aOnlyRB.IsChecked()) aAddPrinterAttr.nPrintPostIts =
                                                        POSTITS_ONLY;
        if (aEndRB.IsChecked()) aAddPrinterAttr.nPrintPostIts =
                                                        POSTITS_ENDDOC;
        if (aEndPageRB.IsChecked()) aAddPrinterAttr.nPrintPostIts =
                                                        POSTITS_ENDPAGE;

        aAddPrinterAttr.sFaxName = aFaxLB.GetSelectEntry();
        rCoreSet.Put(aAddPrinterAttr);
    }
    return bAttrModified;
}
//------------------------------------------------------------------------


void    SwAddPrinterTabPage::Reset( const SfxItemSet&  )
{
    const   SfxItemSet&         rSet = GetItemSet();
    const   SwAddPrinterItem*   pAddPrinterAttr = 0;

    if( SFX_ITEM_SET == rSet.GetItemState( FN_PARAM_ADDPRINTER , FALSE,
                                    (const SfxPoolItem**)&pAddPrinterAttr ))
    {
        aGrfCB.Check(           pAddPrinterAttr->bPrintGraphic);
        aTabCB.Check(           pAddPrinterAttr->bPrintTable);
        aDrawCB.Check(          pAddPrinterAttr->bPrintDrawing);
        aCtrlFldCB.Check(       pAddPrinterAttr->bPrintControl);
        aBackgroundCB.Check(    pAddPrinterAttr->bPrintPageBackground);
        aBlackFontCB.Check(     pAddPrinterAttr->bPrintBlackFont);
        aLeftPageCB.Check(      pAddPrinterAttr->bPrintLeftPage);
        aRightPageCB.Check(     pAddPrinterAttr->bPrintRightPage);
        aReverseCB.Check(       pAddPrinterAttr->bPrintReverse);
        aPaperFromSetupCB.Check(pAddPrinterAttr->bPaperFromSetup);
        aProspectCB.Check(      pAddPrinterAttr->bPrintProspect);
        aSingleJobsCB.Check(    pAddPrinterAttr->bPrintSingleJobs);

        aNoRB.Check (pAddPrinterAttr->nPrintPostIts== POSTITS_NONE ) ;
        aOnlyRB.Check (pAddPrinterAttr->nPrintPostIts== POSTITS_ONLY ) ;
        aEndRB.Check (pAddPrinterAttr->nPrintPostIts== POSTITS_ENDDOC ) ;
        aEndPageRB.Check (pAddPrinterAttr->nPrintPostIts== POSTITS_ENDPAGE ) ;
        aFaxLB.SelectEntry( pAddPrinterAttr->sFaxName );
    }
}
//-----------------------------------------------------------------------

//-----------------------------------------------------------------------


void    SwAddPrinterTabPage::Init()
{

}
//------------------------------------------------------------------------


IMPL_LINK_INLINE_START( SwAddPrinterTabPage, AutoClickHdl, CheckBox *, EMPTYARG )
{
    bAttrModified = TRUE;
    return 0;
}
IMPL_LINK_INLINE_END( SwAddPrinterTabPage, AutoClickHdl, CheckBox *, EMPTYARG )

//------------------------------------------------------------------------


void  SwAddPrinterTabPage::SetFax( const SvStringsDtor& rFaxLst )
{
    for ( USHORT i = 0; i < rFaxLst.Count(); ++i )
        aFaxLB.InsertEntry( *rFaxLst.GetObject(i) );
    aFaxLB.SelectEntryPos( 0 );
}

//------------------------------------------------------------------------


IMPL_LINK_INLINE_START( SwAddPrinterTabPage, SelectHdl, ListBox *, EMPTYARG )
{
    bAttrModified=TRUE;
    return 0;
}
IMPL_LINK_INLINE_END( SwAddPrinterTabPage, SelectHdl, ListBox *, EMPTYARG )

/*-----------------03.09.96 11.53-------------------
    Tabpage Standardfonts
--------------------------------------------------*/


SwStdFontTabPage::SwStdFontTabPage( Window* pParent,
                                       const SfxItemSet& rSet ) :
    SfxTabPage( pParent, SW_RES( TP_STD_FONT ), rSet),
    aStandardLbl(this, SW_RES(FT_STANDARD)),
    aStandardBox(this, SW_RES(LB_STANDARD)),
    aTitleLbl   (this, SW_RES(FT_TITLE   )),
    aTitleBox   (this, SW_RES(LB_TITLE   )),
    aListLbl    (this, SW_RES(FT_LIST    )),
    aListBox    (this, SW_RES(LB_LIST    )),
    aLabelLbl   (this, SW_RES(FT_LABEL   )),
    aLabelBox   (this, SW_RES(LB_LABEL   )),
    aIdxLbl     (this, SW_RES(FT_IDX     )),
    aIdxBox     (this, SW_RES(LB_IDX     )),
    aStdChrFrm  (this, SW_RES(GB_STDCHR  )),
    aDocOnlyCB  (this, SW_RES(CB_DOCONLY )),
    aStandardPB (this, SW_RES(PB_STANDARD)),
    pPrt(0),
    pFontConfig(0),
    pWrtShell(0),
    bListDefault(FALSE),
    bLabelDefault(FALSE),
    bSetListDefault(TRUE),
    bSetLabelDefault(TRUE),
    bSetIdxDefault(TRUE),
    bIdxDefault(FALSE),
    bDeletePrinter(FALSE)
{
    FreeResource();
    aStandardPB.SetClickHdl(LINK(this, SwStdFontTabPage, StandardHdl));
    aStandardBox.SetModifyHdl( LINK(this, SwStdFontTabPage, ModifyHdl));
    aListBox    .SetModifyHdl( LINK(this, SwStdFontTabPage, ModifyHdl));
    aLabelBox   .SetModifyHdl( LINK(this, SwStdFontTabPage, ModifyHdl));
    aIdxBox     .SetModifyHdl( LINK(this, SwStdFontTabPage, ModifyHdl));

    aDocOnlyCB.Check(SW_MOD()->GetModuleConfig()->IsDefaultFontInCurrDocOnly());
}

/*-----------------03.09.96 11.53-------------------

--------------------------------------------------*/

SwStdFontTabPage::~SwStdFontTabPage()
{
    if(bDeletePrinter)
        delete pPrt;
}

/*-----------------03.09.96 11.53-------------------

--------------------------------------------------*/


SfxTabPage* SwStdFontTabPage::Create( Window* pParent,
                                const SfxItemSet& rAttrSet )
{
    return new SwStdFontTabPage(pParent, rAttrSet);
}

/*-----------------03.09.96 11.53-------------------

--------------------------------------------------*/


void lcl_SetColl(SwWrtShell* pWrtShell, USHORT nType,
                    SfxPrinter* pPrt, const String& rStyle)
{
    BOOL bDelete = FALSE;
    const SfxFont* pFnt = pPrt ? pPrt->GetFontByName(rStyle): 0;
    if(!pFnt)
    {
        pFnt = new SfxFont(FAMILY_DONTKNOW, rStyle);
        bDelete = TRUE;
    }
    SwTxtFmtColl *pColl = pWrtShell->GetTxtCollFromPool(nType);
    pColl->SetAttr(SvxFontItem(pFnt->GetFamily(), pFnt->GetName(),
                aEmptyStr, pFnt->GetPitch(), pFnt->GetCharSet()));
    if(bDelete)
    {
        delete (SfxFont*) pFnt;
        bDelete = FALSE;
    }
}


/*-----------------03.09.96 11.53-------------------

--------------------------------------------------*/


BOOL SwStdFontTabPage::FillItemSet( SfxItemSet& rSet )
{
    BOOL bNotDocOnly = !aDocOnlyCB.IsChecked();
    SW_MOD()->GetModuleConfig()->SetDefaultFontInCurrDocOnly(!bNotDocOnly);

    String sStandard    = aStandardBox.GetText();
    String sTitle       =  aTitleBox   .GetText();
    String sList        =  aListBox    .GetText();
    String sLabel       =  aLabelBox   .GetText();
    String sIdx         =  aIdxBox     .GetText();
    String sStandardBak = aStandardBox.GetSavedValue();
    String sTitleBak    = aTitleBox   .GetSavedValue();
    String sListBak     = aListBox    .GetSavedValue();
    String sLabelBak    = aLabelBox   .GetSavedValue();
    String sIdxBak      = aIdxBox     .GetSavedValue();


    if(bNotDocOnly)
    {
        if(sStandard != sStandardBak)
            pFontConfig->SetFontStandard(sStandard);
        if(sTitle != sTitleBak )
            pFontConfig->SetFontOutline(sTitle);
        if(sList != sListBak )
            pFontConfig->SetFontList(sList);
        if(sLabel != sLabelBak )
            pFontConfig->SetFontCaption(sLabel);
        if(sIdx != sIdxBak )
            pFontConfig->SetFontIndex(sIdx);
    }
    if(pWrtShell)
    {
        pWrtShell->StartAllAction();
        SfxPrinter* pPrt = pWrtShell->GetPrt();
        BOOL bMod = FALSE;
        if(sStandard != sShellStd)
        {
            BOOL bDelete = FALSE;
            const SfxFont* pFnt = pPrt ? pPrt->GetFontByName(sStandard): 0;
            if(!pFnt)
            {
                pFnt = new SfxFont(FAMILY_DONTKNOW, sStandard);
                bDelete = TRUE;
            }
            pWrtShell->SetDefault(SvxFontItem(pFnt->GetFamily(), pFnt->GetName(),
                                aEmptyStr, pFnt->GetPitch(), pFnt->GetCharSet()));
            SwTxtFmtColl *pColl = pWrtShell->GetTxtCollFromPool(RES_POOLCOLL_STANDARD);
            pColl->ResetAttr(RES_CHRATR_FONT);
            if(bDelete)
            {
                delete (SfxFont*) pFnt;
                bDelete = FALSE;
            }
//          lcl_SetColl(pWrtShell, RES_POOLCOLL_STANDARD, pPrt, sStandard);
            bMod = TRUE;
        }
        if(sTitle != sShellTitle )
        {
            lcl_SetColl(pWrtShell, RES_POOLCOLL_HEADLINE_BASE, pPrt, sTitle);
            bMod = TRUE;
        }
        if(sList != sShellList && (!bListDefault || !bSetListDefault ))
        {
            lcl_SetColl(pWrtShell, RES_POOLCOLL_NUMBUL_BASE, pPrt, sList);
            bMod = TRUE;
        }
        if(sLabel != sShellLabel && (!bLabelDefault || !bSetLabelDefault))
        {
            lcl_SetColl(pWrtShell, RES_POOLCOLL_LABEL, pPrt, sLabel);
            bMod = TRUE;
        }
        if(sIdx != sShellIndex && (!bIdxDefault || !bSetIdxDefault))
        {
            lcl_SetColl(pWrtShell, RES_POOLCOLL_REGISTER_BASE, pPrt, sIdx);
            bMod = TRUE;
        }
        if ( bMod )
            pWrtShell->SetModified();
        pWrtShell->EndAllAction();
    }

    return FALSE;
}

/*-----------------03.09.96 11.53-------------------

--------------------------------------------------*/

void SwStdFontTabPage::Reset( const SfxItemSet& rSet )
{
    const SfxPoolItem* pItem;

    if(SFX_ITEM_SET == rSet.GetItemState(FN_PARAM_PRINTER, FALSE, &pItem))
    {
        pPrt = (SfxPrinter*)((const SwPtrItem*)pItem)->GetValue();
    }
    else
    {
        SfxItemSet* pSet = new SfxItemSet( *rSet.GetPool(),
                    SID_PRINTER_NOTFOUND_WARN, SID_PRINTER_NOTFOUND_WARN,
                    SID_PRINTER_CHANGESTODOC, SID_PRINTER_CHANGESTODOC,
                    0 );
        pPrt = new SfxPrinter(pSet);
        bDeletePrinter = TRUE;
    }
    const USHORT nCount = pPrt->GetFontCount();
    for (USHORT i = 0; i < nCount; ++i)
    {
        const String &rString = pPrt->GetFont(i)->GetName();
        aStandardBox.InsertEntry( rString );
        aTitleBox   .InsertEntry( rString );
        aListBox    .InsertEntry( rString );
        aLabelBox   .InsertEntry( rString );
        aIdxBox     .InsertEntry( rString );
    }
    if(SFX_ITEM_SET == rSet.GetItemState(FN_PARAM_STDFONTS, FALSE, &pItem))
    {
         pFontConfig = (SwStdFontConfig*)((const SwPtrItem*)pItem)->GetValue();
    }

    if(SFX_ITEM_SET == rSet.GetItemState(FN_PARAM_WRTSHELL, FALSE, &pItem))
    {
        pWrtShell = (SwWrtShell*)((const SwPtrItem*)pItem)->GetValue();
    }
    String sStdBackup;
    String sOutBackup;
    String sListBackup;
    String sCapBackup;
    String sIdxBackup;

    if(!pWrtShell)
    {
       sStdBackup = pFontConfig->GetFontStandard();
       sOutBackup = pFontConfig->GetFontOutline();
       sListBackup= pFontConfig->GetFontList();
       sCapBackup = pFontConfig->GetFontCaption();
       sIdxBackup = pFontConfig->GetFontIndex();
       aDocOnlyCB.Enable(FALSE);
    }
    else
    {
        SwTxtFmtColl *pColl = pWrtShell->GetTxtCollFromPool(RES_POOLCOLL_STANDARD);
        sShellStd = sStdBackup =  pColl->GetFont().GetFamilyName();

        pColl = pWrtShell->GetTxtCollFromPool(RES_POOLCOLL_HEADLINE_BASE);
        sShellTitle = sOutBackup = pColl->GetFont().GetFamilyName();

        pColl = pWrtShell->GetTxtCollFromPool(RES_POOLCOLL_NUMBUL_BASE);
        bListDefault = SFX_ITEM_DEFAULT == pColl->GetAttrSet().GetItemState(RES_CHRATR_FONT, FALSE);
        sShellList = sListBackup = pColl->GetFont().GetFamilyName();

        pColl = pWrtShell->GetTxtCollFromPool(RES_POOLCOLL_LABEL);
        bLabelDefault = SFX_ITEM_DEFAULT == pColl->GetAttrSet().GetItemState(RES_CHRATR_FONT, FALSE);
        sShellLabel = sCapBackup = pColl->GetFont().GetFamilyName();

        pColl = pWrtShell->GetTxtCollFromPool(RES_POOLCOLL_REGISTER_BASE);
        bIdxDefault = SFX_ITEM_DEFAULT == pColl->GetAttrSet().GetItemState(RES_CHRATR_FONT, FALSE);
        sShellIndex = sIdxBackup = pColl->GetFont().GetFamilyName();
    }
    aStandardBox.SetText(sStdBackup );
    aTitleBox   .SetText(sOutBackup );
    aListBox    .SetText(sListBackup);
    aLabelBox   .SetText(sCapBackup );
    aIdxBox     .SetText(sIdxBackup );

    aStandardBox.SaveValue();
    aTitleBox   .SaveValue();
    aListBox    .SaveValue();
    aLabelBox   .SaveValue();
    aIdxBox     .SaveValue();
}

/*-----------------07.09.96 12.28-------------------

--------------------------------------------------*/


IMPL_LINK( SwStdFontTabPage, StandardHdl, PushButton *, EMPTYARG )
{
    aStandardBox.SetText(SwStdFontConfig::GetDefaultFor(FONT_STANDARD));
    aTitleBox   .SetText(SwStdFontConfig::GetDefaultFor(FONT_OUTLINE));
    aListBox    .SetText(SwStdFontConfig::GetDefaultFor(FONT_LIST));
    aLabelBox   .SetText(SwStdFontConfig::GetDefaultFor(FONT_CAPTION));
    aIdxBox     .SetText(SwStdFontConfig::GetDefaultFor(FONT_INDEX));
    aStandardBox.SaveValue();
    aTitleBox   .SaveValue();
    aListBox    .SaveValue();
    aLabelBox   .SaveValue();
    aIdxBox     .SaveValue();

    return 0;
}
/*-----------------17.01.97 15.43-------------------

--------------------------------------------------*/

IMPL_LINK( SwStdFontTabPage, ModifyHdl, ComboBox*, pBox )
{
    if(pBox == &aStandardBox)
    {
        String sEntry = pBox->GetText();
        if(bSetListDefault && bListDefault)
            aListBox.SetText(sEntry);
        if(bSetLabelDefault && bLabelDefault)
            aLabelBox.SetText(sEntry);
        if(bSetIdxDefault && bIdxDefault)
            aIdxBox.SetText(sEntry);
    }
    else if(pBox == &aListBox)
    {
        bSetListDefault = FALSE;
    }
    else if(pBox == &aLabelBox)
    {
        bSetLabelDefault = FALSE;
    }
    else if(pBox == &aIdxBox)
    {
        bSetIdxDefault = FALSE;
    }
    return 0;
}

#undef _INIT

/*-----------------18.01.97 12.14-------------------
    Optionen Tabelle
--------------------------------------------------*/

SwTableOptionsTabPage::SwTableOptionsTabPage( Window* pParent, const SfxItemSet& rSet ) :
    SfxTabPage(pParent, SW_RES(TP_OPTTABLE_PAGE), rSet),
    aMoveGB(        this, ResId(GB_MOVE     )),
    aRowMoveFT(     this, ResId(FT_ROWMOVE  )),
    aRowMoveMF(     this, ResId(MF_ROWMOVE  )),
    aColMoveFT(     this, ResId(FT_COLMOVE  )),
    aColMoveMF(     this, ResId(MF_COLMOVE  )),
    aInsertGB(      this, ResId(GB_INSERT   )),
    aRowInsertFT(   this, ResId(FT_ROWINSERT)),
    aRowInsertMF(   this, ResId(MF_ROWINSERT)),
    aColInsertFT(   this, ResId(FT_COLINSERT)),
    aColInsertMF(   this, ResId(MF_COLINSERT)),
    aHandlingGB(    this, ResId(GB_HANDLING )),
    aFixRB(         this, ResId(RB_FIX      )),
    aFixFT(         this, ResId(FT_FIX      )),
    aFixPropRB(     this, ResId(RB_FIXPROP  )),
    aFixPropFT(     this, ResId(FT_FIXPROP  )),
    aVarRB(         this, ResId(RB_VAR      )),
    aVarFT(         this, ResId(FT_VAR      )),
    aDescFT(        this, ResId(FT_DESC     )),
    pWrtShell(0)
{
    FreeResource();
}

/*-----------------18.01.97 12.43-------------------

--------------------------------------------------*/

SwTableOptionsTabPage::~SwTableOptionsTabPage()
{
}

/*-----------------18.01.97 12.43-------------------

--------------------------------------------------*/

SfxTabPage* SwTableOptionsTabPage::Create( Window* pParent,
                                const SfxItemSet& rAttrSet )
{
    return new SwTableOptionsTabPage(pParent, rAttrSet );
}

/*-----------------18.01.97 12.42-------------------

--------------------------------------------------*/

BOOL SwTableOptionsTabPage::FillItemSet( SfxItemSet& rSet )
{
    BOOL bRet = FALSE;
    SwModuleOptions* pModOpt = SW_MOD()->GetModuleConfig();

    if(aRowMoveMF.IsModified())
        pModOpt->SetTblHMove( (USHORT)aRowMoveMF.Denormalize( aRowMoveMF.GetValue(FUNIT_TWIP)));

    if(aColMoveMF.IsModified())
        pModOpt->SetTblVMove( (USHORT)aColMoveMF.Denormalize( aColMoveMF.GetValue(FUNIT_TWIP)));

    if(aRowInsertMF.IsModified())
        pModOpt->SetTblHInsert((USHORT)aRowInsertMF.Denormalize( aRowInsertMF.GetValue(FUNIT_TWIP)));

    if(aColInsertMF.IsModified())
        pModOpt->SetTblVInsert((USHORT)aColInsertMF.Denormalize( aColInsertMF.GetValue(FUNIT_TWIP)));

    TblChgMode eMode;
    if(aFixRB.IsChecked())
        eMode = TBLFIX_CHGABS;
    else if(aFixPropRB.IsChecked())
        eMode = TBLFIX_CHGPROP;
    else
        eMode = TBLVAR_CHGABS;
    if(eMode != pModOpt->GetTblMode())
    {
        pModOpt->SetTblMode(eMode);
        // der Tabellen-Tastatur-Modus hat sich geaendert, das soll
        // jetzt auch die aktuelle Tabelle erfahren
        if(pWrtShell && SwWrtShell::SEL_TBL & pWrtShell->GetSelectionType())
        {
            pWrtShell->SetTblChgMode(eMode);
        }
        static USHORT __READONLY_DATA aInva[] =
                            {   FN_TABLE_MODE_FIX,
                                FN_TABLE_MODE_FIX_PROP,
                                FN_TABLE_MODE_VARIABLE,
                                0
                            };
        pWrtShell->GetView().GetViewFrame()->GetBindings().Invalidate( aInva );
        bRet = TRUE;
    }

    return bRet;
}
/*-----------------18.01.97 12.42-------------------

--------------------------------------------------*/

void SwTableOptionsTabPage::Reset( const SfxItemSet& rSet)
{
    const SwModuleOptions* pModOpt = SW_MOD()->GetModuleConfig();
    if ( rSet.GetItemState( SID_ATTR_METRIC ) >= SFX_ITEM_AVAILABLE )
    {
        const SfxUInt16Item& rItem = (SfxUInt16Item&)rSet.Get( SID_ATTR_METRIC );
        FieldUnit eFieldUnit = (FieldUnit)rItem.GetValue();
        ::SetFieldUnit( aRowMoveMF, eFieldUnit );
        ::SetFieldUnit( aColMoveMF, eFieldUnit );
        ::SetFieldUnit( aRowInsertMF, eFieldUnit );
        ::SetFieldUnit( aColInsertMF, eFieldUnit );
    }

    aRowMoveMF  .SetValue(aRowMoveMF.Normalize(pModOpt->GetTblHMove()), FUNIT_TWIP);
    aColMoveMF  .SetValue(aColMoveMF.Normalize(pModOpt->GetTblVMove()), FUNIT_TWIP);
    aRowInsertMF.SetValue(aRowInsertMF.Normalize(pModOpt->GetTblHInsert()), FUNIT_TWIP);
    aColInsertMF.SetValue(aColInsertMF.Normalize(pModOpt->GetTblVInsert()), FUNIT_TWIP);

    switch(pModOpt->GetTblMode())
    {
        case TBLFIX_CHGABS:     aFixRB.Check();     break;
        case TBLFIX_CHGPROP:    aFixPropRB.Check(); break;
        case TBLVAR_CHGABS:     aVarRB.Check(); break;
    }
}
/*-----------------19.04.97 13:20-------------------

--------------------------------------------------*/
SwSourceViewOptionsTabPage::SwSourceViewOptionsTabPage(
                    Window* pParent,   const SfxItemSet& rSet ) :
    SfxTabPage(pParent, SW_RES(TP_OPTSRCVIEW), rSet),
    aColorGB(this,      ResId(GB_COLOR  )),
    aSGMLFT(this,       ResId(FT_SGML   )),
    aSGMLLB(this,       ResId(LB_SGML   )),
    aCommentFT(this,    ResId(FT_COMMENT)),
    aCommentLB(this,    ResId(LB_COMMENT)),
    aKeywdFT(this,      ResId(FT_KEYWD  )),
    aKeywdLB(this,      ResId(LB_KEYWD  )),
    aUnknownFT(this,    ResId(FT_UNKNOWN)),
    aUnknownLB(this,    ResId(LB_UNKNOWN))
{
    FreeResource();
    String sSGML    ;
    String sComment ;
    String sKeywd   ;
    String sUnknown ;

    XColorTable* pColorTbl = OFF_APP()->GetStdColorTable();
    SwSrcViewConfig* pSrcVwCfg = SW_MOD()->GetSourceViewConfig();
    USHORT nCount = (USHORT)pColorTbl->Count();
    aSGMLLB     .SetUpdateMode(FALSE);
    aCommentLB  .SetUpdateMode(FALSE);
    aKeywdLB    .SetUpdateMode(FALSE);
    aUnknownLB  .SetUpdateMode(FALSE);

    Color aTmpColSGML(pSrcVwCfg->GetSyntaxColor(SRC_SYN_SGML));
    Color aTmpColComment(pSrcVwCfg->GetSyntaxColor(SRC_SYN_COMMENT));
    Color aTmpColKey(pSrcVwCfg->GetSyntaxColor(SRC_SYN_KEYWRD));
    Color aTmpColUnknown(pSrcVwCfg->GetSyntaxColor(SRC_SYN_UNKNOWN));

    for(USHORT i = 0; i < nCount; i++)
    {
        XColorEntry* pEntry = pColorTbl->Get(i);
        Color aColor = pEntry->GetColor();
        String sName = pEntry->GetName();
        if(aColor == aTmpColSGML )
            sSGML = sName;
        if(aColor == aTmpColComment )
            sComment = sName;
        if(aColor == aTmpColKey )
            sKeywd = sName;
        if(aColor == aTmpColUnknown )
            sUnknown = sName;
        aSGMLLB     .InsertEntry(aColor, sName);
        aCommentLB  .InsertEntry(aColor, sName);
        aKeywdLB    .InsertEntry(aColor, sName);
        aUnknownLB  .InsertEntry(aColor, sName);
    }
    aSGMLLB     .SetUpdateMode(TRUE);
    aCommentLB  .SetUpdateMode(TRUE);
    aKeywdLB    .SetUpdateMode(TRUE);
    aUnknownLB  .SetUpdateMode(TRUE);
    aSGMLLB     .SelectEntry(sSGML      );
    aCommentLB  .SelectEntry(sComment   );
    aKeywdLB    .SelectEntry(sKeywd     );
    aUnknownLB  .SelectEntry(sUnknown   );

}

/*-----------------19.04.97 13:22-------------------

--------------------------------------------------*/
SwSourceViewOptionsTabPage::~SwSourceViewOptionsTabPage()
{
}

/*-----------------19.04.97 13:22-------------------

--------------------------------------------------*/
SfxTabPage* SwSourceViewOptionsTabPage::Create( Window* pParent,
                                const SfxItemSet& rAttrSet )
{
    return new SwSourceViewOptionsTabPage(pParent, rAttrSet);
}

/*-----------------19.04.97 13:23-------------------

--------------------------------------------------*/
BOOL SwSourceViewOptionsTabPage::FillItemSet( SfxItemSet& rSet )
{
    SwSrcViewConfig* pSrcVwCfg = SW_MOD()->GetSourceViewConfig();
    BOOL bModified = FALSE;
    if(aSGMLLB.GetSelectEntry().Len() &&
        !aSGMLLB.GetSelectEntryColor().IsRGBEqual(pSrcVwCfg->GetSyntaxColor(SRC_SYN_SGML)))
    {
        bModified = TRUE;
        pSrcVwCfg->SetSyntaxColor(SRC_SYN_SGML, aSGMLLB.GetSelectEntryColor());
    }
    if(aCommentLB.GetSelectEntry().Len() &&
        !aCommentLB.GetSelectEntryColor().IsRGBEqual(pSrcVwCfg->GetSyntaxColor(SRC_SYN_COMMENT)))
    {
        bModified = TRUE;
        pSrcVwCfg->SetSyntaxColor(SRC_SYN_COMMENT, aCommentLB.GetSelectEntryColor());
    }
    if(aKeywdLB.GetSelectEntry().Len() &&
        !aKeywdLB.GetSelectEntryColor().IsRGBEqual(pSrcVwCfg->GetSyntaxColor(SRC_SYN_KEYWRD)))
    {
        bModified = TRUE;
        pSrcVwCfg->SetSyntaxColor(SRC_SYN_KEYWRD, aKeywdLB.GetSelectEntryColor());
    }
    if(aUnknownLB.GetSelectEntry().Len() &&
        !aUnknownLB.GetSelectEntryColor().IsRGBEqual(pSrcVwCfg->GetSyntaxColor(SRC_SYN_UNKNOWN)))
    {
        bModified = TRUE;
        pSrcVwCfg->SetSyntaxColor(SRC_SYN_UNKNOWN, aUnknownLB.GetSelectEntryColor());
    }
    if(bModified)
    {
        TypeId aType(TYPE(SwSrcView));
        SfxViewShell* pShell = SfxViewShell::GetFirst(&aType);
        while( pShell )
        {
            ((SwSrcView*)pShell)->GetEditWin().SyntaxColorsChanged();
            pShell = SfxViewShell::GetNext(*pShell, &aType);
        }

    }
    return FALSE;
}

/*-----------------19.04.97 13:23-------------------

--------------------------------------------------*/
void SwSourceViewOptionsTabPage::Reset( const SfxItemSet& rSet )
{
    SwSrcViewConfig* pSrcVwCfg = SW_MOD()->GetSourceViewConfig();

    aSGMLLB     .SelectEntry( pSrcVwCfg->GetSyntaxColor(SRC_SYN_SGML) );
    aCommentLB  .SelectEntry( pSrcVwCfg->GetSyntaxColor(SRC_SYN_COMMENT) );
    aKeywdLB    .SelectEntry( pSrcVwCfg->GetSyntaxColor(SRC_SYN_KEYWRD) );
    aUnknownLB  .SelectEntry( pSrcVwCfg->GetSyntaxColor(SRC_SYN_UNKNOWN) );
}

/*  */

/*-----------------31.10.97 17:55-------------------
 TabPage fuer ShadowCrsr
--------------------------------------------------*/

SwShdwCrsrOptionsTabPage::SwShdwCrsrOptionsTabPage( Window* pParent,
                                                    const SfxItemSet& rSet )
    : SfxTabPage(pParent, SW_RES(TP_OPTSHDWCRSR), rSet),
    aFlagGB( this, SW_RES( GB_SHDWCRSFLAG )),
    aOnOffCB( this, SW_RES( CB_SHDWCRSONOFF )),
    aFillModeFT( this, SW_RES( FT_SHDWCRSFILLMODE )),
    aFillMarginRB( this, SW_RES( RB_SHDWCRSFILLMARGIN )),
    aFillIndentRB( this, SW_RES( RB_SHDWCRSFILLINDENT )),
    aFillTabRB( this, SW_RES( RB_SHDWCRSFILLTAB )),
    aFillSpaceRB( this, SW_RES( RB_SHDWCRSFILLSPACE )),
//  aColorGB( this, SW_RES( GB_SHDWCRSCOLOR )),
    aColorFT( this, SW_RES( FT_SHDWCRSCOLOR )),
    aColorLB( this, SW_RES( LB_SHDWCRSCOLOR )),
    aCrsrOptGB   ( this, SW_RES( GB_CRSR_OPT)),
    aCrsrInProtCB( this, SW_RES( CB_ALLOW_IN_PROT ))
{
    FreeResource();

    const SfxPoolItem* pItem = 0;
    SwShadowCursorItem aOpt;

    if( SFX_ITEM_SET == rSet.GetItemState( FN_PARAM_SHADOWCURSOR, FALSE, &pItem ))
        aOpt = *(SwShadowCursorItem*)pItem;

    aOnOffCB.Check( aOpt.IsOn() );

    BYTE eMode = aOpt.GetMode();
    aFillIndentRB.Check( FILL_INDENT == eMode );
    aFillMarginRB.Check( FILL_MARGIN == eMode );
    aFillTabRB.Check( FILL_TAB == eMode );
    aFillSpaceRB.Check( FILL_SPACE == eMode );

    const Color& rShdwCol = aOpt.GetColor();

    String sColor;
    aColorLB.SetUpdateMode(FALSE);

    XColorTable* pColorTbl = OFF_APP()->GetStdColorTable();
    for( USHORT i = 0; i < pColorTbl->Count(); ++i )
    {
        XColorEntry* pEntry = pColorTbl->Get( i );
        Color aColor = pEntry->GetColor();
        String sName = pEntry->GetName();
        if( aColor == rShdwCol )
            sColor = sName;
        aColorLB.InsertEntry( aColor, sName );
    }
    aColorLB.SetUpdateMode( TRUE );
    aColorLB.SelectEntry( sColor );
}

SwShdwCrsrOptionsTabPage::~SwShdwCrsrOptionsTabPage()
{
}


SfxTabPage* SwShdwCrsrOptionsTabPage::Create( Window* pParent, const SfxItemSet& rSet )
{
    return new SwShdwCrsrOptionsTabPage( pParent, rSet );
}

BOOL SwShdwCrsrOptionsTabPage::FillItemSet( SfxItemSet& rSet )
{
    SwShadowCursorItem aOpt;
    aOpt.SetOn( aOnOffCB.IsChecked() );

    BYTE eMode;
    if( aFillIndentRB.IsChecked() )
        eMode= FILL_INDENT;
    else if( aFillMarginRB.IsChecked() )
        eMode = FILL_MARGIN;
    else if( aFillTabRB.IsChecked() )
        eMode = FILL_TAB;
    else
        eMode = FILL_SPACE;
    aOpt.SetMode( eMode );
    aOpt.SetColor( aColorLB.GetSelectEntryColor() );

    BOOL bRet = FALSE;
    const SfxPoolItem* pItem = 0;
    if( SFX_ITEM_SET != rSet.GetItemState( FN_PARAM_SHADOWCURSOR, FALSE, &pItem )
        ||  ((SwShadowCursorItem&)*pItem) != aOpt )
    {
        rSet.Put( aOpt );
        bRet = TRUE;
    }

    if( aCrsrInProtCB.IsChecked() != aCrsrInProtCB.GetSavedValue())
    {
        rSet.Put(SfxBoolItem(FN_PARAM_CRSR_IN_PROTECTED, aCrsrInProtCB.IsChecked()));
        bRet |= TRUE;
    }

    return bRet;
}

void SwShdwCrsrOptionsTabPage::Reset( const SfxItemSet& rSet )
{
    const SfxPoolItem* pItem = 0;
    SwShadowCursorItem aOpt;

    if( SFX_ITEM_SET == rSet.GetItemState( FN_PARAM_SHADOWCURSOR, FALSE, &pItem ))
        aOpt = *(SwShadowCursorItem*)pItem;

    aOnOffCB.Check( aOpt.IsOn() );

    BYTE eMode = aOpt.GetMode();
    aFillIndentRB.Check( FILL_INDENT == eMode );
    aFillMarginRB.Check( FILL_MARGIN == eMode );
    aFillTabRB.Check( FILL_TAB == eMode );
    aFillSpaceRB.Check( FILL_SPACE == eMode );

    aColorLB.SelectEntry( aOpt.GetColor() );

    if( SFX_ITEM_SET == rSet.GetItemState( FN_PARAM_CRSR_IN_PROTECTED, FALSE, &pItem ))
        aCrsrInProtCB.Check(((const SfxBoolItem*)pItem)->GetValue());
    aCrsrInProtCB.SaveValue();
}

/*-----------------31.10.97 17:55-------------------
 TabPage fuer Redlining
--------------------------------------------------*/

struct CharAttr
{
    USHORT nItemId;
    USHORT nAttr;
};

// Editieren entspricht Einfuegen-Attributen
static CharAttr __FAR_DATA aInsertAttr[] =
{
    SID_ATTR_CHAR_CASEMAP,      SVX_CASEMAP_NOT_MAPPED,
    SID_ATTR_CHAR_WEIGHT,       WEIGHT_BOLD,
    SID_ATTR_CHAR_POSTURE,      ITALIC_NORMAL,
    SID_ATTR_CHAR_UNDERLINE,    UNDERLINE_SINGLE,
    SID_ATTR_CHAR_UNDERLINE,    UNDERLINE_DOUBLE,
    SID_ATTR_CHAR_CASEMAP,      SVX_CASEMAP_VERSALIEN,
    SID_ATTR_CHAR_CASEMAP,      SVX_CASEMAP_GEMEINE,
    SID_ATTR_CHAR_CASEMAP,      SVX_CASEMAP_KAPITAELCHEN,
    SID_ATTR_CHAR_CASEMAP,      SVX_CASEMAP_TITEL,
    SID_ATTR_BRUSH,             0,
};

static CharAttr __FAR_DATA aDeletedAttr[] =
{
    SID_ATTR_CHAR_CASEMAP,      SVX_CASEMAP_NOT_MAPPED,
    SID_ATTR_CHAR_WEIGHT,       WEIGHT_BOLD,
    SID_ATTR_CHAR_POSTURE,      ITALIC_NORMAL,
    SID_ATTR_CHAR_STRIKEOUT,    STRIKEOUT_SINGLE,
    SID_ATTR_CHAR_CASEMAP,      SVX_CASEMAP_VERSALIEN,
    SID_ATTR_CHAR_CASEMAP,      SVX_CASEMAP_GEMEINE,
    SID_ATTR_CHAR_CASEMAP,      SVX_CASEMAP_KAPITAELCHEN,
    SID_ATTR_CHAR_CASEMAP,      SVX_CASEMAP_TITEL,
    SID_ATTR_BRUSH,             0,
};

static CharAttr __FAR_DATA aChangedAttr[] =
{
    SID_ATTR_CHAR_CASEMAP,      SVX_CASEMAP_NOT_MAPPED,
    SID_ATTR_CHAR_WEIGHT,       WEIGHT_BOLD,
    SID_ATTR_CHAR_POSTURE,      ITALIC_NORMAL,
    SID_ATTR_CHAR_UNDERLINE,    UNDERLINE_SINGLE,
    SID_ATTR_CHAR_UNDERLINE,    UNDERLINE_DOUBLE,
    SID_ATTR_CHAR_CASEMAP,      SVX_CASEMAP_VERSALIEN,
    SID_ATTR_CHAR_CASEMAP,      SVX_CASEMAP_GEMEINE,
    SID_ATTR_CHAR_CASEMAP,      SVX_CASEMAP_KAPITAELCHEN,
    SID_ATTR_CHAR_CASEMAP,      SVX_CASEMAP_TITEL,
    SID_ATTR_BRUSH,             0,
};

/*-----------------------------------------------------------------------
    Beschreibung: Markierungsvorschau
 -----------------------------------------------------------------------*/

SwMarkPreview::SwMarkPreview( Window *pParent, const ResId& rResID ) :

    Window(pParent, rResID),

    aTransColor (COL_TRANSPARENT),
    aMarkColor  (COL_LIGHTRED),

    nMarkPos(0)

{
    SetMapMode(MAP_PIXEL);

    const Size aSz(GetOutputSizePixel());

    // Seite
    aPage.SetSize(Size(aSz.Width() - 3, aSz.Height() - 3));

    ULONG nOutWPix = aPage.GetWidth();
    ULONG nOutHPix = aPage.GetHeight();

    // PrintArea
    ULONG nLBorder = 8;
    ULONG nRBorder = 8;
    ULONG nTBorder = 4;
    ULONG nBBorder = 4;

    aLeftPagePrtArea = Rectangle(Point(nLBorder, nTBorder), Point((nOutWPix - 1) - nRBorder, (nOutHPix - 1) - nBBorder));
    USHORT nWidth = (USHORT)aLeftPagePrtArea.GetWidth();
    USHORT nKorr = (nWidth & 1) != 0 ? 0 : 1;
    aLeftPagePrtArea.SetSize(Size(nWidth / 2 - (nLBorder + nRBorder) / 2 + nKorr, aLeftPagePrtArea.GetHeight()));

    aRightPagePrtArea = aLeftPagePrtArea;
    aRightPagePrtArea.Move(aLeftPagePrtArea.GetWidth() + nLBorder + nRBorder + 1, 0);
}

/*-----------------------------------------------------------------------
    Beschreibung:
 -----------------------------------------------------------------------*/

SwMarkPreview::~SwMarkPreview()
{
}

/*-----------------------------------------------------------------------
    Beschreibung:
 -----------------------------------------------------------------------*/

void SwMarkPreview::Paint(const Rectangle &rRect)
{
    // Schatten zeichnen
    Rectangle aShadow(aPage);
    aShadow += Point(3, 3);
    DrawRect(aShadow, Color(COL_GRAY), aTransColor);

    // Seite zeichnen
    DrawRect(aPage, Color(COL_WHITE), Color(COL_BLACK));

    // Separator zeichnen
    Rectangle aPageSeparator(aPage);
    aPageSeparator.SetSize(Size(2, aPageSeparator.GetHeight()));
    aPageSeparator.Move(aPage.GetWidth() / 2 - 1, 0);
    DrawRect(aPageSeparator, Color(COL_BLACK), aTransColor);

    PaintPage(aLeftPagePrtArea);
    PaintPage(aRightPagePrtArea);

    Rectangle aLeftMark(Point(aPage.Left() + 2, aLeftPagePrtArea.Top() + 4), Size(aLeftPagePrtArea.Left() - 4, 2));
    Rectangle aRightMark(Point(aRightPagePrtArea.Right() + 2, aRightPagePrtArea.Bottom() - 6), Size(aLeftPagePrtArea.Left() - 4, 2));

    switch (nMarkPos)
    {
        case 1:     // Links
            aRightMark.SetPos(Point(aRightPagePrtArea.Left() - 2 - aRightMark.GetWidth(), aRightMark.Top()));
            break;

        case 2:     // Rechts
            aLeftMark.SetPos(Point(aLeftPagePrtArea.Right() + 2, aLeftMark.Top()));
            break;

        case 3:     // Aussen
            break;

        case 4:     // Innen
            aLeftMark.SetPos(Point(aLeftPagePrtArea.Right() + 2, aLeftMark.Top()));
            aRightMark.SetPos(Point(aRightPagePrtArea.Left() - 2 - aRightMark.GetWidth(), aRightMark.Top()));
            break;

        case 0:     // Keine
        default:
            return;
    }
    DrawRect(aLeftMark, aMarkColor, aTransColor);
    DrawRect(aRightMark, aMarkColor, aTransColor);
}

/*-----------------------------------------------------------------------
    Beschreibung:
 -----------------------------------------------------------------------*/

void SwMarkPreview::PaintPage(const Rectangle &rRect)
{
    // PrintArea zeichnen
    DrawRect(rRect, aTransColor, Color(COL_GRAY));

    // Testabsatz zeichnen
    ULONG nLTxtBorder = 4;
    ULONG nRTxtBorder = 4;
    ULONG nTTxtBorder = 4;

    Rectangle aTextLine = rRect;
    aTextLine.SetSize(Size(aTextLine.GetWidth(), 2));
    aTextLine.Left()    += nLTxtBorder;
    aTextLine.Right()   -= nRTxtBorder;
    aTextLine.Move(0, nTTxtBorder);

    USHORT nStep, nLines;
    const long nTxtLineHeight = aTextLine.GetHeight();

    nStep = aTextLine.GetHeight() + 2;
    nLines = (USHORT)(rRect.GetHeight() / (aTextLine.GetHeight() + 2)) - 1;

    // Text simulieren
    //
    for (USHORT i = 0; i < nLines; ++i)
    {
        if (i == (nLines - 1))
            aTextLine.SetSize(Size(aTextLine.GetWidth() / 2, aTextLine.GetHeight()));

        if (aPage.IsInside(aTextLine))
            DrawRect(aTextLine, Color(COL_GRAY), aTransColor);

        aTextLine.Move(0, nStep);
    }
    aTextLine.Move(0, -nStep);
}

/*-----------------------------------------------------------------------
    Beschreibung:
 -----------------------------------------------------------------------*/

void SwMarkPreview::DrawRect(const Rectangle &rRect, const Color &rFillColor, const Color &rLineColor)
{
    SetFillColor(rFillColor);
    SetLineColor(rLineColor);
    Window::DrawRect(rRect);
}

/*-----------------------------------------------------------------------
    Beschreibung:
 -----------------------------------------------------------------------*/

SwRedlineOptionsTabPage::SwRedlineOptionsTabPage( Window* pParent,
                                                    const SfxItemSet& rSet )
    : SfxTabPage(pParent, SW_RES(TP_REDLINE_OPT), rSet),

    aInsertRB           ( this, SW_RES( RB_INSERT )),
    aDeletedRB          ( this, SW_RES( RB_DELETED )),
    aChangedRB          ( this, SW_RES( RB_CHANGED )),

    aInsertFT           ( this, SW_RES( FT_TE_ATTRIB )),
    aInsertLB           ( this, SW_RES( LB_TE_ATTRIB )),
    aDeletedLB          ( this, SW_RES( LB_TL_ATTRIB )),
    aChangedLB          ( this, SW_RES( LB_TC_ATTRIB )),

    aInsertColorFT      ( this, SW_RES( FT_TE_COL )),
    aInsertColorLB      ( this, SW_RES( LB_TE_COL )),
    aDeletedColorLB     ( this, SW_RES( LB_TL_COL )),
    aChangedColorLB     ( this, SW_RES( LB_TC_COL )),

    aAttribPreviewWN    ( this, SW_RES( WIN_TE )),
    aInsertGB           ( this, SW_RES( GB_TE )),

    aMarkPosFT          ( this, SW_RES( FT_MARKPOS )),
    aMarkPosLB          ( this, SW_RES( LB_MARKPOS )),
    aMarkColorFT        ( this, SW_RES( FT_LC_COL )),
    aMarkColorLB        ( this, SW_RES( LB_LC_COL )),
    aMarkPreviewWN      ( this, SW_RES( WIN_MARK )),
    aChangedGB          ( this, SW_RES( GB_LC )),
    sAuthor             ( SW_RES( STR_AUTHOR )),
    sNone               ( SW_RES( STR_NOTHING ))

{
    FreeResource();

    Link aLk = LINK(this, SwRedlineOptionsTabPage, RadioHdl);
    aInsertRB.SetClickHdl( aLk );
    aDeletedRB.SetClickHdl( aLk );
    aChangedRB.SetClickHdl( aLk );

    aLk = LINK(this, SwRedlineOptionsTabPage, AttribHdl);
    aInsertLB.SetSelectHdl( aLk );
    aDeletedLB.SetSelectHdl( aLk );
    aChangedLB.SetSelectHdl( aLk );

    aLk = LINK(this, SwRedlineOptionsTabPage, ColorHdl);
    aInsertColorLB.SetSelectHdl( aLk );
    aDeletedColorLB.SetSelectHdl( aLk );
    aChangedColorLB.SetSelectHdl( aLk );

    aLk = LINK(this, SwRedlineOptionsTabPage, ChangedMaskPrevHdl);
    aMarkPosLB.SetSelectHdl( aLk );
    aMarkColorLB.SetSelectHdl( aLk );
}

/*-----------------------------------------------------------------------
    Beschreibung:
 -----------------------------------------------------------------------*/

SwRedlineOptionsTabPage::~SwRedlineOptionsTabPage()
{
}

/*-----------------------------------------------------------------------
    Beschreibung:
 -----------------------------------------------------------------------*/

SfxTabPage* SwRedlineOptionsTabPage::Create( Window* pParent, const SfxItemSet& rSet )
{
    return new SwRedlineOptionsTabPage( pParent, rSet );
}

/*-----------------------------------------------------------------------
    Beschreibung:
 -----------------------------------------------------------------------*/

BOOL SwRedlineOptionsTabPage::FillItemSet( SfxItemSet& rSet )
{
    CharAttr *pAttr;
    SwModuleOptions *pOpt = SW_MOD()->GetModuleConfig();

    AuthorCharAttr aInsertAttr;
    AuthorCharAttr aDeletedAttr;
    AuthorCharAttr aChangedAttr;

    AuthorCharAttr aOldInsertAttr(pOpt->GetInsertAuthorAttr());
    AuthorCharAttr aOldDeletedAttr(pOpt->GetDeletedAuthorAttr());
    AuthorCharAttr aOldChangedAttr(pOpt->GetFormatAuthorAttr());

    ULONG nOldMarkColor = pOpt->GetMarkAlignColor().GetColor();
    USHORT nOldMarkMode = pOpt->GetMarkAlignMode();

    USHORT nPos = aInsertLB.GetSelectEntryPos();
    if (nPos != LISTBOX_ENTRY_NOTFOUND)
    {
        pAttr = (CharAttr *)aInsertLB.GetEntryData(nPos);
        aInsertAttr.nItemId = pAttr->nItemId;
        aInsertAttr.nAttr = pAttr->nAttr;

        nPos = aInsertColorLB.GetSelectEntryPos();

        switch (nPos)
        {
            case 0:
                aInsertAttr.nColor = COL_NONE;
                break;
            case 1:
            case LISTBOX_ENTRY_NOTFOUND:
                aInsertAttr.nColor = COL_TRANSPARENT;
                break;
            default:
                aInsertAttr.nColor = aInsertColorLB.GetEntryColor(nPos).GetColor();
                break;
        }

        pOpt->SetInsertAuthorAttr(aInsertAttr);
    }

    nPos = aDeletedLB.GetSelectEntryPos();
    if (nPos != LISTBOX_ENTRY_NOTFOUND)
    {
        pAttr = (CharAttr *)aDeletedLB.GetEntryData(nPos);
        aDeletedAttr.nItemId = pAttr->nItemId;
        aDeletedAttr.nAttr = pAttr->nAttr;

        nPos = aDeletedColorLB.GetSelectEntryPos();

        switch (nPos)
        {
            case 0:
                aDeletedAttr.nColor = COL_NONE;
                break;
            case 1:
            case LISTBOX_ENTRY_NOTFOUND:
                aDeletedAttr.nColor = COL_TRANSPARENT;
                break;
            default:
                aDeletedAttr.nColor = aDeletedColorLB.GetEntryColor(nPos).GetColor();
                break;
        }

        pOpt->SetDeletedAuthorAttr(aDeletedAttr);
    }

    nPos = aChangedLB.GetSelectEntryPos();
    if (nPos != LISTBOX_ENTRY_NOTFOUND)
    {
        pAttr = (CharAttr *)aChangedLB.GetEntryData(nPos);
        aChangedAttr.nItemId = pAttr->nItemId;
        aChangedAttr.nAttr = pAttr->nAttr;

        nPos = aChangedColorLB.GetSelectEntryPos();

        switch (nPos)
        {
            case 0:
                aChangedAttr.nColor = COL_NONE;
                break;
            case 1:
            case LISTBOX_ENTRY_NOTFOUND:
                aChangedAttr.nColor = COL_TRANSPARENT;
                break;
            default:
                aChangedAttr.nColor = aChangedColorLB.GetEntryColor(nPos).GetColor();
                break;
        }

        pOpt->SetFormatAuthorAttr(aChangedAttr);
    }

    nPos = 0;
    switch (aMarkPosLB.GetSelectEntryPos())
    {
        case 0: nPos = HORI_NONE;       break;
        case 1: nPos = HORI_LEFT;       break;
        case 2: nPos = HORI_RIGHT;      break;
        case 3: nPos = HORI_OUTSIDE;    break;
        case 4: nPos = HORI_INSIDE;     break;
    }
    pOpt->SetMarkAlignMode(nPos);

    pOpt->SetMarkAlignColor(aMarkColorLB.GetSelectEntryColor());

    if (!(aInsertAttr == aOldInsertAttr) ||
        !(aDeletedAttr == aOldDeletedAttr) ||
        !(aChangedAttr == aOldChangedAttr) ||
       nOldMarkColor != pOpt->GetMarkAlignColor().GetColor() ||
       nOldMarkMode != pOpt->GetMarkAlignMode())
    {
        // Alle Dokumente aktualisieren
        TypeId aType(TYPE(SwDocShell));
        SwDocShell* pDocShell = (SwDocShell*)SfxObjectShell::GetFirst(&aType);

        while( pDocShell )
        {
            pDocShell->GetWrtShell()->UpdateRedlineAttr();
            pDocShell = (SwDocShell*)SfxObjectShell::GetNext(*pDocShell, &aType);
        }
    }

    return FALSE;
}

/*-----------------------------------------------------------------------
    Beschreibung:
 -----------------------------------------------------------------------*/

void SwRedlineOptionsTabPage::Reset( const SfxItemSet& rSet )
{
    const SwModuleOptions *pOpt = SW_MOD()->GetModuleConfig();

    const AuthorCharAttr &rInsertAttr = pOpt->GetInsertAuthorAttr();
    const AuthorCharAttr &rDeletedAttr = pOpt->GetDeletedAuthorAttr();
    const AuthorCharAttr &rChangedAttr = pOpt->GetFormatAuthorAttr();

    // Preview initialisieren
    InitFontStyle(aAttribPreviewWN);

    // Farblistboxen initialisieren
    String sColor;
    aInsertColorLB.SetUpdateMode(FALSE);
    aDeletedColorLB.SetUpdateMode(FALSE);
    aChangedColorLB.SetUpdateMode(FALSE);
    aMarkColorLB.SetUpdateMode(FALSE);

    aInsertColorLB.InsertEntry(sNone);
    aDeletedColorLB.InsertEntry(sNone);
    aChangedColorLB.InsertEntry(sNone);

    aInsertColorLB.InsertEntry(sAuthor);
    aDeletedColorLB.InsertEntry(sAuthor);
    aChangedColorLB.InsertEntry(sAuthor);

    XColorTable* pColorTbl = OFF_APP()->GetStdColorTable();
    for( USHORT i = 0; i < pColorTbl->Count(); ++i )
    {
        XColorEntry* pEntry = pColorTbl->Get( i );
        Color aColor = pEntry->GetColor();
        String sName = pEntry->GetName();

        aInsertColorLB.InsertEntry( aColor, sName );
        aDeletedColorLB.InsertEntry( aColor, sName );
        aChangedColorLB.InsertEntry( aColor, sName );
        aMarkColorLB.InsertEntry( aColor, sName );
    }
    aInsertColorLB.SetUpdateMode( TRUE );
    aDeletedColorLB.SetUpdateMode( TRUE );
    aChangedColorLB.SetUpdateMode( TRUE );
    aMarkColorLB.SetUpdateMode( TRUE );

    ULONG nColor = rInsertAttr.nColor;

    switch (nColor)
    {
        case COL_TRANSPARENT:
            aInsertColorLB.SelectEntryPos(1);
            break;
        case COL_NONE:
            aInsertColorLB.SelectEntryPos(0);
            break;
        default:
            aInsertColorLB.SelectEntry(Color(nColor));
    }

    nColor = rDeletedAttr.nColor;

    switch (nColor)
    {
        case COL_TRANSPARENT:
            aDeletedColorLB.SelectEntryPos(1);
            break;
        case COL_NONE:
            aDeletedColorLB.SelectEntryPos(0);
            break;
        default:
            aDeletedColorLB.SelectEntry(Color(nColor));
    }

    nColor = rChangedAttr.nColor;

    switch (nColor)
    {
        case COL_TRANSPARENT:
            aChangedColorLB.SelectEntryPos(1);
            break;
        case COL_NONE:
            aChangedColorLB.SelectEntryPos(0);
            break;
        default:
            aChangedColorLB.SelectEntry(Color(nColor));
    }

    aMarkColorLB.SelectEntry(pOpt->GetMarkAlignColor());

    // Attributlistboxen initialisieren
    USHORT nNum = sizeof(aInsertAttr) / sizeof(CharAttr);

    for (i = 0; i < nNum; i++)
    {
        aInsertLB.SetEntryData(i, &aInsertAttr[i]);
        if (aInsertAttr[i].nItemId == rInsertAttr.nItemId &&
            aInsertAttr[i].nAttr == rInsertAttr.nAttr)
            aInsertLB.SelectEntryPos(i);
    }

    nNum = sizeof(aDeletedAttr) / sizeof(CharAttr);
    for (i = 0; i < nNum; i++)
    {
        aDeletedLB.SetEntryData(i, &aDeletedAttr[i]);
        if (aDeletedAttr[i].nItemId == rDeletedAttr.nItemId &&
            aDeletedAttr[i].nAttr == rDeletedAttr.nAttr)
            aDeletedLB.SelectEntryPos(i);
    }

    nNum = sizeof(aChangedAttr) / sizeof(CharAttr);
    for (i = 0; i < nNum; i++)
    {
        aChangedLB.SetEntryData(i, &aChangedAttr[i]);
        if (aChangedAttr[i].nItemId == rChangedAttr.nItemId &&
            aChangedAttr[i].nAttr == rChangedAttr.nAttr)
            aChangedLB.SelectEntryPos(i);
    }

    USHORT nPos = 0;
    switch (pOpt->GetMarkAlignMode())
    {
        case HORI_NONE:     nPos = 0;   break;
        case HORI_LEFT:     nPos = 1;   break;
        case HORI_RIGHT:    nPos = 2;   break;
        case HORI_OUTSIDE:  nPos = 3;   break;
        case HORI_INSIDE:   nPos = 4;   break;
    }
    aMarkPosLB.SelectEntryPos(nPos);

    // Einstellungen in Preview anzeigen
    AttribHdl(&aInsertLB);
    ColorHdl(&aInsertColorLB);

    ChangedMaskPrevHdl();
}

/*-----------------------------------------------------------------------
    Beschreibung:
 -----------------------------------------------------------------------*/

IMPL_LINK( SwRedlineOptionsTabPage, AttribHdl, ListBox *, pLB )
{
    SvxFontPrevWindow *pPrev = &aAttribPreviewWN;
    ColorListBox *pColorLB;

    if (pLB == &aInsertLB)
        pColorLB = &aInsertColorLB;
    else if (pLB == &aDeletedLB)
        pColorLB = &aDeletedColorLB;
    else
        pColorLB = &aChangedColorLB;

    SvxFont& rFont = pPrev->GetFont();
    rFont.SetWeight(WEIGHT_NORMAL);
    rFont.SetItalic(ITALIC_NONE);
    rFont.SetUnderline(UNDERLINE_NONE);
    rFont.SetStrikeout(STRIKEOUT_NONE);
    rFont.SetCaseMap(SVX_CASEMAP_NOT_MAPPED);
    pPrev->SetColor(Color(COL_WHITE));

    USHORT nPos = pColorLB->GetSelectEntryPos();

    switch (nPos)
    {
        case 0:
            rFont.SetColor(Color(COL_BLACK));
            break;
        case 1:
        case LISTBOX_ENTRY_NOTFOUND:
            rFont.SetColor(Color(COL_RED));
            break;
        default:
            rFont.SetColor(pColorLB->GetEntryColor(nPos));
            break;
    }

    nPos = pLB->GetSelectEntryPos();
    if (nPos == LISTBOX_ENTRY_NOTFOUND)
        nPos = 0;

    CharAttr *pAttr = (CharAttr *)pLB->GetEntryData(nPos);

    switch (pAttr->nItemId)
    {
        case SID_ATTR_CHAR_WEIGHT:
            rFont.SetWeight((FontWeight)pAttr->nAttr);
            break;

        case SID_ATTR_CHAR_POSTURE:
            rFont.SetItalic((FontItalic)pAttr->nAttr);
            break;

        case SID_ATTR_CHAR_UNDERLINE:
            rFont.SetUnderline((FontUnderline)pAttr->nAttr);
            break;

        case SID_ATTR_CHAR_STRIKEOUT:
            rFont.SetStrikeout((FontStrikeout)pAttr->nAttr);
            break;

        case SID_ATTR_CHAR_CASEMAP:
            rFont.SetCaseMap((SvxCaseMap)pAttr->nAttr);
            break;

        case SID_ATTR_BRUSH:
        {
            nPos = pColorLB->GetSelectEntryPos();
            if (nPos)
            {
                pPrev->SetColor(pColorLB->GetSelectEntryColor());
            }
            else
            {
                pPrev->SetColor(Color(COL_LIGHTGRAY));
            }
            rFont.SetColor(Color(COL_BLACK));
        }
        break;
    }

    pPrev->Invalidate();

    return 0;
}

/*-----------------------------------------------------------------------
    Beschreibung:
 -----------------------------------------------------------------------*/

IMPL_LINK( SwRedlineOptionsTabPage, ColorHdl, ColorListBox *, pColorLB )
{
    SvxFontPrevWindow *pPrev = &aAttribPreviewWN;
    ListBox *pLB;

    if (pColorLB == &aInsertColorLB)
        pLB = &aInsertLB;
    else if (pColorLB == &aDeletedColorLB)
        pLB = &aDeletedLB;
    else
        pLB = &aChangedLB;

    SvxFont& rFont = pPrev->GetFont();
    USHORT nPos = pLB->GetSelectEntryPos();
    if (nPos == LISTBOX_ENTRY_NOTFOUND)
        nPos = 0;

    CharAttr *pAttr = (CharAttr *)pLB->GetEntryData(nPos);

    if (pAttr->nItemId == SID_ATTR_BRUSH)
    {
        rFont.SetColor(Color(COL_BLACK));
        nPos = pColorLB->GetSelectEntryPos();
        if (nPos && nPos != LISTBOX_ENTRY_NOTFOUND)
        {
            pPrev->SetColor(pColorLB->GetSelectEntryColor());
        }
        else
        {
            pPrev->SetColor(Color(COL_LIGHTGRAY));
        }
    }
    else
    {
        nPos = pColorLB->GetSelectEntryPos();

        switch (nPos)
        {
            case 0:
                rFont.SetColor(Color(COL_BLACK));
                break;
            case 1:
            case LISTBOX_ENTRY_NOTFOUND:
                rFont.SetColor(Color(COL_RED));
                break;
            default:
                rFont.SetColor(pColorLB->GetEntryColor(nPos));
                break;
        }
    }

    pPrev->Invalidate();

    return 0;
}

/*-----------------------------------------------------------------------
    Beschreibung:
 -----------------------------------------------------------------------*/

IMPL_LINK( SwRedlineOptionsTabPage, ChangedMaskPrevHdl, ListBox *, pLB )
{
    aMarkPreviewWN.SetMarkPos(aMarkPosLB.GetSelectEntryPos());
    aMarkPreviewWN.SetColor(aMarkColorLB.GetSelectEntryColor().GetColor());

    aMarkPreviewWN.Invalidate();

    return 0;
}

/*-----------------------------------------------------------------------
    Beschreibung:
 -----------------------------------------------------------------------*/

IMPL_LINK( SwRedlineOptionsTabPage, RadioHdl, RadioButton *, pRB )
{
    BOOL bInsert = FALSE, bDeleted = FALSE, bChanged = FALSE;

    if (pRB == &aInsertRB)
    {
        AttribHdl(&aInsertLB);
        bInsert = TRUE;
    }
    else if (pRB == &aDeletedRB)
    {
        AttribHdl(&aDeletedLB);
        bDeleted = TRUE;
    }
    else if (pRB == &aChangedRB)
    {
        AttribHdl(&aChangedLB);
        bChanged = TRUE;
    }

    aInsertLB.Show(bInsert);
    aInsertColorLB.Show(bInsert);
    aDeletedLB.Show(bDeleted);
    aDeletedColorLB.Show(bDeleted);
    aChangedLB.Show(bChanged);
    aChangedColorLB.Show(bChanged);

    return 0;
}

/*-----------------------------------------------------------------------
    Beschreibung:
 -----------------------------------------------------------------------*/

void SwRedlineOptionsTabPage::InitFontStyle(SvxFontPrevWindow& rExampleWin)
{
    SvxFont& rFont = rExampleWin.GetFont();

    Font aFont;
    aFont.SetCharSet( gsl_getSystemTextEncoding() );
    aFont.SetSize( Size( 0, 12 ) );
    aFont.SetPitch( PITCH_VARIABLE );

    aFont.SetName( C2S("Times") );
    aFont.SetFamily( FAMILY_ROMAN );

//  Font aFont = System::GetStandardFont(STDFONT_ROMAN);
    aFont.SetFillColor(Color(COL_WHITE));
    aFont.SetWeight(WEIGHT_NORMAL);

    rFont = aFont;
    const Size aLogSize( rExampleWin.GetOutputSize() );
    rFont.SetSize(Size(0, aLogSize.Height() * 2 / 3));
    rExampleWin.SetFont(rFont);
    rExampleWin.UseResourceText();

    Color aWhiteColor = COL_WHITE;
    Wallpaper aWall(aWhiteColor);
//  Wallpaper aWall(Color( COL_WHITE ));
    rExampleWin.SetBackground(aWall);
    rExampleWin.Invalidate();
}


#ifndef PRODUCT
/*******************************************************
 ******************************************************/
/*----------------- OS 11.01.95  -----------------------
 TabPage Testeinstellungen
-------------------------------------------------------*/

void lcl_SetPosSize(Window& rWin, Point aPos, Size aSize)
{
    aPos = rWin.LogicToPixel(aPos, MAP_APPFONT);
    aSize = rWin.OutputDevice::LogicToPixel(aSize, MAP_APPFONT);
    rWin.SetPosSizePixel(aPos, aSize);
}

SwTestTabPage::SwTestTabPage( Window* pParent,
                                      const SfxItemSet& rCoreSet) :
    SfxTabPage( pParent, WB_HIDE, rCoreSet),
    aTestGBox       ( this, WB_GROUP ),
    aTest1CBox      ( this, 0 ),
    aTest2CBox      ( this, 0 ),
    aTest3CBox      ( this, 0 ),
    aTest4CBox      ( this, 0 ),
    aTest5CBox      ( this, 0 ),
    aTest6CBox      ( this, 0 ),
    aTest7CBox      ( this, 0 ),
    aTest8CBox      ( this, 0 ),
    aTest9CBox      ( this, 0 ),
    aTest10CBox     ( this, 0 ),
    bAttrModified( FALSE )
{
    lcl_SetPosSize(*this,       Point(0,0), Size(260 , 135));
    lcl_SetPosSize(aTestGBox,   Point(6,2), Size(209,126));
    lcl_SetPosSize(aTest1CBox  ,    Point(12 , 14), Size(74 , 10));
    lcl_SetPosSize(aTest2CBox  ,    Point(12 , 27), Size(74 , 10));
    lcl_SetPosSize(aTest3CBox  ,    Point(12 , 40), Size(74 , 10));
    lcl_SetPosSize(aTest4CBox  ,    Point(12 , 53), Size(74 , 10));
    lcl_SetPosSize(aTest5CBox  ,    Point(12 , 66), Size(74 , 10));
    lcl_SetPosSize(aTest6CBox  ,    Point(116, 14), Size(74 , 10));
    lcl_SetPosSize(aTest7CBox  ,    Point(116, 27), Size(74 , 10));
    lcl_SetPosSize(aTest8CBox  ,    Point(116, 40), Size(74 , 10));
    lcl_SetPosSize(aTest9CBox  ,    Point(116, 53), Size(74 , 10));
    lcl_SetPosSize(aTest10CBox  ,   Point(116, 66), Size(74 , 10));

    aTestGBox.SetText( String(ByteString("Einstellungen nur für Testzwecke" ), RTL_TEXTENCODING_MS_1252));
    aTest1CBox .SetText( C2S("Layout not loading"));
    aTest2CBox .SetText( C2S("dynamic"));
    aTest3CBox .SetText( C2S("No calm"               ));
    aTest4CBox .SetText( C2S("WYSIWYG debug"         ));
    aTest5CBox .SetText( C2S("No idle format"        ));
    aTest6CBox .SetText( C2S("No screen adj"         ));
    aTest7CBox .SetText( C2S("win format"            ));
    aTest8CBox .SetText( C2S("No Scroll"             ));
    aTest9CBox .SetText( C2S("DrawingLayerNotLoading"));
    aTest10CBox.SetText( C2S("AutoFormat by Input"   ));
    aTestGBox.Show();
    aTest1CBox .Show();
    aTest2CBox .Show();
    aTest3CBox .Show();
    aTest4CBox .Show();
    aTest5CBox .Show();
    aTest6CBox .Show();
    aTest7CBox .Show();
    aTest8CBox .Show();
    aTest9CBox .Show();
    aTest10CBox.Show();
    Init();

}


//------------------------------------------------------------------------


SfxTabPage* SwTestTabPage::Create( Window* pParent,
                                       const SfxItemSet& rAttrSet )
{
    return ( new SwTestTabPage( pParent, rAttrSet ) );
}
//------------------------------------------------------------------------


BOOL    SwTestTabPage::FillItemSet( SfxItemSet& rCoreSet )
{

    if ( bAttrModified )
    {
        SwTestItem aTestItem(FN_PARAM_SWTEST);
            aTestItem.bTest1=aTest1CBox.IsChecked();
            aTestItem.bTest2=aTest2CBox.IsChecked();
            aTestItem.bTest3=aTest3CBox.IsChecked();
            aTestItem.bTest4=aTest4CBox.IsChecked();
            aTestItem.bTest5=aTest5CBox.IsChecked();
            aTestItem.bTest6=aTest6CBox.IsChecked();
            aTestItem.bTest7=aTest7CBox.IsChecked();
            aTestItem.bTest8=aTest8CBox.IsChecked();
            aTestItem.bTest9=aTest9CBox.IsChecked();
            aTestItem.bTest10=aTest10CBox.IsChecked();
        rCoreSet.Put(aTestItem);
    }
    return bAttrModified;
}
//------------------------------------------------------------------------


void SwTestTabPage::Reset( const SfxItemSet& )
{
    const SfxItemSet& rSet = GetItemSet();
    const SwTestItem* pTestAttr = 0;

    if( SFX_ITEM_SET == rSet.GetItemState( FN_PARAM_SWTEST , FALSE,
                                    (const SfxPoolItem**)&pTestAttr ))
    {
        aTest1CBox.Check(pTestAttr->bTest1);
        aTest2CBox.Check(pTestAttr->bTest2);
        aTest3CBox.Check(pTestAttr->bTest3);
        aTest4CBox.Check(pTestAttr->bTest4);
        aTest5CBox.Check(pTestAttr->bTest5);
        aTest6CBox.Check(pTestAttr->bTest6);
        aTest7CBox.Check(pTestAttr->bTest7);
        aTest8CBox.Check(pTestAttr->bTest8);
        aTest9CBox.Check(pTestAttr->bTest9);
        aTest10CBox.Check(pTestAttr->bTest10);
    }
}
//------------------------------------------------------------------------


void SwTestTabPage::Init()
{
    // handler
    Link aLk = LINK( this, SwTestTabPage, AutoClickHdl );
    aTest1CBox.SetClickHdl( aLk );
    aTest2CBox.SetClickHdl( aLk );
    aTest3CBox.SetClickHdl( aLk );
    aTest4CBox.SetClickHdl( aLk );
    aTest5CBox.SetClickHdl( aLk );
    aTest6CBox.SetClickHdl( aLk );
    aTest7CBox.SetClickHdl( aLk );
    aTest8CBox.SetClickHdl( aLk );
    aTest9CBox.SetClickHdl( aLk );
    aTest10CBox.SetClickHdl( aLk );
}
//------------------------------------------------------------------------


IMPL_LINK_INLINE_START( SwTestTabPage, AutoClickHdl, CheckBox *, EMPTYARG )
{
    bAttrModified = TRUE;
    return 0;
}
IMPL_LINK_INLINE_END( SwTestTabPage, AutoClickHdl, CheckBox *, EMPTYARG )


#undef _INIT
#endif

 /*--------------------------------------------------------------------
      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/ui/config/optpage.cxx,v 1.1.1.1 2000-09-18 17:14:33 hr Exp $

    $Log: not supported by cvs2svn $
    Revision 1.123  2000/09/18 16:05:17  willem.vandorp
    OpenOffice header added.

    Revision 1.122  2000/09/08 15:11:56  os
    use configuration service

    Revision 1.121  2000/09/07 15:59:21  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.120  2000/09/07 08:26:30  os
    FaxName now in SwPrintOptions

    Revision 1.119  2000/06/27 07:59:40  obo
    #65293

    Revision 1.118  2000/06/13 13:22:43  os
    #75770# Doc only flag in standard font TabPage now persistent

    Revision 1.117  2000/05/23 13:16:41  os
    wrong CreateFromAscii corrected

    Revision 1.116  2000/04/11 08:02:23  os
    UNICODE

    Revision 1.115  2000/03/03 15:16:58  os
    StarView remainders removed

    Revision 1.114  2000/02/24 17:26:00  hr
    43447#: gcc

    Revision 1.113  2000/02/11 14:44:06  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.112  2000/01/06 14:46:58  os
    #71448# no differences between PRODUCT and NONPRODUCT resources

    Revision 1.111  1999/12/14 14:31:36  jp
    Bug #69595#: print can create single Jobs

    Revision 1.110  1999/10/21 17:47:33  jp
    have to change - SearchFile with SfxIniManager, dont use SwFinder for this

    Revision 1.109  1999/09/22 12:37:43  os
    big handles

    Revision 1.108  1999/06/09 11:20:58  OS
    index background


      Rev 1.107   09 Jun 1999 13:20:58   OS
   index background

      Rev 1.106   10 May 1999 13:11:14   OS
   #64976# Tabulatorwert fuer Metricumstellung merken

      Rev 1.105   29 Mar 1999 09:17:00   OS
   #63971# kein TabStop putten, wenn Control unsichtbar

      Rev 1.104   19 Mar 1999 15:32:04   OS
   #63750# Tabellenmode auch wieder an der akt. Tabelle setzen

      Rev 1.103   15 Feb 1999 09:22:02   OS
   #61890# StdFontTabTage legt Drucker jetzt bei Bedarf selbst an

      Rev 1.102   27 Jan 1999 10:04:00   OS
   #58677# Cursor in Readonly-Bereichen

      Rev 1.101   11 Jan 1999 13:36:18   OS
   #60139# Set/UseDefault jetzt richtig

      Rev 1.100   16 Nov 1998 10:38:50   OS
   #59455# Grundschrifte auch nach Standard im Doc richtig setzen

      Rev 1.99   08 Sep 1998 16:49:54   OS
   #56134# Metric fuer Text und HTML getrennt

      Rev 1.98   06 Jul 1998 13:03:54   MH
   add: SfxBoolItem header

      Rev 1.97   03 Jul 1998 18:15:34   OS
   ScrollBar-CheckBoxen per Item disablen

      Rev 1.96   24 Jun 1998 16:16:56   OM
   #51575# Printoptionen auch in Seitenvorschau beachten

      Rev 1.95   24 Mar 1998 17:46:50   OM
   Formataenderung anzeigen

      Rev 1.94   10 Mar 1998 16:11:34   OM
   Gegen rottige Config abgesichert

      Rev 1.93   05 Mar 1998 14:34:08   OM
   Redline-Attribute in Module-Cfg speichern

      Rev 1.92   24 Feb 1998 15:32:24   OM
   Redline-Darstellungsoptionen setzen

      Rev 1.91   23 Feb 1998 12:40:44   OM
   Redlining-Optionen

      Rev 1.90   20 Feb 1998 14:45:52   OM
   Markierungs-Preview

      Rev 1.89   19 Feb 1998 15:26:24   OM
   Redlining-Optionen

      Rev 1.88   18 Feb 1998 09:46:54   OM
   Redlining Optionen

      Rev 1.87   18 Feb 1998 09:10:22   OM
   Redlining-Optionen

      Rev 1.86   28 Nov 1997 15:22:22   MA
   includes

      Rev 1.85   24 Nov 1997 17:58:50   MA
   include

      Rev 1.84   14 Nov 1997 17:13:34   OS
   TRUE returnen, wenn TblChgMode veraendert wurde #45521#

      Rev 1.83   03 Nov 1997 16:12:18   JP
   neu: Optionen/-Page/Basic-Schnittst. fuer ShadowCursor

      Rev 1.82   09 Oct 1997 14:40:40   OS
   UpdateMode fuer ColorListBoxen abschalten #44451#

      Rev 1.81   09 Sep 1997 11:38:50   OS
   includes

      Rev 1.80   15 Aug 1997 11:45:22   OS
   chartar/frmatr/txtatr aufgeteilt

      Rev 1.79   09 Aug 1997 12:50:22   OS
   paraitem/frmitems/textitem aufgeteilt

      Rev 1.78   08 Aug 1997 17:37:30   OM
   Headerfile-Umstellung

      Rev 1.77   08 Jul 1997 14:07:30   OS
   ConfigItems von der App ans Module

      Rev 1.76   12 Jun 1997 10:11:04   MA
   Option fuer Smooth

      Rev 1.75   06 Jun 1997 12:44:10   MA
   chg: versteckte Absaetze ausblenden

      Rev 1.74   05 May 1997 14:15:18   OS
   Grundschrift fuer Standard als Pool-Default setzen

      Rev 1.73   23 Apr 1997 14:20:36   OS
   GetEntryData von void* auf USHORT ueber long wg. IBM VA3.0

      Rev 1.72   21 Apr 1997 13:48:20   OS
   SEXPORT -> __EXPORT

      Rev 1.71   21 Apr 1997 11:01:42   OS
   Quelltextkonfiguration

      Rev 1.70   16 Apr 1997 12:30:38   OS
   SEXPORT

      Rev 1.69   25 Feb 1997 10:21:16   OS
   farbige Handles

      Rev 1.68   23 Feb 1997 10:34:12   OS
   zusaetzlicher Hilfstext fuer Tabellen

      Rev 1.67   03 Feb 1997 12:20:16   OS
   Hor. Scrollbar nicht mehr Browse-abhaengig

      Rev 1.66   03 Feb 1997 12:10:34   OS
   Pages fuer Html umgruppieren

      Rev 1.65   22 Jan 1997 11:36:30   MA
   Umstellung Put

      Rev 1.64   18 Jan 1997 15:12:16   OS
   Dialog Tabellenoptionen

      Rev 1.63   18 Jan 1997 11:14:46   OS
   Defaulteinstellungen fuer Grundschriften beruecksichtigen

      Rev 1.62   15 Jan 1997 16:21:54   MA
   #35010# Modified setzen

      Rev 1.61   14 Jan 1997 08:57:50   MA
   includes

      Rev 1.60   13 Jan 1997 16:54:54   OS
   TabStop auf der LayoutPage

      Rev 1.59   20 Dec 1996 13:38:28   OS
   auf SFX_ITEM_SET pruefen

      Rev 1.58   12 Dec 1996 08:44:16   OS
   keine Defaults suchen

      Rev 1.57   11 Dec 1996 14:12:48   OS
   Metric auf der Layout-Page

      Rev 1.56   10 Dec 1996 17:00:04   OS
   Warnungen von der OFA

      Rev 1.55   04 Dec 1996 23:02:42   MH
   chg: header

      Rev 1.54   03 Dec 1996 17:01:30   AMA
   Chg: Der Drucker wird nur im !Browsemodus angelegt.

      Rev 1.53   28 Nov 1996 15:20:26   OS
   neu: Schwarz drucken

      Rev 1.52   11 Nov 1996 09:22:10   MA
   ResMgr

      Rev 1.51   24 Oct 1996 13:14:58   OS
   Grundschriften nur nach Veraenderung im Doc auch in die Applikation eintragen

      Rev 1.50   23 Oct 1996 13:49:16   JP
   SVMEM -> SVSTDARR Umstellung

      Rev 1.49   02 Oct 1996 18:31:00   MA
   Umstellung Enable/Disable

      Rev 1.48   23 Sep 1996 19:28:28   HJS
   const nach nicht-const gecastet

      Rev 1.47   21 Sep 1996 15:56:42   OS
   Grundschriften in Comboboxen, damit nicht vorhandene Schriften gesetzt werden koennen; CheckBox fuer reine Dokumenteinstellung

      Rev 1.46   07 Sep 1996 14:04:28   OS
   Standard-Button fuer Grundschriften

      Rev 1.45   06 Sep 1996 14:32:06   OS
   Postits beruecksichtigen

      Rev 1.44   04 Sep 1996 08:09:12   OS
   neu: Grundschriften-Tabpage

      Rev 1.43   03 Sep 1996 16:56:24   OS
   Tabpage Standardfonts

      Rev 1.42   31 Aug 1996 17:14:00   OS
   neue Optionendialoge

      Rev 1.41   26 Aug 1996 16:57:54   MA
   chg: Lineale auch im BrowseMode

      Rev 1.40   17 Jul 1996 11:13:48   OS
   neu: Checkbox fuer Hintergrunddruck

      Rev 1.39   16 Jul 1996 20:19:50   MA
   includes

      Rev 1.38   24 May 1996 14:58:16   OS
    FN_STAT_MODIFIED -> SID_DOC_MODIFIED

      Rev 1.37   30 Apr 1996 14:03:10   OS
   Ansichts-Controls fuer Preview disablen

      Rev 1.36   25 Apr 1996 16:23:58   OS
   Im Browse-Mode Lineale und HScroll disablen

      Rev 1.35   15 Mar 1996 15:28:18   JP
   TestFlags erweitert

      Rev 1.34   07 Mar 1996 16:54:42   JP
   AddPrintItem um weiters Flag erweitert

      Rev 1.33   06 Feb 1996 15:18:42   JP
   Link Umstellung 305

      Rev 1.32   28 Nov 1995 23:37:36   JP
   uisys.hxx gibt es nicht mehr

 --------------------------------------------------------------------*/


diff --git a/sw/source/ui/config/prtopt.cxx b/sw/source/ui/config/prtopt.cxx
new file mode 100644
index 0000000..7190620
--- /dev/null
+++ b/sw/source/ui/config/prtopt.cxx
@@ -0,0 +1,228 @@
/*************************************************************************
 *
 *  $RCSfile: prtopt.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:33 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _UTL_CONFIGMGR_HXX_
#include <unotools/configmgr.hxx>
#endif
#ifndef _PRTOPT_HXX
#include <prtopt.hxx>
#endif
#ifndef _SWPRTOPT_HXX
#include <swprtopt.hxx>
#endif

#ifndef _TOOLS_DEBUG_HXX
#include <tools/debug.hxx>
#endif
#ifndef _COM_SUN_STAR_UNO_ANY_HXX_
#include <com/sun/star/uno/Any.hxx>
#endif
#ifndef _COM_SUN_STAR_UNO_SEQUENCE_HXX_
#include <com/sun/star/uno/Sequence.hxx>
#endif

using namespace utl;
using namespace rtl;
using namespace com::sun::star::uno;

#define C2U(cChar) OUString::createFromAscii(cChar)
/*--------------------------------------------------------------------
     Beschreibung: Ctor
 --------------------------------------------------------------------*/

Sequence<OUString> SwPrintOptions::GetPropertyNames()
{
    static const char* aPropNames[] =
    {
        "Content/Graphic",          // 0
        "Content/Table",            // 1
        "Content/Drawing",          // 2
        "Content/Control",          // 3
        "Content/Background",       // 4
        "Content/PrintBlack",       // 5
        "Content/Note",             // 6
        "Page/LeftPage",            // 7
        "Page/RightPage",           // 8
        "Page/Reversed",            // 9
        "Page/Brochure",            // 10
        "Output/SinglePrintJob",    // 11
        "Output/Fax",               // 12
        "Papertray/FromPrinterSetup"// 13
    };
    const int nCount = 14;
    Sequence<OUString> aNames(nCount);
    OUString* pNames = aNames.getArray();
    for(int i = 0; i < nCount; i++)
    {
        pNames[i] = OUString::createFromAscii(aPropNames[i]);
    }
    return aNames;
}
/* -----------------------------06.09.00 16:44--------------------------------

 ---------------------------------------------------------------------------*/
SwPrintOptions::SwPrintOptions(sal_Bool bWeb) :
    ConfigItem(bWeb ? C2U("Office.WriterWeb/Print") :  C2U("Office.Writer/Print")),
    bPrintGraphic(sal_True),
    bPrintTable(sal_True),
    bPrintDraw(sal_True),
    bPrintControl(sal_True),
    bPrintLeftPage(sal_True),
    bPrintRightPage(sal_True),
    bReverse(sal_False),
    bPaperFromSetup(sal_False),
    bPrintProspect(sal_False),
    bPrintSingleJobs(sal_False),
    bPrintPageBackground(!bWeb),
    bPrintBlackFont(bWeb),
    nPrintPostIts(POSTITS_NONE)
{
    Sequence<OUString> aNames = GetPropertyNames();
    Sequence<Any> aValues = GetProperties(aNames);
    EnableNotification(aNames);
    const Any* pValues = aValues.getConstArray();
    DBG_ASSERT(aValues.getLength() == aNames.getLength(), "GetProperties failed")
    if(aValues.getLength() == aNames.getLength())
    {
        for(int nProp = 0; nProp < aNames.getLength(); nProp++)
        {
            DBG_ASSERT(pValues[nProp].hasValue(), "property value missing")
            if(pValues[nProp].hasValue())
            {
                switch(nProp)
                {
                    case 0: bPrintGraphic       = *(sal_Bool*)pValues[nProp].getValue(); break;
                    case 1: bPrintTable         = *(sal_Bool*)pValues[nProp].getValue();  break;
                    case 2: bPrintDraw          = *(sal_Bool*)pValues[nProp].getValue() ;  break;
                    case 3: bPrintControl       = *(sal_Bool*)pValues[nProp].getValue() ;  break;
                    case 4: bPrintPageBackground= *(sal_Bool*)pValues[nProp].getValue();  break;
                    case 5: bPrintBlackFont     = *(sal_Bool*)pValues[nProp].getValue();  break;
                    case 6: pValues[nProp] >>=  nPrintPostIts       ;  break;
                    case 7: bPrintLeftPage      = *(sal_Bool*)pValues[nProp].getValue();  break;
                    case 8: bPrintRightPage     = *(sal_Bool*)pValues[nProp].getValue();  break;
                    case 9: bReverse            = *(sal_Bool*)pValues[nProp].getValue();  break;
                    case 10:bPrintProspect      = *(sal_Bool*)pValues[nProp].getValue();  break;
                    case 11:bPrintSingleJobs    = *(sal_Bool*)pValues[nProp].getValue();  break;
                    case 12: pValues[nProp] >>= sFaxName;  break;
                    case 13: bPaperFromSetup    = *(sal_Bool*)pValues[nProp].getValue();  break;
                }
            }
        }
    }
}
/* -----------------------------06.09.00 16:50--------------------------------

 ---------------------------------------------------------------------------*/
SwPrintOptions::~SwPrintOptions()
{
}
/* -----------------------------06.09.00 16:43--------------------------------

 ---------------------------------------------------------------------------*/
void    SwPrintOptions::Commit()
{
    Sequence<OUString> aNames = GetPropertyNames();

    OUString* pNames = aNames.getArray();
    Sequence<Any> aValues(aNames.getLength());
    Any* pValues = aValues.getArray();

    const Type& rType = ::getBooleanCppuType();
    BOOL bVal;
    for(int nProp = 0; nProp < aNames.getLength(); nProp++)
    {
        switch(nProp)
        {
            case 0: bVal = bPrintGraphic; pValues[nProp].setValue(&bVal, rType);break;
            case 1: bVal = bPrintTable          ;pValues[nProp].setValue(&bVal, rType);  break;
            case 2: bVal = bPrintDraw            ; pValues[nProp].setValue(&bVal, rType);  break;
            case 3: bVal = bPrintControl         ; pValues[nProp].setValue(&bVal, rType);  break;
            case 4: bVal = bPrintPageBackground; pValues[nProp].setValue(&bVal, rType);  break;
            case 5: bVal = bPrintBlackFont      ; pValues[nProp].setValue(&bVal, rType);  break;
            case 6: pValues[nProp] <<=  nPrintPostIts       ; break;
            case 7: bVal = bPrintLeftPage        ; pValues[nProp].setValue(&bVal, rType);  break;
            case 8: bVal = bPrintRightPage      ; pValues[nProp].setValue(&bVal, rType);  break;
            case 9: bVal = bReverse          ; pValues[nProp].setValue(&bVal, rType);  break;
            case 10: bVal = bPrintProspect      ; pValues[nProp].setValue(&bVal, rType);  break;
            case 11: bVal = bPrintSingleJobs     ; pValues[nProp].setValue(&bVal, rType);  break;
            case 12: pValues[nProp] <<= sFaxName;  break;
            case 13: bVal = bPaperFromSetup     ; pValues[nProp].setValue(&bVal, rType);  break;
        }
    }
    PutProperties(aNames, aValues);
}
/* -----------------------------06.09.00 16:46--------------------------------

 ---------------------------------------------------------------------------*/
void SwPrintOptions::Notify( const Sequence<rtl::OUString>& aPropertyNames)
{
    DBG_ERROR("properties have been changed")
}




diff --git a/sw/source/ui/config/redlopt.hrc b/sw/source/ui/config/redlopt.hrc
new file mode 100644
index 0000000..3a4d095
--- /dev/null
+++ b/sw/source/ui/config/redlopt.hrc
@@ -0,0 +1,83 @@
/*************************************************************************
 *
 *  $RCSfile: redlopt.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:33 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#define RB_INSERT       1
#define RB_DELETED      2
#define RB_CHANGED      3
#define FT_TE_ATTRIB    4
#define LB_TE_ATTRIB    5
#define LB_TL_ATTRIB    6
#define LB_TC_ATTRIB    7
#define FT_TE_COL       8
#define LB_TE_COL       9
#define LB_TL_COL       10
#define LB_TC_COL       11
#define WIN_TE          12
#define GB_TE           13

#define FT_MARKPOS      14
#define LB_MARKPOS      15
#define FT_LC_COL       16
#define LB_LC_COL       17
#define WIN_MARK        18
#define GB_LC           19
#define STR_AUTHOR      20
#define STR_NOTHING     21

diff --git a/sw/source/ui/config/redlopt.src b/sw/source/ui/config/redlopt.src
new file mode 100644
index 0000000..1bf8abf
--- /dev/null
+++ b/sw/source/ui/config/redlopt.src
@@ -0,0 +1,1422 @@
/*************************************************************************
 *
 *  $RCSfile: redlopt.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:33 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
/* StarView ressource file */

#ifndef _SFX_HRC
#include <sfx2/sfx.hrc>
#endif
#ifndef _SVX_DIALOGS_HRC
#include <svx/dialogs.hrc>
#endif
#include "globals.hrc"
#include "config.hrc"
#include "redlopt.hrc"
#include "helpid.h"
/**************************************************************************/
/*                                                                        */
/**************************************************************************/
TabPage TP_REDLINE_OPT
{
    HelpID = HID_REDLINE_OPT ;
    SVLook = TRUE ;
    Hide = TRUE ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    RadioButton RB_INSERT
    {
        Pos = MAP_APPFONT ( 12 , 18 ) ;
        Size = MAP_APPFONT ( 60 , 10 ) ;
        Text = "~Einfügen" ;
        Text [ ENGLISH ] = "Insert" ;
        Check = TRUE ;
        Text [ portuguese ] = "~Inserir" ;
        Text [ english_us ] = "~Insert" ;
        Text [ portuguese_brazilian ] = "Einfügen" ;
        Text [ swedish ] = "~Infoga" ;
        Text [ danish ] = "~Indsæt" ;
        Text [ italian ] = "Inserisci" ;
        Text [ spanish ] = "~Insertar" ;
        Text [ french ] = "Insérer" ;
        Text [ dutch ] = "~Invoegen" ;
        Text[ chinese_simplified ] = "²åÈë(~I)";
        Text[ russian ] = "Âñò~àâêà";
        Text[ polish ] = "Wstaw";
        Text[ japanese ] = "‘}“ü(~I)";
        Text[ chinese_traditional ] = "´¡¤J(~I)";
        Text[ arabic ] = "ÅÏÑÇÌ";
        Text[ greek ] = "ÅéóáãùãÞ";
        Text[ korean ] = "»ðÀÔ(~I)";
        Text[ turkish ] = "~Ekle";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_DELETED
    {
        Pos = MAP_APPFONT ( 12 , 34 ) ;
        Size = MAP_APPFONT ( 60 , 10 ) ;
        Text = "~Löschen" ;
        Text [ ENGLISH ] = "Delete" ;
        Text [ portuguese ] = "E~liminar" ;
        Text [ english_us ] = "Delete" ;
        Text [ portuguese_brazilian ] = "Löschen" ;
        Text [ swedish ] = "~Radera" ;
        Text [ danish ] = "Slet" ;
        Text [ italian ] = "Elimina" ;
        Text [ spanish ] = "~Eliminar" ;
        Text [ french ] = "Supprimer" ;
        Text [ dutch ] = "~Wissen" ;
        Text[ chinese_simplified ] = "ɾ³ý";
        Text[ russian ] = "Óäàëèòü";
        Text[ polish ] = "Usuñ";
        Text[ japanese ] = "íœ";
        Text[ chinese_traditional ] = "§R°£";
        Text[ arabic ] = "ÍÐÝ";
        Text[ greek ] = "ÄéáãñáöÞ";
        Text[ korean ] = "»èÁ¦";
        Text[ turkish ] = "~Sil";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_CHANGED
    {
        Pos = MAP_APPFONT ( 12 , 50 ) ;
        Size = MAP_APPFONT ( 100 , 10 ) ;
        Text = "~Attributänderung" ;
        Text [ ENGLISH ] = "Change attribute" ;
        Text [ portuguese ] = "~Modificar atributo" ;
        Text [ english_us ] = "Changed attribute" ;
        Text [ portuguese_brazilian ] = "Attributänderung" ;
        Text [ swedish ] = "~Attributändring" ;
        Text [ danish ] = "Attributændring" ;
        Text [ italian ] = "Modifica attributi" ;
        Text [ spanish ] = "Modificación de ~atributo" ;
        Text [ french ] = "Modification d'attributs" ;
        Text [ dutch ] = "~Attribuutwijziging" ;
        Text[ chinese_simplified ] = "¸ü¸ÄÊôÐÔ";
        Text[ russian ] = "Èçìåíåíèå àòðèáóòîâ";
        Text[ polish ] = "Z~miana atrybutów";
        Text[ japanese ] = "‘®«‚̕ύX";
        Text[ chinese_traditional ] = "ÅܧóÄÝ©Ê";
        Text[ arabic ] = "ÊÛííÑ ÇáÓãÇÊ";
        Text[ greek ] = "~ÁëëáãÞ éäéüôçôáò";
        Text[ korean ] = "¼Ó¼º º¯°æ";
        Text[ turkish ] = "Öznitelik deðiþikliði";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_TE_ATTRIB
    {
        Pos = MAP_APPFONT ( 74 , 18 ) ;
        Size = MAP_APPFONT ( 40 , 10 ) ;
        Text = "A~ttribute" ;
        Text [ English ] = "Attributes" ;
        Text [ portuguese ] = "A~tributos" ;
        Text [ english_us ] = "Attributes" ;
        Text [ portuguese_brazilian ] = "Attribute" ;
        Text [ swedish ] = "A~ttribut" ;
        Text [ danish ] = "Attributter" ;
        Text [ italian ] = "Attributi" ;
        Text [ spanish ] = "~Atributos" ;
        Text [ french ] = "Attributs" ;
        Text [ dutch ] = "~Attributen" ;
        Text[ chinese_simplified ] = "ÊôÐÔ";
        Text[ russian ] = "Àòðèáóòû";
        Text[ polish ] = "Atrybuty";
        Text[ japanese ] = "‘®«";
        Text[ chinese_traditional ] = "ÄÝ©Ê";
        Text[ arabic ] = "ÇáÓãÇÊ";
        Text[ greek ] = "Éäéüôçôåò";
        Text[ korean ] = "¼Ó¼º";
        Text[ turkish ] = "Öznitelikler";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_TE_ATTRIB
    {
        Pos = MAP_APPFONT ( 115 , 17 ) ;
        Size = MAP_APPFONT ( 80 , 60 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        StringList =
        {
            < "[Keine]" ; > ;
            < "Fett" ; > ;
            < "Kursiv" ; > ;
            < "Unterstrichen" ; > ;
            < "Doppelt unterstrichen" ; > ;
            < "Versalien" ; > ;
            < "Gemeine" ; > ;
            < "Kapitälchen" ; > ;
            < "Titelschrift" ; > ;
            < "Hintergrundfarbe" ; > ;
        };
        StringList [ English ] =
        {
            < "[Keine]" ; > ;
            < "Fett" ; > ;
            < "Kursiv" ; > ;
            < "Unterstrichen" ; > ;
            < "Doppelt unterstrichen" ; > ;
            < "Versalien" ; > ;
            < "Gemeine" ; > ;
            < "Kapitälchen" ; > ;
            < "Titelschrift" ; > ;
            < "Hintergrundfarbe" ; > ;
        };
        stringlist [ english_us ] =
        {
            < "[None]" ; > ;
            < "Bold" ; > ;
            < "Italic" ; > ;
            < "Underline" ; > ;
            < "Underline: double" ; > ;
            < "Caps" ; > ;
            < "Lower case" ; > ;
            < "Small caps" ; > ;
            < "Title Font" ; > ;
            < "Background color" ; > ;
        };
        stringlist [ portuguese_brazilian ] =
        {
            < "[Keine]" ; > ;
            < "Fett" ; > ;
            < "Kursiv" ; > ;
            < "Unterstrichen" ; > ;
            < "Doppelt unterstrichen" ; > ;
            < "Versalien" ; > ;
            < "Gemeine" ; > ;
            < "Kapitälchen" ; > ;
            < "Titelschrift" ; > ;
            < "Hintergrundfarbe" ; > ;
        };
        stringlist [ swedish ] =
        {
            < "[Inga]" ; > ;
            < "Fet" ; > ;
            < "Kursiv" ; > ;
            < "Understruken" ; > ;
            < "Dubbelt understruket" ; > ;
            < "Versaler" ; > ;
            < "Gemener" ; > ;
            < "Små kapitäler" ; > ;
            < "Titelteckensnitt" ; > ;
            < "Bakgrundsfärg" ; > ;
        };
        stringlist [ danish ] =
        {
            < "[Ingen]" ; > ;
            < "Fed" ; > ;
            < "Kursiv" ; > ;
            < "Understreget" ; > ;
            < "Dobbelt understreget" ; > ;
            < "Store bogstaver" ; > ;
            < "Små bogstaver" ; > ;
            < "Kapitæler" ; > ;
            < "Titelskrift" ; > ;
            < "Baggrundsfarve" ; > ;
        };
        stringlist [ italian ] =
        {
            < "[nessuno]" ; > ;
            < "Grassetto" ; > ;
            < "Corsivo" ; > ;
            < "Sottolineato" ; > ;
            < "Sottolineatura doppia" ; > ;
            < "Maiuscolo" ; > ;
            < "Minuscolo" ; > ;
            < "Maiuscoletto" ; > ;
            < "Carattere del titolo" ; > ;
            < "Colore di sfondo" ; > ;
        };
        stringlist [ spanish ] =
        {
            < "[Ninguno]" ; > ;
            < "Negrita" ; > ;
            < "Cursiva" ; > ;
            < "Subrayado" ; > ;
            < "Subrayado doble" ; > ;
            < "Mayúsculas" ; > ;
            < "Minúsculas" ; > ;
            < "Versalitas" ; > ;
            < "Caracteres del título" ; > ;
            < "Color de fondo" ; > ;
        };
        stringlist [ french ] =
        {
            < "[Aucun(e)]" ; > ;
            < "Gras" ; > ;
            < "Italique" ; > ;
            < "Soulignage" ; > ;
            < "Soulignage : double" ; > ;
            < "Majuscules" ; > ;
            < "Minuscules" ; > ;
            < "Petites majuscules" ; > ;
            < "Caractères du titre" ; > ;
            < "Couleur d'arrière-plan" ; > ;
        };
        stringlist [ dutch ] =
        {
            < "[Geen]" ; > ;
            < "Vet" ; > ;
            < "Cursief" ; > ;
            < "Onderstrepen" ; > ;
            < "Dubbel onderstrepen" ; > ;
            < "Hoofdletters" ; > ;
            < "Kleine letters" ; > ;
            < "Kapitalen" ; > ;
            < "Titelschrift" ; > ;
            < "Achtergrondkleur" ; > ;
        };
        stringlist [ portuguese ] =
        {
            < "[nenhum]" ; > ;
            < "Negrito" ; > ;
            < "Itálico" ; > ;
            < "Sublinhado" ; > ;
            < "Sublinhado duplo" ; > ;
            < "Maiúsculas" ; > ;
            < "Minúsculas" ; > ;
            < "Versaletes" ; > ;
            < "Letra para título" ; > ;
            < "Cor do plano de fundo" ; > ;
        };
    StringList [ chinese_simplified ] =
    {
            < "[ÎÞ]" ; > ;
        < "´ÖÌå" ; > ;
        < "бÌå" ; > ;
        < "Ï»®Ïß" ; > ;
        < "˫ϻ®Ïß" ; > ;
        < "´óд×Öĸ" ; > ;
        < "Сд×Öĸ" ; > ;
        < "СÐÍ´óд×Öĸ" ; > ;
        < "±êÌâ×ÖÌå" ; > ;
        < "±³¾°ÑÕÉ«" ; > ;
    };
    StringList [ russian ] =
    {
            < "[Áåç]" ; > ;
        < "Æèðíûé" ; > ;
        < "Êóðñèâ" ; > ;
        < "Ïîä÷åðêíóòûé" ; > ;
        < "Äâîéíîå ïîä÷åðêèâàíèå" ; > ;
        < "Ïðîïèñíûå" ; > ;
        < "Ñòðî÷íûå áóêâû" ; > ;
        < "Ìàëûå ïðîïèñíûå" ; > ;
        < "Çàãëàâíûé øðèôò" ; > ;
        < "Öâåò ôîíà" ; > ;
    };
    StringList [ polish ] =
    {
            < "[Brak]" ; > ;
        < "Pogrubienie" ; > ;
        < "Kursywa" ; > ;
        < "Podkreœlenie" ; > ;
        < "Podwójne podkreœlenie" ; > ;
        < "Wersaliki" ; > ;
        < "Ma³e litery" ; > ;
        < "Kapitaliki" ; > ;
        < "Czcionka tytu³owa" ; > ;
        < "Kolor t³a" ; > ;
    };
    StringList [ japanese ] =
    {
            < "[‚È‚µ]" ; > ;
        < "‘¾Žš" ; > ;
        < "ŽÎ‘Ì" ; > ;
        < "‰ºü" ; > ;
        < "“ñd‰ºü" ; > ;
        < "‘å•¶Žš" ; > ;
        < "¬•¶Žš" ; > ;
        < "¬Œ^‘å•¶Žš" ; > ;
        < "À²Äٕ¶Žš" ; > ;
        < "”wŒiF" ; > ;
    };
    StringList [ chinese_traditional ] =
    {
            < "[µL]" ; > ;
        < "²ÊÅé" ; > ;
        < "±×Åé" ; > ;
        < "¤U¹º½u" ; > ;
        < "Âù¤U¹º½u" ; > ;
        < "¤j¼g¦r¥À" ; > ;
        < "¤p¼g¦r¥À" ; > ;
        < "¤p«¬¤j¼g¦r¥À" ; > ;
        < "¼ÐÃD¦r«¬" ; > ;
        < "­I´ºÃC¦â" ; > ;
    };
    StringList [ arabic ] =
    {
            < "[ÈÏæä]" ; > ;
        < "ÚÑíÖ" ; > ;
        < "ãÇÆá" ; > ;
        < "ÊÍÊå ÎØ" ; > ;
        < "ÎØ ÊÍÊí ãÒÏæÌ" ; > ;
        < "ÃÍÑÝ ßÈíÑÉ" ; > ;
        < "ÃÍÑÝ ÕÛíÑÉ" ; > ;
        < "ÍÑÝ ÈÏÇíÉ ÃßÈÑ" ; > ;
        < "ÎØ ÇáÚäæÇä" ; > ;
        < "áæä ÇáÎáÝíÉ" ; > ;
    };
    StringList [ greek ] =
    {
            < "[ÊáíÝíá]" ; > ;
        < "¸íôïíï" ; > ;
        < "ÐëÜãéá" ; > ;
        < "ÕðïãñÜììéóç" ; > ;
        < "ÄéðëÞ õðïãñÜììéóç" ; > ;
        < "Êåöáëáßá" ; > ;
        < "Ðåæïß ÷áñáêôÞñåò" ; > ;
        < "ÌéêñÜ êåöáëáßá" ; > ;
        < "ÃñáììáôïóåéñÜ ôßôëïõ" ; > ;
        < "×ñþìá öüíôïõ" ; > ;
    };
    StringList [ korean ] =
    {
            < "[¾øÀ½]" ; > ;
        < "ÁøÇϰÔ" ; > ;
        < "±â¿ïÀÓ²Ã" ; > ;
        < "¹ØÁÙ" ; > ;
        < "ÀÌÁß ¹ØÁÙ" ; > ;
        < "´ë¹®ÀÚ" ; > ;
        < "¼Ò¹®ÀÚ" ; > ;
        < "ÀÛÀº ´ë¹®ÀÚ" ; > ;
        < "Á¦¸ñ ±Û²Ã" ; > ;
        < "¹è°æ»ö" ; > ;
    };
    StringList [ turkish ] =
    {
            < "[Yok]" ; > ;
        < "Kalýn" ; > ;
        < "Ýtalik" ; > ;
        < "Altý çizili" ; > ;
        < "Altý çift çizili" ; > ;
        < "Büyük harflerle" ; > ;
        < "Küçük harflerle" ; > ;
        < "Küçük büyük harf" ; > ;
        < "Baþlýk yazýtipi" ; > ;
        < "Artalan rengi" ; > ;
    };
    StringList [ language_user1 ] =
    {
            < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
    };
    };
    ListBox LB_TL_ATTRIB
    {
        Pos = MAP_APPFONT ( 115 , 17 ) ;
        Size = MAP_APPFONT ( 80 , 60 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        Hide = TRUE ;
        StringList =
        {
            < "[Keine]" ; > ;
            < "Fett" ; > ;
            < "Kursiv" ; > ;
            < "Durchstreichen" ; > ;
            < "Versalien" ; > ;
            < "Gemeine" ; > ;
            < "Kapitälchen" ; > ;
            < "Titelschrift" ; > ;
            < "Hintergrundfarbe" ; > ;
        };
        StringList [ English ] =
        {
            < "[Keine]" ; > ;
            < "Fett" ; > ;
            < "Kursiv" ; > ;
            < "Durchstreichen" ; > ;
            < "Versalien" ; > ;
            < "Gemeine" ; > ;
            < "Kapitälchen" ; > ;
            < "Titelschrift" ; > ;
            < "Hintergrundfarbe" ; > ;
        };
        stringlist [ english_us ] =
        {
            < "[None]" ; > ;
            < "Bold" ; > ;
            < "Italic" ; > ;
            < "Strikethrough" ; > ;
            < "Caps" ; > ;
            < "Lower case" ; > ;
            < "Small caps" ; > ;
            < "Title Font" ; > ;
            < "Background color" ; > ;
        };
        stringlist [ portuguese_brazilian ] =
        {
            < "[Keine]" ; > ;
            < "Fett" ; > ;
            < "Kursiv" ; > ;
            < "Durchstreichen" ; > ;
            < "Versalien" ; > ;
            < "Gemeine" ; > ;
            < "Kapitälchen" ; > ;
            < "Titelschrift" ; > ;
            < "Hintergrundfarbe" ; > ;
        };
        stringlist [ swedish ] =
        {
            < "[Inga]" ; > ;
            < "Fet" ; > ;
            < "Kursiv" ; > ;
            < "Genomstruken" ; > ;
            < "Versaler" ; > ;
            < "Gemener" ; > ;
            < "Små kapitäler" ; > ;
            < "Titelteckensnitt" ; > ;
            < "Bakgrundsfärg" ; > ;
        };
        stringlist [ danish ] =
        {
            < "[Ingen]" ; > ;
            < "Fed" ; > ;
            < "Kursiv" ; > ;
            < "Gennemstreget" ; > ;
            < "Store bogstaver" ; > ;
            < "Små bogstaver" ; > ;
            < "Kapitæler" ; > ;
            < "Titelskrift" ; > ;
            < "Baggrundsfarve" ; > ;
        };
        stringlist [ italian ] =
        {
            < "[nessuno]" ; > ;
            < "Grassetto" ; > ;
            < "Corsivo" ; > ;
            < "Barrato" ; > ;
            < "Maiuscolo" ; > ;
            < "Minuscolo" ; > ;
            < "Maiuscoletto" ; > ;
            < "Carattere del titolo" ; > ;
            < "Colore di sfondo" ; > ;
        };
        stringlist [ spanish ] =
        {
            < "[Ninguno]" ; > ;
            < "Negrita" ; > ;
            < "Cursiva" ; > ;
            < "Tachar" ; > ;
            < "Mayúsculas" ; > ;
            < "Minúsculas" ; > ;
            < "Versalitas" ; > ;
            < "Caracteres del título" ; > ;
            < "Color de fondo" ; > ;
        };
        stringlist [ french ] =
        {
            < "[Aucun(e)]" ; > ;
            < "Gras" ; > ;
            < "Italique" ; > ;
            < "Barré" ; > ;
            < "Majuscules" ; > ;
            < "Minuscules" ; > ;
            < "Petites majuscules" ; > ;
            < "Caractères du titre" ; > ;
            < "Couleur d'arrière-plan" ; > ;
        };
        stringlist [ dutch ] =
        {
            < "[Geen]" ; > ;
            < "Vet" ; > ;
            < "Cursief" ; > ;
            < "Doorstrepen" ; > ;
            < "Hoofdletters" ; > ;
            < "Kleine letters" ; > ;
            < "Kapitalen" ; > ;
            < "Titelschrift" ; > ;
            < "Achtergrondkleur" ; > ;
        };
        stringlist [ portuguese ] =
        {
            < "[nenhum]" ; > ;
            < "Negrito" ; > ;
            < "Itálico" ; > ;
            < "Rasurar" ; > ;
            < "Maiúsculas" ; > ;
            < "Minúsculas" ; > ;
            < "Versaletes" ; > ;
            < "Letra para título" ; > ;
            < "Cor do plano de fundo" ; > ;
        };
        StringList [ chinese_simplified ] =
        {
                < "[ÎÞ]" ; > ;
            < "´ÖÌå" ; > ;
            < "бÌå" ; > ;
            < "ɾ³ýÏß" ; > ;
            < "´óд×Öĸ" ; > ;
            < "Сд×Öĸ" ; > ;
            < "СÐÍ´óд×Öĸ" ; > ;
            < "±êÌâ×ÖÌå" ; > ;
            < "±³¾°ÑÕÉ«" ; > ;
        };
    StringList [ russian ] =
    {
            < "[Áåç]" ; > ;
        < "Æèðíûé" ; > ;
        < "Êóðñèâ" ; > ;
        < "Çà÷åðêíóòûé" ; > ;
        < "Ïðîïèñíûå" ; > ;
        < "Ñòðî÷íûå áóêâû" ; > ;
        < "Ìàëûå ïðîïèñíûå" ; > ;
        < "Çàãëàâíûé øðèôò" ; > ;
        < "Öâåò ôîíà" ; > ;
    };
    StringList [ polish ] =
    {
            < "[Brak]" ; > ;
        < "Pogrubienie" ; > ;
        < "Kursywa" ; > ;
        < "Przekreœlenie" ; > ;
        < "Wersaliki" ; > ;
        < "Ma³e litery" ; > ;
        < "Kapitaliki" ; > ;
        < "Czcionka tytu³owa" ; > ;
        < "Kolor t³a" ; > ;
    };
    StringList [ japanese ] =
    {
            < "[‚È‚µ]" ; > ;
        < "‘¾Žš" ; > ;
        < "ŽÎ‘Ì" ; > ;
        < "Žæ‚èÁ‚µü" ; > ;
        < "‘å•¶Žš" ; > ;
        < "¬•¶Žš" ; > ;
        < "¬Œ^‘å•¶Žš" ; > ;
        < "À²Äٕ¶Žš" ; > ;
        < "”wŒiF" ; > ;
    };
    StringList [ chinese_traditional ] =
    {
            < "[µL]" ; > ;
        < "²ÊÅé" ; > ;
        < "±×Åé" ; > ;
        < "§R°£½u" ; > ;
        < "¤j¼g¦r¥À" ; > ;
        < "¤p¼g¦r¥À" ; > ;
        < "¤p«¬¤j¼g¦r¥À" ; > ;
        < "¼ÐÃD¦r«¬" ; > ;
        < "­I´ºÃC¦â" ; > ;
    };
    StringList [ arabic ] =
    {
            < "[ÈÏæä]" ; > ;
        < "ÚÑíÖ" ; > ;
        < "ãÇÆá" ; > ;
        < "ÔØÈ" ; > ;
        < "ÃÍÑÝ ßÈíÑÉ" ; > ;
        < "ÃÍÑÝ ÕÛíÑÉ" ; > ;
        < "ÍÑÝ ÈÏÇíÉ ÃßÈÑ" ; > ;
        < "ÎØ ÇáÚäæÇä" ; > ;
        < "áæä ÇáÎáÝíÉ" ; > ;
    };
    StringList [ greek ] =
    {
            < "[ÊáíÝíá]" ; > ;
        < "¸íôïíï" ; > ;
        < "ÐëÜãéá" ; > ;
        < "ÄéáãñÜììéóç" ; > ;
        < "Êåöáëáßá" ; > ;
        < "Ðåæïß ÷áñáêôÞñåò" ; > ;
        < "ÌéêñÜ êåöáëáßá" ; > ;
        < "ÃñáììáôïóåéñÜ ôßôëïõ" ; > ;
        < "×ñþìá öüíôïõ" ; > ;
    };
    StringList [ korean ] =
    {
            < "[¾øÀ½]" ; > ;
        < "ÁøÇϰÔ" ; > ;
        < "±â¿ïÀÓ²Ã" ; > ;
        < "Ãë¼Ò¼±" ; > ;
        < "´ë¹®ÀÚ" ; > ;
        < "¼Ò¹®ÀÚ" ; > ;
        < "ÀÛÀº ´ë¹®ÀÚ" ; > ;
        < "Á¦¸ñ ±Û²Ã" ; > ;
        < "¹è°æ»ö" ; > ;
    };
    StringList [ turkish ] =
    {
            < "[Yok]" ; > ;
        < "Kalýn" ; > ;
        < "Ýtalik" ; > ;
        < "Üzerini çiz" ; > ;
        < "Büyük harflerle" ; > ;
        < "Küçük harflerle" ; > ;
        < "Küçük büyük harf" ; > ;
        < "Baþlýk yazýtipi" ; > ;
        < "Artalan rengi" ; > ;
    };
    StringList [ language_user1 ] =
    {
            < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
    };
    };
    ListBox LB_TC_ATTRIB
    {
        Pos = MAP_APPFONT ( 115 , 17 ) ;
        Size = MAP_APPFONT ( 80 , 60 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        Hide = TRUE ;
        StringList =
        {
            < "[Keine]" ; > ;
            < "Fett" ; > ;
            < "Kursiv" ; > ;
            < "Unterstrichen" ; > ;
            < "Doppelt unterstrichen" ; > ;
            < "Versalien" ; > ;
            < "Gemeine" ; > ;
            < "Kapitälchen" ; > ;
            < "Titelschrift" ; > ;
            < "Hintergrundfarbe" ; > ;
        };
        StringList [ English ] =
        {
            < "[Keine]" ; > ;
            < "Fett" ; > ;
            < "Kursiv" ; > ;
            < "Unterstrichen" ; > ;
            < "Doppelt unterstrichen" ; > ;
            < "Versalien" ; > ;
            < "Gemeine" ; > ;
            < "Kapitälchen" ; > ;
            < "Titelschrift" ; > ;
            < "Hintergrundfarbe" ; > ;
        };
        stringlist [ english_us ] =
        {
            < "[None]" ; > ;
            < "Bold" ; > ;
            < "Italic" ; > ;
            < "Underline" ; > ;
            < "Underline: double" ; > ;
            < "Caps" ; > ;
            < "Lower case" ; > ;
            < "Small caps" ; > ;
            < "Title Font" ; > ;
            < "Background color" ; > ;
        };
        stringlist [ portuguese_brazilian ] =
        {
            < "[Keine]" ; > ;
            < "Fett" ; > ;
            < "Kursiv" ; > ;
            < "Unterstrichen" ; > ;
            < "Doppelt unterstrichen" ; > ;
            < "Versalien" ; > ;
            < "Gemeine" ; > ;
            < "Kapitälchen" ; > ;
            < "Titelschrift" ; > ;
            < "Hintergrundfarbe" ; > ;
        };
        stringlist [ swedish ] =
        {
            < "[Inga]" ; > ;
            < "Fet" ; > ;
            < "Kursiv" ; > ;
            < "Understruken" ; > ;
            < "Dubbelt understruken" ; > ;
            < "Versaler" ; > ;
            < "Gemener" ; > ;
            < "Små kapitäler" ; > ;
            < "Titelteckensnitt" ; > ;
            < "Bakgrundsfärg" ; > ;
        };
        stringlist [ danish ] =
        {
            < "[Ingen]" ; > ;
            < "Fed" ; > ;
            < "Kursiv" ; > ;
            < "Understreget" ; > ;
            < "Dobbelt understreget" ; > ;
            < "Store bogstaver" ; > ;
            < "Små bogstaver" ; > ;
            < "Kapitæler" ; > ;
            < "Titelskrift" ; > ;
            < "Baggrundsfarve" ; > ;
        };
        stringlist [ italian ] =
        {
            < "[nessuno]" ; > ;
            < "Grassetto" ; > ;
            < "Corsivo" ; > ;
            < "Sotttolineato" ; > ;
            < "Sottolineatura doppia" ; > ;
            < "Maiuscolo" ; > ;
            < "Minuscolo" ; > ;
            < "Maiuscoletto" ; > ;
            < "Carattere del titolo" ; > ;
            < "Colore di sfondo" ; > ;
        };
        stringlist [ spanish ] =
        {
            < "[Ninguno]" ; > ;
            < "Negrita" ; > ;
            < "Cursiva" ; > ;
            < "Subrayado" ; > ;
            < "Subrayado doble" ; > ;
            < "Mayúsculas" ; > ;
            < "Minúsculas" ; > ;
            < "Versalitas" ; > ;
            < "Caracteres del título" ; > ;
            < "Color de fondo" ; > ;
        };
        stringlist [ french ] =
        {
            < "[Aucun(e)]" ; > ;
            < "Gras" ; > ;
            < "Italique" ; > ;
            < "Soulignage" ; > ;
            < "Soulignage : double" ; > ;
            < "Majuscules" ; > ;
            < "Minuscules" ; > ;
            < "Petites majuscules" ; > ;
            < "Caractères du titre" ; > ;
            < "Couleur d'arrière-plan" ; > ;
        };
        stringlist [ dutch ] =
        {
            < "[Geen]" ; > ;
            < "Vet" ; > ;
            < "Cursief" ; > ;
            < "Onderstrepen" ; > ;
            < "Dubbel onderstrepen" ; > ;
            < "Hoofdletters" ; > ;
            < "Kleine letters" ; > ;
            < "Kapitalen" ; > ;
            < "Titelschrift" ; > ;
            < "Achtergrondkleur" ; > ;
        };
        stringlist [ portuguese ] =
        {
            < "(nenhuns]" ; > ;
            < "Negrito" ; > ;
            < "Itálico" ; > ;
            < "Sublinhado" ; > ;
            < "Sublinhado: duplo" ; > ;
            < "Maiúsculas" ; > ;
            < "Minúsculas" ; > ;
            < "Versaletes" ; > ;
            < "Letra para título" ; > ;
            < "Cor do plano fundo" ; > ;
        };
        StringList [ chinese_simplified ] =
        {
                < "[ÎÞ]" ; > ;
            < "´ÖÌå" ; > ;
            < "бÌå" ; > ;
            < "Ï»®Ïß" ; > ;
            < "˫ϻ®Ïß" ; > ;
            < "´óд×Öĸ" ; > ;
            < "Сд×Öĸ" ; > ;
            < "СÐÍ´óд×Öĸ" ; > ;
            < "±êÌâ×ÖÌå" ; > ;
            < "±³¾°ÑÕÉ«" ; > ;
        };
    StringList [ russian ] =
    {
            < "[Áåç]" ; > ;
        < "Æèðíûé" ; > ;
        < "Êóðñèâ" ; > ;
        < "Ïîä÷åðêèâàíèå" ; > ;
        < "Äâîéíîå ïîä÷åðêèâàíèå" ; > ;
        < "Ïðîïèñíûå" ; > ;
        < "Ñòðî÷íûå áóêâû" ; > ;
        < "Ìàëûå ïðîïèñíûå" ; > ;
        < "Çàãëàâíûé øðèôò" ; > ;
        < "Öâåò ôîíà" ; > ;
    };
    StringList [ polish ] =
    {
            < "[Brak]" ; > ;
        < "Pogrubianie" ; > ;
        < "Kursywa" ; > ;
        < "Podkreœlenie" ; > ;
        < "Podwójne podkreœlenie" ; > ;
        < "Wersaliki" ; > ;
        < "Ma³e litery" ; > ;
        < "Kapitaliki" ; > ;
        < "Czcionka tytu³owa" ; > ;
        < "Kolor t³a" ; > ;
    };
    StringList [ japanese ] =
    {
            < "[‚È‚µ]" ; > ;
        < "‘¾Žš" ; > ;
        < "ŽÎ‘Ì" ; > ;
        < "‰ºü" ; > ;
        < "“ñd‰ºü" ; > ;
        < "‘å•¶Žš" ; > ;
        < "¬•¶Žš" ; > ;
        < "¬Œ^‘å•¶Žš" ; > ;
        < "À²Äٕ¶Žš" ; > ;
        < "”wŒiF" ; > ;
    };
    StringList [ chinese_traditional ] =
    {
            < "[µL]" ; > ;
        < "²ÊÅé" ; > ;
        < "±×Åé" ; > ;
        < "¤U¹º½u" ; > ;
        < "Âù¤U¹º½u" ; > ;
        < "¤j¼g¦r¥À" ; > ;
        < "¤p¼g¦r¥À" ; > ;
        < "¤p«¬¤j¼g¦r¥À" ; > ;
        < "¼ÐÃD¦r«¬" ; > ;
        < "­I´ºÃC¦â" ; > ;
    };
    StringList [ arabic ] =
    {
            < "[ÈÏæä]" ; > ;
        < "ÚÑíÖ" ; > ;
        < "ãÇÆá" ; > ;
        < "ÊÍÊå ÎØ" ; > ;
        < "ÎØ ÊÍÊí ãÒÏæÌ" ; > ;
        < "ÃÍÑÝ ßÈíÑÉ" ; > ;
        < "ÃÍÑÝ ÕÛíÑÉ" ; > ;
        < "ÍÑÝ ÈÏÇíÉ ÃßÈÑ" ; > ;
        < "ÎØ ÇáÚäæÇä" ; > ;
        < "áæä ÇáÎáÝíÉ" ; > ;
    };
    StringList [ greek ] =
    {
            < "[ÊáíÝíá]" ; > ;
        < "¸íôïíï" ; > ;
        < "ÐëÜãéá" ; > ;
        < "ÕðïãñÜììéóç" ; > ;
        < "ÄéðëÞ õðïãñÜììéóç" ; > ;
        < "Êåöáëáßá" ; > ;
        < "Ðåæïß ÷áñáêôÞñåò" ; > ;
        < "ÌéêñÜ êåöáëáßá" ; > ;
        < "ÃñáììáôïóåéñÜ ôßôëïõ" ; > ;
        < "×ñþìá öüíôïõ" ; > ;
    };
    StringList [ korean ] =
    {
            < "[¾øÀ½]" ; > ;
        < "ÁøÇϰÔ" ; > ;
        < "±â¿ïÀÓ²Ã" ; > ;
        < "¹ØÁÙ" ; > ;
        < "¹ØÁÙ: 2Áß" ; > ;
        < "´ë¹®ÀÚ" ; > ;
        < "¼Ò¹®ÀÚ" ; > ;
        < "ÀÛÀº ´ë¹®ÀÚ" ; > ;
        < "Á¦¸ñ ±Û²Ã" ; > ;
        < "¹è°æ»ö" ; > ;
    };
    StringList [ turkish ] =
    {
            < "[Yok]" ; > ;
        < "Kalýn" ; > ;
        < "Ýtalik" ; > ;
        < "Altý çizili" ; > ;
        < "Altý çift çizili" ; > ;
        < "Büyük harflerle" ; > ;
        < "Küçük harflerle" ; > ;
        < "Küçük büyük harf" ; > ;
        < "Baþlýk yazýtipi" ; > ;
        < "Artalan rengi" ; > ;
    };
    StringList [ language_user1 ] =
    {
            < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
    };
    };
    FixedText FT_TE_COL
    {
        Pos = MAP_APPFONT ( 74 , 34 ) ;
        Size = MAP_APPFONT ( 40 , 10 ) ;
        Text = "~Farbe" ;
        Text [ English ] = "Color" ;
        Text [ portuguese ] = "~Cor" ;
        Text [ english_us ] = "Color" ;
        Text [ portuguese_brazilian ] = "Farbe" ;
        Text [ swedish ] = "~Färg" ;
        Text [ danish ] = "Farve" ;
        Text [ italian ] = "Colore" ;
        Text [ spanish ] = "~Color" ;
        Text [ french ] = "Couleur" ;
        Text [ dutch ] = "~Kleur" ;
        Text[ chinese_simplified ] = "ÑÕÉ«";
        Text[ russian ] = "Öâåò";
        Text[ polish ] = "Kolor";
        Text[ japanese ] = "F";
        Text[ chinese_traditional ] = "ÃC¦â";
        Text[ arabic ] = "Çááæä";
        Text[ greek ] = "×ñþìá";
        Text[ korean ] = "»ö»ó";
        Text[ turkish ] = "~Renk";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_TE_COL
    {
        Pos = MAP_APPFONT ( 115 , 33 ) ;
        Size = MAP_APPFONT ( 80 , 60 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
    };
    ListBox LB_TL_COL
    {
        Pos = MAP_APPFONT ( 115 , 33 ) ;
        Size = MAP_APPFONT ( 80 , 60 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        Hide = TRUE ;
    };
    ListBox LB_TC_COL
    {
        Pos = MAP_APPFONT ( 115 , 33 ) ;
        Size = MAP_APPFONT ( 80 , 60 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        Hide = TRUE ;
    };
    Window WIN_TE
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 198 , 22 ) ;
        Size = MAP_APPFONT ( 50 , 18 ) ;
        Text = "Beispiel" ;
        Text [ English ] = "Example" ;
        Text [ portuguese ] = "Exemplo" ;
        Text [ english_us ] = "Example" ;
        Text [ portuguese_brazilian ] = "Beispiel" ;
        Text [ swedish ] = "Exempel" ;
        Text [ danish ] = "Eksempel" ;
        Text [ italian ] = "Esempio" ;
        Text [ spanish ] = "Ejemplo" ;
        Text [ french ] = "Exemple" ;
        Text [ dutch ] = "Voorbeeld" ;
        Text[ chinese_simplified ] = "Àý×Ó";
        Text[ russian ] = "Ïðèìåð";
        Text[ polish ] = "Przyk³ad";
        Text[ japanese ] = "—á";
        Text[ chinese_traditional ] = "¨Ò¤l";
        Text[ arabic ] = "ãËÇá";
        Text[ greek ] = "ÐáñÜäåéãìá";
        Text[ korean ] = "¿¹";
        Text[ turkish ] = "Örnek";
        Text[ language_user1 ] = " ";
    };
    GroupBox GB_TE
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 248 , 70 ) ;
        Text = "Textdarstellung" ;
        Text [ English ] = "Text representation" ;
        Text [ portuguese ] = "Visualizar texto" ;
        Text [ english_us ] = "Text display" ;
        Text [ portuguese_brazilian ] = "Textdarstellung" ;
        Text [ swedish ] = "Textvisning" ;
        Text [ danish ] = "Tekstvisning" ;
        Text [ italian ] = "Rappresentazione testo" ;
        Text [ spanish ] = "Ver texto" ;
        Text [ french ] = "Affichage du texte" ;
        Text [ dutch ] = "Tekstweergave" ;
        Text[ chinese_simplified ] = "ÎÄ×ÖÏÔʾ";
        Text[ russian ] = "Ïîêàç òåêñòà";
        Text[ polish ] = "Wyœwietl tekst";
        Text[ japanese ] = "÷½Ä‚ÌÃÞ¨½ÌßÚ²";
        Text[ chinese_traditional ] = "¤å¦rÅã¥Ü";
        Text[ arabic ] = "ÚÑÖ ÇáäÕ";
        Text[ greek ] = "ÄéÜôáîç êåéìÝíïõ";
        Text[ korean ] = "ÅØ½ºÆ® Ç¥½Ã";
        Text[ turkish ] = "Metin görünümü";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_MARKPOS
    {
        Pos = MAP_APPFONT ( 65 , 93 ) ;
        Size = MAP_APPFONT ( 48 , 10 ) ;
        Text = "Markierung" ;
        Text [ English ] = "Mark" ;
        Text [ portuguese ] = "Marca" ;
        Text [ english_us ] = "Mark" ;
        Text [ portuguese_brazilian ] = "Markierung" ;
        Text [ swedish ] = "Markering" ;
        Text [ danish ] = "Markering" ;
        Text [ italian ] = "Contrassegno" ;
        Text [ spanish ] = "Marca" ;
        Text [ french ] = "Marque" ;
        Text [ dutch ] = "Markering" ;
        Text[ chinese_simplified ] = "񈬀";
        Text[ russian ] = "Âûäåëåíèå";
        Text[ polish ] = "Zaznaczenie";
        Text[ japanese ] = "‘I‘ð";
        Text[ chinese_traditional ] = "¼Ð°O";
        Text[ arabic ] = "ÇáÊÍÏíÏ";
        Text[ greek ] = "ÌáñêÜñéóìá";
        Text[ korean ] = "Ç¥½Ã";
        Text[ turkish ] = "Ýþaret";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_MARKPOS
    {
        Pos = MAP_APPFONT ( 115 , 92 ) ;
        Size = MAP_APPFONT ( 80 , 60 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        StringList =
        {
            < "[Keine]" ; > ;
            < "Linker Rand" ; > ;
            < "Rechter Rand" ; > ;
            < "Außenrand" ; > ;
            < "Innenrand" ; > ;
        };
        StringList [ English ] =
        {
            < "[Keine]" ; > ;
            < "Linker Rand" ; > ;
            < "Rechter Rand" ; > ;
            < "Außenrand" ; > ;
            < "Innenrand" ; > ;
        };
        stringlist [ portuguese ] =
        {
            < "[nenhuns]" ; > ;
            < "Margem esquerda" ; > ;
            < "Margem direita" ; > ;
            < "Margem exterior" ; > ;
            < "Margem interior" ; > ;
        };
        stringlist [ english_us ] =
        {
            < "[None]" ; > ;
            < "Left margin" ; > ;
            < "Right margin" ; > ;
            < "Outer margin" ; > ;
            < "Inward margin" ; > ;
        };
        stringlist [ portuguese_brazilian ] =
        {
            < "[Keine]" ; > ;
            < "Linker Rand" ; > ;
            < "Rechter Rand" ; > ;
            < "Außenrand" ; > ;
            < "Innenrand" ; > ;
        };
        stringlist [ swedish ] =
        {
            < "[Inga]" ; > ;
            < "Vänster marginal" ; > ;
            < "Höger marginal" ; > ;
            < "Utvändig marginal" ; > ;
            < "Invändig marginal" ; > ;
        };
        stringlist [ danish ] =
        {
            < "[Ingen]" ; > ;
            < "Venstre margen" ; > ;
            < "Højre margen" ; > ;
            < "Ydermargen" ; > ;
            < "Indermargen" ; > ;
        };
        stringlist [ italian ] =
        {
            < "[nessuno]" ; > ;
            < "Bordo sinistro" ; > ;
            < "Bordo destro" ; > ;
            < "Bordo esterno" ; > ;
            < "Bordo interno" ; > ;
        };
        stringlist [ spanish ] =
        {
            < "[Ninguno]" ; > ;
            < "Margen izquierdo" ; > ;
            < "Margen derecho" ; > ;
            < "Margen exterior" ; > ;
            < "Margen interior" ; > ;
        };
        stringlist [ french ] =
        {
            < "[Aucun(e)]" ; > ;
            < "Marge gauche" ; > ;
            < "Marge droite" ; > ;
            < "Marge extérieure" ; > ;
            < "Marge intérieure" ; > ;
        };
        stringlist [ dutch ] =
        {
            < "[Geen]" ; > ;
            < "Linker rand" ; > ;
            < "Rechter rand" ; > ;
            < "Buitenste rand" ; > ;
            < "Binnenste rand" ; > ;
        };
    StringList [ chinese_simplified ] =
    {
            < "[ÎÞ]" ; > ;
        < "×ó·½Ò³±ß¾à" ; > ;
        < "ÓÒ·½Ò³±ß¾à" ; > ;
        < "Íâ²àÒ³±ß¾à" ; > ;
        < "ÄÚ²àÒ³±ß¾à" ; > ;
    };
    StringList [ russian ] =
    {
            < "[Áåç]" ; > ;
        < "Ëåâûé êðàé" ; > ;
        < "Ïðàâûé êðàé" ; > ;
        < "Íàðóæíûé êðàé" ; > ;
        < "Âíóòðåííèé êðàé" ; > ;
    };
    StringList [ polish ] =
    {
            < "[¿adne]" ; > ;
        < "Lewy margines" ; > ;
        < "Prawy margines" ; > ;
        < "Margines zewnêtrzny" ; > ;
        < "Margines wewnêtrzny" ; > ;
    };
    StringList [ japanese ] =
    {
            < "[‚È‚µ]" ; > ;
        < "¶—]”’" ; > ;
        < "‰E—]”’" ; > ;
        < "ŠO‘¤‚Ì—]”’" ; > ;
        < "“à‘¤‚Ì—]”’" ; > ;
    };
    StringList [ chinese_traditional ] =
    {
            < "[µL]" ; > ;
        < "¥ª¦VÃ䮨" ; > ;
        < "¥k¦VÃ䮨" ; > ;
        < "Ã䮨¥~°¼" ; > ;
        < "Ã䮨¤º°¼" ; > ;
    };
    StringList [ arabic ] =
    {
            < "[ÈÏæä]" ; > ;
        < "ÇáåÇãÔ ÇáÃíÓÑ" ; > ;
        < "ÇáåÇãÔ ÇáÃíãä" ; > ;
        < "ÇáåÇãÔ ÇáÎÇÑÌí" ; > ;
        < "ÇáåÇãÔ ÇáÏÇÎáí" ; > ;
    };
    StringList [ greek ] =
    {
            < "[Êáìßá]" ; > ;
        < "Áñéóôåñü ðåñéèþñéï" ; > ;
        < "Äåîéü ðåñéèþñéï" ; > ;
        < "Åîùôåñéêü ðåñéèþñéï" ; > ;
        < "Åóùôåñéêü ðåñéèþñéï" ; > ;
    };
    StringList [ korean ] =
    {
            < "[¾øÀ½]" ; > ;
        < "¿ÞÂÊ ¿©¹é" ; > ;
        < "¿À¸¥ÂÊ ¿©¹é" ; > ;
        < "¹Ù±ùÂÊ ¿©¹é" ; > ;
        < "¾ÈÂÊ ¿©¹é" ; > ;
    };
    StringList [ turkish ] =
    {
            < "[Yok]" ; > ;
        < "Sol kenar" ; > ;
        < "Sað kenar" ; > ;
        < "Dýþ kenar" ; > ;
        < "Ýç kenar" ; > ;
    };
    StringList [ language_user1 ] =
    {
            < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
    };
    };
    FixedText FT_LC_COL
    {
        Pos = MAP_APPFONT ( 65 , 109 ) ;
        Size = MAP_APPFONT ( 48 , 10 ) ;
        Text = "Farbe" ;
        Text [ English ] = "Color" ;
        Text [ english_us ] = "Color" ;
        Text [ portuguese_brazilian ] = "Farbe" ;
        Text [ swedish ] = "Färg" ;
        Text [ danish ] = "Farve" ;
        Text [ italian ] = "Colore" ;
        Text [ spanish ] = "Color" ;
        Text [ french ] = "Couleur" ;
        Text [ dutch ] = "Kleur" ;
        Text [ portuguese ] = "Cor" ;
        Text[ chinese_simplified ] = "ÑÕÉ«";
        Text[ russian ] = "Öâåò";
        Text[ polish ] = "Kolor";
        Text[ japanese ] = "F";
        Text[ chinese_traditional ] = "ÃC¦â";
        Text[ arabic ] = "Çááæä";
        Text[ greek ] = "×ñþìá";
        Text[ korean ] = "»ö»ó";
        Text[ turkish ] = "Renk";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_LC_COL
    {
        Pos = MAP_APPFONT ( 115 , 108 ) ;
        Size = MAP_APPFONT ( 80 , 60 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
    };
    Window WIN_MARK
    {
        Pos = MAP_APPFONT ( 198 , 92 ) ;
        Size = MAP_APPFONT ( 52 , 31 ) ;
    };
    GroupBox GB_LC
    {
        Pos = MAP_APPFONT ( 6 , 79 ) ;
        Size = MAP_APPFONT ( 248 , 50 ) ;
        Text = "Geänderte Zeilen" ;
        Text [ English ] = "Changed lines" ;
        Text [ portuguese ] = "Linhas modificadas" ;
        Text [ english_us ] = "Lines changed " ;
        Text [ portuguese_brazilian ] = "Geänderte Zeilen" ;
        Text [ swedish ] = "Ändrade rader" ;
        Text [ danish ] = "Ændrede rækker" ;
        Text [ italian ] = "Righe modificate" ;
        Text [ spanish ] = "Líneas modificadas" ;
        Text [ french ] = "Lignes modifiées" ;
        Text [ dutch ] = "Gewijzigde regels" ;
        Text[ chinese_simplified ] = "¸ü¸ÄµÄÐÐ";
        Text[ russian ] = "Èçìåíåííûå ñòðîêè";
        Text[ polish ] = "Zmienione wiersze";
        Text[ japanese ] = "•ύX‚µ‚½s";
        Text[ chinese_traditional ] = "Åܧ󪺦æ";
        Text[ arabic ] = "ÃÓØÑ ãÚÏáÉ";
        Text[ greek ] = "ÃñáììÝò ðïõ Ý÷ïõí áëëá÷èåß";
        Text[ korean ] = "¼±ÀÌ º¯°æµÇ¾ú½À´Ï´Ù.";
        Text[ turkish ] = "Deðiþtirilen satýrlar";
        Text[ language_user1 ] = " ";
    };
    String STR_AUTHOR
    {
        Text = "Nach Autor" ;
        Text [ English ] = "By author" ;
        Text [ portuguese ] = "Por autor" ;
        Text [ english_us ] = "By author" ;
        Text [ portuguese_brazilian ] = "Nach Autor" ;
        Text [ swedish ] = "Efter författare" ;
        Text [ danish ] = "Efter forfatter" ;
        Text [ italian ] = "Secondo autore" ;
        Text [ spanish ] = "Según autor" ;
        Text [ french ] = "Par auteur" ;
        Text [ dutch ] = "Naar auteur" ;
        Text[ chinese_simplified ] = "°´×÷Õß";
        Text[ russian ] = "Ïî àâòîðó";
        Text[ polish ] = "Wed³ug autora";
        Text[ japanese ] = "ì¬ŽÒ‚ɏ]‚Á‚Ä";
        Text[ chinese_traditional ] = "«ö·Ó§@ªÌ";
        Text[ arabic ] = "ÍÓÈ ÇáãÄáÝ";
        Text[ greek ] = "ÊáôÜ óõíôÜêôç";
        Text[ korean ] = "ÀÛ¼ºÀÚ¿¡ µû¶ó";
        Text[ turkish ] = "Yazana göre";
        Text[ language_user1 ] = " ";
    };
    String STR_NOTHING
    {
        Text = "[Keine]" ;
        Text [ English ] = "[None]" ;
        Text [ portuguese ] = "[nenhum]" ;
        Text [ english_us ] = "[None]" ;
        Text [ portuguese_brazilian ] = "[Keine]" ;
        Text [ swedish ] = "[Inga]" ;
        Text [ danish ] = "[Ingen]" ;
        Text [ italian ] = "[senza]" ;
        Text [ spanish ] = "[Ningún]" ;
        Text [ french ] = "[Aucun(e)]" ;
        Text [ dutch ] = "[Geen]" ;
        Text[ chinese_simplified ] = "[ÎÞ]";
        Text[ russian ] = "[Áåç]";
        Text[ polish ] = "[Brak]";
        Text[ japanese ] = "[‚È‚µ]";
        Text[ greek ] = "[ÊáíÝíá]";
        Text[ korean ] = "[¾øÀ½]";
        Text[ chinese_traditional ] = "[µL]";
        Text[ arabic ] = "[ÈÏæä]";
        Text[ turkish ] = "[Yok]";
    };
};
diff --git a/sw/source/ui/config/uinums.cxx b/sw/source/ui/config/uinums.cxx
new file mode 100644
index 0000000..46c35bf3
--- /dev/null
+++ b/sw/source/ui/config/uinums.cxx
@@ -0,0 +1,795 @@
/*************************************************************************
 *
 *  $RCSfile: uinums.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:33 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop


#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef SVTOOLS_URIHELPER_HXX
#include <svtools/urihelper.hxx>
#endif
#ifndef _STREAM_HXX //autogen
#include <tools/stream.hxx>
#endif
#ifndef _SFXCFGITEM_HXX //autogen
#include <sfx2/cfgitem.hxx>
#endif
#ifndef _SFX_INIMGR_HXX
#include <sfx2/inimgr.hxx>
#endif
#ifndef _SFXITEMITER_HXX //autogen
#include <svtools/itemiter.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif


#ifndef _TOOLS_RESID_HXX
#include <tools/resid.hxx>
#endif
#ifndef _FMTORNT_HXX //autogen
#include <fmtornt.hxx>
#endif
#ifndef _SWTYPES_HXX
#include <swtypes.hxx>      // Leerstring
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _UINUMS_HXX
#include <uinums.hxx>
#endif
#ifndef _POOLFMT_HXX
#include <poolfmt.hxx>
#endif
#ifndef _CHARFMT_HXX
#include <charfmt.hxx>
#endif
#ifndef _FRMATR_HXX
#include <frmatr.hxx>
#endif

#ifndef _CFGID_H
#include <cfgid.h>
#endif
#ifndef _CFGSTR_HRC
#include <cfgstr.hrc>
#endif

#define VERSION_30B     ((USHORT)250)
#define VERSION_31B     ((USHORT)326)
#define VERSION_40A     ((USHORT)364)
#define VERSION_50A     ((USHORT)373)
#define VERSION_53A     ((USHORT)596)
#define ACT_NUM_VERSION VERSION_53A

#define NUMRULE_FILENAME "numrule.cfg"
#define CHAPTER_FILENAME "chapter.cfg"
#define C2S(cChar) String::CreateFromAscii(cChar)
/*------------------------------------------------------------------------
 Beschreibung:  Ops. zum Laden / Speichern
------------------------------------------------------------------------*/


SV_IMPL_PTRARR( _SwNumFmtsAttrs, SfxPoolItem* )


// SwNumRulesWithName ----------------------------------------------------
// PUBLIC METHODES -------------------------------------------------------
/*------------------------------------------------------------------------
 Beschreibung:  Speichern einer Regel
 Parameter:     rCopy -- die zu speichernde Regel
                nIdx -- Position, an der die Regel zu speichern ist.
                        Eine alte Regel an dieser Position wird ueberschrieben.
------------------------------------------------------------------------*/

SwBaseNumRules::SwBaseNumRules( const String& rFileName )
    : nVersion(0),
    sFileName( rFileName ),
    bModified( FALSE )
{
    Init();
}

/*-----------------26.06.97 08.30-------------------

--------------------------------------------------*/
SwBaseNumRules::~SwBaseNumRules()
{
    if( bModified )
    {
        String sNm( SFX_INIMANAGER()->Get( SFX_KEY_USERCONFIG_PATH ));
        sNm = URIHelper::SmartRelToAbs(sNm);

        sNm += INET_PATH_TOKEN;
        sNm += sFileName;
        INetURLObject aTempObj(sNm);
        sNm = aTempObj.GetFull();
        SvFileStream aStrm( sNm, STREAM_WRITE | STREAM_TRUNC |
                                        STREAM_SHARE_DENYALL );
        Store( aStrm );
    }

    for( USHORT i = 0; i < nMaxRules; ++i )
        delete pNumRules[i];
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/
void  SwBaseNumRules::Init()
{
    for(USHORT i = 0; i < nMaxRules; ++i )
        pNumRules[i] = 0;

    String sNm( sFileName );
    if( SFX_INIMANAGER()->SearchFile( sNm, SFX_KEY_USERCONFIG_PATH ))
    {
        SvFileStream aStrm( sNm, STREAM_STD_READ );
        Load( aStrm );
    }
}

/*-----------------26.06.97 08.30-------------------

--------------------------------------------------*/

void SwBaseNumRules::ApplyNumRules(const SwNumRulesWithName &rCopy, USHORT nIdx)
{
    ASSERT(nIdx < nMaxRules, Array der NumRules ueberindiziert.);
    if( !pNumRules[nIdx] )
        pNumRules[nIdx] = new SwNumRulesWithName( rCopy );
    else
        *pNumRules[nIdx] = rCopy;
}
/*------------------------------------------------------------------------
 Beschreibung:  Zugriff auf eine Regel ueber ihren Namen
 Return:        Pointer auf die Regel oder Nullptr, wenn nicht vorhanden
------------------------------------------------------------------------*/


const SwNumRulesWithName *SwBaseNumRules::GetRules(const String &rName) const
{
    for(USHORT i = 0; i < nMaxRules; ++i)
    {
        SwNumRulesWithName *pRule = pNumRules[i];
        if( pRule && pRule->GetName() == rName)
            return pRule;
    }
    return 0;
}
// PROTECTED METHODES ----------------------------------------------------
/*------------------------------------------------------------------------
 Beschreibung:  Speichern
------------------------------------------------------------------------*/

BOOL /**/ SwBaseNumRules::Store(SvStream &rStream)
{
    rStream << ACT_NUM_VERSION;
        // Schreiben, welche Positionen durch eine Regel belegt sind
        // Anschliessend Schreiben der einzelnen Rules
    for(USHORT i = 0; i < nMaxRules; ++i)
    {
        if(pNumRules[i])
        {
            rStream << (unsigned char) TRUE;
            pNumRules[i]->Store( rStream );
        }
        else
            rStream << (unsigned char) FALSE;
    }
    return SfxConfigItem::ERR_OK;
}



/*------------------------------------------------------------------------
 Beschreibung:  Speichern / Laden
------------------------------------------------------------------------*/


int SwBaseNumRules::Load(SvStream &rStream)
{
    int         rc = SfxConfigItem::ERR_OK;

    rStream >> nVersion;

    // wegen eines kleinen aber schweren Fehlers schreibt die PreFinal die
    // gleiche VERSION_40A wie das SP2 #55402#
    if(VERSION_40A == nVersion)
    {
        DBG_ERROR("Version 364 ist nicht eindeutig #55402#")
    }
    else if( VERSION_30B == nVersion || VERSION_31B == nVersion ||
             ACT_NUM_VERSION >= nVersion )
    {
        unsigned char bRule = FALSE;
        for(USHORT i = 0; i < nMaxRules; ++i)
        {
            rStream >> bRule;
            if(bRule)
                pNumRules[i] = new SwNumRulesWithName( rStream, nVersion );
        }
    }
    else
    {
        rc = SfxConfigItem::WARNING_VERSION;
    }

    return rc;
}

/*-----------------26.06.97 08.34-------------------

--------------------------------------------------*/

/*------------------------------------------------------------------------*/


SwChapterNumRules::SwChapterNumRules() :
    SwBaseNumRules(C2S(CHAPTER_FILENAME))
{
}

/*------------------------------------------------------------------------*/

 SwChapterNumRules::~SwChapterNumRules()
{
}

/*-----------------26.06.97 08.23-------------------

--------------------------------------------------*/
void SwChapterNumRules::ApplyNumRules(const SwNumRulesWithName &rCopy, USHORT nIdx)
{
    bModified = TRUE;
    SwBaseNumRules::ApplyNumRules(rCopy, nIdx);
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

String   SwChapterNumRules::GetName() const
{
    return SW_RESSTR( STR_CFG_UINUM );
}

/*------------------------------------------------------------------------*/

SwNumRulesWithName::SwNumRulesWithName(const SwNumRule &rCopy,
                                        const String &rName)
    : aName(rName)
{
    for( int n = 0; n < MAXLEVEL; ++n )
    {
        const SwNumFmt* pFmt = rCopy.GetNumFmt( n );
        if( pFmt )
            aFmts[ n ] = new _SwNumFmtGlobal( *pFmt );
        else
            aFmts[ n ] = 0;
    }
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/
SwNumRulesWithName::SwNumRulesWithName( const SwNumRulesWithName& rCopy )
{
    memset( aFmts, 0, sizeof( aFmts ));
    *this = rCopy;
}


/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/
SwNumRulesWithName::~SwNumRulesWithName()
{
    for( int n = 0; n < MAXLEVEL; ++n )
        delete aFmts[ n ];
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/
const SwNumRulesWithName& SwNumRulesWithName::operator=(const SwNumRulesWithName &rCopy)
{
    if( this != &rCopy )
    {
        aName = rCopy.aName;
        for( int n = 0; n < MAXLEVEL; ++n )
        {
            delete aFmts[ n ];

            _SwNumFmtGlobal* pFmt = rCopy.aFmts[ n ];
            if( pFmt )
                aFmts[ n ] = new _SwNumFmtGlobal( *pFmt );
            else
                aFmts[ n ] = 0;
        }
    }
    return *this;
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/
SwNumRulesWithName::SwNumRulesWithName( SvStream &rStream, USHORT nVersion )
{
    CharSet eEncoding = gsl_getSystemTextEncoding();
    rStream.ReadByteString(aName, eEncoding);

    char c;
    for(USHORT n = 0; n < MAXLEVEL; ++n )
    {
        if( VERSION_30B == nVersion )
            c = 1;
        // wegen eines kleinen aber schweren Fehlers schreibt die PreFinal die
        // gleiche VERSION_40A wie das SP2 #55402#
        else if(nVersion < VERSION_40A && n > 5)
//      else if(nVersion < VERSION_50A && n > 5)
            c = 0;
        else
            rStream >> c;

        if( c )
            aFmts[ n ] = new _SwNumFmtGlobal( rStream, nVersion );
        else
            aFmts[ n ] = 0;
    }
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

void SwNumRulesWithName::MakeNumRule( SwWrtShell& rSh, SwNumRule& rChg ) const
{
    rChg = SwNumRule( aName );
    rChg.SetAutoRule( FALSE );
    _SwNumFmtGlobal* pFmt;
    for( USHORT n = 0; n < MAXLEVEL; ++n )
        if( 0 != ( pFmt = aFmts[ n ] ) )
        {
            SwNumFmt aNew;
            pFmt->ChgNumFmt( rSh, aNew );
            rChg.Set( n, aNew );
        }
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/
void SwNumRulesWithName::Store( SvStream &rStream )
{
    CharSet eEncoding = gsl_getSystemTextEncoding();
    rStream.WriteByteString(aName, eEncoding);

    for( USHORT n = 0; n < MAXLEVEL; ++n )
    {
        _SwNumFmtGlobal* pFmt = aFmts[ n ];
        if( pFmt )
        {
            rStream << (char)1;
            pFmt->Store( rStream );
        }
        else
            rStream << (char)0;
    }
}
/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/


SwNumRulesWithName::_SwNumFmtGlobal::_SwNumFmtGlobal( const SwNumFmt& rFmt )
    : aFmt( rFmt ), nCharPoolId( USHRT_MAX )
{
    // relative Abstaende ?????

    SwCharFmt* pFmt = rFmt.GetCharFmt();
    if( pFmt )
    {
        sCharFmtName = pFmt->GetName();
        nCharPoolId = pFmt->GetPoolFmtId();
        if( pFmt->GetAttrSet().Count() )
        {
            SfxItemIter aIter( pFmt->GetAttrSet() );
            const SfxPoolItem *pCurr = aIter.GetCurItem();
            while( TRUE )
            {
                aItems.Insert( pCurr->Clone(), aItems.Count() );
                if( aIter.IsAtEnd() )
                    break;
                pCurr = aIter.NextItem();
            }
        }

        aFmt.SetCharFmt( 0 );
    }
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

SwNumRulesWithName::_SwNumFmtGlobal::_SwNumFmtGlobal( const _SwNumFmtGlobal& rFmt )
    : aFmt( rFmt.aFmt ), nCharPoolId( rFmt.nCharPoolId ),
    sCharFmtName( rFmt.sCharFmtName )
{
    for( USHORT n = rFmt.aItems.Count(); n; )
        aItems.Insert( rFmt.aItems[ --n ]->Clone(), aItems.Count() );
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

SwNumRulesWithName::_SwNumFmtGlobal::_SwNumFmtGlobal( SvStream& rStream,
                                                        USHORT nVersion )
    : nCharPoolId( USHRT_MAX )
{
    CharSet eEncoding = gsl_getSystemTextEncoding();
    {
        USHORT nUS;
        sal_Char cChar;
        short nShort;
        BOOL bFlag;
        String sStr;

        rStream >> nUS;             aFmt.eType = SvxExtNumType( nUS );
        if( VERSION_53A > nVersion )
        {
            rStream >> cChar;       aFmt.SetBulletChar( cChar );
        }
        else
        {
            rStream >> nUS;         aFmt.SetBulletChar( nUS );
        }

        rStream >> bFlag;           aFmt.SetInclUpperLevel( bFlag );

        if( VERSION_30B == nVersion )
        {
            long nL;
            rStream >> cChar;       aFmt.SetStartValue( (USHORT)cChar );

            rStream.ReadByteString(sStr, eEncoding);
            aFmt.SetPrefix( sStr );
            rStream.ReadByteString(sStr, eEncoding);
            aFmt.SetPostfix( sStr );
            rStream >> nUS;         aFmt.SetAdjust( SvxAdjust( nUS ) );
            rStream >> nL;          aFmt.SetLSpace( lNumIndent );
            rStream >> nL;          aFmt.SetFirstLineOffset( (short)nL );
            aFmt.SetRelLSpace( TRUE );
        }
        else                // alter StartWert war ein Byte
        {
            rStream >> nUS;         aFmt.SetStartValue( nUS );
            rStream.ReadByteString(sStr, eEncoding);
            aFmt.SetPrefix( sStr );
            rStream.ReadByteString(sStr, eEncoding);
            aFmt.SetPostfix( sStr );
            rStream >> nUS;         aFmt.SetAdjust( SvxAdjust( nUS ) );
            rStream >> nUS;         aFmt.SetAbsLSpace( nUS );
            rStream >> nShort;      aFmt.SetFirstLineOffset( nShort );
            rStream >> nUS;         aFmt.SetCharTextOffset( nUS );
            rStream >> nShort;      aFmt.SetLSpace( nShort );
            rStream >> bFlag;       aFmt.SetRelLSpace( bFlag );
        }

        USHORT  nFamily;
        USHORT  nCharSet;
        short   nWidth;
        short   nHeight;
        USHORT  nPitch;
        String aName;

        rStream.ReadByteString(aName, eEncoding);
        rStream >> nFamily >> nCharSet >> nWidth >> nHeight >> nPitch;

        if( aName.Len() )
        {
            Font aFont( nFamily, Size( nWidth, nHeight ) );
            aFont.SetName( aName );
            aFont.SetCharSet( (CharSet)nCharSet );
            aFont.SetPitch( (FontPitch)nPitch );

            aFmt.SetBulletFont( &aFont );
        }
        else
            nCharSet = RTL_TEXTENCODING_SYMBOL;

        if( VERSION_53A > nVersion )
            aFmt.SetBulletChar( ByteString::ConvertToUnicode(
                                            aFmt.GetBulletChar(), nCharSet ));
    }

    if( VERSION_30B != nVersion )
    {
        USHORT nItemCount;
        rStream >> nCharPoolId;
        rStream.ReadByteString(sCharFmtName, eEncoding);
        rStream >> nItemCount;

        while( nItemCount-- )
        {
            USHORT nWhich, nVers;
            rStream >> nWhich >> nVers;
            aItems.Insert( GetDfltAttr( nWhich )->Create( rStream, nVers ),
                            aItems.Count() );
        }
    }

    if( VERSION_40A == nVersion && SVX_NUM_BITMAP == aFmt.eType )
    {
        BYTE cF;
        Size aSz;

        rStream >> aSz.Width() >> aSz.Height();

        rStream >> cF;
        if( cF )
        {
            SvxBrushItem* pBrush = 0;
            SwFmtVertOrient* pVOrient = 0;
            USHORT nVer;

            if( cF & 1 )
            {
                rStream >> nVer;
                pBrush = (SvxBrushItem*)GetDfltAttr( RES_BACKGROUND )
                                        ->Create( rStream, nVer );
            }

            if( cF & 2 )
            {
                rStream >> nVer;
                pVOrient = (SwFmtVertOrient*)GetDfltAttr( RES_VERT_ORIENT )
                                        ->Create( rStream, nVer );
            }
            aFmt.SetGrfBrush( pBrush, &aSz, pVOrient );
        }
    }
}


/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

SwNumRulesWithName::_SwNumFmtGlobal::~_SwNumFmtGlobal()
{
}
/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/


void SwNumRulesWithName::_SwNumFmtGlobal::Store( SvStream& rStream )
{
    CharSet eEncoding = gsl_getSystemTextEncoding();
    {
        String aName;
        USHORT nFamily = FAMILY_DONTKNOW, nCharSet = 0, nPitch = 0;
        short  nWidth = 0, nHeight = 0;

        const Font* pFnt = aFmt.GetBulletFont();
        if( pFnt )
        {
            aName = pFnt->GetName();
            nFamily = (USHORT)pFnt->GetFamily();
            nCharSet = (USHORT)pFnt->GetCharSet();
            nWidth = (short)pFnt->GetSize().Width();
            nHeight = (short)pFnt->GetSize().Height();
            nPitch = (USHORT)pFnt->GetPitch();
        }

        rStream << USHORT(aFmt.eType)
                << aFmt.GetBulletChar()
                << aFmt.IsInclUpperLevel()
                << aFmt.GetStartValue();
        rStream.WriteByteString( aFmt.GetPrefix(), eEncoding );
        rStream.WriteByteString( aFmt.GetPostfix(), eEncoding );
        rStream << USHORT( aFmt.GetAdjust() )
                << aFmt.GetAbsLSpace()
                << aFmt.GetFirstLineOffset()
                << aFmt.GetCharTextOffset()
                << aFmt.GetLSpace()
                << aFmt.IsRelLSpace();
        rStream.WriteByteString( aName, eEncoding );
        rStream << nFamily
                << nCharSet
                << nWidth
                << nHeight
                << nPitch;
    }
    rStream << nCharPoolId;
    rStream.WriteByteString( sCharFmtName, eEncoding );
    rStream << aItems.Count();

    for( USHORT n = aItems.Count(); n; )
    {
        SfxPoolItem* pItem = aItems[ --n ];
        USHORT nIVers = pItem->GetVersion( SOFFICE_FILEFORMAT_NOW );
        ASSERT( nIVers != USHRT_MAX,
                "Was'n das: Item-Version USHRT_MAX in der aktuellen Version" );
        rStream << pItem->Which()
                << nIVers;
        pItem->Store( rStream, nIVers );
    }

    // Erweiterungen fuer Version 40A

    if( SVX_NUM_BITMAP == aFmt.eType )
    {
        rStream << (INT32)aFmt.GetGrfSize().Width()
                << (INT32)aFmt.GetGrfSize().Height();
        BYTE cFlg = ( 0 != aFmt.GetGrfBrush() ? 1 : 0 ) +
                    ( 0 != aFmt.GetGrfOrient() ? 2 : 0 );
        rStream << cFlg;

        if( aFmt.GetGrfBrush() )
        {
            USHORT nVersion = aFmt.GetGrfBrush()->GetVersion( SOFFICE_FILEFORMAT_NOW );
            rStream << nVersion;
            aFmt.GetGrfBrush()->Store( rStream, nVersion );
        }
        if( aFmt.GetGrfOrient() )
        {
            USHORT nVersion = aFmt.GetGrfOrient()->GetVersion( SOFFICE_FILEFORMAT_NOW );
            rStream << nVersion;
            aFmt.GetGrfOrient()->Store( rStream, nVersion );
        }
    }
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

void SwNumRulesWithName::_SwNumFmtGlobal::ChgNumFmt( SwWrtShell& rSh,
                            SwNumFmt& rNew ) const
{
    SwCharFmt* pFmt = 0;
    if( sCharFmtName.Len() )
    {
        // suche erstmal ueber den Namen
        USHORT nArrLen = rSh.GetCharFmtCount();
        for( USHORT i = 1; i < nArrLen; ++i )
        {
            pFmt = &rSh.GetCharFmt( i );
            if( COMPARE_EQUAL == pFmt->GetName().CompareTo( sCharFmtName ))
                // ist vorhanden, also belasse die Attribute wie sie sind!
                break;
            pFmt = 0;
        }

        if( !pFmt )
        {
            if( IsPoolUserFmt( nCharPoolId ) )
            {
                pFmt = rSh.MakeCharFmt( sCharFmtName );
                pFmt->SetAuto( FALSE );
            }
            else
                pFmt = rSh.GetCharFmtFromPool( nCharPoolId );

            if( !pFmt->GetDepends() )       // Attribute setzen
                for( USHORT n = aItems.Count(); n; )
                    pFmt->SetAttr( *aItems[ --n ] );
        }
    }
    ((SwNumFmt&)aFmt).SetCharFmt( pFmt );
    rNew = aFmt;
    if( pFmt )
        ((SwNumFmt&)aFmt).SetCharFmt( 0 );
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.69  2000/09/18 16:05:18  willem.vandorp
    OpenOffice header added.

    Revision 1.68  2000/07/26 10:46:37  jp
    Bulletchar is now an unicode char, so we must write a new format

    Revision 1.67  2000/07/24 12:55:43  jp
    Bug #76561#: convert Bulletchar to unicode

    Revision 1.66  2000/06/26 13:09:13  os
    INetURLObject::SmartRelToAbs removed

    Revision 1.65  2000/06/07 13:08:17  os
    using UCB

    Revision 1.64  2000/04/20 12:50:49  os
    GetName() returns String&

    Revision 1.63  2000/04/11 08:02:24  os
    UNICODE

    Revision 1.62  2000/03/03 15:16:59  os
    StarView remainders removed

    Revision 1.61  1999/10/21 17:47:37  jp
    have to change - SearchFile with SfxIniManager, dont use SwFinder for this

    Revision 1.60  1998/11/17 09:50:14  OS
    #58263# NumType durch SvxExtNumType ersetzt


      Rev 1.59   17 Nov 1998 10:50:14   OS
   #58263# NumType durch SvxExtNumType ersetzt

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/config/usrpref.cxx b/sw/source/ui/config/usrpref.cxx
new file mode 100644
index 0000000..1180dc1
--- /dev/null
+++ b/sw/source/ui/config/usrpref.cxx
@@ -0,0 +1,818 @@
/*************************************************************************
 *
 *  $RCSfile: usrpref.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:33 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _STREAM_HXX //autogen
#include <tools/stream.hxx>
#endif


#include "swtypes.hxx"
#include "hintids.hxx"
#include "uitool.hxx"
#include "usrpref.hxx"
#include "crstate.hxx"
#include "cfgid.h"
#include "cfgstr.hrc"
#ifndef _OFA_OSPLCFG_HXX
#include <offmgr/osplcfg.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif

#ifndef _LINGU_LNGPROPS_HHX_
#include <lingu/lngprops.hxx>
#endif
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
#include <com/sun/star/beans/XPropertySet.hpp>
#endif

using namespace ::com::sun::star;
using namespace ::rtl;

#define C2U(cChar) OUString::createFromAscii(cChar)
#define C2S(cChar) String::CreateFromAscii(cChar)

#define VERSION_30B     ((sal_uInt16)250)   //Beta1 ??
#define VERSION_30B2    ((sal_uInt16)251)   //Beta2
#define VERSION_30B3    ((sal_uInt16)252)   //Beta2.9
#define VERSION_30B4    ((sal_uInt16)253)   //Beta3.1
#define VERSION_30B5    ((sal_uInt16)254)   //Beta4
#define VERSION_30B6    ((sal_uInt16)256)   //Beta6
#define VERSION_301B6   ((sal_uInt16)257)   //Beta6+OnlineSpelling
#define VERSION_301_03  ((sal_uInt16)258)   //Flag fuer BrowseMode
#define VERSION_301_04  ((sal_uInt16)259)   //Flag fuer Massstab beibehalten (Crop)
#define VERSION_391_05  ((sal_uInt16)260)   //Endlich das product/non-product chaos aufgeloest.
#define VERSION_302_01  ((sal_uInt16)313)   //Zusammenfassung der Optionen ab SV 313
#define VERSION_302_02  ((sal_uInt16)325)   //nTblDest neu
#define VERSION_326e    ((sal_uInt16)326)   //PrintPageBack neu
#define VERSION_327c    ((sal_uInt16)327)   //ExecHyperlinks neu
#define VERSION_328     ((sal_uInt16)328)   //HtmlMode
#define VERSION_332     ((sal_uInt16)332)   //DefaultBackground
#define VERSION_333     ((sal_uInt16)333)   //Symbolfont-Position
#define VERSION_346     ((sal_uInt16)346)   //nCore2Options neu
#define VERSION_349     ((sal_uInt16)349)   //TabDist und UndoCount raus
#define VERSION_4SP2a   ((sal_uInt16)400)   //HiddenPara, Fixpack II
#define VERSION_371     ((sal_uInt16)471)   //ShadowCrsr
#define VERSION_388     ((sal_uInt16)500)   //BackgroundBrush -> Background Color
#define VERSION_511     ((sal_uInt16)511)   //Bereichsbegrenzung, Cursor in gesch. Zonen
#define VERSION_512     ((sal_uInt16)512)   //index background flag and color


// mit der naechsten Version koennen die Dummies fuer die TabDist raus

#define USRPEF_VERSION VERSION_512


sal_Bool bNotLoadLayout = sal_False;    // fuer MD


void SwMasterUsrPref::SetUsrPref(const SwViewOption &rCopy)
{
    *((SwViewOption*)this) = rCopy;

#ifndef PRODUCT
    bNotLoadLayout = rCopy.IsTest1();       // MD Layout lesen
#endif
}

/*------------------------------------------------------------------------
 Beschreibung:  Schreiben / Lesen Konfiguration.
                Die einzelnen Bits des Bitfeldes muessen als
                char geschrieben werden, da die Bits eines Bytes
                auf den verschiedenen Plattformen unterschiedlich
                abgelegt werden.
------------------------------------------------------------------------*/


sal_Bool  SwMasterUsrPref::Store(SvStream& rStream)
{
    rStream << USRPEF_VERSION;

#ifdef PRODUCT
    rStream << sal_Int8(1);
#else
    rStream << sal_Int8(0);
#endif

    rStream << nCoreOptions;
    rStream << nCore2Options;
    rStream << nUIOptions;

    rStream << sal_uInt32(GetSnapSize().Width());
    rStream << sal_uInt32(GetSnapSize().Height());
    rStream << sal_uInt16(GetDivisionX());
    rStream << sal_uInt16(GetDivisionY());

    rStream << sal_uInt16(GetZoom());
    rStream << sal_uInt16(eZoom);
    rStream << sal_Int8(nTblDest);

    rStream << sal_uInt16(::GetDfltMetric(sal_False));

    rStream.WriteByteString(sSymbolFont, gsl_getSystemTextEncoding());

    rStream << sal_Int8(GetPagePrevRow());
    rStream << sal_Int8(GetPagePrevCol());

    rStream << sal_uInt32(GetRetoucheColor().GetColor());

    rStream << (sal_Int8)nShdwCrsrFillMode;
    rStream << (sal_uInt32)aShdwCrsrCol.GetColor();

    rStream << (sal_uInt32)aIdxBackgrndCol.GetColor();

#ifndef PRODUCT
    sal_Int8 nFlags3 = 0;
    if ( bTest1 ) nFlags3 |= 0x01;
    if ( bTest2 ) nFlags3 |= 0x02;
    if ( bTest3 ) nFlags3 |= 0x04;
    if ( bTest4 ) nFlags3 |= 0x08;
    if ( bTest5 ) nFlags3 |= 0x10;
    if ( bTest6 ) nFlags3 |= 0x20;
    if ( bTest7 ) nFlags3 |= 0x40;
    if ( bTest8 ) nFlags3 |= 0x80;
    rStream << nFlags3;
#endif

    return SfxConfigItem::ERR_OK;
}



int  SwMasterUsrPref::Load(SvStream& rStream)
{
    SetDefault( sal_False );

    sal_uInt16 nVersion;
    rStream >> nVersion;

    sal_Int8 nProductFlag;
    if ( nVersion >= VERSION_391_05 )
        rStream >> nProductFlag;

    if( nVersion >= VERSION_30B6 && nVersion < VERSION_302_01 )
    {
        nCore2Options = VIEWOPT_CORE2_BLACKFONT;
        sal_uInt16 nFlags;
        rStream >> nFlags;
        nUIOptions = 0;
        nUIOptions |= (nFlags & 0x0001) ? VIEWOPT_2_TOOLBOX         : 0 ;
        nUIOptions |= (nFlags & 0x0002) ? VIEWOPT_2_TOOLBOXTEXT     : 0 ;
        nUIOptions |= (nFlags & 0x0004) ? VIEWOPT_2_TOOLBOXBITMAP   : 0 ;
        nUIOptions |= (nFlags & 0x0008) ? VIEWOPT_2_TOOLBOXBOTH     : 0 ;
        nUIOptions |= (nFlags & 0x0010) ? VIEWOPT_2_TOOLBOXLEFT     : 0 ;
        nUIOptions |= (nFlags & 0x0020) ? VIEWOPT_2_TOOLBOXRIGHT    : 0 ;
        nUIOptions |= (nFlags & 0x0040) ? VIEWOPT_2_TOOLBOXTOP      : 0 ;
        nUIOptions |= (nFlags & 0x0080) ? VIEWOPT_2_TOOLBOXBOTTOM   : 0 ;
        nUIOptions |= (nFlags & 0x0100) ? VIEWOPT_2_UNUSED1         : 0 ;
        nUIOptions |= (nFlags & 0x0200) ? VIEWOPT_2_RIBBONBAR       : 0 ;
        nUIOptions |= (nFlags & 0x0400) ? VIEWOPT_2_TABWIN          : 0 ;
        nUIOptions |= (nFlags & 0x0800) ? VIEWOPT_2_VSCROLLBAR      : 0 ;
        nUIOptions |= (nFlags & 0x1000) ? VIEWOPT_2_HSCROLLBAR      : 0 ;
        nUIOptions |= (nFlags & 0x2000) ? VIEWOPT_2_STATUSLINE      : 0 ;
        nUIOptions |= (nFlags & 0x4000) ? VIEWOPT_2_VLIN            : 0 ;
        nUIOptions |= (nFlags & 0x8000) ? VIEWOPT_2_SVLOOK          : 0 ;


        sal_uInt32 nFlags2;
        rStream >> nFlags2;
        nCoreOptions = VIEWOPT_1_IDLE;
        nCoreOptions |= (nFlags2 & 0x00000001) ? VIEWOPT_1_TAB        : 0;
        nCoreOptions |= (nFlags2 & 0x00000002) ? VIEWOPT_1_BLANK      : 0;
        nCoreOptions |= (nFlags2 & 0x00000004) ? VIEWOPT_1_HARDBLANK  : 0;
        nCoreOptions |= (nFlags2 & 0x00000008) ? VIEWOPT_1_PARAGRAPH  : 0;
        nCoreOptions |= (nFlags2 & 0x00000010) ? VIEWOPT_1_LINEBREAK  : 0;
        nCoreOptions |= (nFlags2 & 0x00000020) ? VIEWOPT_1_PAGEBREAK  : 0;
        nCoreOptions |= (nFlags2 & 0x00000040) ? VIEWOPT_1_COLUMNBREAK: 0;
        nCoreOptions |= (nFlags2 & 0x00000080) ? VIEWOPT_1_SOFTHYPH   : 0;
        nCoreOptions |= (nFlags2 & 0x00000100) ? VIEWOPT_1_TOX        : 0;
        nCoreOptions |= (nFlags2 & 0x00000200) ? VIEWOPT_1_REF        : 0;
        nCoreOptions |= (nFlags2 & 0x00000400) ? VIEWOPT_1_FLDNAME    : 0;
        nCoreOptions |= (nFlags2 & 0x00000800) ? VIEWOPT_1_FIELD      : 0;
        nCoreOptions |= (nFlags2 & 0x00001000) ? VIEWOPT_1_FOOTNOTE   : 0;
        nCoreOptions |= (nFlags2 & 0x00002000) ? VIEWOPT_1_POSTITS    : 0;
        nCoreOptions |= (nFlags2 & 0x00004000) ? VIEWOPT_1_HIDDEN     : 0;
        nCoreOptions |= (nFlags2 & 0x00008000) ? VIEWOPT_1_SUBSLINES  : 0;
        nCoreOptions |= (nFlags2 & 0x00010000) ? VIEWOPT_1_GRAPHIC    : 0;
        nCoreOptions |= (nFlags2 & 0x00020000) ? VIEWOPT_1_TABLE      : 0;
        nCoreOptions |= (nFlags2 & 0x00040000) ? VIEWOPT_1_SUBSTABLE  : 0;
        nCoreOptions |= (nFlags2 & 0x00080000) ? VIEWOPT_1_CROSSHAIR  : 0;
        nCoreOptions |= (nFlags2 & 0x00100000) ? VIEWOPT_1_SNAP       : 0;
        nCoreOptions |= (nFlags2 & 0x00200000) ? VIEWOPT_1_SYNCHRONIZE: 0;
        nCoreOptions |= (nFlags2 & 0x00400000) ? VIEWOPT_1_GRIDVISIBLE: 0;
        nCoreOptions |= (nFlags2 & 0x00800000) ? VIEWOPT_1_DRAW       : 0;

        sal_uInt32 lWidth, lHeight;
        rStream >> lWidth;
        rStream >> lHeight;
         Size aSz( lWidth, lHeight );
        SetSnapSize( aSz );

        sal_uInt16 sVal;
        rStream >> sVal;
        SetDivisionX( sVal );
        rStream >> sVal;
        SetDivisionY( sVal );

        sal_uInt16 nZoom;
        rStream >> nZoom;
        SetZoom( nZoom );
        rStream >> nZoom;
        eZoom = int(nZoom);
        nTblDest = TBL_DEST_CELL;

        sal_uInt16 nMet;
        //Default-Tabulator und Metric
        // werden noch gelesen/geschrieben, damit die Version bleiben kann
        rStream >> nMet;
        rStream >> nMet;

        sal_Int8 nPrev;
        rStream >> nPrev;
        SetPagePrevRow(nPrev);
        rStream >> nPrev;
        SetPagePrevCol(nPrev);

        sal_uInt16 nUndo;
        rStream >> nUndo;

        if( nVersion > VERSION_30B6 )
        {
            rStream >> nPrev;
            SetKeepRatio( nPrev );
        }
        else
            SetKeepRatio( sal_False );
        if( nVersion > VERSION_301_03 )
        {
            rStream >> nPrev;
            SetGrfKeepZoom( nPrev ) ;
        }
        else
            SetGrfKeepZoom( sal_False );

#ifndef PRODUCT
    if ( nVersion < VERSION_391_05 || nProductFlag == sal_Int8(0) )
    {
        sal_Int8 nFlags3;
        rStream >> nFlags3;
        bTest1 = sal_Int8( (nFlags3 & 0x01) != 0 );
        if(bNotLoadLayout && !bTest1)
            DBG_ERROR("Layout wird doch geladen - nochmal versuchen!")
        bNotLoadLayout  = bTest1;

        bTest2 = sal_Int8( (nFlags3 & 0x02) != 0 );
        bTest3 = sal_Int8( (nFlags3 & 0x04) != 0 );
        bTest4 = sal_Int8( (nFlags3 & 0x08) != 0 );
        bTest5 = sal_Int8( (nFlags3 & 0x10) != 0 );
        bTest6 = sal_Int8( (nFlags3 & 0x20) != 0 );
        bTest7 = sal_Int8( (nFlags3 & 0x40) != 0 );
        bTest8 = sal_Int8( (nFlags3 & 0x80) != 0 );
    }
    else
        bTest1 = bTest2 = bTest3 = bTest4 = bTest5 = bTest6 =
        bTest7 = bTest8 = bNotLoadLayout = sal_False;
#endif
    }
    else if( nVersion >= VERSION_302_01)
    {
        rStream >> nCoreOptions;
        nCoreOptions |= VIEWOPT_1_IDLE;
        if( nVersion < VERSION_326e )
            nCoreOptions |= VIEWOPT_1_PAGEBACK;
        if(nVersion >= VERSION_346)
        {
            rStream >> nCore2Options;
            if ( nVersion < VERSION_4SP2a )
                nCore2Options |= VIEWOPT_CORE2_HIDDENPARA;
        }
        else
            nCore2Options = VIEWOPT_CORE2_BLACKFONT | VIEWOPT_CORE2_HIDDENPARA;

        if(nVersion < VERSION_511)
        {
            nCore2Options &= ~VIEWOPT_CORE2_SECTION_BOUNDS;
            nCore2Options |= VIEWOPT_CORE2_CRSR_IN_PROT;
        }
        if(nVersion < VERSION_512)
        {
            nCore2Options |= VIEWOPT_CORE2_INDEX_BACKGROUND;
        }

        rStream >> nUIOptions;
        if( nVersion < VERSION_327c )
            nUIOptions |= VIEWOPT_2_EXECHYPERLINKS;
        sal_uInt32 lWidth, lHeight;
        rStream >> lWidth;
        rStream >> lHeight;
         Size aSz( lWidth, lHeight );
        SetSnapSize( aSz );

        sal_uInt16 sVal;
        rStream >> sVal;
        SetDivisionX( sVal );
        rStream >> sVal;
        SetDivisionY( sVal );

        sal_uInt16 nZoom;
        rStream >> nZoom;
        SetZoom( nZoom );
        rStream >> nZoom;
        eZoom = int(nZoom);
        if(nVersion >= VERSION_302_02)
        {
            sal_Int8 nDest;
            rStream >> nDest;
            nTblDest = Min((sal_Int8)TBL_DEST_TBL, nDest);
        }
        else
        {
            nTblDest = TBL_DEST_CELL;
        }


        sal_uInt16 nMet;
        //Default-Tabulator und Metric
        // werden noch gelesen/geschrieben, damit die Version bleiben kann
        rStream >> nMet;
        if(nVersion < VERSION_349)
            rStream >> nMet;

        if(nVersion >= VERSION_333)
            rStream.ReadByteString(sSymbolFont, gsl_getSystemTextEncoding());

        sal_Int8 nPrev;
        rStream >> nPrev;
        SetPagePrevRow(nPrev);
        rStream >> nPrev;
        SetPagePrevCol(nPrev);

        // Undo einlesen
        if(nVersion < VERSION_349)
        {
            sal_uInt16 nUndo;
            rStream >> nUndo;
        }

        if(nVersion >= VERSION_332)
        {
            sal_uInt32 nColor;
            if ( nVersion < VERSION_388 )
            {
                sal_Int8 nStyle;
                if(GetType() == CFG_USERPREF_ITEM)
                {
                    // fuer Textdokumente wird keine Farbe gesetzt!
                    rStream >> nColor;
                    rStream >> nColor;
                    rStream >> nStyle;
                    rStream >> nStyle;
                }
                else
                {
                    rStream >> nColor;
                    aRetoucheColor.SetColor( nColor );
                    rStream >> nColor;
                    rStream >> nStyle;
                    if ( nStyle == 0 /*BRUSH_NULL*/ )
                        aRetoucheColor.SetColor( COL_TRANSPARENT );
                    rStream >> nStyle;
                }
            }
            else
            {
                if ( GetType() == CFG_USERPREF_ITEM )
                    rStream >> nColor;
                else
                {
                    rStream >> nColor;
                    aRetoucheColor.SetColor( nColor );
                }
            }
        }
        if(nVersion >= VERSION_371)
        {
            sal_Int8 nMode;
            sal_uInt32 nColor;
            rStream >> nMode;
            rStream >> nColor;

            aShdwCrsrCol.SetColor( nColor );
            nShdwCrsrFillMode = nMode;
        }
        if(nVersion >= VERSION_512)
        {
            sal_uInt32 nColor;
            rStream >> nColor;
            aIdxBackgrndCol.SetColor(nColor);
        }

#ifndef PRODUCT
    if ( nVersion < VERSION_391_05 || nProductFlag == sal_Int8(0) )
    {
        sal_Int8 nFlags3;
        rStream >> nFlags3;
        bTest1 = sal_Int8( (nFlags3 & 0x01) != 0 );
        if(bNotLoadLayout && !bTest1)
            DBG_ERROR("Layout wird doch geladen - nochmal versuchen!")
        bNotLoadLayout  = bTest1;
        bTest2 = sal_Int8( (nFlags3 & 0x02) != 0 );
        bTest3 = sal_Int8( (nFlags3 & 0x04) != 0 );
        bTest4 = sal_Int8( (nFlags3 & 0x08) != 0 );
        bTest5 = sal_Int8( (nFlags3 & 0x10) != 0 );
        bTest6 = sal_Int8( (nFlags3 & 0x20) != 0 );
        bTest7 = sal_Int8( (nFlags3 & 0x40) != 0 );
        bTest8 = sal_Int8( (nFlags3 & 0x80) != 0 );
    }
    else
        bTest1 = bTest2 = bTest3 = bTest4 = bTest5 = bTest6 =
        bTest7 = bTest8 = bNotLoadLayout = sal_False;
#endif
    }
    else
        return SfxConfigItem::WARNING_VERSION;

    uno::Reference< beans::XPropertySet >  xProp( ::GetLinguPropertySet() );

    sal_Bool bVal;
    bVal = xProp.is() ?
            *(sal_Bool*)xProp->getPropertyValue( C2U(UPN_IS_SPELL_AUTO) ).getValue() : sal_False;
    SetOnlineSpell( bVal );
    bVal = xProp.is() ?
            *(sal_Bool*)xProp->getPropertyValue( C2U(UPN_IS_SPELL_HIDE) ).getValue() : sal_False;
    SetHideSpell( bVal );
    return SfxConfigItem::ERR_OK;
}


void  SwMasterUsrPref::UseDefault()
{
    nUIOptions =    VIEWOPT_2_TOOLBOXBITMAP | VIEWOPT_2_TOOLBOXTOP |
                    VIEWOPT_2_TOOLBOX | VIEWOPT_2_RIBBONBAR |
                    VIEWOPT_2_TABWIN | VIEWOPT_2_STATUSLINE |
                    VIEWOPT_2_VSCROLLBAR | VIEWOPT_2_HSCROLLBAR |
                    VIEWOPT_2_SVLOOK| VIEWOPT_2_EXECHYPERLINKS;
    nCore2Options = VIEWOPT_CORE2_BLACKFONT | VIEWOPT_CORE2_HIDDENPARA|
                    VIEWOPT_CORE2_CRSR_IN_PROT| VIEWOPT_CORE2_INDEX_BACKGROUND|
                    VIEWOPT_CORE2_SECTION_BOUNDS;

    eZoom = 0;
    nTblDest = TBL_DEST_CELL;

    sSymbolFont = aEmptyStr;

    aShdwCrsrCol.SetColor( COL_BLUE );
    nShdwCrsrFillMode = FILL_TAB;

    aIdxBackgrndCol.SetColor( RGB_COLORDATA( 0xF0, 0xF0, 0xF0 ) );

    uno::Reference< beans::XPropertySet >  xProp( ::GetLinguPropertySet() );

    sal_Bool bVal;
    bVal = xProp.is() ?
            *(sal_Bool*)xProp->getPropertyValue( C2U(UPN_IS_SPELL_AUTO) ).getValue() : sal_False;
    SetOnlineSpell( bVal );
    bVal = xProp.is() ?
            *(sal_Bool*)xProp->getPropertyValue( C2U(UPN_IS_SPELL_HIDE) ).getValue() : sal_False;
    SetHideSpell( bVal );
    SfxConfigItem::UseDefault();
}


SwMasterUsrPref::SwMasterUsrPref(sal_uInt16 nType) :
    SfxConfigItem( nType )
{}


String  SwMasterUsrPref::GetName() const
{
    String sName(SW_RES( STR_CFG_USRPREF ));
    if(GetType() != CFG_USERPREF_ITEM)
        sName.SearchAndReplace(C2S("StarOffice Writer"), C2S("StarOffice  Writer/Web"));
    return sName;
}
/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.128  2000/09/18 16:05:18  willem.vandorp
    OpenOffice header added.

    Revision 1.127  2000/04/11 08:02:24  os
    UNICODE

    Revision 1.126  2000/03/23 08:17:22  os
    UNO III

    Revision 1.125  2000/03/03 15:16:59  os
    StarView remainders removed

    Revision 1.124  2000/02/24 17:26:00  hr
    43447#: gcc

    Revision 1.123  2000/01/19 18:24:06  jp
    Bug #72118#: change default of view sectionboundaries

    Revision 1.122  1999/12/10 13:07:24  tl
    #70383# SvxGetLinguPropertySet => ::GetLinguPropertySet

    Revision 1.121  1999/11/24 18:26:26  tl
    check for Service availability

    Revision 1.120  1999/11/19 16:40:22  os
    modules renamed

    Revision 1.119  1999/10/25 19:47:09  tl
    ongoing ONE_LINGU implementation

    Revision 1.118  1999/10/22 11:06:41  os
    index background with a lighter background

    Revision 1.117  1999/10/13 14:19:58  os
    index background in light gray

    Revision 1.116  1999/08/31 08:46:22  TL
    #if[n]def ONE_LINGU inserted (for transition of lingu to StarOne)


      Rev 1.115   31 Aug 1999 10:46:22   TL
   #if[n]def ONE_LINGU inserted (for transition of lingu to StarOne)

      Rev 1.114   09 Jun 1999 13:22:42   OS
   index background

      Rev 1.113   19 May 1999 13:32:56   OS
   #61245# DBG_ERROR, wenn Layout trotz CtrlAltL geladen wird

      Rev 1.112   27 Jan 1999 10:03:10   OS
   #58677# Cursor in Readonly-Bereichen

      Rev 1.111   08 Sep 1998 16:49:52   OS
   #56134# Metric fuer Text und HTML getrennt

      Rev 1.110   31 Aug 1998 11:19:14   OS
   #55750# OnlineSpelling immer aus der OFA uebernehmen

      Rev 1.109   12 Jun 1998 09:44:14   OS
   Konfigurationsnamen berichtigt

      Rev 1.108   29 Apr 1998 09:27:06   MA
   BackgroundBrush -> RetoucheColor

      Rev 1.107   24 Nov 1997 17:58:48   MA
   include

      Rev 1.106   11 Nov 1997 14:04:28   MA
   precomp entfernt

      Rev 1.105   03 Nov 1997 16:12:36   JP
   neu: Optionen/-Page/Basic-Schnittst. fuer ShadowCursor

      Rev 1.104   16 Sep 1997 13:23:10   OS
   Color fuer VCL nicht konvertieren, fuer TextDocs Brush nie laden #43824#

      Rev 1.103   08 Aug 1997 16:11:40   OS
   IDLE-Flag auch in der aktuellen Version im Load immer einschalten #42510#

      Rev 1.102   09 Jun 1997 14:28:44   MA
   chg: Browse-Flag nur noch am Doc

      Rev 1.101   06 Jun 1997 12:44:14   MA
   chg: versteckte Absaetze ausblenden

      Rev 1.100   31 Jan 1997 13:41:24   OS
   alten Code fuer Metric geloescht

      Rev 1.99   27 Jan 1997 16:30:04   OS
   HtmlMode entfernt

      Rev 1.98   13 Dec 1996 14:33:32   OS
   UndoCount wird aus der SfxApp besorgt

      Rev 1.97   10 Dec 1996 16:58:48   OS
   TabDist ab sofort in der OFA

      Rev 1.96   09 Dec 1996 17:02:02   OS
   Grenzwerte fuer TblDest und Metric beim Load ueberpruefen

      Rev 1.95   28 Nov 1996 15:20:24   OS
   neu: Schwarz drucken

      Rev 1.94   18 Nov 1996 10:26:22   OS
   includes berichtigt

      Rev 1.93   11 Nov 1996 09:22:12   MA
   ResMgr

      Rev 1.92   17 Oct 1996 16:43:44   OS
   Altlasten der BrowseUsrPref entfernt

      Rev 1.91   25 Sep 1996 11:11:48   OS
   IsTransparent wird jetzt auch gespeichert

      Rev 1.90   30 Aug 1996 08:44:06   OS
   neu: sSymbolFont

      Rev 1.89   26 Aug 1996 16:56:10   OS
   neu: Brush fuer BrowseView

      Rev 1.88   25 Jul 1996 15:35:36   OS
   neu : HTML-Mode

      Rev 1.87   22 Jul 1996 15:06:30   OS
   neu: ..EXECHYPERLINKS

      Rev 1.86   16 Jul 1996 20:19:50   MA
   includes

      Rev 1.85   16 Jul 1996 15:52:20   MA
   new: PrintPageBackground

      Rev 1.84   10 Jul 1996 12:01:26   OS
   neu: nTblDest : Ziel fuer Tabellenhintergrund

      Rev 1.83   28 Jun 1996 10:11:42   OS
   UseDefault: Basisklasse rufen

      Rev 1.82   07 May 1996 08:32:06   OS
   im Laden der UsrPref Browse-Optionen absichern

      Rev 1.81   27 Apr 1996 14:53:14   OS
   Idle-Flag im Load setzen

      Rev 1.80   26 Apr 1996 13:54:16   OS
   Versionspruefung korrigiert

      Rev 1.79   25 Apr 1996 16:21:58   OS
   ViewOptions ohne sal_Bool, dafuer massenweise defines

      Rev 1.78   24 Apr 1996 15:09:00   OS
   Umstellung UsrPref/ViewOption

      Rev 1.77   25 Mar 1996 19:45:50   MA
   wechsel product/non-product

      Rev 1.76   21 Mar 1996 12:51:50   OS
   neu: bGrfKeepZoom fuer CropPage

      Rev 1.75   03 Mar 1996 16:48:48   MA
   new: Flag fuer BrowseView

      Rev 1.74   27 Feb 1996 12:18:54   OS
   Metric nicht mehr in den UsrPref

      Rev 1.73   23 Feb 1996 13:25:28   OS
   neu: nUndoCount = UNDO_ACTION_COUNT

      Rev 1.72   20 Feb 1996 16:31:40   OS
   neu: bKeepAspectRatio fuer Abgleich im Grafik/OLE-Dialog

      Rev 1.71   20 Feb 1996 11:01:52   AMA
   New: bOnlineSpell und bHideSpell

      Rev 1.70   28 Nov 1995 22:36:04   JP
   UiSystem-Klasse aufgehoben, in initui/swtypes aufgeteilt

      Rev 1.69   24 Nov 1995 16:58:52   OM
   PCH->PRECOMPILED

      Rev 1.68   08 Nov 1995 12:48:16   OM
   Change->Set

      Rev 1.67   03 Nov 1995 18:54:54   OS
   vergessenes Table-Flag nachgetragen

      Rev 1.66   29 Sep 1995 16:58:40   OM
   HelpPI entfernt

      Rev 1.65   17 Sep 1995 20:00:58   OS
   neu: nUndoCount

      Rev 1.64   15 Sep 1995 12:40:20   OS
   GetName() implementiert und ColorSetItem entfernt

      Rev 1.63   15 Aug 1995 17:04:52   OM
   Preview-Zoomfaktor gesichert

      Rev 1.62   14 Jul 1995 09:57:22   MA
   fix: TabDist ab Version B3 nicht groesser B3

      Rev 1.61   13 Jul 1995 17:12:22   OS
   DefaultAttribut fuer nTabDist holen

      Rev 1.60   13 Jul 1995 09:05:02   MA
   fix: Tab zum x-ten, default fuer Load verbessert

      Rev 1.59   12 Jul 1995 11:31:00   MA
   fix: Load(), TabDist fuer alte Versionen defaulten

      Rev 1.58   12 Jul 1995 10:49:42   MA
   chg: MinTabDist ist MM50

      Rev 1.57   11 Jul 1995 15:48:06   OS
   neuer Member=>neue Version

      Rev 1.56   10 Jul 1995 19:27:32   OS
   +nTabDist in Load, ::com::sun::star::ucb::Store, UseDefault

      Rev 1.55   25 Jun 1995 13:20:22   MA
   opt: ViewOptions aufgeraeumt

      Rev 1.54   17 May 1995 17:26:06   MA
   UsrPref: gefixt, aufgeraumt, optimiert, includes gerichtet.

      Rev 1.53   03 Apr 1995 19:56:36   OS
   Einstellungen mehr als einmal laden

      Rev 1.52   20 Mar 1995 19:07:40   OS
   unbenutzte Funktionen entfernt

      Rev 1.51   08 Mar 1995 03:56:52   OS
   Raster-Einstellungen auch sichern

      Rev 1.50   19 Feb 1995 17:44:50   MA
   SEXPORT'iert.

      Rev 1.49   25 Oct 1994 16:13:02   ER
   add: PCH

      Rev 1.48   20 Oct 1994 12:54:42   JN
   Versionskontrolle bei Load/Store

      Rev 1.47   05 Oct 1994 10:07:56   SWG
   Anpassung Sfx

      Rev 1.46   15 Sep 1994 14:38:40   MS
   Reanimation die 1.

      Rev 1.45   15 Sep 1994 14:10:56   MS

      Rev 1.44   04 Aug 1994 10:36:00   SWG
   swg32: SED Size to SSize, LSize to Size etc.

------------------------------------------------------------------------*/

diff --git a/sw/source/ui/config/viewopt.cxx b/sw/source/ui/config/viewopt.cxx
new file mode 100644
index 0000000..3d8123a
--- /dev/null
+++ b/sw/source/ui/config/viewopt.cxx
@@ -0,0 +1,754 @@
/*************************************************************************
 *
 *  $RCSfile: viewopt.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:33 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _SVX_HTMLMODE_HXX //autogen
#include <svx/htmlmode.hxx>
#endif
#ifndef _OFA_HTMLCFG_HXX //autogen
#include <offmgr/htmlcfg.hxx>
#endif
#ifndef _SVX_SVXIDS_HRC //autogen
#include <svx/svxids.hrc>
#endif
#ifndef _SVX_SVXENUM_HXX //autogen
#include <svx/svxenum.hxx>
#endif
#ifndef _MySVXACORR_HXX //autogen
#include <svx/svxacorr.hxx>
#endif

#include "swtypes.hxx"
#include "viewopt.hxx"
#include "wdocsh.hxx"
#include "swrect.hxx"
#include "crstate.hxx"


#ifndef PRODUCT
BOOL   SwViewOption::bTest9 = FALSE;        //DrawingLayerNotLoading
#endif
USHORT SwViewOption::nPixelTwips = 0;   //ein Pixel auf dem Bildschirm


#define LINEBREAK_SIZE 12, 8
#define TAB_SIZE 12, 6

#define MIN_BLANKWIDTH       40
#define MIN_BLANKHEIGHT      40
#define MIN_TABWIDTH        120
#define MIN_TABHEIGHT       200

static const char __FAR_DATA aPostItStr[] = "  ";

/*************************************************************************
 *                    SwViewOption::IsEqualFlags()
 *************************************************************************/

BOOL SwViewOption::IsEqualFlags( const SwViewOption &rOpt ) const
{
    return  nCoreOptions == rOpt.nCoreOptions
            && nCore2Options == rOpt.nCore2Options
            && aSnapSize    == rOpt.aSnapSize
            && nDivisionX   == rOpt.GetDivisionX()
            && nDivisionY   == rOpt.GetDivisionY()
            && nPagePrevRow == rOpt.GetPagePrevRow()
            && nPagePrevCol == rOpt.GetPagePrevCol()
            && aRetoucheColor == rOpt.GetRetoucheColor()
#ifndef PRODUCT
            // korrespondieren zu den Angaben in ui/config/cfgvw.src
            && bTest1 == rOpt.IsTest1()
            && bTest2 == rOpt.IsTest2()
            && bTest3 == rOpt.IsTest3()
            && bTest4 == rOpt.IsTest4()
            && bTest5 == rOpt.IsTest5()
            && bTest6 == rOpt.IsTest6()
            && bTest7 == rOpt.IsTest7()
            && bTest8 == rOpt.IsTest8()
            && bTest10 == rOpt.IsTest10()
#endif
            ;
}

/*************************************************************************
 *                    class SwPxlToTwips
 *************************************************************************/

class SwPxlToTwips
{
    OutputDevice *pOut;
    Color   aLineColor;
    BOOL   bClip;
    Region aClip;
    Point aStart;
    SwRect aRect;
public:
    SwPxlToTwips( OutputDevice *pOut, const SwRect &rRect, const Size &rSize );
    ~SwPxlToTwips();
    inline const Point &GetStartPoint() const { return aStart; }
    inline BOOL  IsTooSmall() const {return 0 == pOut;}
    inline const SwRect &GetRect() const { return aRect; }
    void DrawLine( const Point &rStart, const Point &rEnd );
};

/*************************************************************************
 *                    SwPxlToTwips::CTOR
 *************************************************************************/

SwPxlToTwips::SwPxlToTwips( OutputDevice *pOutDev,
                            const SwRect &rRect, const Size &rSize )
    : pOut( pOutDev )
{
    aRect = pOut->LogicToPixel( rRect.SVRect() );

    // Wenn der Tab nicht mehr darstellbar ist, geben wir auf.
    if( 3 > aRect.Width() )
    {
        pOut = NULL;
        return;
    }

    if( rSize.Height() - 1 > aRect.Height() )
    {
        pOut = NULL;
        return;
    }

    aStart = aRect.Pos();
    aStart.X() += (aRect.Width()  / 2) - (rSize.Width() / 2);
    aStart.Y() += (aRect.Height() / 2) - (rSize.Height() / 2);
    if ( aStart.X() < aRect.Left() )
        aStart.X() = aRect.Left();

    if ( pOut->GetConnectMetaFile() )
        pOut->Push();

    bClip = pOut->IsClipRegion();
    if ( bClip )
    {
        aClip = pOut->GetClipRegion();
        pOut->SetClipRegion();
    }

    aLineColor = pOut->GetLineColor( );
    pOut->SetLineColor( Color(COL_BLACK) );
}

/*************************************************************************
 *                    SwPxlToTwips::DTOR
 *************************************************************************/

SwPxlToTwips::~SwPxlToTwips()
{
    if( pOut )
    {
        if ( pOut->GetConnectMetaFile() )
            pOut->Pop();
        else
        {
            pOut->SetLineColor( aLineColor );
            if( bClip )
                pOut->SetClipRegion( aClip );
        }
    }
}

/*************************************************************************
 *                    SwPxlToTwips::DrawLine
 *************************************************************************/

void SwPxlToTwips::DrawLine( const Point &rStart, const Point &rEnd )
{
    if( pOut )
    {
        const Point aStart( pOut->PixelToLogic( rStart ) );
        const Point aEnd( pOut->PixelToLogic( rEnd ) );
        pOut->DrawLine( aStart, aEnd );
    }
}

/*************************************************************************
 *                    SwViewOption::DrawRect()
 *************************************************************************/

void SwViewOption::DrawRect( OutputDevice *pOut,
                             const SwRect &rRect, long nCol ) const
{
    if ( pOut->GetOutDevType() != OUTDEV_PRINTER )
    {
        const Color aCol( nCol );
        const Color aOldColor( pOut->GetFillColor() );
        pOut->SetFillColor( aCol );
        pOut->DrawRect( rRect.SVRect() );
        pOut->SetFillColor( aOldColor );
    }
    else
        DrawRectPrinter( pOut, rRect );
}

/*************************************************************************
 *                    SwViewOption::DrawRectPrinter()
 *************************************************************************/

void SwViewOption::DrawRectPrinter( OutputDevice *pOut,
                                    const SwRect &rRect ) const
{
    Color aOldColor(pOut->GetLineColor());
    Color aOldFillColor( pOut->GetFillColor() );
    pOut->SetLineColor( Color(COL_BLACK) );
    pOut->SetFillColor( Color(COL_TRANSPARENT ));
    pOut->DrawRect( rRect.SVRect() );
    pOut->SetFillColor( aOldFillColor );
    pOut->SetLineColor( aOldColor );
}

/*************************************************************************
 *                    SwViewOption::PaintTab()
 *************************************************************************/
void SwViewOption::PaintTab( OutputDevice *pOut, const SwRect &rRect ) const
{
    SwPxlToTwips aSave( pOut, rRect, Size( TAB_SIZE ) );

    if( aSave.IsTooSmall() )
        return;

    Point aStart( aSave.GetStartPoint() );
    const SwRect &rPaintRect = aSave.GetRect();

    // horizontale
    aStart.Y() += 2;
    aStart.X() += 1;
    Point aEnd( aStart );
    aEnd.X() += 10;
    if( aEnd.X() >= rPaintRect.Right() )
        aEnd.X() = rPaintRect.Right() - 1;
    long nDiff = aEnd.X() - aStart.X();
    aSave.DrawLine( aStart, aEnd );

    // Pfeil
    aEnd.X() -= 1;
    aStart.X() = aEnd.X();
    aStart.Y() -= 1;
    aEnd.Y() += 1;
    aSave.DrawLine( aStart, aEnd );

    if( nDiff > 1 && rPaintRect.Height() > 8 )
    {
        aStart.X() -= 1;
        aStart.Y() -= 1;
        aEnd.X() = aStart.X();
        aEnd.Y() += 1;
        aSave.DrawLine( aStart, aEnd );
        if( nDiff > 2 && rPaintRect.Height() > 12 )
        {
            aStart.X() -= 1;
            aEnd.X() -= 1;
            aSave.DrawLine( aStart, aEnd );
        }
    }
}

/*************************************************************************
 *                    SwViewOption::GetLineBreakWidth()
 *************************************************************************/

USHORT SwViewOption::GetLineBreakWidth( const OutputDevice *pOut ) const
{
    ASSERT( pOut, "no Outdev" );
    const Size aSz( LINEBREAK_SIZE );
    return USHORT(pOut->PixelToLogic( aSz ).Width());
}

/*************************************************************************
 *                    SwViewOption::PaintLineBreak()
 *************************************************************************/

void SwViewOption::PaintLineBreak( OutputDevice *pOut, const SwRect &rRect ) const
{
    const Size aSz( LINEBREAK_SIZE );
    SwPxlToTwips aSave( pOut, rRect, aSz );
    if( aSave.IsTooSmall() )
        return;
    Point aStart( aSave.GetStartPoint() );
    const SwRect &rPaintRect = aSave.GetRect();

    // horizontale
    aStart.Y() += 4;
    aStart.X() += 1;
    Point aEnd( aStart );
    aEnd.X() += 8;
    if( aEnd.X() >= rPaintRect.Right() - 1 )
        aEnd.X() = rPaintRect.Right() - 2;
    aSave.DrawLine( aStart, aEnd );

    // Pfeil
    aStart.Y() -= 1;
    aStart.X() += 1;
    aEnd.Y()   = aStart.Y() + 2;
    aEnd.X()   = aStart.X();
    aSave.DrawLine( aStart, aEnd );

    // Pfeil
    aStart.Y() -= 1;
    aStart.X() += 1;
    aEnd.Y()   += 1;
    aEnd.X()   += 1;
    aSave.DrawLine( aStart, aEnd );

    // Pfeil
    aStart.X() += 1;
    aEnd.X()   += 1;
    aSave.DrawLine( aStart, aEnd );

    // vertikale
    aStart.Y() -= 2;
    aStart.X() += 6;
    if( aStart.X() >= rPaintRect.Right() )
        aStart.X() = rPaintRect.Right() - 1;
    aEnd.X() = aStart.X();
    aEnd.Y() = aStart.Y() + 3;
    aSave.DrawLine( aStart, aEnd );
}

/*************************************************************************
 *                    SwViewOption::GetPostItsWidth()
 *************************************************************************/

USHORT SwViewOption::GetPostItsWidth( const OutputDevice *pOut ) const
{
    ASSERT( pOut, "no Outdev" );
    return USHORT(pOut->GetTextWidth( String::CreateFromAscii(aPostItStr )));
}

/*************************************************************************
 *                    SwViewOption::PaintPostIts()
 *************************************************************************/

void SwViewOption::PaintPostIts( OutputDevice *pOut, const SwRect &rRect,
                                 long nCol ) const
{
    if( pOut )
    {
        Color aOldLineColor( pOut->GetLineColor() );
        pOut->SetLineColor( Color(COL_GRAY ) );
        // Wir ziehen ueberall zwei Pixel ab, damit es schick aussieht
        USHORT nPix = GetPixelTwips() * 2;
        if( rRect.Width() <= 2 * nPix || rRect.Height() <= 2 * nPix )
            nPix = 0;
        const Point aTopLeft(  rRect.Left()  + nPix, rRect.Top()    + nPix );
        const Point aBotRight( rRect.Right() - nPix, rRect.Bottom() - nPix );
        const SwRect aRect( aTopLeft, aBotRight );
        DrawRect( pOut, aRect, nCol );
        pOut->SetLineColor( aOldLineColor );
    }
}


/*************************************************************************
|*
|*  ViewOption::ViewOption()
|*
|*  Letzte Aenderung    MA 04. Aug. 93
|*
|*************************************************************************/

SwViewOption::SwViewOption() :
    nZoom( 100 ),
    nPagePrevRow( 1 ),
    nPagePrevCol( 2 ),
    eZoom( 0 ),
    nTblDest(TBL_DEST_CELL),
    bReadonly(FALSE),
    aRetoucheColor( COL_TRANSPARENT ),
    aShdwCrsrCol( COL_BLUE ),
    aIdxBackgrndCol( COL_LIGHTGRAY ),
    nShdwCrsrFillMode( FILL_TAB ),
    bStarOneSetting(FALSE)
{
    // Initialisierung ist jetzt etwas einfacher
    // alle Bits auf 0
    nCoreOptions =  VIEWOPT_1_IDLE | VIEWOPT_1_HARDBLANK | VIEWOPT_1_SOFTHYPH |
                    VIEWOPT_1_TOX | VIEWOPT_1_REF | VIEWOPT_1_FIELD |
                    VIEWOPT_1_FOOTNOTE | VIEWOPT_1_SUBSLINES | VIEWOPT_1_GRAPHIC |
                    VIEWOPT_1_TABLE    | VIEWOPT_1_DRAW | VIEWOPT_1_CONTROL |
                    VIEWOPT_1_SUBSTABLE| VIEWOPT_1_PAGEBACK |
                    VIEWOPT_1_SOLIDMARKHDL | VIEWOPT_1_POSTITS;
    nCore2Options = VIEWOPT_CORE2_BLACKFONT | VIEWOPT_CORE2_HIDDENPARA|
                    VIEWOPT_CORE2_INDEX_BACKGROUND | VIEWOPT_CORE2_SECTION_BOUNDS;
    nUIOptions    = VIEWOPT_2_MODIFIED | VIEWOPT_2_EXECHYPERLINKS;

    MeasurementSystem eSys = Application::GetAppInternational().GetMeasurementSystem();
    if(MEASURE_METRIC != eSys)
        aSnapSize.Width() = aSnapSize.Height() = 720;   // 1/2"
    else
        aSnapSize.Width() = aSnapSize.Height() = 567;   // 1 cm
    nDivisionX = nDivisionY = 1;


#ifndef PRODUCT
    // korrespondieren zu den Angaben in ui/config/cfgvw.src
    bTest1 = bTest2 = bTest3 = bTest4 =
             bTest5 = bTest6 = bTest7 = bTest8 = bTest10 = FALSE;
#endif
}


SwViewOption::SwViewOption(const SwViewOption& rVOpt)
{
    bReadonly = FALSE;
    nZoom           = rVOpt.nZoom       ;
    aSnapSize       = rVOpt.aSnapSize   ;
    nDivisionX      = rVOpt.nDivisionX  ;
    nDivisionY      = rVOpt.nDivisionY  ;
    nPagePrevRow    = rVOpt.nPagePrevRow;
    nPagePrevCol    = rVOpt.nPagePrevCol;
    eZoom           = rVOpt.eZoom       ;
    nTblDest        = rVOpt.nTblDest    ;
    nUIOptions      = rVOpt.nUIOptions  ;
    nCoreOptions    = rVOpt.nCoreOptions  ;
    nCore2Options   = rVOpt.nCore2Options  ;
    aRetoucheColor  = rVOpt.GetRetoucheColor();
    sSymbolFont     = rVOpt.sSymbolFont;
    aShdwCrsrCol    = rVOpt.aShdwCrsrCol;
    aIdxBackgrndCol = rVOpt.aIdxBackgrndCol;
    nShdwCrsrFillMode = rVOpt.nShdwCrsrFillMode;
    bStarOneSetting = rVOpt.bStarOneSetting;

#ifndef PRODUCT
    bTest1          = rVOpt.bTest1      ;
    bTest2          = rVOpt.bTest2      ;
    bTest3          = rVOpt.bTest3      ;
    bTest4          = rVOpt.bTest4      ;
    bTest5          = rVOpt.bTest5      ;
    bTest6          = rVOpt.bTest6      ;
    bTest7          = rVOpt.bTest7      ;
    bTest8          = rVOpt.bTest8      ;
    bTest10         = rVOpt.bTest10     ;
#endif
}


SwViewOption& SwViewOption::operator=( const SwViewOption &rVOpt )
{
    nZoom           = rVOpt.nZoom       ;
    aSnapSize       = rVOpt.aSnapSize   ;
    nDivisionX      = rVOpt.nDivisionX  ;
    nDivisionY      = rVOpt.nDivisionY  ;
    nPagePrevRow    = rVOpt.nPagePrevRow;
    nPagePrevCol    = rVOpt.nPagePrevCol;
    eZoom           = rVOpt.eZoom       ;
    nTblDest        = rVOpt.nTblDest    ;
    nUIOptions      = rVOpt.nUIOptions  ;
    nCoreOptions    = rVOpt.nCoreOptions;
    nCore2Options   = rVOpt.nCore2Options;
    aRetoucheColor  = rVOpt.GetRetoucheColor();
    sSymbolFont     = rVOpt.sSymbolFont;
    aShdwCrsrCol    = rVOpt.aShdwCrsrCol;
    aIdxBackgrndCol = rVOpt.aIdxBackgrndCol;
    nShdwCrsrFillMode = rVOpt.nShdwCrsrFillMode;
    bStarOneSetting = rVOpt.bStarOneSetting;

#ifndef PRODUCT
    bTest1          = rVOpt.bTest1      ;
    bTest2          = rVOpt.bTest2      ;
    bTest3          = rVOpt.bTest3      ;
    bTest4          = rVOpt.bTest4      ;
    bTest5          = rVOpt.bTest5      ;
    bTest6          = rVOpt.bTest6      ;
    bTest7          = rVOpt.bTest7      ;
    bTest8          = rVOpt.bTest8      ;
    bTest10         = rVOpt.bTest10     ;
#endif
    return *this;
}


SwViewOption::~SwViewOption()
{
}

/*************************************************************************
|*
|*  ViewOption::Init()
|*
|*  Letzte Aenderung    MA 04. Aug. 93
|*
|*************************************************************************/

void SwViewOption::Init( Window *pWin )
{
    if( !nPixelTwips && pWin )
    {
        nPixelTwips = (USHORT)pWin->PixelToLogic( Size(1,1) ).Height();
    }
}

BOOL SwViewOption::IsAutoCompleteWords() const
{
    const SvxSwAutoFmtFlags& rFlags = OFF_APP()->GetAutoCorrect()->GetSwFlags();
    return /*rFlags.bAutoCompleteWords &&*/ rFlags.bAutoCmpltCollectWords;
}

/*************************************************************************/
/*
/*************************************************************************/

AuthorCharAttr::AuthorCharAttr() :
    nItemId (SID_ATTR_CHAR_UNDERLINE),
    nAttr   (UNDERLINE_SINGLE),
    nColor  (COL_TRANSPARENT)
{
}

/*-----------------07.01.97 13.50-------------------

--------------------------------------------------*/

USHORT      GetHtmlMode(const SwDocShell* pShell)
{
    USHORT nRet = 0;
    if(!pShell || PTR_CAST(SwWebDocShell, pShell))
    {
        nRet = HTMLMODE_ON;
        OfaHtmlOptions* pHtmlOpt = OFF_APP()->GetHtmlOptions();
        switch ( pHtmlOpt->GetExportMode() )
        {
            case HTML_CFG_MSIE_40:
                nRet |= HTMLMODE_PARA_BORDER|HTMLMODE_SMALL_CAPS|
                        HTMLMODE_SOME_STYLES|
                        HTMLMODE_FULL_STYLES|HTMLMODE_GRAPH_POS|
                        HTMLMODE_FULL_ABS_POS|HTMLMODE_SOME_ABS_POS;
            break;
            case HTML_CFG_NS30:
                nRet |= HTMLMODE_BLINK|HTMLMODE_FRM_COLUMNS|HTMLMODE_FIRSTLINE;
            break;
            case HTML_CFG_NS40:
                nRet |= HTMLMODE_PARA_BORDER|HTMLMODE_SOME_STYLES|
                        HTMLMODE_FRM_COLUMNS|HTMLMODE_BLINK|HTMLMODE_GRAPH_POS|
                        HTMLMODE_SOME_ABS_POS;
            break;
            case HTML_CFG_WRITER:
                nRet |= HTMLMODE_PARA_BORDER|HTMLMODE_SMALL_CAPS|
                        HTMLMODE_SOME_STYLES|
                        HTMLMODE_FRM_COLUMNS|HTMLMODE_FULL_STYLES|
                        HTMLMODE_BLINK|HTMLMODE_DROPCAPS|HTMLMODE_GRAPH_POS|
                        HTMLMODE_FULL_ABS_POS|HTMLMODE_SOME_ABS_POS;
            break;
            case HTML_CFG_HTML32:
            break;
        }
    }
    return nRet;
}


/************************************************************************

      $Log: not supported by cvs2svn $
      Revision 1.57  2000/09/18 16:05:18  willem.vandorp
      OpenOffice header added.

      Revision 1.56  2000/04/11 08:02:24  os
      UNICODE

      Revision 1.55  2000/03/03 15:16:59  os
      StarView remainders removed

      Revision 1.54  2000/01/19 18:24:09  jp
      Bug #72118#: change default of view sectionboundaries

      Revision 1.53  2000/01/13 21:28:44  jp
      Task #71894#: new Options for SW-AutoComplete

      Revision 1.52  1999/09/20 10:35:00  os
      Color changes

      Revision 1.51  1999/07/28 11:03:20  OS
      index background in lighter gray


      Rev 1.50   28 Jul 1999 13:03:20   OS
   index background in lighter gray

      Rev 1.49   13 Jul 1999 08:47:52   OS
   #67584# Scrollbar settings via StarOne

      Rev 1.48   09 Jun 1999 13:22:34   OS
   index background

      Rev 1.47   17 Mar 1999 11:24:10   JP
   Task #63576#: IsAutoCompleteWords - das Flag von der OffApp erfragen

      Rev 1.46   15 Mar 1999 09:47:52   MA
   #63047# neue Defaults

      Rev 1.45   09 Mar 1999 19:34:34   JP
   Task #61405#: AutoCompletion von Woertern

      Rev 1.44   19 Jan 1999 08:47:36   MIB
   #60957#: Kapitaelchen auch fuer IE4

      Rev 1.43   29 Apr 1998 09:27:06   MA
   BackgroundBrush -> RetoucheColor

      Rev 1.42   20 Apr 1998 09:10:42   OS
   IE3 entfaellt

      Rev 1.41   03 Apr 1998 14:42:22   OS
   HTMLMODE_SOME/FULL_ABS_POS

      Rev 1.40   05 Mar 1998 14:34:12   OM
   Redline-Attribute in Module-Cfg speichern

      Rev 1.39   23 Feb 1998 12:40:46   OM
   Redlining-Optionen

      Rev 1.38   04 Feb 1998 17:53:06   MA
   chg: Notiz wieder per default an

      Rev 1.37   09 Jan 1998 17:15:14   AMA
   Fix #46523#: Colors sollten als long durchgereicht werden...

      Rev 1.36   28 Nov 1997 15:24:22   MA
   includes

      Rev 1.35   24 Nov 1997 17:58:48   MA
   include

      Rev 1.34   03 Nov 1997 16:12:36   JP
   neu: Optionen/-Page/Basic-Schnittst. fuer ShadowCursor

      Rev 1.33   01 Sep 1997 13:16:58   OS
   DLL-Umstellung

      Rev 1.32   08 Aug 1997 17:37:24   OM
   Headerfile-Umstellung

      Rev 1.31   05 Aug 1997 14:52:06   OS
   Option fuer Grafikhintergrund #41663#

      Rev 1.30   02 Jul 1997 12:46:00   MA
   inlines

      Rev 1.29   17 Jun 1997 17:24:06   MIB
   HTML-Modus-Flgas fuer Netacpe 4.0

      Rev 1.28   06 Jun 1997 12:44:24   MA
   chg: versteckte Absaetze ausblenden

      Rev 1.27   05 May 1997 10:56:32   AMA
   Fix #39418#: Tabulatorsymbolgroesse jetzt zoomabhaengig.

      Rev 1.26   25 Feb 1997 09:11:14   MA
   chg: Option fuer SolidHdl

      Rev 1.25   13 Feb 1997 18:57:16   AMA
   New: JavaScript-Felder werden gruen dargestellt.

      Rev 1.24   07 Feb 1997 18:25:30   OS
   HtmlMode auch fuer pDocSh == 0; Flags berichtigt

      Rev 1.23   05 Feb 1997 13:44:18   OS
   HTML-Modi erweitert

      Rev 1.22   27 Jan 1997 16:33:52   OS
   GetHtmlMode wird mit der DocShell ermittelt

      Rev 1.21   08 Jan 1997 10:47:10   OS
   neu: ::GetHtmlMode()

      Rev 1.20   13 Dec 1996 14:33:32   OS
   UndoCount wird aus der SfxApp besorgt

      Rev 1.19   10 Dec 1996 16:58:46   OS
   TabDist ab sofort in der OFA

      Rev 1.18   28 Nov 1996 15:20:24   OS
   neu: Schwarz drucken

      Rev 1.17   25 Sep 1996 14:56:18   OS
   Linealabfragen nicht mehr inline

      Rev 1.16   19 Sep 1996 18:40:54   OS
   SetUIOptions enthaelt auch nTblDest

      Rev 1.15   06 Sep 1996 14:32:20   OS
   UsrPrefs wieder vereinheitlicht

      Rev 1.14   30 Aug 1996 08:44:04   OS
   neu: sSymbolFont

      Rev 1.13   27 Aug 1996 10:11:44   OS
   IsEqualFlags: Brush vergleichen

      Rev 1.12   27 Aug 1996 09:44:46   OS
   operator=

*************************************************************************/

diff --git a/sw/source/ui/dbui/dbinsdlg.cxx b/sw/source/ui/dbui/dbinsdlg.cxx
new file mode 100644
index 0000000..e0c0ad1
--- /dev/null
+++ b/sw/source/ui/dbui/dbinsdlg.cxx
@@ -0,0 +1,2470 @@
/*************************************************************************
 *
 *  $RCSfile: dbinsdlg.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:33 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifdef REPLACE_OFADBMGR
#ifndef _COM_SUN_STAR_LANG_XMULTISERVICEFACTORY_HPP_
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XNAMEACCESS_HPP_
#include <com/sun/star/container/XNameAccess.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBC_XDATASOURCE_HPP_
#include <com/sun/star/sdbc/XDataSource.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBC_XROW_HPP_
#include <com/sun/star/sdbc/XRow.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBCX_XTABLESSUPPLIER_HPP_
#include <com/sun/star/sdbcx/XTablesSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBCX_XCOLUMNSSUPPLIER_HPP_
#include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_SDB_XQUERIESSUPPLIER_HPP_
#include <com/sun/star/sdb/XQueriesSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_SDB_XCOLUMN_HPP_
#include <com/sun/star/sdb/XColumn.hpp>
#endif
#ifndef _COM_SUN_STAR_SDB_XDATABASEACCESS_HPP_
#include <com/sun/star/sdb/XDatabaseAccess.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBC_DATATYPE_HPP_
#include <com/sun/star/sdbc/DataType.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBC_RESULTSETTYPE_HPP_
#include <com/sun/star/sdbc/ResultSetType.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
#include <com/sun/star/beans/XPropertySet.hpp>
#endif
#ifndef _COM_SUN_STAR_UTIL_XNUMBERFORMATTER_HPP_
#include <com/sun/star/util/XNumberFormatter.hpp>
#endif
#ifndef _COM_SUN_STAR_UTIL_XNUMBERFORMATTYPES_HPP_
#include <com/sun/star/util/XNumberFormatTypes.hpp>
#endif
#ifndef _COM_SUN_STAR_UTIL_XNUMBERFORMATSSUPPLIER_HPP_
#include <com/sun/star/util/XNumberFormatsSupplier.hpp>
#endif
#ifndef _UNOTOOLS_PROCESSFACTORY_HXX_
#include <unotools/processfactory.hxx>
#endif
#ifndef _UTL_UNO3_DB_TOOLS_HXX_
#include <unotools/dbtools.hxx>
#endif
#ifndef _SVX_LANGITEM_HXX
#include <svx/langitem.hxx>
#endif
#ifndef _SVX_UNOMID_HXX
#include <svx/unomid.hxx>
#endif
#ifndef _NUMUNO_HXX
#include <svtools/numuno.hxx>
#endif

#else

#endif  //REPLACE_OFADBMGR

#include <sdb/tools.hxx>
#ifndef _SDB_SDBCURS_HXX //autogen
#include <sdb/sdbcurs.hxx>
#endif
#include <float.h>


#ifndef _TOOLS_INTN_HXX //autogen
#include <tools/intn.hxx>
#endif
#ifndef _SV_MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SV_SVAPP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _SBAITEMS_HRC //autogen
#include <offmgr/sbaitems.hrc>
#endif
#ifndef _SFXSTYLE_HXX //autogen
#include <svtools/style.hxx>
#endif
#ifndef _ZFORLIST_HXX //autogen
#include <svtools/zforlist.hxx>
#endif
#ifndef _ZFORMAT_HXX //autogen
#include <svtools/zformat.hxx>
#endif
#ifndef _SFXCFGITEM_HXX //autogen
#include <sfx2/cfgitem.hxx>
#endif
#ifndef _SVX_HTMLMODE_HXX //autogen
#include <svx/htmlmode.hxx>
#endif

#ifndef _UIPARAM_HXX
#include <uiparam.hxx>
#endif
#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif
#ifndef _SFX_SAVEOPT_HXX //autogen
#include <sfx2/saveopt.hxx>
#endif
#ifndef _SFXITEMSET_HXX //autogen
#include <svtools/itemset.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_RULRITEM_HXX //autogen
#include <svx/rulritem.hxx>
#endif

#ifndef _TABLEDLG_HXX //autogen
#include <tabledlg.hxx>
#endif
#ifndef _FMTCLDS_HXX //autogen
#include <fmtclds.hxx>
#endif
#ifndef _TABCOL_HXX //autogen
#include <tabcol.hxx>
#endif
#ifndef _UIITEMS_HXX //autogen
#include <uiitems.hxx>
#endif
#ifndef _VIEWOPT_HXX //autogen
#include <viewopt.hxx>
#endif
#ifndef _UITOOL_HXX
#include <uitool.hxx>
#endif
#ifndef _DBINSDLG_HXX
#include <dbinsdlg.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _WVIEW_HXX
#include <wview.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _DBMGR_HXX
#include <dbmgr.hxx>
#endif
#ifndef _TAUTOFMT_HXX
#include <tautofmt.hxx>
#endif
#ifndef _TBLAFMT_HXX
#include <tblafmt.hxx>
#endif
#ifndef _CELLATR_HXX
#include <cellatr.hxx>
#endif
#ifndef _SWTABLE_HXX
#include <swtable.hxx>
#endif
#ifndef _DBFLD_HXX
#include <dbfld.hxx>
#endif
#ifndef _FMTCOL_HXX
#include <fmtcol.hxx>
#endif
#ifndef _SECTION_HXX //autogen
#include <section.hxx>
#endif
#ifndef _SWWAIT_HXX
#include <swwait.hxx>
#endif
#ifndef _MODOPT_HXX //autogen
#include <modcfg.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _POOLFMT_HXX
#include <poolfmt.hxx>
#endif

#ifndef _DBINSDLG_HRC
#include <dbinsdlg.hrc>
#endif
#ifndef _DBUI_HRC
#include <dbui.hrc>
#endif
#ifndef _CFGSTR_HRC
#include <cfgstr.hrc>
#endif
#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _HELPID_H
#include <helpid.h>
#endif
#ifndef _CFGID_H
#include <cfgid.h>
#endif


#ifdef REPLACE_OFADBMGR
using namespace rtl;
using namespace com::sun::star;
using namespace com::sun::star::uno;
using namespace com::sun::star::container;
using namespace com::sun::star::lang;
using namespace com::sun::star::sdb;
using namespace com::sun::star::sdbc;
using namespace com::sun::star::sdbcx;
using namespace com::sun::star::beans;
using namespace com::sun::star::util;
#define C2U(cChar) OUString::createFromAscii(cChar)
#endif

const char cDBFldStart  = '<';
const char cDBFldEnd    = '>';
#define C2S(cChar) String::CreateFromAscii(cChar)

// Hilfsstruktur fuers einfuegen von Datenbankspalten als Felder oder Text
struct _DB_Column
{
    enum { DB_FILLTEXT, DB_COL_FIELD, DB_COL_TEXT, DB_SPLITPARA } eColType;

    union {
        String* pText;
        SwField* pField;
        ULONG nFormat;
    } DB_ColumnData;
    const SwInsDBColumn* pColInfo;

    _DB_Column()
    {
        pColInfo = 0;
        DB_ColumnData.pText = 0;
        eColType = DB_SPLITPARA;
    }

    _DB_Column( const String& rTxt )
    {
        pColInfo = 0;
        DB_ColumnData.pText = new String( rTxt );
        eColType = DB_FILLTEXT;
    }

    _DB_Column( const SwInsDBColumn& rInfo, ULONG nFormat )
    {
        pColInfo = &rInfo;
        DB_ColumnData.nFormat = nFormat;
        eColType = DB_COL_TEXT;
    }

    _DB_Column( const SwInsDBColumn& rInfo, SwDBField& rFld )
    {
        pColInfo = &rInfo;
        DB_ColumnData.pField = &rFld;
        eColType = DB_COL_FIELD;
    }

    ~_DB_Column()
    {
        if( DB_COL_FIELD == eColType )
            delete DB_ColumnData.pField;
        else if( DB_FILLTEXT == eColType )
            delete DB_ColumnData.pText;
    }
};

typedef _DB_Column* _DB_ColumnPtr;
SV_DECL_PTRARR_DEL( _DB_Columns, _DB_ColumnPtr, 32, 32 )
SV_IMPL_PTRARR( _DB_Columns, _DB_ColumnPtr )

SV_IMPL_OP_PTRARR_SORT( SwInsDBColumns, SwInsDBColumnPtr )

/*  */

#define DBCOLUMN_CONFIG_VERSION1    1
#define DBCOLUMN_CONFIG_VERSION     DBCOLUMN_CONFIG_VERSION1
#define DBCOLUMN_MAXDATA            5

struct _DB_ColumnConfigData
{
    SwInsDBColumns aDBColumns;
    String sDBName, sEdit, sTblList, sTmplNm, sTAutoFmtNm;
    BOOL bIsTable : 1,
         bIsField : 1,
         bIsHeadlineOn : 1,
         bIsEmptyHeadln : 1;

    _DB_ColumnConfigData()
    {
        bIsTable = bIsHeadlineOn = TRUE;
        bIsField = bIsEmptyHeadln = FALSE;
    }

    _DB_ColumnConfigData( SvStream& rStream, UINT16 nVers );

    ~_DB_ColumnConfigData();

    void Save( SvStream& rStream ) const;

    BOOL IsEqualDB( const _DB_ColumnConfigData& ) const;
private:
    _DB_ColumnConfigData( const _DB_ColumnConfigData& );
    _DB_ColumnConfigData& operator =( const _DB_ColumnConfigData& );
};

class _DB_ColumnConfig : public SfxConfigItem
{
    _DB_ColumnConfigData* aData[ DBCOLUMN_MAXDATA ];

protected:
    virtual String GetName() const;
    virtual int Load(SvStream& rStream);
    virtual BOOL Store(SvStream& rStream);

public:
    _DB_ColumnConfig();
    virtual ~_DB_ColumnConfig();

    virtual void UseDefault();

    const _DB_ColumnConfigData* HasData( const _DB_ColumnConfigData& rData ) const;
    void SetData( _DB_ColumnConfigData* pData );
};

/*  */

int SwInsDBColumn::operator<( const SwInsDBColumn& rCmp ) const
{
    return COMPARE_LESS == Application::GetAppInternational().Compare(
                                                sColumn, rCmp.sColumn );
}
/* ---------------------------------------------------------------------------

 ---------------------------------------------------------------------------*/
#ifdef REPLACE_OFADBMGR
SwInsertDBColAutoPilot::SwInsertDBColAutoPilot( SwView& rView,
        Reference<XDataSource> xDataSource,
        Reference<sdbcx::XColumnsSupplier> xColSupp,
        const SwInsDBData& rData )
#else
SwInsertDBColAutoPilot::SwInsertDBColAutoPilot( SwView& rView )
#endif //REPLACE_OFADBMGR
    : SfxModalDialog( rView.GetWindow(), SW_RES( DLG_AP_INSERT_DB_SEL )),
    aFtInsertData( this, SW_RES( FT_INSERT_DATA )),
    aRbAsTable( this, SW_RES( RB_AS_TABLE )),
    aRbAsField( this, SW_RES( RB_AS_FIELD )),
    aRbAsText( this, SW_RES( RB_AS_TEXT )),
    aBtOk( this, SW_RES( BT_OK )),
    aBtCancel( this, SW_RES( BT_CANCEL )),
    aBtHelp( this, SW_RES( BT_HELP )),
    aGbSelection( this, SW_RES( GB_SELECTION )),
    aFtDbColumn( this, SW_RES( FT_DB_COLUMN )),
    aGbDbFormat( this, SW_RES( GB_DB_FORMAT )),
    aRbDbFmtFromDb( this, SW_RES( RB_DBFMT_FROM_DB )),
    aRbDbFmtFromUsr( this, SW_RES( RB_DBFMT_FROM_USR )),
    aLbDbFmtFromUsr( this, &rView, SW_RES( LB_DBFMT_FROM_USR )),

    /* ----- Page Text/Field ------- */
    aLbTxtDbColumn( this, SW_RES( LB_TXT_DB_COLUMN )),
    aPbDbcolToEdit( this, SW_RES( PB_DBCOL_TOEDIT )),
    aEdDbText( this, SW_RES( ED_DB_TEXT )),
    aFtDbParaColl( this, SW_RES( FT_DB_PARA_COLL )),
    aLbDbParaColl( this, SW_RES( LB_DB_PARA_COLL )),

    /* ----- Page Table ------------ */
    aLbTblDbColumn( this, SW_RES( LB_TBL_DB_COLUMN )),
    aPbDbcolAllTo( this, SW_RES( PB_DBCOL_ALL_TO )),
    aPbDbcolOneTo( this, SW_RES( PB_DBCOL_ONE_TO )),
    aPbDbcolOneFrom( this, SW_RES( PB_DBCOL_ONE_FROM )),
    aPbDbcolAllFrom( this, SW_RES( PB_DBCOL_ALL_FROM )),
    aFtTableCol( this, SW_RES( FT_TABLE_COL )),
    aLbTableCol( this, SW_RES( LB_TABLE_COL )),
    aGbTableHead( this, SW_RES( GB_TABLE_HEAD )),
    aCbTableHeadon( this, SW_RES( CB_TABLE_HEADON )),
    aRbHeadlColnms( this, SW_RES( RB_HEADL_COLNMS )),
    aRbHeadlEmpty( this, SW_RES( RB_HEADL_EMPTY )),
    aPbTblFormat( this, SW_RES( PB_TBL_FORMAT )),
    aPbTblAutofmt( this, SW_RES( PB_TBL_AUTOFMT )),

    sNoTmpl( SW_RES( STR_NOTEMPL )),
#ifdef REPLACE_OFADBMGR
    aDBData(rData),
#endif //REPLACE_OFADBMGR
    pView( &rView ),
    pTAutoFmt( 0 ),
    pTblSet( 0 ),
    pRep( 0 ),
    aOldNumFmtLnk( aLbDbFmtFromUsr.GetSelectHdl() ),
    pConfig( 0 )
{
    FreeResource();

    nGBFmtLen = aGbDbFormat.GetText().Len();

#ifdef REPLACE_OFADBMGR
    if(xColSupp.is())
    {
        SwWrtShell& rSh = pView->GetWrtShell();
        SvNumberFormatter* pNumFmtr = rSh.GetNumberFormatter();
        SfxItemSet aSet(pView->GetPool(), RES_CHRATR_LANGUAGE, RES_CHRATR_LANGUAGE);
        rSh.GetAttr( aSet );
        Locale aDocLocale;
        if(SFX_ITEM_DEFAULT <= aSet.GetItemState(RES_CHRATR_LANGUAGE, TRUE))
        {
            Any aLoc;
            const SfxPoolItem& rItem = aSet.Get(RES_CHRATR_LANGUAGE);
            rItem.QueryValue(aLoc,  MID_LANG_LOCALE);
            aDocLocale = *(Locale*)aLoc.getValue();
        }

        SvNumberFormatsSupplierObj* pNumFmt = new SvNumberFormatsSupplierObj( pNumFmtr );
        Reference< util::XNumberFormatsSupplier >  xDocNumFmtsSupplier = pNumFmt;
        Reference< XNumberFormats > xDocNumberFormats = xDocNumFmtsSupplier->getNumberFormats();
         Reference< XNumberFormatTypes > xDocNumberFormatTypes(xDocNumberFormats, UNO_QUERY);

        Reference<XPropertySet> xSourceProps(xDataSource, UNO_QUERY);
        Reference< XNumberFormats > xNumberFormats;
        if(xSourceProps.is())
        {
            Any aFormats = xSourceProps->getPropertyValue(C2U("NumberFormatsSupplier"));
            if(aFormats.hasValue())
            {
                Reference<XNumberFormatsSupplier> xSuppl = *(Reference<util::XNumberFormatsSupplier>*) aFormats.getValue();
                if(xSuppl.is())
                {
                    xNumberFormats = xSuppl->getNumberFormats(  );
                }
            }
        }
        Reference <XNameAccess> xCols = xColSupp->getColumns();
        Sequence<OUString> aColNames = xCols->getElementNames();
        const OUString* pColNames = aColNames.getConstArray();
        long nCount = aColNames.getLength();
        for (long n = 0; n < nCount; n++)
        {
            SwInsDBColumn* pNew = new SwInsDBColumn(
                                            pColNames[n], n );
            Any aCol = xCols->getByName(pColNames[n]);
            Reference <XPropertySet> xCol = *(Reference <XPropertySet>*)aCol.getValue();
            Any aType = xCol->getPropertyValue(C2S("Type"));
            sal_Int32 eDataType;
            aType >>= eDataType;
            switch(eDataType)
            {
                case DataType::BIT:
                case DataType::TINYINT:
                case DataType::SMALLINT:
                case DataType::INTEGER:
                case DataType::BIGINT:
                case DataType::FLOAT:
                case DataType::REAL:
                case DataType::DOUBLE:
                case DataType::NUMERIC:
                case DataType::DECIMAL:
                case DataType::DATE:
                case DataType::TIME:
                case DataType::TIMESTAMP:
                {
                    pNew->bHasFmt = TRUE;
                    Any aFormat = xCol->getPropertyValue(C2U("FormatKey"));
                    if(aFormat.hasValue())
                    {
                        sal_Int32 nFmt;
                        aFormat >>= nFmt;
                        if(xNumberFormats.is())
                        {
                            try
                            {
                                Reference<XPropertySet> xNumProps = xNumberFormats->getByKey( nFmt );
                                Any aFormat = xNumProps->getPropertyValue(C2U("FormatString"));
                                Any aLocale = xNumProps->getPropertyValue(C2U("Locale"));
                                OUString sFormat;
                                aFormat >>= sFormat;
                                com::sun::star::lang::Locale aLoc;
                                aLocale >>= aLoc;
                                nFmt = xDocNumberFormats->addNew( sFormat, aLoc ),
                                pNew->nDBNumFmt = nFmt;
                            }
                            catch(...)
                            {
                                DBG_ERROR("illegal number format key")
                            }
                        }
                    }
                    else
                        pNew->nDBNumFmt = utl::getDefaultNumberFormat(xCol,
                                     xDocNumberFormatTypes,
                                     aDocLocale);

                }
                break;
            }
            if( !aDBColumns.Insert( pNew ))
            {
                ASSERT( !this, "Spaltenname mehrfach vergeben?" );
                delete pNew;
            }
        }
    }
#else
    // die ListBoxen mit den Spaltenkoepfen fuellen:
    {
        USHORT n;
        SwNewDBMgr* pDBMgr = pView->GetWrtShell().GetNewDBMgr();
        const String& rDBName = pView->GetWrtShell().GetDBDesc();

        if( pDBMgr->IsDBOpen( DBMGR_STD, rDBName) ||
            pDBMgr->OpenDB( DBMGR_STD, rDBName, TRUE ) )
        {
            SbaDBDataDefRef xDBDef = pDBMgr->OpenColumnNames( DBMGR_STD );
            if( xDBDef.Is() )
            {
                const SbaColumnList& rCols = xDBDef->GetOriginalColumns();
                for( n = 0; n < rCols.Count(); ++n )
                {
                    const SbaColumn* pCol = rCols.GetObject( n );
                    const SbaNameItem& rNmItm = (SbaNameItem&)pCol->Get(
                                                            SBA_DEF_FLTNAME );
                    const SbaDataFieldTypeItem& rType = (SbaDataFieldTypeItem&)
                                                pCol->Get( SBA_DEF_FLTTYPE );

                    SwInsDBColumn* pNew = new SwInsDBColumn(
                                                    rNmItm.GetValue(), n );

                    switch( rType.GetValue() )
                    {
                    case dbCurrency:
                    case dbCounter:
                    case dbNumeric:
                    case dbDateTime:
                    case dbDate:
                    case dbTime:
                    case dbBool:
                    case dbDecimal:
                    case dbBigInt:
                        pNew->bHasFmt = TRUE;
                        pNew->nDBNumFmt = ((SfxUInt32Item&)pCol->Get(
                                                SBA_DEF_FMTVALUE)).GetValue();
                        break;
                    }

                    if( !aDBColumns.Insert( pNew ))
                    {
                        ASSERT( !this, "Spaltenname mehrfach vergeben?" );
                        delete pNew;
                    }
                }
            }
        }
    }
#endif //REPLACE_OFADBMGR

    // Absatzvorlagen-ListBox fuellen
    {
        SfxStyleSheetBasePool* pPool = pView->GetDocShell()->GetStyleSheetPool();
        pPool->SetSearchMask( SFX_STYLE_FAMILY_PARA, SFXSTYLEBIT_ALL );
        aLbDbParaColl.InsertEntry( sNoTmpl );

        const SfxStyleSheetBase* pBase = pPool->First();
        while( pBase )
        {
            aLbDbParaColl.InsertEntry( pBase->GetName() );
            pBase = pPool->Next();
        }
        aLbDbParaColl.SelectEntryPos( 0 );
    }

    // steht der Cursor in einer Tabelle, darf NIE Tabelle auswaehlbar sein
    if( pView->GetWrtShell().GetTableFmt() )
    {
        aRbAsTable.Enable( FALSE );
        aRbAsField.Check( TRUE );
        aRbDbFmtFromDb.Check( TRUE );
    }
    else
    {
        aRbAsTable.Check( TRUE );
        aRbDbFmtFromDb.Check( TRUE );
        aPbDbcolOneFrom.Enable( FALSE );
        aPbDbcolAllFrom.Enable( FALSE );
    }

    aRbAsTable.SetClickHdl( LINK(this, SwInsertDBColAutoPilot, PageHdl ));
    aRbAsField.SetClickHdl( LINK(this, SwInsertDBColAutoPilot, PageHdl ));
    aRbAsText.SetClickHdl( LINK(this, SwInsertDBColAutoPilot, PageHdl ));

    aRbDbFmtFromDb.SetClickHdl( LINK(this, SwInsertDBColAutoPilot, DBFormatHdl ));
    aRbDbFmtFromUsr.SetClickHdl( LINK(this, SwInsertDBColAutoPilot, DBFormatHdl ));

    aPbTblFormat.SetClickHdl(LINK(this, SwInsertDBColAutoPilot, TblFmtHdl ));
    aPbTblAutofmt.SetClickHdl(LINK(this, SwInsertDBColAutoPilot, AutoFmtHdl ));

    aPbDbcolAllTo.SetClickHdl( LINK(this, SwInsertDBColAutoPilot, TblToFromHdl ));
    aPbDbcolOneTo.SetClickHdl( LINK(this, SwInsertDBColAutoPilot, TblToFromHdl ));
    aPbDbcolOneFrom.SetClickHdl( LINK(this, SwInsertDBColAutoPilot, TblToFromHdl ));
    aPbDbcolAllFrom.SetClickHdl( LINK(this, SwInsertDBColAutoPilot, TblToFromHdl ));
    aPbDbcolToEdit.SetClickHdl( LINK(this, SwInsertDBColAutoPilot, TblToFromHdl ));

    aCbTableHeadon.SetClickHdl( LINK(this, SwInsertDBColAutoPilot, HeaderHdl ));
    aRbHeadlColnms.SetClickHdl( LINK(this, SwInsertDBColAutoPilot, HeaderHdl ));
    aRbHeadlEmpty.SetClickHdl( LINK(this, SwInsertDBColAutoPilot, HeaderHdl ));

    aLbTxtDbColumn.SetSelectHdl( LINK( this, SwInsertDBColAutoPilot, SelectHdl ));
    aLbTblDbColumn.SetSelectHdl( LINK( this, SwInsertDBColAutoPilot, SelectHdl ));
    aLbDbFmtFromUsr.SetSelectHdl( LINK( this, SwInsertDBColAutoPilot, SelectHdl ));
    aLbTableCol.SetSelectHdl( LINK( this, SwInsertDBColAutoPilot, SelectHdl ));

    aLbTxtDbColumn.SetDoubleClickHdl( LINK( this, SwInsertDBColAutoPilot, DblClickHdl ));
    aLbTblDbColumn.SetDoubleClickHdl( LINK( this, SwInsertDBColAutoPilot, DblClickHdl ));
    aLbTableCol.SetDoubleClickHdl( LINK( this, SwInsertDBColAutoPilot, DblClickHdl ));

    for( USHORT n = 0; n < aDBColumns.Count(); ++n )
    {
        const String& rS = aDBColumns[ n ]->sColumn;
        aLbTblDbColumn.InsertEntry( rS, n );
        aLbTxtDbColumn.InsertEntry( rS, n );
    }
    aLbTxtDbColumn.SelectEntryPos( 0 );
    aLbTblDbColumn.SelectEntryPos( 0 );

    // Daten aus dem INI-File lesen:
    ReadIniToUI();

    // Controls initialisieren:
    PageHdl( aRbAsTable.IsChecked() ? &aRbAsTable : &aRbAsField );
}
/* ---------------------------------------------------------------------------

 ---------------------------------------------------------------------------*/
SwInsertDBColAutoPilot::~SwInsertDBColAutoPilot()
{
    delete pTblSet;
    delete pRep;

    delete pConfig;
    delete pTAutoFmt;
}
/* ---------------------------------------------------------------------------

 ---------------------------------------------------------------------------*/
IMPL_LINK( SwInsertDBColAutoPilot, PageHdl, Button*, pButton )
{
    BOOL bShowTbl = pButton == &aRbAsTable;

    String sTxt( pButton->GetText() );
    aGbSelection.SetText( sTxt.EraseAllChars( '~' ) );

    aLbTxtDbColumn.Show( !bShowTbl );
    aPbDbcolToEdit.Show( !bShowTbl );
    aEdDbText.Show( !bShowTbl );
    aFtDbParaColl.Show( !bShowTbl );
    aLbDbParaColl.Show( !bShowTbl );

    aLbTblDbColumn.Show( bShowTbl );
    aPbDbcolAllTo.Show( bShowTbl );
    aPbDbcolOneTo.Show( bShowTbl );
    aPbDbcolOneFrom.Show( bShowTbl );
    aPbDbcolAllFrom.Show( bShowTbl );
    aFtTableCol.Show( bShowTbl );
    aLbTableCol.Show( bShowTbl );
    aGbTableHead.Show( bShowTbl );
    aCbTableHeadon.Show( bShowTbl );
    aRbHeadlColnms.Show( bShowTbl );
    aRbHeadlEmpty.Show( bShowTbl );
    aPbTblFormat.Show( bShowTbl );
    aPbTblAutofmt.Show( bShowTbl );

    if( bShowTbl )
        aPbTblFormat.Enable( 0 != aLbTableCol.GetEntryCount() );

    SelectHdl( bShowTbl ? &aLbTblDbColumn : &aLbTxtDbColumn );

    return 0;
}
/* ---------------------------------------------------------------------------

 ---------------------------------------------------------------------------*/
IMPL_LINK( SwInsertDBColAutoPilot, DBFormatHdl, Button*, pButton )
{
    USHORT nFndPos;
    ListBox& rBox = aRbAsTable.IsChecked()
                        ? ( 0 == aLbTableCol.GetEntryData( 0 )
                            ? aLbTblDbColumn
                            : aLbTableCol )
                        : aLbTxtDbColumn;

    SwInsDBColumn aSrch( rBox.GetSelectEntry(), 0 );
    aDBColumns.Seek_Entry( &aSrch, &nFndPos );

    BOOL bFromDB = &aRbDbFmtFromDb == pButton;
    aDBColumns[ nFndPos ]->bIsDBFmt = bFromDB;
    aLbDbFmtFromUsr.Enable( !bFromDB );

    return 0;
}
/* ---------------------------------------------------------------------------

 ---------------------------------------------------------------------------*/
IMPL_LINK( SwInsertDBColAutoPilot, TblToFromHdl, Button*, pButton )
{
    BOOL bChgEnable = TRUE, bEnableTo = TRUE, bEnableFrom = TRUE;
    aLbTblDbColumn.SetUpdateMode( FALSE );
    aLbTableCol.SetUpdateMode( FALSE );

    if( pButton == &aPbDbcolAllTo )
    {
        bEnableTo = FALSE;

        USHORT n, nInsPos = aLbTableCol.GetSelectEntryPos(),
               nCnt = aLbTblDbColumn.GetEntryCount();
        if( LISTBOX_APPEND == nInsPos )
            for( n = 0; n < nCnt; ++n )
                aLbTableCol.InsertEntry( aLbTblDbColumn.GetEntry( n ),
                                            LISTBOX_APPEND );
        else
            for( n = 0; n < nCnt; ++n, ++nInsPos )
                aLbTableCol.InsertEntry( aLbTblDbColumn.GetEntry( n ), nInsPos );
        aLbTblDbColumn.Clear();
        aLbTableCol.SelectEntryPos( nInsPos );
        aLbTblDbColumn.SelectEntryPos( LISTBOX_APPEND );
    }
    else if( pButton == &aPbDbcolOneTo &&
            LISTBOX_ENTRY_NOTFOUND != aLbTblDbColumn.GetSelectEntryPos() )
    {
        USHORT nInsPos = aLbTableCol.GetSelectEntryPos(),
               nDelPos = aLbTblDbColumn.GetSelectEntryPos(),
               nTopPos = aLbTblDbColumn.GetTopEntry();
        aLbTableCol.InsertEntry( aLbTblDbColumn.GetEntry( nDelPos ), nInsPos );
        aLbTblDbColumn.RemoveEntry( nDelPos );

        aLbTableCol.SelectEntryPos( nInsPos );
        if( nDelPos >= aLbTblDbColumn.GetEntryCount() )
            nDelPos = aLbTblDbColumn.GetEntryCount() - 1;
        aLbTblDbColumn.SelectEntryPos( nDelPos );
        aLbTblDbColumn.SetTopEntry( nTopPos );

        bEnableTo = 0 != aLbTblDbColumn.GetEntryCount();
    }
    else if( pButton == &aPbDbcolOneFrom )
    {
        if( LISTBOX_ENTRY_NOTFOUND != aLbTableCol.GetSelectEntryPos() )
        {
            USHORT nFndPos, nInsPos,
                    nDelPos = aLbTableCol.GetSelectEntryPos(),
                    nTopPos = aLbTableCol.GetTopEntry();

            // die richtige InsertPos suchen!!
            SwInsDBColumn aSrch( aLbTableCol.GetEntry( nDelPos ), 0 );
            aDBColumns.Seek_Entry( &aSrch, &nFndPos );
            if( !nFndPos || nFndPos == aDBColumns.Count()-1 )
                nInsPos = nFndPos;
            else
            {
                nInsPos = LISTBOX_ENTRY_NOTFOUND;
                while( ++nFndPos < aDBColumns.Count() &&
                        LISTBOX_ENTRY_NOTFOUND == (nInsPos = aLbTblDbColumn.
                        GetEntryPos( aDBColumns[ nFndPos ]->sColumn )) )
                    ;
            }

            aLbTblDbColumn.InsertEntry( aSrch.sColumn, nInsPos );
            aLbTableCol.RemoveEntry( nDelPos );

            if( nInsPos >= aLbTblDbColumn.GetEntryCount() )
                nInsPos = aLbTblDbColumn.GetEntryCount() - 1;
            aLbTblDbColumn.SelectEntryPos( nInsPos );

            if( nDelPos >= aLbTableCol.GetEntryCount() )
                nDelPos = aLbTableCol.GetEntryCount() - 1;
            aLbTableCol.SelectEntryPos( nDelPos );
            aLbTableCol.SetTopEntry( nTopPos );
        }
        else
            bEnableTo = 0 != aLbTblDbColumn.GetEntryCount();

        bEnableFrom = 0 != aLbTableCol.GetEntryCount();
    }
    else if( pButton == &aPbDbcolAllFrom )
    {
        bEnableFrom = FALSE;

        aLbTblDbColumn.Clear();
        aLbTableCol.Clear();
        for( USHORT n = 0; n < aDBColumns.Count(); ++n )
            aLbTblDbColumn.InsertEntry( aDBColumns[ n ]->sColumn, n );
        aLbTblDbColumn.SelectEntryPos( 0 );
    }
    else if( pButton == &aPbDbcolToEdit )
    {
        bChgEnable = FALSE;
        // Daten ins Edit moven:
        String aFld( aLbTxtDbColumn.GetSelectEntry() );
        if( aFld.Len() )
        {
            String aStr( aEdDbText.GetText() );
            USHORT nPos = (USHORT)aEdDbText.GetSelection().Min();
            USHORT nSel = USHORT(aEdDbText.GetSelection().Max()) - nPos;
            if( nSel )
                // dann loesche erstmal die bestehende Selektion
                aStr.Erase( nPos, nSel );

            aFld.Insert( cDBFldStart, 0 );
            aFld += cDBFldEnd;
            if( aStr.Len() )
            {
                if( nPos )                          // ein Space davor
                {
                    char c = aStr.GetChar( nPos-1 );
                    if( '\n' != c && '\r' != c )
                        aFld.Insert( ' ', 0 );
                }
                if( nPos < aStr.Len() )             // ein Space dahinter
                {
                    char c = aStr.GetChar( nPos );
                    if( '\n' != c && '\r' != c )
                        aFld += ' ';
                }
            }

            aStr.Insert( aFld, nPos );
            aEdDbText.SetText( aStr );
            nPos += aFld.Len();
            aEdDbText.SetSelection( Selection( nPos ));
        }
    }

    if( bChgEnable )
    {
        aPbDbcolOneTo.Enable( bEnableTo );
        aPbDbcolAllTo.Enable( bEnableTo );
        aPbDbcolOneFrom.Enable( bEnableFrom );
        aPbDbcolAllFrom.Enable( bEnableFrom );

        aRbDbFmtFromDb.Enable( FALSE );
        aRbDbFmtFromUsr.Enable( FALSE );
        aLbDbFmtFromUsr.Enable( FALSE );

        aPbTblFormat.Enable( bEnableFrom );
    }
    aLbTblDbColumn.SetUpdateMode( TRUE );
    aLbTableCol.SetUpdateMode( TRUE );

    return 0;
}
/* ---------------------------------------------------------------------------

 ---------------------------------------------------------------------------*/
IMPL_LINK( SwInsertDBColAutoPilot, DblClickHdl, ListBox*, pBox )
{
    Button* pButton = 0;
    if( pBox == &aLbTxtDbColumn )
        pButton = &aPbDbcolToEdit;
    else if( pBox == &aLbTblDbColumn && aPbDbcolOneTo.IsEnabled() )
        pButton = &aPbDbcolOneTo;
    else if( pBox == &aLbTableCol && aPbDbcolOneFrom.IsEnabled() )
        pButton = &aPbDbcolOneFrom;

    if( pButton )
        TblToFromHdl( pButton );

    return 0;
}
/* ---------------------------------------------------------------------------

 ---------------------------------------------------------------------------*/
IMPL_LINK( SwInsertDBColAutoPilot, TblFmtHdl, PushButton*, pButton )
{
    SwWrtShell& rSh = pView->GetWrtShell();
    SFX_APP()->GetOptions().SetMetric( ::GetDfltMetric(0 != PTR_CAST(SwWebView, pView)) );
    BOOL bNewSet = FALSE;
    if( !pTblSet )
    {
        bNewSet = TRUE;
        pTblSet = new SfxItemSet( rSh.GetAttrPool(), aUITableAttrRange );

        //Ersteinmal die einfachen Attribute besorgen.
        pTblSet->Put( SfxStringItem( FN_PARAM_TABLE_NAME, rSh.GetUniqueTblName() ));
        pTblSet->Put( SfxBoolItem( FN_PARAM_TABLE_HEADLINE, TRUE ) );

        pTblSet->Put( SfxUInt16Item( SID_BACKGRND_DESTINATION,
                                    rSh.GetViewOptions()->GetTblDest() ));

        SvxBrushItem aBrush( RES_BACKGROUND );
        pTblSet->Put( aBrush );
        pTblSet->Put( aBrush, SID_ATTR_BRUSH_ROW );
        pTblSet->Put( aBrush, SID_ATTR_BRUSH_TABLE );

        SvxBoxInfoItem aBoxInfo;
            // Tabellenvariante, wenn mehrere Tabellenzellen selektiert
        aBoxInfo.SetTable( TRUE );
            // Abstandsfeld immer anzeigen
        aBoxInfo.SetDist( TRUE);
            // Minimalgroesse in Tabellen und Absaetzen setzen
        aBoxInfo.SetMinDist( FALSE );
            // Default-Abstand immer setzen
        aBoxInfo.SetDefDist( MIN_BORDER_DIST );
            // Einzelne Linien koennen nur in Tabellen DontCare-Status haben
        aBoxInfo.SetValid( VALID_DISABLE, TRUE );
        pTblSet->Put( aBoxInfo );

        SwGetCurColNumPara aPara;
        const int nNum = rSh.GetCurColNum( &aPara );
        long nWidth;

        if( nNum )
        {
            nWidth = aPara.pPrtRect->Width();
            const SwFmtCol& rCol = aPara.pFrmFmt->GetCol();
            const SwColumns& rCols = rCol.GetColumns();

            //nStart und nEnd initialisieren fuer nNum == 0
            long nWidth1 = 0,
                nStart1 = 0,
                nEnd1 = nWidth;
            for( int i = 0; i < nNum; ++i )
            {
                SwColumn* pCol = rCols[i];
                nStart1 = pCol->GetLeft() + nWidth1;
                nWidth1 += (long)rCol.CalcColWidth( i, (USHORT)nWidth );
                nEnd1 = nWidth1 - pCol->GetRight();
            }
            if(nStart1 || nEnd1 != nWidth)
                nWidth = nEnd1 - nStart1;
        }
        else
            nWidth = rSh.GetAnyCurRect(
                                FRMTYPE_FLY_ANY & rSh.GetFrmType( 0, TRUE )
                                              ? RECT_FLY_PRT_EMBEDDED
                                              : RECT_PAGE_PRT ).Width();

        SwTabCols aTabCols;
        aTabCols.SetRight( nWidth );
        aTabCols.SetRightMax( nWidth );
        pRep = new SwTableRep( aTabCols, FALSE );
        pRep->SetAlign( HORI_NONE );
        pRep->SetSpace( nWidth );
        pRep->SetWidth( nWidth );
        pRep->SetWidthPercent( 100 );
        pTblSet->Put( SwPtrItem( FN_TABLE_REP, pRep ));

        pTblSet->Put( SfxUInt16Item( SID_HTML_MODE,
                    ::GetHtmlMode( pView->GetDocShell() )));
    }

    if( aLbTableCol.GetEntryCount() != pRep->GetAllColCount() )
    {
        // Anzahl der Spalten hat sich geaendert: dann muessen die
        // TabCols angepasst werden
        long nWidth = pRep->GetWidth();
        USHORT nCols = aLbTableCol.GetEntryCount() - 1;
        SwTabCols aTabCols( nCols );
        aTabCols.SetRight( nWidth  );
        aTabCols.SetRightMax( nWidth );
        if( nCols )
            for( USHORT n = 0, nStep = nWidth / (nCols+1), nW = nStep;
                    n < nCols; ++n, nW += nStep )
            {
                aTabCols.Insert( nW, n );
                aTabCols.InsertHidden( n, FALSE );
            }
        delete pRep;
        pRep = new SwTableRep( aTabCols, FALSE );
        pRep->SetAlign( HORI_NONE );
        pRep->SetSpace( nWidth );
        pRep->SetWidth( nWidth );
        pRep->SetWidthPercent( 100 );
        pTblSet->Put( SwPtrItem( FN_TABLE_REP, pRep ));
    }

    SwTableTabDlg* pDlg = new SwTableTabDlg( pButton, rSh.GetAttrPool(),
                                            pTblSet, &rSh );
    if( RET_OK == pDlg->Execute() )
        pTblSet->Put( *pDlg->GetOutputItemSet() );
    else if( bNewSet )
    {
        delete pTblSet, pTblSet = 0;
        delete pRep, pRep = 0;
    }
    delete pDlg;

    return 0;
}
/* ---------------------------------------------------------------------------

 ---------------------------------------------------------------------------*/
IMPL_LINK( SwInsertDBColAutoPilot, AutoFmtHdl, PushButton*, pButton )
{
    SwAutoFormatDlg aDlg( pButton, pView->GetWrtShellPtr(), FALSE, pTAutoFmt );
    if( RET_OK == aDlg.Execute())
        aDlg.FillAutoFmtOfIndex( pTAutoFmt );
    return 0;
}
/* ---------------------------------------------------------------------------

 ---------------------------------------------------------------------------*/
IMPL_LINK( SwInsertDBColAutoPilot, SelectHdl, ListBox*, pBox )
{
    ListBox* pGetBox = pBox == &aLbDbFmtFromUsr
                            ? ( aRbAsTable.IsChecked()
                                    ? ( 0 == aLbTableCol.GetEntryData( 0 )
                                        ? &aLbTblDbColumn
                                        : &aLbTableCol )
                                    : &aLbTxtDbColumn )
                            : pBox;

    USHORT nFndPos;
    SwInsDBColumn aSrch( pGetBox->GetSelectEntry(), 0 );
    aDBColumns.Seek_Entry( &aSrch, &nFndPos );

    if( pBox == &aLbDbFmtFromUsr )
    {
        if( aSrch.sColumn.Len() )
        {
            aOldNumFmtLnk.Call( pBox );
            aDBColumns[ nFndPos ]->nUsrNumFmt = aLbDbFmtFromUsr.GetFormat();
        }
    }
    else
    {
        // an der FormatGroupBox den ausgewaehlten FeldNamen setzen, damit
        // klar ist, welches Feld ueber das Format eingestellt wird!
        String sTxt( aGbDbFormat.GetText().Copy( 0, nGBFmtLen ));
        if( !aSrch.sColumn.Len() )
        {
            aRbDbFmtFromDb.Enable( FALSE );
            aRbDbFmtFromUsr.Enable( FALSE );
            aLbDbFmtFromUsr.Enable( FALSE );
        }
        else
        {
            BOOL bEnableFmt = aDBColumns[ nFndPos ]->bHasFmt;
            aRbDbFmtFromDb.Enable( bEnableFmt );
            aRbDbFmtFromUsr.Enable( bEnableFmt );

            if( bEnableFmt )
                (( sTxt += C2S(" (" )) += aSrch.sColumn ) += (sal_Unicode)')';

            BOOL bIsDBFmt = aDBColumns[ nFndPos ]->bIsDBFmt;
            aRbDbFmtFromDb.Check( bIsDBFmt );
            aRbDbFmtFromUsr.Check( !bIsDBFmt );
            aLbDbFmtFromUsr.Enable( !bIsDBFmt );
            if( !bIsDBFmt )
                aLbDbFmtFromUsr.SetDefFormat( aDBColumns[ nFndPos ]->nUsrNumFmt );
        }

        aGbDbFormat.SetText( sTxt );

        // um spaeter zu wissen, welche ListBox die "aktive" war, wird sich
        // im 1. Eintrag ein Flag gemerkt,
        void* pPtr = pBox == &aLbTableCol ? &aLbTableCol : 0;
        aLbTableCol.SetEntryData( 0, pPtr );
    }
    return 0;
}
/* ---------------------------------------------------------------------------

 ---------------------------------------------------------------------------*/
IMPL_LINK( SwInsertDBColAutoPilot, HeaderHdl, Button*, pButton )
{
    if( pButton == &aCbTableHeadon )
    {
        BOOL bEnable = aCbTableHeadon.IsChecked();

        aRbHeadlColnms.Enable( bEnable );
        aRbHeadlEmpty.Enable( bEnable );
    }
    return 0;
}
/* ---------------------------------------------------------------------------

 ---------------------------------------------------------------------------*/
void lcl_InsTextInArr( const String& rTxt, _DB_Columns& rColArr )
{
    _DB_Column* pNew;
    USHORT nSttPos = 0, nFndPos;
    while( STRING_NOTFOUND != ( nFndPos = rTxt.Search( '\x0A', nSttPos )) )
    {
        if( 1 < nFndPos )
        {
            pNew = new _DB_Column( rTxt.Copy( nSttPos, nFndPos -1 ) );
            rColArr.Insert( pNew, rColArr.Count() );
        }
        pNew = new _DB_Column;
        rColArr.Insert( pNew, rColArr.Count() );
        nSttPos = nFndPos + 1;
    }
    if( nSttPos < rTxt.Len() )
    {
        pNew = new _DB_Column( rTxt.Copy( nSttPos ) );
        rColArr.Insert( pNew, rColArr.Count() );
    }
}
/* ---------------------------------------------------------------------------

 ---------------------------------------------------------------------------*/
FASTBOOL SwInsertDBColAutoPilot::SplitTextToColArr( const String& rTxt,
                                _DB_Columns& rColArr,
                                BOOL bInsField )
{
    // aus dem Text wieder die einzelnen Datenbank - Spalten erzeugen
    // und dann in einem Array speichern
    // Die Datenbankspalten stehen in <> und muessen im Array der Spalten
    // vorhanden sein:
    String sTxt( rTxt );
    USHORT nFndPos, nEndPos, nSttPos = 0;

    while( STRING_NOTFOUND != ( nFndPos = sTxt.Search( cDBFldStart, nSttPos )))
    {
        nSttPos = nFndPos + 1;
        if( STRING_NOTFOUND != ( nEndPos = sTxt.Search( cDBFldEnd, nSttPos+1 )))
        {
            // Text in <> geklammert gefunden: was ist es denn:
            SwInsDBColumn aSrch( sTxt.Copy( nSttPos, nEndPos - nSttPos ), 0);
            if( aDBColumns.Seek_Entry( &aSrch, &nFndPos ) )
            {
                // das ist ein gueltiges Feld
                // also sicher den Text "davor":
                const SwInsDBColumn& rFndCol = *aDBColumns[ nFndPos ];

                _DB_Column* pNew;

                if( 1 < nSttPos )
                {
                    ::lcl_InsTextInArr( sTxt.Copy( 0, nSttPos-1 ), rColArr );
                    sTxt.Erase( 0, nSttPos-1 );
                }

                sTxt.Erase( 0, rFndCol.sColumn.Len() + 2 );
                nSttPos = 0;

                USHORT nSubType = 0;
                ULONG nFormat;
                if( rFndCol.bHasFmt )
                {
                    if( rFndCol.bIsDBFmt )
                        nFormat =  rFndCol.nDBNumFmt;
                    else
                    {
                        nFormat = rFndCol.nUsrNumFmt;
                        nSubType = SUB_OWN_FMT;
                    }
                }
                else
                    nFormat = 0;

                if( bInsField )
                {
                    SwWrtShell& rSh = pView->GetWrtShell();
#ifdef REPLACE_OFADBMGR
                    String sDBContent(aDBData.sDataBaseName);
                    sDBContent += DB_DELIM;
                    sDBContent += aDBData.sDataTableName;
                    SwDBFieldType aFldType( rSh.GetDoc(), aSrch.sColumn,
                                            sDBContent );
#else
                    SwDBFieldType aFldType( rSh.GetDoc(), aSrch.sColumn,
                                            rSh.GetDBName() );
#endif
                    pNew = new _DB_Column( rFndCol, *new SwDBField(
                            (SwDBFieldType*)rSh.InsertFldType( aFldType ),
                                                            nFormat ) );
                    if( nSubType )
                        pNew->DB_ColumnData.pField->SetSubType( nSubType );
                }
                else
                    pNew = new _DB_Column( rFndCol, nFormat );

                rColArr.Insert( pNew, rColArr.Count() );
            }
        }
    }

    // den letzten Text nicht vergessen
    if( sTxt.Len() )
        ::lcl_InsTextInArr( sTxt, rColArr );

    return 0 != rColArr.Count();
}
/* ---------------------------------------------------------------------------

 ---------------------------------------------------------------------------*/
#ifdef REPLACE_OFADBMGR
void SwInsertDBColAutoPilot::DataToDoc( const SbaSelectionList* pSelList,
    Reference< XDataSource> xSource,
    Reference< XConnection> xConnection )
#else
void SwInsertDBColAutoPilot::DataToDoc( const SbaSelectionList* pSelList )
#endif
{
    SwWrtShell& rSh = pView->GetWrtShell();

#ifdef REPLACE_OFADBMGR
       Reference< sdbc::XResultSet > xResultSet;
    Reference< sdbc::XRow > xRow;
    Reference< sdbc::XStatement > xStatement;
    BOOL bScrollable;
    try
    {
        bScrollable = xConnection->getMetaData()->supportsResultSetType((sal_Int32)ResultSetType::SCROLL_INSENSITIVE);

        xStatement = xConnection->createStatement();
        Reference< XPropertySet > xStatProp(xStatement, UNO_QUERY);
        if(bScrollable)
        {
            Any aResType;
            aResType <<= (sal_Int32)ResultSetType::SCROLL_INSENSITIVE;
            xStatProp->setPropertyValue(C2U("ResultSetType"), aResType);
        }
        if(xStatement.is())
            xResultSet = xStatement->executeQuery(aDBData.sStatement);
        xRow = Reference< sdbc::XRow >(xResultSet, UNO_QUERY);
    }
    catch(Exception aExcept)
    {
        DBG_ERROR("exception caught")
    }
    if(!xResultSet.is() || !xRow.is())
        return;
#else

    SwNewDBMgr* pDBMgr = rSh.GetNewDBMgr();
    if( ( aRbAsTable.IsChecked() ? !aLbTableCol.GetEntryCount()
                                 : !aEdDbText.GetText().Len() ) ||
        !pDBMgr->ToFirstSelectedRecord( DBMGR_STD ) ||
        !pDBMgr->IsSuccessful( DBMGR_STD ) )
        return ;

    OfaDBParam& rParam = pDBMgr->GetDBData( DBMGR_STD );

    rParam.pSelectionList->Clear();
    if( pSelList && -1L != (long)pSelList->GetObject( 0 ) )
    {
        *rParam.pSelectionList = *pSelList;
        if( !pSelList->Count() )
            pSelList = 0;
    }
    else
        pSelList = 0;

    SbaDBDataDefRef xColDef = pDBMgr->OpenColumnNames( DBMGR_STD );

#endif
    rSh.StartAllAction();
    rSh.StartUndo( 0 );
    BOOL bGroupUndo = rSh.DoesGroupUndo();
    rSh.DoGroupUndo( FALSE );

    SvNumberFormatter& rNumFmtr = *rSh.GetNumberFormatter();

    if( rSh.HasSelection() )
        rSh.DelRight();

    SwWait *pWait = 0;

    if( aRbAsTable.IsChecked() )            // Daten als Tabelle einfuegen
    {
        USHORT n, nRows = 0, nCols = aLbTableCol.GetEntryCount();
        if( aCbTableHeadon.IsChecked() )
            nRows++;

        if( pSelList )
            nRows += (USHORT)pSelList->Count();
        else
            ++nRows;

        // bereite das Array fuer die ausgewaehlten Spalten auf
        SwInsDBColumns_SAR aColFlds( 255 >= nCols ? (BYTE)nCols : 255, 5 );
        for( n = 0; n < nCols; ++n )
        {
            USHORT nFndPos;
            SwInsDBColumn aSrch( aLbTableCol.GetEntry( n ), 0 );
            if( aDBColumns.Seek_Entry( &aSrch, &nFndPos ) )
                aColFlds.Insert( aDBColumns[ nFndPos ], n );
            else
                ASSERT( !this, "Datenbankspalte nicht mehr gefunden" );
        }

        if( nCols != aColFlds.Count() )
        {
            ASSERT( !this, "nicht alle Datenbankspalten gefunden" );
            nCols = aColFlds.Count();
        }

        const SwModuleOptions* pModOpt = SW_MOD()->GetModuleConfig();

        BOOL bHTML = 0 != (::GetHtmlMode( pView->GetDocShell() ) & HTMLMODE_ON);
        rSh.InsertTable( nRows, nCols, HORI_FULL,
                         pModOpt->GetInsTblFlags(bHTML),
                        (pSelList ? pTAutoFmt : 0));
        rSh.MoveTable( fnTablePrev, fnTableStart );

        if( pSelList && pTblSet )
            SetTabSet();

        SfxItemSet aTblSet( rSh.GetAttrPool(), RES_BOXATR_FORMAT,
                                                RES_BOXATR_VALUE );
        BOOL bIsAutoUpdateCells = rSh.IsAutoUpdateCells();
        rSh.SetAutoUpdateCells( FALSE );


        if( aCbTableHeadon.IsChecked() )
        {
            for( n = 0; n < nCols; ++n )
            {
                if( aRbHeadlColnms.IsChecked() )
                    rSh.SwEditShell::Insert( aColFlds[ n ]->sColumn );
                rSh.GoNextCell();
            }
        }
        else
            rSh.SetHeadlineRepeat( FALSE );

        for( ULONG i = 0 ; ; ++i )
        {
#ifdef REPLACE_OFADBMGR
            BOOL bBreak = FALSE;
            try
            {
                if(bScrollable)
                {
                    if(pSelList)
                        bBreak = !xResultSet->absolute((ULONG)pSelList->GetObject( i ) );
                    else if(!i)
                        bBreak = !xResultSet->first();
                }
                else if(pSelList)
                {
                    ULONG nOldPos = i ? 0 : (ULONG)pSelList->GetObject( i -1 );
                    ULONG nPos = (ULONG)pSelList->GetObject( i );
                    long nDiff = nPos - nOldPos;
                    while(nDiff > 0 && !bBreak)
                    {
                        bBreak = !xResultSet->next();
                        nDiff--;
                    }
                }
                else if(!i)
                    bBreak = !xResultSet->next();

            }
            catch(Exception aExcept)
            {
                bBreak = TRUE;
            }
            if(bBreak)
                break;
#else
            if( pSelList )
                // naechsten zu lesenden Datensatz ansteuern
                pDBMgr->GotoRecord( (ULONG)pSelList->GetObject( i ));
            const ODbRowRef&  xRow = rParam.GetCursor()->GetRow();
#endif
            for( n = 0; n < nCols; ++n )
            {
                // beim aller erstenmal KEIN GoNextCell, weil wir schon
                // drin stehen. Auch nicht nach dem Insert das GoNextCell,
                // weil am Ende eine leere Zeile einfuegt wird.
                if( i || n )
                    rSh.GoNextCell();

                const SwInsDBColumn* pEntry = aColFlds[ n ];
#ifdef REPLACE_OFADBMGR
                Reference< XColumnsSupplier > xColsSupp( xResultSet, UNO_QUERY );
                Reference <XNameAccess> xCols = xColsSupp->getColumns();
                Any aCol = xCols->getByName(pEntry->sColumn);
                Reference< XPropertySet > xColumnProps;
                if(aCol.hasValue())
                    xColumnProps = *(Reference< XPropertySet >*)aCol.getValue();
                Reference< XColumn > xColumn(xColumnProps, UNO_QUERY);
#else
                const ODbVariantRef& xVar = (*xRow)[pEntry->nCol+1];
#endif
                try
                {
                    if( pEntry->bHasFmt )
                    {
                        SwTblBoxNumFormat aNumFmt(
                                        pEntry->bIsDBFmt ? pEntry->nDBNumFmt
                                                         : pEntry->nUsrNumFmt );
                        aTblSet.Put(aNumFmt);
#ifdef REPLACE_OFADBMGR
                        if( xColumn.is() )
#else
                        if( !xVar->isNull() )
#endif
                        {
#ifdef REPLACE_OFADBMGR
                            double fVal = xColumn->getDouble();
                            if( xColumn->wasNull() )
                                aTblSet.ClearItem( RES_BOXATR_VALUE );
                            else
                            {
#else
                            double fVal = xVar->toDouble();
#endif
                                if(rNumFmtr.GetType(aNumFmt.GetValue()) & NUMBERFORMAT_DATE)
                                {
                                    ::Date aStandard(1,1,1900);
                                    if (*rNumFmtr.GetNullDate() != aStandard)
                                        fVal += (aStandard - *rNumFmtr.GetNullDate());
                                }
                                aTblSet.Put( SwTblBoxValue( fVal ));
#ifdef REPLACE_OFADBMGR
                            }
#endif
                        }
                        else
                            aTblSet.ClearItem( RES_BOXATR_VALUE );
                        rSh.SetTblBoxFormulaAttrs( aTblSet );
                    }
#ifdef REPLACE_OFADBMGR
                    else
                    {
                        OUString sVal =  xColumn->getString();
                        if(!xColumn->wasNull())
                            rSh.SwEditShell::Insert( sVal );
                    }
#else
                    else if( !xVar->isNull() )
                        rSh.SwEditShell::Insert( xVar->toString() );
#endif
                }
#ifdef REPLACE_OFADBMGR
                catch(Exception aExcept)
                {
                    DBG_ERROR(ByteString(String(aExcept.Message), gsl_getSystemTextEncoding()).GetBuffer())
                }
#else
                catch(...)
                {
                }
#endif
            }

            if( !pSelList )
            {
#ifdef REPLACE_OFADBMGR
                BOOL bNext = xResultSet->next();
                if(!bNext)
                    break;
#else
                rParam.GetCursor()->Next();
                rParam.CurrentPos()++;
                if( rParam.GetCursor()->IsOffRange() )
                    break;
#endif
            }
            else if( i+1 >= pSelList->Count() )
                break;

            if( 10 == i )
                pWait = new SwWait( *pView->GetDocShell(), TRUE );
        }

        rSh.MoveTable( fnTableCurr, fnTableStart );
        if( !pSelList && ( pTblSet || pTAutoFmt ))
        {
            if( pTblSet )
                SetTabSet();

            if( pTAutoFmt )
                rSh.SetTableAutoFmt( *pTAutoFmt );
        }
        rSh.SetAutoUpdateCells( bIsAutoUpdateCells );
    }
    else                            // Daten als Felder/Text einfuegen
    {
        _DB_Columns aColArr;
        if( SplitTextToColArr( aEdDbText.GetText(), aColArr, aRbAsField.IsChecked() ) )
        {
            // jetzt kann bei jedem Datensatz einfach ueber das Array iteriert
            // und die Daten eingefuegt werden

            if( !rSh.IsSttPara() )
                rSh.SwEditShell::SplitNode();
            if( !rSh.IsEndPara() )
            {
                rSh.SwEditShell::SplitNode();
                rSh.SwCrsrShell::Left();
            }

            SwTxtFmtColl* pColl = 0;
            {
                String sTmplNm( aLbDbParaColl.GetSelectEntry() );
                if( sNoTmpl != sTmplNm )
                {
                    pColl = rSh.FindTxtFmtCollByName( sTmplNm );
                    if( !pColl )
                    {
                        USHORT nId = rSh.GetPoolId( sTmplNm, GET_POOLID_TXTCOLL );
                        if( USHRT_MAX != nId )
                            pColl = rSh.GetTxtCollFromPool( nId );
                        else
                            pColl = rSh.MakeTxtFmtColl( sTmplNm );
                    }
                    rSh.SetTxtFmtColl( pColl );
                }
            }

            // fuers Einfuegen als Felder -> nach jedem Datensatz ein
            // "NextField" einfuegen
#ifdef REPLACE_OFADBMGR
            SwDBFormatData aDBFormatData;
            Reference< XMultiServiceFactory > xMgr( ::utl::getProcessServiceFactory() );
            if( xMgr.is() )
            {
                Reference<XInterface> xInstance = xMgr->createInstance( C2U( "com.sun.star.util.NumberFormatter" ));
                aDBFormatData.xFormatter = Reference<util::XNumberFormatter>(xInstance, UNO_QUERY) ;
            }

            Reference<XPropertySet> xSourceProps(xSource, UNO_QUERY);
            if(xSourceProps.is())
            {
                Any aFormats = xSourceProps->getPropertyValue(C2U("NumberFormatsSupplier"));
                if(aFormats.hasValue())
                {
                    Reference<XNumberFormatsSupplier> xSuppl = *(Reference<util::XNumberFormatsSupplier>*) aFormats.getValue();
                    if(xSuppl.is())
                    {
                        Reference< XPropertySet > xSettings = xSuppl->getNumberFormatSettings();
                        Any aNull = xSettings->getPropertyValue(C2U("NullDate"));
                        if(aNull.hasValue())
                            aDBFormatData.aNullDate = *(util::Date*)aNull.getValue();
                    }
                }
            }
            if(xSourceProps.is())
            {
                Any aFormats = xSourceProps->getPropertyValue(C2U("NumberFormatsSupplier"));
                if(aFormats.hasValue())
                {
                    Reference<XNumberFormatsSupplier> xSuppl = *(Reference<util::XNumberFormatsSupplier>*) aFormats.getValue();
                    if(xSuppl.is())
                    {
                        Reference< XPropertySet > xSettings = xSuppl->getNumberFormatSettings();
                        Any aNull = xSettings->getPropertyValue(C2U("NullDate"));
                        if(aNull.hasValue())
                            aDBFormatData.aNullDate = *(util::Date*)aNull.getValue();
                    }
                }
            }
            SfxItemSet aSet(pView->GetPool(), RES_CHRATR_LANGUAGE, RES_CHRATR_LANGUAGE);
            rSh.GetAttr( aSet );
            if(SFX_ITEM_DEFAULT <= aSet.GetItemState(RES_CHRATR_LANGUAGE, TRUE))
            {
                Any aLoc;
                const SfxPoolItem& rItem = aSet.Get(RES_CHRATR_LANGUAGE);
                rItem.QueryValue(aLoc,  MID_LANG_LOCALE);
                aDBFormatData.aLocale = *(Locale*)aLoc.getValue();
            }

            String sDBContent(aDBData.sDataBaseName);
            sDBContent += DB_DELIM;
            sDBContent += aDBData.sDataTableName;
            sDBContent += ';';
            sDBContent += aDBData.sStatement;
            SwDBNextSetField aNxtDBFld( (SwDBNextSetFieldType*)rSh.
                                        GetFldType( 0, RES_DBNEXTSETFLD ),
                                        C2S("1"), aEmptyStr, sDBContent );

#else
            SwDBNextSetField aNxtDBFld( (SwDBNextSetFieldType*)rSh.
                                        GetFldType( 0, RES_DBNEXTSETFLD ),
                                        C2S("1"), aEmptyStr, rSh.GetDBName() );
#endif

            BOOL bSetCrsr = TRUE;
            USHORT n, nCols = aColArr.Count();
            for( ULONG i = 0 ; ; ++i )
            {
#ifdef REPLACE_OFADBMGR
                BOOL bBreak = FALSE;
                try
                {
                    if(bScrollable)
                    {
                        if(pSelList)
                            bBreak = !xResultSet->absolute((ULONG)pSelList->GetObject( i ) );
                        else if(!i)
                            bBreak = !xResultSet->first();
                    }
                    else if(pSelList)
                    {
                        ULONG nOldPos = i ? 0 : (ULONG)pSelList->GetObject( i -1 );
                        ULONG nPos = (ULONG)pSelList->GetObject( i );
                        long nDiff = nPos - nOldPos;
                        while(nDiff > 0 && !bBreak)
                        {
                            bBreak = !xResultSet->next();
                            nDiff--;
                        }
                    }
                    else if(!i)
                        bBreak = !xResultSet->next();
                }
                catch(...){ bBreak = TRUE; }
                if(bBreak)
                    break;
#else
                if( pSelList )
                {
                    ULONG nIndex = (ULONG)pSelList->GetObject( i );
                    // naechsten zu lesenden Datensatz ansteuern
                    pDBMgr->GotoRecord( nIndex );
                }

                const ODbRowRef&  xRow = rParam.GetCursor()->GetRow();
#endif
                for( n = 0; n < nCols; ++n )
                {
                    _DB_Column* pDBCol = aColArr[ n ];
                    String sIns;
                    switch( pDBCol->eColType )
                    {
                    case _DB_Column::DB_FILLTEXT:
                        sIns =  *pDBCol->DB_ColumnData.pText;
                        break;

                    case _DB_Column::DB_SPLITPARA:
                        rSh.SplitNode();
                        // wenn nicht die gleiche Vorlage die Follow Vorlage
                        // ist, dann muss die ausgewaehlte neu gesetzt werden
                        if( pColl && &pColl->GetNextTxtFmtColl() != pColl )
                            rSh.SetTxtFmtColl( pColl );
                        break;

                    case _DB_Column::DB_COL_FIELD:
                        {
                            SwDBField* pFld = (SwDBField*)pDBCol->DB_ColumnData.
                                                pField->Copy();
                            double nValue = DBL_MAX;
#ifdef REPLACE_OFADBMGR
                            Reference< XColumnsSupplier > xColsSupp( xResultSet, UNO_QUERY );
                            Reference <XNameAccess> xCols = xColsSupp->getColumns();
                            Any aCol = xCols->getByName(pDBCol->pColInfo->sColumn);
                            Reference< XPropertySet > xColumnProps;
                            if(aCol.hasValue())
                                xColumnProps = *(Reference< XPropertySet >*)aCol.getValue();
                            pFld->SetExpansion( SwNewDBMgr::GetDBField(
                                                xColumnProps,
                                                aDBFormatData,
                                                &nValue ) );
#else
                            pFld->SetExpansion( pDBMgr->ImportDBField(
                                                pDBCol->pColInfo->nCol+1,
                                                &xColDef, xRow, &nValue ) );
#endif
                            if( DBL_MAX != nValue )
                                pFld->ChgValue( nValue, TRUE );
                            pFld->SetInitialized();

                            rSh.Insert( *pFld );
                            delete pFld;
                        }
                        break;

                    case _DB_Column::DB_COL_TEXT:
                        {
                            double nValue = DBL_MAX;
#ifdef REPLACE_OFADBMGR
                            Reference< XColumnsSupplier > xColsSupp( xResultSet, UNO_QUERY );
                            Reference <XNameAccess> xCols = xColsSupp->getColumns();
                            Any aCol = xCols->getByName(pDBCol->pColInfo->sColumn);
                            Reference< XPropertySet > xColumnProps;
                            if(aCol.hasValue())
                                xColumnProps = *(Reference< XPropertySet >*)aCol.getValue();
                            sIns = SwNewDBMgr::GetDBField(
                                                xColumnProps,
                                                aDBFormatData,
                                                &nValue );
#else
                            sIns = pDBMgr->ImportDBField(
                                            pDBCol->pColInfo->nCol+1,
                                            &xColDef, xRow, &nValue );
#endif
                            if( pDBCol->DB_ColumnData.nFormat &&
                                DBL_MAX != nValue )
                            {
                                Color* pCol;
                                SvNumberFormatter& rNFmtr =
                                                    *rSh.GetNumberFormatter();
                                rNFmtr.GetOutputString( nValue,
                                            pDBCol->DB_ColumnData.nFormat,
                                            sIns, &pCol );
                            }
                        }
                        break;
                    }

                    if( sIns.Len() )
                        rSh.Insert( sIns );

                    if( bSetCrsr && sIns.Len() )
                    {
                        // zum Anfang und eine Mark setzen, damit der
                        // Cursor am Ende wieder auf Anfangsposition
                        // gesetzt werden kann.
                        BOOL bDoesUndo = rSh.DoesUndo();
                        rSh.DoUndo( FALSE );
                        rSh.SwCrsrShell::MovePara( fnParaCurr, fnParaStart );
                        rSh.SetBookmark( KeyCode(), C2S("DB_Mark"), aEmptyStr, MARK );
                        rSh.SwCrsrShell::MovePara( fnParaCurr, fnParaEnd );
                        bSetCrsr = FALSE;
                        rSh.DoUndo( bDoesUndo );
                    }
                }

                if( !pSelList )
                {
#ifdef REPLACE_OFADBMGR
                    BOOL bNext = xResultSet->next();
                    if(!bNext)
                        break;
#else
                    rParam.GetCursor()->Next();
                    rParam.CurrentPos()++;

                    if( rParam.GetCursor()->IsOffRange() )
                        break;
#endif
                }
                else if( i+1 >= pSelList->Count() )
                    break;

                if( aRbAsField.IsChecked() )
                    rSh.Insert( aNxtDBFld );

                if( !rSh.IsSttPara() )
                    rSh.SwEditShell::SplitNode();

                if( 10 == i )
                    pWait = new SwWait( *pView->GetDocShell(), TRUE );
            }

            if( !bSetCrsr && USHRT_MAX != (n = rSh.FindBookmark( C2S("DB_Mark" ))) )
            {
                BOOL bDoesUndo = rSh.DoesUndo();
                rSh.DoUndo( FALSE );
                rSh.GotoBookmark( n );
                rSh.DelBookmark( n );
                rSh.DoUndo( bDoesUndo );
            }
        }
    }

    // Daten ins INI-File schreiben
    WriteUIToIni();

    rSh.DoGroupUndo( bGroupUndo );
    rSh.EndUndo( 0 );
    rSh.EndAllAction();
    delete pWait;
}
void SwInsertDBColAutoPilot::SetTabSet()
{
    SwWrtShell& rSh = pView->GetWrtShell();
    const SfxPoolItem* pItem;

    if( pTAutoFmt )
    {
        if( pTAutoFmt->IsFrame() )
        {
            // Umrandung kommt vom AutoFormat
            pTblSet->ClearItem( RES_BOX );
            pTblSet->ClearItem( SID_ATTR_BORDER_INNER );
        }
        if( pTAutoFmt->IsBackground() )
        {
            pTblSet->ClearItem( RES_BACKGROUND );
            pTblSet->ClearItem( SID_ATTR_BRUSH_ROW );
            pTblSet->ClearItem( SID_ATTR_BRUSH_TABLE );
        }
    }
    else
    {
        // die Defaults wieder entfernen, es macht keinen Sinn sie zu setzen
        SvxBrushItem aBrush( RES_BACKGROUND );
        static USHORT __READONLY_DATA aIds[3] =
            { RES_BACKGROUND, SID_ATTR_BRUSH_ROW, SID_ATTR_BRUSH_TABLE };
        for( int i = 0; i < 3; ++i )
            if( SFX_ITEM_SET == pTblSet->GetItemState( aIds[ i ],
                FALSE, &pItem ) && *pItem == aBrush )
                pTblSet->ClearItem( aIds[ i ] );
    }

    if( SFX_ITEM_SET == pTblSet->GetItemState( FN_PARAM_TABLE_NAME, FALSE,
        &pItem ) && ((const SfxStringItem*)pItem)->GetValue() ==
                    rSh.GetTableFmt()->GetName() )
        pTblSet->ClearItem( FN_PARAM_TABLE_NAME );

    rSh.MoveTable( fnTableCurr, fnTableStart );
    rSh.SetMark();
    rSh.MoveTable( fnTableCurr, fnTableEnd );

    ::lcl_ItemSetToTableParam( *pTblSet, rSh );

    rSh.ClearMark();
    rSh.MoveTable( fnTableCurr, fnTableStart );
}

    // Daten ins INI-File schreiben
void SwInsertDBColAutoPilot::WriteUIToIni()
{
    if( !pConfig )
    {
        pConfig = new _DB_ColumnConfig;
        pConfig->Initialize();
    }

    _DB_ColumnConfigData* pNewData = new _DB_ColumnConfigData;

    //die Column-Daten Pointer gehen in den Besitz des pNewData!
    pNewData->aDBColumns.Insert( &aDBColumns );
    aDBColumns.Remove( (USHORT)0, aDBColumns.Count() );

    pNewData->sDBName = pView->GetWrtShell().GetDBName();
    pNewData->sEdit = aEdDbText.GetText();

    String sTmp;
    for( USHORT n = 0, nCnt = aLbTableCol.GetEntryCount(); n < nCnt; ++n )
        ( sTmp += aLbTableCol.GetEntry( n ) ) += '\x0a';

    if( sTmp.Len() )
        pNewData->sTblList = sTmp;

    if( sNoTmpl != (sTmp = aLbDbParaColl.GetSelectEntry()) )
        pNewData->sTmplNm = sTmp;

    if( pTAutoFmt )
        pNewData->sTAutoFmtNm = pTAutoFmt->GetName();

    pNewData->bIsTable = aRbAsTable.IsChecked();
    pNewData->bIsField = aRbAsField.IsChecked();
    pNewData->bIsHeadlineOn = aCbTableHeadon.IsChecked();
    pNewData->bIsEmptyHeadln = aRbHeadlEmpty.IsChecked();


    // jetzt noch die benutzerdefinierten Numberformatstrings erfragen,
    // denn nur  diese lassen sich "unabhaengig" speichern!
    SvNumberFormatter& rNFmtr = *pView->GetWrtShell().GetNumberFormatter();
    GetDocPoolNm( RES_POOLCOLL_STANDARD, sTmp );
    for( n = 0; n < pNewData->aDBColumns.Count(); ++n )
    {
        SwInsDBColumn& rSet = *pNewData->aDBColumns[ n ];
        if( rSet.bHasFmt && !rSet.bIsDBFmt )
        {
            const SvNumberformat* pNF = rNFmtr.GetEntry( rSet.nUsrNumFmt );
            if( pNF )
            {
                rSet.sUsrNumFmt = pNF->GetFormatstring();
                rSet.eUsrNumFmtLng = pNF->GetLanguage();
            }
            else
            {
                rSet.sUsrNumFmt = sTmp;
                rSet.eUsrNumFmtLng = LANGUAGE_SYSTEM;
            }
        }
    }

    pConfig->SetData( pNewData );
    pConfig->StoreConfig();
}

    // Daten aus dem INI-File lesen:
void SwInsertDBColAutoPilot::ReadIniToUI()
{
    if( !pConfig )

    {
        pConfig = new _DB_ColumnConfig;
        pConfig->Initialize();
    }

    _DB_ColumnConfigData aData;

    //die Column-Daten Pointer werden kopiert, bleiben im Besitz vom Dialog!
    aData.aDBColumns.Insert( &aDBColumns );
    aData.sDBName = pView->GetWrtShell().GetDBName();

    const _DB_ColumnConfigData* pFndData = pConfig->HasData( aData );
    if( pFndData )
    {
        USHORT n = 0;
        String sTmp( pFndData->sTblList );
        if( sTmp.Len() )
        {
            do {
                String sEntry( sTmp.GetToken( 0, '\x0a', n ) );
                aLbTableCol.InsertEntry( sEntry );
                aLbTblDbColumn.RemoveEntry( sEntry );
            } while( n < sTmp.Len() );

            if( !aLbTblDbColumn.GetEntryCount() )
            {
                aPbDbcolAllTo.Enable( FALSE );
                aPbDbcolOneTo.Enable( FALSE );
            }
            aPbDbcolOneFrom.Enable( TRUE );
            aPbDbcolAllFrom.Enable( TRUE );
        }
        aEdDbText.SetText( pFndData->sEdit );

        sTmp = pFndData->sTmplNm;
        if( sTmp.Len() )
            aLbDbParaColl.SelectEntry( sTmp );
        else
            aLbDbParaColl.SelectEntryPos( 0 );

        if( pTAutoFmt )
            delete pTAutoFmt, pTAutoFmt = 0;
        sTmp = pFndData->sTAutoFmtNm;
        if( sTmp.Len() )
        {
            // dann erstmal die AutoFmt-Datei laden und das Autoformat suchen
            SwTableAutoFmtTbl aAutoFmtTbl;
            aAutoFmtTbl.Load();
            for( USHORT n = aAutoFmtTbl.Count(); n; )
                if( sTmp == aAutoFmtTbl[ --n ]->GetName() )
                {
                    pTAutoFmt = new SwTableAutoFmt( *aAutoFmtTbl[ n ] );
                    break;
                }
        }

        aRbAsTable.Check( pFndData->bIsTable );
        aRbAsField.Check( pFndData->bIsField );
        aRbAsText.Check( !pFndData->bIsTable && !pFndData->bIsField );

        aCbTableHeadon.Check( pFndData->bIsHeadlineOn );
        aRbHeadlColnms.Check( !pFndData->bIsEmptyHeadln );
        aRbHeadlEmpty.Check( pFndData->bIsEmptyHeadln );

        // jetzt noch die benutzerdefinierten Numberformat Strings in die
        // Shell kopieren. Nur diese sind dann als ID verfuegbar
        SvNumberFormatter& rNFmtr = *pView->GetWrtShell().GetNumberFormatter();
        for( n = 0; n < aDBColumns.Count(); ++n )
        {
            SwInsDBColumn& rSet = *aDBColumns[ n ];
            const SwInsDBColumn& rGet = *pFndData->aDBColumns[ n ];
            if( rGet.bHasFmt && !rGet.bIsDBFmt )
            {
                rSet.bIsDBFmt = FALSE;
                rSet.nUsrNumFmt = rNFmtr.GetEntryKey( rGet.sUsrNumFmt,
                                                        rGet.eUsrNumFmtLng );
                if( NUMBERFORMAT_ENTRY_NOT_FOUND == rSet.nUsrNumFmt )
                {
                    xub_StrLen nCheckPos;
                    short nType;
                    rNFmtr.PutEntry( (String&)rGet.sUsrNumFmt, nCheckPos, nType,
                                    rSet.nUsrNumFmt, rGet.eUsrNumFmtLng );
                }
            }
        }

        // steht der Cursor in einer Tabelle, darf NIE Tabelle auswaehlbar sein
        if( !aRbAsTable.IsEnabled() && aRbAsTable.IsChecked() )
            aRbAsField.Check( TRUE );
    }

    aData.aDBColumns.Remove( (USHORT)0, aDBColumns.Count() );
}

/*  */


_DB_ColumnConfigData::~_DB_ColumnConfigData() {}

BOOL _DB_ColumnConfigData::IsEqualDB( const _DB_ColumnConfigData& rCmp ) const
{
    // teste, ob die Daten von der gleiche Databanktabelle kommen und
    // ob sie noch die gleichen Werte enthaelt.
    BOOL bRet = FALSE;
    if( sDBName == rCmp.sDBName &&
        aDBColumns.Count() == rCmp.aDBColumns.Count() )
    {
        bRet = TRUE;
        for( USHORT n = aDBColumns.Count(); n; )
        {
            --n;
            const SwInsDBColumn& rCmp1 = *aDBColumns[ n ];
            const SwInsDBColumn& rCmp2 = *rCmp.aDBColumns[ n ];
            if( rCmp1.sColumn != rCmp2.sColumn ||
                rCmp1.nCol != rCmp2.nCol ||
                rCmp1.bHasFmt != rCmp2.bHasFmt )
            {
                bRet = FALSE;
                break;
            }
        }
    }
    return bRet;
}

_DB_ColumnConfigData::_DB_ColumnConfigData( SvStream& rStream, UINT16 nVers )
{
    rStream.ReadByteString( sDBName ).ReadByteString(sEdit )
           .ReadByteString( sTblList ).ReadByteString( sTmplNm )
           .ReadByteString( sTAutoFmtNm );

    UINT16 n;
    rStream >> n;
    if( n )
    {
#ifdef WITH_STREAM_CORRECT
        ULONG nSttPos = rStream.Tell();
        UINT16 nOffset;
#endif
        UINT16 nCol, eLng;
        UINT8 nFlags;
        String sNm, sUsrFmt;

        for( UINT16 i = 0; i < n; ++i )
        {
#ifdef WITH_STREAM_CORRECT
            rStream >> nOffset;
#endif
            rStream.ReadByteString( sNm );
            rStream >> nCol
                    >> nFlags;
            rStream.ReadByteString( sUsrFmt );
            rStream >> eLng;

            SwInsDBColumn* pNew = new SwInsDBColumn( sNm, nCol );
            pNew->sUsrNumFmt = sUsrFmt;
            pNew->eUsrNumFmtLng = (LanguageType)eLng;

            pNew->bHasFmt   = 0 != (nFlags & 0x1);
            pNew->bIsDBFmt  = 0 != (nFlags & 0x2);

            aDBColumns.Insert( pNew, i );

#ifdef WITH_STREAM_CORRECT
            // muss etwas uebersprungen werden?
            ULONG nCurPos = rStream.Tell();
            if( nCurPos != ( nSttPos + nOffset ))
                rStream.Seek( nCurPos = ( nSttPos + nOffset ) );
            nSttPos = nCurPos;
#endif
        }
    }

    rStream >> n;
    bIsTable        = 0 != (n & 0x01);
    bIsField        = 0 != (n & 0x02);
    bIsHeadlineOn   = 0 != (n & 0x04);
    bIsEmptyHeadln  = 0 != (n & 0x08);

/*
    if( nVers > DBCOLUMN_CONFIG_VERSION1 )
    {
    }
*/
}

void _DB_ColumnConfigData::Save( SvStream& rStream ) const
{
    rStream.WriteByteString( sDBName ).WriteByteString( sEdit )
           .WriteByteString( sTblList ).WriteByteString( sTmplNm )
           .WriteByteString( sTAutoFmtNm );

    UINT16 n = aDBColumns.Count();
    rStream << n;
    if( n )
    {
#ifdef WITH_STREAM_CORRECT
        ULONG nCurPos, nSttPos = rStream.Tell();
#endif
        for( UINT16 i = 0; i < n; ++i )
        {
#ifdef WITH_STREAM_CORRECT
            rStream << (UINT16)0;
#endif

            const SwInsDBColumn& rCol = *aDBColumns[ i ];
            UINT8 nFlags = 0;
            if( rCol.bHasFmt )      nFlags |= 0x1;
            if( rCol.bIsDBFmt )     nFlags |= 0x2;

            rStream.WriteByteString( rCol.sColumn )
                    << (UINT16)rCol.nCol
                    << nFlags;
            rStream.WriteByteString( rCol.sUsrNumFmt )
                    << (UINT16)rCol.eUsrNumFmtLng
                    ;

#ifdef WITH_STREAM_CORRECT
            nCurPos = rStream.Tell();
            rStream.Seek( nSttPos );
            rStream << (UINT16)(nCurPos - nSttPos);
            rStream.Seek( nCurPos );
            nSttPos = nCurPos;
#endif
        }
    }

    n = 0;
    if( bIsTable )          n |= 0x01;
    if( bIsField )          n |= 0x02;
    if( bIsHeadlineOn )     n |= 0x04;
    if( bIsEmptyHeadln )    n |= 0x08;
    rStream << n;
}




_DB_ColumnConfig::_DB_ColumnConfig()
    : SfxConfigItem( CFG_INSERT_DBCOLUMN_ITEM )
{
    memset( &aData, 0, sizeof( aData ));
}

_DB_ColumnConfig::~_DB_ColumnConfig()
{
    for( USHORT n = DBCOLUMN_MAXDATA; n; )
        delete aData[ --n ];
}

void _DB_ColumnConfig::UseDefault()
{
    for( USHORT n = DBCOLUMN_MAXDATA; n; )
        delete aData[ --n ];
    SfxConfigItem::UseDefault();
}

String _DB_ColumnConfig::GetName() const
{
    return SW_RESSTR( STR_CFG_INSERT_DBCOLUMN );
}

int _DB_ColumnConfig::Load( SvStream& rStream )
{
    int nRet = SfxConfigItem::ERR_OK;

    SetDefault( FALSE );
    UINT16 nVers;
    rStream >> nVers;
    if( DBCOLUMN_CONFIG_VERSION1 >= nVers )
    {
        UINT16 n, nCnt;
        CharSet eOldCharSet = rStream.GetStreamCharSet();
        rStream >> n >> nCnt;

        if( nCnt )
        {
            rStream.SetStreamCharSet( (CharSet)n );

#ifdef WITH_STREAM_CORRECT
            ULONG nSttPos = rStream.Tell();
#endif
            for( UINT16 i = 0; i < nCnt; ++i )
            {
#ifdef WITH_STREAM_CORRECT
                rStream >> n;
#endif
                if( i < DBCOLUMN_MAXDATA )
                    aData[ i ] = new _DB_ColumnConfigData( rStream, nVers );

#ifdef WITH_STREAM_CORRECT
                // muss etwas uebersprungen werden?
                ULONG nCurPos = rStream.Tell();
                if( nCurPos != ( nSttPos + n ))
                    rStream.Seek( nCurPos = ( nSttPos + n ) );
                nSttPos = nCurPos;
#endif
            }
            rStream.SetStreamCharSet( eOldCharSet );
        }
    }
    else
        nRet = SfxConfigItem::WARNING_VERSION;

    return nRet;
}

BOOL _DB_ColumnConfig::Store( SvStream& rStream )
{
    CharSet eOldCharSet = rStream.GetStreamCharSet();
    rtl_TextEncoding eCurCharSet = ::gsl_getSystemTextEncoding();
    rStream.SetStreamCharSet( eCurCharSet );

    rStream << (UINT16)DBCOLUMN_CONFIG_VERSION
            << (UINT16)eCurCharSet;

    USHORT nCnt = DBCOLUMN_MAXDATA;
    for( USHORT n = 0; n < nCnt; ++n )
        if( !aData[ n ] )
        {
            nCnt = n;
            break;
        }

    rStream << (UINT16)nCnt;
    if( nCnt )
    {
#ifdef WITH_STREAM_CORRECT
        ULONG nCurPos, nSttPos = rStream.Tell();
#endif
        for( USHORT n = 0; n < nCnt; ++n )
        {
#ifdef WITH_STREAM_CORRECT
            rStream << (UINT16)0;
#endif

            aData[ n ]->Save( rStream );

#ifdef WITH_STREAM_CORRECT
            nCurPos = rStream.Tell();
            rStream.Seek( nSttPos );
            rStream << (UINT16)(nCurPos - nSttPos);
            rStream.Seek( nCurPos );
            nSttPos = nCurPos;
#endif
        }
    }
    rStream.SetStreamCharSet( eOldCharSet );

    return SfxConfigItem::ERR_OK;
}

const _DB_ColumnConfigData* _DB_ColumnConfig::HasData(
        const _DB_ColumnConfigData& rData ) const
{
    const _DB_ColumnConfigData* pRet = 0;
    for( USHORT n = 0; n < DBCOLUMN_MAXDATA; ++n )
        if( aData[ n ] && aData[ n ]->IsEqualDB( rData ))
        {
            pRet = aData[ n ];
            break;
        }
    return pRet;
}

void _DB_ColumnConfig::SetData( _DB_ColumnConfigData* pData )
{
    ASSERT( pData, "kein pData ans SetData uebergeben" );
    if( pData )
    {
        USHORT n, nDelPos = DBCOLUMN_MAXDATA-1;
        for( n = 0; n < DBCOLUMN_MAXDATA; ++n )
            if( !aData[ n ] ||  aData[ n ]->IsEqualDB( *pData ))
            {
                nDelPos = n;
                break;
            }

        // loesche den Eintrag an der DelPos und verschiebe alle
        // vorhergehenden eine Position runter. Der aktuelle wird
        // dann wieder am Anfang eingefuegt.
        delete aData[ nDelPos ];
        if( nDelPos )
            memmove( aData+1, aData, nDelPos * sizeof( aData[ 0 ] ));
        aData[ 0 ] = pData;

        SetDefault( FALSE );
    }
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.40  2000/09/18 16:05:18  willem.vandorp
    OpenOffice header added.

    Revision 1.39  2000/07/27 21:15:40  jp
    opt: get template names direct from the doc and don't load it from the resource

    Revision 1.38  2000/07/10 07:02:55  os
    replace ofadbmgr

    Revision 1.37  2000/07/06 07:59:10  os
    replace ofadbmgr

    Revision 1.36  2000/07/05 08:21:49  os
    Replace ofadbmgr

    Revision 1.35  2000/05/26 07:21:28  os
    old SW Basic API Slots removed

    Revision 1.34  2000/05/23 18:11:01  jp
    Bugfixes for Unicode

    Revision 1.33  2000/04/20 12:54:38  os
    GetName() returns String&

    Revision 1.32  2000/04/11 08:03:52  os
    UNICODE

    Revision 1.31  2000/03/30 13:25:58  os
    UNO III

    Revision 1.30  2000/02/11 14:44:18  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.29  1999/09/24 13:50:13  os
    chg: ODbRow/ODbVariant

    Revision 1.28  1999/08/10 08:31:24  JP
    Bug #67040#: data to text - set double to defined value


      Rev 1.27   10 Aug 1999 10:31:24   JP
   Bug #67040#: data to text - set double to defined value

      Rev 1.26   08 Jul 1999 16:07:52   MA
   Use internal object to toggle wait cursor

      Rev 1.25   08 Jul 1999 09:13:50   MA
   limit wait cursor to document window

      Rev 1.24   18 Jun 1999 14:03:36   JP
   Bug #67040#: DataToDoc - clear ValueItem in TableSet

      Rev 1.23   16 Jun 1999 22:05:08   JP
   Bug #66996##66995#: DataToDoc - set userformat flag at field, use userformat for text

      Rev 1.22   09 Jun 1999 16:25:46   JP
   Bug #66735#: TblFmtHdl: no 0 pointer access

      Rev 1.21   11 May 1999 21:48:20   JP
   Task #66127#: Methoden rund ums Lineal verbessert und Schnittstellen veraendert/erweitert

      Rev 1.20   29 Apr 1999 09:59:04   JP
   Bug #65544#: Spalten ggfs. auch vom Bereich besorgen

      Rev 1.19   22 Feb 1999 11:50:02   JP
   fuer Bug #61545#: Code optimiert

      Rev 1.18   17 Feb 1999 08:39:24   OS
   #58158# Einfuegen TabPage auch in HTML-Docs

      Rev 1.17   30 Nov 1998 17:31:02   OM
   #59770# Tabellenoptionen: Ueberschrift nur auf erster Seite

      Rev 1.16   27 Nov 1998 14:49:56   AMA
   Fix #59951#59825#: Unterscheiden zwischen Rahmen-,Seiten- und Bereichsspalten

      Rev 1.15   11 Nov 1998 16:49:36   OM
   #58158# Einfuegeoptionen fuer Tabellen

      Rev 1.14   10 Nov 1998 19:18:34   JP
   Task #58158#: InsertTable/TextToTable - Flags fuer HdlRepeat/LayoutSplit mitgeben

      Rev 1.13   08 Sep 1998 16:51:16   OS
   #56134# Metric fuer Text und HTML getrennt

      Rev 1.12   15 Jul 1998 09:52:26   JP
   Bug #52951#: TabellenEigenschaftenButton nur enablen wenn Spalten ausgewaehlt sind

      Rev 1.11   21 Jun 1998 14:23:30   JP
   Feld in FormatGroupBox anzeigen, Format richtig zuweisen

      Rev 1.10   19 Jun 1998 16:19:24   TJ
   include

      Rev 1.9   17 Jun 1998 13:50:56   JP
   Bug #50989#: DataToDoc - Absatztvorlagen mit anderem Follow beachten; GPF bei Eigenschaften ohne Eintraege

      Rev 1.8   15 Jun 1998 12:27:18   OM
   #51009# Numberformatter-Listbox ViewPtr reinreichen

      Rev 1.7   09 Jun 1998 13:05:34   JP
   Bug #50993# ReadIniToUI - bei disabled'ten InTable wird jetzt auch InFelder gecheckt

      Rev 1.6   09 Jun 1998 12:18:16   JP
   Bug #50989# DataToDoc - Vorlagen setzen ist nicht so einfach moeglich

      Rev 1.5   02 Jun 1998 10:39:20   JP
   TabellenAutoFormat aus der Konf. erzeugen

      Rev 1.4   29 May 1998 19:08:58   JP
   Tabellen Eigenschaften koennen jetzt eingestellt werden

      Rev 1.3   28 May 1998 17:05:58   JP
   Handling zum einstellen der Nummernformate geaendert

      Rev 1.2   27 May 1998 19:48:42   JP
   kleinere Verbesserungen

      Rev 1.1   25 May 1998 09:49:32   JP
   Tabelle formatieren erstmal abgeklemmt, bis der Dialog auch ohne Tabelle benutzbar ist

      Rev 1.0   20 May 1998 21:35:22   JP
   Autopilot fuers Datenbankspalten einfuegen als Text/Felder/Tabelle

------------------------------------------------------------------------*/

diff --git a/sw/source/ui/dbui/dbinsdlg.hrc b/sw/source/ui/dbui/dbinsdlg.hrc
new file mode 100644
index 0000000..df30fea
--- /dev/null
+++ b/sw/source/ui/dbui/dbinsdlg.hrc
@@ -0,0 +1,107 @@
/*************************************************************************
 *
 *  $RCSfile: dbinsdlg.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:33 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _DBINSDLG_HRC
#define _DBINSDLG_HRC


#define FT_INSERT_DATA          1
#define RB_AS_TABLE             2
#define RB_AS_FIELD             3
#define RB_AS_TEXT              4
#define BT_OK                   5
#define BT_CANCEL               6
#define BT_HELP                 7
#define GB_SELECTION            8
#define FT_DB_COLUMN            10
#define GB_DB_FORMAT            11
#define RB_DBFMT_FROM_DB        12
#define RB_DBFMT_FROM_USR       13
#define LB_DBFMT_FROM_USR       14

/* ------------- Page Text/Field ------------------ */
#define LB_TXT_DB_COLUMN        15

#define PB_DBCOL_TOEDIT         16
#define ED_DB_TEXT              17
#define FT_DB_PARA_COLL         18
#define LB_DB_PARA_COLL         19

/* ------------- Page Table -------------------- */
#define LB_TBL_DB_COLUMN        20

#define PB_DBCOL_ALL_TO         21
#define PB_DBCOL_ONE_TO         22
#define PB_DBCOL_ONE_FROM       23
#define PB_DBCOL_ALL_FROM       24
#define FT_TABLE_COL            25
#define LB_TABLE_COL            26
#define GB_TABLE_HEAD           27
#define CB_TABLE_HEADON         28
#define RB_HEADL_COLNMS         29
#define RB_HEADL_EMPTY          30
#define PB_TBL_FORMAT           31
#define PB_TBL_AUTOFMT          32

#define STR_NOTEMPL             33


#endif
diff --git a/sw/source/ui/dbui/dbinsdlg.src b/sw/source/ui/dbui/dbinsdlg.src
new file mode 100644
index 0000000..e763466
--- /dev/null
+++ b/sw/source/ui/dbui/dbinsdlg.src
@@ -0,0 +1,666 @@
/*************************************************************************
 *
 *  $RCSfile: dbinsdlg.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:33 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "dbinsdlg.hrc"
#include "dbui.hrc"
#include "cmdid.h"
#include "helpid.h"
ModalDialog DLG_AP_INSERT_DB_SEL
{
    HelpID = HID_AP_INSERT_DB_SEL ;
    OUTPUTSIZE = TRUE ;
    Pos = MAP_APPFONT ( 0 , 0 ) ;
    Size = MAP_APPFONT ( 291 , 189 ) ;
    Text = "Datenbankspalten einfügen" ;
    Text [ ENGLISH ] = "Insert database columns" ;
    Moveable = TRUE ;
    Closeable = TRUE ;
    SVLOOK = TRUE ;
    FixedText FT_INSERT_DATA
    {
        Pos = MAP_APPFONT ( 6 , 6 ) ;
        Size = MAP_APPFONT ( 66 , 10 ) ;
        Text = "Daten einfügen als:" ;
        Text [ ENGLISH ] = "Insert data as:" ;
        Text [ english_us ] = "Insert data as:" ;
        Text [ portuguese_brazilian ] = "Daten einfügen als:" ;
        Text [ swedish ] = "Infoga data som:" ;
        Text [ danish ] = "Indsæt data som:" ;
        Text [ italian ] = "Inserisci file come:" ;
        Text [ spanish ] = "Insertar datos como:" ;
        Text [ french ] = "Insertion des données :" ;
        Text [ dutch ] = "Data invoegen als" ;
        Text [ portuguese ] = "Inserir dados como:" ;
        Text[ chinese_simplified ] = "²åÈëÊý¾ÝµÄ·½Ê½£º";
        Text[ russian ] = "Âñòàâèòü äàííûå êàê:";
        Text[ polish ] = "Wstaw dane jako:";
        Text[ japanese ] = "ÃÞ°À‚Ì‘}“ü:";
        Text[ chinese_traditional ] = "´¡¤J¸ê®Æªº¤è¦¡¡G";
        Text[ arabic ] = "ÅÏÑÇÌ ÇáÈíÇäÇÊ ßÜ:";
        Text[ dutch ] = "Data invoegen als";
        Text[ chinese_simplified ] = "²åÈëÊý¾ÝµÄ·½Ê½£º";
        Text[ greek ] = "ÅéóáãùãÞ äåäïìÝíùí ùò:";
        Text[ korean ] = "·Î µ¥ÀÌÅÍ »ðÀÔ:";
        Text[ turkish ] = "Eklenecek verilerin türü:";
    };
    RadioButton RB_AS_TABLE
    {
        Pos = MAP_APPFONT ( 80 , 6 ) ;
        Size = MAP_APPFONT ( 60 , 10 ) ;
        Text = "T~abelle" ;
        Text [ ENGLISH ] = "T~able" ;
        TabStop = TRUE ;
        Check = TRUE ;
        Text [ portuguese ] = "T~abela" ;
        Text [ english_us ] = "T~able" ;
        Text [ portuguese_brazilian ] = "T~abelle" ;
        Text [ swedish ] = "T~abell" ;
        Text [ danish ] = "Tabel" ;
        Text [ italian ] = "T~abella" ;
        Text [ spanish ] = "T~abla" ;
        Text [ french ] = "T~able" ;
        Text [ dutch ] = "T~abel" ;
        Text[ chinese_simplified ] = "±í¸ñ(~A)";
        Text[ russian ] = "Òàáëèöà";
        Text[ polish ] = "Tabela";
        Text[ japanese ] = "•\\(~A)";
        Text[ chinese_traditional ] = "ªí®æ(~A)";
        Text[ arabic ] = "ÌÏæá";
        Text[ dutch ] = "T~abel";
        Text[ chinese_simplified ] = "±í¸ñ(~A)";
        Text[ greek ] = "Ðßíáêáò";
        Text[ korean ] = "ǥ(~A)";
        Text[ turkish ] = "T~ablo";
    };
    RadioButton RB_AS_FIELD
    {
        Pos = MAP_APPFONT ( 145 , 6 ) ;
        Size = MAP_APPFONT ( 60 , 10 ) ;
        Text = "~Felder" ;
        Text [ ENGLISH ] = "~Fields" ;
        TabStop = TRUE ;
        Text [ portuguese ] = "~Campos" ;
        Text [ english_us ] = "~Fields" ;
        Text [ portuguese_brazilian ] = "~Felder" ;
        Text [ swedish ] = "~Fält" ;
        Text [ danish ] = "Felter" ;
        Text [ italian ] = "~Campi" ;
        Text [ spanish ] = "~Campos" ;
        Text [ french ] = "~Champs" ;
        Text [ dutch ] = "~Velden" ;
        Text[ chinese_simplified ] = "×Ö¶Î(~F)";
        Text[ russian ] = "Ïîëÿ";
        Text[ polish ] = "Pola";
        Text[ japanese ] = "̨°ÙÄÞ(~F)";
        Text[ chinese_traditional ] = "Äæ¦ì(~F)";
        Text[ arabic ] = "ÍÞæá";
        Text[ dutch ] = "~Velden";
        Text[ chinese_simplified ] = "×Ö¶Î(~F)";
        Text[ greek ] = "Ðåäßá";
        Text[ korean ] = "Çʵå(~F)";
        Text[ turkish ] = "~Alanlar";
    };
    RadioButton RB_AS_TEXT
    {
        Pos = MAP_APPFONT ( 210 , 6 ) ;
        Size = MAP_APPFONT ( 60 , 10 ) ;
        Text = "~Text" ;
        Text [ ENGLISH ] = "~Text" ;
        TabStop = TRUE ;
        Text [ portuguese ] = "~Texto" ;
        Text [ english_us ] = "~Text" ;
        Text [ portuguese_brazilian ] = "~Text" ;
        Text [ swedish ] = "~Text" ;
        Text [ danish ] = "Tekst" ;
        Text [ italian ] = "~Testo" ;
        Text [ spanish ] = "~Texto" ;
        Text [ french ] = "~Texte" ;
        Text [ dutch ] = "~Tekst" ;
        Text[ chinese_simplified ] = "ÎÄ×Ö(~T)";
        Text[ russian ] = "Òåêñò";
        Text[ polish ] = "Tekst";
        Text[ japanese ] = "÷½Ä(~T)";
        Text[ chinese_traditional ] = "¤å¦r(~T)";
        Text[ arabic ] = "äÕ";
        Text[ dutch ] = "~Tekst";
        Text[ chinese_simplified ] = "ÎÄ×Ö(~T)";
        Text[ greek ] = "Êåßìåíï";
        Text[ korean ] = "ÅØ½ºÆ®(~T)";
        Text[ turkish ] = "~Metin";
    };
    OKButton BT_OK
    {
        Pos = MAP_APPFONT ( 123 , 172 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        DefButton = TRUE ;
    };
    CancelButton BT_CANCEL
    {
        Pos = MAP_APPFONT ( 179 , 172 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    HelpButton BT_HELP
    {
        Pos = MAP_APPFONT ( 235 , 172 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    GroupBox GB_SELECTION
    {
        Pos = MAP_APPFONT ( 6 , 19 ) ;
        Size = MAP_APPFONT ( 279 , 150 ) ;
        /* wird dynamisch gesetzt! */
        Text = "" ;
    };
    FixedText FT_DB_COLUMN
    {
        Pos = MAP_APPFONT ( 12 , 31 ) ;
        Size = MAP_APPFONT ( 72 , 10 ) ;
        Text = "Datenbank~spalten" ;
        Text [ ENGLISH ] = "Database columns" ;
        Text [ english_us ] = "Database ~columns" ;
        Text [ portuguese_brazilian ] = "Datenbank~spalten" ;
        Text [ swedish ] = "Databa~skolumner" ;
        Text [ danish ] = "Databasekolonner" ;
        Text [ italian ] = "Colonne database" ;
        Text [ spanish ] = "~Columnas de la base de datos" ;
        Text [ french ] = "Colonnes de ~B.D." ;
        Text [ dutch ] = "Database~kolommen" ;
        Text [ portuguese ] = "~Colunas da base de dados" ;
        Text[ chinese_simplified ] = "Êý¾Ý¿âÀ¸(~C)";
        Text[ russian ] = "Êîëîíêè áàçû äàííûõ";
        Text[ polish ] = "Kolumny w bazie danych";
        Text[ japanese ] = "ÃÞ°ÀÍÞ°½—ñ(~C)";
        Text[ chinese_traditional ] = "¸ê®Æ®wÄæ(~C)";
        Text[ arabic ] = "ÃÚãÏÉ ÞÇÚÏÉ ÇáÈíÇäÇÊ";
        Text[ dutch ] = "Database~kolommen";
        Text[ chinese_simplified ] = "Êý¾Ý¿âÀ¸(~C)";
        Text[ greek ] = "ÓôÞëåò âÜóçò äåäïìÝíùí";
        Text[ korean ] = "µ¥ÀÌÅͺ£À̽º ¿­(~C)";
        Text[ turkish ] = "Veritabaný ~sütunlarý";
    };
    GroupBox GB_DB_FORMAT
    {
        Pos = MAP_APPFONT ( 12 , 121 ) ;
        Size = MAP_APPFONT ( 99 , 42 ) ;
        Text = "For~mat" ;
        Text [ ENGLISH ] = "For~mat" ;
        Text [ english_us ] = "For~mat" ;
        Text [ portuguese_brazilian ] = "For~mat" ;
        Text [ swedish ] = "For~mat" ;
        Text [ danish ] = "Format" ;
        Text [ italian ] = "For~mato" ;
        Text [ spanish ] = "For~mato" ;
        Text [ french ] = "For~mat" ;
        Text [ dutch ] = "Op~maak" ;
        Text [ portuguese ] = "For~mato" ;
        Text[ chinese_simplified ] = "¸ñʽ(~M)";
        Text[ russian ] = "Ôîðìàò";
        Text[ polish ] = "Format";
        Text[ japanese ] = "‘Ž®(~M)";
        Text[ chinese_traditional ] = "®æ¦¡(~M)";
        Text[ arabic ] = "ÇáÊäÓíÞ";
        Text[ dutch ] = "Op~maak";
        Text[ chinese_simplified ] = "¸ñʽ(~M)";
        Text[ greek ] = "~ÌïñöÞ";
        Text[ korean ] = "¼­½Ä(~M)";
        Text[ turkish ] = "For~mat";
    };
    RadioButton RB_DBFMT_FROM_DB
    {
        Pos = MAP_APPFONT ( 15 , 133 ) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "A~us Datenbank" ;
        Text [ ENGLISH ] = "From database" ;
        TabStop = TRUE ;
        Check = TRUE ;
        Text [ portuguese ] = "Da ~base de dados" ;
        Text [ english_us ] = "From ~database" ;
        Text [ portuguese_brazilian ] = "A~us Datenbank" ;
        Text [ swedish ] = "Från ~databas" ;
        Text [ danish ] = "Fra database" ;
        Text [ italian ] = "Dal ~database" ;
        Text [ spanish ] = "~De la base de datos" ;
        Text [ french ] = "De la ~B.D." ;
        Text [ dutch ] = "U~it databank" ;
        Text[ chinese_simplified ] = "´ÓÊý¾Ý¿â(~D)";
        Text[ russian ] = "Èç áàçû äàííûõ";
        Text[ polish ] = "Z bazy danych";
        Text[ japanese ] = "ÃÞ°ÀÍÞ°½‚©‚ç(~D)";
        Text[ chinese_traditional ] = "±q¸ê®Æ®w(~D)";
        Text[ arabic ] = "ãä ÞÇÚÏÉ ÇáÈíÇäÇÊ";
        Text[ dutch ] = "U~it databank";
        Text[ chinese_simplified ] = "´ÓÊý¾Ý¿â(~D)";
        Text[ greek ] = "Áðü âÜóç äåäïìÝíùí";
        Text[ korean ] = "µ¥ÀÌÅͺ£À̽º·ÎºÎÅÍ(~D)";
        Text[ turkish ] = "Kaynak veritabaný";
    };
    RadioButton RB_DBFMT_FROM_USR
    {
        Pos = MAP_APPFONT ( 15 , 148 ) ;
        Size = MAP_APPFONT ( 10 , 10 ) ;
        TabStop = TRUE ;
    };
    ListBox LB_DBFMT_FROM_USR
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 30 , 146 ) ;
        Size = MAP_APPFONT ( 75 , 44 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        AutoHScroll = TRUE ;
    };
    /* -------------- Page Text / Fields -------------------------------- */
    ListBox LB_TXT_DB_COLUMN
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 12 , 41 ) ;
        Size = MAP_APPFONT ( 75 , 70 ) ;
        TabStop = TRUE ;
        Hide = TRUE ;
    };
    PushButton PB_DBCOL_TOEDIT
    {
        Pos = MAP_APPFONT ( 92 , 99 ) ;
        Size = MAP_APPFONT ( 20 , 12 ) ;
        Text = "=>" ;
        TabStop = TRUE ;
        Hide = TRUE ;
    };
    MultiLineEdit ED_DB_TEXT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 118 , 41 ) ;
        Size = MAP_APPFONT ( 161 , 70 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        VScroll = TRUE ;
        HScroll = TRUE ;
        Hide = TRUE ;
        IgnoreTab = TRUE;
    };
    FixedText FT_DB_PARA_COLL
    {
        Pos = MAP_APPFONT ( 118 , 133 ) ;
        Size = MAP_APPFONT ( 58 , 10 ) ;
        TEXT = "Absat~zvorlage:" ;
        TEXT [ English ] = "Paragraph Style:" ;
        TEXT [ norwegian ] = "Avsnittsmal:" ;
        TEXT [ italian ] = "Modello di paragrafo:" ;
        TEXT [ portuguese_brazilian ] = "(Estilo de Parágrafo:" ;
        TEXT [ portuguese ] = "Estilo de ~parágrafo:" ;
        TEXT [ finnish ] = "Kappaletyyli:" ;
        TEXT [ danish ] = "Afsnitstypografi:" ;
        TEXT [ french ] = "~Style de paragraphe :" ;
        TEXT [ swedish ] = "Sty~ckeformatmall:" ;
        TEXT [ dutch ] = "~Alinea-opmaakprofiel:" ;
        TEXT [ spanish ] = "~Estilo de párrafo:" ;
        TEXT [ english_us ] = "Paragraph ~Style:" ;
        Hide = TRUE ;
        TEXT[ chinese_simplified ] = "¶ÎÂäÑùʽ(~S)£º";
        TEXT[ russian ] = "Ñòèëü àáçàöà:";
        TEXT[ polish ] = "Styl akapitu:";
        TEXT[ japanese ] = "’i—޽À²Ù:(~S)";
        TEXT[ chinese_traditional ] = "¬q¸¨¼Ë¦¡(~S)";
        TEXT[ arabic ] = "äãØ ÝÞÑÉ:";
        TEXT[ dutch ] = "~Alinea-opmaakprofiel:";
        TEXT[ chinese_simplified ] = "¶ÎÂäÑùʽ(~S)£º";
        TEXT[ greek ] = "Ðñüôõðo ðáñáãñÜöïõ:";
        TEXT[ korean ] = "´Ü¶ô À¯Çü:(~S)";
        TEXT[ turkish ] = "Paragraf b~içimi:";
    };
    ListBox LB_DB_PARA_COLL
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 182 , 131 ) ;
        Size = MAP_APPFONT ( 90 , 59 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        Hide = TRUE ;
        Sort = TRUE ;
    };
    /* -------------- Page Table ---------------------------------------- */
    ListBox LB_TBL_DB_COLUMN
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 12 , 41 ) ;
        Size = MAP_APPFONT ( 75 , 70 ) ;
        TabStop = TRUE ;
    };
    PushButton PB_DBCOL_ALL_TO
    {
        Pos = MAP_APPFONT ( 92 , 41 ) ;
        Size = MAP_APPFONT ( 20 , 12 ) ;
        Text = "~=>>" ;
        TabStop = TRUE ;
    };
    PushButton PB_DBCOL_ONE_TO
    {
        Pos = MAP_APPFONT ( 92 , 56 ) ;
        Size = MAP_APPFONT ( 20 , 12 ) ;
        Text = "-~>" ;
        TabStop = TRUE ;
    };
    PushButton PB_DBCOL_ONE_FROM
    {
        Pos = MAP_APPFONT ( 92 , 84 ) ;
        Size = MAP_APPFONT ( 20 , 12 ) ;
        Text = "<~-" ;
        TabStop = TRUE ;
    };
    PushButton PB_DBCOL_ALL_FROM
    {
        Pos = MAP_APPFONT ( 92 , 99 ) ;
        Size = MAP_APPFONT ( 20 , 12 ) ;
        Text = "~<<=" ;
        TabStop = TRUE ;
    };
    FixedText FT_TABLE_COL
    {
        Pos = MAP_APPFONT ( 118 , 31 ) ;
        Size = MAP_APPFONT ( 40 , 10 ) ;
        Text = "Tabe~lle" ;
        Text [ ENGLISH ] = "Tab~le" ;
        Text [ english_us ] = "Tab~le" ;
        Text [ portuguese_brazilian ] = "Tabe~lle" ;
        Text [ swedish ] = "Tabe~ll" ;
        Text [ danish ] = "Tabel" ;
        Text [ italian ] = "Tabe~lla" ;
        Text [ spanish ] = "Tab~la" ;
        Text [ french ] = "Tab~le" ;
        Text [ dutch ] = "Tabe~l" ;
        Text [ portuguese ] = "Ta~bela" ;
        Text[ chinese_simplified ] = "±í¸ñ(~L)";
        Text[ russian ] = "Òàáëèöà";
        Text[ polish ] = "Tabela";
        Text[ japanese ] = "•\\(~L)";
        Text[ chinese_traditional ] = "ªí®æ(~L)";
        Text[ arabic ] = "ÇáÌÏæá";
        Text[ dutch ] = "Tabe~l";
        Text[ chinese_simplified ] = "±í¸ñ(~L)";
        Text[ greek ] = "Ðßíáêáò";
        Text[ korean ] = "ǥ(~L)";
        Text[ turkish ] = "~Tablo";
    };
    ListBox LB_TABLE_COL
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 118 , 42 ) ;
        Size = MAP_APPFONT ( 75 , 70 ) ;
        TabStop = TRUE ;
    };
    GroupBox GB_TABLE_HEAD
    {
        Pos = MAP_APPFONT ( 199 , 41 ) ;
        Size = MAP_APPFONT ( 80 , 58 ) ;
        Text = "Tabellenüberschrift" ;
        Text [ ENGLISH ] = "Table headline" ;
        Text [ english_us ] = "Table heading" ;
        Text [ portuguese_brazilian ] = "Tabellenüberschrift" ;
        Text [ swedish ] = "Tabellöverskrift" ;
        Text [ danish ] = "Tabeloverskrift" ;
        Text [ italian ] = "Titolo tabella" ;
        Text [ spanish ] = "Encabezado de la tabla" ;
        Text [ french ] = "Titre de la table" ;
        Text [ dutch ] = "Tabelopschrift" ;
        Text [ portuguese ] = "Título da tabela" ;
        Text[ chinese_simplified ] = "±í¸ñ±êÌâ";
        Text[ russian ] = "Çàãîëîâîê òàáëèöû";
        Text[ polish ] = "Nag³ówek tabeli";
        Text[ japanese ] = "•\\‚ÌŒ©o‚µ";
        Text[ chinese_traditional ] = "ªí®æ¼ÐÃD";
        Text[ arabic ] = "ÚäæÇä ÇáÌÏÇæá";
        Text[ dutch ] = "Tabelopschrift";
        Text[ chinese_simplified ] = "±í¸ñ±êÌâ";
        Text[ greek ] = "Åðéêåöáëßäá ðßíáêá";
        Text[ korean ] = "Ç¥ Á¦¸ñ";
        Text[ turkish ] = "Tablo baþlýðý";
    };
    CheckBox CB_TABLE_HEADON
    {
        Pos = MAP_APPFONT ( 205 , 56 ) ;
        Size = MAP_APPFONT ( 60 , 10 ) ;
        Text = "E~inschalten" ;
        Text [ ENGLISH ] = "On" ;
        TabStop = TRUE ;
        Check = TRUE ;
        Text [ english_us ] = "~On" ;
        Text [ portuguese_brazilian ] = "E~inschalten" ;
        Text [ swedish ] = "~På" ;
        Text [ danish ] = "Aktiver" ;
        Text [ italian ] = "Attiva" ;
        Text [ spanish ] = "~Activar" ;
        Text [ french ] = "~Activer" ;
        Text [ dutch ] = "In~schakelen" ;
        Text [ portuguese ] = "~Activar" ;
        Text[ chinese_simplified ] = "¼¤»î(~O)";
        Text[ russian ] = "Âêëþ÷èòü";
        Text[ polish ] = "W³¹cz";
        Text[ japanese ] = "µÝ(~O)";
        Text[ chinese_traditional ] = "¿E¬¡(~O)";
        Text[ arabic ] = "ÊÔÛíá";
        Text[ dutch ] = "In~schakelen";
        Text[ chinese_simplified ] = "¼¤»î(~O)";
        Text[ greek ] = "Åíåñãïðïßçóç";
        Text[ korean ] = "Ȱ¼º(~O)";
        Text[ turkish ] = "Çalýþtýr";
    };
    RadioButton RB_HEADL_COLNMS
    {
        Pos = MAP_APPFONT ( 217 , 72 ) ;
        Size = MAP_APPFONT ( 60 , 10 ) ;
        Text = "S~paltenamen" ;
        Text [ English ] = "Column name" ;
        TabStop = TRUE ;
        Check = TRUE ;
        Text [ portuguese ] = "~Nome da coluna" ;
        Text [ english_us ] = "Column ~name" ;
        Text [ portuguese_brazilian ] = "S~paltenamen" ;
        Text [ swedish ] = "Kolumn~namn" ;
        Text [ danish ] = "Kolonnenavn" ;
        Text [ italian ] = "Nomi colonne" ;
        Text [ spanish ] = "~Nombres de columnas" ;
        Text [ french ] = "Noms ~de colonne" ;
        Text [ dutch ] = "K~olomnaam" ;
        Text[ chinese_simplified ] = "À¸Ãû(~N)";
        Text[ russian ] = "Èìåíà êîëîíîê";
        Text[ polish ] = "Nazwa kolumny";
        Text[ japanese ] = "—ñ–¼(~N)";
        Text[ chinese_traditional ] = "Äæ¦W(~N)";
        Text[ arabic ] = "ÃÓãÇÁ ÇáÃÚãÏÉ";
        Text[ dutch ] = "K~olomnaam";
        Text[ chinese_simplified ] = "À¸Ãû(~N)";
        Text[ greek ] = "Ïíüìáôá óôÞëçò";
        Text[ korean ] = "¿­ À̸§(~N)";
        Text[ turkish ] = "~Sütun adý";
    };
    RadioButton RB_HEADL_EMPTY
    {
        Pos = MAP_APPFONT ( 217 , 87 ) ;
        Size = MAP_APPFONT ( 60 , 10 ) ;
        Text = "lee~r" ;
        Text [ English ] = "empty" ;
        TabStop = TRUE ;
        Text [ portuguese ] = "~vazio" ;
        Text [ english_us ] = "~empty" ;
        Text [ portuguese_brazilian ] = "lee~r" ;
        Text [ swedish ] = "t~om" ;
        Text [ danish ] = "tom" ;
        Text [ italian ] = "v~uoto" ;
        Text [ spanish ] = "~vacío" ;
        Text [ french ] = "~Vide" ;
        Text [ dutch ] = "lee~g" ;
        Text[ chinese_simplified ] = "¿Õȱ(~E)";
        Text[ russian ] = "ïóñòîé";
        Text[ polish ] = "pusty";
        Text[ japanese ] = "‹ó”’(~E)";
        Text[ chinese_traditional ] = "ªÅ¯Ê(~E)";
        Text[ arabic ] = "ÝÇÑÛ";
        Text[ dutch ] = "lee~g";
        Text[ chinese_simplified ] = "¿Õȱ(~E)";
        Text[ greek ] = "êåíü";
        Text[ korean ] = "ºñ¾îÀÖÀ½(~E)";
        Text[ turkish ] = "boþ";
    };
    PushButton PB_TBL_FORMAT
    {
        Pos = MAP_APPFONT ( 199 , 124 ) ;
        Size = MAP_APPFONT ( 60 , 12 ) ;
        Text = "Ei~genschaften..." ;
        Text [ English ] = "Properties..." ;
        Text [ english_us ] = "Pr~operties..." ;
        Text [ portuguese_brazilian ] = "Eigenschaften..." ;
        Text [ swedish ] = "E~genskaper..." ;
        Text [ danish ] = "Egenskaber..." ;
        Text [ italian ] = "Proprietà..." ;
        Text [ spanish ] = "P~ropiedades..." ;
        Text [ french ] = "Propriétés..." ;
        Text [ dutch ] = "~Eigenschappen..." ;
        Text [ portuguese ] = "~Propriedades..." ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "ÊôÐÔ(~O)...";
        Text[ russian ] = "Ñâîéñòâà...";
        Text[ polish ] = "W³aœciwoœci";
        Text[ japanese ] = "ÌßÛÊßè(~O)...";
        Text[ chinese_traditional ] = "ÄÝ©Ê(~O)...";
        Text[ arabic ] = "ÎÕÇÆÕ...";
        Text[ dutch ] = "~Eigenschappen...";
        Text[ chinese_simplified ] = "ÊôÐÔ(~O)...";
        Text[ greek ] = "Éäéüôçôåò...";
        Text[ korean ] = "µî·ÏÁ¤º¸(~O)...";
        Text[ turkish ] = "Ö~zelikler...";
    };
    PushButton PB_TBL_AUTOFMT
    {
        Pos = MAP_APPFONT ( 199 , 142 ) ;
        Size = MAP_APPFONT ( 60 , 12 ) ;
        Text = "Aut~oformat..." ;
        Text [ English ] = "Aut~oformat..." ;
        TabStop = TRUE ;
        Text [ portuguese ] = "Aut~oFormato..." ;
        Text [ english_us ] = "Aut~oFormat..." ;
        Text [ portuguese_brazilian ] = "Aut~oformat..." ;
        Text [ swedish ] = "Aut~oFormat..." ;
        Text [ danish ] = "AutoFormat..." ;
        Text [ italian ] = "Formatt. auto..." ;
        Text [ spanish ] = "~Autoformato..." ;
        Text [ french ] = "Aut~oFormat..." ;
        Text [ dutch ] = "Aut~oOpmaak..." ;
        Text[ chinese_simplified ] = "×Ô¶¯¸ñʽ(~O)...";
        Text[ russian ] = "Àâòîôîðìàò...";
        Text[ polish ] = "Autoformat";
        Text[ japanese ] = "µ°ÄÌ«°Ï¯Ä(~O)...";
        Text[ chinese_traditional ] = "¦Û°Ê®æ¦¡(~O)...";
        Text[ arabic ] = "ÊäÓíÞ ÊáÞÇÆí...";
        Text[ dutch ] = "Aut~oOpmaak...";
        Text[ chinese_simplified ] = "×Ô¶¯¸ñʽ(~O)...";
        Text[ greek ] = "ÁõôïÌïñöïðïßçóç...";
        Text[ korean ] = "ÀÚµ¿ ¼­½Ä(~O)...";
        Text[ turkish ] = "Otomatik formatla...";
    };
    String STR_NOTEMPL
    {
        Text = "<keine>" ;
        Text [ English ] = "<none>" ;
        Text [ dutch ] = "<geen>" ;
        Text [ english_us ] = "<none>" ;
        Text [ italian ] = "<senza>" ;
        Text [ spanish ] = "<ninguno>" ;
        Text [ french ] = "<aucun(e)>" ;
        Text [ swedish ] = "<inga>" ;
        Text [ danish ] = "<ingen>" ;
        Text [ portuguese ] = "<nenhum>" ;
        Text [ portuguese_brazilian ] = "<keine>" ;
        Text[ chinese_simplified ] = "<ÎÞ>";
        Text[ russian ] = "<áåç>";
        Text[ polish ] = "<brak>";
        Text[ japanese ] = "<‚È‚µ>";
        Text[ chinese_traditional ] = "<µL>";
        Text[ arabic ] = "<ÈÏæä>";
        Text[ dutch ] = "<geen>";
        Text[ chinese_simplified ] = "<ÎÞ>";
        Text[ greek ] = "<êáíÝíá>";
        Text[ korean ] = "<¾øÀ½>";
        Text[ turkish ] = "<yok>";
    };
    Text [ english_us ] = "Insert Database Columns" ;
    Text [ portuguese_brazilian ] = "Datenbankspalten einfügen" ;
    Text [ swedish ] = "Infoga databaskolumner" ;
    Text [ danish ] = "Indsæt databasekolonner" ;
    Text [ italian ] = "Inserisci colonne di database" ;
    Text [ spanish ] = "Insertar columnas de la base de datos" ;
    Text [ french ] = "Insertion de colonnes de base de données" ;
    Text [ dutch ] = "Database-kolommen invoegen" ;
    Text [ portuguese ] = "Inserir colunas para bases de dados" ;
    Text[ chinese_simplified ] = "²åÈëÊý¾Ý¿âÀ¸";
    Text[ russian ] = "Âñòàâêà êîëîíêè áàçû äàííûõ";
    Text[ polish ] = "Wstaw kolumny w bazie danych";
    Text[ japanese ] = "ÃÞ°ÀÍÞ°½‚Ì—ñ‚Ì‘}“ü";
    Text[ chinese_traditional ] = "´¡¤J¸ê®Æ®wÄæ";
    Text[ arabic ] = "ÅÏÑÇÌ ÃÚãÏÉ ÞÇÚÏÉ ÈíÇäÇÊ";
    Text[ dutch ] = "Database-kolommen invoegen";
    Text[ chinese_simplified ] = "²åÈëÊý¾Ý¿âÀ¸";
    Text[ greek ] = "ÐñïóèÞêç óôçëþí âÜóçò äåäïìÝíùí";
    Text[ korean ] = "µ¥ÀÌÅͺ£À̽º ¿­ »ðÀÔ";
    Text[ turkish ] = "Veritabaný sütunu ekle";
};
diff --git a/sw/source/ui/dbui/dbmgr.cxx b/sw/source/ui/dbui/dbmgr.cxx
new file mode 100644
index 0000000..46c7b4a
--- /dev/null
+++ b/sw/source/ui/dbui/dbmgr.cxx
@@ -0,0 +1,2589 @@
/*************************************************************************
 *
 *  $RCSfile: dbmgr.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:33 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/


#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#if STLPORT_VERSION>=321
#include <cstdarg>
#endif

#include <stdio.h>

#ifndef _UCBHELPER_CONTENT_HXX
#include <ucbhelper/content.hxx>
#endif
#ifndef _COM_SUN_STAR_UCB_XCOMMANDENVIRONMENT_HPP_
#include <com/sun/star/ucb/XCommandEnvironment.hpp>
#endif
#ifndef _COM_SUN_STAR_UCB_TRANSFERINFO_HPP_
#include <com/sun/star/ucb/TransferInfo.hpp>
#endif
#ifndef _COM_SUN_STAR_UCB_NAMECLASH_HPP_
#include <com/sun/star/ucb/NameClash.hpp>
#endif
#ifndef _LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif
#ifndef _TOOLS_TEMPFILE_HXX
#include <tools/tempfile.hxx>
#endif
#ifndef SVTOOLS_URIHELPER_HXX
#include <svtools/urihelper.hxx>
#endif
#ifndef _SVSTDARR_HXX
#define _SVSTDARR_STRINGSDTOR
#include <svtools/svstdarr.hxx>
#endif
#ifndef _ZFORLIST_HXX //autogen
#include <svtools/zforlist.hxx>
#endif
#ifndef _ZFORMAT_HXX //autogen
#include <svtools/zformat.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SFX_PRINTER_HXX //autogen
#include <sfx2/printer.hxx>
#endif
#ifndef _SFXDOCFILE_HXX //autogen
#include <sfx2/docfile.hxx>
#endif
#ifndef _SFX_PROGRESS_HXX //autogen
#include <sfx2/progress.hxx>
#endif
#ifndef _SFX_DOCFILT_HACK_HXX //autogen
#include <sfx2/docfilt.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SBAOBJ_HXX //autogen
#include <offmgr/sbaobj.hxx>
#endif
#ifndef _SBA_SBADB_HXX //autogen
#include <offmgr/sbadb.hxx>
#endif
#ifndef _SBAITEMS_HRC
#include <offmgr/sbaitems.hrc>
#endif
#ifndef _SBAITEMS_HXX
#include <offmgr/sbaitems.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _SDB_SDBCURS_HXX //autogen
#include <sdb/sdbcurs.hxx>
#endif
#ifndef _MAILENUM_HXX //autogen
#include <goodies/mailenum.hxx>
#endif

#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _EDTWIN_HXX
#include <edtwin.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _FLDBAS_HXX
#include <fldbas.hxx>
#endif
#ifndef _FINDER_HXX
#include <finder.hxx>
#endif
#ifndef _INITUI_HXX
#include <initui.hxx>
#endif
#ifndef _SWUNDO_HXX
#include <swundo.hxx>
#endif
#ifndef _FLDDAT_HXX
#include <flddat.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _MODCFG_HXX
#include <modcfg.hxx>
#endif
#ifndef _SWPRTOPT_HXX
#include <swprtopt.hxx>
#endif
#ifndef _SHELLIO_HXX
#include <shellio.hxx>
#endif
#ifndef _DBUI_HXX
#include <dbui.hxx>
#endif
#ifndef _DBMGR_HXX
#include <dbmgr.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _SWWAIT_HXX
#include <swwait.hxx>
#endif

#ifndef _DBUI_HRC
#include <dbui.hrc>
#endif
#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif
#ifndef _STATSTR_HRC
#include <statstr.hrc>
#endif

#ifdef REPLACE_OFADBMGR
#ifndef _SFXREQUEST_HXX
#include <sfx2/request.hxx>
#endif
#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _UTL_DB_CONVERSION_HXX_
#include <unotools/dbconversion.hxx>
#endif
#ifndef _COM_SUN_STAR_LANG_XMULTISERVICEFACTORY_HPP_
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XNAMEACCESS_HPP_
#include <com/sun/star/container/XNameAccess.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBC_XDATASOURCE_HPP_
#include <com/sun/star/sdbc/XDataSource.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBCX_XTABLESSUPPLIER_HPP_
#include <com/sun/star/sdbcx/XTablesSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBCX_XCOLUMNSSUPPLIER_HPP_
#include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_SDB_XQUERIESSUPPLIER_HPP_
#include <com/sun/star/sdb/XQueriesSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_SDB_XCOLUMN_HPP_
#include <com/sun/star/sdb/XColumn.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBC_DATATYPE_HPP_
#include <com/sun/star/sdbc/DataType.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBC_XSTATEMENT_HPP_
#include <com/sun/star/sdbc/XStatement.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBC_RESULTSETTYPE_HPP_
#include <com/sun/star/sdbc/ResultSetType.hpp>
#endif
//#ifndef _COM_SUN_STAR_SDB_XDATABASEACCESS_HPP_
//#include <com/sun/star/sdb/XDatabaseAccess.hpp>
//#endif
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
#include <com/sun/star/beans/XPropertySet.hpp>
#endif
#ifndef _UNOTOOLS_PROCESSFACTORY_HXX_
#include <unotools/processfactory.hxx>
#endif
#ifndef _ISOLANG_HXX
#include <tools/isolang.hxx>
#endif
#ifndef _COM_SUN_STAR_UTIL_XNUMBERFORMATTYPES_HPP_
#include <com/sun/star/util/XNumberFormatTypes.hpp>
#endif
#ifndef _UTL_UNO3_DB_TOOLS_HXX_
#include <unotools/dbtools.hxx>
#endif
#ifndef _SVX_LANGITEM_HXX
#include <svx/langitem.hxx>
#endif
#ifndef _SVX_UNOMID_HXX
#include <svx/unomid.hxx>
#endif
#ifndef _NUMUNO_HXX
#include <svtools/numuno.hxx>
#endif
#else

#endif  //REPLACE_OFADBMGR

#ifdef REPLACE_OFADBMGR
using namespace rtl;
using namespace com::sun::star::container;
using namespace com::sun::star::lang;
using namespace com::sun::star::sdb;
using namespace com::sun::star::sdbc;
using namespace com::sun::star::sdbcx;
using namespace com::sun::star::beans;
using namespace com::sun::star::util;
#define C2S(cChar) String::CreateFromAscii(cChar)
#endif

using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::ucb;

#define C2U(char) rtl::OUString::createFromAscii(char)

#define DB_SEP_SPACE    0
#define DB_SEP_TAB      1
#define DB_SEP_RETURN   2
#define DB_SEP_NEWLINE  3

#ifdef REPLACE_OFADBMGR
SV_IMPL_PTRARR(SwDSParamArr, SwDSParamPtr);

/* -----------------------------17.07.00 17:04--------------------------------

 ---------------------------------------------------------------------------*/
BOOL lcl_MoveAbsolute(SwDSParam* pParam, long nAbsPos)
{
    BOOL bRet = FALSE;
    try
    {
        if(pParam->bScrollable)
        {
            bRet = pParam->xResultSet->absolute( nAbsPos );
        }
        else
        {
            pParam->nSelectionIndex = 0;
            pParam->xResultSet = pParam->xStatement->executeQuery( pParam->sStatement );
            bRet = TRUE;
            while(nAbsPos >= 0 && bRet)
            {
                bRet &= !pParam->xResultSet->next();
                pParam->nSelectionIndex++;
                nAbsPos--;
            }
            bRet &= nAbsPos != -1;
        }
    }
    catch(Exception aExcept)
    {
        DBG_ERROR("exception caught")
    }
    return bRet;
}
/* -----------------------------17.07.00 17:23--------------------------------

 ---------------------------------------------------------------------------*/
BOOL lcl_GetColumnCnt(SwDSParam* pParam,
    const String& rColumnName, long nLanguage, String& rResult, double* pNumber)
{
    Reference< XColumnsSupplier > xColsSupp( pParam->xResultSet, UNO_QUERY );
    Reference <XNameAccess> xCols = xColsSupp->getColumns();
    if(!xCols->hasByName(rColumnName))
        return FALSE;
    Any aCol = xCols->getByName(rColumnName);
    Reference< XPropertySet > xColumnProps;
    if(aCol.hasValue())
        xColumnProps = *(Reference< XPropertySet >*)aCol.getValue();

    SwDBFormatData aFormatData;
    aFormatData.aNullDate = pParam->aNullDate;
    aFormatData.xFormatter = pParam->xFormatter;

    String sLanguage, sCountry;
    ::ConvertLanguageToIsoNames( nLanguage, sLanguage, sCountry );
    aFormatData.aLocale.Language = sLanguage;
    aFormatData.aLocale.Country = sCountry;

    DBG_ERROR("pFormat unset!")
    rResult = SwNewDBMgr::GetDBField( xColumnProps, aFormatData, pNumber);
    return TRUE;
};
#endif
/*--------------------------------------------------------------------
    Beschreibung: Daten importieren
 --------------------------------------------------------------------*/

BOOL SwNewDBMgr::Merge( USHORT nOpt, SwWrtShell* pSh,
                        const String& rStatement,
                        const SbaSelectionListRef xSelectionList,
#ifdef REPLACE_OFADBMGR
                        const String& rDataSource,
                        const String& rTableOrQuery,
#else
                        const String& rDBName,
#endif
                        const String *pPrinter)
{
#ifdef REPLACE_OFADBMGR
    ChgDBName(pSh, rDataSource, rTableOrQuery,rStatement);
#else
    ChgDBName(pSh, rDBName, rStatement);
#endif
    // Falls noch nicht offen, spaetestens hier

#ifdef REPLACE_OFADBMGR
    if(!OpenMergeSource(rDataSource, rTableOrQuery, rStatement, xSelectionList))
        return FALSE;
#else
    if(!OpenDB(FALSE, pSh->GetDBDesc()))
        return FALSE;
#endif

    if (IsInitDBFields())
    {
        // Bei Datenbankfeldern ohne DB-Name DB-Name von Dok einsetzen
        SvStringsDtor aDBNames(1, 1);
        aDBNames.Insert( new String(), 0);
        pSh->ChangeDBFields( aDBNames, pSh->GetDBName());
        SetInitDBFields(FALSE);
    }
#ifdef REPLACE_OFADBMGR
    const SbaSelectionList* pSelList = 0;
    if( xSelectionList.Is() && (long)xSelectionList->GetObject(0) != -1L )
    {
        if( xSelectionList->Count() )
            pSelList = &xSelectionList;
    }
#else
    OfaDBParam& rParam = GetDBData(FALSE);
    ChangeStatement(FALSE, rStatement);
    const SbaSelectionList* pSelList = 0;
    rParam.pSelectionList->Clear();
    if( xSelectionList.Is() && (long)xSelectionList->GetObject(0) != -1L )
    {
        *rParam.pSelectionList = *xSelectionList;
        if( xSelectionList->Count() )
            pSelList = &xSelectionList;
    }
#endif

    BOOL bRet = TRUE;
    switch(nOpt)
    {
        case DBMGR_MERGE:
            bRet = Merge(pSh);   // Mischen
            break;

        case DBMGR_MERGE_MAILMERGE: // Serienbrief
            {
            SfxDispatcher *pDis = pSh->GetView().GetViewFrame()->GetDispatcher();
            if (pPrinter)   // Aufruf kommt aus dem Basic
            {
                SfxBoolItem aSilent( SID_SILENT, TRUE );
                if (pPrinter)
                {
                    SfxStringItem aPrinterName(SID_PRINTER_NAME, *pPrinter);
                    pDis->Execute( SID_PRINTDOC, SFX_CALLMODE_SYNCHRON,
                                   &aPrinterName, &aSilent, 0L );
                }
                else
                {
                    pDis->Execute( SID_PRINTDOC, SFX_CALLMODE_SYNCHRON,
                                   &aSilent, 0L );
                }
            }
            else
                pDis->Execute(SID_PRINTDOC, SFX_CALLMODE_SYNCHRON|SFX_CALLMODE_RECORD);
            }
            break;

        case DBMGR_MERGE_MAILING:
            bRet = MergeMailing(pSh);   // Mailing
            break;

        case DBMGR_MERGE_MAILFILES:
            bRet = MergeMailFiles(pSh); // Serienbriefe als Dateien abspeichern
            break;

        default:        // Einfuegen der selektierten Eintraege
                        // (war: InsertRecord)
#ifdef REPLACE_OFADBMGR
            ImportFromConnection(pSh );
#else
            ImportFromConnection(pSh, pSelList );
#endif
            break;
    }

#ifdef REPLACE_OFADBMGR
    EndMerge();
#else
    CloseAll();
#endif
    return bRet;
}
/*--------------------------------------------------------------------
    Beschreibung: Daten importieren
 --------------------------------------------------------------------*/


BOOL SwNewDBMgr::Merge(SwWrtShell* pSh)
{
    pSh->StartAllAction();
#ifdef REPLACE_OFADBMGR
#else
    bInMerge = TRUE;

    // 1. Satz positionieren, Evaluierung ueber die Felder
    for (USHORT i = 0; i < aDBDataArr.Count(); i++)
    {
        OfaDBParam* pParam = aDBDataArr[i];

        // Alle Im Dok enthaltenen Datenbanken oeffnen und Cursorpos initialisieren
        if (OpenDB(FALSE, pParam->GetDBName()))
        {
            if (pParam->GetCursor())
                Flush(FALSE);   // Cursor initialisieren
            ToFirstSelectedRecord(FALSE);
        }
    }
#endif

/*  for (ULONG i = 0 ; i < GetDBData().pSelectionList->Count(); i++)
    {
        ULONG nIndex = (ULONG)GetDBData().pSelectionList->GetObject(i);
        DBG_TRACE(String(nIndex));
    }*/

    pSh->ViewShell::UpdateFlds(TRUE);
    pSh->SetModified();

#ifdef REPLACE_OFADBMGR
#else
    bInMerge = FALSE;
#endif

    pSh->EndAllAction();

    return TRUE;
}

/*--------------------------------------------------------------------
    Beschreibung: Daten importieren
 --------------------------------------------------------------------*/


/*void SwNewDBMgr::UpdateImport(    const BOOL bBasic, SwWrtShell* pSh,
                                const String& rDBName,
                                const String& rStatement,
                                const SbaSelectionListRef xSelectionList )
{
    ChgDBName(pSh, rDBName, rStatement);

    if( OpenDB( bBasic, pSh->GetDBDesc()) )
    {
        OfaDBParam& rParam = GetDBData(bBasic);

        ChangeStatement(bBasic, rStatement);

        const SbaSelectionList* pSelList = 0;
        rParam.pSelectionList->Clear();
        if( xSelectionList.Is() && -1L != (long)xSelectionList->GetObject(0) )
        {
            *rParam.pSelectionList = *xSelectionList;
            if( xSelectionList->Count() )
                pSelList = &xSelectionList;
        }

        ImportFromConnection( bBasic, pSh, pSelList );
    }
} */

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


#ifdef REPLACE_OFADBMGR
void SwNewDBMgr::ImportFromConnection(  SwWrtShell* pSh )
#else
void SwNewDBMgr::ImportFromConnection(  SwWrtShell* pSh,
                                        const SbaSelectionList* pSelList )
#endif
{
#ifdef REPLACE_OFADBMGR
    if(pMergeData && !pMergeData->bEndOfDB)
#else
    OfaDBParam& rParam = GetDBData(FALSE);
    ASSERT(rParam.GetCursor(), "Cursor");

    if( ToFirstSelectedRecord( FALSE ) && IsSuccessful( FALSE ) )
#endif
    {
#ifdef REPLACE_OFADBMGR
#else
        //  Spaltenkoepfe
        SbaDBDataDefRef aDBDef = OpenColumnNames(FALSE);
        if( aDBDef.Is() )
#endif
        {
            pSh->StartAllAction();
            pSh->StartUndo(0);
            BOOL bGroupUndo(pSh->DoesGroupUndo());
            pSh->DoGroupUndo(FALSE);

            if( pSh->HasSelection() )
                pSh->DelRight();

            SwWait *pWait = 0;

#ifdef REPLACE_OFADBMGR
#else
            if( pSelList )
            {
                for( ULONG i = 0; i < pSelList->Count(); ++i )
                {

                    ULONG nIndex = (ULONG)pSelList->GetObject( i );

                    ASSERT(nIndex >= rParam.CurrentPos(),
                        "Zu lesender Datensatz < vorhergehender Datensatz!");

                    // N„chsten zu lesenden Datensatz ansteuern
                    GotoRecord( nIndex );
                    ImportDBEntry(&aDBDef, pSh);

                    if( i == 10 )
                        pWait = new SwWait( *pSh->GetView().GetDocShell(), TRUE );
                }
            }
            else
#endif
            {
                ULONG i = 0;
                do {

#ifdef REPLACE_OFADBMGR
                    ImportDBEntry(pSh);
#else
                    ImportDBEntry(&aDBDef, pSh);
                    rParam.GetCursor()->Next();
                    rParam.CurrentPos()++;
#endif
                    if( 10 == ++i )
                        pWait = new SwWait( *pSh->GetView().GetDocShell(), TRUE);

#ifdef REPLACE_OFADBMGR
                } while(ToNextMergeRecord());
#else
                } while( !rParam.GetCursor()->IsOffRange() );
#endif
            }

            pSh->DoGroupUndo(bGroupUndo);
            pSh->EndUndo(0);
            pSh->EndAllAction();
            delete pWait;
        }
    }
#ifdef REPLACE_OFADBMGR
#else
    CloseAll();
#endif
}


/*-----------------24.02.97 10.30-------------------

--------------------------------------------------*/

String  lcl_FindColumn(const String& sFormatStr,USHORT  &nUsedPos, BYTE &nSeparator)
{
    String sReturn;
    USHORT nLen = sFormatStr.Len();
    nSeparator = 0xff;
    while(nUsedPos < nLen && nSeparator == 0xff)
    {
        sal_Unicode cAkt = sFormatStr.GetChar(nUsedPos);
        switch(cAkt)
        {
            case ',':
                nSeparator = DB_SEP_SPACE;
            break;
            case ';':
                nSeparator = DB_SEP_RETURN;
            break;
            case ':':
                nSeparator = DB_SEP_TAB;
            break;
            case '#':
                nSeparator = DB_SEP_NEWLINE;
            break;
            default:
                sReturn += cAkt;
        }
        nUsedPos++;

    }
    return sReturn;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

#ifdef REPLACE_OFADBMGR
void SwNewDBMgr::ImportDBEntry(SwWrtShell* pSh)
#else
void SwNewDBMgr::ImportDBEntry(SbaDBDataDef* pDef, SwWrtShell* pSh)
#endif
{
#ifdef REPLACE_OFADBMGR
    if(pMergeData && !pMergeData->bEndOfDB)
#else
    OfaDBParam& rParam = GetDBData(FALSE);
    if( !rParam.GetCursor()->IsOffRange() )
#endif
    {
#ifdef REPLACE_OFADBMGR
          Reference< XColumnsSupplier > xColsSupp( pMergeData->xResultSet, UNO_QUERY );
          Reference <XNameAccess> xCols = xColsSupp->getColumns();
        String sSymDBName(pMergeData->sDataSource);
        sSymDBName += DB_DELIM;
        sSymDBName += pMergeData->sTableOrQuery;
        String sFormatStr = pPathFinder->GetDBInsertMode(sSymDBName);
#else
        const ODbRowRef&  xRow = rParam.GetCursor()->GetRow();
        ULONG nCount = (UINT16)xRow->size();
        String sFormatStr = pPathFinder->GetDBInsertMode(rParam.GetSymDBName());
#endif
        USHORT nFmtLen = sFormatStr.Len();
        if( nFmtLen )
        {
            const char cSpace = ' ';
            const char cTab = '\t';
            USHORT nUsedPos = 0;
            BYTE    nSeparator;
            String sColumn = lcl_FindColumn(sFormatStr, nUsedPos, nSeparator);
            while( sColumn.Len() )
            {
#ifdef REPLACE_OFADBMGR
                if(!xCols->hasByName(sColumn))
                    return;
                Any aCol = xCols->getByName(sColumn);
                Reference< XPropertySet > xColumnProp = *(Reference< XPropertySet >*)aCol.getValue();;
                if(xColumnProp.is())
                {
                    SwDBFormatData aDBFormat;
                    String sInsert = GetDBField( xColumnProp,   aDBFormat);
#else
                int nColumn = GetColumnPos(DBMGR_STD, sColumn);
                if(nColumn > 0)
                {
                    String sInsert = ImportDBField(nColumn, pDef, xRow);
#endif
                    if( DB_SEP_SPACE == nSeparator )
                            sInsert += cSpace;
                    else if( DB_SEP_TAB == nSeparator)
                            sInsert += cTab;
                    pSh->Insert(sInsert);
                    if( DB_SEP_RETURN == nSeparator)
                        pSh->SplitNode();
                    else if(DB_SEP_NEWLINE == nSeparator)
                            pSh->InsertLineBreak();
                }
                else
                {
                    // Spalte nicht gefunden -> Fehler anzeigen
                    String sInsert = '?';
                    sInsert += sColumn;
                    sInsert += '?';
                    pSh->Insert(sInsert);
                }
                sColumn = lcl_FindColumn(sFormatStr, nUsedPos, nSeparator);
            }
            pSh->SplitNode();
        }
        else
        {
            String sStr;
#ifdef REPLACE_OFADBMGR
            Sequence<OUString> aColNames = xCols->getElementNames();
            const OUString* pColNames = aColNames.getConstArray();
            long nLength = aColNames.getLength();
            for(long i = 0; i < nLength; i++)
            {
                Any aCol = xCols->getByName(pColNames[i]);
                Reference< XPropertySet > xColumnProp = *(Reference< XPropertySet >*)aCol.getValue();;
                SwDBFormatData aDBFormat;
                sStr += GetDBField( xColumnProp, aDBFormat);
                if (i < nLength - 1)
                    sStr += '\t';
            }
#else
            for (ULONG i = 1; i < nCount; i++)  // 0 = Bookmark
            {
                sStr += ImportDBField(i, pDef, xRow);
                if (i < nCount - 1)
                    sStr += '\t';
            }
#endif
            pSh->SwEditShell::Insert(sStr);
            pSh->SwFEShell::SplitNode();    // Zeilenvorschub
        }
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwNewDBMgr::ChgDBName(SwWrtShell* pSh,
#ifdef REPLACE_OFADBMGR
                        const String& rDataSource,
                        const String& rTableOrQuery,
#else
                        const String& rDBName,
#endif
                        const String& rStatement)
{
    if (pSh)
    {
#ifdef REPLACE_OFADBMGR
        String sNewDBName(rDataSource);
        sNewDBName += DB_DELIM;
        sNewDBName += rTableOrQuery;
#else
        String sNewDBName(ExtractDBName(rDBName));
#endif
        sNewDBName += ';';
        sNewDBName += rStatement;
        pSh->ChgDBName(sNewDBName);
    }
}

/*--------------------------------------------------------------------
    Beschreibung: Listbox mit Tabellenliste fuellen
 --------------------------------------------------------------------*/
#ifdef REPLACE_OFADBMGR
BOOL SwNewDBMgr::GetTableNames(ListBox* pListBox, const String& rDBName)
#else
BOOL SwNewDBMgr::GetTableNames(ListBox* pListBox, String sDBName)
#endif
{
    BOOL bRet = FALSE;
    String sOldTableName(pListBox->GetSelectEntry());
    pListBox->Clear();
#ifdef REPLACE_OFADBMGR
    Reference< XDataSource> xSource;
    Reference< XConnection> xConnection = SwNewDBMgr::GetConnection(rDBName, xSource);
    if(xConnection.is())
    {
        Reference<XTablesSupplier> xTSupplier = Reference<XTablesSupplier>(xConnection, UNO_QUERY);
        if(xTSupplier.is())
        {
            Reference<XNameAccess> xTbls = xTSupplier->getTables();
            Sequence<OUString> aTbls = xTbls->getElementNames();
            const OUString* pTbls = aTbls.getConstArray();
            for(long i = 0; i < aTbls.getLength(); i++)
                pListBox->InsertEntry(pTbls[i]);
        }
        Reference<XQueriesSupplier> xQSupplier = Reference<XQueriesSupplier>(xConnection, UNO_QUERY);
        if(xQSupplier.is())
        {
            Reference<XNameAccess> xQueries = xQSupplier->getQueries();
            Sequence<OUString> aQueries = xQueries->getElementNames();
            const OUString* pQueries = aQueries.getConstArray();
            for(long i = 0; i < aQueries.getLength(); i++)
                pListBox->InsertEntry(pQueries[i]);
        }
        if (sOldTableName.Len())
            pListBox->SelectEntry(sOldTableName);
        bRet = TRUE;
    }
#else

    sDBName = OFF_APP()->LocalizeDBName(NATIONAL2INI, sDBName);
    if (sDBName.Len())
    {
        SbaDatabaseRef pConnection = pSbaObject->GetDatabase(sDBName, TRUE);

        if (pConnection)
        {
            String sTableName;

            USHORT nCount = pConnection->GetObjectCount(dbTable);

            for (USHORT i = 0; i < nCount; i++)
            {
                sTableName = pConnection->GetObjectName(dbTable, i);
                pListBox->InsertEntry(sTableName);
            }

            nCount = pConnection->GetObjectCount(dbQuery);

            for (i = 0; i < nCount; i++)
            {
                sTableName = pConnection->GetObjectName(dbQuery, i);
                pListBox->InsertEntry(sTableName);
            }

            if (sOldTableName.Len())
                pListBox->SelectEntry(sOldTableName);
            if (!pListBox->GetSelectEntryCount())
                pListBox->SelectEntryPos(0);
            bRet = TRUE;
        }
    }
#endif
    return bRet;
}

/*--------------------------------------------------------------------
    Beschreibung: Listbox mit Spaltennamen einer Datenbank fuellen
 --------------------------------------------------------------------*/
#ifdef REPLACE_OFADBMGR
BOOL SwNewDBMgr::GetColumnNames(ListBox* pListBox,
            const String& rDBName, const String& rTableName, BOOL bAppend)
#else
BOOL SwNewDBMgr::GetColumnNames(ListBox* pListBox, String sDBName, BOOL bAppend)
#endif
{
    if (!bAppend)
        pListBox->Clear();
#ifdef REPLACE_OFADBMGR
    Reference< XDataSource> xSource;
    Reference< XConnection> xConnection = SwNewDBMgr::GetConnection(rDBName, xSource);
    Reference< XColumnsSupplier> xColsSupp = SwNewDBMgr::GetColumnSupplier(xConnection, rTableName);
    if(xColsSupp.is())
    {
        Reference <XNameAccess> xCols = xColsSupp->getColumns();
        const Sequence<OUString> aColNames = xCols->getElementNames();
        const OUString* pColNames = aColNames.getConstArray();
        for(int nCol = 0; nCol < aColNames.getLength(); nCol++)
        {
            pListBox->InsertEntry(pColNames[nCol]);
        }
    }
#else
    if (!sDBName.Len() || (!IsDBOpen(DBMGR_STD, sDBName) && !OpenDB(DBMGR_STD, sDBName, TRUE)))
        return(FALSE);

    SbaDBDataDefRef aDBDef = OpenColumnNames(DBMGR_STD);

    if (aDBDef.Is())
    {
        const SbaColumnList& rCols = aDBDef->GetOriginalColumns();

        for (USHORT i = 1; i <= rCols.Count(); i++)
        {
            const SbaNameItem* pNameItem = (const SbaNameItem*)&rCols.GetObject(i-1)->Get(SBA_DEF_FLTNAME);
            pListBox->InsertEntry(pNameItem->GetValue());
        }

        pListBox->SelectEntryPos(0);
    }
#endif
    return(TRUE);
}

/*--------------------------------------------------------------------
    Beschreibung: CTOR
 --------------------------------------------------------------------*/

SwNewDBMgr::SwNewDBMgr() :
#ifdef REPLACE_OFADBMGR
            pMergeData(0),
            bInMerge(FALSE),
#else
            OfaDBMgr(),
#endif
            nMergeType(DBMGR_INSERT),
            bInitDBFields(FALSE)
{
    pMergeList = new SbaSelectionList;
}
/* -----------------------------18.07.00 08:56--------------------------------

 ---------------------------------------------------------------------------*/
#ifdef REPLACE_OFADBMGR
SwNewDBMgr::~SwNewDBMgr()
{
}
#endif
/*--------------------------------------------------------------------
    Beschreibung:   Serienbrief drucken
 --------------------------------------------------------------------*/


BOOL SwNewDBMgr::MergePrint( SwView& rView,
                             SwPrtOptions& rOpt, SfxProgress& rProgress )
{
    SwWrtShell* pSh = &rView.GetWrtShell();
    //check if the doc is synchronized and contains at least one linked section
    BOOL bSynchronizedDoc = pSh->IsLabelDoc() && pSh->GetSectionFmtCount() > 1;
#ifdef REPLACE_OFADBMGR
    //merge source is already open
    rOpt.nMergeCnt = pMergeData && pMergeData->xSelectionList.Is() ?
                                    pMergeData->xSelectionList->Count() : 0;
#else
    OfaDBParam& rParam = GetDBData(FALSE);

    // 1. Satz positionieren, Evaluierung ueber die Felder
    for (USHORT i = 0; i < aDBDataArr.Count(); i++)
    {
        OfaDBParam* pParam = aDBDataArr[i];

        // Alle Im Dok enthaltenen Datenbanken oeffnen und Cursorpos initialisieren
        if (OpenDB(FALSE, pParam->GetDBName()))
        {
            if (pParam->GetCursor())
                Flush(FALSE);   // Cursor initialisieren
            ToFirstSelectedRecord(FALSE);
        }
    }

    OpenDB(FALSE, rParam.GetDBName());
    if (!ToFirstSelectedRecord(FALSE))
        return(FALSE);
    ODbRowRef xRow = GetCurSelectedRecord(FALSE);
    // keine Arme keine Kekse
    if(!xRow.is())
        return FALSE;

    bInMerge = TRUE;

    rOpt.nMergeCnt = GetDBData(FALSE).pSelectionList.Is()
                            ? GetDBData(FALSE).pSelectionList->Count()
                            : 0;
    rOpt.nMergeAct = 0;

    Flush(FALSE);   // Cursor initialisieren
#endif

//  if (IsPrintFromBasicDB())
//      rOpt.bSinglePrtJobs = IsSingleJobs();
//  else
//  {
        SwModuleOptions* pModOpt = SW_MOD()->GetModuleConfig();
        rOpt.bSinglePrtJobs = pModOpt->IsSinglePrintJob();
//  }

    SfxPrinter *pPrt = pSh->GetPrt();
    Link aSfxSaveLnk = pPrt->GetEndPrintHdl();
    if( rOpt.bSinglePrtJobs  )
        pPrt->SetEndPrintHdl( Link() );

    BOOL bNewJob = FALSE,
         bUserBreak = FALSE,
         bRet = FALSE;

    do {
#ifdef REPLACE_OFADBMGR

#else
        xRow = GetCurSelectedRecord(FALSE); // Naechste Selektion holen
        ULONG nOldRec = GetCurRecordId(FALSE);  // Alte Position merken
        if(xRow.Is())
#endif
        {
            pSh->ViewShell::UpdateFlds();
            ++rOpt.nMergeAct;
            rView.SfxViewShell::Print( rProgress ); // ggf Basic-Macro ausfuehren

            if( rOpt.bSinglePrtJobs && bRet )
            {
                //rOpt.bJobStartet = FALSE;
                bRet = FALSE;
            }

            if( pSh->Prt( rOpt, rProgress ) )
                bRet = TRUE;

            if( !pPrt->IsJobActive() )
            {
                bUserBreak = TRUE;
                bRet = FALSE;
                break;
            }
            if( !rOpt.bSinglePrtJobs )
            {
                String& rJNm = (String&)rOpt.GetJobName();
                rJNm.Erase();
            }
        }
#ifdef REPLACE_OFADBMGR
    } while( bSynchronizedDoc ? ExistsNextRecord() : ToNextMergeRecord());
#else
        // Kontext fuer ToNextSelectedRecord auf richtige Datenbank stellen:
        GetDBData(FALSE, &rParam.GetDBName());
        // Endlosschleifen durch "Erster Datensatz" verhindern:
        if (GetCurRecordId(FALSE) < nOldRec)
            ToSelectedRecord(FALSE, nOldRec);   // Alte Position restaurieren
    } while( xRow.is() && GotoNextSelectedRecord( bSynchronizedDoc) );
#endif

    if( rOpt.bSinglePrtJobs )
    {
        pSh->GetPrt()->SetEndPrintHdl( aSfxSaveLnk );
        if ( !bUserBreak && !pSh->GetPrt()->IsJobActive() )     //Schon zu spaet?
            aSfxSaveLnk.Call( pSh->GetPrt() );
    }

    rOpt.nMergeCnt = 0;
    rOpt.nMergeAct = 0;

    bInMerge = FALSE;

    nMergeType = DBMGR_INSERT;

    SwDocShell* pDocSh = rView.GetDocShell();
    SfxViewFrame *pTmpFrm = SfxViewFrame::GetFirst(pDocSh);

    while (pTmpFrm)     // Alle Views Invalidieren
    {
        SwView *pVw = PTR_CAST(SwView, pTmpFrm->GetViewShell());
        if (pVw)
            pVw->GetEditWin().Invalidate();
        pTmpFrm = pTmpFrm->GetNext(*pTmpFrm, pDocSh);
    }

#ifdef REPLACE_OFADBMGR
#else
    CloseAll();
#endif
    return bRet;
}

/*--------------------------------------------------------------------
    Beschreibung:   Serienbrief als Mail versenden
 --------------------------------------------------------------------*/


BOOL SwNewDBMgr::MergeMailing(SwWrtShell* pSh)
{
    //check if the doc is synchronized and contains at least one linked section
    BOOL bSynchronizedDoc = pSh->IsLabelDoc() && pSh->GetSectionFmtCount() > 1;
#ifdef REPLACE_OFADBMGR
#else

    OfaDBParam& rParam = GetDBData(FALSE);

    // 1. Satz positionieren, Evaluierung ueber die Felder
    for (USHORT i = 0; i < aDBDataArr.Count(); i++)
    {
        OfaDBParam* pParam = aDBDataArr[i];

        // Alle Im Dok enthaltenen Datenbanken oeffnen und Cursorpos initialisieren
        if (OpenDB(FALSE, pParam->GetDBName()))
        {
            if (pParam->GetCursor())
                Flush(FALSE);   // Cursor initialisieren
            ToFirstSelectedRecord(FALSE);
        }
    }

    OpenDB(FALSE, rParam.GetDBName());
    if (!ToFirstSelectedRecord(FALSE))
        return(FALSE);

    ODbRowRef xRow = GetCurSelectedRecord(FALSE);
#endif
    BOOL bLoop = TRUE;

#ifdef REPLACE_OFADBMGR
#else
    // keine Arme keine Kekse
    if(!xRow.is())
        return FALSE;
    SbaDBDataDefRef aDBDef = OpenColumnNames(FALSE);
    if (aDBDef.Is())
#endif
    {
#ifdef REPLACE_OFADBMGR
        Reference< XColumnsSupplier > xColsSupp( pMergeData->xResultSet, UNO_QUERY );
        Reference <XNameAccess> xCols = xColsSupp->getColumns();
        if(!xCols->hasByName(sEMailAddrFld))
            return FALSE;
        Any aCol = xCols->getByName(sEMailAddrFld);
        Reference< XPropertySet > xColumnProp = *(Reference< XPropertySet >*)aCol.getValue();;
#else
        const SbaColumnList& rCols = aDBDef->GetOriginalColumns();
        USHORT nColPos = 0;
        for (nColPos = 0; nColPos < rCols.Count(); nColPos++)
        {
            const SbaNameItem* pNameItem = (const SbaNameItem*)&rCols.GetObject(nColPos)->Get(SBA_DEF_FLTNAME);
            if (pNameItem->GetValue() == sEMailAddrFld)
                break;
        }

        if (nColPos >= rCols.Count())
            return FALSE;
        nColPos++;
#endif

        bInMerge = TRUE;
        SfxDispatcher* pSfxDispatcher = pSh->GetView().GetViewFrame()->GetDispatcher();
        if (!sSubject.Len())    // Kein leeres Subject wegen Automail (PB)
            sSubject = ' ';
        SfxStringItem aSubject(SID_MAIL_SUBJECT, sSubject);
        SfxStringItem aText(SID_MAIL_TEXT, ' ');    // Leerer Text ist nicht moeglich
        SfxStringItem aAttached(SID_MAIL_ATTACH_FILE, sAttached);
        SfxBoolItem aAttach(SID_MAIL_ATTACH, TRUE);

        SwModuleOptions* pModOpt = SW_MOD()->GetModuleConfig();
        BYTE nMailFmts = pModOpt->GetMailingFormats() | TXTFORMAT_ASCII;    // Immer Ascii
        SfxByteItem aTextFormats(SID_MAIL_TXTFORMAT, nMailFmts);
#ifdef REPLACE_OFADBMGR
#else
        Flush(FALSE);   // Cursor initialisieren
#endif

        pSfxDispatcher->Execute( SID_SAVEDOC, SFX_CALLMODE_SYNCHRON|SFX_CALLMODE_RECORD);
        if( !pSh->IsModified() )
        {
            // Beim Speichern wurde kein Abbruch gedrueckt
            // neue DocShell erzeugen, alle gelinkten Bereiche embedden
            // und unter temporaerem Namen wieder speichern.
            BOOL bDelTempFile = TRUE;
            String sTmpName;
            const SfxFilter* pSfxFlt;

            {
                SfxMedium* pOrig = pSh->GetView().GetDocShell()->GetMedium();

                pSfxFlt = SwIoSystem::GetFileFilter( pOrig->GetPhysicalName(), ::aEmptyStr );

                String sFileName = ::GetTmpFileName();
                String sTmpName = URIHelper::SmartRelToAbs(sFileName);

                BOOL bCopyCompleted = TRUE;
                try
                {
                    String sMain(sTmpName);
                    sal_Unicode cSlash = '/';
                    xub_StrLen nSlashPos = sMain.SearchBackward(cSlash);
                    sMain.Erase(nSlashPos);
                    ::ucb::Content aNewContent( sMain, Reference< XCommandEnvironment > ());
                    Any aAny;
                    TransferInfo aInfo;
                    aInfo.NameClash = NameClash::OVERWRITE;
                    aInfo.NewTitle = INetURLObject(sTmpName).GetName();
                    aInfo.SourceURL = pOrig->GetPhysicalName();
                    aInfo.MoveData  = FALSE;
                    aAny <<= aInfo;
                    aNewContent.executeCommand( C2U( "transfer" ), aAny);
                }
                catch( ... )
                {
                    bCopyCompleted = FALSE;
                }

                if( !bCopyCompleted )
                {
                    // Neues Dokument erzeugen.
                    SfxObjectShellRef xDocSh( new SwDocShell( SFX_CREATE_MODE_INTERNAL ));
                    SfxMedium* pMed = new SfxMedium( sTmpName, STREAM_READ, TRUE );
                    pMed->SetFilter( pSfxFlt );

                    // alle gelinkten Bereiche/Grafiken aufs lokale FileSystem
                    // einbetten
                    if( xDocSh->DoLoad( pOrig ) &&
                        ((SwDocShell*)(&xDocSh))->EmbedAllLinks() )
                    {
                        xDocSh->DoSaveAs(*pMed);
                        xDocSh->DoSaveCompleted(pMed);
                    }
                    else
                        bDelTempFile = FALSE;

                    xDocSh->DoClose();
                }
                else
                    bDelTempFile = FALSE;

                if( !bDelTempFile )
                    sTmpName = pOrig->GetPhysicalName();
            }


            String sAddress;
            ULONG nDocNo = 1;
            bCancel = FALSE;

            PrintMonitor aPrtMonDlg(&pSh->GetView().GetEditWin(), TRUE);
            aPrtMonDlg.aDocName.SetText(pSh->GetView().GetDocShell()->GetTitle(22));
            aPrtMonDlg.aCancel.SetClickHdl(LINK(this, SwNewDBMgr, PrtCancelHdl));
            aPrtMonDlg.Show();

            OfficeApplication* pOffApp = OFF_APP();
            SfxRequest aReq( SID_OPENDOC, SFX_CALLMODE_SYNCHRON, pOffApp->GetPool() );
            aReq.AppendItem( SfxStringItem( SID_FILE_NAME, sTmpName ));
            aReq.AppendItem( SfxStringItem( SID_FILTER_NAME, pSfxFlt->GetName() ));
            aReq.AppendItem( SfxBoolItem( SID_HIDDEN, TRUE ) );
            aReq.AppendItem( SfxStringItem( SID_REFERER, String::CreateFromAscii(URL_PREFIX_PRIV_SOFFICE )));

            pOffApp->ExecuteSlot( aReq, pOffApp->SfxApplication::GetInterface());
            if( aReq.IsDone() )
            {
                // DocShell besorgen
                SfxViewFrameItem* pVItem = (SfxViewFrameItem*)aReq.GetReturnValue();
                SwView* pView = (SwView*) pVItem->GetFrame()->GetViewShell();
                SwWrtShell& rSh = pView->GetWrtShell();
                pView->AttrChangedNotify( &rSh );//Damit SelectShell gerufen wird.

                SwDoc* pDoc = rSh.GetDoc();
                SwNewDBMgr* pOldDBMgr = pDoc->GetNewDBMgr();
                pDoc->SetNewDBMgr( this );
                pDoc->EmbedAllLinks();
                String sTempStat(SW_RES(STR_DB_EMAIL));

                do
                {
#ifdef REPLACE_OFADBMGR
#else
                    // Naechste Selektion holen
                    xRow = GetCurSelectedRecord(FALSE);
                    ULONG nOldRec = GetCurRecordId(FALSE);  // Alte Position merken
                    if( xRow.is() && xRow->size() > 0)
#endif
                    {

                        if(UIUNDO_DELETE_INVISIBLECNTNT == rSh.GetUndoIds())
                            rSh.Undo();
                        rSh.ViewShell::UpdateFlds();

                        // alle versteckten Felder/Bereiche entfernen
                        rSh.RemoveInvisibleContent();

                        SfxFrameItem aFrame( SID_DOCFRAME, pVItem->GetFrame() );
#ifdef REPLACE_OFADBMGR
                        SwDBFormatData aDBFormat;
                        sAddress = GetDBField( xColumnProp, aDBFormat);
#else
                        sAddress = ImportDBField(nColPos, &aDBDef, xRow);
#endif
                        if (!sAddress.Len())
                            sAddress = '_';

                        String sStat(sTempStat);
                        sStat += ' ';
                        sStat += String::CreateFromInt32( nDocNo++ );
                        aPrtMonDlg.aPrintInfo.SetText(sStat);
                        aPrtMonDlg.aPrinter.SetText( sAddress );

                        // Rechenzeit fuer EMail-Monitor:
                        for (USHORT i = 0; i < 25; i++)
                            Application::Reschedule();

                        sAddress.Insert(String::CreateFromAscii("mailto:"), 0);
                        SfxStringItem aRecipient( SID_MAIL_RECIPIENT, sAddress );

                        const SfxPoolItem* pRet = pSfxDispatcher->Execute(
                                    SID_MAIL_SENDDOC,
                                    SFX_CALLMODE_SYNCHRON|SFX_CALLMODE_RECORD,
                                    &aRecipient, &aSubject, &aAttach, &aAttached,
                                    &aText, &aTextFormats, &aFrame,
                                    0L );
                        //this must be done here because pRet may be destroyed in Reschedule (DeleteOnIdle)
                        BOOL bBreak = pRet && !( (SfxBoolItem*)pRet )->GetValue();

                        // Rechenzeit fuer EMail-Monitor:
                        for (i = 0; i < 25; i++)
                            Application::Reschedule();

                        if ( bBreak )
                            break; // das Verschicken wurde unterbrochen

                    }
#ifdef REPLACE_OFADBMGR
                } while( !bCancel && bSynchronizedDoc ? ExistsNextRecord() : ToNextMergeRecord());
#else
                    // Kontext fuer ToNextSelectedRecord auf richtige Datenbank stellen:
                    GetDBData(FALSE, &rParam.GetDBName());

                    // Endlosschleifen durch "Erster Datensatz" verhindern:
                    if (GetCurRecordId(FALSE) < nOldRec)
                        ToSelectedRecord(FALSE, nOldRec);   // Alte Position restaurieren
                } while(!bCancel && xRow.is() && GotoNextSelectedRecord( bSynchronizedDoc));
#endif
                pDoc->SetNewDBMgr( pOldDBMgr );
                pView->GetDocShell()->OwnerLock( FALSE );

            }
            // jetzt noch die temp Datei entfernen
            if( bDelTempFile )
            {
                try
                {
                    ::ucb::Content aTempContent(
                        sTmpName,
                        Reference< XCommandEnvironment > ());
                    aTempContent.executeCommand( C2U( "delete" ),
                                        makeAny( sal_Bool( sal_True ) ) );
                }
                catch( ... )
                {
                    DBG_ERRORFILE( "Exception" );
                }

            }
            SW_MOD()->SetView(&pSh->GetView());
        }

        bInMerge = FALSE;
        nMergeType = DBMGR_INSERT;
    }

#ifdef REPLACE_OFADBMGR
#else
    CloseAll();
#endif
    return bLoop;
}

/* -----------------------------17.04.00 11:18--------------------------------

 ---------------------------------------------------------------------------*/
#ifdef REPLACE_OFADBMGR
#else
BOOL SwNewDBMgr::GotoNextSelectedRecord( BOOL bSyncronized )
{
    BOOL bRet = FALSE;
    if(!bSyncronized)
        bRet = ToNextSelectedRecord( FALSE );
    else
    {
        OfaDBParam& rParam = GetDBData(FALSE);
        if (rParam.GetCursor())
        {
            if (rParam.pSelectionList.Is() && rParam.pSelectionList->Count())
            {
                bRet = (rParam.CurrentSelPos() < rParam.pSelectionList->Count());
            }
            else
            {
                bRet = !rParam.GetCursor()->IsOffRange();
            }
        }
    }
    return(bRet);
}
#endif
/*--------------------------------------------------------------------
    Beschreibung:   Serienbriefe als einzelne Dokumente speichern
 --------------------------------------------------------------------*/

BOOL SwNewDBMgr::MergeMailFiles(SwWrtShell* pSh)
{
    //check if the doc is synchronized and contains at least one linked section
    BOOL bSynchronizedDoc = pSh->IsLabelDoc() && pSh->GetSectionFmtCount() > 1;
#ifdef REPLACE_OFADBMGR
#else
    OfaDBParam& rParam = GetDBData(FALSE);

    // 1. Satz positionieren, Evaluierung ueber die Felder
    for (USHORT i = 0; i < aDBDataArr.Count(); i++)
    {
        OfaDBParam* pParam = aDBDataArr[i];

        // Alle im Dok enthaltenen Datenbanken oeffnen und Cursorpos initialisieren
        if (OpenDB(FALSE, pParam->GetDBName()))
        {
            if (pParam->GetCursor())
                Flush(FALSE);   // Cursor initialisieren
            ToFirstSelectedRecord(FALSE);
        }
    }

    OpenDB(FALSE, rParam.GetDBName());
    if (!ToFirstSelectedRecord(FALSE))
        return(FALSE);

    ODbRowRef xRow = GetCurSelectedRecord(FALSE);

    // keine Arme keine Kekse
    if(!xRow.is())
        return FALSE;
#endif
    BOOL bLoop = TRUE;

#ifdef REPLACE_OFADBMGR
    Reference< XPropertySet > xColumnProp;
#else
    SbaDBDataDefRef aDBDef = OpenColumnNames(FALSE);
    if (aDBDef.Is())
#endif
    {
        USHORT nColPos = 0;
        BOOL bColumnName = sEMailAddrFld.Len() > 0;

        if (bColumnName)
        {
#ifdef REPLACE_OFADBMGR
            Reference< XColumnsSupplier > xColsSupp( pMergeData->xResultSet, UNO_QUERY );
            Reference <XNameAccess> xCols = xColsSupp->getColumns();
            if(!xCols->hasByName(sEMailAddrFld))
                return FALSE;
            Any aCol = xCols->getByName(sEMailAddrFld);
            xColumnProp = *(Reference< XPropertySet >*)aCol.getValue();;
#else
            const SbaColumnList& rCols = aDBDef->GetOriginalColumns();

            for (nColPos = 0; nColPos < rCols.Count(); nColPos++)
            {
                const SbaNameItem* pNameItem = (const SbaNameItem*)&rCols.GetObject(nColPos)->Get(SBA_DEF_FLTNAME);
                if (pNameItem->GetValue() == sEMailAddrFld)
                    break;
            }

            if (nColPos >= rCols.Count())
                return FALSE;

            nColPos++;
#endif
        }

        bInMerge = TRUE;
        SfxDispatcher* pSfxDispatcher = pSh->GetView().GetViewFrame()->GetDispatcher();

#ifdef REPLACE_OFADBMGR
#else
        Flush(FALSE);   // Cursor initialisieren
#endif

        pSfxDispatcher->Execute( SID_SAVEDOC, SFX_CALLMODE_SYNCHRON|SFX_CALLMODE_RECORD);
        if( !pSh->IsModified() )
        {
            // Beim Speichern wurde kein Abbruch gedrueckt
            SfxMedium* pOrig = pSh->GetView().GetDocShell()->GetMedium();
            String sOldName(pOrig->GetPhysicalName());
            const SfxFilter* pSfxFlt = SwIoSystem::GetFileFilter(
                                                    sOldName, ::aEmptyStr );
            String sAddress;
            bCancel = FALSE;

            PrintMonitor aPrtMonDlg(&pSh->GetView().GetEditWin());
            aPrtMonDlg.aDocName.SetText(pSh->GetView().GetDocShell()->GetTitle(22));

            aPrtMonDlg.aCancel.SetClickHdl(LINK(this, SwNewDBMgr, PrtCancelHdl));
            aPrtMonDlg.Show();

            SwDocShell *pDocSh = pSh->GetView().GetDocShell();
            // Progress, um KeyInputs zu unterbinden
            SfxProgress aProgress(pDocSh, ::aEmptyStr, 1);

            // Alle Dispatcher sperren
            SfxViewFrame* pViewFrm = SfxViewFrame::GetFirst(pDocSh);
            while (pViewFrm)
            {
                pViewFrm->GetDispatcher()->Lock(TRUE);
                pViewFrm = SfxViewFrame::GetNext(*pViewFrm, pDocSh);
            }
            ULONG nDocNo = 1;
            ULONG nCounter = 0;
            String sExt( INetURLObject( sOldName ).GetExtension() );

            do {
#ifdef REPLACE_OFADBMGR
#else
                // Naechste Selektion holen
                xRow = GetCurSelectedRecord(FALSE);
                ULONG nOldRec = GetCurRecordId(FALSE);  // Alte Position merken

                if( xRow.is() && xRow->size() > 0 )
#endif
                {
                    String sPath(sSubject);

                    if( bColumnName )
                    {
#ifdef REPLACE_OFADBMGR
                        SwDBFormatData aDBFormat;
                        sAddress = GetDBField( xColumnProp, aDBFormat);
#else

                        sAddress = ImportDBField(nColPos, &aDBDef, xRow);
#endif
                        if (!sAddress.Len())
                            sAddress = '_';
                        sPath += sAddress;
                        nCounter = 0;
                    }

                    INetURLObject aEntry(sPath);
                    String sLeading(aEntry.GetBase());
                    aEntry.removeSegment();
                    sPath = aEntry.GetMainURL();
                    TempFile aTemp(sLeading,&sExt,&sPath );

                    if( !aTemp.IsValid() )
                    {
                        ErrorHandler::HandleError( ERRCODE_IO_NOTSUPPORTED );
                        bLoop = FALSE;
                        bCancel = TRUE;
                    }
                    else
                    {
                        INetURLObject aTempFile(aTemp.GetName());
                        aPrtMonDlg.aPrinter.SetText( aTempFile.GetBase() );
                        String sStat(SW_RES(STR_STATSTR_LETTER));   // Brief
                        sStat += ' ';
                        sStat += String::CreateFromInt32( nDocNo++ );
                        aPrtMonDlg.aPrintInfo.SetText(sStat);

                        // Rechenzeit fuer Save-Monitor:
                        for (USHORT i = 0; i < 10; i++)
                            Application::Reschedule();

                        // Neues Dokument erzeugen und speichern
                        SfxObjectShellRef xDocSh( new SwDocShell( SFX_CREATE_MODE_INTERNAL ));
                        SfxMedium* pMed = new SfxMedium( sOldName, STREAM_STD_READ, TRUE );
                        pMed->SetFilter( pSfxFlt );

                        if (xDocSh->DoLoad(pMed))
                        {
                            SwDoc* pDoc = ((SwDocShell*)(&xDocSh))->GetDoc();
                            SwNewDBMgr* pOldDBMgr = pDoc->GetNewDBMgr();
                            pDoc->SetNewDBMgr( this );
                            pDoc->UpdateFlds(0);

                            // alle versteckten Felder/Bereiche entfernen
                            pDoc->RemoveInvisibleContent();

                            SfxMedium* pDstMed = new SfxMedium( aTempFile.GetFull(), STREAM_STD_READWRITE, TRUE );
                            pDstMed->SetFilter( pSfxFlt );

                            xDocSh->DoSaveAs(*pDstMed);
                            xDocSh->DoSaveCompleted(pDstMed);
                            if( xDocSh->GetError() )
                            {
                                // error message ??
                                ErrorHandler::HandleError( xDocSh->GetError() );
                                bCancel = TRUE;
                                bLoop = FALSE;
                            }
                            pDoc->SetNewDBMgr( pOldDBMgr );
                        }
                        xDocSh->DoClose();
                    }
                }
#ifdef REPLACE_OFADBMGR
            } while( !bCancel && bSynchronizedDoc ? ExistsNextRecord() : ToNextMergeRecord());
#else
                // Kontext fuer ToNextSelectedRecord auf
                // richtige Datenbank stellen:
                GetDBData(FALSE, &rParam.GetDBName());

                // Endlosschleifen durch "Erster Datensatz" verhindern:
                if( !bCancel && GetCurRecordId(FALSE) < nOldRec )
                    ToSelectedRecord(FALSE, nOldRec);   // Alte Position restaurieren
            }  while( !bCancel && xRow.is() &&
                        GotoNextSelectedRecord( bSynchronizedDoc) );
#endif
            // Alle Dispatcher freigeben
            pViewFrm = SfxViewFrame::GetFirst(pDocSh);
            while (pViewFrm)
            {
                pViewFrm->GetDispatcher()->Lock(FALSE);
                pViewFrm = SfxViewFrame::GetNext(*pViewFrm, pDocSh);
            }

            SW_MOD()->SetView(&pSh->GetView());
        }

        bInMerge = FALSE;
        nMergeType = DBMGR_INSERT;
    }

#ifdef REPLACE_OFADBMGR
#else
    CloseAll();
#endif
    return bLoop;
}

/*--------------------------------------------------------------------
    Beschreibung:
  --------------------------------------------------------------------*/

IMPL_LINK_INLINE_START( SwNewDBMgr, PrtCancelHdl, Button *, pButton )
{
    pButton->GetParent()->Hide();
    bCancel = TRUE;
    return 0;
}
IMPL_LINK_INLINE_END( SwNewDBMgr, PrtCancelHdl, Button *, pButton )


/*--------------------------------------------------------------------
    Beschreibung: Numberformat der Spalte ermitteln und ggfs. in
                    den uebergebenen Formatter uebertragen
  --------------------------------------------------------------------*/

#ifdef REPLACE_OFADBMGR
ULONG SwNewDBMgr::GetColumnFmt( const String& rDBName,
                                const String& rTableName,
                                const String& rColNm,
                                SvNumberFormatter* pNFmtr,
                                long nLanguage )
#else
ULONG SwNewDBMgr::GetColumnFmt( const String& rDBName, const String& rColNm,
                                SvNumberFormatter* pNFmtr )
#endif
{
    //JP 12.01.99: ggfs. das NumberFormat im Doc setzen
    ULONG nRet = 0;
#ifdef REPLACE_OFADBMGR
    if(pNFmtr)
    {
        SvNumberFormatsSupplierObj* pNumFmt = new SvNumberFormatsSupplierObj( pNFmtr );
        Reference< util::XNumberFormatsSupplier >  xDocNumFmtsSupplier = pNumFmt;
        Reference< XNumberFormats > xDocNumberFormats = xDocNumFmtsSupplier->getNumberFormats();
         Reference< XNumberFormatTypes > xDocNumberFormatTypes(xDocNumberFormats, UNO_QUERY);

        String sLanguage, sCountry;
        ::ConvertLanguageToIsoNames( nLanguage, sLanguage, sCountry );
        Locale aLocale;
        aLocale.Language = sLanguage;
        aLocale.Country = sCountry;

        Reference< XDataSource> xSource;
        Reference< XConnection> xConnection = SwNewDBMgr::GetConnection(rDBName, xSource);

        //get the number formatter of the data source
        Reference<XPropertySet> xSourceProps(xSource, UNO_QUERY);
        Reference< XNumberFormats > xNumberFormats;
        if(xSourceProps.is())
        {
            Any aFormats = xSourceProps->getPropertyValue(C2U("NumberFormatsSupplier"));
            if(aFormats.hasValue())
            {
                Reference<XNumberFormatsSupplier> xSuppl = *(Reference<util::XNumberFormatsSupplier>*) aFormats.getValue();
                if(xSuppl.is())
                {
                    xNumberFormats = xSuppl->getNumberFormats();
                }
            }
        }
        Reference< XColumnsSupplier> xColsSupp = SwNewDBMgr::GetColumnSupplier(xConnection, rTableName);
        if(xColsSupp.is())
        {
            Reference <XNameAccess> xCols = xColsSupp->getColumns();
            if(!xCols->hasByName(rColNm))
                return nRet;
            Any aCol = xCols->getByName(rColNm);
            Reference< XPropertySet > xColumnProp = *(Reference< XPropertySet >*)aCol.getValue();;

            Any aFormat = xColumnProp->getPropertyValue(C2U("FormatKey"));
            if(aFormat.hasValue())
            {
                sal_Int32 nFmt;
                aFormat >>= nFmt;
                if(xNumberFormats.is())
                {
                    try
                    {
                        Reference<XPropertySet> xNumProps = xNumberFormats->getByKey( nFmt );
                        Any aFormat = xNumProps->getPropertyValue(C2U("FormatString"));
                        Any aLocale = xNumProps->getPropertyValue(C2U("Locale"));
                        OUString sFormat;
                        aFormat >>= sFormat;
                        com::sun::star::lang::Locale aLoc;
                        aLocale >>= aLoc;
                        nFmt = xDocNumberFormats->addNew( sFormat, aLoc );
                        nRet = nFmt;
                    }
                    catch(...)
                    {
                        DBG_ERROR("illegal number format key")
                    }
                }
            }
            else
                nRet = utl::getDefaultNumberFormat(xColumnProp, xDocNumberFormatTypes,  aLocale);
        }
        else
            nRet = pNFmtr->GetFormatIndex( NF_NUMBER_STANDARD, LANGUAGE_SYSTEM );
    }
#else
    if( pNFmtr )
    {
        int nCol;
        if( OpenDB( DBMGR_STD, rDBName, FALSE ) &&
            0 != ( nCol = GetColumnPos( DBMGR_STD, rColNm )))
            nRet = GetRealColumnFmt( rColNm, GetColumnFormat( DBMGR_STD, nCol ),
                                    *pNFmtr );
        else
            nRet = pNFmtr->GetFormatIndex( NF_NUMBER_STANDARD, LANGUAGE_SYSTEM );
    }
#endif
    return nRet;
}
/* -----------------------------17.07.00 09:47--------------------------------

 ---------------------------------------------------------------------------*/
#ifdef REPLACE_OFADBMGR
sal_Int32 SwNewDBMgr::GetColumnType( const String& rDBName,
                          const String& rTableName,
                          const String& rColNm )
{
    sal_Int32 nRet = DataType::SQLNULL;
    Reference< XDataSource> xSource;
    Reference< XConnection> xConnection = SwNewDBMgr::GetConnection(rDBName, xSource);
    Reference< XColumnsSupplier> xColsSupp = SwNewDBMgr::GetColumnSupplier(xConnection, rTableName);
    if(xColsSupp.is())
    {
          Reference <XNameAccess> xCols = xColsSupp->getColumns();
        if(xCols->hasByName(rColNm))
        {
            Any aCol = xCols->getByName(rColNm);
            Reference <XPropertySet> xCol = *(Reference <XPropertySet>*)aCol.getValue();
            Any aType = xCol->getPropertyValue(C2S("Type"));
            aType >>= nRet;
        }
    }
    return nRet;
}
#else
#endif

#ifdef REPLACE_OFADBMGR
#else
ULONG SwNewDBMgr::GetRealColumnFmt( const String& rColNm, ULONG nFmt,
                                    SvNumberFormatter& rNFmtr )
{
    SvNumberFormatter* pDBNumFmtr;
    const SvNumberformat* pNFmt;
    SbaDBDataDefRef aDBDef = OpenColumnNames( DBMGR_STD );
    if( aDBDef.Is() && 0 != ( pDBNumFmtr = aDBDef->GetFormatter() ) &&
        0 != (pNFmt = pDBNumFmtr->GetEntry( nFmt ) ) )
    {
        nFmt = rNFmtr.GetEntryKey( pNFmt->GetFormatstring(), pNFmt->GetLanguage() );
        if( NUMBERFORMAT_ENTRY_NOT_FOUND == nFmt )
        {
            xub_StrLen nCheckPos;
            short nType;
            XubString aTmp( pNFmt->GetFormatstring() );
            rNFmtr.PutEntry( aTmp, nCheckPos, nType, nFmt, pNFmt->GetLanguage() );
        }
    }
    else
        nFmt = rNFmtr.GetFormatIndex( NF_NUMBER_STANDARD, LANGUAGE_SYSTEM );

    return nFmt;
}
BOOL SwNewDBMgr::IsDBCaseSensitive( const String& rName ) const
{
    BOOL bRet = FALSE;
    String sDBName = OFF_APP()->LocalizeDBName( NATIONAL2INI, rName );
    if( sDBName.Len() )
    {
        SbaDatabaseRef xConnection = pSbaObject->GetDatabase(sDBName, TRUE);
        if( xConnection.Is() )
            // JP 18.11.99: looked from
            //      \offmgr\source\sba\core\db\dbtabobj.cxx
            bRet = SDB_IC_OBJECT == xConnection->GetIdentifierCase();
    }
    return bRet;
}
#endif

#ifdef REPLACE_OFADBMGR
/* -----------------------------03.07.00 17:12--------------------------------

 ---------------------------------------------------------------------------*/
Reference< sdbc::XConnection> SwNewDBMgr::GetConnection(const String& rDataSource,
                                                    Reference<XDataSource>& rxSource)
{
    Reference< sdbc::XConnection> xConnection;
    Reference<XNameAccess> xDBContext;
    Reference< XMultiServiceFactory > xMgr( ::utl::getProcessServiceFactory() );
    if( xMgr.is() )
    {
        Reference<XInterface> xInstance = xMgr->createInstance( C2U( "com.sun.star.sdb.DatabaseContext" ));
        xDBContext = Reference<XNameAccess>(xInstance, UNO_QUERY) ;
    }
    DBG_ASSERT(xDBContext.is(), "com.sun.star.sdb.DataBaseContext: service not available")
    if(xDBContext.is())
    {
        try
        {
            if(xDBContext->hasByName(rDataSource))
            {
                Any aDBSource = xDBContext->getByName(rDataSource);
                Reference<XDataSource>* pxSource = (Reference<XDataSource>*)aDBSource.getValue();
                   OUString sDummy;
                xConnection = (*pxSource)->getConnection(sDummy, sDummy);
                rxSource = (*pxSource);
            }
        }
        catch(...) {}
    }
    return xConnection;
}
/* -----------------------------03.07.00 17:12--------------------------------

 ---------------------------------------------------------------------------*/
Reference< sdbcx::XColumnsSupplier> SwNewDBMgr::GetColumnSupplier(Reference<sdbc::XConnection> xConnection,
                                    const String& rTableOrQuery,
                                    BYTE    eTableOrQuery)
{
    Reference< sdbcx::XColumnsSupplier> xRet;
    if(SW_DB_SELECT_QUERY != eTableOrQuery)
    {
        Reference<XTablesSupplier> xTSupplier = Reference<XTablesSupplier>(xConnection, UNO_QUERY);
        if(xTSupplier.is())
        {
            Reference<XNameAccess> xTbls = xTSupplier->getTables();
            if(xTbls->hasByName(rTableOrQuery))
                try
                {
                    Any aTable = xTbls->getByName(rTableOrQuery);
                    Reference<XPropertySet> xPropSet = *(Reference<XPropertySet>*)aTable.getValue();
                    xRet = Reference<XColumnsSupplier>(xPropSet, UNO_QUERY);
                }
                catch(...){}
        }
    }
    if(!xRet.is() && SW_DB_SELECT_QUERY != SW_DB_SELECT_TABLE)
    {
        Reference<XQueriesSupplier> xQSupplier = Reference<XQueriesSupplier>(xConnection, UNO_QUERY);
        if(xQSupplier.is())
        {
            Reference<XNameAccess> xQueries = xQSupplier->getQueries();
            if(xQueries->hasByName(rTableOrQuery))
                try
                {
                    Any aQuery = xQueries->getByName(rTableOrQuery);
                    Reference<XPropertySet> xPropSet = *(Reference<XPropertySet>*)aQuery.getValue();
                    xRet = Reference<XColumnsSupplier>(xPropSet, UNO_QUERY);
                }
                catch(...){}
        }
    }
    return xRet;
}
/* -----------------------------05.07.00 13:44--------------------------------

 ---------------------------------------------------------------------------*/
String SwNewDBMgr::GetDBField(Reference<XPropertySet> xColumnProps,
                        const SwDBFormatData& rDBFormatData,
                        double* pNumber)
{
    Reference< XColumn > xColumn(xColumnProps, UNO_QUERY);
    String sRet;
    DBG_ASSERT(xColumn.is(), "SwNewDBMgr::::ImportDBField: illegal arguments")
    if(!xColumn.is())
        return sRet;

    Any aType = xColumnProps->getPropertyValue(C2U("Type"));
    sal_Int32 eDataType;
    aType >>= eDataType;
    switch(eDataType)
    {
        case DataType::CHAR:
        case DataType::VARCHAR:
        case DataType::LONGVARCHAR:
            sRet = xColumn->getString();
        break;
        case DataType::BIT:
        case DataType::TINYINT:
        case DataType::SMALLINT:
        case DataType::INTEGER:
        case DataType::BIGINT:
        case DataType::FLOAT:
        case DataType::REAL:
        case DataType::DOUBLE:
        case DataType::NUMERIC:
        case DataType::DECIMAL:
        case DataType::DATE:
        case DataType::TIME:
        case DataType::TIMESTAMP:
        {
            ::Date aTempDate(rDBFormatData.aNullDate.Day,
                rDBFormatData.aNullDate.Month, rDBFormatData.aNullDate.Year);

            try
            {
                sRet = utl::DBTypeConversion::getValue(
                    xColumnProps,
                    rDBFormatData.xFormatter,
                    rDBFormatData.aLocale,
                    aTempDate);
                double fVal = xColumn->getDouble();
                if (pNumber)
                    *pNumber = fVal;
            }
            catch(Exception aExcept)
            {
                DBG_ERROR("exception caught")
            }

        }
        break;

//      case DataType::BINARY:
//      case DataType::VARBINARY:
//      case DataType::LONGVARBINARY:
//      case DataType::SQLNULL:
//      case DataType::OTHER:
//      case DataType::OBJECT:
//      case DataType::DISTINCT:
//      case DataType::STRUCT:
//      case DataType::ARRAY:
//      case DataType::BLOB:
//      case DataType::CLOB:
//      case DataType::REF:
//      default:
    }
//  if (pFormat)
//  {
//      SFX_ITEMSET_GET(*pCol, pFormatItem, SfxUInt32Item, SBA_DEF_FMTVALUE, sal_True);
//      *pFormat = pFormatItem->GetValue();
//  }

    return sRet;
}
/* -----------------------------06.07.00 14:26--------------------------------
    opens a data source table or query and keeps the reference
     until EndMerge() is called
 ---------------------------------------------------------------------------*/
BOOL SwNewDBMgr::OpenMergeSource(const String& rDataSource,
                            const String& rDataTableOrQuery,
                            const String& rStatement,
                            const SbaSelectionListRef xSelectionList)
{
    DBG_ASSERT(!bInMerge && !pMergeData, "merge already activated!")
    bInMerge = TRUE;
    pMergeData = new SwDSParam(rDataSource, rDataTableOrQuery, SW_DB_SELECT_UNKNOWN, rStatement);
    //remove corresponding data from aDataSourceParams and insert the merge data
    String sDBName(rDataSource);
    sDBName += DB_DELIM;
    sDBName += rDataTableOrQuery;
    SwDSParam*  pTemp = FindDSData(sDBName, FALSE);
    if(pTemp)
        pTemp = pMergeData;
    else
        aDataSourceParams.Insert(pMergeData, aDataSourceParams.Count());

    Reference<XDataSource> xSource;
    pMergeData->xConnection = SwNewDBMgr::GetConnection(rDataSource, xSource);
    pMergeData->xSelectionList = xSelectionList;
    if( xSelectionList.Is() && xSelectionList->Count() && (long)xSelectionList->GetObject(0) != -1L )
    {
        pMergeData->bSelectionList = TRUE;
    }

    if(pMergeData->xConnection.is())
    {
        try
        {
            pMergeData->bScrollable = pMergeData->xConnection->getMetaData()
                        ->supportsResultSetType((sal_Int32)ResultSetType::SCROLL_INSENSITIVE);
            pMergeData->xStatement = pMergeData->xConnection->createStatement();
            pMergeData->xResultSet = pMergeData->xStatement->executeQuery( rStatement );
            //after executeQuery the cursor must be positioned
            if(pMergeData->bSelectionList)
            {
                if(pMergeData->bScrollable)
                {
                    pMergeData->bEndOfDB = !pMergeData->xResultSet->absolute(
                        (ULONG)pMergeData->xSelectionList->GetObject( 0 ) );
                }
                else
                {
                    ULONG nPos = (ULONG)pMergeData->xSelectionList->GetObject( 0 );
                    while(nPos > 0 && !pMergeData->bEndOfDB)
                    {
                        pMergeData->bEndOfDB |= !pMergeData->xResultSet->next();
                        nPos--;
                    }
                }
                if(1 == pMergeData->xSelectionList->Count())
                    pMergeData->bEndOfDB = TRUE;
            }
            else
            {
                pMergeData->bEndOfDB = !pMergeData->xResultSet->next();
                ++pMergeData->nSelectionIndex;
            }
            Reference< XMultiServiceFactory > xMgr( ::utl::getProcessServiceFactory() );
            if( xMgr.is() )
            {
                Reference<XInterface> xInstance = xMgr->createInstance( C2U( "com.sun.star.util.NumberFormatter" ));
                pMergeData->xFormatter = Reference<util::XNumberFormatter>(xInstance, UNO_QUERY) ;
            }

            Reference<XPropertySet> xSourceProps(xSource, UNO_QUERY);
            if(xSourceProps.is())
            {
                Any aFormats = xSourceProps->getPropertyValue(C2U("NumberFormatsSupplier"));
                if(aFormats.hasValue())
                {
                    Reference<XNumberFormatsSupplier> xSuppl = *(Reference<util::XNumberFormatsSupplier>*) aFormats.getValue();
                    if(xSuppl.is())
                    {
                        Reference< XPropertySet > xSettings = xSuppl->getNumberFormatSettings();
                        Any aNull = xSettings->getPropertyValue(C2U("NullDate"));
                        if(aNull.hasValue())
                            pMergeData->aNullDate = *(util::Date*)aNull.getValue();
                    }
                }
            }
        }
        catch(Exception aExcept)
        {
            DBG_ERROR("exception caught")
        }
    }
    BOOL bRet = pMergeData && pMergeData->xResultSet.is();
    if(!bRet)
        pMergeData = 0;
    return bRet;
}
/* -----------------------------06.07.00 14:28--------------------------------
    releases the merge data source table or query after merge is completed
 ---------------------------------------------------------------------------*/
void    SwNewDBMgr::EndMerge()
{
    DBG_ASSERT(bInMerge, "merge is not active")
    bInMerge = FALSE;
    pMergeData = 0;
}
/* -----------------------------06.07.00 14:28--------------------------------
    checks if a desired data source table or query is open
 ---------------------------------------------------------------------------*/
BOOL    SwNewDBMgr::IsDataSourceOpen(const String& rDataSource, const String& rTableOrQuery) const
{
     if(pMergeData)
    {
        return rDataSource == pMergeData->sDataSource &&
                    rTableOrQuery == pMergeData->sTableOrQuery &&
                    pMergeData->xResultSet.is();
    }
    else
        return FALSE;
}
/* -----------------------------17.07.00 16:44--------------------------------
    read column data a a specified position
 ---------------------------------------------------------------------------*/
BOOL SwNewDBMgr::GetColumnCnt(const String& rSourceName, const String& rTableName,
                            const String& rColumnName, sal_uInt32 nAbsRecordId,
                            long nLanguage,
                            String& rResult, double* pNumber)
{
    BOOL bRet = FALSE;
    //check if it's the merge data source
    if(pMergeData &&
        rSourceName == pMergeData->sDataSource &&
        rTableName == pMergeData->sTableOrQuery)
    {
        if(!pMergeData->xResultSet.is())
            return FALSE;
        //keep the old index
        sal_Int32 nOldRow = pMergeData->xResultSet->getRow();
        //position to the desired index
        BOOL bMove;
        if(nOldRow != nAbsRecordId)
            bMove = lcl_MoveAbsolute(pMergeData, nAbsRecordId);
        if(bMove)
        {
            bRet = lcl_GetColumnCnt(pMergeData, rColumnName, nLanguage, rResult, pNumber);
        }
        if(nOldRow != nAbsRecordId)
            bMove = lcl_MoveAbsolute(pMergeData, nOldRow);
    }
    //
    return bRet;
}
/* -----------------------------06.07.00 16:47--------------------------------
    reads the column data at the current position
 ---------------------------------------------------------------------------*/
BOOL    SwNewDBMgr::GetMergeColumnCnt(const String& rColumnName, USHORT nLanguage,
                                String &rResult, double *pNumber, sal_uInt32 *pFormat)
{
    if(!pMergeData || !pMergeData->xResultSet.is())
        return FALSE;

    BOOL bRet = lcl_GetColumnCnt(pMergeData, rColumnName, nLanguage, rResult, pNumber);
    return bRet;
}
/* -----------------------------07.07.00 14:28--------------------------------

 ---------------------------------------------------------------------------*/
BOOL SwNewDBMgr::ToNextMergeRecord()
{
    DBG_ASSERT(pMergeData && pMergeData->xResultSet.is(), "no data source in merge")
    if(!pMergeData || !pMergeData->xResultSet.is() || pMergeData->bEndOfDB)
        return FALSE;
    try
    {
        if(pMergeData->bSelectionList)
        {
            if(pMergeData->bScrollable)
            {
                pMergeData->bEndOfDB = !pMergeData->xResultSet->absolute(
                    (ULONG)pMergeData->xSelectionList->GetObject( ++pMergeData->nSelectionIndex ) );
            }
            else
            {
                ULONG nOldPos = pMergeData->nSelectionIndex ?
                    (ULONG)pMergeData->xSelectionList->GetObject(pMergeData->nSelectionIndex): 0;
                ULONG nPos = (ULONG)pMergeData->xSelectionList->GetObject( ++pMergeData->nSelectionIndex );
                DBG_ASSERT(nPos >=0, "selection invalid!")
                long nDiff = nPos - nOldPos;
                //if a backward move is necessary then the result set must be created again
                if(nDiff < 0)
                {
                    try
                    {
                        pMergeData->xResultSet = pMergeData->xStatement->executeQuery( pMergeData->sStatement );
                    }
                    catch(...)
                    {
                        pMergeData->bEndOfDB = TRUE;
                    }
                    nDiff = nPos;
                }
                while(nDiff > 0 && !pMergeData->bEndOfDB)
                {
                    pMergeData->bEndOfDB |= !pMergeData->xResultSet->next();
                    nDiff--;
                }
            }
            if(pMergeData->nSelectionIndex >= pMergeData->xSelectionList->Count())
                pMergeData->bEndOfDB = TRUE;
        }
        else
        {
            pMergeData->bEndOfDB = !pMergeData->xResultSet->next();
            ++pMergeData->nSelectionIndex;
        }
    }
    catch(Exception aExcept)
    {
        DBG_ERROR("exception caught")
    }
    return TRUE;
}
/* -----------------------------13.07.00 17:23--------------------------------
    synchronized labels contain a next record field at their end
    to assure that the next page can be created in mail merge
    the cursor position must be validated
 ---------------------------------------------------------------------------*/
BOOL SwNewDBMgr::ExistsNextRecord() const
{
    return pMergeData && !pMergeData->bEndOfDB;
}
/* -----------------------------13.07.00 10:41--------------------------------

 ---------------------------------------------------------------------------*/
sal_uInt32  SwNewDBMgr::GetSelectedRecordId()
{
    sal_uInt32  nRet = 0;
    DBG_ASSERT(pMergeData && pMergeData->xResultSet.is(), "no data source in merge")
    if(!pMergeData || !pMergeData->xResultSet.is())
        return FALSE;
    try
    {
        nRet = pMergeData->xResultSet->getRow();
    }
    catch(Exception aExcept)
    {
        DBG_ERROR("exception caught")
    }
    return nRet;
}
/* -----------------------------13.07.00 10:58--------------------------------

 ---------------------------------------------------------------------------*/
sal_Bool SwNewDBMgr::ToRecordId(sal_Int32 nSet)
{
    DBG_ASSERT(pMergeData && pMergeData->xResultSet.is(), "no data source in merge")
    if(!pMergeData || !pMergeData->xResultSet.is()|| nSet < 0)
        return FALSE;
    sal_Bool bRet = FALSE;
    sal_Int32 nAbsPos = -1;
    if(pMergeData->bSelectionList)
    {
        if(pMergeData->xSelectionList->Count() > nSet)
        {
            nAbsPos = (sal_Int32)pMergeData->xSelectionList->GetObject(nSet);
        }
    }
    else
        nAbsPos = nSet;

    if(nAbsPos >= 0)
    {
        bRet = lcl_MoveAbsolute(pMergeData, nAbsPos);
        pMergeData->bEndOfDB = !bRet;
    }
    return bRet;
}
/* -----------------------------17.07.00 11:14--------------------------------

 ---------------------------------------------------------------------------*/
BOOL    SwNewDBMgr::ShowInBeamer(const String& rDBName, const String& rTableName,
                                            BYTE nType, const String& rStatement)
{
    DBG_ERROR("no beamer interface available!")
    return FALSE;
}
/* -----------------------------17.07.00 14:50--------------------------------

 ---------------------------------------------------------------------------*/
void lcl_ExtractMembers(const String& rDBName, String& sSource, String& sTable, String& sStatement)
{
    sSource = rDBName.GetToken(0, DB_DELIM);
    sTable = rDBName.GetToken(0).GetToken(1, DB_DELIM);
    sal_uInt16 nPos;
    if ((nPos = rDBName.Search(';')) != STRING_NOTFOUND)
        sStatement = rDBName.Copy(nPos + 1);
}
/* -----------------------------17.07.00 14:17--------------------------------

 ---------------------------------------------------------------------------*/
BOOL SwNewDBMgr::OpenDataSource(const String& rDataSource, const String& rTableOrQuery)
{
    String sDBName = rDataSource;
    sDBName += DB_DELIM;
    sDBName += rTableOrQuery;
    SwDSParam* pFound = FindDSData(sDBName, TRUE);
    pFound->bSelectionList = pFound->xSelectionList.Is() && pFound->xSelectionList->Count();
    Reference< XDataSource> xSource;
    if(pFound->xResultSet.is())
        return TRUE;
    pFound->xConnection = SwNewDBMgr::GetConnection(rDataSource, xSource );
    if(pFound->xConnection.is())
    {
        try
        {
            pFound->bScrollable = pFound->xConnection->getMetaData()
                        ->supportsResultSetType((sal_Int32)ResultSetType::SCROLL_INSENSITIVE);
            pFound->xStatement = pFound->xConnection->createStatement();
            pFound->xResultSet = pFound->xStatement->executeQuery( pFound->sStatement );

            //after executeQuery the cursor must be positioned
            if(pFound->bSelectionList)
            {
                if(pFound->bScrollable)
                {
                    pFound->bEndOfDB = !pMergeData->xResultSet->absolute(
                        (ULONG)pFound->xSelectionList->GetObject( 0 ) );
                }
                else
                {
                    ULONG nPos = (ULONG)pFound->xSelectionList->GetObject( 0 );
                    while(nPos > 0 && !pFound->bEndOfDB)
                    {
                        pFound->bEndOfDB |= !pFound->xResultSet->next();
                        nPos--;
                    }
                }
                if(1 == pFound->xSelectionList->Count())
                    pFound->bEndOfDB = TRUE;
            }
            else
            {
                pFound->bEndOfDB = !pMergeData->xResultSet->next();
                ++pMergeData->nSelectionIndex;
            }
        }
        catch(...)
        {
            pFound->xResultSet = 0;
            pFound->xStatement = 0;
            pFound->xConnection = 0;
        }
    }
    return pFound->xResultSet.is();
}
/* -----------------------------17.07.00 15:55--------------------------------

 ---------------------------------------------------------------------------*/
sal_uInt32      SwNewDBMgr::GetSelectedRecordId(const String& rDataSource, const String& rTableOrQuery)
{
    sal_uInt32 nRet = -1;
    //check for merge data source first
     if(pMergeData && rDataSource == pMergeData->sDataSource &&
                    rTableOrQuery == pMergeData->sTableOrQuery &&
                    pMergeData->xResultSet.is())
        nRet = GetSelectedRecordId();
    else
    {
        String sDBName(rDataSource);
        sDBName += DB_DELIM;
        sDBName += rTableOrQuery;
        SwDSParam* pFound = SwNewDBMgr::FindDSData(sDBName, FALSE);
        if(pFound && pFound->xResultSet.is())
        {
            try
            {
                nRet = pFound->xResultSet->getRow();
            }
            catch(...){}
        }
    }
    return nRet;
}

/* -----------------------------17.07.00 14:18--------------------------------
    close all data sources - after fields were updated
 ---------------------------------------------------------------------------*/
void    SwNewDBMgr::CloseAll(BOOL bIncludingMerge)
{
    for(USHORT nPos = 0; nPos < aDataSourceParams.Count(); nPos++)
    {
        SwDSParam* pParam = aDataSourceParams[nPos];
        if(bIncludingMerge || pParam != pMergeData)
          {
            pParam->xResultSet = 0;
            pParam->xStatement = 0;
            pParam->xConnection = 0;
        }
    }
}
/* -----------------------------17.07.00 14:54--------------------------------

 ---------------------------------------------------------------------------*/
SwDSParam* SwNewDBMgr::FindDSData(const String& rDBName, BOOL bCreate)
{
    String sSource;
    String sTable;
    String sStatement;
    lcl_ExtractMembers(rDBName, sSource, sTable, sStatement);
    SwDSParam* pFound = 0;

    for(USHORT nPos = 0; nPos < aDataSourceParams.Count(); nPos++)
    {
        SwDSParam* pParam = aDataSourceParams[nPos];
        if(sSource == pParam->sDataSource &&
            sTable == pParam->sTableOrQuery)
            {
                pFound = pParam;
                break;
            }
    }
    if(bCreate)
    {
        if(!pFound)
        {
            pFound = new SwDSParam(sSource, sTable, SW_DB_SELECT_UNKNOWN, sStatement);
            aDataSourceParams.Insert(pFound, aDataSourceParams.Count());
        }
        else
            pFound->sStatement = sStatement;
    }
    return pFound;
}
/* -----------------------------17.07.00 14:31--------------------------------
    rDBName: <Source> + DB_DELIM + <Table>; + <Statement>
 ---------------------------------------------------------------------------*/
void    SwNewDBMgr::AddDSData(const String& rDBName, long nSelStart, long nSelEnd)
{
    SwDSParam* pFound = FindDSData(rDBName, TRUE);
    if(pFound->xSelectionList.Is())
        pFound->xSelectionList->Clear();
    else
        pFound->xSelectionList = new SbaSelectionList;
    if (nSelStart > 0)
    {
        if (nSelEnd < nSelStart)
        {
            sal_uInt32 nZw = nSelEnd;
            nSelEnd = nSelStart;
            nSelStart = nZw;
        }

        for (long i = nSelStart; i <= nSelEnd; i++)
            pFound->xSelectionList->Insert((void*)i , LIST_APPEND);
    }
}
/* -----------------------------17.07.00 14:31--------------------------------

 ---------------------------------------------------------------------------*/
void    SwNewDBMgr::GetDSSelection(const String& rDBDesc, long& rSelStart, long& rSelEnd)
{
    SwDSParam* pFound = FindDSData(rDBDesc, FALSE);
    if(!pFound || !pFound->xSelectionList.Is() || !pFound->xSelectionList->Count())
        rSelStart = -1L;
    else
    {
        if(pFound->xSelectionList->Count())
        {
            rSelStart = (sal_uInt32)pFound->xSelectionList->GetObject(0);
            for (sal_uInt32 i = 1; i < pFound->xSelectionList->Count(); i++)
            {
                long nPrev = (sal_uInt32)pFound->xSelectionList->GetObject(i - 1);
                long nNow = (sal_uInt32)pFound->xSelectionList->GetObject(i);

                if (nNow - nPrev > 1)
                {
                    rSelEnd = nPrev;
                    return;
                }
            }
            rSelEnd = (sal_uInt32)pFound->xSelectionList->GetObject(i - 1);
        }
    }
}
/* -----------------------------17.07.00 14:34--------------------------------

 ---------------------------------------------------------------------------*/
const String&   SwNewDBMgr::GetAddressDBName()
{
    DBG_ERROR("no address data base selection available")
    return aEmptyStr;
}
/* -----------------------------18.07.00 13:13--------------------------------

 ---------------------------------------------------------------------------*/
Sequence<OUString> SwNewDBMgr::GetExistingDatabaseNames()
{
    Reference<XNameAccess> xDBContext;
    Reference< XMultiServiceFactory > xMgr( ::utl::getProcessServiceFactory() );
    if( xMgr.is() )
    {
        Reference<XInterface> xInstance = xMgr->createInstance( C2U( "com.sun.star.sdb.DatabaseContext" ));
        xDBContext = Reference<XNameAccess>(xInstance, UNO_QUERY) ;
    }
    if(xDBContext.is())
    {
        return xDBContext->getElementNames();
    }
    return Sequence<OUString>();
}
#endif  //REPLACE_OFADBMGR

/*------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.372  2000/09/18 16:05:18  willem.vandorp
    OpenOffice header added.

    Revision 1.371  2000/08/08 10:10:39  os
    ucb transfer command used

    Revision 1.370  2000/07/18 12:50:07  os
    replace ofadbmgr

    Revision 1.369  2000/07/07 15:25:43  os
    replace ofadbmgr

    Revision 1.368  2000/07/06 07:59:10  os
    replace ofadbmgr

    Revision 1.367  2000/07/05 08:23:06  os
    Replace ofadbmgr

    Revision 1.366  2000/06/26 13:18:45  os
    INetURLObject::SmartRelToAbs removed

    Revision 1.365  2000/06/13 09:57:36  os
    using UCB

    Revision 1.364  2000/06/08 09:46:48  os
    ContentBroker not in SwModule

    Revision 1.363  2000/06/07 13:26:07  os
    using UCB

    Revision 1.362  2000/05/23 18:11:05  jp
    Bugfixes for Unicode

    Revision 1.361  2000/04/17 10:01:56  os
    #74698# detect synchronized documents with an additional DBNextSet - field

    Revision 1.360  2000/04/11 08:03:52  os
    UNICODE

    Revision 1.359  2000/02/11 14:44:23  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.358  2000/01/06 18:20:27  jp
    Bug #71413#: MergeMailFiles: HandleErrors, created filenames starts with 1

    Revision 1.357  2000/01/06 07:31:29  os
    #71436# mail merge dialog: execute via status method disposed

    Revision 1.356  1999/12/22 15:57:02  jp
    Bug #71238#: MergePrint - behind the first call erase the JobName

    Revision 1.355  1999/12/14 14:35:04  jp
    Bug #69595#: print can create single Jobs

    Revision 1.354  1999/11/23 11:20:55  os
    comment

    Revision 1.353  1999/11/18 21:02:54  jp
    for Bug #68744#: new: IsCaseSensitive



------------------------------------------------------------------------*/

diff --git a/sw/source/ui/dbui/dbtree.cxx b/sw/source/ui/dbui/dbtree.cxx
new file mode 100644
index 0000000..75c7ef3
--- /dev/null
+++ b/sw/source/ui/dbui/dbtree.cxx
@@ -0,0 +1,833 @@
/*************************************************************************
 *
 *  $RCSfile: dbtree.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:34 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

// INCLUDE ---------------------------------------------------------------

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SOT_FORMATS_HXX
#include <sot/formats.hxx>
#endif

#ifdef REPLACE_OFADBMGR
#ifndef _COM_SUN_STAR_LANG_XMULTISERVICEFACTORY_HPP_
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XNAMEACCESS_HPP_
#include <com/sun/star/container/XNameAccess.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBC_XDATASOURCE_HPP_
#include <com/sun/star/sdbc/XDataSource.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBCX_XTABLESSUPPLIER_HPP_
#include <com/sun/star/sdbcx/XTablesSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBCX_XCOLUMNSSUPPLIER_HPP_
#include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_SDB_XQUERIESSUPPLIER_HPP_
#include <com/sun/star/sdb/XQueriesSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_SDB_XDATABASEACCESS_HPP_
#include <com/sun/star/sdb/XDatabaseAccess.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
#include <com/sun/star/beans/XPropertySet.hpp>
#endif
#ifndef _UNOTOOLS_PROCESSFACTORY_HXX_
#include <unotools/processfactory.hxx>
#endif

#else

#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _SBAOBJ_HXX //autogen
#include <offmgr/sbaobj.hxx>
#endif
#ifndef _SBA_SBADB_HXX //autogen
#include <offmgr/sbadb.hxx>
#endif
#ifndef _SBAITEMS_HRC
#include <offmgr/sbaitems.hrc>
#endif
#ifndef _SBAITEMS_HXX
#include <offmgr/sbaitems.hxx>
#endif

#endif  //REPLACE_OFADBMGR

#ifndef _DRAG_HXX //autogen
#include <vcl/drag.hxx>
#endif

#include "helpid.h"
#include "dbmgr.hxx"
#include "swmodule.hxx"
#include "view.hxx"
#include "wrtsh.hxx"

#include "dbui.hrc"
#include "dbtree.hxx"

#ifdef REPLACE_OFADBMGR
using namespace rtl;
using namespace com::sun::star::uno;
using namespace com::sun::star::container;
using namespace com::sun::star::lang;
using namespace com::sun::star::sdb;
using namespace com::sun::star::sdbc;
using namespace com::sun::star::sdbcx;
using namespace com::sun::star::beans;
#endif

#define C2U(cChar) rtl::OUString::createFromAscii(cChar)
// STATIC DATA -----------------------------------------------------------


/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/


SwDBTreeList::SwDBTreeList(Window *pParent, const ResId& rResId, const String& rDefDBName, const BOOL bShowCol):

    SvTreeListBox   (pParent, rResId),

    aRootClosed     (SW_RES(BMP_ROOT_CLOSED)),
    aRootOpened     (SW_RES(BMP_ROOT_OPENED)),
    aDBBMP          (SW_RES(BMP_DB)),
    aTableBMP       (SW_RES(BMP_TABLE)),
    aQueryBMP       (SW_RES(BMP_QUERY)),

    sDefDBName      (rDefDBName),
    bShowColumns    (bShowCol),
    bInitialized    (FALSE)
{
#ifdef REPLACE_OFADBMGR
    Reference< XMultiServiceFactory > xMgr( ::utl::getProcessServiceFactory() );
    if( xMgr.is() )
    {
        Reference<XInterface> xInstance = xMgr->createInstance( C2U( "com.sun.star.sdb.DatabaseContext" ));
        xDBContext = Reference<XNameAccess>(xInstance, UNO_QUERY) ;
    }
    DBG_ASSERT(xDBContext.is(), "com.sun.star.sdb.DataBaseContext: service not available")
#endif

    SetHelpId(HID_DB_SELECTION_TLB);

    if (IsVisible())
        InitTreeList();
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/


 SwDBTreeList::~SwDBTreeList()
{
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/


void SwDBTreeList::InitTreeList()
{
#ifdef REPLACE_OFADBMGR
    if(!xDBContext.is())
        return;
#endif
    SetSelectionMode(SINGLE_SELECTION);
    SetWindowBits(WB_HASLINES|WB_CLIPCHILDREN|WB_SORT|WB_HASBUTTONS|WB_HASBUTTONSATROOT|WB_HSCROLL);
    // Font nicht setzen, damit der Font des Controls uebernommen wird!
    SetSpaceBetweenEntries(0);
    SetNodeBitmaps( aRootClosed, aRootOpened );

    SetDragDropMode(SV_DRAGDROP_APP_COPY);


    GetModel()->SetCompareHdl(LINK(this, SwDBTreeList, DBCompare));

#ifdef REPLACE_OFADBMGR
    Sequence<OUString> aDBNames = xDBContext->getElementNames();
    const OUString* pDBNames = aDBNames.getConstArray();
    long nCount = aDBNames.getLength();

    for(long i = 0; i < nCount; i++)
    {
        String sDBName(pDBNames[i]);
        InsertEntry(sDBName, aDBBMP, aDBBMP, NULL, TRUE);
    }
    String sDBName(sDefDBName.GetToken(0, DB_DELIM));
    String sTableName(sDefDBName.GetToken(1, DB_DELIM));
    String sColumnName(sDefDBName.GetToken(2, DB_DELIM));
    Select(sDBName, sTableName, sColumnName);

#else
    OfficeApplication* pOffApp = OFF_APP();
    SbaObject* pSbaObject = pOffApp->GetSbaObject();
    String sDBNames = pSbaObject->GetDatabaseNames();
    USHORT nCount = sDBNames.GetTokenCount();

    for (USHORT i = 0; i < nCount; i++)
    {
        String sDBName(sDBNames.GetToken(i));
        InsertEntry(sDBName, aDBBMP, aDBBMP, NULL, TRUE);
    }
    Select(sDefDBName);
#endif

    bInitialized = TRUE;
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

void SwDBTreeList::ShowColumns(BOOL bShowCol)
{
    if (bShowCol != bShowColumns)
    {
        bShowColumns = bShowCol;
#ifdef REPLACE_OFADBMGR
        String sTableName, sColumnName;
        String  sDBName(GetDBName(sTableName, sColumnName));
#else
        String sDBName(GetDBName());
#endif

        SetUpdateMode(FALSE);

        SvLBoxEntry* pEntry = First();

        while (pEntry)
        {
            pEntry = (SvLBoxEntry*)GetRootLevelParent( pEntry );
            Collapse(pEntry);       // zuklappen

            SvLBoxEntry* pChild;
            while ((pChild = FirstChild(pEntry)) != 0L)
                GetModel()->Remove(pChild);

            pEntry = Next(pEntry);
        }

        if (sDBName.Len())
        {
#ifdef REPLACE_OFADBMGR
            Select(sDBName, sTableName, sColumnName);   // force RequestingChilds
#else
            Select(sDBName);    // RequestingChilds erzwingen
#endif
        }
        SetUpdateMode(TRUE);
    }
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

void  SwDBTreeList::RequestingChilds(SvLBoxEntry* pParent)
{
    if (!pParent->HasChilds())
    {
#ifdef REPLACE_OFADBMGR

        if (GetParent(pParent)) // column names
        {

            String sSourceName = GetEntryText(GetParent(pParent));
            String sTableName = GetEntryText(pParent);

            if(!xDBContext->hasByName(sSourceName))
                return;
            Any aDBSource = xDBContext->getByName(sSourceName);
            Reference<XDataSource>* pxSource = (Reference<XDataSource>*)aDBSource.getValue();
            BOOL bTable = pParent->GetUserData != 0;
            Reference<XConnection> xConnection;
            try
            {
                OUString sDummy;
                xConnection = (*pxSource)->getConnection(sDummy, sDummy);
            }
            catch(...) {}
            Reference<XColumnsSupplier> xColsSupplier;
            if(bTable)
            {
                Reference<XTablesSupplier> xTSupplier = Reference<XTablesSupplier>(xConnection, UNO_QUERY);
                if(xTSupplier.is())
                {
                    Reference<XNameAccess> xTbls = xTSupplier->getTables();
                    DBG_ASSERT(xTbls->hasByName(sTableName), "table not available anymore?")
                    try
                    {
                        Any aTable = xTbls->getByName(sTableName);
                        Reference<XPropertySet> xPropSet = *(Reference<XPropertySet>*)aTable.getValue();
                        xColsSupplier = Reference<XColumnsSupplier>(xPropSet, UNO_QUERY);
                    }
                    catch(...){}
                }
            }
            else
            {
                Reference<XQueriesSupplier> xQSupplier = Reference<XQueriesSupplier>(xConnection, UNO_QUERY);
                if(xQSupplier.is())
                {
                    Reference<XNameAccess> xQueries = xQSupplier->getQueries();
                    DBG_ASSERT(xQueries->hasByName(sTableName), "table not available anymore?")
                    try
                    {
                        Any aQuery = xQueries->getByName(sTableName);
                        Reference<XPropertySet> xPropSet = *(Reference<XPropertySet>*)aQuery.getValue();
                        xColsSupplier = Reference<XColumnsSupplier>(xPropSet, UNO_QUERY);
                    }
                    catch(...){}
                }
            }

            if(xColsSupplier.is())
            {
                Reference <XNameAccess> xCols = xColsSupplier->getColumns();
                Sequence<OUString> aColNames = xCols->getElementNames();
                const OUString* pColNames = aColNames.getConstArray();
                long nCount = aColNames.getLength();
                for (long i = 0; i < nCount; i++)
                {
                    String sName = pColNames[i];
                    if(bTable)
                        InsertEntry(sName, pParent);
                    else
                        InsertEntry(sName, pParent);
                }
            }
        }
        else    // Tabellennamen
        {
            String sSourceName = GetEntryText(pParent);
            if(!xDBContext->hasByName(sSourceName))
                return;
            Any aDBSource = xDBContext->getByName(sSourceName);
            Reference<XDataSource>* pxSource = (Reference<XDataSource>*)aDBSource.getValue();

            Reference<XConnection> xConnection;
            try
            {
                OUString sDummy;
                xConnection = (*pxSource)->getConnection(sDummy, sDummy);
            }
            catch(...) {}
//          SbaDatabaseRef pConnection = pSbaObject->GetDatabase(sDBName, TRUE);
            if (xConnection.is())
            {
                Reference<XTablesSupplier> xTSupplier = Reference<XTablesSupplier>(xConnection, UNO_QUERY);
                if(xTSupplier.is())
                {
                    Reference<XNameAccess> xTbls = xTSupplier->getTables();
                    Sequence<OUString> aTblNames = xTbls->getElementNames();
                    String sTableName;
                    long nCount = aTblNames.getLength();
                    const OUString* pTblNames = aTblNames.getConstArray();
                    for (long i = 0; i < nCount; i++)
                    {
                        sTableName = pTblNames[i];
                        SvLBoxEntry* pTableEntry = InsertEntry(sTableName, aTableBMP, aTableBMP, pParent, bShowColumns);
                        //to discriminate between queries and tables the user data of table entries is set
                        pTableEntry->SetUserData((void*)1);
                    }
                }

                Reference<XQueriesSupplier> xQSupplier = Reference<XQueriesSupplier>(xConnection, UNO_QUERY);
                if(xQSupplier.is())
                {
                    Reference<XNameAccess> xQueries = xQSupplier->getQueries();
                    Sequence<OUString> aQueryNames = xQueries->getElementNames();
                    String sQueryName;
                    long nCount = aQueryNames.getLength();
                    const OUString* pQueryNames = aQueryNames.getConstArray();
                    for (long i = 0; i < nCount; i++)
                    {
                        sQueryName = pQueryNames[i];
                        InsertEntry(sQueryName, aQueryBMP, aQueryBMP, pParent, bShowColumns);
                    }
                }
            }
        }
#else
        SbaObject* pSbaObject = OFF_APP()->GetSbaObject();
        if (GetParent(pParent)) // Spaltennamen
        {
            SwWrtShell *pSh = ::GetActiveView()->GetWrtShellPtr();
            SwNewDBMgr *pMgr = pSh->GetNewDBMgr();

            String sDBName = GetEntryText(GetParent(pParent));
            sDBName += DB_DELIM;
            sDBName += GetEntryText(pParent);

            if (!sDBName.Len() || (!pMgr->IsDBOpen(DBMGR_STD, sDBName) && !pMgr->OpenDB(DBMGR_STD, sDBName, TRUE)))
                return;

            SbaDBDataDefRef aDBDef = pMgr->OpenColumnNames(DBMGR_STD);

            if (aDBDef.Is())
            {
                const SbaColumnList& rCols = aDBDef->GetOriginalColumns();

                for (USHORT i = 1; i <= rCols.Count(); i++)
                {
                    const SbaNameItem* pNameItem = (const SbaNameItem*)&rCols.GetObject(i-1)->Get(SBA_DEF_FLTNAME);
                    InsertEntry(pNameItem->GetValue(), pParent);
                }
            }
            pMgr->CloseAll(DBMGR_STD);
        }
        else    // Tabellennamen
        {
            String sDBName = GetEntryText(pParent);

            SbaDatabaseRef pConnection = pSbaObject->GetDatabase(sDBName, TRUE);
            if (pConnection.Is())
            {
                String sTableName;

                USHORT nCount = pConnection->GetObjectCount(dbTable);

                for (USHORT i = 0; i < nCount; i++)
                {
                    sTableName = pConnection->GetObjectName(dbTable, i);
                    InsertEntry(sTableName, aTableBMP, aTableBMP, pParent, bShowColumns);
                }

                nCount = pConnection->GetObjectCount(dbQuery);

                for (i = 0; i < nCount; i++)
                {
                    sTableName = pConnection->GetObjectName(dbQuery, i);
                    InsertEntry(sTableName, aQueryBMP, aQueryBMP, pParent, bShowColumns);
                }
            }
        }
#endif
    }
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

IMPL_LINK( SwDBTreeList, DBCompare, SvSortData*, pData )
{
    SvLBoxEntry* pRight = (SvLBoxEntry*)(pData->pRight );

    if (GetParent(pRight) && GetParent(GetParent(pRight)))
        return COMPARE_GREATER; // Spaltennamen nicht sortieren

    return DefaultCompare(pData);   // Sonst Basisklasse rufen
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

#ifdef REPLACE_OFADBMGR
String  SwDBTreeList::GetDBName(String& rTableName, String& rColumnName, BOOL* pbIsTable)
#else
String SwDBTreeList::GetDBName() const
#endif
{
    String sDBName;
#ifdef REPLACE_OFADBMGR
#else
    String sColumnName;
#endif
    SvLBoxEntry* pEntry = FirstSelected();

    if (pEntry && GetParent(pEntry))
    {
        if (GetParent(GetParent(pEntry)))
        {
#ifdef REPLACE_OFADBMGR
            rColumnName = GetEntryText(pEntry);
#else
            sColumnName = GetEntryText(pEntry);
#endif
            pEntry = GetParent(pEntry); // Spaltenname war selektiert
        }
        sDBName = GetEntryText(GetParent(pEntry));
#ifdef REPLACE_OFADBMGR
        if(pbIsTable)
        {
            *pbIsTable = pEntry->GetUserData() != 0;
        }
        rTableName = GetEntryText(pEntry);
#else
        sDBName += DB_DELIM;
        sDBName += GetEntryText(pEntry);

        if (sColumnName.Len())
        {
            sDBName += DB_DELIM;
            sDBName += sColumnName;
        }
#endif
    }
    return sDBName;
}

/*------------------------------------------------------------------------
 Beschreibung:  Format: Datenbank.Tabelle
------------------------------------------------------------------------*/


#ifdef REPLACE_OFADBMGR
void SwDBTreeList::Select(const String& rDBName, const String& rTableName, const String& rColumnName)
#else
void  SwDBTreeList::Select(const String& rDataBaseName)
#endif
{
#ifdef REPLACE_OFADBMGR
#else
    String rDBName(rDataBaseName.GetToken(0, DB_DELIM));
    String rTableName(rDataBaseName.GetToken(1, DB_DELIM));
    String rColumnName(rDataBaseName.GetToken(2, DB_DELIM));
#endif
    SvLBoxEntry* pParent;
    SvLBoxEntry* pChild;
    USHORT nParent = 0;
    USHORT nChild = 0;

    while ((pParent = GetEntry(nParent++)) != NULL)
    {
        if (rDBName == GetEntryText(pParent))
        {
            if (!pParent->HasChilds())
                RequestingChilds(pParent);
            while ((pChild = GetEntry(pParent, nChild++)) != NULL)
            {
                if (rTableName == GetEntryText(pChild))
                {
                    pParent = pChild;

                    if (bShowColumns && rColumnName.Len())
                    {
                        nChild = 0;

                        if (!pParent->HasChilds())
                            RequestingChilds(pParent);

                        while ((pChild = GetEntry(pParent, nChild++)) != NULL)
                            if (rColumnName == GetEntryText(pChild))
                                break;
                    }
                    if (!pChild)
                        pChild = pParent;

                    MakeVisible(pChild);
                    SvTreeListBox::Select(pChild);
                    return;
                }
            }
        }
    }
}

/*------------------------------------------------------------------------
 Beschreibung: Initialisierung verz”gern
------------------------------------------------------------------------*/

void  SwDBTreeList::Show()
{
    if (!bInitialized)
        InitTreeList();

    SvTreeListBox::Show();
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

void  SwDBTreeList::Command( const CommandEvent& rCEvt )
{
    switch( rCEvt.GetCommand() )
    {
        case COMMAND_STARTDRAG:
            StartExecuteDrag();
            ExecuteDrag(Pointer(POINTER_MOVEDATA), Pointer(POINTER_COPYDATA),
                        Pointer(POINTER_LINKDATA), DRAG_COPYABLE | DRAG_LINKABLE);
        break;
        default:
            SvTreeListBox::Command(rCEvt);
    }
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

void SwDBTreeList::StartExecuteDrag()
{
    DragServer::Clear();
#ifdef REPLACE_OFADBMGR
    String sTableName, sColumnName;
    String  sDBName(GetDBName(sTableName, sColumnName));
    if(sDBName.Len())
    {
        if (sColumnName.Len())
        {
            String aCopyData = sDBName;
            aCopyData   += char(11);
            aCopyData   += sTableName;
            aCopyData   += char(11);
            aCopyData   += String(String::CreateFromAscii("0"));
            aCopyData   += char(11);
            aCopyData   += sColumnName;

            // Datenbankfeld draggen
            DragServer::CopyData(aCopyData.GetBuffer(), aCopyData.Len() + 1,
                                    SOT_FORMATSTR_ID_SBA_FIELDDATAEXCHANGE);
        }

        sDBName += '.';
        sDBName += sTableName;
        if(sColumnName.Len())
        {
            sDBName += '.';
            sDBName += sColumnName;
        }
        DragServer::CopyString(sDBName);
    }
#else
    String sDBName(GetDBName());
    if(sDBName.Len())
    {
        if (sDBName.GetTokenCount(DB_DELIM) > 2)    // Spaltenname ist enthalten
        {
            String aCopyData = sDBName.GetToken(0, DB_DELIM);
            aCopyData   += char(11);
            aCopyData   += sDBName.GetToken(1, DB_DELIM);
            aCopyData   += char(11);
            aCopyData   += String(String::CreateFromAscii("0"));
            aCopyData   += char(11);
            aCopyData   += sDBName.GetToken(2, DB_DELIM);

            // Datenbankfeld draggen
            DragServer::CopyData(aCopyData.GetBuffer(), aCopyData.Len() + 1,
                                    SOT_FORMATSTR_ID_SBA_FIELDDATAEXCHANGE);
        }

        USHORT nPos;
        while ((nPos = sDBName.SearchAndReplace(DB_DELIM, '.')) != STRING_NOTFOUND);
        DragServer::CopyString(sDBName);
    }
#endif
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

BOOL  SwDBTreeList::QueryDrop( DropEvent& rEvt)
{
    return FALSE;
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.41  2000/09/18 16:05:19  willem.vandorp
    OpenOffice header added.

    Revision 1.40  2000/06/26 13:31:03  os
    new DataBase API

    Revision 1.39  2000/04/11 08:03:52  os
    UNICODE

    Revision 1.38  2000/02/11 14:44:29  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.37  1999/11/09 16:54:18  os
    #69090# default in ::Command

    Revision 1.36  1999/01/20 16:00:04  AWO
    #59398#FormatIds


      Rev 1.35   20 Jan 1999 17:00:04   AWO
   #59398#FormatIds

      Rev 1.34   21 Aug 1998 12:59:04   OM
   #55373# D&D von DB-Feldern

      Rev 1.33   07 Mar 1998 13:30:14   OM
   Alles bei Column-Umschaltung einklappen

      Rev 1.32   27 Feb 1998 18:26:26   OM
   Aufgeraeumt

      Rev 1.31   03 Feb 1998 12:21:12   OM
   #46621# HelpIDs fuer Feldbefehl-Dlg

      Rev 1.30   06 Jan 1998 18:12:02   OM
   Felbefehl-Dlg

      Rev 1.29   05 Jan 1998 17:44:54   OM
   DB-Feldbefehl bearbeiten

      Rev 1.28   15 Dec 1997 11:32:08   OM
   GetObjectName gefixt

      Rev 1.27   12 Dec 1997 10:37:44   OM
   GetObjectName angepasst

      Rev 1.26   12 Dec 1997 10:11:02   OM
   Spaltennamen nicht sortieren

      Rev 1.25   11 Dec 1997 17:01:10   OM
   Feldumstellung

      Rev 1.24   19 Nov 1997 16:33:06   OM
   Datenbank-TP Drag&Drop

      Rev 1.23   18 Nov 1997 14:34:02   OM
   Sba-Umstellung 372

      Rev 1.22   18 Nov 1997 10:35:42   OM
   Neuer Feldbefehldialog

      Rev 1.21   17 Nov 1997 14:36:32   OM
   Column-Darstellung an/abschaltbar

      Rev 1.20   10 Nov 1997 10:48:56   TJ
   GetTableName und GetQueryName durch GetObjectName ersetzt

      Rev 1.19   06 Nov 1997 17:01:50   OM
   #45188# Schriftgroesse in TreeListBox anders initialisieren

      Rev 1.18   06 Nov 1997 13:01:26   OM
   Geaenderte Datenbankauswahl

      Rev 1.17   05 Nov 1997 17:02:12   OM
   Spaltennamen anzeigen

      Rev 1.16   14 Oct 1997 14:10:34   OM
   Feldumstellung

      Rev 1.15   02 Sep 1997 09:57:10   OM
   SDB-Headeranpassung

      Rev 1.14   01 Sep 1997 13:16:04   OS
   DLL-Umstellung

      Rev 1.13   25 Aug 1997 11:53:54   OS
   368-Changes SBA

      Rev 1.12   06 Aug 1997 11:36:00   TRI
   GetpApp statt pApp

      Rev 1.11   14 Mar 1997 14:09:26   OM
   Sortierte DB-Listboxen

      Rev 1.10   11 Nov 1996 09:25:38   MA
   ResMgr

      Rev 1.9   14 Oct 1996 16:06:44   OM
   Datenbankumstellung 341c

      Rev 1.8   25 Sep 1996 14:10:44   OM
   Neue Datenbanktrenner

      Rev 1.7   03 Sep 1996 12:01:58   OM
   #30967# Fehlendes SEXPORT

      Rev 1.6   28 Aug 1996 09:18:04   OS
   includes

      Rev 1.5   14 Aug 1996 11:39:36   OM
   RequestingChilds nur bei leerem Parent

      Rev 1.4   08 Aug 1996 16:15:54   OM
   Neue Segs

      Rev 1.3   08 Aug 1996 16:15:14   OM
   Tabellen nur on demand anfordern

      Rev 1.2   05 Aug 1996 15:48:38   OM
   Neue Segs

      Rev 1.1   05 Aug 1996 15:47:52   OM
   Datenbankumstellung

      Rev 1.0   25 Jul 1996 16:35:50   OM
   Initial revision.

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/dbui/dbui.cxx b/sw/source/ui/dbui/dbui.cxx
new file mode 100644
index 0000000..46321b7
--- /dev/null
+++ b/sw/source/ui/dbui/dbui.cxx
@@ -0,0 +1,216 @@
/*************************************************************************
 *
 *  $RCSfile: dbui.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:34 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

// INCLUDE ---------------------------------------------------------------

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _LIST_HXX //autogen
#include <tools/list.hxx>
#endif
#include "wrtsh.hxx"


#include "dbui.hrc"
#include "dbui.hxx"


// STATIC DATA -----------------------------------------------------------


/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

#if 0
SwDBSelect::SwDBSelect(Window *pParent, SwWrtShell *pSh, const String& rDefDBName):

    SvxStandardDialog(pParent, SW_RES(DLG_DBSELECTION)),

    aTree           (this, SW_RES(TLB_DBLIST), rDefDBName),

    aOkBTN          (this, SW_RES(BTN_OK)),
    aCancelBTN      (this, SW_RES(BTN_CANCEL)),
    aHelpBTN        (this, SW_RES(BTN_HELP))
{
    FreeResource();

    aTree.SetSelectHdl(LINK(this, SwDBSelect, TreeSelectHdl));
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/


__EXPORT SwDBSelect::~SwDBSelect()
{
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/


void __EXPORT SwDBSelect::Apply()
{
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/


String SwDBSelect::GetDBName() const
{
    return aTree.GetDBName();
}

/*---------------------------------------------------------------------
    Beschreibung:
---------------------------------------------------------------------*/


IMPL_LINK( SwDBSelect, TreeSelectHdl, SvTreeListBox *, pBox )
{
    SvLBoxEntry* pEntry = pBox->GetCurEntry();
    if (pEntry)
        aOkBTN.Enable(aTree.GetParent(pEntry) != 0);
    return 0;
}
#endif
/*---------------------------------------------------------------------
    Beschreibung:
---------------------------------------------------------------------*/

PrintMonitor::PrintMonitor( Window *pParent, BOOL bEMail )
:   ModelessDialog( pParent, SW_RES(DLG_PRINTMONITOR) ),
    aDocName    (this, SW_RES( FT_DOCNAME )),
    aPrinting   (this, SW_RES( bEMail ? FT_SENDING : FT_PRINTING )),
    aPrinter    (this, SW_RES( FT_PRINTER       )),
    aPrintInfo  (this, SW_RES( FT_PRINTINFO     )),
    aCancel     (this, SW_RES( PB_CANCELPRNMON  ))
{
    if (bEMail)
    {
        SetText(SW_RES(STR_EMAILMON));
    }
    FreeResource();
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.15  2000/09/18 16:05:19  willem.vandorp
    OpenOffice header added.

    Revision 1.14  2000/06/26 13:31:03  os
    new DataBase API

    Revision 1.13  1999/03/08 08:56:26  MH
    chg: header


      Rev 1.12   08 Mar 1999 09:56:26   MH
   chg: header

      Rev 1.11   27 Oct 1998 12:17:08   OM
   #58132# Progress fuer Serienmailings

      Rev 1.10   09 Dec 1997 12:30:52   OM
   #45200# Serienbrief: Speichern-Monitor

      Rev 1.9   02 Sep 1997 09:57:12   OM
   SDB-Headeranpassung

      Rev 1.8   01 Sep 1997 13:16:04   OS
   DLL-Umstellung

      Rev 1.7   11 Nov 1996 09:25:38   MA
   ResMgr

      Rev 1.6   02 Oct 1996 18:00:56   MA
   Umstellung Enable/Disable

      Rev 1.5   28 Aug 1996 09:18:04   OS
   includes

      Rev 1.4   05 Aug 1996 15:47:52   OM
   Datenbankumstellung

      Rev 1.3   25 Jul 1996 16:36:26   OM
   Eigene TreeListbox fuer Datenbankauswahl

      Rev 1.2   23 Jul 1996 13:28:38   OM
   Neue Segs

      Rev 1.1   23 Jul 1996 13:26:08   OM
   Datenbank und Tabelle auswaehlen

      Rev 1.0   22 Jul 1996 11:01:52   OM
   Initial revision.

------------------------------------------------------------------------*/

diff --git a/sw/source/ui/dbui/dbui.src b/sw/source/ui/dbui/dbui.src
new file mode 100644
index 0000000..cbaf59a
--- /dev/null
+++ b/sw/source/ui/dbui/dbui.src
@@ -0,0 +1,322 @@
/*************************************************************************
 *
 *  $RCSfile: dbui.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:34 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
 // #pragma ******************************************************************

 // #include *****************************************************************
#include "dbui.hrc"
#include "helpid.h"
ModalDialog DLG_DBSELECTION
{
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 168 , 132 ) ;
    Text = "Datenbankauswahl" ;
    Text [ ENGLISH ] = "Database Selection" ;
    Moveable = TRUE ;
    Control TLB_DBLIST
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 6 , 6 ) ;
        Size = MAP_APPFONT ( 100 , 120 ) ;
    };
    OKButton BTN_OK
    {
        Pos = MAP_APPFONT ( 112 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        Disable = TRUE ;
    };
    CancelButton BTN_CANCEL
    {
        Pos = MAP_APPFONT ( 112 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    HelpButton BTN_HELP
    {
        Pos = MAP_APPFONT ( 112 , 43 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    Text [ english_us ] = "Database Selection" ;
    Text [ italian ] = "Scelta database" ;
    Text [ spanish ] = "Seleccionar base de datos" ;
    Text [ french ] = "Sélection d'une base de données" ;
    Text [ dutch ] = "Selectie database" ;
    Text [ swedish ] = "Databasurval" ;
    Text [ danish ] = "Databaseudvalg" ;
    Text [ portuguese_brazilian ] = "Datenbankauswahl" ;
    Text [ portuguese ] = "Seleccionar base de dados" ;
    Text[ chinese_simplified ] = "Ñ¡ÔñÊý¾Ý¿â";
    Text[ russian ] = "Âûáîð áàçû äàííûõ";
    Text[ polish ] = "Selekcja bazy danych";
    Text[ japanese ] = "ÃÞ°ÀÍÞ°½‚Ì‘I‘ð";
    Text[ chinese_traditional ] = "¿ï¾Ü¸ê®Æ®w";
    Text[ arabic ] = "ÇÎÊíÇÑ ÞÇÚÏÉ ÇáÈíÇäÇÊ";
    Text[ greek ] = "ÅðéëïãÞ âÜóçò äåäïìÝíùí";
    Text[ korean ] = "µ¥ÀÌÅͺ£À̽º ¼±ÅÃ";
    Text[ turkish ] = "Veritabaný seçimi";
    Text[ language_user1 ] = " ";
};
 // DLG_PRINTMONITOR ------------------------------------------------------
ModelessDialog DLG_PRINTMONITOR
{
    HelpID = HID_MERGE_PRINTMONITOR  ;
    SVLOOK = TRUE ;
    HIDE = TRUE ;
    OUTPUTSIZE = TRUE ;
    _WHMAPMODE = MAP_APPFONT ;
    _WIDTH = 118 ;
    _HEIGHT = 72 ;
    MOVEABLE = TRUE ;
    APP = FALSE ;
    Text [ english ] = "Save Monitor" ;
    Text = "Speichern-Monitor" ;
    FixedText FT_DOCNAME
    {
        HIDE = FALSE ;
        _XYMAPMODE = MAP_APPFONT ;
        _X = 6 ;
        _Y = 6 ;
        _WHMAPMODE = MAP_APPFONT ;
        _WIDTH = 100 ;
        _HEIGHT = 8 ;
        TEXT = "" ;
        LEFT = FALSE ;
        CENTER = TRUE ;
        RIGHT = FALSE ;
    };
    FixedText FT_PRINTING
    {
        HIDE = FALSE ;
        _XYMAPMODE = MAP_APPFONT ;
        _X = 6 ;
        _Y = 17 ;
        _WHMAPMODE = MAP_APPFONT ;
        _WIDTH = 100 ;
        _HEIGHT = 8 ;
        TEXT = "wird ausgegeben als" ;
        TEXT [ English ] = "is being printed as" ;
        LEFT = FALSE ;
        CENTER = TRUE ;
        RIGHT = FALSE ;
        Text [ english_us ] = "is being printed on" ;
        Text [ portuguese_brazilian ] = "está sendo impresso na" ;
        Text [ swedish ] = "skrivs ut på" ;
        Text [ danish ] = "udskrives som" ;
        Text [ italian ] = "viene stampato su" ;
        Text [ spanish ] = "se está imprimiendo en" ;
        Text [ french ] = "en cours d'impression sur" ;
        Text [ dutch ] = "wordt afgedrukt als" ;
        Text [ portuguese ] = "está a ser impresso na" ;
        Text[ chinese_simplified ] = "Êä³öÖÁ";
        Text[ russian ] = "Áóäåò íàïå÷àòàíî êàê";
        Text[ polish ] = "zostanie wydrukowany jako";
        Text[ japanese ] = "ˆóü’†";
        Text[ chinese_traditional ] = "¿é¥X¦Ü";
        Text[ arabic ] = "íÊã ØÈÇÚÊå ßÜ";
        Text[ greek ] = "åêôõðþíåôáé ùò";
        Text[ korean ] = "Ãâ·Â Çü½Ä";
        Text[ turkish ] = "Çýktý türü";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_SENDING
    {
        HIDE = FALSE ;
        _XYMAPMODE = MAP_APPFONT ;
        _X = 6 ;
        _Y = 17 ;
        _WHMAPMODE = MAP_APPFONT ;
        _WIDTH = 100 ;
        _HEIGHT = 8 ;
        TEXT = "wird versandt an" ;
        TEXT [ English ] = "is being send at" ;
        LEFT = FALSE ;
        CENTER = TRUE ;
        RIGHT = FALSE ;
        TEXT[ italian ] = "viene inviato a";
        TEXT[ portuguese_brazilian ] = "is being send at";
        TEXT[ portuguese ] = "está a ser enviado para";
        TEXT[ danish ] = "bliver sendt til";
        TEXT[ french ] = "est en cours d'envoi à";
        TEXT[ swedish ] = "skickas till";
        TEXT[ dutch ] = "wordt verzonden aan";
        TEXT[ spanish ] = "se envía a";
        TEXT[ english_us ] = "is being send to";
        TEXT[ chinese_simplified ] = "¼Ä·¢¸ø";
        TEXT[ russian ] = "Áóäåò îòïðàâëåíî";
        TEXT[ polish ] = "zostanie przes³any do";
        TEXT[ japanese ] = "ˆ¶æ‚É‘—M’†";
        TEXT[ chinese_traditional ] = "±Hµoµ¹";
        TEXT[ arabic ] = "íÊã ÅÑÓÇáå Åáì";
        TEXT[ greek ] = "áðïóôÝëëåôáé ðñïò";
        TEXT[ korean ] = "Àü¼Û ´ë»ó";
        TEXT[ turkish ] = "Alýcý";
        TEXT[ language_user1 ] = " ";
    };
    FixedText FT_PRINTER
    {
        HIDE = FALSE ;
        _XYMAPMODE = MAP_APPFONT ;
        _X = 6 ;
        _Y = 28 ;
        _WHMAPMODE = MAP_APPFONT ;
        _WIDTH = 100 ;
        _HEIGHT = 8 ;
        TEXT = "" ;
        LEFT = FALSE ;
        CENTER = TRUE ;
        RIGHT = FALSE ;
    };
    FixedText FT_PRINTINFO
    {
        HIDE = FALSE ;
        _XYMAPMODE = MAP_APPFONT ;
        _X = 6 ;
        _Y = 39 ;
        _WHMAPMODE = MAP_APPFONT ;
        _WIDTH = 100 ;
        _HEIGHT = 8 ;
        TEXT = "" ;
        LEFT = FALSE ;
        CENTER = TRUE ;
        RIGHT = FALSE ;
    };
    CancelButton PB_CANCELPRNMON
    {
        HIDE = FALSE ;
        _XYMAPMODE = MAP_APPFONT ;
        _X = 31 ;
        _Y = 52 ;
        _WHMAPMODE = MAP_APPFONT ;
        _WIDTH = 50 ;
        _HEIGHT = 14 ;
        TABSTOP = TRUE ;
    };
    String STR_EMAILMON
    {
        Text [ english ] = "Send Monitor" ;
        Text = "Versenden-Monitor" ;
        Text[ italian ] = "Invia monitor";
        Text[ portuguese_brazilian ] = "Send Monitor";
        Text[ portuguese ] = "Enviar - Monitor";
        Text[ danish ] = "Send-monitor";
        Text[ french ] = "Moniteur d'envoi";
        Text[ swedish ] = "Skicka monitor";
        Text[ dutch ] = "Monitor verzenden";
        Text[ spanish ] = "Enviar-Monitor";
        Text[ english_us ] = "Send-Monitor";
        Text[ chinese_simplified ] = "¼Ä·¢-¼àÊÓÆ÷";
        Text[ russian ] = "Îòïðàâêà òåêóùåãî èçîáðàæåíèÿ";
        Text[ polish ] = "Pokaz stanu przesy³ania";
        Text[ japanese ] = "‘—MÓÆÀ°";
        Text[ chinese_traditional ] = "±Hµo-ºÊµø¾¹";
        Text[ arabic ] = "ãÑÇÞÈ ÇáÅÑÓÇá";
        Text[ greek ] = "ÁðïóôïëÞ-Ïèüíç";
        Text[ korean ] = "Àü¼Û ¸ð´ÏÅÍ";
        Text[ turkish ] = "Gönderme ekraný";
        Text[ language_user1 ] = " ";
    };
    Text [ portuguese ] = "Monitor de impressão" ;
    Text [ english_us ] = "Print monitor" ;
    Text [ portuguese_brazilian ] = "O monitor de impressão" ;
    Text [ swedish ] = "Skriv ut skärmbild" ;
    Text [ danish ] = "Gem-monitor" ;
    Text [ italian ] = "Controllo stampa" ;
    Text [ spanish ] = "Monitor de impresión" ;
    Text [ french ] = "Moniteur d'impression" ;
    Text [ dutch ] = "Opslaan-monitor" ;
    Text[ chinese_simplified ] = "´òÓ¡¼àÊÓ";
    Text[ russian ] = "Ñîõðàíåíèå òåêóùåãî èçîáðàæåíèÿ";
    Text[ polish ] = "Pokaz stanu zapisu";
    Text[ japanese ] = "ÒÓØ ÓÆÀ°";
    Text[ chinese_traditional ] = "¦C¦LºÊµø";
    Text[ arabic ] = "ãÑÇÞÈ ÇáÍÝÙ";
    Text[ language_user1 ] = " ";
    Text[ greek ] = "ÁðïèÞêåõóç-Ïèüíç";
    Text[ korean ] = "ÀúÀå ¸ð´ÏÅÍ";
    Text[ turkish ] = "Yazdýrma ekraný";
};

String STR_DB_EMAIL
{
    TEXT = "E-Mail" ;
    TEXT [ English ] = "E-mail" ;
    Text [ english_us ] = "E-mail" ;
    Text[ italian ] = "eMail";
    Text[ portuguese_brazilian ] = "E-mail";
    Text[ portuguese ] = "E-mail";
    Text[ danish ] = "E-mail";
    Text[ french ] = "E-mail";
    Text[ swedish ] = "E-post";
    Text[ dutch ] = "E-mail";
    Text[ spanish ] = "E-mail";
    Text[ chinese_simplified ] = "µç×ÓÓʼþ";
    Text[ russian ] = "Ýëåêòðîííàÿ ïî÷òà";
    Text[ polish ] = "e-mail";
    Text[ japanese ] = "E-mail";
    Text[ chinese_traditional ] = "¹q¤l¶l¥ó";
    Text[ arabic ] = "ÈÑíÏ ÅáßÊÑæäí";
    Text[ greek ] = "E-mail";
    Text[ korean ] = "ÀüÀÚ¿ìÆí";
    Text[ turkish ] = "E-posta";
    Text[ language_user1 ] = " ";
};
diff --git a/sw/source/ui/dbui/makefile.mk b/sw/source/ui/dbui/makefile.mk
new file mode 100644
index 0000000..07244f2
--- /dev/null
+++ b/sw/source/ui/dbui/makefile.mk
@@ -0,0 +1,107 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:34 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=..$/..$/..

PRJNAME=sw
TARGET=dbui

AUTOSEG=true

PROJECTPCH=ui_pch
PDBTARGET=ui_pch
PROJECTPCHSOURCE=..\ui_1st\ui_pch

# --- Settings -----------------------------------------------------

.INCLUDE :  $(PRJ)$/inc$/swpre.mk
.INCLUDE :  settings.mk
.INCLUDE :  $(PRJ)$/inc$/sw.mk

# --- Files --------------------------------------------------------

CXXFILES = \
        dbinsdlg.cxx \
        dbmgr.cxx \
        dbtree.cxx \
        dbui.cxx

SRCFILES =  \
        dbinsdlg.src	\
        dbtree.src	\
        dbui.src

SLOFILES =  \
        $(SLO)$/dbinsdlg.obj \
        $(SLO)$/dbmgr.obj \
        $(SLO)$/dbtree.obj \
        $(SLO)$/dbui.obj

EXCEPTIONSFILES= \
        $(SLO)$/dbinsdlg.obj \
        $(SLO)$/dbmgr.obj \
        $(SLO)$/dbtree.obj \

# --- Tagets -------------------------------------------------------

.INCLUDE :  target.mk

diff --git a/sw/source/ui/dialog/abstract.cxx b/sw/source/ui/dialog/abstract.cxx
new file mode 100644
index 0000000..b914883
--- /dev/null
+++ b/sw/source/ui/dialog/abstract.cxx
@@ -0,0 +1,144 @@
/*************************************************************************
 *
 *  $RCSfile: abstract.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:34 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "swtypes.hxx"
#include "hintids.hxx"

#include "dialog.hrc"
#include "abstract.hxx"
#include "abstract.hrc"


/*-----------------22.02.97 15.32-------------------

--------------------------------------------------*/

SwInsertAbstractDlg::SwInsertAbstractDlg( Window* pParent ) :
    SfxModalDialog(pParent, SW_RES(DLG_INSERT_ABSTRACT)),
    aGB     (this, ResId(GB_1       )),
    aParaFT (this, ResId(FT_PARA    )),
    aParaNF (this, ResId(NF_PARA    )),
    aLevelFT(this, ResId(FT_LEVEL   )),
    aLevelNF(this, ResId(NF_LEVEL   )),
    aDescFT (this, ResId(FT_DESC    )),
    aOkPB   (this, ResId(PB_OK      )),
    aCancelPB (this, ResId(PB_CANCEL    )),
    aHelpPB (this, ResId(PB_HELP    ))
{
    FreeResource();
}

/*-----------------22.02.97 15.32-------------------

--------------------------------------------------*/

SwInsertAbstractDlg::~SwInsertAbstractDlg()
{
}

/*-----------------22.02.97 15.34-------------------

--------------------------------------------------*/

BYTE SwInsertAbstractDlg::GetLevel() const
{
    return aLevelNF.GetValue() - 1;
}
/*-----------------22.02.97 15.34-------------------

--------------------------------------------------*/

BYTE SwInsertAbstractDlg::GetPara() const
{
    return (BYTE) aParaNF.GetValue();
}



/*************************************************************************

      $Log: not supported by cvs2svn $
      Revision 1.4  2000/09/18 16:05:19  willem.vandorp
      OpenOffice header added.

      Revision 1.3  1997/11/03 12:12:26  MA
      precomp entfernt


      Rev 1.2   03 Nov 1997 13:12:26   MA
   precomp entfernt

      Rev 1.1   23 May 1997 10:09:12   OS
   Ableitung von SfxModalDialog

      Rev 1.0   22 Feb 1997 20:18:04   OS
   Initial revision.


*************************************************************************/



diff --git a/sw/source/ui/dialog/abstract.hrc b/sw/source/ui/dialog/abstract.hrc
new file mode 100644
index 0000000..1a5f245
--- /dev/null
+++ b/sw/source/ui/dialog/abstract.hrc
@@ -0,0 +1,70 @@
/*************************************************************************
 *
 *  $RCSfile: abstract.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:34 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#define GB_1                1
#define FT_PARA             2
#define NF_PARA             3
#define FT_LEVEL            4
#define NF_LEVEL            5
#define FT_DESC             6
#define PB_OK               7
#define PB_CANCEL           8
#define PB_HELP             9
diff --git a/sw/source/ui/dialog/abstract.src b/sw/source/ui/dialog/abstract.src
new file mode 100644
index 0000000..1a405c3
--- /dev/null
+++ b/sw/source/ui/dialog/abstract.src
@@ -0,0 +1,258 @@
/*************************************************************************
 *
 *  $RCSfile: abstract.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:34 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#include "dialog.hrc"
#include "helpid.h"
#include "abstract.hrc"

ModalDialog DLG_INSERT_ABSTRACT
{
    HelpID = HID_INSERT_ABSTRACT ;
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 239 , 68 ) ;
    /* ### ACHTUNG: Neuer Text in Resource? AutoAbstract erzeugen : AutoAbstrakt erzeugen */
    /* ### ACHTUNG: Neuer Text in Resource? AutoAbstract erzeugen : AutoAbstrakt erzeugen */
    /* ### ACHTUNG: Neuer Text in Resource? AutoAbstract erzeugen : AutoAbstrakt erzeugen */
    Text = "AutoAbstract erzeugen" ;
    Text [ English ] = "Create abstract" ;
    Moveable = TRUE ;
    GroupBox GB_1
    {
        OutputSize = TRUE ;
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 174 , 62 ) ;
        Text = "Eigenschaften" ;
        Text [ English ] = "Properties" ;
        Text [ english_us ] = "Properties" ;
        Text [ portuguese_brazilian ] = "Eigenschaften" ;
        Text [ swedish ] = "Egenskaper" ;
        Text [ danish ] = "Egenskaber" ;
        Text [ italian ] = "Proprietà" ;
        Text [ spanish ] = "Propiedades" ;
        Text [ french ] = "Propriétés" ;
        Text [ dutch ] = "Eigenschappen" ;
        Text [ portuguese ] = "Propriedades" ;
        Text[ chinese_simplified ] = "ÊôÐÔ";
        Text[ russian ] = "Ñâîéñòâà";
        Text[ polish ] = "W³aœciwoœci";
        Text[ japanese ] = "ÌßÛÊßè";
        Text[ chinese_traditional ] = "ÄÝ©Ê";
        Text[ arabic ] = "ÎÕÇÆÕ";
        Text[ dutch ] = "Eigenschappen";
        Text[ chinese_simplified ] = "ÊôÐÔ";
        Text[ greek ] = "Éäéüôçôåò";
        Text[ korean ] = "µî·ÏÁ¤º¸";
        Text[ turkish ] = "Özellikler";
    };
    FixedText FT_LEVEL
    {
        Pos = MAP_APPFONT ( 12 , 12 ) ;
        Size = MAP_APPFONT ( 120 , 8 ) ;
        Text = "Einbezogene Kapitelebenen" ;
        Text [ English ] = "Included outline levels" ;
        Text [ english_us ] = "Included outline levels" ;
        Text [ portuguese_brazilian ] = "Einbezogene Kapitelebenen" ;
        Text [ swedish ] = "Inkluderade kapitelnivåer" ;
        Text [ danish ] = "Inkluderede kapitelniveauer" ;
        Text [ italian ] = "Livelli di capitolo inclusi" ;
        Text [ spanish ] = "Niveles del capítulo incluidos" ;
        Text [ french ] = "Niveaux de plan à inclure" ;
        Text [ dutch ] = "Aantal overzichtsniveau's" ;
        Text [ portuguese ] = "Níveis de capítulo incluídos" ;
        Text[ chinese_simplified ] = "°üº¬µÄÕ½ڴó¸Ù¼¶";
        Text[ russian ] = "Âêëþ÷åííûå óðîâíè ðàçäåëîâ";
        Text[ polish ] = "W³¹cznie z poziomami rozdzia³u";
        Text[ japanese ] = "ŠY“–‚·‚é±³Äײ݂ÌÚÍÞÙ";
        Text[ chinese_traditional ] = "¥]§tªº³¹¸`¤jºõ";
        Text[ arabic ] = "ãÓÊæíÇÊ ÇáÝÕá ÇáãÖãäÉ";
        Text[ dutch ] = "Aantal overzichtsniveau's";
        Text[ chinese_simplified ] = "°üº¬µÄÕ½ڴó¸Ù¼¶";
        Text[ greek ] = "Óõìðåñéëáìâáíüìåíá åðßðåäá êåöáëáßùí";
        Text[ korean ] = "°³¿ä¼öÁØÀÌ Æ÷ÇԵǾú½À´Ï´Ù.";
        Text[ turkish ] = "Dahil edilen bölüm düzeyleri";
    };
    NumericField NF_LEVEL
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 153 , 12 ) ;
        Size = MAP_APPFONT ( 24 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 1 ;
        Maximum = 5 ;
        Value = 3 ;
        First = 1 ;
        Last = 5 ;
    };
    FixedText FT_PARA
    {
        Pos = MAP_APPFONT ( 12 , 27 ) ;
        Size = MAP_APPFONT ( 120 , 8 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? Absätze je Kapitel : Absõtze je Kapitel */
        Text = "Absätze je Kapitel" ;
        Text [ English ] = "Paragraphs per Outline" ;
        Text [ english_us ] = "Subpoints per level" ;
        Text [ portuguese_brazilian ] = "Absätze je Kapitel" ;
        Text [ swedish ] = "Stycken per kapitel" ;
        Text [ danish ] = "Afsnit per kapitel" ;
        Text [ italian ] = "Paragrafi per capitolo" ;
        Text [ spanish ] = "Párrafos por capítulo" ;
        Text [ french ] = "Nbre resp. de paragraphes" ;
        Text [ dutch ] = "Alinea's per kop" ;
        Text [ portuguese ] = "Parágrafos por capítulo" ;
        Text[ chinese_simplified ] = "ÿÕ½ڰüº¬µÄ¶ÎÂä";
        Text[ russian ] = "Àáçàöåâ â ãëàâå";
        Text[ polish ] = "Akapity w rozdziale";
        Text[ japanese ] = "Í‚²‚Ƃ̒i—Ž";
        Text[ chinese_traditional ] = "¨C³¹¸`¥]§tªº¬q¸¨";
        Text[ arabic ] = "ÝÞÑÇÊ Ýí ßá ÝÕá";
        Text[ dutch ] = "Alinea's per kop";
        Text[ chinese_simplified ] = "ÿÕ½ڰüº¬µÄ¶ÎÂä";
        Text[ greek ] = "ÐáñÜãñáöïé áíÜ êåöÜëáéï";
        Text[ korean ] = "·¹º§´ç ¼­ºêÆ÷ÀÎÆ®";
        Text[ turkish ] = "Beher bölüm paragraf sayýsý";
    };
    NumericField NF_PARA
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 153 , 27 ) ;
        Size = MAP_APPFONT ( 24 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 1 ;
        Maximum = 5 ;
        Value = 1 ;
        First = 1 ;
        Last = 5 ;
    };
    FixedText FT_DESC
    {
        Pos = MAP_APPFONT ( 12 , 43 ) ;
        Size = MAP_APPFONT ( 165 , 16 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? Im Abstrakt erscheint die ausgewählte Anzahl von Absätzen aus den einbezogenen Kapitelebenen. : Im Abstrakt erscheint die ausgewõhlte Anzahl von Absõtzen aus den einbezogenen Kapitelebenen. */
        Text = "Im Abstrakt erscheint die ausgewählte Anzahl von Absätzen aus den einbezogenen Kapitelebenen." ;
        Text [ English ] = "The selected number of paragraphs of the included outline levels will be used to create the summary." ;
        WordBreak = TRUE ;
        Text [ english_us ] = "The abstract contains the selected number of paragraphs from the included outline levels." ;
        Text [ portuguese_brazilian ] = "Im Abstrakt erscheint die ausgewählte Anzahl von Absätzen aus den einbezogenen Kapitelebenen." ;
        Text [ swedish ] = "Utdraget innehåller det utvalda antalet stycken från de inkluderade kapitelnivåerna." ;
        Text [ danish ] = "Abstractet indeholder det valgte antal afsnit fra de inkluderede kapitelniveauer." ;
        Text [ italian ] = "Il sunto contiene il numero di paragrafi scelto dai livelli di capitolo inclusi." ;
        Text [ spanish ] = "En el extracto aparece la cantidad deseada de párrafos de los niveles de los capítulos incluidos." ;
        Text [ french ] = "La synthèse reprendra, pour chaque niveau de plan inclus, le nombre de paragraphes indiqué." ;
        Text [ dutch ] = "In het extract verschijnt het geselecteerde aantal alinea´s van de erbij betrokken overzichtsniveaus." ;
        Text [ portuguese ] = "O Abstracto contém a quantidade de parágrafos seleccionada dos níveis de capítulos incluídos." ;
        Text[ chinese_simplified ] = "´Ó°üÀ¨µÄÕ½ڼ¶ÖÐÑ¡³öµÄÒ»¶¨ÊýÄ¿µÄ¶ÎÂäÏÔʾÔÚÕªÒªÖС£";
        Text[ russian ] = " Ïðîñìîòðå ïîÿâèòñÿ âûáðàííîå ÷èñëî àáçàöåâ èç âêëþ÷åííûõ óðîâíåé ãëàâ";
        Text[ polish ] = "Abstrakt zawiera wybran¹ iloœæ akapitów z awieraj¹cych w³¹czone poziomy akapitu.";
        Text[ japanese ] = "—v–ñ‚ɂ́AŠY“–‚·‚é±³Äײ݂ÌÚÍÞق©‚ç‘I‘ð‚³‚ê‚½’i—Ž‚Ì”‚ª•\\ަ‚³‚ê‚Ü‚·B";
        Text[ chinese_traditional ] = "ºK­n¼Ò¦¡Åã¥Ü¬ÛÃö³¹¸`¤¤¿ï¨úªº¤@©w¼Æ¥Øªº¬q¸¨";
        Text[ arabic ] = "ÓæÝ íÙåÑ Ýí ÇáÊáÎíÕ ÚÏÏ ÇáÝÞÑÇÊ ÇáÊí Êã ÊÍÏíÏåÇ ãä Èíä ãÓÊæíÇÊ ÇáÝÕæá ÇáãÖãäÉ.";
        Text[ dutch ] = "In het extract verschijnt het geselecteerde aantal alinea´s van de erbij betrokken overzichtsniveaus.";
        Text[ chinese_simplified ] = "´Ó°üÀ¨µÄÕ½ڼ¶ÖÐÑ¡³öµÄÒ»¶¨ÊýÄ¿µÄ¶ÎÂäÏÔʾÔÚÕªÒªÖС£";
        Text[ greek ] = "Óôï Abstract åìöáíßæåôáé ôï åðéëåãìÝíï ðëÞèïò ðáñáãñÜöùí áðü ôá óõìðåñéëáìâáíüìåíá åðßðåäá êåöáëáßùí.";
        Text[ korean ] = "Ã߻󿡼­´Â ¿¬°üµÈ °³¿ä ·¹º§¿¡¼­ ¼±ÅÃÇÑ ´Ü¶ôÀÇ ¼ö°¡ ³ªÅ¸³³´Ï´Ù.";
        Text[ turkish ] = "Özet içinde, dahil edilen bölüm düzeylerinden seçilen paragraflar bulunuyor.";
    };
    OKButton PB_OK
    {
        Pos = MAP_APPFONT ( 186 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        DefButton = TRUE ;
    };
    CancelButton PB_CANCEL
    {
        Pos = MAP_APPFONT ( 186 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    HelpButton PB_HELP
    {
        Pos = MAP_APPFONT ( 186 , 43 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    Text [ english_us ] = "Create AutoAbstract" ;
    Text [ portuguese_brazilian ] = "AutoAbstrakt erzeugen" ;
    Text [ swedish ] = "Skapa AutoUtdrag" ;
    Text [ danish ] = "Opret AutoAbstract" ;
    Text [ italian ] = "Crea un sommario automatico" ;
    Text [ spanish ] = "Crear abstracto automático" ;
    Text [ french ] = "Création d'une AutoSynthèse" ;
    Text [ dutch ] = "AutoExtract maken" ;
    Text [ portuguese ] = "Criar AutoAbstracto" ;
    Text[ chinese_simplified ] = "Éú³É×Ô¶¯ÕªÒª";
    Text[ russian ] = "Ñîçäàòü Àâòîðåôåðàò";
    Text[ polish ] = "Utwórz AutoAbstract ";
    Text[ japanese ] = "Ž©“®’Šo‚̍쐬";
    Text[ chinese_traditional ] = "¥Í¦¨¦Û°ÊºK­n";
    Text[ arabic ] = "ÅäÔÇÁ ÊáÎíÕ ÊáÞÇÆí";
    Text[ dutch ] = "AutoExtract maken";
    Text[ chinese_simplified ] = "Éú³É×Ô¶¯ÕªÒª";
    Text[ greek ] = "Äçìéïõñãßá AutoAbstract";
    Text[ korean ] = "ÀÚµ¿ Ãß»ó ¸¸µé±â";
    Text[ turkish ] = "Otomatik özet oluþtur";
};
diff --git a/sw/source/ui/dialog/addrdlg.cxx b/sw/source/ui/dialog/addrdlg.cxx
new file mode 100644
index 0000000..ff7b1a4
--- /dev/null
+++ b/sw/source/ui/dialog/addrdlg.cxx
@@ -0,0 +1,175 @@
/*************************************************************************
 *
 *  $RCSfile: addrdlg.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:34 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SVX_OPTGENRL_HXX //autogen
#include <svx/optgenrl.hxx>
#endif

#include "addrdlg.hxx"


/****************************************************************************
Ctor
****************************************************************************/


SwAddrDlg::SwAddrDlg(Window* pParent, SfxItemSet& rSet ) :

    SfxSingleTabDialog(pParent, rSet, 0)

{
    // TabPage erzeugen
    SvxGeneralTabPage* pPage = (SvxGeneralTabPage*) SvxGeneralTabPage::Create(this, rSet);
    SetTabPage(pPage);
}

/****************************************************************************
Dtor
****************************************************************************/


__EXPORT SwAddrDlg::~SwAddrDlg()
{
}

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/ui/dialog/addrdlg.cxx,v 1.1.1.1 2000-09-18 17:14:34 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.10  2000/09/18 16:05:20  willem.vandorp
      OpenOffice header added.

      Revision 1.9  1997/11/25 09:43:20  MA
      includes


      Rev 1.8   25 Nov 1997 10:43:20   MA
   includes

      Rev 1.7   03 Nov 1997 13:12:26   MA
   precomp entfernt

      Rev 1.6   16 Jul 1997 16:26:50   TRI
   mit __EXPORT gehts viel besser

      Rev 1.5   15 Jul 1997 14:48:12   OS
   HideExtra entfernt

      Rev 1.4   28 Aug 1996 10:10:00   OS
   includes

      Rev 1.3   04 Jul 1996 09:03:38   SWG
   include svfield - Workaround wg. optgenrl.hxx

      Rev 1.2   24 Nov 1995 16:58:16   OM
   PCH->PRECOMPILED

      Rev 1.1   27 Jul 1995 18:20:56   OS
   HideExtras jetzt aktiv

      Rev 1.0   26 Jul 1995 19:20:02   OS
   Initial revision.

*************************************************************************/

































diff --git a/sw/source/ui/dialog/ascfldlg.cxx b/sw/source/ui/dialog/ascfldlg.cxx
new file mode 100644
index 0000000..38b03b2
--- /dev/null
+++ b/sw/source/ui/dialog/ascfldlg.cxx
@@ -0,0 +1,682 @@
/*************************************************************************
 *
 *  $RCSfile: ascfldlg.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:34 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif


#ifndef _RTL_TEXTENC_H //autogen wg. rtl_TextEncoding
#include <rtl/textenc.h>
#endif


#ifndef _UNO_LINGU_HXX
#include <svx/unolingu.hxx>
#endif

#ifndef _SFX_PRINTER_HXX
#include <sfx2/printer.hxx>
#endif
#ifndef _SVX_FLSTITEM_HXX //autogen wg. SvxFontListItem
#include <svx/flstitem.hxx>
#endif
#ifndef _SVX_DLGUTIL_HXX //autogen wg. GetLanguageString
#include <svx/dlgutil.hxx>
#endif
#ifndef _SVX_FONTITEM_HXX //autogen wg. SvxFontItem
#include <svx/fontitem.hxx>
#endif
#ifndef _SVX_LANGITEM_HXX //autogen wg. SvxLanguageItem
#include <svx/langitem.hxx>
#endif

#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _ASCFLDLG_HXX
#include <ascfldlg.hxx>
#endif
#ifndef _SHELLIO_HXX
#include <shellio.hxx>
#endif
#ifndef _SWDOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _ERRHDL_HXX
#include <errhdl.hxx>
#endif

#ifndef _DIALOG_HRC
#include <dialog.hrc>
#endif
#ifndef _ASCFLDLG_HRC
#include <ascfldlg.hrc>
#endif

using namespace ::com::sun::star;

const sal_Unicode cDialogExtraDataClose = '}';
const char __FAR_DATA sDialogImpExtraData[] = "EncImpDlg:{";
const char __FAR_DATA sDialogExpExtraData[] = "EncExpDlg:{";
const USHORT nDialogExtraDataLen = 11;      // 12345678901

// in the resource exist an equal list - only with the names!
static rtl_TextEncoding aCharSetArr[] = {
        RTL_TEXTENCODING_MS_1252,           // Western (Window-1252/WinLatin 1)
        RTL_TEXTENCODING_APPLE_ROMAN,       // Western (Apple Macintosh)
        RTL_TEXTENCODING_IBM_850,           // Western (DOS/OS2-850/International)
        RTL_TEXTENCODING_IBM_437,           // Western (DOS/OS2-437/US)
        RTL_TEXTENCODING_IBM_860,           // Western (DOS/OS2-860/Portugese)
        RTL_TEXTENCODING_IBM_861,           // Western (DOS/OS2-861/Icelandic)
        RTL_TEXTENCODING_IBM_863,           // Western (DOS/OS2-863/Canadian-French)
        RTL_TEXTENCODING_IBM_865,           // Western (DOS/OS2-865/Nordic)
        RTL_TEXTENCODING_ASCII_US,          // Western (ASCII/US)
        RTL_TEXTENCODING_ISO_8859_1,        // Western (ISO-8859-1)
        RTL_TEXTENCODING_ISO_8859_2,        // Central European (ISO-8859-2)
        RTL_TEXTENCODING_ISO_8859_3,        // Latin 3 (ISO-8859-3)
        RTL_TEXTENCODING_ISO_8859_4,        // Baltic (ISO-8859-4)
        RTL_TEXTENCODING_ISO_8859_5,        // Cyrillic (ISO-8859-5)
//      RTL_TEXTENCODING_ISO_8859_6,        // Arabic (ISO-8859-6)
        RTL_TEXTENCODING_ISO_8859_7,        // Greek (ISO-8859-7)
//      RTL_TEXTENCODING_ISO_8859_8,        // Hebrew (ISO-8859-8)
        RTL_TEXTENCODING_ISO_8859_9,        // Turkish (ISO-8859-9)
        RTL_TEXTENCODING_ISO_8859_14,       // Western (ISO-8859-14)
        RTL_TEXTENCODING_ISO_8859_15,       // Western (ISO-8859-15/EURO)
        RTL_TEXTENCODING_IBM_737,           // Greek (DOS/OS2-737)
        RTL_TEXTENCODING_IBM_775,           // Baltic (DOS/OS2-775)
        RTL_TEXTENCODING_IBM_852,           // Central European (DOS/OS2-852)
        RTL_TEXTENCODING_IBM_855,           // Cyrillic (DOS/OS2-855)
        RTL_TEXTENCODING_IBM_857,           // Turkish (DOS/OS2-857)
//      RTL_TEXTENCODING_IBM_862,           // Hebrew (DOS/OS2-862)
//      RTL_TEXTENCODING_IBM_864,           // Arabic (DOS/OS2-864)
        RTL_TEXTENCODING_IBM_866,           // Cyrillic (DOS/OS2-866/Russian)
        RTL_TEXTENCODING_IBM_869,           // Greek (DOS/OS2-869/Modern)
//      RTL_TEXTENCODING_MS_874,            // Thai (Dos/Windows-874)
        RTL_TEXTENCODING_MS_1250,           // Central European (Windows-1250/WinLatin 2)
        RTL_TEXTENCODING_MS_1251,           // Cyrillic (Windows-1251)
        RTL_TEXTENCODING_MS_1253,           // Greek (Windows-1253)
        RTL_TEXTENCODING_MS_1254,           // Turkish (Windows-1254)
//      RTL_TEXTENCODING_MS_1255,           // Hebrew (Windows-1255)
//      RTL_TEXTENCODING_MS_1256,           // Arabic (Windows-1256)
        RTL_TEXTENCODING_MS_1257,           // Baltic (Windows-1257)
//      RTL_TEXTENCODING_MS_1258,           // Vietnamese (Windows-1258)
//      RTL_TEXTENCODING_APPLE_ARABIC,      // Arabic (Apple Macintosh)
        RTL_TEXTENCODING_APPLE_CENTEURO,    // Central European (Apple Macintosh)
        RTL_TEXTENCODING_APPLE_CROATIAN,    // Central European (Apple Macintosh/Croatian)
        RTL_TEXTENCODING_APPLE_CYRILLIC,    // Cyrillic (Apple Macintosh)
//      RTL_TEXTENCODING_APPLE_DEVANAGARI,  // APPLE DEVANAGARI
//      RTL_TEXTENCODING_APPLE_FARSI,       // APPLE FARSI
        RTL_TEXTENCODING_APPLE_GREEK,       // Greek (Apple Macintosh)
//      RTL_TEXTENCODING_APPLE_GUJARATI,    // APPLE GUJARATI
//      RTL_TEXTENCODING_APPLE_GURMUKHI,    // APPLE GURMUKHI
//      RTL_TEXTENCODING_APPLE_HEBREW,      // Hebrew (Apple Macintosh)
        RTL_TEXTENCODING_APPLE_ICELAND,     // Western (Apple Macintosh/Icelandic)
        RTL_TEXTENCODING_APPLE_ROMANIAN,    // Central European (Apple Macintosh/Romanian)
//      RTL_TEXTENCODING_APPLE_THAI,        // Thai (Apple Macintosh)
        RTL_TEXTENCODING_APPLE_TURKISH,     // Turkish (Apple Macintosh)
        RTL_TEXTENCODING_APPLE_UKRAINIAN,   // Cyrillic (Apple Macintosh/Ukrainian)
        RTL_TEXTENCODING_APPLE_CHINSIMP,    // Chinese Simplified (Apple Macintosh)
        RTL_TEXTENCODING_APPLE_CHINTRAD,    // Chinese Traditional (Apple Macintosh)
        RTL_TEXTENCODING_APPLE_JAPANESE,    // Japanese (Apple Macintosh)
        RTL_TEXTENCODING_APPLE_KOREAN,      // Korean (Apple Macintosh)
        RTL_TEXTENCODING_MS_932,            // Japanese (Windows-932)
        RTL_TEXTENCODING_MS_936,            // Chinese Simplified (Windows-936)
        RTL_TEXTENCODING_MS_949,            // Korean (Windows-949)
        RTL_TEXTENCODING_MS_950,            // Chinese Traditional (Windows-950)
        RTL_TEXTENCODING_SHIFT_JIS,         // Japanese (Shift-JIS)
        RTL_TEXTENCODING_GB_2312,           // Chinese Simplified (GB-2312)
        RTL_TEXTENCODING_GBT_12345,         // Chinese Traditional (GBT-12345)
        RTL_TEXTENCODING_GBK,               // Chinese Simplified (GBK/GB-2312-80)
        RTL_TEXTENCODING_BIG5,              // Chinese Traditional (BIG5)
//      RTL_TEXTENCODING_EUC_JP,            // Japanese (EUC-JP)
        RTL_TEXTENCODING_EUC_CN,            // Chinese Simplified (EUC-CN)
//      RTL_TEXTENCODING_EUC_TW,            // Chinese Traditional (EUC-TW)
//      RTL_TEXTENCODING_ISO_2022_JP,       // Japanese (ISO-2022-JP)
//      RTL_TEXTENCODING_ISO_2022_CN,       // Chinese Simplified (ISO-2022-CN)
        RTL_TEXTENCODING_KOI8_R,            // Cyrillic (KOI8-R)
        RTL_TEXTENCODING_UTF7,              // Unicode (UTF-7)
        RTL_TEXTENCODING_UTF8,              // Unicode (UTF-8)
        RTL_TEXTENCODING_ISO_8859_10,       // Central European (ISO-8859-10)
        RTL_TEXTENCODING_ISO_8859_13,       // Central European (ISO-8859-13)
        RTL_TEXTENCODING_EUC_KR,            // Korean (EUC-KR)
//      RTL_TEXTENCODING_ISO_2022_KR,       // Korean (ISO-2022-KR)
        RTL_TEXTENCODING_UCS2               // Unicode (2 byte)
    };


SwAsciiFilterDlg::SwAsciiFilterDlg( Window* pParent, SwDocShell& rDocSh,
                                    SvStream* pStream )
    : SfxModalDialog( pParent, SW_RES( DLG_ASCII_FILTER )),
    aGB( this, ResId( GB_1 )),
    aCharSetFT( this, ResId( FT_CHARSET )),
    aCharSetLB( this, ResId( LB_CHARSET )),
    aFontFT( this, ResId( FT_FONT )),
    aFontLB( this, ResId( LB_FONT )),
    aLanguageFT( this, ResId( FT_LANGUAGE )),
    aLanguageLB( this, ResId( LB_LANGUAGE )),
    aCRLF_FT( this, ResId( FT_CRLF )),
    aCRLF_RB( this, ResId( RB_CRLF )),
    aCR_RB( this, ResId( RB_CR )),
    aLF_RB( this, ResId( RB_LF )),
    aOkPB( this, ResId( PB_OK )),
    aCancelPB( this, ResId( PB_CANCEL )),
    aHelpPB( this, ResId( PB_HELP )),
    sCharSet( ResId( STR_CHARSET )),
    sSystemCharSet( ResId( STR_SYS_CHARSET )),
    bSaveLineStatus( TRUE )
{
    FreeResource();

    SwAsciiOptions aOpt;
    {
        const String& rFindNm = String::CreateFromAscii(
                                    pStream ? sDialogImpExtraData
                                              : sDialogExpExtraData);
        USHORT nEnd, nStt = GetExtraData().Search( rFindNm );
        if( STRING_NOTFOUND != nStt )
        {
            nStt += nDialogExtraDataLen;
            nEnd = GetExtraData().Search( cDialogExtraDataClose, nStt );
            if( STRING_NOTFOUND != nEnd )
            {
                aOpt.ReadUserData( GetExtraData().Copy( nStt, nEnd - nStt ));
                nStt -= nDialogExtraDataLen;
                GetExtraData().Erase( nStt, nEnd - nStt + 1 );
            }
        }
    }

    // read the first chars and check the charset, (language - with L&H)
    if( pStream )
    {
        char aBuffer[ 4098 ];
        ULONG nOldPos = pStream->Tell();
        ULONG nBytesRead = pStream->Read( aBuffer, 4096 );
        pStream->Seek( nOldPos );

        if( nBytesRead <= 4096 )
        {
            aBuffer[ nBytesRead ] = '0';
            aBuffer[ nBytesRead+1 ] = '0';
            if( 0 != ( nBytesRead & 0x00000001 ) )
                aBuffer[ nBytesRead + 2 ] = '0';
        }

        BOOL bCR = FALSE, bLF = FALSE, bNoNormalChar = FALSE,
            bNullChar = FALSE;
        for( USHORT nCnt = 0; nCnt < nBytesRead; ++nCnt )
            switch( aBuffer[ nCnt ] )
            {
                case 0x0:   bNullChar = TRUE; break;
                case 0xA:   bLF = TRUE; break;
                case 0xD:   bCR = TRUE; break;
                case 0xC:
                case 0x1A:
                case 0x9:   break;
                default:
                    if( 0x20 > aBuffer[ nCnt ] )
                        bNoNormalChar = TRUE;
            }

        if( !bNullChar )
        {
            if( bCR )
            {
                if( bLF )
                {
                    aOpt.SetParaFlags( LINEEND_CRLF );
// have to check if of CharSet is type of ANSI
//                  aOpt.SetCharSet( CHARSET_ANSI );
                }
                else
                {
                    aOpt.SetParaFlags( LINEEND_CR );
// have to check if CharSet is type of MAC
//                  aOpt.SetCharSet( CHARSET_MAC );
                }
            }
            else if( bLF )
            {
                aOpt.SetParaFlags( LINEEND_LF );
// have to check if of CharSet is type of ANSI
//              aOpt.SetCharSet( CHARSET_ANSI );
            }
        }

        {
            BOOL bDelPrinter = FALSE;
            SfxPrinter* pPrt = rDocSh.GetDoc()->GetPrt();
            if( !pPrt )
            {
                SfxItemSet* pSet = new SfxItemSet( rDocSh.GetPool(),
                            SID_PRINTER_NOTFOUND_WARN, SID_PRINTER_NOTFOUND_WARN,
                            SID_PRINTER_CHANGESTODOC, SID_PRINTER_CHANGESTODOC,
                            0 );
                pPrt = new SfxPrinter( pSet );
                bDelPrinter = TRUE;
            }

            const USHORT nCount = pPrt->GetFontCount();
            for (USHORT i = 0; i < nCount; ++i)
            {
                const String &rStr = pPrt->GetFont(i)->GetName();
                aFontLB.InsertEntry( rStr );
            }

            if( !aOpt.GetFontName().Len() )
                aOpt.SetFontName( ((SvxFontItem&)rDocSh.GetDoc()->GetDefault(
                                    RES_CHRATR_FONT )).GetFamilyName() );
            aFontLB.SelectEntry( aOpt.GetFontName() );

            if( bDelPrinter )
                delete pPrt;
        }

        // initialisiere Sprache
        {
            if( !aOpt.GetLanguage() )
                aOpt.SetLanguage( ((SvxLanguageItem&)rDocSh.GetDoc()->
                            GetDefault( RES_CHRATR_LANGUAGE )).GetLanguage());

            const USHORT nLanguageCount = (USHORT) SvxGetSelectableLanguages().getLength();
            const util::Language *pLang = SvxGetSelectableLanguages().getConstArray();
            for( USHORT i = 0; i < nLanguageCount; ++i )
            {
                LanguageType eType = pLang[ i ];
                USHORT nPos = aLanguageLB.InsertEntry( ::GetLanguageString( eType ) );

                aLanguageLB.SetEntryData( nPos, (void*)(ULONG)eType );
                if( eType == aOpt.GetLanguage() )
                    aLanguageLB.SelectEntryPos( nPos );
            }
        }
    }
    else
    {
        // hide the used Control for the Export and move the
        // other behind the charset controls
        aFontFT.Hide();
        aFontLB.Hide();
        aLanguageFT.Hide();
        aLanguageLB.Hide();

        long nY = aFontFT.GetPosPixel().Y();
        Point aPos( aCRLF_FT.GetPosPixel() );   aPos.Y() = nY;
        aCRLF_FT.SetPosPixel( aPos );

        aPos = aCRLF_RB.GetPosPixel();  aPos.Y() = nY;
        aCRLF_RB.SetPosPixel( aPos );

        aPos = aCR_RB.GetPosPixel();    aPos.Y() = nY;
        aCR_RB.SetPosPixel( aPos );

        aPos = aLF_RB.GetPosPixel();    aPos.Y() = nY;
        aLF_RB.SetPosPixel( aPos );
    }

    // initialisiere Zeichensatz
    {
        rtl_TextEncoding eSystem = gsl_getSystemTextEncoding();
        USHORT nToken = 0, nPos, nCnt = 0;
        String sToken;
        do {
            if( 0 != (sToken = sCharSet.GetToken( 0, ';', nToken )).Len() )
            {
                rtl_TextEncoding eCode = aCharSetArr[ nCnt ];
                if( eCode == eSystem )
                    sToken = sSystemCharSet;
                nPos = aCharSetLB.InsertEntry( sToken );
                aCharSetLB.SetEntryData( nPos, (void*)(ULONG)eCode );
                if( eCode == aOpt.GetCharSet() )
                    aCharSetLB.SelectEntryPos( nPos );
            }
            ++nCnt;
        } while( STRING_NOTFOUND != nToken );
    }

    aCharSetLB.SetSelectHdl( LINK( this, SwAsciiFilterDlg, CharSetSelHdl ));
    aCRLF_RB.SetToggleHdl( LINK( this, SwAsciiFilterDlg, LineEndHdl ));
    aLF_RB.SetToggleHdl( LINK( this, SwAsciiFilterDlg, LineEndHdl ));
    aCR_RB.SetToggleHdl( LINK( this, SwAsciiFilterDlg, LineEndHdl ));

    SetCRLF( aOpt.GetParaFlags() );

    aCRLF_RB.SaveValue();
    aLF_RB.SaveValue();
    aCR_RB.SaveValue();
}


SwAsciiFilterDlg::~SwAsciiFilterDlg()
{
}


void SwAsciiFilterDlg::FillOptions( SwAsciiOptions& rOptions )
{
    ULONG nCCode = (ULONG)aCharSetLB.GetEntryData(
                            aCharSetLB.GetSelectEntryPos() );

    String sFont;
    ULONG nLng = 0;
    if( aFontLB.IsVisible() )
    {
        sFont = aFontLB.GetSelectEntry();
        nLng = (ULONG)aLanguageLB.GetEntryData(
                        aLanguageLB.GetSelectEntryPos() );
    }

    rOptions.SetFontName( sFont );
    rOptions.SetCharSet( rtl_TextEncoding( nCCode ) );
    rOptions.SetLanguage( USHORT( nLng ) );
    rOptions.SetParaFlags( GetCRLF() );

    // JP: Task #71802# save the user settings
    String sData;
    rOptions.WriteUserData( sData );
    if( sData.Len() )
    {
        const String& rFindNm = String::CreateFromAscii(
                                    aFontLB.IsVisible() ? sDialogImpExtraData
                                              : sDialogExpExtraData);
        USHORT nEnd, nStt = GetExtraData().Search( rFindNm );
        if( STRING_NOTFOUND != nStt )
        {
            // called twice, so remove "old" settings
            nEnd = GetExtraData().Search( cDialogExtraDataClose,
                                            nStt + nDialogExtraDataLen );
            if( STRING_NOTFOUND != nEnd )
                GetExtraData().Erase( nStt, nEnd - nStt + 1 );
        }
        String sTmp(GetExtraData());
        sTmp += rFindNm;
        sTmp += sData;
        sTmp += cDialogExtraDataClose;
        GetExtraData() = sTmp;
    }
}

void SwAsciiFilterDlg::SetCRLF( LineEnd eEnd )
{
    switch( eEnd )
    {
    case LINEEND_CR:    aCR_RB.Check();     break;
    case LINEEND_CRLF:  aCRLF_RB.Check();   break;
    case LINEEND_LF:    aLF_RB.Check();     break;
    }
}

LineEnd SwAsciiFilterDlg::GetCRLF() const
{
    LineEnd eEnd;
    if( aCR_RB.IsChecked() )
        eEnd = LINEEND_CR;
    else if( aLF_RB.IsChecked() )
        eEnd = LINEEND_LF;
    else
        eEnd = LINEEND_CRLF;
    return eEnd;
}

IMPL_LINK( SwAsciiFilterDlg, CharSetSelHdl, ListBox*, pBox )
{
    LineEnd eOldEnd = GetCRLF(), eEnd = (LineEnd)-1;
    ULONG nLng = aFontLB.IsVisible()
                    ? (ULONG)aLanguageLB.GetEntryData(
                        aLanguageLB.GetSelectEntryPos() )
                    : 0,
            nOldLng = nLng;

    ULONG nChrSet = (ULONG)pBox->GetEntryData( pBox->GetSelectEntryPos() );
    if( nChrSet == gsl_getSystemTextEncoding() )
        eEnd = GetSystemLineEnd();
    else
    {
        switch( nChrSet )
        {
        case RTL_TEXTENCODING_MS_1252:
#ifdef UNX
            eEnd = LINEEND_LF;
#else
            eEnd = LINEEND_CRLF;                // ANSI
#endif
            break;

        case RTL_TEXTENCODING_APPLE_ROMAN:      // MAC
            eEnd = LINEEND_CR;
            break;

        case RTL_TEXTENCODING_IBM_850:          // DOS
            eEnd = LINEEND_CRLF;
            break;

        case RTL_TEXTENCODING_APPLE_ARABIC:
        case RTL_TEXTENCODING_APPLE_CENTEURO:
        case RTL_TEXTENCODING_APPLE_CROATIAN:
        case RTL_TEXTENCODING_APPLE_CYRILLIC:
        case RTL_TEXTENCODING_APPLE_DEVANAGARI:
        case RTL_TEXTENCODING_APPLE_FARSI:
        case RTL_TEXTENCODING_APPLE_GREEK:
        case RTL_TEXTENCODING_APPLE_GUJARATI:
        case RTL_TEXTENCODING_APPLE_GURMUKHI:
        case RTL_TEXTENCODING_APPLE_HEBREW:
        case RTL_TEXTENCODING_APPLE_ICELAND:
        case RTL_TEXTENCODING_APPLE_ROMANIAN:
        case RTL_TEXTENCODING_APPLE_THAI:
        case RTL_TEXTENCODING_APPLE_TURKISH:
        case RTL_TEXTENCODING_APPLE_UKRAINIAN:
        case RTL_TEXTENCODING_APPLE_CHINSIMP:
        case RTL_TEXTENCODING_APPLE_CHINTRAD:
        case RTL_TEXTENCODING_APPLE_JAPANESE:
        case RTL_TEXTENCODING_APPLE_KOREAN:
            eEnd = LINEEND_CR;
            break;

#if 0
which charset and language?
        case RTL_TEXTENCODING_IBM_437:
        case RTL_TEXTENCODING_IBM_860:
        case RTL_TEXTENCODING_IBM_861:
        case RTL_TEXTENCODING_IBM_863:
        case RTL_TEXTENCODING_IBM_865:
        case RTL_TEXTENCODING_ASCII_US:
        case RTL_TEXTENCODING_ISO_8859_1:
        case RTL_TEXTENCODING_ISO_8859_2:
        case RTL_TEXTENCODING_ISO_8859_3:
        case RTL_TEXTENCODING_ISO_8859_4:
        case RTL_TEXTENCODING_ISO_8859_5:
        case RTL_TEXTENCODING_ISO_8859_6:
        case RTL_TEXTENCODING_ISO_8859_7:
        case RTL_TEXTENCODING_ISO_8859_8:
        case RTL_TEXTENCODING_ISO_8859_9:
        case RTL_TEXTENCODING_ISO_8859_14:
        case RTL_TEXTENCODING_ISO_8859_15:
        case RTL_TEXTENCODING_IBM_737:
        case RTL_TEXTENCODING_IBM_775:
        case RTL_TEXTENCODING_IBM_852:
        case RTL_TEXTENCODING_IBM_855:
        case RTL_TEXTENCODING_IBM_857:
        case RTL_TEXTENCODING_IBM_862:
        case RTL_TEXTENCODING_IBM_864:
        case RTL_TEXTENCODING_IBM_866:
        case RTL_TEXTENCODING_IBM_869:
        case RTL_TEXTENCODING_MS_874:
        case RTL_TEXTENCODING_MS_1250:
        case RTL_TEXTENCODING_MS_1251:
        case RTL_TEXTENCODING_MS_1253:
        case RTL_TEXTENCODING_MS_1254:
        case RTL_TEXTENCODING_MS_1255:
        case RTL_TEXTENCODING_MS_1256:
        case RTL_TEXTENCODING_MS_1257:
        case RTL_TEXTENCODING_MS_1258:
        case RTL_TEXTENCODING_MS_932:
        case RTL_TEXTENCODING_MS_936:
        case RTL_TEXTENCODING_MS_949:
        case RTL_TEXTENCODING_MS_950:
        case RTL_TEXTENCODING_SHIFT_JIS:
        case RTL_TEXTENCODING_GB_2312:
        case RTL_TEXTENCODING_GBT_12345:
        case RTL_TEXTENCODING_GBK:
        case RTL_TEXTENCODING_BIG5:
        case RTL_TEXTENCODING_EUC_JP:
        case RTL_TEXTENCODING_EUC_CN:
        case RTL_TEXTENCODING_EUC_TW:
        case RTL_TEXTENCODING_ISO_2022_JP:
        case RTL_TEXTENCODING_ISO_2022_CN:
        case RTL_TEXTENCODING_KOI8_R:
#endif
        }
    }

    bSaveLineStatus = FALSE;
    if( eEnd != (LineEnd)-1 )       // changed?
    {
        if( eOldEnd != eEnd )
            SetCRLF( eEnd );
    }
    else
    {
        // restore old user choise (not the automatic!)
        aCRLF_RB.Check( aCRLF_RB.GetSavedValue() );
        aCR_RB.Check( aCR_RB.GetSavedValue() );
        aLF_RB.Check( aLF_RB.GetSavedValue() );
    }
    bSaveLineStatus = TRUE;

    if( nOldLng != nLng && aFontLB.IsVisible() )
    {
        for( USHORT n = 0, nCnt = aLanguageLB.GetEntryCount(); n < nCnt; ++n )
            if( nLng == (ULONG)aLanguageLB.GetEntryData( n ))
            {
                aLanguageLB.SelectEntryPos( n );
                break;
            }
    }
    return 0;
}

IMPL_LINK( SwAsciiFilterDlg, LineEndHdl, RadioButton*, pBtn )
{
    if( bSaveLineStatus )
        pBtn->SaveValue();
    return 0;
}

/*************************************************************************

      $Log: not supported by cvs2svn $
      Revision 1.13  2000/09/18 16:05:20  willem.vandorp
      OpenOffice header added.

      Revision 1.12  2000/08/04 16:24:47  jp
      read/write unicode ascii files

      Revision 1.11  2000/08/01 07:40:17  jp
      new CJK filters

      Revision 1.10  2000/04/13 08:01:20  os
      UNICODE

      Revision 1.9  2000/03/30 10:59:20  os
      UNO III

      Revision 1.8  2000/03/16 16:38:36  kz
      chg. include sfx2/printer.hxx

      Revision 1.7  2000/02/07 16:01:51  jp
      Task #72603#: new textencodings

      Revision 1.6  2000/01/14 16:28:47  jp
      Task #71802#: one user settings for export and one for import

      Revision 1.5  2000/01/13 23:13:19  jp
      Task #71802#: save/restore user settings

      Revision 1.4  1999/11/15 14:21:12  jp
      remove not supportet charsets from the list

      Revision 1.3  1999/10/25 19:10:51  tl
      ongoing ONE_LINGU implementation

      Revision 1.2  1999/08/26 18:35:26  JP
      load and save Text with more options (charset/language/lineend/font)


      Rev 1.1   26 Aug 1999 20:35:26   JP
   load and save Text with more options (charset/language/lineend/font)

      Rev 1.0   25 Aug 1999 19:45:40   JP
   Dialog for ASCII filter options


*************************************************************************/



diff --git a/sw/source/ui/dialog/ascfldlg.hrc b/sw/source/ui/dialog/ascfldlg.hrc
new file mode 100644
index 0000000..e39d4d9
--- /dev/null
+++ b/sw/source/ui/dialog/ascfldlg.hrc
@@ -0,0 +1,80 @@
/*************************************************************************
 *
 *  $RCSfile: ascfldlg.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:34 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#define GB_1                1
#define FT_CHARSET          2
#define LB_CHARSET          3
#define FT_FONT             4
#define LB_FONT             5
#define FT_LANGUAGE         6
#define LB_LANGUAGE         7
#define FT_CRLF             8
#define RB_CRLF             9
#define RB_CR               10
#define RB_LF               11
#define PB_OK               12
#define PB_CANCEL           13
#define PB_HELP             14
#define STR_NO_LANGUAGE     15
#define STR_CHARSET         16
#define STR_SYS_CHARSET     17


diff --git a/sw/source/ui/dialog/ascfldlg.src b/sw/source/ui/dialog/ascfldlg.src
new file mode 100644
index 0000000..66fc5a0
--- /dev/null
+++ b/sw/source/ui/dialog/ascfldlg.src
@@ -0,0 +1,563 @@
/*************************************************************************
 *
 *  $RCSfile: ascfldlg.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:34 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#include "dialog.hrc"
#include "helpid.h"
#include "ascfldlg.hrc"

ModalDialog DLG_ASCII_FILTER
{
    HelpID = HID_ASCII_FILTER ;
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 239 , 84 ) ;
    Text = "ASCII Filter Optionen" ;
    Text [ English ] = "ASCII filter options" ;
    Moveable = TRUE ;
    GroupBox GB_1
    {
        OutputSize = TRUE ;
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 174 , 78 ) ;
        Text = "Eigenschaften" ;
        Text [ English ] = "Properties" ;
        Text[ english_us ] = "Properties";
        Text[ portuguese ] = "Propriedades";
        Text[ russian ] = "Ñâîéñòâà";
        Text[ greek ] = "Éäéüôçôåò";
        Text[ dutch ] = "Eigenschappen";
        Text[ french ] = "Propriétés";
        Text[ spanish ] = "Propiedades";
        Text[ italian ] = "Proprietà";
        Text[ danish ] = "Egenskaber";
        Text[ swedish ] = "Egenskaper";
        Text[ polish ] = "W³aœciwoœci";
        Text[ portuguese_brazilian ] = "Properties";
        Text[ japanese ] = "ÌßÛÊßè";
        Text[ korean ] = "µî·ÏÁ¤º¸";
        Text[ chinese_simplified ] = "ÊôÐÔ";
        Text[ chinese_traditional ] = "ÄÝ©Ê";
        Text[ arabic ] = "ÎÕÇÆÕ";
        Text[ turkish ] = "Özellikler";
    };
    FixedText FT_CHARSET
    {
        Pos = MAP_APPFONT ( 12 , 15 ) ;
        Size = MAP_APPFONT ( 53 , 10 ) ;
        Text = "Z~eichensatz" ;
        Text [ English ] = "Character Set" ;
        Text[ english_us ] = "~Font";
        Text[ portuguese ] = "~Conjunto de caracteres";
        Text[ russian ] = "Íàáîð çíàêîâ";
        Text[ greek ] = "Ó~åô ÷áñáêôÞñùí";
        Text[ dutch ] = "~Tekenset";
        Text[ french ] = "~Jeu de caractères";
        Text[ spanish ] = "~Caracteres";
        Text[ italian ] = "Ti~po di carattere";
        Text[ danish ] = "Tegnsæt";
        Text[ swedish ] = "Teckenuppsättning";
        Text[ polish ] = "Zbiór znaków";
        Text[ portuguese_brazilian ] = "Charset";
        Text[ japanese ] = "•¶Žš—ñ(~F)";
        Text[ korean ] = "±Û²Ã(~F)";
        Text[ chinese_simplified ] = "×Ö·û¼¯(~F)";
        Text[ chinese_traditional ] = "¦r«¬(~F)";
        Text[ turkish ] = "Karakter kümesi";
        Text[ arabic ] = "ãÌãæÚÉ ÃÍÑÝ";
    };
    ListBox LB_CHARSET
    {
        Pos = MAP_APPFONT ( 80 , 14 ) ;
        Size = MAP_APPFONT ( 86 , 61 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        Sort = TRUE ;
    };
    FixedText FT_FONT
    {
        Pos = MAP_APPFONT ( 12 , 31 ) ;
        Size = MAP_APPFONT ( 53 , 10 ) ;
        Text = "~Grundschrift" ;
        Text [ English ] = "Standard font" ;
        Text[ english_us ] = "Default fonts";
        Text[ portuguese ] = "Tipo de letra ~padrão";
        Text[ russian ] = "Ñòàíäàðòíûé øðèôò";
        Text[ greek ] = "ÂáóéêÝò ãñáììáôïóåéñÝò";
        Text[ dutch ] = "~Standaardlettertype";
        Text[ french ] = "Police de base";
        Text[ spanish ] = "~Fuente estándar";
        Text[ italian ] = "Carattere standard";
        Text[ danish ] = "Standardskrifttyper";
        Text[ swedish ] = "Standardteckensnitt";
        Text[ polish ] = "Czcionka podstawowa";
        Text[ portuguese_brazilian ] = "Standard fonts";
        Text[ japanese ] = "Šù’èÌ«ÝÄ";
        Text[ korean ] = "±âº» ±Û²Ã";
        Text[ chinese_simplified ] = "±ê×¼×ÖÌå";
        Text[ chinese_traditional ] = "Àq»{¦r«¬";
        Text[ turkish ] = "Standart yazýtipi";
        Text[ arabic ] = "ÇáÎØ ÇáÞíÇÓí";
    };
    ListBox LB_FONT
    {
        Pos = MAP_APPFONT ( 80 , 30 ) ;
        Size = MAP_APPFONT ( 86 , 61 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        Sort = TRUE ;
    };
    FixedText FT_LANGUAGE
    {
        Pos = MAP_APPFONT ( 12 , 47 ) ;
        Size = MAP_APPFONT ( 53 , 10 ) ;
        Text = "~Sprache" ;
        Text [ English ] = "Language" ;
        Text[ english_us ] = "Lan~guage";
        Text[ portuguese ] = "~Língua";
        Text[ russian ] = "ßçûê";
        Text[ greek ] = "Ãëþóóá";
        Text[ dutch ] = "~Taal";
        Text[ french ] = "~Langue";
        Text[ spanish ] = "Idio~ma";
        Text[ italian ] = "Lin~gua";
        Text[ danish ] = "Sprog";
        Text[ swedish ] = "Språk";
        Text[ polish ] = "Jêzyk";
        Text[ portuguese_brazilian ] = "Language";
        Text[ japanese ] = "Œ¾Œê(~G)";
        Text[ korean ] = "¾ð¾î(~G)";
        Text[ chinese_simplified ] = "ÓïÑÔ(~G)";
        Text[ chinese_traditional ] = "»y¨¥(~G)";
        Text[ arabic ] = "ÇááÛÉ";
        Text[ turkish ] = "~Dil";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_LANGUAGE
    {
        Pos = MAP_APPFONT ( 80 , 46 ) ;
        Size = MAP_APPFONT ( 86 , 61 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        Sort = TRUE ;
    };
    FixedText FT_CRLF
    {
        Pos = MAP_APPFONT ( 12 , 63 ) ;
        Size = MAP_APPFONT ( 53 , 10 ) ;
        Text = "~Absatzumbruch" ;
        Text [ English ] = "Paragraphbreak" ;
        Text[ english_us ] = "~Paragraph break";
        Text[ portuguese ] = "~Quebra de parágrafo";
        Text[ russian ] = "Ðàçðûâ àáçàöà";
        Text[ greek ] = "ÁëëáãÞ ðáñáãñÜöïõ";
        Text[ dutch ] = "~Alinea-einde";
        Text[ french ] = "Saut de ~paragraphe";
        Text[ spanish ] = "Salt~o de párrafo";
        Text[ italian ] = "~Interruzione di paragrafo";
        Text[ danish ] = "Afsnitsskift";
        Text[ swedish ] = "Styckebrytning";
        Text[ polish ] = "Podzia³ akapitu";
        Text[ portuguese_brazilian ] = "Paragraphbreak";
        Text[ japanese ] = "’i—Ž‹æØ‚è(~P)";
        Text[ korean ] = "´Ü¶ô ³ª´©±â(~P)";
        Text[ chinese_simplified ] = "»»¶ÎÂä(~P)";
        Text[ chinese_traditional ] = "´«¬q¸¨(~P)";
        Text[ arabic ] = "ÝÇÕá ÝÞÑÇÊ";
        Text[ turkish ] = "Paragraf sonu";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_CRLF
    {
        Pos = MAP_APPFONT ( 80 , 62 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        TabStop = TRUE ;
        Check = TRUE;
        Text = "~CR & LF" ;
        Text [ ENGLISH ] = "CR & LF" ;
        Text[ english_us ] = "~CR & LF";
        Text[ portuguese ] = "~CR & LF";
        Text[ russian ] = "CR & LF";
        Text[ greek ] = "~CR & LF";
        Text[ dutch ] = "~CR & LF";
        Text[ french ] = "~CR & LF";
        Text[ spanish ] = "CR & LF";
        Text[ italian ] = "~CR & LF";
        Text[ danish ] = "CR og LF";
        Text[ swedish ] = "CR & LF";
        Text[ polish ] = "~CR & LF";
        Text[ portuguese_brazilian ] = "CR & LF";
        Text[ japanese ] = "CR & LF(~C)";
        Text[ korean ] = "CR & LF(~C)";
        Text[ chinese_simplified ] = "»Ø³µ²¢»»ÐÐ(~C)";
        Text[ chinese_traditional ] = "~CR & LF";
        Text[ arabic ] = "CR & LF";
        Text[ turkish ] = "~CR & LF";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_CR
    {
        Pos = MAP_APPFONT ( 123 , 62 ) ;
        Size = MAP_APPFONT ( 20 , 12 ) ;
//        TabStop = TRUE ;
        Text = "C~R" ;
        Text [ ENGLISH ] = "CR" ;
        Text[ english_us ] = "C~R";
        Text[ portuguese ] = "C~R";
        Text[ russian ] = "CR";
        Text[ greek ] = "C~R";
        Text[ dutch ] = "C~R";
        Text[ french ] = "C~R";
        Text[ spanish ] = "C~R";
        Text[ italian ] = "C~R";
        Text[ danish ] = "CR";
        Text[ swedish ] = "CR";
        Text[ polish ] = "C~R";
        Text[ portuguese_brazilian ] = "CR";
        Text[ japanese ] = "CR(~R)";
        Text[ korean ] = "CR(~R)";
        Text[ chinese_simplified ] = "»Ø³µ(~R)";
        Text[ chinese_traditional ] = "C~R";
        Text[ arabic ] = "CR";
        Text[ turkish ] = "C~R";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_LF
    {
        Pos = MAP_APPFONT ( 146 , 62 ) ;
        Size = MAP_APPFONT ( 20 , 12 ) ;
//        TabStop = TRUE ;
        Text = "~LF" ;
        Text [ ENGLISH ] = "LF" ;
        Text[ english_us ] = "~LF";
        Text[ portuguese ] = "~LF";
        Text[ russian ] = "LF";
        Text[ greek ] = "~LF";
        Text[ dutch ] = "~LF";
        Text[ french ] = "~LF";
        Text[ spanish ] = "~LF";
        Text[ italian ] = "~LF";
        Text[ danish ] = "LF";
        Text[ swedish ] = "LF";
        Text[ polish ] = "~LF";
        Text[ portuguese_brazilian ] = "LF";
        Text[ japanese ] = "LF(~L)";
        Text[ korean ] = "LF(~L)";
        Text[ chinese_simplified ] = "ÐÂÐÐ(~L)";
        Text[ chinese_traditional ] = "~LF";
        Text[ arabic ] = "LF";
        Text[ turkish ] = "~LF";
        Text[ language_user1 ] = " ";
    };

    OKButton PB_OK
    {
        Pos = MAP_APPFONT ( 186 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        DefButton = TRUE ;
    };
    CancelButton PB_CANCEL
    {
        Pos = MAP_APPFONT ( 186 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    HelpButton PB_HELP
    {
        Pos = MAP_APPFONT ( 186 , 43 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    String STR_NO_LANGUAGE
    {
        Text = "[Keine]" ;
        Text [ ENGLISH ] = "[None]" ;
        Text[ english_us ] = "[None]";
        Text[ portuguese ] = "[Nenhum]";
        Text[ russian ] = "[Áåç]";
        Text[ greek ] = "[Êáìßá]";
        Text[ dutch ] = "[Geen]";
        Text[ french ] = "[Aucune]";
        Text[ spanish ] = "[Ninguno]";
        Text[ italian ] = "[Nessuna]";
        Text[ danish ] = "[Ingen]";
        Text[ swedish ] = "[Inget]";
        Text[ polish ] = "[Brak]";
        Text[ portuguese_brazilian ] = "[None]";
        Text[ japanese ] = "[‚È‚µ]";
        Text[ korean ] = "[¾øÀ½]";
        Text[ chinese_simplified ] = "[ÎÞ]";
        Text[ chinese_traditional ] = "[µL]";
        Text[ arabic ] = "[ÈÏæä]";
        Text[ turkish ] = "[Yok]";
    };
    String STR_SYS_CHARSET
    {
        Text = "System" ;
        Text [ ENGLISH ] = "System" ;
        Text[ english_us ] = "System";
        Text[ portuguese ] = "Sistema";
        Text[ russian ] = "Èç ñèñòåìû";
        Text[ greek ] = "Óýóôçìá";
        Text[ dutch ] = "Systeem";
        Text[ french ] = "Système";
        Text[ spanish ] = "Sistema";
        Text[ italian ] = "Sistema";
        Text[ danish ] = "System";
        Text[ swedish ] = "System";
        Text[ polish ] = "System";
        Text[ portuguese_brazilian ] = "System";
        Text[ japanese ] = "¼½ÃÑ";
        Text[ korean ] = "½Ã½ºÅÛ";
        Text[ chinese_simplified ] = "ϵͳ";
        Text[ chinese_traditional ] = "¨t²Î";
        Text[ arabic ] = "ÇáäÙÇã";
        Text[ turkish ] = "Sistem";
        Text[ language_user1 ] = " ";
    };
    String STR_CHARSET
    {
        Text =  "Westeuropa (Window-1252/WinLatin 1);"
                "Westeuropa (Apple Macintosh);"
                "Westeuropa (DOS/OS2-850/International);"
                "Westeuropa (DOS/OS2-437/US);"
                "Westeuropa (DOS/OS2-860/Portugiesisch);"
                "Westeuropa (DOS/OS2-861/Isländisch);"
                "Westeuropa (DOS/OS2-863/Französisch (Kand.));"
                "Westeuropa (DOS/OS2-865/Nordisch);"
                "Westeuropa (ASCII/US);"
                "Westeuropa (ISO-8859-1);"
                "Osteuropa (ISO-8859-2);"
                "Latin 3 (ISO-8859-3);"
                "Baltisch (ISO-8859-4);"
                "Kyrillisch (ISO-8859-5);"
//      RTL_TEXTENCODING_ISO_8859_6,        // Arabic (ISO-8859-6)
                "Griechisch (ISO-8859-7);"
//      RTL_TEXTENCODING_ISO_8859_8,        // Hebrew (ISO-8859-8)
                "Türkisch (ISO-8859-9);"
                "Westeuropa (ISO-8859-14);"
                "Westeuropa (ISO-8859-15/EURO);"
                "Griechisch (DOS/OS2-737);"
                "Baltisch (DOS/OS2-775);"
                "Osteuropa (DOS/OS2-852);"
                "Kyrillisch (DOS/OS2-855);"
                "Türkisch (DOS/OS2-857);"
//      RTL_TEXTENCODING_IBM_862,           // Hebrew (DOS/OS2-862)
//      RTL_TEXTENCODING_IBM_864,           // Arabic (DOS/OS2-864)
                "Kyrillisch (DOS/OS2-866/Russisch);"
                "Griechisch (DOS/OS2-869/Modern);"
//      RTL_TEXTENCODING_MS_874,            // Thai (Dos/Windows-874)
                "Osteuropa (Windows-1250/WinLatin 2);"
                "Kyrillisch (Windows-1251);"
                "Griechisch (Windows-1253);"
                "Türkisch (Windows-1254);"
//      RTL_TEXTENCODING_MS_1255,           // Hebrew (Windows-1255)
//      RTL_TEXTENCODING_MS_1256,           // Arabic (Windows-1256)
                "Baltisch (Windows-1257);"
//      RTL_TEXTENCODING_MS_1258,           // Vietnamese (Windows-1258)
//      RTL_TEXTENCODING_APPLE_ARABIC,      // Arabic (Apple Macintosh)
                "Osteuropa (Apple Macintosh);"
                "Osteuropa (Apple Macintosh/Kroatisch);"
                "Kyrillisch (Apple Macintosh);"
//      RTL_TEXTENCODING_APPLE_DEVANAGARI,  // APPLE DEVANAGARI
//      RTL_TEXTENCODING_APPLE_FARSI,       // APPLE FARSI
                "Griechisch (Apple Macintosh);"
//      RTL_TEXTENCODING_APPLE_GUJARATI,    // APPLE GUJARATI
//      RTL_TEXTENCODING_APPLE_GURMUKHI,    // APPLE GURMUKHI
//      RTL_TEXTENCODING_APPLE_HEBREW,      // Hebrew (Apple Macintosh)
                "Westeuropa (Apple Macintosh/Isländisch);"
                "Osteuropa (Apple Macintosh/Rumänisch);"
//      RTL_TEXTENCODING_APPLE_THAI,        // Thai (Apple Macintosh)
                "Türkisch (Apple Macintosh);"
                "Kyrillisch (Apple Macintosh/Ukrainisch);"
                "Chinesisch vereinfacht (Apple Macintosh);"
                 "Chinesisch traditionell (Apple Macintosh);"
                "Japanisch (Apple Macintosh);"
                "Koreanisch (Apple Macintosh);"
                "Japanisch (Windows-932);"
                "Chinesisch vereinfacht (Windows-936);"
                "Koreanisch (Windows-949);"
                "Chinesisch traditionell (Windows-950);"
                "Japanisch (Shift-JIS);"
                "Chinesisch vereinfacht (GB-2312);"
                "Chinesisch traditionell (GBT-12345);"
                "Chinesisch vereinfacht (GBK/GB-2312-80);"
                "Chinesisch traditionell (BIG5);"
// "Japanisch (EUC-JP);"
                "Chinesisch vereinfacht (EUC-CN);"
// "Chinesisch traditionell (EUC-TW);"
// "Japanisch (ISO-2022-JP);"
// "Chinesisch vereinfacht (ISO-2022-CN);"
                "Kyrillisch (KOI8-R);"
                "Unicode (UTF-7);"
                "Unicode (UTF-8);"
                "Osteuropa (ISO-8859-10);"
                "Osteuropa (ISO-8859-13);"
                "Koreanisch (EUC-KR);"
//              "Koreanisch (ISO-2022-KR);"
                "Unicode;"
                ;
        Text[ English ] =
                "Western (Window-1252/WinLatin 1);"
                "Western (Apple Macintosh);"
                "Western (DOS/OS2-850/International);"
                "Western (DOS/OS2-437/US);"
                "Western (DOS/OS2-860/Portugese);"
                "Western (DOS/OS2-861/Icelandic);"
                "Western (DOS/OS2-863/Canadian-French);"
                "Western (DOS/OS2-865/Nordic);"
                "Western (ASCII/US);"
                "Western (ISO-8859-1);"
                "Central European (ISO-8859-2);"
                "Latin 3 (ISO-8859-3);"
                "Baltic (ISO-8859-4);"
                "Cyrillic (ISO-8859-5);"
//      RTL_TEXTENCODING_ISO_8859_6,        // Arabic (ISO-8859-6)
                "Greek (ISO-8859-7);"
//      RTL_TEXTENCODING_ISO_8859_8,        // Hebrew (ISO-8859-8)
                "Turkish (ISO-8859-9);"
                "Western (ISO-8859-14);"
                "Western (ISO-8859-15/EURO);"
                "Greek (DOS/OS2-737);"
                "Baltic (DOS/OS2-775);"
                "Central European (DOS/OS2-852);"
                "Cyrillic (DOS/OS2-855);"
                "Turkish (DOS/OS2-857);"
//      RTL_TEXTENCODING_IBM_862,           // Hebrew (DOS/OS2-862)
//      RTL_TEXTENCODING_IBM_864,           // Arabic (DOS/OS2-864)
                "Cyrillic (DOS/OS2-866/Russian);"
                "Greek (DOS/OS2-869/Modern);"
//      RTL_TEXTENCODING_MS_874,            // Thai (Dos/Windows-874)
                "Central European (Windows-1250/WinLatin 2);"
                "Cyrillic (Windows-1251);"
                "Greek (Windows-1253);"
                "Turkish (Windows-1254);"
//      RTL_TEXTENCODING_MS_1255,           // Hebrew (Windows-1255)
//      RTL_TEXTENCODING_MS_1256,           // Arabic (Windows-1256)
                "Baltic (Windows-1257);"
//      RTL_TEXTENCODING_MS_1258,           // Vietnamese (Windows-1258)
//      RTL_TEXTENCODING_APPLE_ARABIC,      // Arabic (Apple Macintosh)
                "Central European (Apple Macintosh);"
                "Central European (Apple Macintosh/Croatian);"
                "Cyrillic (Apple Macintosh);"
//      RTL_TEXTENCODING_APPLE_DEVANAGARI,  // APPLE DEVANAGARI
//      RTL_TEXTENCODING_APPLE_FARSI,       // APPLE FARSI
                "Greek (Apple Macintosh);"
//      RTL_TEXTENCODING_APPLE_GUJARATI,    // APPLE GUJARATI
//      RTL_TEXTENCODING_APPLE_GURMUKHI,    // APPLE GURMUKHI
//      RTL_TEXTENCODING_APPLE_HEBREW,      // Hebrew (Apple Macintosh)
                "Western (Apple Macintosh/Icelandic);"
                "Central European (Apple Macintosh/Romanian);"
//      RTL_TEXTENCODING_APPLE_THAI,        // Thai (Apple Macintosh)
                "Turkish (Apple Macintosh);"
                "Cyrillic (Apple Macintosh/Ukrainian);"
                "Chinese Simplified (Apple Macintosh);"
                "Chinese Traditional (Apple Macintosh);"
                "Japanese (Apple Macintosh);"
                "Korean (Apple Macintosh);"
                "Japanese (Windows-932);"
                "Chinese Simplified (Windows-936);"
                "Korean (Windows-949);"
                "Chinese Traditional (Windows-950);"
                "Japanese (Shift-JIS);"
                "Chinese Simplified (GB-2312);"
                "Chinese Traditional (GBT-12345);"
                "Chinese Simplified (GBK/GB-2312-80);"
                "Chinese Traditional (BIG5);"
// "Japanese (EUC-JP);"
                "Chinese Simplified (EUC-CN);"
// "Chinese Traditional (EUC-TW);"
// "Japanese (ISO-2022-JP);"
// "Chinese Simplified (ISO-2022-CN);"
                "Cyrillic (KOI8-R);"
                "Unicode (UTF-7);"
                "Unicode (UTF-8);"
                "Central European (ISO-8859-10);"
                "Central European (ISO-8859-13);"
                "Korean (EUC-KR);"
//              "Korean (ISO-2022-KR);"
                "Unicode;"
                ;
    };
    Text[ english_us ] = "ASCII Filter Options";
    Text[ portuguese ] = "Opções de filtro ASCII";
    Text[ russian ] = "Ïàðàìåòðû ôèëüòðà ASCII";
    Text[ greek ] = "ÅðéëïãÝò ößëôñùí ASCII";
    Text[ dutch ] = "ASCII filteropties";
    Text[ french ] = "Options de filtre ASCII";
    Text[ spanish ] = "Opciones de filtro ASCII";
    Text[ italian ] = "Opzioni filtro ASCII";
    Text[ danish ] = "ASCII filterindstillinger";
    Text[ swedish ] = "ASCII filteralternativ";
    Text[ polish ] = "Opcje filtra ASCII";
    Text[ portuguese_brazilian ] = "ASCII filter options";
    Text[ japanese ] = "ASCIĮÙÀµÌß¼®Ý";
    Text[ korean ] = "¾Æ½ºÅ° ÇÊÅÍ ¿É¼Ç";
    Text[ chinese_simplified ] = "ASCII ¹ýÂËÆ÷Ñ¡Ïî";
    Text[ chinese_traditional ] = "ASCII ¹LÂo¾¹¿ï¶µ";
    Text[ arabic ] = "ÎÕÇÆÕ ÝáÊÑ ASCII";
    Text[ turkish ] = "ASCII filtre seçenekleri";
    Text[ language_user1 ] = " ";
};





diff --git a/sw/source/ui/dialog/dialog.src b/sw/source/ui/dialog/dialog.src
new file mode 100644
index 0000000..28a5be4
--- /dev/null
+++ b/sw/source/ui/dialog/dialog.src
@@ -0,0 +1,201 @@
/*************************************************************************
 *
 *  $RCSfile: dialog.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:34 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#include "dialog.hrc"

CheckBox CB_USE_PASSWD
{
    /* ### ACHTUNG: Neuer Text in Resource? ~Paßwort : ~Pa˜wort */
    Text = "~Passwort" ;
    Text [ ENGLISH ] = "~Password" ;
    Text [ norwegian ] = "~Passord" ;
    Text [ italian ] = "~Password" ;
    Text [ portuguese_brazilian ] = "~Senha" ;
    Text [ portuguese ] = "~Senha" ;
    Text [ finnish ] = "~Salasana" ;
    Text [ danish ] = "Adgangskode" ;
    Text [ french ] = "~Mot de passe" ;
    Text [ swedish ] = "~Lösenord" ;
    Text [ dutch ] = "~Wachtwoord" ;
    Text [ spanish ] = "~Contraseña" ;
    Text [ english_us ] = "~Password" ;
    Text[ chinese_simplified ] = "¿ÚÁî(~P)";
    Text[ russian ] = "Ïàðîëü";
    Text[ polish ] = "Has³o";
    Text[ japanese ] = "Ê߽ܰÄÞ(~P)";
    Text[ chinese_traditional ] = "±K½X(~P)";
    Text[ arabic ] = "ßáãÉ ÇáÓÑ";
    Text[ greek ] = "Êùäéêüò ðñüóâáóçò";
    Text[ korean ] = "ÆÐ½º¿öµå(~P)";
    Text[ turkish ] = "Þifre";
    Text[ language_user1 ] = " ";
};
CheckBox CB_READ_ONLY
{
    Text = "Nu~r lesen" ;
    Text [ ENGLISH ] = "~Read only" ;
    Text [ norwegian ] = "~Skrivebeskyttet" ;
    Text [ italian ] = "~Sola lettura" ;
    Text [ portuguese_brazilian ] = "~Só leitura" ;
    Text [ portuguese ] = "~Só leitura" ;
    Text [ finnish ] = "~Vain luku" ;
    Text [ danish ] = "Skrivebeskyttet" ;
    Text [ french ] = "En ~lecture seule" ;
    Text [ swedish ] = "Sk~rivskyddad" ;
    Text [ dutch ] = "~Alleen lezen" ;
    Text [ spanish ] = "~Solo lectura" ;
    Text [ english_us ] = "~Read only" ;
    Text[ chinese_simplified ] = "Ö»¶Á(~R)";
    Text[ russian ] = "Òîëüêî äëÿ ÷òåíèÿ";
    Text[ polish ] = "Tylko do odczytu";
    Text[ japanese ] = "“ǂݎæ‚èê—p(~R)";
    Text[ chinese_traditional ] = "°ßŪ(~R)";
    Text[ arabic ] = "ááÞÑÇÁÉ ÝÞØ";
    Text[ greek ] = "Ìüíï ãéá áíÜãíùóç";
    Text[ korean ] = "Àбâ Àü¿ë(~R)";
    Text[ turkish ] = "~Salt okunur";
    Text[ language_user1 ] = " ";
};
String STR_LINKEDIT_TEXT
{
    /* ### ACHTUNG: Neuer Text in Resource? Verknüpfungen bearbeiten : Verkn³pfungen bearbeiten */
    Text = "Verknüpfungen bearbeiten" ;
    Text [ ENGLISH ] = "Edit links" ;
    Text [ norwegian ] = "Edit links" ;
    Text [ italian ] = "Modifica collegamenti" ;
    Text [ portuguese_brazilian ] = "Editar ligações" ;
    Text [ portuguese ] = "Editar ligações" ;
    Text [ finnish ] = "Muokkaa linkkejä" ;
    Text [ danish ] = "Rediger kæder" ;
    Text [ french ] = "Édition de liens" ;
    Text [ swedish ] = "Redigera länkar" ;
    Text [ dutch ] = "Koppelingen bewerken" ;
    Text [ spanish ] = "Modificar vínculos" ;
    Text [ english_us ] = "Edit links" ;
    Text[ chinese_simplified ] = "±à¼­Á´½Ó";
    Text[ russian ] = "Ïðàâêà ññûëîê";
    Text[ polish ] = "Edytuj ³¹cza";
    Text[ japanese ] = "ØÝ¸‚̕ҏW";
    Text[ chinese_traditional ] = "½s¿è±¶®|";
    Text[ arabic ] = "ÊÍÑíÑ ÇáÇÑÊÈÇØÇÊ";
    Text[ greek ] = "Åðåîåñãáóßá óõíäÝóåùí";
    Text[ korean ] = "¿¬°á ÆíÁý";
    Text[ turkish ] = "Baðlantýlarý düzenle";
    Text[ language_user1 ] = " ";
};
String STR_PATH_NOT_FOUND1
{
    /* ### ACHTUNG: Neuer Text in Resource? Das Verzeichnis ' : Das Verzeichnis '' */
    Text = "Das Verzeichnis '" ;
    Text [ English ] = "The directory '" ;
    Text [ norwegian ] = "The directory '" ;
    Text [ italian ] = "La cartella" ;
    Text [ portuguese_brazilian ] = "O diretório" ;
    Text [ portuguese ] = "O directório '" ;
    Text [ finnish ] = "Hakemistoa '" ;
    Text [ danish ] = "Biblioteket '" ;
    Text [ french ] = "Le répertoire'" ;
    Text [ swedish ] = "Mappen '" ;
    Text [ dutch ] = "Map '" ;
    Text [ spanish ] = "El directorio '" ;
    Text [ english_us ] = "The directory '" ;
    Text[ chinese_simplified ] = "Õâ¸öĿ¼ '";
    Text[ russian ] = "Äèðåêòîðèÿ '";
    Text[ polish ] = "Katalog";
    Text[ japanese ] = "ÃÞ¨Ú¸ÄØ'";
    Text[ language_user1 ] = " ";
    Text[ chinese_traditional ] = "³o­Ó¥Ø¿ý '";
    Text[ arabic ] = "ÇáÏáíá '";
    Text[ greek ] = "Ï êáôÜëïãïò '";
    Text[ korean ] = "µð·ºÅ丮'";
    Text[ turkish ] = "Dizin '";
};
String STR_PATH_NOT_FOUND2
{
    /* ### ACHTUNG: Neuer Text in Resource? ' existiert nicht. : '' existiert nicht. */
    /* ### ACHTUNG: Neuer Text in Resource? ' existiert nicht. : '' existiert nicht. */
    Text = "' existiert nicht." ;
    Text [ English ] = "' does not exist." ;
    Text [ norwegian ] = "' does not exist." ;
    Text [ italian ] = "' non esiste." ;
    Text [ portuguese_brazilian ] = "' não existe." ;
    Text [ portuguese ] = "' não existe." ;
    Text [ finnish ] = "' ei ole." ;
    Text [ danish ] = "' eksisterer ikke." ;
    Text [ french ] = "' n'existe pas." ;
    Text [ swedish ] = "' finns inte." ;
    Text [ dutch ] = "' bestaat niet." ;
    Text [ spanish ] = "' no existe." ;
    Text [ english_us ] = "' does not exist." ;
    Text[ chinese_simplified ] = "' ²»´æÔÚ¡£";
    Text[ russian ] = "' íå ñóùåñòâóåò.";
    Text[ polish ] = "nie istnieje.";
    Text[ japanese ] = "'‚Í‘¶Ý‚µ‚Ä‚¢‚Ü‚¹‚ñB";
    Text[ chinese_traditional ] = "' ¤£¦s¦b¡C";
    Text[ arabic ] = "' ÛíÑ ãæÌæÏ.";
    Text[ greek ] = "' äåí õðÜñ÷åé.";
    Text[ korean ] = "' °¡ Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù.";
    Text[ turkish ] = "' mevcut deðil.";
    Text[ language_user1 ] = " ";
};
String STR_FLT_SGV
{
    Text = "SGV - StarDraw 2.0,SGV" ;
};
diff --git a/sw/source/ui/dialog/docstdlg.cxx b/sw/source/ui/dialog/docstdlg.cxx
new file mode 100644
index 0000000..35d13bc
--- /dev/null
+++ b/sw/source/ui/dialog/docstdlg.cxx
@@ -0,0 +1,427 @@
/*************************************************************************
 *
 *  $RCSfile: docstdlg.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:34 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include <stdio.h>
#include <ctype.h>

#ifndef _SWWAIT_HXX
#include <swwait.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _FESH_HXX
#include <fesh.hxx>
#endif

#ifndef _PVIEW_HXX
#include <pview.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _DOCSTDLG_HXX
#include <docstdlg.hxx>
#endif
#ifndef _DOCSTAT_HXX
#include <docstat.hxx>
#endif
#ifndef _MODCFG_HXX
#include <modcfg.hxx>
#endif

// fuer Statistikfelder
#ifndef _FLDMGR_HXX
#include <fldmgr.hxx>
#endif
#ifndef _FLDBAS_HXX
#include <fldbas.hxx>
#endif

#ifndef _DOCSTDLG_HRC
#include <docstdlg.hrc>
#endif


/*--------------------------------------------------------------------
    Beschreibung: Create
 --------------------------------------------------------------------*/


SfxTabPage *  SwDocStatPage::Create(Window *pParent, const SfxItemSet &rSet)
{
    return new SwDocStatPage(pParent, rSet);
}

/*--------------------------------------------------------------------
    Beschreibung:   Ctor
 --------------------------------------------------------------------*/


SwDocStatPage::SwDocStatPage(Window *pParent, const SfxItemSet &rSet) :

    SfxTabPage  (pParent, SW_RES(TP_DOC_STAT), rSet),

    aTableLbl   (this, SW_RES( FT_TABLE      )),
    aGrfLbl     (this, SW_RES( FT_GRF        )),
    aOLELbl     (this, SW_RES( FT_OLE        )),
    aPageLbl    (this, SW_RES( FT_PAGE       )),
    aParaLbl    (this, SW_RES( FT_PARA       )),
    aWordLbl    (this, SW_RES( FT_WORD       )),
    aWordDelimFT(this, SW_RES( FT_WORD_DELIM )),
    aWordDelim  (this, SW_RES( ED_WORD_DELIM )),
    aCharLbl    (this, SW_RES( FT_CHAR       )),
    aTableNo    (this, SW_RES( FT_TABLE_COUNT)),
    aGrfNo      (this, SW_RES( FT_GRF_COUNT  )),
    aOLENo      (this, SW_RES( FT_OLE_COUNT  )),
    aPageNo     (this, SW_RES( FT_PAGE_COUNT )),
    aParaNo     (this, SW_RES( FT_PARA_COUNT )),
    aWordNo     (this, SW_RES( FT_WORD_COUNT )),
    aCharNo     (this, SW_RES( FT_CHAR_COUNT )),
    aLineLbl    (this, SW_RES( FT_LINE       )),
    aLineNo     (this, SW_RES( FT_LINE_COUNT )),
    aUpdatePB   (this, SW_RES( PB_PDATE      ))
{
    Update();
    FreeResource();
    aUpdatePB.SetClickHdl(LINK(this, SwDocStatPage, UpdateHdl));
}


 SwDocStatPage::~SwDocStatPage()
{
}

/*--------------------------------------------------------------------
    Beschreibung:   ItemSet fuellen bei Aenderung
 --------------------------------------------------------------------*/


BOOL  SwDocStatPage::FillItemSet(SfxItemSet &rSet)
{
    // evtl UserData setzen

    String sEd(aWordDelim.GetText());
    String sDelim;
    String sChar;

    xub_StrLen i = 0;
    sal_Unicode c;

    while (i < sEd.Len())
    {
        c = sEd.GetChar(i++);

        if (c == '\\')
        {
            c = sEd.GetChar(i++);

            switch (c)
            {
                case 'n':   sDelim += '\n'; break;
                case 't':   sDelim += '\t'; break;
                case '\\':  sDelim += '\\'; break;

                case 'x':
                {
                    sal_Unicode nVal, nChar;
                    BOOL bValidData = TRUE;
                    xub_StrLen n;
                    for( n = 0, nChar = 0; n < 2 && i < sEd.Len(); ++n, ++i )
                    {
                        if( ((nVal = sEd.GetChar( i )) >= '0') && ( nVal <= '9') )
                            nVal -= '0';
                        else if( (nVal >= 'A') && (nVal <= 'F') )
                            nVal -= 'A' - 10;
                        else if( (nVal >= 'a') && (nVal <= 'f') )
                            nVal -= 'a' - 10;
                        else
                        {
                            DBG_ASSERT( !this, "ungueltiger Hex-Wert" );
                            bValidData = FALSE;
                            break;
                        }

                        (nChar <<= 4 ) += nVal;
                    }
                    if( bValidData )
                        sDelim += nChar;
                    break;
                }

                default:    // Unbekannt, daher nur Backslash einfuegen
                    sDelim += '\\';
                    i--;
                    break;
            }
        }
        else
            sDelim += c;
    }


    SW_MOD()->GetModuleConfig()->SetWordDelimiter(sDelim);

    return FALSE;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void  SwDocStatPage::Reset(const SfxItemSet &rSet)
{
    // Im Set befindet sich die DocInfo
    // bei Bedarf UserData auswerten
    String sDelim(SW_MOD()->GetDocStatWordDelim());
    String sEd;
    for (xub_StrLen i = 0; i < sDelim.Len(); i++)
    {
        sal_Unicode c = sDelim.GetChar(i);

        switch (c)
        {
            case '\n':  sEd.AppendAscii(RTL_CONSTASCII_STRINGPARAM("\\n")); break;
            case '\t':  sEd.AppendAscii(RTL_CONSTASCII_STRINGPARAM("\\t")); break;
            case '\\':  sEd.AppendAscii(RTL_CONSTASCII_STRINGPARAM("\\\\"));    break;

            default:
                if( c <= 0x1f || c >= 0x7f )
                {
                    sEd.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "\\x" ))
                        += String::CreateFromInt32( c, 16 );
                }
                else
                    sEd += c;
        }
    }
    aWordDelim.SetText(sEd);
    aWordDelim.ClearModifyFlag();
}


/*------------------------------------------------------------------------
 Beschreibung:  Aktualisieren / Setzen der Daten
------------------------------------------------------------------------*/


void SwDocStatPage::SetData(const SwDocStat &rStat)
{
    aTableNo.SetText(String::CreateFromInt32( rStat.nTbl ));
    aGrfNo.SetText(String::CreateFromInt32( rStat.nGrf ));
    aOLENo.SetText(String::CreateFromInt32( rStat.nOLE ));
    aPageNo.SetText(String::CreateFromInt32( rStat.nPage ));
    aParaNo.SetText(String::CreateFromInt32( rStat.nPara ));
    aWordNo.SetText(String::CreateFromInt32( rStat.nWord ));
    aCharNo.SetText(String::CreateFromInt32( rStat.nChar ));
}

/*------------------------------------------------------------------------
 Beschreibung:  Aktualisieren der Statistik
------------------------------------------------------------------------*/


void SwDocStatPage::Update()
{
    SfxViewShell *pVSh = SfxViewShell::Current();
    ViewShell *pSh = 0;
    if ( pVSh->ISA(SwView) )
        pSh = ((SwView*)pVSh)->GetWrtShellPtr();
    else if ( pVSh->ISA(SwPagePreView) )
        pSh = &((SwPagePreView*)pVSh)->GetViewShell();

    ASSERT( pSh, "Shell not found" );

    SwWait aWait( *pSh->GetDoc()->GetDocShell(), TRUE );
    pSh->StartAction();
    pSh->GetDoc()->UpdateDocStat( aDocStat, pSh->GetNumPages() );
    pSh->EndAction();

    SetData(aDocStat);
}

/*-----------------19.06.97 16.37-------------------
    Zeilennummer aktualisieren
--------------------------------------------------*/
IMPL_LINK( SwDocStatPage, UpdateHdl, PushButton*, pButton)
{
    FillItemSet(*(SfxItemSet *)0);  // Worttrenner setzen
    aDocStat.bModified |= aWordDelim.IsModified();
    aWordDelim.ClearModifyFlag();
    Update();
    SwDocShell* pDocShell = (SwDocShell*) SfxObjectShell::Current();
    SwFEShell* pFEShell = pDocShell->GetFEShell();
    aLineNo.SetText( String::CreateFromInt32( pFEShell->GetLineCount(FALSE)));
    //pButton->Disable();
    return 0;
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.43  2000/09/18 16:05:20  willem.vandorp
    OpenOffice header added.

    Revision 1.42  2000/05/22 16:26:16  jp
    Changes for Unicode

    Revision 1.41  2000/04/13 08:01:20  os
    UNICODE

    Revision 1.40  1999/07/08 17:16:10  MA
    Use internal object to toggle wait cursor


      Rev 1.39   08 Jul 1999 19:16:10   MA
   Use internal object to toggle wait cursor

      Rev 1.38   26 May 1998 12:04:42   OM
   #50480 Worttrenner aktualisieren

      Rev 1.37   15 May 1998 12:48:22   OM
   Worttrenner

      Rev 1.36   14 May 1998 16:46:54   OM
   Worttrenner konfigurierbar

      Rev 1.35   01 Sep 1997 13:15:08   OS
   DLL-Umstellung

      Rev 1.34   27 Aug 1997 09:53:10   MH
   chg: header

      Rev 1.33   26 Aug 1997 14:53:38   TRI
   VCL includes

      Rev 1.32   23 Jun 1997 10:57:00   OS
   LineCount: nicht die akt. Psition

      Rev 1.31   20 Jun 1997 16:46:58   HJS
   sexport -> __export

      Rev 1.30   20 Jun 1997 16:41:40   HJS
   sexport -> __export

      Rev 1.29   19 Jun 1997 17:29:00   OS
   Zeilen zaehlen

      Rev 1.28   11 Nov 1996 09:31:16   MA
   ResMgr

      Rev 1.27   01 Nov 1996 10:32:20   OM
   Statistik-TP auf Standardgroesse gebracht

      Rev 1.26   28 Aug 1996 10:10:00   OS
   includes

      Rev 1.25   02 Jul 1996 18:43:38   MA
   Wait-Umstellung 325

      Rev 1.24   19 Jan 1996 20:07:42   MA
   fix#24463# UpdateDocStat in Seitenansicht

      Rev 1.23   24 Nov 1995 16:58:16   OM
   PCH->PRECOMPILED

      Rev 1.22   26 Feb 1995 15:37:28   MA
   fix: SEXPORT nachgeruestet.

      Rev 1.21   24 Jan 1995 12:49:46   SWG
   Map entfernt

      Rev 1.20   18 Jan 1995 19:12:48   ER
   fld.hxx -> *fld*.hxx

      Rev 1.19   09 Dec 1994 18:26:00   MS
   DocStat geaendert

      Rev 1.18   07 Dec 1994 17:00:20   MS
   DocStat -> TabPage

      Rev 1.17   25 Oct 1994 16:31:12   ER
   add: PCH

      Rev 1.16   17 Oct 1994 16:26:38   PK
   ausgeboxtes wieder reingeboxt


------------------------------------------------------------------------*/


diff --git a/sw/source/ui/dialog/docstdlg.hrc b/sw/source/ui/dialog/docstdlg.hrc
new file mode 100644
index 0000000..3b75e17
--- /dev/null
+++ b/sw/source/ui/dialog/docstdlg.hrc
@@ -0,0 +1,83 @@
/*************************************************************************
 *
 *  $RCSfile: docstdlg.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:34 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#define FT_TABLE            1
#define FT_GRF              2
#define FT_OLE              3
#define FT_PAGE             4
#define FT_PARA             5
#define FT_WORD             6
#define ED_WORD_DELIM       7
#define FT_WORD_DELIM       8
#define FT_CHAR             9
#define FT_TABLE_COUNT      10
#define FT_GRF_COUNT        11
#define FT_OLE_COUNT        12
#define FT_PAGE_COUNT       13
#define FT_PARA_COUNT       14
#define FT_WORD_COUNT       15
#define FT_CHAR_COUNT       16
#define FT_LINE             17
#define FT_LINE_COUNT       18
#define PB_PDATE            19

#define BT_OK               100

diff --git a/sw/source/ui/dialog/docstdlg.src b/sw/source/ui/dialog/docstdlg.src
new file mode 100644
index 0000000..48271d1d
--- /dev/null
+++ b/sw/source/ui/dialog/docstdlg.src
@@ -0,0 +1,411 @@
/*************************************************************************
 *
 *  $RCSfile: docstdlg.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:34 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "globals.hrc"
#include "docstdlg.hrc"
#include "helpid.h"
 // #define TP_DOC_STAT 256
TabPage TP_DOC_STAT
{
    HelpID = HID_DOC_STAT ;
    Hide = TRUE;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    FixedText FT_PAGE
    {
        Pos = MAP_APPFONT ( 6 , 6 ) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "Anzahl Seiten:" ;
        Text [ ENGLISH ] = "Number of pages:" ;
        Text [ norwegian ] = "Number of pages:" ;
        Text [ italian ] = "Numero di pagine:" ;
        Text [ portuguese_brazilian ] = "Número de páginas:" ;
        Text [ portuguese ] = "Número de páginas:" ;
        Text [ finnish ] = "Sivuja:" ;
        Text [ danish ] = "Antal sider:" ;
        Text [ french ] = "Nombre de pages :" ;
        Text [ swedish ] = "Antal sidor:" ;
        Text [ dutch ] = "Aantal pagina's:" ;
        Text [ spanish ] = "Número de páginas:" ;
        Text [ english_us ] = "Number of Pages:" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "Ò³ÃæÊýÄ¿£º";
        Text[ russian ] = "Êîëè÷åñòâî ñòðàíèö:";
        Text[ polish ] = "Liczba stron:";
        Text[ japanese ] = "Íß°¼Þ‘”:";
        Text[ chinese_traditional ] = "¼Æ¥Ø ­¶¡G";
        Text[ arabic ] = "ÚÏÏ ÇáÕÝÍÇÊ:";
        Text[ greek ] = "Áñéèìüò óåëßäùí:";
        Text[ korean ] = "ÆäÀÌÁö ¼ö:";
        Text[ turkish ] = "Sayfa:";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_TABLE
    {
        Pos = MAP_APPFONT ( 6 , 22 ) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "Anzahl Tabellen:" ;
        Text [ ENGLISH ] = "Number of tables:" ;
        Text [ norwegian ] = "Number of tables:" ;
        Text [ italian ] = "Numero di tabelle:" ;
        Text [ portuguese_brazilian ] = "Número de tabelas:" ;
        Text [ portuguese ] = "Número de tabelas:" ;
        Text [ finnish ] = "Taulukoita:" ;
        Text [ danish ] = "Antal tabeller:" ;
        Text [ french ] = "Nombre de tableaux :" ;
        Text [ swedish ] = "Antal tabeller:" ;
        Text [ dutch ] = "Aantal tabellen:" ;
        Text [ spanish ] = "Número de tablas:" ;
        Text [ english_us ] = "Number of Tables:" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "±í¸ñÊýÄ¿£º";
        Text[ russian ] = "Êîëè÷åñòâî òàáëèö:";
        Text[ polish ] = "Liczba tabel:";
        Text[ japanese ] = "•\\”:";
        Text[ chinese_traditional ] = "ªí®æ¼Æ¥Ø¡G";
        Text[ arabic ] = "ÚÏÏ ÇáÌÏÇæá:";
        Text[ greek ] = "Áñéèìüò ðéíÜêùí:";
        Text[ korean ] = "Ç¥ °³¼ö:";
        Text[ turkish ] = "Tablo:";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_GRF
    {
        Pos = MAP_APPFONT ( 6 , 38 ) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "Anzahl Grafiken:" ;
        Text [ ENGLISH ] = "Number of graphics:" ;
        Text [ norwegian ] = "Number of graphics:" ;
        Text [ italian ] = "Numero di immagini:" ;
        Text [ portuguese_brazilian ] = "Número de gráficos:" ;
        Text [ portuguese ] = "Número de imagens:" ;
        Text [ finnish ] = "Kuvia:" ;
        Text [ danish ] = "Antal billeder:" ;
        Text [ french ] = "Nombre d'images :" ;
        Text [ swedish ] = "Antal grafiker:" ;
        Text [ dutch ] = "Aantal afbeeldingen:" ;
        Text [ spanish ] = "Número de imágenes:" ;
        Text [ english_us ] = "Number of Graphics:" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "ͼÐÎÊýÄ¿£º";
        Text[ russian ] = "Êîëè÷åñòâî ðèñóíêîâ:";
        Text[ polish ] = "Liczba grafik:";
        Text[ japanese ] = "¸Þ×̨¯¸‚̐”:";
        Text[ chinese_traditional ] = "¼Æ¥Ø ¹Ï¤ù¡G";
        Text[ arabic ] = "ÚÏÏ ÇáÑÓæãÇÊ:";
        Text[ greek ] = "Áñéèìüò ãñáöéêþí:";
        Text[ korean ] = "±×·¡ÇÈ °³¼ö:";
        Text[ turkish ] = "Grafik:";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_OLE
    {
        Pos = MAP_APPFONT ( 6 , 54 ) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "Anzahl OLE-Objekte:" ;
        Text [ ENGLISH ] = "Number of OLE objects:" ;
        Text [ norwegian ] = "Number of OLE objects:" ;
        Text [ italian ] = "Numero di oggetti OLE:" ;
        Text [ portuguese_brazilian ] = "Número de objetos OLE:" ;
        Text [ portuguese ] = "Número de objectos OLE:" ;
        Text [ finnish ] = "OLE-objekteja:" ;
        Text [ danish ] = "Antal OLE-objekter:" ;
        Text [ french ] = "Nombre d'objets OLE :" ;
        Text [ swedish ] = "Antal OLE-objekt:" ;
        Text [ dutch ] = "Aantal OLE-objecten:" ;
        Text [ spanish ] = "Número de objetos OLE:" ;
        Text [ english_us ] = "Number of OLE Objects:" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "OLE ¶ÔÏóÊýÄ¿£º";
        Text[ russian ] = "Êîëè÷åñòâî îáúåêòîâ OLÅ:";
        Text[ polish ] = "Liczba obiektów OLE:";
        Text[ japanese ] = "OLEµÌÞ¼Þª¸Ä‚̐”:";
        Text[ chinese_traditional ] = "¼Æ¥Ø OLE-ª«¥ó¡G";
        Text[ arabic ] = "ÚÏÏ ßÇÆäÇÊ OLE:";
        Text[ greek ] = "Áñéèìüò áíôéêåéìÝíùí OLE:";
        Text[ korean ] = "OLE °³Ã¼ °³¼ö:";
        Text[ turkish ] = "OLE nesneleri:";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_PARA
    {
        Pos = MAP_APPFONT ( 6 , 70 ) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? Anzahl Absätze: : Anzahl Absõtze: */
        Text = "Anzahl Absätze:" ;
        Text [ ENGLISH ] = "Number of paragraphs:" ;
        Text [ norwegian ] = "Number of paragraphs:" ;
        Text [ italian ] = "Numero di paragrafi:" ;
        Text [ portuguese_brazilian ] = "Número de parágrafos:" ;
        Text [ portuguese ] = "Número de parágrafos:" ;
        Text [ finnish ] = "Kappaleita:" ;
        Text [ danish ] = "Antal afsnit:" ;
        Text [ french ] = "Nombre de paragraphes :" ;
        Text [ swedish ] = "Antal stycken:" ;
        Text [ dutch ] = "Aantal alinea's:" ;
        Text [ spanish ] = "Número de párrafos:" ;
        Text [ english_us ] = "Number of Paragraphs:" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "¶ÎÂäÊýÄ¿£º";
        Text[ russian ] = "Êîëè÷åñòâî àáçàöåâ:";
        Text[ polish ] = "Liczba akapitów:";
        Text[ japanese ] = "’i—ސ”:";
        Text[ chinese_traditional ] = "¼Æ¥Ø ¬q¸¨¡G";
        Text[ arabic ] = "ÚÏÏ ÇáÝÞÑÇÊ:";
        Text[ greek ] = "Áñéèìüò ðáñáãñÜöùí:";
        Text[ korean ] = "´Ü¶ô °³¼ö:";
        Text[ turkish ] = "Paragraf:";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_WORD
    {
        Pos = MAP_APPFONT ( 6 , 86 ) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? Anzahl Wörter: : Anzahl W÷rter: */
        Text = "Anzahl Wörter:" ;
        Text [ ENGLISH ] = "Number of words:" ;
        Text [ norwegian ] = "Number of words:" ;
        Text [ italian ] = "Numero di parole:" ;
        Text [ portuguese_brazilian ] = "Número de palavras:" ;
        Text [ portuguese ] = "Número de palavras:" ;
        Text [ finnish ] = "Sanoja:" ;
        Text [ danish ] = "Antal ord:" ;
        Text [ french ] = "Nombre de mots :" ;
        Text [ swedish ] = "Antal ord:" ;
        Text [ dutch ] = "Aantal woorden:" ;
        Text [ spanish ] = "Número de palabras:" ;
        Text [ english_us ] = "Number of Words:" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "µ¥´ÊÊýÄ¿£º";
        Text[ russian ] = "Êîëè÷åñòâî ñëîâ:";
        Text[ polish ] = "Liczba s³ów:";
        Text[ japanese ] = "Œê”:";
        Text[ chinese_traditional ] = "¼Æ¥Ø ¦r¡G";
        Text[ arabic ] = "ÚÏÏ ÇáßáãÇÊ:";
        Text[ greek ] = "Áñéèìüò ëÝîåùí:";
        Text[ korean ] = "´Ü¾î °³¼ö:";
        Text[ turkish ] = "Sözcük:";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_WORD_DELIM
    {
        Pos = MAP_APPFONT ( 144 , 86 ) ;
        Size = MAP_APPFONT ( 57 , 10 ) ;
        Text = "~Trenner" ;
        Text [ ENGLISH ] = "Delimiter" ;
        Left = TRUE ;
        Text [ portuguese ] = "~Separador" ;
        Text [ english_us ] = "Separator" ;
        Text [ portuguese_brazilian ] = "Trenner" ;
        Text [ swedish ] = "Avgränsare" ;
        Text [ danish ] = "Separator" ;
        Text [ italian ] = "~Separatore" ;
        Text [ spanish ] = "Sepa~rador" ;
        Text [ french ] = "~Séparateur" ;
        Text [ dutch ] = "~Scheidingsteken" ;
        Text[ chinese_simplified ] = "·Ö¸ô·û";
        Text[ russian ] = "Ðàçäåëèòåëü";
        Text[ polish ] = "Separator";
        Text[ japanese ] = "‹æØ‚è‹L†";
        Text[ chinese_traditional ] = "³s¦r²Å";
        Text[ arabic ] = "ÝÇÕá";
        Text[ greek ] = "Äéá÷ùñéóôéêü";
        Text[ korean ] = "±¸ºÐÀÚ";
        Text[ turkish ] = "~Ayýrma iþareti";
        Text[ language_user1 ] = " ";
    };
    Edit ED_WORD_DELIM
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 204 , 85 ) ;
        Size = MAP_APPFONT ( 50 , 12 ) ;
        TabStop = TRUE ;
    };
    FixedText FT_CHAR
    {
        Pos = MAP_APPFONT ( 6 , 102 ) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "Anzahl Zeichen:" ;
        Text [ ENGLISH ] = "Number of chars:" ;
        Text [ norwegian ] = "Number of chars:" ;
        Text [ italian ] = "Numero di caratteri:" ;
        Text [ portuguese_brazilian ] = "Número de caracteres:" ;
        Text [ portuguese ] = "Número de caracteres:" ;
        Text [ finnish ] = "Merkkejä:" ;
        Text [ danish ] = "Antal tegn:" ;
        Text [ french ] = "Nombre de caractères :" ;
        Text [ swedish ] = "Antal tecken:" ;
        Text [ dutch ] = "Aantal tekens:" ;
        Text [ spanish ] = "Número de caracteres:" ;
        Text [ english_us ] = "Number of Characters:" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "×Ö·ûÊýÄ¿£º";
        Text[ russian ] = "Êîëè÷åñòâî çíàêîâ:";
        Text[ polish ] = "Liczba znaków:";
        Text[ japanese ] = "•¶Žš”:";
        Text[ chinese_traditional ] = "¼Æ¥Ø ¦r¤¸¡G";
        Text[ arabic ] = "ÚÏÏ ÇáÃÍÑÝ:";
        Text[ greek ] = "Áñéèìüò ÷áñáêôÞñùí:";
        Text[ korean ] = "¹®ÀÚ °³¼ö:";
        Text[ turkish ] = "Karakter:";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_LINE
    {
        Pos = MAP_APPFONT ( 6 , 118 ) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "Anzahl Zeilen:" ;
        Text [ ENGLISH ] = "Number of lines:" ;
        Text [ portuguese ] = "Número de linhas:" ;
        Text [ english_us ] = "Number of Lines:" ;
        Text [ portuguese_brazilian ] = "Anzahl Zeilen:" ;
        Text [ swedish ] = "Antal rader:" ;
        Text [ danish ] = "Antal rækker:" ;
        Text [ italian ] = "Numero di righe:" ;
        Text [ spanish ] = "Número de líneas:" ;
        Text [ french ] = "Nombre de lignes :" ;
        Text [ dutch ] = "Aantal regels:" ;
        Text[ chinese_simplified ] = "ÐÐÊý£º";
        Text[ russian ] = "Êîëè÷åñòâî ñòðîê:";
        Text[ polish ] = "Liczba wierszy:";
        Text[ japanese ] = "s”:";
        Text[ chinese_traditional ] = "¼Æ¥Ø ¦æ¡G";
        Text[ arabic ] = "ÚÏÏ ÇáÃÓØÑ:";
        Text[ greek ] = "Áñéèìüò ãñáììþí:";
        Text[ korean ] = "¼± °³¼ö:";
        Text[ turkish ] = "Satýr:";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_PAGE_COUNT
    {
        Pos = MAP_APPFONT ( 114 , 6 ) ;
        Size = MAP_APPFONT ( 27 , 10 ) ;
        Left = TRUE ;
    };
    FixedText FT_TABLE_COUNT
    {
        Pos = MAP_APPFONT ( 114 , 22 ) ;
        Size = MAP_APPFONT ( 27 , 10 ) ;
        Left = TRUE ;
    };
    FixedText FT_GRF_COUNT
    {
        Pos = MAP_APPFONT ( 114 , 38 ) ;
        Size = MAP_APPFONT ( 27 , 10 ) ;
        Left = TRUE ;
    };
    FixedText FT_OLE_COUNT
    {
        Pos = MAP_APPFONT ( 114 , 54 ) ;
        Size = MAP_APPFONT ( 27 , 10 ) ;
        Left = TRUE ;
    };
    FixedText FT_PARA_COUNT
    {
        Pos = MAP_APPFONT ( 114 , 70 ) ;
        Size = MAP_APPFONT ( 27 , 10 ) ;
        Left = TRUE ;
    };
    FixedText FT_WORD_COUNT
    {
        Pos = MAP_APPFONT ( 114 , 86 ) ;
        Size = MAP_APPFONT ( 27 , 10 ) ;
        Left = TRUE ;
    };
    FixedText FT_CHAR_COUNT
    {
        Pos = MAP_APPFONT ( 114 , 102 ) ;
        Size = MAP_APPFONT ( 27 , 10 ) ;
        Left = TRUE ;
    };
    FixedText FT_LINE_COUNT
    {
        Pos = MAP_APPFONT ( 114 , 118 ) ;
        Size = MAP_APPFONT ( 27 , 10 ) ;
        Left = TRUE ;
        Text = "..." ;
    };
    PushButton PB_PDATE
    {
        Pos = MAP_APPFONT ( 204 , 116 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        Text = "~Aktualisieren" ;
        Text [ ENGLISH ] = "~Update" ;
        Text [ portuguese ] = "~Actualizar" ;
        Text [ english_us ] = "~Update" ;
        Text [ portuguese_brazilian ] = "Aktualisieren" ;
        Text [ swedish ] = "Uppd~atera" ;
        Text [ danish ] = "Opdater" ;
        Text [ italian ] = "Aggiorna" ;
        Text [ spanish ] = "~Actualizar" ;
        Text [ french ] = "~Actualiser" ;
        Text [ dutch ] = "~Actualiseren" ;
        Text[ chinese_simplified ] = "¸üÐÂ(~U)";
        Text[ russian ] = "Îáíîâèòü";
        Text[ polish ] = "Aktualizuj";
        Text[ japanese ] = "XV‚·‚é(~U)";
        Text[ chinese_traditional ] = "§ó·s(~U)";
        Text[ arabic ] = "ÊÍÏíË";
        Text[ greek ] = "~ÅíçìÝñùóç";
        Text[ korean ] = "¾÷ µ¥ÀÌÆ®(~U)";
        Text[ turkish ] = "~Güncelle";
        Text[ language_user1 ] = " ";
    };
};
diff --git a/sw/source/ui/dialog/macassgn.cxx b/sw/source/ui/dialog/macassgn.cxx
new file mode 100644
index 0000000..a273197
--- /dev/null
+++ b/sw/source/ui/dialog/macassgn.cxx
@@ -0,0 +1,293 @@
/*************************************************************************
 *
 *  $RCSfile: macassgn.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:34 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "hintids.hxx"

#define _SVSTDARR_STRINGSDTOR
#include <svtools/svstdarr.hxx>

#ifndef _SVX_HTMLMODE_HXX
#include <svx/htmlmode.hxx>
#endif
#ifndef _SVX_SVXIDS_HRC //autogen
#include <svx/svxids.hrc>
#endif
#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif
#ifndef _SV_MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif

#include "swtypes.hxx"
#include "wrtsh.hxx"
#include "viewopt.hxx"
#include "macassgn.hxx"
#include "swevent.hxx"
#include "docsh.hxx"
#include "globals.hrc"


SvStringsDtor* __EXPORT _GetRangeHdl( _SfxMacroTabPage*, const String& );


SwMacroAssignDlg::SwMacroAssignDlg( Window* pParent, SfxItemSet& rSet,
                                        DlgEventType eType )
    : SfxMacroAssignDlg( pParent, rSet )
{
     // TabPage holen
    SwMacroAssignDlg::AddEvents( *(SfxSmallMacroTabPage*) GetTabPage(), eType );
}


SwMacroAssignDlg::~SwMacroAssignDlg()
{
}


void SwMacroAssignDlg::AddEvents( SfxSmallMacroTabPage& rPg, DlgEventType eType )
{
    const SfxItemSet& rSet = rPg.GetItemSet();

    BOOL bHtmlMode = FALSE;
    USHORT nHtmlMode = ::GetHtmlMode((const SwDocShell*)SfxObjectShell::Current());
    bHtmlMode = nHtmlMode & HTMLMODE_ON ? TRUE : FALSE;

    switch( eType )
    {
    case MACASSGN_TEXTBAUST:            // Textbausteine
        rPg.SetGetRangeLink( &_GetRangeHdl );
        rPg.AddEvent( String( SW_RES(STR_EVENT_START_INS_GLOSSARY) ),
                            SW_EVENT_START_INS_GLOSSARY );
        rPg.AddEvent( String( SW_RES(STR_EVENT_END_INS_GLOSSARY) ),
                            SW_EVENT_END_INS_GLOSSARY);
        // damit der neue Handler aktiv wird!
        rPg.Reset( rSet );
        break;
    case MACASSGN_ALLFRM:
    case MACASSGN_GRAPHIC:          // Grafiken
        {
            rPg.AddEvent( String( SW_RES(STR_EVENT_IMAGE_ERROR) ),
                                SVX_EVENT_IMAGE_ERROR);
            rPg.AddEvent( String( SW_RES(STR_EVENT_IMAGE_ABORT) ),
                                SVX_EVENT_IMAGE_ABORT);
            rPg.AddEvent( String( SW_RES(STR_EVENT_IMAGE_LOAD) ),
                                SVX_EVENT_IMAGE_LOAD);
        }
        // kein break;
    case MACASSGN_FRMURL:           // Frm - URL-Attribute
        {
            if( !bHtmlMode &&
                (MACASSGN_FRMURL == eType || MACASSGN_ALLFRM == eType))
            {
                rPg.AddEvent( String( SW_RES( STR_EVENT_FRM_KEYINPUT_A ) ),
                                SW_EVENT_FRM_KEYINPUT_ALPHA );
                rPg.AddEvent( String( SW_RES( STR_EVENT_FRM_KEYINPUT_NOA ) ),
                                SW_EVENT_FRM_KEYINPUT_NOALPHA );
                rPg.AddEvent( String( SW_RES( STR_EVENT_FRM_RESIZE ) ),
                                SW_EVENT_FRM_RESIZE );
                rPg.AddEvent( String( SW_RES( STR_EVENT_FRM_MOVE ) ),
                                SW_EVENT_FRM_MOVE );
            }
        }
        // kein break;
    case MACASSGN_OLE:              // OLE
        {
            if( !bHtmlMode )
                rPg.AddEvent( String( SW_RES(STR_EVENT_OBJECT_SELECT) ),
                                SW_EVENT_OBJECT_SELECT );
        }
        // kein break;
    case MACASSGN_INETFMT:          // INetFmt-Attribute
        {
            rPg.AddEvent( String( SW_RES(STR_EVENT_MOUSEOVER_OBJECT) ),
                                SFX_EVENT_MOUSEOVER_OBJECT );
            rPg.AddEvent( String( SW_RES(STR_EVENT_MOUSECLICK_OBJECT) ),
                                SFX_EVENT_MOUSECLICK_OBJECT);
            rPg.AddEvent( String( SW_RES(STR_EVENT_MOUSEOUT_OBJECT) ),
                                SFX_EVENT_MOUSEOUT_OBJECT);
        }
        break;
    }
}


BOOL SwMacroAssignDlg::INetFmtDlg( Window* pParent, SwWrtShell& rSh,
                                    SvxMacroItem*& rpINetItem )
{
    BOOL bRet = FALSE;
    SfxItemSet aSet( rSh.GetAttrPool(), RES_FRMMACRO, RES_FRMMACRO );
    SvxMacroItem aItem;
    if( !rpINetItem )
        rpINetItem = new SvxMacroItem;
    else
        aItem.SetMacroTable( rpINetItem->GetMacroTable() );

    aSet.Put( aItem );

    SwMacroAssignDlg aMacDlg( pParent, aSet, MACASSGN_INETFMT );
    if( aMacDlg.Execute() == RET_OK )
    {
        const SfxItemSet* pOutSet = aMacDlg.GetOutputItemSet();
        const SfxPoolItem* pItem;
        if( SFX_ITEM_SET == pOutSet->GetItemState( RES_FRMMACRO, FALSE, &pItem ))
        {
            rpINetItem->SetMacroTable( ((SvxMacroItem*)pItem)->GetMacroTable() );
            bRet = TRUE;
        }
    }
    return bRet;
}


SvStringsDtor* __EXPORT _GetRangeHdl( _SfxMacroTabPage* pTbPg, const String& rLanguage )
{
    SvStringsDtor* pNew = new SvStringsDtor;

    SfxApplication* pSfxApp = SFX_APP();
    if ( !rLanguage.EqualsAscii(SVX_MACRO_LANGUAGE_JAVASCRIPT) )
    {
        pSfxApp->EnterBasicCall();

        String* pNewEntry = new String( pSfxApp->GetName() );
        pNew->Insert( pNewEntry, pNew->Count() );

        TypeId aType( TYPE( SwDocShell ));
        SfxObjectShell* pDoc = SfxObjectShell::GetFirst( &aType );
        while( pDoc )
        {
            pNewEntry = new String( pDoc->GetTitle() );
            pNew->Insert( pNewEntry, pNew->Count() );
            pDoc = SfxObjectShell::GetNext( *pDoc, &aType );
        }
        pSfxApp->LeaveBasicCall();
    }

    return pNew;
}


/*************************************************************************

      $Log: not supported by cvs2svn $
      Revision 1.40  2000/09/18 16:05:20  willem.vandorp
      OpenOffice header added.

      Revision 1.39  2000/04/20 12:55:01  os
      GetName() returns String&

      Revision 1.38  2000/02/11 14:44:39  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.37  1998/07/17 08:17:28  OS
      SfxxSmallMacroTabPage einsetzen #52809#


      Rev 1.36   17 Jul 1998 10:17:28   OS
   SfxxSmallMacroTabPage einsetzen #52809#

      Rev 1.35   10 Jul 1998 11:04:14   MBA
   GetRangeHdl jetzt mit String

      Rev 1.34   28 Nov 1997 17:57:10   MA
   includes

      Rev 1.33   25 Nov 1997 10:43:20   MA
   includes

      Rev 1.32   03 Nov 1997 13:12:26   MA
   precomp entfernt

      Rev 1.31   06 Aug 1997 11:59:46   TRI
   VCL: includes

      Rev 1.30   07 Apr 1997 14:24:32   MH
   chg: header

      Rev 1.29   21 Feb 1997 09:23:42   OS
   ALL-define fuer Rahmenvorlagen

      Rev 1.28   18 Feb 1997 17:07:52   JP
   Erweiterung fuer Events am Frame

      Rev 1.27   28 Jan 1997 16:31:18   OS
   HtmlMode mit GetHtmlMode ermitteln

      Rev 1.26   27 Jan 1997 15:34:46   OS
   InetFmtDlg returnt Bool

      Rev 1.25   08 Jan 1997 11:01:00   OS
   SID_HTML_MODE jetzt UInt16Item

      Rev 1.24   04 Dec 1996 15:04:52   JP
   SW_EVENT -> SVX_EVENT/SFX_EVENT

      Rev 1.23   03 Dec 1996 19:56:32   JP
   Macrozuweisen-TabPage/-Dialog aus dem Writer exportiert, eigene Ableitung fuer setzen der Events

*************************************************************************/


diff --git a/sw/source/ui/dialog/makefile.mk b/sw/source/ui/dialog/makefile.mk
new file mode 100644
index 0000000..e9d1329
--- /dev/null
+++ b/sw/source/ui/dialog/makefile.mk
@@ -0,0 +1,114 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:34 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=..$/..$/..

PRJNAME=sw
TARGET=dialog

AUTOSEG=true

PROJECTPCH=ui_pch
PDBTARGET=ui_pch
PROJECTPCHSOURCE=..\ui_1st\ui_pch

# future: DEMO\dialog.srs

# --- Settings -----------------------------------------------------

.INCLUDE :  $(PRJ)$/inc$/swpre.mk
.INCLUDE :  settings.mk
.INCLUDE :  $(PRJ)$/inc$/sw.mk

# --- Files --------------------------------------------------------

CXXFILES = \
        addrdlg.cxx \
        abstract.cxx \
        ascfldlg.cxx \
        docstdlg.cxx \
        ltmpdlg.cxx \
        macassgn.cxx \
        regionsw.cxx

SRCFILES =  \
        abstract.src \
        ascfldlg.src \
        dialog.src \
        docstdlg.src \
        macassgn.src \
        ltmpdlg.src \
        regionsw.src

SLOFILES =  \
        $(SLO)$/abstract.obj \
        $(SLO)$/addrdlg.obj \
        $(SLO)$/ascfldlg.obj \
        $(SLO)$/docstdlg.obj \
        $(SLO)$/ltmpdlg.obj \
        $(SLO)$/macassgn.obj \
        $(SLO)$/regionsw.obj

# --- Tagets -------------------------------------------------------

.INCLUDE :  target.mk

diff --git a/sw/source/ui/dialog/regionsw.cxx b/sw/source/ui/dialog/regionsw.cxx
new file mode 100644
index 0000000..537feca
--- /dev/null
+++ b/sw/source/ui/dialog/regionsw.cxx
@@ -0,0 +1,2365 @@
/*************************************************************************
 *
 *  $RCSfile: regionsw.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:34 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _UITOOL_HXX
#include <uitool.hxx>
#endif
#ifndef SVTOOLS_URIHELPER_HXX
#include <svtools/urihelper.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _DRAG_HXX //autogen
#include <vcl/drag.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SOT_FORMATS_HXX //autogen
#include <sot/formats.hxx>
#endif
#ifndef _PASSWD_HXX //autogen
#include <sfx2/passwd.hxx>
#endif
#ifndef _SFX_DOCFILT_HACK_HXX //autogen
#include <sfx2/docfilt.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SFXDOCFILE_HXX //autogen
#include <sfx2/docfile.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _LINKMGR_HXX
#include <so3/linkmgr.hxx>
#endif
#ifndef _SVX_SIZEITEM_HXX //autogen
#define ITEMID_SIZE 0
#include <svx/sizeitem.hxx>
#endif
#ifndef _OFA_HTMLCFG_HXX
#include <offmgr/htmlcfg.hxx>
#endif

#ifndef _BOOKMRK_HXX //autogen
#include <bookmrk.hxx>
#endif
#ifndef _SECTION_HXX
#include <section.hxx>
#endif
#ifndef _DOCARY_HXX
#include <docary.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>                      // fuers SwSectionFmt-Array
#endif
#ifndef _SW3IO_HXX
#include <sw3io.hxx>                    //fuer lcl_ReadSections
#endif
#ifndef _REGIONSW_HXX
#include <regionsw.hxx>
#endif
#ifndef _BASESH_HXX
#include <basesh.hxx>
#endif
#ifndef _WDOCSH_HXX
#include <wdocsh.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _SWUNDO_HXX
#include <swundo.hxx>                   // fuer Undo-Ids
#endif
#ifndef _COLUMN_HXX
#include <column.hxx>
#endif
#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _SVX_BACKGRND_HXX //autogen
#include <svx/backgrnd.hxx>
#endif


#ifndef _HELPID_H
#include <helpid.h>
#endif
#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _REGIONSW_HRC
#include <regionsw.hrc>
#endif
#ifndef _COMCORE_HRC
#include <comcore.hrc>
#endif
#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif

#define FILE_NAME_LENGTH 17


SV_IMPL_OP_PTRARR_SORT( SectReprArr, SectReprPtr )


USHORT lcl_GetRegion( const String& rRegionName, SwWrtShell& rWrtShell );
void lcl_ReadSections( SwWrtShell& rSh, SfxMedium& rMedium, ComboBox& rBox );

/* -----------------25.06.99 15:38-------------------

 --------------------------------------------------*/
class SwTestPasswdDlg : public SfxPasswordDialog
{
public:
        SwTestPasswdDlg(Window* pParent) :
        SfxPasswordDialog(pParent)
        {
            SetHelpId(HID_DLG_PASSWD_SECTION);
        }


};
/*----------------------------------------------------------------------------
 Beschreibung: User Data Klasse fuer Bereichsinformationen
----------------------------------------------------------------------------*/

SectRepr::SectRepr( USHORT nPos, SwSection& rSect ) :
    aSection( CONTENT_SECTION, aEmptyStr ),
    bSelected(FALSE),
    bIsCondition(rSect.GetCondition().Len() > 0)
{
    aSection = rSect;
    bContent = aSection.GetLinkFileName().Len() == 0;
    nArrPos=nPos;
    SwSectionFmt *pFmt = rSect.GetFmt();
    if( pFmt )
    {
        aCol = pFmt->GetCol();
        aBrush = pFmt->GetBackground();
        aFtnNtAtEnd = pFmt->GetFtnAtTxtEnd();
        aEndNtAtEnd = pFmt->GetEndAtTxtEnd();
        aBalance.SetValue(pFmt->GetBalancedColumns().GetValue());
    }
}


void SectRepr::SetFile( const String& rFile )
{
    String sNewFile( INetURLObject::decode( rFile, INET_HEX_ESCAPE,
                                           INetURLObject::DECODE_WITH_CHARSET,
                                        RTL_TEXTENCODING_UTF8 ));
    String sOldFileName( aSection.GetLinkFileName() );
    String sSub( sOldFileName.GetToken( 2, cTokenSeperator ) );

    if( rFile.Len() || sSub.Len() )
    {
        sNewFile += cTokenSeperator;
        if( rFile.Len() ) // Filter nur mit FileName
            sNewFile += sOldFileName.GetToken( 1, cTokenSeperator );

        sNewFile += cTokenSeperator;
        sNewFile += sSub;
    }

    aSection.SetLinkFileName( sNewFile );

    if( rFile.Len() || sSub.Len() )
        aSection.SetType( FILE_LINK_SECTION );
    else
        aSection.SetType( CONTENT_SECTION );
}


void SectRepr::SetFilter( const String& rFilter )
{
    String sNewFile;
    String sOldFileName( aSection.GetLinkFileName() );
    String sFile( sOldFileName.GetToken( 0, cTokenSeperator ) );
    String sSub( sOldFileName.GetToken( 2, cTokenSeperator ) );

    if( sFile.Len() )
        (((( sNewFile = sFile ) += cTokenSeperator ) += rFilter )
                                += cTokenSeperator ) += sSub;
    else if( sSub.Len() )
        (( sNewFile = cTokenSeperator ) += cTokenSeperator ) += sSub;

    aSection.SetLinkFileName( sNewFile );

    if( sNewFile.Len() )
        aSection.SetType( FILE_LINK_SECTION );
}

void SectRepr::SetSubRegion(const String& rSubRegion)
{
    String sNewFile;
    String sOldFileName( aSection.GetLinkFileName() );
    String sFilter( sOldFileName.GetToken( 1, cTokenSeperator ) );
    sOldFileName = sOldFileName.GetToken( 0, cTokenSeperator );

    if( rSubRegion.Len() || sOldFileName.Len() )
        (((( sNewFile = sOldFileName ) += cTokenSeperator ) += sFilter )
                                       += cTokenSeperator ) += rSubRegion;

    aSection.SetLinkFileName( sNewFile );

    if( rSubRegion.Len() || sOldFileName.Len() )
        aSection.SetType( FILE_LINK_SECTION );
    else
        aSection.SetType( CONTENT_SECTION );
}


String SectRepr::GetFile() const
{
    String sLinkFile( aSection.GetLinkFileName() );
    if( sLinkFile.Len() )
    {
#ifdef DDE_AVAILABLE
        if( DDE_LINK_SECTION == aSection.GetType() )
        {
            USHORT n = sLinkFile.SearchAndReplace( cTokenSeperator, ' ' );
            sLinkFile.SearchAndReplace( cTokenSeperator, ' ',  n );
        }
        else
#endif
            sLinkFile = sLinkFile.GetToken( 0, cTokenSeperator );
    }
    return sLinkFile;
}


String SectRepr::GetSubRegion() const
{
    String sLinkFile( aSection.GetLinkFileName() );
    if( sLinkFile.Len() )
        sLinkFile = sLinkFile.GetToken( 2, cTokenSeperator );
    return sLinkFile;
}




/*----------------------------------------------------------------------------
 Beschreibung: Dialog Bearbeiten Bereiche
----------------------------------------------------------------------------*/

//---------------------------------------------------------------------

SwEditRegionDlg::SwEditRegionDlg( Window* pParent, SwWrtShell& rWrtSh )
    : SfxModalDialog( pParent, SW_RES(MD_EDIT_REGION) ),
    pAktEntry( 0 ),
    rSh( rWrtSh ),
#ifdef DDE_AVAILABLE
    aDDECB              ( this, SW_RES( CB_DDE ) ) ,
    aDDECommandFT       ( this, SW_RES( FT_DDE ) ) ,
#endif
    aConditionED        ( this, SW_RES( ED_CONDITION ) ),
    aOK                 ( this, SW_RES( PB_OK ) ),
    aOptionsPB          ( this, SW_RES( PB_OPTIONS ) ),
    aDismiss            ( this, SW_RES( CB_DISMISS ) ),
    aHelp               ( this, SW_RES( PB_HELP ) ),
    aNameFT             ( this, SW_RES( FT_RNAME ) ),
    aCurName            ( this, SW_RES( ED_RANAME ) ),
    aProtectCB          ( this, SW_RES( CB_PROTECT ) ),
    aPasswdCB           ( this, SW_RES( CB_PASSWD ) ),
    aHideCB             ( this, SW_RES( CB_HIDE ) ),
    aCondCB             ( this, SW_RES( CB_CONDITION ) ),
    aFileCB             ( this, SW_RES( CB_FILE ) ),
    aFilePB             ( this, SW_RES( PB_FILE ) ),
    aFileNameFT         ( this, SW_RES( FT_FILE ) ) ,
    aFileNameED         ( this, SW_RES( ED_FILE ) ),
    aSubRegionFT        ( this, SW_RES( FT_SUBREG ) ) ,
    aSubRegionED        ( this, SW_RES( LB_SUBREG ) ) ,
    aGroupBoxName       ( this, SW_RES( GB_EDIT_SECTION ) ),
    aCancel             ( this, SW_RES( PB_CANCEL ) ),
    aProtHideBM         ( SW_RES( BMP_REG_PROT_HIDE ) ),
    aProtNoHideBM       ( SW_RES( BMP_REG_PROT_NOHIDE ) ),
    aNoProtHideBM       ( SW_RES( BMP_REG_NOPROT_HIDE ) ),
    aNoProtNoHideBM     ( SW_RES( BMP_REG_NOPROT_NOHIDE ) ),
    aExpNode            ( SW_RES( BMP_REG_EXPNODE ) ),
    aCollNode           ( SW_RES( BMP_REG_COLLNODE ) ),
    aGroupBoxOptions    ( this, SW_RES( GB_EDIT_OPTIONS ) ),
    aTree               ( this, SW_RES( TLB_SECTION ))
{
    FreeResource();
    bWeb = 0 != PTR_CAST( SwWebDocShell, rSh.GetView().GetDocShell() );
    bIsPasswd=FALSE;
    bIsPasswdSet=FALSE;

    aTree.SetSelectHdl      ( LINK( this, SwEditRegionDlg, GetFirstEntryHdl));
    aTree.SetDeselectHdl    ( LINK( this, SwEditRegionDlg, DeselectHdl));
    aCurName.SetModifyHdl   ( LINK( this, SwEditRegionDlg, NameEditHdl));
    aConditionED.SetModifyHdl( LINK( this, SwEditRegionDlg, ConditionEditHdl));
    aOK.SetClickHdl         ( LINK( this, SwEditRegionDlg, OkHdl));
    aPasswdCB.SetClickHdl   ( LINK( this, SwEditRegionDlg, ChangePasswdHdl));
    aHideCB.SetClickHdl     ( LINK( this, SwEditRegionDlg, ChangeHideHdl));
    aOptionsPB.Show();
    aOptionsPB.SetClickHdl  ( LINK( this, SwEditRegionDlg, OptionsHdl));
    aCondCB.SetClickHdl     ( LINK( this, SwEditRegionDlg, ChangeCondHdl));
    aProtectCB.SetClickHdl  ( LINK( this, SwEditRegionDlg, ChangeProtectHdl));
    aDismiss.SetClickHdl    ( LINK( this, SwEditRegionDlg, ChangeDismissHdl));
    aFileCB.SetClickHdl     ( LINK( this, SwEditRegionDlg, UseFileHdl ));
    aFilePB.SetClickHdl     ( LINK( this, SwEditRegionDlg, FileSearchHdl ));
    aFileNameED.SetModifyHdl( LINK( this, SwEditRegionDlg, FileNameHdl ));
    aSubRegionED.SetModifyHdl( LINK( this, SwEditRegionDlg, FileNameHdl ));

    aTree.SetHelpId(HID_REGION_TREE);
    aTree.SetSelectionMode( MULTIPLE_SELECTION );
    aTree.SetWindowBits(WB_HASBUTTONSATROOT|WB_CLIPCHILDREN|WB_HSCROLL);
    aTree.SetFont(Application::GetSettings().GetStyleSettings().GetAppFont());
    aTree.SetNodeBitmaps( aExpNode,aCollNode );
    aTree.SetSpaceBetweenEntries(0);

    if(bWeb)
    {
        aConditionED    .Hide();
        aPasswdCB       .Hide();
        aHideCB         .Hide();
        aCondCB         .Hide();
#ifdef DDE_AVAILABLE
    aDDECB              .Hide();
    aDDECommandFT       .Hide();
#endif
    }

#ifdef DDE_AVAILABLE
    aDDECB.SetClickHdl      ( LINK( this, SwEditRegionDlg, DDEHdl ));
#endif

    //Array enthaelt Bitmaps nach den Eigenschaften Hide und Protect
    aBmpArr[0]= aNoProtNoHideBM;
    aBmpArr[1]= aProtNoHideBM;
    aBmpArr[2]= aNoProtHideBM;
    aBmpArr[3]= aProtHideBM;

    //Ermitteln der vorhandenen Bereiche
    pCurrSect = rSh.GetCurrSection();
    RecurseList( 0, 0 );
    //falls der Cursor nicht in einem Bereich steht,
    //wird immer der erste selektiert
    if( !aTree.FirstSelected() && aTree.First() )
        aTree.Select( aTree.First() );
    aTree.Show();
}

/*-----------------18.09.97 08:09-------------------

--------------------------------------------------*/
void SwEditRegionDlg::SetPassword(const String& rPassWd)
{
    aNewPasswd = rPassWd;
    aPasswdCB.Check(rPassWd.Len() > 0);
}
/*---------------------------------------------------------------------
    Beschreibung: Durchsuchen nach Child-Sections, rekursiv
---------------------------------------------------------------------*/

void SwEditRegionDlg::RecurseList( const SwSectionFmt* pFmt, SvLBoxEntry* pEntry )
{
    SwSection* pSect;
    SvLBoxEntry* pSelEntry = 0;

    if (!pFmt)
    {
        SvLBoxEntry* pEntry;
        const SwSectionFmt* pFmt;
        USHORT nCount=rSh.GetSectionFmtCount();
        for ( USHORT n=0; n < nCount; n++ )
        {
            SectionType eTmpType;
            if( !( pFmt = &rSh.GetSectionFmt(n))->GetParent() &&
                pFmt->IsInNodesArr() &&
                (eTmpType = pFmt->GetSection()->GetType()) != TOX_CONTENT_SECTION
                && TOX_HEADER_SECTION != eTmpType )
            {
                SectRepr* pSectRepr = new SectRepr( n,
                                            *(pSect=pFmt->GetSection()) );
                Bitmap aBM=BuildBitmap( pSect->IsProtect(),pSect->IsHidden());
                pEntry = aTree.InsertEntry( pSect->GetName(), aBM, aBM );
                pEntry->SetUserData(pSectRepr);
                RecurseList( pFmt, pEntry );
                if (pEntry->HasChilds())
                    aTree.Expand(pEntry);
                if (pCurrSect==pSect)
                    aTree.Select(pEntry);
            }
        }
    }
    else
    {
        SwSections aTmpArr;
        SvLBoxEntry* pNEntry;
        USHORT nCnt = pFmt->GetChildSections(aTmpArr,SORTSECT_POS);
        if( nCnt )
        {
            for( USHORT n = 0; n < nCnt; ++n )
            {
                SectionType eTmpType;
                const SwSectionFmt* pFmt = aTmpArr[n]->GetFmt();
                if( pFmt->IsInNodesArr() &&
                    (eTmpType = pFmt->GetSection()->GetType()) != TOX_CONTENT_SECTION
                    && TOX_HEADER_SECTION != eTmpType )
                {
                    pSect=aTmpArr[n];
                    SectRepr* pSectRepr=new SectRepr(
                                    FindArrPos( pSect->GetFmt() ), *pSect );
                    Bitmap aBM=BuildBitmap( pSect->IsProtect(),
                                            pSect->IsHidden());
                    pNEntry=aTree.InsertEntry( pSect->GetName(),aBM,aBM,pEntry);
                    pNEntry->SetUserData(pSectRepr);
                    RecurseList( aTmpArr[n]->GetFmt(), pNEntry );
                    if( pNEntry->HasChilds())
                        aTree.Expand(pNEntry);
                    if (pCurrSect==pSect)
                        pSelEntry = pNEntry;
                }
            }
        }
    }
    if(0 != pSelEntry)
    {
        aTree.MakeVisible(pSelEntry);
        aTree.Select(pSelEntry);
    }
}
/*---------------------------------------------------------------------

---------------------------------------------------------------------*/

USHORT SwEditRegionDlg::FindArrPos(const SwSectionFmt* pFmt )
{
    USHORT nCount=rSh.GetSectionFmtCount();
    for (USHORT i=0;i<nCount;i++)
        if (pFmt==&rSh.GetSectionFmt(i))
            return i;

    DBG_ERROR(  "SectionFormat nicht in der Liste" );
    return USHRT_MAX;
}
/*---------------------------------------------------------------------
 Beschreibung:
---------------------------------------------------------------------*/

SwEditRegionDlg::~SwEditRegionDlg( )
{
    SvLBoxEntry* pEntry = aTree.First();
    while( pEntry )
    {
        delete (SectRepr*)pEntry->GetUserData();
        pEntry = aTree.Next( pEntry );
    }

    aSectReprArr.DeleteAndDestroy( 0, aSectReprArr.Count() );
}

/*---------------------------------------------------------------------
    Beschreibung:   Selektierte Eintrag in der TreeListBox wird im
                    Edit-Fenster angezeigt
                    Bei Multiselektion werden einige Controls disabled
---------------------------------------------------------------------*/

IMPL_LINK( SwEditRegionDlg, GetFirstEntryHdl, SvTreeListBox *, pBox )
{
    SvLBoxEntry* pEntry=pBox->FirstSelected();
    aHideCB     .Enable(TRUE);
    aProtectCB  .Enable(TRUE);
    aFileCB     .Enable(TRUE);

    if( 1 < pBox->GetSelectionCount() )
    {
        aHideCB.EnableTriState( TRUE );
        aProtectCB.EnableTriState( TRUE );
        aCondCB.EnableTriState( TRUE );
        aFileCB.EnableTriState( TRUE );

        BOOL bHiddenValid       = TRUE;
        BOOL bProtectValid      = TRUE;
        BOOL bIsConditionValid  = TRUE;
        BOOL bConditionValid    = TRUE;
        BOOL bHidden            = TRUE;
        BOOL bProtect           = TRUE;
        String sCondition;
        BOOL bFirst             = TRUE;
        BOOL bFileValid         = TRUE;
        BOOL bFile              = TRUE;

        SvLBoxEntry* pEntry = pBox->FirstSelected();
        while( pEntry )
        {
            SectRepr* pRepr=(SectRepr*) pEntry->GetUserData();
            if(bFirst)
            {
                sCondition = pRepr->GetCondition();
                bHidden         = pRepr->IsHidden();
                bProtect        = pRepr->IsProtect();
                bFile           = pRepr->GetSectionType() != CONTENT_SECTION;
            }
            else
            {
                String sTemp(pRepr->GetCondition());
                if(sCondition != sTemp)
                    bConditionValid = FALSE;
                bHiddenValid      = bHidden == pRepr->IsHidden();
                bProtectValid     = bProtect == pRepr->IsProtect();
                bIsConditionValid = (sTemp.Len() > 0) == (sCondition.Len() > 0);
                bFileValid        = (pRepr->GetSectionType() != CONTENT_SECTION) == bFile;
            }
            pEntry = pBox->NextSelected(pEntry);
            bFirst = FALSE;
        }

        aHideCB.SetState( !bHiddenValid ? STATE_DONTKNOW :
                    bHidden ? STATE_CHECK : STATE_NOCHECK);
        aProtectCB.SetState( !bProtectValid ? STATE_DONTKNOW :
                    bProtect ? STATE_CHECK : STATE_NOCHECK);
        aCondCB.SetState(!bIsConditionValid  ? STATE_DONTKNOW :
                    sCondition.Len() > 0 ? STATE_CHECK : STATE_NOCHECK);
        aFileCB.SetState(!bFileValid ? STATE_DONTKNOW :
                    bFile ? STATE_CHECK : STATE_NOCHECK);

        if(bConditionValid)
            aConditionED.SetText(sCondition);
        else
        {
//          aConditionED.SetText(aEmptyStr);
            aConditionED.Enable(FALSE);
        }

        aFilePB.Enable(FALSE);
        aFileNameFT .Enable(FALSE);
        aFileNameED .Enable(FALSE);
        aSubRegionFT.Enable(FALSE);
        aSubRegionED.Enable(FALSE);
        aNameFT     .Enable(FALSE);
        aCurName    .Enable(FALSE);
        aOptionsPB  .Enable(FALSE);
#ifdef DDE_AVAILABLE
    aDDECB              .Enable(FALSE);
    aDDECommandFT       .Enable(FALSE);
#endif

    }
    else if (pEntry )
    {
        aNameFT     .Enable(TRUE);
        aCurName    .Enable(TRUE);
        aOptionsPB  .Enable(TRUE);
        SectRepr* pRepr=(SectRepr*) pEntry->GetUserData();
        aConditionED.SetText(pRepr->GetCondition());
        aHideCB.Enable();
        aHideCB.SetState(pRepr->IsHidden() ? STATE_CHECK : STATE_NOCHECK);
        aCondCB.SetState( 0 != aConditionED.GetText().Len() ? STATE_CHECK : STATE_NOCHECK);
        BOOL bHide = STATE_CHECK == aHideCB.GetState();
        aCondCB.Enable(bHide);
        aConditionED.Enable(STATE_CHECK == aCondCB.GetState() && bHide);

        aOK.Enable();
        aPasswdCB.Enable();
        aCurName.SetText(pBox->GetEntryText(pEntry));
        aCurName.Enable();
        aDismiss.Enable();
        String aFile = pRepr->GetFile();
        String sSub = pRepr->GetSubRegion();
        if(aFile.Len()||sSub.Len())
        {
            aFileCB.Check(TRUE);
            aFileNameED.SetText(aFile);
            aSubRegionED.SetText(sSub);
#ifdef DDE_AVAILABLE
            aDDECB.Check(pRepr->GetSectionType() == DDE_LINK_SECTION );
#endif
        }
        else
        {
            aFileCB.Check(FALSE);
            aFileNameED.SetText(aFile);
#ifdef DDE_AVAILABLE
            aDDECB.Enable(FALSE);
            aDDECB.Check(FALSE);
#endif
        }
        UseFileHdl(&aFileCB);
#ifdef DDE_AVAILABLE
        DDEHdl( &aDDECB );
#endif
        aProtectCB.SetState(pRepr->IsProtect() ? STATE_CHECK : STATE_NOCHECK);
        aProtectCB.Enable();
    }
    return 0;
}
/*-----------------28.06.97 09:19-------------------

--------------------------------------------------*/
IMPL_LINK( SwEditRegionDlg, DeselectHdl, SvTreeListBox *, pBox )
{
    if( !pBox->GetSelectionCount() )
    {
        aHideCB     .Enable(FALSE);
        aProtectCB  .Enable(FALSE);
        aCondCB     .Enable(FALSE);
        aConditionED.Enable(FALSE);
        aFileCB     .Enable(FALSE);
        aFilePB     .Enable(FALSE);
        aFileNameFT  .Enable(FALSE);
        aFileNameED  .Enable(FALSE);
        aSubRegionFT .Enable(FALSE);
        aSubRegionED .Enable(FALSE);
        aNameFT      .Enable(FALSE);
        aCurName     .Enable(FALSE);
#ifdef DDE_AVAILABLE
    aDDECB              .Enable(FALSE);
    aDDECommandFT       .Enable(FALSE);
#endif

        UseFileHdl(&aFileCB);
#ifdef DDE_AVAILABLE
        DDEHdl( &aDDECB );
#endif
    }
    return 0;
}

/*---------------------------------------------------------------------
    Beschreibung:   Im OkHdl werden die veraenderten Einstellungen
                    uebernommen und aufgehobene Bereiche geloescht
---------------------------------------------------------------------*/

IMPL_LINK( SwEditRegionDlg, OkHdl, CheckBox *, EMPTYARG )
{
    // JP 13.03.96:
    // temp. Array weil sich waehrend des aendern eines Bereiches die
    // Position innerhalb des "Core-Arrays" verschieben kann:
    //  - bei gelinkten Bereichen, wenn sie weitere SubBereiche haben oder
    //    neu erhalten.
    // JP 30.05.97: StartUndo darf natuerlich auch erst nach dem Kopieren
    //              der Formate erfolgen (ClearRedo!)

    const SwSectionFmts& rDocFmts = rSh.GetDoc()->GetSections();
    SwSectionFmts aOrigArray( 0, 5 );
    aOrigArray.Insert( &rDocFmts, 0 );

    rSh.StartAllAction();
    rSh.StartUndo( UNDO_CHGSECTION );
    rSh.ResetSelect( 0,FALSE );
    SvLBoxEntry* pEntry = aTree.First();

    while( pEntry )
    {
        SectReprPtr pRepr = (SectReprPtr) pEntry->GetUserData();
        SwSectionFmt* pFmt = aOrigArray[ pRepr->GetArrPos() ];
        USHORT nNewPos = rDocFmts.GetPos( pFmt );
        if( USHRT_MAX != nNewPos )
        {
            SfxItemSet* pSet = pFmt->GetAttrSet().Clone( FALSE );
            if( pFmt->GetCol() != pRepr->GetCol() )
                pSet->Put( pRepr->GetCol() );

            if( pFmt->GetBackground(FALSE) != pRepr->GetBackground() )
                pSet->Put( pRepr->GetBackground() );

            if( pFmt->GetFtnAtTxtEnd(FALSE) != pRepr->GetFtnNtAtEnd() )
                pSet->Put( pRepr->GetFtnNtAtEnd() );

            if( pFmt->GetEndAtTxtEnd(FALSE) != pRepr->GetEndNtAtEnd() )
                pSet->Put( pRepr->GetEndNtAtEnd() );

            if( pFmt->GetBalancedColumns() != pRepr->GetBalance() )
                pSet->Put( pRepr->GetBalance() );

            //the condition depends on the string and the setting of the CheckBox/bIsCondition flag
            if(!pRepr->IsConditionValid() && pRepr->GetCondition().Len())
                pRepr->SetCondition(aEmptyStr);

            rSh.ChgSection( nNewPos, pRepr->GetSection(),
                            pSet->Count() ? pSet : 0 );
            delete pSet;
        }
        pEntry = aTree.Next( pEntry );
    }

    for(USHORT i = aSectReprArr.Count(); i; )
    {
        SwSectionFmt* pFmt = aOrigArray[ aSectReprArr[ --i ]->GetArrPos() ];
        USHORT nNewPos = rDocFmts.GetPos( pFmt );
        if( USHRT_MAX != nNewPos )
            rSh.DelSectionFmt( nNewPos );
    }
    rSh.ChgSectionPasswd(aNewPasswd);

    aOrigArray.Remove( 0, aOrigArray.Count() );

    //JP 21.05.97: EndDialog muss vor Ende der EndAction gerufen werden,
    //              sonst kann es ScrollFehler geben.
    EndDialog(RET_OK);

    rSh.EndUndo( UNDO_CHGSECTION );
    rSh.EndAllAction();

    return 0;
}
/*---------------------------------------------------------------------
 Beschreibung: Toggle protect
---------------------------------------------------------------------*/

IMPL_LINK( SwEditRegionDlg, ChangeProtectHdl, TriStateBox *, pBox )
{
    pBox->EnableTriState( FALSE );
    SvLBoxEntry* pEntry=aTree.FirstSelected();
    DBG_ASSERT(pEntry,"kein Entry gefunden");
    while( pEntry )
    {
        SectReprPtr pRepr = (SectReprPtr) pEntry->GetUserData();
        pRepr->SetProtect(STATE_CHECK == pBox->GetState());
        Bitmap& aBmp=BuildBitmap(STATE_CHECK == pBox->GetState(),
                                    STATE_CHECK == aHideCB.GetState());
        aTree.SetExpandedEntryBmp(pEntry,aBmp);
        aTree.SetCollapsedEntryBmp(pEntry,aBmp);
        pEntry = aTree.NextSelected(pEntry);
    }
    return 0;
}
/*---------------------------------------------------------------------
 Beschreibung: Toggle hide
---------------------------------------------------------------------*/

IMPL_LINK( SwEditRegionDlg, ChangeHideHdl, TriStateBox *, pBox )
{
    pBox->EnableTriState( FALSE );
    SvLBoxEntry* pEntry=aTree.FirstSelected();
    DBG_ASSERT(pEntry,"kein Entry gefunden");
    while( pEntry )
    {
        SectReprPtr pRepr = (SectReprPtr) pEntry->GetUserData();
        pRepr->SetHidden(STATE_CHECK == pBox->GetState());
        Bitmap& aBmp=BuildBitmap(STATE_CHECK == aProtectCB.GetState(),
                                    STATE_CHECK == pBox->GetState());
        aTree.SetExpandedEntryBmp(pEntry,aBmp);
        aTree.SetCollapsedEntryBmp(pEntry,aBmp);

        pEntry = aTree.NextSelected(pEntry);
    }

    BOOL bHide = STATE_CHECK == pBox->GetState();
    aConditionED.Enable(bHide && STATE_CHECK == aCondCB.GetState());
    aCondCB.Enable(bHide);
    if(!bHide)
    {
        aCondCB.SetState(STATE_NOCHECK);
        ChangeCondHdl(&aCondCB);
    }
    return 0;
}
/*---------------------------------------------------------------------

---------------------------------------------------------------------*/

IMPL_LINK( SwEditRegionDlg, ChangeCondHdl, TriStateBox *, pBox )
{
    pBox->EnableTriState( FALSE );
    BOOL bCond = STATE_CHECK == pBox->GetState();
    aConditionED.Enable(bCond);
    SvLBoxEntry* pEntry=aTree.FirstSelected();
    DBG_ASSERT(pEntry,"kein Entry gefunden");
    while( pEntry )
    {
        SectReprPtr pRepr = (SectReprPtr) pEntry->GetUserData();
        pRepr->SetConditionValid(bCond);
        pEntry = aTree.NextSelected(pEntry);
    }
    if(bCond)
        aConditionED.GrabFocus();
    return 0;
}
/*---------------------------------------------------------------------
 Beschreibung: selektierten Bereich aufheben
---------------------------------------------------------------------*/

IMPL_LINK( SwEditRegionDlg, ChangeDismissHdl, CheckBox *, EMPTYARG )
{
    SvLBoxEntry* pEntry = aTree.FirstSelected();
    SvLBoxEntry* pChild;
    SvLBoxEntry* pParent;
    //zuerst alle selektierten markieren
    while(pEntry)
    {
        const SectReprPtr pSectRepr = (SectRepr*)pEntry->GetUserData();
        pSectRepr->SetSelected();
        pEntry = aTree.NextSelected(pEntry);
    }
    pEntry = aTree.FirstSelected();
    // dann loeschen
    while(pEntry)
    {
        const SectReprPtr pSectRepr = (SectRepr*)pEntry->GetUserData();
        SvLBoxEntry* pRemove = 0;
        BOOL bRestart = FALSE;
        if(pSectRepr->IsSelected())
        {
            aSectReprArr.Insert( pSectRepr );
            while( (pChild = aTree.FirstChild(pEntry) )!= 0 )
            {
                //durch das Umhaengen muss wieder am Anfang aufgesetzt werden
                bRestart = TRUE;
                pParent=aTree.GetParent(pEntry);
                aTree.GetModel()->Move(pChild, pParent, aTree.GetModel()->GetRelPos(pEntry));
            }
            pRemove = pEntry;
        }
        if(bRestart)
            pEntry = aTree.First();
        else
            pEntry = aTree.Next(pEntry);
        if(pRemove)
            aTree.GetModel()->Remove( pRemove );
    }

    if ( (pEntry=aTree.FirstSelected()) == 0 )
    {
        aConditionED.   Enable(FALSE);
        aDismiss.       Enable(FALSE);
        aCurName.       Enable(FALSE);
        aProtectCB.     Enable(FALSE);
        aPasswdCB.      Enable(FALSE);
        aHideCB.        Enable(FALSE);
        aProtectCB.     SetState(STATE_NOCHECK);
        aPasswdCB.      Check(FALSE);
        aHideCB.        SetState(STATE_NOCHECK);
        aFileCB.        Check(FALSE);
        //sonst liegt der Focus auf dem HelpButton
        aOK.GrabFocus();
        UseFileHdl(&aFileCB);
    }
    return 0;
}
/*---------------------------------------------------------------------
 Beschreibung: CheckBox mit Datei verknuepfenï
---------------------------------------------------------------------*/

IMPL_LINK( SwEditRegionDlg, UseFileHdl, CheckBox *, pBox )
{
    SvLBoxEntry* pEntry = aTree.FirstSelected();
    pBox->EnableTriState(FALSE);
    BOOL bMulti = 1 < aTree.GetSelectionCount();
    BOOL bFile = pBox->IsChecked();
    if(pEntry)
    {
        while(pEntry)
        {
            const SectReprPtr pSectRepr = (SectRepr*)pEntry->GetUserData();
            BOOL bContent = pSectRepr->IsContent();
            if( pBox->IsChecked() && bContent && rSh.HasSelection() )
            {
                if( RET_NO == QueryBox( this, SW_RES(QB_CONNECT) ).Execute() )
                    pBox->Check( FALSE );
            }
            if( bFile )
                pSectRepr->SetContent(FALSE);
            else
            {
                pSectRepr->SetFile(aEmptyStr);
                pSectRepr->SetSubRegion(aEmptyStr);
                pSectRepr->SetFilePasswd(aEmptyStr);
            }

            pEntry = aTree.NextSelected(pEntry);
        }
        aFileNameFT.Enable(bFile && ! bMulti);
        aFileNameED.Enable(bFile && ! bMulti);
        aFilePB.Enable(bFile && ! bMulti);
        aSubRegionED.Enable(bFile && ! bMulti);
        aSubRegionFT.Enable(bFile && ! bMulti);
#ifdef DDE_AVAILABLE
        aDDECommandFT.Enable(bFile && ! bMulti);
        aDDECB.Enable(bFile && ! bMulti);
#endif
        if( bFile )
        {
            aProtectCB.SetState(STATE_CHECK);
            aFileNameED.GrabFocus();

        }
        else
        {
#ifdef DDE_AVAILABLE
            aDDECB.Check(FALSE);
            DDEHdl(&aDDECB);
#endif
//          aFileNameED.SetText(aEmptyStr);
            aSubRegionED.SetText(aEmptyStr);
        }
    }
    else
    {
        pBox->Check(FALSE);
        pBox->Enable(FALSE);
        aFilePB.Enable(FALSE);
        aFileNameED.Enable(FALSE);
        aFileNameFT.Enable(FALSE);
        aSubRegionED.Enable(FALSE);
        aSubRegionFT.Enable(FALSE);
#ifdef DDE_AVAILABLE
        aDDECB.Check(FALSE);
        aDDECB.Enable(FALSE);
        aDDECommandFT.Enable(FALSE);
#endif
    }
    return 0;
}

/*---------------------------------------------------------------------
    Beschreibung: Dialog Datei einfuegen rufen
---------------------------------------------------------------------*/

IMPL_LINK( SwEditRegionDlg, FileSearchHdl, PushButton *, EMPTYARG )
{
    SfxMedium* pMed;
    String sFileName, sFilterName, sFilePasswd;
    if( GetFileFilterNameDlg( *this, sFileName, &sFilePasswd,
                                &sFilterName, &pMed ))
    {
        aFileNameED.SetText( sFileName );
        ::lcl_ReadSections( rSh, *pMed, aSubRegionED );
        delete pMed;
    }

    SvLBoxEntry* pEntry = aTree.FirstSelected();
    DBG_ASSERT(pEntry,"kein Entry gefunden");
    if(pEntry)
    {
        SectReprPtr pSectRepr = (SectRepr*)pEntry->GetUserData();
        pSectRepr->SetFile( sFileName );
        pSectRepr->SetFilter( sFilterName );
        pSectRepr->SetFilePasswd( sFilePasswd );
    }
    return 0;
}

/*---------------------------------------------------------------------
    Beschreibung:
---------------------------------------------------------------------*/

IMPL_LINK( SwEditRegionDlg, OptionsHdl, PushButton *, EMPTYARG )
{
    SvLBoxEntry* pEntry = aTree.FirstSelected();

    if(pEntry)
    {
        SectReprPtr pSectRepr = (SectRepr*)pEntry->GetUserData();
        SfxItemSet aSet(rSh.GetView().GetPool(),
                            RES_COL, RES_COL,
                            RES_COLUMNBALANCE, RES_COLUMNBALANCE,
                            RES_BACKGROUND, RES_BACKGROUND,
                            RES_FRM_SIZE, RES_FRM_SIZE,
                            SID_ATTR_PAGE_SIZE, SID_ATTR_PAGE_SIZE,
                            RES_LR_SPACE, RES_LR_SPACE,
                            RES_FTN_AT_TXTEND, RES_END_AT_TXTEND,
                            0);

        aSet.Put( pSectRepr->GetCol() );
        aSet.Put( pSectRepr->GetBackground() );
        aSet.Put( pSectRepr->GetFtnNtAtEnd() );
        aSet.Put( pSectRepr->GetEndNtAtEnd() );
        aSet.Put( pSectRepr->GetBalance() );

        const SwSectionFmts& rDocFmts = rSh.GetDoc()->GetSections();
        SwSectionFmts aOrigArray( 0, 5 );
        aOrigArray.Insert( &rDocFmts, 0 );

        SwSectionFmt* pFmt = aOrigArray[pSectRepr->GetArrPos()];
        long nWidth = rSh.GetSectionWidth(*pFmt);
        aOrigArray.Remove( 0, aOrigArray.Count() );
        if (!nWidth)
            nWidth = USHRT_MAX;

        aSet.Put(SwFmtFrmSize(ATT_VAR_SIZE, nWidth));
        aSet.Put(SvxSizeItem(SID_ATTR_PAGE_SIZE, Size(nWidth, nWidth)));

        SwSectionPropertyTabDialog aTabDlg(this, aSet, rSh);
        if(RET_OK == aTabDlg.Execute())
        {
            const SfxItemSet* pOutSet = aTabDlg.GetOutputItemSet();
            if( pOutSet && pOutSet->Count() )
            {
                const SfxPoolItem *pColItem, *pBrushItem,
                                  *pFtnItem, *pEndItem, *pBalanceItem;
                SfxItemState eColState = pOutSet->GetItemState(
                                        RES_COL, FALSE, &pColItem );
                SfxItemState eBrushState = pOutSet->GetItemState(
                                        RES_BACKGROUND, FALSE, &pBrushItem );
                SfxItemState eFtnState = pOutSet->GetItemState(
                                        RES_FTN_AT_TXTEND, FALSE, &pFtnItem );
                SfxItemState eEndState = pOutSet->GetItemState(
                                        RES_END_AT_TXTEND, FALSE, &pEndItem );
                SfxItemState eBalanceState = pOutSet->GetItemState(
                                        RES_COLUMNBALANCE, FALSE, &pBalanceItem );
                if( SFX_ITEM_SET == eColState ||
                    SFX_ITEM_SET == eBrushState ||
                    SFX_ITEM_SET == eFtnState ||
                    SFX_ITEM_SET == eEndState ||
                    SFX_ITEM_SET == eBalanceState)
                {
                    SvLBoxEntry* pEntry = aTree.FirstSelected();
                    while( pEntry )
                    {
                        SectReprPtr pRepr = (SectReprPtr)pEntry->GetUserData();
                        if( SFX_ITEM_SET == eColState )
                            pRepr->GetCol() = *(SwFmtCol*)pColItem;
                        if( SFX_ITEM_SET == eBrushState )
                            pRepr->GetBackground() = *(SvxBrushItem*)pBrushItem;
                        if( SFX_ITEM_SET == eFtnState )
                            pRepr->GetFtnNtAtEnd() = *(SwFmtFtnAtTxtEnd*)pFtnItem;
                        if( SFX_ITEM_SET == eEndState )
                            pRepr->GetEndNtAtEnd() = *(SwFmtEndAtTxtEnd*)pEndItem;
                        if( SFX_ITEM_SET == eBalanceState )
                            pRepr->GetBalance().SetValue(((SwFmtNoBalancedColumns*)pBalanceItem)->GetValue());

                        pEntry = aTree.NextSelected(pEntry);
                    }
                }
            }
        }
    }

    return 0;
}

/*---------------------------------------------------------------------
    Beschreibung:   Uebernahme des Dateinamen oder
                    des verknuepften Bereichs
---------------------------------------------------------------------*/

IMPL_LINK( SwEditRegionDlg, FileNameHdl, Edit *, pEdit )
{
    SvLBoxEntry* pEntry=aTree.FirstSelected();
    DBG_ASSERT(pEntry,"kein Entry gefunden");
    SectReprPtr pSectRepr = (SectRepr*)pEntry->GetUserData();
    if(pEdit == &aFileNameED)
    {
        BOOL bDDe = FALSE;
#ifdef DDE_AVAILABLE
        bDDe = aDDECB.IsChecked();
#endif
        if( bDDe )
        {
            String sLink( pEdit->GetText() );
            USHORT nPos = 0;
            while( STRING_NOTFOUND != (nPos = sLink.SearchAscii( "  ", nPos )) )
                sLink.Erase( nPos--, 1 );

            nPos = sLink.SearchAndReplace( ' ', cTokenSeperator );
            sLink.SearchAndReplace( ' ', cTokenSeperator, nPos );

            pSectRepr->GetSection().SetLinkFileName( sLink );
            pSectRepr->GetSection().SetType( DDE_LINK_SECTION );
        }
        else
        {
            String sTmp(pEdit->GetText());
            if(sTmp.Len())
                sTmp = URIHelper::SmartRelToAbs( sTmp );
            pSectRepr->SetFile( sTmp );
            pSectRepr->SetFilePasswd( aEmptyStr );
        }
    }
    else
    {
        pSectRepr->SetSubRegion( pEdit->GetText() );
    }
    return 0;
}
/*---------------------------------------------------------------------
    Beschreibung:
---------------------------------------------------------------------*/
#ifdef DDE_AVAILABLE

IMPL_LINK( SwEditRegionDlg, DDEHdl, CheckBox*, pBox )
{
    SvLBoxEntry* pEntry=aTree.FirstSelected();
    if(pEntry)
    {
        BOOL bFile = aFileCB.IsChecked();
        SectReprPtr pSectRepr = (SectRepr*)pEntry->GetUserData();
        BOOL bDDE = pBox->IsChecked();
        if(bDDE)
        {
            aFileNameFT.Hide();
            aDDECommandFT.Enable();
            aDDECommandFT.Show();
            aSubRegionFT.Hide();
            aSubRegionED.Hide();
            if(FILE_LINK_SECTION == pSectRepr->GetSectionType() )
            {
                pSectRepr->SetFile(aEmptyStr);
                aFileNameED.SetText(aEmptyStr);
                pSectRepr->SetFilePasswd( aEmptyStr );
            }
            pSectRepr->SetSectionType( DDE_LINK_SECTION );
        }
        else
        {
            aDDECommandFT.Hide();
            aFileNameFT.Enable(bFile);
            aFileNameFT.Show();
            aSubRegionED.Show();
            aSubRegionFT.Show();
            aSubRegionED.Enable(bFile);
            aSubRegionFT.Enable(bFile);
            aSubRegionED.Enable(bFile);
            if(DDE_LINK_SECTION == pSectRepr->GetSectionType() )
            {
                pSectRepr->SetSectionType( FILE_LINK_SECTION );
                pSectRepr->SetFile(aEmptyStr);
                pSectRepr->SetFilePasswd( aEmptyStr );
                aFileNameED.SetText(aEmptyStr);
            }
        }
        aFilePB.Enable(bFile && !bDDE);
    }
    return 0;
}
#endif
/*---------------------------------------------------------------------

---------------------------------------------------------------------*/

IMPL_LINK( SwEditRegionDlg, ChangePasswdHdl, CheckBox *, pBox )
{
    if (pBox->IsChecked())
    {
        if(!bIsPasswd&&!aNewPasswd.Len())
        {
            bIsPasswd = FALSE;
            SwTestPasswdDlg aPasswdDlg(this);
            aPasswdDlg.ShowExtras(SHOWEXTRAS_CONFIRM);
//          aPasswdDlg.SetHelpId(HID_DLG_PASSWD_SECTION);
            if (aPasswdDlg.Execute())
            {
                aNewPasswd = aPasswdDlg.GetPassword();
                if(aPasswdDlg.GetConfirm() == aNewPasswd)
                    bIsPasswd = TRUE;
                else
                    InfoBox(pBox, SW_RES(REG_WRONG_PASSWD_REPEAT)).Execute();
            }
        }
        if(!bIsPasswd)
            pBox->Check(FALSE);
    }
    if( !pBox->IsChecked() )
    {
        aNewPasswd = aEmptyStr;
        bIsPasswd = FALSE;
    }
    return 0;
}
/*---------------------------------------------------------------------
    Beschreibung:   Aktueller Bereichsname wird sofort beim editieren
                    in die TreeListBox eingetragen, mit leerem String
                    kein Ok()
---------------------------------------------------------------------*/

IMPL_LINK( SwEditRegionDlg, NameEditHdl, Edit *, EMPTYARG )
{
    SvLBoxEntry* pEntry=aTree.FirstSelected();
    DBG_ASSERT(pEntry,"kein Entry gefunden");
    if (pEntry)
    {
        String  aName = aCurName.GetText();
        Bitmap& aBmp=BuildBitmap(STATE_CHECK == aProtectCB.GetState(),
                                    STATE_CHECK == aHideCB.GetState());
        aTree.SetEntryText(pEntry,aName);
        aTree.SetExpandedEntryBmp(pEntry,aBmp);
        aTree.SetCollapsedEntryBmp(pEntry,aBmp);
        SectReprPtr pRepr = (SectReprPtr) pEntry->GetUserData();
        pRepr->GetSection().SetName(aName);

        aOK.Enable(aName.Len() != 0);
    }
    return 0;
}
/*---------------------------------------------------------------------

---------------------------------------------------------------------*/

IMPL_LINK( SwEditRegionDlg, ConditionEditHdl, Edit *, pEdit )
{
    SvLBoxEntry* pEntry=aTree.FirstSelected();
    DBG_ASSERT(pEntry,"kein Entry gefunden");
    while( pEntry )
    {
        SectReprPtr pRepr = (SectReprPtr)pEntry->GetUserData();
        pRepr->SetCondition (pEdit->GetText());
        pEntry = aTree.NextSelected(pEntry);
    }
    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:   Bereiche einfuegen
 --------------------------------------------------------------------*/


void SwBaseShell::InsertRegionDialog(SfxRequest& rReq)
{
    SwWrtShell& rSh = GetShell();
    const SfxItemSet *pSet = rReq.GetArgs();

    SfxItemSet aSet(GetPool(),
            RES_COL, RES_COL,
            RES_COLUMNBALANCE, RES_COLUMNBALANCE,
            RES_BACKGROUND, RES_BACKGROUND,
            RES_FRM_SIZE, RES_FRM_SIZE,
            RES_FTN_AT_TXTEND, RES_END_AT_TXTEND,
            SID_ATTR_PAGE_SIZE, SID_ATTR_PAGE_SIZE,
            0);

    if (!pSet || pSet->Count()==0)
    {
        SwRect aRect;
        rSh.CalcBoundRect(aRect, FLY_IN_CNTNT);

        long nWidth = aRect.Width();
        aSet.Put(SwFmtFrmSize(ATT_VAR_SIZE, nWidth));

        // Hoehe=Breite fuer konsistentere Vorschau (analog zu Bereich bearbeiten)
        aSet.Put(SvxSizeItem(SID_ATTR_PAGE_SIZE, Size(nWidth, nWidth)));
        SwInsertSectionTabDialog aTabDlg(&GetView().GetViewFrame()->GetWindow(),aSet , rSh);
        aTabDlg.Execute();
    }
    else
    {
        const SfxPoolItem *pItem = 0;
        String aTmpStr = rSh.GetUniqueSectionName();

        SwSection   aSection(CONTENT_SECTION,aTmpStr);
        rReq.SetReturnValue(SfxStringItem(FN_INSERT_REGION, aTmpStr));

        aSet.Put( *pSet );
        if(SFX_ITEM_SET == pSet->GetItemState(SID_ATTR_COLUMNS, FALSE, &pItem))
        {
            SwFmtCol aCol;
            SwRect aRect;
            rSh.CalcBoundRect(aRect, FLY_IN_CNTNT);
            long nWidth = aRect.Width();

            USHORT nCol = ((SfxUInt16Item *)pItem)->GetValue();
            if(nCol)
            {
                aCol.Init( nCol, 0, nWidth );
                aSet.Put(aCol);
            }
        }
        else if(SFX_ITEM_SET == pSet->GetItemState(RES_COL, FALSE, &pItem))
        {
            aSet.Put(*pItem);
        }
        rSh.InsertSection(aSection, aSet.Count() ? &aSet : 0);
    }
}

IMPL_STATIC_LINK( SwWrtShell, InsertRegionDialog, SwSection*, pSect )
{
    if( pSect )
    {
        SfxItemSet aSet(pThis->GetView().GetPool(),
                RES_COL, RES_COL,
                RES_BACKGROUND, RES_BACKGROUND,
                RES_FRM_SIZE, RES_FRM_SIZE,
                SID_ATTR_PAGE_SIZE, SID_ATTR_PAGE_SIZE,
                0);
        SwRect aRect;
        pThis->CalcBoundRect(aRect, FLY_IN_CNTNT);
        long nWidth = aRect.Width();
        aSet.Put(SwFmtFrmSize(ATT_VAR_SIZE, nWidth));
        // Hoehe=Breite fuer konsistentere Vorschau (analog zu Bereich bearbeiten)
        aSet.Put(SvxSizeItem(SID_ATTR_PAGE_SIZE, Size(nWidth, nWidth)));
        SwInsertSectionTabDialog aTabDlg(&pThis->GetView().GetViewFrame()->GetWindow(),aSet , *pThis);
        aTabDlg.SetSection(*pSect);
        aTabDlg.Execute();

        delete pSect;
    }
    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:   Bereich bearbeiten
 --------------------------------------------------------------------*/

void SwBaseShell::EditRegionDialog(SfxRequest& rReq)
{
    const SfxItemSet* pArgs = rReq.GetArgs();
    int nSlot = rReq.GetSlot();
    const SfxPoolItem* pItem = 0;
    if(pArgs)
        pArgs->GetItemState(nSlot, FALSE, &pItem);
    SwWrtShell& rWrtShell = GetShell();

    switch ( nSlot )
    {
        case FN_EDIT_REGION:
        {
            Window* pParentWin = &GetView().GetViewFrame()->GetWindow();
            BOOL bStart = TRUE;
            String sPasswdSect =  rWrtShell.GetSectionPasswd();
            if (sPasswdSect.Len())
            {
                SwTestPasswdDlg aPasswdDlg(pParentWin);
//                  aPasswdDlg.SetHelpId(HID_DLG_PASSWD_SECTION);
                aPasswdDlg.Execute();
                if ( aPasswdDlg.GetPassword() != sPasswdSect )
                {
                    bStart = FALSE;
                }
            }
            if(bStart)
            {
                SwEditRegionDlg* pEditRegionDlg = new SwEditRegionDlg(
                                        pParentWin, rWrtShell );
                pEditRegionDlg->SetPassword(sPasswdSect);
                    pEditRegionDlg->Execute();
                delete pEditRegionDlg;
            }
            else
                InfoBox(pParentWin, SW_RES(REG_WRONG_PASSWORD)).Execute();
        }
        break;
    }
}

/*--------------------------------------------------------------------
    Beschreibung:   Hilfsfunktion - Bereichsindex ermitteln
 --------------------------------------------------------------------*/

USHORT lcl_GetRegion( const String& rRegionName, SwWrtShell& rWrtShell )
{
    USHORT nCount = rWrtShell.GetSectionFmtCount();
    for(USHORT i=0; i< nCount; i++)
    {
        const SwSectionFmt& rFmt = rWrtShell.GetSectionFmt(i);
        if(rFmt.IsInNodesArr() && rFmt.GetSection()->GetName()
                == rRegionName)
            return i;
    }
    return USHRT_MAX;
}

/*--------------------------------------------------------------------
    Beschreibung:   Hilfsfunktion - Bereichsnamen aus dem Medium lesen
 --------------------------------------------------------------------*/

void lcl_ReadSections( SwWrtShell& rSh, SfxMedium& rMedium, ComboBox& rBox )
{
    rBox.Clear();
    if( rMedium.IsStorage() )
    {
        SvStorageRef aStor = rMedium.GetStorage();
            // ist das unser eigenes Format?
        if( aStor.Is() && (
            SOT_FORMATSTR_ID_STARWRITER_50 == aStor->GetFormat() ||
            SOT_FORMATSTR_ID_STARWRITER_40 == aStor->GetFormat() ||
            SOT_FORMATSTR_ID_STARWRITER_30 == aStor->GetFormat() ||
            SOT_FORMATSTR_ID_STARWRITERGLOB_50 == aStor->GetFormat() ||
            SOT_FORMATSTR_ID_STARWRITERGLOB_40 == aStor->GetFormat() ) )
        {
            // Dann noch die Fileformat-Version vom
            // Filter abholen.
            const SfxFilter* pFlt = rMedium.GetFilter();
            ASSERT( pFlt && pFlt->GetVersion(),
                    "Kein Filter oder Filter ohne FF-Version" );
            if( pFlt && pFlt->GetVersion() )
                aStor->SetVersion( (long)pFlt->GetVersion() );

            Sw3Io& rIo = *rSh.GetView().GetDocShell()->GetIoSystem();
            SvStringsDtor aArr( 10, 10 );
            if( !rIo.GetSectionList( &aStor, (SvStrings&)aArr ) && aArr.Count() )
            {
                for( USHORT n = 0; n < aArr.Count(); ++n )
                    rBox.InsertEntry( *aArr[ n ] );
            }
        }
    }
}
/* -----------------21.05.99 10:16-------------------
 *
 * --------------------------------------------------*/
SwInsertSectionTabDialog::SwInsertSectionTabDialog(
            Window* pParent, const SfxItemSet& rSet, SwWrtShell& rSh) :
    SfxTabDialog( pParent, SW_RES(DLG_INSERT_SECTION), &rSet ),
    rWrtSh(rSh),
    pToInsertSection(0)
{
    String sInsert(ResId(ST_INSERT));
    GetOKButton().SetText(sInsert);
    FreeResource();
    AddTabPage(TP_INSERT_SECTION, SwInsertSectionTabPage::Create, 0);
    AddTabPage(TP_COLUMN,   SwColumnPage::Create,    0);
    AddTabPage(TP_BACKGROUND,SvxBackgroundTabPage::Create,  0);
    AddTabPage(TP_SECTION_FTNENDNOTES, SwSectionFtnEndTabPage::Create, 0);

    OfaHtmlOptions* pHtmlOpt = OFF_APP()->GetHtmlOptions();
    long nHtmlMode = pHtmlOpt->GetExportMode();

    BOOL bWeb = 0 != PTR_CAST( SwWebDocShell, rSh.GetView().GetDocShell() );
    if(bWeb)
    {
        RemoveTabPage(TP_SECTION_FTNENDNOTES);
        if( HTML_CFG_NS30 != nHtmlMode && HTML_CFG_NS40 != nHtmlMode && HTML_CFG_WRITER != nHtmlMode)
            RemoveTabPage(TP_COLUMN);
    }
    SetCurPageId(TP_INSERT_SECTION);
}
/* -----------------21.05.99 10:17-------------------
 *
 * --------------------------------------------------*/
SwInsertSectionTabDialog::~SwInsertSectionTabDialog()
{
    delete pToInsertSection;
}
/* -----------------21.05.99 10:23-------------------
 *
 * --------------------------------------------------*/
void SwInsertSectionTabDialog::PageCreated( USHORT nId, SfxTabPage &rPage )
{
    if(TP_INSERT_SECTION == nId)
        ((SwInsertSectionTabPage&)rPage).SetWrtShell(rWrtSh);
    else if( TP_BACKGROUND == nId  )
        ((SvxBackgroundTabPage&)rPage).ShowSelector();
    else if( TP_COLUMN == nId )
    {
        const SwFmtFrmSize& rSize = (const SwFmtFrmSize&)GetInputSetImpl()->Get(RES_FRM_SIZE);
        ((SwColumnPage&)rPage).SetPageWidth(rSize.GetWidth());
        ((SwColumnPage&)rPage).ShowBalance(TRUE);
    }
}
/* -----------------21.05.99 13:08-------------------
 *
 * --------------------------------------------------*/

void SwInsertSectionTabDialog::SetSection(const SwSection& rSect)
{
    pToInsertSection = new SwSection(CONTENT_SECTION, aEmptyStr);
    *pToInsertSection = rSect;
}
/* -----------------21.05.99 13:10-------------------
 *
 * --------------------------------------------------*/
short   SwInsertSectionTabDialog::Ok()
{
    short nRet = SfxTabDialog::Ok();
    DBG_ASSERT(pToInsertSection, "keiner Section?")
    rWrtSh.InsertSection(*pToInsertSection, GetOutputItemSet());
    return nRet;
}

/* -----------------21.05.99 10:31-------------------
 *
 * --------------------------------------------------*/
SwInsertSectionTabPage::SwInsertSectionTabPage(
                            Window *pParent, const SfxItemSet &rAttrSet) :
    SfxTabPage( pParent, SW_RES(TP_INSERT_SECTION), rAttrSet ),
#ifdef DDE_AVAILABLE
    aDDECB              ( this, SW_RES( CB_DDE ) ) ,
    aDDECommandFT       ( this, SW_RES( FT_DDE ) ) ,
#endif
    aCurName            ( this, SW_RES( ED_RNAME ) ),
    aHideCB             ( this, SW_RES( CB_HIDE ) ),
    aProtectCB          ( this, SW_RES( CB_PROTECT ) ),
    aCondCB             ( this, SW_RES( CB_CONDITION ) ),
    aFileCB             ( this, SW_RES( CB_FILE ) ),
    aFilePB             ( this, SW_RES( PB_FILE ) ),
    aFileNameFT         ( this, SW_RES( FT_FILE ) ) ,
    aFileNameED         ( this, SW_RES( ED_FILE ) ),
    aSubRegionFT        ( this, SW_RES( FT_SUBREG ) ) ,
    aSubRegionED        ( this, SW_RES( LB_SUBREG ) ) ,
    aGroupBoxName       ( this, SW_RES( GB_NEW_SECTION ) ),
    aConditionED        ( this, SW_RES( ED_CONDITION ) ),
    aGroupBoxOptions    ( this, SW_RES( GB_NEW_OPTIONS ) ),
    sSection            (SW_RES( STR_REGION_DEFNAME )),
    pWrtSh(0)
{
    FreeResource();

    aProtectCB.SetClickHdl  ( LINK( this, SwInsertSectionTabPage, ChangeProtectHdl));
    aHideCB.SetClickHdl     ( LINK( this, SwInsertSectionTabPage, ChangeHideHdl));
    aCondCB.SetClickHdl     ( LINK( this, SwInsertSectionTabPage, ChangeCondHdl));
    aFileCB.SetClickHdl     ( LINK( this, SwInsertSectionTabPage, UseFileHdl ));
    aFilePB.SetClickHdl     ( LINK( this, SwInsertSectionTabPage, FileSearchHdl ));
    aCurName.SetModifyHdl   ( LINK( this, SwInsertSectionTabPage, NameEditHdl));
#ifdef DDE_AVAILABLE
    aDDECB.SetClickHdl      ( LINK( this, SwInsertSectionTabPage, DDEHdl ));
#endif
}
/* -----------------21.05.99 10:31-------------------
 *
 * --------------------------------------------------*/
SwInsertSectionTabPage::~SwInsertSectionTabPage()
{
}
/* -----------------21.05.99 12:58-------------------
 *
 * --------------------------------------------------*/
void    SwInsertSectionTabPage::SetWrtShell(SwWrtShell& rSh)
{
    pWrtSh = &rSh;

    BOOL bWeb = 0 != PTR_CAST(SwWebDocShell, pWrtSh->GetView().GetDocShell());
    if(bWeb)
    {
        aHideCB         .Hide();
        aCondCB         .Hide();
        aConditionED    .Hide();
#ifdef DDE_AVAILABLE
        aDDECB           .Hide();
        aDDECommandFT    .Hide();
#endif
    }

    USHORT nCount = pWrtSh->GetSectionFmtCount();
    pPasswdSect =  (const String*)&pWrtSh->GetSectionPasswd();
    FillList();
    USHORT nCnt = pWrtSh->GetBookmarkCnt();
    for( USHORT i = 0; i < nCnt; ++i )
    {
        SwBookmark& rBm = pWrtSh->GetBookmark( i );
        if( rBm.GetOtherPos() )
            aSubRegionED.InsertEntry( rBm.GetName() );
    }

    SwSection* pSect = ((SwInsertSectionTabDialog*)GetTabDialog())->GetSection();
    if( pSect )     // etwas vorgegeben ?
    {
        aCurName.SetText( rSh.GetUniqueSectionName( &pSect->GetName() ));
        aProtectCB.Check( 0 != pSect->IsProtect() );
        sFileName = pSect->GetLinkFileName();
        sFilePasswd = pSect->GetLinkFilePassWd();
        aFileCB.Check( 0 != sFileName.Len() );
        aFileNameED.SetText( sFileName );
        UseFileHdl( &aFileCB );
    }
    else
    {
        aCurName.SetText( rSh.GetUniqueSectionName() );
    }
}
/* -----------------21.05.99 10:32-------------------
 *
 * --------------------------------------------------*/
BOOL SwInsertSectionTabPage::FillItemSet( SfxItemSet& rSet)
{
    BOOL bRecording = FALSE;//pRequest && 0 != SfxRequest::GetRecordingMacro();
    SwSection aSection(CONTENT_SECTION, aCurName.GetText());
    if( aCondCB.IsChecked() )
        aSection.SetCondition(aConditionED.GetText());
    aSection.SetProtect(aProtectCB.IsChecked());
    aSection.SetHidden(aHideCB.IsChecked());
    String sFileName = aFileNameED.GetText();
    String sSubRegion = aSubRegionED.GetText();
    BOOL bDDe = FALSE;
    if(bRecording)
    {
//      pRequest->AppendItem(SfxStringItem(FN_PARAM_REGION_NAME, aCurName.GetText()));
//      if(aCondCB.IsChecked())
//          pRequest->AppendItem(SfxStringItem(FN_PARAM_REGION_CONDITION, aConditionED.GetText()));
//      pRequest->AppendItem(SfxBoolItem(FN_PARAM_REGION_HIDDEN, aHideCB.IsChecked()));
//      pRequest->AppendItem(SfxBoolItem(FN_PARAM_REGION_PROTECT, aProtectCB.IsChecked()));
    }
#ifdef DDE_AVAILABLE
    bDDe = aDDECB.IsChecked();
#endif
    if(aFileCB.IsChecked() && (sFileName.Len() || sSubRegion.Len() || bDDe))
    {
        String aLinkFile;
        if( bDDe )
        {
            aLinkFile = sFileName;

            USHORT nPos = 0;
            while( STRING_NOTFOUND != (nPos = aLinkFile.SearchAscii( "  ", nPos )) )
                aLinkFile.Erase( nPos--, 1 );

            nPos = aLinkFile.SearchAndReplace( ' ', cTokenSeperator );
            aLinkFile.SearchAndReplace( ' ', cTokenSeperator, nPos );
        }
        else
        {
            if(sFileName.Len())
            {
                aLinkFile = URIHelper::SmartRelToAbs( sFileName );
                aSection.SetLinkFilePassWd( sFilePasswd );
            }

            aLinkFile += cTokenSeperator;
            aLinkFile += sFilterName;
            aLinkFile += cTokenSeperator;
            aLinkFile += sSubRegion;
            if(bRecording)
            {
//              pRequest->AppendItem(SfxStringItem(FN_PARAM_1,
//                          aLinkFile.GetToken(0, cTokenSeperator)));
//              pRequest->AppendItem(SfxStringItem(FN_PARAM_2,
//                          sFilterName));
//              pRequest->AppendItem(SfxStringItem(FN_PARAM_3,
//                          sSubRegion));
            }

        }

        aSection.SetLinkFileName(aLinkFile);
        if(aLinkFile.Len())
        {
#ifdef DDE_AVAILABLE
            aSection.SetType( aDDECB.IsChecked() ?
                                    DDE_LINK_SECTION :
                                        FILE_LINK_SECTION);
#else
            aSection.SetType( FILE_LINK_SECTION);
#endif
        }
    }
    ((SwInsertSectionTabDialog*)GetTabDialog())->SetSection(aSection);
    return TRUE;
}
/* -----------------21.05.99 10:32-------------------
 *
 * --------------------------------------------------*/
void SwInsertSectionTabPage::Reset( const SfxItemSet& )
{
}
/* -----------------21.05.99 11:22-------------------
 *
 * --------------------------------------------------*/
SfxTabPage* SwInsertSectionTabPage::Create( Window* pParent,
                                const SfxItemSet& rAttrSet)
{
    return new SwInsertSectionTabPage(pParent, rAttrSet);
}
/*---------------------------------------------------------------------

---------------------------------------------------------------------*/

IMPL_LINK( SwInsertSectionTabPage, ChangeHideHdl, CheckBox *, pBox )
{
    BOOL bHide = pBox->IsChecked();
    aCondCB.Enable(bHide);
    aConditionED.Enable(bHide && aCondCB.IsChecked());
    return 0;
}
/*---------------------------------------------------------------------

---------------------------------------------------------------------*/

IMPL_LINK_INLINE_START( SwInsertSectionTabPage, ChangeCondHdl, CheckBox *, pBox )
{
    aConditionED.Enable( pBox->IsChecked() );
    if( pBox->IsChecked() )
        aConditionED.GrabFocus();
    return 0;
}
IMPL_LINK_INLINE_END( SwInsertSectionTabPage, ChangeCondHdl, CheckBox *, pBox )
/*---------------------------------------------------------------------

---------------------------------------------------------------------*/

IMPL_LINK( SwInsertSectionTabPage, ChangeProtectHdl, CheckBox *, pBox )
{
    if (pPasswdSect->Len()&&pBox->IsChecked())
    {
        SwTestPasswdDlg aPasswdDlg(this);
//      aPasswdDlg.SetHelpId(HID_DLG_PASSWD_SECTION);
        if (aPasswdDlg.Execute())
            pBox->Check(aPasswdDlg.GetPassword()==*pPasswdSect);
        else
            pBox->Check(FALSE);
    }
    return 0;
}
/*---------------------------------------------------------------------

---------------------------------------------------------------------*/

IMPL_LINK_INLINE_START( SwInsertSectionTabPage, NameEditHdl, Edit *, EMPTYARG )
{
    String  aName=aCurName.GetText();
    GetTabDialog()->GetOKButton().Enable(aName.Len() && aCurName.GetEntryPos( aName ) == USHRT_MAX);
    return 0;
}
IMPL_LINK_INLINE_END( SwInsertSectionTabPage, NameEditHdl, Edit *, EMPTYARG )

/*---------------------------------------------------------------------

---------------------------------------------------------------------*/

IMPL_LINK( SwInsertSectionTabPage, UseFileHdl, CheckBox *, pBox )
{
    if( pBox->IsChecked() )
    {
        if( pWrtSh->HasSelection() &&
            RET_NO == QueryBox( this, SW_RES(QB_CONNECT) ).Execute() )
            pBox->Check( FALSE );
    }

    BOOL bFile = pBox->IsChecked();
    aFileNameFT.Enable(bFile);
    aFileNameED.Enable(bFile);
    aFilePB.Enable(bFile);
    aSubRegionFT.Enable(bFile);
    aSubRegionED.Enable(bFile);
#ifdef DDE_AVAILABLE
    aDDECommandFT.Enable(bFile);
    aDDECB.Enable(bFile);
#endif
    if( bFile )
    {
//      aFileNameED.SetText( aFileName );
        aFileNameED.GrabFocus();
        aProtectCB.Check( TRUE );
    }
    else
    {
#ifdef DDE_AVAILABLE
        aDDECB.Check(FALSE);
        DDEHdl(&aDDECB);
#endif
//      aFileNameED.SetText(aEmptyStr);
    }
    return 0;
}

/*---------------------------------------------------------------------

---------------------------------------------------------------------*/

IMPL_LINK( SwInsertSectionTabPage, FileSearchHdl, PushButton *, EMPTYARG )
{
    SfxMedium* pMed;
    if( GetFileFilterNameDlg( *this, sFileName, &sFilePasswd,
                                &sFilterName, &pMed ))
    {
        aFileNameED.SetText( sFileName );
        ::lcl_ReadSections( *pWrtSh, *pMed, aSubRegionED );
        delete pMed;        // das brauchen wir nicht mehr !
    }
    else
        sFilterName = sFilePasswd = aEmptyStr;
    return 0;
}

/*---------------------------------------------------------------------

---------------------------------------------------------------------*/
#ifdef DDE_AVAILABLE

IMPL_LINK( SwInsertSectionTabPage, DDEHdl, CheckBox*, pBox )
{
    BOOL bDDE = pBox->IsChecked();
    BOOL bFile = aFileCB.IsChecked();
    aFilePB.Enable(!bDDE && bFile);
    if(bDDE)
    {
        aFileNameFT.Hide();
        aDDECommandFT.Enable(bDDE);
        aDDECommandFT.Show();
        aSubRegionFT.Hide();
        aSubRegionED.Hide();
    }
    else
    {
        aDDECommandFT.Hide();
        aFileNameFT.Enable(bFile);
        aFileNameFT.Show();
        aSubRegionFT.Show();
        aSubRegionED.Show();
        aSubRegionED.Enable(bFile);
    }
    return 0;
}
#endif
/*--------------------------------------------------------------------
    Beschreibung:   Liste der verwendeten Namen fuellen
 --------------------------------------------------------------------*/

void SwInsertSectionTabPage::FillList(  const SwSectionFmt* pNewFmt )
{
    const SwSectionFmt* pFmt;
    if( !pNewFmt )
    {
        USHORT nCount = pWrtSh->GetSectionFmtCount();
        for(USHORT i=0;i<nCount;i++)
        {
            SectionType eTmpType;
            if( !(pFmt = &pWrtSh->GetSectionFmt(i))->GetParent() &&
                    pFmt->IsInNodesArr() &&
                    (eTmpType = pFmt->GetSection()->GetType()) != TOX_CONTENT_SECTION
                    && TOX_HEADER_SECTION != eTmpType )
            {
                    String* pString = new String(pFmt->GetSection()->GetName());
                    aCurName.InsertEntry(*pString);
                    aSubRegionED.InsertEntry(*pString);
                    FillList( pFmt );
            }
        }
    }
    else
    {
        SwSections aTmpArr;
        USHORT nCnt = pNewFmt->GetChildSections(aTmpArr,SORTSECT_POS);
        if( nCnt )
        {
            SectionType eTmpType;
            for( USHORT n = 0; n < nCnt; ++n )
                if( (pFmt = aTmpArr[n]->GetFmt())->IsInNodesArr()&&
                    (eTmpType = pFmt->GetSection()->GetType()) != TOX_CONTENT_SECTION
                    && TOX_HEADER_SECTION != eTmpType )
                {
                    String* pString = new String(pFmt->GetSection()->GetName());
                    aCurName.InsertEntry(*pString);
                    aSubRegionED.InsertEntry(*pString);
                    FillList( pFmt );
                }
        }
    }
}

// --------------------------------------------------------------

// Numerierungsformat Umsetzung:
// ListBox  - Format            - Enum-Wert
// 0        - A, B, C, ...      - 0
// 1        - a, b, c, ...      - 1
// 2        - I, II, III, ...   - 2
// 3        - i, ii, iii, ...   - 3
// 4        - 1, 2, 3, ...      - 4
// 5        - A, .., AA, ..,    - 9
// 6        - a, .., aa, ..,    - 10

inline USHORT GetNumPos( USHORT n )
{
    return SVX_NUM_ARABIC < n ? n - 4 : n;
}

inline SvxExtNumType GetNumType( USHORT n )
{
    return (SvxExtNumType)(4 < n ? n + 4 : n );
}

SwSectionFtnEndTabPage::SwSectionFtnEndTabPage( Window *pParent,
                                                const SfxItemSet &rAttrSet)
    : SfxTabPage( pParent, SW_RES( TP_SECTION_FTNENDNOTES ), rAttrSet ),
    aGroupBoxFtn        ( this, SW_RES( GB_FTN ) ),
    aFtnNtAtTextEndCB   ( this, SW_RES( CB_FTN_AT_TXTEND ) ),
    aFtnNtNumCB         ( this, SW_RES( CB_FTN_NUM ) ),
    aFtnNtNumFmtCB      ( this, SW_RES( CB_FTN_NUM_FMT ) ),
    aFtnNumViewBox      ( this, SW_RES( LB_FTN_NUMVIEW  )),
    aFtnOffsetLbl       ( this, SW_RES( FT_FTN_OFFSET   )),
    aFtnOffsetFld       ( this, SW_RES( FLD_FTN_OFFSET   )),
    aFtnPrefixFT        ( this, SW_RES( FT_FTN_PREFIX   )),
    aFtnPrefixED        ( this, SW_RES( ED_FTN_PREFIX    )),
    aFtnSuffixFT        ( this, SW_RES( FT_FTN_SUFFIX    )),
    aFtnSuffixED        ( this, SW_RES( ED_FTN_SUFFIX    )),
    aGroupBoxEnd        ( this, SW_RES( GB_END ) ),
    aEndNtAtTextEndCB   ( this, SW_RES( CB_END_AT_TXTEND )),
    aEndNtNumCB         ( this, SW_RES( CB_END_NUM )),
    aEndNtNumFmtCB      ( this, SW_RES( CB_END_NUM_FMT ) ),
    aEndNumViewBox      ( this, SW_RES( LB_END_NUMVIEW  )),
    aEndOffsetLbl       ( this, SW_RES( FT_END_OFFSET   )),
    aEndOffsetFld       ( this, SW_RES( FLD_END_OFFSET   )),
    aEndPrefixFT        ( this, SW_RES( FT_END_PREFIX   )),
    aEndPrefixED        ( this, SW_RES( ED_END_PREFIX    )),
    aEndSuffixFT        ( this, SW_RES( FT_END_SUFFIX    )),
    aEndSuffixED        ( this, SW_RES( ED_END_SUFFIX    ))
{
    FreeResource();

    Link aLk( LINK( this, SwSectionFtnEndTabPage, FootEndHdl));
    aFtnNtAtTextEndCB.SetClickHdl( aLk );
    aFtnNtNumCB.SetClickHdl( aLk );
    aEndNtAtTextEndCB.SetClickHdl( aLk );
    aEndNtNumCB.SetClickHdl( aLk );
    aFtnNtNumFmtCB.SetClickHdl( aLk );
    aEndNtNumFmtCB.SetClickHdl( aLk );
}

SwSectionFtnEndTabPage::~SwSectionFtnEndTabPage()
{
}

BOOL SwSectionFtnEndTabPage::FillItemSet( SfxItemSet& rSet )
{
    BOOL bRecording = FALSE;//pRequest && 0 != SfxRequest::GetRecordingMacro();
    if(bRecording)
    {
//      pRequest->AppendItem(SfxStringItem(FN_PARAM_REGION_NAME, aCurName.GetText()));
//      if(aCondCB.IsChecked())
//          pRequest->AppendItem(SfxStringItem(FN_PARAM_REGION_CONDITION, aConditionED.GetText()));
//      pRequest->AppendItem(SfxBoolItem(FN_PARAM_REGION_HIDDEN, aHideCB.IsChecked()));
//      pRequest->AppendItem(SfxBoolItem(FN_PARAM_REGION_PROTECT, aProtectCB.IsChecked()));
    }

    SwFmtFtnAtTxtEnd aFtn( aFtnNtAtTextEndCB.IsChecked()
                            ? ( aFtnNtNumCB.IsChecked()
                                ? ( aFtnNtNumFmtCB.IsChecked()
                                    ? FTNEND_ATTXTEND_OWNNUMANDFMT
                                    : FTNEND_ATTXTEND_OWNNUMSEQ )
                                : FTNEND_ATTXTEND )
                            : FTNEND_ATPGORDOCEND );

    switch( aFtn.GetValue() )
    {
    case FTNEND_ATTXTEND_OWNNUMANDFMT:
        aFtn.SetNumType( GetNumType( aFtnNumViewBox.GetSelectEntryPos() ));
        aFtn.SetPrefix( aFtnPrefixED.GetText() );
        aFtn.SetSuffix( aFtnSuffixED.GetText() );
        // no break;

    case FTNEND_ATTXTEND_OWNNUMSEQ:
        aFtn.SetOffset( aFtnOffsetFld.GetValue()-1 );
        // no break;
    }

    SwFmtEndAtTxtEnd aEnd( aEndNtAtTextEndCB.IsChecked()
                            ? ( aEndNtNumCB.IsChecked()
                                ? ( aEndNtNumFmtCB.IsChecked()
                                    ? FTNEND_ATTXTEND_OWNNUMANDFMT
                                    : FTNEND_ATTXTEND_OWNNUMSEQ )
                                : FTNEND_ATTXTEND )
                            : FTNEND_ATPGORDOCEND );

    switch( aEnd.GetValue() )
    {
    case FTNEND_ATTXTEND_OWNNUMANDFMT:
        aEnd.SetNumType( GetNumType( aEndNumViewBox.GetSelectEntryPos() ));
        aEnd.SetPrefix( aEndPrefixED.GetText() );
        aEnd.SetSuffix( aEndSuffixED.GetText() );
        // no break;

    case FTNEND_ATTXTEND_OWNNUMSEQ:
        aEnd.SetOffset( aEndOffsetFld.GetValue()-1 );
        // no break;
    }

    rSet.Put( aFtn );
    rSet.Put( aEnd );

    return TRUE;
}

void SwSectionFtnEndTabPage::ResetState( BOOL bFtn,
                                    const SwFmtFtnEndAtTxtEnd& rAttr )
{
    CheckBox *pNtAtTextEndCB, *pNtNumCB, *pNtNumFmtCB;
    FixedText*pPrefixFT, *pSuffixFT;
    Edit *pPrefixED, *pSuffixED;
    ListBox *pNumViewBox;
    FixedText* pOffsetTxt;
    NumericField *pOffsetFld;

    if( bFtn )
    {
        pNtAtTextEndCB = &aFtnNtAtTextEndCB;
        pNtNumCB = &aFtnNtNumCB;
        pNtNumFmtCB = &aFtnNtNumFmtCB;
        pPrefixFT = &aFtnPrefixFT;
        pPrefixED = &aFtnPrefixED;
        pSuffixFT = &aFtnSuffixFT;
        pSuffixED = &aFtnSuffixED;
        pNumViewBox = &aFtnNumViewBox;
        pOffsetTxt = &aFtnOffsetLbl;
        pOffsetFld = &aFtnOffsetFld;
    }
    else
    {
        pNtAtTextEndCB = &aEndNtAtTextEndCB;
        pNtNumCB = &aEndNtNumCB;
        pNtNumFmtCB = &aEndNtNumFmtCB;
        pPrefixFT = &aEndPrefixFT;
        pPrefixED = &aEndPrefixED;
        pSuffixFT = &aEndSuffixFT;
        pSuffixED = &aEndSuffixED;
        pNumViewBox = &aEndNumViewBox;
        pOffsetTxt = &aEndOffsetLbl;
        pOffsetFld = &aEndOffsetFld;
    }

    USHORT eState = rAttr.GetValue();
    switch( eState )
    {
    // case FTNEND_ATPGORDOCEND:
    case FTNEND_ATTXTEND_OWNNUMANDFMT:
        pNtNumFmtCB->SetState( STATE_CHECK );
        // no break;

    case FTNEND_ATTXTEND_OWNNUMSEQ:
        pNtNumCB->SetState( STATE_CHECK );
        // no break;

    case FTNEND_ATTXTEND:
        pNtAtTextEndCB->SetState( STATE_CHECK );
        // no break;
    }

    pNumViewBox->SelectEntryPos( GetNumPos( rAttr.GetNumType() ));
    pOffsetFld->SetValue( rAttr.GetOffset() + 1 );
    pPrefixED->SetText( rAttr.GetPrefix() );
    pSuffixED->SetText( rAttr.GetSuffix() );

    switch( eState )
    {
    case FTNEND_ATPGORDOCEND:
        pNtNumCB->Enable( FALSE );
        // no break;

    case FTNEND_ATTXTEND:
        pNtNumFmtCB->Enable( FALSE );
        pOffsetFld->Enable( FALSE );
        pOffsetTxt->Enable( FALSE );
        // no break;

    case FTNEND_ATTXTEND_OWNNUMSEQ:
        pNumViewBox->Enable( FALSE );
        pPrefixFT->Enable( FALSE );
        pPrefixED->Enable( FALSE );
        pSuffixFT->Enable( FALSE );
        pSuffixED->Enable( FALSE );
        // no break;
    }
}

void SwSectionFtnEndTabPage::Reset( const SfxItemSet& rSet )
{
    ResetState( TRUE, (const SwFmtFtnAtTxtEnd&)rSet.Get(
                                    RES_FTN_AT_TXTEND, FALSE ));
    ResetState( FALSE, (const SwFmtEndAtTxtEnd&)rSet.Get(
                                    RES_END_AT_TXTEND, FALSE ));
}

SfxTabPage* SwSectionFtnEndTabPage::Create( Window* pParent,
                                const SfxItemSet& rAttrSet)
{
    return new SwSectionFtnEndTabPage(pParent, rAttrSet);
}

IMPL_LINK( SwSectionFtnEndTabPage, FootEndHdl, CheckBox *, pBox )
{
//  pBox->EnableTriState( FALSE );
    BOOL bFoot = &aFtnNtAtTextEndCB == pBox || &aFtnNtNumCB == pBox ||
                    &aFtnNtNumFmtCB == pBox ;

    CheckBox *pNumBox, *pNumFmtBox, *pEndBox;
    ListBox* pNumViewBox;
    FixedText* pOffsetTxt;
    NumericField *pOffsetFld;
    FixedText*pPrefixFT, *pSuffixFT;
    Edit *pPrefixED, *pSuffixED;

    if( bFoot )
    {
        pEndBox = &aFtnNtAtTextEndCB;
        pNumBox = &aFtnNtNumCB;
        pNumFmtBox = &aFtnNtNumFmtCB;
        pNumViewBox = &aFtnNumViewBox;
        pOffsetTxt = &aFtnOffsetLbl;
        pOffsetFld = &aFtnOffsetFld;
        pPrefixFT = &aFtnPrefixFT;
        pSuffixFT = &aFtnSuffixFT;
        pPrefixED = &aFtnPrefixED;
        pSuffixED = &aFtnSuffixED;
    }
    else
    {
        pEndBox = &aEndNtAtTextEndCB;
        pNumBox = &aEndNtNumCB;
        pNumFmtBox = &aEndNtNumFmtCB;
        pNumViewBox = &aEndNumViewBox;
        pOffsetTxt = &aEndOffsetLbl;
        pOffsetFld = &aEndOffsetFld;
        pPrefixFT = &aEndPrefixFT;
        pSuffixFT = &aEndSuffixFT;
        pPrefixED = &aEndPrefixED;
        pSuffixED = &aEndSuffixED;
    }

    BOOL bEnableAtEnd = STATE_CHECK == pEndBox->GetState();
    BOOL bEnableNum = bEnableAtEnd && STATE_CHECK == pNumBox->GetState();
    BOOL bEnableNumFmt = bEnableNum && STATE_CHECK == pNumFmtBox->GetState();

    pNumBox->Enable( bEnableAtEnd );
    pOffsetTxt->Enable( bEnableNum );
    pOffsetFld->Enable( bEnableNum );
    pNumFmtBox->Enable( bEnableNum );
    pNumViewBox->Enable( bEnableNumFmt );
    pPrefixED->Enable( bEnableNumFmt );
    pSuffixED->Enable( bEnableNumFmt );
    pPrefixFT->Enable( bEnableNumFmt );
    pSuffixFT->Enable( bEnableNumFmt );

    return 0;
}

/* -----------------21.05.99 13:59-------------------
 *
 * --------------------------------------------------*/
SwSectionPropertyTabDialog::SwSectionPropertyTabDialog(
    Window* pParent, const SfxItemSet& rSet, SwWrtShell& rSh) :
    SfxTabDialog(pParent, SW_RES(DLG_SECTION_PROPERTIES), &rSet)
{
    FreeResource();

    AddTabPage(TP_COLUMN,   SwColumnPage::Create,    0);
    AddTabPage(TP_BACKGROUND,SvxBackgroundTabPage::Create,  0);
    AddTabPage(TP_SECTION_FTNENDNOTES, SwSectionFtnEndTabPage::Create, 0);

    OfaHtmlOptions* pHtmlOpt = OFF_APP()->GetHtmlOptions();
    long nHtmlMode = pHtmlOpt->GetExportMode();
    BOOL bWeb = 0 != PTR_CAST( SwWebDocShell, rSh.GetView().GetDocShell() );
    if(bWeb)
    {
        RemoveTabPage(TP_SECTION_FTNENDNOTES);
        if( HTML_CFG_NS30 != nHtmlMode && HTML_CFG_NS40 != nHtmlMode && HTML_CFG_WRITER != nHtmlMode)
            RemoveTabPage(TP_COLUMN);
    }
}
/* -----------------21.05.99 13:59-------------------
 *
 * --------------------------------------------------*/
SwSectionPropertyTabDialog::~SwSectionPropertyTabDialog()
{
}
/* -----------------21.05.99 13:59-------------------
 *
 * --------------------------------------------------*/
void SwSectionPropertyTabDialog::PageCreated( USHORT nId, SfxTabPage &rPage )
{
    if( TP_BACKGROUND == nId  )
        ((SvxBackgroundTabPage&)rPage).ShowSelector();
    else if( TP_COLUMN == nId )
        ((SwColumnPage&)rPage).ShowBalance(TRUE);
}

/*-------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.176  2000/09/18 16:05:21  willem.vandorp
    OpenOffice header added.

    Revision 1.175  2000/08/17 14:03:56  jp
    UI with decode URL

    Revision 1.174  2000/08/14 13:22:59  os
    #77401# additional flag for 'Condition'

    Revision 1.173  2000/08/01 16:55:55  jp
    Bug #72901#: FillItemSet - ask the right control

    Revision 1.172  2000/07/26 16:28:28  jp
    Bug #77158#: InsertRegionDialog - take complete Itemset

    Revision 1.171  2000/07/21 13:26:56  os
    #77029# column dialog works again

    Revision 1.170  2000/07/10 10:01:23  os
    #76625# column item conversion

    Revision 1.169  2000/07/03 08:08:35  os
    #72742# resource warnings corrected

    Revision 1.168  2000/06/26 13:10:14  os
    INetURLObject::SmartRelToAbs removed

    Revision 1.167  2000/06/20 14:49:49  os
    #70060# less occurences of columns in HTML

    Revision 1.166  2000/06/13 11:06:54  os
    include is back

    Revision 1.165  2000/06/07 13:19:48  os
    include removed

    Revision 1.164  2000/05/26 07:21:29  os
    old SW Basic API Slots removed

    Revision 1.163  2000/04/13 08:01:20  os
    UNICODE

    Revision 1.162  2000/03/03 15:16:59  os
    StarView remainders removed

    Revision 1.161  2000/02/25 13:46:57  jp
    Bug #73596#: wrong name for regions

    Revision 1.160  2000/02/11 14:44:46  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.159  2000/01/31 10:14:11  os
    #72343# Background/Footnote/Endnote attributes - not from parent

    Revision 1.158  2000/01/04 15:35:39  os
    #71411# balanced columns

    Revision 1.157  1999/12/01 09:09:42  os
    #70321# dont show index sections

    Revision 1.156  1999/11/17 14:58:57  os
    no foot/endnotes in html

    Revision 1.155  1999/11/08 19:35:39  jp
    little bugfixes for Foot-/Endnote attributes

    Revision 1.154  1999/11/08 18:07:13  jp
    numberformat for Foot-/Endnotes at sectionend

    Revision 1.153  1999/11/03 13:49:46  jp
    SwFmtFtn-/-EndAtTxtEnd: change to EnumItem

    Revision 1.152  1999/10/21 17:47:51  jp
    have to change - SearchFile with SfxIniManager, dont use SwFinder for this

    Revision 1.151  1999/10/21 12:45:50  os
    CHG: SfxPasswordDialog

    Revision 1.150  1999/09/15 09:58:34  os
    footnotes and endnotes in sections

    Revision 1.149  1999/07/30 11:32:26  OS
    TOXBase in sections


      Rev 1.148   30 Jul 1999 13:32:26   OS
   TOXBase in sections

      Rev 1.147   28 Jul 1999 13:03:48   OS
   TOXBase in sections

      Rev 1.146   13 Jul 1999 12:56:00   OS
   default section names are indexed

      Rev 1.145   08 Jul 1999 09:04:24   OS
   #67441# WB_HSCROLL

      Rev 1.144   25 Jun 1999 15:45:18   OS
   #67229# HelpId for PasswordDialog in foramt/sections

      Rev 1.143   07 Jun 1999 13:51:30   OS
   #65686# Multiselektion beim Aufheben richtig behandeln

      Rev 1.142   27 May 1999 12:54:44   OS
   Einf?gen/Bearbeiten von Spalten ueberarbeitet

      Rev 1.141   21 May 1999 15:25:04   OS
   #66310# Bereiche mit Hintergrund, TabDialog fuers Einfuegen

      Rev 1.140   19 Mar 1999 13:34:24   OS
   #63701# unbenutztes Break-Attribut aus den Sections entfernt

      Rev 1.139   05 Mar 1999 20:09:32   JP
   Bug #62914#: Handling des Dialoges verbessert

      Rev 1.138   03 Mar 1999 18:21:44   JP
   Bug #57749#: Spalten nur setzen wenn sie im OutputSet des Dialoges vorhanden sind

      Rev 1.137   05 Feb 1999 12:54:18   OS
   #61096# nach dem letzten aufheben kommt der Fokus auf OK

      Rev 1.136   28 Jan 1999 18:12:22   JP
   Task #57749#: Undo von Bereichs-Attributen (Spalten, Hintergr...)

      Rev 1.135   27 Jan 1999 15:48:50   AMA
   Fix #57749#: Der Spaltendialog bekommt ein Gedaechtnis

      Rev 1.134   30 Nov 1998 14:55:40   OS
   #59995# richtige Abwahl verknuepfter Bereiche, auch in Mehrfachselektion

      Rev 1.133   17 Nov 1998 22:18:22   JP
   Task #59398#: ClipboardFormatId Umstellungen

      Rev 1.132   12 Nov 1998 15:06:48   JP
   Bug #54342#: auch bei GlobalDocs das Filepasswort an die Section uebertragen

      Rev 1.131   28 Oct 1998 18:07:28   JP
   Bug #54342#: File-Passwort von der Section merken und vom Medium besorgen

      Rev 1.130   13 Oct 1998 12:47:28   OM
   #57749# UI fuer spaltige Bereiche

-------------------------------------------------------------------------*/

diff --git a/sw/source/ui/dialog/regionsw.hrc b/sw/source/ui/dialog/regionsw.hrc
new file mode 100644
index 0000000..a486622
--- /dev/null
+++ b/sw/source/ui/dialog/regionsw.hrc
@@ -0,0 +1,144 @@
/*************************************************************************
 *
 *  $RCSfile: regionsw.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:34 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _REGIONSW_HRC
#define _REGIONSW_HRC

#include "dialog.hrc"


#define CB_CONDITION         1
#define CB_DDE               2
#define CB_DISMISS           3
#define CB_END_AT_TXTEND     4
#define CB_END_NUM           5
#define CB_FILE              6
#define CB_FTN_AT_TXTEND     7
#define CB_FTN_NUM           8
#define CB_HIDE              9
#define CB_PASSWD           10
#define CB_PROTECT          11
#define CB_FTN_NUM_FMT      12
#define CB_END_NUM_FMT      13

#define ED_CONDITION         1
#define ED_END_PREFIX        2
#define ED_END_SUFFIX        3
#define ED_FILE              4
#define ED_FTN_PREFIX        5
#define ED_FTN_SUFFIX        6
#define ED_RANAME            7
#define ED_RNAME             8

#define FLD_END_OFFSET       1
#define FLD_FTN_OFFSET       2

#define FT_DDE               1
#define FT_END_OFFSET        2
#define FT_END_PREFIX        3
#define FT_END_SUFFIX        4
#define FT_FILE              5
#define FT_FTN_OFFSET        6
#define FT_FTN_PREFIX        7
#define FT_FTN_SUFFIX        8
#define FT_RNAME             9
#define FT_SUBREG           10

#define GB_EDIT_OPTIONS      1
#define GB_EDIT_SECTION      2
#define GB_END               3
#define GB_FTN               4
#define GB_NEW_OPTIONS       5
#define GB_NEW_SECTION       6

#define LB_END_NUMVIEW       1
#define LB_FTN_NUMVIEW       2
#define LB_SUBREG            3

#define PB_CANCEL            1
#define PB_FILE              2
#define PB_HELP              3
#define PB_OK                4
#define PB_OPTIONS           5
#define PB_SAVED             6

#define ST_INSERT            1
#define TLB_SECTION          2



/* Globale Resourcen */
#define BMP_REG_NOPROT_NOHIDE   (RC_REGIONSW_BEGIN+0)
#define BMP_REG_NOPROT_HIDE     (RC_REGIONSW_BEGIN+1)
#define BMP_REG_PROT_NOHIDE     (RC_REGIONSW_BEGIN+2)
#define BMP_REG_PROT_HIDE       (RC_REGIONSW_BEGIN+3)
#define BMP_REG_EXPNODE         (RC_REGIONSW_BEGIN+4)
#define BMP_REG_COLLNODE        (RC_REGIONSW_BEGIN+5)

#define STR_REG_DUPLICATE       (RC_REGIONSW_BEGIN+6)
#define STR_INFO_DUPLICATE      (RC_REGIONSW_BEGIN+7)

#define MD_INS_REGION           (RC_REGIONSW_BEGIN+8)
#define MD_EDIT_REGION          (RC_REGIONSW_BEGIN+9)
#define QB_CONNECT              (RC_REGIONSW_BEGIN+10)
#define REG_WRONG_PASSWORD      (RC_REGIONSW_BEGIN+11)
#define REG_WRONG_PASSWD_REPEAT (RC_REGIONSW_BEGIN+12)

#endif
diff --git a/sw/source/ui/dialog/regionsw.src b/sw/source/ui/dialog/regionsw.src
new file mode 100644
index 0000000..05f9248
--- /dev/null
+++ b/sw/source/ui/dialog/regionsw.src
@@ -0,0 +1,1697 @@
/*************************************************************************
 *
 *  $RCSfile: regionsw.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:34 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "regionsw.hrc"
#include "cmdid.h"
#include "globals.hrc"
#include "helpid.h"
/*************************************************************************

    Dialog "Bereich einfuegen"

*************************************************************************/
#define FT_SUBREG_TEXT \
    Text = "Berei~ch" ; \
    Text [ English ] = "Section" ; \
    Text [ dutch ] = "~Bereik" ; \
    Text [ english_us ] = "~Section" ; \
    Text [ italian ] = "~Sezione" ; \
    Text [ spanish ] = "Ar~ea" ; \
    Text [ french ] = "~Section" ; \
    Text [ swedish ] = "~Område" ; \
    Text [ danish ] = "Område" ; \
    Text [ portuguese_brazilian ] = "Berei~ch" ; \
    Text [ portuguese ] = "Secção" ; \
    Text[ chinese_simplified ] = "ÇøÓò(~S)";    \
    Text[ russian ] = "Îáëàñòü";    \
    Text[ polish ] = "Sekcja";  \
    Text[ japanese ] = "”͈Í(~S)";  \
    Text[ language_user1 ] = "èëè: Ðàçäåë - -"; \
    Text[ chinese_traditional ] = "°Ï°ì(~S)";   \
    Text[ arabic ] = "ÇáäØÇÞ";  \
    Text[ greek ] = "Å~íüôçôá"; \
    Text[ korean ] = "±¸¿ª(~S)";    \
    Text[ turkish ] = "Bölüm";

#define CB_HIDE_TEXT \
    Text = "Aus~blenden" ; \
    Text [ English ] = "~Hidden" ; \
    Text [ norwegian ] = "~Hidden" ; \
    Text [ italian ] = "~Nascondi" ; \
    Text [ portuguese_brazilian ] = "~Oculto" ; \
    Text [ portuguese ] = "~Ocultar" ; \
    Text [ finnish ] = "~Piilotettu" ; \
    Text [ danish ] = "Skjul" ; \
    Text [ french ] = "~Masquer" ; \
    Text [ swedish ] = "Döl~j" ; \
    Text [ dutch ] = "~Verbergen" ; \
    Text [ spanish ] = "~Ocultar" ; \
    Text [ english_us ] = "~Hidden" ; \
    Text[ chinese_simplified ] = "ÒþÈë(~H)";    \
    Text[ russian ] = "Ñêðûòü"; \
    Text[ polish ] = "Ukryj";   \
    Text[ japanese ] = "”ñ•\\ަ(~H)";   \
    Text[ chinese_traditional ] = "Áô¤J(~H)";   \
    Text[ arabic ] = "ãÎÝí";    \
    Text[ greek ] = "Á~ðüêñõøç";    \
    Text[ korean ] = "¼û±â±â(~H)";  \
    Text[ turkish ] = "Gizle";

#define CB_CONDITION_TEXT  \
    Text = "M~it Bedingung" ; \
    Text [ English ] = "~With condition" ; \
    Text [ english_us ] = "~With condition" ; \
    Text [ italian ] = "Con condizione" ; \
    Text [ spanish ] = "Con ~condición" ; \
    Text [ french ] = "Sous ~condition" ; \
    Text [ dutch ] = "~Met conditie" ; \
    Text [ swedish ] = "~Med villkor" ; \
    Text [ danish ] = "Med betingelse" ; \
    Text [ portuguese ] = "~Com condição" ; \
    Text [ portuguese_brazilian ] = "M~it Bedingung" ; \
    Text[ chinese_simplified ] = "´øÌõ¼þ(~W)";  \
    Text[ russian ] = "Ïðè óñëîâèè";    \
    Text[ polish ] = "Warunkowy";   \
    Text[ japanese ] = "ðŒ•t(~W)";    \
    Text[ chinese_traditional ] = "¦³±ø¥ó(~W)"; \
    Text[ arabic ] = "ÈÔÑØ";    \
    Text[ greek ] = "Ìå óõíèÞê~ç";  \
    Text[ korean ] = "Á¶°Ç°ú ÇÔ²²(~W)"; \
    Text[ turkish ] = "Koþul";

#define CB_FILE_TEXT \
    Text = "~Verknüpfung" ; \
    Text [ English ] = "~Link" ; \
    Text [ english_us ] = "~Link" ; \
    Text [ italian ] = "~Collegamento" ; \
    Text [ spanish ] = "~Vínculo" ; \
    Text [ french ] = "~Lien" ; \
    Text [ dutch ] = "~Koppeling" ; \
    Text [ swedish ] = "~Länk" ; \
    Text [ danish ] = "Kæde" ; \
    Text [ portuguese_brazilian ] = "~Verknüpfung" ; \
    Text [ portuguese ] = "~Ligação" ; \
    Text[ chinese_simplified ] = "Á´½Ó(~L)";    \
    Text[ russian ] = "Ññûëêà"; \
    Text[ polish ] = "£¹cze";   \
    Text[ japanese ] = "ØÝ¸(~L)";   \
    Text[ chinese_traditional ] = "±¶®|(~L)";   \
    Text[ arabic ] = "ÇÑÊÈÇØ";  \
    Text[ greek ] = "~Óýíäåóç"; \
    Text[ korean ] = "¿¬°á(~L)";    \
    Text[ turkish ] = "Baðlantý";

#define CB_DDE_TEXT \
    Text = "~DDE" ; \
    Text [ English ] = "~DDE" ; \
    Text [ dutch ] = "~DDE" ; \
    Text [ english_us ] = "DD~E" ; \
    Text [ italian ] = "~DDE" ; \
    Text [ spanish ] = "~DDE" ; \
    Text [ french ] = "~DDE" ; \
    Text [ swedish ] = "~DDE" ; \
    Text [ danish ] = "DDE" ; \
    Text [ portuguese_brazilian ] = "~DDE" ; \
    Text [ portuguese ] = "~DDE" ; \
    Text[ chinese_simplified ] = "DDE(~E)"; \
    Text[ russian ] = "~DDE";   \
    Text[ polish ] = "DDE"; \
    Text[ japanese ] = "DDE(~E)";   \
    Text[ chinese_traditional ] = "DD~E";   \
    Text[ arabic ] = "DDE~";    \
    Text[ greek ] = "~DDE"; \
    Text[ korean ] = "DD~E";    \
    Text[ turkish ] = "DDE";

#define FT_DDE_TEXT \
    Text = "DDE~-Befehl" ; \
    Text [ English ] = "DDE command" ; \
    Text [ english_us ] = "DDE ~Command" ; \
    Text [ italian ] = "Comando DDE" ; \
    Text [ spanish ] = "~Comando DDE" ; \
    Text [ french ] = "Commande ~DDE" ; \
    Text [ dutch ] = "~DDE-opdracht" ; \
    Text [ swedish ] = "DDE-~kommando" ; \
    Text [ danish ] = "DDE-kommando" ; \
    Text [ portuguese_brazilian ] = "DDE~-Befehl" ; \
    Text [ portuguese ] = "~Comando DDE" ; \
    Text[ chinese_simplified ] = "DDE Ö¸Áî(~C)";    \
    Text[ russian ] = "Êîìàíäà DDE~";   \
    Text[ polish ] = "Polecenie DDE";   \
    Text[ japanese ] = "DDEŽwަ(~C)";   \
    Text[ chinese_traditional ] = "~DDE - «ü¥O";    \
    Text[ arabic ] = "ÃãÑ DDE"; \
    Text[ greek ] = "~ÅíôïëÞ DDE";  \
    Text[ korean ] = "DDE ¸í·É(~C)";    \
    Text[ turkish ] = "DDE komutu";

#define FT_FILE_TEXT \
    Text = "Dateina~me" ; \
    Text [ English ] = "File name" ; \
    Text [ english_us ] = "~File name" ; \
    Text [ italian ] = "Nome file" ; \
    Text [ spanish ] = "~Nombre de archivo" ; \
    Text [ french ] = "Nom de ~fichier" ; \
    Text [ dutch ] = "~Bestandsnaam" ; \
    Text [ swedish ] = "~Filnamn" ; \
    Text [ danish ] = "Filnavn" ; \
    Text [ portuguese_brazilian ] = "Dateina~me" ; \
    Text [ portuguese ] = "~Nome do ficheiro" ; \
    Text[ chinese_simplified ] = "ÎļþÃû(~F)";  \
    Text[ russian ] = "Èìÿ ôàéëà";  \
    Text[ polish ] = "Nazwa pliku"; \
    Text[ japanese ] = "̧²Ù–¼(~F)";    \
    Text[ chinese_traditional ] = "ÀɮצWºÙ(~F)";   \
    Text[ arabic ] = "ÇÓã ÇáãáÝ";   \
    Text[ greek ] = "¼íï~ìá áñ÷åßïõ";   \
    Text[ korean ] = "ÆÄÀÏ À̸§(~F)";   \
    Text[ turkish ] = "D~osya adý";

#define PB_FILE_TEXT \
    Text = "Au~swählen..." ; \
    Text [ English ] = "~Browse..." ; \
    Text [ english_us ] = "~Browse..." ; \
    Text [ portuguese ] = "~Seleccionar..." ; \
    Text [ portuguese_brazilian ] = "Durchs~uchen..." ; \
    Text [ swedish ] = "~Välj ut..." ; \
    Text [ danish ] = "Gennemse..." ; \
    Text [ italian ] = "~Sfoglia..." ; \
    Text [ spanish ] = "Se~leccionar..." ; \
    Text [ french ] = "~Sélectionner..." ; \
    Text [ dutch ] = "~Selecteren..." ; \
    Text[ chinese_simplified ] = "ä¯ÀÀ(~B)..."; \
    Text[ russian ] = "Âûáðàòü..."; \
    Text[ polish ] = "Wybierz...";  \
    Text[ japanese ] = "‘I‘ð(~B)...";   \
    Text[ chinese_traditional ] = "ÂsÄý(~B)...";    \
    Text[ arabic ] = "ÇÎÊíÇÑ...";   \
    Text[ greek ] = "Å~ðéëïãÞ...";  \
    Text[ korean ] = "¼±ÅÃÇϱâ(~B)..."; \
    Text[ turkish ] = "Seç...";

#define GB_OPTIONS_TEXT \
    Text = "Optionen" ; \
    Text [ English ] = "Options" ; \
    Text [ norwegian ] = "Options" ; \
    Text [ italian ] = "Opzioni" ; \
    Text [ portuguese_brazilian ] = "Opções" ; \
    Text [ portuguese ] = "Opções" ; \
    Text [ finnish ] = "Määritykset" ; \
    Text [ danish ] = "Indstillinger" ; \
    Text [ french ] = "Options" ; \
    Text [ swedish ] = "Alternativ" ; \
    Text [ dutch ] = "Opties" ; \
    Text [ spanish ] = "Opciones" ; \
    Text [ english_us ] = "Options" ; \
    Text[ chinese_simplified ] = "Ñ¡Ïî";    \
    Text[ russian ] = "Ïàðàìåòðû";  \
    Text[ polish ] = "Opcje";   \
    Text[ japanese ] = "µÌß¼®Ý";    \
    Text[ chinese_traditional ] = "¿ï¶µ";   \
    Text[ arabic ] = "ÇáÎíÇÑÇÊ";    \
    Text[ greek ] = "ÅðéëïãÝò"; \
    Text[ korean ] = "¿É¼Ç";    \
    Text[ turkish ] = "Seçenekler";

/*************************************************************************

    Dialog "Bereiche bearbeiten"

*************************************************************************/
ModalDialog MD_EDIT_REGION
{
    HelpID = FN_EDIT_REGION ;
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 296 , 164 ) ;
    Text = "Bereiche bearbeiten" ;
    Text [ English ] = "Edit Sections" ;
    Text [ norwegian ] = "Redigere Områder" ;
    Text [ italian ] = "Modifica sezioni" ;
    Text [ portuguese_brazilian ] = "Editar Seções" ;
    Text [ portuguese ] = "Editar secções" ;
    Text [ finnish ] = "Muokkaa asiakirjan osia" ;
    Text [ danish ] = "Rediger områder" ;
    Text [ french ] = "Édition des sections" ;
    Text [ swedish ] = "Redigera områden" ;
    Text [ dutch ] = "Bereiken bewerken" ;
    Text [ spanish ] = "Modificar áreas" ;
    Text [ english_us ] = "Edit Sections" ;
    Moveable = TRUE ;
    OKButton PB_OK
    {
        Pos = MAP_APPFONT ( 240 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        Disable = TRUE ;
        DefButton = TRUE ;
    };
    CancelButton PB_CANCEL
    {
        Pos = MAP_APPFONT ( 240 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    PushButton PB_OPTIONS
    {
        Pos = MAP_APPFONT ( 240 , 40 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        Hide = TRUE ;
        Text = "~Optionen..." ;
        Text [ English ] = "~Options...";
        Text[ english_us ] = "~Options...";
        Text[ portuguese ] = "~Opções...";
        Text[ russian ] = "Ïàðàìåòðû...";
        Text[ greek ] = "ÅðéëïãÝò";
        Text[ dutch ] = "~Opties...";
        Text[ french ] = "~Options...";
        Text[ spanish ] = "~Opciones...";
        Text[ italian ] = "~Opzioni...";
        Text[ danish ] = "Indstillinger...";
        Text[ swedish ] = "Alternativ";
        Text[ polish ] = "Opcje...";
        Text[ portuguese_brazilian ] = "~Options";
        Text[ japanese ] = "µÌß¼®Ý(~O)";
        Text[ korean ] = "¿É¼Ç(~O)...";
        Text[ chinese_simplified ] = "Ñ¡Ïî(~O)";
        Text[ chinese_traditional ] = "¿ï¶µ(~O)";
        Text[ arabic ] = "ÎíÇÑÇÊ...";
        Text[ turkish ] = "Seçenekler...";
    };
    PushButton CB_DISMISS
    {
        Pos = MAP_APPFONT ( 240 , 57 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        Disable = TRUE ;
        TabStop = TRUE ;
        Text = "A~ufheben" ;
        Text [ English ] = "~Dismiss" ;
        Text [ norwegian ] = "~Dismiss" ;
        Text [ italian ] = "Rimuovi" ;
        Text [ portuguese_brazilian ] = "~Dispensar" ;
        Text [ portuguese ] = "~Remover" ;
        Text [ finnish ] = "~Poista" ;
        Text [ danish ] = "Ophæv" ;
        Text [ french ] = "~Éliminer" ;
        Text [ swedish ] = "Upphäv" ;
        Text [ dutch ] = "~Opheffen" ;
        Text [ spanish ] = "An~ular" ;
        Text [ english_us ] = "~Undo" ;
        Text[ chinese_simplified ] = "ÒÆ³ý(~R)";
        Text[ russian ] = "Óáðàòü";
        Text[ polish ] = "Anuluj";
        Text[ japanese ] = "‰ðœ(~R)";
        Text[ chinese_traditional ] = "²¾°£(~R)";
        Text[ arabic ] = "ÅÒÇáÉ";
        Text[ greek ] = "ÊáôÜñãçóç";
        Text[ korean ] = "»èÁ¦(~R)";
        Text[ turkish ] = "Kaldýr";
    };
    HelpButton PB_HELP
    {
        Pos = MAP_APPFONT ( 240 , 77 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    FixedText FT_RNAME
    {
        Pos = MAP_APPFONT ( 129 , 17 ) ;
        Size = MAP_APPFONT ( 30 , 10 ) ;
        Text = "~Name" ;
        Text [ English ] = "Name" ;
        Text [ norwegian ] = "Navn" ;
        Text [ italian ] = "~Nome" ;
        Text [ portuguese_brazilian ] = "~Nomear" ;
        Text [ portuguese ] = "~Nome" ;
        Text [ finnish ] = "Nimi" ;
        Text [ danish ] = "Navn" ;
        Text [ french ] = "~Nom" ;
        Text [ swedish ] = "~Namn" ;
        Text [ dutch ] = "~Naam" ;
        Text [ spanish ] = "~Nombre" ;
        Text [ english_us ] = "~Name" ;
        Text[ chinese_simplified ] = "Ãû³Æ(~N)";
        Text[ russian ] = "Èìÿ";
        Text[ polish ] = "Nazwa";
        Text[ japanese ] = "–¼‘O(~N)";
        Text[ chinese_traditional ] = "¦WºÙ(~N)";
        Text[ arabic ] = "ÇáÇÓã";
        Text[ greek ] = "¼íïìá";
        Text[ korean ] = "À̸§(~N)";
        Text[ turkish ] = "~Ad";
    };
    Edit ED_RANAME
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 160 , 16 ) ;
        Size = MAP_APPFONT ( 68 , 12 ) ;
        TabStop = TRUE ;
        Disable = TRUE ;
    };
    TriStateBox CB_PROTECT
    {
        Pos = MAP_APPFONT ( 129 , 31 ) ;
        Size = MAP_APPFONT ( 70 , 12 ) ;
        TabStop = TRUE ;
        Disable = TRUE ;
        TriStateDisable = FALSE ;
        Text = "~Geschützt" ;
        Text [ English ] = "Pro~tected" ;
        Text [ norwegian ] = "Pro~tected" ;
        Text [ italian ] = "Pro~tetta" ;
        Text [ portuguese_brazilian ] = "Pro~tegido" ;
        Text [ portuguese ] = "~Proteger" ;
        Text [ finnish ] = "~Suojattu" ;
        Text [ danish ] = "Beskyttet" ;
        Text [ french ] = "~Protégé" ;
        Text [ swedish ] = "Skyddad" ;
        Text [ dutch ] = "~Beveiligd" ;
        Text [ spanish ] = "Pro~tegida" ;
        Text [ english_us ] = "~Protected" ;
        Text[ chinese_simplified ] = "Êܱ£»¤µÄ(~P)";
        Text[ russian ] = "Çàùèùåíî";
        Text[ polish ] = "Chroniony";
        Text[ japanese ] = "•ی삳‚ꂽ(~P)";
        Text[ chinese_traditional ] = "¨ü«OÅ@(~P)";
        Text[ arabic ] = "ãÍãí";
        Text[ greek ] = "Ðñïóôáôåõüìåíï";
        Text[ korean ] = "º¸È£(~P)";
        Text[ turkish ] = "Korumalý";
    };
    TriStateBox CB_HIDE
    {
        Pos = MAP_APPFONT ( 129 , 46 ) ;
        Size = MAP_APPFONT ( 70 , 10 ) ;
        TabStop = TRUE ;
        TriStateDisable = FALSE ;
        CB_HIDE_TEXT
    };
    TriStateBox CB_CONDITION
    {
        Pos = MAP_APPFONT ( 144 , 59 ) ;
        Size = MAP_APPFONT ( 85 , 10 ) ;
        TriStateDisable = FALSE ;
        CB_CONDITION_TEXT
    };
    Edit ED_CONDITION
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 160 , 72 ) ;
        Size = MAP_APPFONT ( 68 , 12 ) ;
        TabStop = TRUE ;
        Disable = TRUE ;
    };
    TriStateBox CB_FILE
    {
        Pos = MAP_APPFONT ( 129 , 102 ) ;
        Size = MAP_APPFONT ( 59 , 10 ) ;
        TabStop = TRUE ;
        CB_FILE_TEXT
    };
    CheckBox CB_DDE
    {
        Pos = MAP_APPFONT ( 190 , 102 ) ;
        Size = MAP_APPFONT ( 30 , 10 ) ;
        Disable = TRUE ;
        CB_DDE_TEXT
    };
    FixedText FT_DDE
    {
        Pos = MAP_APPFONT ( 144 , 115 ) ;
        Size = MAP_APPFONT ( 84 , 10 ) ;
        Hide = TRUE ;
        FT_DDE_TEXT
    };
    FixedText FT_FILE
    {
        Pos = MAP_APPFONT ( 144 , 115 ) ;
        Size = MAP_APPFONT ( 84 , 10 ) ;
        Disable = TRUE ;
        FT_FILE_TEXT
    };
    Edit ED_FILE
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 144 , 126 ) ;
        Size = MAP_APPFONT ( 84 , 12 ) ;
        Disable = TRUE ;
        TabStop = TRUE ;
    };
    PushButton PB_FILE
    {
        Pos = MAP_APPFONT ( 240 , 125 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        Disable = TRUE ;
        PB_FILE_TEXT
    };
    FixedText FT_SUBREG
    {
        Pos = MAP_APPFONT ( 144 , 141 ) ;
        Size = MAP_APPFONT ( 30 , 10 ) ;
        Disable = TRUE ;
        FT_SUBREG_TEXT
    };
    ComboBox LB_SUBREG
    {
        Pos = MAP_APPFONT ( 175 , 141 ) ;
        Size = MAP_APPFONT ( 53 , 50 ) ;
        Disable = TRUE ;
        TabStop = TRUE ;
        Sort = TRUE ;
        DropDown = TRUE ;
    };
    CheckBox CB_PASSWD
    {
        Pos = MAP_APPFONT ( 12 , 145 ) ;
        Size = MAP_APPFONT ( 104 , 12 ) ;
        TabStop = TRUE ;
        Text = "Bereiche mit ~Passwortschutz" ;
        Text [ English ] = "Sections ~password protected" ;
        Text [ dutch ] = "Bereiken met ~wachtwoordbeveiliging" ;
        Text [ english_us ] = "P~assword protected" ;
        Text [ italian ] = "Sezioni con protezione password" ;
        Text [ spanish ] = "Areas protegidas con ~contraseña" ;
        Text [ french ] = "Protégées par ~mot de passe" ;
        Text [ swedish ] = "Områden med ~lösenordsskydd" ;
        Text [ danish ] = "Områder med adgangskodebeskyttelse" ;
        Text [ portuguese_brazilian ] = "Bereiche mit ~Paßwortschutz" ;
        Text [ portuguese ] = "Proteger com ~senha" ;
        Text[ chinese_simplified ] = "ʹÓÿÚÁî±£»¤µÄÇøÓò(~A)";
        Text[ russian ] = "Îáëàñòè, çàùèùåííûå ïàðîëåì";
        Text[ polish ] = "Obszary zabezpieczone has³em";
        Text[ japanese ] = "Ê߽ܰÄޕیì•t‚«‚͈̔Í(~A)";
        Text[ chinese_traditional ] = "¨Ï¥Î±K½X«OÅ@°Ï°ì(~A)";
        Text[ arabic ] = "äØÇÞÇÊ ãÍãíÉ ÈßáãÉ ÓÑ";
        Text[ greek ] = "Ðåñéï÷Ýò ìå ðñïóôáóßá êùäéêïý ðñüóâáóçò";
        Text[ korean ] = "ÆÐ½º¿öµå°¡ º¸È£µÇ¾ú½À´Ï´Ù.(~A)";
        Text[ turkish ] = "Þifre korumalý bölümler";
    };
    GroupBox GB_EDIT_SECTION
    {
        OutputSize = TRUE ;
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 111 , 157 ) ;
        Text = "Bereich" ;
        Text [ English ] = "section" ;
        Text [ norwegian ] = "section" ;
        Text [ italian ] = "Sezione" ;
        Text [ portuguese_brazilian ] = "seção" ;
        Text [ portuguese ] = "Secção" ;
        Text [ finnish ] = "osa" ;
        Text [ danish ] = "Område" ;
        Text [ french ] = "Section" ;
        Text [ swedish ] = "Område" ;
        Text [ dutch ] = "Bereik" ;
        Text [ spanish ] = "Area" ;
        Text [ english_us ] = "Section" ;
        Text[ chinese_simplified ] = "·ÖÀà";
        Text[ russian ] = "Îáëàñòü";
        Text[ polish ] = "Obszar";
        Text[ japanese ] = "”͈Í";
        Text[ language_user1 ] = "èëè: Îáëàñòü - -";
        Text[ chinese_traditional ] = "¤ÀÃþ";
        Text[ arabic ] = "ÇáäØÇÞ";
        Text[ greek ] = "Åíüôçôá";
        Text[ korean ] = "±¸¿ª";
        Text[ turkish ] = "Bölüm";
    };
    Control TLB_SECTION
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 12 , 14 ) ;
        Size = MAP_APPFONT ( 99 , 127 ) ;
        TabStop = TRUE ;
    };
    /*  FixedText FT_CONDITION
    {
        Pos = MAP_APPFONT( 97, 48 );
        Size = MAP_APPFONT( 40, 10 );
        Text = "Bedingung";
        Text[ English ] = "Condition";
        Text[norwegian] = "Vilkår";
        Text[italian] = "Condizione";
        Text[portuguese_brazilian] = "condição";
        Text[portuguese] = "Condição";
        Text[finnish] = "Ehto";
        Text[danish] = "Betingelse";
        Text[french] = "Condition";
        Text[swedish] = "Villkor";
        Text[dutch] = "Voorwaarde";
        Text[spanish] = "Condición";
        Text[english_us] = "Condition";
        Disable = TRUE;
    };*/
    GroupBox GB_EDIT_OPTIONS
    {
        OutputSize = TRUE ;
        Pos = MAP_APPFONT ( 123 , 3 ) ;
        Size = MAP_APPFONT ( 111 , 157 ) ;
        GB_OPTIONS_TEXT
    };
    Text[ chinese_simplified ] = "±à¼­ÇøÓò";
    Text[ russian ] = "Ïðàâêà îáëàñòåé";
    Text[ polish ] = "Edytuj sekcje";
    Text[ japanese ] = "”͈͂̕ҏW";
    Text[ chinese_traditional ] = "½s¿è°Ï°ì";
    Text[ arabic ] = "ÊÍÑíÑ äØÇÞÇÊ";
    Text[ greek ] = "Åðåîåñãáóßá ôïìÝùí";
    Text[ korean ] = "±¸¿ª ÆíÁý";
    Text[ turkish ] = "Bölümleri düzenle";
};
Bitmap BMP_REG_NOPROT_NOHIDE
{
    File = "lock1.bmp" ;
};
Bitmap BMP_REG_NOPROT_HIDE
{
    File = "lock2.bmp" ;
};
Bitmap BMP_REG_PROT_NOHIDE
{
    File = "lock.bmp" ;
};
Bitmap BMP_REG_PROT_HIDE
{
    File = "lock3.bmp" ;
};
Bitmap BMP_REG_EXPNODE
{
    File = "plus.bmp" ;
};
Bitmap BMP_REG_COLLNODE
{
    File = "minus.bmp" ;
};
String STR_REG_DUPLICATE
{
    Text = "Bereichsname geändert:" ;
    Text [ English ] = "Section name changed:" ;
    Text [ norwegian ] = "Section name changed:" ;
    Text [ italian ] = "Nome sezione modificato:" ;
    Text [ portuguese_brazilian ] = "Nome da seção alterado:" ;
    Text [ portuguese ] = "Nome da secção mudou:" ;
    Text [ finnish ] = "Osan nimi vaihdettu:" ;
    Text [ danish ] = "Områdenavn ændret:" ;
    Text [ french ] = "Nom de section modifié :" ;
    Text [ swedish ] = "Områdesnamn ändrat:" ;
    Text [ dutch ] = "Bereiknaam gewijzigd:" ;
    Text [ spanish ] = "Nombre de área modificado:" ;
    Text [ english_us ] = "Section name changed:" ;
    Text[ chinese_simplified ] = "ÇøÓòÃû³ÆÒѾ­¸Ä±ä£º";
    Text[ russian ] = "Èìÿ ðàçäåëà èçìåíåíî:";
    Text[ polish ] = "Zmieniona nazwa sekcji:";
    Text[ japanese ] = "”͈͖¼‚̕ύX:";
    Text[ chinese_traditional ] = "°Ï°ì¦WºÙ¤w¸gÅܧó¡G";
    Text[ arabic ] = "Êã ÊÛííÑ ÇÓã ÇáäØÇÞ:";
    Text[ greek ] = "ÁëëáãÞ ïíüìáôïò ôïõ ôïìÝá:";
    Text[ korean ] = "±¸¿ª À̸§ÀÌ º¯°æµÇ¾ú½À´Ï´Ù:";
    Text[ turkish ] = "Bölüm adý deðiþtirildi:";
};
String STR_INFO_DUPLICATE
{
    Text = "Doppelter Bereichsname" ;
    Text [ English ] = "Duplicate section name" ;
    Text [ norwegian ] = "Duplicate section name" ;
    Text [ italian ] = "Nome area doppio" ;
    Text [ portuguese_brazilian ] = "Nome da seção duplo" ;
    Text [ portuguese ] = "Nome de secção duplo" ;
    Text [ finnish ] = "Osan nimi toistettu" ;
    Text [ danish ] = "Dobbelt områdenavn" ;
    Text [ french ] = "Dupliquer nom de la section" ;
    Text [ swedish ] = "Dubbelt områdesnamn" ;
    Text [ dutch ] = "Dubbele bereiknaam" ;
    Text [ spanish ] = "Nombre doble de área" ;
    Text [ english_us ] = "Duplicate section name" ;
    Text[ chinese_simplified ] = "Ë«ÇøÓòÃû³Æ";
    Text[ russian ] = "Ïîâòîð èìåíè îáëàñòè";
    Text[ polish ] = "Zduplikowane nazwy sekcji";
    Text[ japanese ] = "d•¡‚µ‚½”͈͖¼";
    Text[ chinese_traditional ] = "Âù°Ï°ì¦WºÙ";
    Text[ arabic ] = "ÇÓã äØÇÞ ãÒÏæÌ";
    Text[ greek ] = "ÄéðëÞ ïíïìáóßá ôïìÝá";
    Text[ korean ] = "Áߺ¹µÈ ±¸¿ªÀ̸§";
    Text[ turkish ] = "Bölüm adý daha önce kullanýldý";
};
QueryBox QB_CONNECT
{
    Buttons = WB_YES_NO ;
    DefButton = WB_DEF_NO ;
    Message = "Eine Dateiverbindung löscht den aktuellen Inhalt des Bereichs. Trotzdem verbinden ?" ;
    Message [ English ] = "A file connection will delete the content of the current section. Continue ?" ;
    Message [ dutch ] = "Door een bestandsverbinding wordt de inhoud van het actuele bereik verwijderd. Toch verbinden?" ;
    Message [ english_us ] = "A file connection will delete the contents of the current section. Connect anyway?" ;
    Message [ italian ] = "Un collegamento di file cancella il contenuto dell'area. Volete collegare lo stesso?" ;
    Message [ spanish ] = "Un enlace de archivos borra el  contenido actual del área. ¿Enlazar de todos modos?" ;
    Message [ french ] = "Une connexion supprime le contenu de la section courante. Connecter quand même?" ;
    Message [ swedish ] = "En filförbindelse raderar det aktuella innehållet i området. Förbinda ändå?" ;
    Message [ danish ] = "En filforbindelse sletter områdets aktuelle indhold. Vil du forbinde alligevel?" ;
    Message [ portuguese ] = "Uma ligação de ficheiros elimina o conteúdo da actual secção. Mesmo assim, ligar?" ;
    Message [ portuguese_brazilian ] = "Eine Dateiverbindung löscht den aktuellen Inhalt des Bereichs. Trotzdem verbinden ?" ;
    Message[ chinese_simplified ] = "ʹÓÃÎļþÁ¬½Ó»áɾ³ýµ±Ç°ÇøÓòÄÚµÄÄÚÈÝ¡£Äú»¹ÊÇÒªÖ´ÐÐÁ¬½ÓÃüÁ";
    Message[ russian ] = "Ñâÿçü ôàéëîâ óäàëèò òåêóùåå ñîäåðæèìîå îáëàñòè. Ñâÿçàòü íåñìîòðÿ íà ýòî ?";
    Message[ polish ] = "Po³¹czenie pliku usunie aktualn¹ zawartoœæ obszaru. Mimo to po³¹czyæ?";
    Message[ japanese ] = "̧²Ù‚̐ڑ±‚Íì‹Æ’†‚͈͓̔à—e‚ðíœ‚µ‚Ü‚·B‚»‚ê‚Å‚àÚ‘±‚µ‚Ü‚·‚©?";
    Message[ chinese_traditional ] = "¨Ï¥ÎÀɮ׳sµ²·|§R°£°Ï°ì¤º·í«eªº¤º®e¡C±zÁÙ¬O­n°õ¦æ³sµ²¡H";
    Message[ arabic ] = "ÓíÄÏí ÇÊÕÇá ÇáãáÝ Åáì ÍÐÝ ÇáãÍÊæíÇÊ ÇáÍÇáíÉ. åá ÊÑíÏ ÇáÇÊÕÇá Úáì ÇáÑÛã ãä Ðáß¿";
    Message[ greek ] = "Ìéá óýíäåóç áñ÷åßïõ äéáãñÜöåé ôï ôñÝ÷ïí ðåñéå÷üìåíï ôïõ ôìÞìáôïò. Íá ðñáãìáôïðïéçèåß ç óýíäåóç ðáñ´ üëá áõôÜ;";
    Message[ korean ] = "ÆÄÀÏ Á¢¼ÓÀÌ ÇöÀç ±¸¿ªÀÇ ³»¿ëÀ» »èÁ¦ ÇÒ°ÍÀÔ´Ï´Ù . ±×·¡µµ Á¢¼ÓÇϽðڽÀ´Ï±î?";
    Message[ turkish ] = "Bir dosya baðlantýsý, þu anki bölüm içeriðini silecek? Baðlantý yine de yapýlsýn mý?";
};
InfoBox REG_WRONG_PASSWORD
{
    BUTTONS = WB_OK ;
    DEFBUTTON = WB_DEF_OK ;
    /* ### ACHTUNG: Neuer Text in Resource? Es wurde ein falsches Paßwort eingegeben. : Es wurde ein falsches Passwort gesetzt */
    Message = "Es wurde ein falsches Passwort eingegeben." ;
    Message [ English ] = "A wrong password was specified." ;
    Message [ dutch ] = "Er werd een verkeerd wachtwoord aangegeven" ;
    Message [ english_us ] = "The password entered is invalid." ;
    Message [ italian ] = "È stata impostata una password errata" ;
    Message [ spanish ] = "Se empleó una contraseña falsa." ;
    Message [ french ] = "Le mot de passe indiqué est incorrect." ;
    Message [ swedish ] = "Det inmatade lösenordet är felaktigt" ;
    Message [ danish ] = "Den indtastede adgangskode er forkert." ;
    Message [ portuguese ] = "A senha especificada está errada." ;
    Message [ portuguese_brazilian ] = "Es wurde ein falsches Passwort gesetzt" ;
    Message[ chinese_simplified ] = "ÊäÈëµÄ¿ÚÁî´íÎó¡£";
    Message[ russian ] = "Ââåäåí íåïðàâèëüíûé ïàðîëü.";
    Message[ polish ] = "Zosta³o wpisane nieprawid³owe has³o.";
    Message[ japanese ] = "“ü—Í‚³‚ꂽÊ߽ܰÄނª³‚µ‚­‚ ‚è‚Ü‚¹‚ñB";
    Message[ chinese_traditional ] = "¿é¤Jªº±K½XµL®Ä¡C";
    Message[ arabic ] = "Êã ÅÏÎÇá ßáãÉ ÓÑ ÛíÑ ÕÍíÍÉ.";
    Message[ greek ] = "ÅéóáãùãÞ Üêõñïõ êùäéêïý ðñüóâáóçò.";
    Message[ korean ] = "ÁöÁ¤µÈ ÆÐ½º¿öµå°¡ À¯È¿ÇÏÁö ¾Ê½À´Ï´Ù.";
    Message[ turkish ] = "Girilen þifre yanlýþ.";
};
InfoBox REG_WRONG_PASSWD_REPEAT
{
    BUTTONS = WB_OK ;
    DEFBUTTON = WB_DEF_OK ;
    Message = "Das Passwort wurde nicht gesetzt." ;
    Message [ English ] = "The password has not been set." ;
    Message [ portuguese ] = "A senha não foi especificada." ;
    Message [ english_us ] = "The password has not been set." ;
    Message [ portuguese_brazilian ] = "Das Paßwort wurde nicht gesetzt." ;
    Message [ swedish ] = "Lösenordet har inte angivits." ;
    Message [ danish ] = "Adgangskoden blev ikke indtastet." ;
    Message [ italian ] = "La password non è stata impostata." ;
    Message [ spanish ] = "No se ha definido la contraseña." ;
    Message [ french ] = "Vous n'avez pas saisi de mot de passe !" ;
    Message [ dutch ] = "Er werd geen wachtwoord gedefinieerd." ;
    Message[ chinese_simplified ] = "»¹Î´É趨¿ÚÁî¡£";
    Message[ russian ] = "Ïàðîëü íå óñòàíîâëåí.";
    Message[ polish ] = "Has³o nie zosta³o wpisane.";
    Message[ japanese ] = "Ê߽ܰÄނªÝ’肳‚ê‚Ä‚¢‚Ü‚¹‚ñB";
    Message[ chinese_traditional ] = "ÁÙ¥¼³]©w±K½X¡C";
    Message[ arabic ] = "áã íÊã ÅÏÎÇá ßáãÉ ÇáÓÑ.";
    Message[ greek ] = "Äåí êáèïñßóôçêå êùäéêüò ðñüóâáóçò.";
    Message[ korean ] = "ÆÐ½º¿öµå°¡ ÁöÁ¤µÇÁö ¾Ê¾Ò½À´Ï´Ù.";
    Message[ turkish ] = "Þifre belirlenmedi.";
};

TabDialog DLG_INSERT_SECTION
{
    HelpId = HID_INSERT_SECTION_DLG;
    Text = "Bereich einfügen" ;
    Text [ English ] = "Insert Sections" ;
    Text [ norwegian ] = "Insert Sections" ;
    Text [ italian ] = "Inserisci sezioni" ;
    Text [ portuguese_brazilian ] = "Inserir Seções" ;
    Text [ portuguese ] = "Inserir secção" ;
    Text [ finnish ] = "Lisää osia" ;
    Text [ danish ] = "Indsæt område" ;
    Text [ french ] = "Insertion d'une section" ;
    Text [ swedish ] = "Infoga område" ;
    Text [ dutch ] = "Bereik invoegen" ;
    Text [ spanish ] = "Insertar área" ;
    Text [ english_us ] = "Insert Section" ;
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Moveable = TRUE ;
    TabControl 1
    {
        OutputSize = TRUE ;
        PageList =
        {
            PageItem
            {
                Identifier = TP_INSERT_SECTION;
                PageResID = TP_INSERT_SECTION;
                Text = "Bereich" ;
                Text [ ENGLISH ] = "Section" ;
                Text[ english_us ] = "Section";
                Text[ portuguese ] = "Secção";
                Text[ russian ] = "Îáëàñòü";
                Text[ greek ] = "Åíüôçôá";
                Text[ dutch ] = "Bereik";
                Text[ french ] = "Section";
                Text[ spanish ] = "Área";
                Text[ italian ] = "Sezione";
                Text[ danish ] = "Område";
                Text[ swedish ] = "Område";
                Text[ polish ] = "Obszar";
                Text[ portuguese_brazilian ] = "Section";
                Text[ japanese ] = "”͈Í";
                Text[ korean ] = "±¸¿ª";
                Text[ chinese_simplified ] = "ÇøÓò";
                Text[ chinese_traditional ] = "°Ï°ì";
                Text[ arabic ] = "ÇáäØÇÞ";
                Text[ turkish ] = "Bölüm";
            };
            PageItem
            {
                Identifier = TP_COLUMN ;
                PageResID = TP_COLUMN ;
                Text = "Spalten" ;
                Text [ ENGLISH ] = "Columns" ;
                Text [ norwegian ] = "Kolonner" ;
                Text [ italian ] = "Colonne" ;
                Text [ portuguese_brazilian ] = "Colunas" ;
                Text [ portuguese ] = "Colunas" ;
                Text [ finnish ] = "Sarakkeet" ;
                Text [ danish ] = "Kolonner" ;
                Text [ french ] = "Colonnes" ;
                Text [ swedish ] = "Kolumner" ;
                Text [ dutch ] = "Kolommen" ;
                Text [ spanish ] = "Columnas" ;
                Text [ english_us ] = "Columns" ;
                Text[ chinese_simplified ] = "À¸";
                Text[ russian ] = "Êîëîíêè";
                Text[ polish ] = "Kolumny";
                Text[ japanese ] = "’i‘g‚Ý";
                Text[ chinese_traditional ] = "Äæ";
                Text[ greek ] = "ÓôÞëåò";
                Text[ korean ] = "¿­";
                Text[ arabic ] = "ÇáÃÚãÏÉ";
                Text[ turkish ] = "Sütun";
            };
            PageItem
            {
                Identifier = TP_BACKGROUND ;
                PageResID = TP_BACKGROUND ;
                Text = "Hintergrund" ;
                Text [ ENGLISH ] = "Background" ;
                Text [ norwegian ] = "Background" ;
                Text [ italian ] = "Sfondo" ;
                Text [ portuguese_brazilian ] = "Fundo" ;
                Text [ portuguese ] = "Plano de fundo" ;
                Text [ finnish ] = "Tausta" ;
                Text [ danish ] = "Baggrund" ;
                Text [ french ] = "Arrière-plan" ;
                Text [ swedish ] = "Bakgrund" ;
                Text [ dutch ] = "Achtergrond" ;
                Text [ spanish ] = "Fondo" ;
                Text [ english_us ] = "Background" ;
                Text[ chinese_simplified ] = "±³¾°";
                Text[ russian ] = "Ôîí";
                Text[ polish ] = "T³o";
                Text[ japanese ] = "”wŒi";
                Text[ chinese_traditional ] = "­I´º";
                Text[ greek ] = "Öüíôï";
                Text[ korean ] = "¹è°æ";
                Text[ arabic ] = "ÇáÎáÝíÉ";
                Text[ turkish ] = "Artalan";
            };
            PageItem
            {
                Identifier = TP_SECTION_FTNENDNOTES ;
                PageResID = TP_SECTION_FTNENDNOTES ;
                Text = "Fuß-/Endnoten" ;
                Text [ ENGLISH ] = "Foot-/Endnotes" ;
                Text[ english_us ] = "Footnotes/Endnotes";
                Text[ portuguese ] = "Notas de rodapé/finais";
                Text[ russian ] = "Îáû÷íûå/Êîíöåâûå ñíîñêè";
                Text[ greek ] = "Õðïóçìåéþóåéò/Óçìåéþóåéò ôÝëïõò";
                Text[ dutch ] = "Voet-/eindnoten";
                Text[ french ] = "Notes de bas de page / de fin";
                Text[ spanish ] = "Notas al pie/finales";
                Text[ italian ] = "Note a piè di pagina/di chiusura";
                Text[ danish ] = "Fod-/slutnoter";
                Text[ swedish ] = "Fot-/slutnoter";
                Text[ polish ] = "Przypisy dolne / koñcowe";
                Text[ portuguese_brazilian ] = "Foot-/Endnotes";
                Text[ japanese ] = "‹r’/•¶––‹r’";
                Text[ korean ] = "°¢ÁÖ/¹ÌÁÖ";
                Text[ chinese_simplified ] = "×¢½ÅºÍβע";
                Text[ chinese_traditional ] = "ª`¸}©M§Àª`";
                Text[ arabic ] = "ÍæÇÔí ÓÝáíÉ/ÊÚáíÞÇÊ ÎÊÇãíÉ";
                Text[ turkish ] = "Dipnot/Sonnot";
            };
        };
    };
    String ST_INSERT
    {
        Text = "Einfügen" ;
        Text [ English ] = "~Insert" ;
        Text [ norwegian ] = "~Insert" ;
        Text [ italian ] = "Inserisci" ;
        Text [ portuguese_brazilian ] = "~Inserir" ;
        Text [ portuguese ] = "Inserir" ;
        Text [ finnish ] = "~Lisää" ;
        Text [ danish ] = "Indsæt" ;
        Text [ french ] = "Insérer" ;
        Text [ swedish ] = "Infoga" ;
        Text [ dutch ] = "Invoegen" ;
        Text [ spanish ] = "Insertar" ;
        Text [ english_us ] = "Insert" ;
        Text[ chinese_simplified ] = "²åÈë";
        Text[ russian ] = "Âñòàâèòü";
        Text[ polish ] = "Wstaw";
        Text[ japanese ] = "‘}“ü";
        Text[ chinese_traditional ] = "´¡¤J";
        Text[ arabic ] = "ÅÏÑÇÌ";
        Text[ greek ] = "ÅéóáãùãÞ";
        Text[ korean ] = "»ðÀÔ";
        Text[ turkish ] = "Ekle";
    };
    Text[ russian ] = "Âñòàâèòü îáëàñòü";
    Text[ greek ] = "ÐñïóèÞêç ôïìÝá";
    Text[ polish ] = "Wstaw obszar";
    Text[ japanese ] = "”͈͂̑}“ü";
    Text[ korean ] = "±¸¿ª»ðÀÔ";
    Text[ chinese_simplified ] = "²åÈëÇøÓò";
    Text[ chinese_traditional ] = "´¡¤J°Ï°ì";
    Text[ arabic ] = "ÅÏÑÇÌ äØÇÞ";
    Text[ turkish ] = "Bölüm ekle";
};

TabPage TP_INSERT_SECTION
{
    HelpID = HID_INSERT_SECTION_PAGE;
    SVLook = TRUE ;
    Pos = MAP_APPFONT ( 0 , 0 ) ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Hide = TRUE ;
    ComboBox ED_RNAME
    {
        Pos = MAP_APPFONT ( 12 , 14 ) ;
        Size = MAP_APPFONT ( 66 , 104 ) ;
        TabStop = TRUE ;
        AutoHScroll = TRUE ;
        SORT = TRUE ;
    };
    GroupBox GB_NEW_SECTION
    {
        OutputSize = TRUE ;
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 78 , 129 ) ;
        Text = "Neuer Bereich" ;
        Text [ English ] = "New section" ;
        Text [ english_us ] = "New section" ;
        Text [ italian ] = "Nuova area" ;
        Text [ spanish ] = "Nueva área" ;
        Text [ french ] = "Nouvelle section" ;
        Text [ dutch ] = "Nieuw bereik" ;
        Text [ swedish ] = "Nytt område" ;
        Text [ danish ] = "Nyt område" ;
        Text [ portuguese_brazilian ] = "Neuer Bereich" ;
        Text [ portuguese ] = "Nova secção" ;
        Text[ chinese_simplified ] = "ÐÂÇøÓò";
        Text[ russian ] = "Íîâàÿ îáëàñòü";
        Text[ polish ] = "Nowy obszar";
        Text[ japanese ] = "V‚µ‚¢”͈Í";
        Text[ chinese_traditional ] = "·s¼W°Ï°ì";
        Text[ arabic ] = "äØÇÞ ÌÏíÏ";
        Text[ greek ] = "ÍÝïò ôïìÝáò";
        Text[ korean ] = "»õ ±¸¿ª";
        Text[ turkish ] = "Yeni bölüm";
    };
    CheckBox CB_PROTECT
    {
        Pos = MAP_APPFONT ( 96 , 17 ) ;
        Size = MAP_APPFONT ( 100 , 12 ) ;
        TabStop = TRUE ;
        Text = "~Geschützt" ;
        Text [ English ] = "Pro~tected" ;
        Text [ norwegian ] = "Pro~tected" ;
        Text [ italian ] = "Pro~tetta" ;
        Text [ portuguese_brazilian ] = "Pro~tegido" ;
        Text [ portuguese ] = "Pro~teger" ;
        Text [ finnish ] = "~Suojattu" ;
        Text [ danish ] = "Beskyttet" ;
        Text [ french ] = "~Protégé" ;
        Text [ swedish ] = "~Skyddat" ;
        Text [ dutch ] = "~Beveiligd" ;
        Text [ spanish ] = "~Protegida" ;
        Text [ english_us ] = "~Protected" ;
        Text[ chinese_simplified ] = "Êܱ£»¤µÄ(~P)";
        Text[ russian ] = "Çàùèùåíî";
        Text[ polish ] = "Chroniony";
        Text[ japanese ] = "•ی삳‚ꂽ(~P)";
        Text[ chinese_traditional ] = "¨ü«OÅ@(~P)";
        Text[ arabic ] = "ãÍãí";
        Text[ language_user1 ] = "(ÄÄ) ÐñïóôáôåõìÝíï; - - - -";
        Text[ greek ] = "Ðñïóôáôåõüìåíï";
        Text[ korean ] = "º¸È£(~P)";
        Text[ turkish ] = "Korumalý";
    };
    CheckBox CB_HIDE
    {
        Pos = MAP_APPFONT ( 96 , 31 ) ;
        Size = MAP_APPFONT ( 100 , 10 ) ;
        CB_HIDE_TEXT
    };
    CheckBox CB_CONDITION
    {
        Pos = MAP_APPFONT ( 102 , 44 ) ;
        Size = MAP_APPFONT ( 80 , 10 ) ;
        Disable = TRUE ;
        CB_CONDITION_TEXT
    };
    Edit ED_CONDITION
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 185 , 43 ) ;
        Size = MAP_APPFONT ( 68 , 12 ) ;
        Disable = TRUE ;
        TabStop = TRUE ;
    };
    CheckBox CB_FILE
    {
        Pos = MAP_APPFONT ( 96 , 73 ) ;
        Size = MAP_APPFONT ( 60 , 10 ) ;
        TabStop = TRUE ;
        CB_FILE_TEXT
    };
    CheckBox CB_DDE
    {
        Pos = MAP_APPFONT ( 157 , 73 ) ;
        Size = MAP_APPFONT ( 30 , 10 ) ;
        Disable = TRUE ;
        CB_DDE_TEXT
    };
    FixedText FT_DDE
    {
        Pos = MAP_APPFONT ( 111 , 85 ) ;
        Size = MAP_APPFONT ( 84 , 10 ) ;
        Hide = TRUE ;
        FT_DDE_TEXT
    };
    FixedText FT_FILE
    {
        Pos = MAP_APPFONT ( 111 , 85 ) ;
        Size = MAP_APPFONT ( 84 , 10 ) ;
        Disable = TRUE ;
        FT_FILE_TEXT
    };
    Edit ED_FILE
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 111 , 97 ) ;
        Size = MAP_APPFONT ( 84 , 12 ) ;
        Disable = TRUE ;
        TabStop = TRUE ;
    };
    PushButton PB_FILE
    {
        Pos = MAP_APPFONT ( 204 , 97 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        Disable = TRUE ;
        TabStop = TRUE ;
        PB_FILE_TEXT
    };
    FixedText FT_SUBREG
    {
        Pos = MAP_APPFONT ( 111 , 113 ) ;
        Size = MAP_APPFONT ( 30 , 10 ) ;
        Disable = TRUE ;
        FT_SUBREG_TEXT
    };
    ComboBox LB_SUBREG
    {
        Pos = MAP_APPFONT ( 142 , 112 ) ;
        Size = MAP_APPFONT ( 53 , 50 ) ;
        DropDown = TRUE ;
        Disable = TRUE ;
        TabStop = TRUE ;
        Sort = TRUE ;
    };

    GroupBox GB_NEW_OPTIONS
    {
        OutputSize = TRUE ;
        Pos = MAP_APPFONT ( 90 , 3 ) ;
        Size = MAP_APPFONT ( 167 , 129 ) ;
        GB_OPTIONS_TEXT
    };
};

TabDialog DLG_SECTION_PROPERTIES
{
    HelpId = HID_SECTION_PROPERTIES_DLG;
    Text = "Optionen" ;
    Text [ English ] = "Options" ;
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Moveable = TRUE ;
    TabControl 1
    {
        OutputSize = TRUE ;
        PageList =
        {
            PageItem
            {
                Identifier = TP_COLUMN ;
                PageResID = TP_COLUMN ;
                Text = "Spalten" ;
                Text [ ENGLISH ] = "Columns" ;
                Text [ norwegian ] = "Kolonner" ;
                Text [ italian ] = "Colonne" ;
                Text [ portuguese_brazilian ] = "Colunas" ;
                Text [ portuguese ] = "Colunas" ;
                Text [ finnish ] = "Sarakkeet" ;
                Text [ danish ] = "Kolonner" ;
                Text [ french ] = "Colonnes" ;
                Text [ swedish ] = "Kolumner" ;
                Text [ dutch ] = "Kolommen" ;
                Text [ spanish ] = "Columnas" ;
                Text [ english_us ] = "Columns" ;
                Text[ chinese_simplified ] = "À¸";
                Text[ russian ] = "Êîëîíêè";
                Text[ polish ] = "Kolumny";
                Text[ japanese ] = "’i‘g‚Ý";
                Text[ chinese_traditional ] = "Äæ";
                Text[ greek ] = "ÓôÞëåò";
                Text[ korean ] = "¿­";
                Text[ arabic ] = "ÇáÃÚãÏÉ";
                Text[ turkish ] = "Sütun";
            };
            PageItem
            {
                Identifier = TP_BACKGROUND ;
                PageResID = TP_BACKGROUND ;
                Text = "Hintergrund" ;
                Text [ ENGLISH ] = "Background" ;
                Text [ norwegian ] = "Background" ;
                Text [ italian ] = "Sfondo" ;
                Text [ portuguese_brazilian ] = "Fundo" ;
                Text [ portuguese ] = "Plano de fundo" ;
                Text [ finnish ] = "Tausta" ;
                Text [ danish ] = "Baggrund" ;
                Text [ french ] = "Arrière-plan" ;
                Text [ swedish ] = "Bakgrund" ;
                Text [ dutch ] = "Achtergrond" ;
                Text [ spanish ] = "Fondo" ;
                Text [ english_us ] = "Background" ;
                Text[ chinese_simplified ] = "±³¾°";
                Text[ russian ] = "Ôîí";
                Text[ polish ] = "T³o";
                Text[ japanese ] = "”wŒi";
                Text[ chinese_traditional ] = "­I´º";
                Text[ greek ] = "Öüíôï";
                Text[ korean ] = "¹è°æ";
                Text[ arabic ] = "ÇáÎáÝíÉ";
                Text[ turkish ] = "Artalan";
            };
            PageItem
            {
                Identifier = TP_SECTION_FTNENDNOTES ;
                PageResID = TP_SECTION_FTNENDNOTES ;
                Text = "Fuß-/Endnoten" ;
                Text [ ENGLISH ] = "Foot-/Endnotes" ;
                Text[ english_us ] = "Footnotes/Endnotes";
                Text[ portuguese ] = "Notas de rodapé/finais";
                Text[ russian ] = "Îáû÷íûå/Êîíöåâûå ñíîñêè";
                Text[ greek ] = "Õðïóçìåéþóåéò/Óçìåéþóåéò ôÝëïõò";
                Text[ dutch ] = "Voet-/eindnoten";
                Text[ french ] = "Notes de bas de page / de fin";
                Text[ spanish ] = "Notas al pie/finales";
                Text[ italian ] = "Note a piè di pagina/di chiusura";
                Text[ danish ] = "Fod-/slutnoter";
                Text[ swedish ] = "Fot-/slutnoter";
                Text[ polish ] = "Przypisy dolne / koñcowe";
                Text[ portuguese_brazilian ] = "Foot-/Endnotes";
                Text[ japanese ] = "‹r’/•¶––‹r’";
                Text[ korean ] = "°¢ÁÖ/¹ÌÁÖ";
                Text[ chinese_simplified ] = "×¢½ÅºÍβע";
                Text[ chinese_traditional ] = "ª`¸}©M§Àª`";
                Text[ arabic ] = "ÍæÇÔí ÓÝáíÉ/ÊÚáíÞÇÊ ÎÊÇãíÉ";
                Text[ turkish ] = "Dipnot/Sonnot";
            };
        };
    };
    Text[ english_us ] = "Options";
    Text[ portuguese ] = "Opções";
    Text[ russian ] = "Ïàðàìåòðû";
    Text[ greek ] = "ÅðéëïãÝò";
    Text[ dutch ] = "Opties";
    Text[ french ] = "Options";
    Text[ spanish ] = "Opciones";
    Text[ italian ] = "Opzioni";
    Text[ danish ] = "Indstillinger";
    Text[ swedish ] = "Alternativ";
    Text[ polish ] = "Opcje";
    Text[ portuguese_brazilian ] = "Options";
    Text[ japanese ] = "µÌß¼®Ý";
    Text[ korean ] = "¿É¼Ç";
    Text[ chinese_simplified ] = "Ñ¡Ïî";
    Text[ chinese_traditional ] = "¿ï¶µ";
    Text[ arabic ] = "ÇáÎíÇÑÇÊ";
    Text[ turkish ] = "Seçenekler";
};


TabPage TP_SECTION_FTNENDNOTES
{
    HelpID = HID_SECTION_FTNENDNOTES_PAGE;
    SVLook = TRUE ;
    Pos = MAP_APPFONT ( 0 , 0 ) ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Hide = TRUE ;
    GroupBox GB_FTN
    {
        OutputSize = TRUE ;
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 248 , 59 ) ;
        Text = "Fußnoten" ;
        Text [ English ] = "Footnotes" ;
        Text[ english_us ] = "Footnotes";
        Text[ portuguese ] = "Notas de rodapé";
        Text[ russian ] = "Ñíîñêè";
        Text[ greek ] = "Õðïóçìåéþóåéò";
        Text[ dutch ] = "Voetnoten";
        Text[ french ] = "Notes de bas de page";
        Text[ spanish ] = "Notas al pie";
        Text[ italian ] = "Note a piè pagina";
        Text[ danish ] = "Fodnoter";
        Text[ swedish ] = "Fotnoter";
        Text[ polish ] = "Przypisy dolne";
        Text[ portuguese_brazilian ] = "Footnotes";
        Text[ japanese ] = "‹r’";
        Text[ korean ] = "°¢ÁÖ";
        Text[ chinese_simplified ] = "×¢½Å";
        Text[ chinese_traditional ] = "ª`¸}";
        Text[ arabic ] = "ÍæÇÔí ÓÝáíÉ";
        Text[ turkish ] = "Altbilgi";
    };
    CheckBox CB_FTN_AT_TXTEND
    {
        Pos = MAP_APPFONT ( 12 , 14 ) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        TabStop = TRUE ;
        Text = "am ~Textende sammeln" ;
        Text [ English ] = "Collect at end of text" ;
        Text[ english_us ] = "Collec~t at end of text";
        Text[ portuguese ] = "Agrupar no ~final do texto";
        Text[ russian ] = "Ñîáðàòü â êîíöå òåêñòà";
        Text[ greek ] = "ÓõãêÝíôñùóç óôï ôÝëïò ôïõ ~êåéìÝíïõ";
        Text[ dutch ] = "Aan ~teksteinde verzamelen";
        Text[ french ] = "Regrouper en ~fin de texte";
        Text[ spanish ] = "~recoger al final del texto";
        Text[ italian ] = "Raccogli a fine ~testo";
        Text[ danish ] = "saml ved tekstens slutning";
        Text[ swedish ] = "samla vid ~textslut";
        Text[ polish ] = "zbierz na koñcu tekstu";
        Text[ portuguese_brazilian ] = "Collect at end of text";
        Text[ japanese ] = "•¶‘––‚É‘}“ü(~T)";
        Text[ korean ] = "ÅØ½ºÆ® ³¡¿¡ ¼öÁý(~T)";
        Text[ chinese_simplified ] = "¼¯ÖÐÔÚÎı¾Î²¶Ë";
        Text[ chinese_traditional ] = "©w¦ì¦b¤º¤å¥½ºÝ";
        Text[ arabic ] = "ÊÌãíÚ ÚäÏ äåÇíÉ ÇáäÕ";

        Text[ turkish ] = "Metin sonunda topla";
    };
    CheckBox CB_FTN_NUM
    {
        Pos = MAP_APPFONT ( 12 , 29 ) ;
        Size = MAP_APPFONT ( 70 , 10 ) ;
        TabStop = TRUE ;
        Text = "~Nummer neu starten" ;
        Text [ English ] = "Restart number" ;
        Text[ english_us ] = "~Restart numbering";
        Text[ portuguese ] = "~Reiniciar numeração";
        Text[ russian ] = "Ïåðåçàïóñê íóìåðàöèè";
        Text[ greek ] = "Åðáíåêêß~íçóç áñéèìïý";
        Text[ dutch ] = "~Nieuwe nummering";
        Text[ french ] = "Numérotation ~séparée";
        Text[ spanish ] = "reiniciar nu~meración";
        Text[ italian ] = "Avvia nuovo ~numero";
        Text[ danish ] = "Uafhængig nummerering forfra";
        Text[ swedish ] = "oberoende ~numrering";
        Text[ polish ] = "Uruchom ponownie numer";
        Text[ portuguese_brazilian ] = "own number sequence";
        Text[ japanese ] = "”ԍ†‚ðV‚µ‚­Žn‚ß‚é(~R)";
        Text[ korean ] = "¹øÈ£ ¸Å±â±â ´Ù½Ã ½ÃÀÛ(~R)";
        Text[ chinese_simplified ] = "ÖØÐ¿ªÊ¼±àºÅ";
        Text[ chinese_traditional ] = "­«·s½s¸¹";
        Text[ arabic ] = "ÅÚÇÏÉ ÈÏÁ ÇáÊÑÞíã";
        Text[ turkish ] = "Num. yeniden baþlat";
    };
    FixedText FT_FTN_OFFSET
    {
        Pos = MAP_APPFONT ( 85 , 29 ) ;
        Size = MAP_APPFONT ( 36 , 8 ) ;
        Text = "~Beginn bei" ;
        Text [ ENGLISH ] = "~Start at" ;
        Left = TRUE ;
        Text [ english_us ] = "~Start at" ;
        Text [ italian ] = "Inizia con" ;
        Text [ spanish ] = "Comen~zar en" ;
        Text [ french ] = "À partir ~de" ;
        Text [ dutch ] = "~Begin met" ;
        Text [ swedish ] = "~Börja med" ;
        Text [ danish ] = "Begynd med" ;
        Text [ portuguese_brazilian ] = "Be~ginn bei" ;
        Text [ portuguese ] = "~Iniciar em" ;
        Text[ chinese_simplified ] = "¿ªÊ¼´Ó(~S)";
        Text[ russian ] = "Íà÷àòü ñ";
        Text[ polish ] = "Zacznij od";
        Text[ japanese ] = "ŠJŽn•¶––‹r’”ԍ†(~S)";
        Text[ chinese_traditional ] = "¶}©l±q(~S)";
        Text[ arabic ] = "ÇáÈÏÁ ÈÜ";
        Text[ greek ] = "ÈÝóç åêêßíçóçò";
        Text[ korean ] = "¿¡¼­ ½ÃÀÛ(~S)";
        Text[ turkish ] = "Baþlang~ýç";
    };
    NumericField FLD_FTN_OFFSET
    {
        Pos = MAP_APPFONT ( 136 , 29 ) ;
        Size = MAP_APPFONT ( 30 , 12 ) ;
        Spin = TRUE ;
        Minimum = 1 ;
        First = 1 ;
        Last = 9999 ;
        Maximum = 9999 ;
        TabStop = TRUE ;
        Border = TRUE ;
    };
    CheckBox CB_FTN_NUM_FMT
    {
        Pos = MAP_APPFONT ( 12 , 44 ) ;
        Size = MAP_APPFONT ( 70 , 10 ) ;
        TabStop = TRUE ;
        Text = "eigenes ~Format" ;
        Text [ English ] = "Own format" ;
        Text[ english_us ] = "Custom ~format";
        Text[ portuguese ] = "~Formato personalizado";
        Text[ russian ] = "ñîáñòâåííûé ôîðìàò";
        Text[ greek ] = "ÐñïóùðéêÞ ìïñ~öÞ";
        Text[ dutch ] = "Eigen ~formaat";
        Text[ french ] = "~Format personnalisé";
        Text[ spanish ] = "for~mato propio";
        Text[ italian ] = "~Formato proprio";
        Text[ danish ] = "eget format";
        Text[ swedish ] = "eget format";
        Text[ polish ] = "Format w³asny";
        Text[ portuguese_brazilian ] = "Own format";
        Text[ japanese ] = "”CˆÓ‚̏‘Ž®(~F)";
        Text[ korean ] = "°³ÀÎ ¼­½Ä(~F)";
        Text[ chinese_simplified ] = "×Ô¶¨µÄ¸ñʽ";
        Text[ chinese_traditional ] = "¦Û­q®æ¦¡";
        Text[ arabic ] = "ÊäÓíÞ ÎÇÕ";
        Text[ turkish ] = "Özgün format";
    };
    FixedText FT_FTN_PREFIX
    {
        Pos = MAP_APPFONT ( 85 , 44 ) ;
        Size = MAP_APPFONT ( 25 , 10 ) ;
        Text = "~Davor" ;
        Text [ ENGLISH ] = "Before" ;
        Text [ norwegian ] = "Før" ;
        Text [ italian ] = "~Davanti" ;
        Text [ portuguese_brazilian ] = "Antes" ;
        Text [ portuguese ] = "An~tes" ;
        Text [ finnish ] = "Edellä" ;
        Text [ danish ] = "Før" ;
        Text [ french ] = "A~vant" ;
        Text [ swedish ] = "~Före" ;
        Text [ dutch ] = "~Ervoor" ;
        Text [ spanish ] = "~Delante" ;
        Text [ english_us ] = "Be~fore" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "֮ǰ(~F)";
        Text[ russian ] = "Äî";
        Text[ polish ] = "Przed";
        Text[ japanese ] = "”ԍ†‘O(~F)";
        Text[ chinese_traditional ] = "¤§«e(~F)";
        Text[ arabic ] = "ÞÈá";
        Text[ greek ] = "Ðñéí áðü";
        Text[ korean ] = "Àü¿¡(~F)";
        Text[ turkish ] = "Önünde";
    };
    Edit ED_FTN_PREFIX
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 113 , 44 ) ;
        Size = MAP_APPFONT ( 20 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        MaxTextLength = 50 ;
    };
    ListBox LB_FTN_NUMVIEW
    {
        Border = TRUE ;
         Pos = MAP_APPFONT ( 136 , 44 ) ;
        Size = MAP_APPFONT ( 62 , 50 ) ;
        TabStop = TRUE ;
        Group = TRUE ;
        DropDown = TRUE ;
        CurPos = 0 ;
        StringList =
        {
            "A, B, C" ;
            "a, b, c" ;
            "I, II, III" ;
            "i, ii, iii" ;
            "1, 2, 3" ;
            "A, .., AA, .., AAA" ;
            "a, .., aa, .., aaa" ;
        };
    };
    FixedText FT_FTN_SUFFIX
    {
        Pos = MAP_APPFONT ( 201 , 44 ) ;
        Size = MAP_APPFONT ( 25 , 10 ) ;
        Text = "Dah~inter" ;
        Text [ ENGLISH ] = "Behind" ;
        Text [ norwegian ] = "Bak" ;
        Text [ italian ] = "D~ietro" ;
        Text [ portuguese_brazilian ] = "Atrás" ;
        Text [ portuguese ] = "A~trás" ;
        Text [ finnish ] = "Jäljessä" ;
        Text [ danish ] = "Efter" ;
        Text [ french ] = "A~près" ;
        Text [ swedish ] = "~Bakom" ;
        Text [ dutch ] = "E~rachter" ;
        Text [ spanish ] = "D~etrás" ;
        Text [ english_us ] = "Aft~er" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "Ö®ºó(~E)";
        Text[ russian ] = "Ïîñëå";
        Text[ polish ] = "Za";
        Text[ japanese ] = "”ԍ†Œã(~E)";
        Text[ chinese_traditional ] = "¤§«á(~E)";
        Text[ arabic ] = "ÈÚÏ";
        Text[ greek ] = "ÌåôÜ áðü";
        Text[ korean ] = "ÈÄ¿¡(~E)";
        Text[ turkish ] = "Önünde";
    };
    Edit ED_FTN_SUFFIX
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 229 , 44 ) ;
        Size = MAP_APPFONT ( 20 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        MaxTextLength = 50 ;
    };


    GroupBox GB_END
    {
        OutputSize = TRUE ;
        Pos = MAP_APPFONT ( 6 , 65 ) ;
        Size = MAP_APPFONT ( 248 , 59 ) ;
        Text = "Endnoten" ;
        Text [ English ] = "Endnotes" ;
        Text[ english_us ] = "Endnotes";
        Text[ portuguese ] = "Notas finais";
        Text[ russian ] = "Êîíöåâûå ñíîñêè";
        Text[ greek ] = "Óçìåéþóåéò ôÝëïõò";
        Text[ dutch ] = "Eindnoten";
        Text[ french ] = "Notes de fin";
        Text[ spanish ] = "Notas finales";
        Text[ italian ] = "Note di chiusura";
        Text[ danish ] = "Slutnoter";
        Text[ swedish ] = "Slutnoter";
        Text[ polish ] = "Przypisy koñcowe";
        Text[ portuguese_brazilian ] = "Endnotes";
        Text[ japanese ] = "•¶––‹r’";
        Text[ korean ] = "¹ÌÁÖ";
        Text[ chinese_simplified ] = "βע";
        Text[ chinese_traditional ] = "§Àª`";
        Text[ arabic ] = "ÊÚáíÞÇÊ ÎÊÇãíÉ";
        Text[ turkish ] = "Sonnot";
    };
    CheckBox CB_END_AT_TXTEND
    {
        Pos = MAP_APPFONT ( 12 , 76 ) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        TabStop = TRUE ;
        Text = "~am Bereichsende sammeln" ;
        Text[ english ] = "Collect at end of section";
        Text[ english_us ] = "C~ollect at end of section";
        Text[ portuguese ] = "Agrupar no ~final da secção";
        Text[ russian ] = "Ñîáðàòü â êîíöå îáëàñòè";
        Text[ greek ] = "ÓõãêÝíôñùóç óôï ôÝëïò ôïõ ~ôìÞìáôïò";
        Text[ dutch ] = "aan ~bereikseinde verzamelen";
        Text[ french ] = "Regrouper en fin de ~section";
        Text[ spanish ] = "recoger al fi~nal del área";
        Text[ italian ] = "Raccogli a fine sezione";
        Text[ danish ] = "saml ved områdets slutning";
        Text[ swedish ] = "samla vid ~områdets slut";
        Text[ polish ] = "zbierz na koñcu obszaru";
        Text[ portuguese_brazilian ] = "Collect at end of section";
        Text[ japanese ] = "”͈͖–‚É‘}“ü(~O)";
        Text[ korean ] = "±¸¿ª ³¡¿¡ ¼öÁý(~O)";
        Text[ chinese_simplified ] = "¼¯ÖÐÔÚÇøÓòβ¶Ë(~O)";
        Text[ chinese_traditional ] = "¦b°Ï°ì§ÀºÝ¦¬¶°";
        Text[ arabic ] = "ÊÌãíÚ ÚäÏ äåÇíÉ ÇáäØÇÞ";
        Text[ turkish ] = "Bölüm sonunda topla";
    };
    CheckBox CB_END_NUM
    {
        Pos = MAP_APPFONT ( 12 , 91 ) ;
        Size = MAP_APPFONT ( 70 , 10 ) ;
        TabStop = TRUE ;
        Text = "Nummer neu ~starten" ;
        Text [ English ] = "Restart number" ;
        Text[ english_us ] = "~Restart numbering";
        Text[ portuguese ] = "~Reiniciar numeração";
        Text[ russian ] = "Ïåðåçàïóñê íóìåðàöèè";
        Text[ greek ] = "Åðáíåêêßíç~óç áñéèìïý";
        Text[ dutch ] = "Nieuwe n~ummering";
        Text[ french ] = "Numérotation ~séparée";
        Text[ spanish ] = "rei~niciar numeración";
        Text[ italian ] = "Avvia nuovo numero";
        Text[ danish ] = "Uafhængig nummerering forfra";
        Text[ swedish ] = "oberoende ~numrering";
        Text[ polish ] = "Uruchom ponownie numer";
        Text[ portuguese_brazilian ] = "own number sequence";
        Text[ japanese ] = "”ԍ†‚ðV‚µ‚­Žn‚ß‚é(~R)";
        Text[ korean ] = "¹øÈ£ ¸Å±â±â ´Ù½Ã ½ÃÀÛ(~R)";
        Text[ chinese_simplified ] = "ÖØÐ¿ªÊ¼±àºÅ";
        Text[ chinese_traditional ] = "­«·s½s¸¹";
        Text[ arabic ] = "ÅÚÇÏÉ ÈÏÁ ÇáÊÑÞíã";
        Text[ turkish ] = "Num. yeniden baþlat";
    };
    FixedText FT_END_OFFSET
    {
        Pos = MAP_APPFONT ( 85 , 91 ) ;
        Size = MAP_APPFONT ( 36 , 8 ) ;
        Text = "Be~ginn bei" ;
        Text [ ENGLISH ] = "~Start at" ;
        Left = TRUE ;
        Text [ english_us ] = "~Start at" ;
        Text [ italian ] = "Inizia con" ;
        Text [ spanish ] = "Comen~zar en" ;
        Text [ french ] = "À partir ~de" ;
        Text [ dutch ] = "~Begin met" ;
        Text [ swedish ] = "~Börja vid" ;
        Text [ danish ] = "Begynd med" ;
        Text [ portuguese_brazilian ] = "Be~ginn bei" ;
        Text [ portuguese ] = "~Iniciar em" ;
        Text[ chinese_simplified ] = "¿ªÊ¼´Ó(~S)";
        Text[ russian ] = "Íà÷àòü ñ";
        Text[ polish ] = "Zacznij od";
        Text[ japanese ] = "ŠJŽn•¶––‹r’”ԍ†(~S)";
        Text[ chinese_traditional ] = "¶}©l±q(~S)";
        Text[ arabic ] = "ÇáÈÏÁ ÈÜ";
        Text[ greek ] = "ÈÝóç åêêßíçóçò";
        Text[ korean ] = "¿¡¼­ ½ÃÀÛ(~S)";
        Text[ turkish ] = "Baþlang~ýç";
    };
    NumericField FLD_END_OFFSET
    {
        Pos = MAP_APPFONT ( 136 , 91 ) ;
        Size = MAP_APPFONT ( 30 , 12 ) ;
        Spin = TRUE ;
        Minimum = 1 ;
        First = 1 ;
        Last = 9999 ;
        Maximum = 9999 ;
        TabStop = TRUE ;
        Border = TRUE ;
    };
    CheckBox CB_END_NUM_FMT
    {
        Pos = MAP_APPFONT ( 12 , 106 ) ;
        Size = MAP_APPFONT ( 70 , 10 ) ;
        TabStop = TRUE ;
        Text = "~eigenes Format" ;
        Text [ English ] = "Own format" ;
        Text[ english_us ] = "Custom format";
        Text[ portuguese ] = "Formato ~personalizado";
        Text[ russian ] = "ñîáñòâåííûé ôîðìàò";
        Text[ greek ] = "ÐñïóùðéêÞ ìïñöÞ";
        Text[ dutch ] = "~Eigen formaat";
        Text[ french ] = "Format ~personnalisé";
        Text[ spanish ] = "for~mato propio";
        Text[ italian ] = "Formato proprio";
        Text[ danish ] = "eget format";
        Text[ swedish ] = "~eget format";
        Text[ polish ] = "Format w³asny";
        Text[ portuguese_brazilian ] = "Own format";
        Text[ japanese ] = "”CˆÓ‚̏‘Ž®(~W)";
        Text[ korean ] = "ÀÚü ¼­½Ä(~W)";
        Text[ chinese_simplified ] = "×Ô¶¨µÄ¸ñʽ";
        Text[ chinese_traditional ] = "¦Û­q®æ¦¡";
        Text[ arabic ] = "ÊäÓíÞ ÎÇÕ";
        Text[ turkish ] = "Özgün format";
    };

    FixedText FT_END_PREFIX
    {
        Pos = MAP_APPFONT ( 85 , 106 ) ;
        Size = MAP_APPFONT ( 25 , 10 ) ;
        Text = "Da~vor" ;
        Text [ ENGLISH ] = "Before" ;
        Text [ norwegian ] = "Før" ;
        Text [ italian ] = "Da~vanti" ;
        Text [ portuguese_brazilian ] = "Antes" ;
        Text [ portuguese ] = "An~tes" ;
        Text [ finnish ] = "Edellä" ;
        Text [ danish ] = "Før" ;
        Text [ french ] = "A~vant" ;
        Text [ swedish ] = "~Före" ;
        Text [ dutch ] = "~Ervoor" ;
        Text [ spanish ] = "~Delante" ;
        Text [ english_us ] = "Be~fore" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "֮ǰ(~F)";
        Text[ russian ] = "Äî";
        Text[ polish ] = "Przed";
        Text[ japanese ] = "”ԍ†‘O(~F)";
        Text[ chinese_traditional ] = "¤§«e(~F)";
        Text[ arabic ] = "ÞÈá";
        Text[ greek ] = "Ðñéí áðü";
        Text[ korean ] = "¾Õ¿¡(~F)";
        Text[ turkish ] = "Önünde";
    };
    Edit ED_END_PREFIX
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 113 , 106 ) ;
        Size = MAP_APPFONT ( 20 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        MaxTextLength = 50 ;
    };
    ListBox LB_END_NUMVIEW
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 136 , 106 ) ;
        Size = MAP_APPFONT ( 62 , 50 ) ;
        TabStop = TRUE ;
        Group = TRUE ;
        DropDown = TRUE ;
        CurPos = 0 ;
        StringList =
        {
            "A, B, C" ;
            "a, b, c" ;
            "I, II, III" ;
            "i, ii, iii" ;
            "1, 2, 3" ;
            "A, .., AA, .., AAA" ;
            "a, .., aa, .., aaa" ;
        };
    };
    FixedText FT_END_SUFFIX
    {
        Pos = MAP_APPFONT ( 201 , 106 ) ;
        Size = MAP_APPFONT ( 25 , 10 ) ;
        Text = "Dahinte~r" ;
        Text [ ENGLISH ] = "Behind" ;
        Text [ norwegian ] = "Bak" ;
        Text [ italian ] = "Dietro" ;
        Text [ portuguese_brazilian ] = "Atrás" ;
        Text [ portuguese ] = "A~trás" ;
        Text [ finnish ] = "Jäljessä" ;
        Text [ danish ] = "Efter" ;
        Text [ french ] = "A~près" ;
        Text [ swedish ] = "~Bakom" ;
        Text [ dutch ] = "E~rachter" ;
        Text [ spanish ] = "D~etrás" ;
        Text [ english_us ] = "Aft~er" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "Ö®ºó(~E)";
        Text[ russian ] = "Ïîñëå";
        Text[ polish ] = "Za";
        Text[ japanese ] = "”ԍ†Œã(~E)";
        Text[ chinese_traditional ] = "¤§«á(~E)";
        Text[ arabic ] = "ÈÚÏ";
        Text[ greek ] = "ÌåôÜ áðü";
        Text[ korean ] = "ÈÄ¿¡(~E)";
        Text[ turkish ] = "Arkasýnda";
    };
    Edit ED_END_SUFFIX
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 229 , 106 ) ;
        Size = MAP_APPFONT ( 20 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        MaxTextLength = 50 ;
    };
};
diff --git a/sw/source/ui/dochdl/dochdl.src b/sw/source/ui/dochdl/dochdl.src
new file mode 100644
index 0000000..c708a22
--- /dev/null
+++ b/sw/source/ui/dochdl/dochdl.src
@@ -0,0 +1,431 @@
/*************************************************************************
 *
 *  $RCSfile: dochdl.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:34 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/


#include "dochdl.hrc"
#include "globals.hrc"


String STR_NOGLOS1
{
    /* ### ACHTUNG: Neuer Text in Resource? AutoText zum Kürzel ' : AutoText zum Kürzel '' */
    /* ### ACHTUNG: Neuer Text in Resource? AutoText zum Kürzel ' : AutoText zum Kürzel '' */
    /* ### ACHTUNG: Neuer Text in Resource? AutoText zum Kürzel ' : AutoText zum K³rzel ' */
    TEXT = "AutoText zum Kürzel '" ;
    TEXT [ English ] = "AutoText for Short Name '" ;
    TEXT [ norwegian ] = "AutoText for Short Name '" ;
    TEXT [ italian ] = "Testo automatico per la sigla" ;
    TEXT [ portuguese_brazilian ] = "Texto Automático para Abreviação" ;
    TEXT [ portuguese ] = "AutoTexto para abreviatura '" ;
    TEXT [ finnish ] = "Automaattitekstiä lyhenteelle '" ;
    TEXT [ danish ] = "AutoTekst til genvej '" ;
    TEXT [ french ] = "AutoTexte pour raccourci '" ;
    TEXT [ swedish ] = "AutoText till genvägen '" ;
    TEXT [ dutch ] = "AutoTekst voor afkortingen'" ;
    TEXT [ spanish ] = "AutoTexto para la abreviatura '" ;
    TEXT [ english_us ] = "AutoText for Shortcut '" ;
    TEXT[ chinese_simplified ] = "×Ô¶¯Í¼ÎÄËõд '";
    TEXT[ russian ] = "Àâòîòåêñò ê ñîêðàùåíèþ '";
    TEXT[ polish ] = "Autotekst do skrótu '";
    TEXT[ japanese ] = "“ü—ÍŽx‰‡‚̼®°Ä¶¯Ä '";
    TEXT[ chinese_traditional ] = "¦Û°Ê¹Ï¤å¶°ªºÁY¼g '";
    TEXT[ arabic ] = "äÕ ÊáÞÇÆí ááÇÎÊÕÇÑ '";
    TEXT[ dutch ] = "AutoTekst voor afkortingen'";
    TEXT[ chinese_simplified ] = "×Ô¶¯Í¼ÎÄËõд '";
    TEXT[ greek ] = "Áõôïêåßìåíï ðñïò ôç óõíôüìåõóç '";
    TEXT[ korean ] = "ÀÚµ¿ ÅØ½ºÆ® ¹Ù·Î°¡±â  '";
    TEXT[ turkish ] = "Otomatik metin kýsaltmasý '";
    TEXT[ language_user1 ] = " ";
};
String STR_NOGLOS2
{
    /* ### ACHTUNG: Neuer Text in Resource? ' nicht gefunden. : '' nicht gefunden. */
    /* ### ACHTUNG: Neuer Text in Resource? ' nicht gefunden. : '' nicht gefunden. */
    /* ### ACHTUNG: Neuer Text in Resource? ' nicht gefunden. : '' nicht gefunden. */
    /* ### ACHTUNG: Neuer Text in Resource? ' nicht gefunden. : '' nicht gefunden. */
    TEXT = "' nicht gefunden." ;
    TEXT [ English ] = "' not found." ;
    TEXT [ norwegian ] = "' not found." ;
    TEXT [ italian ] = "' non trovato." ;
    TEXT [ portuguese_brazilian ] = "' não encontrado." ;
    TEXT [ portuguese ] = "' não localizado." ;
    TEXT [ finnish ] = "' ei löydy." ;
    TEXT [ danish ] = "' blev ikke fundet." ;
    TEXT [ french ] = "' introuvable." ;
    TEXT [ swedish ] = "' hittades inte." ;
    TEXT [ dutch ] = "' niet gevonden." ;
    TEXT [ spanish ] = "' no se encontró." ;
    TEXT [ english_us ] = "' not found." ;
    TEXT[ chinese_simplified ] = "' ûÓб»ÕÒµ½¡£";
    TEXT[ russian ] = "' íå íàéäåí.";
    TEXT[ polish ] = "' nie znaleziono.";
    TEXT[ japanese ] = "' ‚ªŒ©‚‚©‚è‚Ü‚¹‚ñB";
    TEXT[ chinese_traditional ] = "' ¨S¦³³Q§ä¨ì¡C";
    TEXT[ arabic ] = "' ÛíÑ ãæÌæÏ.";
    TEXT[ dutch ] = "' niet gevonden.";
    TEXT[ chinese_simplified ] = "' ûÓб»ÕÒµ½¡£";
    TEXT[ greek ] = "' äåí âñÝèçêå.";
    TEXT[ korean ] = "' °¡ ¹ß°ßµÇÁö ¾Ê½À´Ï´Ù.";
    TEXT[ turkish ] = "' bulunamadý.";
    TEXT[ language_user1 ] = " ";
};

String STR_NO_TABLE
{
    /* ### ACHTUNG: Neuer Text in Resource? Zu diesem Zeitpunkt kann keine Tabelle eingefügt werden. : Zu diesem Zeitpunkt kann keine Tabelle eingef³gt werden. */
    Text = "Zu diesem Zeitpunkt kann keine Tabelle eingefügt werden." ;
    Text [ English ] = "Inserting a table is impossible now." ;
    Text [ norwegian ] = "Inserting a table is impossible now." ;
    Text [ italian ] = "Adesso è impossibile inserire una tabella." ;
    Text [ portuguese_brazilian ] = "Inserir a tabela é agora impossível." ;
    Text [ portuguese ] = "De momento não é possível inserir a tabela." ;
    Text [ finnish ] = "Taulukon lisääminen ei ole nyt mahdollista." ;
    Text [ danish ] = "Det er for tiden ikke muligt at indsætte en tabel" ;
    Text [ french ] = "Impossible d'insérer un tableau maintenant." ;
    Text [ swedish ] = "En tabell kan inte infogas vid denna tidpunkt." ;
    Text [ dutch ] = "Tabel kan op dit ogenblik niet worden ingevoegd." ;
    Text [ spanish ] = "Actualmente no se puede insertar ninguna tabla." ;
    Text [ english_us ] = "It is currently not possible to insert a table" ;
    Text[ chinese_simplified ] = "µ±Ç°ÎÞ·¨²åÈëÈκαí¸ñ¡£";
    Text[ russian ] = "Â íàñòîÿùåå âðåìÿ âñòàâèòü òàáëèöó íåâîçìîæíî.";
    Text[ polish ] = "W tym momencie nie mo¿e byæ wstawiona tabela.";
    Text[ japanese ] = "Œ»ÝA•\\‚Ì‘}“ü‚͂ł«‚Ü‚¹‚ñB";
    Text[ chinese_traditional ] = "·í«eµLªk´¡¤J¥ô¦óªí®æ¡C";
    Text[ arabic ] = "ÅÏÑÇÌ ÌÏæá ÛíÑ ããßä ÍÇáíÇð.";
    Text[ dutch ] = "Tabel kan op dit ogenblik niet worden ingevoegd.";
    Text[ chinese_simplified ] = "µ±Ç°ÎÞ·¨²åÈëÈκαí¸ñ¡£";
    Text[ greek ] = "Ðñïò ôï ðáñüí åßíáé áäýíáôïí íá åéóá÷èåß ðßíáêáò.";
    Text[ korean ] = "Ç¥¸¦ »ðÀÔÇϴ°ÍÀÌ ÇöÀç ºÒ°¡´ÉÇÕ´Ï´Ù.";
    Text[ turkish ] = "Þu an tablo eklenemiyor.";
    Text[ language_user1 ] = " ";
};


InfoBox MSG_ERR_INSERT_GLOS
{
    MESSAGE = "AutoText konnte nicht angelegt werden." ;
    MESSAGE [ English ] = "Could not insert AutoText." ;
    MESSAGE [ norwegian ] = "Could not insert AutoText." ;
    MESSAGE [ italian ] = "Impossibile creare voce di glossario." ;
    MESSAGE [ portuguese_brazilian ] = "Não pude inserir Texto Automático." ;
    MESSAGE [ portuguese ] = "Impossível inserir o AutoTexto." ;
    MESSAGE [ finnish ] = "Automaattitekstiä ei voi lisätä." ;
    MESSAGE [ danish ] = "Det var ikke muligt at oprette AutoTeksten." ;
    MESSAGE [ french ] = "Impossible de créer l'AutoTexte." ;
    MESSAGE [ swedish ] = "AutoText kunde inte skapas." ;
    MESSAGE [ dutch ] = "AutoTekst kon niet worden gemaakt" ;
    MESSAGE [ spanish ] = "No se pudo crear el AutoTexto." ;
    MESSAGE [ english_us ] = "AutoText could not be created." ;
    MESSAGE[ chinese_simplified ] = "ÎÞ·¨½¨Á¢×Ô¶¯Í¼Î£";
    MESSAGE[ russian ] = "Ñîçäàòü àâòîòåêñò íåâîçìîæíî.";
    MESSAGE[ polish ] = "Autotekst nie móg³ zostaæ utworzony.";
    MESSAGE[ japanese ] = "“ü—ÍŽx‰‡‚Å‚«‚Ü‚¹‚ñ";
    MESSAGE[ chinese_traditional ] = "µLªk«Ø¥ß¦Û°Ê¹Ï¤å¶°¡C";
    MESSAGE[ arabic ] = "ÊÚÐÑ Úãá äÕ ÊáÞÇÆí.";
    MESSAGE[ dutch ] = "AutoTekst kon niet worden gemaakt";
    MESSAGE[ chinese_simplified ] = "ÎÞ·¨½¨Á¢×Ô¶¯Í¼Î£";
    MESSAGE[ greek ] = "Äåí Þôáí äõíáôÞ ç åéóáãùãÞ ÁõôïÊåßìåíï.";
    MESSAGE[ korean ] = "ÀÚµ¿ ÅØ½ºÆ®¸¦ »ðÀÔÇÒ ¼ö ¾ø½À´Ï´Ù.";
    MESSAGE[ turkish ] = "Otomatik metin oluþturulamadý.";
    MESSAGE[ language_user1 ] = " ";
};

InfoBox MSG_CLPBRD_FORMAT_ERROR
{
    /* ### ACHTUNG: Neuer Text in Resource? Gewünschtes Clipboardformat steht nicht zur Verfügung. : Gew³nschtes Clipboardformat steht nicht zur Verf³gung. */
    MESSAGE = "Gewünschtes Clipboardformat steht nicht zur Verfügung." ;
    MESSAGE [ English ] = "Requested clipboard format is not available." ;
    MESSAGE [ norwegian ] = "Requested clipboard format is not available." ;
    MESSAGE [ italian ] = "Il formato appunti richiesto non è disponibile." ;
    MESSAGE [ portuguese_brazilian ] = "Formato solicitado de clipboard não está disponível." ;
    MESSAGE [ portuguese ] = "Formato da área de transferência solicitado não se encontra disponível." ;
    MESSAGE [ finnish ] = "Pyydetty leikepöydän muoto ei ole käytettävissä." ;
    MESSAGE [ danish ] = "Det anmodede udskriftsholderformat er ikke tilgængeligt." ;
    MESSAGE [ french ] = "Le format de presse-papiers souhaité n'est pas disponible." ;
    MESSAGE [ swedish ] = "Önskat urklippformat står inte till förfogande." ;
    MESSAGE [ dutch ] = "Gevraagd clipboardformaat is niet beschikbaar." ;
    MESSAGE [ spanish ] = "El formato deseado del portapapeles no está disponible." ;
    MESSAGE [ english_us ] = "Requested clipboard format is not available." ;
    MESSAGE[ chinese_simplified ] = "ËùÐèÒªµÄ²Ã¼ô°å¸ñʽ²»´æÔÚ¡£";
    MESSAGE[ russian ] = "Æåëàåìûé ôîðìàò áóôåðà îáìåíà íåäîñòóïåí.";
    MESSAGE[ polish ] = "Szukany format schowka jest niedostêpny.";
    MESSAGE[ japanese ] = "Žw’è‚̸دÌßܰÄޏ‘Ž®‚ÍŽg—p‚Å‚«‚Ü‚¹‚ñB";
    MESSAGE[ chinese_traditional ] = "©Ò»Ý­nªºµô°Åï®æ¦¡¤£¦s¦b¡C";
    MESSAGE[ arabic ] = "ÊäÓíÞ ÇáÍÇÝÙÉ ÇáãØáæÈ ÛíÑ ãÊæÝÑ.";
    MESSAGE[ dutch ] = "Gevraagd clipboardformaat is niet beschikbaar.";
    MESSAGE[ chinese_simplified ] = "ËùÐèÒªµÄ²Ã¼ô°å¸ñʽ²»´æÔÚ¡£";
    MESSAGE[ greek ] = "Ç æçôïýìåíç ìïñöÞ ôïõ clipboard äåí åßíáé äéáèÝóéìç.";
    MESSAGE[ korean ] = "¿äûµÈ Ŭ¸³º¸µå ¼­½ÄÀÌ °¡´ÉÇÏÁö ¾Ê½À´Ï´Ù.";
    MESSAGE[ turkish ] = "Ýstenen pano formatý mevcut deðil.";
    MESSAGE[ language_user1 ] = " ";
};

QueryBox MSG_UPDATE_NEW_GLOS_FMT
{
    BUTTONS = WB_YES_NO ;
    DEFBUTTON = WB_DEF_YES ;
    MESSAGE = "Der Bereich liegt in einem alten Format vor.\nEr muss konvertiert werden, um Änderungen\nspeichern zu können.\nSoll er konvertiert werden?" ;
    MESSAGE [ English ] = "The file format of the region is out-of-date.\nIt must be converted in order to save modifications.\nDo you want to convert it?" ;
    MESSAGE [ norwegian ] = "The file format of the region is out-of-date.\nIt must be converted in order to save modifications.\nDo you want to convert it?" ;
    MESSAGE [ italian ] = "Il formato dell'area è vecchio.\nÈ necessario convertirlo per poter\nsalvare le modifiche apportate\nVolete convertirlo?" ;
    MESSAGE [ portuguese_brazilian ] = "O formato de arquivo da regiao está desatualizado.\nDeve ser convertido para que se possa gravar modificações.\nDeseja convertê-lo?" ;
    MESSAGE [ portuguese ] = "O formato do ficheiro está desactualizado.\nDeve ser convertido para que se possam\n guardar as respectivas alterações.\nDeseja convertê-lo?" ;
    MESSAGE [ finnish ] = "Alueen tiedostomuoto ei ole ajan tasalla.\nSe on muunnettava, jotta muutokset voitaisiin tallentaa.\nHaluatko muuntaa sen?" ;
    MESSAGE [ danish ] = "Områdets filformat er forældet.\nDet skal konverteres, for at ændringerne kan gemmes.\nVil du konvertere det?" ;
    MESSAGE [ french ] = "La section se trouve dans un format périmé.\nVous ne pourrrez enregistrer aucune modification \n à moins de le convertir.\nVoulez-vous procéder à la conversion sans plus attendre ?" ;
    MESSAGE [ swedish ] = "Området har ett gammalt format.\nDet måste konverteras för att\nändringar skall kunna sparas.\nVill Du konvertera det?" ;
    MESSAGE [ dutch ] = "Het bereik heeft een verouderd formaat.\nHet moet worden geconverteerd om de wijzigingen\nte kunnen opslaan.\nWilt u de conversie nu uitvoeren?" ;
    MESSAGE [ spanish ] = "El formato del área no es actual.\nHay que convertirlo\npara poder guardar las modificaciones.\n¿Desea usted convertirlo?" ;
    MESSAGE [ english_us ] = "The section format is outdated.\nIt needs to be converted so that changes\ncan be saved.\nShould it be converted now?" ;
    /* ### ACHTUNG: Neuer Text in Resource? Der Bereich liegt in einem alten Format vor.\nEr muß konvertiert werden, um Änderungen\nspeichern zu können.\nSoll er konvertiert werden? : Der Bereich liegt in einem alten Format vor.\nEr mu˜ konvertiert werden, um Žnderungen\nspeichern zu k÷nnen.\nSoll er konvertiert werden? */
    Message = "Der Bereich liegt in einem alten Format vor.\nEr muss konvertiert werden, um Änderungen\nspeichern zu können.\nSoll er konvertiert werden?" ;
    Message[ chinese_simplified ] = "Õâ¸öÇøÓò¾ßÓеĸñʽÊǾɵġ£\nÒª´æÅ̸ü¸Ä¾Í±ØÐë½øÐиñʽת»»¡£\nҪת»»¸ñʽÂð£¿";
    Message[ russian ] = "Ðàçäåë ïðåäñòàâëåí â ñòàðîì ôîðìàòå.\nÅãî íåîáõîäèìî ïðåîáðàçîâàòü, ñ òåì ÷òîáû ìîæíî \náûëî ñîõðàíèòü èçìåíåíèÿ\n.Ïðåîáðàçîâàòü?";
    Message[ polish ] = "Format obszaru nie jest aktualny.\nObszar musi byæ skonwertowany, by mo¿na by³o zapisaæ zmiany\n. Skonwertowaæ go?";
    Message[ japanese ] = "‚±‚͈̔͂͋Œ‘Ž®‚É‚ ‚è‚Ü‚·B\n•ύX‚ð•Û‘¶‚·‚é‚É‚Í\n‘Ž®‚ð•ÏŠ·‚µ‚È‚¯‚ê‚΂Ȃè‚Ü‚¹‚ñB\n‘Ž®•ÏŠ·‚µ‚Ü‚·‚©?";
    Message[ chinese_traditional ] = "³o­Ó°Ï°ìªº®æ¦¡¬Oªº¡C\n­nÀx¦sÅܧó´N¥²¶·Âà´«¥¦®æ¦¡¡C\n±z­nÂà´«¥¦ªº®æ¦¡¡H";
    Message[ arabic ] = "ÊäÓíÞ ÇáäØÇÞ ÞÏíã.\níÌÈ ÊÍæíáå¡ ÍÊì íãßä \nÍÝÙ ÇáÊÛííÑÇÊ.\nåá ÊÑíÏ ÊÍæíáå¿";
    Message[ dutch ] = "Het bereik heeft een verouderd formaat.\nHet moet worden geconverteerd om de wijzigingen\nte kunnen opslaan.\nWilt u de conversie nu uitvoeren?";
    Message[ chinese_simplified ] = "Õâ¸öÇøÓò¾ßÓеĸñʽÊǾɵġ£\nÒª´æÅ̸ü¸Ä¾Í±ØÐë½øÐиñʽת»»¡£\nҪת»»¸ñʽÂð£¿";
    Message[ greek ] = "Ç ðåñéï÷Þ õðÜñ÷åé óå ðáëéÜ ìïñöÞ.\nÐñÝðåé íá ãßíåé ìåôáôñïðÞ ôçò ãéá íá åßíáé äõíáôÞ\nç áðïèÞêåõóç ôùí áëëáãþí.\nÈÝëåôå íá ãßíåé ç ìåôáôñïðÞ;";
    Message[ korean ] = "±¸¿ª ¼­½ÄÀÌ ¿À·¡µÈ°ÍÀÔ´Ï´Ù.\n À̰ÍÀ» º¯È¯ÇÏ¿©¾ß º¯°æÀÌ\nÀúÀåÀ̵˴ϴÙ.\n Áö±Ý º¯È¯ ÇϽðڽÀ´Ï±î?";
    Message[ turkish ] = "Bölümün formatý eski.\nDeðiþikliklerin kaydedilebilmesi n\niçin deðiþtirilmesi gerekiyor.\nFormat deðiþtirilsin mi?";
    Message[ language_user1 ] = " ";
};

String STR_PRIVATETEXT
{
    /* ### ACHTUNG: Neuer Text in Resource? StarWriter : Formatierter Text [StarWriter] */
    Text = "StarOffice Writer" ;
    Text [ dutch ] = "StarOffice Writer" ;
    Text [ english_us ] = "StarOffice Writer" ;
    Text [ italian ] = "StarOffice Writer" ;
    Text [ spanish ] = "StarOffice Writer" ;
    Text [ french ] = "StarOffice Writer" ;
    Text [ swedish ] = "StarOffice Writer" ;
    Text [ danish ] = "StarOffice Writer" ;
    Text [ portuguese ] = "StarOffice Writer" ;
    Text [ portuguese_brazilian ] = "StarOffice Writer" ;
    Text[ chinese_simplified ] = "StarOffice Writer";
    Text[ russian ] = "StarOffice Writer";
    Text[ polish ] = "StarOffice Writer";
    Text[ japanese ] = "StarOffice Writer";
    Text[ chinese_traditional ] = "StarOffice Writer";
    Text[ arabic ] = "StarOffice Writer";
    Text[ greek ] = "StarOffice Writer";
    Text[ korean ] = "StarOffice Writer";
    Text[ turkish ] = "StarOffice Writer";
    Text[ language_user1 ] = " ";
};
String STR_PRIVATEGRAPHIC
{
    Text = "Grafik [StarOffice Writer]" ;
    Text [ ENGLISH ] = "Graphic [StarOffice Writer]" ;
    Text [ norwegian ] = "Graphic [StarOffice Writer]" ;
    Text [ italian ] = "Immagine [StarOffice Writer]" ;
    Text [ portuguese_brazilian ] = "Gráfico [StarOffice Writer]" ;
    Text [ portuguese ] = "Imagem [StarOffice Writer]" ;
    Text [ finnish ] = "Kuva [StarOffice Writer]" ;
    Text [ danish ] = "Grafik [StarOffice Writer]" ;
    Text [ french ] = "Image [StarOffice Writer]" ;
    Text [ swedish ] = "Grafik [StarOffice Writer]" ;
    Text [ dutch ] = "Afbeelding [StarOffice Writer]" ;
    Text [ spanish ] = "Imagen [StarOffice Writer]" ;
    Text [ english_us ] = "Graphics [StarOffice Writer]" ;
    Text[ chinese_simplified ] = "ͼÐÎ [StarOffice Writer]";
    Text[ russian ] = "Ðèñóíîê [StarOffice Writer]";
    Text[ polish ] = "Grafika [StarOffice Writer]";
    Text[ japanese ] = "¸Þ×̨¯¸ [StarOffice Writer]";
    Text[ greek ] = "Ãñáöéêü [StarOffice Writer]";
    Text[ korean ] = "±×·¡ÇÈ [StarOffice Writer]";
    Text[ chinese_traditional ] = "¹Ï§Î [StarOffice Writer]";
    Text[ arabic ] = "[StarOffice Writer] ÑÓæãÇÊ";
    Text[ turkish ] = "Grafik [StarOffice Writer]";
};
String STR_PRIVATEOLE
{
    Text = "Objekt [StarOffice Writer]" ;
    Text [ ENGLISH ] = "Object [StarOffice Writer]" ;
    Text [ english_us ] = "Object [StarOffice Writer]" ;
    Text [ italian ] = "Oggetto [StarOffice Writer]" ;
    Text [ spanish ] = "Objeto [StarOffice Writer]" ;
    Text [ french ] = "Objet [StarOffice Writer]" ;
    Text [ dutch ] = "Object [StarOffice Writer]" ;
    Text [ swedish ] = "Objekt [StarOffice Writer]" ;
    Text [ danish ] = "Objekt [StarOffice Writer]" ;
    Text [ portuguese ] = "Objecto [StarOffice Writer]" ;
    Text [ portuguese_brazilian ] = "Objekt [StarOffice Writer]" ;
    Text[ chinese_simplified ] = "¶ÔÏó [StarOffice Writer]";
    Text[ russian ] = "Îáúåêò [StarOffice Writer]";
    Text[ polish ] = "Obiekt [StarOffice Writer]";
    Text[ japanese ] = "µÌÞ¼Þª¸Ä [StarOffice Writer]";
    Text[ greek ] = "Áíôéêåßìåíï [StarOffice Writer]";
    Text[ korean ] = "°³Ã¼ [StarOffice Writer]";
    Text[ chinese_traditional ] = "ª«¥ó [StarOffice Writer]";
    Text[ arabic ] = "[StarOffice Writer]ßÇÆä ";
    Text[ turkish ] = "Nesne [StarOffice Writer]";
};
String STR_DDEFORMAT
{
    /* ### ACHTUNG: Neuer Text in Resource? DDE Verknüpfung : DDE Verkn³pfung */
    Text = "DDE Verknüpfung" ;
    Text [ ENGLISH ] = "DDE link" ;
    Text [ norwegian ] = "DDE link" ;
    Text [ italian ] = "Collegamento DDE" ;
    Text [ portuguese_brazilian ] = "Ligação do DDE" ;
    Text [ portuguese ] = "Ligação DDE" ;
    Text [ finnish ] = "DDE-linkki" ;
    Text [ danish ] = "DDE-kæde" ;
    Text [ french ] = "Lien DDE" ;
    Text [ swedish ] = "DDE-länk" ;
    Text [ dutch ] = "DDE-koppeling" ;
    Text [ spanish ] = "Vínculo DDE" ;
    Text [ english_us ] = "DDE link" ;
    Text[ chinese_simplified ] = "DDE Á´½Ó";
    Text[ russian ] = "Ññûëêà DDE";
    Text[ polish ] = "£¹cza DDE ";
    Text[ japanese ] = "DDE ØÝ¸";
    Text[ chinese_traditional ] = "DDE ±¶®|";
    Text[ arabic ] = "ÇÑÊÈÇØ DDE";
    Text[ dutch ] = "DDE-koppeling";
    Text[ chinese_simplified ] = "DDE Á´½Ó";
    Text[ greek ] = "Óýíäåóìïò DDE";
    Text[ korean ] = "DDE ¿¬°á";
    Text[ turkish ] = "DDE baðlantýsý";
    Text[ language_user1 ] = " ";
};
String STR_RTFFORMAT
{
    Text = "Formatierter Text [RTF]" ;
    Text [ ENGLISH ] = "Formatted text [RTF]" ;
    Text [ norwegian ] = "Formatert tekst [RTF]" ;
    Text [ italian ] = "Testo formattato [RTF]" ;
    Text [ portuguese_brazilian ] = "Texto formatado [RTF]" ;
    Text [ portuguese ] = "Texto formatado [RTF]" ;
    Text [ finnish ] = "Muotoiltu teksti [RTF]" ;
    Text [ danish ] = "Formateret tekst [RTF]" ;
    Text [ french ] = "Texte formaté [RTF]" ;
    Text [ swedish ] = "Formaterad text [RTF]" ;
    Text [ dutch ] = "Opgemaakte tekst [RTF]" ;
    Text [ spanish ] = "Texto formateado [RTF]" ;
    Text [ english_us ] = "Formatted text [RTF]" ;
    Text[ chinese_simplified ] = "ÒѸñʽ»¯µÄÎı¾[RTF]";
    Text[ russian ] = "Îòôîðìàòèðîâàííûé òåêñò [RTF]";
    Text[ polish ] = "Sformatowany tekst [RTF]";
    Text[ japanese ] = "‘Ž®Ý’èÏ‚Ý‚Ì÷½Ä [RTF]";
    Text[ greek ] = "ÌïñöïðïéçìÝíï êåßìåíï [RTF]";
    Text[ korean ] = "¼­½ÄÀÖ´Â ÅØ½ºÆ® [RTF]";
    Text[ chinese_traditional ] = "¤w¸g®æ¦¡¤Æªº¤å¦r [RTF]";
    Text[ arabic ] = "[RTF]äÕ ãõäÓÞ ";
    Text[ turkish ] = "Formatlý metin [RTF]";
};
String STR_TEXTFORMAT
{
    Text = "Unformatierter Text" ;
    Text [ ENGLISH ] = "Unformatted Text" ;
    Text [ norwegian ] = "Uformatert Tekst" ;
    Text [ italian ] = "Testo non formattato" ;
    Text [ portuguese_brazilian ] = "Texto Não Formatado" ;
    Text [ portuguese ] = "Texto não formatado" ;
    Text [ finnish ] = "Muotoilematon teksti" ;
    Text [ danish ] = "Uformateret tekst" ;
    Text [ french ] = "Texte non formaté" ;
    Text [ swedish ] = "Oformaterad text" ;
    Text [ dutch ] = "Tekst zonder opmaak" ;
    Text [ spanish ] = "Texto no formateado" ;
    Text [ english_us ] = "Unformatted text" ;
    Text[ chinese_simplified ] = "δ¸ñʽ»¯µÄÎı¾";
    Text[ russian ] = "Íåîòôîðìàòèðîâàííûé òåêñò";
    Text[ polish ] = "Tekst bez formatu";
    Text[ japanese ] = "‘Ž®Ý’肳‚ê‚Ä‚¢‚È‚¢Ã·½Ä";
    Text[ chinese_traditional ] = "¥¼®æ¦¡¤Æªº¤å¦r";
    Text[ arabic ] = "äÕ ÛíÑ ãäÓÞ";
    Text[ dutch ] = "Tekst zonder opmaak";
    Text[ chinese_simplified ] = "δ¸ñʽ»¯µÄÎı¾";
    Text[ greek ] = "Êåßìåíï ÷ùñßò ìïñöïðïßçóç";
    Text[ korean ] = "¼­½Ä¾ø´Â ÅØ½ºÆ®";
    Text[ turkish ] = "Formatlanmamýþ metin";
    Text[ language_user1 ] = " ";
};
























diff --git a/sw/source/ui/dochdl/gloshdl.cxx b/sw/source/ui/dochdl/gloshdl.cxx
new file mode 100644
index 0000000..aee3290
--- /dev/null
+++ b/sw/source/ui/dochdl/gloshdl.cxx
@@ -0,0 +1,1099 @@
/*************************************************************************
 *
 *  $RCSfile: gloshdl.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:34 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef __RSC //autogen
#include <tools/errinf.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SFXMACITEM_HXX //autogen
#include <svtools/macitem.hxx>
#endif
#ifndef _SFX_FCONTNR_HXX
#include <sfx2/fcontnr.hxx>
#endif
#ifndef _SFXDOCFILE_HXX
#include <sfx2/docfile.hxx>
#endif
#ifndef _OFAACCFG_HXX //autogen
#include <offmgr/ofaaccfg.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#define _SVSTDARR_STRINGS
#include <svtools/svstdarr.hxx>

#ifndef SVTOOLS_URIHELPER_HXX
#include <svtools/urihelper.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _UITOOL_HXX
#include <uitool.hxx>                   // Fehlermeldungen
#endif
#ifndef _SWVIEW_HXX //autogen
#include <view.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _SWEVENT_HXX
#include <swevent.hxx>
#endif
#ifndef _GLOSHDL_HXX
#include <gloshdl.hxx>
#endif
#ifndef _GLOSDOC_HXX
#include <glosdoc.hxx>
#endif
#ifndef _GLOSSARY_HXX
#include <glossary.hxx>
#endif
#ifndef _SHELLIO_HXX
#include <shellio.hxx>
#endif
#ifndef _SWUNDO_HXX
#include <swundo.hxx>                   // fuer Undo-Ids
#endif

#ifndef _SELGLOS_HXX
#include <selglos.hxx>
#endif
#ifndef _EXPFLD_HXX
#include <expfld.hxx>
#endif
#ifndef _INITUI_HXX
#include <initui.hxx>                   // fuer ::GetGlossaries()
#endif
#ifndef _GLOSLST_HXX
#include <gloslst.hxx>
#endif
#ifndef _DATAEX_HXX
#include <dataex.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif

#ifndef _DOCHDL_HRC
#include <dochdl.hrc>
#endif
#ifndef _SWERROR_H
#include <swerror.h>
#endif


// PUBLIC METHODES -------------------------------------------------------
struct TextBlockInfo_Impl
{
    String sTitle;
    String sLongName;
    String sGroupName;
};
typedef TextBlockInfo_Impl* TextBlockInfo_ImplPtr;
SV_DECL_PTRARR_DEL( TextBlockInfoArr, TextBlockInfo_ImplPtr, 0, 4 )
SV_IMPL_PTRARR( TextBlockInfoArr, TextBlockInfo_ImplPtr )
/*------------------------------------------------------------------------
    Beschreibung:   Dialog fuer Bearbeiten Vorlagen
------------------------------------------------------------------------*/


void SwGlossaryHdl::GlossaryDlg()
{
    SwGlossaryDlg* pDlg = new SwGlossaryDlg( pViewFrame, this, pWrtShell );
    String sName, sShortName;

    if( RET_EDIT == pDlg->Execute() )
    {
        sName = pDlg->GetCurrGrpName();
        sShortName = pDlg->GetCurrShortName();
    }

    delete pDlg;
    DELETEZ(pCurGrp);
    if(HasGlossaryList())
    {
        GetGlossaryList()->ClearGroups();
    }

    if( sName.Len() || sShortName.Len() )
        rStatGlossaries.EditGroupDoc( sName, sShortName );
}

/*------------------------------------------------------------------------
    Beschreibung:   Setzen der aktuellen Gruppe; falls aus dem Dialog
                    gerufen, wird die Gruppe temp. erzeugt fuer einen
                    schnelleren Zugriff
------------------------------------------------------------------------*/


void SwGlossaryHdl::SetCurGroup(const String &rGrp, BOOL bApi, BOOL bAlwaysCreateNew )
{
    String sGroup(rGrp);
    if(STRING_NOTFOUND == sGroup.Search(GLOS_DELIM) && !FindGroupName(sGroup))
    {
        sGroup += GLOS_DELIM;
        sGroup += '0';
    }
    if(pCurGrp)
    {
        BOOL bPathEqual = FALSE;
        if(!bAlwaysCreateNew)
        {
            const String& sCurPath = URIHelper::SmartRelToAbs(pCurGrp->GetFileName());
            xub_StrLen nSlashPos = sCurPath.SearchBackward( INET_PATH_TOKEN );
            const String sCurEntryPath = sCurPath.Copy(0, nSlashPos);
            const SvStrings* pPathArr = rStatGlossaries.GetPathArray();
            USHORT nCurrentPath = USHRT_MAX;
            for(USHORT nPath = 0; nPath < pPathArr->Count(); nPath++)
            {
                if(sCurEntryPath == *(*pPathArr)[nPath])
                {
                    nCurrentPath = nPath;
                    break;
                }
            }
            String sPath = sGroup.GetToken(1, GLOS_DELIM);
            USHORT nComparePath = (USHORT)sPath.ToInt32();
            const String sCurBase = sCurPath.Copy(nSlashPos +  1, sCurPath.Len() - nSlashPos - 5);
            if(nCurrentPath == nComparePath &&
                sGroup.GetToken(0, GLOS_DELIM) == sCurBase)
                bPathEqual = TRUE;
        }
//      const String aMac_Tmp(pCurGrp->GetName());
        // Beim Pfadwechsel kann man sich auf den Namen nicht verlassen
        if(!bAlwaysCreateNew &&
                bPathEqual
//      aMac_Tmp == sGroup
        )
            return;
    }
    aCurGrp = sGroup;
    if(!bApi)
    {
        if(pCurGrp)
        {
            rStatGlossaries.PutGroupDoc(pCurGrp);
            pCurGrp = 0;
        }
        pCurGrp = rStatGlossaries.GetGroupDoc(aCurGrp, TRUE);
    }
}

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/


USHORT SwGlossaryHdl::GetGroupCnt() const
{
    return rStatGlossaries.GetGroupCnt();
}

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/


String SwGlossaryHdl::GetGroupName( USHORT nId, String* pTitle )
{
    String sRet = rStatGlossaries.GetGroupName(nId);
    if(pTitle)
    {
        SwTextBlocks* pGroup = rStatGlossaries.GetGroupDoc(sRet, FALSE);
        if(pGroup)
        {
            *pTitle = pGroup->GetName();
            if(!pTitle->Len())
            {
                *pTitle = sRet.GetToken(0, GLOS_DELIM);
                pGroup->SetName(*pTitle);
            }
            rStatGlossaries.PutGroupDoc( pGroup );
        }

    }
    return sRet;
}
/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/


BOOL SwGlossaryHdl::NewGroup(String &rGrpName, const String& rTitle)
{
    if(STRING_NOTFOUND == rGrpName.Search(GLOS_DELIM))
        FindGroupName(rGrpName);
    return rStatGlossaries.NewGroupDoc(rGrpName, rTitle);
}
/* -----------------23.11.98 13:10-------------------
 * Umbenennen eines Textbausteins
 * --------------------------------------------------*/
BOOL SwGlossaryHdl::RenameGroup(const String & rOld, String& rNew, const String& rNewTitle)
{
    BOOL bRet = FALSE;
    String sOldGroup(rOld);
    if(STRING_NOTFOUND == rOld.Search(GLOS_DELIM))
        FindGroupName(sOldGroup);
    if(rOld == rNew)
    {
        SwTextBlocks* pGroup = rStatGlossaries.GetGroupDoc(sOldGroup, FALSE);
        if(pGroup)
        {
            pGroup->SetName(rNewTitle);
            rStatGlossaries.PutGroupDoc( pGroup );
            bRet = TRUE;
        }
    }
    else
    {
        String sNewGroup(rNew);
        if(STRING_NOTFOUND == sNewGroup.Search(GLOS_DELIM))
        {
            sNewGroup += GLOS_DELIM;
            sNewGroup += '0';
        }
        bRet = rStatGlossaries.RenameGroupDoc(sOldGroup, sNewGroup, rNewTitle);
        rNew = sNewGroup;
    }
    return bRet;
}
/* -----------------27.11.98 13:49-------------------
 *
 * --------------------------------------------------*/
BOOL SwGlossaryHdl::CopyOrMove( const String& rSourceGroupName,  String& rSourceShortName,
                        const String& rDestGroupName, const String& rLongName, BOOL bMove )
{
    SwTextBlocks* pSourceGroup = rStatGlossaries.GetGroupDoc(rSourceGroupName, FALSE);

    SwTextBlocks* pDestGroup = rStatGlossaries.GetGroupDoc(rDestGroupName, FALSE);
    if(pDestGroup->IsReadOnly() || (bMove && pSourceGroup->IsReadOnly()) )
        return FALSE;
    if(pDestGroup->IsOld()&& 0!= pDestGroup->ConvertToNew())
        return FALSE;
    if(bMove && pSourceGroup->IsOld() && 0 != pSourceGroup->ConvertToNew())
        return FALSE;

    //Der Index muss hier ermittelt werden, weil rSourceShortName in CopyBlock evtl veraendert wird
    USHORT nDeleteIdx = pSourceGroup->GetIndex( rSourceShortName );
    DBG_ASSERT(USHRT_MAX != nDeleteIdx, "Eintrag nicht gefunden")
    ULONG nRet = pSourceGroup->CopyBlock( *pDestGroup, rSourceShortName, rLongName );
    if(!nRet && bMove)
    {
        // der Index muss existieren
        nRet = pSourceGroup->Delete( nDeleteIdx ) ? 0 : 1;
    }
    rStatGlossaries.PutGroupDoc( pSourceGroup );
    rStatGlossaries.PutGroupDoc( pDestGroup );
    return !nRet;
}

/*------------------------------------------------------------------------
    Beschreibung: Loeschen einer Textbausteindatei-Gruppe
------------------------------------------------------------------------*/


BOOL SwGlossaryHdl::DelGroup(const String &rGrpName)
{
    String sGroup(rGrpName);
    if(STRING_NOTFOUND == sGroup.Search(GLOS_DELIM))
        FindGroupName(sGroup);
    if( rStatGlossaries.DelGroupDoc(sGroup) )
    {
        if(pCurGrp)
        {
            const String aMac_Tmp(pCurGrp->GetName());
            if(aMac_Tmp == sGroup)
                DELETEZ(pCurGrp);
        }
        return TRUE;
    }
    return FALSE;
}

/*------------------------------------------------------------------------
    Beschreibung:   Anzahl Textbausteine erfragen
------------------------------------------------------------------------*/


USHORT SwGlossaryHdl::GetGlossaryCnt()
{
    return pCurGrp ? pCurGrp->GetCount() : 0;
}
/*------------------------------------------------------------------------
    Beschreibung:   Anzahl Textbausteine aus dem Basic erfragen
------------------------------------------------------------------------*/


USHORT SwGlossaryHdl::GetGlossaryCnt(const String& rGroupName)
{
    String sGroupName(rGroupName);
    if(STRING_NOTFOUND == sGroupName.Search(GLOS_DELIM))
        FindGroupName(sGroupName);
    SwTextBlocks* pGrp = rStatGlossaries.GetGroupDoc(sGroupName, FALSE);
    USHORT nCount = 0;
    if(pGrp)
    {
        nCount = pGrp->GetCount();
        rStatGlossaries.PutGroupDoc(pGrp);

    }
    return nCount;
}
/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/


String SwGlossaryHdl::GetGlossaryName( USHORT nId )
{
    ASSERT(nId < GetGlossaryCnt(), Textbausteinarray ueberindiziert.);
    return pCurGrp->GetLongName( nId );
}
/* -----------------30.11.98 13:18-------------------
 *
 * --------------------------------------------------*/
String  SwGlossaryHdl::GetGlossaryShortName(USHORT nId)
{
    ASSERT(nId < GetGlossaryCnt(), Textbausteinarray ueberindiziert.);
    return pCurGrp->GetShortName( nId );
}

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/


String SwGlossaryHdl::GetGlossaryName( USHORT nId, const String& rGroupName )
{
    String sGroupName(rGroupName);
    if(STRING_NOTFOUND == sGroupName.Search(GLOS_DELIM))
        FindGroupName(sGroupName);
    SwTextBlocks* pGrp = rStatGlossaries.GetGroupDoc(sGroupName, FALSE);
    String sName;
    if(pGrp)
    {
        if( nId < pGrp->GetCount())
            sName = pGrp->GetLongName( nId );
        rStatGlossaries.PutGroupDoc(pGrp);
    }
    return sName;
}
/*------------------------------------------------------------------------
    Beschreibung:   Kurzname erfragen
------------------------------------------------------------------------*/


String SwGlossaryHdl::GetGlossaryShortName(const String &rName)
{
    String sReturn;
    SwTextBlocks *pTmp =
        pCurGrp ? pCurGrp: rStatGlossaries.GetGroupDoc( aCurGrp, FALSE );
    if(pTmp)
    {
        USHORT nIdx = pTmp->GetLongIndex( rName );
        if( nIdx != (USHORT) -1 )
            sReturn = pTmp->GetShortName( nIdx );
        if( !pCurGrp )
            rStatGlossaries.PutGroupDoc( pTmp );
    }
    return sReturn;
}

/*------------------------------------------------------------------------
 Beschreibung:  Kuerzel fuer Textbaustein bereits verwendet?
------------------------------------------------------------------------*/


BOOL SwGlossaryHdl::HasShortName(const String& rShortName) const
{
    SwTextBlocks *pBlock = pCurGrp ? pCurGrp
                                   : rStatGlossaries.GetGroupDoc( aCurGrp );
    BOOL bRet = pBlock->GetIndex( rShortName ) != (USHORT) -1;
    if( !pCurGrp )
        rStatGlossaries.PutGroupDoc( pBlock );
    return bRet;
}

/*------------------------------------------------------------------------
    Beschreibung:   Erzeugen eines Textbausteines
------------------------------------------------------------------------*/

BOOL SwGlossaryHdl::NewGlossary(const String& rName, const String& rShortName,
                                BOOL bCreateGroup, BOOL bNoAttr)
{
    SwTextBlocks *pTmp =
        pCurGrp ? pCurGrp: rStatGlossaries.GetGroupDoc( aCurGrp, bCreateGroup );
    //pTmp == 0 if the AutoText path setting is wrong
    if(!pTmp)
        return FALSE;
    if( pTmp->IsOld() )
    {
        QueryBox aAsk( pWrtShell->GetView().GetWindow(), SW_RES( MSG_UPDATE_NEW_GLOS_FMT ) );
        if( aAsk.Execute() == RET_YES )
        {
            if( pTmp->ConvertToNew() )
            {
                InfoBox(pWrtShell->GetView().GetWindow(), SW_RES(MSG_ERR_INSERT_GLOS)).Execute();
                return FALSE;
            }
        }
        else
            return FALSE;
    }

    String sOnlyTxt;
    String* pOnlyTxt = 0;
    if( bNoAttr )
    {
        if( !pWrtShell->GetSelectedText( sOnlyTxt, GETSELTXT_PARABRK_TO_ONLYCR ))
            return FALSE;
        pOnlyTxt = &sOnlyTxt;
    }

    const OfaAutoCorrCfg* pCfg = OFF_APP()->GetAutoCorrConfig();

    const USHORT nSuccess = pWrtShell->MakeGlossary( *pTmp, rName, rShortName,
                            pCfg->IsSaveRelFile(), pCfg->IsSaveRelNet(),
                            pOnlyTxt );
    if(nSuccess == (USHORT) -1 )
    {
        InfoBox(pWrtShell->GetView().GetWindow(), SW_RES(MSG_ERR_INSERT_GLOS)).Execute();
    }
    if( !pCurGrp )
        rStatGlossaries.PutGroupDoc( pTmp );
    return BOOL( nSuccess != (USHORT) -1 );
}
/*------------------------------------------------------------------------
    Beschreibung:   Loeschen eines Textbausteines
------------------------------------------------------------------------*/


BOOL SwGlossaryHdl::DelGlossary(const String &rShortName)
{
    SwTextBlocks *pGlossary = pCurGrp ? pCurGrp
                                    : rStatGlossaries.GetGroupDoc(aCurGrp);
    //pTmp == 0 if the AutoText path setting is wrong
    if(!pGlossary)
        return FALSE;
    USHORT nIdx = pGlossary->GetIndex( rShortName );
    if( nIdx != (USHORT) -1 )
        pGlossary->Delete( nIdx );
    if( !pCurGrp )
        rStatGlossaries.PutGroupDoc( pGlossary );
    return TRUE;
}

/*------------------------------------------------------------------------
    Beschreibung: Kurzform expandieren
------------------------------------------------------------------------*/


BOOL SwGlossaryHdl::ExpandGlossary(BOOL bUseStandard, BOOL bApi)
{
    ASSERT(pWrtShell->CanInsert(), illegal);
    SwTextBlocks *pGlossary;
    if( bUseStandard )
    {
        String sGroupName(SwGlossaryDlg::GetCurrGroup());
        if(STRING_NOTFOUND == sGroupName.Search(GLOS_DELIM))
            FindGroupName(sGroupName);
        pGlossary = rStatGlossaries.GetGroupDoc(sGroupName);
    }
    else
        pGlossary = rStatGlossaries.GetGroupDoc(aCurGrp);

    String aShortName;

        // bei Textselektion diese verwenden
    if(pWrtShell->SwCrsrShell::HasSelection())
    {
        aShortName = pWrtShell->GetSelTxt();
    }
    else
    {
        if(pWrtShell->IsAddMode())
            pWrtShell->LeaveAddMode();
        else if(pWrtShell->IsExtMode())
            pWrtShell->LeaveExtMode();
            // Wort selektieren
        pWrtShell->SelNearestWrd();
            // Wort erfragen
        if(pWrtShell->IsSelection())
            aShortName = pWrtShell->GetSelTxt();
    }
    return pGlossary ? Expand( aShortName, &rStatGlossaries, pGlossary, bApi ) : FALSE;
}

/*------------------------------------------------------------------------
    Beschreibung: Expansion aus Basic aufrufen
------------------------------------------------------------------------*/


BOOL SwGlossaryHdl::ExpandGlossary( const String& rShortName, BOOL bApi )
{
    ASSERT(pWrtShell->CanInsert(), illegal);
    String sGroup(SwGlossaryDlg::GetCurrGroup());
    if(STRING_NOTFOUND == sGroup.Search(GLOS_DELIM))
        FindGroupName(sGroup);

    SwTextBlocks *pGlossary = rStatGlossaries.GetGroupDoc(sGroup);
    return pGlossary ? Expand( rShortName, &rStatGlossaries, pGlossary, bApi ) : FALSE;
}


BOOL SwGlossaryHdl::Expand( const String& rShortName,
                            SwGlossaries *pGlossaries,
                            SwTextBlocks *pGlossary,
                            BOOL bApi  )
{
    TextBlockInfoArr aFoundArr;
    String aShortName( rShortName );
    BOOL bCancel = FALSE;
    // Textbaustein suchen
    USHORT nFound = pGlossary->GetIndex( aShortName );
    // Suchen in allen anderen Bereichen
    if( nFound == (USHORT) -1 )
    {
        const International& rAppInt = Application::GetAppInternational();
        SwGlossaryList* pGlossaryList = ::GetGlossaryList();
        USHORT nGroupCount = pGlossaryList->GetGroupCount();
        for(USHORT i = 1; i <= nGroupCount; i++)
        {
            // Gruppenname mit Pfad-Extension besorgen
            String sTitle;
            String sGroupName = pGlossaryList->GetGroupName(i - 1, FALSE, &sTitle);
            if(sGroupName == pGlossary->GetName())
                continue;
            USHORT nBlockCount = pGlossaryList->GetBlockCount(i -1);
            if(nBlockCount)
            {
                for(USHORT j = 0; j < nBlockCount; j++)
                {
                    String sEntry;
                    String sLongName(pGlossaryList->GetBlockName(i - 1, j, sEntry));
                    if(COMPARE_EQUAL == rAppInt.Compare(rShortName, sEntry, INTN_COMPARE_IGNORECASE))
                    {
                        TextBlockInfo_Impl* pData = new TextBlockInfo_Impl;
                        pData->sTitle = sTitle;
                        pData->sLongName = sLongName;
                        pData->sGroupName = sGroupName;
                        aFoundArr.Insert(pData, aFoundArr.Count());
                    }
                }
            }
        }
        if( aFoundArr.Count() )  // einer wurde gefunden
        {
            pGlossaries->PutGroupDoc(pGlossary);
            if(1 == aFoundArr.Count())
            {
                TextBlockInfo_Impl* pData = aFoundArr.GetObject(0);
                pGlossary = (SwTextBlocks *)pGlossaries->GetGroupDoc(pData->sGroupName);
                nFound = pGlossary->GetIndex( aShortName );
            }
            else
            {
                SwSelGlossaryDlg *pDlg =
                    new SwSelGlossaryDlg(0, aShortName);
                for(USHORT i = 0; i < aFoundArr.Count(); ++i)
                {
                    TextBlockInfo_Impl* pData = aFoundArr.GetObject(i);
                    pDlg->InsertGlos(pData->sTitle, pData->sLongName);
                }
                pDlg->SelectEntryPos(0);
                const USHORT nRet = RET_OK == pDlg->Execute()?
                                        pDlg->GetSelectedIdx():
                                        LISTBOX_ENTRY_NOTFOUND;
                delete pDlg;
                if(LISTBOX_ENTRY_NOTFOUND != nRet)
                {
                    TextBlockInfo_Impl* pData = aFoundArr.GetObject(nRet);
                    pGlossary = (SwTextBlocks *)pGlossaries->GetGroupDoc(pData->sGroupName);
                    nFound = pGlossary->GetIndex( aShortName );
                }
                else
                {
                    nFound = (USHORT) -1;
                    bCancel = TRUE;
                }
            }
        }
    }

        // nicht gefunden
    if( nFound == (USHORT) -1 )
    {
        if( !bCancel )
        {
            pGlossaries->PutGroupDoc(pGlossary);

            const USHORT nMaxLen = 50;
            if(pWrtShell->IsSelection() && aShortName.Len() > nMaxLen)
            {
                aShortName.Erase(nMaxLen);
                aShortName.AppendAscii(" ...");
            }
            if(!bApi)
            {
                String aTmp( SW_RES(STR_NOGLOS1));
                aTmp += aShortName;
                aTmp += SW_RESSTR(STR_NOGLOS2);
                InfoBox( pWrtShell->GetView().GetWindow(), aTmp ).Execute();
            }
        }

        return FALSE;
    }
    else
    {
        String aLongName = pGlossary->GetLongName( nFound );
        SvxMacro aStartMacro(aEmptyStr, aEmptyStr, STARBASIC);
        SvxMacro aEndMacro(aEmptyStr, aEmptyStr, STARBASIC);
        GetMacros( aShortName, aStartMacro, aEndMacro, pGlossary );

    // StartAction darf nich vor HasSelection und DelRight stehen,
    // sonst wird der moeglich Shellwechsel verzoegert und
    // API-Programme wuerden dann haengenbleiben
    // ausserdem darf das Ereignismacro ebenfalls nicht in einer Action gerufen werden
        pWrtShell->StartUndo(UNDO_INSGLOSSARY);
        if( aStartMacro.GetMacName().Len() )
            pWrtShell->ExecMacro( aStartMacro );
        if(pWrtShell->HasSelection())
            pWrtShell->DelLeft();
        pWrtShell->StartAllAction();

        // alle InputFelder zwischenspeichern
        SwInputFieldList aFldLst( pWrtShell, TRUE );

        pWrtShell->InsertGlossary(*pGlossary, aShortName);
        pWrtShell->EndAllAction();
        if( aEndMacro.GetMacName().Len() )
        {
            pWrtShell->ExecMacro( aEndMacro );
        }
        pWrtShell->EndUndo(UNDO_INSGLOSSARY);

        // fuer alle neuen InputFelder die Eingaben abfordern
        if( aFldLst.BuildSortLst() )
            pWrtShell->UpdateInputFlds( &aFldLst );
    }
    pGlossaries->PutGroupDoc(pGlossary);
    return TRUE;
}

/*------------------------------------------------------------------------
    Beschreibung: Textbaustein einfuegen
------------------------------------------------------------------------*/


BOOL SwGlossaryHdl::InsertGlossary(const String &rName)
{
    ASSERT(pWrtShell->CanInsert(), illegal);

    SwTextBlocks *pGlos =
        pCurGrp? pCurGrp: rStatGlossaries.GetGroupDoc(aCurGrp);

    if (!pGlos)
        return FALSE;

    SvxMacro aStartMacro(aEmptyStr, aEmptyStr, STARBASIC);
    SvxMacro aEndMacro(aEmptyStr, aEmptyStr, STARBASIC);
    GetMacros( rName, aStartMacro, aEndMacro, pGlos );

    // StartAction darf nich vor HasSelection und DelRight stehen,
    // sonst wird der moeglich Shellwechsel verzoegert und
    // API-Programme wuerden dann haengenbleiben
    // ausserdem darf das Ereignismacro ebenfalls nicht in einer Action gerufen werden
    if( aStartMacro.GetMacName().Len() )
        pWrtShell->ExecMacro( aStartMacro );
    if( pWrtShell->HasSelection() )
        pWrtShell->DelRight();
    pWrtShell->StartAllAction();

    // alle InputFelder zwischenspeichern
    SwInputFieldList aFldLst( pWrtShell, TRUE );

    pWrtShell->InsertGlossary(*pGlos, rName);
    pWrtShell->EndAllAction();
    if( aEndMacro.GetMacName().Len() )
    {
        pWrtShell->ExecMacro( aEndMacro );
    }

    // fuer alle neuen InputFelder die Eingaben abfordern
    if( aFldLst.BuildSortLst() )
        pWrtShell->UpdateInputFlds( &aFldLst );

    if(!pCurGrp)
        rStatGlossaries.PutGroupDoc(pGlos);
    return TRUE;
}

/*------------------------------------------------------------------------
 Beschreibung:  Macro setzen / erfragen
------------------------------------------------------------------------*/


void SwGlossaryHdl::SetMacros(const String& rShortName,
                              const SvxMacro* pStart,
                              const SvxMacro* pEnd,
                              SwTextBlocks *pGlossary )
{
    SwTextBlocks *pGlos = pGlossary ? pGlossary :
                                pCurGrp ? pCurGrp
                                  : rStatGlossaries.GetGroupDoc( aCurGrp );
    int nIdx = pGlos->GetIndex( rShortName );
    pGlos->BeginGetDoc( nIdx );
    SwDoc* pDoc = pGlos->GetDoc();

    if( pStart )
        pDoc->SetGlobalMacro( SW_EVENT_START_INS_GLOSSARY, *pStart  );
    else
        pDoc->DelGlobalMacro( SW_EVENT_START_INS_GLOSSARY );
    if( pEnd )
        pDoc->SetGlobalMacro( SW_EVENT_END_INS_GLOSSARY, *pEnd );
    else
        pDoc->DelGlobalMacro( SW_EVENT_END_INS_GLOSSARY );
    pGlos->EndGetDoc();

    pGlos->BeginPutDoc( rShortName, pGlos->GetLongName( nIdx ) );
    pGlos->PutDoc();
    if( pGlos->GetError() )
        ErrorHandler::HandleError( pGlos->GetError() );

    if(!pCurGrp && !pGlossary)
        rStatGlossaries.PutGroupDoc(pGlos);
}

void SwGlossaryHdl::GetMacros( const String &rShortName,
                                SvxMacro& rStart,
                                SvxMacro& rEnd,
                                SwTextBlocks *pGlossary  )
{
    SwTextBlocks *pGlos = pGlossary ? pGlossary
                                    : pCurGrp ? pCurGrp
                                        : rStatGlossaries.GetGroupDoc(aCurGrp);
    USHORT nIndex = pGlos->GetIndex( rShortName );
    if( nIndex != USHRT_MAX )
    {
        SvxMacroTableDtor aMacroTbl;
        if( pGlos->GetMacroTable( nIndex, aMacroTbl ) )
        {
            SvxMacro *pMacro = aMacroTbl.Get( SW_EVENT_START_INS_GLOSSARY );
            if( pMacro )
                rStart = *pMacro;

            pMacro = aMacroTbl.Get( SW_EVENT_END_INS_GLOSSARY );
            if( pMacro )
                rEnd = *pMacro;
        }
    }

    if( !pCurGrp && !pGlossary )
        rStatGlossaries.PutGroupDoc( pGlos );
}


/*------------------------------------------------------------------------
    Beschreibung:   ctor, dtor
------------------------------------------------------------------------*/


SwGlossaryHdl::SwGlossaryHdl(SfxViewFrame* pVwFrm, SwWrtShell *pSh)
    : rStatGlossaries( *::GetGlossaries() ),
    pViewFrame( pVwFrm ),
    pWrtShell( pSh ),
    pCurGrp( 0 ),
    aCurGrp( rStatGlossaries.GetDefName() )
{}


SwGlossaryHdl::~SwGlossaryHdl()
{
    if( pCurGrp )
        rStatGlossaries.PutGroupDoc( pCurGrp );
}

/*------------------------------------------------------------------------
    Beschreibung:   Umbenennen eines Textbausteines
------------------------------------------------------------------------*/


BOOL SwGlossaryHdl::Rename(const String& rOldShort, const String& rNewShortName,
                           const String& rNewName )
{
    BOOL bRet = FALSE;
    SwTextBlocks *pGlossary = pCurGrp ? pCurGrp
                                    : rStatGlossaries.GetGroupDoc(aCurGrp);
    if(pGlossary)
    {
        USHORT nIdx = pGlossary->GetIndex( rOldShort );
        USHORT nOldLongIdx = pGlossary->GetLongIndex( rNewName );
        USHORT nOldIdx = pGlossary->GetIndex( rNewShortName );

        if( nIdx != USHRT_MAX &&
                (nOldLongIdx == USHRT_MAX || nOldLongIdx == nIdx )&&
                    (nOldIdx == USHRT_MAX || nOldIdx == nIdx ))
        {
            String aNewShort( rNewShortName );
            String aNewName( rNewName );
            pGlossary->Rename( nIdx, &aNewShort, &aNewName );
            bRet = pGlossary->GetError() == 0;
        }
        if( !pCurGrp )
            rStatGlossaries.PutGroupDoc(pGlossary);
    }
    return bRet;
}


BOOL SwGlossaryHdl::IsReadOnly( const String* pGrpNm ) const
{
    SwTextBlocks *pGlossary = pGrpNm ? rStatGlossaries.GetGroupDoc( *pGrpNm )
                                     : pCurGrp
                                        ? pCurGrp
                                       : rStatGlossaries.GetGroupDoc(aCurGrp);

    BOOL bRet = pGlossary ? pGlossary->IsReadOnly() : TRUE;
    if( !pCurGrp )
        delete pGlossary;
    return bRet;
}


BOOL SwGlossaryHdl::IsOld() const
{
    SwTextBlocks *pGlossary = pCurGrp ? pCurGrp
                                      : rStatGlossaries.GetGroupDoc(aCurGrp);
    BOOL bRet = pGlossary ? pGlossary->IsOld() : FALSE;
    if( !pCurGrp )
        delete pGlossary;
    return bRet;
}

/*-----------------09.06.97 16:15-------------------
    Gruppe ohne Pfadindex finden
--------------------------------------------------*/
BOOL SwGlossaryHdl::FindGroupName(String & rGroup)
{
    return rStatGlossaries.FindGroupName(rGroup);
}

/* -----------------29.07.99 08:34-------------------

 --------------------------------------------------*/
BOOL SwGlossaryHdl::CopyToClipboard(SwWrtShell& rSh, const String& rShortName)
{
    SwTextBlocks *pGlossary = pCurGrp ? pCurGrp
                                    : rStatGlossaries.GetGroupDoc(aCurGrp);
    SwDataExchangeRef xExch = new SwDataExchange( rSh );
    int nRet = xExch->CopyGlossary( *pGlossary, rShortName );
    if( !pCurGrp )
        rStatGlossaries.PutGroupDoc( pGlossary );
    return 0 != nRet;
}

BOOL SwGlossaryHdl::ImportGlossaries( const String& rName )
{
    BOOL bRet = FALSE;
    if( rName.Len() )
    {
        const SfxFilter* pFilter = 0;
        SfxMedium* pMed = new SfxMedium( rName, STREAM_READ, TRUE, TRUE, 0, 0 );
        SfxFilterMatcher aMatcher( SwDocShell::Factory().GetFilterContainer() );
        if( !aMatcher.GuessFilter( *pMed, &pFilter, FALSE ) )
        {
            SwTextBlocks *pGlossary;
            pMed->SetFilter( pFilter );
            Reader* pR = SwIoSystem::GetReader( pFilter->GetUserData() );
            if( pR && 0 != ( pGlossary = pCurGrp ? pCurGrp
                                    : rStatGlossaries.GetGroupDoc(aCurGrp)) )
            {
                SwReader aReader( *pMed, rName );
                if( aReader.HasGlossaries( *pR ) )
                {
                    const OfaAutoCorrCfg* pCfg = OFF_APP()->GetAutoCorrConfig();
                    bRet = aReader.ReadGlossaries( *pR, *pGlossary,
                                pCfg->IsSaveRelFile() );
                }
            }
        }
        DELETEZ(pMed);
    }
    return bRet;
}

String SwGlossaryHdl::GetValidShortCut( const String& rLong,
                                         BOOL bCheckInBlock ) const
{
    String sRet;
    SwTextBlocks *pGlossary = pCurGrp ? pCurGrp
                                    : rStatGlossaries.GetGroupDoc( aCurGrp );
    if( pGlossary )
        sRet = pGlossary->GetValidShortCut( rLong, bCheckInBlock );
    return sRet;
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.150  2000/09/18 16:05:22  willem.vandorp
    OpenOffice header added.

    Revision 1.149  2000/07/07 13:25:39  jp
    must changes VCL

    Revision 1.148  2000/06/26 13:12:30  os
    INetURLObject::SmartRelToAbs removed

    Revision 1.147  2000/06/13 09:59:20  os
    using UCB

    Revision 1.146  2000/06/09 06:51:31  os
    using UCB

    Revision 1.145  2000/05/23 20:09:50  jp
    Bugfixes for Unicode

    Revision 1.144  2000/04/17 12:54:30  os
    UNICODE

    Revision 1.143  2000/04/17 12:36:14  os
    #74949# search for AutoText short name via SwGlossaryList

    Revision 1.142  2000/04/13 08:22:23  os
    UNICODE

    Revision 1.141  2000/03/06 08:46:06  os
    #70359# GetGroupName: if no title is set - set group name as title

    Revision 1.140  2000/02/14 14:49:37  os
    #70473# Unicode

    Revision 1.139  2000/02/10 10:33:49  os
    #70359# titles added to AutoText groups

    Revision 1.138  2000/02/09 11:41:28  jp
    Task #72579#: WW8Reader can import glossaries

    Revision 1.137  2000/02/03 11:08:22  jp
    Task #72579#: new method GetValidShortCut

    Revision 1.136  2000/02/02 17:01:52  jp
    Task #72579#: WW8Reader can import glossaries

    Revision 1.135  1999/12/22 09:20:47  os
    #71203# editing of AutoText: keep macros

    Revision 1.134  1999/11/16 16:18:20  jp
    remove unused Dialog-Pointer

    Revision 1.133  1999/09/15 14:03:11  os
    language improvements

    Revision 1.132  1999/08/24 08:28:02  OS
    #68352# NewGlossary et. al.: GPF if AutoText path settings were wrong


      Rev 1.131   24 Aug 1999 10:28:02   OS
   #68352# NewGlossary et. al.: GPF if AutoText path settings were wrong

      Rev 1.130   29 Jul 1999 09:10:02   OS
   CopyToClipboard

      Rev 1.129   23 Jul 1999 10:26:32   OS
   #67828# glossary - methods on doc level

      Rev 1.128   14 Jun 1999 14:40:26   JP
   Bug #66858#: there is no MDIApplication

      Rev 1.127   14 Jun 1999 08:51:54   OS
   #66858# MDIApplication::GetActiveWindow now static

      Rev 1.126   19 Feb 1999 16:46:20   OS
   IsCaseSensitive nicht mehr inline

      Rev 1.125   10 Feb 1999 16:11:58   OS
   #61050# bei gleichen Gruppennamen immer den richtigen finden

      Rev 1.124   09 Feb 1999 10:46:38   OS
   #61205# AutoText-Gruppen koennen beliebige Namen erhalten

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/dochdl/makefile.mk b/sw/source/ui/dochdl/makefile.mk
new file mode 100644
index 0000000..ee59800
--- /dev/null
+++ b/sw/source/ui/dochdl/makefile.mk
@@ -0,0 +1,99 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:34 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=..$/..$/..

PRJNAME=sw
TARGET=dochdl

AUTOSEG=true

PROJECTPCH=ui_pch
PDBTARGET=ui_pch
PROJECTPCHSOURCE=..\ui_1st\ui_pch

# --- Settings -----------------------------------------------------

.INCLUDE :  $(PRJ)$/inc$/swpre.mk
.INCLUDE :  settings.mk
.INCLUDE :  $(PRJ)$/inc$/sw.mk

# --- Files --------------------------------------------------------

CXXFILES = \
        dataex.cxx \
        gloshdl.cxx \
        selglos.cxx

SRCFILES =  \
        dochdl.src \
        selglos.src

SLOFILES =  \
        $(SLO)$/dataex.obj \
        $(SLO)$/gloshdl.obj \
        $(SLO)$/selglos.obj

# --- Tagets -------------------------------------------------------

.INCLUDE :  target.mk

diff --git a/sw/source/ui/dochdl/selglos.cxx b/sw/source/ui/dochdl/selglos.cxx
new file mode 100644
index 0000000..b82d51e
--- /dev/null
+++ b/sw/source/ui/dochdl/selglos.cxx
@@ -0,0 +1,170 @@
/*************************************************************************
 *
 *  $RCSfile: selglos.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:35 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "swtypes.hxx"
#include "segmentc.hxx"

#include "selglos.hxx"

#include "selglos.hrc"
#include "dochdl.hrc"

#ifndef _SV_MSGBOX_HXX
#include <vcl/msgbox.hxx>
#endif

// STATIC DATA -----------------------------------------------------------


// CTOR / DTOR -----------------------------------------------------------

SwSelGlossaryDlg::SwSelGlossaryDlg(Window * pParent, const String &rShortName)
    : ModalDialog(pParent, SW_RES(DLG_SEL_GLOS)),
    aGlosBox(this, SW_RES( LB_GLOS)),
    aGlosFrm(this, SW_RES( GB_GLOS)),
    aOKBtn(this, SW_RES( BT_OK)),
    aCancelBtn(this, SW_RES( BT_CANCEL)),
    aHelpBtn(this, SW_RES(BT_HELP))
{
    String sText(aGlosFrm.GetText());
    sText += rShortName;
    aGlosFrm.SetText(sText);
    FreeResource();

    aGlosBox.SetDoubleClickHdl(LINK(this, SwSelGlossaryDlg, DoubleClickHdl));
}

/*-----------------25.02.94 20:50-------------------
 dtor ueberladen
--------------------------------------------------*/
SwSelGlossaryDlg::~SwSelGlossaryDlg() {}
/* -----------------25.10.99 08:33-------------------

 --------------------------------------------------*/
IMPL_LINK(SwSelGlossaryDlg, DoubleClickHdl, ListBox*, pBox)
{
    EndDialog(RET_OK);
    return 0;
}
/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.16  2000/09/18 16:05:22  willem.vandorp
    OpenOffice header added.

    Revision 1.15  2000/04/13 08:22:23  os
    UNICODE

    Revision 1.14  1999/10/25 06:44:30  os
    #68967# HelpButton and DoubleClickHdl

    Revision 1.13  1997/11/03 12:13:06  MA
    precomp entfernt


      Rev 1.12   03 Nov 1997 13:13:06   MA
   precomp entfernt

      Rev 1.11   14 Nov 1996 15:23:02   TRI
   includes

      Rev 1.10   11 Nov 1996 09:35:36   MA
   ResMgr

      Rev 1.9   28 Aug 1996 10:27:36   OS
   includes

      Rev 1.8   24 Nov 1995 16:58:42   OM
   PCH->PRECOMPILED

      Rev 1.7   25 Oct 1994 17:08:08   ER
   add: PCH

      Rev 1.6   26 Feb 1994 01:59:36   ER
   virt. dtor mit export

      Rev 1.5   25 Feb 1994 20:51:54   ER
   virtuellen dtor wegen export ueberladen

      Rev 1.4   17 Feb 1994 08:41:20   MI
   SEG_FUNCDEFS ausgefuellt

      Rev 1.3   16 Feb 1994 20:02:32   MI
   SEG_FUNCDEFS ausgefuellt

      Rev 1.2   16 Feb 1994 16:21:24   MI
   Pragmas zurechtgerueckt

      Rev 1.1   28 Jan 1994 11:41:02   MI
   TCOV() entfernt, SW_... nach SEG_... umbenannt

      Rev 1.0   25 Jan 1994 16:01:06   VB
   Initial revision.

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/dochdl/selglos.hrc b/sw/source/ui/dochdl/selglos.hrc
new file mode 100644
index 0000000..a5657ae
--- /dev/null
+++ b/sw/source/ui/dochdl/selglos.hrc
@@ -0,0 +1,65 @@
/*************************************************************************
 *
 *  $RCSfile: selglos.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:35 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#define BT_OK       100
#define BT_CANCEL   101
#define BT_HELP     102
#define LB_GLOS     1
#define GB_GLOS     2
diff --git a/sw/source/ui/dochdl/selglos.src b/sw/source/ui/dochdl/selglos.src
new file mode 100644
index 0000000..4ba82ef
--- /dev/null
+++ b/sw/source/ui/dochdl/selglos.src
@@ -0,0 +1,155 @@
/*************************************************************************
 *
 *  $RCSfile: selglos.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:35 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "selglos.hrc"
#include "dochdl.hrc"
#include "cmdid.h"
#include "helpid.h"

 // #define DLG_SEL_GLOS 256
ModalDialog DLG_SEL_GLOS
{
    HelpID = FN_EXPAND_GLOSSARY ;
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 220 , 100 ) ;
    /* ### ACHTUNG: Neuer Text in Resource? AutoText einfügen : AutoText einf³gen */
    Text = "AutoText einfügen" ;
    Text [ ENGLISH ] = "Insert AutoText" ;
    Text [ norwegian ] = "Insert AutoText" ;
    Text [ italian ] = "Inserisci testo automatico" ;
    Text [ portuguese_brazilian ] = "Inserir Texto Automático" ;
    Text [ portuguese ] = "Inserir AutoTexto" ;
    Text [ finnish ] = "Lisää automaattiteksti" ;
    Text [ danish ] = "Indsæt AutoTekst" ;
    Text [ french ] = "Insérer AutoTexte" ;
    Text [ swedish ] = "Infoga AutoText" ;
    Text [ dutch ] = "AutoTekst invoegen" ;
    Text [ spanish ] = "Insertar AutoTexto" ;
    Text [ english_us ] = "Insert AutoText" ;
    Moveable = TRUE ;
    OKButton BT_OK
    {
        Pos = MAP_APPFONT ( 164 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        DefButton = TRUE ;
    };
    CancelButton BT_CANCEL
    {
        Pos = MAP_APPFONT ( 164 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    HelpButton BT_HELP
    {
        Pos = MAP_APPFONT ( 164 , 43 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    GroupBox GB_GLOS
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 152 , 91 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? AutoTexte zum Kürzel  : AutoTexte zum K³rzel  */
        Text = "AutoTexte zum Kürzel " ;
        Text [ ENGLISH ] = "Entries for Short Name " ;
        Text [ norwegian ] = "Entries for Short Name " ;
        Text [ italian ] = "Testo automatico per la sigla " ;
        Text [ portuguese_brazilian ] = "Entadas para Abreviações " ;
        Text [ portuguese ] = "AutoTexto Abreviatura " ;
        Text [ finnish ] = "Lyhenteen vastineet " ;
        Text [ danish ] = "AutoTekst til genvej " ;
        Text [ french ] = "AutoTextes pour raccourci " ;
        Text [ swedish ] = "AutoText till genvägen " ;
        Text [ dutch ] = "AutoTekst voor afkortingen  " ;
        Text [ spanish ] = "AutoTexto para abreviatura  " ;
        Text [ english_us ] = "AutoTexts for shortcut " ;
        Text[ chinese_simplified ] = "×Ô¶¯Í¼ÎÄËõд ";
        Text[ russian ] = "Àâòîòåêñò ê ñîêðàùåíèþ  ";
        Text[ polish ] = "Autotekst do skrótu   ";
        Text[ japanese ] = "¼®°Ä¶¯Ä“ü—ÍŽx‰‡ ";
        Text[ chinese_traditional ] = "¦Û°Ê¹Ï¤å¶°ªºÁY¼g ";
        Text[ arabic ] = "äÕ ÊáÞÇÆí ááÇÎÊÕÇÑ ";
        Text[ greek ] = "ÁõôïÊåßìåíï ðñïò óõíôüìåõóç ";
        Text[ korean ] = "ÀÚµ¿ ÅØ½ºÆ® ¹Ù·Î°¡±â ";
        Text[ turkish ] = "Otomatik metin kýsaltmasý ";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_GLOS
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 12 , 14 ) ;
        Size = MAP_APPFONT ( 140 , 74 ) ;
        TabStop = TRUE ;
        AutoHScroll = TRUE ;
    };
    Text[ chinese_simplified ] = "²åÈë×Ô¶¯Í¼Îļ¯";
    Text[ russian ] = "Âñòàâêà àâòîòåêñòà";
    Text[ polish ] = "Wstaw autotekst";
    Text[ japanese ] = "“ü—ÍŽx‰‡‚Ì‘}“ü";
    Text[ chinese_traditional ] = "´¡¤J¦Û°Ê¹Ï¤å¶°";
    Text[ arabic ] = "ÅÏÑÇÌ äÕ ÊáÞÇÆí";
    Text[ greek ] = "ÐñïóèÞêç ÁõôïÊåéìÝíïõ";
    Text[ korean ] = "ÀÚµ¿ ÅØ½ºÆ® »ðÀÔ";
    Text[ turkish ] = "Otomatik metin ekle";
    Text[ language_user1 ] = " ";
};
diff --git a/sw/source/ui/docvw/docvw.hrc b/sw/source/ui/docvw/docvw.hrc
new file mode 100644
index 0000000..6cfd24a
--- /dev/null
+++ b/sw/source/ui/docvw/docvw.hrc
@@ -0,0 +1,120 @@
/*************************************************************************
 *
 *  $RCSfile: docvw.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:35 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _DOCVW_HRC
#define _DOCVW_HRC

#include "rcid.hrc"

#define MN_READONLY_POPUP               (RC_DOCVW_BEGIN + 1)
#define MN_READONLY_OPENURL             (RC_DOCVW_BEGIN + 2)
#define MN_READONLY_OPENURLNEW          (RC_DOCVW_BEGIN + 3)
#define MN_READONLY_EDITDOC             (RC_DOCVW_BEGIN + 4)
#define MN_READONLY_BROWSE_STOP         (RC_DOCVW_BEGIN + 5)
#define MN_READONLY_BROWSE_BACKWARD     (RC_DOCVW_BEGIN + 6)
#define MN_READONLY_BROWSE_FORWARD      (RC_DOCVW_BEGIN + 7)
#define MN_READONLY_CREATELINK          (RC_DOCVW_BEGIN + 8)
#define MN_READONLY_CREATEGRAPHIKLINK   (RC_DOCVW_BEGIN + 9)
#define MN_READONLY_DOWNLOAD            (RC_DOCVW_BEGIN + 10)
#define MN_READONLY_SAVEGRAPHIC         (RC_DOCVW_BEGIN + 11)
#define MN_READONLY_SAVEBACKGROUND      (RC_DOCVW_BEGIN + 12)
#define MN_READONLY_COPYLINK            (RC_DOCVW_BEGIN + 13)
#define MN_READONLY_COPYGRAPHIC         (RC_DOCVW_BEGIN + 14)
#define MN_READONLY_LOADGRAPHIC         (RC_DOCVW_BEGIN + 15)
#define MN_READONLY_GRAPHICOFF          (RC_DOCVW_BEGIN + 16)
#define MN_READONLY_PLUGINOFF           (RC_DOCVW_BEGIN + 17)
#define MN_READONLY_TOGALLERYLINK       (RC_DOCVW_BEGIN + 18)
#define MN_READONLY_TOGALLERYCOPY       (RC_DOCVW_BEGIN + 19)
#define MN_READONLY_SOURCEVIEW          (RC_DOCVW_BEGIN + 20)
#define MN_READONLY_RELOAD_FRAME        (RC_DOCVW_BEGIN + 21)
#define MN_READONLY_RELOAD              (RC_DOCVW_BEGIN + 22)

//Bei den folgenden brauchen wir Luft fuer die Gallery-Themen
#define MN_READONLY_GRAPHICTOGALLERY    (RC_DOCVW_BEGIN + 23)
#define MN_READONLY_BACKGROUNDTOGALLERY (RC_DOCVW_BEGIN + 60)


#define STR_EXPORT_GRAFIK_TITLE         (RC_DOCVW_BEGIN + 1)
#define STR_CHAIN_OK                    (RC_DOCVW_BEGIN + 2)
#define STR_CHAIN_NOT_EMPTY             (RC_DOCVW_BEGIN + 3)
#define STR_CHAIN_IS_IN_CHAIN           (RC_DOCVW_BEGIN + 4)
#define STR_CHAIN_WRONG_AREA            (RC_DOCVW_BEGIN + 5)
#define STR_CHAIN_NOT_FOUND             (RC_DOCVW_BEGIN + 6)
#define STR_CHAIN_SOURCE_CHAINED        (RC_DOCVW_BEGIN + 7)
#define STR_CHAIN_SELF                  (RC_DOCVW_BEGIN + 8)
#define STR_REDLINE_INSERT              (RC_DOCVW_BEGIN + 9)
#define STR_REDLINE_DELETE              (RC_DOCVW_BEGIN + 10)
#define STR_REDLINE_FORMAT              (RC_DOCVW_BEGIN + 11)
#define STR_REDLINE_TABLE               (RC_DOCVW_BEGIN + 12)
#define STR_REDLINE_FMTCOLL             (RC_DOCVW_BEGIN + 13)
#define STR_ENDNOTE                     (RC_DOCVW_BEGIN + 14)
#define STR_FTNNOTE                     (RC_DOCVW_BEGIN + 15)

#define MSG_READONLY_CONTENT            (RC_DOCVW_BEGIN + 1)

#define DOCVW_ACT_END   MN_READONLY_BACKGROUNDTOGALLERY

#if DOCVW_ACT_END > RC_DOCVW_END
#error Resource-Id Ueberlauf in #file, #line
#endif


#endif
diff --git a/sw/source/ui/docvw/docvw.src b/sw/source/ui/docvw/docvw.src
new file mode 100644
index 0000000..ed9eb50
--- /dev/null
+++ b/sw/source/ui/docvw/docvw.src
@@ -0,0 +1,1216 @@
/*************************************************************************
 *
 *  $RCSfile: docvw.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:35 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "docvw.hrc"
#include "cmdid.h"
#include "helpid.h"
#define SEPARATOR MenuItem { Separator = TRUE; };
Menu MN_READONLY_POPUP
{
    ItemList =
    {
        MenuItem
        {
            Identifier = MN_READONLY_OPENURL ;
            HelpID = SID_OPENDOC ;
            Text = "~Öffnen" ;
            Text [ English ] = "~Open" ;
            Text [ english_us ] = "~Open" ;
            Text [ italian ] = "~Apri" ;
            Text [ spanish ] = "~Abrir" ;
            Text [ french ] = "~Ouvrir" ;
            Text [ dutch ] = "Ope~nen" ;
            Text [ swedish ] = "~Öppna" ;
            Text [ danish ] = "~Åbn" ;
            Text [ portuguese ] = "~Abrir" ;
            Text [ portuguese_brazilian ] = "~Öffnen" ;
            Text[ chinese_simplified ] = "´ò¿ª(~O)";
            Text[ russian ] = "Îòêðûòü";
            Text[ polish ] = "Otwórz";
            Text[ japanese ] = "ŠJ‚­(~O)";
            Text[ chinese_traditional ] = "¶}±ÒÂÂÀÉ(~O)";
            Text[ arabic ] = "ÝÊÍ";
            Text[ dutch ] = "Ope~nen";
            Text[ chinese_simplified ] = "´ò¿ª(~O)";
            Text[ greek ] = "¢í~ïéãìá";
            Text[ korean ] = "¿­±â(~O)";
            Text[ turkish ] = "Aç";
            Text[ language_user1 ] = " ";
        };
        MenuItem
        {
            Identifier = MN_READONLY_OPENURLNEW ;
            HelpID = SID_OPENDOC ;
            Text = "Öffnen in neuem ~Fenster" ;
            Text [ English ] = "Open in new ~Window" ;
            Text [ dutch ] = "Openen in n~ieuw venster" ;
            Text [ english_us ] = "Open in New Window" ;
            Text [ italian ] = "Apri in una nuova fines~tra" ;
            Text [ spanish ] = "Abrir en nueva ~ventana" ;
            Text [ french ] = "Ouvrir dans une nouvelle ~fenêtre" ;
            Text [ swedish ] = "Öppna i nytt ~fönster" ;
            Text [ danish ] = "Åbn i nyt vindue" ;
            Text [ portuguese ] = "Nova ~janela" ;
            Text [ portuguese_brazilian ] = "Öffnen in neuem ~Fenster" ;
            Text[ chinese_simplified ] = "ʹÓÃÐÂÊÓ´°´ò¿ª(~W)";
            Text[ russian ] = "Îòêðûòü â íîâîì îêíå";
            Text[ polish ] = "Otwórz w nowym oknie";
            Text[ japanese ] = "V‚µ‚¢³¨ÝÄÞ³‚ÉŠJ‚­";
            Text[ chinese_traditional ] = "¥Î·sµøµ¡¶}±Ò(~W)";
            Text[ arabic ] = "ÝÊÍ Ýí äÇÝÐÉ ÌÏíÏÉ";
            Text[ dutch ] = "Openen in n~ieuw venster";
            Text[ chinese_simplified ] = "ʹÓÃÐÂÊÓ´°´ò¿ª(~W)";
            Text[ greek ] = "¢íïéãìá óå íÝï ~ðáñÜèõñï";
            Text[ korean ] = "»õâ¿¡¼­ ¿­±â";
            Text[ turkish ] = "Yeni bir pencerede aç";
            Text[ language_user1 ] = " ";
        };
        MenuItem
        {
            Identifier = MN_READONLY_DOWNLOAD ;
            HelpID = HID_MN_READONLY_DOWNLOAD ;
            Text = "~Download..." ;
            Text [ English ] = "~Download..." ;
            Text [ english_us ] = "Download..." ;
            Text [ italian ] = "Download..." ;
            Text [ spanish ] = "~Descargar..." ;
            Text [ french ] = "~Téléchargement..." ;
            Text [ dutch ] = "~Download..." ;
            Text [ swedish ] = "La~dda ned..." ;
            Text [ danish ] = "~Overfør..." ;
            Text [ portuguese ] = "Do~wnload..." ;
            Text [ portuguese_brazilian ] = "~Download..." ;
            Text[ chinese_simplified ] = "ÏÂÔØ(~D)...";
            Text[ russian ] = "Çàãðóçêà...";
            Text[ polish ] = "Pobieranie...";
            Text[ japanese ] = "ÀÞ³ÝÛ°ÄÞ...";
            Text[ chinese_traditional ] = "¤U¸ü(~D)...";
            Text[ arabic ] = "ÊäÒíá...";
            Text[ dutch ] = "~Download...";
            Text[ chinese_simplified ] = "ÏÂÔØ(~D)...";
            Text[ greek ] = "~ËÞøç áñ÷åßùí...";
            Text[ korean ] = "´Ù¿î·Îµå...";
            Text[ turkish ] = "Ýndir...";
            Text[ language_user1 ] = " ";
        };
        MenuItem
        {
            Identifier = MN_READONLY_EDITDOC ;
            HelpID = SID_EDITDOC ;
            Text = "~Bearbeiten" ;
            Text [ English ] = "~Edit" ;
            Text [ english_us ] = "~Edit" ;
            Text [ italian ] = "~Modifica" ;
            Text [ spanish ] = "~Editar" ;
            Text [ french ] = "~Edition" ;
            Text [ dutch ] = "Be~werken" ;
            Text [ swedish ] = "~Redigera" ;
            Text [ danish ] = "~Rediger" ;
            Text [ portuguese ] = "E~ditar" ;
            Text [ portuguese_brazilian ] = "~Bearbeiten" ;
            Text[ chinese_simplified ] = "±à¼­(~E)";
            Text[ russian ] = "~Ïðàâêà";
            Text[ polish ] = "~Edytuj";
            Text[ japanese ] = "•ҏW(~‚d)";
            Text[ chinese_traditional ] = "½s¿è(~E)";
            Text[ arabic ] = "~ÊÍÑíÑ";
            Text[ dutch ] = "Be~werken";
            Text[ chinese_simplified ] = "±à¼­(~E)";
            Text[ greek ] = "~Åðåîåñãáóßá";
            Text[ korean ] = "ÆíÁý(~E)";
            Text[ turkish ] = "D~üzenle";
            Text[ language_user1 ] = " ";
        };
        MenuItem
        {
            Identifier = MN_READONLY_RELOAD;
            HelpID = SID_RELOAD;
            Text = "~Neu laden" ;
            Text [ English ] = "~Reload" ;
            Text[ italian ] = "~Ricarica";
            Text[ portuguese_brazilian ] = "~Reload";
            Text[ portuguese ] = "~Recarregar";
            Text[ danish ] = "Indlæs igen";
            Text[ french ] = "~Recharger";
            Text[ swedish ] = "~Ladda på nytt";
            Text[ dutch ] = "~Opnieuw laden";
            Text[ spanish ] = "~Recargar";
            Text[ english_us ] = "Re~load";
            Text[ chinese_simplified ] = "ÖØÐÂ×°ÔØ(~L)";
            Text[ russian ] = "Ïåðåçàãðóçèòü";
            Text[ polish ] = "Za³aduj ponownie";
            Text[ japanese ] = "Ä“ǂݍž‚Ý(~L)";
            Text[ chinese_traditional ] = "­«·s¸Ë¸ü(~L)";
            Text[ arabic ] = "ÅÚÇÏÉ ÊÍãíá";
            Text[ dutch ] = "~Opnieuw laden";
            Text[ chinese_simplified ] = "ÖØÐÂ×°ÔØ(~L)";
            Text[ greek ] = "Åðá~íáöüñôùóç";
            Text[ korean ] = "Àç ·Îµå(~L)";
            Text[ turkish ] = "Yeniden yükle";
            Text[ language_user1 ] = " ";
        };
        MenuItem
        {
            Identifier = MN_READONLY_RELOAD_FRAME;
            HelpID = SID_RELOAD;
            Text = "~Frame neu laden" ;
            Text [ English ] = "~Reload frame" ;
            Text[ italian ] = "Ricarica ~frame";
            Text[ portuguese_brazilian ] = "~Reload frame";
            Text[ portuguese ] = "~Recarregar frame";
            Text[ danish ] = "Indlæs frame igen";
            Text[ french ] = "~Recharger le frame";
            Text[ swedish ] = "~Ladda ram på nytt";
            Text[ dutch ] = "~Frame opnieuw laden";
            Text[ spanish ] = "~Recargar frame";
            Text[ english_us ] = "Reload Frame";
            Text[ chinese_simplified ] = "ÖØÐÂ×°ÔØ¿ò¶ÔÏó";
            Text[ russian ] = "Ïåðåçàãðóçèòü ðàìêó";
            Text[ polish ] = "Za³aduj ponownie ramkê";
            Text[ japanese ] = "ÌڰтðV‚½‚ɓǂݍž‚Þ";
            Text[ chinese_traditional ] = "­«·s¸Ë¸ü°T®Ø";
            Text[ arabic ] = "ÅÚÇÏÉ ÊÍãíá ÇáÜ Frame";
            Text[ dutch ] = "~Frame opnieuw laden";
            Text[ chinese_simplified ] = "ÖØÐÂ×°ÔØ¿ò¶ÔÏó";
            Text[ greek ] = "Åðáíáöüñôùóç ~ðëáéóßïõ";
            Text[ korean ] = "ÇÁ·¹ÀÓ ´Ù½Ã ·Îµå";
            Text[ turkish ] = "Frame'i yeniden yükle";
            Text[ language_user1 ] = " ";
        };
        MenuItem
        {
            Identifier = MN_READONLY_SOURCEVIEW ;
            HelpID = HID_SOURCEVIEW ;
            Text = "HTM~L - Quelltext" ;
            Text [ English ] = "~HTML ~source" ;
            Text [ dutch ] = "~HTML - brontekst" ;
            Text [ english_us ] = "HT~ML Source" ;
            Text [ italian ] = "Testo sorgente HTML" ;
            Text [ spanish ] = "Texto fuente ~HTML" ;
            Text [ french ] = "Texte source HTM~L" ;
            Text [ swedish ] = "HTM~L-källtext" ;
            Text [ danish ] = "~HTML-kildetekst" ;
            Text [ portuguese ] = "Texto ~fonte HTML" ;
            Text [ portuguese_brazilian ] = "HTM~L - Quelltext" ;
            Text[ chinese_simplified ] = "~HTML Ô´Îı¾";
            Text[ russian ] = "Èñòî÷íèê HTM~L";
            Text[ polish ] = "Tekst Ÿród³owy HTML";
            Text[ japanese ] = "HTML¿°½(~M)";
            Text[ chinese_traditional ] = "~HTML ­ì©lÀÉ";
            Text[ arabic ] = "HTML ãÕÏÑ";
            Text[ dutch ] = "~HTML - brontekst";
            Text[ chinese_simplified ] = "~HTML Ô´Îı¾";
            Text[ greek ] = "Êåßìåíï ðñïÝëåõóçò HTM~L";
            Text[ korean ] = "HTML ¼Ò½º(~M)";
            Text[ turkish ] = "HTM~L  kaynak kodu";
            Text[ language_user1 ] = " ";
        };
        SEPARATOR
        MenuItem
        {
            Identifier = MN_READONLY_BROWSE_STOP ;
            HelpID = SID_BROWSE_STOP ;
            Text = "~Stopp" ;
            Text [ English ] = "~Stop" ;
            Text [ english_us ] = "~Stop" ;
            Text [ italian ] = "~Stop" ;
            Text [ spanish ] = "~Stop" ;
            Text [ french ] = "~Stop" ;
            Text [ dutch ] = "~Stop" ;
            Text [ swedish ] = "S~topp" ;
            Text [ danish ] = "~Stop" ;
            Text [ portuguese ] = "S~top" ;
            Text [ portuguese_brazilian ] = "~Stop" ;
            Text[ chinese_simplified ] = "ÔÝÍ£";
            Text[ russian ] = "Ñòîï";
            Text[ polish ] = "Zatrzymaj";
            Text[ japanese ] = "’†Ž~(~S)";
            Text[ chinese_traditional ] = "¼È°±(~T)";
            Text[ arabic ] = "ÅíÞÇÝ";
            Text[ dutch ] = "~Stop";
            Text[ chinese_simplified ] = "ÔÝÍ£";
            Text[ greek ] = "~ÄéáêïðÞ";
            Text[ korean ] = "ÁßÁö(~S)";
            Text[ turkish ] = "Dur";
            Text[ language_user1 ] = " ";
        };
        MenuItem
        {
            Identifier = MN_READONLY_BROWSE_BACKWARD ;
            HelpID = SID_BROWSE_BACKWARD ;
            Text = "~Rückwärts" ;
            Text [ English ] = "Bac~kward" ;
            Text [ english_us ] = "Backward" ;
            Text [ italian ] = "~Indietro" ;
            Text [ spanish ] = "~Retroceder" ;
            Text [ french ] = "~Précédent" ;
            Text [ dutch ] = "~Achteruit" ;
            Text [ swedish ] = "~Bakåt" ;
            Text [ danish ] = "~Tilbage" ;
            Text [ portuguese ] = "~Anterior" ;
            Text [ portuguese_brazilian ] = "~Rückwärts" ;
            Text[ chinese_simplified ] = "Ïòºó(~B)";
            Text[ russian ] = "Íàçàä";
            Text[ polish ] = "Wstecz";
            Text[ japanese ] = "Œã•û‚Ö";
            Text[ chinese_traditional ] = "¦V«á(~B)";
            Text[ arabic ] = "ááÎáÝ";
            Text[ language_user1 ] = "Áíôßóôñïöá ;";
            Text[ dutch ] = "~Achteruit";
            Text[ chinese_simplified ] = "Ïòºó(~B)";
            Text[ greek ] = "~Ðßóù";
            Text[ korean ] = "µÚ·Î";
            Text[ turkish ] = "Geri";
        };
        MenuItem
        {
            Identifier = MN_READONLY_BROWSE_FORWARD ;
            HelpID = SID_BROWSE_FORWARD ;
            Text = "~Vorwärts" ;
            Text [ English ] = "Forward" ;
            Text [ english_us ] = "~Forward" ;
            Text [ italian ] = "A~vanti" ;
            Text [ spanish ] = "~Avanzar" ;
            Text [ french ] = "~Suivant" ;
            Text [ dutch ] = "~Vooruit" ;
            Text [ swedish ] = "~Framåt" ;
            Text [ danish ] = "~Næste" ;
            Text [ portuguese ] = "~Seguinte" ;
            Text [ portuguese_brazilian ] = "~Vorwärts" ;
            Text[ chinese_simplified ] = "Ïòǰ(~F)";
            Text[ russian ] = "Âïåðåä";
            Text[ polish ] = "Do przodu";
            Text[ japanese ] = "i‚Þ(~F)";
            Text[ chinese_traditional ] = "¦V«e(~F)";
            Text[ arabic ] = "ááÃãÇã";
            Text[ language_user1 ] = " ";
            Text[ dutch ] = "~Vooruit";
            Text[ chinese_simplified ] = "Ïòǰ(~F)";
            Text[ greek ] = "Åìðñü~ò";
            Text[ korean ] = "¾ÕÀ¸·Î(~F)";
            Text[ turkish ] = "Ýleri";
        };
        SEPARATOR
        MenuItem
        {
            Identifier = MN_READONLY_CREATELINK ;
            HelpID = SID_CREATELINK ;
            /* ### ACHTUNG: Neuer Text in Resource? Verknüpfung ~hinzufügen : Bookmark ~hinzufügen */
            /* ### ACHTUNG: Neuer Text in Resource? Verknüpfung ~hinzufügen : Bookmark ~hinzufügen */
            Text = "Verknüpfung ~hinzufügen" ;
            Text [ English ] = "~Add Link" ;
            Text [ dutch ] = "Koppeling ~toevoegen" ;
            Text [ english_us ] = "~Add Link" ;
            Text [ swedish ] = "Lägg till ~länk" ;
            Text [ danish ] = "Tilføj kæde" ;
            Text [ italian ] = "Aggiungi collegamento" ;
            Text [ spanish ] = "Añadir ~vínculo" ;
            Text [ french ] = "Ajouter un l~ien" ;
            Text [ portuguese ] = "Adicionar ~ligação" ;
            Text [ portuguese_brazilian ] = "Verknüpfung ~hinzufügen" ;
            Text[ chinese_simplified ] = "ÐÂÔöÁ´½Ó(~A)";
            Text[ russian ] = "Äîáàâèòü ññûëêó";
            Text[ polish ] = "Dodaj ³¹cze";
            Text[ japanese ] = "ØÝ¸‚̒ljÁ(~A)";
            Text[ chinese_traditional ] = "·s¼W±¶®|(~A)";
            Text[ arabic ] = "ÅÖÇÝÉ ÇÑÊÈÇØ";
            Text[ dutch ] = "Koppeling ~toevoegen";
            Text[ chinese_simplified ] = "ÐÂÔöÁ´½Ó(~A)";
            Text[ greek ] = "ÐñïóèÞê~ç óýíäåóçò";
            Text[ korean ] = "¿¬°á Ãß°¡(~A)";
            Text[ turkish ] = "Baðlantý ekle";
            Text[ language_user1 ] = " ";
        };
        MenuItem
        {
            Identifier = MN_READONLY_CREATEGRAPHIKLINK ;
            HelpID = HID_MN_READONLY_CREATEGRAPHIKLINK ;
            /* ### ACHTUNG: Neuer Text in Resource? ~Verknüpfung auf Grafik hinzufügen : B~ookmark auf Grafik hinzufügen */
            /* ### ACHTUNG: Neuer Text in Resource? ~Verknüpfung auf Grafik hinzufügen : B~ookmark auf Grafik hinzufügen */
            Text = "~Verknüpfung auf Grafik hinzufügen" ;
            Text [ English ] = "Add ~Link to Image" ;
            Text [ dutch ] = "~Koppeling aan afbeelding toevoegen" ;
            Text [ english_us ] = "~Add Link to Picture" ;
            Text [ swedish ] = "~Lägga till länk på grafik" ;
            Text [ danish ] = "Tilføj kæde til billede" ;
            Text [ italian ] = "Aggiungi collegamento al grafico" ;
            Text [ spanish ] = "Añadir ~vínculo a imagen" ;
            Text [ french ] = "Ajouter un l~ien à l'image" ;
            Text [ portuguese ] = "Adicionar ~ligação à imagem" ;
            Text [ portuguese_brazilian ] = "~Verknüpfung auf Grafik hinzufügen" ;
            Text[ chinese_simplified ] = "ÐÂÔöͼÐεÄÁ´½Ó(~A)";
            Text[ russian ] = "Äîáàâèòü ññûëêó íà ðèñóíîê";
            Text[ polish ] = "Dodaj ³¹cze do grafiki";
            Text[ japanese ] = "}‚ÉØÝ¸‚ð’ljÁ‚·‚é(~A)";
            Text[ chinese_traditional ] = "·s¼W¹Ï¤ùªº±¶®|(~A)";
            Text[ arabic ] = "ÅÖÇÝÉ ÇÑÊÈÇØ áÕæÑÉ";
            Text[ dutch ] = "~Koppeling aan afbeelding toevoegen";
            Text[ chinese_simplified ] = "ÐÂÔöͼÐεÄÁ´½Ó(~A)";
            Text[ greek ] = "ÐñïóèÞêç óýíäåóçò óå ãñá~öéêü";
            Text[ korean ] = "±×¸²¿¡ ¿¬°á Ãß°¡(~A)";
            Text[ turkish ] = "Baðlantýyý grafiðe ekle";
            Text[ language_user1 ] = " ";
        };
        MenuItem
        {
            Identifier = MN_READONLY_SAVEGRAPHIC ;
            HelpID = HID_MN_READONLY_SAVEGRAPHIC ;
            Text = "~Grafik speichern..." ;
            Text [ English ] = "Save ~Image..." ;
            Text [ dutch ] = "Afbeelding ops~laan..." ;
            Text [ italian ] = "~Salva immagine..." ;
            Text [ spanish ] = "Guardar ~imagen..." ;
            Text [ french ] = "Enregistrer l'~image..." ;
            Text [ english_us ] = "Save Graphics..." ;
            Text [ swedish ] = "~Spara grafik..." ;
            Text [ danish ] = "~Gem billede..." ;
            Text [ portuguese ] = "~Guardar imagem..." ;
            Text [ portuguese_brazilian ] = "~Grafik speichern..." ;
            Text[ chinese_simplified ] = "´æÅÌͼÐÎ(~S)...";
            Text[ russian ] = "Ñîõðàíèòü ðèñóíîê...";
            Text[ polish ] = "Zapisz grafikê...";
            Text[ japanese ] = "¸Þ×̨¯¸‚̕ۑ¶...";
            Text[ chinese_traditional ] = "Àx¦s¹Ï¤ù(~S)...";
            Text[ arabic ] = "...ÍÝÙ ÇáÕæÑÉ";
            Text[ dutch ] = "Afbeelding ops~laan...";
            Text[ chinese_simplified ] = "´æÅÌͼÐÎ(~S)...";
            Text[ greek ] = "ÁðïèÞêåõóç ~ãñáöéêïý...";
            Text[ korean ] = "±×·¡ÇÈ ÀúÀå...";
            Text[ turkish ] = "Grafiði kaydet...";
            Text[ language_user1 ] = " ";
        };
        MenuItem
        {
            Identifier = MN_READONLY_GRAPHICTOGALLERY ;
            HelpID = HID_MN_READONLY_GRAPHICTOGALLERY ;
            Text = "Grafik hinzuf~ügen" ;
            Text [ English ] = "A~dd Image" ;
            SubMenu = Menu
            {
                ItemList =
                {
                    MenuItem
                    {
                        Identifier = MN_READONLY_TOGALLERYLINK ;
                        HelpID = HID_MN_READONLY_TOGALLERYLINK ;
                        Text = "Als Link" ;
                        Text [ english ] = "as link" ;
                        Text [ english_us ] = "As Link" ;
                        Text [ portuguese_brazilian ] = "Als Link" ;
                        Text [ swedish ] = "Som länk" ;
                        Text [ danish ] = "Som kæde" ;
                        Text [ italian ] = "Come link" ;
                        Text [ spanish ] = "Como vínculo" ;
                        Text [ french ] = "Comme lien" ;
                        Text [ dutch ] = "Als koppeling" ;
                        Text [ portuguese ] = "Como ligação" ;
                        Text[ chinese_simplified ] = "Á´½Ó";
                        Text[ language_user1 ] = " ";
                        Text[ russian ] = "Êàê ññûëêó";
                        Text[ polish ] = "Jako ³¹cze";
                        Text[ japanese ] = "ØÝ¸‚Æ‚µ‚Ä";
                        Text[ chinese_traditional ] = "±¶®|";
                        Text[ arabic ] = "ßÇÑÊÈÇØ";
                        Text[ dutch ] = "Als koppeling";
                        Text[ chinese_simplified ] = "Á´½Ó";
                        Text[ greek ] = "Ùò óýíäåóç";
                        Text[ korean ] = "¿¬°á·Î";
                        Text[ turkish ] = "Baðlantý olarak";
                    };
                    MenuItem
                    {
                        Identifier = MN_READONLY_TOGALLERYCOPY ;
                        HelpID = HID_MN_READONLY_TOGALLERYCOPY ;
                        Text = "Kopieren" ;
                        Text [ english ] = "copy" ;
                        Text [ english_us ] = "Copy" ;
                        Text [ portuguese_brazilian ] = "Kopieren" ;
                        Text [ swedish ] = "Kopiera" ;
                        Text [ danish ] = "Kopier" ;
                        Text [ italian ] = "Copia" ;
                        Text [ spanish ] = "Copiar" ;
                        Text [ french ] = "Copier" ;
                        Text [ dutch ] = "Kopiëren" ;
                        Text [ portuguese ] = "Copiar" ;
                        Text[ chinese_simplified ] = "¸´ÖÆ";
                        Text[ russian ] = "Êîïèðîâàòü";
                        Text[ polish ] = "Kopiuj";
                        Text[ japanese ] = "ºËß°";
                        Text[ chinese_traditional ] = "½Æ»s";
                        Text[ arabic ] = "äÓÎ";
                        Text[ dutch ] = "Kopiëren";
                        Text[ chinese_simplified ] = "¸´ÖÆ";
                        Text[ greek ] = "ÁíôéãñáöÞ";
                        Text[ korean ] = "º¹»ç";
                        Text[ turkish ] = "Kopyala";
                        Text[ language_user1 ] = " ";
                    };
                    SEPARATOR
                };
            };
            Text [ portuguese ] = "~Adicionar imagem" ;
            Text [ english_us ] = "Add Graphics" ;
            Text [ portuguese_brazilian ] = "Grafik hinzuf~ügen" ;
            Text [ swedish ] = "Lägg till ~grafik" ;
            Text [ danish ] = "Tilføj billede" ;
            Text [ italian ] = "Aggi~ungi immagine" ;
            Text [ spanish ] = "~Añadir imagen" ;
            Text [ french ] = "~Ajouter une image" ;
            Text [ dutch ] = "Afbeelding t~oevoegen" ;
            Text[ chinese_simplified ] = "ÐÂÔöͼÐÎ(~D)";
            Text[ russian ] = "Äîáàâèòü ðèñóíîê";
            Text[ polish ] = "Dodaj grafikê";
            Text[ japanese ] = "¸Þ×̨¯¸‚̒ljÁ";
            Text[ chinese_traditional ] = "·s¼W¹Ï¤ù(~D)";
            Text[ arabic ] = "ÅÖÇÝÉ ÑÓæã";
            Text[ dutch ] = "Afbeelding t~oevoegen";
            Text[ chinese_simplified ] = "ÐÂÔöͼÐÎ(~D)";
            Text[ greek ] = "Ðñïó~èÞêç ãñáöéêþí";
            Text[ korean ] = "±×·¡ÇÈ Ãß°¡";
            Text[ turkish ] = "Grafik ekle";
            Text[ language_user1 ] = " ";
        };
        MenuItem
        {
            Identifier = MN_READONLY_SAVEBACKGROUND ;
            HelpID = HID_MN_READONLY_SAVEBACKGROUND ;
            Text = "H~intergrund speichern..." ;
            Text [ English ] = "Save ~Background..." ;
            Text [ dutch ] = "Achte~rgrond opslaan..." ;
            Text [ english_us ] = "Save Background..." ;
            Text [ swedish ] = "Spara ~bakgrund..." ;
            Text [ danish ] = "Gem baggrunden..." ;
            Text [ italian ] = "Salva sfondo..." ;
            Text [ spanish ] = "Guardar ~fondo..." ;
            Text [ french ] = "Enregistrer l'~arrière-plan..." ;
            Text [ portuguese ] = "Guardar plano de f~undo..." ;
            Text [ portuguese_brazilian ] = "H~intergrund speichern..." ;
            Text[ chinese_simplified ] = "´æÅ̱³¾°(~B)...";
            Text[ russian ] = "Ñîõðàíèòü ôîí";
            Text[ polish ] = "Zapisz t³o";
            Text[ japanese ] = "”wŒi‚̕ۑ¶...";
            Text[ chinese_traditional ] = "Àx¦s­I´º(~B)...";
            Text[ arabic ] = "ÍÝÙ ÇáÎáÝíÉ...";
            Text[ dutch ] = "Achte~rgrond opslaan...";
            Text[ chinese_simplified ] = "´æÅ̱³¾°(~B)...";
            Text[ greek ] = "ÁðïèÞêåõó~ç öüíôïõ...";
            Text[ korean ] = "¹è°æ ÀúÀå...";
            Text[ turkish ] = "Artalaný kaydet";
            Text[ language_user1 ] = " ";
        };
        MenuItem
        {
            Identifier = MN_READONLY_BACKGROUNDTOGALLERY ;
            HelpID = HID_MN_READONLY_BACKGROUNDTOGALLERY ;
            Text = "H~intergrund hinzufügen" ;
            Text [ English ] = "Add ~Background" ;
            SubMenu = Menu
            {
                ItemList =
                {
                    MenuItem
                    {
                        Identifier = MN_READONLY_TOGALLERYLINK ;
                        HelpID = HID_MN_READONLY_TOGALLERYLINK ;
                        Text = "Als Link" ;
                        Text [ english ] = "as link" ;
                        Text [ english_us ] = "As Link" ;
                        Text [ portuguese_brazilian ] = "Als Link" ;
                        Text [ swedish ] = "Som länk" ;
                        Text [ danish ] = "Som kæde" ;
                        Text [ italian ] = "Come link" ;
                        Text [ spanish ] = "Como vínculo" ;
                        Text [ french ] = "Comme lien" ;
                        Text [ dutch ] = "Als koppeling" ;
                        Text [ portuguese ] = "Como ligação" ;
                        Text[ chinese_simplified ] = "Á´½Ó";
                        Text[ russian ] = "Êàê ññûëêó";
                        Text[ polish ] = "Jako ³¹cze";
                        Text[ japanese ] = "ØÝ¸‚Æ‚µ‚Ä";
                        Text[ chinese_traditional ] = "±¶®|";
                        Text[ arabic ] = "ßÇÑÊÈÇØ";
                        Text[ dutch ] = "Als koppeling";
                        Text[ chinese_simplified ] = "Á´½Ó";
                        Text[ greek ] = "Ùò óýíäåóç";
                        Text[ korean ] = "¿¬°á·Î";
                        Text[ turkish ] = "Baðlantý olarak";
                        Text[ language_user1 ] = " ";
                    };
                    MenuItem
                    {
                        Identifier = MN_READONLY_TOGALLERYCOPY ;
                        HelpID = HID_MN_READONLY_TOGALLERYCOPY ;
                        Text = "Kopieren" ;
                        Text [ english ] = "copy" ;
                        Text [ english_us ] = "Copy" ;
                        Text [ portuguese_brazilian ] = "Kopieren" ;
                        Text [ swedish ] = "Kopiera" ;
                        Text [ danish ] = "Kopier" ;
                        Text [ italian ] = "Copia" ;
                        Text [ spanish ] = "Copiar" ;
                        Text [ french ] = "Copier" ;
                        Text [ dutch ] = "Kopiëren" ;
                        Text [ portuguese ] = "Copiar" ;
                        Text[ chinese_simplified ] = "¸´ÖÆ";
                        Text[ russian ] = "Êîïèðîâàòü";
                        Text[ polish ] = "Kopiuj";
                        Text[ japanese ] = "ºËß°";
                        Text[ chinese_traditional ] = "½Æ»s";
                        Text[ arabic ] = "äÓÎ";
                        Text[ dutch ] = "Kopiëren";
                        Text[ chinese_simplified ] = "¸´ÖÆ";
                        Text[ greek ] = "ÁíôéãñáöÞ";
                        Text[ korean ] = "º¹»ç";
                        Text[ turkish ] = "Kopyala";
                        Text[ language_user1 ] = " ";
                    };
                    SEPARATOR
                };
            };
            Text [ english_us ] = "Add Background" ;
            Text [ portuguese_brazilian ] = "H~intergrund hinzufügen" ;
            Text [ swedish ] = "Lägg till ~bakgrund" ;
            Text [ danish ] = "Tilføj baggrund" ;
            Text [ italian ] = "Aggiungi sfon~do" ;
            Text [ spanish ] = "Añadir ~fondo" ;
            Text [ french ] = "Aj~outer un arrière-plan" ;
            Text [ dutch ] = "A~chtergrond toevoegen" ;
            Text [ portuguese ] = "Adicionar plano de ~fundo" ;
            Text[ chinese_simplified ] = "ÐÂÔö±³¾°(~B)";
            Text[ russian ] = "Âñòàâèòü ôîí";
            Text[ polish ] = "Dodaj t³o";
            Text[ japanese ] = "”wŒi‚̒ljÁ";
            Text[ chinese_traditional ] = "·s¼W­I´º(~B)";
            Text[ arabic ] = "ÅÖÇÝÉ ÎáÝíÉ";
            Text[ dutch ] = "A~chtergrond toevoegen";
            Text[ chinese_simplified ] = "ÐÂÔö±³¾°(~B)";
            Text[ greek ] = "ÐñïóèÞê~ç öüíôïõ";
            Text[ korean ] = "¹è°æ Ãß°¡";
            Text[ turkish ] = "Artalaný ekle";
            Text[ language_user1 ] = " ";
        };
        SEPARATOR
        MenuItem
        {
            Identifier = MN_READONLY_COPYLINK ;
            HelpID = HID_MN_READONLY_COPYLINK ;
            Text = "~Link kopieren" ;
            Text [ English ] = "~Copy Link" ;
            Text [ dutch ] = "~Koppeling kopiëren" ;
            Text [ english_us ] = "Copy ~Link" ;
            Text [ italian ] = "Copia link" ;
            Text [ spanish ] = "~Copiar vínculo" ;
            Text [ french ] = "Copier le ~lien" ;
            Text [ swedish ] = "Kopiera l~änk" ;
            Text [ danish ] = "Kopier kæde" ;
            Text [ portuguese ] = "Copiar ~ligação" ;
            Text [ portuguese_brazilian ] = "~Link kopieren" ;
            Text[ chinese_simplified ] = "¸´ÖÆÁ´½Ó(~L)";
            Text[ russian ] = "Êîïèðîâàòü ññûëêó";
            Text[ polish ] = "Kopiuj ³¹cze";
            Text[ japanese ] = "ØÝ¸‚̺Ëß°(~L)";
            Text[ chinese_traditional ] = "½Æ»s±¶®|(~L)";
            Text[ arabic ] = "äÓÎ ÇáÇÑÊÈÇØ";
            Text[ dutch ] = "~Koppeling kopiëren";
            Text[ chinese_simplified ] = "¸´ÖÆÁ´½Ó(~L)";
            Text[ greek ] = "ÁíôéãñáöÞ ~óýíäåóçò";
            Text[ korean ] = "¿¬°á º¹»ç(~L)";
            Text[ turkish ] = "Baðlantýyý kopyala";
            Text[ language_user1 ] = " ";
        };
        MenuItem
        {
            Identifier = MN_READONLY_COPYGRAPHIC ;
            HelpID = HID_MN_READONLY_COPYGRAPHIC ;
            /* ### ACHTUNG: Neuer Text in Resource? Grafik ~kopieren : ~Grafik kopieren */
            /* ### ACHTUNG: Neuer Text in Resource? Grafik ~kopieren : ~Grafik kopieren */
            /* ### ACHTUNG: Neuer Text in Resource? Grafik ~kopieren : ~Grafik kopieren */
            Text = "Grafik ~kopieren" ;
            Text [ English ] = "C~opy ™mage" ;
            Text [ dutch ] = "Afbeelding ko~piëren" ;
            Text [ italian ] = "~Copia immagine" ;
            Text [ spanish ] = "~Copiar imagen" ;
            Text [ french ] = "~Copier une image" ;
            Text [ english_us ] = "Copy ~Graphics" ;
            Text [ swedish ] = "Kopiera ~grafik" ;
            Text [ danish ] = "Kopier billede" ;
            Text [ portuguese ] = "Co~piar imagem" ;
            Text [ portuguese_brazilian ] = "Grafik ~kopieren" ;
            Text[ chinese_simplified ] = "¸´ÖÆÍ¼ÐÎ(~G)";
            Text[ russian ] = "Êîïèðîâàòü ðèñóíîê";
            Text[ polish ] = "Kopiuj grafikê";
            Text[ japanese ] = "¸Þ×̨¯¸‚̺Ëß°(~G)";
            Text[ chinese_traditional ] = "½Æ»s¹Ï¤ù(~G)";
            Text[ arabic ] = "äÓÎ ÇáÕæÑÉ";
            Text[ dutch ] = "Afbeelding ko~piëren";
            Text[ chinese_simplified ] = "¸´ÖÆÍ¼ÐÎ(~G)";
            Text[ greek ] = "ÁíôéãñáöÞ ãñáöé~êþí";
            Text[ korean ] = "±×·¡ÇÈ º¹»ç(~G)";
            Text[ turkish ] = "Grafiði kopyala";
            Text[ language_user1 ] = " ";
        };
        SEPARATOR
        MenuItem
        {
            Identifier = MN_READONLY_LOADGRAPHIC ;
            HelpID = HID_MN_READONLY_LOADGRAPHIC ;
            Text = "G~rafiken laden" ;
            Text [ English ] = "Load Images" ;
            Text [ dutch ] = "A~fbeeldingen laden" ;
            Text [ english_us ] = "Load Graphics" ;
            Text [ swedish ] = "Ladda g~rafik" ;
            Text [ danish ] = "Indlæs grafik" ;
            Text [ italian ] = "Ca~rica immagine" ;
            Text [ spanish ] = "Cargar ~imágenes" ;
            Text [ french ] = "Charger des i~mages" ;
            Text [ portuguese ] = "~Carregar imagens" ;
            Text [ portuguese_brazilian ] = "G~rafiken laden" ;
            Text[ chinese_simplified ] = "×°ÔØÍ¼ÐÎ";
            Text[ russian ] = "Çàãðóçèòü ðèñóíêè";
            Text[ polish ] = "Za³aduj grafiki";
            Text[ japanese ] = "¸Þ×̨¯¸½‚̓ǂݍž‚Ý";
            Text[ chinese_traditional ] = "¸Ë¸ü¹Ï¤ù";
            Text[ arabic ] = "ÊÍãíá ÇáÕæÑ";
            Text[ dutch ] = "A~fbeeldingen laden";
            Text[ chinese_simplified ] = "×°ÔØÍ¼ÐÎ";
            Text[ greek ] = "Öü~ñôùóç ãñáöéêþí";
            Text[ korean ] = "±×·¡ÇÈ ·Îµå";
            Text[ turkish ] = "Grafikleri yükle";
            Text[ language_user1 ] = " ";
        };
        MenuItem
        {
            Identifier = MN_READONLY_GRAPHICOFF ;
            HelpID = HID_MN_READONLY_GRAPHICOFF ;
            Text = "Grafiken ~ausschalten" ;
            Text [ English ] = "Images ~off" ;
            Text [ italian ] = "~Nascondi le immagini" ;
            Text [ spanish ] = "Desactivar ~imágenes" ;
            Text [ french ] = "~Désactiver des images" ;
            Text [ dutch ] = "~Afbeeldingen uitschakelen" ;
            Text [ english_us ] = "Graphics Off" ;
            Text [ swedish ] = "~Stäng av grafiker" ;
            Text [ danish ] = "~Sluk billeder" ;
            Text [ portuguese ] = "~Ocultar imagens" ;
            Text [ portuguese_brazilian ] = "Grafiken ~ausschalten" ;
            Text[ chinese_simplified ] = "ÒþÈëͼÐÎ";
            Text[ russian ] = "Îòêëþ÷èòü ðèñóíêè";
            Text[ polish ] = "Wy³¹cz grafiki";
            Text[ japanese ] = "¸Þ×̨¯¸½‚Ì”ñ•\\ަ";
            Text[ chinese_traditional ] = "Áô¤J¹Ï¤ù";
            Text[ arabic ] = "ÅÎÝÇÁ ÇáÕæÑ";
            Text[ dutch ] = "~Afbeeldingen uitschakelen";
            Text[ chinese_simplified ] = "ÒþÈëͼÐÎ";
            Text[ greek ] = "~Áðåíåñãïðïßçóç ãñáöéêþí";
            Text[ korean ] = "±×·¡ÇÈ ´Ý±â";
            Text[ turkish ] = "Grafikleri kapat";
            Text[ language_user1 ] = " ";
        };
#ifdef WNT
        MenuItem
        {
            Identifier = MN_READONLY_PLUGINOFF ;
            HelpID = HID_MN_READONLY_PLUGINOFF ;
            Text = "~PlugIns ausschalten" ;
            Text [ English ] = "~PlugIns off" ;
            Text [ english_us ] = "Plug-Ins Off" ;
            Text [ italian ] = "Disattiva i PlugIn" ;
            Text [ spanish ] = "Desactivar ~Plug-ins" ;
            Text [ french ] = "Désactiver les ~Plug-Ins" ;
            Text [ dutch ] = "~PlugIns uitschakelen" ;
            Text [ swedish ] = "Stäng av ~PlugIns" ;
            Text [ danish ] = "Sluk ~PlugIns" ;
            Text [ portuguese ] = "Desactivar ~PlugIns" ;
            Text [ portuguese_brazilian ] = "~PlugIns ausschalten" ;
            Text[ chinese_simplified ] = "ʧ»î ~Plug-In";
            Text[ russian ] = "Îòêëþ÷èòü Plug-Ins";
            Text[ polish ] = "Wy³¹cz dodatki PlugIn";
            Text[ japanese ] = "Ìß×¸Þ²Ý µÌ";
            Text[ chinese_traditional ] = "¥¢¬¡ ~PlugIn";
            Text[ arabic ] = "ÅíÞÇÝ Plug-Ins";
            Text[ dutch ] = "~PlugIns uitschakelen";
            Text[ chinese_simplified ] = "ʧ»î ~Plug-In";
            Text[ greek ] = "Áðåíåñãïðïßçóç ~Plug-Ins";
            Text[ korean ] = "Ç÷¯±×ÀÎ Á¾·á";
            Text[ turkish ] = "Plug-in'leri kapat";
            Text[ language_user1 ] = " ";
        };
#endif
    };
};
String STR_EXPORT_GRAFIK_TITLE
{
    Text = "Grafik-Export" ;
    Text [ English ] = "Image export" ;
    Text [ dutch ] = "Afbeelding exporteren" ;
    Text [ italian ] = "Esporta immagine" ;
    Text [ spanish ] = "Exportar imagen" ;
    Text [ french ] = "Export d'image" ;
    Text [ english_us ] = "Graphics Export" ;
    Text [ swedish ] = "Grafik-export" ;
    Text [ danish ] = "Billedeksport" ;
    Text [ portuguese ] = "Exportar imagem" ;
    Text [ portuguese_brazilian ] = "Grafik-Export" ;
    Text[ chinese_simplified ] = "ͼÐÎ-Êä³ö";
    Text[ russian ] = "Ýêñïîðò ðèñóíêà";
    Text[ polish ] = "Eksport grafiki";
    Text[ japanese ] = "¸Þ×̨¯¸ ´¸½Îß°Ä";
    Text[ chinese_traditional ] = "¹Ï¤ù-¿é¥X";
    Text[ arabic ] = "ÊÕÏíÑ ÕæÑ";
    Text[ dutch ] = "Afbeelding exporteren";
    Text[ chinese_simplified ] = "ͼÐÎ-Êä³ö";
    Text[ greek ] = "ÅîáãùãÞ ãñáöéêþí";
    Text[ korean ] = "±×·¡ÇÈ º¸³»±â";
    Text[ turkish ] = "Grafik ver";
    Text[ language_user1 ] = " ";
};
String STR_CHAIN_OK
{
    Text = "Betätigen Sie die linke Maustaste um die Rahmen zu verketten." ;
    Text [ english ] = "Klick the left mouse button to chain the Frames." ;
    Text [ portuguese ] = "Clique no botão esquerdo do rato para ligar as molduras." ;
    Text [ english_us ] = "Click the left mouse button to link the frames." ;
    Text [ portuguese_brazilian ] = "Betätigen Sie die linke Maustaste um die Rahmen zu verketten." ;
    Text [ swedish ] = "Klicka på den vänstra musknappen för att länka samman ramen." ;
    Text [ danish ] = "Klik på venstre museknap for at kæde rammerne." ;
    Text [ italian ] = "Per collegare la cornice cliccate con il tasto sinistro del mouse." ;
    Text [ spanish ] = "Pulse el botón izquierdo del ratón para vincular las marcos." ;
    Text [ french ] = "Cliquez sur le bouton gauche de la souris pour lier les cadres." ;
    Text [ dutch ] = "Gebruik de linker muistoets om het kader te koppelen." ;
    Text[ chinese_simplified ] = "ÇëÄúͨ¹ý°´»÷Êó±ê×ó¼üÀ´Á¬½Ó¿ò¡£";
    Text[ russian ] = "Íàæìèòå ëåâóþ êëàâèøó ìûøè äëÿ ñâÿçè ðàìêè.";
    Text[ polish ] = "Kliknij lewy przycisk myszy, by po³¹czyæ ramki.";
    Text[ japanese ] = "˜g‚ð‚‚Ȃ®‚½‚߂ɍ¶‚Ìϳ½ÎÞÀÝ‚ð¸Ø¯¸‚µ‚ĉº‚³‚¢";
    Text[ chinese_traditional ] = "½Ð±z«ö¥H¤U·Æ¹«ªº¥ªÁä¡M³sµ²°T®Ø¡C";
    Text[ arabic ] = ".ÇäÞÑ ÇáÒÑ ÇáÃíÓÑ ááãÇæÓ áÑÈØ ÇáÃØÑ";
    Text[ dutch ] = "Gebruik de linker muistoets om het kader te koppelen.";
    Text[ chinese_simplified ] = "ÇëÄúͨ¹ý°´»÷Êó±ê×ó¼üÀ´Á¬½Ó¿ò¡£";
    Text[ greek ] = "ÐáôÞóôå ôï áñéóôåñü ðëÞêôñï ôïõ ðïíôéêéïý ãéá íá óõíäåèïýí ôá ðåñéãñÜììáôá.";
    Text[ korean ] = "ÇÁ·¹ÀÓ¿¡ ¿¬°áÇϱâ À§Çؼ­ ¿ÞÂÊ ¸¶¿ì½º ¹öưÀ» Ŭ¸¯Çϼ¼¿ä.";
    Text[ turkish ] = "Çerçeveler arasý baðlantý oluþturmak için sol fare tuþunu kullanýn.";
    Text[ language_user1 ] = " ";
};
String STR_CHAIN_NOT_EMPTY
{
    Text = "Der Zielrahmen ist nicht leer." ;
    Text [ english ] = "The target is not empty." ;
    Text [ portuguese ] = "A moldura de destino não está vazia." ;
    Text [ english_us ] = "Target frame not empty." ;
    Text [ portuguese_brazilian ] = "Der Zielrahmen ist nicht leer." ;
    Text [ swedish ] = "Målramen är inte tom." ;
    Text [ danish ] = "Målrammen er ikke tom." ;
    Text [ italian ] = "La cornice di destinazione non è vuota." ;
    Text [ spanish ] = "El marco destino no está vacío." ;
    Text [ french ] = "Le cadre cible n'est pas vide." ;
    Text [ dutch ] = "Het doelkader is niet leeg." ;
    Text[ chinese_simplified ] = "Ä¿±ê¿ò²»Êǿյġ£";
    Text[ russian ] = "Öåëåâàÿ ðàìêà íå ÿâëÿåòñÿ ïóñòîé.";
    Text[ polish ] = "Ramka docelowa nie jest pusta.";
    Text[ japanese ] = "–Ú•W‚̘g‚Í‹ó‚Å‚·";
    Text[ chinese_traditional ] = "¥Ø¼Ð¤è¶ô¤£¬OªÅªº¡C";
    Text[ arabic ] = ".ÇáÅØÇÑ ÇáåÏÝ ÛíÑ ÝÇÑÛ";
    Text[ dutch ] = "Het doelkader is niet leeg.";
    Text[ chinese_simplified ] = "Ä¿±ê¿ò²»Êǿյġ£";
    Text[ greek ] = "Ôï ðëáßóéï ðñïïñéóìïý äåí åßíáé êåíü.";
    Text[ korean ] = "¸ñÇ¥ ÇÁ·¹ÀÓÀÌ ºñ¾îÀÖÁö ¾Ê½À´Ï´Ù.";
    Text[ turkish ] = "Hedef çerçeve boþ deðil.";
    Text[ language_user1 ] = " ";
};
String STR_CHAIN_IS_IN_CHAIN
{
    Text = "Der Zielrahmen ist bereits verkettet." ;
    Text [ english ] = "The target is already target of a chain." ;
    Text [ portuguese ] = "A moldura de destino já está ligada." ;
    Text [ english_us ] = "Target frame is already linked." ;
    Text [ portuguese_brazilian ] = "Der Zielrahmen ist bereits verkettet." ;
    Text [ swedish ] = "Målramen är redan länkad. " ;
    Text [ danish ] = "Målrammen er allerede sammenkædet." ;
    Text [ italian ] = "La cornice di destinazione è già collegata." ;
    Text [ spanish ] = "El marco destino ya está vinculado." ;
    Text [ french ] = "Le cadre cible est déjà lié." ;
    Text [ dutch ] = "Het doelkader is reeds gekoppeld." ;
    Text[ chinese_simplified ] = "ÒѾ­Á´½ÓÄ¿±ê¿ò¡£";
    Text[ russian ] = "Öåëåàâÿ ðàìêà óæå ñâÿçàíà.";
    Text[ polish ] = "Ramka docelowa jest ju¿ po³¹czona.";
    Text[ japanese ] = "–Ú•W‚̘g‚Í‚·‚łɂ‚Ȃª‚ê‚Ä‚¢‚Ü‚·";
    Text[ chinese_traditional ] = "¤w¸g³sµ²¥Ø¼Ð¤è¶ô¡C";
    Text[ arabic ] = ".ÇáÅØÇÑ ÇáåÏÝ ãÑÊÈØ ÈÇáÝÚá";
    Text[ dutch ] = "Het doelkader is reeds gekoppeld.";
    Text[ chinese_simplified ] = "ÒѾ­Á´½ÓÄ¿±ê¿ò¡£";
    Text[ greek ] = "Ôï ðëáßóéï ðñïïñéóìïý åßíáé Þäç óõíäåäåìÝíï.";
    Text[ korean ] = "¸ñÇ¥ ÇÁ·¹ÀÓÀÌ ÀÌ¹Ì ¿¬°á µÇ¾î ÀÖ½À´Ï´Ù.";
    Text[ turkish ] = "Hedef çerçeve baðlantýsý oluþturulmuþ durumda.";
    Text[ language_user1 ] = " ";
};
String STR_CHAIN_WRONG_AREA
{
    Text = "Der Zielrahmen steht in einem Bereich in dem keine Verkettung möglich ist." ;
    Text [ english ] = "The target is in an invalid area." ;
    Text [ portuguese ] = "A moldura de destino encontra-se numa área que não permite a ligação." ;
    Text [ english_us ] = "The target frame for the link is in an invalid area." ;
    Text [ portuguese_brazilian ] = "Der Zielrahmen steht in einem Bereich in dem keine Verkettung möglich ist." ;
    Text [ swedish ] = "Målramen finns i ett område där ingen länkning är möjlig. " ;
    Text [ danish ] = "Målrammen befinder sig i et område hvor sammenkædning ikke er mulig." ;
    Text [ italian ] = "La cornice di destinazione si trova in un'area nella quale non sono possibili collegamenti." ;
    Text [ spanish ] = "El marco destino se encuentra en un área en la que los vínculos no son posibles." ;
    Text [ french ] = "Le cadre-cible se trouve dans une section ne pouvant pas faire l'objet d'un lien." ;
    Text [ dutch ] = "Het bronkader staat in een bereik waarin geen koppeling mogelijk is." ;
    Text[ chinese_simplified ] = "Ä¿±ê¿ò´¦ÓÚÒ»¸öÎÞ·¨Á´½ÓµÄÇøÓò¡£";
    Text[ russian ] = "Öåëåâàÿ ðàìêà íàõîäèòñÿ â îáëàñòè, â êîòîðîé ñâÿçü íåâîçìîæíà.";
    Text[ polish ] = "Ramka docelowa znajduje siê w obszarze, w którym niemo¿liwe jest po³¹czenie.";
    Text[ japanese ] = "–Ú•W‚̘g‚͂‚Ȃ®‚±‚Ƃ̂ł«‚È‚¢”͈͂ɂ ‚è‚Ü‚·";
    Text[ chinese_traditional ] = "¥Ø¼Ð°T®Ø³B©ó¤@­ÓµLªk°T®Øªº°Ï°ì¡C";
    Text[ arabic ] = ".íÊæÇÌÏ ÇáÅØÇÑ ÇáåÏÝ Ýí ãäØÞÉ áÇ íãßä Úãá ÊÓáÓá ÝíåÇ";
    Text[ dutch ] = "Het bronkader staat in een bereik waarin geen koppeling mogelijk is.";
    Text[ chinese_simplified ] = "Ä¿±ê¿ò´¦ÓÚÒ»¸öÎÞ·¨Á´½ÓµÄÇøÓò¡£";
    Text[ greek ] = "Ôï ðëáßóéï ðñïïñéóìïý âñßóêåôáé óå ìéá ðåñéï÷Þ óôçí ïðïßá åßíáé áäýíáôïí íá äçìéïõñãçèåß ìßá óýíäåóç.";
    Text[ korean ] = "¿¬°áÀ»  À§ÇÑ ¸ñÇ¥ ÇÁ·¹ÀÓÀÌ À¯È¿ÇÏÁö ¾ÊÀº ¿µ¿ª¿¡ ÀÖ½À´Ï´Ù.";
    Text[ turkish ] = "Hedef çerçeve baðlantý oluþturulamayacak bir alanda bulunuyor.";
    Text[ language_user1 ] = " ";
};
String STR_CHAIN_NOT_FOUND
{
    Text = "An der aktuellen Position kann kein Zielrahmen gefunden werden." ;
    Text [ english ] = "No target found at this position." ;
    Text [ portuguese ] = "Impossível encontrar moldura de destino na posição actual." ;
    Text [ english_us ] = "Target frame not found at current position." ;
    Text [ portuguese_brazilian ] = "An der aktuellen Position kann kein Zielrahmen gefunden werden." ;
    Text [ swedish ] = "Vid den aktuella positionen kan ingen målram hittas." ;
    Text [ danish ] = "Der blev ikke fundet en målramme på den aktuelle position." ;
    Text [ italian ] = "Impossibile trovare una cornice di destinazione nella posizione corrente." ;
    Text [ spanish ] = "En la posición actual no se puede encontrar ningún marco destino." ;
    Text [ french ] = "Aucun cadre cible ne peut être trouvé à la position courante." ;
    Text [ dutch ] = "Op de actuele positie kan geen doelkader worden gevonden." ;
    Text[ chinese_simplified ] = "ÔÚµ±Ç°µÄλÖÃûÓÐÕÒµ½Ä¿±ê¿ò¡£";
    Text[ russian ] = "Â òåêóùåé ïîçèöèè öåëåâàÿ ðàìêà íåîáíàðóæåíà.";
    Text[ polish ] = "Przy aktualnej pozycji nie znaleziono ramki docelowej.";
    Text[ japanese ] = "Œ»ˆÊ’u‚É–Ú•W‚̘g‚ÍŒ©‚‚©‚è‚Ü‚¹‚ñ";
    Text[ chinese_traditional ] = "¦b·í«eªº¦ì¸m¨S¦³§ä¨ì¥Ø¼Ð¤è¶ô¡C";
    Text[ arabic ] = ".áÇ íæÌÏ ÅØÇÑ åÏÝ Ýí ÇáãæÞÚ ÇáÍÇáí";
    Text[ dutch ] = "Op de actuele positie kan geen doelkader worden gevonden.";
    Text[ chinese_simplified ] = "ÔÚµ±Ç°µÄλÖÃûÓÐÕÒµ½Ä¿±ê¿ò¡£";
    Text[ greek ] = "Äåí åßíáé äõíáôüí íá âñåèåß ðëáßóéï ðñïïñéóìïý óôçí ôñÝ÷ïõóá èÝóç.";
    Text[ korean ] = "ÇöÀçÀÇ À§Ä¡¿¡¼­ ¸ñÇ¥ ÇÁ·¹ÀÓÀÌ ¹ß°ßµÇÁö ¾Ê½À´Ï´Ù.";
    Text[ turkish ] = "Yürürlükteki konumda hedef çerçeve bulunamýyor.";
    Text[ language_user1 ] = " ";
};
String STR_CHAIN_SOURCE_CHAINED
{
    Text = "Der Quellrahmen ist bereits Quelle einer Verkettung." ;
    Text [ english ] = "The source is already source of a chain." ;
    Text [ portuguese ] = "A moldura-fonte já é a fonte de uma ligação." ;
    Text [ english_us ] = "The source frame is already the source of a link." ;
    Text [ portuguese_brazilian ] = "Der Quellrahmen ist bereits Quelle einer Verkettung." ;
    Text [ swedish ] = "Källramen är redan källa till en länk." ;
    Text [ danish ] = "Kilderammen er allerede kilde til en sammenkædning." ;
    Text [ italian ] = "La cornice sorgente è già sorgente di un collegamento." ;
    Text [ spanish ] = "El marco origen ya es la fuente de un vínculo." ;
    Text [ french ] = "Le cadre source est déjà la source d'un lien." ;
    Text [ dutch ] = "Het bronkader is reeds basis van een koppeling." ;
    Text[ chinese_simplified ] = "Õâ¸öÀ´Ô´¿òÒѾ­ÊÇÒ»¸öÁ´½ÓµÄÀ´Ô´¿ò¡£";
    Text[ russian ] = "Èñõîäíàÿ ðàìêà óæå ÿâëÿåòñÿ èñòî÷íèêîì ñâÿçè.";
    Text[ polish ] = "Ramka Ÿród³owa jest ju¿ Ÿród³em po³¹czenia.";
    Text[ japanese ] = "Œ³‚̘g‚Í‚·‚łɂ‚Ȃ¬‚ÌŒ³‚Å‚·";
    Text[ chinese_traditional ] = "³o­Ó¨Ó·½°T®Ø¤w¸g¬O¤@­Ó³sµ²ªº·½°T®Ø¡C";
    Text[ arabic ] = ".ÅØÇÑ ÇáãÕÏÑ åæ ãÓÈÞÇð ãÕÏÑ ÇáÊÓáÓá";
    Text[ dutch ] = "Het bronkader is reeds basis van een koppeling.";
    Text[ chinese_simplified ] = "Õâ¸öÀ´Ô´¿òÒѾ­ÊÇÒ»¸öÁ´½ÓµÄÀ´Ô´¿ò¡£";
    Text[ greek ] = "Ôï ðëáßóéï ðñïÝëåõóçò åßíáé Þäç ç ðñïÝëåõóç ìéáò óýíäåóçò.";
    Text[ korean ] = "¼Ò½º ÇÁ·¹ÀÓÀº À̹̿¬°á ÀÇ ¼Ò½ºÀÔ´Ï´Ù.";
    Text[ turkish ] = "Kaynak çerçeve zaten bir baðlantý zincirinin kaynaðý.";
    Text[ language_user1 ] = " ";
};
String STR_CHAIN_SELF
{
    Text = "Eine geschlossene Kette ist nicht möglich." ;
    Text [ english ] = "a chain connot be closed." ;
    Text [ portuguese ] = "Impossível uma sequência fechada." ;
    Text [ english_us ] = "A closed link is not possible." ;
    Text [ portuguese_brazilian ] = "Eine geschlossene Kette ist nicht möglich." ;
    Text [ swedish ] = "Det är inte möjligt med en sluten kedja." ;
    Text [ danish ] = "En lukket kæde er ikke mulig." ;
    Text [ italian ] = "Un collegamento chiuso non è possibile." ;
    Text [ spanish ] = "No es posible una secuencia cerrada." ;
    Text [ french ] = "Une chaine fermée n'est pas possible." ;
    Text [ dutch ] = "Een gesloten koppeling is niet mogelijk." ;
    Text[ chinese_simplified ] = "Ò»¸ö·â±ÕʽµÄÁ´½ÓÊDz»¿ÉÄܵġ£";
    Text[ russian ] = "Çàìêíóòàÿ öåïü íåâîçìîæíà.";
    Text[ polish ] = "Zamkniête ³¹cze nie jest mo¿liwe.";
    Text[ japanese ] = "•‚¶‚½‚‚Ȃª‚è‚Í•s‰Â”\\‚Å‚·";
    Text[ chinese_traditional ] = "¤@­Ó«Ê³¬¦¡ªº³sµ²¬O¤£¥i¯àªº¡C";
    Text[ arabic ] = "ÇáÓáÓáÉ ÇáãÛáÞÉ ÃãÑ ÛíÑ ããßä";
    Text[ dutch ] = "Een gesloten koppeling is niet mogelijk.";
    Text[ chinese_simplified ] = "Ò»¸ö·â±ÕʽµÄÁ´½ÓÊDz»¿ÉÄܵġ£";
    Text[ greek ] = "Äåí åßíáé äõíáôüí íá äçìéïõñãçèåß áëõóßäá ðïõ êëåßíåé.";
    Text[ korean ] = "´ÝÈù ¿¬°áÀº ºÒ°¡´ÉÇÕ´Ï´Ù.";
    Text[ turkish ] = "Kapalý bir zincir oluþturulamaz.";
    Text[ language_user1 ] = " ";
};
String STR_REDLINE_INSERT
{
    Text = "Eingefügt" ;
    Text [ english ] = "Inserted" ;
    Text [ portuguese ] = "Inserido" ;
    Text [ english_us ] = "Inserted" ;
    Text [ portuguese_brazilian ] = "Eingefügt" ;
    Text [ swedish ] = "Infogad" ;
    Text [ danish ] = "Indsat" ;
    Text [ italian ] = "Inserito" ;
    Text [ spanish ] = "Insertado" ;
    Text [ french ] = "Inséré" ;
    Text [ dutch ] = "Ingevoegd" ;
    Text[ chinese_simplified ] = "ÒѾ­²åÈë";
    Text[ russian ] = "Âñòàâëåí";
    Text[ polish ] = "Wstawiony";
    Text[ japanese ] = "‘}“üÏ‚Ý";
    Text[ chinese_traditional ] = "¤w¸g´¡¤J";
    Text[ arabic ] = "ãÏÑÌ";
    Text[ language_user1 ] = " ";
    Text[ dutch ] = "Ingevoegd";
    Text[ chinese_simplified ] = "ÒѾ­²åÈë";
    Text[ greek ] = "Åéóáãüìåíá";
    Text[ korean ] = "»ðÀÔµÊ";
    Text[ turkish ] = "Eklendi";
};
String STR_REDLINE_DELETE
{
    Text = "Gelöscht" ;
    Text [ english ] = "Deleted" ;
    Text [ portuguese ] = "Eliminado" ;
    Text [ english_us ] = "Deleted" ;
    Text [ portuguese_brazilian ] = "Gelöscht" ;
    Text [ swedish ] = "Raderat" ;
    Text [ danish ] = "Slettet" ;
    Text [ italian ] = "Cancellato" ;
    Text [ spanish ] = "Eliminado" ;
    Text [ french ] = "Supprimé" ;
    Text [ dutch ] = "Gewist" ;
    Text[ chinese_simplified ] = "ÒѾ­É¾³ý";
    Text[ russian ] = "Óäàëåí";
    Text[ polish ] = "Usuniêty";
    Text[ japanese ] = "íœÏ‚Ý";
    Text[ chinese_traditional ] = "¤w¸g§R°£";
    Text[ arabic ] = "ãÍÐæÝ";
    Text[ dutch ] = "Gewist";
    Text[ chinese_simplified ] = "ÒѾ­É¾³ý";
    Text[ greek ] = "ÄéáãñáììÝíï";
    Text[ korean ] = "»èÁ¦µÊ";
    Text[ turkish ] = "Silindi";
    Text[ language_user1 ] = " ";
};
String STR_REDLINE_FORMAT
{
    Text = "Attributiert" ;
    Text [ english ] = "Formatted" ;
    Text [ portuguese ] = "Formatado" ;
    Text [ english_us ] = "Formatted" ;
    Text [ portuguese_brazilian ] = "Attributiert" ;
    Text [ swedish ] = "Attributerat" ;
    Text [ danish ] = "Formateret" ;
    Text [ italian ] = "Fomattato" ;
    Text [ spanish ] = "Formateado" ;
    Text [ french ] = "Mis en forme" ;
    Text [ dutch ] = "Opgemaakt" ;
    Text[ chinese_simplified ] = "ÒѾ­¸ñʽ»¯";
    Text[ russian ] = "Îòôîðìàòèðîâàí";
    Text[ polish ] = "sformatowany";
    Text[ japanese ] = "‘®«";
    Text[ chinese_traditional ] = "¤w¸g®æ¦¡¤Æ";
    Text[ arabic ] = "ãäÓÞ";
    Text[ language_user1 ] = " ";
    Text[ dutch ] = "Opgemaakt";
    Text[ chinese_simplified ] = "ÒѾ­¸ñʽ»¯";
    Text[ greek ] = "ÌïñöïðïéçìÝíï";
    Text[ korean ] = "¼­½Ä Àû¿ë";
    Text[ turkish ] = "Faormatlandý";
};
String STR_REDLINE_TABLE
{
    Text = "Tabelle verändert" ;
    Text [ english ] = "Table changed" ;
    Text [ portuguese ] = "Tabela modificada" ;
    Text [ english_us ] = "Table changed" ;
    Text [ portuguese_brazilian ] = "Tabelle verändert" ;
    Text [ swedish ] = "Tabell ändrad" ;
    Text [ danish ] = "Tabel ændret" ;
    Text [ italian ] = "Tabella modificata" ;
    Text [ spanish ] = "Tabla modificada" ;
    Text [ french ] = "Tableau modifié" ;
    Text [ dutch ] = "Tabel veranderd" ;
    Text[ chinese_simplified ] = "±í¸ñÒѱ»¸ü¸Ä";
    Text[ russian ] = "Òàáëèöà èçìåíåíà";
    Text[ polish ] = "Tabela zmieniona";
    Text[ japanese ] = "•\\‚͕ύX‚³‚ê‚Ä‚¢‚Ü‚·";
    Text[ chinese_traditional ] = "ªí®æ¤w³QÅܧó";
    Text[ arabic ] = "ÊÛííÑ ÇáÌÏæá";
    Text[ dutch ] = "Tabel veranderd";
    Text[ chinese_simplified ] = "±í¸ñÒѱ»¸ü¸Ä";
    Text[ greek ] = "¸÷ïõí ãßíåé áëëáãÝò óôïí ðßíáêá";
    Text[ korean ] = "Ç¥°¡ ¹Ù²î¾ú½À´Ï´Ù.";
    Text[ turkish ] = "Tablo deðiþtirildi";
    Text[ language_user1 ] = " ";
};
String STR_REDLINE_FMTCOLL
{
    Text = "Absatzvorlage gesetzt" ;
    Text [ english ] = "Paragraph Styles set" ;
    Text[ italian ] = "Modello di paragrafo impostato";
    Text[ portuguese_brazilian ] = "Paragraph Styles set";
    Text[ portuguese ] = "Estilo de parágrafo definido";
    Text[ danish ] = "Afsnitstypografi defineret";
    Text[ french ] = "Le style de paragraphe a été défini";
    Text[ swedish ] = "Styckeformatmall definierad";
    Text[ dutch ] = "Alinea-opmaakprofiel gedefinieerd";
    Text[ spanish ] = "Aplicado estilo de párrafo";
    Text[ english_us ] = "Applied Paragraph Styles";
    Text[ chinese_simplified ] = "É趨¶ÎÂäÑùʽ";
    Text[ russian ] = "Óñòàíîâëåíû ñòèëè àáçàöåâ";
    Text[ polish ] = "Ustaw styl akapitu";
    Text[ japanese ] = "’i—޽À²Ù‚̐ݒè";
    Text[ chinese_traditional ] = "³]©w¬q¸¨¼Ë¦¡";
    Text[ arabic ] = "ÊÚííä äãØ ÇáÝÞÑÉ";
    Text[ dutch ] = "Alinea-opmaakprofiel gedefinieerd";
    Text[ chinese_simplified ] = "É趨¶ÎÂäÑùʽ";
    Text[ greek ] = "Êáèïñßóôçêå ðñüôõðï ðáñáãñÜöïõ";
    Text[ korean ] = "´Ü¶ô À¯Çü ÁýÇÕ";
    Text[ turkish ] = "Paragraf þablonu belirlendi";
    Text[ language_user1 ] = " ";
};
String STR_ENDNOTE
{
    Text = "Endnote: " ;
    Text [ ENGLISH ] = "Endnote: " ;
    Text [ portuguese ] = "Nota final: " ;
    Text [ english_us ] = "Endnote: " ;
    Text [ portuguese_brazilian ] = "Endnote: " ;
    Text [ swedish ] = "Slutnot:  " ;
    Text [ danish ] = "Slutnote: " ;
    Text [ italian ] = "Nota di chiusura: " ;
    Text [ spanish ] = "Nota final:  " ;
    Text [ french ] = "Note de fin : " ;
    Text [ dutch ] = "Eindnoot:   " ;
    Text[ chinese_simplified ] = "βע: ";
    Text[ russian ] = "Êîíöåâàÿ ñíîñêà:  ";
    Text[ polish ] = "Przypis koñcowy:  ";
    Text[ japanese ] = "•¶––‹r’: ";
    Text[ chinese_traditional ] = "§Àª`: ";
    Text[ arabic ] = "ÊÚáíÞÇÊ ÎÊÇãíÉ: ";
    Text[ dutch ] = "Eindnoot:   ";
    Text[ chinese_simplified ] = "βע: ";
    Text[ greek ] = "Óçìåßùóç ôÝëïõò: ";
    Text[ korean ] = "¹ÌÁÖ: ";
    Text[ turkish ] = "Son not: ";
    Text[ language_user1 ] = " ";
};
String STR_FTNNOTE
{
    Text = "Fußnote: " ;
    Text [ ENGLISH ] = "Footnote: " ;
    Text [ portuguese ] = "Nota de rodapé: " ;
    Text [ english_us ] = "Footnote: " ;
    Text [ portuguese_brazilian ] = "Fußnote: " ;
    Text [ swedish ] = "Fotnot:  " ;
    Text [ danish ] = "Fodnote: " ;
    Text [ italian ] = "Nota a piè pagina: " ;
    Text [ spanish ] = "Nota al pie:  " ;
    Text [ french ] = "Note de bas de page : " ;
    Text [ dutch ] = "Voetnoot:  " ;
    Text[ chinese_simplified ] = "×¢½Å: ";
    Text[ russian ] = "Ñíîñêà:  ";
    Text[ polish ] = "Przypis dolny:   ";
    Text[ japanese ] = "‹r’: ";
    Text[ chinese_traditional ] = "µù¸}: ";
    Text[ arabic ] = "ÍæÇÔí ÓÝáíÉ: ";
    Text[ dutch ] = "Voetnoot:  ";
    Text[ chinese_simplified ] = "×¢½Å: ";
    Text[ greek ] = "Õðïóçìåßùóç: ";
    Text[ korean ] = "°¢ÁÖ: ";
    Text[ turkish ] = "Dipnot: ";
    Text[ language_user1 ] = " ";
};

InfoBox MSG_READONLY_CONTENT
{
    MESSAGE = "Die Schreibmarke oder Selektion befindet sich an einer geschützten Position.\nEine Änderung kann deshalb nicht akzeptiert werden.";
    MESSAGE [ English ] = "Readonly content may not be changed." ;
    MESSAGE[ english_us ] = "Readonly content cannot be changed.\nNo modifications will be accepted";
    MESSAGE[ portuguese ] = "A selecção encontra-se numa posição protegida.\nImpossível qualquer modificação.";
    MESSAGE[ russian ] = "Ìåòêà çàïèñè èëè âûäàëåíèå íàõîäèòñÿ â çàùèùåííîé ïîçèöèè.\nÏîýòîìó èçìåíåíèÿ íå ïðèíèìàþòñÿ.";
    MESSAGE[ dutch ] = "De cursor of de selectie bevindt zich op een schrijfbeveiligde positie.\nDe inhoud kan daarom niet worden gewijzigd.";
    MESSAGE[ french ] = "Le contenu du signet ou de la sélection est en lecture seule.\nAucune modification permise.";
    MESSAGE[ spanish ] = "La marca o selección se encuentra en una posición protegida.\nPor ello no se puede aceptar una modificación.";
    MESSAGE[ italian ] = "La selezione si trova in una posizione protetta. \nPertanto non è possibile accettare nessuna modifica.";
    MESSAGE[ danish ] = "Markøren befinder sig på en skrivebeskyttet position.\nÆndringer kan derfor ikke accepteres.";
    MESSAGE[ swedish ] = "Markören eller markering befinner sig i en skrivskyddad position.\nEn ändring kan därför ej accepteras.";
    MESSAGE[ polish ] = "Znacznik zapisu lub selekcji znajduje siê na chronionej pozycji.\nZmiany nie mo¿na zaakceptowaæ.";
    MESSAGE[ portuguese_brazilian ] = "Readonly content may not be changed.";
    MESSAGE[ japanese ] = "‚±‚͈͓̔͂ǂݎæ‚èê—p‚Å‚·B“à—e‚̕ύX‚͂ł«‚Ü‚¹‚ñB";
    MESSAGE[ chinese_simplified ] = "ÊäÈë¹â±ê»òÑ¡ÖеÈÄÚÈÝÊÇÒ»¸öÊܱ£»¤µÄ¡£\nÎÞ·¨¸ü¸Ä·À¸²Ð´µÄÄÚÈÝ¡£";
    MESSAGE[ chinese_traditional ] = "¿é¤J¥ú¼Ð©Î¿ï¨úªº¦ì¸m¬O¨ü«OÅ@ªº¡C\nµLªk­×§ï¨¾Âмgªº¤º®e¡C";
    MESSAGE[ arabic ] = "ÊÞÚ ÚáÇãÉ ÇáßÊÇÈÉ Ãæ ÇáÊÍÏíÏ Ýí ãæÖÚ ãÍãí ÖÏ ÇáßÊÇÈÉ.\náåÐÇ áÇ íãßä ÞÈæá ÃíÉ ÊÛííÑÇÊ.";
    MESSAGE[ dutch ] = "De cursor of de selectie bevindt zich op een schrijfbeveiligde positie.\nDe inhoud kan daarom niet worden gewijzigd.";
    MESSAGE[ chinese_simplified ] = "ÊäÈë¹â±ê»òÑ¡ÖеÈÄÚÈÝÊÇÒ»¸öÊܱ£»¤µÄ¡£\nÎÞ·¨¸ü¸Ä·À¸²Ð´µÄÄÚÈÝ¡£";
    MESSAGE[ greek ] = "Ç óÞìáíóç åããñáöÞò Þ ç åðéëïãÞ âñßóêåôáé óå ìßá ðñïóôáôåõüìåíç èÝóç.\nÃé áõôü ôï ëüãï äåí ìðïñïýí íá ãßíïõí äåêôÝò ïðïéåóäÞðïôå ôñïðïðïéÞóåéò.";
    MESSAGE[ korean ] = "Àбâ Àü¿ë ³»¿ëÀº º¯°æµÉ ¼ö ¾ø½À´Ï´Ù.\n¼öÁ¤Àº Çã¿ëµÉ ¼ö ¾ø½À´Ï´Ù.";
    MESSAGE[ turkish ] = "Salt okunur bir içerik deðiþtirilemez.\nYapýlan deðiþiklikler nu nedenle kabul edilmeyecek.";
    MESSAGE[ language_user1 ] = " ";
};

diff --git a/sw/source/ui/docvw/edtdd.cxx b/sw/source/ui/docvw/edtdd.cxx
new file mode 100644
index 0000000..4b6c902
--- /dev/null
+++ b/sw/source/ui/docvw/edtdd.cxx
@@ -0,0 +1,787 @@
/*************************************************************************
 *
 *  $RCSfile: edtdd.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:35 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif


#ifndef _SVDVIEW_HXX //autogen
#include <svx/svdview.hxx>
#endif
#ifndef _OUTLINER_HXX //autogen
#include <svx/outliner.hxx>
#endif
#ifndef _SVDVMARK_HXX //autogen
#include <svx/svdvmark.hxx>
#endif
#ifndef _SVDOBJ_HXX //autogen
#include <svx/svdobj.hxx>
#endif
#ifndef _SOT_EXCHANGE_HXX //autogen
#include <sot/exchange.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _SOT_FORMATS_HXX //autogen
#include <sot/formats.hxx>
#endif


#ifndef _FMTURL_HXX //autogen
#include <fmturl.hxx>
#endif
#ifndef _FRMFMT_HXX
#include <frmfmt.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _EDTWIN_HXX
#include <edtwin.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _VIEWOPT_HXX
#include <viewopt.hxx>
#endif
#ifndef _DATAEX_HXX
#include <dataex.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _SWWDOCSH_HXX //autogen
#include <wdocsh.hxx>
#endif
#ifndef _SWUNDO_HXX
#include <swundo.hxx>
#endif


extern BOOL bNoInterrupt;
extern BOOL bFrmDrag;
extern BOOL bDDTimerStarted;

static BOOL bDroped = FALSE;
BOOL bExecuteDrag = FALSE;

void SwEditWin::StartDDTimer()
{
    aTimer.SetTimeoutHdl(LINK(this, SwEditWin, DDHandler));
    aTimer.SetTimeout(480);
    aTimer.Start();
    bDDTimerStarted = TRUE;
}


void SwEditWin::StopDDTimer(SwWrtShell *pSh, const Point &rPt)
{
    aTimer.Stop();
    bDDTimerStarted = FALSE;
    if(!pSh->IsSelFrmMode())
        (pSh->*pSh->fnSetCrsr)(&rPt,FALSE);
    aTimer.SetTimeoutHdl(LINK(this,SwEditWin, TimerHandler));
}


void SwEditWin::StartExecuteDrag()
{
    if( !bExecuteDrag || bIsInDrag )
        return;

    bDroped = FALSE;
    bIsInDrag = TRUE;

    SwWrtShell *pSh = &rView.GetWrtShell();

    BOOL bOldIdle = pSh->GetViewOptions()->IsIdle();
    ((SwViewOption *)pSh->GetViewOptions())->SetIdle(FALSE);

    if( pSh->IsSelFrmMode() )
        pSh->ShowCrsr();

    DropAction eAction;
#ifdef MAC
    const Region aRegion( pSh->GetCrsrRegion() );
#endif

    //Object bereits hier auf den Stack legen, weil es sich im DTor aus dem
    //SwView austragen wurde und deshalb hinter dem else-Scope nicht mehr
    //erreichbar waere.
    SwDataExchangeRef aRef( new SwDataExchange( rView.GetWrtShell() ) );
    SW_MOD()->pDragDrop = aRef;
    aRef->Copy( TRUE );

    DBG_TRACE("SW: Vor ExecuteDrag" );

    // JP 02.10.96: aus ReadOnly-Docs darf nichts gemovt werden!
    // JP 19.01.99: aus ReadOnly-Docs darf eigentlich nur kopiert werden!
    USHORT nDragOptions = DRAG_ALL;
    if( ( rView.GetDocShell() && rView.GetDocShell()->IsReadOnly() ) ||
        rView.GetWrtShell().HasReadonlySel() )
        nDragOptions = DRAG_COPYABLE;

    eAction = aRef->ExecuteDrag( this, Pointer( POINTER_MOVEDATA ),
                                       Pointer( POINTER_COPYDATA ),
                                       nDragOptions
#ifdef MAC
                                        , &aRegion
#endif
                                        );

    DBG_TRACE("SW: Nach ExecuteDrag" );

    //Und noch die letzten Nacharbeiten damit alle Stati stimmen.
    if ( eAction == DROP_MOVE || eAction == DROP_DISCARD )
    {
        if ( !bDroped )
        {
            //Es wurde auserhalb des Writers gedroped. Wir muessen noch
            //loeschen.

            pSh->StartAllAction();
            pSh->StartUndo( UIUNDO_DRAG_AND_MOVE );
            if ( pSh->IsTableMode() )
                pSh->DeleteTblSel();
            else
            {
                if ( !(pSh->IsSelFrmMode() || pSh->IsObjSelected()) )
                    //SmartCut, eines der Blanks mitnehmen.
                    pSh->IntelligentCut( pSh->GetSelectionType(), TRUE );
                pSh->DelRight();
            }
            pSh->EndUndo( UIUNDO_DRAG_AND_MOVE );
            pSh->EndAllAction();
        }
        else
        {
            const int nSelection = pSh->GetSelectionType();
            if( ( SwWrtShell::SEL_FRM | SwWrtShell::SEL_GRF |
                 SwWrtShell::SEL_OLE | SwWrtShell::SEL_DRW ) & nSelection )
            {
                pSh->EnterSelFrmMode();
            }
        }
    }
    if ( pSh->IsSelFrmMode() )
        pSh->HideCrsr();
    else if ( DROP_NONE != eAction )
        pSh->ShowCrsr();
    else
    {
        //Muss wohl sein weil gescrollt wurde und ?...?
        pSh->StartAction();
        pSh->EndAction();
    }
    aTimer.SetTimeoutHdl( LINK(this,SwEditWin, TimerHandler) );
    ((SwViewOption *)pSh->GetViewOptions())->SetIdle(bOldIdle);
    bIsInDrag = FALSE;

    DBG_TRACE("SW: Fertig mit D&D" );
}


void SwEditWin::DropCleanup()
{
    SwWrtShell &rSh =  rView.GetWrtShell();

    // Stati zuruecksetzen
    bNoInterrupt = FALSE;
    if ( bOldIdleSet )
    {
        ((SwViewOption*)rSh.GetViewOptions())->SetIdle( bOldIdle );
        bOldIdleSet = FALSE;
    }
    if ( pUserMarker )
        CleanupDropUserMarker();
    else
        rSh.UnSetVisCrsr();

}

void SwEditWin::CleanupDropUserMarker()
{
    if ( pUserMarker )
    {
        delete pUserMarker, pUserMarker = 0;
        pUserMarkerObj = 0;
    }
}


//Messehack (MA,MBA)
void lcl_SelectShellForDrop( SwView &rView )
{
    if ( !rView.GetCurShell() )
        rView.SelectShell();
}

BOOL SwEditWin::Drop( const DropEvent& rEvt )
{
    ::lcl_SelectShellForDrop( GetView() );
    DropCleanup();

    //Ein Drop auf eine offene OutlinerView geht uns nichts an (siehe auch QueryDrop)
    SwWrtShell &rSh = rView.GetWrtShell();
    SdrObject *pObj = 0;
    const Point aDocPt( PixelToLogic( rEvt.GetPosPixel() ) );
    rSh.GetObjCntType( aDocPt, pObj );
    if( pObj )
    {
        OutlinerView* pOLV = rSh.GetDrawView()->GetTextEditOutlinerView();
        if ( pOLV )
        {
            Rectangle aRect( pOLV->GetOutputArea() );
            aRect.Union( pObj->GetLogicRect() );
            const Point aPos = pOLV->GetWindow()->PixelToLogic(rEvt.GetPosPixel());
            if ( aRect.IsInside(aPos) )
            {
                rSh.StartAllAction();
                BOOL bRet = pOLV->Drop( rEvt );
                rSh.EndAllAction();
                return bRet;
            }
        }
    }

    BOOL bRet = rEvt.GetData() &&
                0 != SwDataExchange::PasteData( *rEvt.GetData(), rSh,
                                                nDropAction, nDropFormat,
                                                nDropDestination, &rEvt );

    if ( bRet )
    {
        if ( SW_MOD()->pDragDrop )
            bDroped = TRUE;         //Bei internem D&D nicht mehr aufraeumen!
    }
    else
        bRet = OFF_APP()->Drop( (DropEvent&)rEvt );
    return bRet;
}


BOOL SwEditWin::QueryDrop( DropEvent& rEvt )
{
    if ( rEvt.IsLeaveWindow() )
    {
        DropCleanup();
        return TRUE;
    }

    if(rView.GetDocShell()->IsReadOnly())
        return FALSE;

    SwWrtShell &rSh = rView.GetWrtShell();

    //Ein bischen scrollen?
    Point aPixPt( rEvt.GetPosPixel() );
    Point aPoint;
    Rectangle aWin( aPoint, GetOutputSizePixel() );
    Rectangle aWin2( aWin );
    aWin.Left()  += 10;
    aWin.Top()   += 10;
    aWin.Right() -= 10;
    aWin.Bottom()-= 10;

    if ( !aWin.IsInside( aPixPt ) )
    {
        if ( !bOldIdleSet )
        {
            bOldIdle = rSh.GetViewOptions()->IsIdle();
            ((SwViewOption *)rSh.GetViewOptions())->SetIdle(FALSE);
            bOldIdleSet = TRUE;
        }
        CleanupDropUserMarker();

        aWin2.Left()  += 5;
        aWin2.Top()   += 5;
        aWin2.Right() -= 5;
        aWin2.Bottom()-= 5;

        long x = 0;
        if ( aPixPt.Y() < aWin2.Top() )
            x = aPixPt.Y() = -5;
        else if ( aPixPt.Y() > aWin2.Bottom() )
            x = aPixPt.Y() += 10;
        if ( aPixPt.X() < aWin2.Left() )
            x = aPixPt.X() = -5;
        else if ( aPixPt.X() > aWin2.Right() )
            x = aPixPt.X() += 10;
        Point aDocPt( PixelToLogic( aPixPt ) );
        aDocPt = rSh.GetCntntPos( aDocPt, x > 0 );
        rSh.SwCrsrShell::SetVisCrsr( aDocPt );
        return TRUE;
    }

    if ( bOldIdleSet )
    {
        ((SwViewOption *)rSh.GetViewOptions())->SetIdle( bOldIdle );
        bOldIdleSet = FALSE;
    }

    //Drop auf Selektion ist nicht statthaft.
    //JP 19.01.99: Drop in geschuetzte Bereiche ist nicht statthaft
    const Point aDocPt( PixelToLogic( aPixPt ) );
    if( rSh.ChgCurrPam( aDocPt ) || rSh.IsOverReadOnlyPos( aDocPt ) )
        return FALSE;

    //Auf was wollen wir denn gerade droppen?
    nDropDestination = 0;

    BOOL bDropCursor = TRUE;    //UserMarker oder DropCursor anzeigen.

    SdrObject *pObj = NULL;
    const ObjCntType eType = rSh.GetObjCntType( aDocPt, pObj );

    //Drop auf OutlinerView (TextEdit im Drawing) soll diese selbst entscheiden!
    if ( pObj )
    {
        OutlinerView* pOLV = rSh.GetDrawView()->GetTextEditOutlinerView();
        if ( pOLV )
        {
            Rectangle aRect( pOLV->GetOutputArea() );
            aRect.Union( pObj->GetLogicRect() );
            const Point aPos = pOLV->GetWindow()->PixelToLogic(aPixPt);
            if ( aRect.IsInside(aPos) )
                return pOLV->QueryDrop( rEvt );
        }
    }

    //Sonst etwas aus der DrawingEngine getroffen?
    if ( OBJCNT_NONE != eType )
    {
        switch ( eType )
        {
            case OBJCNT_GRF:
                {
                    BOOL bLink,
                         bIMap = 0 != rSh.GetFmtFromObj( aDocPt )->GetURL().GetMap();
                    String aDummy;
                    rSh.GetGrfAtPos( aDocPt, aDummy, bLink );
                    if ( bLink && bIMap )
                        nDropDestination = EXCHG_DEST_DOC_LNKD_GRAPH_W_IMAP;
                    else if ( bLink )
                        nDropDestination = EXCHG_DEST_DOC_LNKD_GRAPHOBJ;
                    else if ( bIMap )
                        nDropDestination = EXCHG_DEST_DOC_GRAPH_W_IMAP;
                    else
                        nDropDestination = EXCHG_DEST_DOC_GRAPHOBJ;
                }
                break;
            case OBJCNT_FLY:
                if( rSh.GetView().GetDocShell()->ISA(SwWebDocShell) )
                    nDropDestination = EXCHG_DEST_DOC_TEXTFRAME_WEB;
                else
                    nDropDestination = EXCHG_DEST_DOC_TEXTFRAME;
                break;
            case OBJCNT_OLE:        nDropDestination = EXCHG_DEST_DOC_OLEOBJ; break;
            case OBJCNT_CONTROL:    /* no Action avail */
            case OBJCNT_SIMPLE:     nDropDestination = EXCHG_DEST_DOC_DRAWOBJ; break;
            case OBJCNT_URLBUTTON:  nDropDestination = EXCHG_DEST_DOC_URLBUTTON; break;
            case OBJCNT_GROUPOBJ:   nDropDestination = EXCHG_DEST_DOC_GROUPOBJ;     break;

            default: ASSERT( !this, "new ObjectType?" );
        }
    }
    if ( !nDropDestination )
    {
/*
JP 13.07.98: Bug 52637: es wird ein URL-Feld erkannt also werden nur die
                        Inhalte zugelassen. Das ist aber bestimmt nicht das
                        gewollte.
        SwContentAtPos aCntntAtPos( SwContentAtPos::SW_INETATTR );
        if ( rSh.GetContentAtPos( aDocPt, aCntntAtPos, FALSE ) )
            nDropDestination = EXCHG_DEST_DOC_URLFIELD;
        else
*/
        if( rSh.GetView().GetDocShell()->ISA(SwWebDocShell) )
            nDropDestination = EXCHG_DEST_SWDOC_FREE_AREA_WEB;
        else
            nDropDestination = EXCHG_DEST_SWDOC_FREE_AREA;

    }
    else
        bDropCursor = FALSE;

    USHORT nEventAction, nUserOpt = EXCHG_IN_ACTION_DEFAULT;
    if( !rEvt.IsDefaultAction() )
        nUserOpt = rEvt.GetAction();

    nDropAction = SotExchange::GetExchangeAction( *rEvt.GetData(),
                                nDropDestination, rEvt.GetSourceOptions(),
                                nUserOpt, nDropFormat, nEventAction );

    BOOL bRet = TRUE;
    if( EXCHG_INOUT_ACTION_NONE != nDropAction )
    {
        //Bei den default Aktionen wollen wir noch ein bischen mitreden.
        SwModule *pMod = SW_MOD();
        if ( pMod->pDragDrop )
        {
            BOOL bCleanup = FALSE;
            //Zeichenobjekte in Kopf-/Fusszeilen sind nicht erlaubt
            SwWrtShell *pSrcSh = pMod->pDragDrop->GetShell();
            if( (pSrcSh->GetSelFrmType() == FRMTYPE_DRAWOBJ) &&
                 (rSh.GetFrmType( &aDocPt, FALSE ) & (FRMTYPE_HEADER|FRMTYPE_FOOTER)) )
            {
                bCleanup = TRUE;
            }
            // keine positionsgeschuetzten Objecte verschieben!
            else if( DROP_MOVE == rEvt.GetAction() &&
                     pSrcSh->IsSelObjProtected( FLYPROTECT_POS ) )
            {
                bCleanup = TRUE;
            }
            else if( rEvt.IsDefaultAction() )
            {
                // JP 13.08.98: internes Drag&Drop: bei gleichem Doc ein Move
                //              ansonten ein Copy - Task 54974
                nEventAction = pSrcSh->GetDoc() == rSh.GetDoc()
                                    ? DROP_MOVE
                                    : DROP_COPY;
            }
            if ( bCleanup )
            {
                CleanupDropUserMarker();
                rSh.UnSetVisCrsr();
                return FALSE;
            }
        }
        else
        {
            //D&D von ausserhalb des SW soll per default ein Copy sein.
            if( EXCHG_IN_ACTION_DEFAULT == nEventAction &&
                DROP_MOVE == rEvt.GetAction() )
                nEventAction = DROP_COPY;

            if( (SOT_FORMATSTR_ID_SBA_FIELDDATAEXCHANGE == nDropFormat &&
                 EXCHG_IN_ACTION_LINK != nDropAction) ||
                 SOT_FORMATSTR_ID_SBA_CTRLDATAEXCHANGE == nDropFormat )
            {
                SdrMarkView* pMView = PTR_CAST( SdrMarkView, rSh.GetDrawView() );
                if( pMView && !pMView->IsDesignMode() )
                    return FALSE;
            }

        }

        if ( EXCHG_IN_ACTION_DEFAULT != nEventAction )
            rEvt.SetAction( (DropAction)nEventAction );

        if ( bDropCursor )
        {
            CleanupDropUserMarker();
            rSh.SwCrsrShell::SetVisCrsr( aDocPt );
        }
        else
        {
            rSh.UnSetVisCrsr();
            if ( !pUserMarker )
                pUserMarker = new SdrViewUserMarker( rSh.GetDrawView() );
            if ( pUserMarkerObj != pObj )
            {
                pUserMarkerObj = pObj;
                pUserMarker->SetXPolyPolygon( pUserMarkerObj,
                    rSh.GetDrawView()->GetPageView(
                            rSh.GetDrawView()->GetModel()->GetPage(0)));
                pUserMarker->Show();
            }
        }
        return TRUE;
    }

    CleanupDropUserMarker();
    rSh.UnSetVisCrsr();
    return OFF_APP()->QueryDrop( rEvt );
}


IMPL_LINK( SwEditWin, DDHandler, Timer *, EMPTYARG )
{
    bDDTimerStarted = FALSE;
    aTimer.Stop();
    aTimer.SetTimeout(240);
    bMBPressed = FALSE;
    ReleaseMouse();
    bFrmDrag = FALSE;

    if ( rView.GetViewFrame() && rView.GetViewFrame()->GetFrame()  &&
         !rView.GetViewFrame()->GetFrame()->TransferForReplaceInProgress() )
    {
        bExecuteDrag = TRUE;
        StartExecuteDrag();
    }
    return 0;
}


/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.174  2000/09/18 16:05:23  willem.vandorp
    OpenOffice header added.

    Revision 1.173  1999/05/11 19:50:40  JP
    Task #66127#: Methoden rund ums Lineal verbessert und Schnittstellen veraendert/erweitert


      Rev 1.172   11 May 1999 21:50:40   JP
   Task #66127#: Methoden rund ums Lineal verbessert und Schnittstellen veraendert/erweitert

      Rev 1.171   25 Jan 1999 16:11:42   JP
   Bug #61109#: QueryDrop - DropModifier nicht ueberbuegeln

      Rev 1.170   19 Jan 1999 22:57:28   JP
   Task #58677#: Crsr in Readonly Bereichen zulassen

      Rev 1.169   11 Dec 1998 11:46:02   JP
   Task #58217#: WebDocShell als D&D Ziel erkennen

      Rev 1.168   27 Nov 1998 14:50:42   AMA
   Fix #59951#59825#: Unterscheiden zwischen Rahmen-,Seiten- und Bereichsspalten

      Rev 1.167   17 Nov 1998 22:17:06   JP
   Task #59398#: ClipboardId Umstellungen

      Rev 1.166   12 Nov 1998 13:31:08   JP
   Task #59398# Umstellung von SotFormatStringId

      Rev 1.165   02 Sep 1998 12:10:46   MA
   #55895# ctrldataexchange

      Rev 1.164   13 Aug 1998 14:20:14   JP
   Bug #54974# QueryDrop - bei DefaultAction per internem Format im eigenen Doc immer move, sonst copy

      Rev 1.163   16 Jul 1998 19:21:22   JP
   Bug #53113# DatenbankControls nur im DesignModus einfuegen

      Rev 1.162   08 Jul 1998 14:17:32   JP
   das richtige define fuer supd benutzen

      Rev 1.161   08 Jul 1998 12:24:36   JP
   neues Drag&Drop ab Version 5.0

      Rev 1.160   04 Jul 1998 16:06:24   JP
   Umstellung auf Tabelle weiergemacht

      Rev 1.159   27 Jun 1998 18:44:00   JP
   Umstellung auf Tabelle weitergemacht

      Rev 1.158   25 Jun 1998 14:12:50   JP
   SvDataObject -> SotObject

      Rev 1.157   16 Jun 1998 17:14:42   OM
   #51085# Draw-Objekte nicht auf die Wiese droppen

      Rev 1.156   16 Jun 1998 16:35:44   OM
   #51085# Draw-Objekte nicht auf die Wiese droppen

      Rev 1.155   09 Jun 1998 15:31:32   OM
   VC-Controls entfernt

      Rev 1.154   27 Apr 1998 21:15:26   JP
   Bug #49842#: Drop - bei Grafiken den FileNamen in eine URL wandeln

      Rev 1.153   31 Mar 1998 17:30:22   MA
   erstmal abgebrochen, neues DD

      Rev 1.152   26 Mar 1998 18:02:54   MA
   ein paar vorb. D&D

      Rev 1.151   20 Feb 1998 16:18:20   MA
   headerfiles gewandert

      Rev 1.150   19 Feb 1998 08:53:20   OK
   NEW: include mieclip.hxx

      Rev 1.149   07 Jan 1998 18:46:26   MIB
   5.0 Fileformat

      Rev 1.148   28 Nov 1997 18:02:26   MA
   includes

      Rev 1.147   25 Nov 1997 10:33:00   MA
   includes

      Rev 1.146   22 Oct 1997 16:04:52   OM
   Farbendrop

      Rev 1.145   17 Oct 1997 13:24:02   JP
   neu: MSE40-HTML-Format erkennen/lesen

      Rev 1.144   15 Oct 1997 14:03:44   OS
   lcl_SelectShellForDrop - SelectShell() nur bei Bedarf rufen #44690#

      Rev 1.143   17 Sep 1997 11:26:04   MA
   #43801# precedence nicht beachtet

      Rev 1.142   17 Sep 1997 09:57:22   OS
   Nummer 3: pSdrView pruefen!

      Rev 1.141   10 Sep 1997 10:50:08   JP
   neu: Undo fuers kopieren von Tabellen & in Tabellen

      Rev 1.140   08 Sep 1997 11:02:36   MA
   includes

      Rev 1.139   05 Sep 1997 13:10:48   OM
   #42027# D&D auf DrawText-Objekte

      Rev 1.138   02 Sep 1997 13:20:48   OS
   includes

      Rev 1.137   01 Sep 1997 13:15:38   OS
   DLL-Umstellung

      Rev 1.136   28 Aug 1997 10:29:56   JP
   Bug #42430#: Drop - bei INetAttr. den SourceCursor auf das Attribut setzen

      Rev 1.135   15 Aug 1997 12:09:54   OS
   chartar/frmatr/txtatr aufgeteilt

      Rev 1.134   11 Aug 1997 20:06:16   HJS
   includes

      Rev 1.133   11 Aug 1997 10:08:40   MH
   chg: header

      Rev 1.132   17 Jul 1997 19:06:32   MA
   #41801# File zur absoluten URL verarbeiten

      Rev 1.131   19 Jun 1997 11:38:52   MA
   #40833# Drop_Link, sdw nicht einfuegen bei sw/web

      Rev 1.130   09 Jun 1997 20:08:48   JP
   SwFilterNms/SwFilterNm entfernt

      Rev 1.129   29 May 1997 14:31:14   MA
   fix: Grafik nur verknuepft fuer WebDocShell

      Rev 1.128   16 May 1997 15:07:42   MH
   add: defines wg. CLOOKS

      Rev 1.127   25 Apr 1997 13:00:46   MA
   #39306# ggf. den UserMarker loeschen

      Rev 1.126   14 Apr 1997 17:25:00   MH
   add: header

      Rev 1.125   10 Apr 1997 16:05:18   TRI
   includes

      Rev 1.124   08 Apr 1997 10:31:46   OM
   Fehlende Includes

      Rev 1.123   08 Apr 1997 09:55:34   NF
   includes...

      Rev 1.122   21 Mar 1997 13:53:18   MA
   #36900# D&D offset beseitigt

      Rev 1.121   16 Mar 1997 13:44:16   MA
   fix: Kein D&D wenn der Frame schon klinisch tot ist

      Rev 1.120   07 Mar 1997 09:47:24   MA
   Neue D&D Moeglichkeiten, Handling verbessert

      Rev 1.119   23 Feb 1997 22:03:10   MA
   fix: Drop von Grafik auf Grafik reanimiert

      Rev 1.118   07 Feb 1997 12:05:44   OS
   Navigator benutzt eigenes Drag-Format

      Rev 1.117   05 Feb 1997 19:13:18   JP
   ExcuteDrag: Modus der WrtShell setzen, wenn Flys selektiert sind

      Rev 1.116   19 Dec 1996 16:12:18   MA
   fix: Crsr wieder umschalten

      Rev 1.115   28 Nov 1996 14:20:06   MA
   fix: Drop per Link auch bei einem File

      Rev 1.114   20 Nov 1996 16:58:42   MA
   #33444# QueryDrop, Pos fuer Objekte anpassen

      Rev 1.113   18 Oct 1996 16:57:56   MA
   Messehack: eine hoffentlich kurzlebige Freundschaft

      Rev 1.112   15 Oct 1996 12:14:20   MA
   new: Drawing per Clipboard

      Rev 1.111   02 Oct 1996 13:50:52   JP
   StartExecuteDrag: aus ReadOnly-Docs darf nur kopiert werden!

      Rev 1.110   16 Sep 1996 14:00:58   JP
   Drop: INetBookmark am URL-Button setzen

-------------------------------------------------------------------------*/

diff --git a/sw/source/ui/docvw/edtwin.cxx b/sw/source/ui/docvw/edtwin.cxx
new file mode 100644
index 0000000..7afe4e3
--- /dev/null
+++ b/sw/source/ui/docvw/edtwin.cxx
@@ -0,0 +1,4222 @@
/*************************************************************************
 *
 *  $RCSfile: edtwin.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:35 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include <tools/list.hxx>

#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _SV_HELP_HXX //autogen
#include <vcl/help.hxx>
#endif
#ifndef _SV_GRAPH_HXX //autogen
#include <vcl/graph.hxx>
#endif
#ifndef _SV_MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SV_KEYCODES_HXX //autogen
#include <vcl/keycodes.hxx>
#endif
#ifndef _VCL_CMDEVT_HXX //autogen
#include <vcl/cmdevt.hxx>
#endif
#ifndef _VCL_CMDEVT_HXX //autogen
#include <vcl/cmdevt.hxx>
#endif
#ifndef _VCL_CMDEVT_H //autogen
#include <vcl/cmdevt.h>
#endif
#ifndef _SVSTOR_HXX //autogen
#include <so3/svstor.hxx>
#endif
#ifndef _ARGS_HXX //autogen
#include <svtools/args.hxx>
#endif
#ifndef _SFXMACITEM_HXX //autogen
#include <svtools/macitem.hxx>
#endif
#ifndef __SBX_SBXVARIABLE_HXX //autogen
#include <svtools/sbxvar.hxx>
#endif
#ifndef _SBXCLASS_HXX //autogen
#include <svtools/sbx.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _WORDSEL_HXX
#include <svtools/wordsel.hxx>
#endif
#ifndef _SFXVIEWFRM_HXX //autogen
#include <sfx2/viewfrm.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SFX_BINDINGS_HXX //autogen
#include <sfx2/bindings.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SVDVIEW_HXX //autogen
#include <svx/svdview.hxx>
#endif
#ifndef _SVDVMARK_HXX //autogen
#include <svx/svdvmark.hxx>
#endif
#ifndef _SVDHDL_HXX //autogen
#include <svx/svdhdl.hxx>
#endif
#ifndef _SVDOBJ_HXX //autogen
#include <svx/svdobj.hxx>
#endif
#ifndef _MySVXACORR_HXX //autogen
#include <svx/svxacorr.hxx>
#endif
#ifndef _SVX_LANGITEM_HXX //autogen
#include <svx/langitem.hxx>
#endif
#ifndef _SVX_FLDITEM_HXX
#   ifndef ITEMID_FIELD
#       ifndef _EEITEM_HXX //autogen
#           include <svx/eeitem.hxx>
#       endif
#       define ITEMID_FIELD EE_FEATURE_FIELD  // wird fuer #include <flditem.hxx> benoetigt
#   endif
#   ifndef _SVX_FLDITEM_HXX //autogen
#       include <svx/flditem.hxx>
#   endif
#endif
#ifndef _SVX_COLRITEM_HXX //autogen
#include <svx/colritem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _OUTLINER_HXX //autogen
#include <svx/outliner.hxx>
#endif
#ifndef _SVX_WGHTITEM_HXX //autogen
#include <svx/wghtitem.hxx>
#endif
#ifndef _SVX_UDLNITEM_HXX //autogen
#include <svx/udlnitem.hxx>
#endif
#ifndef _SVX_POSTITEM_HXX //autogen
#include <svx/postitem.hxx>
#endif
#ifndef _SVX_PROTITEM_HXX //autogen
#include <svx/protitem.hxx>
#endif
#ifndef _OFAACCFG_HXX //autogen
#include <offmgr/ofaaccfg.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _SIMDLL0_HXX //autogen
#include <sim2/simdll0.hxx>
#endif
#ifndef _SIMDLL_HXX //autogen
#include <sim2/simdll.hxx>
#endif


#ifndef _EDTWIN_HXX //autogen
#include <edtwin.hxx>
#endif
#ifndef _SWVIEW_HXX //autogen
#include <view.hxx>
#endif
#ifndef _WRTSH_HXX //autogen
#include <wrtsh.hxx>
#endif
#ifndef _FLDBAS_HXX //autogen
#include <fldbas.hxx>
#endif
#ifndef _SWMODULE_HXX //autogen
#include <swmodule.hxx>
#endif
#ifndef _SWDOCSH_HXX //autogen
#include <docsh.hxx>
#endif
#ifndef _VIEWOPT_HXX //autogen
#include <viewopt.hxx>
#endif
#ifndef _SW_DRAWBASE_HXX //autogen
#include <drawbase.hxx>
#endif
#ifndef _SW_DSELECT_HXX //autogen
#include <dselect.hxx>
#endif
#ifndef _SWTEXTSH_HXX //autogen
#include <textsh.hxx>
#endif
#ifndef _SHDWCRSR_HXX
#include <shdwcrsr.hxx>
#endif
#ifndef _FMTANCHR_HXX //autogen
#include <fmtanchr.hxx>
#endif
#ifndef _FMTORNT_HXX //autogen
#include <fmtornt.hxx>
#endif
#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _FMTCLDS_HXX //autogen
#include <fmtclds.hxx>
#endif
#ifndef _FRMFMT_HXX //autogen
#include <frmfmt.hxx>
#endif
#ifndef _MODOPT_HXX //autogen
#include <modcfg.hxx>
#endif
#ifndef _FMTCOL_HXX //autogen
#include <fmtcol.hxx>
#endif
#ifndef _SWWVIEW_HXX //autogen
#include <wview.hxx>
#endif
#ifndef _SWLISTSH_HXX //autogen
#include <listsh.hxx>
#endif
#ifndef _GLOSLST_HXX //autogen
#include <gloslst.hxx>
#endif
#ifndef SW_INPUTWIN_HXX //autogen
#include <inputwin.hxx>
#endif
#ifndef _GLOSHDL_HXX //autogen
#include <gloshdl.hxx>
#endif
#ifndef _SWUNDO_HXX
#include <swundo.hxx>
#endif
#ifndef _SWDRWTXTSH_HXX //autogen
#include <drwtxtsh.hxx>
#endif
#ifndef _FCHRFMT_HXX //autogen
#include <fchrfmt.hxx>
#endif
#ifndef _ROMENU_HXX
#include <romenu.hxx>
#endif
#ifndef _INITUI_HXX
#include <initui.hxx>
#endif
#ifndef _FRMATR_HXX
#include <frmatr.hxx>
#endif
#ifndef _EXTINPUT_HXX
#include <extinput.hxx>
#endif
#ifndef _ACMPLWRD_HXX
#include <acmplwrd.hxx>
#endif

#ifndef _HELPID_H
#include <helpid.h>
#endif
#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _DOCVW_HRC
#include <docvw.hrc>
#endif


/*--------------------------------------------------------------------
    Beschreibung:   Globals
 --------------------------------------------------------------------*/

extern BOOL bNoInterrupt;       // in mainwn.cxx

//Normalerweise wird im MouseButtonUp eine Selektion aufgehoben wenn die
//Selektion nicht gerade aufgezogen wird. Leider wird im MouseButtonDown
//bei doppel-/dreifach-Klick Selektiert, diese Selektion wird in dem Handler
//komplett abgeschlossen und kann deshalb im Up nicht mehr unterschieden
//werden. Um dies Aufzuloese wird bHoldSelection im Down gesetzt und im
//Up ausgewertet.
static BOOL bHoldSelection      = FALSE;

BOOL bFrmDrag                   = FALSE;
BOOL bValidCrsrPos              = FALSE;
BOOL bModePushed                = FALSE;
BOOL bDDTimerStarted            = FALSE;
BOOL bFlushCharBuffer           = FALSE;
BOOL SwEditWin::bReplaceQuote   = FALSE;
BOOL bDDINetAttr                = FALSE;
SdrHdlKind eSdrMoveHdl          = HDL_USER;

QuickHelpData* SwEditWin::pQuickHlpData = 0;

long    SwEditWin::nDDStartPosY = 0;
long    SwEditWin::nDDStartPosX = 0;
Color   SwEditWin::aTextBackColor(COL_YELLOW);
Color   SwEditWin::aTextColor(COL_RED);
BOOL    SwEditWin::bTransparentBackColor = FALSE; // Hintergrund nicht transparent


extern BOOL     bExecuteDrag;

SfxShell* lcl_GetShellFromDispatcher( SwView& rView, TypeId nType );

DBG_NAME(edithdl);

class SwAnchorMarker
{
    SdrHdl* pHdl;
    Point aLastPos;
public:
    SwAnchorMarker( SdrHdl* pH ) :
        pHdl( pH ), aLastPos( pH->GetPos() ) {}
    const Point& GetLastPos() const { return aLastPos; }
    void SetLastPos( const Point& rNew ) { aLastPos = rNew; }
    void SetPos( const Point& rNew ) { pHdl->SetPos( rNew ); }
};

struct QuickHelpData
{
    SvStringsISortDtor aArr;
    USHORT* pAttrs;
    CommandExtTextInputData* pCETID;
    ULONG nTipId;
    USHORT nLen, nCurArrPos;
    BOOL bClear : 1, bChkInsBlank : 1, bIsTip : 1, bIsAutoText : 1;

    QuickHelpData() : pCETID( 0 ), pAttrs( 0 ) { ClearCntnt(); }

    void Move( QuickHelpData& rCpy );
    void ClearCntnt();
    void Start( SwWrtShell& rSh, USHORT nWrdLen );
    void Stop( SwWrtShell& rSh );

    BOOL HasCntnt() const       { return aArr.Count() && 0 != nLen; }

    void Inc( BOOL bEndLess )
        {
            if( ++nCurArrPos >= aArr.Count() )
                nCurArrPos = (bEndLess && !bIsAutoText )? 0 : nCurArrPos-1;
        }
    void Dec( BOOL bEndLess )
        {
            if( 0 == nCurArrPos-- )
                nCurArrPos = (bEndLess && !bIsAutoText ) ? aArr.Count()-1 : 0;
        }
};


/*--------------------------------------------------------------------
    Beschreibung:   Minimale Bewegung Zittern vermeiden
 --------------------------------------------------------------------*/

#define HIT_PIX  2 /* Hit-Toleranz in Pixel */
#define MIN_MOVE 4

inline BOOL IsMinMove(const Point &rStartPos, const Point &rLPt)
{
    return Abs(rStartPos.X() - rLPt.X()) > MIN_MOVE ||
           Abs(rStartPos.Y() - rLPt.Y()) > MIN_MOVE;
}

/*--------------------------------------------------------------------
    JP 30.07.98: fuer MouseButtonDown - feststellen, ob ein DrawObject
                und KEIN SwgFrame getroffen wurde! Shift/Ctrl sollen
                nur bei DrawObjecte zum Selektieren fuehren, bei SwgFlys
                ggfs zum ausloesen von Hyperlinks (DownLoad/NewWindow!)
 --------------------------------------------------------------------*/
inline BOOL IsDrawObjSelectable( const SwWrtShell& rSh, const Point& rPt )
{
    BOOL bRet = TRUE;
    SdrObject* pObj;
    switch( rSh.GetObjCntType( rPt, pObj ))
    {
    case OBJCNT_NONE:
    case OBJCNT_FLY:
    case OBJCNT_GRF:
    case OBJCNT_OLE:
        bRet = FALSE;
        break;
    }
    return bRet;
}

/*--------------------------------------------------------------------
    Beschreibung:   Pointer umschalten
 --------------------------------------------------------------------*/


void SwEditWin::UpdatePointer(const Point &rLPt, USHORT nModifier )
{
    SwWrtShell &rSh = rView.GetWrtShell();
    if( pApplyTempl )
    {
        PointerStyle eStyle = POINTER_FILL;
        if( rSh.IsOverReadOnlyPos( rLPt ))
        {
            if( pUserMarker )
                DELETEZ( pUserMarker );
//          rSh.SwCrsrShell::UnSetVisCrsr( rLPt );
            eStyle = POINTER_NOTALLOWED;
        }
        else
        {
            SwRect aRect;
            SwRect* pRect = &aRect;
            const SwFrmFmt* pFmt = 0;
            if(!pApplyTempl->nColor &&
                    pApplyTempl->eType == SFX_STYLE_FAMILY_FRAME &&
                        0 !=(pFmt = rSh.GetFmtFromObj( rLPt, &pRect )) &&
                        PTR_CAST(SwFlyFrmFmt, pFmt))
            {
                //Highlight fuer Rahmen anwerfen
                Rectangle aTmp( pRect->SVRect() );
                if ( !pUserMarker )
                    pUserMarker = new SdrViewUserMarker( rSh.GetDrawView() );
                pUserMarker->SetRectangle( aTmp );
                pUserMarker->Show();
            }
            else if(pUserMarker)
                DELETEZ(pUserMarker);
            rSh.SwCrsrShell::SetVisCrsr( rLPt );
        }
        SetPointer( eStyle );
        return;
    }

    if( !rSh.VisArea().Width() )
        return;

    SET_CURR_SHELL(&rSh);

    if ( IsChainMode() )
    {
        SwRect aRect;
        int nChainable = rSh.Chainable( aRect, *rSh.GetFlyFrmFmt(), rLPt );
        PointerStyle eStyle = nChainable
                ? POINTER_CHAIN_NOTALLOWED : POINTER_CHAIN;
        if ( !nChainable )
        {
            Rectangle aTmp( aRect.SVRect() );
            if ( !pUserMarker )
                pUserMarker = new SdrViewUserMarker( rSh.GetDrawView() );
            pUserMarker->SetRectangle( aTmp );
            pUserMarker->Show();
        }
        else
        {
            DELETEZ( pUserMarker );
        }
        rView.GetViewFrame()->ShowStatusText(
                                        SW_RESSTR(STR_CHAIN_OK+nChainable));
        SetPointer( eStyle );
        return;
    }

    BOOL bExecHyperlinks = rSh.GetViewOptions()->IsExecHyperlinks() ^
                           (nModifier == KEY_MOD2 ? TRUE : FALSE);

    SdrView *pSdrView = rSh.GetDrawView();
    BOOL bPrefSdrPointer = FALSE;
    BOOL bHitHandle = FALSE;
    BOOL bCntAtPos = FALSE;
    BOOL bIsDocReadOnly = rView.GetDocShell()->IsReadOnly() &&
                          rSh.IsCrsrReadonly();
    aActHitType = SDRHIT_NONE;
    PointerStyle eStyle = POINTER_TEXT;
    if ( !pSdrView )
        bCntAtPos = TRUE;
    else if ( bHitHandle = pSdrView->HitHandle( rLPt, *(rSh.GetOut())) != 0 )
    {
        aActHitType = SDRHIT_OBJECT;
        bPrefSdrPointer = TRUE;
    }
    else
    {
        const BOOL bNotInSelObj = !rSh.IsInsideSelectedObj( rLPt );
        if ( rView.GetDrawFuncPtr() && !bInsDraw && bNotInSelObj )
        {
            aActHitType = SDRHIT_OBJECT;
            if (GetDrawMode() == SID_OBJECT_SELECT)
                eStyle = POINTER_ARROW;
            else
                bPrefSdrPointer = TRUE;
        }
        else
        {
            SdrObject* pObj; SdrPageView* pPV;
            pSdrView->SetHitTolerancePixel( HIT_PIX );
            if ( bNotInSelObj && bExecHyperlinks &&
                 pSdrView->PickObj( rLPt, pObj, pPV, SDRSEARCH_PICKMACRO ))
            {
                SdrObjMacroHitRec aTmp;
                aTmp.aPos = rLPt;
                aTmp.pPageView = pPV;
                SetPointer( pObj->GetMacroPointer( aTmp ) );
                return;
            }
            else
            {
                if ( rSh.IsObjSelectable( rLPt ) )
                {
                    if (pSdrView->IsTextEdit())
                    {
                        aActHitType = SDRHIT_NONE;
                        bPrefSdrPointer = TRUE;
                    }
                    else
                    {
                        SdrViewEvent aVEvt;
                        SdrHitKind eHit = pSdrView->PickAnything(rLPt, aVEvt);

                        if (eHit == SDRHIT_URLFIELD && bExecHyperlinks)
                        {
                            aActHitType = SDRHIT_OBJECT;
                            bPrefSdrPointer = TRUE;
                        }
                        else
                        {
                            eStyle = POINTER_MOVE;

                            if (!bNotInSelObj)
                            {
                                if (rSh.IsObjSelected() || rSh.IsFrmSelected())
                                {
                                    if (rSh.IsSelObjProtected(FLYPROTECT_POS))
                                        eStyle = POINTER_NOTALLOWED;
                                }
                            }
                            aActHitType = SDRHIT_OBJECT;
                        }
                    }
                }
                else
                {
                    if ( rSh.IsFrmSelected() && !bNotInSelObj )
                    {
                        if (rSh.IsSelObjProtected(FLYPROTECT_SIZE))
                            eStyle = POINTER_NOTALLOWED;
                        else
                            eStyle = POINTER_MOVE;
                        aActHitType = SDRHIT_OBJECT;
                    }
                    else
                    {
                        if ( rView.GetDrawFuncPtr() )
                            bPrefSdrPointer = TRUE;
                        else
                            bCntAtPos = TRUE;
                    }
                }
            }
        }
    }
    if ( bPrefSdrPointer )
    {
        if (bIsDocReadOnly || (rSh.IsObjSelected() && rSh.IsSelObjProtected(FLYPROTECT_CONTENT)))
            SetPointer( POINTER_NOTALLOWED );
        else
        {
            if (rView.GetDrawFuncPtr() && rView.GetDrawFuncPtr()->IsInsertForm() && !bHitHandle)
                SetPointer( POINTER_DRAW_RECT );
            else
                SetPointer( pSdrView->GetPreferedPointer( rLPt, rSh.GetOut() ) );
        }
    }
    else
    {
        if( pAnchorMarker )
            eStyle = POINTER_ARROW;
        else if( bCntAtPos && bExecHyperlinks )
        {
            // sollten wir ueber einem InternetAttr/ClickFeld/Fussnote stehen?
            SwContentAtPos aSwContentAtPos(
                SwContentAtPos::SW_CLICKFIELD|
                SwContentAtPos::SW_INETATTR|
                SwContentAtPos::SW_FTN );
            if( rSh.GetContentAtPos( rLPt, aSwContentAtPos) )
                eStyle = POINTER_REFHAND;
        }

        SetPointer( eStyle );
    }
}

/*--------------------------------------------------------------------
    Beschreibung: Timer fuer Selektion vergroessern
 --------------------------------------------------------------------*/


IMPL_LINK( SwEditWin, TimerHandler, Timer *, EMPTYARG )
{
    DBG_PROFSTART(edithdl);

    SwWrtShell &rSh = rView.GetWrtShell();
    Point aModPt( aMovePos );
    const SwRect aOldVis( rSh.VisArea() );
    FASTBOOL bDone = FALSE;

    if ( !rSh.VisArea().IsInside( aModPt ) )
    {
        if ( bInsDraw )
        {
            const int nMaxScroll = 40;
            rView.Scroll( Rectangle(aModPt,Size(1,1)), nMaxScroll, nMaxScroll);
            bDone = TRUE;
        }
        else if ( bFrmDrag )
        {
            (rSh.*rSh.fnDrag)(&aModPt,FALSE);
            bDone = TRUE;
        }
        if ( !bDone )
            aModPt = rSh.GetCntntPos( aModPt,aModPt.Y() > rSh.VisArea().Bottom() );
    }
    if ( !bDone && !(bFrmDrag || bInsDraw) )
    {
        (rSh.*rSh.fnSetCrsr)( &aModPt, FALSE );

        //fix(24138): Es kann sein, dass der "Sprung" ueber eine Tabelle so
        //nicht geschafft wird. Deshalb wir hier eben per Up/Down ueber die
        //Tabelle gesprungen.
        if ( aOldVis == rSh.VisArea() &&
            !rSh.IsStartOfDoc() && !rSh.IsEndOfDoc() && !rSh.IsTableMode())
        {
            if ( aModPt.Y() < rSh.VisArea().Top() )
                rSh.Up( TRUE );
            else
                rSh.Down( TRUE );
        }
    }

    aMovePos += rSh.VisArea().Pos() - aOldVis.Pos();
    JustifyAreaTimer();
    DBG_PROFSTOP(edithdl);
    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwEditWin::JustifyAreaTimer()
{
    const Rectangle &rVisArea = GetView().GetVisArea();
    long nTimeout = 800,
         nDiff = Max(
         Max( aMovePos.Y() - rVisArea.Bottom(), rVisArea.Top() - aMovePos.Y() ),
         Max( aMovePos.X() - rVisArea.Right(),  rVisArea.Left() - aMovePos.X()));
    aTimer.SetTimeout( Max( 0L, nTimeout - nDiff*2L) );
}

void SwEditWin::LeaveArea(const Point &rPos)
{
    aMovePos = rPos;
    JustifyAreaTimer();
    if ( !aTimer.IsActive() )
        aTimer.Start();
    if( pShadCrsr )
        delete pShadCrsr, pShadCrsr = 0;
}

inline void SwEditWin::EnterArea()
{
    aTimer.Stop();
}

/*------------------------------------------------------------------------
 Beschreibung:  Modus fuer Rahmen einfuegen
------------------------------------------------------------------------*/


void SwEditWin::InsFrm(USHORT nCols)
{
    StdDrawMode(OBJ_NONE);
    bInsFrm = TRUE;
    nInsFrmColCount = nCols;
}



void SwEditWin::StdDrawMode(USHORT nSlotId)
{
    SetDrawMode( nSlotId );

/*  if (GetDrawFuncPtr())
        GetDrawFuncPtr()->Deactivate();*/

    if (nSlotId == OBJ_NONE)
        rView.SetDrawFuncPtr(new SwDrawBase( &rView.GetWrtShell(), this, &rView ));
    else
        rView.SetDrawFuncPtr(new DrawSelection( &rView.GetWrtShell(), this, &rView ));

    rView.SetSelDrawSlot();
    SetDrawMode(nSlotId);
    rView.GetDrawFuncPtr()->Activate( nSlotId );
    bInsFrm = FALSE;
    nInsFrmColCount = 1;
}



void SwEditWin::StopInsFrm()
{
    if (rView.GetDrawFuncPtr())
    {
        rView.GetDrawFuncPtr()->Deactivate();
        rView.SetDrawFuncPtr(NULL);
    }
    rView.LeaveDrawCreate();    // Konstruktionsmode verlassen
    bInsFrm = FALSE;
    nInsFrmColCount = 1;
}

/*--------------------------------------------------------------------
     Beschreibung:  Der Character Buffer wird in das Dokument eingefuegt
 --------------------------------------------------------------------*/


void SwEditWin::FlushInBuffer( SwWrtShell *pSh )
{
    if ( aInBuffer.Len() )
    {
        pSh->Insert( aInBuffer );
        aInBuffer.Erase();
        bFlushCharBuffer = FALSE;
    }
}



void SwEditWin::ChangeFly( BYTE nDir, BOOL bWeb )
{
    SwWrtShell &rSh = rView.GetWrtShell();
    SwRect aTmp = rSh.GetFlyRect();
    if( aTmp.HasArea() )
    {
        SfxItemSet aSet(rSh.GetAttrPool(),
                        RES_FRM_SIZE, RES_FRM_SIZE,
                        RES_VERT_ORIENT, RES_ANCHOR,
                        RES_COL, RES_COL, 0);
        rSh.GetFlyFrmAttr( aSet );
        RndStdIds eAnchorId = ((SwFmtAnchor&)aSet.Get(RES_ANCHOR)).GetAnchorId();
        Size aSnap( rSh.GetViewOptions()->GetSnapSize() );
        short nDiv = rSh.GetViewOptions()->GetDivisionX();
        if ( nDiv > 0 )
            aSnap.Width() = Max( (ULONG)1, (ULONG)aSnap.Width() / nDiv );
        nDiv = rSh.GetViewOptions()->GetDivisionY();
        if ( nDiv > 0 )
            aSnap.Height() = Max( (ULONG)1, (ULONG)aSnap.Height() / nDiv );
        SwRect aBoundRect;
        Point aRefPoint;
        rSh.CalcBoundRect( aBoundRect, eAnchorId, FRAME, FALSE, &aRefPoint );
        long nLeft = Min( aTmp.Left() - aBoundRect.Left(), aSnap.Width() );
        long nRight = Min( aBoundRect.Right() - aTmp.Right(), aSnap.Width() );
        long nUp = Min( aTmp.Top() - aBoundRect.Top(), aSnap.Height() );
        long nDown = Min( aBoundRect.Bottom() - aTmp.Bottom(), aSnap.Height() );

        switch ( nDir )
        {
            case 4:
            case 0: aTmp.Left( aTmp.Left() - nLeft ); break;
            case 5:
            case 1: aTmp.Top( aTmp.Top() - nUp ); break;
            case 6: if( aTmp.Width() < aSnap.Width() + MINFLY ) break;
                    nRight = aSnap.Width(); // kein break
            case 2: aTmp.Left( aTmp.Left() + nRight ); break;
            case 7: if( aTmp.Height() < aSnap.Height() + MINFLY ) break;
                    nDown = aSnap.Height(); // kein break
            case 3: aTmp.Top( aTmp.Top() + nDown ); break;
            case 8: if( aTmp.Width() >= aSnap.Width() + MINFLY )
                        aTmp.Right( aTmp.Right() - aSnap.Width() );
                    break;
            case 9: if( aTmp.Height() >= aSnap.Height() + MINFLY )
                        aTmp.Height( aTmp.Height() - aSnap.Height() );
                    break;
            case 10: aTmp.Width( aTmp.Width() + nRight ); break;
            case 11: aTmp.Height( aTmp.Height() + nDown ); break;
            default: ASSERT( TRUE, "ChangeFly: Unknown direction." );
        }
        BOOL bSet = FALSE;
        if( nDir < 8 && FLY_IN_CNTNT == eAnchorId && ( nDir % 2 ) )
        {
            long aDiff = aTmp.Top() - aRefPoint.Y();
            if( aDiff > 0 )
                aDiff = 0;
            else if ( aDiff < -aTmp.Height() )
                aDiff = -aTmp.Height();
            SwFmtVertOrient aVert( (SwFmtVertOrient&)aSet.Get(RES_VERT_ORIENT) );
            SwVertOrient eNew;
            if( bWeb )
            {
                eNew = aVert.GetVertOrient();
                BOOL bDown = 0 != ( nDir & 0x02 );
                switch( eNew )
                {
                    case VERT_CHAR_TOP:
                        if( bDown ) eNew = VERT_CENTER; break;
                    case VERT_CENTER:
                        eNew = bDown ? VERT_TOP : VERT_CHAR_TOP; break;
                    case VERT_TOP:
                        if( !bDown ) eNew = VERT_CENTER; break;
                    case VERT_LINE_TOP:
                        if( bDown ) eNew = VERT_LINE_CENTER; break;
                    case VERT_LINE_CENTER:
                        eNew = bDown ? VERT_LINE_BOTTOM : VERT_LINE_TOP; break;
                    case VERT_LINE_BOTTOM:
                        if( !bDown ) eNew = VERT_LINE_CENTER; break;
                }
            }
            else
            {
                aVert.SetPos( aDiff );
                eNew = VERT_NONE;
            }
            aVert.SetVertOrient( eNew );
            aSet.Put( aVert );
            bSet = TRUE;
        }
        if( bWeb && FLY_AT_CNTNT == eAnchorId && ( nDir==0 || nDir==2 ) )
        {
            SwFmtHoriOrient aHori( (SwFmtHoriOrient&)aSet.Get(RES_HORI_ORIENT) );
            SwHoriOrient eNew;
            eNew = aHori.GetHoriOrient();
            switch( eNew )
            {
                case HORI_RIGHT:
                    if( !nDir ) eNew = HORI_LEFT; break;
                case HORI_LEFT:
                    if( nDir ) eNew = HORI_RIGHT; break;
            }
            if( eNew != aHori.GetHoriOrient() )
            {
                aHori.SetHoriOrient( eNew );
                aSet.Put( aHori );
                bSet = TRUE;
            }
        }
        if( nDir > 3 )
        {
            SwFmtFrmSize aSize( (SwFmtFrmSize&)aSet.Get(RES_FRM_SIZE) );

            long nMinWidth = MINFLY;
            // alle Spalten muessen passen
            if (SFX_ITEM_DEFAULT <= aSet.GetItemState(RES_COL))
            {
                const SwFmtCol& rCol = (const SwFmtCol&)aSet.Get(RES_COL);
                if ( rCol.GetColumns().Count() > 1 )
                {
                    for ( USHORT i = 0; i < rCol.GetColumns().Count(); ++i )
                    {
                        nMinWidth += rCol.GetColumns()[i]->GetLeft() +
                                          rCol.GetColumns()[i]->GetRight() +
                                          MINFLY;
                    }
                    nMinWidth -= MINFLY;//einen hatten wir schon mit drin!
                }
            }

            aSize.SetSize(Size(Max(aTmp.Width(), nMinWidth), Max(aTmp.Height(), long(MINFLY))));
            aSet.Put( aSize );
            bSet = TRUE;
        }
        rSh.StartAllAction();
        if( bSet )
            rSh.SetFlyFrmAttr( aSet );
        if( !bWeb && nDir < 8 && FLY_IN_CNTNT != eAnchorId )
            rSh.SetFlyPos( aTmp.Pos() );
        rSh.EndAllAction();
    }
}

/*--------------------------------------------------------------------
    Beschreibung:   KeyEvents
 --------------------------------------------------------------------*/


void SwEditWin::KeyInput(const KeyEvent &rKEvt)
{
    SfxObjectShell *pObjSh = (SfxObjectShell*)rView.GetViewFrame()->GetObjectShell();
    if ( bLockInput || pObjSh && pObjSh->GetProgress() )
        // Wenn die Rechenleiste aktiv ist oder
        // auf dem Document ein Progress laeuft wird keine
        // Bestellungen angenommen.
        return;

    if( pShadCrsr )
        delete pShadCrsr, pShadCrsr = 0;
    aKeyInputFlushTimer.Stop();

    SwWrtShell &rSh = rView.GetWrtShell();
    BOOL bIsDocReadOnly = rView.GetDocShell()->IsReadOnly() &&
                          rSh.IsCrsrReadonly();

    QuickHelpData aTmpQHD;
    if( pQuickHlpData->bClear )
    {
        aTmpQHD.Move( *pQuickHlpData );
        pQuickHlpData->Stop( rSh );
    }

    // OS:auch die DrawView braucht noch ein readonly-Flag
    if ( !bIsDocReadOnly && rSh.GetDrawView() && rSh.GetDrawView()->KeyInput( rKEvt, this ) )
    {
        rSh.GetView().GetViewFrame()->GetBindings().InvalidateAll( FALSE );
        rSh.SetModified();
        return; // Event von der SdrView ausgewertet
    }

    if ( rView.GetDrawFuncPtr() && bInsFrm )
    {
        StopInsFrm();
        rSh.Edit();
    }

    BOOL bFlushBuffer = FALSE;
    BOOL bNormalChar = FALSE;
    BOOL bChkInsBlank = pQuickHlpData->bChkInsBlank;
    pQuickHlpData->bChkInsBlank = FALSE;

    const KeyCode&  rKeyCode = rKEvt.GetKeyCode();
    sal_Unicode aCh = rKEvt.GetCharCode();

    const SwFrmFmt* pFlyFmt = rSh.GetFlyFrmFmt();
    if( pFlyFmt )
    {
        USHORT nEvent;

        if( 32 <= aCh &&
            0 == (( KEY_MOD1 | KEY_MOD2 ) & rKeyCode.GetModifier() ))
            nEvent = SW_EVENT_FRM_KEYINPUT_ALPHA;
        else
            nEvent = SW_EVENT_FRM_KEYINPUT_NOALPHA;

        const SvxMacro* pMacro = pFlyFmt->GetMacro().GetMacroTable().Get( nEvent );
        if( pMacro )
        {
            String sRet;
            SbxArrayRef xArgs = new SbxArray;
            SbxVariableRef xVar = new SbxVariable;
            xVar->PutString( pFlyFmt->GetName() );
            xArgs->Put( &xVar, 1 );

            xVar = new SbxVariable;
            if( SW_EVENT_FRM_KEYINPUT_ALPHA == nEvent )
                xVar->PutChar( aCh );
            else
                xVar->PutUShort( rKeyCode.GetModifier() | rKeyCode.GetCode() );
            xArgs->Put( &xVar, 2 );

            rSh.ExecMacro( *pMacro, &sRet, &xArgs );
            if( sRet.Len() && 0 != sRet.ToInt32() )
                return ;
        }
    }

    OfaAutoCorrCfg* pACfg = OFF_APP()->GetAutoCorrConfig();
    SvxAutoCorrect* pACorr = pACfg->GetAutoCorrect();

    SwModuleOptions* pModOpt = SW_MOD()->GetModuleConfig();

    /*TblChgWidthHeightType*/int eTblChgMode;
    USHORT nTblChgSize = 0;
    BOOL bStopKeyInputTimer = TRUE;
    String sFmlEntry;

    enum SW_KeyState { KS_Start,
                    KS_CheckKey, KS_InsChar, KS_InsTab,
                    KS_NoNum, KS_NumOff, KS_NumOrNoNum, KS_NumDown, KS_NumUp,
                    KS_NextCell, KS_PrevCell, KS_OutlineUp, KS_OutlineDown,
                    KS_GlossaryExpand, KS_NextPrevGlossary,
                    KS_AutoFmtByInput, KS_DontExpand,
                    KS_KeyToView,
                    KS_CheckAutoCorrect, KS_EditFormula,
                    KS_ColLeftBig, KS_ColRightBig,
                    KS_ColLeftSmall, KS_ColRightSmall,
                    KS_ColTopBig, KS_ColBottomBig,
                    KS_ColTopSmall, KS_ColBottomSmall,
                    KS_CellLeftBig, KS_CellRightBig,
                    KS_CellLeftSmall, KS_CellRightSmall,
                    KS_CellTopBig, KS_CellBottomBig,
                    KS_CellTopSmall, KS_CellBottomSmall,
//-----
                    KS_InsDel_ColLeftBig, KS_InsDel_ColRightBig,
                    KS_InsDel_ColLeftSmall, KS_InsDel_ColRightSmall,
                    KS_InsDel_ColTopBig, KS_InsDel_ColBottomBig,
                    KS_InsDel_ColTopSmall, KS_InsDel_ColBottomSmall,
                    KS_InsDel_CellLeftBig, KS_InsDel_CellRightBig,
                    KS_InsDel_CellLeftSmall, KS_InsDel_CellRightSmall,
                    KS_InsDel_CellTopBig, KS_InsDel_CellBottomBig,
                    KS_InsDel_CellTopSmall, KS_InsDel_CellBottomSmall,
                    KS_TblColCellInsDel,
//-----
                    KS_Fly_Change,
                    KS_AppendNodeInSection,
                    KS_Ende };

    SW_KeyState eKeyState = bIsDocReadOnly ? KS_KeyToView : KS_CheckKey,
                eNextKeyState = KS_Ende;

    while( KS_Ende != eKeyState )
    {
        SW_KeyState eFlyState = KS_KeyToView;
        BYTE nDir;

        switch( eKeyState )
        {
        case KS_CheckKey:
            eKeyState = KS_KeyToView;       // default weiter zur View

#ifndef PRODUCT
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            // JP 19.01.99: zum Umschalten des Cursor Verhaltens in ReadOnly
            //              Bereichen
            if( 0x7210 == rKeyCode.GetFullCode() )
                rSh.SetReadOnlyAvailable( !rSh.IsReadOnlyAvailable() );
            else
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#endif

            if( !rKeyCode.IsControlMod() && '=' == aCh &&
                !rSh.IsTableMode() && rSh.GetTableFmt() &&
                rSh.IsSttPara() /*&& rSh.IsEndPara()*/ &&
                !rSh.HasReadonlySel() )
            {
                // in der Tabelle am Anfang der Zelle ein '=' ->
                //  EditZeile aufrufen (F2-Funktionalitaet)
                rSh.Push();
                if( !rSh.MoveSection( fnSectionCurr, fnSectionStart) &&
                    !rSh.IsTableBoxTextFormat() )
                {
                    // steht also am Anfang der Box
                    eKeyState = KS_EditFormula;
                    if( rSh.HasMark() )
                        rSh.SwapPam();
                    else
                        rSh.SttSelect();
                    rSh.MoveSection( fnSectionCurr, fnSectionEnd );
                    rSh.Pop( TRUE );
                    rSh.EndSelect();
                    sFmlEntry = '=';
                }
                else
                    rSh.Pop( FALSE );
            }
            else
            {
                if( pACorr && aTmpQHD.HasCntnt() && !rSh.HasSelection() &&
                    !rSh.HasReadonlySel() && !aTmpQHD.bIsAutoText &&
                    pACorr->GetSwFlags().nAutoCmpltExpandKey ==
                    (rKeyCode.GetModifier() | rKeyCode.GetCode()) )
                {
                    eKeyState = KS_GlossaryExpand;
                    break;
                }

                switch( rKeyCode.GetModifier() | rKeyCode.GetCode() )
                {
                case KEY_RIGHT | KEY_MOD2:
                    eKeyState = KS_ColRightBig;
                    eFlyState = KS_Fly_Change;
                    nDir = 2;
                    goto KEYINPUT_CHECKTABLE;

                case KEY_LEFT | KEY_MOD2:
                    eKeyState = KS_ColRightSmall;
                    eFlyState = KS_Fly_Change;
                    nDir = 0;
                    goto KEYINPUT_CHECKTABLE;
                case KEY_RIGHT | KEY_MOD2 | KEY_SHIFT:
                    eKeyState = KS_ColLeftSmall;
                    goto KEYINPUT_CHECKTABLE;
                case KEY_LEFT | KEY_MOD2 | KEY_SHIFT:
                    eKeyState = KS_ColLeftBig;
                    goto KEYINPUT_CHECKTABLE;

                case KEY_RIGHT | KEY_MOD2 | KEY_MOD1:
                    eKeyState = KS_CellRightBig;
                    eFlyState = KS_Fly_Change;
                    nDir = 10;
                    goto KEYINPUT_CHECKTABLE;
                case KEY_LEFT | KEY_MOD2 | KEY_MOD1:
                    eKeyState = KS_CellRightSmall;
                    eFlyState = KS_Fly_Change;
                    nDir = 8;
                    goto KEYINPUT_CHECKTABLE;
                case KEY_RIGHT | KEY_MOD2 | KEY_SHIFT | KEY_MOD1:
                    eKeyState = KS_CellLeftSmall;
                    eFlyState = KS_Fly_Change;
                    nDir = 6;
                    goto KEYINPUT_CHECKTABLE;
                case KEY_LEFT | KEY_MOD2 | KEY_SHIFT | KEY_MOD1:
                    eKeyState = KS_CellLeftBig;
                    eFlyState = KS_Fly_Change;
                    nDir = 4;
                    goto KEYINPUT_CHECKTABLE;

                case KEY_UP | KEY_MOD2:
                    eKeyState = KS_ColBottomSmall;
                    eFlyState = KS_Fly_Change;
                    nDir = 1;
                    goto KEYINPUT_CHECKTABLE;
                case KEY_DOWN | KEY_MOD2:
                    eKeyState = KS_ColBottomBig;
                    eFlyState = KS_Fly_Change;
                    nDir = 3;
                    goto KEYINPUT_CHECKTABLE;
                case KEY_UP | KEY_MOD2 | KEY_SHIFT:
                    eKeyState = KS_ColTopBig;
                    goto KEYINPUT_CHECKTABLE;
                case KEY_DOWN | KEY_MOD2 | KEY_SHIFT:
                    eKeyState = KS_ColTopSmall;
                    goto KEYINPUT_CHECKTABLE;

                case KEY_UP | KEY_MOD2 | KEY_MOD1:
                    eKeyState = KS_CellBottomSmall;
                    eFlyState = KS_Fly_Change;
                    nDir = 9;
                    goto KEYINPUT_CHECKTABLE;
                case KEY_DOWN | KEY_MOD2 | KEY_MOD1:
                    eKeyState = KS_CellBottomBig;
                    eFlyState = KS_Fly_Change;
                    nDir = 11;
                    goto KEYINPUT_CHECKTABLE;
                case KEY_UP | KEY_MOD2 | KEY_SHIFT | KEY_MOD1:
                    eKeyState = KS_CellTopBig;
                    eFlyState = KS_Fly_Change;
                    nDir = 5;
                    goto KEYINPUT_CHECKTABLE;
                case KEY_DOWN | KEY_MOD2 | KEY_SHIFT | KEY_MOD1:
                    eKeyState = KS_CellTopSmall;
                    eFlyState = KS_Fly_Change;
                    nDir = 7;
                    goto KEYINPUT_CHECKTABLE;

KEYINPUT_CHECKTABLE:
                    if( rSh.IsTableMode() || !rSh.GetTableFmt() )
                    {

                        if( pFlyFmt && KS_KeyToView != eFlyState )
                        {
                            const SfxPoolItem* pItem;
                            if( SFX_ITEM_SET == pFlyFmt->GetItemState(
                                RES_PROTECT, TRUE, &pItem ) && (
                                ((SvxProtectItem*)pItem)->IsSizeProtected() ||
                                ((SvxProtectItem*)pItem)->IsPosProtected() ))
                            {
                                //JP 18.01.99: man koennte es noch feiner
                                // ermitteln (nDir auswerten)
                                pFlyFmt =  0;
                            }
                        }

                        if( pFlyFmt )
                            eKeyState = eFlyState;
                        else
                            eKeyState = KS_KeyToView;
                    }
                    break;

//-------
// Insert/Delete
                case KEY_LEFT:
                case KEY_LEFT | KEY_MOD1:
                    eTblChgMode = WH_FLAG_INSDEL |
                            ( rKeyCode.GetModifier() & KEY_MOD1
                                ? WH_CELL_LEFT
                                : WH_COL_LEFT );
                    nTblChgSize = pModOpt->GetTblVInsert();
                    goto KEYINPUT_CHECKTABLE_INSDEL;
//              case KEY_RIGHT:
                case KEY_RIGHT | KEY_MOD1:
                    eTblChgMode = WH_FLAG_INSDEL | WH_CELL_RIGHT;
                    nTblChgSize = pModOpt->GetTblVInsert();
                    goto KEYINPUT_CHECKTABLE_INSDEL;

                case KEY_UP:
                case KEY_UP | KEY_MOD1:
                    eTblChgMode = WH_FLAG_INSDEL |
                            ( rKeyCode.GetModifier() & KEY_MOD1
                                ? WH_CELL_TOP
                                : WH_ROW_TOP );
                    nTblChgSize = pModOpt->GetTblHInsert();
                    goto KEYINPUT_CHECKTABLE_INSDEL;
                case KEY_DOWN:
                case KEY_DOWN | KEY_MOD1:
                    eTblChgMode = WH_FLAG_INSDEL |
                            ( rKeyCode.GetModifier() & KEY_MOD1
                                ? WH_CELL_BOTTOM
                                : WH_ROW_BOTTOM );
                    nTblChgSize = pModOpt->GetTblHInsert();
                    goto KEYINPUT_CHECKTABLE_INSDEL;

KEYINPUT_CHECKTABLE_INSDEL:
                    if( rSh.IsTableMode() || !rSh.GetTableFmt() ||
                        !bTblInsDelMode ||
                        FALSE /* Tabelle geschuetzt */
                            )
                        eKeyState = KS_KeyToView;
                    else
                    {
                        if( !bTblIsInsMode )
                            eTblChgMode = eTblChgMode | WH_FLAG_BIGGER;
                        eKeyState = KS_TblColCellInsDel;
                    }
                    break;

                case KEY_DELETE | KEY_MOD2:
                    if( !rSh.IsTableMode() && rSh.GetTableFmt() )
                    {
                        eKeyState = KS_Ende;
                        bTblInsDelMode = TRUE;
                        bTblIsInsMode = FALSE;
                        bTblIsColMode = TRUE;
                        aKeyInputTimer.Start();
                        bStopKeyInputTimer = FALSE;
                    }
                    break;
                case KEY_INSERT | KEY_MOD2:
                    if( !rSh.IsTableMode() && rSh.GetTableFmt() )
                    {
                        eKeyState = KS_Ende;
                        bTblInsDelMode = TRUE;
                        bTblIsInsMode = TRUE;
                        bTblIsColMode = TRUE;
                        aKeyInputTimer.Start();
                        bStopKeyInputTimer = FALSE;
                    }
                    break;

                case KEY_RETURN:                // Return
                    if( !rSh.HasReadonlySel() )
                    {
                        if( aTmpQHD.HasCntnt() && !rSh.HasSelection() &&
                            aTmpQHD.bIsAutoText )
                            eKeyState = KS_GlossaryExpand;

                        //RETURN und leerer Absatz in Numerierung -> Num. beenden
                        else if( rSh.GetCurNumRule() && !rSh.HasSelection() &&
                                rSh.IsSttPara() && rSh.IsEndPara() )
                            eKeyState = KS_NumOff;

                        //RETURN fuer neuen Absatz mit AutoFormatierung
                        else if( pACfg && pACfg->IsAutoFmtByInput() &&
                                !(rSh.GetSelectionType() & (SwWrtShell::SEL_GRF |
                                    SwWrtShell::SEL_OLE | SwWrtShell::SEL_FRM |
                                    SwWrtShell::SEL_TBL_CELLS | SwWrtShell::SEL_DRW |
                                    SwWrtShell::SEL_DRW_TXT)) )
                            eKeyState = KS_CheckAutoCorrect, eNextKeyState = KS_AutoFmtByInput;
                        else
                            eNextKeyState = eKeyState, eKeyState = KS_CheckAutoCorrect;
                    }
                    break;

                case KEY_RETURN | KEY_MOD2:     // ALT-Return
                    if( !rSh.HasReadonlySel() && rSh.GetCurNumRule() )
                        eKeyState = KS_NoNum;
                    else if( rSh.CanInsertNodeAtEndOfSection() )
                        eKeyState = KS_AppendNodeInSection;
                    break;

                case KEY_BACKSPACE:
                case KEY_BACKSPACE | KEY_SHIFT:
                    if( !rSh.HasReadonlySel() )
                    {
                        BOOL bOutline = FALSE;
#ifdef TASK_59308
                        const SwTxtFmtColl* pColl;
                        if( !rSh.SwCrsrShell::HasSelection() &&
                            0 != ( pColl = rSh.GetCurTxtFmtColl() ) &&
                            NO_NUMBERING != pColl->GetOutlineLevel() &&
                            NO_NUMBERING == rSh.GetNumLevel( FALSE ) )
                            bOutline = TRUE;
#endif

                        if( rSh.NumOrNoNum(
                                    KEY_BACKSPACE != rKeyCode.GetFullCode(),
                                    TRUE, bOutline ))
                            eKeyState = KS_NumOrNoNum;
                    }
                    break;

                case KEY_END:
                    if( !rSh.HasReadonlySel() && rSh.IsEndPara() &&
                        rSh.DontExpandFmt() )
                        eKeyState = KS_DontExpand;
                    break;

                case KEY_RIGHT:
                    if( !rSh.HasReadonlySel() )
                    {
                        if( rSh.IsEndPara() && rSh.DontExpandFmt() )
                            eKeyState = KS_DontExpand;
                        else
                        {
                            eTblChgMode = WH_FLAG_INSDEL | WH_COL_RIGHT;
                            nTblChgSize = pModOpt->GetTblVInsert();
                            goto KEYINPUT_CHECKTABLE_INSDEL;
                        }
                    }
                    break;

                case KEY_TAB:
                {
#ifdef SW_CRSR_TIMER
                    BOOL bOld = rSh.ChgCrsrTimerFlag( FALSE );
#endif
                    if( rSh.GetCurNumRule() && rSh.IsSttOfPara() &&
                        !rSh.HasReadonlySel() )
                        eKeyState = KS_NumDown;
                    else if ( rSh.GetTableFmt() )
                    {
                        if( rSh.HasSelection() || rSh.HasReadonlySel() )
                            eKeyState = KS_NextCell;
                        else
                            eKeyState = KS_CheckAutoCorrect, eNextKeyState = KS_NextCell;
                    }
                    else
                    {
                        eKeyState = KS_InsTab;
                        if( rSh.IsSttOfPara() && !rSh.HasReadonlySel() )
                        {
                            SwTxtFmtColl* pColl = rSh.GetCurTxtFmtColl();
                            if( pColl && 0 <= pColl->GetOutlineLevel() &&
                                MAXLEVEL - 1 > pColl->GetOutlineLevel() )
                                eKeyState = KS_OutlineDown;
                        }
                    }
#ifdef SW_CRSR_TIMER
                    rSh.ChgCrsrTimerFlag( bOld );
#endif
                }
                break;
                case KEY_TAB | KEY_SHIFT:
                {
#ifdef SW_CRSR_TIMER
                    BOOL bOld = rSh.ChgCrsrTimerFlag( FALSE );
#endif
                    if( rSh.GetCurNumRule() && rSh.IsSttOfPara() &&
                        !rSh.HasReadonlySel() )
                        eKeyState = KS_NumUp;
                    else if ( rSh.GetTableFmt() )
                    {
                        if( rSh.HasSelection() || rSh.HasReadonlySel() )
                            eKeyState = KS_PrevCell;
                        else
                            eKeyState = KS_CheckAutoCorrect, eNextKeyState = KS_PrevCell;
                    }
                    else
                    {
                        eKeyState = KS_Ende;
                        if( rSh.IsSttOfPara() && !rSh.HasReadonlySel() )
                        {
                            SwTxtFmtColl* pColl = rSh.GetCurTxtFmtColl();
                            if( pColl && 0 < pColl->GetOutlineLevel() &&
                                MAXLEVEL - 1 >= pColl->GetOutlineLevel() )
                                eKeyState = KS_OutlineUp;
                        }
                    }
#ifdef SW_CRSR_TIMER
                    rSh.ChgCrsrTimerFlag( bOld );
#endif
                }
                break;
                case KEY_TAB | KEY_MOD1:
                    if( !rSh.HasReadonlySel() )
                    {
                        if( aTmpQHD.HasCntnt() && !rSh.HasSelection() )
                        {
                            // zum naechsten Tip
                            aTmpQHD.Inc( pACorr && pACorr->GetSwFlags().
                                                   bAutoCmpltEndless );
                            eKeyState = KS_NextPrevGlossary;
                        }
                        else if( rSh.GetTableFmt() )
                            eKeyState = KS_InsTab;
                        else if( rSh.IsSttOfPara() )
                        {
                            if( rSh.GetCurNumRule() )
                                eKeyState = KS_InsTab;
                            else
                            {
                                SwTxtFmtColl* pColl = rSh.GetCurTxtFmtColl();
                                if( pColl && 0 <= pColl->GetOutlineLevel() &&
                                    MAXLEVEL - 1 > pColl->GetOutlineLevel() )
                                    eKeyState = KS_InsTab;
                            }
                        }
                    }
                    break;

                case KEY_TAB | KEY_MOD1 | KEY_SHIFT:
                    if( aTmpQHD.HasCntnt() && !rSh.HasSelection() &&
                        !rSh.HasReadonlySel() )
                    {
                        // zum vorherigen Tip
                        aTmpQHD.Dec( pACorr && pACorr->GetSwFlags().
                                                    bAutoCmpltEndless );
                        eKeyState = KS_NextPrevGlossary;
                    }
                    break;
                }
            }
            break;

        case KS_KeyToView:
            {
                eKeyState = KS_Ende;
                bNormalChar = !rKeyCode.IsControlMod() &&
                                SW_ISPRINTABLE( aCh );
                if( aInBuffer.Len() && ( !bNormalChar || bIsDocReadOnly ))
                    FlushInBuffer( &rSh );

                if( rView.KeyInput( rKEvt ) )
                    bFlushBuffer = TRUE, bNormalChar = FALSE;
                else
                {
// OS 22.09.95: Da der Sfx Acceleratoren nur aufruft, wenn sie beim letzten
//              Statusupdate enabled wurden, muss copy ggf. von uns
//              'gewaltsam' gerufen werden.
                    if( rKeyCode.GetFunction() == KEYFUNC_COPY )
                        GetView().GetViewFrame()->GetDispatcher()->Execute(SID_COPY);


                    if( !bIsDocReadOnly && bNormalChar )
                        eKeyState = KS_InsChar;
                    else
                    {
                        bNormalChar = FALSE;
                        Window::KeyInput( rKEvt );
                    }
                }
            }
            break;

        case KS_InsTab:
            if( rView.ISA( SwWebView ))     //Kein Tabulator fuer Web!
            {
                // Bug 56196 - dann sollte der weiter gereicht werden.
                Window::KeyInput( rKEvt );
                eKeyState = KS_Ende;
                break;
            }
            aCh = '\t';
            // kein break!
        case KS_InsChar:
        if( !rSh.HasReadonlySel() )
        {
            if( bChkInsBlank && WordSelection::IsNormalChar( aCh ) &&
                (aInBuffer.Len() || !rSh.IsSttPara() || !rSh.IsEndPara() ))
            {
                // vor dem Zeichen noch ein Blank einfuegen. Dieses
                // kommt zwischen den Expandierten Text und dem neuen
                // "nicht Worttrenner".
                aInBuffer.Expand( aInBuffer.Len() + 1, ' ' );
            }


            if( !rKEvt.GetRepeat() && pACorr &&
                (( pACorr->IsAutoCorrFlag( ChgWeightUnderl ) &&
                    ( '*' == aCh || '_' == aCh ) ) ||
                 ( pACorr->IsAutoCorrFlag( ChgQuotes ) && ('\"' == aCh ))||
                 ( pACorr->IsAutoCorrFlag( ChgSglQuotes ) && ( '\'' == aCh))))
            {
                FlushInBuffer( &rSh );
                rSh.AutoCorrect( *pACorr, aCh );
                if( '\"' != aCh && '\'' != aCh )        // nur bei "*_" rufen!
                    rSh.UpdateAttr();
            }
            else if( !rKEvt.GetRepeat() && pACorr &&
                pACorr->IsAutoCorrFlag( CptlSttSntnc | CptlSttWrd |
                                        ChgFractionSymbol | ChgOrdinalNumber |
                                        ChgToEnEmDash | SetINetAttr |
                                        Autocorrect ) &&
                '\"' != aCh && '\'' != aCh && '*' != aCh && '_' != aCh &&
//              !Application::GetAppInternational().IsAlphaNumeric(
//                  STR_HACK( aCh ))
                !WordSelection::IsNormalChar( aCh )
                )
            {
                FlushInBuffer( &rSh );
                rSh.AutoCorrect( *pACorr, aCh );
            }
            else
            {
                aInBuffer.Expand( aInBuffer.Len() + rKEvt.GetRepeat() + 1,aCh );
                bFlushCharBuffer = Application::AnyInput( INPUT_KEYBOARD );
                bFlushBuffer = !bFlushCharBuffer;
                if( bFlushCharBuffer )
                    aKeyInputFlushTimer.Start();
            }
            eKeyState = KS_Ende;
        }
        else
        {
            InfoBox( this, SW_RES( MSG_READONLY_CONTENT )).Execute();
// ???          Window::KeyInput( rKEvt );
            eKeyState = KS_Ende;
        }
        break;

        case KS_CheckAutoCorrect:
        {
            if( pACorr &&
                pACorr->IsAutoCorrFlag( CptlSttSntnc | CptlSttWrd |
                                        ChgFractionSymbol | ChgOrdinalNumber |
                                        ChgToEnEmDash | SetINetAttr |
                                        Autocorrect ) &&
                !rSh.HasReadonlySel() )
            {
                FlushInBuffer( &rSh );
                rSh.AutoCorrect( *pACorr, 0 );
            }
            eKeyState = eNextKeyState;
        }
        break;

        default:
        {
            TypeId pTypeId = 0;

            FlushInBuffer( &rSh );
//???           if( bFlushCharBuffer )
//???               FlushInBuffer( &rSh );
            switch( eKeyState )
            {
            case KS_AppendNodeInSection:
            {
                rSh.AppendNodeInSection();
            }
            break;

            case KS_NoNum:
            {
                rSh.NoNum();
                pTypeId = TYPE(SwListShell);
            }
            break;
            case KS_NumOff:
            {
                // Shellwechsel - also vorher aufzeichnen
                rSh.DelNumRules();
            }
            break;

            case KS_NumDown:
            {
                rSh.NumUpDown( TRUE );
            }
            break;
            case KS_NumUp:
            {
                rSh.NumUpDown( FALSE );
            }
            break;
            case KS_NumOrNoNum:
            {
                //Backspace in Numerierung und Nummer -> Nummer auschalten
                //SHIFT-Backspace in Numerierung und NoNum -> Nummer wieder einschalten
                pTypeId = TYPE(SwListShell);
            }
            break;

            case KS_OutlineDown:
                rSh.OutlineUpDown( 1 );
                break;
            case KS_OutlineUp:
                rSh.OutlineUpDown( -1 );
                break;

            case KS_NextCell:
            {
                //In Tabelle immer 'flushen'
                rSh.GoNextCell();
            }
            break;
            case KS_PrevCell:
            {
                rSh.GoPrevCell();
            }
            break;
            case KS_AutoFmtByInput:
            {
                rSh.SplitNode( TRUE );
                pTypeId = TYPE(SwTextShell);
            }
            break;

            case KS_DontExpand:
                break;

            case KS_GlossaryExpand:
            {
                // ersetze das Wort oder Kuerzel durch den den Textbaustein
                rSh.StartUndo( UNDO_START );

                String sFnd( *aTmpQHD.aArr[ aTmpQHD.nCurArrPos ] );
                if( aTmpQHD.bIsAutoText )
                {
                    SwGlossaryList* pList = ::GetGlossaryList();
                    String sShrtNm;
                    String sGroup;
                    if(pList->GetShortName( sFnd, sShrtNm, sGroup))
                    {
                        rSh.SttSelect();
                        rSh.ExtendSelection( FALSE, aTmpQHD.nLen );
                        SwGlossaryHdl* pGlosHdl = GetView().GetGlosHdl();
                        pGlosHdl->SetCurGroup(sGroup, TRUE);
                        pGlosHdl->InsertGlossary( sShrtNm);
                        pQuickHlpData->bChkInsBlank = TRUE;
                    }
                }
                else
                {
                    rSh.Insert( sFnd.Erase( 0, aTmpQHD.nLen ));
                    pQuickHlpData->bChkInsBlank = !pACorr ||
                            pACorr->GetSwFlags().bAutoCmpltAppendBlanc;
                }
                rSh.EndUndo( UNDO_END );
            }
            break;

            case KS_NextPrevGlossary:
                pQuickHlpData->Move( aTmpQHD );
                pQuickHlpData->Start( rSh, USHRT_MAX );
                break;

            case KS_EditFormula:
            {
                pTypeId = TYPE(SwTextShell);
                const USHORT nId = SwInputChild::GetChildWindowId();

                SfxViewFrame* pVFrame = GetView().GetViewFrame();
                pVFrame->ToggleChildWindow( nId );
                SwInputChild* pChildWin = (SwInputChild*)pVFrame->
                                                    GetChildWindow( nId );
                if( pChildWin )
                    pChildWin->SetFormula( sFmlEntry );
            }
            break;

            case KS_ColLeftBig:         rSh.SetColRowWidthHeight( WH_COL_LEFT|WH_FLAG_BIGGER, pModOpt->GetTblHMove() ); break;
            case KS_ColRightBig:        rSh.SetColRowWidthHeight( WH_COL_RIGHT|WH_FLAG_BIGGER, pModOpt->GetTblHMove() );    break;
            case KS_ColLeftSmall:       rSh.SetColRowWidthHeight( WH_COL_LEFT, pModOpt->GetTblHMove() );    break;
            case KS_ColRightSmall:      rSh.SetColRowWidthHeight( WH_COL_RIGHT, pModOpt->GetTblHMove() );   break;
            case KS_ColTopBig:          rSh.SetColRowWidthHeight( WH_ROW_TOP|WH_FLAG_BIGGER, pModOpt->GetTblVMove() );  break;
            case KS_ColBottomBig:       rSh.SetColRowWidthHeight( WH_ROW_BOTTOM|WH_FLAG_BIGGER, pModOpt->GetTblVMove() );   break;
            case KS_ColTopSmall:        rSh.SetColRowWidthHeight( WH_ROW_TOP, pModOpt->GetTblVMove() ); break;
            case KS_ColBottomSmall:     rSh.SetColRowWidthHeight( WH_ROW_BOTTOM, pModOpt->GetTblVMove() );  break;
            case KS_CellLeftBig:        rSh.SetColRowWidthHeight( WH_CELL_LEFT|WH_FLAG_BIGGER, pModOpt->GetTblHMove() );    break;
            case KS_CellRightBig:       rSh.SetColRowWidthHeight( WH_CELL_RIGHT|WH_FLAG_BIGGER, pModOpt->GetTblHMove() );   break;
            case KS_CellLeftSmall:      rSh.SetColRowWidthHeight( WH_CELL_LEFT, pModOpt->GetTblHMove() );   break;
            case KS_CellRightSmall:     rSh.SetColRowWidthHeight( WH_CELL_RIGHT, pModOpt->GetTblHMove() );  break;
            case KS_CellTopBig:         rSh.SetColRowWidthHeight( WH_CELL_TOP|WH_FLAG_BIGGER, pModOpt->GetTblVMove() ); break;
            case KS_CellBottomBig:      rSh.SetColRowWidthHeight( WH_CELL_BOTTOM|WH_FLAG_BIGGER, pModOpt->GetTblVMove() );  break;
            case KS_CellTopSmall:       rSh.SetColRowWidthHeight( WH_CELL_TOP, pModOpt->GetTblVMove() );    break;
            case KS_CellBottomSmall:    rSh.SetColRowWidthHeight( WH_CELL_BOTTOM, pModOpt->GetTblVMove() ); break;

//---------------
            case KS_InsDel_ColLeftBig:          rSh.SetColRowWidthHeight( WH_FLAG_INSDEL|WH_COL_LEFT|WH_FLAG_BIGGER, pModOpt->GetTblHInsert() );    break;
            case KS_InsDel_ColRightBig:         rSh.SetColRowWidthHeight( WH_FLAG_INSDEL|WH_COL_RIGHT|WH_FLAG_BIGGER, pModOpt->GetTblHInsert() );   break;
            case KS_InsDel_ColLeftSmall:        rSh.SetColRowWidthHeight( WH_FLAG_INSDEL|WH_COL_LEFT, pModOpt->GetTblHInsert() );   break;
            case KS_InsDel_ColRightSmall:       rSh.SetColRowWidthHeight( WH_FLAG_INSDEL|WH_COL_RIGHT, pModOpt->GetTblHInsert() );  break;
            case KS_InsDel_ColTopBig:           rSh.SetColRowWidthHeight( WH_FLAG_INSDEL|WH_ROW_TOP|WH_FLAG_BIGGER, pModOpt->GetTblVInsert() ); break;
            case KS_InsDel_ColBottomBig:        rSh.SetColRowWidthHeight( WH_FLAG_INSDEL|WH_ROW_BOTTOM|WH_FLAG_BIGGER, pModOpt->GetTblVInsert() );  break;
            case KS_InsDel_ColTopSmall:         rSh.SetColRowWidthHeight( WH_FLAG_INSDEL|WH_ROW_TOP, pModOpt->GetTblVInsert() );    break;
            case KS_InsDel_ColBottomSmall:      rSh.SetColRowWidthHeight( WH_FLAG_INSDEL|WH_ROW_BOTTOM, pModOpt->GetTblVInsert() ); break;
            case KS_InsDel_CellLeftBig:         rSh.SetColRowWidthHeight( WH_FLAG_INSDEL|WH_CELL_LEFT|WH_FLAG_BIGGER, pModOpt->GetTblHInsert() );   break;
            case KS_InsDel_CellRightBig:        rSh.SetColRowWidthHeight( WH_FLAG_INSDEL|WH_CELL_RIGHT|WH_FLAG_BIGGER, pModOpt->GetTblHInsert() );  break;
            case KS_InsDel_CellLeftSmall:       rSh.SetColRowWidthHeight( WH_FLAG_INSDEL|WH_CELL_LEFT, pModOpt->GetTblHInsert() );  break;
            case KS_InsDel_CellRightSmall:      rSh.SetColRowWidthHeight( WH_FLAG_INSDEL|WH_CELL_RIGHT, pModOpt->GetTblHInsert() ); break;
            case KS_InsDel_CellTopBig:          rSh.SetColRowWidthHeight( WH_FLAG_INSDEL|WH_CELL_TOP|WH_FLAG_BIGGER, pModOpt->GetTblVInsert() );    break;
            case KS_InsDel_CellBottomBig:       rSh.SetColRowWidthHeight( WH_FLAG_INSDEL|WH_CELL_BOTTOM|WH_FLAG_BIGGER, pModOpt->GetTblVInsert() ); break;
            case KS_InsDel_CellTopSmall:        rSh.SetColRowWidthHeight( WH_FLAG_INSDEL|WH_CELL_TOP, pModOpt->GetTblVInsert() );   break;
            case KS_InsDel_CellBottomSmall:     rSh.SetColRowWidthHeight( WH_FLAG_INSDEL|WH_CELL_BOTTOM, pModOpt->GetTblVInsert() );    break;
//---------------
            case KS_TblColCellInsDel:
                rSh.SetColRowWidthHeight( eTblChgMode, nTblChgSize );
                break;
            case KS_Fly_Change:
                ChangeFly( nDir, rView.ISA( SwWebView ) );
                break;
            }

            eKeyState = KS_Ende;
        }
        }
    }

    if( bStopKeyInputTimer )
    {
        aKeyInputTimer.Stop();
        bTblInsDelMode = FALSE;
    }

    // falls die gepufferten Zeichen eingefuegt werden sollen
    if( bFlushBuffer && aInBuffer.Len() )
    {
        //OS 16.02.96 11.04: bFlushCharBuffer wurde hier nicht zurueckgesetzt
        // warum nicht?
        BOOL bSave = bFlushCharBuffer;
        FlushInBuffer(&rSh);
        bFlushCharBuffer = bSave;

        // evt. Tip-Hilfe anzeigen
        String sWord;
        if( bNormalChar && pACfg && pACorr &&
            ( pACfg->IsAutoTextTip() ||
              pACorr->GetSwFlags().bAutoCompleteWords ) &&
            rSh.GetPrevAutoCorrWord( *pACorr, sWord ) )
        {
            pQuickHlpData->ClearCntnt();
            if( pACfg->IsAutoTextTip() )
            {
                SwGlossaryList* pList = ::GetGlossaryList();
                pList->HasLongName( sWord, &pQuickHlpData->aArr );
            }

            if( pQuickHlpData->aArr.Count() )
            {
                pQuickHlpData->bIsTip = TRUE;
                pQuickHlpData->bIsAutoText = TRUE;
            }
            else if( pACorr->GetSwFlags().bAutoCompleteWords )
            {
                pQuickHlpData->bIsAutoText = FALSE;
                pQuickHlpData->bIsTip = !pACorr ||
                            pACorr->GetSwFlags().bAutoCmpltShowAsTip;
                const International* pIntl = &Application::GetAppInternational();
                {
                    // besorge mal die akt. Sprache:
                    SfxItemSet aSet( pObjSh->GetPool(), RES_CHRATR_LANGUAGE,
                                                        RES_CHRATR_LANGUAGE );
                    rSh.GetAttr( aSet );

                    LanguageType eLang = ((const SvxLanguageItem&)aSet.Get(
                                        RES_CHRATR_LANGUAGE )).GetLanguage();

                    if( eLang != pIntl->GetLanguage() &&
                        LANGUAGE_SYSTEM != eLang && LANGUAGE_DONTKNOW != eLang )
                        pIntl = new International( eLang );
                }

                for( int n = MONDAY; n <= SUNDAY; ++n )
                {
                    const String& rDay = pIntl->GetDayText( (DayOfWeek)n );
                    if( sWord.Len() + 1 < rDay.Len() &&
                        pIntl->CompareEqual(sWord, rDay.Copy(0,sWord.Len()), INTN_COMPARE_IGNORECASE ) )
                    {
                        String* pNew = new String( rDay );
                        if( !pQuickHlpData->aArr.Insert( pNew ) )
                            delete pNew;
                    }
                }

                for( n = 1; n <= 12; ++n )
                {
                    const String& rMon = pIntl->GetMonthText( n );
                    if( sWord.Len() + 1 < rMon.Len() &&
                        pIntl->CompareEqual(sWord, rMon.Copy(0,sWord.Len()), INTN_COMPARE_IGNORECASE ))
                    {
                        String* pNew = new String( rMon );
                        if( !pQuickHlpData->aArr.Insert( pNew ) )
                            delete pNew;
                    }
                }

                // wurde die International - Klasse von uns angelegt?
                if( pIntl != &Application::GetAppInternational() )
                    delete (International*)pIntl;

                USHORT nStt, nEnd;
                const SwAutoCompleteWord& rACLst = rSh.GetAutoCompleteWords();
                if( rACLst.GetRange( sWord, nStt, nEnd ) )
                {
                    while( nStt < nEnd )
                    {
                        const String& rS = rACLst[ nStt ];
                        //JP 16.06.99: Bug 66927 - only if the count of chars
                        //              from the suggest greater as the
                        //              actual word
                        if( rS.Len() > sWord.Len() )
                        {
                            String* pNew = new String( rS );
                            if( !pQuickHlpData->aArr.Insert( pNew ) )
                                delete pNew;
                        }
                        ++nStt;
                    }
                }
            }

            if( pQuickHlpData->aArr.Count() )
                pQuickHlpData->Start( rSh, sWord.Len() );
        }
    }
}

/*--------------------------------------------------------------------
     Beschreibung:  MouseEvents
 --------------------------------------------------------------------*/


void SwEditWin::RstMBDownFlags()
{
    //Nicht auf allen Systemen kommt vor dem modalen
    //Dialog noch ein MouseButton Up (wie unter WINDOWS).
    //Daher hier die Stati zuruecksetzen und die Maus
    //fuer den Dialog freigeben.
    bMBPressed = bNoInterrupt = FALSE;
    EnterArea();
    ReleaseMouse();
}





void SwEditWin::MouseButtonDown(const MouseEvent& rMEvt)
{
    GrabFocus();

    bWasShdwCrsr = 0 != pShadCrsr;
    if( bWasShdwCrsr )
        delete pShadCrsr, pShadCrsr = 0;

    SwWrtShell &rSh = rView.GetWrtShell();
    const Point aDocPos( PixelToLogic( rMEvt.GetPosPixel() ) );

    if ( IsChainMode() )
    {
        SetChainMode( FALSE );
        SwRect aDummy;
        SwFlyFrmFmt *pFmt = (SwFlyFrmFmt*)rSh.GetFlyFrmFmt();
        if ( !rSh.Chainable( aDummy, *pFmt, aDocPos ) )
            rSh.Chain( *pFmt, aDocPos );
        UpdatePointer( aDocPos, rMEvt.GetModifier() );
        return;
    }

    //Nach GrabFocus sollte eine Shell gepusht sein. Das muss eigentlich
    //klappen aber in der Praxis ...
    lcl_SelectShellForDrop( rView );

    BOOL bIsDocReadOnly = rView.GetDocShell()->IsReadOnly();
    BOOL bCallBase = TRUE;

    if( pQuickHlpData->bClear )
        pQuickHlpData->Stop( rSh );
    pQuickHlpData->bChkInsBlank = FALSE;

    if( rSh.FinishOLEObj() )
        return; //InPlace beenden und der Klick zaehlt nicht mehr

    SET_CURR_SHELL( &rSh );

    SdrView *pSdrView = rSh.GetDrawView();
    if ( pSdrView )
    {
        if (pSdrView->MouseButtonDown( rMEvt, this ) )
        {
            rSh.GetView().GetViewFrame()->GetBindings().InvalidateAll(FALSE);
            return; // Event von der SdrView ausgewertet
        }
    }

#ifdef MAC
    if (rMEvt.IsMod1() && rMEvt.IsMod2())
        return;
#endif

    bIsInMove = FALSE;
    aStartPos = rMEvt.GetPosPixel();
    aRszMvHdlPt.X() = 0, aRszMvHdlPt.Y() = 0;

    if ( !rSh.IsDrawCreate() && !pApplyTempl && !rSh.IsInSelect() &&
         rMEvt.GetClicks() == 1 && MOUSE_LEFT == rMEvt.GetButtons() &&
         !rSh.IsTableMode() &&
         rSh.IsMouseTabCol( aDocPos ) )
    {
        //Zuppeln von Tabellenspalten aus dem Dokument heraus.
        rView.SetTabColFromDoc( TRUE );
        rView.SetTabColFromDocPos( aDocPos );
        rView.InvalidateRulerPos();
        SfxBindings& rBind = rView.GetViewFrame()->GetBindings();
        rBind.Update();
        if ( RulerClook( rView , rMEvt ) )
        {
            rView.SetTabColFromDoc( FALSE );
            rView.InvalidateRulerPos();
            rBind.Update();
            bCallBase = FALSE;
        }
        else
        {
            return;
        }
    }

    //Man kann sich in einem Selektionszustand befinden, wenn zuletzt
    //mit dem Keyboard selektiert wurde, aber noch kein CURSOR_KEY
    //anschliessend bewegt worden ist. In diesem Fall muss die vorher-
    //gehende Selektion zuerst beendet werden.
    //MA 07. Oct. 95: Und zwar nicht nur bei Linker Maustaste sondern immer.
    //siehe auch Bug: 19263
    if ( rSh.IsInSelect() )
        rSh.EndSelect();

    //Abfrage auf LEFT, da sonst auch bei einem Click mit der rechten Taste
    //beispielsweise die Selektion aufgehoben wird.
    if ( MOUSE_LEFT == rMEvt.GetButtons() )
    {
        BOOL bOnlyText = FALSE;
        bMBPressed = bNoInterrupt = TRUE;
        CaptureMouse();

        //ggf. Cursorpositionen zuruecksetzen
        rSh.ResetCursorStack();

        switch ( rMEvt.GetModifier() + rMEvt.GetButtons() )
        {
            case MOUSE_LEFT:
            case MOUSE_LEFT + KEY_SHIFT:
            case MOUSE_LEFT + KEY_MOD2:
                if( rSh.IsObjSelected() )
                {
                    SdrHdl* pHdl;
                    if( !bIsDocReadOnly && !pAnchorMarker && 0 !=
                        ( pHdl = pSdrView->HitHandle(aDocPos, *(rSh.GetOut())) )
                        && pHdl->GetKind() == HDL_ANCHOR )
                    {
                        pAnchorMarker = new SwAnchorMarker( pHdl );
                        UpdatePointer( aDocPos, rMEvt.GetModifier() );
                        return;
                    }
                }
                if ( EnterDrawMode( rMEvt, aDocPos ) )
                {
                    bNoInterrupt = FALSE;
                    return;
                }
                else  if ( rView.GetDrawFuncPtr() && bInsFrm )
                {
                    StopInsFrm();
                    rSh.Edit();
                }

                // Ohne SHIFT, da sonst Toggle bei Selektion nicht funktioniert
                if (rMEvt.GetClicks() == 1)
                {
                    if ( rSh.IsSelFrmMode())
                    {
                        SdrHdl* pHdl = rSh.GetDrawView()->HitHandle
                                                    (aDocPos, *(rSh.GetOut()));
                        BOOL bHitHandle = pHdl && pHdl->GetKind() != HDL_ANCHOR;

                        if ((rSh.IsInsideSelectedObj(aDocPos) || bHitHandle) &&
                            !(rMEvt.GetModifier() == KEY_SHIFT && !bHitHandle))
                        {
                            rSh.EnterSelFrmMode( &aDocPos );
                            if ( !pApplyTempl )
                            {
                                //nur, wenn keine Position zum Sizen getroffen ist.
                                if (!bHitHandle)
                                {
                                    StartDDTimer();
                                    SwEditWin::nDDStartPosY = aDocPos.Y();
                                    SwEditWin::nDDStartPosX = aDocPos.X();
                                }
                                bFrmDrag = TRUE;
                            }
                            bNoInterrupt = FALSE;
                            return;
                        }
                    }
                }
        }

        BOOL bExecHyperlinks = rSh.GetViewOptions()->IsExecHyperlinks()^
                            (rMEvt.GetModifier() == KEY_MOD2 ? TRUE : FALSE);

        switch ( rMEvt.GetModifier() + rMEvt.GetButtons() )
        {
            case MOUSE_LEFT:
            case MOUSE_LEFT + KEY_MOD1:
            case MOUSE_LEFT + KEY_MOD2:
                switch ( rMEvt.GetClicks() )
                {
                    case 1:
                    {
                        UpdatePointer( aDocPos, rMEvt.GetModifier() );
                        SwEditWin::nDDStartPosY = aDocPos.Y();
                        SwEditWin::nDDStartPosX = aDocPos.X();

                        // URL in DrawText-Objekt getroffen?
                        BOOL bExecDrawTextLink = FALSE;

                        if (bExecHyperlinks && pSdrView)
                        {
                            SdrViewEvent aVEvt;
                            SdrHitKind eHit = pSdrView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt);

                            if (aVEvt.eEvent == SDREVENT_EXECUTEURL)
                                bExecDrawTextLink = TRUE;
                        }

                        //Rahmen nur zu selektieren versuchen, wenn
                        //der Pointer bereits entsprechend geschaltet wurde
                        if ( aActHitType != SDRHIT_NONE && !rSh.IsSelFrmMode() &&
                            !SFX_APP()->IsDispatcherLocked() &&
                            !bExecDrawTextLink)
                        {
                            rView.NoRotate();
                            rSh.HideCrsr();
                            if( rSh.SelectObj( aDocPos, FALSE, rMEvt.IsMod1() ) )
                            {
                                // falls im Macro der Rahmen deselektiert
                                // wurde, muss nur noch der Cursor
                                // wieder angezeigt werden.
                                if( FRMTYPE_NONE == rSh.GetSelFrmType() )
                                    rSh.ShowCrsr();
                                else
                                {
                                    if (rSh.IsFrmSelected() && rView.GetDrawFuncPtr())
                                    {
                                        rView.GetDrawFuncPtr()->Deactivate();
                                        rView.SetDrawFuncPtr(NULL);
                                        rView.LeaveDrawCreate();
                                        rView.AttrChangedNotify( &rSh );
                                    }

                                    rSh.EnterSelFrmMode( &aDocPos );
                                    bFrmDrag = TRUE;
                                    UpdatePointer( aDocPos, rMEvt.GetModifier() );
                                }
                                return;
                            }
                            else
                                bOnlyText = rSh.IsObjSelectable( aDocPos );

                            if (!rView.GetDrawFuncPtr())
                                rSh.ShowCrsr();
                        }
                        else if ( rSh.IsSelFrmMode() &&
                                  (aActHitType == SDRHIT_NONE ||
                                   !rSh.IsInsideSelectedObj( aDocPos )))
                        {
                            rView.NoRotate();
                            SdrHdl *pHdl;
                            if( !bIsDocReadOnly && !pAnchorMarker && 0 !=
                                ( pHdl = pSdrView->HitHandle(aDocPos, *(rSh.GetOut())) )
                                && pHdl->GetKind() == HDL_ANCHOR )
                            {
                                pAnchorMarker = new SwAnchorMarker( pHdl );
                                UpdatePointer( aDocPos, rMEvt.GetModifier() );
                                return;
                            }
                            else
                            {
                                BOOL bUnLockView = !rSh.IsViewLocked();
                                rSh.LockView( TRUE );
                                BOOL bSelObj = rSh.SelectObj( aDocPos,
                                        rMEvt.IsShift(), rMEvt.IsMod1() );
                                if( bUnLockView )
                                    rSh.LockView( FALSE );

                                if( !bSelObj )
                                {
                                    // Cursor hier umsetzen, damit er nicht zuerst
                                    // im Rahmen gezeichnet wird; ShowCrsr() geschieht
                                    // in LeaveSelFrmMode()
                                    bValidCrsrPos = !(CRSR_POSCHG & (rSh.*rSh.fnSetCrsr)(&aDocPos,FALSE));
                                    rSh.LeaveSelFrmMode();
                                    rView.AttrChangedNotify( &rSh );
                                    bCallBase = FALSE;
                                }
                                else
                                {
                                    rSh.HideCrsr();
                                    rSh.EnterSelFrmMode( &aDocPos );
                                    rSh.SelFlyGrabCrsr();
                                    rSh.MakeSelVisible();
                                    bFrmDrag = TRUE;
                                    if( rSh.IsFrmSelected() &&
                                        rView.GetDrawFuncPtr() )
                                    {
                                        rView.GetDrawFuncPtr()->Deactivate();
                                        rView.SetDrawFuncPtr(NULL);
                                        rView.LeaveDrawCreate();
                                        rView.AttrChangedNotify( &rSh );
                                    }
                                    UpdatePointer( aDocPos, rMEvt.GetModifier() );
                                    return;
                                }
                            }
                        }
                        break;
                    }
                    case 2:
                    {
                        bFrmDrag = FALSE;
                        if ( !bIsDocReadOnly && rSh.IsInsideSelectedObj(aDocPos) &&
                             0 == rSh.IsSelObjProtected( (FlyProtectType)(FLYPROTECT_CONTENT|FLYPROTECT_PARENT) ) )
                        switch ( rSh.GetSelectionType() )
                        {
                            case SwWrtShell::SEL_GRF:
                                RstMBDownFlags();
                                GetView().GetViewFrame()->GetDispatcher()->Execute(
                                    FN_FORMAT_GRAFIC_DLG, SFX_CALLMODE_RECORD|SFX_CALLMODE_SLOT);
                                return;

                                // Doppelklick auf OLE-Objekt --> OLE-InPlace
                            case SwWrtShell::SEL_OLE:
                                if (!rSh.IsSelObjProtected(FLYPROTECT_CONTENT))
                                {
                                    RstMBDownFlags();
                                    rSh.LaunchOLEObj();
                                }
                                return;

                            case SwWrtShell::SEL_FRM:
                                RstMBDownFlags();
                                GetView().GetViewFrame()->GetDispatcher()->Execute(
                                    FN_FORMAT_FRAME_DLG, SFX_CALLMODE_RECORD|SFX_CALLMODE_SLOT);
                                return;

                            case SwWrtShell::SEL_DRW:
                                RstMBDownFlags();
                                EnterDrawTextMode(aDocPos);
                                if ( rView.GetCurShell()->ISA(SwDrawTextShell) )
                                    ((SwDrawTextShell*)rView.GetCurShell())->Init();
                                return;
                        }

                        //falls die Cursorposition korrigiert wurde oder
                        // ein Fly im ReadOnlyModus selektiert ist,
                        //keine Wortselektion.
                        if ( !bValidCrsrPos ||
                            (rSh.IsFrmSelected() && rSh.IsFrmSelected() ))
                            return;

                        SwField *pFld;
                        BOOL bFtn = FALSE;

                        if( !bIsDocReadOnly &&
                            ( 0 != ( pFld = rSh.GetCurFld() ) ||
                              0 != ( bFtn = rSh.GetCurFtn() )) )
                        {
                            RstMBDownFlags();
                            if( bFtn )
                                GetView().GetViewFrame()->GetDispatcher()->Execute( FN_EDIT_FOOTNOTE );
                            else
                            {
                                USHORT nTypeId = pFld->GetTypeId();
                                SfxViewFrame* pVFrame = GetView().GetViewFrame();
                                switch( nTypeId )
                                {
                                case TYP_POSTITFLD:
                                case TYP_SCRIPTFLD:
                                {
                                    //falls es ein Readonly-Bereich ist, dann muss der Status
                                    //enabled werden
                                    USHORT nSlot = TYP_POSTITFLD == nTypeId ? FN_POSTIT : FN_JAVAEDIT;
                                    SfxBoolItem aItem(nSlot, TRUE);
                                    pVFrame->GetBindings().SetState(aItem);
                                    pVFrame->GetDispatcher()->Execute(nSlot);
                                    break;
                                }
                                case TYP_AUTHORITY :
                                    pVFrame->GetDispatcher()->Execute(FN_EDIT_AUTH_ENTRY_DLG);
                                break;
                                default:
                                    pVFrame->GetBindings().Execute(FN_EDIT_FIELD);
                                }
                            }
                            return;
                        }
                        //im Extended Mode hat Doppel- und
                        //Dreifachklick keine Auswirkungen.
                        if ( rSh.IsExtMode() )
                            return;

                        //Wort selektieren, gfs. Additional Mode
                        if ( KEY_MOD1 == rMEvt.GetModifier() && !rSh.IsAddMode() )
                        {
                            rSh.EnterAddMode();
                            rSh.SelWrd( &aDocPos );
                            rSh.LeaveAddMode();
                        }
                        else
                            rSh.SelWrd( &aDocPos );
                        bHoldSelection = TRUE;
                        return;
                    }
                    case 3:
                        bFrmDrag = FALSE;
                        //im Extended Mode hat Doppel- und
                        //Dreifachklick keine Auswirkungen.
                        if ( rSh.IsExtMode() )
                            return;

                        //falls die Cursorposition korrigiert wurde oder
                        // ein Fly im ReadOnlyModus selektiert ist,
                        //keine Wortselektion.
                        if ( !bValidCrsrPos || rSh.IsFrmSelected() )
                            return;

                        //Zeile selektieren, gfs. Additional Mode
                        if ( KEY_MOD1 == rMEvt.GetModifier() && !rSh.IsAddMode())
                        {
                            rSh.EnterAddMode();
                            rSh.SelLine( &aDocPos );
                            rSh.LeaveAddMode();
                        }
                        else
                            rSh.SelLine( &aDocPos );
                        bHoldSelection = TRUE;
                        return;

                    default:
                        return;
                }
                /* no break */
            case MOUSE_LEFT + KEY_SHIFT:
            case MOUSE_LEFT + KEY_SHIFT + KEY_MOD1:
            {
                BOOL bLockView = bWasShdwCrsr;

                switch ( rMEvt.GetModifier() )
                {
                    case KEY_MOD1 + KEY_SHIFT:
                    {
                        if ( !bInsDraw && IsDrawObjSelectable( rSh, aDocPos ) )
                        {
                            rView.NoRotate();
                            rSh.HideCrsr();
                            if ( rSh.IsSelFrmMode() )
                                rSh.SelectObj(aDocPos, TRUE, TRUE);
                            else
                            {   if ( rSh.SelectObj( aDocPos, TRUE, TRUE ) )
                                {
                                    rSh.EnterSelFrmMode( &aDocPos );
                                    SwEditWin::nDDStartPosY = aDocPos.Y();
                                    SwEditWin::nDDStartPosX = aDocPos.X();
                                    bFrmDrag = TRUE;
                                    return;
                                }
                            }
                        }
                        else if( rSh.IsSelFrmMode() &&
                                 rSh.GetDrawView()->HitHandle( aDocPos,
                                                            *rSh.GetOut() ))
                        {
                            bFrmDrag = TRUE;
                            bNoInterrupt = FALSE;
                            return;
                        }
                    }
                    break;
                    case KEY_MOD1:
                    {
                        if ( !bInsDraw && IsDrawObjSelectable( rSh, aDocPos ) )
                        {
                            rView.NoRotate();
                            rSh.HideCrsr();
                            if ( rSh.IsSelFrmMode() )
                                rSh.SelectObj(aDocPos, FALSE, TRUE);
                            else
                            {   if ( rSh.SelectObj( aDocPos, FALSE, TRUE ) )
                                {
                                    rSh.EnterSelFrmMode( &aDocPos );
                                    SwEditWin::nDDStartPosY = aDocPos.Y();
                                    SwEditWin::nDDStartPosX = aDocPos.X();
                                    bFrmDrag = TRUE;
                                    return;
                                }
                            }
                        }
                        else if( rSh.IsSelFrmMode() &&
                                 rSh.GetDrawView()->HitHandle( aDocPos,
                                                            *rSh.GetOut() ))
                        {
                            bFrmDrag = TRUE;
                            bNoInterrupt = FALSE;
                            return;
                        }
                        else
                        {
                            if ( !rSh.IsAddMode() && !rSh.IsExtMode())
                            {
                                rSh.PushMode();
                                bModePushed = TRUE;
                                rSh.EnterAddMode();
                            }
                            bCallBase = FALSE;
                        }
                    }
                    break;
                    case KEY_SHIFT:
                    {
                        if ( !bInsDraw && IsDrawObjSelectable( rSh, aDocPos ) )
                        {
                            rView.NoRotate();
                            rSh.HideCrsr();
                            if ( rSh.IsSelFrmMode() )
                            {
                                rSh.SelectObj(aDocPos, TRUE);

                                const SdrMarkList& rMarkList = pSdrView->GetMarkList();
                                if (rMarkList.GetMark(0) == NULL)
                                {
                                    rSh.LeaveSelFrmMode();
                                    rView.AttrChangedNotify(&rSh);
                                    bFrmDrag = FALSE;
                                }
                            }
                            else
                            {   if ( rSh.SelectObj( aDocPos ) )
                                {
                                    rSh.EnterSelFrmMode( &aDocPos );
                                    SwEditWin::nDDStartPosY = aDocPos.Y();
                                    SwEditWin::nDDStartPosX = aDocPos.X();
                                    bFrmDrag = TRUE;
                                    return;
                                }
                            }
                        }
                        else
                        {
                            if ( rSh.IsSelFrmMode() &&
                                 rSh.IsInsideSelectedObj( aDocPos ) )
                            {
                                rSh.EnterSelFrmMode( &aDocPos );
                                SwEditWin::nDDStartPosY = aDocPos.Y();
                                SwEditWin::nDDStartPosX = aDocPos.X();
                                bFrmDrag = TRUE;
                                return;
                            }
                            if ( rSh.IsSelFrmMode() )
                            {
                                rSh.UnSelectFrm();
                                rSh.LeaveSelFrmMode();
                                rView.AttrChangedNotify(&rSh);
                                bFrmDrag = FALSE;
                            }
                            if ( !rSh.IsExtMode() )
                            {
                                // keine Selection anfangen, wenn in ein URL-
                                // Feld oder eine -Grafik geklickt wird
                                BOOL bSttSelect = rSh.HasSelection() ||
                                                Pointer(POINTER_REFHAND) != GetPointer();

                                if( !bSttSelect )
                                {
                                    bSttSelect = TRUE;
                                    if( bExecHyperlinks )
                                    {
                                        SwContentAtPos aCntntAtPos(
                                            SwContentAtPos::SW_FTN |
                                            SwContentAtPos::SW_INETATTR );

                                        if( rSh.GetContentAtPos( aDocPos, aCntntAtPos ) )
                                        {
                                            if( !rSh.IsViewLocked() &&
                                                !rSh.IsReadOnlyAvailable() &&
                                                aCntntAtPos.IsInProtectSect() )
                                                    bLockView = TRUE;

                                            bSttSelect = FALSE;
                                        }
                                        else if( rSh.IsURLGrfAtPos( aDocPos ))
                                            bSttSelect = FALSE;
                                    }
                                }

                                if( bSttSelect )
                                    rSh.SttSelect();
                            }
                        }
                        bCallBase = FALSE;
                        break;
                    }
                    default:
                        if( !rSh.IsViewLocked() )
                        {
                            SwContentAtPos aCntntAtPos( SwContentAtPos::SW_CLICKFIELD |
                                                        SwContentAtPos::SW_INETATTR );
                            if( rSh.GetContentAtPos( aDocPos, aCntntAtPos, FALSE ) &&
                                !rSh.IsReadOnlyAvailable() &&
                                aCntntAtPos.IsInProtectSect() )
                                bLockView = TRUE;
                        }
                }

                if ( rSh.IsGCAttr() )
                {
                    rSh.GCAttr();
                    rSh.ClearGCAttr();
                }

                BOOL bOverSelect = rSh.ChgCurrPam( aDocPos ), bOverURLGrf = FALSE;
                if( !bOverSelect )
                    bOverURLGrf = bOverSelect = 0 != rSh.IsURLGrfAtPos( aDocPos );

                if ( !bOverSelect )
                {
                    const BOOL bTmp = bNoInterrupt;
                    bNoInterrupt = FALSE;

                    if( !rSh.IsViewLocked() && bLockView )
                        rSh.LockView( TRUE );
                    else
                        bLockView = FALSE;

                    {   // nur temp. Move-Kontext aufspannen, da sonst die
                        // Abfrage auf die Inhaltsform nicht funktioniert!!!
                        MV_KONTEXT( &rSh );
                        bValidCrsrPos = !(CRSR_POSCHG & (rSh.*rSh.fnSetCrsr)(&aDocPos,bOnlyText));
                        bCallBase = FALSE;
                    }

                    if( bLockView )
                        rSh.LockView( FALSE );

                    bNoInterrupt = bTmp;
                }
                if( !bOverURLGrf )
                {
                    const int nSelType = rSh.GetSelectionType();
                    if( nSelType == SwWrtShell::SEL_OLE ||
                        nSelType == SwWrtShell::SEL_GRF )
                    {
                        MV_KONTEXT( &rSh );
                        if( !rSh.IsFrmSelected() )
                            rSh.GotoNextFly();
                        rSh.EnterSelFrmMode();
                        bCallBase = FALSE;
                    }
                }
                // nicht mehr hier zuruecksetzen, damit -- falls durch MouseMove
                // bei gedrueckter Ctrl-Taste eine Mehrfachselektion erfolgen soll,
                // im Drag nicht die vorherige Selektion aufgehoben wird.
//              if(bModePushed)
//                  rSh.PopMode(FALSE);
                break;
            }
        }
    }
    if (bCallBase)
        Window::MouseButtonDown(rMEvt);
}

#pragma optimize("",off)

/*--------------------------------------------------------------------
    Beschreibung:   MouseMove
 --------------------------------------------------------------------*/


void SwEditWin::MouseMove(const MouseEvent& rMEvt)
{
    // solange eine Action laeuft sollte das MouseMove abgeklemmt sein
    // Ansonsten gibt es den Bug 40102
    SwWrtShell &rSh = rView.GetWrtShell();
    if( rSh.ActionPend() )
        return ;

    if( pShadCrsr && 0 != (rMEvt.GetModifier() + rMEvt.GetButtons() ) )
        delete pShadCrsr, pShadCrsr = 0;

    BOOL bIsDocReadOnly = rView.GetDocShell()->IsReadOnly();

    SET_CURR_SHELL( &rSh );

    //aPixPt == Point in Pixel, rel. zu ChildWin
    //aDocPt == Point in Twips, Dokumentkoordinaten
    const Point aPixPt( rMEvt.GetPosPixel() );
    const Point aDocPt( PixelToLogic( aPixPt ) );

    if ( IsChainMode() )
    {
        UpdatePointer( aDocPt, rMEvt.GetModifier() );
        if ( rMEvt.IsLeaveWindow() )
            rView.GetViewFrame()->HideStatusText();
        return;
    }

    SdrView *pSdrView = rSh.GetDrawView();

    const SwCallMouseEvent aLastCallEvent( aSaveCallEvent );
    aSaveCallEvent.Clear();

    if ( !bIsDocReadOnly && pSdrView && pSdrView->MouseMove(rMEvt,this) )
    {
        SetPointer( POINTER_TEXT );
        return; // Event von der SdrView ausgewertet
    }

    const Point aOldPt( rSh.VisArea().Pos() );
    const BOOL bInsWin = rSh.VisArea().IsInside( aDocPt );

    if( pShadCrsr && !bInsWin )
        delete pShadCrsr, pShadCrsr = 0;

    // Position ist noetig fuer OS/2, da dort nach einem MB-Down
    // offensichtlich sofort ein MB-Move gerufen wird.
    if( bDDTimerStarted )
    {
        Point aDD( SwEditWin::nDDStartPosX, SwEditWin::nDDStartPosY );
        aDD = LogicToPixel( aDD );
        Rectangle aRect( aDD.X()-3, aDD.Y()-3, aDD.X()+3, aDD.Y()+3 );
        if ( !aRect.IsInside( aPixPt ) )    // MA 23. May. 95: Tatterschutz.
            StopDDTimer( &rSh, aDocPt );
    }

    if ( bInsDraw && rView.GetDrawFuncPtr() )
    {
        rView.GetDrawFuncPtr()->MouseMove( rMEvt );
        if ( !bInsWin )
        {
            Point aTmp( aDocPt );
            aTmp += rSh.VisArea().Pos() - aOldPt;
            LeaveArea( aTmp );
        }
        else
            EnterArea();
        return;
    }

    if( !bIsDocReadOnly && bInsWin && !pApplyTempl && !rSh.IsInSelect() &&
         rSh.IsMouseTabCol( aDocPt ) && !rSh.IsTableMode())
    {
        //Zuppeln von Tabellenspalten aus dem Dokument heraus.
        SetPointer( POINTER_HSIZEBAR );
        return;
    }

    BOOL bDelShadCrsr = TRUE;

    switch ( rMEvt.GetModifier() + rMEvt.GetButtons() )
    {
        case MOUSE_LEFT:
            if( pAnchorMarker )
            {
                Point aNew = rSh.FindAnchorPos( aDocPt );
                if( aNew.X() || aNew.Y() )
                {
                    pAnchorMarker->SetPos( aNew );
                    pAnchorMarker->SetLastPos( aDocPt );
                    pSdrView->RefreshAllIAOManagers();
                }
            }
            if ( bInsDraw )
            {
                if ( !bMBPressed )
                    break;
                if ( bIsInMove || IsMinMove( aStartPos, aPixPt ) )
                {
                    if ( !bInsWin )
                        LeaveArea( aDocPt );
                    else
                        EnterArea();
                    if ( rView.GetDrawFuncPtr() )
                    {
                        pSdrView->SetOrtho(FALSE);
                        rView.GetDrawFuncPtr()->MouseMove( rMEvt );
                    }
                    bIsInMove = TRUE;
                }
                return;
            }
        case MOUSE_LEFT + KEY_SHIFT:
        case MOUSE_LEFT + KEY_SHIFT + KEY_MOD1:
            if ( !bMBPressed )
                break;
        case MOUSE_LEFT + KEY_MOD1:
            if ( bFrmDrag && rSh.IsSelFrmMode() )
            {
                if( !bMBPressed )
                    break;

                if ( bIsInMove || IsMinMove( aStartPos, aPixPt ) )
                {
                    // Event-Verarbeitung fuers Resizen
                    if( pSdrView->HasMarkedObj() )
                    {
                        const SwFrmFmt* pFlyFmt;
                        const SvxMacro* pMacro;

                        const Point aSttPt( PixelToLogic( aStartPos ) );

                        // geht es los?
                        if( HDL_USER == eSdrMoveHdl )
                        {
                            SdrHdl* pHdl = pSdrView->HitHandle( aSttPt, *this );
                            eSdrMoveHdl = pHdl ? pHdl->GetKind() : HDL_MOVE;
                        }

                        USHORT nEvent = HDL_MOVE == eSdrMoveHdl
                                            ? SW_EVENT_FRM_MOVE
                                            : SW_EVENT_FRM_RESIZE;

                        if( 0 != ( pFlyFmt = rSh.GetFlyFrmFmt() ) &&
                            0 != ( pMacro = pFlyFmt->GetMacro().GetMacroTable().
                            Get( nEvent )) &&
// oder nur z.B. alle 20 Twip bescheid sagen?
//                          ( 20 > Abs( aRszMvHdlPt.X() - aDocPt.X() ) ||
//                            20 > Abs( aRszMvHdlPt.Y() - aDocPt.Y() ) )
                            aRszMvHdlPt != aDocPt )
                        {
                            aRszMvHdlPt = aDocPt;
                            USHORT nPos = 0;
                            String sRet;
                            SbxArrayRef xArgs = new SbxArray;
                            SbxVariableRef xVar = new SbxVariable;
                            xVar->PutString( pFlyFmt->GetName() );
                            xArgs->Put( &xVar, ++nPos );

                            if( SW_EVENT_FRM_RESIZE == nEvent )
                            {
                                xVar = new SbxVariable;
                                xVar->PutUShort( eSdrMoveHdl );
                                xArgs->Put( &xVar, ++nPos );
                            }

                            xVar = new SbxVariable;
                            xVar->PutLong( aDocPt.X() - aSttPt.X() );
                            xArgs->Put( &xVar, ++nPos );
                            xVar = new SbxVariable;
                            xVar->PutLong( aDocPt.Y() - aSttPt.Y() );
                            xArgs->Put( &xVar, ++nPos );

                            ReleaseMouse();

                            rSh.ExecMacro( *pMacro, &sRet, &xArgs );

                            CaptureMouse();

                            if( sRet.Len() && 0 != sRet.ToInt32() )
                                return ;
                        }
                    }
                    // Event-Verarbeitung fuers Resizen

                    if( bIsDocReadOnly )
                        break;

                    if ( rMEvt.IsShift() )
                    {
                        pSdrView->SetOrtho(TRUE);
                        pSdrView->SetAngleSnapEnabled(TRUE);
                    }
                    else
                    {
                        pSdrView->SetOrtho(FALSE);
                        pSdrView->SetAngleSnapEnabled(FALSE);
                    }

                    (rSh.*rSh.fnDrag)( &aDocPt, rMEvt.IsShift() );
                    bIsInMove = TRUE;
                }
                else if( bIsDocReadOnly )
                    break;

                if ( !bInsWin )
                {
                    Point aTmp( aDocPt );
                    aTmp += rSh.VisArea().Pos() - aOldPt;
                    LeaveArea( aTmp );
                }
                else if(bIsInMove)
                    EnterArea();
                return;
            }
            if ( !rSh.IsSelFrmMode() && !bDDINetAttr &&
                (IsMinMove( aStartPos,aPixPt ) || bIsInMove) &&
                (rSh.IsInSelect() || !rSh.ChgCurrPam( aDocPt )) )
            {
                if ( pSdrView )
                {
                    if ( rMEvt.IsShift() )
                        pSdrView->SetOrtho(TRUE);
                    else
                        pSdrView->SetOrtho(FALSE);
                }
                if ( !bInsWin )
                {
                    Point aTmp( aDocPt );
                    aTmp += rSh.VisArea().Pos() - aOldPt;
                    LeaveArea( aTmp );
                }
                else
                {
                    //JP 24.09.98: Fix fuer die Bugs 55592 / 55931
                    //JP 23.04.99: Fix fuer den Bugs 65289
                    //JP 06.07.99: Fix fuer den Bugs 67360
                    if( !rMEvt.IsSynthetic() &&
                            !(( MOUSE_LEFT + KEY_MOD1 ==
                            rMEvt.GetModifier() + rMEvt.GetButtons() ) &&
                            rSh.Is_FnDragEQBeginDrag() && !rSh.IsAddMode() ))
                    {
                        (rSh.*rSh.fnDrag)( &aDocPt,FALSE );

                        bValidCrsrPos = !(CRSR_POSCHG & (rSh.*rSh.fnSetCrsr)(&aDocPt,FALSE));
                        EnterArea();
                    }
                }
            }
            bDDINetAttr = FALSE;
            break;
        case 0:
            if ( pApplyTempl )
            {
                UpdatePointer(aDocPt, 0); // evtl. muss hier ein Rahmen markiert werden
                break;
            }
        case KEY_SHIFT:
        case KEY_MOD2:
        case KEY_MOD1:
            if ( !bInsDraw )
            {
                BOOL bTstShdwCrsr = TRUE;

                UpdatePointer( aDocPt, rMEvt.GetModifier() );

                const SwFrmFmt* pFmt;
                const SwFmtINetFmt* pINet = 0;
                SwContentAtPos aCntntAtPos( SwContentAtPos::SW_INETATTR );
                if( rSh.GetContentAtPos( aDocPt, aCntntAtPos ) )
                    pINet = (SwFmtINetFmt*)aCntntAtPos.aFnd.pAttr;

                const void* pTmp = pINet;

                if( pINet ||
                    0 != ( pTmp = pFmt = rSh.GetFmtFromAnyObj( aDocPt )))
                {
                    bTstShdwCrsr = FALSE;
                    if( pTmp == pINet )
                        aSaveCallEvent.Set( pINet );
                    else
                    {
                        IMapObject* pIMapObj = pFmt->GetIMapObject( aDocPt );
                        if( pIMapObj )
                            aSaveCallEvent.Set( pFmt, pIMapObj );
                        else
                            aSaveCallEvent.Set( EVENT_OBJECT_URLITEM, pFmt );
                    }

                    // sollte wir ueber einem InternetFeld mit einem
                    // gebundenen Macro stehen?
                    if( aSaveCallEvent != aLastCallEvent )
                    {
                        if( aLastCallEvent.HasEvent() )
                            rSh.CallEvent( SFX_EVENT_MOUSEOUT_OBJECT,
                                            aLastCallEvent, TRUE );
                        // 0 besagt, das das Object gar keine Tabelle hat
                        if( !rSh.CallEvent( SFX_EVENT_MOUSEOVER_OBJECT,
                                        aSaveCallEvent ))
                            aSaveCallEvent.Clear();
                    }
                }
                else if( aLastCallEvent.HasEvent() )
                {
                    // Cursor stand auf einem Object
                    rSh.CallEvent( SFX_EVENT_MOUSEOUT_OBJECT,
                                    aLastCallEvent, TRUE );
                }

                if( bTstShdwCrsr && bInsWin && !bIsDocReadOnly &&
                    !bInsFrm && !rSh.IsBrowseMode() &&
                    rSh.GetViewOptions()->IsShadowCursor() &&
                    !(rMEvt.GetModifier() + rMEvt.GetButtons()) &&
                    !rSh.HasSelection() && !GetConnectMetaFile() )
                {
                    SwRect aRect;
                    SwHoriOrient eOrient;
                    SwFillMode eMode = (SwFillMode)rSh.GetViewOptions()->GetShdwCrsrFillMode();
                    if( rSh.GetShadowCrsrPos( aDocPt, eMode, aRect, eOrient ))
                    {
                        if( !pShadCrsr )
                            pShadCrsr = new SwShadowCursor( *this,
                                rSh.GetViewOptions()->GetShdwCrsrColor() );
                        if( HORI_RIGHT != eOrient && HORI_CENTER != eOrient )
                            eOrient = HORI_LEFT;
                        pShadCrsr->SetPos( aRect.Pos(), aRect.Height(), eOrient );
                        bDelShadCrsr = FALSE;
                    }
                }
            }
            break;
    }

    if( bDelShadCrsr && pShadCrsr )
        delete pShadCrsr, pShadCrsr = 0;
    bWasShdwCrsr = FALSE;
}

/*--------------------------------------------------------------------
    Beschreibung:   Button Up
 --------------------------------------------------------------------*/


void SwEditWin::MouseButtonUp(const MouseEvent& rMEvt)
{
    BOOL bCallBase = TRUE;

    BOOL bCallShadowCrsr = bWasShdwCrsr;
    bWasShdwCrsr = FALSE;
    if( pShadCrsr )
        delete pShadCrsr, pShadCrsr = 0;

    SdrHdlKind eOldSdrMoveHdl = eSdrMoveHdl;
    eSdrMoveHdl = HDL_USER;     // fuer die MoveEvents - wieder zuruecksetzen

    // sicherheitshalber zuruecksetzen Bug 27900
    rView.SetTabColFromDoc( FALSE );
    SwWrtShell &rSh = rView.GetWrtShell();
    SET_CURR_SHELL( &rSh );
    SdrView *pSdrView = rSh.GetDrawView();
    if ( pSdrView )
    {
        pSdrView->SetOrtho(FALSE);

        if ( pSdrView->MouseButtonUp( rMEvt,this ) )
        {
            rSh.GetView().GetViewFrame()->GetBindings().InvalidateAll(FALSE);
            return; // Event von der SdrView ausgewertet
        }
    }
    //MouseButtonUp nur bearbeiten, wenn auch das Down an dieses Fenster ging.
    if ( !bMBPressed )
    {
// OS 25.02.97 Undo fuer die Giesskann ist bereits im CommandHdl
//JP 29.09.95: so sollte es sein!!!     if(pApplyTempl->bUndo)
//      if( pApplyTempl && MOUSE_RIGHT == rMEvt.GetModifier() + rMEvt.GetButtons() )
//          rSh.Do( SwWrtShell::UNDO );
        return;
    }

    Point aDocPt( PixelToLogic( rMEvt.GetPosPixel() ) );

    if ( bDDTimerStarted )
    {
        StopDDTimer( &rSh, aDocPt );
        bMBPressed = FALSE;
        if ( rSh.IsSelFrmMode() )
        {
            (rSh.*rSh.fnEndDrag)( &aDocPt, FALSE );
            bFrmDrag = FALSE;
        }
        bNoInterrupt = FALSE;
        ReleaseMouse();
        return;
    }

    if( pAnchorMarker )
    {
        Point aPnt( pAnchorMarker->GetLastPos() );
        pSdrView->RefreshAllIAOManagers();
        DELETEZ( pAnchorMarker );
        if( aPnt.X() || aPnt.Y() )
            rSh.FindAnchorPos( aPnt, TRUE );
    }
    if ( bInsDraw && rView.GetDrawFuncPtr() )
    {
        if ( rView.GetDrawFuncPtr()->MouseButtonUp( rMEvt ) )
        {
            if (rView.GetDrawFuncPtr()) // Koennte im MouseButtonUp zerstoert worden sein
            {
                rView.GetDrawFuncPtr()->Deactivate();

                if (!rView.IsDrawMode())
                    rView.SetDrawFuncPtr(NULL);
            }

            if ( rSh.IsObjSelected() )
            {
                rSh.EnterSelFrmMode();
                if (!rView.GetDrawFuncPtr())
                    StdDrawMode(SID_OBJECT_SELECT);
            }
            else if ( rSh.IsFrmSelected() )
            {
                rSh.EnterSelFrmMode();
                StopInsFrm();
            }
            else
            {
                const Point aDocPos( PixelToLogic( aStartPos ) );
                bValidCrsrPos = !(CRSR_POSCHG & (rSh.*rSh.fnSetCrsr)(&aDocPos,FALSE));
                rSh.Edit();
            }

            rView.AttrChangedNotify( &rSh );
        }
        else if (rMEvt.GetButtons() == MOUSE_RIGHT && rSh.IsDrawCreate())
            rView.GetDrawFuncPtr()->BreakCreate();   // Zeichnen abbrechen

        bNoInterrupt = FALSE;
        ReleaseMouse();
        return;
    }
    BOOL bPopMode = FALSE;
    switch ( rMEvt.GetModifier() + rMEvt.GetButtons() )
    {
        case MOUSE_LEFT:
            if ( bInsDraw && rSh.IsDrawCreate() )
            {
                if ( rView.GetDrawFuncPtr() && rView.GetDrawFuncPtr()->MouseButtonUp(rMEvt) == TRUE )
                {
                    rView.GetDrawFuncPtr()->Deactivate();
                    rView.AttrChangedNotify( &rSh );
                    if ( rSh.IsObjSelected() )
                        rSh.EnterSelFrmMode();
                    if ( rView.GetDrawFuncPtr() && bInsFrm )
                        StopInsFrm();
                }
                bCallBase = FALSE;
                break;
            }
        case MOUSE_LEFT + KEY_MOD1:
        case MOUSE_LEFT + KEY_MOD2:
        case MOUSE_LEFT + KEY_SHIFT + KEY_MOD1:
            if ( bFrmDrag && rSh.IsSelFrmMode() )
            {
                if ( rMEvt.IsMod1() ) //Kopieren und nicht moven.
                {
                    //Drag abbrechen, statt dessen internes Copy verwenden
                    Rectangle aRect;
                    rSh.GetDrawView()->TakeActionRect( aRect );
                    if (!aRect.IsEmpty())
                    {
                        rSh.BreakDrag();
                        Point aEndPt, aSttPt;
                        if ( rSh.GetSelFrmType() & FRMTYPE_FLY_ATCNT )
                        {
                            aEndPt = aRect.TopLeft();
                            aSttPt = rSh.GetDrawView()->GetAllMarkedRect().TopLeft();
                        }
                        else
                        {
                            aEndPt = aRect.Center();
                            aSttPt = rSh.GetDrawView()->GetAllMarkedRect().Center();
                        }
                        if ( aSttPt != aEndPt )
                        {
                            rSh.StartUndo( UIUNDO_DRAG_AND_COPY );
                            rSh.Copy(&rSh, aSttPt, aEndPt, FALSE);
                            rSh.EndUndo( UIUNDO_DRAG_AND_COPY );
                        }
                    }
                    else
                        (rSh.*rSh.fnEndDrag)( &aDocPt,FALSE );
                }
                else
                {
                    {
                        const SwFrmFmt* pFlyFmt;
                        const SvxMacro* pMacro;

                        USHORT nEvent = HDL_MOVE == eOldSdrMoveHdl
                                            ? SW_EVENT_FRM_MOVE
                                            : SW_EVENT_FRM_RESIZE;

                        if( 0 != ( pFlyFmt = rSh.GetFlyFrmFmt() ) &&
                            0 != ( pMacro = pFlyFmt->GetMacro().GetMacroTable().
                            Get( nEvent )) )
                        {
                            const Point aSttPt( PixelToLogic( aStartPos ) );
                            aRszMvHdlPt = aDocPt;
                            USHORT nPos = 0;
                            SbxArrayRef xArgs = new SbxArray;
                            SbxVariableRef xVar = new SbxVariable;
                            xVar->PutString( pFlyFmt->GetName() );
                            xArgs->Put( &xVar, ++nPos );

                            if( SW_EVENT_FRM_RESIZE == nEvent )
                            {
                                xVar = new SbxVariable;
                                xVar->PutUShort( eOldSdrMoveHdl );
                                xArgs->Put( &xVar, ++nPos );
                            }

                            xVar = new SbxVariable;
                            xVar->PutLong( aDocPt.X() - aSttPt.X() );
                            xArgs->Put( &xVar, ++nPos );
                            xVar = new SbxVariable;
                            xVar->PutLong( aDocPt.Y() - aSttPt.Y() );
                            xArgs->Put( &xVar, ++nPos );

                            xVar = new SbxVariable;
                            xVar->PutUShort( 1 );
                            xArgs->Put( &xVar, ++nPos );

                            ReleaseMouse();

                            rSh.ExecMacro( *pMacro, 0, &xArgs );

                            CaptureMouse();
                        }
                    }
                    (rSh.*rSh.fnEndDrag)( &aDocPt,FALSE );
                }
                bFrmDrag = FALSE;
                bCallBase = FALSE;
                break;
            }
            bPopMode = TRUE;
            // no break
        case MOUSE_LEFT + KEY_SHIFT:
            if (rSh.IsSelFrmMode())
            {

                (rSh.*rSh.fnEndDrag)( &aDocPt, FALSE );
                bFrmDrag = FALSE;
                bCallBase = FALSE;
                break;
            }

            if( bHoldSelection )
            {
                //JP 27.04.99: Bug 65389 - das EndDrag sollte auf jedenfall
                //              gerufen werden.
                bHoldSelection = FALSE;
                (rSh.*rSh.fnEndDrag)( &aDocPt, FALSE );
            }
            else
            {
                if ( !rSh.IsInSelect() && rSh.ChgCurrPam( aDocPt ) )
                {
                    const BOOL bTmp = bNoInterrupt;
                    bNoInterrupt = FALSE;
                    {   // nur temp. Move-Kontext aufspannen, da sonst die
                        // Abfrage auf die Inhaltsform nicht funktioniert!!!
                        MV_KONTEXT( &rSh );
                        const Point aDocPos( PixelToLogic( aStartPos ) );
                        bValidCrsrPos = !(CRSR_POSCHG & (rSh.*rSh.fnSetCrsr)(&aDocPos,FALSE));
                    }
                    bNoInterrupt = bTmp;

                }
                else
                {
                    BOOL bInSel = rSh.IsInSelect();
                    (rSh.*rSh.fnEndDrag)( &aDocPt, FALSE );

                    // Internetfield? --> Link-Callen (DocLaden!!)
//JP 18.10.96: Bug 32437 -
//                  if( !rSh.HasSelection() )
                    if( !bInSel )
                    {
                        USHORT nFilter = KEY_SHIFT == rMEvt.GetModifier()
                                        ? URLLOAD_DOWNLOADFILTER
                                        : URLLOAD_NOFILTER;
                        if( KEY_MOD1 == rMEvt.GetModifier() )
                            nFilter |= URLLOAD_NEWVIEW;

                        BOOL bExecHyperlinks = rSh.GetViewOptions()->IsExecHyperlinks()^
                                               (rMEvt.GetModifier() == KEY_MOD2 ? TRUE : FALSE);
                        if(pApplyTempl)
                            bExecHyperlinks = FALSE;
                        SwContentAtPos aCntntAtPos( SwContentAtPos::SW_CLICKFIELD |
                                                    SwContentAtPos::SW_INETATTR );

                        if( rSh.GetContentAtPos( aDocPt, aCntntAtPos, TRUE ) )
                        {
                            BOOL bViewLocked = rSh.IsViewLocked();
                            if( !bViewLocked && !rSh.IsReadOnlyAvailable() &&
                                aCntntAtPos.IsInProtectSect() )
                                rSh.LockView( TRUE );

                            ReleaseMouse();
                            if( SwContentAtPos::SW_FIELD == aCntntAtPos.eCntntAtPos )
                            {
                                if( bExecHyperlinks )
                                    rSh.ClickToField( *aCntntAtPos.aFnd.pFld, nFilter );
                            }
                            else if( bExecHyperlinks )
                            {
                                rSh.ClickToINetAttr( *(SwFmtINetFmt*)
                                        aCntntAtPos.aFnd.pAttr, nFilter );
                            }
                            rSh.LockView( bViewLocked );
                            bCallShadowCrsr = FALSE;
                        }
                        else if( bExecHyperlinks )
                        {
                            aCntntAtPos = SwContentAtPos( SwContentAtPos::SW_FTN );
                            if( !rSh.GetContentAtPos( aDocPt, aCntntAtPos, TRUE ) )
                            {
                                SdrViewEvent aVEvt;

                                if (pSdrView)
                                    pSdrView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt);

                                if (pSdrView && aVEvt.eEvent == SDREVENT_EXECUTEURL)
                                {
                                    // URL-Feld getroffen
                                    const SvxURLField *pField = aVEvt.pURLField;
                                    if (pField)
                                    {
                                        String sURL(pField->GetURL());
                                        String sTarget(pField->GetTargetFrame());
                                        ::LoadURL( sURL, &rSh, nFilter, &sTarget);
                                    }
                                    bCallShadowCrsr = FALSE;
                                }
                                else
                                {
                                    // Grafik getroffen
                                    ReleaseMouse();
                                    if( rSh.ClickToINetGrf( aDocPt, nFilter ))
                                        bCallShadowCrsr = FALSE;
                                }
                            }
                        }

                        if( bCallShadowCrsr &&
                            rSh.GetViewOptions()->IsShadowCursor() &&
                            MOUSE_LEFT == (rMEvt.GetModifier() + rMEvt.GetButtons()) &&
                            !rSh.HasSelection() &&
                            !GetConnectMetaFile() &&
                            rSh.VisArea().IsInside( aDocPt ))
                        {
                            if( UNDO_INS_FROM_SHADOWCRSR == rSh.GetUndoIds() )
                                rSh.Undo();
                            SwFillMode eMode = (SwFillMode)rSh.GetViewOptions()->GetShdwCrsrFillMode();
                            rSh.SetShadowCrsrPos( aDocPt, eMode );
                        }
                    }
                }
                bCallBase = FALSE;

            }

            // gfs. im Down gepushten Mode wieder zuruecksetzen
            if ( bPopMode && bModePushed )
            {
                rSh.PopMode();
                bModePushed = FALSE;
                bCallBase = FALSE;
            }
            break;

        default:
            ReleaseMouse();
            return;
    }

    if( pApplyTempl )
    {
        int eSelection = rSh.GetSelectionType();
        if( pApplyTempl->nColor )
        {
            USHORT nId = 0;
            switch( pApplyTempl->nColor )
            {
                case SID_ATTR_CHAR_COLOR_EXT:
                    nId = RES_CHRATR_COLOR;
                break;
                case SID_ATTR_CHAR_COLOR_BACKGROUND_EXT:
                    nId = RES_CHRATR_BACKGROUND;
                break;
            }
            if( nId && (SwWrtShell::SEL_TXT|SwWrtShell::SEL_TBL) & eSelection)
            {
                if( rSh.IsSelection() && !rSh.HasReadonlySel() )
                {
                    if(nId == RES_CHRATR_BACKGROUND)
                    {
                        Color aColor( COL_TRANSPARENT  );
                        if( !SwEditWin::bTransparentBackColor )
                            aColor = SwEditWin::aTextBackColor;
                        rSh.SetAttr( SvxBrushItem( aColor, nId ) );
                    }
                    else
                        rSh.SetAttr( SvxColorItem(SwEditWin::aTextColor, nId) );
                    rSh.UnSetVisCrsr();
                    rSh.EnterStdMode();
                    rSh.SetVisCrsr(aDocPt);

                    pApplyTempl->bUndo = TRUE;
                    bCallBase = FALSE;
                    aTemplateTimer.Stop();
                }
                else if(rMEvt.GetClicks() == 1)
                {
                    // keine Selektion -> also Giesskanne abschalten
                    aTemplateTimer.Start();
                }
            }
        }
        else
        {
            switch ( pApplyTempl->eType )
            {
                case SFX_STYLE_FAMILY_PARA:
                    if( (( SwWrtShell::SEL_TXT | SwWrtShell::SEL_TBL )
                         & eSelection ) && !rSh.HasReadonlySel() )
                    {
                        rSh.SetTxtFmtColl( pApplyTempl->aColl.pTxtColl );
                        pApplyTempl->bUndo = TRUE;
                        bCallBase = FALSE;
                    }
                    break;
                case SFX_STYLE_FAMILY_CHAR:
                    if( (( SwWrtShell::SEL_TXT | SwWrtShell::SEL_TBL )
                         & eSelection ) && !rSh.HasReadonlySel() )
                    {
                        rSh.SetAttr( SwFmtCharFmt(pApplyTempl->aColl.pCharFmt) );
                        rSh.UnSetVisCrsr();
                        rSh.EnterStdMode();
                        rSh.SetVisCrsr(aDocPt);
                        pApplyTempl->bUndo = TRUE;
                        bCallBase = FALSE;
                    }
                    break;
                case SFX_STYLE_FAMILY_FRAME :
                {
                    const SwFrmFmt* pFmt = rSh.GetFmtFromObj( aDocPt );
                    if(PTR_CAST(SwFlyFrmFmt, pFmt))
                    {
                        rSh.SetFrmFmt( pApplyTempl->aColl.pFrmFmt, FALSE, &aDocPt );
                        pApplyTempl->bUndo = TRUE;
                        bCallBase = FALSE;
                    }
                    break;
                }
                case SFX_STYLE_FAMILY_PAGE:
                            // Kein Undo bei Seitenvorlagen
                    rSh.ChgCurPageDesc( *pApplyTempl->aColl.pPageDesc );
                    bCallBase = FALSE;
                    break;
                case SFX_STYLE_FAMILY_PSEUDO:
                    if( !rSh.HasReadonlySel() )
                    {
                        rSh.SetCurNumRule( *pApplyTempl->aColl.pNumRule );
                        bCallBase = FALSE;
                        pApplyTempl->bUndo = TRUE;
                    }
                    break;
            }
        }

    }
    ReleaseMouse();
    // Hier kommen nur verarbeitete MouseEvents an; nur bei diesen duerfen
    // die Modi zurueckgesetzt werden.
    bMBPressed = FALSE;

    //sicherheitshalber aufrufen, da jetzt das Selektieren bestimmt zu Ende ist.
    //Andernfalls koennte der Timeout des Timers Kummer machen.
    EnterArea();
    bNoInterrupt = FALSE;

    if (bCallBase)
        Window::MouseButtonUp(rMEvt);
}


/*--------------------------------------------------------------------
    Beschreibung:   Vorlage anwenden
 --------------------------------------------------------------------*/


void SwEditWin::SetApplyTemplate(const SwApplyTemplate &rTempl)
{
    static BOOL bIdle = FALSE;
    DELETEZ(pApplyTempl);
    SwWrtShell &rSh = rView.GetWrtShell();

    if(rTempl.nColor)
    {
        pApplyTempl = new SwApplyTemplate( rTempl );
        SetPointer( POINTER_FILL );
        rSh.NoEdit( FALSE );
        bIdle = rSh.GetViewOptions()->IsIdle();
        ((SwViewOption *)rSh.GetViewOptions())->SetIdle( FALSE );
    }
    else if( rTempl.eType )
    {
        pApplyTempl = new SwApplyTemplate( rTempl );
        SetPointer( POINTER_FILL  );
        rSh.NoEdit( FALSE );
        bIdle = rSh.GetViewOptions()->IsIdle();
        ((SwViewOption *)rSh.GetViewOptions())->SetIdle( FALSE );
    }
    else
    {
        SetPointer( POINTER_TEXT );
        rSh.UnSetVisCrsr();

        ((SwViewOption *)rSh.GetViewOptions())->SetIdle( bIdle );
        if ( !rSh.IsSelFrmMode() )
            rSh.Edit();
    }

    static USHORT __READONLY_DATA aInva[] =
    {
        SID_STYLE_WATERCAN,
        SID_ATTR_CHAR_COLOR_EXT,
        SID_ATTR_CHAR_COLOR_BACKGROUND_EXT,
        0
    };
    rView.GetViewFrame()->GetBindings().Invalidate(aInva);
}

/*--------------------------------------------------------------------
    Beschreibung:   ctor
 --------------------------------------------------------------------*/


SwEditWin::SwEditWin(Window *pParent, SwView &rMyView):
    Window(pParent, WinBits(WB_CLIPCHILDREN | WB_DIALOGCONTROL)),
    aActHitType(SDRHIT_NONE),
    eDrawMode(OBJ_NONE),
    pApplyTempl(0),
    rView( rMyView ),
    pAnchorMarker( 0 ),
    pUserMarker( 0 ),
    pUserMarkerObj( 0 ),
    pShadCrsr( 0 ),
    nDropAction( 0 ),
    nDropFormat( 0 ),
    nDropDestination( 0 ),
    nInsFrmColCount( 1 ),
    bLockInput(FALSE)
{
    SetHelpId(HID_EDIT_WIN);
    EnableChildTransparentMode();
    SetDialogControlFlags( WINDOW_DLGCTRL_RETURN | WINDOW_DLGCTRL_WANTFOCUS );

    bLinkRemoved = bMBPressed = bInsDraw = bInsFrm = bGrfToOle =
    bIsInDrag = bOldIdle = bOldIdleSet = bChainMode = bWasShdwCrsr = FALSE;

    SetMapMode(MapMode(MAP_TWIP));

    SetPointer( POINTER_TEXT );
    aTimer.SetTimeoutHdl(LINK(this, SwEditWin, TimerHandler));
    EnableDrop();

    bTblInsDelMode = FALSE;
    aKeyInputTimer.SetTimeout( 3000 );
    aKeyInputTimer.SetTimeoutHdl(LINK(this, SwEditWin, KeyInputTimerHandler));

    aKeyInputFlushTimer.SetTimeout( 200 );
    aKeyInputFlushTimer.SetTimeoutHdl(LINK(this, SwEditWin, KeyInputFlushHandler));

    // TemplatePointer fuer Farben soll nach Einfachclick
    // ohne Selektion zurueckgesetzt werden
    aTemplateTimer.SetTimeout(400);
    aTemplateTimer.SetTimeoutHdl(LINK(this, SwEditWin, TemplateTimerHdl));

    //JP 16.12.98: temporaere Loesung!!! Sollte bei jeder Cursorbewegung
    //          den Font von der akt. einfuege Position setzen!
    if( !rMyView.GetDocShell()->IsReadOnly() )
    {
        Font aFont;
        SetInputContext( InputContext( aFont, INPUTCONTEXT_TEXT |
                                            INPUTCONTEXT_EXTTEXTINPUT ) );
    }
}



SwEditWin::~SwEditWin()
{
    aKeyInputTimer.Stop();
    delete pShadCrsr;
    if( pQuickHlpData->bClear && rView.GetWrtShellPtr() )
        pQuickHlpData->Stop( rView.GetWrtShell() );
    bExecuteDrag = FALSE;
    delete pApplyTempl;
    rView.SetDrawFuncPtr(NULL);
    delete pUserMarker;
    delete pAnchorMarker;
}




//Fuer MSC 2.0 W95
#pragma optimize("",off)

void SwEditWin::GrfToOle()
{
    //Wir machen aus einer Grafik ein OLE-Object (StarImage)
    //Wird von MouseButtonDown bei Doppelklick gerufen.

    //Wer das nicht versteht ist selber schuld ;-)
    SvStorageRef aStor = new SvStorage( aEmptyStr );
    SvInPlaceObjectRef aIPObj;
#ifdef SO3
    aIPObj = &((SvFactory *)SvInPlaceObject::ClassFactory())->CreateAndInit( *SIM_MOD()->pSimDrawDocShellFactory, aStor );
#else
    aIPObj = &SvInPlaceObject::ClassFactory()->CreateAndInit( *SIM_MOD()->pSimDrawDocShellFactory, aStor );
#endif

    if ( aIPObj.Is() )
    {
        SwWrtShell &rSh = GetView().GetWrtShell();
        SimDLL::Update( aIPObj, rSh.GetGraphic(), rSh.GetOut() );

        Size aSz;
        rSh.GetGrfSize( aSz );
        aSz = OutputDevice::LogicToLogic
                    ( aSz, MapMode( MAP_TWIP), MapMode( aIPObj->GetMapUnit()));
        aIPObj->SetVisAreaSize( aSz );

        rSh.StartAllAction();
        rSh.GrfToOle( aIPObj );
        rSh.EndAllAction();
        bGrfToOle = TRUE;
    }
}



void SwEditWin::OleToGrf()
{
    //Wenn wir ein Ole an der Hand haben und dies ein SIM-Object ist, so
    //wird daraus wieder eine Graphic.

    if ( bGrfToOle )
    {
        SwWrtShell &rSh = GetView().GetWrtShell();
        if ( rSh.IsOLEObj() )
        {
            SvInPlaceObjectRef aRef = rSh.GetOLEObj();

            //Wer das nicht versteht ist selber schuld ;-)
            if ( SimModuleDummy::HasID( *aRef->GetSvFactory() ) )
            {
                Graphic aGrf( SimDLL::GetGraphic( aRef ) );
                rSh.StartAllAction();
                rSh.OleToGrf( &aGrf );
                rSh.EndAllAction();
            }
        }
        bGrfToOle = FALSE;
    }
}

#pragma optimize("",on)

/******************************************************************************
 *  Beschreibung: DrawTextEditMode einschalten
 ******************************************************************************/


void SwEditWin::EnterDrawTextMode( const Point& aDocPos )
{
    if ( rView.EnterDrawTextMode(aDocPos) == TRUE )
    {
        if (rView.GetDrawFuncPtr())
        {
            rView.GetDrawFuncPtr()->Deactivate();
            rView.SetDrawFuncPtr(NULL);
            rView.LeaveDrawCreate();
        }
        rView.NoRotate();
        rView.AttrChangedNotify( &rView.GetWrtShell() );
    }
}

/******************************************************************************
 *  Beschreibung: DrawMode einschalten
 ******************************************************************************/



BOOL SwEditWin::EnterDrawMode(const MouseEvent& rMEvt, const Point& aDocPos)
{
    SwWrtShell &rSh = rView.GetWrtShell();
    SdrView *pSdrView = rSh.GetDrawView();

//  if ( GetDrawFuncPtr() && (aActHitType == SDRHIT_NONE || rSh.IsDrawCreate()) )
    if ( rView.GetDrawFuncPtr() )
    {
        if (rSh.IsDrawCreate())
            return TRUE;

        BOOL bRet = rView.GetDrawFuncPtr()->MouseButtonDown( rMEvt );
        rView.AttrChangedNotify( &rSh );
        return bRet;
    }

    if ( pSdrView && pSdrView->IsTextEdit() )
    {
        rSh.EndTextEdit(); // Danebengeklickt, Ende mit Edit
        rSh.SelectObj( aDocPos );
        if ( !rSh.IsObjSelected() && !rSh.IsFrmSelected() )
            rSh.LeaveSelFrmMode();
        else
        {
            SwEditWin::nDDStartPosY = aDocPos.Y();
            SwEditWin::nDDStartPosX = aDocPos.X();
            bFrmDrag = TRUE;
        }
        rView.AttrChangedNotify( &rSh );
        return TRUE;
    }
    return FALSE;
}

/******************************************************************************
 *  Beschreibung:
 ******************************************************************************/



BOOL SwEditWin::IsDrawSelMode()
{
//  return (IsFrmAction() == FALSE && GetDrawMode() == OBJ_NONE);
    return (GetDrawMode() == SID_OBJECT_SELECT);
}

/******************************************************************************
 *  Beschreibung:
 ******************************************************************************/


void SwEditWin::GetFocus()
{
    rView.GotFocus();
    Window::GetFocus();
}

/******************************************************************************
 *  Beschreibung:
 ******************************************************************************/



void SwEditWin::LoseFocus()
{
    Window::LoseFocus();
    if( pQuickHlpData->bClear )
        pQuickHlpData->Stop( rView.GetWrtShell() );
    rView.LostFocus();
}

/******************************************************************************
 *  Beschreibung:
 ******************************************************************************/



void SwEditWin::Command( const CommandEvent& rCEvt )
{
    if ( !rView.GetViewFrame() || !rView.GetViewFrame()->GetFrame() ||
          rView.GetViewFrame()->GetFrame()->TransferForReplaceInProgress())
    {
        //Wenn der ViewFrame in Kuerze stirbt kein Popup mehr!
        Window::Command(rCEvt);
        return;
    }

    BOOL bCallBase      = TRUE;

    SwWrtShell &rSh = rView.GetWrtShell();

    switch ( rCEvt.GetCommand() )
    {
        case COMMAND_STARTDRAG:
        {
            if (rSh.GetDrawView() && rSh.GetDrawView()->Command(rCEvt, this))
            {
                rView.GetViewFrame()->GetBindings().InvalidateAll(FALSE);
                return; // Event von der SdrView ausgewertet
            }
            if ( !pApplyTempl && !rSh.IsDrawCreate() && !IsDrawAction())
            {
                BOOL bStart = FALSE, bDelSelect = FALSE;
                SdrObject *pObj = NULL;
                Point aDocPos( PixelToLogic( rCEvt.GetMousePosPixel() ) );
                if ( !rSh.IsInSelect() && rSh.ChgCurrPam( aDocPos, TRUE, TRUE))
                    //Wir sind nicht beim Selektieren und stehen auf einer
                    //Selektion
                    bStart = TRUE;
                else if ( !bFrmDrag && rSh.IsSelFrmMode() &&
                          rSh.IsInsideSelectedObj( aDocPos ) )
                    //Wir sind nicht am internen Draggen und stehen auf
                    //einem Objekt (Rahmen, Zeichenobjekt)
                    bStart = TRUE;
                else if( !bFrmDrag && rView.GetDocShell()->IsReadOnly() &&
                        OBJCNT_NONE != rSh.GetObjCntType( aDocPos, pObj ))
                {
                    rSh.LockPaint();
                    if( rSh.SelectObj( aDocPos, FALSE, FALSE, pObj ))
                        bStart = bDelSelect = TRUE;
                    else
                        rSh.UnlockPaint();
                }
                else
                {
                    SwContentAtPos aSwContentAtPos( SwContentAtPos::SW_INETATTR );
                    bStart = rSh.GetContentAtPos( aDocPos,
                                aSwContentAtPos,
                                FALSE );
                }

                if ( bStart && !bIsInDrag )
                {
                    bMBPressed = FALSE;
                    ReleaseMouse();
                    bFrmDrag = FALSE;
                    bExecuteDrag = TRUE;
                    SwEditWin::nDDStartPosY = aDocPos.Y();
                    SwEditWin::nDDStartPosX = aDocPos.X();
                    aMovePos = aDocPos;
                    StartExecuteDrag();
                    bCallBase = FALSE;
                    if( bDelSelect )
                    {
                        rSh.UnSelectFrm();
                        rSh.UnlockPaint();
                    }
                }
            }
        }
        break;

        case COMMAND_CONTEXTMENU:
        {
            const USHORT nId = SwInputChild::GetChildWindowId();
            SwInputChild* pChildWin = (SwInputChild*)GetView().GetViewFrame()->
                                                GetChildWindow( nId );

            if((!pChildWin || pChildWin->GetView() != &rView) &&
                !rSh.IsDrawCreate() && !IsDrawAction())
            {
                SET_CURR_SHELL( &rSh );
                if (!pApplyTempl)
                {
                    if (bNoInterrupt == TRUE)
                    {
                        ReleaseMouse();
                        bNoInterrupt = FALSE;
                        bMBPressed = FALSE;
                    }
                    Point aDocPos( PixelToLogic( rCEvt.GetMousePosPixel() ) );
                    if ( !rCEvt.IsMouseEvent() )
                        aDocPos = rSh.GetCharRect().Center();
                    const Point aPixPos = LogicToPixel( aDocPos );

                    if ( rView.GetDocShell()->IsReadOnly() )
                        SwReadOnlyPopup( aDocPos, rView ).Execute( this, aPixPos );
                    else if ( !rView.ExecSpellPopup( aDocPos ) )
                        GetView().GetViewFrame()->GetDispatcher()->ExecutePopup( 0, this, &aPixPos);
                }
                else if (pApplyTempl->bUndo)
                    rSh.Do(SwWrtShell::UNDO);
                bCallBase = FALSE;
            }
        }
        break;

        case COMMAND_WHEEL:
        case COMMAND_STARTAUTOSCROLL:
        case COMMAND_AUTOSCROLL:
            if( pShadCrsr )
                delete pShadCrsr, pShadCrsr = 0;
            bCallBase = !rView.HandleWheelCommands( rCEvt );
            break;

        case COMMAND_VOICE:
            {
                //ggf. an Outliner weiterleiten
                if ( rSh.HasDrawView() && rSh.GetDrawView()->IsTextEdit() )
                {
                    bCallBase = FALSE;
                    rSh.GetDrawView()->GetTextEditOutlinerView()->Command( rCEvt );
                    break;
                }

                const CommandVoiceData *pCData = rCEvt.GetVoiceData();
                if ( VOICECOMMANDTYPE_CONTROL == pCData->GetType() )
                    break;


                USHORT nSlotId = 0;
                SfxPoolItem *pItem = 0;

                switch ( pCData->GetCommand() )
                {
                    case DICTATIONCOMMAND_NEWPARAGRAPH: nSlotId = FN_INSERT_BREAK; break;
                    case DICTATIONCOMMAND_NEWLINE:      nSlotId = FN_INSERT_LINEBREAK; break;
                    case DICTATIONCOMMAND_LEFT:         nSlotId = FN_PREV_WORD; break;
                    case DICTATIONCOMMAND_RIGHT:        nSlotId = FN_NEXT_WORD; break;
                    case DICTATIONCOMMAND_UP:           nSlotId = FN_LINE_UP; break;
                    case DICTATIONCOMMAND_DOWN:         nSlotId = FN_LINE_DOWN; break;
                    case DICTATIONCOMMAND_UNDO:         nSlotId = SID_UNDO; break;
                    case DICTATIONCOMMAND_REPEAT:       nSlotId = SID_REPEAT; break;
                    case DICTATIONCOMMAND_DEL:          nSlotId = FN_DELETE_BACK_WORD; break;

                    case DICTATIONCOMMAND_BOLD_ON:      nSlotId = SID_ATTR_CHAR_WEIGHT;
                                                        pItem = new SvxWeightItem( WEIGHT_BOLD );
                                                        break;
                    case DICTATIONCOMMAND_BOLD_OFF:     nSlotId = SID_ATTR_CHAR_WEIGHT;
                                                        pItem = new SvxWeightItem( WEIGHT_NORMAL );
                                                        break;
                    case DICTATIONCOMMAND_UNDERLINE_ON: nSlotId = SID_ATTR_CHAR_UNDERLINE;
                                                        pItem = new SvxUnderlineItem( UNDERLINE_SINGLE );
                                                        break;
                    case DICTATIONCOMMAND_UNDERLINE_OFF:nSlotId = SID_ATTR_CHAR_UNDERLINE;
                                                        pItem = new SvxUnderlineItem( UNDERLINE_NONE );
                                                        break;
                    case DICTATIONCOMMAND_ITALIC_ON:    nSlotId = SID_ATTR_CHAR_POSTURE;
                                                        pItem = new SvxPostureItem( ITALIC_NORMAL );
                                                        break;
                    case DICTATIONCOMMAND_ITALIC_OFF:   nSlotId = SID_ATTR_CHAR_POSTURE;
                                                        pItem = new SvxPostureItem( ITALIC_NONE );
                                                        break;
                    case DICTATIONCOMMAND_NUMBERING_ON:
                                    if ( !rSh.GetCurNumRule() )
                                        nSlotId = FN_NUM_NUMBERING_ON;
                                    break;
                    case DICTATIONCOMMAND_NUMBERING_OFF:
                                    if ( rSh.GetCurNumRule() )
                                       nSlotId = FN_NUM_NUMBERING_ON;
                                    break;
                    case DICTATIONCOMMAND_TAB:
                                    {
                                       rSh.Insert( '\t' );
                                    }
                                    break;
                    case DICTATIONCOMMAND_UNKNOWN:
                                    {
                                        rView.GetWrtShell().Insert( pCData->GetText() );
                                    }
                                    break;

#ifdef DBG_UTIL
                    default:
                        ASSERT( !this, "unknown speech command." );
#endif
                }
                if ( nSlotId )
                {
                    bCallBase = FALSE;
                    if ( pItem )
                    {
                        //Eigentumsuebergang des Items
                        GetView().GetViewFrame()->GetDispatcher()->Execute( nSlotId, SFX_CALLMODE_STANDARD,
                                                  pItem, 0 );
                    }
                    else
                        GetView().GetViewFrame()->GetDispatcher()->Execute( nSlotId );
                }
            }
            break;

    case COMMAND_STARTEXTTEXTINPUT:
        if( rSh.HasDrawView() && rSh.GetDrawView()->IsTextEdit() )
        {
            bCallBase = FALSE;
            rSh.GetDrawView()->GetTextEditOutlinerView()->Command( rCEvt );
        }
        else
        {
            if( rSh.HasSelection() )
                rSh.DelRight();

            bCallBase = FALSE;
            rSh.CreateExtTextInput();
        }
        break;

    case COMMAND_ENDEXTTEXTINPUT:
        if( rSh.HasDrawView() && rSh.GetDrawView()->IsTextEdit() )
        {
            bCallBase = FALSE;
            rSh.GetDrawView()->GetTextEditOutlinerView()->Command( rCEvt );
        }
        else
        {
            bCallBase = FALSE;
            rSh.DeleteExtTextInput();
        }
        break;

    case COMMAND_EXTTEXTINPUT:
        if( rSh.HasDrawView() && rSh.GetDrawView()->IsTextEdit() )
        {
            bCallBase = FALSE;
            rSh.GetDrawView()->GetTextEditOutlinerView()->Command( rCEvt );
        }
        else
        {
            const CommandExtTextInputData* pData = rCEvt.GetExtTextInputData();
            if( pData )
            {
                bCallBase = FALSE;
                rSh.SetExtTextInputData( *pData );
            }
        }
        break;

    case COMMAND_CURSORPOS:
        // will be handled by the base class
        break;

    case COMMAND_EXTTEXTINPUTPOS:
        if( rSh.HasDrawView() && rSh.GetDrawView()->IsTextEdit() )
        {
            bCallBase = FALSE;
            rSh.GetDrawView()->GetTextEditOutlinerView()->Command( rCEvt );
        }
        else
        {
            SwExtTextInput* pInput = rSh.GetExtTextInput();
            const CommandExtTextInputPosData* pData = rCEvt.GetExtTextInputPosData();
            if( pInput && pData )
            {
                const Point aPt( rSh.GetCharRect().Pos() );
                Rectangle* pRects = pInput->GetPosInputData( *pData, &aPt );
                SetExtTextInputPos( pData->GetFirstPos(),
                                    pData->GetChars(), pRects );
                delete pRects;
                bCallBase = FALSE;
            }
        }
        break;

#ifdef DBG_UTIL
        default:
            ASSERT( !this, "unknown command." );
#endif
    }
    if (bCallBase)
        Window::Command(rCEvt);
}



SfxShell* lcl_GetShellFromDispatcher( SwView& rView, TypeId nType )
{
    //Shell ermitteln
    SfxShell* pShell;
    SfxDispatcher* pDispatcher = rView.GetViewFrame()->GetDispatcher();
    for(int  i = 0; TRUE; ++i )
    {
        pShell = pDispatcher->GetShell( i );
        if( !pShell || pShell->IsA( nType ) )
            break;
    }
    return pShell;
}



void SwEditWin::ClearTip()
{
}

IMPL_LINK( SwEditWin, KeyInputFlushHandler, Timer *, EMPTYARG )
{
    FlushInBuffer( &rView.GetWrtShell() );
    return 0;
}


IMPL_LINK( SwEditWin, KeyInputTimerHandler, Timer *, EMPTYARG )
{
    bTblInsDelMode = FALSE;
    return 0;
}

void SwEditWin::_InitStaticData()
{
    pQuickHlpData = new QuickHelpData();
}

void SwEditWin::_FinitStaticData()
{
    delete pQuickHlpData;
}

/*-----------------23.02.97 18:39-------------------

--------------------------------------------------*/


IMPL_LINK(SwEditWin, TemplateTimerHdl, Timer*, EMPTYARG)
{
    SetApplyTemplate(SwApplyTemplate());
    return 0;
}


void SwEditWin::SetChainMode( BOOL bOn )
{
    if ( !bChainMode )
        StopInsFrm();
    if ( pUserMarker )
    {
        DELETEZ( pUserMarker );
    }
    bChainMode = bOn;
    if ( !bChainMode )
        rView.GetViewFrame()->HideStatusText();

    static USHORT __READONLY_DATA aInva[] =
    {
        FN_FRAME_CHAIN, FN_FRAME_UNCHAIN, 0
    };
    rView.GetViewFrame()->GetBindings().Invalidate(aInva);
}

//-------------------------------------------------------------

void QuickHelpData::Move( QuickHelpData& rCpy )
{
    // Pointer verschieben
    aArr.Insert( &rCpy.aArr );
    rCpy.aArr.Remove( (USHORT)0, rCpy.aArr.Count() );
//  nTipId = rCpy.nTipId;
    bClear = rCpy.bClear;
    nLen = rCpy.nLen;
    nCurArrPos = rCpy.nCurArrPos;
    bChkInsBlank = rCpy.bChkInsBlank;
    bIsTip = rCpy.bIsTip;
    bIsAutoText = rCpy.bIsAutoText;

    if( pCETID ) delete pCETID;
    pCETID = rCpy.pCETID;
    rCpy.pCETID = 0;

    if( pAttrs ) delete pAttrs;
    pAttrs = rCpy.pAttrs;
    rCpy.pAttrs = 0;
}

void QuickHelpData::ClearCntnt()
{
    nLen = nCurArrPos = 0;
    bClear = bChkInsBlank = FALSE;
    nTipId = 0;
    aArr.DeleteAndDestroy( 0 , aArr.Count() );
    bIsTip = TRUE;
    bIsAutoText = TRUE;
    delete pCETID, pCETID = 0;
    delete pAttrs, pAttrs = 0;
}


void QuickHelpData::Start( SwWrtShell& rSh, USHORT nWrdLen )
{
    if( pCETID ) delete pCETID, pCETID = 0;
    if( pAttrs ) delete pAttrs, pAttrs = 0;

    if( USHRT_MAX != nWrdLen )
    {
        nLen = nWrdLen;
        nCurArrPos = 0;
    }
    bClear = TRUE;

    if( bIsTip )
    {
        Window& rWin = rSh.GetView().GetEditWin();
        Point aPt( rWin.OutputToScreenPixel( rWin.LogicToPixel(
                    rSh.GetCharRect().Pos() )));
        aPt.Y() -= 3;
        nTipId = Help::ShowTip( &rWin, Rectangle( aPt, Size( 1, 1 )),
                        *aArr[ nCurArrPos ],
                        QUICKHELP_LEFT | QUICKHELP_BOTTOM );
    }
    else
    {
        String sStr( *aArr[ nCurArrPos ] );
        sStr.Erase( 0, nLen );
        USHORT nL = sStr.Len();
        pAttrs = new USHORT[ nL ];
        for( USHORT n = nL; n;  )
            *(pAttrs + --n ) = EXTTEXTINPUT_ATTR_DOTTEDUNDERLINE |
                                EXTTEXTINPUT_ATTR_HIGHLIGHT;
        pCETID = new CommandExtTextInputData( sStr, pAttrs, nL,
                                                TRUE, 0, 0, FALSE );
        rSh.CreateExtTextInput();
        rSh.SetExtTextInputData( *pCETID );
    }
}

void QuickHelpData::Stop( SwWrtShell& rSh )
{
    if( !bIsTip )
        rSh.DeleteExtTextInput( 0, FALSE );
    else if( nTipId )
        Help::HideTip( nTipId );
    ClearCntnt();
}


/***********************************************************************

        $Log: not supported by cvs2svn $
        Revision 1.776  2000/09/18 16:05:23  willem.vandorp
        OpenOffice header added.

        Revision 1.775  2000/09/08 08:12:50  os
        Change: Set/Toggle/Has/Knows/Show/GetChildWindow

        Revision 1.774  2000/09/07 16:06:14  os
        change: SFX_DISPATCHER/SFX_BINDINGS removed

        Revision 1.773  2000/09/07 15:59:21  os
        change: SFX_DISPATCHER/SFX_BINDINGS removed

        Revision 1.772  2000/07/18 18:30:46  jp
        KeyInput: start a timer if AnyInput don't call the KeyInput again, for flush the data

        Revision 1.771  2000/06/28 09:40:29  os
        #76471# call FN_EDIT_FIELD via SfxBindings instead of SfxDispatcher

        Revision 1.770  2000/06/13 14:56:20  os
        #76167# character background color assignment corrected

        Revision 1.769  2000/06/13 10:00:15  os
        using UCB

        Revision 1.768  2000/06/09 13:35:02  ama
        Fix: No assert for COMMAND_CURSORPOS

        Revision 1.767  2000/05/26 07:21:29  os
        old SW Basic API Slots removed

        Revision 1.766  2000/05/24 10:39:15  jp
        Fix for solaris compiler

        Revision 1.765  2000/05/19 13:12:42  jp
        Changes for Unicode

        Revision 1.764  2000/05/19 11:04:59  jp
        Changes for Unicode

        Revision 1.763  2000/05/10 11:54:57  os
        Basic API removed

        Revision 1.762  2000/05/09 14:46:33  os
        BASIC interface partially removed

        Revision 1.761  2000/05/03 09:04:35  os
        #75368# prevent hyperlink execution if watercan mode is activated

        Revision 1.760  2000/04/20 12:55:18  os
        GetName() returns String&

        Revision 1.759  2000/04/18 15:18:16  os
        UNICODE

        Revision 1.758  2000/03/03 15:16:59  os
        StarView remainders removed

        Revision 1.757  2000/02/11 14:44:59  hr
        #70473# changes for unicode ( patched by automated patchtool )

        Revision 1.756  2000/02/09 12:02:37  jp
        Task #72684#: AutoText expand only with return-Key

        Revision 1.755  2000/01/13 21:28:12  jp
        Task #71894#: new Options for SW-AutoComplete

        Revision 1.754  1999/12/06 18:19:55  jp
        Bug #70535#: Wheelcommands - hide ShadowCursor

        Revision 1.753  1999/11/10 09:38:34  ama
        Fix #69089#: HitHandle and hit anchor

        Revision 1.752  1999/10/19 12:24:44  os
        call authority-entry dialog on double click

        Revision 1.751  1999/10/12 14:33:19  jp
        Bug #69139#: DTOR - stop QuickHelpData only if the WrtShell exist

        Revision 1.750  1999/10/12 13:39:17  ama
        Fix #69089#: Use sdr-anchor-handle

        Revision 1.749  1999/10/11 20:10:29  jp
        Bug #68496#: append paragraph behind a section

        Revision 1.748  1999/10/08 09:42:58  os
        #69059# last cast from GetpApp to SfxApplication* removed

        Revision 1.747  1999/10/06 08:41:11  jp
        Bug #68761#: MouseMove - use new function GetFmtFromAnyObj

        Revision 1.746  1999/08/27 09:34:38  JP
        no cast from GetpApp to SfxApp


      Rev 1.745   27 Aug 1999 11:34:38   JP
   no cast from GetpApp to SfxApp

      Rev 1.744   06 Aug 1999 16:48:18   JP
   Bug #68113#: MouseButtonDown - lockview before call SelectObject

      Rev 1.743   06 Jul 1999 20:06:50   JP
   Bug #67360#: MouseMove - check for aditional mode

      Rev 1.742   17 Jun 1999 09:36:30   JP
   Bug #66927#: KeyInput - fill AutoCompleteList only with words which has lower count of characters

      Rev 1.741   27 May 1999 13:00:40   OS
   Einf?gen/Bearbeiten von Spalten ueberarbeitet

      Rev 1.740   11 May 1999 20:09:22   HJS
   includes

      Rev 1.739   27 Apr 1999 14:50:20   JP
   Bug #65389#: MouseButtonUp - im HoldSelection auf jedenfall das EndDrag rufen

      Rev 1.738   26 Apr 1999 12:20:14   KZ
   #include <svtools/args.hxx> eingefuegt

      Rev 1.737   23 Apr 1999 17:02:32   JP
   Bug #65289#: MouseMove: synthetische Moves/ButtonDowns ignorieren

      Rev 1.736   22 Apr 1999 12:33:40   JP
   Bug #65171#: UpdatePointer - bei ApplyStyle den richtigen MousePointer setzen

      Rev 1.735   19 Apr 1999 13:38:44   OS
   #64780# Notizen und Scripts in geschuetzten Bereichen

      Rev 1.734   01 Apr 1999 15:26:38   JP
   Bug #64154#: KeyInput - beim AutoComplete die schon eingegebenen Buchstaben nicht entfernen

      Rev 1.733   17 Mar 1999 11:31:40   JP
   Task #63576#: KeyInput - das AutoComplete-Flag von der OffApp erfragen

      Rev 1.732   10 Mar 1999 09:40:30   JP
   Task #61405#: AutoCompletion von Woertern

      Rev 1.731   09 Mar 1999 19:38:14   JP
   Task #61405#: AutoCompletion von Woertern

      Rev 1.730   08 Mar 1999 11:52:14   JP
   Bug #62920#: aus readonly Docs Grafiken einfacher herausdraggen

      Rev 1.729   01 Mar 1999 23:01:24   JP
   Bug #62582#: InInProtectCntnt nur noch auswerten, wenn Cursor nicht im Readonly zugelassen ist

      Rev 1.728   03 Feb 1999 13:59:58   JP
   Bug #61399#: MouseButtonDown - CTRL auf Handels behandeln

      Rev 1.727   28 Jan 1999 20:46:08   JP
   Bug #61264#: MouseButtonDown - SHIFT-CTRL auf Handels behandeln

      Rev 1.726   26 Jan 1999 11:01:24   AWO
   Syntax

      Rev 1.725   22 Jan 1999 16:56:44   JP
   Bug Task #58677#: Crsr in Readonly Bereichen zulassen

      Rev 1.724   20 Jan 1999 14:17:30   JP
   Task #58677#: Crsr in Readonly Bereichen zulassen

      Rev 1.723   19 Jan 1999 22:58:12   JP
   Task #58677#: Crsr in Readonly Bereichen zulassen

      Rev 1.722   17 Dec 1998 19:19:54   JP
   Task #59490# ExtTextInput fuer japan./chine. Version

      Rev 1.721   11 Dec 1998 12:47:42   MT
   #59490# IME

      Rev 1.720   11 Nov 1998 15:04:26   JP
   Task #59308#: NoNum auch bei Outlines setzen

      Rev 1.719   06 Nov 1998 14:43:04   OS
   #57903# NumOff kann weg

      Rev 1.718   03 Nov 1998 11:51:40   JP
   Task #57916#: Vorbereitungen fuer den Selektionshandler vom Chart

      Rev 1.717   25 Sep 1998 13:21:00   JP
   Bug #56196#: KeyInput - Tab in der WebView ans Window weiterleiten, damit der SFX ggfs. was tun kann

      Rev 1.716   24 Sep 1998 13:33:22   JP
   Bug #55592#/#55931#: synthetische MouseMoves mit Ctrl-Taste sollten keine Selektion anfangen

      Rev 1.715   10 Sep 1998 10:39:28   OS
   #56290# Rahmenvorlage per Giesskanne auch ohne Selektion

**********************************************************************/

diff --git a/sw/source/ui/docvw/edtwin2.cxx b/sw/source/ui/docvw/edtwin2.cxx
new file mode 100644
index 0000000..6810c9a
--- /dev/null
+++ b/sw/source/ui/docvw/edtwin2.cxx
@@ -0,0 +1,694 @@
/*************************************************************************
 *
 *  $RCSfile: edtwin2.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:35 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include <tools/ref.hxx>
#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef PRODUCT
#include <stdio.h>
#endif

#ifndef _HELP_HXX //autogen
#include <vcl/help.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _IPENV_HXX //autogen
#include <so3/ipenv.hxx>
#endif
#ifndef _URLOBJ_HXX //autogen
#include <tools/urlobj.hxx>
#endif
#ifndef _TXTRFMRK_HXX //autogen wg. SwTxtRefMark
#include <txtrfmrk.hxx>
#endif
#ifndef _FMTRFMRK_HXX //autogen wg. SwFmtRefMark
#include <fmtrfmrk.hxx>
#endif

#ifndef _SVX_FLDITEM_HXX
#   ifndef ITEMID_FIELD
#       ifndef _EEITEM_HXX //autogen
#           include <svx/eeitem.hxx>
#       endif
#       define ITEMID_FIELD EE_FEATURE_FIELD  /* wird fuer #include <flditem.hxx> benoetigt */
#   endif
#   ifndef _SVX_FLDITEM_HXX //autogen
#       include <svx/flditem.hxx>
#   endif
#endif

#ifndef SVTOOLS_URIHELPER_HXX
#include <svtools/urihelper.hxx>
#endif
#ifndef _SVDOTEXT_HXX //autogen
#include <svx/svdotext.hxx>
#endif
#ifndef _OUTLINER_HXX //autogen
#define _EEITEMID_HXX
#include <svx/outliner.hxx>
#endif
#ifndef _SFXITEMITER_HXX //autogen
#include <svtools/itemiter.hxx>
#endif
#ifndef _SVDVIEW_HXX //autogen
#include <svx/svdview.hxx>
#endif
#ifndef _SVDPAGV_HXX //autogen
#include <svx/svdpagv.hxx>
#endif


#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _EDTWIN_HXX
#include <edtwin.hxx>
#endif
#ifndef _DPAGE_HXX
#include <dpage.hxx>
#endif
#ifndef _DOCUFLD_HXX
#include <docufld.hxx>
#endif
#ifndef _DBFLD_HXX
#include <dbfld.hxx>
#endif
#ifndef _REFFLD_HXX
#include <reffld.hxx>
#endif
#ifndef _CELLATR_HXX
#include <cellatr.hxx>
#endif
#ifndef _SHDWCRSR_HXX
#include <shdwcrsr.hxx>
#endif
#ifndef _FMTCOL_HXX
#include <fmtcol.hxx>
#endif
#ifndef _CHARFMT_HXX
#include <charfmt.hxx>
#endif
#ifndef _FMTFTN_HXX
#include <fmtftn.hxx>
#endif
#ifndef _REDLINE_HXX
#include <redline.hxx>
#endif
#ifndef _REDLENUM_HXX
#include <redlenum.hxx>
#endif
#ifndef _TOX_HXX
#include <tox.hxx>
#endif
#ifndef _TXTTXMRK_HXX //autogen
#include <txttxmrk.hxx>
#endif

#ifndef _DOCVW_HRC
#include <docvw.hrc>
#endif
#ifndef _UTLUI_HRC
#include <utlui.hrc>
#endif

#define C2S(cChar) UniString::CreateFromAscii(cChar)

/*--------------------------------------------------------------------
    Beschreibung:   KeyEvents
 --------------------------------------------------------------------*/
void lcl_GetRedlineHelp( const SwRedline& rRedl, String& rTxt, BOOL bBalloon )
{
    USHORT nResId = 0;
    switch( rRedl.GetType() )
    {
    case REDLINE_INSERT:    nResId = STR_REDLINE_INSERT; break;
    case REDLINE_DELETE:    nResId = STR_REDLINE_DELETE; break;
    case REDLINE_FORMAT:    nResId = STR_REDLINE_FORMAT; break;
    case REDLINE_TABLE:     nResId = STR_REDLINE_TABLE; break;
    case REDLINE_FMTCOLL:   nResId = STR_REDLINE_FMTCOLL; break;
    }

    if( nResId )
    {
        const DateTime& rDT = rRedl.GetTimeStamp();
        const International& rIntl = Application::GetAppInternational();
        rTxt = SW_RESSTR( nResId );
        (rTxt += C2S(": " )) += rRedl.GetAuthorString();
        (rTxt += C2S(" - " )) += rIntl.GetDate( rDT );
        (rTxt += ' ') += rIntl.GetTime( rDT, FALSE, FALSE );
        if( bBalloon && rRedl.GetComment().Len() )
            ( rTxt += '\n' ) += rRedl.GetComment();
    }
}


void SwEditWin::RequestHelp(const HelpEvent &rEvt)
{
    BOOL bWeiter = TRUE;
    SwWrtShell &rSh = rView.GetWrtShell();
    SET_CURR_SHELL(&rSh);
    String sTxt;
    Point aPos( PixelToLogic( ScreenToOutputPixel( rEvt.GetMousePosPixel() ) ));
    BOOL bBalloon = rEvt.GetMode() & HELPMODE_BALLOON;

    SdrView *pSdrView = rSh.GetDrawView();

    if( rEvt.GetMode() & ( HELPMODE_QUICK | HELPMODE_BALLOON ) )
    {
        if( pSdrView )
        {
            SdrPageView* pPV = pSdrView->GetPageViewPvNum(0);
            bWeiter = ((SwDPage*)pPV->GetPage())->RequestHelp(this,
                                                            pSdrView, rEvt);
        }
    }

    if( bWeiter && rEvt.GetMode() & ( HELPMODE_QUICK | HELPMODE_BALLOON ))
    {
        SwRect aFldRect;
        SwContentAtPos aCntntAtPos( SwContentAtPos::SW_FIELD |
                                    SwContentAtPos::SW_INETATTR |
                                    SwContentAtPos::SW_FTN |
                                    SwContentAtPos::SW_REDLINE |
                                    SwContentAtPos::SW_TOXMARK |
                                    SwContentAtPos::SW_REFMARK |
#ifndef PRODUCT
                                    SwContentAtPos::SW_TABLEBOXVALUE |
                        ( bBalloon ? SwContentAtPos::SW_CURR_ATTRS : 0) |
#endif
                                    SwContentAtPos::SW_TABLEBOXFML );

        if( rSh.GetContentAtPos( aPos, aCntntAtPos, FALSE, &aFldRect ) )
        {
            switch( aCntntAtPos.eCntntAtPos )
            {
            case SwContentAtPos::SW_TABLEBOXFML:
                ( sTxt = C2S("= ")) += ((SwTblBoxFormula*)aCntntAtPos.aFnd.pAttr)->GetFormula();
                break;
#ifndef PRODUCT
            case SwContentAtPos::SW_TABLEBOXVALUE:
            {
                ByteString sTmp;
                sprintf( sTmp.AllocBuffer( 30 ), "%E",
                    ((SwTblBoxValue*)aCntntAtPos.aFnd.pAttr)->GetValue() );
                sTxt = UniString(sTmp.GetBuffer(), gsl_getSystemTextEncoding());
            }
            break;
            case SwContentAtPos::SW_CURR_ATTRS:
                sTxt = aCntntAtPos.sStr;
                break;
#endif

            case SwContentAtPos::SW_INETATTR:
                sTxt = ((SfxStringItem*)aCntntAtPos.aFnd.pAttr)->GetValue();
                sTxt = URIHelper::removePassword( sTxt,
                                        INetURLObject::WAS_ENCODED,
                                           INetURLObject::DECODE_WITH_CHARSET );

                break;

            case SwContentAtPos::SW_FTN:
                if( aCntntAtPos.pFndTxtAttr && aCntntAtPos.aFnd.pAttr )
                {
                    const SwFmtFtn* pFtn = (SwFmtFtn*)aCntntAtPos.aFnd.pAttr;
                    pFtn->GetFtnText( sTxt );
                    sTxt.Insert( SW_RESSTR( pFtn->IsEndNote()
                                    ? STR_ENDNOTE : STR_FTNNOTE ), 0 );
                }
                break;

            case SwContentAtPos::SW_REDLINE:
                ::lcl_GetRedlineHelp( *aCntntAtPos.aFnd.pRedl, sTxt, bBalloon );
                break;

            case SwContentAtPos::SW_TOXMARK:
                sTxt = aCntntAtPos.sStr;
                if( sTxt.Len() && aCntntAtPos.pFndTxtAttr )
                {
                    const SwTOXType* pTType = aCntntAtPos.pFndTxtAttr->
                                        GetTOXMark().GetTOXType();
                    if( pTType && pTType->GetTypeName().Len() )
                    {
                        sTxt.Insert( C2S(": "), 0 );
                        sTxt.Insert( pTType->GetTypeName(), 0 );
                    }
                }
                break;
            case SwContentAtPos::SW_REFMARK:
                if(aCntntAtPos.aFnd.pAttr)
                {
                    sTxt = SW_RES(STR_CONTENT_TYPE_SINGLE_REFERENCE);
                    sTxt += C2S(": ");
                    sTxt += ((const SwFmtRefMark*)aCntntAtPos.aFnd.pAttr)->GetRefName();
                }
            break;

            default:
                {
                    const SwField* pFld = aCntntAtPos.aFnd.pFld;
                    switch( pFld->Which() )
                    {
                    case RES_SETEXPFLD:
                    case RES_TABLEFLD:
                    case RES_GETEXPFLD:
                    {
                        USHORT nOldSubType = pFld->GetSubType();
                        ((SwField*)pFld)->SetSubType(SUB_CMD);
                        sTxt = pFld->Expand();
                        ((SwField*)pFld)->SetSubType(nOldSubType);
                    }
                    break;

                    case RES_POSTITFLD:
                    case RES_INPUTFLD:  // BubbleHelp, da der Hinweis ggf ziemlich lang sein kann
                        bBalloon = TRUE;
                        /* no break */
                    case RES_JUMPEDITFLD:
                        sTxt = pFld->GetPar2();
                        break;

                    case RES_DBFLD:
                        sTxt = ((SwDBField*)pFld)->GetCntnt(TRUE);
                        break;

                    case RES_USERFLD:
                    case RES_HIDDENTXTFLD:
                        sTxt = pFld->GetPar1();
                        break;

                    case RES_DOCSTATFLD:
                        break;

                    case RES_MACROFLD:
                        sTxt = ((const SwMacroField*)pFld)->GetMacro();
                        break;

                    case RES_GETREFFLD:
                        sTxt = ((SwGetRefField*)pFld)->GetSetRefName();
                        break;
                    }

                    if( !sTxt.Len() )
                    {
                        aCntntAtPos.eCntntAtPos = SwContentAtPos::SW_REDLINE;
                        if( rSh.GetContentAtPos( aPos, aCntntAtPos, FALSE, &aFldRect ) )
                            ::lcl_GetRedlineHelp( *aCntntAtPos.aFnd.pRedl,
                                                    sTxt, bBalloon );
                    }
                }
            }
            if (sTxt.Len() )
            {
                if( bBalloon )
                    Help::ShowBalloon( this, rEvt.GetMousePosPixel(), sTxt );
                else
                {
                    // dann zeige die Hilfe mal an:
                    Rectangle aRect( aFldRect.SVRect() );
                    Point aPt( OutputToScreenPixel( LogicToPixel( aRect.TopLeft() )));
                    aRect.Left()   = aPt.X();
                    aRect.Top()    = aPt.Y();
                    aPt = OutputToScreenPixel( LogicToPixel( aRect.BottomRight() ));
                    aRect.Right()  = aPt.X();
                    aRect.Bottom() = aPt.Y();
                    Help::ShowQuickHelp( this, aRect, sTxt );
                }
            }

            bWeiter = FALSE;
        }
    }

/*
aktuelle Zeichenvorlage anzeigen?
    if( bWeiter && rEvt.GetMode() & ( HELPMODE_QUICK | HELPMODE_BALLOON ))
    {
        SwCharFmt* pChrFmt = rSh.GetCurCharFmt();

    }
*/
    if( bWeiter && pSdrView && rEvt.GetMode() & ( HELPMODE_QUICK | HELPMODE_BALLOON ))
    {
        SdrViewEvent aVEvt;
        SdrHitKind eHit = pSdrView->PickAnything(aPos, aVEvt);
        const SvxURLField *pField;
        SdrObject* pObj = NULL;

        if ((pField = aVEvt.pURLField) != 0)
        {
            // URL-Feld getroffen
            if (pField)
            {
                pObj = aVEvt.pObj;
                sTxt = pField->GetURL();

                bWeiter = FALSE;
            }
        }
        if (bWeiter && eHit == SDRHIT_TEXTEDIT)
        {
            // URL-Feld in zum Editieren ge”ffneten DrawText-Objekt suchen
            OutlinerView* pOLV = pSdrView->GetTextEditOutlinerView();
            const SvxFieldItem* pFieldItem;
            const SdrTextObj* pTextObj = NULL;

            if (pSdrView->HasMarkedObj())
            {
                const SdrMarkList& rMarkList = pSdrView->GetMarkList();

                if (rMarkList.GetMarkCount() == 1)
                    pObj = rMarkList.GetMark(0)->GetObj();
            }

            if (pObj && pObj->ISA(SdrTextObj) && pOLV &&
                    (pFieldItem = pOLV->GetFieldUnderMousePointer()) != 0)
            {
                const SvxFieldData* pField = pFieldItem->GetField();

                if (pField && pField->ISA(SvxURLField))
                {
                    sTxt = ((const SvxURLField*) pField)->GetURL();
                    bWeiter = FALSE;
                }
            }
        }
        if (sTxt.Len() && pObj)
        {
            sTxt = URIHelper::removePassword( sTxt, INetURLObject::WAS_ENCODED,
                                           INetURLObject::DECODE_WITH_CHARSET );

            Rectangle aLogicPix = LogicToPixel(pObj->GetLogicRect());
            Rectangle aScreenRect(OutputToScreenPixel(aLogicPix.TopLeft()),
                                OutputToScreenPixel(aLogicPix.BottomRight()));

            if (bBalloon)
                Help::ShowBalloon(this, rEvt.GetMousePosPixel(), aScreenRect, sTxt);
            else
                Help::ShowQuickHelp(this, aScreenRect, sTxt);
        }
    }

    if( bWeiter )
        Window::RequestHelp( rEvt );
}

void  SwEditWin::Paint(const Rectangle& rRect)
{
#if defined(MYDEBUG)
    // StartUp-Statistik
    if ( pTickList )
    {
        SYSTICK( "Start SwEditWin::Paint" );
        READ_FIRST_TICKS()
        FLUSH_TICKS()
    }
#endif

    SwWrtShell* pWrtShell = GetView().GetWrtShellPtr();
    if(!pWrtShell)
        return;
    BOOL bPaintShadowCrsr = FALSE;
    if( pShadCrsr )
    {
        Rectangle aRect( pShadCrsr->GetRect());
        // liegt vollstaendig drin?
        if( rRect.IsInside( aRect ) )
            // dann aufheben
            delete pShadCrsr, pShadCrsr = 0;
        else if( rRect.IsOver( aRect ))
        {
            // liegt irgendwie drueber, dann ist alles ausserhalb geclippt
            // und wir muessen den "inneren Teil" am Ende vom Paint
            // wieder sichtbar machen. Sonst kommt es zu Paintfehlern!
            bPaintShadowCrsr = TRUE;
        }
    }

    SwDocShell* pDocShell = GetView().GetDocShell();
    SvInPlaceEnvironment *pIpEnv =  pDocShell ?
                                  pDocShell->GetIPEnv() : 0;
    if ( pIpEnv && pIpEnv->GetRectsChangedLockCount() )
        //Wir stehen in Groessenverhandlungen (MM), Paint verzoegern
        Invalidate( rRect );
    else if ( GetView().GetVisArea().GetWidth()  <= 0 ||
              GetView().GetVisArea().GetHeight() <= 0 )
        Invalidate( rRect );
    else
        pWrtShell->Paint( rRect );

    if( bPaintShadowCrsr )
        pShadCrsr->Paint();
}


/***********************************************************************

        $Log: not supported by cvs2svn $
        Revision 1.77  2000/09/18 16:05:23  willem.vandorp
        OpenOffice header added.

        Revision 1.76  2000/08/31 11:38:26  jp
        RequestHelp: get the correct string for the TableValue

        Revision 1.75  2000/08/15 18:58:30  jp
        Task #77160#: use URIHelper class instead of GetUrlNoPass

        Revision 1.74  2000/04/18 15:18:17  os
        UNICODE

        Revision 1.73  2000/03/03 15:16:59  os
        StarView remainders removed

        Revision 1.72  2000/02/11 14:44:54  hr
        #70473# changes for unicode ( patched by automated patchtool )

        Revision 1.71  1999/07/22 07:05:40  OS
        #67715# QuickHelp for RefMarks


      Rev 1.70   22 Jul 1999 09:05:40   OS
   #67715# QuickHelp for RefMarks

      Rev 1.69   14 Jun 1999 13:28:24   JP
   Task #66520#: show TOX-TypeName and TOX-Entry by RequestHelp

      Rev 1.68   02 Jun 1999 11:04:42   JP
   Task #66520#: Verzeichniseintraege ohne Bereich per TipHilfe anzeigen

      Rev 1.67   29 Jan 1999 11:48:08   MH
   add: header

      Rev 1.66   09 Oct 1998 17:01:28   JP
   Bug #57741#: neue ResourceIds

      Rev 1.65   17 Jul 1998 15:23:52   OM
   #53182# TipHilfe fuer Macrofelder

      Rev 1.64   09 Jun 1998 15:31:26   OM
   VC-Controls entfernt

      Rev 1.63   02 Apr 1998 11:38:54   OS
   SET_CURR_SHELL im RequestHelp

      Rev 1.62   25 Mar 1998 18:44:34   JP
   Bug #48368#: RequestHelp - falls Felder keine TipHilfe haben, dann frage mal nach Redlines

      Rev 1.61   13 Mar 1998 14:09:36   OM
   #48150# BubbleHelp fuer Eingabefeld

      Rev 1.60   04 Feb 1998 19:47:42   JP
   neu: SetRedlineComment - Kommentar am RedlineObject setzen

      Rev 1.59   23 Jan 1998 14:53:02   JP
   neu: Quick/Tip-Hilfe fuer Fuss-/Endnoten

      Rev 1.58   15 Jan 1998 13:16:14   JP
   neu: TipHilfe fuer Redlines

      Rev 1.57   07 Jan 1998 13:37:36   OS
   Hosentraeger und Guertel: im Paint Existenz der wrtsh an der view testen #46436#

      Rev 1.56   28 Nov 1997 18:43:00   MA
   includes

      Rev 1.55   25 Nov 1997 10:33:02   MA
   includes

      Rev 1.54   11 Nov 1997 14:04:06   MA
   precomp entfernt

      Rev 1.53   06 Nov 1997 20:45:48   JP
   RequestHelp: fuer !PRODUCT bei Balloon die akt. Attributierung anzeigen

      Rev 1.52   03 Nov 1997 16:13:46   JP
   neu: Optionen/-Page/Basic-Schnittst. fuer ShadowCursor

      Rev 1.51   24 Oct 1997 18:37:02   JP
   neu: ShadowCursor

      Rev 1.50   02 Oct 1997 15:22:32   OM
   Feldumstellung

      Rev 1.49   15 Sep 1997 09:58:48   OM
   Auf vorhandene SdrView pruefen

      Rev 1.48   12 Sep 1997 17:19:00   OM
   Quickhelp fuer Drawtext-Objekte

      Rev 1.47   11 Aug 1997 15:54:08   OM
   #42625# Kein Passwort in Tip-Hilfe anzeigen

      Rev 1.46   11 Aug 1997 12:20:24   MH
   chg: header, ::Paint nach edtwin2.cxx verschoben

      Rev 1.45   07 Aug 1997 15:00:16   OM
   Headerfile-Umstellung

      Rev 1.44   05 Aug 1997 12:27:56   MH
   chg: header

      Rev 1.43   03 Jul 1997 13:09:32   OV
   #41226# VCMouseButtonDown: bVCAction=FALSE, wenn kein VCControl getroffen

      Rev 1.42   02 May 1997 19:54:28   NF
   includes...

      Rev 1.41   11 Apr 1997 11:25:48   MA
   includes

      Rev 1.40   03 Apr 1997 17:22:28   TRI
   includes

      Rev 1.39   15 Feb 1997 14:54:54   JP
   TipHilfe: TabellenFormel/-Value anzeigen

      Rev 1.38   08 Nov 1996 11:40:22   HJS
   include w.g. positivdefine

      Rev 1.37   07 Nov 1996 14:32:58   MA
   immer Balloon fuer Notizen

      Rev 1.36   05 Nov 1996 15:34:42   JP
   GotoRefMark: Parameter erweitert fuer erweiterte RefMarks

      Rev 1.35   22 Oct 1996 14:03:08   JP
   RequestHelp: RefFelder umgestellt auf neu SS

      Rev 1.34   25 Sep 1996 14:11:00   OM
   Neue Datenbanktrenner

      Rev 1.33   02 Sep 1996 18:42:36   JP
   INetFeld entfernt

      Rev 1.32   28 Aug 1996 11:31:22   OS
   PCH-Header korrigiert

      Rev 1.31   28 Aug 1996 11:25:48   OS
   includes

      Rev 1.30   26 Aug 1996 12:35:16   OS
   wieder mit PCH

      Rev 1.29   14 Aug 1996 15:23:10   JP
   svdraw.hxx entfernt

      Rev 1.28   08 Aug 1996 10:03:16   JP
   GetFldAtPos ersetzt durch GetCntntAtPos

      Rev 1.27   07 Aug 1996 14:59:12   JP
   Umstellung fuer Upd. 330

      Rev 1.26   01 Jul 1996 15:27:56   HJS
   define raus

      Rev 1.25   13 Jun 1996 14:44:02   MA
   splitt sihxx

      Rev 1.24   24 May 1996 16:49:28   OM
   QuickHelp von ExpressionFields wandeln

      Rev 1.23   06 May 1996 09:26:10   OS
   kein PCH wg. positiv-define

      Rev 1.22   30 Apr 1996 17:51:14   HJS
   docfilt darf nicht ausdefined sein

      Rev 1.21   22 Mar 1996 15:16:50   HJS
   umstellung 311

**********************************************************************/

diff --git a/sw/source/ui/docvw/edtwin3.cxx b/sw/source/ui/docvw/edtwin3.cxx
new file mode 100644
index 0000000..ea707b8
--- /dev/null
+++ b/sw/source/ui/docvw/edtwin3.cxx
@@ -0,0 +1,346 @@
/*************************************************************************
 *
 *  $RCSfile: edtwin3.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:35 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SV_SETTINGS_HXX
#include <vcl/settings.hxx>
#endif
#ifndef _SVX_RULER_HXX //autogen
#include <svx/ruler.hxx>
#endif

#ifndef _VIEWOPT_HXX //autogen
#include <viewopt.hxx>
#endif
#include "view.hxx"
#include "wrtsh.hxx"
#include "basesh.hxx"
#include "pview.hxx"
#include "mdiexp.hxx"
#include "edtwin.hxx"
#include "swmodule.hxx"
#include "modcfg.hxx"
#include "swtable.hxx"
#include "docsh.hxx"


/*--------------------------------------------------------------------
    Beschreibung:   Core-Notify
 --------------------------------------------------------------------*/



void ScrollMDI( ViewShell* pVwSh, const SwRect &rRect,
                USHORT nRangeX, USHORT nRangeY)
{
    SfxViewShell *pSfxVwSh = pVwSh->GetSfxViewShell();
    if (pSfxVwSh && pSfxVwSh->ISA(SwView))
        ((SwView *)pSfxVwSh)->Scroll( rRect.SVRect(), nRangeX, nRangeY );
}

/*--------------------------------------------------------------------
    Beschreibung:   Docmdi - verschiebbar
 --------------------------------------------------------------------*/



BOOL IsScrollMDI( ViewShell* pVwSh, const SwRect &rRect )
{
    SfxViewShell *pSfxVwSh = pVwSh->GetSfxViewShell();
    if (pSfxVwSh && pSfxVwSh->ISA(SwView))
        return (((SwView *)pSfxVwSh)->IsScroll(rRect.SVRect()));
    return FALSE;
}

/*--------------------------------------------------------------------
    Beschreibung:   Notify fuer Groessen-Aenderung
 --------------------------------------------------------------------*/



void SizeNotify(ViewShell* pVwSh, const Size &rSize)
{
    SfxViewShell *pSfxVwSh = pVwSh->GetSfxViewShell();
    if (pSfxVwSh)
    {
        if (pSfxVwSh->ISA(SwView))
            ((SwView *)pSfxVwSh)->DocSzChgd(rSize);
        else if (pSfxVwSh->ISA(SwPagePreView))
            ((SwPagePreView *)pSfxVwSh)->DocSzChgd( rSize );
    }
}

/*--------------------------------------------------------------------
    Beschreibung:   Notify fuer Seitenzahl-Update
 --------------------------------------------------------------------*/



void PageNumNotify( ViewShell* pVwSh, USHORT nPhyNum, USHORT nVirtNum,
                                                    const String& rPgStr)
{
    SfxViewShell *pSfxVwSh = pVwSh->GetSfxViewShell();
    if ( pSfxVwSh && pSfxVwSh->ISA(SwView) &&
         ((SwView*)pSfxVwSh)->GetCurShell() )
            ((SwView *)pSfxVwSh)->UpdatePageNums(nPhyNum, nVirtNum, rPgStr);
}

/******************************************************************************
 *  Methode     :   void FrameNotify( DocMDIBase *pWin, FlyMode eMode )
 *  Beschreibung:
 *  Erstellt    :   OK 08.02.94 13:49
 *  Aenderung   :
 ******************************************************************************/



void FrameNotify( ViewShell* pVwSh, FlyMode eMode )
{
    if ( pVwSh->ISA(SwCrsrShell) )
        SwBaseShell::SetFrmMode( eMode, (SwWrtShell*)pVwSh );
}

/*--------------------------------------------------------------------
    Beschreibung:   Notify fuer Seitenzahl-Update
 --------------------------------------------------------------------*/



BOOL SwEditWin::RulerClook( SwView& rView , const MouseEvent& rMEvt)
{
    return (!rView.GetHLineal()->StartDocDrag( rMEvt, RULER_TYPE_BORDER ) &&
            !rView.GetHLineal()->StartDocDrag( rMEvt, RULER_TYPE_MARGIN1) &&
            !rView.GetHLineal()->StartDocDrag( rMEvt, RULER_TYPE_MARGIN2));
}



Dialog* GetSearchDialog()
{
    return SwView::GetSearchDialog();
}



void JavaScriptScrollMDI( SfxFrame* pFrame, INT32 nX, INT32 nY )
{
    SfxViewShell *pSfxVwSh = pFrame->GetCurrentViewFrame()->GetViewShell();
    if( pSfxVwSh && pSfxVwSh->ISA( SwView ))
    {
        SwView* pView = (SwView *)pSfxVwSh;

        Size aSz( nX, nY );
        aSz = pView->GetEditWin().PixelToLogic( aSz );

        Point aTopLeft( aSz.Width(), aSz.Height() );
        if( aTopLeft.X() < DOCUMENTBORDER ) aTopLeft.X() = DOCUMENTBORDER;
        if( aTopLeft.Y() < DOCUMENTBORDER ) aTopLeft.Y() = DOCUMENTBORDER;

        const Size& rVisSize = pView->GetVisArea().GetSize();
        Size aDocSize( pView->GetDocSz() );
        aDocSize.Width() += DOCUMENTBORDER;
        aDocSize.Height() += DOCUMENTBORDER;

        if( aTopLeft.X() + rVisSize.Width() > aDocSize.Width() )
            aTopLeft.X() = rVisSize.Width() > aDocSize.Width()
                                ? DOCUMENTBORDER
                                : aDocSize.Width() - rVisSize.Width();

        if( aTopLeft.Y() + rVisSize.Height() > aDocSize.Height() )
            aTopLeft.Y() = rVisSize.Height() > aDocSize.Height()
                                ? DOCUMENTBORDER
                                : aDocSize.Height() - rVisSize.Height();

        pView->SetVisArea( aTopLeft );
    }
}



USHORT GetTblChgDefaultMode()
{
    SwModuleOptions* pOpt = SW_MOD()->GetModuleConfig();
    return pOpt ? pOpt->GetTblMode() : TBLVAR_CHGABS;
}



void RepaintPagePreview( ViewShell* pVwSh, const SwRect& rRect )
{
    SfxViewShell *pSfxVwSh = pVwSh->GetSfxViewShell();
    if (pSfxVwSh && pSfxVwSh->ISA( SwPagePreView ))
        ((SwPagePreView *)pSfxVwSh)->RepaintCoreRect( rRect );
}

BOOL JumpToSwMark( ViewShell* pVwSh, const String& rMark )
{
    SfxViewShell *pSfxVwSh = pVwSh->GetSfxViewShell();
    if( pSfxVwSh && pSfxVwSh->ISA( SwView ) )
        return ((SwView *)pSfxVwSh)->JumpToSwMark( rMark );
    return FALSE;
}

void SwEditWin::DataChanged( const DataChangedEvent &rEvt )
{
    SwWrtShell &rSh = GetView().GetWrtShell();
    rSh.LockView( TRUE );
    rSh.LockPaint();
    GetView().InvalidateBorder();               //Scrollbarbreiten
    GetView().GetDocShell()->UpdateFontList();  //z.B. Druckerwechsel
    rSh.LockView( FALSE );
    rSh.UnlockPaint();
}


/***********************************************************************

        $Log: not supported by cvs2svn $
        Revision 1.26  2000/09/18 16:05:24  willem.vandorp
        OpenOffice header added.

        Revision 1.25  1999/03/10 11:00:28  MA
        #52642# Fontwechsel im DataChanged


      Rev 1.24   10 Mar 1999 12:00:28   MA
   #52642# Fontwechsel im DataChanged

      Rev 1.23   24 Jun 1998 18:43:10   MA
   DataChanged fuer ScrollBar und Retouche, Retouche ganz umgestellt

      Rev 1.22   21 Apr 1998 15:25:14   JP
   Bug #49438#: JavaScriptScrollMDI - Grenzen beachten, absolut positionieren

      Rev 1.21   25 Nov 1997 10:33:04   MA
   includes

      Rev 1.20   03 Nov 1997 13:14:06   MA
   precomp entfernt

      Rev 1.19   17 Sep 1997 12:34:22   JP
   neu: JumpToSwMark - springe eine Marke an

      Rev 1.18   01 Sep 1997 13:15:38   OS
   DLL-Umstellung

      Rev 1.17   17 Jun 1997 15:47:06   MA
   DrawTxtShell nicht von BaseShell ableiten + Opts

      Rev 1.16   06 Jun 1997 11:08:40   OS
   Seitennummer mit richtigem NumType anzeigen

      Rev 1.15   11 Mar 1997 15:56:10   MA
   fix: FrameNotify, SubShell vorhanden?

      Rev 1.14   09 Feb 1997 20:58:10   JP
   Bug #35760#: beim Core-Repaint die Bereiche der PagePreView mitteilen

      Rev 1.13   15 Jan 1997 15:04:42   JP
   default des TablenChgMode aus dem ConfigItem holen

      Rev 1.12   25 Nov 1996 11:22:06   JP
   neu: JavaScriptScrollMDI

      Rev 1.11   28 Aug 1996 11:25:48   OS
   includes

      Rev 1.10   14 Dec 1995 17:32:16   OS
   Search wieder an der view

      Rev 1.9   30 Nov 1995 16:14:00   OS
   SearchDialog kommt von der App

      Rev 1.8   30 Nov 1995 13:25:32   MA
   del: IsWinForPagePreview() entfernt

      Rev 1.7   24 Nov 1995 16:58:36   OM
   PCH->PRECOMPILED

      Rev 1.6   30 Oct 1995 18:42:04   OM
   GetData und GetViewWin entfernt

      Rev 1.5   25 Sep 1995 21:55:56   JP
   PageNumNotify kann auch kommen, wenn noch keine Shell gesetzt ist (Bug19864)

      Rev 1.4   11 Sep 1995 11:04:20   JP
   neu: GetSearchDialog - CrsrShell braucht den Pointer fuer die QueryBox

      Rev 1.3   17 Aug 1995 08:38:52   OS
   +RulerClook

      Rev 1.2   14 Jul 1995 19:19:30   ER
   segprag

      Rev 1.1   11 Jun 1995 18:57:36   JP
   neu: IsWinForPagePreview - Window von der SeitenAnsicht?

      Rev 1.0   28 Mar 1995 09:51:24   SWG
   Initial revision.

**********************************************************************/



diff --git a/sw/source/ui/docvw/makefile.mk b/sw/source/ui/docvw/makefile.mk
new file mode 100644
index 0000000..5404570
--- /dev/null
+++ b/sw/source/ui/docvw/makefile.mk
@@ -0,0 +1,104 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:35 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=..$/..$/..

PRJNAME=sw
TARGET=docvw

AUTOSEG=true

PROJECTPCH=ui_pch
PDBTARGET=ui_pch
PROJECTPCHSOURCE=..\ui_1st\ui_pch

# --- Settings -----------------------------------------------------

.INCLUDE :  $(PRJ)$/inc$/swpre.mk
.INCLUDE :  settings.mk
.INCLUDE :  $(PRJ)$/inc$/sw.mk

# --- Files --------------------------------------------------------

CXXFILES = \
        edtdd.cxx \
        edtwin.cxx \
        edtwin2.cxx \
        edtwin3.cxx \
        romenu.cxx \
        srcedtw.cxx

SRCFILES =  \
        docvw.src

SLOFILES =  \
        $(SLO)$/edtdd.obj \
        $(SLO)$/edtwin.obj \
        $(SLO)$/edtwin2.obj \
        $(SLO)$/edtwin3.obj \
        $(SLO)$/romenu.obj \
        $(SLO)$/srcedtw.obj

# --- Tagets -------------------------------------------------------

.INCLUDE :  target.mk

diff --git a/sw/source/ui/docvw/romenu.cxx b/sw/source/ui/docvw/romenu.cxx
new file mode 100644
index 0000000..48f4627
--- /dev/null
+++ b/sw/source/ui/docvw/romenu.cxx
@@ -0,0 +1,820 @@
/*************************************************************************
 *
 *  $RCSfile: romenu.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:35 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include <hintids.hxx>


#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _IODLG_HXX
#include "sfx2/iodlg.hxx"
#endif

#ifndef _SOT_FORMATS_HXX
#include <sot/formats.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _SFXDOCFILE_HXX //autogen
#include <sfx2/docfile.hxx>
#endif
#ifndef _XOUTBMP_HXX //autogen
#include <svx/xoutbmp.hxx>
#endif
#ifndef _SVX_IMPGRF_HXX //autogen
#include <svx/impgrf.hxx>
#endif
#ifndef _URLOBJ_HXX //autogen
#include <tools/urlobj.hxx>
#endif
#ifndef _GRAPH_HXX //autogen
#include <vcl/graph.hxx>
#endif
#ifndef _GALLERY_HXX_ //autogen
#include <svx/gallery.hxx>
#endif
#ifndef _FILTER_HXX //autogen
#include <svtools/filter.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _CLIP_HXX //autogen
#include <vcl/clip.hxx>
#endif
#ifndef _SFX_INIMGR_HXX //autogen
#include <sfx2/inimgr.hxx>
#endif
#ifndef _SFXINIMGR_HXX //autogen
#include <svtools/iniman.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _IMAP_HXX //autogen
#include <svtools/imap.hxx>
#endif
#ifndef _INETIMG_HXX //autogen
#include <svtools/inetimg.hxx>
#endif


#ifndef _FRMATR_HXX
#include <frmatr.hxx>
#endif
#ifndef _FMTURL_HXX //autogen
#include <fmturl.hxx>
#endif
#ifndef _FMTINFMT_HXX //autogen
#include <fmtinfmt.hxx>
#endif
#ifndef _SWDOCSH_HXX //autogen
#include <docsh.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _VIEWOPT_HXX
#include <viewopt.hxx>
#endif
#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _ROMENU_HXX
#include <romenu.hxx>
#endif
#ifndef _PAGEDESC_HXX
#include <pagedesc.hxx>
#endif
#ifndef _MODCFG_HXX
#include <modcfg.hxx>
#endif

#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _HELPID_H
#include <helpid.h>
#endif
#ifndef _DOCVW_HRC
#include <docvw.hrc>
#endif
#ifndef _DOCVW_HRC
#include <docvw.hrc>
#endif

#define C2S(cChar) UniString::CreateFromAscii(cChar)


SwReadOnlyPopup::~SwReadOnlyPopup()
{
    String *pDel = (String*)aThemeList.First();
    while ( pDel )
    {
        delete pDel;
        pDel = (String*)aThemeList.Next();
    }
    delete pImageMap;
    delete pTargetURL;
}



void SwReadOnlyPopup::Check( USHORT nMID, USHORT nSID, SfxDispatcher &rDis )
{
    SfxPoolItem *pItem = 0;
    SfxItemState eState = rDis.GetBindings()->QueryState( nSID, pItem );
    if (eState >= SFX_ITEM_AVAILABLE)
    {
        EnableItem( nMID, TRUE );
        if (pItem)
        {
            CheckItem ( nMID, !pItem->ISA(SfxVoidItem) &&
                            pItem->ISA(SfxBoolItem) &&
                            ((SfxBoolItem*)pItem)->GetValue());
        }
    }
    else
        EnableItem( nMID, FALSE );

    delete pItem;
}


SwReadOnlyPopup::SwReadOnlyPopup( const Point &rDPos, SwView &rV ) :
    PopupMenu( SW_RES(MN_READONLY_POPUP) ),
    rDocPos( rDPos ),
    rView  ( rV ),
    pImageMap( 0 ),
    pTargetURL( 0 )
{
    bGrfToGalleryAsLnk = SW_MOD()->GetModuleConfig()->IsGrfToGalleryAsLnk();
    SwWrtShell &rSh = rView.GetWrtShell();
    rSh.IsURLGrfAtPos( rDocPos, &sURL, &sTargetFrameName, &sDescription );
    if ( !sURL.Len() )
    {
        SwContentAtPos aCntntAtPos( SwContentAtPos::SW_INETATTR );
        if( rSh.GetContentAtPos( rDocPos, aCntntAtPos, FALSE))
        {
            SwFmtINetFmt &rIItem = *(SwFmtINetFmt*)aCntntAtPos.aFnd.pAttr;
            sURL = rIItem.GetValue();
            sTargetFrameName = rIItem.GetTargetFrame();
            sDescription = aCntntAtPos.sStr;
        }
    }

    BOOL bLink = FALSE;
    const Graphic *pGrf;
    if ( 0 == (pGrf = rSh.GetGrfAtPos( rDocPos, sGrfName, bLink )) )
    {
        EnableItem( MN_READONLY_SAVEGRAPHIC, FALSE );
        EnableItem( MN_READONLY_COPYGRAPHIC, FALSE );
    }
    else
    {
        aGraphic = *pGrf;
        const SwFrmFmt* pGrfFmt = rSh.GetFmtFromObj( rDocPos );
        const SfxPoolItem* pItem;
        if( pGrfFmt && SFX_ITEM_SET == pGrfFmt->GetItemState(
            RES_URL, TRUE, &pItem ))
        {
            const SwFmtURL& rURL = *(SwFmtURL*)pItem;
            if( rURL.GetMap() )
                pImageMap = new ImageMap( *rURL.GetMap() );
            else if( rURL.GetURL().Len() )
                pTargetURL = new INetImage( bLink ? sGrfName : aEmptyStr,
                                            rURL.GetURL(),
                                            rURL.GetTargetFrameName(),
                                            aEmptyStr, Size() );
        }
    }

    BOOL bEnableGraphicToGallery;
    if ( TRUE == (bEnableGraphicToGallery = bLink) )
    {
        GalleryExplorer::FillThemeList( aThemeList );
        if ( aThemeList.Count() )
        {
            PopupMenu *pMenu = GetPopupMenu(MN_READONLY_GRAPHICTOGALLERY);
            pMenu->CheckItem( MN_READONLY_TOGALLERYLINK,  bGrfToGalleryAsLnk );
            pMenu->CheckItem( MN_READONLY_TOGALLERYCOPY, !bGrfToGalleryAsLnk );
            for ( USHORT i=0; i < aThemeList.Count(); ++i )
                pMenu->InsertItem( MN_READONLY_GRAPHICTOGALLERY+i + 3,
                                   *(String*)aThemeList.GetObject( i ) );
        }
        else
            bEnableGraphicToGallery = FALSE;
    }
    EnableItem( MN_READONLY_GRAPHICTOGALLERY, bEnableGraphicToGallery );

    SfxViewFrame * pVFrame = rV.GetViewFrame();
    SfxDispatcher &rDis = *pVFrame->GetDispatcher();
    const SfxPoolItem *pTmp;
    EnableItem( MN_READONLY_CREATEGRAPHIKLINK, bLink &&
                SFX_ITEM_AVAILABLE == rDis.QueryState( SID_CREATELINK, pTmp ));

    const SwPageDesc &rDesc = rSh.GetPageDesc( rSh.GetCurPageDesc() );
    pItem = &rDesc.GetMaster().GetBackground();
    BOOL bEnableBackGallery = FALSE,
         bEnableBack = FALSE;

    if ( GPOS_NONE != pItem->GetGraphicPos() )
    {
        bEnableBack = TRUE;
        if ( pItem->GetGraphicLink() )
        {
            if ( !aThemeList.Count() )
                GalleryExplorer::FillThemeList( aThemeList );
            if ( aThemeList.Count() )
            {
                PopupMenu *pMenu = GetPopupMenu(MN_READONLY_BACKGROUNDTOGALLERY);
                pMenu->CheckItem( MN_READONLY_TOGALLERYLINK,  bGrfToGalleryAsLnk );
                pMenu->CheckItem( MN_READONLY_TOGALLERYCOPY, !bGrfToGalleryAsLnk );
                bEnableBackGallery = TRUE;
                for ( USHORT i=0; i < aThemeList.Count(); ++i )
                    pMenu->InsertItem( MN_READONLY_BACKGROUNDTOGALLERY+i + 3,
                                       *(String*)aThemeList.GetObject( i ) );
            }
        }
    }
    EnableItem( MN_READONLY_SAVEBACKGROUND, bEnableBack );
    EnableItem( MN_READONLY_BACKGROUNDTOGALLERY, bEnableBackGallery );

    if ( !rSh.GetViewOptions()->IsGraphic() )
        CheckItem( MN_READONLY_GRAPHICOFF );
    else
        EnableItem( MN_READONLY_LOADGRAPHIC, FALSE );

    BOOL bReloadFrame = 0 != rSh.GetView().GetViewFrame()->GetFrame()->GetParentFrame();
    EnableItem( MN_READONLY_RELOAD_FRAME,
            bReloadFrame );
    EnableItem( MN_READONLY_RELOAD, !bReloadFrame);

    Check( MN_READONLY_EDITDOC,         SID_EDITDOC,        rDis );
    Check( MN_READONLY_SOURCEVIEW,      SID_SOURCEVIEW,     rDis );
    Check( MN_READONLY_BROWSE_STOP,     SID_BROWSE_STOP,    rDis );
    Check( MN_READONLY_BROWSE_BACKWARD, SID_BROWSE_BACKWARD,rDis );
    Check( MN_READONLY_BROWSE_FORWARD,  SID_BROWSE_FORWARD, rDis );
    Check( MN_READONLY_CREATELINK,      SID_CREATELINK,     rDis );
#ifdef WNT
    Check( MN_READONLY_PLUGINOFF,       SID_PLUGINS_ACTIVE, rDis );
#endif
    Check( MN_READONLY_OPENURL,         SID_OPENDOC,        rDis );
    Check( MN_READONLY_OPENURLNEW,      SID_OPENDOC,        rDis );

    SfxPoolItem* pState;
    SfxItemState eState = pVFrame->GetBindings().QueryState( SID_EDITDOC, pState );
    if(eState < SFX_ITEM_DEFAULT ||
        rSh.IsGlobalDoc() && rView.GetDocShell()->IsReadOnlyUI())
        EnableItem( MN_READONLY_EDITDOC, FALSE );

    if ( !sURL.Len() )
    {
        EnableItem( MN_READONLY_OPENURL, FALSE );
        EnableItem( MN_READONLY_OPENURLNEW, FALSE );
        EnableItem( MN_READONLY_CREATELINK, FALSE );
        EnableItem( MN_READONLY_DOWNLOAD, FALSE );
        EnableItem( MN_READONLY_COPYLINK, FALSE );
    }

    RemoveDisabledEntries( TRUE, TRUE );

#if 0
    //Jetzt noch das unnuetze Geraffel entfernen.
    MenuItemType eLast = MENUITEM_DONTKNOW;
    for ( int i = 0; i < GetItemCount(); ++i )
    {
        if ( MENUITEM_SEPARATOR == GetItemType( i ) )
        {
            if ( i == 0 || eLast == MENUITEM_SEPARATOR )
                RemoveItem( i-- );
        }
        else if ( !IsItemEnabled( GetItemId( i ) ) )
            RemoveItem( i-- );
        eLast = i >= 0 ? GetItemType(i) : MENUITEM_DONTKNOW;
    }
#endif
}

struct _CastINetImage : INetImage
{
    void Copy()
        {
            String sData( CopyExchange() );
            if( sData.Len() )
                Clipboard::CopyData( sData.GetBuffer(), sData.Len() / 2,
                                        SOT_FORMATSTR_ID_INET_IMAGE );
        }
};

void SwReadOnlyPopup::Execute( Window* pWin, const Point &rPixPos )
{
    SwWrtShell &rSh = rView.GetWrtShell();
    SfxDispatcher &rDis = *rView.GetViewFrame()->GetDispatcher();
    USHORT nId     = PopupMenu::Execute(
    pWin,
    rPixPos );

    if ( nId >= MN_READONLY_GRAPHICTOGALLERY )
    {
        String sTmp;
        USHORT nSaveId;
        if ( nId >= MN_READONLY_BACKGROUNDTOGALLERY )
        {
            nId -= MN_READONLY_BACKGROUNDTOGALLERY+3;
            nSaveId = MN_READONLY_SAVEBACKGROUND;
            sTmp = *pItem->GetGraphicLink();
        }
        else
        {
            nId -= MN_READONLY_GRAPHICTOGALLERY+3;
            nSaveId = MN_READONLY_SAVEGRAPHIC;
            sTmp = sGrfName;
        }
        if ( !bGrfToGalleryAsLnk )
            sTmp = SaveGraphic( nSaveId );

        if ( sTmp.Len() )
        {
            String sThemeName( *(String*)aThemeList.GetObject( nId ));
            GalleryExplorer::InsertURL( sThemeName, sTmp );
        }
        return;
    }

    USHORT nExecId = USHRT_MAX;
    USHORT nFilter = USHRT_MAX;
    switch( nId )
    {
        case MN_READONLY_OPENURL:           nFilter = URLLOAD_NOFILTER;   break;
        case MN_READONLY_OPENURLNEW:        nFilter = URLLOAD_NEWVIEW;    break;
        case MN_READONLY_EDITDOC:           nExecId = SID_EDITDOC;        break;
        case MN_READONLY_RELOAD:
        case MN_READONLY_RELOAD_FRAME:
            rSh.GetView().GetViewFrame()->GetDispatcher()->Execute(SID_RELOAD);
        break;

        case MN_READONLY_BROWSE_STOP:       nExecId = SID_BROWSE_STOP;    break;
        case MN_READONLY_BROWSE_BACKWARD:   nExecId = SID_BROWSE_BACKWARD;break;
        case MN_READONLY_BROWSE_FORWARD:    nExecId = SID_BROWSE_FORWARD; break;
        case MN_READONLY_SOURCEVIEW:        nExecId = SID_SOURCEVIEW;     break;
        case MN_READONLY_CREATELINK:
            {
                SfxStringItem aName( SID_BOOKMARK_TITLE, sDescription );
                SfxStringItem aURL( SID_BOOKMARK_URL, sURL );
                rDis.Execute( SID_CREATELINK, SFX_CALLMODE_ASYNCHRON,
                              &aName, &aURL, 0L);
            }
            break;
        case MN_READONLY_CREATEGRAPHIKLINK:
            {
                SfxStringItem aURL ( SID_BOOKMARK_URL, sGrfName );
                INetURLObject aTmp;
                aTmp.SetSmartURL( sGrfName );
                SfxStringItem aName( SID_BOOKMARK_TITLE, aTmp.GetName() );
                rDis.Execute( SID_CREATELINK, SFX_CALLMODE_ASYNCHRON,
                              &aName, &aURL, 0L);
            }
        case MN_READONLY_DOWNLOAD:          nFilter =
                                                URLLOAD_NEWVIEW |
                                                URLLOAD_DOWNLOADFILTER;   break;
        case MN_READONLY_SAVEGRAPHIC:
        case MN_READONLY_SAVEBACKGROUND:
            {
                SaveGraphic( nId );
                break;
            }
        case MN_READONLY_COPYLINK:
            Clipboard::Clear();
            Clipboard::CopyString( sURL );
            break;

        case MN_READONLY_COPYGRAPHIC:
            Clipboard::Clear();
            aGraphic.Copy();
            if( pImageMap )     pImageMap->Copy();
            if( pTargetURL )    ((_CastINetImage*)pTargetURL)->Copy();
            break;

        case MN_READONLY_LOADGRAPHIC:
            {
                BOOL bModified = rSh.IsModified();
                SwViewOption aOpt( *rSh.GetViewOptions() );
                aOpt.SetGraphic( TRUE );
                rSh.ApplyViewOptions( aOpt );
                if(!bModified)
                    rSh.ResetModified();
                break;
            }
        case MN_READONLY_GRAPHICOFF:        nExecId = FN_VIEW_GRAPHIC;    break;
#ifdef WNT
        case MN_READONLY_PLUGINOFF:         nExecId = SID_PLUGINS_ACTIVE; break;
#endif
        case MN_READONLY_TOGALLERYLINK:
            SW_MOD()->GetModuleConfig()->SetGrfToGalleryAsLnk( TRUE );
            break;
        case MN_READONLY_TOGALLERYCOPY:
            SW_MOD()->GetModuleConfig()->SetGrfToGalleryAsLnk( FALSE );
            break;

        default: /* do nothing */;
    }
    if ( nExecId != USHRT_MAX )
        rDis.GetBindings()->Execute( nExecId );
    if ( nFilter != USHRT_MAX )
        ::LoadURL( sURL, &rSh, nFilter, &sTargetFrameName);
}
                                             //nicht const, weil GetLink() noch
                                             //nicht const. kann bei naechster
                                             //Aenderung dieses Files mit
                                             //erledigt werden.
void lcl_GetPreferedExtension( String &rExt, /*const*/ Graphic &rGrf )
{
    // dann ggfs. ueber die native-Info der Grafik den "besten"
    // Filter vorschlagen
    switch( rGrf.GetLink().GetType() )
    {
        case GFX_LINK_TYPE_NATIVE_GIF:      rExt = C2S("gif"); break;
        case GFX_LINK_TYPE_NATIVE_TIF:      rExt = C2S("tif"); break;
        case GFX_LINK_TYPE_NATIVE_WMF:      rExt = C2S("wmf"); break;
        case GFX_LINK_TYPE_NATIVE_MET:      rExt = C2S("met"); break;
        case GFX_LINK_TYPE_NATIVE_PCT:      rExt = C2S("pct"); break;
        case GFX_LINK_TYPE_NATIVE_JPG:      rExt = C2S("jpg"); break;

        // case GFX_LINK_TYPE_NATIVE_PNG:
        default:                            rExt = C2S("png"); break;
    }
}


String SwReadOnlyPopup::SaveGraphic( USHORT nId )
{
    static String sGrfPath;
    if(!sGrfPath.Len())
        sGrfPath = SFX_INIMANAGER()->Get(SFX_KEY_GRAPHICS_PATH);
    SwWrtShell &rSh = rView.GetWrtShell();
    SfxFileDialog aExpDlg( NULL, WinBits(WB_SAVEAS|WB_3DLOOK) );
    aExpDlg.DisableSaveLastDirectory();
    aExpDlg.SetHelpId(HID_FILEDLG_ROMENU);
    INetURLObject aPath;
    aPath.SetSmartURL( sGrfPath);

    //Namen der Grafik herausfischen.
    String aName;
    if ( MN_READONLY_SAVEBACKGROUND == nId )
    {
        if ( pItem->GetGraphicLink() )
            aName = *pItem->GetGraphicLink();
        ((SvxBrushItem*)pItem)->SetDoneLink( Link() );
        const Graphic *pGrf = pItem->GetGraphic( rView.GetDocShell() );
        if ( pGrf )
        {
            aGraphic = *pGrf;
            if ( pItem->GetGraphicLink() )
                sGrfName = *pItem->GetGraphicLink();
        }
        else
            return aEmptyStr;
    }
    else
        aName = sGrfName;
    INetURLObject aURL;
    aURL.SetSmartURL( aName );
    aPath.Append( aURL.GetName() );
    aExpDlg.SetPath( aPath.GetMainURL() );
    aExpDlg.SetText( SW_RESSTR(STR_EXPORT_GRAFIK_TITLE));

    GraphicFilter& rGF = *GetGrfFilter();
    const USHORT nCount = rGF.GetExportFormatCount();

    String aExt( aURL.GetExtension() );
    if( !aExt.Len() )
        lcl_GetPreferedExtension( aExt, aGraphic );

    aExpDlg.SetDefaultExt( aExt );
    aExt.ToLowerAscii();
    int nDfltFilter = INT_MAX;

    for ( int i = 0; i < nCount; i++ )
    {
        aExpDlg.AddFilter( rGF.GetExportFormatName( i ),
                            rGF.GetExportWildcard( i ),
                            rGF.GetExportOSFileType( i ) );
        if ( COMPARE_EQUAL == aExt.CompareIgnoreCaseToAscii(rGF.GetExportFormatType( i ).ToLowerAscii() ))
            nDfltFilter = i;
    }
    if ( INT_MAX == nDfltFilter )
    {
        //"falsche" Extension?
        lcl_GetPreferedExtension( aExt, aGraphic );
        for ( int i = 0; i < nCount; ++i )
            if ( aExt == rGF.GetExportFormatType( i ).ToLowerAscii() )
            {
                nDfltFilter =  i;
                break;
            }
    }

    if( INT_MAX != nDfltFilter )
    {
        aExpDlg.SetCurFilter( rGF.GetExportFormatName( nDfltFilter ) );

        if( RET_OK == aExpDlg.Execute() )
        {
            String sPath( aExpDlg.GetPath() );
            //verwendeten Pfad merken - bitte nicht wieder wegoptimieren!
            aPath.SetSmartURL( sPath);
            sGrfPath = aPath.GetPath();

            if( sGrfName.Len() &&
                 nDfltFilter == rGF.GetExportFormatNumber( aExpDlg.GetCurFilter()))
            {
                //Versuchen die Originalgrafik zu speichern.
                SfxMedium aIn( sGrfName, STREAM_READ | STREAM_NOCREATE,
                                TRUE, TRUE );
                if( aIn.GetInStream() && !aIn.GetInStream()->GetError() )
                {
                    SfxMedium aOut( sPath, STREAM_WRITE | STREAM_SHARE_DENYNONE,
                                            FALSE, FALSE );
                    if( aOut.GetOutStream() && !aOut.GetOutStream()->GetError())
                    {
                        *aOut.GetOutStream() << *aIn.GetInStream();
                        if ( 0 == aIn.GetError() )
                        {
                            aOut.Close();
                            aOut.Commit();
                            if ( 0 == aOut.GetError() )
                                return sPath;
                        }
                    }
                }
            }

            int nFilter;
            if ( aExpDlg.GetCurFilter().Len() && rGF.GetExportFormatCount() )
                nFilter = rGF.GetExportFormatNumber( aExpDlg.GetCurFilter() );
            else
                nFilter = GRFILTER_FORMAT_DONTKNOW;
            String aFilter( rGF.GetExportFormatShortName( nFilter ) );
            XOutBitmap::WriteGraphic( aGraphic, sPath, aFilter,
                                        XOUTBMP_DONT_EXPAND_FILENAME );
            return sPath;
        }
    }
    return aEmptyStr;
}


/*************************************************************************

      $Log: not supported by cvs2svn $
      Revision 1.56  2000/09/18 16:05:24  willem.vandorp
      OpenOffice header added.

      Revision 1.55  2000/09/07 15:59:22  os
      change: SFX_DISPATCHER/SFX_BINDINGS removed

      Revision 1.54  2000/04/19 12:56:34  os
      include sfx2/filedlg.hxx removed

      Revision 1.53  2000/04/18 15:18:17  os
      UNICODE

      Revision 1.52  2000/03/03 15:17:00  os
      StarView remainders removed

      Revision 1.51  2000/02/11 14:45:03  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.50  2000/01/24 12:49:10  os
      #72153# call SfxFileDialog::DisableSaveLastDirectory

      Revision 1.49  1999/03/08 10:51:04  JP
      Bug #62925#: ImageMap/INetImage mit ins Clipboard stellen


      Rev 1.48   08 Mar 1999 11:51:04   JP
   Bug #62925#: ImageMap/INetImage mit ins Clipboard stellen

      Rev 1.47   25 Nov 1998 13:56:30   OS
   #59809# Grafik-Pfad wieder merken

      Rev 1.46   26 Oct 1998 16:16:06   OS
   #58159# Reload und ReloadFrame im ReadOnlyPopup

      Rev 1.45   21 Oct 1998 13:23:26   OM
   #58267# Slotstatus ueber Bindings abfragen

      Rev 1.44   02 Sep 1998 14:11:48   OM
   #45378# HelpIDs fuer Dateidialoge

      Rev 1.43   12 Aug 1998 09:41:54   MA
   #54165# Phantasie-Extensions verarbeiten

      Rev 1.42   11 Aug 1998 14:15:24   JP
   Bug #54446#: bei embeddeten Grafiken, das default Format aus der Grafik besorgen

      Rev 1.41   05 Aug 1998 12:42:10   JP
   Bug #54446#: bei embeddeten Grafiken keine leeren Dateien erzeugen

      Rev 1.40   30 Jul 1998 22:15:16   JP
   Bug #54446# auch nicht gelinkte Grafiken speichern

      Rev 1.39   30 Jun 1998 17:47:44   MA
   RemoveDisabledEntries genutzt

      Rev 1.38   07 May 1998 17:58:42   MA
   PlugIn fuer WNT wieder aktiv

      Rev 1.37   29 Apr 1998 18:30:26   MA
   #49873# so macht man das also

      Rev 1.36   28 Apr 1998 15:07:54   MA
   chg: PathToFileName statt GetFull am URL-Objekt

      Rev 1.35   16 Apr 1998 08:15:10   OS
   nach Grafiken einschalten evtl. Modify-Flag zuruecksetzen#49488#

      Rev 1.34   25 Mar 1998 14:24:12   OS
   im ReadonlyUI-Zustand der Globaldokumente Bearbeiten nicht moeglich #48871#

      Rev 1.33   25 Nov 1997 10:32:58   MA
   includes

      Rev 1.32   16 Oct 1997 12:03:08   OS
   PlugIn nicht im VCL

      Rev 1.31   12 Sep 1997 10:38:44   OS
   ITEMID_* definiert

      Rev 1.30   02 Sep 1997 13:20:48   OS
   includes

      Rev 1.29   29 Aug 1997 16:03:32   OS
   PopupMenu::Execute mit Window* fuer VCL

      Rev 1.28   29 Aug 1997 14:35:36   OS
   DLL-Umbau

      Rev 1.27   15 Aug 1997 12:09:56   OS
   chartar/frmatr/txtatr aufgeteilt

      Rev 1.26   12 Aug 1997 15:59:04   OS
   frmitems/textitem/paraitem aufgeteilt

      Rev 1.25   12 Aug 1997 12:40:30   MA
   #41880# Original der Grafiken speichern

      Rev 1.24   08 Aug 1997 17:30:12   OM
   Headerfile-Umstellung

      Rev 1.23   07 Aug 1997 15:00:18   OM
   Headerfile-Umstellung

      Rev 1.22   06 Aug 1997 10:18:12   OS
   FN_SOURCEVIEW->SID_SOURCEVIEW

      Rev 1.21   27 May 1997 13:22:10   OS
   FN_SOURCEVIEW im Popup

      Rev 1.20   15 Apr 1997 14:14:24   OS
   Status fuer EDITDOC an den Bindings erfragen

      Rev 1.19   20 Mar 1997 16:59:42   MA
   fix: richtige Extension und damit Filtererkennung reanimiert

      Rev 1.18   18 Mar 1997 14:40:18   OS
   letzten Save-Pfad merken und am Dialog richtig einstellen

      Rev 1.17   23 Feb 1997 17:56:50   MA
   #36840# mit den Separatoren aufraeumen.

      Rev 1.16   14 Feb 1997 19:42:26   MA
   new: Flag fuer Readonly-Gallery

      Rev 1.15   12 Feb 1997 17:05:36   MA
   #36004# Background disablen

      Rev 1.14   10 Feb 1997 16:48:10   MA
   fix: BackgroundToGallery ggf. disablen

      Rev 1.13   06 Feb 1997 08:24:02   MA
   BackgroundToGallery, removen disableter Items

      Rev 1.12   04 Feb 1997 16:04:18   MA
   chg: Aufnehmen in Gallery

      Rev 1.11   02 Dec 1996 08:32:00   TRI
   SfxPoolItem const gemacht

      Rev 1.10   29 Nov 1996 10:20:36   MA
   fix: dontexpandfilename

      Rev 1.9   28 Nov 1996 18:15:00   HJS
   cast fuer os2

      Rev 1.8   28 Nov 1996 14:20:32   MA
   fix: Grafiken speichern, fehlt noch der TempName

      Rev 1.7   21 Nov 1996 20:07:08   MA
   chg: neue Eintraege

      Rev 1.6   18 Nov 1996 18:22:08   MA
   chg: SfxFileDialog statt FileDialog

      Rev 1.5   11 Nov 1996 09:39:32   MA
   ResMgr

      Rev 1.4   24 Oct 1996 15:37:18   MA
   chg: Filter per Extension detecten

      Rev 1.3   22 Oct 1996 12:27:50   MA
   new: Namen und Filter defaulten

      Rev 1.2   24 Sep 1996 16:45:16   OS
   OS/2-Absturz behoben; richtiges enablen

      Rev 1.1   18 Sep 1996 18:20:12   MA
   #31458# Dispatcher statt Bindings

      Rev 1.0   16 Sep 1996 14:56:38   MA
   new: Readonly-Popup

*************************************************************************/


diff --git a/sw/source/ui/docvw/romenu.hxx b/sw/source/ui/docvw/romenu.hxx
new file mode 100644
index 0000000..baf34c5
--- /dev/null
+++ b/sw/source/ui/docvw/romenu.hxx
@@ -0,0 +1,111 @@
/*************************************************************************
 *
 *  $RCSfile: romenu.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:35 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _ROMENU_HXX
#define _ROMENU_HXX


#ifndef _GRAPH_HXX //autogen
#include <vcl/graph.hxx>
#endif
#ifndef _LIST_HXX //autogen
#include <tools/list.hxx>
#endif
#ifndef _MENU_HXX //autogen
#include <vcl/menu.hxx>
#endif

class SwView;
class SfxDispatcher;
class SvxBrushItem;
class ImageMap;
class INetImage;

class SwReadOnlyPopup : public PopupMenu
{
          SwView &rView;
    const SvxBrushItem *pItem;
    const Point &rDocPos;
                Graphic aGraphic;
    String      sURL,
                sTargetFrameName,
                sDescription,
                sGrfName;
    List        aThemeList;
    BOOL        bGrfToGalleryAsLnk;
    ImageMap*   pImageMap;
    INetImage*  pTargetURL;

    void Check( USHORT nMID, USHORT nSID, SfxDispatcher &rDis );
    String SaveGraphic( USHORT nId );

public:
    SwReadOnlyPopup( const Point &rDPos, SwView &rV );
    ~SwReadOnlyPopup();
#ifdef VCL
    void Execute( Window* pWin, const Point &rPPos );
#else
    void Execute( const Point &rPPos );
#endif
};


#endif

diff --git a/sw/source/ui/docvw/srcedtw.cxx b/sw/source/ui/docvw/srcedtw.cxx
new file mode 100644
index 0000000..45eac58
--- /dev/null
+++ b/sw/source/ui/docvw/srcedtw.cxx
@@ -0,0 +1,1016 @@
/*************************************************************************
 *
 *  $RCSfile: srcedtw.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:35 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "hintids.hxx"
#include "cmdid.h"


#ifndef _SYSTEM_HXX //autogen
#include <vcl/system.hxx>
#endif
#ifndef _TEXTVIEW_HXX
#include <svtools/textview.hxx>
#endif
#ifndef _SVX_SVXIDS_HRC
#include <svx/svxids.hrc>
#endif
#ifndef _SCRBAR_HXX //autogen
#include <vcl/scrbar.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SFX_BINDINGS_HXX //autogen
#include <sfx2/bindings.hxx>
#endif
#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif
#ifndef _HTMLTOKN_H
#include <svtools/htmltokn.h>
#endif
#ifndef _TXTATTR_HXX //autogen
#include <svtools/txtattr.hxx>
#endif


#include "swmodule.hxx"
#include "docsh.hxx"
#include "srcview.hxx"
#include "srcedtw.hxx"
#include "srcvcfg.hxx"
#include "helpid.h"


enum SwHtmlTextType {
    TT_SGML     = SRC_SYN_SGML  ,
    TT_COMMENT  = SRC_SYN_COMMENT   ,
    TT_KEYWORD  = SRC_SYN_KEYWRD    ,
    TT_UNKNOWN  = SRC_SYN_UNKNOWN
};


struct SwTextPortion
{
    USHORT nLine;
    USHORT nStart, nEnd;
    SwHtmlTextType eType;
};

#define MAX_SYNTAX_HIGHLIGHT 20

SV_DECL_VARARR(SwTextPortions, SwTextPortion,16,16)

/* -----------------15.01.97 12.07-------------------

--------------------------------------------------*/

SV_IMPL_VARARR(SwTextPortions, SwTextPortion)

/*-----------------15.01.97 12.08-------------------

--------------------------------------------------*/

void lcl_Highlight(const String& rSource, SwTextPortions& aPortionList)
{
    const sal_Unicode cOpenBracket = '<';
    const sal_Unicode cCloseBracket= '>';
    const sal_Unicode cSlash        = '/';
    const sal_Unicode cExclamation = '!';
    const sal_Unicode cQuote        = '"';
    const sal_Unicode cSQuote      = '\'';
    const sal_Unicode cMinus        = '-';
    const sal_Unicode cSpace        = ' ';
    const sal_Unicode cTab          = 0x09;
    const sal_Unicode cLF          = 0x0a;
    const sal_Unicode cCR          = 0x0d;


    const USHORT nStrLen = rSource.Len();
    USHORT nInsert = 0;         // Anzahl der eingefuegten Portions
    USHORT nActPos = 0;         //Position, an der '<' gefunden wurde
    USHORT nOffset = 0;         //Offset von nActPos zur '<'
    USHORT nPortStart = USHRT_MAX;  // fuer die TextPortion
    USHORT nPortEnd  =  0;  //
    SwTextPortion aText;
    while(nActPos < nStrLen)
    {
        SwHtmlTextType eFoundType = TT_UNKNOWN;
        if(rSource.GetChar(nActPos) == cOpenBracket && nActPos < nStrLen - 2 )
        {
            // 'leere' Portion einfuegen
            if(nPortEnd < nActPos - 1 )
            {
                aText.nLine = 0;
                // am Anfang nicht verschieben
                aText.nStart = nPortEnd;
                if(nInsert)
                    aText.nStart += 1;
                aText.nEnd = nActPos - 1;
                aText.eType = TT_UNKNOWN;
                aPortionList.Insert(aText, nInsert++);
            }
            sal_Unicode cFollowFirst = rSource.GetChar((xub_StrLen)(nActPos + 1));
            sal_Unicode cFollowNext = rSource.GetChar((xub_StrLen)(nActPos + 2));
            if(cExclamation == cFollowFirst)
            {
                // "<!" SGML oder Kommentar
                if(cMinus == cFollowNext &&
                    nActPos < nStrLen - 3 && cMinus == rSource.GetChar((xub_StrLen)(nActPos + 3)))
                {
                    eFoundType = TT_COMMENT;
                }
                else
                    eFoundType = TT_SGML;
                nPortStart = nActPos;
                nPortEnd = nActPos + 1;
            }
            else if(cSlash == cFollowFirst)
            {
                // "</" Slash ignorieren
                nPortStart = nActPos;
                nActPos++;
                nOffset++;
            }
            if(TT_UNKNOWN == eFoundType)
            {
                //jetzt koennte hier ein keyword folgen
                USHORT nSrchPos = nActPos;
                while(++nSrchPos < nStrLen - 1)
                {
                    sal_Unicode cNext = rSource.GetChar(nSrchPos);
                    if( cNext == cSpace ||
                        cNext == cTab   ||
                        cNext == cLF    ||
                        cNext == cCR)
                        break;
                    else if(cNext == cCloseBracket)
                    {
                        break;
                    }
                }
                if(nSrchPos > nActPos + 1)
                {
                    //irgend ein String wurde gefunden
                    String sToken = rSource.Copy(nActPos + 1, nSrchPos - nActPos - 1 );
                    sToken.ToUpperAscii();
                    int nToken = ::GetHTMLToken(sToken);
                    if(nToken)
                    {
                        //Token gefunden
                        eFoundType = TT_KEYWORD;
                        nPortEnd = nSrchPos;
                        nPortStart = nActPos;
                    }
                    else
                    {
                        //was war das denn?
#ifdef DEBUG
                        DBG_ERROR("Token nicht erkannt!")
                        DBG_ERROR(ByteString(sToken, gsl_getSystemTextEncoding()).GetBuffer())
#endif
                    }

                }
            }
            // jetzt muss noch '>' gesucht werden
            if(TT_UNKNOWN != eFoundType)
            {
                BOOL bFound = FALSE;
                for(USHORT i = nPortEnd; i < nStrLen; i++)
                    if(cCloseBracket == rSource.GetChar(i))
                    {
                        bFound = TRUE;
                        nPortEnd = i;
                        break;
                    }
                if(!bFound && (eFoundType == TT_COMMENT))
                {
                    // Kommentar ohne Ende in dieser Zeile
                    bFound  = TRUE;
                    nPortEnd = nStrLen - 1;
                }

                if(bFound ||(eFoundType == TT_COMMENT))
                {
                    SwTextPortion aText;
                    aText.nLine = 0;
                    aText.nStart = nPortStart + 1;
                    aText.nEnd = nPortEnd;
                    aText.eType = eFoundType;
                    aPortionList.Insert(aText, nInsert++);
                    eFoundType = TT_UNKNOWN;
                }

            }
        }
        nActPos++;
    }
    if(nInsert && nPortEnd < nActPos - 1)
    {
        aText.nLine = 0;
        aText.nStart = nPortEnd + 1;
        aText.nEnd = nActPos - 1;
        aText.eType = TT_UNKNOWN;
        aPortionList.Insert(aText, nInsert++);
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


SwSrcEditWindow::SwSrcEditWindow( Window* pParent, SwSrcView* pParentView ) :
    Window( pParent, WB_BORDER|WB_CLIPCHILDREN ),
    pTextEngine(0),
    pOutWin(0),
    pHScrollbar(0),
    pVScrollbar(0),
    pSrcView(pParentView),
    nCurTextWidth(0),
    bDoSyntaxHighlight(TRUE),
    bHighlighting(FALSE),
    pSrcVwConfig(SW_MOD()->GetSourceViewConfig()),
    nStartLine(USHRT_MAX)
{
    SetHelpId(HID_SOURCE_EDITWIN);
    CreateTextEngine();
}


/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


 SwSrcEditWindow::~SwSrcEditWindow()
{
    aSyntaxIdleTimer.Stop();
    if ( pTextEngine )
    {
        EndListening( *pTextEngine );
        pTextEngine->RemoveView( pTextView );

        delete pHScrollbar;
        delete pVScrollbar;

        delete pTextView;
        delete pTextEngine;
    }
    delete pOutWin;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

#if (SUPD>397)
void SwSrcEditWindow::DataChanged( const DataChangedEvent& )
{
    Resize();
}
#endif

void  SwSrcEditWindow::Resize()
{
    // ScrollBars, etc. passiert in Adjust...
    if ( pTextView )
    {
        long nVisY = pTextView->GetStartDocPos().Y();
        pTextView->ShowCursor();
        Size aOutSz( GetOutputSizePixel() );
        long nMaxVisAreaStart = pTextView->GetTextEngine()->GetTextHeight() - aOutSz.Height();
        if ( nMaxVisAreaStart < 0 )
            nMaxVisAreaStart = 0;
        if ( pTextView->GetStartDocPos().Y() > nMaxVisAreaStart )
        {
            Point aStartDocPos( pTextView->GetStartDocPos() );
            aStartDocPos.Y() = nMaxVisAreaStart;
            pTextView->SetStartDocPos( aStartDocPos );
            pTextView->ShowCursor();
        }
        InitScrollBars();
        long nScrollStd = GetSettings().GetStyleSettings().GetScrollBarSize();
        Size aScrollSz(aOutSz.Width() - nScrollStd, nScrollStd );
        Point aScrollPos(0, aOutSz.Height() - nScrollStd);

        pHScrollbar->SetPosSizePixel( aScrollPos, aScrollSz);

        aScrollSz.Width() = aScrollSz.Height();
        aScrollSz.Height() = aOutSz.Height();
        aScrollPos = Point(aOutSz.Width() - nScrollStd, 0);

        pVScrollbar->SetPosSizePixel( aScrollPos, aScrollSz);
        aOutSz.Width()  -= nScrollStd;
        aOutSz.Height()     -= nScrollStd;
        pOutWin->SetOutputSizePixel(aOutSz);
        // Zeile im ersten Resize setzen
        if(USHRT_MAX != nStartLine)
        {
            if(nStartLine < pTextEngine->GetParagraphCount())
            {
                TextSelection aSel(TextPaM( nStartLine, 0 ), TextPaM( nStartLine, 0x0 ));
                pTextView->SetSelection(aSel);
                pTextView->ShowCursor();
            }
            nStartLine = USHRT_MAX;
        }

        if ( nVisY != pTextView->GetStartDocPos().Y() )
            Invalidate();
    }

}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void TextViewOutWin::DataChanged( const DataChangedEvent& )
{
    const Color &rCol = GetSettings().GetStyleSettings().GetWindowColor();
    SetBackground( rCol );
    Font aFont( pTextView->GetTextEngine()->GetFont() );
    aFont.SetFillColor( rCol );
    pTextView->GetTextEngine()->SetFont( aFont );
}

void  TextViewOutWin::MouseMove( const MouseEvent &rEvt )
{
    if ( pTextView )
        pTextView->MouseMove( rEvt );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void  TextViewOutWin::MouseButtonUp( const MouseEvent &rEvt )
{
    if ( pTextView )
    {
        pTextView->MouseButtonUp( rEvt );
        ((SwSrcEditWindow*)GetParent())->GetSrcView()->GetViewFrame()->
                        GetBindings().Invalidate( SID_TABLE_CELL );
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void  TextViewOutWin::MouseButtonDown( const MouseEvent &rEvt )
{
    GrabFocus();
    if ( pTextView )
        pTextView->MouseButtonDown( rEvt );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void  TextViewOutWin::Command( const CommandEvent& rCEvt )
{
    switch(rCEvt.GetCommand())
    {
        case COMMAND_CONTEXTMENU:
            ((SwSrcEditWindow*)GetParent())->GetSrcView()->GetViewFrame()->
                GetDispatcher()->ExecutePopup();
        break;
        case COMMAND_WHEEL:
        case COMMAND_STARTAUTOSCROLL:
        case COMMAND_AUTOSCROLL:
        {
            const CommandWheelData* pWData = rCEvt.GetWheelData();
            if( !pWData || COMMAND_WHEEL_ZOOM != pWData->GetMode() )
            {
                ((SwSrcEditWindow*)GetParent())->HandleWheelCommand( rCEvt );
            }
        }
        break;

        default:
            if ( pTextView )
            pTextView->Command( rCEvt );
        else
            Window::Command(rCEvt);
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


BOOL  TextViewOutWin::Drop( const DropEvent& rEvt )
{
    BOOL bDone = FALSE;
    if ( pTextView )
    {
        bDone = pTextView->Drop( rEvt );
        if ( bDone )
        {
            SfxBindings& rBindings = ((SwSrcEditWindow*)GetParent())->
                            GetSrcView()->GetViewFrame()->GetBindings();
            rBindings.Invalidate( SID_TABLE_CELL );
            rBindings.Invalidate( SID_SAVEDOC );
            rBindings.Invalidate( SID_DOC_MODIFIED );
        }
    }
    return bDone;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


BOOL  TextViewOutWin::QueryDrop( DropEvent& rEvt )
{
    if ( pTextView && !((SwSrcEditWindow*)GetParent())->IsReadonly() )
        return pTextView->QueryDrop( rEvt );
    return FALSE;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void  TextViewOutWin::KeyInput( const KeyEvent& rKEvt )
{
    BOOL bDone = FALSE;
    SwSrcEditWindow* pSrcEditWin = (SwSrcEditWindow*)GetParent();
    BOOL bChange = !pSrcEditWin->IsReadonly() || !TextEngine::DoesKeyChangeText( rKEvt );
    if(bChange)
        bDone = pTextView->KeyInput( rKEvt );

    if ( !bDone )
    {
        if ( !SfxViewShell::Current()->KeyInput( rKEvt ) )
            Window::KeyInput( rKEvt );
    }
    else
    {
        SfxBindings& rBindings = ((SwSrcEditWindow*)GetParent())->GetSrcView()->GetViewFrame()->GetBindings();
        rBindings.Invalidate( SID_TABLE_CELL );
        if ( rKEvt.GetKeyCode().GetGroup() == KEYGROUP_CURSOR )
            rBindings.Update( SID_BASICIDE_STAT_POS );
        if (pSrcEditWin->GetTextEngine()->IsModified() )
        {
            rBindings.Invalidate( SID_SAVEDOC );
            rBindings.Invalidate( SID_DOC_MODIFIED );
        }
        if( rKEvt.GetKeyCode().GetCode() == KEY_INSERT )
            rBindings.Invalidate( SID_ATTR_INSERT );
    }
    SwDocShell* pDocShell = pSrcEditWin->GetSrcView()->GetDocShell();
    if(pSrcEditWin->GetTextEngine()->IsModified())
    {
        pDocShell->SetModified();
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void  TextViewOutWin::Paint( const Rectangle& rRect )
{
    pTextView->Paint( rRect );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwSrcEditWindow::CreateTextEngine()
{
    const Color &rCol = GetSettings().GetStyleSettings().GetWindowColor();
    pOutWin = new TextViewOutWin(this, 0);
    pOutWin->SetBackground(Wallpaper(rCol));
    pOutWin->SetPointer(Pointer(POINTER_TEXT));
    pOutWin->Show();

    //Scrollbars anlegen
    pHScrollbar = new ScrollBar(this, WB_3DLOOK |WB_HSCROLL|WB_DRAG);
    pHScrollbar->SetScrollHdl(LINK(this, SwSrcEditWindow, ScrollHdl));
    pHScrollbar->Show();

    pVScrollbar = new ScrollBar(this, WB_3DLOOK |WB_VSCROLL|WB_DRAG);
    pVScrollbar->SetScrollHdl(LINK(this, SwSrcEditWindow, ScrollHdl));
    pHScrollbar->EnableDrag();
    pVScrollbar->Show();

    pTextEngine = new ExtTextEngine;
    pTextView = new ExtTextView( pTextEngine, pOutWin );
    pTextView->SetAutoIndentMode(TRUE);
    pOutWin->SetTextView(pTextView);

    pTextEngine->SetUpdateMode( FALSE );
    pTextEngine->InsertView( pTextView );

    Font aFont;
    aFont.SetCharSet( gsl_getSystemTextEncoding() );
    aFont.SetSize( Size( 0, 12 ) );
    aFont.SetPitch( PITCH_VARIABLE );
    aFont.SetWeight( WEIGHT_NORMAL );
    aFont.SetName( String::CreateFromAscii("Courier") );
    aFont.SetFamily( FAMILY_MODERN );
    aFont.SetPitch( PITCH_FIXED );
//  Font aFont( System::GetStandardFont( STDFONT_FIXED ) );
    aFont.SetTransparent( FALSE );

    Size aFontSize( 0, 10 );

#ifdef MAC
    aFont.SetName( "Monaco" );
#endif

    aFont.SetFillColor( rCol );
    aFont.SetSize( aFontSize );
    SetPointFont( aFont );
    aFont = GetFont();
    aFont.SetFillColor( rCol );
    pOutWin->SetFont( aFont );

    pTextEngine->SetFont( aFont );


    aSyntaxIdleTimer.SetTimeout( 200 );
    aSyntaxIdleTimer.SetTimeoutHdl( LINK( this, SwSrcEditWindow, SyntaxTimerHdl ) );

    pTextEngine->EnableUndo( TRUE );
    pTextEngine->SetUpdateMode( TRUE );

    pTextView->ShowCursor( TRUE, TRUE );
    InitScrollBars();
    StartListening( *pTextEngine );

    SfxBindings& rBind = GetSrcView()->GetViewFrame()->GetBindings();
    rBind.Invalidate( SID_TABLE_CELL );
    rBind.Invalidate( SID_ATTR_CHAR_FONTHEIGHT );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwSrcEditWindow::SetScrollBarRanges()
{
    // Extra-Methode, nicht InitScrollBars, da auch fuer TextEngine-Events.

    pHScrollbar->SetRange( Range( 0, nCurTextWidth ) );
    pVScrollbar->SetRange( Range(0, pTextEngine->GetTextHeight()) );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwSrcEditWindow::InitScrollBars()
{
    SetScrollBarRanges();

    Size aOutSz( GetOutputSizePixel() );
    pVScrollbar->SetVisibleSize( aOutSz.Height() );
    pVScrollbar->SetPageSize(  aOutSz.Height() * 8 / 10 );
    pVScrollbar->SetLineSize( pOutWin->GetTextHeight() );
    pVScrollbar->SetThumbPos( pTextView->GetStartDocPos().Y() );
    pHScrollbar->SetVisibleSize( aOutSz.Width() );
    pHScrollbar->SetPageSize( aOutSz.Width() * 8 / 10 );
    pHScrollbar->SetLineSize( pOutWin->GetTextWidth( 'x' ) );
    pHScrollbar->SetThumbPos( pTextView->GetStartDocPos().X() );

}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


IMPL_LINK(SwSrcEditWindow, ScrollHdl, ScrollBar*, pScroll)
{
    if(pScroll == pVScrollbar)
    {
        long nDiff = pTextView->GetStartDocPos().Y() - pScroll->GetThumbPos();
        GetTextView()->Scroll( 0, nDiff );
        pTextView->ShowCursor( FALSE, TRUE );
        pScroll->SetThumbPos( pTextView->GetStartDocPos().Y() );
    }
    else
    {
        long nDiff = pTextView->GetStartDocPos().X() - pScroll->GetThumbPos();
        GetTextView()->Scroll( nDiff, 0 );
        pTextView->ShowCursor( FALSE, TRUE );
        pScroll->SetThumbPos( pTextView->GetStartDocPos().X() );
    }
    GetSrcView()->GetViewFrame()->GetBindings().Invalidate( SID_TABLE_CELL );
    return 0;
}

/*-----------------15.01.97 09.22-------------------

--------------------------------------------------*/

IMPL_LINK( SwSrcEditWindow, SyntaxTimerHdl, Timer *, pTimer )
{
    DBG_ASSERT( pTextView, "Noch keine View, aber Syntax-Highlight ?!" );
    pTextEngine->SetUpdateMode( FALSE );

    bHighlighting = TRUE;
    USHORT nLine;
    USHORT nCount  = 0;
    // zuerst wird der Bereich um dem Cursor bearbeitet
    TextSelection aSel = pTextView->GetSelection();
    USHORT nCur = aSel.GetStart().GetPara();
    if(nCur > 40)
        nCur -= 40;
    else
        nCur = 0;
    if(aSyntaxLineTable.Count())
        for(USHORT i = 0; i < 80 && nCount < 40; i++, nCur++)
        {
            void * p = aSyntaxLineTable.Get(nCur);
            if(p)
            {
                DoSyntaxHighlight( nCur );
                aSyntaxLineTable.Remove( nCur );
                nCount++;
                if(!aSyntaxLineTable.Count())
                    break;
            }
        }

    // wenn dann noch etwas frei ist, wird von Beginn an weitergearbeitet
    void* p = aSyntaxLineTable.First();
    while ( p && nCount < MAX_SYNTAX_HIGHLIGHT)
    {
        nLine = (USHORT)aSyntaxLineTable.GetCurKey();
        DoSyntaxHighlight( nLine );
        USHORT nCur = (USHORT)aSyntaxLineTable.GetCurKey();
        p = aSyntaxLineTable.Next();
        aSyntaxLineTable.Remove(nCur);
        nCount ++;
    }
    // os: #43050# hier wird ein TextView-Problem umpopelt:
    // waehrend des Highlightings funktionierte das Scrolling nicht
    TextView* pTmp = pTextEngine->GetActiveView();
    pTextEngine->SetActiveView(0);
    pTextEngine->SetUpdateMode( TRUE );
    pTextEngine->SetActiveView(pTmp);
    pTextView->ShowCursor(FALSE, FALSE);

    if(aSyntaxLineTable.Count() && !pTimer->IsActive())
        pTimer->Start();
    // SyntaxTimerHdl wird gerufen, wenn Text-Aenderung
    // => gute Gelegenheit, Textbreite zu ermitteln!
    long nPrevTextWidth = nCurTextWidth;
    nCurTextWidth = pTextEngine->CalcTextWidth() + 25;  // kleine Toleranz
    if ( nCurTextWidth != nPrevTextWidth )
        SetScrollBarRanges();
    bHighlighting = FALSE;

    return 0;
}
/*-----------------15.01.97 10.01-------------------

--------------------------------------------------*/

void SwSrcEditWindow::DoSyntaxHighlight( USHORT nPara )
{
    // Durch das DelayedSyntaxHighlight kann es passieren,
    // dass die Zeile nicht mehr existiert!
    if ( nPara < pTextEngine->GetParagraphCount() )
    {
        BOOL bTempModified = IsModified();
        pTextEngine->RemoveAttribs( nPara );
        String aSource( pTextEngine->GetText( nPara ) );
        pTextEngine->SetUpdateMode( FALSE );
        ImpDoHighlight( aSource, nPara );
        // os: #43050# hier wird ein TextView-Problem umpopelt:
        // waehrend des Highlightings funktionierte das Scrolling nicht
        TextView* pTmp = pTextEngine->GetActiveView();
        pTmp->SetAutoScroll(FALSE);
        pTextEngine->SetActiveView(0);
        pTextEngine->SetUpdateMode( TRUE );
        pTextEngine->SetActiveView(pTmp);
        // Bug 72887 show the cursor
        pTmp->SetAutoScroll(TRUE);
        pTmp->ShowCursor( FALSE/*pTmp->IsAutoScroll()*/ );

        if(!bTempModified)
            ClearModifyFlag();
    }
}

/*-----------------15.01.97 09.49-------------------

--------------------------------------------------*/

void SwSrcEditWindow::DoDelayedSyntaxHighlight( USHORT nPara )
{
    if ( !bHighlighting && bDoSyntaxHighlight )
    {
        aSyntaxLineTable.Insert( nPara, (void*)(USHORT)1 );
        aSyntaxIdleTimer.Start();
    }
}

/*-----------------15.01.97 11.32-------------------

--------------------------------------------------*/

void SwSrcEditWindow::ImpDoHighlight( const String& rSource, USHORT nLineOff )
{
    SwTextPortions aPortionList;
    lcl_Highlight(rSource, aPortionList);

    USHORT nCount = aPortionList.Count();
    if ( !nCount )
        return;

    SwTextPortion& rLast = aPortionList[nCount-1];
    if ( rLast.nStart > rLast.nEnd )    // Nur bis Bug von MD behoeben
    {
        nCount--;
        aPortionList.Remove( nCount);
        if ( !nCount )
            return;
    }

    // Evtl. Optimieren:
    // Wenn haufig gleiche Farbe, dazwischen Blank ohne Farbe,
    // ggf. zusammenfassen, oder zumindest das Blank,
    // damit weniger Attribute
    BOOL bOptimizeHighlight = TRUE; // war in der BasicIDE static
    if ( bOptimizeHighlight )
    {
        // Es muessen nur die Blanks und Tabs mit attributiert werden.
        // Wenn zwei gleiche Attribute hintereinander eingestellt werden,
        // optimiert das die TextEngine.
        USHORT nLastEnd = 0;
        USHORT nLine = aPortionList[0].nLine;
        for ( USHORT i = 0; i < nCount; i++ )
        {
            SwTextPortion& r = aPortionList[i];
            DBG_ASSERT( r.nLine == nLine, "doch mehrere Zeilen ?" );
            if ( r.nStart > r.nEnd )    // Nur bis Bug von MD behoeben
                continue;

            if ( r.nStart > nLastEnd )
            {
                // Kann ich mich drauf verlassen, dass alle ausser
                // Blank und Tab gehighlightet wird ?!
                r.nStart = nLastEnd;
            }
            nLastEnd = r.nEnd+1;
            if ( ( i == (nCount-1) ) && ( r.nEnd < rSource.Len() ) )
                r.nEnd = rSource.Len();
        }
    }

    for ( USHORT i = 0; i < aPortionList.Count(); i++ )
    {
        SwTextPortion& r = aPortionList[i];
        if ( r.nStart > r.nEnd )    // Nur bis Bug von MD behoeben
            continue;
        USHORT nCol = r.eType;
        DBG_ASSERT( nCol < SYNTAX_COLOR_MAX, "Neue Syntax-Farbe?" );
        if ( nCol < SYNTAX_COLOR_MAX )
        {
            Color aColor = pSrcVwConfig->GetSyntaxColor(nCol);
            USHORT nLine = nLineOff+r.nLine; //
            pTextEngine->SetAttrib( TextAttribFontColor( aColor ), nLine, r.nStart, r.nEnd+1 );
        }
    }
}
/*-----------------21.04.97 09:42-------------------

--------------------------------------------------*/
void SwSrcEditWindow::SyntaxColorsChanged()
{
    for(USHORT i = 0; i < pTextEngine->GetParagraphCount(); i++)
        aSyntaxLineTable.Insert( i, (void*)(USHORT)1 );
    if(!aSyntaxIdleTimer.IsActive())
        aSyntaxIdleTimer.Start();

}
/*-----------------30.06.97 09:12-------------------

--------------------------------------------------*/

void SwSrcEditWindow::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
{
    if ( rHint.ISA( TextHint ) )
    {
        const TextHint& rTextHint = (const TextHint&)rHint;
        if( rTextHint.GetId() == TEXT_HINT_VIEWSCROLLED )
        {
            pHScrollbar->SetThumbPos( pTextView->GetStartDocPos().X() );
            pVScrollbar->SetThumbPos( pTextView->GetStartDocPos().Y() );
        }
        else if( rTextHint.GetId() == TEXT_HINT_TEXTHEIGHTCHANGED )
        {
            if ( (long)pTextEngine->GetTextHeight() < pOutWin->GetOutputSizePixel().Height() )
                pTextView->Scroll( 0, pTextView->GetStartDocPos().Y() );
            pVScrollbar->SetThumbPos( pTextView->GetStartDocPos().Y() );
            SetScrollBarRanges();
        }
        else if( rTextHint.GetId() == TEXT_HINT_FORMATPARA )
        {
            DoDelayedSyntaxHighlight( rTextHint.GetValue() );
        }
    }
}

/*-----------------30.06.97 13:22-------------------

--------------------------------------------------*/

void    SwSrcEditWindow::Invalidate()
{
    pOutWin->Invalidate();
    Window::Invalidate();

}

void SwSrcEditWindow::Command( const CommandEvent& rCEvt )
{
    switch(rCEvt.GetCommand())
    {
        case COMMAND_WHEEL:
        case COMMAND_STARTAUTOSCROLL:
        case COMMAND_AUTOSCROLL:
        {
            const CommandWheelData* pWData = rCEvt.GetWheelData();
            if( !pWData || COMMAND_WHEEL_ZOOM != pWData->GetMode() )
                HandleScrollCommand( rCEvt, pHScrollbar, pVScrollbar );
        }
        break;
        default:
            Window::Command(rCEvt);
    }
}

void SwSrcEditWindow::HandleWheelCommand( const CommandEvent& rCEvt )
{
    pTextView->Command(rCEvt);
    HandleScrollCommand( rCEvt, pHScrollbar, pVScrollbar );
}

void SwSrcEditWindow::GetFocus()
{
//  rView.GotFocus();
    pOutWin->GrabFocus();
//  pOutWin->GetFocus();
//  Window::GetFocus();
}

/*void SwSrcEditWindow::LoseFocus()
{
    Window::LoseFocus();
//  pOutWin->LoseFocus();
//  rView.LostFocus();
} */

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.55  2000/09/18 16:05:24  willem.vandorp
    OpenOffice header added.

    Revision 1.54  2000/09/14 10:36:36  os
    GetBindings()  access corrected

    Revision 1.53  2000/09/07 15:59:22  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.52  2000/06/23 07:49:49  os
    #75591# disable AutoScroll while syntax highlighting

    Revision 1.51  2000/04/18 15:18:17  os
    UNICODE

    Revision 1.50  2000/03/03 15:17:00  os
    StarView remainders removed

    Revision 1.49  2000/02/14 14:48:40  os
    #70473# Unicode

    Revision 1.48  2000/02/10 20:45:06  jp
    Bug #72887#: ShowCursor in HTML code view

    Revision 1.47  1999/11/10 14:25:10  os
    KeyInput: Assertion removed

    Revision 1.46  1999/05/21 13:14:40  OS
    #55722# Scrolling waehrend Syntax-Highlight


      Rev 1.45   21 May 1999 15:14:40   OS
   #55722# Scrolling waehrend Syntax-Highlight

      Rev 1.44   02 Dec 1998 16:30:22   OS
   #66066# Hintergrund- und Font-Farbe initial aus den Systemeinstellungen holen

      Rev 1.43   18 Aug 1998 13:38:14   OS
   Mouse auf Raedern eingebaut #55166#

      Rev 1.42   29 Jun 1998 12:56:52   OS
   SW_MOD statt GetActiveModule

      Rev 1.41   24 Jun 1998 18:43:08   MA
   DataChanged fuer ScrollBar und Retouche, Retouche ganz umgestellt

      Rev 1.40   02 Apr 1998 11:38:08   OS
   neue HelpId

      Rev 1.39   24 Mar 1998 15:59:28   OS
   AutoIndent fuer TextEngine

      Rev 1.38   19 Mar 1998 18:11:28   OS
   ShowCursor nach dem Highlight #48789#

      Rev 1.37   18 Mar 1998 15:05:48   OS
   Fontgroesse berichtigt #47428#

------------------------------------------------------------------------*/

diff --git a/sw/source/ui/envelp/envelp.src b/sw/source/ui/envelp/envelp.src
new file mode 100644
index 0000000..8cf07e2
--- /dev/null
+++ b/sw/source/ui/envelp/envelp.src
@@ -0,0 +1,202 @@
/*************************************************************************
 *
 *  $RCSfile: envelp.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:35 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
 // #pragma ******************************************************************

 // #include *****************************************************************
#include "envelp.hrc"
#include "globals.hrc"
 // Strings ******************************************************************
String STR_DATABASE_NOT_OPENED
{
    Text = "Datenbank konnte nicht geöffnet werden." ;
    Text [ English ] = "Could not open database." ;
    Text [ norwegian ] = "Could not open database." ;
    Text [ italian ] = "Impossibile aprire il database." ;
    Text [ portuguese_brazilian ] = "Não pude abrir base de dados." ;
    Text [ portuguese ] = "Foi impossível abrir base de dados." ;
    Text [ finnish ] = "Tietokantaa ei voi avata." ;
    Text [ danish ] = "Det var ikke muligt at åbne databasen." ;
    Text [ french ] = "Impossible d'ouvrir la base de données." ;
    Text [ swedish ] = "Databas kunde inte öppnas." ;
    Text [ dutch ] = "Database kon niet worden geopend." ;
    Text [ spanish ] = "No se pudo abrir la base de datos." ;
    Text [ english_us ] = "Database could not be opened." ;
    Text[ chinese_simplified ] = "ÎÞ·¨´ò¿ªÊý¾Ý¿â¡£";
    Text[ russian ] = "Îòêðûòü áàçó äàííûõ íåâîçìîæíî.";
    Text[ polish ] = "Baza danych nie mog³a byæ otworzona.";
    Text[ japanese ] = "ÃÞ°ÀÍÞ°½‚ðŠJ‚­‚±‚Æ‚ª‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½";
    Text[ chinese_traditional ] = "µLªk¶}±Ò¸ê®Æ®w¡C";
    Text[ arabic ] = "ÊÚÐÑ ÝÊÍ ÞÇÚÏÉ ÇáÈíÇäÇÊ.";
    Text[ dutch ] = "Database kon niet worden geopend.";
    Text[ chinese_simplified ] = "ÎÞ·¨´ò¿ªÊý¾Ý¿â¡£";
    Text[ greek ] = "Äåí Þôáí äõíáôüí íá áíïé÷ôåß ç âÜóç äåäïìÝíùí.";
    Text[ korean ] = "µ¥ÀÌÅͺ£À̽º°¡ ¿­¸±¼ö ¾ø½À´Ï´Ù.";
    Text[ turkish ] = "Veritabaný açýlamadý.";
    Text[ language_user1 ] = " ";
};
String STR_NO_DRIVERS
{
    Text = "Keine Datenbanktreiber installiert." ;
    Text [ English ] = "No database drivers installed." ;
    Text [ norwegian ] = "No database drivers installed." ;
    Text [ italian ] = "Non sono installati driver di controllo database." ;
    Text [ portuguese_brazilian ] = "Nenhum driver de base de dados instalado." ;
    Text [ portuguese ] = "Controlador da base de dados não instalado." ;
    Text [ finnish ] = "Tietokanta-ajureita ei ole asennettu." ;
    Text [ danish ] = "Ingen databasedriverere installeret." ;
    Text [ french ] = "Aucun gestionnaire de base de données installé." ;
    Text [ swedish ] = "Inga databasdrivrutiner är installerade." ;
    Text [ dutch ] = "Geen database-drivers geïnstalleerd." ;
    Text [ spanish ] = "No se han instalado controladores de bases de datos." ;
    Text [ english_us ] = "No database drivers installed." ;
    Text[ chinese_simplified ] = "ûÓа²×°Êý¾Ý¿âÇý¶¯³ÌÐò¡£";
    Text[ russian ] = "Äðàéâåð äëÿ áàçû äàííûõ íå èíñòàëèðîâàí.";
    Text[ polish ] = "Nie zainstalowany sterownik bazy danych.";
    Text[ japanese ] = "ÃÞ°ÀÍÞ°½ÄÞ×Êނª²Ý½Ä°Ù‚³‚ê‚Ä‚¢‚Ü‚¹‚ñB";
    Text[ chinese_traditional ] = "¨S¦³¦w¸Ë¸ê®Æ®wÅX°Êµ{¦¡¡C";
    Text[ arabic ] = "áÇ íæÌÏ ÈÑÇãÌ ÊÔÛíá ÞæÇÚÏ ÈíÇäÇÊ ãËÈÊå.";
    Text[ dutch ] = "Geen database-drivers geïnstalleerd.";
    Text[ chinese_simplified ] = "ûÓа²×°Êý¾Ý¿âÇý¶¯³ÌÐò¡£";
    Text[ greek ] = "Äåí Ý÷åé ãßíåé åãêáôÜóôáóç ðñïãñÜììáôïò ïäÞãçóçò âÜóçò äåäïìÝíùí.";
    Text[ korean ] = "µ¥ÀÌÅͺ£À̽º µå¶óÀ̹ö°¡ ¼³Ä¡µÇÁö ¾Ê¾Ò½À´Ï´Ù.";
    Text[ turkish ] = "Kurulmuþ veritabaný sürücüsü mevcut deðil.";
    Text[ language_user1 ] = " ";
};
String STR_BTN_NEW_DOC
{
    Text = "~Neues Dokument" ;
    Text [ English ] = "~New document" ;
    Text [ norwegian ] = "~New doc." ;
    Text [ italian ] = "Nuovo documento" ;
    Text [ portuguese_brazilian ] = "~Novo doc." ;
    Text [ portuguese ] = "~Novo documento" ;
    Text [ finnish ] = "~Uusi asiakirja" ;
    Text [ danish ] = "Nyt dokument" ;
    Text [ french ] = "~Nouveau document" ;
    Text [ swedish ] = "~Nytt dokument" ;
    Text [ dutch ] = "~Nieuw document" ;
    Text [ spanish ] = "~Nuevo documento" ;
    Text [ english_us ] = "~New Document" ;
    Text[ chinese_simplified ] = "н¨Îĵµ(~N)";
    Text[ russian ] = "Íîâûé äîêóìåíò";
    Text[ polish ] = "Nowy dok.";
    Text[ japanese ] = "V‚µ‚¢•¶‘(~N)";
    Text[ chinese_traditional ] = "¶}±Ò·sÀÉ(~N)";
    Text[ arabic ] = "ãÓÊäÏ ÌÏíÏ";
    Text[ dutch ] = "~Nieuw document";
    Text[ chinese_simplified ] = "н¨Îĵµ(~N)";
    Text[ greek ] = "Äçìéïõñãßá åããñÜöïõ";
    Text[ korean ] = "»õ·Î¿î ¹®¼­(~N)";
    Text[ turkish ] = "~Yeni belge";
    Text[ language_user1 ] = " ";
};

String STR_BTN_NEWDOC
{
    Text = "~Neues Dok." ;
    Text [ English ] = "~New doc." ;
    Text[ english_us ] = "~New doc.";
    Text[ portuguese ] = "~Novo doc.";
    Text[ russian ] = "Íîâûé äîêóìåíò";
    Text[ dutch ] = "~Nieuw doc.";
    Text[ french ] = "~Nouveau doc.";
    Text[ spanish ] = "~Nuevo doc.";
    Text[ italian ] = "Nuovo doc.";
    Text[ danish ] = "Nyt dok.";
    Text[ swedish ] = "~Nytt dok.";
    Text[ polish ] = "Nowy dok.";
    Text[ portuguese_brazilian ] = "~New doc.";
    Text[ japanese ] = "V‚µ‚¢•¶‘(~N)";
    Text[ chinese_simplified ] = "н¨Îĵµ(~N)";
    Text[ chinese_traditional ] = "¶}±Ò·sÀÉ(~N)";
    Text[ arabic ] = "ãÓÊäÏ ÌÏíÏ";
    Text[ dutch ] = "~Nieuw doc.";
    Text[ chinese_simplified ] = "н¨Îĵµ(~N)";
    Text[ greek ] = "Äçìéïõñãßá åããñÜöïõ";
    Text[ korean ] = "»õ·Î¿î ¹®¼­.(~N)";
    Text[ turkish ] = "~Yeni blg.";
    Text[ language_user1 ] = " ";
};

String STR_SENDER_TOKENS
{
    Text = "COMPANY;CR;FIRSTNAME; ;LASTNAME;CR;ADDRESS;CR;COUNTRY; ;POSTALCODE; ;CITY;CR;";
    Text [ English ] = "COMPANY;CR;FIRSTNAME; ;LASTNAME;CR;ADDRESS;CR;CITY; ;STATEPROV; ;POSTALCODE;CR;COUNTRY;CR;";
    Text [ english_us ] = "COMPANY;CR;FIRSTNAME; ;LASTNAME;CR;ADDRESS;CR;CITY; ;STATEPROV; ;POSTALCODE;CR;COUNTRY;CR;";
    Text[ portuguese ] = "COMPANY;CR;FIRSTNAME; ;LASTNAME;CR;ADDRESS;CR;COUNTRY; ;POSTALCODE; ;CITY;CR;";
    Text[ russian ] = "COMPANY;CR;FIRSTNAME; ;LASTNAME;CR;ADDRESS;CR;CITY; ;STATEPROV; ;POSTALCODE;CR;COUNTRY;CR;";
    Text[ greek ] = "COMPANY;CR;FIRSTNAME; ;LASTNAME;CR;ADDRESS;CR;CITY; ;STATEPROV; ;POSTALCODE;CR;COUNTRY;CR;";
    Text[ dutch ] = "COMPANY;CR;FIRSTNAME; ;LASTNAME;CR;ADDRESS;CR;CITY; ;STATEPROV; ;POSTALCODE;CR;COUNTRY;CR;";
    Text[ french ] = "COMPANY;CR;FIRSTNAME; ;LASTNAME;CR;ADDRESS;CR;CITY; ;STATEPROV; ;POSTALCODE;CR;COUNTRY;CR;";
    Text[ spanish ] = "COMPANY;CR;FIRSTNAME; ;LASTNAME;CR;ADDRESS;CR;COUNTRY; ;POSTALCODE; ;CITY;CR;";
    Text[ italian ] = "COMPANY;CR;FIRSTNAME; ;LASTNAME;CR;ADDRESS;CR;COUNTRY; ;POSTALCODE; ;CITY;CR;";
    Text[ danish ] = "COMPANY;CR;FIRSTNAME; ;LASTNAME;CR;ADDRESS;CR;COUNTRY; ;POSTALCODE; :CITY;CR;";
    Text[ swedish ] = "COMPANY;CR;FIRSTNAME; ;LASTNAME;CR;ADDRESS;CR;COUNTRY; ;POSTALCODE; ;CITY;CR; ";
    Text[ polish ] = "COMPANY;CR;FIRSTNAME; ;LASTNAME;CR;ADDRESS;CR;CITY; ;STATEPROV; ;POSTALCODE;CR;COUNTRY;CR;";
    Text[ portuguese_brazilian ] = "COMPANY;CR;FIRSTNAME; ;LASTNAME;CR;ADDRESS;CR;CITY; ;STATEPROV; ;POSTALCODE;CR;COUNTRY;CR;";
    Text[ japanese ] = "COMPANY;CR;FIRSTNAME; ;LASTNAME;CR;ADDRESS;CR;CITY; ;STATEPROV; ;POSTALCODE;CR;COUNTRY;CR;";
    Text[ korean ] = "COMPANY;CR;FIRSTNAME; ;LASTNAME;CR;ADDRESS;CR;CITY; ;STATEPROV; ;POSTALCODE;CR;COUNTRY;CR;";
    Text[ chinese_simplified ] = "COMPANY;CR;FIRSTNAME; ;LASTNAME;CR;ADDRESS;CR;CITY; ;STATEPROV; ;POSTALCODE;CR;COUNTRY;CR;";
    Text[ chinese_traditional ] = "COMPANY;CR;FIRSTNAME;;LASTNAME;CR;ADDRESS;CR;CITY;;STATEPROV; ;POSTALCODE;CR;COUNTRY;CR;";
    Text[ turkish ] = "COMPANY;CR;FIRSTNAME; ;LASTNAME;CR;ADDRESS;CR;CITY; ;STATEPROV; ;POSTALCODE;CR;COUNTRY;CR;";
    Text[ arabic ] = "COMPANY;CR;FIRSTNAME; ;LASTNAME;CR;ADDRESS;CR;CITY; ;STATEPROV; ;POSTALCODE;CR;COUNTRY;CR;";
};

diff --git a/sw/source/ui/envelp/envfmt.cxx b/sw/source/ui/envelp/envfmt.cxx
new file mode 100644
index 0000000..d6d9b6d
--- /dev/null
+++ b/sw/source/ui/envelp/envfmt.cxx
@@ -0,0 +1,803 @@
/*************************************************************************
 *
 *  $RCSfile: envfmt.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:35 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop
#include <tools/pstm.hxx>
#include "hintids.hxx"

#ifndef _SVX_PAPERINF_HXX //autogen
#include <svx/paperinf.hxx>
#endif
#ifndef _SVX_TSTPITEM_HXX //autogen
#include <svx/tstpitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _MENU_HXX //autogen
#include <vcl/menu.hxx>
#endif


#include "cmdid.h"
#include "frmatr.hxx"
#include "swtypes.hxx"
#include "wrtsh.hxx"
#include "view.hxx"
#include "basesh.hxx"
#include "chrdlg.hxx"
#include "drpcps.hxx"
#include "envfmt.hxx"
#include "fmtcol.hxx"
#include "pardlg.hxx"
#include "pattern.hxx"
#include "poolfmt.hxx"
#include "uiborder.hxx"
#include "uitool.hxx"

#include "envfmt.hrc"

static PopupMenu *pMenu;
static long lUserW = 5669; // 10 cm
static long lUserH = 5669; // 10 cm

SV_DECL_VARARR_SORT( ItemRanges, long, 0, 10 )
SV_IMPL_VARARR_SORT( ItemRanges, long )

SV_DECL_VARARR( CompactRanges, long, 0, 10 )
SV_IMPL_VARARR( CompactRanges, long )

// --------------------------------------------------------------------------


SwEnvFmtPage::SwEnvFmtPage(Window* pParent, const SfxItemSet& rSet) :

    SfxTabPage(pParent, SW_RES(TP_ENV_FMT), rSet),

    aAddrInfo      (this, SW_RES(TXT_ADDRESSEE)),
    aAddrLeftText  (this, SW_RES(TXT_ADDR_LEFT)),
    aAddrLeftField (this, SW_RES(FLD_ADDR_LEFT)),
    aAddrTopText   (this, SW_RES(TXT_ADDR_TOP )),
    aAddrTopField  (this, SW_RES(FLD_ADDR_TOP )),
    aAddrEditButton(this, SW_RES(BTN_ADDR_EDIT)),
    aSendInfo      (this, SW_RES(TXT_SENDER   )),
    aSendLeftText  (this, SW_RES(TXT_SEND_LEFT)),
    aSendLeftField (this, SW_RES(FLD_SEND_LEFT)),
    aSendTopText   (this, SW_RES(TXT_SEND_TOP )),
    aSendTopField  (this, SW_RES(FLD_SEND_TOP )),
    aSendEditButton(this, SW_RES(BTN_SEND_EDIT)),
    aPreview       (this, SW_RES(WIN_PREVIEW  )),
    aPositionsGroup(this, SW_RES(GRP_POSITIONS)),
    aFormatText    (this, SW_RES(TXT_FORMAT   )),
    aFormatBox     (this, SW_RES(BOX_FORMAT   )),
    aWidthText     (this, SW_RES(TXT_WIDTH    )),
    aWidthField    (this, SW_RES(FLD_WIDTH    )),
    aHeightText    (this, SW_RES(TXT_HEIGHT   )),
    aHeightField   (this, SW_RES(FLD_HEIGHT   )),
    aSizeGroup     (this, SW_RES(GRP_SIZE     ))

{
    FreeResource();
    SetExchangeSupport();

    // Metriken
    FieldUnit aMetric = ::GetDfltMetric(FALSE);
    SetMetric(aAddrLeftField, aMetric);
    SetMetric(aAddrTopField , aMetric);
    SetMetric(aSendLeftField, aMetric);
    SetMetric(aSendTopField , aMetric);
    SetMetric(aWidthField   , aMetric);
    SetMetric(aHeightField  , aMetric);

    // Menues einhaengen
    ::pMenu = new PopupMenu(SW_RES(MNU_EDIT));
    aAddrEditButton.SetPopupMenu(::pMenu);
    aSendEditButton.SetPopupMenu(::pMenu);

    // Handler installieren
    Link aLk = LINK(this, SwEnvFmtPage, ModifyHdl);
    aAddrLeftField .SetModifyHdl( aLk );
    aAddrTopField  .SetModifyHdl( aLk );
    aSendLeftField .SetModifyHdl( aLk );
    aSendTopField  .SetModifyHdl( aLk );
    aWidthField    .SetModifyHdl( aLk );
    aHeightField   .SetModifyHdl( aLk );

    aLk = LINK(this, SwEnvFmtPage, EditHdl );
    aAddrEditButton.SetSelectHdl( aLk );
    aSendEditButton.SetSelectHdl( aLk );

    aFormatBox     .SetSelectHdl(LINK(this, SwEnvFmtPage, FormatHdl));

    // aFormatBox
    int i;
    for (i = SVX_PAPER_A3; i <= SVX_PAPER_KAI32BIG; i++)
    {
        if (i != SVX_PAPER_USER)
        {
            String aPaperName = SvxPaperInfo::GetName((SvxPaper) i),
                   aEntryName;

            USHORT nPos   = 0;
            BOOL   bFound = FALSE;
            while (nPos < aFormatBox.GetEntryCount() && !bFound)
            {
                aEntryName = aFormatBox.GetEntry(i);
                if (aEntryName < aPaperName)
                    nPos++;
                else
                    bFound = TRUE;
            }
            aFormatBox.InsertEntry(aPaperName, nPos);
            aIDs.Insert((USHORT) i, nPos);
        }
    }
    aFormatBox.InsertEntry(SvxPaperInfo::GetName(SVX_PAPER_USER));
    aIDs.Insert((USHORT) SVX_PAPER_USER, aIDs.Count());

    // Timer einstellen
    aPreviewTimer.SetTimeout(500);
    aPreviewTimer.SetTimeoutHdl(LINK(this, SwEnvFmtPage, PreviewHdl));
}

// --------------------------------------------------------------------------


__EXPORT SwEnvFmtPage::~SwEnvFmtPage()
{
    aAddrEditButton.SetPopupMenu(0);
    aSendEditButton.SetPopupMenu(0);
    delete ::pMenu;
}

// --------------------------------------------------------------------------


IMPL_LINK_INLINE_START( SwEnvFmtPage, ModifyHdl, Edit *, pEdit )
{
    pLastEdit = pEdit;
    aPreviewTimer.Start();
    return 0;
}
IMPL_LINK_INLINE_END( SwEnvFmtPage, ModifyHdl, Edit *, pEdit )

// --------------------------------------------------------------------------


IMPL_LINK( SwEnvFmtPage, EditHdl, MenuButton *, pButton )
{
    SwWrtShell* pSh = GetParent()->pSh;
    ASSERT(pSh, "Shell fehlt");

    // Collection-Ptr ermitteln
    BOOL bSender = pButton != &aAddrEditButton;

    SwTxtFmtColl* pColl = pSh->GetTxtCollFromPool(
        bSender ? RES_POOLCOLL_SENDADRESS : RES_POOLCOLL_JAKETADRESS);
    ASSERT(pColl, "Text-Collection fehlt");

    switch (pButton->GetCurItemId())
    {
        case MID_CHAR:
        {
            SfxItemSet *pSet = GetCollItemSet(pColl, bSender);

            // Damit die Hintergrundfarbe nicht uebergebuegelt wird:
            SfxAllItemSet aTmpSet(*pSet);

            // Das CHRATR_BACKGROUND-Attribut wird fuer den Dialog in
            // ein RES_BACKGROUND verwandelt und wieder zurueck ...
            const SfxPoolItem *pTmpBrush;

            if( SFX_ITEM_SET == aTmpSet.GetItemState( RES_CHRATR_BACKGROUND,
                TRUE, &pTmpBrush ) )
            {
                SvxBrushItem aTmpBrush( *((SvxBrushItem*)pTmpBrush) );
                aTmpBrush.SetWhich( RES_BACKGROUND );
                aTmpSet.Put( aTmpBrush );
            }
            else
                aTmpSet.ClearItem( RES_BACKGROUND );

            SwCharDlg* pDlg = new SwCharDlg(GetParent(), pSh->GetView(), aTmpSet, &pColl->GetName());
            if (pDlg->Execute() == RET_OK)
            {
                SfxItemSet aOutputSet( *pDlg->GetOutputItemSet() );
                if( SFX_ITEM_SET == aOutputSet.GetItemState( RES_BACKGROUND,
                    FALSE, &pTmpBrush ) )
                {
                    SvxBrushItem aTmpBrush( *((SvxBrushItem*)pTmpBrush) );
                    aTmpBrush.SetWhich( RES_CHRATR_BACKGROUND );
                    pSet->Put( aTmpBrush );
                }
                aOutputSet.ClearItem( RES_BACKGROUND );
                //pColl->SetAttr( aTmpSet );
                pSet->Put(aOutputSet);
            }
            delete pDlg;
        }
        break;

        case MID_PARA:
        {
            SfxItemSet *pSet = GetCollItemSet(pColl, bSender);

            // Damit die Tabulatoren nicht uebergebuegelt werden:
            SfxAllItemSet aTmpSet(*pSet);

            // Tabulatoren, DefaultTabs ins ItemSet Stecken
            const SvxTabStopItem& rDefTabs = (const SvxTabStopItem&)
                pSh->GetView().GetCurShell()->GetPool().GetDefaultItem(RES_PARATR_TABSTOP);

            USHORT nDefDist = ::GetTabDist( rDefTabs );
            SfxUInt16Item aDefDistItem( SID_ATTR_TABSTOP_DEFAULTS, nDefDist );
            aTmpSet.Put( aDefDistItem );

            // Aktueller Tab
            SfxUInt16Item aTabPos( SID_ATTR_TABSTOP_POS, 0 );
            aTmpSet.Put( aTabPos );

            // linker Rand als Offset
            const long nOff = ((SvxLRSpaceItem&)aTmpSet.Get( RES_LR_SPACE )).
                                                                GetTxtLeft();
            SfxInt32Item aOff( SID_ATTR_TABSTOP_OFFSET, nOff );
            aTmpSet.Put( aOff );

            // BoxInfo setzen
            ::PrepareBoxInfo( aTmpSet, *pSh );

            SwParaDlg *pDlg = new SwParaDlg(GetParent(), pSh->GetView(), aTmpSet, DLG_ENVELOP, &pColl->GetName());

            if ( pDlg->Execute() == RET_OK )
            {
                // Defaults evtl umsetzen
                const SfxPoolItem* pItem = 0;
                SfxItemSet* pOutputSet = (SfxItemSet*)pDlg->GetOutputItemSet();
                USHORT nNewDist;
                if( SFX_ITEM_SET == pOutputSet->GetItemState( SID_ATTR_TABSTOP_DEFAULTS,
                    FALSE, &pItem ) &&
                    nDefDist != (nNewDist = ((SfxUInt16Item*)pItem)->GetValue()) )
                {
                    SvxTabStopItem aDefTabs( 0, 0 );
                    MakeDefTabs( nNewDist, aDefTabs );
                    pSh->SetDefault( aDefTabs );
                    pOutputSet->ClearItem( SID_ATTR_TABSTOP_DEFAULTS );
                }
                if( pOutputSet->Count() )
                {
                    //pColl->SetAttr( *pOutputSet );
                    pSet->Put(*pOutputSet);
                }
            }
            delete pDlg;
        }
        break;
    }
    return 0;
}

/*------------------------------------------------------------------------
  Beschreibung: Ein temporaeres Itemset, das bei Abbruch verworfen wird
------------------------------------------------------------------------*/

SfxItemSet *SwEnvFmtPage::GetCollItemSet(SwTxtFmtColl* pColl, BOOL bSender)
{
    SfxItemSet *&pSet = bSender ? GetParent()->pSenderSet : GetParent()->pAddresseeSet;

    if (!pSet)
    {
        // Range ermitteln (Ranges beider Itemsets mergen)
        const USHORT *pRanges = pColl->GetAttrSet().GetRanges();

        static USHORT __READONLY_DATA aRanges[] =
        {
            RES_PARATR_BEGIN, RES_PARATR_ADJUST,
            RES_PARATR_TABSTOP, RES_PARATR_END-1,
            RES_LR_SPACE, RES_UL_SPACE,
            RES_BACKGROUND, RES_SHADOW,
            SID_ATTR_TABSTOP_POS, SID_ATTR_TABSTOP_POS,
            SID_ATTR_TABSTOP_DEFAULTS, SID_ATTR_TABSTOP_DEFAULTS,
            SID_ATTR_TABSTOP_OFFSET, SID_ATTR_TABSTOP_OFFSET,
            SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER,
            0, 0
        };

        // BruteForce-Merge, weil MergeRange in SvTools buggy ist:
        USHORT i = 0;
        ItemRanges aMergedRanges;

        while (pRanges[i])
        {
            for (USHORT nPos = pRanges[i]; nPos <= pRanges[i+1]; nPos++)
                aMergedRanges.Insert(nPos);
            i += 2;
        }

        i = 0;

        while (aRanges[i])
        {
            for (USHORT nPos = aRanges[i]; nPos <= aRanges[i+1]; nPos++)
                aMergedRanges.Insert(nPos);
            i += 2;
        }

        // Ranges kompaktieren
        CompactRanges aCompactedRanges;

        aCompactedRanges.Insert(aMergedRanges[0], aCompactedRanges.Count());

        for (i = 0; i < aMergedRanges.Count(); i++)
        {
            while (i + 1 < aMergedRanges.Count() &&
                aMergedRanges[i+1] - aMergedRanges[i] == 1)
            {
                i++;
            }
            long nEnd = aMergedRanges[i];
            aCompactedRanges.Insert(nEnd, aCompactedRanges.Count());

            if (i + 1 < aMergedRanges.Count())
            {
                long nStart = aMergedRanges[i+1];
                aCompactedRanges.Insert(nStart, aCompactedRanges.Count());
            }
        }

        // Neue Ranges erzeugen
        USHORT *pNewRanges = new USHORT[aCompactedRanges.Count() + 1];
        for (i = 0; i < aCompactedRanges.Count(); i++)
            pNewRanges[i] = (USHORT)aCompactedRanges[i];

        pNewRanges[i] = 0;

        pSet = new SfxItemSet(GetParent()->pSh->GetView().GetCurShell()->GetPool(),
                                pNewRanges);

        pSet->Put(pColl->GetAttrSet());
        delete pNewRanges;
    }

    return pSet;
}

// --------------------------------------------------------------------------


IMPL_LINK( SwEnvFmtPage, FormatHdl, ListBox *, EMPTYARG )
{
    long lWidth;
    long lHeight;
    long lSendFromLeft;
    long lSendFromTop;
    long lAddrFromLeft;
    long lAddrFromTop;

    USHORT nPaper = aIDs[aFormatBox.GetSelectEntryPos()];
    if (nPaper != (USHORT)SVX_PAPER_USER)
    {
        Size aSz = SvxPaperInfo::GetPaperSize((SvxPaper)nPaper);
        lWidth  = Max(aSz.Width(), aSz.Height());
        lHeight = Min(aSz.Width(), aSz.Height());
    }
    else
    {
        lWidth  = lUserW;
        lHeight = lUserH;
    }

    lSendFromLeft = 566;            // 1cm
    lSendFromTop  = 566;            // 1cm
    lAddrFromLeft = lWidth  / 2;
    lAddrFromTop  = lHeight / 2;

    SetFldVal(aAddrLeftField, lAddrFromLeft);
    SetFldVal(aAddrTopField , lAddrFromTop );
    SetFldVal(aSendLeftField, lSendFromLeft);
    SetFldVal(aSendTopField , lSendFromTop );

    SetFldVal(aWidthField , lWidth );
    SetFldVal(aHeightField, lHeight);

    SetMinMax();

    FillItem(GetParent()->aEnvItem);
    aPreview.Invalidate();
    return 0;
}

// --------------------------------------------------------------------------


IMPL_LINK( SwEnvFmtPage, PreviewHdl, Timer *, EMPTYARG )
{
    long lWVal = GetFldVal(aWidthField );
    long lHVal = GetFldVal(aHeightField);

    long lWidth  = Max(lWVal, lHVal);
    long lHeight = Min(lWVal, lHVal);

    if (pLastEdit == &aWidthField || pLastEdit == &aHeightField)
    {
        SvxPaper ePaper = SvxPaperInfo::GetPaper(
            Size(lHeight, lWidth), MAP_TWIP, TRUE);
        for (USHORT i = 0; i < aIDs.Count(); i++)
            if (aIDs[i] == (USHORT)ePaper)
                aFormatBox.SelectEntryPos(i);

        // Benutzergroesse merken
        if (aIDs[aFormatBox.GetSelectEntryPos()] == (USHORT)SVX_PAPER_USER)
        {
            lUserW = lWidth ;
            lUserH = lHeight;
        }

        aFormatBox.GetSelectHdl().Call(&aFormatBox);
    }
    else
    {
        FillItem(GetParent()->aEnvItem);
        SetMinMax();
        aPreview.Invalidate();
    }
    return 0;
}

// --------------------------------------------------------------------------


void SwEnvFmtPage::SetMinMax()
{
    long lWVal = GetFldVal(aWidthField );
    long lHVal = GetFldVal(aHeightField);

    long lWidth  = Max(lWVal, lHVal),
         lHeight = Min(lWVal, lHVal);

    // Min und Max
    aAddrLeftField.SetMin((long) 100 * (GetFldVal(aSendLeftField) + 566), FUNIT_TWIP);
    aAddrLeftField.SetMax((long) 100 * (lWidth  - 2 * 566), FUNIT_TWIP);
    aAddrTopField .SetMin((long) 100 * (GetFldVal(aSendTopField ) + 2 * 566), FUNIT_TWIP);
    aAddrTopField .SetMax((long) 100 * (lHeight - 2 * 566), FUNIT_TWIP);
    aSendLeftField.SetMin((long) 100 * (566), FUNIT_TWIP);
    aSendLeftField.SetMax((long) 100 * (GetFldVal(aAddrLeftField) - 566), FUNIT_TWIP);
    aSendTopField .SetMin((long) 100 * (566), FUNIT_TWIP);
    aSendTopField .SetMax((long) 100 * (GetFldVal(aAddrTopField ) - 2 * 566), FUNIT_TWIP);

    // First und Last
    aAddrLeftField.SetFirst(aAddrLeftField.GetMin());
    aAddrLeftField.SetLast (aAddrLeftField.GetMax());
    aAddrTopField .SetFirst(aAddrTopField .GetMin());
    aAddrTopField .SetLast (aAddrTopField .GetMax());
    aSendLeftField.SetFirst(aSendLeftField.GetMin());
    aSendLeftField.SetLast (aSendLeftField.GetMax());
    aSendTopField .SetFirst(aSendTopField .GetMin());
    aSendTopField .SetLast (aSendTopField .GetMax());

    // Fields neu formatieren
    aAddrLeftField.Reformat();
    aAddrTopField .Reformat();
    aSendLeftField.Reformat();
    aSendTopField .Reformat();
    aWidthField   .Reformat();
    aHeightField  .Reformat();
}

// --------------------------------------------------------------------------


SfxTabPage* __EXPORT SwEnvFmtPage::Create(Window* pParent, const SfxItemSet& rSet)
{
    return new SwEnvFmtPage(pParent, rSet);
}

// ----------------------------------------------------------------------------


void __EXPORT SwEnvFmtPage::ActivatePage(const SfxItemSet& rSet)
{
    SfxItemSet aSet(rSet);
    aSet.Put(GetParent()->aEnvItem);
    Reset(aSet);
}

// ----------------------------------------------------------------------------


int __EXPORT SwEnvFmtPage::DeactivatePage(SfxItemSet* pSet)
{
    FillItemSet(*pSet);
    return SfxTabPage::LEAVE_PAGE;
}

// --------------------------------------------------------------------------


void SwEnvFmtPage::FillItem(SwEnvItem& rItem)
{
    rItem.lAddrFromLeft = GetFldVal(aAddrLeftField);
    rItem.lAddrFromTop  = GetFldVal(aAddrTopField );
    rItem.lSendFromLeft = GetFldVal(aSendLeftField);
    rItem.lSendFromTop  = GetFldVal(aSendTopField );

    USHORT nPaper = aIDs[aFormatBox.GetSelectEntryPos()];
    if (nPaper == (USHORT)SVX_PAPER_USER)
    {
        long lWVal = GetFldVal(aWidthField );
        long lHVal = GetFldVal(aHeightField);
        rItem.lWidth  = Max(lWVal, lHVal);
        rItem.lHeight = Min(lWVal, lHVal);
    }
    else
    {
        long lWVal = SvxPaperInfo::GetPaperSize((SvxPaper)nPaper).Width ();
        long lHVal = SvxPaperInfo::GetPaperSize((SvxPaper)nPaper).Height();
        rItem.lWidth  = Max(lWVal, lHVal);
        rItem.lHeight = Min(lWVal, lHVal);
    }
}

// --------------------------------------------------------------------------


BOOL __EXPORT SwEnvFmtPage::FillItemSet(SfxItemSet& rSet)
{
    FillItem(GetParent()->aEnvItem);
    rSet.Put(GetParent()->aEnvItem);
    return TRUE;
}

// --------------------------------------------------------------------------


void __EXPORT SwEnvFmtPage::Reset(const SfxItemSet& rSet)
{
    const SwEnvItem& rItem = (const SwEnvItem&) rSet.Get(FN_ENVELOP);

    SvxPaper ePaper = SvxPaperInfo::GetPaper(
        Size( Min(rItem.lWidth, rItem.lHeight),
        Max(rItem.lWidth, rItem.lHeight)), MAP_TWIP, TRUE);
    for (USHORT i = 0; i < (USHORT) aIDs.Count(); i++)
        if (aIDs[i] == (USHORT)ePaper)
            aFormatBox.SelectEntryPos(i);

    // Die MetricFields
    SetFldVal(aAddrLeftField, rItem.lAddrFromLeft);
    SetFldVal(aAddrTopField , rItem.lAddrFromTop );
    SetFldVal(aSendLeftField, rItem.lSendFromLeft);
    SetFldVal(aSendTopField , rItem.lSendFromTop );
    SetFldVal(aWidthField   , Max(rItem.lWidth, rItem.lHeight));
    SetFldVal(aHeightField  , Min(rItem.lWidth, rItem.lHeight));
    SetMinMax();

    DELETEZ(GetParent()->pSenderSet);
    DELETEZ(GetParent()->pAddresseeSet);
}


/*--------------------------------------------------------------------
$Log: not supported by cvs2svn $
Revision 1.78  2000/09/18 16:05:24  willem.vandorp
OpenOffice header added.

Revision 1.77  2000/04/26 14:44:49  os
GetName() returns const String&

Revision 1.76  2000/04/17 05:36:01  os
#75131# paper formats unlimited

Revision 1.75  2000/02/11 14:45:16  hr
#70473# changes for unicode ( patched by automated patchtool )

Revision 1.74  1998/09/08 14:52:42  OS
#56134# Metric fuer Text und HTML getrennt


      Rev 1.73   08 Sep 1998 16:52:42   OS
   #56134# Metric fuer Text und HTML getrennt

      Rev 1.72   29 May 1998 12:01:42   TJ
   include

      Rev 1.71   09 Apr 1998 14:23:48   OM
   #47097# Undo von Vorlagenaenderungen ermoeglichen

      Rev 1.70   05 Feb 1998 16:47:06   OM
   #47086# Fuer HPUX mit USHORT statt mit SvxPaper arbeiten

      Rev 1.69   05 Feb 1998 15:33:26   OM
   HPUX-Umstellung SvxPaper

      Rev 1.68   05 Feb 1998 14:49:04   OS
   Absatzdialog: Numerierung nicht fuer Umschlaege

      Rev 1.67   24 Nov 1997 11:52:12   MA
   includes

      Rev 1.66   12 Sep 1997 10:42:14   OS
   ITEMID_* definiert

      Rev 1.65   02 Sep 1997 13:23:50   OS
   includes

      Rev 1.64   09 Aug 1997 13:13:14   OS
   paraitem/frmitems/textitem aufgeteilt

      Rev 1.63   08 Aug 1997 17:29:38   OM
   Headerfile-Umstellung

      Rev 1.62   07 Aug 1997 15:00:12   OM
   Headerfile-Umstellung

      Rev 1.61   20 Feb 1997 17:51:38   MA
   fix: Deactivate ueber Fill

      Rev 1.60   11 Nov 1996 09:44:18   MA
   ResMgr

      Rev 1.59   01 Oct 1996 13:31:20   AMA
   Fix: RES_CHRATR_BACKGROUND nur bei Aenderung setzen.

      Rev 1.58   17 Sep 1996 16:55:22   AMA
   Chg: Zeichenhintergrund als Zeichenattribut

      Rev 1.57   26 Jul 1996 20:36:38   MA
   includes

      Rev 1.56   06 Feb 1996 15:18:56   JP
   Link Umstellung 305

      Rev 1.55   05 Feb 1996 17:29:02   OM
   Parent-Win an Par/Chardlg uebergeben

      Rev 1.54   28 Nov 1995 21:14:56   JP
   UiSystem-Klasse aufgehoben, in initui/swtype aufgeteilt

      Rev 1.53   27 Nov 1995 19:35:46   OM
   HasExchangeSupport->303a

      Rev 1.52   24 Nov 1995 16:59:44   OM
   PCH->PRECOMPILED

      Rev 1.51   23 Nov 1995 18:01:28   OM
   TabDlg entfernt

      Rev 1.50   22 Nov 1995 18:57:36   MA
   opt/fix: blc-Warnings

      Rev 1.49   13 Nov 1995 13:44:26   MA
   chg: Link-Cast entfernt

      Rev 1.48   08 Nov 1995 13:48:24   OM
   Change->Set

      Rev 1.47   31 Oct 1995 18:38:20   OM
   GetActive... entfernt

      Rev 1.46   24 Aug 1995 09:25:30   MA
   fix: Ranges verfeinert

      Rev 1.45   22 Aug 1995 09:31:38   MA
   svxitems-header entfernt

      Rev 1.44   16 Aug 1995 17:47:58   MA
   Riesenheader dialogs entfernt.

      Rev 1.43   14 Aug 1995 08:39:28   MA
   fix: Absatz-Dlg, einige Items entfernt.

      Rev 1.42   12 Aug 1995 16:29:18   MA
   fix: fehlende Impl notduerftig nachgeholt

      Rev 1.41   02 Aug 1995 17:39:26   OM
   Datenbankumstellung

      Rev 1.40   30 May 1995 17:01:36   ER
   Umstellung SwPaper...  SvxPaper...

      Rev 1.39   24 May 1995 18:16:48   ER
   Segmentierung

      Rev 1.38   05 Apr 1995 09:26:48   JP
   Benutzung vom Link-Makro eingeschraenkt

      Rev 1.37   30 Mar 1995 18:38:44   PK
   geht immer weiter

      Rev 1.36   24 Mar 1995 20:30:04   PK
   geht immer weiter

      Rev 1.35   23 Mar 1995 18:33:18   PK
   geht immer weiter ...

      Rev 1.34   17 Mar 1995 17:10:02   PK
   geht immer weiter

      Rev 1.33   15 Mar 1995 18:37:42   PK
   geht immer weiter

      Rev 1.32   06 Mar 1995 00:08:14   PK
   linkbarer envelp-zustand

      Rev 1.31   04 Mar 1995 22:54:52   PK
   geht immer weiter

      Rev 1.30   01 Mar 1995 11:12:20   MA
   weg: Sw-BoxItem, neu: KeepItem.

      Rev 1.29   21 Feb 1995 15:39:04   PK
   erstmal eingecheckt

      Rev 1.28   20 Feb 1995 19:39:18   PK
   erstma eingecheckt

--------------------------------------------------------------*/

diff --git a/sw/source/ui/envelp/envfmt.hrc b/sw/source/ui/envelp/envfmt.hrc
new file mode 100644
index 0000000..7053bee
--- /dev/null
+++ b/sw/source/ui/envelp/envfmt.hrc
@@ -0,0 +1,111 @@
/*************************************************************************
 *
 *  $RCSfile: envfmt.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:35 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _ENVFMT_HRC
#define _ENVFMT_HRC

// #include *****************************************************************

#include "envelp.hrc"

// Lokale Resourcen *********************************************************

#define TXT_ADDRESSEE   1
#define TXT_ADDR_LEFT   2
#define FLD_ADDR_LEFT   3
#define TXT_ADDR_TOP    4
#define FLD_ADDR_TOP    5
#define BTN_ADDR_EDIT   6
#define TXT_SENDER      7
#define TXT_SEND_LEFT   8
#define FLD_SEND_LEFT   9
#define TXT_SEND_TOP   10
#define FLD_SEND_TOP   11
#define BTN_SEND_EDIT  12
#define WIN_PREVIEW    13
#define GRP_POSITIONS  14
#define TXT_FORMAT     15
#define BOX_FORMAT     16
#define TXT_WIDTH      17
#define FLD_WIDTH      18
#define TXT_HEIGHT     19
#define FLD_HEIGHT     20
#define GRP_SIZE       21
#define BTN_OK         22
#define BTN_CANCEL     23

#define MID_CHAR        1
#define MID_PARA        2

// Globale Resourcen ********************************************************

#define MNU_EDIT  (RC_ENVFMT_BEGIN     )

// Ueberlaufpruefung ********************************************************

#define ENVFMT_ACT_END  MNU_EDIT

#if ENVFMT_ACT_END > RC_ENVFMT_END
#error Resource-Ueberlauf in #file, #line
#endif

#endif

diff --git a/sw/source/ui/envelp/envfmt.hxx b/sw/source/ui/envelp/envfmt.hxx
new file mode 100644
index 0000000..933a314
--- /dev/null
+++ b/sw/source/ui/envelp/envfmt.hxx
@@ -0,0 +1,140 @@
/*************************************************************************
 *
 *  $RCSfile: envfmt.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:35 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _ENVFMT_HXX
#define _ENVFMT_HXX


#ifndef _SVSTDARR_HXX
#define _SVSTDARR_USHORTS
#include <svtools/svstdarr.hxx>
#endif
#ifndef _STDCTRL_HXX //autogen
#include <svtools/stdctrl.hxx>
#endif
#ifndef _FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif
#ifndef _MENUBTN_HXX //autogen
#include <vcl/menubtn.hxx>
#endif
#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif

#include "envlop.hxx"

// class SwEnvFmtPage ---------------------------------------------------------

class SwEnvFmtPage : public SfxTabPage
{
    FixedInfo    aAddrInfo;
    FixedText    aAddrLeftText;
    MetricField  aAddrLeftField;
    FixedText    aAddrTopText;
    MetricField  aAddrTopField;
    MenuButton   aAddrEditButton;
    FixedInfo    aSendInfo;
    FixedText    aSendLeftText;
    MetricField  aSendLeftField;
    FixedText    aSendTopText;
    MetricField  aSendTopField;
    MenuButton   aSendEditButton;
    SwEnvPreview aPreview;
    GroupBox     aPositionsGroup;
    FixedText    aFormatText;
    ListBox      aFormatBox;
    FixedText    aWidthText;
    MetricField  aWidthField;
    FixedText    aHeightText;
    MetricField  aHeightField;
    GroupBox     aSizeGroup;

    SvUShorts  aIDs;
    Timer      aPreviewTimer;
    Edit*      pLastEdit;

     SwEnvFmtPage(Window* pParent, const SfxItemSet& rSet);
    ~SwEnvFmtPage();

    DECL_LINK( ModifyHdl, Edit * );
    DECL_LINK( EditHdl, MenuButton * );
    DECL_LINK( FormatHdl, ListBox * );
    DECL_LINK( PreviewHdl, Timer * );

    void SetMinMax();

    SfxItemSet  *GetCollItemSet(SwTxtFmtColl* pColl, BOOL bSender);
    SwEnvDlg    *GetParent() {return (SwEnvDlg*) SfxTabPage::GetParent()->GetParent();}

public:

    static SfxTabPage* Create(Window* pParent, const SfxItemSet& rSet);

    virtual void ActivatePage(const SfxItemSet& rSet);
    virtual int  DeactivatePage(SfxItemSet* pSet = 0);
            void FillItem(SwEnvItem& rItem);
    virtual BOOL FillItemSet(SfxItemSet& rSet);
    virtual void Reset(const SfxItemSet& rSet);
};

#endif


diff --git a/sw/source/ui/envelp/envfmt.src b/sw/source/ui/envelp/envfmt.src
new file mode 100644
index 0000000..fae839a
--- /dev/null
+++ b/sw/source/ui/envelp/envfmt.src
@@ -0,0 +1,632 @@
/*************************************************************************
 *
 *  $RCSfile: envfmt.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:35 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
 // #pragma ******************************************************************

 // #include *****************************************************************
#include "envfmt.hrc"
#include "helpid.h"
 // TP_ENV_FMT ---------------------------------------------------------------
TabPage TP_ENV_FMT
{
    HelpID = HID_ENV_FMT ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Hide = TRUE ;
    FixedText TXT_ADDRESSEE
    {
        Pos = MAP_APPFONT ( 12 , 16 ) ;
        Size = MAP_APPFONT ( 40 , 8 ) ;
        Text = "Empfänger" ;
        Text [ ENGLISH ] = "Addressee" ;
        Text [ norwegian ] = "Addressee" ;
        Text [ italian ] = "Destinatario" ;
        Text [ portuguese_brazilian ] = "Endereço" ;
        Text [ portuguese ] = "Destinatário" ;
        Text [ finnish ] = "Vastaanottaja" ;
        Text [ danish ] = "Modtager" ;
        Text [ french ] = "Destinataire" ;
        Text [ swedish ] = "Mottagare" ;
        Text [ dutch ] = "Ontvanger" ;
        Text [ spanish ] = "Destinatario" ;
        Text [ english_us ] = "Addressee" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "ÊÕ¼þÈË";
        Text[ russian ] = "Ïîëó÷àòåëü";
        Text[ polish ] = "Odbiorca";
        Text[ japanese ] = "ŽóŽæl";
        Text[ chinese_traditional ] = "¦¬¥óªÌ";
        Text[ arabic ] = "ÇáãÓÊáã";
        Text[ greek ] = "ÐáñáëÞðôçò";
        Text[ korean ] = "¹Þ´Â»ç¶÷";
        Text[ turkish ] = "Alýcý";
        Text[ language_user1 ] = " ";
    };
    FixedText TXT_ADDR_LEFT
    {
        Pos = MAP_APPFONT ( 55 , 16 ) ;
        Size = MAP_APPFONT ( 40 , 8 ) ;
        Text = "v~on links" ;
        Text [ ENGLISH ] = "from left" ;
        Text [ norwegian ] = "from left" ;
        Text [ italian ] = "Da sinistra" ;
        Text [ portuguese_brazilian ] = "da esquerda" ;
        Text [ portuguese ] = "a partir da esquerda" ;
        Text [ finnish ] = "vasemmalta" ;
        Text [ danish ] = "fra venstre" ;
        Text [ french ] = "à ~gauche" ;
        Text [ swedish ] = "från vänster" ;
        Text [ dutch ] = "~vanaf links" ;
        Text [ spanish ] = "de izquierda" ;
        Text [ english_us ] = "from left" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "´Ó×ó";
        Text[ russian ] = "ñëåâà";
        Text[ polish ] = "z lewej strony";
        Text[ japanese ] = "¶‚©‚ç";
        Text[ chinese_traditional ] = "±q¥ª";
        Text[ arabic ] = "ãä ÇáíÓÇÑ";
        Text[ greek ] = "áðü áñéóôåñÜ";
        Text[ korean ] = "Á¿¡¼­";
        Text[ turkish ] = "Soldan";
        Text[ language_user1 ] = " ";
    };
    MetricField FLD_ADDR_LEFT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 98 , 14 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Spin = TRUE ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        Minimum = 0 ;
        Maximum = 10000 ;
        First = 0 ;
        Last = 10000 ;
        SpinSize = 10 ;
        Repeat = TRUE ;
    };
    FixedText TXT_ADDR_TOP
    {
        Pos = MAP_APPFONT ( 55 , 31 ) ;
        Size = MAP_APPFONT ( 40 , 8 ) ;
        Text = "~von oben" ;
        Text [ ENGLISH ] = "from top" ;
        Text [ norwegian ] = "from top" ;
        Text [ italian ] = "Dall'alto" ;
        Text [ portuguese_brazilian ] = "do topo" ;
        Text [ portuguese ] = "a partir do topo" ;
        Text [ finnish ] = "ylhäältä" ;
        Text [ danish ] = "fra oven" ;
        Text [ french ] = "en ~haut" ;
        Text [ swedish ] = "uppifrån" ;
        Text [ dutch ] = "v~anaf boven" ;
        Text [ spanish ] = "desde arriba" ;
        Text [ english_us ] = "from top" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "´ÓÉÏ";
        Text[ russian ] = "ñâåðõó";
        Text[ polish ] = "z góry";
        Text[ japanese ] = "ã‚©‚ç";
        Text[ chinese_traditional ] = "±q¤W";
        Text[ arabic ] = "ãä ÃÚáì";
        Text[ greek ] = "áðü ðÜíù";
        Text[ korean ] = "À§¿¡¼­";
        Text[ turkish ] = "Yukardan";
        Text[ language_user1 ] = " ";
    };
    MetricField FLD_ADDR_TOP
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 98 , 29 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Spin = TRUE ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        Minimum = 0 ;
        Maximum = 10000 ;
        First = 0 ;
        Last = 10000 ;
        SpinSize = 10 ;
        Repeat = TRUE ;
    };
    MenuButton BTN_ADDR_EDIT
    {
        Pos = MAP_APPFONT ( 12 , 29 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        Text = "Bearb." ;
        Text [ ENGLISH ] = "Edit" ;
        Text [ norwegian ] = "Rediger" ;
        Text [ italian ] = "Modifica" ;
        Text [ portuguese_brazilian ] = "Editar" ;
        Text [ portuguese ] = "Editar" ;
        Text [ finnish ] = "Muokkaa" ;
        Text [ danish ] = "Rediger" ;
        Text [ french ] = "Modifier" ;
        Text [ swedish ] = "Redigera" ;
        Text [ dutch ] = "Bewerk." ;
        Text [ spanish ] = "Editar" ;
        Text [ english_us ] = "Edit" ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "±à¼­";
        Text[ russian ] = "Ïðàâêà";
        Text[ polish ] = "E~dytuj";
        Text[ japanese ] = "•ҏW";
        Text[ chinese_traditional ] = "½s¿è";
        Text[ arabic ] = "ÊÍÑíÑ";
        Text[ language_user1 ] = " ";
        Text[ greek ] = "Åðåîåñã.";
        Text[ korean ] = "ÆíÁý";
        Text[ turkish ] = "Düzenle";
    };
    FixedText TXT_SENDER
    {
        Pos = MAP_APPFONT ( 12 , 46 ) ;
        Size = MAP_APPFONT ( 40 , 8 ) ;
        Text = "Absender" ;
        Text [ ENGLISH ] = "Sender" ;
        Text [ norwegian ] = "Sender" ;
        Text [ italian ] = "Mittente" ;
        Text [ portuguese_brazilian ] = "Remetente" ;
        Text [ portuguese ] = "Remetente" ;
        Text [ finnish ] = "Lähettäjä" ;
        Text [ danish ] = "Afsender" ;
        Text [ french ] = "Expéditeur" ;
        Text [ swedish ] = "Avsändare" ;
        Text [ dutch ] = "Afzender" ;
        Text [ spanish ] = "Remitente" ;
        Text [ english_us ] = "Sender" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "·¢¼þÈË";
        Text[ russian ] = "Îòïðàâèòåëü";
        Text[ polish ] = "Nadawca";
        Text[ japanese ] = "·ol";
        Text[ chinese_traditional ] = "±H¥óªÌ";
        Text[ arabic ] = "ÇáãÑÓá";
        Text[ greek ] = "ÁðïóôïëÝáò";
        Text[ korean ] = "º¸³½ »ç¶÷";
        Text[ turkish ] = "Gönderen";
        Text[ language_user1 ] = " ";
    };
    FixedText TXT_SEND_LEFT
    {
        Pos = MAP_APPFONT ( 55 , 46 ) ;
        Size = MAP_APPFONT ( 40 , 8 ) ;
        Text = "von ~links" ;
        Text [ ENGLISH ] = "from left" ;
        Text [ norwegian ] = "from left" ;
        Text [ italian ] = "Da sinistra" ;
        Text [ portuguese_brazilian ] = "da esquerda" ;
        Text [ portuguese ] = "a partir da esquerda" ;
        Text [ finnish ] = "vasemmalta" ;
        Text [ danish ] = "fra venstre" ;
        Text [ french ] = "à g~auche" ;
        Text [ swedish ] = "från vänster" ;
        Text [ dutch ] = "vanaf ~links" ;
        Text [ spanish ] = "de izquierda" ;
        Text [ english_us ] = "from left" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "´Ó×ó";
        Text[ russian ] = "ñëåâà";
        Text[ polish ] = "z lewej strony";
        Text[ japanese ] = "¶‚©‚ç";
        Text[ chinese_traditional ] = "±q¥ª";
        Text[ arabic ] = "ãä ÇáíÓÇÑ";
        Text[ greek ] = "áðü áñéóôåñÜ";
        Text[ korean ] = "Á¿¡¼­";
        Text[ turkish ] = "Soldan";
        Text[ language_user1 ] = " ";
    };
    MetricField FLD_SEND_LEFT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 98 , 44 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Spin = TRUE ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        Minimum = 0 ;
        Maximum = 10000 ;
        First = 0 ;
        Last = 10000 ;
        SpinSize = 10 ;
        Repeat = TRUE ;
    };
    FixedText TXT_SEND_TOP
    {
        Pos = MAP_APPFONT ( 55 , 61 ) ;
        Size = MAP_APPFONT ( 40 , 8 ) ;
        Text = "vo~n oben" ;
        Text [ ENGLISH ] = "from top" ;
        Text [ norwegian ] = "from top" ;
        Text [ italian ] = "Dall'alto" ;
        Text [ portuguese_brazilian ] = "do topo" ;
        Text [ portuguese ] = "a partir do topo" ;
        Text [ finnish ] = "ylhäältä" ;
        Text [ danish ] = "fra oven" ;
        Text [ french ] = "en ha~ut" ;
        Text [ swedish ] = "uppifrån" ;
        Text [ dutch ] = "vanaf ~boven" ;
        Text [ spanish ] = "desde arriba" ;
        Text [ english_us ] = "from top" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "´ÓÉÏ";
        Text[ russian ] = "ñâåðõó";
        Text[ polish ] = "z góry";
        Text[ japanese ] = "ã‚©‚ç";
        Text[ chinese_traditional ] = "±q¤W";
        Text[ arabic ] = "ãä ÃÚáì";
        Text[ greek ] = "áðü ðÜ~íù";
        Text[ korean ] = "À§¿¡¼­";
        Text[ turkish ] = "Yukardan";
        Text[ language_user1 ] = " ";
    };
    MetricField FLD_SEND_TOP
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 98 , 59 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Spin = TRUE ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        Minimum = 0 ;
        Maximum = 10000 ;
        First = 0 ;
        Last = 10000 ;
        SpinSize = 10 ;
        Repeat = TRUE ;
    };
    MenuButton BTN_SEND_EDIT
    {
        Pos = MAP_APPFONT ( 12 , 59 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        Text = "Bearb." ;
        Text [ ENGLISH ] = "Edit" ;
        Text [ norwegian ] = "Rediger" ;
        Text [ italian ] = "Modifica" ;
        Text [ portuguese_brazilian ] = "Editar" ;
        Text [ portuguese ] = "Editar" ;
        Text [ finnish ] = "Muokkaa" ;
        Text [ danish ] = "Rediger" ;
        Text [ french ] = "Modifier" ;
        Text [ swedish ] = "Redigera" ;
        Text [ dutch ] = "Bewerk." ;
        Text [ spanish ] = "Editar" ;
        Text [ english_us ] = "Edit" ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "±à¼­";
        Text[ russian ] = "Ïðàâêà";
        Text[ polish ] = "Edyt~uj";
        Text[ japanese ] = "•ҏW";
        Text[ chinese_traditional ] = "½s¿è";
        Text[ arabic ] = "ÊÍÑíÑ";
        Text[ language_user1 ] = " ";
        Text[ greek ] = "Åðåîåñã.";
        Text[ korean ] = "ÆíÁý";
        Text[ turkish ] = "Düzenle";
    };
    Window WIN_PREVIEW
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 144 , 14 ) ;
        Size = MAP_APPFONT ( 78 , 57 ) ;
    };
    GroupBox GRP_POSITIONS
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 222 , 74 ) ;
        Text = "Positionen" ;
        Text [ ENGLISH ] = "Positions" ;
        Text [ norwegian ] = "Positions" ;
        Text [ italian ] = "Posizioni" ;
        Text [ portuguese_brazilian ] = "Posições" ;
        Text [ portuguese ] = "Posições" ;
        Text [ finnish ] = "Paikat" ;
        Text [ danish ] = "Placering" ;
        Text [ french ] = "Positions" ;
        Text [ swedish ] = "Positioner" ;
        Text [ dutch ] = "Posities" ;
        Text [ spanish ] = "Posiciones" ;
        Text [ english_us ] = "Positions" ;
        Text[ chinese_simplified ] = "λÖÃ";
        Text[ russian ] = "Ïîçèöèè";
        Text[ polish ] = "Pozycje";
        Text[ japanese ] = "ˆÊ’u";
        Text[ chinese_traditional ] = "¦ì¸m";
        Text[ arabic ] = "ÇáãæÇÖÚ";
        Text[ greek ] = "ÈÝóåéò";
        Text[ korean ] = "À§Ä¡";
        Text[ turkish ] = "Konumlar";
        Text[ language_user1 ] = " ";
    };
    FixedText TXT_FORMAT
    {
        Pos = MAP_APPFONT ( 12 , 92 ) ;
        Size = MAP_APPFONT ( 32 , 8 ) ;
        Text = "~Format" ;
        Text [ ENGLISH ] = "Format" ;
        Text [ norwegian ] = "Format" ;
        Text [ italian ] = "Formato" ;
        Text [ portuguese_brazilian ] = "Formato" ;
        Text [ portuguese ] = "Fo~rmato" ;
        Text [ finnish ] = "Muotoile" ;
        Text [ danish ] = "~Format" ;
        Text [ french ] = "Forma~t" ;
        Text [ swedish ] = "F~ormat" ;
        Text [ dutch ] = "~Formaat" ;
        Text [ spanish ] = "~Formato" ;
        Text [ english_us ] = "F~ormat" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "¸ñʽ(~O)";
        Text[ russian ] = "Ôîð~ìàò";
        Text[ polish ] = "Format";
        Text[ japanese ] = "‘Ž®(~O)";
        Text[ chinese_traditional ] = "®æ¦¡(~O)";
        Text[ arabic ] = "ÇáÍÌã";
        Text[ language_user1 ] = " ";
        Text[ greek ] = "ÅðéëïãÝò";
        Text[ korean ] = "¼­½Ä(~O)";
        Text[ turkish ] = "Format";
    };
    ListBox BOX_FORMAT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 47 , 90 ) ;
        Size = MAP_APPFONT ( 102 , 61 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
    };
    FixedText TXT_WIDTH
    {
        Pos = MAP_APPFONT ( 155 , 92 ) ;
        Size = MAP_APPFONT ( 24 , 8 ) ;
        Text = "~Breite" ;
        Text [ ENGLISH ] = "Width" ;
        Text [ norwegian ] = "Bredde " ;
        Text [ italian ] = "~Largh." ;
        Text [ portuguese_brazilian ] = "Largura" ;
        Text [ portuguese ] = "~Largura" ;
        Text [ finnish ] = "Leveys" ;
        Text [ danish ] = "Bredde" ;
        Text [ french ] = "~Largeur" ;
        Text [ swedish ] = "~Bredd" ;
        Text [ dutch ] = "B~reedte" ;
        Text [ spanish ] = "A~ncho" ;
        Text [ english_us ] = "~Width" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "¿í(~W)";
        Text[ russian ] = "Øèðèíà";
        Text[ polish ] = "Szer.";
        Text[ japanese ] = "•(~W)";
        Text[ chinese_traditional ] = "¼e(~W)";
        Text[ arabic ] = "ÇáÚÑÖ";
        Text[ greek ] = "ÐëÜôïò";
        Text[ korean ] = "³Êºñ(~W)";
        Text[ turkish ] = "Geniþlik";
        Text[ language_user1 ] = " ";
    };
    MetricField FLD_WIDTH
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 182 , 90 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Spin = TRUE ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        Minimum = 500 ;
        Maximum = 10000 ;
        First = 500 ;
        Last = 10000 ;
        SpinSize = 10 ;
        Repeat = TRUE ;
    };
    FixedText TXT_HEIGHT
    {
        Pos = MAP_APPFONT ( 155 , 107 ) ;
        Size = MAP_APPFONT ( 24 , 8 ) ;
        Text = "~Höhe" ;
        Text [ ENGLISH ] = "Height" ;
        Text [ norwegian ] = "Høyde " ;
        Text [ italian ] = "~Altezza" ;
        Text [ portuguese_brazilian ] = "Altura" ;
        Text [ portuguese ] = "~Altura" ;
        Text [ finnish ] = "Korkeus" ;
        Text [ danish ] = "Højde" ;
        Text [ french ] = "~Hauteur" ;
        Text [ swedish ] = "~Höjd" ;
        Text [ dutch ] = "~Hoogte" ;
        Text [ spanish ] = "A~ltura" ;
        Text [ english_us ] = "~Height" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "¸ß(~H)";
        Text[ russian ] = "Âûñîòà";
        Text[ polish ] = "Wys.";
        Text[ japanese ] = "‚‚³(~H)";
        Text[ chinese_traditional ] = "°ª(~H)";
        Text[ arabic ] = "ÇáÇÑÊÝÇÚ";
        Text[ greek ] = "¾øïò";
        Text[ korean ] = "³ôÀÌ(~H)";
        Text[ turkish ] = "Yükseklik";
        Text[ language_user1 ] = " ";
    };
    MetricField FLD_HEIGHT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 182 , 105 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Spin = TRUE ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        Minimum = 500 ;
        Maximum = 10000 ;
        First = 500 ;
        Last = 10000 ;
        SpinSize = 10 ;
        Repeat = TRUE ;
    };
    GroupBox GRP_SIZE
    {
        Pos = MAP_APPFONT ( 6 , 79 ) ;
        Size = MAP_APPFONT ( 222 , 44 ) ;
        Text = "Größe" ;
        Text [ ENGLISH ] = "Size" ;
        Text [ norwegian ] = "Størrelse" ;
        Text [ italian ] = "Dimensione" ;
        Text [ portuguese_brazilian ] = "Tamanho" ;
        Text [ portuguese ] = "Tamanho" ;
        Text [ finnish ] = "Koko" ;
        Text [ danish ] = "Størrelse" ;
        Text [ french ] = "Taille" ;
        Text [ swedish ] = "Storlek" ;
        Text [ dutch ] = "Grootte" ;
        Text [ spanish ] = "Tamaño" ;
        Text [ english_us ] = "Size" ;
        Text[ chinese_simplified ] = "´óС";
        Text[ russian ] = "Ðàçìåð";
        Text[ polish ] = "Rozmiar";
        Text[ japanese ] = "»²½Þ";
        Text[ chinese_traditional ] = "¤j¤p";
        Text[ arabic ] = "ÇáÍÌã";
        Text[ greek ] = "ÌÝãåèïò";
        Text[ korean ] = "Å©±â";
        Text[ turkish ] = "Boyut";
        Text[ language_user1 ] = " ";
    };
};
 // Menu *********************************************************************
Menu MNU_EDIT
{
    ItemList =
    {
        MenuItem
        {
            IDENTIFIER = MID_CHAR ;
            TEXT = "~Zeichen..." ;
            TEXT [ English ] = "~Character..." ;
            TEXT [ norwegian ] = "~Character..." ;
            TEXT [ italian ] = "~Carattere..." ;
            TEXT [ portuguese_brazilian ] = "~Caracter..." ;
            TEXT [ portuguese ] = "~Caracteres..." ;
            TEXT [ finnish ] = "~Merkki..." ;
            TEXT [ danish ] = "Tegn..." ;
            TEXT [ french ] = "~Caractère..." ;
            TEXT [ swedish ] = "~Tecken..." ;
            TEXT [ dutch ] = "~Teken..." ;
            TEXT [ spanish ] = "~Caracteres..." ;
            TEXT [ english_us ] = "C~haracter..." ;
            /* ### ACHTUNG: Neuer Text in Resource? Setzt Zeichenattribute für den selektierten Text : Define character attributes for selected text */
            /* ### ACHTUNG: Neuer Text in Resource? Setzt Zeichenattribute für den selektierten Text : Define character attributes for selected text */
            /* ### ACHTUNG: Neuer Text in Resource? Setzt Zeichenattribute für den selektierten Text : Define character attributes for selected text */
            /* ### ACHTUNG: Neuer Text in Resource? Setzt Zeichenattribute für den selektierten Text : Define character attributes for selected text */
            TEXT[ chinese_simplified ] = "×Ö·û(~H)...";
            TEXT[ russian ] = "Çíàê...";
            TEXT[ polish ] = "Znak...";
            TEXT[ japanese ] = "•¶Žš(~H)...";
            TEXT[ language_user1 ] = " ";
            TEXT[ chinese_traditional ] = "¦r¤¸(~H)...";
            TEXT[ arabic ] = "ÎØ...";
            TEXT[ greek ] = "~×áñáêôÞñåò...";
            TEXT[ korean ] = "±âÈ£(~H)...";
            TEXT[ turkish ] = "Karakter...";
        };
        MenuItem
        {
            IDENTIFIER = MID_PARA ;
            TEXT = "~Absatz..." ;
            TEXT [ English ] = "~Paragraph..." ;
            TEXT [ norwegian ] = "~Paragraph..." ;
            TEXT [ italian ] = "~Paragrafo..." ;
            TEXT [ portuguese_brazilian ] = "~Parágrafo..." ;
            TEXT [ portuguese ] = "~Parágrafo..." ;
            TEXT [ finnish ] = "~Kappale..." ;
            TEXT [ danish ] = "Afsnit..." ;
            TEXT [ french ] = "~Paragraphe..." ;
            TEXT [ swedish ] = "~Stycke..." ;
            TEXT [ dutch ] = "~Alinea..." ;
            TEXT [ spanish ] = "Párrafo..." ;
            TEXT [ english_us ] = "P~aragraph..." ;
            /* ### ACHTUNG: Neuer Text in Resource? Setzt Absatzattribute : Define paragraph attributes */
            /* ### ACHTUNG: Neuer Text in Resource? Setzt Absatzattribute : Define paragraph attributes */
            /* ### ACHTUNG: Neuer Text in Resource? Setzt Absatzattribute : Define paragraph attributes */
            /* ### ACHTUNG: Neuer Text in Resource? Setzt Absatzattribute : Define paragraph attributes */
            TEXT[ chinese_simplified ] = "¶ÎÂä(~A)...";
            TEXT[ russian ] = "Àáçàö...";
            TEXT[ polish ] = "Akapit...";
            TEXT[ japanese ] = "’i—Ž(~A)...";
            TEXT[ chinese_traditional ] = "¬q¸¨(~A)...";
            TEXT[ arabic ] = "...ÝÞÑÉ";
            TEXT[ greek ] = "Ð~áñÜãñáöïò...";
            TEXT[ korean ] = "´Ü¶ô(~A)...";
            TEXT[ turkish ] = "Paragraf...";
            TEXT[ language_user1 ] = " ";
        };
    };
};
diff --git a/sw/source/ui/envelp/envimg.cxx b/sw/source/ui/envelp/envimg.cxx
new file mode 100644
index 0000000..195e20c
--- /dev/null
+++ b/sw/source/ui/envelp/envimg.cxx
@@ -0,0 +1,496 @@
/*************************************************************************
 *
 *  $RCSfile: envimg.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:35 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "hintids.hxx"

#ifndef _SVX_ADRITEM_HXX //autogen
#include <svx/adritem.hxx>
#endif
#ifndef _STREAM_HXX //autogen
#include <tools/stream.hxx>
#endif
#ifndef _TOOLS_RESID_HXX //autogen
#include <tools/resid.hxx>
#endif
#ifndef _SVX_PAPERINF_HXX //autogen
#include <svx/paperinf.hxx>
#endif



#include "errhdl.hxx"
#include "finder.hxx"
#include "swtypes.hxx"
#include "cmdid.h"
#include "cfgid.h"
#include "envimg.hxx"
#include "cfgstr.hrc"
#include "envelp.hrc"

#define ENV_VERSION  1

#ifdef WIN
#define NEXTLINE  UniString::CreateFromAscii("\r\n")
#else
#define NEXTLINE  '\n'
#endif
//#define C2S(cChar) UniString::CreateFromAscii(cChar)



String MakeSender()
{
    ASSERT( pPathFinder, "PathFinder not found" );
    SvxAddressItem aAdr( pPathFinder->GetAddress() );

    String sRet;
    String sSenderToken(SW_RES(STR_SENDER_TOKENS));
    USHORT nTokenCount = sSenderToken.GetTokenCount(';');
    BOOL bLastLength = TRUE;
    for(USHORT i = 0; i < nTokenCount; i++)
    {
        String sToken = sSenderToken.GetToken(i, ';');
        if(sToken.EqualsAscii("COMPANY"))
        {
            String sTmp = aAdr.GetToken( ADDRESS_COMPANY );
            sRet += sTmp;
            bLastLength = sTmp.Len() > 0;
        }
        else if(sToken.EqualsAscii("CR"))
        {
            if(bLastLength)
                sRet +=NEXTLINE;
            bLastLength = TRUE;
        }
        else if(sToken.EqualsAscii("FIRSTNAME"))
            sRet += aAdr.GetFirstName();
        else if(sToken.EqualsAscii("LASTNAME"))
            sRet += aAdr.GetName();
        else if(sToken.EqualsAscii("ADDRESS"))
            sRet += aAdr.GetToken( ADDRESS_STREET );
        else if(sToken.EqualsAscii("COUNTRY"))
            sRet += aAdr.GetToken( ADDRESS_COUNTRY );
        else if(sToken.EqualsAscii("POSTALCODE"))
            sRet += aAdr.GetToken( ADDRESS_PLZ );
        else if(sToken.EqualsAscii("CITY"))
            sRet += aAdr.GetToken( ADDRESS_CITY );
        else if(sToken.EqualsAscii("STATEPROV"))
            sRet += aAdr.GetToken( ADDRESS_STATE );
        else if(sToken.Len()) //spaces
            sRet += sToken;
    }
    return sRet;


    /*
    SvxAddressItem aAdr( pPathFinder->GetAddress() );
    String aSender, aTmp;
    aSender += aAdr.GetFirstName();
    aTmp = aAdr.GetName();
    if ( aTmp.Len() )  ls

    {
        if ( aSender.Len() )
            aSender += ' ';
        aSender += aTmp;
    }
    if ( aSender.Len() )
        aSender += NEXTLINE;
    aTmp = aAdr.GetToken( ADDRESS_STREET );
    if ( aTmp.Len() )
    {
        aSender += aTmp;
        aSender += NEXTLINE;
    }
    aTmp = aAdr.GetToken( ADDRESS_COUNTRY );
    if ( aTmp.Len() )
    {
        aSender += aTmp;
        aSender += '-';
    }
    aTmp = aAdr.GetToken( ADDRESS_PLZ );
    if ( aTmp.Len() )
    {
        aSender += aTmp;
        aSender += ' ';
    }
    aSender += aAdr.GetToken( ADDRESS_CITY );
    return aSender;
     */
}



SwEnvItem::SwEnvItem() :

    SfxPoolItem(FN_ENVELOP)

{
    aAddrText       = aEmptyStr;
    bSend           = TRUE;
    aSendText       = MakeSender();
    lSendFromLeft   = 566; // 1 cm
    lSendFromTop    = 566; // 1 cm
    lWidth          = lC65Width;
    lHeight         = lC65Height;
    eAlign          = ENV_HOR_LEFT;
    bPrintFromAbove = TRUE;
    lShiftRight     = 0;
    lShiftDown      = 0;

    lAddrFromLeft   = Max(lWidth, lHeight) / 2;
    lAddrFromTop    = Min(lWidth, lHeight) / 2;
}

// --------------------------------------------------------------------------



SwEnvItem::SwEnvItem(const SwEnvItem& rItem) :

    SfxPoolItem(FN_ENVELOP),

    aAddrText      (rItem.aAddrText),
    bSend          (rItem.bSend),
    aSendText      (rItem.aSendText),
    lSendFromLeft  (rItem.lSendFromLeft),
    lSendFromTop   (rItem.lSendFromTop),
    lAddrFromLeft  (rItem.lAddrFromLeft),
    lAddrFromTop   (rItem.lAddrFromTop),
    lWidth         (rItem.lWidth),
    lHeight        (rItem.lHeight),
    eAlign         (rItem.eAlign),
    bPrintFromAbove(rItem.bPrintFromAbove),
    lShiftRight    (rItem.lShiftRight),
    lShiftDown     (rItem.lShiftDown),
    aSlot          (rItem.aSlot)

{
}

// --------------------------------------------------------------------------



SwEnvItem& SwEnvItem::operator =(const SwEnvItem& rItem)
{
    aAddrText       = rItem.aAddrText;
    bSend           = rItem.bSend;
    aSendText       = rItem.aSendText;
    lSendFromLeft   = rItem.lSendFromLeft;
    lSendFromTop    = rItem.lSendFromTop;
    lAddrFromLeft   = rItem.lAddrFromLeft;
    lAddrFromTop    = rItem.lAddrFromTop;
    lWidth          = rItem.lWidth;
    lHeight         = rItem.lHeight;
    eAlign          = rItem.eAlign;
    bPrintFromAbove = rItem.bPrintFromAbove;
    lShiftRight     = rItem.lShiftRight;
    lShiftDown      = rItem.lShiftDown;
    aSlot           = rItem.aSlot;

    return *this;
}

// --------------------------------------------------------------------------



int SwEnvItem::operator ==(const SfxPoolItem& rItem) const
{
    const SwEnvItem& rEnv = (const SwEnvItem&) rItem;

    return aAddrText       == rEnv.aAddrText       &&
           bSend           == rEnv.bSend           &&
           aSendText       == rEnv.aSendText       &&
           lSendFromLeft   == rEnv.lSendFromLeft   &&
           lSendFromTop    == rEnv.lSendFromTop    &&
           lAddrFromLeft   == rEnv.lAddrFromLeft   &&
           lAddrFromTop    == rEnv.lAddrFromTop    &&
           lWidth          == rEnv.lWidth          &&
           lHeight         == rEnv.lHeight         &&
           eAlign          == rEnv.eAlign          &&
           bPrintFromAbove == rEnv.bPrintFromAbove &&
           lShiftRight     == rEnv.lShiftRight     &&
           lShiftDown      == rEnv.lShiftDown      &&
           aSlot           == rEnv.aSlot;
}

// --------------------------------------------------------------------------



SfxPoolItem* SwEnvItem::Clone(SfxItemPool*) const
{
    return new SwEnvItem(*this);
}


// --------------------------------------------------------------------------

SwEnvCfgItem::SwEnvCfgItem() :
    SfxConfigItem(CFG_ENV_ITEM)
{
}
// ----------------------------------------------------------------------------

int SwEnvCfgItem::Load(SvStream& rStrm)
{
    USHORT nVersion;
    rStrm >> nVersion;

    if (nVersion == ENV_VERSION)
    {
        unsigned char b;
        long          l;
        USHORT        i;
        rtl_TextEncoding eEncoding = gsl_getSystemTextEncoding();
        rStrm.ReadByteString(aEnvItem.aAddrText, eEncoding);
        rStrm >> b; aEnvItem.bSend           = (BOOL)       b;
        rStrm.ReadByteString(aEnvItem.aSendText, eEncoding);
        rStrm >> l; aEnvItem.lAddrFromLeft   =              l;
        rStrm >> l; aEnvItem.lAddrFromTop    =              l;
        rStrm >> l; aEnvItem.lSendFromLeft   =              l;
        rStrm >> l; aEnvItem.lSendFromTop    =              l;
        rStrm >> l; aEnvItem.lWidth          =              l;
        rStrm >> l; aEnvItem.lHeight         =              l;
        rStrm >> i; aEnvItem.eAlign          = (SwEnvAlign) i;
        rStrm >> b; aEnvItem.bPrintFromAbove = (BOOL)       b;
        rStrm >> l; aEnvItem.lShiftRight     =              l;
        rStrm >> l; aEnvItem.lShiftDown      =              l;
        rStrm.ReadByteString(aEnvItem.aSlot, eEncoding);

        SetDefault(FALSE);

        return SfxConfigItem::ERR_OK;
    }
    else
        return SfxConfigItem::WARNING_VERSION;
}

// --------------------------------------------------------------------------



BOOL SwEnvCfgItem::Store(SvStream& rStrm)
{
    rStrm << (USHORT)ENV_VERSION;

    rtl_TextEncoding eEncoding = gsl_getSystemTextEncoding();
    rStrm.WriteByteString(aEnvItem.aAddrText, eEncoding);
    rStrm << (unsigned char) aEnvItem.bSend;
    rStrm.WriteByteString(aEnvItem.aSendText, eEncoding);
    rStrm <<                 aEnvItem.lAddrFromLeft;
    rStrm <<                 aEnvItem.lAddrFromTop;
    rStrm <<                 aEnvItem.lSendFromLeft;
    rStrm <<                 aEnvItem.lSendFromTop;
    rStrm <<                 aEnvItem.lWidth;
    rStrm <<                 aEnvItem.lHeight;
    rStrm << (USHORT)        aEnvItem.eAlign;
    rStrm << (unsigned char) aEnvItem.bPrintFromAbove;
    rStrm <<                 aEnvItem.lShiftRight;
    rStrm <<                 aEnvItem.lShiftDown;
    rStrm.WriteByteString(aEnvItem.aSlot, eEncoding);

    return SfxConfigItem::ERR_OK;
}

// --------------------------------------------------------------------------



void SwEnvCfgItem::UseDefault()
{
    aEnvItem = SwEnvItem();
    SfxConfigItem::UseDefault();

}



String SwEnvCfgItem::GetName() const
{
    return SW_RESSTR(STR_CFG_ENVIMG);
}



/*
$Log: not supported by cvs2svn $
Revision 1.36  2000/09/18 16:05:25  willem.vandorp
OpenOffice header added.

Revision 1.35  2000/06/26 16:32:11  jp
have to change: enums of AddressToken

Revision 1.34  2000/05/26 07:21:29  os
old SW Basic API Slots removed

Revision 1.33  2000/04/19 13:58:58  os
#74742# STATEPROV added

Revision 1.32  2000/04/18 15:31:35  os
UNICODE

Revision 1.31  2000/04/11 13:37:29  os
#74742# Sender field of envelopes and labels language specific

Revision 1.30  1999/10/22 14:09:27  jp
have to change - SearchFile with SfxIniManager, dont use SwFinder for this

Revision 1.29  1997/11/24 10:52:12  MA
includes


      Rev 1.28   24 Nov 1997 11:52:12   MA
   includes

      Rev 1.27   03 Nov 1997 13:17:16   MA
   precomp entfernt

      Rev 1.26   08 Apr 1997 10:30:14   OM
   Fehlende Includes

      Rev 1.25   08 Apr 1997 10:06:30   NF
   includes...

      Rev 1.24   11 Nov 1996 09:44:18   MA
   ResMgr

      Rev 1.23   26 Jul 1996 20:36:40   MA
   includes

      Rev 1.22   28 Jun 1996 10:10:52   OS
   UseDefault: Basisklasse rufen

      Rev 1.21   19 Mar 1996 16:33:48   MA
   chg: Umstellungen, Finder und AdrItem

      Rev 1.20   15 Mar 1996 13:29:24   MA
   opt: Finder abgespeckt

      Rev 1.19   27 Nov 1995 18:55:34   OS
   Umstellung 303a

      Rev 1.18   24 Nov 1995 16:59:40   OM
   PCH->PRECOMPILED

      Rev 1.17   16 Nov 1995 18:37:44   OS
   neu: Get/SetVariable, nicht impl.

      Rev 1.16   15 Sep 1995 21:14:22   OS
   add: cfgstr.hrc

      Rev 1.15   15 Sep 1995 12:41:00   OS
   GetName() implementiert

      Rev 1.14   11 Sep 1995 18:06:08   HJS
   add: sbx.hxx

      Rev 1.13   09 Aug 1995 18:59:36   AMA
   kein GetPresentation

      Rev 1.12   07 Aug 1995 18:19:58   AMA
   Umbau: GetValueText -> GetPresentation

      Rev 1.11   08 Jun 1995 19:02:06   OM
   Absturz unter OS/2 gefixt

      Rev 1.10   30 May 1995 17:01:32   ER
   Umstellung SwPaper...  SvxPaper...

      Rev 1.9   24 May 1995 18:14:22   ER
   Segmentierung

      Rev 1.8   23 Mar 1995 18:33:20   PK
   geht immer weiter ...

      Rev 1.7   17 Mar 1995 17:10:04   PK
   geht immer weiter

      Rev 1.6   06 Mar 1995 00:08:20   PK
   linkbarer envelp-zustand

      Rev 1.5   04 Mar 1995 22:55:14   PK
   geht immer weiter

      Rev 1.4   20 Feb 1995 19:39:44   PK
   erstma eingecheckt

      Rev 1.3   18 Nov 1994 15:55:28   MA
   min -> Min, max -> Max

      Rev 1.2   25 Oct 1994 17:33:38   ER
   add: PCH

      Rev 1.1   15 Apr 1994 17:28:30   PK
   warnungen raus, strings optimiert

      Rev 1.0   22 Mar 1994 17:48:14   PK
   umschlaege vorerst fertig
*/

diff --git a/sw/source/ui/envelp/envlop.hrc b/sw/source/ui/envelp/envlop.hrc
new file mode 100644
index 0000000..66eb3e9
--- /dev/null
+++ b/sw/source/ui/envelp/envlop.hrc
@@ -0,0 +1,99 @@
/*************************************************************************
 *
 *  $RCSfile: envlop.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:35 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _ENVLOP_HRC
#define _ENVLOP_HRC

// #include *****************************************************************

#include "envelp.hrc"

// Lokale Resourcen *********************************************************

#define TXT_ADDR      1
#define EDT_ADDR      2
#define FT_DATABASE   3
#define LB_DATABASE   4
#define FT_TABLE      5
#define LB_TABLE      6
#define BTN_INSERT    7
#define FT_DBFIELD    8
#define LB_DBFIELD    9
#define BOX_SEND     10
#define EDT_SEND     11
#define WIN_PREVIEW  12
#define ST_INSERT   13
#define ST_CHANGE   14
// Globale Resourcen ********************************************************

#define STR_DOC_TITLE  (RC_ENVLOP_BEGIN)

// Ueberlaufpruefung ********************************************************

#define ENVLOP_ACT_END  STR_DOC_TITLE

#if ENVLOP_ACT_END > RC_ENVLOP_END
#error Resource-Ueberlauf in #file, #line
#endif

#endif


diff --git a/sw/source/ui/envelp/envlop.src b/sw/source/ui/envelp/envlop.src
new file mode 100644
index 0000000..a8c5f95
--- /dev/null
+++ b/sw/source/ui/envelp/envlop.src
@@ -0,0 +1,473 @@
/*************************************************************************
 *
 *  $RCSfile: envlop.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:35 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
 // #pragma ******************************************************************

 // #include *****************************************************************
#include "envlop.hrc"
#include "helpid.h"
 // DLG_ENV ------------------------------------------------------------------
TabDialog DLG_ENV
{
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Text = "Briefumschlag" ;
    Text [ ENGLISH ] = "Envelope" ;
    Text [ norwegian ] = "Envelope" ;
    Text [ italian ] = "Busta" ;
    Text [ portuguese_brazilian ] = "Envelope" ;
    Text [ portuguese ] = "Envelope" ;
    Text [ finnish ] = "Kirjekuori" ;
    Text [ danish ] = "Konvolut" ;
    Text [ french ] = "Enveloppe" ;
    Text [ swedish ] = "Kuvert" ;
    Text [ dutch ] = "Envelop" ;
    Text [ spanish ] = "Sobre" ;
    Text [ english_us ] = "Envelope" ;
    Moveable = TRUE ;
    TabControl 1
    {
        OutputSize = TRUE ;
        PageList =
        {
            PageItem
            {
                Identifier = TP_ENV_ENV ;
                Text = "Umschlag" ;
                Text [ ENGLISH ] = "Envelop" ;
                Text [ norwegian ] = "Konvolutt" ;
                Text [ italian ] = "Busta" ;
                Text [ portuguese_brazilian ] = "Envelope" ;
                Text [ portuguese ] = "Envelope" ;
                Text [ finnish ] = "Kirjekuori" ;
                Text [ danish ] = "Konvolut" ;
                Text [ french ] = "Enveloppe" ;
                Text [ swedish ] = "Kuvert" ;
                Text [ dutch ] = "Envelop" ;
                Text [ spanish ] = "Sobre" ;
                Text [ english_us ] = "Envelope" ;
                PageResID = TP_ENV_ENV ;
                Text[ chinese_simplified ] = "ÐÅ·â";
                Text[ russian ] = "Êîíâåðò";
                Text[ polish ] = "Koperta";
                Text[ japanese ] = "••“›";
                Text[ chinese_traditional ] = "«H«Ê";
                Text[ arabic ] = "ÙÑÝ";
                Text[ greek ] = "ÖÜêåëïò";
                Text[ korean ] = "ºÀÅõ";
                Text[ turkish ] = "Zarf";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_ENV_FMT ;
                Text = "Format" ;
                Text[English] = "Format" ;
                PageResID = TP_ENV_FMT ;
                Text[ english_us ] = "Format";
                Text[ portuguese ] = "Formato";
                Text[ russian ] = "Ôîðìàò";
                Text[ greek ] = "ÌïñöÞ";
                Text[ dutch ] = "Formaat";
                Text[ french ] = "Format";
                Text[ spanish ] = "Formato";
                Text[ italian ] = "Formato";
                Text[ danish ] = "Format";
                Text[ swedish ] = "Format";
                Text[ polish ] = "Format";
                Text[ portuguese_brazilian ] = "Format";
                Text[ japanese ] = "‘Ž®";
                Text[ korean ] = "Format";
                Text[ chinese_simplified ] = "¸ñʽ";
                Text[ chinese_traditional ] = "®æ¦¡";
                Text[ turkish ] = "Format";
                Text[ arabic ] = "ÇáÊäÓíÞ";
            };
            PageItem
            {
                Identifier = TP_ENV_PRT ;
                Text = "Drucker" ;
                Text [ English ] = "Printer" ;
                Text [ norwegian ] = "Printer" ;
                Text [ italian ] = "Stampante" ;
                Text [ portuguese_brazilian ] = "Impressora" ;
                Text [ portuguese ] = "Impressora" ;
                Text [ finnish ] = "Kirjoitin" ;
                Text [ danish ] = "Printer" ;
                Text [ french ] = "Imprimante" ;
                Text [ swedish ] = "Skrivare" ;
                Text [ dutch ] = "Printer" ;
                Text [ spanish ] = "Impresora" ;
                Text [ english_us ] = "Printer" ;
                PageResID = TP_ENV_PRT ;
                Text[ chinese_simplified ] = "´òÓ¡»ú";
                Text[ russian ] = "Ïðèíòåð";
                Text[ polish ] = "Drukarka";
                Text[ japanese ] = "ÌߨÝÀ";
                Text[ chinese_traditional ] = "¦Lªí¾÷";
                Text[ arabic ] = "ÇáØÇÈÚÉ";
                Text[ greek ] = "ÅêôõðùôÞò";
                Text[ korean ] = "ÇÁ¸°ÅÍ";
                Text[ turkish ] = "Yazýcý";
                Text[ language_user1 ] = " ";
            };
        };
    };
    String ST_INSERT
    {
        Text = "~Einfügen" ;
        Text [ English ] = "~Insert" ;
        Text [ norwegian ] = "~Insert" ;
        Text [ italian ] = "~Inserisci" ;
        Text [ portuguese_brazilian ] = "~Inserir" ;
        Text [ portuguese ] = "~Inserir" ;
        Text [ finnish ] = "~Lisää" ;
        Text [ danish ] = "~Indsæt" ;
        Text [ french ] = "In~sérer" ;
        Text [ swedish ] = "~Infoga" ;
        Text [ dutch ] = "~Invoegen" ;
        Text [ spanish ] = "I~nsertar" ;
        Text [ english_us ] = "~Insert" ;
        Text[ chinese_simplified ] = "²åÈë(~I)";
        Text[ russian ] = "Âñòàâêà";
        Text[ polish ] = "Wstaw";
        Text[ japanese ] = "‘}“ü(~I)";
        Text[ chinese_traditional ] = "´¡¤J(~I)";
        Text[ arabic ] = "ÅÏÑÇÌ";
        Text[ dutch ] = "~Invoegen";
        Text[ chinese_simplified ] = "²åÈë(~I)";
        Text[ greek ] = "ÅéóáãùãÞ";
        Text[ korean ] = "»ðÀÔ(~I)";
        Text[ turkish ] = "~Ekle";
        Text[ language_user1 ] = " ";
    };
    String ST_CHANGE
    {
        Text = "~Ändern" ;
        Text [ English ] = "Change" ;
        Text [ norwegian ] = "Endre" ;
        Text [ italian ] = "C~ambia" ;
        Text [ portuguese_brazilian ] = "Mudar" ;
        Text [ portuguese ] = "~Modificar" ;
        Text [ finnish ] = "Muuta" ;
        Text [ danish ] = "Modificer" ;
        Text [ french ] = "~Modifier" ;
        Text [ swedish ] = "~Ändra" ;
        Text [ dutch ] = "~Wijzigen" ;
        Text [ spanish ] = "~Modificar" ;
        Text [ english_us ] = "~Modify" ;
        Text[ chinese_simplified ] = "¸ü¸Ä(~M)";
        Text[ russian ] = "Èçìåíèòü";
        Text[ polish ] = "Modyfikuj";
        Text[ japanese ] = "•ύX(~M)";
        Text[ chinese_traditional ] = "­×§ï(~M)";
        Text[ arabic ] = "ÊÚÏíá";
        Text[ dutch ] = "~Wijzigen";
        Text[ chinese_simplified ] = "¸ü¸Ä(~M)";
        Text[ greek ] = "Ôñïðïðïßçóç";
        Text[ korean ] = "¼öÁ¤(~M)";
        Text[ turkish ] = "D~eðiþtir";
        Text[ language_user1 ] = " ";
    };
    Text[ chinese_simplified ] = "ÐÅ·â";
    Text[ russian ] = "Êîíâåðò";
    Text[ polish ] = "Koperta listowa";
    Text[ japanese ] = "••“›";
    Text[ chinese_traditional ] = "«H«Ê";
    Text[ arabic ] = "ÙÑÝ";
    Text[ greek ] = "ÖÜêåëïò";
    Text[ korean ] = "ºÀÅõ";
    Text[ turkish ] = "Zarf";
    Text[ language_user1 ] = " ";
};
 // TP_ENV_ENV ---------------------------------------------------------------
TabPage TP_ENV_ENV
{
    HelpID = HID_ENV_ENV ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Hide = TRUE ;
    FixedText TXT_ADDR
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 40 , 8 ) ;
        Text = "~Empfänger" ;
        Text [ English ] = "Addressee" ;
        Text [ norwegian ] = "Addressee" ;
        Text [ italian ] = "Destinatario" ;
        Text [ portuguese_brazilian ] = "Endereço" ;
        Text [ portuguese ] = "~Destinatário" ;
        Text [ finnish ] = "Vastaanottaja" ;
        Text [ danish ] = "Modtager" ;
        Text [ french ] = "~Destinataire" ;
        Text [ swedish ] = "Mottagar~e" ;
        Text [ dutch ] = "~Geadresseerde" ;
        Text [ spanish ] = "~Destinatario" ;
        Text [ english_us ] = "Addr~essee" ;
        Group = TRUE ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "ÊÕ¼þÈË(~E)";
        Text[ russian ] = "Ïîëó÷àòåëü";
        Text[ polish ] = "Odbiorca";
        Text[ japanese ] = "ŽóMŽÒ(~E)";
        Text[ chinese_traditional ] = "¦¬¥óªÌ(~E)";
        Text[ arabic ] = "ÇáãÓÊáã";
        Text[ greek ] = "ÐáñáëÞðôçò";
        Text[ korean ] = "¹Þ´Â »ç¶÷(~E)";
        Text[ turkish ] = "Alýcý";
        Text[ language_user1 ] = " ";
    };
    MultiLineEdit EDT_ADDR
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 6 , 14 ) ;
        Size = MAP_APPFONT ( 110 , 44 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        HScroll = TRUE ;
        VScroll = TRUE ;
        IgnoreTab = TRUE;
    };
    FixedText FT_DATABASE
    {
        Pos = MAP_APPFONT ( 122 , 3 ) ;
        Size = MAP_APPFONT ( 57 , 10 ) ;
        Text = "~Datenbank" ;
        Text [ English ] = "Database" ;
        Text [ norwegian ] = "Database" ;
        Text [ italian ] = "Database" ;
        Text [ portuguese_brazilian ] = "Base de Dados" ;
        Text [ portuguese ] = "~Base de dados" ;
        Text [ finnish ] = "Tietokanta" ;
        Text [ danish ] = "Database" ;
        Text [ french ] = "~Base de données" ;
        Text [ swedish ] = "~Databas" ;
        Text [ dutch ] = "~Database" ;
        Text [ spanish ] = "Base de datos" ;
        Text [ english_us ] = "Database" ;
        Text[ chinese_simplified ] = "Êý¾Ý¿â(~D)";
        Text[ russian ] = "Áàçà äàííûõ";
        Text[ polish ] = "Baza danych";
        Text[ japanese ] = "ÃÞ°ÀÍÞ°½";
        Text[ chinese_traditional ] = "¸ê®Æ®w";
        Text[ arabic ] = "ÞÇÚÏÉ ÇáÈíÇäÇÊ";
        Text[ greek ] = "ÂÜóç ~äåäïìÝíùí";
        Text[ korean ] = "µ¥ÀÌÅͺ£À̽º";
        Text[ turkish ] = "Veritabaný";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_DATABASE
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 122 , 14 ) ;
        Size = MAP_APPFONT ( 57 , 60 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
    };
    FixedText FT_TABLE
    {
        Pos = MAP_APPFONT ( 185 , 3 ) ;
        Size = MAP_APPFONT ( 57 , 10 ) ;
        Text = "~Tabelle" ;
        Text [ ENGLISH ] = "Table" ;
        Text [ english_us ] = "Table" ;
        Text [ italian ] = "Tabella" ;
        Text [ spanish ] = "Tabla" ;
        Text [ french ] = "~Table" ;
        Text [ dutch ] = "~Tabel" ;
        Text [ swedish ] = "~Tabell" ;
        Text [ danish ] = "Tabel" ;
        Text [ portuguese_brazilian ] = "Tabelle" ;
        Text [ portuguese ] = "~Tabela" ;
        Text[ chinese_simplified ] = "±í¸ñ(~T)";
        Text[ russian ] = "Òàáëèöà";
        Text[ polish ] = "Tabela";
        Text[ japanese ] = "ÃÞ°ÀÍÞ°½";
        Text[ chinese_traditional ] = "ªí®æ";
        Text[ arabic ] = "ÇáÌÏæá";
        Text[ greek ] = "Ðßíáêáò";
        Text[ korean ] = "ǥ";
        Text[ turkish ] = "Tablo";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_TABLE
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 185 , 14 ) ;
        Size = MAP_APPFONT ( 57 , 60 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
    };
    ImageButton BTN_INSERT
    {
        Pos = MAP_APPFONT ( 122 , 45 ) ;
        Size = MAP_APPFONT ( 18 , 12 ) ;
        SYMBOL = IMAGEBUTTON_ARROW_LEFT ;
        TabStop = TRUE ;
    };
    FixedText FT_DBFIELD
    {
        Pos = MAP_APPFONT ( 146 , 34 ) ;
        Size = MAP_APPFONT ( 57 , 10 ) ;
        Text = "Datenbank~feld" ;
        Text [ English ] = "Database field" ;
        Text [ norwegian ] = "Database field" ;
        Text [ italian ] = "Campo database" ;
        Text [ portuguese_brazilian ] = "Campo base de dados" ;
        Text [ portuguese ] = "Campo base de dados" ;
        Text [ finnish ] = "Tietokantakenttä" ;
        Text [ danish ] = "Databasefelt" ;
        Text [ french ] = "~Champ de B.D." ;
        Text [ swedish ] = "Databas~fält" ;
        Text [ dutch ] = "Database~veld" ;
        Text [ spanish ] = "~Campo base de datos" ;
        Text [ english_us ] = "~Database field" ;
        Text[ chinese_simplified ] = "Êý¾Ý¿â×Ö¶Î(~D)";
        Text[ russian ] = "Ïîëå áàçû äàííûõ";
        Text[ polish ] = "Pole bazy danych";
        Text[ japanese ] = "ÃÞ°ÀÍÞ°½ ̨°ÙÄÞ(~D)";
        Text[ chinese_traditional ] = "¸ê®Æ®wÄæ¦ì(~D)";
        Text[ arabic ] = "ÍÞá ÞÇÚÏÉ ÇáÈíÇäÇÊ";
        Text[ greek ] = "Ðåäßï âÜóçò äåäïìÝíùí";
        Text[ korean ] = "µ¥ÀÌÅͺ£À̽º Çʵå(~D)";
        Text[ turkish ] = "Veritabaný alaný";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_DBFIELD
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 146 , 45 ) ;
        Size = MAP_APPFONT ( 96 , 60 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
    };
    CheckBox BOX_SEND
    {
        Pos = MAP_APPFONT ( 6 , 72 ) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "~Absender" ;
        Text [ English ] = "Sender" ;
        Text [ norwegian ] = "Sender" ;
        Text [ italian ] = "Mittente" ;
        Text [ portuguese_brazilian ] = "Remetente" ;
        Text [ portuguese ] = "~Remetente" ;
        Text [ finnish ] = "Lähettäjä" ;
        Text [ danish ] = "Afsender" ;
        Text [ french ] = "~Expéditeur" ;
        Text [ swedish ] = "~Avsändare" ;
        Text [ dutch ] = "Af~zender" ;
        Text [ spanish ] = "R~emitente" ;
        Text [ english_us ] = "~Sender" ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "·¢¼þÈË(~S)";
        Text[ russian ] = "Îòïðàâèòåëü";
        Text[ polish ] = "Nadawca";
        Text[ japanese ] = "·ol(~S)";
        Text[ chinese_traditional ] = "±H¥óªÌ(~S)";
        Text[ arabic ] = "ÇáãÑÓá";
        Text[ greek ] = "ÁðïóôïëÝáò";
        Text[ korean ] = "º¸³½ »ç¶÷(~S)";
        Text[ turkish ] = "Gönderen";
        Text[ language_user1 ] = " ";
    };
    MultiLineEdit EDT_SEND
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 6 , 85 ) ;
        Size = MAP_APPFONT ( 110 , 44 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        HScroll = TRUE ;
        VScroll = TRUE ;
        IgnoreTab = TRUE;
    };
    Window WIN_PREVIEW
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 122 , 68 ) ;
        Size = MAP_APPFONT ( 83 , 61 ) ;
    };
};
 // Strings ******************************************************************
String STR_DOC_TITLE
{
    Text = "Briefumschlag" ;
    Text [ English ] = "Envelope" ;
    Text [ norwegian ] = "Envelope" ;
    Text [ italian ] = "Busta" ;
    Text [ portuguese_brazilian ] = "Envelope" ;
    Text [ portuguese ] = "Envelope" ;
    Text [ finnish ] = "Kirjekuori" ;
    Text [ danish ] = "Konvolut" ;
    Text [ french ] = "Enveloppe" ;
    Text [ swedish ] = "Kuvert" ;
    Text [ dutch ] = "Envelop" ;
    Text [ spanish ] = "Sobre" ;
    Text [ english_us ] = "Envelope" ;
    Text[ chinese_simplified ] = "ÐÅ·â";
    Text[ russian ] = "Êîíâåðò";
    Text[ polish ] = "Koperta listowa";
    Text[ japanese ] = "••“›";
    Text[ chinese_traditional ] = "«H«Ê";
    Text[ arabic ] = "ÙÑÝ";
    Text[ greek ] = "ÖÜêåëïò";
    Text[ korean ] = "ºÀÅõ";
    Text[ turkish ] = "Zarf";
    Text[ language_user1 ] = " ";
};
diff --git a/sw/source/ui/envelp/envlop1.cxx b/sw/source/ui/envelp/envlop1.cxx
new file mode 100644
index 0000000..6ef27b8
--- /dev/null
+++ b/sw/source/ui/envelp/envlop1.cxx
@@ -0,0 +1,617 @@
/*************************************************************************
 *
 *  $RCSfile: envlop1.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:35 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "dbmgr.hxx"
#ifndef _SBA_SBAOBJ_HXX //autogen
#include <offmgr/sbaobj.hxx>
#endif
#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif
#ifndef _SV_MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SWWAIT_HXX
#include <swwait.hxx>
#endif

#include "wrtsh.hxx"
#include "errhdl.hxx"
#include "cmdid.h"
#include "helpid.h"
#include "envfmt.hxx"
#include "envlop.hxx"
#include "envprt.hxx"
#include "fmtcol.hxx"
#include "poolfmt.hxx"
#include "view.hxx"

#include "envlop.hrc"

#ifdef REPLACE_OFADBMGR
#ifndef _COM_SUN_STAR_LANG_XMULTISERVICEFACTORY_HPP_
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XNAMEACCESS_HPP_
#include <com/sun/star/container/XNameAccess.hpp>
#endif
#ifndef _UNOTOOLS_PROCESSFACTORY_HXX_
#include <unotools/processfactory.hxx>
#endif
using namespace com::sun::star::lang;
using namespace com::sun::star::container;
using namespace com::sun::star::uno;
using namespace com::sun::star;
using namespace rtl;
#define C2U(char) rtl::OUString::createFromAscii(char)
#else

#endif  //REPLACE_OFADBMGR

// --------------------------------------------------------------------------



SwEnvPreview::SwEnvPreview(SfxTabPage* pParent, const ResId& rResID) :

    Window(pParent, rResID)

{
    SetMapMode(MapMode(MAP_PIXEL));
}

// --------------------------------------------------------------------------



SwEnvPreview::~SwEnvPreview()
{
}

// ----------------------------------------------------------------------------



void SwEnvPreview::Paint(const Rectangle &)
{
    const SwEnvItem& rItem =
        ((SwEnvDlg*) GetParent()->GetParent()->GetParent())->aEnvItem;

    USHORT nPageW = (USHORT) Max(rItem.lWidth, rItem.lHeight),
           nPageH = (USHORT) Min(rItem.lWidth, rItem.lHeight);

    float fx = (float) GetOutputSizePixel().Width () / nPageW,
          fy = (float) GetOutputSizePixel().Height() / nPageH,
          f  = fx < fy ? fx : fy;

    // Umschlag
    long   nW = (USHORT) (f * nPageW),
           nH = (USHORT) (f * nPageH),
           nX = (GetOutputSizePixel().Width () - nW) / 2,
           nY = (GetOutputSizePixel().Height() - nH) / 2;
    SetFillColor(Color(COL_WHITE));
    DrawRect(Rectangle(Point(nX, nY), Size(nW, nH)));

    // Absender
    if (rItem.bSend)
    {
        long   nSendX = nX + (USHORT) (f * rItem.lSendFromLeft),
               nSendY = nY + (USHORT) (f * rItem.lSendFromTop ),
               nSendW = (USHORT) (f * (rItem.lAddrFromLeft - rItem.lSendFromLeft)),
               nSendH = (USHORT) (f * (rItem.lAddrFromTop  - rItem.lSendFromTop  - 566));
        SetFillColor(Color(COL_GRAY));
        DrawRect(Rectangle(Point(nSendX, nSendY), Size(nSendW, nSendH)));
    }

    // Empfaenger
    long   nAddrX = nX + (USHORT) (f * rItem.lAddrFromLeft),
           nAddrY = nY + (USHORT) (f * rItem.lAddrFromTop ),
           nAddrW = (USHORT) (f * (nPageW - rItem.lAddrFromLeft - 566)),
           nAddrH = (USHORT) (f * (nPageH - rItem.lAddrFromTop  - 566));
    SetFillColor(Color(COL_GRAY));
    DrawRect(Rectangle(Point(nAddrX, nAddrY), Size(nAddrW, nAddrH)));

    // Briefmarke
    long   nStmpW = (USHORT) (f * 1417 /* 2,5 cm */),
           nStmpH = (USHORT) (f * 1701 /* 3,0 cm */),
           nStmpX = nX + nW - (USHORT) (f * 566) - nStmpW,
           nStmpY = nY + (USHORT) (f * 566);

    SetFillColor(Color(COL_WHITE));
    DrawRect(Rectangle(Point(nStmpX, nStmpY), Size(nStmpW, nStmpH)));
}

// --------------------------------------------------------------------------



SwEnvDlg::SwEnvDlg(Window* pParent, const SfxItemSet& rSet,
                    SwWrtShell* pWrtSh, Printer* pPrt, BOOL bInsert) :

    SfxTabDialog(pParent, SW_RES(DLG_ENV), &rSet, FALSE, &aEmptyStr),
    sInsert(ResId(ST_INSERT)),
    sChange(ResId(ST_CHANGE)),
    aEnvItem((const SwEnvItem&) rSet.Get(FN_ENVELOP)),
    pSh(pWrtSh),
    pPrinter(pPrt),
    pAddresseeSet(0),
    pSenderSet(0)
{
    FreeResource();

    GetOKButton().SetText(String(SW_RES(STR_BTN_NEWDOC)));
    GetOKButton().SetHelpId(HID_ENVELOP_PRINT);
    GetOKButton().SetHelpText(aEmptyStr);   // Damit generierter Hilfetext verwendet wird
    if (GetUserButton())
    {
        GetUserButton()->SetText(bInsert ? sInsert : sChange);
        GetUserButton()->SetHelpId(HID_ENVELOP_INSERT);
    }

    AddTabPage(TP_ENV_ENV, SwEnvPage   ::Create, 0);
    AddTabPage(TP_ENV_FMT, SwEnvFmtPage::Create, 0);
    AddTabPage(TP_ENV_PRT, SwEnvPrtPage::Create, 0);
}

// --------------------------------------------------------------------------



SwEnvDlg::~SwEnvDlg()
{
    delete pAddresseeSet;
    delete pSenderSet;
}

// --------------------------------------------------------------------------



void SwEnvDlg::PageCreated(USHORT nId, SfxTabPage &rPage)
{
    if (nId == TP_ENV_PRT)
    {
        ((SwEnvPrtPage*)&rPage)->SetPrt(pPrinter);
    }
}

// --------------------------------------------------------------------------

short SwEnvDlg::Ok()
{
    short nRet = SfxTabDialog::Ok();

    if (nRet == RET_OK || nRet == RET_USER)
    {
        if (pAddresseeSet)
        {
            SwTxtFmtColl* pColl = pSh->GetTxtCollFromPool(RES_POOLCOLL_JAKETADRESS);
            pColl->SetAttr(*pAddresseeSet);
        }
        if (pSenderSet)
        {
            SwTxtFmtColl* pColl = pSh->GetTxtCollFromPool(RES_POOLCOLL_SENDADRESS);
            pColl->SetAttr(*pSenderSet);
        }
    }

    return nRet;
}

// --------------------------------------------------------------------------



SwEnvPage::SwEnvPage(Window* pParent, const SfxItemSet& rSet) :

    SfxTabPage(pParent, SW_RES(TP_ENV_ENV), rSet),

    aAddrText      (this, SW_RES(TXT_ADDR   )),
    aAddrEdit      (this, SW_RES(EDT_ADDR   )),
    aDatabaseFT    (this, SW_RES(FT_DATABASE)),
    aDatabaseLB    (this, SW_RES(LB_DATABASE)),
    aTableFT       (this, SW_RES(FT_TABLE   )),
    aTableLB       (this, SW_RES(LB_TABLE   )),
    aInsertBT      (this, SW_RES(BTN_INSERT )),
    aDBFieldFT     (this, SW_RES(FT_DBFIELD )),
    aDBFieldLB     (this, SW_RES(LB_DBFIELD )),
    aSenderBox     (this, SW_RES(BOX_SEND   )),
    aSenderEdit    (this, SW_RES(EDT_SEND   )),
    aPreview       (this, SW_RES(WIN_PREVIEW))

{
    FreeResource();
    SetExchangeSupport();
    pSh = GetParent()->pSh;

    // Handler installieren
    aDatabaseLB    .SetSelectHdl(LINK(this, SwEnvPage, DatabaseHdl     ));
    aTableLB       .SetSelectHdl(LINK(this, SwEnvPage, DatabaseHdl     ));
    aInsertBT      .SetClickHdl (LINK(this, SwEnvPage, FieldHdl        ));
    aSenderBox     .SetClickHdl (LINK(this, SwEnvPage, SenderHdl       ));

    sActDBName = pSh->GetDBName();
    InitDatabaseBox();
}

// --------------------------------------------------------------------------



SwEnvPage::~SwEnvPage()
{
}

// --------------------------------------------------------------------------



IMPL_LINK( SwEnvPage, DatabaseHdl, ListBox *, pListBox )
{
#ifdef REPLACE_OFADBMGR
#else
    sActDBName = SFX_APP()->LocalizeDBName(NATIONAL2INI, aDatabaseLB.GetSelectEntry());
#endif
    SwWait aWait( *pSh->GetView().GetDocShell(), TRUE );

    if (pListBox == &aDatabaseLB)
        pSh->GetNewDBMgr()->GetTableNames(&aTableLB, sActDBName);
#ifdef REPLACE_OFADBMGR
    pSh->GetNewDBMgr()->GetColumnNames(&aDBFieldLB, sActDBName, aTableLB.GetSelectEntry());
#else
    sActDBName += DB_DELIM;
    sActDBName += aTableLB.GetSelectEntry();
    pSh->GetNewDBMgr()->GetColumnNames(&aDBFieldLB, sActDBName);
#endif
    return 0;
}

// --------------------------------------------------------------------------



IMPL_LINK( SwEnvPage, FieldHdl, Button *, EMPTYARG )
{
    String aStr ( '<' );
    aStr += aDatabaseLB.GetSelectEntry();
    aStr += '.';
//  aStr += DB_DELIM;
    aStr += aTableLB.GetSelectEntry();
    aStr += '.';
//  aStr += DB_DELIM;
    aStr += aDBFieldLB.GetSelectEntry();
    aStr += '>';
    aAddrEdit.ReplaceSelected(aStr);
    Selection aSel = aAddrEdit.GetSelection();
    aAddrEdit.GrabFocus();
    aAddrEdit.SetSelection(aSel);
    return 0;
}

// --------------------------------------------------------------------------



IMPL_LINK( SwEnvPage, SenderHdl, Button *, EMPTYARG )
{
    const BOOL bEnable = aSenderBox.IsChecked();
    GetParent()->aEnvItem.bSend = bEnable;
    aSenderEdit.Enable(bEnable);
    if ( bEnable )
        aSenderEdit.GrabFocus();
    aPreview.Invalidate();
    return 0;
}

// --------------------------------------------------------------------------



void SwEnvPage::InitDatabaseBox()
{
    if (pSh->GetNewDBMgr())
    {
        aDatabaseLB.Clear();
#ifdef REPLACE_OFADBMGR
        Sequence<OUString> aDataNames = SwNewDBMgr::GetExistingDatabaseNames();
        const OUString* pDataNames = aDataNames.getConstArray();
        for (long i = 0; i < aDataNames.getLength(); i++)
            aDatabaseLB.InsertEntry(pDataNames[i]);

        String sDBName = sActDBName.GetToken( 0, DB_DELIM );
        String sTableName = sActDBName.GetToken( 1, DB_DELIM );
        aDatabaseLB.SelectEntry(sDBName);
        if (pSh->GetNewDBMgr()->GetTableNames(&aTableLB, sDBName))
        {
            aTableLB.SelectEntry(sTableName);
            pSh->GetNewDBMgr()->GetColumnNames(&aDBFieldLB, sActDBName, sTableName);
        }
        else
            aDBFieldLB.Clear();
#else
        SbaObject *pSbaObject = pSh->GetNewDBMgr()->GetSbaObject();
        if(!pSbaObject)
            return;
        String sDBNames = pSbaObject->GetDatabaseNames();
        sDBNames = SFX_APP()->LocalizeDBName(INI2NATIONAL, sDBNames);
        USHORT nCount = sDBNames.GetTokenCount();

        for (USHORT i = 0; i < nCount; i++)
            aDatabaseLB.InsertEntry(sDBNames.GetToken(i));
        String sDBName = SFX_APP()->LocalizeDBName( INI2NATIONAL,
                                    sActDBName.GetToken( 0, DB_DELIM ));
        aDatabaseLB.SelectEntry(sDBName);
        if (pSh->GetNewDBMgr()->GetTableNames(&aTableLB, sDBName))
        {
            aTableLB.SelectEntry(sActDBName.GetToken(1, DB_DELIM));
            pSh->GetNewDBMgr()->GetColumnNames(&aDBFieldLB, sActDBName);
        }
        else
            aDBFieldLB.Clear();
#endif

    }
}

// --------------------------------------------------------------------------



SfxTabPage* SwEnvPage::Create(Window* pParent, const SfxItemSet& rSet)
{
    return new SwEnvPage(pParent, rSet);
}

// --------------------------------------------------------------------------



void SwEnvPage::ActivatePage(const SfxItemSet& rSet)
{
    SfxItemSet aSet(rSet);
    aSet.Put(GetParent()->aEnvItem);
    Reset(aSet);
}

// --------------------------------------------------------------------------



int SwEnvPage::DeactivatePage(SfxItemSet* pSet)
{
    FillItem(GetParent()->aEnvItem);
    FillItemSet(*pSet);
    return SfxTabPage::LEAVE_PAGE;
}

// --------------------------------------------------------------------------



void SwEnvPage::FillItem(SwEnvItem& rItem)
{
    rItem.aAddrText = aAddrEdit  .GetText();
    rItem.bSend     = aSenderBox .IsChecked();
    rItem.aSendText = aSenderEdit.GetText();
}

// --------------------------------------------------------------------------



BOOL SwEnvPage::FillItemSet(SfxItemSet& rSet)
{
    FillItem(GetParent()->aEnvItem);
    rSet.Put(GetParent()->aEnvItem);
    return TRUE;
}

// ----------------------------------------------------------------------------



void SwEnvPage::Reset(const SfxItemSet& rSet)
{
    SwEnvItem aItem = (const SwEnvItem&) rSet.Get(FN_ENVELOP);
    aAddrEdit  .SetText(aItem.aAddrText.ConvertLineEnd());
    aSenderEdit.SetText(aItem.aSendText.ConvertLineEnd());
    aSenderBox .Check  (aItem.bSend);
    aSenderBox.GetClickHdl().Call(&aSenderBox);
}



// ----------------------------------------------------------------------------

/*
$Log: not supported by cvs2svn $
Revision 1.91  2000/09/18 16:05:25  willem.vandorp
OpenOffice header added.

Revision 1.90  2000/07/18 12:50:08  os
replace ofadbmgr

Revision 1.89  2000/03/03 15:17:00  os
StarView remainders removed

Revision 1.88  2000/02/11 14:45:12  hr
#70473# changes for unicode ( patched by automated patchtool )

Revision 1.87  1999/10/08 10:00:09  jp
no cast from GetpApp to SfxApp

Revision 1.86  1999/10/05 10:18:49  os
#67889# some printer problems solved

Revision 1.85  1999/09/28 13:21:24  os
survive without database

Revision 1.84  1999/09/24 13:53:09  os
chg: ODbRow/ODbVariant - includes moved

Revision 1.83  1999/08/26 17:36:02  JP
no cast from GetpApp to SfxApp


      Rev 1.82   26 Aug 1999 19:36:02   JP
   no cast from GetpApp to SfxApp

      Rev 1.81   13 Jul 1999 14:28:34   HR
   #65293#: include <swwait.hxx> and <view.hxx>

      Rev 1.80   08 Jul 1999 18:25:00   MA
   Use internal object to toggle wait cursor

      Rev 1.79   09 Jun 1999 19:34:42   JP
   have to change: no cast from GetpApp to SfxApp/OffApp, SfxShell only subclass of SfxApp

      Rev 1.78   01 Mar 1999 16:21:52   MA
   #62490# Altlast entfernt (Drucken und Briefumschlaege/Etiketten und Datenbank)

      Rev 1.77   09 Jul 1998 09:52:30   JP
   EmptyStr benutzen

      Rev 1.76   09 Apr 1998 14:23:46   OM
   #47097# Undo von Vorlagenaenderungen ermoeglichen

      Rev 1.75   24 Nov 1997 11:52:12   MA
   includes

      Rev 1.74   03 Nov 1997 13:17:16   MA
   precomp entfernt

      Rev 1.73   03 Sep 1997 13:59:12   OM
   #36627# Sinnvolle Fehlermeldungen liefern

      Rev 1.72   02 Sep 1997 09:58:24   OM
   SDB-Headeranpassung

      Rev 1.71   05 May 1997 11:16:30   OM
   Hilfetext fuer OK loeschen

      Rev 1.70   24 Apr 1997 11:06:30   OM
   HelpID fuer Briefumschlag aendern

      Rev 1.69   04 Apr 1997 14:04:52   OM
   HelpIDs fuer DruckButton

      Rev 1.68   05 Feb 1997 10:19:06   OM
   FillItemSet in DeactivatePage rufen

      Rev 1.67   04 Dec 1996 13:54:02   OM
   Kein konstanter AdressDBName mehr

      Rev 1.66   11 Nov 1996 09:44:16   MA
   ResMgr

      Rev 1.65   07 Oct 1996 09:33:18   MA
   Umstellung Enable/Disable

      Rev 1.64   25 Sep 1996 14:11:12   OM
   Neue Datenbanktrenner

      Rev 1.63   06 Aug 1996 16:46:38   OM
   Neue Segs

      Rev 1.62   06 Aug 1996 16:45:36   OM
   Datenbankumstellung

      Rev 1.61   26 Jul 1996 20:36:38   MA
   includes

      Rev 1.60   17 Jul 1996 13:47:04   OM
   Datenbankumstellung 327

      Rev 1.59   02 Jul 1996 18:47:06   MA
   Wait-Umstellung 325

      Rev 1.58   31 May 1996 16:01:20   OM
   Datenbankumstellung

      Rev 1.57   29 May 1996 12:29:28   OM
   Umstellung auf 320

      Rev 1.56   18 Apr 1996 16:32:16   OM
   Datenbankumstellung: Basic-Entkopplung

      Rev 1.55   15 Apr 1996 09:59:44   OM
   #26838# DefWin fuer DatenbankDlg setzen

      Rev 1.54   12 Apr 1996 14:07:50   OM
   #26838# Richtiges Window-Parent disabled

      Rev 1.53   11 Apr 1996 12:27:16   OM
   #26838# Mehrfachoeffnung vom Datenbank-Dlg unterbunden

      Rev 1.52   04 Apr 1996 12:09:00   OM
   patches legalisiert

      Rev 1.51   20 Mar 1996 15:36:34   OM
   DB-Namensumstellung auf ODBC

*/

diff --git a/sw/source/ui/envelp/envprt.cxx b/sw/source/ui/envelp/envprt.cxx
new file mode 100644
index 0000000..b8a0e12
--- /dev/null
+++ b/sw/source/ui/envelp/envprt.cxx
@@ -0,0 +1,428 @@
/*************************************************************************
 *
 *  $RCSfile: envprt.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:35 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SV_PRINT_HXX //autogen
#include <vcl/print.hxx>
#endif
#ifndef _SV_PRNSETUP_HXX_ //autogen
#include <svtools/prnsetup.hxx>
#endif

#include "swtypes.hxx"
#include "cmdid.h"
#include "envprt.hxx"
#include "envlop.hxx"
#include "uitool.hxx"

#include "envprt.hrc"





SwEnvPrtPage::SwEnvPrtPage(Window* pParent, const SfxItemSet& rSet) :

    SfxTabPage(pParent, SW_RES(TP_ENV_PRT), rSet),

    aAlignBox    (this, SW_RES(BOX_ALIGN  )),
    aTopButton   (this, SW_RES(BTN_TOP    )),
    aBottomButton(this, SW_RES(BTN_BOTTOM )),
    aRightText   (this, SW_RES(TXT_RIGHT  )),
    aRightField  (this, SW_RES(FLD_RIGHT  )),
    aDownText    (this, SW_RES(TXT_DOWN   )),
    aDownField   (this, SW_RES(FLD_DOWN   )),
    aPrinterInfo (this, SW_RES(TXT_PRINTER)),
    aNoNameGroup (this, SW_RES(GRP_NONAME )),
    aPrtSetup    (this, SW_RES(BTN_PRTSETUP))

{
    FreeResource();
    SetExchangeSupport();

    // Metriken
    FieldUnit eUnit = ::GetDfltMetric(FALSE);
    SetMetric(aRightField, eUnit);
    SetMetric(aDownField , eUnit);

    // Handler installieren
    aTopButton   .SetClickHdl(LINK(this, SwEnvPrtPage, ClickHdl));
    aBottomButton.SetClickHdl(LINK(this, SwEnvPrtPage, ClickHdl));

    aPrtSetup    .SetClickHdl(LINK(this, SwEnvPrtPage, ButtonHdl));

    // Bitmaps
    aBottomButton.GetClickHdl().Call(&aBottomButton);

    // ToolBox
    Size aSz = aAlignBox.CalcWindowSizePixel();
    aAlignBox.SetSizePixel(aSz);
    aAlignBox.SetPosPixel(Point(aNoNameGroup.GetPosPixel().X() + (aNoNameGroup.GetSizePixel().Width() - aSz.Width()) / 2, aAlignBox.GetPosPixel().Y()));
    aAlignBox.SetClickHdl(LINK(this, SwEnvPrtPage, AlignHdl));

}

// --------------------------------------------------------------------------



SwEnvPrtPage::~SwEnvPrtPage()
{
}

// --------------------------------------------------------------------------



IMPL_LINK( SwEnvPrtPage, ClickHdl, Button *, EMPTYARG )
{
    if (aBottomButton.IsChecked())
    {
        // Briefumschlaege von unten
        aAlignBox.SetItemImage(ITM_HOR_LEFT, Bitmap(SW_RES(BMP_HOR_LEFT_LOWER)));
        aAlignBox.SetItemImage(ITM_HOR_CNTR, Bitmap(SW_RES(BMP_HOR_CNTR_LOWER)));
        aAlignBox.SetItemImage(ITM_HOR_RGHT, Bitmap(SW_RES(BMP_HOR_RGHT_LOWER)));
        aAlignBox.SetItemImage(ITM_VER_LEFT, Bitmap(SW_RES(BMP_VER_LEFT_LOWER)));
        aAlignBox.SetItemImage(ITM_VER_CNTR, Bitmap(SW_RES(BMP_VER_CNTR_LOWER)));
        aAlignBox.SetItemImage(ITM_VER_RGHT, Bitmap(SW_RES(BMP_VER_RGHT_LOWER)));
    }
    else
    {
        // Briefumschlaege von oben
        aAlignBox.SetItemImage(ITM_HOR_LEFT, Bitmap(SW_RES(BMP_HOR_LEFT_UPPER)));
        aAlignBox.SetItemImage(ITM_HOR_CNTR, Bitmap(SW_RES(BMP_HOR_CNTR_UPPER)));
        aAlignBox.SetItemImage(ITM_HOR_RGHT, Bitmap(SW_RES(BMP_HOR_RGHT_UPPER)));
        aAlignBox.SetItemImage(ITM_VER_LEFT, Bitmap(SW_RES(BMP_VER_LEFT_UPPER)));
        aAlignBox.SetItemImage(ITM_VER_CNTR, Bitmap(SW_RES(BMP_VER_CNTR_UPPER)));
        aAlignBox.SetItemImage(ITM_VER_RGHT, Bitmap(SW_RES(BMP_VER_RGHT_UPPER)));
    }
    return 0;
}

// --------------------------------------------------------------------------



IMPL_LINK( SwEnvPrtPage, ButtonHdl, Button *, pBtn )
{
    if (pBtn == &aPrtSetup)
    {
        // Druck-Setup aufrufen
        if (pPrt)
        {
            PrinterSetupDialog* pDlg = new PrinterSetupDialog(this );
            pDlg->SetPrinter(pPrt);
            pDlg->Execute();
            delete pDlg;
            GrabFocus();
            aPrinterInfo.SetText(pPrt->GetName());
        }
    }
    return 0;
}

// --------------------------------------------------------------------------



IMPL_LINK( SwEnvPrtPage, AlignHdl, ToolBox *, EMPTYARG )
{
    if (aAlignBox.GetCurItemId())
    {
        for (USHORT i = ITM_HOR_LEFT; i <= ITM_VER_RGHT; i++)
            aAlignBox.CheckItem(i, FALSE);
        aAlignBox.CheckItem(aAlignBox.GetCurItemId(), TRUE);
    }
    else
    {
        // GetCurItemId() == 0 ist moeglich!
        const SwEnvItem& rItem = (const SwEnvItem&) GetItemSet().Get(FN_ENVELOP);
        aAlignBox.CheckItem((USHORT) rItem.eAlign + ITM_HOR_LEFT, TRUE);
    }
    return 0;
}

// --------------------------------------------------------------------------



SfxTabPage* SwEnvPrtPage::Create(Window* pParent, const SfxItemSet& rSet)
{
    return new SwEnvPrtPage(pParent, rSet);
}

// --------------------------------------------------------------------------



void SwEnvPrtPage::ActivatePage(const SfxItemSet& rSet)
{
    if (pPrt)
        aPrinterInfo.SetText(pPrt->GetName());
}

// --------------------------------------------------------------------------



int SwEnvPrtPage::DeactivatePage(SfxItemSet* pSet)
{
    FillItemSet(*pSet);
    return SfxTabPage::LEAVE_PAGE;
}

// --------------------------------------------------------------------------



void SwEnvPrtPage::FillItem(SwEnvItem& rItem)
{
    USHORT nID = 0;
    for (USHORT i = ITM_HOR_LEFT; i <= ITM_VER_RGHT && !nID; i++)
        if (aAlignBox.IsItemChecked(i))
            nID = i;

    rItem.eAlign          = (SwEnvAlign) (nID - ITM_HOR_LEFT);
    rItem.bPrintFromAbove = aTopButton.IsChecked();
    rItem.lShiftRight     = GetFldVal(aRightField);
    rItem.lShiftDown      = GetFldVal(aDownField );
}

// --------------------------------------------------------------------------



BOOL SwEnvPrtPage::FillItemSet(SfxItemSet& rSet)
{
    FillItem(GetParent()->aEnvItem);
    rSet.Put(GetParent()->aEnvItem);
    return TRUE;
}

// ----------------------------------------------------------------------------



void SwEnvPrtPage::Reset(const SfxItemSet& rSet)
{
//    SfxItemSet aSet(rSet);
//    aSet.Put(GetParent()->aEnvItem);

    // Item auslesen
    const SwEnvItem& rItem = (const SwEnvItem&) rSet.Get(FN_ENVELOP);
    aAlignBox.CheckItem((USHORT) rItem.eAlign + ITM_HOR_LEFT);

    if (rItem.bPrintFromAbove)
        aTopButton   .Check();
    else
        aBottomButton.Check();

    SetFldVal(aRightField, rItem.lShiftRight);
    SetFldVal(aDownField , rItem.lShiftDown );

    ActivatePage(rSet);
    ClickHdl(&aTopButton);
}



// ----------------------------------------------------------------------------
/*
$Log: not supported by cvs2svn $
Revision 1.43  2000/09/18 16:05:25  willem.vandorp
OpenOffice header added.

Revision 1.42  2000/02/11 14:45:23  hr
#70473# changes for unicode ( patched by automated patchtool )

Revision 1.41  1999/10/05 10:18:49  os
#67889# some printer problems solved

Revision 1.40  1998/09/08 14:52:44  OS
#56134# Metric fuer Text und HTML getrennt


      Rev 1.39   08 Sep 1998 16:52:44   OS
   #56134# Metric fuer Text und HTML getrennt

      Rev 1.38   16 Feb 1998 15:33:18   RG
   ->DOS-Format

      Rev 1.37   28 Nov 1997 18:18:56   MA
   includes

      Rev 1.36   24 Nov 1997 11:52:10   MA
   includes

      Rev 1.35   03 Nov 1997 13:17:14   MA
   precomp entfernt

      Rev 1.34   01 Oct 1997 10:49:10   TRI
   PrintDialogumstellung

      Rev 1.33   20 Feb 1997 17:51:40   MA
   fix: Deactivate ueber Fill

      Rev 1.32   11 Nov 1996 09:44:16   MA
   ResMgr

      Rev 1.31   29 Oct 1996 17:59:28   HJS
   includes

      Rev 1.30   26 Jul 1996 20:36:36   MA
   includes

      Rev 1.29   06 Feb 1996 15:19:00   JP
   Link Umstellung 305

      Rev 1.28   28 Nov 1995 21:14:58   JP
   UiSystem-Klasse aufgehoben, in initui/swtype aufgeteilt

      Rev 1.27   27 Nov 1995 19:35:48   OM
   HasExchangeSupport->303a

      Rev 1.26   24 Nov 1995 16:59:42   OM
   PCH->PRECOMPILED

      Rev 1.25   13 Nov 1995 13:44:50   MA
   chg: Link-Cast entfernt

      Rev 1.24   10 Nov 1995 18:23:40   OM
   Brief-Image richtig initialisiert

      Rev 1.23   08 Nov 1995 13:48:24   OM
   Change->Set

      Rev 1.22   05 Aug 1995 19:15:40   ER
   segprag

      Rev 1.21   04 Aug 1995 18:32:44   OM
   Umstellung Drucktabpage

      Rev 1.20   03 Aug 1995 18:49:36   OM
   Umstellung Print-TabPage

      Rev 1.19   24 May 1995 18:14:56   ER
   Segmentierung

      Rev 1.18   24 Mar 1995 20:30:38   PK
   geht immer weiter

      Rev 1.17   23 Mar 1995 18:33:22   PK
   geht immer weiter ...

      Rev 1.16   17 Mar 1995 17:10:06   PK
   geht immer weiter

      Rev 1.15   15 Mar 1995 18:37:42   PK
   geht immer weiter

      Rev 1.14   06 Mar 1995 00:08:20   PK
   linkbarer envelp-zustand

      Rev 1.13   04 Mar 1995 22:55:30   PK
   geht immer weiter

      Rev 1.12   21 Feb 1995 15:39:10   PK
   erstmal eingecheckt

      Rev 1.11   25 Oct 1994 17:33:28   ER
   add: PCH

      Rev 1.10   09 Aug 1994 16:12:52   MS
   Entwarnung

      Rev 1.9   04 Aug 1994 09:38:32   SWG
   swg32: SED Size to SSize, LSize to Size etc.

      Rev 1.8   19 Jul 1994 15:14:28   PK
   globale metriken

      Rev 1.7   31 Mar 1994 16:26:36   PK
   (vor)letzter feinschliff beim druck

      Rev 1.6   23 Mar 1994 12:50:28   PK
   bugfix in alignhdl()

      Rev 1.5   22 Mar 1994 17:51:02   PK
   umschlaege vorerst fertig

      Rev 1.4   22 Mar 1994 09:41:34   SWG
   fehlerhafte FUNCDEFS gerichtet

      Rev 1.3   21 Mar 1994 19:02:56   PK
   weiter

      Rev 1.2   09 Mar 1994 19:33:48   PK
   ->update

      Rev 1.1   08 Mar 1994 19:33:04   PK


      Rev 1.0   08 Mar 1994 12:22:24   PK

*/

diff --git a/sw/source/ui/envelp/envprt.hrc b/sw/source/ui/envelp/envprt.hrc
new file mode 100644
index 0000000..bf435c3
--- /dev/null
+++ b/sw/source/ui/envelp/envprt.hrc
@@ -0,0 +1,114 @@
/*************************************************************************
 *
 *  $RCSfile: envprt.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:35 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _ENVPRT_HRC
#define _ENVPRT_HRC

// #include *****************************************************************

#include "envelp.hrc"

// Lokale Resourcen *********************************************************

#define BOX_ALIGN      1
#define BTN_TOP        7
#define BTN_BOTTOM     8
#define TXT_RIGHT      9
#define FLD_RIGHT     10
#define TXT_DOWN      11
#define FLD_DOWN      12
#define TXT_PRINTER   13
#define GRP_NONAME    14
#define BTN_PRTSETUP  15

// Globale Resourcen ********************************************************

#define BMP_HOR_LEFT_LOWER  (RC_ENVPRT_BEGIN     )
#define BMP_HOR_LEFT_UPPER  (RC_ENVPRT_BEGIN +  1)
#define BMP_HOR_CNTR_LOWER  (RC_ENVPRT_BEGIN +  2)
#define BMP_HOR_CNTR_UPPER  (RC_ENVPRT_BEGIN +  3)
#define BMP_HOR_RGHT_LOWER  (RC_ENVPRT_BEGIN +  4)
#define BMP_HOR_RGHT_UPPER  (RC_ENVPRT_BEGIN +  5)

#define BMP_VER_LEFT_LOWER  (RC_ENVPRT_BEGIN +  6)
#define BMP_VER_LEFT_UPPER  (RC_ENVPRT_BEGIN +  7)
#define BMP_VER_CNTR_LOWER  (RC_ENVPRT_BEGIN +  8)
#define BMP_VER_CNTR_UPPER  (RC_ENVPRT_BEGIN +  9)
#define BMP_VER_RGHT_LOWER  (RC_ENVPRT_BEGIN + 10)
#define BMP_VER_RGHT_UPPER  (RC_ENVPRT_BEGIN + 11)

#define ITM_HOR_LEFT        (RC_ENVPRT_BEGIN + 12)
#define ITM_HOR_CNTR        (RC_ENVPRT_BEGIN + 13)
#define ITM_HOR_RGHT        (RC_ENVPRT_BEGIN + 14)
#define ITM_VER_LEFT        (RC_ENVPRT_BEGIN + 15)
#define ITM_VER_CNTR        (RC_ENVPRT_BEGIN + 16)
#define ITM_VER_RGHT        (RC_ENVPRT_BEGIN + 17)

// Ueberlaufpruefung ********************************************************

#define ENVPRT_ACT_END  BMP_VER_RGHT_UPPER

#if ENVPRT_ACT_END > RC_ENVPRT_END
#error Resource-Ueberlauf in #file, #line
#endif

#endif

diff --git a/sw/source/ui/envelp/envprt.hxx b/sw/source/ui/envelp/envprt.hxx
new file mode 100644
index 0000000..4eccbe5
--- /dev/null
+++ b/sw/source/ui/envelp/envprt.hxx
@@ -0,0 +1,134 @@
/*************************************************************************
 *
 *  $RCSfile: envprt.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:35 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _ENVPRT_HXX
#define _ENVPRT_HXX


#ifndef _SFXTABDLG_HXX //autogen
#include <sfx2/tabdlg.hxx>
#endif
#ifndef _SV_TOOLBOX_HXX //autogen
#include <vcl/toolbox.hxx>
#endif
#ifndef _SV_FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif
#ifndef _SV_FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif
#ifndef _SV_GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif
#ifndef _SV_BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif
#ifndef _STDCTRL_HXX //autogen
#include <svtools/stdctrl.hxx>
#endif



#include "envimg.hxx"

class SwEnvDlg;

// class SwEnvPrtPage ---------------------------------------------------------

class SwEnvPrtPage : public SfxTabPage
{
    ToolBox      aAlignBox;
    RadioButton  aTopButton;
    RadioButton  aBottomButton;
    FixedText    aRightText;
    MetricField  aRightField;
    FixedText    aDownText;
    MetricField  aDownField;
    FixedInfo    aPrinterInfo;
    GroupBox     aNoNameGroup;
    PushButton   aPrtSetup;

    Printer* pPrt;

     SwEnvPrtPage(Window* pParent, const SfxItemSet& rSet);
    ~SwEnvPrtPage();

    DECL_LINK( ClickHdl, Button * );
    DECL_LINK( AlignHdl, ToolBox * );
    DECL_LINK( ButtonHdl, Button * );

    SwEnvDlg* GetParent() {return (SwEnvDlg*) SfxTabPage::GetParent()->GetParent();}

public:

    static SfxTabPage* Create(Window* pParent, const SfxItemSet& rSet);

    virtual void ActivatePage(const SfxItemSet& rSet);
    virtual int  DeactivatePage(SfxItemSet* pSet = 0);
            void FillItem(SwEnvItem& rItem);
    virtual BOOL FillItemSet(SfxItemSet& rSet);
    virtual void Reset(const SfxItemSet& rSet);

    inline void SetPrt(Printer* pPrinter) { pPrt = pPrinter; }
};

#endif

diff --git a/sw/source/ui/envelp/envprt.src b/sw/source/ui/envelp/envprt.src
new file mode 100644
index 0000000..53e9979
--- /dev/null
+++ b/sw/source/ui/envelp/envprt.src
@@ -0,0 +1,372 @@
/*************************************************************************
 *
 *  $RCSfile: envprt.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:35 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
 // #pragma *****************************************************************

 // #include ****************************************************************
#include "envprt.hrc"
#include "helpid.h"
 // TP_ENV_PRT ---------------------------------------------------------------
TabPage TP_ENV_PRT
{
    HelpID = HID_ENV_PRT ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Hide = TRUE ;
    ToolBox BOX_ALIGN
    {
        Pos = MAP_APPFONT ( 35 , 14 ) ;
        ItemList =
        {
            ToolBoxItem
            {
                Identifier = ITM_HOR_LEFT ;
                HelpID = ITM_HOR_LEFT ;
            };
            ToolBoxItem
            {
                Identifier = ITM_HOR_CNTR ;
                HelpID = ITM_HOR_CNTR ;
            };
            ToolBoxItem
            {
                Identifier = ITM_HOR_RGHT ;
                HelpID = ITM_HOR_RGHT ;
            };
            ToolBoxItem
            {
                Identifier = ITM_VER_LEFT ;
                HelpID = ITM_VER_LEFT ;
            };
            ToolBoxItem
            {
                Identifier = ITM_VER_CNTR ;
                HelpID = ITM_VER_CNTR ;
            };
            ToolBoxItem
            {
                Identifier = ITM_VER_RGHT ;
                HelpID = ITM_VER_RGHT ;
            };
        };
    };
    RadioButton BTN_TOP
    {
        Pos = MAP_APPFONT ( 12 , 39 ) ;
        Size = MAP_APPFONT ( 166 , 10 ) ;
        Text = "Von ~oben bedrucken" ;
        Text [ ENGLISH ] = "Print upper side" ;
        Text [ NORWEGIAN ] = "Print upper side" ;
        Text [ DANISH ] = "Forsiden opad" ;
        Text [ ENGLISH_US ] = "~Print from top" ;
        Text [ SPANISH ] = "Imprimir r~everso" ;
        Text [ FINNISH ] = "Tulosta ylõpuoli" ;
        Text [ FRENCH ] = "Imprimer du ~haut" ;
        Text [ ITALIAN ] = "Stampa da sopra" ;
        Text [ DUTCH ] = "B~ovenkant bedrukken" ;
        Text [ PORTUGUESE_BRAZILIAN ] = "Imprimir parte superior" ;
        Text [ SWEDISH ] = "Skriv ut u~ppifrån" ;
        Text [ PORTUGUESE ] = "Imprimir a partir de cima" ;
        TabStop = TRUE ;
        Group = TRUE ;
        Check = TRUE ;
        Text[ chinese_simplified ] = "´ÓÉÏ·½¿ªÊ¼´òÓ¡(~T)";
        Text[ russian ] = "Ïå÷àòàòü ñâåðõó";
        Text[ polish ] = "Drukuj od góry";
        Text[ japanese ] = "ã‚©‚çˆóü(~T)";
        Text[ chinese_traditional ] = "±q¤W¤è¶}©l¦C¦L(~T)";
        Text[ arabic ] = "ÇáØÈÇÚÉ ãä ÃÚáì";
        Text[ greek ] = "Åêôýðùóç áðü ðÜíù";
        Text[ korean ] = "À§·ÎºÎÅÍ Àμâ(~P)";
        Text[ turkish ] = "Üstten yazdýr";
        Text[ language_user1 ] = " ";
    };
    RadioButton BTN_BOTTOM
    {
        Pos = MAP_APPFONT ( 12 , 52 ) ;
        Size = MAP_APPFONT ( 166 , 10 ) ;
        Text = "Von ~unten bedrucken" ;
        Text [ ENGLISH ] = "Print lower side" ;
        Text [ NORWEGIAN ] = "Print lower side" ;
        Text [ DANISH ] = "Forsiden nedad" ;
        Text [ ENGLISH_US ] = "Print from ~bottom" ;
        Text [ SPANISH ] = "Imprimir ~anverso" ;
        Text [ FINNISH ] = "Tulosta alapuoli" ;
        Text [ FRENCH ] = "Imprimer du ~bas" ;
        Text [ ITALIAN ] = "Stampa da sotto" ;
        Text [ DUTCH ] = "~Onderkant bedrukken" ;
        Text [ PORTUGUESE_BRAZILIAN ] = "Imprimir parte inferior" ;
        Text [ SWEDISH ] = "Skriv ~ut nedifrån" ;
        Text [ PORTUGUESE ] = "Imprimir a partir de baixo" ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "´ÓÏ·½¿ªÊ¼´òÓ¡(~B)";
        Text[ russian ] = "Ïå÷àòàòü ñíèçó";
        Text[ polish ] = "Drukuj od do³u";
        Text[ japanese ] = "‰º‚©‚çˆóü(~B)";
        Text[ chinese_traditional ] = "±q¤U¤è¶}©l¦C¦L(~B)";
        Text[ arabic ] = "ÇáØÈÇÚÉ ãä ÃÓÝá";
        Text[ greek ] = "Åêôýðùóç áðü êÜôù";
        Text[ korean ] = "¾Æ·¡·ÎºÎÅÍ Àμâ(~B)";
        Text[ turkish ] = "Alttan yazdýr";
        Text[ language_user1 ] = " ";
    };
    FixedText TXT_RIGHT
    {
        Pos = MAP_APPFONT ( 12 , 68 ) ;
        Size = MAP_APPFONT ( 50 , 8 ) ;
        Text = "Nach ~rechts" ;
        Text [ ENGLISH ] = "Shift right" ;
        Text [ NORWEGIAN ] = "Shift right" ;
        Text [ DANISH ] = "Mod højre" ;
        Text [ ENGLISH_US ] = "~Shift right" ;
        Text [ SPANISH ] = "Hacia la ~derecha" ;
        Text [ FINNISH ] = "Siirrõ oikealle" ;
        Text [ FRENCH ] = "A ~droite" ;
        Text [ ITALIAN ] = "Sposta a destra" ;
        Text [ DUTCH ] = "Naar re~chts" ;
        Text [ PORTUGUESE_BRAZILIAN ] = "Trocar Ó direita" ;
        Text [ SWEDISH ] = "Åt höger" ;
        Text [ PORTUGUESE ] = "À direita" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "ÏòÓÒ(~S)";
        Text[ russian ] = "Âïðàâî";
        Text[ polish ] = "Na prawo";
        Text[ japanese ] = "‰E‚É(~S)";
        Text[ chinese_traditional ] = "¦V¥k(~S)";
        Text[ arabic ] = "Åáì Çáíãíä";
        Text[ greek ] = "Ðñïò ôá äåîéÜ";
        Text[ korean ] = "¿À¸¥ÂÊÀ¸·Î ¹Ð±â(~S)";
        Text[ turkish ] = "S~aða";
        Text[ language_user1 ] = " ";
    };
    MetricField FLD_RIGHT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 78 , 66 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 0 ;
        Maximum = 10000 ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        First = 0 ;
        Last = 10000 ;
        SpinSize = 10 ;
    };
    FixedText TXT_DOWN
    {
        Pos = MAP_APPFONT ( 12 , 83 ) ;
        Size = MAP_APPFONT ( 50 , 8 ) ;
        Text = "~Nach unten" ;
        Text [ ENGLISH ] = "Shift down" ;
        Text [ NORWEGIAN ] = "Shift down" ;
        Text [ DANISH ] = "Nedad" ;
        Text [ ENGLISH_US ] = "Shift ~down" ;
        Text [ SPANISH ] = "Hacia a~bajo" ;
        Text [ FINNISH ] = "Siirrõ alas" ;
        Text [ FRENCH ] = "Vers le ~bas" ;
        Text [ ITALIAN ] = "Sposta in basso" ;
        Text [ DUTCH ] = "~Naar beneden" ;
        Text [ PORTUGUESE_BRAZILIAN ] = "Trocar abaixo" ;
        Text [ SWEDISH ] = "~Nedåt" ;
        Text [ PORTUGUESE ] = "Para baixo" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "ÏòÏÂ(~D)";
        Text[ russian ] = "Âíèç";
        Text[ polish ] = "W dó³";
        Text[ japanese ] = "‰º‚É(~D)";
        Text[ chinese_traditional ] = "¦V¤U(~D)";
        Text[ arabic ] = "Åáì ÃÓÝá";
        Text[ greek ] = "Ðñïò ôá êÜôù";
        Text[ korean ] = "¾Æ·¡·Î ¹Ð±â(~D)";
        Text[ turkish ] = "~Aþaðý";
        Text[ language_user1 ] = " ";
    };
    MetricField FLD_DOWN
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 78 , 81 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 0 ;
        Maximum = 10000 ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        First = 0 ;
        Last = 10000 ;
        SpinSize = 10 ;
    };
    FixedText TXT_PRINTER
    {
        Pos = MAP_APPFONT ( 12 , 111 ) ;
        Size = MAP_APPFONT ( 183 , 10 ) ;
        Text = "- Kein Drucker installiert -" ;
        Text [ ENGLISH ] = "- No printer installed -" ;
        Text [ NORWEGIAN ] = "- No printer installed -" ;
        Text [ DANISH ] = "- Ingen printer installeret -" ;
        Text [ ENGLISH_US ] = "- No printer installed -" ;
        Text [ SPANISH ] = "- No hay instalada ninguna impresora -" ;
        Text [ FINNISH ] = "- Kirjoitinta ei asennettu -" ;
        Text [ FRENCH ] = "- Aucune imprimante installée -" ;
        Text [ ITALIAN ] = "- Nessuna stampante installata -." ;
        Text [ DUTCH ] = "- Geen printer geïnstalleerd -" ;
        Text [ PORTUGUESE_BRAZILIAN ] = "- Nenhuma impressora instalada -" ;
        Text [ SWEDISH ] = "- Ingen skrivare installerad -" ;
        Text [ PORTUGUESE ] = "- Nenhuma impressora instalada -" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "- ûÓа²×°´òÓ¡»ú -";
        Text[ russian ] = "- Ïðèíòåð íå èíñòàëëèðîâàí -";
        Text[ polish ] = "- Drukarka nie jest zainstalowana -";
        Text[ japanese ] = "- ÌߨÝÀ‚ª²Ý½Ä°Ù‚³‚ê‚Ä‚¢‚Ü‚¹‚ñ -";
        Text[ chinese_traditional ] = "- ¨S¦³¦w¸Ë¦Lªí¾÷ -";
        Text[ arabic ] = "- áÇ íæÌÏ ØÇÈÚÉ ãËÈÊÉ -";
        Text[ greek ] = "- Äåí Ý÷åé åãêáôáóôáèåß åêôõðùôÞò -";
        Text[ korean ] = "- ÇÁ¸°ÅͰ¡ ¼³Ä¡µÇÁö ¾Ê¾Ò½À´Ï´Ù. -";
        Text[ turkish ] = "- Kurulu yazýcý yok -";
        Text[ language_user1 ] = " ";
    };
    GroupBox GRP_NONAME
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 248 , 125 ) ;
        Group = TRUE ;
    };
    PushButton BTN_PRTSETUP
    {
        Pos = MAP_APPFONT ( 201 , 109 ) ;
        Size = MAP_APPFONT ( 48 , 14 ) ;
        Text = "~Einrichten..." ;
        Text [ ENGLISH ] = "Setup..." ;
        TabStop = TRUE ;
        Text [ english_us ] = "Setup..." ;
        Text [ italian ] = "Imposta..." ;
        Text [ spanish ] = "Configurar..." ;
        Text [ french ] = "~Paramétrer..." ;
        Text [ dutch ] = "~Configureren..." ;
        Text [ swedish ] = "Inrä~tta..." ;
        Text [ danish ] = "Indstil..." ;
        Text [ portuguese_brazilian ] = "Einrichten..." ;
        Text [ portuguese ] = "~Configurar..." ;
        Text[ chinese_simplified ] = "ÉèÖÃ(~S)...";
        Text[ russian ] = "Óñòàíîâèòü...";
        Text[ polish ] = "Ustaw...";
        Text[ japanese ] = "Ý’è...";
        Text[ language_user1 ] = " ";
        Text[ chinese_traditional ] = "³]¸m...";
        Text[ arabic ] = "...ÅÚÏÇÏ";
        Text[ greek ] = "~ÅãêáôÜóôáóç...";
        Text[ korean ] = "¼³Á¤...";
        Text[ turkish ] = "Ayarlar...";
    };
};
 // Bitmaps ******************************************************************
Bitmap BMP_HOR_LEFT_LOWER
{
    File = "envhl_l.bmp" ;
};
Bitmap BMP_HOR_LEFT_UPPER
{
    File = "envhl_u.bmp" ;
};
Bitmap BMP_HOR_CNTR_LOWER
{
    File = "envhc_l.bmp" ;
};
Bitmap BMP_HOR_CNTR_UPPER
{
    File = "envhc_u.bmp" ;
};
Bitmap BMP_HOR_RGHT_LOWER
{
    File = "envhr_l.bmp" ;
};
Bitmap BMP_HOR_RGHT_UPPER
{
    File = "envhr_u.bmp" ;
};
Bitmap BMP_VER_LEFT_LOWER
{
    File = "envvl_l.bmp" ;
};
Bitmap BMP_VER_LEFT_UPPER
{
    File = "envvl_u.bmp" ;
};
Bitmap BMP_VER_CNTR_LOWER
{
    File = "envvc_l.bmp" ;
};
Bitmap BMP_VER_CNTR_UPPER
{
    File = "envvc_u.bmp" ;
};
Bitmap BMP_VER_RGHT_LOWER
{
    File = "envvr_l.bmp" ;
};
Bitmap BMP_VER_RGHT_UPPER
{
    File = "envvr_u.bmp" ;
};
diff --git a/sw/source/ui/envelp/label.hrc b/sw/source/ui/envelp/label.hrc
new file mode 100644
index 0000000..6c1751a
--- /dev/null
+++ b/sw/source/ui/envelp/label.hrc
@@ -0,0 +1,158 @@
/*************************************************************************
 *
 *  $RCSfile: label.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:35 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _LABEL_HRC
#define _LABEL_HRC

// #include *****************************************************************

#include "envelp.hrc"

// Lokale Resourcen *********************************************************

#define TXT_WRITING   1
#define BOX_ADDR      2
#define EDT_WRITING   3
#define FT_DATABASE   4
#define LB_DATABASE   5
#define FT_TABLE      6
#define LB_TABLE      7
#define GRP_WRITING   8
#define BTN_CONT      9
#define BTN_SHEET    10
#define TXT_MAKE     11
#define BOX_MAKE     12
#define TXT_TYPE     13
#define BOX_TYPE     14
#define INF_FORMAT   15
#define GRP_FORMAT   16
#define FT_DBFIELD   17
#define LB_DBFIELD   18
#define BTN_INSERT   19
#define BTN_SYNC     20

#define RB_FROM_AUTO_TEXT       1
#define RB_FROM_EDIT            2
#define LB_AUTO_TEXT            3
#define FT_AUTO_TEXT_GROUP      4
#define LB_AUTO_TEXT_GROUP      5
#define ED_TEXT                 6
#define GB_CONTENT              7
#define WIN_EXAMPLE             8
#define GB_EXAMPLE              9
#define ST_VISCARD_GROUP        10

#define GB_DATA                 30
#define FT_NAME                 31
#define ED_FIRSTNAME            32
#define ED_NAME                 33
#define ED_SHORTCUT             34
#define FT_STREET               35
#define ED_STREET               36
#define FT_ZIPCITY              37
#define ED_ZIP                  38
#define ED_CITY                 39
#define FT_COUNTRYSTATE         40
#define ED_COUNTRY              41
#define FT_TITLEPROF            42
#define ED_PROFESSION           43
#define ED_TITLE                44
#define FT_PHONE                45
#define ED_PHONE                46
#define ED_MOBILE               47
#define FT_FAX                  48
#define ED_FAX                  49
#define FT_WWWMAIL              50
#define ED_WWW                  51
#define ED_MAIL                 52
#define ED_STATE                53
#define FT_COMP                 54
#define ED_COMP                 55
#define FT_COMP_EXT             56
#define ED_COMP_EXT             57
#define FT_SLOGAN               58
#define ED_SLOGAN               59
#define FT_POSITION             60
#define ED_POSITION             61

#define ST_BUSINESSCARDDLG      62
#define ST_FIRSTPAGE_LAB        63
#define ST_FIRSTPAGE_BC         64

#define FT_NAME_2               65
#define ED_FIRSTNAME_2          66
#define ED_NAME_2               67
#define ED_SHORTCUT_2           68

// Globale Resourcen ********************************************************
#define STR_DOC_TITLE           (RC_LABEL_BEGIN)
#define STR_CUSTOM              (RC_LABEL_BEGIN + 1)

// Ueberlaufpruefung ********************************************************

#define LABEL_ACT_END  STR_CUSTOM

#if LABEL_ACT_END > RC_LABEL_END
#error Resource-Ueberlauf in #file, #line
#endif

#endif

diff --git a/sw/source/ui/envelp/label.src b/sw/source/ui/envelp/label.src
new file mode 100644
index 0000000..1e21c90
--- /dev/null
+++ b/sw/source/ui/envelp/label.src
@@ -0,0 +1,1606 @@
/*************************************************************************
 *
 *  $RCSfile: label.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:35 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
 // #pragma ******************************************************************

 // #include *****************************************************************
#include "label.hrc"
#include "globals.hrc"
#include "helpid.h"
// ----- defined strings -----------------------------------------------------
#define LABEL_STRING                                    \
    Text = "Etiketten" ;                                \
    Text [ ENGLISH ] = "Labels" ;                       \
    Text [ norwegian ] = "Etiketter" ;                  \
    Text [ italian ] = "Etichette" ;                    \
    Text [ portuguese_brazilian ] = "Etiquetas" ;       \
    Text [ portuguese ] = "Etiquetas" ;                 \
    Text [ finnish ] = "Tarrat" ;                       \
    Text [ danish ] = "Etiketter" ;                     \
    Text [ french ] = "Étiquettes" ;                    \
    Text [ swedish ] = "Etiketter" ;                    \
    Text [ dutch ] = "Etiketten" ;                      \
    Text [ spanish ] = "Etiquetas" ;                    \
    Text [ english_us ] = "Labels" ;                    \
    Text[ chinese_simplified ] = "±êÇ©";                \
    Text[ russian ] = "Íàêëåéêè";                       \
    Text[ polish ] = "Etykiety";                        \
    Text[ japanese ] = "×ÍÞÙ";                          \
    Text[ chinese_traditional ] = "¼ÐÅÒ";               \
    Text[ arabic ] = "ÈØÇÞÇÊ ÚäæäÉ";                    \
    Text[ greek ] = "ÅôéêÝôåò";                         \
    Text[ korean ] = "¶óº§";    \
    Text[ turkish ] = "Etiket";

 #define BUSINESS_CARD_STRING \
                Text = "Visitenkarten" ;                            \
                Text [ ENGLISH ] = "Business cards" ;               \
                Text[ english_us ] = "Business cards";              \
                Text[ portuguese ] = "Cartões de visita";           \
                Text[ russian ] = "Âèçèòíûå êàðòî÷êè";              \
                Text[ greek ] = "Visiting cards";                   \
                Text[ dutch ] = "Visitekaartjes";                   \
                Text[ french ] = "Cartes de visite";                \
                Text[ spanish ] = "Tarjetas de visita";             \
                Text[ italian ] = "Biglietti da visita";            \
                Text[ danish ] = "Visitkort";                       \
                Text[ swedish ] = "Visitkort";                      \
                Text[ polish ] = "Wizytówki";                       \
                Text[ portuguese_brazilian ] = "Visiting cards";    \
                Text[ japanese ] = "–¼Žh";                          \
                Text[ korean ] = "Visiting cards";                  \
                Text[ chinese_simplified ] = "ÃûƬ";                \
                Text[ chinese_traditional ] = "¦W¤ù";               \
                Text[ arabic ] = "ÈØÇÞÇÊ ÇáÒíÇÑÉ";

 // DLG_LAB ------------------------------------------------------------------
TabDialog DLG_LAB
{
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Moveable = TRUE ;
    LABEL_STRING
    TabControl 1
    {
        OutputSize = TRUE ;
        PageList =
        {
/*          PageItem
            {
                Identifier = TP_LAB_LAB ;
                Text = "Etiketten" ;
                Text [ ENGLISH ] = "Labels" ;
                Text [ norwegian ] = "Etiketter" ;
                Text [ italian ] = "Etichette" ;
                Text [ portuguese_brazilian ] = "Etiquetas" ;
                Text [ portuguese ] = "Etiquetas" ;
                Text [ finnish ] = "Tarrat" ;
                Text [ danish ] = "Etiketter" ;
                Text [ french ] = "Etiquettes" ;
                Text [ swedish ] = "Etiketter" ;
                Text [ dutch ] = "Etiketten" ;
                Text [ spanish ] = "Etiquetas" ;
                Text [ english_us ] = "Labels" ;
                PageResID = TP_LAB_LAB ;
                Text[ chinese_simplified ] = "±êÇ©";
                Text[ russian ] = "Íàêëåéêè";
                Text[ polish ] = "Etykiety";
                Text[ japanese ] = "×ÍÞÙ";
                Text[ chinese_traditional ] = "¼ÐÅÒ";
                Text[ arabic ] = "ÈØÇÞÇÊ ÚäæäÉ";
                Text[ greek ] = "ÅôéêÝôåò";
                Text[ korean ] = "Labels";
            };*/
            PageItem
            {
                Identifier = TP_VISITING_CARDS;
                PageResID = TP_VISITING_CARDS;
                BUSINESS_CARD_STRING
            };
            PageItem
            {
                Identifier = TP_PRIVATE_DATA;
                PageResID = TP_PRIVATE_DATA;
                Text = "Privat" ;
                Text [ ENGLISH ] = "Private" ;
                Text[ english_us ] = "Private";
                Text[ portuguese ] = "Pessoal";
                Text[ russian ] = "Ëè÷íûå";
                Text[ greek ] = "Ïéêßá";
                Text[ dutch ] = "Privé";
                Text[ french ] = "Privé";
                Text[ spanish ] = "Privado";
                Text[ italian ] = "Privato";
                Text[ danish ] = "Privat";
                Text[ swedish ] = "Privat";
                Text[ polish ] = "Prywatne";
                Text[ portuguese_brazilian ] = "Private";
                Text[ japanese ] = "ÌßײÍÞ°Ä";
                Text[ korean ] = "°³ÀÎ";
                Text[ chinese_simplified ] = "˽ÈË";
                Text[ chinese_traditional ] = "¨p¤H";
                Text[ arabic ] = "ÔÎÕí";
                Text[ turkish ] = "Özel";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_BUSINESS_DATA;
                PageResID = TP_BUSINESS_DATA;
                Text = "Geschäft" ;
                Text [ ENGLISH ] = "Business" ;
                Text[ english_us ] = "Business";
                Text[ portuguese ] = "Emprego";
                Text[ russian ] = "Ñëóæåáíûå";
                Text[ greek ] = "Åñãáóßá";
                Text[ dutch ] = "Zaak";
                Text[ french ] = "Bureau";
                Text[ spanish ] = "Trabajo";
                Text[ italian ] = "Lavoro";
                Text[ danish ] = "Arbejdsrelateret";
                Text[ swedish ] = "Affärsmässig";
                Text[ polish ] = "Biznes";
                Text[ portuguese_brazilian ] = "Business";
                Text[ japanese ] = "ŽÐ—p";
                Text[ korean ] = "¾÷¹«";
                Text[ chinese_simplified ] = "ÉÌÎñ";
                Text[ chinese_traditional ] = "°Ó°È";
                Text[ arabic ] = "Úãá";
                Text[ turkish ] = "Ýþ";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_LAB_FMT ;
                Text = "Format" ;
                Text [ ENGLISH ] = "Format" ;
                PageResID = TP_LAB_FMT ;
                Text [ english_us ] = "Format" ;
                Text [ italian ] = "Formato" ;
                Text [ spanish ] = "Formato" ;
                Text [ french ] = "Format" ;
                Text [ dutch ] = "Grootte" ;
                Text [ swedish ] = "Format" ;
                Text [ danish ] = "Format" ;
                Text [ portuguese_brazilian ] = "Format" ;
                Text [ portuguese ] = "Formato" ;
                Text[ chinese_simplified ] = "¸ñʽ";
                Text[ russian ] = "Ôîðìàò";
                Text[ polish ] = "Format";
                Text[ japanese ] = "‘Ž®";
                Text[ chinese_traditional ] = "®æ¦¡";
                Text[ arabic ] = "ÇáÊäÓíÞ";
                Text[ greek ] = "ÌïñöÞ";
                Text[ korean ] = "¼­½Ä";
                Text[ turkish ] = "Format";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_LAB_PRT ;
                Text = "Zusätze" ;
                Text [ ENGLISH ] = "Options" ;
                PageResID = TP_LAB_PRT ;
                Text [ english_us ] = "Options" ;
                Text [ portuguese_brazilian ] = "Drucker" ;
                Text [ swedish ] = "Tillägg" ;
                Text [ danish ] = "Flere" ;
                Text [ italian ] = "Extra" ;
                Text [ spanish ] = "Opciones" ;
                Text [ french ] = "Impression" ;
                Text [ dutch ] = "Overige" ;
                Text [ portuguese ] = "Opções" ;
                Text[ chinese_simplified ] = "ÆäËû";
                Text[ russian ] = "Ïàðàìåòðû";
                Text[ polish ] = "Dodatki";
                Text[ japanese ] = "µÌß¼®Ý";
                Text[ chinese_traditional ] = "¨ä¥L";
                Text[ arabic ] = "ÎíÇÑÇÊ";
                Text[ greek ] = "Ðñüóèåôá";
                Text[ korean ] = "¿É¼Ç";
                Text[ language_user1 ] = " ";
                Text[ turkish ] = "Seçenekler";
            };
        };
    };
    String ST_BUSINESSCARDDLG
    {
        BUSINESS_CARD_STRING
    };
    String ST_FIRSTPAGE_LAB
    {
        LABEL_STRING
    };
    String ST_FIRSTPAGE_BC
    {
        Text = "Medium" ;
        Text [ ENGLISH ] = "Media" ;
        Text[ english_us ] = "Medium";
        Text[ portuguese ] = "Media";
        Text[ russian ] = "Ñðåäñòâî";
        Text[ greek ] = "ÌÝóïí";
        Text[ dutch ] = "Medium";
        Text[ french ] = "Média";
        Text[ spanish ] = "Tipo";
        Text[ italian ] = "Impostazioni";
        Text[ danish ] = "Medium";
        Text[ swedish ] = "Medium";
        Text[ polish ] = "Noœnik danych";
        Text[ portuguese_brazilian ] = "Media";
        Text[ japanese ] = "”}‘Ì";
        Text[ korean ] = "Áß°£";
        Text[ chinese_simplified ] = "Ö½ÕÅ";
        Text[ chinese_traditional ] = "¯È±i";
        Text[ arabic ] = "æÓÇÆØ";
        Text[ language_user1 ] = " ";
        Text[ turkish ] = "Kaðýt";
    };
};
 // TP_LAB_LAB ---------------------------------------------------------------
TabPage TP_LAB_LAB
{
    HelpID = HID_LAB_LAB ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Hide = TRUE ;
    FixedText TXT_WRITING
    {
        Pos = MAP_APPFONT ( 12 , 14 ) ;
        Size = MAP_APPFONT ( 60 , 8 ) ;
        Text = "~Aufschrift" ;
        Text [ English ] = "Writing" ;
        Text [ norwegian ] = "Writing" ;
        Text [ italian ] = "~Testo etichetta" ;
        Text [ portuguese_brazilian ] = "Gravar" ;
        Text [ portuguese ] = "~Inscrição" ;
        Text [ finnish ] = "Otsikko" ;
        Text [ danish ] = "Etikettekst" ;
        Text [ french ] = "~Libellé" ;
        Text [ swedish ] = "~Påskrift" ;
        Text [ dutch ] = "~Tekst" ;
        Text [ spanish ] = "Te~xto" ;
        Text [ english_us ] = "Label text" ;
        Group = TRUE ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "ÊäÈëÎÄ×Ö";
        Text[ russian ] = "Ïîäïèñü";
        Text[ polish ] = "Oznaczenie";
        Text[ japanese ] = "ˆ¶æ";
        Text[ chinese_traditional ] = "¿é¤J¤å¦r";
        Text[ arabic ] = "äÕ ÇáÈØÇÞÉ";
        Text[ greek ] = "ÅðéãñáöÞ";
        Text[ korean ] = "¶óº§ ÅØ½ºÆ®";
        Text[ turkish ] = "Etiket metni";
        Text[ language_user1 ] = " ";
    };
    CheckBox BOX_ADDR
    {
        Pos = MAP_APPFONT ( 82 , 13 ) ;
        Size = MAP_APPFONT ( 40 , 10 ) ;
        Text = "Adre~sse" ;
        Text [ English ] = "Address" ;
        Text [ norwegian ] = "Adresse" ;
        Text [ italian ] = "Indirizzo" ;
        Text [ portuguese_brazilian ] = "Endereço" ;
        Text [ portuguese ] = "Endereço" ;
        Text [ finnish ] = "Valitse osoite" ;
        Text [ danish ] = "Adresse" ;
        Text [ french ] = "Adre~sse" ;
        Text [ swedish ] = "Adre~ss" ;
        Text [ dutch ] = "Adre~s" ;
        Text [ spanish ] = "~Dirección" ;
        Text [ english_us ] = "Address" ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "µØÖ·";
        Text[ russian ] = "Àäðåñ";
        Text[ polish ] = "Adres";
        Text[ japanese ] = "ZŠ";
        Text[ chinese_traditional ] = "¦a§}";
        Text[ arabic ] = "ÇáÚäæÇä";
        Text[ greek ] = "Äéåýèõíóç";
        Text[ korean ] = "ÁÖ¼Ò";
        Text[ turkish ] = "Adres";
        Text[ language_user1 ] = " ";
    };
    MultiLineEdit EDT_WRITING
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 12 , 25 ) ;
        Size = MAP_APPFONT ( 110 , 44 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        HScroll = TRUE ;
        VScroll = TRUE ;
        IgnoreTab = TRUE;
    };
    FixedText FT_DATABASE
    {
        Pos = MAP_APPFONT ( 128 , 14 ) ;
        Size = MAP_APPFONT ( 57 , 10 ) ;
        Text = "~Datenbank" ;
        Text [ English ] = "Database" ;
        Text [ norwegian ] = "Database" ;
        Text [ italian ] = "Database" ;
        Text [ portuguese_brazilian ] = "Base de Dados" ;
        Text [ portuguese ] = "~Base de dados" ;
        Text [ finnish ] = "Tietokanta" ;
        Text [ danish ] = "Database" ;
        Text [ french ] = "~Base de données" ;
        Text [ swedish ] = "~Databas" ;
        Text [ dutch ] = "~Database" ;
        Text [ spanish ] = "Base de datos" ;
        Text [ english_us ] = "Database" ;
        Text[ chinese_simplified ] = "Êý¾Ý¿â";
        Text[ russian ] = "Áàçà äàííûõ";
        Text[ polish ] = "Baza danych";
        Text[ japanese ] = "ÃÞ°ÀÍÞ°½";
        Text[ chinese_traditional ] = "¸ê®Æ®w";
        Text[ arabic ] = "ÞÇÚÏÉ ÇáÈíÇäÇÊ";
        Text[ greek ] = "ÂÜóç ~äåäïìÝíùí";
        Text[ korean ] = "µ¥ÀÌÅͺ£À̽º";
        Text[ turkish ] = "Veritabaný";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_DATABASE
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 128 , 25 ) ;
        Size = MAP_APPFONT ( 57 , 60 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
    };
    FixedText FT_TABLE
    {
        Pos = MAP_APPFONT ( 191 , 14 ) ;
        Size = MAP_APPFONT ( 57 , 10 ) ;
        Text = "Tabe~lle" ;
        Text [ ENGLISH ] = "Table" ;
        Text [ english_us ] = "Table" ;
        Text [ italian ] = "Tabella" ;
        Text [ spanish ] = "Tabla" ;
        Text [ french ] = "Tab~le" ;
        Text [ dutch ] = "~Tabel" ;
        Text [ swedish ] = "Tabe~ll" ;
        Text [ danish ] = "Tabel" ;
        Text [ portuguese_brazilian ] = "Tabelle" ;
        Text [ portuguese ] = "~Tabela" ;
        Text[ chinese_simplified ] = "±í¸ñ";
        Text[ russian ] = "Òàáëèöà";
        Text[ polish ] = "Tabela";
        Text[ japanese ] = "ðÌÞÙ";
        Text[ chinese_traditional ] = "ªí®æ";
        Text[ arabic ] = "ÇáÌÏæá";
        Text[ greek ] = "Ðßíáêáò";
        Text[ korean ] = "ǥ";
        Text[ language_user1 ] = " ";
        Text[ turkish ] = "Tablo";
    };
    ListBox LB_TABLE
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 191 , 25 ) ;
        Size = MAP_APPFONT ( 57 , 60 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
    };
    ImageButton BTN_INSERT
    {
        Pos = MAP_APPFONT ( 128 , 56 ) ;
        Size = MAP_APPFONT ( 18 , 12 ) ;
        SYMBOL = IMAGEBUTTON_ARROW_LEFT ;
        TabStop = TRUE ;
    };
    FixedText FT_DBFIELD
    {
        Pos = MAP_APPFONT ( 152 , 45 ) ;
        Size = MAP_APPFONT ( 57 , 10 ) ;
        Text = "Datenbank~feld" ;
        Text [ English ] = "Database field" ;
        Text [ norwegian ] = "Database field" ;
        Text [ italian ] = "Campo database" ;
        Text [ portuguese_brazilian ] = "Campo base de dados" ;
        Text [ portuguese ] = "Campo base de dados" ;
        Text [ finnish ] = "Tietokantakenttä" ;
        Text [ danish ] = "Databasefelt" ;
        Text [ french ] = "~Champ de B.D." ;
        Text [ swedish ] = "Databas~fält" ;
        Text [ dutch ] = "~Databaseveld" ;
        Text [ spanish ] = "~Campo base de datos" ;
        Text [ english_us ] = "Database Field" ;
        Text[ chinese_simplified ] = "Êý¾Ý¿â×Ö¶Î";
        Text[ russian ] = "Ïîëå áàçû äàííûõ";
        Text[ polish ] = "Pole bazy danych";
        Text[ japanese ] = "ÃÞ°ÀÍÞ°½ ̨°ÙÄÞ";
        Text[ chinese_traditional ] = "¸ê®Æ®wÄæ¦ì";
        Text[ arabic ] = "ÍÞá ÞÇÚÏÉ ÇáÈíÇäÇÊ";
        Text[ greek ] = "Ðåäßï âÜóçò äåäïìÝíùí";
        Text[ korean ] = "µ¥ÀÌÅͺ£À̽º Çʵå";
        Text[ turkish ] = "Veritabaný alaný";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_DBFIELD
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 152 , 56 ) ;
        Size = MAP_APPFONT ( 96 , 60 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
    };
    GroupBox GRP_WRITING
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 248 , 72 ) ;
        Text = "Aufschrift" ;
        Text [ English ] = "Writing" ;
        Text [ norwegian ] = "Writing" ;
        Text [ italian ] = "Testo etichetta" ;
        Text [ portuguese_brazilian ] = "Gravar" ;
        Text [ portuguese ] = "Inscrição" ;
        Text [ finnish ] = "Otsikko" ;
        Text [ danish ] = "Etikettekst" ;
        Text [ french ] = "Libellé" ;
        Text [ swedish ] = "Påskrift" ;
        Text [ dutch ] = "Tekst" ;
        Text [ spanish ] = "Etiqueta" ;
        Text [ english_us ] = "Inscription" ;
        Group = TRUE ;
        Text[ chinese_simplified ] = "ÄÚÈÝ";
        Text[ russian ] = "Ïîäïèñü";
        Text[ polish ] = "Oznaczenie";
        Text[ japanese ] = "ˆ¶æ";
        Text[ language_user1 ] = " ";
        Text[ chinese_traditional ] = "¤º®e";
        Text[ arabic ] = "äÕ ÇáÈØÇÞÉ";
        Text[ greek ] = "ÅðéãñáöÞ";
        Text[ korean ] = "Ç¥Á¦";
        Text[ turkish ] = "Etiket metni";
    };
    RadioButton BTN_CONT
    {
        Pos = MAP_APPFONT ( 12 , 90 ) ;
        Size = MAP_APPFONT ( 43 , 10 ) ;
        Text = "~Endlos" ;
        Text [ English ] = "Continuous" ;
        Text [ norwegian ] = "Continuous" ;
        Text [ italian ] = "~Continuo" ;
        Text [ portuguese_brazilian ] = "~Contínuo" ;
        Text [ portuguese ] = "~Contínuo" ;
        Text [ finnish ] = "Jatkuva" ;
        Text [ danish ] = "Endeløs" ;
        Text [ french ] = "~Continu" ;
        Text [ swedish ] = "~Kontinuerlig" ;
        Text [ dutch ] = "~Eindeloos" ;
        Text [ spanish ] = "Cont~inuo" ;
        Text [ english_us ] = "~Continuous" ;
        TabStop = TRUE ;
        Group = TRUE ;
        Text[ chinese_simplified ] = "Á¬Ðø(~C)";
        Text[ russian ] = "Íåïðåðûâíî";
        Text[ polish ] = "Bez koñca";
        Text[ japanese ] = "˜A‘±(~C)";
        Text[ chinese_traditional ] = "¤£¶¡Â_(~C)";
        Text[ arabic ] = "æÑÞ ÛíÑ ãÊÞØÚ";
        Text[ greek ] = "Óõíå÷Þò";
        Text[ korean ] = "°è¼Ó(~C)";
        Text[ turkish ] = "Sonsuz form";
        Text[ language_user1 ] = " ";
    };
    RadioButton BTN_SHEET
    {
        Pos = MAP_APPFONT ( 12 , 105 ) ;
        Size = MAP_APPFONT ( 43 , 10 ) ;
        Text = "~Bogen" ;
        Text [ English ] = "Sheet" ;
        Text [ norwegian ] = "Sheet" ;
        Text [ italian ] = "Foglio" ;
        Text [ portuguese_brazilian ] = "Folha" ;
        Text [ portuguese ] = "~Folha" ;
        Text [ finnish ] = "Arkki" ;
        Text [ danish ] = "Ark" ;
        Text [ french ] = "~Feuille" ;
        Text [ swedish ] = "~Ark" ;
        Text [ dutch ] = "~Blad" ;
        Text [ spanish ] = "~Hoja" ;
        Text [ english_us ] = "~Sheet" ;
        Text[ chinese_simplified ] = "Ö½ÕÅ(~S)";
        Text[ russian ] = "Îòäåëüíî";
        Text[ polish ] = "Arkusz";
        Text[ japanese ] = "¼°Ä(~S)";
        Text[ chinese_traditional ] = "¯È±i(~S)";
        Text[ arabic ] = "ÝÑÎ æÑÞ";
        Text[ greek ] = "~ÖÜêåëïò";
        Text[ korean ] = "½ÃÆ®(~S)";
        Text[ turkish ] = "Föy";
        Text[ language_user1 ] = " ";
    };
    FixedText TXT_MAKE
    {
        Pos = MAP_APPFONT ( 58 , 91 ) ;
        Size = MAP_APPFONT ( 28 , 8 ) ;
        Text = "~Marke" ;
        Text [ English ] = "Make" ;
        Text [ norwegian ] = "Make" ;
        Text [ italian ] = "Marca" ;
        Text [ portuguese_brazilian ] = "Fazer" ;
        Text [ portuguese ] = "Marca" ;
        Text [ finnish ] = "Merkki" ;
        Text [ danish ] = "Mærke" ;
        Text [ french ] = "~Marque" ;
        Text [ swedish ] = "~Märke" ;
        Text [ dutch ] = "~Merk" ;
        Text [ spanish ] = "~Marca" ;
        Text [ english_us ] = "Brand" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "É̱ê";
        Text[ russian ] = "Ìàðêà";
        Text[ polish ] = "Znacznik";
        Text[ japanese ] = "»‘¢Œ³";
        Text[ language_user1 ] = " ";
        Text[ chinese_traditional ] = "°Ó¼Ð";
        Text[ arabic ] = "ÇáãÇÑßÉ";
        Text[ greek ] = "~ÌÜñêá";
        Text[ korean ] = "»óÇ¥";
        Text[ turkish ] = "Markasý";
    };
    ListBox BOX_MAKE
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 92 , 89 ) ;
        Size = MAP_APPFONT ( 119 , 91 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
    };
    FixedText TXT_TYPE
    {
        Pos = MAP_APPFONT ( 58 , 106 ) ;
        Size = MAP_APPFONT ( 28 , 8 ) ;
        Text = "~Typ" ;
        Text [ English ] = "Type" ;
        Text [ norwegian ] = "Type" ;
        Text [ italian ] = "Tipo" ;
        Text [ portuguese_brazilian ] = "Tipo" ;
        Text [ portuguese ] = "Tipo" ;
        Text [ finnish ] = "Laji" ;
        Text [ danish ] = "Type" ;
        Text [ french ] = "~Type" ;
        Text [ swedish ] = "~Typ" ;
        Text [ dutch ] = "~Type" ;
        Text [ spanish ] = "~Tipo" ;
        Text [ english_us ] = "~Type" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "ÀàÐÍ(~T)";
        Text[ russian ] = "Òèï";
        Text[ polish ] = "Typ";
        Text[ japanese ] = "Ží—Þ(~T)";
        Text[ chinese_traditional ] = "Ãþ«¬(~T)";
        Text[ arabic ] = "ÇáäæÚ";
        Text[ greek ] = "~Ôýðïò";
        Text[ korean ] = "À¯Çü(~T)";
        Text[ turkish ] = "Tipi";
        Text[ language_user1 ] = " ";
    };
    ListBox BOX_TYPE
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 92 , 104 ) ;
        Size = MAP_APPFONT ( 119 , 61 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        Sort = TRUE ;
    };
    FixedText INF_FORMAT
    {
        Pos = MAP_APPFONT ( 12 , 119 ) ;
        Size = MAP_APPFONT ( 199 , 8 ) ;
        Left = TRUE ;
    };
    GroupBox GRP_FORMAT
    {
        Pos = MAP_APPFONT ( 6 , 78 ) ;
        Size = MAP_APPFONT ( 248 , 55 ) ;
        Text = "Format" ;
        Text [ English ] = "Format" ;
        Text [ norwegian ] = "Format" ;
        Text [ italian ] = "Formato" ;
        Text [ portuguese_brazilian ] = "Formato" ;
        Text [ portuguese ] = "Formato" ;
        Text [ finnish ] = "Muotoile" ;
        Text [ danish ] = "Format" ;
        Text [ french ] = "Format" ;
        Text [ swedish ] = "Format" ;
        Text [ dutch ] = "Formaat" ;
        Text [ spanish ] = "Formato" ;
        Text [ english_us ] = "Format" ;
        Text[ chinese_simplified ] = "¸ñʽ";
        Text[ russian ] = "Ôîðìàò";
        Text[ polish ] = "Format";
        Text[ japanese ] = "‘Ž®";
        Text[ chinese_traditional ] = "®æ¦¡";
        Text[ arabic ] = "ÇáÊäÓíÞ";
        Text[ greek ] = "ÌïñöÞ";
        Text[ korean ] = "¼­½Ä";
        Group = TRUE ;
        Text[ turkish ] = "Format";
        Text[ language_user1 ] = " ";
    };
};
#define WIDTH  100
#define HEIGHT 16
FloatingWindow DLG_SYNC_BTN
{
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( WIDTH , HEIGHT ) ;
    Moveable = TRUE ;
    Closeable = FALSE ;
    Sizeable = FALSE ;
    Zoomable = TRUE ;
    HelpID = HID_SYNC_BTN ;
    Hide = TRUE ;
    PushButton BTN_SYNC
    {
        Pos = MAP_APPFONT ( 1 , 1 ) ;
        Size = MAP_APPFONT ( WIDTH - 1 , HEIGHT - 1 ) ;
        Text = "Etiketten synchronisieren" ;
        Text [ ENGLISH ] = "Synchronize labels" ;
        Text [ english_us ] = "Synchronize Labels" ;
        Text [ portuguese_brazilian ] = "Etiketten synchronisieren" ;
        Text [ swedish ] = "Synkronisera etiketter" ;
        Text [ danish ] = "Synkroniser etiketter" ;
        Text [ italian ] = "Sincronizza etichette" ;
        Text [ spanish ] = "Sincronizar etiquetas" ;
        Text [ french ] = "Synchroniser les étiquettes" ;
        Text [ dutch ] = "Etiketten synchroniseren" ;
        Text [ portuguese ] = "Sincronizar etiquetas" ;
        Text[ chinese_simplified ] = "±êǩͬ²½»¯";
        Text[ russian ] = "Ñèíõðîíèçèðîâàòü íàêëåéêè";
        Text[ polish ] = "Synchronizuj etykiety";
        Text[ japanese ] = "×ÍÞق𓯊ú‚·‚é";
        Text[ chinese_traditional ] = "¶K¼Ð¦P¨B¤Æ";
        Text[ arabic ] = "ÊÒÇãä ÈØÇÞÇÊ ÇáÚäæäÉ";
        Text[ greek ] = "Óõã÷ñïíéóìüò åôéêåôþí";
        Text[ korean ] = "¶óº§ µ¿±âÈ­";
        Text[ turkish ] = "Etiket içeriðini çoðalt";
        Text[ language_user1 ] = " ";
    };
};
 // String *******************************************************************
String STR_DOC_TITLE
{
    Text = "Etiketten" ;
    Text [ English ] = "Labels" ;
    Text [ norwegian ] = "Etiketter" ;
    Text [ italian ] = "Busta" ;
    Text [ portuguese_brazilian ] = "Etiquetas" ;
    Text [ portuguese ] = "Etiquetas" ;
    Text [ finnish ] = "Tarrat" ;
    Text [ danish ] = "Etiketter" ;
    Text [ french ] = "Étiquettes" ;
    Text [ swedish ] = "Etiketter" ;
    Text [ dutch ] = "Etiketten" ;
    Text [ spanish ] = "Etiquetas" ;
    Text [ english_us ] = "Labels" ;
    Text[ chinese_simplified ] = "±êÇ©";
    Text[ russian ] = "Íàêëåéêè";
    Text[ polish ] = "Etykiety";
    Text[ japanese ] = "×ÍÞÙ";
    Text[ chinese_traditional ] = "¶K¼Ð";
    Text[ arabic ] = "ÈØÇÞÇÊ ÚäæäÉ";
    Text[ greek ] = "ÅôéêÝôåò";
    Text[ korean ] = "¶óº§";
    Text[ turkish ] = "Etiket";
    Text[ language_user1 ] = " ";
};
String STR_CUSTOM
{
    Text = "[Benutzer]" ;
    Text [ English ] = "[Custom]" ;
    Text [ norwegian ] = "[Custom]" ;
    Text [ italian ] = "[Utente]" ;
    Text [ portuguese_brazilian ] = "[Pessoal]" ;
    Text [ portuguese ] = "[Utilizador]" ;
    Text [ finnish ] = "[Oma]" ;
    Text [ danish ] = "[Bruger]" ;
    Text [ french ] = "[Personnalisé]" ;
    Text [ swedish ] = "[Användare]" ;
    Text [ dutch ] = "[Gebruiker] " ;
    Text [ spanish ] = "[Usuario]" ;
    Text [ english_us ] = "[User-defined]" ;
    Text[ chinese_simplified ] = "[ʹÓÃÕß]";
    Text[ russian ] = "[Ïîëüçîâàòåëü]";
    Text[ polish ] = "[U¿ytkownik]";
    Text[ japanese ] = "[Õ°»Þ°]";
    Text[ greek ] = "[×ñÞóôçò]";
    Text[ korean ] = "[»ç¿ëÀÚ]";
    Text[ chinese_traditional ] = "[¨Ï¥ÎªÌ]";
    Text[ arabic ] = "[ãÓÊÎÏã]";
    Text[ turkish ] = "[Kullanýcý tanýmlý]";
};
/********************************************************************/
TabPage TP_VISITING_CARDS
{
    HelpID = HID_TP_VISITING_CARDS ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Hide = TRUE ;

    Control LB_AUTO_TEXT
    {
        Pos = MAP_APPFONT ( 12 , 12 ) ;
        Size = MAP_APPFONT ( 109 , 83 ) ;
        Border = TRUE ;
        TabStop = TRUE ;
    };
    FixedText FT_AUTO_TEXT_GROUP
    {
        Pos = MAP_APPFONT ( 12 ,  98) ;
        Size = MAP_APPFONT ( 100 , 10 ) ;
        Text = "AutoText - ~Bereich" ;
        Text [ English ] = "AutoText group" ;
        Text[ english_us ] = "AutoText - Section";
        Text[ portuguese ] = "AutoTexto - ~secção";
        Text[ russian ] = "Îáëàñòü àâòîòåêñòà";
        Text[ greek ] = "Ðåñéï÷Þ ÁõôïÊåéìÝíïõ";
        Text[ dutch ] = "AutoTekst - ~bereik";
        Text[ french ] = "AutoTexte - ~Section";
        Text[ spanish ] = "Área AutoT~exto";
        Text[ italian ] = "Testo automatico - Sezione";
        Text[ danish ] = "AutoTekst - område";
        Text[ swedish ] = "AutoText - område";
        Text[ polish ] = "Obszar Autotekstu";
        Text[ portuguese_brazilian ] = "AutoText group";
        Text[ japanese ] = "“ü—ÍŽx‰‡ ”͈Í(~S)";
        Text[ korean ] = "ÀÚµ¿ ÅØ½ºÆ® - ±¸¿ª(~S)";
        Text[ chinese_simplified ] = "×Ô¶¯Í¼ÎÖÀà(~S)";
        Text[ chinese_traditional ] = "¦Û°Ê¹Ï¤å¶°¤ÀÃþ(~S)";
        Text[ arabic ] = "äØÇÞ ÇáäÕ ÇáÊáÞÇÆí";
        Text[ turkish ] = "Otomatik metin - alaný";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_AUTO_TEXT_GROUP
    {
        Pos = MAP_APPFONT ( 12 , 111) ;
        Size = MAP_APPFONT ( 109 , 40 ) ;
        Border = TRUE ;
        TabStop = TRUE ;
        DropDown = TRUE ;
    };
    GroupBox GB_CONTENT
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 121 , 129 ) ;
        Text = "Inhalt" ;
        Text [ English ] = "Content" ;
        Text[ english_us ] = "Content";
        Text[ portuguese ] = "Conteúdo";
        Text[ russian ] = "Ñîäåðæèìîå";
        Text[ greek ] = "Ðåñéå÷üìåíá";
        Text[ dutch ] = "Inhoud";
        Text[ french ] = "Contenu";
        Text[ spanish ] = "Contenido";
        Text[ italian ] = "Contenuto";
        Text[ danish ] = "Indhold";
        Text[ swedish ] = "Innehåll";
        Text[ polish ] = "ZawartoϾ";
        Text[ portuguese_brazilian ] = "Content";
        Text[ japanese ] = "“à—e";
        Text[ korean ] = "³»¿ë";
        Text[ chinese_simplified ] = "ÄÚÈÝ";
        Text[ chinese_traditional ] = "¤º®e";
        Text[ arabic ] = "ÇáãÍÊæíÇÊ";
        Text[ turkish ] = "Ýçerik";
        Text[ language_user1 ] = " ";
    };
    Window WIN_EXAMPLE
    {
        Pos = MAP_APPFONT ( 136, 12 ) ;
        Size = MAP_APPFONT ( 115 , 117 ) ;
    };
    GroupBox GB_EXAMPLE
    {
        Pos = MAP_APPFONT ( 133 , 3 ) ;
        Size = MAP_APPFONT ( 121 , 129 ) ;
        Text = "Vorschau" ;
        Text [ English ] = "Preview" ;
        Text[ english_us ] = "Preview";
        Text[ portuguese ] = "Previsualizar";
        Text[ russian ] = "Ïðîñìîòð";
        Text[ greek ] = "Ðñïåðéóêüðçóç";
        Text[ dutch ] = "Voorbeeld";
        Text[ french ] = "Aperçu";
        Text[ spanish ] = "Previsualización";
        Text[ italian ] = "Anteprima";
        Text[ danish ] = "Eksempel";
        Text[ swedish ] = "Förhandsvisning";
        Text[ polish ] = "Podgl¹d";
        Text[ portuguese_brazilian ] = "Preview";
        Text[ japanese ] = "ÌßÚËÞ­°";
        Text[ korean ] = "¹Ì¸®º¸±â";
        Text[ chinese_simplified ] = "Ô¤ÊÓ";
        Text[ chinese_traditional ] = "¹wÄý";
        Text[ arabic ] = "ÇáãÚÇíäÉ";
        Text[ turkish ] = "Önizleme";
    };
    String ST_VISCARD_GROUP
    {
       Text = "Cards";
    };
};
TabPage TP_PRIVATE_DATA
{
    HelpID = HID_TP_PRIVATE_DATA  ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Hide = TRUE ;
    GroupBox GB_DATA
    {
        Pos = MAP_APPFONT ( 6 , 2 ) ;
        Size = MAP_APPFONT ( 248 , 130 ) ;
        Text = "Private Daten" ;
        Text [ English ] = "Private data" ;
        Text[ english_us ] = "Private data";
        Text[ portuguese ] = "Dados pessoais";
        Text[ russian ] = "Ëè÷íûå äàííûå";
        Text[ greek ] = "ÐñïóùðéêÜ óôïé÷åßá";
        Text[ dutch ] = "Privégegevens";
        Text[ french ] = "Coordonnées privées";
        Text[ spanish ] = "Datos privados";
        Text[ italian ] = "Dati privati";
        Text[ danish ] = "Private data";
        Text[ swedish ] = "Privata data";
        Text[ polish ] = "Dane prywatne";
        Text[ portuguese_brazilian ] = "Private data";
        Text[ japanese ] = "ÌßײÍÞ°ÄÃÞ°À";
        Text[ korean ] = "°³ÀÎ µ¥ÀÌÅÍ";
        Text[ chinese_simplified ] = "˽ÈË×ÊÁÏ";
        Text[ chinese_traditional ] = "¨p¤H¼ÆÕu";
        Text[ arabic ] = "ÈíÇäÇÊ ÔÎÕíÉ";
        Text[ turkish ] = "Özel bilgiler";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_NAME
    {
        Pos = MAP_APPFONT ( 12 ,  13) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "~Vor-/Name/Kürzel" ;
        Text [ English ] = "First/Last ~name" ;
        Text[ english_us ] = "First/Last ~name/Initials";
        Text[ portuguese ] = "~Nome próprio/Apelido/Iniciais";
        Text[ russian ] = "Ôàìèëèÿ/èìÿ/èíèöèàëû";
        Text[ greek ] = "¼íïìá/Åðþíõìï/Áñ÷éêÜ";
        Text[ dutch ] = "~Voor-/achternaam/Initialen";
        Text[ french ] = "~Prénom/Nom/Initiales";
        Text[ spanish ] = "No~mbre/Apellidos/Iniciales";
        Text[ italian ] = "Nome/Cognome/Iniziali";
        Text[ danish ] = "For-/Efternavn/Initialer";
        Text[ swedish ] = "~För-/efternamn/initialer";
        Text[ polish ] = "Imiê/Nazwisko/Inicja³y";
        Text[ portuguese_brazilian ] = "First/Last ~name";
        Text[ japanese ] = "–¼/©/²Æ¼¬Ù(~N)";
        Text[ korean ] = "À̸§/¼º/ÀÌ´Ï¼È 2(~N)";
        Text[ chinese_simplified ] = "Ãû×Ö/ÐÕÊÏ/Ëõд(~N)";
        Text[ chinese_traditional ] = "¦W¦r/©m¤ó/ÁY¼g(~N)";
        Text[ arabic ] = "ÇáÇÓã/ÇÓã ÇáÚÇÆáÉ/ÇáÇÎÊÕÇÑ";
        Text[ turkish ] = "Ad/Soyad/Baþharfler";
        Text[ language_user1 ] = " ";
    };
    Edit ED_FIRSTNAME
    {
        Pos = MAP_APPFONT ( 105 , 12 ) ;
        Size = MAP_APPFONT ( 55 , 12 ) ;
        Border = TRUE ;
    };
    Edit ED_NAME
    {
        Pos = MAP_APPFONT ( 163 , 12 ) ;
        Size = MAP_APPFONT ( 55 , 12 ) ;
        Border = TRUE ;
    };
    Edit ED_SHORTCUT
    {
        Pos = MAP_APPFONT ( 221 , 12 ) ;
        Size = MAP_APPFONT ( 30 , 12 ) ;
        Border = TRUE ;
    };
    FixedText FT_NAME_2
    {
        Pos = MAP_APPFONT ( 12 ,  26) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "~Vor-/Name/Kürzel 2" ;
        Text [ English ] = "First/Last ~name 2" ;
        Text[ english_us ] = "First / Last ~Name / Initials 2";
        Text[ portuguese ] = "~Nome próprio/Apelido/Iniciais 2";
        Text[ russian ] = "Ôàìèëèÿ/èìÿ/ñîêðàùåíèå 2";
        Text[ greek ] = "¼íïìá/Åðßèåôï/Áñ÷éêÜ 2";
        Text[ dutch ] = "Voor/achter ~naam 2";
        Text[ french ] = "~Prénom/Nom/Initiales 2";
        Text[ spanish ] = "Nombre/Apellidos/Iniciales 2";
        Text[ italian ] = "Nome/Cognome/Iniziali 2";
        Text[ danish ] = "For-/Efternavn/Initialer 2";
        Text[ swedish ] = "För-/efter~namn/initialer 2";
        Text[ polish ] = "Imiê/Nazwisko/Inicja³y";
        Text[ portuguese_brazilian ] = "First/Last ~name 2";
        Text[ japanese ] = "©/–¼/²Æ¼¬Ù 2i~Nj";
        Text[ korean ] = "À̸§/¼º/ÀÌ´Ï¼È 2(~N)";
        Text[ chinese_simplified ] = "Ãû×Ö/ÐÕÊÏ/Ëõд 2";
        Text[ chinese_traditional ] = "¦W¦r/©m¤ó/ÁY¼g 2";
        Text[ arabic ] = "ÇáÇÓã/ÇÓã ÇáÚÇÆáÉ/ÇáÇÎÊÕÇÑ 2";
        Text[ turkish ] = "Ad/Soyad/Baþharfler 2";
    };
    Edit ED_FIRSTNAME_2
    {
        Pos = MAP_APPFONT ( 105 , 25 ) ;
        Size = MAP_APPFONT ( 55 , 12 ) ;
        Border = TRUE ;
    };
    Edit ED_NAME_2
    {
        Pos = MAP_APPFONT ( 163 , 25 ) ;
        Size = MAP_APPFONT ( 55 , 12 ) ;
        Border = TRUE ;
    };
    Edit ED_SHORTCUT_2
    {
        Pos = MAP_APPFONT ( 221 , 25 ) ;
        Size = MAP_APPFONT ( 30 , 12 ) ;
        Border = TRUE ;
    };
    FixedText FT_STREET
    {
        Pos = MAP_APPFONT ( 12 ,  39) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "~Straße" ;
        Text [ English ] = "Street" ;
        Text[ english_us ] = "S~treet";
        Text[ portuguese ] = "~Rua";
        Text[ russian ] = "Óëèöà";
        Text[ greek ] = "Ïäüò";
        Text[ dutch ] = "~Straat";
        Text[ french ] = "~Rue";
        Text[ spanish ] = "~Calle";
        Text[ italian ] = "Via";
        Text[ danish ] = "Gade";
        Text[ swedish ] = "Gatuadres~s";
        Text[ polish ] = "Ulica";
        Text[ portuguese_brazilian ] = "Street";
        Text[ japanese ] = "’¬–¼(~T)";
        Text[ korean ] = "ÁÖ¼Ò¹øÁö(~T)";
        Text[ chinese_simplified ] = "½ÖµÀ(~T)";
        Text[ chinese_traditional ] = "µó¹D(~T)";
        Text[ arabic ] = "ÇáÔÇÑÚ";
        Text[ turkish ] = "Sokak";
        Text[ language_user1 ] = " ";
    };
    Edit ED_STREET
    {
        Pos = MAP_APPFONT ( 105 , 38 ) ;
        Size = MAP_APPFONT ( 146 , 12 ) ;
        Border = TRUE ;
    };
    FixedText FT_ZIPCITY
    {
        Pos = MAP_APPFONT ( 12 ,  52) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "PLZ/Or~t" ;
        Text [ English ] = "Zip/City" ;
        Text[ english_us ] = "Zip/Cit~y";
        Text[ portuguese ] = "CP/~Localidade";
        Text[ russian ] = "Ïî÷ò.èíäåêñ/ãîðîä";
        Text[ greek ] = "Ô.Ê./Ðüëç";
        Text[ dutch ] = "~Postcode/Plaats";
        Text[ french ] = "C.P./~Ville";
        Text[ spanish ] = "CP/Ciuda~d";
        Text[ italian ] = "C.A.P./Località";
        Text[ danish ] = "Postnr./By";
        Text[ swedish ] = "~Postnr/Ort";
        Text[ polish ] = "Kod pocztowy/MiejscowoϾ";
        Text[ portuguese_brazilian ] = "Zip/City";
        Text[ japanese ] = "—X•֔ԍ†/“s“¹•{Œ§–¼(~Y)";
        Text[ korean ] = "¿ìÆí¹øÈ£/µµ½Ã(~Y)";
        Text[ chinese_simplified ] = "Óʱà/³ÇÊÐ(~Y)";
        Text[ chinese_traditional ] = "¶l»¼°Ï¸¹/«°¥«(~Y)";
        Text[ arabic ] = "ÇáÑãÒ ÇáÈÑíÏí/ÇáãÏíäÉ";
        Text[ turkish ] = "Posta kodu/Þehir";
        Text[ language_user1 ] = " ";
    };
    Edit ED_ZIP
    {
        Pos = MAP_APPFONT ( 105 , 51 ) ;
        Size = MAP_APPFONT ( 50 , 12 ) ;
        Border = TRUE ;
    };
    Edit ED_CITY
    {
        Pos = MAP_APPFONT ( 158 , 51 ) ;
        Size = MAP_APPFONT ( 93 , 12 ) ;
        Border = TRUE ;
    };
    FixedText FT_COUNTRYSTATE
    {
        Pos = MAP_APPFONT ( 12 ,  65) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "~Land/Bundesland" ;
        Text [ English ] = "Country/State" ;
        Text[ english_us ] = "Co~untry/State";
        Text[ portuguese ] = "~País";
        Text[ russian ] = "Ñòðàíà/îáëàñòü";
        Text[ greek ] = "×þñá";
        Text[ dutch ] = "~Land";
        Text[ french ] = "~Pays/État (US)";
        Text[ spanish ] = "~País/Provincia";
        Text[ italian ] = "Provincia/Paese";
        Text[ danish ] = "Land";
        Text[ swedish ] = "~Land/Delstat";
        Text[ polish ] = "Kraj/Województwo";
        Text[ portuguese_brazilian ] = "Country/State";
        Text[ japanese ] = "‘–¼/“s“¹•{Œ§–¼(~U)";
        Text[ korean ] = "±¹°¡/ÁÖ(~U)";
        Text[ chinese_simplified ] = "¹ú¼Ò/Ê¡ÊÐ(~U)";
        Text[ chinese_traditional ] = "°ê®a/¬Ù(~U)";
        Text[ arabic ] = "ÇáÏæáÉ/ÇáæáÇíÉ";
        Text[ turkish ] = "Ülke/Ýl";
        Text[ language_user1 ] = " ";
    };
    Edit ED_COUNTRY
    {
        Pos = MAP_APPFONT ( 105 , 64 ) ;
        Size = MAP_APPFONT ( 71 , 12 ) ;
        Border = TRUE ;
    };
    Edit ED_STATE
    {
        Pos = MAP_APPFONT ( 179 , 64 ) ;
        Size = MAP_APPFONT ( 72 , 12 ) ;
        Border = TRUE ;
    };
    FixedText FT_TITLEPROF
    {
        Pos = MAP_APPFONT ( 12 ,  78) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "~Titel/Beruf" ;
        Text [ English ] = "Title/Profession" ;
        Text[ english_us ] = "Title/~Profession";
        Text[ portuguese ] = "~Título/Profissão";
        Text[ russian ] = "Òèòóë/ïðîôåññèÿ";
        Text[ greek ] = "~Ôßôëïò/ÅðÜããåëìá";
        Text[ dutch ] = "Titel/Beroep";
        Text[ french ] = "~Titre/Profession";
        Text[ spanish ] = "Título/Pro~fesión";
        Text[ italian ] = "Titolo/Professione";
        Text[ danish ] = "Titel/Stilling";
        Text[ swedish ] = "~Titel/Yrke";
        Text[ polish ] = "Tytu³/Zawód";
        Text[ portuguese_brazilian ] = "Title/Profession";
        Text[ japanese ] = "Œ¨‘‚«/E‹Æ(~P)";
        Text[ korean ] = "Á÷À§/Àü¹®ºÐ¾ß(~P)";
        Text[ chinese_simplified ] = "Í·ÏÎ/Ö°Òµ(~P)";
        Text[ chinese_traditional ] = "ºÙ©I/¾·~";
        Text[ arabic ] = "ÇááÞÈ Çáãåäí/ÇáæÙíÝÉ";
        Text[ turkish ] = "Unvan/Meslek";
        Text[ language_user1 ] = " ";
    };
    Edit ED_TITLE
    {
        Pos = MAP_APPFONT ( 105 , 77 ) ;
        Size = MAP_APPFONT ( 71 , 12 ) ;
        Border = TRUE ;
    };
    Edit ED_PROFESSION
    {
        Pos = MAP_APPFONT ( 179 , 77 ) ;
        Size = MAP_APPFONT ( 72 , 12 ) ;
        Border = TRUE ;
    };
    FixedText FT_PHONE
    {
        Pos = MAP_APPFONT ( 12 ,  91) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "Telef~on/Mobil" ;
        Text [ English ] = "Phone/mobile" ;
        Text[ english_us ] = "Phone/cellphone";
        Text[ portuguese ] = "Telefone/Tele~móvel";
        Text[ russian ] = "Òåëåôîí/ìîáèëüíûé";
        Text[ greek ] = "ÔçëÝöùíï/Êéíçôü";
        Text[ dutch ] = "Tele~foon/mobile";
        Text[ french ] = "~Tel/Portable";
        Text[ spanish ] = "T~eléfono/Móvil";
        Text[ italian ] = "Tel./Cell.";
        Text[ danish ] = "Telefon/Mobil";
        Text[ swedish ] = "Telef~on/Mobil";
        Text[ polish ] = "Telefon/Komórka";
        Text[ portuguese_brazilian ] = "Phone/mobile";
        Text[ japanese ] = "“d˜b/Œg‘Ñ“d˜b";
        Text[ korean ] = "ÀüÈ­/ ÇÚµåÆù";
        Text[ chinese_simplified ] = "µç»°/ÊÖ»ú";
        Text[ chinese_traditional ] = "¹q¸Ü/²¾°Ê¹q¸Ü";
        Text[ arabic ] = "ÇáåÇÊÝ/ÇáãÍãæá";
        Text[ turkish ] = "Telef~on/Cep telefonu";
        Text[ language_user1 ] = " ";
    };
    Edit ED_PHONE
    {
        Pos = MAP_APPFONT ( 105 , 90 ) ;
        Size = MAP_APPFONT ( 71 , 12 ) ;
        Border = TRUE ;
    };
    Edit ED_MOBILE
    {
        Pos = MAP_APPFONT ( 179 , 90 ) ;
        Size = MAP_APPFONT ( 72 , 12 ) ;
        Border = TRUE ;
    };
    FixedText FT_FAX
    {
        Pos = MAP_APPFONT ( 12 ,  104) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "Fa~x" ;
        Text [ English ] = "Fax" ;
        Text[ english_us ] = "Fa~x";
        Text[ portuguese ] = "Fa~x";
        Text[ russian ] = "Ôàêñ";
        Text[ greek ] = "Fax";
        Text[ dutch ] = "Fa~x";
        Text[ french ] = "~Fax";
        Text[ spanish ] = "Fa~x";
        Text[ italian ] = "Fa~x";
        Text[ danish ] = "Fax";
        Text[ swedish ] = "Fa~x";
        Text[ polish ] = "Faks";
        Text[ portuguese_brazilian ] = "Fax";
        Text[ japanese ] = "Fa~x";
        Text[ korean ] = "ÆÑ½º(~X)";
        Text[ chinese_simplified ] = "´«Õæ(~X)";
        Text[ chinese_traditional ] = "¶Ç¯u(~X)";
        Text[ arabic ] = "ÇáÝÇßÓ";
        Text[ turkish ] = "Faks";
        Text[ language_user1 ] = " ";
    };
    Edit ED_FAX
    {
        Pos = MAP_APPFONT ( 105 , 103 ) ;
        Size = MAP_APPFONT ( 146 , 12 ) ;
        Border = TRUE ;
    };
    FixedText FT_WWWMAIL
    {
        Pos = MAP_APPFONT ( 12 ,  117) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "Homepage / E-Mail" ;
        Text [ English ] = "Homepage / eMail" ;
        Text[ english_us ] = "Homepage / e-mail";
        Text[ portuguese ] = "Homepage / e-mail";
        Text[ russian ] = "Äîì.ñòðàíèöà / ýë.ïî÷òà";
        Text[ greek ] = "ÊåíôñéêÞ óåëßäá / E-Mail";
        Text[ dutch ] = "Homepage / e-mail";
        Text[ french ] = "Homepage / E-mail";
        Text[ spanish ] = "Página principal / e-mail";
        Text[ italian ] = "Homepage/eMail";
        Text[ danish ] = "Hjemmeside/E-mail";
        Text[ swedish ] = "Hemsida / e-post";
        Text[ polish ] = "Strona macierzysta/e-mail";
        Text[ portuguese_brazilian ] = "Homepage / eMail";
        Text[ japanese ] = "ΰÑÍß°¼Þ/E-mail";
        Text[ korean ] = "ȨÆäÀÌÁö / ÀüÀÚ¿ìÆí";
        Text[ chinese_simplified ] = "Ö÷Ò³/µç×ÓÓʼþ";
        Text[ chinese_traditional ] = "­º­¶/¹q¤l¶l¥ó";
        Text[ arabic ] = "ãæÞÚ ÇáÅäÊÑäÊ / ÇáÈÑíÏ ÇáÅáßÊÑæäí";
        Text[ turkish ] = "Web sayfasý / E-posta";
        Text[ language_user1 ] = " ";
    };
    Edit ED_WWW
    {
        Pos = MAP_APPFONT ( 105 , 116) ;
        Size = MAP_APPFONT ( 71 , 12 ) ;
        Border = TRUE ;
    };
    Edit ED_MAIL
    {
        Pos = MAP_APPFONT ( 179 , 116) ;
        Size = MAP_APPFONT ( 72 , 12 ) ;
        Border = TRUE ;
    };
};
TabPage TP_BUSINESS_DATA
{
    HelpID = HID_TP_BUSINESS_DATA;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Hide = TRUE ;
    GroupBox GB_DATA
    {
        Pos = MAP_APPFONT ( 6 , 2 ) ;
        Size = MAP_APPFONT ( 248 , 130 ) ;
        Text = "Geschäftliche Daten" ;
        Text [ English ] = "Business data" ;
        Text[ english_us ] = "Business data";
        Text[ portuguese ] = "Dados do emprego";
        Text[ russian ] = "Ñëóæåáíûå äàííûå";
        Text[ greek ] = "ÅðáããåëìáôéêÜ óôïé÷åßá";
        Text[ dutch ] = "Zakelijke gegevens";
        Text[ french ] = "Coordonnées du bureau";
        Text[ spanish ] = "Datos del trabajo";
        Text[ italian ] = "Dati lavoro";
        Text[ danish ] = "Forretningsdata";
        Text[ swedish ] = "Affärsdata";
        Text[ polish ] = "Dane s³u¿bowe";
        Text[ portuguese_brazilian ] = "Business data";
        Text[ japanese ] = "ŽÐ—pÃÞ°À";
        Text[ korean ] = "¾÷¹« µ¥ÀÌÅÍ";
        Text[ chinese_simplified ] = "ÉÌÎñ×ÊÁÏ";
        Text[ chinese_traditional ] = "°Ó°È¼ÆÕu";
        Text[ arabic ] = "ÈíÇäÇÊ ÇáÚãá";
        Text[ turkish ] = "Ýþ Bilgileri";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_COMP
    {
        Pos = MAP_APPFONT ( 12 ,  13) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "~Firma" ;
        Text [ English ] = "Company" ;
        Text[ english_us ] = "Company";
        Text[ portuguese ] = "~Firma";
        Text[ russian ] = "Ïðåäïðèÿòèå";
        Text[ greek ] = "Å~ôáéñßá";
        Text[ dutch ] = "~Firma";
        Text[ french ] = "~Société";
        Text[ spanish ] = "E~mpresa";
        Text[ italian ] = "Ditta";
        Text[ danish ] = "Firma";
        Text[ swedish ] = "~Företag";
        Text[ polish ] = "Firma";
        Text[ portuguese_brazilian ] = "Company";
        Text[ japanese ] = "‰ïŽÐ–¼";
        Text[ korean ] = "ȸ»ç";
        Text[ chinese_simplified ] = "¹«Ë¾";
        Text[ chinese_traditional ] = "¤½¥q";
        Text[ arabic ] = "ÇáÔÑßÉ";
        Text[ turkish ] = "~Þirket adý";
        Text[ language_user1 ] = " ";
    };
    Edit ED_COMP
    {
        Pos = MAP_APPFONT ( 105 , 12) ;
        Size = MAP_APPFONT ( 146 , 12 ) ;
        Border = TRUE ;
    };
    FixedText FT_COMP_EXT
    {
        Pos = MAP_APPFONT ( 12 ,  26) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "Firma ~2. Zeile" ;
        Text [ English ] = "Company 2nd line" ;
        Text[ english_us ] = "Company 2nd line";
        Text[ portuguese ] = "Firma: ~2ª linha";
        Text[ russian ] = "Ïðåäïðèÿòèå 2-ÿ ñòðîêà";
        Text[ greek ] = "Åôáéñßá 2ç ãñáììÞ";
        Text[ dutch ] = "Firma ~2e regel";
        Text[ french ] = "Société : ~2e ligne";
        Text[ spanish ] = "Empresa ~2da línea";
        Text[ italian ] = "Ditta (2ª riga)";
        Text[ danish ] = "Firma 2. linje";
        Text[ swedish ] = "Företag rad ~2";
        Text[ polish ] = "Firma 2 wiersz";
        Text[ portuguese_brazilian ] = "Company 2nd line";
        Text[ japanese ] = "‰ïŽÐ–¼ 2s–Ú";
        Text[ korean ] = "ȸ»ç 2¹øÂ° ¼±";
        Text[ chinese_simplified ] = "¹«Ë¾(µÚ¶þÐÐ)";
        Text[ chinese_traditional ] = "¤½¥q(²Ä¤G¦æ)";
        Text[ arabic ] = "ÇáÔÑßÉ ÇáÓØÑ ÇáËÇäí";
        Text[ turkish ] = "Þirket adý ( 2'nci satýr)";
        Text[ language_user1 ] = " ";
    };
    Edit ED_COMP_EXT
    {
        Pos = MAP_APPFONT ( 105 , 25) ;
        Size = MAP_APPFONT ( 146 , 12 ) ;
        Border = TRUE ;
    };
    FixedText FT_SLOGAN
    {
        Pos = MAP_APPFONT ( 12 ,  39) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "Sl~ogan" ;
        Text [ English ] = "Slogan" ;
        Text[ english_us ] = "Slogan";
        Text[ portuguese ] = "~Slogan";
        Text[ russian ] = "Äåâèç";
        Text[ greek ] = "Óëüãêáí";
        Text[ dutch ] = "Sl~ogan";
        Text[ french ] = "~Devise";
        Text[ spanish ] = "Esl~ogan";
        Text[ italian ] = "Sl~ogan";
        Text[ danish ] = "Slogan";
        Text[ swedish ] = "Sl~ogan";
        Text[ polish ] = "Slogan";
        Text[ portuguese_brazilian ] = "Slogan";
        Text[ japanese ] = "½Û°¶ÞÝ";
        Text[ korean ] = "½½·Î°Ç";
        Text[ chinese_simplified ] = "¹ã¸æÓÃÓï";
        Text[ chinese_traditional ] = "¦W¨¥";
        Text[ arabic ] = "ÇáÔÚÇÑ";
        Text[ turkish ] = "Slogan";
        Text[ language_user1 ] = " ";
    };
    Edit ED_SLOGAN
    {
        Pos = MAP_APPFONT ( 105 , 38) ;
        Size = MAP_APPFONT ( 146 , 12 ) ;
        Border = TRUE ;
    };
    FixedText FT_STREET
    {
        Pos = MAP_APPFONT ( 12 ,  52) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "~Straße" ;
        Text [ English ] = "Street" ;
        Text[ english_us ] = "Street";
        Text[ portuguese ] = "~Rua";
        Text[ russian ] = "Óëèöà";
        Text[ greek ] = "Ïäüò";
        Text[ dutch ] = "~Straat";
        Text[ french ] = "~Rue";
        Text[ spanish ] = "~Calle";
        Text[ italian ] = "Via";
        Text[ danish ] = "Gade";
        Text[ swedish ] = "Besöksadre~ss";
        Text[ polish ] = "Ulica";
        Text[ portuguese_brazilian ] = "Street";
        Text[ japanese ] = "’¬–¼";
        Text[ korean ] = "ÁÖ¼Ò¹øÁö";
        Text[ chinese_simplified ] = "½ÖµÀ";
        Text[ chinese_traditional ] = "µó¹D";
        Text[ arabic ] = "ÇáÔÇÑÚ";
        Text[ turkish ] = "Sokak";
        Text[ language_user1 ] = " ";
    };
    Edit ED_STREET
    {
        Pos = MAP_APPFONT ( 105 , 51) ;
        Size = MAP_APPFONT ( 146 , 12 ) ;
        Border = TRUE ;
    };
    FixedText FT_ZIPCITY
    {
        Pos = MAP_APPFONT ( 12 ,  65) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "PLZ/Or~t" ;
        Text [ English ] = "ZIP/City" ;
        Text[ english_us ] = "ZIP/City";
        Text[ portuguese ] = "CP/~Localidade";
        Text[ russian ] = "Ïî÷ò.èíäåêñ/ãîðîä";
        Text[ greek ] = "Ô.Ê./Ðüëç";
        Text[ dutch ] = "Pos~tcode/Plaats";
        Text[ french ] = "C.P/~Ville";
        Text[ spanish ] = "CP/Ciu~dad";
        Text[ italian ] = "C.A.P./Località";
        Text[ danish ] = "Postnr./By";
        Text[ swedish ] = "Postnr/Or~t";
        Text[ polish ] = "Kod pocztowy/MiejscowoϾ";
        Text[ portuguese_brazilian ] = "ZIP/City";
        Text[ japanese ] = "—X•֔ԍ†/“s“¹•{Œ§–¼";
        Text[ korean ] = "¿ìÆí¹øÈ£/µµ½Ã";
        Text[ chinese_simplified ] = "Óʱà/³ÇÊÐ";
        Text[ chinese_traditional ] = "¶l»¼°Ï¸¹/«°¥«";
        Text[ arabic ] = "ÇáÑãÒ ÇáÈÑíÏí/ÇáãÏíäÉ";
        Text[ turkish ] = "Posta kodu/Þehir";
        Text[ language_user1 ] = " ";
    };
    Edit ED_ZIP
    {
        Pos = MAP_APPFONT ( 105 , 64) ;
        Size = MAP_APPFONT ( 50 , 12 ) ;
        Border = TRUE ;
    };
    Edit ED_CITY
    {
        Pos = MAP_APPFONT ( 158 , 64) ;
        Size = MAP_APPFONT ( 93 , 12 ) ;
        Border = TRUE ;
    };
    FixedText FT_COUNTRYSTATE
    {
        Pos = MAP_APPFONT ( 12 ,  78) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "~Land/Bundesland" ;
        Text [ English ] = "Country/State" ;
        Text[ english_us ] = "Country/State";
        Text[ portuguese ] = "~País";
        Text[ russian ] = "Ñòðàíà/îáëàñòü";
        Text[ greek ] = "×þñá";
        Text[ dutch ] = "~Land";
        Text[ french ] = "~Pays/État (US)";
        Text[ spanish ] = "País/Pro~vincia";
        Text[ italian ] = "Provincia/Paese";
        Text[ danish ] = "Land";
        Text[ swedish ] = "~Land/Delstat";
        Text[ polish ] = "Kraj/Województwo";
        Text[ portuguese_brazilian ] = "Country/State";
        Text[ japanese ] = "‘/“s“¹•{Œ§";
        Text[ korean ] = "±¹°¡/ÁÖ";
        Text[ chinese_simplified ] = "¹ú¼Ò/Ê¡ÊÐ";
        Text[ chinese_traditional ] = "°ê®a/¬Ù";
        Text[ arabic ] = "ÇáÏæáÉ/ÇáæáÇíÉ";
        Text[ turkish ] = "Ülke/Ýl";
        Text[ language_user1 ] = " ";
    };
    Edit ED_COUNTRY
    {
        Pos = MAP_APPFONT ( 105 , 77) ;
        Size = MAP_APPFONT ( 71 , 12 ) ;
        Border = TRUE ;
    };
    Edit ED_STATE
    {
        Pos = MAP_APPFONT ( 179 , 77) ;
        Size = MAP_APPFONT ( 72 , 12 ) ;
        Border = TRUE ;
    };
    FixedText FT_POSITION
    {
        Pos = MAP_APPFONT ( 12 ,  91) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "~Position" ;
        Text [ English ] = "Position" ;
        Text[ english_us ] = "Position";
        Text[ portuguese ] = "~Posição";
        Text[ russian ] = "Äîëæíîñòü";
        Text[ greek ] = "ÈÝóç";
        Text[ dutch ] = "~Positie";
        Text[ french ] = "~Fonction";
        Text[ spanish ] = "~Posición";
        Text[ italian ] = "~Posizione";
        Text[ danish ] = "Stilling";
        Text[ swedish ] = "~Befattning";
        Text[ polish ] = "Pozycja";
        Text[ portuguese_brazilian ] = "Position";
        Text[ japanese ] = "–ðE";
        Text[ korean ] = "Á÷À§";
        Text[ chinese_simplified ] = "ְλ";
        Text[ chinese_traditional ] = "¦ì¸m";
        Text[ arabic ] = "ÇáãäÕÈ ÇáæÙíÝí";
        Text[ turkish ] = "Pozisyon";
        Text[ language_user1 ] = " ";
    };
    Edit ED_POSITION
    {
        Pos = MAP_APPFONT ( 105 , 90) ;
        Size = MAP_APPFONT ( 146 , 12 ) ;
        Border = TRUE ;
    };
    FixedText FT_PHONE
    {
        Pos = MAP_APPFONT ( 12 ,  104) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "Telefo~n/Mobil/Fax" ;
        Text [ English ] = "Phone/Mobile/Fax" ;
        Text[ english_us ] = "Phone/Cellphone/Fax";
        Text[ portuguese ] = "Telefo~ne/Telemóvel/Fax";
        Text[ russian ] = "Òåëåôîí/Ìîáèëüíûé/Ôàêñ";
        Text[ greek ] = "ÔçëÝöùíï/Êéíçôü/Fax";
        Text[ dutch ] = "Telefoo~n/Mobile/Fax";
        Text[ french ] = "~Téléphone/Portable/Fax";
        Text[ spanish ] = "~Teléfono/Móvil/Fax";
        Text[ italian ] = "Tel./Cell./Fax";
        Text[ danish ] = "Telefon/Mobil/Fax";
        Text[ swedish ] = "Telefo~n/Mobil/Fax";
        Text[ polish ] = "Telefon/Komórka/Faks";
        Text[ portuguese_brazilian ] = "Phone/Mobile/Fax";
        Text[ japanese ] = "“d˜b/Œg‘Ñ“d˜b/Fax";
        Text[ korean ] = "ÀüÇÏ/ÇÚµåÆù/ÆÑ½º";
        Text[ chinese_simplified ] = "µç»°/ÊÖ»ú/´«Õæ";
        Text[ chinese_traditional ] = "¹q¸Ü/²¾°Ê¹q¸Ü/¶Ç¯u";
        Text[ arabic ] = "ÇáåÇÊÝ/ÇáãÍãæá/ÇáÝÇßÓ";
        Text[ turkish ] = "Telefon/Cep telefonu/Faks";
        Text[ language_user1 ] = " ";
    };
    Edit ED_PHONE
    {
        Pos = MAP_APPFONT ( 105 , 103) ;
        Size = MAP_APPFONT ( 47 , 12 ) ;
        Border = TRUE ;
    };
    Edit ED_MOBILE
    {
        Pos = MAP_APPFONT ( 155 , 103) ;
        Size = MAP_APPFONT ( 47 , 12 ) ;
        Border = TRUE ;
    };
    Edit ED_FAX
    {
        Pos = MAP_APPFONT ( 205 , 103) ;
        Size = MAP_APPFONT ( 46 , 12 ) ;
        Border = TRUE ;
    };
    FixedText FT_WWWMAIL
    {
        Pos = MAP_APPFONT ( 12 ,  117) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "Ho~mepage / E-Mail" ;
        Text [ English ] = "Homepage / eMail" ;
        Text[ english_us ] = "Ho~mepage / e-mail";
        Text[ portuguese ] = "Ho~mepage / e-mail";
        Text[ russian ] = "Äîì.ñòðàíèöà /ýë.ïî÷òà";
        Text[ greek ] = "ÊåíôñéêÞ óåëßäá / E-Mail";
        Text[ dutch ] = "Ho~mepage / e-mail";
        Text[ french ] = "~Homepage / E-mail";
        Text[ spanish ] = "Página principal / ~e-mail";
        Text[ italian ] = "Ho~mepage/eMail";
        Text[ danish ] = "Hjemmeside/E-mail";
        Text[ swedish ] = "He~msida / e-post";
        Text[ polish ] = "Strona macierzysta/e-mail";
        Text[ portuguese_brazilian ] = "Homepage / eMail";
        Text[ japanese ] = "ΰÑÍß°¼Þ/E-mail";
        Text[ korean ] = "ȨÆäÀÌÁö / ÀüÀÚ¿ìÆí(~M)";
        Text[ chinese_simplified ] = "Ö÷Ò³/µç×ÓÓʼþ";
        Text[ chinese_traditional ] = "­º­¶/¹q¤l¶l¥ó";
        Text[ arabic ] = "ãæÞÚ ÇáÅäÊÑäÊ / ÇáÈÑíÏ ÇáÅáßÊÑæäí";
        Text[ turkish ] = "Web sayfasý  / E-posta";
        Text[ language_user1 ] = " ";
    };
    Edit ED_WWW
    {
        Pos = MAP_APPFONT ( 105 , 116) ;
        Size = MAP_APPFONT ( 71 , 12 ) ;
        Border = TRUE ;
    };
    Edit ED_MAIL
    {
        Pos = MAP_APPFONT ( 179 , 116) ;
        Size = MAP_APPFONT ( 72 , 12 ) ;
        Border = TRUE ;
    };
};
diff --git a/sw/source/ui/envelp/label1.cxx b/sw/source/ui/envelp/label1.cxx
new file mode 100644
index 0000000..4da5ecb
--- /dev/null
+++ b/sw/source/ui/envelp/label1.cxx
@@ -0,0 +1,1846 @@
/*************************************************************************
 *
 *  $RCSfile: label1.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:35 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _URLOBJ_HXX
#include <tools/urlobj.hxx>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXTFIELDSSUPPLIER_HPP_
#include <com/sun/star/text/XTextFieldsSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_UTIL_XREFRESHABLE_HPP_
#include <com/sun/star/util/XRefreshable.hpp>
#endif
#ifndef _SV_CONFIG_HXX //autogen
#include <vcl/config.hxx>
#endif
#ifndef _SV_WAITOBJ_HXX //autogen
#include <vcl/waitobj.hxx>
#endif
#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif
#ifndef _SFX_INIMGR_HXX
#include <sfx2/inimgr.hxx>
#endif
#ifndef _SBA_SBAOBJ_HXX //autogen
#include <offmgr/sbaobj.hxx>
#endif

#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _INITUI_HXX
#include <initui.hxx>
#endif
#ifndef _LABIMP_HXX
#include <labimp.hxx>
#endif
#ifndef _LABEL_HXX
#include <label.hxx>
#endif
#ifndef _LABFMT_HXX
#include <labfmt.hxx>
#endif
#ifndef _LABPRT_HXX
#include <labprt.hxx>
#endif
#ifndef _LABIMG_HXX
#include <labimg.hxx>
#endif
#ifndef _DOC_HXX //autogen wg. SwDoc
#include <doc.hxx>
#endif
#ifndef _UNOCRSR_HXX //autogen wg. SwUnoCrsr
#include <unocrsr.hxx>
#endif
#ifndef _UNOTOOLS_HXX
#include <unotools.hxx>
#endif
#ifndef _UNOATXT_HXX //autogen wg. SwXAutoTextEntry
#include <unoatxt.hxx>
#endif
#ifndef _UNOOBJ_HXX //
#include <unoobj.hxx>
#endif
#ifndef _UNOPRNMS_HXX //
#include <unoprnms.hxx>
#endif
#ifndef _SWDOCSH_HXX //autogen wg. SwDocShell
#include <docsh.hxx>
#endif

#ifndef _DBMGR_HXX
#include <dbmgr.hxx>
#endif

#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _HELPID_H
#include <helpid.h>
#endif
#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif
#ifndef _LABEL_HRC
#include <label.hrc>
#endif
#ifndef _UNOTOOLS_PROCESSFACTORY_HXX_
#include <unotools/processfactory.hxx>
#endif

#ifdef REPLACE_OFADBMGR
#ifndef _COM_SUN_STAR_LANG_XMULTISERVICEFACTORY_HPP_
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XNAMEACCESS_HPP_
#include <com/sun/star/container/XNameAccess.hpp>
#endif
#ifndef _UNOTOOLS_PROCESSFACTORY_HXX_
#include <unotools/processfactory.hxx>
#endif
using namespace com::sun::star::lang;
using namespace com::sun::star::container;
using namespace com::sun::star::uno;
#define C2U(char) rtl::OUString::createFromAscii(char)
#else

#endif  //REPLACE_OFADBMGR

using namespace ::com::sun::star;
using namespace ::utl;
using namespace ::rtl;

#define CL2S(cChar) UniString::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM(cChar))

#define USER_FIELD_FIRSTNAME        "BC_PRIV_FIRSTNAME"
#define USER_FIELD_NAME             "BC_PRIV_NAME"
#define USER_FIELD_PRIVSHORTCUT     "BC_PRIV_INITIALS"
#define USER_FIELD_FIRSTNAME_2      "BC_PRIV_FIRSTNAME_2"
#define USER_FIELD_NAME_2           "BC_PRIV_NAME_2"
#define USER_FIELD_PRIVSHORTCUT_2   "BC_PRIV_INITIALS_2"

#define USER_FIELD_PRIVSTREET       "BC_PRIV_STREET"
#define USER_FIELD_PRIVZIP          "BC_PRIV_ZIP"
#define USER_FIELD_PRIVCITY         "BC_PRIV_CITY"
#define USER_FIELD_PRIVCOUNTRY      "BC_PRIV_COUNTRY"
#define USER_FIELD_PRIVSTATE        "BC_PRIV_STATE"
#define USER_FIELD_PRIVTITLE        "BC_PRIV_TITLE"
#define USER_FIELD_PRIVPROFESSION   "BC_PRIV_PROFESSION"
#define USER_FIELD_PRIVPHONE        "BC_PRIV_PHONE"
#define USER_FIELD_PRIVMOBILE       "BC_PRIV_MOBILE"
#define USER_FIELD_PRIVFAX          "BC_PRIV_FAX"
#define USER_FIELD_PRIVWWW          "BC_PRIV_WWW"
#define USER_FIELD_PRIVMAIL         "BC_PRIV_MAIL"
#define USER_FIELD_COMPCOMPANY      "BC_COMP_COMPANY"
#define USER_FIELD_COMPCOMPANYEXT   "BC_COMP_COMPANYEXT"
#define USER_FIELD_COMPSLOGAN       "BC_COMP_SLOGAN"
#define USER_FIELD_COMPSTREET       "BC_COMP_STREET"
#define USER_FIELD_COMPZIP          "BC_COMP_ZIP"
#define USER_FIELD_COMPCITY         "BC_COMP_CITY"
#define USER_FIELD_COMPCOUNTRY      "BC_COMP_COUNTRY"
#define USER_FIELD_COMPSTATE        "BC_COMP_STATE"
#define USER_FIELD_COMPPOSITION     "BC_COMP_POSITION"
#define USER_FIELD_COMPPHONE        "BC_COMP_PHONE"
#define USER_FIELD_COMPMOBILE       "BC_COMP_MOBILE"
#define USER_FIELD_COMPFAX          "BC_COMP_FAX"
#define USER_FIELD_COMPWWW          "BC_COMP_WWW"
#define USER_FIELD_COMPMAIL         "BC_COMP_MAIL"

SV_IMPL_PTRARR( SwLabRecs, SwLabRec* );

inline sal_Bool NextToken( String &rStr, sal_uInt16 &nPos, sal_uInt16 &nPos2 )
{
    nPos  = nPos2+1;
    nPos2 = rStr.Search( ';', nPos );
    return nPos2 != STRING_NOTFOUND;
}



SwLabRec::SwLabRec( String& rStr, MetricField& rField )
{
    //Fuer die ersten beiden Token duefen nur Trailing und Leading Blanks
    //vernichtet werden.
    sal_uInt16 nPos = rStr.Search( ';' );
    if ( nPos == STRING_NOTFOUND )
        return;
    aMake = rStr.Copy( 0, nPos );
    ++nPos;
    sal_uInt16 nPos2 = rStr.Search( ';', nPos );
    if ( nPos2 == STRING_NOTFOUND )
        return;
    aType = rStr.Copy( nPos, nPos2 - nPos );

    aMake.EraseLeadingChars(); aMake.EraseTrailingChars();
    aType.EraseLeadingChars(); aType.EraseTrailingChars();

    //Fuer alle weiteren Token koennen alle Blanks vernichtet werden.
    rStr.EraseAllChars();
    nPos  = rStr.Search( ';' );
    nPos2 = rStr.Search( ';', nPos+1 );

    if ( !::NextToken( rStr, nPos, nPos2 ) )
        return;
    bCont = (rStr.GetChar(nPos) == 'C' || rStr.GetChar(nPos) == 'c') ? sal_True : sal_False;

    if ( !::NextToken( rStr, nPos, nPos2 ) )
        return;
    lHDist = GetLong( rStr.Copy( nPos, nPos2 - nPos ), rField );

    if ( !::NextToken( rStr, nPos, nPos2 ) )
        return;
    lVDist = GetLong( rStr.Copy( nPos, nPos2 - nPos ), rField );

    if ( !::NextToken( rStr, nPos, nPos2 ) )
        return;
    lWidth = GetLong( rStr.Copy( nPos, nPos2 - nPos ), rField );

    if ( !::NextToken( rStr, nPos, nPos2 ) )
        return;
    lHeight = GetLong( rStr.Copy( nPos, nPos2 - nPos ), rField );

    if ( !::NextToken( rStr, nPos, nPos2 ) )
        return;
    lLeft = GetLong( rStr.Copy( nPos, nPos2 - nPos ), rField );

    if ( !::NextToken( rStr, nPos, nPos2 ) )
        return;
    lUpper = GetLong( rStr.Copy( nPos, nPos2 - nPos ), rField );

    if ( !::NextToken( rStr, nPos, nPos2 ) )
        return;

    nCols = rStr.Copy( nPos, nPos2 - nPos ).ToInt32();

    nPos = nPos2+1;
    nRows = rStr.Copy( nPos ).ToInt32();

    // Ggf. Zeilenanzahl fuer Endlosetiketten automatisch berechnen
    if ( bCont && !nRows )
    {
        static const long lMax = 31748; // 56 cm
        nRows = (sal_uInt16)((lMax - lUpper) / Max(1L, lVDist));
    }
}

// --------------------------------------------------------------------------



long SwLabRec::GetLong(const String& rStr, MetricField& rField)
{
    rField.SetText( rStr );
    rField.Reformat();
    return GETFLDVAL( rField );
}

// --------------------------------------------------------------------------

String lcl_GetLabelsIni()
{
    String sRet( String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM(
                    "labels.ini" )));
    SfxIniManager* pIniManager = SFX_INIMANAGER();
    if( !pIniManager->SearchFile( sRet, SFX_KEY_USERCONFIG_PATH ))
    {
        sRet.Insert( INET_PATH_TOKEN, 0 );
        sRet.Insert( pIniManager->Get( SFX_KEY_USERCONFIG_PATH ), 0 );
    }
    return sRet;
}


void SwLabDlg::_ReplaceGroup( const String &rMake, SwLabItem *pItem )
{
    //Die alten Eintraege vernichten.
    pRecs->Remove( 1, pRecs->Count() - 1 );

    // Etiketten aus labels.ini lesen, zum Konvertieren verwenden wir ein
    // MetricField.
    MetricField aField( this, WinBits(0) );
    aField.SetUnit        (FUNIT_CM);
    aField.SetDecimalDigits(3);
    aField.SetMin         (0);
    aField.SetMax         (LONG_MAX);
    International aInter;
    aInter.SetNumThousandSep( '.' );
    aInter.SetNumDecimalSep ( ',' );
    aField.SetInternational( aInter );

    rtl_TextEncoding eSysEnc = gsl_getSystemTextEncoding();
    Config aCfg( ::lcl_GetLabelsIni() );
    aCfg.SetGroup( ByteString( rMake, eSysEnc ));

    String aTmp( rMake );
    aTmp += ';';
    const sal_uInt16 nCount = aCfg.GetKeyCount();
    for ( sal_uInt16 i = 0; i < nCount; ++i )
    {
        String aStr( aTmp );
        aStr += String(aCfg.ReadKey( i ), eSysEnc);
        SwLabRec* pRec = new SwLabRec( aStr, aField );
        sal_Bool bDouble = sal_False;

        for (sal_uInt16 nRecPos = 0; nRecPos < pRecs->Count(); nRecPos++)
        {
            if (pRec->aMake == pRecs->GetObject(nRecPos)->aMake &&
                pRec->aType == pRecs->GetObject(nRecPos)->aType)
            {
                bDouble = sal_True;
                break;
            }
        }

        if (!bDouble)
        {
            pRecs->C40_INSERT( SwLabRec, pRec, pRecs->Count() );

            if ( pRec->aMake == pItem->aMake && pRec->aType == pItem->aType )
            {
                pItem->lHDist  = pRec->lHDist;
                pItem->lVDist  = pRec->lVDist;
                pItem->lWidth  = pRec->lWidth;
                pItem->lHeight = pRec->lHeight;
                pItem->lLeft   = pRec->lLeft;
                pItem->lUpper  = pRec->lUpper;
                pItem->nCols   = pRec->nCols;
                pItem->nRows   = pRec->nRows;
                pItem->bCont   = pRec->bCont;
            }
        }
    }
    aLstGroup = rMake;
}

// --------------------------------------------------------------------------



void SwLabDlg::PageCreated(sal_uInt16 nId, SfxTabPage &rPage)
{
    if (nId == TP_LAB_LAB)
    {
        if(m_bLabel)
        {
            ((SwLabPage*)&rPage)->SetNewDBMgr(pNewDBMgr);
            ((SwLabPage*)&rPage)->InitDatabaseBox();
        }
        else
            ((SwLabPage*)&rPage)->SetToBusinessCard();
    }
    else if (nId == TP_LAB_PRT)
        pPrtPage = (SwLabPrtPage*)&rPage;
}

// --------------------------------------------------------------------------



SwLabDlg::SwLabDlg(Window* pParent, const SfxItemSet& rSet,
                                SwNewDBMgr* pDBMgr, sal_Bool bLabel) :
    SfxTabDialog( pParent, SW_RES(DLG_LAB), &rSet, sal_False ),
    sBusinessCardDlg(ResId(ST_BUSINESSCARDDLG)),
    sMedium(ResId(ST_FIRSTPAGE_BC)),
    sFormat(ResId(ST_FIRSTPAGE_LAB)),
    aTypeIds( 50, 10 ),
    aMakes  (  5,  0 ),
    pRecs   ( new SwLabRecs() ),
    pNewDBMgr(pDBMgr),
    pPrtPage(0),
    m_bLabel(bLabel)
{
    WaitObject aWait( pParent );

    FreeResource();

    GetOKButton().SetText(String(SW_RES(STR_BTN_NEW_DOC)));
    GetOKButton().SetHelpId(HID_LABEL_INSERT);
    GetOKButton().SetHelpText(aEmptyStr);   // Damit generierter Hilfetext verwendet wird

    AddTabPage(TP_LAB_LAB, m_bLabel ? sFormat : sMedium ,SwLabPage   ::Create, 0, sal_False, 0);
    AddTabPage(TP_VISITING_CARDS, SwVisitingCardPage::Create, 0);
    AddTabPage(TP_LAB_FMT, SwLabFmtPage::Create, 0);
    AddTabPage(TP_LAB_PRT, SwLabPrtPage::Create, 0);
    AddTabPage(TP_BUSINESS_DATA, SwBusinessDataPage::Create, 0 );
    AddTabPage(TP_PRIVATE_DATA, SwPrivateDataPage::Create, 0);


    if(m_bLabel)
    {
        RemoveTabPage(TP_BUSINESS_DATA);
        RemoveTabPage(TP_PRIVATE_DATA);
        RemoveTabPage(TP_VISITING_CARDS);
    }
    else
    {
        SetText(sBusinessCardDlg);
    }
    // Benutzer-Etikette aus writer.cfg lesen
    SwLabItem aItem((const SwLabItem&)rSet.Get(FN_LABEL));
    SwLabRec* pRec = new SwLabRec;
    const String aTmp( SW_RES( STR_CUSTOM ) );
    pRec->aMake   = pRec->aType = aTmp;
    pRec->lHDist  = aItem.lHDist;
    pRec->lVDist  = aItem.lVDist;
    pRec->lWidth  = aItem.lWidth;
    pRec->lHeight = aItem.lHeight;
    pRec->lLeft   = aItem.lLeft;
    pRec->lUpper  = aItem.lUpper;
    pRec->nCols   = aItem.nCols;
    pRec->nRows   = aItem.nRows;
    pRec->bCont   = aItem.bCont;

    sal_Bool bDouble = sal_False;

    for (sal_uInt16 nRecPos = 0; nRecPos < pRecs->Count(); nRecPos++)
    {
        if (pRec->aMake == pRecs->GetObject(nRecPos)->aMake &&
            pRec->aType == pRecs->GetObject(nRecPos)->aType)
        {
            bDouble = sal_True;
            break;
        }
    }

    if (!bDouble)
        pRecs->C40_INSERT( SwLabRec, pRec, 0 );

    Config aCfg( ::lcl_GetLabelsIni() );
    aCfg.SetGroup( "Labels" );
    sal_uInt16 nLstGroup = 0;
    rtl_TextEncoding eSysEnc = gsl_getSystemTextEncoding();
    const sal_uInt16 nGroups = aCfg.GetKeyCount();
    for ( sal_uInt16 nGroup = 0; nGroup < nGroups; ++nGroup )
    {
        String *pMake = new String( aCfg.ReadKey( nGroup ), eSysEnc );
        pMake->EraseLeadingChars();
        pMake->EraseTrailingChars();
        aMakes.Insert( pMake, aMakes.Count() );
        if ( *pMake == aItem.aLstMake )
            nLstGroup = nGroup;
    }
    if ( aMakes.Count() )
        _ReplaceGroup( *aMakes[nLstGroup], &aItem );
    if (pExampleSet)
        pExampleSet->Put(aItem);
}

// --------------------------------------------------------------------------

SwLabDlg::~SwLabDlg()
{
    delete pRecs;
}

/* --------------------------------------------------------------------------

Diese Routine modifiziert ein uebergebenes SwLabItem so, dass es hernach in
der Config gespeichert werden kann. Durch die Angabe des Herstellers und des
Artikels sind die weiteren Groessenangaben redundant, daher werden in lHDist
und den folgenden Membern die Eigenschaften der benutzerdefinierten Etiketten
gespeichert.

-------------------------------------------------------------------------- */



void SwLabDlg::MakeConfigItem( SwLabItem& rItem ) const
{
    if ( rItem.aType != String(SW_RES(STR_CUSTOM)) )
    {
        SwLabRec* pRec = (*pRecs)[0];
        rItem.lHDist  = pRec->lHDist;
        rItem.lVDist  = pRec->lVDist;
        rItem.lWidth  = pRec->lWidth;
        rItem.lHeight = pRec->lHeight;
        rItem.lLeft   = pRec->lLeft;
        rItem.lUpper  = pRec->lUpper;
        rItem.nCols   = pRec->nCols;
        rItem.nRows   = pRec->nRows;
    }
    const SwLabItem& rActItem = (const SwLabItem&)GetExampleSet()->Get(FN_LABEL);
    rItem.bCont    = rActItem.bCont;
    rItem.aLstMake = rActItem.aLstMake;
    rItem.aLstType = rActItem.aLstType;
    rItem.sDBName  = rActItem.sDBName;
}

// --------------------------------------------------------------------------

void SwLabDlg::GetLabItem(SwLabItem &rItem)
{
    const SwLabItem& rActItem = (const SwLabItem&)GetExampleSet()->Get(FN_LABEL);
    const SwLabItem& rOldItem = (const SwLabItem&)GetInputSetImpl()->Get(FN_LABEL);

    if (rActItem != rOldItem)
    {   // Wurde schon mal mit (hoffentlich) korrektem Inhalt "geputtet"
        rItem = rActItem;
    }
    else
    {
        rItem = rOldItem;

        // Im rItem stehen (vom Namen mal abgesehen) immer nur die
        // benutzerdefinierbaren Einstellungen. Daher richtige Werte
        // direkt aus dem Record besorgen:
        SwLabRec* pRec = GetRecord(rItem.aType, rItem.bCont);

        rItem.lHDist  = pRec->lHDist;
        rItem.lVDist  = pRec->lVDist;
        rItem.lWidth  = pRec->lWidth;
        rItem.lHeight = pRec->lHeight;
        rItem.lLeft   = pRec->lLeft;
        rItem.lUpper  = pRec->lUpper;
        rItem.nCols   = pRec->nCols;
        rItem.nRows   = pRec->nRows;
    }
}

// --------------------------------------------------------------------------

SwLabRec* SwLabDlg::GetRecord(const String &rRecName, sal_Bool bCont)
{
    SwLabRec* pRec = NULL;
    sal_Bool bFound = sal_False;
    String sCustom(SW_RES(STR_CUSTOM));

    const sal_uInt16 nCount = Recs().Count();
    for (sal_uInt16 i = 0; i < nCount; i++)
    {
        pRec = Recs()[i];
        if (pRec->aType != sCustom &&
            rRecName == pRec->aType && bCont == pRec->bCont)
        {
            bFound = sal_True;
            break;
        }
    }
    if (!bFound)    // Benutzerdefiniert
        pRec = Recs()[0];

    return(pRec);
}

// --------------------------------------------------------------------------



Printer *SwLabDlg::GetPrt()
{
    if (pPrtPage)
        return (pPrtPage->GetPrt());
    else
        return (NULL);
}

// --------------------------------------------------------------------------

SwLabPage::SwLabPage(Window* pParent, const SfxItemSet& rSet) :
    SfxTabPage(pParent, SW_RES(TP_LAB_LAB), rSet),
    pNewDBMgr(NULL),
    aItem          ((const SwLabItem&) rSet.Get(FN_LABEL)),

    aWritingText   (this, SW_RES(TXT_WRITING)),
    aAddrBox       (this, SW_RES(BOX_ADDR   )),
    aWritingEdit   (this, SW_RES(EDT_WRITING)),
    aDatabaseFT    (this, SW_RES(FT_DATABASE)),
    aDatabaseLB    (this, SW_RES(LB_DATABASE)),
    aTableFT       (this, SW_RES(FT_TABLE   )),
    aTableLB       (this, SW_RES(LB_TABLE   )),
    aInsertBT      (this, SW_RES(BTN_INSERT )),
    aDBFieldFT     (this, SW_RES(FT_DBFIELD )),
    aDBFieldLB     (this, SW_RES(LB_DBFIELD )),
    aWritingGroup  (this, SW_RES(GRP_WRITING)),
    aContButton    (this, SW_RES(BTN_CONT   )),
    aSheetButton   (this, SW_RES(BTN_SHEET  )),
    aMakeText      (this, SW_RES(TXT_MAKE   )),
    aMakeBox       (this, SW_RES(BOX_MAKE   )),
    aTypeText      (this, SW_RES(TXT_TYPE   )),
    aTypeBox       (this, SW_RES(BOX_TYPE   )),
    aFormatInfo    (this, SW_RES(INF_FORMAT )),
    aFormatGroup   (this, SW_RES(GRP_FORMAT ))

{
    WaitObject aWait( pParent );

    FreeResource();
    SetExchangeSupport();


    // Handler installieren
    aAddrBox       .SetClickHdl (LINK(this, SwLabPage, AddrHdl         ));
    aDatabaseLB    .SetSelectHdl(LINK(this, SwLabPage, DatabaseHdl     ));
    aTableLB       .SetSelectHdl(LINK(this, SwLabPage, DatabaseHdl     ));
    aInsertBT      .SetClickHdl (LINK(this, SwLabPage, FieldHdl        ));
    aContButton    .SetClickHdl (LINK(this, SwLabPage, PageHdl         ));
    aSheetButton   .SetClickHdl (LINK(this, SwLabPage, PageHdl         ));
    aMakeBox       .SetSelectHdl(LINK(this, SwLabPage, MakeHdl         ));
    aTypeBox       .SetSelectHdl(LINK(this, SwLabPage, TypeHdl         ));

    InitDatabaseBox();

    sal_uInt16 nLstGroup = 0;

    const sal_uInt16 nCount = (sal_uInt16)GetParent()->Makes().Count();
    for (sal_uInt16 i = 0; i < nCount; ++i)
    {
        String &rStr = *GetParent()->Makes()[i];
        aMakeBox.InsertEntry( rStr );
        if ( rStr == aItem.aLstMake )
            nLstGroup = i;
    }
//  Reset(rSet);
    aMakeBox.SelectEntryPos( nLstGroup );
    aMakeBox.GetSelectHdl().Call( &aMakeBox );
}

// --------------------------------------------------------------------------



SwLabPage::~SwLabPage()
{
}
/* -----------------29.09.99 09:08-------------------

 --------------------------------------------------*/
void lcl_ChgYPos(Window& rWin, long nDiff)
{
    Point aTempPos(rWin.GetPosPixel());
    aTempPos.Y() += nDiff;
    rWin.SetPosPixel(aTempPos);
}

void SwLabPage::SetToBusinessCard()
{
    m_bLabel = sal_False;
    aWritingText.Hide();
    aAddrBox.Hide();
    aWritingEdit.Hide();
    aDatabaseFT.Hide();
    aDatabaseLB.Hide();
    aTableFT.Hide();
    aTableLB.Hide();
    aInsertBT.Hide();
    aDBFieldFT.Hide();
    aDBFieldLB.Hide();
    aWritingGroup.Hide();

    //resize the form
     Point aGBPos(aWritingGroup.GetPosPixel());
    long nDiffPos = aFormatGroup.GetPosPixel().Y() - aGBPos.Y();
     Size aGBSz(aFormatGroup.GetSizePixel());
    aGBSz.Height() += nDiffPos;
    aFormatGroup.SetPosSizePixel(aGBPos, aGBSz);

    // move all controls up
    lcl_ChgYPos(aContButton, -nDiffPos);
    lcl_ChgYPos(aSheetButton, -nDiffPos);
    lcl_ChgYPos(aMakeText, -nDiffPos);

    lcl_ChgYPos(aTypeText, -nDiffPos);
    lcl_ChgYPos(aFormatInfo, -nDiffPos);

    Size aTmpSz(3, 3);
    aTmpSz = LogicToPixel(aTmpSz, MAP_APPFONT);

    //
    aMakeBox.SetStyle((aMakeBox.GetStyle()&~WB_DROPDOWN));
    aTypeBox.SetStyle((aTypeBox.GetStyle()&~WB_DROPDOWN));

    lcl_ChgYPos(aMakeBox, - nDiffPos);
    Point aLBPos(aMakeBox.GetPosPixel());
    aLBPos.Y() += aMakeBox.GetSizePixel().Height() + aTmpSz.Height();
    aTypeBox.SetPosPixel(aLBPos);
};

// --------------------------------------------------------------------------

//impl in envimg.cxx
extern String MakeSender();



IMPL_LINK( SwLabPage, AddrHdl, Button *, EMPTYARG )
{
    String aWriting;
    if ( aAddrBox.IsChecked() )
        aWriting = MakeSender();
    aWritingEdit.SetText( aWriting.ConvertLineEnd() );
    aWritingEdit.GrabFocus();
    return 0;
}

// --------------------------------------------------------------------------



IMPL_LINK( SwLabPage, DatabaseHdl, ListBox *, pListBox )
{
    sActDBName = SFX_APP()->LocalizeDBName(NATIONAL2INI, aDatabaseLB.GetSelectEntry());

    WaitObject aObj( GetParent() );

    if (pListBox == &aDatabaseLB)
        GetNewDBMgr()->GetTableNames(&aTableLB, sActDBName);
#ifdef REPLACE_OFADBMGR
    GetNewDBMgr()->GetColumnNames(&aDBFieldLB, sActDBName, aTableLB.GetSelectEntry());
#else
    sActDBName += DB_DELIM;
    sActDBName += aTableLB.GetSelectEntry();
    GetNewDBMgr()->GetColumnNames(&aDBFieldLB, sActDBName);
#endif
    return 0;
}



IMPL_LINK( SwLabPage, FieldHdl, Button *, EMPTYARG )
{
    String aStr ( '<' );
    aStr += aDatabaseLB.GetSelectEntry();
    aStr += '.';
    aStr += aTableLB.GetSelectEntry();
    aStr += '.';
    aStr += aDBFieldLB.GetSelectEntry();
    aStr += '>';
    aWritingEdit.ReplaceSelected(aStr);
    Selection aSel = aWritingEdit.GetSelection();
    aWritingEdit.GrabFocus();
    aWritingEdit.SetSelection(aSel);
    return 0;
}

// --------------------------------------------------------------------------



IMPL_LINK_INLINE_START( SwLabPage, PageHdl, Button *, EMPTYARG )
{
    aMakeBox.GetSelectHdl().Call( &aMakeBox );
    return 0;
}
IMPL_LINK_INLINE_END( SwLabPage, PageHdl, Button *, EMPTYARG )

// --------------------------------------------------------------------------



IMPL_LINK( SwLabPage, MakeHdl, ListBox *, EMPTYARG )
{
    WaitObject aWait( GetParent() );

    aTypeBox.Clear();
    GetParent()->TypeIds().Remove( 0, GetParent()->TypeIds().Count() );

    const String aMake = aMakeBox.GetSelectEntry();
    GetParent()->ReplaceGroup( aMake, &aItem );
    aItem.aLstMake = aMake;

    const sal_Bool   bCont    = aContButton.IsChecked();
    const sal_uInt16 nCount   = GetParent()->Recs().Count();
          sal_uInt16 nLstType = 0;

    for ( sal_uInt16 i = 0; i < nCount; ++i )
    {
        if ( GetParent()->Recs()[i]->aType == String( SW_RES(STR_CUSTOM) ) ||
             GetParent()->Recs()[i]->bCont == bCont )
        {
            const String aType ( GetParent()->Recs()[i]->aType );
            if ( aTypeBox.GetEntryPos(aType) == LISTBOX_ENTRY_NOTFOUND )
            {
                if ( !nLstType && aType == aItem.aLstType )
                    nLstType = GetParent()->TypeIds().Count();
                aTypeBox.InsertEntry( aType );
                GetParent()->TypeIds().Insert(i, GetParent()->TypeIds().Count());
            }
        }
    }
    if (nLstType)
        aTypeBox.SelectEntry(aItem.aLstType);
    else
        aTypeBox.SelectEntryPos(0);
    aTypeBox.GetSelectHdl().Call( &aTypeBox );
    return 0;
}

// --------------------------------------------------------------------------



IMPL_LINK_INLINE_START( SwLabPage, TypeHdl, ListBox *, EMPTYARG )
{
    DisplayFormat();
    aItem.aType = aTypeBox.GetSelectEntry();
    return 0;
}
IMPL_LINK_INLINE_END( SwLabPage, TypeHdl, ListBox *, EMPTYARG )

// --------------------------------------------------------------------------



void SwLabPage::DisplayFormat()
{
    MetricField aField(this, WinBits(0));
    aField.SetUnit        (FUNIT_CM);
    aField.SetDecimalDigits(2);
    aField.SetMin         (0);
    aField.SetMax         (LONG_MAX);

    SwLabRec* pRec = GetSelectedEntryPos();
    aItem.aLstType = pRec->aType;
    SETFLDVAL(aField, pRec->lWidth);
    aField.Reformat();
    const String aWString = aField.GetText();

    SETFLDVAL(aField, pRec->lHeight);
    aField.Reformat();

    String aText = pRec->aType;
    aText.AppendAscii( RTL_CONSTASCII_STRINGPARAM( ": "));
    aText += aWString;
    aText.AppendAscii( RTL_CONSTASCII_STRINGPARAM(" x "));
    aText += aField.GetText();
    aText.AppendAscii( RTL_CONSTASCII_STRINGPARAM(" ("));
    aText += String::CreateFromInt32( pRec->nCols );
    aText.AppendAscii( RTL_CONSTASCII_STRINGPARAM(" x "));
    aText += String::CreateFromInt32( pRec->nRows );
    aText += ')';
    aFormatInfo.SetText(aText);
}

// --------------------------------------------------------------------------

SwLabRec* SwLabPage::GetSelectedEntryPos()
{
    String sSelEntry(aTypeBox.GetSelectEntry());

    return GetParent()->GetRecord(sSelEntry, aContButton.IsChecked());
}

// --------------------------------------------------------------------------



void SwLabPage::InitDatabaseBox()
{
    if(GetNewDBMgr())
    {
        aDatabaseLB.Clear();
#ifdef REPLACE_OFADBMGR
        Sequence<OUString> aDataNames = SwNewDBMgr::GetExistingDatabaseNames();
        const OUString* pDataNames = aDataNames.getConstArray();
        for (long i = 0; i < aDataNames.getLength(); i++)
            aDatabaseLB.InsertEntry(pDataNames[i]);
        String sDBName = sActDBName.GetToken( 0, DB_DELIM );
        String sTableName = sActDBName.GetToken( 1, DB_DELIM );
        aDatabaseLB.SelectEntry(sDBName);
        if (GetNewDBMgr()->GetTableNames(&aTableLB, sDBName))
        {
            aTableLB.SelectEntry(sTableName);
            GetNewDBMgr()->GetColumnNames(&aDBFieldLB, sActDBName, sTableName);
        }
        else
            aDBFieldLB.Clear();
#else
        SbaObject *pSbaObject = GetNewDBMgr()->GetSbaObject();
        if(!pSbaObject)
            return;
        String sDBNames = pSbaObject->GetDatabaseNames();
        sActDBName = aItem.sDBName;
        if ( !sActDBName.Len() )
            sActDBName = GetNewDBMgr()->GetAddressDBName();

        sDBNames = SFX_APP()->LocalizeDBName(INI2NATIONAL, sDBNames);

        sal_uInt16 nCount = sDBNames.GetTokenCount();

        for (sal_uInt16 i = 0; i < nCount; i++)
            aDatabaseLB.InsertEntry(sDBNames.GetToken(i));

        String sDBName = SFX_APP()->LocalizeDBName( INI2NATIONAL,
                                        sActDBName.GetToken( 0, DB_DELIM ));
        aDatabaseLB.SelectEntry(sDBName);
        if (GetNewDBMgr()->GetTableNames(&aTableLB, sDBName))
        {
            aTableLB.SelectEntry(sActDBName.GetToken(1, DB_DELIM));
            GetNewDBMgr()->GetColumnNames(&aDBFieldLB, sActDBName);
        }
        else
            aDBFieldLB.Clear();
#endif
    }
}

// --------------------------------------------------------------------------



SfxTabPage* SwLabPage::Create(Window* pParent, const SfxItemSet& rSet)
{
    return new SwLabPage(pParent, rSet);
}

// --------------------------------------------------------------------------



void SwLabPage::ActivatePage(const SfxItemSet& rSet)
{
    Reset( rSet );
}

// --------------------------------------------------------------------------



int SwLabPage::DeactivatePage(SfxItemSet* pSet)
{
    if (pSet)
        FillItemSet(*pSet);

    return sal_True;
}

// --------------------------------------------------------------------------



void SwLabPage::FillItem(SwLabItem& rItem)
{
    rItem.bAddr    = aAddrBox.IsChecked();
    rItem.aWriting = aWritingEdit.GetText();
    rItem.bCont    = aContButton.IsChecked();
    rItem.aMake    = aMakeBox.GetSelectEntry();
    rItem.aType    = aTypeBox.GetSelectEntry();
    rItem.sDBName  = sActDBName;

    SwLabRec* pRec = GetSelectedEntryPos();

    rItem.lHDist  = pRec->lHDist;
    rItem.lVDist  = pRec->lVDist;
    rItem.lWidth  = pRec->lWidth;
    rItem.lHeight = pRec->lHeight;
    rItem.lLeft   = pRec->lLeft;
    rItem.lUpper  = pRec->lUpper;
    rItem.nCols   = pRec->nCols;
    rItem.nRows   = pRec->nRows;

    rItem.aLstMake = aMakeBox.GetSelectEntry();
    rItem.aLstType = aTypeBox.GetSelectEntry();
}

// --------------------------------------------------------------------------



sal_Bool SwLabPage::FillItemSet(SfxItemSet& rSet)
{
    FillItem( aItem );
    rSet.Put( aItem );

    return sal_True;
}

// --------------------------------------------------------------------------



void SwLabPage::Reset(const SfxItemSet& rSet)
{
    aItem = (const SwLabItem&) rSet.Get(FN_LABEL);
    String sDBName  = aItem.sDBName;

    String aWriting( aItem.aWriting );

    aAddrBox    .Check      ( aItem.bAddr );
    aWritingEdit.SetText    ( aWriting.ConvertLineEnd() );
    aMakeBox    .SelectEntry( aItem.aMake );

    if (aTypeBox.GetEntryPos(aItem.aType) != LISTBOX_ENTRY_NOTFOUND)
    {
        aTypeBox.SelectEntry(aItem.aType);
        aTypeBox.GetSelectHdl().Call(&aTypeBox);
    }
    if (aDatabaseLB.GetEntryPos(sDBName) != LISTBOX_ENTRY_NOTFOUND)
    {
        aDatabaseLB.SelectEntry(sDBName);
        aDatabaseLB.GetSelectHdl().Call(&aDatabaseLB);
    }

    if (aItem.bCont)
        aContButton .Check();
    else
        aSheetButton.Check();
}
/*-- 08.07.99 14:00:02---------------------------------------------------

  -----------------------------------------------------------------------*/
SwVisitingCardPage::SwVisitingCardPage(Window* pParent, const SfxItemSet& rSet) :
    SfxTabPage(pParent, SW_RES(TP_VISITING_CARDS), rSet),
    aAutoTextLB(this,       ResId( LB_AUTO_TEXT         )),
    aAutoTextGroupFT(this,  ResId( FT_AUTO_TEXT_GROUP   )),
    aAutoTextGroupLB(this,  ResId( LB_AUTO_TEXT_GROUP   )),
    aContentGB(this,        ResId( GB_CONTENT           )),
    aExampleWIN(this,       ResId( WIN_EXAMPLE          )),
    aExampleGB(this,        ResId( GB_EXAMPLE           )),
    sVisCardGroup(ResId(ST_VISCARD_GROUP)),
    pExampleFrame(0)
{
    FreeResource();
    aAutoTextLB.SetWindowBits( WB_HSCROLL );
    aAutoTextLB.SetSpaceBetweenEntries(0);
    aAutoTextLB.SetSelectionMode( SINGLE_SELECTION );
    aAutoTextLB.SetHelpId(HID_BUSINESS_CARD_CONTENT);

    SetExchangeSupport();
    aAutoTextLB.SetSelectHdl(LINK(this, SwVisitingCardPage, AutoTextSelectHdl));
    aAutoTextGroupLB.SetSelectHdl(LINK(this, SwVisitingCardPage, AutoTextSelectHdl));

    aAutoTextLB.Show();
    aAutoTextGroupFT.Show();
    aAutoTextGroupLB.Show();
    InitFrameControl();
    aExampleWIN.Hide();

}
/*-- 08.07.99 14:00:03---------------------------------------------------

  -----------------------------------------------------------------------*/
SwVisitingCardPage::~SwVisitingCardPage()
{
    for(sal_uInt16 i = 0; i < aAutoTextGroupLB.GetEntryCount(); i++)
        delete (String*)aAutoTextGroupLB.GetEntryData( i );
    _xAutoText = 0;
    SvLBoxEntry* pEntry = aAutoTextLB.First();
    while(pEntry)
    {
        String * pString = (String*)pEntry->GetUserData();
        delete pString;
        pEntry = aAutoTextLB.Next(pEntry);
    }
    delete pExampleFrame;
}
/*-- 08.07.99 14:00:03---------------------------------------------------

  -----------------------------------------------------------------------*/
SfxTabPage* SwVisitingCardPage::Create(Window* pParent, const SfxItemSet& rSet)
{
    return new SwVisitingCardPage(pParent, rSet);
}
/*-- 08.07.99 14:00:03---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwVisitingCardPage::ActivatePage(const SfxItemSet& rSet)
{
    Reset( rSet );
    UpdateFields();
}
/*-- 08.07.99 14:00:04---------------------------------------------------

  -----------------------------------------------------------------------*/
int  SwVisitingCardPage::DeactivatePage(SfxItemSet* pSet)
{
    if (pSet)
        FillItemSet(*pSet);
    return LEAVE_PAGE;
}
/*-- 08.07.99 14:00:04---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Bool SwVisitingCardPage::FillItemSet(SfxItemSet& rSet)
{
    String* pGroup = (String*)aAutoTextGroupLB.GetEntryData(
                                    aAutoTextGroupLB.GetSelectEntryPos());
    DBG_ASSERT(pGroup, "no group selected?")
    if(pGroup)
        aLabItem.sGlossaryGroup = *pGroup;

    SvLBoxEntry* pSelEntry = aAutoTextLB.FirstSelected();
    if(pSelEntry)
        aLabItem.sGlossaryBlockName = *(String*)pSelEntry->GetUserData();
    rSet.Put(aLabItem);
    return sal_True;
}
/*-- 08.07.99 14:00:05---------------------------------------------------

  -----------------------------------------------------------------------*/
void lcl_SelectBlock(SvTreeListBox& rAutoTextLB, const String& rBlockName)
{
    SvLBoxEntry* pEntry = rAutoTextLB.First();
    while(pEntry)
    {
        if(*(String*)pEntry->GetUserData() == rBlockName)
        {
            rAutoTextLB.Select(pEntry);
            rAutoTextLB.MakeVisible(pEntry);
        }
        pEntry = rAutoTextLB.Next(pEntry);
    }
}
//-----------------------------------------------------------------------------
sal_Bool lcl_FindBlock(SvTreeListBox& rAutoTextLB, const String& rBlockName)
{
    SvLBoxEntry* pEntry = rAutoTextLB.First();
    while(pEntry)
    {
        if(*(String*)pEntry->GetUserData() == rBlockName)
        {
            rAutoTextLB.Select(pEntry);
            return sal_True;
        }
        pEntry = rAutoTextLB.Next(pEntry);
    }
    return sal_False;
}
//-----------------------------------------------------------------------------
void SwVisitingCardPage::Reset(const SfxItemSet& rSet)
{
    aLabItem = (const SwLabItem&) rSet.Get(FN_LABEL);

    sal_Bool bFound = sal_False;
    for(sal_uInt16 i = 0; i < aAutoTextGroupLB.GetEntryCount() && !bFound; i++)
        if(aLabItem.sGlossaryGroup == *(String*)aAutoTextGroupLB.GetEntryData( i ))
        {
            bFound = sal_True;
            break;
        }

    if(bFound)
    {
        if(aAutoTextGroupLB.GetSelectEntryPos() != i)
        {
            aAutoTextGroupLB.SelectEntryPos(i);
            AutoTextSelectHdl(&aAutoTextGroupLB);
        }
        if(lcl_FindBlock(aAutoTextLB, aLabItem.sGlossaryBlockName))
        {
            SvLBoxEntry* pSelEntry = aAutoTextLB.FirstSelected();
            if( pSelEntry &&
                *(String*)pSelEntry->GetUserData() != aLabItem.sGlossaryBlockName)
            {
                lcl_SelectBlock(aAutoTextLB, aLabItem.sGlossaryBlockName);
                AutoTextSelectHdl(&aAutoTextLB);
            }
        }
    }
}
/* -----------------08.07.99 15:15-------------------

 --------------------------------------------------*/
void SwVisitingCardPage::InitFrameControl()
{
    Link aLink(LINK(
                    this, SwVisitingCardPage, FrameControlInitializedHdl));
    pExampleFrame = new SwOneExampleFrame(aExampleWIN, EX_SHOW_BUSINESS_CARDS, &aLink);

    uno::Reference< lang::XMultiServiceFactory >  xMgr = getProcessServiceFactory();
    //now the AutoText ListBoxes have to be filled

    uno::Reference< uno::XInterface >  xAText =
        xMgr->createInstance( C2U("com.sun.star.text.AutoTextContainer") );
    _xAutoText = uno::Reference< container::XNameAccess >(xAText, uno::UNO_QUERY);

    uno::Sequence<OUString> aNames = _xAutoText->getElementNames();
    const OUString* pGroups = aNames.getConstArray();
    for(sal_uInt16 i = 0; i < aNames.getLength(); i++)
    {
        uno::Any aGroup = _xAutoText->getByName(pGroups[i]);
        uno::Reference< text::XAutoTextGroup >  xGroup = *(uno::Reference< text::XAutoTextGroup > *)aGroup.getValue();
        uno::Reference< container::XIndexAccess >  xIdxAcc(xGroup, uno::UNO_QUERY);
        if(!xIdxAcc.is() || xIdxAcc->getCount())
        {
            uno::Reference< beans::XPropertySet >  xPrSet(xGroup, uno::UNO_QUERY);
            uno::Any aTitle = xPrSet->getPropertyValue(CL2S(UNO_NAME_TITLE));
            OUString uTitle;
            aTitle >>= uTitle;
            String sGroup(pGroups[i]);
            sal_uInt16 nEntry = aAutoTextGroupLB.InsertEntry(uTitle);
            aAutoTextGroupLB.SetEntryData(nEntry, new String(sGroup));
        }
    }
    if(LISTBOX_ENTRY_NOTFOUND == aAutoTextGroupLB.GetSelectEntryPos())
        aAutoTextGroupLB.SelectEntryPos(0);
    String sCurGroupName(
        *(String*)aAutoTextGroupLB.GetEntryData(aAutoTextGroupLB.GetSelectEntryPos()));
    if(_xAutoText->hasByName(sCurGroupName))
    {
        uno::Any aGroup = _xAutoText->getByName(sCurGroupName);
        try
        {
            uno::Reference< text::XAutoTextGroup >  xGroup = *(uno::Reference< text::XAutoTextGroup > *)aGroup.getValue();
            uno::Sequence<OUString> aBlockNames = xGroup->getElementNames();
            const OUString* pBlocks = aBlockNames.getConstArray();
            uno::Sequence< OUString > aTitles = xGroup->getTitles() ;
            const OUString* pTitles = aTitles.getConstArray();
            for(i = 0; i < aBlockNames.getLength();i++)
            {
                String sTitle(pTitles[i]);
                SvLBoxEntry* pEntry = aAutoTextLB.InsertEntry(sTitle);
                String sBlock(pBlocks[i]);
                pEntry->SetUserData(new String(sBlock));
            }
        }
        catch( uno::RuntimeException& )
        {
            // we'll be her if path settings were wrong
        }
    }
}
/* -----------------01.10.99 13:19-------------------

 --------------------------------------------------*/
IMPL_LINK( SwVisitingCardPage, FrameControlInitializedHdl, void*, EMPTYARG )
{
    AutoTextSelectHdl(&aAutoTextGroupLB);
    return 0;
};
/* -----------------22.07.99 11:06-------------------

 --------------------------------------------------*/
void lcl_SetUserField(uno::Reference< container::XNameAccess > & xFldMasters,
                const String& rFldName, const String& rContent )
{
    String sFldName( CL2S("com.sun.star.text.FieldMaster.User."));
    sFldName += rFldName;
    OUString uFldName(sFldName);
    if(xFldMasters->hasByName(uFldName))
    {
        uno::Any aFirstName = xFldMasters->getByName(uFldName);
        uno::Reference< beans::XPropertySet >  xFld = *(uno::Reference< beans::XPropertySet > *)aFirstName.getValue();
        uno::Any aContent;
        aContent <<= rtl::OUString(rContent);
        xFld->setPropertyValue(CL2S(UNO_NAME_CONTENT), aContent);
    }
}

IMPL_LINK( SwVisitingCardPage, AutoTextSelectHdl, void*, pBox )
{
    if(pExampleFrame->IsInitialized() && _xAutoText.is())
    {
        sal_Bool bGroup = &aAutoTextGroupLB == pBox;

        String sGroup(
            *(String*)aAutoTextGroupLB.GetEntryData(aAutoTextGroupLB.GetSelectEntryPos()));
        uno::Any aGroup = _xAutoText->getByName(sGroup);
        uno::Reference< text::XAutoTextGroup >  xGroup = *(uno::Reference< text::XAutoTextGroup > *)aGroup.getValue();

        if(bGroup)
        {
            SvLBoxEntry* pEntry = aAutoTextLB.First();
            while(pEntry)
            {
                String * pString = (String*)pEntry->GetUserData();
                delete pString;
                pEntry = aAutoTextLB.Next(pEntry);
            }
            aAutoTextLB.Clear();
            uno::Sequence<OUString> aBlockNames = xGroup->getElementNames();
            const OUString* pBlocks = aBlockNames.getConstArray();
            uno::Sequence< OUString > aTitles = xGroup->getTitles() ;
            const OUString* pTitles = aTitles.getConstArray();
            for(sal_uInt16 i = 0; i < aBlockNames.getLength();i++)
            {
                String sTitle(pTitles[i]);
                SvLBoxEntry* pEntry = aAutoTextLB.InsertEntry(sTitle);
                String sBlock(pBlocks[i]);
                pEntry->SetUserData(new String(sBlock));
            }
        }
        SvLBoxEntry* pSel = aAutoTextLB.FirstSelected();
        String sEntry;
        if(pSel)
            sEntry = *(String*)pSel->GetUserData();
        pExampleFrame->ExecUndo();
        uno::Reference< text::XTextCursor > & xCrsr = pExampleFrame->GetTextCursor();
        OUString uEntry(sEntry);
        if(sEntry.Len() && xGroup->hasByName(uEntry))
        {
            uno::Any aEntry(xGroup->getByName(uEntry));
            uno::Reference< text::XAutoTextEntry >  xEntry = *(uno::Reference< text::XAutoTextEntry > *)aEntry.getValue();
            if(xEntry.is())
            {
                uno::Reference< text::XTextRange >  xRange(xCrsr, uno::UNO_QUERY);
                xEntry->applyTo(xRange);
            }
            UpdateFields();
        }
    }
    return 0;
}
/* -----------------01.10.99 11:59-------------------

 --------------------------------------------------*/
void    SwVisitingCardPage::UpdateFields()
{
    uno::Reference< frame::XModel >  xModel;
    if(pExampleFrame && (xModel = pExampleFrame->GetModel()).is())
    {
        SwLabDlg::UpdateFieldInformation(xModel, aLabItem);
    }
}
/* -----------------01.10.99 15:16-------------------

 --------------------------------------------------*/
void SwLabDlg::UpdateFieldInformation(uno::Reference< frame::XModel > & xModel, const SwLabItem& rItem)
{
    uno::Reference< text::XTextFieldsSupplier >  xFlds(xModel, uno::UNO_QUERY);
    uno::Reference< container::XNameAccess >  xFldMasters = xFlds->getTextFieldMasters();

    try
    {
        lcl_SetUserField(xFldMasters, CL2S(USER_FIELD_FIRSTNAME     ), rItem.aPrivFirstName );
        lcl_SetUserField(xFldMasters, CL2S(USER_FIELD_NAME          ), rItem.aPrivName               );
        lcl_SetUserField(xFldMasters, CL2S(USER_FIELD_PRIVSHORTCUT  ), rItem.aPrivShortCut           );
        lcl_SetUserField(xFldMasters, CL2S(USER_FIELD_FIRSTNAME_2   ), rItem.aPrivFirstName2 );
        lcl_SetUserField(xFldMasters, CL2S(USER_FIELD_NAME_2        ), rItem.aPrivName2               );
        lcl_SetUserField(xFldMasters, CL2S(USER_FIELD_PRIVSHORTCUT_2 ), rItem.aPrivShortCut2           );
        lcl_SetUserField(xFldMasters, CL2S(USER_FIELD_PRIVSTREET        ), rItem.aPrivStreet             );
        lcl_SetUserField(xFldMasters, CL2S(USER_FIELD_PRIVZIP       ), rItem.aPrivZip                );
        lcl_SetUserField(xFldMasters, CL2S(USER_FIELD_PRIVCITY      ), rItem.aPrivCity               );
        lcl_SetUserField(xFldMasters, CL2S(USER_FIELD_PRIVCOUNTRY   ), rItem.aPrivCountry            );
        lcl_SetUserField(xFldMasters, CL2S(USER_FIELD_PRIVSTATE     ), rItem.aPrivState              );
        lcl_SetUserField(xFldMasters, CL2S(USER_FIELD_PRIVTITLE     ), rItem.aPrivTitle              );
        lcl_SetUserField(xFldMasters, CL2S(USER_FIELD_PRIVPROFESSION    ), rItem.aPrivProfession         );
        lcl_SetUserField(xFldMasters, CL2S(USER_FIELD_PRIVPHONE     ), rItem.aPrivPhone              );
        lcl_SetUserField(xFldMasters, CL2S(USER_FIELD_PRIVMOBILE        ), rItem.aPrivMobile             );
        lcl_SetUserField(xFldMasters, CL2S(USER_FIELD_PRIVFAX       ), rItem.aPrivFax                );
        lcl_SetUserField(xFldMasters, CL2S(USER_FIELD_PRIVWWW       ), rItem.aPrivWWW                );
        lcl_SetUserField(xFldMasters, CL2S(USER_FIELD_PRIVMAIL      ), rItem.aPrivMail               );
        lcl_SetUserField(xFldMasters, CL2S(USER_FIELD_COMPCOMPANY   ), rItem.aCompCompany            );
        lcl_SetUserField(xFldMasters, CL2S(USER_FIELD_COMPCOMPANYEXT    ), rItem.aCompCompanyExt         );
        lcl_SetUserField(xFldMasters, CL2S(USER_FIELD_COMPSLOGAN        ), rItem.aCompSlogan             );
        lcl_SetUserField(xFldMasters, CL2S(USER_FIELD_COMPSTREET        ), rItem.aCompStreet             );
        lcl_SetUserField(xFldMasters, CL2S(USER_FIELD_COMPZIP       ), rItem.aCompZip                );
        lcl_SetUserField(xFldMasters, CL2S(USER_FIELD_COMPCITY      ), rItem.aCompCity               );
        lcl_SetUserField(xFldMasters, CL2S(USER_FIELD_COMPCOUNTRY   ), rItem.aCompCountry            );
        lcl_SetUserField(xFldMasters, CL2S(USER_FIELD_COMPSTATE     ), rItem.aCompState              );
        lcl_SetUserField(xFldMasters, CL2S(USER_FIELD_COMPPOSITION  ), rItem.aCompPosition           );
        lcl_SetUserField(xFldMasters, CL2S(USER_FIELD_COMPPHONE     ), rItem.aCompPhone              );
        lcl_SetUserField(xFldMasters, CL2S(USER_FIELD_COMPMOBILE        ), rItem.aCompMobile             );
        lcl_SetUserField(xFldMasters, CL2S(USER_FIELD_COMPFAX       ), rItem.aCompFax                );
        lcl_SetUserField(xFldMasters, CL2S(USER_FIELD_COMPWWW       ), rItem.aCompWWW                );
        lcl_SetUserField(xFldMasters, CL2S(USER_FIELD_COMPMAIL      ), rItem.aCompMail               );
    }
    catch( uno::RuntimeException&)
    {
        //
    }

    uno::Reference< container::XEnumerationAccess >  xFldAcc = xFlds->getTextFields();
    uno::Reference< util::XRefreshable >  xRefresh(xFldAcc, uno::UNO_QUERY);
    xRefresh->refresh();
}

/* -----------------29.09.99 08:55-------------------

 --------------------------------------------------*/
SwPrivateDataPage::SwPrivateDataPage(Window* pParent, const SfxItemSet& rSet) :
    SfxTabPage(pParent, SW_RES(TP_PRIVATE_DATA), rSet),
    aDataGB(this, ResId(        GB_DATA         )),
    aNameFT(this, ResId(        FT_NAME         )),
    aFirstNameED(this, ResId(   ED_FIRSTNAME    )),
    aNameED(this, ResId(        ED_NAME         )),
    aShortCutED(this, ResId(    ED_SHORTCUT     )),
    aName2FT(this, ResId(       FT_NAME_2       )),
    aFirstName2ED(this, ResId(  ED_FIRSTNAME_2  )),
    aName2ED(this, ResId(       ED_NAME_2       )),
    aShortCut2ED(this, ResId(   ED_SHORTCUT_2   )),
    aStreetFT(this, ResId(      FT_STREET       )),
    aStreetED(this, ResId(      ED_STREET       )),
    aZipCityFT(this, ResId(     FT_ZIPCITY      )),
    aZipED(this, ResId(         ED_ZIP          )),
    aCityED(this, ResId(        ED_CITY         )),
    aCountryStateFT(this, ResId(FT_COUNTRYSTATE )),
    aCountryED(this, ResId(     ED_COUNTRY      )),
    aStateED(this, ResId(       ED_STATE        )),
    aTitleProfessionFT(this, ResId(FT_TITLEPROF )),
    aProfessionED(this, ResId(  ED_PROFESSION   )),
    aTitleED(this, ResId(       ED_TITLE        )),
    aPhoneFT(this, ResId(       FT_PHONE        )),
    aPhoneED(this, ResId(       ED_PHONE        )),
    aMobilePhoneED(this, ResId( ED_MOBILE       )),
    aFaxFT(this, ResId(         FT_FAX          )),
    aFaxED(this, ResId(         ED_FAX          )),
    aWWWMailFT(this, ResId(     FT_WWWMAIL      )),
    aHomePageED(this, ResId(    ED_WWW          )),
    aMailED(this, ResId(        ED_MAIL         ))
{
    FreeResource();
    SetExchangeSupport();
}

/*-- 29.09.99 08:55:57---------------------------------------------------

  -----------------------------------------------------------------------*/
SwPrivateDataPage::~SwPrivateDataPage()
{
}
/*-- 29.09.99 08:55:57---------------------------------------------------

  -----------------------------------------------------------------------*/
SfxTabPage* SwPrivateDataPage::Create(Window* pParent, const SfxItemSet& rSet)
{
    return new SwPrivateDataPage(pParent, rSet);
}
/*-- 29.09.99 08:55:57---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwPrivateDataPage::ActivatePage(const SfxItemSet& rSet)
{
    Reset(rSet);
}
/*-- 29.09.99 08:55:58---------------------------------------------------

  -----------------------------------------------------------------------*/
int  SwPrivateDataPage::DeactivatePage(SfxItemSet* pSet)
{
    if (pSet)
        FillItemSet(*pSet);
    return LEAVE_PAGE;
}
/*-- 29.09.99 08:55:58---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Bool SwPrivateDataPage::FillItemSet(SfxItemSet& rSet)
{

    SwLabItem aItem = (const SwLabItem&) GetTabDialog()->GetExampleSet()->Get(FN_LABEL);
    aItem.aPrivFirstName = aFirstNameED .GetText();
    aItem.aPrivName      = aNameED      .GetText(  );
    aItem.aPrivShortCut  = aShortCutED  .GetText(  );
    aItem.aPrivFirstName2 = aFirstName2ED   .GetText();
    aItem.aPrivName2     = aName2ED     .GetText(  );
    aItem.aPrivShortCut2 = aShortCut2ED .GetText(  );
    aItem.aPrivStreet    = aStreetED    .GetText(  );
    aItem.aPrivZip       = aZipED       .GetText(  );
    aItem.aPrivCity      = aCityED      .GetText(  );
    aItem.aPrivCountry   = aCountryED   .GetText(  );
    aItem.aPrivState     = aStateED     .GetText(  );
    aItem.aPrivTitle     = aTitleED     .GetText(  );
    aItem.aPrivProfession= aProfessionED.GetText(   );
    aItem.aPrivPhone     = aPhoneED     .GetText(  );
    aItem.aPrivMobile    = aMobilePhoneED.GetText(  );
    aItem.aPrivFax       = aFaxED       .GetText(  );
    aItem.aPrivWWW       = aHomePageED  .GetText(  );
    aItem.aPrivMail      = aMailED      .GetText(  );

    rSet.Put(aItem);
    return sal_True;
}
/*-- 29.09.99 08:55:59---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwPrivateDataPage::Reset(const SfxItemSet& rSet)
{
    const SwLabItem& aItem = (const SwLabItem&) rSet.Get(FN_LABEL);
    aFirstNameED.SetText(aItem.aPrivFirstName);
    aNameED     .SetText(aItem.aPrivName);
    aShortCutED .SetText(aItem.aPrivShortCut);
    aFirstName2ED.SetText(aItem.aPrivFirstName2);
    aName2ED     .SetText(aItem.aPrivName2);
    aShortCut2ED .SetText(aItem.aPrivShortCut2);
    aStreetED   .SetText(aItem.aPrivStreet);
    aZipED      .SetText(aItem.aPrivZip);
    aCityED     .SetText(aItem.aPrivCity);
    aCountryED  .SetText(aItem.aPrivCountry);
    aStateED    .SetText(aItem.aPrivState);
    aTitleED    .SetText(aItem.aPrivTitle);
    aProfessionED.SetText(aItem.aPrivProfession);
    aPhoneED    .SetText(aItem.aPrivPhone);
    aMobilePhoneED.SetText(aItem.aPrivMobile);
    aFaxED      .SetText(aItem.aPrivFax);
    aHomePageED .SetText(aItem.aPrivWWW);
    aMailED     .SetText(aItem.aPrivMail);
}
/* -----------------29.09.99 08:56-------------------

 --------------------------------------------------*/
SwBusinessDataPage::SwBusinessDataPage(Window* pParent, const SfxItemSet& rSet) :
    SfxTabPage(pParent, SW_RES(TP_BUSINESS_DATA), rSet),
    aDataGB(this, ResId(GB_DATA)),
    aCompanyFT(this, ResId(     FT_COMP     )),
    aCompanyED(this, ResId(     ED_COMP     )),
    aCompanyExtFT(this, ResId(  FT_COMP_EXT )),
    aCompanyExtED(this, ResId(  ED_COMP_EXT )),
    aSloganFT(this, ResId(      FT_SLOGAN   )),
    aSloganED(this, ResId(      ED_SLOGAN   )),
    aStreetFT(this, ResId(      FT_STREET   )),
    aStreetED(this, ResId(      ED_STREET   )),
    aZipCityFT(this, ResId(     FT_ZIPCITY  )),
    aZipED(this, ResId(         ED_ZIP      )),
    aCityED(this, ResId(        ED_CITY     )),
    aCountryStateFT(this, ResId(FT_COUNTRYSTATE )),
    aCountryED(this, ResId(     ED_COUNTRY  )),
    aStateED(this, ResId(       ED_STATE    )),
    aPositionFT(this, ResId(    FT_POSITION )),
    aPositionED(this, ResId(    ED_POSITION )),
    aPhoneFT(this, ResId(       FT_PHONE    )),
    aPhoneED(this, ResId(       ED_PHONE    )),
    aMobilePhoneED(this, ResId( ED_MOBILE   )),
    aFaxED(this, ResId(         ED_FAX      )),
    aWWWMailFT(this, ResId(     FT_WWWMAIL  )),
    aHomePageED(this, ResId(    ED_WWW      )),
    aMailED(this, ResId(        ED_MAIL     ))
{
    FreeResource();
    SetExchangeSupport();
}

/*-- 29.09.99 08:56:06---------------------------------------------------

  -----------------------------------------------------------------------*/
SwBusinessDataPage::~SwBusinessDataPage()
{
}
/*-- 29.09.99 08:56:06---------------------------------------------------

  -----------------------------------------------------------------------*/
SfxTabPage* SwBusinessDataPage::Create(Window* pParent, const SfxItemSet& rSet)
{
    return new SwBusinessDataPage(pParent, rSet);
}
/*-- 29.09.99 08:56:06---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwBusinessDataPage::ActivatePage(const SfxItemSet& rSet)
{
    Reset(rSet);
}
/*-- 29.09.99 08:56:06---------------------------------------------------

  -----------------------------------------------------------------------*/
int  SwBusinessDataPage::DeactivatePage(SfxItemSet* pSet)
{
    if (pSet)
        FillItemSet(*pSet);
    return LEAVE_PAGE;
}
/*-- 29.09.99 08:56:06---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Bool SwBusinessDataPage::FillItemSet(SfxItemSet& rSet)
{
    SwLabItem aItem = (const SwLabItem&) GetTabDialog()->GetExampleSet()->Get(FN_LABEL);

    aItem.aCompCompany   = aCompanyED      .GetText();
    aItem.aCompCompanyExt= aCompanyExtED   .GetText();
    aItem.aCompSlogan    = aSloganED       .GetText();
    aItem.aCompStreet    = aStreetED       .GetText();
    aItem.aCompZip       = aZipED          .GetText();
    aItem.aCompCity      = aCityED         .GetText();
    aItem.aCompCountry   = aCountryED      .GetText();
    aItem.aCompState     = aStateED        .GetText();
    aItem.aCompPosition  = aPositionED     .GetText();
    aItem.aCompPhone     = aPhoneED        .GetText();
    aItem.aCompMobile    = aMobilePhoneED  .GetText();
    aItem.aCompFax       = aFaxED          .GetText();
    aItem.aCompWWW       = aHomePageED     .GetText();
    aItem.aCompMail      = aMailED         .GetText();

    rSet.Put(aItem);
    return sal_True;
}
/*-- 29.09.99 08:56:07---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwBusinessDataPage::Reset(const SfxItemSet& rSet)
{
    const SwLabItem& aItem = (const SwLabItem&) rSet.Get(FN_LABEL);
    aCompanyED      .SetText(aItem.aCompCompany);
    aCompanyExtED   .SetText(aItem.aCompCompanyExt);
    aSloganED       .SetText(aItem.aCompSlogan);
    aStreetED       .SetText(aItem.aCompStreet);
    aZipED          .SetText(aItem.aCompZip);
    aCityED         .SetText(aItem.aCompCity);
    aCountryED      .SetText(aItem.aCompCountry);
    aStateED        .SetText(aItem.aCompState);
    aPositionED     .SetText(aItem.aCompPosition);
    aPhoneED        .SetText(aItem.aCompPhone);
    aMobilePhoneED  .SetText(aItem.aCompMobile);
    aFaxED          .SetText(aItem.aCompFax);
    aHomePageED     .SetText(aItem.aCompWWW);
    aMailED         .SetText(aItem.aCompMail);
}

/*-----------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.136  2000/09/18 16:05:25  willem.vandorp
    OpenOffice header added.

    Revision 1.135  2000/07/18 12:50:08  os
    replace ofadbmgr

    Revision 1.134  2000/06/21 13:54:54  os
    unicode error remvoed

    Revision 1.133  2000/06/16 08:31:13  martin.hollmichel
    add: header

    Revision 1.132  2000/06/13 09:59:42  os
    using UCB

    Revision 1.131  2000/05/30 15:09:06  jp
    Bugfix and optimation for unicode

    Revision 1.130  2000/05/16 17:29:11  jp
    Changes for Unicode

    Revision 1.129  2000/05/16 09:15:12  os
    project usr removed

    Revision 1.128  2000/04/18 15:31:35  os
    UNICODE

    Revision 1.127  2000/03/23 08:20:15  os
    UNO III

    Revision 1.126  2000/03/06 15:45:05  os
    #73802# preview improved

    Revision 1.125  2000/02/24 17:37:08  hr
    43447#: gcc

    Revision 1.124  2000/02/14 14:47:58  os
    #70473# Unicode

    Revision 1.123  2000/02/10 11:31:39  os
    #70359# titles added to AutoText groups

    Revision 1.122  2000/02/09 14:08:55  os
    #72787# HelpId added

    Revision 1.121  2000/01/13 11:40:09  os
    #71840# check selected entry

    Revision 1.120  1999/12/27 09:52:27  os
    #71262# Undo in SwOneExampleFrame; TreeListBox as AutoText - box

    Revision 1.119  1999/12/07 16:34:13  os
    #70355##70559# SHORTCUT->INITIALS; second private name

    Revision 1.118  1999/11/26 11:27:36  os
    #70154# check if the text block is available

    Revision 1.117  1999/11/25 15:42:54  os
    headers corrected

    Revision 1.116  1999/11/23 08:14:51  os
    header corrected

    Revision 1.115  1999/11/19 16:40:22  os
    modules renamed

    Revision 1.114  1999/11/19 14:08:47  os
    #69462# Names corrected

    Revision 1.113  1999/11/10 15:39:22  os
    SwOneExampleFrame: CTor changed

    Revision 1.112  1999/11/10 10:53:07  tl
    includes rearranged

    Revision 1.111  1999/10/21 17:48:05  jp
    have to change - SearchFile with SfxIniManager, dont use SwFinder for this

    Revision 1.110  1999/10/08 10:00:05  jp
    no cast from GetpApp to SfxApp

    Revision 1.109  1999/10/01 13:41:17  os
    apply AutoText to business cards

    Revision 1.108  1999/10/01 12:03:55  os
    all fields are available

    Revision 1.107  1999/09/30 07:52:42  os
    new pages for business cards

    Revision 1.106  1999/09/28 13:36:41  os
    #67382# separate dialog for business cards; survive without data base

    Revision 1.105  1999/09/24 13:53:09  os
    chg: ODbRow/ODbVariant - includes moved

    Revision 1.104  1999/09/10 13:07:12  os
    TRY/CATCH block in StarOne AutoText access

    Revision 1.103  1999/08/26 17:36:00  JP
    no cast from GetpApp to SfxApp


      Rev 1.102   26 Aug 1999 19:36:00   JP
   no cast from GetpApp to SfxApp

      Rev 1.101   28 Jul 1999 13:05:08   OS
   new: SwOneExampleFrame

      Rev 1.100   23 Jul 1999 10:06:00   OS
   visiting cards tabpage

      Rev 1.99   19 Jul 1999 15:58:42   MA
   pass a Parent to the wait object

      Rev 1.98   13 Jul 1999 09:32:50   OS
   visiting cards TabPage

      Rev 1.97   09 Jun 1999 19:34:42   JP
   have to change: no cast from GetpApp to SfxApp/OffApp, SfxShell only subclass of SfxApp

      Rev 1.96   10 Feb 1999 14:33:10   MA
   #61674# Direktdruck fuer Etiketten entfernt

      Rev 1.95   07 Sep 1998 16:59:30   OM
   #55930# Einzelnes Etikett an der korrekten Position drucken

      Rev 1.94   09 Jul 1998 09:52:32   JP
   EmptyStr benutzen

      Rev 1.93   14 Mar 1998 15:12:50   OM
   ExchangeSupport repariert/implementiert

      Rev 1.92   14 Mar 1998 14:26:46   OM
   ExchangeSupport repariert/implementiert

      Rev 1.91   14 Mar 1998 14:10:22   OM
   ExchangeSupport repariert/implementiert

      Rev 1.90   24 Nov 1997 11:52:12   MA
   includes

      Rev 1.89   03 Nov 1997 13:17:12   MA
   precomp entfernt

      Rev 1.88   03 Sep 1997 13:59:14   OM
   #36627# Sinnvolle Fehlermeldungen liefern

      Rev 1.87   02 Sep 1997 09:58:24   OM
   SDB-Headeranpassung

      Rev 1.86   05 May 1997 11:16:30   OM
   Hilfetext fuer OK loeschen

      Rev 1.85   29 Apr 1997 17:09:50   OM
   HelpID fuer UserButton

      Rev 1.84   21 Apr 1997 15:54:50   OM
   #39002# GPF Etiketten gefixt

      Rev 1.83   14 Apr 1997 12:03:36   OM
   #38747# GPF nach Etikettenauswahl behoben

      Rev 1.82   08 Apr 1997 10:10:12   NF
   includes...

      Rev 1.81   04 Apr 1997 14:04:54   OM
   HelpIDs fuer DruckButton

      Rev 1.80   25 Feb 1997 22:47:40   OM
   Unvollstaendige Datenbank am Dialog korrigiert

      Rev 1.79   20 Feb 1997 18:50:12   MA
   fix: letzte Datenbank merken

      Rev 1.78   20 Feb 1997 17:51:40   MA
   fix: Deactivate ueber Fill

      Rev 1.77   04 Dec 1996 13:54:02   OM
   Kein konstanter AdressDBName mehr

      Rev 1.76   11 Nov 1996 09:44:18   MA
   ResMgr

      Rev 1.75   29 Oct 1996 17:59:28   HJS
   includes

      Rev 1.74   24 Oct 1996 13:36:10   JP
   String Umstellung: [] -> GetChar()

      Rev 1.73   25 Sep 1996 14:11:12   OM
   Neue Datenbanktrenner

      Rev 1.72   16 Aug 1996 13:46:18   TRI
   C40_INSERT statt Insert

      Rev 1.71   05 Aug 1996 15:17:36   OM
   Datenbankumstellung

      Rev 1.70   26 Jul 1996 20:36:36   MA
   includes

      Rev 1.69   17 Jul 1996 13:47:04   OM
   Datenbankumstellung 327

*/



diff --git a/sw/source/ui/envelp/labfmt.cxx b/sw/source/ui/envelp/labfmt.cxx
new file mode 100644
index 0000000..01c6edb
--- /dev/null
+++ b/sw/source/ui/envelp/labfmt.cxx
@@ -0,0 +1,754 @@
/*************************************************************************
 *
 *  $RCSfile: labfmt.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:35 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SV_POLY_HXX //autogen
#include <vcl/poly.hxx>
#endif


#include "swtypes.hxx"
#include "cmdid.h"
#include "label.hxx"
#include "labimp.hxx"
#include "labimg.hxx"
#include "labfmt.hxx"
#include "uitool.hxx"

#include "label.hrc"
#include "labfmt.hrc"


// #define ------------------------------------------------------------------

#define ROUND(x) ((USHORT) ((x) + .5))

// --------------------------------------------------------------------------



SwLabPreview::SwLabPreview( const SwLabFmtPage* pParent, const ResId& rResID ) :

    Window((Window*) pParent, rResID),

    aHDistStr (SW_RES(STR_HDIST )),
    aVDistStr (SW_RES(STR_VDIST )),
    aWidthStr (SW_RES(STR_WIDTH )),
    aHeightStr(SW_RES(STR_HEIGHT)),
    aLeftStr  (SW_RES(STR_LEFT  )),
    aUpperStr (SW_RES(STR_UPPER )),
    aColsStr  (SW_RES(STR_COLS  )),
    aRowsStr  (SW_RES(STR_ROWS  )),
    aBlackColor(COL_BLACK),
    aGrayColor(COL_LIGHTGRAY),
    aWhiteColor(COL_WHITE)

{
    SetMapMode(MAP_PIXEL);

    const Size aSz(GetOutputSizePixel());

    lOutWPix   = aSz.Width ();
    lOutHPix   = aSz.Height();


    SetBackground(Wallpaper(aWhiteColor));

    Font aFont = GetFont();
    aFont.SetFillColor(Color(COL_WHITE));
    aFont.SetWeight  (WEIGHT_NORMAL);
    SetFont(aFont);

    lHDistWidth  = GetTextWidth(aHDistStr );
    lVDistWidth  = GetTextWidth(aVDistStr );
    lHeightWidth = GetTextWidth(aHeightStr);
    lLeftWidth   = GetTextWidth(aLeftStr  );
    lUpperWidth  = GetTextWidth(aUpperStr );
    lColsWidth   = GetTextWidth(aColsStr  );

    lXHeight = GetTextHeight();
    lXWidth  = GetTextWidth('X');

    // Skalierungsfaktor
    float fx = (float)(lOutWPix - (2 * (lLeftWidth + 15))) / (float)lOutWPix;

    lOutWPix23 = (long)((float)lOutWPix * fx);
    lOutHPix23 = (long)((float)lOutHPix * fx);
}

// --------------------------------------------------------------------------



SwLabPreview::~SwLabPreview()
{
}

// --------------------------------------------------------------------------



void SwLabPreview::Paint(const Rectangle &rRect)
{
    SetLineColor(aWhiteColor);
    SetFillColor(aGrayColor);
    Font aPaintFont(GetFont());
    aPaintFont.SetTransparent(FALSE);
    SetFont(aPaintFont);

    // Groesse des darzustellenden Bereichs
    long lDispW = ROUND(aItem.lLeft  + aItem.lHDist);
    long lDispH = ROUND(aItem.lUpper + aItem.lVDist);
    if (aItem.nCols == 1)
        lDispW += ROUND(aItem.lLeft );
    else
        lDispW += ROUND(aItem.lHDist / 10);
    if (aItem.nRows == 1)
        lDispH += ROUND(aItem.lUpper);
    else
        lDispH += ROUND(aItem.lVDist / 10);

    // Skalierungsfaktor
    float fx = (float) lOutWPix23 / Max(1L, lDispW),
          fy = (float) lOutHPix23 / Max(1L, lDispH),
          f  = fx < fy ? fx : fy;

    // Nullpunkt
    long lOutlineW = ROUND(f * lDispW);
    long lOutlineH = ROUND(f * lDispH);

    long lX0 = (lOutWPix - lOutlineW) / 2;
    long lY0 = (lOutHPix - lOutlineH) / 2;
    long lX1 = ROUND(lX0 + f *  aItem.lLeft );
    long lY1 = ROUND(lY0 + f *  aItem.lUpper);
    long lX2 = ROUND(lX0 + f * (aItem.lLeft  + aItem.lWidth ));
    long lY2 = ROUND(lY0 + f * (aItem.lUpper + aItem.lHeight));
    long lX3 = ROUND(lX0 + f * (aItem.lLeft  + aItem.lHDist ));
    long lY3 = ROUND(lY0 + f * (aItem.lUpper + aItem.lVDist ));

    // Umriss zeichnen (Flaeche)
    DrawRect(Rectangle(Point(lX0, lY0), Size(lOutlineW, lOutlineH)));

    // Umriss zeichnen (Umrandung)
    SetLineColor(aBlackColor);
    DrawLine(Point(lX0, lY0), Point(lX0 + lOutlineW - 1, lY0)); // Oben
    DrawLine(Point(lX0, lY0), Point(lX0, lY0 + lOutlineH - 1)); // Links
    if (aItem.nCols == 1)
        DrawLine(Point(lX0 + lOutlineW - 1, lY0), Point(lX0 + lOutlineW - 1, lY0 + lOutlineH - 1)); // Rechts
    if (aItem.nRows == 1)
        DrawLine(Point(lX0, lY0 + lOutlineH - 1), Point(lX0 + lOutlineW - 1, lY0 + lOutlineH - 1)); // Unten

    // Etiketten
    SetClipRegion (Rectangle(Point(lX0, lY0), Size(lOutlineW, lOutlineH)));
    SetFillColor(aWhiteColor);
    for (USHORT nRow = 0; nRow < Min((USHORT) 2, (USHORT) aItem.nRows); nRow++)
        for (USHORT nCol = 0; nCol < Min((USHORT) 2, (USHORT) aItem.nCols); nCol++)
            DrawRect(Rectangle(
              Point(ROUND(lX0 + f * (aItem.lLeft  + nCol * aItem.lHDist)),
                    ROUND(lY0 + f * (aItem.lUpper + nRow * aItem.lVDist))),
              Size (ROUND(f * aItem.lWidth ),
                    ROUND(f * aItem.lHeight))));
    SetClipRegion();

    // Beschritung: Rand links
    if (aItem.lLeft)
    {
        long lX = (lX0 + lX1) / 2;
        DrawArrow(Point(lX0, lY0 - 5), Point(lX1, lY0 - 5), FALSE);
        DrawArrow(Point(lX, lY0 - 10), Point(lX, lY0 - 5), TRUE);
        DrawText(Point(lX1 - lLeftWidth, lY0 - 10 - lXHeight), aLeftStr);
    }

    // Beschriftung: Rand oben
    if (aItem.lUpper)
    {
        DrawArrow(Point(lX0 - 5, lY0), Point(lX0 - 5, lY1), FALSE);
        DrawText(Point(lX0 - 10 - lUpperWidth, ROUND(lY0 + f * aItem.lUpper / 2 - lXHeight / 2)), aUpperStr);
    }

    // Beschriftung: Breite und Hoehe
    {
        long lX = lX2 - lXWidth / 2 - lHeightWidth / 2;
        long lY = lY1 + lXHeight;

        DrawLine(Point(lX1, lY), Point(lX2 - 1, lY));
        DrawLine(Point(lX, lY1), Point(lX, lY2 - 1));

        DrawText(Point(lX1 + lXWidth / 2, lY - lXHeight / 2), aWidthStr);
        DrawText(Point(lX - lHeightWidth / 2, lY2 - lXHeight - lXHeight / 2), aHeightStr);
    }

    // Beschriftung: Horz. Abstand
    if (aItem.nCols > 1)
    {
        long lX = (lX1 + lX3) / 2;
        DrawArrow(Point(lX1, lY0 - 5), Point(lX3, lY0 - 5), FALSE);
        DrawArrow(Point(lX, lY0 - 10), Point(lX, lY0 - 5), TRUE);
        DrawText(Point(lX - lHDistWidth / 2, lY0 - 10 - lXHeight), aHDistStr);
    }

    // Beschriftung: Vertikaler Abstand
    if (aItem.nRows > 1)
    {
        DrawArrow(Point(lX0 - 5, lY1), Point(lX0 - 5, lY3), FALSE);
        DrawText(Point(lX0 - 10 - lVDistWidth, ROUND(lY1 + f * aItem.lVDist / 2 - lXHeight / 2)), aVDistStr);
    }

    // Beschriftung: Spalten
    {
        long lY = lY0 + lOutlineH + 4;
        DrawArrow(Point(lX0, lY), Point(lX0 + lOutlineW - 1, lY), TRUE);
        DrawText(Point((lX0 + lX0 + lOutlineW - 1) / 2 - lColsWidth / 2, lY + 5), aColsStr);
    }

    // Beschriftung: Zeilen
    {
        long lX = lX0 + lOutlineW + 4;
        DrawArrow(Point(lX, lY0), Point(lX, lY0 + lOutlineH - 1), TRUE);
        DrawText(Point(lX + 5, (lY0 + lY0 + lOutlineH - 1 - lXHeight / 2) / 2), aRowsStr);
    }
}

// Pfeil bzw. Intervall zeichnen --------------------------------------------



void SwLabPreview::DrawArrow(const Point &rP1, const Point &rP2, BOOL bArrow)
{
    DrawLine(rP1, rP2);

    if (bArrow)
    {
        Point aArr[3];

        // Pfeil zeichnen
        if (rP1.Y() == rP2.Y())
        {
            // Waagerecht
            aArr[0].X() = rP2.X() - 5;
            aArr[0].Y() = rP2.Y() - 2;
            aArr[1].X() = rP2.X();
            aArr[1].Y() = rP2.Y();
            aArr[2].X() = rP2.X() - 5;
            aArr[2].Y() = rP2.Y() + 2;
        }
        else
        {
            // Senkrecht
            aArr[0].X() = rP2.X() - 2;
            aArr[0].Y() = rP2.Y() - 5;
            aArr[1].X() = rP2.X() + 2;
            aArr[1].Y() = rP2.Y() - 5;
            aArr[2].X() = rP2.X();
            aArr[2].Y() = rP2.Y();
        }

        SetFillColor(aBlackColor);
        DrawPolygon(Polygon(3, aArr));
    }
    else
    {
        // Intervall zeichnen
        if (rP1.Y() == rP2.Y())
        {
            // Waagerecht
            DrawLine(Point(rP1.X(), rP1.Y() - 2), Point(rP1.X(), rP1.Y() + 2));
            DrawLine(Point(rP2.X(), rP2.Y() - 2), Point(rP2.X(), rP2.Y() + 2));
        }
        else
        {
            // Senkrecht
            DrawLine(Point(rP1.X() - 2, rP1.Y()), Point(rP1.X() + 2, rP1.Y()));
            DrawLine(Point(rP2.X() - 2, rP2.Y()), Point(rP2.X() + 2, rP2.Y()));
        }
    }
}

// --------------------------------------------------------------------------

void SwLabPreview::Update(const SwLabItem& rItem)
{
    aItem = rItem;
    Invalidate();
}

// --------------------------------------------------------------------------



SwLabFmtPage::SwLabFmtPage(Window* pParent, const SfxItemSet& rSet) :

    SfxTabPage(pParent, SW_RES(TP_LAB_FMT), rSet),
    aItem        ((const SwLabItem&) rSet.Get(FN_LABEL)),

    aPreview     (this, SW_RES(WIN_PREVIEW)),
    aHDistText   (this, SW_RES(TXT_HDIST  )),
    aHDistField  (this, SW_RES(FLD_HDIST  )),
    aVDistText   (this, SW_RES(TXT_VDIST  )),
    aVDistField  (this, SW_RES(FLD_VDIST  )),
    aWidthText   (this, SW_RES(TXT_WIDTH  )),
    aWidthField  (this, SW_RES(FLD_WIDTH  )),
    aHeightText  (this, SW_RES(TXT_HEIGHT )),
    aHeightField (this, SW_RES(FLD_HEIGHT )),
    aLeftText    (this, SW_RES(TXT_LEFT  )),
    aLeftField   (this, SW_RES(FLD_LEFT  )),
    aUpperText   (this, SW_RES(TXT_UPPER  )),
    aUpperField  (this, SW_RES(FLD_UPPER  )),
    aColsText    (this, SW_RES(TXT_COLUMNS)),
    aColsField   (this, SW_RES(FLD_COLUMNS)),
    aRowsText    (this, SW_RES(TXT_ROWS  )),
    aRowsField   (this, SW_RES(FLD_ROWS  )),

    bModified(FALSE)

{
    FreeResource();
    SetExchangeSupport();

    // Metriken
    FieldUnit aMetric = ::GetDfltMetric(FALSE);
    SetMetric(aHDistField , aMetric);
    SetMetric(aVDistField , aMetric);
    SetMetric(aWidthField , aMetric);
    SetMetric(aHeightField, aMetric);
    SetMetric(aLeftField  , aMetric);
    SetMetric(aUpperField , aMetric);

    // Handler installieren
    Link aLk = LINK(this, SwLabFmtPage, ModifyHdl);
    aHDistField .SetModifyHdl( aLk );
    aVDistField .SetModifyHdl( aLk );
    aWidthField .SetModifyHdl( aLk );
    aHeightField.SetModifyHdl( aLk );
    aLeftField  .SetModifyHdl( aLk );
    aUpperField .SetModifyHdl( aLk );
    aColsField  .SetModifyHdl( aLk );
    aRowsField  .SetModifyHdl( aLk );

    aLk = LINK(this, SwLabFmtPage, LoseFocusHdl);
    aHDistField .SetLoseFocusHdl( aLk );
    aVDistField .SetLoseFocusHdl( aLk );
    aWidthField .SetLoseFocusHdl( aLk );
    aHeightField.SetLoseFocusHdl( aLk );
    aLeftField  .SetLoseFocusHdl( aLk );
    aUpperField .SetLoseFocusHdl( aLk );
    aColsField  .SetLoseFocusHdl( aLk );
    aRowsField  .SetLoseFocusHdl( aLk );

    // Timer einstellen
    aPreviewTimer.SetTimeout(1000);
    aPreviewTimer.SetTimeoutHdl(LINK(this, SwLabFmtPage, PreviewHdl));
}

// --------------------------------------------------------------------------



SwLabFmtPage::~SwLabFmtPage()
{
}

// Modify-Handler der MetricFields. Preview-Timer starten -------------------



IMPL_LINK_INLINE_START( SwLabFmtPage, ModifyHdl, Edit *, EMPTYARG )
{
    bModified = TRUE;
    aPreviewTimer.Start();
    return 0;
}
IMPL_LINK_INLINE_END( SwLabFmtPage, ModifyHdl, Edit *, EMPTYARG )

// Preview invalidaten ------------------------------------------------------



IMPL_LINK_INLINE_START( SwLabFmtPage, PreviewHdl, Timer *, EMPTYARG )
{
    aPreviewTimer.Stop();
    ChangeMinMax();
    FillItem( aItem );
    aPreview.Update( aItem );

    return 0;
}
IMPL_LINK_INLINE_END( SwLabFmtPage, PreviewHdl, Timer *, EMPTYARG )

// LoseFocus-Handler: Bei Aenderung sofort updaten --------------------------



IMPL_LINK_INLINE_START( SwLabFmtPage, LoseFocusHdl, Control *, pControl )
{
    if (((Edit*) pControl)->IsModified())
        PreviewHdl(0);
    return 0;
}
IMPL_LINK_INLINE_END( SwLabFmtPage, LoseFocusHdl, Control *, pControl )

// Minima und Maxima fuer Fields festlegen ----------------------------------


void SwLabFmtPage::ChangeMinMax()
{
    long lMax = 31748; // 56 cm

    // Min und Max

    long lLeft  = GETFLDVAL(aLeftField ),
         lUpper = GETFLDVAL(aUpperField),
         lHDist = GETFLDVAL(aHDistField),
         lVDist = GETFLDVAL(aVDistField);

    long nMinSize = 10; // 0,1cm

    aHDistField .SetMin(nMinSize, FUNIT_CM);
    aVDistField .SetMin(nMinSize, FUNIT_CM);

    aHDistField .SetMax((long) 100 * ((lMax - lLeft ) / Max(1L, (long) aColsField.GetValue())), FUNIT_TWIP);
    aVDistField .SetMax((long) 100 * ((lMax - lUpper) / Max(1L, (long) aRowsField.GetValue())), FUNIT_TWIP);

    aWidthField .SetMin(nMinSize, FUNIT_CM);
    aHeightField.SetMin(nMinSize, FUNIT_CM);

    aWidthField .SetMax((long) 100 * (lHDist), FUNIT_TWIP);
    aHeightField.SetMax((long) 100 * (lVDist), FUNIT_TWIP);

    aLeftField  .SetMax((long) 100 * (lMax - (long) aColsField.GetValue() * GETFLDVAL(aHDistField)), FUNIT_TWIP);
    aUpperField .SetMax((long) 100 * (lMax - (long) aRowsField.GetValue() * GETFLDVAL(aVDistField)), FUNIT_TWIP);

    aColsField  .SetMax((lMax - lLeft ) / Max(1L, lHDist));
    aRowsField  .SetMax((lMax - lUpper) / Max(1L, lVDist));

    // First und Last

    aHDistField .SetFirst(aHDistField .GetMin());
    aVDistField .SetFirst(aVDistField .GetMin());

    aHDistField .SetLast (aHDistField .GetMax());
    aVDistField .SetLast (aVDistField .GetMax());

    aWidthField .SetFirst(aWidthField .GetMin());
    aHeightField.SetFirst(aHeightField.GetMin());

    aWidthField .SetLast (aWidthField .GetMax());
    aHeightField.SetLast (aHeightField.GetMax());

    aLeftField  .SetLast (aLeftField  .GetMax());
    aUpperField .SetLast (aUpperField .GetMax());

    aColsField  .SetLast (aColsField  .GetMax());
    aRowsField  .SetLast (aRowsField  .GetMax());

    aHDistField .Reformat();
    aVDistField .Reformat();
    aWidthField .Reformat();
    aHeightField.Reformat();
    aLeftField  .Reformat();
    aUpperField .Reformat();
    aColsField  .Reformat();
    aRowsField  .Reformat();
}

// --------------------------------------------------------------------------



SfxTabPage* SwLabFmtPage::Create(Window* pParent, const SfxItemSet& rSet)
{
    return new SwLabFmtPage(pParent, rSet);
}

// ----------------------------------------------------------------------------



void SwLabFmtPage::ActivatePage(const SfxItemSet& rSet)
{
    SfxItemSet aSet(rSet);
    Reset(aSet);
}

// ----------------------------------------------------------------------------



int SwLabFmtPage::DeactivatePage(SfxItemSet* pSet)
{
    if (pSet)
        FillItemSet(*pSet);

    return TRUE;
}

// --------------------------------------------------------------------------



void SwLabFmtPage::FillItem(SwLabItem& rItem)
{
    if (bModified)
    {
        rItem.aMake = rItem.aType = SW_RESSTR(STR_CUSTOM);

        SwLabRec& rRec = *GetParent()->Recs()[0];
        rItem.lHDist  = rRec.lHDist  = GETFLDVAL(aHDistField );
        rItem.lVDist  = rRec.lVDist  = GETFLDVAL(aVDistField );
        rItem.lWidth  = rRec.lWidth  = GETFLDVAL(aWidthField );
        rItem.lHeight = rRec.lHeight = GETFLDVAL(aHeightField);
        rItem.lLeft   = rRec.lLeft   = GETFLDVAL(aLeftField  );
        rItem.lUpper  = rRec.lUpper  = GETFLDVAL(aUpperField );
        rItem.nCols   = rRec.nCols   = (USHORT) aColsField.GetValue();
        rItem.nRows   = rRec.nRows   = (USHORT) aRowsField.GetValue();
    }
}

// --------------------------------------------------------------------------



BOOL SwLabFmtPage::FillItemSet(SfxItemSet& rSet)
{
    SwLabItem aItem;
    GetParent()->GetLabItem(aItem);
    FillItem(aItem);
    rSet.Put(aItem);

    return TRUE;
}

// --------------------------------------------------------------------------



void SwLabFmtPage::Reset(const SfxItemSet& rSet)
{
    // Fields initialisieren
    GetParent()->GetLabItem(aItem);

    aHDistField .SetMax(100 * aItem.lHDist , FUNIT_TWIP);
    aVDistField .SetMax(100 * aItem.lVDist , FUNIT_TWIP);
    aWidthField .SetMax(100 * aItem.lWidth , FUNIT_TWIP);
    aHeightField.SetMax(100 * aItem.lHeight, FUNIT_TWIP);
    aLeftField  .SetMax(100 * aItem.lLeft  , FUNIT_TWIP);
    aUpperField .SetMax(100 * aItem.lUpper , FUNIT_TWIP);

    SETFLDVAL(aHDistField , aItem.lHDist );
    SETFLDVAL(aVDistField , aItem.lVDist );
    SETFLDVAL(aWidthField , aItem.lWidth );
    SETFLDVAL(aHeightField, aItem.lHeight);
    SETFLDVAL(aLeftField  , aItem.lLeft  );
    SETFLDVAL(aUpperField , aItem.lUpper );

    aColsField.SetMax(aItem.nCols);
    aRowsField.SetMax(aItem.nRows);

    aColsField  .SetValue(aItem.nCols);
    aRowsField  .SetValue(aItem.nRows);

    PreviewHdl(0);
}



/*
$Log: not supported by cvs2svn $
Revision 1.60  2000/09/18 16:05:26  willem.vandorp
OpenOffice header added.

Revision 1.59  2000/04/18 15:31:35  os
UNICODE

Revision 1.58  2000/03/03 15:17:00  os
StarView remainders removed

Revision 1.57  2000/02/11 14:45:37  hr
#70473# changes for unicode ( patched by automated patchtool )

Revision 1.56  1999/07/23 08:00:30  OS
#67818# set font transparent


      Rev 1.55   23 Jul 1999 10:00:30   OS
   #67818# set font transparent

      Rev 1.54   23 Sep 1998 12:42:28   OM
   #56852# Minimale Etikettengroesse 1mm

      Rev 1.53   11 Sep 1998 12:29:46   OM
   #56319# Richtiges Etikettenformat verwenden

      Rev 1.52   08 Sep 1998 16:52:34   OS
   #56134# Metric fuer Text und HTML getrennt

      Rev 1.51   07 Sep 1998 16:59:32   OM
   #55930# Einzelnes Etikett an der korrekten Position drucken

      Rev 1.50   08 Jul 1998 17:16:48   OM
   #52127# os2icci3-Compiler Optimierungsbug umpropelt

      Rev 1.49   14 Mar 1998 14:31:36   OM
   ExchangeSupport repariert/implementiert

      Rev 1.48   14 Mar 1998 14:10:24   OM
   ExchangeSupport repariert/implementiert

      Rev 1.47   24 Nov 1997 11:52:12   MA
   includes

      Rev 1.46   03 Nov 1997 13:17:10   MA
   precomp entfernt

      Rev 1.45   07 Apr 1997 14:46:28   MH
   chg: header

      Rev 1.44   11 Nov 1996 09:44:16   MA
   ResMgr

      Rev 1.43   26 Jul 1996 20:36:38   MA
   includes

      Rev 1.42   07 Mar 1996 14:14:44   HJS
   line 270: &aArr => aArr

      Rev 1.41   06 Mar 1996 10:52:36   MA
   chg: SV309

      Rev 1.40   06 Feb 1996 15:19:04   JP
   Link Umstellung 305

      Rev 1.39   25 Jan 1996 16:58:16   OM
   Dialogfelder richtig initialisieren

      Rev 1.38   24 Jan 1996 18:25:08   OM
   #24534# Redraw-Bug in Etiketten Preview gefixt

      Rev 1.37   22 Jan 1996 12:36:50   OM
   Berechnungsfehler in Labels-Preview gefixt

      Rev 1.36   28 Nov 1995 21:14:56   JP
   UiSystem-Klasse aufgehoben, in initui/swtype aufgeteilt

      Rev 1.35   27 Nov 1995 19:36:32   OM
   HasExchangeSupport->303a

      Rev 1.34   24 Nov 1995 16:59:42   OM
   PCH->PRECOMPILED

      Rev 1.33   23 Nov 1995 18:02:08   OM
   In DeactivatePage ItemSet fuellen

      Rev 1.32   08 Nov 1995 13:48:22   OM
   Change->Set

      Rev 1.31   10 Jul 1995 09:50:56   MA
   LabelDlg optimiert und etwas aufgeraeumt.

      Rev 1.30   24 May 1995 18:15:58   ER
   Segmentierung

      Rev 1.29   23 Apr 1995 17:33:32   PK
   bugfix: etik.-fmt. wurde manchm. falsch angezeigt

      Rev 1.28   05 Apr 1995 19:35:18   PK
   fertig zur beta

      Rev 1.27   05 Apr 1995 09:26:58   JP
   Benutzung vom Link-Makro eingeschraenkt

      Rev 1.26   04 Apr 1995 18:38:42   PK
   geht immer weiter

      Rev 1.25   24 Mar 1995 20:30:40   PK
   geht immer weiter

      Rev 1.24   23 Mar 1995 18:33:48   PK
   geht immer weiter ...

      Rev 1.23   17 Mar 1995 17:10:30   PK
   geht immer weiter

      Rev 1.22   15 Mar 1995 13:27:04   PK
   geht immer weiter

      Rev 1.21   06 Mar 1995 00:08:18   PK
   linkbarer envelp-zustand

      Rev 1.20   21 Feb 1995 15:39:32   PK
   erstmal eingecheckt

      Rev 1.19   25 Jan 1995 17:55:56   OS
   Timerinstrumentierung

      Rev 1.18   18 Nov 1994 15:54:42   MA
   min -> Min, max -> Max

      Rev 1.17   25 Oct 1994 17:33:36   ER
   add: PCH

*/

diff --git a/sw/source/ui/envelp/labfmt.hrc b/sw/source/ui/envelp/labfmt.hrc
new file mode 100644
index 0000000..fb07093
--- /dev/null
+++ b/sw/source/ui/envelp/labfmt.hrc
@@ -0,0 +1,112 @@
/*************************************************************************
 *
 *  $RCSfile: labfmt.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:35 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _LABFMT_HRC
#define _LABFMT_HRC

// #include *****************************************************************

#include "envelp.hrc"

// Lokale Resourcen *********************************************************

#define WIN_PREVIEW   1
#define TXT_HDIST     2
#define FLD_HDIST     3
#define TXT_VDIST     4
#define FLD_VDIST     5
#define TXT_WIDTH     6
#define FLD_WIDTH     7
#define TXT_HEIGHT    8
#define FLD_HEIGHT    9
#define TXT_LEFT     10
#define FLD_LEFT     11
#define TXT_UPPER    12
#define FLD_UPPER    13
#define TXT_COLUMNS  14
#define FLD_COLUMNS  15
#define TXT_ROWS     16
#define FLD_ROWS     17
#define GRP_NONAME   18
#define BTN_OK       19
#define BTN_CANCEL   20

// Globale Resourcen ********************************************************

#define STR_HDIST   (RC_LABFMT_BEGIN + 1)
#define STR_VDIST   (RC_LABFMT_BEGIN + 2)
#define STR_WIDTH   (RC_LABFMT_BEGIN + 3)
#define STR_HEIGHT  (RC_LABFMT_BEGIN + 4)
#define STR_LEFT    (RC_LABFMT_BEGIN + 5)
#define STR_UPPER   (RC_LABFMT_BEGIN + 6)
#define STR_COLS    (RC_LABFMT_BEGIN + 7)
#define STR_ROWS    (RC_LABFMT_BEGIN + 8)

// Ueberlaufpruefung ********************************************************

#define LABFMT_ACT_END  STR_ROWS

#if LABFMT_ACT_END > RC_LABFMT_END
#error Resource-Ueberlauf in #file, #line
#endif

#endif

diff --git a/sw/source/ui/envelp/labfmt.hxx b/sw/source/ui/envelp/labfmt.hxx
new file mode 100644
index 0000000..1e280c1
--- /dev/null
+++ b/sw/source/ui/envelp/labfmt.hxx
@@ -0,0 +1,166 @@
/*************************************************************************
 *
 *  $RCSfile: labfmt.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:35 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _LABFMT_HXX
#define _LABFMT_HXX

#include "labimp.hxx"
#include "labimg.hxx"

class SwLabFmtPage;

// class SwLabPreview -------------------------------------------------------

class SwLabPreview : public Window
{
    long lOutWPix;
    long lOutHPix;
    long lOutWPix23;
    long lOutHPix23;

    Color aBlackColor;
    Color aGrayColor;
    Color aWhiteColor;

    String aHDistStr;
    String aVDistStr;
    String aWidthStr;
    String aHeightStr;
    String aLeftStr;
    String aUpperStr;
    String aColsStr;
    String aRowsStr;

    long lHDistWidth;
    long lVDistWidth;
    long lHeightWidth;
    long lLeftWidth;
    long lUpperWidth;
    long lColsWidth;

    long lXWidth;
    long lXHeight;

    SwLabItem aItem;

    void Paint(const Rectangle&);

    void DrawArrow(const Point& rP1, const Point& rP2, BOOL bArrow);
    SwLabFmtPage* GetParent() {return (SwLabFmtPage*) Window::GetParent();}

public:

     SwLabPreview(const SwLabFmtPage* pParent, const ResId& rResID);
    ~SwLabPreview();

    void Update(const SwLabItem& rItem);
};

// class SwLabFmtPage -------------------------------------------------------

class SwLabFmtPage : public SfxTabPage
{
    SwLabPreview aPreview;
    FixedText    aHDistText;
    MetricField  aHDistField;
    FixedText    aVDistText;
    MetricField  aVDistField;
    FixedText    aWidthText;
    MetricField  aWidthField;
    FixedText    aHeightText;
    MetricField  aHeightField;
    FixedText    aLeftText;
    MetricField  aLeftField;
    FixedText    aUpperText;
    MetricField  aUpperField;
    FixedText    aColsText;
    NumericField aColsField;
    FixedText    aRowsText;
    NumericField aRowsField;

    Timer aPreviewTimer;
    BOOL  bModified;

    SwLabItem    aItem;

     SwLabFmtPage(Window* pParent, const SfxItemSet& rSet);
    ~SwLabFmtPage();

    DECL_LINK( ModifyHdl, Edit * );
    DECL_LINK( PreviewHdl, Timer * );
    DECL_LINK( LoseFocusHdl, Control * );

    void ChangeMinMax();

public:

    static SfxTabPage* Create(Window* pParent, const SfxItemSet& rSet);

    virtual void ActivatePage(const SfxItemSet& rSet);
    virtual int  DeactivatePage(SfxItemSet* pSet = 0);
            void FillItem(SwLabItem& rItem);
    virtual BOOL FillItemSet(SfxItemSet& rSet);
    virtual void Reset(const SfxItemSet& rSet);

    SwLabDlg* GetParent() {return (SwLabDlg*) SfxTabPage::GetParent()->GetParent();}
};

#endif

diff --git a/sw/source/ui/envelp/labfmt.src b/sw/source/ui/envelp/labfmt.src
new file mode 100644
index 0000000..c667285
--- /dev/null
+++ b/sw/source/ui/envelp/labfmt.src
@@ -0,0 +1,626 @@
/*************************************************************************
 *
 *  $RCSfile: labfmt.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:35 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
 // #pragma ******************************************************************

 // #include *****************************************************************
#include "labfmt.hrc"
#include "helpid.h"
 // TP_LAB_FMT ---------------------------------------------------------------
TabPage TP_LAB_FMT
{
    HelpID = HID_LAB_FMT ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Hide = TRUE ;
    Window WIN_PREVIEW
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 108 , 6 ) ;
        Size = MAP_APPFONT ( 146 , 123 ) ;
    };
    FixedText TXT_HDIST
    {
        Pos = MAP_APPFONT ( 6 , 8 ) ;
        Size = MAP_APPFONT ( 50 , 8 ) ;
        Text = "~Horiz. Abstand" ;
        Text [ English ] = "Horiz. distance" ;
        Text [ norwegian ] = "Horiz. distance" ;
        Text [ italian ] = "Distanza ~orizzont." ;
        Text [ portuguese_brazilian ] = "Distância horizontal" ;
        Text [ portuguese ] = "Espaçamento ~horiz." ;
        Text [ finnish ] = "Vaakaetäisyys" ;
        Text [ danish ] = "Vandret afstand" ;
        Text [ french ] = "Écart ~horizontal" ;
        Text [ swedish ] = "~Horis. avstånd" ;
        Text [ dutch ] = "~Horiz. afstand" ;
        Text [ spanish ] = "Distancia ~horiz." ;
        Text [ english_us ] = "Hori~zontal pitch" ;
        Group = TRUE ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "ˮƽ¼ä¸ô(~Z)";
        Text[ russian ] = "Øàã ïî ãîðèçîíò.";
        Text[ polish ] = "Odstêp poziomy";
        Text[ japanese ] = "‰¡‚ÌŠÔŠu(~Z)";
        Text[ chinese_traditional ] = "¤ô¥­¶¡¹j(~Z)";
        Text[ arabic ] = "ÇáÎØæÉ ÇáÃÝÞíÉ";
        Text[ greek ] = "Ïñéæüíôéá áðüóôáóç";
        Text[ korean ] = "°¡·Î °£°Ý(~Z)";
        Text[ turkish ] = "~Yatay boþluk";
        Text[ language_user1 ] = " ";
    };
    MetricField FLD_HDIST
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 62 , 6 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Spin = TRUE ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        Repeat = TRUE ;
        SpinSize = 10 ;
    };
    FixedText TXT_VDIST
    {
        Pos = MAP_APPFONT ( 6 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 8 ) ;
        Text = "~Vert. Abstand" ;
        Text [ English ] = "Vert. distance" ;
        Text [ norwegian ] = "Vert. distance" ;
        Text [ italian ] = "Distanza verticale" ;
        Text [ portuguese_brazilian ] = "Distância vertical" ;
        Text [ portuguese ] = "Espaçamento vertical" ;
        Text [ finnish ] = "Pystyetäisyys" ;
        Text [ danish ] = "Lodret afstand" ;
        Text [ french ] = "Écart ~vertical" ;
        Text [ swedish ] = "~Vert. avstånd" ;
        Text [ dutch ] = "V~ert. afstand" ;
        Text [ spanish ] = "Distancia ~vert." ;
        Text [ english_us ] = "~Vertical pitch" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "´¹Ö±¼ä¸ô(~V)";
        Text[ russian ] = "Øàã ïî âåðòèê.";
        Text[ polish ] = "Odstêp pionowy";
        Text[ japanese ] = "c‚ÌŠÔŠu(~V)";
        Text[ chinese_traditional ] = "««ª½¶¡¹j(~V)";
        Text[ arabic ] = "ÇáÎØæÉ ÇáÑÃÓíÉ";
        Text[ greek ] = "Êáôáêüñõöç áðüóôáóç";
        Text[ korean ] = "¼¼·Î °£°Ý(~V)";
        Text[ turkish ] = "Dikey boþluk";
        Text[ language_user1 ] = " ";
    };
    MetricField FLD_VDIST
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 62 , 21 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Spin = TRUE ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        Repeat = TRUE ;
        SpinSize = 10 ;
    };
    FixedText TXT_WIDTH
    {
        Pos = MAP_APPFONT ( 6 , 38 ) ;
        Size = MAP_APPFONT ( 50 , 10 ) ;
        Text = "~Breite" ;
        Text [ English ] = "Width" ;
        Text [ norwegian ] = "Bredde " ;
        Text [ italian ] = "~Largh." ;
        Text [ portuguese_brazilian ] = "Largura" ;
        Text [ portuguese ] = "~Largura" ;
        Text [ finnish ] = "Leveys" ;
        Text [ danish ] = "Bredde" ;
        Text [ french ] = "~Largeur" ;
        Text [ swedish ] = "~Bredd" ;
        Text [ dutch ] = "B~reedte" ;
        Text [ spanish ] = "A~ncho" ;
        Text [ english_us ] = "~Width" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "¿í(~W)";
        Text[ russian ] = "Øèðèíà";
        Text[ polish ] = "Szer.";
        Text[ japanese ] = "•(~W)";
        Text[ chinese_traditional ] = "¼e(~W)";
        Text[ arabic ] = "ÇáÚÑÖ";
        Text[ greek ] = "ÐëÜôïò";
        Text[ korean ] = "³Êºñ(~W)";
        Text[ turkish ] = "Ge~niþlik";
        Text[ language_user1 ] = " ";
    };
    MetricField FLD_WIDTH
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 62 , 36 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Spin = TRUE ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        Repeat = TRUE ;
        SpinSize = 10 ;
    };
    FixedText TXT_HEIGHT
    {
        Pos = MAP_APPFONT ( 6 , 53 ) ;
        Size = MAP_APPFONT ( 50 , 10 ) ;
        Text = "H~öhe" ;
        Text [ English ] = "Height" ;
        Text [ norwegian ] = "Høyde " ;
        Text [ italian ] = "Altezza" ;
        Text [ portuguese_brazilian ] = "Altura" ;
        Text [ portuguese ] = "Altura" ;
        Text [ finnish ] = "Korkeus" ;
        Text [ danish ] = "Højde" ;
        Text [ french ] = "~Hauteur" ;
        Text [ swedish ] = "Höj~d" ;
        Text [ dutch ] = "H~oogte" ;
        Text [ spanish ] = "A~ltura" ;
        Text [ english_us ] = "~Height" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "¸ß(~H)";
        Text[ russian ] = "Âûñîòà";
        Text[ polish ] = "Wys.";
        Text[ japanese ] = "‚‚³(~H)";
        Text[ chinese_traditional ] = "°ª(~H)";
        Text[ arabic ] = "ÇáÇÑÊÝÇÚ";
        Text[ greek ] = "¾øïò";
        Text[ korean ] = "³ôÀÌ(~H)";
        Text[ turkish ] = "~Yükseklik";
        Text[ language_user1 ] = " ";
    };
    MetricField FLD_HEIGHT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 62 , 51 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Spin = TRUE ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        Repeat = TRUE ;
        SpinSize = 10 ;
    };
    FixedText TXT_LEFT
    {
        Pos = MAP_APPFONT ( 6 , 68 ) ;
        Size = MAP_APPFONT ( 50 , 10 ) ;
        Text = "Rand ~links" ;
        Text [ English ] = "Left margin" ;
        Text [ norwegian ] = "Left margin" ;
        Text [ italian ] = "Margine sinistro" ;
        Text [ portuguese_brazilian ] = "Margem esquerda" ;
        Text [ portuguese ] = "Margem esquerda" ;
        Text [ finnish ] = "Vasen reunus" ;
        Text [ danish ] = "Margen venstre" ;
        Text [ french ] = "~Marge gauche" ;
        Text [ swedish ] = "Vänster margina~l" ;
        Text [ dutch ] = "~Marge links" ;
        Text [ spanish ] = "Margen i~zquierdo" ;
        Text [ english_us ] = "~Left margin" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "×ó·½Ò³±ß¾à(~L)";
        Text[ russian ] = "Ëåâûé êðàé";
        Text[ polish ] = "Lewy margines";
        Text[ japanese ] = "¶—]”’(~L)";
        Text[ chinese_traditional ] = "¥ª¦VÃ䮨(~L)";
        Text[ arabic ] = "ÇáåÇãÔ ÇáÃíÓÑ";
        Text[ greek ] = "Áñéóôåñü ðåñéèþñéï";
        Text[ korean ] = "¿ÞÂÊ ¿©¹é(~L)";
        Text[ turkish ] = "S~ol kenar";
        Text[ language_user1 ] = " ";
    };
    MetricField FLD_LEFT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 62 , 66 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Spin = TRUE ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        Repeat = TRUE ;
        Minimum = 0 ;
        First = 0 ;
        SpinSize = 10 ;
    };
    FixedText TXT_UPPER
    {
        Pos = MAP_APPFONT ( 6 , 83 ) ;
        Size = MAP_APPFONT ( 50 , 10 ) ;
        Text = "Rand ~oben" ;
        Text [ English ] = "Upper margin" ;
        Text [ norwegian ] = "Upper margin" ;
        Text [ italian ] = "Margine superiore" ;
        Text [ portuguese_brazilian ] = "Margem superior" ;
        Text [ portuguese ] = "Margem superior" ;
        Text [ finnish ] = "Oikea reunus" ;
        Text [ danish ] = "Margen foroven" ;
        Text [ french ] = "Marge ~supérieure" ;
        Text [ swedish ] = "~Övre marginal" ;
        Text [ dutch ] = "~Bovenmarge" ;
        Text [ spanish ] = "M~argen superior" ;
        Text [ english_us ] = "~Top margin" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "ÉÏ·½Ò³±ß¾à(~T)";
        Text[ russian ] = "Âåðõíèé êðàé";
        Text[ polish ] = "Margines górny";
        Text[ japanese ] = "ã—]”’(~T)";
        Text[ chinese_traditional ] = "¤WÃ䮨(~T)";
        Text[ arabic ] = "ÇáåÇãÔ ÇáÚáæí";
        Text[ greek ] = "¢íù ðåñéèþñéï";
        Text[ korean ] = "À§ ¿©¹é(~T)";
        Text[ turkish ] = "Üst kenar";
        Text[ language_user1 ] = " ";
    };
    MetricField FLD_UPPER
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 62 , 81 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Spin = TRUE ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        Repeat = TRUE ;
        Minimum = 0 ;
        First = 0 ;
        SpinSize = 10 ;
    };
    FixedText TXT_COLUMNS
    {
        Pos = MAP_APPFONT ( 6 , 98 ) ;
        Size = MAP_APPFONT ( 50 , 10 ) ;
        Text = "~Spalten" ;
        Text [ English ] = "Columns" ;
        Text [ norwegian ] = "Kolonner" ;
        Text [ italian ] = "~Colonne" ;
        Text [ portuguese_brazilian ] = "Colunas" ;
        Text [ portuguese ] = "~Colunas" ;
        Text [ finnish ] = "Sarakkeet" ;
        Text [ danish ] = "Kolonner" ;
        Text [ french ] = "~Colonnes" ;
        Text [ swedish ] = "Kolumner" ;
        Text [ dutch ] = "~Kolommen" ;
        Text [ spanish ] = "Column~as" ;
        Text [ english_us ] = "~Columns" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "ÁÐ(~C)";
        Text[ russian ] = "Êîëîíêè";
        Text[ polish ] = "Kolumny";
        Text[ japanese ] = "’i‘g‚Ý(~C)";
        Text[ chinese_traditional ] = "Äæ(~C)";
        Text[ arabic ] = "ÇáÃÚãÏÉ";
        Text[ greek ] = "ÓôÞëåò";
        Text[ korean ] = "¿­(~C)";
        Text[ turkish ] = "~Sütun";
        Text[ language_user1 ] = " ";
    };
    NumericField FLD_COLUMNS
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 62 , 96 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 1 ;
        First = 1 ;
    };
    FixedText TXT_ROWS
    {
        Pos = MAP_APPFONT ( 6 , 113 ) ;
        Size = MAP_APPFONT ( 50 , 10 ) ;
        Text = "~Zeilen" ;
        Text [ English ] = "Rows" ;
        Text [ norwegian ] = "Rows" ;
        Text [ italian ] = "Righe" ;
        Text [ portuguese_brazilian ] = "Fileiras" ;
        Text [ portuguese ] = "Linhas" ;
        Text [ finnish ] = "~Rivejä" ;
        Text [ danish ] = "Rækker" ;
        Text [ french ] = "~Lignes" ;
        Text [ swedish ] = "~Rader" ;
        Text [ dutch ] = "~Rijen" ;
        Text [ spanish ] = "~Filas" ;
        Text [ english_us ] = "R~ows" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "ÐÐ(~O)";
        Text[ russian ] = "Ñòðîêè";
        Text[ polish ] = "Wiersze";
        Text[ japanese ] = "s(~Oj";
        Text[ chinese_traditional ] = "¦æ(~O)";
        Text[ arabic ] = "ÇáÕÝæÝ";
        Text[ greek ] = "ÃñáììÝò";
        Text[ korean ] = "Çà(~O)";
        Text[ turkish ] = "~Satýr";
        Text[ language_user1 ] = " ";
    };
    NumericField FLD_ROWS
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 62 , 111 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 1 ;
        First = 1 ;
    };
};
 // String *******************************************************************
String STR_HDIST
{
    Text = "H. Abstand" ;
    Text [ English ] = "H. distance" ;
    Text [ norwegian ] = "H. distance" ;
    Text [ italian ] = "Distanza orizzontale" ;
    Text [ portuguese_brazilian ] = "Distância h." ;
    Text [ portuguese ] = "Espaço H." ;
    Text [ finnish ] = "Vaakaetäi." ;
    Text [ danish ] = "V. afstand" ;
    Text [ french ] = "Écart H." ;
    Text [ swedish ] = "H. avstånd" ;
    Text [ dutch ] = "H. afstand" ;
    Text [ spanish ] = "Distancia h." ;
    Text [ english_us ] = "H. Pitch" ;
    Text[ chinese_simplified ] = "ˮƽ¼ä¸ô";
    Text[ russian ] = "Øàã ïî ãîðèçîíò.";
    Text[ polish ] = "Odstêp poziomy";
    Text[ japanese ] = "‰¡ŠÔŠu";
    Text[ chinese_traditional ] = "¤ô¥­¶¡¹j";
    Text[ arabic ] = "ÇáÎØæÉ ÇáÃÝÞíÉ";
    Text[ greek ] = "Ïñéæüíôéá áðüóôáóç";
    Text[ korean ] = "°¡·Î °£°Ý";
    Text[ turkish ] = "Y. boþluk";
    Text[ language_user1 ] = " ";
};
String STR_VDIST
{
    Text = "V. Abstand" ;
    Text [ English ] = "V. distance" ;
    Text [ norwegian ] = "V. distance" ;
    Text [ italian ] = "Distanza verticale" ;
    Text [ portuguese_brazilian ] = "Distância v." ;
    Text [ portuguese ] = "Espaço V." ;
    Text [ finnish ] = "Pystyetäis." ;
    Text [ danish ] = "L. afstand" ;
    Text [ french ] = "Écart V." ;
    Text [ swedish ] = "V. avstånd" ;
    Text [ dutch ] = "V. afstand" ;
    Text [ spanish ] = "Distancia v." ;
    Text [ english_us ] = "V. Pitch" ;
    Text[ chinese_simplified ] = "´¹Ö±¼ä¸ô";
    Text[ russian ] = "Øàã ïî âåðòèê.";
    Text[ polish ] = "Odstêp pionowy";
    Text[ japanese ] = "cŠÔŠu";
    Text[ chinese_traditional ] = "««ª½¶¡¹j";
    Text[ arabic ] = "ÇáÎØæÉ ÇáÑÃÓíÉ";
    Text[ greek ] = "Êáôáê. áðüóôáóç";
    Text[ korean ] = "¼¼·Î °£°Ý";
    Text[ turkish ] = "D. boþluk";
    Text[ language_user1 ] = " ";
};
String STR_WIDTH
{
    Text = "Breite" ;
    Text [ English ] = "Width" ;
    Text [ norwegian ] = "Bredde " ;
    Text [ italian ] = "Larghezza" ;
    Text [ portuguese_brazilian ] = "Largura" ;
    Text [ portuguese ] = "Largura" ;
    Text [ finnish ] = "Leveys" ;
    Text [ danish ] = "Bredde" ;
    Text [ french ] = "Largeur" ;
    Text [ swedish ] = "Bredd" ;
    Text [ dutch ] = "Breedte" ;
    Text [ spanish ] = "Ancho" ;
    Text [ english_us ] = "Width" ;
    Text[ chinese_simplified ] = "¿í";
    Text[ russian ] = "Øèðèíà";
    Text[ polish ] = "SzerokoϾ";
    Text[ japanese ] = "•";
    Text[ chinese_traditional ] = "¼e";
    Text[ arabic ] = "ÇáÚÑÖ";
    Text[ greek ] = "ÐëÜôïò";
    Text[ korean ] = "³Êºñ";
    Text[ turkish ] = "Geniþlik";
    Text[ language_user1 ] = " ";
};
String STR_HEIGHT
{
    Text = "Höhe" ;
    Text [ English ] = "Height" ;
    Text [ norwegian ] = "Høyde " ;
    Text [ italian ] = "Altezza" ;
    Text [ portuguese_brazilian ] = "Altura" ;
    Text [ portuguese ] = "Altura" ;
    Text [ finnish ] = "Korkeus" ;
    Text [ danish ] = "Højde" ;
    Text [ french ] = "Hauteur" ;
    Text [ swedish ] = "Höjd" ;
    Text [ dutch ] = "Hoogte" ;
    Text [ spanish ] = "Altura" ;
    Text [ english_us ] = "Height" ;
    Text[ chinese_simplified ] = "¸ß";
    Text[ russian ] = "Âûñîòà";
    Text[ polish ] = "WysokoϾ";
    Text[ japanese ] = "‚‚³";
    Text[ chinese_traditional ] = "°ª";
    Text[ arabic ] = "ÇáÇÑÊÝÇÚ";
    Text[ greek ] = "¾øïò";
    Text[ korean ] = "³ôÀÌ";
    Text[ turkish ] = "Yükseklik";
    Text[ language_user1 ] = " ";
};
String STR_LEFT
{
    Text = "Rand links" ;
    Text [ English ] = "Left margin" ;
    Text [ norwegian ] = "Left margin" ;
    Text [ italian ] = "Margine sinistro" ;
    Text [ portuguese_brazilian ] = "Margem esquerda" ;
    Text [ portuguese ] = "Margem esquerda" ;
    Text [ finnish ] = "Vasen reunus" ;
    Text [ danish ] = "Margen venstre" ;
    Text [ french ] = "Marge gauche" ;
    Text [ swedish ] = "Vänster marginal" ;
    Text [ dutch ] = "Linker marge" ;
    Text [ spanish ] = "Margen izquierdo" ;
    Text [ english_us ] = "Left margin" ;
    Text[ chinese_simplified ] = "×ó·½Ò³±ß¾à";
    Text[ russian ] = "Ëåâûé êðàé";
    Text[ polish ] = "Lewy margines";
    Text[ japanese ] = "¶—]”’";
    Text[ chinese_traditional ] = "¥ª¦VÃ䮨";
    Text[ arabic ] = "ÇáåÇãÔ ÇáÃíÓÑ";
    Text[ greek ] = "Áñéóôåñü ðåñéèþñéï";
    Text[ korean ] = "¿À¸¥ÂÊ ¿©¹é";
    Text[ turkish ] = "Sol kenar";
    Text[ language_user1 ] = " ";
};
String STR_UPPER
{
    Text = "Rand oben" ;
    Text [ English ] = "Upper margin" ;
    Text [ norwegian ] = "Upper margin" ;
    Text [ italian ] = "Margine superiore" ;
    Text [ portuguese_brazilian ] = "Margem superior" ;
    Text [ portuguese ] = "Margem superior" ;
    Text [ finnish ] = "Oikea reunus" ;
    Text [ danish ] = "Margen foroven" ;
    Text [ french ] = "Marge supérieure" ;
    Text [ swedish ] = "Övre marginal" ;
    Text [ dutch ] = "Bovenmarge" ;
    Text [ spanish ] = "Margen superior" ;
    Text [ english_us ] = "Top margin" ;
    Text[ chinese_simplified ] = "ÉÏ·½Ò³±ß¾à";
    Text[ russian ] = "Âåðõíèé êðàé";
    Text[ polish ] = "Górny margines";
    Text[ japanese ] = "ã—]”’";
    Text[ chinese_traditional ] = "¤WÃ䮨";
    Text[ arabic ] = "ÇáåÇãÔ ÇáÚáæí";
    Text[ greek ] = "¢íù ðåñéèþñéï";
    Text[ korean ] = "À§ ¿©¹é";
    Text[ turkish ] = "Üst kenar";
    Text[ language_user1 ] = " ";
};
String STR_COLS
{
    Text = "Spalten" ;
    Text [ English ] = "Columns" ;
    Text [ norwegian ] = "Kolonner" ;
    Text [ italian ] = "Colonne" ;
    Text [ portuguese_brazilian ] = "Colunas" ;
    Text [ portuguese ] = "Colunas" ;
    Text [ finnish ] = "Sarakkeet" ;
    Text [ danish ] = "Kolonner" ;
    Text [ french ] = "Colonnes" ;
    Text [ swedish ] = "Kolumner" ;
    Text [ dutch ] = "Kolommen" ;
    Text [ spanish ] = "Columnas" ;
    Text [ english_us ] = "Columns" ;
    Text[ chinese_simplified ] = "À¸";
    Text[ russian ] = "Êîëîíêè";
    Text[ polish ] = "Kolumny";
    Text[ japanese ] = "’i‘g‚Ý";
    Text[ chinese_traditional ] = "Äæ";
    Text[ arabic ] = "ÇáÃÚãÏÉ";
    Text[ greek ] = "ÓôÞëåò";
    Text[ korean ] = "¿­";
    Text[ turkish ] = "Sütun";
    Text[ language_user1 ] = " ";
};
String STR_ROWS
{
    Text = "Zeilen" ;
    Text [ English ] = "Rows" ;
    Text [ norwegian ] = "Rows" ;
    Text [ italian ] = "Righe" ;
    Text [ portuguese_brazilian ] = "Fileiras" ;
    Text [ portuguese ] = "Linhas" ;
    Text [ finnish ] = "~Rivejä" ;
    Text [ danish ] = "Rækker" ;
    Text [ french ] = "Lignes" ;
    Text [ swedish ] = "Rader" ;
    Text [ dutch ] = "Rijen" ;
    Text [ spanish ] = "Filas" ;
    Text [ english_us ] = "Rows" ;
    Text[ chinese_simplified ] = "ÐÐ";
    Text[ russian ] = "Ñòðîêè";
    Text[ polish ] = "Wiersze";
    Text[ japanese ] = "s";
    Text[ chinese_traditional ] = "¦æ";
    Text[ arabic ] = "ÇáÕÝæÝ";
    Text[ greek ] = "ÃñáììÝò";
    Text[ korean ] = "Çà";
    Text[ turkish ] = "Satýr";
    Text[ language_user1 ] = " ";
};
diff --git a/sw/source/ui/envelp/labimg.cxx b/sw/source/ui/envelp/labimg.cxx
new file mode 100644
index 0000000..06a4e77
--- /dev/null
+++ b/sw/source/ui/envelp/labimg.cxx
@@ -0,0 +1,594 @@
/*************************************************************************
 *
 *  $RCSfile: labimg.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:36 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _STREAM_HXX //autogen
#include <tools/stream.hxx>
#endif
#ifndef _RESID_HXX //autogen
#include <vcl/resid.hxx>
#endif

#ifndef _SVX_ADRITEM_HXX
#include <svx/adritem.hxx>
#endif
#ifndef _FINDER_HXX
#include <finder.hxx>
#endif


#include "cmdid.h"
#include "swtypes.hxx"
#include "cfgid.h"
#include "labimg.hxx"
#include "cfgstr.hrc"

#define LAB_VERSION  1
#define LAB_VERSION2 2
#define LAB_VERSION3 3
#define LAB_VERSION4 4
#define LAB_VERSION5 5
#define LAB_VERSION6 6

#define CUR_LAB_VERSION LAB_VERSION6
SwLabItem::SwLabItem() :

    SfxPoolItem(FN_LABEL),
    nCol  (1),
    nRow  (1),
    lLeft (0),
    lUpper(0),
    nCols (1),
    nRows (1)
{
    bAddr = bCont = bSynchron = FALSE;
    bPage = TRUE;
    lHDist  =
    lVDist  =
    lWidth  =
    lHeight = 5669; // 10 cm
}

// ----------------------------------------------------------------------------



SwLabItem::SwLabItem(const SwLabItem& rItem) :
    SfxPoolItem(FN_LABEL)
{
        *this = rItem;
}

// ----------------------------------------------------------------------------



SwLabItem& SwLabItem::operator =(const SwLabItem& rItem)
{
    bAddr    = rItem.bAddr;
    aWriting = rItem.aWriting;
    bCont    = rItem.bCont;
    sDBName  = rItem.sDBName;
    aLstMake = rItem.aLstMake;
    aLstType = rItem.aLstType;
    aMake    = rItem.aMake;
    aType    = rItem.aType;
    bPage    = rItem.bPage;
    bSynchron = rItem.bSynchron;
    aBin     = rItem.aBin;
    nCol     = rItem.nCol;
    nRow     = rItem.nRow;
    lHDist   = rItem.lHDist;
    lVDist   = rItem.lVDist;
    lWidth   = rItem.lWidth;
    lHeight  = rItem.lHeight;
    lLeft    = rItem.lLeft;
    lUpper   = rItem.lUpper;
    nCols    = rItem.nCols;
    nRows    = rItem.nRows;
    aPrivFirstName =        rItem.aPrivFirstName;
    aPrivName =             rItem.aPrivName;
    aPrivShortCut =         rItem.aPrivShortCut;
    aPrivFirstName2 =       rItem.aPrivFirstName2;
    aPrivName2 =            rItem.aPrivName2;
    aPrivShortCut2 =        rItem.aPrivShortCut2;
    aPrivStreet =           rItem.aPrivStreet;
    aPrivZip =              rItem.aPrivZip;
    aPrivCity =             rItem.aPrivCity;
    aPrivCountry =          rItem.aPrivCountry;
    aPrivState =            rItem.aPrivState;
    aPrivTitle =            rItem.aPrivTitle;
    aPrivProfession =       rItem.aPrivProfession;
    aPrivPhone =            rItem.aPrivPhone;
    aPrivMobile =           rItem.aPrivMobile;
    aPrivFax =              rItem.aPrivFax;
    aPrivWWW =              rItem.aPrivWWW;
    aPrivMail =             rItem.aPrivMail;
    aCompCompany =          rItem.aCompCompany;
    aCompCompanyExt =       rItem.aCompCompanyExt;
    aCompSlogan =           rItem.aCompSlogan;
    aCompStreet =           rItem.aCompStreet;
    aCompZip =              rItem.aCompZip;
    aCompCity =             rItem.aCompCity;
    aCompCountry =          rItem.aCompCountry;
    aCompState =            rItem.aCompState;
    aCompPosition =         rItem.aCompPosition;
    aCompPhone =            rItem.aCompPhone;
    aCompMobile =           rItem.aCompMobile;
    aCompFax =              rItem.aCompFax;
    aCompWWW =              rItem.aCompWWW;
    aCompMail =             rItem.aCompMail;
    sGlossaryGroup =        rItem.sGlossaryGroup;
    sGlossaryBlockName =    rItem.sGlossaryBlockName;
    return *this;
}

// --------------------------------------------------------------------------



int SwLabItem::operator ==(const SfxPoolItem& rItem) const
{
    const SwLabItem& rLab = (const SwLabItem&) rItem;

    return bAddr    == rLab.bAddr   &&
           bCont    == rLab.bCont   &&
           bPage    == rLab.bPage   &&
           bSynchron == rLab.bSynchron &&
           aBin     == rLab.aBin    &&
           nCol     == rLab.nCol    &&
           nRow     == rLab.nRow    &&
           lHDist   == rLab.lHDist  &&
           lVDist   == rLab.lVDist  &&
           lWidth   == rLab.lWidth  &&
           lHeight  == rLab.lHeight &&
           lLeft    == rLab.lLeft   &&
           lUpper   == rLab.lUpper  &&
           nCols    == rLab.nCols   &&
           nRows    == rLab.nRows   &&
           aWriting == rLab.aWriting&&
           aMake    == rLab.aMake   &&
           aType    == rLab.aType   &&
           aLstMake == rLab.aLstMake&&
           aLstType == rLab.aLstType&&
           sDBName  == rLab.sDBName &&
               aPrivFirstName ==        rLab.aPrivFirstName&&
            aPrivName ==             rLab.aPrivName&&
            aPrivShortCut ==         rLab.aPrivShortCut&&
               aPrivFirstName2 ==        rLab.aPrivFirstName2&&
            aPrivName2 ==            rLab.aPrivName2&&
            aPrivShortCut2 ==        rLab.aPrivShortCut2&&
            aPrivStreet ==           rLab.aPrivStreet&&
            aPrivZip ==              rLab.aPrivZip&&
            aPrivCity ==             rLab.aPrivCity&&
            aPrivCountry ==          rLab.aPrivCountry&&
            aPrivState ==            rLab.aPrivState&&
            aPrivTitle ==            rLab.aPrivTitle&&
            aPrivProfession ==       rLab.aPrivProfession&&
            aPrivPhone ==            rLab.aPrivPhone&&
            aPrivMobile ==           rLab.aPrivMobile&&
            aPrivFax ==              rLab.aPrivFax&&
            aPrivWWW ==              rLab.aPrivWWW&&
            aPrivMail ==             rLab.aPrivMail&&
            aCompCompany ==          rLab.aCompCompany&&
            aCompCompanyExt ==       rLab.aCompCompanyExt&&
            aCompSlogan ==           rLab.aCompSlogan&&
            aCompStreet ==           rLab.aCompStreet&&
            aCompZip ==              rLab.aCompZip&&
            aCompCity ==             rLab.aCompCity&&
            aCompCountry ==          rLab.aCompCountry&&
            aCompState ==            rLab.aCompState&&
            aCompPosition ==         rLab.aCompPosition&&
            aCompPhone ==            rLab.aCompPhone&&
            aCompMobile ==           rLab.aCompMobile&&
            aCompFax ==              rLab.aCompFax&&
            aCompWWW ==              rLab.aCompWWW&&
            aCompMail ==             rLab.aCompMail &&
            sGlossaryGroup ==        rLab.sGlossaryGroup &&
            sGlossaryBlockName ==    rLab.sGlossaryBlockName;
}

// --------------------------------------------------------------------------



SfxPoolItem* SwLabItem::Clone(SfxItemPool*) const
{
    return new SwLabItem(*this);
}

// ----------------------------------------------------------------------------
SwLabCfgItem::SwLabCfgItem() :
    SfxConfigItem(CFG_LAB_ITEM)
{
}

// ----------------------------------------------------------------------------

int  SwLabItem::Load (SvStream& rStrm, USHORT nVersion, BOOL bLabel)
{
    unsigned char b;
    USHORT        i;
    long          l;

    rtl_TextEncoding eEncoding = gsl_getSystemTextEncoding();
    rStrm >> b; bAddr     = (BOOL) b;
    rStrm.ReadByteString(aWriting, eEncoding);
    rStrm >> b; bCont     = (BOOL) b;
    rStrm.ReadByteString(aMake, eEncoding);
    rStrm.ReadByteString(aType, eEncoding);
    rStrm >> b; bPage     = (BOOL) b;
    rStrm.ReadByteString(aBin, eEncoding);
    rStrm >> i; nCol    =   i;
    rStrm >> i; nRow    =   i;
    rStrm >> l; lHDist  =   l;
    rStrm >> l; lVDist  =   l;
    rStrm >> l; lWidth  =   l;
    rStrm >> l; lHeight =   l;
    rStrm >> l; lLeft   =   l;
    rStrm >> l; lUpper  =   l;
    rStrm >> i; nCols   =   i;
    rStrm >> i; nRows   =   i;

    if ( nVersion >= LAB_VERSION2 )
    {
        rStrm.ReadByteString(aLstMake, eEncoding);
        rStrm.ReadByteString(aLstType, eEncoding);
    }
    if ( nVersion >= LAB_VERSION3 )
        rStrm.ReadByteString(sDBName, eEncoding);

    if ( nVersion >= LAB_VERSION4 )
    {
        rStrm >> b;
        bSynchron = (BOOL)b;
    }
    if(!bLabel)
    {
        rStrm.ReadByteString(aPrivFirstName, eEncoding);
        rStrm.ReadByteString(aPrivName, eEncoding);
        rStrm.ReadByteString(aPrivShortCut, eEncoding);
        if ( nVersion >= LAB_VERSION6 )
        {
            rStrm.ReadByteString(aPrivFirstName2, eEncoding);
            rStrm.ReadByteString(aPrivName2, eEncoding);
            rStrm.ReadByteString(aPrivShortCut2, eEncoding);
        }
        rStrm.ReadByteString(aPrivStreet, eEncoding);
        rStrm.ReadByteString(aPrivZip, eEncoding);
        rStrm.ReadByteString(aPrivCity, eEncoding);
        rStrm.ReadByteString(aPrivCountry, eEncoding);
        rStrm.ReadByteString(aPrivState         , eEncoding);
        rStrm.ReadByteString(aPrivTitle         , eEncoding);
        rStrm.ReadByteString(aPrivProfession    , eEncoding);
        rStrm.ReadByteString(aPrivPhone         , eEncoding);
        rStrm.ReadByteString(aPrivMobile        , eEncoding);
        rStrm.ReadByteString(aPrivFax           , eEncoding);
        rStrm.ReadByteString(aPrivWWW           , eEncoding);
        rStrm.ReadByteString(aPrivMail          , eEncoding);
        rStrm.ReadByteString(aCompCompany       , eEncoding);
        rStrm.ReadByteString(aCompCompanyExt    , eEncoding);
        rStrm.ReadByteString(aCompSlogan        , eEncoding);
        rStrm.ReadByteString(aCompStreet        , eEncoding);
        rStrm.ReadByteString(aCompZip           , eEncoding);
        rStrm.ReadByteString(aCompCity          , eEncoding);
        rStrm.ReadByteString(aCompCountry       , eEncoding);
        rStrm.ReadByteString(aCompState         , eEncoding);
        rStrm.ReadByteString(aCompPosition      , eEncoding);
        rStrm.ReadByteString(aCompPhone         , eEncoding);
        rStrm.ReadByteString(aCompMobile        , eEncoding);
        rStrm.ReadByteString(aCompFax           , eEncoding);
        rStrm.ReadByteString(aCompWWW           , eEncoding);
        rStrm.ReadByteString(aCompMail          , eEncoding);

        rStrm.ReadByteString(sGlossaryGroup     , eEncoding);
        rStrm.ReadByteString(sGlossaryBlockName , eEncoding);
    }
    return SfxConfigItem::ERR_OK;
}
// ----------------------------------------------------------------------------

BOOL SwLabItem::Store(SvStream& rStrm, BOOL bLabel)
{
    rtl_TextEncoding eEncoding = gsl_getSystemTextEncoding();
    rStrm << (unsigned char) bAddr;
    rStrm.WriteByteString(aWriting, eEncoding);
    rStrm << (unsigned char) bCont;
    rStrm.WriteByteString(aMake, eEncoding);
    rStrm.WriteByteString(aType, eEncoding);
    rStrm << (unsigned char) bPage;
    rStrm.WriteByteString(aBin, eEncoding);
    rStrm <<                 nCol;
    rStrm <<                 nRow;
    rStrm <<                 lHDist;
    rStrm <<                 lVDist;
    rStrm <<                 lWidth;
    rStrm <<                 lHeight;
    rStrm <<                 lLeft;
    rStrm <<                 lUpper;
    rStrm <<                 nCols;
    rStrm <<                 nRows;
    rStrm.WriteByteString(aLstMake, eEncoding);
    rStrm.WriteByteString(aLstType, eEncoding);
    rStrm.WriteByteString(sDBName, eEncoding);
    rStrm <<                 bSynchron;
    if(!bLabel)
    {
        rStrm.WriteByteString(aPrivFirstName, eEncoding);
        rStrm.WriteByteString(aPrivName, eEncoding);
        rStrm.WriteByteString(aPrivShortCut, eEncoding);
        rStrm.WriteByteString(aPrivFirstName2, eEncoding);
        rStrm.WriteByteString(aPrivName2, eEncoding);
        rStrm.WriteByteString(aPrivShortCut2, eEncoding);
        rStrm.WriteByteString(aPrivStreet, eEncoding);
        rStrm.WriteByteString(aPrivZip, eEncoding);
        rStrm.WriteByteString(aPrivCity, eEncoding);
        rStrm.WriteByteString(aPrivCountry, eEncoding);
        rStrm.WriteByteString(aPrivState, eEncoding);
        rStrm.WriteByteString(aPrivTitle, eEncoding);
        rStrm.WriteByteString(aPrivProfession, eEncoding);
        rStrm.WriteByteString(aPrivPhone, eEncoding);
        rStrm.WriteByteString(aPrivMobile, eEncoding);
        rStrm.WriteByteString(aPrivFax, eEncoding);
        rStrm.WriteByteString(aPrivWWW, eEncoding);
        rStrm.WriteByteString(aPrivMail, eEncoding);
        rStrm.WriteByteString(aCompCompany, eEncoding);
        rStrm.WriteByteString(aCompCompanyExt, eEncoding);
        rStrm.WriteByteString(aCompSlogan, eEncoding);
        rStrm.WriteByteString(aCompStreet, eEncoding);
        rStrm.WriteByteString(aCompZip, eEncoding);
        rStrm.WriteByteString(aCompCity, eEncoding);
        rStrm.WriteByteString(aCompCountry, eEncoding);
        rStrm.WriteByteString(aCompState, eEncoding);
        rStrm.WriteByteString(aCompPosition, eEncoding);
        rStrm.WriteByteString(aCompPhone, eEncoding);
        rStrm.WriteByteString(aCompMobile, eEncoding);
        rStrm.WriteByteString(aCompFax, eEncoding);
        rStrm.WriteByteString(aCompWWW, eEncoding);
        rStrm.WriteByteString(aCompMail, eEncoding);

        rStrm.WriteByteString(sGlossaryGroup, eEncoding);
        rStrm.WriteByteString(sGlossaryBlockName, eEncoding);
    }

    return SfxConfigItem::ERR_OK;
}
// ----------------------------------------------------------------------------
int SwLabCfgItem::Load(SvStream& rStrm)
{
    USHORT nVersion;
    rStrm >> nVersion;

    if( nVersion >= LAB_VERSION )
    {
        aLabItem.Load(rStrm, nVersion, TRUE);
        if(LAB_VERSION5 <= nVersion)
            aBusinessItem.Load(rStrm, nVersion, FALSE);

        SetDefault(FALSE);

        return SfxConfigItem::ERR_OK;
    }
    else
        return SfxConfigItem::WARNING_VERSION;
}

BOOL SwLabCfgItem::Store(SvStream& rStrm)
{
    rStrm << (USHORT)CUR_LAB_VERSION;
    aLabItem.Store(rStrm, TRUE);
    aBusinessItem.Store(rStrm, FALSE);
    return SfxConfigItem::ERR_OK;
}
// ----------------------------------------------------------------------------
void SwLabCfgItem::UseDefault()
{
    aLabItem = SwLabItem();
    aBusinessItem = SwLabItem();
    //Fill item with user data
    SvxAddressItem aAdr( pPathFinder->GetAddress() );

    aBusinessItem.aPrivFirstName = aAdr.GetFirstName();
    aBusinessItem.aPrivName = aAdr.GetName();
    aBusinessItem.aPrivShortCut = aAdr.GetShortName();
    aBusinessItem.aCompCompany = aAdr.GetToken( ADDRESS_COMPANY       );
    aBusinessItem.aCompStreet = aBusinessItem.aPrivStreet = aAdr.GetToken( ADDRESS_STREET);

    aBusinessItem.aCompCountry = aBusinessItem.aPrivCountry = aAdr.GetToken( ADDRESS_COUNTRY);
    aBusinessItem.aCompZip = aBusinessItem.aPrivZip= aAdr.GetToken( ADDRESS_PLZ );
    aBusinessItem.aCompCity = aBusinessItem.aPrivCity = aAdr.GetToken( ADDRESS_CITY );
    aBusinessItem.aPrivTitle = aAdr.GetToken( ADDRESS_TITLE );
    aBusinessItem.aCompPosition = aAdr.GetToken( ADDRESS_POSITION );
    aBusinessItem.aPrivPhone = aAdr.GetToken( ADDRESS_TEL_PRIVATE );
    aBusinessItem.aCompPhone = aAdr.GetToken( ADDRESS_TEL_COMPANY );
    aBusinessItem.aCompFax = aBusinessItem.aPrivFax = aAdr.GetToken( ADDRESS_FAX    );
    aBusinessItem.aCompMail = aBusinessItem.aPrivMail = aAdr.GetToken( ADDRESS_EMAIL    );
    aBusinessItem.aCompState = aBusinessItem.aPrivState = aAdr.GetToken( ADDRESS_STATE  );
    aBusinessItem.bSynchron = TRUE;

    SfxConfigItem::UseDefault();
}
// ----------------------------------------------------------------------------
String SwLabCfgItem::GetName() const
{
    return SW_RESSTR(STR_CFG_LABIMG);
}



/*
$Log: not supported by cvs2svn $
Revision 1.38  2000/09/18 16:05:26  willem.vandorp
OpenOffice header added.

Revision 1.37  2000/06/26 16:32:15  jp
have to change: enums of AddressToken

Revision 1.36  2000/05/26 07:21:29  os
old SW Basic API Slots removed

Revision 1.35  2000/04/18 15:31:35  os
UNICODE

Revision 1.34  2000/02/11 14:45:49  hr
#70473# changes for unicode ( patched by automated patchtool )

Revision 1.33  2000/01/11 13:26:13  os
#71720# business cards synchronized by default

Revision 1.32  1999/12/07 16:34:13  os
#70355##70559# SHORTCUT->INITIALS; second private name

Revision 1.31  1999/09/30 07:53:06  os
Label config item and LabItem contain business information

Revision 1.30  1998/03/14 16:06:50  OM
Gelinkte Etiketten


      Rev 1.29   14 Mar 1998 17:06:50   OM
   Gelinkte Etiketten

      Rev 1.28   24 Nov 1997 11:52:10   MA
   includes

      Rev 1.27   03 Nov 1997 13:17:14   MA
   precomp entfernt

      Rev 1.26   08 Aug 1997 17:29:34   OM
   Headerfile-Umstellung

      Rev 1.25   18 Nov 1996 10:45:48   SWG
   includes

      Rev 1.24   14 Nov 1996 15:24:44   TRI
   includes

      Rev 1.23   11 Nov 1996 09:44:16   MA
   ResMgr

      Rev 1.22   26 Jul 1996 20:36:40   MA
   includes

      Rev 1.21   28 Jun 1996 10:10:52   OS
   UseDefault: Basisklasse rufen

      Rev 1.20   06 Jun 1996 12:59:42   OM
   Datenbankname merken

      Rev 1.19   27 Nov 1995 18:55:40   OS
   Umstellung 303a

      Rev 1.18   24 Nov 1995 16:59:40   OM
   PCH->PRECOMPILED

      Rev 1.17   16 Nov 1995 18:37:46   OS
   neu: Get/SetVariable, nicht impl.

      Rev 1.16   21 Sep 1995 00:40:56   JP
   Bug 19511: VersionsNummer im richtigen Format aus dem Stream lesen (int <-> USHORT!!!)

      Rev 1.15   15 Sep 1995 21:14:22   OS
   add: cfgstr.hrc

      Rev 1.14   15 Sep 1995 12:41:00   OS
   GetName() implementiert

      Rev 1.13   04 Sep 1995 13:53:58   HJS
   add: #include <sbx.hxx>

      Rev 1.12   09 Aug 1995 18:59:46   AMA
   kein GetPresentation

      Rev 1.11   07 Aug 1995 18:19:46   AMA
   Umbau: GetValueText -> GetPresentation

      Rev 1.10   30 Jul 1995 11:25:30   MA
   chg: Letze Einstellung merken fuer Label

      Rev 1.9   10 Jul 1995 09:52:36   MA
   LabelDlg optimiert und etwas aufgeraeumt.

      Rev 1.8   24 May 1995 18:17:14   ER
   Segmentierung

      Rev 1.7   17 Mar 1995 17:10:30   PK
   geht immer weiter

      Rev 1.6   15 Mar 1995 13:27:04   PK
   geht immer weiter

      Rev 1.5   06 Mar 1995 00:08:28   PK
   linkbarer envelp-zustand

      Rev 1.4   20 Feb 1995 19:39:52   PK
   erstma eingecheckt

      Rev 1.3   09 Jan 1995 16:57:48   ER
    del: envelp hrc

*/

diff --git a/sw/source/ui/envelp/labimp.hxx b/sw/source/ui/envelp/labimp.hxx
new file mode 100644
index 0000000..9f8ae92
--- /dev/null
+++ b/sw/source/ui/envelp/labimp.hxx
@@ -0,0 +1,456 @@
/*************************************************************************
 *
 *  $RCSfile: labimp.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:36 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _LABIMP_HXX
#define _LABIMP_HXX


#ifndef _SFXTABDLG_HXX //autogen
#include <sfx2/tabdlg.hxx>
#endif
#ifndef _SV_LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif
#ifndef _SV_FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif
#ifndef _SVEDIT_HXX //autogen
#include <svtools/svmedit.hxx>
#endif
#ifndef _SV_GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif
#ifndef _SV_FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif
#ifndef _STDCTRL_HXX //autogen
#include <svtools/stdctrl.hxx>
#endif
#ifndef _COM_SUN_STAR_FRAME_XCONTROLLER_HPP_
#include <com/sun/star/frame/XController.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXTCURSOR_HPP_
#include <com/sun/star/text/XTextCursor.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XWORDCURSOR_HPP_
#include <com/sun/star/text/XWordCursor.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XPARAGRAPHCURSOR_HPP_
#include <com/sun/star/text/XParagraphCursor.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XPAGECURSOR_HPP_
#include <com/sun/star/text/XPageCursor.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XSENTENCECURSOR_HPP_
#include <com/sun/star/text/XSentenceCursor.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XFILEDIALOG_HPP_
#include <com/sun/star/awt/XFileDialog.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XTEXTCOMPONENT_HPP_
#include <com/sun/star/awt/XTextComponent.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XLISTBOX_HPP_
#include <com/sun/star/awt/XListBox.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XPROGRESSMONITOR_HPP_
#include <com/sun/star/awt/XProgressMonitor.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_TEXTALIGN_HPP_
#include <com/sun/star/awt/TextAlign.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XSCROLLBAR_HPP_
#include <com/sun/star/awt/XScrollBar.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XVCLCONTAINERPEER_HPP_
#include <com/sun/star/awt/XVclContainerPeer.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XTABCONTROLLERMODEL_HPP_
#include <com/sun/star/awt/XTabControllerModel.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XMESSAGEBOX_HPP_
#include <com/sun/star/awt/XMessageBox.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XTEXTEDITFIELD_HPP_
#include <com/sun/star/awt/XTextEditField.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_STYLE_HPP_
#include <com/sun/star/awt/Style.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XTIMEFIELD_HPP_
#include <com/sun/star/awt/XTimeField.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XVCLWINDOWPEER_HPP_
#include <com/sun/star/awt/XVclWindowPeer.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XCONTROLMODEL_HPP_
#include <com/sun/star/awt/XControlModel.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XSPINFIELD_HPP_
#include <com/sun/star/awt/XSpinField.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XUNOCONTROLCONTAINER_HPP_
#include <com/sun/star/awt/XUnoControlContainer.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XTEXTLAYOUTCONSTRAINS_HPP_
#include <com/sun/star/awt/XTextLayoutConstrains.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XNUMERICFIELD_HPP_
#include <com/sun/star/awt/XNumericField.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XBUTTON_HPP_
#include <com/sun/star/awt/XButton.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XTEXTAREA_HPP_
#include <com/sun/star/awt/XTextArea.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XIMAGEBUTTON_HPP_
#include <com/sun/star/awt/XImageButton.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XFIXEDTEXT_HPP_
#include <com/sun/star/awt/XFixedText.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XCONTROLCONTAINER_HPP_
#include <com/sun/star/awt/XControlContainer.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XDIALOG_HPP_
#include <com/sun/star/awt/XDialog.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_SCROLLBARORIENTATION_HPP_
#include <com/sun/star/awt/ScrollBarOrientation.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XRADIOBUTTON_HPP_
#include <com/sun/star/awt/XRadioButton.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XCURRENCYFIELD_HPP_
#include <com/sun/star/awt/XCurrencyField.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XPATTERNFIELD_HPP_
#include <com/sun/star/awt/XPatternField.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_VCLWINDOWPEERATTRIBUTE_HPP_
#include <com/sun/star/awt/VclWindowPeerAttribute.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XTABCONTROLLER_HPP_
#include <com/sun/star/awt/XTabController.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XVCLCONTAINER_HPP_
#include <com/sun/star/awt/XVclContainer.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XDATEFIELD_HPP_
#include <com/sun/star/awt/XDateField.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XCOMBOBOX_HPP_
#include <com/sun/star/awt/XComboBox.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XCONTROL_HPP_
#include <com/sun/star/awt/XControl.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XCHECKBOX_HPP_
#include <com/sun/star/awt/XCheckBox.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_MESSAGEBOXCOMMAND_HPP_
#include <com/sun/star/awt/MessageBoxCommand.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XLAYOUTCONSTRAINS_HPP_
#include <com/sun/star/awt/XLayoutConstrains.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XPROGRESSBAR_HPP_
#include <com/sun/star/awt/XProgressBar.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XNAMEACCESS_HPP_
#include <com/sun/star/container/XNameAccess.hpp>
#endif
#ifndef _SVTREEBOX_HXX
#include <svtools/svtreebx.hxx>
#endif

#include "label.hxx"
#include "labimg.hxx"

#define GETFLDVAL(rField)         (rField).Denormalize((rField).GetValue(FUNIT_TWIP))
#define SETFLDVAL(rField, lValue) (rField).SetValue((rField).Normalize(lValue), FUNIT_TWIP)

class SwNewDBMgr;

class SwLabRec
{
    long GetLong(const String& rStr, MetricField& rField);

public:
    SwLabRec() {}
    SwLabRec( String& rStr, MetricField& rField );

    String aMake;
    String aType;
    long   lHDist;
    long   lVDist;
    long   lWidth;
    long   lHeight;
    long   lLeft;
    long   lUpper;
    sal_uInt16 nCols;
    sal_uInt16 nRows;
    sal_Bool   bCont;
};

/* --------------------------------------------------

 --------------------------------------------------*/
SV_DECL_PTRARR_DEL( SwLabRecs, SwLabRec*, 110, 10 );

class SwLabPage : public SfxTabPage
{
    SwNewDBMgr*   pNewDBMgr;
    String        sActDBName;
    SwLabItem     aItem;

    FixedText     aWritingText;
    CheckBox      aAddrBox;
    MultiLineEdit aWritingEdit;
    FixedText     aDatabaseFT;
    ListBox       aDatabaseLB;
    FixedText     aTableFT;
    ListBox       aTableLB;
    ImageButton   aInsertBT;
    FixedText     aDBFieldFT;
    ListBox       aDBFieldLB;
//  PushButton    aDatabaseButton;
    GroupBox      aWritingGroup;

    RadioButton   aContButton;
    RadioButton   aSheetButton;
    FixedText     aMakeText;
    ListBox       aMakeBox;
    FixedText     aTypeText;
    ListBox       aTypeBox;
    FixedInfo     aFormatInfo;
    GroupBox      aFormatGroup;

    sal_Bool        m_bLabel;

     SwLabPage(Window* pParent, const SfxItemSet& rSet);
    ~SwLabPage();

    DECL_LINK( AddrHdl, Button * );
    DECL_LINK( DatabaseHdl, ListBox *pListBox );
//    DECL_LINK( DatabaseButtonHdl, Button * );
    DECL_LINK( FieldHdl, Button * );
    DECL_LINK( PageHdl, Button * );
    DECL_LINK( MakeHdl, ListBox * );
    DECL_LINK( TypeHdl, ListBox * );

    void DisplayFormat  ();
    SwLabRec* GetSelectedEntryPos();

public:
    static SfxTabPage* Create(Window* pParent, const SfxItemSet& rSet);

    virtual void ActivatePage(const SfxItemSet& rSet);
    virtual int  DeactivatePage(SfxItemSet* pSet = 0);
            void FillItem(SwLabItem& rItem);
    virtual sal_Bool FillItemSet(SfxItemSet& rSet);
    virtual void Reset(const SfxItemSet& rSet);

    SwLabDlg* GetParent() {return (SwLabDlg*) SfxTabPage::GetParent()->GetParent();}

    void    SetToBusinessCard();

    void InitDatabaseBox();
    inline void SetNewDBMgr(SwNewDBMgr* pDBMgr) { pNewDBMgr = pDBMgr; }
    inline SwNewDBMgr* GetNewDBMgr() const { return pNewDBMgr; }
};

/* -----------------08.07.99 13:48-------------------

 --------------------------------------------------*/
class SwOneExampleFrame;
class SwVisitingCardPage : public SfxTabPage
{
    SvTreeListBox   aAutoTextLB;
    FixedText       aAutoTextGroupFT;
    ListBox         aAutoTextGroupLB;

    GroupBox        aContentGB;

    Window          aExampleWIN;
    GroupBox        aExampleGB;

    String          sVisCardGroup;
    String          sTempURL;

    SwLabItem       aLabItem;

    SwOneExampleFrame*  pExampleFrame;
    ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >    _xAutoText;

    DECL_LINK( AutoTextSelectHdl, void* );
    DECL_LINK( FrameControlInitializedHdl, void* );

    void            InitFrameControl();
    void            UpdateFields();

    SwVisitingCardPage(Window* pParent, const SfxItemSet& rSet);
    ~SwVisitingCardPage();

public:
    static SfxTabPage* Create(Window* pParent, const SfxItemSet& rSet);

    virtual void ActivatePage(const SfxItemSet& rSet);
    virtual int  DeactivatePage(SfxItemSet* pSet = 0);
    virtual sal_Bool FillItemSet(SfxItemSet& rSet);
    virtual void Reset(const SfxItemSet& rSet);
};
/* -----------------29.09.99 08:51-------------------

 --------------------------------------------------*/
class SwPrivateDataPage : public SfxTabPage
{
    GroupBox        aDataGB;

    FixedText       aNameFT;
    Edit            aFirstNameED;
    Edit            aNameED;
    Edit            aShortCutED;

    FixedText       aName2FT;
    Edit            aFirstName2ED;
    Edit            aName2ED;
    Edit            aShortCut2ED;

    FixedText       aStreetFT;
    Edit            aStreetED;
    FixedText       aZipCityFT;
    Edit            aZipED;
    Edit            aCityED;
    FixedText       aCountryStateFT;
    Edit            aCountryED;
    Edit            aStateED;
    FixedText       aTitleProfessionFT;
    Edit            aTitleED;
    Edit            aProfessionED;
    FixedText       aPhoneFT;
    Edit            aPhoneED;
    Edit            aMobilePhoneED;
    FixedText       aFaxFT;
    Edit            aFaxED;
    FixedText       aWWWMailFT;
    Edit            aHomePageED;
    Edit            aMailED;

    SwPrivateDataPage(Window* pParent, const SfxItemSet& rSet);
    ~SwPrivateDataPage();

public:
    static SfxTabPage* Create(Window* pParent, const SfxItemSet& rSet);

    virtual void ActivatePage(const SfxItemSet& rSet);
    virtual int  DeactivatePage(SfxItemSet* pSet = 0);
    virtual sal_Bool FillItemSet(SfxItemSet& rSet);
    virtual void Reset(const SfxItemSet& rSet);
};
/* -----------------29.09.99 08:51-------------------

 --------------------------------------------------*/
class SwBusinessDataPage : public SfxTabPage
{
    GroupBox        aDataGB;
    FixedText       aCompanyFT;
    Edit            aCompanyED;
    FixedText       aCompanyExtFT;
    Edit            aCompanyExtED;
    FixedText       aSloganFT;
    Edit            aSloganED;

    FixedText       aStreetFT;
    Edit            aStreetED;
    FixedText       aZipCityFT;
    Edit            aZipED;
    Edit            aCityED;
    FixedText       aCountryStateFT;
    Edit            aCountryED;
    Edit            aStateED;

    FixedText       aPositionFT;
    Edit            aPositionED;

    FixedText       aPhoneFT;
    Edit            aPhoneED;
    Edit            aMobilePhoneED;
    Edit            aFaxED;

    FixedText       aWWWMailFT;
    Edit            aHomePageED;
    Edit            aMailED;

    SwBusinessDataPage(Window* pParent, const SfxItemSet& rSet);
    ~SwBusinessDataPage();

public:
    static SfxTabPage* Create(Window* pParent, const SfxItemSet& rSet);

    virtual void ActivatePage(const SfxItemSet& rSet);
    virtual int  DeactivatePage(SfxItemSet* pSet = 0);
    virtual sal_Bool FillItemSet(SfxItemSet& rSet);
    virtual void Reset(const SfxItemSet& rSet);
};

#endif

diff --git a/sw/source/ui/envelp/labprt.cxx b/sw/source/ui/envelp/labprt.cxx
new file mode 100644
index 0000000..6ea7036
--- /dev/null
+++ b/sw/source/ui/envelp/labprt.cxx
@@ -0,0 +1,381 @@
/*************************************************************************
 *
 *  $RCSfile: labprt.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:36 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include <vcl/system.hxx>
#ifndef _SV_PRNSETUP_HXX_ //autogen
#include <svtools/prnsetup.hxx>
#endif
#ifndef _SV_PRINT_HXX
#include <vcl/print.hxx>
#endif

#include "wrtsh.hxx"
#include "cmdid.h"
#include "label.hxx"
#include "labprt.hxx"
#include "labimg.hxx"
#include "labimp.hxx"

#include "labprt.hrc"


// --------------------------------------------------------------------------



SwLabPrtPage::SwLabPrtPage(Window* pParent, const SfxItemSet& rSet) :

    SfxTabPage(pParent, SW_RES(TP_LAB_PRT), rSet),

    pPrinter( 0 ),
    aPageButton    (this, SW_RES(BTN_PAGE   )),
    aSingleButton  (this, SW_RES(BTN_SINGLE )),
    aColText       (this, SW_RES(TXT_COL    )),
    aColField      (this, SW_RES(FLD_COL    )),
    aRowText       (this, SW_RES(TXT_ROW    )),
    aRowField      (this, SW_RES(FLD_ROW    )),
    aSynchronCB    (this, SW_RES(CB_SYNCHRON)),
    aGBDontKnow    (this, SW_RES(GB_DONTKNOW)),
    aPrinterInfo   (this, SW_RES(INF_PRINTER)),
    aPrtSetup      (this, SW_RES(BTN_PRTSETUP)),
    aGBPrinter     (this, SW_RES(GB_PRINTER ))

{
    FreeResource();
    SetExchangeSupport();

    // Handler installieren
    Link aLk = LINK(this, SwLabPrtPage, CountHdl);
    aPageButton  .SetClickHdl( aLk );
    aSingleButton.SetClickHdl( aLk );

    aPrtSetup.SetClickHdl( aLk );
}

// --------------------------------------------------------------------------



SwLabPrtPage::~SwLabPrtPage()
{
    if (pPrinter)
        delete pPrinter;
}

// --------------------------------------------------------------------------



IMPL_LINK( SwLabPrtPage, CountHdl, Button *, pButton )
{
    if (pButton == &aPrtSetup)
    {
        // Druck-Setup aufrufen
        if (!pPrinter)
            pPrinter = new Printer;

        PrinterSetupDialog* pDlg = new PrinterSetupDialog(this );
        pDlg->SetPrinter(pPrinter);
        pDlg->Execute();
        delete pDlg;
        GrabFocus();
        aPrinterInfo.SetText(pPrinter->GetName());
        return 0;
    }
    const BOOL bEnable = pButton == &aSingleButton;
    aColText .Enable(bEnable);
    aColField.Enable(bEnable);
    aRowText .Enable(bEnable);
    aRowField.Enable(bEnable);
    aSynchronCB.Enable(!bEnable);

    if ( bEnable )
        aColField.GrabFocus();
#ifndef PRODUCT
    else
        ASSERT( pButton == &aPageButton, "NewButton?" );
#endif
    return 0;
}

// --------------------------------------------------------------------------



SfxTabPage* SwLabPrtPage::Create(Window* pParent, const SfxItemSet& rSet)
{
    return new SwLabPrtPage( pParent, rSet );
}

// --------------------------------------------------------------------------



void SwLabPrtPage::ActivatePage( const SfxItemSet& rSet )
{
    Reset(rSet);
}

// --------------------------------------------------------------------------



int SwLabPrtPage::DeactivatePage(SfxItemSet* pSet)
{
    if ( pSet )
        FillItemSet(*pSet);

    return TRUE;
}

// --------------------------------------------------------------------------



void SwLabPrtPage::FillItem(SwLabItem& rItem)
{
    rItem.bPage = aPageButton.IsChecked();
    rItem.nCol  = (USHORT) aColField.GetValue();
    rItem.nRow  = (USHORT) aRowField.GetValue();
    rItem.bSynchron = aSynchronCB.IsChecked() && aSynchronCB.IsEnabled();
}

// --------------------------------------------------------------------------



BOOL SwLabPrtPage::FillItemSet(SfxItemSet& rSet)
{
    SwLabItem aItem;
    GetParent()->GetLabItem(aItem);
    FillItem(aItem);
    rSet.Put(aItem);

    return TRUE;
}

// --------------------------------------------------------------------------



void SwLabPrtPage::Reset(const SfxItemSet& rSet)
{
    SwLabItem aItem;
    GetParent()->GetLabItem(aItem);

    aColField.SetValue   (aItem.nCol);
    aRowField.SetValue   (aItem.nRow);

    if (aItem.bPage)
    {
        aPageButton.Check();
        aPageButton.GetClickHdl().Call(&aPageButton);
    }
    else
    {
        aSingleButton.GetClickHdl().Call(&aSingleButton);
        aSingleButton.Check();
    }

    if (pPrinter)
    {
        // Drucker anzeigen
        aPrinterInfo.SetText(pPrinter->GetName());
    }
    else
        aPrinterInfo.SetText(Printer::GetDefaultPrinterName());

    aColField.SetMax(aItem.nCols);
    aRowField.SetMax(aItem.nRows);

    aColField.SetLast(aColField.GetMax());
    aRowField.SetLast(aRowField.GetMax());

    aSynchronCB.Check(aItem.bSynchron);
}

// --------------------------------------------------------------------------
/*
$Log: not supported by cvs2svn $
Revision 1.37  2000/09/18 16:05:26  willem.vandorp
OpenOffice header added.

Revision 1.36  2000/03/03 15:17:00  os
StarView remainders removed

Revision 1.35  2000/02/11 14:45:41  hr
#70473# changes for unicode ( patched by automated patchtool )

Revision 1.34  1998/09/11 10:29:48  OM
#56319# Richtiges Etikettenformat verwenden


      Rev 1.33   11 Sep 1998 12:29:48   OM
   #56319# Richtiges Etikettenformat verwenden

      Rev 1.32   07 Sep 1998 16:59:32   OM
   #55930# Einzelnes Etikett an der korrekten Position drucken

      Rev 1.31   14 Mar 1998 17:06:50   OM
   Gelinkte Etiketten

      Rev 1.30   14 Mar 1998 14:26:48   OM
   ExchangeSupport repariert/implementiert

      Rev 1.29   14 Mar 1998 14:10:46   OM
   ExchangeSupport repariert/implementiert

      Rev 1.28   16 Feb 1998 15:35:42   RG
   ->DOS-Format

      Rev 1.27   24 Nov 1997 11:52:14   MA
   includes

      Rev 1.26   03 Nov 1997 13:17:10   MA
   precomp entfernt

      Rev 1.25   01 Oct 1997 10:53:46   TRI
   PrintDialogumstellung

      Rev 1.24   11 Nov 1996 09:44:18   MA
   ResMgr

      Rev 1.23   29 Oct 1996 17:59:30   HJS
   includes

      Rev 1.22   07 Oct 1996 09:33:18   MA
   Umstellung Enable/Disable

      Rev 1.21   26 Jul 1996 20:36:38   MA
   includes

      Rev 1.20   28 Jun 1996 16:37:30   HJS
   includes

      Rev 1.19   06 Feb 1996 15:19:08   JP
   Link Umstellung 305

      Rev 1.18   25 Jan 1996 16:58:22   OM
   Dialogfelder richtig initialisieren

      Rev 1.17   08 Dec 1995 18:07:14   OM
   Drucker im Dtor loeschen

      Rev 1.16   27 Nov 1995 19:36:34   OM
   HasExchangeSupport->303a

      Rev 1.15   24 Nov 1995 16:59:40   OM
   PCH->PRECOMPILED

      Rev 1.14   23 Nov 1995 18:03:02   OM
   Etikettenanzahl richtig initialisieren

      Rev 1.13   13 Nov 1995 13:44:04   MA
   chg: Link-Cast entfernt

      Rev 1.12   08 Nov 1995 13:48:20   OM
   Change->Set

      Rev 1.11   04 Aug 1995 18:32:48   OM
   Umstellung Drucktabpage

      Rev 1.10   03 Aug 1995 18:49:38   OM
   Umstellung Print-TabPage

      Rev 1.9   13 Jul 1995 13:44:18   MA
   chg: LabelDlg jetzt ohne vorher ein Dokument zu erzeugen

      Rev 1.8   10 Jul 1995 09:50:20   MA
   LabelDlg optimiert und etwas aufgeraeumt.

      Rev 1.7   24 May 1995 18:13:48   ER
   Segmentierung

      Rev 1.6   18 Apr 1995 18:08:34   PK
   kleine bugfixes

      Rev 1.5   05 Apr 1995 09:27:00   JP
   Benutzung vom Link-Makro eingeschraenkt

      Rev 1.4   23 Mar 1995 18:33:50   PK
   geht immer weiter ...

      Rev 1.3   17 Mar 1995 17:10:32   PK
   geht immer weiter

      Rev 1.2   15 Mar 1995 13:27:08   PK
   geht immer weiter

      Rev 1.1   06 Mar 1995 02:33:38   PK
   envelp cebit-fertig

      Rev 1.0   06 Mar 1995 00:08:26   PK
   linkbarer envelp-zustand
*/



diff --git a/sw/source/ui/envelp/labprt.hrc b/sw/source/ui/envelp/labprt.hrc
new file mode 100644
index 0000000..4b79b23
--- /dev/null
+++ b/sw/source/ui/envelp/labprt.hrc
@@ -0,0 +1,93 @@
/*************************************************************************
 *
 *  $RCSfile: labprt.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:36 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _LABPRT_HRC
#define _LABPRT_HRC

// #include *****************************************************************

#include "envelp.hrc"

// Lokale Resourcen *********************************************************

#define BTN_PAGE      1
#define BTN_SINGLE    2
#define INF_PRINTER   3
#define TXT_COL       4
#define FLD_COL       5
#define TXT_ROW       6
#define FLD_ROW       7
#define BTN_PRTSETUP  8
#define GB_PRINTER    9
#define GB_DONTKNOW  10
#define CB_SYNCHRON  11

// Ueberlaufpruefung ********************************************************

#define LABPRT_ACT_END  0

#if LABPRT_ACT_END > RC_LABPRT_END
#error Resource-Ueberlauf in #file, #line
#endif

#endif


diff --git a/sw/source/ui/envelp/labprt.hxx b/sw/source/ui/envelp/labprt.hxx
new file mode 100644
index 0000000..8473974
--- /dev/null
+++ b/sw/source/ui/envelp/labprt.hxx
@@ -0,0 +1,124 @@
/*************************************************************************
 *
 *  $RCSfile: labprt.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:36 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _LABPRT_HXX
#define _LABPRT_HXX

#ifndef _SV_GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif
#ifndef _SV_FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif
#ifndef _STDCTRL_HXX //autogen
#include <svtools/stdctrl.hxx>
#endif
#ifndef _SV_BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif
#ifndef _SFXTABDLG_HXX //autogen
#include <sfx2/tabdlg.hxx>
#endif


class SwLabDlg;
class SwLabItem;

// class SwLabPrtPage -------------------------------------------------------

class SwLabPrtPage : public SfxTabPage
{
    Printer*      pPrinter;             //Fuer die Schachteinstellug - leider.

    RadioButton   aPageButton;
    RadioButton   aSingleButton;
    FixedText     aColText;
    NumericField  aColField;
    FixedText     aRowText;
    NumericField  aRowField;
    CheckBox      aSynchronCB;
    GroupBox      aGBDontKnow;

    FixedInfo     aPrinterInfo;
    PushButton    aPrtSetup;
    GroupBox      aGBPrinter;

     SwLabPrtPage(Window* pParent, const SfxItemSet& rSet);
    ~SwLabPrtPage();

    DECL_LINK( CountHdl, Button * );

    SwLabDlg* GetParent() {return (SwLabDlg*) SfxTabPage::GetParent()->GetParent();}

public:

    static SfxTabPage* Create(Window* pParent, const SfxItemSet& rSet);

    virtual void ActivatePage(const SfxItemSet& rSet);
    virtual int  DeactivatePage(SfxItemSet* pSet = 0);
            void FillItem(SwLabItem& rItem);
    virtual BOOL FillItemSet(SfxItemSet& rSet);
    virtual void Reset(const SfxItemSet& rSet);
    inline Printer* GetPrt() { return (pPrinter); }
};

#endif


diff --git a/sw/source/ui/envelp/labprt.src b/sw/source/ui/envelp/labprt.src
new file mode 100644
index 0000000..8e924b9
--- /dev/null
+++ b/sw/source/ui/envelp/labprt.src
@@ -0,0 +1,317 @@
/*************************************************************************
 *
 *  $RCSfile: labprt.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:36 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
 // #pragma ******************************************************************

 // #include *****************************************************************
#include "labprt.hrc"
#include "helpid.h"
 // TP_LAB_PRT ---------------------------------------------------------------
TabPage TP_LAB_PRT
{
    HelpID = HID_LAB_PRT ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Hide = TRUE ;
    RadioButton BTN_PAGE
    {
        Pos = MAP_APPFONT ( 12 , 14 ) ;
        Size = MAP_APPFONT ( 55 , 10 ) ;
        Text = "~Ganze Seite" ;
        Text [ ENGLISH ] = "Whole page" ;
        Text [ NORWEGIAN ] = "Hele siden" ;
        Text [ DANISH ] = "Hele siden" ;
        Text [ ENGLISH_US ] = "~Entire page" ;
        Text [ SPANISH ] = "~Toda la página" ;
        Text [ FINNISH ] = "Koko sivu" ;
        Text [ FRENCH ] = "~Page entière" ;
        Text [ ITALIAN ] = "Pagina ~intera" ;
        Text [ DUTCH ] = "~Hele pagina" ;
        Text [ PORTUGUESE_BRAZILIAN ] = "Pßgina inteira" ;
        Text [ SWEDISH ] = "H~ela sidan" ;
        Text [ PORTUGUESE ] = "Página ~inteira" ;
        TabStop = TRUE ;
        Group = TRUE ;
        Text[ chinese_simplified ] = "ÕûÒ³(~E)";
        Text[ russian ] = "Âñÿ ñòðàíèöà";
        Text[ polish ] = "Ca³a strona";
        Text[ japanese ] = "Íß°¼Þ‘S‘Ì(~E)";
        Text[ chinese_traditional ] = "¾ã­¶(~E)";
        Text[ arabic ] = "ÕÝÍÉ ßÇãáÉ";
        Text[ greek ] = "Ïëüêëçñç óåëßäá";
        Text[ korean ] = "Àüü ÆäÀÌÁö(~E)";
        Text[ turkish ] = "~Tam sayfa";
    };
    RadioButton BTN_SINGLE
    {
        Pos = MAP_APPFONT ( 12 , 26 ) ;
        Size = MAP_APPFONT ( 70 , 10 ) ;
        Text = "Einzelnes Eti~kett" ;
        Text [ ENGLISH ] = "Single label" ;
        Text [ NORWEGIAN ] = "Single label" ;
        Text [ DANISH ] = "Enkelt etiket" ;
        Text [ ENGLISH_US ] = "~Single label" ;
        Text [ SPANISH ] = "~Una etiqueta" ;
        Text [ FINNISH ] = "Yksi tarra" ;
        Text [ FRENCH ] = "~Étiquette unique" ;
        Text [ ITALIAN ] = "Singola etichetta" ;
        Text [ DUTCH ] = "~Een enkel" ;
        Text [ PORTUGUESE_BRAZILIAN ] = "Etiqueta simples" ;
        Text [ SWEDISH ] = "Enstaka eti~kett" ;
        Text [ PORTUGUESE ] = "E~tiqueta única" ;
        Text[ chinese_simplified ] = "µ¥¸ö±êÇ©(~S)";
        Text[ russian ] = "Îòäåëüíàÿ íàêëåéêà";
        Text[ polish ] = "Poj~edyncza etykieta";
        Text[ japanese ] = "1–‡‚‚Ì×ÍÞÙ(~S)";
        Text[ chinese_traditional ] = "³æ­Ó¶K¼Ð(~S)";
        Text[ arabic ] = "ÈØÇÞÉ ÚäæäÉ ãÝÑÏÉ";
        Text[ greek ] = "ÌåìïíùìÝíç åôéêÝôá";
        Text[ korean ] = "´ÜÀÏ ¶óº§(~S)";
        Text[ turkish ] = "Tek Eti~ket";
    };
    FixedText TXT_COL
    {
        Pos = MAP_APPFONT ( 132 , 27 ) ;
        Size = MAP_APPFONT ( 28 , 8 ) ;
        Text = "S~palte" ;
        Text [ ENGLISH ] = "Column" ;
        Text [ NORWEGIAN ] = "Column" ;
        Text [ DANISH ] = "Kolonne" ;
        Text [ ENGLISH_US ] = "Colu~mn" ;
        Text [ SPANISH ] = "C~olumna" ;
        Text [ FINNISH ] = "Sarake" ;
        Text [ FRENCH ] = "~Colonne" ;
        Text [ ITALIAN ] = "Colonna" ;
        Text [ DUTCH ] = "~Kolom" ;
        Text [ PORTUGUESE_BRAZILIAN ] = "Coluna" ;
        Text [ SWEDISH ] = "Kolu~mn" ;
        Text [ PORTUGUESE ] = "~Coluna" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "ÁÐ(~M)";
        Text[ russian ] = "Êîëîíêà";
        Text[ polish ] = "Kolumna";
        Text[ japanese ] = "—ñ(~M)";
        Text[ chinese_traditional ] = "Äæ(~M)";
        Text[ arabic ] = "ÚãæÏ";
        Text[ greek ] = "ÓôÞëç";
        Text[ korean ] = "¿­(~M)";
        Text[ turkish ] = "~Sütun";
    };
    NumericField FLD_COL
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 161 , 24 ) ;
        Size = MAP_APPFONT ( 24 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 1 ;
        First = 1 ;
    };
    FixedText TXT_ROW
    {
        Pos = MAP_APPFONT ( 193 , 27 ) ;
        Size = MAP_APPFONT ( 28 , 10 ) ;
        Text = "Zei~le" ;
        Text [ ENGLISH ] = "Row" ;
        Text [ NORWEGIAN ] = "Row" ;
        Text [ DANISH ] = "Række" ;
        Text [ ENGLISH_US ] = "Ro~w" ;
        Text [ SPANISH ] = "~Fila" ;
        Text [ FINNISH ] = "Rivi" ;
        Text [ FRENCH ] = "~Ligne" ;
        Text [ ITALIAN ] = "Riga" ;
        Text [ DUTCH ] = "~Rij" ;
        Text [ PORTUGUESE_BRAZILIAN ] = "Fileira" ;
        Text [ SWEDISH ] = "~Rad" ;
        Text [ PORTUGUESE ] = "~Linha" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "ÐÐ(~W)";
        Text[ russian ] = "Ñòðîêà";
        Text[ polish ] = "Wiersz";
        Text[ japanese ] = "s(~Wj";
        Text[ chinese_traditional ] = "¦æ(~W)";
        Text[ arabic ] = "ÕÝ";
        Text[ greek ] = "ÃñáììÞ";
        Text[ korean ] = "Çà(~W)";
        Text[ turkish ] = "S~atýr";
    };
    NumericField FLD_ROW
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 224 , 24 ) ;
        Size = MAP_APPFONT ( 24 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 1 ;
        First = 1 ;
    };
    CheckBox CB_SYNCHRON
    {
        Pos = MAP_APPFONT ( 12 , 43 ) ;
        Size = MAP_APPFONT ( 100 , 10 ) ;
        Text = "Inhalte ~synchronisieren" ;
        Text [ ENGLISH ] = "~Synchronize content" ;
        TabStop = TRUE ;
        Text [ english_us ] = "Synchroni~ze contents" ;
        Text [ portuguese_brazilian ] = "Inhalte ~synchronisieren" ;
        Text [ swedish ] = "~Synkronisera innehåll" ;
        Text [ danish ] = "Synkroniser indhold" ;
        Text [ italian ] = "Sincronizza ~contenuti" ;
        Text [ spanish ] = "~Sincronizar contenidos" ;
        Text [ french ] = "~Synchroniser le contenu" ;
        Text [ dutch ] = "Inhoud ~synchroniseren" ;
        Text [ portuguese ] = "~Sincronizar conteúdos" ;
        Text[ chinese_simplified ] = "ÄÚÈÝͬ²½»¯(~S)";
        Text[ russian ] = "Ñèíõðîíèçàöèÿ ñîäåðæèìîãî";
        Text[ polish ] = "Synchronizacja treœci";
        Text[ japanese ] = "“à—e‚𓯊ú‚·‚é(~S)";
        Text[ chinese_traditional ] = "¤º®e¦P¨B¤Æ(~S)";
        Text[ arabic ] = "ÊÒÇãä ÇáãÍÊæíÇÊ";
        Text[ greek ] = "Óõã÷ñïíéóìüò ðåñéå÷ïìÝíùí";
        Text[ korean ] = "³»¿ë µ¿±âÈ­(~Z)";
        Text[ turkish ] = "Ýçeriði çoðalt";
    };
    GroupBox GB_DONTKNOW
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 248 , 60 ) ;
    };
    FixedText INF_PRINTER
    {
        Pos = MAP_APPFONT ( 12 , 82 ) ;
        Size = MAP_APPFONT ( 171 , 10 ) ;
        Text = "Druckername" ;
        Text [ ENGLISH ] = "Printer name" ;
        Left = TRUE ;
        Text [ english_us ] = "Printer Name" ;
        Text [ italian ] = "Nome stampante" ;
        Text [ spanish ] = "Nombre de la impresora" ;
        Text [ french ] = "Nom de l'imprimante" ;
        Text [ dutch ] = "Printer naam" ;
        Text [ swedish ] = "Skrivarnamn" ;
        Text [ danish ] = "Printernavn" ;
        Text [ portuguese_brazilian ] = "Druckername" ;
        Text [ portuguese ] = "Nome da impressora" ;
        Text[ chinese_simplified ] = "´òÓ¡»úÃû³Æ";
        Text[ russian ] = "Íàçâàíèå ïðèíòåðà";
        Text[ polish ] = "Nazwa drukarki";
        Text[ japanese ] = "ÌߨÝÀ–¼";
        Text[ chinese_traditional ] = "¦Lªí¾÷¦WºÙ";
        Text[ arabic ] = "ÇÓã ÇáØÇÈÚÉ";
        Text[ greek ] = "¼íïìá åêôõðùôÞ";
        Text[ korean ] = "ÇÁ¸°ÅÍ À̸§";
        Text[ turkish ] = "Yazýcý adý";
    };
    PushButton BTN_PRTSETUP
    {
        Pos = MAP_APPFONT ( 200 , 80 ) ;
        Size = MAP_APPFONT ( 48 , 14 ) ;
        Text = "~Einrichten..." ;
        Text [ ENGLISH ] = "Setup..." ;
        TabStop = TRUE ;
        Text [ english_us ] = "Setup..." ;
        Text [ italian ] = "Imposta..." ;
        Text [ spanish ] = "Configurar..." ;
        Text [ french ] = "~Paramétrer..." ;
        Text [ dutch ] = "~Configureren..." ;
        Text [ swedish ] = "Inrätta..." ;
        Text [ danish ] = "Indstil..." ;
        Text [ portuguese_brazilian ] = "Einrichten..." ;
        Text [ portuguese ] = "~Configurar..." ;
        Text[ chinese_simplified ] = "ÉèÖÃ...";
        Text[ russian ] = "Íàñòðîéêà...";
        Text[ polish ] = "Ust~aw";
        Text[ japanese ] = "Ý’è...";
        Text[ chinese_traditional ] = "³]¸m...";
        Text[ arabic ] = "...ÅÚÏÇÏ";
        Text[ greek ] = "~ÅãêáôÜóôáóç...";
        Text[ korean ] = "¼³Á¤...";
        Text[ turkish ] = "Ayarlar...";
    };
    GroupBox GB_PRINTER
    {
        Pos = MAP_APPFONT ( 6 , 70 ) ;
        Size = MAP_APPFONT ( 248 , 32 ) ;
        Text = " Drucker " ;
        Text [ ENGLISH ] = " Printer " ;
        Text [ dutch ] = "Printer " ;
        Text [ english_us ] = "Printer " ;
        Text [ italian ] = "Stampante " ;
        Text [ spanish ] = "Impresora  " ;
        Text [ french ] = "Imprimante " ;
        Text [ swedish ] = "Skrivare  " ;
        Text [ danish ] = "Printer " ;
        Text [ portuguese_brazilian ] = "Drucker " ;
        Text [ portuguese ] = "Impressora " ;
        Text[ chinese_simplified ] = "´òÓ¡»ú ";
        Text[ russian ] = "Ïðèíòåð  ";
        Text[ polish ] = "Drukarka ";
        Text[ japanese ] = "ÌߨÝÀ ";
        Text[ chinese_traditional ] = "¦Lªí¾÷ ";
        Text[ arabic ] = "ÇáØÇÈÚÉ ";
        Text[ greek ] = "ÅêôõðùôÞò ";
        Text[ korean ] = "ÇÁ¸°ÅÍ ";
        Text[ turkish ] = "Yazýcý ";
    };
};
 // **************************************************************************
diff --git a/sw/source/ui/envelp/mailmrge.cxx b/sw/source/ui/envelp/mailmrge.cxx
new file mode 100644
index 0000000..5496777
--- /dev/null
+++ b/sw/source/ui/envelp/mailmrge.cxx
@@ -0,0 +1,686 @@
/*************************************************************************
 *
 *  $RCSfile: mailmrge.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:35 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop
#ifndef _SDB_SDBHASH_HXX
#include <sdb/sdbhash.hxx>
#endif
#ifndef _IODLG_HXX
#include "sfx2/iodlg.hxx"
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif
#ifndef _MAILENUM_HXX //autogen
#include <goodies/mailenum.hxx>
#endif
#ifndef _SFXINIMGR_HXX //autogen
#include <svtools/iniman.hxx>
#endif
#ifndef _SVX_MULTIFIL_HXX
#include <svx/multifil.hxx>
#endif
#ifndef _URLOBJ_HXX
#include <tools/urlobj.hxx>
#endif

#include "helpid.h"
#include "view.hxx"
#include "docsh.hxx"
#include "wrtsh.hxx"
#include "dbmgr.hxx"
#include "dbui.hxx"
#include "swmodule.hxx"
#include "modcfg.hxx"

#include "envelp.hrc"
#include "mailmrge.hrc"
#include "mailmrge.hxx"

#ifdef REPLACE_OFADBMGR
#ifndef _COM_SUN_STAR_SDBCX_XCOLUMNSSUPPLIER_HPP_
#include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBC_XDATASOURCE_HPP_
#include <com/sun/star/sdbc/XDataSource.hpp>
#endif

using namespace rtl;
using namespace com::sun::star::container;
using namespace com::sun::star::lang;
using namespace com::sun::star::sdbc;
using namespace com::sun::star::sdbcx;
using namespace com::sun::star::beans;
using namespace com::sun::star::util;
using namespace com::sun::star::uno;

#endif

#define C2S(cChar) UniString::CreateFromAscii(cChar)

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

SwMailMergeDlg::SwMailMergeDlg(Window *pParent, SwWrtShell *pShell,
            const String& rName,
#ifdef REPLACE_OFADBMGR
        const String& rTblName,
#endif
            const String& rStat,
            SbaSelectionListRef& pSelList):

    SvxStandardDialog(pParent, SW_RES(DLG_MAILMERGE)),

    aAllRB          (this, SW_RES(RB_ALL)),
    aMarkedRB       (this, SW_RES(RB_MARKED)),
    aFromRB         (this, SW_RES(RB_FROM)),
    aFromNF         (this, SW_RES(NF_FROM)),
    aBisFT          (this, SW_RES(FT_BIS)),
    aToNF           (this, SW_RES(NF_TO)),
    aRecordGB       (this, SW_RES(GB_RECORD)),

    aPrinterRB      (this, SW_RES(RB_PRINTER)),
    aMailingRB      (this, SW_RES(RB_MAILING)),
    aFileRB         (this, SW_RES(RB_FILE)),

    aSingleJobsCB   (this, SW_RES(CB_SINGLE_JOBS)),

    aPathFT         (this, SW_RES(FT_PATH)),
    aPathED         (this, SW_RES(ED_PATH)),
    aPathPB         (this, SW_RES(PB_PATH)),
    aFilenameFT     (this, SW_RES(FT_FILENAME)),
    aColumnRB       (this, SW_RES(RB_COLUMN)),
    aFilenameRB     (this, SW_RES(RB_FILENAME)),
    aColumnLB       (this, SW_RES(LB_COLUMN)),
    aFilenameED     (this, SW_RES(ED_FILENAME)),

    aAddressFT      (this, SW_RES(FT_ADDRESS)),
    aAddressFldLB   (this, SW_RES(LB_ADDRESSFLD)),
    aSubjectFT      (this, SW_RES(FT_SUBJECT)),
    aSubjectED      (this, SW_RES(ED_SUBJECT)),
    aFormatFT       (this, SW_RES(FT_FORMAT)),
    aAttachFT       (this, SW_RES(FT_ATTACH)),
    aAttachED       (this, SW_RES(ED_ATTACH)),
    aAttachPB       (this, SW_RES(PB_ATTACH)),
    aFormatSwCB     (this, SW_RES(CB_FORMAT_SW)),
    aFormatHtmlCB   (this, SW_RES(CB_FORMAT_HTML)),
    aFormatRtfCB    (this, SW_RES(CB_FORMAT_RTF)),
    aDestGB         (this, SW_RES(GB_DEST)),

    aOkBTN          (this, SW_RES(BTN_OK)),
    aCancelBTN      (this, SW_RES(BTN_CANCEL)),
    aHelpBTN        (this, SW_RES(BTN_HELP)),

    pSh             (pShell),
    rDBName         (rName),
#ifdef REPLACE_OFADBMGR
    rTableName      (rTblName),
#endif
    rStatement      (rStat),
    rSelectionList  (pSelList),
    nMergeType      (DBMGR_MERGE_MAILING)

{
    FreeResource();

    DBG_ASSERT(pSh, "Shell fehlt"  );

#ifdef REPLACE_OFADBMGR
#else
    pSbaObject = pSh->GetNewDBMgr()->GetSbaObject();
#endif
    pModOpt = SW_MOD()->GetModuleConfig();

    aSingleJobsCB.Check(pModOpt->IsSinglePrintJob());

    BYTE nMailingMode(pModOpt->GetMailingFormats());
    aFormatSwCB.Check((nMailingMode & TXTFORMAT_OFFICE) != 0);
    aFormatHtmlCB.Check((nMailingMode & TXTFORMAT_HTML) != 0);
    aFormatRtfCB.Check((nMailingMode & TXTFORMAT_RTF) != 0);

#ifdef REPLACE_OFADBMGR
#else
    DBG_ASSERT(pSbaObject, "SbaObject nicht gefunden!");
#endif
    aAllRB.Check(TRUE);

    // Handler installieren
    Link aLk = LINK(this, SwMailMergeDlg, ButtonHdl);
    aOkBTN.SetClickHdl(aLk);

    aPathPB.SetClickHdl(LINK(this, SwMailMergeDlg, InsertPathHdl));
    aAttachPB.SetClickHdl(LINK(this, SwMailMergeDlg, AttachFileHdl));

    aLk = LINK(this, SwMailMergeDlg, RadioButtonHdl);
    aPrinterRB.SetClickHdl(aLk);
    aMailingRB.SetClickHdl(aLk);
    aFileRB.SetClickHdl(aLk);

    aLk = LINK(this, SwMailMergeDlg, FilenameHdl);
    aColumnRB.SetClickHdl(aLk);
    aFilenameRB.SetClickHdl(aLk);
    BOOL bColumn = pModOpt->IsNameFromColumn();
    if (bColumn)
        aColumnRB.Check();
    else
        aFilenameRB.Check();

    FilenameHdl(bColumn ? &aColumnRB : &aFilenameRB);

    aLk = LINK(this, SwMailMergeDlg, ModifyHdl);
    aFromNF.SetModifyHdl(aLk);
    aToNF.SetModifyHdl(aLk);

#ifdef REPLACE_OFADBMGR
    pSh->GetNewDBMgr()->GetColumnNames(&aAddressFldLB, rDBName, rTableName);
#else
    pSh->GetNewDBMgr()->GetColumnNames(&aAddressFldLB, rDBName);
#endif
    for(USHORT nEntry = 0; nEntry < aAddressFldLB.GetEntryCount(); nEntry++)
        aColumnLB.InsertEntry(aAddressFldLB.GetEntry(nEntry));
    aAddressFldLB.SelectEntry(C2S("EMAIL"));

    aPathED.SetText(pModOpt->GetMailingPath());
    if (!aPathED.GetText().Len())
    {
        SfxIniManager* pIniManager = SFX_APP()->GetIniManager();
        ASSERT(pIniManager, "Kein Inimanager angelegt !!");
        aPathED.SetText(pIniManager->Get(SFX_KEY_WORK_PATH));
    }
    String sMailName = pModOpt->GetMailName();

    if (!bColumn || !sMailName.Len())
    {
        aColumnLB.SelectEntry(C2S("NAME"));
        aFilenameED.SetText(sMailName);
    }
    else
        aColumnLB.SelectEntry(sMailName);

    if (aAddressFldLB.GetSelectEntryCount() == 0)
        aAddressFldLB.SelectEntryPos(0);
    if (aColumnLB.GetSelectEntryCount() == 0)
        aColumnLB.SelectEntryPos(0);

    const BOOL bEnable = rSelectionList->Count() != 0;
    aMarkedRB.Enable(bEnable);
    if (bEnable && (long)rSelectionList->GetObject(0) != -1L)
        aMarkedRB.Check();
    else
    {
        aAllRB.Check();
        aMarkedRB.Enable(FALSE);
    }
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

SwMailMergeDlg::~SwMailMergeDlg()
{
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

void SwMailMergeDlg::Apply()
{
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

IMPL_LINK( SwMailMergeDlg, ButtonHdl, Button *, pBtn )
{
    if (pBtn == &aOkBTN)
    {
        ExecQryShell(FALSE);
        EndDialog(RET_OK);
    }
    return 0;
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

IMPL_LINK( SwMailMergeDlg, RadioButtonHdl, RadioButton *, pBtn )
{
    if (pBtn == &aFileRB)
    {
        aAddressFT.Hide();
        aAddressFldLB.Hide();
        aSubjectFT.Hide();
        aSubjectED.Hide();
        aFormatFT.Hide();
        aFormatSwCB.Hide();
        aFormatHtmlCB.Hide();
        aFormatRtfCB.Hide();
        aSingleJobsCB.Hide();
        aAttachFT.Hide();
        aAttachED.Hide();
        aAttachPB.Hide();

        aPathFT.Show();
        aPathED.Show();
        aPathPB.Show();
        aFilenameFT.Show();
        aColumnRB.Show();
        aFilenameRB.Show();
        aColumnLB.Show();
        aFilenameED.Show();
    }
    else
    {
        aAddressFT.Show();
        aAddressFldLB.Show();
        aSubjectFT.Show();
        aSubjectED.Show();
        aFormatFT.Show();
        aFormatSwCB.Show();
        aFormatHtmlCB.Show();
        aFormatRtfCB.Show();
        aAttachFT.Show();
        aAttachED.Show();
        aAttachPB.Show();

        aPathFT.Hide();
        aPathED.Hide();
        aPathPB.Hide();
        aFilenameFT.Hide();
        aColumnRB.Hide();
        aFilenameRB.Hide();
        aColumnLB.Hide();
        aFilenameED.Hide();

        const BOOL bEnable = pBtn != &aPrinterRB;
        aAddressFT.Enable(bEnable);
        aAddressFldLB.Enable(bEnable);
        aSubjectFT.Enable(bEnable);
        aSubjectED.Enable(bEnable);
        aFormatFT.Enable(bEnable);
        aFormatSwCB.Enable(bEnable);
        aFormatHtmlCB.Enable(bEnable);
        aFormatRtfCB.Enable(bEnable);
        aAttachFT.Enable(bEnable);
        aAttachED.Enable(bEnable);
        aAttachPB.Enable(bEnable);

        aAddressFT.Show(bEnable);
        aAddressFldLB.Show(bEnable);
        aSingleJobsCB.Show(!bEnable);
        aSingleJobsCB.Enable(!bEnable);
    }
    return 0;
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

IMPL_LINK( SwMailMergeDlg, FilenameHdl, RadioButton *, pBtn )
{
    BOOL bEnable = pBtn == &aColumnRB;

    aColumnLB.Enable(bEnable);
    aFilenameED.Enable(!bEnable);

    return 0;
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

IMPL_LINK( SwMailMergeDlg, ModifyHdl, NumericField *, pFld )
{
    aFromRB.Check();
    return (0);
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

void SwMailMergeDlg::ExecQryShell(BOOL bVisible)
{
    SwNewDBMgr* pMgr = pSh->GetNewDBMgr();

    if (aPrinterRB.IsChecked())
        nMergeType = DBMGR_MERGE_MAILMERGE;
    else if (aMailingRB.IsChecked())
    {
        nMergeType = DBMGR_MERGE_MAILING;
        pMgr->SetEMailColumn(aAddressFldLB.GetSelectEntry());
        pMgr->SetSubject(aSubjectED.GetText());
        pMgr->SetAttachment(aAttachED.GetText());
    }
    else
    {
        nMergeType = DBMGR_MERGE_MAILFILES;
        String sPath(aPathED.GetText());
        pModOpt->SetMailingPath(sPath);
        String sDelim(INET_PATH_TOKEN);

        if (sPath.Len() >= sDelim.Len() &&
            sPath.Copy(sPath.Len()-sDelim.Len()).CompareTo(sDelim) != COMPARE_EQUAL)
            sPath += sDelim;

        pModOpt->SetNameFromColumn(aColumnRB.IsChecked());

        if (aColumnRB.IsChecked())
        {
            pMgr->SetEMailColumn(aColumnLB.GetSelectEntry());
            pModOpt->SetMailName(aColumnLB.GetSelectEntry());
        }
        else
        {
            String sName(aFilenameED.GetText());
            if (!sName.Len())
            {
                sName = pSh->GetView().GetDocShell()->GetTitle();
                INetURLObject aTemp(sName);
                sName = aTemp.GetBase();
            }
            sPath += sName;
            pMgr->SetEMailColumn(aEmptyStr);
            pModOpt->SetMailName(sName);
        }

        pMgr->SetSubject(sPath);
    }

    if (aFromRB.IsChecked())    // Liste Einfuegen
    {
        ULONG nStart = aFromNF.GetValue();
        ULONG nEnd = aToNF.GetValue();

        if (nEnd < nStart)
        {
            ULONG nZw = nEnd;
            nEnd = nStart;
            nStart = nZw;
        }

        rSelectionList->Clear();

        for (ULONG i = nStart; i <= nEnd; i++)
            rSelectionList->Insert((void*)i , LIST_APPEND);
    }

    if (aAllRB.IsChecked() )
        rSelectionList->Clear();    // Leere Selektion = Alles einfuegen

    pModOpt->SetSinglePrintJob(aSingleJobsCB.IsChecked());

    BYTE nMailingMode = 0;

    if (aFormatSwCB.IsChecked())
        nMailingMode |= TXTFORMAT_OFFICE;
    if (aFormatHtmlCB.IsChecked())
        nMailingMode |= TXTFORMAT_HTML;
    if (aFormatRtfCB.IsChecked())
        nMailingMode |= TXTFORMAT_RTF;
    pModOpt->SetMailingFormats(nMailingMode);
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

IMPL_LINK( SwMailMergeDlg, InsertPathHdl, PushButton *, pBtn )
{
    SfxIniManager* pIniManager = SFX_APP()->GetIniManager();
    ASSERT(pIniManager, "Kein Inimanager angelegt !!");
    String sPath(aPathED.GetText());
    if (!sPath.Len())
        sPath = pIniManager->Get(SFX_KEY_WORK_PATH);
    WinBits nBits = WB_3DLOOK|WB_STDMODAL|WB_OPEN|SFXWB_PATHDIALOG;

    SfxFileDialog* pFileDlg = new SfxFileDialog( this, nBits );
    pFileDlg->DisableSaveLastDirectory();
    pFileDlg->SetPath( sPath );
    pFileDlg->SetHelpId(HID_FILEDLG_MAILMRGE1);

    if (pFileDlg->Execute())
        aPathED.SetText(pFileDlg->GetPath());

    delete pFileDlg;
    return 0;
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

IMPL_LINK( SwMailMergeDlg, AttachFileHdl, PushButton *, pBtn )
{
    SvxMultiFileDialog* pFileDlg = new SvxMultiFileDialog(this);
    pFileDlg->SetFiles(aAttachED.GetText());
    pFileDlg->SetHelpId(HID_FILEDLG_MAILMRGE2);

    if (pFileDlg->Execute())
        aAttachED.SetText(pFileDlg->GetFiles());

    delete pFileDlg;

    return 0;
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.75  2000/09/18 16:05:27  willem.vandorp
    OpenOffice header added.

    Revision 1.74  2000/07/18 12:50:08  os
    replace ofadbmgr

    Revision 1.73  2000/06/07 13:26:46  os
    using UCB

    Revision 1.72  2000/04/19 12:56:34  os
    include sfx2/filedlg.hxx removed

    Revision 1.71  2000/04/18 15:31:35  os
    UNICODE

    Revision 1.70  2000/03/03 15:17:00  os
    StarView remainders removed

    Revision 1.69  2000/02/11 14:45:27  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.68  2000/01/24 12:48:37  os
    #72153# call SfxFileDialog::DisableSaveLastDirectory

    Revision 1.67  1998/09/02 12:11:56  OM
    #45378# HelpIDs fuer Dateidialoge


      Rev 1.66   02 Sep 1998 14:11:56   OM
   #45378# HelpIDs fuer Dateidialoge

      Rev 1.65   23 Jul 1998 13:26:52   OM
   #52257# Mail Attachments

      Rev 1.64   17 Jul 1998 17:19:52   TJ
   include

      Rev 1.63   09 Jul 1998 09:52:32   JP
   EmptyStr benutzen

      Rev 1.62   09 Dec 1997 12:31:28   OM
   #45200# Serienbrief: Speichern-Monitor

      Rev 1.61   02 Dec 1997 19:39:12   MA
   #45900#, SelectionList muss fuer Dialog existieren

      Rev 1.60   24 Nov 1997 11:52:12   MA
   includes

      Rev 1.59   03 Nov 1997 13:17:14   MA
   precomp entfernt

      Rev 1.58   30 Sep 1997 14:22:06   MH
   chg: header

      Rev 1.57   02 Sep 1997 09:58:22   OM
   SDB-Headeranpassung

      Rev 1.56   26 Aug 1997 15:34:46   TRI
   VCL Includes

      Rev 1.55   05 Aug 1997 12:31:44   MH
   chg: header

      Rev 1.54   08 Jul 1997 14:12:44   OS
   ConfigItems von der App ans Module

      Rev 1.53   09 Jun 1997 17:22:32   OM
   Serienbriefe als Dateien speichern

      Rev 1.52   04 Jun 1997 11:43:02   OM
   Korrektes Mailformat RTF

      Rev 1.51   20 Mar 1997 12:44:42   OM
   Mailing: Format RTF

      Rev 1.50   11 Mar 1997 11:27:18   OM
   Serienbrief-eMail in waehlbaren Formaten versenden

      Rev 1.49   14 Feb 1997 11:36:24   OM
   #36178# GPF im Serienbriefdruck behoben

      Rev 1.48   29 Jan 1997 18:13:04   MA
   unbenutzes entfernt

      Rev 1.47   06 Dec 1996 14:39:36   OM
   OpenDB-Fehlercode korrigiert

      Rev 1.46   05 Dec 1996 13:36:58   OM
   Serienbrief reanimiert

      Rev 1.45   11 Nov 1996 09:44:18   MA
   ResMgr

      Rev 1.44   07 Oct 1996 09:33:18   MA
   Umstellung Enable/Disable

      Rev 1.43   18 Sep 1996 10:38:54   OM
   Serienbriefe wieder angebunden

      Rev 1.42   13 Sep 1996 15:46:48   OM
   Serienbrief

      Rev 1.41   22 Aug 1996 12:30:32   OM
   Serienbrief Dlg umgestellt

      Rev 1.40   06 Aug 1996 16:45:38   OM
   Datenbankumstellung

      Rev 1.39   26 Jul 1996 20:36:38   MA
   includes

      Rev 1.38   25 Jul 1996 16:39:52   OM
   DB-Auswahldialog eingebaut

      Rev 1.37   23 Jul 1996 13:26:32   OM
   Datenbank und Tabelle auswaehlen

      Rev 1.36   22 Jul 1996 11:03:00   OM
   Datenbankauswahldialog

      Rev 1.35   19 Jul 1996 16:10:02   OM
   SBA-Umstellung

      Rev 1.34   17 Jul 1996 13:47:06   OM
   Datenbankumstellung 327

      Rev 1.33   05 Jul 1996 15:57:50   OM
   #28464# Serienbrief mit markierten Datensaetzen

      Rev 1.32   28 Jun 1996 10:21:50   OM
   Neue Segs

      Rev 1.31   28 Jun 1996 10:20:54   OM
   #29103# Radiobutton bei Eingabe selektieren

      Rev 1.30   04 Jun 1996 14:10:28   OM
   Neue Segs

      Rev 1.29   04 Jun 1996 14:09:40   OM
   Serienbrief Mailing

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/envelp/mailmrge.hrc b/sw/source/ui/envelp/mailmrge.hrc
new file mode 100644
index 0000000..3d03b62
--- /dev/null
+++ b/sw/source/ui/envelp/mailmrge.hrc
@@ -0,0 +1,108 @@
/*************************************************************************
 *
 *  $RCSfile: mailmrge.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:36 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _MAILMRGE_HRC
#define _MAILMRGE_HRC

// #include -----------------------------------------------------------------

#include "envelp.hrc"

// Elemente -----------------------------------------------------------------

#define GB_RECORD       1
#define RB_ALL          2
#define RB_MARKED       3
#define RB_FROM         4
#define NF_FROM         5
#define FT_BIS          6
#define NF_TO           7
#define BTN_OK          8
#define BTN_CANCEL      9
#define BTN_HELP        10
#define RB_PRINTER      11
#define RB_MAILING      12
#define FT_ADDRESS      13
#define LB_ADDRESSFLD   14
#define FT_SUBJECT      15
#define ED_SUBJECT      16
#define GB_DEST         17
#define CB_SINGLE_JOBS  18
#define FT_FORMAT       19
#define CB_FORMAT_SW    20
#define CB_FORMAT_HTML  21
#define CB_FORMAT_RTF   22
#define RB_FILE         23
#define FT_PATH         24
#define ED_PATH         25
#define PB_PATH         26
#define FT_FILENAME     27
#define RB_COLUMN       28
#define RB_FILENAME     29
#define LB_COLUMN       30
#define ED_FILENAME     31
#define FT_ATTACH       32
#define ED_ATTACH       33
#define PB_ATTACH       34

#endif


diff --git a/sw/source/ui/envelp/mailmrge.src b/sw/source/ui/envelp/mailmrge.src
new file mode 100644
index 0000000..f749259
--- /dev/null
+++ b/sw/source/ui/envelp/mailmrge.src
@@ -0,0 +1,785 @@
/*************************************************************************
 *
 *  $RCSfile: mailmrge.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:36 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
 // #pragma ******************************************************************

 // #include *****************************************************************
#include "mailmrge.hrc"
#include "cmdid.h"
ModalDialog DLG_MAILMERGE
{
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 242 , 179 ) ;
    Text = "Serienbrief" ;
    Text [ ENGLISH ] = "Print merge" ;
    Text [ norwegian ] = "Print merge" ;
    Text [ italian ] = "Stampa in serie" ;
    Text [ portuguese_brazilian ] = "Imprimir Intercalação" ;
    Text [ portuguese ] = "Carta em série" ;
    Text [ finnish ] = "Yhdistelytulostus" ;
    Text [ danish ] = "Brevfletning" ;
    Text [ french ] = "Mailing" ;
    Text [ swedish ] = "Kopplad utskrift" ;
    Text [ dutch ] = "Standaardbrief" ;
    Text [ spanish ] = "Carta en serie" ;
    Text [ english_us ] = "Form Letter" ;
    Moveable = TRUE ;
    HelpID = FN_QRY_MERGE ;
    RadioButton RB_ALL
    {
        Pos = MAP_APPFONT ( 12 , 14 ) ;
        Size = MAP_APPFONT ( 162 , 10 ) ;
        Text = "~Alle" ;
        Text [ ENGLISH ] = "~All" ;
        Text [ norwegian ] = "~All" ;
        Text [ italian ] = "~Tutti" ;
        Text [ portuguese_brazilian ] = "~Tudo" ;
        Text [ portuguese ] = "~Todos" ;
        Text [ finnish ] = "~Kaikki" ;
        Text [ danish ] = "Alle" ;
        Text [ french ] = "~Tous" ;
        Text [ swedish ] = "~Alla" ;
        Text [ dutch ] = "~Alles" ;
        Text [ spanish ] = "T~odos" ;
        Text [ english_us ] = "~All" ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "È«²¿(~A)";
        Text[ russian ] = "Âñå";
        Text[ polish ] = "Wszystkie";
        Text[ japanese ] = "‚·‚ׂÄ(~A)";
        Text[ chinese_traditional ] = "¥þ³¡(~A)";
        Text[ arabic ] = "Çáßá";
        Text[ greek ] = "¼ëá";
        Text[ korean ] = "Àüü(~A)";
        Text[ turkish ] = "Tümü";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_MARKED
    {
        Pos = MAP_APPFONT ( 12 , 27 ) ;
        Size = MAP_APPFONT ( 162 , 10 ) ;
        Text = "Markierte ~Datensätze" ;
        Text [ ENGLISH ] = "S~elected records" ;
        Text [ norwegian ] = "Selected records" ;
        Text [ italian ] = "R~ecord selezionati" ;
        Text [ portuguese_brazilian ] = "~Selected records" ;
        Text [ portuguese ] = "~Registos seleccionados" ;
        Text [ finnish ] = "~Selected records" ;
        Text [ danish ] = "Markerede dataposter" ;
        Text [ french ] = "Enregistrements ~sélectionnés" ;
        Text [ swedish ] = "Markerade ~dataposter" ;
        Text [ dutch ] = "~Gemarkeerde records" ;
        Text [ spanish ] = "~Registros seleccionados" ;
        Text [ english_us ] = "~Selected records" ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "Ñ¡ÖеÄÊý¾ÝÌõÄ¿(~S)";
        Text[ russian ] = "Âûäåëåííûå çàïèñè";
        Text[ polish ] = "Zaznaczone rekordy";
        Text[ japanese ] = "‘I‘ð‚µ‚½Úº°ÄÞ(~S)";
        Text[ chinese_traditional ] = "¿ï¨úªº¸ê®Æ¶µ¥Ø(~S)";
        Text[ arabic ] = "ÇáÓÌáÇÊ ÇáãÍÏÏÉ";
        Text[ greek ] = "ÅðéëåãìÝíåò åããñáöÝò";
        Text[ korean ] = "¼±ÅÃµÈ ·¹ÄÚµå(~S)";
        Text[ turkish ] = "Seçili veri kümeleri";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_FROM
    {
        Pos = MAP_APPFONT ( 12 , 41 ) ;
        Size = MAP_APPFONT ( 33 , 10 ) ;
        Text = "~Von:" ;
        Text [ ENGLISH ] = "~From:" ;
        Text [ norwegian ] = "~From:" ;
        Text [ italian ] = "~Da:" ;
        Text [ portuguese_brazilian ] = "~De:" ;
        Text [ portuguese ] = "~De:" ;
        Text [ finnish ] = "~From:" ;
        Text [ danish ] = "Fra:" ;
        Text [ french ] = "~De :" ;
        Text [ swedish ] = "~Från:" ;
        Text [ dutch ] = "~Vanaf:" ;
        Text [ spanish ] = "~Del:" ;
        Text [ english_us ] = "~From:" ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "´Ó(~F)£º";
        Text[ russian ] = "Îò:";
        Text[ polish ] = "Od:";
        Text[ japanese ] = "Žn‚ß:(~F)";
        Text[ chinese_traditional ] = "±q(~F)¡G";
        Text[ arabic ] = "ãä:";
        Text[ greek ] = "Áðü:";
        Text[ korean ] = "·Î ºÎÅÍ:(~F)";
        Text[ turkish ] = "Ýlk:";
        Text[ language_user1 ] = " ";
    };
    NumericField NF_FROM
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 48 , 40 ) ;
        Size = MAP_APPFONT ( 24 , 12 ) ;
        TabStop = TRUE ;
        StrictFormat = TRUE ;
        Minimum = 1 ;
        Maximum = 999999 ;
    };
    FixedText FT_BIS
    {
        Pos = MAP_APPFONT ( 75 , 41 ) ;
        Size = MAP_APPFONT ( 27 , 10 ) ;
        Text = "~Bis:" ;
        Text [ ENGLISH ] = "~To:" ;
        Text [ norwegian ] = "~To:" ;
        Text [ italian ] = "a:" ;
        Text [ portuguese_brazilian ] = "~Para:" ;
        Text [ portuguese ] = "~Para:" ;
        Text [ finnish ] = "~To:" ;
        Text [ danish ] = "Til:" ;
        Text [ french ] = "~À :" ;
        Text [ swedish ] = "~Till:" ;
        Text [ dutch ] = "~Tot:" ;
        Text [ spanish ] = "~al:" ;
        Text [ english_us ] = "~To:" ;
        Center = TRUE ;
        Text[ chinese_simplified ] = "ÖÁ(~T)£º";
        Text[ russian ] = "Äî:";
        Text[ polish ] = "Do:";
        Text[ japanese ] = "I‚è:(~T)";
        Text[ chinese_traditional ] = "¦¬¥óªÌ(~T)";
        Text[ arabic ] = "Åáì:";
        Text[ greek ] = "Ðñïò:";
        Text[ korean ] = "¿¡°Ô:(~T)";
        Text[ turkish ] = "Son:";
        Text[ language_user1 ] = "RB: SW Datei - Serienbrief";
    };
    NumericField NF_TO
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 105 , 40 ) ;
        Size = MAP_APPFONT ( 24 , 12 ) ;
        TabStop = TRUE ;
        StrictFormat = TRUE ;
        Minimum = 1 ;
        Maximum = 999999 ;
    };
    GroupBox GB_RECORD
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 174 , 55 ) ;
        Text = "Datensätze" ;
        Text [ ENGLISH ] = "Records" ;
        Text [ norwegian ] = "Records" ;
        Text [ italian ] = "Record di dati" ;
        Text [ portuguese_brazilian ] = "Registros" ;
        Text [ portuguese ] = "Registos" ;
        Text [ finnish ] = "Records" ;
        Text [ danish ] = "Dataposter" ;
        Text [ french ] = "Enregistrements" ;
        Text [ swedish ] = "Dataposter" ;
        Text [ dutch ] = "Records" ;
        Text [ spanish ] = "Registros" ;
        Text [ english_us ] = "Records" ;
        Text[ chinese_simplified ] = "Êý¾ÝÌõÄ¿";
        Text[ russian ] = "Çàïèñè äàííûõ";
        Text[ polish ] = "Rekordy";
        Text[ japanese ] = "Úº°ÄÞ";
        Text[ chinese_traditional ] = "¸ê®Æ¶µ¥Ø";
        Text[ arabic ] = "ÇáÓÌáÇÊ";
        Text[ greek ] = "ÅããñáöÝò";
        Text[ korean ] = "·¹ÄÚµå";
        Text[ turkish ] = "Veri kümeleri";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_PRINTER
    {
        Pos = MAP_APPFONT ( 12 , 75 ) ;
        Size = MAP_APPFONT ( 51 , 10 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? Dr~ucker : ~Drucker */
        Text = "Dr~ucker" ;
        Text [ ENGLISH ] = "~Printer" ;
        Check = TRUE ;
        TabStop = TRUE ;
        Text [ dutch ] = "~Printer" ;
        Text [ english_us ] = "~Printer" ;
        Text [ italian ] = "Stampante" ;
        Text [ spanish ] = "~Impresora" ;
        Text [ french ] = "~Sur l'imprimante" ;
        Text [ swedish ] = "S~krivare" ;
        Text [ danish ] = "Printer" ;
        Text [ portuguese ] = "~Impressora" ;
        Text [ portuguese_brazilian ] = "~Drucker" ;
        Text[ chinese_simplified ] = "´òÓ¡»ú(~P)";
        Text[ russian ] = "Ïðèíòåð";
        Text[ polish ] = "Drukarka";
        Text[ japanese ] = "ÌߨÝÀ‚Ö(~P)";
        Text[ chinese_traditional ] = "¦Lªí¾÷(~P)";
        Text[ arabic ] = "Åáì ÇáØÇÈÚÉ";
        Text[ greek ] = "ÅêôõðùôÞò";
        Text[ korean ] = "ÇÁ¸°ÅÍ(~P)";
        Text[ turkish ] = "~Yazýcý";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_MAILING
    {
        Pos = MAP_APPFONT ( 66 , 75 ) ;
        Size = MAP_APPFONT ( 51 , 10 ) ;
        Text = "~Mailing" ;
        Text [ ENGLISH ] = "~Mailing" ;
        TabStop = TRUE ;
        Text [ dutch ] = "~Mailing" ;
        Text [ english_us ] = "~Electronic" ;
        Text [ italian ] = "~Mailing" ;
        Text [ spanish ] = "~Enviar correo" ;
        Text [ french ] = "~Par e-mail" ;
        Text [ swedish ] = "~Mailing" ;
        Text [ danish ] = "Mailing" ;
        Text [ portuguese ] = "~Correio-e" ;
        Text [ portuguese_brazilian ] = "~Mailing" ;
        Text[ chinese_simplified ] = "µç×ÓÓʼþ(~M)";
        Text[ russian ] = "Ïî÷òà";
        Text[ polish ] = "Po~czta";
        Text[ japanese ] = "ҰقƂµ‚Ä(~M)";
        Text[ chinese_traditional ] = "¹q¤l¶l¥ó(~M)";
        Text[ arabic ] = "ßÈÑíÏ ÅáßÊÑæäí";
        Text[ greek ] = "Áëëçëïãñáößá";
        Text[ korean ] = "ÆíÁö(~M)";
        Text[ turkish ] = "E-posta";
        Text[ language_user1 ] = "ENG:the anglicism \"Mailing\" as used in German cannot be used in Eng. because the real meaning has nothing to do with e-mail.EM17.5.00";
    };
    RadioButton RB_FILE
    {
        Pos = MAP_APPFONT ( 120 , 75 ) ;
        Size = MAP_APPFONT ( 55 , 10 ) ;
        Text = "Datei" ;
        Text [ ENGLISH ] = "File" ;
        TabStop = TRUE ;
        Text [ portuguese ] = "Ficheiro" ;
        Text [ english_us ] = "File" ;
        Text [ portuguese_brazilian ] = "Datei" ;
        Text [ swedish ] = "Fil" ;
        Text [ danish ] = "Fil" ;
        Text [ italian ] = "File" ;
        Text [ spanish ] = "Archivo" ;
        Text [ french ] = "Dans un fichier" ;
        Text [ dutch ] = "Bestand" ;
        Text[ chinese_simplified ] = "Îļþ";
        Text[ russian ] = "Ôàéë";
        Text[ polish ] = "Pli~k";
        Text[ japanese ] = "̧²Ù‚Æ‚µ‚Ä";
        Text[ chinese_traditional ] = "ÀÉ®×";
        Text[ arabic ] = "Ýí ãáÝ";
        Text[ greek ] = "Áñ÷åßï";
        Text[ korean ] = "ÆÄÀÏ";
        Text[ turkish ] = "Dosya";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_PATH
    {
        Pos = MAP_APPFONT ( 12 , 94 ) ;
        Size = MAP_APPFONT ( 41 , 10 ) ;
        Hide = TRUE ;
        Text = "Pfad" ;
        Text [ ENGLISH ] = "Path" ;
        Text [ english_us ] = "Path" ;
        Text [ portuguese_brazilian ] = "Pfad" ;
        Text [ swedish ] = "Sökväg" ;
        Text [ danish ] = "Sti" ;
        Text [ italian ] = "Percorso" ;
        Text [ spanish ] = "Ruta" ;
        Text [ french ] = "Chemin" ;
        Text [ dutch ] = "Pad" ;
        Text [ portuguese ] = "Atalho" ;
        Text[ chinese_simplified ] = "·¾¶";
        Text[ russian ] = "Ïóòü";
        Text[ polish ] = "Œcie¿ka";
        Text[ japanese ] = "Êß½";
        Text[ language_user1 ] = " ";
        Text[ chinese_traditional ] = "¸ô®|";
        Text[ arabic ] = "ÇáãÓÇÑ";
        Text[ greek ] = "ÄéáäñïìÞ";
        Text[ korean ] = "°æ·Î";
        Text[ turkish ] = "Veri yolu";
    };
    Edit ED_PATH
    {
        Pos = MAP_APPFONT ( 53 , 93 ) ;
        Size = MAP_APPFONT ( 101 , 12 ) ;
        Hide = TRUE ;
        Border = TRUE ;
        TabStop = TRUE ;
    };
    PushButton PB_PATH
    {
        Pos = MAP_APPFONT ( 160 , 93 ) ;
        Size = MAP_APPFONT ( 14 , 12 ) ;
         // Soll Groesse des Edits haben (12)!
        Text = "~..." ;
        TabStop = TRUE ;
        Hide = TRUE ;
    };
    FixedText FT_FILENAME
    {
        Pos = MAP_APPFONT ( 12 , 116 ) ;
        Size = MAP_APPFONT ( 102 , 10 ) ;
        Hide = TRUE ;
        Text = "Dateiname generiert aus" ;
        Text [ ENGLISH ] = "Generate filename from" ;
        Text [ english_us ] = "Generate file name from" ;
        Text [ portuguese_brazilian ] = "Dateiname generiert aus" ;
        Text [ swedish ] = "Generera filnamn från" ;
        Text [ danish ] = "Generer filnavn fra" ;
        Text [ italian ] = "Nome di file generato da " ;
        Text [ spanish ] = "Nombre de archivo a partir de" ;
        Text [ french ] = "Génération du nom de fichier :" ;
        Text [ dutch ] = "Bestandsnaam ontnemen aan" ;
        Text [ portuguese ] = "Gerar nome do ficheiro a partir de" ;
        Text[ chinese_simplified ] = "ÎļþÃûµÄÉú³É·½Ê½";
        Text[ russian ] = "Èìÿ ôàéëà ñîçäàíî èç";
        Text[ polish ] = "Generuj nazwê pliku z";
        Text[ japanese ] = "̧²Ù–¼‚ÌŽw’è‚Í";
        Text[ chinese_traditional ] = "ÀɮצWªº¥Í¦¨¤è¦¡";
        Text[ arabic ] = "ÅäÔÇÁ ÇÓã ÇáãáÝ ãä";
        Text[ greek ] = "Äçìéïõñãßá ïíüìáôïò áñ÷åßïõ áðü";
        Text[ korean ] = "·ÎºÎÅÍ ÆÄÀÏ À̸§ »ý¼º";
        Text[ turkish ] = "Dosya adý kaynaðý";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_COLUMN
    {
        Pos = MAP_APPFONT ( 18 , 131 ) ;
        Size = MAP_APPFONT ( 81 , 10 ) ;
        Text = "Datenbankfeld" ;
        Text [ ENGLISH ] = "Database field" ;
        TabStop = TRUE ;
        Hide = TRUE ;
        Text [ portuguese ] = "Campo da base de dados" ;
        Text [ english_us ] = "Database field" ;
        Text [ portuguese_brazilian ] = "Datenbankfeld" ;
        Text [ swedish ] = "Databasfält" ;
        Text [ danish ] = "Databasefelt" ;
        Text [ italian ] = "Campo database" ;
        Text [ spanish ] = "Campo de base de datos" ;
        Text [ french ] = "Champ de B.D." ;
        Text [ dutch ] = "Database-veld" ;
        Text[ chinese_simplified ] = "Êý¾Ý¿â×Ö¶Î";
        Text[ russian ] = "Ïîëå áàçû äàííûõ";
        Text[ polish ] = "Pole bazy danych";
        Text[ japanese ] = "ÃÞ°ÀÍÞ°½Ì¨°ÙÄނ©‚ç";
        Text[ chinese_traditional ] = "¸ê®Æ®wÄæ";
        Text[ arabic ] = "ÍÞá ÞÇÚÏÉ ÇáÈíÇäÇÊ";
        Text[ greek ] = "Ðåäßï âÜóçò äåäïìÝíùí";
        Text[ korean ] = "Å×ÀÌÅͺ£À̽º Çʵå";
        Text[ turkish ] = "Veritabaný alaný";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_FILENAME
    {
        Pos = MAP_APPFONT ( 18 , 147 ) ;
        Size = MAP_APPFONT ( 81 , 10 ) ;
        Text = "Manueller Vorgabe" ;
        Text [ ENGLISH ] = "Custom" ;
        TabStop = TRUE ;
        Check = TRUE ;
        Hide = TRUE ;
        Text [ portuguese ] = "Predefinição manual" ;
        Text [ english_us ] = "Manual setting" ;
        Text [ portuguese_brazilian ] = "Manueller Vorgabe" ;
        Text [ swedish ] = "Anpassa" ;
        Text [ danish ] = "Manuel forudindstilling" ;
        Text [ italian ] = "Preimpostazione manuale" ;
        Text [ spanish ] = "Manualmente" ;
        Text [ french ] = "Saisie manuelle" ;
        Text [ dutch ] = "Handmatige voorgift" ;
        Text[ chinese_simplified ] = "ÊÖ¹¤Ô¤Éè";
        Text[ russian ] = "Óñòàíîâêà âðó÷íóþ";
        Text[ polish ] = "Ustawienie rêczne";
        Text[ japanese ] = "”CˆÓÝ’è";
        Text[ chinese_traditional ] = "¤â¤u¹w³]";
        Text[ arabic ] = "ÇáÅÚÏÇÏ ÇáíÏæí";
        Text[ greek ] = "×åéñïêßíçôç ñýèìéóç";
        Text[ korean ] = "¼öµ¿ ¼³Á¤";
        Text[ turkish ] = "Manüel giriþ";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_COLUMN
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 100 , 130 ) ;
        Size = MAP_APPFONT ( 74 , 84 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        Hide = TRUE ;
    };
    Edit ED_FILENAME
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 100 , 146 ) ;
        Size = MAP_APPFONT ( 74 , 12 ) ;
        TabStop = TRUE ;
        Hide = TRUE ;
    };
    CheckBox CB_SINGLE_JOBS
    {
        Pos = MAP_APPFONT ( 12 , 88 ) ;
        Size = MAP_APPFONT ( 162 , 10 ) ;
        Text = "~Einzelne Druckjobs erzeugen" ;
        Text [ ENGLISH ] = "Si~ngle print jobs" ;
        TabStop = TRUE ;
        Text [ english_us ] = "~Single print jobs" ;
        Text [ portuguese_brazilian ] = "Einzelne Druckjobs erzeugen" ;
        Text [ swedish ] = "skapa ~enstaka utskriftsjobb" ;
        Text [ danish ] = "Opret enkelte printerjob" ;
        Text [ italian ] = "Crea singoli ordini di stampa" ;
        Text [ spanish ] = "~Crear tareas individuales de impresión" ;
        Text [ french ] = "~Travaux d'impression individuels" ;
        Text [ dutch ] = "Af~zonderlijke afdrukjobs" ;
        Text [ portuguese ] = "C~riar tarefas de impressão individuais" ;
        Text[ chinese_simplified ] = "Éú³Éµ¥¸ö´òÓ¡ÈÎÎñ(~S)";
        Text[ russian ] = "Ñîçäàòü îòäåëüíîå çàäàíèå ïå÷àòè";
        Text[ polish ] = "Utwórz pojedyncze zadania wydruku";
        Text[ japanese ] = "1‚‚¸‚ˆóü(~S)";
        Text[ chinese_traditional ] = "¥Í¦¨³æ­Ó¦C¦L¥ô°È(~S)";
        Text[ arabic ] = "ÅäÔÇÁ æÙÇÆÝ ØÈÇÚÉ ÝÑÏíÉ";
        Text[ greek ] = "Äçìéïõñãßá ìåìïíùìÝíùí åñãáóéþí åêôýðùóçò";
        Text[ korean ] = "´ÜÀÏ Àμâ ÀÛ¾÷(~S)";
        Text[ turkish ] = "Bireysel yazdýrma iþleri oluþtur";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_ADDRESS
    {
        Pos = MAP_APPFONT ( 12 , 89 ) ;
        Size = MAP_APPFONT ( 51 , 10 ) ;
        Disable = TRUE ;
        Hide = TRUE ;
        Text = "Adress~feld" ;
        Text [ ENGLISH ] = "A~ddress Field" ;
        Text [ english_us ] = "Address ~field" ;
        Text [ italian ] = "Campo indirizzo" ;
        Text [ spanish ] = "~Campo dirección" ;
        Text [ french ] = "~Champ d'adresse" ;
        Text [ dutch ] = "A~dresveld" ;
        Text [ swedish ] = "Adress~fält" ;
        Text [ danish ] = "Adressefelt" ;
        Text [ portuguese_brazilian ] = "Adressfeld" ;
        Text [ portuguese ] = "~Campo de endereço" ;
        Text[ chinese_simplified ] = "µØÖ·À¸(~F)";
        Text[ russian ] = "Àäðåñíîå ïîëå";
        Text[ polish ] = "Pole adresowe";
        Text[ japanese ] = "ZŠÌ¨°ÙÄÞ(~F)";
        Text[ chinese_traditional ] = "¦a§}Äæ(~F)";
        Text[ arabic ] = "ÍÞá ÇáÚäæÇä";
        Text[ greek ] = "Ðåäßï äéåýèõíóçò";
        Text[ korean ] = "ÁÖ¼Ò Çʵå(~F)";
        Text[ turkish ] = "Adres alaný";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_ADDRESSFLD
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 66 , 88 ) ;
        Size = MAP_APPFONT ( 108 , 84 ) ;
        Disable = TRUE ;
        Hide = TRUE ;
        TabStop = TRUE ;
        DropDown = TRUE ;
    };
    FixedText FT_SUBJECT
    {
        Pos = MAP_APPFONT ( 12 , 104 ) ;
        Size = MAP_APPFONT ( 51 , 10 ) ;
        Disable = TRUE ;
        /* ### ACHTUNG: Neuer Text in Resource? Be~treff : Betreff */
        Text = "Be~treff" ;
        Text [ ENGLISH ] = "S~ubject" ;
        Text [ english_us ] = "~Subject" ;
        Text [ italian ] = "~Oggetto" ;
        Text [ spanish ] = "A~sunto" ;
        Text [ french ] = "~Objet" ;
        Text [ dutch ] = "~Betreft" ;
        Text [ swedish ] = "~Angående" ;
        Text [ danish ] = "Emne" ;
        Text [ portuguese_brazilian ] = "Betreff" ;
        Text [ portuguese ] = "~Assunto" ;
        Text[ chinese_simplified ] = "ÊÂÓÉ(~S)";
        Text[ russian ] = "Òåìà";
        Text[ polish ] = "Temat";
        Text[ japanese ] = "Œ–¼(~S)";
        Text[ chinese_traditional ] = "¥D¦®(~S)";
        Text[ arabic ] = "ÇáãæÖæÚ";
        Text[ greek ] = "ÈÝìá";
        Text[ korean ] = "ÁÖÁ¦(~S)";
        Text[ turkish ] = "Konu";
        Text[ language_user1 ] = " ";
    };
    Edit ED_SUBJECT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 66 , 103 ) ;
        Size = MAP_APPFONT ( 108 , 12 ) ;
        Disable = TRUE ;
        TabStop = TRUE ;
    };
    FixedText FT_ATTACH
    {
        Pos = MAP_APPFONT ( 12 , 118 ) ;
        Size = MAP_APPFONT ( 51 , 10 ) ;
        Disable = TRUE ;
        Text = "Anhänge" ;
        Text [ ENGLISH ] = "Attachments" ;
        Text [ english_us ] = "Attachments" ;
        Text [ portuguese_brazilian ] = "Anhänge" ;
        Text [ swedish ] = "Bilagor" ;
        Text [ danish ] = "Vedhæftede filer" ;
        Text [ italian ] = "Allegati" ;
        Text [ spanish ] = "Anexos" ;
        Text [ french ] = "Fichiers joints" ;
        Text [ dutch ] = "Aanhangsels" ;
        Text [ portuguese ] = "Anexos" ;
        Text[ chinese_simplified ] = "¸½¼þ";
        Text[ russian ] = "Ïðèëîæåíèÿ";
        Text[ polish ] = "Za³¹czniki";
        Text[ japanese ] = "“Y•t";
        Text[ chinese_traditional ] = "´¡¤JÀÉ®×";
        Text[ arabic ] = "ÅÑÝÇÞÇÊ";
        Text[ greek ] = "ÓõíçììÝíá";
        Text[ korean ] = "÷ºÎ";
        Text[ turkish ] = "Ekler";
        Text[ language_user1 ] = " ";
    };
    Edit ED_ATTACH
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 66 , 117 ) ;
        Size = MAP_APPFONT ( 88 , 12 ) ;
        Disable = TRUE ;
        TabStop = TRUE ;
        ReadOnly = TRUE ;
    };
    PushButton PB_ATTACH
    {
        Pos = MAP_APPFONT ( 160 , 117 ) ;
        Size = MAP_APPFONT ( 14 , 12 ) ;
         // Soll Groesse des Edits haben (12)!
        Text = "~..." ;
        TabStop = TRUE ;
        Disable = TRUE ;
    };
    FixedText FT_FORMAT
    {
        Pos = MAP_APPFONT ( 12 , 133 ) ;
        Size = MAP_APPFONT ( 51 , 10 ) ;
        Disable = TRUE ;
        Text = "Mail-Format" ;
        Text [ ENGLISH ] = "Mail format" ;
        Text [ english_us ] = "Mail Format" ;
        Text [ portuguese_brazilian ] = "Format" ;
        Text [ swedish ] = "E-postformat" ;
        Text [ danish ] = "Mail-format" ;
        Text [ italian ] = "Formato mail" ;
        Text [ spanish ] = "Formato de correo" ;
        Text [ french ] = "Format de message" ;
        Text [ dutch ] = "Mail-formaat" ;
        Text [ portuguese ] = "Formato da mensagem" ;
        Text[ chinese_simplified ] = "Óʼþ¸ñʽ";
        Text[ russian ] = "Ôîðìàò Mail";
        Text[ polish ] = "Format wiadomoœci";
        Text[ japanese ] = "Ұُ‘Ž®";
        Text[ chinese_traditional ] = "¶l¥ó®æ¦¡";
        Text[ arabic ] = "ÊäÓíÞ ÇáÈÑíÏ";
        Text[ greek ] = "ÌïñöÞ ìçíýìáôïò";
        Text[ korean ] = "¿ìÆí ¼­½Ä";
        Text[ turkish ] = "E-posta formatý";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_FORMAT_HTML
    {
        Pos = MAP_APPFONT ( 66 , 133 ) ;
        Size = MAP_APPFONT ( 108 , 10 ) ;
        Disable = TRUE ;
        /* ### ACHTUNG: Neuer Text in Resource? HTM~L : HTML */
        Text = "HTM~L" ;
        TabStop = TRUE ;
        Text [ english_us ] = "HTM~L" ;
        Text [ portuguese_brazilian ] = "HTML" ;
        Text [ swedish ] = "HTM~L" ;
        Text [ danish ] = "HTML" ;
        Text [ italian ] = "HTML" ;
        Text [ spanish ] = "HTM~L" ;
        Text [ french ] = "HTM~L" ;
        Text [ dutch ] = "~HTML" ;
        Text [ portuguese ] = "HTM~L" ;
        Text[ chinese_simplified ] = "HTML(~L)";
        Text[ russian ] = "HTM~L";
        Text[ polish ] = "HTML";
        Text[ japanese ] = "HTMLŒ`Ž®(~L)";
        Text[ chinese_traditional ] = "HTM~L";
        Text[ arabic ] = "HTM~L";
        Text[ greek ] = "HTML";
        Text[ korean ] = "HTM~L";
        Text[ turkish ] = "HTM~L";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_FORMAT_RTF
    {
        Pos = MAP_APPFONT ( 66 , 145 ) ;
        Size = MAP_APPFONT ( 108 , 10 ) ;
        Disable = TRUE ;
        Text = "~RTF" ;
        TabStop = TRUE ;
        Text [ english_us ] = "RT~F" ;
        Text [ portuguese_brazilian ] = "RTF" ;
        Text [ swedish ] = "~RTF" ;
        Text [ danish ] = "RTF" ;
        Text [ italian ] = "RTF" ;
        Text [ spanish ] = "R~TF" ;
        Text [ french ] = "~RTF" ;
        Text [ dutch ] = "~RTF" ;
        Text [ portuguese ] = "~RTF" ;
        Text[ chinese_simplified ] = "RTF(~F)";
        Text[ russian ] = "~RTF";
        Text[ polish ] = "RTF";
        Text[ japanese ] = "RTF(~F)";
        Text[ chinese_traditional ] = "RT~F";
        Text[ arabic ] = "RTF~";
        Text[ greek ] = "RTF";
        Text[ korean ] = "RT~F";
        Text[ turkish ] = "~RTF";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_FORMAT_SW
    {
        Pos = MAP_APPFONT ( 66 , 157 ) ;
        Size = MAP_APPFONT ( 108 , 10 ) ;
        Disable = TRUE ;
        Text = "~StarOffice Writer" ;
        TabStop = TRUE ;
        Text [ english_us ] = "~StarOffice Writer" ;
        Text [ portuguese_brazilian ] = "StarOffice Writer" ;
        Text [ swedish ] = "~StarOffice Writer" ;
        Text [ danish ] = "StarOffice Writer" ;
        Text [ italian ] = "~StarOffice Writer" ;
        Text [ spanish ] = "~StarOffice Writer" ;
        Text [ french ] = "StarOffice ~Writer" ;
        Text [ dutch ] = "~StarOffice Writer" ;
        Text [ portuguese ] = "~StarOffice Writer" ;
        Text[ chinese_simplified ] = "StarOffice Writer";
        Text[ russian ] = "~StarOffice Writer";
        Text[ polish ] = "~StarOffice Writer";
        Text[ japanese ] = "StarOffice Writer";
        Text[ chinese_traditional ] = "~StarOffice Writer";
        Text[ arabic ] = "StarOffice Writer~";
        Text[ greek ] = "StarOffice Writer";
        Text[ korean ] = "~StarOffice Writer";
        Text[ turkish ] = "~StarOffice Writer";
        Text[ language_user1 ] = " ";
    };
    GroupBox GB_DEST
    {
        Pos = MAP_APPFONT ( 6 , 64 ) ;
        Size = MAP_APPFONT ( 174 , 109 ) ;
        Text = "Ausgabe" ;
        Text [ ENGLISH ] = "Destination" ;
        Text [ english_us ] = "Output" ;
        Text [ italian ] = "Destinazione" ;
        Text [ spanish ] = "Destino" ;
        Text [ french ] = "Sortie" ;
        Text [ dutch ] = "Uitgave" ;
        Text [ swedish ] = "Utdata" ;
        Text [ danish ] = "Output" ;
        Text [ portuguese_brazilian ] = "Ausgabe" ;
        Text [ portuguese ] = "Destino" ;
        Text[ chinese_simplified ] = "Êä³ö";
        Text[ russian ] = "Âûâîä";
        Text[ polish ] = "Wyjœcie";
        Text[ japanese ] = "±³ÄÌ߯Ä";
        Text[ chinese_traditional ] = "¿é¥X";
        Text[ arabic ] = "ÇáÅÎÑÇÌ";
        Text[ greek ] = "ÅîáãùãÞ";
        Text[ korean ] = "Ãâ·Â";
        Text[ turkish ] = "Çýktý";
        Text[ language_user1 ] = " ";
    };
    OKButton BTN_OK
    {
        Pos = MAP_APPFONT ( 186 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        DefButton = TRUE ;
    };
    CancelButton BTN_CANCEL
    {
        Pos = MAP_APPFONT ( 186 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
    };
    HelpButton BTN_HELP
    {
        Pos = MAP_APPFONT ( 186 , 43 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
    };
    Text[ chinese_simplified ] = "ÓʼþºÏ²¢";
    Text[ russian ] = "Ñëèÿíèå";
    Text[ polish ] = "List seryjny";
    Text[ japanese ] = "·‚µž‚݈óü";
    Text[ chinese_traditional ] = "¦X¨Ö¦C¦L";
    Text[ arabic ] = "ÎØÇÈ ãÓáÓá";
    Text[ greek ] = "ÏìáäéêÞ åðéóôïëÞ";
    Text[ korean ] = "ÆíÁö º´ÇÕ";
    Text[ turkish ] = "Standart mektup";
    Text[ language_user1 ] = " ";
};
diff --git a/sw/source/ui/envelp/makefile.mk b/sw/source/ui/envelp/makefile.mk
new file mode 100644
index 0000000..b0cc873
--- /dev/null
+++ b/sw/source/ui/envelp/makefile.mk
@@ -0,0 +1,122 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:36 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=..$/..$/..

PRJNAME=sw
TARGET=envelp

AUTOSEG=true

PROJECTPCH=ui_pch
PDBTARGET=ui_pch
PROJECTPCHSOURCE=..\ui_1st\ui_pch

# --- Settings -----------------------------------------------------

.INCLUDE :  $(PRJ)$/inc$/swpre.mk
.INCLUDE :  settings.mk
.INCLUDE :  $(PRJ)$/inc$/sw.mk

# --- Files --------------------------------------------------------

CXXFILES = \
        envfmt.cxx \
        envimg.cxx \
        envlop1.cxx \
        envprt.cxx \
        label1.cxx \
        labfmt.cxx \
        labprt.cxx \
        labimg.cxx \
        mailmrge.cxx \
        syncbtn.cxx

SRCFILES =\
        envelp.src \
        envfmt.src \
        envlop.src \
        envprt.src \
        label.src  \
        labfmt.src \
        labprt.src \
        mailmrge.src

SLOFILES =  \
        $(SLO)$/envfmt.obj  \
        $(SLO)$/envimg.obj  \
        $(SLO)$/envlop1.obj \
        $(SLO)$/envprt.obj  \
        $(SLO)$/label1.obj  \
        $(SLO)$/labfmt.obj  \
        $(SLO)$/labprt.obj  \
        $(SLO)$/labimg.obj  \
        $(SLO)$/mailmrge.obj \
        $(SLO)$/syncbtn.obj

EXCEPTIONSFILES= \
        $(SLO)$/label1.obj

# --- Targets -------------------------------------------------------

.INCLUDE :  target.mk

diff --git a/sw/source/ui/envelp/syncbtn.cxx b/sw/source/ui/envelp/syncbtn.cxx
new file mode 100644
index 0000000..5af231b
--- /dev/null
+++ b/sw/source/ui/envelp/syncbtn.cxx
@@ -0,0 +1,171 @@
/*************************************************************************
 *
 *  $RCSfile: syncbtn.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:36 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "uiparam.hxx"

#ifndef _SFXVIEWFRM_HXX //autogen
#include <sfx2/viewfrm.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif

#include "cmdid.h"
#include "swmodule.hxx"
#include "view.hxx"
#include "edtwin.hxx"
#include "label.hrc"

#define _SYNCDLG
#include "syncbtn.hxx"
#include "swtypes.hxx"

SFX_IMPL_FLOATINGWINDOW( SwSyncChildWin, FN_SYNC_LABELS )

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

SwSyncChildWin::SwSyncChildWin( Window* pParent,
                                USHORT nId,
                                SfxBindings* pBindings,
                                SfxChildWinInfo* pInfo ) :
                                SfxChildWindow( pParent, nId )
{
    pWindow = new SwSyncBtnDlg( pBindings, this, pParent);

    if (!pInfo->aSize.Width() || !pInfo->aSize.Height())
    {
        const SwEditWin &rEditWin = ::GetActiveView()->GetEditWin();
        pWindow->SetPosPixel(rEditWin.OutputToScreenPixel(Point(0, 0)));
        pInfo->aPos = pWindow->GetPosPixel();
        pInfo->aSize = pWindow->GetSizePixel();
    }

    ((SwSyncBtnDlg *)pWindow)->Initialize(pInfo);

    pWindow->Show();
}

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

SwSyncBtnDlg::SwSyncBtnDlg( SfxBindings* pBindings,
                            SfxChildWindow* pChild,
                            Window *pParent) :
    SfxFloatingWindow(pBindings, pChild, pParent, SW_RES(DLG_SYNC_BTN)),
    aSyncBtn        (this, SW_RES(BTN_SYNC ))
{
    FreeResource();
    aSyncBtn.SetClickHdl(LINK(this, SwSyncBtnDlg, BtnHdl));
}

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

__EXPORT SwSyncBtnDlg::~SwSyncBtnDlg()
{
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwSyncBtnDlg, BtnHdl, PushButton *, pBtn )
{
    SfxViewFrame::Current()->GetDispatcher()->Execute(FN_UPDATE_ALL_LINKS, SFX_CALLMODE_ASYNCHRON);
    return 0;
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.6  2000/09/18 16:05:27  willem.vandorp
    OpenOffice header added.

    Revision 1.5  2000/09/07 15:59:23  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.4  1998/03/18 10:27:32  OM
    #48713# SynchronButton initial oben links positionieren


      Rev 1.3   18 Mar 1998 11:27:32   OM
   #48713# SynchronButton initial oben links positionieren

      Rev 1.2   16 Mar 1998 20:11:34   OM
   Initial in der View positionieren

      Rev 1.1   16 Mar 1998 16:17:40   OM
   Aktualisieren-Button kontextsensitiv

      Rev 1.0   15 Mar 1998 14:09:52   OM
   Initial revision.

------------------------------------------------------------------------*/
diff --git a/sw/source/ui/fldui/changedb.cxx b/sw/source/ui/fldui/changedb.cxx
new file mode 100644
index 0000000..51fb063
--- /dev/null
+++ b/sw/source/ui/fldui/changedb.cxx
@@ -0,0 +1,663 @@
/*************************************************************************
 *
 *  $RCSfile: changedb.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:36 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#define _CHANGEDB_CXX

#include <svtools/stdctrl.hxx>
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif

#ifdef REPLACE_OFADBMGR
#ifndef _COM_SUN_STAR_LANG_XMULTISERVICEFACTORY_HPP_
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XNAMEACCESS_HPP_
#include <com/sun/star/container/XNameAccess.hpp>
#endif
#ifndef _COM_SUN_STAR_SDB_XDATABASEACCESS_HPP_
#include <com/sun/star/sdb/XDatabaseAccess.hpp>
#endif
#ifndef _UNOTOOLS_PROCESSFACTORY_HXX_
#include <unotools/processfactory.hxx>
#endif

#else

#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif
#ifndef _SBA_SBAOBJ_HXX //autogen
#include <offmgr/sbaobj.hxx>
#endif

#endif

#ifndef _SFXVIEWFRM_HXX //autogen
#include <sfx2/viewfrm.hxx>
#endif

#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _DBMGR_HXX
#include <dbmgr.hxx>
#endif
#ifndef _FLDMGR_HXX
#include <fldmgr.hxx>
#endif
#ifndef _EXPFLD_HXX
#include <expfld.hxx>
#endif
#ifndef _TXTATR_HXX
#include <txtatr.hxx>
#endif
#ifndef _NDTXT_HXX
#include <ndtxt.hxx>
#endif
#ifndef _FLDBAS_HXX
#include <fldbas.hxx>
#endif
#ifndef _DBFLD_HXX
#include <dbfld.hxx>
#endif
#ifndef _CHANGEDB_HXX
#include <changedb.hxx>
#endif

#ifndef _FLDUI_HRC
#include <fldui.hrc>
#endif
#ifndef _CHANGEDB_HRC
#include <changedb.hrc>
#endif

#ifdef REPLACE_OFADBMGR
using namespace rtl;
using namespace com::sun::star::uno;
using namespace com::sun::star::container;
using namespace com::sun::star::lang;
//using namespace com::sun::star::sdb;
//using namespace com::sun::star::sdbc;
//using namespace com::sun::star::sdbcx;
//using namespace com::sun::star::beans;
#define C2U(cChar) OUString::createFromAscii(cChar)
#endif

/*--------------------------------------------------------------------
    Beschreibung: Feldeinfuegen bearbeiten
 --------------------------------------------------------------------*/


SwChangeDBDlg::SwChangeDBDlg(SwView& rVw) :
    SvxStandardDialog(&rVw.GetViewFrame()->GetWindow(), SW_RES(DLG_CHANGE_DB)),

    aDescFT     (this, SW_RES(FT_DESC       )),
    aUsedDBFT   (this, SW_RES(FT_USEDDB     )),
    aAvailDBFT  (this, SW_RES(FT_AVAILDB    )),
    aDBListGB   (this, SW_RES(GB_DBLIST     )),
    aUsedDBTLB  (this, SW_RES(TLB_USEDDB    )),
    aAvailDBTLB (this, SW_RES(TLB_AVAILDB   )),
    aDocDBTextFT(this, SW_RES(FT_DOCDBTEXT  )),
    aDocDBNameFT(this, SW_RES(FT_DOCDBNAME  )),
    aOKBT       (this, SW_RES(BT_OK         )),
    aCancelBT   (this, SW_RES(BT_CANCEL     )),
    aHelpBT     (this, SW_RES(BT_HELP       )),
//  aChangeBT   (this, SW_RES(BT_CHANGEDB    )),

    aRootOpened     (SW_RES(BMP_ROOT_CLOSED)),
    aRootClosed     (SW_RES(BMP_ROOT_OPENED)),
    aDBBMP          (SW_RES(BMP_DB)),
    aTableBMP       (SW_RES(BMP_TABLE)),

    pMgr( new SwFldMgr() ),
    pSh(rVw.GetWrtShellPtr())
{
    FillDBPopup();

    FreeResource();

    ShowDBName(pSh->GetDBName());
    aOKBT.SetClickHdl(LINK(this, SwChangeDBDlg, ButtonHdl));

    aUsedDBTLB.SetSelectionMode(MULTIPLE_SELECTION);
    aUsedDBTLB.SetWindowBits(WB_HASLINES|WB_CLIPCHILDREN|WB_SORT|WB_HASBUTTONS|WB_HASBUTTONSATROOT|WB_HSCROLL);
    aUsedDBTLB.SetFont(GetSettings().GetStyleSettings().GetAppFont());
    aUsedDBTLB.SetSpaceBetweenEntries(0);
    aUsedDBTLB.SetNodeBitmaps( aRootOpened, aRootClosed );

    Link aLink = LINK(this, SwChangeDBDlg, TreeSelectHdl);

    aUsedDBTLB.SetSelectHdl(aLink);
    aUsedDBTLB.SetDeselectHdl(aLink);
    aAvailDBTLB.SetSelectHdl(aLink);
    aAvailDBTLB.SetDeselectHdl(aLink);
    TreeSelectHdl();
}

/*--------------------------------------------------------------------
    Beschreibung: Datenbank-Listboxen initialisieren
 --------------------------------------------------------------------*/


void SwChangeDBDlg::FillDBPopup()
{
#ifdef REPLACE_OFADBMGR
    Reference<XNameAccess> xDBContext;
    Reference< XMultiServiceFactory > xMgr( ::utl::getProcessServiceFactory() );
    if( xMgr.is() )
    {
        Reference<XInterface> xInstance = xMgr->createInstance( C2U( "com.sun.star.sdb.DatabaseContext" ));
        xDBContext = Reference<XNameAccess>(xInstance, UNO_QUERY) ;
    }
    DBG_ASSERT(xDBContext.is(), "com.sun.star.sdb.DataBaseContext: service not available")
//  SwNewDBMgr* pNewDBMgr = pSh->GetNewDBMgr();

//  String sDBNames = pNewDBMgr->GetSbaObject()->GetDatabaseNames();
//  SfxApplication* pSfxApp = SFX_APP();
//  sDBNames = pSfxApp->LocalizeDBName(INI2NATIONAL, sDBNames);

//  USHORT nDBNamesCount = sDBNames.GetTokenCount();

    String sDataBaseName(pSh->GetDBName());
    String sDBName(sDataBaseName.GetToken(0, DB_DELIM));
    String sTableName(sDataBaseName.GetToken(1, DB_DELIM));
    aAvailDBTLB.Select(sDBName, sTableName, aEmptyStr);

//  sDBNames = pNewDBMgr->GetSbaObject()->GetDatabaseNames();
    SvStringsDtor aAllDBNames(5, 5);

    Sequence<OUString> aDBNames = xDBContext->getElementNames();
    const OUString* pDBNames = aDBNames.getConstArray();
    long nDBCount = aDBNames.getLength();

    for(long i = 0; i < nDBCount; i++)
    {
        String sDBName(pDBNames[i]);
        aAllDBNames.Insert(new String(sDBName), aAllDBNames.Count());
    }

    SvStringsDtor aDBNameList(5, 1);
    pSh->GetAllUsedDB( aDBNameList, &aAllDBNames );

    USHORT nCount = aDBNameList.Count();
    aUsedDBTLB.Clear();
    SvLBoxEntry *pFirst = 0;
    SvLBoxEntry *pLast = 0;

    for (i = 0; i < nCount; i++)
    {
        sDBName = *aDBNameList.GetObject(i);
        sDBName = sDBName.GetToken(0);
        pLast = Insert(sDBName);
        if (!pFirst)
            pFirst = pLast;
    }

    if (pFirst)
    {
        aUsedDBTLB.MakeVisible(pFirst);
        aUsedDBTLB.Select(pFirst);
    }

#else

    SwNewDBMgr* pNewDBMgr = pSh->GetNewDBMgr();

    String sDBNames = pNewDBMgr->GetSbaObject()->GetDatabaseNames();
    SfxApplication* pSfxApp = SFX_APP();
    sDBNames = pSfxApp->LocalizeDBName(INI2NATIONAL, sDBNames);

    USHORT nDBNamesCount = sDBNames.GetTokenCount();



//  if (rDBName.Len())
//      sDBName = pSfxApp->LocalizeDBName(INI2NATIONAL, rDBName);
//  else
    String sDBName = pSfxApp->LocalizeDBName(INI2NATIONAL, pSh->GetDBName());
    aAvailDBTLB.Select(sDBName);

    SvStringsDtor aDBNameList(5, 1);

    sDBNames = pNewDBMgr->GetSbaObject()->GetDatabaseNames();
    SvStringsDtor aAllDBNames(5, 5);
    for (USHORT i = 0; i < nDBNamesCount; i++)
#ifdef UNX
        aAllDBNames.Insert(new String(sDBNames.GetToken(i)), aAllDBNames.Count());
#else
        aAllDBNames.Insert(new String(sDBNames.GetToken(i).ToUpperAscii()), aAllDBNames.Count());
#endif


    pSh->GetAllUsedDB( aDBNameList, &aAllDBNames );

    USHORT nCount = aDBNameList.Count();
    aUsedDBTLB.Clear();
    SvLBoxEntry *pFirst = 0;
    SvLBoxEntry *pLast = 0;

    for (i = 0; i < nCount; i++)
    {
        sDBName = pNewDBMgr->ExtractDBName(*aDBNameList.GetObject(i));

#ifndef UNX
        // Richtige Schreibweise ermitteln (upper/lower-case)
        for (USHORT i2 = 0; i2 < nDBNamesCount; i2++)
        {
            if (sDBName.GetToken(0, DB_DELIM).ToUpperAscii() == sDBNames.GetToken(i2).ToUpperAscii())
            {
                sDBName = sDBNames.GetToken(i2);
                break;
            }
        }
#endif
        pLast = Insert(sDBName);
        if (!pFirst)
            pFirst = pLast;
    }

    if (pFirst)
    {
        aUsedDBTLB.MakeVisible(pFirst);
        aUsedDBTLB.Select(pFirst);
    }
#endif //REPLACE_OFADBMGR
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


SvLBoxEntry* SwChangeDBDlg::Insert(const String& rDBName)
{
    String sDBName(rDBName.GetToken(0, DB_DELIM));
    String sTableName(rDBName.GetToken(1, DB_DELIM));
    SvLBoxEntry* pParent;
    SvLBoxEntry* pChild;

#ifdef REPLACE_OFADBMGR
#else
    sDBName = SFX_APP()->LocalizeDBName(INI2NATIONAL, sDBName);
#endif //REPLACE_OFADBMGR

    USHORT nParent = 0;
    USHORT nChild = 0;

#ifdef REPLACE_OFADBMGR
    while ((pParent = aUsedDBTLB.GetEntry(nParent++)) != NULL)
    {
        if (sDBName == aUsedDBTLB.GetEntryText(pParent))
        {
            while ((pChild = aUsedDBTLB.GetEntry(pParent, nChild++)) != NULL)
            {
                if (sTableName == aUsedDBTLB.GetEntryText(pChild))
                    return pChild;
            }
            return aUsedDBTLB.InsertEntry(sTableName, aTableBMP, aTableBMP, pParent);
        }
    }
#else
    while ((pParent = aUsedDBTLB.GetEntry(nParent++)) != NULL)
    {
#ifdef UNX
        if (sDBName == aUsedDBTLB.GetEntryText(pParent))
#else
        if (sDBName.ToUpperAscii() == aUsedDBTLB.GetEntryText(pParent).ToUpperAscii())
#endif
        {
            while ((pChild = aUsedDBTLB.GetEntry(pParent, nChild++)) != NULL)
            {
#ifdef UNX
                if (sTableName == aUsedDBTLB.GetEntryText(pChild))
#else
                if (sTableName.ToUpperAscii() == aUsedDBTLB.GetEntryText(pChild).ToUpperAscii())
#endif
                    return pChild;
            }
            return aUsedDBTLB.InsertEntry(sTableName, aTableBMP, aTableBMP, pParent);
        }
    }
#endif
    pParent = aUsedDBTLB.InsertEntry(sDBName, aDBBMP, aDBBMP);
    return aUsedDBTLB.InsertEntry(sTableName, aTableBMP, aTableBMP, pParent);
}

/*--------------------------------------------------------------------
    Beschreibung: Dialog zerstoeren
 --------------------------------------------------------------------*/


__EXPORT SwChangeDBDlg::~SwChangeDBDlg()
{
    delete pMgr;
}

/*--------------------------------------------------------------------
     Beschreibung:  Schliessen
 --------------------------------------------------------------------*/


void __EXPORT SwChangeDBDlg::Apply()
{
    UpdateFlds();
}

/*--------------------------------------------------------------------
     Beschreibung:
 --------------------------------------------------------------------*/


void SwChangeDBDlg::UpdateFlds()
{
    SvStringsDtor aDBNames( (BYTE)aUsedDBTLB.GetSelectionCount(), 1 );
    SvLBoxEntry* pEntry = aUsedDBTLB.FirstSelected();

    while( pEntry )
    {
        if( aUsedDBTLB.GetParent( pEntry ))
        {
            String* pTmp = new String( aUsedDBTLB.GetEntryText(
                                            aUsedDBTLB.GetParent( pEntry )));
#ifdef REPLACE_OFADBMGR
#else
            *pTmp = SFX_APP()->LocalizeDBName( NATIONAL2INI, *pTmp);
#endif
            *pTmp += DB_DELIM;
            *pTmp += aUsedDBTLB.GetEntryText( pEntry );
            aDBNames.Insert(pTmp, aDBNames.Count() );
        }
        pEntry = aUsedDBTLB.NextSelected(pEntry);
    }

    pSh->StartAllAction();
#ifdef REPLACE_OFADBMGR
    String sTableName, sColumnName;
    String sTemp(aAvailDBTLB.GetDBName(sTableName, sColumnName));
    sTemp += DB_DELIM;
    sTemp += sTableName;
    pSh->ChangeDBFields( aDBNames, sTemp);
#else
    pSh->ChangeDBFields( aDBNames, aAvailDBTLB.GetDBName());
#endif
    pSh->EndAllAction();
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/


IMPL_LINK( SwChangeDBDlg, ButtonHdl, Button *, pBtn )
{
#ifdef REPLACE_OFADBMGR
    String sTableName, sColumnName;
    String sTemp(aAvailDBTLB.GetDBName(sTableName, sColumnName));
    sTemp += DB_DELIM;
    sTemp += sTableName;
    sTemp += DB_DELIM;
    sTemp += sColumnName;
    pSh->ChgDBName(sTemp);
#else
    String sNewDBName(aAvailDBTLB.GetDBName());
    pSh->ChgDBName(sNewDBName);
#endif
    ShowDBName(pSh->GetDBName());
    EndDialog(RET_OK);

    return 0;
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/


IMPL_LINK( SwChangeDBDlg, TreeSelectHdl, SvTreeListBox *, pBox )
{
    BOOL bEnable = FALSE;

    SvLBoxEntry* pEntry = aAvailDBTLB.GetCurEntry();

    if (pEntry)
    {
        if (aAvailDBTLB.GetParent(pEntry))
            bEnable = TRUE;
        aOKBT.Enable( bEnable );
    }
    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung: Datenbankname fuer Anzeige wandeln
 --------------------------------------------------------------------*/

void SwChangeDBDlg::ShowDBName(const String& rDBName)
{
    String sTmp(rDBName.GetToken(0, DB_DELIM));
    String sName;

#ifdef REPLACE_OFADBMGR
#else
    sTmp = SFX_APP()->LocalizeDBName(INI2NATIONAL, sTmp);
#endif
    sTmp += '.';
    sTmp += rDBName.GetToken(1, DB_DELIM);

    for (USHORT i = 0; i < sTmp.Len(); i++)
    {
        sName += sTmp.GetChar(i);
        if (sTmp.GetChar(i) == '~')
            sName += '~';
    }

    aDocDBNameFT.SetText(sName);
}

/*************************************************************************

      $Log: not supported by cvs2svn $
      Revision 1.43  2000/09/18 16:05:27  willem.vandorp
      OpenOffice header added.

      Revision 1.42  2000/07/07 15:25:43  os
      replace ofadbmgr

      Revision 1.41  2000/06/26 13:35:59  os
      new DataBase API

      Revision 1.40  2000/04/18 15:17:31  os
      UNICODE

      Revision 1.39  2000/03/03 15:17:00  os
      StarView remainders removed

      Revision 1.38  2000/02/11 14:46:04  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.37  2000/01/31 12:53:09  os
      #72339# dialog needs one apply button only

      Revision 1.36  1999/09/29 06:49:52  mh
      chg: header

      Revision 1.35  1999/06/09 17:34:28  JP
      have to change: no cast from GetpApp to SfxApp/OffApp, SfxShell only subclass of SfxApp


      Rev 1.34   09 Jun 1999 19:34:28   JP
   have to change: no cast from GetpApp to SfxApp/OffApp, SfxShell only subclass of SfxApp

      Rev 1.33   04 Feb 1999 21:18:30   JP
   Bug #61404#/#61014#: Optimierung der Schnittstellen

      Rev 1.32   19 Nov 1998 13:18:44   OM
   #59660# Eintrag vorselektieren

      Rev 1.31   06 Nov 1997 17:03:22   OM
   Geaenderte DB-Selektionsbox

      Rev 1.30   03 Nov 1997 13:18:10   MA
   precomp entfernt

      Rev 1.29   30 Oct 1997 14:30:48   OM
   Feldbefehl-Umstellung

      Rev 1.28   18 Sep 1997 14:34:04   OM
   Feldumstellung

      Rev 1.27   02 Sep 1997 09:55:54   OM
   SDB-Headeranpassung

      Rev 1.26   15 Aug 1997 12:11:20   OS
   chartar/frmatr/txtatr aufgeteilt

      Rev 1.25   06 Aug 1997 13:39:54   TRI
   VCL: GetpApp() statt pApp

      Rev 1.24   23 Jul 1997 20:25:52   HJS
   includes

      Rev 1.23   14 May 1997 19:01:46   OM
   Datenbank auch in ExpressionFields austauschen

      Rev 1.22   13 May 1997 13:11:06   OM
   #39586# Datenbank festlegen beendet Dialog

      Rev 1.21   08 Apr 1997 12:44:38   MA
   includes

      Rev 1.20   07 Apr 1997 18:23:06   MH
   chg: header

      Rev 1.19   18 Mar 1997 15:24:14   OM
   Sortierte Treelistbox

      Rev 1.18   11 Nov 1996 09:56:04   MA
   ResMgr

      Rev 1.17   28 Oct 1996 11:29:52   OM
   #32799#Namen der aktuellen Datenbank korrekt anzeigen

      Rev 1.16   02 Oct 1996 16:50:26   MA
   Umstellung Enable/Disable

      Rev 1.15   25 Sep 1996 14:11:42   OM
   Neue Datenbanktrenner

      Rev 1.14   28 Aug 1996 12:13:32   OS
   includes

      Rev 1.13   14 Aug 1996 11:45:54   OM
   Neue Segs

      Rev 1.12   14 Aug 1996 11:44:34   OM
   Datenbankumstellung

      Rev 1.11   23 Jul 1996 16:08:30   OM
   Neue Segs

      Rev 1.10   23 Jul 1996 16:07:28   OM
   Datenbank am Dok umsetzen

      Rev 1.9   17 Jul 1996 13:47:30   OM
   Datenbankumstellung 327

      Rev 1.8   23 May 1996 16:34:40   OM
   DB-Namen in Expressionfields austauschen

      Rev 1.7   23 May 1996 15:29:02   OM
   Schreibweise der DB-Namen restaurieren

      Rev 1.6   22 May 1996 12:04:38   OM
   ChangeDBFields an Doc verlagert

      Rev 1.5   20 May 1996 16:33:28   OM
   Nur verwendete Datenbanken zu Auswahl stellen

      Rev 1.4   20 May 1996 11:06:44   OM
   ChangeDBFields in die EditShell verlagert

      Rev 1.3   15 May 1996 17:05:28   OM
   Neue Segs

      Rev 1.2   15 May 1996 17:05:02   OM
   Datenbanken austauschen

      Rev 1.1   15 May 1996 14:02:22   OM
   Neue Segs

      Rev 1.0   15 May 1996 14:01:12   OM
   Initial revision.

*************************************************************************/


diff --git a/sw/source/ui/fldui/changedb.hrc b/sw/source/ui/fldui/changedb.hrc
new file mode 100644
index 0000000..0588662
--- /dev/null
+++ b/sw/source/ui/fldui/changedb.hrc
@@ -0,0 +1,93 @@
/*************************************************************************
 *
 *  $RCSfile: changedb.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:36 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _CHANGEDB_HRC
#define _CHANGEDB_HRC

// #include -----------------------------------------------------------------

// Elemente -----------------------------------------------------------------

#define FT_DESC         1
#define FT_DOCDBTEXT    2
#define FT_DOCDBNAME    3
#define BT_CHANGEDB     4
#define FT_USEDDB       5
#define FT_AVAILDB      6
#define TLB_USEDDB      7
#define TLB_AVAILDB     8
#define GB_DBLIST       9
#define BT_OK          10
#define BT_CANCEL      11
#define BT_HELP        11

/*--------------------------------------------------------------------
    Beschreibung: Bitmaps
 --------------------------------------------------------------------*/

#define BMP_ROOT_CLOSED     1
#define BMP_ROOT_OPENED     2
#define BMP_DB              3
#define BMP_TABLE           4

#endif


diff --git a/sw/source/ui/fldui/changedb.src b/sw/source/ui/fldui/changedb.src
new file mode 100644
index 0000000..53c74a8
--- /dev/null
+++ b/sw/source/ui/fldui/changedb.src
@@ -0,0 +1,413 @@
/*************************************************************************
 *
 *  $RCSfile: changedb.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:36 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "changedb.hrc"
#include "fldui.hrc"

#define IMAGE_STDBTN_COLOR Color { Red = 0xff00 ; Green = 0x0000 ; Blue = 0xff00 ; }

ModalDialog DLG_CHANGE_DB
{
     // HelpID = HID_EDIT_FIELD;
    OutputSize = TRUE ;
     // Hide = TRUE;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 266 , 151 ) ;
    Text = "Datenbank austauschen" ;
    Text [ ENGLISH ] = "Change Database Name" ;
    Text [ english_us ] = "Exchange Databases" ;
    Text [ italian ] = "Scambia database" ;
    Text [ spanish ] = "Cambiar Bases de Datos" ;
    Text [ french ] = "Changer de base de données" ;
    Text [ dutch ] = "Database wisselen" ;
    Text [ swedish ] = "Byt databas" ;
    Text [ danish ] = "Udskift database" ;
    Text [ portuguese_brazilian ] = "Datenbank austauschen" ;
    Text [ portuguese ] = "Substituir base de dados" ;
    Moveable = TRUE ;
    FixedText FT_DESC
    {
        Pos = MAP_APPFONT ( 12 , 14 ) ;
        Size = MAP_APPFONT ( 190 , 45 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? In diesem Dialog können Sie Datenbanken, auf die Sie in Ihrem Dokument über Datenbankfelder zugreifen, durch andere Datenbanken austauschen. Sie können nur eine Änderung pro Arbeitsgang durchführen. In der linken Liste ist Mehrfachselektion möglich. : In diesem Dialog k÷nnen Sie Datenbanken, auf die Sie in Ihrem Dokument ³ber Datenbankfelder zugreifen, durch andere Datenbanken austauschen. Sie k÷nnen nur eine Žnderung pro Arbeitsgang durchf³hren. In der linken Liste ist Mehrfachselektion m÷glich. */
        Text = "In diesem Dialog können Sie Datenbanken, auf die Sie in Ihrem Dokument über Datenbankfelder zugreifen, durch andere Datenbanken austauschen. Sie können nur eine Änderung pro Arbeitsgang durchführen. In der linken Liste ist Mehrfachselektion möglich." ;
        Text [ ENGLISH ] = "???" ;
        WordBreak = TRUE ;
        Left = TRUE ;
        Text [ english_us ] = "Use this dialog to exchange the database accessed in your document via database fields with another one. You can only make one change at a time. Multiple selection is possible in the list on the left." ;
        Text [ italian ] = "In questo dialogo si possono scambiare database ai quali si accede tramite campi di database. Si può effettuare una modifica per volta. Nell'elenco di sinistra è possibile una selezione multipla." ;
        Text [ spanish ] = "En este diálogo puede intercambiar por otras las bases de datos a las que acceda a través de los campos. Se puede realizar solo un cambio por fase de trabajo. En la lista izquierda es posible hacer una selección múltiple." ;
        Text [ french ] = "Cette boîte de dialogue vous permet d'échanger les bases de données auxquelles vous accédez dans vos documents par des champs de formulaire. Vous pouvez exécuter une seule modification par saisie. La liste de gauche permet une sélection multiple." ;
        Text [ dutch ] = "In deze dialoog kunt u gegevensbestanden waarop u in uw document via de speciale velden betrekking neemt, door andere gegevensbestanden vervangen. In de linker lijst is een meervoudige keuze mogelijk." ;
        Text [ swedish ] = "I denna dialog kan man byta ut de databaser, som kan nås via databasfältet i Ditt dokument, mot andra databaser. Man kan bara göra en ändring åt gången. I den vänstra listen finns möjlighet till multipel markering." ;
        Text [ danish ] = "I denne dialog kan du udskifte databaser, som du har adgang til via databasefelter. Du kan kun udføre en ændring ad gangen. I listen til venstre er der mulighed for multimarkering." ;
        Text [ portuguese_brazilian ] = "In diesem Dialog können Sie Datenbanken, auf die Sie in Ihrem Dokument über Datenbankfelder zugreifen, durch andere Datenbanken austauschen. Sie können nur eine Änderung pro Arbeitsgang durchführen. In der linken Liste ist Mehrfachselektion möglich." ;
        Text [ portuguese ] = "Nesta caixa de diálogo poderá substituir bases de dados por outras, tendo acesso a elas no seu documento através dos campos da base de dados. É apenas possível uma alteração por cada operação. Na lista da esquerda poderá seleccionar várias opções." ;
        Text[ chinese_simplified ] = "ÔÚÕâ¸ö¶Ô»°¿òÄÚÄúÄܹ»Ê¹ÓÃÒ»¸öÆäËûÊý¾Ý¿âÀ´´úÌæÄúµ±Ç°±à¼­µÄÎĵµËùʹÓõÄÊý¾Ý¿â¡£Ã¿´ÎÄúÖ»ÄÜ×öÒ»Ïî¸ü¸Ä¡£ÔÚ×ó·½µÄÁе¥ÄÚÄú¿ÉÒÔ½øÐжàÖØÑ¡Ôñ¡£";
        Text[ russian ] = "Â ýòîì äèàëîãå Âû ìîæåòå çàìåíèòü áàçû äàííûõ, äîñòóï ê êîòîðûì âîçìîæåí ïðè ïîìîùè ïîëåé áàçû äàííûõ, äðóãèìè áàçàìè äàííûõ. Çà îäíó îïåðàöèþ Âû ìîæåòå ïðîèçâåñòè òîëüêî îäíî èçìåíåíèå. Â ñïèñêå ñëåâà âîçìîæíî ìíîãîêðàòíîå âûäåëåíèå.";
        Text[ polish ] = "W tym dialogu mo¿esz wymieniæ dostêpne w twoim dokumencie poprzez pola bazy danych na inne. Mo¿esz dokonaæ tylko jednej zmiany podczas sesji roboczej. Na liœcie z lewej strony mo¿liwa jest wielokrotna selekcja.";
        Text[ japanese ] = "‚±‚ÌÀÞ²±Û¸Þ‚Å‚ÍÃÞ°ÀÍÞ°½Ì¨°ÙÄނð’Ê‚µ‚āAÄÞ·­ÒÝĂɱ¸¾½‚·‚éÃÞ°ÀÍÞ°½‚𑼂ÌÃÞ°ÀÍÞ°½‚ÆŒðŠ·‚Å‚«‚Ü‚·Bˆê“x‚É1‚‚̕ύX‚µ‚©‚Å‚«‚Ü‚¹‚ñB¶‚ÌؽĂł͕¡”‘I‘ð‚ª‰Â”\\‚Å‚·B";
        Text[ chinese_traditional ] = "¦b³o­Ó¹ï¸Ü¤è¶ô¤º±z¯à°÷¨Ï¥Î¤@­Ó¨ä¥L¸ê®Æ®w¨Ó¥N´À±z·í«e½s¿èªº¤å¥ó©Ò¨Ï¥Îªº¸ê®Æ®w¡C±z¨C¦¸¥u¯à§@¤@¦¸Åܧó¡C±z¯à°÷¦b¥ªÄ椺§@¦h­«¿ï¾Ü¡C";
        Text[ arabic ] = "Ýí ãÑÈÚ ÇáÍæÇÑ åÐÇ¡ íãßäß ÇÓÊÈÏÇá ÞæÇÚÏ ÇáÈíÇäÇÊ¡ ÇáÊí ÊÕá ÅáíåÇ Ýí ãÓÊäÏß ÈæÇÓØÉ ÍÞæá ÞæÇÚÏ ÇáÈíÇäÇÊ¡ ÈÃÎÑì. áÇÍÙ Ãäå íãßäß Úãá ÊÛííÑ æÇÍÏ ÝÞØ ßá ãÑÉ. íãßä Úãá ÃßËÑ ãä ÊÍÏíÏ Ýí ÇáÞÇÆãÉ ÇáíÓÑì.";
        Text[ dutch ] = "In deze dialoog kunt u gegevensbestanden waarop u in uw document via de speciale velden betrekking neemt, door andere gegevensbestanden vervangen. In de linker lijst is een meervoudige keuze mogelijk.";
        Text[ chinese_simplified ] = "ÔÚÕâ¸ö¶Ô»°¿òÄÚÄúÄܹ»Ê¹ÓÃÒ»¸öÆäËûÊý¾Ý¿âÀ´´úÌæÄúµ±Ç°±à¼­µÄÎĵµËùʹÓõÄÊý¾Ý¿â¡£Ã¿´ÎÄúÖ»ÄÜ×öÒ»Ïî¸ü¸Ä¡£ÔÚ×ó·½µÄÁе¥ÄÚÄú¿ÉÒÔ½øÐжàÖØÑ¡Ôñ¡£";
        Text[ greek ] = "Óå áõôüí ôïí äéÜëïãï ìðïñåßôå íá áíôáëëÜîåôå ôéò âÜóåéò äåäïìÝíùí, ôéò ïðïßåò ÷ñçóéìïðïéåßôå ãéá ôï Ýããñáöï óáò ìÝóù ôùí ðåäßùí âÜóåùí äåäïìÝíùí, ìå Üëëåò âÜóåéò äåäïìÝíùí. ÅðéôñÝðåôáé ìüíï ìéá áëëáãÞ áíÜ åñãÜóéìç çìÝñá. Óôï áñéóôåñü ôìÞìá ìðïñïýí íá ãßíïõí ðïëëáëÝò åðéëïãÝò.";
        Text[ korean ] = "ÀÌ ´ëÈ­»óÀÚ¿¡¼­,´ç½ÅÀº ¹®¼­¿¡¼­ µ¥ÀÌÅͺ£À̽º¿¡ Á¢±ÙÇϰųª ±³È¯ÇÏ´Â µ¥ÀÌÅͺ£À̽º Çʵ带 »ç¿ëÇϽǼö ÀÖ½À´Ï´Ù.Çѹø¿¡ Çѹø º¯°æÀÌ ¸¸µé¾î  Áý´Ï´Ù. ¿ÞÂÊÀÇ ¸®½ºÆ® »ó¿¡¼­, ´ÙÁß ¼±ÅÃÀÌ °¡´ÉÇÕ´Ï´Ù.";
        Text[ turkish ] = "Bu diyalogda, belgenizdeki veritabaný alanlarý yoluyla eriþtiðiniz veritabanlarýný baþkalarý ile deðiþtirebilirsiniz. Her iþlemde yalnýzca tek bir deðiþiklik yapýlabilir. Soldaki listede birden fazla seçim yapýlabilir.";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_USEDDB
    {
        Pos = MAP_APPFONT ( 12 , 60 ) ;
        Size = MAP_APPFONT ( 80 , 10 ) ;
        Text = "Verwendete Datenbanken" ;
        Text [ ENGLISH ] = "Used Databases" ;
        Left = TRUE ;
        Text [ english_us ] = "Databases in Use" ;
        Text [ italian ] = "Database utilizzati" ;
        Text [ spanish ] = "Bases de datos utilizadas" ;
        Text [ french ] = "Bases de données utilisées" ;
        Text [ dutch ] = "Gebruikte gegevensbestanden" ;
        Text [ swedish ] = "Använda databaser" ;
        Text [ danish ] = "Anvendte databaser" ;
        Text [ portuguese_brazilian ] = "Verwendete Datenbanken" ;
        Text [ portuguese ] = "Bases de dados utilizadas" ;
        Text[ chinese_simplified ] = "ʹÓõÄÊý¾Ý¿â";
        Text[ russian ] = "Èñïîëüçóåìûå áàçû äàííûõ";
        Text[ polish ] = "U¿yte bazy danych";
        Text[ japanese ] = "Žg—p‚³‚ꂽÃÞ°ÀÍÞ°½";
        Text[ chinese_traditional ] = "©Ò¨Ï¥Îªº¸ê®Æ®w";
        Text[ arabic ] = "ÞæÇÚÏ ÇáÈíÇäÇÊ ÞíÏ ÇáÇÓÊÎÏÇã";
        Text[ dutch ] = "Gebruikte gegevensbestanden";
        Text[ chinese_simplified ] = "ʹÓõÄÊý¾Ý¿â";
        Text[ greek ] = "×ñçóéìïðïéçìÝíåò âÜóåéò äåäïìÝíùí";
        Text[ korean ] = "µ¥ÀÌÅͺ£À̽º°¡ »ç¿ëÁß ÀÔ´Ï´Ù.";
        Text[ turkish ] = "Kullanýlan veritabanlarý";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_AVAILDB
    {
        Pos = MAP_APPFONT ( 108 , 60 ) ;
        Size = MAP_APPFONT ( 80 , 10 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? Verfügbare Datenbanken : Verf³gbare Datenbanken */
        Text = "Verfügbare Datenbanken" ;
        Text [ ENGLISH ] = "Available Databases" ;
        Left = TRUE ;
        Text [ english_us ] = "Available Databases" ;
        Text [ italian ] = "Database disponibili" ;
        Text [ spanish ] = "Bases de datos diponibles" ;
        Text [ french ] = "Bases de données disponibles" ;
        Text [ dutch ] = "Beschikbare gegevensbestanden" ;
        Text [ swedish ] = "Tillgängliga databaser" ;
        Text [ danish ] = "Tilgængelige databaser" ;
        Text [ portuguese_brazilian ] = "Verfügbare Datenbanken" ;
        Text [ portuguese ] = "Bases de dados disponíveis" ;
        Text[ chinese_simplified ] = "¿ÉʹÓõÄÊý¾Ý¿â";
        Text[ russian ] = "Äîñòóïíûå áàçû äàííûõ";
        Text[ polish ] = "Dostêpne bazy danych";
        Text[ japanese ] = "Žg—p‚Å‚«‚éÃÞ°ÀÍÞ°½";
        Text[ chinese_traditional ] = "²{¦sªº¸ê®Æ®w";
        Text[ arabic ] = "ÞæÇÚÏ ÇáÈíÇäÇÊ ÇáãÊÇÍÉ";
        Text[ dutch ] = "Beschikbare gegevensbestanden";
        Text[ chinese_simplified ] = "¿ÉʹÓõÄÊý¾Ý¿â";
        Text[ greek ] = "ÄéáèÝóéìåò âÜóåéò äåäïìÝíùí";
        Text[ korean ] = "µ¥ÀÌÅͺ£À̽º »ç¿ë°¡´É";
        Text[ turkish ] = "Mevcut veritabanlarý";
        Text[ language_user1 ] = " ";
    };
    Control TLB_USEDDB
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 12 , 73 ) ;
        Size = MAP_APPFONT ( 90 , 52 ) ;
        TabStop = TRUE ;
    };
    Control TLB_AVAILDB
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 108 , 73 ) ;
        Size = MAP_APPFONT ( 90 , 52 ) ;
        TabStop = TRUE ;
    };
    /*  MultiListBox LB_USEDDB {
            Sort = TRUE;
            Border = TRUE;
            SimpleMode = TRUE;
            Pos = MAP_APPFONT( 12, 73 );
            Size = MAP_APPFONT( 90, 52 );
            TabStop = TRUE;
        };
    ListBox LB_AVAILDB {
            Sort = TRUE;
            Border = TRUE;
            Pos = MAP_APPFONT( 108, 73 );
            Size = MAP_APPFONT( 90, 52 );
            TabStop = TRUE;
        };*/
    FixedText FT_DOCDBTEXT
    {
        Pos = MAP_APPFONT ( 6 , 136 ) ;
        Size = MAP_APPFONT ( 100 , 10 ) ;
        Text = "Am Dokument gesetzte Datenbank:" ;
        Text [ ENGLISH ] = "???" ;
        Left = TRUE ;
        Text [ english_us ] = "Database applied to document:" ;
        Text [ italian ] = "Database applicato a documento" ;
        Text [ spanish ] = "Base de datos aplicada al doc.:" ;
        Text [ french ] = "Base de données attachée au document :" ;
        Text [ dutch ] = "Gekoppeld gegevensbestand" ;
        Text [ swedish ] = "Databaser använda för dokumentet:" ;
        Text [ danish ] = "Database tilknyttet til dokument:" ;
        Text [ portuguese_brazilian ] = "Am Dokument gesetzte Datenbank:" ;
        Text [ portuguese ] = "Base de dados aplicada ao documento:" ;
        Text[ chinese_simplified ] = "ÎĵµÊ¹ÓõÄÊý¾Ý¿â£º";
        Text[ russian ] = "Áàçà äàííûõ, óñòàíîâëåííàÿ â äîêóìåíòå:";
        Text[ polish ] = "Baza danych ustawiona przy dok.:";
        Text[ japanese ] = "ÄÞ·¨ÒÝĂɓK—p‚³‚ꂽÃÞ°ÀÍÞ°½:";
        Text[ chinese_traditional ] = "¤å¥ó¨Ï¥Îªº¸ê®Æ®w¡G";
        Text[ arabic ] = "ÞÇÚÏÉ ÇáÈíÇäÇÊ ÇáãÑÊÈØÉ ÈÇáãÓÊäÏ:";
        Text[ dutch ] = "Gekoppeld gegevensbestand";
        Text[ chinese_simplified ] = "ÎĵµÊ¹ÓõÄÊý¾Ý¿â£º";
        Text[ greek ] = "Óôï Ýããñáöï åöáñìïóìÝíç âÜóç äåäïìÝíùí:";
        Text[ korean ] = "¹®¼­¿¡ µ¥ÀÌÅͺ£À̽º Àû¿ë:";
        Text[ turkish ] = "Belge ile kullanýlan veritabaný:";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_DOCDBNAME
    {
        Pos = MAP_APPFONT ( 109 , 136 ) ;
        Size = MAP_APPFONT ( 94 , 10 ) ;
        Text = "Adressen.Adressen" ;
        Text [ ENGLISH ] = "???" ;
        Left = TRUE ;
        Text [ dutch ] = "Adressen.Adressen" ;
        Text [ english_us ] = "Addresses.Addresses" ;
        Text [ italian ] = "Indirizzi.Indirizzi" ;
        Text [ spanish ] = "Direcciones.Direcciones" ;
        Text [ french ] = "Adresses.Adresses" ;
        Text [ swedish ] = "Adresser.Adresser" ;
        Text [ danish ] = "Adresser.Adresser" ;
        Text [ portuguese_brazilian ] = "Adressen.Adressen" ;
        Text [ portuguese ] = "Endereços. Endereços" ;
        Text[ chinese_simplified ] = "µØÖ·.µØÖ·";
        Text[ russian ] = "Àäðåñà.Àäðåñà";
        Text[ polish ] = "Adresy.Adresy";
        Text[ japanese ] = "ZŠ.ZŠ";
        Text[ chinese_traditional ] = "¦a§}.¦a§}";
        Text[ arabic ] = "ÚäÇæíä ÚäÇæíä";
        Text[ dutch ] = "Adressen.Adressen";
        Text[ chinese_simplified ] = "µØÖ·.µØÖ·";
        Text[ greek ] = "Äéåõèýíóåéò.Äéåõèýíóåéò";
        Text[ korean ] = "ÁÖ¼Ò.ÁÖ¼Ò";
        Text[ turkish ] = "Adresler.Adresler";
        Text[ language_user1 ] = " ";
    };
/*  PushButton BT_CHANGEDB
    {
        Pos = MAP_APPFONT ( 210 , 135 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        Text = "Festlegen" ;
        Text [ ENGLISH ] = "???" ;
        TabStop = TRUE ;
        Text [ dutch ] = "Definiëren" ;
        Text [ english_us ] = "Define" ;
        Text [ italian ] = "Definisci" ;
        Text [ spanish ] = "Definir" ;
        Text [ french ] = "Définir" ;
        Text [ swedish ] = "Definiera" ;
        Text [ danish ] = "Fastlæg" ;
        Text [ portuguese ] = "Definir" ;
        Text [ portuguese_brazilian ] = "Festlegen" ;
        Text[ chinese_simplified ] = "¶¨Òå";
        Text[ russian ] = "Óñòàíîâèòü";
        Text[ polish ] = "Zdefiniuj";
        Text[ japanese ] = "Šm’è";
        Text[ chinese_traditional ] = "©w¸q";
        Text[ arabic ] = "ÊÚÑíÝ";
        Text[ dutch ] = "Define";
        Text[ chinese_simplified ] = "Define";
        Text[ greek ] = "Êáèïñéóìüò";
        Text[ korean ] = "Define";
    };
  */    GroupBox GB_DBLIST
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 198 , 128 ) ;
        Text = "Datenbank austauschen" ;
        Text [ ENGLISH ] = "Change Database Names" ;
        Text [ dutch ] = "Database wisselen" ;
        Text [ english_us ] = "Exchange databases" ;
        Text [ italian ] = "Scambia database" ;
        Text [ spanish ] = "Cambiar Bases de Datos" ;
        Text [ french ] = "Changer de base de données" ;
        Text [ swedish ] = "Byt databas" ;
        Text [ danish ] = "Udskift database" ;
        Text [ portuguese_brazilian ] = "Datenbank austauschen" ;
        Text [ portuguese ] = "Substituir base de dados" ;
        Text[ chinese_simplified ] = "¸ü»»Êý¾Ý¿â";
        Text[ russian ] = "Çàìåíèòü áàçó äàííûõ";
        Text[ polish ] = "Wymieñ bazê danych";
        Text[ japanese ] = "ÃÞ°ÀÍÞ°½‚ÌŒðŠ·";
        Text[ chinese_traditional ] = "´À´«¸ê®Æ®w";
        Text[ arabic ] = "ÇÓÊÈÏÇá ÞæÇÚÏ ÇáÈíÇäÇÊ";
        Text[ dutch ] = "Database wisselen";
        Text[ chinese_simplified ] = "¸ü»»Êý¾Ý¿â";
        Text[ greek ] = "ÁíôáëëáãÞ âÜóåùí äåäïìÝíùí";
        Text[ korean ] = "µ¥ÀÌÅͺ£À̽º ±³È¯";
        Text[ turkish ] = "Veritabanýnýn deðiþtirilmesi";
        Text[ language_user1 ] = " ";
    };
    OKButton BT_OK
    {
        Pos = MAP_APPFONT ( 210 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        DefButton = TRUE ;
        Disable = TRUE ;
        Text = "Festlegen" ;
        TabStop = TRUE ;
        Text [ dutch ] = "Definiëren" ;
        Text [ english_us ] = "Define" ;
        Text [ italian ] = "Definisci" ;
        Text [ spanish ] = "Definir" ;
        Text [ french ] = "Définir" ;
        Text [ swedish ] = "Definiera" ;
        Text [ danish ] = "Definer" ;
        Text [ portuguese ] = "Definir" ;
        Text [ portuguese_brazilian ] = "Festlegen" ;
        Text[ chinese_simplified ] = "¶¨Òå";
        Text[ russian ] = "Çàäàòü";
        Text[ polish ] = "Zdefiniuj";
        Text[ japanese ] = "Šm”F";
        Text[ chinese_traditional ] = "©w¸q";
        Text[ arabic ] = "ÊÚÑíÝ";
        Text[ dutch ] = "Definiëren";
        Text[ chinese_simplified ] = "¶¨Òå";
        Text[ greek ] = "Êáèïñéóìüò";
        Text[ korean ] = "Á¤ÀÇ";
        Text[ turkish ] = "Tanýmla";
    };
    CancelButton BT_CANCEL
    {
        Pos = MAP_APPFONT ( 210 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        Text = "~Schließen" ;
        Text [ ENGLISH ] = "~Close" ;
        Text [ norwegian ] = "~Lukk" ;
        Text [ italian ] = "~Chiudi" ;
        Text [ portuguese_brazilian ] = "~Fechar" ;
        Text [ portuguese ] = "~Fechar" ;
        Text [ finnish ] = "~Sulje" ;
        Text [ danish ] = "~Luk" ;
        Text [ french ] = "~Fermer" ;
        Text [ swedish ] = "~Stäng" ;
        Text [ dutch ] = "~Sluiten" ;
        Text [ spanish ] = "~Cerrar" ;
        Text [ english_us ] = "~Close" ;
        Text[ chinese_simplified ] = "¹Ø±Õ(~C)";
        Text[ russian ] = "Çàêðûòü";
        Text[ polish ] = "~Zamknij";
        Text[ japanese ] = "•‚¶‚é(~C)";
        Text[ chinese_traditional ] = "Ãö³¬(~C)";
        Text[ arabic ] = "ÅÛáÇÞ";
        Text[ greek ] = "Êëåß~óéìï";
        Text[ korean ] = "´Ý±â(~C)";
        Text[ turkish ] = "~Çýkýþ";
    };
    HelpButton BT_HELP
    {
        Pos = MAP_APPFONT ( 210 , 60 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    Bitmap BMP_ROOT_CLOSED
    {
        File = "plus.bmp" ;
    };
    Bitmap BMP_ROOT_OPENED
    {
        File = "minus.bmp" ;
    };
    Image BMP_DB
    {
        ImageBitmap = Bitmap { File = "db.bmp" ; };
        MaskColor = IMAGE_STDBTN_COLOR ;
    };
    Image BMP_TABLE
    {
        ImageBitmap = Bitmap { File = "table.bmp" ; };
        MaskColor = IMAGE_STDBTN_COLOR ;
    };
    Text[ chinese_simplified ] = "¸ü»»Êý¾Ý¿â";
    Text[ russian ] = "Çàìåíèòü áàçó äàííûõ";
    Text[ polish ] = "Wymieñ bazê danych";
    Text[ japanese ] = "ÃÞ°ÀÍÞ°½‚ÌŒðŠ·";
    Text[ chinese_traditional ] = "§ó´«¸ê®Æ®w";
    Text[ arabic ] = "ÇÓÊÈÏÇá ÞæÇÚÏ ÇáÈíÇäÇÊ";
    Text[ dutch ] = "Database wisselen";
    Text[ chinese_simplified ] = "¸ü»»Êý¾Ý¿â";
    Text[ greek ] = "ÁíôáëëáãÞ âÜóåùí äåäïìÝíùí";
    Text[ korean ] = "µ¥ÀÌÅͺ£À̽º ±³È¯";
    Text[ turkish ] = "Veritabanýnýn deðiþtirilmesi";
    Text[ language_user1 ] = " ";
};

diff --git a/sw/source/ui/fldui/flddb.cxx b/sw/source/ui/fldui/flddb.cxx
new file mode 100644
index 0000000..3ef394c
--- /dev/null
+++ b/sw/source/ui/fldui/flddb.cxx
@@ -0,0 +1,756 @@
/*************************************************************************
 *
 *  $RCSfile: flddb.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:36 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif
#ifndef _DBFLD_HXX
#include <dbfld.hxx>
#endif
#ifndef _FLDBAS_HXX
#include <fldbas.hxx>
#endif
#ifndef _FLDTDLG_HXX
#include <fldtdlg.hxx>
#endif
#ifndef _NUMRULE_HXX
#include <numrule.hxx>
#endif

#ifndef _FLDTDLG_HRC
#include <fldtdlg.hrc>
#endif
#ifndef _FLDUI_HRC
#include <fldui.hrc>
#endif
#ifndef _FLDDB_HXX
#include <flddb.hxx>
#endif

#define USER_DATA_VERSION_1     "1"
#define USER_DATA_VERSION USER_DATA_VERSION_1
/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SwFldDBPage::SwFldDBPage(Window* pParent, const SfxItemSet& rCoreSet ) :
    SwFldPage( pParent, SW_RES( TP_FLD_DB ), rCoreSet ),
    aTypeFT     (this, SW_RES(FT_DBTYPE)),
    aTypeLB     (this, SW_RES(LB_DBTYPE)),
    aSelectionFT(this, SW_RES(FT_DBSELECTION)),
    aDatabaseTLB(this, SW_RES(TLB_DBLIST), aEmptyStr, FALSE),
    aConditionFT(this, SW_RES(FT_DBCONDITION)),
    aConditionED(this, SW_RES(ED_DBCONDITION)),
    aValueFT    (this, SW_RES(FT_DBSETNUMBER)),
    aValueED    (this, SW_RES(ED_DBSETNUMBER)),
    aDBFormatRB (this, SW_RES(RB_DBOWNFORMAT)),
    aNewFormatRB(this, SW_RES(RB_DBFORMAT)),
    aNumFormatLB(this, SW_RES(LB_DBNUMFORMAT)),
    aFormatLB   (this, SW_RES(LB_DBFORMAT)),
    aFormatGB   (this, SW_RES(GB_DBFORMAT))
{
    FreeResource();

    aOldNumSelectHdl = aNumFormatLB.GetSelectHdl();

    aNumFormatLB.SetSelectHdl(LINK(this, SwFldDBPage, NumSelectHdl));
    aDatabaseTLB.SetSelectHdl(LINK(this, SwFldDBPage, TreeSelectHdl));
    aDatabaseTLB.SetDoubleClickHdl(LINK(this, SwFldDBPage, InsertHdl));

    aValueED.SetModifyHdl(LINK(this, SwFldDBPage, ModifyHdl));
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

__EXPORT SwFldDBPage::~SwFldDBPage()
{
}

/*--------------------------------------------------------------------
    Beschreibung: TabPage initialisieren
 --------------------------------------------------------------------*/

void __EXPORT SwFldDBPage::Reset(const SfxItemSet& rSet)
{
    Init(); // Allgemeine initialisierung

    aTypeLB.SetUpdateMode(FALSE);
    USHORT nOldPos = aTypeLB.GetSelectEntryPos();
#ifdef REPLACE_OFADBMGR
    sOldDBName = aDatabaseTLB.GetDBName(sOldTableName, sOldColumnName);
#else
    sOldDBName = aDatabaseTLB.GetDBName();
#endif

    aTypeLB.Clear();

    USHORT nPos, nTypeId, i;

    if (!IsFldEdit())
    {
        // TypeListBox initialisieren
        const SwFldGroupRgn& rRg = GetFldMgr().GetGroupRange(IsFldDlgHtmlMode(), GetGroup());

        for(i = rRg.nStart; i < rRg.nEnd; ++i)
        {
            nTypeId = GetFldMgr().GetTypeId(i);
            nPos = aTypeLB.InsertEntry(GetFldMgr().GetTypeStr(i));
            aTypeLB.SetEntryData(nPos, (void*)nTypeId);
        }
    }
    else
    {
        nTypeId = GetCurField()->GetTypeId();
        nPos = aTypeLB.InsertEntry(GetFldMgr().GetTypeStr(GetFldMgr().GetPos(nTypeId)));
        aTypeLB.SetEntryData(nPos, (void*)nTypeId);
    }

    // alte Pos selektieren
    if (GetTypeSel() != LISTBOX_ENTRY_NOTFOUND)
        aTypeLB.SelectEntryPos(GetTypeSel());

    aFormatLB.Clear();

    USHORT nSize = GetFldMgr().GetFormatCount(TYP_DBSETNUMBERFLD, FALSE, IsFldDlgHtmlMode());
    for( i = 0; i < nSize; ++i )
    {
        USHORT nPos = aFormatLB.InsertEntry(GetFldMgr().GetFormatStr(TYP_DBSETNUMBERFLD, i));
        USHORT nFmtId = GetFldMgr().GetFormatId( TYP_DBSETNUMBERFLD, i );
        aFormatLB.SetEntryData( nPos, (void*)nFmtId );
        if( SVX_NUM_ARABIC == nFmtId )
            aFormatLB.SelectEntryPos( nPos );
    }

    if (!IsFldEdit())
    {
        if (nOldPos != LISTBOX_ENTRY_NOTFOUND)
            aTypeLB.SelectEntryPos(nOldPos);

        if (sOldDBName.Len())
        {
#ifdef REPLACE_OFADBMGR
            aDatabaseTLB.Select(sOldDBName, sOldTableName, sOldColumnName);
#else
            aDatabaseTLB.Select(sOldDBName);
#endif
        }
        else
        {
            SwWrtShell *pSh = ::GetActiveView()->GetWrtShellPtr();
#ifdef REPLACE_OFADBMGR
            String sTmp(pSh->GetDBName());

            aDatabaseTLB.Select(
                sTmp.GetToken(0, DB_DELIM),
                sTmp.GetToken(1, DB_DELIM),
                sTmp.GetToken(2, DB_DELIM));
#else
            aDatabaseTLB.Select(pSh->GetDBName());
#endif
        }
    }

    if( !IsRefresh() )
    {
        String sUserData = GetUserData();
        if(sUserData.GetToken(0, ';').EqualsIgnoreCaseAscii(USER_DATA_VERSION_1))
        {
            String sVal = sUserData.GetToken(1, ';');
            USHORT nVal = sVal.ToInt32();
            if(nVal != USHRT_MAX)
            {
                for(USHORT i = 0; i < aTypeLB.GetEntryCount(); i++)
                    if(nVal == (USHORT)(ULONG)aTypeLB.GetEntryData(i))
                    {
                        aTypeLB.SelectEntryPos(i);
                        break;
                    }
            }
        }
    }
    TypeHdl(0);

    aTypeLB.SetUpdateMode(TRUE);
    aTypeLB.SetSelectHdl(LINK(this, SwFldDBPage, TypeHdl));
    aTypeLB.SetDoubleClickHdl(LINK(this, SwFldDBPage, InsertHdl));

    if (IsFldEdit())
    {
        aConditionED.SaveValue();
        aValueED.SaveValue();
#ifdef REPLACE_OFADBMGR
        sOldDBName = aDatabaseTLB.GetDBName(sOldTableName, sOldColumnName);
#else
        sOldDBName = aDatabaseTLB.GetDBName();
#endif
        nOldFormat = GetCurField()->GetFormat();
        nOldSubType = GetCurField()->GetSubType();
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

BOOL __EXPORT SwFldDBPage::FillItemSet(SfxItemSet& rSet)
{
#ifdef REPLACE_OFADBMGR
    String sTableName, sColumnName;
    String sDBName = aDatabaseTLB.GetDBName(sTableName, sColumnName);
#else
    String sDBName = aDatabaseTLB.GetDBName();
#endif
    SwWrtShell *pSh = ::GetActiveView()->GetWrtShellPtr();

    if (!sDBName.Len())
    {
#ifdef REPLACE_OFADBMGR
        String sTmp = pSh->GetDBName();
        sDBName = sTmp.GetToken(0, DB_DELIM);
        sTableName = sTmp.GetToken(1, DB_DELIM);
#else
        sDBName = pSh->GetDBName();
#endif
    }
    else
    {
#ifdef REPLACE_OFADBMGR
        String sNewDBName = sDBName;
        sNewDBName += DB_DELIM;
        sNewDBName += sTableName;
        pSh->ChgDBName(sNewDBName);
#else
        // keine Spaltennamen an ChgDBName uebergeben
        String sNewDBName = sDBName.GetToken(0, DB_DELIM);
        sNewDBName += DB_DELIM;
        sNewDBName += sDBName.GetToken(1, DB_DELIM);
        pSh->ChgDBName(sNewDBName);
#endif
    }

    if (sDBName.Len())      // Ohne Datenbank kein neuer Feldbefehl
    {
        USHORT nTypeId = (USHORT)(ULONG)aTypeLB.GetEntryData(GetTypeSel());
        String aVal(aValueED.GetText());
        String aName(aConditionED.GetText());
        ULONG nFormat = 0;
        USHORT nSubType = 0;

        sDBName += DB_DELIM;
#ifdef REPLACE_OFADBMGR
        sDBName += sTableName;
        sDBName += DB_DELIM;
        if(sColumnName.Len())
        {
            sDBName += sColumnName;
            sDBName += DB_DELIM;
        }
#endif
        aName.Insert(sDBName, 0);

        switch (nTypeId)
        {
        case TYP_DBFLD:
            nFormat = aNumFormatLB.GetFormat();
            if (aNewFormatRB.IsEnabled() && aNewFormatRB.IsChecked())
                nSubType = SUB_OWN_FMT;
            aName = sDBName;
            break;

        case TYP_DBSETNUMBERFLD:
            nFormat = (USHORT)(ULONG)aFormatLB.GetEntryData(
                                aFormatLB.GetSelectEntryPos() );
            break;
        }


#ifdef REPLACE_OFADBMGR
        String sTempDBName, sTempTableName, sTempColumnName;
        sTempDBName = aDatabaseTLB.GetDBName(sTempTableName, sTempColumnName);
        BOOL bDBListBoxChanged = sOldDBName != sTempDBName ||
            sOldTableName != sTempTableName || sOldColumnName != sTempColumnName;
#else
        BOOL bDBListBoxChanged = sOldDBName != aDatabaseTLB.GetDBName();
#endif
        if (!IsFldEdit() ||
            aConditionED.GetSavedValue() != aConditionED.GetText() ||
             aValueED.GetSavedValue() != aValueED.GetText() ||
             bDBListBoxChanged ||
             nOldFormat != nFormat || nOldSubType != nSubType)
        {
            InsertFld( nTypeId, nSubType, aName, aVal, nFormat);
        }
    }

    return FALSE;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SfxTabPage* __EXPORT SwFldDBPage::Create(   Window* pParent,
                        const SfxItemSet& rAttrSet )
{
    return ( new SwFldDBPage( pParent, rAttrSet ) );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

USHORT SwFldDBPage::GetGroup()
{
    return GRP_DB;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwFldDBPage, TypeHdl, ListBox *, pBox )
{
    // Alte ListBoxPos sichern
    const USHORT nOld = GetTypeSel();

    // Aktuelle ListBoxPos
    SetTypeSel(aTypeLB.GetSelectEntryPos());

    if(GetTypeSel() == LISTBOX_ENTRY_NOTFOUND)
    {
        SetTypeSel(0);
        aTypeLB.SelectEntryPos(0);
    }

    if (nOld != GetTypeSel())
    {
        SwWrtShell *pSh = ::GetActiveView()->GetWrtShellPtr();
        BOOL bCond = FALSE, bSetNo = FALSE, bFormat = FALSE, bDBFormat = FALSE;
        USHORT nTypeId = (USHORT)(ULONG)aTypeLB.GetEntryData(GetTypeSel());

        aDatabaseTLB.ShowColumns(nTypeId == TYP_DBFLD);

        if (IsFldEdit())
        {
#ifdef REPLACE_OFADBMGR
            String sDBName, sTableName, sColumnName;
            if (nTypeId == TYP_DBFLD)
            {
                sDBName = ((SwDBField*)GetCurField())->GetDBName();
                sColumnName = ((SwDBFieldType*)GetCurField()->GetTyp())->GetColumnName();
            }
            else
            {
                sDBName = ((SwDBNameInfField*)GetCurField())->GetDBName(pSh->GetDoc());
            }
            sTableName = sDBName.GetToken(1, DB_DELIM);
            sDBName = sDBName.GetToken(0, DB_DELIM);

            aDatabaseTLB.Select(sDBName, sTableName, sColumnName);
#else
            String sDBName;
            if (nTypeId == TYP_DBFLD)
            {
                sDBName = ((SwDBField*)GetCurField())->GetDBName();
                sDBName += DB_DELIM;
                sDBName += ((SwDBFieldType*)GetCurField()->GetTyp())->GetColumnName();
            }
            else
                sDBName = ((SwDBNameInfField*)GetCurField())->GetDBName(pSh->GetDoc());

            aDatabaseTLB.Select(sDBName);
#endif
        }

        switch (nTypeId)
        {
            case TYP_DBFLD:
                bFormat = TRUE;
                bDBFormat = TRUE;
                aNumFormatLB.Show();
                aFormatLB.Hide();

                if (pBox)   // Typ wurde vom User geaendert
                    aDBFormatRB.Check();

                if (IsFldEdit())
                {
                    if (GetCurField()->GetFormat() != 0 && GetCurField()->GetFormat() != ULONG_MAX)
                        aNumFormatLB.SetDefFormat(GetCurField()->GetFormat());

                    if (GetCurField()->GetSubType() & SUB_OWN_FMT)
                        aNewFormatRB.Check();
                    else
                        aDBFormatRB.Check();
                }
                break;

            case TYP_DBNUMSETFLD:
                bSetNo = TRUE;
                // kein break!
            case TYP_DBNEXTSETFLD:
                bCond = TRUE;
                if (IsFldEdit())
                {
                    aConditionED.SetText(GetCurField()->GetPar1());
                    aValueED.SetText(GetCurField()->GetPar2());
                }
                break;

            case TYP_DBNAMEFLD:
                break;

            case TYP_DBSETNUMBERFLD:
                bFormat = TRUE;
                aNewFormatRB.Check();
                aNumFormatLB.Hide();
                aFormatLB.Show();
                if( IsFldEdit() )
                {
                    for( USHORT nI = aFormatLB.GetEntryCount(); nI; )
                        if( GetCurField()->GetFormat() == (USHORT)(ULONG)
                            aFormatLB.GetEntryData( --nI ))
                        {
                            aFormatLB.SelectEntryPos( nI );
                            break;
                        }
                }
                break;
        }

        aConditionFT.Enable(bCond);
        aConditionED.Enable(bCond);
        aValueFT.Enable(bSetNo);
        aValueED.Enable(bSetNo);
        if (nTypeId != TYP_DBFLD)
        {
            aDBFormatRB.Enable(bDBFormat);
            aNewFormatRB.Enable(bDBFormat|bFormat);
            aNumFormatLB.Enable(bDBFormat);
            aFormatLB.Enable(bFormat);
        }
        aFormatGB.Enable(bDBFormat|bFormat);

        if (!IsFldEdit())
        {
            aValueED.SetText(aEmptyStr);
            if (bCond)
                aConditionED.SetText( String::CreateFromAscii(
                        RTL_CONSTASCII_STRINGPARAM( "TRUE" )));
            else
                aConditionED.SetText(aEmptyStr);
        }

        CheckInsert();
    }

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwFldDBPage, NumSelectHdl, NumFormatListBox *, pLB )
{
    aNewFormatRB.Check();
    aOldNumSelectHdl.Call(pLB);

    return 0;
}

/*---------------------------------------------------------------------
    Beschreibung:
---------------------------------------------------------------------*/

void SwFldDBPage::CheckInsert()
{
    BOOL bInsert = TRUE;
    USHORT nTypeId = (USHORT)(ULONG)aTypeLB.GetEntryData(GetTypeSel());

    SvLBoxEntry* pEntry = aDatabaseTLB.GetCurEntry();

    if (pEntry)
    {
        pEntry = aDatabaseTLB.GetParent(pEntry);

        if (nTypeId == TYP_DBFLD && pEntry)
            pEntry = aDatabaseTLB.GetParent(pEntry);

        bInsert &= pEntry != 0;
    }
    else
        bInsert = FALSE;

    if (nTypeId == TYP_DBNUMSETFLD)
    {
        BOOL bHasValue = aValueED.GetText().Len() != 0;

        bInsert &= bHasValue;
    }

    EnableInsert(bInsert);
}

/*---------------------------------------------------------------------
    Beschreibung:
---------------------------------------------------------------------*/

IMPL_LINK( SwFldDBPage, TreeSelectHdl, SvTreeListBox *, pBox )
{
    SvLBoxEntry* pColEntry;
    SvLBoxEntry* pEntry = pColEntry = pBox->GetCurEntry();
    if (pEntry)
    {
        USHORT nTypeId = (USHORT)(ULONG)aTypeLB.GetEntryData(GetTypeSel());

        pEntry = aDatabaseTLB.GetParent(pEntry);

        if (nTypeId == TYP_DBFLD && pEntry)
            pEntry = aDatabaseTLB.GetParent(pEntry);

        CheckInsert();

        if (nTypeId == TYP_DBFLD)
        {
            BOOL bNumFormat = FALSE;

            if (pEntry != 0)
            {
#ifdef REPLACE_OFADBMGR
                String sTableName;
                String sColumnName;
                BOOL bIsTable;
                String sDBName = aDatabaseTLB.GetDBName(sTableName, sColumnName, &bIsTable);
                bNumFormat = GetFldMgr().IsDBNumeric(sDBName,
                            sTableName,
                            bIsTable,
                            sColumnName);
#else
                String sName(aDatabaseTLB.GetDBName());
                String sColumnName(sName.GetToken(2, DB_DELIM));
                String sDBName(sName.GetToken(0, DB_DELIM));
                sDBName += DB_DELIM;
                sDBName += sName.GetToken(1, DB_DELIM);
                bNumFormat = GetFldMgr().IsDBNumeric(sDBName, sColumnName);
#endif
                if (!IsFldEdit())
                    aDBFormatRB.Check();
            }

            aDBFormatRB.Enable(bNumFormat);
            aNewFormatRB.Enable(bNumFormat);
            aNumFormatLB.Enable(bNumFormat);
            aFormatGB.Enable(bNumFormat);
        }
    }
    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung: Modify
 --------------------------------------------------------------------*/

IMPL_LINK( SwFldDBPage, ModifyHdl, Edit *, EMPTYARG )
{
    CheckInsert();
    return 0;
}

/* -----------------12.01.99 11:21-------------------
 *
 * --------------------------------------------------*/
void    SwFldDBPage::FillUserData()
{
    String sData( String::CreateFromAscii(
                        RTL_CONSTASCII_STRINGPARAM( USER_DATA_VERSION )));
    sData += ';';
    USHORT nTypeSel = aTypeLB.GetSelectEntryPos();

    if( LISTBOX_ENTRY_NOTFOUND == nTypeSel )
        nTypeSel = USHRT_MAX;
    else
        nTypeSel = (ULONG)aTypeLB.GetEntryData( nTypeSel );
    sData += String::CreateFromInt32( nTypeSel );
    SetUserData(sData);
}
/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.31  2000/09/18 16:05:28  willem.vandorp
    OpenOffice header added.

    Revision 1.30  2000/07/07 15:25:43  os
    replace ofadbmgr

    Revision 1.29  2000/06/30 08:52:52  os
    #76541# string assertions removed

    Revision 1.28  2000/06/26 13:35:59  os
    new DataBase API

    Revision 1.27  2000/05/23 18:36:33  jp
    Bugfixes for Unicode

    Revision 1.26  2000/04/18 15:17:31  os
    UNICODE

    Revision 1.25  1999/02/25 16:24:50  JP
    Bug #62438#: UserData nur auswerten, wenn kein Refresh ist


      Rev 1.24   25 Feb 1999 17:24:50   JP
   Bug #62438#: UserData nur auswerten, wenn kein Refresh ist

      Rev 1.23   21 Jan 1999 09:50:36   OS
   #59900# Fussnoten im Dialog korrekt sortieren; keine prot. Member

      Rev 1.22   12 Jan 1999 11:42:26   OS
   #60579# ausgewaehlten Typ in den UserData speichern

      Rev 1.21   11 Dec 1998 15:16:24   OM
   #60051# Richtiges Format fuer Serienbrieffelder waehlen

      Rev 1.20   17 Nov 1998 10:50:38   OS
   #58263# NumType durch SvxExtNumType ersetzt

      Rev 1.19   04 Nov 1998 13:27:56   OM
   #58939# Bei Formataenderung RadioButton vorselektieren

      Rev 1.18   10 Aug 1998 16:39:58   JP
   Bug #54796#: neue NumerierungsTypen (WW97 kompatibel)

      Rev 1.17   09 Jul 1998 09:52:58   JP
   EmptyStr benutzen

      Rev 1.16   10 Jun 1998 13:26:08   OM
   Alten Typ nach Reset restaurieren

      Rev 1.15   27 Mar 1998 15:23:54   OM
   #48909# Insert-Btn korrekt enablen/disablen

      Rev 1.14   06 Mar 1998 13:07:48   OM
   Nur bei Aenderung Feld aktualisieren

      Rev 1.13   04 Mar 1998 08:32:24   MH
   chg: Syntax

      Rev 1.12   16 Feb 1998 09:39:00   OM
   Fuer Solaris nicht direkt von void* auf ushort casten

      Rev 1.11   06 Jan 1998 18:12:54   OM
   Felbefehl-Dlg

      Rev 1.10   05 Jan 1998 17:44:34   OM
   DB-Feldbefehl bearbeiten

      Rev 1.9   12 Dec 1997 17:14:00   OM
   Listbox bei numerischen Formaten enablen

      Rev 1.8   11 Dec 1997 16:58:00   OM
   Feldumstellung

      Rev 1.7   20 Nov 1997 17:01:20   OM
   Neuer Felddialog

      Rev 1.6   19 Nov 1997 16:30:42   OM
   Datenbank-TP Drag&Drop

      Rev 1.5   18 Nov 1997 10:34:36   OM
   Neuer Feldbefehldialog

      Rev 1.4   17 Nov 1997 09:06:36   OM
   Basisklasse fuer Feldbefehl-TPs

      Rev 1.3   05 Nov 1997 17:02:46   OM
   Spaltennamen anzeigen

      Rev 1.2   05 Nov 1997 15:35:38   OM
   Neuer Feldbefehldialog

      Rev 1.1   30 Oct 1997 14:31:42   OM
   Feldbefehl-Umstellung

      Rev 1.0   28 Oct 1997 15:05:06   OM
   Initial revision.

------------------------------------------------------------------------*/

diff --git a/sw/source/ui/fldui/flddb.hxx b/sw/source/ui/fldui/flddb.hxx
new file mode 100644
index 0000000..5dc89b9
--- /dev/null
+++ b/sw/source/ui/fldui/flddb.hxx
@@ -0,0 +1,137 @@
/*************************************************************************
 *
 *  $RCSfile: flddb.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:36 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWFLDDB_HXX
#define _SWFLDDB_HXX

#ifndef _SV_FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif
#ifndef _SV_LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif
#ifndef _SV_BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif
#ifndef _SV_GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif

#include "condedit.hxx"
#include "dbtree.hxx"
#include "numfmtlb.hxx"

#include "fldpage.hxx"

/*--------------------------------------------------------------------
   Beschreibung:
 --------------------------------------------------------------------*/

class SwFldDBPage : public SwFldPage
{
    FixedText           aTypeFT;
    ListBox             aTypeLB;
    FixedText           aSelectionFT;
    SwDBTreeList        aDatabaseTLB;
    FixedText           aConditionFT;
    ConditionEdit       aConditionED;
    FixedText           aValueFT;
    Edit                aValueED;
    RadioButton         aDBFormatRB;
    RadioButton         aNewFormatRB;
    NumFormatListBox    aNumFormatLB;
    ListBox             aFormatLB;
    GroupBox            aFormatGB;

    String              sOldDBName;
#ifdef REPLACE_OFADBMGR
    String              sOldTableName;
    String              sOldColumnName;
#endif
    ULONG               nOldFormat;
    USHORT              nOldSubType;
    Link                aOldNumSelectHdl;

    DECL_LINK( TypeHdl, ListBox* );
    DECL_LINK( NumSelectHdl, NumFormatListBox* pLB = 0);
    DECL_LINK( TreeSelectHdl, SvTreeListBox* pBox );
    DECL_LINK( ModifyHdl, Edit *pED = 0 );

    void                CheckInsert();

protected:
    virtual USHORT      GetGroup();

public:
                        SwFldDBPage(Window* pParent, const SfxItemSet& rSet);

                        ~SwFldDBPage();

    static SfxTabPage*  Create(Window* pParent, const SfxItemSet& rAttrSet);

    virtual BOOL        FillItemSet( SfxItemSet& rSet );
    virtual void        Reset( const SfxItemSet& rSet );

    virtual void        FillUserData();
};


#endif

diff --git a/sw/source/ui/fldui/flddb.src b/sw/source/ui/fldui/flddb.src
new file mode 100644
index 0000000..2dc7bc3
--- /dev/null
+++ b/sw/source/ui/fldui/flddb.src
@@ -0,0 +1,337 @@
/*************************************************************************
 *
 *  $RCSfile: flddb.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:36 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "globals.hrc"
#include "fldtdlg.hrc"
#include "helpid.h"
TabPage TP_FLD_DB
{
    HelpID = HID_FLD_DB ;
    SVLook = TRUE ;
    Hide = TRUE ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Text = "Datenbank" ;
    Text [ ENGLISH ] = "Database" ;
    FixedText FT_DBTYPE
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 76 , 10 ) ;
        Text = "~Feldtyp" ;
        Text [ ENGLISH ] = "Type" ;
        Text [ norwegian ] = "Type" ;
        Text [ italian ] = "~Tipo di campo" ;
        Text [ portuguese_brazilian ] = "Tipo" ;
        Text [ portuguese ] = "Tipo de ~campo" ;
        Text [ finnish ] = "Laji" ;
        Text [ danish ] = "Felttype" ;
        Text [ french ] = "~Type de champ" ;
        Text [ swedish ] = "~Fälttyp" ;
        Text [ dutch ] = "~Veldtype" ;
        Text [ spanish ] = "~Tipo de campo" ;
        Text [ english_us ] = "~Type" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "×Ö¶ÎÀàÐÍ(~T)";
        Text[ russian ] = "Òèï ïîëÿ";
        Text[ polish ] = "Typ pola";
        Text[ japanese ] = "̨°ÙÄނ̎í—Þ(~T)";
        Text[ chinese_traditional ] = "Ãþ«¬(~T)";
        Text[ arabic ] = "äæÚ ÇáÍÞá";
        Text[ greek ] = "~Ôýðïò ðåäßïõ";
        Text[ korean ] = "ÇüÅÂ(~T)";
        Text[ turkish ] = "Alan tipi";
    };
    ListBox LB_DBTYPE
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 6 , 16 ) ;
        Size = MAP_APPFONT ( 76 , 54 ) ;
        TabStop = TRUE ;
        Sort = TRUE ;
        AutoHScroll = TRUE ;
        /*        StringList =
        {
            < "Beliebiger Datensatz" ; > ;
            < "Datensatznummer" ; > ;
            < "Nächster Datensatz" ; > ;
            < "Serienbrieffeld" ; > ;
            < "Datenbankname" ; > ;
        };*/
    };
    FixedText FT_DBCONDITION
    {
        Pos = MAP_APPFONT ( 6 , 76 ) ;
        Size = MAP_APPFONT ( 76 , 10 ) ;
        TEXT = "Bedin~gung" ;
        TEXT [ English ] = "Conditio~n" ;
        TEXT [ norwegian ] = "Vilkår" ;
        TEXT [ italian ] = "Con~dizione" ;
        TEXT [ portuguese_brazilian ] = "condição" ;
        TEXT [ portuguese ] = "~Condição" ;
        TEXT [ finnish ] = "Ehto" ;
        TEXT [ danish ] = "Betingelse" ;
        TEXT [ french ] = "~Si" ;
        TEXT [ swedish ] = "~Villkor" ;
        TEXT [ dutch ] = "~Voorwaarde" ;
        TEXT [ spanish ] = "Con~dición" ;
        TEXT [ english_us ] = "~Condition" ;
        Left = TRUE ;
        TEXT[ chinese_simplified ] = "Ìõ¼þ(~C)";
        TEXT[ russian ] = "Óñëîâèå";
        TEXT[ polish ] = "Warunek";
        TEXT[ japanese ] = "ðŒ(~C)";
        TEXT[ chinese_traditional ] = "±ø¥ó(~C)";
        TEXT[ arabic ] = "ÇáÔÑØ";
        TEXT[ greek ] = "¼ñïò";
        TEXT[ korean ] = "Á¶°Ç(~C)";
        TEXT[ turkish ] = "Koþul";
    };
    Edit ED_DBCONDITION
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 6 , 88 ) ;
        Size = MAP_APPFONT ( 76 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
    };
    FixedText FT_DBSETNUMBER
    {
        Pos = MAP_APPFONT ( 6 , 105 ) ;
        Size = MAP_APPFONT ( 76 , 10 ) ;
        TEXT = "Sat~znummer" ;
        TEXT [ English ] = "Setnumber" ;
        TEXT [ norwegian ] = "Setnumber" ;
        TEXT [ italian ] = "Numero di record" ;
        TEXT [ portuguese_brazilian ] = "Definir número" ;
        TEXT [ portuguese ] = "~Número de registo" ;
        TEXT [ finnish ] = "Joukon numero" ;
        TEXT [ danish ] = "Datapostnummer" ;
        TEXT [ french ] = "~Numéro de l'enregistrement" ;
        TEXT [ swedish ] = "Datapostnummer" ;
        TEXT [ dutch ] = "~Record-nummer" ;
        TEXT [ spanish ] = "Número de registro" ;
        TEXT [ english_us ] = "Record number" ;
        Left = TRUE ;
        TEXT[ chinese_simplified ] = "ÌõÄ¿±àºÅ";
        TEXT[ russian ] = "Íîìåð ïðåäëîæåíèÿ";
        TEXT[ polish ] = "Numer zdania";
        TEXT[ japanese ] = "Úº°Äޔԍ†";
        TEXT[ chinese_traditional ] = "¶µ¥Ø¸¹½X";
        TEXT[ arabic ] = "ÑÞã ÇáÓÌá";
        TEXT[ greek ] = "Áñéèìüò åããñáöÞò";
        TEXT[ korean ] = "·¹ÄÚµå ¹øÈ£";
        TEXT[ turkish ] = "Veri kümesi numarasý";
    };
    Edit ED_DBSETNUMBER
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 6 , 117 ) ;
        Size = MAP_APPFONT ( 76 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
    };
    FixedText FT_DBSELECTION
    {
        Pos = MAP_APPFONT ( 88 , 3 ) ;
        Size = MAP_APPFONT ( 166 , 10 ) ;
        Text = "Datenbank~auswahl" ;
        Text [ ENGLISH ] = "Database s~election" ;
        Left = TRUE ;
        Text [ english_us ] = "Database s~election" ;
        Text [ portuguese_brazilian ] = "Datenbank~auswahl" ;
        Text [ swedish ] = "Datab~asurval" ;
        Text [ danish ] = "Databaseudvalg" ;
        Text [ italian ] = "Scelta ~database" ;
        Text [ spanish ] = "~Seleccionar base de datos" ;
        Text [ french ] = "~Sélection d'une base de données" ;
        Text [ dutch ] = "Selectie ~database" ;
        Text [ portuguese ] = "~Seleccionar base de dados" ;
        Text[ chinese_simplified ] = "Ñ¡ÔñÊý¾Ý¿â(~E)";
        Text[ russian ] = "Âûáîð áàçû äàííûõ";
        Text[ polish ] = "Wybór bazy danych";
        Text[ japanese ] = "ÃÞ°ÀÍÞ°½‚Ì‘I‘ð(~E)";
        Text[ chinese_traditional ] = "¿ï¾Ü¸ê®Æ®w(~E)";
        Text[ arabic ] = "ÇÎÊíÇÑ ÞÇÚÏÉ ÇáÈíÇäÇÊ";
        Text[ greek ] = "ÅðéëïãÞ âÜóçò äåäïìÝíùí";
        Text[ korean ] = "µ¥ÀÌÅͺ£À̽º ¼±ÅÃ(~E)";
        Text[ turkish ] = "Veritabaný seçimi";
    };
    Control TLB_DBLIST
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 88 , 16 ) ;
        Size = MAP_APPFONT ( 166 , 72 ) ;
        TabStop = TRUE ;
    };
    RadioButton RB_DBOWNFORMAT
    {
        Pos = MAP_APPFONT ( 94 , 103 ) ;
        Size = MAP_APPFONT ( 60 , 10 ) ;
        Text = "A~us Datenbank" ;
        Text [ ENGLISH ] = "From database" ;
        Check = TRUE ;
        Text [ english_us ] = "From database" ;
        Text [ portuguese_brazilian ] = "Aus Datenbank" ;
        Text [ swedish ] = "Från databas" ;
        Text [ danish ] = "Fra database" ;
        Text [ italian ] = "Dal database" ;
        Text [ spanish ] = "De la base de datos" ;
        Text [ french ] = "~De la B.D." ;
        Text [ dutch ] = "~Uit database" ;
        Text [ portuguese ] = "~Da base de dados" ;
        Text[ chinese_simplified ] = "´ÓÊý¾Ý¿â";
        Text[ russian ] = "èç áàçû äàííûõ";
        Text[ polish ] = "Z bazy danych";
        Text[ japanese ] = "ÃÞ°ÀÍÞ°½‚©‚ç";
        Text[ chinese_traditional ] = "±q¸ê®Æ®w";
        Text[ arabic ] = "ãä ÞÇÚÏÉ ÇáÈíÇäÇÊ";
        Text[ greek ] = "Áðü âÜóç äåäïìÝíùí";
        Text[ korean ] = "µ¥ÀÌÅͺ£À̽º·Î ºÎÅÍ";
        Text[ turkish ] = "Kaynak veritabaný";
    };
    RadioButton RB_DBFORMAT
    {
        Pos = MAP_APPFONT ( 94 , 115 ) ;
        Size = MAP_APPFONT ( 60 , 10 ) ;
        Text = "Se~lbst definiert" ;
        Text [ ENGLISH ] = "User defined" ;
        Text [ english_us ] = "User-defined" ;
        Text [ portuguese_brazilian ] = "Selbstdefiniert" ;
        Text [ swedish ] = "Användardefinierat" ;
        Text [ danish ] = "Brugerdefineret" ;
        Text [ italian ] = "Personalizzato" ;
        Text [ spanish ] = "Definido por el usuario" ;
        Text [ french ] = "Dé~fini par l'utilisateur" ;
        Text [ dutch ] = "~Zelf gedefinieerd" ;
        Text [ portuguese ] = "D~efinido pelo utilizador" ;
        Text[ chinese_simplified ] = "Óû§×Ô¶¨";
        Text[ russian ] = "ïîëüçîâàòåëÿ";
        Text[ polish ] = "Zdefiniowane przez u¿ytkownika";
        Text[ japanese ] = "Õ°»Þ°’è‹`";
        Text[ chinese_traditional ] = "¦Û­q";
        Text[ arabic ] = "ãõÚÑÝ ãä ÞÈá ÇáãÓÊÎÏã";
        Text[ greek ] = "ÐñïóáñìïóìÝíï";
        Text[ korean ] = "»ç¿ëÀÚ Á¤ÀÇ";
        Text[ turkish ] = "Kullanýcý tanýmlý";
    };
    ListBox LB_DBNUMFORMAT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 160 , 113 ) ;
        Size = MAP_APPFONT ( 88 , 60 ) ;
        TabStop = TRUE ;
        AutoHScroll = TRUE ;
        DropDown = TRUE ;
    };
    ListBox LB_DBFORMAT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 160 , 113 ) ;
        Size = MAP_APPFONT ( 88 , 60 ) ;
        TabStop = TRUE ;
        AutoHScroll = TRUE ;
        DropDown = TRUE ;
        Sort = FALSE ;
        Hide = TRUE ;
    };
    GroupBox GB_DBFORMAT
    {
        Pos = MAP_APPFONT ( 88 , 91 ) ;
        Size = MAP_APPFONT ( 166 , 38 ) ;
        TEXT = "Format" ;
        TEXT [ English ] = "Format" ;
        Text [ english_us ] = "Format" ;
        Text [ portuguese_brazilian ] = "Format" ;
        Text [ swedish ] = "Format" ;
        Text [ danish ] = "Format" ;
        Text [ italian ] = "Formato" ;
        Text [ spanish ] = "Formato" ;
        Text [ french ] = "Format" ;
        Text [ dutch ] = "Formaat" ;
        Text [ portuguese ] = "Formato" ;
        Text[ chinese_simplified ] = "¸ñʽ";
        Text[ russian ] = "Ôîðìàò";
        Text[ polish ] = "Format";
        Text[ japanese ] = "‘Ž®";
        Text[ chinese_traditional ] = "®æ¦¡";
        Text[ arabic ] = "ÇáÊäÓíÞ";
        Text[ greek ] = "ÌïñöÞ";
        Text[ korean ] = "¼­½Ä";
        Text[ turkish ] = "Format";
    };
    Text [ english_us ] = "Database" ;
    Text [ portuguese_brazilian ] = "Datenbank" ;
    Text [ swedish ] = "Databas" ;
    Text [ danish ] = "Database" ;
    Text [ italian ] = "Database" ;
    Text [ spanish ] = "Base de datos" ;
    Text [ french ] = "Base de données" ;
    Text [ dutch ] = "Database" ;
    Text [ portuguese ] = "Base de dados" ;
    Text[ chinese_simplified ] = "Êý¾Ý¿â";
    Text[ russian ] = "Áàçà äàííûõ";
    Text[ polish ] = "Baza danych";
    Text[ japanese ] = "ÃÞ°ÀÍÞ°½";
    Text[ chinese_traditional ] = "¸ê®Æ®w";
    Text[ arabic ] = "ÞÇÚÏÉ ÈíÇäÇÊ";
    Text[ greek ] = "ÂÜóç äåäïìÝíùí";
    Text[ korean ] = "µ¥ÀÌÅͺ£À̽º";
    Text[ turkish ] = "Veritabaný";
};
diff --git a/sw/source/ui/fldui/flddinf.cxx b/sw/source/ui/fldui/flddinf.cxx
new file mode 100644
index 0000000..9ba5922
--- /dev/null
+++ b/sw/source/ui/fldui/flddinf.cxx
@@ -0,0 +1,571 @@
/*************************************************************************
 *
 *  $RCSfile: flddinf.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:36 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SV_SVAPP_HXX //autogen
#include <vcl/svapp.hxx>
#endif

#ifndef _ZFORLIST_HXX //autogen
#include <svtools/zforlist.hxx>
#endif

#ifndef _HELPID_H
#include <helpid.h>
#endif
#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif
#ifndef _FLDBAS_HXX
#include <fldbas.hxx>
#endif
#ifndef _DOCUFLD_HXX
#include <docufld.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif

#ifndef _FLDTDLG_HRC
#include <fldtdlg.hrc>
#endif
#ifndef _FLDDINF_HXX
#include <flddinf.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif

#define USER_DATA_VERSION_1 "1"
#define USER_DATA_VERSION USER_DATA_VERSION_1
/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SwFldDokInfPage::SwFldDokInfPage(Window* pWindow, const SfxItemSet& rCoreSet ) :
    SwFldPage( pWindow, SW_RES( TP_FLD_DOKINF ), rCoreSet ),

    aTypeFT     (this, SW_RES(FT_DOKINFTYPE)),
    aTypeTLB    (this, SW_RES(TLB_DOKINFTYPE)),
    aSelectionFT(this, SW_RES(FT_DOKINFSELECTION)),
    aSelectionLB(this, SW_RES(LB_DOKINFSELECTION)),
    aFormatFT   (this, SW_RES(FT_DOKINFFORMAT)),
    aFormatLB   (this, SW_RES(LB_DOKINFFORMAT)),
    aFixedCB    (this, SW_RES(CB_DOKINFFIXEDCONTENT)),

    aRootOpened (SW_RES(BMP_DOKINFROOT_OPENED)),
    aRootClosed (SW_RES(BMP_DOKINFROOT_CLOSED)),
    aInfoStr    (SW_RES(STR_DOKINF_INFO)),
    pSelEntry   (0)
{
    FreeResource();

    aTypeTLB.SetHelpId(HID_FIELD_DINF_TYPE);
    aTypeTLB.SetSelectionMode(SINGLE_SELECTION);
    aTypeTLB.SetWindowBits(WB_HASLINES|WB_CLIPCHILDREN|WB_SORT|WB_HASBUTTONS|WB_HASBUTTONSATROOT|WB_HSCROLL);
    // Font nicht setzen, damit der Font des Controls uebernommen wird!
    // Sonst bei falschem Font Bug an OV.
    aTypeTLB.SetSpaceBetweenEntries(0);

    aTypeTLB.SetNodeBitmaps( aRootOpened, aRootClosed );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

__EXPORT SwFldDokInfPage::~SwFldDokInfPage()
{
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void __EXPORT SwFldDokInfPage::Reset(const SfxItemSet& rSet)
{
    Init(); // Allgemeine initialisierung

    // TypeListBox initialisieren
    aTypeTLB.SetUpdateMode(FALSE);
    aTypeTLB.Clear();
    pSelEntry = 0;

    // SubTypes in der TypeLB anzeigen
    USHORT nTypeId = TYP_DOCINFOFLD;
    SvLBoxEntry* pEntry = 0;

    SvLBoxEntry* pInfo = 0;

    USHORT nSubType = USHRT_MAX;

    if (IsFldEdit())
        nSubType = ((SwDocInfoField*)GetCurField())->GetSubType() & 0xff;

    USHORT nSelEntryData = USHRT_MAX;
    String sUserData = GetUserData();
    if(sUserData.GetToken(0, ';').EqualsIgnoreCaseAscii(USER_DATA_VERSION_1))
    {
        String sVal = sUserData.GetToken(1, ';');
        nSelEntryData = sVal.ToInt32();
    }

    SvStringsDtor& rLst = GetFldMgr().GetSubTypes(nTypeId);
    for (USHORT i = 0; i < rLst.Count(); ++i)
    {
        if (!IsFldEdit() || nSubType == i)
        {
            if (i >= DI_INFO1 && i <= DI_INFO4)
            {
                if (!pInfo && !IsFldEdit())
                {
                    pInfo = aTypeTLB.InsertEntry(aInfoStr);
                    pInfo->SetUserData((void*)USHRT_MAX);
                }
                pEntry = aTypeTLB.InsertEntry(*rLst[i], pInfo);
                pEntry->SetUserData((void*)i);
            }
            else
            {
                if (!(IsFldDlgHtmlMode() && (i == DI_EDIT || i == DI_THEMA || i == DI_PRINT)))
                {
                    pEntry = aTypeTLB.InsertEntry(*rLst[i]);
                    pEntry->SetUserData((void*)i);
                }
            }
            if(nSelEntryData == i)
                pSelEntry = pEntry;
        }
    }

    // alte Pos selektieren
    if (pSelEntry != 0)
    {
        aTypeTLB.Select(pSelEntry);
        nSubType = (USHORT)(ULONG)pSelEntry->GetUserData();
    }
    else
    {
        pSelEntry = aTypeTLB.GetEntry(0);
        nSubType = (USHORT)(ULONG)pSelEntry->GetUserData();
    }

    FillSelectionLB(nSubType);
    TypeHdl();

    aTypeTLB.SetUpdateMode(TRUE);
    aTypeTLB.SetSelectHdl(LINK(this, SwFldDokInfPage, TypeHdl));
    aTypeTLB.SetDoubleClickHdl(LINK(this, SwFldDokInfPage, InsertHdl));
    aSelectionLB.SetSelectHdl(LINK(this, SwFldDokInfPage, SubTypeHdl));
    aSelectionLB.SetDoubleClickHdl(LINK(this, SwFldDokInfPage, InsertHdl));
    aFormatLB.SetDoubleClickHdl(LINK(this, SwFldDokInfPage, InsertHdl));

    if (IsFldEdit())
    {
        nOldSel = aSelectionLB.GetSelectEntryPos();
        nOldFormat = GetCurField()->GetFormat();
        aFixedCB.SaveValue();
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwFldDokInfPage, TypeHdl, ListBox *, EMPTYARG )
{
    // Alte ListBoxPos sichern
    SvLBoxEntry* pOldEntry = pSelEntry;

    // Aktuelle ListBoxPos
    pSelEntry = aTypeTLB.FirstSelected();

    if(!pSelEntry)
    {
        pSelEntry = aTypeTLB.GetEntry(0);
        aTypeTLB.Select(pSelEntry);
    }
    else

    if (pOldEntry != pSelEntry)
        FillSelectionLB((USHORT)(ULONG)pSelEntry->GetUserData());

    SubTypeHdl();

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwFldDokInfPage, SubTypeHdl, ListBox *, pBox )
{
    USHORT nSubType = (USHORT)(ULONG)pSelEntry->GetUserData();
    USHORT nPos = aSelectionLB.GetSelectEntryPos();
    USHORT nExtSubType;

    if (nSubType != DI_EDIT)
    {
        if (nPos == LISTBOX_ENTRY_NOTFOUND)
        {
            if (!aSelectionLB.GetEntryCount())
            {
                aFormatLB.Clear();
                aFormatLB.Enable(FALSE);
                aFormatFT.Enable(FALSE);
                return 0;
            }
            nPos = 0;
        }

        nExtSubType = (USHORT)(ULONG)aSelectionLB.GetEntryData(nPos);
    }
    else
        nExtSubType = DI_SUB_TIME;

    USHORT nOldType = 0;
    USHORT nNewType = 0;
    BOOL bEnable = FALSE;
    BOOL bOneArea = FALSE;

    if (aFormatLB.IsEnabled())
        nOldType = aFormatLB.GetFormatType();

    switch (nExtSubType)
    {
        case DI_SUB_AUTHOR:
            break;

        case DI_SUB_DATE:
            nNewType = NUMBERFORMAT_DATE;
            bOneArea = TRUE;
            break;

        case DI_SUB_TIME:
            nNewType = NUMBERFORMAT_TIME;
            bOneArea = TRUE;
            break;
    }

    if (!nNewType)
    {
        aFormatLB.Clear();
    }
    else
    {
        if (nOldType != nNewType)
        {
            aFormatLB.SetFormatType(nNewType);
            aFormatLB.SetOneArea(bOneArea);
        }
        bEnable = TRUE;
    }

    ULONG nFormat = IsFldEdit() ? ((SwDocInfoField*)GetCurField())->GetFormat() : 0;

    USHORT nOldSubType = IsFldEdit() ? (((SwDocInfoField*)GetCurField())->GetSubType() & 0xff00) : 0;

    if (IsFldEdit())
    {
        USHORT nPos = aSelectionLB.GetSelectEntryPos();
        if (nPos != LISTBOX_ENTRY_NOTFOUND)
        {
            nSubType = (USHORT)(ULONG)aSelectionLB.GetEntryData(nPos);

            nOldSubType &= ~DI_SUB_FIXED;
            if (nOldSubType == nSubType)
            {
                if (!nFormat && (nNewType == NUMBERFORMAT_DATE || nNewType == NUMBERFORMAT_TIME))
                {
                    SwWrtShell &rSh = ::GetActiveView()->GetWrtShell();
                    SvNumberFormatter* pFormatter = rSh.GetNumberFormatter();
                    LanguageType eLang = aFormatLB.GetCurLanguage();

                    if (nNewType == NUMBERFORMAT_DATE)
                        nFormat = pFormatter->GetFormatIndex( NF_DATE_SYSTEM_SHORT, eLang);
                    else if (nNewType == NUMBERFORMAT_TIME)
                        nFormat = pFormatter->GetFormatIndex( NF_TIME_HHMM, eLang);
                }
                aFormatLB.SetDefFormat(nFormat);
            }
        }
    }

    aFormatLB.Enable(bEnable);
    aFormatFT.Enable(bEnable);

    if (bEnable && aFormatLB.GetSelectEntryPos() == LISTBOX_ENTRY_NOTFOUND)
    {
        aFormatLB.SelectEntryPos(0);
    }

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

USHORT SwFldDokInfPage::FillSelectionLB(USHORT nSubType)
{
    // Format-Listbox fuellen
    USHORT nTypeId = TYP_DOCINFOFLD;

    EnableInsert(nSubType != USHRT_MAX);

    if (nSubType == USHRT_MAX)  // Info-Text
        nSubType = DI_INFO1;

    aSelectionLB.Clear();

    USHORT nSize = 0;
    USHORT nSelPos = USHRT_MAX;
    USHORT nExtSubType = IsFldEdit() ? (((SwDocInfoField*)GetCurField())->GetSubType() & 0xff00) : 0;

    if (IsFldEdit())
    {
        aFixedCB.Check((nExtSubType & DI_SUB_FIXED) != 0);
        nExtSubType = ((nExtSubType & ~DI_SUB_FIXED) >> 8) - 1;
    }

    if (nSubType < DI_CREATE || nSubType == DI_DOCNO || nSubType == DI_EDIT)
    {
        // Format Box ist fuer Title und Time leer
    }
    else
    {
        nSize = GetFldMgr().GetFormatCount(nTypeId, FALSE, IsFldDlgHtmlMode());
        for (USHORT i = 0; i < nSize; i++)
        {
            USHORT nPos = aSelectionLB.InsertEntry(GetFldMgr().GetFormatStr(nTypeId, i));
            aSelectionLB.SetEntryData(nPos, (void*)GetFldMgr().GetFormatId(nTypeId, i));
            if (IsFldEdit() && i == nExtSubType)
                nSelPos = nPos;
        }
    }

    BOOL bEnable = nSize != 0;

    if (nSize)
    {
        if (!aSelectionLB.GetSelectEntryCount())
            aSelectionLB.SelectEntryPos(nSelPos == USHRT_MAX ? 0 : nSelPos);

        bEnable = TRUE;
    }

    aSelectionFT.Enable(bEnable);
    aSelectionLB.Enable(bEnable);

    return nSize;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

BOOL __EXPORT SwFldDokInfPage::FillItemSet(SfxItemSet& rSet)
{
    if (!pSelEntry || (USHORT)(ULONG)pSelEntry->GetUserData() == USHRT_MAX)
        return FALSE;

    USHORT nTypeId = TYP_DOCINFOFLD;
    USHORT nSubType = (USHORT)(ULONG)pSelEntry->GetUserData();

    ULONG nFormat = 0;

    USHORT nPos = aSelectionLB.GetSelectEntryPos();
    if (nPos != LISTBOX_ENTRY_NOTFOUND)
        nSubType |= (USHORT)(ULONG)aSelectionLB.GetEntryData(nPos);

    if (aFixedCB.IsChecked())
        nSubType |= DI_SUB_FIXED;

    nPos = aFormatLB.GetSelectEntryPos();
    if(nPos != LISTBOX_ENTRY_NOTFOUND)
        nFormat = aFormatLB.GetFormat();

    if (!IsFldEdit() || nOldSel != aSelectionLB.GetSelectEntryPos() ||
        nOldFormat != nFormat || aFixedCB.GetState() != aFixedCB.GetSavedValue())
    {
        InsertFld(nTypeId, nSubType, aEmptyStr, aEmptyStr, nFormat);
    }

    return FALSE;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SfxTabPage* __EXPORT SwFldDokInfPage::Create(   Window* pParent,
                        const SfxItemSet& rAttrSet )
{
    return ( new SwFldDokInfPage( pParent, rAttrSet ) );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

USHORT SwFldDokInfPage::GetGroup()
{
    return GRP_REG;
}
/* -----------------12.01.99 11:21-------------------
 *
 * --------------------------------------------------*/
void    SwFldDokInfPage::FillUserData()
{
    String sData( String::CreateFromAscii(
                            RTL_CONSTASCII_STRINGPARAM( USER_DATA_VERSION )));
    sData += ';';
    SvLBoxEntry* pEntry = aTypeTLB.FirstSelected();
    USHORT nTypeSel = pEntry ? (ULONG)pEntry->GetUserData() : USHRT_MAX;
    sData += String::CreateFromInt32( nTypeSel );
    SetUserData(sData);
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.21  2000/09/18 16:05:28  willem.vandorp
    OpenOffice header added.

    Revision 1.20  2000/06/30 08:52:52  os
    #76541# string assertions removed

    Revision 1.19  2000/05/23 18:36:37  jp
    Bugfixes for Unicode

    Revision 1.18  2000/04/18 15:17:31  os
    UNICODE

    Revision 1.17  2000/02/11 14:46:08  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.16  1999/02/19 07:48:26  MA
    #61949# CurrShell gibt es nicht mehr


      Rev 1.15   19 Feb 1999 08:48:26   MA
   #61949# CurrShell gibt es nicht mehr

      Rev 1.14   21 Jan 1999 09:46:24   OS
   #59900# Fussnoten im Dialog korrekt sortieren; keine prot. Member

      Rev 1.13   12 Jan 1999 11:42:24   OS
   #60579# ausgewaehlten Typ in den UserData speichern

      Rev 1.12   06 Mar 1998 14:53:52   OM
   Nur bei Aenderung Feld aktualisieren

      Rev 1.11   25 Feb 1998 16:47:58   OM
   Fixe Author- und ExtUser-Felder

      Rev 1.10   16 Feb 1998 10:10:22   OM
   Fuer Solaris nicht direkt von void* auf ushort casten

      Rev 1.9   12 Feb 1998 11:06:02   OM
   Zahlenformat fuer Docinfofelder

      Rev 1.8   03 Feb 1998 12:21:38   OM
   #46621# HelpIDs fuer Feldbefehl-Dlg

      Rev 1.7   19 Dec 1997 18:24:30   OM
   Feldbefehl-bearbeiten Dlg

      Rev 1.6   12 Dec 1997 16:10:06   OM
   AutoUpdate bei FocusWechsel u.a.

      Rev 1.5   11 Dec 1997 16:58:00   OM
   Feldumstellung

      Rev 1.4   10 Dec 1997 14:42:08   OM
   Fixe DocInfoFelder

      Rev 1.3   21 Nov 1997 17:19:46   OM
   Feldbefehl-Umstellung: DocInfo

      Rev 1.2   20 Nov 1997 17:01:22   OM
   Neuer Felddialog

      Rev 1.1   05 Nov 1997 15:35:38   OM
   Neuer Feldbefehldialog

      Rev 1.0   30 Oct 1997 14:30:02   OM
   Initial revision.

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/fldui/flddinf.hxx b/sw/source/ui/fldui/flddinf.hxx
new file mode 100644
index 0000000..5a61b62
--- /dev/null
+++ b/sw/source/ui/fldui/flddinf.hxx
@@ -0,0 +1,132 @@
/*************************************************************************
 *
 *  $RCSfile: flddinf.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:36 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWFLDDINF_HXX
#define _SWFLDDINF_HXX

#ifndef _SFXTABDLG_HXX //autogen
#include <sfx2/tabdlg.hxx>
#endif
#ifndef _SV_FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif
#ifndef _SV_LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif
#ifndef _SV_BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif
#ifndef _SV_GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif
#ifndef _SVTREEBOX_HXX //autogen
#include <svtools/svtreebx.hxx>
#endif

#include "numfmtlb.hxx"
#include "fldpage.hxx"

/*--------------------------------------------------------------------
   Beschreibung:
 --------------------------------------------------------------------*/

class SwFldDokInfPage : public SwFldPage
{
    FixedText           aTypeFT;
    SvTreeListBox       aTypeTLB;
    FixedText           aSelectionFT;
    ListBox             aSelectionLB;
    FixedText           aFormatFT;
    NumFormatListBox    aFormatLB;
    CheckBox            aFixedCB;

    SvLBoxEntry*        pSelEntry;

    Bitmap              aRootOpened;
    Bitmap              aRootClosed;
    String              aInfoStr;

    USHORT              nOldSel;
    ULONG               nOldFormat;

    DECL_LINK( TypeHdl, ListBox* pLB = 0 );
    DECL_LINK( SubTypeHdl, ListBox* pLB = 0 );

    USHORT              FillSelectionLB(USHORT nSubTypeId);

protected:
    virtual USHORT      GetGroup();

public:
                        SwFldDokInfPage(Window* pWindow, const SfxItemSet& rSet);

                        ~SwFldDokInfPage();

    static SfxTabPage*  Create(Window* pParent, const SfxItemSet& rAttrSet);

    virtual BOOL        FillItemSet( SfxItemSet& rSet );
    virtual void        Reset( const SfxItemSet& rSet );

    virtual void        FillUserData();
};


#endif

diff --git a/sw/source/ui/fldui/flddinf.src b/sw/source/ui/fldui/flddinf.src
new file mode 100644
index 0000000..9a968d45
--- /dev/null
+++ b/sw/source/ui/fldui/flddinf.src
@@ -0,0 +1,398 @@
/*************************************************************************
 *
 *  $RCSfile: flddinf.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:36 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "globals.hrc"
#include "fldtdlg.hrc"
#include "helpid.h"
TabPage TP_FLD_DOKINF
{
    HelpID = HID_FLD_DOKINF ;
    SVLook = TRUE ;
    Hide = TRUE ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Text = "Dokumentinfo" ;
    Text [ ENGLISH ] = "Document information" ;
    FixedText FT_DOKINFTYPE
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 76 , 10 ) ;
        Text = "~Feldtyp" ;
        Text [ ENGLISH ] = "Type" ;
        Text [ norwegian ] = "Type" ;
        Text [ italian ] = "~Tipo di campo" ;
        Text [ portuguese_brazilian ] = "Tipo" ;
        Text [ portuguese ] = "Tipo de ~campo" ;
        Text [ finnish ] = "Laji" ;
        Text [ danish ] = "Felttype" ;
        Text [ french ] = "~Type de champ" ;
        Text [ swedish ] = "~Fälttyp" ;
        Text [ dutch ] = "~Veldtype" ;
        Text [ spanish ] = "~Tipo de campo" ;
        Text [ english_us ] = "~Type" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "×Ö¶ÎÀàÐÍ(~T)";
        Text[ russian ] = "Òèï ïîëÿ";
        Text[ polish ] = "Typ pola";
        Text[ japanese ] = "̨°ÙÄނ̎í—Þ(~T)";
        Text[ chinese_traditional ] = "Ãþ«¬(~T)";
        Text[ arabic ] = "äæÚ ÇáÍÞá";
        Text[ greek ] = "~Ôýðïò ðåäßïõ";
        Text[ korean ] = "ÇüÅÂ(~T)";
        Text[ turkish ] = "A~lan tipi";
        Text[ language_user1 ] = " ";
    };
    Control TLB_DOKINFTYPE
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 6 , 16 ) ;
        Size = MAP_APPFONT ( 76 , 113 ) ;
        TabStop = TRUE ;
    };
    FixedText FT_DOKINFSELECTION
    {
        Pos = MAP_APPFONT ( 88 , 3 ) ;
        Size = MAP_APPFONT ( 76 , 10 ) ;
        Text = "~Auswahl" ;
        Text [ ENGLISH ] = "Selection" ;
        Text [ norwegian ] = "Selection" ;
        Text [ italian ] = "Selezione" ;
        Text [ portuguese_brazilian ] = "Seleção" ;
        Text [ portuguese ] = "~Selecção" ;
        Text [ finnish ] = "Valinta" ;
        Text [ danish ] = "Udvalg" ;
        Text [ french ] = "~Sélection" ;
        Text [ swedish ] = "~Urval" ;
        Text [ dutch ] = "~Selectie" ;
        Text [ spanish ] = "Se~lección" ;
        Text [ english_us ] = "S~elect" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "Ñ¡Ôñ(~E)";
        Text[ russian ] = "Âûáîð";
        Text[ polish ] = "Wybór";
        Text[ japanese ] = "‘I‘ð(~E)";
        Text[ chinese_traditional ] = "¿ï¾Ü(~E)";
        Text[ arabic ] = "ÇáÊÍÏíÏ";
        Text[ greek ] = "~ÅðéëïãÞ";
        Text[ korean ] = "¼±ÅÃ(~E)";
        Text[ turkish ] = "S~eçim";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_DOKINFSELECTION
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 88 , 16 ) ;
        Size = MAP_APPFONT ( 76 , 113 ) ;
        TabStop = TRUE ;
        StringList =
        {
            < "Autor" ; > ;
            < "Uhrzeit" ; > ;
            < "Datum" ; > ;
            < "Datum Zeit Autor" ; > ;
        };
        stringlist [ english_us ] =
        {
            < "Author" ; > ;
            < "Time" ; > ;
            < "Date" ; > ;
            < "Date Time Author" ; > ;
        };
        stringlist [ portuguese_brazilian ] =
        {
            < "Autor" ; > ;
            < "Uhrzeit" ; > ;
            < "Datum" ; > ;
            < "Datum Zeit Autor" ; > ;
        };
        stringlist [ swedish ] =
        {
            < "Författare" ; > ;
            < "Klockslag" ; > ;
            < "Datum" ; > ;
            < "Datum Tid Författare" ; > ;
        };
        stringlist [ danish ] =
        {
            < "Forfatter" ; > ;
            < "Klokkeslæt" ; > ;
            < "Dato" ; > ;
            < "Dato Tid Forfatter" ; > ;
        };
        stringlist [ italian ] =
        {
            < "Autore" ; > ;
            < "Orario" ; > ;
            < "Data" ; > ;
            < "Data orario autore" ; > ;
        };
        stringlist [ spanish ] =
        {
            < "Autor" ; > ;
            < "Hora" ; > ;
            < "Fecha" ; > ;
            < "Fecha Hora Autor" ; > ;
        };
        stringlist [ french ] =
        {
            < "Auteur" ; > ;
            < "Heure" ; > ;
            < "Date" ; > ;
            < "Date Heure Auteur" ; > ;
        };
        stringlist [ dutch ] =
        {
            < "Auteur" ; > ;
            < "Tijd" ; > ;
            < "Datum" ; > ;
            < "Datum Tijd Auteur" ; > ;
        };
        stringlist [ portuguese ] =
        {
            < "Autor" ; > ;
            < "Horas" ; > ;
            < "Data" ; > ;
            < "Data Horas Autor" ; > ;
        };
    StringList [ chinese_simplified ] =
    {
            < "×÷Õß" ; > ;
        < "ʱ¼ä" ; > ;
        < "ÈÕÆÚ" ; > ;
        < "ÈÕÆÚ Ê±¼ä ×÷Õß" ; > ;
    };
    StringList [ russian ] =
    {
            < "Àâòîð" ; > ;
        < "Âðåìÿ" ; > ;
        < "Äàòà" ; > ;
        < "Äàòà Âðåìÿ Àâòîð" ; > ;
    };
    StringList [ polish ] =
    {
            < "Autor" ; > ;
        < "Godzina" ; > ;
        < "Data" ; > ;
        < "Data Godzina Autor" ; > ;
    };
    StringList [ japanese ] =
    {
            < "ì¬ŽÒ" ; > ;
        < "Žž" ; > ;
        < "“ú•t" ; > ;
        < "“ú•t@Žž@ì¬ŽÒ" ; > ;
    };
    StringList [ chinese_traditional ] =
    {
            < "§@ªÌ" ; > ;
        < "®É¶¡" ; > ;
        < "¤é´Á" ; > ;
        < "¤é´Á ®É¶¡ §@ªÌ" ; > ;
    };
    StringList [ arabic ] =
    {
            < "ÇáãÄáÝ" ; > ;
        < "ÇáæÞÊ" ; > ;
        < "ÇáÊÇÑíÎ" ; > ;
        < "ÇáÊÇÑíÎ ÇáæÞÊ ÇáãÄáÝ" ; > ;
    };
    StringList [ greek ] =
    {
            < "ÓõíôÜêôçò" ; > ;
        < "¿ñá" ; > ;
        < "Çìåñïìçíßá" ; > ;
        < "Çìåñïìçíßá ¿ñá ÓõíôÜêôçò" ; > ;
    };
    StringList [ korean ] =
    {
            < "ÀÛ¼ºÀÎ" ; > ;
        < "½Ã°£" ; > ;
        < "ÀÏÀÚ" ; > ;
        < "ÀÏÀÚ ½Ã°£ ÀÛ¼ºÀÎ" ; > ;
    };
    StringList [ turkish ] =
    {
            < "Yazan" ; > ;
        < "Saat" ; > ;
        < "Tarih" ; > ;
        < "Tarih Saat Yazan" ; > ;
    };
    StringList [ language_user1 ] =
    {
            < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
    };
    };
    FixedText FT_DOKINFFORMAT
    {
        Pos = MAP_APPFONT ( 170 , 3 ) ;
        Size = MAP_APPFONT ( 84 , 10 ) ;
        TEXT = "F~ormat" ;
        TEXT [ English ] = "Format" ;
        Left = TRUE ;
        Text [ english_us ] = "F~ormat" ;
        Text [ portuguese_brazilian ] = "F~ormat" ;
        Text [ swedish ] = "F~ormat" ;
        Text [ danish ] = "Format" ;
        Text [ italian ] = "F~ormato" ;
        Text [ spanish ] = "F~ormato" ;
        Text [ french ] = "F~ormat" ;
        Text [ dutch ] = "F~ormaat" ;
        Text [ portuguese ] = "F~ormato" ;
        Text[ chinese_simplified ] = "¸ñʽ(~O)";
        Text[ russian ] = "Ôîðìàò";
        Text[ polish ] = "Format";
        Text[ japanese ] = "‘Ž®(~O)";
        Text[ chinese_traditional ] = "®æ¦¡(~O)";
        Text[ arabic ] = "ÇáÊäÓíÞ";
        Text[ greek ] = "Ì~ïñöÞ";
        Text[ korean ] = "¼­½Ä(~O)";
        Text[ turkish ] = "F~ormat";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_DOKINFFORMAT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 170 , 16 ) ;
        Size = MAP_APPFONT ( 84 , 98 ) ;
        TabStop = TRUE ;
        AutoHScroll = TRUE ;
    };
    CheckBox CB_DOKINFFIXEDCONTENT
    {
        Pos = MAP_APPFONT ( 170 , 120 ) ;
        Size = MAP_APPFONT ( 72 , 10 ) ;
        TEXT = "~Inhalt fixieren" ;
        TEXT [ English ] = "Fixed content" ;
        TabStop = TRUE ;
        Text [ english_us ] = "Fi~xed content" ;
        Text [ portuguese_brazilian ] = "~Inhalt fixieren" ;
        Text [ swedish ] = "Fixera ~innehåll" ;
        Text [ danish ] = "Fast indhold" ;
        Text [ italian ] = "~Fissa il contenuto" ;
        Text [ spanish ] = "~Fijar contenido" ;
        Text [ french ] = "Contenu f~ixe" ;
        Text [ dutch ] = "~Inhoud fixeren" ;
        Text [ portuguese ] = "~Contéudo fixo" ;
        Text[ chinese_simplified ] = "¹Ì¶¨ÄÚÈÝ(~X)";
        Text[ russian ] = "Ôèêñ. ñîäåðæèìîå";
        Text[ polish ] = "Sta³a treœæ";
        Text[ japanese ] = "“à—e‚̌Œè(~F)";
        Text[ chinese_traditional ] = "©T©w¤º®e(~F)";
        Text[ arabic ] = "ÊËÈíÊ ÇáãÍÊæíÇÊ";
        Text[ greek ] = "Ðáãßùóç ðåñ~éå÷ïìÝíùí";
        Text[ korean ] = "³»¿ë °íÁ¤(~X)";
        Text[ turkish ] = "Ýçeriði sabitle";
        Text[ language_user1 ] = " ";
    };
    Bitmap BMP_DOKINFROOT_OPENED
    {
        File = "plus.bmp" ;
    };
    Bitmap BMP_DOKINFROOT_CLOSED
    {
        File = "minus.bmp" ;
    };
    String STR_DOKINF_INFO
    {
        TEXT = "Info" ;
        TEXT [ English ] = "Info" ;
        Text [ english_us ] = "Info" ;
        Text [ portuguese_brazilian ] = "Info" ;
        Text [ swedish ] = "Info" ;
        Text [ danish ] = "Info" ;
        Text [ italian ] = "Info" ;
        Text [ spanish ] = "Información" ;
        Text [ french ] = "Info" ;
        Text [ dutch ] = "Info" ;
        Text [ portuguese ] = "Info" ;
        Text[ chinese_simplified ] = "ÓйØ";
        Text[ russian ] = "Èíôîðìàöèÿ";
        Text[ polish ] = "Informacja";
        Text[ japanese ] = "²Ý̫Ұ¼®Ý";
        Text[ chinese_traditional ] = "Ãö©ó";
        Text[ arabic ] = "ãÚáæãÇÊ";
        Text[ greek ] = "Ðëçñïöïñßåò";
        Text[ korean ] = "Á¤º¸";
        Text[ turkish ] = "Bilgi";
        Text[ language_user1 ] = " ";
    };
    Text [ english_us ] = "DocInformation" ;
    Text [ portuguese_brazilian ] = "Dokumentinfo" ;
    Text [ swedish ] = "Dokumentinfo" ;
    Text [ danish ] = "Dokumentinfo" ;
    Text [ italian ] = "Info documento" ;
    Text [ spanish ] = "Información del documento" ;
    Text [ french ] = "Info document" ;
    Text [ dutch ] = "Documentinfo" ;
    Text [ portuguese ] = "Info. sobre documento" ;
    Text[ chinese_simplified ] = "ÎĵµÐÅÏ¢";
    Text[ russian ] = "Ñâåäåíèÿ î äîêóìåíòå";
    Text[ polish ] = "Informacje o dokumencie";
    Text[ japanese ] = "ÄÞ·­ÒÝÄ ²Ý̫Ұ¼®Ý";
    Text[ chinese_traditional ] = "¤å¥ó¸ê°T";
    Text[ arabic ] = "ãÚáæãÇÊ ÇáãÓÊäÏ";
    Text[ greek ] = "Ðëçñïöïñßåò åããñÜöïõ";
    Text[ korean ] = "µî·ÏÁ¤º¸";
    Text[ turkish ] = "Belge bilgileri";
    Text[ language_user1 ] = " ";
};
diff --git a/sw/source/ui/fldui/flddok.cxx b/sw/source/ui/fldui/flddok.cxx
new file mode 100644
index 0000000..4cf7743
--- /dev/null
+++ b/sw/source/ui/fldui/flddok.cxx
@@ -0,0 +1,872 @@
/*************************************************************************
 *
 *  $RCSfile: flddok.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:36 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SV_SVAPP_HXX //autogen
#include <vcl/svapp.hxx>
#endif

#ifndef _FLDDAT_HXX //autogen
#include <flddat.hxx>
#endif
#ifndef _DOCUFLD_HXX //autogen
#include <docufld.hxx>
#endif
#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif
#ifndef _FLDBAS_HXX
#include <fldbas.hxx>
#endif
#ifndef _CHPFLD_HXX
#include <chpfld.hxx>
#endif

#ifndef _FLDTDLG_HRC
#include <fldtdlg.hrc>
#endif
#ifndef _FLDUI_HRC
#include <fldui.hrc>
#endif
#ifndef _FLDDOK_HXX
#include <flddok.hxx>
#endif

#define USER_DATA_VERSION_1 "1"
#define USER_DATA_VERSION USER_DATA_VERSION_1

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SwFldDokPage::SwFldDokPage(Window* pWindow, const SfxItemSet& rCoreSet ) :
    SwFldPage( pWindow, SW_RES( TP_FLD_DOK ), rCoreSet ),

    aTypeFT         (this, SW_RES(FT_DOKTYPE)),
    aTypeLB         (this, SW_RES(LB_DOKTYPE)),
    aSelectionFT    (this, SW_RES(FT_DOKSELECTION)),
    aSelectionLB    (this, SW_RES(LB_DOKSELECTION)),
    aValueFT        (this, SW_RES(FT_DOKVALUE)),
    aValueED        (this, SW_RES(ED_DOKVALUE)),
    aLevelED        (this, SW_RES(ED_DOKLEVEL)),
    aDateOffsetED   (this, SW_RES(ED_DOKDATEOFF)),

    aFormatFT       (this, SW_RES(FT_DOKFORMAT)),
    aFormatLB       (this, SW_RES(LB_DOKFORMAT)),
    aNumFormatLB    (this, SW_RES(LB_DOKNUMFORMAT)),
    aFixedCB        (this, SW_RES(CB_DOKFIXEDCONTENT)),

    sDateOffset     (SW_RES(STR_DOKDATEOFF)),
    sTimeOffset     (SW_RES(STR_DOKTIMEOFF)),
    aRootOpened     (SW_RES(BMP_DOKROOT_OPENED)),
    aRootClosed     (SW_RES(BMP_DOKROOT_CLOSED))
{
    FreeResource();

    aSelectionLB.SetDoubleClickHdl(LINK(this, SwFldDokPage, InsertHdl));
    aFormatLB.SetDoubleClickHdl(LINK(this, SwFldDokPage, InsertHdl));
    aNumFormatLB.SetDoubleClickHdl(LINK(this, SwFldDokPage, NumFormatHdl));

    aLevelED.SetMax(MAXLEVEL);
    aDateOffsetED.SetMin(LONG_MIN);
    aDateOffsetED.SetMax(LONG_MAX);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

__EXPORT SwFldDokPage::~SwFldDokPage()
{
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void __EXPORT SwFldDokPage::Reset(const SfxItemSet& rSet)
{
    SavePos(&aTypeLB);
    Init(); // Allgemeine initialisierung

    // TypeListBox initialisieren
    const SwFldGroupRgn& rRg = GetFldMgr().GetGroupRange(IsFldDlgHtmlMode(), GetGroup());

    aTypeLB.SetUpdateMode(FALSE);
    aTypeLB.Clear();

    USHORT nPos, nTypeId;
    BOOL bPage = FALSE;

    if (!IsFldEdit())
    {
        // Typ-Listbox fuellen
        for(short i = rRg.nStart; i < rRg.nEnd; ++i)
        {
            nTypeId = GetFldMgr().GetTypeId(i);

            switch (nTypeId)
            {
                case TYP_PREVPAGEFLD:
                case TYP_NEXTPAGEFLD:
                case TYP_PAGENUMBERFLD:
                    if (!bPage)
                    {
                        nPos = aTypeLB.InsertEntry(SW_RESSTR(FMT_REF_PAGE));
                        aTypeLB.SetEntryData(nPos, (void*)USHRT_MAX);
                        bPage = TRUE;
                    }
                    break;

                default:
                    nPos = aTypeLB.InsertEntry(GetFldMgr().GetTypeStr(i));
                    aTypeLB.SetEntryData(nPos, (void*)nTypeId);
                    break;
            }
        }
    }
    else
    {
        nTypeId = GetCurField()->GetTypeId();
        if (nTypeId == TYP_FIXDATEFLD)
            nTypeId = TYP_DATEFLD;
        if (nTypeId == TYP_FIXTIMEFLD)
            nTypeId = TYP_TIMEFLD;
        nPos = aTypeLB.InsertEntry(GetFldMgr().GetTypeStr(GetFldMgr().GetPos(nTypeId)));
        aTypeLB.SetEntryData(nPos, (void*)nTypeId);
    }

    // alte Pos selektieren
    RestorePos(&aTypeLB);

    aTypeLB.SetUpdateMode(TRUE);
    aTypeLB.SetDoubleClickHdl(LINK(this, SwFldDokPage, InsertHdl));
    aTypeLB.SetSelectHdl(LINK(this, SwFldDokPage, TypeHdl));
    aFormatLB.SetSelectHdl(LINK(this, SwFldDokPage, FormatHdl));

    if( !IsRefresh() )
    {
        String sUserData = GetUserData();
        if( sUserData.GetToken(0, ';').EqualsIgnoreCaseAscii(USER_DATA_VERSION_1 ))
        {
            String sVal = sUserData.GetToken(1, ';');
            USHORT nVal = sVal.ToInt32();
            if(nVal != USHRT_MAX)
            {
                for(USHORT i = 0; i < aTypeLB.GetEntryCount(); i++)
                    if(nVal == (USHORT)(ULONG)aTypeLB.GetEntryData(i))
                    {
                        aTypeLB.SelectEntryPos(i);
                        break;
                    }
            }
        }
    }
    TypeHdl(0);

    if (IsFldEdit())
    {
        nOldSel = aSelectionLB.GetSelectEntryPos();
        nOldFormat = GetCurField()->GetFormat();
        aFixedCB.SaveValue();
        aValueED.SaveValue();
        aLevelED.SaveValue();
        aDateOffsetED.SaveValue();
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwFldDokPage, TypeHdl, ListBox *, EMPTYARG )
{
    // Alte ListBoxPos sichern
    const USHORT nOld = GetTypeSel();

    // Aktuelle ListBoxPos
    SetTypeSel(aTypeLB.GetSelectEntryPos());

    if(GetTypeSel() == LISTBOX_ENTRY_NOTFOUND)
    {
        SetTypeSel(0);
        aTypeLB.SelectEntryPos(0);
    }

    USHORT nCount;

    if (nOld != GetTypeSel())
    {
        USHORT nTypeId = (USHORT)(ULONG)aTypeLB.GetEntryData(GetTypeSel());

        // Auswahl-Listbox fuellen
        aSelectionLB.Clear();

        if (nTypeId != USHRT_MAX)
        {
            SvStringsDtor& rLst = GetFldMgr().GetSubTypes(nTypeId);

            if (nTypeId != TYP_AUTHORFLD)
                nCount = rLst.Count();
            else
                nCount = GetFldMgr().GetFormatCount(nTypeId, FALSE, IsFldDlgHtmlMode());

            USHORT nPos;

            for (USHORT i = 0; i < nCount; ++i)
            {
                if (!IsFldEdit())
                {
                    if (nTypeId != TYP_AUTHORFLD)
                        nPos = aSelectionLB.InsertEntry(*rLst[i]);
                    else
                        nPos = aSelectionLB.InsertEntry(GetFldMgr().GetFormatStr(nTypeId, i));

                    aSelectionLB.SetEntryData(nPos, (void*)i);
                }
                else
                {
                    BOOL bInsert = FALSE;

                    switch (nTypeId)
                    {
                        case TYP_DATEFLD:
                        case TYP_TIMEFLD:
                            nPos = aSelectionLB.InsertEntry(*rLst[i]);
                            aSelectionLB.SetEntryData(nPos, (void*)i);
                            if (((SwDateTimeField*)GetCurField())->IsFixed() && !i)
                                aSelectionLB.SelectEntryPos(nPos);
                            if (!((SwDateTimeField*)GetCurField())->IsFixed() && i)
                                aSelectionLB.SelectEntryPos(nPos);
                            break;

                        case TYP_EXTUSERFLD:
                        case TYP_DOCSTATFLD:
                            nPos = aSelectionLB.InsertEntry(*rLst[i]);
                            aSelectionLB.SetEntryData(nPos, (void*)i);
                            if (GetCurField()->GetSubType() == i)
                                aSelectionLB.SelectEntryPos(nPos);
                            break;

                        case TYP_AUTHORFLD:
                        {
                            String sFmt(GetFldMgr().GetFormatStr(nTypeId, i));
                            nPos = aSelectionLB.InsertEntry(sFmt);
                            aSelectionLB.SetEntryData(nPos, (void*)i);
                            aSelectionLB.SelectEntry(GetFldMgr().GetFormatStr(nTypeId, GetCurField()->GetFormat()));
                            break;
                        }

                        default:
                            if (*rLst[i] == GetCurField()->GetPar1())
                                bInsert = TRUE;
                            break;
                    }
                    if (bInsert)
                    {
                        nPos = aSelectionLB.InsertEntry(*rLst[i]);
                        aSelectionLB.SetEntryData(nPos, (void*)i);
                        break;
                    }
                }
            }
            aSelectionLB.SetSelectHdl(Link());
        }
        else
        {
            AddSubType(TYP_PAGENUMBERFLD);
            AddSubType(TYP_PREVPAGEFLD);
            AddSubType(TYP_NEXTPAGEFLD);
            nTypeId = (USHORT)(ULONG)aSelectionLB.GetEntryData(0);
            nCount = 3;
            aSelectionLB.SetSelectHdl(LINK(this, SwFldDokPage, SubTypeHdl));
        }

        BOOL bEnable = nCount != 0;

        if (bEnable && !aSelectionLB.GetSelectEntryCount())
            aSelectionLB.SelectEntryPos(0);

        aSelectionLB.Enable( bEnable );
        aSelectionFT.Enable( bEnable );

        // Format-Listbox fuellen
        USHORT nSize = FillFormatLB(nTypeId);

        BOOL bValue = FALSE, bLevel = FALSE, bNumFmt = FALSE, bOffset = FALSE;
        BOOL bFormat = nSize != 0;
        BOOL bOneArea = FALSE;
        BOOL bFixed = FALSE;
        USHORT nFmtType = 0;

        switch (nTypeId)
        {
            case TYP_DATEFLD:
                bFormat = bNumFmt = bOneArea = bOffset = TRUE;

                nFmtType = NUMBERFORMAT_DATE;
                aValueFT.SetText(sDateOffset);
                aDateOffsetED.SetFirst(-31);    // Ein Monat
                aDateOffsetED.SetLast(31);

                if (IsFldEdit())
                    aDateOffsetED.SetValue( ((SwDateTimeField*)GetCurField())->GetOffset() / 24 / 60);
                break;

            case TYP_TIMEFLD:
                bFormat = bNumFmt = bOneArea = bOffset = TRUE;

                nFmtType = NUMBERFORMAT_TIME;
                aValueFT.SetText(sTimeOffset);
                aDateOffsetED.SetFirst(-1440);  // Ein Tag
                aDateOffsetED.SetLast(1440);

                if (IsFldEdit())
                    aDateOffsetED.SetValue( ((SwDateTimeField*)GetCurField())->GetOffset() );
                break;

            case TYP_PREVPAGEFLD:
            case TYP_NEXTPAGEFLD:
                if (IsFldEdit())
                {
                    USHORT nTmp = (USHORT)(ULONG)aFormatLB.GetEntryData(
                                            aFormatLB.GetSelectEntryPos() );
                    String sOldTxt(aValueFT.GetText());

                    if (FMT_NUM_PAGESPECIAL - FMT_NUM_BEGIN != nTmp)
                    {
                        short nOff = GetCurField()->GetPar2().ToInt32();
                        if( TYP_NEXTPAGEFLD == nTypeId && 1 != nOff )
                            aValueED.SetText( nOff - 1 );
                        else if( TYP_PREVPAGEFLD == nTypeId && -1 != nOff )
                            aValueED.SetText( nOff + 1 );
                        else
                            aValueED.SetText(aEmptyStr);
                    }
                    else
                        aValueED.SetText(((SwPageNumberField*)GetCurField())->GetUserString());
                }
                bValue = TRUE;
                break;

            case TYP_CHAPTERFLD:
                aValueFT.SetText(SW_RESSTR(STR_LEVEL));
                if (IsFldEdit())
                    aLevelED.SetText(String::CreateFromInt32(((SwChapterField*)GetCurField())->GetLevel() + 1));
                bLevel = TRUE;
                break;

            case TYP_PAGENUMBERFLD:
                aValueFT.SetText( SW_RESSTR( STR_OFFSET ));
                if (IsFldEdit())
                    aValueED.SetText(GetCurField()->GetPar2());
                bValue = TRUE;
                break;

            case TYP_EXTUSERFLD:
            case TYP_AUTHORFLD:
            case TYP_FILENAMEFLD:
                bFixed = TRUE;
                break;

            default:
                break;
        }

        if (bNumFmt)
        {
            if (IsFldEdit())
            {
                aNumFormatLB.SetDefFormat(GetCurField()->GetFormat());

                if (aNumFormatLB.GetFormatType() == (NUMBERFORMAT_DATE|NUMBERFORMAT_TIME))
                {
                    // Format-Typ immer einstellen, da sonst bei kombinierten Datum/Zeitformaten
                    // beide Formate gleichzeitig angezeigt werden wuerden
                    aNumFormatLB.SetFormatType(0);
                    aNumFormatLB.SetFormatType(nFmtType);
                    // Nochmal richtiges Format einstellen
                    aNumFormatLB.SetDefFormat(GetCurField()->GetFormat());
                }
            }
            else
                aNumFormatLB.SetFormatType(nFmtType);

            aNumFormatLB.SetOneArea(bOneArea);
        }

        aFormatLB.Show(!bNumFmt);
        aNumFormatLB.Show(bNumFmt);

        Size aSz(aFormatLB.GetSizePixel());

        if (bValue | bLevel | bOffset)
            aSz.Height() = aFormatLB.LogicToPixel(Size(1, 82), MAP_APPFONT).Height();
        else
            aSz.Height() = aFormatLB.LogicToPixel(Size(1, 98), MAP_APPFONT).Height();

        aValueFT.Show(bValue | bLevel | bOffset);
        aValueED.Show(bValue);
        aLevelED.Show(bLevel);
        aDateOffsetED.Show(bOffset);
        aFixedCB.Show(!bValue && !bLevel && !bOffset);

        aFormatLB.SetSizePixel(aSz);
        aNumFormatLB.SetSizePixel(aSz);

        aFormatLB.Enable(bFormat);
        aFormatFT.Enable(bFormat);
        aFixedCB.Enable(bFixed);

        if (IsFldEdit())
            aFixedCB.Check(((GetCurField()->GetFormat() & AF_FIXED) != 0) & bFixed);

        if (aNumFormatLB.GetSelectEntryPos() == LISTBOX_ENTRY_NOTFOUND)
            aNumFormatLB.SelectEntryPos(0);
        aValueFT.Enable(bValue | bLevel | bOffset);
        aValueED.Enable(bValue);
    }

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwFldDokPage::AddSubType(USHORT nTypeId)
{
    USHORT nPos = aSelectionLB.InsertEntry(*SwFieldType::GetFldNames()->GetObject(nTypeId));
    aSelectionLB.SetEntryData(nPos, (void*)nTypeId);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwFldDokPage, SubTypeHdl, ListBox *, EMPTYARG )
{
    USHORT nPos = aSelectionLB.GetSelectEntryPos();
    if(nPos == LISTBOX_ENTRY_NOTFOUND)
        nPos = 0;

    USHORT nTypeId = (USHORT)(ULONG)aSelectionLB.GetEntryData(nPos);
    FillFormatLB(nTypeId);

    USHORT nTextRes = 0;
    switch (nTypeId)
    {
    case TYP_CHAPTERFLD:
        nTextRes = STR_LEVEL;
        break;

    case TYP_PREVPAGEFLD:
    case TYP_NEXTPAGEFLD:
        nTextRes = SVX_NUM_CHAR_SPECIAL == (USHORT)(ULONG)aFormatLB.GetEntryData(
                                        aFormatLB.GetSelectEntryPos() )
                        ? STR_VALUE : STR_OFFSET;
        break;

    case TYP_PAGENUMBERFLD:
        nTextRes = STR_OFFSET;
        break;
    }

    if( nTextRes )
        aValueFT.SetText( SW_RESSTR( nTextRes ));

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

USHORT SwFldDokPage::FillFormatLB(USHORT nTypeId)
{
    // Format-Listbox fuellen
    aFormatLB.Clear();

    if (nTypeId == TYP_AUTHORFLD)
        return aFormatLB.GetEntryCount();

    USHORT nSize = GetFldMgr().GetFormatCount(nTypeId, FALSE, IsFldDlgHtmlMode());

    for( USHORT i = 0; i < nSize; ++i )
    {
        USHORT nPos = aFormatLB.InsertEntry(GetFldMgr().GetFormatStr(nTypeId, i));
        USHORT nFmtId = GetFldMgr().GetFormatId( nTypeId, i );
        aFormatLB.SetEntryData( nPos, (void*)nFmtId );
        if (IsFldEdit() && nFmtId == (GetCurField()->GetFormat() & ~AF_FIXED))
            aFormatLB.SelectEntryPos( nPos );
    }

    if( nSize && !aFormatLB.GetSelectEntryCount() )
    {
        aFormatLB.SelectEntry( SW_RESSTR(FMT_NUM_PAGEDESC) );
        if( !aFormatLB.GetSelectEntryCount() )
        {
            aFormatLB.SelectEntry( SW_RESSTR(FMT_NUM_ARABIC) );
            if( !aFormatLB.GetSelectEntryCount() )
                aFormatLB.SelectEntryPos( 0 );
        }
    }

    FormatHdl();

    return nSize;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwFldDokPage, FormatHdl, ListBox *, EMPTYARG )
{
    USHORT nTypeId = (USHORT)(ULONG)aTypeLB.GetEntryData(GetTypeSel());

    if (nTypeId == USHRT_MAX)
    {
        USHORT nPos = aSelectionLB.GetSelectEntryPos();
        if(nPos == LISTBOX_ENTRY_NOTFOUND)
            nPos = 0;

        nTypeId = (USHORT)(ULONG)aSelectionLB.GetEntryData(nPos);
    }

    if (nTypeId == TYP_NEXTPAGEFLD || nTypeId == TYP_PREVPAGEFLD)
    {
        // Prev/Next - PageNumFelder Sonderbehandlung:
        USHORT nTmp = (USHORT)(ULONG)aFormatLB.GetEntryData(
                                        aFormatLB.GetSelectEntryPos() );
        String sOldTxt( aValueFT.GetText() );
        String sNewTxt( SW_RES( SVX_NUM_CHAR_SPECIAL == nTmp  ? STR_VALUE
                                                         : STR_OFFSET ));

        if( sOldTxt != sNewTxt )
            aValueFT.SetText( sNewTxt );

        if (sOldTxt != aValueFT.GetText())
            aValueED.SetText( aEmptyStr );
    }

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

BOOL __EXPORT SwFldDokPage::FillItemSet(SfxItemSet& rSet)
{
    BOOL bPage = FALSE;
    USHORT nTypeId = (USHORT)(ULONG)aTypeLB.GetEntryData(GetTypeSel());

    if (nTypeId == USHRT_MAX)
    {
        USHORT nPos = aSelectionLB.GetSelectEntryPos();
        if(nPos == LISTBOX_ENTRY_NOTFOUND)
            nPos = 0;
        nTypeId = (USHORT)(ULONG)aSelectionLB.GetEntryData(nPos);
        bPage = TRUE;
    }

    String aVal(aValueED.GetText());
    ULONG nFormat = 0;
    USHORT nSubType = 0;

    if (aFormatLB.IsEnabled())
    {
        USHORT nPos = aFormatLB.GetSelectEntryPos();
        if(nPos != LISTBOX_ENTRY_NOTFOUND)
            nFormat = (USHORT)(ULONG)aFormatLB.GetEntryData(nPos);
    }

    if (aSelectionLB.IsEnabled())
    {
        USHORT nPos = aSelectionLB.GetSelectEntryPos();
        if(nPos != LISTBOX_ENTRY_NOTFOUND)
            nSubType = (USHORT)(ULONG)aSelectionLB.GetEntryData(nPos);
    }

    switch (nTypeId)
    {
        case TYP_AUTHORFLD:
            nFormat = nSubType;
            nSubType = 0;
            // kein break!
        case TYP_EXTUSERFLD:
            nFormat |= aFixedCB.IsChecked() ? AF_FIXED : 0;
            break;

        case TYP_FILENAMEFLD:
            nFormat |= aFixedCB.IsChecked() ? FF_FIXED : 0;
            break;

        case TYP_DATEFLD:
        case TYP_TIMEFLD:
        {
            nFormat = aNumFormatLB.GetFormat();
            long nVal = aDateOffsetED.GetValue();
            if (nTypeId == TYP_DATEFLD)
                aVal = String::CreateFromInt32(nVal * 60 * 24);
            else
                aVal = String::CreateFromInt32(nVal);
            break;
        }

        case TYP_NEXTPAGEFLD:
        case TYP_PREVPAGEFLD:
        case TYP_PAGENUMBERFLD:
        case TYP_GETREFPAGEFLD:
        {
            if( SVX_NUM_CHAR_SPECIAL != nFormat &&
                (TYP_PREVPAGEFLD == nTypeId || TYP_NEXTPAGEFLD == nTypeId))
            {
                short nVal = aValueED.GetText().ToInt32();
                aVal = String::CreateFromInt32(nVal);
            }
            break;
        }

        case TYP_CHAPTERFLD:
            aVal = aLevelED.GetText();
            break;

        default:
            break;
    }

    if (!IsFldEdit() ||
        nOldSel != aSelectionLB.GetSelectEntryPos() ||
        nOldFormat != nFormat ||
        aFixedCB.GetState() != aFixedCB.GetSavedValue() ||
        aValueED.GetText() != aValueED.GetSavedValue() ||
        aLevelED.GetText() != aLevelED.GetSavedValue() ||
        aDateOffsetED.GetText() != aDateOffsetED.GetSavedValue())
    {
        InsertFld( nTypeId, nSubType, aEmptyStr, aVal, nFormat );
    }

    return FALSE;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SfxTabPage* __EXPORT SwFldDokPage::Create(  Window* pParent,
                        const SfxItemSet& rAttrSet )
{
    return ( new SwFldDokPage( pParent, rAttrSet ) );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

USHORT SwFldDokPage::GetGroup()
{
    return GRP_DOC;
}

/* -----------------12.01.99 10:09-------------------
 *
 * --------------------------------------------------*/
void    SwFldDokPage::FillUserData()
{
    String sData( String::CreateFromAscii(
                        RTL_CONSTASCII_STRINGPARAM( USER_DATA_VERSION )));
    sData += ';';
    USHORT nTypeSel = aTypeLB.GetSelectEntryPos();
    if( LISTBOX_ENTRY_NOTFOUND == nTypeSel )
        nTypeSel = USHRT_MAX;
    else
        nTypeSel = (ULONG)aTypeLB.GetEntryData( nTypeSel );
    sData += String::CreateFromInt32( nTypeSel );
    SetUserData(sData);
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.36  2000/09/18 16:05:28  willem.vandorp
    OpenOffice header added.

    Revision 1.35  2000/08/23 11:33:25  os
    CreateFromInt32

    Revision 1.34  2000/06/30 08:52:52  os
    #76541# string assertions removed

    Revision 1.33  2000/05/23 18:36:41  jp
    Bugfixes for Unicode

    Revision 1.32  2000/04/18 15:17:31  os
    UNICODE

    Revision 1.31  2000/02/24 17:57:26  hr
    #73447#: removed temporary

    Revision 1.30  2000/02/11 14:46:18  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.29  1999/03/23 09:51:34  OS
    #61673# Reihenfolge der Seitenfelder besser


      Rev 1.28   23 Mar 1999 10:51:34   OS
   #61673# Reihenfolge der Seitenfelder besser

      Rev 1.27   25 Feb 1999 17:24:50   JP
   Bug #62438#: UserData nur auswerten, wenn kein Refresh ist

      Rev 1.26   21 Jan 1999 09:50:36   OS
   #59900# Fussnoten im Dialog korrekt sortieren; keine prot. Member

      Rev 1.25   12 Jan 1999 11:42:24   OS
   #60579# ausgewaehlten Typ in den UserData speichern

      Rev 1.24   17 Nov 1998 10:50:38   OS
   #58263# NumType durch SvxExtNumType ersetzt

      Rev 1.23   04 Nov 1998 12:11:06   OM
   #58851# Fixe Dateinamenfelder bearbeiten

      Rev 1.22   27 Oct 1998 15:53:24   OM
   #58427# Fixes FilenameField

      Rev 1.21   10 Aug 1998 16:39:58   JP
   Bug #54796#: neue NumerierungsTypen (WW97 kompatibel)

      Rev 1.20   20 May 1998 15:59:52   OM
   Kombinierte DateTime-Formate verarbeiten

      Rev 1.19   20 May 1998 13:24:22   OM
   Offset fuer DateTimeFields

      Rev 1.18   03 Apr 1998 13:16:48   OM
   #49062 Spinbutton fuer Kapitelebenen

      Rev 1.17   26 Mar 1998 17:00:28   OM
   Feldbefehl: Seitenanzahl im Html-Mode

      Rev 1.16   26 Mar 1998 16:43:10   OM
   Feldbefehl: Seitenanzahl im Html-Mode

      Rev 1.15   06 Mar 1998 15:38:30   OM
   Nur bei Aenderung Feld aktualisieren

      Rev 1.14   25 Feb 1998 16:47:58   OM
   Fixe Author- und ExtUser-Felder

      Rev 1.13   16 Feb 1998 10:10:22   OM
   Fuer Solaris nicht direkt von void* auf ushort casten

      Rev 1.12   12 Feb 1998 13:58:24   OM
   #47262# Offset loeschen

      Rev 1.11   14 Jan 1998 10:30:26   OM
   Kapitelfeldebene bearbeiten

      Rev 1.10   09 Jan 1998 16:56:50   OM
   Bei Dok-Wechsel updaten

      Rev 1.9   08 Jan 1998 14:58:24   OM
   Traveling

      Rev 1.8   07 Jan 1998 17:17:42   OM
   Referenzen editieren

      Rev 1.7   05 Jan 1998 17:44:34   OM
   DB-Feldbefehl bearbeiten

      Rev 1.6   19 Dec 1997 18:24:30   OM
   Feldbefehl-bearbeiten Dlg

      Rev 1.5   12 Dec 1997 16:10:06   OM
   AutoUpdate bei FocusWechsel u.a.

      Rev 1.4   11 Dec 1997 16:58:00   OM
   Feldumstellung

      Rev 1.3   20 Nov 1997 17:01:22   OM
   Neuer Felddialog

      Rev 1.2   07 Nov 1997 16:39:32   OM
   NumberFormat-Listbox

      Rev 1.1   05 Nov 1997 15:35:40   OM
   Neuer Feldbefehldialog

      Rev 1.0   04 Nov 1997 10:07:18   OM
   Initial revision.

------------------------------------------------------------------------*/

diff --git a/sw/source/ui/fldui/flddok.hxx b/sw/source/ui/fldui/flddok.hxx
new file mode 100644
index 0000000..066071f
--- /dev/null
+++ b/sw/source/ui/fldui/flddok.hxx
@@ -0,0 +1,141 @@
/*************************************************************************
 *
 *  $RCSfile: flddok.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:36 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWFLDDOK_HXX
#define _SWFLDDOK_HXX

#ifndef _SFXTABDLG_HXX //autogen
#include <sfx2/tabdlg.hxx>
#endif
#ifndef _SV_FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif
#ifndef _SV_LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif
#ifndef _SV_BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif
#ifndef _SV_GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif
#ifndef _SV_EDIT_HXX //autogen
#include <vcl/edit.hxx>
#endif
#ifndef _SV_FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif

#include "numfmtlb.hxx"
#include "fldpage.hxx"

/*--------------------------------------------------------------------
   Beschreibung:
 --------------------------------------------------------------------*/

class SwFldDokPage : public SwFldPage
{
    FixedText           aTypeFT;
    ListBox             aTypeLB;
    FixedText           aSelectionFT;
    ListBox             aSelectionLB;
    FixedText           aValueFT;
    Edit                aValueED;
    NumericField        aLevelED;
    NumericField        aDateOffsetED;
    FixedText           aFormatFT;
    ListBox             aFormatLB;
    NumFormatListBox    aNumFormatLB;
    CheckBox            aFixedCB;

    String              sDateOffset;
    String              sTimeOffset;
    Bitmap              aRootOpened;
    Bitmap              aRootClosed;

    USHORT              nOldSel;
    ULONG               nOldFormat;

    DECL_LINK( TypeHdl, ListBox* pLB = 0 );
    DECL_LINK( FormatHdl, ListBox* pLB = 0 );
    DECL_LINK( SubTypeHdl, ListBox* pLB = 0 );

    void                AddSubType(USHORT nTypeId);
    USHORT              FillFormatLB(USHORT nTypeId);

protected:
    virtual USHORT      GetGroup();

public:
                        SwFldDokPage(Window* pWindow, const SfxItemSet& rSet);

                        ~SwFldDokPage();

    static SfxTabPage*  Create(Window* pParent, const SfxItemSet& rAttrSet);

    virtual BOOL        FillItemSet( SfxItemSet& rSet );
    virtual void        Reset( const SfxItemSet& rSet );

    virtual void        FillUserData();
};


#endif

diff --git a/sw/source/ui/fldui/flddok.src b/sw/source/ui/fldui/flddok.src
new file mode 100644
index 0000000..2e7afc5
--- /dev/null
+++ b/sw/source/ui/fldui/flddok.src
@@ -0,0 +1,367 @@
/*************************************************************************
 *
 *  $RCSfile: flddok.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:36 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "globals.hrc"
#include "fldtdlg.hrc"
#include "helpid.h"
TabPage TP_FLD_DOK
{
    HelpID = HID_FLD_DOK ;
    SVLook = TRUE ;
    Hide = TRUE ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Text = "Dokument" ;
    Text [ ENGLISH ] = "Document" ;
    FixedText FT_DOKTYPE
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 76 , 10 ) ;
        Text = "~Feldtyp" ;
        Text [ ENGLISH ] = "Type" ;
        Text [ norwegian ] = "Type" ;
        Text [ italian ] = "~Tipo di campo" ;
        Text [ portuguese_brazilian ] = "Tipo" ;
        Text [ portuguese ] = "~Tipo" ;
        Text [ finnish ] = "Laji" ;
        Text [ danish ] = "Felttype" ;
        Text [ french ] = "~Type de champ" ;
        Text [ swedish ] = "~Fälttyp" ;
        Text [ dutch ] = "~Veldtype" ;
        Text [ spanish ] = "~Tipo de campo" ;
        Text [ english_us ] = "~Type" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "×Ö¶ÎÀàÐÍ(~T)";
        Text[ russian ] = "Òèï ïîëÿ";
        Text[ polish ] = "Typ pola";
        Text[ japanese ] = "̨°ÙÄނ̎í—Þ(~T)";
        Text[ chinese_traditional ] = "Ãþ«¬(~T)";
        Text[ arabic ] = "äæÚ ÇáÍÞá";
        Text[ greek ] = "~Ôýðïò ðåäßïõ";
        Text[ korean ] = "ÇüÅÂ(~T)";
        Text[ turkish ] = "~Alan tipi";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_DOKTYPE
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 6 , 16 ) ;
        Size = MAP_APPFONT ( 76 , 113 ) ;
        TabStop = TRUE ;
        Sort = TRUE ;
        AutoHScroll = TRUE ;
    };
    FixedText FT_DOKSELECTION
    {
        Pos = MAP_APPFONT ( 88 , 3 ) ;
        Size = MAP_APPFONT ( 76 , 10 ) ;
        Text = "~Auswahl" ;
        Text [ ENGLISH ] = "Selection" ;
        Text [ norwegian ] = "Selection" ;
        Text [ italian ] = "Selezione" ;
        Text [ portuguese_brazilian ] = "Seleção" ;
        Text [ portuguese ] = "~Selecção" ;
        Text [ finnish ] = "Valinta" ;
        Text [ danish ] = "Udvalg" ;
        Text [ french ] = "~Sélection" ;
        Text [ swedish ] = "Urv~al" ;
        Text [ dutch ] = "~Selectie" ;
        Text [ spanish ] = "Se~lección" ;
        Text [ english_us ] = "S~elect" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "Ñ¡Ôñ(~E)";
        Text[ russian ] = "Âûáîð";
        Text[ polish ] = "Wybór";
        Text[ japanese ] = "‘I‘ð(~E)";
        Text[ chinese_traditional ] = "¿ï¨ú(~E)";
        Text[ arabic ] = "ÇáÊÍÏíÏ";
        Text[ greek ] = "~ÅðéëïãÞ";
        Text[ korean ] = "¼±ÅÃ(~E)";
        Text[ turkish ] = "~Seçim";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_DOKSELECTION
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 88 , 16 ) ;
        Size = MAP_APPFONT ( 76 , 113 ) ;
         // Keine Sortierung auf Wunsch von MA (wg. Absender)
         //        Sort = TRUE;
        TabStop = TRUE ;
    };
    FixedText FT_DOKFORMAT
    {
        Pos = MAP_APPFONT ( 170 , 3 ) ;
        Size = MAP_APPFONT ( 84 , 10 ) ;
        TEXT = "F~ormat" ;
        TEXT [ English ] = "Format" ;
        Left = TRUE ;
        Text [ english_us ] = "F~ormat" ;
        Text [ portuguese_brazilian ] = "F~ormat" ;
        Text [ swedish ] = "F~ormat" ;
        Text [ danish ] = "Format" ;
        Text [ italian ] = "F~ormato" ;
        Text [ spanish ] = "F~ormato" ;
        Text [ french ] = "F~ormat" ;
        Text [ dutch ] = "~Notatie" ;
        Text [ portuguese ] = "F~ormato" ;
        Text[ chinese_simplified ] = "¸ñʽ(~O)";
        Text[ russian ] = "Ôîðìàò";
        Text[ polish ] = "Format";
        Text[ japanese ] = "‘Ž®(~O)";
        Text[ chinese_traditional ] = "®æ¦¡(~O)";
        Text[ arabic ] = "ÇáÊäÓíÞ";
        Text[ greek ] = "Ì~ïñöÞ";
        Text[ korean ] = "¼­½Ä(~O)";
        Text[ turkish ] = "F~ormat";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_DOKFORMAT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 170 , 16 ) ;
         //     Size = MAP_APPFONT ( 84 , 82 ) ;
        Size = MAP_APPFONT ( 84 , 98 ) ;
        TabStop = TRUE ;
        DropDown = FALSE ;
        Sort = TRUE ;
        AutoHScroll = TRUE ;
    };
    ListBox LB_DOKNUMFORMAT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 170 , 16 ) ;
         //     Size = MAP_APPFONT ( 84 , 82 ) ;
        Size = MAP_APPFONT ( 84 , 98 ) ;
        TabStop = TRUE ;
        AutoHScroll = TRUE ;
        Hide = TRUE ;
    };
    FixedText FT_DOKVALUE
    {
        Pos = MAP_APPFONT ( 170 , 105 ) ;
        Size = MAP_APPFONT ( 84 , 10 ) ;
        TEXT = "Ko~rrektur" ;
        TEXT [ English ] = "Offs~et" ;
        TEXT [ norwegian ] = "Offset" ;
        TEXT [ italian ] = "~Correzione" ;
        TEXT [ portuguese_brazilian ] = "Deslocar" ;
        TEXT [ portuguese ] = "~Correcção" ;
        TEXT [ finnish ] = "Siirroa" ;
        TEXT [ danish ] = "Korrektion" ;
        TEXT [ french ] = "C~orrecture" ;
        TEXT [ swedish ] = "Ko~rrigering" ;
        TEXT [ dutch ] = "~Correctie" ;
        TEXT [ spanish ] = "~Corrección" ;
        TEXT [ english_us ] = "O~ffset" ;
        Left = TRUE ;
        Hide = TRUE ;
        TEXT[ chinese_simplified ] = "ÐÞ¸Ä(~F)";
        TEXT[ russian ] = "Êîððåêòèðîâêà";
        TEXT[ polish ] = "Korekta";
        TEXT[ japanese ] = "C³(~F)";
        TEXT[ chinese_traditional ] = "­×§ï(~F)";
        TEXT[ arabic ] = "ÇáÊÕÍíÍ";
        TEXT[ greek ] = "Äéüñèùóç";
        TEXT[ korean ] = "¼öÁ¤(~F)";
        TEXT[ turkish ] = "Düzeltme";
        TEXT[ language_user1 ] = " ";
    };
    Edit ED_DOKVALUE
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 170 , 117 ) ;
        Size = MAP_APPFONT ( 84 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Hide = TRUE ;
    };
    NumericField ED_DOKLEVEL
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 170 , 117 ) ;
        Size = MAP_APPFONT ( 84 , 12 ) ;
        Text = "1" ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Hide = TRUE ;
        Minimum = 1 ;
        Maximum = 10 ;
        First = 1 ;
        SpinSize = 1 ;
    };
    NumericField ED_DOKDATEOFF
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 170 , 117 ) ;
        Size = MAP_APPFONT ( 84 , 12 ) ;
        Text = "0" ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Hide = TRUE ;
        SpinSize = 1 ;
    };
    CheckBox CB_DOKFIXEDCONTENT
    {
        Pos = MAP_APPFONT ( 170 , 120 ) ;
        Size = MAP_APPFONT ( 72 , 10 ) ;
        TEXT = "~Inhalt fixieren" ;
        TEXT [ English ] = "Fixed content" ;
        TabStop = TRUE ;
        Text [ english_us ] = "~Fixed content" ;
        Text [ portuguese_brazilian ] = "~Inhalt fixieren" ;
        Text [ swedish ] = "Fixera ~innehåll" ;
        Text [ danish ] = "Fast indhold" ;
        Text [ italian ] = "~Fissa il contenuto" ;
        Text [ spanish ] = "~Fijar contenido" ;
        Text [ french ] = "Contenu f~ixe" ;
        Text [ dutch ] = "~Inhoud fixeren" ;
        Text [ portuguese ] = "Conteúdo ~fixo" ;
        Text[ chinese_simplified ] = "¹Ì¶¨ÄÚÈÝ(~F)";
        Text[ russian ] = "Çàôèêñèðîâàòü ñîäåðæàíèå";
        Text[ polish ] = "Sta³a treœæ";
        Text[ japanese ] = "“à—e‚̌Œè(~F)";
        Text[ chinese_traditional ] = "©T©w¤º®e(~F)";
        Text[ arabic ] = "ÊËÈíÊ ÇáãÍÊæíÇÊ";
        Text[ greek ] = "Ðáãßùóç ðåñ~éå÷ïìÝíùí";
        Text[ korean ] = "³»¿ë °íÁ¤(~F)";
        Text[ turkish ] = "Ýçeriði sabitle";
        Text[ language_user1 ] = " ";
    };
    Bitmap BMP_DOKROOT_OPENED
    {
        File = "plus.bmp" ;
    };
    Bitmap BMP_DOKROOT_CLOSED
    {
        File = "minus.bmp" ;
    };
    String STR_DOKDATEOFF
    {
        TEXT = "Ko~rrektur in Tagen" ;
        TEXT [ English ] = "Offs~et in days" ;
        Text [ english_us ] = "Offs~et in days" ;
        Text [ portuguese_brazilian ] = "Ko~rrektur in Tagen" ;
        Text [ swedish ] = "Ko~rrigering i dagar" ;
        Text [ danish ] = "Korrektion i dage" ;
        Text [ italian ] = "Correzione in ~giorni" ;
        Text [ spanish ] = "~Corrección en días" ;
        Text [ french ] = "Co~rrection en jours" ;
        Text [ dutch ] = "Co~rrectie in dagen" ;
        Text [ portuguese ] = "Co~rrecção em dias" ;
        Text[ chinese_simplified ] = "ÐÞ¸ÄÌìÊý(~E)";
        Text[ russian ] = "Êîððåêòèðîâêà äíåé";
        Text[ polish ] = "Korekta dni";
        Text[ japanese ] = "“ú‚̏C³(~E)";
        Text[ chinese_traditional ] = "­×§ï¤é´Áªº¤Ñ¼Æ(~E)";
        Text[ arabic ] = "ÇáÊÕÍíÍ ÈÇáÃíÇã";
        Text[ greek ] = "Äéüñèùóç óå çìÝñåò";
        Text[ korean ] = "¸çÄ¥ ¾È¿¡ ¼öÁ¤(~E)";
        Text[ turkish ] = "Düzeltme (gün)";
        Text[ language_user1 ] = " ";
    };
    String STR_DOKTIMEOFF
    {
        TEXT = "Ko~rrektur in Minuten" ;
        TEXT [ English ] = "Offs~et in minutes" ;
        Text [ english_us ] = "Offs~et in minutes" ;
        Text [ portuguese_brazilian ] = "Ko~rrektur in Minuten" ;
        Text [ swedish ] = "Ko~rrigering i minuter" ;
        Text [ danish ] = "Korrektion i minutter" ;
        Text [ italian ] = "Co~rrezione in minuti" ;
        Text [ spanish ] = "~Corrección en minutos" ;
        Text [ french ] = "Co~rrection en minutes" ;
        Text [ dutch ] = "Co~rrectie in minuten" ;
        Text [ portuguese ] = "Co~rrecção em minutos" ;
        Text[ chinese_simplified ] = "Ð޸ķÖÖÓÉ趨(~E)";
        Text[ russian ] = "Êîððåêòèðîâêà ìèíóò";
        Text[ polish ] = "Korekta minut";
        Text[ japanese ] = "•ª‚̏C³(~E)";
        Text[ chinese_traditional ] = "­×§ï¤ÀÄÁ³]©w(~E)";
        Text[ arabic ] = "ÇáÊÕÍíÍ ÈÇáÏÞÇÆÞ";
        Text[ greek ] = "Äéüñèùóç óå ëåðôÜ";
        Text[ korean ] = "¸î ºÐ³» ¼öÁ¤(~E)";
        Text[ turkish ] = "Düzeltme (dakika)";
        Text[ language_user1 ] = " ";
    };
    Text [ english_us ] = "Document" ;
    Text [ portuguese_brazilian ] = "Dokument" ;
    Text [ swedish ] = "Dokument" ;
    Text [ danish ] = "Dokument" ;
    Text [ italian ] = "Documento" ;
    Text [ spanish ] = "Documento" ;
    Text [ french ] = "Document" ;
    Text [ dutch ] = "Document" ;
    Text [ portuguese ] = "Documento" ;
    Text[ chinese_simplified ] = "Îĵµ";
    Text[ russian ] = "Äîêóìåíò";
    Text[ polish ] = "Dokument";
    Text[ japanese ] = "•¶‘";
    Text[ chinese_traditional ] = "¤å¥ó";
    Text[ arabic ] = "ÇáãÓÊäÏ";
    Text[ greek ] = "¸ããñáöï";
    Text[ korean ] = "¹®¼­";
    Text[ turkish ] = "Belge";
    Text[ language_user1 ] = " ";
};
diff --git a/sw/source/ui/fldui/fldedt.cxx b/sw/source/ui/fldui/fldedt.cxx
new file mode 100644
index 0000000..5677a70
--- /dev/null
+++ b/sw/source/ui/fldui/fldedt.cxx
@@ -0,0 +1,505 @@
/*************************************************************************
 *
 *  $RCSfile: fldedt.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:36 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SV_MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _BASEDLGS_HXX //autogen
#include <sfx2/basedlgs.hxx>
#endif
#ifndef _SFXVIEWFRM_HXX //autogen
#include <sfx2/viewfrm.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SVX_ADRITEM_HXX //autogen
#include <svx/adritem.hxx>
#endif
#ifndef _SVX_OPTGENRL_HXX //autogen
#include <svx/optgenrl.hxx>
#endif

#ifndef _ADDRDLG_HXX
#include <addrdlg.hxx>
#endif
#ifndef _DOCUFLD_HXX
#include <docufld.hxx>
#endif
#ifndef _FINDER_HXX
#include <finder.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _FLDBAS_HXX
#include <fldbas.hxx>
#endif
#ifndef _DBFLD_HXX
#include <dbfld.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _FLDDB_HXX
#include <flddb.hxx>
#endif
#ifndef _FLDDINF_HXX
#include <flddinf.hxx>
#endif
#ifndef _FLDVAR_HXX
#include <fldvar.hxx>
#endif
#ifndef _FLDDOK_HXX
#include <flddok.hxx>
#endif
#ifndef _FLDFUNC_HXX
#include <fldfunc.hxx>
#endif
#ifndef _FLDREF_HXX
#include <fldref.hxx>
#endif
#ifndef _FLDEDT_HXX
#include <fldedt.hxx>
#endif


#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _HELPID_H
#include <helpid.h>
#endif
#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif
#ifndef _FLDUI_HRC
#include <fldui.hrc>
#endif


/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SwFldEditDlg::SwFldEditDlg(SwView& rVw) :
    SfxSingleTabDialog(&rVw.GetViewFrame()->GetWindow(), 0, 0),
    pSh         (rVw.GetWrtShellPtr()),
    aAddressBT  (this, SW_RES(PB_FLDEDT_ADDRESS)),
    aPrevBT     (this, SW_RES(BTN_FLDEDT_PREV)),
    aNextBT     (this, SW_RES(BTN_FLDEDT_NEXT))
{
    SwFldMgr aMgr(pSh);

    SwField *pCurFld = aMgr.GetCurFld();
    if(!pCurFld)
        return;

    pSh->SetCareWin(this);
    pSh->Right(TRUE);
    pSh->SwapPam();
    USHORT nGroup = aMgr.GetGroup(FALSE, pCurFld->GetTypeId(), pCurFld->GetSubType());

    CreatePage(nGroup);

    GetOKButton()->SetClickHdl(LINK(this, SwFldEditDlg, OKHdl));

    // Buttons selbst positionieren, da sie sonst bei unterschiedlichen
    // Fontgroessen im Wald stehen, und da PB im SingleTabDlg feste Pixelgroessen
    // fuer seine Buttons und die Dialogbreite verwendet.
    aPrevBT.SetPosPixel(Point(GetOKButton()->GetPosPixel().X(), aPrevBT.GetPosPixel().Y()));
    USHORT nWidth = GetOKButton()->GetOutputSize().Width() / 2 - 3;
    Size aNewSize(LogicToPixel(Size(nWidth, GetOKButton()->GetOutputSize().Height())));
    aPrevBT.SetSizePixel(aNewSize);

    aNextBT.SetSizePixel(aPrevBT.GetSizePixel());

    long nXPos = GetOKButton()->GetPosPixel().X() + GetOKButton()->GetSizePixel().Width()
                    - aNextBT.GetSizePixel().Width() - 1;
    aNextBT.SetPosPixel(Point(nXPos, aNextBT.GetPosPixel().Y()));

    aAddressBT.SetPosPixel(Point(GetOKButton()->GetPosPixel().X(), aAddressBT.GetPosPixel().Y()));
    aAddressBT.SetSizePixel(GetOKButton()->GetSizePixel());

    aPrevBT.SetClickHdl(LINK(this, SwFldEditDlg, NextPrevHdl));
    aNextBT.SetClickHdl(LINK(this, SwFldEditDlg, NextPrevHdl));

    aAddressBT.SetClickHdl(LINK(this, SwFldEditDlg, AddressHdl));
    aAddressBT.SetHelpId(HID_FLDEDT_ADDRESS);

    Init();
}

/*--------------------------------------------------------------------
    Beschreibung: Controlls initialisieren
 --------------------------------------------------------------------*/

void SwFldEditDlg::Init()
{
    SwFldPage* pPage = (SwFldPage*)GetTabPage();

    if( pPage )
    {
        SwFldMgr& rMgr = pPage->GetFldMgr();

        SwField *pCurFld = rMgr.GetCurFld();

        if(!pCurFld)
            return;

        // Traveling nur bei mehr als einem Feld
        pSh->StartAction();
        pSh->CreateCrsr();

        BOOL bMove = rMgr.GoNext();
        if( bMove )
            rMgr.GoPrev();
        aNextBT.Enable(bMove);

        if( 0 != ( bMove = rMgr.GoPrev() ) )
            rMgr.GoNext();
        aPrevBT.Enable( bMove );

        if (pCurFld->GetTypeId() == TYP_EXTUSERFLD)
            aAddressBT.Show();

        pSh->DestroyCrsr();
        pSh->EndAction();
    }

    GetOKButton()->Enable( !pSh->IsReadOnlyAvailable() ||
                           !pSh->HasReadonlySel() );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SfxTabPage* SwFldEditDlg::CreatePage(USHORT nGroup)
{
    // TabPage erzeugen
    SfxTabPage* pPage = 0;
    USHORT nHelpId = 0;

    switch (nGroup)
    {
        case GRP_DOC:
            pPage = SwFldDokPage::Create(this, *(SfxItemSet*)0);
            nHelpId = HID_EDIT_FLD_DOK;
            break;
        case GRP_FKT:
            pPage = SwFldFuncPage::Create(this, *(SfxItemSet*)0);
            nHelpId = HID_EDIT_FLD_FUNC;
            break;
        case GRP_REF:
            pPage = SwFldRefPage::Create(this, *(SfxItemSet*)0);
            nHelpId = HID_EDIT_FLD_REF;
            break;
        case GRP_REG:
            pPage = SwFldDokInfPage::Create(this, *(SfxItemSet*)0);
            nHelpId = HID_EDIT_FLD_DOKINF;
            break;
        case GRP_DB:
            pPage = SwFldDBPage::Create(this, *(SfxItemSet*)0);
            nHelpId = HID_EDIT_FLD_DB;
            break;
        case GRP_VAR:
            pPage = SwFldVarPage::Create(this, *(SfxItemSet*)0);
            nHelpId = HID_EDIT_FLD_VAR;
            break;

    }
    pPage->SetHelpId(nHelpId);
    SetTabPage(pPage);

    String sTitle(GetText());
    sTitle.Insert(String::CreateFromAscii(": "), 0);
    sTitle.Insert(SW_RESSTR(STR_FLD_EDIT_DLG), 0);
    SetText(sTitle);

    return pPage;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SwFldEditDlg::~SwFldEditDlg()
{
    pSh->SetCareWin(NULL);
    pSh->EnterStdMode();
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwFldEditDlg::EnableInsert(BOOL bEnable)
{
    if( bEnable && pSh->IsReadOnlyAvailable() && pSh->HasReadonlySel() )
        bEnable = FALSE;
    GetOKButton()->Enable( bEnable );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwFldEditDlg::InsertHdl()
{
    GetOKButton()->Click();
}

/*--------------------------------------------------------------------
     Beschreibung: Aendern des Feldes anstossen
 --------------------------------------------------------------------*/

IMPL_LINK( SwFldEditDlg, OKHdl, Button *, pBtn )
{
    if (GetOKButton()->IsEnabled())
    {
        SfxTabPage* pPage = GetTabPage();
        if (pPage)
        {
            pPage->FillItemSet(*(SfxItemSet*)0);

        }
        EndDialog( RET_OK );
    }

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

short SwFldEditDlg::Execute()
{
    // Ohne TabPage kein Dialog
    return GetTabPage() ? Dialog::Execute() : RET_CANCEL;
}

/*--------------------------------------------------------------------
    Beschreibung: Traveling zwishen Feldern gleichen Typs
 --------------------------------------------------------------------*/

IMPL_LINK( SwFldEditDlg, NextPrevHdl, Button *, pButton )
{
    BOOL bNext = pButton == &aNextBT;

    pSh->EnterStdMode();

    SwFieldType *pOldTyp = 0;
    SwFldPage* pPage = (SwFldPage*)GetTabPage();
    SwFldMgr& rMgr = pPage->GetFldMgr();
    SwField *pCurFld = rMgr.GetCurFld();

    if (pCurFld->GetTypeId() == TYP_DBFLD)
        pOldTyp = (SwDBFieldType*)pCurFld->GetTyp();

    if( GetOKButton()->IsEnabled() )
        pPage->FillItemSet(*(SfxItemSet*)0);

    rMgr.GoNextPrev( bNext, pOldTyp );
    pCurFld = rMgr.GetCurFld();
    pSh->Right(TRUE);
    pSh->SwapPam();

    USHORT nGroup = rMgr.GetGroup(FALSE, pCurFld->GetTypeId(), pCurFld->GetSubType());

    if (nGroup != pPage->GetGroup())
        pPage = (SwFldPage*)CreatePage(nGroup);

    pPage->EditNewField();

    Init();

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwFldEditDlg, AddressHdl, PushButton *, pButton )
{
    SwFldPage* pPage = (SwFldPage*)GetTabPage();
    SwFldMgr& rMgr = pPage->GetFldMgr();
    SwField *pCurFld = rMgr.GetCurFld();

    SfxItemSet aSet( pSh->GetAttrPool(),
                        SID_ATTR_ADDRESS, SID_ATTR_ADDRESS,
                        SID_FIELD_GRABFOCUS, SID_FIELD_GRABFOCUS,
                        0L );
    SvxAddressItem aAddress( pPathFinder->GetAddress() );
    aSet.Put(aAddress);
    USHORT nEditPos = UNKNOWN_EDIT;

    switch(pCurFld->GetSubType())
    {
        case EU_FIRSTNAME:  nEditPos = FIRSTNAME_EDIT;  break;
        case EU_NAME:       nEditPos = LASTNAME_EDIT;   break;
        case EU_SHORTCUT:   nEditPos = SHORTNAME_EDIT;  break;
        case EU_COMPANY:    nEditPos = COMPANY_EDIT;    break;
        case EU_STREET:     nEditPos = STREET_EDIT;     break;
        case EU_TITLE:      nEditPos = TITLE_EDIT;      break;
        case EU_POSITION:   nEditPos = POSITION_EDIT;   break;
        case EU_PHONE_PRIVATE:nEditPos = TELPRIV_EDIT;  break;
        case EU_PHONE_COMPANY:nEditPos = TELCOMPANY_EDIT;   break;
        case EU_FAX:        nEditPos = FAX_EDIT;        break;
        case EU_EMAIL:      nEditPos = EMAIL_EDIT;      break;
        case EU_COUNTRY:    nEditPos = COUNTRY_EDIT;    break;
        case EU_ZIP:        nEditPos = PLZ_EDIT;        break;
        case EU_CITY:       nEditPos = CITY_EDIT;       break;
        case EU_STATE:      nEditPos = STATE_EDIT;      break;

        default:            nEditPos = UNKNOWN_EDIT;    break;

    }
    aSet.Put(SfxUInt16Item(SID_FIELD_GRABFOCUS, nEditPos));
    SwAddrDlg aDlg( this, aSet );
    aDlg.Execute();
    const SfxItemSet* pSfxItemSet = aDlg.GetOutputItemSet();
    const SvxAddressItem* pAddrItem;

    if( pSfxItemSet && SFX_ITEM_SET == pSfxItemSet->GetItemState(SID_ATTR_ADDRESS,
            FALSE, (const SfxPoolItem**)&pAddrItem) )
    {
        pPathFinder->SetAddress( (SvxAddressItem&)*pAddrItem );
        pSh->UpdateFlds( *pCurFld );
    }

    return 0;
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.146  2000/09/18 16:05:28  willem.vandorp
    OpenOffice header added.

    Revision 1.145  2000/05/10 11:55:12  os
    Basic API removed

    Revision 1.144  2000/04/18 15:17:31  os
    UNICODE

    Revision 1.143  2000/02/11 14:46:27  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.142  1999/09/21 14:05:23  os
    SwExtUserSubType: language

    Revision 1.141  1999/01/20 13:16:52  JP
    Task #58677#: Crsr in Readonly Bereichen zulassen


      Rev 1.140   20 Jan 1999 14:16:52   JP
   Task #58677#: Crsr in Readonly Bereichen zulassen

      Rev 1.139   15 Oct 1998 16:02:48   OM
   #57965# Variablennamen fuer Eingabefeld verwenden

      Rev 1.138   19 Aug 1998 17:22:12   JP
   Bug #55247#: fuers MoveNext-/-PrevFldType einen eigenen Pam verwenden

      Rev 1.137   15 Jun 1998 13:07:50   OM
   #50908# Positionskorrektur der Imagebuttons

      Rev 1.136   08 Apr 1998 09:48:52   OM
   #47470 Neue HelpIDs beim bearbeiten von Felbefehlen

      Rev 1.135   06 Mar 1998 14:53:52   OM
   Nur bei Aenderung Feld aktualisieren

      Rev 1.134   03 Mar 1998 15:26:56   OM
   Feld beim traveln selektieren

      Rev 1.133   25 Feb 1998 16:56:48   OM
   Fixe Author- und ExtUser-Felder

      Rev 1.132   06 Feb 1998 14:17:04   OM
   #47145# Buttongroesse anpassen

      Rev 1.131   09 Jan 1998 16:56:50   OM
   Bei Dok-Wechsel updaten

      Rev 1.130   08 Jan 1998 16:16:26   OM
   Traveling

      Rev 1.129   08 Jan 1998 13:36:20   OM
   Feldbefehl-Traveling

      Rev 1.128   08 Jan 1998 12:56:24   OM
   Feldbefehl-Traveling

      Rev 1.127   16 Dec 1997 17:01:40   OM
   Feldbefehle bearbeiten

------------------------------------------------------------------------*/

diff --git a/sw/source/ui/fldui/fldfunc.cxx b/sw/source/ui/fldui/fldfunc.cxx
new file mode 100644
index 0000000..06bea46
--- /dev/null
+++ b/sw/source/ui/fldui/fldfunc.cxx
@@ -0,0 +1,779 @@
/*************************************************************************
 *
 *  $RCSfile: fldfunc.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:36 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif

#ifndef _BASOBJ_HXX //autogen
#include <basctl/basobj.hxx>
#endif

#ifndef _BASMGR_HXX //autogen
#include <basic/basmgr.hxx>
#endif

#ifndef _SB_SBSTAR_HXX //autogen
#include <basic/sbstar.hxx>
#endif

#ifndef _SB_SBMOD_HXX //autogen
#include <basic/sbmod.hxx>
#endif

#ifndef _SWDOCSH_HXX //autogen
#include <docsh.hxx>
#endif
#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif
#ifndef _FLDBAS_HXX
#include <fldbas.hxx>
#endif
#ifndef _DOCUFLD_HXX
#include <docufld.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _FLDFUNC_HXX
#include <fldfunc.hxx>
#endif

#ifndef _FLDUI_HRC
#include <fldui.hrc>
#endif
#ifndef _FLDTDLG_HRC
#include <fldtdlg.hrc>
#endif

#define USER_DATA_VERSION_1 "1"
#define USER_DATA_VERSION USER_DATA_VERSION_1
/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SwFldFuncPage::SwFldFuncPage(Window* pParent, const SfxItemSet& rCoreSet ) :
    SwFldPage( pParent, SW_RES( TP_FLD_FUNC ), rCoreSet ),

    aTypeFT     (this, SW_RES(FT_FUNCTYPE)),
    aTypeLB     (this, SW_RES(LB_FUNCTYPE)),
    aSelectionFT(this, SW_RES(FT_FUNCSELECTION)),
    aSelectionLB(this, SW_RES(LB_FUNCSELECTION)),
    aFormatFT   (this, SW_RES(FT_FUNCFORMAT)),
    aFormatLB   (this, SW_RES(LB_FUNCFORMAT)),
    aNameFT     (this, SW_RES(FT_FUNCNAME)),
    aNameED     (this, SW_RES(ED_FUNCNAME)),
    aValueFT    (this, SW_RES(FT_FUNCVALUE)),
    aValueED    (this, SW_RES(ED_FUNCVALUE)),
    aCond1FT    (this, SW_RES(FT_FUNCCOND1)),
    aCond1ED    (this, SW_RES(ED_FUNCCOND1)),
    aCond2FT    (this, SW_RES(FT_FUNCCOND2)),
    aCond2ED    (this, SW_RES(ED_FUNCCOND2)),
    aMacroBT    (this, SW_RES(BT_FUNCMACRO))
{
    FreeResource();

    aNameED.SetPosPixel(Point(aNameED.GetPosPixel().X(), aFormatLB.GetPosPixel().Y()));

    sOldValueFT = aValueFT.GetText();
    sOldNameFT = aNameFT.GetText();

    aCond1ED.ShowBrackets(FALSE);
    aCond2ED.ShowBrackets(FALSE);

//  SwWrtShell* pSh = (SwWrtShell*)ViewShell::GetCurrShell();
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

__EXPORT SwFldFuncPage::~SwFldFuncPage()
{
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void __EXPORT SwFldFuncPage::Reset(const SfxItemSet& rSet)
{
    SavePos(&aTypeLB);
    Init(); // Allgemeine initialisierung

    aTypeLB.SetUpdateMode(FALSE);
    aTypeLB.Clear();

    USHORT nPos, nTypeId;
    BOOL bPage = FALSE;

    if (!IsFldEdit())
    {
        // TypeListBox initialisieren
        const SwFldGroupRgn& rRg = GetFldMgr().GetGroupRange(IsFldDlgHtmlMode(), GetGroup());

        // Typ-Listbox fuellen
        for(short i = rRg.nStart; i < rRg.nEnd; ++i)
        {
            nTypeId = GetFldMgr().GetTypeId(i);
            nPos = aTypeLB.InsertEntry(GetFldMgr().GetTypeStr(i));
            aTypeLB.SetEntryData(nPos, (void*)nTypeId);
        }
    }
    else
    {
        nTypeId = GetCurField()->GetTypeId();
        nPos = aTypeLB.InsertEntry(GetFldMgr().GetTypeStr(GetFldMgr().GetPos(nTypeId)));
        aTypeLB.SetEntryData(nPos, (void*)nTypeId);

        if (nTypeId == TYP_MACROFLD)
        {
            String sName(GetCurField()->GetPar1());
            BasicManager *pBasMgr = 0;
            GetFldMgr().SetMacroModule(0);

            if (sName.GetToken( 0, '.') == SFX_APP()->GetName())
                pBasMgr = SFX_APP()->GetBasicManager();
            else
            {
                SwWrtShell *pSh = ::GetActiveView()->GetWrtShellPtr();
                pBasMgr = pSh->GetView().GetDocShell()->GetBasicManager();
            }

            if (pBasMgr)
            {
                String sLibName(sName.GetToken(1, '.'));
                StarBASIC* pBasic = pBasMgr->GetLib(sLibName);

                if (pBasic)
                {
                    SbModule* pModule = BasicIDE::FindModule( pBasic, sName.GetToken( 2, '.') );
                    GetFldMgr().SetMacroModule(pModule);
                }
            }

            if (sName.Len())
            {
                // Inhalt von sName umdrehen
                String sBuf;
                String sTmp;
                USHORT nPos = 0;
                USHORT nCount = sName.GetTokenCount('.');

                for (int i = nCount - 1; i >= nCount - 4; i--)
                {
                    if (i == nCount - 4)
                    {
                        nPos = 0;
                        sName.GetToken(i, '.', nPos);
                        sTmp = sName.Copy(0, nPos - 1);
                    }
                    else
                    {
                        sTmp = sName.GetToken(i, '.');
                        sTmp += '.';
                    }

                    sBuf += sTmp;
                }

                sName = sBuf;
            }

            GetFldMgr().SetMacroPath(sName);
        }
    }

    // alte Pos selektieren
    RestorePos(&aTypeLB);

    aTypeLB.SetDoubleClickHdl       (LINK(this, SwFldFuncPage, InsertHdl));
    aTypeLB.SetSelectHdl            (LINK(this, SwFldFuncPage, TypeHdl));
    aSelectionLB.SetSelectHdl       (LINK(this, SwFldFuncPage, SelectHdl));
    aSelectionLB.SetDoubleClickHdl  (LINK(this, SwFldFuncPage, InsertMacroHdl));
    aFormatLB.SetDoubleClickHdl     (LINK(this, SwFldFuncPage, InsertHdl));
    aMacroBT.SetClickHdl            (LINK(this, SwFldFuncPage, MacroHdl));

    if( !IsRefresh() )
    {
        String sUserData = GetUserData();
        if(sUserData.GetToken(0, ';').EqualsIgnoreCaseAscii(USER_DATA_VERSION_1))
        {
            String sVal = sUserData.GetToken(1, ';');
            USHORT nVal = sVal.ToInt32();
            if(nVal != USHRT_MAX)
            {
                for(USHORT i = 0; i < aTypeLB.GetEntryCount(); i++)
                    if(nVal == (USHORT)(ULONG)aTypeLB.GetEntryData(i))
                    {
                        aTypeLB.SelectEntryPos(i);
                        break;
                    }
            }
        }
    }
    TypeHdl(0);

    aTypeLB.SetUpdateMode(TRUE);

    if (IsFldEdit())
    {
        aNameED.SaveValue();
        aValueED.SaveValue();
        aCond1ED.SaveValue();
        aCond2ED.SaveValue();
        nOldFormat = GetCurField()->GetFormat();
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwFldFuncPage, TypeHdl, ListBox *, pBox )
{
    // Alte ListBoxPos sichern
    const USHORT nOld = GetTypeSel();

    // Aktuelle ListBoxPos
    SetTypeSel(aTypeLB.GetSelectEntryPos());

    if(GetTypeSel() == LISTBOX_ENTRY_NOTFOUND)
    {
        SetTypeSel(0);
        aTypeLB.SelectEntryPos(0);
    }

    if (nOld != GetTypeSel())
    {
        USHORT nTypeId = (USHORT)(ULONG)aTypeLB.GetEntryData(GetTypeSel());

        // Auswahl-Listbox fuellen
        UpdateSubType();

        // Format-Listbox fuellen
        aFormatLB.Clear();

        USHORT nSize = GetFldMgr().GetFormatCount(nTypeId, FALSE, IsFldDlgHtmlMode());

        for (USHORT i = 0; i < nSize; i++)
        {
            USHORT nPos = aFormatLB.InsertEntry(GetFldMgr().GetFormatStr(nTypeId, i));
            aFormatLB.SetEntryData( nPos, (void*)GetFldMgr().GetFormatId( nTypeId, i ) );
        }

        if (nSize)
        {
            if (IsFldEdit() && nTypeId == TYP_JUMPEDITFLD)
                aFormatLB.SelectEntry(SW_RESSTR(FMT_MARK_BEGIN + (USHORT)GetCurField()->GetFormat()));

            if (!aFormatLB.GetSelectEntryCount())
                aFormatLB.SelectEntryPos(0);
        }

        BOOL bValue = FALSE, bName = FALSE, bMacro = FALSE, bInsert = TRUE;
        BOOL bShowSelection = FALSE;
        BOOL bFormat = nSize != 0;

        // fuer Conditional Text zwei Controls
        if(nTypeId != TYP_CONDTXTFLD)
        {
            aCond1FT.Hide();
            aCond1ED.Hide();
            aCond2FT.Hide();
            aCond2ED.Hide();
            aValueFT.Show();
            aValueED.Show();
        }
        aNameED.EnableDrop(FALSE);

        if (IsFldEdit())
        {
            aNameED.SetText(GetCurField()->GetPar1());
            aValueED.SetText(GetCurField()->GetPar2());
        }
        else
        {
            aNameED.SetText(aEmptyStr);
            aValueED.SetText(aEmptyStr);
        }

        if (aNameFT.GetText() != sOldNameFT)
            aNameFT.SetText(sOldNameFT);
        if (aValueFT.GetText() != sOldValueFT)
            aValueFT.SetText(sOldValueFT);

        switch (nTypeId)
        {
            case TYP_MACROFLD:
                bMacro = TRUE;
                bShowSelection = TRUE;
                if (GetFldMgr().GetMacroPath().Len())
                    bValue = TRUE;
                else
                    bInsert = FALSE;

                aNameFT.SetText(SW_RESSTR(STR_MACNAME));
                aValueFT.SetText(SW_RESSTR(STR_PROMPT));
                aNameED.SetText(aSelectionLB.GetSelectEntry());
                break;

            case TYP_HIDDENPARAFLD:
                aNameFT.SetText(SW_RESSTR(STR_COND));
                aNameED.EnableDrop(TRUE);
                bName = TRUE;
                break;

            case TYP_HIDDENTXTFLD:
                aNameFT.SetText(SW_RESSTR(STR_COND));
                aNameED.EnableDrop(TRUE);
                aValueFT.SetText(SW_RESSTR(STR_INSTEXT));
                if (!IsFldEdit())
                    aValueED.SetText(::GetActiveView()->GetWrtShell().GetSelTxt());
                bName = bValue = TRUE;
                break;

            case TYP_CONDTXTFLD:
                aNameFT.SetText(SW_RESSTR(STR_COND));
                aNameED.EnableDrop(TRUE);
                if (IsFldEdit())
                {
                    aCond1ED.SetText(GetCurField()->GetPar2().GetToken(0, '|'));
                    aCond2ED.SetText(GetCurField()->GetPar2().GetToken(1, '|'));
                }

                bName = bValue = TRUE;

                aCond1FT.Show();
                aCond1ED.Show();
                aCond2FT.Show();
                aCond2ED.Show();
                aValueFT.Hide();
                aValueED.Hide();
                break;

            case TYP_JUMPEDITFLD:
                aNameFT.SetText(SW_RESSTR(STR_JUMPEDITFLD));
                aValueFT.SetText(SW_RESSTR(STR_PROMPT));
                bName = bValue = TRUE;
                break;

            case TYP_INPUTFLD:
                aValueFT.SetText(SW_RESSTR(STR_PROMPT));
                bValue = TRUE;
                // bShowSelection = TRUE;
                break;

            default:
                break;
        }

        if (bShowSelection)
        {
            aSelectionLB.Show();
            aSelectionFT.Show();
            aFormatLB.Hide();
            aFormatFT.Hide();
        }
        else
        {
            aFormatLB.Show();
            aFormatFT.Show();
            aSelectionLB.Hide();
            aSelectionFT.Hide();
        }

        aFormatLB.Enable(bFormat);
        aFormatFT.Enable(bFormat);
        aNameFT.Enable(bName);
        aNameED.Enable(bName);
        aValueFT.Enable(bValue);
        aValueED.Enable(bValue);
        aMacroBT.Enable(bMacro);

        EnableInsert(bInsert);
    }

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwFldFuncPage, SelectHdl, ListBox *, pBox )
{
    USHORT nTypeId = (USHORT)(ULONG)aTypeLB.GetEntryData(GetTypeSel());

    if (nTypeId == TYP_MACROFLD)
        aNameED.SetText(aSelectionLB.GetSelectEntry());

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwFldFuncPage, InsertMacroHdl, ListBox *, pBox )
{
    SelectHdl();
    InsertHdl();

    return 0;
}

/*--------------------------------------------------------------------
     Beschreibung: Typen in der SelectionBox erneuern
 --------------------------------------------------------------------*/


void SwFldFuncPage::UpdateSubType()
{
    USHORT nTypeId = (USHORT)(ULONG)aTypeLB.GetEntryData(GetTypeSel());

    // Auswahl-Listbox fuellen
    aSelectionLB.SetUpdateMode(FALSE);
    aSelectionLB.Clear();

    SvStringsDtor& rLst = GetFldMgr().GetSubTypes(nTypeId);
    USHORT nCount = rLst.Count();

    for (USHORT i = 0; i < nCount; ++i)
    {
        USHORT nPos = aSelectionLB.InsertEntry(*rLst[i]);
        aSelectionLB.SetEntryData(nPos, (void*)i);
    }

    BOOL bEnable = nCount != 0;

    aSelectionLB.Enable( bEnable );
    aSelectionFT.Enable( bEnable );

    if (bEnable)
    {
        if (nTypeId == TYP_MACROFLD)
        {
            BOOL bHasMacro = GetFldMgr().GetMacroPath().Len() != 0;

            if (bHasMacro)
            {
                aSelectionLB.SelectEntry(GetFldMgr().GetMacroPath());
                aNameED.SetText(aSelectionLB.GetSelectEntry());
                aValueFT.Enable();
                aValueED.Enable();
            }
            EnableInsert(bHasMacro);
        }
        else
            aSelectionLB.SelectEntryPos(0);
    }
    aSelectionLB.SetUpdateMode(TRUE);
}

/*--------------------------------------------------------------------
    Beschreibung: MacroBrowser aufrufen, Listbox mit Macros fuellen
 --------------------------------------------------------------------*/

IMPL_LINK( SwFldFuncPage, MacroHdl, Button *, pBtn )
{
    Window* pDefModalDlgParent = Application::GetDefDialogParent();
    Application::SetDefDialogParent( pBtn );

    String sMacro(TurnMacroString(aNameED.GetText()));
    while (sMacro.SearchAndReplace('.', ';') != STRING_NOTFOUND);

    if (GetFldMgr().ChooseMacro(sMacro))
        UpdateSubType();

    Application::SetDefDialogParent( pDefModalDlgParent );

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

BOOL __EXPORT SwFldFuncPage::FillItemSet(SfxItemSet& rSet)
{
    BOOL bPage = FALSE;
    USHORT nTypeId = (USHORT)(ULONG)aTypeLB.GetEntryData(GetTypeSel());

    USHORT nSubType = 0;

    ULONG nFormat = aFormatLB.GetSelectEntryPos();

    if(nFormat == LISTBOX_ENTRY_NOTFOUND)
        nFormat = 0;
    else
        nFormat = (ULONG)aFormatLB.GetEntryData((USHORT)nFormat);

    String aVal(aValueED.GetText());
    String aName(aNameED.GetText());

    switch(nTypeId)
    {
        case TYP_INPUTFLD:
            nSubType = INP_TXT;
            break;

        case TYP_MACROFLD:
            aName = TurnMacroString(aName);
            break;

        case TYP_CONDTXTFLD:
            aVal = aCond1ED.GetText();
            aVal += '|';
            aVal += aCond2ED.GetText();
            break;

        default:
            break;
    }

    if (!IsFldEdit() ||
        aNameED.GetSavedValue() != aNameED.GetText() ||
        aValueED.GetSavedValue() != aValueED.GetText() ||
        aCond1ED.GetSavedValue() != aCond1ED.GetText() ||
        aCond2ED.GetSavedValue() != aCond2ED.GetText() ||
        nOldFormat != nFormat)
    {
        InsertFld( nTypeId, nSubType, aName, aVal, nFormat );
    }

    return FALSE;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

String SwFldFuncPage::TurnMacroString(const String &rMacro)
{
    if (rMacro.Len())
    {
        // Inhalt von aName umdrehen
        String sTmp, sBuf;
        USHORT nPos = 0;

        for (USHORT i = 0; i < 4 && nPos != STRING_NOTFOUND; i++)
        {
            if (i == 3)
                sTmp = rMacro.Copy(nPos);
            else
                sTmp = rMacro.GetToken(0, '.', nPos);

            if( sBuf.Len() )
                sTmp += '.';
            sBuf.Insert( sTmp, 0 );
        }
        return sBuf;
    }

    return rMacro;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SfxTabPage* __EXPORT SwFldFuncPage::Create(     Window* pParent,
                        const SfxItemSet& rAttrSet )
{
    return ( new SwFldFuncPage( pParent, rAttrSet ) );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

USHORT SwFldFuncPage::GetGroup()
{
    return GRP_FKT;
}

/* -----------------12.01.99 10:09-------------------
 *
 * --------------------------------------------------*/
void    SwFldFuncPage::FillUserData()
{
    String sData( String::CreateFromAscii(
                        RTL_CONSTASCII_STRINGPARAM( USER_DATA_VERSION )));
    sData += ';';
    USHORT nTypeSel = aTypeLB.GetSelectEntryPos();
    if( LISTBOX_ENTRY_NOTFOUND == nTypeSel )
        nTypeSel = USHRT_MAX;
    else
        nTypeSel = (ULONG)aTypeLB.GetEntryData( nTypeSel );
    sData += String::CreateFromInt32( nTypeSel );
    SetUserData(sData);
}
/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.28  2000/09/18 16:05:28  willem.vandorp
    OpenOffice header added.

    Revision 1.27  2000/09/04 11:43:02  tbe
    basicide, isetbrw, si, vcdlged moved from svx to basctl

    Revision 1.26  2000/06/30 08:52:52  os
    #76541# string assertions removed

    Revision 1.25  2000/05/23 18:36:44  jp
    Bugfixes for Unicode

    Revision 1.24  2000/04/18 15:17:31  os
    UNICODE

    Revision 1.23  2000/03/03 15:17:01  os
    StarView remainders removed

    Revision 1.22  1999/02/25 16:24:50  JP
    Bug #62438#: UserData nur auswerten, wenn kein Refresh ist


      Rev 1.21   25 Feb 1999 17:24:50   JP
   Bug #62438#: UserData nur auswerten, wenn kein Refresh ist

      Rev 1.20   21 Jan 1999 09:50:36   OS
   #59900# Fussnoten im Dialog korrekt sortieren; keine prot. Member

      Rev 1.19   12 Jan 1999 11:42:26   OS
   #60579# ausgewaehlten Typ in den UserData speichern

      Rev 1.18   10 Aug 1998 16:39:58   JP
   Bug #54796#: neue NumerierungsTypen (WW97 kompatibel)

      Rev 1.17   24 Jul 1998 13:57:08   OM
   #53246# Makros vorselektieren

      Rev 1.16   20 Jul 1998 11:31:00   OM
   #53244# Makros beim Bearbeiten nicht zersemmeln

      Rev 1.15   20 Jul 1998 09:38:52   OM
   #53278# Flackern vermeiden

      Rev 1.14   29 May 1998 16:41:18   OM
   #50667# Makrofelder bearbeiten

      Rev 1.13   18 May 1998 14:52:42   OM
   #50001 Keine eckigen Klammern in DB-Condition-Fields

      Rev 1.12   13 Mar 1998 16:30:42   OM
   #48197# Focus nach MacroDlg greppen

      Rev 1.11   07 Mar 1998 14:38:46   OM
   Feld nur bei Aenderung aktualisieren

      Rev 1.10   04 Mar 1998 08:37:50   MH
   chg: Syntax

      Rev 1.9   03 Feb 1998 09:24:58   OM
   Test

      Rev 1.8   02 Feb 1998 15:04:36   OM
   #46781# Macrofelder auch ausfuehren, wenn Dateiname mehr als 1 Punkt enthaelt

      Rev 1.7   09 Jan 1998 16:56:52   OM
   Bei Dok-Wechsel updaten

      Rev 1.6   08 Jan 1998 14:58:26   OM
   Traveling

      Rev 1.5   06 Jan 1998 18:12:54   OM
   Felbefehl-Dlg

      Rev 1.4   12 Dec 1997 16:10:06   OM
   AutoUpdate bei FocusWechsel u.a.

      Rev 1.3   11 Dec 1997 16:58:02   OM
   Feldumstellung

      Rev 1.2   25 Nov 1997 12:59:28   OM
   Funktionen-TP

      Rev 1.1   25 Nov 1997 12:38:42   OM
   Funktionen-TP

      Rev 1.0   04 Nov 1997 10:07:18   OM
   Initial revision.

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/fldui/fldfunc.hxx b/sw/source/ui/fldui/fldfunc.hxx
new file mode 100644
index 0000000..6eba159
--- /dev/null
+++ b/sw/source/ui/fldui/fldfunc.hxx
@@ -0,0 +1,141 @@
/*************************************************************************
 *
 *  $RCSfile: fldfunc.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:36 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWFLDFUNC_HXX
#define _SWFLDFUNC_HXX

#ifndef _SFXTABDLG_HXX //autogen
#include <sfx2/tabdlg.hxx>
#endif
#ifndef _SV_FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif
#ifndef _SV_LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif
#ifndef _SV_BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif
#ifndef _SV_GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif
#ifndef _SV_EDIT_HXX //autogen
#include <vcl/edit.hxx>
#endif

#include "condedit.hxx"
#include "fldpage.hxx"

/*--------------------------------------------------------------------
   Beschreibung:
 --------------------------------------------------------------------*/

class SwFldFuncPage : public SwFldPage
{
    FixedText       aTypeFT;
    ListBox         aTypeLB;
    FixedText       aSelectionFT;
    ListBox         aSelectionLB;
    FixedText       aFormatFT;
    ListBox         aFormatLB;
    FixedText       aNameFT;
    ConditionEdit   aNameED;
    FixedText       aValueFT;
    Edit            aValueED;
    FixedText       aCond1FT;
    ConditionEdit   aCond1ED;
    FixedText       aCond2FT;
    ConditionEdit   aCond2ED;
    PushButton      aMacroBT;

    String          sOldValueFT;
    String          sOldNameFT;

    ULONG           nOldFormat;

    DECL_LINK( TypeHdl, ListBox* pLB = 0 );
    DECL_LINK( SelectHdl, ListBox* pLB = 0 );
    DECL_LINK( InsertMacroHdl, ListBox* pLB = 0 );

    // Macro ausw„hlen
    DECL_LINK( MacroHdl, Button * );

    void                UpdateSubType();
    String              TurnMacroString(const String &rMacro);

protected:
    virtual USHORT      GetGroup();

public:
                        SwFldFuncPage(Window* pParent, const SfxItemSet& rSet);

                        ~SwFldFuncPage();

    static SfxTabPage*  Create(Window* pParent, const SfxItemSet& rAttrSet);

    virtual BOOL        FillItemSet( SfxItemSet& rSet );
    virtual void        Reset( const SfxItemSet& rSet );

    virtual void        FillUserData();
};


#endif

diff --git a/sw/source/ui/fldui/fldfunc.src b/sw/source/ui/fldui/fldfunc.src
new file mode 100644
index 0000000..c9f2871
--- /dev/null
+++ b/sw/source/ui/fldui/fldfunc.src
@@ -0,0 +1,380 @@
/*************************************************************************
 *
 *  $RCSfile: fldfunc.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:36 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "globals.hrc"
#include "fldtdlg.hrc"
#include "helpid.h"
TabPage TP_FLD_FUNC
{
    HelpID = HID_FLD_FUNC ;
    SVLook = TRUE ;
    Hide = TRUE ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Text = "Funktionen" ;
    Text [ ENGLISH ] = "Functions" ;
    FixedText FT_FUNCTYPE
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 76 , 10 ) ;
        Text = "~Feldtyp" ;
        Text [ ENGLISH ] = "Type" ;
        Text [ norwegian ] = "Type" ;
        Text [ italian ] = "~Tipo di campo" ;
        Text [ portuguese_brazilian ] = "Tipo" ;
        Text [ portuguese ] = "Tipo de ~campo" ;
        Text [ finnish ] = "Laji" ;
        Text [ danish ] = "Felttype" ;
        Text [ french ] = "~Type de champ" ;
        Text [ swedish ] = "~Fälttyp" ;
        Text [ dutch ] = "~Veldtype" ;
        Text [ spanish ] = "~Tipo de campo" ;
        Text [ english_us ] = "~Type" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "×Ö¶ÎÀàÐÍ(~T)";
        Text[ russian ] = "Òèï ïîëÿ";
        Text[ polish ] = "Typ pola";
        Text[ japanese ] = "̨°ÙÄނ̎í—Þ(~T)";
        Text[ chinese_traditional ] = "Ãþ«¬(~T)";
        Text[ arabic ] = "äæÚ ÇáÍÞá";
        Text[ greek ] = "~Ôýðïò ðåäßïõ";
        Text[ korean ] = "ÇüÅÂ(~T)";
        Text[ turkish ] = "~Alan tipi";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_FUNCTYPE
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 6 , 16 ) ;
        Size = MAP_APPFONT ( 76 , 113 ) ;
        TabStop = TRUE ;
        Sort = FALSE ;
        AutoHScroll = TRUE ;
    };
    FixedText FT_FUNCSELECTION
    {
        Pos = MAP_APPFONT ( 88 , 3 ) ;
        Size = MAP_APPFONT ( 76 , 10 ) ;
        Text = "~Auswahl" ;
        Text [ ENGLISH ] = "Selection" ;
        Text [ norwegian ] = "Selection" ;
        Text [ italian ] = "~Selezione" ;
        Text [ portuguese_brazilian ] = "Seleção" ;
        Text [ portuguese ] = "~Selecção" ;
        Text [ finnish ] = "Valinta" ;
        Text [ danish ] = "Udvalg" ;
        Text [ french ] = "~Sélection" ;
        Text [ swedish ] = "~Urval" ;
        Text [ dutch ] = "~Selectie" ;
        Text [ spanish ] = "Se~lección" ;
        Text [ english_us ] = "S~elect" ;
        Hide = TRUE ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "Ñ¡Ôñ(~E)";
        Text[ russian ] = "Âûáîð";
        Text[ polish ] = "Wybór";
        Text[ japanese ] = "‘I‘ð(~E)";
        Text[ chinese_traditional ] = "¿ï¾Ü(~E)";
        Text[ arabic ] = "ÇáÊÍÏíÏ";
        Text[ greek ] = "~ÅðéëïãÞ";
        Text[ korean ] = "¼±ÅÃ(~E)";
        Text[ turkish ] = "~Seçim";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_FUNCSELECTION
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 88 , 16 ) ;
        Size = MAP_APPFONT ( 76 , 113 ) ;
        TabStop = TRUE ;
        Hide = TRUE ;
        Sort = TRUE ;
        AutoHScroll = TRUE ;
    };
    FixedText FT_FUNCFORMAT
    {
        Pos = MAP_APPFONT ( 88 , 3 ) ;
        Size = MAP_APPFONT ( 76 , 10 ) ;
        Text = "F~ormat" ;
        Text [ ENGLISH ] = "Format" ;
        Left = TRUE ;
        Text [ english_us ] = "F~ormat" ;
        Text [ portuguese_brazilian ] = "F~ormat" ;
        Text [ swedish ] = "F~ormat" ;
        Text [ danish ] = "Format" ;
        Text [ italian ] = "F~ormato" ;
        Text [ spanish ] = "F~ormato" ;
        Text [ french ] = "F~ormat" ;
        Text [ dutch ] = "F~ormaat" ;
        Text [ portuguese ] = "F~ormato" ;
        Text[ chinese_simplified ] = "¸ñʽ(~O)";
        Text[ russian ] = "Ôîðìàò";
        Text[ polish ] = "Format";
        Text[ japanese ] = "‘Ž®(~O)";
        Text[ chinese_traditional ] = "®æ¦¡(~O)";
        Text[ arabic ] = "ÇáÊäÓíÞ";
        Text[ greek ] = "Ì~ïñöÞ";
        Text[ korean ] = "¼­½Ä(~O)";
        Text[ turkish ] = "F~ormat";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_FUNCFORMAT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 88 , 16 ) ;
        Size = MAP_APPFONT ( 76 , 113 ) ;
        TabStop = TRUE ;
    };
    FixedText FT_FUNCNAME
    {
        Pos = MAP_APPFONT ( 170 , 3 ) ;
        Size = MAP_APPFONT ( 84 , 10 ) ;
        Text = "Na~me" ;
        TEXT [ English ] = "Na~me" ;
        Left = TRUE ;
        Text [ english_us ] = "Na~me" ;
        Text [ portuguese_brazilian ] = "Na~me" ;
        Text [ swedish ] = "Na~mn" ;
        Text [ danish ] = "Navn" ;
        Text [ italian ] = "No~me" ;
        Text [ spanish ] = "No~mbre" ;
        Text [ french ] = "~Nom" ;
        Text [ dutch ] = "Naa~m" ;
        Text [ portuguese ] = "No~me" ;
        Text[ chinese_simplified ] = "Ãû³Æ(~M)";
        Text[ russian ] = "Èìÿ";
        Text[ polish ] = "Nazwa";
        Text[ japanese ] = "–¼‘O(~M)";
        Text[ chinese_traditional ] = "¦WºÙ(~M)";
        Text[ arabic ] = "ÇáÇÓã";
        Text[ greek ] = "¼íïìá";
        Text[ korean ] = "À̸§(~M)";
        Text[ turkish ] = "~Ad";
        Text[ language_user1 ] = " ";
    };
    Edit ED_FUNCNAME
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 170 , 15 ) ;
        Size = MAP_APPFONT ( 84 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
    };
    FixedText FT_FUNCVALUE
    {
        Pos = MAP_APPFONT ( 170 , 33 ) ;
        Size = MAP_APPFONT ( 84 , 10 ) ;
        Text = "~Wert" ;
        Text [ ENGLISH ] = "Value" ;
        Text [ norwegian ] = "Verdi" ;
        Text [ italian ] = "~Valore" ;
        Text [ portuguese_brazilian ] = "Valor" ;
        Text [ portuguese ] = "Valor" ;
        Text [ finnish ] = "Arvo" ;
        Text [ danish ] = "Værdi" ;
        Text [ french ] = "~Valeur" ;
        Text [ swedish ] = "~Värde" ;
        Text [ dutch ] = "~Waarde" ;
        Text [ spanish ] = "~Valor" ;
        Text [ english_us ] = "~Value" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "ÊýÖµ(~V)";
        Text[ russian ] = "Çíà÷åíèå";
        Text[ polish ] = "WartoϾ";
        Text[ japanese ] = "’l(~V)";
        Text[ chinese_traditional ] = "¼Æ­È(~V)";
        Text[ arabic ] = "ÇáÞíãÉ";
        Text[ greek ] = "ÔéìÞ";
        Text[ korean ] = "°ª(~V)";
        Text[ turkish ] = "D~eðer";
        Text[ language_user1 ] = " ";
    };
    Edit ED_FUNCVALUE
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 170 , 45 ) ;
        Size = MAP_APPFONT ( 84 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
    };
    FixedText FT_FUNCCOND1
    {
        Pos = MAP_APPFONT ( 170 , 33 ) ;
        Size = MAP_APPFONT ( 84 , 10 ) ;
        Text = "~Dann" ;
        Text [ ENGLISH ] = "Then" ;
        Left = TRUE ;
        Hide = TRUE ;
        Text [ english_us ] = "Then" ;
        Text [ portuguese_brazilian ] = "Dann" ;
        Text [ swedish ] = "Så" ;
        Text [ danish ] = "Så" ;
        Text [ italian ] = "Poi" ;
        Text [ spanish ] = "Entonces" ;
        Text [ french ] = "~Alors" ;
        Text [ dutch ] = "~Dan" ;
        Text [ portuguese ] = "~Então" ;
        Text[ chinese_simplified ] = "¾Í";
        Text[ russian ] = "Äàëåå";
        Text[ polish ] = "Wtedy";
        Text[ japanese ] = "ðŒ‚ð–ž‚½‚·‚Æ‚«";
        Text[ chinese_traditional ] = "´N";
        Text[ arabic ] = "Ýí åÐå ÇáÍÇáÉ";
        Text[ greek ] = "Ôüôå";
        Text[ korean ] = "´ÙÀ½";
        Text[ turkish ] = "O halde";
        Text[ language_user1 ] = " ";
    };
    Edit ED_FUNCCOND1
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 170 , 45 ) ;
        Size = MAP_APPFONT ( 84 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Hide = TRUE ;
    };
    FixedText FT_FUNCCOND2
    {
        Pos = MAP_APPFONT ( 170 , 63 ) ;
        Size = MAP_APPFONT ( 84 , 10 ) ;
        Text = "So~nst" ;
        Text [ ENGLISH ] = "Else" ;
        Left = TRUE ;
        Hide = TRUE ;
        Text [ english_us ] = "Else" ;
        Text [ portuguese_brazilian ] = "Sonst" ;
        Text [ swedish ] = "Annars" ;
        Text [ danish ] = "Ellers" ;
        Text [ italian ] = "Altrimenti" ;
        Text [ spanish ] = "Si no" ;
        Text [ french ] = "~Sinon" ;
        Text [ dutch ] = "~Anders" ;
        Text [ portuguese ] = "~Senão" ;
        Text[ chinese_simplified ] = "ÆäËü";
        Text[ russian ] = "针֌";
        Text[ polish ] = "W przeciwnym wypadku";
        Text[ japanese ] = "ðŒ‚ð–ž‚½‚³‚È‚¢‚Æ‚«";
        Text[ chinese_traditional ] = "§_«h";
        Text[ arabic ] = "ÝíãÇ ÚÏÇ Ðáß";
        Text[ greek ] = "Áëëéþò";
        Text[ korean ] = "±âŸ";
        Text[ turkish ] = "Yoksa";
        Text[ language_user1 ] = " ";
    };
    Edit ED_FUNCCOND2
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 170 , 75 ) ;
        Size = MAP_APPFONT ( 84 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Hide = TRUE ;
    };
    PushButton BT_FUNCMACRO
    {
        Pos = MAP_APPFONT ( 204 , 115 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        Text = "M~akro..." ;
        Text [ English ] = "M~acro..." ;
        Text [ norwegian ] = "Macro..." ;
        Text [ italian ] = "~Macro..." ;
        Text [ portuguese_brazilian ] = "Macro..." ;
        Text [ portuguese ] = "Macro..." ;
        Text [ french ] = "~Macro..." ;
        Text [ dutch ] = "~Macro..." ;
        Text [ spanish ] = "M~acro..." ;
        Text [ danish ] = "Makro..." ;
        Text [ swedish ] = "M~akro..." ;
        Text [ finnish ] = "Macro..." ;
        Text [ english_us ] = "~Macro..." ;
        Disable = TRUE ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "ºê(~M)...";
        Text[ russian ] = "Ìàêðîñ...";
        Text[ polish ] = "Makro...";
        Text[ japanese ] = "ϸÛ(~C)...";
        Text[ chinese_traditional ] = "¥¨¶°(~C)...";
        Text[ arabic ] = "ãÇßÑæ...";
        Text[ greek ] = "ÌáêñïåíôïëÞ...";
        Text[ korean ] = "¸ÅÅ©·Î(~M)...";
        Text[ turkish ] = "M~akro...";
        Text[ language_user1 ] = " ";
    };
    Text [ english_us ] = "Functions" ;
    Text [ portuguese_brazilian ] = "Funktionen" ;
    Text [ swedish ] = "Funktioner" ;
    Text [ danish ] = "Funktioner" ;
    Text [ italian ] = "Funzioni" ;
    Text [ spanish ] = "Funciones" ;
    Text [ french ] = "Fonctions" ;
    Text [ dutch ] = "Functies" ;
    Text [ portuguese ] = "Funções" ;
    Text[ chinese_simplified ] = "¹¦ÄÜ";
    Text[ russian ] = "Ôóíêöèè";
    Text[ polish ] = "Funkcje";
    Text[ japanese ] = "‹@”\\";
    Text[ chinese_traditional ] = "¥\\¯à";
    Text[ arabic ] = "ãåÇã";
    Text[ greek ] = "Ëåéôïõñãßåò";
    Text[ korean ] = "ÇÔ¼ö";
    Text[ turkish ] = "Fonksiyon";
    Text[ language_user1 ] = " ";
};
diff --git a/sw/source/ui/fldui/fldmgr.cxx b/sw/source/ui/fldui/fldmgr.cxx
new file mode 100644
index 0000000..f2c7a221
--- /dev/null
+++ b/sw/source/ui/fldui/fldmgr.cxx
@@ -0,0 +1,2450 @@
/*************************************************************************
 *
 *  $RCSfile: fldmgr.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:36 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "cmdid.h"
#include "view.hxx"
#include "wrtsh.hxx"        // Actives Fenster
#include "doc.hxx"      // Actives Fenster
#include "docsh.hxx"        // Actives Fenster
#include "swmodule.hxx"
#include "hintids.hxx"
#include "charatr.hxx"

#ifdef REPLACE_OFADBMGR
#ifndef _COM_SUN_STAR_LANG_XMULTISERVICEFACTORY_HPP_
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XNAMEACCESS_HPP_
#include <com/sun/star/container/XNameAccess.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBC_XDATASOURCE_HPP_
#include <com/sun/star/sdbc/XDataSource.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBC_DATATYPE_HPP_
#include <com/sun/star/sdbc/DataType.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBCX_XTABLESSUPPLIER_HPP_
#include <com/sun/star/sdbcx/XTablesSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBCX_XCOLUMNSSUPPLIER_HPP_
#include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_SDB_XQUERIESSUPPLIER_HPP_
#include <com/sun/star/sdb/XQueriesSupplier.hpp>
#endif
//#ifndef _COM_SUN_STAR_SDB_XDATABASEACCESS_HPP_
//#include <com/sun/star/sdb/XDatabaseAccess.hpp>
//#endif
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
#include <com/sun/star/beans/XPropertySet.hpp>
#endif
#ifndef _UNOTOOLS_PROCESSFACTORY_HXX_
#include <unotools/processfactory.hxx>
#endif

#else


#endif //REPLACE_OFADBMGR

#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif

#ifndef _SFXDOCINF_HXX //autogen
#include <sfx2/docinf.hxx>
#endif

#ifndef _SFX_OBJSH_HXX //autogen
#include <sfx2/objsh.hxx>
#endif

#ifndef _LINKMGR_HXX //autogen
#include <so3/linkmgr.hxx>
#endif

#ifndef _BASMGR_HXX //autogen
#include <basic/basmgr.hxx>
#endif

#ifndef _SVX_LANGITEM_HXX //autogen
#include <svx/langitem.hxx>
#endif

#ifndef _SFXMACITEM_HXX //autogen
#include <svtools/macitem.hxx>
#endif

#ifndef _SB_SBMOD_HXX //autogen
#include <basic/sbmod.hxx>
#endif

#ifndef _FMTRFMRK_HXX //autogen
#include <fmtrfmrk.hxx>
#endif

#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif

#ifndef _SB_SBSTAR_HXX //autogen
#include <basic/sbstar.hxx>
#endif

#ifndef _SB_SBMETH_HXX //autogen
#include <basic/sbmeth.hxx>
#endif

#ifndef _SBXCLASS_HXX //autogen
#include <svtools/sbx.hxx>
#endif
#ifndef _BASOBJ_HXX //autogen
#include <basctl/basobj.hxx>
#endif

#ifndef _ZFORLIST_HXX //autogen
#include <svtools/zforlist.hxx>
#endif

#ifndef _ZFORMAT_HXX //autogen
#include <svtools/zformat.hxx>
#endif

#ifndef _SB_SBMOD_HXX //autogen
#include <basic/sbmod.hxx>
#endif
#ifndef _FMTINFMT_HXX //autogen
#include <fmtinfmt.hxx>
#endif
#ifndef _CELLATR_HXX
#include <cellatr.hxx>
#endif
#include "dbmgr.hxx"
#include "shellres.hxx"
#include "fldbas.hxx"
#include "docufld.hxx"
#include "chpfld.hxx"
#include "ddefld.hxx"
#include "expfld.hxx"
#include "reffld.hxx"
#include "usrfld.hxx"
#include "dbfld.hxx"
#include "authfld.hxx"
#include "flddat.hxx"
#include "fldmgr.hxx"

#include "fldui.hrc"

#ifdef REPLACE_OFADBMGR
using namespace rtl;
using namespace com::sun::star::uno;
using namespace com::sun::star::container;
using namespace com::sun::star::lang;
using namespace com::sun::star::sdb;
using namespace com::sun::star::sdbc;
using namespace com::sun::star::sdbcx;
using namespace com::sun::star::beans;
#define C2U(cChar) rtl::OUString::createFromAscii(cChar)

#endif

/*--------------------------------------------------------------------
    Beschreibung: Gruppen der Felder
 --------------------------------------------------------------------*/
enum
{
    GRP_DOC_BEGIN   =  0,
    GRP_DOC_END     =  GRP_DOC_BEGIN + 11,

    GRP_FKT_BEGIN   =  GRP_DOC_END,
    GRP_FKT_END     =  GRP_FKT_BEGIN + 6,

    GRP_REF_BEGIN   =  GRP_FKT_END,
    GRP_REF_END     =  GRP_REF_BEGIN + 2,

    GRP_REG_BEGIN   =  GRP_REF_END,
    GRP_REG_END     =  GRP_REG_BEGIN + 1,

    GRP_DB_BEGIN    =  GRP_REG_END,
    GRP_DB_END      =  GRP_DB_BEGIN  + 5,

    GRP_VAR_BEGIN   =  GRP_DB_END,
    GRP_VAR_END     =  GRP_VAR_BEGIN + 9
};

enum
{
    GRP_WEB_DOC_BEGIN   =  0,
    GRP_WEB_DOC_END     =  GRP_WEB_DOC_BEGIN + 9,

    GRP_WEB_FKT_BEGIN   =  GRP_WEB_DOC_END + 2,
    GRP_WEB_FKT_END     =  GRP_WEB_FKT_BEGIN + 0,   // Die Gruppe ist leer!

    GRP_WEB_REF_BEGIN   =  GRP_WEB_FKT_END + 6,     // Die Gruppe ist leer!
    GRP_WEB_REF_END     =  GRP_WEB_REF_BEGIN + 0,

    GRP_WEB_REG_BEGIN   =  GRP_WEB_REF_END + 2,
    GRP_WEB_REG_END     =  GRP_WEB_REG_BEGIN + 1,

    GRP_WEB_DB_BEGIN    =  GRP_WEB_REG_END,         // Die Gruppe ist leer!
    GRP_WEB_DB_END      =  GRP_WEB_DB_BEGIN  + 0,

    GRP_WEB_VAR_BEGIN   =  GRP_WEB_DB_END + 5,
    GRP_WEB_VAR_END     =  GRP_WEB_VAR_BEGIN + 1
};

/*--------------------------------------------------------------------
    Beschreibung: Formate in der richtigen Reihenfolge
 --------------------------------------------------------------------*/
static const USHORT __FAR_DATA aSetFmt[] =
{
// die Reihenfolge muss zu Beginn mit den ResourceIds fuer FMT_SETVAR_???
// uebereinstimmen
    0,
    0
};

static const USHORT __FAR_DATA aGetFmt[] =
{
// die Reihenfolge muss zu Beginn mit den ResourceIds fuer FMT_GETVAR_???
// uebereinstimmen
    0
};

static const USHORT __FAR_DATA aUsrFmt[] =
{
// die Reihenfolge muss zu Beginn mit den ResourceIds fuer FMT_SETVAR_???
// uebereinstimmen
    0,
    SUB_CMD
};

static const USHORT __FAR_DATA aDBFmt[] =
{
// die Reihenfolge muss zu Beginn mit den ResourceIds fuer FMT_DBFLD_???
// uebereinstimmen
    SUB_OWN_FMT
};

static const USHORT VF_COUNT        = sizeof(aGetFmt) / sizeof(USHORT);
static const USHORT VF_USR_COUNT    = sizeof(aUsrFmt) / sizeof(USHORT);
static const USHORT VF_DB_COUNT     = sizeof(aDBFmt)  / sizeof(USHORT);

/*--------------------------------------------------------------------
    Beschreibung: Feldtypen und Subtypes
 --------------------------------------------------------------------*/
struct SwFldPack
{
    USHORT  nTypeId;

    USHORT  nSubTypeStart;
    USHORT  nSubTypeEnd;

    ULONG   nFmtBegin;
    ULONG   nFmtEnd;
};

/*--------------------------------------------------------------------
    Beschreibung: Strings und Formate
 --------------------------------------------------------------------*/
static const SwFldPack __FAR_DATA aSwFlds[] =
{
    // Dokument
    TYP_EXTUSERFLD,     FLD_EU_BEGIN,       FLD_EU_END,     0,                  0,
    TYP_AUTHORFLD,      0,                  0,              FMT_AUTHOR_BEGIN,   FMT_AUTHOR_END,
    TYP_DATEFLD,        FLD_DATE_BEGIN,     FLD_DATE_END,   0,                  0,
    TYP_TIMEFLD,        FLD_TIME_BEGIN,     FLD_TIME_END,   0,                  0,
    TYP_PAGENUMBERFLD,  0,                  0,              FMT_NUM_BEGIN,      FMT_NUM_END-1,
    TYP_NEXTPAGEFLD,    0,                  0,              FMT_NUM_BEGIN,      FMT_NUM_END,
    TYP_PREVPAGEFLD,    0,                  0,              FMT_NUM_BEGIN,      FMT_NUM_END,
    TYP_FILENAMEFLD,    0,                  0,              FMT_FF_BEGIN,       FMT_FF_END,
    TYP_DOCSTATFLD,     FLD_STAT_BEGIN,     FLD_STAT_END,   FMT_NUM_BEGIN,      FMT_NUM_END-1,

    TYP_CHAPTERFLD,     0,                  0,              FMT_CHAPTER_BEGIN,  FMT_CHAPTER_END,
    TYP_TEMPLNAMEFLD,   0,                  0,              FMT_FF_BEGIN,       FMT_FF_END,

    // Funktion
    TYP_CONDTXTFLD,     0,                  0,              0,                  0,
    TYP_INPUTFLD,       FLD_INPUT_BEGIN,    FLD_INPUT_END,  0,                  0,
    TYP_MACROFLD,       0,                  0,              0,                  0,
    TYP_JUMPEDITFLD,    0,                  0,              FMT_MARK_BEGIN,     FMT_MARK_END,
    TYP_HIDDENTXTFLD,   0,                  0,              0,                  0,
    TYP_HIDDENPARAFLD,  0,                  0,              0,                  0,

    // Referenzen
    TYP_SETREFFLD,      0,                  0,              0,                  0,
    TYP_GETREFFLD,      0,                  0,              FMT_REF_BEGIN,      FMT_REF_END,

    // Ablage
    TYP_DOCINFOFLD,     0,                  0,              FMT_REG_BEGIN,      FMT_REG_END,

    // Datenbank
    TYP_DBFLD,          0,                  0,              FMT_DBFLD_BEGIN,    FMT_DBFLD_END,
    TYP_DBNEXTSETFLD,   0,                  0,              0,                  0,
    TYP_DBNUMSETFLD,    0,                  0,              0,                  0,
    TYP_DBSETNUMBERFLD, 0,                  0,              FMT_NUM_BEGIN,      FMT_NUM_END-2,
    TYP_DBNAMEFLD,      0,                  0,              0,                  0,

    // Variablen
    TYP_SETFLD,         0,                  0,              FMT_SETVAR_BEGIN,   FMT_SETVAR_END,

    TYP_GETFLD,         0,                  0,              FMT_GETVAR_BEGIN,   FMT_GETVAR_END,
    TYP_DDEFLD,         0,                  0,              FMT_DDE_BEGIN,      FMT_DDE_END,
    TYP_FORMELFLD,      0,                  0,              FMT_GETVAR_BEGIN,   FMT_GETVAR_END,
    TYP_INPUTFLD,       FLD_INPUT_BEGIN,    FLD_INPUT_END,  0,                  0,
    TYP_SEQFLD,         0,                  0,              FMT_NUM_BEGIN,      FMT_NUM_END-2,
    TYP_SETREFPAGEFLD,  FLD_PAGEREF_BEGIN,  FLD_PAGEREF_END,0,                  0,
    TYP_GETREFPAGEFLD,  0,                  0,              FMT_NUM_BEGIN,      FMT_NUM_END-1,
    TYP_USERFLD,        0,                  0,              FMT_USERVAR_BEGIN,  FMT_USERVAR_END
};

String* SwFldMgr::pDate = 0;
String* SwFldMgr::pTime = 0;


/*--------------------------------------------------------------------
    Beschreibung: Zugriff auf die Shell
 --------------------------------------------------------------------*/

SwWrtShell* lcl_GetShell()
{
    SwView* pView;
    if ( 0 != (pView = ::GetActiveView()) )
        return pView->GetWrtShellPtr();
    return 0;
}

inline USHORT GetPackCount() {  return sizeof(aSwFlds) / sizeof(SwFldPack); }

/*--------------------------------------------------------------------
    Beschreibung: FieldManager regelt das Einfuegen und Updaten
                  von Feldern
 --------------------------------------------------------------------*/

SwFldMgr::SwFldMgr(SwWrtShell* pSh ) :
    bEvalExp(TRUE),
    pModule(0),
    pMacroItem(0),
    pWrtShell(pSh)
{
    // aktuelles Feld ermitteln falls vorhanden
    GetCurFld();
}


SwFldMgr::~SwFldMgr()
{
    aSubLst.DeleteAndDestroy(0, aSubLst.Count());
}

/*--------------------------------------------------------------------
    Beschreibung: RefMark ueber Namen organisieren
 --------------------------------------------------------------------*/

BOOL  SwFldMgr::CanInsertRefMark( const String& rStr )
{
    SwWrtShell &rSh = pWrtShell ? *pWrtShell : *lcl_GetShell();
    USHORT nCnt = rSh.GetCrsrCnt();

    // der letzte Crsr muss keine aufgespannte Selektion
    if( 1 < nCnt && !rSh.SwCrsrShell::HasSelection() )
        --nCnt;

    return 2 > nCnt && 0 == rSh.GetRefMark( rStr );
}

/*--------------------------------------------------------------------
    Beschreibung: Alle DBTypes loeschen
 --------------------------------------------------------------------*/

void SwFldMgr::RemoveDBTypes()
{
    SwWrtShell &rSh = pWrtShell ? *pWrtShell : *lcl_GetShell();
    USHORT nCount = rSh.GetFldTypeCount(RES_DBFLD);
    for ( USHORT i=0; i < nCount ; ++i )
    {
        SwFieldType* pType = rSh.GetFldType( i, RES_DBFLD );
        if( !pType->GetDepends() )
        {
            rSh.RemoveFldType( i--, RES_DBFLD );
            nCount--;
        }
    }
}

/*--------------------------------------------------------------------
    Beschreibung: Zugriff ueber ResIds
 --------------------------------------------------------------------*/

USHORT SwFldMgr::GetFldTypeCount(USHORT nResId) const
{
    return pWrtShell ?
            pWrtShell->GetFldTypeCount(nResId) :
                ::lcl_GetShell()->GetFldTypeCount(nResId);
}


SwFieldType* SwFldMgr::GetFldType(USHORT nResId, USHORT nId) const
{
    return pWrtShell ?
            pWrtShell->GetFldType(nId, nResId) :
                ::lcl_GetShell()->GetFldType(nId, nResId);
}


SwFieldType* SwFldMgr::GetFldType(USHORT nResId, const String& rName) const
{
    return pWrtShell ?
            pWrtShell->GetFldType(nResId, rName) :
                ::lcl_GetShell()->GetFldType(nResId, rName);
}


void SwFldMgr::RemoveFldType(USHORT nResId, USHORT nId)
{
    pWrtShell ?
            pWrtShell->RemoveFldType(nId, nResId) :
                ::lcl_GetShell()->RemoveFldType(nId, nResId);
}


void SwFldMgr::RemoveFldType(USHORT nResId, const String& rName )
{
    pWrtShell ?
            pWrtShell->RemoveFldType(nResId, rName) :
                ::lcl_GetShell()->RemoveFldType(nResId, rName);
}

/*--------------------------------------------------------------------
    Beschreibung: Aktuelles Feld ermitteln
 --------------------------------------------------------------------*/


SwField* SwFldMgr::GetCurFld()
{
    SwWrtShell *pSh = pWrtShell ? pWrtShell : ::lcl_GetShell();
    if ( pSh )
        pCurFld = pSh->GetCurFld();
    else
        pCurFld = NULL;

    // Strings und Format initialisieren
    //
    aCurPar1.Erase();
    aCurPar2.Erase();
    sCurFrame.Erase();
    nCurFmt = 0;

    if(!pCurFld)
        return 0;

    // Aktuelle Werte aufbereiten Parameter 1 und Parameter 2
    // als auch das Format ermitteln
    //
    const USHORT nTypeId = pCurFld->GetTypeId();

    nCurFmt     = pCurFld->GetFormat();
    aCurPar1    = pCurFld->GetPar1();
    aCurPar2    = pCurFld->GetPar2();

    switch( nTypeId )
    {
        case TYP_PAGENUMBERFLD:
        case TYP_NEXTPAGEFLD:
        case TYP_PREVPAGEFLD:
        case TYP_GETREFPAGEFLD:
            if( nCurFmt == SVX_NUM_PAGEDESC )
                nCurFmt -= 2;
            break;
    }
    return pCurFld;
}

/*--------------------------------------------------------------------
    Beschreibung: Gruppen-Bereich liefern
 --------------------------------------------------------------------*/


const SwFldGroupRgn& SwFldMgr::GetGroupRange(BOOL bHtmlMode, USHORT nGrpId) const
{
static SwFldGroupRgn __READONLY_DATA aRanges[] =
{
    /* Dokument     */  GRP_DOC_BEGIN,  GRP_DOC_END,
    /* Funktionen   */  GRP_FKT_BEGIN,  GRP_FKT_END,
    /* Referenzen   */  GRP_REF_BEGIN,  GRP_REF_END,
    /* Ablage       */  GRP_REG_BEGIN,  GRP_REG_END,
    /* DB           */  GRP_DB_BEGIN,   GRP_DB_END,
    /* User         */  GRP_VAR_BEGIN,  GRP_VAR_END,
};
static SwFldGroupRgn __READONLY_DATA aWebRanges[] =
{
    /* Dokument     */  GRP_WEB_DOC_BEGIN,  GRP_WEB_DOC_END,
    /* Funktionen   */  GRP_WEB_FKT_BEGIN,  GRP_WEB_FKT_END,
    /* Referenzen   */  GRP_WEB_REF_BEGIN,  GRP_WEB_REF_END,
    /* Ablage       */  GRP_WEB_REG_BEGIN,  GRP_WEB_REG_END,
    /* DB           */  GRP_WEB_DB_BEGIN,   GRP_WEB_DB_END,
    /* User         */  GRP_WEB_VAR_BEGIN,  GRP_WEB_VAR_END,
};

    if (bHtmlMode)
        return aWebRanges[(USHORT)nGrpId];
    else
        return aRanges[(USHORT)nGrpId];
}

/*--------------------------------------------------------------------
    Beschreibung: GroupId bestimmen
 --------------------------------------------------------------------*/

USHORT SwFldMgr::GetGroup(BOOL bHtmlMode, USHORT nTypeId, USHORT nSubType) const
{
    if (nTypeId == TYP_SETINPFLD)
        nTypeId = TYP_SETFLD;

    if (nTypeId == TYP_INPUTFLD && (nSubType & INP_USR))
        nTypeId = TYP_USERFLD;

    if (nTypeId == TYP_FIXDATEFLD)
        nTypeId = TYP_DATEFLD;

    if (nTypeId == TYP_FIXTIMEFLD)
        nTypeId = TYP_TIMEFLD;

    for (USHORT i = GRP_DOC; i <= GRP_VAR; i++)
    {
        const SwFldGroupRgn& rRange = GetGroupRange(bHtmlMode, i);
        for (USHORT nPos = rRange.nStart; nPos < rRange.nEnd; nPos++)
        {
            if (aSwFlds[nPos].nTypeId == nTypeId)
                return i;
        }
    }
    return USHRT_MAX;
}

/*--------------------------------------------------------------------
    Beschreibung: Namen zur TypeId ermitteln
                  ZUGRIFF ueber TYP_....
 --------------------------------------------------------------------*/


USHORT SwFldMgr::GetTypeId(USHORT nPos) const
{
    ASSERT(nPos < ::GetPackCount(), "unzulaessige Pos");
    return aSwFlds[ nPos ].nTypeId;
}


const String& SwFldMgr::GetTypeStr(USHORT nPos) const
{
    ASSERT(nPos < ::GetPackCount(), "unzulaessige TypeId");

    USHORT nFldWh = aSwFlds[ nPos ].nTypeId;

    // Sonderbehandlung fuer Datum/Zeit Felder (ohne var/fix)
    if( TYP_DATEFLD == nFldWh )
    {
        if( !pDate )
            pDate = new SW_RESSTR( STR_DATEFLD );
        return *pDate;
    }
    if( TYP_TIMEFLD == nFldWh )
    {
        if( !pTime )
            pTime = new SW_RESSTR( STR_TIMEFLD );
        return *pTime;
    }

    return *SwFieldType::GetFldNames()->GetObject( nFldWh );
}

/*--------------------------------------------------------------------
    Beschreibung: Pos in der Liste bestimmen
 --------------------------------------------------------------------*/


USHORT SwFldMgr::GetPos(USHORT nTypeId) const
{
    switch( nTypeId )
    {
        case TYP_FIXDATEFLD:        nTypeId = TYP_DATEFLD;      break;
        case TYP_FIXTIMEFLD:        nTypeId = TYP_TIMEFLD;      break;
        case TYP_SETINPFLD:         nTypeId = TYP_SETFLD;       break;
        case TYP_USRINPFLD:         nTypeId = TYP_USERFLD;      break;
    }

    for(USHORT i = 0; i < GetPackCount(); i++)
        if(aSwFlds[i].nTypeId == nTypeId)
            return i;

    return USHRT_MAX;
}

/*--------------------------------------------------------------------
    Beschreibung: Subtypen eines Feldes lokalisieren
 --------------------------------------------------------------------*/

SvStringsDtor& SwFldMgr::GetSubTypes(USHORT nTypeId)
{
    // aSubLst.DeleteAndDestroy(0, aSubLst.Count());
    for (USHORT i=0; i < aSubLst.Count();  )
    {
        String* pStr = aSubLst[i];
        DELETEZ(pStr);
        aSubLst.Remove(i);
    }

    const USHORT nPos = GetPos(nTypeId);

    switch(nTypeId)
    {
        case TYP_SETREFFLD:
        case TYP_GETREFFLD:
        {
            // Referenzen sind keine Felder
            pWrtShell ?
                pWrtShell->GetRefMarks( &aSubLst ) :
                    ::lcl_GetShell()->GetRefMarks( &aSubLst );
            break;
        }
        case TYP_MACROFLD:
        {
            if (sMacroPath.Len())
            {
                String sPath = sMacroPath.Copy(sMacroPath.Search('.', 0));
                if (pModule)
                {
                    SbxArray* pSbxArray = pModule->GetMethods();

                    for (USHORT nMethod = 0; nMethod < pSbxArray->Count(); nMethod++)
                    {
                        SbMethod* pMethod = (SbMethod*)pSbxArray->Get(nMethod);
                        DBG_ASSERT( pMethod, "Methode nicht gefunden! (NULL)" );

                        String* pNew = new String(pMethod->GetName());
                        *pNew += sPath;
                        aSubLst.Insert(pNew, aSubLst.Count());
                    }
                }
                else
                {
                    String* pNew = new String(sMacroPath);
                    aSubLst.Insert(pNew, aSubLst.Count());
                }
            }
            break;
        }
        case TYP_INPUTFLD:
        {   String* pNew = new SW_RESSTR(aSwFlds[nPos].nSubTypeStart);
            aSubLst.Insert(pNew, aSubLst.Count());
            // Weiter bei generischen Typen
        }
        case TYP_DDEFLD:
        case TYP_SEQFLD:
        case TYP_FORMELFLD:
        case TYP_GETFLD:
        case TYP_SETFLD:
        case TYP_USERFLD:
        {
            SwWrtShell &rSh = pWrtShell ? *pWrtShell : *::lcl_GetShell();
            const USHORT nCount = rSh.GetFldTypeCount();
            for(USHORT i = 0; i < nCount; ++i)
            {
                SwFieldType* pFldType = rSh.GetFldType( i );
                const USHORT nWhich = pFldType->Which();

                if((nTypeId == TYP_DDEFLD && pFldType->Which() == RES_DDEFLD) ||

                   (nTypeId == TYP_USERFLD && nWhich == RES_USERFLD) ||

                   (nTypeId == TYP_GETFLD && nWhich == RES_SETEXPFLD &&
                    !(((SwSetExpFieldType*)pFldType)->GetType() & GSE_SEQ)) ||

                   (nTypeId == TYP_SETFLD && nWhich == RES_SETEXPFLD &&
                    !(((SwSetExpFieldType*)pFldType)->GetType() & GSE_SEQ)) ||

                   (nTypeId == TYP_SEQFLD && nWhich == RES_SETEXPFLD  &&
                   (((SwSetExpFieldType*)pFldType)->GetType() & GSE_SEQ)) ||

                   ((nTypeId == TYP_INPUTFLD  || nTypeId == TYP_FORMELFLD) &&
                     (nWhich == RES_USERFLD ||
                      nWhich == RES_SETEXPFLD &&
                      !(((SwSetExpFieldType*)pFldType)->GetType() & GSE_SEQ)) ) )
                {
                    String* pNew = new String(pFldType->GetName());
                    aSubLst.Insert(pNew, aSubLst.Count());
                }
            }
            break;
        }
        case TYP_DBNEXTSETFLD:
        case TYP_DBNUMSETFLD:
        case TYP_DBNAMEFLD:
        case TYP_DBSETNUMBERFLD:
            break;

        default:
        {
            // statische SubTypes
            if(nPos != USHRT_MAX)
            {
                USHORT nCount;
                if (nTypeId == TYP_DOCINFOFLD)
                    nCount = DI_SUBTYPE_END - DI_SUBTYPE_BEGIN;
                else
                    nCount = aSwFlds[nPos].nSubTypeEnd - aSwFlds[nPos].nSubTypeStart;

                SwWrtShell &rSh = pWrtShell ? *pWrtShell : *::lcl_GetShell();
                for(USHORT i = 0; i < nCount; ++i)
                {
                    String* pNew;
                    if (nTypeId == TYP_DOCINFOFLD)
                    {
                        if (i >= DI_INFO1 && i <= DI_INFO4)
                            pNew = new String( rSh.GetInfo()->GetUserKey(i-DI_INFO1).GetTitle());
                        else
                            pNew = new String(*ViewShell::GetShellRes()->aDocInfoLst[i]);
                    }
                    else
                        pNew = new SW_RESSTR(aSwFlds[nPos].nSubTypeStart + i);

                    aSubLst.Insert(pNew, aSubLst.Count());
                }
            }
        }
    }
    return aSubLst;
}

/*--------------------------------------------------------------------
    Beschreibung: Format ermitteln
                  ZUGRIFF ueber TYP_....
 --------------------------------------------------------------------*/


USHORT SwFldMgr::GetFormatCount(USHORT nTypeId, BOOL bIsText, BOOL bHtmlMode) const
{
    ASSERT(nTypeId < TYP_END, "unzulaessige TypeId");

    {
        const USHORT nPos = GetPos(nTypeId);

        if(nPos == USHRT_MAX || (bHtmlMode && nTypeId == TYP_SETFLD))
            return 0;

        ULONG nStart = aSwFlds[nPos].nFmtBegin;
        ULONG nEnd   = aSwFlds[nPos].nFmtEnd;

        if (bIsText && nEnd - nStart >= 2)
            return 2;

        if (nTypeId == TYP_FILENAMEFLD)
            nEnd -= 2;  // Kein Bereich oder Vorlage

        switch(nStart)
        {
            case FMT_GETVAR_BEGIN:
            case FMT_SETVAR_BEGIN:  return VF_COUNT;
            case FMT_USERVAR_BEGIN: return VF_USR_COUNT;
            case FMT_DBFLD_BEGIN:   return VF_DB_COUNT;
        }
        return (USHORT)(nEnd - nStart);
    }
}

/*--------------------------------------------------------------------
    Beschreibung:   FormatString zu einem Typ ermitteln
 --------------------------------------------------------------------*/


String SwFldMgr::GetFormatStr(USHORT nTypeId, ULONG nFormatId) const
{
    String aRet;
    SwWrtShell *pSh = pWrtShell ? pWrtShell : ::lcl_GetShell();
    ASSERT(nTypeId < TYP_END, "unzulaessige TypeId");

    const USHORT nPos = GetPos(nTypeId);

    if(nPos == USHRT_MAX)
        return aRet;

    ULONG nStart;

    nStart = aSwFlds[nPos].nFmtBegin;

    if (nTypeId == TYP_FILENAMEFLD)
        nFormatId &= ~FF_FIXED;     // Fixed-Flag ausmaskieren

    aRet = SW_RESSTR((USHORT)(nStart + nFormatId));

    return aRet;
}

/*--------------------------------------------------------------------
    Beschreibung:   FormatId aus Pseudo-ID ermitteln
 --------------------------------------------------------------------*/

USHORT SwFldMgr::GetFormatId(USHORT nTypeId, ULONG nFormatId) const
{
    USHORT nId = (USHORT)nFormatId;

    switch( nTypeId )
    {
    case TYP_DOCINFOFLD:
        switch( aSwFlds[ GetPos( nTypeId ) ].nFmtBegin + nFormatId )
        {
        case FMT_REG_AUTHOR:    nId = DI_SUB_AUTHOR;    break;
        case FMT_REG_TIME:      nId = DI_SUB_TIME;      break;
        case FMT_REG_DATE:      nId = DI_SUB_DATE;      break;
        }
        break;

    case TYP_PAGENUMBERFLD:
    case TYP_NEXTPAGEFLD:
    case TYP_PREVPAGEFLD:
    case TYP_DOCSTATFLD:
    case TYP_DBSETNUMBERFLD:
    case TYP_SEQFLD:
    case TYP_GETREFPAGEFLD:
        switch( aSwFlds[ GetPos( nTypeId ) ].nFmtBegin + nFormatId )
        {
        case FMT_NUM_ABC:               nId = SVX_NUM_CHARS_UPPER_LETTER;   break;
        case FMT_NUM_SABC:              nId = SVX_NUM_CHARS_LOWER_LETTER;   break;
        case FMT_NUM_ROMAN:             nId = SVX_NUM_ROMAN_UPPER;          break;
        case FMT_NUM_SROMAN:            nId = SVX_NUM_ROMAN_LOWER;          break;
        case FMT_NUM_ARABIC:            nId = SVX_NUM_ARABIC;               break;
        case FMT_NUM_PAGEDESC:          nId = SVX_NUM_PAGEDESC;             break;
        case FMT_NUM_PAGESPECIAL:       nId = SVX_NUM_CHAR_SPECIAL;         break;
        case FMT_NUM_ABC_N:             nId = SVX_NUM_CHARS_UPPER_LETTER_N; break;
        case FMT_NUM_SABC_N:            nId = SVX_NUM_CHARS_LOWER_LETTER_N; break;
        }
        break;

    case TYP_DDEFLD:
        switch ( aSwFlds[ GetPos( nTypeId ) ].nFmtBegin + nFormatId )
        {
        case FMT_DDE_NORMAL:    nId = LINKUPDATE_ONCALL; break;
        case FMT_DDE_HOT:       nId = LINKUPDATE_ALWAYS; break;
        }
        break;
    }

    return nId;

}

/*--------------------------------------------------------------------
    Beschreibung: Traveling
 --------------------------------------------------------------------*/


BOOL SwFldMgr::GoNextPrev( BOOL bNext, SwFieldType* pTyp )
{
    SwWrtShell* pSh = pWrtShell ? pWrtShell : ::lcl_GetShell();

    if( !pTyp && pCurFld )
    {
        const USHORT nTypeId = pCurFld->GetTypeId();
        if( TYP_SETINPFLD == nTypeId || TYP_USRINPFLD == nTypeId )
            pTyp = pSh->GetFldType( 0, RES_INPUTFLD );
        else
            pTyp = pCurFld->GetTyp();
    }

    if (pTyp && pTyp->Which() == RES_DBFLD)
    {
        // Fuer Feldbefehl-bearbeiten (alle DB-Felder anspringen)
        return pSh->MoveFldType( 0, bNext, USHRT_MAX, RES_DBFLD );
    }

    return pTyp && pSh ? pSh->MoveFldType( pTyp, bNext ) : FALSE;
}

/*--------------------------------------------------------------------
    Beschreibung: Feldtypen einfuegen
 --------------------------------------------------------------------*/


void SwFldMgr::InsertFldType(SwFieldType& rType)
{
    pWrtShell ?
            pWrtShell->InsertFldType(rType) :
                ::lcl_GetShell()->InsertFldType(rType);
}

/*--------------------------------------------------------------------
    Beschreibung: Aktuelle TypeId ermitteln
 --------------------------------------------------------------------*/


USHORT SwFldMgr::GetCurTypeId() const
{
    return pCurFld->GetTypeId();
}

/*--------------------------------------------------------------------
    Beschreibung: Ueber String  Feld einfuegen oder Update
 --------------------------------------------------------------------*/


BOOL SwFldMgr::InsertFld(USHORT         nType,
                         USHORT         nSubType,
                         const  String& rPar1,
                         const  String& rPar2,
                         ULONG          nFormat,
                         SwWrtShell*    pSh,
                         sal_Unicode    cSeparator)
{
    SwField* pFld   = 0;
    BOOL bExp = FALSE;
    BOOL bTbl = FALSE;
    BOOL bPageVar = FALSE;

    if (pSh == NULL)
        pSh = pWrtShell ? pWrtShell : ::lcl_GetShell();

    switch(nType)
    {   // ACHTUNG dieses Feld wird ueber einen gesonderten Dialog eingefuegt
        case TYP_POSTITFLD:
        {
            SwPostItFieldType* pType =
                (SwPostItFieldType*)pSh->GetFldType(0, RES_POSTITFLD);
            pFld = new SwPostItField(pType, rPar1, rPar2, Date());
            break;
        }
        case TYP_SCRIPTFLD:
        {
            SwScriptFieldType* pType =
                (SwScriptFieldType*)pSh->GetFldType(0, RES_SCRIPTFLD);
            pFld = new SwScriptField(pType, rPar1, rPar2, (BOOL)nFormat);
            break;
        }
        case TYP_AUTHORITY:
        {
            SwAuthorityFieldType* pType =
                (SwAuthorityFieldType*)pSh->GetFldType(0, RES_AUTHORITY);
            if(!pType)
            {
                pType =
                    (SwAuthorityFieldType*)pSh->InsertFldType(
                                    SwAuthorityFieldType(pSh->GetDoc()));
            }
            pFld = new SwAuthorityField(pType, rPar1);
        }
        break;
        case TYP_DATEFLD:
        case TYP_TIMEFLD:
        {
            USHORT nSub = (nType == TYP_DATEFLD) ? DATEFLD : TIMEFLD;
            nSub |= nSubType == DATE_VAR ? 0 : FIXEDFLD;

            SwDateTimeFieldType* pTyp =
                (SwDateTimeFieldType*)pSh->GetFldType(0, RES_DATETIMEFLD);
            pFld = new SwDateTimeField(pTyp, nSub, nFormat);
            pFld->SetPar2(rPar2);
            break;
        }
        case TYP_FILENAMEFLD:
        {
            SwFileNameFieldType* pTyp =
                (SwFileNameFieldType*)pSh->GetFldType(0, RES_FILENAMEFLD);
            pFld = new SwFileNameField(pTyp, nFormat);
            break;
        }
        case TYP_TEMPLNAMEFLD:
        {
            SwTemplNameFieldType* pTyp =
                (SwTemplNameFieldType*)pSh->GetFldType(0, RES_TEMPLNAMEFLD);
            pFld = new SwTemplNameField(pTyp, nFormat);
            break;
        }
        case TYP_CHAPTERFLD:
        {   USHORT nByte = rPar2.ToInt32();
            SwChapterFieldType* pTyp =
                (SwChapterFieldType*)pSh->GetFldType(0, RES_CHAPTERFLD);
            pFld = new SwChapterField(pTyp, nFormat);
            nByte = Max(USHORT(1), nByte);
            nByte = Min(nByte, USHORT(MAXLEVEL));
            nByte -= 1;
            ((SwChapterField*)pFld)->SetLevel((BYTE)nByte);
            break;
        }
        case TYP_NEXTPAGEFLD:
        case TYP_PREVPAGEFLD:
        case TYP_PAGENUMBERFLD:
        {
            short nOff  = rPar2.ToInt32();

            if(nType == TYP_NEXTPAGEFLD)
            {
                if( SVX_NUM_CHAR_SPECIAL == nFormat )
                    nOff = 1;
                else
                    nOff += 1;
                nSubType = PG_NEXT;
            }
            else if(nType == TYP_PREVPAGEFLD)
            {
                if( SVX_NUM_CHAR_SPECIAL == nFormat )
                    nOff = -1;
                else
                    nOff -= 1;
                nSubType =  PG_PREV;
            }
            else
                nSubType = PG_RANDOM;

            SwPageNumberFieldType* pTyp =
                (SwPageNumberFieldType*)pSh->GetFldType(0, RES_PAGENUMBERFLD);
            pFld = new SwPageNumberField(pTyp, nSubType, nFormat, nOff);

            if( SVX_NUM_CHAR_SPECIAL == nFormat &&
                ( PG_PREV == nSubType || PG_NEXT == nSubType ) )
                ((SwPageNumberField*)pFld)->SetUserString( rPar2 );
            break;
        }
        case TYP_DOCSTATFLD:
        {   SwDocStatFieldType* pTyp =
                (SwDocStatFieldType*)pSh->GetFldType(0, RES_DOCSTATFLD);
            pFld = new SwDocStatField(pTyp, nSubType, nFormat);
            break;
        }
        case TYP_AUTHORFLD:
        {   SwAuthorFieldType* pTyp =
                (SwAuthorFieldType*)pSh->GetFldType(0, RES_AUTHORFLD);
            pFld = new SwAuthorField(pTyp, nFormat);
            break;
        }
        case TYP_CONDTXTFLD:
        case TYP_HIDDENTXTFLD:
        {
            SwHiddenTxtFieldType* pTyp =
                (SwHiddenTxtFieldType*)pSh->GetFldType(0, RES_HIDDENTXTFLD);
            pFld = new SwHiddenTxtField(pTyp, TRUE, rPar1, rPar2, FALSE, nType);
            bExp = TRUE;
            break;
        }
        case TYP_HIDDENPARAFLD:
        {
            SwHiddenParaFieldType* pTyp =
                (SwHiddenParaFieldType*)pSh->GetFldType(0, RES_HIDDENPARAFLD);
            pFld = new SwHiddenParaField(pTyp, rPar1);
            bExp = TRUE;
            break;
        }
        case TYP_SETREFFLD:
        {
            if( rPar1.Len() > 0 && CanInsertRefMark( rPar1 ) )
            {
                pSh->SetAttr( SwFmtRefMark( rPar1 ) );
                return TRUE;
            }
            return FALSE;
        }
        case TYP_GETREFFLD:
        {
            SwGetRefFieldType* pTyp =
                (SwGetRefFieldType*)pSh->GetFldType(0, RES_GETREFFLD);
            USHORT nSeqNo = rPar2.ToInt32();
            pFld = new SwGetRefField(pTyp, rPar1, nSubType, nSeqNo, nFormat);
            bExp = TRUE;
            break;
        }
        case TYP_DDEFLD:
        {
            //JP 28.08.95: DDE-Topics/-Items koennen Blanks in ihren
            //              Namen haben! Wird hier noch nicht beachtet.
            String sCmd( rPar2 );
            USHORT nTmpPos = sCmd.SearchAndReplace( ' ', cTokenSeperator );
            sCmd.SearchAndReplace( ' ', cTokenSeperator, nTmpPos );

            SwDDEFieldType* pTyp = (SwDDEFieldType*)pSh->InsertFldType(
                    SwDDEFieldType( rPar1, sCmd, (USHORT)nFormat ));
            pFld = new SwDDEField( pTyp );
            break;
        }
        case TYP_MACROFLD:
        {
            SwMacroFieldType* pTyp =
                (SwMacroFieldType*)pSh->GetFldType(0, RES_MACROFLD);

            pFld = new SwMacroField(pTyp, rPar1, rPar2);
            break;
        }
        case TYP_INTERNETFLD:
        {
            SwFmtINetFmt aFmt( rPar1, sCurFrame );
            if( pMacroItem )
                aFmt.SetMacroTbl( &pMacroItem->GetMacroTable() );
            return pSh->InsertURL( aFmt, rPar2 );
        }
        case TYP_JUMPEDITFLD:
        {
            SwJumpEditFieldType* pTyp =
                (SwJumpEditFieldType*)pSh->GetFldType(0, RES_JUMPEDITFLD);

            pFld = new SwJumpEditField(pTyp, nFormat, rPar1, rPar2 );
            break;
        }
        case TYP_DOCINFOFLD:
        {
            SwDocInfoFieldType* pTyp = (SwDocInfoFieldType*)pSh->GetFldType(
                                            0, RES_DOCINFOFLD );
            pFld = new SwDocInfoField(pTyp, nSubType, nFormat);
            break;
        }
        case TYP_EXTUSERFLD:
        {
            SwExtUserFieldType* pTyp = (SwExtUserFieldType*)pSh->GetFldType(
                                            0, RES_EXTUSERFLD);
            pFld = new SwExtUserField(pTyp, nSubType, nFormat);
            break;
        }
        case TYP_DBFLD:
        {
            String sDBName;
            String sPar1;

            if (rPar1.Search(DB_DELIM) == STRING_NOTFOUND)
            {
                sDBName = pSh->GetDBName();
                sPar1 = rPar1;
            }
            else
            {
                sDBName = rPar1.GetToken(0, DB_DELIM);
                sDBName += DB_DELIM;
                sDBName += rPar1.GetToken(1, DB_DELIM);
                sPar1 = rPar1.GetToken(2, DB_DELIM);
            }

            if (sDBName.Len() && pSh->GetDBName() != sDBName)
                pSh->ChgDBName(sDBName);

            SwDBFieldType* pTyp = (SwDBFieldType*)pSh->InsertFldType(
                    SwDBFieldType(pSh->GetDoc(), sPar1, sDBName) );
            pFld = new SwDBField(pTyp);
            pFld->SetSubType(nSubType);

            if( !(nSubType & SUB_OWN_FMT) ) // Datenbankformat ermitteln
            {
#ifdef REPLACE_OFADBMGR
                String sSourceName(sDBName.GetToken(0, DB_DELIM));
                String sTableName(sDBName.GetToken(1, DB_DELIM));
                nFormat = pSh->GetNewDBMgr()->GetColumnFmt( sSourceName, sTableName, sPar1,
                                        pSh->GetNumberFormatter(), GetCurrLanguage() );
#else
                nFormat = pSh->GetNewDBMgr()->GetColumnFmt( sDBName, sPar1,
                                        pSh->GetNumberFormatter() );
#endif
            }
            pFld->ChangeFormat( nFormat );

            bExp = TRUE;
            break;
        }
        case TYP_DBSETNUMBERFLD:
        case TYP_DBNUMSETFLD:
        case TYP_DBNEXTSETFLD:
        case TYP_DBNAMEFLD:
        {
            USHORT nPos, nTablePos, nExpPos;
            String sDBName, sPar1;

            // DBName aus rPar1 extrahieren. Format: DBName.TableName.ExpStrg
            if ((nTablePos = rPar1.Search(DB_DELIM)) != STRING_NOTFOUND)
                sDBName = rPar1.Copy(0, nTablePos++);
            if ((nExpPos = rPar1.Search(DB_DELIM, nTablePos)) != STRING_NOTFOUND)
            {
                sDBName += DB_DELIM;
                sDBName += rPar1.Copy(nTablePos, nExpPos++ - nTablePos);
            }
            if (nExpPos != STRING_NOTFOUND)
                nPos = nExpPos;
            else if (nTablePos != STRING_NOTFOUND)
                nPos = nTablePos;
            else
                nPos = 0;
            sPar1 = rPar1.Copy(nPos);

#ifdef REPLACE_OFADBMGR
            if (sDBName.Len() && pSh->GetDBName() != sDBName)
#else
            if (sDBName.Len() && pSh->GetDBName().ToUpperAscii() != sDBName.ToUpperAscii())
#endif
                pSh->ChgDBName(sDBName);

            switch(nType)
            {
                case TYP_DBNAMEFLD:
                {
                    SwDBNameFieldType* pTyp =
                        (SwDBNameFieldType*)pSh->GetFldType(0, RES_DBNAMEFLD);
                    pFld = new SwDBNameField(pTyp, sDBName);

                    break;
                }
                case TYP_DBNEXTSETFLD:
                {
                    SwDBNextSetFieldType* pTyp = (SwDBNextSetFieldType*)pSh->GetFldType(
                                                    0, RES_DBNEXTSETFLD);
                    pFld = new SwDBNextSetField(pTyp, sPar1, rPar2, sDBName);
                    bExp = TRUE;
                    break;
                }
                case TYP_DBNUMSETFLD:
                {
                    SwDBNumSetFieldType* pTyp = (SwDBNumSetFieldType*)pSh->GetFldType(
                                                    0, RES_DBNUMSETFLD);
                    pFld = new SwDBNumSetField( pTyp, sPar1, rPar2, sDBName);
                    bExp = TRUE;
                    break;
                }
                case TYP_DBSETNUMBERFLD:
                {
                    SwDBSetNumberFieldType* pTyp = (SwDBSetNumberFieldType*)
                                                pSh->GetFldType(0, RES_DBSETNUMBERFLD);
                    pFld = new SwDBSetNumberField( pTyp, sDBName, nFormat);
                    bExp = TRUE;
                    break;
                }
            }
            break;
        }
        case TYP_USERFLD:
        {
            SwUserFieldType* pTyp =
                (SwUserFieldType*)pSh->GetFldType(RES_USERFLD, rPar1);

            // nur wenn vorhanden
            if(!pTyp)
            {
                pTyp = (SwUserFieldType*)pSh->InsertFldType(
                        SwUserFieldType(pSh->GetDoc(), rPar1));
            }
            if (pTyp->GetContent(nFormat) != rPar2)
                pTyp->SetContent(rPar2, nFormat);
            pFld = new SwUserField(pTyp, 0, nFormat);
            if (pFld->GetSubType() != nSubType)
                pFld->SetSubType(nSubType);
            bTbl = TRUE;
            break;
        }
        case TYP_INPUTFLD:
        {
            if ((nSubType & 0x00ff) == INP_VAR)
            {
                SwSetExpFieldType* pTyp = (SwSetExpFieldType*)
                                    pSh->GetFldType(RES_SETEXPFLD, rPar1);

                // kein Experssion Type mit dem Namen vorhanden -> anlegen
                if(pTyp)
                {
                    SwSetExpField* pExpFld =
                        new SwSetExpField(pTyp, aEmptyStr, nFormat);

                    // Typ vom SwSetExpFieldType nicht veraendern:
                    USHORT nOldSubType = pExpFld->GetSubType();
                    pExpFld->SetSubType(nOldSubType | (nSubType & 0xff00));

                    pExpFld->SetPromptText(rPar2);
                    pExpFld->SetInputFlag(TRUE) ;
                    bExp = TRUE;
                    pFld = pExpFld;
                }
                else
                    return FALSE;
            }
            else
            {
                SwInputFieldType* pTyp =
                    (SwInputFieldType*)pSh->GetFldType(0, RES_INPUTFLD);

                SwInputField* pInpFld =
                    new SwInputField(pTyp, rPar1, rPar2, nSubType|SUB_INVISIBLE, nFormat);
                pFld = pInpFld;
            }

            // Dialog starten
            //
            pSh->StartInputFldDlg(pFld, FALSE);
            break;
        }
        case TYP_SETFLD:
        {
            if (!rPar2.Len())   // Leere Variablen sind nicht erlaubt
                return FALSE;

            SwSetExpFieldType* pTyp = (SwSetExpFieldType*)pSh->InsertFldType(
                    SwSetExpFieldType(pSh->GetDoc(), rPar1) );

            SwSetExpField* pExpFld = new SwSetExpField( pTyp, rPar2, nFormat);
            pExpFld->SetSubType(nSubType);
            pExpFld->SetPar2(rPar2);
            bExp = TRUE;
            pFld = pExpFld;
            break;
        }
        case TYP_SEQFLD:
        {
            SwSetExpFieldType* pTyp = (SwSetExpFieldType*)pSh->InsertFldType(
                    SwSetExpFieldType(pSh->GetDoc(), rPar1, GSE_SEQ));

            BYTE nLevel = nSubType & 0xff;

            pTyp->SetOutlineLvl(nLevel);
            if (nLevel != 0x7f && cSeparator == 0)
                cSeparator = '.';

            pTyp->SetDelimiter(cSeparator);
            SwSetExpField* pExpFld = new SwSetExpField(pTyp, rPar2, nFormat);
            bExp = TRUE;
            pFld = pExpFld;
            nSubType = GSE_SEQ;
            break;
        }
        case TYP_GETFLD:
        {
            // gibt es ein entprechendes SetField
            SwSetExpFieldType* pSetTyp = (SwSetExpFieldType*)
                                    pSh->GetFldType(RES_SETEXPFLD, rPar1);

            if(pSetTyp)
            {
                SwGetExpFieldType* pTyp = (SwGetExpFieldType*)pSh->GetFldType(
                                                0, RES_GETEXPFLD);
                pFld = new SwGetExpField(pTyp, rPar1, pSetTyp->GetType(), nFormat);
                pFld->SetSubType(nSubType | pSetTyp->GetType());
                bExp = TRUE;
            }
            else
                return FALSE;
            break;
        }
        case TYP_FORMELFLD:
        {
            if(pSh->GetFrmType(0,FALSE) & FRMTYPE_TABLE)
            {
                pSh->StartAllAction();

                SvNumberFormatter* pFormatter = pSh->GetDoc()->GetNumberFormatter();
                const SvNumberformat* pEntry = pFormatter->GetEntry(nFormat);

                if (pEntry)
                {
                    SfxStringItem aFormat(FN_NUMBER_FORMAT, pEntry->GetFormatstring());
                    pSh->GetView().GetViewFrame()->GetDispatcher()->
                        Execute(FN_NUMBER_FORMAT, SFX_CALLMODE_SYNCHRON, &aFormat, 0L);
                }

                SfxItemSet aBoxSet( pSh->GetAttrPool(),
                                RES_BOXATR_FORMULA, RES_BOXATR_FORMULA );

                String sFml( rPar2 );
                if( sFml.EraseLeadingChars().Len() &&
                    '=' == sFml.GetChar( 0 ) )
                    sFml.Erase( 0, 1 );

                aBoxSet.Put( SwTblBoxFormula( sFml ));
                pSh->SetTblBoxFormulaAttrs( aBoxSet );
                pSh->UpdateTable();

                pSh->EndAllAction();
                return TRUE;

/*              // In der Tabelle Tabellenformeln einfuegen
                SwTblFieldType* pTyp = (SwTblFieldType*)pSh->GetFldType(
                                                        0, RES_TABLEFLD);
                pFld = new SwTblField(pTyp, rPar2, GSE_EXPR, nFormat);
                bTbl = TRUE;*/
            }
            else
            {
                SwGetExpFieldType* pTyp = (SwGetExpFieldType*)
                                            pSh->GetFldType(0, RES_GETEXPFLD);
                pFld = new SwGetExpField(pTyp, rPar2, GSE_FORMULA, nFormat);
                pFld->SetSubType(nSubType);
                bExp = TRUE;
            }
            break;
        }
        case TYP_SETREFPAGEFLD:
            pFld = new SwRefPageSetField( (SwRefPageSetFieldType*)
                                pSh->GetFldType( 0, RES_REFPAGESETFLD ),
                                rPar2.ToInt32(), 0 != nSubType  );
            bPageVar = TRUE;
            break;

        case TYP_GETREFPAGEFLD:
            pFld = new SwRefPageGetField( (SwRefPageGetFieldType*)
                            pSh->GetFldType( 0, RES_REFPAGEGETFLD ), nFormat );
            bPageVar = TRUE;
            break;

        default:
        {   ASSERT(!this, "Falscher Feldtyp");
            return FALSE;
        }
    }
    ASSERT(pFld, "Feld nicht vorhanden");

    USHORT nLang = GetCurrLanguage();

    // Language
    pFld->SetLanguage(nLang);

    // Einfuegen
    pSh->StartAllAction();

    pSh->Insert(*pFld);

    if(bExp && bEvalExp)
        pSh->UpdateExpFlds(TRUE);

    if(bTbl)
    {
        pSh->Left();
        pSh->UpdateFlds(*pFld);
        pSh->Right();
    }
    else if( bPageVar )
        ((SwRefPageGetFieldType*)pSh->GetFldType( 0, RES_REFPAGEGETFLD ))->UpdateFlds();
    else if( TYP_GETREFFLD == nType )
        pFld->GetTyp()->Modify( 0, 0 );

    // temporaeres Feld loeschen
    delete pFld;

    pSh->EndAllAction();
    return TRUE;
}

/*--------------------------------------------------------------------
    Beschreibung: Felder Update
 --------------------------------------------------------------------*/


void SwFldMgr::UpdateCurFld(ULONG nFormat,
                            const String& rPar1,
                            const String& rPar2)
{
    // Format aendern
    ASSERT(pCurFld, "kein Feld an der CursorPos");

    SwFieldType* pType   = pCurFld->GetTyp();
    const USHORT nTypeId = pCurFld->GetTypeId();

    SwWrtShell &rSh = pWrtShell ? *pWrtShell : *::lcl_GetShell();
    rSh.StartAllAction();

    BOOL bSetPar2 = TRUE;
    String sPar1( rPar1 );
    String sPar2( rPar2 );

    // Order to Format
    switch( nTypeId )
    {
        case TYP_DDEFLD:
        {
            //JP 28.08.95: DDE-Topics/-Items koennen Blanks in ihren
            //              Namen haben! Wird hier noch nicht beachtet.
            USHORT nTmpPos = sPar2.SearchAndReplace( ' ', cTokenSeperator );
            sPar2.SearchAndReplace( ' ', cTokenSeperator, nTmpPos );
            break;
        }

        case TYP_CHAPTERFLD:
        {
            USHORT nByte = rPar2.ToInt32();
            nByte = Max(USHORT(1), nByte);
            nByte = Min(nByte, USHORT(MAXLEVEL));
            nByte -= 1;
            ((SwChapterField*)pCurFld)->SetLevel((BYTE)nByte);
            bSetPar2 = FALSE;
            break;
        }

        case TYP_SCRIPTFLD:
            ((SwScriptField*)pCurFld)->SetCodeURL((BOOL)nFormat);
            break;

        case TYP_NEXTPAGEFLD:
            if( SVX_NUM_CHAR_SPECIAL == nFormat )
            {
                ((SwPageNumberField*)pCurFld)->SetUserString( sPar2 );
                sPar2 = 1;
            }
            else
            {
                if( nFormat + 2 == SVX_NUM_PAGEDESC )
                    nFormat = SVX_NUM_PAGEDESC;
                short nOff = sPar2.ToInt32();
                nOff += 1;
                sPar2 = nOff;
            }
            break;

        case TYP_PREVPAGEFLD:
            if( SVX_NUM_CHAR_SPECIAL == nFormat )
            {
                ((SwPageNumberField*)pCurFld)->SetUserString( sPar2 );
                sPar2 = -1;
            }
            else
            {
                if( nFormat + 2 == SVX_NUM_PAGEDESC )
                    nFormat = SVX_NUM_PAGEDESC;
                short nOff = sPar2.ToInt32();
                nOff -= 1;
                sPar2 = nOff;
            }
            break;

        case TYP_PAGENUMBERFLD:
        case TYP_GETREFPAGEFLD:
            if( nFormat + 2 == SVX_NUM_PAGEDESC )
                nFormat = SVX_NUM_PAGEDESC;
            break;

        case TYP_GETREFFLD:
            {
                bSetPar2 = FALSE;
                ((SwGetRefField*)pCurFld)->SetSubType( rPar2.ToInt32() );
                USHORT nPos = rPar2.Search( '|' );
                if( STRING_NOTFOUND != nPos )
                    ((SwGetRefField*)pCurFld)->SetSeqNo( rPar2.Copy( nPos + 1 ).ToInt32());
            }
            break;
    }

    // Format setzen
    // Format wegen NumberFormatter vor SetPar2 einstellen!
    pCurFld->ChangeFormat(nFormat);

    pCurFld->SetPar1( sPar1 );
    if( bSetPar2 )
        pCurFld->SetPar2( sPar2 );

    // Update anschmeissen
    if(nTypeId == TYP_DDEFLD ||
       nTypeId == TYP_USERFLD ||
       nTypeId == TYP_USRINPFLD)
    {
        pType->UpdateFlds();
        rSh.SetModified();
    }
    else
        rSh.SwEditShell::UpdateFlds(*pCurFld);

    rSh.EndAllAction();
}

/*------------------------------------------------------------------------
 Beschreibung:  Setzen / Erfragen Werte von Benutzerfeldern aus BASIC
------------------------------------------------------------------------*/


BOOL SwFldMgr::SetFieldValue(const String &rFieldName,
                             const String &rValue)
{
    SwWrtShell* pSh = pWrtShell ? pWrtShell : ::lcl_GetShell();
    SwUserFieldType* pType = (SwUserFieldType*)pWrtShell->InsertFldType(
                                    SwUserFieldType( pSh->GetDoc(), rFieldName ));

    if(pType)
        pType->SetContent(rValue);
    return 0 != pType;
}

/*------------------------------------------------------------------------
 Beschreibung: Wert Datenbankfeld erfragen
------------------------------------------------------------------------*/


String SwFldMgr::GetDataBaseFieldValue(const String &rDBName, const String &rFieldName, SwWrtShell* pSh)
{
    String sFieldName(rFieldName);

    if (rDBName.Len())
        sFieldName = rDBName;
    else
        sFieldName = pSh->GetDBName();
    sFieldName += DB_DELIM;
    sFieldName += rFieldName;

    SwFieldList aLst(pWrtShell ? pWrtShell : ::lcl_GetShell());

    aLst.InsertFields(RES_DBFLD, &sFieldName);
    SwField* pFld = aLst.GetLastField();

    if(!pFld)
        pFld = aLst.GetNextField();

    if(pFld)
        return pFld->Expand();

    return aEmptyStr;
}

/*--------------------------------------------------------------------
     Beschreibung: Ist das Datenbankfeld numerisch?
     Anm: Im Fehlerfall wird TRUE returnt.
 --------------------------------------------------------------------*/

#ifdef REPLACE_OFADBMGR
BOOL SwFldMgr::IsDBNumeric(const String& rDBName, const String& rTblQryName,
                                    BOOL bIsTable, const String& rFldName)
{
    BOOL bNumeric = TRUE;
    if(!GetDBContext().is() || !xDBContext->hasByName(rDBName))
        return bNumeric;
    Any aDBSource = xDBContext->getByName(rDBName);
    Reference<XDataSource>* pxSource = (Reference<XDataSource>*)aDBSource.getValue();
    Reference<XConnection> xConnection;
    try
    {
        OUString sDummy;
        xConnection = (*pxSource)->getConnection(sDummy, sDummy);
    }
    catch(...) {}
    Reference<XColumnsSupplier> xColsSupplier;

    if(bIsTable)
    {
        Reference<XTablesSupplier> xTSupplier = Reference<XTablesSupplier>(xConnection, UNO_QUERY);
        if(xTSupplier.is())
        {
            Reference<XNameAccess> xTbls = xTSupplier->getTables();
            DBG_ASSERT(xTbls->hasByName(rTblQryName), "table not available anymore?")
            try
            {
                Any aTable = xTbls->getByName(rTblQryName);
                Reference<XPropertySet> xPropSet = *(Reference<XPropertySet>*)aTable.getValue();
                xColsSupplier = Reference<XColumnsSupplier>(xPropSet, UNO_QUERY);
            }
            catch(...){}
        }
    }
    else
    {
        Reference<XQueriesSupplier> xQSupplier = Reference<XQueriesSupplier>(xConnection, UNO_QUERY);
        if(xQSupplier.is())
        {
            Reference<XNameAccess> xQueries = xQSupplier->getQueries();
            DBG_ASSERT(xQueries->hasByName(rTblQryName), "table not available anymore?")
            try
            {
                Any aQuery = xQueries->getByName(rTblQryName);
                Reference<XPropertySet> xPropSet = *(Reference<XPropertySet>*)aQuery.getValue();
                xColsSupplier = Reference<XColumnsSupplier>(xPropSet, UNO_QUERY);
            }
            catch(...){}
        }
    }

    if(xColsSupplier.is())
    {
        Reference <XNameAccess> xCols = xColsSupplier->getColumns();
        if(xCols.is() && xCols->hasByName(rFldName))
        {
            Any aCol = xCols->getByName(rFldName);
            Reference <XPropertySet> xCol = *(Reference <XPropertySet>*)aCol.getValue();
            Any aType = xCol->getPropertyValue(C2S("Type"));
            sal_Int32 eDataType;
            aType >>= eDataType;
            switch(eDataType)
            {
                case DataType::BIT:
                case DataType::TINYINT:
                case DataType::SMALLINT:
                case DataType::INTEGER:
                case DataType::BIGINT:
                case DataType::FLOAT:
                case DataType::REAL:
                case DataType::DOUBLE:
                case DataType::NUMERIC:
                case DataType::DECIMAL:
                case DataType::DATE:
                case DataType::TIME:
                case DataType::TIMESTAMP:
                    break;

                case DataType::BINARY:
                case DataType::VARBINARY:
                case DataType::LONGVARBINARY:
                case DataType::SQLNULL:
                case DataType::OTHER:
                case DataType::OBJECT:
                case DataType::DISTINCT:
                case DataType::STRUCT:
                case DataType::ARRAY:
                case DataType::BLOB:
                case DataType::CLOB:
                case DataType::REF:
                case DataType::CHAR:
                case DataType::VARCHAR:
                case DataType::LONGVARCHAR:
                default:
                    bNumeric = FALSE;
            }
        }
    }
    return bNumeric;
}

#else
BOOL SwFldMgr::IsDBNumeric(const String& rDBName, USHORT nCol)
{
    SwWrtShell *pSh = ::GetActiveView()->GetWrtShellPtr();
    String sDBName;
    if (!rDBName.Len())
        sDBName = pSh->GetDBDesc();
    else
        sDBName = rDBName;

    SwNewDBMgr* pDBMgr = pSh->GetNewDBMgr();
    BOOL bRet = TRUE;
    if(nCol > 0 && pDBMgr->OpenDB(DBMGR_STD, sDBName, FALSE))
    {
        short nType = pDBMgr->GetColumnFormatType(DBMGR_STD, nCol);

        switch (nType)
        {
            case dbCurrency:
            case dbCounter:
            case dbNumeric:
            case dbDateTime:
            case dbDate:
            case dbTime:
            case dbBool:
            case dbDecimal:
            case dbBigInt:
                bRet = TRUE;
                break;

            default:
                bRet = FALSE;
                break;
        }
    }
    return bRet;
}

BOOL SwFldMgr::IsDBNumeric(const String& rDBName, const String& rFldName)
{
    SwWrtShell *pSh = ::GetActiveView()->GetWrtShellPtr();
    SwNewDBMgr* pDBMgr = pSh->GetNewDBMgr();

    String sDBName;
    if (!rDBName.Len())
        sDBName = pSh->GetDBDesc();
    else
        sDBName = rDBName;

    if( pDBMgr->OpenDB(DBMGR_STD, sDBName, FALSE))
    {
        int nCol = pDBMgr->GetColumnPos(DBMGR_STD, rFldName);
        if (nCol > 0)
            return IsDBNumeric(rDBName, nCol);
    }
    return TRUE;
}
#endif

/*--------------------------------------------------------------------
    Beschreibung: ExpressionFields explizit evaluieren
 --------------------------------------------------------------------*/


void SwFldMgr::EvalExpFlds(SwWrtShell* pSh)
{
    if (pSh == NULL)
        pSh = pWrtShell ? pWrtShell : ::lcl_GetShell();

    if(pSh)
    {
        pSh->StartAllAction();
        pSh->UpdateExpFlds(TRUE);
        pSh->EndAllAction();
    }
}


USHORT SwFldMgr::GetCurrLanguage() const
{
    SwWrtShell* pSh = pWrtShell ? pWrtShell : ::lcl_GetShell();
    if(pSh)
    {
        SfxItemSet aSet( pSh->GetAttrPool(), RES_CHRATR_LANGUAGE, RES_CHRATR_LANGUAGE);
        pSh->GetAttr(aSet);
        return ((const SvxLanguageItem&)aSet.Get( RES_CHRATR_LANGUAGE ) ).GetLanguage();
    }

    LanguageType eCurLanguage = GetpApp()->GetAppInternational().GetLanguage();

    return (USHORT)eCurLanguage;
}


void SwFieldType::_GetFldName()
{
    static const USHORT coFldCnt = STR_TYPE_END - STR_TYPE_BEGIN;

    static USHORT __READONLY_DATA coFldNms[ coFldCnt ] = {
        FLD_DATE_STD,
        FLD_TIME_STD,
        STR_FILENAMEFLD,
        STR_DBNAMEFLD,
        STR_CHAPTERFLD,
        STR_PAGENUMBERFLD,
        STR_DOCSTATFLD,
        STR_AUTHORFLD,
        STR_SETFLD,
        STR_GETFLD,
        STR_FORMELFLD,
        STR_HIDDENTXTFLD,
        STR_SETREFFLD,
        STR_GETREFFLD,
        STR_DDEFLD,
        STR_MACROFLD,
        STR_INPUTFLD,
        STR_HIDDENPARAFLD,
        STR_DOCINFOFLD,
        STR_DBFLD,
        STR_USERFLD,
        STR_POSTITFLD,
        STR_TEMPLNAMEFLD,
        STR_SEQFLD,
        STR_DBNEXTSETFLD,
        STR_DBNUMSETFLD,
        STR_DBSETNUMBERFLD,
        STR_CONDTXTFLD,
        STR_NEXTPAGEFLD,
        STR_PREVPAGEFLD,
        STR_EXTUSERFLD,
        FLD_DATE_FIX,
        FLD_TIME_FIX,
        STR_SETINPUTFLD,
        STR_USRINPUTFLD,
        STR_SETREFPAGEFLD,
        STR_GETREFPAGEFLD,
        STR_INTERNETFLD,
        STR_JUMPEDITFLD,
        STR_SCRIPTFLD,
        STR_AUTHORITY
    };

    // Infos fuer Felder einfuegen
    SwFieldType::pFldNames = new SvStringsDtor( (BYTE)coFldCnt, 2 );
    for( USHORT nIdx = 0; nIdx < coFldCnt; ++nIdx )
    {
        String* pTmp = new SW_RESSTR( coFldNms[ nIdx ] );
        pTmp->EraseAllChars('~');
        SwFieldType::pFldNames->Insert(pTmp, nIdx );
    }
}


BOOL SwFldMgr::SetUserSubType(const String& rName, USHORT nType)
{
    BOOL bRet = FALSE;
    SwUserFieldType *pType =
        (SwUserFieldType *) (pWrtShell ?
            pWrtShell->GetFldType(RES_USERFLD, rName) :
                ::lcl_GetShell()->GetFldType(RES_USERFLD, rName));

    if(pType)
    {
        pType->SetType(nType);
        bRet = TRUE;
    }
    return bRet;
}

BOOL SwFldMgr::InsertURL(  const String& rName,
                                const String& rVal,
                                const String& rFrame,
                                const SvxMacroItem* pItem)
{
    sCurFrame = rFrame;
    pMacroItem = pItem;
    BOOL bRet = InsertFld(TYP_INTERNETFLD, 0, rName, rVal, 0);
    sCurFrame = aEmptyStr;
    pMacroItem = 0;
    return bRet;

}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

BOOL SwFldMgr::ChooseMacro(const String &rSelMacro)
{
    String sSelMacro(rSelMacro);
    SfxApplication* pSfxApp = SFX_APP();

    if (sSelMacro.GetToken(0) == pSfxApp->GetName())
    {   // Malte arbeitet (faelschlicherweise) in ChooseMacro mit
        // GetTitle statt GetName, daher diese Konvertierung:
        sSelMacro.SetToken( 0, ';', Application::GetAppName());
    }
    else
    {
        SwWrtShell *pSh = pWrtShell ? pWrtShell : ::lcl_GetShell();
        if (pSh)
        {
            SwDocShell* pDocSh = pSh->GetView().GetDocShell();

            if (sSelMacro.GetToken(0) == pDocSh->GetName())
            {   // Malte arbeitet (faelschlicherweise) in ChooseMacro mit
                // GetTitle statt GetName, daher diese Konvertierung:
                sSelMacro.SetToken( 0, ';', pDocSh->GetTitle( SFX_TITLE_FILENAME ));
            }
        }
    }
    SbMethod* pMethod = BasicIDE::ChooseMacro(FALSE, TRUE, sSelMacro);
    BOOL bRet = FALSE;

    if (pMethod)
    {
        SbModule* pModule = pMethod->GetModule();
        SbxObject* pObject = pModule->GetParent();

        SetMacroModule(pModule);

        ASSERT(pObject->IsA(TYPE(StarBASIC)), "Kein Basic gefunden!");

        String sMacro(pMethod->GetName());
        sMacro += '.';
        sMacro += pModule->GetName();
        sMacro += '.';
        sMacro += pObject->GetName();
        sMacro += '.';

        StarBASIC* pLib = (StarBASIC*)pObject;
        pSfxApp->EnterBasicCall();
        BOOL bFound = FALSE;
        BasicManager* pBasicMgr = pSfxApp->GetBasicManager();
        SfxObjectShell* pDocShell = 0;
        while ( !bFound && pBasicMgr )
        {
            USHORT nLibs = pBasicMgr->GetLibCount();
            for ( USHORT nLib = 0; nLib < nLibs; nLib++ )
            {
                StarBASIC* pL = pBasicMgr->GetLib( nLib );
                if ( pL == pLib )
                {
                    bFound = TRUE;
                    break;
                }
            }
            if(!bFound)
            {
                if ( pDocShell  )
                    pDocShell = SfxObjectShell::GetNext( *pDocShell );
                else
                    pDocShell = SfxObjectShell::GetFirst();
            }

            pBasicMgr = ( pDocShell ? pDocShell->GetBasicManager() : 0 );
        }
        pSfxApp->LeaveBasicCall();
        if(pDocShell)
            sMacro += pDocShell->GetName();
        else
            sMacro += pSfxApp->GetName();


        SetMacroPath(sMacro);
        bRet = TRUE;
    }

    return bRet;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

ULONG SwFldMgr::GetDefaultFormat(USHORT nTypeId, BOOL bIsText, SvNumberFormatter* pFormatter, double* pVal)
{
    double fValue;
    short  nDefFormat;

    switch (nTypeId)
    {
        case TYP_TIMEFLD:
        case TYP_DATEFLD:
        {
            Date aDate;
            Date* pNullDate = pFormatter->GetNullDate();

            fValue = aDate - *pNullDate;

            Time aTime;

            ULONG nNumFmtTime = (ULONG)aTime.GetSec() + (ULONG)aTime.GetMin() * 60L +
                          (ULONG)aTime.GetHour() * 3600L;

            fValue += (double)nNumFmtTime / 86400.0;

            nDefFormat = (nTypeId == TYP_DATEFLD) ? NUMBERFORMAT_DATE : NUMBERFORMAT_TIME;
        }
        break;

        default:
            if (bIsText)
            {
                fValue = 0.0;
                nDefFormat = NUMBERFORMAT_TEXT;
            }
            else
            {
                fValue = 0.0;
                nDefFormat = NUMBERFORMAT_ALL;
            }
            break;
    }

    if (pVal)
        *pVal = fValue;

    return pFormatter->GetStandardFormat(nDefFormat, GetCurrLanguage());
}
#ifdef REPLACE_OFADBMGR
/* -----------------------------23.06.00 17:32--------------------------------

 ---------------------------------------------------------------------------*/
Reference<XNameAccess> SwFldMgr::GetDBContext()
{
    if(!xDBContext.is())
    {
        Reference< XMultiServiceFactory > xMgr( ::utl::getProcessServiceFactory() );
        if( xMgr.is() )
        {
            Reference<XInterface> xInstance = xMgr->createInstance( C2U( "com.sun.star.sdb.DatabaseContext" ));
            xDBContext = Reference<XNameAccess>(xInstance, UNO_QUERY) ;
        }
        DBG_ASSERT(xDBContext.is(), "com.sun.star.sdb.DataBaseContext: service not available")
    }
    return xDBContext;
}
#endif

/*************************************************************************

      $Log: not supported by cvs2svn $
      Revision 1.285  2000/09/18 16:05:29  willem.vandorp
      OpenOffice header added.

      Revision 1.284  2000/09/07 15:59:23  os
      change: SFX_DISPATCHER/SFX_BINDINGS removed

      Revision 1.283  2000/09/04 11:43:16  tbe
      basicide, isetbrw, si, vcdlged moved from svx to basctl

      Revision 1.282  2000/08/15 19:53:15  jp
      Bug #76817#: DDE-Field - use the correct format Id's

      Revision 1.281  2000/07/18 12:50:08  os
      replace ofadbmgr

      Revision 1.280  2000/06/30 08:52:52  os
      #76541# string assertions removed

      Revision 1.279  2000/06/26 13:36:00  os
      new DataBase API

      Revision 1.278  2000/05/26 07:21:29  os
      old SW Basic API Slots removed

      Revision 1.277  2000/04/18 15:17:32  os
      UNICODE

      Revision 1.276  2000/02/11 14:46:35  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.275  1999/10/21 10:50:48  os
      SwAuthorityFieldType has SwDoc* member

      Revision 1.274  1999/10/11 09:00:11  os
      AuthorityField(Type):Import/Export interfaces

      Revision 1.273  1999/09/20 09:46:33  os
      second param at SwAuthorityField

      Revision 1.272  1999/09/15 14:04:02  os
      AuthorityField(-Type), RES_AUTHORITY

      Revision 1.271  1999/01/12 20:16:08  JP
      Bug #60431#: Datenbank Numberformate ggfs. ins Doc uebertragen


      Rev 1.270   12 Jan 1999 21:16:08   JP
   Bug #60431#: Datenbank Numberformate ggfs. ins Doc uebertragen

      Rev 1.269   27 Nov 1998 14:52:16   AMA
   Fix #59951#59825#: Unterscheiden zwischen Rahmen-,Seiten- und Bereichsspalten

      Rev 1.268   17 Nov 1998 10:50:38   OS
   #58263# NumType durch SvxExtNumType ersetzt

      Rev 1.267   04 Nov 1998 12:11:08   OM
   #58851# Fixe Dateinamenfelder bearbeiten

      Rev 1.266   16 Oct 1998 12:55:46   OM
   #57970# Zahlenformat Seitenvorlage fuer Statistikfeld

      Rev 1.265   15 Oct 1998 16:02:50   OM
   #57965# Variablennamen fuer Eingabefeld verwenden

      Rev 1.264   15 Sep 1998 16:01:58   OM
   #55149# In Dialogen Zahlenformat der Applikation verwenden

      Rev 1.263   10 Aug 1998 16:40:00   JP
   Bug #54796#: neue NumerierungsTypen (WW97 kompatibel)

      Rev 1.262   24 Jul 1998 13:57:04   OM
   #53246# Makros vorselektieren

      Rev 1.261   07 Jul 1998 17:04:58   OM
   #52283# Ueber alle DB-Feldbefehle navigieren

      Rev 1.260   18 Jun 1998 11:16:42   OM
   Kapitelebenen fuer Nummernkreise

      Rev 1.259   20 May 1998 13:24:24   OM
   Offset fuer DateTimeFields

      Rev 1.258   15 Apr 1998 16:39:34   OM
   #47244 SubType nich veraendern

      Rev 1.257   26 Mar 1998 17:00:22   OM
   Feldbefehl: Seitenanzahl im Html-Mode

      Rev 1.256   26 Mar 1998 16:43:06   OM
   Feldbefehl: Seitenanzahl im Html-Mode

      Rev 1.255   06 Mar 1998 15:31:20   OM
   Neue numerische Datenbankformate

      Rev 1.254   13 Feb 1998 14:14:50   JP
   UpdateFld: TYP_INETFLD gibt es nicht mehr!

      Rev 1.253   27 Jan 1998 22:43:52   JP
   GetNumDepend durch GetDepends ersetzt

      Rev 1.252   13 Jan 1998 15:01:48   OM
   Formula-Field wieder unterstuetzt

      Rev 1.251   12 Jan 1998 17:10:20   OM
   Formelfelder wieder erlauben

      Rev 1.250   12 Jan 1998 12:42:58   OM
   Nummernkreise nicht doppelt anlegen

      Rev 1.249   06 Jan 1998 18:12:56   OM
   Felbefehl-Dlg

      Rev 1.248   19 Dec 1997 18:24:26   OM
   Feldbefehl-bearbeiten Dlg

      Rev 1.247   17 Dec 1997 15:23:36   OM
   #46218# Korrekte Sprache besorgen

      Rev 1.246   16 Dec 1997 17:01:42   OM
   Feldbefehle bearbeiten

      Rev 1.245   11 Dec 1997 16:58:02   OM
   Feldumstellung

      Rev 1.244   05 Dec 1997 13:16:38   OM
   #45750# DDE-Field Delimiter fuer Basic wandeln

      Rev 1.243   28 Nov 1997 19:50:38   MA
   includes

      Rev 1.242   27 Nov 1997 13:17:18   OM
   Variablen-TP

      Rev 1.241   25 Nov 1997 12:38:44   OM
   Funktionen-TP

      Rev 1.240   21 Nov 1997 17:19:44   OM
   Feldbefehl-Umstellung: DocInfo

      Rev 1.239   18 Nov 1997 14:33:14   OM
   Sba-Umstellung 372

      Rev 1.238   18 Nov 1997 10:33:12   OM
   Neuer Feldbefehldialog

      Rev 1.237   14 Nov 1997 11:42:36   OM
   Aufgeraeumt

      Rev 1.236   30 Oct 1997 14:30:52   OM
   Feldbefehl-Umstellung

      Rev 1.235   15 Oct 1997 11:57:24   OM
   Feldumstellung

      Rev 1.234   13 Oct 1997 11:43:16   OM
   Feldumstellung

      Rev 1.233   09 Oct 1997 16:13:44   OM
   Feldumstellung

      Rev 1.232   07 Oct 1997 10:51:26   OM
   Feldumstellung

      Rev 1.231   06 Oct 1997 15:40:44   OM
   Feldumstellung

      Rev 1.230   02 Oct 1997 15:21:44   OM
   Feldumstellung

      Rev 1.229   24 Sep 1997 15:18:56   OM
   Feldumstellung

      Rev 1.228   18 Sep 1997 14:34:02   OM
   Feldumstellung

      Rev 1.227   02 Sep 1997 09:55:56   OM
   SDB-Headeranpassung

      Rev 1.226   01 Sep 1997 13:12:40   OS
   DLL-Umstellung

      Rev 1.225   25 Aug 1997 11:54:20   OS
   368-Changes SBA

      Rev 1.224   15 Aug 1997 12:11:24   OS
   chartar/frmatr/txtatr aufgeteilt

      Rev 1.223   09 Aug 1997 13:17:38   OS
   paraitem/frmitems/textitem aufgeteilt

      Rev 1.222   05 Aug 1997 12:38:24   MH
   chg: header

      Rev 1.221   09 Jul 1997 17:33:24   HJS
   includes

      Rev 1.220   29 May 1997 16:16:00   OM
   URL in ScriptDialog eingeben

      Rev 1.219   29 Apr 1997 16:10:22   OM
   Unsichtbare Benutzerfelder

      Rev 1.218   28 Apr 1997 16:31:04   JP
   SetFldValue: immer einen FldTypen anlegen.

      Rev 1.217   08 Apr 1997 10:32:42   MA
   includes

      Rev 1.216   04 Apr 1997 10:32:28   OM
   Datenbanken nach Gebrauch wieder schliessen

      Rev 1.215   14 Mar 1997 14:07:22   OM
   #37666# GPF beim Bearbeiten alter 3.x DB-Feldbefehlen behoben

      Rev 1.214   11 Mar 1997 13:15:12   OM
   Datenbank beim Feldeinfuegen am Dok setzen

      Rev 1.213   26 Feb 1997 02:22:20   OM
   #37068# Feldbefhel-Dlg GPF gefixt

      Rev 1.212   25 Feb 1997 20:04:10   OM
   GPF in Feldbefehlen behoben

      Rev 1.211   24 Feb 1997 20:29:30   OM
   Offset-Fehler behoben

      Rev 1.210   23 Feb 1997 21:14:42   OM
   Aufgeraeumt

      Rev 1.209   23 Feb 1997 15:05:54   OS
   SetFieldValue liefert BOOL

      Rev 1.208   22 Feb 1997 21:22:58   OM
   Aufgeraeumt

      Rev 1.207   22 Feb 1997 16:43:14   OM
   Basic-Umstellung: OpenColumn

      Rev 1.206   17 Feb 1997 10:39:18   OM
   Neue Feldbefehle im Webmode

      Rev 1.205   16 Feb 1997 10:48:20   OM
   DBMGR an Ofa verschoben

      Rev 1.204   13 Feb 1997 17:37:42   OM
   Neu: javaedit

      Rev 1.203   11 Feb 1997 16:52:04   OM
   Eingabefeld ueber Basic ohne Dialog einfuegen

      Rev 1.202   09 Feb 1997 16:34:06   OM
   Variable setzen: html_on/off

      Rev 1.201   07 Feb 1997 17:19:50   OM
   Web-Mode fuer Feldbefehle-Dlg

      Rev 1.200   07 Feb 1997 11:34:14   OM
   Web-Mode fuer FeldbefehlDlg

      Rev 1.199   05 Feb 1997 09:35:56   OM
   Verschiebung in den Bereichen behoben

      Rev 1.198   03 Feb 1997 17:08:58   OM
   InsertURL aus Feldbefehl-Dlg entfernt

      Rev 1.197   29 Jan 1997 13:14:18   MA
   unbenutzes entfernt

      Rev 1.196   17 Dec 1996 15:37:46   OM
   Macrofelder editieren

      Rev 1.195   11 Dec 1996 10:21:04   MA
   Warnings

      Rev 1.194   26 Nov 1996 20:39:32   JP
   RefFelder werden jetzt mit&nach den ExpFeldern aktualisiert

      Rev 1.193   13 Nov 1996 15:00:58   JP
   neuer FeldTyp fuer Scripts (z.B. JavaScript)

      Rev 1.192   11 Nov 1996 09:55:52   MA
   ResMgr

      Rev 1.191   08 Nov 1996 14:55:58   JP
   ueberfluessiges Include entfernt

      Rev 1.190   07 Nov 1996 15:46:56   JP
   Bug #33084#: Referenzen nach einfuegen updaten

      Rev 1.189   05 Nov 1996 22:45:06   JP
   UpdateCurFld..() entfernt - ueberflussig; UpdateFld: GetRefFld sonderbehandelt

      Rev 1.188   05 Nov 1996 15:32:42   JP
   Umstellungen fuer neue Referenz-Seite

      Rev 1.187   01 Nov 1996 03:55:46   MH
   add: includes

      Rev 1.186   24 Oct 1996 13:36:20   JP
   String Umstellung: [] -> GetChar()

      Rev 1.185   25 Sep 1996 14:11:48   OM
   Neue Datenbanktrenner

      Rev 1.184   19 Sep 1996 14:32:30   OM
   Datenbank Basicanbindung

      Rev 1.183   02 Sep 1996 18:43:00   JP
   INetFeld entfernt

      Rev 1.182   30 Aug 1996 12:45:42   OS
   UpdateGlosPath kann Blockliste aktualisieren

      Rev 1.181   28 Aug 1996 12:11:14   OS
   includes

      Rev 1.180   21 Aug 1996 13:08:52   OS
   Manager gfs. mit wrtshell konstruieren

      Rev 1.179   20 Aug 1996 17:22:18   JP
   Bug #30489#: Mehrfachselektion bei SetRef-Feldern abklemmen

      Rev 1.178   16 Aug 1996 11:27:56   OM
   Dokinfo aufgegliedert

      Rev 1.177   15 Aug 1996 09:56:44   AMA
   Fix: Macros am INetFmt setzen.

      Rev 1.176   12 Aug 1996 10:50:04   AMA
   Chg: SwFmtINetFmt jetzt mit TargetFrame im CTor.

      Rev 1.175   08 Aug 1996 15:33:34   AMA
   New: Benutze InsertURL (als Textattribut) an der EditShell

      Rev 1.174   05 Aug 1996 15:18:24   OM
   Datenbankumstellung

      Rev 1.173   25 Jul 1996 16:41:54   OM
   Umstellung auf Tabellen

      Rev 1.172   23 Jul 1996 14:29:40   JP
   PageNext/-Prev: mit Offset; InsertField: nach Left auch wieder ein Right rufen

      Rev 1.171   10 Jul 1996 17:47:56   OM
   LocalizeDBName in Expfld verschoben


*************************************************************************/

diff --git a/sw/source/ui/fldui/fldpage.cxx b/sw/source/ui/fldui/fldpage.cxx
new file mode 100644
index 0000000..9af1546
--- /dev/null
+++ b/sw/source/ui/fldui/fldpage.cxx
@@ -0,0 +1,544 @@
/*************************************************************************
 *
 *  $RCSfile: fldpage.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:36 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SV_LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SVX_HTMLMODE_HXX //autogen
#include <svx/htmlmode.hxx>
#endif

#ifndef _DBFLD_HXX //autogen
#include <dbfld.hxx>
#endif
#ifndef _FLDDAT_HXX
#include <flddat.hxx>
#endif
#ifndef _FMTFLD_HXX //autogen
#include <fmtfld.hxx>
#endif
#ifndef _VIEWOPT_HXX
#include <viewopt.hxx>
#endif
#ifndef _FLDEDT_HXX
#include <fldedt.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _EXPFLD_HXX
#include <expfld.hxx>
#endif
#ifndef _FLDTDLG_HXX
#include <fldtdlg.hxx>
#endif
#ifndef _FLDPAGE_HXX
#include <fldpage.hxx>
#endif

#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SwFldPage::SwFldPage(Window *pParent, const ResId &rId, const SfxItemSet &rAttrSet ) :
    SfxTabPage      (pParent, rId, rAttrSet),
    nPageId         (rId.GetId()),
    bFldDlgHtmlMode (FALSE),
    nFldDlgAktGrpSel(0),
    nTypeSel        (LISTBOX_ENTRY_NOTFOUND),
    nSelectionSel   (LISTBOX_ENTRY_NOTFOUND),
    bFldEdit        (FALSE),
    pCurFld         (0),
    bInsert         (TRUE),
    bRefresh        (FALSE)
{
//  FreeResource();
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SwFldPage::~SwFldPage()
{
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

USHORT SwFldPage::GetGroup()
{
    ASSERT (0, "GetGroup not implemented!");
    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung: TabPage initialisieren
 --------------------------------------------------------------------*/

void SwFldPage::Init()
{
    SwDocShell* pDocSh = (SwDocShell*)SfxObjectShell::Current();
    BOOL bNewMode = (::GetHtmlMode(pDocSh) & HTMLMODE_ON) != 0;

    bFldEdit = GetTabDialog() == 0;
    pCurFld = aMgr.GetCurFld();

    nFldDlgAktGrpSel = GetGroup();

    if (bNewMode != bFldDlgHtmlMode)
    {
        bFldDlgHtmlMode = bNewMode;

        // Bereichslistbox initialisieren
        if (bFldDlgHtmlMode)
        {
            SwWrtShell *pSh = ::GetActiveView()->GetWrtShellPtr();

            (SwSetExpFieldType*)pSh->InsertFldType(SwSetExpFieldType(pDocSh->GetDoc(),
                                                    String::CreateFromAscii("HTML_ON"), 1));
            (SwSetExpFieldType*)pSh->InsertFldType(SwSetExpFieldType(pDocSh->GetDoc(),
                                                    String::CreateFromAscii("HTML_OFF"), 1));
        }
    }

    aMgr.GetCurFld();   // FieldManager neu initialisieren
                        // wichtig fuer Dok-Wechsel (fldtdlg:ReInitTabPage)
}

/*--------------------------------------------------------------------
     Beschreibung: Seite neu initialisieren
 --------------------------------------------------------------------*/

void SwFldPage::ActivatePage()
{
    EnableInsert(bInsert);
}

/*--------------------------------------------------------------------
     Beschreibung: Kompletter Reset; neues Feld editieren
 --------------------------------------------------------------------*/

void SwFldPage::EditNewField()
{
    nFldDlgAktGrpSel = 0;
    nTypeSel = LISTBOX_ENTRY_NOTFOUND;
    nSelectionSel = LISTBOX_ENTRY_NOTFOUND;
    bRefresh = TRUE;
    Reset(*(SfxItemSet*)0);
    bRefresh = FALSE;
}

/*--------------------------------------------------------------------
     Beschreibung: Feld einfuegen
 --------------------------------------------------------------------*/

BOOL SwFldPage::InsertFld(USHORT nTypeId, USHORT nSubType, const String& rPar1,
                            const String& rPar2, ULONG nFormatId, sal_Unicode cSeparator)
{
    BOOL bRet = FALSE;
    SwWrtShell *pSh = ::GetActiveView()->GetWrtShellPtr();

    if (!IsFldEdit())   // Neues Feld einfuegen
    {
        bRet = aMgr.InsertFld( nTypeId, nSubType, rPar1, rPar2, nFormatId, 0, cSeparator );

    }
    else    // Feld aendern
    {
        String sPar1(rPar1);
        String sPar2(rPar2);
        BOOL bDBChanged = FALSE;

        switch( nTypeId )
        {
        case TYP_DATEFLD:
        case TYP_TIMEFLD:
            nSubType = ((nTypeId == TYP_DATEFLD) ? DATEFLD : TIMEFLD) |
                       ((nSubType == DATE_VAR) ? 0 : FIXEDFLD);
            break;

        case TYP_DBNAMEFLD:
        case TYP_DBNEXTSETFLD:
        case TYP_DBNUMSETFLD:
        case TYP_DBSETNUMBERFLD:
            {
                USHORT nPos, nTablePos, nExpPos;
                String sDBName;

                // DBName aus rPar1 extrahieren. Format: DBName.TableName.ExpStrg
                if ((nTablePos = rPar1.Search(DB_DELIM)) != STRING_NOTFOUND)
                    sDBName = rPar1.Copy(0, nTablePos++);
                if ((nExpPos = rPar1.Search(DB_DELIM, nTablePos)) != STRING_NOTFOUND)
                {
                    sDBName += DB_DELIM;
                    sDBName += rPar1.Copy(nTablePos, nExpPos++ - nTablePos);
                }
                if (nExpPos != STRING_NOTFOUND)
                    nPos = nExpPos;
                else if (nTablePos != STRING_NOTFOUND)
                    nPos = nTablePos;
                else
                    nPos = 0;
                sPar1 = rPar1.Copy(nPos);

                ((SwDBNameInfField*)pCurFld)->SetDBName(sDBName);
                bDBChanged = TRUE;
            }
            break;

        case TYP_DBFLD:
            {
                String sDBName = rPar1.GetToken(0, DB_DELIM);
                sDBName += DB_DELIM;
                sDBName += rPar1.GetToken(1, DB_DELIM);
                String sColumn = rPar1.GetToken(2, DB_DELIM);

                SwDBFieldType* pOldTyp = (SwDBFieldType*)pCurFld->GetTyp();
                SwDBFieldType* pTyp = (SwDBFieldType*)pSh->InsertFldType(
                        SwDBFieldType(pSh->GetDoc(), sColumn, sDBName));

                SwClientIter aIter( *pOldTyp );

                for( SwFmtFld* pFmtFld = (SwFmtFld*)aIter.First( TYPE(SwFmtFld) );
                    pFmtFld; pFmtFld = (SwFmtFld*)aIter.Next() )
                {
                    if( pFmtFld->GetFld() == pCurFld)
                    {
                        pTyp->Add(pFmtFld); // Feld auf neuen Typ umhaengen
                        pCurFld->ChgTyp(pTyp);
                        break;
                    }
                }
                bDBChanged = TRUE;
            }
            break;

        case TYP_SEQFLD:
            {
                SwSetExpFieldType* pTyp = (SwSetExpFieldType*)pCurFld->GetTyp();
                pTyp->SetOutlineLvl(nSubType & 0xff);
                pTyp->SetDelimiter((char)((nSubType & 0xff00) >> 8));

                nSubType = GSE_SEQ;
            }
            break;

        case TYP_INPUTFLD:
            {
                // User- oder SetField ?
                if (aMgr.GetFldType(RES_USERFLD, sPar1) == 0 &&
                !(pCurFld->GetSubType() & INP_TXT)) // SETEXPFLD
                {
                    SwSetExpField* pFld = (SwSetExpField*)pCurFld;
                    pFld->SetPromptText(sPar2);
                    sPar2 = pFld->GetPar2();
                }
            }
            break;
        }

        pSh->StartAllAction();

        pCurFld->SetSubType(nSubType);

        aMgr.UpdateCurFld( nFormatId, sPar1, sPar2 );

        switch (nTypeId)
        {
            case TYP_HIDDENTXTFLD:
            case TYP_HIDDENPARAFLD:
                aMgr.EvalExpFlds(pSh);
                break;
        }

        if (bDBChanged) // Datenbank geaendert
        {
            switch(nTypeId)
            {
                case TYP_DBFLD:
                    ((SwDBField*)pCurFld)->ClearInitialized();
                    ((SwDBField*)pCurFld)->InitContent();
                case TYP_DBNAMEFLD:
                case TYP_DBNEXTSETFLD:
                case TYP_DBNUMSETFLD:
                case TYP_DBSETNUMBERFLD:
                    pCurFld->GetTyp()->UpdateFlds();
                    break;
            }
        }

        pSh->SetUndoNoResetModified();
        pSh->EndAllAction();
    }

    return bRet;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwFldPage::SavePos(ListBox* pLst1, ListBox* pLst2, ListBox* pLst3)
{
    if (pLst1 && pLst1->GetEntryCount())
        sLst1 = pLst1->GetSelectEntry();
    else
        sLst1.Erase();

    if (pLst2 && pLst2->GetEntryCount())
        sLst2 = pLst2->GetSelectEntry();
    else
        sLst2.Erase();

    if (pLst3 && pLst3->GetEntryCount())
        sLst3 = pLst3->GetSelectEntry();
    else
        sLst3.Erase();
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwFldPage::RestorePos(ListBox* pLst1, ListBox* pLst2, ListBox* pLst3)
{
    USHORT nPos = 0;

    if (pLst1 && pLst1->GetEntryCount() && sLst1.Len() && (nPos = pLst1->GetEntryPos(sLst1)) != LISTBOX_ENTRY_NOTFOUND)
        pLst1->SelectEntryPos(nPos);
    if (pLst2 && pLst2->GetEntryCount() && sLst1.Len() && (nPos = pLst2->GetEntryPos(sLst1)) != LISTBOX_ENTRY_NOTFOUND)
        pLst2->SelectEntryPos(nPos);
    if (pLst3 && pLst3->GetEntryCount() && sLst1.Len() && (nPos = pLst3->GetEntryPos(sLst1)) != LISTBOX_ENTRY_NOTFOUND)
        pLst3->SelectEntryPos(nPos);
}

/*--------------------------------------------------------------------
     Beschreibung: Einfuegen von neuen Feldern
 --------------------------------------------------------------------*/

IMPL_LINK( SwFldPage, InsertHdl, Button *, pBtn )
{
    SwFldDlg *pDlg = (SwFldDlg*)GetTabDialog();

    if (pDlg)
    {
        pDlg->InsertHdl();

        if (pBtn)
            pBtn->GrabFocus();  // Wegen InputField-Dlg
    }
    else
    {
        SwFldEditDlg *pEditDlg = (SwFldEditDlg *)GetParent();
        pEditDlg->InsertHdl();
    }

    return 0;
}

/*--------------------------------------------------------------------
     Beschreibung: "Einfuegen"-Button Enablen/Disablen
 --------------------------------------------------------------------*/

void SwFldPage::EnableInsert(BOOL bEnable)
{
    SwFldDlg *pDlg = (SwFldDlg*)GetTabDialog();

    if (pDlg)
    {
        if (pDlg->GetCurPageId() == nPageId)
            pDlg->EnableInsert(bEnable);
    }
    else
    {
        SwFldEditDlg *pEditDlg = (SwFldEditDlg *)GetParent();
        pEditDlg->EnableInsert(bEnable);
    }

    bInsert = bEnable;
}

/*--------------------------------------------------------------------
     Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwFldPage, NumFormatHdl, ListBox *, pLst )
{
    InsertHdl();

    return 0;
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.25  2000/09/18 16:05:29  willem.vandorp
    OpenOffice header added.

    Revision 1.24  2000/06/30 08:52:53  os
    #76541# string assertions removed

    Revision 1.23  2000/05/10 11:55:13  os
    Basic API removed

    Revision 1.22  2000/04/18 15:17:32  os
    UNICODE

    Revision 1.21  2000/02/11 14:46:39  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.20  1999/01/20 13:16:52  JP
    Task #58677#: Crsr in Readonly Bereichen zulassen


      Rev 1.19   20 Jan 1999 14:16:52   JP
   Task #58677#: Crsr in Readonly Bereichen zulassen

      Rev 1.18   29 Oct 1998 14:08:32   OM
   #58544# Butzerfeld: richtigen Inhalt anzeigen

      Rev 1.17   15 Oct 1998 16:02:52   OM
   #57965# Variablennamen fuer Eingabefeld verwenden

      Rev 1.16   18 Jun 1998 11:16:44   OM
   Kapitelebenen fuer Nummernkreise

      Rev 1.15   27 Mar 1998 16:26:18   OM
   #48007# UpdateExpFlds bei Aenderung von HiddenText und HiddenParaField

      Rev 1.14   18 Mar 1998 10:33:56   OM
   #48197# Focus restaurieren nach InputDlg

      Rev 1.13   06 Mar 1998 14:54:24   OM
   Nur bei Aenderung Feld aktualisieren

      Rev 1.12   08 Jan 1998 13:36:20   OM
   Feldbefehl-Traveling

      Rev 1.11   08 Jan 1998 10:19:04   OM
   Referenzen editieren

      Rev 1.10   06 Jan 1998 18:13:34   OM
   Felbefehl-Dlg

      Rev 1.9   19 Dec 1997 18:25:00   OM
   Feldbefehl-bearbeiten Dlg

      Rev 1.8   16 Dec 1997 17:01:44   OM
   Feldbefehle bearbeiten

      Rev 1.7   12 Dec 1997 16:10:08   OM
   AutoUpdate bei FocusWechsel u.a.

      Rev 1.6   11 Dec 1997 16:58:50   OM
   Feldumstellung

      Rev 1.5   09 Dec 1997 17:16:46   OM
   Kein alter Feldbefehl-Dialog mehr

      Rev 1.4   28 Nov 1997 19:51:32   MA
   includes

      Rev 1.3   20 Nov 1997 17:02:04   OM
   Neuer Felddialog

      Rev 1.2   19 Nov 1997 16:30:42   OM
   Datenbank-TP Drag&Drop

      Rev 1.1   18 Nov 1997 10:34:36   OM
   Neuer Feldbefehldialog

      Rev 1.0   17 Nov 1997 09:07:00   OM
   Initial revision.

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/fldui/fldpage.hxx b/sw/source/ui/fldui/fldpage.hxx
new file mode 100644
index 0000000..a2cfc89
--- /dev/null
+++ b/sw/source/ui/fldui/fldpage.hxx
@@ -0,0 +1,134 @@
/*************************************************************************
 *
 *  $RCSfile: fldpage.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:36 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWFLDPAGE_HXX
#define _SWFLDPAGE_HXX

#ifndef _SFXTABDLG_HXX //autogen
#include <sfx2/tabdlg.hxx>
#endif

#include "fldmgr.hxx"

/*--------------------------------------------------------------------
   Beschreibung:
 --------------------------------------------------------------------*/

class SwFldPage : public SfxTabPage
{
    USHORT              nFldDlgAktGrpSel;
    String              sLst1;
    String              sLst2;
    String              sLst3;
    USHORT              nPageId;
    BOOL                bFldEdit;
    BOOL                bInsert;

    SwFldMgr            aMgr;
    USHORT              nTypeSel;
    USHORT              nSelectionSel;
    BOOL                bFldDlgHtmlMode;
    BOOL                bRefresh;
    SwField             *pCurFld;

protected:

    USHORT              GetTypeSel() {return nTypeSel;}
    void                SetTypeSel(USHORT nSet) {nTypeSel = nSet;}
    USHORT              GetSelectionSel() {return nSelectionSel;}
    void                SetSelectionSel(USHORT nSet) {nSelectionSel = nSet;}
    BOOL                IsFldDlgHtmlMode() {return bFldDlgHtmlMode;}
    BOOL                IsRefresh() { return bRefresh;}
    SwField*            GetCurField() {return pCurFld;}

    DECL_LINK( InsertHdl, Button *pBtn = 0 );
    DECL_LINK( NumFormatHdl, ListBox *pBtn = 0 );

    void                Init();
    void                SavePos(ListBox* pLst1, ListBox* pLst2 = 0, ListBox* pLst3 = 0);
    void                RestorePos(ListBox* pLst1, ListBox* pLst2 = 0, ListBox* pLst3 = 0);
    void                EnableInsert(BOOL bEnable = TRUE);
    inline BOOL         IsFldEdit() const   { return bFldEdit; }

    // Feld einfuegen
    BOOL                InsertFld(  USHORT nTypeId,
                                    USHORT nSubType,
                                    const String& rPar1,
                                    const String& rPar2,
                                    ULONG nFormatId,
                                    sal_Unicode cDelim = ' ');

public:
                        SwFldPage(  Window *pParent,
                                    const ResId &rId,
                                    const SfxItemSet &rAttrSet );

                        ~SwFldPage();

    virtual void        ActivatePage();

    inline SwFldMgr&    GetFldMgr() { return aMgr; }
    void                EditNewField();
    virtual USHORT      GetGroup() = 0;
};


#endif

diff --git a/sw/source/ui/fldui/fldref.cxx b/sw/source/ui/fldui/fldref.cxx
new file mode 100644
index 0000000..acc2662
--- /dev/null
+++ b/sw/source/ui/fldui/fldref.cxx
@@ -0,0 +1,908 @@
/*************************************************************************
 *
 *  $RCSfile: fldref.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:36 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "swtypes.hxx"

#ifndef _SWVIEW_HXX //autogen
#include <view.hxx>
#endif
#ifndef _BOOKMRK_HXX //autogen
#include <bookmrk.hxx>
#endif
#ifndef _EXPFLD_HXX //autogen
#include <expfld.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _FLDREF_HXX
#include <fldref.hxx>
#endif
#ifndef _REFFLD_HXX
#include <reffld.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif

#ifndef _FLDUI_HRC
#include <fldui.hrc>
#endif
#ifndef _FLDTDLG_HRC
#include <fldtdlg.hrc>
#endif
#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif

#define REFFLDFLAG          0x4000
#define REFFLDFLAG_BOOKMARK 0x4800
#define REFFLDFLAG_FOOTNOTE 0x5000
#define REFFLDFLAG_ENDNOTE  0x6000

USHORT  nFldDlgFmtSel       = 0;

#define USER_DATA_VERSION_1 "1"
#define USER_DATA_VERSION USER_DATA_VERSION_1
/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SwFldRefPage::SwFldRefPage(Window* pParent, const SfxItemSet& rCoreSet ) :
    SwFldPage( pParent, SW_RES( TP_FLD_REF ), rCoreSet ),

    aTypeFT         (this, SW_RES(FT_REFTYPE)),
    aTypeLB         (this, SW_RES(LB_REFTYPE)),
    aSelectionFT    (this, SW_RES(FT_REFSELECTION)),
    aSelectionLB    (this, SW_RES(LB_REFSELECTION)),
    aFormatFT       (this, SW_RES(FT_REFFORMAT)),
    aFormatLB       (this, SW_RES(LB_REFFORMAT)),
    aNameFT         (this, SW_RES(FT_REFNAME)),
    aNameED         (this, SW_RES(ED_REFNAME)),
    aValueFT        (this, SW_RES(FT_REFVALUE)),
    aValueED        (this, SW_RES(ED_REFVALUE)),

    sBookmarkTxt    (SW_RES(STR_REFBOOKMARK)),
    sFootnoteTxt    (SW_RES(STR_REFFOOTNOTE)),
    sEndnoteTxt     (SW_RES(STR_REFENDNOTE))
{
    FreeResource();

    aNameED.SetModifyHdl(LINK(this, SwFldRefPage, ModifyHdl));

//  SwWrtShell* pSh = (SwWrtShell*)ViewShell::GetCurrShell();
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SwFldRefPage::~SwFldRefPage()
{
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwFldRefPage::Reset(const SfxItemSet& )
{
    if (!IsFldEdit())
        SavePos(&aTypeLB);
    SetSelectionSel(LISTBOX_ENTRY_NOTFOUND);
    SetTypeSel(LISTBOX_ENTRY_NOTFOUND);
    Init(); // Allgemeine initialisierung

    // TypeListBox initialisieren
    aTypeLB.SetUpdateMode(FALSE);
    aTypeLB.Clear();

    // Typ-Listbox fuellen

    // mit den Sequence-Typen auffuellen
    SwView *pView = ::GetActiveView();
    ASSERT(pView, View fehlt);
    SwWrtShell &rSh = pView->GetWrtShell();
    USHORT nPos;

    USHORT nFldTypeCnt = rSh.GetFldTypeCount(RES_SETEXPFLD);

    for (USHORT n = 0; n < nFldTypeCnt; ++n)
    {
        SwSetExpFieldType* pType = (SwSetExpFieldType*)rSh.GetFldType(n, RES_SETEXPFLD);

        if ((GSE_SEQ & pType->GetType()) && pType->GetDepends() && rSh.IsUsed(*pType))
        {
            nPos = aTypeLB.InsertEntry(pType->GetName());
            aTypeLB.SetEntryData(nPos, (void*)(REFFLDFLAG | n));
        }
    }

    // Textmarken - jetzt immer (wegen Globaldokumenten)
    nFldTypeCnt = rSh.GetBookmarkCnt(TRUE);
    nPos = aTypeLB.InsertEntry(sBookmarkTxt);
    aTypeLB.SetEntryData(nPos, (void*)REFFLDFLAG_BOOKMARK);

    // Fussnoten:
    if( rSh.HasFtns() )
    {
        nPos = aTypeLB.InsertEntry(sFootnoteTxt);
        aTypeLB.SetEntryData(nPos, (void*)REFFLDFLAG_FOOTNOTE);
    }

    // Endnoten:
    if( rSh.HasFtns(TRUE) )
    {
        nPos = aTypeLB.InsertEntry(sEndnoteTxt);
        aTypeLB.SetEntryData(nPos, (void*)REFFLDFLAG_ENDNOTE);
    }

    // Referenz setzen / einfuegen
    const SwFldGroupRgn& rRg = GetFldMgr().GetGroupRange(IsFldDlgHtmlMode(), GetGroup());

    for (short i = rRg.nStart; i < rRg.nEnd; ++i)
    {
        const USHORT nTypeId = GetFldMgr().GetTypeId(i);

        if (!IsFldEdit() || nTypeId != TYP_SETREFFLD)
        {
            nPos = aTypeLB.InsertEntry(GetFldMgr().GetTypeStr(i), i - rRg.nStart);
            aTypeLB.SetEntryData(nPos, (void*)nTypeId);
        }
    }

    // alte Pos selektieren
    if (!IsFldEdit())
        RestorePos(&aTypeLB);

    aTypeLB.SetUpdateMode(TRUE);
    aTypeLB.SetDoubleClickHdl       (LINK(this, SwFldRefPage, InsertHdl));
    aTypeLB.SetSelectHdl            (LINK(this, SwFldRefPage, TypeHdl));
    aSelectionLB.SetSelectHdl       (LINK(this, SwFldRefPage, SubTypeHdl));
    aSelectionLB.SetDoubleClickHdl  (LINK(this, SwFldRefPage, InsertHdl));
    aFormatLB.SetDoubleClickHdl     (LINK(this, SwFldRefPage, InsertHdl));

    nFldDlgFmtSel = 0;

    if( !IsRefresh() )
    {
        String sUserData = GetUserData();
        if(!IsRefresh() && sUserData.GetToken(0, ';').
                                EqualsIgnoreCaseAscii(USER_DATA_VERSION_1))
        {
            String sVal = sUserData.GetToken(1, ';');
            USHORT nVal = sVal.ToInt32();
            if(nVal != USHRT_MAX)
            {
                for(USHORT i = 0; i < aTypeLB.GetEntryCount(); i++)
                    if(nVal == (USHORT)(ULONG)aTypeLB.GetEntryData(i))
                    {
                        aTypeLB.SelectEntryPos(i);
                        break;
                    }
            }
        }
    }
    TypeHdl(0);

    if (IsFldEdit())
    {
        aTypeLB.SaveValue();
        aSelectionLB.SaveValue();
        aFormatLB.SaveValue();
        aNameED.SaveValue();
        aValueED.SaveValue();
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwFldRefPage, TypeHdl, ListBox *, pBox )
{
    // Alte ListBoxPos sichern
    const USHORT nOld = GetTypeSel();

    // Aktuelle ListBoxPos
    SetTypeSel(aTypeLB.GetSelectEntryPos());

    if(GetTypeSel() == LISTBOX_ENTRY_NOTFOUND)
    {
        if (IsFldEdit())
        {
            // Positionen selektieren
            String sName;
            USHORT nFlag = 0;

            switch( GetCurField()->GetSubType() )
            {
                case REF_BOOKMARK:
                    sName = sBookmarkTxt;
                    nFlag = REFFLDFLAG_BOOKMARK;
                    break;

                case REF_FOOTNOTE:
                    sName = sFootnoteTxt;
                    nFlag = REFFLDFLAG_FOOTNOTE;
                    break;

                case REF_ENDNOTE:
                    sName = sEndnoteTxt;
                    nFlag = REFFLDFLAG_ENDNOTE;
                    break;

                case REF_SETREFATTR:
                    sName = SW_RESSTR(STR_GETREFFLD);
                    nFlag = REF_SETREFATTR;
                    break;

                case REF_SEQUENCEFLD:
                    sName = ((SwGetRefField*)GetCurField())->GetSetRefName();
                    nFlag = REFFLDFLAG;
                    break;
            }

            if (aTypeLB.GetEntryPos(sName) == LISTBOX_ENTRY_NOTFOUND)   // Referenz zu gel”schter Marke
            {
                USHORT nPos = aTypeLB.InsertEntry(sName);
                aTypeLB.SetEntryData(nPos, (void*)nFlag);
            }

            aTypeLB.SelectEntry(sName);
            SetTypeSel(aTypeLB.GetSelectEntryPos());
        }
        else
        {
            SetTypeSel(0);
            aTypeLB.SelectEntryPos(0);
        }
    }

    if (nOld != GetTypeSel())
    {
        USHORT nTypeId = (USHORT)(ULONG)aTypeLB.GetEntryData(GetTypeSel());

        // Auswahl-Listbox fuellen
        UpdateSubType();

        BOOL bName = FALSE;
        nFldDlgFmtSel = 0;

        if ((!IsFldEdit() || aSelectionLB.GetEntryCount()) && nOld != LISTBOX_ENTRY_NOTFOUND)
        {
            aNameED.SetText(aEmptyStr);
            aValueED.SetText(aEmptyStr);
        }

        switch (nTypeId)
        {
            case TYP_GETREFFLD:
                if (REFFLDFLAG & (USHORT)(ULONG)aTypeLB.GetEntryData(nOld))
                    // dann bleibt die alte bestehen
                    nFldDlgFmtSel = aFormatLB.GetSelectEntryPos();
                bName = TRUE;
                break;

            case TYP_SETREFFLD:
                bName = TRUE;
                break;

            case REFFLDFLAG_BOOKMARK:
                bName = TRUE;
                // kein break!!!
            default:
                if( REFFLDFLAG & nTypeId )
                {
                    USHORT nOldId = (USHORT)(ULONG)aTypeLB.GetEntryData(nOld);
                    if( nOldId & REFFLDFLAG || nOldId == TYP_GETREFFLD )
                        // dann bleibt die alte bestehen
                        nFldDlgFmtSel = aFormatLB.GetSelectEntryPos();
                }
                break;
        }

        aNameED.Enable(bName);
        aNameFT.Enable(bName);

        // Format-Listbox fuellen
        USHORT nSize = FillFormatLB(nTypeId);
        BOOL bFormat = nSize != 0;
        aFormatLB.Enable(bFormat);
        aFormatFT.Enable(bFormat);

        SubTypeHdl();
        ModifyHdl();
    }

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwFldRefPage, SubTypeHdl, ListBox *, pBox )
{
    USHORT nTypeId = (USHORT)(ULONG)aTypeLB.GetEntryData(GetTypeSel());

    switch(nTypeId)
    {
        case TYP_GETREFFLD:
            if (!IsFldEdit() || aSelectionLB.GetSelectEntryCount())
            {
                aNameED.SetText(aSelectionLB.GetSelectEntry());
                ModifyHdl(&aNameED);
            }
            break;

        case TYP_SETREFFLD:
            aValueED.SetText(::GetActiveView()->GetWrtShell().GetSelTxt());
            break;

        default:
            if (!IsFldEdit() || aSelectionLB.GetSelectEntryCount())
                aNameED.SetText(aSelectionLB.GetSelectEntry());
            break;
    }

    return 0;
}

/*--------------------------------------------------------------------
     Beschreibung: Typen in SelectionLB erneuern
 --------------------------------------------------------------------*/

void SwFldRefPage::UpdateSubType()
{
    SwWrtShell *pSh = ::GetActiveView()->GetWrtShellPtr();
    SwGetRefField* pRefFld = (SwGetRefField*)GetCurField();
    USHORT nTypeId = (USHORT)(ULONG)aTypeLB.GetEntryData(GetTypeSel());

    String sOldSel;

    USHORT nSelectionSel = aSelectionLB.GetSelectEntryPos();
    if (nSelectionSel != LISTBOX_ENTRY_NOTFOUND)
        sOldSel = aSelectionLB.GetEntry(nSelectionSel);

    aSelectionLB.SetUpdateMode(FALSE);
    aSelectionLB.Clear();

    if (IsFldEdit() && !sOldSel.Len())
        sOldSel = String::CreateFromInt32( pRefFld->GetSeqNo() + 1 );

    if( REFFLDFLAG & nTypeId )
    {
        if (nTypeId == REFFLDFLAG_BOOKMARK)     // TextMarken!
        {
            aSelectionLB.SetStyle(aSelectionLB.GetStyle()|WB_SORT);
            // alle Textmarken besorgen
            USHORT nCnt = pSh->GetBookmarkCnt(TRUE);
            for( USHORT n = 0; n < nCnt; ++n )
            {
                const SwBookmark& rBkmk = pSh->GetBookmark( n, TRUE );
                aSelectionLB.InsertEntry( rBkmk.GetName() );
            }
            if (IsFldEdit())
                sOldSel = pRefFld->GetSetRefName();
        }
        else if (nTypeId == REFFLDFLAG_FOOTNOTE)
        {
            aSelectionLB.SetStyle(aSelectionLB.GetStyle() & ~WB_SORT);
            SwSeqFldList aArr;
            USHORT nCnt = pSh->GetSeqFtnList( aArr );
            USHORT nFnd = 0;

            for( USHORT n = 0; n < nCnt; ++n )
            {
                aSelectionLB.InsertEntry( aArr[ n ]->sDlgEntry );
                if (IsFldEdit() && pRefFld->GetSeqNo() == aArr[ n ]->nSeqNo)
                    sOldSel = aArr[n]->sDlgEntry;
            }
        }
        else if (nTypeId == REFFLDFLAG_ENDNOTE)
        {
            aSelectionLB.SetStyle(aSelectionLB.GetStyle() & ~WB_SORT);
            SwSeqFldList aArr;
            USHORT nCnt = pSh->GetSeqFtnList( aArr, TRUE );
            USHORT nFnd = 0;

            for( USHORT n = 0; n < nCnt; ++n )
            {
                aSelectionLB.InsertEntry( aArr[ n ]->sDlgEntry );
                if (IsFldEdit() && pRefFld->GetSeqNo() == aArr[ n ]->nSeqNo)
                    sOldSel = aArr[n]->sDlgEntry;
            }
        }
        else
        {
            aSelectionLB.SetStyle(aSelectionLB.GetStyle()|WB_SORT);
            // zum Seq-FeldTyp die Felder besorgen:

            SwSetExpFieldType* pType = (SwSetExpFieldType*)pSh->GetFldType(
                                nTypeId & ~REFFLDFLAG, RES_SETEXPFLD );
            if( pType )
            {
                SwSeqFldList aArr;
                sOldSel.Erase();

                USHORT nCnt = pType->GetSeqFldList( aArr );
                for( USHORT n = 0; n < nCnt; ++n )
                {
                    aSelectionLB.InsertEntry( aArr[ n ]->sDlgEntry );
                    if (IsFldEdit() && !sOldSel.Len() &&
                        aArr[ n ]->nSeqNo == pRefFld->GetSeqNo())
                        sOldSel = aArr[ n ]->sDlgEntry;
                }

                if (IsFldEdit() && !sOldSel.Len())
                    sOldSel = String::CreateFromInt32( pRefFld->GetSeqNo() + 1);
            }
        }
    }
    else
    {
        SvStringsDtor& rLst = GetFldMgr().GetSubTypes(nTypeId);
        for (USHORT i = 0; i < rLst.Count(); ++i)
            aSelectionLB.InsertEntry(*rLst[i]);

        if (IsFldEdit())
            sOldSel = pRefFld->GetSetRefName();
    }

    aSelectionLB.SetUpdateMode(TRUE);

    // Enable oder Disable
    BOOL bEnable = aSelectionLB.GetEntryCount() != 0;
    aSelectionLB.Enable( bEnable );
    aSelectionFT.Enable( bEnable );

    if ( bEnable )
    {
        aSelectionLB.SelectEntry(sOldSel);
        if (!aSelectionLB.GetSelectEntryCount() && !IsFldEdit())
            aSelectionLB.SelectEntryPos(0);
    }

    if (IsFldEdit() && !aSelectionLB.GetSelectEntryCount()) // Falls die Referenz schon geloescht wurde...
        aNameED.SetText(sOldSel);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

USHORT SwFldRefPage::FillFormatLB(USHORT nTypeId)
{
    String sOldSel;

    USHORT nFormatSel = aFormatLB.GetSelectEntryPos();
    if (nFormatSel != LISTBOX_ENTRY_NOTFOUND)
        sOldSel = aFormatLB.GetEntry(nFormatSel);

    // Format-Listbox fuellen
    aFormatLB.Clear();

    // Referenz hat weniger als die Beschriftung
    USHORT nSize;
    switch (nTypeId)
    {
    case TYP_GETREFFLD:
    case REFFLDFLAG_BOOKMARK:
    case REFFLDFLAG_FOOTNOTE:
    case REFFLDFLAG_ENDNOTE:
        nSize = FMT_REF_PAGE_PGDSC - FMT_REF_BEGIN + 1;
        break;

    default:
        nSize = GetFldMgr().GetFormatCount( (REFFLDFLAG & nTypeId)
                                                ? TYP_GETREFFLD : nTypeId,
                                            FALSE, IsFldDlgHtmlMode() );
        break;
    }

    if (REFFLDFLAG & nTypeId)
        nTypeId = TYP_GETREFFLD;

    for (USHORT i = 0; i < nSize; i++)
    {
        USHORT nPos = aFormatLB.InsertEntry(GetFldMgr().GetFormatStr( nTypeId, i ));
        aFormatLB.SetEntryData( nPos, (void*)GetFldMgr().GetFormatId( nTypeId, i ));
    }

    if (nSize)
    {
        if (!IsFldEdit())
            aFormatLB.SelectEntry(sOldSel);
        else
            aFormatLB.SelectEntry(SW_RESSTR(FMT_REF_BEGIN + (USHORT)GetCurField()->GetFormat()));

        if (!aFormatLB.GetSelectEntryCount())
        {
            aFormatLB.SelectEntryPos(nFldDlgFmtSel);
            if (!aFormatLB.GetSelectEntryCount())
                aFormatLB.SelectEntryPos(0);
        }
    }

    return nSize;
}

/*--------------------------------------------------------------------
    Beschreibung: Modify
 --------------------------------------------------------------------*/

IMPL_LINK( SwFldRefPage, ModifyHdl, Edit *, EMPTYARG )
{
    String aName(aNameED.GetText());
    const USHORT nLen = aName.Len();

    BOOL bEnable = TRUE;
    USHORT nTypeId = (USHORT)(ULONG)aTypeLB.GetEntryData(GetTypeSel());

    if ((nTypeId == TYP_SETREFFLD && !GetFldMgr().CanInsertRefMark(aName)) ||
        (nLen == 0 && (nTypeId == TYP_GETREFFLD || nTypeId == TYP_SETREFFLD ||
                       nTypeId == REFFLDFLAG_BOOKMARK)))
        bEnable = FALSE;

    EnableInsert(bEnable);

    aSelectionLB.SelectEntry(aName);

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

BOOL SwFldRefPage::FillItemSet(SfxItemSet& )
{
    BOOL bPage = FALSE;
    BOOL bModified = FALSE;
    USHORT nTypeId = (USHORT)(ULONG)aTypeLB.GetEntryData(GetTypeSel());

    USHORT nSubType = 0;
    ULONG nFormat;

    nFormat = aFormatLB.GetSelectEntryPos();

    if(nFormat == LISTBOX_ENTRY_NOTFOUND)
        nFormat = 0;
    else
        nFormat = (ULONG)aFormatLB.GetEntryData((USHORT)nFormat);

    String aVal(aValueED.GetText());
    String aName(aNameED.GetText());

    switch(nTypeId)
    {
        case TYP_GETREFFLD:
            // aName = aSelectionLB.GetSelectEntry();
            nSubType = REF_SETREFATTR;
            break;

        case TYP_SETREFFLD:
        {
            SwFieldType* pType = GetFldMgr().GetFldType(RES_SETEXPFLD, aName);

            if(!pType)  // Nur einfuegen, wenn es den Namen noch nicht gibt
            {
                aSelectionLB.InsertEntry(aName);
                aSelectionLB.Enable();
                aSelectionFT.Enable();
            }
            break;
        }
    }

    SwGetRefField* pRefFld = (SwGetRefField*)GetCurField();

    if (REFFLDFLAG & nTypeId)
    {
        SwView *pView = ::GetActiveView();
        ASSERT(pView, View fehlt);
        SwWrtShell &rSh = pView->GetWrtShell();

        if (nTypeId == REFFLDFLAG_BOOKMARK)     // TextMarken!
        {
            aName = aNameED.GetText();
            nTypeId = TYP_GETREFFLD;
            nSubType = REF_BOOKMARK;
        }
        else if (REFFLDFLAG_FOOTNOTE == nTypeId)        // Fussnoten
        {
            SwSeqFldList aArr;
            _SeqFldLstElem aElem( aSelectionLB.GetSelectEntry(), 0 );

            USHORT nPos;

            nTypeId = TYP_GETREFFLD;
            nSubType = REF_FOOTNOTE;
            aName.Erase();

            if (rSh.GetSeqFtnList(aArr) && aArr.SeekEntry(aElem, &nPos))
            {
                aVal = String::CreateFromInt32( aArr[nPos]->nSeqNo );

                if (IsFldEdit() && COMPARE_EQUAL != aVal.CompareTo(pRefFld->GetSeqNo()))
                    bModified = TRUE; // Kann bei Feldern passieren, deren Referenz geloescht wurde
            }
            else if (IsFldEdit())
                aVal = String::CreateFromInt32( pRefFld->GetSeqNo() );
        }
        else if (REFFLDFLAG_ENDNOTE == nTypeId)         // Endnoten
        {
            SwSeqFldList aArr;
            _SeqFldLstElem aElem( aSelectionLB.GetSelectEntry(), 0 );

            USHORT nPos;

            nTypeId = TYP_GETREFFLD;
            nSubType = REF_ENDNOTE;
            aName.Erase();

            if (rSh.GetSeqFtnList(aArr, TRUE) && aArr.SeekEntry(aElem, &nPos))
            {
                aVal = String::CreateFromInt32( aArr[nPos]->nSeqNo );

                if (IsFldEdit() && COMPARE_EQUAL != aVal.CompareTo(pRefFld->GetSeqNo()))
                    bModified = TRUE; // Kann bei Feldern passieren, deren Referenz geloescht wurde
            }
            else if (IsFldEdit())
                aVal = String::CreateFromInt32( pRefFld->GetSeqNo() );
        }
        else                                // SeqenceFelder
        {
            // zum Seq-FeldTyp die Felder besorgen:
            SwSetExpFieldType* pType = (SwSetExpFieldType*)rSh.GetFldType(
                                    nTypeId & ~REFFLDFLAG, RES_SETEXPFLD );
            if( pType )
            {
                SwSeqFldList aArr;
                _SeqFldLstElem aElem( aSelectionLB.GetSelectEntry(), 0 );

                USHORT nPos;

                nTypeId = TYP_GETREFFLD;
                nSubType = REF_SEQUENCEFLD;
                aName = pType->GetName();

                if (pType->GetSeqFldList(aArr) && aArr.SeekEntry(aElem, &nPos))
                {
                    aVal = String::CreateFromInt32( aArr[nPos]->nSeqNo );

                    if (IsFldEdit() && COMPARE_EQUAL != aVal.CompareTo(pRefFld->GetSeqNo()))
                        bModified = TRUE; // Kann bei Feldern passieren, deren Referenz geloescht wurde
                }
                else if (IsFldEdit())
                    aVal = String::CreateFromInt32( pRefFld->GetSeqNo() );
            }
        }
    }

    if (IsFldEdit() && nTypeId == TYP_GETREFFLD)
    {
        aVal.Insert('|', 0);
        aVal.Insert(String::CreateFromInt32(nSubType), 0);
    }

    if (!IsFldEdit() || bModified ||
        aNameED.GetSavedValue() != aNameED.GetText() ||
        aValueED.GetSavedValue() != aValueED.GetText() ||
        aTypeLB.GetSavedValue() != aTypeLB.GetSelectEntryPos() ||
        aSelectionLB.GetSavedValue() != aSelectionLB.GetSelectEntryPos() ||
        aFormatLB.GetSavedValue() != aFormatLB.GetSelectEntryPos())
    {
        InsertFld( nTypeId, nSubType, aName, aVal, nFormat );
    }

    ModifyHdl();    // Insert ggf enablen/disablen

    return FALSE;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SfxTabPage* SwFldRefPage::Create(   Window* pParent,
                        const SfxItemSet& rAttrSet )
{
    return ( new SwFldRefPage( pParent, rAttrSet ) );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

USHORT SwFldRefPage::GetGroup()
{
    return GRP_REF;
}

/* -----------------12.01.99 10:09-------------------
 *
 * --------------------------------------------------*/
void    SwFldRefPage::FillUserData()
{
    String sData( String::CreateFromAscii(
                    RTL_CONSTASCII_STRINGPARAM( USER_DATA_VERSION )));
    sData += ';';
    USHORT nTypeSel = aTypeLB.GetSelectEntryPos();
    if( LISTBOX_ENTRY_NOTFOUND == nTypeSel )
        nTypeSel = USHRT_MAX;
    else
        nTypeSel = (ULONG)aTypeLB.GetEntryData( nTypeSel );
    sData += String::CreateFromInt32( nTypeSel );
    SetUserData(sData);
}
/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.32  2000/09/18 16:05:29  willem.vandorp
    OpenOffice header added.

    Revision 1.31  2000/08/31 10:07:13  os
    #78315# CreateFromInt32

    Revision 1.30  2000/07/20 08:10:52  jp
    Unicode-Change-Error: call createfromint32

    Revision 1.29  2000/06/30 08:52:53  os
    #76541# string assertions removed

    Revision 1.28  2000/06/19 14:06:07  os
    #72953# call SubTypeHdl more often

    Revision 1.27  2000/05/23 18:36:48  jp
    Bugfixes for Unicode

    Revision 1.26  2000/04/18 15:17:32  os
    UNICODE

    Revision 1.25  1999/09/28 11:10:35  os
    #68076# call modify handler if a name is selected

    Revision 1.24  1999/04/06 09:27:54  JP
    Task #64320#: bei Referenz auf Nummernkreis auch die Nummer als Format anbieten


      Rev 1.23   06 Apr 1999 11:27:54   JP
   Task #64320#: bei Referenz auf Nummernkreis auch die Nummer als Format anbieten

      Rev 1.22   25 Feb 1999 17:24:52   JP
   Bug #62438#: UserData nur auswerten, wenn kein Refresh ist

      Rev 1.21   21 Jan 1999 09:46:22   OS
   #59900# Fussnoten im Dialog korrekt sortieren; keine prot. Member

      Rev 1.20   20 Jan 1999 14:25:40   MIB
   Keine leeren Refs auf Textmarken

      Rev 1.19   12 Jan 1999 11:42:54   OS
   #60579# ausgewaehlten Typ in den UserData speichern

      Rev 1.18   10 Aug 1998 16:41:12   JP
   Bug #54796#: neue NumerierungsTypen (WW97 kompatibel)

      Rev 1.17   23 Jun 1998 14:43:10   OM
   Referenzen und Textmarken mit beliebigem Namen einfuegen

      Rev 1.16   22 Jun 1998 17:58:02   OM
   Vorbereitung fuer eigenstaendige Referenzfelder

      Rev 1.15   18 May 1998 15:21:34   OM
   #50222 Korrekte Formate fuer Endnoten

      Rev 1.14   27 Mar 1998 16:56:42   OM
   Nur bei Aenderung Dok modifizieren

      Rev 1.13   23 Feb 1998 07:26:36   OS
   GetBookmark/ Cnt mit Bookmark-Flag

      Rev 1.12   16 Feb 1998 10:10:22   OM
   Fuer Solaris nicht direkt von void* auf ushort casten

      Rev 1.11   30 Jan 1998 15:25:36   OM
   Endnoten

      Rev 1.10   27 Jan 1998 22:43:52   JP
   GetNumDepend durch GetDepends ersetzt

      Rev 1.9   09 Jan 1998 16:56:52   OM
   Bei Dok-Wechsel updaten

      Rev 1.8   08 Jan 1998 14:58:26   OM
   Traveling

      Rev 1.7   08 Jan 1998 10:19:04   OM
   Referenzen editieren

      Rev 1.6   07 Jan 1998 17:17:42   OM
   Referenzen editieren

      Rev 1.5   19 Dec 1997 18:24:26   OM
   Feldbefehl-bearbeiten Dlg

      Rev 1.4   12 Dec 1997 16:10:34   OM
   AutoUpdate bei FocusWechsel u.a.

      Rev 1.3   11 Dec 1997 16:58:50   OM
   Feldumstellung

      Rev 1.2   08 Dec 1997 12:32:22   MA
   vorb. Endnoten

      Rev 1.1   24 Nov 1997 14:40:24   OM
   Referenz-TP

      Rev 1.0   04 Nov 1997 10:07:20   OM
   Initial revision.

------------------------------------------------------------------------*/

diff --git a/sw/source/ui/fldui/fldref.hxx b/sw/source/ui/fldui/fldref.hxx
new file mode 100644
index 0000000..9c50d0d
--- /dev/null
+++ b/sw/source/ui/fldui/fldref.hxx
@@ -0,0 +1,130 @@
/*************************************************************************
 *
 *  $RCSfile: fldref.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:36 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWFLDREF_HXX
#define _SWFLDREF_HXX

#ifndef _SFXTABDLG_HXX //autogen
#include <sfx2/tabdlg.hxx>
#endif
#ifndef _SV_FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif
#ifndef _SV_LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif
#ifndef _SV_BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif
#ifndef _SV_GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif
#ifndef _SV_EDIT_HXX //autogen
#include <vcl/edit.hxx>
#endif

#include "fldpage.hxx"

/*--------------------------------------------------------------------
   Beschreibung:
 --------------------------------------------------------------------*/

class SwFldRefPage : public SwFldPage
{
    FixedText       aTypeFT;
    ListBox         aTypeLB;
    FixedText       aSelectionFT;
    ListBox         aSelectionLB;
    FixedText       aFormatFT;
    ListBox         aFormatLB;
    FixedText       aNameFT;
    Edit            aNameED;
    FixedText       aValueFT;
    Edit            aValueED;
    String          sBookmarkTxt;
    String          sFootnoteTxt;
    String          sEndnoteTxt;

    DECL_LINK( TypeHdl, ListBox* pLB = 0 );
    DECL_LINK( SubTypeHdl, ListBox* pLB = 0 );
    DECL_LINK( ModifyHdl, Edit *pEd = 0 );

    void                UpdateSubType();
    USHORT              FillFormatLB(USHORT nTypeId);

protected:
    virtual USHORT      GetGroup();

public:
                        SwFldRefPage(Window* pParent, const SfxItemSet& rSet);

                        ~SwFldRefPage();

    static SfxTabPage*  Create(Window* pParent, const SfxItemSet& rAttrSet);

    virtual BOOL        FillItemSet( SfxItemSet& rSet );
    virtual void        Reset( const SfxItemSet& rSet );

    virtual void        FillUserData();
};


#endif

diff --git a/sw/source/ui/fldui/fldref.src b/sw/source/ui/fldui/fldref.src
new file mode 100644
index 0000000..2763f4b2
--- /dev/null
+++ b/sw/source/ui/fldui/fldref.src
@@ -0,0 +1,352 @@
/*************************************************************************
 *
 *  $RCSfile: fldref.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:36 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "globals.hrc"
#include "fldtdlg.hrc"
#include "helpid.h"
TabPage TP_FLD_REF
{
    HelpID = HID_FLD_REF ;
    SVLook = TRUE ;
    Hide = TRUE ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Text = "Referenzen" ;
    Text [ ENGLISH ] = "References" ;
    FixedText FT_REFTYPE
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 76 , 10 ) ;
        Text = "~Feldtyp" ;
        Text [ ENGLISH ] = "Type" ;
        Text [ norwegian ] = "Type" ;
        Text [ italian ] = "~Tipo di campo" ;
        Text [ portuguese_brazilian ] = "Tipo" ;
        Text [ portuguese ] = "Tipo de ~campo" ;
        Text [ finnish ] = "Laji" ;
        Text [ danish ] = "Felttype" ;
        Text [ french ] = "~Type de champ" ;
        Text [ swedish ] = "~Fälttyp" ;
        Text [ dutch ] = "~Veldtype" ;
        Text [ spanish ] = "~Tipo de campo" ;
        Text [ english_us ] = "~Type" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "×Ö¶ÎÀàÐÍ(~T)";
        Text[ russian ] = "Òèï ïîëÿ";
        Text[ polish ] = "Typ pola";
        Text[ japanese ] = "̨°ÙÄނ̎í—Þ(~T)";
        Text[ chinese_traditional ] = "Ãþ«¬(~T)";
        Text[ arabic ] = "äæÚ ÇáÍÞá";
        Text[ greek ] = "~Ôýðïò ðåäßïõ";
        Text[ korean ] = "ÇüÅÂ(~T)";
        Text[ turkish ] = "~Alan tipi";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_REFTYPE
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 6 , 16 ) ;
        Size = MAP_APPFONT ( 76 , 113 ) ;
        TabStop = TRUE ;
         // JP 05.11.96: darf nicht sortiert sein!
         //        Sort = FALSE;
        AutoHScroll = TRUE ;
    };
    FixedText FT_REFSELECTION
    {
        Pos = MAP_APPFONT ( 88 , 3 ) ;
        Size = MAP_APPFONT ( 76 , 10 ) ;
        Text = "~Auswahl" ;
        Text [ ENGLISH ] = "Selection" ;
        Text [ norwegian ] = "Selection" ;
        Text [ italian ] = "~Selezione" ;
        Text [ portuguese_brazilian ] = "Seleção" ;
        Text [ portuguese ] = "~Selecção" ;
        Text [ finnish ] = "Valinta" ;
        Text [ danish ] = "Udvalg" ;
        Text [ french ] = "~Sélection" ;
        Text [ swedish ] = "~Urval" ;
        Text [ dutch ] = "~Selectie" ;
        Text [ spanish ] = "Se~lección" ;
        Text [ english_us ] = "S~election" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "Ñ¡Ôñ(~E)";
        Text[ russian ] = "Âûáîð";
        Text[ polish ] = "Wybór";
        Text[ japanese ] = "‘I‘ð(~E)";
        Text[ chinese_traditional ] = "¿ï¨ú(~E)";
        Text[ arabic ] = "ÇáÊÍÏíÏ";
        Text[ greek ] = "~ÅðéëïãÞ";
        Text[ korean ] = "¼±ÅÃ(~E)";
        Text[ turkish ] = "S~eçim";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_REFSELECTION
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 88 , 16 ) ;
        Size = MAP_APPFONT ( 76 , 113 ) ;
        TabStop = TRUE ;
        Sort = TRUE ;
    };
    FixedText FT_REFFORMAT
    {
        Pos = MAP_APPFONT ( 170 , 3 ) ;
        Size = MAP_APPFONT ( 84 , 10 ) ;
        TEXT = "F~ormat" ;
        TEXT [ English ] = "Format" ;
        Left = TRUE ;
        Text [ english_us ] = "F~ormat" ;
        Text [ portuguese_brazilian ] = "F~ormat" ;
        Text [ swedish ] = "F~ormat" ;
        Text [ danish ] = "Format" ;
        Text [ italian ] = "F~ormato" ;
        Text [ spanish ] = "F~ormato" ;
        Text [ french ] = "F~ormat" ;
        Text [ dutch ] = "F~ormaat" ;
        Text [ portuguese ] = "F~ormato" ;
        Text[ chinese_simplified ] = "¸ñʽ(~O)";
        Text[ russian ] = "Ôîðìàò";
        Text[ polish ] = "Format";
        Text[ japanese ] = "‘Ž®(~O)";
        Text[ chinese_traditional ] = "®æ¦¡(~O)";
        Text[ arabic ] = "ÇáÊäÓíÞ";
        Text[ greek ] = "Ì~ïñöÞ";
        Text[ korean ] = "¼­½Ä(~O)";
        Text[ turkish ] = "F~ormat";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_REFFORMAT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 170 , 16 ) ;
        Size = MAP_APPFONT ( 84 , 56 ) ;
        TabStop = TRUE ;
        DropDown = FALSE ;
         // Sort = TRUE;
    };
    FixedText FT_REFNAME
    {
        Pos = MAP_APPFONT ( 170 , 78 ) ;
        Size = MAP_APPFONT ( 84 , 10 ) ;
        Text = "Na~me" ;
        TEXT [ English ] = "Na~me" ;
        Left = TRUE ;
        Text [ english_us ] = "Na~me" ;
        Text [ portuguese_brazilian ] = "Na~me" ;
        Text [ swedish ] = "Na~mn" ;
        Text [ danish ] = "Navn" ;
        Text [ italian ] = "No~me" ;
        Text [ spanish ] = "No~mbre" ;
        Text [ french ] = "~Nom" ;
        Text [ dutch ] = "Naa~m" ;
        Text [ portuguese ] = "No~me" ;
        Text[ chinese_simplified ] = "Ãû³Æ(~M)";
        Text[ russian ] = "Èìÿ";
        Text[ polish ] = "Nazwa";
        Text[ japanese ] = "–¼‘O(~M)";
        Text[ chinese_traditional ] = "¦WºÙ(~M)";
        Text[ arabic ] = "ÇáÇÓã";
        Text[ greek ] = "¼íïìá";
        Text[ korean ] = "À̸§(~M)";
        Text[ turkish ] = "~Ad";
        Text[ language_user1 ] = " ";
    };
    Edit ED_REFNAME
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 170 , 90 ) ;
        Size = MAP_APPFONT ( 84 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
    };
    FixedText FT_REFVALUE
    {
        Pos = MAP_APPFONT ( 170 , 105 ) ;
        Size = MAP_APPFONT ( 84 , 10 ) ;
        Text = "~Wert" ;
        Text [ ENGLISH ] = "Value" ;
        Text [ norwegian ] = "Verdi" ;
        Text [ italian ] = "~Valore" ;
        Text [ portuguese_brazilian ] = "Valor" ;
        Text [ portuguese ] = "Valor" ;
        Text [ finnish ] = "Arvo" ;
        Text [ danish ] = "Værdi" ;
        Text [ french ] = "~Valeur" ;
        Text [ swedish ] = "~Värde" ;
        Text [ dutch ] = "~Waarde" ;
        Text [ spanish ] = "~Valor" ;
        Text [ english_us ] = "~Value" ;
        Disable = TRUE ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "ÊýÖµ(~V)";
        Text[ russian ] = "Çíà÷åíèå";
        Text[ polish ] = "WartoϾ";
        Text[ japanese ] = "’l(~V)";
        Text[ chinese_traditional ] = "¼Æ­È(~V)";
        Text[ arabic ] = "ÇáÞíãÉ";
        Text[ greek ] = "ÔéìÞ";
        Text[ korean ] = "°ª(~V)";
        Text[ turkish ] = "~Deðer";
        Text[ language_user1 ] = " ";
    };
    Edit ED_REFVALUE
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 170 , 117 ) ;
        Size = MAP_APPFONT ( 84 , 12 ) ;
        TabStop = TRUE ;
        Disable = TRUE ;
        Left = TRUE ;
    };
    String STR_REFBOOKMARK
    {
        TEXT = "Textmarken" ;
        TEXT [ English ] = "Bookmarks" ;
        Text [ dutch ] = "Tekstmarkeringen" ;
        Text [ english_us ] = "Bookmarks" ;
        Text [ italian ] = "Segnalibri di testo" ;
        Text [ spanish ] = "Marcas de texto" ;
        Text [ french ] = "Repères de texte" ;
        Text [ swedish ] = "Bokmärken" ;
        Text [ danish ] = "Tekstmarkeringer" ;
        Text [ portuguese ] = "Marcadores de texto" ;
        Text [ portuguese_brazilian ] = "Textmarken" ;
        Text[ chinese_simplified ] = "ÊéÇ©";
        Text[ russian ] = "Çàêëàäêè";
        Text[ polish ] = "Zak³adki";
        Text[ japanese ] = "÷½Äϰ¸";
        Text[ chinese_traditional ] = "¤º¤å¼ÐÅÒ";
        Text[ arabic ] = "ÅÔÇÑÇÊ ãÑÌÚíÉ";
        Text[ greek ] = "Óåëéäïäåßêôåò";
        Text[ korean ] = "Ã¥ °¥ÇÇ";
        Text[ turkish ] = "Metin iþareti";
        Text[ language_user1 ] = " ";
    };
    String STR_REFFOOTNOTE
    {
        Text = "Fußnoten" ;
        Text [ English ] = "Footnotes" ;
        Text [ norwegian ] = "Fotnoter" ;
        Text [ italian ] = "Note a piè pagina" ;
        Text [ portuguese_brazilian ] = "Notas de rodapé" ;
        Text [ portuguese ] = "Notas de rodapé" ;
        Text [ finnish ] = "Alaviitteet" ;
        Text [ danish ] = "Fodnoter" ;
        Text [ french ] = "Notes de bas de page" ;
        Text [ swedish ] = "Fotnoter" ;
        Text [ dutch ] = "Voetnoten" ;
        Text [ spanish ] = "Notas al pie" ;
        Text [ english_us ] = "Footnotes" ;
        Text[ chinese_simplified ] = "×¢½Å";
        Text[ russian ] = "Ñíîñêè";
        Text[ polish ] = "Przypisy dolne";
        Text[ japanese ] = "‹r’";
        Text[ chinese_traditional ] = "µù¸}";
        Text[ arabic ] = "ÍæÇÔí ÓÝáíÉ";
        Text[ greek ] = "Õðïóçìåéþóåéò";
        Text[ korean ] = "°¢ÁÖ";
        Text[ turkish ] = "Dipnotlar";
        Text[ language_user1 ] = " ";
    };
    String STR_REFENDNOTE
    {
        Text = "Endnoten" ;
        Text [ ENGLISH ] = "endnotes" ;
        Text [ english_us ] = "Endnotes" ;
        Text [ portuguese_brazilian ] = "Endnoten" ;
        Text [ swedish ] = "Slutnoter" ;
        Text [ danish ] = "Slutnote" ;
        Text [ italian ] = "Note di chiusura" ;
        Text [ spanish ] = "Notas finales" ;
        Text [ french ] = "Notes de fin" ;
        Text [ dutch ] = "Eindnoten" ;
        Text [ portuguese ] = "Notas finais" ;
        Text[ chinese_simplified ] = "βע";
        Text[ russian ] = "Êîíöåâàÿ ñíîñêà";
        Text[ polish ] = "Przypisy koñcowe";
        Text[ japanese ] = "•¶––‹r’";
        Text[ chinese_traditional ] = "§Àª`";
        Text[ arabic ] = "ÊÚáíÞÇÊ ÎÊÇãíÉ";
        Text[ greek ] = "Óçìåéþóåéò ôÝëïõò";
        Text[ korean ] = "¹ÌÁÖ";
        Text[ turkish ] = "Son notlar";
        Text[ language_user1 ] = " ";
    };
    Text [ english_us ] = "References" ;
    Text [ portuguese_brazilian ] = "Referenzen" ;
    Text [ swedish ] = "Referenser" ;
    Text [ danish ] = "Referencer" ;
    Text [ italian ] = "Riferimenti" ;
    Text [ spanish ] = "Referencias" ;
    Text [ french ] = "Références" ;
    Text [ dutch ] = "Verwijzingen" ;
    Text [ portuguese ] = "Referências" ;
    Text[ chinese_simplified ] = "˵Ã÷ÎÄ";
    Text[ russian ] = "Ññûëêè";
    Text[ polish ] = "Odwo³ania";
    Text[ japanese ] = "ŽQÆ";
    Text[ chinese_traditional ] = "°Ñ·Ó¤å";
    Text[ arabic ] = "ÇáãÑÇÌÚ";
    Text[ greek ] = "ÁíáöïñÝò";
    Text[ korean ] = "ÂüÁ¶";
    Text[ turkish ] = "Referans";
    Text[ language_user1 ] = " ";
};
diff --git a/sw/source/ui/fldui/fldtdlg.cxx b/sw/source/ui/fldui/fldtdlg.cxx
new file mode 100644
index 0000000..1fbf875
--- /dev/null
+++ b/sw/source/ui/fldui/fldtdlg.cxx
@@ -0,0 +1,567 @@
/*************************************************************************
 *
 *  $RCSfile: fldtdlg.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:36 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif

#ifndef _BASEDLGS_HXX //autogen
#include <sfx2/basedlgs.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SV_MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SVX_HTMLMODE_HXX //autogen
#include <svx/htmlmode.hxx>
#endif

#ifndef _VIEWOPT_HXX
#include <viewopt.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _FLDWRAP_HXX
#include <fldwrap.hxx>
#endif
#ifndef _FLDDB_HXX
#include <flddb.hxx>
#endif
#ifndef _FLDDINF_HXX
#include <flddinf.hxx>
#endif
#ifndef _FLDVAR_HXX
#include <fldvar.hxx>
#endif
#ifndef _FLDDOK_HXX
#include <flddok.hxx>
#endif
#ifndef _FLDFUNC_HXX
#include <fldfunc.hxx>
#endif
#ifndef _FLDREF_HXX
#include <fldref.hxx>
#endif
#ifndef _WRTSH_HXX //autogen
#include <wrtsh.hxx>
#endif
#ifndef _SWVIEW_HXX //autogen
#include <view.hxx>
#endif
#ifndef _FLDTDLG_HXX
#include <fldtdlg.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif

#ifndef _HELPID_H
#include <helpid.h>
#endif
#ifndef _FLDUI_HRC
#include <fldui.hrc>
#endif
#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif
#ifndef _FLDTDLG_HRC
#include <fldtdlg.hrc>
#endif


SFX_IMPL_CHILDWINDOW(SwFldDlgWrapper, FN_INSERT_FIELD)

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SwChildWinWrapper::SwChildWinWrapper(Window *pParentWindow, USHORT nId) :
        SfxChildWindow(pParentWindow, nId),
        pDocSh(0)
{
    // Flackern der Buttons vermeiden:
    aUpdateTimer.SetTimeout(200);
    aUpdateTimer.SetTimeoutHdl(LINK(this, SwChildWinWrapper, UpdateHdl));
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwChildWinWrapper, UpdateHdl, void*, EMPTYARG )
{
    GetWindow()->Activate();    // Dialog aktualisieren

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung: Nach Dok-Wechsel Dialog neu initialisieren
 --------------------------------------------------------------------*/

BOOL SwChildWinWrapper::ReInitDlg(SwDocShell *pDocSh)
{
    BOOL bRet = FALSE;

    if (pDocSh != GetOldDocShell())
    {
        aUpdateTimer.Stop();
        bRet = TRUE;            // Sofortiges Update
    }
    else
        aUpdateTimer.Start();

    return bRet;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SwFldDlgWrapper::SwFldDlgWrapper( Window* pParent, USHORT nId,
                                        SfxBindings* pB,
                                        SfxChildWinInfo* pInfo) :
    SwChildWinWrapper( pParent, nId )

{
    pWindow = new SwFldDlg( pB, this, pParent );
    SwFldDlg *pWin = (SwFldDlg*)pWindow;
    pWin->Start();

    ((SwFldDlg*)pWindow)->Initialize(pInfo);
    eChildAlignment = SFX_ALIGN_NOALIGNMENT;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SfxChildWinInfo SwFldDlgWrapper::GetInfo() const
{
    SfxChildWinInfo aInfo = SfxChildWindow::GetInfo();
    // ((SfxFloatingWindow*)GetWindow())->FillInfo( aInfo );
    return aInfo;
}

/*--------------------------------------------------------------------
    Beschreibung: Nach Dok-Wechsel Dialog neu initialisieren
 --------------------------------------------------------------------*/

BOOL SwFldDlgWrapper::ReInitDlg(SwDocShell *pDocSh)
{
    BOOL bRet;

    if ((bRet = SwChildWinWrapper::ReInitDlg(pDocSh)) == TRUE)  // Sofort aktualisieren, Dok-Wechsel
        ((SwFldDlg*)GetWindow())->ReInitDlg();

    return bRet;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwFldDlgWrapper::ShowPage(USHORT nPage)
{
    ((SwFldDlg*)GetWindow())->ShowPage(nPage ? nPage : TP_FLD_REF);
}

/*--------------------------------------------------------------------
    Beschreibung:   Der Traeger des Dialoges
 --------------------------------------------------------------------*/


SwFldDlg::SwFldDlg(SfxBindings* pB, SwChildWinWrapper* pCW, Window *pParent) :
    SfxTabDialog(pParent, SW_RES(DLG_FLD_INSERT)),
    pChildWin(pCW)
{
    SetStyle(GetStyle()|WB_STDMODELESS);
    bHtmlMode = (::GetHtmlMode((SwDocShell*)SfxObjectShell::Current()) & HTMLMODE_ON) != 0;

    RemoveResetButton();

    GetOKButton().SetText(String(SW_RES(STR_FLD_INSERT)));
    GetOKButton().SetHelpId(HID_FIELD_INSERT);
    GetOKButton().SetHelpText(aEmptyStr);   // Damit generierter Hilfetext verwendet wird

    GetCancelButton().SetText(String(SW_RES(STR_FLD_CLOSE)));
    GetCancelButton().SetHelpId(HID_FIELD_CLOSE);
    GetCancelButton().SetHelpText(aEmptyStr);   // Damit generierter Hilfetext verwendet wird

    FreeResource();

    GetOKButton().SetClickHdl(LINK(this, SwFldDlg, OKHdl));

    AddTabPage(TP_FLD_DOK, SwFldDokPage::Create, 0);
    AddTabPage(TP_FLD_VAR, SwFldVarPage::Create, 0);
    AddTabPage(TP_FLD_DOKINF, SwFldDokInfPage::Create, 0);

    if (!bHtmlMode)
    {
        AddTabPage(TP_FLD_REF, SwFldRefPage::Create, 0);
        AddTabPage(TP_FLD_FUNC, SwFldFuncPage::Create, 0);
        AddTabPage(TP_FLD_DB, SwFldDBPage::Create, 0);
    }
    else
    {
        RemoveTabPage(TP_FLD_REF);
        RemoveTabPage(TP_FLD_FUNC);
        RemoveTabPage(TP_FLD_DB);
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


SwFldDlg::~SwFldDlg()
{
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

BOOL SwFldDlg::Close()
{
    SfxViewFrame::Current()->GetDispatcher()->
        Execute(FN_INSERT_FIELD, SFX_CALLMODE_ASYNCHRON|SFX_CALLMODE_RECORD);
    return TRUE;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwFldDlg::Initialize(SfxChildWinInfo *pInfo)
{
    Point aPos;
    Size aSize;

    if ( pInfo->aSize.Width() != 0 && pInfo->aSize.Height() != 0 )
    {
        aPos = pInfo->aPos;
        if ( GetStyle() & WB_SIZEABLE )
            SetSizePixel( pInfo->aSize );

        // Initiale Gr"o\se aus pInfo merken
        aSize = GetSizePixel();

        // Soll das FloatingWindow eingezoomt werden ?
        if ( pInfo->nFlags & SFX_CHILDWIN_ZOOMIN )
            RollUp();
    }
    else
    {
        // Initiale Gr"o\se aus Resource oder ctor merken
        aSize = GetSizePixel();

        Size aParentSize = GetParent()->GetOutputSizePixel();
        aPos.X() += ( aParentSize.Width() - aSize.Width() ) / 2;
        aPos.Y() += ( aParentSize.Height() - aSize.Height() ) / 2;
    }

    Point aPoint;
    Rectangle aRect = GetDesktopRectPixel();
    aPoint.X() = aRect.Right() - aSize.Width();
    aPoint.Y() = aRect.Bottom() - aSize.Height();

    aPoint = OutputToScreenPixel( aPoint );

    if ( aPos.X() > aPoint.X() )
        aPos.X() = aPoint.X() ;
    if ( aPos.Y() > aPoint.Y() )
        aPos.Y() = aPoint.Y();

    if ( aPos.X() < 0 ) aPos.X() = 0;
    if ( aPos.Y() < 0 ) aPos.Y() = 0;

    SetPosPixel( aPos );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwFldDlg::PageCreated( USHORT nId, SfxTabPage &rPage )
{
/*  switch( nId )
    {
        case TP_CHAR_DB:
//          ((SvxCharExtPage&)rPage).DisableControls(DISABLE_CASEMAP);
            break;
    }*/
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SfxItemSet* SwFldDlg::CreateInputItemSet( USHORT nId )
{
    return 0;
}

/*--------------------------------------------------------------------
     Beschreibung: Einfuegen von neuen Feldern anstossen
 --------------------------------------------------------------------*/

IMPL_LINK( SwFldDlg, OKHdl, Button *, pBtn )
{
    if (GetOKButton().IsEnabled())
    {
        SfxTabPage* pPage = GetTabPage(GetCurPageId());
        pPage->FillItemSet(*(SfxItemSet*)0);

        GetOKButton().GrabFocus();  // Wegen InputField-Dlg
    }

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung: Nach Dok-Wechsel Dialog neu initialisieren
 --------------------------------------------------------------------*/

void SwFldDlg::ReInitDlg()
{
    SwDocShell* pDocSh = (SwDocShell*)SfxObjectShell::Current();
    BOOL bNewMode = (::GetHtmlMode(pDocSh) & HTMLMODE_ON) != 0;

    if (bNewMode != bHtmlMode)
    {
        SfxViewFrame::Current()->GetDispatcher()->
            Execute(FN_INSERT_FIELD, SFX_CALLMODE_ASYNCHRON|SFX_CALLMODE_RECORD);
        Close();
    }

    const SwWrtShell& rSh = ::GetActiveView()->GetWrtShell();
    GetOKButton().Enable( !rSh.IsReadOnlyAvailable() ||
                          !rSh.HasReadonlySel() );

    ReInitTabPage(TP_FLD_DOK);
    ReInitTabPage(TP_FLD_VAR);
    ReInitTabPage(TP_FLD_DOKINF);

    if (!bHtmlMode)
    {
        ReInitTabPage(TP_FLD_REF);
        ReInitTabPage(TP_FLD_FUNC);
        ReInitTabPage(TP_FLD_DB);
    }

    pChildWin->SetOldDocShell(pDocSh);
}

/*--------------------------------------------------------------------
    Beschreibung: Nach Dok-Wechsel TabPage neu initialisieren
 --------------------------------------------------------------------*/

void SwFldDlg::ReInitTabPage(USHORT nPageId)
{
    SwFldPage* pPage = (SwFldPage* )GetTabPage(nPageId);

    if (pPage)
        pPage->EditNewField();  // TabPage neu initialisieren
}

/*--------------------------------------------------------------------
    Beschreibung: Nach Aktivierung einige TabPages neu initialisieren
 --------------------------------------------------------------------*/

void SwFldDlg::Activate()
{
    BOOL bHtmlMode = (::GetHtmlMode((SwDocShell*)SfxObjectShell::Current()) & HTMLMODE_ON) != 0;

    const SwWrtShell& rSh = ::GetActiveView()->GetWrtShell();
    GetOKButton().Enable( !rSh.IsReadOnlyAvailable() ||
                          !rSh.HasReadonlySel() );

    ReInitTabPage(TP_FLD_VAR);

    if (!bHtmlMode)
        ReInitTabPage(TP_FLD_REF);

}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwFldDlg::EnableInsert(BOOL bEnable)
{
    if( bEnable )
    {
        const SwWrtShell& rSh = ::GetActiveView()->GetWrtShell();
        if( rSh.IsReadOnlyAvailable() && rSh.HasReadonlySel() )
            bEnable = FALSE;
    }
    GetOKButton().Enable(bEnable);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwFldDlg::InsertHdl()
{
    GetOKButton().Click();
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.26  2000/09/18 16:05:29  willem.vandorp
    OpenOffice header added.

    Revision 1.25  2000/09/07 15:59:24  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.24  2000/02/11 14:45:56  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.23  1999/01/20 13:16:52  JP
    Task #58677#: Crsr in Readonly Bereichen zulassen


      Rev 1.22   20 Jan 1999 14:16:52   JP
   Task #58677#: Crsr in Readonly Bereichen zulassen

      Rev 1.21   22 Oct 1998 12:20:42   OM
   #58157# Querverweis einfuegen

      Rev 1.20   21 Oct 1998 16:16:04   OM
   #58157# Querverweise einfuegen

      Rev 1.19   09 Jul 1998 09:52:58   JP
   EmptyStr benutzen

      Rev 1.18   31 Mar 1998 13:31:38   OM
   Korrekt abgleichen

      Rev 1.17   27 Mar 1998 14:14:16   OM
   ChildWindows im Modified-Hdl updaten

      Rev 1.16   18 Mar 1998 10:33:56   OM
   #48197# Focus restaurieren nach InputDlg

      Rev 1.15   10 Mar 1998 17:27:12   OM
   Korrekte Windowbits setzen

      Rev 1.14   03 Mar 1998 13:31:02   OM
   Im Html-Mode nicht alle TabPages anzeigen

      Rev 1.13   09 Jan 1998 16:57:18   OM
   Bei Dok-Wechsel updaten

      Rev 1.12   06 Jan 1998 18:13:36   OM
   Felbefehl-Dlg

      Rev 1.11   19 Dec 1997 18:25:00   OM
   Feldbefehl-bearbeiten Dlg

      Rev 1.10   16 Dec 1997 17:02:46   OM
   Feldbefehle bearbeiten

      Rev 1.9   12 Dec 1997 16:11:12   OM
   AutoUpdate bei FocusWechsel u.a.

      Rev 1.8   12 Dec 1997 10:49:38   OM
   ExchangeSupport implementiert

      Rev 1.7   09 Dec 1997 17:16:46   OM
   Kein alter Feldbefehl-Dialog mehr

      Rev 1.6   21 Nov 1997 17:19:42   OM
   Feldbefehl-Umstellung: DocInfo

      Rev 1.5   18 Nov 1997 10:33:10   OM
   Neuer Feldbefehldialog

      Rev 1.4   11 Nov 1997 10:03:40   OM
   Neuer Feldbefehl-Dialog

      Rev 1.3   04 Nov 1997 10:05:42   OM
   Neuer Felddialog

      Rev 1.2   30 Oct 1997 16:29:42   OM
   Feldbefehl-Umstellung

      Rev 1.1   30 Oct 1997 14:30:48   OM
   Feldbefehl-Umstellung

      Rev 1.0   28 Oct 1997 15:05:38   OM
   Initial revision.

------------------------------------------------------------------------*/
diff --git a/sw/source/ui/fldui/fldtdlg.hrc b/sw/source/ui/fldui/fldtdlg.hrc
new file mode 100644
index 0000000..524ed5c
--- /dev/null
+++ b/sw/source/ui/fldui/fldtdlg.hrc
@@ -0,0 +1,189 @@
/*************************************************************************
 *
 *  $RCSfile: fldtdlg.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:36 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _FLDTDLG_HRC
#define _FLDTDLG_HRC

// #include -----------------------------------------------------------------

// #define ------------------------------------------------------------------

#define RC_FLDTDLG_BEGIN    0

// Datenbankfeld-TabPage:
#define RC_TP_DB_START      (RC_FLDTDLG_BEGIN)
#define FT_DBTYPE           (RC_TP_DB_START + 1)
#define LB_DBTYPE           (RC_TP_DB_START + 2)
#define GB_DBFORMAT         (RC_TP_DB_START + 3)
#define FT_DBSELECTION      (RC_TP_DB_START + 4)
#define TLB_DBLIST          (RC_TP_DB_START + 5)
#define FT_DBCONDITION      (RC_TP_DB_START + 6)
#define FT_DBSETNUMBER      (RC_TP_DB_START + 7)
#define ED_DBCONDITION      (RC_TP_DB_START + 8)
#define ED_DBSETNUMBER      (RC_TP_DB_START + 9)
#define LB_DBFORMAT         (RC_TP_DB_START + 10)
#define LB_DBNUMFORMAT      (RC_TP_DB_START + 11)
#define RB_DBFORMAT         (RC_TP_DB_START + 12)
#define RB_DBOWNFORMAT      (RC_TP_DB_START + 13)
#define RC_TP_DB_END        (RC_TP_DB_START + 14)

// Dokumentinfo-TabPage:
#define RC_TP_DOCINF_START  (RC_TP_DB_END)
#define FT_DOKINFTYPE       (RC_TP_DOCINF_START + 1)
#define TLB_DOKINFTYPE      (RC_TP_DOCINF_START + 2)
#define FT_DOKINFSELECTION  (RC_TP_DOCINF_START + 3)
#define LB_DOKINFSELECTION  (RC_TP_DOCINF_START + 4)
#define FT_DOKINFFORMAT     (RC_TP_DOCINF_START + 5)
#define LB_DOKINFFORMAT     (RC_TP_DOCINF_START + 6)
#define CB_DOKINFFIXEDCONTENT   (RC_TP_DOCINF_START + 7)
#define BMP_DOKINFROOT_OPENED   (RC_TP_DOCINF_START + 8)
#define BMP_DOKINFROOT_CLOSED   (RC_TP_DOCINF_START + 9)
#define STR_DOKINF_INFO     (RC_TP_DOCINF_START + 10)
#define RC_TP_DOCINF_END    (RC_TP_DOCINF_START + 11)

// Variablen-TabPage:
#define RC_TP_VAR_START     (RC_TP_DOCINF_END)
#define FT_VARTYPE          (RC_TP_VAR_START + 1)
#define LB_VARTYPE          (RC_TP_VAR_START + 2)
#define FT_VARSELECTION     (RC_TP_VAR_START + 3)
#define LB_VARSELECTION     (RC_TP_VAR_START + 4)
#define FT_VARNAME          (RC_TP_VAR_START + 5)
#define ED_VARNAME          (RC_TP_VAR_START + 6)
#define FT_VARVALUE         (RC_TP_VAR_START + 7)
#define ED_VARVALUE         (RC_TP_VAR_START + 8)
#define FT_VARFORMAT        (RC_TP_VAR_START + 9)
#define LB_VARNUMFORMAT     (RC_TP_VAR_START + 10)
#define LB_VARFORMAT        (RC_TP_VAR_START + 11)
#define FT_VARCHAPTERHEADER (RC_TP_VAR_START + 12)
#define FT_VARCHAPTERLEVEL  (RC_TP_VAR_START + 13)
#define LB_VARCHAPTERLEVEL  (RC_TP_VAR_START + 14)
#define CB_VARINVISIBLE     (RC_TP_VAR_START + 15)
#define FT_VARSEPARATOR     (RC_TP_VAR_START + 16)
#define ED_VARSEPARATOR     (RC_TP_VAR_START + 17)
#define TBX_VARNEWDEL       (RC_TP_VAR_START + 18)
#define BT_VARAPPLY         (RC_TP_VAR_START + 19)
#define BT_VARDELETE        (RC_TP_VAR_START + 20)
#define RC_TP_VAR_END       (RC_TP_VAR_START + 21)

// Dokument-TabPage:
#define RC_TP_DOC_START     (RC_TP_VAR_END)
#define FT_DOKTYPE          (RC_TP_DOC_START + 1)
#define LB_DOKTYPE          (RC_TP_DOC_START + 2)
#define FT_DOKSELECTION     (RC_TP_DOC_START + 3)
#define LB_DOKSELECTION     (RC_TP_DOC_START + 4)
#define LB_DOKNUMFORMAT     (RC_TP_DOC_START + 5)
#define LB_DOKFORMAT        (RC_TP_DOC_START + 6)
#define FT_DOKFORMAT        (RC_TP_DOC_START + 7)
#define FT_DOKVALUE         (RC_TP_DOC_START + 8)
#define ED_DOKVALUE         (RC_TP_DOC_START + 9)
#define ED_DOKLEVEL         (RC_TP_DOC_START + 10)
#define ED_DOKDATEOFF       (RC_TP_DOC_START + 11)
#define CB_DOKFIXEDCONTENT  (RC_TP_DOC_START + 12)
#define STR_DOKDATEOFF      (RC_TP_DOC_START + 13)
#define STR_DOKTIMEOFF      (RC_TP_DOC_START + 14)
#define BMP_DOKROOT_OPENED  (RC_TP_DOC_START + 15)
#define BMP_DOKROOT_CLOSED  (RC_TP_DOC_START + 16)
#define RC_TP_DOC_END       (RC_TP_DOC_START + 17)

// Funktion-TabPage:
#define RC_TP_FUNC_START    (RC_TP_DOC_END)
#define FT_FUNCTYPE         (RC_TP_FUNC_START + 1)
#define LB_FUNCTYPE         (RC_TP_FUNC_START + 2)
#define LB_FUNCSELECTION    (RC_TP_FUNC_START + 3)
#define FT_FUNCSELECTION    (RC_TP_FUNC_START + 4)
#define FT_FUNCFORMAT       (RC_TP_FUNC_START + 5)
#define LB_FUNCFORMAT       (RC_TP_FUNC_START + 6)
#define FT_FUNCNAME         (RC_TP_FUNC_START + 7)
#define ED_FUNCNAME         (RC_TP_FUNC_START + 8)
#define FT_FUNCVALUE        (RC_TP_FUNC_START + 9)
#define ED_FUNCVALUE        (RC_TP_FUNC_START + 10)
#define FT_FUNCCOND1        (RC_TP_FUNC_START + 11)
#define ED_FUNCCOND1        (RC_TP_FUNC_START + 12)
#define FT_FUNCCOND2        (RC_TP_FUNC_START + 13)
#define ED_FUNCCOND2        (RC_TP_FUNC_START + 14)
#define BT_FUNCMACRO        (RC_TP_FUNC_START + 15)
#define RC_TP_FUNC_END      (RC_TP_FUNC_START + 16)

// Referenz-TabPage:
#define RC_TP_REF_START     (RC_TP_FUNC_END)
#define FT_REFTYPE          (RC_TP_REF_START + 1)
#define LB_REFTYPE          (RC_TP_REF_START + 2)
#define FT_REFSELECTION     (RC_TP_REF_START + 3)
#define LB_REFSELECTION     (RC_TP_REF_START + 4)
#define LB_REFFORMAT        (RC_TP_REF_START + 5)
#define FT_REFFORMAT        (RC_TP_REF_START + 6)
#define FT_REFNAME          (RC_TP_REF_START + 7)
#define ED_REFNAME          (RC_TP_REF_START + 8)
#define FT_REFVALUE         (RC_TP_REF_START + 9)
#define ED_REFVALUE         (RC_TP_REF_START + 10)
#define STR_REFBOOKMARK     (RC_TP_REF_START + 11)
#define STR_REFFOOTNOTE     (RC_TP_REF_START + 12)
#define STR_REFENDNOTE      (RC_TP_REF_START + 13)
#define RC_TP_REF_END       (RC_TP_REF_START + 14)

#define RC_TP_END           (RC_TP_REF_END)

// Strings ------------------------------------------------------------------

#define STR_FLD_INSERT          (RC_TP_END + 1)
#define STR_FLD_CLOSE           (RC_TP_END + 2)

#endif
diff --git a/sw/source/ui/fldui/fldtdlg.src b/sw/source/ui/fldui/fldtdlg.src
new file mode 100644
index 0000000..1185886
--- /dev/null
+++ b/sw/source/ui/fldui/fldtdlg.src
@@ -0,0 +1,306 @@
/*************************************************************************
 *
 *  $RCSfile: fldtdlg.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:37 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "globals.hrc"
#include "fldui.hrc"
#include "fldtdlg.hrc"
#include "helpid.h"
TabDialog DLG_FLD_INSERT
{
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Text = "Feldbefehle" ;
    Text [ ENGLISH ] = "Fields" ;
    Moveable = TRUE ;
    Closeable = TRUE ;
    TabControl 1
    {
        OutputSize = TRUE ;
        PageList =
        {
            PageItem
            {
                Identifier = TP_FLD_DOK ;
                Text = "Dokument" ;
                Text [ ENGLISH ] = "Document" ;
                PageResID = TP_FLD_DOK ;
                Text [ english_us ] = "Document" ;
                Text [ portuguese_brazilian ] = "Dokument" ;
                Text [ swedish ] = "Dokument" ;
                Text [ danish ] = "Dokument" ;
                Text [ italian ] = "Documento" ;
                Text [ spanish ] = "Documento" ;
                Text [ french ] = "Document" ;
                Text [ dutch ] = "Document" ;
                Text [ portuguese ] = "Documento" ;
                Text[ chinese_simplified ] = "Îĵµ";
                Text[ russian ] = "Äîêóìåíò";
                Text[ polish ] = "Dokument";
                Text[ japanese ] = "•¶‘";
                Text[ chinese_traditional ] = "¤å¥ó";
                Text[ arabic ] = "ÇáãÓÊäÏ";
                Text[ greek ] = "¸ããñáöï";
                Text[ korean ] = "¹®¼­";
                Text[ turkish ] = "Belge";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_FLD_REF ;
                Text = "Referenzen" ;
                Text [ ENGLISH ] = "References" ;
                PageResID = TP_FLD_REF ;
                Text [ english_us ] = "References" ;
                Text [ portuguese_brazilian ] = "Referenzen" ;
                Text [ swedish ] = "Referenser" ;
                Text [ danish ] = "Referencer" ;
                Text [ italian ] = "Riferimenti" ;
                Text [ spanish ] = "Referencias" ;
                Text [ french ] = "Références" ;
                Text [ dutch ] = "Verwijzingen" ;
                Text [ portuguese ] = "Referências" ;
                Text[ chinese_simplified ] = "ÒýÓÃ";
                Text[ russian ] = "Ññûëêè";
                Text[ polish ] = "Odwo³ania";
                Text[ japanese ] = "ŽQÆ";
                Text[ chinese_traditional ] = "°Ñ·Ó";
                Text[ arabic ] = "ãÑÇÌÚ";
                Text[ greek ] = "ÁíáöïñÝò";
                Text[ korean ] = "ÂüÁ¶";
                Text[ turkish ] = "Referanslar";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_FLD_FUNC ;
                Text = "Funktionen" ;
                Text [ ENGLISH ] = "Functions" ;
                PageResID = TP_FLD_FUNC ;
                Text [ english_us ] = "Functions" ;
                Text [ portuguese_brazilian ] = "Funktionen" ;
                Text [ swedish ] = "Funktioner" ;
                Text [ danish ] = "Funktioner" ;
                Text [ italian ] = "Funzioni" ;
                Text [ spanish ] = "Funciones" ;
                Text [ french ] = "Fonctions" ;
                Text [ dutch ] = "Functies" ;
                Text [ portuguese ] = "Funções" ;
                Text[ chinese_simplified ] = "¹¦ÄÜ";
                Text[ russian ] = "Ôóíêöèè";
                Text[ polish ] = "Funkcje";
                Text[ japanese ] = "‹@”\\";
                Text[ chinese_traditional ] = "¥\\¯à";
                Text[ arabic ] = "ãåÇã";
                Text[ greek ] = "Ëåéôïõñãßåò";
                Text[ korean ] = "±â´É";
                Text[ turkish ] = "Ýþlevler";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_FLD_DOKINF ;
                Text = "Dokumentinfo" ;
                Text [ ENGLISH ] = "Document information" ;
                PageResID = TP_FLD_DOKINF ;
                Text [ english_us ] = "DocInformation" ;
                Text [ portuguese_brazilian ] = "Dokumentinfo" ;
                Text [ swedish ] = "Dokumentinfo" ;
                Text [ danish ] = "Dokumentinfo" ;
                Text [ italian ] = "Info documento" ;
                Text [ spanish ] = "Información del documento" ;
                Text [ french ] = "Info document" ;
                Text [ dutch ] = "Documentinfo" ;
                Text [ portuguese ] = "Info. sobre documento" ;
                Text[ chinese_simplified ] = "ÎĵµÐÅÏ¢";
                Text[ russian ] = "Ñâåäåíèÿ î äîêóìåíòå";
                Text[ polish ] = "Informacje o dokumencie";
                Text[ japanese ] = "ÄÞ·­ÒÝÄ ²Ý̫Ұ¼®Ý";
                Text[ chinese_traditional ] = "¤å¥ó¸ê°T";
                Text[ arabic ] = "ãÚáæãÇÊ ÇáãÓÊäÏ";
                Text[ greek ] = "Ðëçñïöïñßåò åããñÜöïõ";
                Text[ korean ] = "µî·ÏÁ¤º¸";
                Text[ turkish ] = "Belge bilgileri";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_FLD_VAR ;
                Text = "Variablen" ;
                Text [ ENGLISH ] = "Variables" ;
                PageResID = TP_FLD_VAR ;
                Text [ english_us ] = "Variables" ;
                Text [ portuguese_brazilian ] = "Variablen" ;
                Text [ swedish ] = "Variabler" ;
                Text [ danish ] = "Variabler" ;
                Text [ italian ] = "Variabili" ;
                Text [ spanish ] = "Variables" ;
                Text [ french ] = "Variables" ;
                Text [ dutch ] = "Variabelen" ;
                Text [ portuguese ] = "Variáveis" ;
                Text[ chinese_simplified ] = "±äÁ¿";
                Text[ russian ] = "Ïåðåìåííûå";
                Text[ polish ] = "Zmienne";
                Text[ japanese ] = "•ϐ”";
                Text[ chinese_traditional ] = "Åܶq";
                Text[ arabic ] = "ãÊÛíÑÇÊ";
                Text[ greek ] = "ÌåôáâëçôÝò";
                Text[ korean ] = "º¯¼ö";
                Text[ turkish ] = "Deðiþkenler";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_FLD_DB ;
                Text = "Datenbank" ;
                Text [ ENGLISH ] = "Database" ;
                PageResID = TP_FLD_DB ;
                Text [ english_us ] = "Database" ;
                Text [ portuguese_brazilian ] = "Datenbank" ;
                Text [ swedish ] = "Databas" ;
                Text [ danish ] = "Database" ;
                Text [ italian ] = "Database" ;
                Text [ spanish ] = "Base de datos" ;
                Text [ french ] = "Base de données" ;
                Text [ dutch ] = "Database" ;
                Text [ portuguese ] = "Base de dados" ;
                Text[ chinese_simplified ] = "Êý¾Ý¿â";
                Text[ russian ] = "Áàçà äàííûõ";
                Text[ polish ] = "Baza danych";
                Text[ japanese ] = "ÃÞ°ÀÍÞ°½";
                Text[ chinese_traditional ] = "¸ê®Æ®w";
                Text[ arabic ] = "ÞÇÚÏÉ ÇáÈíÇäÇÊ";
                Text[ greek ] = "ÂÜóç äåäïìÝíùí";
                Text[ korean ] = "µ¥ÀÌÅͺ£À̽º";
                Text[ turkish ] = "Veritabaný";
                Text[ language_user1 ] = " ";
            };
        };
    };
    String STR_FLD_INSERT
    {
        Text = "~Einfügen" ;
        Text [ ENGLISH ] = "~Insert" ;
        Text [ norwegian ] = "~Insert" ;
        Text [ italian ] = "~Inserisci" ;
        Text [ portuguese_brazilian ] = "~Inserir" ;
        Text [ portuguese ] = "~Inserir" ;
        Text [ finnish ] = "~Lisää" ;
        Text [ danish ] = "~Indsæt" ;
        Text [ french ] = "~Insérer" ;
        Text [ swedish ] = "~Infoga" ;
        Text [ dutch ] = "~Invoegen" ;
        Text [ spanish ] = "~Insertar" ;
        Text [ english_us ] = "~Insert" ;
        Text[ chinese_simplified ] = "²åÈë(~I)";
        Text[ russian ] = "Âñòàâêà";
        Text[ polish ] = "Wstaw";
        Text[ japanese ] = "‘}“ü(~I)";
        Text[ chinese_traditional ] = "´¡¤J(~I)";
        Text[ arabic ] = "ÅÏÑÇÌ";
        Text[ greek ] = "ÅéóáãùãÞ";
        Text[ korean ] = "»ðÀÔ(~I)";
        Text[ turkish ] = "~Ekle";
        Text[ language_user1 ] = " ";
    };
    String STR_FLD_CLOSE
    {
        Text = "~Schließen" ;
        Text [ ENGLISH ] = "C~lose" ;
        Text [ english_us ] = "~Close" ;
        Text [ italian ] = "~Chiudi" ;
        Text [ spanish ] = "~Cerrar" ;
        Text [ french ] = "~Fermer" ;
        Text [ dutch ] = "~Sluiten" ;
        Text [ swedish ] = "~Stäng" ;
        Text [ danish ] = "Luk" ;
        Text [ portuguese_brazilian ] = "~Schließen" ;
        Text [ portuguese ] = "~Sair" ;
        Text[ chinese_simplified ] = "¹Ø±Õ(~C)";
        Text[ russian ] = "Çàêðûòü";
        Text[ polish ] = "Zamknij";
        Text[ japanese ] = "•‚¶‚é(~C)";
        Text[ chinese_traditional ] = "Ãö³¬(~C)";
        Text[ arabic ] = "ÅÛáÇÞ";
        Text[ greek ] = "Êëåßóéìï";
        Text[ korean ] = "´Ý±â(~C)";
        Text[ turkish ] = "~Çýkýþ";
        Text[ language_user1 ] = " ";
    };
    Text [ english_us ] = "Fields" ;
    Text [ portuguese_brazilian ] = "Feldbefehle" ;
    Text [ swedish ] = "Fältkommandon" ;
    Text [ danish ] = "Felter" ;
    Text [ italian ] = "Comandi di campo" ;
    Text [ spanish ] = "Comandos de campo" ;
    Text [ french ] = "Instructions de champ" ;
    Text [ dutch ] = "Veldopdracht" ;
    Text [ portuguese ] = "Campos" ;
    Text[ chinese_simplified ] = "×Ö¶ÎÖ¸Áî";
    Text[ russian ] = "Ïîëå";
    Text[ polish ] = "Pola";
    Text[ japanese ] = "̨°ÙÄÞ";
    Text[ chinese_traditional ] = "Äæ¦ì«ü¥O";
    Text[ arabic ] = "ÍÞæá";
    Text[ greek ] = "ÅíôïëÝò ðåäßùí";
    Text[ korean ] = "Çʵå";
    Text[ turkish ] = "Alan öðeleri";
    Text[ language_user1 ] = " ";
};
diff --git a/sw/source/ui/fldui/fldui.src b/sw/source/ui/fldui/fldui.src
new file mode 100644
index 0000000..c91f5ce
--- /dev/null
+++ b/sw/source/ui/fldui/fldui.src
@@ -0,0 +1,3383 @@
/*************************************************************************
 *
 *  $RCSfile: fldui.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:37 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#define _FLDUI_SRC
#include "fldui.hrc"
#include "helpid.h"

/*--------------------------------------------------------------------
    Beschreibung: Strings fuer die Types
 --------------------------------------------------------------------*/
String STR_FLD_EDIT_DLG
{
    Text = "Feldbefehl bearbeiten" ;
    Text [ ENGLISH ] = "Edit Field" ;
    Text [ norwegian ] = "Edit Field" ;
    Text [ italian ] = "Modifica comando di campo" ;
    Text [ portuguese_brazilian ] = "Editar Campo" ;
    Text [ portuguese ] = "Editar campos" ;
    Text [ finnish ] = "Muokkaa kenttää" ;
    Text [ danish ] = "Rediger felt" ;
    Text [ french ] = "Édition d'une instruction de champ" ;
    Text [ swedish ] = "Redigera fältkommando" ;
    Text [ dutch ] = "Veldopdracht bewerken" ;
    Text [ spanish ] = "Editar campos" ;
    Text [ english_us ] = "Edit Fields" ;
    Text[ chinese_simplified ] = "±à¼­×Ö¶ÎÖ¸Áî";
    Text[ russian ] = "Ïðàâêà ïîëÿ";
    Text[ polish ] = "Edytuj pole";
    Text[ japanese ] = "̨°ÙÄނ̕ҏW";
    Text[ chinese_traditional ] = "½s¿èÄæ¦ì«ü¥O";
    Text[ arabic ] = "ÊÍÑíÑ ÇáÍÞá";
    Text[ greek ] = "Åðåîåñãáóßá åíôïëÞò ðåäßïõ";
    Text[ korean ] = "ÆÄÀÏ ÆíÁý";
    Text[ turkish ] = "Alan öðesi düzenle";
    Text[ language_user1 ] = " ";
};
/*--------------------------------------------------------------------
    Beschreibung: Strings fuer die Types
 --------------------------------------------------------------------*/
 //
 // Bereich Dokument
 //
String STR_DATEFLD
{
    TEXT = "Datum" ;
    TEXT [ English ] = "Date" ;
    TEXT [ norwegian ] = "Date" ;
    TEXT [ italian ] = "Data" ;
    TEXT [ portuguese_brazilian ] = "Data" ;
    TEXT [ portuguese ] = "Data" ;
    TEXT [ finnish ] = "Päiväys" ;
    TEXT [ danish ] = "Dato" ;
    TEXT [ french ] = "Date" ;
    TEXT [ swedish ] = "Datum" ;
    TEXT [ dutch ] = "Datum" ;
    TEXT [ spanish ] = "Fecha" ;
    TEXT [ english_us ] = "Date" ;
    TEXT[ chinese_simplified ] = "ÈÕÆÚ";
    TEXT[ russian ] = "Äàòà";
    TEXT[ polish ] = "Data";
    TEXT[ japanese ] = "“ú•t";
    TEXT[ chinese_traditional ] = "¤é´Á";
    TEXT[ arabic ] = "ÇáÊÇÑíÎ";
    TEXT[ greek ] = "Çìåñïìçíßá";
    TEXT[ korean ] = "ÀÏÀÚ";
    TEXT[ turkish ] = "Tarih";
    TEXT[ language_user1 ] = " ";
};
String STR_TIMEFLD
{
    TEXT = "Uhrzeit" ;
    TEXT [ English ] = "Time" ;
    TEXT [ norwegian ] = "Time" ;
    TEXT [ italian ] = "Orario" ;
    TEXT [ portuguese_brazilian ] = "Hora" ;
    TEXT [ portuguese ] = "Hora" ;
    TEXT [ finnish ] = "Aika" ;
    TEXT [ danish ] = "Klokkeslæt" ;
    TEXT [ french ] = "Heure" ;
    TEXT [ swedish ] = "Klockslag" ;
    TEXT [ dutch ] = "Tijd" ;
    TEXT [ spanish ] = "Hora" ;
    TEXT [ english_us ] = "Time" ;
    TEXT[ chinese_simplified ] = "ʱ¼ä";
    TEXT[ russian ] = "Âðåìÿ";
    TEXT[ polish ] = "Godzina";
    TEXT[ japanese ] = "Žž";
    TEXT[ chinese_traditional ] = "®É¶¡";
    TEXT[ arabic ] = "ÇáæÞÊ";
    TEXT[ greek ] = "¿ñá";
    TEXT[ korean ] = "½Ã°£";
    TEXT[ turkish ] = "Saat";
    TEXT[ language_user1 ] = " ";
};
String STR_FILENAMEFLD
{
    TEXT = "Dateiname" ;
    TEXT [ English ] = "Filename" ;
    TEXT [ norwegian ] = "Filename" ;
    TEXT [ italian ] = "Nome file" ;
    TEXT [ portuguese_brazilian ] = "Nome do Arquivo" ;
    TEXT [ portuguese ] = "Nome do ficheiro" ;
    TEXT [ finnish ] = "Tiedostonimi" ;
    TEXT [ danish ] = "Filnavn" ;
    TEXT [ french ] = "Nom de fichier" ;
    TEXT [ swedish ] = "Filnamn" ;
    TEXT [ dutch ] = "Bestandsnaam" ;
    TEXT [ spanish ] = "Nombre del archivo" ;
    TEXT [ english_us ] = "File name" ;
    TEXT[ chinese_simplified ] = "ÎļþÃû";
    TEXT[ russian ] = "Èìÿ ôàéëà";
    TEXT[ polish ] = "Nazwa pliku";
    TEXT[ japanese ] = "̧²Ù–¼";
    TEXT[ chinese_traditional ] = "ÀɮצW";
    TEXT[ arabic ] = "ÇÓã ÇáãáÝ";
    TEXT[ greek ] = "¼íïìá áñ÷åßïõ";
    TEXT[ korean ] = "ÆÄÀÏ À̸§";
    TEXT[ turkish ] = "Dosya adý";
    TEXT[ language_user1 ] = " ";
};
String STR_DBNAMEFLD
{
    TEXT = "Datenbankname" ;
    TEXT [ English ] = "Database name" ;
    TEXT [ norwegian ] = "Database name" ;
    TEXT [ italian ] = "Nome database" ;
    TEXT [ portuguese_brazilian ] = "Nome da base de dados" ;
    TEXT [ portuguese ] = "Nome da base de dados" ;
    TEXT [ finnish ] = "Tietokannan nimi" ;
    TEXT [ danish ] = "Databasenavn" ;
    TEXT [ french ] = "Nom de la base de données" ;
    TEXT [ swedish ] = "Databasnamn" ;
    TEXT [ dutch ] = "Naam database" ;
    TEXT [ spanish ] = "Nombre de base de datos" ;
    TEXT [ english_us ] = "Database Name" ;
    TEXT[ chinese_simplified ] = "Êý¾Ý¿âÃû³Æ";
    TEXT[ russian ] = "Èìÿ áàçû äàííûõ";
    TEXT[ polish ] = "Nazwa bazy danych";
    TEXT[ japanese ] = "ÃÞ°ÀÍÞ°½–¼";
    TEXT[ chinese_traditional ] = "¸ê®Æ®w¦WºÙ";
    TEXT[ arabic ] = "ÇÓã ÞÇÚÏÉ ÇáÈíÇäÇÊ";
    TEXT[ greek ] = "¼íïìá âÜóçò äåäïìÝíùí";
    TEXT[ korean ] = "µ¥ÀÌÅͺ£À̽º À̸§";
    TEXT[ turkish ] = "Veritabaný adý";
    TEXT[ language_user1 ] = " ";
};
String STR_CHAPTERFLD
{
    TEXT = "Kapitel" ;
    TEXT [ English ] = "Chapter" ;
    TEXT [ norwegian ] = "Chapter" ;
    TEXT [ italian ] = "Capitolo" ;
    TEXT [ portuguese_brazilian ] = "Capítulo" ;
    TEXT [ portuguese ] = "Capítulo" ;
    TEXT [ finnish ] = "Luku" ;
    TEXT [ danish ] = "Kapitel" ;
    TEXT [ french ] = "Chapitre" ;
    TEXT [ swedish ] = "Kapitel" ;
    TEXT [ dutch ] = "Hoofdstuk" ;
    TEXT [ spanish ] = "Capítulo" ;
    TEXT [ english_us ] = "Chapter" ;
    TEXT[ chinese_simplified ] = "ÕÂ";
    TEXT[ russian ] = "Ãëàâà";
    TEXT[ polish ] = "Rozdzia³";
    TEXT[ japanese ] = "Í";
    TEXT[ language_user1 ] = " ";
    TEXT[ chinese_traditional ] = "³¹";
    TEXT[ arabic ] = "ÇáÝÕá";
    TEXT[ greek ] = "ÊåöÜëáéï";
    TEXT[ korean ] = "Àå";
    TEXT[ turkish ] = "Bölüm";
};
String STR_PAGENUMBERFLD
{
    TEXT = "Seitennummer" ;
    TEXT [ English ] = "Page number" ;
    TEXT [ norwegian ] = "Sidenummer" ;
    TEXT [ italian ] = "Numero pagina" ;
    TEXT [ portuguese_brazilian ] = "Número de página" ;
    TEXT [ portuguese ] = "Número de página" ;
    TEXT [ finnish ] = "Sivunumero" ;
    TEXT [ danish ] = "Sidetal" ;
    TEXT [ french ] = "Numéro de page" ;
    TEXT [ swedish ] = "Sidnummer" ;
    TEXT [ dutch ] = "Paginanummer" ;
    TEXT [ spanish ] = "Número de página" ;
    TEXT [ english_us ] = "Page numbers" ;
    TEXT[ chinese_simplified ] = "Ò³Âë";
    TEXT[ russian ] = "Íîìåð ñòðàíèöû";
    TEXT[ polish ] = "Numer strony";
    TEXT[ japanese ] = "Íß°¼Þ”ԍ†";
    TEXT[ chinese_traditional ] = "­¶½X";
    TEXT[ arabic ] = "ÑÞã ÇáÕÝÍÉ";
    TEXT[ greek ] = "Áñéèìüò óåëßäáò";
    TEXT[ korean ] = "ÆäÀÌÁö ¹øÈ£";
    TEXT[ turkish ] = "Sayfa numarasý";
    TEXT[ language_user1 ] = " ";
};
String STR_DOCSTATFLD
{
    TEXT = "Statistik" ;
    TEXT [ English ] = "Statistics" ;
    TEXT [ norwegian ] = "Statistics" ;
    TEXT [ italian ] = "Statistiche" ;
    TEXT [ portuguese_brazilian ] = "Estatística" ;
    TEXT [ portuguese ] = "Estatística" ;
    TEXT [ finnish ] = "Tilasto" ;
    TEXT [ danish ] = "Statistik" ;
    TEXT [ french ] = "Statistique" ;
    TEXT [ swedish ] = "Statistik" ;
    TEXT [ dutch ] = "Statistiek" ;
    TEXT [ spanish ] = "Estadística" ;
    TEXT [ english_us ] = "Statistics" ;
    TEXT[ chinese_simplified ] = "ͳ¼Æ";
    TEXT[ russian ] = "Ñòàòèñòèêà";
    TEXT[ polish ] = "Statystyka";
    TEXT[ japanese ] = "“Œv";
    TEXT[ chinese_traditional ] = "²Î­p";
    TEXT[ arabic ] = "ÅÍÕÇÆíÇÊ";
    TEXT[ greek ] = "ÓôáôéóôéêÜ";
    TEXT[ korean ] = "Åë°è";
    TEXT[ turkish ] = "Ýstatistik";
    TEXT[ language_user1 ] = " ";
};
String STR_AUTHORFLD
{
    TEXT = "Benutzer" ;
    TEXT [ English ] = "User" ;
    Text [ portuguese ] = "Autor" ;
    Text [ english_us ] = "Author" ;
    Text [ portuguese_brazilian ] = "Autor" ;
    Text [ swedish ] = "Användare" ;
    Text [ danish ] = "Bruger" ;
    Text [ italian ] = "Autore" ;
    Text [ spanish ] = "Usuario" ;
    Text [ french ] = "Utilisateur" ;
    Text [ dutch ] = "Gebruiker" ;
    Text[ chinese_simplified ] = "ʹÓÃÕß";
    Text[ russian ] = "Ïîëüçîâàòåëü";
    Text[ polish ] = "U¿ytkownik";
    Text[ japanese ] = "Õ°»Þ°";
    Text[ chinese_traditional ] = "¨Ï¥ÎªÌ";
    Text[ arabic ] = "ÇáãÓÊÎÏã";
    Text[ greek ] = "×ñÞóôçò";
    Text[ korean ] = "ÀÛ¼ºÀÚ";
    Text[ turkish ] = "Yazan";
    Text[ language_user1 ] = " ";
};
String STR_TEMPLNAMEFLD
{
    TEXT = "Dokumentvorlage" ;
    TEXT [ English ] = "Template" ;
    TEXT [ norwegian ] = "Mal" ;
    TEXT [ italian ] = "Modello" ;
    TEXT [ portuguese_brazilian ] = "Modelo" ;
    TEXT [ portuguese ] = "Modelo de documento" ;
    TEXT [ finnish ] = "Mallipohja" ;
    TEXT [ danish ] = "Dokumentskabelon" ;
    TEXT [ french ] = "Modèle de document" ;
    TEXT [ swedish ] = "Dokumentmall" ;
    TEXT [ dutch ] = "Sjabloon" ;
    TEXT [ spanish ] = "Plantilla" ;
    TEXT [ english_us ] = "Templates" ;
    TEXT[ chinese_simplified ] = "ÎĵµÑùʽ";
    TEXT[ russian ] = "Øàáëîí äîêóìåíòà";
    TEXT[ polish ] = "Szablon dokumentu";
    TEXT[ japanese ] = "ÄÞ·­ÒÝĂÌÃÝÌßÚ°Ä";
    TEXT[ chinese_traditional ] = "¤å¥ó¼Ë¦¡";
    TEXT[ arabic ] = "ÞÇáÈ ãÓÊäÏ";
    TEXT[ greek ] = "Ðñüôõðï åããñÜöïõ";
    TEXT[ korean ] = "¹®¼­ ÅÛÇø®Æ®";
    TEXT[ turkish ] = "Belge þablonu";
    TEXT[ language_user1 ] = " ";
};
String STR_EXTUSERFLD
{
    TEXT = "Absender" ;
    TEXT [ English ] = "Sender" ;
    TEXT [ norwegian ] = "Sender" ;
    TEXT [ italian ] = "Mittente" ;
    TEXT [ portuguese_brazilian ] = "Remetente" ;
    TEXT [ portuguese ] = "Remetente" ;
    TEXT [ finnish ] = "Lähettäjä" ;
    TEXT [ danish ] = "Afsender" ;
    TEXT [ french ] = "Expéditeur" ;
    TEXT [ swedish ] = "Avsändare" ;
    TEXT [ dutch ] = "Afzender" ;
    TEXT [ spanish ] = "Remitente" ;
    TEXT [ english_us ] = "Sender" ;
    TEXT[ chinese_simplified ] = "·¢¼þÈË";
    TEXT[ russian ] = "Îòïðàâèòåëü";
    TEXT[ polish ] = "Nadawca";
    TEXT[ japanese ] = "·ol";
    TEXT[ chinese_traditional ] = "±H¥óªÌ";
    TEXT[ arabic ] = "ÇáãÑÓá";
    TEXT[ greek ] = "ÁðïóôïëÝáò";
    TEXT[ korean ] = "º¸³½ »ç¶÷";
    TEXT[ turkish ] = "Gönderen";
    TEXT[ language_user1 ] = " ";
};
 //
 // Bereich Funktionen
 //
String STR_SETFLD
{
    TEXT = "Variable setzen" ;
    TEXT [ English ] = "Set variable" ;
    TEXT [ norwegian ] = "Set variable" ;
    TEXT [ italian ] = "Imposta variabile" ;
    TEXT [ portuguese_brazilian ] = "Definir variável" ;
    TEXT [ portuguese ] = "Definir variável" ;
    TEXT [ finnish ] = "Määritä muuttuja" ;
    TEXT [ danish ] = "Definer variabel" ;
    TEXT [ french ] = "Définir une variable" ;
    TEXT [ swedish ] = "Sätt variabel" ;
    TEXT [ dutch ] = "Variabele definiëren" ;
    TEXT [ spanish ] = "Establecer variable" ;
    TEXT [ english_us ] = "Set variable" ;
    TEXT[ chinese_simplified ] = "É趨±äÁ¿";
    TEXT[ russian ] = "Óñòàíîâèòü ïåðåìåííûå";
    TEXT[ polish ] = "OsadŸ zmienn¹";
    TEXT[ japanese ] = "•ϐ”‚̐ݒè";
    TEXT[ chinese_traditional ] = "³]©wÅܶq";
    TEXT[ arabic ] = "ÊÚííä ãÊÛíÑÉ";
    TEXT[ greek ] = "Êáèïñéóìüò ìåôáâëçôÞò";
    TEXT[ korean ] = "º¯¼ö ¼³Á¤";
    TEXT[ turkish ] = "Deðiþken tanýmla";
    TEXT[ language_user1 ] = " ";
};
String STR_GETFLD
{
    TEXT = "Variable anzeigen" ;
    TEXT [ English ] = "Show variable" ;
    TEXT [ norwegian ] = "Show variable" ;
    TEXT [ italian ] = "Mostra variabile" ;
    TEXT [ portuguese_brazilian ] = "Mostrar variável" ;
    TEXT [ portuguese ] = "Mostrar variável" ;
    TEXT [ finnish ] = "Näytä muuttuja" ;
    TEXT [ danish ] = "Vis variabel" ;
    TEXT [ french ] = "Afficher variables" ;
    TEXT [ swedish ] = "Visa variabel" ;
    TEXT [ dutch ] = "Variabele weergeven" ;
    TEXT [ spanish ] = "Mostrar variable" ;
    TEXT [ english_us ] = "Show variable" ;
    TEXT[ chinese_simplified ] = "ÏÔʾ±äÁ¿";
    TEXT[ russian ] = "Ïîêàçàòü ïåðåìåííûå";
    TEXT[ polish ] = "Poka¿ zmienn¹";
    TEXT[ japanese ] = "•ϐ”‚Ì•\\ަ";
    TEXT[ chinese_traditional ] = "Åã¥ÜÅܶq";
    TEXT[ arabic ] = "ÅÙåÇÑ ãÊÛíÑÉ";
    TEXT[ greek ] = "ÅìöÜíéóç ìåôáâëçôÞò";
    TEXT[ korean ] = "º¯¼ö º¸À̱â";
    TEXT[ turkish ] = "Deðiþken görüntüle";
    TEXT[ language_user1 ] = " ";
};
String STR_FORMELFLD
{
    TEXT = "Formel einfügen" ;
    TEXT [ English ] = "Insert equation" ;
    TEXT [ norwegian ] = "Insert equation" ;
    TEXT [ italian ] = "Inserisci formula" ;
    TEXT [ portuguese_brazilian ] = "Inserir equação" ;
    TEXT [ portuguese ] = "Inserir fórmula" ;
    TEXT [ finnish ] = "Lisää kaava" ;
    TEXT [ danish ] = "Indsæt formel" ;
    TEXT [ french ] = "Insérer une formule" ;
    TEXT [ swedish ] = "Infoga formel" ;
    TEXT [ dutch ] = "Formule invoegen" ;
    TEXT [ spanish ] = "Insertar fórmula" ;
    TEXT [ english_us ] = "Insert Formula" ;
    TEXT[ chinese_simplified ] = "²åÈ빫ʽ";
    TEXT[ russian ] = "Âñòàâêà ôîðìóëû";
    TEXT[ polish ] = "Wstaw formu³ê";
    TEXT[ japanese ] = "”Ž®‚Ì‘}“ü";
    TEXT[ chinese_traditional ] = "´¡¤J¤½¦¡";
    TEXT[ arabic ] = "ÅÏÑÇÌ ÕíÛÉ";
    TEXT[ greek ] = "ÅéóáãùãÞ ôýðïõ";
    TEXT[ korean ] = "¼ö½Ä »ðÀÔ";
    TEXT[ turkish ] = "Formül ekle";
    TEXT[ language_user1 ] = " ";
};
String STR_INPUTFLD
{
    TEXT = "Eingabefeld" ;
    TEXT [ English ] = "Input field" ;
    TEXT [ norwegian ] = "Input field" ;
    TEXT [ italian ] = "Campo di digitazione" ;
    TEXT [ portuguese_brazilian ] = "Campo de entrada" ;
    TEXT [ portuguese ] = "Campo de entrada" ;
    TEXT [ finnish ] = "Syöttökenttä" ;
    TEXT [ danish ] = "Inputfelt" ;
    TEXT [ french ] = "Champ de saisie" ;
    TEXT [ swedish ] = "Inmatningsfält" ;
    TEXT [ dutch ] = "Invoerveld" ;
    TEXT [ spanish ] = "Campo de entrada" ;
    TEXT [ english_us ] = "Input field" ;
    TEXT[ chinese_simplified ] = "ÊäÈëÀ¸";
    TEXT[ russian ] = "Ïîëå ââîäà";
    TEXT[ polish ] = "Pole wprowadzania";
    TEXT[ japanese ] = "“ü—Į́°ÙÄÞ";
    TEXT[ chinese_traditional ] = "Äæ¦ì";
    TEXT[ arabic ] = "ÍÞá ÅÏÎÇá";
    TEXT[ greek ] = "Ðåäßï åéóáãùãÞò";
    TEXT[ korean ] = "Çʵå ÀÔ·Â";
    TEXT[ turkish ] = "Giriþ alaný";
    TEXT[ language_user1 ] = " ";
};
String STR_SETINPUTFLD
{
    /* ### ACHTUNG: Neuer Text in Resource? Eingabefeld (Variable) : Eingabefeld (Varibale) */
    /* ### ACHTUNG: Neuer Text in Resource? Eingabefeld (Variable) : Eingabefeld (Varibale) */
    /* ### ACHTUNG: Neuer Text in Resource? Eingabefeld (Variable) : Eingabefeld (Varibale) */
    /* ### ACHTUNG: Neuer Text in Resource? Eingabefeld (Variable) : Eingabefeld (Varibale) */
    /* ### ACHTUNG: Neuer Text in Resource? Eingabefeld (Variable) : Eingabefeld (Varibale) */
    TEXT = "Eingabefeld (Variable)" ;
    TEXT [ English ] = "Input field (Variable)" ;
    Text [ english_us ] = "Input field (variable)" ;
    Text [ italian ] = "Campo di digitazione (variabile)" ;
    Text [ spanish ] = "Campo de entrada (variable)" ;
    Text [ french ] = "Champ de saisie (pour variables)" ;
    Text [ dutch ] = "Invoerveld (variabele)" ;
    Text [ swedish ] = "Inmatningsfält (variabel)" ;
    Text [ danish ] = "Inputfelt (variabel)" ;
    Text [ portuguese ] = "Campo de entrada (variável)" ;
    Text [ portuguese_brazilian ] = "Eingabefeld (Varibale)" ;
    Text[ chinese_simplified ] = "ÊäÈë×Ö¶ÎÇø(±äÊý)";
    Text[ russian ] = "Ïîëå ââîäà (èçìåíÿåìîå)";
    Text[ polish ] = "Pole wprowadzania (Zmienna)";
    Text[ japanese ] = "“ü—Į́°ÙÄÞ (•ϐ”)";
    Text[ chinese_traditional ] = "¿é¤JÄæ¦ì(ÅܼÆ)";
    Text[ arabic ] = "ÍÞá ÅÏÎÇá (ãÊÛíÑÉ)";
    Text[ greek ] = "Ðåäßï åéóáãùãÞò (ÌåôáâëçôÞ)";
    Text[ korean ] = "ÇÊµå »ðÀÔ(º¯¼ö)";
    Text[ turkish ] = "Giriþ alaný (deðiþken)";
    Text[ language_user1 ] = " ";
};
String STR_USRINPUTFLD
{
    TEXT = "Eingabefeld (Benutzer)" ;
    TEXT [ English ] = "Input field (User)" ;
    Text [ dutch ] = "Invoerveld (gebruiker)" ;
    Text [ english_us ] = "Input field (user)" ;
    Text [ italian ] = "Campo di digitazione (utente)" ;
    Text [ spanish ] = "Campo de entrada (Usuario)" ;
    Text [ french ] = "Champ de saisie (utilisateur)" ;
    Text [ swedish ] = "Inmatningsfält (användare)" ;
    Text [ danish ] = "Inputfelt (bruger)" ;
    Text [ portuguese ] = "Campo de entrada (utilizador)" ;
    Text [ portuguese_brazilian ] = "Eingabefeld (Benutzer)" ;
    Text[ chinese_simplified ] = "ÊäÈëÀ¸(ʹÓÃÕß)";
    Text[ russian ] = "Ïîëå ââîäà (ïîëüçîâàòåëü)";
    Text[ polish ] = "Pole wprowadzania (U¿ytkownik)";
    Text[ japanese ] = "“ü—Į́°ÙÄÞ (Õ°»Þ°)";
    Text[ chinese_traditional ] = "¿é¤JÄæ¦ì(¨Ï¥ÎªÌ)";
    Text[ arabic ] = "ÍÞá ÅÏÎÇá (ÇáãÓÊÎÏã)";
    Text[ greek ] = "Ðåäßï åéóáãùãÞò (×ñÞóôçò)";
    Text[ korean ] = "Çʵå ÀÔ·Â (»ç¿ëÀÚ)";
    Text[ turkish ] = "Giriþ alaný (Kullanýcý)";
    Text[ language_user1 ] = " ";
};
String STR_CONDTXTFLD
{
    TEXT = "Bedingter Text" ;
    TEXT [ English ] = "Conditional text" ;
    TEXT [ norwegian ] = "Conditional text" ;
    TEXT [ italian ] = "Testo condizionale" ;
    TEXT [ portuguese_brazilian ] = "Texto condicional" ;
    TEXT [ portuguese ] = "Texto condicional" ;
    TEXT [ finnish ] = "Ehdollinen teksti" ;
    TEXT [ danish ] = "Betinget tekst" ;
    TEXT [ french ] = "Texte conditionnel" ;
    TEXT [ swedish ] = "Villkorlig text" ;
    TEXT [ dutch ] = "Conditionele tekst" ;
    TEXT [ spanish ] = "Texto condicionado" ;
    TEXT [ english_us ] = "Conditional text" ;
    TEXT[ chinese_simplified ] = "ÓÐÌõ¼þµÄÎÄ×Ö";
    TEXT[ russian ] = "Óñëîâíûé òåêñò";
    TEXT[ polish ] = "Tekst warunkowy";
    TEXT[ japanese ] = "ðŒ•t‚«•¶Žš—ñ";
    TEXT[ chinese_traditional ] = "¦³±ø¥óªº¤å¦r";
    TEXT[ arabic ] = "äÕ ãÔÑæØ";
    TEXT[ greek ] = "Êåßìåíï õðü óõíèÞêåò";
    TEXT[ korean ] = "Á¶°ÇÀû ÅØ½ºÆ®";
    TEXT[ turkish ] = "Koþullu metin";
    TEXT[ language_user1 ] = " ";
};
String STR_DDEFLD
{
    TEXT = "DDE-Feld" ;
    TEXT [ English ] = "DDE link" ;
    TEXT [ norwegian ] = "DDE link" ;
    TEXT [ italian ] = "Campo DDE" ;
    TEXT [ portuguese_brazilian ] = "Ligação do DDE" ;
    TEXT [ portuguese ] = "Campo DDE" ;
    TEXT [ finnish ] = "DDE-linkki" ;
    TEXT [ danish ] = "DDE-felt" ;
    TEXT [ french ] = "Champ DDE" ;
    TEXT [ swedish ] = "DDE-fält" ;
    TEXT [ dutch ] = "DDE-koppeling" ;
    TEXT [ spanish ] = "Campo DDE" ;
    TEXT [ english_us ] = "DDE field" ;
    TEXT[ chinese_simplified ] = "DDE-ÇøÓò";
    TEXT[ russian ] = "Ïîëå DDE";
    TEXT[ polish ] = "Pole DDE";
    TEXT[ japanese ] = "DDʰÙÄÞ";
    TEXT[ chinese_traditional ] = "DDE-°Ï°ì";
    TEXT[ arabic ] = "ÍÞá DDE";
    TEXT[ greek ] = "Ðåäßï DDE";
    TEXT[ korean ] = "DDE Çʵå";
    TEXT[ turkish ] = "DDE alaný";
    TEXT[ language_user1 ] = " ";
};
String STR_MACROFLD
{
    TEXT = "Makro ausführen" ;
    TEXT [ English ] = "Execute macro" ;
    TEXT [ norwegian ] = "Execute macro" ;
    TEXT [ italian ] = "Esegui macro" ;
    TEXT [ portuguese_brazilian ] = "Executar macro" ;
    TEXT [ portuguese ] = "Executar macro" ;
    TEXT [ finnish ] = "Suorita makro" ;
    TEXT [ danish ] = "Udfør makro" ;
    TEXT [ french ] = "Exécuter la macro" ;
    TEXT [ swedish ] = "Utför makro" ;
    TEXT [ dutch ] = "Macro uitvoeren" ;
    TEXT [ spanish ] = "Ejecutar macro" ;
    TEXT [ english_us ] = "Execute macro" ;
    TEXT[ chinese_simplified ] = "Ö´Ðкê";
    TEXT[ russian ] = "Âûïîëíèòü ìàêðîñ";
    TEXT[ polish ] = "Wykonaj makro";
    TEXT[ japanese ] = "ϸۂ̎Às";
    TEXT[ chinese_traditional ] = "°õ¦æ¥¨¶°";
    TEXT[ arabic ] = "ÊäÝíÐ ãÇßÑæ";
    TEXT[ greek ] = "ÅêôÝëåóç ìáêñïåíôïëÞò";
    TEXT[ korean ] = "¸ÅÅ©·Î ½ÇÇà";
    TEXT[ turkish ] = "Makroyu çalýþtýr";
    TEXT[ language_user1 ] = " ";
};
String STR_SEQFLD
{
    TEXT = "Nummernkreis" ;
    TEXT [ English ] = "Sequence" ;
    TEXT [ norwegian ] = "Sequence" ;
    TEXT [ italian ] = "Sequenza" ;
    TEXT [ portuguese_brazilian ] = "Sequência" ;
    TEXT [ portuguese ] = "Sequência" ;
    TEXT [ finnish ] = "Sarjanumero" ;
    TEXT [ danish ] = "Sekvensnummererering" ;
    TEXT [ french ] = "Séquence" ;
    TEXT [ swedish ] = "Nummersekvens" ;
    TEXT [ dutch ] = "Nummerreeks" ;
    TEXT [ spanish ] = "Secuencia" ;
    TEXT [ english_us ] = "Number range" ;
    TEXT[ chinese_simplified ] = "±àºÅ˳Ðò";
    TEXT[ russian ] = "Ïîðÿäêîâûé íîìåð";
    TEXT[ polish ] = "Sekwencja";
    TEXT[ japanese ] = "˜A”Ô";
    TEXT[ chinese_traditional ] = "½s¸¹¶¶§Ç";
    TEXT[ arabic ] = "ÊÑÞíã ãÊÓáÓá";
    TEXT[ greek ] = "Êýêëïò áñéèìþí";
    TEXT[ korean ] = "¼ýÀÚ ¹üÀ§";
    TEXT[ turkish ] = "Numara aralýðý";
    TEXT[ language_user1 ] = " ";
};
String STR_SETREFPAGEFLD
{
    TEXT = "Seitenvariable setzen" ;
    TEXT [ English ] = "Set pagevariable" ;
    Text [ english_us ] = "Set page variable" ;
    Text [ italian ] = "Imposta variabile di pagina" ;
    Text [ spanish ] = "Determinar variable de página" ;
    Text [ french ] = "Variable de la page" ;
    Text [ dutch ] = "Paginavariabele definiëren" ;
    Text [ swedish ] = "Sätt sidvariabler" ;
    Text [ danish ] = "Definer sidevariabel" ;
    Text [ portuguese ] = "Definir variável de página" ;
    Text [ portuguese_brazilian ] = "Seitenvariable setzen" ;
    Text[ chinese_simplified ] = "Éè¶¨Ò³Ãæ±äÊý";
    Text[ russian ] = "Óñòàíîâèòü ïåðåìåííûå ñòðàíèö";
    Text[ polish ] = "OsadŸ zmienn¹ strony";
    Text[ japanese ] = "Íß°¼Þ•ϐ”‚̐ݒè";
    Text[ chinese_traditional ] = "³]©w­¶­±ÅܼÆ";
    Text[ arabic ] = "ÊÚííä ãÊÛíÑÉ ÕÝÍÉ";
    Text[ greek ] = "Êáèïñéóìüò ìåôáâëçôÞò óåëßäáò";
    Text[ korean ] = "ÆäÀÌÁö º¯¼ö ¼³Á¤";
    Text[ turkish ] = "Sayfa deðiþkeni tanýmla";
    Text[ language_user1 ] = " ";
};
String STR_GETREFPAGEFLD
{
    TEXT = "Seitenvariable anzeigen" ;
    TEXT [ English ] = "Show pagevariable" ;
    Text [ dutch ] = "Paginavariabele weergeven" ;
    Text [ english_us ] = "Show page variable" ;
    Text [ italian ] = "Mostra variabile di pagina" ;
    Text [ spanish ] = "Mostrar variable de página" ;
    Text [ french ] = "Afficher variable de page" ;
    Text [ swedish ] = "Visa sidvariabler" ;
    Text [ danish ] = "Vis sidevariabel" ;
    Text [ portuguese ] = "Mostrar variável de página" ;
    Text [ portuguese_brazilian ] = "Seitenvariable anzeigen" ;
    Text[ chinese_simplified ] = "ÏÔÊ¾Ò³Ãæ±äÊý";
    Text[ russian ] = "Ïîêàçàòü ïåðåìåííûå ñòðàíèöû";
    Text[ polish ] = "Poka¿ zmienn¹ strony";
    Text[ japanese ] = "Íß°¼Þ•ϐ”‚Ì•\\ަ";
    Text[ chinese_traditional ] = "Åã¥Ü­¶­±ÅܼÆ";
    Text[ arabic ] = "ÅÙåÇÑ ãÊÛíÑÉ ÕÝÍÉ";
    Text[ greek ] = "ÅìöÜíéóç ìåôáâëçôÞò óåëßäáò";
    Text[ korean ] = "ÆäÀÌÁö º¯¼ö º¸À̱â";
    Text[ turkish ] = "Sayfa deðiþkenini görüntüle";
    Text[ language_user1 ] = " ";
};
String STR_INTERNETFLD
{
    TEXT = "URL laden" ;
    TEXT [ English ] = "Load URL" ;
    Text [ english_us ] = "Load URL" ;
    Text [ italian ] = "Carica URL" ;
    Text [ spanish ] = "Cargar URL" ;
    Text [ french ] = "Charger l'URL" ;
    Text [ dutch ] = "URL laden" ;
    Text [ swedish ] = "Ladda URL" ;
    Text [ danish ] = "Indlæs URL" ;
    Text [ portuguese ] = "Carregar URL" ;
    Text [ portuguese_brazilian ] = "URL laden" ;
    Text[ chinese_simplified ] = "×°ÔØ URL";
    Text[ russian ] = "Çàïóñê URL";
    Text[ polish ] = "£aduj URL";
    Text[ japanese ] = "URL‚̓ǂݍž‚Ý";
    Text[ chinese_traditional ] = "¸Ë¸ü URL";
    Text[ arabic ] = "ÊÍãíá URL";
    Text[ greek ] = "Öüñôùóç URL";
    Text[ korean ] = "URL ·Îµå";
    Text[ turkish ] = "URL'yi yükle";
    Text[ language_user1 ] = " ";
};
String STR_JUMPEDITFLD
{
    TEXT = "Plat~zhalter" ;
    TEXT [ English ] = "Pla~ce marker" ;
    Text [ english_us ] = "Placeholder" ;
    Text [ italian ] = "Segnaposto" ;
    Text [ spanish ] = "~Comodín" ;
    Text [ french ] = "~Substituant" ;
    Text [ dutch ] = "~Plaatsaanwijzer" ;
    Text [ swedish ] = "Plat~shållare" ;
    Text [ danish ] = "Pladsholdere" ;
    Text [ portuguese ] = "Marcador de ~posição" ;
    Text [ portuguese_brazilian ] = "Plat~zhalter" ;
    Text[ chinese_simplified ] = "ͨÅä·û";
    Text[ russian ] = "Ìåòêà-çàïîëíèòåëü";
    Text[ polish ] = "Znak wype³niacz";
    Text[ japanese ] = "ܲÙÄÞ¶°ÄÞ";
    Text[ chinese_traditional ] = "³q°t²Å";
    Text[ arabic ] = "ÚäÕÑ äÇÆÈ";
    Text[ greek ] = "Óýìâïëá êñÜôçóçò èÝóçò";
    Text[ korean ] = "°³Ã¼Æ²";
    Text[ turkish ] = "Genel arama  karakteri";
    Text[ language_user1 ] = " ";
};
 //
 // Bereich Referenzen
 //
String STR_SETREFFLD
{
    TEXT = "Referenz setzen" ;
    TEXT [ English ] = "Set reference" ;
    TEXT [ norwegian ] = "Set reference" ;
    TEXT [ italian ] = "Imposta riferimento" ;
    TEXT [ portuguese_brazilian ] = "Definir referência" ;
    TEXT [ portuguese ] = "Definir referência" ;
    TEXT [ finnish ] = "Määritä viittaus" ;
    TEXT [ danish ] = "Definer reference" ;
    TEXT [ french ] = "Définir une référence" ;
    TEXT [ swedish ] = "Sätt referens" ;
    TEXT [ dutch ] = "Verwijzing definiëren" ;
    TEXT [ spanish ] = "Establecer referencia" ;
    TEXT [ english_us ] = "Set Reference" ;
    TEXT[ chinese_simplified ] = "É趨ÒýÓÃ";
    TEXT[ russian ] = "Óñòàíîâèòü ññûëêó";
    TEXT[ polish ] = "Okreœl odwo³anie";
    TEXT[ japanese ] = "ŽQÆÝ’è";
    TEXT[ chinese_traditional ] = "³]©w°Ñ·Ó";
    TEXT[ arabic ] = "ÊÚííä ãÑÌÚ";
    TEXT[ greek ] = "Ïñéóìüò áíáöïñÜò";
    TEXT[ korean ] = "ÂüÁ¶ ¼³Á¤";
    TEXT[ turkish ] = "Referans tanýmla";
    TEXT[ language_user1 ] = " ";
};
String STR_GETREFFLD
{
    TEXT = "Referenz einfügen" ;
    TEXT [ English ] = "Insert reference" ;
    TEXT [ norwegian ] = "Insert reference" ;
    TEXT [ italian ] = "Inserisci riferimento" ;
    TEXT [ portuguese_brazilian ] = "Inserir referência" ;
    TEXT [ portuguese ] = "Inserir referência" ;
    TEXT [ finnish ] = "Lisää viittaus" ;
    TEXT [ danish ] = "Indsæt reference" ;
    TEXT [ french ] = "Insérer une référence" ;
    TEXT [ swedish ] = "Infoga referens" ;
    TEXT [ dutch ] = "Verwijzing invoegen" ;
    TEXT [ spanish ] = "Insertar referencia" ;
    TEXT [ english_us ] = "Insert Reference" ;
    TEXT[ chinese_simplified ] = "²åÈëÒýÓÃ";
    TEXT[ russian ] = "Âñòàâèòü ññûëêó";
    TEXT[ polish ] = "Wstaw odwo³anie";
    TEXT[ japanese ] = "ŽQÆ‚Ì‘}“ü";
    TEXT[ chinese_traditional ] = "´¡¤J°Ñ·Ó";
    TEXT[ arabic ] = "ÅÏÑÇÌ ãÑÌÚ";
    TEXT[ greek ] = "ÅéóáãùãÞ áíáöïñÜò";
    TEXT[ korean ] = "ÂüÁ¶ »ðÀÔ";
    TEXT[ turkish ] = "Referans ekle";
    TEXT[ language_user1 ] = " ";
};
 //
 //  Bereich Datenbank
 //
String STR_DBFLD
{
    TEXT = "Serienbrieffeld" ;
    TEXT [ English ] = "Print merge field" ;
    TEXT [ norwegian ] = "Print merge field" ;
    TEXT [ italian ] = "Campo stampa in serie" ;
    TEXT [ portuguese_brazilian ] = "Imprimir campo intercalado" ;
    TEXT [ portuguese ] = "Campo para cartas em série" ;
    TEXT [ finnish ] = "Yhdistelykenttä" ;
    TEXT [ danish ] = "Brevfletningsfelt" ;
    TEXT [ french ] = "Champ de mailing" ;
    TEXT [ swedish ] = "Fält för kopplad utskrift" ;
    TEXT [ dutch ] = "Standaardbriefveld" ;
    TEXT [ spanish ] = "Campo de carta en serie" ;
    TEXT [ english_us ] = "Form letter field" ;
    TEXT[ chinese_simplified ] = "ÓʼþºÏ²¢×Ö¶Î";
    TEXT[ russian ] = "Ïîëå ñëèÿíèÿ";
    TEXT[ polish ] = "Pole koresp. seryj.";
    TEXT[ japanese ] = "·‚µž‚݈óų̈°ÙÄÞ";
    TEXT[ chinese_traditional ] = "¦X¨Ö¦C¦LÄæ¦ì";
    TEXT[ arabic ] = "ÍÞá ÎØÇÈ ãÓáÓá";
    TEXT[ greek ] = "Ðåäßï ïìáäéêÞò åðéóôïëÞò";
    TEXT[ korean ] = "ÆíÁö Çʵå·Î ºÎÅÍ";
    TEXT[ turkish ] = "Standart mektup";
    TEXT[ language_user1 ] = " ";
};
String STR_DBNEXTSETFLD
{
    TEXT = "Nächster Datensatz" ;
    TEXT [ English ] = "Next Set" ;
    TEXT [ norwegian ] = "Next Set" ;
    TEXT [ italian ] = "Record dati successivo" ;
    TEXT [ portuguese_brazilian ] = "Definir próximo" ;
    TEXT [ portuguese ] = "Registo seguinte" ;
    TEXT [ finnish ] = "Seuraava joukko" ;
    TEXT [ danish ] = "Næste datapost" ;
    TEXT [ french ] = "Enregistrement suivant" ;
    TEXT [ swedish ] = "Nästa datapost" ;
    TEXT [ dutch ] = "Volgende record" ;
    TEXT [ spanish ] = "Registro siguiente" ;
    TEXT [ english_us ] = "Next record" ;
    TEXT[ chinese_simplified ] = "ÏÂÒ»¸öÊý¾ÝÌõÄ¿";
    TEXT[ russian ] = "Ñëåäóþùàÿ çàïèñü";
    TEXT[ polish ] = "Nastêpny rekord";
    TEXT[ japanese ] = "ŽŸ‚ÌÚº°ÄÞ";
    TEXT[ chinese_traditional ] = "¤U¤@­Ó¸ê®Æ¶µ¥Ø";
    TEXT[ arabic ] = "ÇáÓÌá ÇáÊÇáí";
    TEXT[ greek ] = "Åðüìåíç åããñáöÞ";
    TEXT[ korean ] = "´ÙÀ½ ·¹ÄÚµå";
    TEXT[ turkish ] = "Sonraki veri kümesi";
    TEXT[ language_user1 ] = " ";
};
String STR_DBNUMSETFLD
{
    TEXT = "Beliebiger Datensatz" ;
    TEXT [ English ] = "Random Set" ;
    TEXT [ norwegian ] = "Random Set" ;
    TEXT [ italian ] = "Qualsiasi record di dati" ;
    TEXT [ portuguese_brazilian ] = "Definir aleatoriamente" ;
    TEXT [ portuguese ] = "Registo aleatório" ;
    TEXT [ finnish ] = "Satunnainen joukko" ;
    TEXT [ danish ] = "Vilkårlig datapost" ;
    TEXT [ french ] = "Enregistrement aléatoire" ;
    TEXT [ swedish ] = "Slumpvis datapost" ;
    TEXT [ dutch ] = "Willekeurige record" ;
    TEXT [ spanish ] = "Cualquier registro" ;
    TEXT [ english_us ] = "Any record" ;
    TEXT[ chinese_simplified ] = "ÈκÎÒ»¸öÊý¾ÝÌõÄ¿";
    TEXT[ russian ] = "Ëþáàÿ çàïèñü";
    TEXT[ polish ] = "Dowolny rekord";
    TEXT[ japanese ] = "”CˆÓ‚ÌÚº°ÄÞ";
    TEXT[ chinese_traditional ] = "¥ô¦ó¤@­Ó¸ê®Æ¶µ¥Ø";
    TEXT[ arabic ] = "Ãí ÓÌá";
    TEXT[ greek ] = "ÏðïéáäÞðïôå åããñáöÞ";
    TEXT[ korean ] = "ÀÓÀÇÀÇ ·¹ÄÚµå";
    TEXT[ turkish ] = "Herhangi bir veri kümesi";
    TEXT[ language_user1 ] = " ";
};
String STR_DBSETNUMBERFLD
{
    TEXT = "Datensatznummer" ;
    TEXT [ English ] = "Setnumber" ;
    TEXT [ norwegian ] = "Setnumber" ;
    TEXT [ italian ] = "Numero record dati" ;
    TEXT [ portuguese_brazilian ] = "Definir número" ;
    TEXT [ portuguese ] = "Número do registo" ;
    TEXT [ finnish ] = "Joukon numero" ;
    TEXT [ danish ] = "Datapostnummer" ;
    TEXT [ french ] = "Numéro d'enregistrement" ;
    TEXT [ swedish ] = "Datapostnummer" ;
    TEXT [ dutch ] = "Record-nummer" ;
    TEXT [ spanish ] = "Número de registro" ;
    TEXT [ english_us ] = "Record number" ;
    TEXT[ chinese_simplified ] = "Êý¾ÝÌõÄ¿ºÅÂë";
    TEXT[ russian ] = "Íîìåð çàïèñè";
    TEXT[ polish ] = "Numer rekordu";
    TEXT[ japanese ] = "Úº°Äޔԍ†";
    TEXT[ chinese_traditional ] = "¸ê®Æ¶µ¥Ø¸¹½X";
    TEXT[ arabic ] = "ÑÞã ÇáÓÌá";
    TEXT[ greek ] = "Áñéèìüò åããñáöÞò";
    TEXT[ korean ] = "·¹ÄÚµå ¹øÈ£";
    TEXT[ turkish ] = "Veri kümesi numarasý";
    TEXT[ language_user1 ] = " ";
};
String STR_PREVPAGEFLD
{
    TEXT = "Vorherige Seite" ;
    TEXT [ English ] = "Prev Page" ;
    TEXT [ norwegian ] = "Prev Page" ;
    TEXT [ italian ] = "Pagina precedente" ;
    TEXT [ portuguese_brazilian ] = "Examinar Página" ;
    TEXT [ portuguese ] = "Página anterior" ;
    TEXT [ finnish ] = "Edellinen sivu" ;
    TEXT [ danish ] = "Forrige side" ;
    TEXT [ french ] = "Page précédente" ;
    TEXT [ swedish ] = "Föregående sida" ;
    TEXT [ dutch ] = "Vorige pagina" ;
    TEXT [ spanish ] = "Página anterior" ;
    TEXT [ english_us ] = "Previous page" ;
    TEXT[ chinese_simplified ] = "ÉÏÒ»Ò³";
    TEXT[ russian ] = "Ïðåäûäóùàÿ ñòðàíèöà";
    TEXT[ polish ] = "Poprzednia strona";
    TEXT[ japanese ] = "‘O‚ÌÍß°¼Þ";
    TEXT[ chinese_traditional ] = "¤W¤@­¶";
    TEXT[ arabic ] = "ÇáÕÝÍÉ ÇáÓÇÈÞÉ";
    TEXT[ greek ] = "Ðñïçãïýìåíç óåëßäá";
    TEXT[ korean ] = "ÀÌÀü ÆäÀÌÁö";
    TEXT[ turkish ] = "Önceki sayfa";
    TEXT[ language_user1 ] = " ";
};
String STR_NEXTPAGEFLD
{
    TEXT = "Nächste Seite" ;
    TEXT [ English ] = "Next Page" ;
    TEXT [ norwegian ] = "Neste side" ;
    TEXT [ italian ] = "Pagina successiva" ;
    TEXT [ portuguese_brazilian ] = "Próxima Página" ;
    TEXT [ portuguese ] = "Página seguinte" ;
    TEXT [ finnish ] = "Seuraava sivu" ;
    TEXT [ danish ] = "Næste side" ;
    TEXT [ french ] = "Page suivante" ;
    TEXT [ swedish ] = "Nästa sida" ;
    TEXT [ dutch ] = "Volgende pagina" ;
    TEXT [ spanish ] = "Página siguiente" ;
    TEXT [ english_us ] = "Next page" ;
    TEXT[ chinese_simplified ] = "ÏÂÒ»Ò³";
    TEXT[ russian ] = "Ñëåäóþùàÿ ñòðàíèöà";
    TEXT[ polish ] = "Nastêpna strona";
    TEXT[ japanese ] = "ŽŸ‚ÌÍß°¼Þ";
    TEXT[ chinese_traditional ] = "¤U¤@­¶";
    TEXT[ arabic ] = "ÇáÕÝÍÉ ÇáÊÇáíÉ";
    TEXT[ greek ] = "Åðüìåíç óåëßäá";
    TEXT[ korean ] = "´ÙÀ½ ÆäÀÌÁö";
    TEXT[ turkish ] = "Sonraki sayfa";
    TEXT[ language_user1 ] = " ";
};
String STR_HIDDENTXTFLD
{
    TEXT = "Versteckter Text" ;
    TEXT [ English ] = "Hidden Text" ;
    TEXT [ norwegian ] = "Hidden Text" ;
    TEXT [ italian ] = "Testo nascosto" ;
    TEXT [ portuguese_brazilian ] = "Texto oculto" ;
    TEXT [ portuguese ] = "Texto oculto" ;
    TEXT [ finnish ] = "Piiloteksti" ;
    TEXT [ danish ] = "Skjult tekst" ;
    TEXT [ french ] = "Texte masqué" ;
    TEXT [ swedish ] = "Dold text" ;
    TEXT [ dutch ] = "Verborgen tekst" ;
    TEXT [ spanish ] = "Texto oculto" ;
    TEXT [ english_us ] = "Hidden text" ;
    TEXT[ chinese_simplified ] = "ÒþÈëµÄÎÄ×Ö";
    TEXT[ russian ] = "Ñêðûòûé òåêñò";
    TEXT[ polish ] = "Ukryty tekst";
    TEXT[ japanese ] = "‰B‚µÃ·½Ä";
    TEXT[ chinese_traditional ] = "Áô¤Jªº¤å¦r";
    TEXT[ arabic ] = "äÕ ãÎÝí";
    TEXT[ greek ] = "Êñõöü êåßìåíï";
    TEXT[ korean ] = "¼û°ÜÁø ÅØ½ºÆ®";
    TEXT[ turkish ] = "Gizli";
    TEXT[ language_user1 ] = " ";
};
 //
 //  Bereich Benutzerfelder
 //
String STR_USERFLD
{
    TEXT = "Benutzerfeld" ;
    TEXT [ English ] = "User field" ;
    TEXT [ norwegian ] = "User field" ;
    TEXT [ italian ] = "Campo utente" ;
    TEXT [ portuguese_brazilian ] = "Campo do usuário" ;
    TEXT [ portuguese ] = "Campo do utilizador" ;
    TEXT [ finnish ] = "Käyttäjän kenttä" ;
    TEXT [ danish ] = "Brugerdefineret felt" ;
    TEXT [ french ] = "Champ d'utilisateur" ;
    TEXT [ swedish ] = "Användarfält" ;
    TEXT [ dutch ] = "Gebruikersveld" ;
    TEXT [ spanish ] = "Campo del usuario" ;
    TEXT [ english_us ] = "User Field" ;
    TEXT[ chinese_simplified ] = "ʹÓÃÕß×Ö¶Î";
    TEXT[ russian ] = "Ïîëå ïîëüçîâàòåëÿ";
    TEXT[ polish ] = "Pole u¿ytkownika";
    TEXT[ japanese ] = "Õ°»Þ°Ì¨°ÙÄÞ";
    TEXT[ chinese_traditional ] = "¨Ï¥ÎªÌÄæ¦ì";
    TEXT[ arabic ] = "ÍÞá ÇáãÓÊÎÏã";
    TEXT[ greek ] = "Ðåäßï ÷ñÞóôç";
    TEXT[ korean ] = "»ç¿ëÀÚ Çʵå";
    TEXT[ turkish ] = "Kullanýcý alaný";
    TEXT[ language_user1 ] = " ";
};
String STR_POSTITFLD
{
    TEXT = "Notiz" ;
    TEXT [ English ] = "Note" ;
    TEXT [ norwegian ] = "Merknad" ;
    TEXT [ italian ] = "Nota" ;
    TEXT [ portuguese_brazilian ] = "Observação" ;
    TEXT [ portuguese ] = "Anotação" ;
    TEXT [ finnish ] = "Huomautus" ;
    TEXT [ danish ] = "Note" ;
    TEXT [ french ] = "Note" ;
    TEXT [ swedish ] = "Anteckning" ;
    TEXT [ dutch ] = "Aantekening" ;
    TEXT [ spanish ] = "Nota" ;
    TEXT [ english_us ] = "Note" ;
    TEXT[ chinese_simplified ] = "±¸×¢";
    TEXT[ russian ] = "Ïðèìå÷àíèå";
    TEXT[ polish ] = "Notatka";
    TEXT[ japanese ] = "ÒÓ";
    TEXT[ chinese_traditional ] = "³Æª`";
    TEXT[ arabic ] = "ãáÇÍÙÉ";
    TEXT[ greek ] = "Óçìåßùóç";
    TEXT[ korean ] = "¸Þ¸ð";
    TEXT[ turkish ] = "Not";
    TEXT[ language_user1 ] = " ";
};
String STR_SCRIPTFLD
{
    TEXT = "Script" ;
    TEXT [ English ] = "Script" ;
    Text [ dutch ] = "Script" ;
    Text [ english_us ] = "Script" ;
    Text [ italian ] = "Script" ;
    Text [ spanish ] = "Script" ;
    Text [ french ] = "Script" ;
    Text [ swedish ] = "Skript" ;
    Text [ danish ] = "Script" ;
    Text [ portuguese ] = "Script" ;
    Text [ portuguese_brazilian ] = "Script" ;
    Text[ chinese_simplified ] = "½Å±¾";
    Text[ russian ] = "Ñêðèïò";
    Text[ polish ] = "Script";
    Text[ japanese ] = "½¸ØÌßÄ";
    Text[ chinese_traditional ] = "©R¥O½Z";
    Text[ arabic ] = "Script";
    Text[ greek ] = "Script";
    Text[ korean ] = "½ºÅ©¸³Æ®";
    Text[ turkish ] = "Script";
    Text[ language_user1 ] = " ";
};
String STR_AUTHORITY
{
    TEXT = "Eintrag Literaturverzeichnis" ;
    TEXT [ English ] = "Authority entry" ;
    TEXT[ english_us ] = "Bibliography entry";
    TEXT[ portuguese ] = "Entrada bibliográfica";
    TEXT[ russian ] = "Ýëåìåíò ñïèñêà ëèòåðàòóðû";
    TEXT[ greek ] = "ÅããñáöÞ âéâëéïãñáößáò";
    TEXT[ dutch ] = "Item voor literatuurlijst";
    TEXT[ french ] = "Entrée de bibliographie";
    TEXT[ spanish ] = "Entrada bibliografía";
    TEXT[ italian ] = "Voce bibliografia";
    TEXT[ danish ] = "Element litteraturliste";
    TEXT[ swedish ] = "Post litteraturförteckning";
    TEXT[ polish ] = "Wpis bibliograficzny";
    TEXT[ portuguese_brazilian ] = "Authority entry";
    TEXT[ japanese ] = "ŽQl•¶Œ£€–Ú";
    TEXT[ korean ] = "Âü°í¹®Çå Ç׸ñ";
    TEXT[ chinese_simplified ] = "ÎÄÏ×Ŀ¼ÌõÄ¿";
    TEXT[ chinese_traditional ] = "±ø¥Ø °Ñ¦Ò¤åÄm¥Ø¿ý";
    TEXT[ arabic ] = "ÅÏÎÇá Ýí ÝåÑÓ ÇáãÑÇÌÚ";
    TEXT[ turkish ] = "Kaynakça giriþi";
    TEXT[ language_user1 ] = " ";
};
String STR_HIDDENPARAFLD
{
    TEXT = "Versteckter Absatz" ;
    TEXT [ English ] = "Hidden paragraph" ;
    TEXT [ norwegian ] = "Hidden paragraph" ;
    TEXT [ italian ] = "Paragrafo vuoto" ;
    TEXT [ portuguese_brazilian ] = "Parágrafo vazio" ;
    TEXT [ portuguese ] = "Parágrafo oculto" ;
    TEXT [ finnish ] = "Tyhjä kappale" ;
    TEXT [ danish ] = "Skjult afsnit" ;
    TEXT [ french ] = "Paragraphe masqué" ;
    TEXT [ swedish ] = "Dolt stycke" ;
    TEXT [ dutch ] = "Verborgen alinea" ;
    TEXT [ spanish ] = "Párrafo oculto" ;
    TEXT [ english_us ] = "Hidden Paragraph" ;
    TEXT[ chinese_simplified ] = "ÒþÈëµÄ¶ÎÂä";
    TEXT[ russian ] = "Ñêðûòûé àáçàö";
    TEXT[ polish ] = "Ukryty akapit";
    TEXT[ japanese ] = "‰B‚µ’i—Ž";
    TEXT[ chinese_traditional ] = "Áô¤Jªº¬q¸¨";
    TEXT[ arabic ] = "ÝÞÑÉ ãÎÝíÉ";
    TEXT[ greek ] = "ÊñõöÞ ðáñÜãñáöïò";
    TEXT[ korean ] = "¼û°ÜÁø ´Ü¶ô";
    TEXT[ turkish ] = "Gizli paragraf";
    TEXT[ language_user1 ] = " ";
};
 //
 // Bereich DokumentInfo
 //
String STR_DOCINFOFLD
{
    TEXT = "Dokumentinfo" ;
    TEXT [ English ] = "Document info" ;
    TEXT [ norwegian ] = "Document info" ;
    TEXT [ italian ] = "Info documento" ;
    TEXT [ portuguese_brazilian ] = "Informações sobre o documento" ;
    TEXT [ portuguese ] = "Info. sobre documento" ;
    TEXT [ finnish ] = "Asiakirjan tiedot" ;
    TEXT [ danish ] = "Dokumentinfo" ;
    TEXT [ french ] = "Info document" ;
    TEXT [ swedish ] = "Dokumentinformation" ;
    TEXT [ dutch ] = "Documentinfo" ;
    TEXT [ spanish ] = "Información del documento" ;
    TEXT [ english_us ] = "DocInformation" ;
    TEXT[ chinese_simplified ] = "ÎĵµÐÅÏ¢";
    TEXT[ russian ] = "Ñâåäåíèÿ î äîêóìåíòå";
    TEXT[ polish ] = "Informacje o dokumencie";
    TEXT[ japanese ] = "ÄÞ·­ÒÝIJÝ̫Ұ¼®Ý";
    TEXT[ chinese_traditional ] = "¤å¥ó¸ê°T";
    TEXT[ arabic ] = "ãÚáæãÇÊ ÇáãÓÊäÏ";
    TEXT[ greek ] = "Ðëçñïöïñßåò åããñÜöïõ";
    TEXT[ korean ] = "¹®¼­ Á¤º¸";
    TEXT[ turkish ] = "Belge bilgileri";
    TEXT[ language_user1 ] = " ";
};
/*--------------------------------------------------------------------
    Beschreibung: SubCmd-Strings
 --------------------------------------------------------------------*/
String FLD_DATE_STD
{
    TEXT = "Datum" ;
    TEXT [ English ] = "Date" ;
    TEXT[ english_us ] = "Date";
    TEXT[ portuguese ] = "Data";
    TEXT[ russian ] = "Äàòà";
    TEXT[ dutch ] = "Datum";
    TEXT[ french ] = "Date";
    TEXT[ spanish ] = "Fecha";
    TEXT[ italian ] = "Data";
    TEXT[ danish ] = "Dato";
    TEXT[ swedish ] = "Datum";
    TEXT[ polish ] = "Data";
    TEXT[ portuguese_brazilian ] = "Data (var.)";
    TEXT[ japanese ] = "“ú•t";
    TEXT[ chinese_simplified ] = "ÈÕÆÚ";
    TEXT[ chinese_traditional ] = "¤é´Á";
    TEXT[ arabic ] = "ÇáÊÇÑíÎ";
    TEXT[ greek ] = "Çìåñïìçíßá";
    TEXT[ korean ] = "ÀÏÀÚ";
    TEXT[ turkish ] = "Tarih";
    TEXT[ language_user1 ] = " ";
};
String FLD_DATE_FIX
{
    TEXT = "Datum (fix)" ;
    TEXT [ English ] = "Date (fix)" ;
    TEXT [ norwegian ] = "Date (fix)" ;
    TEXT [ italian ] = "Data (fissa)" ;
    TEXT [ portuguese_brazilian ] = "Data (fix)" ;
    TEXT [ portuguese ] = "Data (fixa)" ;
    TEXT [ finnish ] = "Päivä (vakio)" ;
    TEXT [ danish ] = "Dato (fast)" ;
    TEXT [ french ] = "Date (fixe)" ;
    TEXT [ swedish ] = "Datum (fast)" ;
    TEXT [ dutch ] = "Datum (vast)" ;
    TEXT [ spanish ] = "Fecha (fija)" ;
    TEXT [ english_us ] = "Date (fixed)" ;
    TEXT[ chinese_simplified ] = "ÈÕÆÚ(¹Ì¶¨)";
    TEXT[ russian ] = "Äàòà (ôèêñ.)";
    TEXT[ polish ] = "Data (sta³a)";
    TEXT[ japanese ] = "“ú•t(ŒÅ’è)";
    TEXT[ chinese_traditional ] = "¤é´Á(©T©w)";
    TEXT[ arabic ] = "ÊÇÑíÎ (ËÇÈÊ)";
    TEXT[ greek ] = "Çìåñïìçíßá (ÓôáèåñÜ)";
    TEXT[ korean ] = "ÀÏÀÚ (°íÁ¤µÊ)";
    TEXT[ turkish ] = "Tarih (sabit)";
    TEXT[ language_user1 ] = " ";
};
String FLD_TIME_STD
{
    TEXT = "Uhrzeit" ;
    TEXT [ English ] = "Time" ;
    TEXT[ english_us ] = "Time";
    TEXT[ portuguese ] = "Hora";
    TEXT[ russian ] = "Âðåìÿ";
    TEXT[ dutch ] = "Tijd";
    TEXT[ french ] = "Heure";
    TEXT[ spanish ] = "Hora";
    TEXT[ italian ] = "Orario";
    TEXT[ danish ] = "Klokkeslæt";
    TEXT[ swedish ] = "Klockslag";
    TEXT[ polish ] = "Godzina";
    TEXT[ portuguese_brazilian ] = "Hora (var.)";
    TEXT[ japanese ] = "Žž";
    TEXT[ chinese_simplified ] = "ʱ¼ä";
    TEXT[ chinese_traditional ] = "®É¶¡";
    TEXT[ arabic ] = "ÇáæÞÊ";
    TEXT[ greek ] = "¿ñá";
    TEXT[ korean ] = "½Ã°£";
    TEXT[ turkish ] = "Saat";
    TEXT[ language_user1 ] = " ";
};
String FLD_TIME_FIX
{
    TEXT = "Uhrzeit (fix)" ;
    TEXT [ English ] = "Time (fix)" ;
    TEXT [ norwegian ] = "Time (fix)" ;
    TEXT [ italian ] = "Orario (fisso)" ;
    TEXT [ portuguese_brazilian ] = "Hora (fix)" ;
    TEXT [ portuguese ] = "Hora (fixa)" ;
    TEXT [ finnish ] = "Aika (vakio)" ;
    TEXT [ danish ] = "Klokkeslæt (fast)" ;
    TEXT [ french ] = "Heure (fixe)" ;
    TEXT [ swedish ] = "Klockslag (fast)" ;
    TEXT [ dutch ] = "Tijd (vast)" ;
    TEXT [ spanish ] = "Hora (fija)" ;
    TEXT [ english_us ] = "Time (fixed)" ;
    TEXT[ chinese_simplified ] = "ʱ¼ä(¹Ì¶¨)";
    TEXT[ russian ] = "Âðåìÿ (ôèêñ.)";
    TEXT[ polish ] = "Godzina (sta³a)";
    TEXT[ japanese ] = "Žž(ŒÅ’è)";
    TEXT[ chinese_traditional ] = "®É¶¡(©T©w)";
    TEXT[ arabic ] = "ÇáæÞÊ (ËÇÈÊ)";
    TEXT[ greek ] = "¿ñá (óôáèåñÜ)";
    TEXT[ korean ] = "½Ã°£ (°íÁ¤µÊ)";
    TEXT[ turkish ] = "Saat (sabit)";
    TEXT[ language_user1 ] = " ";
};
 //
 //  SubCmd Statistik
 //
String FLD_STAT_TABLE
{
    TEXT = "Tabellen" ;
    TEXT [ English ] = "Tables" ;
    TEXT [ norwegian ] = "Tables" ;
    TEXT [ italian ] = "Tabella" ;
    TEXT [ portuguese_brazilian ] = "Tabelas" ;
    TEXT [ portuguese ] = "Tabelas" ;
    TEXT [ finnish ] = "Taulukot" ;
    TEXT [ danish ] = "Tabeller" ;
    TEXT [ french ] = "Tableaux" ;
    TEXT [ swedish ] = "Tabeller" ;
    TEXT [ dutch ] = "Tabellen" ;
    TEXT [ spanish ] = "Tablas" ;
    TEXT [ english_us ] = "Tables" ;
    TEXT[ chinese_simplified ] = "±í¸ñ";
    TEXT[ russian ] = "Òàáëèöû";
    TEXT[ polish ] = "Tabele";
    TEXT[ japanese ] = "•\\";
    TEXT[ chinese_traditional ] = "ªí®æ";
    TEXT[ arabic ] = "ÌÏÇæá";
    TEXT[ greek ] = "Ðßíáêåò";
    TEXT[ korean ] = "ǥ";
    TEXT[ turkish ] = "Tablo";
    TEXT[ language_user1 ] = " ";
};
String FLD_STAT_CHAR
{
    TEXT = "Zeichen" ;
    TEXT [ English ] = "Characters" ;
    TEXT [ norwegian ] = "Characters" ;
    TEXT [ italian ] = "Carattere" ;
    TEXT [ portuguese_brazilian ] = "Caracteres" ;
    TEXT [ portuguese ] = "Caracteres" ;
    TEXT [ finnish ] = "Merkit" ;
    TEXT [ danish ] = "Tegn" ;
    TEXT [ french ] = "Caractères" ;
    TEXT [ swedish ] = "Tecken" ;
    TEXT [ dutch ] = "Teken" ;
    TEXT [ spanish ] = "Caracteres" ;
    TEXT [ english_us ] = "Characters" ;
    TEXT[ chinese_simplified ] = "×Ö·û";
    TEXT[ russian ] = "Çíàêè";
    TEXT[ polish ] = "Znaki";
    TEXT[ japanese ] = "•¶Žš";
    TEXT[ language_user1 ] = " ";
    TEXT[ chinese_traditional ] = "¦r¤¸";
    TEXT[ arabic ] = "ÃÍÑÝ";
    TEXT[ greek ] = "×áñáêôÞñåò";
    TEXT[ korean ] = "¹®ÀÚ";
    TEXT[ turkish ] = "Karakter";
};
String FLD_STAT_WORD
{
    TEXT = "Wörter" ;
    TEXT [ English ] = "Words" ;
    TEXT [ norwegian ] = "Words" ;
    TEXT [ italian ] = "Parole" ;
    TEXT [ portuguese_brazilian ] = "Palavras" ;
    TEXT [ portuguese ] = "Palavras" ;
    TEXT [ finnish ] = "Sanat" ;
    TEXT [ danish ] = "Ord" ;
    TEXT [ french ] = "Mots" ;
    TEXT [ swedish ] = "Ord" ;
    TEXT [ dutch ] = "Woorden" ;
    TEXT [ spanish ] = "Palabras" ;
    TEXT [ english_us ] = "Words" ;
    TEXT[ chinese_simplified ] = "×Ö";
    TEXT[ russian ] = "Ñëîâà";
    TEXT[ polish ] = "S³owa";
    TEXT[ japanese ] = "Œ¾—t";
    TEXT[ chinese_traditional ] = "¦r";
    TEXT[ arabic ] = "ßáãÇÊ";
    TEXT[ greek ] = "ËÝîåéò";
    TEXT[ korean ] = "´Ü¾î";
    TEXT[ turkish ] = "Sözcük";
    TEXT[ language_user1 ] = " ";
};
String FLD_STAT_PARA
{
    TEXT = "Absätze" ;
    TEXT [ English ] = "Paragraphs" ;
    TEXT [ norwegian ] = "Paragraphs" ;
    TEXT [ italian ] = "Paragrafi" ;
    TEXT [ portuguese_brazilian ] = "Parágrafos" ;
    TEXT [ portuguese ] = "Parágrafos" ;
    TEXT [ finnish ] = "Kappaleet" ;
    TEXT [ danish ] = "Afsnit" ;
    TEXT [ french ] = "Paragraphes" ;
    TEXT [ swedish ] = "Stycken" ;
    TEXT [ dutch ] = "Alinea's" ;
    TEXT [ spanish ] = "Párrafos" ;
    TEXT [ english_us ] = "Paragraphs" ;
    TEXT[ chinese_simplified ] = "¶ÎÂä";
    TEXT[ russian ] = "Àáçàöû";
    TEXT[ polish ] = "Akapity";
    TEXT[ japanese ] = "’i—Ž";
    TEXT[ chinese_traditional ] = "¬q¸¨";
    TEXT[ arabic ] = "ÝÞÑÇÊ";
    TEXT[ greek ] = "ÐáñÜãñáöïé";
    TEXT[ korean ] = "´Ü¶ô";
    TEXT[ turkish ] = "Paragraf";
    TEXT[ language_user1 ] = " ";
};
String FLD_STAT_GRF
{
    TEXT = "Grafiken" ;
    TEXT [ English ] = "Graphics" ;
    TEXT [ norwegian ] = "Grafikker" ;
    TEXT [ italian ] = "Immagini" ;
    TEXT [ portuguese_brazilian ] = "Gráficos" ;
    TEXT [ portuguese ] = "Imagens" ;
    TEXT [ finnish ] = "Kuvat" ;
    TEXT [ danish ] = "Grafik" ;
    TEXT [ french ] = "Images" ;
    TEXT [ swedish ] = "Grafiker" ;
    TEXT [ dutch ] = "Afbeeldingen" ;
    TEXT [ spanish ] = "Imágenes" ;
    TEXT [ english_us ] = "Graphics" ;
    TEXT[ chinese_simplified ] = "ͼÐÎ";
    TEXT[ russian ] = "Ðèñóíêè";
    TEXT[ polish ] = "Grafiki";
    TEXT[ japanese ] = "¸Þ×̨¯¸½";
    TEXT[ chinese_traditional ] = "¹Ï¤ù";
    TEXT[ arabic ] = "ÕæÑ";
    TEXT[ greek ] = "ÃñáöéêÜ";
    TEXT[ korean ] = "±×·¡ÇÈ";
    TEXT[ turkish ] = "Grafik";
    TEXT[ language_user1 ] = " ";
};
String FLD_STAT_OBJ
{
    TEXT = "Objekte" ;
    TEXT [ English ] = "Objects" ;
    TEXT [ norwegian ] = "Objects" ;
    TEXT [ italian ] = "Oggetti" ;
    TEXT [ portuguese_brazilian ] = "Objetos" ;
    TEXT [ portuguese ] = "Objectos" ;
    TEXT [ finnish ] = "Objektit" ;
    TEXT [ danish ] = "Objekter" ;
    TEXT [ french ] = "Objets" ;
    TEXT [ swedish ] = "Objekt" ;
    TEXT [ dutch ] = "Objecten" ;
    TEXT [ spanish ] = "Objetos" ;
    TEXT [ english_us ] = "Objects" ;
    TEXT[ chinese_simplified ] = "¶ÔÏó";
    TEXT[ russian ] = "Îáúåêòû";
    TEXT[ polish ] = "Obiekty";
    TEXT[ japanese ] = "µÌÞ¼Þª¸Ä";
    TEXT[ chinese_traditional ] = "ª«¥ó";
    TEXT[ arabic ] = "ßÇÆäÇÊ";
    TEXT[ greek ] = "Áíôéêåßìåíá";
    TEXT[ korean ] = "°³Ã¼";
    TEXT[ turkish ] = "Nesne";
    TEXT[ language_user1 ] = " ";
};
String FLD_STAT_PAGE
{
    TEXT = "Seiten" ;
    TEXT [ English ] = "Pages" ;
    TEXT [ norwegian ] = "Pages" ;
    TEXT [ italian ] = "Pagine" ;
    TEXT [ portuguese_brazilian ] = "Páginas" ;
    TEXT [ portuguese ] = "Páginas" ;
    TEXT [ finnish ] = "Sivumäärä" ;
    TEXT [ danish ] = "Sider" ;
    TEXT [ french ] = "Pages" ;
    TEXT [ swedish ] = "Sidor" ;
    TEXT [ dutch ] = "Pagina's" ;
    TEXT [ spanish ] = "Páginas" ;
    TEXT [ english_us ] = "Pages" ;
    TEXT[ chinese_simplified ] = "ҳ";
    TEXT[ russian ] = "Ñòðàíèöû";
    TEXT[ polish ] = "Strony";
    TEXT[ japanese ] = "Íß°¼Þ";
    TEXT[ chinese_traditional ] = "­¶";
    TEXT[ arabic ] = "ÕÝÍÇÊ";
    TEXT[ greek ] = "Óåëßäåò";
    TEXT[ korean ] = "ÆäÀÌÁö";
    TEXT[ turkish ] = "Sayfa";
    TEXT[ language_user1 ] = " ";
};
 //  SubCmd DDETypen
 //
String FMT_DDE_HOT
{
    TEXT = "DDE automatisch" ;
    TEXT [ English ] = "DDE automatic" ;
    TEXT [ norwegian ] = "DDE automatic" ;
    TEXT [ italian ] = "DDE automatico" ;
    TEXT [ portuguese_brazilian ] = "DDE autom tico" ;
    TEXT [ portuguese ] = "DDE automático" ;
    TEXT [ finnish ] = "DDE automaattinen" ;
    TEXT [ danish ] = "DDE automatisk" ;
    TEXT [ french ] = "DDE automatique" ;
    TEXT [ swedish ] = "DDE-automatisk" ;
    TEXT [ dutch ] = "DDE automatisch" ;
    TEXT [ spanish ] = "DDE automático" ;
    TEXT [ english_us ] = "DDE automatic" ;
    TEXT[ chinese_simplified ] = "DDE ×Ô¶¯";
    TEXT[ russian ] = "DDE àâòîìàòè÷åñêè";
    TEXT[ polish ] = "DDE automatycznie";
    TEXT[ japanese ] = "DDE Ž©“®";
    TEXT[ chinese_traditional ] = "DDE ¦Û°Ê";
    TEXT[ arabic ] = "DDE ÊáÞÇÆí";
    TEXT[ greek ] = "DDE áõôïìÜôùò";
    TEXT[ korean ] = "DDE ÀÚµ¿";
    TEXT[ turkish ] = "Otomatik DDE";
    TEXT[ language_user1 ] = " ";
};
String FMT_DDE_NORMAL
{
    TEXT = "DDE manuell" ;
    TEXT [ English ] = "DDE manual" ;
    TEXT [ norwegian ] = "DDE håndbok" ;
    TEXT [ italian ] = "DDE manuale" ;
    TEXT [ portuguese_brazilian ] = "DDE manual" ;
    TEXT [ portuguese ] = "DDE manual" ;
    TEXT [ finnish ] = "DDE manuaalinen" ;
    TEXT [ danish ] = "DDE manuel" ;
    TEXT [ french ] = "DDE manuel" ;
    TEXT [ swedish ] = "DDE manuell" ;
    TEXT [ dutch ] = "DDE-handmatig" ;
    TEXT [ spanish ] = "DDE manual" ;
    TEXT [ english_us ] = "DDE manual" ;
    TEXT[ chinese_simplified ] = "DDE ÊÖ¹¤";
    TEXT[ russian ] = "DDE âðó÷íóþ";
    TEXT[ polish ] = "DDE rêcznie";
    TEXT[ japanese ] = "DDE Žè“®";
    TEXT[ chinese_traditional ] = "DDE ¤H¤u";
    TEXT[ arabic ] = "DDE íÏæí";
    TEXT[ greek ] = "DDE ÷åéñïêßíçôá";
    TEXT[ korean ] = "DDE ¼öµ¿";
    TEXT[ turkish ] = "Manüel DDE";
    TEXT[ language_user1 ] = " ";
};
String FLD_INPUT_TEXT
{
    TEXT = "[Text]" ;
};
/*--------------------------------------------------------------------
    Beschreibung: SubType Extuser
 --------------------------------------------------------------------*/
String FLD_EU_FIRMA
{
    TEXT = "Firma" ;
    TEXT [ English ] = "Company" ;
    TEXT [ norwegian ] = "Company" ;
    TEXT [ italian ] = "Azienda" ;
    TEXT [ portuguese_brazilian ] = "Compania" ;
    TEXT [ portuguese ] = "Empresa" ;
    TEXT [ finnish ] = "Yritys" ;
    TEXT [ danish ] = "Firma" ;
    TEXT [ french ] = "Société" ;
    TEXT [ swedish ] = "Företag" ;
    TEXT [ dutch ] = "Bedrijf" ;
    TEXT [ spanish ] = "Empresa" ;
    TEXT [ english_us ] = "Company" ;
    TEXT[ chinese_simplified ] = "¹«Ë¾";
    TEXT[ russian ] = "Ôèðìà";
    TEXT[ polish ] = "Firma";
    TEXT[ japanese ] = "‰ïŽÐ";
    TEXT[ chinese_traditional ] = "¤½¥q";
    TEXT[ arabic ] = "ÇáÔÑßÉ";
    TEXT[ greek ] = "Åôáéñßá";
    TEXT[ korean ] = "ȸ»ç";
    TEXT[ turkish ] = "Þirket";
    TEXT[ language_user1 ] = " ";
};
String FLD_EU_VORNAME
{
    TEXT = "Vorname" ;
    TEXT [ English ] = "First Name" ;
    TEXT [ norwegian ] = "First Name" ;
    TEXT [ italian ] = "Nome" ;
    TEXT [ portuguese_brazilian ] = "Primeiro nome" ;
    TEXT [ portuguese ] = "Nome próprio" ;
    TEXT [ finnish ] = "Etunimi" ;
    TEXT [ danish ] = "Fornavn" ;
    TEXT [ french ] = "Prénom" ;
    TEXT [ swedish ] = "Förnamn" ;
    TEXT [ dutch ] = "Voornaam" ;
    TEXT [ spanish ] = "Nombre" ;
    TEXT [ english_us ] = "First Name" ;
    TEXT[ chinese_simplified ] = "Ãû×Ö";
    TEXT[ russian ] = "Èìÿ";
    TEXT[ polish ] = "Imiê";
    TEXT[ japanese ] = "–¼";
    TEXT[ chinese_traditional ] = "¦W¦r";
    TEXT[ arabic ] = "ÇáÇÓã";
    TEXT[ greek ] = "¼íïìá";
    TEXT[ korean ] = "¼º";
    TEXT[ turkish ] = "Ad";
    TEXT[ language_user1 ] = " ";
};
String FLD_EU_NAME
{
    TEXT = "Nachname" ;
    TEXT [ English ] = "Last Name" ;
    TEXT [ english_us ] = "Last Name" ;
    Text [ portuguese ] = "Apelido" ;
    Text [ portuguese_brazilian ] = "Nomear" ;
    Text [ swedish ] = "Efternamn" ;
    Text [ danish ] = "Efternavn" ;
    Text [ italian ] = "Cognome" ;
    Text [ spanish ] = "Apellidos" ;
    Text [ french ] = "Nom" ;
    Text [ dutch ] = "Achternaam" ;
    Text[ chinese_simplified ] = "ÐÕÊÏ";
    Text[ russian ] = "Ôàìèëèÿ";
    Text[ polish ] = "Nazwisko";
    Text[ japanese ] = "©";
    Text[ chinese_traditional ] = "©m¤ó";
    Text[ arabic ] = "ÇÓã ÇáÚÇÆáÉ";
    Text[ greek ] = "Åðþíõìï";
    Text[ korean ] = "À̸§";
    Text[ turkish ] = "Soyad";
    Text[ language_user1 ] = " ";
};
String FLD_EU_ABK
{
    TEXT = "Kürzel" ;
    TEXT [ English ] = "Short Cut" ;
    TEXT [ norwegian ] = "Short Cut" ;
    TEXT [ italian ] = "Iniziali" ;
    TEXT [ portuguese_brazilian ] = "Atalho" ;
    TEXT [ portuguese ] = "Iniciais" ;
    TEXT [ finnish ] = "Pikatoiminto" ;
    TEXT [ danish ] = "Initialer" ;
    TEXT [ french ] = "Initiales" ;
    TEXT [ swedish ] = "Initialer" ;
    TEXT [ dutch ] = "Initialen" ;
    TEXT [ spanish ] = "Iniciales" ;
    TEXT [ english_us ] = "Initials" ;
    TEXT[ chinese_simplified ] = "Ëõд";
    TEXT[ russian ] = "Èíèöèàëû";
    TEXT[ polish ] = "Inicja³y";
    TEXT[ japanese ] = "²Æ¼¬Ù";
    TEXT[ chinese_traditional ] = "ÁY¼g";
    TEXT[ arabic ] = "ÇáÇÎÊÕÇÑ";
    TEXT[ greek ] = "Áñ÷éêÜ";
    TEXT[ korean ] = "¸Ó¸®±ÛÀÚ";
    TEXT[ turkish ] = "Baþharfler";
    TEXT[ language_user1 ] = " ";
};
String FLD_EU_STRASSE
{
    TEXT = "Straße" ;
    TEXT [ English ] = "Street" ;
    TEXT [ norwegian ] = "Street" ;
    TEXT [ italian ] = "Via" ;
    TEXT [ portuguese_brazilian ] = "Rua" ;
    TEXT [ portuguese ] = "Rua" ;
    TEXT [ finnish ] = "Lähiosoite" ;
    TEXT [ danish ] = "Gade" ;
    TEXT [ french ] = "Rue" ;
    TEXT [ swedish ] = "Gata" ;
    TEXT [ dutch ] = "Straat" ;
    TEXT [ spanish ] = "Calle" ;
    TEXT [ english_us ] = "Street" ;
    TEXT[ chinese_simplified ] = "½ÖµÀ";
    TEXT[ russian ] = "Óëèöà";
    TEXT[ polish ] = "Ulica";
    TEXT[ japanese ] = "Žs’¬‘º–¼";
    TEXT[ chinese_traditional ] = "µó¹D";
    TEXT[ arabic ] = "ÇáÔÇÑÚ";
    TEXT[ greek ] = "Ïäüò";
    TEXT[ korean ] = "ÁÖ¼Ò¹øÁö";
    TEXT[ turkish ] = "Sokak";
    TEXT[ language_user1 ] = " ";
};
String FLD_EU_LAND
{
    TEXT = "Land" ;
    TEXT [ English ] = "Country" ;
    TEXT [ norwegian ] = "Country" ;
    TEXT [ italian ] = "Paese" ;
    TEXT [ portuguese_brazilian ] = "País" ;
    TEXT [ portuguese ] = "País" ;
    TEXT [ finnish ] = "Valtio" ;
    TEXT [ danish ] = "Land" ;
    TEXT [ french ] = "Pays" ;
    TEXT [ swedish ] = "Land" ;
    TEXT [ dutch ] = "Land" ;
    TEXT [ spanish ] = "País" ;
    TEXT [ english_us ] = "Country" ;
    TEXT[ chinese_simplified ] = "¹ú¼Ò";
    TEXT[ russian ] = "Ñòðàíà";
    TEXT[ polish ] = "Kraj";
    TEXT[ japanese ] = "‘–¼";
    TEXT[ chinese_traditional ] = "°ê®a";
    TEXT[ arabic ] = "ÇáÈáÏ";
    TEXT[ greek ] = "×þñá";
    TEXT[ korean ] = "±¹°¡";
    TEXT[ turkish ] = "Ülke";
    TEXT[ language_user1 ] = " ";
};
String FLD_EU_PLZ
{
    TEXT = "PLZ" ;
    TEXT [ English ] = "ZIP Code" ;
    TEXT [ norwegian ] = "ZIP Code" ;
    TEXT [ italian ] = "C.A.P." ;
    TEXT [ portuguese_brazilian ] = "CEP" ;
    TEXT [ portuguese ] = "CP" ;
    TEXT [ finnish ] = "Postinro" ;
    TEXT [ danish ] = "Postnr." ;
    TEXT [ french ] = "Code postal" ;
    TEXT [ swedish ] = "Postnummer" ;
    TEXT [ dutch ] = "Postcode" ;
    TEXT [ spanish ] = "CP" ;
    TEXT [ english_us ] = "Zip code" ;
    TEXT[ chinese_simplified ] = "Óʱà";
    TEXT[ russian ] = "Ïî÷òîâûé èíäåêñ";
    TEXT[ polish ] = "Kod pocztowy";
    TEXT[ japanese ] = "—X•֔ԍ†";
    TEXT[ chinese_traditional ] = "¶l»¼°Ï¸¹";
    TEXT[ arabic ] = "ÇáÑãÒ ÇáÈÑíÏí";
    TEXT[ greek ] = "Ô.Ê.";
    TEXT[ korean ] = "¿ìÆò¹øÈ£";
    TEXT[ turkish ] = "P.Kodu";
    TEXT[ language_user1 ] = " ";
};
String FLD_EU_ORT
{
    TEXT = "Ort" ;
    TEXT [ English ] = "City" ;
    TEXT [ norwegian ] = "City" ;
    TEXT [ italian ] = "Località" ;
    TEXT [ portuguese_brazilian ] = "Cidade" ;
    TEXT [ portuguese ] = "Cidade" ;
    TEXT [ finnish ] = "Kaupunki" ;
    TEXT [ danish ] = "By" ;
    TEXT [ french ] = "Ville" ;
    TEXT [ swedish ] = "Stad" ;
    TEXT [ dutch ] = "Plaats" ;
    TEXT [ spanish ] = "Ciudad" ;
    TEXT [ english_us ] = "City" ;
    TEXT[ chinese_simplified ] = "λÖÃ";
    TEXT[ russian ] = "Ãîðîä";
    TEXT[ polish ] = "MiejscowoϾ";
    TEXT[ japanese ] = "B–¼A“s“¹•{Œ§–¼";
    TEXT[ chinese_traditional ] = "¦ì¸m";
    TEXT[ arabic ] = "ÇáãÏíäÉ";
    TEXT[ greek ] = "Ðüëç";
    TEXT[ korean ] = "½Ã";
    TEXT[ turkish ] = "Þehir";
    TEXT[ language_user1 ] = " ";
};
String FLD_EU_TITEL
{
    TEXT = "Titel" ;
    TEXT [ English ] = "Titel" ;
    TEXT [ norwegian ] = "Tittel" ;
    TEXT [ italian ] = "Titolo" ;
    TEXT [ portuguese_brazilian ] = "Títilo" ;
    TEXT [ portuguese ] = "Título" ;
    TEXT [ finnish ] = "Otsikko" ;
    TEXT [ danish ] = "Titel" ;
    TEXT [ french ] = "Titre" ;
    TEXT [ swedish ] = "Rubrik" ;
    TEXT [ dutch ] = "Titel" ;
    TEXT [ spanish ] = "Título" ;
    TEXT [ english_us ] = "Title" ;
    TEXT[ chinese_simplified ] = "Í·ÏÎ";
    TEXT[ russian ] = "Òèòóë";
    TEXT[ polish ] = "Tytu³";
    TEXT[ japanese ] = "Œ¨‘‚«";
    TEXT[ chinese_traditional ] = "ÀY»Î";
    TEXT[ arabic ] = "ÇáãÓãì ÇáæÙíÝí";
    TEXT[ greek ] = "Ôßôëïò";
    TEXT[ korean ] = "Á¦¸ñ";
    TEXT[ turkish ] = "Unvan";
    TEXT[ language_user1 ] = " ";
};
String FLD_EU_POS
{
    TEXT = "Position" ;
    TEXT [ English ] = "Position" ;
    TEXT [ norwegian ] = "Posisjon" ;
    TEXT [ italian ] = "Posizione" ;
    TEXT [ portuguese_brazilian ] = "Posição" ;
    TEXT [ portuguese ] = "Posição" ;
    TEXT [ finnish ] = "Sijainti" ;
    TEXT [ danish ] = "Stilling" ;
    TEXT [ french ] = "Position" ;
    TEXT [ swedish ] = "Position" ;
    TEXT [ dutch ] = "Positie" ;
    TEXT [ spanish ] = "Posición" ;
    TEXT [ english_us ] = "Position" ;
    TEXT[ chinese_simplified ] = "λÖÃ";
    TEXT[ russian ] = "Äîëæíîñòü";
    TEXT[ polish ] = "Pozycja";
    TEXT[ japanese ] = "ˆÊ’u";
    TEXT[ chinese_traditional ] = "¦ì¸m";
    TEXT[ arabic ] = "ÇáãÑßÒ";
    TEXT[ greek ] = "ÈÝóç";
    TEXT[ korean ] = "Á÷À§";
    TEXT[ turkish ] = "Pozisyon";
    TEXT[ language_user1 ] = " ";
};
String FLD_EU_TELPRIV
{
    TEXT = "Tel. (Privat)" ;
    TEXT [ English ] = "Phone (private)" ;
    TEXT [ norwegian ] = "Phone (private)" ;
    TEXT [ italian ] = "Telefono (priv.)" ;
    TEXT [ portuguese_brazilian ] = "Fone (privado)" ;
    TEXT [ portuguese ] = "Tel. (part.)" ;
    TEXT [ finnish ] = "Puhelin (kotiin)" ;
    TEXT [ danish ] = "Tlf. (privat)" ;
    TEXT [ french ] = "Tél. (domicile)" ;
    TEXT [ swedish ] = "Tfn. (privat)" ;
    TEXT [ dutch ] = "Tel. (privé)" ;
    TEXT [ spanish ] = "Tel. (Priv.)" ;
    TEXT [ english_us ] = "Tel. (Home)" ;
    TEXT[ chinese_simplified ] = "µç»°(˽ÈË)";
    TEXT[ russian ] = "Òåë. (äîìàøíèé)";
    TEXT[ polish ] = "Tel. (prywatny)";
    TEXT[ japanese ] = "Tel.(Ž©‘î)";
    TEXT[ chinese_traditional ] = "¹q¸Ü(¨p¤H)";
    TEXT[ arabic ] = "ÇáåÇÊÝ (ãäÒá)";
    TEXT[ greek ] = "Ôçë. (Ïéêßá)";
    TEXT[ korean ] = "ÀüÈ­¹øÈ£ (Áý)";
    TEXT[ turkish ] = "Tlf. (Ev)";
    TEXT[ language_user1 ] = " ";
};
String FLD_EU_TELFIRMA
{
    TEXT = "Tel. (Geschäft)" ;
    TEXT [ English ] = "Phone (Company)" ;
    TEXT [ norwegian ] = "Phone (Company)" ;
    TEXT [ italian ] = "Telefono (uff.)" ;
    TEXT [ portuguese_brazilian ] = "Fone (Compania)" ;
    TEXT [ portuguese ] = "Tel. (empr.)" ;
    TEXT [ finnish ] = "Puhelin (työhön)" ;
    TEXT [ danish ] = "Tlf. (arbejde)" ;
    TEXT [ french ] = "Tél. (bureau)" ;
    TEXT [ swedish ] = "Tfn. (företag)" ;
    TEXT [ dutch ] = "Tel. (Bedrijf)" ;
    TEXT [ spanish ] = "Tel. (Emp.)" ;
    TEXT [ english_us ] = "Tel. (Work)" ;
    TEXT[ chinese_simplified ] = "µç»°(°ì¹«ÊÒ)";
    TEXT[ russian ] = "Òåë. (ñëóæåáíûé)";
    TEXT[ polish ] = "Tel. (firmowy)";
    TEXT[ japanese ] = "Tel.(‹Î–±æ)";
    TEXT[ chinese_traditional ] = "¹q¸Ü(¿ì¤½«Ç)";
    TEXT[ arabic ] = "ÇáåÇÊÝ (Úãá)";
    TEXT[ greek ] = "Ôçë. (Åñãáóßá)";
    TEXT[ korean ] = "ÀüÈ­¹øÈ£. (Á÷Àå)";
    TEXT[ turkish ] = "Tlf. (Ýþ)";
    TEXT[ language_user1 ] = " ";
};
String FLD_EU_FAX
{
    TEXT = "FAX" ;
};
String FLD_EU_EMAIL
{
    TEXT = "E-Mail" ;
    TEXT [ English ] = "E-mail" ;
    Text [ portuguese ] = "E-mail" ;
    Text [ english_us ] = "E-mail" ;
    Text [ portuguese_brazilian ] = "E-Mail" ;
    Text [ swedish ] = "E-post" ;
    Text [ danish ] = "E-mail" ;
    Text [ italian ] = "eMail" ;
    Text [ spanish ] = "E-mail" ;
    Text [ french ] = "E-Mail" ;
    Text [ dutch ] = "E-mail" ;
    Text[ chinese_simplified ] = "µç×ÓÓʼþ";
    Text[ russian ] = "Àäðåñ ýë. ïî÷òû";
    Text[ polish ] = "e-mail";
    Text[ japanese ] = "E-mail";
    Text[ chinese_traditional ] = "¹q¤l¶l¥ó";
    Text[ arabic ] = "ÈÑíÏ ÅáßÊÑæäí";
    Text[ greek ] = "E-mail";
    Text[ korean ] = "ÀüÀÚ¿ìÆí";
    Text[ turkish ] = "E-posta";
    Text[ language_user1 ] = " ";
};
String FLD_EU_STATE
{
    Text = "Staat" ;
    Text [ English ] = "State" ;
    Text [ english_us ] = "State" ;
    Text [ italian ] = "Stato" ;
    Text [ spanish ] = "Estado" ;
    Text [ french ] = "Région" ;
    Text [ dutch ] = "Staat" ;
    Text [ danish ] = "Stat" ;
    Text [ portuguese_brazilian ] = "Staat" ;
    Text [ portuguese ] = "Estado" ;
    Text [ swedish ] = "Stat" ;
    Text[ chinese_simplified ] = "Ê¡ÊÐ";
    Text[ russian ] = "Îáëàñòü";
    Text[ polish ] = "Pañstwo";
    Text[ japanese ] = "‘–¼";
    Text[ chinese_traditional ] = "¬Ù¥«";
    Text[ arabic ] = "ÇáæáÇíÉ";
    Text[ greek ] = "×þñá";
    Text[ korean ] = "ÁÖ";
    Text[ turkish ] = "Ýl";
    Text[ language_user1 ] = " ";
};
String FLD_PAGEREF_OFF
{
    TEXT = "aus" ;
    TEXT [ English ] = "off" ;
    Text [ english_us ] = "off" ;
    Text [ italian ] = "off" ;
    Text [ spanish ] = "de" ;
    Text [ french ] = "désactivé" ;
    Text [ dutch ] = "uit" ;
    Text [ swedish ] = "av" ;
    Text [ danish ] = "deaktiveret" ;
    Text [ portuguese ] = "desligado" ;
    Text [ portuguese_brazilian ] = "aus" ;
    Text[ chinese_simplified ] = "ʧ»î";
    Text[ russian ] = "âûêë.";
    Text[ polish ] = "wy³¹cz";
    Text[ japanese ] = "µÌ";
    Text[ chinese_traditional ] = "¥¢¬¡";
    Text[ arabic ] = "ÅíÞÇÝ";
    Text[ greek ] = "áðåíåñãïðïßçóç";
    Text[ korean ] = "ÇØÁ¦";
    Text[ turkish ] = "kapalý";
    Text[ language_user1 ] = " ";
};
String FLD_PAGEREF_ON
{
    TEXT = "an" ;
    TEXT [ English ] = "on" ;
    Text [ english_us ] = "on" ;
    Text [ italian ] = "on" ;
    Text [ spanish ] = "en" ;
    Text [ french ] = "activé" ;
    Text [ dutch ] = "aan" ;
    Text [ swedish ] = "på" ;
    Text [ danish ] = "aktiveret" ;
    Text [ portuguese ] = "ligado" ;
    Text [ portuguese_brazilian ] = "an" ;
    Text[ chinese_simplified ] = "ÖÁ";
    Text[ russian ] = "âêë.";
    Text[ polish ] = "w³¹cz";
    Text[ japanese ] = "µÝ";
    Text[ chinese_traditional ] = "¦¬¥óªÌ";
    Text[ arabic ] = "ÊÔÛíá";
    Text[ greek ] = "åíåñãïðïßçóç";
    Text[ korean ] = "ÀÛµ¿";
    Text[ turkish ] = "Açýk";
    Text[ language_user1 ] = " ";
};
/*--------------------------------------------------------------------
    Beschreibung: Pfadname
 --------------------------------------------------------------------*/
 // Formate FileName
String FMT_FF_NAME
{
    TEXT = "Dateiname" ;
    TEXT [ English ] = "Filename" ;
    TEXT [ norwegian ] = "Filename" ;
    TEXT [ italian ] = "Nome file" ;
    TEXT [ portuguese_brazilian ] = "Nome do Arquivo" ;
    TEXT [ portuguese ] = "Nome do ficheiro" ;
    TEXT [ finnish ] = "Tiedostonimi" ;
    TEXT [ danish ] = "Filnavn" ;
    TEXT [ french ] = "Nom de fichier" ;
    TEXT [ swedish ] = "Filnamn" ;
    TEXT [ dutch ] = "Naam bestand" ;
    TEXT [ spanish ] = "Nombre del archivo" ;
    TEXT [ english_us ] = "File name" ;
    TEXT[ chinese_simplified ] = "ÎļþÃû";
    TEXT[ russian ] = "Èìÿ ôàéëà";
    TEXT[ polish ] = "Nazwa pliku";
    TEXT[ japanese ] = "̧²Ù–¼";
    TEXT[ chinese_traditional ] = "ÀɮצWºÙ";
    TEXT[ arabic ] = "ÇÓã ÇáãáÝ";
    TEXT[ greek ] = "¼íïìá áñ÷åßïõ";
    TEXT[ korean ] = "ÆÄÀÏ À̸§";
    TEXT[ turkish ] = "Dosya adý";
    TEXT[ language_user1 ] = " ";
};
String FMT_FF_NAME_NOEXT
{
    TEXT = "Dateiname ohne Erweiterung" ;
    TEXT [ English ] = "Filename without extension" ;
    Text [ portuguese ] = "Nome do ficheiro sem extensão" ;
    Text [ english_us ] = "File name without extension" ;
    Text [ portuguese_brazilian ] = "Dateiname ohne Erweiterung" ;
    Text [ swedish ] = "Filnamn utan tillägg" ;
    Text [ danish ] = "Filnavn uden filtypenavn" ;
    Text [ italian ] = "File senza estensione" ;
    Text [ spanish ] = "Nombre del archivo sin extensión" ;
    Text [ french ] = "Nom de fichier sans extension" ;
    Text [ dutch ] = "Bestandsnaam zonder extensie" ;
    Text[ chinese_simplified ] = "²»º¬À©Õ¹ÃûµÄÎļþÃû";
    Text[ russian ] = "Èìÿ ôàéëà áåç ðàñøèðåíèÿ";
    Text[ polish ] = "Nazwa pliku bez rozszerzenia";
    Text[ japanese ] = "Šg’£Žq‚È‚µ‚Ì̧²Ù–¼";
    Text[ chinese_traditional ] = "¤£§t°ÆÀɦWªºÀɮצWºÙ";
    Text[ arabic ] = "ÇÓã ãáÝ ÈÏæä ÇãÊÏÇÏ";
    Text[ greek ] = "¼íïìá áñ÷åßïõ ÷ùñßò åðÝêôáóç";
    Text[ korean ] = "È®ÀåÀÚ ¾ø´Â ÆÄÀÏ À̸§";
    Text[ turkish ] = "Uzantýsýz dosya adý";
    Text[ language_user1 ] = " ";
};
String FMT_FF_PATHNAME
{
    TEXT = "Pfad/Dateiname" ;
    TEXT [ English ] = "Path/Filename" ;
    TEXT [ norwegian ] = "Path/Filename" ;
    TEXT [ italian ] = "Percorso/Nome file" ;
    TEXT [ portuguese_brazilian ] = "Caminho/Nome do arquivo" ;
    TEXT [ portuguese ] = "Atalho/Nome do ficheiro" ;
    TEXT [ finnish ] = "Polku/Tiedostonimi" ;
    TEXT [ danish ] = "Sti/Filnavn" ;
    TEXT [ french ] = "Chemin/Nom de fichier" ;
    TEXT [ swedish ] = "Sökväg/Filnamn" ;
    TEXT [ dutch ] = "Pad/Bestandsnaam" ;
    TEXT [ spanish ] = "Ruta de acceso/Nombre de archivo" ;
    TEXT [ english_us ] = "Path/File name" ;
    TEXT[ chinese_simplified ] = "·¾¶/ÎļþÃû";
    TEXT[ russian ] = "Ïóòü/Èìÿ ôàéëà";
    TEXT[ polish ] = "Œcie¿ka/Nazwa pliku";
    TEXT[ japanese ] = "Êß½/̧²Ù–¼";
    TEXT[ chinese_traditional ] = "¸ô®|©MÀɮצW";
    TEXT[ arabic ] = "ÇáãÓÇÑ/ÇÓã ÇáãáÝ";
    TEXT[ greek ] = "ÄéáäñïìÞ/¼íïìá áñ÷åßïõ";
    TEXT[ korean ] = "°æ·Î/ÆÄÀÏ À̸§";
    TEXT[ turkish ] = "Veri yolu/Dosya adý";
    TEXT[ language_user1 ] = " ";
};
String FMT_FF_PATH
{
    TEXT = "Pfad" ;
    TEXT [ English ] = "Path" ;
    TEXT [ norwegian ] = "Bane" ;
    TEXT [ italian ] = "Percorso" ;
    TEXT [ portuguese_brazilian ] = "Caminho" ;
    TEXT [ portuguese ] = "Atalho" ;
    TEXT [ finnish ] = "Polku" ;
    TEXT [ danish ] = "Sti" ;
    TEXT [ french ] = "Chemin" ;
    TEXT [ swedish ] = "Sökväg" ;
    TEXT [ dutch ] = "Pad" ;
    TEXT [ spanish ] = "Ruta" ;
    TEXT [ english_us ] = "Path" ;
    TEXT[ chinese_simplified ] = "·¾¶";
    TEXT[ russian ] = "Ïóòü";
    TEXT[ polish ] = "Œcie¿ka";
    TEXT[ japanese ] = "Êß½";
    TEXT[ chinese_traditional ] = "¸ô®|";
    TEXT[ arabic ] = "ÇáãÓÇÑ";
    TEXT[ greek ] = "ÄéáäñïìÞ";
    TEXT[ korean ] = "°æ·Î";
    TEXT[ turkish ] = "Veri yolu";
};
String FMT_FF_UI_NAME
{
    TEXT = "Vorlage" ;
    TEXT [ English ] = "Template" ;
    Text [ portuguese ] = "Estilo" ;
    Text [ english_us ] = "Style" ;
    Text [ portuguese_brazilian ] = "Vorlage" ;
    Text [ swedish ] = "Mall" ;
    Text [ danish ] = "Skabelon" ;
    Text [ italian ] = "Modello" ;
    Text [ spanish ] = "Plantilla" ;
    Text [ french ] = "Style" ;
    Text [ dutch ] = "Sjabloon" ;
    Text[ chinese_simplified ] = "Ñùʽ";
    Text[ russian ] = "Øàáëîí";
    Text[ polish ] = "Szablon";
    Text[ japanese ] = "ÃÝÌßÚ°Ä";
    Text[ chinese_traditional ] = "¼Ë¦¡";
    Text[ arabic ] = "ÞÇáÈ";
    Text[ greek ] = "Ðñüôõðï";
    Text[ korean ] = "ÅÛÇø®Æ®";
    Text[ turkish ] = "Þablon";
    Text[ language_user1 ] = " ";
};
String FMT_FF_UI_RANGE
{
    TEXT = "Bereich" ;
    TEXT [ English ] = "Group" ;
    Text [ portuguese ] = "Área" ;
    Text [ english_us ] = "Area" ;
    Text [ portuguese_brazilian ] = "Bereich" ;
    Text [ swedish ] = "Område" ;
    Text [ danish ] = "Område" ;
    Text [ italian ] = "Sezione" ;
    Text [ spanish ] = "Area" ;
    Text [ french ] = "Plage" ;
    Text [ dutch ] = "Bereik" ;
    Text[ chinese_simplified ] = "ÇøÓò";
    Text[ russian ] = "Îáëàñòü";
    Text[ polish ] = "Obszar";
    Text[ japanese ] = "”͈Í";
    Text[ chinese_traditional ] = "°Ï°ì";
    Text[ arabic ] = "äØÇÞ";
    Text[ greek ] = "Ðåñéï÷Þ";
    Text[ korean ] = "¿µ¿ª";
    Text[ turkish ] = "Aralýk";
    Text[ language_user1 ] = " ";
};
/*--------------------------------------------------------------------
    Beschreibung: Format Kapitel
 --------------------------------------------------------------------*/
String FMT_CHAPTER_NAME
{
    TEXT = "Kapitelname" ;
    TEXT [ English ] = "Chapter name" ;
    TEXT [ norwegian ] = "Chapter name" ;
    TEXT [ italian ] = "Nome capitolo" ;
    TEXT [ portuguese_brazilian ] = "Nome do capítulo" ;
    TEXT [ portuguese ] = "Nome do capítulo" ;
    TEXT [ finnish ] = "Luvun nimi" ;
    TEXT [ danish ] = "Kapitelnavn" ;
    TEXT [ french ] = "Nom de chapitre" ;
    TEXT [ swedish ] = "Kapitelnamn" ;
    TEXT [ dutch ] = "Naam hoofdstuk" ;
    TEXT [ spanish ] = "Nombre del capítulo" ;
    TEXT [ english_us ] = "Chapter name" ;
    TEXT[ chinese_simplified ] = "ÕÂÃû³Æ";
    TEXT[ russian ] = "Íàçâàíèå ãëàâû";
    TEXT[ polish ] = "Nazwa rozdzia³u";
    TEXT[ japanese ] = "Í‚Ì–¼Ì";
    TEXT[ language_user1 ] = " ";
    TEXT[ chinese_traditional ] = "³¹¦WºÙ";
    TEXT[ arabic ] = "ÇÓã ÇáÝÕá";
    TEXT[ greek ] = "¼íïìá êåöáëáßïõ";
    TEXT[ korean ] = "Àå À̸§";
    TEXT[ turkish ] = "Bölüm adý";
};
String FMT_CHAPTER_NO
{
    TEXT = "Kapitelnummer" ;
    TEXT [ English ] = "Chapter number" ;
    Text [ portuguese ] = "Número do capítulo" ;
    Text [ english_us ] = "Chapter number" ;
    Text [ portuguese_brazilian ] = "Número do capítulo" ;
    Text [ swedish ] = "Kapitelnummer" ;
    Text [ danish ] = "Kapitelnummer" ;
    Text [ italian ] = "Numero capitolo" ;
    Text [ spanish ] = "Número del capítulo" ;
    Text [ french ] = "Numéro de chapitre" ;
    Text [ dutch ] = "Nummer hoofdstuk" ;
    Text[ chinese_simplified ] = "Õ±àºÅ";
    Text[ russian ] = "Íîìåð ãëàâû";
    Text[ polish ] = "Numer rozdzia³u";
    Text[ japanese ] = "Í”ԍ†";
    Text[ chinese_traditional ] = "³¹½s¸¹";
    Text[ arabic ] = "ÑÞã ÇáÝÕá";
    Text[ greek ] = "Áñéèìüò êåöáëáßïõ";
    Text[ korean ] = "Àå ¹øÈ£";
    Text[ turkish ] = "Bölüm numarasý";
    Text[ language_user1 ] = " ";
};
String FMT_CHAPTER_NO_NOSEPARATOR
{
    TEXT = "Kapitelnummer ohne Trennzeichen" ;
    TEXT [ English ] = "Chapter number without separator" ;
    Text [ portuguese ] = "Número de capítulo sem separador" ;
    Text [ english_us ] = "Chapter number without separator" ;
    Text [ portuguese_brazilian ] = "Kapitelnummer ohne Trennzeichen" ;
    Text [ swedish ] = "Kapitelnummer utan skiljetecken" ;
    Text [ danish ] = "Kapitelnummer uden skilletegn" ;
    Text [ italian ] = "Numero di capitolo senza separatore" ;
    Text [ spanish ] = "Número de capítulo sin separador" ;
    Text [ french ] = "Numéro de chapitre sans séparateur" ;
    Text [ dutch ] = "Hoofdstuknummer zonder scheidingstekens" ;
    Text[ chinese_simplified ] = "Õ±àºÅ²»´øÁ¬×Ö·û";
    Text[ russian ] = "Íîìåð ãëàâû áåç ðàçäåëèòåëÿ";
    Text[ polish ] = "Numer rozdzia³u bez separatora";
    Text[ japanese ] = "ʲÌ݂Ȃµ‚͔̏ԍ†";
    Text[ chinese_traditional ] = "³¹½s¸¹¤£±a³s¦r²Å";
    Text[ arabic ] = "ÑÞã ÇáÝÕá ÈÏæä ÝÇÕá";
    Text[ greek ] = "Áñéèìüò êåöáëáßïõ ÷ùñßò åíùôéêü";
    Text[ korean ] = "±¸ºÐÀÚ ¾ø´Â Àå ¹øÈ£";
    Text[ turkish ] = "Ayýrma iþareti içermeyen bölüm numarasý";
    Text[ language_user1 ] = " ";
};
String FMT_CHAPTER_NAMENO
{
    /* ### ACHTUNG: Neuer Text in Resource? Kapitelnummer und Name : Nummer und Name */
    TEXT = "Kapitelnummer und Name" ;
    TEXT [ English ] = "Chapter number and name" ;
    Text [ portuguese ] = "Número e nome do capítulo" ;
    Text [ english_us ] = "Chapter number and name" ;
    Text [ portuguese_brazilian ] = "Número e nome" ;
    Text [ swedish ] = "Kapitelnummer och namn" ;
    Text [ danish ] = "Kapitelnummer og navn" ;
    Text [ italian ] = "Numero di capitolo e nome" ;
    Text [ spanish ] = "Número y nombre" ;
    Text [ french ] = "Numéro et nom de chapitre" ;
    Text [ dutch ] = "Hoofdstuknummer en naam" ;
    Text[ chinese_simplified ] = "Õ±àºÅºÍÃû³Æ";
    Text[ russian ] = "Íàçâàíèå è íîìåð ãëàâû";
    Text[ polish ] = "Numer i nazwa rozdzia³u";
    Text[ japanese ] = "Í‚̔ԍ†‚Æ–¼Ì";
    Text[ chinese_traditional ] = "³¹½s¸¹©M¦WºÙ";
    Text[ arabic ] = "ÑÞã æÇÓã ÇáÝÕá";
    Text[ greek ] = "Áñéèìüò êåöáëáßïõ êáé üíïìá";
    Text[ korean ] = "Àå ¹øÈ£¿Í À̸§";
    Text[ turkish ] = "Bölüm numarasý ve adý";
    Text[ language_user1 ] = " ";
};
/*--------------------------------------------------------------------
    Beschreibung: Formate
 --------------------------------------------------------------------*/
String FMT_NUM_ABC
{
    TEXT = "A B C" ;
};
String FMT_NUM_SABC
{
    TEXT = "a b c" ;
};
String FMT_NUM_ABC_N
{
    TEXT = "A .. AA .. AAA" ;
};
String FMT_NUM_SABC_N
{
    TEXT = "a .. aa .. aaa" ;
};
String FMT_NUM_ROMAN
{
    TEXT = "Römisch (I II III)" ;
    TEXT [ English ] = "Roman (I II III)" ;
    TEXT [ norwegian ] = "Roman (I II III)" ;
    TEXT [ italian ] = "Romani (I II III)" ;
    TEXT [ portuguese_brazilian ] = "Romano (I II III)" ;
    TEXT [ portuguese ] = "Romano (I II III)" ;
    TEXT [ finnish ] = "Roomalainen (I II III)" ;
    TEXT [ danish ] = "Romertal (I II III)" ;
    TEXT [ french ] = "Romain (I II III)" ;
    TEXT [ swedish ] = "Romerska siffror (I II III)" ;
    TEXT [ dutch ] = "Romeins (I II III)" ;
    TEXT [ spanish ] = "Romanos (I II III)" ;
    TEXT [ english_us ] = "Roman (I II III)" ;
    TEXT[ chinese_simplified ] = "ÂÞÂíÊý×Ö(I II III)";
    TEXT[ russian ] = "Ðèìñêèå (I II III)";
    TEXT[ polish ] = "Rzymskie (I II III)";
    TEXT[ japanese ] = "۰ϐ”Žš (I II III)";
    TEXT[ chinese_traditional ] = "ù°¨¼Æ¦r(I II III)";
    TEXT[ arabic ] = "ÃÑÞÇã ÑæãÇäíÉ (III II I)";
    TEXT[ greek ] = "ÑùìáúêÜ (I II III)";
    TEXT[ korean ] = "·Î¸¶½Ä (I II III)";
    TEXT[ turkish ] = "Roma (I II III)";
    TEXT[ language_user1 ] = " ";
};
String FMT_NUM_SROMAN
{
    TEXT = "Römisch (i ii iii)" ;
    TEXT [ English ] = "Roman (i ii iii)" ;
    TEXT [ norwegian ] = "Roman (i ii iii)" ;
    TEXT [ italian ] = "Romani  (i ii iii)" ;
    TEXT [ portuguese_brazilian ] = "Romano (i ii iii)" ;
    TEXT [ portuguese ] = "Romano (i ii iii)" ;
    TEXT [ finnish ] = "Roomalainen (i ii iii)" ;
    TEXT [ danish ] = "Romertal (i ii iii)" ;
    TEXT [ french ] = "Romain (i ii iii)" ;
    TEXT [ swedish ] = "Romerska siffror (i ii iii)" ;
    TEXT [ dutch ] = "Romeins (i ii iii)" ;
    TEXT [ spanish ] = "Romanos (i ii iii)" ;
    TEXT [ english_us ] = "Roman (i ii iii)" ;
    TEXT[ chinese_simplified ] = "ÂÞÂíÊý×Ö(i ii iii)";
    TEXT[ russian ] = "Ðèìñêèå (i ii iii)";
    TEXT[ polish ] = "Rzymskie (i ii iii)";
    TEXT[ japanese ] = "۰ϐ”Žš (i ii iii)";
    TEXT[ chinese_traditional ] = "ù°¨¼Æ¦r(i ii iii)";
    TEXT[ arabic ] = "ÃÑÞÇã ÑæãÇäíÉ (iii ii i)";
    TEXT[ greek ] = "ÑùìáúêÜ (i ii iii)";
    TEXT[ korean ] = "·Î¸¶½Ä (i ii iii)";
    TEXT[ turkish ] = "Roma (i ii iii)";
    TEXT[ language_user1 ] = " ";
};
String FMT_NUM_ARABIC
{
    TEXT = "Arabisch (1 2 3)" ;
    TEXT [ English ] = "Arabic (1 2 3)" ;
    TEXT [ norwegian ] = "Arabic (1 2 3)" ;
    TEXT [ italian ] = "Arabi (1 2 3)" ;
    TEXT [ portuguese_brazilian ] = "Arábico (1 2 3)" ;
    TEXT [ portuguese ] = "Arábe (1 2 3)" ;
    TEXT [ finnish ] = "Arabialainen (1 2 3)" ;
    TEXT [ danish ] = "Arabisk (1 2 3)" ;
    TEXT [ french ] = "Arabe (1 2 3)" ;
    TEXT [ swedish ] = "Arabiska siffror (1 2 3)" ;
    TEXT [ dutch ] = "Arabisch (1 2 3)" ;
    TEXT [ spanish ] = "Árabes (1 2 3)" ;
    TEXT [ english_us ] = "Arabic (1 2 3)" ;
    TEXT[ chinese_simplified ] = "°¢À­²®Êý×Ö(1 2 3)";
    TEXT[ russian ] = "Àðàáñêèå (1 2 3)";
    TEXT[ polish ] = "Arabskie (1 2 3)";
    TEXT[ japanese ] = "±×ËÞ±”Žš(1 2 3)";
    TEXT[ chinese_traditional ] = "ªü©Ô§B¼Æ¦r(1 2 3)";
    TEXT[ arabic ] = "ÃÑÞÇã ÚÑÈíÉ (1 2 3)";
    TEXT[ greek ] = "ÁñáâéêÜ (1 2 3)";
    TEXT[ korean ] = "¾Æ¶óºñ¾Æ ½Ä (1 2 3)";
    TEXT[ turkish ] = "Arap (1 2 3)";
    TEXT[ language_user1 ] = " ";
};
String FMT_NUM_PAGEDESC
{
    TEXT = "Wie Seitenvorlage" ;
    TEXT [ English ] = "As Page Style" ;
    TEXT [ norwegian ] = "As Page Style" ;
    TEXT [ italian ] = "Come modello di pagina" ;
    TEXT [ portuguese_brazilian ] = "Como Estilo de Página" ;
    TEXT [ portuguese ] = "Como estilo de página" ;
    TEXT [ finnish ] = "Sivutyylinä" ;
    TEXT [ danish ] = "Som sidetypografi" ;
    TEXT [ french ] = "D'après le style de page" ;
    TEXT [ swedish ] = "Som sidformatmallen" ;
    TEXT [ dutch ] = "Zoals pagina-opmaakprofiel" ;
    TEXT [ spanish ] = "Como estilo de página" ;
    TEXT [ english_us ] = "As Page Style" ;
    TEXT[ chinese_simplified ] = "ºÍÒ³ÃæÑùʽÏàͬ";
    TEXT[ russian ] = "Êàê ñòèëü ñòðàíèöû";
    TEXT[ polish ] = "Jako styl strony";
    TEXT[ japanese ] = "Íß°¼Þ½À²Ù‚̐ݒè‚ð“K—p";
    TEXT[ chinese_traditional ] = "©M­¶­±¼Ë¦¡¬Û¦P";
    TEXT[ arabic ] = "ãËá äãØ ÇáÕÝÍÉ";
    TEXT[ greek ] = "¼ðùò ôï ðñüôõðï óåëßäáò";
    TEXT[ korean ] = "ÆäÀÌÁö À¯Çüó·³";
    TEXT[ turkish ] = "Sayfa biçimi gibi";
    TEXT[ language_user1 ] = " ";
};
String FMT_NUM_PAGESPECIAL
{
    TEXT = "Text" ;
    TEXT [ English ] = "Text" ;
    Text [ english_us ] = "Text" ;
    Text [ italian ] = "Testo" ;
    Text [ spanish ] = "Texto" ;
    Text [ french ] = "Texte" ;
    Text [ dutch ] = "Tekst" ;
    Text [ swedish ] = "Text" ;
    Text [ danish ] = "Tekst" ;
    Text [ portuguese ] = "Texto" ;
    Text [ portuguese_brazilian ] = "Text" ;
    Text[ chinese_simplified ] = "ÎÄ×Ö";
    Text[ russian ] = "Òåêñò";
    Text[ polish ] = "Tekst";
    Text[ japanese ] = "÷½Ä";
    Text[ chinese_traditional ] = "¤å¦r";
    Text[ arabic ] = "äÕ";
    Text[ greek ] = "Êåßìåíï";
    Text[ korean ] = "ÅØ½ºÆ®";
    Text[ turkish ] = "Metin";
    Text[ language_user1 ] = " ";
};
/*--------------------------------------------------------------------
    Beschreibung: Author
 --------------------------------------------------------------------*/
String FMT_AUTHOR_NAME
{
    TEXT = "Name" ;
    TEXT [ English ] = "Name" ;
    TEXT [ norwegian ] = "Navn" ;
    TEXT [ italian ] = "Nome" ;
    TEXT [ portuguese_brazilian ] = "Nomear" ;
    TEXT [ portuguese ] = "Nome" ;
    TEXT [ finnish ] = "Nimi" ;
    TEXT [ danish ] = "Navn" ;
    TEXT [ french ] = "Nom" ;
    TEXT [ swedish ] = "Namn" ;
    TEXT [ dutch ] = "Naam" ;
    TEXT [ spanish ] = "Nombre" ;
    TEXT [ english_us ] = "Name" ;
    TEXT[ chinese_simplified ] = "ÐÕÃû";
    TEXT[ russian ] = "Èìÿ";
    TEXT[ polish ] = "Nazwa";
    TEXT[ japanese ] = "–¼‘O";
    TEXT[ chinese_traditional ] = "©m¦W";
    TEXT[ arabic ] = "ÇáÇÓã";
    TEXT[ greek ] = "¼íïìá";
    TEXT[ korean ] = "À̸§";
    TEXT[ turkish ] = "Ad";
    TEXT[ language_user1 ] = " ";
};
String FMT_AUTHOR_SCUT
{
    TEXT = "Kürzel" ;
    TEXT [ English ] = "Short name" ;
    TEXT [ norwegian ] = "Short name" ;
    TEXT [ italian ] = "Iniziali" ;
    TEXT [ portuguese_brazilian ] = "Abreviação" ;
    TEXT [ portuguese ] = "Iniciais" ;
    TEXT [ finnish ] = "Lyhyt nimi" ;
    TEXT [ danish ] = "Initialer" ;
    TEXT [ french ] = "Abréviation" ;
    TEXT [ swedish ] = "Inititaler" ;
    TEXT [ dutch ] = "Initialen" ;
    TEXT [ spanish ] = "Iniciales" ;
    TEXT [ english_us ] = "Initials" ;
    TEXT[ chinese_simplified ] = "Ëõд";
    TEXT[ russian ] = "Èíèöèàëû";
    TEXT[ polish ] = "Inicja³y";
    TEXT[ japanese ] = "²Æ¼¬Ù";
    TEXT[ chinese_traditional ] = "ÁY¼g";
    TEXT[ arabic ] = "ÇáÇÎÊÕÇÑ";
    TEXT[ greek ] = "Áñ÷éêÜ";
    TEXT[ korean ] = "¸Ó¸®±ÛÀÚ";
    TEXT[ turkish ] = "Baþharfler";
    TEXT[ language_user1 ] = " ";
};
/*--------------------------------------------------------------------
    Beschreibung:   Varibale setzen
 --------------------------------------------------------------------*/
String FMT_SETVAR_SYS
{
    TEXT = "System" ;
    TEXT [ English ] = "System" ;
    Text [ portuguese ] = "Sistema" ;
    Text [ english_us ] = "System" ;
    Text [ portuguese_brazilian ] = "System" ;
    Text [ swedish ] = "System" ;
    Text [ danish ] = "System" ;
    Text [ italian ] = "Sistema" ;
    Text [ spanish ] = "Sistema" ;
    Text [ french ] = "Système" ;
    Text [ dutch ] = "Systeem" ;
    Text[ chinese_simplified ] = "ϵͳ";
    Text[ russian ] = "Ñèñòåìà";
    Text[ polish ] = "System";
    Text[ japanese ] = "¼½ÃÑ";
    Text[ chinese_traditional ] = "¨t²Î";
    Text[ arabic ] = "ÇáäÙÇã";
    Text[ greek ] = "Óýóôçìá";
    Text[ korean ] = "½Ã½ºÅÛ";
    Text[ turkish ] = "Sistem";
    Text[ language_user1 ] = " ";
};
String FMT_SETVAR_TEXT
{
    Text = "Text" ;
    Text [ English ] = "Text" ;
    Text [ dutch ] = "Tekst" ;
    Text [ english_us ] = "Text" ;
    Text [ italian ] = "Testo" ;
    Text [ spanish ] = "Texto" ;
    Text [ french ] = "Texte" ;
    Text [ swedish ] = "Text" ;
    Text [ danish ] = "Tekst" ;
    Text [ portuguese ] = "Texto" ;
    Text [ portuguese_brazilian ] = "Text" ;
    Text[ chinese_simplified ] = "ÎÄ×Ö";
    Text[ russian ] = "Òåêñò";
    Text[ polish ] = "Tekst";
    Text[ japanese ] = "÷½Ä";
    Text[ chinese_traditional ] = "¤å¦r";
    Text[ arabic ] = "äÕ";
    Text[ greek ] = "Êåßìåíï";
    Text[ korean ] = "ÅØ½ºÆ®";
    Text[ turkish ] = "Metin";
    Text[ language_user1 ] = " ";
};
String FMT_GETVAR_NAME
{
    TEXT = "Name" ;
    TEXT [ English ] = "Name" ;
    Text [ portuguese ] = "Nome" ;
    Text [ english_us ] = "Name" ;
    Text [ portuguese_brazilian ] = "Name" ;
    Text [ swedish ] = "Namn" ;
    Text [ danish ] = "Navn" ;
    Text [ italian ] = "Nome" ;
    Text [ spanish ] = "Nombre" ;
    Text [ french ] = "Nom" ;
    Text [ dutch ] = "Naam" ;
    Text[ chinese_simplified ] = "Ãû³Æ";
    Text[ russian ] = "Èìÿ";
    Text[ polish ] = "Nazwa";
    Text[ japanese ] = "–¼‘O";
    Text[ chinese_traditional ] = "¦WºÙ";
    Text[ arabic ] = "ÇáÇÓã";
    Text[ greek ] = "¼íïìá";
    Text[ korean ] = "À̸§";
    Text[ turkish ] = "Ad";
    Text[ language_user1 ] = " ";
};
String FMT_GETVAR_TEXT
{
    Text = "Text" ;
    Text [ English ] = "Text" ;
    Text [ dutch ] = "Tekst" ;
    Text [ english_us ] = "Text" ;
    Text [ italian ] = "Testo" ;
    Text [ spanish ] = "Texto" ;
    Text [ french ] = "Texte" ;
    Text [ swedish ] = "Text" ;
    Text [ danish ] = "Tekst" ;
    Text [ portuguese ] = "Texto" ;
    Text [ portuguese_brazilian ] = "Text" ;
    Text[ chinese_simplified ] = "ÎÄ×Ö";
    Text[ russian ] = "Òåêñò";
    Text[ polish ] = "Tekst";
    Text[ japanese ] = "÷½Ä";
    Text[ chinese_traditional ] = "¤å¦r";
    Text[ arabic ] = "ÇáäÕ";
    Text[ greek ] = "Êåßìåíï";
    Text[ korean ] = "ÅØ½ºÆ®";
    Text[ turkish ] = "Metin";
    Text[ language_user1 ] = " ";
};
String FMT_USERVAR_CMD
{
    TEXT = "Formel" ;
    TEXT [ English ] = "Formula" ;
    Text [ portuguese ] = "Fórmula" ;
    Text [ english_us ] = "Formula" ;
    Text [ portuguese_brazilian ] = "Text" ;
    Text [ swedish ] = "Formel" ;
    Text [ danish ] = "Formel" ;
    Text [ italian ] = "Formula" ;
    Text [ spanish ] = "Fórmula" ;
    Text [ french ] = "Formule" ;
    Text [ dutch ] = "Formule" ;
    Text[ chinese_simplified ] = "¹«Ê½";
    Text[ russian ] = "Ôîðìóëà";
    Text[ polish ] = "Formu³a";
    Text[ japanese ] = "”Ž®";
    Text[ chinese_traditional ] = "¤½¦¡";
    Text[ arabic ] = "ÕíÛÉ";
    Text[ greek ] = "Ôýðïò";
    Text[ korean ] = "¼ö½Ä";
    Text[ turkish ] = "Formül";
    Text[ language_user1 ] = " ";
};
String FMT_USERVAR_TEXT
{
    Text = "Text" ;
    Text [ English ] = "Text" ;
    Text [ dutch ] = "Tekst" ;
    Text [ english_us ] = "Text" ;
    Text [ italian ] = "Testo" ;
    Text [ spanish ] = "Texto" ;
    Text [ french ] = "Texte" ;
    Text [ swedish ] = "Text" ;
    Text [ danish ] = "Tekst" ;
    Text [ portuguese ] = "Texto" ;
    Text [ portuguese_brazilian ] = "Text" ;
    Text[ chinese_simplified ] = "Îı¾";
    Text[ russian ] = "Òåêñò";
    Text[ polish ] = "Tekst";
    Text[ japanese ] = "÷½Ä";
    Text[ chinese_traditional ] = "¤å¦r";
    Text[ arabic ] = "äÕ";
    Text[ greek ] = "Êåßìåíï";
    Text[ korean ] = "ÅØ½ºÆ®";
    Text[ turkish ] = "Metin";
    Text[ language_user1 ] = " ";
};
String FMT_DBFLD_DB
{
    TEXT = "Datenbank" ;
    TEXT [ English ] = "Database" ;
    Text [ portuguese ] = "Base de dados" ;
    Text [ english_us ] = "Database" ;
    Text [ portuguese_brazilian ] = "Datenbank" ;
    Text [ swedish ] = "Databas" ;
    Text [ danish ] = "Database" ;
    Text [ italian ] = "Database" ;
    Text [ spanish ] = "Base de datos" ;
    Text [ french ] = "Base de données" ;
    Text [ dutch ] = "Database" ;
    Text[ chinese_simplified ] = "Êý¾Ý¿â";
    Text[ russian ] = "Áàçà äàííûõ";
    Text[ polish ] = "Baza danych";
    Text[ japanese ] = "ÃÞ°ÀÍÞ°½";
    Text[ chinese_traditional ] = "¸ê®Æ®w";
    Text[ arabic ] = "ÞÇÚÏÉ ÈíÇäÇÊ";
    Text[ greek ] = "ÂÜóç äåäïìÝíùí";
    Text[ korean ] = "µ¥ÀÌÅͺ£À̽º";
    Text[ turkish ] = "Veritabaný";
    Text[ language_user1 ] = " ";
};
String FMT_DBFLD_SYS
{
    TEXT = "System" ;
    TEXT [ English ] = "System" ;
    Text [ portuguese ] = "Sistema" ;
    Text [ english_us ] = "System" ;
    Text [ portuguese_brazilian ] = "System" ;
    Text [ swedish ] = "System" ;
    Text [ danish ] = "System" ;
    Text [ italian ] = "Sistema" ;
    Text [ spanish ] = "Sistema" ;
    Text [ french ] = "Système" ;
    Text [ dutch ] = "Systeem" ;
    Text[ chinese_simplified ] = "ϵͳ";
    Text[ russian ] = "Ñèñòåìà";
    Text[ polish ] = "System";
    Text[ japanese ] = "¼½ÃÑ";
    Text[ chinese_traditional ] = "¨t²Î";
    Text[ arabic ] = "ÇáäÙÇã";
    Text[ greek ] = "Óýóôçìá";
    Text[ korean ] = "½Ã½ºÅÛ";
    Text[ turkish ] = "Sistem";
    Text[ language_user1 ] = " ";
};
/*--------------------------------------------------------------------
    Beschreibung: Ablagefelder
 --------------------------------------------------------------------*/
String FMT_REG_AUTHOR
{
    TEXT = "Autor" ;
    TEXT [ English ] = "Author" ;
    TEXT [ norwegian ] = "Forfatter" ;
    TEXT [ italian ] = "Autore" ;
    TEXT [ portuguese_brazilian ] = "Autor" ;
    TEXT [ portuguese ] = "Autor" ;
    TEXT [ finnish ] = "Tekijä" ;
    TEXT [ danish ] = "Forfatter" ;
    TEXT [ french ] = "Auteur" ;
    TEXT [ swedish ] = "Författare" ;
    TEXT [ dutch ] = "Auteur" ;
    TEXT [ spanish ] = "Autor" ;
    TEXT [ english_us ] = "Author" ;
    TEXT[ chinese_simplified ] = "×÷Õß";
    TEXT[ russian ] = "Àâòîð";
    TEXT[ polish ] = "Autor";
    TEXT[ japanese ] = "ì¬ŽÒ";
    TEXT[ chinese_traditional ] = "§@ªÌ";
    TEXT[ arabic ] = "ÇáãÄáÝ";
    TEXT[ greek ] = "ÓõíôÜêôçò";
    TEXT[ korean ] = "ÀÛ¼ºÀÎ";
    TEXT[ turkish ] = "Yazan";
    TEXT[ language_user1 ] = " ";
};
String FMT_REG_TIME
{
    TEXT = "Uhrzeit" ;
    TEXT [ English ] = "Time" ;
    TEXT [ norwegian ] = "Time" ;
    TEXT [ italian ] = "Orario" ;
    TEXT [ portuguese_brazilian ] = "Hora" ;
    TEXT [ portuguese ] = "Hora" ;
    TEXT [ finnish ] = "Aika" ;
    TEXT [ danish ] = "Klokkeslæt" ;
    TEXT [ french ] = "Heure" ;
    TEXT [ swedish ] = "Klockslag" ;
    TEXT [ dutch ] = "Uur" ;
    TEXT [ spanish ] = "Hora" ;
    TEXT [ english_us ] = "Time" ;
    TEXT[ chinese_simplified ] = "ʱ¼ä";
    TEXT[ russian ] = "Âðåìÿ";
    TEXT[ polish ] = "Godzina";
    TEXT[ japanese ] = "Žž";
    TEXT[ chinese_traditional ] = "®É¶¡";
    TEXT[ arabic ] = "ÇáæÞÊ";
    TEXT[ greek ] = "¿ñá";
    TEXT[ korean ] = "½Ã°£";
    TEXT[ turkish ] = "Saat";
    TEXT[ language_user1 ] = " ";
};
String FMT_REG_DATE
{
    TEXT = "Datum" ;
    TEXT [ English ] = "Date" ;
    TEXT [ norwegian ] = "Date" ;
    TEXT [ italian ] = "Data" ;
    TEXT [ portuguese_brazilian ] = "Data" ;
    TEXT [ portuguese ] = "Data" ;
    TEXT [ finnish ] = "Päiväys" ;
    TEXT [ danish ] = "Dato" ;
    TEXT [ french ] = "Date" ;
    TEXT [ swedish ] = "Datum" ;
    TEXT [ dutch ] = "Datum" ;
    TEXT [ spanish ] = "Fecha" ;
    TEXT [ english_us ] = "Date" ;
    TEXT[ chinese_simplified ] = "ÈÕÆÚ";
    TEXT[ russian ] = "Äàòà";
    TEXT[ polish ] = "Data";
    TEXT[ japanese ] = "“ú•t";
    TEXT[ chinese_traditional ] = "¤é´Á";
    TEXT[ arabic ] = "ÇáÊÇÑíÎ";
    TEXT[ greek ] = "Çìåñïìçíßá";
    TEXT[ korean ] = "ÀÏÀÚ";
    TEXT[ turkish ] = "Tarih";
    TEXT[ language_user1 ] = " ";
};
/*--------------------------------------------------------------------
    Beschreibung: Formate Referenzen
 --------------------------------------------------------------------*/
String FMT_REF_TEXT
{
    TEXT = "Referenztext" ;
    TEXT [ English ] = "Reference" ;
    TEXT [ norwegian ] = "Reference" ;
    TEXT [ italian ] = "Testo di riferimento" ;
    TEXT [ portuguese_brazilian ] = "Referência" ;
    TEXT [ portuguese ] = "Referência" ;
    TEXT [ finnish ] = "Viittaus" ;
    TEXT [ danish ] = "Referencetekst" ;
    TEXT [ french ] = "Texte de référence" ;
    TEXT [ swedish ] = "Referenstext" ;
    TEXT [ dutch ] = "Verwijzingstekst" ;
    TEXT [ spanish ] = "Texto de referencia" ;
    TEXT [ english_us ] = "Reference" ;
    TEXT[ chinese_simplified ] = "˵Ã÷ÎÄ";
    TEXT[ russian ] = "Òåêñò ññûëêè";
    TEXT[ polish ] = "Tekst odwo³añ";
    TEXT[ japanese ] = "ŽQÆ•¶Žš—ñ";
    TEXT[ chinese_traditional ] = "°Ñ·Ó¤å";
    TEXT[ arabic ] = "äÕ ãÑÌÚí";
    TEXT[ greek ] = "Êåßìåíï áíáöïñÜò";
    TEXT[ korean ] = "ÂüÁ¶";
    TEXT[ turkish ] = "Referans metni";
    TEXT[ language_user1 ] = " ";
};
String FMT_REF_PAGE
{
    TEXT = "Seite" ;
    TEXT [ English ] = "Page" ;
    TEXT [ norwegian ] = "Page" ;
    TEXT [ italian ] = "Pagina" ;
    TEXT [ portuguese_brazilian ] = "Página" ;
    TEXT [ portuguese ] = "Página" ;
    TEXT [ finnish ] = "Sivu" ;
    TEXT [ danish ] = "Side" ;
    TEXT [ french ] = "Page" ;
    TEXT [ swedish ] = "Sida" ;
    TEXT [ dutch ] = "Pagina" ;
    TEXT [ spanish ] = "Página" ;
    TEXT [ english_us ] = "Page" ;
    TEXT[ chinese_simplified ] = "ҳ";
    TEXT[ russian ] = "Ñòðàíèöà";
    TEXT[ polish ] = "Strona";
    TEXT[ japanese ] = "Íß°¼Þ";
    TEXT[ chinese_traditional ] = "­¶";
    TEXT[ arabic ] = "ÕÝÍÉ";
    TEXT[ greek ] = "Óåëßäá";
    TEXT[ korean ] = "ÆäÀÌÁö";
    TEXT[ turkish ] = "Sayfa";
    TEXT[ language_user1 ] = " ";
};
String FMT_REF_CHAPTER
{
    TEXT = "Kapitel" ;
    TEXT [ English ] = "Chapter" ;
    TEXT [ norwegian ] = "Chapter" ;
    TEXT [ italian ] = "Capitolo" ;
    TEXT [ portuguese_brazilian ] = "Capítulo" ;
    TEXT [ portuguese ] = "Capítulo" ;
    TEXT [ finnish ] = "Luku" ;
    TEXT [ danish ] = "Kapitel" ;
    TEXT [ french ] = "Chapitre" ;
    TEXT [ swedish ] = "Kapitel" ;
    TEXT [ dutch ] = "Hoofdstuk" ;
    TEXT [ spanish ] = "Capítulo" ;
    TEXT [ english_us ] = "Chapter" ;
    TEXT[ chinese_simplified ] = "ÕÂ";
    TEXT[ russian ] = "Ãëàâà";
    TEXT[ polish ] = "Rozdzia³";
    TEXT[ japanese ] = "Í";
    TEXT[ language_user1 ] = " ";
    TEXT[ chinese_traditional ] = "³¹";
    TEXT[ arabic ] = "ÇáÝÕá";
    TEXT[ greek ] = "ÊåöÜëáéï";
    TEXT[ korean ] = "Àå";
    TEXT[ turkish ] = "Bölüm";
};
String FMT_REF_UPDOWN
{
    TEXT = "Oberhalb/Unterhalb" ;
    TEXT [ English ] = "Above/Below" ;
    Text [ dutch ] = "Boven/beneden" ;
    Text [ english_us ] = "Above/Below" ;
    Text [ italian ] = "Al di sopra/al di sotto" ;
    Text [ spanish ] = "Encima/Debajo" ;
    Text [ french ] = "Supra/infra" ;
    Text [ swedish ] = "Över/under" ;
    Text [ danish ] = "Over/under" ;
    Text [ portuguese ] = "Acima/Abaixo" ;
    Text [ portuguese_brazilian ] = "Oberhalb/Unterhalb" ;
    Text[ chinese_simplified ] = "Ö®ÉÏ/Ö®ÏÂ";
    Text[ russian ] = "Ñâåðõó/Ñíèçó";
    Text[ polish ] = "Powy¿ej/Poni¿ej";
    Text[ japanese ] = "ã/‰º";
    Text[ chinese_traditional ] = "¤§¤W/¤§¤U";
    Text[ arabic ] = "ÃÚáì/ÃÓÝá";
    Text[ greek ] = "¢íù áðü/ÊÜôù áðü";
    Text[ korean ] = "À§/¾Æ·¡";
    Text[ turkish ] = "Üstte/Altta";
    Text[ language_user1 ] = " ";
};
String FMT_REF_PAGE_PGDSC
{
    TEXT = "Wie Seitenvorlage" ;
    TEXT [ English ] = "As Page Style" ;
    TEXT [ norwegian ] = "As Page Style" ;
    TEXT [ italian ] = "Come modello di pagina" ;
    TEXT [ portuguese_brazilian ] = "Como Estilo de Página" ;
    TEXT [ portuguese ] = "Como estilo de página" ;
    TEXT [ finnish ] = "Sivutyylinä" ;
    TEXT [ danish ] = "Som sidetypografi" ;
    TEXT [ french ] = "D'après le style de page" ;
    TEXT [ swedish ] = "Som sidformatmallen" ;
    TEXT [ dutch ] = "Volgens pagina-opmaakprofiel" ;
    TEXT [ spanish ] = "Como estilo de página" ;
    TEXT [ english_us ] = "As Page Style" ;
    TEXT[ chinese_simplified ] = "ºÍÒ³ÃæÑùʽÏàͬ";
    TEXT[ russian ] = "Êàê ñòèëü ñòðàíèöû";
    TEXT[ polish ] = "Jako styl strony";
    TEXT[ japanese ] = "Íß°¼Þ½À²Ù‚̐ݒè‚ð“K—p";
    TEXT[ chinese_traditional ] = "©M­¶­±¼Ë¦¡¬Û¦P";
    TEXT[ arabic ] = "ãËá äãØ ÇáÕÝÍÉ";
    TEXT[ greek ] = "¼ðùò ôï ðñüôõðï óåëßäáò";
    TEXT[ korean ] = "ÆäÀÌÁö À¯Çüó·³";
    TEXT[ turkish ] = "Sayfa biçimi gibi";
    TEXT[ language_user1 ] = " ";
};
String FMT_REF_ONLYNUMBER
{
    TEXT = "Kategorie und Nummer" ;
    TEXT [ English ] = "Only Category and Numbering" ;
    Text [ dutch ] = "Categorie en nummer" ;
    Text [ english_us ] = "Category and Number" ;
    Text [ italian ] = "Numero e categoria" ;
    Text [ spanish ] = "Categoría y número" ;
    Text [ french ] = "Catégorie et numéro" ;
    Text [ swedish ] = "Kategori och nummer" ;
    Text [ danish ] = "Kategori og nummer" ;
    Text [ portuguese ] = "Categoria e número" ;
    Text [ portuguese_brazilian ] = "Kategorie und Nummer" ;
    Text[ chinese_simplified ] = "·ÖÀàºÍ±àºÅ";
    Text[ russian ] = "Êàòåãîðèÿ è íîìåð";
    Text[ polish ] = "Kategoria i numer";
    Text[ japanese ] = "€–ڂƔԍ†";
    Text[ chinese_traditional ] = "¤ÀÃþ©M½s¸¹";
    Text[ arabic ] = "ÇáÝÆÉ æÇáÑÞã";
    Text[ greek ] = "Êáôçãïñßá êáé áñéèìüò";
    Text[ korean ] = "Àå°ú ¹øÈ£";
    Text[ turkish ] = "Kategori ve numara";
    Text[ language_user1 ] = " ";
};
String FMT_REF_ONLYCAPTION
{
    TEXT = "Beschriftungstext" ;
    TEXT [ English ] = "Only Caption" ;
    Text [ dutch ] = "Bijschrifttekst" ;
    Text [ english_us ] = "Caption Text" ;
    Text [ italian ] = "Dicitura" ;
    Text [ spanish ] = "Texto de etiqueta" ;
    Text [ french ] = "Texte de légende" ;
    Text [ swedish ] = "Bildtext" ;
    Text [ danish ] = "Billedtekst" ;
    Text [ portuguese ] = "Texto para etiqueta" ;
    Text [ portuguese_brazilian ] = "Beschriftungstext" ;
    Text[ chinese_simplified ] = "±êÇ©ÎÄ";
    Text[ russian ] = "Òåêñò íàçâàíèÿ";
    Text[ polish ] = "Tekst etykiety";
    Text[ japanese ] = "×ÍÞقÌ÷½Ä";
    Text[ chinese_traditional ] = "¼ÐÅÒ¤å";
    Text[ arabic ] = "äÕ ÇáÊÓãíÉ ÇáÊæÖíÍíÉ";
    Text[ greek ] = "Êåßìåíï åðéãñáöÞò";
    Text[ korean ] = "ĸ¼Ç ÅØ½ºÆ®";
    Text[ turkish ] = "Altyazý metni";
    Text[ language_user1 ] = " ";
};
String FMT_REF_ONLYSEQNO
{
    TEXT = "Nummer" ;
    TEXT [ English ] = "Only Numbering" ;
    TEXT[ english_us ] = "Numbering";
    TEXT[ portuguese ] = "Número";
    TEXT[ russian ] = "Íîìåð";
    TEXT[ dutch ] = "Nummer";
    TEXT[ french ] = "Numéro";
    TEXT[ spanish ] = "Número";
    TEXT[ italian ] = "Numero";
    TEXT[ danish ] = "Nummer";
    TEXT[ swedish ] = "Nummer";
    TEXT[ polish ] = "Numer";
    TEXT[ portuguese_brazilian ] = "Only Numbering";
    TEXT[ japanese ] = "”ԍ†";
    TEXT[ chinese_simplified ] = "񅧏";
    TEXT[ chinese_traditional ] = "½s¸¹";
    TEXT[ arabic ] = "ÇáÑÞã";
    TEXT[ greek ] = "Áñéèìüò";
    TEXT[ korean ] = "¹øÈ£ ¸Å±â±â";
    TEXT[ turkish ] = "Numara";
    TEXT[ language_user1 ] = " ";
};
/*--------------------------------------------------------------------
    Beschreibung: Platzhalter
 --------------------------------------------------------------------*/
String FMT_MARK_TEXT
{
    Text = "Text" ;
    Text [ English ] = "Text" ;
    Text [ dutch ] = "Tekst" ;
    Text [ english_us ] = "Text" ;
    Text [ italian ] = "Testo" ;
    Text [ spanish ] = "Texto" ;
    Text [ french ] = "Texte" ;
    Text [ swedish ] = "Text" ;
    Text [ danish ] = "Tekst" ;
    Text [ portuguese ] = "Texto" ;
    Text [ portuguese_brazilian ] = "Text" ;
    Text[ chinese_simplified ] = "ÎÄ×Ö";
    Text[ russian ] = "Òåêñò";
    Text[ polish ] = "Tekst";
    Text[ japanese ] = "÷½Ä";
    Text[ chinese_traditional ] = "¤å¦r";
    Text[ arabic ] = "äÕ";
    Text[ greek ] = "Êåßìåíï";
    Text[ korean ] = "ÅØ½ºÆ®";
    Text[ turkish ] = "Metin";
    Text[ language_user1 ] = " ";
};
String FMT_MARK_TABLE
{
    Text = "Tabelle" ;
    Text [ English ] = "Table" ;
    Text [ norwegian ] = "Table" ;
    Text [ italian ] = "Tabella" ;
    Text [ portuguese_brazilian ] = "Tabela" ;
    Text [ portuguese ] = "Tabela" ;
    Text [ finnish ] = "Taulukko" ;
    Text [ danish ] = "Tabel" ;
    Text [ french ] = "Tableau" ;
    Text [ swedish ] = "Tabell" ;
    Text [ dutch ] = "Tabel" ;
    Text [ spanish ] = "Tabla" ;
    Text [ english_us ] = "Table" ;
    Text[ chinese_simplified ] = "±í¸ñ";
    Text[ russian ] = "Òàáëèöà";
    Text[ polish ] = "Tabela";
    Text[ japanese ] = "•\\";
    Text[ chinese_traditional ] = "ªí®æ";
    Text[ arabic ] = "ÌÏæá";
    Text[ greek ] = "Ðßíáêáò";
    Text[ korean ] = "ǥ";
    Text[ turkish ] = "Tablo";
    Text[ language_user1 ] = " ";
};
String FMT_MARK_FRAME
{
    Text = "Rahmen" ;
    Text [ English ] = "Frame" ;
    Text [ norwegian ] = "Ramme" ;
    Text [ italian ] = "Cornice" ;
    Text [ portuguese_brazilian ] = "Moldura" ;
    Text [ portuguese ] = "Moldura" ;
    Text [ finnish ] = "Kehys" ;
    Text [ danish ] = "Ramme" ;
    Text [ french ] = "Cadre" ;
    Text [ swedish ] = "Ram" ;
    Text [ dutch ] = "Kader" ;
    Text [ spanish ] = "Marco" ;
    Text [ english_us ] = "Frame" ;
    Text[ chinese_simplified ] = "¿ò";
    Text[ russian ] = "Ðàìêà";
    Text[ polish ] = "Ramka";
    Text[ japanese ] = "˜g";
    Text[ chinese_traditional ] = "¤å¦r¤è¶ô";
    Text[ arabic ] = "ÅØÇÑ";
    Text[ greek ] = "Ðåñßãñáììá";
    Text[ korean ] = "ÅØ½ºÆ® »óÀÚ";
    Text[ turkish ] = "Çerçeve";
    Text[ language_user1 ] = " ";
};
String FMT_MARK_GRAFIC
{
    Text = "Grafik" ;
    Text [ English ] = "Graphic" ;
    Text [ norwegian ] = "Graphic" ;
    Text [ italian ] = "Immagine" ;
    Text [ portuguese_brazilian ] = "Gráfico" ;
    Text [ portuguese ] = "Imagem" ;
    Text [ finnish ] = "Kuva" ;
    Text [ danish ] = "Grafik" ;
    Text [ french ] = "Image" ;
    Text [ swedish ] = "Grafik" ;
    Text [ dutch ] = "Afbeelding" ;
    Text [ spanish ] = "Imagen" ;
    Text [ english_us ] = "Graphics" ;
    Text[ chinese_simplified ] = "ͼÐÎ";
    Text[ russian ] = "Ðèñóíîê";
    Text[ polish ] = "Grafika";
    Text[ japanese ] = "¸Þ×̨¯¸";
    Text[ chinese_traditional ] = "¹Ï¤ù";
    Text[ arabic ] = "ÕæÑÉ";
    Text[ greek ] = "Ãñáöéêü";
    Text[ korean ] = "±×·¡ÇÈ";
    Text[ turkish ] = "Grafik";
    Text[ language_user1 ] = " ";
};
String FMT_MARK_OLE
{
    Text = "Objekt" ;
    Text [ English ] = "Object" ;
    Text [ norwegian ] = "Object" ;
    Text [ italian ] = "Oggetto" ;
    Text [ portuguese_brazilian ] = "Objeto" ;
    Text [ portuguese ] = "Objecto" ;
    Text [ finnish ] = "Objekti" ;
    Text [ danish ] = "Objekt" ;
    Text [ french ] = "Objet" ;
    Text [ swedish ] = "Objekt" ;
    Text [ dutch ] = "Object" ;
    Text [ spanish ] = "Objeto" ;
    Text [ english_us ] = "Object" ;
    Text[ chinese_simplified ] = "¶ÔÏó";
    Text[ russian ] = "Îáúåêò";
    Text[ polish ] = "Obiekt";
    Text[ japanese ] = "µÌÞ¼Þª¸Ä";
    Text[ chinese_traditional ] = "ª«¥ó";
    Text[ arabic ] = "ßÇÆä";
    Text[ greek ] = "Áíôéêåßìåíï";
    Text[ korean ] = "°³Ã¼";
    Text[ turkish ] = "Nesne";
    Text[ language_user1 ] = " ";
};
/*--------------------------------------------------------------------
    Beschreibung: Nur-Text
 --------------------------------------------------------------------*/
String FMT_TEXT
{
    TEXT = "Text" ;
};
/*--------------------------------------------------------------------
    Beschreibung: globale String-Ressourcen
 --------------------------------------------------------------------*/
String STR_ALL
{
    Text = "Alle" ;
    Text [ ENGLISH ] = "All" ;
    Text [ norwegian ] = "All" ;
    Text [ italian ] = "Tutto" ;
    Text [ portuguese_brazilian ] = "Tudo" ;
    Text [ portuguese ] = "Todos" ;
    Text [ finnish ] = "Kaikki" ;
    Text [ danish ] = "Alle" ;
    Text [ french ] = "Tout" ;
    Text [ swedish ] = "Alla" ;
    Text [ dutch ] = "Alles" ;
    Text [ spanish ] = "Todo" ;
    Text [ english_us ] = "All" ;
    Text[ chinese_simplified ] = "È«²¿";
    Text[ russian ] = "Âñå";
    Text[ polish ] = "Wszystkie";
    Text[ japanese ] = "‚·‚ׂÄ";
    Text[ chinese_traditional ] = "¥þ³¡";
    Text[ arabic ] = "Çáßá";
    Text[ greek ] = "¼ëá";
    Text[ korean ] = "Àüü";
    Text[ turkish ] = "Tümü";
    Text[ language_user1 ] = " ";
};
String STR_INSERT
{
    Text = "Einfügen" ;
    Text [ ENGLISH ] = "Insert" ;
    Text [ norwegian ] = "Sett inn" ;
    Text [ italian ] = "Inserisci" ;
    Text [ portuguese_brazilian ] = "Inserir" ;
    Text [ portuguese ] = "Inserir" ;
    Text [ finnish ] = "Lisää" ;
    Text [ danish ] = "Indsæt" ;
    Text [ french ] = "Insérer" ;
    Text [ swedish ] = "Infoga" ;
    Text [ dutch ] = "Invoegen" ;
    Text [ spanish ] = "Insertar" ;
    Text [ english_us ] = "Insert" ;
    Text[ chinese_simplified ] = "²åÈë";
    Text[ russian ] = "Âñòàâêà";
    Text[ polish ] = "Wstaw";
    Text[ japanese ] = "‘}“ü";
    Text[ chinese_traditional ] = "´¡¤J";
    Text[ arabic ] = "ÅÏÑÇÌ";
    Text[ greek ] = "ÅéóáãùãÞ";
    Text[ korean ] = "»ðÀÔ";
    Text[ turkish ] = "Ekle";
    Text[ language_user1 ] = " ";
};
/*--------------------------------------------------------------------
    Beschreibung:   AustauschStrings fuer Edit/NameFT
 --------------------------------------------------------------------*/
String STR_COND
{
    TEXT = "Bedin~gung" ;
    TEXT [ English ] = "Conditio~n" ;
    TEXT [ norwegian ] = "Vilkår" ;
    TEXT [ italian ] = "Condizione" ;
    TEXT [ portuguese_brazilian ] = "condição" ;
    TEXT [ portuguese ] = "~Condição" ;
    TEXT [ finnish ] = "Ehto" ;
    TEXT [ danish ] = "Betingelse" ;
    TEXT [ french ] = "~Condition" ;
    TEXT [ swedish ] = "Villkor" ;
    TEXT [ dutch ] = "~Voorwaarde" ;
    TEXT [ spanish ] = "~Condición" ;
    TEXT [ english_us ] = "~Condition" ;
    TEXT[ chinese_simplified ] = "Ìõ¼þ(~C)";
    TEXT[ russian ] = "Óñëîâèå";
    TEXT[ polish ] = "Warunek";
    TEXT[ japanese ] = "ðŒ(~C)";
    TEXT[ chinese_traditional ] = "±ø¥ó(~C)";
    TEXT[ arabic ] = "ÔÑØ";
    TEXT[ greek ] = "¼ñïò";
    TEXT[ korean ] = "Á¶°Ç(~C)";
    TEXT[ turkish ] = "Koþul";
    TEXT[ language_user1 ] = " ";
};
String STR_TEXT
{
    TEXT = "Dann, Sonst" ;
    TEXT [ English ] = "Then,Else" ;
    TEXT [ norwegian ] = "Then,Else" ;
    TEXT [ italian ] = "Poi, altrimenti" ;
    TEXT [ portuguese_brazilian ] = "Entao,Senão" ;
    TEXT [ portuguese ] = "Então, Senão" ;
    TEXT [ finnish ] = "Sitten,Muuten" ;
    TEXT [ danish ] = "Så, Ellers" ;
    TEXT [ french ] = "Alors, sinon" ;
    TEXT [ swedish ] = "Sedan, annars" ;
    TEXT [ dutch ] = "Dan, Anders" ;
    TEXT [ spanish ] = "Entonces, si no" ;
    TEXT [ english_us ] = "Then, Else" ;
    TEXT[ chinese_simplified ] = "ÄÇô¾Í£¬·ñÔò";
    TEXT[ russian ] = "Çàòåì, Èíà÷å";
    TEXT[ polish ] = "Nastêpnie, Poza tym";
    TEXT[ japanese ] = "ðŒ‚ð–ž‚½‚·ŽžA–ž‚½‚³‚È‚¢Žž";
    TEXT[ chinese_traditional ] = "¨º»ò´N¡A§_«h";
    TEXT[ arabic ] = "Ëã¡ ÛíÑ Ðáß";
    TEXT[ greek ] = "Ôüôå, Áëëéþò";
    TEXT[ korean ] = "´ÙÀ½, ±âŸ";
    TEXT[ turkish ] = "O halde, Yoksa";
    TEXT[ language_user1 ] = " ";
};
String STR_DDE_CMD
{
    TEXT = "DDE Anweisung" ;
    TEXT [ English ] = "DDE instruction" ;
    TEXT [ norwegian ] = "DDE instruction" ;
    TEXT [ italian ] = "Istruzione DDE" ;
    TEXT [ portuguese_brazilian ] = "Instruções do DDE" ;
    TEXT [ portuguese ] = "Instruções DDE" ;
    TEXT [ finnish ] = "DDE-käsky" ;
    TEXT [ danish ] = "DDE-sætning" ;
    TEXT [ french ] = "Instruction DDE" ;
    TEXT [ swedish ] = "DDE-instruktion" ;
    TEXT [ dutch ] = "DDE-instructie" ;
    TEXT [ spanish ] = "Instrucción DDE" ;
    TEXT [ english_us ] = "DDE Statement" ;
    TEXT[ chinese_simplified ] = "DDE Ö¸Áî";
    TEXT[ russian ] = "Óêàçàíèå DDE";
    TEXT[ polish ] = "Instrukcja DDE";
    TEXT[ japanese ] = "DDEŽwަ";
    TEXT[ chinese_traditional ] = "DDE «ü¥O";
    TEXT[ arabic ] = "ÚÈÇÑÉ DDE";
    TEXT[ greek ] = "ÅíôïëÞ DDE";
    TEXT[ korean ] = "DDE ¹®Àå";
    TEXT[ turkish ] = "DDE deyimi";
    TEXT[ language_user1 ] = " ";
};
String STR_INSTEXT
{
    TEXT = "Text einf~ügen" ;
    TEXT [ English ] = "Inser~t text" ;
    TEXT [ norwegian ] = "Insert text" ;
    TEXT [ italian ] = "Inserisci testo" ;
    TEXT [ portuguese_brazilian ] = "Inserir texto" ;
    TEXT [ portuguese ] = "Inserir ~texto" ;
    TEXT [ finnish ] = "Lisää teksti" ;
    TEXT [ danish ] = "Indsæt tekst" ;
    TEXT [ french ] = "Insérer un ~texte" ;
    TEXT [ swedish ] = "Infoga ~text" ;
    TEXT [ dutch ] = "~Tekst invoegen" ;
    TEXT [ spanish ] = "I~nsertar texto" ;
    TEXT [ english_us ] = "Insert t~ext" ;
    TEXT[ chinese_simplified ] = "²åÈëÎÄ×Ö(~E)";
    TEXT[ russian ] = "Âñòàâèòü òåêñò";
    TEXT[ polish ] = "Wstaw tekst";
    TEXT[ japanese ] = "‘}“ü‚·‚é÷½Ä";
    TEXT[ chinese_traditional ] = "´¡¤J¤å¦r(~E)";
    TEXT[ arabic ] = "ÅÏÑÇÌ äÕ";
    TEXT[ greek ] = "ÅéóáãùãÞ êåéìÝíïõ";
    TEXT[ korean ] = "ÅØ½ºÆ® »ðÀÔ(~E)";
    TEXT[ turkish ] = "Metin ekle";
    TEXT[ language_user1 ] = " ";
};
String STR_MACNAME
{
    TEXT = "~Makroname" ;
    TEXT [ English ] = "~Macro name" ;
    TEXT [ norwegian ] = "Macro name" ;
    TEXT [ italian ] = "Nome ~macro" ;
    TEXT [ portuguese_brazilian ] = "Nome da macro" ;
    TEXT [ portuguese ] = "Nome da ~macro" ;
    TEXT [ finnish ] = "Makron nimi" ;
    TEXT [ danish ] = "Makronavn" ;
    TEXT [ french ] = "~Nom de la macro" ;
    TEXT [ swedish ] = "~Makronamn" ;
    TEXT [ dutch ] = "~Naam macro" ;
    TEXT [ spanish ] = "Nombre de la ~macro" ;
    TEXT [ english_us ] = "~Macro name" ;
    TEXT[ chinese_simplified ] = "ºêÃû³Æ(~M)";
    TEXT[ russian ] = "Èìÿ ìàêðîñà";
    TEXT[ polish ] = "Nazwa makra";
    TEXT[ japanese ] = "ϸۖ¼(~M)";
    TEXT[ chinese_traditional ] = "¥¨¶°¦WºÙ(~M)";
    TEXT[ arabic ] = "ÇÓã ÇáãÇßÑæ";
    TEXT[ greek ] = "¼íïìá ìáêñïåíôïëÞò";
    TEXT[ korean ] = "¸ÅÅ©·Î À̸§(~M)";
    TEXT[ turkish ] = "Makro ~adý";
    TEXT[ language_user1 ] = " ";
};
String STR_PROMPT
{
    TEXT = "H~inweis" ;
    TEXT [ English ] = "Pr~ompt" ;
    TEXT [ norwegian ] = "Prompt" ;
    TEXT [ italian ] = "Nota" ;
    TEXT [ portuguese_brazilian ] = "Aviso" ;
    TEXT [ portuguese ] = "~Anotação" ;
    TEXT [ finnish ] = "Kehote" ;
    TEXT [ danish ] = "Henvisning" ;
    TEXT [ french ] = "~Annotation" ;
    TEXT [ swedish ] = "Hänv~isning" ;
    TEXT [ dutch ] = "~Aanwijzing" ;
    TEXT [ spanish ] = "I~ndicación" ;
    TEXT [ english_us ] = "~Reference" ;
    TEXT[ chinese_simplified ] = "Ìáʾ(~R)";
    TEXT[ russian ] = "Óêàçàíèå";
    TEXT[ polish ] = "Wskazówka";
    TEXT[ japanese ] = "ŽQÆ(~R)";
    TEXT[ chinese_traditional ] = "´£¥Ü(~R)";
    TEXT[ arabic ] = "ãáÇÍÙÉ";
    TEXT[ greek ] = "Õðüäå~éîç";
    TEXT[ korean ] = "ÂüÁ¶(~R)";
    TEXT[ turkish ] = "Bilgi";
    TEXT[ language_user1 ] = " ";
};
String STR_SETNO
{
    TEXT = "Satznummer" ;
    TEXT [ English ] = "Setnumber" ;
    TEXT [ norwegian ] = "Setnumber" ;
    TEXT [ italian ] = "Numero di record" ;
    TEXT [ portuguese_brazilian ] = "Definir número" ;
    TEXT [ portuguese ] = "Número de registo" ;
    TEXT [ finnish ] = "Joukon numero" ;
    TEXT [ danish ] = "Datapostnummer" ;
    TEXT [ french ] = "Numéro de l'enregistrement" ;
    TEXT [ swedish ] = "Datapostnummer" ;
    TEXT [ dutch ] = "Recordnummer" ;
    TEXT [ spanish ] = "Número de registro" ;
    TEXT [ english_us ] = "Record number" ;
    TEXT[ chinese_simplified ] = "ÌõÄ¿±àºÅ";
    TEXT[ russian ] = "Íîìåð ïðåäëîæåíèÿ";
    TEXT[ polish ] = "Numer rekordu";
    TEXT[ japanese ] = "Úº°Äޔԍ†";
    TEXT[ chinese_traditional ] = "¶µ¥Ø¸¹½X";
    TEXT[ arabic ] = "ÑÞã ÇáÓÌá";
    TEXT[ greek ] = "Áñéèìüò åããñáöÞò";
    TEXT[ korean ] = "·¹ÄÚµå ¹øÈ£";
    TEXT[ turkish ] = "Veri kaydý numarasý";
    TEXT[ language_user1 ] = " ";
};
String STR_OFFSET
{
    TEXT = "Ko~rrektur" ;
    TEXT [ English ] = "Offs~et" ;
    TEXT [ norwegian ] = "Offset" ;
    TEXT [ italian ] = "Correzione" ;
    TEXT [ portuguese_brazilian ] = "Deslocar" ;
    TEXT [ portuguese ] = "~Correcção" ;
    TEXT [ finnish ] = "Siirroa" ;
    TEXT [ danish ] = "Korrektion" ;
    TEXT [ french ] = "Dé~calage" ;
    TEXT [ swedish ] = "Ko~rrigering" ;
    TEXT [ dutch ] = "~Correctie" ;
    TEXT [ spanish ] = "C~orrección" ;
    TEXT [ english_us ] = "O~ffset" ;
    TEXT[ chinese_simplified ] = "ÐÞ¸Ä(~F)";
    TEXT[ russian ] = "Êîððåêòèðîâêà";
    TEXT[ polish ] = "Korekta";
    TEXT[ japanese ] = "C³(~F)";
    TEXT[ chinese_traditional ] = "­×§ï(~F)";
    TEXT[ arabic ] = "ÊÕÍíÍ";
    TEXT[ greek ] = "Äéüñèùóç";
    TEXT[ korean ] = "¼öÁ¤(~F)";
    TEXT[ turkish ] = "Düzeltme";
    TEXT[ language_user1 ] = " ";
};
String STR_VALUE
{
    Text = "~Wert" ;
    Text [ ENGLISH ] = "Value" ;
    Text [ norwegian ] = "Verdi" ;
    Text [ italian ] = "Valore" ;
    Text [ portuguese_brazilian ] = "Valor" ;
    Text [ portuguese ] = "~Valor" ;
    Text [ finnish ] = "Arvo" ;
    Text [ danish ] = "Værdi" ;
    Text [ french ] = "~Valeur" ;
    Text [ swedish ] = "~Värde" ;
    Text [ dutch ] = "~Waarde" ;
    Text [ spanish ] = "~Valor" ;
    Text [ english_us ] = "Value" ;
    Text[ chinese_simplified ] = "ÊýÖµ";
    Text[ russian ] = "Çíà÷åíèå";
    Text[ polish ] = ", WartoϾ  ";
    Text[ japanese ] = "’l";
    Text[ chinese_traditional ] = "¼Æ­È";
    Text[ arabic ] = "ÇáÞíãÉ";
    Text[ greek ] = "ÔéìÞ";
    Text[ korean ] = "°ª";
    Text[ turkish ] = "De~ðer";
    Text[ language_user1 ] = " ";
};
String STR_FORMULA
{
    TEXT = "Formel" ;
    TEXT [ English ] = "Formula" ;
    Text [ portuguese ] = "Fórmula" ;
    Text [ english_us ] = "Formula" ;
    Text [ portuguese_brazilian ] = "Fórmula do Texto" ;
    Text [ swedish ] = "Formel" ;
    Text [ danish ] = "Formel" ;
    Text [ italian ] = "Formula" ;
    Text [ spanish ] = "Fórmula" ;
    Text [ french ] = "Formule " ;
    Text [ dutch ] = "Formule" ;
    Text[ chinese_simplified ] = "¹«Ê½";
    Text[ russian ] = "Ôîðìóëà";
    Text[ polish ] = "Formu³a";
    Text[ japanese ] = "”Ž®";
    Text[ chinese_traditional ] = "¤½¦¡";
    Text[ arabic ] = "ÕíÛÉ";
    Text[ greek ] = "Ôýðïò";
    Text[ korean ] = "¼ö½Ä";
    Text[ turkish ] = "Formül";
    Text[ language_user1 ] = " ";
};
String STR_LEVEL
{
    TEXT = "Ebene" ;
    TEXT [ English ] = "Level" ;
    TEXT [ norwegian ] = "Level" ;
    TEXT [ italian ] = "Livello " ;
    TEXT [ portuguese_brazilian ] = "Nível" ;
    TEXT [ portuguese ] = "Nível " ;
    TEXT [ finnish ] = "Taso" ;
    TEXT [ danish ] = "Niveau" ;
    TEXT [ french ] = "Niveau" ;
    TEXT [ swedish ] = "Nivå  " ;
    TEXT [ dutch ] = "Niveau" ;
    TEXT [ spanish ] = "Nivel " ;
    TEXT [ english_us ] = "Layer " ;
    TEXT[ chinese_simplified ] = "¼¶";
    TEXT[ russian ] = "Ñëîé";
    TEXT[ polish ] = "Poziom  ";
    TEXT[ japanese ] = "ÚÍÞÙ";
    TEXT[ chinese_traditional ] = "¯Å";
    TEXT[ arabic ] = "ÇáãÓÊæì ";
    TEXT[ greek ] = "Åðßðåäï";
    TEXT[ korean ] = "°èÃþ";
    TEXT[ turkish ] = "Düzey";
    TEXT[ language_user1 ] = " ";
};
String STR_URLPROMPT
{
    TEXT = "~URL" ;
    TEXT [ English ] = "~URL" ;
    Text [ english_us ] = "~URL" ;
    Text [ italian ] = "~URL" ;
    Text [ spanish ] = "~URL" ;
    Text [ french ] = "~URL" ;
    Text [ dutch ] = "~URL" ;
    Text [ swedish ] = "~URL" ;
    Text [ danish ] = "URL" ;
    Text [ portuguese ] = "~URL" ;
    Text [ portuguese_brazilian ] = "~URL" ;
    Text[ chinese_simplified ] = "~URL";
    Text[ russian ] = "~URL";
    Text[ polish ] = "URL";
    Text[ japanese ] = "URL(~U)";
    Text[ chinese_traditional ] = "~URL";
    Text[ arabic ] = "URL~";
    Text[ greek ] = "URL";
    Text[ korean ] = "~URL";
    Text[ turkish ] = "~URL";
    Text[ language_user1 ] = " ";
};
String STR_ALL_DATABASE
{
    TEXT = "<Alle>" ;
    TEXT [ English ] = "<All>" ;
    Text [ dutch ] = "<Alle>" ;
    Text [ english_us ] = "<All>" ;
    Text [ italian ] = "<Tutti>" ;
    Text [ spanish ] = "<Todos>" ;
    Text [ french ] = "<Toutes>" ;
    Text [ swedish ] = "<Alla>" ;
    Text [ danish ] = "<Alle>" ;
    Text [ portuguese ] = "<Todos>" ;
    Text [ portuguese_brazilian ] = "<Alle>" ;
    Text[ chinese_simplified ] = "<È«²¿>";
    Text[ russian ] = "<Âñå>";
    Text[ polish ] = "<Wszystkie>";
    Text[ japanese ] = "<‚·‚ׂÄ>";
    Text[ chinese_traditional ] = "<¥þ³¡>";
    Text[ arabic ] = "<Çáßá>";
    Text[ greek ] = "<¼ëá>";
    Text[ korean ] = "<Àüü>";
    Text[ turkish ] = "<Tümü>";
    Text[ language_user1 ] = " ";
};
ImageButton BTN_FLDEDT_PREV
{
    Pos = MAP_APPFONT ( 263 , 115 ) ;
    Size = MAP_APPFONT ( 24 , 14 ) ;
    TabStop = TRUE ;
    SYMBOL = IMAGEBUTTON_PREV ;
    Helpid = HID_DLG_FLDEDT_PREV ;
};
ImageButton BTN_FLDEDT_NEXT
{
    Pos = MAP_APPFONT ( 294 , 115 ) ;
    Size = MAP_APPFONT ( 24 , 14 ) ;
    TabStop = TRUE ;
    SYMBOL = IMAGEBUTTON_NEXT ;
    Helpid = HID_DLG_FLDEDT_NEXT ;
};
PushButton PB_FLDEDT_ADDRESS
{
    TEXT = "Bearbeiten" ;
    TEXT [ English ] = "Edit" ;
    Pos = MAP_APPFONT ( 294 , 100 ) ;
    Size = MAP_APPFONT ( 24 , 14 ) ;
    TabStop = TRUE ;
    Hide = TRUE ;
    Text [ english_us ] = "Edit" ;
    Text [ portuguese_brazilian ] = "Bearbeiten" ;
    Text [ swedish ] = "Redigera" ;
    Text [ danish ] = "Rediger" ;
    Text [ italian ] = "Modifica" ;
    Text [ spanish ] = "Editar" ;
    Text [ french ] = "Modifier" ;
    Text [ dutch ] = "Bewerken" ;
    Text [ portuguese ] = "Editar" ;
    Helpid = HID_DLG_FLDEDT_ADDRESS ;
    Text[ chinese_simplified ] = "±à¼­";
    Text[ russian ] = "Ïðàâêà";
    Text[ polish ] = "Edycja";
    Text[ japanese ] = "•ҏW";
    Text[ chinese_traditional ] = "½s¿è";
    Text[ arabic ] = "ÊÍÑíÑ";
    Text[ greek ] = "Åðåîåñãáóßá";
    Text[ korean ] = "ÆíÁý";
    Text[ turkish ] = "Düzenle";
    Text[ language_user1 ] = " ";
};
diff --git a/sw/source/ui/fldui/fldvar.cxx b/sw/source/ui/fldui/fldvar.cxx
new file mode 100644
index 0000000..2b5f7b9
--- /dev/null
+++ b/sw/source/ui/fldui/fldvar.cxx
@@ -0,0 +1,1562 @@
/*************************************************************************
 *
 *  $RCSfile: fldvar.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:37 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif

#ifndef _LINKMGR_HXX //autogen
#include <so3/linkmgr.hxx>
#endif

#ifndef _USRFLD_HXX
#include <usrfld.hxx>
#endif
#ifndef _DOCUFLD_HXX
#include <docufld.hxx>
#endif
#ifndef _FLDBAS_HXX
#include <fldbas.hxx>
#endif
#ifndef _EXPFLD_HXX
#include <expfld.hxx>
#endif
#ifndef _DDEFLD_HXX
#include <ddefld.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _DOCARY_HXX
#include <docary.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _FLDVAR_HXX
#include <fldvar.hxx>
#endif

#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif
#ifndef _FLDUI_HRC
#include <fldui.hrc>
#endif
#ifndef _FLDTDLG_HRC
#include <fldtdlg.hrc>
#endif

#define USER_DATA_VERSION_1 "1"
#define USER_DATA_VERSION USER_DATA_VERSION_1
/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SwFldVarPage::SwFldVarPage(Window* pParent, const SfxItemSet& rCoreSet ) :
    SwFldPage       ( pParent, SW_RES( TP_FLD_VAR ), rCoreSet ),
    aTypeFT         (this, SW_RES(FT_VARTYPE)),
    aTypeLB         (this, SW_RES(LB_VARTYPE)),
    aSelectionFT    (this, SW_RES(FT_VARSELECTION)),
    aSelectionLB    (this, SW_RES(LB_VARSELECTION)),
    aNameFT         (this, SW_RES(FT_VARNAME)),
    aNameED         (this, SW_RES(ED_VARNAME)),
    aValueFT        (this, SW_RES(FT_VARVALUE)),
    aValueED        (this, SW_RES(ED_VARVALUE)),
    aFormatFT       (this, SW_RES(FT_VARFORMAT)),
    aNumFormatLB    (this, SW_RES(LB_VARNUMFORMAT)),
    aFormatLB       (this, SW_RES(LB_VARFORMAT)),
    aChapterHeaderFT(this, SW_RES(FT_VARCHAPTERHEADER)),
    aChapterLevelFT (this, SW_RES(FT_VARCHAPTERLEVEL)),
    aChapterLevelLB (this, SW_RES(LB_VARCHAPTERLEVEL)),
    aInvisibleCB    (this, SW_RES(CB_VARINVISIBLE)),
    aSeparatorFT    (this, SW_RES(FT_VARSEPARATOR)),
    aSeparatorED    (this, SW_RES(ED_VARSEPARATOR)),
    aNewDelTBX      (this, SW_RES(TBX_VARNEWDEL)),
    bInit           (TRUE)
{
    FreeResource();

    aNewDelTBX.SetSizePixel( aNewDelTBX.CalcWindowSizePixel() );

    long nDelta = ( aValueED.GetSizePixel().Height() -
                    aNewDelTBX.GetSizePixel().Height() ) / 2;
    Point aNewPnt = aNewDelTBX.GetPosPixel();
    aNewPnt.Y() += nDelta;
    aNewDelTBX.SetPosPixel( aNewPnt );

    sOldValueFT = aValueFT.GetText();
    sOldNameFT = aNameFT.GetText();

    for (USHORT i = 1; i <= MAXLEVEL; i++)
        aChapterLevelLB.InsertEntry(String::CreateFromInt32(i));

    aChapterLevelLB.SelectEntryPos(0);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

__EXPORT SwFldVarPage::~SwFldVarPage()
{
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void __EXPORT SwFldVarPage::Reset(const SfxItemSet& rSet)
{
    SavePos(&aTypeLB);

    Init(); // Allgemeine initialisierung

    aTypeLB.SetUpdateMode(FALSE);
    aTypeLB.Clear();

    USHORT nPos, nTypeId;

    if (!IsFldEdit())
    {
        // TypeListBox initialisieren
        const SwFldGroupRgn& rRg = GetFldMgr().GetGroupRange(IsFldDlgHtmlMode(), GetGroup());

        for (short i = rRg.nStart; i < rRg.nEnd; ++i)
        {
            nTypeId = GetFldMgr().GetTypeId(i);

#ifndef DDE_AVAILABLE
            if (nTypeId != TYP_DDEFLD)
#endif
            {   // Nur unter WIN, WNT und OS/2 DDE-Fields
                nPos = aTypeLB.InsertEntry(GetFldMgr().GetTypeStr(i));
                aTypeLB.SetEntryData(nPos, (void*)nTypeId);
            }
        }
    }
    else
    {
        nTypeId = GetCurField()->GetTypeId();
        if (nTypeId == TYP_SETINPFLD)
            nTypeId = TYP_INPUTFLD;
        nPos = aTypeLB.InsertEntry(GetFldMgr().GetTypeStr(GetFldMgr().GetPos(nTypeId)));
        aTypeLB.SetEntryData(nPos, (void*)nTypeId);
    }

    // alte Pos selektieren
    RestorePos(&aTypeLB);

    aTypeLB.SetDoubleClickHdl       (LINK(this, SwFldVarPage, InsertHdl));
    aTypeLB.SetSelectHdl            (LINK(this, SwFldVarPage, TypeHdl));
    aSelectionLB.SetSelectHdl       (LINK(this, SwFldVarPage, SubTypeHdl));
    aSelectionLB.SetDoubleClickHdl  (LINK(this, SwFldVarPage, InsertHdl));
    aFormatLB.SetDoubleClickHdl     (LINK(this, SwFldVarPage, InsertHdl));
    aNumFormatLB.SetDoubleClickHdl  (LINK(this, SwFldVarPage, InsertHdl));
    aNameED.SetModifyHdl            (LINK(this, SwFldVarPage, ModifyHdl));
    aValueED.SetModifyHdl           (LINK(this, SwFldVarPage, ModifyHdl));
    aNewDelTBX.SetClickHdl          (LINK(this, SwFldVarPage, TBClickHdl));
    aChapterLevelLB.SetSelectHdl    (LINK(this, SwFldVarPage, ChapterHdl));
    aSeparatorED.SetModifyHdl       (LINK(this, SwFldVarPage, SeparatorHdl));

    if( !IsRefresh() )
    {
        String sUserData = GetUserData();
        if(!IsRefresh() && sUserData.GetToken(0, ';').EqualsIgnoreCaseAscii(USER_DATA_VERSION_1))
        {
            String sVal = sUserData.GetToken(1, ';');
            USHORT nVal = sVal.ToInt32();
            if(nVal != USHRT_MAX)
            {
                for(USHORT i = 0; i < aTypeLB.GetEntryCount(); i++)
                    if(nVal == (USHORT)(ULONG)aTypeLB.GetEntryData(i))
                    {
                        aTypeLB.SelectEntryPos(i);
                        break;
                    }
            }
        }
    }
    TypeHdl(0);

    aTypeLB.SetUpdateMode(TRUE);

    if (IsFldEdit())
    {
        aSelectionLB.SaveValue();
        aFormatLB.SaveValue();
        nOldFormat = aNumFormatLB.GetFormat();
        aNameED.SaveValue();
        aValueED.SaveValue();
        aInvisibleCB.SaveValue();
        aChapterLevelLB.SaveValue();
        aSeparatorED.SaveValue();
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwFldVarPage, TypeHdl, ListBox *, pBox )
{
    // Alte ListBoxPos sichern
    const USHORT nOld = GetTypeSel();

    // Aktuelle ListBoxPos
    SetTypeSel(aTypeLB.GetSelectEntryPos());

    if(GetTypeSel() == LISTBOX_ENTRY_NOTFOUND)
    {
        SetTypeSel(0);
        aTypeLB.SelectEntryPos(0);
    }

    if (nOld != GetTypeSel() || nOld == LISTBOX_ENTRY_NOTFOUND)
    {
        bInit = TRUE;
        if (nOld != LISTBOX_ENTRY_NOTFOUND)
        {
            aNameED.SetText(aEmptyStr);
            aValueED.SetText(aEmptyStr);
        }

        aValueED.EnableDrop(FALSE);
        UpdateSubType();    // Auswahl-Listboxen initialisieren
    }

    bInit = FALSE;

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwFldVarPage, SubTypeHdl, ListBox *, pBox )
{
    USHORT nTypeId = (USHORT)(ULONG)aTypeLB.GetEntryData(GetTypeSel());
    USHORT nSelPos = aSelectionLB.GetSelectEntryPos();

    if (nSelPos != LISTBOX_ENTRY_NOTFOUND)
        nSelPos = (USHORT)(ULONG)aSelectionLB.GetEntryData(nSelPos);

    if (IsFldEdit() && (!pBox || bInit))
    {
        if (nTypeId != TYP_FORMELFLD)
            aNameED.SetText(GetFldMgr().GetCurFldPar1());

        aValueED.SetText(GetFldMgr().GetCurFldPar2());
    }

    if (aNameFT.GetText() != sOldNameFT)
        aNameFT.SetText(sOldNameFT);
    if (aValueFT.GetText() != sOldValueFT)
        aValueFT.SetText(sOldValueFT);

    aNumFormatLB.SetUpdateMode(FALSE);
    aFormatLB.SetUpdateMode(FALSE);
    FillFormatLB(nTypeId);

    USHORT nSize = aFormatLB.GetEntryCount();

    BOOL bValue = FALSE, bName = FALSE, bNumFmt = FALSE,
            bInvisible = FALSE, bSeparator = FALSE, bChapterLevel = FALSE;
    BOOL bFormat = nSize != 0;

    switch (nTypeId)
    {
        case TYP_USERFLD:
        {
            // Benutzertyp aendern oder anlegen
            SwUserFieldType* pType = (SwUserFieldType*)
                GetFldMgr().GetFldType(RES_USERFLD, nSelPos);

            if (pType)
            {
                if (!IsFldEdit())
                {
                    if (pBox || (bInit && !IsRefresh()))    // Nur bei Interaktion mit Maus
                    {
                        aNameED.SetText(pType->GetName());

                        if (pType->GetType() == UF_STRING)
                        {
                            aValueED.SetText(pType->GetContent());
                            aNumFormatLB.SelectEntryPos(0);
                        }
                        else
                            aValueED.SetText(pType->GetContent());
//                          aValueED.SetText(pType->GetContent(aNumFormatLB.GetFormat()));
                    }
                }
                else
                    aValueED.SetText(pType->GetContent());
            }
            else
            {
                if (pBox)   // Nur bei Interaktion mit Maus
                {
                    aNameED.SetText(aEmptyStr);
                    aValueED.SetText(aEmptyStr);
                }
            }
            bValue = bName = bNumFmt = bInvisible = TRUE;

            aValueED.EnableDrop(TRUE);
            break;
        }

        case TYP_SETFLD:
            bValue = TRUE;

            bNumFmt = bInvisible = TRUE;

            if (!IsFldDlgHtmlMode())
                bName = TRUE;
            else
            {
                aNumFormatLB.Clear();
                USHORT nPos = aNumFormatLB.InsertEntry(SW_RESSTR(FMT_SETVAR_TEXT), 0);
                aNumFormatLB.SetEntryData(nPos, (void *)ULONG_MAX);
                aNumFormatLB.SelectEntryPos(0);
            }
            // gibt es ein entprechendes SetField
            if (IsFldEdit() || pBox)    // Nur bei Interaktion mit Maus
            {
                if (nSelPos != LISTBOX_ENTRY_NOTFOUND)
                {
                    String sName(aSelectionLB.GetSelectEntry());
                    aNameED.SetText(sName);

                    if (!IsFldDlgHtmlMode())
                    {
                        SwSetExpFieldType* pSetTyp = (SwSetExpFieldType*)
                                    ::GetActiveView()->GetWrtShell().
                                    GetFldType(RES_SETEXPFLD, sName);

                        if (pSetTyp && pSetTyp->GetType() == GSE_STRING)
                            aNumFormatLB.SelectEntryPos(0); // Textuell
                    }
                }
            }
            if (IsFldEdit())
            {
                // GetFormula fuehrt bei Datumsformaten zu Problemen,
                // da nur der numerische Wert ohne Formatierung returned wird.
                // Muss aber verwendet werden, da sonst bei GetPar2 nur der vom
                // Kalkulator errechnete Wert angezeigt werden wuerde
                // (statt test2 = test + 1)
                aValueED.SetText(((SwSetExpField*)GetCurField())->GetFormula());
            }
            aValueED.EnableDrop(TRUE);
            break;

        case TYP_FORMELFLD:
            {
                bValue = TRUE;
                bNumFmt = TRUE;
                aValueFT.SetText(SW_RESSTR(STR_FORMULA));
                aValueED.EnableDrop(TRUE);
            }
            break;

        case TYP_GETFLD:
            {
                if (!IsFldEdit())
                {
                    aNameED.SetText(aEmptyStr);
                    aValueED.SetText(aEmptyStr);
                }

                if (nSelPos != LISTBOX_ENTRY_NOTFOUND)
                {
                    String sName(aSelectionLB.GetSelectEntry());
                    if (!IsFldEdit())
                        aNameED.SetText(sName);

                    // gibt es ein entprechendes SetField
                    SwSetExpFieldType* pSetTyp = (SwSetExpFieldType*)
                                ::GetActiveView()->GetWrtShell().
                                GetFldType(RES_SETEXPFLD, sName);

                    if(pSetTyp)
                    {
                        if (pSetTyp->GetType() & GSE_STRING)    // Textuell?
                            bFormat = TRUE;
                        else                    // Numerisch
                            bNumFmt = TRUE;
                    }
                }
                else
                    bFormat = FALSE;

                EnableInsert(bFormat|bNumFmt);
            }
            break;

        case TYP_INPUTFLD:
            aValueFT.SetText(SW_RESSTR(STR_PROMPT));

            if (nSelPos != LISTBOX_ENTRY_NOTFOUND)
            {
                bValue = bNumFmt = TRUE;

                String sName;

                sName = aSelectionLB.GetSelectEntry();
                aNameED.SetText( sName );

                // User- oder SetField ?
                USHORT nInpType = 0;
                nInpType = GetFldMgr().GetFldType(RES_USERFLD, sName) ? 0 : TYP_SETINPFLD;

                if (nInpType)   // SETEXPFLD
                {
                    // gibt es ein entprechendes SetField
                    SwSetExpFieldType* pSetTyp = (SwSetExpFieldType*)
                                GetFldMgr().GetFldType(RES_SETEXPFLD, sName);

                    if(pSetTyp)
                    {
                        if (pSetTyp->GetType() == GSE_STRING)   // Textuell?
                        {
                            aNumFormatLB.Clear();

                            USHORT nPos = aNumFormatLB.InsertEntry(SW_RESSTR(FMT_USERVAR_TEXT), 0);
                            aNumFormatLB.SetEntryData(nPos, (void *)ULONG_MAX);
                            aNumFormatLB.SelectEntryPos(0);
                        }
                    }
                    if (IsFldEdit() && (!pBox || bInit))
                        aValueED.SetText(((SwSetExpField*)GetCurField())->GetPromptText());
                }
                else    // USERFLD
                    bFormat = bNumFmt = FALSE;
            }
            break;

        case TYP_DDEFLD:
            aValueFT.SetText(SW_RESSTR(STR_DDE_CMD));

            if (IsFldEdit() || pBox)    // Nur bei Interaktion mit Maus
            {
                if (nSelPos != LISTBOX_ENTRY_NOTFOUND)
                {
                    SwDDEFieldType* pType =
                        (SwDDEFieldType*) GetFldMgr().GetFldType(RES_DDEFLD, nSelPos);

                    if(pType)
                    {
                        aNameED.SetText(pType->GetName());

                        //JP 28.08.95: DDE-Topics/-Items koennen Blanks in ihren
                        //              Namen haben! Wird hier noch nicht beachtet
                        String sCmd( pType->GetCmd() );
                        USHORT nTmpPos = sCmd.SearchAndReplace( cTokenSeperator, ' ' );
                        sCmd.SearchAndReplace( cTokenSeperator, ' ', nTmpPos );

                        aValueED.SetText( sCmd );
                        aFormatLB.SelectEntryPos(pType->GetType());
                    }
                }
            }
            bName = bValue = TRUE;
            break;

        case TYP_SEQFLD:
            {
                // aNumRB.Check(TRUE);
                bName = bValue = bSeparator = bChapterLevel = TRUE;

                SwFieldType* pFldTyp;
                if( IsFldEdit() )
                    pFldTyp = GetCurField()->GetTyp();
                else
                {
                    String sFldTypeName( aSelectionLB.GetEntry( nSelPos ));
                    if( sFldTypeName.Len() )
                        pFldTyp = GetFldMgr().GetFldType( RES_SETEXPFLD,
                                                          sFldTypeName );
                    else
                        pFldTyp = 0;
                }

                if( IsFldEdit() )
                    aValueED.SetText( ((SwSetExpField*)GetCurField())->
                                        GetFormula() );

                if( IsFldEdit() || pBox )   // Nur bei Interaktion mit Maus
                    aNameED.SetText( aSelectionLB.GetSelectEntry() );

                if( pFldTyp )
                {
                    BYTE nLevel = ((SwSetExpFieldType*)pFldTyp)->GetOutlineLvl();
                    if( 0x7f == nLevel )
                        aChapterLevelLB.SelectEntryPos( 0 );
                    else
                        aChapterLevelLB.SelectEntryPos( nLevel + 1 );
                    sal_Unicode cDelim = ((SwSetExpFieldType*)pFldTyp)->GetDelimiter();
                    if(cDelim)
                        aSeparatorED.SetText( cDelim );
                    else
                        aSeparatorED.SetText( aEmptyStr );
                    ChapterHdl();
                }
            }
            break;

        case TYP_SETREFPAGEFLD:
            {
                bValue = FALSE;
                aValueFT.SetText( SW_RESSTR( STR_OFFSET ));

                if (IsFldEdit() || pBox)    // Nur bei Interaktion mit Maus
                    aNameED.SetText(aEmptyStr);

                if (nSelPos != 0 && nSelPos != LISTBOX_ENTRY_NOTFOUND)
                {
                    bValue = TRUE;      // SubType OFF - kennt keinen Offset
                    if (IsFldEdit())
                        aValueED.SetText(String::CreateFromInt32(((SwRefPageSetField*)GetCurField())->GetOffset()));
                }
            }
            break;

        case TYP_GETREFPAGEFLD:
            aNameED.SetText(aEmptyStr);
            aValueED.SetText(aEmptyStr);
            break;
    }

    aNumFormatLB.Show(bNumFmt);
    aFormatLB.Show(!bNumFmt);

    if (IsFldEdit())
        bName = FALSE;

    aFormatLB.Enable(bFormat);
    aFormatFT.Enable(bFormat|bNumFmt);
    aNameFT.Enable(bName);
    aNameED.Enable(bName);
    aValueFT.Enable(bValue);
    aValueED.Enable(bValue);

    Size aSz(aFormatLB.GetSizePixel());

    if (bChapterLevel)
        aSz.Height() = aFormatLB.LogicToPixel(Size(1, 37), MAP_APPFONT).Height();
    else
        aSz.Height() = aFormatLB.LogicToPixel(Size(1, 71), MAP_APPFONT).Height();

    aFormatLB.SetSizePixel(aSz);

    aInvisibleCB.Show(!bSeparator);
    aSeparatorFT.Show(bSeparator);
    aSeparatorED.Show(bSeparator);
    aChapterHeaderFT.Show(bChapterLevel);
    aChapterLevelFT.Show(bChapterLevel);
    aChapterLevelLB.Show(bChapterLevel);
    aInvisibleCB.Enable(bInvisible);

    ModifyHdl();    // Anwenden/Einfuegen/Loeschen Status update

    aNumFormatLB.SetUpdateMode(TRUE);
    aFormatLB.SetUpdateMode(TRUE);

    if(aSelectionLB.IsCallAddSelection())
    {
        USHORT nTypeId = (USHORT)(ULONG)aTypeLB.GetEntryData(GetTypeSel());

        switch (nTypeId)
        {
            case TYP_FORMELFLD:
                {
                    USHORT nSelPos = aSelectionLB.GetSelectEntryPos();

                    if (nSelPos != LISTBOX_ENTRY_NOTFOUND)
                        nSelPos = (USHORT)(ULONG)aSelectionLB.GetEntryData(nSelPos);

                    if (nSelPos != LISTBOX_ENTRY_NOTFOUND && pBox && !bInit)
                    {
                        aValueED.ReplaceSelected(aSelectionLB.GetSelectEntry());
                        ModifyHdl();
                    }
                }
                break;
        }
        aSelectionLB.ResetCallAddSelection();
    }
    return 0;
}

/*--------------------------------------------------------------------
     Beschreibung: Typen in der SelectionBox erneuern
 --------------------------------------------------------------------*/

void SwFldVarPage::UpdateSubType()
{
    String sOldSel;
    USHORT nTypeId = (USHORT)(ULONG)aTypeLB.GetEntryData(GetTypeSel());

    SetSelectionSel(aSelectionLB.GetSelectEntryPos());
    if(GetSelectionSel() != LISTBOX_ENTRY_NOTFOUND)
        sOldSel = aSelectionLB.GetEntry(GetSelectionSel());

    // Auswahl-Listbox fuellen
    aSelectionLB.SetUpdateMode(FALSE);
    aSelectionLB.Clear();

    SvStringsDtor& rLst = GetFldMgr().GetSubTypes(nTypeId);
    USHORT nCount = rLst.Count();
    USHORT nPos;

    for (USHORT i = 0; i < nCount; ++i)
    {
        if (nTypeId != TYP_INPUTFLD || i)
        {
            if (!IsFldEdit())
            {
                nPos = aSelectionLB.InsertEntry(*rLst[i]);
                aSelectionLB.SetEntryData(nPos, (void*)i);
            }
            else
            {
                BOOL bInsert = FALSE;

                switch (nTypeId)
                {
                    case TYP_INPUTFLD:
                        if (*rLst[i] == GetCurField()->GetPar1())
                            bInsert = TRUE;
                        break;

                    case TYP_FORMELFLD:
                        bInsert = TRUE;
                        break;

                    case TYP_GETFLD:
                        if (*rLst[i] == ((SwFormulaField*)GetCurField())->GetFormula())
                            bInsert = TRUE;
                        break;

                    case TYP_SETFLD:
                    case TYP_USERFLD:
                        if (*rLst[i] == GetCurField()->GetTyp()->GetName())
                        {
                            bInsert = TRUE;
                            if (GetCurField()->GetSubType() & SUB_INVISIBLE)
                                aInvisibleCB.Check();
                        }
                        break;

                    case TYP_SETREFPAGEFLD:
                        if ((((SwRefPageSetField*)GetCurField())->IsOn() && i) ||
                            (!((SwRefPageSetField*)GetCurField())->IsOn() && !i))
                            sOldSel = *rLst[i];

                        // Alle Eintr„ge zur Auswahl zulassen:
                        nPos = aSelectionLB.InsertEntry(*rLst[i]);
                        aSelectionLB.SetEntryData(nPos, (void*)i);
                        break;

                    default:
                        if (*rLst[i] == GetCurField()->GetPar1())
                            bInsert = TRUE;
                        break;
                }
                if (bInsert)
                {
                    nPos = aSelectionLB.InsertEntry(*rLst[i]);
                    aSelectionLB.SetEntryData(nPos, (void*)i);
                    if (nTypeId != TYP_FORMELFLD)
                        break;
                }
            }
        }
    }

    BOOL bEnable = aSelectionLB.GetEntryCount() != 0;
    ListBox *pLB = 0;

    if (bEnable)
    {
        aSelectionLB.SelectEntry(sOldSel);
        if (!aSelectionLB.GetSelectEntryCount())
        {
            aSelectionLB.SelectEntryPos(0);
            pLB = &aSelectionLB;    // Alle Controls neu initialisieren
        }
    }

    aSelectionLB.Enable( bEnable );
    aSelectionFT.Enable( bEnable );

    SubTypeHdl(pLB);
    aSelectionLB.SetUpdateMode(TRUE);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

USHORT SwFldVarPage::FillFormatLB(USHORT nTypeId)
{
    String sOldSel, sOldNumSel;
    ULONG nOldNumFormat = 0;

    USHORT nFormatSel = aFormatLB.GetSelectEntryPos();
    if (nFormatSel != LISTBOX_ENTRY_NOTFOUND)
        sOldSel = aFormatLB.GetEntry(nFormatSel);

    USHORT nNumFormatSel = aNumFormatLB.GetSelectEntryPos();
    if (nNumFormatSel != LISTBOX_ENTRY_NOTFOUND)
    {
        sOldNumSel = aNumFormatLB.GetEntry(nNumFormatSel);
        nOldNumFormat = aNumFormatLB.GetFormat();
    }

    // Format-Listbox fuellen
    aFormatLB.Clear();
    aNumFormatLB.Clear();
    BOOL bSpecialFmt = FALSE;

    if( TYP_GETREFPAGEFLD != nTypeId )
    {
        if (IsFldEdit())
        {
            bSpecialFmt = GetCurField()->GetFormat() == ULONG_MAX || !GetCurField()->GetFormat();

            if (!bSpecialFmt)
            {
                aNumFormatLB.SetDefFormat(GetCurField()->GetFormat());
                sOldNumSel = aEmptyStr;
            }
            else
                if (nTypeId == TYP_GETFLD || nTypeId == TYP_FORMELFLD)
                    aNumFormatLB.SetFormatType(NUMBERFORMAT_NUMBER);
        }
        else
        {
            if (nOldNumFormat && nOldNumFormat != ULONG_MAX)
                aNumFormatLB.SetDefFormat(nOldNumFormat);
            else
                aNumFormatLB.SetFormatType(NUMBERFORMAT_NUMBER);
        }
    }

    switch (nTypeId)
    {
        case TYP_USERFLD:
        {
            if (!IsFldEdit() || bSpecialFmt)
            {
                USHORT nPos = aNumFormatLB.InsertEntry(SW_RESSTR(FMT_MARK_TEXT), 0);
                aNumFormatLB.SetEntryData(nPos, (void *)ULONG_MAX);
                nPos = aNumFormatLB.InsertEntry(SW_RESSTR(FMT_USERVAR_CMD), 1);
                aNumFormatLB.SetEntryData(nPos, (void *)ULONG_MAX);
            }
        }
        break;

        case TYP_SETFLD:
        {
            if (!IsFldEdit() || bSpecialFmt)
            {
                USHORT nPos = aNumFormatLB.InsertEntry(SW_RESSTR(FMT_SETVAR_TEXT), 0);
                aNumFormatLB.SetEntryData(nPos, (void *)ULONG_MAX);
            }
        }
        break;

        case TYP_FORMELFLD:
        {
            USHORT nPos = aNumFormatLB.InsertEntry(SW_RESSTR(FMT_GETVAR_NAME), 0);
            aNumFormatLB.SetEntryData(nPos, (void *)ULONG_MAX);
        }
        break;

        case TYP_GETFLD:
        {
            USHORT nPos = aNumFormatLB.InsertEntry(SW_RESSTR(FMT_GETVAR_NAME), 0);
            aNumFormatLB.SetEntryData(nPos, (void *)ULONG_MAX);
        }
        break;
    }

    if (IsFldEdit() && bSpecialFmt)
    {
        if (nTypeId == TYP_USERFLD && (GetCurField()->GetSubType() & SUB_CMD))
            aNumFormatLB.SelectEntryPos(1);
        else
            aNumFormatLB.SelectEntryPos(0);
    }
    else
    {
        if (!nOldNumFormat && (nNumFormatSel = aNumFormatLB.GetEntryPos(sOldNumSel)) != LISTBOX_ENTRY_NOTFOUND)
            aNumFormatLB.SelectEntryPos(nNumFormatSel);
        else if (nOldNumFormat && nOldNumFormat == ULONG_MAX)
            aNumFormatLB.SelectEntry(sOldSel);
    }

    USHORT nSize = GetFldMgr().GetFormatCount(nTypeId, FALSE, IsFldDlgHtmlMode());

    for (USHORT i = 0; i < nSize; i++)
    {
        USHORT nPos = aFormatLB.InsertEntry(GetFldMgr().GetFormatStr(nTypeId, i));
        USHORT nFldId = GetFldMgr().GetFormatId( nTypeId, i );
        aFormatLB.SetEntryData( nPos, (void*)nFldId );
        if (IsFldEdit() && nFldId == GetCurField()->GetFormat())
            aFormatLB.SelectEntryPos( nPos );
    }

    if (nSize && (!IsFldEdit() || !aFormatLB.GetSelectEntryCount()))
    {
        aFormatLB.SelectEntry(sOldSel);

        if (!aFormatLB.GetSelectEntryCount())
        {
            aFormatLB.SelectEntry(SW_RESSTR(FMT_NUM_PAGEDESC));
            if (!aFormatLB.GetSelectEntryCount())
            {
                aFormatLB.SelectEntry(SW_RESSTR(FMT_NUM_ARABIC));
                if (!aFormatLB.GetSelectEntryCount())
                    aFormatLB.SelectEntryPos(0);
            }
        }
    }

    return nSize;
}

/*--------------------------------------------------------------------
    Beschreibung: Modify
 --------------------------------------------------------------------*/

IMPL_LINK( SwFldVarPage, ModifyHdl, Edit *, EMPTYARG )
{
    String sValue(aValueED.GetText());
    BOOL bHasValue = sValue.Len() != 0;
    USHORT nTypeId = (USHORT)(ULONG)aTypeLB.GetEntryData(GetTypeSel());
    BOOL bInsert = FALSE, bApply = FALSE, bDelete = FALSE;

    String sName(aNameED.GetText());
    const USHORT nOldLen = sName.Len();
    Selection aSel(aNameED.GetSelection());

    if( nTypeId == TYP_DDEFLD ||
        nTypeId == TYP_USERFLD ||
        nTypeId == TYP_SETFLD ||
        nTypeId == TYP_SEQFLD)
    {
        sName.EraseAllChars(' ');
        sName.EraseAllChars('-');
    }
    const USHORT nLen = sName.Len();

    if (nOldLen != nLen)
    {
        aNameED.SetText(sName);
        aNameED.SetSelection(aSel); // Cursorpos restaurieren
    }

    // Buttons ueberpruefen
    switch (nTypeId)
    {
        case TYP_DDEFLD:
            {
                // Gibts schon einen entsprechenden Type
                bInsert = bApply = sName.Len() > 0;

                SwFieldType* pType = GetFldMgr().GetFldType(RES_DDEFLD, sName);

                if (pType)
                    bDelete = !::GetActiveView()->GetWrtShell().IsUsed( *pType );
            }
            break;

        case TYP_USERFLD:
            {
                // Gibts schon einen entsprechenden Type
                SwFieldType* pType = GetFldMgr().GetFldType(RES_USERFLD, sName);

                if (pType)
                    bDelete = !::GetActiveView()->GetWrtShell().IsUsed( *pType );

                pType = GetFldMgr().GetFldType(RES_SETEXPFLD, sName);
                if (!pType) // Kein Namenskonflikt mit Variablen
                {
                    // Benutzerfelder duerfen auch ohne Inhalt eingefuegt werden!
                    // Bug #56845
                    bInsert = bApply = sName.Len() > 0;
                }
            }
            break;

        default:
            {
                bInsert = TRUE;

                if (nTypeId == TYP_SETFLD || nTypeId == TYP_SEQFLD)
                {
                    SwSetExpFieldType* pFldType = (SwSetExpFieldType*)
                        GetFldMgr().GetFldType(RES_SETEXPFLD, sName);

                    if (pFldType)
                    {

                        SwWrtShell &rSh = ::GetActiveView()->GetWrtShell();
                        const SwFldTypes* p = rSh.GetDoc()->GetFldTypes();
                        USHORT i;

                        for (i = 0; i < INIT_FLDTYPES; i++)
                        {
                            SwFieldType* pType = (*p)[ i ];
                            if (pType == pFldType)
                                break;
                        }

                        if (i >= INIT_FLDTYPES && !rSh.IsUsed(*pFldType))
                            bDelete = TRUE;

                        if (nTypeId == TYP_SEQFLD && !(pFldType->GetType() & GSE_SEQ))
                            bInsert = FALSE;

                        if (nTypeId == TYP_SETFLD && (pFldType->GetType() & GSE_SEQ))
                            bInsert = FALSE;
                    }
                    if (GetFldMgr().GetFldType(RES_USERFLD, sName))
                        bInsert = FALSE;
                }

                if (nLen == 0 && (nTypeId == TYP_SETFLD || (!IsFldEdit() && nTypeId == TYP_GETFLD)))
                    bInsert = FALSE;

                if ((nTypeId == TYP_SETFLD || nTypeId == TYP_FORMELFLD) && !bHasValue)
                    bInsert = FALSE;
            }
            break;
    }

    aNewDelTBX.EnableItem(BT_VARAPPLY, bApply);
    aNewDelTBX.EnableItem(BT_VARDELETE, bDelete);
    EnableInsert(bInsert);

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwFldVarPage, TBClickHdl, ToolBox *, pBox )
{
    USHORT nTypeId = (USHORT)(ULONG)aTypeLB.GetEntryData(GetTypeSel());

    switch (pBox->GetCurItemId())
    {
        case BT_VARDELETE:
        {
            if( nTypeId == TYP_USERFLD )
                GetFldMgr().RemoveFldType(RES_USERFLD, aSelectionLB.GetSelectEntry());
            else
            {
                USHORT nWhich;

                switch(nTypeId)
                {
                    case TYP_SETFLD:
                    case TYP_SEQFLD:
                        nWhich = RES_SETEXPFLD;
                        break;
                    default:
                        nWhich = RES_DDEFLD;
                        break;
                }

                GetFldMgr().RemoveFldType(nWhich, aSelectionLB.GetSelectEntry());
            }

            UpdateSubType();
            ::GetActiveView()->GetWrtShell().SetModified();
        }
        break;

        case BT_VARAPPLY:
        {
            String sName(aNameED.GetText()), sValue(aValueED.GetText());
            SwFieldType* pType = 0;
            USHORT nId;
            USHORT nNumFormatPos = aNumFormatLB.GetSelectEntryPos();

            switch (nTypeId)
            {
                case TYP_USERFLD:   nId = RES_USERFLD;  break;
                case TYP_DDEFLD:    nId = RES_DDEFLD;   break;
                case TYP_SETFLD:    nId = RES_SETEXPFLD;break;
            }
            pType = GetFldMgr().GetFldType(nId, sName);

            ULONG nFormat = aFormatLB.GetSelectEntryPos();
            if (nFormat != LISTBOX_ENTRY_NOTFOUND)
                nFormat = (ULONG)aFormatLB.GetEntryData((USHORT)nFormat);

            if (pType)  // Aendern
            {
                SwWrtShell &rSh = ::GetActiveView()->GetWrtShell();
                rSh.StartAllAction();

                if (nTypeId == TYP_USERFLD)
                {
                    if (nNumFormatPos != LISTBOX_ENTRY_NOTFOUND)
                    {
                        ULONG nFmt = nNumFormatPos == 0 ? 0 : aNumFormatLB.GetFormat();
                        if (nFmt)
                        {   // Sprache auf Office-Sprache umstellen, da String im Office
                            // Format vom Kalkulator erwartet wird und so in den Dlg
                            // eingegeben werden sollte
                            SvNumberFormatter* pFormatter = rSh.GetNumberFormatter();
                            nFmt = SwValueField::GetSystemFormat(rSh.GetNumberFormatter(), nFmt);
                        }
                        ((SwUserFieldType*)pType)->SetContent(aValueED.GetText(), nFmt);
                        ((SwUserFieldType*)pType)->SetType(
                            nNumFormatPos == 0 ? GSE_STRING : GSE_EXPR );
                    }
                }
                else
                {
                    if (nFormat != LISTBOX_ENTRY_NOTFOUND)
                    {
                        //JP 28.08.95: DDE-Topics/-Items koennen Blanks in ihren
                        //              Namen haben! Wird hier noch nicht beachtet.
                        USHORT nTmpPos = sValue.SearchAndReplace( ' ', cTokenSeperator );
                        sValue.SearchAndReplace( ' ', cTokenSeperator, nTmpPos );
                        ((SwDDEFieldType*)pType)->SetCmd(sValue);
                        ((SwDDEFieldType*)pType)->SetType((USHORT)nFormat);
                    }
                }
                pType->UpdateFlds();

                ::GetActiveView()->GetWrtShell().EndAllAction();
            }
            else        // Neu
            {
                if(nTypeId == TYP_USERFLD)
                {
                    SwUserFieldType aType( ::GetActiveView()->GetWrtShellPtr()->GetDoc(), sName );

                    if (nNumFormatPos != LISTBOX_ENTRY_NOTFOUND)
                    {
                        aType.SetType(nNumFormatPos == 0 ? GSE_STRING : GSE_EXPR);
                        aType.SetContent( sValue, nNumFormatPos == 0 ? 0 : aNumFormatLB.GetFormat() );
                        aSelectionLB.InsertEntry(sName);
                        aSelectionLB.SelectEntry(sName);
                        GetFldMgr().InsertFldType( aType ); // Userfld Neu
                    }
                }
                else
                {
                    if (nFormat != LISTBOX_ENTRY_NOTFOUND)
                    {
                        //JP 28.08.95: DDE-Topics/-Items koennen Blanks in ihren
                        //              Namen haben! Wird hier noch nicht beachtet.
                        USHORT nTmpPos = sValue.SearchAndReplace( ' ', cTokenSeperator );
                        sValue.SearchAndReplace( ' ', cTokenSeperator, nTmpPos );

                        SwDDEFieldType aType(sName, sValue, (USHORT)nFormat);
                        aSelectionLB.InsertEntry(sName);
                        aSelectionLB.SelectEntry(sName);
                        GetFldMgr().InsertFldType(aType);   // DDE-Feld Neu
                    }
                }
            }
            if (IsFldEdit())
                GetFldMgr().GetCurFld();    // FieldManager Updaten

            UpdateSubType();
        }
        break;
    }

    return TRUE;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwFldVarPage, ChapterHdl, ListBox *, pLB )
{
    BOOL bEnable = aChapterLevelLB.GetSelectEntryPos() != 0;

    aSeparatorED.Enable(bEnable);
    aSeparatorFT.Enable(bEnable);
    SeparatorHdl();

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwFldVarPage, SeparatorHdl, Edit *, pED )
{
    BOOL bEnable = aSeparatorED.GetText().Len() != 0 ||
                    aChapterLevelLB.GetSelectEntryPos() == 0;
    EnableInsert(bEnable);

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

BOOL __EXPORT SwFldVarPage::FillItemSet(SfxItemSet& rSet)
{
    USHORT nTypeId = (USHORT)(ULONG)aTypeLB.GetEntryData(GetTypeSel());

    String aVal(aValueED.GetText());
    String aName(aNameED.GetText());

    USHORT nSubType = aSelectionLB.GetSelectEntryPos();
    if(nSubType == LISTBOX_ENTRY_NOTFOUND)
        nSubType = 0;
    else
        nSubType = (USHORT)(ULONG)aSelectionLB.GetEntryData(nSubType);

    ULONG nFormat;

    if (!aNumFormatLB.IsVisible())
    {
        nFormat = aFormatLB.GetSelectEntryPos();

        if(nFormat == LISTBOX_ENTRY_NOTFOUND)
            nFormat = 0;
        else
            nFormat = (ULONG)aFormatLB.GetEntryData((USHORT)nFormat);
    }
    else
    {
        nFormat = aNumFormatLB.GetFormat();

        if (nFormat && nFormat != ULONG_MAX)
        {
            // Sprache auf Office-Sprache umstellen, da String im Office-
            // Format vom Kalkulator erwartet wird und so in den Dlg
            // eingegeben werden sollte
            SwWrtShell &rSh = ::GetActiveView()->GetWrtShell();
            SvNumberFormatter* pFormatter = rSh.GetNumberFormatter();

            nFormat = SwValueField::GetSystemFormat(rSh.GetNumberFormatter(), nFormat);
        }
    }
    sal_Unicode cSeparator = ' ';
    switch (nTypeId)
    {
        case TYP_USERFLD:
        {
            nSubType = (nFormat == ULONG_MAX) ? GSE_STRING : GSE_EXPR;

            if (nFormat == ULONG_MAX && aNumFormatLB.GetSelectEntry() == SW_RESSTR(FMT_USERVAR_CMD))
                nSubType |= SUB_CMD;

            if (aInvisibleCB.IsChecked())
                nSubType |= SUB_INVISIBLE;
            break;
        }
        case TYP_FORMELFLD:
        {
            nSubType = GSE_FORMULA;
            if (aNumFormatLB.IsVisible() && nFormat == ULONG_MAX)
                nSubType |= SUB_CMD;
            break;
        }
        case TYP_GETFLD:
        {
            nSubType &= 0xff00;
            if (aNumFormatLB.IsVisible() && nFormat == ULONG_MAX)
                nSubType |= SUB_CMD;
            break;
        }
        case TYP_INPUTFLD:
        {
            SwFieldType* pType = GetFldMgr().GetFldType(RES_USERFLD, aName);
            nSubType = (nSubType & 0xff00) | ((pType) ? INP_USR : INP_VAR);
            break;
        }

        case TYP_SETFLD:
        {
            if (IsFldDlgHtmlMode())
            {
                nSubType = 0x0100;
                nSubType = (nSubType & 0xff00) | GSE_STRING;
            }
            else
                nSubType = (nSubType & 0xff00) | ((nFormat == ULONG_MAX) ? GSE_STRING : GSE_EXPR);

            if (aInvisibleCB.IsChecked())
                nSubType |= SUB_INVISIBLE;
            break;
        }
        case TYP_SEQFLD:
        {
            // nSubType = GSE_SEQ;  // GSE_SEQ wird im Fldmgr fest gesetzt, kann also entfallen
            nSubType = aChapterLevelLB.GetSelectEntryPos();
            if (nSubType == 0)
                nSubType = 0x7f;
            else
            {
                nSubType--;
                String sSeparator(aSeparatorED.GetText().GetChar(0));
                cSeparator = sSeparator.Len() ? sSeparator.GetChar(0) : ' ';
                //nSubType |= (USHORT)(((BYTE)) << 8);
            }
            break;
        }
        case TYP_GETREFPAGEFLD:
            if( SVX_NUM_CHAR_SPECIAL == nFormat )
                aVal = aValueED.GetText();
            break;
    }

    if (!IsFldEdit() ||
        aNameED.GetSavedValue() != aNameED.GetText() ||
        aValueED.GetSavedValue() != aValueED.GetText() ||
        aSelectionLB.GetSavedValue() != aSelectionLB.GetSelectEntryPos() ||
        aFormatLB.GetSavedValue() != aFormatLB.GetSelectEntryPos() ||
        nOldFormat != aNumFormatLB.GetFormat() ||
        aInvisibleCB.GetState() != aInvisibleCB.GetSavedValue() ||
        aChapterLevelLB.GetSavedValue() != aChapterLevelLB.GetSelectEntryPos() ||
        aSeparatorED.GetSavedValue() != aSeparatorED.GetText())
    {
        InsertFld( nTypeId, nSubType, aName, aVal, nFormat, cSeparator );
    }

    UpdateSubType();

    return FALSE;
}


/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SfxTabPage* __EXPORT SwFldVarPage::Create(  Window* pParent,
                        const SfxItemSet& rAttrSet )
{
    return ( new SwFldVarPage( pParent, rAttrSet ) );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

USHORT SwFldVarPage::GetGroup()
{
    return GRP_VAR;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SelectionListBox::SelectionListBox( SwFldVarPage* pDialog, const ResId& rResId ) :
    ListBox (pDialog, rResId),
    pDlg    (pDialog),
    bCallAddSelection(FALSE)
{
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

long SelectionListBox::PreNotify( NotifyEvent& rNEvt )
{
    long nHandled = ListBox::PreNotify( rNEvt );
    //BOOL bAddSel = FALSE;
    if ( rNEvt.GetType() == EVENT_KEYUP )
    {
        const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
        const KeyCode aKeyCode = pKEvt->GetKeyCode();
        const USHORT nModifier = aKeyCode.GetModifier();
        if( aKeyCode.GetCode() == KEY_SPACE && !nModifier)
//          bAddSel = TRUE;
            bCallAddSelection = TRUE;
    }
    if ( rNEvt.GetType() == EVENT_MOUSEBUTTONDOWN )
    {
        const MouseEvent* pMEvt = rNEvt.GetMouseEvent();

        if (pMEvt && (pMEvt->IsMod1() || pMEvt->IsMod2()))  // Alt oder Ctrl
            //bAddSel = TRUE;
            bCallAddSelection = TRUE;
    }

//  if (bAddSel)
//      pDlg->AddSelection(this);

    return nHandled;
}
/* -----------------12.01.99 11:14-------------------
 *
 * --------------------------------------------------*/
void SwFldVarPage::FillUserData()
{
    String sData(String::CreateFromAscii(USER_DATA_VERSION));
    sData += ';';
    USHORT nTypeSel = aTypeLB.GetSelectEntryPos();
    if( LISTBOX_ENTRY_NOTFOUND == nTypeSel )
        nTypeSel = USHRT_MAX;
    else
        nTypeSel = (ULONG)aTypeLB.GetEntryData( nTypeSel );
    sData += String::CreateFromInt32( nTypeSel );
    SetUserData(sData);
}
/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.54  2000/09/18 16:05:30  willem.vandorp
    OpenOffice header added.

    Revision 1.53  2000/08/25 14:18:40  os
    CreateFromInt32()

    Revision 1.52  2000/07/20 18:00:34  jp
    FillFormatLB: don't call SetDefFormat/SetFormatType if the field is a GetRefPageFld

    Revision 1.51  2000/06/30 08:52:53  os
    #76541# string assertions removed

    Revision 1.50  2000/05/23 18:36:52  jp
    Bugfixes for Unicode

    Revision 1.49  2000/04/18 15:17:32  os
    UNICODE

    Revision 1.48  2000/02/11 14:46:46  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.47  1999/05/25 09:25:22  OS
    #64715# Ctrl/Alt-Erkennung im PreNotify und Auswertung im SelectHdl


      Rev 1.46   25 May 1999 11:25:22   OS
   #64715# Ctrl/Alt-Erkennung im PreNotify und Auswertung im SelectHdl

      Rev 1.45   20 Apr 1999 10:59:34   JP
   Bug #65026#: SequenceFelder: Level/Sep-Controls im SubTypeHdl aktualisieren

      Rev 1.44   25 Feb 1999 17:24:52   JP
   Bug #62438#: UserData nur auswerten, wenn kein Refresh ist

      Rev 1.43   08 Feb 1999 15:07:18   OS
   #60579# UserData nur einmalig auslesen

      Rev 1.42   21 Jan 1999 09:46:24   OS
   #59900# Fussnoten im Dialog korrekt sortieren; keine prot. Member

      Rev 1.41   12 Jan 1999 11:42:26   OS
   #60579# ausgewaehlten Typ in den UserData speichern

      Rev 1.40   11 Dec 1998 15:16:24   OM
   #60051# Richtiges Format fuer Serienbrieffelder waehlen

      Rev 1.39   17 Nov 1998 10:50:36   OS
   #58263# NumType durch SvxExtNumType ersetzt

      Rev 1.38   30 Oct 1998 15:33:02   OM
   #58522# Richtigen Wert bei Formelfeld bearbeiten

      Rev 1.37   29 Oct 1998 14:08:32   OM
   #58544# Butzerfeld: richtigen Inhalt anzeigen

      Rev 1.36   27 Oct 1998 14:01:16   OM
   #57956# Formelfeld: richtigen Wert anzeigen

      Rev 1.35   15 Oct 1998 15:58:32   OM
   #57956# Richtige Formel bearbeiten

      Rev 1.34   21 Sep 1998 16:05:42   OM
   #56845# Leere Benutzerfelder zulassen

      Rev 1.33   15 Sep 1998 16:02:04   OM
   #55149# In Dialogen Zahlenformat der Applikation verwenden

      Rev 1.32   10 Aug 1998 16:41:12   JP
   Bug #54796#: neue NumerierungsTypen (WW97 kompatibel)

      Rev 1.31   18 Jun 1998 15:50:46   OM
   Ebenen fangen mit 1 an

      Rev 1.30   18 Jun 1998 11:59:00   OM
   Kapitelebenen fuer Nummernkreise

      Rev 1.29   18 Jun 1998 11:21:10   OM
   Kapitelebenen fuer Nummernkreise

      Rev 1.28   03 Apr 1998 14:38:40   OM
   #49178 Akualisierung verbessert

      Rev 1.27   30 Mar 1998 11:00:38   OM
   Edit: OK-Button auch bei FLD_GETVAR enablen

      Rev 1.26   27 Mar 1998 17:15:04   OM
   Nur bei Aenderung Dok modifizieren

      Rev 1.25   27 Mar 1998 14:56:20   OM
   #48908# Formel beim Bearbeiten anzeigen

      Rev 1.24   12 Mar 1998 16:32:00   OM
   Datenbanknamen in eckigen Klammern bei Drop

      Rev 1.23   16 Feb 1998 10:10:24   OM
   Fuer Solaris nicht direkt von void* auf ushort casten

      Rev 1.22   11 Feb 1998 16:29:40   OM
   Textdarstellung fuer Felder

      Rev 1.21   11 Feb 1998 11:49:58   OM
   Formel einfuegen

      Rev 1.20   06 Feb 1998 14:50:56   OM
   #47089# Seitenvariable anzeigen

      Rev 1.19   02 Feb 1998 11:26:22   OM
   #46839# Nummernkreise editieren: Als Value Formel anzeigen

      Rev 1.18   13 Jan 1998 15:02:06   OM
   Formula-Field wieder unterstuetzt

      Rev 1.17   12 Jan 1998 17:10:24   OM
   Formelfelder wieder erlauben

      Rev 1.16   12 Jan 1998 14:16:04   OM
   Keine Namenskonflikte zwischen verschiedenen Variablentypen

      Rev 1.15   12 Jan 1998 12:43:34   OM
   Eintraege der Edits beibehalten

      Rev 1.14   09 Jan 1998 16:57:18   OM
   Bei Dok-Wechsel updaten

      Rev 1.13   08 Jan 1998 14:58:26   OM
   Traveling

      Rev 1.12   07 Jan 1998 17:18:18   OM
   Referenzen editieren

      Rev 1.11   19 Dec 1997 18:25:00   OM
   Feldbefehl-bearbeiten Dlg

      Rev 1.10   17 Dec 1997 17:58:46   OM
   Datumsformate fuer SetExpFields

      Rev 1.9   16 Dec 1997 17:02:58   OM
   Feldbefehle bearbeiten

      Rev 1.8   12 Dec 1997 16:11:12   OM
   AutoUpdate bei FocusWechsel u.a.

      Rev 1.7   11 Dec 1997 16:59:30   OM
   Feldumstellung

      Rev 1.6   28 Nov 1997 19:55:06   MA
   includes

      Rev 1.5   28 Nov 1997 15:37:02   OM
   Variablen-TP

      Rev 1.4   27 Nov 1997 13:18:02   OM
   Variablen-TP

      Rev 1.3   05 Nov 1997 15:35:42   OM
   Neuer Feldbefehldialog

      Rev 1.2   03 Nov 1997 11:40:56   OM
   Neuer Felddialog

      Rev 1.1   31 Oct 1997 15:14:42   OM
   Feldumstellung

      Rev 1.0   30 Oct 1997 16:31:26   OM
   Initial revision.

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/fldui/fldvar.hxx b/sw/source/ui/fldui/fldvar.hxx
new file mode 100644
index 0000000..ef1f71b7
--- /dev/null
+++ b/sw/source/ui/fldui/fldvar.hxx
@@ -0,0 +1,172 @@
/*************************************************************************
 *
 *  $RCSfile: fldvar.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:37 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWFLDVAR_HXX
#define _SWFLDVAR_HXX

#ifndef _SFXTABDLG_HXX //autogen
#include <sfx2/tabdlg.hxx>
#endif
#ifndef _SV_FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif
#ifndef _SV_LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif
#ifndef _SV_BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif
#ifndef _SV_GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif
#ifndef _SV_TOOLBOX_HXX //autogen
#include <vcl/toolbox.hxx>
#endif
#ifndef _SV_EDIT_HXX //autogen
#include <vcl/edit.hxx>
#endif

#include "fldpage.hxx"
#include "condedit.hxx"
#include "numfmtlb.hxx"

class SwFldVarPage;

/*--------------------------------------------------------------------
   Beschreibung:
 --------------------------------------------------------------------*/

class SelectionListBox : public ListBox
{
    SwFldVarPage*   pDlg;
    BOOL            bCallAddSelection;

    virtual long        PreNotify( NotifyEvent& rNEvt );

public:
    SelectionListBox( SwFldVarPage* pDialog, const ResId& rResId );

    //  Selektieren per Ctrl oder Alt erkennen und mit SelectHdl auswerten
    BOOL            IsCallAddSelection() const {return bCallAddSelection;}
    void            ResetCallAddSelection() {bCallAddSelection = FALSE;}
};

/*--------------------------------------------------------------------
   Beschreibung:
 --------------------------------------------------------------------*/

class SwFldVarPage : public SwFldPage
{
    friend class SelectionListBox;

    FixedText           aTypeFT;
    ListBox             aTypeLB;
    FixedText           aSelectionFT;
    SelectionListBox    aSelectionLB;
    FixedText           aNameFT;
    Edit                aNameED;
    FixedText           aValueFT;
    ConditionEdit       aValueED;
    FixedText           aFormatFT;
    NumFormatListBox    aNumFormatLB;
    ListBox             aFormatLB;
    FixedText           aChapterHeaderFT;
    FixedText           aChapterLevelFT;
    ListBox             aChapterLevelLB;
    CheckBox            aInvisibleCB;
    FixedText           aSeparatorFT;
    Edit                aSeparatorED;
    ToolBox             aNewDelTBX;

    String              sOldValueFT;
    String              sOldNameFT;

    ULONG               nOldFormat;
    BOOL                bInit;

    DECL_LINK( TypeHdl, ListBox* pLB = 0 );
    DECL_LINK( SubTypeHdl, ListBox* pLB = 0 );
    DECL_LINK( ModifyHdl, Edit *pED = 0 );
    DECL_LINK( TBClickHdl, ToolBox *pTB = 0);
    DECL_LINK( ChapterHdl, ListBox *pLB = 0);
    DECL_LINK( SeparatorHdl, Edit *pED = 0 );

    void                UpdateSubType();
    USHORT              FillFormatLB(USHORT nTypeId);

protected:
    virtual USHORT      GetGroup();

public:
                        SwFldVarPage(Window* pParent, const SfxItemSet& rSet);

                        ~SwFldVarPage();

    static SfxTabPage*  Create(Window* pParent, const SfxItemSet& rAttrSet);

    virtual BOOL        FillItemSet( SfxItemSet& rSet );
    virtual void        Reset( const SfxItemSet& rSet );

    virtual void        FillUserData();
};


#endif

diff --git a/sw/source/ui/fldui/fldvar.src b/sw/source/ui/fldui/fldvar.src
new file mode 100644
index 0000000..5c38ec8
--- /dev/null
+++ b/sw/source/ui/fldui/fldvar.src
@@ -0,0 +1,560 @@
/*************************************************************************
 *
 *  $RCSfile: fldvar.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:37 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "globals.hrc"
#include "fldtdlg.hrc"
#include "helpid.h"
#include "cmdid.h"
TabPage TP_FLD_VAR
{
    HelpID = HID_FLD_VAR ;
    SVLook = TRUE ;
    Hide = TRUE ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Text = "Variablen" ;
    Text [ ENGLISH ] = "Variables" ;
    FixedText FT_VARTYPE
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 76 , 10 ) ;
        Text = "~Feldtyp" ;
        Text [ ENGLISH ] = "Type" ;
        Text [ norwegian ] = "Type" ;
        Text [ italian ] = "~Tipo di campo" ;
        Text [ portuguese_brazilian ] = "Tipo" ;
        Text [ portuguese ] = "Tipo de ~campo" ;
        Text [ finnish ] = "Laji" ;
        Text [ danish ] = "Felttype" ;
        Text [ french ] = "~Type de champ" ;
        Text [ swedish ] = "~Fälttyp" ;
        Text [ dutch ] = "~Veldtype" ;
        Text [ spanish ] = "~Tipo de campo" ;
        Text [ english_us ] = "~Type" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "×Ö¶ÎÀàÐÍ(~T)";
        Text[ russian ] = "Òèï ïîëÿ";
        Text[ polish ] = "Typ pola";
        Text[ japanese ] = "̨°ÙÄނ̎í—Þ(~T)";
        Text[ chinese_traditional ] = "Ãþ«¬(~T)";
        Text[ arabic ] = "äæÚ ÇáÍÞá";
        Text[ greek ] = "~Ôýðïò ðåäßïõ";
        Text[ korean ] = "ÇüÅÂ(~T)";
        Text[ turkish ] = "A~lan tipi";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_VARTYPE
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 6 , 16 ) ;
        Size = MAP_APPFONT ( 76 , 83 ) ;
        TabStop = TRUE ;
        Sort = FALSE ;
        AutoHScroll = TRUE ;
    };
    FixedText FT_VARSELECTION
    {
        Pos = MAP_APPFONT ( 88 , 3 ) ;
        Size = MAP_APPFONT ( 76 , 8 ) ;
        Text = "~Auswahl" ;
        Text [ ENGLISH ] = "S~election" ;
        Left = TRUE ;
        Text [ english_us ] = "S~election" ;
        Text [ portuguese_brazilian ] = "~Auswahl" ;
        Text [ swedish ] = "Urv~al" ;
        Text [ danish ] = "Udvalg" ;
        Text [ italian ] = "~Selezione" ;
        Text [ spanish ] = "~Selección" ;
        Text [ french ] = "~Sélection" ;
        Text [ dutch ] = "~Selectie" ;
        Text [ portuguese ] = "~Selecção" ;
        Text[ chinese_simplified ] = "Ñ¡Ôñ(~E)";
        Text[ russian ] = "Âûáîð";
        Text[ polish ] = "~Wybór";
        Text[ japanese ] = "‘I‘ð(~E)";
        Text[ chinese_traditional ] = "¿ï¨ú(~E)";
        Text[ arabic ] = "ÇáÊÍÏíÏ";
        Text[ greek ] = "~ÅðéëïãÞ";
        Text[ korean ] = "¼±ÅÃ(~E)";
        Text[ turkish ] = "~Seçim";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_VARSELECTION
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 88 , 16 ) ;
        Size = MAP_APPFONT ( 76 , 83 ) ;
        TabStop = TRUE ;
        Sort = TRUE ;
    };
    FixedText FT_VARFORMAT
    {
        Pos = MAP_APPFONT ( 170 , 3 ) ;
        Size = MAP_APPFONT ( 84 , 10 ) ;
        TEXT = "F~ormat" ;
        TEXT [ English ] = "Format" ;
        Left = TRUE ;
        Text [ english_us ] = "Format" ;
        Text [ portuguese_brazilian ] = "F~ormat" ;
        Text [ swedish ] = "F~ormat" ;
        Text [ danish ] = "Format" ;
        Text [ italian ] = "F~ormato" ;
        Text [ spanish ] = "F~ormato" ;
        Text [ french ] = "F~ormat" ;
        Text [ dutch ] = "~Formaat" ;
        Text [ portuguese ] = "F~ormato" ;
        Text[ chinese_simplified ] = "¸ñʽ(~O)";
        Text[ russian ] = "Ôîðìàò";
        Text[ polish ] = "Format";
        Text[ japanese ] = "‘Ž®";
        Text[ chinese_traditional ] = "®æ¦¡(~F)";
        Text[ arabic ] = "ÇáÊäÓíÞ";
        Text[ greek ] = "Ì~ïñöÞ";
        Text[ korean ] = "¼­½Ä";
        Text[ turkish ] = "F~ormat";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_VARFORMAT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 170 , 16 ) ;
        Size = MAP_APPFONT ( 84 , 71 ) ;
        TabStop = TRUE ;
        DropDown = FALSE ;
    };
    ListBox LB_VARNUMFORMAT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 170 , 16 ) ;
        Size = MAP_APPFONT ( 84 , 71 ) ;
        TabStop = TRUE ;
        DropDown = FALSE ;
    };
    CheckBox CB_VARINVISIBLE
    {
        Pos = MAP_APPFONT ( 170 , 91 ) ;
        Size = MAP_APPFONT ( 84 , 10 ) ;
        TEXT = "~Unsichtbar" ;
        TEXT [ English ] = "Invisible" ;
        TEXT [ norwegian ] = "Usynlig" ;
        TEXT [ italian ] = "Nascosto" ;
        TEXT [ portuguese_brazilian ] = "Invisível" ;
        TEXT [ portuguese ] = "~Invisível" ;
        TEXT [ finnish ] = "Näkymätön" ;
        TEXT [ danish ] = "Usynlig" ;
        TEXT [ french ] = "Invisible" ;
        TEXT [ swedish ] = "Os~ynlig" ;
        TEXT [ dutch ] = "~Onzichtbaar" ;
        TEXT [ spanish ] = "Invisi~ble" ;
        TEXT [ english_us ] = "Invisi~ble" ;
        TabStop = TRUE ;
        TEXT[ chinese_simplified ] = "ÒþÈëµÄ";
        TEXT[ russian ] = "Íåâèäèìûé";
        TEXT[ polish ] = "Niewid~oczny";
        TEXT[ japanese ] = "”ñ•\\ަ";
        TEXT[ chinese_traditional ] = "Áô¤Jªº";
        TEXT[ arabic ] = "ÛíÑ ãÑÆí";
        TEXT[ greek ] = "Ìç ïñáôÜ";
        TEXT[ korean ] = "¾Èº¸ÀÓ(~B)";
        TEXT[ turkish ] = "Görünmez";
        TEXT[ language_user1 ] = " ";
    };
    FixedText FT_VARCHAPTERHEADER
    {
        Pos = MAP_APPFONT ( 170 , 62 ) ;
        Size = MAP_APPFONT ( 84 , 10 ) ;
        Hide = TRUE ;
        TEXT = "Kapitelweise Nummerierung" ;
        TEXT [ English ] = "Chapter numbering" ;
        Text [ english_us ] = "Numbering by chapter" ;
        Text [ portuguese_brazilian ] = "Kapitelweise Numerierung" ;
        Text [ swedish ] = "Numrering kapitelvis" ;
        Text [ danish ] = "Kapitelvis nummerering" ;
        Text [ italian ] = "Numerazione a capitoli" ;
        Text [ spanish ] = "Numeración de capítulos" ;
        Text [ french ] = "Numérotation par chapitre" ;
        Text [ dutch ] = "Hoofdstuksgewijs nummeren" ;
        Text [ portuguese ] = "Numeração por capítulos" ;
        Text[ chinese_simplified ] = "°´Õ±àºÅ";
        Text[ russian ] = "Íóìåðàöèÿ ïî ãëàâàì";
        Text[ polish ] = "Numeracja wed³ug rozdzia³ów ";
        Text[ japanese ] = "Í‚̔ԍ†•t‚¯";
        Text[ chinese_traditional ] = "«ö³¹½s¸¹";
        Text[ arabic ] = "ÊÑÞíã ÝÕæá";
        Text[ greek ] = "Áñßèìçóç êáôÜ êåöÜëáéá";
        Text[ korean ] = "ÀåÀ¸·Î ¹øÈ£¸Å±â±â";
        Text[ turkish ] = "Bölüme göre numaralama";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_VARCHAPTERLEVEL
    {
        Pos = MAP_APPFONT ( 175 , 76 ) ;
        Size = MAP_APPFONT ( 30 , 10 ) ;
        Hide = TRUE ;
        TEXT = "E~bene" ;
        TEXT [ English ] = "Level" ;
        Text [ english_us ] = "~Level" ;
        Text [ portuguese_brazilian ] = "E~bene" ;
        Text [ swedish ] = "~Nivå" ;
        Text [ danish ] = "Niveau" ;
        Text [ italian ] = "Li~vello" ;
        Text [ spanish ] = "~Nivel" ;
        Text [ french ] = "Ni~veau" ;
        Text [ dutch ] = "N~iveau" ;
        Text [ portuguese ] = "~Nível" ;
        Text[ chinese_simplified ] = "¼¶(~L)";
        Text[ russian ] = "Óðîâåíü";
        Text[ polish ] = "Poziom";
        Text[ japanese ] = "ÚÍÞÙ(~L)";
        Text[ chinese_traditional ] = "¯Å(~L)";
        Text[ arabic ] = "ÇáãÓÊæì";
        Text[ greek ] = "Åðßðåäï";
        Text[ korean ] = "¼öÁØ(~L)";
        Text[ turkish ] = "D~üzey";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_VARCHAPTERLEVEL
    {
        Border = TRUE ;
        Hide = TRUE ;
        Pos = MAP_APPFONT ( 208 , 75 ) ;
        Size = MAP_APPFONT ( 46 , 76 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        StringList =
        {
            < "Keine" ; > ;
        };
        stringlist [ english ] =
        {
            < "Keine" ; > ;
        };
        stringlist [ english_us ] =
        {
            < "None" ; > ;
        };
        stringlist [ portuguese_brazilian ] =
        {
            < "Keine" ; > ;
        };
        stringlist [ swedish ] =
        {
            < "Inga" ; > ;
        };
        stringlist [ danish ] =
        {
            < "Ingen" ; > ;
        };
        stringlist [ italian ] =
        {
            < "Senza" ; > ;
        };
        stringlist [ spanish ] =
        {
            < "Ninguno" ; > ;
        };
        stringlist [ french ] =
        {
            < "Aucun(e)" ; > ;
        };
        stringlist [ dutch ] =
        {
            < "Geen" ; > ;
        };
        stringlist [ portuguese ] =
        {
            < "Nenhum" ; > ;
        };
    StringList [ chinese_simplified ] =
    {
             < "ÎÞ" ; > ;
    };
    StringList [ russian ] =
    {
             < "Áåç" ; > ;
    };
    StringList [ polish ] =
    {
             < "Brak" ; > ;
    };
    StringList [ japanese ] =
    {
             < "‚È‚µ" ; > ;
    };
    StringList [ language_user1 ] =
    {
             < " " ; > ;
    };
    StringList [ chinese_traditional ] =
    {
             < "µL" ; > ;
    };
    StringList [ arabic ] =
    {
             < "ÈÏæä" ; > ;
    };
    StringList [ greek ] =
    {
             < "ÊáíÝíá" ; > ;
    };
    StringList [ korean ] =
    {
             < "¾øÀ½" ; > ;
    };
    StringList [ turkish ] =
    {
             < "Yok" ; > ;
    };
    };
    FixedText FT_VARSEPARATOR
    {
        Pos = MAP_APPFONT ( 175 , 91 ) ;
        Size = MAP_APPFONT ( 30 , 10 ) ;
        Hide = TRUE ;
        TEXT = "~Trenner" ;
        TEXT [ English ] = "Separator" ;
        Text [ english_us ] = "~Separator" ;
        Text [ portuguese_brazilian ] = "~Trenner" ;
        Text [ swedish ] = "A~vdelare" ;
        Text [ danish ] = "Separator" ;
        Text [ italian ] = "~Separatore" ;
        Text [ spanish ] = "~Separador" ;
        Text [ french ] = "~Séparateur" ;
        Text [ dutch ] = "~Scheidingsteken" ;
        Text [ portuguese ] = "~Separador" ;
        Text[ chinese_simplified ] = "·Ö¸ô·û(~S)";
        Text[ russian ] = "Ðàçäåëèòåëü";
        Text[ polish ] = "Separator";
        Text[ japanese ] = "‹æØ‚è‹L†(~S)";
        Text[ chinese_traditional ] = "³s±µ²Å(~S)";
        Text[ arabic ] = "ÝÇÕá";
        Text[ greek ] = "Äéá÷ùñéóôéêü";
        Text[ korean ] = "±¸ºÐÀÚ(~S)";
        Text[ turkish ] = "A~yýrma iþareti";
        Text[ language_user1 ] = " ";
    };
    Edit ED_VARSEPARATOR
    {
        Pos = MAP_APPFONT ( 208 , 90 ) ;
        Size = MAP_APPFONT ( 46 , 12 ) ;
        Border = TRUE ;
        Hide = TRUE ;
        MaxTextLength = 1 ;
        TEXT = "." ;
    };
    FixedText FT_VARNAME
    {
        Pos = MAP_APPFONT ( 6 , 105 ) ;
        Size = MAP_APPFONT ( 76 , 10 ) ;
        Text = "Na~me" ;
        TEXT [ English ] = "Na~me" ;
        Left = TRUE ;
        Text [ english_us ] = "Na~me" ;
        Text [ portuguese_brazilian ] = "Na~me" ;
        Text [ swedish ] = "Na~mn" ;
        Text [ danish ] = "Navn" ;
        Text [ italian ] = "No~me" ;
        Text [ spanish ] = "~Nombre" ;
        Text [ french ] = "~Nom" ;
        Text [ dutch ] = "Na~am" ;
        Text [ portuguese ] = "No~me" ;
        Text[ chinese_simplified ] = "Ãû³Æ(~M)";
        Text[ russian ] = "Èìÿ";
        Text[ polish ] = "Nazwa";
        Text[ japanese ] = "–¼‘O(~M)";
        Text[ chinese_traditional ] = "¦WºÙ(~M)";
        Text[ arabic ] = "ÇáÇÓã";
        Text[ greek ] = "¼íïìá";
        Text[ korean ] = "À̸§(~M)";
        Text[ turkish ] = "~Ad";
        Text[ language_user1 ] = " ";
    };
    Edit ED_VARNAME
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 6 , 117 ) ;
        Size = MAP_APPFONT ( 76 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
    };
    FixedText FT_VARVALUE
    {
        Pos = MAP_APPFONT ( 88 , 105 ) ;
        Size = MAP_APPFONT ( 76 , 10 ) ;
        Text = "~Wert" ;
        Text [ ENGLISH ] = "Value" ;
        Text [ norwegian ] = "Verdi" ;
        Text [ italian ] = "~Valore" ;
        Text [ portuguese_brazilian ] = "Valor" ;
        Text [ portuguese ] = "~Valor" ;
        Text [ finnish ] = "Arvo" ;
        Text [ danish ] = "Værdi" ;
        Text [ french ] = "~Valeur" ;
        Text [ swedish ] = "~Värde" ;
        Text [ dutch ] = "~Waarde" ;
        Text [ spanish ] = "~Valor" ;
        Text [ english_us ] = "~Value" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "ÊýÖµ(~V)";
        Text[ russian ] = "Çíà÷åíèå";
        Text[ polish ] = "WartoϾ";
        Text[ japanese ] = "’l(~V)";
        Text[ chinese_traditional ] = "¼Æ­È(~V)";
        Text[ arabic ] = "ÞíãÉ";
        Text[ greek ] = "ÔéìÞ";
        Text[ korean ] = "°ª(~V)";
        Text[ turkish ] = "De~ðer";
        Text[ language_user1 ] = " ";
    };
    Edit ED_VARVALUE
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 88 , 117 ) ;
        Size = MAP_APPFONT ( 76 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
    };
    ToolBox TBX_VARNEWDEL
    {
        Pos = MAP_APPFONT ( 167 , 117 ) ;
        SVLook = TRUE ;
        Border = FALSE ;
        ItemList =
        {
            ToolBoxItem
            {
                Identifier = BT_VARAPPLY ;
                HelpID = HID_FLDVAR_APPLY ;
                ItemBitmap = Bitmap { File = "sc20558.bmp" ; };
                Text = "Übernehmen" ;
                Text [ English ] = "Apply" ;
                Text [ norwegian ] = "Benytt" ;
                Text [ italian ] = "Applica" ;
                Text [ portuguese_brazilian ] = "Aplicar" ;
                Text [ portuguese ] = "Aplicar" ;
                Text [ finnish ] = "Käytä" ;
                Text [ danish ] = "Anvend" ;
                Text [ french ] = "Appliquer" ;
                Text [ swedish ] = "Överta" ;
                Text [ dutch ] = "Overnemen" ;
                Text [ spanish ] = "Aplicar" ;
                Text [ english_us ] = "Apply" ;
                Text[ chinese_simplified ] = "Ó¦ÓÃ";
                Text[ russian ] = "Âûïîëíèòü";
                Text[ polish ] = "Zastosuj";
                Text[ japanese ] = "“K—p";
                Text[ chinese_traditional ] = "¨Ï¥Î";
                Text[ arabic ] = "ÊØÈíÞ";
                Text[ greek ] = "ÅöáñìïãÞ";
                Text[ korean ] = "Àû¿ë";
                Text[ turkish ] = "Kullan";
                Text[ language_user1 ] = " ";
            };
            ToolBoxItem
            {
                Identifier = BT_VARDELETE ;
                HelpID = HID_FLDVAR_DELETE ;
                ItemBitmap = Bitmap { File = "sc20557.bmp" ; };
                Text = "Löschen" ;
                Text [ ENGLISH ] = "Delete" ;
                Text [ norwegian ] = "Slett" ;
                Text [ italian ] = "Elimina" ;
                Text [ portuguese_brazilian ] = "Apagar" ;
                Text [ portuguese ] = "Eliminar" ;
                Text [ finnish ] = "Poista" ;
                Text [ danish ] = "Slet" ;
                Text [ french ] = "Supprimer" ;
                Text [ swedish ] = "Radera" ;
                Text [ dutch ] = "Wissen" ;
                Text [ spanish ] = "Eliminar" ;
                Text [ english_us ] = "Delete" ;
                Text[ chinese_simplified ] = "ɾ³ý";
                Text[ russian ] = "Óäàëèòü";
                Text[ polish ] = "Usuñ";
                Text[ japanese ] = "íœ";
                Text[ chinese_traditional ] = "§R°£";
                Text[ arabic ] = "ÍÐÝ";
                Text[ greek ] = "ÄéáãñáöÞ";
                Text[ korean ] = "»èÁ¦";
                Text[ turkish ] = "Sil";
                Text[ language_user1 ] = " ";
            };
        };
    };
    Text [ english_us ] = "Variables" ;
    Text [ portuguese_brazilian ] = "Variablen" ;
    Text [ swedish ] = "Variabler" ;
    Text [ danish ] = "Variabler" ;
    Text [ italian ] = "Variabili" ;
    Text [ spanish ] = "Variables" ;
    Text [ french ] = "Variables" ;
    Text [ dutch ] = "Variabelen" ;
    Text [ portuguese ] = "Variáveis" ;
    Text[ chinese_simplified ] = "±äÁ¿";
    Text[ russian ] = "Ïåðåìåííûå";
    Text[ polish ] = "Zmienne";
    Text[ japanese ] = "•ϐ”";
    Text[ chinese_traditional ] = "Åܶq";
    Text[ arabic ] = "ãÊÛíÑÇÊ";
    Text[ greek ] = "ÌåôáâëçôÝò";
    Text[ korean ] = "º¯¼ö";
    Text[ turkish ] = "Deðiþkenler";
    Text[ language_user1 ] = " ";
};
diff --git a/sw/source/ui/fldui/inpdlg.cxx b/sw/source/ui/fldui/inpdlg.cxx
new file mode 100644
index 0000000..2276771
--- /dev/null
+++ b/sw/source/ui/fldui/inpdlg.cxx
@@ -0,0 +1,320 @@
/*************************************************************************
 *
 *  $RCSfile: inpdlg.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:37 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#define _INPDLG_CXX

#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif

#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _FLDBAS_HXX
#include <fldbas.hxx>
#endif
#ifndef _EXPFLD_HXX
#include <expfld.hxx>
#endif
#ifndef _USRFLD_HXX
#include <usrfld.hxx>
#endif
#ifndef _INPDLG_HXX
#include <inpdlg.hxx>
#endif
#ifndef _FLDMGR_HXX
#include <fldmgr.hxx>
#endif

#ifndef _FLDUI_HRC
#include <fldui.hrc>
#endif
#ifndef _INPDLG_HRC
#include <inpdlg.hrc>
#endif


/*--------------------------------------------------------------------
    Beschreibung: Feldeinfuegen bearbeiten
 --------------------------------------------------------------------*/

SwFldInputDlg::SwFldInputDlg( Window *pParent, SwWrtShell &rS,
                              SwField* pField, BOOL bNextButton ) :

    SvxStandardDialog(pParent,  SW_RES(DLG_FLD_INPUT)),

    rSh( rS ),
    aLabelED    (this, SW_RES(ED_LABEL  )),
    aEditED     (this, SW_RES(ED_EDIT   )),
    aEditGB     (this, SW_RES(GB_EDIT       )),
    aOKBT       (this, SW_RES(BT_OK     )),
    aCancelBT   (this, SW_RES(BT_CANCEL )),
    aNextBT     (this, SW_RES(PB_NEXT   )),
    aHelpBT     (this, SW_RES(PB_HELP    )),
    pInpFld(0),
    pSetFld(0),
    pUsrType(0)
{
    // Font fuers Edit umschalten
    Font aFont(aEditED.GetFont());
    aFont.SetWeight(WEIGHT_LIGHT);
    aEditED.SetFont(aFont);

    if( bNextButton )
    {
        aNextBT.Show();
        aNextBT.SetClickHdl(LINK(this, SwFldInputDlg, NextHdl));
    }
    else
    {
        long nDiff = aCancelBT.GetPosPixel().Y() - aOKBT.GetPosPixel().Y();
        Point aPos = aHelpBT.GetPosPixel();
        aPos.Y() -= nDiff;
        aHelpBT.SetPosPixel(aPos);
    }

    // Auswertung hier
    String aStr;
    if( RES_INPUTFLD == pField->GetTyp()->Which() )
    {   // Es ist eine Eingabefeld
        //
        pInpFld = (SwInputField*)pField;
        aLabelED.SetText( pInpFld->GetPar2() );
        USHORT nSubType = pInpFld->GetSubType();

        switch(nSubType & 0xff)
        {
            case INP_TXT:
                aStr = pInpFld->GetPar1();
                break;

            case INP_USR:
                // Benutzerfeld
                if( 0 != ( pUsrType = (SwUserFieldType*)rSh.GetFldType(
                            RES_USERFLD, pInpFld->GetPar1() ) ) )
                    aStr = pUsrType->GetContent();
                break;
        }
    }
    else
    {
        // es ist eine SetExpression
        pSetFld = (SwSetExpField*)pField;
        String sFormula(pSetFld->GetFormula());
        //values are formatted - formulas are not
        International aInt(pSetFld->GetLanguage());
        if(aInt.IsNumeric(sFormula))
            aStr = pSetFld->Expand();
        else
            aStr = sFormula;
        aLabelED.SetText( pSetFld->GetPromptText() );
    }

    // JP 31.3.00: Inputfields in readonly regions must be allowed to
    //              input any content. - 74639
    BOOL bEnable = !rSh.IsCrsrReadonly();
                    /*!rSh.IsReadOnlyAvailable() || !rSh.HasReadonlySel()*/;
    aOKBT.Enable( bEnable );
    aEditED.SetReadOnly( !bEnable );

    if( aStr.Len() )
        aEditED.SetText( aStr.ConvertLineEnd() );
    aEditED.GrabFocus();
    FreeResource();
}

SwFldInputDlg::~SwFldInputDlg()
{
}

/*--------------------------------------------------------------------
     Beschreibung:  Schliessen
 --------------------------------------------------------------------*/

void SwFldInputDlg::Apply()
{
    String aTmp( aEditED.GetText() );
    aTmp.EraseAllChars( '\r' );

    rSh.StartAllAction();
    BOOL bModified = FALSE;
    if(pInpFld)
    {
        if(pUsrType)
        {
            if( aTmp != pUsrType->GetContent() )
            {
                pUsrType->SetContent(aTmp);
                pUsrType->UpdateFlds();
                bModified = TRUE;
            }
        }
        else if( aTmp != pInpFld->GetPar1() )
        {
            pInpFld->SetPar1(aTmp);
            rSh.SwEditShell::UpdateFlds(*pInpFld);
            bModified = TRUE;
        }
    }
    else if( aTmp != pSetFld->GetPar2() )
    {
        pSetFld->SetPar2(aTmp);
        rSh.SwEditShell::UpdateFlds(*pSetFld);
        bModified = TRUE;
    }

    if( bModified )
        rSh.SetUndoNoResetModified();

    rSh.EndAllAction();
}


IMPL_LINK(SwFldInputDlg, NextHdl, PushButton*, EMPTYARG)
{
    EndDialog(RET_OK);
    return 0;
}

/*************************************************************************

      $Log: not supported by cvs2svn $
      Revision 1.48  2000/09/18 16:05:30  willem.vandorp
      OpenOffice header added.

      Revision 1.47  2000/08/21 09:11:38  os
      Set expression input fields: show formula or Expand() depending on the formula content

      Revision 1.46  2000/03/31 08:00:44  jp
      Bug #74639#: allow changes on InputFields in readonly regions

      Revision 1.45  2000/02/11 14:46:53  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.44  1999/01/20 15:56:58  JP
      Task #58677#: Crsr in Readonly Bereichen zulassen


      Rev 1.43   20 Jan 1999 16:56:58   JP
   Task #58677#: Crsr in Readonly Bereichen zulassen

      Rev 1.42   17 Dec 1997 17:58:46   OM
   Datumsformate fuer SetExpFields

      Rev 1.41   03 Nov 1997 13:18:10   MA
   precomp entfernt

      Rev 1.40   02 Oct 1997 15:21:44   OM
   Feldumstellung

      Rev 1.39   23 Jul 1997 20:25:54   HJS
   includes

      Rev 1.38   11 Nov 1996 09:56:08   MA
   ResMgr

      Rev 1.37   24 Oct 1996 13:36:22   JP
   String Umstellung: [] -> GetChar()

      Rev 1.36   30 Aug 1996 12:43:16   OS
   InputFldDlg mit Next-Button

      Rev 1.35   28 Aug 1996 12:10:58   OS
   includes

      Rev 1.34   01 Aug 1996 10:59:16   AMA
   New: Eingabe-Felder mit Zeilenumbruechen

      Rev 1.33   04 Jun 1996 18:41:52   JP
   bei GetFldType wurden die Parameter getauscht

      Rev 1.32   02 Apr 1996 14:32:34   OS
   *_cxx - define hinter hdrstop

      Rev 1.31   24 Nov 1995 16:57:42   OM
   PCH->PRECOMPILED

      Rev 1.30   08 Nov 1995 13:45:34   OM
   Change->Set

      Rev 1.29   30 Aug 1995 13:53:30   MA
   fix: sexport'iert

      Rev 1.28   21 Aug 1995 09:24:36   MA
   chg: swstddlg -> svxstandarddialog, Optimierungen

      Rev 1.27   18 Jan 1995 18:54:20   ER
   fld.hxx -> *fld*.hxx

      Rev 1.26   25 Oct 1994 17:57:02   ER
   add: PCH

      Rev 1.25   17 Oct 1994 16:24:58   PK
   ausgeboxtes wieder reingeboxt

*************************************************************************/

diff --git a/sw/source/ui/fldui/inpdlg.hrc b/sw/source/ui/fldui/inpdlg.hrc
new file mode 100644
index 0000000..a5741d1
--- /dev/null
+++ b/sw/source/ui/fldui/inpdlg.hrc
@@ -0,0 +1,68 @@
/*************************************************************************
 *
 *  $RCSfile: inpdlg.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:37 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#define FT_LABEL            1
#define ED_EDIT                 3
#define GB_EDIT                 4
#define BT_OK                   5
#define BT_CANCEL           6
#define ED_LABEL            7
#define PB_NEXT             8
#define PB_HELP             9
diff --git a/sw/source/ui/fldui/inpdlg.src b/sw/source/ui/fldui/inpdlg.src
new file mode 100644
index 0000000..b2bb8f6
--- /dev/null
+++ b/sw/source/ui/fldui/inpdlg.src
@@ -0,0 +1,228 @@
/*************************************************************************
 *
 *  $RCSfile: inpdlg.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:37 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "fldui.hrc"
#include "inpdlg.hrc"
#include "helpid.h"
ModalDialog DLG_FLD_INPUT
{
    HelpID = HID_FLD_INPUT ;
    OutputSize = TRUE ;
    Hide = TRUE ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 194 , 119 ) ;
    Text = "Eingabefeld" ;
    Text [ english ] = "Input Field" ;
    Text [ english_us ] = "Input Field" ;
    Moveable = TRUE ;
    /*    FixedText FT_LABEL
    {
        Pos = MAP_APPFONT ( 12 , 14 ) ;
        Size = MAP_APPFONT ( 115 , 8 ) ;
        Text = "Eingabe" ;
        Text [ English ] = "Input" ;
        Text [ norwegian ] = "Input" ;
        Text [ italian ] = "Inserisci" ;
        Text [ portuguese_brazilian ] = "Inserção" ;
        Text [ portuguese ] = "Inserção" ;
        Text [ finnish ] = "Syöttö" ;
        Text [ danish ] = "Input" ;
        Text [ french ] = "Entrée" ;
        Text [ swedish ] = "Inmatning" ;
        Text [ dutch ] = "Invoer" ;
        Text [ spanish ] = "Entrada" ;
        Text [ english_us ] = "Input" ;
        Left = TRUE ;
    };*/
    Edit ED_LABEL
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 12 , 14 ) ;
        Size = MAP_APPFONT ( 115 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Text = "Eingabe" ;
        Text [ English ] = "Input" ;
        Text [ norwegian ] = "Input" ;
        Text [ italian ] = "Introduci" ;
        Text [ portuguese_brazilian ] = "Inserção" ;
        Text [ portuguese ] = "Entrada" ;
        Text [ finnish ] = "Syöttö" ;
        Text [ danish ] = "Input" ;
        Text [ french ] = "Saisie" ;
        Text [ swedish ] = "Inmatning" ;
        Text [ dutch ] = "Invoer" ;
        Text [ spanish ] = "Entrada" ;
        Text [ english_us ] = "Input" ;
        Readonly = TRUE ;
        Text[ chinese_simplified ] = "ÊäÈë";
        Text[ russian ] = "Ââîä";
        Text[ polish ] = "Wejœcie";
        Text[ japanese ] = "“ü—Í";
        Text[ chinese_traditional ] = "¿é¤J";
        Text[ arabic ] = "ÅÏÎÇá";
        Text[ greek ] = "ÅéóáãùãÞ";
        Text[ korean ] = "ÀÔ·Â";
        Text[ turkish ] = "Giriþ";
        Text[ language_user1 ] = " ";
    };
    MultiLineEdit ED_EDIT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 12 , 32 ) ;
        Size = MAP_APPFONT ( 115 , 72 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
    };
    GroupBox GB_EDIT
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 127 , 108 ) ;
        Text = "Bearbeiten" ;
        Text [ English ] = "Edit" ;
        Text [ norwegian ] = "Rediger" ;
        Text [ italian ] = "Modifica" ;
        Text [ portuguese_brazilian ] = "Editar" ;
        Text [ portuguese ] = "Editar" ;
        Text [ finnish ] = "Muokkaa" ;
        Text [ danish ] = "Rediger" ;
        Text [ french ] = "Modifier" ;
        Text [ swedish ] = "Redigera" ;
        Text [ dutch ] = "Be~werken" ;
        Text [ spanish ] = "Editar" ;
        Text [ english_us ] = "Edit" ;
        Text[ chinese_simplified ] = "±à¼­";
        Text[ russian ] = "Ïðàâêà";
        Text[ polish ] = "Edycja";
        Text[ japanese ] = "•ҏW";
        Text[ chinese_traditional ] = "½s¿è";
        Text[ arabic ] = "ÊÍÑíÑ";
        Text[ greek ] = "Åðåîåñãáóßá";
        Text[ korean ] = "ÆíÁý";
        Text[ turkish ] = "Düzenle";
        Text[ language_user1 ] = " ";
    };
    OKButton BT_OK
    {
        Pos = MAP_APPFONT ( 139 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 15 ) ;
        TabStop = TRUE ;
        DefButton = TRUE ;
    };
    CancelButton BT_CANCEL
    {
        Pos = MAP_APPFONT ( 139 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 15 ) ;
        TabStop = TRUE ;
    };
    PushButton PB_NEXT
    {
        Pos = MAP_APPFONT ( 139 , 40 ) ;
        Size = MAP_APPFONT ( 50 , 15 ) ;
        TabStop = TRUE ;
        Hide = TRUE ;
        Text = "~Weiter" ;
        Text [ English ] = "~Next" ;
        Text [ dutch ] = "~Volgende" ;
        Text [ english_us ] = "~Next" ;
        Text [ italian ] = "~Avanti" ;
        Text [ spanish ] = "~Siguiente" ;
        Text [ french ] = "~Suivant" ;
        Text [ swedish ] = "~Nästa" ;
        Text [ danish ] = "Næste" ;
        Text [ portuguese ] = "~Seguinte" ;
        Text [ portuguese_brazilian ] = "~Weiter" ;
        Text[ chinese_simplified ] = "¼ÌÐø(~N)";
        Text[ russian ] = "Äàëåå";
        Text[ polish ] = "~Dalej";
        Text[ japanese ] = "ŽŸ‚Ö(~N)";
        Text[ chinese_traditional ] = "Ä~Äò(~N)";
        Text[ arabic ] = "ÇáÊÇáí";
        Text[ greek ] = "Åðüìåíï";
        Text[ korean ] = "´ÙÀ½(~N)";
        Text[ turkish ] = "Ý~leri";
        Text[ language_user1 ] = " ";
    };
    HelpButton PB_HELP
    {
        Pos = MAP_APPFONT ( 139 , 60 ) ;
        Size = MAP_APPFONT ( 50 , 15 ) ;
        TabStop = TRUE ;
    };
    Text [ portuguese_brazilian ] = "Eingabefeld" ;
    Text [ swedish ] = "Inmatningsfält" ;
    Text [ danish ] = "Inputfelt" ;
    Text [ italian ] = "Campo di digitazione" ;
    Text [ spanish ] = "Campo de entrada" ;
    Text [ french ] = "Champ de saisie" ;
    Text [ dutch ] = "Invoerveld" ;
    Text [ portuguese ] = "Campo de entrada" ;
    Text[ chinese_simplified ] = "ÊäÈëÀ¸";
    Text[ russian ] = "Ïîëå ââîäà";
    Text[ polish ] = "Pole wprowadzania";
    Text[ japanese ] = "“ü—Į́°ÙÄÞ";
    Text[ chinese_traditional ] = "¿é¤JÄæ¦ì";
    Text[ arabic ] = "ÍÞá ÅÏÎÇá";
    Text[ greek ] = "Ðåäßï åéóáãùãÞò";
    Text[ korean ] = "Çʵå ÀÔ·Â";
    Text[ turkish ] = "Giriþ alaný";
    Text[ language_user1 ] = " ";
};
diff --git a/sw/source/ui/fldui/javaedit.cxx b/sw/source/ui/fldui/javaedit.cxx
new file mode 100644
index 0000000..e87b93c
--- /dev/null
+++ b/sw/source/ui/fldui/javaedit.cxx
@@ -0,0 +1,417 @@
/*************************************************************************
 *
 *  $RCSfile: javaedit.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:37 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

// include ---------------------------------------------------------------

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#define _JAVAEDIT_CXX

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef SVTOOLS_URIHELPER_HXX
#include <svtools/urihelper.hxx>
#endif

#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _FLDBAS_HXX
#include <fldbas.hxx>
#endif
#ifndef _FLDMGR_HXX
#include <fldmgr.hxx>
#endif
#ifndef _DOCUFLD_HXX
#include <docufld.hxx>
#endif
#ifndef _UITOOL_HXX
#include <uitool.hxx>
#endif
#ifndef _JAVAEDIT_HXX
#include <javaedit.hxx>
#endif

#ifndef _FLDUI_HRC
#include <fldui.hrc>
#endif
#ifndef _JAVAEDIT_HRC
#include <javaedit.hrc>
#endif

// static ----------------------------------------------------------------

// class SwJavaEditDialog ------------------------------------------------



SwJavaEditDialog::SwJavaEditDialog(Window* pParent, SwWrtShell* pWrtSh) :

    SvxStandardDialog(pParent, SW_RES(DLG_JAVAEDIT)),

    aTypeFT         ( this, SW_RES( FT_TYPE ) ),
    aTypeED         ( this, SW_RES( ED_TYPE ) ),
    aUrlRB          ( this, SW_RES( RB_URL ) ),
    aUrlED          ( this, SW_RES( ED_URL ) ),
    aUrlPB          ( this, SW_RES( PB_URL ) ),
    aEditRB         ( this, SW_RES( RB_EDIT ) ),
    aEditED         ( this, SW_RES( ED_EDIT ) ),
    aPostItGB       ( this, SW_RES( GB_POSTIT ) ),
    aOKBtn          ( this, SW_RES( BTN_POST_OK ) ),
    aCancelBtn      ( this, SW_RES( BTN_POST_CANCEL ) ),
    aPrevBtn        ( this, SW_RES( BTN_PREV ) ),
    aNextBtn        ( this, SW_RES( BTN_NEXT ) ),
    aHelpBtn        ( this, SW_RES( BTN_POST_HELP ) ),

    pSh(pWrtSh),
    bNew(TRUE)
{
    // Handler installieren
    aPrevBtn.SetClickHdl( LINK( this, SwJavaEditDialog, PrevHdl ) );
    aNextBtn.SetClickHdl( LINK( this, SwJavaEditDialog, NextHdl ) );
    aOKBtn.SetClickHdl( LINK( this, SwJavaEditDialog, OKHdl ) );

    Link aLk = LINK(this, SwJavaEditDialog, RadioButtonHdl);
    aUrlRB.SetClickHdl(aLk);
    aEditRB.SetClickHdl(aLk);
    aUrlPB.SetClickHdl(LINK(this, SwJavaEditDialog, InsertFileHdl));

    Font aFont( aEditED.GetFont() );
    aFont.SetWeight( WEIGHT_LIGHT );
    aEditED.SetFont( aFont );

    pMgr = new SwFldMgr;
    pFld = (SwScriptField*)pMgr->GetCurFld();

    bNew = !(pFld && pFld->GetTyp()->Which() == RES_SCRIPTFLD);

    CheckTravel();

    if( !bNew )
        SetText( SW_RES( STR_JAVA_EDIT ) );
    else
        // neu anlegen
        SetText( SW_RES( STR_JAVA_INSERT ) );

    FreeResource();

    RadioButtonHdl(NULL);
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/



SwJavaEditDialog::~SwJavaEditDialog()
{
    delete pMgr;
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/



IMPL_LINK_INLINE_START( SwJavaEditDialog, PrevHdl, Button *, EMPTYARG )
{
    SetFld();
    pMgr->GoPrev();
    pFld = (SwScriptField*)pMgr->GetCurFld();
    CheckTravel();
    RadioButtonHdl(NULL);

    return 0;
}
IMPL_LINK_INLINE_END( SwJavaEditDialog, PrevHdl, Button *, EMPTYARG )

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/



IMPL_LINK_INLINE_START( SwJavaEditDialog, NextHdl, Button *, EMPTYARG )
{
    SetFld();
    pMgr->GoNext();
    pFld = (SwScriptField*)pMgr->GetCurFld();
    CheckTravel();
    RadioButtonHdl(NULL);

    return 0;
}
IMPL_LINK_INLINE_END( SwJavaEditDialog, NextHdl, Button *, EMPTYARG )

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/



IMPL_LINK( SwJavaEditDialog, OKHdl, Button *, EMPTYARG )
{
    SetFld();
    EndDialog( RET_OK );
    return 0;
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/



void SwJavaEditDialog::Apply()
{
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/



void SwJavaEditDialog::CheckTravel()
{
    BOOL bTravel = FALSE;
    BOOL bNext, bPrev;

    if(!bNew)
    {
        // Traveling nur bei mehr als einem Feld
        pSh->StartAction();
        pSh->CreateCrsr();

        bNext = pMgr->GoNext();
        if( bNext )
            pMgr->GoPrev();

        if( 0 != ( bPrev = pMgr->GoPrev() ) )
            pMgr->GoNext();
        bTravel |= bNext|bPrev;

        pSh->DestroyCrsr();
        pSh->EndAction();

        if (pFld->IsCodeURL())
        {
            aUrlED.SetText(pFld->GetPar2());
            aEditED.SetText(aEmptyStr);
            aUrlRB.Check();
        }
        else
        {
            aEditED.SetText(pFld->GetPar2());
            aUrlED.SetText(aEmptyStr);
            aEditRB.Check();
        }
        aTypeED.SetText(pFld->GetPar1());
    }

    if ( !bTravel )
    {
        aPrevBtn.Hide();
        aNextBtn.Hide();
    }
    else
    {
        aPrevBtn.Enable(bPrev);
        aNextBtn.Enable(bNext);
    }
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/



void SwJavaEditDialog::SetFld()
{
    if( !aOKBtn.IsEnabled() )
        return ;

    String sText;
    String sType( aTypeED.GetText() );
    BOOL bIsUrl = aUrlRB.IsChecked();

    if( bIsUrl )
    {
        sText = aUrlED.GetText();
        if(sText.Len())
            sText = URIHelper::SmartRelToAbs(sText);
    }
    else
        sText = aEditED.GetText();

    if( !sType.Len() )
        sType = String::CreateFromAscii("JavaScript");

    if( bNew )
        pMgr->InsertFld(TYP_SCRIPTFLD, 0, sType, sText, bIsUrl);
    else if( bIsUrl != pFld->GetFormat() ||
             pFld->GetPar2() != sType || pFld->GetPar1() != sText )
    {
        pMgr->UpdateCurFld( bIsUrl, sType, sText );
        pSh->SetUndoNoResetModified();
    }
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

IMPL_LINK( SwJavaEditDialog, RadioButtonHdl, RadioButton *, pBtn )
{
    BOOL bEnable = aUrlRB.IsChecked();
    aUrlPB.Enable(bEnable);
    aUrlED.Enable(bEnable);
    aEditED.Enable(!bEnable);

    if( !bNew )
    {
        bEnable = !pSh->IsReadOnlyAvailable() || !pSh->HasReadonlySel();
        aOKBtn.Enable( bEnable );
        aUrlED.SetReadOnly( !bEnable );
        aEditED.SetReadOnly( !bEnable);
        aTypeED.SetReadOnly( !bEnable);
        if( aUrlPB.IsEnabled() && !bEnable )
            aUrlPB.Enable( FALSE );
    }
    return 0;
}

/***************************************************************************
    Beschreibung:
***************************************************************************/

IMPL_LINK( SwJavaEditDialog, InsertFileHdl, PushButton *, pBtn )
{
    String sFileName;
    if( GetFileFilterNameDlg( *pBtn, sFileName ))
        aUrlED.SetText( sFileName );
    return 0;
}

/*************************************************************************

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.13  2000/09/18 16:05:31  willem.vandorp
      OpenOffice header added.

      Revision 1.12  2000/06/26 13:20:15  os
      INetURLObject::SmartRelToAbs removed

      Revision 1.11  2000/04/18 15:17:32  os
      UNICODE

      Revision 1.10  2000/02/11 14:46:57  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.9  1999/01/20 15:56:58  JP
      Task #58677#: Crsr in Readonly Bereichen zulassen


      Rev 1.8   20 Jan 1999 16:56:58   JP
   Task #58677#: Crsr in Readonly Bereichen zulassen

      Rev 1.7   19 Aug 1998 17:22:14   JP
   Bug #55247#: fuers MoveNext-/-PrevFldType einen eigenen Pam verwenden

      Rev 1.6   13 Feb 1998 14:16:02   JP
   statt selbst den InserDocDialog zu rufen, die neue Funktion GetFileFilterNameDlg rufen

      Rev 1.5   24 Nov 1997 18:23:28   MA
   includes

      Rev 1.4   03 Nov 1997 13:18:10   MA
   precomp entfernt

      Rev 1.3   23 Jul 1997 20:25:54   HJS
   includes

      Rev 1.2   29 May 1997 16:16:02   OM
   URL in ScriptDialog eingeben

      Rev 1.1   13 Feb 1997 17:36:02   OM
   Segmentierung

      Rev 1.0   13 Feb 1997 17:35:22   OM
   Initial revision.

*************************************************************************/



diff --git a/sw/source/ui/fldui/javaedit.hrc b/sw/source/ui/fldui/javaedit.hrc
new file mode 100644
index 0000000..a58ce4b
--- /dev/null
+++ b/sw/source/ui/fldui/javaedit.hrc
@@ -0,0 +1,85 @@
/*************************************************************************
 *
 *  $RCSfile: javaedit.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:37 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SW_JAVAEDIT_HRC
#define _SW_JAVAEDIT_HRC

// defines ------------------------------------------------------------------

#define FT_TYPE             10
#define ED_TYPE             11
#define RB_EDIT             12
#define ED_EDIT             13
#define GB_POSTIT           14
#define BTN_PREV            15
#define BTN_NEXT            16
#define STR_JAVA_EDIT       17
#define STR_JAVA_INSERT     18
#define RB_URL              19
#define ED_URL              20
#define PB_URL              21

#define BTN_POST_OK         30
#define BTN_POST_CANCEL     31
#define BTN_POST_HELP       32


#endif

diff --git a/sw/source/ui/fldui/javaedit.src b/sw/source/ui/fldui/javaedit.src
new file mode 100644
index 0000000..f96e849
--- /dev/null
+++ b/sw/source/ui/fldui/javaedit.src
@@ -0,0 +1,319 @@
/*************************************************************************
 *
 *  $RCSfile: javaedit.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:37 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
 // include ---------------------------------------------------------------
#include "javaedit.hrc"
#include "fldui.hrc"
#include "helpid.h"
 // pragma ----------------------------------------------------------------

 // RID_SVXDLG_POSTIT -----------------------------------------------------
ModalDialog DLG_JAVAEDIT
{
    OutputSize = TRUE ;
    SvLook = TRUE ;
    Size = MAP_APPFONT ( 248 , 157 ) ;
    Text = "Script bearbeiten" ;
    Text [ ENGLISH ] = "Edit script" ;
    Moveable = TRUE ;
    FixedText FT_TYPE
    {
        Pos = MAP_APPFONT ( 12 , 15 ) ;
        Size = MAP_APPFONT ( 40 , 10 ) ;
        Text = "Script-T~yp" ;
        Text [ ENGLISH ] = "Script type" ;
        Text [ english_us ] = "Script type" ;
        Text [ portuguese_brazilian ] = "Script-Typ" ;
        Text [ swedish ] = "Skriptt~yp" ;
        Text [ danish ] = "Script-type" ;
        Text [ italian ] = "Tipo di script" ;
        Text [ spanish ] = "Tipo de script" ;
        Text [ french ] = "T~ype de script" ;
        Text [ dutch ] = "Scriptt~ype" ;
        Text [ portuguese ] = "~Tipo de Script" ;
        Text[ chinese_simplified ] = "½Å±¾ÀàÐÍ";
        Text[ russian ] = "Òèï ñêðèïòà";
        Text[ polish ] = "Typ Scriptu";
        Text[ japanese ] = "½¸ØÌßĂ̎í—Þ";
        Text[ chinese_traditional ] = "©R¥O½ZÃþ«¬";
        Text[ arabic ] = "äæÚ ÇáÓßÑíÈÊ";
        Text[ greek ] = "Ôýðïò ôïõ Script";
        Text[ korean ] = "½ºÅ©¸³Æ® ÇüÅÂ";
        Text[ turkish ] = "Script tipi";
        Text[ language_user1 ] = " ";
    };
    Edit ED_TYPE
    {
        Border = TRUE ;
        Text = "JavaScript" ;
         // Nicht uebersetzen!!!
        Pos = MAP_APPFONT ( 57 , 14 ) ;
        Size = MAP_APPFONT ( 100 , 12 ) ;
        TabStop = TRUE ;
    };
    RadioButton RB_URL
    {
        Text = "~URL" ;
        Text [ ENGLISH ] = "URL" ;
        Pos = MAP_APPFONT ( 12 , 28 ) ;
        Size = MAP_APPFONT ( 40 , 10 ) ;
        TabStop = TRUE ;
        Text [ portuguese ] = "~URL" ;
        Text [ english_us ] = "URL" ;
        Text [ portuguese_brazilian ] = "URL" ;
        Text [ swedish ] = "~URL" ;
        Text [ danish ] = "URL" ;
        Text [ italian ] = "URL" ;
        Text [ spanish ] = "URL" ;
        Text [ french ] = "~URL" ;
        Text [ dutch ] = "~URL" ;
        Text[ chinese_simplified ] = "URL";
        Text[ russian ] = "URL";
        Text[ polish ] = "URL";
        Text[ japanese ] = "URL";
        Text[ chinese_traditional ] = "URL";
        Text[ arabic ] = "URL";
        Text[ greek ] = "~URL";
        Text[ korean ] = "URL";
        Text[ turkish ] = "URL";
        Text[ language_user1 ] = " ";
    };
    Edit ED_URL
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 57 , 27 ) ;
        Size = MAP_APPFONT ( 100 , 12 ) ;
        TabStop = TRUE ;
    };
    PushButton PB_URL
    {
        Pos = MAP_APPFONT ( 163 , 26 ) ;
        Size = MAP_APPFONT ( 14 , 14 ) ;
        Text = "~..." ;
        TabStop = TRUE ;
    };
    RadioButton RB_EDIT
    {
        Pos = MAP_APPFONT ( 12 , 40 ) ;
        Size = MAP_APPFONT ( 40 , 10 ) ;
        Text = "~Text" ;
        Text [ English ] = "~Text" ;
        Text [ norwegian ] = "~Text" ;
        Text [ italian ] = "~Testo" ;
        Text [ portuguese_brazilian ] = "~Texto" ;
        Text [ portuguese ] = "~Texto" ;
        Text [ finnish ] = "~Teksti" ;
        Text [ danish ] = "Tekst" ;
        Text [ french ] = "~Texte" ;
        Text [ swedish ] = "~Text" ;
        Text [ dutch ] = "~Tekst" ;
        Text [ spanish ] = "~Texto" ;
        Text [ english_us ] = "~Text" ;
        TabStop = TRUE ;
        Check = TRUE ;
        Text[ chinese_simplified ] = "ÎÄ×Ö(~T)";
        Text[ russian ] = "Òåêñò";
        Text[ polish ] = "Tekst";
        Text[ japanese ] = "÷½Ä(~T)";
        Text[ chinese_traditional ] = "¤å¦r(~T)";
        Text[ arabic ] = "äÕ";
        Text[ greek ] = "Êåßìåíï";
        Text[ korean ] = "ÅØ½ºÆ®(~T)";
        Text[ turkish ] = "~Metin";
        Text[ language_user1 ] = " ";
    };
    MultiLineEdit ED_EDIT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 23 , 54 ) ;
        Size = MAP_APPFONT ( 155 , 91 ) ;
        Left = TRUE ;
        VScroll = TRUE ;
        HScroll = TRUE ;
        IgnoreTab = TRUE ;
        TabStop = TRUE ;
    };
    GroupBox GB_POSTIT
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 179 , 147 ) ;
        Text = "Inhalt" ;
        Text [ ENGLISH ] = "Contents" ;
        Text [ norwegian ] = "Innhold  " ;
        Text [ italian ] = "Contenuto" ;
        Text [ portuguese_brazilian ] = "Conteúdo" ;
        Text [ portuguese ] = "Conteúdo" ;
        Text [ finnish ] = "Sisältö" ;
        Text [ danish ] = "Indhold" ;
        Text [ french ] = "Contenu" ;
        Text [ swedish ] = "Innehåll" ;
        Text [ dutch ] = "Inhoud" ;
        Text [ spanish ] = "Contenido" ;
        Text [ english_us ] = "Contents" ;
        Text[ chinese_simplified ] = "ÄÚÈÝ";
        Text[ russian ] = "Ñîäåðæèìîå";
        Text[ polish ] = "ZawartoϾ";
        Text[ japanese ] = "“à—e";
        Text[ chinese_traditional ] = "¤º®e";
        Text[ arabic ] = "ÇáãÍÊæíÇÊ";
        Text[ greek ] = "Ðåñéå÷üìåíá";
        Text[ korean ] = "³»¿ë";
        Text[ turkish ] = "Ýçerik";
        Text[ language_user1 ] = " ";
    };
    OKButton BTN_POST_OK
    {
        Pos = MAP_APPFONT ( 191 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 15 ) ;
        DefButton = TRUE ;
    };
    CancelButton BTN_POST_CANCEL
    {
        Pos = MAP_APPFONT ( 191 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 15 ) ;
    };
    HelpButton BTN_POST_HELP
    {
        Pos = MAP_APPFONT ( 191 , 40 ) ;
        Size = MAP_APPFONT ( 50 , 15 ) ;
    };
    ImageButton BTN_PREV
    {
        Pos = MAP_APPFONT ( 191 , 60 ) ;
        Size = MAP_APPFONT ( 24 , 14 ) ;
        Symbol = IMAGEBUTTON_ARROW_LEFT ;
    };
    ImageButton BTN_NEXT
    {
        Pos = MAP_APPFONT ( 217 , 60 ) ;
        Size = MAP_APPFONT ( 24 , 14 ) ;
        Symbol = IMAGEBUTTON_ARROW_RIGHT ;
    };
     // lokale Strings
    String STR_JAVA_EDIT
    {
        Text = "Script bearbeiten" ;
        Text [ English ] = "Edit script" ;
        Text [ portuguese ] = "Editar Script" ;
        Text [ english_us ] = "Edit script" ;
        Text [ portuguese_brazilian ] = "Script bearbeiten" ;
        Text [ swedish ] = "Redigera skript" ;
        Text [ danish ] = "Rediger script" ;
        Text [ italian ] = "Modifica script" ;
        Text [ spanish ] = "Editar script" ;
        Text [ french ] = "Éditer le script" ;
        Text [ dutch ] = "Script bewerken" ;
        Text[ chinese_simplified ] = "±à¼­½Å±¾";
        Text[ russian ] = "Ïðàâêà ñêðèïòà";
        Text[ polish ] = "Edytuj Script";
        Text[ japanese ] = "½¸ØÌßĂ̕ҏW";
        Text[ chinese_traditional ] = "½s¿è©R¥O½Z";
        Text[ arabic ] = "ÊÍÑíÑ ÇáÜ script";
        Text[ greek ] = "Åðåîåñãáóßá Script";
        Text[ korean ] = "½ºÅ©¸³Æ® ÆíÁý";
        Text[ turkish ] = "Script bearbeiten";
        Text[ language_user1 ] = " ";
    };
    String STR_JAVA_INSERT
    {
        /* ### ACHTUNG: Neuer Text in Resource? Script einfügen : Script einf³gen */
        Text = "Script einfügen" ;
        Text [ English ] = "Insert script" ;
        Text [ portuguese ] = "Inserir Script" ;
        Text [ english_us ] = "Insert Script" ;
        Text [ portuguese_brazilian ] = "Script einfügen" ;
        Text [ swedish ] = "Infoga skript" ;
        Text [ danish ] = "Indsæt script" ;
        Text [ italian ] = "Inserisci script" ;
        Text [ spanish ] = "Insertar script" ;
        Text [ french ] = "Insérer un script" ;
        Text [ dutch ] = "Script invoegen" ;
        Text[ chinese_simplified ] = "²åÈë½Å±¾";
        Text[ russian ] = "Âñòàâèòü ñêðèïò";
        Text[ polish ] = "Wstaw Script";
        Text[ japanese ] = "½¸ØÌßĂ̑}“ü";
        Text[ chinese_traditional ] = "´¡¤J©R¥O½Z";
        Text[ arabic ] = "ÅÏÑÇÌ Script";
        Text[ greek ] = "ÐñïóèÞêç Script";
        Text[ korean ] = "½ºÅ©¸³Æ® »ðÀÔ";
        Text[ turkish ] = "Script einfügen";
        Text[ language_user1 ] = " ";
    };
    Text [ english_us ] = "Edit Script" ;
    Text [ portuguese_brazilian ] = "Script bearbeiten" ;
    Text [ swedish ] = "Redigera skript" ;
    Text [ danish ] = "Rediger script" ;
    Text [ italian ] = "Modifica script" ;
    Text [ spanish ] = "Editar script" ;
    Text [ french ] = "Éditer le script" ;
    Text [ dutch ] = "Script bewerken" ;
    Text [ portuguese ] = "Editar Script" ;
    Text[ chinese_simplified ] = "±à¼­½Å±¾";
    Text[ russian ] = "Ïðàâêà ñêðèïòà";
    Text[ polish ] = "Edytuj Script";
    Text[ japanese ] = "½¸ØÌßĂ̕ҏW";
    Text[ chinese_traditional ] = "½s¿è©R¥O½Z";
    Text[ arabic ] = "ÊÍÑíÑ ÇáÜ Script";
    Text[ greek ] = "Åðåîåñãáóßá Script";
    Text[ korean ] = "½ºÅ©¸³Æ® ÆíÁý";
    Text[ turkish ] = "Script'i düzenle";
    Text[ language_user1 ] = " ";
};
 // ********************************************************************** EOF
diff --git a/sw/source/ui/fldui/makefile.mk b/sw/source/ui/fldui/makefile.mk
new file mode 100644
index 0000000..3634868
--- /dev/null
+++ b/sw/source/ui/fldui/makefile.mk
@@ -0,0 +1,131 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:37 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=..$/..$/..

PRJNAME=sw
TARGET=fldui

AUTOSEG=true

PROJECTPCH=ui_pch
PDBTARGET=ui_pch
PROJECTPCHSOURCE=..\ui_1st\ui_pch

# --- Settings -----------------------------------------------------

.INCLUDE :  $(PRJ)$/inc$/swpre.mk
.INCLUDE :  settings.mk
.INCLUDE :  $(PRJ)$/inc$/sw.mk

# --- Files --------------------------------------------------------

CXXFILES = \
        changedb.cxx \
        flddb.cxx \
        flddinf.cxx \
        flddok.cxx \
        fldedt.cxx \
        fldfunc.cxx \
        fldmgr.cxx \
        fldpage.cxx \
        fldref.cxx \
        fldtdlg.cxx \
        fldvar.cxx \
        javaedit.cxx \
        inpdlg.cxx

SRCFILES =  \
        changedb.src \
        flddb.src \
        flddinf.src \
        flddok.src \
        fldfunc.src \
        fldref.src \
        fldtdlg.src \
        fldui.src \
        fldvar.src \
        javaedit.src \
        inpdlg.src

SLOFILES =  \
        $(SLO)$/changedb.obj \
        $(SLO)$/flddb.obj \
        $(SLO)$/flddinf.obj \
        $(SLO)$/flddok.obj \
        $(SLO)$/fldedt.obj \
        $(SLO)$/fldfunc.obj \
        $(SLO)$/fldmgr.obj \
        $(SLO)$/fldpage.obj \
        $(SLO)$/fldref.obj \
        $(SLO)$/fldtdlg.obj \
        $(SLO)$/fldvar.obj \
        $(SLO)$/javaedit.obj \
        $(SLO)$/inpdlg.obj

EXCEPTIONSFILES =  \
        $(SLO)$/fldmgr.obj

# --- Tagets -------------------------------------------------------

.INCLUDE :  target.mk

diff --git a/sw/source/ui/fmtui/fmtui.src b/sw/source/ui/fmtui/fmtui.src
new file mode 100644
index 0000000..23b48af
--- /dev/null
+++ b/sw/source/ui/fmtui/fmtui.src
@@ -0,0 +1,140 @@
/*************************************************************************
 *
 *  $RCSfile: fmtui.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:37 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#include "fmtui.hrc"
#include "globals.hrc"

String STR_FMT_STD
{
    TEXT = "(keins)" ;
    TEXT [ English ] = "(none)" ;
    TEXT [ norwegian ] = "(ingen)" ;
    TEXT [ italian ] = "(senza)" ;
    TEXT [ portuguese_brazilian ] = "(nenhum)" ;
    TEXT [ portuguese ] = "(nenhum)" ;
    TEXT [ finnish ] = "(ei mitään)" ;
    TEXT [ danish ] = "(ingen)" ;
    TEXT [ french ] = "(aucun(e))" ;
    TEXT [ swedish ] = "(ingen)" ;
    TEXT [ dutch ] = "(geen)" ;
    TEXT [ spanish ] = "(ninguna)" ;
    TEXT [ english_us ] = "(none)" ;
    TEXT[ chinese_simplified ] = "(ÎÞ)";
    TEXT[ russian ] = "(áåç)";
    TEXT[ polish ] = "(brak)";
    TEXT[ japanese ] = "(‚È‚µ)";
    TEXT[ chinese_traditional ] = "(µL)";
    TEXT[ arabic ] = "(ÈÏæä)";
    TEXT[ dutch ] = "(geen)";
    TEXT[ chinese_simplified ] = "(ÎÞ)";
    TEXT[ greek ] = "(êáíÝíá)";
    TEXT[ korean ] = "(¾øÀ½)";
    TEXT[ turkish ] = "(yok)";
    TEXT[ language_user1 ] = " ";
};
String STR_TEMPLATE_WILDCARD
{
    TEXT = "*.vor" ;
};
 //String STR_NONAME    //!! VB
 //{
 // TEXT =  "Unbenannt ";
 // TEXT [English] = "Noname ";
 // TEXT [norwegian] = "Noname ";
 // TEXT [italian] = "Senza nome";
 // TEXT [portuguese_brazilian] = "Semnome ";
 // TEXT [portuguese] = "Semnome ";
 // TEXT [finnish] = "Nimetön ";
 // TEXT [danish] = "Intet navn";
 // TEXT [french] = "Sansnom ";
 // TEXT [swedish] = "Namnlös";
 // TEXT [dutch] = "Naamloos";
 // TEXT [spanish] = "Sin nombre ";
 // TEXT [english_us] = "Noname ";
 //};
String STR_OVERWRITE
{
    /* ### ACHTUNG: Neuer Text in Resource? Wollen Sie die Vorlage wirklich überschreiben? : Wollen Sie die Vorlage wirklich ³berschreiben? */
    TEXT = "Wollen Sie die Vorlage wirklich überschreiben?" ;
    TEXT [ English ] = "Do you really want to overwrite the template?" ;
    TEXT [ norwegian ] = "Do you really want to overwrite the template?" ;
    TEXT [ italian ] = "\nSovrascrivere il modello?" ;
    TEXT [ portuguese_brazilian ] = "Deseja realmente gravar sobre o modelo?" ;
    TEXT [ portuguese ] = "Deseja realmente eliminar este modelo?" ;
    TEXT [ finnish ] = "Haluatko varmasti korvata mallin?" ;
    TEXT [ danish ] = "Er du sikker på, at du vil overskrive denne skabelon?" ;
    TEXT [ french ] = "Voulez-vous vraiment écraser le modèle ?" ;
    TEXT [ swedish ] = "Vill Du verkligen skriva över den här mallen?" ;
    TEXT [ dutch ] = "\nWilt u deze sjabloon werkelijk overschrijven?" ;
    TEXT [ spanish ] = "¿Desea realmente sobrescribir la plantilla?" ;
    TEXT [ english_us ] = "\nAre you sure you want to delete this template?" ;
    TEXT[ chinese_simplified ] = "ÄúÕæµÄÒª¸²Ð´Õâ¸öÑùʽÂð£¿";
    TEXT[ russian ] = "Âû äåéñòâèòåëüíî õîòèòå çàìåíèòü ýòîò øàáëîí?";
    TEXT[ polish ] = "Chcesz na pewno skasowaæ ten szablon przez zapisanie?";
    TEXT[ japanese ] = "ÃÝÌßڰĂð–{“–‚ɍ폜‚µ‚Ü‚·‚©H";
    TEXT[ chinese_traditional ] = "±z¯u­nÂмg³o­Ó¼Ë¦¡¡H";
    TEXT[ arabic ] = "åá ÊÑíÏ ÈÇáÝÚá ÇáßÊÇÈÉ ÝæÞ ÇáÞÇáÈ¿";
    TEXT[ dutch ] = "\nWilt u deze sjabloon werkelijk overschrijven?";
    TEXT[ chinese_simplified ] = "ÄúÕæµÄÒª¸²Ð´Õâ¸öÑùʽÂð£¿";
    TEXT[ greek ] = "ÈÝëåôå óßãïõñá íá áíôéêáôáóôÞóåôå ôï ðñüôõðï;";
    TEXT[ korean ] = "\nÀÌ ¼­½ÄÆÄÀÏÀ» Á¤¸»·Î »èÁ¦ÇϽðڽÀ´Ï±î?";
    TEXT[ turkish ] = "Bu þablonu silmek istediðinizden emin misiniz?";
    TEXT[ language_user1 ] = " ";
};
diff --git a/sw/source/ui/fmtui/makefile.mk b/sw/source/ui/fmtui/makefile.mk
new file mode 100644
index 0000000..a264e24
--- /dev/null
+++ b/sw/source/ui/fmtui/makefile.mk
@@ -0,0 +1,94 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:37 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=..$/..$/..

PRJNAME=sw
TARGET=fmtui

AUTOSEG=true

PROJECTPCH=ui_pch
PDBTARGET=ui_pch
PROJECTPCHSOURCE=..\ui_1st\ui_pch

# --- Settings -----------------------------------------------------

.INCLUDE :  $(PRJ)$/inc$/swpre.mk
.INCLUDE :  settings.mk
.INCLUDE :  $(PRJ)$/inc$/sw.mk

# --- Files --------------------------------------------------------

CXXFILES = \
        tmpdlg.cxx

SRCFILES =  \
        tmpdlg.src

SLOFILES =  \
        $(SLO)$/tmpdlg.obj

# --- Tagets -------------------------------------------------------

.INCLUDE :  target.mk

diff --git a/sw/source/ui/fmtui/tmpdlg.cxx b/sw/source/ui/fmtui/tmpdlg.cxx
new file mode 100644
index 0000000..05ab186
--- /dev/null
+++ b/sw/source/ui/fmtui/tmpdlg.cxx
@@ -0,0 +1,628 @@
/*************************************************************************
 *
 *  $RCSfile: tmpdlg.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:37 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _UIPARAM_HXX
#include <uiparam.hxx>
#endif
#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _SVSTDARR_STRINGSISORTDTOR
#define _SVSTDARR_STRINGSISORTDTOR
#include <svtools/svstdarr.hxx>
#endif
#ifndef _SV_MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SVX_CHARDLG_HXX //autogen
#include <svx/chardlg.hxx>
#endif
#ifndef _SVX_PARAGRPH_HXX //autogen
#include <svx/paragrph.hxx>
#endif
#ifndef _SVX_BACKGRND_HXX //autogen
#include <svx/backgrnd.hxx>
#endif
#ifndef _SVX_TABSTPGE_HXX //autogen
#include <svx/tabstpge.hxx>
#endif
#ifndef _SVX_HDFT_HXX //autogen
#include <svx/hdft2.hxx>
#endif
#ifndef _SVX_FLSTITEM_HXX //autogen
#include <svx/flstitem.hxx>
#endif
#ifndef _SVX_PAGE_HXX //autogen
#include <svx/page.hxx>
#endif
#ifndef _SVX_BORDER_HXX //autogen
#include <svx/border.hxx>
#endif
#ifndef _SVX_HTMLMODE_HXX //autogen
#include <svx/htmlmode.hxx>
#endif
#ifndef _SVX_NUMPAGES_HXX //autogen
#include <svx/numpages.hxx>
#endif
#ifndef _OFA_HTMLCFG_HXX //autogen
#include <offmgr/htmlcfg.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif

#ifndef _NUMPARA_HXX
#include <numpara.hxx>
#endif
#ifndef _FMTCLDS_HXX //autogen
#include <fmtclds.hxx>
#endif
#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _ERRHDL_HXX
#include <errhdl.hxx>       // fuer Create-Methoden
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _SWWDOCSH_HXX //autogen
#include <wdocsh.hxx>
#endif
#ifndef _VIEWOPT_HXX
#include <viewopt.hxx>
#endif
#ifndef _PGFNOTE_HXX
#include <pgfnote.hxx>      // der Dialog
#endif
#ifndef _TMPDLG_HXX
#include <tmpdlg.hxx>       // der Dialog
#endif
#ifndef _COLUMN_HXX
#include <column.hxx>       // Spalten
#endif
#ifndef _DRPCPS_HXX
#include <drpcps.hxx>       // Initialen
#endif
#ifndef _FRMPAGE_HXX
#include <frmpage.hxx>      // Rahmen
#endif
#ifndef _WRAP_HXX
#include <wrap.hxx>         // Rahmen
#endif
#ifndef _FRMMGR_HXX
#include <frmmgr.hxx>       // Rahmen
#endif
#ifndef _CCOLL_HXX
#include <ccoll.hxx>        // CondColl
#endif
#ifndef _DOCSTYLE_HXX
#include <docstyle.hxx>     //
#endif
#ifndef _FMTCOL_HXX
#include <fmtcol.hxx>       //
#endif
#ifndef _MACASSGN_HXX
#include <macassgn.hxx>     //
#endif
#ifndef _UIITEMS_HXX
#include <uiitems.hxx>      // inclusive der NumTabPages!
#endif
#ifndef _POOLFMT_HXX
#include <poolfmt.hxx>
#endif
#ifndef _UITOOL_HXX
#include <uitool.hxx>
#endif
#ifndef _SHELLRES_HXX //autogen
#include <shellres.hxx>
#endif

#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _HELPID_H
#include <helpid.h>
#endif
#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif
#ifndef _FMTUI_HRC
#include <fmtui.hrc>
#endif


extern SwWrtShell* GetActiveWrtShell();

/*--------------------------------------------------------------------
    Beschreibung:   Der Traeger des Dialoges
 --------------------------------------------------------------------*/

SwTemplateDlg::SwTemplateDlg(Window*            pParent,
                             SfxStyleSheetBase& rBase,
                             USHORT             nRegion,
                             BOOL               bColumn,
                             SwWrtShell*        pActShell,
                             BOOL               bNew ) :
    SfxStyleDialog( pParent,
                    SW_RES(DLG_TEMPLATE_BASE + nRegion),
                    rBase,
                    FALSE,
                    0 ),
    nType( nRegion ),
    pWrtShell(pActShell),
    bNewStyle(bNew)
{
    FreeResource();

    nHtmlMode = ::GetHtmlMode(pWrtShell->GetView().GetDocShell());
    // TabPages zusammenfieseln
    switch( nRegion )
    {
        // Zeichenvorlagen
        case SFX_STYLE_FAMILY_CHAR:
        {
            AddTabPage(TP_CHAR_STD,     SvxCharStdPage::Create,
                                        SvxCharStdPage::GetRanges );
            AddTabPage(TP_CHAR_EXT,     SvxCharExtPage::Create,
                                        SvxCharExtPage::GetRanges );
            AddTabPage(TP_BACKGROUND,   SvxBackgroundTabPage::Create,
                                        SvxBackgroundTabPage::GetRanges );
            break;
        }
        // Absatzvorlagen
        case SFX_STYLE_FAMILY_PARA:
        {
            AddTabPage(TP_PARA_STD,     SvxStdParagraphTabPage::Create,
                                        SvxStdParagraphTabPage::GetRanges );
            AddTabPage(TP_PARA_ALIGN,   SvxParaAlignTabPage::Create,
                                        SvxParaAlignTabPage::GetRanges );

            AddTabPage(TP_PARA_EXT,     SvxExtParagraphTabPage::Create,
                                        SvxExtParagraphTabPage::GetRanges );

            AddTabPage(TP_CHAR_STD,     SvxCharStdPage::Create,
                                        SvxCharStdPage::GetRanges );
            AddTabPage(TP_CHAR_EXT,     SvxCharExtPage::Create,
                                        SvxCharExtPage::GetRanges );

            AddTabPage(TP_TABULATOR,    SvxTabulatorTabPage::Create,
                                        SvxTabulatorTabPage::GetRanges );

            AddTabPage(TP_NUMPARA,   SwParagraphNumTabPage::Create,
                                    SwParagraphNumTabPage::GetRanges);
            AddTabPage(TP_DROPCAPS,     SwDropCapsPage::Create,
                                        SwDropCapsPage::GetRanges );

            AddTabPage(TP_BACKGROUND,   SvxBackgroundTabPage::Create,
                                        SvxBackgroundTabPage::GetRanges );
            AddTabPage(TP_BORDER,       SvxBorderTabPage::Create,
                                        SvxBorderTabPage::GetRanges );

            AddTabPage( TP_CONDCOLL,    SwCondCollPage::Create,
                                        SwCondCollPage::GetRanges );
            if( (!bNewStyle && RES_CONDTXTFMTCOLL != ((SwDocStyleSheet&)rBase).GetCollection()->Which())
            || nHtmlMode & HTMLMODE_ON )
                RemoveTabPage(TP_CONDCOLL);

            if(nHtmlMode & HTMLMODE_ON)
            {
                OfaHtmlOptions* pHtmlOpt = OFF_APP()->GetHtmlOptions();
                if (!pHtmlOpt->IsPrintLayoutExtension())
                    RemoveTabPage(TP_PARA_EXT);
                RemoveTabPage(TP_TABULATOR);
                RemoveTabPage(TP_NUMPARA);
                if(!(nHtmlMode & HTMLMODE_FULL_STYLES))
                {
                    RemoveTabPage(TP_BACKGROUND);
                    RemoveTabPage(TP_DROPCAPS);
                }
                if(!(nHtmlMode & HTMLMODE_PARA_BORDER))
                    RemoveTabPage(TP_BORDER);
            }
        }
        break;
        // Rahmenvorlagen
        case SFX_STYLE_FAMILY_FRAME:
        {
            AddTabPage(TP_FRM_STD,      SwFrmPage::Create,
                                        SwFrmPage::GetRanges );
            AddTabPage(TP_FRM_ADD,      SwFrmAddPage::Create,
                                        SwFrmAddPage::GetRanges );
            AddTabPage(TP_FRM_WRAP,     SwWrapTabPage::Create,
                                        SwWrapTabPage::GetRanges );

            AddTabPage(TP_BACKGROUND,   SvxBackgroundTabPage::Create,
                                        SvxBackgroundTabPage::GetRanges );
            AddTabPage(TP_BORDER,       SvxBorderTabPage::Create,
                                        SvxBorderTabPage::GetRanges );

            AddTabPage(TP_COLUMN,       SwColumnPage::Create,
                                        SwColumnPage::GetRanges );

            AddTabPage( TP_MACRO_ASSIGN, SfxSmallMacroTabPage::Create, 0);

            // Auskommentiert wegen Bug #45776 (per default keine Breite&Groesse in Rahmenvorlagen)
/*          SwFmtFrmSize aSize( (const SwFmtFrmSize&)rBase.
                                            GetItemSet().Get(RES_FRM_SIZE));
            if( !aSize.GetWidth() )
            {
                aSize.SetWidth( DFLT_WIDTH );
                aSize.SetHeight( DFLT_HEIGHT );
                rBase.GetItemSet().Put( aSize );
            }*/
        break;
        }
        // Seitenvorlagen
        case SFX_STYLE_FAMILY_PAGE:
        {
            AddTabPage(TP_BACKGROUND,       SvxBackgroundTabPage::Create,
                                            SvxBackgroundTabPage::GetRanges );
            AddTabPage(TP_HEADER_PAGE,      String(SW_RES(STR_PAGE_HEADER)),
                                            SvxHeaderPage::Create,
                                            SvxHeaderPage::GetRanges );
            AddTabPage(TP_FOOTER_PAGE,      String(SW_RES(STR_PAGE_FOOTER)),
                                            SvxFooterPage::Create,
                                            SvxFooterPage::GetRanges );
            if(bColumn)
                SetCurPageId(TP_COLUMN);

            AddTabPage(TP_PAGE_STD,         String(SW_RES(STR_PAGE_STD)),
                                            SvxPageDescPage::Create,
                                            SvxPageDescPage::GetRanges,
                                            FALSE,
                                            1 ); // nach der Verwalten-Page
            if(!pActShell || 0 == ::GetHtmlMode(pWrtShell->GetView().GetDocShell()))
            {
                AddTabPage(TP_BORDER,           String(SW_RES(STR_PAGE_BORDER)),
                                                SvxBorderTabPage::Create,
                                                SvxBorderTabPage::GetRanges );
                AddTabPage(TP_COLUMN,           String(SW_RES(STR_PAGE_COLUMN)),
                                                SwColumnPage::Create,
                                                SwColumnPage::GetRanges );
                AddTabPage(TP_FOOTNOTE_PAGE,    String(SW_RES(STR_PAGE_FOOTNOTE)),
                                                SwFootNotePage::Create,
                                                SwFootNotePage::GetRanges );
            }


        }
        break;
        // Numerierungsvorlagen
        case SFX_STYLE_FAMILY_PSEUDO:
        {
            AddTabPage(RID_SVXPAGE_PICK_SINGLE_NUM,     &SvxSingleNumPickTabPage::Create, 0);
            AddTabPage(RID_SVXPAGE_PICK_BULLET, &SvxBulletPickTabPage::Create, 0);
            AddTabPage(RID_SVXPAGE_PICK_NUM,    &SvxNumPickTabPage::Create, 0);
            AddTabPage(RID_SVXPAGE_PICK_BMP,    &SvxBitmapPickTabPage::Create, 0);
            AddTabPage(RID_SVXPAGE_NUM_OPTIONS, &SvxNumOptionsTabPage::Create, 0);
            AddTabPage(RID_SVXPAGE_NUM_POSITION,&SvxNumPositionTabPage::Create, 0);

/*          const SfxPoolItem* pItem;
            if(SFX_ITEM_SET == rBase.GetItemSet().GetItemState(
                FN_PARAM_ACT_NUMBER, FALSE, &pItem ))
            {
//              pActNum = (ActNumberFormat*)((const SwPtrItem*)pItem)->GetValue();
            }
*/
        }
        break;

        default:
            ASSERT(!this, "Falsche Familie");

    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SwTemplateDlg::~SwTemplateDlg()
{
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

short SwTemplateDlg::Ok()
{
    short nRet = SfxTabDialog::Ok();
    if( RET_OK == nRet )
    {
        const SfxPoolItem *pOutItem, *pExItem;
        if( SFX_ITEM_SET == pExampleSet->GetItemState(
            SID_ATTR_NUMBERING_RULE, FALSE, &pExItem ) &&
            ( !GetOutputItemSet() ||
            SFX_ITEM_SET != GetOutputItemSet()->GetItemState(
            SID_ATTR_NUMBERING_RULE, FALSE, &pOutItem ) ||
            *pExItem != *pOutItem ))
        {
            if( GetOutputItemSet() )
                ((SfxItemSet*)GetOutputItemSet())->Put( *pExItem );
            else
                nRet = RET_CANCEL;
        }
    }
    else
        //JP 09.01.98 Bug #46446#:
        // das ist der Ok - Handler also muss auf OK defaultet werden!
        nRet = RET_OK;
    return nRet;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

const SfxItemSet* SwTemplateDlg::GetRefreshedSet()
{
    delete GetInputSetImpl();
    return new SfxItemSet(GetStyleSheet().GetItemSet());
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwTemplateDlg::PageCreated( USHORT nId, SfxTabPage &rPage )
{
    //Namen der Vorlagen und Metric setzen
    String sNumCharFmt; GetDocPoolNm( RES_POOLCHR_NUM_LEVEL, sNumCharFmt);
    String sBulletCharFmt; GetDocPoolNm( RES_POOLCHR_BUL_LEVEL, sBulletCharFmt);

    switch( nId )
    {
        case TP_CHAR_STD:
            {
                ASSERT(::GetActiveView(), "keine View aktiv");

                SvxFontListItem aFontListItem( *( (SvxFontListItem*)::GetActiveView()->
                    GetDocShell()->GetItem( SID_ATTR_CHAR_FONTLIST ) ) );

                ((SvxCharStdPage&)rPage).SetFontList(aFontListItem);

                if(rPage.GetItemSet().GetParent() && 0 == (nHtmlMode & HTMLMODE_ON ))
                    ((SvxCharStdPage&)rPage).EnableRelativeMode();
            }
            break;

        case TP_CHAR_EXT:
            ((SvxCharExtPage&)rPage).EnableFlash();
            break;

        case TP_PARA_STD:
            if( rPage.GetItemSet().GetParent() )
            {
                ((SvxStdParagraphTabPage&)rPage).EnableRelativeMode();
                ((SvxStdParagraphTabPage&)rPage).EnableRegisterMode();
                ((SvxStdParagraphTabPage&)rPage).EnableAutoFirstLine();
                ((SvxStdParagraphTabPage&)rPage).EnableAbsLineDist(MM50/2);
            }
            break;
        case TP_NUMPARA:
            {
                ListBox & rBox = ((SwParagraphNumTabPage&)rPage).GetStyleBox();
                SfxStyleSheetBasePool* pPool = pWrtShell->GetView().GetDocShell()->GetStyleSheetPool();
                pPool->SetSearchMask(SFX_STYLE_FAMILY_PSEUDO, SFXSTYLEBIT_ALL);
                const SfxStyleSheetBase* pBase = pPool->First();
                SvStringsISortDtor aNames;
                while(pBase)
                {
                    aNames.Insert(new String(pBase->GetName()));
                    pBase = pPool->Next();
                }
                for(USHORT i = 0; i < aNames.Count(); i++)
                    rBox.InsertEntry(*aNames.GetObject(i));
        }
        break;
        case TP_PARA_ALIGN:
            ((SvxParaAlignTabPage&)rPage).EnableJustifyExt();
            break;

        case TP_FRM_STD:
            ((SwFrmPage&)rPage).SetNewFrame( TRUE );
            ((SwFrmPage&)rPage).SetFormatUsed( TRUE );
            break;

        case TP_FRM_ADD:
            ((SwFrmAddPage&)rPage).SetFormatUsed(TRUE);
            ((SwFrmAddPage&)rPage).SetNewFrame(TRUE);
            break;

        case TP_FRM_WRAP:
            ((SwWrapTabPage&)rPage).SetFormatUsed( TRUE, FALSE );
            break;

        case TP_COLUMN:
            if( nType == SFX_STYLE_FAMILY_FRAME )
                ((SwColumnPage&)rPage).SetFrmMode(TRUE);
            ((SwColumnPage&)rPage).SetFormatUsed( TRUE );
            break;

        case TP_BACKGROUND:
            if( SFX_STYLE_FAMILY_PARA == nType )
                ((SvxBackgroundTabPage&)rPage).ShowParaControl();
            if( SFX_STYLE_FAMILY_CHAR != nType )
                ((SvxBackgroundTabPage&)rPage).ShowSelector();
            break;

        case TP_CONDCOLL:
            ((SwCondCollPage&)rPage).SetCollection(
                ((SwDocStyleSheet&)GetStyleSheet()).GetCollection(), bNewStyle );
            break;

        case TP_PAGE_STD:
            if(0 == (nHtmlMode & HTMLMODE_ON ))
            {
                List aList;
                String* pNew = new String;
                GetDocPoolNm( RES_POOLCOLL_TEXT, *pNew );
                aList.Insert( pNew, (ULONG)0 );
                if( pWrtShell )
                {
                    SfxStyleSheetBasePool* pStyleSheetPool = pWrtShell->
                                GetView().GetDocShell()->GetStyleSheetPool();
                    pStyleSheetPool->SetSearchMask(SFX_STYLE_FAMILY_PARA);
                    SfxStyleSheetBase *pStyle = pStyleSheetPool->First();
                    while(pStyle)
                    {
                        aList.Insert( new String(pStyle->GetName()),
                                        aList.Count());
                        pStyle = pStyleSheetPool->Next();
                    }
                }
                ((SvxPageDescPage&)rPage).SetCollectionList(&aList);
                for( USHORT i = (USHORT)aList.Count(); i; --i )
                    delete (String*)aList.Remove(i);
            }
            break;

        case TP_MACRO_ASSIGN:
            SwMacroAssignDlg::AddEvents( (SfxSmallMacroTabPage&)rPage, MACASSGN_ALLFRM);
            break;

        case RID_SVXPAGE_PICK_NUM:
            ((SvxNumPickTabPage&)rPage).SetCharFmtNames(sNumCharFmt, sBulletCharFmt);
        break;
        case RID_SVXPAGE_NUM_OPTIONS:
        {
            ((SvxNumOptionsTabPage&)rPage).SetCharFmts(sNumCharFmt, sBulletCharFmt);
            ListBox& rCharFmtLB = ((SvxNumOptionsTabPage&)rPage).GetCharFmtListBox();
            // Zeichenvorlagen sammeln
            rCharFmtLB.Clear();
            rCharFmtLB.InsertEntry( ViewShell::GetShellRes()->aStrNone );
            SwDocShell* pDocShell = ::GetActiveWrtShell()->GetView().GetDocShell();
            ::FillCharStyleListBox(rCharFmtLB,  pDocShell);
            FieldUnit eMetric = ::GetDfltMetric(0 != PTR_CAST(SwWebDocShell, pDocShell));
            ((SvxNumOptionsTabPage&)rPage).SetMetric(eMetric);
        }
        break;
        case RID_SVXPAGE_NUM_POSITION:
        {
            SwDocShell* pDocShell = ::GetActiveWrtShell()->GetView().GetDocShell();
            FieldUnit eMetric = ::GetDfltMetric(0 != PTR_CAST(SwWebDocShell, pDocShell));
            ((SvxNumPositionTabPage&)rPage).SetMetric(eMetric);
        }
        break;
        case  RID_SVXPAGE_PICK_BULLET :
            ((SvxBulletPickTabPage&)rPage).SetCharFmtName(sBulletCharFmt);
        break;
    }
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.88  2000/09/18 16:05:31  willem.vandorp
    OpenOffice header added.

    Revision 1.87  2000/07/27 21:15:53  jp
    opt: get template names direct from the doc and don't load it from the resource

    Revision 1.86  2000/02/11 14:47:00  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.85  1999/01/05 09:11:44  OS
    #60606# #52654# Numerierungsregel an Styles wieder korrekt


      Rev 1.84   05 Jan 1999 10:11:44   OS
   #60606# #52654# Numerierungsregel an Styles wieder korrekt

      Rev 1.83   17 Nov 1998 10:51:44   OS
   #58263# Numerierungs-Tabseiten aus dem Svx

      Rev 1.82   17 Jul 1998 10:18:28   OS
   SfxxSmallMacroTabPage einsetzen #52809#

      Rev 1.81   01 Jul 1998 17:41:16   OS
   keine rel. FontHeight im Html #51938#

      Rev 1.80   24 Apr 1998 11:06:24   OS
   Format-Flag fuer Spalten-Page setzen

      Rev 1.79   22 Apr 1998 13:35:04   OS
   PrintingExtensions im HTML

      Rev 1.78   16 Apr 1998 15:56:40   OS
   kein RegisterMode im HTML

      Rev 1.77   31 Mar 1998 10:20:56   OM
   #45776 Per default kein Size-Item in Rahmenvorlagen

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/fmtui/tmpdlg.src b/sw/source/ui/fmtui/tmpdlg.src
new file mode 100644
index 0000000..831a7ad
--- /dev/null
+++ b/sw/source/ui/fmtui/tmpdlg.src
@@ -0,0 +1,1283 @@
/*************************************************************************
 *
 *  $RCSfile: tmpdlg.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:37 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _SFX_HRC
#include <sfx2/sfx.hrc>
#endif
#include "fmtui.hrc"
#include "globals.hrc"
#include "svx/dialogs.hrc"
TabDialog DLG_TEMPLATE_1
{
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Text = "Zeichenvorlage" ;
    Text [ ENGLISH ] = "Character Style" ;
    Text [ norwegian ] = "Character Style" ;
    Text [ italian ] = "Modello di carattere" ;
    Text [ portuguese_brazilian ] = "Estilo de caracter" ;
    Text [ portuguese ] = "Estilos de caracteres" ;
    Text [ finnish ] = "Merkkityyli" ;
    Text [ danish ] = "Tegntypografi" ;
    Text [ french ] = "Style de caractères" ;
    Text [ swedish ] = "Teckenformatmall" ;
    Text [ dutch ] = "Tekenopmaakprofiel" ;
    Text [ spanish ] = "Estilo de carácter" ;
    Text [ english_us ] = "Character Style" ;
    Moveable = TRUE ;
    TabControl 1
    {
        OutputSize = TRUE ;
        PageList =
        {
            PageItem
            {
                Identifier = TP_CHAR_STD ;
                Text = "Schrift" ;
                Text [ ENGLISH ] = "Font" ;
                Text [ norwegian ] = "Skrift" ;
                Text [ italian ] = "Carattere" ;
                Text [ portuguese_brazilian ] = "Fonte" ;
                Text [ portuguese ] = "Tipo de letra" ;
                Text [ finnish ] = "Fontti" ;
                Text [ danish ] = "Skrifttype" ;
                Text [ french ] = "Police" ;
                Text [ swedish ] = "Teckensnitt" ;
                Text [ dutch ] = "Lettertype" ;
                Text [ spanish ] = "Fuente" ;
                Text [ english_us ] = "Font" ;
                PageResID = TP_CHAR_STD ;
                Text[ chinese_simplified ] = "×ÖÌå";
                Text[ russian ] = "Øðèôò";
                Text[ polish ] = "Czcionka";
                Text[ japanese ] = "Ì«ÝÄ";
                Text[ chinese_traditional ] = "¦r«¬";
                Text[ arabic ] = "ÇáÎØ";
                Text[ greek ] = "ÃñáììáôïóåéñÜ";
                Text[ korean ] = "±Û²Ã";
                Text[ turkish ] = "Yazýtipi";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_CHAR_EXT ;
                Text = "Schrifteffekt" ;
                Text [ ENGLISH ] = "Font Effects" ;
                Text [ norwegian ] = "Font Effects" ;
                Text [ italian ] = "Effetto carattere" ;
                Text [ portuguese_brazilian ] = "Efeitos de fonte" ;
                Text [ portuguese ] = "Efeitos do tipo de letra" ;
                Text [ finnish ] = "Fontin tehosteet" ;
                Text [ danish ] = "Skrifteffekt" ;
                Text [ french ] = "Effet de caractère" ;
                Text [ swedish ] = "Teckensnittseffekt" ;
                Text [ dutch ] = "Schrifteffect" ;
                Text [ spanish ] = "Efectos de fuente" ;
                Text [ english_us ] = "Font Effects" ;
                PageResID = TP_CHAR_EXT ;
                Text[ chinese_simplified ] = "×ÖÌåЧ¹û";
                Text[ russian ] = "Ýôôåêòû øðèôòà";
                Text[ polish ] = "Efekty czcionki";
                Text[ japanese ] = "Ì«ÝČø‰Ê";
                Text[ chinese_traditional ] = "¦r«¬®ÄªG";
                Text[ arabic ] = "ÊÃËíÑÇÊ ÇáÎØæØ";
                Text[ greek ] = "ÅöÝ ÷áñáêôÞñùí";
                Text[ korean ] = "±Û²Ã È¿°ú";
                Text[ turkish ] = "Yazýtipi seçenekleri";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_BACKGROUND ;
                Text = "Hintergrund" ;
                Text [ ENGLISH ] = "Background" ;
                Text [ norwegian ] = "Background" ;
                Text [ italian ] = "Sfondo" ;
                Text [ portuguese_brazilian ] = "Fundo" ;
                Text [ portuguese ] = "Plano de fundo" ;
                Text [ finnish ] = "Tausta" ;
                Text [ danish ] = "Baggrund" ;
                Text [ french ] = "Arrière-plan" ;
                Text [ swedish ] = "Bakgrund" ;
                Text [ dutch ] = "Achtergrond" ;
                Text [ spanish ] = "Fondo" ;
                Text [ english_us ] = "Background" ;
                PageResID = TP_BACKGROUND ;
                Text[ chinese_simplified ] = "±³¾°";
                Text[ russian ] = "Ôîí";
                Text[ polish ] = "T³o";
                Text[ japanese ] = "”wŒi";
                Text[ chinese_traditional ] = "­I´º";
                Text[ arabic ] = "ÇáÎáÝíÉ";
                Text[ greek ] = "Öüíôï";
                Text[ korean ] = "¹è°æ";
                Text[ turkish ] = "Artalan";
                Text[ language_user1 ] = " ";
            };
        };
    };
    Text[ chinese_simplified ] = "×Ö·ûÑùʽ";
    Text[ russian ] = "Ñòèëü çíàêîâ";
    Text[ polish ] = "Styl znaku";
    Text[ japanese ] = "•¶Žš½À²Ù";
    Text[ chinese_traditional ] = "¦r«¬¼Ë¦¡";
    Text[ arabic ] = "äãØ ÇáÃÍÑÝ";
    Text[ greek ] = "Óôõë ÷áñáêôÞñùí";
    Text[ korean ] = "ÅØ½ºÆ® À¯Çü";
    Text[ turkish ] = "Karakter biçimi";
    Text[ language_user1 ] = " ";
};
TabDialog DLG_TEMPLATE_2
{
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Text = "Absatzvorlage" ;
    Text [ ENGLISH ] = "Paragraph Style" ;
    Text [ norwegian ] = "Paragraph Style" ;
    Text [ italian ] = "Modello paragrafo" ;
    Text [ portuguese_brazilian ] = "Estilo de parágrafo" ;
    Text [ portuguese ] = "Estilo de parágrafo" ;
    Text [ finnish ] = "Kappaletyyli" ;
    Text [ danish ] = "Afsnitstypografi" ;
    Text [ french ] = "Style de paragraphe" ;
    Text [ swedish ] = "Styckeformatmall" ;
    Text [ dutch ] = "Alinea-opmaakprofiel" ;
    Text [ spanish ] = "Estilo de párrafo" ;
    Text [ english_us ] = "Paragraph Style" ;
    Moveable = TRUE ;
    TabControl 1
    {
        OutputSize = TRUE ;
        PageList =
        {
            PageItem
            {
                Identifier = TP_PARA_STD ;
                /* ### ACHTUNG: Neuer Text in Resource? Einzüge und Abstände : Einz³ge und Abstõnde */
                Text = "Einzüge und Abstände" ;
                Text [ ENGLISH ] = "Indent and Spacing" ;
                Text [ norwegian ] = "Indent and Spacing" ;
                Text [ italian ] = "Rientro e spaziatura" ;
                Text [ portuguese_brazilian ] = "Indentar e Espaçar" ;
                Text [ portuguese ] = "Avanços e espaçamento" ;
                Text [ finnish ] = "Sisennys ja välit" ;
                Text [ danish ] = "Indrykning og mellemrum" ;
                Text [ french ] = "Retraits et écarts" ;
                Text [ swedish ] = "Indrag och avstånd" ;
                Text [ dutch ] = "Inspringen en afstanden" ;
                Text [ spanish ] = "Sangrías y espacios" ;
                Text [ english_us ] = "Indents & Spacing" ;
                PageResID = TP_PARA_STD ;
                Text[ chinese_simplified ] = "Ëõ½øºÍ¼ä¸ô";
                Text[ russian ] = "Îòñòóïû è èíòåðâàëû";
                Text[ polish ] = "Wciêcia i odstêpy";
                Text[ japanese ] = "²ÝÃÞÝĂƊԊu";
                Text[ chinese_traditional ] = "ÁY±Æ©M¶¡¹j";
                Text[ arabic ] = "ÇáÅÒÇÍÉ æÇáÊÈÇÚÏ";
                Text[ greek ] = "Åóï÷Ýò êáé áðïóôÜóåéò";
                Text[ korean ] = "µé¿©¾²±â¿Í °£°Ý";
                Text[ turkish ] = "Girinti ve aralýklar";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_PARA_ALIGN ;
                Text = "Ausrichtung" ;
                Text [ ENGLISH ] = "Alignment" ;
                PageResID = TP_PARA_ALIGN ;
                Text [ english_us ] = "Alignment" ;
                Text [ portuguese_brazilian ] = "Ausrichtung" ;
                Text [ swedish ] = "Justering" ;
                Text [ danish ] = "Justering" ;
                Text [ italian ] = "Allineamento" ;
                Text [ spanish ] = "Alineación" ;
                Text [ french ] = "Alignement" ;
                Text [ dutch ] = "Uitlijning" ;
                Text [ portuguese ] = "Alinhamento" ;
                Text[ chinese_simplified ] = "¶ÔÆë";
                Text[ russian ] = "Âûðàâíèâàíèå";
                Text[ polish ] = "Wyrównanie";
                Text[ japanese ] = "”z’u";
                Text[ chinese_traditional ] = "¹ï»ô";
                Text[ arabic ] = "ÇáãÍÇÐÇÉ";
                Text[ greek ] = "Óôïß÷éóç";
                Text[ korean ] = "¸ÂÃã";
                Text[ turkish ] = "Hizalama";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_PARA_EXT ;
                /* ### ACHTUNG: Neuer Text in Resource? Textfluß : Textflu˜ */
                Text = "Textfluss" ;
                Text [ ENGLISH ] = "Text Flow" ;
                Text [ norwegian ] = "Text Flow" ;
                Text [ italian ] = "Flusso di testo" ;
                Text [ portuguese_brazilian ] = "Fluxo do Texto" ;
                Text [ portuguese ] = "Fluxo de texto" ;
                Text [ finnish ] = "Tekstin juoksutus" ;
                Text [ danish ] = "Tekstretning" ;
                Text [ french ] = "Enchaînements" ;
                Text [ swedish ] = "Textflöde" ;
                Text [ dutch ] = "Tekstverloop" ;
                Text [ spanish ] = "Flujo del texto" ;
                Text [ english_us ] = "Text Flow" ;
                PageResID = TP_PARA_EXT ;
                Text[ chinese_simplified ] = "»»ÐкͷÖÒ³";
                Text[ russian ] = "Ïîëîæåíèå íà ñòðàíèöå";
                Text[ polish ] = "Tekst";
                Text[ japanese ] = "‘̍Ù";
                Text[ chinese_traditional ] = "´«¦æ©M¤À­¶";
                Text[ arabic ] = "ÇäÓíÇÈ ÇáäÕ";
                Text[ greek ] = "ÑïÞ êåéìÝíïõ";
                Text[ korean ] = "ÅØ½ºÆ® È帧";
                Text[ turkish ] = "Metin akýþý";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_CHAR_STD ;
                Text = "Schrift" ;
                Text [ ENGLISH ] = "Font" ;
                Text [ norwegian ] = "Skrift" ;
                Text [ italian ] = "Carattere" ;
                Text [ portuguese_brazilian ] = "Fonte" ;
                Text [ portuguese ] = "Tipo de letra" ;
                Text [ finnish ] = "Fontti" ;
                Text [ danish ] = "Skrifttype" ;
                Text [ french ] = "Police" ;
                Text [ swedish ] = "Teckensnitt" ;
                Text [ dutch ] = "Lettertype" ;
                Text [ spanish ] = "Fuente" ;
                Text [ english_us ] = "Font" ;
                PageResID = TP_CHAR_STD ;
                Text[ chinese_simplified ] = "×ÖÌå";
                Text[ russian ] = "Øðèôò";
                Text[ polish ] = "Czcionka";
                Text[ japanese ] = "Ì«ÝÄ";
                Text[ chinese_traditional ] = "¦r«¬";
                Text[ arabic ] = "ÇáÎØ";
                Text[ greek ] = "ÃñáììáôïóåéñÜ";
                Text[ korean ] = "±Û²Ã";
                Text[ turkish ] = "Yazýtipi";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_CHAR_EXT ;
                Text = "Schrifteffekte" ;
                Text [ ENGLISH ] = "Font Effects" ;
                Text [ norwegian ] = "Font Effects" ;
                Text [ italian ] = "Effetto carattere" ;
                Text [ portuguese_brazilian ] = "Efeitos de fonte" ;
                Text [ portuguese ] = "Efeitos do tipo de letra" ;
                Text [ finnish ] = "Fontin tehosteet" ;
                Text [ danish ] = "Skrifteffekter" ;
                Text [ french ] = "Effets de caractère" ;
                Text [ swedish ] = "Teckensnittseffekter" ;
                Text [ dutch ] = "Schrifteffecten" ;
                Text [ spanish ] = "Efectos de fuente" ;
                Text [ english_us ] = "Font Effects" ;
                PageResID = TP_CHAR_EXT ;
                Text[ chinese_simplified ] = "×ÖÌåЧ¹û";
                Text[ russian ] = "Ýôôåêòû øðèôòà";
                Text[ polish ] = "Efekty czcionki";
                Text[ japanese ] = "Ì«ÝČø‰Ê";
                Text[ chinese_traditional ] = "¦r«¬®ÄªG";
                Text[ arabic ] = "ÊÃËíÑÇÊ ÇáÎØæØ";
                Text[ greek ] = "ÅöÝ ãñáììáôïóåéñÜò";
                Text[ korean ] = "±Û²Ã È¿°ú";
                Text[ turkish ] = "Yazýtipi seçenekleri";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_NUMPARA ;
                Text = "Nummerierung" ;
                Text [ ENGLISH ] = "Numbering" ;
                Text [ english_us ] = "Numbering" ;
                Text [ portuguese_brazilian ] = "Numerierung" ;
                Text [ swedish ] = "Numrering" ;
                Text [ danish ] = "Nummerering" ;
                Text [ italian ] = "Numerazione" ;
                Text [ spanish ] = "Numeración" ;
                Text [ french ] = "Numérotation" ;
                Text [ dutch ] = "Nummering" ;
                Text [ portuguese ] = "Numeração" ;
                Text[ chinese_simplified ] = "񅧏";
                Text[ russian ] = "Íóìåðàöèÿ";
                Text[ polish ] = "Numeracja";
                Text[ japanese ] = "”ԍ†•t‚¯";
                Text[ chinese_traditional ] = "½s¸¹";
                Text[ arabic ] = "ÇáÊÑÞíã";
                Text[ greek ] = "Áñßèìçóç";
                Text[ korean ] = "¹øÈ£ ¸Å±â±â";
                Text[ turkish ] = "Numaralama";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_TABULATOR ;
                Text = "Tabulatoren" ;
                Text [ ENGLISH ] = "Tabs" ;
                Text [ norwegian ] = "Tabulatorer" ;
                Text [ italian ] = "Tabulazioni" ;
                Text [ portuguese_brazilian ] = "Tabulações" ;
                Text [ portuguese ] = "Tabulações" ;
                Text [ finnish ] = "Sarkaimet" ;
                Text [ danish ] = "Tabulatorer" ;
                Text [ french ] = "Tabulations" ;
                Text [ swedish ] = "Tabulatorer" ;
                Text [ dutch ] = "Tabs" ;
                Text [ spanish ] = "Tabulaciones" ;
                Text [ english_us ] = "Tabs" ;
                PageResID = TP_TABULATOR ;
                Text[ chinese_simplified ] = "ÖÆ±í·û";
                Text[ russian ] = "Òàáóëÿòîðû";
                Text[ polish ] = "Tabulatory";
                Text[ japanese ] = "ÀÌÞ";
                Text[ chinese_traditional ] = "»sªí²Å";
                Text[ arabic ] = "ÚáÇãÇÊ ÇáÌÏæáÉ";
                Text[ greek ] = "ÓôçëïèÝôåò";
                Text[ korean ] = "ÅÇ";
                Text[ turkish ] = "Sekmeler";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_DROPCAPS ;
                Text = "Initialen" ;
                Text [ ENGLISH ] = "Drop Caps" ;
                Text [ norwegian ] = "Drop Caps" ;
                Text [ italian ] = "Capolettera" ;
                Text [ portuguese_brazilian ] = "Capitulares descidas" ;
                Text [ portuguese ] = "Iniciais" ;
                Text [ finnish ] = "Anfangit" ;
                Text [ danish ] = "Initialer" ;
                Text [ french ] = "Lettrines" ;
                Text [ swedish ] = "Anfangsbokstäver" ;
                Text [ dutch ] = "Initialen" ;
                Text [ spanish ] = "Iniciales" ;
                Text [ english_us ] = "Drop Caps" ;
                PageResID = TP_DROPCAPS ;
                Text[ chinese_simplified ] = "×ÖÊ×´óд";
                Text[ russian ] = "Èíèöèàëû";
                Text[ polish ] = "Inicja³y";
                Text[ japanese ] = "ÄÞÛ¯Ìß·¬¯Ìß";
                Text[ chinese_traditional ] = "¦r­º¤j¼g";
                Text[ arabic ] = "ÇáÃÍÑÝ ÇáÇÓÊåáÇáíÉ";
                Text[ greek ] = "Áñ÷éãñÜììáôá";
                Text[ korean ] = "´Ü¶ô ù¹®ÀÚ Àå½Ä";
                Text[ turkish ] = "Baþharfler";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_BACKGROUND ;
                Text = "Hintergrund" ;
                Text [ ENGLISH ] = "Background" ;
                Text [ norwegian ] = "Background" ;
                Text [ italian ] = "Sfondo" ;
                Text [ portuguese_brazilian ] = "Fundo" ;
                Text [ portuguese ] = "Plano de fundo" ;
                Text [ finnish ] = "Tausta" ;
                Text [ danish ] = "Baggrund" ;
                Text [ french ] = "Arrière-plan" ;
                Text [ swedish ] = "Bakgrund" ;
                Text [ dutch ] = "Achtergrond" ;
                Text [ spanish ] = "Fondo" ;
                Text [ english_us ] = "Background" ;
                PageResID = TP_BACKGROUND ;
                Text[ chinese_simplified ] = "±³¾°";
                Text[ russian ] = "Ôîí";
                Text[ polish ] = "T³o";
                Text[ japanese ] = "”wŒi";
                Text[ chinese_traditional ] = "­I´º";
                Text[ arabic ] = "ÇáÎáÝíÉ";
                Text[ greek ] = "Öüíôï";
                Text[ korean ] = "¹è°æ";
                Text[ turkish ] = "Artalan";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_BORDER ;
                Text = "Umrandung" ;
                Text [ ENGLISH ] = "Border" ;
                Text [ norwegian ] = "Border" ;
                Text [ italian ] = "Bordo" ;
                Text [ portuguese_brazilian ] = "Borda" ;
                Text [ portuguese ] = "Contornos" ;
                Text [ finnish ] = "Reunaviiva" ;
                Text [ danish ] = "Ramme" ;
                Text [ french ] = "Bordure" ;
                Text [ swedish ] = "Inramning" ;
                Text [ dutch ] = "Omranding" ;
                Text [ spanish ] = "Borde" ;
                Text [ english_us ] = "Borders" ;
                PageResID = TP_BORDER ;
                Text[ chinese_simplified ] = "±ß¿ò";
                Text[ russian ] = "Îáðàìëåíèå";
                Text[ polish ] = "Obramowanie";
                Text[ japanese ] = "ŠO˜g";
                Text[ chinese_traditional ] = "Ã䮨";
                Text[ arabic ] = "ÇáÍÏæÏ";
                Text[ greek ] = "Ðåñßãñáììá";
                Text[ korean ] = "¿Ü°û¼±";
                Text[ turkish ] = "Kenarlýk";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_CONDCOLL ;
                PageResID = TP_CONDCOLL ;
                Text = "Bedingung" ;
                Text [ English ] = "Condition" ;
                Text [ english_us ] = "Condition" ;
                Text [ italian ] = "Condizione" ;
                Text [ spanish ] = "Condición" ;
                Text [ french ] = "Condition" ;
                Text [ dutch ] = "Voorwaarde" ;
                Text [ swedish ] = "Villkor" ;
                Text [ danish ] = "Betingelse" ;
                Text [ portuguese_brazilian ] = "Bedingung" ;
                Text [ portuguese ] = "Condição" ;
                Text[ chinese_simplified ] = "Ìõ¼þ";
                Text[ russian ] = "Óñëîâèå";
                Text[ polish ] = "Warunek";
                Text[ japanese ] = "ðŒ";
                Text[ chinese_traditional ] = "±ø¥ó";
                Text[ arabic ] = "ÇáÔÑØ";
                Text[ greek ] = "ÓõíèÞêç";
                Text[ korean ] = "Á¶°Ç";
                Text[ turkish ] = "Koþul";
                Text[ language_user1 ] = " ";
            };
        };
    };
    Text[ chinese_simplified ] = "¶ÎÂäÑùʽ";
    Text[ russian ] = "Ñòèëü àáçàöà";
    Text[ polish ] = "Styl akapitu";
    Text[ japanese ] = "’i—޽À²Ù";
    Text[ chinese_traditional ] = "¬q¸¨¼Ë¦¡";
    Text[ arabic ] = "äãØ ÝÞÑÉ";
    Text[ greek ] = "Ðñüôõðï ðáñáãñÜöïõ";
    Text[ korean ] = "´Ü¶ô À¯Çü";
    Text[ turkish ] = "Paragraf biçimi";
    Text[ language_user1 ] = " ";
};
TabDialog DLG_TEMPLATE_4
{
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Text = "Seitenvorlage" ;
    Text [ ENGLISH ] = "Page Style" ;
     // Text[norwegian_wrong] = "Sidetyper";
     // Text[italian_wrong] = "Stili pagina";
     // Text[portuguese_brazilian_wrong] = "Estilos da Página ";
     // Text[portuguese_wrong] = "Estilos da Página ";
     // Text[finnish_wrong] = "Sivutyylit";
     // Text[danish_wrong] = "Sidelayout";
     // Text[french_wrong] = "Styles de page";
     // Text[swedish_wrong] = "Sidformat";
     // Text[dutch_wrong] = "Pagina-opmaakprofielen";
     // Text[spanish_wrong] = "Estilos de página";
    Text [ english_us ] = "Page Style" ;
    Moveable = TRUE ;
    TabControl 1
    {
        OutputSize = TRUE ;
        PageList =
        {
            /*            PageItem
            {
                Identifier = TP_PAGE_STD ;
                Text = "Seite" ;
                Text [ ENGLISH ] = "Page" ;
                Text [ norwegian ] = "Page" ;
                Text [ italian ] = "Pagina" ;
                Text [ portuguese_brazilian ] = "Página" ;
                Text [ portuguese ] = "Página" ;
                Text [ finnish ] = "Sivu" ;
                Text [ danish ] = "Side" ;
                Text [ french ] = "Page" ;
                Text [ swedish ] = "Sida" ;
                Text [ dutch ] = "Pagina" ;
                Text [ spanish ] = "Página" ;
                Text [ english_us ] = "Page" ;
                PageResID = TP_PAGE_STD ;
            };*/
            PageItem
            {
                Identifier = TP_BACKGROUND ;
                Text = "Hintergrund" ;
                Text [ ENGLISH ] = "Background" ;
                Text [ norwegian ] = "Background" ;
                Text [ italian ] = "Sfondo" ;
                Text [ portuguese_brazilian ] = "Fundo" ;
                Text [ portuguese ] = "Plano de fundo" ;
                Text [ finnish ] = "Tausta" ;
                Text [ danish ] = "Baggrund" ;
                Text [ french ] = "Arrière-plan" ;
                Text [ swedish ] = "Bakgrund" ;
                Text [ dutch ] = "Achtergrond" ;
                Text [ spanish ] = "Fondo" ;
                Text [ english_us ] = "Background" ;
                PageResID = TP_BACKGROUND ;
                Text[ chinese_simplified ] = "±³¾°";
                Text[ russian ] = "Ôîí";
                Text[ polish ] = "T³o";
                Text[ japanese ] = "”wŒi";
                Text[ chinese_traditional ] = "­I´º";
                Text[ arabic ] = "ÇáÎáÝíÉ";
                Text[ greek ] = "Öüíôï";
                Text[ korean ] = "¹è°æ";
                Text[ turkish ] = "Artalan";
                Text[ language_user1 ] = " ";
            };
            /*            PageItem
            {
                Identifier = TP_BORDER ;
                Text = "Umrandung" ;
                Text [ ENGLISH ] = "Border" ;
                Text [ norwegian ] = "Border" ;
                Text [ italian ] = "Bordo" ;
                Text [ portuguese_brazilian ] = "Borda" ;
                Text [ portuguese ] = "Contorno" ;
                Text [ finnish ] = "Reunaviiva" ;
                Text [ danish ] = "Rækkefølge" ;
                Text [ french ] = "Bordure" ;
                Text [ swedish ] = "Kantlinje" ;
                Text [ dutch ] = "Kader" ;
                Text [ spanish ] = "Borde" ;
                Text [ english_us ] = "Borders" ;
                PageResID = TP_BORDER ;
            };
            PageItem
            {
                Identifier = TP_HEADER_PAGE ;
                Text = "Kopfzeile" ;
                Text [ ENGLISH ] = "Header" ;
                Text [ norwegian ] = "Header" ;
                Text [ italian ] = "Intestazione" ;
                Text [ portuguese_brazilian ] = "Cabeçalho" ;
                Text [ portuguese ] = "Cabeçalho" ;
                Text [ finnish ] = "Yläteksti" ;
                Text [ danish ] = "Toptekst" ;
                Text [ french ] = "En-tête page" ;
                Text [ swedish ] = "Sidhuvud" ;
                Text [ dutch ] = "Koptekst" ;
                Text [ spanish ] = "Línea de encabezamiento" ;
                Text [ english_us ] = "Header" ;
                PageResID = TP_HEADER_PAGE ;
            };
            PageItem
            {
                Identifier = TP_FOOTER_PAGE ;
                Text = "Fußzeile" ;
                Text [ ENGLISH ] = "Footer" ;
                Text [ norwegian ] = "Footer" ;
                Text [ italian ] = "Piè di pagina" ;
                Text [ portuguese_brazilian ] = "Rodapé" ;
                Text [ portuguese ] = "Rodapé" ;
                Text [ finnish ] = "Alateksti" ;
                Text [ danish ] = "Bundtekst" ;
                Text [ french ] = "Pied de page" ;
                Text [ swedish ] = "Sidfot" ;
                Text [ dutch ] = "Voettekst" ;
                Text [ spanish ] = "Pie de página" ;
                Text [ english_us ] = "Footer" ;
                PageResID = TP_FOOTER_PAGE ;
            };
            PageItem
            {
                Identifier = TP_COLUMN ;
                Text = "Spalten" ;
                Text [ ENGLISH ] = "Columns" ;
                Text [ norwegian ] = "Kolonner" ;
                Text [ italian ] = "Colonne" ;
                Text [ portuguese_brazilian ] = "Colunas" ;
                Text [ portuguese ] = "Colunas" ;
                Text [ finnish ] = "Sarakkeet" ;
                Text [ danish ] = "Spalter" ;
                Text [ french ] = "Arrière-plan" ;
                Text [ swedish ] = "Kolumner" ;
                Text [ dutch ] = "Kolommen" ;
                Text [ spanish ] = "Columnas" ;
                Text [ english_us ] = "Columns" ;
                PageResID = TP_COLUMN ;
            };
            PageItem
            {
                Identifier = TP_FOOTNOTE_PAGE ;
                Text = "Fußnote" ;
                Text [ ENGLISH ] = "Footnote" ;
                Text [ norwegian ] = "Footnote" ;
                Text [ italian ] = "Nota a piè di pagina" ;
                Text [ portuguese_brazilian ] = "Nota de pé de página" ;
                Text [ portuguese ] = "Nota de rodapé" ;
                Text [ finnish ] = "Alaviite" ;
                Text [ danish ] = "Fodnote" ;
                Text [ french ] = "Note de bas de page" ;
                Text [ swedish ] = "Fotnot" ;
                Text [ dutch ] = "Voetnoot" ;
                Text [ spanish ] = "Nota al pie de página" ;
                Text [ english_us ] = "Footnote" ;
                PageResID = TP_FOOTNOTE_PAGE ;
            };*/
        };
    };
    Text [ dutch ] = "Pagina-opmaakprofiel" ;
    Text [ italian ] = "Modello di pagina" ;
    Text [ spanish ] = "Estilo de página" ;
    Text [ french ] = "Style de page" ;
    Text [ swedish ] = "Sidformatmall" ;
    Text [ danish ] = "Sidetypografi" ;
    Text [ portuguese ] = "Estilo de página" ;
    Text [ portuguese_brazilian ] = "Seitenvorlage" ;
    Text[ chinese_simplified ] = "Ò³ÃæÑùʽ";
    Text[ russian ] = "Ñòèëü ñòðàíèöû";
    Text[ polish ] = "Styl strony";
    Text[ japanese ] = "Íß°¼Þ½À²Ù";
    Text[ chinese_traditional ] = "­¶­±¼Ë¦¡";
    Text[ arabic ] = "äãØ ÕÝÍÉ";
    Text[ greek ] = "Ðñüôõðï óåëßäáò";
    Text[ korean ] = "ÆäÀÌÁö À¯Çü";
    Text[ turkish ] = "Sayfa biçimi";
    Text[ language_user1 ] = " ";
};
String STR_PAGE_STD
{
    Text = "Seite" ;
    Text [ ENGLISH ] = "Page" ;
    Text [ norwegian ] = "Page" ;
    Text [ italian ] = "Pagina" ;
    Text [ portuguese_brazilian ] = "Página" ;
    Text [ portuguese ] = "Página" ;
    Text [ finnish ] = "Sivu" ;
    Text [ danish ] = "Side" ;
    Text [ french ] = "Page" ;
    Text [ swedish ] = "Sida" ;
    Text [ dutch ] = "Pagina" ;
    Text [ spanish ] = "Página" ;
    Text [ english_us ] = "Page" ;
    Text[ chinese_simplified ] = "ҳ";
    Text[ russian ] = "Ñòðàíèöà";
    Text[ polish ] = "Strona";
    Text[ japanese ] = "Íß°¼Þ";
    Text[ chinese_traditional ] = "­¶";
    Text[ arabic ] = "ÕÝÍÉ";
    Text[ greek ] = "Óåëßäá";
    Text[ korean ] = "ÆäÀÌÁö";
    Text[ turkish ] = "Sayfa";
    Text[ language_user1 ] = " ";
};
String STR_PAGE_BORDER
{
    Text = "Umrandung" ;
    Text [ ENGLISH ] = "Border" ;
    Text [ norwegian ] = "Border" ;
    Text [ italian ] = "Bordo" ;
    Text [ portuguese_brazilian ] = "Borda" ;
    Text [ portuguese ] = "Contornos" ;
    Text [ finnish ] = "Reunaviiva" ;
    Text [ danish ] = "Ramme" ;
    Text [ french ] = "Bordure" ;
    Text [ swedish ] = "Inramning" ;
    Text [ dutch ] = "Omranding" ;
    Text [ spanish ] = "Borde" ;
    Text [ english_us ] = "Borders" ;
    Text[ chinese_simplified ] = "±ß¿ò";
    Text[ russian ] = "Îáðàìëåíèå";
    Text[ polish ] = "Obramowanie";
    Text[ japanese ] = "ŠO˜g";
    Text[ chinese_traditional ] = "Ã䮨";
    Text[ arabic ] = "ÇáÍÏæÏ";
    Text[ greek ] = "Ðåñßãñáììá";
    Text[ korean ] = "Å׵θ®";
    Text[ turkish ] = "Kenarlýk";
    Text[ language_user1 ] = " ";
};
String STR_PAGE_HEADER
{
    Text = "Kopfzeile" ;
    Text [ ENGLISH ] = "Header" ;
    Text [ norwegian ] = "Header" ;
    Text [ italian ] = "Riga d'intestazione" ;
    Text [ portuguese_brazilian ] = "Cabeçalho" ;
    Text [ portuguese ] = "Cabeçalho" ;
    Text [ finnish ] = "Yläteksti" ;
    Text [ danish ] = "Sidehoved" ;
    Text [ french ] = "En-tête" ;
    Text [ swedish ] = "Sidhuvud" ;
    Text [ dutch ] = "Koptekst" ;
    Text [ spanish ] = "Encabezamiento" ;
    Text [ english_us ] = "Header" ;
    Text[ chinese_simplified ] = "ҳü";
    Text[ russian ] = "Âåðõíèé êîëîíòèòóë";
    Text[ polish ] = "Nag³ówek";
    Text[ japanese ] = "ͯÀÞ";
    Text[ chinese_traditional ] = "­¶­º";
    Text[ arabic ] = "ÑÃÓ ÇáÕÝÍÉ";
    Text[ greek ] = "Êåöáëßäá";
    Text[ korean ] = "¸Ó¸®±Û";
    Text[ turkish ] = "Üstbilgi";
    Text[ language_user1 ] = " ";
};
String STR_PAGE_FOOTER
{
    /* ### ACHTUNG: Neuer Text in Resource? Fußzeile : Fu˜zeile */
    Text = "Fußzeile" ;
    Text [ ENGLISH ] = "Footer" ;
    Text [ norwegian ] = "Footer" ;
    Text [ italian ] = "Piè di pagina" ;
    Text [ portuguese_brazilian ] = "Rodapé" ;
    Text [ portuguese ] = "Rodapé" ;
    Text [ finnish ] = "Alateksti" ;
    Text [ danish ] = "Sidefod" ;
    Text [ french ] = "Pied de page" ;
    Text [ swedish ] = "Sidfot" ;
    Text [ dutch ] = "Voettekst" ;
    Text [ spanish ] = "Pie de página" ;
    Text [ english_us ] = "Footer" ;
    Text[ chinese_simplified ] = "Ò³½Å";
    Text[ russian ] = "Íèæíèé êîëîíòèòóë";
    Text[ polish ] = "Stopka";
    Text[ japanese ] = "̯À";
    Text[ chinese_traditional ] = "­¶¸}";
    Text[ arabic ] = "ÊÐííá ÇáÕÝÍÉ";
    Text[ greek ] = "ÕðïóÝëéäï";
    Text[ korean ] = "¹Ù´Ú±Û";
    Text[ turkish ] = "Altbilgi";
    Text[ language_user1 ] = " ";
};
String STR_PAGE_COLUMN
{
    Text = "Spalten" ;
    Text [ ENGLISH ] = "Columns" ;
    Text [ norwegian ] = "Kolonner" ;
    Text [ italian ] = "Colonne" ;
    Text [ portuguese_brazilian ] = "Colunas" ;
    Text [ portuguese ] = "Colunas" ;
    Text [ finnish ] = "Sarakkeet" ;
    Text [ danish ] = "Kolonner" ;
    Text [ french ] = "Colonnes" ;
    Text [ swedish ] = "Kolumner" ;
    Text [ dutch ] = "Kolommen" ;
    Text [ spanish ] = "Columnas" ;
    Text [ english_us ] = "Columns" ;
    Text[ chinese_simplified ] = "À¸";
    Text[ russian ] = "Êîëîíêè";
    Text[ polish ] = "Kolumny";
    Text[ japanese ] = "’i‘g‚Ý";
    Text[ chinese_traditional ] = "Äæ";
    Text[ arabic ] = "ÇáÃÚãÏÉ";
    Text[ greek ] = "ÓôÞëåò";
    Text[ korean ] = "¿­";
    Text[ turkish ] = "Sütun";
    Text[ language_user1 ] = " ";
};
String STR_PAGE_FOOTNOTE
{
    /* ### ACHTUNG: Neuer Text in Resource? Fußnote : Fu˜note */
    Text = "Fußnote" ;
    Text [ ENGLISH ] = "Footnote" ;
    Text [ norwegian ] = "Footnote" ;
    Text [ italian ] = "Nota a piè pagina" ;
    Text [ portuguese_brazilian ] = "Nota de pé de página" ;
    Text [ portuguese ] = "Nota de rodapé" ;
    Text [ finnish ] = "Alaviite" ;
    Text [ danish ] = "Fodnote" ;
    Text [ french ] = "Note de bas de page" ;
    Text [ swedish ] = "Fotnot" ;
    Text [ dutch ] = "Voetnoot" ;
    Text [ spanish ] = "Nota al pie" ;
    Text [ english_us ] = "Footnote" ;
    Text[ chinese_simplified ] = "×¢½Å";
    Text[ russian ] = "Ñíîñêà";
    Text[ polish ] = "Przypis dolny";
    Text[ japanese ] = "‹r’";
    Text[ chinese_traditional ] = "µù¸}";
    Text[ arabic ] = "ÍÇÔíÉ ÓÝáíÉ";
    Text[ greek ] = "Õðïóçìåßùóç";
    Text[ korean ] = "°¢ÁÖ";
    Text[ turkish ] = "Dipnot";
    Text[ language_user1 ] = " ";
};
TabDialog DLG_TEMPLATE_3
{
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Text = "Rahmenvorlage" ;
    Text [ ENGLISH ] = "Frame Style" ;
     // Text[norwegian_wrong] = "Rammemaler";
     // Text[italian_wrong] = "Stili cornice";
     // Text[portuguese_brazilian_wrong] = "Estilos de Moldura";
     // Text[portuguese_wrong] = "Estilos de Moldura";
     // Text[finnish_wrong] = "Kehystyylit";
     // Text[danish_wrong] = "Rammelayout";
     // Text[french_wrong] = "Styles d'encadrement";
     // Text[swedish_wrong] = "Ramformat";
     // Text[dutch_wrong] = "Kaderopmaakprofielen";
     // Text[spanish_wrong] = "Estilos de marco";
    Text [ english_us ] = "Frame Style" ;
    Moveable = TRUE ;
    TabControl 1
    {
        OutputSize = TRUE ;
        PageList =
        {
            PageItem
            {
                Identifier = TP_FRM_STD ;
                Text = "Typ" ;
                Text [ ENGLISH ] = "Type" ;
                Text [ norwegian ] = "Type" ;
                Text [ italian ] = "Tipo" ;
                Text [ portuguese_brazilian ] = "Tipo" ;
                Text [ portuguese ] = "Tipo" ;
                Text [ finnish ] = "Laji" ;
                Text [ danish ] = "Type" ;
                Text [ french ] = "Type" ;
                Text [ swedish ] = "Typ" ;
                Text [ dutch ] = "Type" ;
                Text [ spanish ] = "Tipo" ;
                Text [ english_us ] = "Type" ;
                PageResID = TP_FRM_STD ;
                Text[ chinese_simplified ] = "ÀàÐÍ";
                Text[ russian ] = "Òèï";
                Text[ polish ] = "Typ";
                Text[ japanese ] = "Ží—Þ";
                Text[ chinese_traditional ] = "Ãþ«¬";
                Text[ arabic ] = "ÇáäæÚ";
                Text[ greek ] = "Ôýðïò";
                Text[ korean ] = "ÇüÅÂ";
                Text[ turkish ] = "Tip";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_FRM_ADD ;
                PageResID = TP_FRM_ADD ;
                /* ### ACHTUNG: Neuer Text in Resource? Zusätze : Zusõtze */
                Text = "Zusätze" ;
                Text [ ENGLISH ] = "Additions" ;
                Text [ english_us ] = "Options" ;
                Text [ italian ] = "Extra" ;
                Text [ spanish ] = "Opciones" ;
                Text [ french ] = "Options" ;
                Text [ dutch ] = "Overige" ;
                Text [ swedish ] = "Tillägg" ;
                Text [ danish ] = "Flere" ;
                Text [ portuguese_brazilian ] = "Zusätze" ;
                Text [ portuguese ] = "Opções" ;
                Text[ chinese_simplified ] = "ÆäËü";
                Text[ russian ] = "Ïàðàìåòðû";
                Text[ polish ] = "Dodatki";
                Text[ japanese ] = "µÌß¼®Ý";
                Text[ chinese_traditional ] = "¨ä¥¦";
                Text[ arabic ] = "ÎíÇÑÇÊ";
                Text[ greek ] = "Ðñüóèåôá";
                Text[ korean ] = "¿É¼Ç";
                Text[ turkish ] = "Seçenekler";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_FRM_WRAP ;
                Text = "Umlauf" ;
                Text [ ENGLISH ] = "Wrap" ;
                Text [ norwegian ] = "Wrap" ;
                Text [ italian ] = "Scorrimento" ;
                Text [ portuguese_brazilian ] = "Circundamento" ;
                Text [ portuguese ] = "Ajuste" ;
                Text [ finnish ] = "Kierrätys" ;
                Text [ danish ] = "Ombrydning" ;
                Text [ french ] = "Adaptation du texte" ;
                Text [ swedish ] = "Textanpassning" ;
                Text [ dutch ] = "Om beeld" ;
                Text [ spanish ] = "Ajuste" ;
                Text [ english_us ] = "Wrap" ;
                PageResID = TP_FRM_WRAP ;
                Text[ chinese_simplified ] = "»·ÈÆ";
                Text[ russian ] = "Îáòåêàíèå";
                Text[ polish ] = "Obieg tekstu";
                Text[ japanese ] = "Ü‚è•Ô‚µ";
                Text[ chinese_traditional ] = "´«¦æ";
                Text[ arabic ] = "ÇáÊÝÇÝ";
                Text[ greek ] = "Áíáäßðëùóç";
                Text[ korean ] = "¼øÈ¯";
                Text[ turkish ] = "Metin daðýlýmý";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_BACKGROUND ;
                Text = "Hintergrund" ;
                Text [ ENGLISH ] = "Background" ;
                Text [ norwegian ] = "Background" ;
                Text [ italian ] = "Sfondo" ;
                Text [ portuguese_brazilian ] = "Fundo" ;
                Text [ portuguese ] = "Plano de fundo" ;
                Text [ finnish ] = "Tausta" ;
                Text [ danish ] = "Baggrund" ;
                Text [ french ] = "Arrière-plan" ;
                Text [ swedish ] = "Bakgrund" ;
                Text [ dutch ] = "Achtergrond" ;
                Text [ spanish ] = "Fondo" ;
                Text [ english_us ] = "Background" ;
                PageResID = TP_BACKGROUND ;
                Text[ chinese_simplified ] = "±³¾°";
                Text[ russian ] = "Ôîí";
                Text[ polish ] = "T³o";
                Text[ japanese ] = "”wŒi";
                Text[ chinese_traditional ] = "­I´º";
                Text[ arabic ] = "ÇáÎáÝíÉ";
                Text[ greek ] = "Öüíôï";
                Text[ korean ] = "¹è°æ";
                Text[ turkish ] = "Artalan";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_BORDER ;
                Text = "Umrandung" ;
                Text [ ENGLISH ] = "Border" ;
                Text [ norwegian ] = "Border" ;
                Text [ italian ] = "Bordo" ;
                Text [ portuguese_brazilian ] = "Borda" ;
                Text [ portuguese ] = "Contornos" ;
                Text [ finnish ] = "Reunaviiva" ;
                Text [ danish ] = "Ramme" ;
                Text [ french ] = "Bordure" ;
                Text [ swedish ] = "Inramning" ;
                Text [ dutch ] = "Omranding" ;
                Text [ spanish ] = "Borde" ;
                Text [ english_us ] = "Borders" ;
                PageResID = TP_BORDER ;
                Text[ chinese_simplified ] = "±ß¿ò";
                Text[ russian ] = "Îáðàìëåíèå";
                Text[ polish ] = "Obramowanie";
                Text[ japanese ] = "ŠO˜g";
                Text[ chinese_traditional ] = "Ã䮨";
                Text[ arabic ] = "ÇáÍÏæÏ";
                Text[ greek ] = "Ðåñßãñáììá";
                Text[ korean ] = "Å׵θ®";
                Text[ turkish ] = "Kenarlýk";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_COLUMN ;
                Text = "Spalten" ;
                Text [ ENGLISH ] = "Columns" ;
                Text [ norwegian ] = "Kolonner" ;
                Text [ italian ] = "Colonne" ;
                Text [ portuguese_brazilian ] = "Colunas" ;
                Text [ portuguese ] = "Colunas" ;
                Text [ finnish ] = "Sarakkeet" ;
                Text [ danish ] = "Kolonner" ;
                Text [ french ] = "Colonnes" ;
                Text [ swedish ] = "Kolumner" ;
                Text [ dutch ] = "Kolommen" ;
                Text [ spanish ] = "Columnas" ;
                Text [ english_us ] = "Columns" ;
                PageResID = TP_COLUMN ;
                Text[ chinese_simplified ] = "À¸";
                Text[ russian ] = "Êîëîíêè";
                Text[ polish ] = "Kolumny";
                Text[ japanese ] = "’i‘g‚Ý";
                Text[ chinese_traditional ] = "Äæ";
                Text[ arabic ] = "ÇáÃÚãÏÉ";
                Text[ greek ] = "ÓôÞëåò";
                Text[ korean ] = "¿­";
                Text[ turkish ] = "Sütun";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_MACRO_ASSIGN ;
                Text = "Makro" ;
                Text [ ENGLISH ] = "Macro" ;
                Text [ english_us ] = "Macro" ;
                Text [ italian ] = "Macro" ;
                Text [ spanish ] = "Macro" ;
                Text [ french ] = "Macro" ;
                Text [ dutch ] = "Macro" ;
                Text [ swedish ] = "Makro" ;
                Text [ danish ] = "Makro" ;
                Text [ portuguese_brazilian ] = "Makro" ;
                Text [ portuguese ] = "Macro" ;
                Text[ chinese_simplified ] = "ºê";
                Text[ russian ] = "Ìàêðîñ";
                Text[ polish ] = "Makro";
                Text[ japanese ] = "ϸÛ";
                Text[ chinese_traditional ] = "¥¨¶°";
                Text[ arabic ] = "ãÇßÑæ";
                Text[ greek ] = "ÌáêñïåíôïëÞ";
                Text[ korean ] = "¸ÅÅ©·Î";
                Text[ turkish ] = "Makro";
                Text[ language_user1 ] = " ";
            };
        };
    };
    Text [ italian ] = "Modello di cornice" ;
    Text [ spanish ] = "Estilo de marcos" ;
    Text [ french ] = "Style de cadre" ;
    Text [ dutch ] = "Kaderopmaakprofiel" ;
    Text [ swedish ] = "Ramformatmall" ;
    Text [ danish ] = "Rammetypografi" ;
    Text [ portuguese ] = "Estilo de moldura" ;
    Text [ portuguese_brazilian ] = "Rahmenvorlage" ;
    Text[ chinese_simplified ] = "¿òÑùʽ";
    Text[ russian ] = "Ñòèëü ðàìêè";
    Text[ polish ] = "Styl ramki";
    Text[ japanese ] = "˜g½À²Ù";
    Text[ chinese_traditional ] = "®Ø¼Ë¦¡";
    Text[ arabic ] = "äãØ ÅØÇÑ";
    Text[ greek ] = "Óôõë ðëáéóßïõ";
    Text[ korean ] = "ÇÁ·¹ÀÓ À¯Çü";
    Text[ turkish ] = "Çerçeve biçimi";
    Text[ language_user1 ] = " ";
};
TabDialog DLG_TEMPLATE_5
{
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Text = "Nummerierungsvorlage" ;
    Text [ ENGLISH ] = "Number Style" ;
    Moveable = TRUE ;
    TabControl 1
    {
        PageList =
        {
            PageItem
            {
                Identifier = RID_SVXPAGE_PICK_BULLET ;
                Text = "Bullets" ;
                Text [ ENGLISH ] = "Bullets" ;
                Text [ english_us ] = "Bullets" ;
                Text [ portuguese_brazilian ] = "Bullets" ;
                Text [ swedish ] = "Bullets" ;
                Text [ danish ] = "Punkttegn" ;
                Text [ italian ] = "Punti" ;
                Text [ spanish ] = "Viñetas" ;
                Text [ french ] = "Puces" ;
                Text [ dutch ] = "Opsommingstekens" ;
                Text [ portuguese ] = "Marcas" ;
                Text[ chinese_simplified ] = "ÏîÄ¿±àºÅ";
                Text[ russian ] = "Ìàðêåðû";
                Text[ polish ] = "Wypunktowanie";
                Text[ japanese ] = "‰Óð‘‚«";
                Text[ chinese_traditional ] = "¶µ¥Ø½s¸¹";
                Text[ arabic ] = "ÚáÇãÇÊ ÊÚÏÇÏ";
                Text[ greek ] = "Êïõêßäåò";
                Text[ korean ] = "±Û¸Ó¸® ±âÈ£";
                Text[ turkish ] = "Madde iþareti";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = RID_SVXPAGE_PICK_SINGLE_NUM;
                Text = "Nummerierungsart" ;
                Text [ ENGLISH ] = "Digits" ;
                Text [ english_us ] = "Numbering Style" ;
                Text [ portuguese_brazilian ] = "Numerierungsart" ;
                Text [ swedish ] = "Numreringstyp" ;
                Text [ danish ] = "Nummereringstype" ;
                Text [ italian ] = "Tipo numerazione" ;
                Text [ spanish ] = "Tipo de numeración" ;
                Text [ french ] = "Type de numérotation" ;
                Text [ dutch ] = "Nummeringstijl" ;
                Text [ portuguese ] = "Tipo de numeração" ;
                Text[ chinese_simplified ] = "±àºÅÀàÐÍ";
                Text[ russian ] = "Òèï íóìåðàöèè";
                Text[ polish ] = "Rodzaj numeracji";
                Text[ japanese ] = "”ԍ†•t‚¯‚ÌŽí—Þ";
                Text[ chinese_traditional ] = "½s¸¹Ãþ«¬";
                Text[ arabic ] = "ØÑíÞÉ ÇáÊÑÞíã";
                Text[ language_user1 ] = "MS Word, KeyID23136";
                Text[ greek ] = "Óôõë áñßèìçóçò";
                Text[ korean ] = "¹øÈ£¸Å±â±â À¯Çü";
                Text[ turkish ] = "Numaralama türü";
            };
            PageItem
            {
                Identifier = RID_SVXPAGE_PICK_NUM ;
                Text = "Gliederung" ;
                Text [ ENGLISH ] = "Outline" ;
                Text [ english_us ] = "Outline" ;
                Text [ portuguese_brazilian ] = "Gliederung" ;
                Text [ swedish ] = "Disposition" ;
                Text [ danish ] = "Disposition" ;
                Text [ italian ] = "Struttura" ;
                Text [ spanish ] = "Esquema" ;
                Text [ french ] = "Plan" ;
                Text [ dutch ] = "Overzicht" ;
                Text [ portuguese ] = "Esquema" ;
                Text[ chinese_simplified ] = "´ó¸Ù";
                Text[ russian ] = "Ñòðóêòóðà";
                Text[ polish ] = "Konspekt";
                Text[ japanese ] = "±³ÄײÝ";
                Text[ chinese_traditional ] = "¤jºõ";
                Text[ arabic ] = "ÊÞÓíã";
                Text[ greek ] = "ÄéÜñèñùóç";
                Text[ korean ] = "°³¿ä";
                Text[ turkish ] = "Anahat";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = RID_SVXPAGE_PICK_BMP;
                Text = "Grafiken" ;
                Text [ ENGLISH ] = "Images" ;
                Text [ english_us ] = "Graphics" ;
                Text [ portuguese_brazilian ] = "Grafiken" ;
                Text [ swedish ] = "Grafiker" ;
                Text [ danish ] = "Billeder" ;
                Text [ italian ] = "Immagini" ;
                Text [ spanish ] = "Imágenes" ;
                Text [ french ] = "Images" ;
                Text [ dutch ] = "Afbeeldingen" ;
                Text [ portuguese ] = "Imagens" ;
                Text[ chinese_simplified ] = "ͼÐÎ";
                Text[ russian ] = "Ðèñóíêè";
                Text[ polish ] = "Grafiki";
                Text[ japanese ] = "}";
                Text[ chinese_traditional ] = "¹Ï¤ù";
                Text[ arabic ] = "ÕæÑ";
                Text[ greek ] = "ÃñáöéêÜ";
                Text[ korean ] = "±×·¡ÇÈ";
                Text[ turkish ] = "Grafik";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = RID_SVXPAGE_NUM_POSITION ;
                Text = "Position" ;
                Text [ ENGLISH ] = "Position" ;
                Text [ english_us ] = "Position" ;
                Text [ portuguese_brazilian ] = "Position" ;
                Text [ swedish ] = "Position" ;
                Text [ danish ] = "Placering" ;
                Text [ italian ] = "Posizione" ;
                Text [ spanish ] = "Posición" ;
                Text [ french ] = "Position" ;
                Text [ dutch ] = "Positie" ;
                Text [ portuguese ] = "Posição" ;
                Text[ chinese_simplified ] = "λÖÃ";
                Text[ russian ] = "Ïîçèöèÿ";
                Text[ polish ] = "Pozycja";
                Text[ japanese ] = "ˆÊ’u";
                Text[ chinese_traditional ] = "¦ì¸m";
                Text[ arabic ] = "ÇáãæÖÚ";
                Text[ greek ] = "ÈÝóç";
                Text[ korean ] = "À§Ä¡";
                Text[ turkish ] = "Konum";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = RID_SVXPAGE_NUM_OPTIONS;
                Text = "~Optionen" ;
                Text [ ENGLISH ] = "Customize" ;
                Text [ portuguese ] = "~Opções" ;
                Text [ english_us ] = "Options" ;
                Text [ portuguese_brazilian ] = "~Optionen" ;
                Text [ swedish ] = "Alternativ" ;
                Text [ danish ] = "Indstillinger" ;
                Text [ italian ] = "Opzioni" ;
                Text [ spanish ] = "~Opciones" ;
                Text [ french ] = "~Options" ;
                Text [ dutch ] = "~Opties" ;
                Text[ chinese_simplified ] = "Ñ¡Ïî";
                Text[ russian ] = "Ïàðàìåòðû";
                Text[ polish ] = "Opcje";
                Text[ japanese ] = "µÌß¼®Ý";
                Text[ language_user1 ] = "KW:Tilde entfernen falls noch vorhanden";
                Text[ chinese_traditional ] = "¿ï¶µ";
                Text[ arabic ] = "ÎíÇÑÇÊ";
                Text[ greek ] = "ÅðéëïãÝò";
                Text[ korean ] = "¿É¼Ç";
                Text[ turkish ] = "Seçenekler";
            };
        };
    };
    Text [ portuguese ] = "Estilo de numeração" ;
    Text [ english_us ] = "Numbering Style" ;
    Text [ portuguese_brazilian ] = "Numerierungsvorlage" ;
    Text [ swedish ] = "Numreringsformatmall" ;
    Text [ danish ] = "Nummereringstypografi" ;
    Text [ italian ] = "Modello di numerazione" ;
    Text [ spanish ] = "Estilo de numeración" ;
    Text [ french ] = "Style de numérotation" ;
    Text [ dutch ] = "Opmaakprofiel voor nummering" ;
    Text[ chinese_simplified ] = "±àºÅÑùʽ";
    Text[ russian ] = "Ñòèëü íóìåðàöèè";
    Text[ polish ] = "Styl numeracji";
    Text[ japanese ] = "”ԍ†•t‚¯½À²Ù";
    Text[ chinese_traditional ] = "½s¸¹¼Ë¦¡";
    Text[ arabic ] = "äãØ ÊÑÞíã";
    Text[ greek ] = "Ðñüôõðï áñßèìçóçò";
    Text[ korean ] = "¹øÈ£ ¸Å±â±â";
    Text[ turkish ] = "Numaralama biçimi";
    Text[ language_user1 ] = " ";
};
diff --git a/sw/source/ui/frmdlg/colex.cxx b/sw/source/ui/frmdlg/colex.cxx
new file mode 100644
index 0000000..514f671
--- /dev/null
+++ b/sw/source/ui/frmdlg/colex.cxx
@@ -0,0 +1,514 @@
/*************************************************************************
 *
 *  $RCSfile: colex.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:37 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "cmdid.h"
#include "hintids.hxx"
#include "uiparam.hxx"


#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _SVX_SIZEITEM_HXX //autogen
#include <svx/sizeitem.hxx>
#endif
#ifndef _SVX_PAGEITEM_HXX //autogen
#include <svx/pageitem.hxx>
#endif

#include "colex.hxx"
#include "colmgr.hxx"


/*-----------------------------------------------------------------------
    Beschreibung: Uebernahme der aktualisierten Werte aus dem Set
 -----------------------------------------------------------------------*/


void SwColExample::UpdateExample( const SfxItemSet& rSet, SwColMgr* pMgr )
{
    pColMgr = pMgr;
    const SvxPageItem* pPage = 0;
    SfxItemPool* pPool = rSet.GetPool();
    USHORT nWhich = pPool->GetWhich( SID_ATTR_PAGE );

    if ( rSet.GetItemState( nWhich, FALSE ) == SFX_ITEM_SET )
    {
        // Ausrichtung
        pPage = (const SvxPageItem*)&rSet.Get( nWhich );

        if ( pPage )
            SetUsage( pPage->GetPageUsage() );
    }

    nWhich = pPool->GetWhich( SID_ATTR_PAGE_SIZE );

    if ( rSet.GetItemState( nWhich, FALSE ) == SFX_ITEM_SET )
    {
        // Orientation und Size aus dem PageItem
        const SvxSizeItem& rSize = (const SvxSizeItem&)rSet.Get( nWhich );
        Size aSize( rSize.GetSize() );
        SetSize( aSize );
    }
    nWhich = RES_LR_SPACE;
    if ( rSet.GetItemState( nWhich, FALSE ) == SFX_ITEM_SET )
    {
        // linken und rechten Rand einstellen
        const SvxLRSpaceItem& rLRSpace = (const SvxLRSpaceItem&)rSet.Get( nWhich );

        SetLeft( rLRSpace.GetLeft() );
        SetRight( rLRSpace.GetRight() );
    }
    else
    {
        SetLeft( 0 );
        SetRight( 0 );
    }

    nWhich = RES_UL_SPACE;

    if ( rSet.GetItemState( nWhich, FALSE ) == SFX_ITEM_SET )
    {
        // oberen und unteren Rand einstellen
        const SvxULSpaceItem& rULSpace = (const SvxULSpaceItem&)rSet.Get( nWhich );

        SetTop( rULSpace.GetUpper() );
        SetBottom( rULSpace.GetLower() );
    }
    else
    {
        SetTop( 0 );
        SetBottom( 0 );
    }


    // Kopfzeilen-Attribute auswerten
    const SfxPoolItem* pItem;
    if( SFX_ITEM_SET == rSet.GetItemState( pPool->GetWhich( SID_ATTR_PAGE_HEADERSET),
            FALSE, &pItem ) )
    {
        const SfxItemSet& rHeaderSet = ((SvxSetItem*)pItem)->GetItemSet();
        const SfxBoolItem& rHeaderOn =
            (const SfxBoolItem&)rHeaderSet.Get( pPool->GetWhich( SID_ATTR_PAGE_ON ) );

        if ( rHeaderOn.GetValue() )
        {
            const SvxSizeItem& rSize =
                (const SvxSizeItem&)rHeaderSet.Get(pPool->GetWhich(SID_ATTR_PAGE_SIZE));

            const SvxULSpaceItem& rUL = (const SvxULSpaceItem&)rHeaderSet.Get(
                                        pPool->GetWhich(SID_ATTR_ULSPACE));
            const SvxLRSpaceItem& rLR = (const SvxLRSpaceItem&)rHeaderSet.Get(
                                        pPool->GetWhich(SID_ATTR_LRSPACE));

            SetHdHeight( rSize.GetSize().Height() - rUL.GetLower());
            SetHdDist( rUL.GetLower() );
            SetHdLeft( rLR.GetLeft() );
            SetHdRight( rLR.GetRight() );
            SetHeader( TRUE );
        }
        else
            SetHeader( FALSE );
    }

    if( SFX_ITEM_SET == rSet.GetItemState( pPool->GetWhich( SID_ATTR_PAGE_FOOTERSET),
            FALSE, &pItem ) )
    {
        const SfxItemSet& rFooterSet = ((SvxSetItem*)pItem)->GetItemSet();
        const SfxBoolItem& rFooterOn =
            (const SfxBoolItem&)rFooterSet.Get( SID_ATTR_PAGE_ON );

        if ( rFooterOn.GetValue() )
        {
            const SvxSizeItem& rSize =
                (const SvxSizeItem&)rFooterSet.Get( pPool->GetWhich( SID_ATTR_PAGE_SIZE ) );

            const SvxULSpaceItem& rUL = (const SvxULSpaceItem&)rFooterSet.Get(
                                        pPool->GetWhich( SID_ATTR_ULSPACE ) );
            const SvxLRSpaceItem& rLR = (const SvxLRSpaceItem&)rFooterSet.Get(
                                        pPool->GetWhich( SID_ATTR_LRSPACE ) );

            SetFtHeight( rSize.GetSize().Height() - rUL.GetUpper());
            SetFtDist( rUL.GetUpper() );
            SetFtLeft( rLR.GetLeft() );
            SetFtRight( rLR.GetRight() );
            SetFooter( TRUE );
        }
        else
            SetFooter( FALSE );
    }

    Invalidate();
}
/*-----------------------------------------------------------------------
    Beschreibung:
 -----------------------------------------------------------------------*/


void SwColExample::DrawPage( const Point& rOrg,
                            const BOOL bSecond,
                            const BOOL bEnabled )
{
    SvxPageWindow::DrawPage( rOrg, bSecond, bEnabled );
    if( pColMgr && pColMgr->GetCount() >1 )
    {
//      SetPen( Pen( PEN_DOT ) );

        long nL = GetLeft();
        long nR = GetRight();

        if ( GetUsage() == SVX_PAGE_MIRROR && !bSecond )
        {
            // fuer gespiegelt drehen
            nL = GetRight();
            nR = GetLeft();
        }

        SetFillColor( Color( COL_LIGHTGRAY ) );
        Rectangle aRect;
        aRect.Right() = rOrg.X() + GetSize().Width() - nR;
        aRect.Left()  = rOrg.X() + nL;
        aRect.Top()   = rOrg.Y() + GetTop()
                        + GetHdHeight() + GetHdDist();
        aRect.Bottom()= rOrg.Y() + GetSize().Height() - GetBottom()
                        - GetFtHeight() - GetFtDist();
        DrawRect(aRect);

        SetFillColor( Color( COL_WHITE ) );
        USHORT nColumnCount = pColMgr->GetCount();
        for(USHORT i = 0; i < nColumnCount; i++)
        {
            aRect.Right() = aRect.Left() + pColMgr->GetColWidth( i );
            DrawRect(aRect);
            if(i < nColumnCount - 1)
                aRect.Left() = aRect.Right() + pColMgr->GetGutterWidth(i);
        }
        if(pColMgr->HasLine())
        {
//          SetPen( Pen ( PEN_SOLID ) );
            Point aUp( rOrg.X() + nL, rOrg.Y() + GetTop() );
            Point aDown( rOrg.X() + nL, rOrg.Y() + GetSize().Height()
                        - GetBottom() - GetFtHeight() - GetFtDist() );

            if( pColMgr->GetLineHeightPercent() != 100 )
            {
                long nLength = aDown.Y() - aUp.Y();
                nLength -= nLength * pColMgr->GetLineHeightPercent() / 100;
                switch(pColMgr->GetAdjust())
                {
                    case COLADJ_BOTTOM: aUp.Y() += nLength; break;
                    case COLADJ_TOP: aDown.Y() -= nLength; break;
                    case COLADJ_CENTER:
                          aUp.Y() += nLength / 2;
                          aDown.Y() -= nLength / 2;
                    break;
                }
            }

            int nDist;
            for( i = 0; i < nColumnCount -  1; i++)
            {
                int nGutter = pColMgr->GetGutterWidth(i);
                nDist = pColMgr->GetColWidth( i ) + nGutter;
                nDist -= (i == 0) ?
                    nGutter/2 :
                        0;
                aUp.X() += nDist;
                aDown.X() += nDist;
                DrawLine( aUp, aDown );

            }
        }
    }
}



SwColExample::SwColExample(Window* pPar, const ResId& rResId ) :
                                SvxPageWindow(pPar, rResId )
{
    SetSize(Size(11907, 16433));// DIN A4
}

/*-----------------25.10.96 09.15-------------------

--------------------------------------------------*/


SwColumnOnlyExample::SwColumnOnlyExample( Window* pParent, const ResId& rResId) :
    Window(pParent, rResId),
    aFrmSize(1,1),
    nDistance(0)
{
    SetMapMode( MapMode( MAP_TWIP ) );
    aWinSize = GetOutputSizePixel();
    aWinSize.Height() -= 4;
    aWinSize.Width() -= 4;

    aWinSize = PixelToLogic( aWinSize );

}

/*-----------------25.10.96 09.16-------------------

--------------------------------------------------*/


void SwColumnOnlyExample::Paint( const Rectangle& rRect )
{
//      Pen aSolidPen(PEN_SOLID);
        long nWidth = aFrmSize.Width();
        long nHeight = aFrmSize.Height();
        Fraction aXScale( aWinSize.Width(),
                            max( nWidth + nWidth / 8, 1 ) );
        Fraction aYScale( aWinSize.Height(), max( nHeight, 1 ) );
        MapMode aMapMode( GetMapMode() );
        aMapMode.SetScaleX( aXScale );
        aMapMode.SetScaleY( aYScale );
        SetMapMode( aMapMode );

        Size aLogSize(PixelToLogic(GetOutputSizePixel()));
        Point aTL(  (aLogSize.Width() - aFrmSize.Width()) / 2,
                    (aLogSize.Height() - aFrmSize.Height()) / 2);
        Rectangle aRect(aTL, aFrmSize);

        SetFillColor( Color( COL_WHITE ) );
//      SetPen(aSolidPen);
        DrawRect(aRect);

        Size aInside(aFrmSize.Width() - nDistance, aFrmSize.Height() - nDistance);
        long nDist2 = nDistance / 2;
        aTL.X() += nDist2;
        aTL.Y() += nDist2;
        Rectangle aInsRect(aTL, aInside);
        DrawRect(aInsRect);

        SetFillColor(Color( COL_LIGHTGRAY ) );

        //Spaltentrenner?
        long nLength = aLogSize.Height() - 2 * aTL.Y();
        Point aUp( aTL );
        Point aDown( aTL.X(), nLength );
        BOOL bLines = FALSE;
        if(aCols.GetLineAdj() != COLADJ_NONE)
        {
            bLines = TRUE;

            USHORT nPercent = aCols.GetLineHeight();
            if( nPercent != 100 )
            {
                nLength -= nLength * nPercent / 100;
                switch(aCols.GetLineAdj())
                {
                    case COLADJ_BOTTOM: aUp.Y() += nLength; break;
                    case COLADJ_TOP: aDown.Y() -= nLength; break;
                    case COLADJ_CENTER:
                          aUp.Y() += nLength / 2;
                          aDown.Y() -= nLength / 2;
                    break;
                }
            }

        }

        const SwColumns& rCols = aCols.GetColumns();
        USHORT nColCount = rCols.Count();
//      SetPen(Pen(PEN_DOT));
        if( !nColCount)
            DrawRect(aRect);
        else
        {
            Rectangle aFrmRect(aTL, aInside);
            long nSum = aTL.X();
            for(USHORT i = 0; i < nColCount; i++)
            {
                SwColumn* pCol = rCols[i];
                aFrmRect.Left()    = nSum + pCol->GetLeft();//nSum + pCol->GetLeft() + aTL.X();
                nSum              += pCol->GetWishWidth();
                aFrmRect.Right()   = nSum - pCol->GetRight();
                DrawRect(aFrmRect);
            }
//          SetPen( aSolidPen );
            if(bLines )
            {
                nSum = aTL.X();
                for(USHORT i = 0; i < nColCount - 1; i++)
                {
                    nSum += rCols[i]->GetWishWidth();
                    aUp.X() = nSum;
                    aDown.X() = nSum;
                    DrawLine(aUp, aDown);
                }
            }
        }
}

/*-----------------25.10.96 12.05-------------------

--------------------------------------------------*/


void SwColumnOnlyExample::SetFrameSize(const Size& rS, long nDist)
{
    aFrmSize  = rS;
    nDistance = 2 * nDist;
    ::FitToActualSize(aCols, (USHORT)aFrmSize.Width());
}

/*-----------------25.02.94 21:22-------------------
   $Log: not supported by cvs2svn $
   Revision 1.26  2000/09/18 16:05:32  willem.vandorp
   OpenOffice header added.

   Revision 1.25  2000/03/03 15:17:01  os
   StarView remainders removed

   Revision 1.24  1998/04/28 09:28:32  OS
   Abstand nur fuer existierende Spalten erfragen


      Rev 1.23   28 Apr 1998 11:28:32   OS
   Abstand nur fuer existierende Spalten erfragen

      Rev 1.22   16 Apr 1998 13:09:28   OS
   Spaltenabstand fuer Seitenbeispiel richtig #49516#

      Rev 1.21   28 Nov 1997 19:40:38   MA
   includes

      Rev 1.20   24 Nov 1997 17:40:12   MA
   include

      Rev 1.19   03 Nov 1997 13:19:44   MA
   precomp entfernt

      Rev 1.18   15 Aug 1997 12:15:24   OS
   chartar/frmatr/txtatr aufgeteilt

      Rev 1.17   12 Aug 1997 15:58:08   OS
   frmitems/textitem/paraitem aufgeteilt

      Rev 1.16   07 Aug 1997 14:59:08   OM
   Headerfile-Umstellung

      Rev 1.15   23 Apr 1997 11:08:48   OS
   ResId const

      Rev 1.14   21 Nov 1996 11:53:34   OS
   Umrandungsabstand mit anzeigen

      Rev 1.13   08 Nov 1996 14:07:54   OS
   ohne Spalten mit richtigem Hintergrund painten

      Rev 1.12   25 Oct 1996 14:56:56   OS
   neues Spaltenbeispiel ohne Seite

      Rev 1.11   28 Aug 1996 11:52:54   OS
   includes

      Rev 1.10   27 Mar 1996 16:02:56   OS
   Hoehe Kopf-/Fusszeilen richtig einstellen

      Rev 1.9   22 Mar 1996 14:20:58   MH
   add: include pageitem.hxx

      Rev 1.8   24 Nov 1995 16:58:10   OM
   PCH->PRECOMPILED

      Rev 1.7   21 Nov 1995 08:16:04   OS
   +pragma

      Rev 1.6   21 Nov 1995 08:00:48   OS
   Itemsate auf _SET pruefen, Seitengroesse init.

      Rev 1.5   17 Oct 1995 15:00:08   MA
   fix: SEXPORT'iert

      Rev 1.4   22 Aug 1995 09:10:02   MA
   svxitems-header entfernt

      Rev 1.3   07 Aug 1995 18:51:24   OS
   Trennlinien mit einzeichnen

      Rev 1.2   02 Aug 1995 17:47:50   OS
   Seitenspaltenbeispiel implementiert

      Rev 1.1   11 Jul 1995 15:42:06   OS
   Beispielfenster jetzt vom SvxPageWindow abgeleitet

      Rev 1.0   20 Apr 1995 17:38:02   OS
   Initial revision.

--------------------------------------------------*/


diff --git a/sw/source/ui/frmdlg/colmgr.cxx b/sw/source/ui/frmdlg/colmgr.cxx
new file mode 100644
index 0000000..b9ef839
--- /dev/null
+++ b/sw/source/ui/frmdlg/colmgr.cxx
@@ -0,0 +1,289 @@
/*************************************************************************
 *
 *  $RCSfile: colmgr.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:37 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "hintids.hxx"

#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif

#include "frmmgr.hxx"
#include "frmfmt.hxx"
#include "colmgr.hxx"


// PRIVATE METHODES ------------------------------------------------------
/*------------------------------------------------------------------------
 Beschreibung:  Spaltenbreite auf aktuelle Breite einstellen
------------------------------------------------------------------------*/



void FitToActualSize(SwFmtCol& rCol, USHORT nWidth)
{
    const USHORT nCount = rCol.GetColumns().Count();
    for(USHORT i = 0; i < nCount; ++i)
    {
        const USHORT nTmp = rCol.CalcColWidth(i, nWidth);
        rCol.GetColumns()[i]->SetWishWidth(nTmp);
    }
    rCol.SetWishWidth(nWidth);
}


// PUBLIC METHODES -------------------------------------------------------
/*------------------------------------------------------------------------
 Beschreibung:  Setzen Spaltenanzahl und Gutterwidth
------------------------------------------------------------------------*/



void SwColMgr::SetCount(USHORT nCount, USHORT  nGutterWidth)
{
    aFmtCol.Init(nCount, nGutterWidth, nWidth);
    aFmtCol.SetWishWidth(nWidth);
    aFmtCol.SetGutterWidth(nGutterWidth, nWidth);
}



USHORT SwColMgr::GetGutterWidth( USHORT nPos ) const
{
    USHORT nRet;
    if(nPos == USHRT_MAX )
        nRet = GetCount() > 1 ? aFmtCol.GetGutterWidth() : DEF_GUTTER_WIDTH;
    else
    {
        DBG_ASSERT(nPos < GetCount() - 1, "Spalte ueberindiziert" )
        const SwColumns& rCols = aFmtCol.GetColumns();
        nRet = rCols.GetObject(nPos)->GetRight() + rCols.GetObject(nPos + 1)->GetLeft();
    }
    return nRet;
}

/*-----------------22.10.96 14.28-------------------

--------------------------------------------------*/


void SwColMgr::SetGutterWidth(USHORT nGutterWidth, USHORT nPos )
{
    if(nPos == USHRT_MAX)
        aFmtCol.SetGutterWidth(nGutterWidth, nWidth);
    else
    {
        DBG_ASSERT(nPos < GetCount() - 1, "Spalte ueberindiziert" )
        SwColumns& rCols = aFmtCol.GetColumns();
        USHORT nGutterWidth2 = nGutterWidth / 2;
        rCols.GetObject(nPos)->SetRight(nGutterWidth2);
        rCols.GetObject(nPos + 1)->SetLeft(nGutterWidth2);
    }
}

/*------------------------------------------------------------------------
 Beschreibung:  Hoehe Trennlinie
------------------------------------------------------------------------*/



short SwColMgr::GetLineHeightPercent() const
{
    return (short)aFmtCol.GetLineHeight();
}



void SwColMgr::SetLineHeightPercent(short nPercent)
{
    ASSERT(nPercent <= 100, LineHeight darf nur bis 100 % gross  sein);
    aFmtCol.SetLineHeight((BYTE)nPercent);
}
/*------------------------------------------------------------------------
 Beschreibung:  Spaltenbreite
------------------------------------------------------------------------*/



USHORT SwColMgr::GetColWidth(USHORT nIdx) const
{
    ASSERT(nIdx < GetCount(), Spaltenarray ueberindiziert.);
    return aFmtCol.CalcPrtColWidth(nIdx, nWidth);
}



void SwColMgr::SetColWidth(USHORT nIdx, USHORT nWd)
{
    ASSERT(nIdx < GetCount(), Spaltenarray ueberindiziert.);
    aFmtCol.GetColumns()[nIdx]->SetWishWidth(nWd);

}

/*--------------------------------------------------------------------
    Beschreibung:   Groesse neu setzen
 --------------------------------------------------------------------*/



void SwColMgr::SetActualWidth(USHORT nW)
{
    nWidth = nW;
    ::FitToActualSize(aFmtCol, nW);
}

/*--------------------------------------------------------------------
    Beschreibung: ctor
 --------------------------------------------------------------------*/



SwColMgr::SwColMgr(const SfxItemSet& rSet, USHORT nActWidth) :
    aFmtCol((const SwFmtCol&)rSet.Get(RES_COL)),
    nWidth(nActWidth)
{
    if(nWidth == USHRT_MAX)
    {
        nWidth = (USHORT)((const SwFmtFrmSize&)rSet.Get(RES_FRM_SIZE)).GetWidth();
        if (nWidth < MINLAY)
            nWidth = USHRT_MAX;
        const SvxLRSpaceItem &rLR = (const SvxLRSpaceItem&)rSet.Get(RES_LR_SPACE);
        nWidth -= (USHORT)rLR.GetLeft();
        nWidth -= (USHORT)rLR.GetRight();
    }
    ::FitToActualSize(aFmtCol, nWidth);
}




SwColMgr::~SwColMgr() {}




/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.43  2000/09/18 16:05:32  willem.vandorp
    OpenOffice header added.

    Revision 1.42  1997/11/24 16:40:12  MA
    include


      Rev 1.41   24 Nov 1997 17:40:12   MA
   include

      Rev 1.40   03 Nov 1997 13:19:46   MA
   precomp entfernt

      Rev 1.39   12 Aug 1997 15:58:08   OS
   frmitems/textitem/paraitem aufgeteilt

      Rev 1.38   07 Aug 1997 14:59:18   OM
   Headerfile-Umstellung

      Rev 1.37   24 Oct 1996 17:59:50   OS
   unterschiedliche Spaltenabstaende einstellen

      Rev 1.36   28 Aug 1996 11:52:52   OS
   includes

      Rev 1.35   19 Apr 1996 16:59:00   MA
   chg: Vorbereitung fuer kleine Rahmen

      Rev 1.34   18 Apr 1996 11:47:06   OM
   Unbenutzte Fkt entfernt

      Rev 1.33   24 Nov 1995 16:58:10   OM
   PCH->PRECOMPILED

      Rev 1.32   13 Jul 1995 22:45:20   JP
   Spaltenbreiten richtig berechnen

      Rev 1.31   21 May 1995 18:55:28   OS
   Trennlinienhoehe gerichtet

      Rev 1.30   03 May 1995 14:09:24   OM
   DEF_GUTTER_WIDTH fuer Default-Spaltenabstand

      Rev 1.29   03 Apr 1995 17:13:08   OM
   Bug in Spaltenpage gefixt

      Rev 1.28   28 Mar 1995 15:38:56   OS
   Pre-Fix fuer leere Breite

      Rev 1.27   13 Mar 1995 16:19:44   MS
   neu: Spalten im Bsp

      Rev 1.26   08 Mar 1995 12:54:28   MS
   Aktuelle Breite einstellen

------------------------------------------------------------------------*/



diff --git a/sw/source/ui/frmdlg/column.cxx b/sw/source/ui/frmdlg/column.cxx
new file mode 100644
index 0000000..e2957fb
--- /dev/null
+++ b/sw/source/ui/frmdlg/column.cxx
@@ -0,0 +1,1561 @@
/*************************************************************************
 *
 *  $RCSfile: column.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:37 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "uiparam.hxx"
#include "hintids.hxx"

#ifndef _SVX_HTMLMODE_HXX //autogen
#include <svx/htmlmode.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_SIZEITEM_HXX //autogen
#include <svx/sizeitem.hxx>
#endif


#include "globals.hrc"
#include "swtypes.hxx"
#include "wrtsh.hxx"
#include "view.hxx"
#include "docsh.hxx"
#include "uitool.hxx"
#include "cmdid.h"
#include "viewopt.hxx"
#include "format.hxx"
#include "frmmgr.hxx"
#include "frmdlg.hxx"
#include "column.hxx"
#include "colmgr.hxx"
#include "prcntfld.hxx"
#include "linetype.hxx"
#include "paratr.hxx"
#include "frmui.hrc"
#include "poolfmt.hrc"
#include "column.hrc"
#ifndef _SECTION_HXX //autogen
#include <section.hxx>
#endif
#ifndef _DOCARY_HXX
#include <docary.hxx>
#endif
#ifndef _PAGEDESC_HXX //autogen
#include <pagedesc.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SV_MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif

#define FRAME_FORMAT_WIDTH 1000
/*--------------------------------------------------------------------
    Beschreibung:  Statische Daten
 --------------------------------------------------------------------*/

static const USHORT __FAR_DATA nLines[] = {
    LIN_1,
    LIN_2,
    LIN_3,
    LIN_4,
    LIN_5
};

static const USHORT nLineCount = sizeof(nLines) / sizeof(nLines[0]);
static const nVisCols = 3;

inline BOOL IsMarkInSameSection( SwWrtShell& rWrtSh, const SwSection* pSect )
{
    rWrtSh.SwapPam();
    BOOL bRet = pSect == rWrtSh.GetCurrSection();
    rWrtSh.SwapPam();
    return bRet;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SwColumnDlg::SwColumnDlg(Window* pParent, SwWrtShell& rSh) :
    SfxModalDialog(pParent, SW_RES(DLG_COLUMN)),
    aOK(this,       ResId(PB_OK)),
    aCancel(this,   ResId(PB_CANCEL)),
    aHelp(this,     ResId(PB_HELP)),
    aApplyToFT(this, ResId(FT_APPLY_TO)),
    aApplyToLB(this, ResId(LB_APPLY_TO)),
    rWrtShell(rSh),
    pPageSet(0),
    pSectionSet(0),
    pSelectionSet(0),
    pFrameSet(0),
    nOldSelection(0),
    bPageChanged(FALSE),
    nSelectionWidth(0),
    bSectionChanged(FALSE),
    bSelSectionChanged(FALSE),
    bFrameChanged(FALSE)
{
    FreeResource();

    SwRect aRect;
    rWrtShell.CalcBoundRect(aRect, FLY_IN_CNTNT);

    nSelectionWidth = aRect.Width();

    SfxItemSet* pColPgSet = 0;
    static USHORT __READONLY_DATA aSectIds[] = { RES_COL, RES_COL,
                                                RES_FRM_SIZE, RES_FRM_SIZE,
                                                RES_COLUMNBALANCE, RES_COLUMNBALANCE,
                                                0 };

    const SwSection* pCurrSection = rWrtShell.GetCurrSection();
    USHORT nFullSectCnt = rWrtShell.GetFullSelectedSectionCount();
    if( pCurrSection && ( !rWrtShell.HasSelection() || 0 != nFullSectCnt ))
    {
        pSectionSet = new SfxItemSet( rWrtShell.GetAttrPool(), aSectIds );
        pSectionSet->Put( pCurrSection->GetFmt()->GetAttrSet() );
        pColPgSet = pSectionSet;
        aApplyToLB.RemoveEntry( aApplyToLB.GetEntryPos(
                                        (void*)( 1 >= nFullSectCnt
                                                    ? LISTBOX_SECTIONS
                                                    : LISTBOX_SECTION )));
    }
    else
    {
        aApplyToLB.RemoveEntry(aApplyToLB.GetEntryPos( (void*) LISTBOX_SECTION ));
        aApplyToLB.RemoveEntry(aApplyToLB.GetEntryPos( (void*) LISTBOX_SECTIONS ));
    }

    if( rWrtShell.HasSelection() && rWrtShell.IsInsRegionAvailable() &&
        ( !pCurrSection || ( 1 != nFullSectCnt &&
            IsMarkInSameSection( rWrtShell, pCurrSection ) )))
    {
        pSelectionSet = new SfxItemSet( rWrtShell.GetAttrPool(), aSectIds );
        pColPgSet = pSelectionSet;
    }
    else
        aApplyToLB.RemoveEntry(aApplyToLB.GetEntryPos( (void*) LISTBOX_SELECTION ));

    if( rWrtShell.GetFlyFrmFmt() )
    {
        const SwFrmFmt* pFmt = rSh.GetFlyFrmFmt() ;
        pFrameSet = new SfxItemSet(rWrtShell.GetAttrPool(), aSectIds );
        pFrameSet->Put(pFmt->GetFrmSize());
        pFrameSet->Put(pFmt->GetCol());
        pColPgSet = pFrameSet;
    }
    else
        aApplyToLB.RemoveEntry(aApplyToLB.GetEntryPos( (void*) LISTBOX_FRAME ));


    USHORT nPagePos = aApplyToLB.GetEntryPos( (void*) LISTBOX_PAGE );
    const SwPageDesc* pPageDesc = rWrtShell.GetSelectedPageDescs();
    if( pPageDesc )
    {
        pPageSet = new SfxItemSet( rWrtShell.GetAttrPool(),
                                    RES_COL, RES_COL,
                                    RES_FRM_SIZE, RES_FRM_SIZE,
                                    RES_LR_SPACE, RES_LR_SPACE,
                                    0 );

        String sPageStr = aApplyToLB.GetEntry(nPagePos);
        aApplyToLB.RemoveEntry( nPagePos );
        sPageStr += pPageDesc->GetName();
        aApplyToLB.InsertEntry( sPageStr, nPagePos );
        aApplyToLB.SetEntryData( nPagePos, (void*) LISTBOX_PAGE);

        const SwFrmFmt &rFmt = pPageDesc->GetMaster();
        nPageWidth = rFmt.GetFrmSize().GetSize().Width();
        pPageSet->Put(rFmt.GetCol());
        pPageSet->Put(rFmt.GetLRSpace());
        pColPgSet = pPageSet;
    }
    else
        aApplyToLB.RemoveEntry( nPagePos );


    ASSERT( pColPgSet, "" );
    // TabPage erzeugen
    SwColumnPage* pPage = (SwColumnPage*) SwColumnPage::Create( this,
                                                                *pColPgSet );
    pTabPage = pPage;

    //Groesse anpassen
    Size aPageSize(pTabPage->GetSizePixel());
    Size aDlgSize(GetOutputSizePixel());
    aDlgSize.Height() = aPageSize.Height();
    SetOutputSizePixel(aDlgSize);
    pTabPage->Show();

    aApplyToLB.SelectEntryPos(0);
    ObjectHdl(0);

    aApplyToLB.SetSelectHdl(LINK(this, SwColumnDlg, ObjectHdl));
    aOK.SetClickHdl(LINK(this, SwColumnDlg, OkHdl));
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SwColumnDlg::~SwColumnDlg()
{
    delete pTabPage;
    delete pPageSet;
    delete pSectionSet;
    delete pSelectionSet;
}

/* -----------------26.05.99 11:40-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK(SwColumnDlg, ObjectHdl, ListBox*, pBox)
{
    SfxItemSet* pSet = 0;
    switch(nOldSelection)
    {
        case LISTBOX_SELECTION  :
            pSet = pSelectionSet;
        break;
        case LISTBOX_SECTION    :
            pSet = pSectionSet;
            bSectionChanged = TRUE;
        break;
        case LISTBOX_SECTIONS   :
            pSet = pSectionSet;
            bSelSectionChanged = TRUE;
        break;
        case LISTBOX_PAGE       :
            pSet = pPageSet;
            bPageChanged = TRUE;
        break;
        case LISTBOX_FRAME:
            pSet = pFrameSet;
            bFrameChanged = TRUE;
        break;
    }
    if(pBox)
    {
        pTabPage->FillItemSet(*pSet);
    }
    nOldSelection = (long)aApplyToLB.GetEntryData(aApplyToLB.GetSelectEntryPos());
    long nWidth = nSelectionWidth;
    switch(nOldSelection)
    {
        case LISTBOX_SELECTION  :
            pSet = pSelectionSet;
            pSet->Put(SwFmtFrmSize(ATT_VAR_SIZE, nWidth, nWidth));
        break;
        case LISTBOX_SECTION    :
        case LISTBOX_SECTIONS   :
            pSet = pSectionSet;
            pSet->Put(SwFmtFrmSize(ATT_VAR_SIZE, nWidth, nWidth));
        break;
        case LISTBOX_PAGE       :
            nWidth = nPageWidth;
            pSet = pPageSet;
            pSet->Put(SwFmtFrmSize(ATT_VAR_SIZE, nWidth, nWidth));
        break;
        case LISTBOX_FRAME:
            pSet = pFrameSet;
        break;
    }
    pTabPage->ShowBalance(pSet == pSectionSet || pSet == pSelectionSet);
    pTabPage->SetFrmMode(TRUE);
    pTabPage->SetPageWidth(nWidth);
    pTabPage->Reset(*pSet);
    return 0;
}
/* -----------------26.05.99 12:32-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK(SwColumnDlg, OkHdl, OKButton*, EMPTYARG)
{
    //aktuelle Selektion auswerten
    SfxItemSet* pSet = 0;
    switch(nOldSelection)
    {
        case LISTBOX_SELECTION  :
            pSet = pSelectionSet;
        break;
        case LISTBOX_SECTION    :
            pSet = pSectionSet;
            bSectionChanged = TRUE;
        break;
        case LISTBOX_SECTIONS   :
            pSet = pSectionSet;
            bSelSectionChanged = TRUE;
        break;
        case LISTBOX_PAGE       :
            pSet = pPageSet;
            bPageChanged = TRUE;
        break;
        case LISTBOX_FRAME:
            pSet = pFrameSet;
            bFrameChanged = TRUE;
        break;
    }
    pTabPage->FillItemSet(*pSet);

    if(pSelectionSet && SFX_ITEM_SET == pSelectionSet->GetItemState(RES_COL))
    {
        //Bereich mit Spalten einfuegen
        const SwFmtCol& rColItem = (const SwFmtCol&)pSelectionSet->Get(RES_COL);
        //nur, wenn es auch Spalten gibt!
        if(rColItem.GetNumCols() > 1)
            rWrtShell.GetView().GetViewFrame()->GetDispatcher()->Execute(
                FN_INSERT_REGION, SFX_CALLMODE_ASYNCHRON, *pSelectionSet );
    }

    if(pSectionSet && pSectionSet->Count() && bSectionChanged )
    {
        const SwSection* pCurrSection = rWrtShell.GetCurrSection();
        const SwSectionFmt* pFmt = pCurrSection->GetFmt();
        USHORT nNewPos = rWrtShell.GetSectionFmtPos( *pFmt );
        rWrtShell.ChgSection( nNewPos, *pCurrSection, pSectionSet );
    }

    if(pSectionSet && pSectionSet->Count() && bSelSectionChanged )
    {
        rWrtShell.SetSectionAttr( *pSectionSet );
    }

    if(pPageSet && SFX_ITEM_SET == pPageSet->GetItemState(RES_COL) && bPageChanged)
    {
        // aktuellen PageDescriptor ermitteln und damit den Set fuellen
        const USHORT nCurIdx = rWrtShell.GetCurPageDesc();
        SwPageDesc aPageDesc(rWrtShell.GetPageDesc(nCurIdx));
        SwFrmFmt &rFmt = aPageDesc.GetMaster();
        rFmt.SetAttr(pPageSet->Get(RES_COL));
        rWrtShell.ChgPageDesc(nCurIdx, aPageDesc);
    }
    if(pFrameSet && SFX_ITEM_SET == pFrameSet->GetItemState(RES_COL) && bFrameChanged)
    {
        SfxItemSet aTmp(*pFrameSet->GetPool(), RES_COL, RES_COL);
        aTmp.Put(*pFrameSet);
        rWrtShell.StartAction();
        rWrtShell.Push();
        rWrtShell.SetFlyFrmAttr( aTmp );
        //die Rahmenselektion wieder aufheben
        if(rWrtShell.IsFrmSelected())
        {
            rWrtShell.UnSelectFrm();
            rWrtShell.LeaveSelFrmMode();
        }
        rWrtShell.Pop();
        rWrtShell.EndAction();
    }
    EndDialog(RET_OK);
    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

#ifndef DEBUG
inline
#endif
USHORT GetMaxWidth( SwColMgr* pColMgr, USHORT nCols )
{
    USHORT nMax = pColMgr->GetActualSize();
    if( --nCols )
        nMax -= pColMgr->GetGutterWidth() * nCols;
    return nMax;
}

static USHORT __FAR_DATA aPageRg[] = {
    RES_COL, RES_COL,
    0
};


DBG_NAME(columnhdl) ;



USHORT lcl_LineWidthToPos(ULONG nWidth)
{
    const USHORT nUShortWidth = (USHORT)nWidth;
    for(USHORT i = 0; i < nLineCount; ++i)
        if(nUShortWidth == nLines[i])
            return i;
    return 0;
}



void SwColumnPage::ResetColWidth()
{
    if( nCols )
    {
        USHORT nWidth = GetMaxWidth( pColMgr, nCols );
        nWidth /= nCols;

        for(USHORT i = 0; i < nCols; ++i)
            nColWidth[i] = (long) nWidth;
    }

}

/*--------------------------------------------------------------------
    Beschreibung:   Jetzt als TabPage
 --------------------------------------------------------------------*/



SwColumnPage::SwColumnPage(Window *pParent, const SfxItemSet &rSet)

    : SfxTabPage(pParent, SW_RES(TP_COLUMN), rSet),

    aClNrLbl(this,          ResId(FT_NUMBER  )),
    aCLNrEdt(this,          ResId(ED_NUMBER  )),
    aAutoWidthBox(this,     ResId(CB_AUTO_WIDTH)),
    aDefaultVS(this,        ResId(VS_DEFAULTS)),
    aBalanceColsCB(this,    ResId(CB_BALANCECOLS)),
    aCLGroup(this,          ResId(GB_COLUMNS )),

    aLineTypeLbl(this,      ResId(FT_STYLE)),
    aLineTypeDLB(this,      ResId(LB_STYLE)),
    aLineHeightLbl(this,    ResId(FT_HEIGHT)),
    aLineHeightEdit(this,   ResId(ED_HEIGHT)),
    aLinePosLbl(this,       ResId(FT_POSITION)),
    aLinePosDLB(this,       ResId(LB_POSITION)),
    aLineTypeGrp(this,      ResId(GB_LINETYPE)),
    aBtnUp(this,            ResId(BTN_DOWN)),
    aBtnDown(this,          ResId(BTN_UP)),

    aWidthFT(this,          ResId(FT_WIDTH)),
    aDistFT(this,           ResId(FT_DIST)),
    aLbl1(this,             ResId(FT_1)),
    aEd1(this,              ResId(ED_1)),
    aDistEd1(this,          ResId(ED_DIST1)),
    aLbl2(this,             ResId(FT_2)),
    aEd2(this,              ResId(ED_2)),
    aDistEd2(this,          ResId(ED_DIST2)),
    aLbl3(this,             ResId(FT_3)),
    aEd3(this,              ResId(ED_3)),
    aLayoutGrp(this,        ResId(GB_LAYOUT)),

    aPgeExampleWN(this,     ResId(WN_BSP)),
    aFrmExampleWN(this,     ResId(WN_BSP)),
    aExampleGB(this,        ResId(GB_BSP)),

    nFirstVis(0),
    bFrm(FALSE),
    bFormat(FALSE),
    bHtmlMode(FALSE),
    nMinWidth(MINLAY),
    pModifiedField(0),
    pColMgr(0),
    bLockUpdate(FALSE)
{
    FreeResource();
    SetExchangeSupport();

    aDefaultVS.SetColCount( 5 );
    aDefaultVS.SetStyle(  aDefaultVS.GetStyle()
                            | WB_ITEMBORDER
                            | WB_DOUBLEBORDER );
    for(USHORT i = 0; i < 5; i++)
        aDefaultVS.InsertItem( i + 1, i );

    aDefaultVS.SetSelectHdl(LINK(this, SwColumnPage, SetDefaultsHdl));

    // Controls fuer Zusaetzebereich beim MoreButton anmelden
    aCLNrEdt.SetModifyHdl(LINK(this, SwColumnPage, ColModify));
    Link aLk = LINK(this, SwColumnPage, GapModify);
    aDistEd1.SetUpHdl(aLk);
    aDistEd1.SetDownHdl(aLk);
    aDistEd1.SetLoseFocusHdl(aLk);
    aDistEd2.SetUpHdl(aLk);
    aDistEd2.SetDownHdl(aLk);
    aDistEd2.SetLoseFocusHdl(aLk);

    aLk = LINK(this, SwColumnPage, EdModify);

    aEd1.SetUpHdl(aLk);
    aEd1.SetDownHdl(aLk);
    aEd1.SetLoseFocusHdl(aLk);

    aEd2.SetUpHdl(aLk);
    aEd2.SetDownHdl(aLk);
    aEd2.SetLoseFocusHdl(aLk);

    aEd3.SetUpHdl(aLk);
    aEd3.SetDownHdl(aLk);
    aEd3.SetLoseFocusHdl(aLk);

    aBtnUp.SetClickHdl(LINK(this, SwColumnPage, Up));
    aBtnDown.SetClickHdl(LINK(this, SwColumnPage, Down));
    aAutoWidthBox.SetClickHdl(LINK(this, SwColumnPage, AutoWidthHdl));

    aLk = LINK( this, SwColumnPage, UpdateColMgr );
    aLineTypeDLB.SetSelectHdl( aLk );
    aLineHeightEdit.SetModifyHdl( aLk );
    aLinePosDLB.SetSelectHdl( aLk );

        // Trennlinie
    aLineTypeDLB.SetUnit( FUNIT_POINT );
    aLineTypeDLB.SetSourceUnit( FUNIT_TWIP );
    for( i = 0; i < nLineCount; ++i )
        aLineTypeDLB.InsertEntry( 100 * nLines[ i ] );
}



SwColumnPage::~SwColumnPage()
{
    delete pColMgr;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwColumnPage::SetPageWidth(long nPageWidth)
{
    long nNewMaxWidth = aEd1.Normalize(nPageWidth);

    aDistEd1.SetMax(nNewMaxWidth, FUNIT_TWIP);
    aDistEd2.SetMax(nNewMaxWidth, FUNIT_TWIP);
    aEd1.SetMax(nNewMaxWidth, FUNIT_TWIP);
    aEd2.SetMax(nNewMaxWidth, FUNIT_TWIP);
    aEd3.SetMax(nNewMaxWidth, FUNIT_TWIP);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



void SwColumnPage::Reset(const SfxItemSet &rSet)
{
    USHORT nHtmlMode = ::GetHtmlMode((const SwDocShell*)SfxObjectShell::Current());
    if(nHtmlMode & HTMLMODE_ON)
    {
        bHtmlMode = TRUE;
        aAutoWidthBox.Enable(FALSE);
    }
    FieldUnit aMetric = ::GetDfltMetric(bHtmlMode);
    SetMetric(aEd1, aMetric);
    SetMetric(aEd2, aMetric);
    SetMetric(aEd3, aMetric);
    SetMetric(aDistEd1, aMetric);
    SetMetric(aDistEd2, aMetric);

    delete pColMgr;
    pColMgr = new SwColMgr(rSet);
    nCols   = pColMgr->GetCount() ;
    aCLNrEdt.SetMax(Max((USHORT)aCLNrEdt.GetMax(), (USHORT)nCols));
    aCLNrEdt.SetLast(Max(nCols,(USHORT)aCLNrEdt.GetMax()));

    if(bFrm)
    {
        if(bFormat)                     // hier gibt es keine Size
            pColMgr->SetActualWidth(FRAME_FORMAT_WIDTH);
        else
        {
            const SwFmtFrmSize& rSize = (const SwFmtFrmSize&)rSet.Get(RES_FRM_SIZE);
            const SvxBoxItem& rBox = (const SvxBoxItem&) rSet.Get(RES_BOX);
            pColMgr->SetActualWidth((USHORT)rSize.GetSize().Width() - rBox.GetDistance());
        }
    }
    if(aBalanceColsCB.IsVisible())
    {
        const SfxPoolItem* pItem;
        if( SFX_ITEM_SET == rSet.GetItemState( RES_COLUMNBALANCE, FALSE, &pItem ))
            aBalanceColsCB.Check(!((const SwFmtNoBalancedColumns*)pItem)->GetValue());
        else
            aBalanceColsCB.Check( TRUE );
    }

    Init();
    ActivatePage( rSet );
}

/*--------------------------------------------------------------------
    Beschreibung:   TabPage erzeugen
 --------------------------------------------------------------------*/



SfxTabPage* SwColumnPage::Create(Window *pParent, const SfxItemSet &rSet)
{
    return new SwColumnPage(pParent, rSet);
}

/*--------------------------------------------------------------------
    Beschreibung:   Attribute in den Set stopfen bei OK
 --------------------------------------------------------------------*/



BOOL SwColumnPage::FillItemSet(SfxItemSet &rSet)
{
    // Im ItemSet setzen
    // Die aktuellen Einstellungen sind
    // schon vorhanden
    //
    const SfxPoolItem* pOldItem;
    const SwFmtCol& rCol = pColMgr->GetColumns();
    if(0 == (pOldItem = GetOldItem( rSet, RES_COL )) ||
                rCol != *pOldItem )
        rSet.Put(rCol);

    if(aBalanceColsCB.IsVisible() )
    {
        rSet.Put(SwFmtNoBalancedColumns(!aBalanceColsCB.IsChecked() ));
    }
    return TRUE;
}

/*--------------------------------------------------------------------
    Beschreibung:   ColumnManager updaten
 --------------------------------------------------------------------*/



IMPL_LINK( SwColumnPage, UpdateColMgr, void *, pField )
{
    long nGutterWidth = pColMgr->GetGutterWidth();
    if(nCols > 1)
    {
            // Ermitteln, ob die schmalste Spalte zu schmal ist
            // fuer den eingestellten Spaltenabstand
        long nMin = nColWidth[0];
        for(USHORT i = 1; i < nCols; ++i)
            nMin = Min(nMin, nColWidth[i]);

        BOOL bAutoWidth = aAutoWidthBox.IsChecked();
        if(!bAutoWidth)
        {
            pColMgr->SetAutoWidth(FALSE);
                // falls der Benutzer nicht die Gesamtbreite vergeben hat,
                // den fehlenden Betrag auf die letzte Spalte addieren.
            long nSum = 0;
            for(i = 0; i < nCols; ++i)
                nSum += nColWidth[i];
            nGutterWidth = 0;
            for(i = 0; i < nCols - 1; ++i)
                nGutterWidth += nColDist[i];
            nSum += nGutterWidth;

            long nMaxW = pColMgr->GetActualSize();

            if( nSum < nMaxW  )
                nColWidth[nCols - 1] += nMaxW - nSum;

            pColMgr->SetColWidth( 0, nColWidth[0] + (USHORT)nColDist[0]/2 );
            for( i = 1; i < nCols-1; ++i )
            {
                long nActDist = (nColDist[i] + nColDist[i - 1]) / 2;
                pColMgr->SetColWidth( i, (USHORT)nColWidth[i] + (USHORT)nActDist );
            }
            pColMgr->SetColWidth( nCols-1, (USHORT)nColWidth[nCols-1] + nColDist[nCols -2]/2 );

        }

            // keins ist ausgeschaltet
        const USHORT nPos = aLineTypeDLB.GetSelectEntryPos();
        BOOL bEnable = 0 != nPos;
        aLineHeightEdit.Enable( bEnable );
        aLineHeightLbl.Enable( bEnable );
        if( !bEnable )
            pColMgr->SetNoLine();
        else if( LISTBOX_ENTRY_NOTFOUND != nPos )
        {
            pColMgr->SetLineWidthAndColor(nLines[nPos - 1], Color(COL_BLACK) );
            pColMgr->SetAdjust( SwColLineAdj(
                                    aLinePosDLB.GetSelectEntryPos() + 1) );
            pColMgr->SetLineHeightPercent((short)aLineHeightEdit.GetValue());
            bEnable = pColMgr->GetLineHeightPercent() != 100;
        }
        aLinePosLbl.Enable( bEnable );
        aLinePosDLB.Enable( bEnable );
    }
    else
    {
        pColMgr->NoCols();
    }

    //Maximalwerte setzen
    aCLNrEdt.SetMax(Max(1L,
        Min(long(nMaxCols), long( pColMgr->GetActualSize()  /
                                    ((nGutterWidth + MINLAY)) ))));
    aCLNrEdt.SetLast(aCLNrEdt.GetMax());
    aCLNrEdt.Reformat();

    //Beispielfenster anregen
    if(!bLockUpdate)
    {
        if(bFrm)
        {
            aFrmExampleWN.SetColumns( pColMgr->GetColumns() );
            aFrmExampleWN.Invalidate();
        }
        else
            aPgeExampleWN.Invalidate();
    }

    return 0;
}

/*------------------------------------------------------------------------
 Beschreibung:  Initialisierung
------------------------------------------------------------------------*/



void SwColumnPage::Init()
{
    aCLNrEdt.SetValue(nCols);

    aAutoWidthBox.Check(pColMgr->IsAutoWidth() || bHtmlMode );

        // Setzen der Breiten
    for(USHORT i = 0; i < nCols; ++i)
    {
        nColWidth[i] = pColMgr->GetColWidth(i);
        if(i < nCols - 1)
            nColDist[i] = pColMgr->GetGutterWidth(i);
    }

    if( 1 < nCols )
    {
        USHORT eAdj = pColMgr->GetAdjust();
        if( COLADJ_NONE == eAdj )       // der Dialog kennt kein NONE!
        {
            eAdj = COLADJ_TOP;
            //ohne Adjust auch kein Linientyp
            aLineTypeDLB.SelectEntryPos( 0 );
            aLineHeightEdit.SetValue( 100 );
        }
        else
        {
            aLineTypeDLB.SelectEntryPos( lcl_LineWidthToPos(( pColMgr->GetLineWidth() ) + 1 ));
            aLineHeightEdit.SetValue( pColMgr->GetLineHeightPercent() );
        }
        aLinePosDLB.SelectEntryPos( eAdj - 1 );
    }
    else
    {
        aLinePosDLB.SelectEntryPos( 0 );
        aLineTypeDLB.SelectEntryPos( 0 );
        aLineHeightEdit.SetValue( 100 );
    }

    UpdateCols();
    Update();

        // Maximale Spaltenzahl setzen
        // Werte kleiner als 1 sind nicht erlaubt
    aCLNrEdt.SetMax(Max(1L,
            Min(long(nMaxCols), long(pColMgr->GetActualSize() / nMinWidth))));

}

/*------------------------------------------------------------------------
 Beschreibung:  Die Anzahl der Spalten hat sich veraendert -- hier werden
                die Controls fuer die Bearbeitung der Spalten entsprechend
                der Spaltenzahl en- oder disabled.
                Falls es mehr als nVisCols (= 3) Spalten gibt, werden
                alle Edit enabled und die Buttons fuer das Scrollen
                ebenfalls.
                Andernfalls werden die Edits jeweils fuer die entsprechenden
                Spaltenzahl enabled; eine Spalte kann nicht bearbeitet werden.
------------------------------------------------------------------------*/



void SwColumnPage::UpdateCols()
{
    BOOL bEnableBtns= FALSE;
    BOOL bEnable12  = FALSE;
    BOOL bEnable3   = FALSE;
    const BOOL bEdit = !aAutoWidthBox.IsChecked();
    if ( nCols > nVisCols )
    {
        bEnableBtns = TRUE && !bHtmlMode;
        bEnable12 = bEnable3 = bEdit;
    }
    else if( bEdit )
    {
        // hier gibt es absichtlich kaum noch breaks
        switch(nCols)
        {
            case 3: bEnable3 = TRUE;
            case 2: bEnable12= TRUE; break;
            default: /* do nothing */;
        }
    }
    aEd1.Enable( bEnable12 );
    aDistEd1.Enable(nCols > 1);
    aEd2.Enable( bEnable12 );
    aDistEd2.Enable(bEnable3);
    aEd3.Enable( bEnable3  );
    aLbl1.Enable(bEnable12 );
    aLbl2.Enable(bEnable12 );
    aLbl3.Enable(bEnable3  );
    aBtnUp.Enable( bEnableBtns );
    aBtnDown.Enable( bEnableBtns );

    const BOOL bEnable = nCols > 1;
    if( !bEnable )
    {
        aLinePosDLB.Enable( FALSE );
        aLinePosLbl.Enable( FALSE );
    }
    aLineHeightEdit.Enable( bEnable );
    aLineHeightLbl.Enable( bEnable );
    aLineTypeDLB.Enable( bEnable );
    aLineTypeLbl.Enable( bEnable );
    aAutoWidthBox.Enable( bEnable && !bHtmlMode );
}

void SwColumnPage::SetLabels( USHORT nVis )
{
    String sLbl( '~' );

    String sLbl2( String::CreateFromInt32( nVis + 1 ));
    sLbl2.Insert(sLbl, sLbl2.Len() - 1);
    aLbl1.SetText(sLbl2);

    sLbl2 = String::CreateFromInt32( nVis + 2 );
    sLbl2.Insert(sLbl, sLbl2.Len() - 1);
    aLbl2.SetText(sLbl2);

    sLbl2 = String::CreateFromInt32( nVis + 3 );
    sLbl2.Insert(sLbl, sLbl2.Len() - 1);
    aLbl3.SetText(sLbl2);
}

/*------------------------------------------------------------------------
 Beschreibung:  Handler, der bei einer Veraenderung der Spaltenzahl
                gerufen wird.
                Eine Aenderung der Spaltenzahl ueberschreibt eventuelle
                Breiteneinstellungen des Benutzers; alle Spalten sind
                gleich breit.
------------------------------------------------------------------------*/

IMPL_LINK( SwColumnPage, ColModify, NumericField *, pNF )
{
    if(pNF)
        aDefaultVS.SetNoSelection();
    nCols = (USHORT)aCLNrEdt.GetValue();
    long nDist = aDistEd1.Denormalize(aDistEd1.GetValue(FUNIT_TWIP));
    pColMgr->SetCount(nCols, (USHORT)nDist);
    for(USHORT i = 0; i < nCols; i++)
        nColDist[i] = nDist;
    nFirstVis = 0;
    SetLabels( nFirstVis );
    UpdateCols();
    ResetColWidth();
    Update();

    return 0;
}

/*------------------------------------------------------------------------
 Beschreibung:  Modify- Handler fuer eine Aenderung der Spaltenbreite
                oder des Spaltenabstandes.
                Diese Aenderungen wirken sich erst zeitversetzt aus.
                Durch eine Aenderung der Spaltenbreite wird die automatische
                Berechnung der Spaltenbreite ausser Kraft gesetzt; erst
                eine Aenderung der Spaltenzahl kehrt wieder zu diesem
                Default zurueck.
------------------------------------------------------------------------*/



IMPL_LINK( SwColumnPage, GapModify, PercentField *, pFld )
{
    long nActValue = pFld->Denormalize(pFld->GetValue(FUNIT_TWIP));
    if(nCols < 2)
        return 0;
    if(aAutoWidthBox.IsChecked())
    {
        USHORT nMaxGap = pColMgr->GetActualSize() - nCols * MINLAY;
        DBG_ASSERT(nCols, "Abstand kann nicht ohne Spalten eingestellt werden")
        nMaxGap /= nCols - 1;
        if(nActValue > nMaxGap)
        {
            nActValue = nMaxGap;
            aDistEd1.SetValue(aDistEd1.Normalize(nMaxGap), FUNIT_TWIP);
        }
        pColMgr->SetGutterWidth((USHORT)nActValue);
        for(USHORT i = 0; i < nCols; i++)
            nColDist[i] = nActValue;

        ResetColWidth();
        UpdateCols();
    }
    else

    {
        USHORT nOffset = 0;
        if(pFld == &aDistEd2)
        {
            nOffset = 1;
        }
        long nDiff = nActValue - nColDist[nFirstVis + nOffset];
        if(nDiff)
        {
            long nLeft = nColWidth[nFirstVis + nOffset];
            long nRight = nColWidth[nFirstVis + nOffset + 1];
            if(nLeft + nRight + 2 * MINLAY < nDiff)
                nDiff = nLeft + nRight - 2 * MINLAY;
            if(nDiff < nRight - MINLAY)
            {
                nRight -= nDiff;
            }
            else
            {
                long nTemp = nDiff - nRight + MINLAY;
                nRight = MINLAY;
                if(nLeft > nTemp - MINLAY)
                {
                    nLeft -= nTemp;
                    nTemp = 0;
                }
                else
                {
                    nTemp -= nLeft + MINLAY;
                    nLeft = MINLAY;
                }
                nDiff = nTemp;
            }
            nColWidth[nFirstVis + nOffset] = nLeft;
            nColWidth[nFirstVis + nOffset + 1] = nRight;
            nColDist[nFirstVis + nOffset] += nDiff;

            pColMgr->SetColWidth( nFirstVis + nOffset, USHORT(nLeft) );
            pColMgr->SetColWidth( nFirstVis + nOffset + 1, USHORT(nRight) );
            pColMgr->SetGutterWidth( USHORT(nColDist[nFirstVis + nOffset]), nFirstVis + nOffset );
        }

    }
    Update();
    return 0;
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/



IMPL_LINK( SwColumnPage, EdModify, PercentField *, pField )
{
    pModifiedField = pField;
    Timeout(0);
    return 0;
}
/*------------------------------------------------------------------------
 Beschreibung:  Handler hinter der Checkbox fuer automatische Breite.
                Ist die Box gecheckt, koennen keine expliziten Werte
                fuer die Spaltenbreite eingegeben werden.
------------------------------------------------------------------------*/



IMPL_LINK( SwColumnPage, AutoWidthHdl, CheckBox *, pBox )
{
    long nDist = aDistEd1.Denormalize(aDistEd1.GetValue(FUNIT_TWIP));
    pColMgr->SetCount(nCols, (USHORT)nDist);
    for(USHORT i = 0; i < nCols; i++)
        nColDist[i] = nDist;
    if(pBox->IsChecked())
    {
        pColMgr->SetGutterWidth(USHORT(nDist));
        ResetColWidth();
    }
    pColMgr->SetAutoWidth(pBox->IsChecked(), USHORT(nDist));
    UpdateCols();
    Update();
    return 0;
}

/*------------------------------------------------------------------------
 Beschreibung:  Raufscrollen der Inhalte der Edits.
------------------------------------------------------------------------*/

IMPL_LINK( SwColumnPage, Up, Button *, EMPTYARG )
{
    if( nFirstVis )
    {
        --nFirstVis;
        SetLabels( nFirstVis );
        Update();
    }
    return 0;
}
/*------------------------------------------------------------------------
 Beschreibung:  Runterscrollen der Inhalte der Edits.
------------------------------------------------------------------------*/

IMPL_LINK( SwColumnPage, Down, Button *, EMPTYARG )
{
    if( nFirstVis + nVisCols < nCols )
    {
        ++nFirstVis;
        SetLabels( nFirstVis );
        Update();
    }
    return 0;
}
/*------------------------------------------------------------------------
 Beschreibung:  Relikt aus alten Zeiten - jetzt direkt ohne time
 *              Timer- Handler; angetriggert durch eine Aenderung der
                Spaltenbreite oder des Spaltenabstandes.
------------------------------------------------------------------------*/

IMPL_LINK( SwColumnPage, Timeout, Timer *, EMPTYARG )
{
    DBG_PROFSTART(columnhdl) ;
    if(pModifiedField)
    {
            // Finden der veraenderten Spalte
        USHORT nChanged = nFirstVis;
        if(pModifiedField == &aEd2)
            ++nChanged;
        else if(pModifiedField == &aEd3)
            nChanged += 2;
        /*else if(pModifiedField == &aEd4)
            nChanged += 3;*/

        long nNewWidth = (USHORT)
            pModifiedField->Denormalize(pModifiedField->GetValue(FUNIT_TWIP));
        long nDiff = nNewWidth - nColWidth[nChanged];

        // wenn es die letzte Spalte ist
        if(nChanged == nCols - 1)
        {
            nColWidth[0] -= nDiff;
            if(nColWidth[0] < (long)nMinWidth)
            {
                nNewWidth -= nMinWidth - nColWidth[0];
                nColWidth[0] = nMinWidth;
            }

        }
        else if(nDiff)
        {
            nColWidth[nChanged + 1] -= nDiff;
            if(nColWidth[nChanged + 1] < (long) nMinWidth)
            {
                nNewWidth -= nMinWidth - nColWidth[nChanged + 1];
                nColWidth[nChanged + 1] = nMinWidth;
            }
        }
        nColWidth[nChanged] = nNewWidth;
        pModifiedField = 0;
    }
    Update();
    DBG_PROFSTOP(columnhdl) ;
    return 0;
}
/*------------------------------------------------------------------------
 Beschreibung:  Aktualisierung der Anzeige
------------------------------------------------------------------------*/



void SwColumnPage::Update()
{
    aBalanceColsCB.Enable(nCols > 1);
    if(nCols >= 2)
    {
        aEd1.SetValue(aEd1.Normalize(nColWidth[nFirstVis]), FUNIT_TWIP);
        aDistEd1.SetValue(aDistEd1.Normalize(nColDist[nFirstVis]), FUNIT_TWIP);
        aEd2.SetValue(aEd2.Normalize(nColWidth[nFirstVis + 1]), FUNIT_TWIP);
        if(nCols >= 3)
        {
            aDistEd2.SetValue(aDistEd2.Normalize(nColDist[nFirstVis + 1]), FUNIT_TWIP);
            aEd3.SetValue(aEd3.Normalize(nColWidth[nFirstVis + 2]), FUNIT_TWIP);
        }
        else
        {
            aEd3.SetText(aEmptyStr);
            aDistEd2.SetText(aEmptyStr);
        }
    }
    else
    {
        aEd1.SetText(aEmptyStr);
        aEd2.SetText(aEmptyStr);
        aEd3.SetText(aEmptyStr);
        aDistEd1.SetText(aEmptyStr);
        aDistEd2.SetText(aEmptyStr);
    }
    UpdateColMgr(0);
}

/*--------------------------------------------------------------------
    Beschreibung:   Update Bsp
 --------------------------------------------------------------------*/



void SwColumnPage::ActivatePage(const SfxItemSet& rSet)
{
    if(!bFrm)
    {
        if( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_PAGE_SIZE ))
        {
            const SvxSizeItem& rSize = (const SvxSizeItem&)rSet.Get(
                                                SID_ATTR_PAGE_SIZE);
            const SvxLRSpaceItem& rLRSpace = (const SvxLRSpaceItem&)rSet.Get(
                                                                RES_LR_SPACE );
            const SvxBoxItem& rBox = (const SvxBoxItem&) rSet.Get(RES_BOX);
            USHORT nActWidth = (USHORT)rSize.GetSize().Width()
                            - rLRSpace.GetLeft() - rLRSpace.GetRight() - rBox.GetDistance();

            if( pColMgr->GetActualSize() != nActWidth)
            {
                pColMgr->SetActualWidth(nActWidth);
                ColModify( 0 );
                UpdateColMgr( 0 );
            }
        }
        aFrmExampleWN.Hide();
        aPgeExampleWN.UpdateExample( rSet, pColMgr );
        aPgeExampleWN.Show();

    }
    else
    {
        aPgeExampleWN.Hide();
        aFrmExampleWN.Show();

        // Size
        const SwFmtFrmSize& rSize = (const SwFmtFrmSize&)rSet.Get(RES_FRM_SIZE);
        const SvxBoxItem& rBox = (const SvxBoxItem&) rSet.Get(RES_BOX);

        long nDistance = rBox.GetDistance();
        if(bFormat)
            aFrmExampleWN.SetFrameSize(Size(FRAME_FORMAT_WIDTH, FRAME_FORMAT_WIDTH), 0);
        else
            aFrmExampleWN.SetFrameSize(rSize.GetSize(), nDistance);


        const USHORT nTotalWish = bFormat ? FRAME_FORMAT_WIDTH : USHORT(rSize.GetWidth() - 2 * nDistance);

        // Maximalwerte der Spaltenbreiten setzen
        SetPageWidth(nTotalWish);

        if(pColMgr->GetActualSize() != nTotalWish)
        {
            pColMgr->SetActualWidth(nTotalWish);
            Init();
        }
        BOOL bPercent;
        // im Rahmenformat nur relative Angaben
        if ( bFormat || rSize.GetWidthPercent() && rSize.GetWidthPercent() != 0xff)
        {
            // Wert fuer 100% setzen
            aEd1.SetRefValue(nTotalWish);
            aEd2.SetRefValue(nTotalWish);
            aEd3.SetRefValue(nTotalWish);
            aDistEd1.SetRefValue(nTotalWish);
            aDistEd2.SetRefValue(nTotalWish);

            // Auf %-Darstellung umschalten
            bPercent = TRUE;
        }
        else
            bPercent = FALSE;

        aEd1.ShowPercent(bPercent);
        aEd2.ShowPercent(bPercent);
        aEd3.ShowPercent(bPercent);
        aDistEd1.ShowPercent(bPercent);
        aDistEd2.ShowPercent(bPercent);
        aDistEd1.MetricField::SetMin(0);
        aDistEd2.MetricField::SetMin(0);
    }
    Update();
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



int SwColumnPage::DeactivatePage(SfxItemSet *pSet)
{
    if(pSet)
        FillItemSet(*pSet);

    return TRUE;
}



USHORT* SwColumnPage::GetRanges()
{
    return aPageRg;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



IMPL_LINK( SwColumnPage, SetDefaultsHdl, ValueSet *, pVS )
{
    USHORT nItem = pVS->GetSelectItemId();
    if( nItem < 4 )
    {
        aCLNrEdt.SetValue( nItem );
        aAutoWidthBox.Check();
        aDistEd1.SetValue(0);
        ColModify(0);
    }
    else
    {
        bLockUpdate = TRUE;
        aCLNrEdt.SetValue( 2 );
        aAutoWidthBox.Check(FALSE);
        aDistEd1.SetValue(0);
        ColModify(0);
        // jetzt noch das Breitenverhaeltnisse auf 2 : 1 bzw. 1 : 2 stellen
        USHORT nSmall = pColMgr->GetActualSize()  / 3;
        if(nItem == 4)
        {
            aEd2.SetValue(aEd2.Normalize(long(nSmall)), FUNIT_TWIP);
            pModifiedField = &aEd2;
        }
        else
        {
            aEd1.SetValue(aEd1.Normalize(long(nSmall)), FUNIT_TWIP);
            pModifiedField = &aEd1;
        }
        bLockUpdate = FALSE;
        Timeout(0);

    }
    return 0;
}

/*-----------------25.10.96 11.41-------------------

--------------------------------------------------*/


void SwColumnPage::SetFrmMode(BOOL bMod)
{
    bFrm = bMod;
}

/*-----------------07.03.97 08.33-------------------

--------------------------------------------------*/


void ColumnValueSet::UserDraw( const UserDrawEvent& rUDEvt )
{
    OutputDevice*  pDev = rUDEvt.GetDevice();
    Rectangle aRect = rUDEvt.GetRect();
    USHORT  nItemId = rUDEvt.GetItemId();
    long nRectWidth = aRect.GetWidth();
    long nRectHeight = aRect.GetHeight();

    Point aBLPos = aRect.TopLeft();
    Color aOldLineColor = pDev->GetLineColor();
    pDev->SetLineColor(Color(COL_BLACK));

    long nStep = Abs(Abs(nRectHeight * 95 /100) / 11);
    long nTop = (nRectHeight - 11 * nStep ) / 2;
    USHORT nCols;
    long nStarts[3];
    long nEnds[3];
    nStarts[0] = nRectWidth * 10 / 100;
    switch( nItemId )
    {
        case 1:
            nEnds[0] = nRectWidth * 9 / 10;
            nCols = 1;
        break;
        case 2: nCols = 2;
            nEnds[0] = nRectWidth * 45 / 100;
            nStarts[1] = nEnds[0] + nStep;
            nEnds[1] = nRectWidth * 9 / 10;
        break;
        case 3: nCols = 3;
            nEnds[0]    = nRectWidth * 30 / 100;
            nStarts[1]  = nEnds[0] + nStep;
            nEnds[1]    = nRectWidth * 63 / 100;
            nStarts[2]  = nEnds[1] + nStep;
            nEnds[2]    = nRectWidth * 9 / 10;
        break;
        case 4: nCols = 2;
            nEnds[0] = nRectWidth * 63 / 100;
            nStarts[1] = nEnds[0] + nStep;
            nEnds[1] = nRectWidth * 9 / 10;
        break;
        case 5: nCols = 2;
            nEnds[0] = nRectWidth * 30 / 100;
            nStarts[1] = nEnds[0] + nStep;
            nEnds[1] = nRectWidth * 9 / 10;
        break;
    }
    for(USHORT j = 0; j < nCols; j++ )
    {
        Point aStart(aBLPos.X() + nStarts[j], 0);
        Point aEnd(aBLPos.X() + nEnds[j], 0);
        for( USHORT i = 0; i < 12; i ++)
        {
            aStart.Y() = aEnd.Y() = aBLPos.Y() + nTop + i * nStep;
            pDev->DrawLine(aStart, aEnd);
        }
    }
    pDev->SetLineColor(aOldLineColor);
}

/*-----------------07.03.97 08.48-------------------

--------------------------------------------------*/


ColumnValueSet::~ColumnValueSet()
{
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.156  2000/09/18 16:05:32  willem.vandorp
    OpenOffice header added.

    Revision 1.155  2000/09/05 10:38:24  kz
    chg. SetWinStyle/GetWinStyle to SetStyle/GetStyle

    Revision 1.154  2000/08/15 15:46:54  os
    #77635# set accelerator at last character

    Revision 1.153  2000/07/26 16:26:29  jp
    Bug #77158#: call InsertRegionDialog with the complete Itemset

    Revision 1.152  2000/05/23 18:48:10  jp
    Bugfixes for Unicode

    Revision 1.151  2000/03/03 15:17:01  os
    StarView remainders removed

    Revision 1.150  2000/01/07 15:32:20  ama
    Fix #71411#: NoBalanced columns

    Revision 1.149  2000/01/04 15:36:29  os
    #71411# balanced columns

    Revision 1.148  1999/10/22 11:41:23  os
    #69058# ListBox entries: selected sections only if more than one section is selected

    Revision 1.147  1999/09/06 18:16:32  jp
    Insert into the LineTypeBox twip values and set the Source- & Unit

    Revision 1.146  1999/06/10 16:39:56  JP
    new: Change columns for selected Pages or Sections


      Rev 1.145   10 Jun 1999 18:39:56   JP
   new: Change columns for selected Pages or Sections

      Rev 1.144   27 May 1999 13:02:26   OS
   Einf?gen/Bearbeiten von Spalten ueberarbeitet

      Rev 1.143   05 Mar 1999 10:30:08   OS
   #62854# ModifyHdl nur im Up/Down/LoseFocus, kein Timer

      Rev 1.142   12 Oct 1998 17:21:32   OM
   #57749# UI fuer spaltige Bereiche

      Rev 1.141   08 Sep 1998 16:56:54   OS
   #56134# Metric fuer Text und HTML getrennt

      Rev 1.140   12 May 1998 12:29:34   OS
   GapModify return wenn Spaltenzahl < 2 #50218#

      Rev 1.139   24 Apr 1998 11:05:50   OS
   Spalten in Rahmenvorlagen nur relativ

      Rev 1.138   08 Apr 1998 13:55:24   OS
   ein cast an der falschen Stelle

      Rev 1.137   06 Apr 1998 09:49:20   OS
   Warnungen beseitigt

      Rev 1.136   28 Nov 1997 19:30:32   MA
   includes

      Rev 1.135   24 Nov 1997 17:40:10   MA
   include

      Rev 1.134   03 Nov 1997 13:19:48   MA
   precomp entfernt

      Rev 1.133   02 Sep 1997 14:41:42   OS
   LineListBox fuer VCL

      Rev 1.132   01 Sep 1997 13:26:24   OS
   DLL-Umstellung

      Rev 1.131   12 Aug 1997 15:58:08   OS
   frmitems/textitem/paraitem aufgeteilt

      Rev 1.130   08 Aug 1997 17:26:38   OM
   Headerfile-Umstellung

      Rev 1.129   07 Aug 1997 14:59:06   OM
   Headerfile-Umstellung

      Rev 1.128   07 Mar 1997 09:35:28   OS
   Spaltenbeispiel mit UserDraw

      Rev 1.127   20 Feb 1997 19:20:24   HJS
   header umgestellt

      Rev 1.126   28 Jan 1997 16:31:52   OS
   HtmlMode mit GetHtmlMode ermitteln

      Rev 1.125   08 Jan 1997 11:00:26   OS
   SID_HTML_MODE jetzt UInt16Item

      Rev 1.124   11 Dec 1996 10:24:06   MA
   Warnings

      Rev 1.123   02 Dec 1996 11:42:22   OS
   GapModify mit PercentField

      Rev 1.122   22 Nov 1996 09:52:16   OS
   ValueSet deselektieren, wenn sich die Spaltenzahl aendert

      Rev 1.121   21 Nov 1996 11:53:56   OS
   Umrandungsabstand beruecksichtigen

      Rev 1.120   11 Nov 1996 10:44:16   MA
   ResMgr

      Rev 1.119   08 Nov 1996 14:07:24   OS
   div. Bugs behoben

      Rev 1.118   25 Oct 1996 14:55:36   OS
   neues Spaltenbeispiel ohne Seite

      Rev 1.117   24 Oct 1996 17:57:40   OS
   Rahmendialog mit unterschiedlichen Spaltenabstaenden

      Rev 1.116   18 Oct 1996 16:14:40   HJS
   includes

      Rev 1.115   11 Oct 1996 12:06:28   OS
   Aenderungen fuer HTML-Mode

      Rev 1.114   02 Oct 1996 17:36:18   MA
   Umstellung Enable/Disable

      Rev 1.113   11 Sep 1996 15:09:32   OM
   Rahmenspalten

      Rev 1.112   10 Sep 1996 17:00:44   OM
   Prozentuale Rahmen

      Rev 1.111   09 Sep 1996 16:57:04   OM
   Prozentuale Spalten

      Rev 1.110   06 Sep 1996 14:15:18   OM
   #31010# GPF bei fehlenden Groessenangaben behoben

      Rev 1.109   28 Aug 1996 11:52:52   OS
   includes

      Rev 1.108   12 Aug 1996 14:04:08   OS
   Registerhaltigkeit abschaltbar ...

      Rev 1.107   10 Aug 1996 14:59:24   OS
   FixedTexts immer mit enablen/disablen

      Rev 1.106   31 Jul 1996 14:45:58   OS
   im Html-Mode nur autom. Spaltenbreite

      Rev 1.105   27 Jul 1996 10:52:58   OS
   RegisterItem benutzen

------------------------------------------------------------------------*/



diff --git a/sw/source/ui/frmdlg/column.hrc b/sw/source/ui/frmdlg/column.hrc
new file mode 100644
index 0000000..1ba3aad
--- /dev/null
+++ b/sw/source/ui/frmdlg/column.hrc
@@ -0,0 +1,117 @@
/*************************************************************************
 *
 *  $RCSfile: column.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:37 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#define FT_NUMBER       1
#define ED_NUMBER       2
#define FT_DISTANCE     3
#define ED_DISTANCE     4
#define CB_AUTO_WIDTH   4
#define GB_COLUMNS      6

#define FT_1            20
#define FT_2            21
#define FT_3            22


#define ED_1            25
#define ED_2            26
#define ED_3            27


#define BTN_UP          30
#define BTN_DOWN        31
#define GB_LAYOUT       32

#define FT_STYLE        33
#define LB_STYLE        34
#define FT_HEIGHT       35
#define ED_HEIGHT       36
#define FT_POSITION     37
#define LB_POSITION     38
#define GB_LINETYPE     39


#define GB_BSP          40
#define WN_BSP          41
#define LB_REFERENCE        42
#define CB_REGISTER             43
#define GB_REGISTER             44
#define FT_REFERENCE        45

#define ED_DIST1                46
#define ED_DIST2                47

#define FT_WIDTH                49
#define FT_DIST                 50
#define VS_DEFAULTS             51
#define IL_PRE_COLS             52

#define FT_APPLY_TO             53
#define LB_APPLY_TO             54
#define PB_HELP                 55
#define PB_CANCEL               56
#define PB_OK                   57
#define CB_BALANCECOLS          58

#define LISTBOX_SELECTION       0
#define LISTBOX_SECTION         1
#define LISTBOX_SECTIONS        2
#define LISTBOX_PAGE            3
#define LISTBOX_FRAME           4
diff --git a/sw/source/ui/frmdlg/column.src b/sw/source/ui/frmdlg/column.src
new file mode 100644
index 0000000..c579231
--- /dev/null
+++ b/sw/source/ui/frmdlg/column.src
@@ -0,0 +1,1145 @@
/*************************************************************************
 *
 *  $RCSfile: column.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:37 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "globals.hrc"
#include "column.hrc"
#include "frmui.hrc"
#include "cmdid.h"
#include "helpid.h"
 // #define TP_COLUMN 256
TabPage TP_COLUMN
{
    HelpID = HID_COLUMN ;
        Hide = TRUE;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Text = "Spalten" ;          // Dieser Text ist fuer den SingleTabDialog bestimmt!
    Text [ ENGLISH ] = "Columns" ;
    Text [ norwegian ] = "Kolonner" ;
    Text [ italian ] = "Colonne" ;
    Text [ portuguese_brazilian ] = "Colunas" ;
    Text [ portuguese ] = "Colunas" ;
    Text [ finnish ] = "Sarakkeet" ;
    Text [ danish ] = "Kolonner" ;
    Text [ french ] = "Colonnes" ;
    Text [ swedish ] = "Kolumner" ;
    Text [ dutch ] = "Kolommen" ;
    Text [ spanish ] = "Columnas" ;
    Text [ english_us ] = "Columns" ;
    FixedText FT_NUMBER
    {
        Pos = MAP_APPFONT ( 11 , 16 ) ;
        Size = MAP_APPFONT ( 28 , 10 ) ;
        Text = "~Anzahl" ;
        Text [ ENGLISH ] = "~Num." ;
        Text [ norwegian ] = "~Num." ;
        Text [ italian ] = "~Num." ;
        Text [ portuguese_brazilian ] = "~N£m." ;
        Text [ portuguese ] = "~Quantidade" ;
        Text [ finnish ] = "~Määrä" ;
        Text [ danish ] = "Antal" ;
        Text [ french ] = "~Nombre" ;
        Text [ swedish ] = "~Antal" ;
        Text [ dutch ] = "~Aantal" ;
        Text [ spanish ] = "~Cantidad" ;
        Text [ english_us ] = "~Amount" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "ÊýÄ¿(~A)";
        Text[ russian ] = "×èñëî";
        Text[ polish ] = "Liczba";
        Text[ japanese ] = "’i”(~A)";
        Text[ chinese_traditional ] = "¼Æ¥Ø(~A)";
        Text[ arabic ] = "ÇáÚÏÏ";
        Text[ dutch ] = "~Aantal";
        Text[ chinese_simplified ] = "ÊýÄ¿(~A)";
        Text[ greek ] = "~Áñéèìüò";
        Text[ korean ] = "¾ç(~A)";
        Text[ language_user1 ] = " ";
        Text[ turkish ] = "S~ayý";
    };
    NumericField ED_NUMBER
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 11 , 28 ) ;
        Size = MAP_APPFONT ( 24 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 1 ;
        Maximum = 20 ;
        Value = 1 ;
        First = 1 ;
        Last = 20 ;
        SpinSize = 1 ;
    };
    Control VS_DEFAULTS
    {
        Pos = MAP_APPFONT ( 50 , 12 ) ;
        Size = MAP_APPFONT ( 110 , 28 ) ;
        TabStop = TRUE ;
    };
    CheckBox CB_BALANCECOLS
    {
        Pos = MAP_APPFONT ( 11 , 43 ) ;
        Size = MAP_APPFONT ( 150 , 10 ) ;
        Text = "~Spalten ausgleichen" ;
        Text [ ENGLISH ] = "Balance columns" ;
        Hide = TRUE;
        Text[ english_us ] = "~Balance columns";
        Text[ portuguese ] = "Optimizar ~colunas";
        Text[ russian ] = "Âûðîâíÿòü êîëîíêè";
        Text[ greek ] = "Åîé~óïññüðçóç óôçëþí";
        Text[ dutch ] = "~Kolommen uitbalanceren";
        Text[ french ] = "Optimiser les ~colonnes";
        Text[ spanish ] = "~Optimar columnas";
        Text[ italian ] = "Ottimizza colonne";
        Text[ danish ] = "Udjævn kolonner";
        Text[ swedish ] = "~Jämna ut kolumner";
        Text[ polish ] = "~Wyrównaj kolumny";
        Text[ portuguese_brazilian ] = "Balance columns";
        Text[ japanese ] = "’i‚Ì•‚ð‚·‚×‚Ä“¯‚¶‚É‚·‚é(~B)";
        Text[ korean ] = "´Ü ±æÀÌ Á¶Á¤(~B)";
        Text[ chinese_simplified ] = "Эµ÷À¸";
        Text[ chinese_traditional ] = "Äæ¦P¨B¤Æ";
        Text[ arabic ] = "ÃÚãÏÉ ãÊÓÇæíÉ";
        Text[ turkish ] = "S~ütunlarý dengele";
    };
    GroupBox GB_COLUMNS
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 157 , 53 ) ;
        Text = "Spalten" ;
        Text [ ENGLISH ] = "Columns" ;
        Text [ norwegian ] = "Kolonner" ;
        Text [ italian ] = "Colonne" ;
        Text [ portuguese_brazilian ] = "Colunas" ;
        Text [ portuguese ] = "Colunas" ;
        Text [ finnish ] = "Sarakkeet" ;
        Text [ danish ] = "Kolonner" ;
        Text [ french ] = "Colonnes" ;
        Text [ swedish ] = "Kolumner" ;
        Text [ dutch ] = "Kolommen" ;
        Text [ spanish ] = "Columnas" ;
        Text [ english_us ] = "Columns" ;
        Text[ chinese_simplified ] = "À¸";
        Text[ russian ] = "Êîëîíêè";
        Text[ polish ] = "Kolumny";
        Text[ japanese ] = "’i‘g‚Ý";
        Text[ chinese_traditional ] = "Äæ";
        Text[ arabic ] = "ÇáÃÚãÏÉ";
        Text[ dutch ] = "Kolommen";
        Text[ chinese_simplified ] = "À¸";
        Text[ greek ] = "ÓôÞëåò";
        Text[ korean ] = "¿­";
        Text[ language_user1 ] = " ";
        Text[ turkish ] = "Sütun";
    };
    FixedText FT_STYLE
    {
        Pos = MAP_APPFONT ( 180 , 70 ) ;
        Size = MAP_APPFONT ( 18 , 10 ) ;
        Text = "A~rt" ;
        Text [ ENGLISH ] = "~Style" ;
        Text [ norwegian ] = "~Style" ;
        Text [ italian ] = "~Stile" ;
        Text [ portuguese_brazilian ] = "~Estilo" ;
        Text [ portuguese ] = "~Estilo" ;
        Text [ finnish ] = "~Tyyli" ;
        Text [ danish ] = "Type" ;
        Text [ french ] = "~Type" ;
        Text [ swedish ] = "~Typ" ;
        Text [ dutch ] = "~Type" ;
        Text [ spanish ] = "~Tipo" ;
        Text [ english_us ] = "~Line" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "ÀàÐÍ(~L)";
        Text[ russian ] = "Òèï";
        Text[ polish ] = "Typ";
        Text[ japanese ] = "Ží—Þ(~L)";
        Text[ chinese_traditional ] = "Ãþ«¬(~L)";
        Text[ arabic ] = "ÇáäæÚ";
        Text[ dutch ] = "~Type";
        Text[ chinese_simplified ] = "ÀàÐÍ(~L)";
        Text[ greek ] = "Ôý~ðïò";
        Text[ korean ] = "¼±(~L)";
        Text[ language_user1 ] = " ";
        Text[ turkish ] = "T~ür";
    };
    ListBox LB_STYLE
    {
        Pos = MAP_APPFONT ( 211 , 69 ) ;
        Size = MAP_APPFONT ( 40 , 66 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        StringList =
        {
            < "Keine" ; Default ; > ;
        };
        StringList [ ENGLISH ] =
        {
            < "Keine" ; Default ; > ;
        };
        StringList [ norwegian ] =
        {
            < "Keine" ; Default ; > ;
        };
        StringList [ italian ] =
        {
            < "Senza" ; Default ; > ;
        };
        StringList [ portuguese_brazilian ] =
        {
            < "Nenhum" ; Default ; > ;
        };
        StringList [ portuguese ] =
        {
            < "Nenhum" ; Default ; > ;
        };
        StringList [ finnish ] =
        {
            < "Keine" ; Default ; > ;
        };
        StringList [ danish ] =
        {
            < "Ingen" ; Default ; > ;
        };
        StringList [ french ] =
        {
            < "Aucun(e)" ; Default ; > ;
        };
        StringList [ swedish ] =
        {
            < "Ingen" ; Default ; > ;
        };
        StringList [ dutch ] =
        {
            < "Geen" ; Default ; > ;
        };
        StringList [ spanish ] =
        {
            < "Ninguno" ; Default ; > ;
        };
        StringList [ english_us ] =
        {
            < "None" ; Default ; > ;
        };
    StringList [ chinese_simplified ] =
    {
             < "ÎÞ" ; Default ; > ;
    };
    StringList [ russian ] =
    {
             < "Áåç" ; Default ; > ;
    };
    StringList [ polish ] =
    {
             < "Brak" ; Default ; > ;
    };
    StringList [ japanese ] =
    {
             < "‚È‚µ" ; Default ; > ;
    };
    StringList [ language_user1 ] =
    {
             < " " ; Default ; > ;
    };
    StringList [ chinese_traditional ] =
    {
             < "µL" ; Default ; > ;
    };
    StringList [ arabic ] =
    {
             < "ÈÏæä" ; Default ; > ;
    };
    StringList [ dutch ] =
    {
             < "Geen" ; Default ; > ;
    };
    StringList [ chinese_simplified ] =
    {
             < "ÎÞ" ; Default ; > ;
    };
    StringList [ greek ] =
    {
             < "ÊáíÝíá" ; Default ; > ;
    };
    StringList [ korean ] =
    {
             < "¾øÀ½" ; Default ; > ;
    };
    StringList [ turkish ] =
    {
             < "Yok" ; Default ; > ;
    };
    };
    FixedText FT_HEIGHT
    {
        Pos = MAP_APPFONT ( 180 , 90 ) ;
        Size = MAP_APPFONT ( 22 , 10 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? Höh~e : H÷h~e */
        Text = "Höh~e" ;
        Text [ ENGLISH ] = "Hei~ght" ;
        Text [ norwegian ] = "Hei~ght" ;
        Text [ italian ] = "Altezza" ;
        Text [ portuguese_brazilian ] = "Altu~ra" ;
        Text [ portuguese ] = "Altu~ra" ;
        Text [ finnish ] = "~Korkeus" ;
        Text [ danish ] = "Højde" ;
        Text [ french ] = "~Hauteur" ;
        Text [ swedish ] = "Hö~jd" ;
        Text [ dutch ] = "~Hoogte" ;
        Text [ spanish ] = "A~ltura" ;
        Text [ english_us ] = "~Height" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "¸ß(~H)";
        Text[ russian ] = "Âûñîòà";
        Text[ polish ] = "Wys.";
        Text[ japanese ] = "‚‚³(~H)";
        Text[ chinese_traditional ] = "°ª(~H)";
        Text[ arabic ] = "ÇáÇÑÊÝÇÚ";
        Text[ dutch ] = "~Hoogte";
        Text[ chinese_simplified ] = "¸ß(~H)";
        Text[ greek ] = "¾øïò";
        Text[ korean ] = "³ôÀÌ(~H)";
        Text[ language_user1 ] = " ";
        Text[ turkish ] = "~Yüks.";
    };
    MetricField ED_HEIGHT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 211 , 89 ) ;
        Size = MAP_APPFONT ( 36 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 25 ;
        Maximum = 100 ;
        Value = 100 ;
        Unit = FUNIT_CUSTOM ;
        CustomUnitText = "%" ;
        First = 25 ;
        Last = 100 ;
    };
    FixedText FT_POSITION
    {
        Pos = MAP_APPFONT ( 180 , 110 ) ;
        Size = MAP_APPFONT ( 30 , 10 ) ;
        Text = "~Position" ;
        Text [ English ] = "~Position" ;
        Left = TRUE ;
        Text [ portuguese ] = "~Posição" ;
        Text [ english_us ] = "~Position" ;
        Text [ portuguese_brazilian ] = "~Position" ;
        Text [ swedish ] = "~Position" ;
        Text [ danish ] = "Placering" ;
        Text [ italian ] = "~Posizione" ;
        Text [ spanish ] = "~Posición" ;
        Text [ french ] = "~Position" ;
        Text [ dutch ] = "~Positie" ;
        Text[ chinese_simplified ] = "λÖÃ(~P)";
        Text[ russian ] = "Ïîçèöèÿ";
        Text[ polish ] = "Pozycja";
        Text[ japanese ] = "ˆÊ’u(~P)";
        Text[ chinese_traditional ] = "¦ì¸m(~P)";
        Text[ arabic ] = "ÇáãæÖÚ";
        Text[ dutch ] = "~Positie";
        Text[ chinese_simplified ] = "λÖÃ(~P)";
        Text[ greek ] = "ÈÝóç";
        Text[ korean ] = "À§Ä¡(~P)";
        Text[ language_user1 ] = " ";
        Text[ turkish ] = "~Konum";
    };
    ListBox LB_POSITION
    {
        Pos = MAP_APPFONT ( 211 , 109 ) ;
        Size = MAP_APPFONT ( 40 , 40 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        StringList =
        {
            < "Oben" ; Default ; > ;
            < "Zentriert" ; Default ; > ;
            < "Unten" ; Default ; > ;
        };
        StringList [ ENGLISH ] =
        {
            < "Oben" ; Default ; > ;
            < "Zentriert" ; Default ; > ;
            < "Unten" ; Default ; > ;
        };
        StringList [ norwegian ] =
        {
            < "Oben" ; Default ; > ;
            < "Zentriert" ; Default ; > ;
            < "Unten" ; Default ; > ;
        };
        StringList [ italian ] =
        {
            < "In alto" ; Default ; > ;
            < "Al centro" ; Default ; > ;
            < "In basso" ; Default ; > ;
        };
        StringList [ portuguese_brazilian ] =
        {
            < "Oben" ; Default ; > ;
            < "Zentriert" ; Default ; > ;
            < "Base" ; Default ; > ;
        };
        StringList [ portuguese ] =
        {
            < "Em cima" ; Default ; > ;
            < "Centrado" ; Default ; > ;
            < "Em baixo" ; Default ; > ;
        };
        StringList [ finnish ] =
        {
            < "Oben" ; Default ; > ;
            < "Zentriert" ; Default ; > ;
            < "Unten" ; Default ; > ;
        };
        StringList [ danish ] =
        {
            < "Foroven" ; Default ; > ;
            < "Centreret" ; Default ; > ;
            < "Forneden" ; Default ; > ;
        };
        StringList [ french ] =
        {
            < "En haut" ; Default ; > ;
            < "Centré" ; Default ; > ;
            < "En bas" ; Default ; > ;
        };
        StringList [ swedish ] =
        {
            < "Uppe" ; Default ; > ;
            < "Centrerat" ; Default ; > ;
            < "Nere" ; Default ; > ;
        };
        StringList [ dutch ] =
        {
            < "Boven" ; Default ; > ;
            < "Gecentreerd" ; Default ; > ;
            < "Beneden" ; Default ; > ;
        };
        StringList [ spanish ] =
        {
            < "Arriba" ; Default ; > ;
            < "Centrado" ; Default ; > ;
            < "Abajo" ; Default ; > ;
        };
        StringList [ english_us ] =
        {
            < "Top" ; Default ; > ;
            < "Centered" ; Default ; > ;
            < "Bottom" ; Default ; > ;
        };
    StringList [ chinese_simplified ] =
    {
            < "ÉÏ" ; Default ; > ;
        < "¾ÓÖÐ" ; Default ; > ;
        < "ÏÂ" ; Default ; > ;
    };
    StringList [ russian ] =
    {
            < "Ââåðõó" ; Default ; > ;
        < "Ïî öåíòðó" ; Default ; > ;
        < "Âíèçó" ; Default ; > ;
    };
    StringList [ polish ] =
    {
            < "Na górze" ; Default ; > ;
        < "Wyœrodkowany" ; Default ; > ;
        < "Na dole" ; Default ; > ;
    };
    StringList [ japanese ] =
    {
            < "ã" ; Default ; > ;
        < "’†‰›" ; Default ; > ;
        < "‰º" ; Default ; > ;
    };
    StringList [ chinese_traditional ] =
    {
            < "¤W" ; Default ; > ;
        < "¸m¤¤" ; Default ; > ;
        < "¤U" ; Default ; > ;
    };
    StringList [ arabic ] =
    {
            < "ÃÚáì" ; Default ; > ;
        < "ãÊæÓØ" ; Default ; > ;
        < "ÃÓÝá" ; Default ; > ;
    };
    StringList [ dutch ] =
    {
            < "Boven" ; Default ; > ;
        < "Gecentreerd" ; Default ; > ;
        < "Beneden" ; Default ; > ;
    };
    StringList [ chinese_simplified ] =
    {
            < "ÉÏ" ; Default ; > ;
        < "¾ÓÖÐ" ; Default ; > ;
        < "ÏÂ" ; Default ; > ;
    };
    StringList [ greek ] =
    {
            < "ÐÜíù" ; Default ; > ;
        < "ÊåíôñáñéóìÝíá" ; Default ; > ;
        < "ÊÜôù" ; Default ; > ;
    };
    StringList [ korean ] =
    {
            < "ˤ" ; Default ; > ;
        < "°¡¿îµ¥" ; Default ; > ;
        < "¾Æ·¡" ; Default ; > ;
    };
    StringList [ language_user1 ] =
    {
            < " " ; Default ; > ;
        < " " ; Default ; > ;
        < " " ; Default ; > ;
    };
    StringList [ turkish ] =
    {
            < "Üst" ; Default ; > ;
        < "Orta" ; Default ; > ;
        < "Alt" ; Default ; > ;
    };
    };
    GroupBox GB_LINETYPE
    {
        Pos = MAP_APPFONT ( 171 , 49 ) ;
        Size = MAP_APPFONT ( 83 , 80 ) ;
        Text = "Trennlinie" ;
        Text [ ENGLISH ] = "Lines between" ;
        Text [ norwegian ] = "Lines between" ;
        Text [ italian ] = "Linea di separazione" ;
        Text [ portuguese_brazilian ] = "Linhas entre" ;
        Text [ portuguese ] = "Separador" ;
        Text [ finnish ] = "Rivejä välissä" ;
        Text [ danish ] = "Separator" ;
        Text [ french ] = "Trait de séparation" ;
        Text [ swedish ] = "Skiljelinje" ;
        Text [ dutch ] = "Scheidingslijn" ;
        Text [ spanish ] = "Línea de separación" ;
        Text [ english_us ] = "Separator" ;
        Text[ chinese_simplified ] = "·Ö¸ôÏß";
        Text[ russian ] = "Ðàçäåëèòåëüíàÿ ëèíèÿ";
        Text[ polish ] = "Separator";
        Text[ japanese ] = "‹«ŠEü‚ðˆø‚­";
        Text[ chinese_traditional ] = "¤À¹j½u";
        Text[ arabic ] = "ÇáÎØ ÇáÝÇÕá";
        Text[ dutch ] = "Scheidingslijn";
        Text[ chinese_simplified ] = "·Ö¸ôÏß";
        Text[ greek ] = "Äéá÷ùñéóôéêÞ ãñáììÞ";
        Text[ korean ] = "±¸ºÐÀÚ";
        Text[ language_user1 ] = " ";
        Text[ turkish ] = "Ayýrma çizgisi";
    };
    FixedText FT_WIDTH
    {
        Pos = MAP_APPFONT ( 12 , 86 ) ;
        Size = MAP_APPFONT ( 27 , 10 ) ;
        Text = "Breite" ;
        Text [ English ] = "Width" ;
        Left = TRUE ;
        Text [ dutch ] = "Breedte" ;
        Text [ english_us ] = "Width" ;
        Text [ italian ] = "Larghezza" ;
        Text [ spanish ] = "Ancho" ;
        Text [ french ] = "Largeur" ;
        Text [ swedish ] = "Bredd" ;
        Text [ danish ] = "Bredde" ;
        Text [ portuguese ] = "Largura" ;
        Text [ portuguese_brazilian ] = "Breite" ;
        Text[ chinese_simplified ] = "¿í";
        Text[ russian ] = "Øèðèíà";
        Text[ polish ] = "Szer.";
        Text[ japanese ] = "’i‚Ì•";
        Text[ chinese_traditional ] = "¼e";
        Text[ arabic ] = "ÇáÚÑÖ";
        Text[ dutch ] = "Breedte";
        Text[ chinese_simplified ] = "¿í";
        Text[ greek ] = "ÐëÜôïò";
        Text[ korean ] = "³Êºñ";
        Text[ language_user1 ] = " ";
        Text[ turkish ] = "Geniþlik";
    };
    FixedText FT_DIST
    {
        Pos = MAP_APPFONT ( 12 , 103 ) ;
        Size = MAP_APPFONT ( 45 , 10 ) ;
        Text = "Abstand" ;
        Text [ English ] = "Distance" ;
        Left = TRUE ;
        Text [ dutch ] = "Afstand" ;
        Text [ english_us ] = "Spacing" ;
        Text [ italian ] = "Distanza" ;
        Text [ spanish ] = "Espacio" ;
        Text [ french ] = "Écart" ;
        Text [ swedish ] = "Avstånd" ;
        Text [ danish ] = "Afstand" ;
        Text [ portuguese ] = "Espaçamento" ;
        Text [ portuguese_brazilian ] = "Abstand" ;
        Text[ chinese_simplified ] = "¼ä¸ô";
        Text[ russian ] = "Èíòåðâàë";
        Text[ polish ] = "Odstêp";
        Text[ japanese ] = "ŠÔŠu";
        Text[ chinese_traditional ] = "¶¡¹j";
        Text[ arabic ] = "ÇáÊÈÇÚÏ";
        Text[ dutch ] = "Afstand";
        Text[ chinese_simplified ] = "¼ä¸ô";
        Text[ greek ] = "Áðüóôáóç";
        Text[ korean ] = "°£°Ý";
        Text[ language_user1 ] = " ";
        Text[ turkish ] = "Aralýk";
    };
    CheckBox CB_AUTO_WIDTH
    {
        Pos = MAP_APPFONT ( 12 , 117 ) ;
        Size = MAP_APPFONT ( 75 , 10 ) ;
        Text = "A~utomatische Breite" ;
        Text [ ENGLISH ] = "Automatic ~width" ;
        Text [ norwegian ] = "Automatic ~width" ;
        Text [ italian ] = "~Larghezza autom." ;
        Text [ portuguese_brazilian ] = "Autom tica ~largura" ;
        Text [ portuguese ] = "~Largura automática" ;
        Text [ finnish ] = "Automaattinen ~leveys" ;
        Text [ danish ] = "Automatisk bredde" ;
        Text [ french ] = "~Largeur automatique" ;
        Text [ swedish ] = "A~utomatisk bredd" ;
        Text [ dutch ] = "A~utomatische breedte" ;
        Text [ spanish ] = "Ancho ~automático" ;
        Text [ english_us ] = "Auto~Width" ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "×Ô¶¯µ÷Õû¿í¶È(~W)";
        Text[ russian ] = "Àâòîì. øèðèíà";
        Text[ polish ] = "Automatyczna szerokoϾ";
        Text[ japanese ] = "•Ž©“®’²®(~W)";
        Text[ chinese_traditional ] = "¦Û°Ê½Õ¾ã¼e«×(~W)";
        Text[ arabic ] = "ÚÑÖ ÊáÞÇÆí";
        Text[ dutch ] = "A~utomatische breedte";
        Text[ chinese_simplified ] = "×Ô¶¯µ÷Õû¿í¶È(~W)";
        Text[ greek ] = "Áõôüìáôï ðëÜôïò";
        Text[ korean ] = "ÀÚµ¿ ³Êºñ(~W)";
        Text[ language_user1 ] = " ";
        Text[ turkish ] = "O~tomatik geniþlik";
    };
    ImageButton BTN_UP
    {
        Disable = TRUE ;
        Pos = MAP_APPFONT ( 145 , 69 ) ;
        Size = MAP_APPFONT ( 10 , 10 ) ;
        TabStop = TRUE ;
        SYMBOL = IMAGEBUTTON_ARROW_RIGHT ;
    };
    ImageButton BTN_DOWN
    {
        Disable = TRUE ;
        Pos = MAP_APPFONT ( 40 , 69 ) ;
        Size = MAP_APPFONT ( 10 , 10 ) ;
        TabStop = TRUE ;
        SYMBOL = IMAGEBUTTON_ARROW_LEFT ;
    };
    FixedText FT_1
    {
        Pos = MAP_APPFONT ( 55 , 69 ) ;
        Size = MAP_APPFONT ( 9 , 8 ) ;
        Text = "~1" ;
        Left = TRUE ;
        Center = TRUE ;
        Right = TRUE ;
    };
    FixedText FT_2
    {
        Pos = MAP_APPFONT ( 90 , 69 ) ;
        Size = MAP_APPFONT ( 9 , 8 ) ;
        Text = "~2" ;
        Left = TRUE ;
        Right = TRUE ;
    };
    FixedText FT_3
    {
        Pos = MAP_APPFONT ( 125 , 69 ) ;
        Size = MAP_APPFONT ( 9 , 8 ) ;
        Text = "~3" ;
        Left = TRUE ;
        Right = TRUE ;
    };
    MetricField ED_1
    {
        Disable = TRUE ;
        Border = TRUE ;
        Pos = MAP_APPFONT ( 40 , 84 ) ;
        Size = MAP_APPFONT ( 35 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 1 ;
        Maximum = 5600 ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        First = 10 ;
        Last = 5600 ;
        SpinSize = 10 ;
    };
    MetricField ED_2
    {
        Disable = TRUE ;
        Border = TRUE ;
        Pos = MAP_APPFONT ( 80 , 84 ) ;
        Size = MAP_APPFONT ( 35 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 1 ;
        Maximum = 5600 ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        First = 10 ;
        Last = 5600 ;
        SpinSize = 10 ;
    };
    MetricField ED_3
    {
        Disable = TRUE ;
        Border = TRUE ;
        Pos = MAP_APPFONT ( 120 , 84 ) ;
        Size = MAP_APPFONT ( 35 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 1 ;
        Maximum = 5600 ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        First = 10 ;
        Last = 5600 ;
        SpinSize = 10 ;
    };
    MetricField ED_DIST1
    {
        Disable = TRUE ;
        Border = TRUE ;
        Pos = MAP_APPFONT ( 60 , 101 ) ;
        Size = MAP_APPFONT ( 35 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 0 ;
        Maximum = 5600 ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        First = 10 ;
        Last = 5600 ;
        SpinSize = 10 ;
    };
    MetricField ED_DIST2
    {
        Disable = TRUE ;
        Border = TRUE ;
        Pos = MAP_APPFONT ( 100 , 101 ) ;
        Size = MAP_APPFONT ( 35 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 0 ;
        Maximum = 5600 ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        First = 10 ;
        Last = 5600 ;
        SpinSize = 10 ;
    };
    GroupBox GB_LAYOUT
    {
        Pos = MAP_APPFONT ( 6 , 59 ) ;
        Size = MAP_APPFONT ( 157 , 70 ) ;
        Text = "Spaltenbreite" ;
        Text [ ENGLISH ] = "Column width" ;
        Text [ norwegian ] = "Bredde på kolonne " ;
        Text [ italian ] = "Larghezza colonna" ;
        Text [ portuguese_brazilian ] = "Largura da coluna" ;
        Text [ portuguese ] = "Largura da coluna" ;
        Text [ finnish ] = "Sarakeleveys" ;
        Text [ danish ] = "Kolonnebredde" ;
        Text [ french ] = "Largeur des colonnes" ;
        Text [ swedish ] = "Kolumnbredd" ;
        Text [ dutch ] = "Kolombreedte" ;
        Text [ spanish ] = "Ancho de columna" ;
        Text [ english_us ] = "Column width" ;
        Text[ chinese_simplified ] = "À¸¿í";
        Text[ russian ] = "Øèðèíà êîëîíîê";
        Text[ polish ] = "Szer. kolumny";
        Text[ japanese ] = "’i‚Ì•";
        Text[ chinese_traditional ] = "Äæ¼e";
        Text[ arabic ] = "ÚÑÖ ÇáÃÚãÏÉ";
        Text[ dutch ] = "Kolombreedte";
        Text[ chinese_simplified ] = "À¸¿í";
        Text[ greek ] = "ÐëÜôïò óôÞëçò";
        Text[ korean ] = "¿­ ³Êºñ";
        Text[ language_user1 ] = " ";
        Text[ turkish ] = "Sütun geniþliði";
    };
    GroupBox GB_BSP
    {
        Pos = MAP_APPFONT ( 171 , 3 ) ;
        Size = MAP_APPFONT ( 83 , 46 ) ;
        Text = "Vorschau" ;
        Text [ ENGLISH ] = "Example" ;
        Text [ norwegian ] = "Eksempel" ;
        Text [ italian ] = "Anteprima" ;
        Text [ portuguese_brazilian ] = "Exemplo" ;
        Text [ portuguese ] = "Previsualizar" ;
        Text [ finnish ] = "Malli" ;
        Text [ danish ] = "Eksempel" ;
        Text [ french ] = "Aperçu" ;
        Text [ swedish ] = "Förhandsvisning" ;
        Text [ dutch ] = "Voorbeeld" ;
        Text [ spanish ] = "Previsualización" ;
        Text [ english_us ] = "Preview" ;
        Text[ chinese_simplified ] = "Ô¤ÊÓ";
        Text[ russian ] = "Ïðîñìîòð";
        Text[ polish ] = "Podgl¹d";
        Text[ japanese ] = "ÌßÚËÞ­°";
        Text[ chinese_traditional ] = "¹wÄý";
        Text[ arabic ] = "ÇáãÚÇíäÉ";
        Text[ dutch ] = "Voorbeeld";
        Text[ chinese_simplified ] = "Ô¤ÊÓ";
        Text[ greek ] = "Ðñïåðéóêüðçóç";
        Text[ korean ] = "¹Ì¸®º¸±â";
        Text[ language_user1 ] = " ";
        Text[ turkish ] = "Önizleme";
    };
    Window WN_BSP
    {
        Pos = MAP_APPFONT ( 176 , 12 ) ;
        Size = MAP_APPFONT ( 72 , 31 ) ;
    };
    Text[ chinese_simplified ] = "À¸";
    Text[ russian ] = "Êîëîíêè";
    Text[ polish ] = "Kolumny";
    Text[ japanese ] = "’i‘g‚Ý";
    Text[ chinese_traditional ] = "Äæ";
    Text[ arabic ] = "ÇáÃÚãÏÉ";
    Text[ dutch ] = "Kolommen";
    Text[ chinese_simplified ] = "À¸";
    Text[ greek ] = "ÓôÞëåò";
    Text[ korean ] = "¿­";
    Text[ language_user1 ] = " ";
    Text[ turkish ] = "Sütun";
};

ModalDialog DLG_COLUMN
{
    HelpID = HID_FORMAT_COLUMN;
    Hide = TRUE;
    Moveable = TRUE;
    Size = MAP_APPFONT ( 316 , 135 ) ;
    Text = "Spalten" ;
    Text [ ENGLISH ] = "Columns" ;
    OKButton PB_OK
    {
        DefButton = TRUE ;
        Pos = MAP_APPFONT ( 260 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    CancelButton PB_CANCEL
    {
        Pos = MAP_APPFONT ( 260 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    HelpButton PB_HELP
    {
        Pos = MAP_APPFONT ( 260 , 43 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    FixedText FT_APPLY_TO
    {
        Pos = MAP_APPFONT ( 260 , 60 ) ;
        Size = MAP_APPFONT ( 50 , 10 ) ;
        Text = "~Anwenden auf:" ;
        Text [ English ] = "~Apply to:" ;
        Left = TRUE ;
        Text[ english_us ] = "~Apply to:";
        Text[ portuguese ] = "~Aplicar a:";
        Text[ greek ] = "Åö~áñìïãÞ óå:";
        Text[ dutch ] = "~Toepassen op:";
        Text[ french ] = "~Appliquer à :";
        Text[ spanish ] = "~Aplicar a:";
        Text[ swedish ] = "~Använd på:";
        Text[ russian ] = "Ïðèìåíèòü ê:";
        Text[ italian ] = "~Applica a:";
        Text[ danish ] = "Anvend på:";
        Text[ polish ] = "Zastosuj w";
        Text[ portuguese_brazilian ] = "~Apply to:";
        Text[ japanese ] = "Ý’è‘ΏÛ:(~A)";
        Text[ korean ] = "Àû¿ë:(~A)";
        Text[ chinese_simplified ] = "ÔËÓÃÔÚ£º(~A)";
        Text[ chinese_traditional ] = "®M¥Î¨ì¡G(~A)";
        Text[ arabic ] = "ÊØÈíÞ Úáì:";
        Text[ language_user1 ] = " ";
        Text[ turkish ] = "~Uygulanacaðý yer:";
    };
    ListBox LB_APPLY_TO
    {
        Pos = MAP_APPFONT ( 260 , 75 ) ;
        Size = MAP_APPFONT ( 50 , 66 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        StringList =
        {
            < "Selektion" ;             LISTBOX_SELECTION; > ;
            < "Aktuellen Bereich" ;     LISTBOX_SECTION     ; > ;
            < "Selektierte Bereiche" ;  LISTBOX_SECTIONS    ; > ;
            < "Rahmen" ;                LISTBOX_FRAME       ; > ;
            < "Seitenvorlage: " ;       LISTBOX_PAGE        ; > ;
        };
        StringList [ENGLISH]=
        {
            < "Selection" ;             LISTBOX_SELECTION; > ;
            < "Current section" ;       LISTBOX_SECTION     ; > ;
            < "Selected section" ;      LISTBOX_SECTIONS    ; > ;
            < "Text Frame" ;            LISTBOX_FRAME       ; > ;
            < "Page style: " ;          LISTBOX_PAGE        ; > ;
        };
    StringList [ language_user1 ] =
    {
            < "Selektion" ;             LISTBOX_SELECTION; > ;
        < " " ;     LISTBOX_SECTION     ; > ;
        < "Selektierte Bereiche" ;  LISTBOX_SECTIONS    ; > ;
        < "Rahmen" ;                LISTBOX_FRAME       ; > ;
        < "Seitenvorlage:" ;        LISTBOX_PAGE        ; > ;
    };
    StringList [ english_us ] =
    {
            < "Selection" ;             LISTBOX_SELECTION; > ;
        < "Current Section" ;   LISTBOX_SECTION     ; > ;
        < "Selected section" ;  LISTBOX_SECTIONS    ; > ;
        < "Frame" ;                 LISTBOX_FRAME       ; > ;
        < "Page Style: " ;          LISTBOX_PAGE        ; > ;
    };
    StringList [ portuguese ] =
    {
            < "Selecção" ;              LISTBOX_SELECTION; > ;
        < "Secção activa" ;     LISTBOX_SECTION     ; > ;
        < "Secções seleccionadas" ;  LISTBOX_SECTIONS   ; > ;
        < "Moldura" ;               LISTBOX_FRAME       ; > ;
        < "Estilo de página: " ;        LISTBOX_PAGE        ; > ;
    };
    StringList [ greek ] =
    {
            < "ÅðéëïãÞ" ;           LISTBOX_SELECTION; > ;
        < "ÔñÝ÷ùí ðåñéï÷Þ" ;    LISTBOX_SECTION     ; > ;
        < "ÅðéëåãìÝíåò ðåñéï÷Ýò" ;  LISTBOX_SECTIONS    ; > ;
        < "Ðåñßãñáììá" ;                LISTBOX_FRAME       ; > ;
        < "Ðñüôõðï óåëßäáò: " ;         LISTBOX_PAGE        ; > ;
    };
    StringList [ dutch ] =
    {
            < "Selectie" ;              LISTBOX_SELECTION; > ;
        < "Actueel bereik" ;    LISTBOX_SECTION     ; > ;
        < "Geselecteerd bereik" ;  LISTBOX_SECTIONS ; > ;
        < "Kader" ;                 LISTBOX_FRAME       ; > ;
        < "Pagina-opmaakprofiel:  " ;       LISTBOX_PAGE        ; > ;
    };
    StringList [ french ] =
    {
            < "Sélection" ;             LISTBOX_SELECTION; > ;
        < "Section active" ;    LISTBOX_SECTION     ; > ;
        < "Sections sélectionnées" ;  LISTBOX_SECTIONS  ; > ;
        < "Cadre" ;                 LISTBOX_FRAME       ; > ;
        < "Style de page :  " ;         LISTBOX_PAGE        ; > ;
    };
    StringList [ spanish ] =
    {
            < "Selección" ;             LISTBOX_SELECTION; > ;
        < "Área actual" ;   LISTBOX_SECTION     ; > ;
        < "Áreas seleccionadas" ;  LISTBOX_SECTIONS ; > ;
        < "Marco" ;                 LISTBOX_FRAME       ; > ;
        < "Estilo de página: " ;        LISTBOX_PAGE        ; > ;
    };
    StringList [ swedish ] =
    {
            < "Markering" ;             LISTBOX_SELECTION; > ;
        < "Aktuellt område" ;   LISTBOX_SECTION     ; > ;
        < "Markerade områden" ;  LISTBOX_SECTIONS   ; > ;
        < "Ram" ;               LISTBOX_FRAME       ; > ;
        < "Sidformatmall:  " ;          LISTBOX_PAGE        ; > ;
    };
    StringList [ russian ] =
    {
            < "Âûäåëåíèþ" ;             LISTBOX_SELECTION; > ;
        < "Òåêóùåé îáëàñòè" ;   LISTBOX_SECTION     ; > ;
        < "Âûäåëåííîé îáëàñòè" ;  LISTBOX_SECTIONS  ; > ;
        < "Ðàìêå" ;                 LISTBOX_FRAME       ; > ;
        < "Ñòèëþ ñòðàíèöû:  " ;         LISTBOX_PAGE        ; > ;
    };
    StringList [ italian ] =
    {
            < "Selezione" ;             LISTBOX_SELECTION; > ;
        < "Sezione corrente" ;      LISTBOX_SECTION     ; > ;
        < "Aree contrassegnate" ;  LISTBOX_SECTIONS ; > ;
        < "Cornice" ;               LISTBOX_FRAME       ; > ;
        < "Modello di pagina: " ;       LISTBOX_PAGE        ; > ;
    };
    StringList [ danish ] =
    {
            < "Markering" ;             LISTBOX_SELECTION; > ;
        < "Aktuelt område" ;    LISTBOX_SECTION     ; > ;
        < "Markeret område" ;  LISTBOX_SECTIONS ; > ;
        < "Ramme" ;                 LISTBOX_FRAME       ; > ;
        < "Sidetypografi: " ;       LISTBOX_PAGE        ; > ;
    };
    StringList [ polish ] =
    {
            < "Selekcja" ;              LISTBOX_SELECTION; > ;
        < "Aktualny obszar" ;   LISTBOX_SECTION     ; > ;
        < "Zaznaczone obszary" ;  LISTBOX_SECTIONS  ; > ;
        < "Ramka" ;                 LISTBOX_FRAME       ; > ;
        < "Styl strony: " ;         LISTBOX_PAGE        ; > ;
    };
    StringList [ portuguese_brazilian ] =
    {
            < "Selektion" ;             LISTBOX_SELECTION; > ;
        < "Aktuellen Bereich" ;     LISTBOX_SECTION     ; > ;
        < "Selektierte Bereiche" ;  LISTBOX_SECTIONS    ; > ;
        < "Rahmen" ;                LISTBOX_FRAME       ; > ;
        < "Seitenvorlage: " ;       LISTBOX_PAGE        ; > ;
    };
    StringList [ japanese ] =
    {
            < "‘I‘ð”͈Í" ;              LISTBOX_SELECTION; > ;
        < "Œ»Ý‚͈̔Í" ;    LISTBOX_SECTION     ; > ;
        < "‘I‘ð”͈Í" ;  LISTBOX_SECTIONS    ; > ;
        < "ŠO˜g" ;                  LISTBOX_FRAME       ; > ;
        < "Íß°¼Þ½À²Ù: " ;       LISTBOX_PAGE        ; > ;
    };
    StringList [ korean ] =
    {
            < "¼±ÅÃ" ;              LISTBOX_SELECTION; > ;
        < "ÇöÀç ¼±ÅÃ" ;     LISTBOX_SECTION     ; > ;
        < "¼±ÅÃµÈ ±¸¿ª" ;  LISTBOX_SECTIONS ; > ;
        < "ÇÁ·¹ÀÓ" ;                LISTBOX_FRAME       ; > ;
        < "ÆäÀÌÁö ¼³Á¤: " ;         LISTBOX_PAGE        ; > ;
    };
    StringList [ chinese_simplified ] =
    {
            < "Ñ¡ÖÐ" ;              LISTBOX_SELECTION; > ;
        < "µ±Ç°µÄÇøÓò" ;    LISTBOX_SECTION     ; > ;
        < "Ñ¡ÖеÄÇøÓò" ;  LISTBOX_SECTIONS  ; > ;
        < "¿ò" ;                LISTBOX_FRAME       ; > ;
        < "Ò³ÃæÑùʽ£º " ;       LISTBOX_PAGE        ; > ;
    };
    StringList [ chinese_traditional ] =
    {
            < "¿ï¾Ü" ;              LISTBOX_SELECTION; > ;
        < "·í«eªº°Ï°ì" ;    LISTBOX_SECTION     ; > ;
        < "¿ï¾Üªº°Ï°ì" ;  LISTBOX_SECTIONS  ; > ;
        < "®Ø" ;                LISTBOX_FRAME       ; > ;
        < "­¶­±¼Ë¦¡¡G " ;       LISTBOX_PAGE        ; > ;
    };
    StringList [ arabic ] =
    {
            < "ÇáÊÍÏíÏ" ;           LISTBOX_SELECTION; > ;
        < "ÇáäØÇÞ ÇáÍÇáí" ;     LISTBOX_SECTION     ; > ;
        < "ÇáäØÇÞÇÊ ÇáãÍÏÏÉ" ;  LISTBOX_SECTIONS    ; > ;
        < "ÇáÅØÇÑ" ;                LISTBOX_FRAME       ; > ;
        < "ÞÇáÈ ÇáÕÝÍÉ: " ;         LISTBOX_PAGE        ; > ;
    };
    StringList [ turkish ] =
    {
            < "Seçim" ;             LISTBOX_SELECTION; > ;
        < "Yürürlükteki bölüm" ;    LISTBOX_SECTION     ; > ;
        < "Seçilen bölüm" ;  LISTBOX_SECTIONS   ; > ;
        < "Çerçeve" ;               LISTBOX_FRAME       ; > ;
        < "Sayfa biçimi: " ;        LISTBOX_PAGE        ; > ;
    };
    };
    Text[ english_us ] = "Columns";
    Text[ portuguese ] = "Colunas";
    Text[ greek ] = "ÓôÞëåò";
    Text[ dutch ] = "Kolommen";
    Text[ french ] = "Colonnes";
    Text[ spanish ] = "Columnas";
    Text[ swedish ] = "Kolumner";
    Text[ russian ] = "Êîëîíêè";
    Text[ italian ] = "Colonne";
    Text[ danish ] = "Kolonner";
    Text[ polish ] = "Kolumny";
    Text[ portuguese_brazilian ] = "Columns";
    Text[ japanese ] = "’i‘g‚Ý";
    Text[ korean ] = "¿­";
    Text[ chinese_simplified ] = "À¸";
    Text[ chinese_traditional ] = "Äæ";
    Text[ arabic ] = "ÃÚãÏÉ";
    Text[ language_user1 ] = " ";
    Text[ turkish ] = "Sütun";
};
diff --git a/sw/source/ui/frmdlg/cption.cxx b/sw/source/ui/frmdlg/cption.cxx
new file mode 100644
index 0000000..fbfcc4a
--- /dev/null
+++ b/sw/source/ui/frmdlg/cption.cxx
@@ -0,0 +1,715 @@
/*************************************************************************
 *
 *  $RCSfile: cption.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:37 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _CPTION_HXX
#include <cption.hxx>
#endif
#ifndef _CAPTION_HXX
#include <caption.hxx>
#endif
#ifndef _FLDMGR_HXX
#include <fldmgr.hxx>
#endif
#ifndef _EXPFLD_HXX
#include <expfld.hxx>
#endif
#ifndef _NUMRULE_HXX
#include <numrule.hxx>
#endif
#ifndef _POOLFMT_HXX
#include <poolfmt.hxx>
#endif
#ifndef _SWDOCSH_HXX //autogen
#include <docsh.hxx>
#endif
#ifndef _FRMFMT_HXX //autogen
#include <frmfmt.hxx>
#endif

#ifndef _COM_SUN_STAR_FRAME_XSTORABLE_HPP_
#include <com/sun/star/frame/XStorable.hpp>
#endif
#ifndef _COM_SUN_STAR_FRAME_XMODEL_HPP_
#include <com/sun/star/frame/XModel.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_GRAPHICCROP_HPP_
#include <com/sun/star/text/GraphicCrop.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXTGRAPHICOBJECTSSUPPLIER_HPP_
#include <com/sun/star/text/XTextGraphicObjectsSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXTTABLECURSOR_HPP_
#include <com/sun/star/text/XTextTableCursor.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXTTABLESSUPPLIER_HPP_
#include <com/sun/star/text/XTextTablesSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_TABLECOLUMNSEPARATOR_HPP_
#include <com/sun/star/text/TableColumnSeparator.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXTTABLE_HPP_
#include <com/sun/star/text/XTextTable.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXTEMBEDDEDOBJECTSSUPPLIER_HPP_
#include <com/sun/star/text/XTextEmbeddedObjectsSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXTEMBEDDEDOBJECT_HPP_
#include <com/sun/star/text/XTextEmbeddedObject.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXTFRAMESSUPPLIER_HPP_
#include <com/sun/star/text/XTextFramesSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXTFRAME_HPP_
#include <com/sun/star/text/XTextFrame.hpp>
#endif

#ifndef _FRMUI_HRC
#include <frmui.hrc>
#endif
#ifndef _CPTION_HRC
#include <cption.hrc>
#endif

using namespace ::com::sun::star;

extern String* pOldGrfCat;
extern String* pOldTabCat;
extern String* pOldFrmCat;
extern String* pOldDrwCat;

class SwSequenceOptionDialog : public SvxStandardDialog
{
    FixedText       aFtLevel;
    ListBox         aLbLevel;
    FixedText       aFtDelim;
    Edit            aEdDelim;
    OKButton        aOKButton;
    CancelButton    aCancelButton;
    HelpButton      aHelpButton;
    GroupBox        aGbHeader;
    SwView&         rView;
    String          aFldTypeName;

public:
    SwSequenceOptionDialog( Window *pParent, SwView &rV,
                            const String& rSeqFldType );
    virtual ~SwSequenceOptionDialog();
    virtual void Apply();
};


SwCaptionDialog::SwCaptionDialog( Window *pParent, SwView &rV ) :

    SvxStandardDialog( pParent, SW_RES(DLG_CAPTION) ),

    aOKButton     (this, SW_RES(BTN_OK     )),
    aCancelButton (this, SW_RES(BTN_CANCEL  )),
    aHelpButton   (this, SW_RES(BTN_HELP    )),
    aOptionButton (this, SW_RES(BTN_OPTION  )),
    aSampleText   (this, SW_RES(TXT_SAMPLE  )),
    aCategoryText (this, SW_RES(TXT_CATEGORY)),
    aCategoryBox  (this, SW_RES(BOX_CATEGORY)),
    aFormatText   (this, SW_RES(TXT_FORMAT  )),
    aFormatBox    (this, SW_RES(BOX_FORMAT  )),
    aTextText     (this, SW_RES(TXT_TEXT    )),
    aTextEdit     (this, SW_RES(EDT_TEXT    )),
    aPosText      (this, SW_RES(TXT_POS    )),
    aPosBox       (this, SW_RES(BOX_POS    )),
    aCopyAttributesCB(this, SW_RES(CB_COPY_ATTR    )),
    aObjectNameFT(this, SW_RES(FT_OBJECT_NAME )),
    aObjectNameED(this, SW_RES(ED_OBJECT_NAME )),
    aSettingsGroup(this, SW_RES(GRP_SETTINGS)),
    rView( rV ),
    pMgr( new SwFldMgr() )

{
    SwWrtShell &rSh = rView.GetWrtShell();
     uno::Reference< frame::XModel >  xModel = rView.GetDocShell()->GetBaseModel();

    eType = (SwWrtShell::SelectionType)rSh.GetSelectionType();
    if ( eType & SwWrtShell::SEL_OLE )
    {
        eType = SwWrtShell::SEL_GRF;
         uno::Reference< text::XTextEmbeddedObjectsSupplier >  xObjs(xModel, uno::UNO_QUERY);
        xNameAccess = xObjs->getEmbeddedObjects();
    }

    Link aLk = LINK( this, SwCaptionDialog, ModifyHdl );
    aCategoryBox.SetModifyHdl( aLk );
    aTextEdit   .SetModifyHdl( aLk );

    aLk = LINK(this, SwCaptionDialog, SelectHdl);
    aCategoryBox.SetSelectHdl( aLk );
    aFormatBox  .SetSelectHdl( aLk );
//  aPosBox     .SetSelectHdl( aLk );

    aOptionButton.SetClickHdl( LINK( this, SwCaptionDialog, OptionHdl ) );

    sal_uInt16 i, nCount = pMgr->GetFldTypeCount();
    for (i = 0; i < nCount; i++)
    {
        SwFieldType *pType = pMgr->GetFldType( USHRT_MAX, i );
        if( pType->Which() == RES_SETEXPFLD &&
            ((SwSetExpFieldType *) pType)->GetType() & GSE_SEQ )
            aCategoryBox.InsertEntry(SwBoxEntry(pType->GetName(), i));
    }

    String* pString;
    sal_uInt16 nPoolId = 0;
    if (eType & SwWrtShell::SEL_GRF)
    {
        nPoolId = RES_POOLCOLL_LABEL_ABB;
        pString = pOldGrfCat;
        aCopyAttributesCB.Show();
        aCopyAttributesCB.Check(sal_True);
        sObjectName = rSh.GetFlyName();
        //if not OLE
        if(!xNameAccess.is())
        {
         uno::Reference< text::XTextGraphicObjectsSupplier >  xGraphics(xModel, uno::UNO_QUERY);
            xNameAccess = xGraphics->getGraphicObjects();
        }

    }
    else if( eType & SwWrtShell::SEL_TBL )
    {
        nPoolId = RES_POOLCOLL_LABEL_TABLE;
        pString = pOldTabCat;
     uno::Reference< text::XTextTablesSupplier >  xTables(xModel, uno::UNO_QUERY);
        xNameAccess = xTables->getTextTables();
        sObjectName = rSh.GetTableFmt()->GetName();
    }
    else if( eType & SwWrtShell::SEL_FRM )
    {
        nPoolId = RES_POOLCOLL_LABEL_FRAME;
        pString = pOldFrmCat;
         uno::Reference< text::XTextFramesSupplier >  xFrms(xModel, uno::UNO_QUERY);
        xNameAccess = xFrms->getTextFrames();
        sObjectName = rSh.GetFlyName();
    }
    else if( eType == SwWrtShell::SEL_TXT )
    {
        nPoolId = RES_POOLCOLL_LABEL_FRAME;
        pString = pOldFrmCat;
        aObjectNameED.Show(sal_False);
        aObjectNameFT.Show(sal_False);
    }
    else if( eType & SwWrtShell::SEL_DRW )
    {
        nPoolId = RES_POOLCOLL_LABEL_DRAWING;
        pString = pOldDrwCat;
        aObjectNameED.Show(sal_False);
        aObjectNameFT.Show(sal_False);
    }
    if( nPoolId )
    {
        if( pString && pString->Len())
            aCategoryBox.SetText( *pString );
        else
        {
            String sTmp;
            aCategoryBox.SetText( GetDocPoolNm( nPoolId, sTmp ));
        }
    }

    //
    if(aObjectNameED.IsVisible())
    {
        if(!aCopyAttributesCB.IsVisible())
        {
            long nHeightDiff = aObjectNameFT.GetPosPixel().Y() - aObjectNameED.GetPosPixel().Y();
             Point aPos(aCopyAttributesCB.GetPosPixel());
            aObjectNameFT.SetPosPixel(aPos);
            aPos.X() = aObjectNameED.GetPosPixel().X();
            aPos.Y() -= nHeightDiff;
            aObjectNameED.SetPosPixel(aPos);
        }
        if(xNameAccess.is())
        {
            uno::Any aObj = xNameAccess->getByName(sObjectName);
             uno::Reference< uno::XInterface >  xTmp = *(uno::Reference< uno::XInterface > *)aObj.getValue();
            xNamed = uno::Reference< container::XNamed >(xTmp, uno::UNO_QUERY);
        }
        aObjectNameED.SetText(sObjectName);
        aObjectNameED.SetForbiddenChars(' ');
        aObjectNameED.SetModifyHdl(LINK(this, SwCaptionDialog, ModifyHdl));
    }

    // aFormatBox
    sal_uInt16 nSelFmt = SVX_NUM_ARABIC;
    nCount = pMgr->GetFldTypeCount();
    SwFieldType* pFldType;
    for ( i = nCount; i; )
        if( ( pFldType = pMgr->GetFldType(USHRT_MAX, --i))->GetName() ==
            aCategoryBox.GetText() )
        {
            nSelFmt = (sal_uInt16)((SwSetExpFieldType*)pFldType)->GetSeqFormat();
            break;
        }


    nCount = pMgr->GetFormatCount(TYP_SEQFLD, sal_False);
    for ( i = 0; i < nCount; ++i )
    {
        aFormatBox.InsertEntry( pMgr->GetFormatStr(TYP_SEQFLD, i) );
        sal_uInt16 nFmtId = pMgr->GetFormatId(TYP_SEQFLD, i);
        aFormatBox.SetEntryData( i, (void*)nFmtId );
        if( nFmtId == nSelFmt )
            aFormatBox.SelectEntryPos( i );
    }

    // aPosBox
    switch (eType)
    {
        case SwWrtShell::SEL_GRF:
        case SwWrtShell::SEL_TBL:
        case SwWrtShell::SEL_TBL | SwWrtShell::SEL_NUM:
        case SwWrtShell::SEL_TBL | SwWrtShell::SEL_TXT:
        case SwWrtShell::SEL_TBL | SwWrtShell::SEL_NUM | SwWrtShell::SEL_TXT:
        case SwWrtShell::SEL_DRW:
        case SwWrtShell::SEL_DRW | SwWrtShell::SEL_BEZ:
            aPosBox.InsertEntry(SW_RESSTR(STR_ABOVE));
            aPosBox.InsertEntry(SW_RESSTR(STR_CP_BELOW));
            break;
        case SwWrtShell::SEL_FRM:
        case SwWrtShell::SEL_TXT:
            aPosBox.InsertEntry(SW_RESSTR(STR_BEGINNING));
            aPosBox.InsertEntry(SW_RESSTR(STR_END     ));
            break;
    }
    aPosBox.SelectEntryPos(1);
    if (eType & (SwWrtShell::SEL_GRF|SwWrtShell::SEL_DRW))
        aPosBox.Enable( sal_False );

    aCategoryBox.GetModifyHdl().Call(&aCategoryBox);

    FreeResource();
    aTextEdit.GrabFocus();
}



void SwCaptionDialog::Apply()
{
    String sNewName = aObjectNameED.GetText();
    if(aObjectNameED.IsVisible() && sNewName != sObjectName)
    {
        xNamed->setName(sNewName);
    }

    InsCaptionOpt aOpt;

    aOpt.UseCaption() = sal_True;
    String aName( aCategoryBox.GetText() );
    aName.EraseLeadingChars (' ');
    aName.EraseTrailingChars(' ');
    aOpt.SetCategory(aName);
    aOpt.SetNumType((sal_uInt16)(sal_uInt32)aFormatBox.GetEntryData(aFormatBox.GetSelectEntryPos()));
    aOpt.SetCaption(aTextEdit.GetText());
    aOpt.SetPos(aPosBox.GetSelectEntryPos());
    aOpt.IgnoreSeqOpts() = sal_True;
    aOpt.CopyAttributes() = aCopyAttributesCB.IsVisible() && aCopyAttributesCB.IsChecked();
    rView.InsertCaption(&aOpt);
}



IMPL_LINK_INLINE_START( SwCaptionDialog, OptionHdl, Button*, pButton )
{
    SwSequenceOptionDialog( pButton, rView, aCategoryBox.GetText() ).Execute();
    DrawSample();
    return 0;
}
IMPL_LINK_INLINE_END( SwCaptionDialog, OptionHdl, Button*, EMPTYARG )

IMPL_LINK_INLINE_START( SwCaptionDialog, SelectHdl, ListBox *, pBox )
{
    DrawSample();
    return 0;
}
IMPL_LINK_INLINE_END( SwCaptionDialog, SelectHdl, ListBox *, EMPTYARG )



IMPL_LINK( SwCaptionDialog, ModifyHdl, Edit *, pEdit )
{
    String sNewName = aObjectNameED.GetText();
    sal_Bool bCorrectName = !aObjectNameED.IsVisible() ||
        (sNewName.Len() &&
            (sNewName == sObjectName ||
                !xNameAccess.is() || !xNameAccess->hasByName(sNewName)));
    SwWrtShell &rSh = rView.GetWrtShell();
    String sFldTypeName = aCategoryBox.GetText();
    SwFieldType* pType = sFldTypeName.Len() ? rSh.GetFldType(RES_SETEXPFLD, sFldTypeName) : 0;

    aOKButton.Enable( bCorrectName &&
                        (!pType || ((SwSetExpFieldType*)pType)->GetType() == GSE_SEQ)
                                    && sFldTypeName.Len() != 0 );
    aOptionButton.Enable( aOKButton.IsEnabled() );

    if(pEdit != &aObjectNameED)
        DrawSample();
    return 0;
}



void SwCaptionDialog::DrawSample()
{
    String aStr;

    // Nummer
    sal_uInt16 nNumFmt = (sal_uInt16)(sal_uInt32)aFormatBox.GetEntryData(
                                    aFormatBox.GetSelectEntryPos() );
    if( SVX_NUM_NUMBER_NONE != nNumFmt )
    {
        // Kategorie
        aStr += aCategoryBox.GetText();
        aStr += ' ';

        SwWrtShell &rSh = rView.GetWrtShell();
        String sFldTypeName( aCategoryBox.GetText() );
        SwSetExpFieldType* pFldType = (SwSetExpFieldType*)rSh.GetFldType(
                                        RES_SETEXPFLD, sFldTypeName );
        if( pFldType && pFldType->GetOutlineLvl() < MAXLEVEL )
        {
            sal_Int8 nLvl = pFldType->GetOutlineLvl();
            SwNodeNum aNum( nLvl );
            for( sal_Int8 i = 0; i <= nLvl; ++i )
                *(aNum.GetLevelVal() + i) = 1;

            String sNumber( rSh.GetOutlineNumRule()->MakeNumString(
                                                    aNum, sal_False ));
            if( sNumber.Len() )
                (aStr += sNumber) += pFldType->GetDelimiter();
        }

        switch( nNumFmt )
        {
        case SVX_NUM_CHARS_UPPER_LETTER:    aStr += 'A'; break;
        case SVX_NUM_CHARS_UPPER_LETTER_N:  aStr += 'A'; break;
        case SVX_NUM_CHARS_LOWER_LETTER:    aStr += 'a'; break;
        case SVX_NUM_CHARS_LOWER_LETTER_N:  aStr += 'a'; break;
        case SVX_NUM_ROMAN_UPPER:           aStr += 'I'; break;
        case SVX_NUM_ROMAN_LOWER:           aStr += 'i'; break;
        //case ARABIC:
        default:                    aStr += '1'; break;
        }
    }

    aStr += aTextEdit.GetText();
    aSampleText.SetText(aStr);
}



SwCaptionDialog::~SwCaptionDialog()
{
    delete pMgr;
}

/*------------------------------------------------------------------------
 Beschreibung: form ohne Spaces
------------------------------------------------------------------------*/



void NoSpaceCombo::KeyInput(const KeyEvent& rEvt)
{
    if( rEvt.GetKeyCode().GetCode() != KEY_SPACE )
        SwComboBox::KeyInput(rEvt);
}



/*  */

SwSequenceOptionDialog::SwSequenceOptionDialog( Window *pParent, SwView &rV,
                                            const String& rSeqFldType )
    : SvxStandardDialog( pParent, SW_RES(DLG_SEQUENCE_OPTION) ),
    aOKButton       (this, SW_RES(BTN_OK       )),
    aCancelButton   (this, SW_RES(BTN_CANCEL   )),
    aHelpButton     (this, SW_RES(BTN_HELP     )),
    aFtLevel        (this, SW_RES(FT_LEVEL     )),
    aLbLevel        (this, SW_RES(LB_LEVEL     )),
    aFtDelim        (this, SW_RES(FT_SEPARATOR )),
    aEdDelim        (this, SW_RES(ED_SEPARATOR )),
    aGbHeader       (this, SW_RES(GB_HEADER    )),
    aFldTypeName( rSeqFldType ),
    rView( rV )
{
    FreeResource();
    SwWrtShell &rSh = rView.GetWrtShell();

    for( sal_uInt16 n = 0; n < MAXLEVEL; ++n )
        aLbLevel.InsertEntry( String::CreateFromInt32(n+1) );

    SwSetExpFieldType* pFldType = (SwSetExpFieldType*)rSh.GetFldType(
                                        RES_SETEXPFLD, aFldTypeName );

    sal_Unicode cDelim = '.', nLvl = MAXLEVEL;
    if( pFldType )
    {
        cDelim = pFldType->GetDelimiter();
        nLvl = pFldType->GetOutlineLvl();
    }

    aLbLevel.SelectEntryPos( nLvl < MAXLEVEL ? nLvl + 1 : 0 );
    aEdDelim.SetText( cDelim );
}

SwSequenceOptionDialog::~SwSequenceOptionDialog()
{
}

void SwSequenceOptionDialog::Apply()
{
    SwWrtShell &rSh = rView.GetWrtShell();
    SwSetExpFieldType* pFldType = (SwSetExpFieldType*)rSh.GetFldType(
                                        RES_SETEXPFLD, aFldTypeName );

    sal_Int8 nLvl = (sal_Int8)( aLbLevel.GetSelectEntryPos() - 1);
    sal_Unicode cDelim = aEdDelim.GetText().GetChar(0);

    sal_Bool bUpdate = sal_True;
    if( pFldType )
    {
        pFldType->SetDelimiter( cDelim );
        pFldType->SetOutlineLvl( nLvl );
    }
    else if( nLvl < MAXLEVEL )
    {
        // dann muessen wir das mal einfuegen
        SwSetExpFieldType aFldType( rSh.GetDoc(), aFldTypeName, GSE_SEQ );
        aFldType.SetDelimiter( cDelim );
        aFldType.SetOutlineLvl( nLvl );
        rSh.InsertFldType( aFldType );
    }
    else
        bUpdate = sal_False;

    if( bUpdate )
        rSh.UpdateExpFlds();
}



/*-----------------25.02.94 21:56-------------------

   $Log: not supported by cvs2svn $
   Revision 1.74  2000/09/18 16:05:32  willem.vandorp
   OpenOffice header added.

   Revision 1.73  2000/09/12 08:39:37  os
   #78678# CreateFromInt32

   Revision 1.72  2000/07/27 21:16:09  jp
   opt: get template names direct from the doc and don't load it from the resource

   Revision 1.71  2000/04/26 14:49:17  os
   GetName() returns const String&

   Revision 1.70  2000/04/18 15:14:56  os
   UNICODE

   Revision 1.69  2000/03/23 06:49:59  os
   UNOIII

   Revision 1.68  2000/02/15 14:18:19  os
   #72904# check container::XNameAccess

   Revision 1.67  2000/02/11 14:47:24  hr
   #70473# changes for unicode ( patched by automated patchtool )

   Revision 1.66  1999/11/19 16:40:22  os
   modules renamed

   Revision 1.65  1999/08/19 11:52:22  OS
   OLE objects: no GPF


      Rev 1.64   19 Aug 1999 13:52:22   OS
   OLE objects: no GPF

      Rev 1.63   21 Jul 1999 14:15:14   OS
   #67425# Appearance improved

      Rev 1.62   10 Jun 1999 13:02:36   OS
   rename objects

      Rev 1.61   09 Jun 1999 10:43:04   OS
   #66732# Insert caption: copy border and shadow optionally

      Rev 1.60   10 Dec 1998 09:45:52   MIB
   #60060#: Beschriftungen fuer Zeichen-Objekte

      Rev 1.59   17 Nov 1998 10:52:52   OS
   #58263# NumType durch SvxExtNumType ersetzt

      Rev 1.58   06 Nov 1998 17:04:06   OM
   #58158# Automatische Beschriftung

      Rev 1.57   11 Aug 1998 14:22:08   HR
   void* kann nicht direkt nach sal_uInt16 gecastet werden

      Rev 1.56   10 Aug 1998 16:42:42   JP
   Bug #54796#: neue NumerierungsTypen (WW97 kompatibel)

      Rev 1.55   19 Jun 1998 11:44:04   JP
   neu: Nummernkreis Optionen - fuer die Kapitelweisenummerierung

      Rev 1.54   20 Apr 1998 13:45:00   OS
   Variablen duerfen nicht ueber Nummernkreise eingefuegt werden

      Rev 1.53   27 Feb 1998 16:41:44   OM
   Unterhalb

      Rev 1.52   02 Feb 1998 10:59:28   OM
   #46835# Auch bei Cursor im Rahmen (SEL_TXT) richtigen Selektionsmodus (SEL_FRM) auswerten

      Rev 1.51   08 Jan 1998 09:16:12   OS
   initialen Focus umgesetzt #45673#

      Rev 1.50   24 Nov 1997 17:40:10   MA
   include

      Rev 1.49   03 Nov 1997 13:19:46   MA
   precomp entfernt

      Rev 1.48   02 Oct 1997 15:22:10   OM
   Feldumstellung

      Rev 1.47   05 May 1997 17:09:08   TRI
   ICC brauchte Instanz

      Rev 1.46   29 Apr 1997 16:17:56   OM
   Unsichtbare Benutzerfelder

      Rev 1.45   04 Apr 1997 10:32:48   OM
   Datenbanken nach Gebrauch wieder schliessen

      Rev 1.44   18 Mar 1997 17:38:42   OM
   Segmentiert

      Rev 1.43   18 Mar 1997 17:35:54   OM
   keine Spaces in Kategorie

      Rev 1.42   14 Mar 1997 15:58:14   OS
   neue Beschriftungsvorlage von Beschriftung abgeleitet

      Rev 1.41   09 Jan 1997 08:41:24   OS
   Beschriftungsdialog mit HelpID und HelpButton

      Rev 1.40   11 Nov 1996 10:44:14   MA
   ResMgr

      Rev 1.39   02 Oct 1996 17:36:14   MA
   Umstellung Enable/Disable

      Rev 1.38   28 Aug 1996 11:52:50   OS
   includes

      Rev 1.37   09 Jul 1996 17:52:20   OM
   Alternatives Formatmenue fuer Expressionfields

      Rev 1.36   06 Feb 1996 15:19:22   JP
   Link Umstellung 305

      Rev 1.35   28 Nov 1995 11:20:24   JP
   Umstellungsbugs entfernt, optimiert

      Rev 1.34   27 Nov 1995 21:16:00   JP
   static Strings gegen Pointer ausgetauscht, werden im InitUi angelegt/zerstoert

      Rev 1.33   24 Nov 1995 16:58:08   OM
   PCH->PRECOMPILED

      Rev 1.32   13 Nov 1995 13:40:26   MA
   chg: Link-Cast entfernt

      Rev 1.31   08 Nov 1995 13:46:22   OM
   Change->Set

      Rev 1.30   06 Oct 1995 15:34:52   MA
   fix: Selectiontype ist verodert

      Rev 1.29   30 Aug 1995 14:13:50   MA
   fix: sexport'iert

      Rev 1.28   21 Aug 1995 09:27:08   MA
   chg: swstddlg -> svxstandarddialog, Optimierungen

--------------------------------------------------*/



diff --git a/sw/source/ui/frmdlg/cption.hrc b/sw/source/ui/frmdlg/cption.hrc
new file mode 100644
index 0000000..eb4b272
--- /dev/null
+++ b/sw/source/ui/frmdlg/cption.hrc
@@ -0,0 +1,95 @@
/*************************************************************************
 *
 *  $RCSfile: cption.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:37 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _CPTION_HRC
#define _CPTION_HRC

#define BTN_OK         1
#define BTN_CANCEL     2
#define TXT_SAMPLE     3
#define TXT_CATEGORY   4
#define BOX_CATEGORY   5
#define TXT_FORMAT     6
#define BOX_FORMAT     7
#define TXT_TEXT       8
#define EDT_TEXT       9
#define TXT_POS       10
#define BOX_POS       11
#define GRP_SETTINGS  12
#define BTN_HELP      13
#define BTN_OPTION    14
#define GB_HEADER     15
#define FT_LEVEL      16
#define LB_LEVEL      17
#define FT_SEPARATOR  18
#define ED_SEPARATOR  19
#define CB_COPY_ATTR  20
#define FT_OBJECT_NAME 21
#define ED_OBJECT_NAME 22

#define STR_BEGINNING  1
#define STR_END        2
#define STR_ABOVE      3
#define STR_CP_BELOW   4

#endif

// ********************************************************************** EOF
diff --git a/sw/source/ui/frmdlg/cption.src b/sw/source/ui/frmdlg/cption.src
new file mode 100644
index 0000000..1ca2337
--- /dev/null
+++ b/sw/source/ui/frmdlg/cption.src
@@ -0,0 +1,722 @@
/*************************************************************************
 *
 *  $RCSfile: cption.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:37 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
 // #include *****************************************************************
#include "helpid.h"
#include "frmui.hrc"
#include "cption.hrc"
#include "cmdid.h"
 // #pragma ******************************************************************

 // ModalDialog **************************************************************
ModalDialog DLG_CAPTION
{
    HelpID = HID_DLG_CAPTION ;
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 250 , 127 ) ;
    Text = "Beschriftung" ;
    Text [ English ] = "Caption" ;
    Text [ norwegian ] = "Bildetekst" ;
    Text [ italian ] = "Dicitura" ;
    Text [ portuguese_brazilian ] = "Captura" ;
    Text [ portuguese ] = "Legenda" ;
    Text [ finnish ] = "Selite" ;
    Text [ danish ] = "Billedtekst" ;
    Text [ french ] = "Légende" ;
    Text [ swedish ] = "Bildtext" ;
    Text [ dutch ] = "Bijschrift" ;
    Text [ spanish ] = "Etiqueta" ;
    Text [ english_us ] = "Caption" ;
    Moveable = TRUE ;
    OKButton BTN_OK
    {
        DefButton = TRUE ;
        Pos = MAP_APPFONT ( 194 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    CancelButton BTN_CANCEL
    {
        Pos = MAP_APPFONT ( 194 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    HelpButton BTN_HELP
    {
        Pos = MAP_APPFONT ( 194 , 43 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    PushButton BTN_OPTION
    {
        Pos = MAP_APPFONT ( 194 , 63 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        Text = "~Optionen" ;
        Text [ English ] = "~Options" ;
        Text [ norwegian ] = "~Options" ;
        Text [ italian ] = "~Opzioni" ;
        Text [ portuguese_brazilian ] = "~Opções" ;
        Text [ portuguese ] = "~Opções" ;
        Text [ finnish ] = "~Määritykset" ;
        Text [ danish ] = "Indstillinger" ;
        Text [ french ] = "~Options" ;
        Text [ swedish ] = "~Alternativ" ;
        Text [ dutch ] = "~Opties" ;
        Text [ spanish ] = "~Opciones" ;
        Text [ english_us ] = "~Options" ;
        Text[ chinese_simplified ] = "Ñ¡Ïî(~O)";
        Text[ russian ] = "Ïàðàìåòðû";
        Text[ polish ] = "Opcje";
        Text[ japanese ] = "µÌß¼®Ý(~O)";
        Text[ chinese_traditional ] = "¿ï¶µ(~O)";
        Text[ arabic ] = "ÎíÇÑÇÊ";
        Text[ greek ] = "ÅðéëïãÝò";
        Text[ korean ] = "¿É¼Ç(~O)";
        Text[ turkish ] = "~Seçenekler";
        Text[ language_user1 ] = " ";
    };
    FixedText TXT_SAMPLE
    {
        Pos = MAP_APPFONT ( 12 , 14 ) ;
        Size = MAP_APPFONT ( 170 , 8 ) ;
        Center = TRUE ;
    };
    FixedText TXT_CATEGORY
    {
        Pos = MAP_APPFONT ( 12 , 30 ) ;
        Size = MAP_APPFONT ( 64 , 8 ) ;
        Text = "~Kategorie" ;
        Text [ English ] = "~Category" ;
        Text [ norwegian ] = "~Category" ;
        Text [ italian ] = "~Categoria" ;
        Text [ portuguese_brazilian ] = "~Categoria" ;
        Text [ portuguese ] = "~Categoria" ;
        Text [ finnish ] = "~Ryhmä" ;
        Text [ danish ] = "Kategori" ;
        Text [ french ] = "~Catégorie" ;
        Text [ swedish ] = "~Kategori" ;
        Text [ dutch ] = "~Categorie" ;
        Text [ spanish ] = "~Categoría" ;
        Text [ english_us ] = "C~ategory" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "·ÖÀà(~A)";
        Text[ russian ] = "Êàòåãîðèÿ";
        Text[ polish ] = "Kategoria";
        Text[ japanese ] = "¶ÃºÞذ(~A)";
        Text[ chinese_traditional ] = "¤ÀÃþ(~A)";
        Text[ arabic ] = "ÇáÝÆÉ";
        Text[ greek ] = "Êáôçãïñßá";
        Text[ korean ] = "ºÐ·ù Ç׸ñ(~A)";
        Text[ turkish ] = "~Kategori";
        Text[ language_user1 ] = " ";
    };
    ComboBox BOX_CATEGORY
    {
        Pos = MAP_APPFONT ( 82 , 28 ) ;
        Size = MAP_APPFONT ( 100 , 61 ) ;
        DropDown = TRUE ;
        TabStop = TRUE ;
        Sort = TRUE ;
    };
    FixedText TXT_FORMAT
    {
        Pos = MAP_APPFONT ( 12 , 45 ) ;
        Size = MAP_APPFONT ( 64 , 8 ) ;
        Text = "~Nummerierung" ;
        Text [ English ] = "~Numbering" ;
        Text [ norwegian ] = "~Numbering" ;
        Text [ italian ] = "~Numerazione" ;
        Text [ portuguese_brazilian ] = "~Numeração" ;
        Text [ portuguese ] = "~Numeração" ;
        Text [ finnish ] = "~Numerointi" ;
        Text [ danish ] = "Nummerering" ;
        Text [ french ] = "~Numérotation" ;
        Text [ swedish ] = "~Numrering" ;
        Text [ dutch ] = "~Nummering" ;
        Text [ spanish ] = "Nu~meración" ;
        Text [ english_us ] = "~Numbering" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "񅧏(~N)";
        Text[ russian ] = "Íóìåðàöèÿ";
        Text[ polish ] = "Numeracja";
        Text[ japanese ] = "”ԍ†•t‚¯(~N)";
        Text[ chinese_traditional ] = "½s¸¹(~N)";
        Text[ arabic ] = "ÇáÊÑÞíã";
        Text[ greek ] = "Áñßèìçóç";
        Text[ korean ] = "¹øÈ£ ¸Å±â±â(~N)";
        Text[ turkish ] = "~Numaralama";
        Text[ language_user1 ] = " ";
    };
    ListBox BOX_FORMAT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 82 , 43 ) ;
        Size = MAP_APPFONT ( 100 , 61 ) ;
        DropDown = TRUE ;
        TabStop = TRUE ;
    };
    FixedText TXT_TEXT
    {
        Pos = MAP_APPFONT ( 12 , 60 ) ;
        Size = MAP_APPFONT ( 64 , 8 ) ;
        Text = "~Beschriftungstext" ;
        Text [ English ] = "~Caption text" ;
        Text [ norwegian ] = "~Caption" ;
        Text [ italian ] = "~Dicitura" ;
        Text [ portuguese_brazilian ] = "~Legenda" ;
        Text [ portuguese ] = "~Legenda" ;
        Text [ finnish ] = "~Otsikko" ;
        Text [ danish ] = "Billedtekst" ;
        Text [ french ] = "~Texte de légende" ;
        Text [ swedish ] = "~Bildtext" ;
        Text [ dutch ] = "~Opschrift" ;
        Text [ spanish ] = "~Texto de etiqueta" ;
        Text [ english_us ] = "~Caption" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "±êÇ©ÎÄ(~C)";
        Text[ russian ] = "Òåêñò íàçâàíèÿ";
        Text[ polish ] = "Tekst etykiety";
        Text[ japanese ] = "×ÍÞÙ(~C)";
        Text[ chinese_traditional ] = "¼ÐÅÒ¤å(~C)";
        Text[ arabic ] = "äÕ ÇáÊÓãíÉ ÇáÊæÖíÍíÉ";
        Text[ greek ] = "Êåßìåíï åðéãñáöÞò";
        Text[ korean ] = "ĸ¼Ç(~C)";
        Text[ turkish ] = "R~esim yazýsý metni";
        Text[ language_user1 ] = " ";
    };
    Edit EDT_TEXT
    {
        Pos = MAP_APPFONT ( 82 , 58 ) ;
        Size = MAP_APPFONT ( 100 , 12 ) ;
        Border = TRUE ;
        TabStop = TRUE ;
        Left = TRUE ;
    };
    FixedText TXT_POS
    {
        Pos = MAP_APPFONT ( 12 , 75 ) ;
        Size = MAP_APPFONT ( 64 , 8 ) ;
        Left = TRUE ;
        Text = "~Position" ;
        Text [ English ] = "~Position" ;
        Text [ norwegian ] = "~Posisjon" ;
        Text [ italian ] = "~Posizione" ;
        Text [ portuguese_brazilian ] = "~Posição" ;
        Text [ portuguese ] = "~Posição" ;
        Text [ finnish ] = "A~sema" ;
        Text [ danish ] = "Placering" ;
        Text [ french ] = "~Position" ;
        Text [ swedish ] = "~Position" ;
        Text [ dutch ] = "~Positie" ;
        Text [ spanish ] = "~Posición" ;
        Text [ english_us ] = "~Position" ;
        Text[ chinese_simplified ] = "λÖÃ(~P)";
        Text[ russian ] = "Ïîçèöèÿ";
        Text[ polish ] = "Pozycja";
        Text[ japanese ] = "ˆÊ’u(~P)";
        Text[ chinese_traditional ] = "¦ì¸m(~P)";
        Text[ arabic ] = "ÇáãæÖÚ";
        Text[ greek ] = "ÈÝóç";
        Text[ korean ] = "À§Ä¡(~P)";
        Text[ turkish ] = "K~onum";
        Text[ language_user1 ] = " ";
    };
    ListBox BOX_POS
    {
        Pos = MAP_APPFONT ( 82 , 73 ) ;
        Size = MAP_APPFONT ( 100 , 61 ) ;
        DropDown = TRUE ;
        TabStop = TRUE ;
        Border = TRUE ;
    };
    CheckBox CB_COPY_ATTR
    {
        Pos = MAP_APPFONT ( 12 , 90) ;
        Size = MAP_APPFONT ( 145 , 12 ) ;
        TabStop = TRUE ;
        Hide = TRUE;
        Text = "~Umrandung und Schatten übernehmen" ;
        Text [ English ] = "~Copy border and shadow" ;
        Text[ english_us ] = "~Apply border and shadow";
        Text[ portuguese ] = "~Aplicar contornos e sombreado";
        Text[ russian ] = "Ïðèìåíèòü îáðàìëåíèå è òåíü";
        Text[ greek ] = "ÅöáñìïãÞ ðåñéãñÜììáôïò êáé óêéÜò";
        Text[ dutch ] = "~Omranding en schadow overnemen";
        Text[ french ] = "~Appliquer bordure et ombre";
        Text[ spanish ] = "Aceptar ~borde y sombra";
        Text[ italian ] = "~Applica bordo e ombra";
        Text[ danish ] = "Overtag ramme og skygge";
        Text[ swedish ] = "Ö~verta inramning och skugga";
        Text[ polish ] = "Przejmij obramowanie i cieñ";
        Text[ portuguese_brazilian ] = "~Copy border and shadow";
        Text[ japanese ] = "ŠO˜g‚Ɖe‚ðˆø—p(~A)";
        Text[ korean ] = "¿Ü°û¼±°ú ±×¸²ÀÚ Àû¿ë(~A)";
        Text[ chinese_simplified ] = "Ì×Óñ߿òºÍÒõÓ°(~A)";
        Text[ chinese_traditional ] = "±Ä¥ÎÃ䮨©M³±¼v(~A)";
        Text[ arabic ] = "ÊØÈíÞ ÇáÍÏæÏ æÇáÙá";
        Text[ turkish ] = "~Kenarlýk ve gölgeyi kullan";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_OBJECT_NAME
    {
        Pos = MAP_APPFONT ( 12 , 105 ) ;
        Size = MAP_APPFONT ( 64 , 8 ) ;
        Text = "~Objektname" ;
        Text [ English ] = "~Object name" ;
        Text[ english_us ] = "~Object name";
        Text[ portuguese ] = "~Nome do objecto";
        Text[ russian ] = "~Èìÿ îáúåêòà";
        Text[ greek ] = "¼íïìá áíôéêåéìÝíïõ";
        Text[ dutch ] = "~Objectnaam";
        Text[ french ] = "~Nom de l'objet";
        Text[ spanish ] = "~Nombre del objeto";
        Text[ italian ] = "~Nome oggetto";
        Text[ danish ] = "Objektnavn";
        Text[ swedish ] = "~Objektnamn";
        Text[ polish ] = "Nazwa obiektu";
        Text[ portuguese_brazilian ] = "~Object name";
        Text[ japanese ] = "µÌÞ¼Þª¸Ä–¼(~O)";
        Text[ korean ] = "°³Ã¼À̸§(~O)";
        Text[ chinese_simplified ] = "¶ÔÏóÃû³Æ(~O)";
        Text[ chinese_traditional ] = "ª«¥ó¦WºÙ(~O)";
        Text[ arabic ] = "ÇÓã ÇáßÇÆä";
        Text[ turkish ] = "N~esne adý";
        Text[ language_user1 ] = " ";
    };
    Edit ED_OBJECT_NAME
    {
        Pos = MAP_APPFONT ( 82 , 103 ) ;
        Size = MAP_APPFONT ( 100 , 12 ) ;
        Border = TRUE ;
        TabStop = TRUE ;
        Left = TRUE ;
    };
    GroupBox GRP_SETTINGS
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 182 , 118 ) ;
        Text = "Einstellungen" ;
        Text [ English ] = "Settings" ;
        Text [ norwegian ] = "Settings" ;
        Text [ italian ] = "Impostazioni" ;
        Text [ portuguese_brazilian ] = "Parâmetros" ;
        Text [ portuguese ] = "Predefinições" ;
        Text [ finnish ] = "Asetukset" ;
        Text [ danish ] = "Indstillinger" ;
        Text [ french ] = "Paramètres" ;
        Text [ swedish ] = "Inställningar" ;
        Text [ dutch ] = "Instellingen" ;
        Text [ spanish ] = "Configuración" ;
        Text [ english_us ] = "Settings" ;
        Text[ chinese_simplified ] = "É趨";
        Text[ russian ] = "Íàñòðîéêè";
        Text[ polish ] = "Ustawienia";
        Text[ japanese ] = "Ý’è";
        Text[ chinese_traditional ] = "³]©w";
        Text[ arabic ] = "ÇáÅÚÏÇÏÇÊ";
        Text[ greek ] = "Ñõèìßóåéò";
        Text[ korean ] = "¼³Á¤";
        Text[ turkish ] = "Ayarlar";
        Text[ language_user1 ] = " ";
    };
    String STR_BEGINNING
    {
        Text = "Am Anfang" ;
        Text [ English ] = "At the beginning" ;
        Text [ norwegian ] = "At the beginning" ;
        Text [ italian ] = "All'inizio" ;
        Text [ portuguese_brazilian ] = "No início" ;
        Text [ portuguese ] = "No início" ;
        Text [ finnish ] = "Alussa" ;
        Text [ danish ] = "Ved begyndelsen" ;
        Text [ french ] = "Au début" ;
        Text [ swedish ] = "I början" ;
        Text [ dutch ] = "Aan het begin" ;
        Text [ spanish ] = "Al principio" ;
        Text [ english_us ] = "Above" ;
        Text[ chinese_simplified ] = "ÔÚÊ×¶Ë";
        Text[ russian ] = " íà÷àëå";
        Text[ polish ] = "Na pocz¹tku";
        Text[ japanese ] = "Å‰‚É";
        Text[ chinese_traditional ] = "¦b­ººÝ";
        Text[ arabic ] = "Ýí ÇáÈÏÇíÉ";
        Text[ greek ] = "Óôçí áñ÷Þ";
        Text[ korean ] = "ˤ";
        Text[ turkish ] = "Baþta";
        Text[ language_user1 ] = " ";
    };
    String STR_END
    {
        Text = "Am Ende" ;
        Text [ English ] = "At the end" ;
        Text [ norwegian ] = "At the end" ;
        Text [ italian ] = "Alla fine" ;
        Text [ portuguese_brazilian ] = "Ao final" ;
        Text [ portuguese ] = "No fim" ;
        Text [ finnish ] = "Lopussa" ;
        Text [ danish ] = "Ved slutningen" ;
        Text [ french ] = "À la fin" ;
        Text [ swedish ] = "I slutet" ;
        Text [ dutch ] = "Aan het einde" ;
        Text [ spanish ] = "Al final" ;
        Text [ english_us ] = "Below" ;
        Text[ chinese_simplified ] = "ÔÚβ¶Ë";
        Text[ russian ] = "Â êîíöå";
        Text[ polish ] = "Na koñcu";
        Text[ japanese ] = "ÅŒã‚É";
        Text[ chinese_traditional ] = "¦b§ÀºÝ";
        Text[ arabic ] = "Ýí ÇáäåÇíÉ";
        Text[ greek ] = "Óôï ôÝëïò";
        Text[ korean ] = "¾Æ·¡";
        Text[ turkish ] = "Sonda";
        Text[ language_user1 ] = " ";
    };
    String STR_ABOVE
    {
        Text = "Oberhalb" ;
        Text [ English ] = "Above" ;
        Text [ norwegian ] = "Above" ;
        Text [ italian ] = "Al di sopra" ;
        Text [ portuguese_brazilian ] = "Acima" ;
        Text [ portuguese ] = "Acima" ;
        Text [ finnish ] = "Yläpuolella" ;
        Text [ danish ] = "Over" ;
        Text [ french ] = "Supra" ;
        Text [ swedish ] = "Över" ;
        Text [ dutch ] = "Boven" ;
        Text [ spanish ] = "Encima" ;
        Text [ english_us ] = "Above" ;
        Text[ chinese_simplified ] = "Ö®ÉÏ";
        Text[ russian ] = "Ñâåðõó";
        Text[ polish ] = "Powy¿ej";
        Text[ japanese ] = "ã‚É";
        Text[ chinese_traditional ] = "¤§¤W";
        Text[ arabic ] = "ÃÚáì";
        Text[ greek ] = "ÐÜíù áðü";
        Text[ korean ] = "ˤ";
        Text[ turkish ] = "Üstte";
        Text[ language_user1 ] = " ";
    };
    String STR_CP_BELOW
    {
        Text = "Unterhalb" ;
        Text [ English ] = "Below" ;
        Text [ norwegian ] = "Below" ;
        Text [ italian ] = "Al di sotto" ;
        Text [ portuguese_brazilian ] = "Abaixo" ;
        Text [ portuguese ] = "Abaixo" ;
        Text [ finnish ] = "Alapuolella" ;
        Text [ danish ] = "Under" ;
        Text [ french ] = "Infra" ;
        Text [ swedish ] = "Nedanför" ;
        Text [ dutch ] = "Beneden" ;
        Text [ spanish ] = "Debajo" ;
        Text [ english_us ] = "Below" ;
        Text[ chinese_simplified ] = "Ö®ÏÂ";
        Text[ russian ] = "Ñíèçó";
        Text[ polish ] = "Poni¿ej";
        Text[ japanese ] = "‰º‚É";
        Text[ chinese_traditional ] = "¤§¤U";
        Text[ arabic ] = "ÃÓÝá";
        Text[ greek ] = "ÊÜôù áðü";
        Text[ korean ] = "¾Æ·¡";
        Text[ turkish ] = "Altta";
        Text[ language_user1 ] = " ";
    };
    Text[ chinese_simplified ] = "±êÇ©";
    Text[ russian ] = "Íàçâàíèå";
    Text[ polish ] = "Opis";
    Text[ japanese ] = "×ÍÞÙ";
    Text[ chinese_traditional ] = "¼ÐÅÒ";
    Text[ arabic ] = "ÊÓãíÉ ÊæÖíÍíÉ";
    Text[ greek ] = "ÅðéãñáöÞ";
    Text[ korean ] = "ĸ¼Ç";
    Text[ turkish ] = "Resim yazýsý";
    Text[ language_user1 ] = " ";
};
ModalDialog DLG_SEQUENCE_OPTION
{
    HelpID = HID_DLG_SEQUENCE_OPTION ;
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 165 , 64 ) ;
    Text = "Nummernkreis Optionen" ;
    TEXT [ English ] = "Sequence options" ;
    Moveable = TRUE ;
    OKButton BTN_OK
    {
        DefButton = TRUE ;
        Pos = MAP_APPFONT ( 110 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    CancelButton BTN_CANCEL
    {
        Pos = MAP_APPFONT ( 110 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    HelpButton BTN_HELP
    {
        Pos = MAP_APPFONT ( 110 , 43 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    GroupBox GB_HEADER
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 97 , 54 ) ;
        TEXT = "Kapitelweise Nummerierung" ;
        TEXT [ English ] = "Chapter numbering" ;
        Text [ english_us ] = "Numbering by chapter" ;
        Text [ portuguese_brazilian ] = "Kapitelweise Numerierung" ;
        Text [ swedish ] = "Numrering kapitelvis" ;
        Text [ danish ] = "Kapitelvis nummerering" ;
        Text [ italian ] = "Numerazione a capitoli" ;
        Text [ spanish ] = "Numeración de capítulos" ;
        Text [ french ] = "Par chapitre" ;
        Text [ dutch ] = "Hoofdstuksgewijs nummeren" ;
        Text [ portuguese ] = "Numeração por capítulos" ;
        Text[ chinese_simplified ] = "°´Õ±àºÅ";
        Text[ russian ] = "Íóìåðàöèÿ ïî ãëàâàì";
        Text[ polish ] = "Numeracja wed³ug rozdzia³ów";
        Text[ japanese ] = "Í‚²‚Ƃ̔ԍ†•t‚¯";
        Text[ chinese_traditional ] = "«ö³¹½s¸¹";
        Text[ arabic ] = "ÊÑÞíã ÇáÝÕæá";
        Text[ greek ] = "Áñßèìçóç êáôÜ êåöÜëáéá";
        Text[ korean ] = "Àå ¹øÈ£ ¸Å±â±â";
        Text[ turkish ] = "Bölüme göre numaralama";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_LEVEL
    {
        Pos = MAP_APPFONT ( 17 , 20 ) ;
        Size = MAP_APPFONT ( 30 , 10 ) ;
        TEXT = "E~bene" ;
        TEXT [ English ] = "~Level" ;
        Text [ portuguese ] = "~Nível" ;
        Text [ english_us ] = "~Level" ;
        Text [ portuguese_brazilian ] = "E~bene" ;
        Text [ swedish ] = "~Nivå" ;
        Text [ danish ] = "Niveau" ;
        Text [ italian ] = "Li~vello" ;
        Text [ spanish ] = "~Nivel" ;
        Text [ french ] = "Ni~veau" ;
        Text [ dutch ] = "N~iveau" ;
        Text[ chinese_simplified ] = "¼¶(~L)";
        Text[ russian ] = "Óðîâåíü";
        Text[ polish ] = "Poziom";
        Text[ japanese ] = "ÚÍÞÙ(~L)";
        Text[ chinese_traditional ] = "¯Å(~L)";
        Text[ arabic ] = "ÇáãÓÊæì";
        Text[ greek ] = "Åðßðåäï";
        Text[ korean ] = "¼öÁØ(~L)";
        Text[ turkish ] = "D~üzey";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_LEVEL
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 50 , 19 ) ;
        Size = MAP_APPFONT ( 46 , 60 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        StringList =
        {
            < "Keine" ; > ;
        };
        stringlist [ english ] =
        {
            < "Keine" ; > ;
        };
        stringlist [ portuguese ] =
        {
            < "Nenhum" ; > ;
        };
        stringlist [ english_us ] =
        {
            < "None" ; > ;
        };
        stringlist [ portuguese_brazilian ] =
        {
            < "Keine" ; > ;
        };
        stringlist [ swedish ] =
        {
            < "Inga" ; > ;
        };
        stringlist [ danish ] =
        {
            < "Ingen" ; > ;
        };
        stringlist [ italian ] =
        {
            < "Senza" ; > ;
        };
        stringlist [ spanish ] =
        {
            < "Ninguna" ; > ;
        };
        stringlist [ french ] =
        {
            < "Aucun(e)" ; > ;
        };
        stringlist [ dutch ] =
        {
            < "Geen" ; > ;
        };
    StringList [ chinese_simplified ] =
    {
             < "ÎÞ" ; > ;
    };
    StringList [ russian ] =
    {
             < "Áåç" ; > ;
    };
    StringList [ polish ] =
    {
             < "Brak" ; > ;
    };
    StringList [ japanese ] =
    {
             < "‚È‚µ" ; > ;
    };
    StringList [ language_user1 ] =
    {
             < " " ; > ;
    };
    StringList [ chinese_traditional ] =
    {
             < "µL" ; > ;
    };
    StringList [ arabic ] =
    {
             < "ÈÏæä" ; > ;
    };
    StringList [ greek ] =
    {
             < "ÊáíÝíá" ; > ;
    };
    StringList [ korean ] =
    {
             < "¾øÀ½" ; > ;
    };
    StringList [ turkish ] =
    {
             < "Yok" ; > ;
    };
    };
    FixedText FT_SEPARATOR
    {
        Pos = MAP_APPFONT ( 17 , 35 ) ;
        Size = MAP_APPFONT ( 30 , 10 ) ;
        TEXT = "~Trenner" ;
        TEXT [ English ] = "~Separator" ;
        Text [ english_us ] = "~Separator" ;
        Text [ portuguese_brazilian ] = "~Trenner" ;
        Text [ swedish ] = "A~vdelare" ;
        Text [ danish ] = "Separator" ;
        Text [ italian ] = "~Separatore" ;
        Text [ spanish ] = "~Separador" ;
        Text [ french ] = "~Séparateurs" ;
        Text [ dutch ] = "~Scheidingsteken" ;
        Text [ portuguese ] = "~Separador" ;
        Text[ chinese_simplified ] = "·Ö¸ô·û(~S)";
        Text[ russian ] = "Ðàçäåëèòåëü";
        Text[ polish ] = "Separator";
        Text[ japanese ] = "‹æØ‚è‹L†(~S)";
        Text[ chinese_traditional ] = "³s±µ²Å(~S)";
        Text[ arabic ] = "ÇáÝÇÕá";
        Text[ greek ] = "Äéá÷ùñéóôéêü";
        Text[ korean ] = "±¸ºÐÀÚ(~S)";
        Text[ turkish ] = "A~yýrma iþr.";
        Text[ language_user1 ] = " ";
    };
    Edit ED_SEPARATOR
    {
        Pos = MAP_APPFONT ( 50 , 34 ) ;
        Size = MAP_APPFONT ( 46 , 12 ) ;
        Border = TRUE ;
        MaxTextLength = 1 ;
        TEXT = "." ;
    };
    Text [ english_us ] = "Number range options" ;
    Text [ portuguese_brazilian ] = "Nummernkreis Optionen" ;
    Text [ swedish ] = "Sekvens alternativ" ;
    Text [ danish ] = "Sekvensnummerering-indstillinger" ;
    Text [ italian ] = "Opzioni sequenza" ;
    Text [ spanish ] = "Opciones de secuencias" ;
    Text [ french ] = "Options de séquence" ;
    Text [ dutch ] = "Nummerreeks-opties" ;
    Text [ portuguese ] = "Opções de sequências" ;
    Text[ chinese_simplified ] = "ºÅÂëÐòÁÐÑ¡Ïî";
    Text[ russian ] = "Ïàðàìåòðû ïîðÿäêîâîãî íîìåðà";
    Text[ polish ] = "Opcje sekwencji";
    Text[ japanese ] = "ˆê˜A”ԍ†‚̵Ìß¼®Ý";
    Text[ chinese_traditional ] = "½s¸¹§Ç¦C¿ï¶µ";
    Text[ arabic ] = "ÎíÇÑÇÊ ÇáÊÑÞíã ÇáãÊÓáÓá";
    Text[ greek ] = "ÅðéëïãÝò êýêëïõ áñéèìþí";
    Text[ korean ] = "¼ýÀÚ ¿µ¿ª ¿É¼Ç";
    Text[ turkish ] = "Numara aralýðý seçenekleri";
    Text[ language_user1 ] = " ";
};
 // ********************************************************************** EOF
diff --git a/sw/source/ui/frmdlg/frmdlg.cxx b/sw/source/ui/frmdlg/frmdlg.cxx
new file mode 100644
index 0000000..386c367
--- /dev/null
+++ b/sw/source/ui/frmdlg/frmdlg.cxx
@@ -0,0 +1,332 @@
/*************************************************************************
 *
 *  $RCSfile: frmdlg.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:37 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _UIPARAM_HXX
#include <uiparam.hxx>
#endif

#ifndef _LIST_HXX //autogen
#include <tools/list.hxx>
#endif
#ifndef _SFXVIEWFRM_HXX //autogen
#include <sfx2/viewfrm.hxx>
#endif
#ifndef _SVX_HTMLMODE_HXX
#include <svx/htmlmode.hxx>
#endif
#ifndef _SVX_BORDER_HXX
#include <svx/border.hxx>
#endif
#ifndef _SVX_BACKGRND_HXX //autogen
#include <svx/backgrnd.hxx>
#endif
#ifndef _SVX_GRFPAGE_HXX //autogen
#include <svx/grfpage.hxx>
#endif
#ifndef _OFA_HTMLCFG_HXX //autogen
#include <offmgr/htmlcfg.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif


#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _VIEWOPT_HXX
#include <viewopt.hxx>
#endif
#ifndef _FRMDLG_HXX
#include <frmdlg.hxx>
#endif
#ifndef _FRMPAGE_HXX
#include <frmpage.hxx>
#endif
#ifndef _WRAP_HXX
#include <wrap.hxx>
#endif
#ifndef _COLUMN_HXX
#include <column.hxx>
#endif
#ifndef _MACASSGN_HXX
#include <macassgn.hxx>
#endif

#ifndef _FRMUI_HRC
#include <frmui.hrc>
#endif
#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif

/*--------------------------------------------------------------------
    Beschreibung:   Der Traeger des Dialoges
 --------------------------------------------------------------------*/

SwFrmDlg::SwFrmDlg( SfxViewFrame*       pFrame,
                    Window*             pParent,
                    const SfxItemSet&   rCoreSet,
                    BOOL                bNewFrm,
                    USHORT              nResType,
                    BOOL                bFmt,
                    UINT16              nDefPage,
                    const String*       pStr) :

    SfxTabDialog(pFrame, pParent, SW_RES(nResType), &rCoreSet, pStr != 0),
    bNew(bNewFrm),
    bFormat(bFmt),
    rSet(rCoreSet),
    nDlgType(nResType),
    pWrtShell(((SwView*)pFrame->GetViewShell())->GetWrtShellPtr())
{
    FreeResource();
    USHORT nHtmlMode = ::GetHtmlMode(pWrtShell->GetView().GetDocShell());
    BOOL bHtmlMode = nHtmlMode & HTMLMODE_ON;

    // BspFont fuer beide Bsp-TabPages
    //
    if(pStr)
    {
        String aTmp( GetText() );
        aTmp += SW_RESSTR(STR_COLL_HEADER);
        aTmp += *pStr;
        aTmp += ')';
    }
    AddTabPage(TP_FRM_STD,  SwFrmPage::Create, 0);
    AddTabPage(TP_FRM_ADD,  SwFrmAddPage::Create, 0);
    AddTabPage(TP_FRM_WRAP, SwWrapTabPage::Create, 0);
    AddTabPage(TP_FRM_URL,  SwFrmURLPage::Create, 0);
    if(nDlgType == DLG_FRM_GRF)
    {
        AddTabPage( TP_GRF_EXT, SwGrfExtPage::Create, 0 );
        AddTabPage( RID_SVXPAGE_GRFCROP, SvxGrfCropPage::Create, 0 );
    }
    if (nDlgType == DLG_FRM_STD)
    {
        AddTabPage(TP_COLUMN,   SwColumnPage::Create,    0);
    }
    AddTabPage(TP_BACKGROUND,SvxBackgroundTabPage::Create,  0);
    AddTabPage( TP_MACRO_ASSIGN, SfxSmallMacroTabPage::Create, 0);
    AddTabPage( TP_BORDER,   SvxBorderTabPage::Create,      0);

    if(bHtmlMode)
    {
        switch( nDlgType )
        {
        case DLG_FRM_STD:
                if(0  == (nHtmlMode & HTMLMODE_SOME_ABS_POS))
                    RemoveTabPage(TP_BORDER);
                RemoveTabPage(TP_COLUMN);
            // kein break
        case DLG_FRM_OLE:
                RemoveTabPage(TP_FRM_URL);
                RemoveTabPage(TP_MACRO_ASSIGN);
            break;
        case DLG_FRM_GRF:
                RemoveTabPage(RID_SVXPAGE_GRFCROP);
            break;
        }
        if( 0  == (nHtmlMode & HTMLMODE_SOME_ABS_POS) ||
            nDlgType != DLG_FRM_STD )
            RemoveTabPage(TP_BACKGROUND);
    }

    if (bNew)
        SetCurPageId(TP_FRM_STD);

    if (nDefPage)
        SetCurPageId(nDefPage);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SwFrmDlg::~SwFrmDlg()
{
}




void SwFrmDlg::PageCreated( USHORT nId, SfxTabPage &rPage )
{
    switch ( nId )
    {
    case TP_FRM_STD:
        ((SwFrmPage&)rPage).SetNewFrame(bNew);
        ((SwFrmPage&)rPage).SetFormatUsed(bFormat);
        ((SwFrmPage&)rPage).SetFrmType(nDlgType);
        break;

    case TP_FRM_ADD:
        ((SwFrmAddPage&)rPage).SetFormatUsed(bFormat);
        ((SwFrmAddPage&)rPage).SetFrmType(nDlgType);
        ((SwFrmAddPage&)rPage).SetNewFrame(bNew);
        ((SwFrmAddPage&)rPage).SetShell(pWrtShell);
        break;

    case TP_FRM_WRAP:
        ((SwWrapTabPage&)rPage).SetNewFrame(bNew);
        ((SwWrapTabPage&)rPage).SetFormatUsed(bFormat, FALSE);
        ((SwWrapTabPage&)rPage).SetShell(pWrtShell);
        break;

    case TP_COLUMN:
        {
            ((SwColumnPage&)rPage).SetFrmMode(TRUE);
            ((SwColumnPage&)rPage).SetFormatUsed(bFormat);

            const SwFmtFrmSize& rSize = (const SwFmtFrmSize&)
                                                rSet.Get( RES_FRM_SIZE );
            ((SwColumnPage&)rPage).SetPageWidth( rSize.GetWidth() );
        }
        break;

    case TP_MACRO_ASSIGN:
        SwMacroAssignDlg::AddEvents( (SfxSmallMacroTabPage&)rPage,
            DLG_FRM_GRF == nDlgType ? MACASSGN_GRAPHIC
                            : DLG_FRM_OLE == nDlgType ? MACASSGN_OLE
                                                      : MACASSGN_FRMURL );
        break;

    case TP_BACKGROUND:
        if( DLG_FRM_STD == nDlgType )
            ((SvxBackgroundTabPage&)rPage).ShowSelector();
        break;

    case TP_BORDER:
        ((SvxBorderTabPage&) rPage).SetSWMode(SW_BORDER_MODE_FRAME);
        break;
    }
}


/*-----------------25.02.94 21:22-------------------
   $Log: not supported by cvs2svn $
   Revision 1.196  2000/09/18 16:05:33  willem.vandorp
   OpenOffice header added.

   Revision 1.195  2000/08/25 14:10:11  jp
   Graphic Crop-Attribut and TabPage exported to SVX

   Revision 1.194  2000/06/20 14:47:24  os
   #70060# less occurences of columns in HTML

   Revision 1.193  1998/07/17 08:18:06  OS
   SfxxSmallMacroTabPage einsetzen #52809#


      Rev 1.192   17 Jul 1998 10:18:06   OS
   SfxxSmallMacroTabPage einsetzen #52809#

      Rev 1.191   15 Jun 1998 21:15:48   MH
   add: list.hxx

      Rev 1.190   16 Apr 1998 13:11:10   OS
   Rahmenanpassung die zweite

      Rev 1.189   06 Apr 1998 09:48:24   OS
   HTML-Anpassungen

      Rev 1.188   28 Nov 1997 19:41:18   MA
   includes

      Rev 1.187   24 Nov 1997 17:40:14   MA
   include

      Rev 1.186   03 Nov 1997 13:19:48   MA
   precomp entfernt

      Rev 1.185   01 Sep 1997 13:29:54   OS
   DLL-Umstellung

      Rev 1.184   15 Aug 1997 12:13:22   OS
   chartar/frmatr/txtatr aufgeteilt

      Rev 1.183   11 Aug 1997 12:45:16   MH
   chg: header

      Rev 1.182   03 Jul 1997 12:54:34   OS
   SwSwMode jetzt mit BYTE #41255#

      Rev 1.181   29 Apr 1997 15:04:48   OS
   Hintergrund auch fuer OLE

--------------------------------------------------*/


diff --git a/sw/source/ui/frmdlg/frmmgr.cxx b/sw/source/ui/frmdlg/frmmgr.cxx
new file mode 100644
index 0000000..a9d9a87
--- /dev/null
+++ b/sw/source/ui/frmdlg/frmmgr.cxx
@@ -0,0 +1,832 @@
/*************************************************************************
 *
 *  $RCSfile: frmmgr.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:37 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "cmdid.h"
#ifndef _UIPARAM_HXX
#include <uiparam.hxx>
#endif
#include "hintids.hxx"


#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _SVX_PROTITEM_HXX //autogen
#include <svx/protitem.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_OPAQITEM_HXX //autogen
#include <svx/opaqitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _SVX_SHADITEM_HXX //autogen
#include <svx/shaditem.hxx>
#endif


#ifndef _FMTCLDS_HXX //autogen
#include <fmtclds.hxx>
#endif
#include "wrtsh.hxx"
#include "view.hxx"
#include "viewopt.hxx"
#include "uitool.hxx"
#include "frmmgr.hxx"
#include "format.hxx"
#include "mdiexp.hxx"
#include "poolfmt.hxx"

static USHORT __FAR_DATA aFrmMgrRange[] = {
                            RES_FRMATR_BEGIN, RES_FRMATR_END-1,
                            SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER,
                            FN_SET_FRM_NAME, FN_SET_FRM_NAME,
                            0};

/*--------------------------------------------------------------------
     Beschreibung: Rahmen-Attribute ueber Shell ermitteln
 --------------------------------------------------------------------*/

SwFlyFrmAttrMgr::SwFlyFrmAttrMgr( BOOL bNew, SwWrtShell* pSh, BYTE nType ) :
    bAbsPos( FALSE ),
    bNewFrm( bNew ),
    aSet( (SwAttrPool&)pSh->GetAttrPool(), aFrmMgrRange ),
    pOwnSh( pSh )

{
    if ( bNewFrm )
    {
        // Defaults einstellen:
        USHORT nId;
        switch ( nType )
        {
            case FRMMGR_TYPE_TEXT:  nId = RES_POOLFRM_FRAME;    break;
            case FRMMGR_TYPE_OLE:   nId = RES_POOLFRM_OLE;      break;
            case FRMMGR_TYPE_GRF:   nId = RES_POOLFRM_GRAPHIC;  break;
        }
        aSet.SetParent( &pOwnSh->GetFmtFromPool( nId )->GetAttrSet());
        aSet.Put( SwFmtFrmSize( ATT_MIN_SIZE, DFLT_WIDTH, DFLT_HEIGHT ));
        if ( 0 != ::GetHtmlMode(pSh->GetView().GetDocShell()) )
            aSet.Put( SwFmtHoriOrient( 0, HORI_LEFT, PRTAREA ) );
    }
    else if ( nType == FRMMGR_TYPE_NONE )
        pOwnSh->GetFlyFrmAttr( aSet );
    ::PrepareBoxInfo( aSet, *pOwnSh );
}

SwFlyFrmAttrMgr::SwFlyFrmAttrMgr( BOOL bNew, SwWrtShell* pSh, const SfxItemSet &rSet ) :
    bAbsPos( FALSE ),
    bNewFrm( bNew ),
    aSet( rSet ),
    pOwnSh( pSh )

{
}


/*--------------------------------------------------------------------
     Beschreibung:  Initialisieren
 --------------------------------------------------------------------*/

void SwFlyFrmAttrMgr::UpdateAttrMgr()
{
    if ( !bNewFrm && pOwnSh->IsFrmSelected() )
        pOwnSh->GetFlyFrmAttr( aSet );
    ::PrepareBoxInfo( aSet, *pOwnSh );
}

void SwFlyFrmAttrMgr::_UpdateFlyFrm()
{
    const SfxPoolItem* pItem = 0;

    if (aSet.GetItemState(FN_SET_FRM_NAME, FALSE, &pItem) == SFX_ITEM_SET)
        pOwnSh->SetFlyName(((SfxStringItem *)pItem)->GetValue());

    pOwnSh->SetModified();

    if ( bAbsPos )
    {
        pOwnSh->SetFlyPos( aAbsPos );
        bAbsPos = FALSE;
    }
}

/*--------------------------------------------------------------------
    Beschreibung: Bestehenden Fly-Frame aendern
 --------------------------------------------------------------------*/

void SwFlyFrmAttrMgr::UpdateFlyFrm()
{
    ASSERT( pOwnSh->IsFrmSelected(),
        "Kein Rahmen selektiert oder keine Shell, Update nicht moeglich");

    // return wg. BASIC
    if( !aSet.Count() || !pOwnSh->IsFrmSelected() )
        return;

    pOwnSh->StartAllAction();
    pOwnSh->SetFlyFrmAttr( aSet );
    _UpdateFlyFrm();
    pOwnSh->EndAllAction();
}

/*--------------------------------------------------------------------
     Beschreibung:  Rahmen einfuegen
 --------------------------------------------------------------------*/

BOOL SwFlyFrmAttrMgr::InsertFlyFrm()
{
    pOwnSh->StartAllAction();

    BOOL bRet = 0 != pOwnSh->NewFlyFrm( aSet );

    // richtigen Mode an der Shell einschalten, Rahmen wurde aut. selektiert.
    if ( bRet )
    {
        _UpdateFlyFrm();
        pOwnSh->EnterSelFrmMode();
        FrameNotify(pOwnSh, FLY_DRAG_START);
    }
    pOwnSh->EndAllAction();
    return bRet;
}

/*------------------------------------------------------------------------
 Beschreibung:  Rahmen des Typs eAnchorType einfuegen. Position und
                Groesse werden explizit angegeben.
                Nicht erlaubte Werte des Aufzaehlungstypes werden
                korrigiert.
------------------------------------------------------------------------*/

void SwFlyFrmAttrMgr::InsertFlyFrm(RndStdIds    eAnchorType,
                                   const Point  &rPos,
                                   const Size   &rSize,
                                   BOOL bAbs )
{
    ASSERT( eAnchorType == FLY_PAGE     ||
            eAnchorType == FLY_AT_CNTNT ||
            eAnchorType == FLY_AUTO_CNTNT ||
            eAnchorType == FLY_AT_FLY ||
            eAnchorType == FLY_IN_CNTNT, "Rahmentyp nicht erlaubt" );

    if ( bAbs )
        SetAbsPos( rPos );
    else
        SetPos( rPos );

    SetSize( rSize );
    SetAnchor( eAnchorType );
    InsertFlyFrm();
}

/*--------------------------------------------------------------------
     Beschreibung:  Anker setzen
 --------------------------------------------------------------------*/

void SwFlyFrmAttrMgr::SetAnchor( RndStdIds eId )
{
    USHORT nPhyPageNum, nVirtPageNum;
    pOwnSh->GetPageNum( nPhyPageNum, nVirtPageNum );

    aSet.Put( SwFmtAnchor( eId, nPhyPageNum ) );
    if( FLY_PAGE == eId || FLY_AT_CNTNT == eId || FLY_AUTO_CNTNT == eId
        || FLY_AT_FLY == eId )
    {
        SwFmtVertOrient aVertOrient( GetVertOrient() );
        SwFmtHoriOrient aHoriOrient( GetHoriOrient() );
        aHoriOrient.SetRelationOrient( FRAME );
        aVertOrient.SetRelationOrient( FRAME );
        aSet.Put( aVertOrient );
        aSet.Put( aHoriOrient );
    }
}

/*------------------------------------------------------------------------
 Beschreibung:  Setzen des Attributs fuer Spalten
------------------------------------------------------------------------*/

void SwFlyFrmAttrMgr::SetCol( const SwFmtCol &rCol )
{
    aSet.Put( rCol );
}
/*--------------------------------------------------------------------
     Beschreibung:  Absolute Position setzen
 --------------------------------------------------------------------*/

void SwFlyFrmAttrMgr::SetAbsPos( const Point& rPoint )
{
    bAbsPos = TRUE;
    aAbsPos = rPoint;

    SwFmtVertOrient aVertOrient( GetVertOrient() );
    SwFmtHoriOrient aHoriOrient( GetHoriOrient() );
    aHoriOrient.SetHoriOrient( HORI_NONE );
    aVertOrient.SetVertOrient( VERT_NONE );
    aSet.Put( aVertOrient );
    aSet.Put( aHoriOrient );
}

/*--------------------------------------------------------------------
    Beschreibung: Metriken auf Korrektheit pruefen
 --------------------------------------------------------------------*/

void SwFlyFrmAttrMgr::ValidateMetrics( SwFrmValid& rVal, BOOL bOnlyPercentRefValue )
{
    if (!bOnlyPercentRefValue)
    {
        rVal.nMinHeight = MINFLY + CalcTopSpace() + CalcBottomSpace();
        rVal.nMinWidth =  MINFLY + CalcLeftSpace()+ CalcRightSpace();
    }

    SwRect aBoundRect;

    pOwnSh->CalcBoundRect(aBoundRect, rVal.eArea, rVal.eHRel, rVal.bMirror, NULL, &rVal.aPercentSize);

    if (bOnlyPercentRefValue)
        return;

    if ( rVal.eArea == FLY_PAGE || rVal.eArea == FLY_AT_FLY )
    {
        // MinimalPosition
        rVal.nMinHPos = aBoundRect.Left();
        rVal.nMinVPos = aBoundRect.Top();
        SwTwips nH = rVal.nHPos;
        SwTwips nV = rVal.nVPos;

        if (rVal.nHPos + rVal.nWidth > aBoundRect.Right())
        {
            if (rVal.eHori == HORI_NONE)
            {
                rVal.nHPos -= ((rVal.nHPos + rVal.nWidth) - aBoundRect.Right());
                nH = rVal.nHPos;
            }
            else
                rVal.nWidth = aBoundRect.Right() - rVal.nHPos;
        }

        if (rVal.nHPos + rVal.nWidth > aBoundRect.Right())
            rVal.nWidth = aBoundRect.Right() - rVal.nHPos;

        if (rVal.nVPos + rVal.nHeight > aBoundRect.Bottom())
        {
            if (rVal.eVert == SVX_VERT_NONE)
            {
                rVal.nVPos -= ((rVal.nVPos + rVal.nHeight) - aBoundRect.Bottom());
                nV = rVal.nVPos;
            }
            else
                rVal.nHeight = aBoundRect.Bottom() - rVal.nVPos;
        }

        if (rVal.nVPos + rVal.nHeight > aBoundRect.Bottom())
            rVal.nHeight = aBoundRect.Bottom() - rVal.nVPos;

        if ( rVal.eVert != SVX_VERT_NONE )
            nV = aBoundRect.Top();

        if ( rVal.eHori != HORI_NONE )
            nH = aBoundRect.Left();

        rVal.nMaxHPos   = aBoundRect.Right()  - rVal.nWidth;
        rVal.nMaxHeight = aBoundRect.Bottom() - nV;

        rVal.nMaxVPos   = aBoundRect.Bottom() - rVal.nHeight;
        rVal.nMaxWidth  = aBoundRect.Right()  - nH;
    }
    else if ( rVal.eArea == FLY_AT_CNTNT || rVal.eArea == FLY_AUTO_CNTNT )
    {
        SwTwips nH = rVal.nHPos;
        SwTwips nV = rVal.nVPos;

        if (rVal.nHPos + rVal.nWidth > aBoundRect.Right())
        {
            if (rVal.eHori == HORI_NONE)
            {
                rVal.nHPos -= ((rVal.nHPos + rVal.nWidth) - aBoundRect.Right());
                nH = rVal.nHPos;
            }
            else
                rVal.nWidth = aBoundRect.Right() - rVal.nHPos;
        }

        if (rVal.nVPos + rVal.nHeight > aBoundRect.Bottom())
        {
            if (rVal.eVert == SVX_VERT_NONE)
            {
                rVal.nVPos -= ((rVal.nVPos + rVal.nHeight) - aBoundRect.Bottom());
                nV = rVal.nVPos;
            }
            else
                rVal.nHeight = aBoundRect.Bottom() - rVal.nVPos;
        }

        if ( rVal.eVert != SVX_VERT_NONE )
            nV = aBoundRect.Top();

        if ( rVal.eHori != HORI_NONE )
            nH = aBoundRect.Left();

        rVal.nMinVPos  = aBoundRect.Top();
        rVal.nMaxVPos  = aBoundRect.Height() - rVal.nHeight;

        rVal.nMinHPos  = aBoundRect.Left();
        rVal.nMaxHPos  = aBoundRect.Right() - rVal.nWidth;

        // Maximale Breite Hoehe
        rVal.nMaxHeight  = rVal.nMaxVPos + rVal.nHeight - nV;
        rVal.nMaxWidth   = rVal.nMaxHPos + rVal.nWidth - nH;
    }
    else if ( rVal.eArea == FLY_IN_CNTNT )
    {
        rVal.nMinHPos = 0;
        rVal.nMaxHPos = 0;

        rVal.nMaxHeight = aBoundRect.Height();
        rVal.nMaxWidth  = aBoundRect.Width();

        rVal.nMaxVPos   = aBoundRect.Height();
        rVal.nMinVPos   = -aBoundRect.Height() + rVal.nHeight;
        if (rVal.nMaxVPos < rVal.nMinVPos)
        {
            rVal.nMinVPos = rVal.nMaxVPos;
            rVal.nMaxVPos = -aBoundRect.Height();
        }
    }
    if (rVal.nMaxWidth < rVal.nWidth)
        rVal.nWidth = rVal.nMaxWidth;
    if (rVal.nMaxHeight < rVal.nHeight)
        rVal.nHeight = rVal.nMaxHeight;
}

/*--------------------------------------------------------------------
    Beschreibung: Korrektur fuer Umrandung
 --------------------------------------------------------------------*/

long SwFlyFrmAttrMgr::CalcWidthSpace()
{
    SvxLRSpaceItem &rLR = (SvxLRSpaceItem&)aSet.Get(RES_LR_SPACE);
    return rLR.GetLeft() + rLR.GetRight() + CalcLeftSpace() + CalcRightSpace();
}

long SwFlyFrmAttrMgr::CalcHeightSpace()
{
    SvxULSpaceItem &rUL = (SvxULSpaceItem&)aSet.Get(RES_UL_SPACE);
    return rUL.GetUpper() + rUL.GetLower() + CalcTopSpace() + CalcBottomSpace();
}

SwTwips SwFlyFrmAttrMgr::CalcTopSpace()
{
    const SvxShadowItem& rShadow = GetShadow();
    const SvxBoxItem&    rBox    = GetBox();
    return rShadow.CalcShadowSpace(SHADOW_TOP ) + rBox.CalcLineSpace(BOX_LINE_TOP);
}

SwTwips SwFlyFrmAttrMgr::CalcBottomSpace()
{
    const SvxShadowItem& rShadow = GetShadow();
    const SvxBoxItem& rBox       = GetBox();
    return rShadow.CalcShadowSpace(SHADOW_BOTTOM) + rBox.CalcLineSpace(BOX_LINE_BOTTOM);
}

SwTwips SwFlyFrmAttrMgr::CalcLeftSpace()
{
    const SvxShadowItem& rShadow = GetShadow();
    const SvxBoxItem&    rBox    = GetBox();
    return rShadow.CalcShadowSpace(SHADOW_LEFT) + rBox.CalcLineSpace(BOX_LINE_LEFT);
}

SwTwips SwFlyFrmAttrMgr::CalcRightSpace()
{
    const SvxShadowItem& rShadow = GetShadow();
    const SvxBoxItem&    rBox    = GetBox();
    return rShadow.CalcShadowSpace(SHADOW_RIGHT) + rBox.CalcLineSpace(BOX_LINE_RIGHT);
}


/*--------------------------------------------------------------------
    Beschreibung: Attribut aus dem Set loeschen
 --------------------------------------------------------------------*/
void SwFlyFrmAttrMgr::DelAttr( USHORT nId )
{
    aSet.ClearItem( nId );
}

void SwFlyFrmAttrMgr::SetLRSpace( long nLeft, long nRight )
{
    ASSERT( LONG_MAX != nLeft && LONG_MAX != nRight, "Welchen Raend setzen?" );

    SvxLRSpaceItem aTmp( (SvxLRSpaceItem&)aSet.Get( RES_LR_SPACE ) );
    if( LONG_MAX != nLeft )
        aTmp.SetLeft( USHORT(nLeft) );
    if( LONG_MAX != nRight )
        aTmp.SetRight( USHORT(nRight) );
    aSet.Put( aTmp );
}

void SwFlyFrmAttrMgr::SetULSpace( long nTop, long nBottom )
{
    ASSERT( LONG_MAX != nTop && LONG_MAX != nBottom, Welchen Raend setzen? );

    SvxULSpaceItem aTmp( (SvxULSpaceItem&)aSet.Get( RES_UL_SPACE ) );
    if( LONG_MAX != nTop )
        aTmp.SetUpper( USHORT(nTop) );
    if( LONG_MAX != nBottom )
        aTmp.SetLower( USHORT(nBottom) );
    aSet.Put( aTmp );
}

void SwFlyFrmAttrMgr::SetWrapType( SwSurround eFly )
{
    SwFmtSurround aWrap( GetSurround() );
    aWrap.SetSurround( eFly );
    aSet.Put( aWrap );
}

void SwFlyFrmAttrMgr::SetAnchorOnly(BOOL bSet)
{
    SwFmtSurround aWrap( GetSurround() );
    aWrap.SetAnchorOnly(bSet);
    aSet.Put( aWrap );
}

void SwFlyFrmAttrMgr::SetContour(   BOOL bSet)
{
    SwFmtSurround aWrap( GetSurround() );
    aWrap.SetContour(bSet);
    aSet.Put( aWrap );
}

void SwFlyFrmAttrMgr::SetPos( const Point& rPoint )
{
    SwFmtVertOrient aVertOrient( GetVertOrient() );
    SwFmtHoriOrient aHoriOrient( GetHoriOrient() );

    aHoriOrient.SetPos       ( rPoint.X() );
    aHoriOrient.SetHoriOrient( HORI_NONE  );

    aVertOrient.SetPos       ( rPoint.Y() );
    aVertOrient.SetVertOrient( VERT_NONE  );

    aSet.Put( aVertOrient );
    aSet.Put( aHoriOrient );
}

void SwFlyFrmAttrMgr::SetHorzOrientation(SwHoriOrient eOrient)
{
    SwFmtHoriOrient aHoriOrient( GetHoriOrient() );
    aHoriOrient.SetHoriOrient( eOrient );
    aSet.Put( aHoriOrient );
}

void SwFlyFrmAttrMgr::SetVertOrientation(SvxFrameVertOrient eOrient)
{
    SwFmtVertOrient aVertOrient( GetVertOrient() );
    aVertOrient.SetVertOrient( (SwVertOrient)eOrient );
    aSet.Put( aVertOrient );
}

void SwFlyFrmAttrMgr::SetSizeType( SwFrmSize eType )
{
    SwFmtFrmSize aSize( GetFrmSize() );
    aSize.SetSizeType( eType );
    aSet.Put( aSize );
}

void SwFlyFrmAttrMgr::SetSize( const Size& rSize )
{
    SwFmtFrmSize aSize( GetFrmSize() );
    aSize.SetSize(Size(Max(rSize.Width(), long(MINFLY)), Max(rSize.Height(), long(MINFLY))));
    aSet.Put( aSize );
}

void SwFlyFrmAttrMgr::SetFrmSize(const SwFmtFrmSize& rFrmSize)
{
    aSet.Put(rFrmSize);
}

void SwFlyFrmAttrMgr::ProtectPosSize( BOOL bProt )
{
    SvxProtectItem aProtection( ((SvxProtectItem&)aSet.Get(RES_PROTECT)));
    aProtection.SetSizeProtect( bProt );
    aProtection.SetPosProtect ( bProt );
    aSet.Put( aProtection );
}

void SwFlyFrmAttrMgr::SetTransparent(BOOL bTrans)
{
    aSet.Put( SvxOpaqueItem( RES_OPAQUE, !bTrans ));
}


void SwFlyFrmAttrMgr::SetAttrSet(const SfxItemSet& rSet)
{
    aSet.ClearItem();
    aSet.Put( rSet );
}

/*--------------------------------------------------------------------
    Beschreibung: Validierung der Inputs
 --------------------------------------------------------------------*/

SwFrmValid::SwFrmValid() :
    bAuto(0),
    bMirror(0),
    nHPos(0),
    nMaxHPos(LONG_MAX),
    nMinHPos(0),

    nVPos(0),
    nMaxVPos(LONG_MAX),
    nMinVPos(0),

    nWidth( DFLT_WIDTH ),
    nMinWidth(0),
    nMaxWidth(LONG_MAX),

    nHeight( DFLT_HEIGHT ),
    nMaxHeight(LONG_MAX)
{
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.168  2000/09/18 16:05:33  willem.vandorp
    OpenOffice header added.

    Revision 1.167  1998/11/04 18:43:28  MA
    #58858# Format fuer MakeNewFly durchreichen


      Rev 1.166   04 Nov 1998 19:43:28   MA
   #58858# Format fuer MakeNewFly durchreichen

      Rev 1.165   07 Apr 1998 12:00:42   OM
   Maximalwerte fuer Umlauf

      Rev 1.164   01 Apr 1998 15:15:22   OM
   #49023 Prozentuale Controller rechtzeitig initialisieren

      Rev 1.163   05 Feb 1998 15:27:38   OM
   Maximalwertberechnung fuer Rahmenausrichtung

      Rev 1.162   04 Feb 1998 15:53:56   AMA
   Chg: CalcBoundRect beruecksichtigt die neuen Rahmenausrichtungen

      Rev 1.161   24 Nov 1997 17:40:08   MA
   include

      Rev 1.160   20 Nov 1997 12:14:36   AMA
   Opt. SwSurround: GoldCut jetzt als Enum; nicht implementierte Enums entfernt

      Rev 1.159   12 Sep 1997 16:32:36   AMA
   Neu: Wenn am Rahmen verankerte Rahmen ausserhalb sein duerfen ...

      Rev 1.158   12 Sep 1997 10:38:00   OS
   ITEMID_* definiert

      Rev 1.157   15 Aug 1997 12:13:24   OS
   chartar/frmatr/txtatr aufgeteilt

      Rev 1.156   12 Aug 1997 15:58:10   OS
   frmitems/textitem/paraitem aufgeteilt

      Rev 1.155   07 Aug 1997 14:59:12   OM
   Headerfile-Umstellung

      Rev 1.154   30 Jul 1997 18:17:48   HJS
   includes

      Rev 1.153   23 Apr 1997 10:44:34   AMA
   Fix: FLY_AUTO_CNTNT Abstaende richtig berechnen

      Rev 1.152   16 Apr 1997 16:24:14   OS
   neu: SetContour und SetAnchorOnly

      Rev 1.151   16 Apr 1997 11:08:58   NF
   Include-Reihenfolge wegen Internal Compiler Error

      Rev 1.150   15 Apr 1997 16:27:58   AMA
   New: Rahmengebundene Rahmen und auto.positionierte Rahmen

      Rev 1.149   03 Feb 1997 16:00:36   OM
   Maximalwertberechnung fuer zeichengebundene Rahmen geaendert

      Rev 1.148   29 Jan 1997 13:06:24   MA
   unbenutzes entfernt

      Rev 1.147   28 Jan 1997 10:12:18   NF
   includes ...

      Rev 1.146   27 Jan 1997 16:22:30   OS
   HtmlMode wird ueber GetHtmlMode ermittelt

      Rev 1.145   06 Nov 1996 16:26:10   OM
   Maximalwertberechnung verbessert

      Rev 1.144   04 Nov 1996 16:50:44   OM
   Maximalwertbegrenzung fuer Umlauf-TP

      Rev 1.143   04 Nov 1996 14:58:42   OM
   ValidateMetric umgestellt

      Rev 1.142   30 Sep 1996 07:52:36   MA
   new: CalcWidthSpace, CalcHeightSpace

      Rev 1.141   26 Sep 1996 09:03:08   MA
   defautls fuer Rahmen + Aufraeumarbeiten

      Rev 1.140   23 Sep 1996 13:30:54   OS
   richtige max. V-Position und Hoehe fuer absatzgebundene Rahmen

      Rev 1.139   18 Sep 1996 10:39:18   OM
   Umlauf: Nur Anker

      Rev 1.138   12 Sep 1996 17:01:50   OS
   GetAnyCurRect() ersetzt GetCur*Rect

      Rev 1.137   11 Sep 1996 16:51:44   MA
   new: Umlauf nur Anker

      Rev 1.136   10 Sep 1996 17:00:44   OM
   Prozentuale Rahmen

      Rev 1.135   10 Sep 1996 14:21:48   MA
   chg: ein bischen vereinfacht

      Rev 1.134   10 Sep 1996 14:00:46   OM
   Aufgeraeumt

      Rev 1.133   06 Sep 1996 14:15:20   OM
   #31010# GPF bei fehlenden Groessenangaben behoben

      Rev 1.132   28 Aug 1996 11:52:48   OS
   includes

      Rev 1.131   01 Jul 1996 14:55:02   OM
   Neue Segs

      Rev 1.130   01 Jul 1996 14:53:58   OM
   Basic: Rahmengroesse in Prozent setzen

      Rev 1.129   15 May 1996 15:47:18   OS
   SwVertOrient -> SvxFrameVertOrient

      Rev 1.128   25 Apr 1996 15:59:24   MA
   #27183# neg. Position von zeichengeb. beruecksichtigen

      Rev 1.127   19 Apr 1996 17:00:34   MA
   chg: Vorbereitung fuer kleine Rahmen

      Rev 1.126   18 Apr 1996 14:10:32   JP
   unbenutzte Methoden entfernt

      Rev 1.125   22 Mar 1996 15:06:00   OS
   Umstellung 311

      Rev 1.124   21 Mar 1996 14:06:32   OM
   Umstellung 311

      Rev 1.123   20 Feb 1996 17:03:06   JP
   Umbau SfxItemPool -> SwAttrPool

      Rev 1.122   24 Nov 1995 16:58:12   OM
   PCH->PRECOMPILED

      Rev 1.121   17 Nov 1995 18:11:42   OM
   Rahmennamen setzen

      Rev 1.120   03 Nov 1995 20:17:30   MA
   GetUpper..Rect returne keine Objecte mehr

      Rev 1.119   30 Oct 1995 18:44:04   OM
   FrameNotify umgestellt

      Rev 1.118   30 Oct 1995 11:25:34   MA
   chg: Geraffel entfernt

      Rev 1.117   09 Aug 1995 21:50:48   ER
   ! static data _vor_ seg_eofglobals

      Rev 1.116   25 Jul 1995 19:12:06   OS
   +ProtectPos(), +ProtectSize()

      Rev 1.115   24 Jul 1995 19:13:30   MA
   chg: Ctor nur noch mit Shell

      Rev 1.114   17 Jul 1995 16:10:56   OS
   Default-Konstanten jetzt im Header

      Rev 1.113   21 May 1995 15:41:58   MA
   opt: FRMTYE_FLY_ANY.

      Rev 1.112   25 Apr 1995 17:34:06   OM
   Range des Set-Konstruktors um BoxInfoItem erweitert

      Rev 1.111   23 Apr 1995 20:45:26   OS
   Position/Size beim Aufziehen

      Rev 1.110   31 Mar 1995 12:07:38   MA
   fix: Bei PosProtect nicht den Inhalt schuetzen.
   opt: Diverse.
   opt: unoetige includes entfernt.

      Rev 1.109   24 Mar 1995 20:28:32   PK
   neuer member: pownsh

      Rev 1.108   21 Mar 1995 07:38:36   OM
   InsertFlyFrm wieder drin

      Rev 1.107   20 Mar 1995 19:18:30   OS
   unbenutzte Funktionen entfernt

      Rev 1.106   14 Feb 1995 17:26:06   MS
   PrepareBoxInfo

      Rev 1.105   13 Feb 1995 21:11:50   MS
   Rahmen aktiviert

      Rev 1.104   23 Jan 1995 18:14:14   OM
   Auf neue precompiled Header umgestellt

      Rev 1.103   09 Jan 1995 17:08:10   ER
    del: cmdid h

      Rev 1.102   20 Dec 1994 11:54:06   MA
   SS Drawing.

      Rev 1.101   18 Nov 1994 16:17:22   MA
   min -> Min, max -> Max.

------------------------------------------------------------------------*/

diff --git a/sw/source/ui/frmdlg/frmpage.cxx b/sw/source/ui/frmdlg/frmpage.cxx
new file mode 100644
index 0000000..90cd204
--- /dev/null
+++ b/sw/source/ui/frmdlg/frmpage.cxx
@@ -0,0 +1,2837 @@
/*************************************************************************
 *
 *  $RCSfile: frmpage.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:37 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _HELPID_H
#include <helpid.h>
#endif
#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _UIPARAM_HXX
#include <uiparam.hxx>
#endif

#ifndef _SV_MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef SVTOOLS_URIHELPER_HXX
#include <svtools/urihelper.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _IODLG_HXX
#include <sfx2/iodlg.hxx>
#endif
#ifndef _SVX_IMPGRF_HXX //autogen
#include <svx/impgrf.hxx>
#endif
#ifndef _SVX_HTMLMODE_HXX //autogen
#include <svx/htmlmode.hxx>
#endif
#ifndef _SVX_SIZEITEM_HXX //autogen
#include <svx/sizeitem.hxx>
#endif
#ifndef _SVX_OPAQITEM_HXX //autogen
#include <svx/opaqitem.hxx>
#endif
#ifndef _SVX_PROTITEM_HXX //autogen
#include <svx/protitem.hxx>
#endif
#ifndef _SVX_PRNTITEM_HXX //autogen
#include <svx/prntitem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX
#include <svx/brshitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif

#ifndef _FMTURL_HXX //autogen
#include <fmturl.hxx>
#endif
#ifndef _FMTEIRO_HXX //autogen
#include <fmteiro.hxx>
#endif
#ifndef _FMTCNCT_HXX //autogen
#include <fmtcnct.hxx>
#endif
#ifndef _SWVIEW_HXX //autogen
#include <view.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _UITOOL_HXX
#include <uitool.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _VIEWOPT_HXX
#include <viewopt.hxx>
#endif
#ifndef _FRMATR_HXX
#include <frmatr.hxx>
#endif
#ifndef _FRMDLG_HXX
#include <frmdlg.hxx>
#endif
#ifndef _FRMMGR_HXX
#include <frmmgr.hxx>
#endif
#ifndef _FRMPAGE_HXX
#include <frmpage.hxx>
#endif
#ifndef _WRAP_HXX
#include <wrap.hxx>
#endif
#ifndef _COLMGR_HXX
#include <colmgr.hxx>
#endif
#ifndef _GRFATR_HXX
#include <grfatr.hxx>
#endif
#ifndef _UIITEMS_HXX
#include <uiitems.hxx>
#endif

#ifndef _FRMUI_HRC
#include <frmui.hrc>
#endif
#ifndef _FRMPAGE_HRC
#include <frmpage.hrc>
#endif
#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif

struct FrmMap
{
    USHORT nStrId;
    USHORT nMirrorStrId;
    USHORT nAlign;
    ULONG  nLBRelations;
};

struct RelationMap
{
    USHORT nStrId;
    USHORT nMirrorStrId;
    ULONG  nLBRelation;
    USHORT nRelation;
};

#define LB_FRAME                0x00000001L // Textbereich des Absatzes
#define LB_PRTAREA              0x00000002L // Textbereich des Absatzes + Einzuege
#define LB_REL_PG_LEFT          0x00000004L // Linker Seitenrand
#define LB_REL_PG_RIGHT         0x00000008L // Rechter Seitenrand
#define LB_REL_FRM_LEFT         0x00000010L // Linker Absatzrand
#define LB_REL_FRM_RIGHT        0x00000020L // Rechter Absatzrand
#define LB_REL_PG_FRAME         0x00000040L // Gesamte Seite
#define LB_REL_PG_PRTAREA       0x00000080L // Textbereich der Seite

#define LB_FLY_REL_PG_LEFT      0x00000100L // Linker Rahmenrand
#define LB_FLY_REL_PG_RIGHT     0x00000200L // Rechter Rahmenrand
#define LB_FLY_REL_PG_FRAME     0x00000400L // Gesamte Rahmen
#define LB_FLY_REL_PG_PRTAREA   0x00000800L // Rahmeninneres

#define LB_VERT_FRAME           0x00001000L // Vertikaler Textbereich des Absatzes
#define LB_VERT_PRTAREA         0x00002000L // Vertikaler Textbereich des Absatzes + Einzuege

#define LB_REL_BASE             0x00010000L // Zeichenausrichtung Basis
#define LB_REL_CHAR             0x00020000L // Zeichenausrichtung Zeichen
#define LB_REL_ROW              0x00040000L // Zeichenausrichtung Zeile

static RelationMap __FAR_DATA aRelationMap[] =
{
    STR_FRAME,              STR_FRAME,                  LB_FRAME,               FRAME,
    STR_PRTAREA,            STR_PRTAREA,                LB_PRTAREA,             PRTAREA,
    STR_REL_PG_LEFT,        STR_MIR_REL_PG_LEFT,        LB_REL_PG_LEFT,         REL_PG_LEFT,
    STR_REL_PG_RIGHT,       STR_MIR_REL_PG_RIGHT,       LB_REL_PG_RIGHT,        REL_PG_RIGHT,
    STR_REL_FRM_LEFT,       STR_MIR_REL_FRM_LEFT,       LB_REL_FRM_LEFT,        REL_FRM_LEFT,
    STR_REL_FRM_RIGHT,      STR_MIR_REL_FRM_RIGHT,      LB_REL_FRM_RIGHT,       REL_FRM_RIGHT,
    STR_REL_PG_FRAME,       STR_REL_PG_FRAME,           LB_REL_PG_FRAME,        REL_PG_FRAME,
    STR_REL_PG_PRTAREA,     STR_REL_PG_PRTAREA,         LB_REL_PG_PRTAREA,      REL_PG_PRTAREA,
    STR_REL_CHAR,           STR_REL_CHAR,               LB_REL_CHAR,            REL_CHAR,

    STR_FLY_REL_PG_LEFT,    STR_FLY_MIR_REL_PG_LEFT,    LB_FLY_REL_PG_LEFT,     REL_PG_LEFT,
    STR_FLY_REL_PG_RIGHT,   STR_FLY_MIR_REL_PG_RIGHT,   LB_FLY_REL_PG_RIGHT,    REL_PG_RIGHT,
    STR_FLY_REL_PG_FRAME,   STR_FLY_REL_PG_FRAME,       LB_FLY_REL_PG_FRAME,    REL_PG_FRAME,
    STR_FLY_REL_PG_PRTAREA, STR_FLY_REL_PG_PRTAREA,     LB_FLY_REL_PG_PRTAREA,  REL_PG_PRTAREA,

    STR_REL_BORDER,         STR_REL_BORDER,             LB_VERT_FRAME,          FRAME,
    STR_REL_PRTAREA,        STR_REL_PRTAREA,            LB_VERT_PRTAREA,        PRTAREA,
};

static RelationMap __FAR_DATA aAsCharRelationMap[] =
{
    STR_REL_BASE,   STR_REL_BASE,   LB_REL_BASE,    FRAME,
    STR_REL_CHAR,   STR_REL_CHAR,   LB_REL_CHAR,    FRAME,
    STR_REL_ROW,    STR_REL_ROW,    LB_REL_ROW,     FRAME,
};

/*--------------------------------------------------------------------
    Beschreibung: Seite verankert
 --------------------------------------------------------------------*/

#define HORI_PAGE_REL   (LB_REL_PG_FRAME|LB_REL_PG_PRTAREA|LB_REL_PG_LEFT| \
                        LB_REL_PG_RIGHT)

static FrmMap __FAR_DATA aHPageMap[] =
{
    STR_LEFT,           STR_MIR_LEFT,       HORI_LEFT,      HORI_PAGE_REL,
    STR_RIGHT,          STR_MIR_RIGHT,      HORI_RIGHT,     HORI_PAGE_REL,
    STR_CENTER_HORI,    STR_CENTER_HORI,    HORI_CENTER,    HORI_PAGE_REL,
    STR_FROMLEFT,       STR_MIR_FROMLEFT,   HORI_NONE,      HORI_PAGE_REL
};

static FrmMap __FAR_DATA aHPageHtmlMap[] =
{
    STR_FROMLEFT,       STR_MIR_FROMLEFT,   HORI_NONE,      LB_REL_PG_FRAME
};

#define VERT_PAGE_REL   (LB_REL_PG_FRAME|LB_REL_PG_PRTAREA)

static FrmMap __FAR_DATA aVPageMap[] =
{
    STR_TOP,            STR_TOP,            SVX_VERT_TOP,       VERT_PAGE_REL,
    STR_BOTTOM,         STR_BOTTOM,         SVX_VERT_BOTTOM,    VERT_PAGE_REL,
    STR_CENTER_VERT,    STR_CENTER_VERT,    SVX_VERT_CENTER,    VERT_PAGE_REL,
    STR_FROMTOP,        STR_FROMTOP,        SVX_VERT_NONE,      VERT_PAGE_REL,
};

static FrmMap __FAR_DATA aVPageHtmlMap[] =
{
    STR_FROMTOP,        STR_FROMTOP,        SVX_VERT_NONE,      LB_REL_PG_FRAME
};

/*--------------------------------------------------------------------
    Beschreibung: Rahmen verankert
 --------------------------------------------------------------------*/

#define HORI_FRAME_REL  (LB_FLY_REL_PG_FRAME|LB_FLY_REL_PG_PRTAREA| \
                        LB_FLY_REL_PG_LEFT|LB_FLY_REL_PG_RIGHT)

static FrmMap __FAR_DATA aHFrameMap[] =
{
    STR_LEFT,           STR_MIR_LEFT,       HORI_LEFT,  HORI_FRAME_REL,
    STR_RIGHT,          STR_MIR_RIGHT,      HORI_RIGHT,     HORI_FRAME_REL,
    STR_CENTER_HORI,    STR_CENTER_HORI,    HORI_CENTER,    HORI_FRAME_REL,
    STR_FROMLEFT,       STR_MIR_FROMLEFT,   HORI_NONE,      HORI_FRAME_REL
};

static FrmMap __FAR_DATA aHFlyHtmlMap[] =
{
    STR_LEFT,           STR_MIR_LEFT,       HORI_LEFT,      LB_FLY_REL_PG_FRAME,
    STR_FROMLEFT,       STR_MIR_FROMLEFT,   HORI_NONE,      LB_FLY_REL_PG_FRAME
};

static FrmMap __FAR_DATA aVFlyHtmlMap[] =
{
    STR_TOP,            STR_TOP,            SVX_VERT_TOP,       LB_VERT_FRAME,
    STR_FROMTOP,        STR_FROMTOP,        SVX_VERT_NONE,      LB_VERT_FRAME
};

/*--------------------------------------------------------------------
    Beschreibung: Absatz verankert
 --------------------------------------------------------------------*/

#define HORI_PARA_REL   (LB_FRAME|LB_PRTAREA|LB_REL_PG_LEFT|LB_REL_PG_RIGHT| \
                        LB_REL_PG_FRAME|LB_REL_PG_PRTAREA|LB_REL_FRM_LEFT| \
                        LB_REL_FRM_RIGHT)

static FrmMap __FAR_DATA aHParaMap[] =
{
    STR_LEFT,           STR_MIR_LEFT,       HORI_LEFT,      HORI_PARA_REL,
    STR_RIGHT,          STR_MIR_RIGHT,      HORI_RIGHT,     HORI_PARA_REL,
    STR_CENTER_HORI,    STR_CENTER_HORI,    HORI_CENTER,    HORI_PARA_REL,
    STR_FROMLEFT,       STR_MIR_FROMLEFT,   HORI_NONE,      HORI_PARA_REL
};

#define HTML_HORI_PARA_REL  (LB_FRAME|LB_PRTAREA)

static FrmMap __FAR_DATA aHParaHtmlMap[] =
{
    STR_LEFT,   STR_LEFT,   HORI_LEFT,      HTML_HORI_PARA_REL,
    STR_RIGHT,  STR_RIGHT,  HORI_RIGHT,     HTML_HORI_PARA_REL,
};

static FrmMap __FAR_DATA aHParaHtmlAbsMap[] =
{
    STR_LEFT,           STR_MIR_LEFT,       HORI_LEFT,      HTML_HORI_PARA_REL,
    STR_RIGHT,          STR_MIR_RIGHT,      HORI_RIGHT,     HTML_HORI_PARA_REL,
};

#define VERT_PARA_REL   (LB_VERT_FRAME|LB_VERT_PRTAREA)

static FrmMap __FAR_DATA aVParaMap[] =
{
    STR_TOP,            STR_TOP,            SVX_VERT_TOP,       VERT_PARA_REL,
    STR_BOTTOM,         STR_BOTTOM,         SVX_VERT_BOTTOM,    VERT_PARA_REL,
    STR_CENTER_VERT,    STR_CENTER_VERT,    SVX_VERT_CENTER,    VERT_PARA_REL,
    STR_FROMTOP,        STR_FROMTOP,        SVX_VERT_NONE,      VERT_PARA_REL,
};

static FrmMap __FAR_DATA aVParaHtmlMap[] =
{
    STR_TOP,            STR_TOP,            SVX_VERT_TOP,       LB_VERT_PRTAREA,
};

/*--------------------------------------------------------------------
    Beschreibung: Relativ zum Zeichen verankert
 --------------------------------------------------------------------*/

#define HORI_CHAR_REL   (LB_FRAME|LB_PRTAREA|LB_REL_PG_LEFT|LB_REL_PG_RIGHT| \
                        LB_REL_PG_FRAME|LB_REL_PG_PRTAREA|LB_REL_FRM_LEFT| \
                        LB_REL_FRM_RIGHT|LB_REL_CHAR)

static FrmMap __FAR_DATA aHCharMap[] =
{
    STR_LEFT,           STR_MIR_LEFT,       HORI_LEFT,      HORI_CHAR_REL,
    STR_RIGHT,          STR_MIR_RIGHT,      HORI_RIGHT,     HORI_CHAR_REL,
    STR_CENTER_HORI,    STR_CENTER_HORI,    HORI_CENTER,    HORI_CHAR_REL,
    STR_FROMLEFT,       STR_MIR_FROMLEFT,   HORI_NONE,      HORI_CHAR_REL
};

#define HTML_HORI_CHAR_REL  (LB_FRAME|LB_PRTAREA|LB_REL_CHAR)

static FrmMap __FAR_DATA aHCharHtmlMap[] =
{
    STR_LEFT,           STR_LEFT,           HORI_LEFT,      HTML_HORI_CHAR_REL,
    STR_RIGHT,          STR_RIGHT,          HORI_RIGHT,     HTML_HORI_CHAR_REL,
};

static FrmMap __FAR_DATA aHCharHtmlAbsMap[] =
{
    STR_LEFT,           STR_MIR_LEFT,       HORI_LEFT,      LB_PRTAREA|LB_REL_CHAR,
    STR_RIGHT,          STR_MIR_RIGHT,      HORI_RIGHT,     LB_PRTAREA,
    STR_FROMLEFT,       STR_MIR_FROMLEFT,   HORI_NONE,      LB_REL_PG_FRAME
};

#define VERT_CHAR_REL   (LB_VERT_FRAME|LB_VERT_PRTAREA|LB_REL_CHAR)

static FrmMap __FAR_DATA aVCharMap[] =
{
    STR_TOP,            STR_TOP,            SVX_VERT_TOP,           VERT_CHAR_REL,
    STR_BOTTOM,         STR_BOTTOM,         SVX_VERT_BOTTOM,        VERT_CHAR_REL,
    STR_BELOW,          STR_BELOW,          SVX_VERT_CHAR_BOTTOM,   LB_REL_CHAR,
    STR_CENTER_VERT,    STR_CENTER_VERT,    SVX_VERT_CENTER,        VERT_CHAR_REL,
    STR_FROMTOP,        STR_FROMTOP,        SVX_VERT_NONE,          VERT_CHAR_REL,
};


static FrmMap __FAR_DATA aVCharHtmlMap[] =
{
    STR_BELOW,          STR_BELOW,          SVX_VERT_CHAR_BOTTOM,   LB_REL_CHAR,
};

static FrmMap __FAR_DATA aVCharHtmlAbsMap[] =
{
    STR_TOP,            STR_TOP,            SVX_VERT_TOP,           LB_REL_CHAR,
    STR_BELOW,          STR_BELOW,          SVX_VERT_CHAR_BOTTOM,   LB_REL_CHAR
};
/*--------------------------------------------------------------------
    Beschreibung: Als Zeichen verankert
 --------------------------------------------------------------------*/

static FrmMap __FAR_DATA aVAsCharMap[] =
{
    STR_TOP,            STR_TOP,            SVX_VERT_TOP,           LB_REL_BASE,
    STR_BOTTOM,         STR_BOTTOM,         SVX_VERT_BOTTOM,        LB_REL_BASE,
    STR_CENTER_VERT,    STR_CENTER_VERT,    SVX_VERT_CENTER,        LB_REL_BASE,

    STR_TOP,            STR_TOP,            SVX_VERT_CHAR_TOP,      LB_REL_CHAR,
    STR_BOTTOM,         STR_BOTTOM,         SVX_VERT_CHAR_BOTTOM,   LB_REL_CHAR,
    STR_CENTER_VERT,    STR_CENTER_VERT,    SVX_VERT_CHAR_CENTER,   LB_REL_CHAR,

    STR_TOP,            STR_TOP,            SVX_VERT_LINE_TOP,      LB_REL_ROW,
    STR_BOTTOM,         STR_BOTTOM,         SVX_VERT_LINE_BOTTOM,   LB_REL_ROW,
    STR_CENTER_VERT,    STR_CENTER_VERT,    SVX_VERT_LINE_CENTER,   LB_REL_ROW,

    STR_FROMBOTTOM,     STR_FROMBOTTOM,     SVX_VERT_NONE,          LB_REL_BASE
};

static FrmMap __FAR_DATA aVAsCharHtmlMap[] =
{
    STR_TOP,            STR_TOP,            SVX_VERT_TOP,           LB_REL_BASE,
    STR_CENTER_VERT,    STR_CENTER_VERT,    SVX_VERT_CENTER,        LB_REL_BASE,

    STR_TOP,            STR_TOP,            SVX_VERT_CHAR_TOP,      LB_REL_CHAR,

    STR_TOP,            STR_TOP,            SVX_VERT_LINE_TOP,      LB_REL_ROW,
    STR_BOTTOM,         STR_BOTTOM,         SVX_VERT_LINE_BOTTOM,   LB_REL_ROW,
    STR_CENTER_VERT,    STR_CENTER_VERT,    SVX_VERT_LINE_CENTER,   LB_REL_ROW,
};


static FrmMap* pVMap = 0;
static FrmMap* pHMap = 0;

static BOOL bProtPos   = FALSE;
static BOOL bProtSize = FALSE;
static BOOL bProtCntnt = FALSE;

static const USHORT nPathLen = 30;

static USHORT __FAR_DATA aPageRg[] = {
    RES_FRM_SIZE, RES_FRM_SIZE,
    RES_VERT_ORIENT, RES_ANCHOR,
    RES_COL, RES_COL,
    0
};
static USHORT __FAR_DATA aAddPgRg[] = {
    RES_PROTECT,            RES_PROTECT,
    RES_PRINT,              RES_PRINT,
    FN_SET_FRM_NAME,        FN_SET_FRM_NAME,
    FN_SET_FRM_ALT_NAME,    FN_SET_FRM_ALT_NAME,
    0
};

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

USHORT lcl_GetFrmMapCount(FrmMap* pMap)
{
    if ( pMap )
    {
        int aSizeOf = sizeof(FrmMap);
        if( pMap == aVParaHtmlMap)
            return sizeof(aVParaHtmlMap) / aSizeOf;
        if( pMap == aVAsCharHtmlMap)
            return sizeof(aVAsCharHtmlMap) / aSizeOf;
        if( pMap == aHParaHtmlMap)
            return sizeof(aHParaHtmlMap) / aSizeOf;
        if( pMap == aHParaHtmlAbsMap)
            return sizeof(aHParaHtmlAbsMap) / aSizeOf;
        if ( pMap == aVPageMap )
            return sizeof(aVPageMap) / aSizeOf;
        if ( pMap == aVPageHtmlMap )
            return sizeof(aVPageHtmlMap) / aSizeOf;
        if ( pMap == aVAsCharMap )
            return sizeof(aVAsCharMap) / aSizeOf;
        if ( pMap == aVParaMap )
            return sizeof(aVParaMap) / aSizeOf;
        if ( pMap == aHParaMap )
            return sizeof(aHParaMap) / aSizeOf;
        if ( pMap == aHFrameMap )
            return sizeof(aHFrameMap) / aSizeOf;
        if ( pMap == aHCharMap )
            return sizeof(aHCharMap) / aSizeOf;
        if ( pMap == aHCharHtmlMap )
            return sizeof(aHCharHtmlMap) / aSizeOf;
        if ( pMap == aHCharHtmlAbsMap )
            return sizeof(aHCharHtmlAbsMap) / aSizeOf;
        if ( pMap == aVCharMap )
            return sizeof(aVCharMap) / aSizeOf;
        if ( pMap == aVCharHtmlMap )
            return sizeof(aVCharHtmlMap) / aSizeOf;
        if ( pMap == aVCharHtmlAbsMap )
            return sizeof(aVCharHtmlAbsMap) / aSizeOf;
        if ( pMap == aHPageHtmlMap )
            return sizeof(aHPageHtmlMap) / aSizeOf;
        if ( pMap == aHFlyHtmlMap )
            return sizeof(aHFlyHtmlMap) / aSizeOf;
        if ( pMap == aVFlyHtmlMap )
            return sizeof(aVFlyHtmlMap) / aSizeOf;
        return sizeof(aHPageMap) / aSizeOf;
    }
    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

long lcl_GetTwipValue(MetricField& rMetric)
{
    return rMetric.Denormalize(rMetric.GetValue(FUNIT_TWIP));
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void lcl_SetTwipValue(MetricField& rMetric, long nValue)
{
    rMetric.SetValue(rMetric.Normalize(nValue),FUNIT_TWIP);
}

/*--------------------------------------------------------------------
    Beschreibung:   StandardRahmenTabPage
 --------------------------------------------------------------------*/

SwFrmPage::SwFrmPage ( Window *pParent, const SfxItemSet &rSet ) :
    SfxTabPage      (pParent, SW_RES(TP_FRM_STD), rSet),
    aWidthFT        (this, SW_RES(FT_WIDTH)),
    aWidthED        (this, SW_RES(ED_WIDTH)),
    aRelWidthCB     (this, SW_RES(CB_REL_WIDTH)),
    aHeightFT       (this, SW_RES(FT_HEIGHT)),
    aHeightED       (this, SW_RES(ED_HEIGHT)),
    aRelHeightCB    (this, SW_RES(CB_REL_HEIGHT)),
    aAutoHeightCB   (this, SW_RES(CB_AUTOHEIGHT)),
    aFixedRatioCB   (this, SW_RES(CB_FIXEDRATIO)),
    aSizeGB         (this, SW_RES(GB_SIZE)),

    aAnchorTypeRB   (this, SW_RES(RB_ANCHOR_TYPE)),
    aAnchorAsCharRB (this, SW_RES(RB_ANCHOR_CHAR)),
    aAnchorTypeLB   (this, SW_RES(LB_ANCHOR_TYPE)),
    aTypeGB         (this, SW_RES(GB_TYPE)),

    aHorizontalFT   (this, SW_RES(FT_HORIZONTAL)),
    aHorizontalDLB  (this, SW_RES(DLB_HORIZONTAL)),
    aAtHorzPosFT    (this, SW_RES(FT_AT_HORZ_POS)),
    aAtHorzPosED    (this, SW_RES(ED_AT_HORZ_POS)),
    aHoriRelationFT (this, SW_RES(FT_HORI_RELATION)),
    aHoriRelationLB (this, SW_RES(LB_HORI_RELATION)),
    aMirrorPagesCB  (this, SW_RES(CB_MIRROR)),
    aVerticalFT     (this, SW_RES(FT_VERTICAL)),
    aVerticalDLB    (this, SW_RES(DLB_VERTICAL)),
    aAtVertPosFT    (this, SW_RES(FT_AT_VERT_POS)),
    aAtVertPosED    (this, SW_RES(ED_AT_VERT_POS)),
    aVertRelationFT (this, SW_RES(FT_VERT_RELATION)),
    aVertRelationLB (this, SW_RES(LB_VERT_RELATION)),
    aPositionGB     (this, SW_RES(GB_POSITION)),
    aRealSizeBT     (this, SW_RES(BT_REALSIZE)),
    aExampleWN      (this, SW_RES(WN_BSP)),
    bFormat(FALSE),
    bNew(TRUE),
    nDlgType(0),
    nUpperBorder(0),
    nLowerBorder(0),
    nOldH(HORI_CENTER),
    nOldHRel(0),
    nOldV(SVX_VERT_TOP),
    nOldVRel(PRTAREA),
    bAtHorzPosModified( FALSE ),
    bAtVertPosModified( FALSE ),
    bWidthLastChanged ( TRUE ),
    nHtmlMode(0),
    bHtmlMode(FALSE),
    bNoModifyHdl(TRUE)
{
    FreeResource();
    SetExchangeSupport();

    Link aLk = LINK(this, SwFrmPage, RangeModifyHdl);
    aWidthED.    SetLoseFocusHdl( aLk );
    aHeightED.   SetLoseFocusHdl( aLk );
    aAtHorzPosED.SetLoseFocusHdl( aLk );
    aAtVertPosED.SetLoseFocusHdl( aLk );

    aLk = LINK(this, SwFrmPage, ModifyHdl);
    aWidthED.    SetModifyHdl( aLk );
    aHeightED.   SetModifyHdl( aLk );
    aAtHorzPosED.SetModifyHdl( aLk );
    aAtVertPosED.SetModifyHdl( aLk );

    aLk = LINK(this, SwFrmPage, TypHdl);
    aAnchorTypeRB.SetClickHdl( aLk );
    aAnchorAsCharRB.SetClickHdl( aLk );
    aAnchorTypeLB.SetSelectHdl( aLk );
    aAnchorTypeLB.SelectEntryPos(0);
    aAnchorTypeLB.SetEntryData(0, (void*)FLY_PAGE);
    aAnchorTypeLB.SetEntryData(1, (void*)FLY_AT_CNTNT);
    aAnchorTypeLB.SetEntryData(2, (void*)FLY_AUTO_CNTNT);
    aAnchorTypeLB.SetEntryData(3, (void*)FLY_AT_FLY);

    aHorizontalDLB.SetSelectHdl(LINK(this, SwFrmPage, PosHdl));
    aVerticalDLB.  SetSelectHdl(LINK(this, SwFrmPage, PosHdl));

    aHoriRelationLB.SetSelectHdl(LINK(this, SwFrmPage, RelHdl));
    aVertRelationLB.SetSelectHdl(LINK(this, SwFrmPage, RelHdl));

    aMirrorPagesCB.SetClickHdl(LINK(this, SwFrmPage, MirrorHdl));

    aLk = LINK(this, SwFrmPage, RelSizeClickHdl);
    aRelWidthCB.SetClickHdl( aLk );
    aRelHeightCB.SetClickHdl( aLk );

    aFixedRatioCB.SetClickHdl(LINK(this, SwFrmPage, AspectRatioCheckHdl));
}

/*--------------------------------------------------------------------
    Beschreibung:   Dtor
 --------------------------------------------------------------------*/

SwFrmPage::~SwFrmPage()
{
}

SfxTabPage* SwFrmPage::Create(Window *pParent, const SfxItemSet &rSet)
{
    return new SwFrmPage( pParent, rSet );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwFrmPage::Reset( const SfxItemSet &rSet )
{

    SwWrtShell* pSh = bFormat ? ::GetActiveWrtShell() :
            ((SwFrmDlg*)GetParent()->GetParent())->GetWrtShell();

    nHtmlMode = ::GetHtmlMode(pSh->GetView().GetDocShell());
    bHtmlMode = nHtmlMode & HTMLMODE_ON ? TRUE : FALSE;

    FieldUnit aMetric = ::GetDfltMetric(bHtmlMode);
    SetMetric( aWidthED, aMetric );
    SetMetric( aHeightED, aMetric );
    SetMetric( aAtHorzPosED, aMetric );
    SetMetric( aAtVertPosED, aMetric );


    const SwFmtAnchor& rAnchor = (const SwFmtAnchor&)rSet.Get(RES_ANCHOR);

    if (bFormat)
    {
        // Bei Formaten keine Ankerbearbeitung
        aAnchorTypeRB.Enable( FALSE );
        aAnchorTypeLB.Enable( FALSE );
        aAnchorAsCharRB.Enable( FALSE );
        aTypeGB.Enable( FALSE );
        aFixedRatioCB.Enable(FALSE);
    }
    else if (rAnchor.GetAnchorId() != FLY_AT_FLY && !pSh->IsFlyInFly())
        aAnchorTypeLB.RemoveEntry(3);

    if ( nDlgType == DLG_FRM_GRF || nDlgType == DLG_FRM_OLE )
    {
        ASSERT(pSh , "shell not found");
        const SfxPoolItem* pItem;
        //OS: nur fuer die Variante Einfuegen/Grafik/Eigenschaften
        if(SFX_ITEM_SET == rSet.GetItemState(FN_PARAM_GRF_REALSIZE, FALSE, &pItem))
            aGrfSize = ((const SvxSizeItem*)pItem)->GetSize();
        else
            pSh->GetGrfSize( aGrfSize );

        if ( !bNew )
        {
            aRealSizeBT.Show();
            aRealSizeBT.SetClickHdl(LINK(this, SwFrmPage, RealSizeHdl));
        }
        else
            aTypeGB.SetSizePixel(Size(aTypeGB.GetSizePixel().Width(), aSizeGB.GetSizePixel().Height()));

        if ( nDlgType == DLG_FRM_GRF )
            aFixedRatioCB.Check( FALSE );
        else
        {
            if ( bNew )
                SetText( SW_RESSTR(STR_OLE_INSERT));
            else
                SetText( SW_RESSTR(STR_OLE_EDIT));
        }
    }
    else
    {
        aTypeGB.SetSizePixel(Size(aTypeGB.GetSizePixel().Width(), aSizeGB.GetSizePixel().Height()));
        aGrfSize = ((const SwFmtFrmSize&)rSet.Get(RES_FRM_SIZE)).GetSize();
    }

    //Prozenteingabe ermoeglichen.
    aWidthED. SetBaseValue( aWidthED.Normalize(aGrfSize.Width()), FUNIT_TWIP );
    aHeightED.SetBaseValue( aHeightED.Normalize(aGrfSize.Height()), FUNIT_TWIP );

    // Allgemeiner Initialisierungteil
    USHORT nPos = 0;
    if (rAnchor.GetAnchorId() == FLY_IN_CNTNT)
        aAnchorAsCharRB.Check();
    else
    {
        aAnchorTypeRB.Check();

        while ((USHORT)(ULONG)aAnchorTypeLB.GetEntryData(nPos) != rAnchor.GetAnchorId())
            nPos++;
        aAnchorTypeLB.SelectEntryPos(nPos);
    }

    if(bHtmlMode)
    {
        if(nDlgType == DLG_FRM_STD &&
                0 == (nHtmlMode & HTMLMODE_FULL_ABS_POS))
        {
            aHeightFT   .Enable( FALSE );
            aHeightED   .Enable( FALSE );
            aRelHeightCB.Enable( FALSE );
        }
        if( 0 == (nHtmlMode & HTMLMODE_SOME_ABS_POS))
        {
            if (GetAnchor() == FLY_PAGE )
            {
                nPos = 0;
                while ((USHORT)(ULONG)aAnchorTypeLB.GetEntryData(nPos) != FLY_AT_CNTNT)
                    nPos++;
                aAnchorTypeLB.SelectEntryPos(nPos);
            }
            aAnchorTypeLB.RemoveEntry(0);
        }
        aAutoHeightCB.Enable(FALSE);
        aMirrorPagesCB.Show(FALSE);
        if(nDlgType == DLG_FRM_STD)
            aFixedRatioCB.Enable(FALSE);
    }

    Init( rSet, TRUE );
    aAtVertPosED.SaveValue();
    aAtHorzPosED.SaveValue();

    bNoModifyHdl = FALSE;
    RangeModifyHdl(&aWidthED);  // Alle Maximalwerte initial setzen

    aAutoHeightCB.SaveValue();
}


/*--------------------------------------------------------------------
    Beschreibung:   Attribute in den Set stopfen bei OK
 --------------------------------------------------------------------*/

BOOL SwFrmPage::FillItemSet(SfxItemSet &rSet)
{
    BOOL bRet = FALSE;
    SwWrtShell* pSh = bFormat ? ::GetActiveWrtShell()
                        : ((SwFrmDlg*)GetParent()->GetParent())->GetWrtShell();
    ASSERT( pSh , "shell not found");
    const SfxItemSet& rOldSet = GetItemSet();
    const SfxPoolItem* pOldItem = 0;

    RndStdIds eAnchorId = (RndStdIds)GetAnchor();

    if ( !bFormat )
    {
        pOldItem = GetOldItem(rSet, RES_ANCHOR);
        if (bNew || !pOldItem || eAnchorId != ((const SwFmtAnchor*)pOldItem)->GetAnchorId())
        {
            SwFmtAnchor aAnc( eAnchorId, pSh->GetPhyPageNum() );
            bRet = 0 != rSet.Put( aAnc );
        }
    }

    if ( pHMap )
    {
        SwFmtHoriOrient aHoriOrient( (const SwFmtHoriOrient&)
                                                rOldSet.Get(RES_HORI_ORIENT) );

        USHORT nMapPos = GetMapPos(pHMap, aHorizontalDLB);
        USHORT nAlign = GetAlignment(pHMap, nMapPos, aHorizontalDLB, aHoriRelationLB);
        USHORT nRel = GetRelation(pHMap, aHoriRelationLB);

        const SwHoriOrient      eHOri = (SwHoriOrient)nAlign;
        const SwRelationOrient  eRel  = (SwRelationOrient)nRel;

        aHoriOrient.SetHoriOrient( eHOri );
        aHoriOrient.SetRelationOrient( eRel );
        aHoriOrient.SetPosToggle(aMirrorPagesCB.IsChecked());

        BOOL bMod = aAtHorzPosED.GetText() != aAtHorzPosED.GetSavedValue();
        bMod |= aMirrorPagesCB.GetState() != aMirrorPagesCB.GetSavedValue();

        if ( eHOri == HORI_NONE &&
             (bNew || (bAtHorzPosModified || bMod) || nOldH != eHOri ) )
        {
            SwTwips nX = aAtHorzPosED.Denormalize(aAtHorzPosED.GetValue(FUNIT_TWIP));
            aHoriOrient.SetPos( nX );
        }

        pOldItem = GetOldItem(rSet, FN_HORI_ORIENT);
        BOOL bSame = FALSE;
        if ((bNew == bFormat) && pOldItem)
        {
             bSame = bFormat ?
                aHoriOrient.GetHoriOrient() == ((SwFmtHoriOrient*)pOldItem)->GetHoriOrient() &&
                aHoriOrient.GetRelationOrient() == ((SwFmtHoriOrient*)pOldItem)->GetRelationOrient() &&
                aHoriOrient.GetPos() == ((SwFmtHoriOrient*)pOldItem)->GetPos()

                    : aHoriOrient == (SwFmtHoriOrient&)*pOldItem;
        }
        if ((bNew && !bFormat) || ((bAtHorzPosModified || bMod) && !bSame))
        {
            bRet |= 0 != rSet.Put( aHoriOrient );
        }
    }

    if ( pVMap )
    {
        // Ausrichtung Vertikal
        SwFmtVertOrient aVertOrient( (const SwFmtVertOrient&)
                                                rOldSet.Get(RES_VERT_ORIENT) );

        USHORT nMapPos = GetMapPos(pVMap, aVerticalDLB);
        USHORT nAlign = GetAlignment(pVMap, nMapPos, aVerticalDLB, aVertRelationLB);
        USHORT nRel = GetRelation(pVMap, aVertRelationLB);

        const SvxFrameVertOrient    eVOri = (SvxFrameVertOrient)nAlign;
        const SwRelationOrient      eRel  = (SwRelationOrient)nRel;

        aVertOrient.SetVertOrient    ( (SwVertOrient)eVOri);
        aVertOrient.SetRelationOrient( eRel );

        BOOL bMod = aAtVertPosED.GetText() != aAtVertPosED.GetSavedValue();

        if ( eVOri == SVX_VERT_NONE &&
             ( bNew || (bAtVertPosModified || bMod) || nOldV != eVOri) )
        {
            // Vertikale Position
            // fuer zeichengebundene Rahmen Offset umrechenen
            SwTwips nY = aAtVertPosED.Denormalize(aAtVertPosED.GetValue(FUNIT_TWIP));
            if (eAnchorId == FLY_IN_CNTNT)
                nY *= -1;
            aVertOrient.SetPos( nY );
        }
        pOldItem = GetOldItem(rSet, FN_VERT_ORIENT);
        BOOL bSame = FALSE;
        if((bNew == bFormat) && pOldItem)
        {
             bSame = bFormat ?
                aVertOrient.GetVertOrient() == ((SwFmtVertOrient*)pOldItem)->GetVertOrient() &&
                aVertOrient.GetRelationOrient() == ((SwFmtVertOrient*)pOldItem)->GetRelationOrient() &&
                aVertOrient.GetPos() == ((SwFmtVertOrient*)pOldItem)->GetPos()

                    : aVertOrient == (SwFmtVertOrient&)*pOldItem;
        }
        if( ( bNew && !bFormat ) || ((bAtVertPosModified || bMod) && !bSame ))
        {
            bRet |= 0 != rSet.Put( aVertOrient );
        }
    }

    //Size setzen
    //Neuer Sonderfall: Ist die Groesse von pMgr(0, 0), so werden die
    //Eigenschaften fuer eine Grafik festgelegt, die noch gar nicht geladen
    //ist. Dann wird hier kein SetSize() gemacht, wenn die
    //Groesseneinstellungen vom Anwender nicht veraendert wurden.
    const SwFmtFrmSize& rOldSize = (const SwFmtFrmSize& )rOldSet.Get(RES_FRM_SIZE);
    SwFmtFrmSize aSz( rOldSize );

/*  // Folgende Zeilen nur zum debuggen:
    BOOL bModified = aWidthED.IsValueModified();
    USHORT nOldWidth = rOldSize.GetWidth ();
    USHORT nWidth = aWidthED .GetValue();
    USHORT nMinWidth = aWidthED .GetMin();*/

    BOOL bValueModified = (aWidthED.IsValueModified() || aHeightED.IsValueModified());
    BOOL bCheckChanged = (aRelWidthCB.GetSavedValue() != aRelWidthCB.IsChecked()
                        || aRelHeightCB.GetSavedValue() != aRelHeightCB.IsChecked());

    BOOL bLegalValue = !(!rOldSize.GetWidth () && !rOldSize.GetHeight() &&
                            aWidthED .GetValue() == aWidthED .GetMin() &&
                            aHeightED.GetValue() == aHeightED.GetMin());

    if ((bNew && !bFormat) || (bValueModified || bCheckChanged) && bLegalValue)
    {
        long nNewWidth = aWidthED.Denormalize (aWidthED.GetRealValue(FUNIT_TWIP));
        long nNewHeight = aHeightED.Denormalize(aHeightED.GetRealValue(FUNIT_TWIP));
        aSz.SetWidth (nNewWidth);
        aSz.SetHeight(nNewHeight);

        if (aRelWidthCB.IsChecked())
        {
            aSz.SetWidthPercent((BYTE)Min(100L, aWidthED.Convert(aWidthED.Normalize(nNewWidth), FUNIT_TWIP, FUNIT_CUSTOM)));
        }
        else
            aSz.SetWidthPercent(0);
        if (aRelHeightCB.IsChecked())
            aSz.SetHeightPercent((BYTE)Min(100L, aHeightED.Convert(aHeightED.Normalize(nNewHeight), FUNIT_TWIP, FUNIT_CUSTOM)));
        else
            aSz.SetHeightPercent(0);

        if (aFixedRatioCB.IsChecked() && (aRelWidthCB.IsChecked() ^ aRelHeightCB.IsChecked()))
        {
            if (aRelWidthCB.IsChecked())
                aSz.SetHeightPercent(0xff);
            else
                aSz.SetWidthPercent(0xff);
        }
    }
    if ( nDlgType != DLG_FRM_GRF )
    {
        if (aAutoHeightCB.GetState() != aAutoHeightCB.GetSavedValue())
        {
            SwFrmSize eFrmSize = (SwFrmSize) aAutoHeightCB.IsChecked() ?
                                                    ATT_MIN_SIZE : ATT_FIX_SIZE;
            if(eFrmSize != aSz.GetSizeType())
            {
                aSz.SetSizeType(eFrmSize);
            }
        }
    }
    if( !bFormat && aFixedRatioCB.GetSavedValue() != aFixedRatioCB.IsChecked())
        bRet |= 0 != rSet.Put(SfxBoolItem(FN_KEEP_ASPECT_RATIO, aFixedRatioCB.IsChecked()));

    pOldItem = GetOldItem(rSet, RES_FRM_SIZE);

    if ((pOldItem && aSz != *pOldItem) || (!pOldItem && !bFormat) ||
            (bFormat &&
                (aSz.GetWidth() > 0 || aSz.GetWidthPercent() > 0) &&
                    (aSz.GetHeight() > 0 || aSz.GetHeightPercent() > 0)))
    {
        if (aSz.GetSizeType() == ATT_VAR_SIZE)  // VAR_SIZE gibts nicht bei Rahmen
            aSz.SetSizeType(ATT_MIN_SIZE);      // Bug #45776 (Vorlagen ohne Breite/Hoehe)

        bRet |= 0 != rSet.Put( aSz );
    }

    return bRet;
}

/*--------------------------------------------------------------------
    Beschreibung:   Horizontale und vertikale Pos initialisieren
 --------------------------------------------------------------------*/

void SwFrmPage::InitPos(USHORT nId,
                                USHORT nH,
                                USHORT nHRel,
                                USHORT nV,
                                USHORT nVRel,
                                long   nX,
                                long   nY)
{
    USHORT nPos = aVerticalDLB.GetSelectEntryPos();
    if ( nPos != LISTBOX_ENTRY_NOTFOUND && pVMap )
    {
        nOldV    = pVMap[nPos].nAlign;

        nPos = aVertRelationLB.GetSelectEntryPos();
        if (nPos != LISTBOX_ENTRY_NOTFOUND)
            nOldVRel = ((RelationMap *)aVertRelationLB.GetEntryData(nPos))->nRelation;
    }

    nPos = aHorizontalDLB.GetSelectEntryPos();
    if ( nPos != LISTBOX_ENTRY_NOTFOUND && pHMap )
    {
        nOldH    = pHMap[nPos].nAlign;

        nPos = aHoriRelationLB.GetSelectEntryPos();
        if (nPos != LISTBOX_ENTRY_NOTFOUND)
            nOldHRel = ((RelationMap *)aHoriRelationLB.GetEntryData(nPos))->nRelation;
    }

    BOOL bEnable = TRUE;
    if ( nId == FLY_PAGE )
    {
        pVMap = bHtmlMode ? aVPageHtmlMap : aVPageMap;
        pHMap = bHtmlMode ? aHPageHtmlMap : aHPageMap;
    }
    else if ( nId == FLY_AT_FLY )
    {
        pVMap = bHtmlMode ? aVFlyHtmlMap : aVParaMap;
        pHMap = bHtmlMode ? aHFlyHtmlMap : aHFrameMap;
    }
    else if ( nId == FLY_AT_CNTNT )
    {
        if(bHtmlMode)
        {
            pVMap = aVParaHtmlMap;
            pHMap = nHtmlMode & HTMLMODE_SOME_ABS_POS ? aHParaHtmlAbsMap : aHParaHtmlMap;
        }
        else
        {
            pVMap = aVParaMap;
            pHMap = aHParaMap;
        }
    }
    else if ( nId == FLY_AUTO_CNTNT )
    {
        if(bHtmlMode)
        {
            pVMap = nHtmlMode & HTMLMODE_SOME_ABS_POS ? aVCharHtmlAbsMap    : aVCharHtmlMap;
            pHMap = nHtmlMode & HTMLMODE_SOME_ABS_POS ? aHCharHtmlAbsMap    : aHCharHtmlMap;
        }
        else
        {
            pVMap = aVCharMap;
            pHMap = aHCharMap;
        }
    }
    else if ( nId == FLY_IN_CNTNT )
    {
        pVMap = bHtmlMode ? aVAsCharHtmlMap     : aVAsCharMap;
        pHMap = 0;
        bEnable = FALSE;
    }
    aHorizontalDLB.Enable( bEnable );
    aHorizontalFT.Enable( bEnable );

    // aktuelle Pos selektieren
    // Horizontal
    if ( nH == USHRT_MAX )
    {
        nH    = nOldH;
        nHRel = nOldHRel;
    }
    USHORT nMapPos = FillPosLB(pHMap, nH, aHorizontalDLB);
    FillRelLB(pHMap, nMapPos, nH, nHRel, aHoriRelationLB);

    // Vertikal
    if ( nV == USHRT_MAX )
    {
        nV    = nOldV;
        nVRel = nOldVRel;
    }
    nMapPos = FillPosLB(pVMap, nV, aVerticalDLB);
    FillRelLB(pVMap, nMapPos, nV, nVRel, aVertRelationLB);

    // Edits init
    bEnable = nH == HORI_NONE && nId != FLY_IN_CNTNT;//#61359# warum nicht in Formaten&& !bFormat;
    if (!bEnable)
    {
        aAtHorzPosED.SetValue( 0, FUNIT_TWIP );
        if (nX != LONG_MAX && bHtmlMode)
            aAtHorzPosED.SetModifyFlag();
    }
    else
    {
        if (nX != LONG_MAX)
            aAtHorzPosED.SetValue( aAtHorzPosED.Normalize(nX), FUNIT_TWIP );
    }
    aAtHorzPosFT.Enable( bEnable );
    aAtHorzPosED.Enable( bEnable );

    bEnable = nV == SVX_VERT_NONE && !bFormat;
    if ( !bEnable )
    {
        aAtVertPosED.SetValue( 0, FUNIT_TWIP );
        if(nY != LONG_MAX && bHtmlMode)
            aAtVertPosED.SetModifyFlag();
    }
    else
    {
        if ( nId == FLY_IN_CNTNT )
        {
            if ( nY == LONG_MAX )
                nY = 0;
            else
                nY *= -1;
        }
        if ( nY != LONG_MAX )
            aAtVertPosED.SetValue( aAtVertPosED.Normalize(nY), FUNIT_TWIP );
    }
    aAtVertPosFT.Enable( bEnable );
    aAtVertPosED.Enable( bEnable );
    UpdateExample();
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

USHORT SwFrmPage::FillPosLB(FrmMap *pMap, USHORT nAlign, ListBox &rLB)
{
    String sSelEntry, sOldEntry;
    sOldEntry = rLB.GetSelectEntry();

    rLB.Clear();

    // Listbox fuellen
    USHORT nCount = ::lcl_GetFrmMapCount(pMap);
    for (USHORT i = 0; pMap && i < nCount; ++i)
    {
//      #61359# Warum nicht von links/von innen bzw. von oben?
//      if (!bFormat || (pMap[i].nStrId != STR_FROMLEFT && pMap[i].nStrId != STR_FROMTOP))
        {
            USHORT nResId = aMirrorPagesCB.IsChecked() ? pMap[i].nMirrorStrId : pMap[i].nStrId;
            String sEntry(SW_RES(nResId));
            sEntry.EraseAllChars( '~' );
            if (rLB.GetEntryPos(sEntry) == LISTBOX_ENTRY_NOTFOUND)
                // bei zeichengebundenen Rahmen keine doppelten Eintraege einfuegen
                rLB.InsertEntry(sEntry);
            if (nAlign == pMap[i].nAlign)
                sSelEntry = sEntry;
        }
    }

    rLB.SelectEntry(sSelEntry);
    if (!rLB.GetSelectEntryCount())
        rLB.SelectEntry(sOldEntry);

    if (!rLB.GetSelectEntryCount())
        rLB.SelectEntryPos(0);

    PosHdl(&rLB);

    return GetMapPos(pMap, rLB);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

ULONG SwFrmPage::FillRelLB(FrmMap *pMap, USHORT nMapPos, USHORT nAlign, USHORT nRel, ListBox &rLB)
{
    String sSelEntry;
    ULONG  nLBRelations = 0;
    USHORT nMapCount = ::lcl_GetFrmMapCount(pMap);

    rLB.Clear();

    if (nMapPos < nMapCount)
    {
        if (pMap == aVAsCharHtmlMap || pMap == aVAsCharMap)
        {
            String sOldEntry(rLB.GetSelectEntry());
            USHORT nRelCount = sizeof(aAsCharRelationMap) / sizeof(RelationMap);
            USHORT nStrId = pMap[nMapPos].nStrId;

            for (USHORT nMapPos = 0; nMapPos < nMapCount; nMapPos++)
            {
                if (pMap[nMapPos].nStrId == nStrId)
                {
                    nLBRelations = pMap[nMapPos].nLBRelations;
                    for (USHORT nRelPos = 0; nRelPos < nRelCount; nRelPos++)
                    {
                        if (nLBRelations & aAsCharRelationMap[nRelPos].nLBRelation)
                        {
                            USHORT nResId = aAsCharRelationMap[nRelPos].nStrId;

                            String sEntry(SW_RES(nResId));
                            USHORT nPos = rLB.InsertEntry(sEntry);
                            rLB.SetEntryData(nPos, &aAsCharRelationMap[nRelPos]);
                            if (pMap[nMapPos].nAlign == nAlign)
                                sSelEntry = sEntry;
                            break;
                        }
                    }
                }
            }
            if (sSelEntry.Len())
                rLB.SelectEntry(sSelEntry);
            else
            {
                rLB.SelectEntry(sOldEntry);

                if (!rLB.GetSelectEntryCount())
                {
                    for (USHORT i = 0; i < rLB.GetEntryCount(); i++)
                    {
                        RelationMap *pEntry = (RelationMap *)rLB.GetEntryData(i);
                        if (pEntry->nLBRelation == LB_REL_CHAR) // Default
                        {
                            rLB.SelectEntryPos(i);
                            break;
                        }
                    }
                }
            }
        }
        else
        {
            USHORT nRelCount = sizeof(aRelationMap) / sizeof(RelationMap);

            nLBRelations = pMap[nMapPos].nLBRelations;

            for (ULONG nBit = 1; nBit < 0x80000000; nBit <<= 1)
            {
                if (nLBRelations & nBit)
                {
                    for (USHORT nRelPos = 0; nRelPos < nRelCount; nRelPos++)
                    {
                        if (aRelationMap[nRelPos].nLBRelation == nBit)
                        {
                            USHORT nResId = aMirrorPagesCB.IsChecked() ? aRelationMap[nRelPos].nMirrorStrId : aRelationMap[nRelPos].nStrId;
                            String sEntry(SW_RES(nResId));
                            USHORT nPos = rLB.InsertEntry(sEntry);
                            rLB.SetEntryData(nPos, &aRelationMap[nRelPos]);
                            if (!sSelEntry.Len() && aRelationMap[nRelPos].nRelation == nRel)
                                sSelEntry = sEntry;
                        }
                    }
                }
            }
            if (sSelEntry.Len())
                rLB.SelectEntry(sSelEntry);
            else
            {
                // Warscheinlich Ankerwechsel. Daher aehnliche Relation suchen
                switch (nRel)
                {
                    case FRAME:             nRel = REL_PG_FRAME;    break;
                    case PRTAREA:           nRel = REL_PG_PRTAREA;  break;
                    case REL_PG_LEFT:       nRel = REL_FRM_LEFT;    break;
                    case REL_PG_RIGHT:      nRel = REL_FRM_RIGHT;   break;
                    case REL_FRM_LEFT:      nRel = REL_PG_LEFT;     break;
                    case REL_FRM_RIGHT:     nRel = REL_PG_RIGHT;    break;
                    case REL_PG_FRAME:      nRel = FRAME;           break;
                    case REL_PG_PRTAREA:    nRel = PRTAREA;         break;

                    default:
                        if (rLB.GetEntryCount())
                        {
                            RelationMap *pEntry = (RelationMap *)rLB.GetEntryData(rLB.GetEntryCount() - 1);
                            nRel = pEntry->nRelation;
                        }
                        break;
                }

                for (USHORT i = 0; i < rLB.GetEntryCount(); i++)
                {
                    RelationMap *pEntry = (RelationMap *)rLB.GetEntryData(i);
                    if (pEntry->nRelation == nRel)
                    {
                        rLB.SelectEntryPos(i);
                        break;
                    }
                }

                if (!rLB.GetSelectEntryCount())
                    rLB.SelectEntryPos(0);
            }
        }
    }

    rLB.Enable(rLB.GetEntryCount() != 0);

    RelHdl(&rLB);

    return nLBRelations;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

USHORT SwFrmPage::GetRelation(FrmMap *pMap, ListBox &rRelationLB)
{
    USHORT nRel = 0;
    USHORT nPos = rRelationLB.GetSelectEntryPos();

    if (nPos != LISTBOX_ENTRY_NOTFOUND)
    {
        RelationMap *pEntry = (RelationMap *)rRelationLB.GetEntryData(nPos);
        nRel = pEntry->nRelation;
    }

    return nRel;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

USHORT SwFrmPage::GetAlignment(FrmMap *pMap, USHORT nMapPos, ListBox &rAlignLB, ListBox &rRelationLB)
{
    USHORT nAlign = 0;

    if (pMap == aVAsCharHtmlMap || pMap == aVAsCharMap)
    {
        if (rRelationLB.GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND)
        {
            ULONG  nRel = ((RelationMap *)rRelationLB.GetEntryData(rRelationLB.GetSelectEntryPos()))->nLBRelation;
            USHORT nMapCount = ::lcl_GetFrmMapCount(pMap);
            USHORT nStrId = pMap[nMapPos].nStrId;

            for (USHORT i = 0; i < nMapCount; i++)
            {
                if (pMap[i].nStrId == nStrId)
                {
                    ULONG nLBRelations = pMap[i].nLBRelations;
                    if (nLBRelations & nRel)
                    {
                        nAlign = pMap[i].nAlign;
                        break;
                    }
                }
            }
        }
    }
    else if (pMap)
        nAlign = pMap[nMapPos].nAlign;

    return nAlign;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

USHORT SwFrmPage::GetMapPos(FrmMap *pMap, ListBox &rAlignLB)
{
    USHORT nMapPos = 0;
    USHORT nLBSelPos = rAlignLB.GetSelectEntryPos();

    if (nLBSelPos != LISTBOX_ENTRY_NOTFOUND)
    {
        if (pMap == aVAsCharHtmlMap || pMap == aVAsCharMap)
        {
            USHORT nMapCount = ::lcl_GetFrmMapCount(pMap);
            String sSelEntry(rAlignLB.GetSelectEntry());

            for (USHORT i = 0; i < nMapCount; i++)
            {
                USHORT nResId = pMap[i].nStrId;

                String sEntry(SW_RES(nResId));
                sEntry.EraseAllChars( '~' );

                if (sEntry == sSelEntry)
                {
                    nMapPos = i;
                    break;
                }
            }
        }
        else
            nMapPos = nLBSelPos;
    }

    return nMapPos;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

USHORT SwFrmPage::GetAnchor()
{
    if (aAnchorTypeRB.IsChecked())
        return (USHORT)(ULONG)aAnchorTypeLB.GetEntryData(aAnchorTypeLB.GetSelectEntryPos());
    else
        return FLY_IN_CNTNT;
}

/*--------------------------------------------------------------------
    Beschreibung:   Bsp - Update
 --------------------------------------------------------------------*/

void SwFrmPage::ActivatePage(const SfxItemSet& rSet)
{
    bNoModifyHdl = TRUE;
    Init(rSet);
    bNoModifyHdl = FALSE;
    RangeModifyHdl(&aWidthED);  // Alle Maximalwerte initial setzen
}

int SwFrmPage::DeactivatePage(SfxItemSet * pSet)
{
    if ( pSet )
    {
        FillItemSet( *pSet );

        //FillItemSet setzt den Anker nicht in den Set, wenn er mit dem
        //Original uebereinstimmt. Fuer die anderen Pages brauchen wir aber
        //den aktuellen Anker.
        SwWrtShell* pSh = bFormat ? ::GetActiveWrtShell()
                            : ((SwFrmDlg*)GetParent()->GetParent())->GetWrtShell();
        RndStdIds eAnchorId = (RndStdIds)GetAnchor();
        SwFmtAnchor aAnc( eAnchorId, pSh->GetPhyPageNum() );
        pSet->Put( aAnc );
    }

    return TRUE;
}

/*--------------------------------------------------------------------
    Beschreibung: Links/rechts mit Innen/aussen tauschen
 --------------------------------------------------------------------*/

IMPL_LINK( SwFrmPage, MirrorHdl, CheckBox *, pBtn )
{
    USHORT nId = GetAnchor();
    InitPos( nId, USHRT_MAX, 0, USHRT_MAX, 0, LONG_MAX, LONG_MAX);

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwFrmPage, RelSizeClickHdl, CheckBox *, pBtn )
{
    if (pBtn == &aRelWidthCB)
        aWidthED.ShowPercent(pBtn->IsChecked());
    else
        aHeightED.ShowPercent(pBtn->IsChecked());

    if (pBtn)   // Nur wenn Handler durch Aenderung des Controllers gerufen wurde
        RangeModifyHdl(&aWidthED);  // Werte wieder korrigieren

    if (pBtn == &aRelWidthCB)
        ModifyHdl(&aWidthED);
    else
        ModifyHdl(&aHeightED);

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:   Bereichspruefung
 --------------------------------------------------------------------*/

IMPL_LINK( SwFrmPage, RangeModifyHdl, Edit *, pEdit )
{
    if (bNoModifyHdl)
        return 0;

    SwWrtShell* pSh = bFormat ? ::GetActiveWrtShell()
                        :((SwFrmDlg*)GetParent()->GetParent())->GetWrtShell();
    ASSERT(pSh , "shell not found");
    SwFlyFrmAttrMgr aMgr( bNew, pSh, (const SwAttrSet&)GetItemSet() );
    SwFrmValid      aVal;

    aVal.eArea = (RndStdIds)GetAnchor();
    aVal.bAuto = aAutoHeightCB.IsChecked();
    aVal.bMirror = aMirrorPagesCB.IsChecked();

    if ( pHMap )
    {
        // Ausrichtung Horizontal
        USHORT nMapPos = GetMapPos(pHMap, aHorizontalDLB);
        USHORT nAlign = GetAlignment(pHMap, nMapPos, aHorizontalDLB, aHoriRelationLB);
        USHORT nRel = GetRelation(pHMap, aHoriRelationLB);

        aVal.eHori = (SwHoriOrient)nAlign;
        aVal.eHRel = (SwRelationOrient)nRel;
    }
    else
        aVal.eHori = HORI_NONE;

    if ( pVMap )
    {
        // Ausrichtung Vertikal
        USHORT nMapPos = GetMapPos(pVMap, aVerticalDLB);
        USHORT nAlign = GetAlignment(pVMap, nMapPos, aVerticalDLB, aVertRelationLB);
        USHORT nRel = GetRelation(pVMap, aVertRelationLB);

        aVal.eVert = (SvxFrameVertOrient)nAlign;
        aVal.eVRel = (SwRelationOrient)nRel;
    }
    else
        aVal.eVert = SVX_VERT_NONE;

    const long nAtHorzPosVal =
                    aAtHorzPosED.Denormalize(aAtHorzPosED.GetValue(FUNIT_TWIP));
    const long nAtVertPosVal =
                    aAtVertPosED.Denormalize(aAtVertPosED.GetValue(FUNIT_TWIP));

    aVal.nHPos = nAtHorzPosVal;
    aVal.nVPos = nAtVertPosVal;

    aMgr.ValidateMetrics(aVal, TRUE);   // Einmal, um Referenzwerte fuer prozentuale Werte zu erhalten

    // Referenzwerte fuer fuer Prozentwerte setzen (100%) ...
    aWidthED.SetRefValue(aVal.aPercentSize.Width());
    aHeightED.SetRefValue(aVal.aPercentSize.Height());

    // ... und damit Breite und Hoehe korrekt umrechnen
    SwTwips nWidth = aWidthED. Denormalize(aWidthED.GetValue(FUNIT_TWIP));
    SwTwips nHeight = aHeightED.Denormalize(aHeightED.GetValue(FUNIT_TWIP));
    aVal.nWidth  = nWidth;
    aVal.nHeight = nHeight;

    aMgr.ValidateMetrics(aVal); // Nochmal um mit korrekter Breite und Hoehe alle restlichen Werte zu ermitteln

    // alle Spalten muessen passen
    if(GetTabDialog()->GetExampleSet() &&
            SFX_ITEM_DEFAULT <= GetTabDialog()->GetExampleSet()->GetItemState(RES_COL))
    {
        const SwFmtCol& rCol = (const SwFmtCol&)GetTabDialog()->GetExampleSet()->Get(RES_COL);
        if ( rCol.GetColumns().Count() > 1 )
        {
            for ( USHORT i = 0; i < rCol.GetColumns().Count(); ++i )
            {
                aVal.nMinWidth += rCol.GetColumns()[i]->GetLeft() +
                                  rCol.GetColumns()[i]->GetRight() +
                                  MINFLY;
            }
            aVal.nMinWidth -= MINFLY;//einen hatten wir schon mit drin!
        }
    }

    nWidth = aVal.nWidth;
    nHeight = aVal.nHeight;

    // Mindestbreite auch fuer Vorlage
    aHeightED.SetMin(aHeightED.Normalize(aVal.nMinHeight), FUNIT_TWIP);
    aWidthED. SetMin(aWidthED.Normalize(aVal.nMinWidth), FUNIT_TWIP);

    SwTwips nMaxWidth(aVal.nMaxWidth);
    SwTwips nMaxHeight(aVal.nMaxHeight);

    if (aVal.bAuto && (nDlgType == DLG_FRM_GRF || nDlgType == DLG_FRM_OLE))
    {
        SwTwips nTmp = Min(nWidth * nMaxHeight / Max(nHeight, 1L), nMaxHeight);
        aWidthED.SetMax(aWidthED.Normalize(nTmp), FUNIT_TWIP);

        nTmp = Min(nHeight * nMaxWidth / Max(nWidth, 1L), nMaxWidth);
        aHeightED.SetMax(aWidthED.Normalize(nTmp), FUNIT_TWIP);
    }
    else
    {
        SwTwips nTmp = aHeightED.Normalize(nMaxHeight);
        aHeightED.SetMax(nTmp, FUNIT_TWIP);

        nTmp = aWidthED.Normalize(nMaxWidth);
        aWidthED.SetMax(nTmp, FUNIT_TWIP);
    }

    aAtHorzPosED.SetMin(aAtHorzPosED.Normalize(aVal.nMinHPos), FUNIT_TWIP);
    aAtHorzPosED.SetMax(aAtHorzPosED.Normalize(aVal.nMaxHPos), FUNIT_TWIP);
    if ( aVal.nHPos != nAtHorzPosVal )
        aAtHorzPosED.SetValue(aAtHorzPosED.Normalize(aVal.nHPos), FUNIT_TWIP);

    SwTwips nUpperOffset = aVal.eArea == FLY_IN_CNTNT ? nUpperBorder : 0;
    SwTwips nLowerOffset = aVal.eArea == FLY_IN_CNTNT ? nLowerBorder : 0;

    aAtVertPosED.SetMin(aAtVertPosED.Normalize(aVal.nMinVPos + nLowerOffset + nUpperOffset), FUNIT_TWIP);
    aAtVertPosED.SetMax(aAtVertPosED.Normalize(aVal.nMaxVPos), FUNIT_TWIP);
    if ( aVal.nVPos != nAtVertPosVal )
        aAtVertPosED.SetValue(aAtVertPosED.Normalize(aVal.nVPos), FUNIT_TWIP);

    if (pEdit == &aWidthED)
        bWidthLastChanged = TRUE;
    else if (pEdit == &aHeightED)
        bWidthLastChanged = FALSE;
    return 0;
}

IMPL_LINK( SwFrmPage, TypHdl, ListBox *, pLB )
{
    if (pLB == &aAnchorTypeLB)
        aAnchorTypeRB.Check();

    aMirrorPagesCB.Enable(aAnchorTypeRB.IsChecked());

    USHORT nId = GetAnchor();

    InitPos( nId, USHRT_MAX, 0, USHRT_MAX, 0, LONG_MAX, LONG_MAX);
    if (pLB)    // Nur wenn Handler durch Aenderung des Controllers gerufen wurde
        RangeModifyHdl(0);

    if(bHtmlMode)
    {
        PosHdl(&aHorizontalDLB);
        PosHdl(&aVerticalDLB);
    }
    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwFrmPage, PosHdl, ListBox *, pLB )
{
    BOOL bHori = pLB == &aHorizontalDLB;
    ListBox *pRelLB = bHori ? &aHoriRelationLB : &aVertRelationLB;
    FrmMap *pMap = bHori ? pHMap : pVMap;

    USHORT nLBSelPos = pLB->GetSelectEntryPos();
    //BOOL bEnable = nLBSelPos == pLB->GetEntryCount()-1 && !bFormat;

    USHORT nMapPos = GetMapPos(pMap, *pLB);
    USHORT nAlign = GetAlignment(pMap, nMapPos, *pLB, *pRelLB);

    if (bHori)
    {
        BOOL bEnable = HORI_NONE == nAlign && !bFormat;
        aAtHorzPosED.Enable( bEnable );
        aAtHorzPosFT.Enable( bEnable );
    }
    else
    {
        BOOL bEnable = SVX_VERT_NONE == nAlign && !bFormat;
        aAtVertPosED.Enable( bEnable );
        aAtVertPosFT.Enable( bEnable );
    }

    if (pLB)    // Nur wenn Handler durch Aenderung des Controllers gerufen wurde
        RangeModifyHdl( 0 );

    USHORT nRel = 0;
    if (pLB->GetSelectEntryCount())
    {

        if (pRelLB->GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND)
            nRel = ((RelationMap *)pRelLB->GetEntryData(pRelLB->GetSelectEntryPos()))->nRelation;

        FillRelLB(pMap, nMapPos, nAlign, nRel, *pRelLB);
    }
    else
        pRelLB->Clear();

    UpdateExample();

    if (bHori)
        bAtHorzPosModified = TRUE;
    else
        bAtVertPosModified = TRUE;

    // Sonderbehandlung fuer HTML-Mode mit horz-vert-Abhaengigkeiten
    if(bHtmlMode && nHtmlMode&HTMLMODE_SOME_ABS_POS &&
            FLY_AUTO_CNTNT == GetAnchor())
    {
        BOOL bSet = FALSE;
        if(bHori)
        {
            // rechts ist nur unterhalb erlaubt - von links nur oben
            // von links am Zeichen -> unterhalb
            if((HORI_LEFT == nAlign || HORI_RIGHT == nAlign) &&
                    0 == aVerticalDLB.GetSelectEntryPos())
            {
                if(FRAME == nRel)
                    aVerticalDLB.SelectEntryPos(1);
                else
                    aVerticalDLB.SelectEntryPos(0);
                bSet = TRUE;
            }
            else if(HORI_LEFT == nAlign && 1 == aVerticalDLB.GetSelectEntryPos())
            {
                aVerticalDLB.SelectEntryPos(0);
                bSet = TRUE;
            }
            else if(HORI_NONE == nAlign && 1 == aVerticalDLB.GetSelectEntryPos())
            {
                aVerticalDLB.SelectEntryPos(0);
                bSet = TRUE;
            }
            if(bSet)
                PosHdl(&aVerticalDLB);
        }
        else
        {
            if(SVX_VERT_TOP == nAlign)
            {
                if(1 == aHorizontalDLB.GetSelectEntryPos())
                {
                    aHorizontalDLB.SelectEntryPos(0);
                    bSet = TRUE;
                }
                aHoriRelationLB.SelectEntryPos(1);
            }
            else if(SVX_VERT_CHAR_BOTTOM == nAlign)
            {
                if(2 == aHorizontalDLB.GetSelectEntryPos())
                {
                    aHorizontalDLB.SelectEntryPos(0);
                    bSet = TRUE;
                }
                aHoriRelationLB.SelectEntryPos(0) ;
            }
            if(bSet)
                PosHdl(&aHorizontalDLB);
        }

    }
    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:   Horizontale Pos
 --------------------------------------------------------------------*/

IMPL_LINK( SwFrmPage, RelHdl, ListBox *, pLB )
{
    BOOL bHori = pLB == &aHoriRelationLB;

    UpdateExample();

    if (bHori)
        bAtHorzPosModified = TRUE;
    else
        bAtVertPosModified = TRUE;

    if (!bHori && pVMap == aVCharMap)
    {
        // Ausrichtung Vertikal
        String sEntry;
        USHORT nMapPos = GetMapPos(pVMap, aVerticalDLB);
        USHORT nAlign = GetAlignment(pVMap, nMapPos, aVerticalDLB, aVertRelationLB);
        USHORT nRel = GetRelation(pVMap, aVertRelationLB);

        if (nRel == REL_CHAR)
            sEntry = SW_RESSTR(STR_FROMBOTTOM);
        else
            sEntry = SW_RESSTR(STR_FROMTOP);

        USHORT nOldPos = aVerticalDLB.GetSelectEntryPos();

        String sName = aVerticalDLB.GetEntry(aVerticalDLB.GetEntryCount() - 1);
        if (sName != sEntry)
        {
            aVerticalDLB.RemoveEntry(aVerticalDLB.GetEntryCount() - 1);
            aVerticalDLB.InsertEntry(sEntry);
            aVerticalDLB.SelectEntryPos(nOldPos);
        }
    }
    if(bHtmlMode  && FLY_AUTO_CNTNT == GetAnchor()) // wieder Sonderbehandlung
    {
        if(bHori)
        {
            USHORT nRel = GetRelation(pHMap, aHoriRelationLB);
            if(PRTAREA == nRel && 0 == aVerticalDLB.GetSelectEntryPos())
            {
                aVerticalDLB.SelectEntryPos(1);
            }
            else if(REL_CHAR == nRel && 1 == aVerticalDLB.GetSelectEntryPos())
            {
                aVerticalDLB.SelectEntryPos(0);
            }
        }
    }
    if (pLB)    // Nur wenn Handler durch Aenderung des Controllers gerufen wurde
        RangeModifyHdl(0);

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwFrmPage, AspectRatioCheckHdl, CheckBox *, pCB )
{
    if ( aFixedRatioCB.IsChecked() &&
            (aWidthED.IsValueModified() || aHeightED.IsValueModified()) &&
            nDlgType != DLG_FRM_GRF || (aGrfSize.Width() && aGrfSize.Height()) )
    {
        if (!aRelWidthCB.IsChecked() && !aRelHeightCB.IsChecked())
        {
            if (bWidthLastChanged)
            {
                SwTwips nHFac = aGrfSize.Height() * 1000 / aGrfSize.Width();
                SwTwips nTmp;
                if ( aWidthED.IsValueModified() )
                    nTmp = aWidthED.Denormalize(aWidthED.GetValue(FUNIT_TWIP));
                else
                {   //Rundungsfehler vermeiden
                    const SwFmtFrmSize &rSz = (const SwFmtFrmSize&)GetItemSet().
                                                                    Get(RES_FRM_SIZE);
                    nTmp = rSz.GetWidth();
                }
                nTmp = nTmp * nHFac / 1000;
                aHeightED.SetUserValue(aHeightED.Normalize(nTmp), FUNIT_TWIP);
            }
            else
            {
                SwTwips nVFac = aGrfSize.Width() * 1000 / aGrfSize.Height();
                SwTwips nTmp;
                if ( aHeightED.IsValueModified() )
                    nTmp = aHeightED.Denormalize(aHeightED.GetValue(FUNIT_TWIP));
                else
                {   //Rundungsfehler vermeiden
                    const SwFmtFrmSize &rSz = (const SwFmtFrmSize&)GetItemSet().
                                                                    Get(RES_FRM_SIZE);
                    nTmp = rSz.GetHeight();
                }
                nTmp = nTmp * nVFac / 1000;
                aWidthED.SetUserValue(aWidthED.Normalize(nTmp), FUNIT_TWIP);
            }
        }
        UpdateExample();
    }

    if (pCB)    // Nur wenn Handler durch Aenderung des Controllers gerufen wurde
        RangeModifyHdl(&aWidthED);  // Alle Maximalwerte neu initialisieren

    return 0;
}

IMPL_LINK_INLINE_START( SwFrmPage, RealSizeHdl, Button *, EMPTYARG )
{
    aWidthED.SetUserValue( aWidthED. Normalize(aGrfSize.Width() ), FUNIT_TWIP);
    aHeightED.SetUserValue(aHeightED.Normalize(aGrfSize.Height()), FUNIT_TWIP);
    UpdateExample();
    return 0;
}
IMPL_LINK_INLINE_END( SwFrmPage, RealSizeHdl, Button *, EMPTYARG )

IMPL_LINK_INLINE_START( SwFrmPage, ManualHdl, Button *, EMPTYARG )
{
    return 0;
}
IMPL_LINK_INLINE_END( SwFrmPage, ManualHdl, Button *, EMPTYARG )

IMPL_LINK( SwFrmPage, ModifyHdl, Edit *, pEdit )
{
    if (pEdit == &aWidthED)
        bWidthLastChanged = TRUE;
    else if (pEdit == &aHeightED)
        bWidthLastChanged = FALSE;

    if ( aFixedRatioCB.IsChecked() )
    {
        BOOL bWidthRelative = aRelWidthCB.IsChecked();
        BOOL bHeightRelative = aRelHeightCB.IsChecked();
        if ( pEdit == &aWidthED )
        {
            const SwTwips nTmp = aHeightED.Normalize(aGrfSize.Height() *
                           aWidthED.Denormalize(aWidthED.GetValue(FUNIT_TWIP)) /
                                                Max(aGrfSize.Width(), 1L));
            const SwTwips nMaxHeight = bHeightRelative ?
                aHeightED.GetRefValue() * ( aHeightED.GetOldDigits() == 1 ? 10 : 100):
                            aHeightED.GetMax(FUNIT_TWIP);
            if(nMaxHeight >= nTmp)
                aHeightED.SetValue(nTmp, FUNIT_TWIP);
            else
            {
                //cut selected width
                const SwTwips nNewWidth = aWidthED.Normalize(aGrfSize.Width() *
                                aHeightED.Denormalize(nMaxHeight) /
                                Max(aGrfSize.Height(),1L));
                aWidthED.SetUserValue(nNewWidth, FUNIT_TWIP);
                //aHeightED.SetValue(nMaxHeight, FUNIT_TWIP);
                aHeightED.SetUserValue(nMaxHeight, FUNIT_TWIP);

            }
        }
        else
        {
            const SwTwips nTmp = aWidthED.Normalize(aGrfSize.Width() *
                            aHeightED.Denormalize(aHeightED.GetValue(FUNIT_TWIP)) /
                            Max(aGrfSize.Height(),1L));
            const SwTwips nMaxWidth = bWidthRelative ?
                            aWidthED.GetRefValue() * (aWidthED.GetOldDigits()== 1 ? 10 : 100):
                            aWidthED.GetMax(FUNIT_TWIP);
            if(nMaxWidth >= nTmp)
                aWidthED.SetValue(nTmp, FUNIT_TWIP);
            else
            {
                //cut selected height
                const SwTwips nNewHeight = aHeightED.Normalize(aGrfSize.Height() *
                                aWidthED.Denormalize(nMaxWidth) /
                                Max(aGrfSize.Width(),1L));
                aHeightED.SetUserValue(nNewHeight, FUNIT_TWIP);
                //aWidthED.SetValue(nMaxWidth, FUNIT_TWIP);
                aWidthED.SetUserValue(nMaxWidth, FUNIT_TWIP);

            }
        }
    }

    UpdateExample();
    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwFrmPage::UpdateExample()
{
    USHORT nPos = aHorizontalDLB.GetSelectEntryPos();
    if ( pHMap && nPos != LISTBOX_ENTRY_NOTFOUND )
    {
        USHORT nMapPos = GetMapPos(pHMap, aHorizontalDLB);
        USHORT nAlign = GetAlignment(pHMap, nMapPos, aHorizontalDLB, aHoriRelationLB);
        USHORT nRel = GetRelation(pHMap, aHoriRelationLB);

        aExampleWN.SetHAlign(nAlign);
        aExampleWN.SetHoriRel(nRel);
    }

    nPos = aVerticalDLB.GetSelectEntryPos();
    if ( pVMap && nPos != LISTBOX_ENTRY_NOTFOUND )
    {
        USHORT nMapPos = GetMapPos(pVMap, aVerticalDLB);
        USHORT nAlign = GetAlignment(pVMap, nMapPos, aVerticalDLB, aVertRelationLB);
        USHORT nRel = GetRelation(pVMap, aVertRelationLB);

        aExampleWN.SetVAlign(nAlign);
        aExampleWN.SetVertRel(nRel);
    }

    // Size
    long nXPos = aAtHorzPosED.Denormalize(aAtHorzPosED.GetValue(FUNIT_TWIP));
    long nYPos = aAtVertPosED.Denormalize(aAtVertPosED.GetValue(FUNIT_TWIP));
    aExampleWN.SetRelPos(Point(nXPos, nYPos));

    RndStdIds eAnchorId = (RndStdIds)GetAnchor();
    aExampleWN.SetAnchor( eAnchorId );
    aExampleWN.Invalidate();
}

void SwFrmPage::Init(const SfxItemSet& rSet, BOOL bReset)
{
    if(!bFormat)
    {
        SwWrtShell* pSh = ((SwFrmDlg*)GetParent()->GetParent())->GetWrtShell();

        // Size
        const FASTBOOL bSizeFixed = pSh->IsSelObjProtected( FLYPROTECT_FIXED );

        aWidthED .Enable( !bSizeFixed );
        aHeightED.Enable( !bSizeFixed );
    }

    const SwFmtFrmSize& rSize = (const SwFmtFrmSize&)rSet.Get(RES_FRM_SIZE);
    long nWidth = aWidthED.Normalize(rSize.GetWidth());
    long nHeight = aHeightED.Normalize(rSize.GetHeight());

    if (nWidth != aWidthED.GetValue(FUNIT_TWIP))
    {
        if(!bReset)
        {
            // Wert wurde von Umlauf-Tabpage geaendert und muss
            // mit Modify-Flag gesetzt werden
            aWidthED.SetUserValue(nWidth, FUNIT_TWIP);
        }
        else
            aWidthED.SetValue(nWidth, FUNIT_TWIP);
    }

    if (nHeight != aHeightED.GetValue(FUNIT_TWIP))
    {
        if (!bReset)
        {
            // Wert wurde von Umlauf-Tabpage geaendert und muss
            // mit Modify-Flag gesetzt werden
            aHeightED.SetUserValue(nHeight, FUNIT_TWIP);
        }
        else
            aHeightED.SetValue(nHeight, FUNIT_TWIP);
    }

    if (nDlgType != DLG_FRM_GRF && nDlgType != DLG_FRM_OLE)
    {
        aAutoHeightCB.Check(rSize.GetSizeType() != ATT_FIX_SIZE);
        if ( !bFormat )
        {
            SwWrtShell* pSh = ((SwFrmDlg*)GetParent()->GetParent())->GetWrtShell();
            const SwFrmFmt* pFmt = pSh->GetFlyFrmFmt();
            if( pFmt && pFmt->GetChain().GetNext() )
                aAutoHeightCB.Enable( FALSE );
        }
    }
    else
        aAutoHeightCB.Hide();

    // Umlauf-Abstand fuer zeichengebundene Rahmen organisieren
    const SvxULSpaceItem &rUL = (const SvxULSpaceItem &)rSet.Get(RES_UL_SPACE);
    nUpperBorder = rUL.GetUpper();
    nLowerBorder = rUL.GetLower();

    if(SFX_ITEM_SET == rSet.GetItemState(FN_KEEP_ASPECT_RATIO))
    {
        aFixedRatioCB.Check(((const SfxBoolItem&)rSet.Get(FN_KEEP_ASPECT_RATIO)).GetValue());
        aFixedRatioCB.SaveValue();
    }

    // Spalten
    SwFmtCol aCol( (const SwFmtCol&)rSet.Get(RES_COL) );
    ::FitToActualSize( aCol, (USHORT)rSize.GetWidth() );

    RndStdIds eAnchorId = (RndStdIds)GetAnchor();

    if ( bNew && !bFormat )
        InitPos (eAnchorId, USHRT_MAX, 0, USHRT_MAX, USHRT_MAX, LONG_MAX, LONG_MAX);
    else
    {
        const SwFmtHoriOrient& rHori = (const SwFmtHoriOrient&)rSet.Get(RES_HORI_ORIENT);
        const SwFmtVertOrient& rVert = (const SwFmtVertOrient&)rSet.Get(RES_VERT_ORIENT);
        nOldH    = rHori.GetHoriOrient();
        nOldHRel = rHori.GetRelationOrient();
        nOldV    = rVert.GetVertOrient(),
        nOldVRel = rVert.GetRelationOrient();

        if (eAnchorId == FLY_PAGE)
        {
            if (nOldHRel == FRAME)
                nOldHRel = REL_PG_FRAME;
            else if (nOldHRel == PRTAREA)
                nOldHRel = REL_PG_PRTAREA;
            if (nOldVRel == FRAME)
                nOldVRel = REL_PG_FRAME;
            else if (nOldVRel == PRTAREA)
                nOldVRel = REL_PG_PRTAREA;
        }

        aMirrorPagesCB.Check(rHori.IsPosToggle());
        aMirrorPagesCB.SaveValue();

        InitPos(eAnchorId,
                nOldH,
                nOldHRel,
                nOldV,
                nOldVRel,
                rHori.GetPos(),
                rVert.GetPos());
    }

    // Transparent fuers Bsp
    // Umlauf fuers Bsp
    const SwFmtSurround& rSurround = (const SwFmtSurround&)rSet.Get(RES_SURROUND);
    aExampleWN.SetWrap ( rSurround.GetSurround() );

    if ( rSurround.GetSurround() == SURROUND_THROUGHT )
    {
        const SvxOpaqueItem& rOpaque = (const SvxOpaqueItem&)rSet.Get(RES_OPAQUE);
        aExampleWN.SetTransparent(!rOpaque.GetValue());
    }

    // ggf auf Prozent umschalten
    RangeModifyHdl(&aWidthED);  // Referenzwerte setzen (fuer 100%)

    if (rSize.GetWidthPercent() == 0xff || rSize.GetHeightPercent() == 0xff)
        aFixedRatioCB.Check(TRUE);
    if (rSize.GetWidthPercent() && rSize.GetWidthPercent() != 0xff &&
        !aRelWidthCB.IsChecked())
    {
        aRelWidthCB.Check(TRUE);
        RelSizeClickHdl(&aRelWidthCB);
        aWidthED.SetValue(rSize.GetWidthPercent(), FUNIT_CUSTOM);
    }
    if (rSize.GetHeightPercent() && rSize.GetHeightPercent() != 0xff &&
        !aRelHeightCB.IsChecked())
    {
        aRelHeightCB.Check(TRUE);
        RelSizeClickHdl(&aRelHeightCB);
        aHeightED.SetValue(rSize.GetHeightPercent(), FUNIT_CUSTOM);
    }
    aRelWidthCB.SaveValue();
    aRelHeightCB.SaveValue();
}

USHORT* SwFrmPage::GetRanges()
{
    return aPageRg;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SwGrfExtPage::SwGrfExtPage(Window *pParent, const SfxItemSet &rSet) :
    SfxTabPage( pParent, SW_RES(TP_GRF_EXT), rSet ),
    aBmpWin                 (this, WN_BMP, Graphic(), Bitmap(BMP_EXAMPLE) ),
    aConnectGB              (this, SW_RES( GB_CONNECT )),
    aConnectFT              (this, SW_RES( FT_CONNECT )),
    aConnectED              (this, SW_RES( ED_CONNECT )),
    aBrowseBT               (this, SW_RES( PB_BROWSE )),
    aMirrorVertBox          (this, SW_RES( CB_VERT )),
    aMirrorHorzBox          (this, SW_RES( CB_HOR )),
//  aMirrorPagesLB          (this, SW_RES( LB_MIRROR_PAGES )),
//  aMirrorPagesFT          (this, SW_RES( FT_MIRROR_PAGES )),
    aAllPagesRB(            this, SW_RES( RB_MIRROR_ALL_PAGES )),
    aLeftPagesRB(           this, SW_RES( RB_MIRROR_LEFT_PAGES )),
    aRightPagesRB(          this, SW_RES( RB_MIRROR_RIGHT_PAGES )),

    aMirrorFrm              (this, SW_RES( GB_MIRROR )),
    pGrfDlg( 0 )
{
    FreeResource();
    SetExchangeSupport();
    aMirrorHorzBox.SetClickHdl( LINK(this, SwGrfExtPage, MirrorHdl));
    aMirrorVertBox.SetClickHdl( LINK(this, SwGrfExtPage, MirrorHdl));
    aBrowseBT.SetClickHdl    ( LINK(this, SwGrfExtPage, BrowseHdl));
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SwGrfExtPage::~SwGrfExtPage()
{
    delete pGrfDlg;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SfxTabPage* SwGrfExtPage::Create( Window *pParent, const SfxItemSet &rSet )
{
    return new SwGrfExtPage( pParent, rSet );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwGrfExtPage::Reset(const SfxItemSet &rSet)
{
    const SfxPoolItem* pItem;
    USHORT nHtmlMode = ::GetHtmlMode((const SwDocShell*)SfxObjectShell::Current());
    bHtmlMode = nHtmlMode & HTMLMODE_ON ? TRUE : FALSE;

    if( SFX_ITEM_SET == rSet.GetItemState( FN_PARAM_GRF_CONNECT, TRUE, &pItem)
        && ((const SfxBoolItem *)pItem)->GetValue() )
    {
        aBrowseBT.Enable();
        aConnectED.SetReadOnly(FALSE);
    }

    ActivatePage(rSet);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwGrfExtPage::ActivatePage(const SfxItemSet& rSet)
{
    const SvxProtectItem& rProt = (const SvxProtectItem& )rSet.Get(RES_PROTECT);
    bProtCntnt = rProt.IsCntntProtected();

    const SfxPoolItem* pItem = 0;
    BOOL bEnable = FALSE;
    BOOL bEnableMirrorRB = FALSE;

    SfxItemState eState = rSet.GetItemState(RES_GRFATR_MIRRORGRF, TRUE, &pItem);
    if( SFX_ITEM_UNKNOWN != eState && !bProtCntnt && !bHtmlMode )
    {
        if( SFX_ITEM_SET != eState )
            pItem = &rSet.Get( RES_GRFATR_MIRRORGRF );

        bEnable = TRUE;

        USHORT eMirror = (GRFMIRROR) ((const SwMirrorGrf* )pItem)->GetValue();
        switch( eMirror )
        {
        case RES_DONT_MIRROR_GRF: break;
        case RES_MIRROR_GRF_VERT: aMirrorHorzBox.Check(TRUE); break;
        case RES_MIRROR_GRF_HOR:  aMirrorVertBox.Check(TRUE); break;
        case RES_MIRROR_GRF_BOTH: aMirrorHorzBox.Check(TRUE);
                                    aMirrorVertBox.Check(TRUE);
                                    break;
        }

        USHORT nPos = ((const SwMirrorGrf* )pItem)->IsGrfToggle() ? 1 : 0;
        nPos += (eMirror == RES_MIRROR_GRF_VERT || eMirror == RES_MIRROR_GRF_BOTH)
                 ? 2 : 0;

        bEnableMirrorRB = nPos != 0;

        switch (nPos)
        {
            case 1: // Auf linken bzw geraden Seiten spiegeln
                aLeftPagesRB.Check();
                aMirrorHorzBox.Check(TRUE);
                break;
            case 2: // Auf allen Seiten spiegeln
                aAllPagesRB.Check();
                break;
            case 3: // Auf rechten bzw ungeraden Seiten spiegeln
                aRightPagesRB.Check();
                break;
            default:
                aAllPagesRB.Check();
                break;
        }
    }

    if( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_GRAF_GRAPHIC, FALSE, &pItem ) )
    {
        const SvxBrushItem& rBrush = *(SvxBrushItem*)pItem;
        if( rBrush.GetGraphicLink() )
        {
            aGrfName = aNewGrfName = *rBrush.GetGraphicLink();
            aConnectED.SetText( aNewGrfName );
        }
        const Graphic* pGrf = rBrush.GetGraphic();
        if( pGrf )
            aBmpWin.SetGraphic( *pGrf );
    }

    aAllPagesRB .Enable(bEnableMirrorRB);
    aLeftPagesRB.Enable(bEnableMirrorRB);
    aRightPagesRB.Enable(bEnableMirrorRB);
    aMirrorHorzBox.Enable(bEnable);
    aMirrorVertBox.Enable(bEnable);
    aMirrorFrm.Enable(bEnable);

    aAllPagesRB .SaveValue();
    aLeftPagesRB.SaveValue();
    aRightPagesRB.SaveValue();
    aMirrorHorzBox.SaveValue();
    aMirrorVertBox.SaveValue();

    aBmpWin.MirrorHorz( aMirrorVertBox.IsChecked() );
    aBmpWin.MirrorVert( aMirrorHorzBox.IsChecked() );
    aBmpWin.Invalidate();
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

BOOL SwGrfExtPage::FillItemSet( SfxItemSet &rSet )
{
    BOOL bModified = FALSE;
    if ( aMirrorHorzBox.GetSavedValue() != aMirrorHorzBox.IsChecked() ||
         aMirrorVertBox.GetSavedValue() != aMirrorVertBox.IsChecked() ||
         aAllPagesRB .GetSavedValue() != aAllPagesRB .IsChecked() ||
         aLeftPagesRB.GetSavedValue() != aLeftPagesRB.IsChecked() ||
         aRightPagesRB.GetSavedValue() != aRightPagesRB.IsChecked())
    {
        bModified = TRUE;

        BOOL bHori = FALSE;

        if (aMirrorHorzBox.IsChecked() &&
                !aLeftPagesRB.IsChecked())
            bHori = TRUE;

        GRFMIRROR eMirror;
        eMirror = aMirrorVertBox.IsChecked() && bHori ?
                    RES_MIRROR_GRF_BOTH : bHori ?
                    RES_MIRROR_GRF_VERT : aMirrorVertBox.IsChecked() ?
                    RES_MIRROR_GRF_HOR  : RES_DONT_MIRROR_GRF;

        BOOL bMirror = !aAllPagesRB.IsChecked();
        SwMirrorGrf aMirror( eMirror );
        aMirror.SetGrfToggle(bMirror );
        rSet.Put( aMirror );
    }

    if( aGrfName != aNewGrfName || aConnectED.IsModified() )
    {
        bModified = TRUE;
        aGrfName = aConnectED.GetText();
        rSet.Put( SvxBrushItem( aGrfName, aFilterName, GPOS_LT,
                                SID_ATTR_GRAF_GRAPHIC ));
    }
    return bModified;
}
/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

int SwGrfExtPage::DeactivatePage(SfxItemSet *pSet)
{
    if( pSet )
        FillItemSet( *pSet );
    return TRUE;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwGrfExtPage, BrowseHdl, Button *, EMPTYARG )
{
    if(!pGrfDlg)
        pGrfDlg = new SvxImportGraphicDialog( this,
                            SW_RESSTR(STR_EDIT_GRF), ENABLE_STANDARD );
    pGrfDlg->SetPath( aConnectED.GetText(), FALSE, TRUE );

    if ( pGrfDlg->Execute() == RET_OK )
    {   // ausgewaehlten Filter merken
        aFilterName = pGrfDlg->GetCurFilter();
        aNewGrfName = INetURLObject::decode( pGrfDlg->GetPath(),
                                        INET_HEX_ESCAPE,
                                           INetURLObject::DECODE_WITH_CHARSET,
                                        RTL_TEXTENCODING_UTF8 );
        aConnectED.SetModifyFlag();
        aConnectED.SetText( aNewGrfName );
        //Spiegeln zuruecksetzen, da u. U. eine Bitmap
        //gegen eine andere Art von Grafik ausgetauscht worden ist,
        //die nicht gespiegelt werden kann.
        aMirrorVertBox.Check(FALSE);
        aMirrorHorzBox.Check(FALSE);
        aAllPagesRB .Enable(FALSE);
        aLeftPagesRB.Enable(FALSE);
        aRightPagesRB.Enable(FALSE);
        aBmpWin.MirrorHorz(FALSE);
        aBmpWin.MirrorVert(FALSE);
        BOOL bEnable = FALSE;
        Graphic* pGrf = pGrfDlg->GetGraphic();
        if(pGrf)
        {
            aBmpWin.SetGraphic(*pGrf);

            if( GRAPHIC_BITMAP      == pGrf->GetType() ||
                GRAPHIC_GDIMETAFILE == pGrf->GetType())
                bEnable = TRUE;
        }
        aMirrorVertBox.Enable(bEnable);
        aMirrorHorzBox.Enable(bEnable);
        aAllPagesRB .Enable(bEnable);
        aLeftPagesRB.Enable(bEnable);
        aRightPagesRB.Enable(bEnable);
    }
    return 0;
}
/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwGrfExtPage, MirrorHdl, CheckBox *, EMPTYARG )
{
    BOOL bHori = FALSE;
    BOOL bEnable = aMirrorHorzBox.IsChecked();

    aBmpWin.MirrorHorz( aMirrorVertBox.IsChecked() );
    aBmpWin.MirrorVert( bEnable );

    aAllPagesRB .Enable(bEnable);
    aLeftPagesRB.Enable(bEnable);
    aRightPagesRB.Enable(bEnable);

    if (!aAllPagesRB.IsChecked() && !aLeftPagesRB.IsChecked() && !aRightPagesRB.IsChecked())
        aAllPagesRB.Check();

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung: BeispielWindow
 --------------------------------------------------------------------*/

BmpWindow::BmpWindow(Window* pPar, USHORT nId,
                    const Graphic& rGraphic, const Bitmap& rBmp) :
    Window(pPar, SW_RES(nId)),
    aGraphic(rGraphic),
    aBmp(rBmp),
    bHorz(FALSE),
    bVert(FALSE),
    bGraphic(FALSE),
    bLeftAlign(FALSE)
{
}

void BmpWindow::Paint( const Rectangle& )
{
    Point aPntPos;
    Size  aPntSz( GetSizePixel() );
    Size  aGrfSize;
    if(bGraphic)
        aGrfSize = ::GetGraphicSizeTwip(aGraphic, this);
    else
        aGrfSize =  PixelToLogic(aBmp.GetSizePixel());

    // u.U. ist nichts gesetzt
    if(aGrfSize.Width() && aGrfSize.Height())
    {
        long nRelGrf = aGrfSize.Width() * 100L / aGrfSize.Height();
        long nRelWin = aPntSz.Width() * 100L / aPntSz.Height();
        if(nRelGrf < nRelWin)
        {
            const long nWidth = aPntSz.Width();
            aPntSz.Width() = aPntSz.Height() * nRelGrf /100;
            if(!bLeftAlign)
                aPntPos.X() += nWidth - aPntSz.Width() ;
        }

        if ( bHorz )
        {
            aPntPos.Y()     += aPntSz.Height();
            aPntPos.Y() --;
            aPntSz.Height() *= -1;
        }
        if ( bVert )
        {
            aPntPos.X()     += aPntSz.Width();
            aPntPos.X()--;
            aPntSz.Width()  *= -1;
        }
        if(bGraphic)
            aGraphic.Draw(this, aPntPos, aPntSz);
        else
            DrawBitmap( aPntPos, aPntSz, aBmp );
    }
}

BmpWindow::~BmpWindow()
{
}

/***************************************************************************
    Beschreibung:   URL und ImageMap an Rahmen einstellen
***************************************************************************/


SwFrmURLPage::SwFrmURLPage( Window *pParent, const SfxItemSet &rSet ) :
    SfxTabPage(pParent,     SW_RES(TP_FRM_URL), rSet),
    aHyperLinkGB    (this, SW_RES( GB_HYPERLINK )),
    aURLFT          (this, SW_RES( FT_URL    )),
    aURLED          (this, SW_RES( ED_URL    )),
    aNameFT         (this, SW_RES( FT_NAME   )),
    aNameED         (this, SW_RES( ED_NAME   )),
    aFrameFT        (this, SW_RES( FT_FRAME   )),
    aFrameCB        (this, SW_RES( CB_FRAME   )),
    aSearchPB       (this, SW_RES( PB_SEARCH  )),
    aImageGB        (this, SW_RES( GB_IMAGE   )),
    aServerCB       (this, SW_RES( CB_SERVER  )),
    aClientCB       (this, SW_RES( CB_CLIENT  ))
{
    FreeResource();
    aSearchPB.SetClickHdl(LINK(this, SwFrmURLPage, InsertFileHdl));
}

/***************************************************************************
    Beschreibung:
***************************************************************************/

SwFrmURLPage::~SwFrmURLPage()
{
}

/***************************************************************************
    Beschreibung:
***************************************************************************/

void SwFrmURLPage::Reset( const SfxItemSet &rSet )
{
    const SfxPoolItem* pItem;
    if ( SFX_ITEM_SET == rSet.GetItemState( SID_DOCFRAME, TRUE, &pItem))
    {
        TargetList* pList = new TargetList;
        ((const SfxFrameItem*)pItem)->GetFrame()->GetTargetList(*pList);
        USHORT nCount = (USHORT)pList->Count();
        if( nCount )
        {
            for ( USHORT i = 0; i < nCount; i++ )
            {
                aFrameCB.InsertEntry(*pList->GetObject(i));
            }
            for ( i = nCount; i; i-- )
            {
                delete pList->GetObject( i - 1 );
            }
        }
        delete pList;
    }

    if ( SFX_ITEM_SET == rSet.GetItemState( RES_URL, TRUE, &pItem ) )
    {
        const SwFmtURL* pFmtURL = (const SwFmtURL*)pItem;
        aURLED.SetText( INetURLObject::decode( pFmtURL->GetURL(),
                                        INET_HEX_ESCAPE,
                                           INetURLObject::DECODE_WITH_CHARSET,
                                        RTL_TEXTENCODING_UTF8 ));
        aNameED.SetText( pFmtURL->GetName());

        aClientCB.Enable( pFmtURL->GetMap() != 0 );
        aClientCB.Check ( pFmtURL->GetMap() != 0 );
        aServerCB.Check ( pFmtURL->IsServerMap() );

        aFrameCB.SetText(pFmtURL->GetTargetFrameName());
        aFrameCB.SaveValue();
    }
    else
        aClientCB.Enable( FALSE );

    aServerCB.SaveValue();
    aClientCB.SaveValue();
}



/***************************************************************************
    Beschreibung:
***************************************************************************/

BOOL SwFrmURLPage::FillItemSet(SfxItemSet &rSet)
{
    BOOL bModified = FALSE;
    const SwFmtURL* pOldURL = (SwFmtURL*)GetOldItem(rSet, RES_URL);
    SwFmtURL* pFmtURL;
    if(pOldURL)
        pFmtURL = (SwFmtURL*)pOldURL->Clone();
    else
        pFmtURL = new SwFmtURL();

    {
        String sText = aURLED.GetText();
        if( sText.Len() )
            sText = URIHelper::SmartRelToAbs( sText );

        if( pFmtURL->GetURL() != sText ||
            pFmtURL->GetName() != aNameED.GetText() ||
            aServerCB.IsChecked() != pFmtURL->IsServerMap() )
        {
            pFmtURL->SetURL( sText, aServerCB.IsChecked() );
            pFmtURL->SetName( aNameED.GetText() );
            bModified = TRUE;
        }
    }

    if(!aClientCB.IsChecked() && pFmtURL->GetMap() != 0)
    {
        pFmtURL->SetMap(0);
        bModified = TRUE;
    }

    if(pFmtURL->GetTargetFrameName() != aFrameCB.GetText())
    {
        pFmtURL->SetTargetFrameName(aFrameCB.GetText());
        bModified = TRUE;
    }
    rSet.Put(*pFmtURL);
    delete pFmtURL;
    return bModified;
}

/***************************************************************************
    Beschreibung:
***************************************************************************/

SfxTabPage* SwFrmURLPage::Create(Window *pParent, const SfxItemSet &rSet)
{
    return new SwFrmURLPage( pParent, rSet );
}

/***************************************************************************
    Beschreibung:
***************************************************************************/

IMPL_LINK( SwFrmURLPage, InsertFileHdl, PushButton *, pBtn )
{
    SfxFileDialog* pFileDlg = new SfxFileDialog(pBtn, WB_OPEN);
    pFileDlg->DisableSaveLastDirectory();
    pFileDlg->SetHelpId(HID_FILEDLG_CHARDLG);
    String sTemp(aURLED.GetText());
    if(sTemp.Len())
        pFileDlg->SetPath(sTemp);

    if(RET_OK == pFileDlg->Execute())
    {
        aURLED.SetText( URIHelper::SmartRelToAbs( pFileDlg->GetPath(), FALSE,
                                        INetURLObject::WAS_ENCODED,
                                        INetURLObject::DECODE_WITH_CHARSET ));
    }
    delete pFileDlg;

    return 0;
}

/*-----------------13.11.96 13.15-------------------

--------------------------------------------------*/

SwFrmAddPage::SwFrmAddPage(Window *pParent, const SfxItemSet &rSet ) :
    SfxTabPage(pParent,     SW_RES(TP_FRM_ADD), rSet),
    aNameFT            (this, SW_RES(FT_NAME)),
    aNameED            (this, SW_RES(ED_NAME)),
    aAltNameFT         (this, SW_RES(FT_ALT_NAME)),
    aAltNameED         (this, SW_RES(ED_ALT_NAME)),
    aPrevFT            (this, SW_RES(FT_PREV)),
    aPrevED            (this, SW_RES(ED_PREV)),
    aNextFT            (this, SW_RES(FT_NEXT)),
    aNextED            (this, SW_RES(ED_NEXT)),
    aNamesGB           (this, SW_RES(GB_NAME)),

    aProtectContentCB  (this, SW_RES(CB_PROTECT_CONTENT)),
    aProtectFrameCB    (this, SW_RES(CB_PROTECT_FRAME)),
    aProtectSizeCB     (this, SW_RES(CB_PROTECT_SIZE)),
    aProtectGB         (this, SW_RES(GB_PROTECT)),

    aEditInReadonlyCB  (this, SW_RES(CB_EDIT_IN_READONLY)),
    aPrintFrameCB      (this, SW_RES(CB_PRINT_FRAME)),
    aExtGB             (this, SW_RES(GB_EXT)),
    nDlgType(0),
    pWrtSh(0),
    bFormat(FALSE),
    bHtmlMode(FALSE)
{
    FreeResource();

}

/*-----------------13.11.96 13.15-------------------

--------------------------------------------------*/

SwFrmAddPage::~SwFrmAddPage()
{
}

/*-----------------13.11.96 13.15-------------------

--------------------------------------------------*/

SfxTabPage* SwFrmAddPage::Create(Window *pParent, const SfxItemSet &rSet)
{
    return new SwFrmAddPage(pParent, rSet);
}

/*-----------------13.11.96 13.14-------------------

--------------------------------------------------*/

void SwFrmAddPage::Reset(const SfxItemSet &rSet )
{
    const SfxPoolItem* pItem;
    USHORT nHtmlMode = ::GetHtmlMode((const SwDocShell*)SfxObjectShell::Current());
    bHtmlMode = nHtmlMode & HTMLMODE_ON ? TRUE : FALSE;
    if(bHtmlMode)
    {
        aProtectContentCB .Hide();
        aProtectFrameCB   .Hide();
        aProtectSizeCB    .Hide();
        aEditInReadonlyCB .Hide();
        aPrintFrameCB     .Hide();
        aExtGB            .Hide();
        aProtectGB.Hide();
    }
    if ( DLG_FRM_GRF == nDlgType || DLG_FRM_OLE == nDlgType )
        aEditInReadonlyCB.Hide();

    if(SFX_ITEM_SET == rSet.GetItemState(FN_SET_FRM_ALT_NAME, FALSE, &pItem))
    {
        aAltNameED.SetText(((const SfxStringItem*)pItem)->GetValue());
        aAltNameED.SaveValue();
    }

    if(!bFormat)
    {
        // Grafik einfuegen - Eigenschaften
        // bNew ist nicht gesetzt, deswegen ueber Selektion erkennen
        String aTmpName1;
        if(SFX_ITEM_SET == rSet.GetItemState(FN_SET_FRM_NAME, FALSE, &pItem))
        {
            aTmpName1 = ((const SfxStringItem*)pItem)->GetValue();
        }

        DBG_ASSERT(pWrtSh, "keine Shell?")
        if( bNew || !aTmpName1.Len() )

            switch( nDlgType )
            {
                case DLG_FRM_GRF:
                    aTmpName1 = pWrtSh->GetUniqueGrfName();
                    break;
                case DLG_FRM_OLE:
                    aTmpName1 = pWrtSh->GetUniqueOLEName();
                    break;
                default:
                    aTmpName1 = pWrtSh->GetUniqueFrameName();
                    break;
            }

        aNameED.SetText( aTmpName1 );
        aNameED.SaveValue();
    }
    else
    {
        aNameED.Enable( FALSE );
        aAltNameED.Enable(FALSE);
        aNameFT.Enable( FALSE );
        aAltNameFT.Enable(FALSE);
        aNamesGB.Enable(FALSE);
    }
    if(nDlgType == DLG_FRM_STD)
    {
        aAltNameFT.Hide();
        aAltNameED.Hide();
    }
    else
    {
        aNameED.SetModifyHdl(LINK(this, SwFrmAddPage, EditModifyHdl));
    }

    BOOL bNoPrev = TRUE, bNoNext = TRUE;
    if (!bNew)
    {
        const SwFrmFmt* pFmt = pWrtSh->GetFlyFrmFmt();

        if (pFmt)
        {
            const SwFmtChain &rChain = pFmt->GetChain();
            const SwFlyFrmFmt* pFlyFmt;

            if ((pFlyFmt = rChain.GetPrev()) != 0)
            {
                aPrevED.SetText(pFlyFmt->GetName());
                bNoPrev = FALSE;
            }

            if ((pFlyFmt = rChain.GetNext()) != 0)
            {
                aNextED.SetText(pFlyFmt->GetName());
                bNoNext = FALSE;
            }
        }
    }

    if (bNoPrev)
    {
        aPrevFT.Disable();
        aPrevED.Disable();
    }
    if (bNoNext)
    {
        aNextFT.Disable();
        aNextED.Disable();
    }

    // Pos Protected
    const SvxProtectItem& rProt = (const SvxProtectItem& )rSet.Get(RES_PROTECT);
    aProtectFrameCB.Check(rProt.IsPosProtected());
    aProtectContentCB.Check(rProt.IsCntntProtected());
    aProtectSizeCB.Check(rProt.IsSizeProtected());

    const SwFmtEditInReadonly& rEdit = (const SwFmtEditInReadonly& )rSet.Get(RES_EDIT_IN_READONLY);
    aEditInReadonlyCB.Check(rEdit.GetValue());          aEditInReadonlyCB.SaveValue();

    // drucken
    const SvxPrintItem& rPrt = (const SvxPrintItem&)rSet.Get(RES_PRINT);
    aPrintFrameCB.Check(rPrt.GetValue());               aPrintFrameCB.SaveValue();
}

/*-----------------13.11.96 13.20-------------------

--------------------------------------------------*/

BOOL SwFrmAddPage::FillItemSet(SfxItemSet &rSet)
{
    BOOL bRet = FALSE;
    if (aNameED.GetText() != aNameED.GetSavedValue())
        bRet |= 0 != rSet.Put(SfxStringItem(FN_SET_FRM_NAME, aNameED.GetText()));
    if (aAltNameED.GetText()  != aAltNameED.GetSavedValue())
        bRet |= 0 != rSet.Put(SfxStringItem(FN_SET_FRM_ALT_NAME, aAltNameED.GetText()));

    const SfxPoolItem* pOldItem;
    SvxProtectItem aProt ( (const SvxProtectItem& )GetItemSet().Get(RES_PROTECT) );
    aProt.SetCntntProtect( aProtectContentCB.IsChecked() );
    aProt.SetSizeProtect ( aProtectSizeCB.IsChecked() );
    aProt.SetPosProtect  ( aProtectFrameCB.IsChecked() );
    if ( 0 == (pOldItem = GetOldItem(rSet, FN_SET_PROTECT)) ||
                aProt != *pOldItem )
        bRet |= 0 != rSet.Put( aProt);

    BOOL bChecked;
    if ( (bChecked = aEditInReadonlyCB.IsChecked()) != aEditInReadonlyCB.GetSavedValue() )
        bRet |= 0 != rSet.Put( SwFmtEditInReadonly( RES_EDIT_IN_READONLY, bChecked));

    if ( (bChecked = aPrintFrameCB.IsChecked()) != aPrintFrameCB.GetSavedValue() )
        bRet |= 0 != rSet.Put( SvxPrintItem( RES_PRINT, bChecked));

    return bRet;
}

/*-----------------13.11.96 15.05-------------------

--------------------------------------------------*/

USHORT* SwFrmAddPage::GetRanges()
{
    return aAddPgRg;
}

/*-----------------13.11.96 16.12-------------------

--------------------------------------------------*/

IMPL_LINK(SwFrmAddPage, EditModifyHdl, Edit*, EMPTYARG)
{
    BOOL bEnable = 0 != aNameED.GetText().Len();
    aAltNameED.Enable(bEnable);
    aAltNameFT.Enable(bEnable);

    return 0;
}
/*--------------------------------------------------------------------
   $Log: not supported by cvs2svn $
   Revision 1.255  2000/09/18 16:05:33  willem.vandorp
   OpenOffice header added.

   Revision 1.254  2000/08/25 14:09:49  jp
   Graphic Crop-Attribut and TabPage exported to SVX

   Revision 1.253  2000/08/17 11:38:50  jp
   remove the SW graphicmanager and UI with decoded URLs

   Revision 1.252  2000/06/26 13:13:31  os
   INetURLObject::SmartRelToAbs removed

   Revision 1.251  2000/05/10 14:05:18  os
   #75737# ReadioButtons used for hori mirror type

   Revision 1.250  2000/04/26 14:49:17  os
   GetName() returns const String&

   Revision 1.249  2000/04/19 12:56:34  os
   include sfx2/filedlg.hxx removed

   Revision 1.248  2000/04/18 15:14:56  os
   UNICODE

   Revision 1.247  2000/02/11 14:47:20  hr
   #70473# changes for unicode ( patched by automated patchtool )

   Revision 1.246  2000/01/24 12:45:28  os
   #72153# call SfxFileDialog::DisableSaveLastDirectory

   Revision 1.245  1999/11/23 13:18:55  os
   #69479# relative/fixed ratio handling corrected

   Revision 1.244  1999/06/21 11:30:30  OS
   #64885# width/height matching corrected


      Rev 1.243   21 Jun 1999 13:30:30   OS
   #64885# width/height matching corrected

      Rev 1.242   09 Jun 1999 10:48:10   OS
   #66733# CropPage: reset relative values

      Rev 1.241   09 Apr 1999 12:17:24   OS
   #64438# Grenzwerte fuer L+R richtig berechnen

--------------------------------------------------*/
diff --git a/sw/source/ui/frmdlg/frmpage.hrc b/sw/source/ui/frmdlg/frmpage.hrc
new file mode 100644
index 0000000..baaa5df
--- /dev/null
+++ b/sw/source/ui/frmdlg/frmpage.hrc
@@ -0,0 +1,137 @@
/*************************************************************************
 *
 *  $RCSfile: frmpage.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:37 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#define WN_BSP                  21
#define FT_BSP                  22
#define RB_ANCHOR_TYPE          23
#define LB_ANCHOR_TYPE          24
#define RB_ANCHOR_CHAR          25
#define GB_TYPE                 26
#define FT_WIDTH                27
#define ED_WIDTH                28
#define FT_HEIGHT               29
#define ED_HEIGHT               30
#define CB_AUTOHEIGHT           31
#define GB_SIZE                 32
#define FT_HORIZONTAL           33
#define DLB_HORIZONTAL          34
#define FT_AT_HORZ_POS          35
#define ED_AT_HORZ_POS          36
#define FT_HORI_RELATION        1
#define LB_HORI_RELATION        2
#define CB_MIRROR               37
#define FT_VERTICAL             38
#define DLB_VERTICAL            39
#define FT_AT_VERT_POS          40
#define ED_AT_VERT_POS          41
#define FT_VERT_RELATION        3
#define LB_VERT_RELATION        4
#define GB_POSITION             43
#define BT_REALSIZE             44
#define BT_MANUAL               45

#define CB_HOR                  46
#define CB_VERT                 47
//#define LB_MIRROR_PAGES           49
//#define FT_MIRROR_PAGES           50
#define GB_MIRROR               51
#define WN_BMP                  52
#define PB_BROWSE               53
#define ED_CONNECT              54
#define GB_CONNECT              55
#define FT_CONNECT              57
#define FT_URL                  58
#define ED_URL                  59

#define BMP_EXAMPLE             62
#define RB_MIRROR_ALL_PAGES     63
#define RB_MIRROR_LEFT_PAGES    64
#define RB_MIRROR_RIGHT_PAGES   65

#define GB_HYPERLINK            94
#define FT_FRAME                95
#define CB_FRAME                96
#define GB_IMAGE                97
#define CB_SERVER               98
#define CB_CLIENT               99

#define CB_REL_WIDTH            100
#define CB_REL_HEIGHT           101
#define CB_FIXEDRATIO           102
#define PB_SEARCH               103

#define CB_ANCHOR_ONLY          103

#define FT_NAME                 110
#define ED_NAME                 111
#define FT_ALT_NAME             112
#define ED_ALT_NAME             113
#define FT_PREV                 114
#define ED_PREV                 115
#define FT_NEXT                 116
#define ED_NEXT                 117
#define GB_NAME                 118
#define CB_PROTECT_CONTENT      119
#define CB_PROTECT_FRAME        120
#define CB_PROTECT_SIZE         121
#define GB_PROTECT              122
#define CB_EDIT_IN_READONLY     123
#define CB_PRINT_FRAME          124
#define GB_EXT                  125
diff --git a/sw/source/ui/frmdlg/frmpage.src b/sw/source/ui/frmdlg/frmpage.src
new file mode 100644
index 0000000..f29299a
--- /dev/null
+++ b/sw/source/ui/frmdlg/frmpage.src
@@ -0,0 +1,2707 @@
/*************************************************************************
 *
 *  $RCSfile: frmpage.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:38 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "frmui.hrc"
#include "frmpage.hrc"
#include "globals.hrc"
#include "helpid.h"
#include "svx/dialogs.hrc"

TabDialog DLG_FRM_STD
{
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Text = "Rahmen" ;
    Text [ ENGLISH ] = "Frame" ;
    Text [ norwegian ] = "Ramme" ;
    Text [ italian ] = "Cornice" ;
    Text [ portuguese_brazilian ] = "Moldura" ;
    Text [ portuguese ] = "Moldura" ;
    Text [ finnish ] = "Kehys" ;
    Text [ danish ] = "Ramme" ;
    Text [ french ] = "Cadre" ;
    Text [ swedish ] = "Ram" ;
    Text [ dutch ] = "Kader" ;
    Text [ spanish ] = "Marco" ;
    Text [ english_us ] = "Frame" ;
    Moveable = TRUE ;
    TabControl 1
    {
        OutputSize = TRUE ;
        PageList =
        {
            PageItem
            {
                Identifier = TP_FRM_STD ;
                PageResID = TP_FRM_STD ;
                Text = "Typ" ;
                Text [ ENGLISH ] = "Type" ;
                Text [ norwegian ] = "Type" ;
                Text [ italian ] = "Tipo" ;
                Text [ portuguese_brazilian ] = "Tipo" ;
                Text [ portuguese ] = "Tipo" ;
                Text [ finnish ] = "Laji" ;
                Text [ danish ] = "Type" ;
                Text [ french ] = "Type" ;
                Text [ swedish ] = "Typ" ;
                Text [ dutch ] = "Type" ;
                Text [ spanish ] = "Tipo" ;
                Text [ english_us ] = "Type" ;
                Text[ chinese_simplified ] = "ÀàÐÍ";
                Text[ russian ] = "Òèï";
                Text[ polish ] = "Typ";
                Text[ japanese ] = "Ží—Þ";
                Text[ chinese_traditional ] = "Ãþ«¬";
                Text[ arabic ] = "ÇáäæÚ";
                Text[ greek ] = "Ôýðïò";
                Text[ korean ] = "ÇüÅÂ";
                Text[ turkish ] = "Tip";
            };
            PageItem
            {
                Identifier = TP_FRM_ADD ;
                PageResID = TP_FRM_ADD ;
                Text = "Zusätze" ;
                Text [ ENGLISH ] = "Additions" ;
                Text [ english_us ] = "Options" ;
                Text [ italian ] = "Extra" ;
                Text [ spanish ] = "Opciones" ;
                Text [ french ] = "Options" ;
                Text [ dutch ] = "Overige" ;
                Text [ swedish ] = "Tillägg" ;
                Text [ danish ] = "Supplerende" ;
                Text [ portuguese_brazilian ] = "Zusätze" ;
                Text [ portuguese ] = "Opções" ;
                Text[ chinese_simplified ] = "ÆäËû";
                Text[ russian ] = "Ïàðàìåòðû";
                Text[ polish ] = "Dodatki";
                Text[ japanese ] = "µÌß¼®Ý";
                Text[ chinese_traditional ] = "¨ä¥L";
                Text[ arabic ] = "ÎíÇÑÇÊ";
                Text[ greek ] = "Ðñüóèåôá";
                Text[ korean ] = "¿É¼Ç";
                Text[ turkish ] = "Seçenekler";
            };
            PageItem
            {
                Identifier = TP_FRM_WRAP ;
                PageResID = TP_FRM_WRAP ;
                Text = "Umlauf" ;
                Text [ ENGLISH ] = "Wrap" ;
                Text [ norwegian ] = "Wrap" ;
                Text [ italian ] = "Scorrimento" ;
                Text [ portuguese_brazilian ] = "Circundamento" ;
                Text [ portuguese ] = "Ajuste" ;
                Text [ finnish ] = "Kierrätys" ;
                Text [ danish ] = "Ombrydning" ;
                Text [ french ] = "Adaptation du texte" ;
                Text [ swedish ] = "Textanpassning" ;
                Text [ dutch ] = "Om beeld" ;
                Text [ spanish ] = "Ajuste" ;
                Text [ english_us ] = "Wrap" ;
                Text[ chinese_simplified ] = "»·ÈÆ";
                Text[ russian ] = "Îáòåêàíèå";
                Text[ polish ] = "Obieg tekstu";
                Text[ japanese ] = "Ü‚è•Ô‚µ";
                Text[ chinese_traditional ] = "´«¦æ";
                Text[ arabic ] = "ÇáÊÝÇÝ";
                Text[ greek ] = "Áíáäßðëùóç";
                Text[ korean ] = "¼øÈ¯";
                Text[ turkish ] = "Metin daðýlýmý";
            };
            PageItem
            {
                Identifier = TP_FRM_URL ;
                PageResID = TP_FRM_URL ;
                Text = "Hyperlink" ;
                Text [ ENGLISH ] = "Hyperlink" ;
                Text [ english_us ] = "Hyperlink" ;
                Text [ italian ] = "Hyperlink" ;
                Text [ spanish ] = "Hiperenlace" ;
                Text [ french ] = "Hyperlien" ;
                Text [ dutch ] = "Hyperlink" ;
                Text [ swedish ] = "Hyperlänk" ;
                Text [ danish ] = "Hyperlink" ;
                Text [ portuguese_brazilian ] = "Hyperlink" ;
                Text [ portuguese ] = "Hiperligação" ;
                Text[ chinese_simplified ] = "³¬Á´½Ó";
                Text[ russian ] = "Ãèïåðññûëêà";
                Text[ polish ] = "Hiper³¹cze";
                Text[ japanese ] = "ʲÊß°ØÝ¸";
                Text[ chinese_traditional ] = "¶W³sµ²";
                Text[ arabic ] = "ÇÑÊÈÇØ ÊÔÚÈí";
                Text[ greek ] = "Õðåñ-óýíäåóç";
                Text[ korean ] = "ÇÏÀÌÆÛ¸µÅ©";
                Text[ turkish ] = "Hyperlink";
            };
            PageItem
            {
                Identifier = TP_BORDER ;
                PageResID = TP_BORDER ;
                Text = "Umrandung" ;
                Text [ ENGLISH ] = "Border" ;
                Text [ norwegian ] = "Border" ;
                Text [ italian ] = "Bordo" ;
                Text [ portuguese_brazilian ] = "Borda" ;
                Text [ portuguese ] = "Contornos" ;
                Text [ spanish ] = "Borde" ;
                Text [ finnish ] = "Reunaviiva" ;
                Text [ danish ] = "Ramme" ;
                Text [ french ] = "Bordure" ;
                Text [ swedish ] = "Inramning" ;
                Text [ dutch ] = "Omranding" ;
                Text [ english_us ] = "Borders" ;
                Text[ chinese_simplified ] = "±ß¿ò";
                Text[ russian ] = "Îáðàìëåíèå";
                Text[ polish ] = "Obramowanie";
                Text[ japanese ] = "ŠO˜g";
                Text[ chinese_traditional ] = "Ã䮨";
                Text[ arabic ] = "ÇáÍÏæÏ";
                Text[ greek ] = "Ðåñßãñáììá";
                Text[ korean ] = "¿Ü°û¼±";
                Text[ turkish ] = "Kenarlýk";
            };
            PageItem
            {
                Identifier = TP_BACKGROUND ;
                PageResID = TP_BACKGROUND ;
                Text = "Hintergrund" ;
                Text [ ENGLISH ] = "Background" ;
                Text [ norwegian ] = "Background" ;
                Text [ italian ] = "Sfondo" ;
                Text [ portuguese_brazilian ] = "Fundo" ;
                Text [ portuguese ] = "Plano de fundo" ;
                Text [ finnish ] = "Tausta" ;
                Text [ danish ] = "Baggrund" ;
                Text [ french ] = "Arrière-plan" ;
                Text [ swedish ] = "Bakgrund" ;
                Text [ dutch ] = "Achtergrond" ;
                Text [ spanish ] = "Fondo" ;
                Text [ english_us ] = "Background" ;
                Text[ chinese_simplified ] = "±³¾°";
                Text[ russian ] = "Ôîí";
                Text[ polish ] = "T³o";
                Text[ japanese ] = "”wŒi";
                Text[ chinese_traditional ] = "­I´º";
                Text[ arabic ] = "ÇáÎáÝíÉ";
                Text[ greek ] = "Öüíôï";
                Text[ korean ] = "¹è°æ";
                Text[ turkish ] = "Artalan";
            };
            PageItem
            {
                Identifier = TP_COLUMN ;
                PageResID = TP_COLUMN ;
                Text = "Spalten" ;
                Text [ ENGLISH ] = "Columns" ;
                Text [ norwegian ] = "Kolonner" ;
                Text [ italian ] = "Colonne" ;
                Text [ portuguese_brazilian ] = "Colunas" ;
                Text [ portuguese ] = "Colunas" ;
                Text [ finnish ] = "Sarakkeet" ;
                Text [ danish ] = "Kolonner" ;
                Text [ french ] = "Colonnes" ;
                Text [ swedish ] = "Kolumner" ;
                Text [ dutch ] = "Kolommen" ;
                Text [ spanish ] = "Columnas" ;
                Text [ english_us ] = "Columns" ;
                Text[ chinese_simplified ] = "À¸";
                Text[ russian ] = "Êîëîíêè";
                Text[ polish ] = "Kolumny";
                Text[ japanese ] = "—ñ";
                Text[ chinese_traditional ] = "Äæ";
                Text[ arabic ] = "ÃÚãÏÉ";
                Text[ greek ] = "ÓôÞëåò";
                Text[ korean ] = "¿­";
                Text[ turkish ] = "Sütun";
            };
            PageItem
            {
                Identifier = TP_MACRO_ASSIGN ;
                Text = "Makro" ;
                Text [ ENGLISH ] = "Macro" ;
                Text [ english_us ] = "Macro" ;
                Text [ italian ] = "Macro" ;
                Text [ spanish ] = "Macro" ;
                Text [ french ] = "Macro" ;
                Text [ dutch ] = "Macro" ;
                Text [ swedish ] = "Makro" ;
                Text [ danish ] = "Makro" ;
                Text [ portuguese_brazilian ] = "Makro" ;
                Text [ portuguese ] = "Macro" ;
                Text[ chinese_simplified ] = "ºê";
                Text[ russian ] = "Ìàêðîñ";
                Text[ polish ] = "Makro";
                Text[ japanese ] = "ϸÛ";
                Text[ chinese_traditional ] = "¥¨¶°";
                Text[ arabic ] = "ãÇßÑæ";
                Text[ greek ] = "ÌáêñïåíôïëÞ";
                Text[ korean ] = "¸ÅÅ©·Î";
                Text[ turkish ] = "Makro";
            };
        };
    };
    Text[ chinese_simplified ] = "¿ò";
    Text[ russian ] = "Ðàìêà";
    Text[ polish ] = "Ramka";
    Text[ japanese ] = "˜g";
    Text[ chinese_traditional ] = "¤å¦r¤è¶ô";
    Text[ arabic ] = "ÅØÇÑ";
    Text[ greek ] = "Ðåñßãñáììá";
    Text[ korean ] = "ÇÁ·¹ÀÓ";
    Text[ turkish ] = "Çerçeve";
};
TabDialog DLG_FRM_GRF
{
    SVLook = TRUE ;
    Text = "Grafik" ;
    Text [ ENGLISH ] = "Graphic" ;
    Text [ norwegian ] = "Graphic" ;
    Text [ italian ] = "Immagine" ;
    Text [ portuguese_brazilian ] = "Gráfico" ;
    Text [ portuguese ] = "Imagens" ;
    Text [ finnish ] = "Kuva" ;
    Text [ danish ] = "Billeder" ;
    Text [ french ] = "Image" ;
    Text [ swedish ] = "Grafik" ;
    Text [ dutch ] = "Afbeelding" ;
    Text [ spanish ] = "Imagen" ;
    Text [ english_us ] = "Graphics" ;
    Moveable = TRUE ;
    TabControl 1
    {
        OutputSize = TRUE ;
        PageList =
        {
            PageItem
            {
                Identifier = TP_FRM_STD ;
                PageResID = TP_FRM_STD ;
                Text = "Typ" ;
                Text [ ENGLISH ] = "Type" ;
                Text [ norwegian ] = "Type" ;
                Text [ italian ] = "Tipo" ;
                Text [ portuguese_brazilian ] = "Tipo" ;
                Text [ portuguese ] = "Tipo" ;
                Text [ finnish ] = "Laji" ;
                Text [ danish ] = "Type" ;
                Text [ french ] = "Type" ;
                Text [ swedish ] = "Typ" ;
                Text [ dutch ] = "Type" ;
                Text [ spanish ] = "Tipo" ;
                Text [ english_us ] = "Type" ;
                Text[ chinese_simplified ] = "ÀàÐÍ";
                Text[ russian ] = "Òèï";
                Text[ polish ] = "Typ";
                Text[ japanese ] = "Ží—Þ";
                Text[ chinese_traditional ] = "Ãþ«¬";
                Text[ arabic ] = "ÇáäæÚ";
                Text[ greek ] = "Ôýðïò";
                Text[ korean ] = "ÇüÅÂ";
                Text[ turkish ] = "Tip";
            };
            PageItem
            {
                Identifier = TP_FRM_ADD ;
                PageResID = TP_FRM_ADD ;
                Text = "Zusätze" ;
                Text [ ENGLISH ] = "Additions" ;
                Text [ english_us ] = "Options" ;
                Text [ italian ] = "Extra" ;
                Text [ spanish ] = "Opciones" ;
                Text [ french ] = "Options" ;
                Text [ dutch ] = "Overige" ;
                Text [ swedish ] = "Tillägg" ;
                Text [ danish ] = "Supplerende" ;
                Text [ portuguese_brazilian ] = "Zusätze" ;
                Text [ portuguese ] = "Opções" ;
                Text[ chinese_simplified ] = "ÆäËû";
                Text[ russian ] = "Ïàðàìåòðû";
                Text[ polish ] = "Dodatki";
                Text[ japanese ] = "µÌß¼®Ý";
                Text[ chinese_traditional ] = "¨ä¥L";
                Text[ arabic ] = "ÎíÇÑÇÊ";
                Text[ greek ] = "Ðñüóèåôá";
                Text[ korean ] = "¿É¼Ç";
                Text[ turkish ] = "Seçenekler";
            };
            PageItem
            {
                Identifier = TP_FRM_WRAP ;
                PageResID = TP_FRM_WRAP ;
                Text = "Umlauf" ;
                Text [ ENGLISH ] = "Wrap" ;
                Text [ norwegian ] = "Wrap" ;
                Text [ italian ] = "Scorrimento" ;
                Text [ portuguese_brazilian ] = "Circundamento" ;
                Text [ portuguese ] = "Ajuste" ;
                Text [ finnish ] = "Kierrätys" ;
                Text [ danish ] = "Ombrydning" ;
                Text [ french ] = "Adaptation du texte" ;
                Text [ swedish ] = "Textanpassning" ;
                Text [ dutch ] = "Om beeld" ;
                Text [ spanish ] = "Ajuste" ;
                Text [ english_us ] = "Wrap" ;
                Text[ chinese_simplified ] = "»·ÈÆ";
                Text[ russian ] = "Îáòåêàíèå";
                Text[ polish ] = "Obieg tekstu";
                Text[ japanese ] = "Ü‚è•Ô‚µ";
                Text[ chinese_traditional ] = "´«¦æ";
                Text[ arabic ] = "ÇáÊÝÇÝ";
                Text[ greek ] = "Áíáäßðëùóç";
                Text[ korean ] = "¼øÈ¯";
                Text[ turkish ] = "Metin daðýlýmý";
            };
            PageItem
            {
                Identifier = TP_FRM_URL ;
                PageResID = TP_FRM_URL ;
                Text = "Hyperlink" ;
                Text [ ENGLISH ] = "Hyperlink" ;
                Text [ english_us ] = "Hyperlink" ;
                Text [ italian ] = "Hyperlink" ;
                Text [ spanish ] = "Hiperenlace" ;
                Text [ french ] = "Hyperlien" ;
                Text [ dutch ] = "Hyperlink" ;
                Text [ swedish ] = "Hyperlänk" ;
                Text [ danish ] = "Hyperlink" ;
                Text [ portuguese_brazilian ] = "Hyperlink" ;
                Text [ portuguese ] = "Hiperligação" ;
                Text[ chinese_simplified ] = "³¬Á´½Ó";
                Text[ russian ] = "Ãèïåðññûëêà";
                Text[ polish ] = "Hiper³¹cze";
                Text[ japanese ] = "ʲÊß°ØÝ¸";
                Text[ chinese_traditional ] = "¶W³sµ²";
                Text[ arabic ] = "ÇÑÊÈÇØ ÊÔÚÈí";
                Text[ greek ] = "Õðåñ-óýíäåóç";
                Text[ korean ] = "ÇÏÀÌÆÛ¸µÅ©";
                Text[ turkish ] = "Hyperlink";
            };
            PageItem
            {
                Identifier = TP_GRF_EXT ;
                PageResID = TP_GRF_EXT ;
                Text = "Grafik" ;
                Text [ ENGLISH ] = "Graphic" ;
                Text [ norwegian ] = "Graphic" ;
                Text [ italian ] = "Immagine" ;
                Text [ portuguese_brazilian ] = "Gráfico" ;
                Text [ portuguese ] = "Imagem" ;
                Text [ finnish ] = "Kuva" ;
                Text [ danish ] = "Grafik" ;
                Text [ french ] = "Image" ;
                Text [ swedish ] = "Grafik" ;
                Text [ dutch ] = "Afbeelding" ;
                Text [ spanish ] = "Imagen" ;
                Text [ english_us ] = "Graphics" ;
                Text[ chinese_simplified ] = "ͼÐÎ";
                Text[ russian ] = "Ðèñóíîê";
                Text[ polish ] = "Grafika";
                Text[ japanese ] = "¸Þ×̨¯¸½";
                Text[ chinese_traditional ] = "¹Ï¤ù";
                Text[ arabic ] = "ÕæÑÉ";
                Text[ greek ] = "Ãñáöéêü";
                Text[ korean ] = "±×·¡ÇÈ";
                Text[ turkish ] = "Grafik";
            };
            PageItem
            {
                Identifier = RID_SVXPAGE_GRFCROP;
                PageResID = RID_SVXPAGE_GRFCROP;
                Text = "Zuschneiden" ;
                Text [ ENGLISH ] = "Crop" ;
                Text [ dutch ] = "Knippen" ;
                Text [ english_us ] = "Crop" ;
                Text [ italian ] = "Taglia" ;
                Text [ spanish ] = "Recortar" ;
                Text [ french ] = "Recadrer" ;
                Text [ swedish ] = "Skära till" ;
                Text [ danish ] = "Beskær" ;
                Text [ portuguese_brazilian ] = "Zuschneiden" ;
                Text [ portuguese ] = "Recortar" ;
                Text[ chinese_simplified ] = "²Ã¼ô";
                Text[ russian ] = "Îáðåçàòü";
                Text[ polish ] = "Przytnij";
                Text[ japanese ] = "ÄØÐݸÞ";
                Text[ chinese_traditional ] = "°Å¤U";
                Text[ arabic ] = "ÇÞÊÕÇÕ";
                Text[ greek ] = "ÐñïóáñìïãÞ";
                Text[ korean ] = "ÀÚ¸£±â";
                Text[ turkish ] = "Kýrpma";
            };
            PageItem
            {
                Identifier = TP_BORDER ;
                PageResID = TP_BORDER ;
                Text = "Umrandung" ;
                Text [ ENGLISH ] = "Border" ;
                Text [ norwegian ] = "Border" ;
                Text [ italian ] = "Bordo" ;
                Text [ portuguese_brazilian ] = "Borda" ;
                Text [ portuguese ] = "Contornos" ;
                Text [ spanish ] = "Borde" ;
                Text [ finnish ] = "Reunaviiva" ;
                Text [ danish ] = "Ramme" ;
                Text [ french ] = "Bordure" ;
                Text [ swedish ] = "Inramning" ;
                Text [ dutch ] = "Omranding" ;
                Text [ english_us ] = "Borders" ;
                Text[ chinese_simplified ] = "±ß¿ò";
                Text[ russian ] = "Îáðàìëåíèå";
                Text[ polish ] = "Obramowanie";
                Text[ japanese ] = "ŠO˜g";
                Text[ chinese_traditional ] = "Ã䮨";
                Text[ arabic ] = "ÇáÍÏæÏ";
                Text[ greek ] = "Ðåñßãñáììá";
                Text[ korean ] = "¿Ü°û¼±";
                Text[ turkish ] = "Kenarlýk";
            };
            PageItem
            {
                Identifier = TP_BACKGROUND ;
                PageResID = TP_BACKGROUND ;
                Text = "Hintergrund" ;
                Text [ ENGLISH ] = "Background" ;
                Text [ norwegian ] = "Background" ;
                Text [ italian ] = "Sfondo" ;
                Text [ portuguese_brazilian ] = "Fundo" ;
                Text [ portuguese ] = "Plano de fundo" ;
                Text [ finnish ] = "Tausta" ;
                Text [ danish ] = "Baggrund" ;
                Text [ french ] = "Arrière-plan" ;
                Text [ swedish ] = "Bakgrund" ;
                Text [ dutch ] = "Achtergrond" ;
                Text [ spanish ] = "Fondo" ;
                Text [ english_us ] = "Background" ;
                Text[ chinese_simplified ] = "±³¾°";
                Text[ russian ] = "Ôîí";
                Text[ polish ] = "T³o";
                Text[ japanese ] = "”wŒi";
                Text[ chinese_traditional ] = "­I´º";
                Text[ arabic ] = "ÇáÎáÝíÉ";
                Text[ greek ] = "Öüíôï";
                Text[ korean ] = "¹è°æ";
                Text[ turkish ] = "Artalan";
            };
            PageItem
            {
                Identifier = TP_MACRO_ASSIGN ;
                Text = "Makro" ;
                Text [ ENGLISH ] = "Macro" ;
                Text [ english_us ] = "Macro" ;
                Text [ italian ] = "Macro" ;
                Text [ spanish ] = "Macro" ;
                Text [ french ] = "Macro" ;
                Text [ dutch ] = "Macro" ;
                Text [ swedish ] = "Makro" ;
                Text [ danish ] = "Makro" ;
                Text [ portuguese_brazilian ] = "Makro" ;
                Text [ portuguese ] = "Macro" ;
                Text[ chinese_simplified ] = "ºê";
                Text[ russian ] = "Ìàêðîñ";
                Text[ polish ] = "Makro";
                Text[ japanese ] = "ϸÛ";
                Text[ chinese_traditional ] = "¥¨¶°";
                Text[ arabic ] = "ãÇßÑæ";
                Text[ greek ] = "ÌáêñïåíôïëÞ";
                Text[ korean ] = "¸ÅÅ©·Î";
                Text[ turkish ] = "Makro";
            };
        };
    };
    Text[ chinese_simplified ] = "ͼÐÎ";
    Text[ russian ] = "Ðèñóíîê";
    Text[ polish ] = "Grafika";
    Text[ japanese ] = "}";
    Text[ chinese_traditional ] = "¹Ï¤ù";
    Text[ arabic ] = "ÕæÑ";
    Text[ greek ] = "Ãñáöéêü";
    Text[ korean ] = "±×·¡ÇÈ";
    Text[ turkish ] = "Grafik";
};
TabDialog DLG_FRM_OLE
{
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Text = "Objekt" ;
    Text [ ENGLISH ] = "Object" ;
    Text [ norwegian ] = "Object" ;
    Text [ italian ] = "Oggetto" ;
    Text [ portuguese_brazilian ] = "Objeto" ;
    Text [ portuguese ] = "Objecto" ;
    Text [ finnish ] = "Objekti" ;
    Text [ danish ] = "Objekt" ;
    Text [ french ] = "Objet" ;
    Text [ swedish ] = "Objekt" ;
    Text [ dutch ] = "Object" ;
    Text [ spanish ] = "Objeto" ;
    Text [ english_us ] = "Object" ;
    Moveable = TRUE ;
    TabControl 1
    {
        OutputSize = TRUE ;
        PageList =
        {
            PageItem
            {
                Identifier = TP_FRM_STD ;
                PageResID = TP_FRM_STD ;
                Text = "Typ" ;
                Text [ ENGLISH ] = "Type" ;
                Text [ norwegian ] = "Type" ;
                Text [ italian ] = "Tipo" ;
                Text [ portuguese_brazilian ] = "Tipo" ;
                Text [ portuguese ] = "Tipo" ;
                Text [ finnish ] = "Laji" ;
                Text [ danish ] = "Type" ;
                Text [ french ] = "Type" ;
                Text [ swedish ] = "Typ" ;
                Text [ dutch ] = "Type" ;
                Text [ spanish ] = "Tipo" ;
                Text [ english_us ] = "Type" ;
                Text[ chinese_simplified ] = "ÀàÐÍ";
                Text[ russian ] = "Òèï";
                Text[ polish ] = "Typ";
                Text[ japanese ] = "Ží—Þ";
                Text[ chinese_traditional ] = "Ãþ«¬";
                Text[ arabic ] = "ÇáäæÚ";
                Text[ greek ] = "Ôýðïò";
                Text[ korean ] = "ÇüÅÂ";
                Text[ turkish ] = "Tip";
            };
            PageItem
            {
                Identifier = TP_FRM_ADD ;
                PageResID = TP_FRM_ADD ;
                Text = "Zusätze" ;
                Text [ ENGLISH ] = "Additions" ;
                Text [ english_us ] = "Options" ;
                Text [ italian ] = "Extra" ;
                Text [ spanish ] = "Opciones" ;
                Text [ french ] = "Options" ;
                Text [ dutch ] = "Overige" ;
                Text [ swedish ] = "Tillägg" ;
                Text [ danish ] = "Supplerende" ;
                Text [ portuguese_brazilian ] = "Zusätze" ;
                Text [ portuguese ] = "Opções" ;
                Text[ chinese_simplified ] = "ÆäËû";
                Text[ russian ] = "Ïàðàìåòðû";
                Text[ polish ] = "Dodatki";
                Text[ japanese ] = "µÌß¼®Ý";
                Text[ chinese_traditional ] = "¨ä¥L";
                Text[ arabic ] = "ÎíÇÑÇÊ";
                Text[ greek ] = "Ðñüóèåôá";
                Text[ korean ] = "¿É¼Ç";
                Text[ turkish ] = "Seçenekler";
            };
            PageItem
            {
                Identifier = TP_FRM_WRAP ;
                PageResID = TP_FRM_WRAP ;
                Text = "Umlauf" ;
                Text [ ENGLISH ] = "Wrap" ;
                Text [ norwegian ] = "Wrap" ;
                Text [ italian ] = "Scorrimento" ;
                Text [ portuguese_brazilian ] = "Circundamento" ;
                Text [ portuguese ] = "Ajuste" ;
                Text [ finnish ] = "Kierrätys" ;
                Text [ danish ] = "Ombrydning" ;
                Text [ french ] = "Adaptation du texte" ;
                Text [ swedish ] = "Textanpassning" ;
                Text [ dutch ] = "Om beeld" ;
                Text [ spanish ] = "Ajuste" ;
                Text [ english_us ] = "Wrap" ;
                Text[ chinese_simplified ] = "»·ÈÆ";
                Text[ russian ] = "Îáòåêàíèå";
                Text[ polish ] = "Obieg tekstu";
                Text[ japanese ] = "Ü‚è•Ô‚µ";
                Text[ chinese_traditional ] = "´«¦æ";
                Text[ arabic ] = "ÇáÊÝÇÝ";
                Text[ greek ] = "Áíáäßðëùóç";
                Text[ korean ] = "¼øÈ¯";
                Text[ turkish ] = "Metin daðýlýmý";
            };
            PageItem
            {
                Identifier = TP_FRM_URL ;
                PageResID = TP_FRM_URL ;
                Text = "Hyperlink" ;
                Text [ ENGLISH ] = "Hyperlink" ;
                Text [ english_us ] = "Hyperlink" ;
                Text [ italian ] = "Hyperlink" ;
                Text [ spanish ] = "Hiperenlace" ;
                Text [ french ] = "Hyperlien" ;
                Text [ dutch ] = "Hyperlink" ;
                Text [ swedish ] = "Hyperlänk" ;
                Text [ danish ] = "Hyperlink" ;
                Text [ portuguese_brazilian ] = "Hyperlink" ;
                Text [ portuguese ] = "Hiperligação" ;
                Text[ chinese_simplified ] = "³¬Á´½Ó";
                Text[ russian ] = "Ãèïåðññûëêà";
                Text[ polish ] = "Hiper³¹cze";
                Text[ japanese ] = "ʲÊß°ØÝ¸";
                Text[ chinese_traditional ] = "¶W³sµ²";
                Text[ arabic ] = "ÇÑÊÈÇØ ÊÔÚÈí";
                Text[ greek ] = "Õðåñ-óýíäåóç";
                Text[ korean ] = "ÇÏÀÌÆÛ¸µÅ©";
                Text[ turkish ] = "Hyperlink";
            };
            PageItem
            {
                Identifier = TP_BORDER ;
                PageResID = TP_BORDER ;
                Text = "Umrandung" ;
                Text [ ENGLISH ] = "Border" ;
                Text [ norwegian ] = "Border" ;
                Text [ italian ] = "Bordo" ;
                Text [ portuguese_brazilian ] = "Borda" ;
                Text [ portuguese ] = "Contornos" ;
                Text [ spanish ] = "Borde" ;
                Text [ finnish ] = "Reunaviiva" ;
                Text [ danish ] = "Ramme" ;
                Text [ french ] = "Bordure" ;
                Text [ swedish ] = "Inramning" ;
                Text [ dutch ] = "Omranding" ;
                Text [ english_us ] = "Borders" ;
                Text[ chinese_simplified ] = "±ß¿ò";
                Text[ russian ] = "Îáðàìëåíèå";
                Text[ polish ] = "Obramowanie";
                Text[ japanese ] = "ŠO˜g";
                Text[ chinese_traditional ] = "Ã䮨";
                Text[ arabic ] = "ÇáÍÏæÏ";
                Text[ greek ] = "Ðåñßãñáììá";
                Text[ korean ] = "¿Ü°û¼±";
                Text[ turkish ] = "Kenarlýk";
            };
            PageItem
            {
                Identifier = TP_BACKGROUND ;
                PageResID = TP_BACKGROUND ;
                Text = "Hintergrund" ;
                Text [ ENGLISH ] = "Background" ;
                Text [ norwegian ] = "Background" ;
                Text [ italian ] = "Sfondo" ;
                Text [ portuguese_brazilian ] = "Fundo" ;
                Text [ portuguese ] = "Plano de fundo" ;
                Text [ finnish ] = "Tausta" ;
                Text [ danish ] = "Baggrund" ;
                Text [ french ] = "Arrière-plan" ;
                Text [ swedish ] = "Bakgrund" ;
                Text [ dutch ] = "Achtergrond" ;
                Text [ spanish ] = "Fondo" ;
                Text [ english_us ] = "Background" ;
                Text[ chinese_simplified ] = "±³¾°";
                Text[ russian ] = "Ôîí";
                Text[ polish ] = "T³o";
                Text[ japanese ] = "”wŒi";
                Text[ chinese_traditional ] = "­I´º";
                Text[ arabic ] = "ÇáÎáÝíÉ";
                Text[ greek ] = "Öüíôï";
                Text[ korean ] = "¹è°æ";
                Text[ turkish ] = "Artalan";
            };
            /*
            PageItem  {
                Identifier = TP_COLUMN ;
                PageResID = TP_COLUMN;
                Text = "Spalten" ;
                Text[ ENGLISH ] = "Columns" ;
                Text[ norwegian ] = "Kolonner" ;
                Text[ italian ] = "Colonne" ;
                Text[ portuguese_brazilian] = "Colunas" ;
                Text[ portuguese ] = "Colunas" ;
                Text[ finnish ] = "Sarakkeet" ;
                Text[ danish ] = "Spalter" ;
                Text[ french ] = "Colonnes" ;
                Text[ swedish ] = "Kolumner" ;
                Text[ dutch ] = "Kolommen" ;
                Text[ spanish ] = "Columnas" ;
                Text[ english_us ] = "Columns" ;
            };
*/
            PageItem
            {
                Identifier = TP_MACRO_ASSIGN ;
                Text = "Makro" ;
                Text [ ENGLISH ] = "Macro" ;
                Text [ english_us ] = "Macro" ;
                Text [ italian ] = "Macro" ;
                Text [ spanish ] = "Macro" ;
                Text [ french ] = "Macro" ;
                Text [ dutch ] = "Macro" ;
                Text [ swedish ] = "Makro" ;
                Text [ danish ] = "Makro" ;
                Text [ portuguese_brazilian ] = "Makro" ;
                Text [ portuguese ] = "Macro" ;
                Text[ chinese_simplified ] = "ºê";
                Text[ russian ] = "Ìàêðîñ";
                Text[ polish ] = "Makro";
                Text[ japanese ] = "ϸÛ";
                Text[ chinese_traditional ] = "¥¨¶°";
                Text[ arabic ] = "ãÇßÑæ";
                Text[ greek ] = "ÌáêñïåíôïëÞ";
                Text[ korean ] = "¸ÅÅ©·Î";
                Text[ turkish ] = "Makro";
            };
        };
    };
    Text[ chinese_simplified ] = "¶ÔÏó";
    Text[ russian ] = "Îáúåêò";
    Text[ polish ] = "Obiekt";
    Text[ japanese ] = "µÌÞ¼Þª¸Ä";
    Text[ chinese_traditional ] = "ª«¥ó";
    Text[ arabic ] = "ßÇÆä";
    Text[ greek ] = "Áíôéêåßìåíï";
    Text[ korean ] = "°³Ã¼";
    Text[ turkish ] = "Nesne";
};
TabPage TP_FRM_STD
{
    HelpID = HID_FRM_STD ;
    SVLook = TRUE ;
    Pos = MAP_APPFONT ( 0 , 0 ) ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Hide = TRUE ;
    FixedText FT_WIDTH
    {
        Pos = MAP_APPFONT ( 12 , 16 ) ;
        Size = MAP_APPFONT ( 21 , 10 ) ;
        Left = TRUE ;
        Text = "~Breite" ;
        Text [ ENGLISH ] = "~Width" ;
        Text [ norwegian ] = "~Bredde" ;
        Text [ italian ] = "~Largh." ;
        Text [ portuguese_brazilian ] = "~Largura" ;
        Text [ portuguese ] = "~Largura" ;
        Text [ finnish ] = "~Leveys" ;
        Text [ danish ] = "Bredde" ;
        Text [ french ] = "~Larg." ;
        Text [ swedish ] = "~Bredd" ;
        Text [ dutch ] = "B~reedte" ;
        Text [ spanish ] = "A~ncho" ;
        Text [ english_us ] = "~Width" ;
        Text[ chinese_simplified ] = "¿í¶È(~W)";
        Text[ russian ] = "Øèðèíà";
        Text[ polish ] = "Szer.";
        Text[ japanese ] = "•(~W)";
        Text[ chinese_traditional ] = "¼e«×(~W)";
        Text[ arabic ] = "ÇáÚÑÖ";
        Text[ greek ] = "ÐëÜôïò";
        Text[ korean ] = "³Êºñ(~W)";
        Text[ turkish ] = "~Geniþlik";
    };
    MetricField ED_WIDTH
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 33 , 14 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        Text = "12,99" ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 5 ;
        Maximum = 9999 ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        First = 5 ;
        Last = 9999 ;
        SpinSize = 10 ;
    };
    CheckBox CB_REL_WIDTH
    {
        Pos = MAP_APPFONT ( 78 , 16 ) ;
        Size = MAP_APPFONT ( 35 , 10 ) ;
        TabStop = TRUE ;
        Text = "~Relativ" ;
        Text [ ENGLISH ] = "Relativ" ;
        Text [ dutch ] = "~Relatief" ;
        Text [ english_us ] = "Relat~ive" ;
        Text [ italian ] = "~Relativo" ;
        Text [ spanish ] = "R~elativo" ;
        Text [ french ] = "~Relatif" ;
        Text [ swedish ] = "~Relativ" ;
        Text [ danish ] = "Relativ" ;
        Text [ portuguese_brazilian ] = "~Relativ" ;
        Text [ portuguese ] = "~Relativo" ;
        Text[ chinese_simplified ] = "숦﵀(~V)";
        Text[ russian ] = "Îòíîñèò.";
        Text[ polish ] = "Wzglê~dny";
        Text[ japanese ] = "Š„‡(~V)";
        Text[ chinese_traditional ] = "¬Û¹ïªº(~V)";
        Text[ arabic ] = "äÓÈí";
        Text[ greek ] = "Ó÷åôéêÜ";
        Text[ korean ] = "ºñ·Ê(~I)";
        Text[ turkish ] = "~Göreceli";
    };
    FixedText FT_HEIGHT
    {
        Pos = MAP_APPFONT ( 12 , 31 ) ;
        Size = MAP_APPFONT ( 21 , 10 ) ;
        Left = TRUE ;
        Text = "Höh~e" ;
        Text [ ENGLISH ] = "H~eight" ;
        Text [ norwegian ] = "H~eight" ;
        Text [ italian ] = "Altezza" ;
        Text [ portuguese_brazilian ] = "A~ltura" ;
        Text [ portuguese ] = "A~ltura" ;
        Text [ finnish ] = "~Korkeus" ;
        Text [ danish ] = "Højde" ;
        Text [ french ] = "~Haut." ;
        Text [ swedish ] = "Höj~d" ;
        Text [ dutch ] = "H~oogte" ;
        Text [ spanish ] = "A~ltura" ;
        Text [ english_us ] = "~Height" ;
        Text[ chinese_simplified ] = "¸ß¶È(~H)";
        Text[ russian ] = "Âûñîòà";
        Text[ polish ] = "Wys.";
        Text[ japanese ] = "‚‚³(~H)";
        Text[ chinese_traditional ] = "°ª«×(~H)";
        Text[ arabic ] = "ÇáÇÑÊÝÇÚ";
        Text[ greek ] = "¾øïò";
        Text[ korean ] = "³ôÀÌ(~H)";
        Text[ turkish ] = "~Yüks.";
    };
    MetricField ED_HEIGHT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 33 , 29 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 5 ;
        Maximum = 9999 ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        First = 5 ;
        Last = 9999 ;
        SpinSize = 10 ;
    };
    CheckBox CB_REL_HEIGHT
    {
        Pos = MAP_APPFONT ( 78 , 31 ) ;
        Size = MAP_APPFONT ( 35 , 10 ) ;
        TabStop = TRUE ;
        Text = "Re~lativ" ;
        Text [ ENGLISH ] = "Relativ" ;
        Text [ dutch ] = "Re~latief" ;
        Text [ english_us ] = "Re~lative" ;
        Text [ italian ] = "Re~lativo" ;
        Text [ spanish ] = "Rela~tivo" ;
        Text [ french ] = "Re~latif" ;
        Text [ swedish ] = "Rel~ativ" ;
        Text [ danish ] = "Relativ" ;
        Text [ portuguese_brazilian ] = "Re~lativ" ;
        Text [ portuguese ] = "Relat~ivo" ;
        Text[ chinese_simplified ] = "숦﵀(~E)";
        Text[ russian ] = "Îòíîñèò.";
        Text[ polish ] = "Wzglêd~ny";
        Text[ japanese ] = "Š„‡(~E)";
        Text[ chinese_traditional ] = "¬Û¹ïªº(~E)";
        Text[ arabic ] = "äÓÈí";
        Text[ greek ] = "Ó÷åôéêÜ";
        Text[ korean ] = "ºñ·Ê(~L)";
        Text[ turkish ] = "G~öreceli";
    };
    CheckBox CB_FIXEDRATIO
    {
        Pos = MAP_APPFONT ( 12 , 47 ) ;
        Size = MAP_APPFONT ( 40 , 10 ) ;
        TabStop = TRUE ;
        Text = "Abgle~ich" ;
        Text [ ENGLISH ] = "Fixed ratio" ;
        Text [ english_us ] = "~Keep ratio" ;
        Text [ dutch ] = "~Synchroniseren" ;
        Text [ italian ] = "Proporz." ;
        Text [ spanish ] = "Prop~orcional" ;
        Text [ french ] = "~Proportionnel" ;
        Text [ swedish ] = "~proportionellt" ;
        Text [ danish ] = "Proport." ;
        Text [ portuguese_brazilian ] = "Abgle~ich" ;
        Text [ portuguese ] = "Pr~oporcional" ;
        Text[ chinese_simplified ] = "ͬ²½»¯(~K)";
        Text[ russian ] = "Ïðîïîðöèîíàëüíî";
        Text[ polish ] = "Dopas~uj";
        Text[ japanese ] = "’²®(~K)";
        Text[ chinese_traditional ] = "¦P¨B¤Æ(~K)";
        Text[ arabic ] = "ÊÒÇãä";
        Text[ greek ] = "Áíáëïã~éêÜ";
        Text[ korean ] = "ºñÀ² À¯Áö(~K)";
        Text[ turkish ] = "Orant~ý";
    };
    CheckBox CB_AUTOHEIGHT
    {
        Pos = MAP_APPFONT ( 56 , 47 ) ;
        Size = MAP_APPFONT ( 58 , 10 ) ;
        TabStop = TRUE ;
        Text = "auto. H~öhe" ;
        Text [ ENGLISH ] = "auto. Hei~ght" ;
        Text [ norwegian ] = "auto. Hei~ght" ;
        Text [ italian ] = "Altezza. ~auto" ;
        Text [ portuguese_brazilian ] = "Altura automática" ;
        Text [ portuguese ] = "Altura automática" ;
        Text [ finnish ] = "automaattinen k~orkeus" ;
        Text [ danish ] = "Auto. højde" ;
        Text [ french ] = "Hau~teur auto." ;
        Text [ swedish ] = "auto. h~öjd" ;
        Text [ dutch ] = "Auto. h~oogte" ;
        Text [ spanish ] = "Altura auto~m." ;
        Text [ english_us ] = "AutoHei~ght" ;
        Text[ chinese_simplified ] = "×Ô¶¯¸ß¶È(~G)";
        Text[ russian ] = "Àâòîïîäáîð âûñîòû";
        Text[ polish ] = "~Autom. wys.";
        Text[ japanese ] = "‚‚³Ž©“®’²®(~G)";
        Text[ chinese_traditional ] = "¦Û°Ê°ª«×(~G)";
        Text[ arabic ] = "ÇÑÊÝÇÚ ÊáÞÇÆí";
        Text[ greek ] = "Áõôüìáôï ýøïò";
        Text[ korean ] = "ÀÚµ¿ ³ôÀÌ(~G)";
        Text[ turkish ] = "otom. ~yüksekl.";
    };
    GroupBox GB_SIZE
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 114 , 60 ) ;
        Text = "Größe" ;
        Text [ ENGLISH ] = "Size" ;
        Text [ norwegian ] = "Størrelse" ;
        Text [ italian ] = "Dimensione" ;
        Text [ portuguese_brazilian ] = "Tamanho" ;
        Text [ portuguese ] = "Tamanho" ;
        Text [ finnish ] = "Koko" ;
        Text [ danish ] = "Størrelse" ;
        Text [ french ] = "Taille" ;
        Text [ swedish ] = "Storlek" ;
        Text [ dutch ] = "Grootte" ;
        Text [ spanish ] = "Tamaño" ;
        Text [ english_us ] = "Size" ;
        Text[ chinese_simplified ] = "´óС";
        Text[ russian ] = "Ðàçìåð";
        Text[ polish ] = "Rozmiar";
        Text[ japanese ] = "»²½Þ";
        Text[ chinese_traditional ] = "¤j¤p";
        Text[ arabic ] = "ÇáÍÌã";
        Text[ greek ] = "ÌÝãåèïò";
        Text[ korean ] = "Å©±â";
        Text[ turkish ] = "Boyut";
    };
    RadioButton RB_ANCHOR_TYPE
    {
        Pos = MAP_APPFONT ( 132 , 16 ) ;
        Size = MAP_APPFONT ( 25 , 10 ) ;
        Text = "~an" ;
        Text [ ENGLISH ] = "as" ;
        Check = TRUE ;
        Text [ english_us ] = "~To" ;
        Text [ portuguese_brazilian ] = "~an" ;
        Text [ swedish ] = "t~ill" ;
        Text [ danish ] = "til" ;
        Text [ italian ] = "~a" ;
        Text [ spanish ] = "~A" ;
        Text [ french ] = "~À" ;
        Text [ dutch ] = "~aan" ;
        Text [ portuguese ] = "pa~ra" ;
        Text[ chinese_simplified ] = "ÖÁ(~T)";
        Text[ russian ] = "~ê";
        Text[ polish ] = "do";
        Text[ japanese ] = "êŠ(~T)";
        Text[ chinese_traditional ] = "¦Ü(~T)";
        Text[ arabic ] = "Úáì";
        Text[ greek ] = "ðñïò";
        Text[ korean ] = "¸ÂÃâ °÷(~T)";
        Text[ turkish ] = "~noktasý";
    };
    ListBox LB_ANCHOR_TYPE
    {
        Pos = MAP_APPFONT ( 158 , 14 ) ;
        Size = MAP_APPFONT ( 46 , 60 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        StringList =
        {
            < "Seite" ; > ;
            < "Absatz" ; > ;
            < "Zeichen" ; > ;
            < "Rahmen" ; > ;
        };
        StringList [ English ] =
        {
            < "Seite" ; > ;
            < "Absatz" ; > ;
            < "Zeichen" ; > ;
            < "Rahmen" ; > ;
        };
        stringlist [ english_us ] =
        {
            < "Page" ; > ;
            < "Paragraph" ; > ;
            < "Character" ; > ;
            < "Frame" ; > ;
        };
        stringlist [ portuguese_brazilian ] =
        {
            < "Seite" ; > ;
            < "Absatz" ; > ;
            < "Zeichen" ; > ;
            < "Rahmen" ; > ;
        };
        stringlist [ swedish ] =
        {
            < "sida" ; > ;
            < "stycke" ; > ;
            < "tecken" ; > ;
            < "Ram" ; > ;
        };
        stringlist [ danish ] =
        {
            < "Side" ; > ;
            < "Afsnit" ; > ;
            < "Tegn" ; > ;
            < "Ramme" ; > ;
        };
        stringlist [ italian ] =
        {
            < "Pagina" ; > ;
            < "Paragrafo" ; > ;
            < "Carattere" ; > ;
            < "Cornice" ; > ;
        };
        stringlist [ spanish ] =
        {
            < "Página" ; > ;
            < "Párrafo" ; > ;
            < "Carácter" ; > ;
            < "Marcos" ; > ;
        };
        stringlist [ french ] =
        {
            < "Page" ; > ;
            < "Paragraphe" ; > ;
            < "Caractère" ; > ;
            < "Cadre" ; > ;
        };
        stringlist [ dutch ] =
        {
            < "Pagina" ; > ;
            < "Alinea" ; > ;
            < "Teken" ; > ;
            < "Kader" ; > ;
        };
        stringlist [ portuguese ] =
        {
            < "Página" ; > ;
            < "Parágrafo" ; > ;
            < "Caracteres" ; > ;
            < "Molduras" ; > ;
        };
    StringList [ chinese_simplified ] =
    {
            < "ҳ" ; > ;
        < "¶ÎÂä" ; > ;
        < "×Ö·û" ; > ;
        < "¿ò" ; > ;
    };
    StringList [ russian ] =
    {
            < "Ñòðàíèöà" ; > ;
        < "Àáçàö" ; > ;
        < "Çíàê" ; > ;
        < "Ðàìêà" ; > ;
    };
    StringList [ polish ] =
    {
            < "Strona" ; > ;
        < "Akapit" ; > ;
        < "Znak" ; > ;
        < "Ramka" ; > ;
    };
    StringList [ japanese ] =
    {
            < "Íß°¼Þ" ; > ;
        < "’i—Ž" ; > ;
        < "•¶Žš" ; > ;
        < "˜g" ; > ;
    };
    StringList [ chinese_traditional ] =
    {
            < "­¶" ; > ;
        < "¬q¸¨" ; > ;
        < "¦r¤¸" ; > ;
        < "¤å¦r¤è¶ô" ; > ;
    };
    StringList [ arabic ] =
    {
            < "ÇáÕÝÍÉ" ; > ;
        < "ÇáÝÞÑÉ" ; > ;
        < "ÎØ" ; > ;
        < "ÅØÇÑ" ; > ;
    };
    StringList [ greek ] =
    {
            < "Óåëßäá" ; > ;
        < "ÐáñÜãñáöïò" ; > ;
        < "×áñáêôÞñåò" ; > ;
        < "Ðåñßãñáììá" ; > ;
    };
    StringList [ korean ] =
    {
            < "ÆäÀÌÁö" ; > ;
        < "´Ü¶ô" ; > ;
        < "¹®ÀÚ" ; > ;
        < "ÇÁ·¹ÀÓ" ; > ;
    };
    StringList [ turkish ] =
    {
            < "Sayfa" ; > ;
        < "Paragraf" ; > ;
        < "Karakter" ; > ;
        < "Çerçeve" ; > ;
    };
    StringList [ language_user1 ] =
    {
            < "Seite" ; > ;
        < "Absatz" ; > ;
        < "Zeichen" ; > ;
        < "Rahmen" ; > ;
    };
    };
    RadioButton RB_ANCHOR_CHAR
    {
        Pos = MAP_APPFONT ( 132 , 29 ) ;
        Size = MAP_APPFONT ( 72 , 10 ) ;
        Text = "als Zei~chen" ;
        Text [ ENGLISH ] = "like a character" ;
        Text [ english_us ] = "~As character" ;
        Text [ portuguese_brazilian ] = "als Zei~chen" ;
        Text [ swedish ] = "som te~cken" ;
        Text [ danish ] = "som tegn" ;
        Text [ italian ] = "quale ~carattere" ;
        Text [ spanish ] = "Como ~carácter" ;
        Text [ french ] = "Comme c~aractère" ;
        Text [ dutch ] = "als te~ken" ;
        Text [ portuguese ] = "como ~carácter" ;
        Text[ chinese_simplified ] = "µ±×÷×Ö·û(~H)";
        Text[ russian ] = "êàê çíàê";
        Text[ polish ] = "jako zna~k";
        Text[ japanese ] = "•¶Žš‚Æ‚µ‚Ä(~H)";
        Text[ language_user1 ] = "èëè: ñèìâîë; èëè ðèñóíîê - èëE ñèEüJ; èëEðèñóûM";
        Text[ chinese_traditional ] = "·í§@¦r¤¸(~H)";
        Text[ arabic ] = "ßÍÑÝ";
        Text[ greek ] = "ùò ÷áñáêôÞñáò";
        Text[ korean ] = "¹®ÀÚ·Î(~A)";
        Text[ turkish ] = "karakter o~larak";
    };
    /*    RadioButton RB_TYPE_PAGE
    {
        Pos = MAP_APPFONT ( 132 , 15 ) ;
        Size = MAP_APPFONT ( 40 , 10 ) ;
        TabStop = TRUE ;
        Text = "~Seite" ;
        Text [ ENGLISH ] = "Bound to page" ;
        Text [ norwegian ] = "Bound to page" ;
        Text [ italian ] = "Pagina" ;
        Text [ portuguese_brazilian ] = "Limitado à página" ;
        Text [ portuguese ] = "~Página" ;
        Text [ finnish ] = "Sido sivulle" ;
        Text [ danish ] = "På siden" ;
        Text [ french ] = "P~age" ;
        Text [ swedish ] = "~Sida" ;
        Text [ dutch ] = "~Pagina" ;
        Text [ spanish ] = "Pági~na" ;
        Text [ english_us ] = "~Page" ;
    };
    RadioButton RB_TYPE_PARAGRAPH
    {
        Pos = MAP_APPFONT ( 132 , 28 ) ;
        Size = MAP_APPFONT ( 40 , 10 ) ;
        Text = "~Absatz" ;
        Text [ ENGLISH ] = "Frame at ~Paragraph" ;
        Text [ norwegian ] = "Frame at ~Paragraph" ;
        Text [ italian ] = "~Paragrafo" ;
        Text [ portuguese_brazilian ] = "Moldura em ~Parágrafo" ;
        Text [ portuguese ] = "~Parágrafo" ;
        Text [ finnish ] = "Kehys ~kappaleessa" ;
        Text [ danish ] = "Ved ~afsnit" ;
        Text [ french ] = "~Paragraphe" ;
        Text [ swedish ] = "St~ycke" ;
        Text [ dutch ] = "~Alinea" ;
        Text [ spanish ] = "Párra~fo" ;
        Text [ english_us ] = "~Paragraph" ;
    };
    RadioButton RB_TYPE_CHAR
    {
        Pos = MAP_APPFONT ( 132 , 41 ) ;
        Size = MAP_APPFONT ( 40 , 10 ) ;
        Text = "Zei~chen" ;
        Text [ ENGLISH ] = "Frame at ~Character" ;
        Text [ norwegian ] = "Frame at ~Character" ;
        Text [ italian ] = "~Carattere" ;
        Text [ portuguese_brazilian ] = "Moldura em ~Caracter" ;
        Text [ portuguese ] = "~Caracter" ;
        Text [ finnish ] = "Kehys ~merkissä" ;
        Text [ danish ] = "På tegnet" ;
        Text [ french ] = "~Caractère" ;
        Text [ swedish ] = "~Tecken" ;
        Text [ dutch ] = "~Teken" ;
        Text [ spanish ] = "~Carácter" ;
        Text [ english_us ] = "~Character" ;
    };
    RadioButton RB_TYPE_FLY
    {
        Pos = MAP_APPFONT ( 132 , 54 ) ;
        Size = MAP_APPFONT ( 40 , 10 ) ;
        Text = "~Rahmen" ;
        Text [ ENGLISH ] = "Frame at ~Frame" ;
        Text [ english_us ] = "~Frame" ;
        Text [ portuguese_brazilian ] = "~Rahmen" ;
        Text [ swedish ] = "~Ramar" ;
        Text [ danish ] = "~Rahmen" ;
        Text [ italian ] = "~Cornice" ;
        Text [ spanish ] = "~Marcos" ;
        Text [ french ] = "~Cadre" ;
        Text [ dutch ] = "~Kader" ;
        Text [ portuguese ] = "~Moldura" ;
    };*/
    GroupBox GB_TYPE
    {
        Pos = MAP_APPFONT ( 126 , 3 ) ;
        Size = MAP_APPFONT ( 84 , 39 ) ;
        Text = "Verankerung" ;
        Text [ ENGLISH ] = "Type" ;
        Text [ norwegian ] = "Type" ;
        Text [ italian ] = "Ancoraggio" ;
        Text [ portuguese_brazilian ] = "Tipo" ;
        Text [ portuguese ] = "Âncora" ;
        Text [ finnish ] = "Laji" ;
        Text [ danish ] = "Forankring" ;
        Text [ french ] = "Ancrage" ;
        Text [ swedish ] = "Förankring" ;
        Text [ dutch ] = "Verankering" ;
        Text [ spanish ] = "Anclaje" ;
        Text [ english_us ] = "Anchor" ;
        Text[ chinese_simplified ] = "Ëø¶¨";
        Text[ russian ] = "Ïðèâÿçêà";
        Text[ polish ] = "Zakotwiczenie";
        Text[ japanese ] = "±Ý¶°";
        Text[ chinese_traditional ] = "吩w";
        Text[ arabic ] = "ÅÑÓÇÁ";
        Text[ greek ] = "Áãêýñùóç";
        Text[ korean ] = "°íÁ¤ ±âÁØ";
        Text[ turkish ] = "Sabitleme";
    };
    Window WN_BSP
    {
        Pos = MAP_APPFONT ( 217 , 6 ) ;
        Size = MAP_APPFONT ( 39 , 58 ) ;
    };
    PushButton BT_REALSIZE
    {
        Pos = MAP_APPFONT ( 126 , 49 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        Hide = TRUE ;
        Text = "Originalgr~öße" ;
        Text [ ENGLISH ] = "Real Size" ;
        Text [ norwegian ] = "Real Size" ;
        Text [ italian ] = "Dimens. originale" ;
        Text [ portuguese_brazilian ] = "Tamanho real" ;
        Text [ portuguese ] = "Tamanho original" ;
        Text [ finnish ] = "Todellinen koko" ;
        Text [ danish ] = "Oprindelig størrelse" ;
        Text [ french ] = "Taille d'~origine" ;
        Text [ swedish ] = "Originalst~orlek" ;
        Text [ dutch ] = "~Originele grootte" ;
        Text [ spanish ] = "Ta~maño original" ;
        Text [ english_us ] = "Original Size" ;
        Text[ chinese_simplified ] = "Ô­¼þ´óС";
        Text[ russian ] = "Èñõîäíûé ðàçìåð";
        Text[ polish ] = "Rozmiar oryginalny";
        Text[ japanese ] = "Œ³‚Ì»²½Þ";
        Text[ chinese_traditional ] = "­ì¥ó¤j¤p";
        Text[ arabic ] = "ÇáÍÌã ÇáÃÕáí";
        Text[ greek ] = "Áñ÷éêü ìÝãåèïò";
        Text[ korean ] = "±âº» Å©±â";
        Text[ turkish ] = "Ýlk b~oyut";
    };
    FixedText FT_HORIZONTAL
    {
        Pos = MAP_APPFONT ( 12 , 81 ) ;
        Size = MAP_APPFONT ( 35 , 10 ) ;
        Left = TRUE ;
        Text = "Horizon~tal" ;
        Text [ ENGLISH ] = "Hori~zontal" ;
        Text [ norwegian ] = "Hori~zontal" ;
        Text [ italian ] = "Ori~zzontale" ;
        Text [ portuguese_brazilian ] = "Hori~zontal" ;
        Text [ portuguese ] = "Hori~zontal" ;
        Text [ finnish ] = "~Vaaksuunta" ;
        Text [ danish ] = "Vandret" ;
        Text [ french ] = "Hori~zontale" ;
        Text [ swedish ] = "H~orisontellt" ;
        Text [ dutch ] = "Horizon~taal" ;
        Text [ spanish ] = "Hori~zontal" ;
        Text [ english_us ] = "Hori~zontal" ;
        Text[ chinese_simplified ] = "ˮƽ·½Ïò(~Z)";
        Text[ russian ] = "Ïî ãîðèçîíòàëè";
        Text[ polish ] = "W poziomie";
        Text[ japanese ] = "‰¡(~Z)";
        Text[ chinese_traditional ] = "¤ô¥­(~Z)";
        Text[ arabic ] = "ÃÝÞí";
        Text[ greek ] = "Ïñéæüíôéá";
        Text[ korean ] = "¼öÆò(~Z)";
        Text[ turkish ] = "Ya~tay";
    };
    ListBox DLB_HORIZONTAL
    {
        Pos = MAP_APPFONT ( 49 , 79 ) ;
        Size = MAP_APPFONT ( 50 , 60 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
    };
    FixedText FT_AT_HORZ_POS
    {
        Pos = MAP_APPFONT ( 102 , 81 ) ;
        Size = MAP_APPFONT ( 12 , 10 ) ;
        Left = TRUE ;
        Text = "~um" ;
        Text [ ENGLISH ] = "at" ;
        Text [ norwegian ] = "i" ;
        Text [ italian ] = "~di" ;
        Text [ portuguese_brazilian ] = "em" ;
        Text [ portuguese ] = "em" ;
        Text [ finnish ] = " - " ;
        Text [ danish ] = "ved" ;
        Text [ french ] = "~de" ;
        Text [ swedish ] = "~med" ;
        Text [ dutch ] = "~om" ;
        Text [ spanish ] = "a" ;
        Text [ english_us ] = "by" ;
        Text[ chinese_simplified ] = "¼ä¸ô";
        Text[ russian ] = "íà";
        Text[ polish ] = "o";
        Text[ japanese ] = "ŠÔŠu";
        Text[ chinese_traditional ] = "¶¡¹j";
        Text[ arabic ] = "ÈãÞÏÇÑ";
        Text[ greek ] = "á~íÜ";
        Text[ korean ] = "Á¤µµ";
        Text[ turkish ] = "g~rnt.";
    };
    MetricField ED_AT_HORZ_POS
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 118 , 79 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = -9999 ;
        Maximum = 9999 ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        First = -9999 ;
        Last = 9999 ;
        SpinSize = 10 ;
    };
    FixedText FT_HORI_RELATION
    {
        Pos = MAP_APPFONT ( 161 , 81 ) ;
        Size = MAP_APPFONT ( 16 , 10 ) ;
        Left = TRUE ;
        Text = "zu" ;
        Text [ ENGLISH ] = "to" ;
        Text [ english_us ] = "to" ;
        Text [ portuguese_brazilian ] = "zu" ;
        Text [ swedish ] = "till" ;
        Text [ danish ] = "fra" ;
        Text [ italian ] = "a" ;
        Text [ spanish ] = "a" ;
        Text [ french ] = "de" ;
        Text [ dutch ] = "naar" ;
        Text [ portuguese ] = "para" ;
        Text[ chinese_simplified ] = "ÖÁ";
        Text[ russian ] = "ê";
        Text[ polish ] = "do";
        Text[ japanese ] = "‘ΏÛ";
        Text[ chinese_traditional ] = "¦Ü";
        Text[ arabic ] = "Åáì";
        Text[ greek ] = "ðñïò";
        Text[ korean ] = "¸ÂÃâ ¹æÇâ";
        Text[ turkish ] = "->";
        Text[ language_user1 ] = "\"zu\" muss ich hier weglassen weils es als Suffix im letzten Satzelement (Listbox) schon vorkommt.";
    };
    ListBox LB_HORI_RELATION
    {
        Pos = MAP_APPFONT ( 178 , 79 ) ;
        Size = MAP_APPFONT ( 70 , 60 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
    };
    CheckBox CB_MIRROR
    {
        Pos = MAP_APPFONT ( 49 , 95 ) ;
        Size = MAP_APPFONT ( 205 , 10 ) ;
        TabStop = TRUE ;
        Text = "Auf geraden Seiten ~spiegeln" ;
        Text [ ENGLISH ] = "Switch position on even page numbers" ;
        Text [ english_us ] = "~Mirror on even pages" ;
        Text [ portuguese_brazilian ] = "Auf geraden Seiten ~spiegeln" ;
        Text [ swedish ] = "~spegelvänd på jämna sidor" ;
        Text [ danish ] = "Spejlvend på lige sider" ;
        Text [ italian ] = "Rispecchia su pagine ~pari" ;
        Text [ spanish ] = "Reflejar en ~páginas pares" ;
        Text [ french ] = "~En vis-à-vis sur les pages paires" ;
        Text [ dutch ] = "Op even pagina's ~spiegelen" ;
        Text [ portuguese ] = "Inverter em páginas ~pares" ;
        Text[ chinese_simplified ] = "·´Ó³µ½Å¼ÊýÒ³Ãæ(~E)";
        Text[ russian ] = "Îòîáðàçèòü íà ÷åòíûõ ñòðàíèöàõ";
        Text[ polish ] = "Przerzu~æ na parzystych stronach";
        Text[ japanese ] = "‹ô”Íß°¼Þ‚É”½“](~E)";
        Text[ chinese_traditional ] = "¤Ï¬M¨ì°¸¼Æ­¶­±(~E)";
        Text[ arabic ] = "ÇäÚßÇÓ Úáì ÇáÕÝÍÇÊ ÇáÒæÌíÉ";
        Text[ greek ] = "Êáèñåðôé~óìüò óôéò Üñôéåò óåëßäåò";
        Text[ korean ] = "¦¼ö ÆäÀÌÁö ¸¶ÁÖº¸±â(~M)";
        Text[ turkish ] = "Çift numaralý sayfalarda ya~nsýt";
    };
    FixedText FT_VERTICAL
    {
        Pos = MAP_APPFONT ( 12 , 111 ) ;
        Size = MAP_APPFONT ( 35 , 10 ) ;
        Left = TRUE ;
        Text = "~Vertikal" ;
        Text [ ENGLISH ] = "~Vertical" ;
        Text [ norwegian ] = "~Vertikal" ;
        Text [ italian ] = "~Verticale" ;
        Text [ portuguese_brazilian ] = "~Vertical" ;
        Text [ portuguese ] = "~Vertical" ;
        Text [ finnish ] = "~Rinnakkain" ;
        Text [ danish ] = "Lodret" ;
        Text [ french ] = "~Verticale" ;
        Text [ swedish ] = "~Vertikalt" ;
        Text [ dutch ] = "~Verticaal" ;
        Text [ spanish ] = "~Vertical" ;
        Text [ english_us ] = "~Vertical" ;
        Text[ chinese_simplified ] = "´¹Ö±·½Ïò(~V)";
        Text[ russian ] = "Ïî âåðòèêàëè";
        Text[ polish ] = "W pionie";
        Text[ japanese ] = "c(~V)";
        Text[ chinese_traditional ] = "««ª½¤è¦V(~V)";
        Text[ arabic ] = "ÑÃÓí";
        Text[ greek ] = "Êáôáêüñõöá";
        Text[ korean ] = "¼öÁ÷(~V)";
        Text[ turkish ] = "Di~key";
    };
    ListBox DLB_VERTICAL
    {
        Pos = MAP_APPFONT ( 49 , 109 ) ;
        Size = MAP_APPFONT ( 50 , 60 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
    };
    FixedText FT_AT_VERT_POS
    {
        Pos = MAP_APPFONT ( 102 , 111 ) ;
        Size = MAP_APPFONT ( 12 , 10 ) ;
        Left = TRUE ;
        Text = "u~m" ;
        Text [ ENGLISH ] = "at" ;
        Text [ norwegian ] = "i" ;
        Text [ italian ] = "di" ;
        Text [ portuguese_brazilian ] = "em" ;
        Text [ portuguese ] = "em" ;
        Text [ finnish ] = " - " ;
        Text [ danish ] = "ved" ;
        Text [ french ] = "d~e" ;
        Text [ swedish ] = "m~ed" ;
        Text [ dutch ] = "~om" ;
        Text [ spanish ] = "a" ;
        Text [ english_us ] = "by" ;
        Text[ chinese_simplified ] = "¼ä¸ô";
        Text[ russian ] = "íà";
        Text[ polish ] = "o";
        Text[ japanese ] = "ŠÔŠu";
        Text[ chinese_traditional ] = "¶¡¹j";
        Text[ arabic ] = "ÈãÞÏÇÑ";
        Text[ greek ] = "áíÜ";
        Text[ korean ] = "¿¡ ÀÇÇØ";
        Text[ turkish ] = "gr~nt.";
    };
    MetricField ED_AT_VERT_POS
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 118 , 109 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = -9999 ;
        Maximum = 9999 ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        First = -9999 ;
        Last = 9999 ;
        SpinSize = 10 ;
    };
    FixedText FT_VERT_RELATION
    {
        Pos = MAP_APPFONT ( 161 , 111 ) ;
        Size = MAP_APPFONT ( 16 , 10 ) ;
        Left = TRUE ;
        Text = "zu" ;
        Text [ ENGLISH ] = "to" ;
        Text [ english_us ] = "to" ;
        Text [ portuguese_brazilian ] = "zu" ;
        Text [ swedish ] = "till" ;
        Text [ danish ] = "fra" ;
        Text [ italian ] = "a" ;
        Text [ spanish ] = "a" ;
        Text [ french ] = "de" ;
        Text [ dutch ] = "naar" ;
        Text [ portuguese ] = "para" ;
        Text[ chinese_simplified ] = "ÖÁ";
        Text[ russian ] = "ê";
        Text[ polish ] = "do";
        Text[ japanese ] = "‘ΏÛ";
        Text[ chinese_traditional ] = "¦Ü";
        Text[ arabic ] = "Åáì";
        Text[ greek ] = "ðñïò";
        Text[ korean ] = "¸ÂÃâ ¹æÇâ";
        Text[ turkish ] = "->";
        Text[ language_user1 ] = "\"zu\" muss ich hier weglassen weils es als Suffix im letzten Satzelement (Listbox) schon vorkommt.";
    };
    ListBox LB_VERT_RELATION
    {
        Pos = MAP_APPFONT ( 178 , 109 ) ;
        Size = MAP_APPFONT ( 70 , 60 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
    };
    GroupBox GB_POSITION
    {
        Pos = MAP_APPFONT ( 6 , 66 ) ;
        Size = MAP_APPFONT ( 248 , 63 ) ;
        Text = "Position" ;
        Text [ ENGLISH ] = "Position" ;
        Text [ norwegian ] = "Posisjon" ;
        Text [ italian ] = "Posizione" ;
        Text [ portuguese_brazilian ] = "Posição" ;
        Text [ portuguese ] = "Posição" ;
        Text [ finnish ] = "Sijainti" ;
        Text [ danish ] = "Placering" ;
        Text [ french ] = "Position" ;
        Text [ swedish ] = "Position" ;
        Text [ dutch ] = "Positie" ;
        Text [ spanish ] = "Posición" ;
        Text [ english_us ] = "Position" ;
        Text[ chinese_simplified ] = "λÖÃ";
        Text[ russian ] = "Ïîçèöèÿ";
        Text[ polish ] = "Pozycja";
        Text[ japanese ] = "ˆÊ’u";
        Text[ chinese_traditional ] = "¦ì¸m";
        Text[ arabic ] = "ÇáãæÖÚ";
        Text[ greek ] = "ÈÝóç";
        Text[ korean ] = "À§Ä¡";
        Text[ turkish ] = "Konum";
    };
};
TabPage TP_GRF_EXT
{
    Hide = TRUE ;
    HelpID = HID_GRF_EXT ;
    SVLook = TRUE ;
    Pos = MAP_APPFONT ( 0 , 0 ) ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Bitmap BMP_EXAMPLE
    {
        File = "dog.bmp" ;
    };
    GroupBox GB_CONNECT
    {
        Pos = MAP_APPFONT ( 6 , 91 ) ;
        Size = MAP_APPFONT ( 248 , 38 ) ;
        Text = "Verknüpfung" ;
        Text [ ENGLISH ] = "Link" ;
        Text [ norwegian ] = "Kobling" ;
        Text [ italian ] = "Collegamento" ;
        Text [ portuguese_brazilian ] = "Ligar" ;
        Text [ portuguese ] = "Ligar" ;
        Text [ finnish ] = "Yhteys" ;
        Text [ danish ] = "Kæde" ;
        Text [ french ] = "Lien" ;
        Text [ swedish ] = "Länk" ;
        Text [ dutch ] = "Koppeling" ;
        Text [ spanish ] = "Vínculo" ;
        Text [ english_us ] = "Link" ;
        Text[ chinese_simplified ] = "Á´½Ó";
        Text[ russian ] = "Ññûëêà";
        Text[ polish ] = "£¹cze";
        Text[ japanese ] = "ØÝ¸";
        Text[ chinese_traditional ] = "±¶®|";
        Text[ arabic ] = "ÇÑÊÈÇØ";
        Text[ greek ] = "Óýíäåóç";
        Text[ korean ] = "¿¬°á";
        Text[ turkish ] = "Baðlantý";
    };
    FixedText FT_CONNECT
    {
        Pos = MAP_APPFONT ( 13 , 102 ) ;
        Size = MAP_APPFONT ( 80 , 10 ) ;
        Text = "~Dateiname" ;
        Text [ English ] = "Filename" ;
        Text [ english_us ] = "~File name" ;
        Text [ italian ] = "~Nome file" ;
        Text [ spanish ] = "~Nombre de archivo" ;
        Text [ french ] = "~Nom de fichier" ;
        Text [ dutch ] = "~Naam bestand" ;
        Text [ swedish ] = "~Filnamn" ;
        Text [ danish ] = "Filnavn" ;
        Text [ portuguese_brazilian ] = "~Dateiname" ;
        Text [ portuguese ] = "~Nome do ficheiro" ;
        Text[ chinese_simplified ] = "ÎļþÃû(~F)";
        Text[ russian ] = "Èìÿ ôàéëà";
        Text[ polish ] = "Nazwa pliku";
        Text[ japanese ] = "̧²Ù–¼(~F)";
        Text[ chinese_traditional ] = "ÀɮצW(~F)";
        Text[ arabic ] = "ÇÓã ÇáãáÝ";
        Text[ greek ] = "¼íïìá áñ÷åßïõ";
        Text[ korean ] = "ÆÄÀÏ À̸§(~F)";
        Text[ turkish ] = "D~osya adý";
    };
    Edit ED_CONNECT
    {
        Pos = MAP_APPFONT ( 13 , 114 ) ;
        Size = MAP_APPFONT ( 200 , 12 ) ;
        Text = "[Keiner]" ;
        Text [ ENGLISH ] = "[None]" ;
        Text [ norwegian ] = "[Ingen]" ;
        Text [ italian ] = "[senza]" ;
        Text [ portuguese_brazilian ] = "[Nenhum]" ;
        Text [ portuguese ] = "[Nenhum]" ;
        Text [ finnish ] = "[Ei ole]" ;
        Text [ danish ] = "[Ingen]" ;
        Text [ french ] = "[Aucun(e)]" ;
        Text [ swedish ] = "[Inga]" ;
        Text [ dutch ] = "[Geen]" ;
        Text [ spanish ] = "[Sin]" ;
        Text [ english_us ] = "[None]" ;
        Readonly = TRUE ;
        Left = TRUE ;
        Border = TRUE ;
        Text[ chinese_simplified ] = "[ÎÞ]";
        Text[ russian ] = "[áåç]";
        Text[ polish ] = "[brak]";
        Text[ japanese ] = "[‚È‚µ]";
        Text[ language_user1 ] = "ûD";
        Text[ chinese_traditional ] = "[µL]";
        Text[ arabic ] = "[ÈÏæä]";
        Text[ greek ] = "[ÊáíÝíá]";
        Text[ korean ] = "[¾øÀ½]";
        Text[ turkish ] = "[Boþ]";
    };
    PushButton PB_BROWSE
    {
        Disable = TRUE ;
        Pos = MAP_APPFONT ( 230 , 114 ) ;
        Size = MAP_APPFONT ( 12 , 12 ) ;
        Text = "~..." ;
        Disable = TRUE ;
        TabStop = TRUE ;
        Text [ english_us ] = "~..." ;
        Text [ swedish ] = "~..." ;
        Text [ danish ] = "~..." ;
        Text [ italian ] = "~..." ;
        Text [ spanish ] = "~..." ;
        Text [ french ] = "~..." ;
        Text [ dutch ] = "~..." ;
        Text [ portuguese_brazilian ] = "~..." ;
        Text [ portuguese ] = "~..." ;
        Text[ chinese_simplified ] = "(~.)...";
        Text[ russian ] = "~...";
        Text[ polish ] = "~...";
        Text[ japanese ] = "~...";
        Text[ chinese_traditional ] = "~....";
        Text[ arabic ] = "...~";
        Text[ greek ] = "~...";
        Text[ korean ] = "~...";
        Text[ turkish ] = "~...";
    };
    CheckBox CB_VERT
    {
        Pos = MAP_APPFONT ( 12 , 15 ) ;
        Size = MAP_APPFONT ( 48 , 10 ) ;
        TabStop = TRUE ;
        Group = TRUE ;
        Text = "~vertikal" ;
        Text [ ENGLISH ] = "verti~cally" ;
        Text [ norwegian ] = "verti~cally" ;
        Text [ italian ] = "~Verticale" ;
        Text [ portuguese_brazilian ] = "hori~zontalmente" ;
        Text [ portuguese ] = "~vertical" ;
        Text [ finnish ] = "~pystysuunnassa" ;
        Text [ danish ] = "lodret" ;
        Text [ french ] = "~verticalement" ;
        Text [ swedish ] = "~vertikalt" ;
        Text [ dutch ] = "verti~caal" ;
        Text [ spanish ] = "~vertical" ;
        Text [ english_us ] = "~vertically" ;
        Text[ chinese_simplified ] = "´¹Ö±·½Ïò(~V)";
        Text[ russian ] = "âåðòèêàëüíî";
        Text[ polish ] = "pio~nowo";
        Text[ japanese ] = "c(~V)";
        Text[ chinese_traditional ] = "««ª½¤è¦V(~V)";
        Text[ arabic ] = "ÑÃÓí";
        Text[ greek ] = "êáôáêüñõöá";
        Text[ korean ] = "¼öÁ÷(~V)";
        Text[ turkish ] = "d~ikey";
    };
    CheckBox CB_HOR
    {
        Pos = MAP_APPFONT ( 12 , 31 ) ;
        Size = MAP_APPFONT ( 70 , 10 ) ;
        TabStop = TRUE ;
        Text = "hori~zontal" ;
        Text [ english ] = "hori~zontal" ;
        Text[ english_us ] = "hori~zontally";
        Text[ portuguese ] = "~horizontal";
        Text[ russian ] = "ãîðèçîíòàëüíî, íà";
        Text[ greek ] = "ïñé~æüíôéá";
        Text[ dutch ] = "~horizontaal";
        Text[ french ] = "~horizontalement";
        Text[ spanish ] = "~horizontal, sobre";
        Text[ italian ] = "~orizzontalmente su ";
        Text[ danish ] = "vandret";
        Text[ swedish ] = "h~orisontalt";
        Text[ polish ] = "p~oziomo, na";
        Text[ portuguese_brazilian ] = "verti~calmente";
        Text[ japanese ] = "¶‰E(~H)";
        Text[ korean ] = "¼öÆòÀ¸·Î, À§(~Z)";
        Text[ chinese_simplified ] = "ˮƽ·½Ïò(~Z)";
        Text[ chinese_traditional ] = "¤ô¥­¤è¦V";
        Text[ turkish ] = "yata~y";
        Text[ arabic ] = "ÃÝÞí";
    };
    RadioButton RB_MIRROR_ALL_PAGES
    {
        Pos = MAP_APPFONT ( 18 , 44 ) ;
        Size = MAP_APPFONT ( 100 , 12 ) ;
        TabStop = TRUE ;
        Text = "~auf allen Seiten" ;
        Text [ ENGLISH ] = "on all pages" ;
        Text [ english_us ] = "on all pages" ;
        Text[ portuguese ] = "~em todas as páginas";
        Text[ russian ] = "on all pages";
        Text[ greek ] = "óå üëåò ôéò óåëßäåò";
        Text[ dutch ] = "~op alle pagina's";
        Text[ french ] = "~sur toutes les pages";
        Text[ spanish ] = "on all pages";
        Text[ italian ] = "on all pages";
        Text[ danish ] = "på alle sider";
        Text[ swedish ] = "på ~alla sidor";
        Text[ polish ] = "on all pages";
        Text[ portuguese_brazilian ] = "on all pages";
        Text[ japanese ] = "‚·‚ׂĂÌÍß°¼Þ‚É";
        Text[ korean ] = "on all pages";
        Text[ chinese_simplified ] = "È«²¿Ò³Ãæ";
        Text[ chinese_traditional ] = "¦b©Ò¦³­¶­±¤W";
        Text[ turkish ] = "on all pages";
        Text[ arabic ] = "Úáì ßá ÇáÕÝÍÇÊ";
    };
    RadioButton RB_MIRROR_LEFT_PAGES
    {
        Pos = MAP_APPFONT ( 18 , 59 ) ;
        Size = MAP_APPFONT ( 100 , 12 ) ;
        TabStop = TRUE ;
        Text = "auf ~linken Seiten" ;
        Text [ ENGLISH ] = "on even pages" ;
        Text [ english_us ] = "on even pages" ;
        Text[ portuguese ] = "~nas páginas da esquerda";
        Text[ russian ] = "on even pages";
        Text[ greek ] = "óå áñéóôåñÝò óå~ëßäåò";
        Text[ dutch ] = "op e~ven pagina's";
        Text[ french ] = "sur les pages de ~gauche";
        Text[ spanish ] = "on even pages";
        Text[ italian ] = "on even pages";
        Text[ danish ] = "på venstre sider";
        Text[ swedish ] = "på vä~nstersidor";
        Text[ polish ] = "on even pages";
        Text[ portuguese_brazilian ] = "on even pages";
        Text[ japanese ] = "¶Íß°¼Þ‚É";
        Text[ korean ] = "on even pages";
        Text[ chinese_simplified ] = "ÔÚ×ó·½Ò³Ãæ";
        Text[ chinese_traditional ] = "¦b¥ª­¶¤W";
        Text[ turkish ] = "on even pages";
        Text[ arabic ] = "Úáì ÇáÕÝÍÇÊ ÇáÒæÌíÉ";
    };
    RadioButton RB_MIRROR_RIGHT_PAGES
    {
        Pos = MAP_APPFONT ( 18 , 74 ) ;
        Size = MAP_APPFONT ( 100 , 12 ) ;
        TabStop = TRUE ;
        Text = "auf ~rechten Seiten" ;
        Text [ ENGLISH ] = "on odd pages" ;
        Text [ english_us ] = "on odd pages" ;
        Text[ portuguese ] = "nas pág~inas da direita";
        Text[ russian ] = "on odd pages";
        Text[ greek ] = "óå äåîéÝò óåëßäåò";
        Text[ dutch ] = "op o~neven pagina's";
        Text[ french ] = "sur les pages de ~droite";
        Text[ spanish ] = "on odd pages";
        Text[ italian ] = "on odd pages";
        Text[ danish ] = "på højre sider";
        Text[ swedish ] = "på höge~rsidor";
        Text[ polish ] = "on odd pages";
        Text[ portuguese_brazilian ] = "on odd pages";
        Text[ japanese ] = "‰EÍß°¼Þ‚É";
        Text[ korean ] = "on odd pages";
        Text[ chinese_simplified ] = "ÔÚÓÒ·½Ò³Ãæ";
        Text[ chinese_traditional ] = "¦b¥k­¶¤W";
        Text[ turkish ] = "on odd pages";
        Text[ arabic ] = "Úáì ÇáÕÝÍÇÊ ÇáÝÑÏíÉ";
    };

/*  ListBox LB_MIRROR_PAGES
    {
        Pos = MAP_APPFONT ( 22 , 44 ) ;
        Size = MAP_APPFONT ( 55 , 60 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        StringList =
        {
            < "allen" ; > ;
            < "linken" ; > ;
            < "rechten" ; > ;
        };
        StringList [ English ] =
        {
            < "allen" ; > ;
            < "linken" ; > ;
            < "rechten" ; > ;
        };
        stringlist [ english_us ] =
        {
            < "all" ; > ;
            < "even" ; > ;
            < "odd" ; > ;
        };
        stringlist [ portuguese_brazilian ] =
        {
            < "allen" ; > ;
            < "linken" ; > ;
            < "rechten" ; > ;
        };
        stringlist [ swedish ] =
        {
            < "alla" ; > ;
            < "jämna" ; > ;
            < "högra" ; > ;
        };
        stringlist [ danish ] =
        {
            < "alle" ; > ;
            < "venstre" ; > ;
            < "højre" ; > ;
        };
        stringlist [ italian ] =
        {
            < "tutti" ; > ;
            < "pari" ; > ;
            < "dispari" ; > ;
        };
        stringlist [ spanish ] =
        {
            < "Todos" ; > ;
            < "pares" ; > ;
            < "impares" ; > ;
        };
        stringlist [ french ] =
        {
            < "toutes les" ; > ;
            < "paires" ; > ;
            < "impaires" ; > ;
        };
        stringlist [ dutch ] =
        {
            < "alle" ; > ;
            < "linker" ; > ;
            < "rechter" ; > ;
        };
        stringlist [ portuguese ] =
        {
            < "tudo" ; > ;
            < "ímpar" ; > ;
            < "par" ; > ;
        };
    StringList [ chinese_simplified ] =
    {
            < "È«²¿" ; > ;
        < "×ó" ; > ;
        < "ÓÒ" ; > ;
    };
    StringList [ russian ] =
    {
            < "âñåì" ; > ;
        < "íå÷åòíûé" ; > ;
        < "÷åòíûé" ; > ;
    };
    StringList [ polish ] =
    {
            < "wszystkim" ; > ;
        < "parzyste" ; > ;
        < "nieparzyste" ; > ;
    };
    StringList [ japanese ] =
    {
            < "‚·‚ׂÄ" ; > ;
        < "¶" ; > ;
        < "‰E" ; > ;
    };
    StringList [ chinese_traditional ] =
    {
            < "¥þ³¡" ; > ;
        < "¥ª" ; > ;
        < "¥k" ; > ;
    };
    StringList [ arabic ] =
    {
            < "Çáßá" ; > ;
        < "ÇáíÓÑì" ; > ;
        < "Çáíãäì" ; > ;
    };
    StringList [ greek ] =
    {
            < "üëá" ; > ;
        < "áñéóôåñÜ" ; > ;
        < "äåîéÜ" ; > ;
    };
    StringList [ korean ] =
    {
            < "Àüü" ; > ;
        < "¦¼ö" ; > ;
        < "Ȧ¼ö" ; > ;
    };
    StringList [ turkish ] =
    {
            < "tüm" ; > ;
        < "sol" ; > ;
        < "sað" ; > ;
    };
    };
    FixedText FT_MIRROR_PAGES
    {
        Pos = MAP_APPFONT ( 80 , 46 ) ;
        Size = MAP_APPFONT ( 40 , 10 ) ;
        Text = "~Seiten" ;
        Text [ ENGLISH ] = "pages" ;
        Text [ english_us ] = "~pages" ;
        Text [ portuguese_brazilian ] = "~Seiten" ;
        Text [ swedish ] = "~Sidor" ;
        Text [ danish ] = "Sider" ;
        Text [ italian ] = "~Pagine" ;
        Text [ spanish ] = "~páginas" ;
        Text [ french ] = "~pages" ;
        Text [ dutch ] = "~Pagina's" ;
        Text [ portuguese ] = "~Páginas" ;
        Text[ chinese_simplified ] = "ҳ(~P)";
        Text[ russian ] = "Ñòðàíèöû";
        Text[ polish ] = "Strony";
        Text[ japanese ] = "Íß°¼Þ(~P)";
        Text[ chinese_traditional ] = "­¶(~P)";
        Text[ arabic ] = "ÇáÕÝÍÇÊ";
        Text[ greek ] = "Óåëßäåò";
        Text[ korean ] = "ÆäÀÌÁö(~P)";
        Text[ language_user1 ] = "LS 18.11.99 Steht mitten im Satz, muß also nicht in allen Sprachen groß geschrieben werden! - -";
        Text[ turkish ] = "~sayfalarda";
    };
*/  Window WN_BMP
    {
        Pos = MAP_APPFONT ( 120 , 13 ) ;
        Size = MAP_APPFONT ( 127 , 69 ) ;
    };
    GroupBox GB_MIRROR
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 248 , 85 ) ;
        Text = "Spiegeln" ;
        Text [ ENGLISH ] = "Mirror" ;
        Text [ norwegian ] = "Speil" ;
        Text [ italian ] = "Rispecchia" ;
        Text [ portuguese_brazilian ] = "Espelhar" ;
        Text [ portuguese ] = "Reflectir" ;
        Text [ finnish ] = "Peilaa" ;
        Text [ danish ] = "Spejlvend" ;
        Text [ french ] = "Refléter" ;
        Text [ swedish ] = "Spegla" ;
        Text [ dutch ] = "Spiegelen" ;
        Text [ spanish ] = "Reflejar" ;
        Text [ english_us ] = "Flip" ;
        Text[ chinese_simplified ] = "·´Ó³";
        Text[ russian ] = "Îòîáðàçèòü";
        Text[ polish ] = "Przerzuæ";
        Text[ japanese ] = "”½“]";
        Text[ chinese_traditional ] = "¤Ï¬M";
        Text[ arabic ] = "ÇäÚßÇÓ";
        Text[ greek ] = "ÁíáóôñïöÞ";
        Text[ korean ] = "´ëĪ";
        Text[ turkish ] = "Yansýt";
    };
};
String STR_EDIT_GRF
{
    TEXT = "Verknüpfen" ;
    TEXT [ English ] = "Link to" ;
    TEXT [ norwegian ] = "Link to" ;
    TEXT [ italian ] = "Collega" ;
    TEXT [ portuguese_brazilian ] = "Ligação com" ;
    TEXT [ portuguese ] = "Ligar" ;
    TEXT [ finnish ] = "Linkitä:" ;
    TEXT [ danish ] = "Kæd" ;
    TEXT [ french ] = "Lien " ;
    TEXT [ swedish ] = "Länka" ;
    TEXT [ dutch ] = "Koppelen" ;
    TEXT [ spanish ] = "Vincular" ;
    TEXT [ english_us ] = "Link" ;
    TEXT[ chinese_simplified ] = "Á´½Ó";
    TEXT[ russian ] = "Ñâÿçàòü";
    TEXT[ polish ] = "Po³¹cz";
    TEXT[ japanese ] = "ØÝ¸";
    TEXT[ chinese_traditional ] = "±¶®|";
    TEXT[ arabic ] = "ÑÈØ";
    TEXT[ greek ] = "Óýíäåóç";
    TEXT[ korean ] = "¿¬°á";
    TEXT[ turkish ] = "Baðla";
};

TabPage TP_FRM_URL
{
    Hide = TRUE ;
    SVLook = TRUE ;
    HelpID = HID_FRM_URL ;
    Pos = MAP_APPFONT ( 0 , 0 ) ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    FixedText FT_URL
    {
        Pos = MAP_APPFONT ( 13 , 15 ) ;
        Size = MAP_APPFONT ( 30 , 10 ) ;
        Text = "U~RL" ;
        Text [ English ] = "URL" ;
        Text [ dutch ] = "~URL" ;
        Text [ english_us ] = "~URL" ;
        Text [ italian ] = "~URL" ;
        Text [ spanish ] = "~URL" ;
        Text [ french ] = "~URL" ;
        Text [ swedish ] = "U~RL" ;
        Text [ danish ] = "URL" ;
        Text [ portuguese_brazilian ] = "U~RL" ;
        Text [ portuguese ] = "U~RL" ;
        Text[ chinese_simplified ] = "URL(~U)";
        Text[ russian ] = "U~RL";
        Text[ polish ] = "URL";
        Text[ japanese ] = "URL(~U)";
        Text[ chinese_traditional ] = "~URL";
        Text[ arabic ] = "U~RL";
        Text[ greek ] = "URL";
        Text[ korean ] = "~URL";
        Text[ turkish ] = "U~RL";
    };
    Edit ED_URL
    {
        Pos = MAP_APPFONT ( 45 , 14 ) ;
        Size = MAP_APPFONT ( 89 , 12 ) ;
        Left = TRUE ;
        Border = TRUE ;
    };
    FixedText FT_NAME
    {
        Pos = MAP_APPFONT ( 13 , 32 ) ;
        Size = MAP_APPFONT ( 30 , 10 ) ;
        Text = "~Name" ;
        Text [ English ] = "~Name" ;
        Text [ english_us ] = "~Name" ;
        Text [ italian ] = "~Nome" ;
        Text [ spanish ] = "~Nombre" ;
        Text [ french ] = "~Nom" ;
        Text [ dutch ] = "~Naam" ;
        Text [ swedish ] = "~Namn" ;
        Text [ danish ] = "Navn" ;
        Text [ portuguese_brazilian ] = "~Name" ;
        Text [ portuguese ] = "~Nome" ;
        Text[ chinese_simplified ] = "Ãû³Æ(~N)";
        Text[ russian ] = "Èìÿ";
        Text[ polish ] = "Nazwa";
        Text[ japanese ] = "–¼‘O(~N)";
        Text[ chinese_traditional ] = "¦WºÙ(~N)";
        Text[ arabic ] = "ÇáÇÓã";
        Text[ greek ] = "¼íïìá";
        Text[ korean ] = "À̸§(~N)";
        Text[ turkish ] = "~Ad";
    };
    Edit ED_NAME
    {
        Pos = MAP_APPFONT ( 45 , 31 ) ;
        Size = MAP_APPFONT ( 89 , 12 ) ;
        Left = TRUE ;
        Border = TRUE ;
    };
    FixedText FT_FRAME
    {
        Pos = MAP_APPFONT ( 13 , 49 ) ;
        Size = MAP_APPFONT ( 30 , 10 ) ;
        Text = "~Frame" ;
        Text [ English ] = "Frame" ;
        Text [ dutch ] = "~Frame" ;
        Text [ english_us ] = "Frame" ;
        Text [ italian ] = "~Frame" ;
        Text [ spanish ] = "Frame" ;
        Text [ french ] = "~Frame" ;
        Text [ swedish ] = "R~am" ;
        Text [ danish ] = "Frame" ;
        Text [ portuguese_brazilian ] = "~Frame" ;
        Text [ portuguese ] = "~Frame" ;
        Text[ chinese_simplified ] = "¿ò¶ÔÏó";
        Text[ russian ] = "Êàäð";
        Text[ polish ] = "Ramka";
        Text[ japanese ] = "ÌÚ°Ñ";
        Text[ chinese_traditional ] = "°T®Ø";
        Text[ arabic ] = "~Frame";
        Text[ greek ] = "Ðëáßóéï";
        Text[ korean ] = "ÇÁ·¹ÀÓ";
        Text[ turkish ] = "~Frame";
    };
    ComboBox CB_FRAME
    {
        Pos = MAP_APPFONT ( 45 , 48 ) ;
        Size = MAP_APPFONT ( 89 , 50 ) ;
        Left = TRUE ;
        DropDown = TRUE ;
        TabStop = TRUE ;
    };
    PushButton PB_SEARCH
    {
        Pos = MAP_APPFONT ( 140 , 14 ) ;
        Size = MAP_APPFONT ( 50 , 12 ) ;
        TabStop = TRUE ;
        Text = "A~uswählen..." ;
        Text [ English ] = "~Browse..." ;
        Text [ english_us ] = "~Browse..." ;
        Text [ portuguese_brazilian ] = "Durchs~uchen..." ;
        Text [ swedish ] = "Välj ~ut..." ;
        Text [ danish ] = "Gennemse..." ;
        Text [ italian ] = "~Sfoglia..." ;
        Text [ spanish ] = "Selecc~ionar..." ;
        Text [ french ] = "~Parcourir..." ;
        Text [ dutch ] = "Selec~teren..." ;
        Text [ portuguese ] = "~Pesquisar..." ;
        Text[ chinese_simplified ] = "Ñ¡Ôñ(~B)...";
        Text[ russian ] = "Âûáðàòü...";
        Text[ polish ] = "Wybierz...";
        Text[ japanese ] = "‘I‘ð(~B)...";
        Text[ chinese_traditional ] = "¿ï¾Ü(~B)...";
        Text[ arabic ] = "ÇÓÊÚÑÇÖ...";
        Text[ greek ] = "ÅðéëïãÞ...";
        Text[ korean ] = "¼±ÅÃÇϱâ(~B)...";
        Text[ turkish ] = "~Seç...";
    };
    GroupBox GB_HYPERLINK
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 190 , 67 ) ;
        Text = "Hyperlink" ;
        Text [ ENGLISH ] = "Hyperlink" ;
        Text [ english_us ] = "Hyperlink" ;
        Text [ italian ] = "Hyperlink" ;
        Text [ spanish ] = "Hiperenlace" ;
        Text [ french ] = "Hyperlien" ;
        Text [ dutch ] = "Hyperlink" ;
        Text [ swedish ] = "Hyperlänk" ;
        Text [ danish ] = "Hyperlink" ;
        Text [ portuguese_brazilian ] = "Hyperlink" ;
        Text [ portuguese ] = "Hiperligação" ;
        Text[ chinese_simplified ] = "³¬Á´½Ó";
        Text[ russian ] = "Ãèïåðññûëêà";
        Text[ polish ] = "Hiper³¹cze";
        Text[ japanese ] = "ʲÊß°ØÝ¸";
        Text[ chinese_traditional ] = "¶W±¶®|";
        Text[ arabic ] = "ÇÑÊÈÇØ ÊÔÚÈí";
        Text[ greek ] = "Õðåñ-óýíäåóç";
        Text[ korean ] = "ÇÏÀÌÆÛ¸µÅ©";
        Text[ turkish ] = "Hyperlink";
    };
    CheckBox CB_SERVER
    {
        Pos = MAP_APPFONT ( 208 , 14 ) ;
        Size = MAP_APPFONT ( 44 , 12 ) ;
        Text = "~Server" ;
        Text [ ENGLISH ] = "Server" ;
        Text [ english_us ] = "~Server" ;
        Text [ italian ] = "~Server" ;
        Text [ spanish ] = "~Servidor" ;
        Text [ french ] = "~Serveur" ;
        Text [ dutch ] = "~Server" ;
        Text [ swedish ] = "~Server" ;
        Text [ danish ] = "Server" ;
        Text [ portuguese_brazilian ] = "~Server" ;
        Text [ portuguese ] = "~Servidor" ;
        Text[ chinese_simplified ] = "·þÎñÆ÷(~S)";
        Text[ russian ] = "Ñåðâåð";
        Text[ polish ] = "Serwer";
        Text[ japanese ] = "»°ÊÞ°(~S)";
        Text[ chinese_traditional ] = "¦øªA¾¹(~S)";
        Text[ arabic ] = "ÇáãÒæøÏ";
        Text[ greek ] = "ÄéáêïìéóôÞò";
        Text[ korean ] = "¼­¹ö(~S)";
        Text[ turkish ] = "~Sunucu";
    };
    CheckBox CB_CLIENT
    {
        Pos = MAP_APPFONT ( 208 , 31 ) ;
        Size = MAP_APPFONT ( 44 , 12 ) ;
        Text = "~Client" ;
        Text [ ENGLISH ] = "Client" ;
        Text [ dutch ] = "~Cliënt" ;
        Text [ english_us ] = "~Client" ;
        Text [ italian ] = "~Client" ;
        Text [ spanish ] = "~Cliente" ;
        Text [ french ] = "~Client" ;
        Text [ swedish ] = "~Klient" ;
        Text [ danish ] = "Klient" ;
        Text [ portuguese ] = "~Cliente" ;
        Text [ portuguese_brazilian ] = "~Client" ;
        Text[ chinese_simplified ] = "¿Í»§¶Ë(~C)";
        Text[ russian ] = "Êëèåíò";
        Text[ polish ] = "Klient";
        Text[ japanese ] = "¸×²±ÝÄ(~C)";
        Text[ chinese_traditional ] = "¥Î¤áºÝ(~C)";
        Text[ arabic ] = "ÇáÚãíá";
        Text[ greek ] = "ÐåëÜôçò";
        Text[ korean ] = "Ŭ¶óÀ̾ðÆ®(~C)";
        Text[ turkish ] = "~Ýstemci";
    };
    GroupBox GB_IMAGE
    {
        Pos = MAP_APPFONT ( 202 , 3 ) ;
        Size = MAP_APPFONT ( 52 , 67 ) ;
        Text = "Image Map" ;
        Text [ ENGLISH ] = "Image Map" ;
        Text [ dutch ] = "Image Map" ;
        Text [ english_us ] = "Image map" ;
        Text [ italian ] = "Image Map" ;
        Text [ spanish ] = "Image Map" ;
        Text [ french ] = "Image Map" ;
        Text [ swedish ] = "Image Map" ;
        Text [ danish ] = "Image Map" ;
        Text [ portuguese_brazilian ] = "Image Map" ;
        Text [ portuguese ] = "Mapa de imagens" ;
        Text[ chinese_simplified ] = "ͼÏñÓ³Éä";
        Text[ russian ] = "Êàðòà èçîáðàæåíèÿ";
        Text[ polish ] = "Mapa obrazkowa";
        Text[ japanese ] = "²Ò°¼ÞϯÌß";
        Text[ chinese_traditional ] = "¼v¹³¬M®g";
        Text[ arabic ] = "Image map";
        Text[ greek ] = "Image map";
        Text[ korean ] = "À̹ÌÁö ¸Ê";
        Text[ turkish ] = "Resim eþlem";
    };
};
TabPage TP_FRM_ADD
{
    Hide = TRUE ;
    SVLook = TRUE ;
    HelpID = HID_FRM_ADD ;
    Pos = MAP_APPFONT ( 0 , 0 ) ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    FixedText FT_NAME
    {
        Pos = MAP_APPFONT ( 12 , 13 ) ;
        Size = MAP_APPFONT ( 61 , 10 ) ;
        Text = "~Name" ;
        Text [ ENGLISH ] = "Name" ;
        Text [ english_us ] = "~Name" ;
        Text [ italian ] = "~Nome" ;
        Text [ spanish ] = "~Nombre" ;
        Text [ french ] = "~Nom" ;
        Text [ dutch ] = "~Naam" ;
        Text [ swedish ] = "~Namn" ;
        Text [ danish ] = "Navn" ;
        Text [ portuguese_brazilian ] = "~Name" ;
        Text [ portuguese ] = "~Nome" ;
        Text[ chinese_simplified ] = "Ãû³Æ(~N)";
        Text[ russian ] = "Èìÿ";
        Text[ polish ] = "Nazwa";
        Text[ japanese ] = "–¼‘O(~N)";
        Text[ chinese_traditional ] = "¦WºÙ(~N)";
        Text[ arabic ] = "ÇáÇÓã";
        Text[ greek ] = "¼íïìá";
        Text[ korean ] = "À̸§(~N)";
        Text[ turkish ] = "~Ad";
    };
    Edit ED_NAME
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 81 , 12 ) ;
        Size = MAP_APPFONT ( 167 , 12 ) ;
        TabStop = TRUE ;
    };
    FixedText FT_ALT_NAME
    {
        Pos = MAP_APPFONT ( 12 , 27 ) ;
        Size = MAP_APPFONT ( 61 , 10 ) ;
        Text = "~Alternativtext" ;
        Text [ ENGLISH ] = "Alternative text" ;
        Text [ english_us ] = "~Alternative (Text only)" ;
        Text [ italian ] = "Testo ~alternativo" ;
        Text [ spanish ] = "Te~xto alternativo" ;
        Text [ french ] = "~Texte (facultatif)" ;
        Text [ dutch ] = "~Alternatieve tekst" ;
        Text [ swedish ] = "~Alternativtext" ;
        Text [ danish ] = "Alternativtekst" ;
        Text [ portuguese_brazilian ] = "~Alternativtext" ;
        Text [ portuguese ] = "Texto ~alternativo" ;
        Text[ chinese_simplified ] = "¸½¼ÓÎÄ×Ö(~A)";
        Text[ russian ] = "Àëüòåðíàòèâíûé òåêñò";
        Text[ polish ] = "Tekst alternatywny";
        Text[ japanese ] = "‘I‘𕶏‘(~A)";
        Text[ chinese_traditional ] = "ªþ¥[¤å¦r(~A)";
        Text[ arabic ] = "äÕ ÈÏíá";
        Text[ greek ] = "Åí~áëëáêôéêÜ (Ìüíï êåßìåíï)";
        Text[ korean ] = "´ëü (ÅØ½ºÆ®¸¸)(~A)";
        Text[ turkish ] = "~Alternatif metin";
    };
    Edit ED_ALT_NAME
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 81 , 26 ) ;
        Size = MAP_APPFONT ( 167 , 12 ) ;
        TabStop = TRUE ;
    };
    FixedText FT_PREV
    {
        Pos = MAP_APPFONT ( 12 , 41 ) ;
        Size = MAP_APPFONT ( 61 , 10 ) ;
        Text = "~Vorgänger" ;
        Text [ ENGLISH ] = "Previous link" ;
        Text [ english_us ] = "~Previous link" ;
        Text [ portuguese_brazilian ] = "~Vorgänger" ;
        Text [ swedish ] = "Före~gående" ;
        Text [ danish ] = "Overordnet" ;
        Text [ italian ] = "~Precedente" ;
        Text [ spanish ] = "~Anterior" ;
        Text [ french ] = "~Précédent" ;
        Text [ dutch ] = "~Vorganger" ;
        Text [ portuguese ] = "Ligação ~anterior" ;
        Text[ chinese_simplified ] = "ÉÏÒ»¸öÁ´½Ó(~P)";
        Text[ russian ] = "Ïðåäûäóùèé";
        Text[ polish ] = "Poprzednik";
        Text[ japanese ] = "ŽQÆŒ³(~P)";
        Text[ chinese_traditional ] = "¤W¤@­Ó±¶®|(~P)";
        Text[ arabic ] = "ÇáÓÇÈÞ";
        Text[ greek ] = "Ðñïçãïýìåíï";
        Text[ korean ] = "ÀÌÀü ¿¬°á(~P)";
        Text[ turkish ] = "~Önceki";
    };
    Edit ED_PREV
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 81 , 40 ) ;
        Size = MAP_APPFONT ( 167 , 12 ) ;
        TabStop = TRUE ;
        ReadOnly = TRUE ;
    };
    FixedText FT_NEXT
    {
        Pos = MAP_APPFONT ( 12 , 56 ) ;
        Size = MAP_APPFONT ( 61 , 10 ) ;
        Text = "Nach~folger" ;
        Text [ ENGLISH ] = "Next link" ;
        Text [ english_us ] = "~Next link" ;
        Text [ portuguese_brazilian ] = "Nach~folger" ;
        Text [ swedish ] = "~Följande" ;
        Text [ danish ] = "Underordnet" ;
        Text [ italian ] = "~Successivo" ;
        Text [ spanish ] = "~Vínculo siguiente" ;
        Text [ french ] = "Lien suivant" ;
        Text [ dutch ] = "Op~volger" ;
        Text [ portuguese ] = "Ligação ~seguinte" ;
        Text[ chinese_simplified ] = "ÏÂÒ»¸öÁ´½Ó(~N)";
        Text[ russian ] = "Ñëåäóþùàÿ";
        Text[ polish ] = "Nastêpca";
        Text[ japanese ] = "ŽQÆæ(~N)";
        Text[ chinese_traditional ] = "¤U¤@­Ó±¶®|(~N)";
        Text[ arabic ] = "ÇááÇÍÞ";
        Text[ greek ] = "Åðüìåíï";
        Text[ korean ] = "´ÙÀ½ ¿¬°á(~N)";
        Text[ turkish ] = "S~onraki";
    };
    Edit ED_NEXT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 81 , 55 ) ;
        Size = MAP_APPFONT ( 167 , 12 ) ;
        TabStop = TRUE ;
        ReadOnly = TRUE ;
    };
    GroupBox GB_NAME
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 248 , 71 ) ;
        Text = "Namen" ;
        Text [ English ] = "Names" ;
        Text [ english_us ] = "Names" ;
        Text [ italian ] = "Nomi" ;
        Text [ spanish ] = "Nombres" ;
        Text [ french ] = "Noms" ;
        Text [ dutch ] = "Namen" ;
        Text [ swedish ] = "Namn" ;
        Text [ danish ] = "Navne" ;
        Text [ portuguese_brazilian ] = "Namen" ;
        Text [ portuguese ] = "Nomes" ;
        Text[ chinese_simplified ] = "Ãû³Æ";
        Text[ russian ] = "Èìåíà";
        Text[ polish ] = "Nazwy";
        Text[ japanese ] = "–¼‘O";
        Text[ chinese_traditional ] = "¦WºÙ";
        Text[ arabic ] = "ÇáÃÓãÇÁ";
        Text[ greek ] = "Ïíüìáôá";
        Text[ korean ] = "À̸§";
        Text[ turkish ] = "Ad";
    };
    CheckBox CB_PROTECT_CONTENT
    {
        Pos = MAP_APPFONT ( 12 , 90 ) ;
        Size = MAP_APPFONT ( 50 , 10 ) ;
        TabStop = TRUE ;
        Text = "~Inhalt" ;
        Text [ ENGLISH ] = "Content" ;
        Text [ english_us ] = "~Contents" ;
        Text [ portuguese_brazilian ] = "Prot~eger conteúdo" ;
        Text [ swedish ] = "~Innehåll" ;
        Text [ danish ] = "Indhold" ;
        Text [ italian ] = "~Contenuto" ;
        Text [ spanish ] = "~Contenido" ;
        Text [ french ] = "~Contenu" ;
        Text [ dutch ] = "~Inhoud" ;
        Text [ portuguese ] = "~Conteúdo" ;
        Text[ chinese_simplified ] = "ÄÚÈÝ(~C)";
        Text[ russian ] = "Ñîäåðæèìîå";
        Text[ polish ] = "Zawarto~Ͼ";
        Text[ japanese ] = "“à—e(~C)";
        Text[ chinese_traditional ] = "¤º®e(~C)";
        Text[ arabic ] = "ÇáãÍÊæíÇÊ";
        Text[ greek ] = "Ðåñéå÷üìåíá";
        Text[ korean ] = "³»¿ë(~C)";
        Text[ turkish ] = "~Ýçerik";
    };
    CheckBox CB_PROTECT_FRAME
    {
        Pos = MAP_APPFONT ( 12 , 102 ) ;
        Size = MAP_APPFONT ( 50 , 10 ) ;
        TabStop = TRUE ;
        Text = "~Position" ;
        Text [ ENGLISH ] = "Pos~ition" ;
        Text [ english_us ] = "P~osition" ;
        Text [ portuguese_brazilian ] = "Proteger pos~ição" ;
        Text [ swedish ] = "~Position" ;
        Text [ danish ] = "Placering" ;
        Text [ italian ] = "Pos~izione" ;
        Text [ spanish ] = "P~osición" ;
        Text [ french ] = "Pos~ition" ;
        Text [ dutch ] = "Pos~itie" ;
        Text [ portuguese ] = "~Posição" ;
        Text[ chinese_simplified ] = "λÖÃ(~P)";
        Text[ russian ] = "Ïîçèöèÿ";
        Text[ polish ] = "Pozycja";
        Text[ japanese ] = "ˆÊ’u(~P)";
        Text[ chinese_traditional ] = "¦ì¸m(~P)";
        Text[ arabic ] = "ÇáãæÖÚ";
        Text[ greek ] = "ÈÝóç";
        Text[ korean ] = "À§Ä¡(~O)";
        Text[ turkish ] = "K~onum";
    };
    CheckBox CB_PROTECT_SIZE
    {
        Pos = MAP_APPFONT ( 12 , 114 ) ;
        Size = MAP_APPFONT ( 50 , 10 ) ;
        TabStop = TRUE ;
        Text = "~Größe" ;
        Text [ ENGLISH ] = "Size" ;
        Text [ english_us ] = "~Size" ;
        Text [ portuguese_brazilian ] = "Pro~tect Size" ;
        Text [ swedish ] = "~Storlek" ;
        Text [ danish ] = "Størrelse" ;
        Text [ italian ] = "~Dimensione" ;
        Text [ spanish ] = "~Tamaño" ;
        Text [ french ] = "~Taille" ;
        Text [ dutch ] = "~Grootte" ;
        Text [ portuguese ] = "~Tamanho" ;
        Text[ chinese_simplified ] = "´óС(~S)";
        Text[ russian ] = "Ðàçìåð";
        Text[ polish ] = "Rozmiar";
        Text[ japanese ] = "»²½Þ(~S)";
        Text[ chinese_traditional ] = "¤j¤p(~S)";
        Text[ arabic ] = "ÇáÍÌã";
        Text[ greek ] = "ÌÝãåèïò";
        Text[ korean ] = "Å©±â(~S)";
        Text[ turkish ] = "~Boyut";
    };
    GroupBox GB_PROTECT
    {
        Pos = MAP_APPFONT ( 6 , 77 ) ;
        Size = MAP_APPFONT ( 62 , 52 ) ;
        Text = "Schützen" ;
        Text [ English ] = "Protect" ;
        Text [ english_us ] = "Protect" ;
        Text [ portuguese_brazilian ] = "Schützen" ;
        Text [ swedish ] = "Skydda" ;
        Text [ danish ] = "Beskyt" ;
        Text [ italian ] = "Proteggi" ;
        Text [ spanish ] = "Proteger" ;
        Text [ french ] = "Protéger" ;
        Text [ dutch ] = "Beveiligen" ;
        Text [ portuguese ] = "Proteger" ;
        Text[ chinese_simplified ] = "±£»¤";
        Text[ russian ] = "Çàùèòà";
        Text[ polish ] = "Chroñ";
        Text[ japanese ] = "•ÛŒì";
        Text[ chinese_traditional ] = "«OÅ@";
        Text[ arabic ] = "ÍãÇíÉ";
        Text[ greek ] = "Ðñïóôáóßá";
        Text[ korean ] = "º¸È£";
        Text[ turkish ] = "Koru";
    };
    CheckBox CB_EDIT_IN_READONLY
    {
        Pos = MAP_APPFONT ( 80 , 90 ) ;
        Size = MAP_APPFONT ( 162 , 10 ) ;
        Text = "~Editierbar in schreibgeschütztem Dokument" ;
        Text [ ENGLISH ] = "Edit in readonly Document" ;
        Text [ english_us ] = "~Editable in read-only document" ;
        Text [ portuguese_brazilian ] = "Editierbar in schreibgeschütztem Dokument" ;
        Text [ swedish ] = "R~edigerbar i skrivskyddat dokument" ;
        Text [ danish ] = "Redigerbar i skrivebeskyttet dokument" ;
        Text [ italian ] = "Modificabile nel documento a sola lettura" ;
        Text [ spanish ] = "Se puede editar en documentos de solo lectura" ;
        Text [ french ] = "À é~diter dans le document en mode Lecture seule" ;
        Text [ dutch ] = "~Editeerbaar in schrijfbeveiligd document" ;
        Text [ portuguese ] = "~Editável em documento só de leitura" ;
        Text[ chinese_simplified ] = "¿É±à¼­·À¸²Ð´µÄÎĵµ(~E)";
        Text[ russian ] = "Ïðàâêà çàùèùåííîãî îò çàïèñè äîêóìåíòà";
        Text[ polish ] = "Edycja ~mo¿liwa w dokumentach tylko do odczytu";
        Text[ japanese ] = "‘‚«ž‚ݕی앶‘‚ɕҏW‰Â”\\(~E)";
        Text[ chinese_traditional ] = "¥i½s¿è°ßŪ¤å¥ó(~E)";
        Text[ arabic ] = "ÞÇÈá ááÊÍÑíÑ Ýí ãÓÊäÏ ááÞÑÇÁÉ ÝÞØ";
        Text[ greek ] = "Äõíáôüôçôá ~åðåîåñãáóßáò óå Ýããñáöï ôýðïõ \"Ìüíï ãéá áíÜãíùóç\"";
        Text[ korean ] = "ÀбâÀü¿ë ¹®¼­¿¡¼­ ÆíÁý°¡´É(~E)";
        Text[ turkish ] = "Salt okunur belge içinde düzenlenebilir";
    };
    CheckBox CB_PRINT_FRAME
    {
        Pos = MAP_APPFONT ( 80 , 103 ) ;
        Size = MAP_APPFONT ( 70 , 10 ) ;
        Text = "Dru~cken" ;
        Text [ ENGLISH ] = "Print ~frame" ;
        Text [ norwegian ] = "Print ~frame" ;
        Text [ italian ] = "Stampa" ;
        Text [ portuguese_brazilian ] = "Imprimir ~moldura" ;
        Text [ portuguese ] = "Imprimir" ;
        Text [ finnish ] = "Tulosta ~kehys" ;
        Text [ danish ] = "Udskriv" ;
        Text [ french ] = "~Imprimer" ;
        Text [ swedish ] = "Skriv ~ut" ;
        Text [ dutch ] = "Afdru~kken" ;
        Text [ spanish ] = "Im~primir" ;
        Text [ english_us ] = "Prin~t" ;
        Text[ chinese_simplified ] = "´òÓ¡(~P)";
        Text[ russian ] = "Ïå÷àòü";
        Text[ polish ] = "Drukuj";
        Text[ japanese ] = "ˆóü(~P)";
        Text[ chinese_traditional ] = "¦C¦L(~P)";
        Text[ arabic ] = "ØÈÇÚÉ";
        Text[ greek ] = "Åêôýðùóç";
        Text[ korean ] = "Àμâ(~T)";
        Text[ turkish ] = "~Yazdýr";
    };
    GroupBox GB_EXT
    {
        Pos = MAP_APPFONT ( 74 , 77 ) ;
        Size = MAP_APPFONT ( 180 , 52 ) ;
        Text = "Zusätze" ;
        Text [ ENGLISH ] = "Additional Setting" ;
        Text [ english_us ] = "Options" ;
        Text [ italian ] = "Extra" ;
        Text [ spanish ] = "Opciones" ;
        Text [ french ] = "Options" ;
        Text [ dutch ] = "Overige" ;
        Text [ swedish ] = "Tillägg" ;
        Text [ danish ] = "Indstillinger" ;
        Text [ portuguese_brazilian ] = "Zusätze" ;
        Text [ portuguese ] = "Opções" ;
        Text[ chinese_simplified ] = "ÆäËû";
        Text[ russian ] = "Ïàðàìåòðû";
        Text[ polish ] = "Dodatki";
        Text[ japanese ] = "µÌß¼®Ý";
        Text[ chinese_traditional ] = "¨ä¥L";
        Text[ arabic ] = "ÎíÇÑÇÊ";
        Text[ greek ] = "Ðñüóèåôá";
        Text[ korean ] = "¿É¼Ç";
        Text[ turkish ] = "Seçenekler";
    };
};
diff --git a/sw/source/ui/frmdlg/frmui.src b/sw/source/ui/frmdlg/frmui.src
new file mode 100644
index 0000000..b48fabe
--- /dev/null
+++ b/sw/source/ui/frmdlg/frmui.src
@@ -0,0 +1,1388 @@
/*************************************************************************
 *
 *  $RCSfile: frmui.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:38 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#include "frmui.hrc"

/*-----------------------------------------------------------------------
    Beschreibung: V-Align
 -----------------------------------------------------------------------*/
String STR_TOP
{
    TEXT = "~Oben" ;
    TEXT [ English ] = "Top" ;
    TEXT [ norwegian ] = "Top" ;
    TEXT [ italian ] = "Alto" ;
    TEXT [ portuguese_brazilian ] = "Topo" ;
    TEXT [ portuguese ] = "Em cima" ;
    TEXT [ finnish ] = "Ylä" ;
    TEXT [ danish ] = "Foroven" ;
    TEXT [ french ] = "~En haut" ;
    TEXT [ swedish ] = "~Överst" ;
    TEXT [ dutch ] = "~Boven" ;
    TEXT [ spanish ] = "~Arriba" ;
    TEXT [ english_us ] = "~Top" ;
    TEXT[ chinese_simplified ] = "ÉÏ(~T)";
    TEXT[ russian ] = "Ââåðõó";
    TEXT[ polish ] = "Na górze";
    TEXT[ japanese ] = "ã(~T)";
    TEXT[ chinese_traditional ] = "¤W(~T)";
    TEXT[ arabic ] = "ÃÚáì";
    TEXT[ greek ] = "ÐÜíù";
    TEXT[ korean ] = "ˤ(~T)";
    TEXT[ turkish ] = "~Üst";
    TEXT[ language_user1 ] = " ";
};
String STR_BOTTOM
{
    TEXT = "~Unten" ;
    TEXT [ English ] = "Bottom" ;
    TEXT [ norwegian ] = "Bottom" ;
    TEXT [ italian ] = "Basso" ;
    TEXT [ portuguese_brazilian ] = "Base" ;
    TEXT [ portuguese ] = "~Base" ;
    TEXT [ finnish ] = "Ala" ;
    TEXT [ danish ] = "Forneden" ;
    TEXT [ french ] = "En ~bas" ;
    TEXT [ swedish ] = "Nederst" ;
    TEXT [ dutch ] = "~Beneden" ;
    TEXT [ spanish ] = "A~bajo" ;
    TEXT [ english_us ] = "~Bottom" ;
    TEXT[ chinese_simplified ] = "ÏÂ(~B)";
    TEXT[ russian ] = "Âíèçó";
    TEXT[ polish ] = "Na dole";
    TEXT[ japanese ] = "‰º(~B)";
    TEXT[ chinese_traditional ] = "¤U(~B)";
    TEXT[ arabic ] = "ÃÓÝá";
    TEXT[ greek ] = "ÊÜôù";
    TEXT[ korean ] = "¾Æ·¡(~B)";
    TEXT[ turkish ] = "A~ltta";
    TEXT[ language_user1 ] = " ";
};
String STR_CENTER_HORI
{
    TEXT = "~Zentriert" ;
    TEXT [ English ] = "Centered" ;
    TEXT [ norwegian ] = "Centered" ;
    TEXT [ italian ] = "Centrato" ;
    TEXT [ portuguese_brazilian ] = "Centralizado" ;
    TEXT [ portuguese ] = "Centrado" ;
    TEXT [ finnish ] = "Keski" ;
    TEXT [ danish ] = "Centreret" ;
    TEXT [ french ] = "~Centré" ;
    TEXT [ swedish ] = "~Centrerad" ;
    TEXT [ dutch ] = "~Gecentreerd" ;
    TEXT [ spanish ] = "~Centrado" ;
    TEXT [ english_us ] = "~Centered" ;
    TEXT[ chinese_simplified ] = "¾ÓÖÐ(~C)";
    TEXT[ russian ] = "Ïî öåíòðó";
    TEXT[ polish ] = "Wyœrodkuj";
    TEXT[ japanese ] = "’†‰›(~C)";
    TEXT[ chinese_traditional ] = "¸m¤¤(~C)";
    TEXT[ arabic ] = "ÊæÓíØ";
    TEXT[ greek ] = "ÊåíôñáñéóìÝíá";
    TEXT[ korean ] = "°¡¿îµ¥(~C)";
    TEXT[ turkish ] = "~Ortala";
    TEXT[ language_user1 ] = " ";
};
String STR_FROMTOP
{
    TEXT = "Von Oben" ;
    TEXT [ English ] = "From top" ;
    TEXT [ norwegian ] = "From top" ;
    TEXT [ italian ] = "Dall'alto" ;
    TEXT [ portuguese_brazilian ] = "Do topo" ;
    TEXT [ portuguese ] = "De cima" ;
    TEXT [ finnish ] = "Ylhäältä" ;
    TEXT [ danish ] = "Ovenfra" ;
    TEXT [ french ] = "Du haut" ;
    TEXT [ swedish ] = "Uppifrån" ;
    TEXT [ dutch ] = "Van boven" ;
    TEXT [ spanish ] = "Desde arriba" ;
    TEXT [ english_us ] = "From top" ;
    TEXT[ chinese_simplified ] = "´ÓÉÏ";
    TEXT[ russian ] = "Ñâåðõó";
    TEXT[ polish ] = "Z góry";
    TEXT[ japanese ] = "ã‚©‚ç";
    TEXT[ chinese_traditional ] = "±q¤W";
    TEXT[ arabic ] = "ãä ÃÚáì";
    TEXT[ greek ] = "Aðü ðÜíù";
    TEXT[ korean ] = "À§ºÎÅÍ";
    TEXT[ turkish ] = "Üstten";
    TEXT[ language_user1 ] = " ";
};
String STR_FROMBOTTOM
{
    TEXT = "Von Unten" ;
    TEXT [ English ] = "From bottom" ;
    Text [ portuguese ] = "De baixo" ;
    Text [ english_us ] = "From bottom" ;
    Text [ portuguese_brazilian ] = "Von Unten" ;
    Text [ swedish ] = "Nedifrån" ;
    Text [ danish ] = "Nedefra" ;
    Text [ italian ] = "Dal basso" ;
    Text [ spanish ] = "Desde abajo" ;
    Text [ french ] = "Du bas" ;
    Text [ dutch ] = "Van beneden" ;
    Text[ chinese_simplified ] = "´ÓÏÂ";
    Text[ russian ] = "Ñíèçó";
    Text[ polish ] = "Z do³u";
    Text[ japanese ] = "‰º‚©‚ç";
    Text[ chinese_traditional ] = "±q¤U";
    Text[ arabic ] = "ãä ÃÓÝá";
    Text[ greek ] = "Áðü êÜôù";
    Text[ korean ] = "¾Æ·¡ºÎÅÍ";
    Text[ turkish ] = "Alttan";
    Text[ language_user1 ] = " ";
};
String STR_BELOW
{
    TEXT = "Unterhalb" ;
    TEXT [ English ] = "Below" ;
    Text [ portuguese ] = "Abaixo" ;
    Text [ english_us ] = "Below" ;
    Text [ portuguese_brazilian ] = "Unterhalb" ;
    Text [ swedish ] = "Nedanför" ;
    Text [ danish ] = "Nedenfor" ;
    Text [ italian ] = "Al di sotto" ;
    Text [ spanish ] = "Debajo" ;
    Text [ french ] = "Infra" ;
    Text [ dutch ] = "Beneden" ;
    Text[ chinese_simplified ] = "Ö®ÏÂ";
    Text[ russian ] = "Ñíèçó";
    Text[ polish ] = "Poni¿ej";
    Text[ japanese ] = "‰º‚É";
    Text[ chinese_traditional ] = "¤§¤U";
    Text[ arabic ] = "ÃÓÝá";
    Text[ greek ] = "ÊÜôù áðü";
    Text[ korean ] = "¾Æ·¡";
    Text[ turkish ] = "Altta";
    Text[ language_user1 ] = " ";
};
/*-----------------------------------------------------------------------
    Beschreibung: H-Align
 -----------------------------------------------------------------------*/
String STR_LEFT
{
    TEXT = "Links" ;
    TEXT [ English ] = "Left" ;
    TEXT [ norwegian ] = "Left" ;
    TEXT [ italian ] = "Sinistra" ;
    TEXT [ portuguese_brazilian ] = "A Esquerda" ;
    TEXT [ portuguese ] = "Esquerda" ;
    TEXT [ finnish ] = "Vasen" ;
    TEXT [ danish ] = "Venstre" ;
    TEXT [ french ] = "À gauche" ;
    TEXT [ swedish ] = "Vänster" ;
    TEXT [ dutch ] = "Link" ;
    TEXT [ spanish ] = "Izquierda" ;
    TEXT [ english_us ] = "Left" ;
    TEXT[ chinese_simplified ] = "×ó";
    TEXT[ russian ] = "Ñëåâà";
    TEXT[ polish ] = "Z lewej strony";
    TEXT[ japanese ] = "¶";
    TEXT[ chinese_traditional ] = "¥ª";
    TEXT[ arabic ] = "Åáì ÇáíÓÇÑ";
    TEXT[ greek ] = "ÁñéóôåñÜ";
    TEXT[ korean ] = "¿ÞÂÊ";
    TEXT[ turkish ] = "Sol";
    TEXT[ language_user1 ] = " ";
};
String STR_MIR_LEFT
{
    TEXT = "Innen" ;
    TEXT [ English ] = "Inside" ;
    Text [ portuguese ] = "Interior" ;
    Text [ english_us ] = "Inside" ;
    Text [ portuguese_brazilian ] = "Innen" ;
    Text [ swedish ] = "Invändigt" ;
    Text [ danish ] = "Indersiden" ;
    Text [ italian ] = "Interno" ;
    Text [ spanish ] = "Interior" ;
    Text [ french ] = "Intérieur" ;
    Text [ dutch ] = "Binnenin" ;
    Text[ chinese_simplified ] = "ÄÚ";
    Text[ russian ] = "Âíóòðè";
    Text[ polish ] = "Wewn¹trz";
    Text[ japanese ] = "“à‘¤";
    Text[ chinese_traditional ] = "¤º";
    Text[ arabic ] = "ÏÇÎá";
    Text[ greek ] = "ÅóùôåñéêÜ";
    Text[ korean ] = "³»ºÎ";
    Text[ turkish ] = "Ýç";
    Text[ language_user1 ] = " ";
};
String STR_RIGHT
{
    TEXT = "Rechts" ;
    TEXT [ English ] = "Right" ;
    TEXT [ norwegian ] = "Right" ;
    TEXT [ italian ] = "Destra" ;
    TEXT [ portuguese_brazilian ] = "A Direita" ;
    TEXT [ portuguese ] = "Direita" ;
    TEXT [ finnish ] = "Oikea" ;
    TEXT [ danish ] = "Højre" ;
    TEXT [ french ] = "À droite" ;
    TEXT [ swedish ] = "Höger" ;
    TEXT [ dutch ] = "Rechts" ;
    TEXT [ spanish ] = "Derecha" ;
    TEXT [ english_us ] = "Right" ;
    TEXT[ chinese_simplified ] = "ÓÒ";
    TEXT[ russian ] = "Ñïðàâà";
    TEXT[ polish ] = "Z prawej";
    TEXT[ japanese ] = "‰E";
    TEXT[ chinese_traditional ] = "¥k";
    TEXT[ arabic ] = "Åáì Çáíãíä";
    TEXT[ greek ] = "ÄåîéÜ";
    TEXT[ korean ] = "¿À¸¥ÂÊ";
    TEXT[ turkish ] = "Sað";
    TEXT[ language_user1 ] = " ";
};
String STR_MIR_RIGHT
{
    TEXT = "Außen" ;
    TEXT [ English ] = "Outside" ;
    TEXT [ norwegian ] = "Outside" ;
    TEXT [ italian ] = "Esterno" ;
    TEXT [ portuguese_brazilian ] = "Fora" ;
    TEXT [ portuguese ] = "Exterior" ;
    TEXT [ finnish ] = "Ulkopuoli" ;
    TEXT [ danish ] = "Ydersiden" ;
    TEXT [ french ] = "Extérieur" ;
    TEXT [ swedish ] = "Utsida" ;
    TEXT [ dutch ] = "Buiten" ;
    TEXT [ spanish ] = "Exterior" ;
    TEXT [ english_us ] = "Outside" ;
    TEXT[ chinese_simplified ] = "Íâ²à";
    TEXT[ russian ] = "Ñíàðóæè";
    TEXT[ polish ] = "Na zewn¹trz";
    TEXT[ japanese ] = "ŠO‘¤";
    TEXT[ chinese_traditional ] = "¥~°¼";
    TEXT[ arabic ] = "ÎÇÑÌ";
    TEXT[ greek ] = "ÅîùôåñéêÜ";
    TEXT[ korean ] = "¿ÜºÎ";
    TEXT[ turkish ] = "Dýþ";
    TEXT[ language_user1 ] = " ";
};
String STR_CENTER_VERT
{
    TEXT = "~Mitte" ;
    Text [ English ] = "~Middle" ;
    Text [ portuguese ] = "~Centro" ;
    Text [ english_us ] = "C~enter" ;
    Text [ portuguese_brazilian ] = "~Mitte" ;
    Text [ swedish ] = "~Mitten" ;
    Text [ danish ] = "Centreret" ;
    Text [ italian ] = "Centro" ;
    Text [ spanish ] = "~Centro" ;
    Text [ french ] = "~Milieu" ;
    Text [ dutch ] = "~Midden" ;
    Text[ chinese_simplified ] = "ÖÐ(~E)";
    Text[ russian ] = "Ñåðåäèíà";
    Text[ polish ] = "Wyœrodkuj";
    Text[ japanese ] = "’†S(~E)";
    Text[ chinese_traditional ] = "¸m¤¤(~E)";
    Text[ arabic ] = "ÇáæÓØ";
    Text[ greek ] = "ÊÝíôñï";
    Text[ korean ] = "°¡¿îµ¥(~E)";
    Text[ turkish ] = "O~rta";
    Text[ language_user1 ] = " ";
};
String STR_FROMLEFT
{
    TEXT = "Von Links" ;
    TEXT [ English ] = "From left" ;
    TEXT [ norwegian ] = "From left" ;
    TEXT [ italian ] = "Da sinistra" ;
    TEXT [ portuguese_brazilian ] = "Da esquerda" ;
    TEXT [ portuguese ] = "Esquerda" ;
    TEXT [ finnish ] = "Vasemmalta" ;
    TEXT [ danish ] = "Fra venstre" ;
    TEXT [ french ] = "De gauche" ;
    TEXT [ swedish ] = "Från vänster" ;
    TEXT [ dutch ] = "Van links" ;
    TEXT [ spanish ] = "De izquierda" ;
    TEXT [ english_us ] = "From left" ;
    TEXT[ chinese_simplified ] = "´Ó×ó";
    TEXT[ russian ] = "Ñëåâà";
    TEXT[ polish ] = "Z lewej";
    TEXT[ japanese ] = "¶‚©‚ç";
    TEXT[ chinese_traditional ] = "±q¥ª";
    TEXT[ arabic ] = "ãä ÇáíÓÇÑ";
    TEXT[ greek ] = "Aðü áñéóôåñÜ";
    TEXT[ korean ] = "¿ÞÂÊ¿¡¼­ ºÎÅÍ";
    TEXT[ turkish ] = "Soldan";
    TEXT[ language_user1 ] = " ";
};
String STR_MIR_FROMLEFT
{
    TEXT = "Von Innen" ;
    TEXT [ English ] = "From inside" ;
    Text [ portuguese ] = "Do interior" ;
    Text [ english_us ] = "From inside" ;
    Text [ portuguese_brazilian ] = "Von Innen" ;
    Text [ swedish ] = "Inifrån" ;
    Text [ danish ] = "Indefra" ;
    Text [ italian ] = "Dall'interno" ;
    Text [ spanish ] = "Desde el interior" ;
    Text [ french ] = "De l'intérieur" ;
    Text [ dutch ] = "Van binnen" ;
    Text[ chinese_simplified ] = "´ÓÄÚ";
    Text[ russian ] = "Âíóòðè";
    Text[ polish ] = "Od œrodka";
    Text[ japanese ] = "“à‘¤‚©‚ç";
    Text[ chinese_traditional ] = "±q¤º";
    Text[ arabic ] = "ãä ÇáÏÇÎá";
    Text[ greek ] = "Áðü åóùôåñéêü";
    Text[ korean ] = "¾È¿¡¼­ ºÎÅÍ";
    Text[ turkish ] = "Ýçerden";
    Text[ language_user1 ] = " ";
};
/*-----------------------------------------------------------------------
    Beschreibung: V-Rel
 -----------------------------------------------------------------------*/
String STR_REL_BORDER
{
    TEXT = "Rand" ;
    TEXT [ English ] = "Border" ;
    Text [ portuguese ] = "Margem" ;
    Text [ english_us ] = "Margin" ;
    Text [ portuguese_brazilian ] = "Rand" ;
    Text [ swedish ] = "Marginal" ;
    Text [ danish ] = "Margen" ;
    Text [ italian ] = "Margine" ;
    Text [ spanish ] = "Margen" ;
    Text [ french ] = "Marge" ;
    Text [ dutch ] = "Marge" ;
    Text[ chinese_simplified ] = "Ò³±ß¾à";
    Text[ russian ] = "Ïîëå";
    Text[ polish ] = "Margines";
    Text[ japanese ] = "—]”’";
    Text[ chinese_traditional ] = "̊ƒ";
    Text[ arabic ] = "ÇáåÇãÔ";
    Text[ greek ] = "Ðåñéèþñéï";
    Text[ korean ] = "¿©¹é";
    Text[ turkish ] = "Kenar";
    Text[ language_user1 ] = " ";
};
String STR_REL_PRTAREA
{
    TEXT = "Textbereich" ;
    TEXT [ English ] = "Text area" ;
    Text [ portuguese ] = "Área de texto" ;
    Text [ english_us ] = "Text area" ;
    Text [ portuguese_brazilian ] = "Textbereich" ;
    Text [ swedish ] = "Textområde" ;
    Text [ danish ] = "Tekstområde" ;
    Text [ italian ] = "Area del testo" ;
    Text [ spanish ] = "Área de texto " ;
    Text [ french ] = "Zone de texte" ;
    Text [ dutch ] = "Tekstbereik" ;
    Text[ chinese_simplified ] = "ÎÄ×ÖÇøÓò";
    Text[ russian ] = "Îáëàñòü òåêñòà";
    Text[ polish ] = "Obszar tekstu";
    Text[ japanese ] = "•¶‘”͈Í";
    Text[ chinese_traditional ] = "¤å¦r°Ï°ì";
    Text[ arabic ] = "äØÇÞ ÇáäÕ";
    Text[ greek ] = "Ðåñéï÷Þ êåéìÝíïõ";
    Text[ korean ] = "ÅØ½ºÆ® ¿µ¿ª";
    Text[ turkish ] = "Metin alaný";
    Text[ language_user1 ] = " ";
};
String STR_TOPPRT
{
    TEXT = "Oberer Rand" ;
    TEXT [ English ] = "Border Top" ;
    TEXT [ norwegian ] = "Border Top" ;
    TEXT [ italian ] = "Bordo superiore" ;
    TEXT [ portuguese_brazilian ] = "Topo da margem" ;
    TEXT [ portuguese ] = "Margem superior" ;
    TEXT [ finnish ] = "Yläreunaviiva" ;
    TEXT [ danish ] = "Topmargen" ;
    TEXT [ french ] = "Marge supérieure" ;
    TEXT [ swedish ] = "Övre marginal" ;
    TEXT [ dutch ] = "Bovenrand" ;
    TEXT [ spanish ] = "Margen superior" ;
    TEXT [ english_us ] = "Upper Margin" ;
    TEXT[ chinese_simplified ] = "ÉÏ·½Ò³±ß¾à";
    TEXT[ russian ] = "Âåðõíèé êðàé";
    TEXT[ polish ] = "Górny margines";
    TEXT[ japanese ] = "ã—]”’";
    TEXT[ chinese_traditional ] = "¤WÃä¬É";
    TEXT[ arabic ] = "ÇáåÇãÔ ÇáÚáæí";
    TEXT[ greek ] = "¢íù ðåñéèþñéï";
    TEXT[ korean ] = "À§ÂÊ ¿©¹é";
    TEXT[ turkish ] = "Üst kenar";
    TEXT[ language_user1 ] = " ";
};
/*-----------------------------------------------------------------------
    Beschreibung: H-Rel
 -----------------------------------------------------------------------*/
String STR_FLY_REL_PG_LEFT
{
    TEXT = "Rahmenrand links" ;
    TEXT [ English ] = "Left frame border" ;
    Text [ portuguese ] = "Contorno esquerdo da moldura" ;
    Text [ english_us ] = "Left frame border" ;
    Text [ portuguese_brazilian ] = "Rahmenrand links" ;
    Text [ swedish ] = "Vänster rammarginal" ;
    Text [ danish ] = "Venstre rammekant" ;
    Text [ italian ] = "Margine cornice sinistro" ;
    Text [ spanish ] = "Borde izquierdo del marco" ;
    Text [ french ] = "Bordure de cadre gauche" ;
    Text [ dutch ] = "Kaderrand links" ;
    Text[ chinese_simplified ] = "×ó¿ò±ß";
    Text[ russian ] = "Ëåâûé êðàé ðàìêè";
    Text[ polish ] = "Lewa krawêdŸ ramki";
    Text[ japanese ] = "¶—]”’";
    Text[ chinese_traditional ] = "¥ª®ØÃä";
    Text[ arabic ] = "åÇãÔ ÇáÅØÇÑ ÇáÃíÓÑ";
    Text[ greek ] = "Ðåñéèþñéï ðëáéóßïõ - áñéóôåñÜ";
    Text[ korean ] = "¿ÞÂÊ ÇÁ·¹ÀÓ ¿Ü°û¼±";
    Text[ turkish ] = "Sol çerçeve kenarý";
    Text[ language_user1 ] = " ";
};
String STR_FLY_MIR_REL_PG_LEFT
{
    TEXT = "Rahmenrand innen" ;
    TEXT [ English ] = "Inner frame border" ;
    Text [ portuguese ] = "Contorno interior da moldura" ;
    Text [ english_us ] = "Inner frame border" ;
    Text [ portuguese_brazilian ] = "Rahmenrand innen" ;
    Text [ swedish ] = "Invändig rammarginal" ;
    Text [ danish ] = "Indre rammekant" ;
    Text [ italian ] = "Margine cornice interno" ;
    Text [ spanish ] = "Borde interior del marco" ;
    Text [ french ] = "Bordure de cadre intérieure" ;
    Text [ dutch ] = "Binnenste kaderrand" ;
    Text[ chinese_simplified ] = "¿ò±ßÄÚÔò";
    Text[ russian ] = "Âíóòðåííèé êðàé ðàìêè";
    Text[ polish ] = "Wewnêtrzna krawêdŸ ramki";
    Text[ japanese ] = "—]”’ “à‘¤";
    Text[ chinese_traditional ] = "®ØÃ䤺«h";
    Text[ arabic ] = "åÇãÔ ÇáÅØÇÑ ÇáÏÇÎáí";
    Text[ greek ] = "Ðåñéèþñéï ðëáéóßïõ - åóùôåñéêÜ";
    Text[ korean ] = "³»ºÎ ÇÁ·¹ÀÓ ¿Ü°û¼±";
    Text[ turkish ] = "Ýç çerçeve kenarý";
    Text[ language_user1 ] = " ";
};
String STR_FLY_REL_PG_RIGHT
{
    TEXT = "Rahmenrand rechts" ;
    TEXT [ English ] = "Right frame border" ;
    Text [ portuguese ] = "Contorno direito da moldura" ;
    Text [ english_us ] = "Right frame border" ;
    Text [ portuguese_brazilian ] = "Rahmenrand rechts" ;
    Text [ swedish ] = "Höger rammarginal" ;
    Text [ danish ] = "Højre rammekant" ;
    Text [ italian ] = "Margine cornice destro" ;
    Text [ spanish ] = "Borde derecho del marco" ;
    Text [ french ] = "Bordure de cadre droite" ;
    Text [ dutch ] = "Kaderrand rechts" ;
    Text[ chinese_simplified ] = "ÓÒ¿ò±ß";
    Text[ russian ] = "Ïðàâûé êðàé ðàìêè";
    Text[ polish ] = "Prawa krawêdŸ ramki";
    Text[ japanese ] = "‰E—]”’";
    Text[ chinese_traditional ] = "¥k®ØÃä";
    Text[ arabic ] = "åÇãÔ ÇáÅØÇÑ ÇáÃíãä";
    Text[ greek ] = "Ðåñéèþñéï ðëáéóßïõ - äåîéÜ";
    Text[ korean ] = "¿À¸¥ÂÊ ÇÁ·¹ÀÓ ¿Ü°û¼±";
    Text[ turkish ] = "Sað çerçeve kenarý";
    Text[ language_user1 ] = " ";
};
String STR_FLY_MIR_REL_PG_RIGHT
{
    TEXT = "Rahmenrand außen" ;
    TEXT [ English ] = "Outer frame border" ;
    Text [ portuguese ] = "Contorno exterior da moldura" ;
    Text [ english_us ] = "Outer frame border" ;
    Text [ portuguese_brazilian ] = "Rahmenrand außen" ;
    Text [ swedish ] = "Utvändig rammarginal" ;
    Text [ danish ] = "Ydre rammekant" ;
    Text [ italian ] = "Margine cornice esterno" ;
    Text [ spanish ] = "Borde exterior del marco" ;
    Text [ french ] = "Bordure de cadre extérieure" ;
    Text [ dutch ] = "Buitenste kaderrand" ;
    Text[ chinese_simplified ] = "¿ò±ßÍâ²à";
    Text[ russian ] = "Íàðóæíûé êðàé ðàìêè";
    Text[ polish ] = "Zewnêtrzna krawêdŸ ramki";
    Text[ japanese ] = "—]”’ ŠO‘¤";
    Text[ chinese_traditional ] = "®ØÃä¥~°¼";
    Text[ arabic ] = "åÇãÔ ÇáÅØÇÑ ÇáÎÇÑÌí";
    Text[ greek ] = "Ðåñéèþñéï ðëáéóßïõ - åîùôåñéêÜ";
    Text[ korean ] = "¿ÜºÎ ÇÁ·¹ÀÓ ¿Ü°û¼±";
    Text[ turkish ] = "Dýþ çerçeve kenarý";
    Text[ language_user1 ] = " ";
};
String STR_FLY_REL_PG_FRAME
{
    TEXT = "Gesamter Rahmen" ;
    TEXT [ English ] = "Whole frame" ;
    Text [ portuguese ] = "Moldura inteira" ;
    Text [ english_us ] = "Entire frame" ;
    Text [ portuguese_brazilian ] = "Gesamter Rahmen" ;
    Text [ swedish ] = "Hela ramen" ;
    Text [ danish ] = "Hele rammen" ;
    Text [ italian ] = "Intera cornice" ;
    Text [ spanish ] = "Marco entero" ;
    Text [ french ] = "Cadre entier" ;
    Text [ dutch ] = "Compleet kader" ;
    Text[ chinese_simplified ] = "Õû¸ö¿ò";
    Text[ russian ] = "Âñÿ ðàìêà";
    Text[ polish ] = "Ca³a ramka";
    Text[ japanese ] = "˜g‘S‘Ì";
    Text[ chinese_traditional ] = "¾ã­Ó®Ø";
    Text[ arabic ] = "ÇáÅØÇÑ ÈÃßãáå";
    Text[ greek ] = "Ïëüêëçñï ðëáßóéï";
    Text[ korean ] = "Àüü ÇÁ·¹ÀÓ";
    Text[ turkish ] = "Çerçevenin tümü";
    Text[ language_user1 ] = " ";
};
String STR_FLY_REL_PG_PRTAREA
{
    TEXT = "Rahmentextbereich" ;
    TEXT [ English ] = "Frame text area" ;
    Text [ portuguese ] = "Área da moldura para texto" ;
    Text [ english_us ] = "Frame text area" ;
    Text [ portuguese_brazilian ] = "Rahmentextbereich" ;
    Text [ swedish ] = "Ramtextområde" ;
    Text [ danish ] = "Rammetekstområde" ;
    Text [ italian ] = "Area del testo della cornice" ;
    Text [ spanish ] = "Área de texto del marco" ;
    Text [ french ] = "Zone de texte de cadre" ;
    Text [ dutch ] = "Kadertekstbereik" ;
    Text[ chinese_simplified ] = "¿òÄÚÎÄ×ÖÇø";
    Text[ russian ] = "Îáëàñòü òåêñòîâîé ðàìêè";
    Text[ polish ] = "Obszar tekstu ramki";
    Text[ japanese ] = "˜g•t‚¯”͈Í";
    Text[ chinese_traditional ] = "®Ø¤º¤å¦r°Ï";
    Text[ arabic ] = "äØÇÞ äÕ ÇáÅØÇÑ";
    Text[ greek ] = "Ðåñéï÷Þ êåéìÝíïõ ôïõ ðëáéóßïõ";
    Text[ korean ] = "ÇÁ·¹ÀÓ ÅØ½ºÆ® ¿µ¿ª";
    Text[ turkish ] = "Çerçeve metin alaný";
    Text[ language_user1 ] = " ";
};
String STR_FRAME
{
    TEXT = "Absatzbereich" ;
    TEXT [ English ] = "Paragraph area" ;
    Text [ portuguese ] = "Área de parágrafo" ;
    Text [ english_us ] = "Paragraph area" ;
    Text [ portuguese_brazilian ] = "Absatzbereich" ;
    Text [ swedish ] = "Styckeområde" ;
    Text [ danish ] = "Afsnitsområde" ;
    Text [ italian ] = "Area del paragrafo" ;
    Text [ spanish ] = "Área de párrafo" ;
    Text [ french ] = "Zone de paragraphe" ;
    Text [ dutch ] = "Alineabereik" ;
    Text[ chinese_simplified ] = "¶ÎÂäÇøÓò";
    Text[ russian ] = "Îáëàñòü àáçàöà";
    Text[ polish ] = "Obszar akapitu";
    Text[ japanese ] = "’i—Ž”ÍˆÍ";
    Text[ chinese_traditional ] = "¬q¸¨°Ï°ì";
    Text[ arabic ] = "äØÇÞ ÇáÝÞÑÉ";
    Text[ greek ] = "Ðåñéï÷Þ ðáñáãñÜöïõ";
    Text[ korean ] = "´Ü¶ô ¿µ¿ª";
    Text[ turkish ] = "Paragraf bölümü";
    Text[ language_user1 ] = " ";
};
String STR_PRTAREA
{
    TEXT = "Absatztextbereich" ;
    TEXT [ English ] = "Text area of paragraph" ;
    Text [ portuguese ] = "Área de texto do parágrafo " ;
    Text [ english_us ] = "Paragraph text area" ;
    Text [ portuguese_brazilian ] = "Absatztextbereich" ;
    Text [ swedish ] = "Textområde i stycke" ;
    Text [ danish ] = "Afsnitstekstområde" ;
    Text [ italian ] = "Area del testo del paragrafo" ;
    Text [ spanish ] = "Área de texto del párrafo" ;
    Text [ french ] = "Zone de texte de paragraphe" ;
    Text [ dutch ] = "Alineatekstbereik" ;
    Text[ chinese_simplified ] = "¶ÎÂäÎÄ×ÖÇøÓò";
    Text[ russian ] = "Îáëàñòü òåêñòîâîãî àáçàöà";
    Text[ polish ] = "Obszar tekstu w akapicie";
    Text[ japanese ] = "’i—Ž‚Ì÷½Ä”͈Í";
    Text[ chinese_traditional ] = "¬q¸¨¤å¦r°Ï°ì";
    Text[ arabic ] = "äØÇÞ äÕ ÇáÝÞÑÉ";
    Text[ greek ] = "Ðåñéï÷Þ êåéìÝíïõ ðáñáãñÜöïõ";
    Text[ korean ] = "´Ü¶ô ÅØ½ºÆ® ¿µ¿ª";
    Text[ turkish ] = "Paragraf metin alaný";
    Text[ language_user1 ] = " ";
};
String STR_REL_PG_LEFT
{
    TEXT = "Seitenrand links" ;
    TEXT [ English ] = "Left page border" ;
    Text [ portuguese ] = "Margem esquerda do parágrafo" ;
    Text [ english_us ] = "Left page border" ;
    Text [ portuguese_brazilian ] = "Seitenrand links" ;
    Text [ swedish ] = "Vänster sidmarginal" ;
    Text [ danish ] = "Venstre siderand" ;
    Text [ italian ] = "Margine paragrafo sinistro" ;
    Text [ spanish ] = "Margen izquierdo de la página" ;
    Text [ french ] = "Marge à gauche" ;
    Text [ dutch ] = "Paginarand links" ;
    Text[ chinese_simplified ] = "×ó·½Ò³±ß¾à";
    Text[ russian ] = "Ëåâûé êðàé ñòðàíèöû";
    Text[ polish ] = "Lewy margines strony";
    Text[ japanese ] = "Íß°¼Þ—]”’ ¶";
    Text[ chinese_traditional ] = "¥ªÃä¬É";
    Text[ arabic ] = "åÇãÔ ÇáÕÝÍÉ ÇáÃíÓÑ";
    Text[ greek ] = "Ðåñéèþñéï óåëßäáò - áñéóôåñÜ";
    Text[ korean ] = "¿ÞÂÊ ÆäÀÌÁö ¿Ü°û¼±";
    Text[ turkish ] = "Sol sayfa kenarý";
    Text[ language_user1 ] = " ";
};
String STR_MIR_REL_PG_LEFT
{
    TEXT = "Seitenrand innen" ;
    TEXT [ English ] = "Inner page border" ;
    Text [ portuguese ] = "Margem interior da página" ;
    Text [ english_us ] = "Inner page border" ;
    Text [ portuguese_brazilian ] = "Seitenrand innen" ;
    Text [ swedish ] = "Invändig sidmarginal" ;
    Text [ danish ] = "Indre siderand" ;
    Text [ italian ] = "Margine pagina interno" ;
    Text [ spanish ] = "Margen interior de la página" ;
    Text [ french ] = "Marge intérieure" ;
    Text [ dutch ] = "Binnenste zijrand" ;
    Text[ chinese_simplified ] = "ÄÚ²àÒ³±ß¾à";
    Text[ russian ] = "Âíóòðåííèé êðàé ñòðàíèöû";
    Text[ polish ] = "Wewnêrzny margines strony";
    Text[ japanese ] = "Íß°¼Þ—]”’ “à‘¤";
    Text[ chinese_traditional ] = "Ãä¬É¤º°¼";
    Text[ arabic ] = "åÇãÔ ÇáÕÝÍÉ ÇáÏÇÎáí";
    Text[ greek ] = "Ðåñéèþñéï óåëßäáò - åóùôåñéêÜ";
    Text[ korean ] = "³»ºÎ ÆäÀÌÁö ¿Ü°û¼±";
    Text[ turkish ] = "Sayfa kenarý (iç)";
    Text[ language_user1 ] = " ";
};
String STR_REL_PG_RIGHT
{
    TEXT = "Seitenrand rechts" ;
    TEXT [ English ] = "Right page border" ;
    Text [ portuguese ] = "Margem direita da página" ;
    Text [ english_us ] = "Right page border" ;
    Text [ portuguese_brazilian ] = "Seitenrand rechts" ;
    Text [ swedish ] = "Höger sidmarginal" ;
    Text [ danish ] = "Højre siderand" ;
    Text [ italian ] = "Margine pagina destro" ;
    Text [ spanish ] = "Margen derecho de la página" ;
    Text [ french ] = "Marge à droite" ;
    Text [ dutch ] = "Paginarand rechts" ;
    Text[ chinese_simplified ] = "ÓÒÒ³Ãæ¿Õ°×";
    Text[ russian ] = "Ïðàâûé êðàé ñòðàíèöû";
    Text[ polish ] = "Prawy margines strony";
    Text[ japanese ] = "Íß°¼Þ—]”’ ‰E";
    Text[ chinese_traditional ] = "¥k­¶­±ªÅ¥Õ";
    Text[ arabic ] = "åÇãÔ ÇáÕÝÍÉ ÇáÃíãä";
    Text[ greek ] = "Ðåñéèþñéï óåëßäáò - äåîéÜ";
    Text[ korean ] = "¿À¸¥ÂÊ ÆäÀÌÁö ¿Ü°û¼±";
    Text[ turkish ] = "Sað sayfa kenarý";
    Text[ language_user1 ] = " ";
};
String STR_MIR_REL_PG_RIGHT
{
    TEXT = "Seitenrand außen" ;
    TEXT [ English ] = "Outer page border" ;
    Text [ portuguese ] = "Margem exterior da página" ;
    Text [ english_us ] = "Outer page border" ;
    Text [ portuguese_brazilian ] = "Seitenrand außen" ;
    Text [ swedish ] = "Utvändig sidmarginal" ;
    Text [ danish ] = "Ydre siderand" ;
    Text [ italian ] = "Margine pagina esterno" ;
    Text [ spanish ] = "Margen exterior de la página" ;
    Text [ french ] = "Marge extérieure" ;
    Text [ dutch ] = "Buitenste zijrand" ;
    Text[ chinese_simplified ] = "Íâ²àÒ³±ß¾à";
    Text[ russian ] = "Íàðóæíûé êðàé ñòðàíèöû";
    Text[ polish ] = "Zewnêtrzny margines strony";
    Text[ japanese ] = "Íß°¼Þ—]”’ ŠO‘¤";
    Text[ chinese_traditional ] = "Ãä¬É¥~°¼";
    Text[ arabic ] = "åÇãÔ ÇáÕÝÍÉ ÇáÎÇÑÌí";
    Text[ greek ] = "Ðåñéèþñéï óåëßäáò - åîùôåñéêÜ";
    Text[ korean ] = "¿ÜºÎ ÆäÀÌÁö ¿Ü°û¼±";
    Text[ turkish ] = "Sayfa kenarý (dýþ)";
    Text[ language_user1 ] = " ";
};
String STR_REL_FRM_LEFT
{
    TEXT = "Absatzrand links" ;
    TEXT [ English ] = "Left paragraph border" ;
    Text [ portuguese ] = "Margem esquerda do parágrafo" ;
    Text [ english_us ] = "Left paragraph border" ;
    Text [ portuguese_brazilian ] = "Absatzrand links" ;
    Text [ swedish ] = "Vänster styckemarginal" ;
    Text [ danish ] = "Venstre afsnitsrand" ;
    Text [ italian ] = "Margine paragrafo sinistro" ;
    Text [ spanish ] = "Margen izquierdo del párrafo" ;
    Text [ french ] = "Marge de paragraphe gauche" ;
    Text [ dutch ] = "Alinearand links" ;
    Text[ chinese_simplified ] = "×ó¶ÎÂäÒ³±ß";
    Text[ russian ] = "Ëåâûé êðàé àáçàöà";
    Text[ polish ] = "Lewy margines akapitu";
    Text[ japanese ] = "’i—Ž—]”’ ¶";
    Text[ chinese_traditional ] = "¥ª¬q¸¨­¶Ãä";
    Text[ arabic ] = "åÇãÔ ÇáÝÞÑÉ ÇáÃíÓÑ";
    Text[ greek ] = "Ðåñéèþñéï ðáñáãñÜöïõ - áñéóôåñÜ";
    Text[ korean ] = "¿ÞÂÊ ´Ü¶ô ¿Ü°û¼±";
    Text[ turkish ] = "Paragraf kenarý (sol)";
    Text[ language_user1 ] = " ";
};
String STR_MIR_REL_FRM_LEFT
{
    TEXT = "Absatzrand innen" ;
    TEXT [ English ] = "Inner paragraph border" ;
    Text [ portuguese ] = "Margem interior do parágrafo" ;
    Text [ english_us ] = "Inner paragraph border" ;
    Text [ portuguese_brazilian ] = "Absatzrand innen" ;
    Text [ swedish ] = "Inre styckemarginal" ;
    Text [ danish ] = "Indre afsnitsrand" ;
    Text [ italian ] = "Margine paragrafo interno" ;
    Text [ spanish ] = "Margen interior del párrafo" ;
    Text [ french ] = "Marge de paragraphe intérieure" ;
    Text [ dutch ] = "Binnenste alinearand" ;
    Text[ chinese_simplified ] = "¼ä¸ôÄÚ±ß";
    Text[ russian ] = "Âíóòðåííèé êðàé àáçàöà";
    Text[ polish ] = "Wewnêtrzny margines akapitu";
    Text[ japanese ] = "’i—Ž—]”’ “à‘¤";
    Text[ chinese_traditional ] = "¶¡¹j¤ºÃä";
    Text[ arabic ] = "åÇãÔ ÇáÝÞÑÉ ÇáÏÇÎáí";
    Text[ greek ] = "Ðåñéèþñéï ðáñáãñÜöïõ - åóùôåñéêÜ";
    Text[ korean ] = "³»ºÎ ´Ü¶ô °æ°è¼±";
    Text[ turkish ] = "Paragraf kenarý (iç)";
    Text[ language_user1 ] = " ";
};
String STR_REL_FRM_RIGHT
{
    TEXT = "Absatzrand rechts" ;
    TEXT [ English ] = "Right paragraph border" ;
    Text [ portuguese ] = "Margem direita do parágrafo" ;
    Text [ english_us ] = "Right paragraph border" ;
    Text [ portuguese_brazilian ] = "Absatzrand rechts" ;
    Text [ swedish ] = "Höger styckemarginal" ;
    Text [ danish ] = "Højre afsnitsrand" ;
    Text [ italian ] = "Margine paragrafo destro" ;
    Text [ spanish ] = "Margen derecho del párrafo" ;
    Text [ french ] = "Marge de paragraphe droite" ;
    Text [ dutch ] = "Alinearand rechts" ;
    Text[ chinese_simplified ] = "ÓÒ¶ÎÂäÒ³±ß";
    Text[ russian ] = "Ïðàâûé êðàé àáçàöà";
    Text[ polish ] = "Prawy margines akapitu";
    Text[ japanese ] = "’i—Ž—]”’ ‰E";
    Text[ chinese_traditional ] = "¥k¬q¸¨­¶Ãä";
    Text[ arabic ] = "åÇãÔ ÇáÝÞÑÉ ÇáÃíãä";
    Text[ greek ] = "Ðåñéèþñéï ðáñáãñÜöïõ - äåîéÜ";
    Text[ korean ] = "¿À¸¥ÂÊ ´Ü¶ô ¿Ü°û¼±";
    Text[ turkish ] = "Paragraf kenarý (sað)";
    Text[ language_user1 ] = " ";
};
String STR_MIR_REL_FRM_RIGHT
{
    TEXT = "Absatzrand außen" ;
    TEXT [ English ] = "Outer paragraph border" ;
    Text [ portuguese ] = "Margem exterior do parágrafo" ;
    Text [ english_us ] = "Outer paragraph border" ;
    Text [ portuguese_brazilian ] = "Absatzrand außen" ;
    Text [ swedish ] = "Yttre styckemarginal" ;
    Text [ danish ] = "Ydre afsnitsrand" ;
    Text [ italian ] = "Margine paragrafo esterno" ;
    Text [ spanish ] = "Margen exterior del párrafo" ;
    Text [ french ] = "Marge de paragraphe extérieure " ;
    Text [ dutch ] = "Buitenste alinearand" ;
    Text[ chinese_simplified ] = "¶ÎÂä¼ä¸ôÍâ²à";
    Text[ russian ] = "Íàðóæíûé êðàé àáçàöà";
    Text[ polish ] = "Zewnêtrzny margines akapitu";
    Text[ japanese ] = "’i—Ž—]”’ ŠO‘¤";
    Text[ chinese_traditional ] = "¬q¸¨¶¡¹j¥~°¼";
    Text[ arabic ] = "åÇãÔ ÇáÝÞÑÉ ÇáÎÇÑÌí";
    Text[ greek ] = "Ðåñéèþñéï ðáñáãñÜöïõ - åîùôåñéêÜ";
    Text[ korean ] = "¿ÜºÎ ´Ü¶ô ¿Ü°û¼±";
    Text[ turkish ] = "Paragraf kenarý (dýþ)";
    Text[ language_user1 ] = " ";
};
String STR_REL_PG_FRAME
{
    TEXT = "Gesamte Seite" ;
    TEXT [ English ] = "Whole page" ;
    Text [ portuguese ] = "Página inteira" ;
    Text [ english_us ] = "Entire page" ;
    Text [ portuguese_brazilian ] = "Gesamte Seite" ;
    Text [ swedish ] = "Hela sidan" ;
    Text [ danish ] = "Hele siden" ;
    Text [ italian ] = "Intera pagina" ;
    Text [ spanish ] = "Página entera" ;
    Text [ french ] = "Page entière" ;
    Text [ dutch ] = "Gehele pagina" ;
    Text[ chinese_simplified ] = "ÕûÒ³";
    Text[ russian ] = "Âñÿ ñòðàíèöà";
    Text[ polish ] = "Ca³a strona";
    Text[ japanese ] = "Íß°¼Þ•";
    Text[ chinese_traditional ] = "¾ã­¶";
    Text[ arabic ] = "ÇáÕÝÍÉ ÈÃßãáåÇ";
    Text[ greek ] = "Ïëüêëçñç óåëßäá";
    Text[ korean ] = "Àüü ÆäÀÌÁö";
    Text[ turkish ] = "Sayfanýn tümü";
    Text[ language_user1 ] = " ";
};
String STR_REL_PG_PRTAREA
{
    TEXT = "Seitentextbereich" ;
    TEXT [ English ] = "Page text area" ;
    Text [ portuguese ] = "Área de texto da página" ;
    Text [ english_us ] = "Page text area" ;
    Text [ portuguese_brazilian ] = "Seitentextbereich" ;
    Text [ swedish ] = "Sidtextområde" ;
    Text [ danish ] = "Sidetekstområde" ;
    Text [ italian ] = "Area del testo della pagina" ;
    Text [ spanish ] = "Área de texto de la página" ;
    Text [ french ] = "Zone de texte de page" ;
    Text [ dutch ] = "Paginatekstbereik" ;
    Text[ chinese_simplified ] = "Ò³ÃæÎÄ×ÖÇøÓò";
    Text[ russian ] = "Îáëàñòü òåêñòîâîé ñòðàíèöû";
    Text[ polish ] = "Obszar tekstu na stronie";
    Text[ japanese ] = "Íß°¼Þ‚Ì÷½Ä”͈Í";
    Text[ chinese_traditional ] = "­¶­±¤å¦r°Ï°ì";
    Text[ arabic ] = "äØÇÞ äÕ ÇáÕÝÍÉ";
    Text[ greek ] = "Ðåñéï÷Þ êåéìÝíïõ óåëßäáò";
    Text[ korean ] = "ÆäÀÌÁö ÅØ½ºÆ® ¿µ¿ª";
    Text[ turkish ] = "Sayfa metin alaný";
    Text[ language_user1 ] = " ";
};
/*-----------------------------------------------------------------------
    Beschreibung: V-Rel Zeichenausrichtungen
 -----------------------------------------------------------------------*/
String STR_REL_BASE
{
    TEXT = "Grundlinie" ;
    TEXT [ English ] = "Baseline" ;
    Text [ portuguese ] = "Linha de base" ;
    Text [ english_us ] = "Base line" ;
    Text [ portuguese_brazilian ] = "Grundlinie" ;
    Text [ swedish ] = "Baslinje" ;
    Text [ danish ] = "Basislinje" ;
    Text [ italian ] = "Linea di base" ;
    Text [ spanish ] = "Línea de base" ;
    Text [ french ] = "Ligne de base" ;
    Text [ dutch ] = "Basislijn" ;
    Text[ chinese_simplified ] = "»ùÏß";
    Text[ russian ] = "Îñíîâíàÿ ëèíèÿ";
    Text[ polish ] = "Linia podstawowa";
    Text[ japanese ] = "Šîü";
    Text[ chinese_traditional ] = "°ò½u";
    Text[ arabic ] = "ÇáÎØ ÇáÃÓÇÓí";
    Text[ greek ] = "ÂáóéêÞ ãñáììÞ";
    Text[ korean ] = "±âÁؼ±";
    Text[ turkish ] = "Taban çizgisi";
    Text[ language_user1 ] = " ";
};
String STR_REL_CHAR
{
    TEXT = "Zeichen" ;
    TEXT [ English ] = "Char" ;
    Text [ portuguese ] = "Caracteres" ;
    Text [ english_us ] = "Character" ;
    Text [ portuguese_brazilian ] = "Zeichen" ;
    Text [ swedish ] = "Tecken" ;
    Text [ danish ] = "Tegn" ;
    Text [ italian ] = "Carattere" ;
    Text [ spanish ] = "Caracteres" ;
    Text [ french ] = "Caractère" ;
    Text [ dutch ] = "Teken" ;
    Text[ chinese_simplified ] = "×Ö·û";
    Text[ russian ] = "Çíàê";
    Text[ polish ] = "Znak";
    Text[ japanese ] = "•¶Žš";
    Text[ chinese_traditional ] = "¦r¤¸";
    Text[ arabic ] = "ÍÑÝ";
    Text[ greek ] = "×áñáêôÞñåò";
    Text[ korean ] = "¹®ÀÚ";
    Text[ turkish ] = "Karakter";
    Text[ language_user1 ] = " ";
};
String STR_REL_ROW
{
    TEXT = "Zeile" ;
    TEXT [ English ] = "Row" ;
    Text [ portuguese ] = "Linha" ;
    Text [ english_us ] = "Row" ;
    Text [ portuguese_brazilian ] = "Zeile" ;
    Text [ swedish ] = "Rad" ;
    Text [ danish ] = "Række" ;
    Text [ italian ] = "Riga" ;
    Text [ spanish ] = "Fila" ;
    Text [ french ] = "Ligne" ;
    Text [ dutch ] = "Rij" ;
    Text[ chinese_simplified ] = "ÐÐ";
    Text[ russian ] = "Ñòðîêà";
    Text[ polish ] = "Wiersz";
    Text[ japanese ] = "s";
    Text[ chinese_traditional ] = "¦æ";
    Text[ arabic ] = "ÕÝ";
    Text[ greek ] = "ÃñáììÞ";
    Text[ korean ] = "Çà";
    Text[ turkish ] = "Satýr";
    Text[ language_user1 ] = " ";
};
/*-----------------------------------------------------------------------
    Beschreibung: Zeichenausrichtungen fuer frmsh.cxx - Kontextmenue
 -----------------------------------------------------------------------*/
String STR_TOP_BASE
{
    TEXT = "Grundlinie ~oben" ;
    TEXT [ English ] = "Top of baseline" ;
    Text [ portuguese ] = "Linha de base em ~cima" ;
    Text [ english_us ] = "Base line at ~top" ;
    Text [ portuguese_brazilian ] = "Basis ~oben" ;
    Text [ swedish ] = "Baslinje ~överst" ;
    Text [ danish ] = "Basislinje øverst" ;
    Text [ italian ] = "Linea di base in ~alto" ;
    Text [ spanish ] = "Línea de base ~encima" ;
    Text [ french ] = "Ligne de base en ~haut" ;
    Text [ dutch ] = "Basis ~boven" ;
    Text[ chinese_simplified ] = "»ùÏßÉÏ·½(~T)";
    Text[ russian ] = "Îñíîâíàÿ ëèíèÿ ñâåðõó";
    Text[ polish ] = "Linia podstawowa w górze";
    Text[ japanese ] = "Šîü‚̏ã(~T)";
    Text[ chinese_traditional ] = "°ò½u¤W¤è(~T)";
    Text[ arabic ] = "ÃÚáì ÇáÎØ ÇáÃÓÇÓí";
    Text[ greek ] = "ÂáóéêÞ ãñáììÞ - Üíù";
    Text[ korean ] = "±âÁؼ±ÀÇ À§(~T)";
    Text[ turkish ] = "Taban çizgisi ~üstü";
    Text[ language_user1 ] = " ";
};
String STR_BOTTOM_BASE
{
    TEXT = "Grundlinie ~unten" ;
    TEXT [ English ] = "Bottom of base" ;
    Text [ portuguese ] = "~Abaixo da base" ;
    Text [ english_us ] = "~Base line at bottom" ;
    Text [ portuguese_brazilian ] = "Basis ~unten" ;
    Text [ swedish ] = "Baslinje ~nederst" ;
    Text [ danish ] = "Basislinje nederst" ;
    Text [ italian ] = "Base in ~basso" ;
    Text [ spanish ] = "Base a~bajo" ;
    Text [ french ] = "Ligne de base en ~bas" ;
    Text [ dutch ] = "Basis ~beneden" ;
    Text[ chinese_simplified ] = "»ùÏßÏ·½(~B)";
    Text[ russian ] = "Îñíîâíàÿ ëèíèÿ ñíèçó";
    Text[ polish ] = "Linia podstawowa w dole";
    Text[ japanese ] = "Šîü‚̉º(~B)";
    Text[ chinese_traditional ] = "°ò½u¤U¤è(~B)";
    Text[ arabic ] = "ÃÓÝá ÇáÎØ ÇáÃÓÇÓí";
    Text[ greek ] = "ÂáóéêÞ ãñáììÞ - êÜôù";
    Text[ korean ] = "±âÁؼ±ÀÇ ¾Æ·¡(~B)";
    Text[ turkish ] = "Alt ~taban çizgisi";
    Text[ language_user1 ] = " ";
};
String STR_CENTER_BASE
{
    TEXT = "Grundlinie ~zentriert" ;
    TEXT [ English ] = "Center of baseline" ;
    Text [ portuguese ] = "Linha de base ~centrada" ;
    Text [ english_us ] = "Base line ~centered" ;
    Text [ portuguese_brazilian ] = "Basis ~zentriert" ;
    Text [ swedish ] = "Baslinje ~centrerad" ;
    Text [ danish ] = "Basislinje centreret" ;
    Text [ italian ] = "Linea di base ~centrata" ;
    Text [ spanish ] = "Base ~centro" ;
    Text [ french ] = "Ligne de base ~centrée" ;
    Text [ dutch ] = "Basis ge~centreerd" ;
    Text[ chinese_simplified ] = "»ùÏß¾ÓÖÐ(~C)";
    Text[ russian ] = "Îñíîâíàÿ ëèíèÿ ïî öåíòðó";
    Text[ polish ] = "Linia podstawowa, wyœrodkowana";
    Text[ japanese ] = "Šîü‚Ì’†‰›(~C)";
    Text[ chinese_traditional ] = "°ò½u¸m¤¤(~C)";
    Text[ arabic ] = "æÓØ ÇáÎØ ÇáÃÓÇÓí";
    Text[ greek ] = "ÂáóéêÞ ãñáììÞ - êåíôñáñéóìÝíá";
    Text[ korean ] = "±âÁؼ±ÀÇ °¡¿îµ¥(~C)";
    Text[ turkish ] = "Taban çizgisini ~ortala";
    Text[ language_user1 ] = " ";
};
String STR_LINE_TOP
{
    TEXT = "Zeile oben" ;
    TEXT [ English ] = "Line top" ;
    Text [ dutch ] = "Bovenste regel" ;
    Text [ english_us ] = "Top of line" ;
    Text [ italian ] = "Riga in alto" ;
    Text [ spanish ] = "Línea superior" ;
    Text [ french ] = "Ligne supérieure" ;
    Text [ swedish ] = "Översta raden" ;
    Text [ danish ] = "Række øverst" ;
    Text [ portuguese ] = "Linha superior" ;
    Text [ portuguese_brazilian ] = "Zeile oben" ;
    Text[ chinese_simplified ] = "ÐÐÏòÉÏ";
    Text[ russian ] = "Ñòðîêà ñâåðõó";
    Text[ polish ] = "Wiersz na górze";
    Text[ japanese ] = "s‚̏ã";
    Text[ chinese_traditional ] = "¦æ¦V¤W";
    Text[ arabic ] = "ÃÚáì ÇáÓØÑ";
    Text[ greek ] = "ÃñáììÞ - Üíù";
    Text[ korean ] = "¼± À§";
    Text[ turkish ] = "Satýr üstü";
    Text[ language_user1 ] = " ";
};
String STR_LINE_BOTTOM
{
    TEXT = "Zeile unten" ;
    TEXT [ English ] = "Line bottom" ;
    Text [ dutch ] = "Onderste regel" ;
    Text [ english_us ] = "Bottom of line" ;
    Text [ italian ] = "Riga in basso" ;
    Text [ spanish ] = "Línea inferior" ;
    Text [ french ] = "Ligne inférieure" ;
    Text [ swedish ] = "Nedersta raden" ;
    Text [ danish ] = "Række nederst" ;
    Text [ portuguese ] = "Linha inferior" ;
    Text [ portuguese_brazilian ] = "Zeile unten" ;
    Text[ chinese_simplified ] = "ÏÂÒ»ÐÐ";
    Text[ russian ] = "Ñòðîêà ñíèçó";
    Text[ polish ] = "Wiersz na dole";
    Text[ japanese ] = "s‚̉º";
    Text[ chinese_traditional ] = "¤U¤@¦æ";
    Text[ arabic ] = "ÃÓÝá ÇáÓØÑ";
    Text[ greek ] = "ÃñáììÞ - êÜôù";
    Text[ korean ] = "¼±ÀÇ ¾Æ·¡";
    Text[ turkish ] = "Satýr altý";
    Text[ language_user1 ] = " ";
};
String STR_LINE_CENTER
{
    TEXT = "Zeile zentriert" ;
    TEXT [ English ] = "Line centered" ;
    Text [ english_us ] = "Center of line" ;
    Text [ italian ] = "Riga centrata" ;
    Text [ spanish ] = "Línea centrada" ;
    Text [ french ] = "Ligne centrée" ;
    Text [ dutch ] = "Regel gecentreerd" ;
    Text [ swedish ] = "Rad centrerad" ;
    Text [ danish ] = "Række centreret" ;
    Text [ portuguese ] = "Linha centrada" ;
    Text [ portuguese_brazilian ] = "Zeile zentriert" ;
    Text[ chinese_simplified ] = "ÐоÓÖÐ";
    Text[ russian ] = "Ñòðîêà ïî öåíòðó";
    Text[ polish ] = "Wiersz wyœrodkowany";
    Text[ japanese ] = "s‚Ì’†‰›";
    Text[ chinese_traditional ] = "¦æ¸m¤¤";
    Text[ arabic ] = "æÓØ ÇáÓØÑ";
    Text[ greek ] = "ÃñáììÞ êåíôñáñéóìÝíç";
    Text[ korean ] = "¼± °¡¿îµ¥";
    Text[ turkish ] = "Satýrý ortala";
    Text[ language_user1 ] = " ";
};
String STR_CHAR_TOP
{
    TEXT = "Zeichen oben" ;
    TEXT [ English ] = "Top of character" ;
    Text [ dutch ] = "Teken boven" ;
    Text [ english_us ] = "Top of character" ;
    Text [ italian ] = "Carattere in alto" ;
    Text [ spanish ] = "Carácter arriba" ;
    Text [ french ] = "Décalage haut" ;
    Text [ swedish ] = "Tecken överst" ;
    Text [ danish ] = "Tegn øverst" ;
    Text [ portuguese ] = "Carácter em cima" ;
    Text [ portuguese_brazilian ] = "Zeichen oben" ;
    Text[ chinese_simplified ] = "×Ö·ûÏòÉÏ";
    Text[ russian ] = "Çíàê ñâåðõó";
    Text[ polish ] = "Znaki w górze";
    Text[ japanese ] = "•¶Žš‚̏ã";
    Text[ chinese_traditional ] = "¦r¤¸¦V¤W";
    Text[ arabic ] = "ÃÚáì ÇáÍÑÝ";
    Text[ greek ] = "×áñáêôÞñáò - Üíù";
    Text[ korean ] = "¹®ÀÚÀÇ À§¿¡";
    Text[ turkish ] = "Karakter üstü";
    Text[ language_user1 ] = " ";
};
String STR_CHAR_BOTTOM
{
    TEXT = "Zeichen unten" ;
    TEXT [ English ] = "Bottom of character" ;
    Text [ dutch ] = "Teken beneden" ;
    Text [ english_us ] = "Bottom of character" ;
    Text [ italian ] = "Carattere in basso" ;
    Text [ spanish ] = "Carácter abajo" ;
    Text [ french ] = "Décalage bas" ;
    Text [ swedish ] = "Tecken nederst" ;
    Text [ danish ] = "Tegn nederst" ;
    Text [ portuguese ] = "Carácter em baixo" ;
    Text [ portuguese_brazilian ] = "Zeichen unten" ;
    Text[ chinese_simplified ] = "×Ö·ûÏòÏÂ";
    Text[ russian ] = "Çíàê ñíèçó";
    Text[ polish ] = "Znaki na dole";
    Text[ japanese ] = "•¶Žš‚̉º";
    Text[ chinese_traditional ] = "¦r¤¸¦V¤U";
    Text[ arabic ] = "ÃÓÝá ÇáÍÑÝ";
    Text[ greek ] = "×áñáêôÞñáò - êÜôù";
    Text[ korean ] = "¹®ÀÚÀÇ ¾Æ·¡";
    Text[ turkish ] = "Karakter altý";
    Text[ language_user1 ] = " ";
};
String STR_CHAR_CENTER
{
    TEXT = "Zeichen zentriert" ;
    TEXT [ English ] = "Middle of character" ;
    Text [ english_us ] = "Center of character" ;
    Text [ italian ] = "Carattere centrato" ;
    Text [ spanish ] = "Carácter centrado" ;
    Text [ french ] = "Caractère centré" ;
    Text [ dutch ] = "Teken gecentreerd" ;
    Text [ swedish ] = "Tecken centrerat" ;
    Text [ danish ] = "Tegn centreret" ;
    Text [ portuguese ] = "Carácter centrado" ;
    Text [ portuguese_brazilian ] = "Zeichen zentriert" ;
    Text[ chinese_simplified ] = "×Ö·û¾ÓÖÐ";
    Text[ russian ] = "Çíàê ïî öåíòðó";
    Text[ polish ] = "Znaki wyœrodkowane";
    Text[ japanese ] = "•¶Žš‚Ì’†‰›";
    Text[ chinese_traditional ] = "¦r¤¸¸m¤¤";
    Text[ arabic ] = "æÓØ ÇáÍÑÝ";
    Text[ greek ] = "×áñáêôÞñáò - êåíôñáñéóìÝíá";
    Text[ korean ] = "¹®ÀÚÀÇ °¡¿îµ¥";
    Text[ turkish ] = "Karakteri ortala";
    Text[ language_user1 ] = " ";
};
String STR_OLE_INSERT
{
    /* ### ACHTUNG: Neuer Text in Resource? Objekt einfügen : Objekt einf³gen */
    TEXT = "Objekt einfügen" ;
    TEXT [ English ] = "Insert object" ;
    TEXT [ norwegian ] = "Insert object" ;
    TEXT [ italian ] = "Inserisci oggetto" ;
    TEXT [ portuguese_brazilian ] = "Inserir objeto" ;
    TEXT [ portuguese ] = "Inserir objecto" ;
    TEXT [ finnish ] = "Lisää objekti" ;
    TEXT [ danish ] = "Indsæt objekt" ;
    TEXT [ french ] = "Insérer un objet" ;
    TEXT [ swedish ] = "Infoga objekt" ;
    TEXT [ dutch ] = "Object invoegen" ;
    TEXT [ spanish ] = "Insertar objeto" ;
    TEXT [ english_us ] = "Insert object" ;
    TEXT[ chinese_simplified ] = "²åÈë¶ÔÏó";
    TEXT[ russian ] = "Âñòàâèòü îáúåêò";
    TEXT[ polish ] = "Wstaw obiekt";
    TEXT[ japanese ] = "µÌß¼Þª¸Ä‚Ì‘}“ü";
    TEXT[ chinese_traditional ] = "´¡¤Jª«¥ó";
    TEXT[ arabic ] = "ÅÏÑÇÌ ßÇÆä";
    TEXT[ greek ] = "ÐñïóèÞêç áíôéêåéìÝíïõ";
    TEXT[ korean ] = "°³Ã¼ »ðÀÔ";
    TEXT[ turkish ] = "Nesne ekle";
    TEXT[ language_user1 ] = " ";
};
String STR_OLE_EDIT
{
    TEXT = "Objekt bearbeiten" ;
    TEXT [ English ] = "Edit object" ;
    TEXT [ norwegian ] = "Edit object" ;
    TEXT [ italian ] = "Modifica oggetto" ;
    TEXT [ portuguese_brazilian ] = "Editar objeto" ;
    TEXT [ portuguese ] = "Editar objecto" ;
    TEXT [ finnish ] = "Muokkaa objektia" ;
    TEXT [ danish ] = "Rediger objekt" ;
    TEXT [ french ] = "Modifier l'objet" ;
    TEXT [ swedish ] = "Redigera objekt" ;
    TEXT [ dutch ] = "Een object bewerken" ;
    TEXT [ spanish ] = "Editar objeto" ;
    TEXT [ english_us ] = "Edit object" ;
    TEXT[ chinese_simplified ] = "±à¼­¶ÔÏó";
    TEXT[ russian ] = "Ïðàâêà îáúåêòà";
    TEXT[ polish ] = "Edytuj obiekt";
    TEXT[ japanese ] = "µÌß¼Þª¸Ä‚̕ҏW";
    TEXT[ chinese_traditional ] = "½s¿èª«¥ó";
    TEXT[ arabic ] = "ÊÍÑíÑ ÇáßÇÆä";
    TEXT[ greek ] = "Åðåîåñãáóßá áíôéêåéìÝíïõ";
    TEXT[ korean ] = "°³Ã¼ ÆíÁý";
    TEXT[ turkish ] = "Nesneyi düzenle";
    TEXT[ language_user1 ] = " ";
};
String STR_COLL_HEADER
{
    TEXT = " (Vorlage: " ;
    TEXT [ English ] = " (Template: " ;
    TEXT [ norwegian ] = " (Template: " ;
    TEXT [ italian ] = "(Modello: " ;
    TEXT [ portuguese_brazilian ] = "(Modelo: " ;
    TEXT [ portuguese ] = "(Modelo: " ;
    TEXT [ finnish ] = " (Malli: " ;
    TEXT [ danish ] = "(Skabelon: " ;
    TEXT [ french ] = "(modèle : " ;
    TEXT [ swedish ] = "(Mall: " ;
    TEXT [ dutch ] = "(Sjabloon: " ;
    TEXT [ spanish ] = "(Plantilla:  " ;
    TEXT [ english_us ] = " (Template: " ;
    TEXT[ chinese_simplified ] = "(Ñùʽ£º ";
    TEXT[ russian ] = "(Øàáëîí:  ";
    TEXT[ polish ] = "(Szablon:   ";
    TEXT[ japanese ] = "(ÃÝÌßÚ°Ä: ";
    TEXT[ chinese_traditional ] = "(¼Ë¦¡¡G ";
    TEXT[ arabic ] = "(ÇáÞÇáÈ: ";
    TEXT[ greek ] = "(Ðñüôõðï: ";
    TEXT[ korean ] = "(ÅÛÇø®Æ®: ";
    TEXT[ turkish ] = "(Þablon: ";
    TEXT[ language_user1 ] = " ";
};
String STR_FRMUI_BORDER
{
    Text = "Umrandung" ;
    Text [ English ] = "Border" ;
    Text [ norwegian ] = "Border" ;
    Text [ italian ] = "Bordo" ;
    Text [ portuguese_brazilian ] = "Borda" ;
    Text [ portuguese ] = "Contornos" ;
    Text [ finnish ] = "Reunaviiva" ;
    Text [ danish ] = "Ramme" ;
    Text [ french ] = "Bordure" ;
    Text [ swedish ] = "Inramning" ;
    Text [ dutch ] = "Omranding" ;
    Text [ spanish ] = "Borde" ;
    Text [ english_us ] = "Borders" ;
    Text[ chinese_simplified ] = "±ß¿ò";
    Text[ russian ] = "Îáðàìëåíèå";
    Text[ polish ] = "Obramowanie";
    Text[ japanese ] = "ŠO˜g";
    Text[ chinese_traditional ] = "Ã䮨";
    Text[ arabic ] = "ÇáÍÏæÏ";
    Text[ greek ] = "Ðåñßãñáììá";
    Text[ korean ] = "¿Ü°û¼±";
    Text[ turkish ] = "Kenarlýk";
    Text[ language_user1 ] = " ";
};
String STR_FRMUI_PATTERN
{
    Text = "Hintergrund" ;
    Text [ English ] = "Background" ;
    Text [ norwegian ] = "Background" ;
    Text [ italian ] = "Sfondo" ;
    Text [ portuguese_brazilian ] = "Fundo" ;
    Text [ portuguese ] = "Plano de fundo" ;
    Text [ finnish ] = "Tausta" ;
    Text [ danish ] = "Baggrund" ;
    Text [ french ] = "Arrière-plan" ;
    Text [ swedish ] = "Bakgrund" ;
    Text [ dutch ] = "Achtergrond" ;
    Text [ spanish ] = "Fondo" ;
    Text [ english_us ] = "Background" ;
    Text[ chinese_simplified ] = "±³¾°";
    Text[ russian ] = "Ôîí";
    Text[ polish ] = "T³o";
    Text[ japanese ] = "”wŒi";
    Text[ chinese_traditional ] = "­I´º";
    Text[ arabic ] = "ÇáÎáÝíÉ";
    Text[ greek ] = "Öüíôï";
    Text[ korean ] = "¹è°æ";
    Text[ turkish ] = "Artalan";
    Text[ language_user1 ] = " ";
};
String STR_FRMUI_WRAP
{
    Text = "Umlauf" ;
    Text [ ENGLISH ] = "Wrap" ;
    Text [ norwegian ] = "Wrap" ;
    Text [ italian ] = "Scorrimento" ;
    Text [ portuguese_brazilian ] = "Circundamento" ;
    Text [ portuguese ] = "Ajuste" ;
    Text [ finnish ] = "Kierrätys" ;
    Text [ danish ] = "Ombrydning" ;
    Text [ french ] = "Adaptation du texte" ;
    Text [ swedish ] = "Textanpassning" ;
    Text [ dutch ] = "Om beeld" ;
    Text [ spanish ] = "Ajuste" ;
    Text [ english_us ] = "Wrap" ;
    Text[ chinese_simplified ] = "»·ÈÆ";
    Text[ russian ] = "Îáòåêàíèå";
    Text[ polish ] = "Obieg tekstu";
    Text[ japanese ] = "Ü‚è•Ô‚µ";
    Text[ chinese_traditional ] = "´«¦æ";
    Text[ arabic ] = "ÇáÊÝÇÝ";
    Text[ greek ] = "Áíáäßðëùóç";
    Text[ korean ] = "¼øÈ¯";
    Text[ turkish ] = "Metin daðýlýmý";
    Text[ language_user1 ] = " ";
};
InfoBox MSG_COLUMN_ERR_BOUNDWIDTH
{
    BUTTONS = WB_OK ;
    DEFBUTTON = WB_DEF_OK ;
    /* ### ACHTUNG: Neuer Text in Resource? Der Spaltenabstand ist zu groß für die Spaltenbreite. : Der Spaltenabstand ist zu gro˜ f³r die Spaltenbreite. */
    MESSAGE = "Der Spaltenabstand ist zu groß für die Spaltenbreite." ;
    MESSAGE [ English ] = "Gutter width exceeds column width." ;
    MESSAGE [ norwegian ] = "Gutter width exceeds column width." ;
    MESSAGE [ italian ] = "La distanza tra le colonne supera la larghezza delle colonne" ;
    MESSAGE [ portuguese_brazilian ] = "Largura do guter excede largura da coluna." ;
    MESSAGE [ portuguese ] = "O espaço entre as colunas é grande demais para a largura das colunas." ;
    MESSAGE [ finnish ] = "Palstojen väli on palstojen leveyttä suurempi." ;
    MESSAGE [ danish ] = "Kolonneafstanden er for stor til kolonnebredden." ;
    MESSAGE [ french ] = "Largeur de gouttière excède largeur de colonne." ;
    MESSAGE [ swedish ] = "Fästmarginalens bredd är för stor för kolumnbredden." ;
    MESSAGE [ dutch ] = "De kolomafstand is te groot voor deze kolombreedte" ;
    MESSAGE [ spanish ] = "La distancia entre columnas es demasiado grande para el ancho de las columnas." ;
    MESSAGE [ english_us ] = "Column spacing exceeds the column width." ;
    MESSAGE[ chinese_simplified ] = "Áмä¸ôÌ«´ó£¬³¬¹ýÁÐÇøÓò¡£";
    MESSAGE[ russian ] = "Ðàññòîÿíèå ìåæäó êîëîíêàìè ñëèøêîì áîëüøîå äëÿ øèðèíû êîëîíîê.";
    MESSAGE[ polish ] = "Odstêp miêdzy kolumnami jest za du¿y dla ich szerokoœci.";
    MESSAGE[ japanese ] = "—ñ‚ÌŠÔŠu‚ª—ñ‚Ì•‚ɑ΂µ‚čL‚·‚¬‚Ü‚·";
    MESSAGE[ chinese_traditional ] = "Äæ¶¡¹j¤Ó¤j¡A¶W¹LÄæ°Ï°ì¡C";
    MESSAGE[ arabic ] = "íÝæÞ ÊÈÇÚÏ ÇáÃÚãÏÉ ÚÑÖåÇ.";
    MESSAGE[ greek ] = "Ç áðüóôáóç óôçëþí õðåñâáßíåé ôï ðëÜôïò ôçò óôÞëçò.";
    MESSAGE[ korean ] = "¿­ °£°ÝÀÌ ¿­ ³Êºñ¿¡ ºñÇØ ³Ê¹« ³Ð½À´Ï´Ù.";
    MESSAGE[ turkish ] = "Sütun aralýðý, sütun geniþliði için çok büyük.";
    MESSAGE[ language_user1 ] = " ";
};
diff --git a/sw/source/ui/frmdlg/makefile.mk b/sw/source/ui/frmdlg/makefile.mk
new file mode 100644
index 0000000..3007f4d
--- /dev/null
+++ b/sw/source/ui/frmdlg/makefile.mk
@@ -0,0 +1,125 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:38 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=..$/..$/..

PRJNAME=sw
TARGET=frmdlg

AUTOSEG=true

PROJECTPCH=ui_pch
PDBTARGET=ui_pch
PROJECTPCHSOURCE=..\ui_1st\ui_pch

# --- Settings -----------------------------------------------------

.INCLUDE :  $(PRJ)$/inc$/swpre.mk
.INCLUDE :  settings.mk
.INCLUDE :  $(PRJ)$/inc$/sw.mk

IMGLST_SRS=$(SRS)$/frmdlg.srs
BMP_IN=$(PRJ)$/win/imglst

# --- Files --------------------------------------------------------

CXXFILES = \
        bbmgr.cxx \
        colmgr.cxx \
        column.cxx \
        colex.cxx  \
        cption.cxx \
        cropex.cxx \
        frmdlg.cxx \
        frmex.cxx \
        frmmgr.cxx \
        frmpage.cxx \
        pattern.cxx \
        uiborder.cxx \
        wrap.cxx

SRCFILES =  \
        column.src \
        cption.src \
        frmpage.src \
        frmui.src \
        wrap.src

SLOFILES =  \
        $(SLO)$/bbmgr.obj \
        $(SLO)$/colmgr.obj \
        $(SLO)$/column.obj \
        $(SLO)$/colex.obj \
        $(SLO)$/cption.obj \
        $(SLO)$/cropex.obj \
        $(SLO)$/frmdlg.obj \
        $(SLO)$/frmex.obj \
        $(SLO)$/frmmgr.obj \
        $(SLO)$/frmpage.obj \
        $(SLO)$/pattern.obj \
        $(SLO)$/uiborder.obj \
        $(SLO)$/wrap.obj

# --- Tagets -------------------------------------------------------

.INCLUDE :  target.mk

diff --git a/sw/source/ui/frmdlg/pattern.cxx b/sw/source/ui/frmdlg/pattern.cxx
new file mode 100644
index 0000000..e7cb967
--- /dev/null
+++ b/sw/source/ui/frmdlg/pattern.cxx
@@ -0,0 +1,167 @@
/*************************************************************************
 *
 *  $RCSfile: pattern.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:38 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SVX_BACKGRND_HXX //autogen
#include <svx/backgrnd.hxx>
#endif


#include "swtypes.hxx"
#include "pattern.hxx"
#include "frmui.hrc"


/****************************************************************************
Ctor
****************************************************************************/



SwBackgroundDlg::SwBackgroundDlg(Window* pParent, const SfxItemSet& rSet) :

    SfxSingleTabDialog(pParent, rSet, 0)

{
    SetText(SW_RESSTR(STR_FRMUI_PATTERN));
    SetTabPage(SvxBackgroundTabPage::Create(this, rSet));
}

/****************************************************************************
Dtor
****************************************************************************/



SwBackgroundDlg::~SwBackgroundDlg()
{
}

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/ui/frmdlg/pattern.cxx,v 1.1.1.1 2000-09-18 17:14:38 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.62  2000/09/18 16:05:34  willem.vandorp
      OpenOffice header added.

      Revision 1.61  1997/11/24 16:40:16  MA
      include


      Rev 1.60   24 Nov 1997 17:40:16   MA
   include

      Rev 1.59   03 Nov 1997 13:19:48   MA
   precomp entfernt

      Rev 1.58   14 Nov 1996 15:31:26   TRI
   includes

      Rev 1.57   11 Nov 1996 10:44:16   MA
   ResMgr

      Rev 1.56   28 Aug 1996 11:52:44   OS
   includes

      Rev 1.55   24 Nov 1995 16:58:10   OM
   PCH->PRECOMPILED

      Rev 1.54   16 Aug 1995 17:48:32   MA
   Riesenheader dialogs entfernt.

      Rev 1.53   31 Mar 1995 13:10:38   OM
   SfxModalDialog -> SfxSingleTabDialog

      Rev 1.52   29 Mar 1995 08:32:04   OS
   SfxModalDialog - Parameter zusatzlich

      Rev 1.51   07 Feb 1995 19:19:10   PK
   caption fuer uiborder und pattern

      Rev 1.50   24 Jan 1995 13:10:24   SWG
   Map entfernt

      Rev 1.49   21 Nov 1994 13:11:24   PK
   sfxmodaldialog

      Rev 1.48   17 Nov 1994 13:06:00   PK
   swpatterndlg -> swbackgrounddlg

      Rev 1.47   25 Oct 1994 18:14:40   ER
   add: PCH

      Rev 1.46   19 Oct 1994 12:09:48   MA
   SV-ChangeXXX -> SetXXX.

*************************************************************************/



diff --git a/sw/source/ui/frmdlg/pattern.hrc b/sw/source/ui/frmdlg/pattern.hrc
new file mode 100644
index 0000000..da9feae
--- /dev/null
+++ b/sw/source/ui/frmdlg/pattern.hrc
@@ -0,0 +1,80 @@
/*************************************************************************
 *
 *  $RCSfile: pattern.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:38 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#define BRUSH_LBL               1
#define BRUSH_LBOX              2

#define COLOR_LBL               3
#define COLOR_LBOX              4

#define FILLIN_COLOR_LBL        5
#define FILLIN_COLOR_LBOX       6

#define NO_PATTERN_BOX          7

#define PATTERN_FRM             8
#define EXAMPLE_FRM             9
#define EXAMPLE_WIN             10

#define OK_BTN                  11
#define CANCEL_BTN              12
#define RESET_BTN               13

diff --git a/sw/source/ui/frmdlg/uiborder.cxx b/sw/source/ui/frmdlg/uiborder.cxx
new file mode 100644
index 0000000..e7762ff
--- /dev/null
+++ b/sw/source/ui/frmdlg/uiborder.cxx
@@ -0,0 +1,164 @@
/*************************************************************************
 *
 *  $RCSfile: uiborder.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:38 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SVX_BORDER_HXX //autogen
#include <svx/border.hxx>
#endif


#include "swtypes.hxx"
#include "uiborder.hxx"
#include "frmui.hrc"




SwBorderDlg::SwBorderDlg(Window* pParent, SfxItemSet& rSet, USHORT nType) :

    SfxSingleTabDialog(pParent, rSet, 0)

{
    SetText(SW_RESSTR(STR_FRMUI_BORDER));

    // TabPage erzeugen
    SvxBorderTabPage* pPage = (SvxBorderTabPage*) SvxBorderTabPage::Create(this, rSet);
    pPage->SetSWMode(nType);
    if(SW_BORDER_MODE_TABLE == nType)
        pPage->HideShadowControls();
    SetTabPage(pPage);
}



SwBorderDlg::~SwBorderDlg()
{
}

/*************************************************************************

      Source Code Control System - Header

      $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/ui/frmdlg/uiborder.cxx,v 1.1.1.1 2000-09-18 17:14:38 hr Exp $

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.84  2000/09/18 16:05:35  willem.vandorp
      OpenOffice header added.

      Revision 1.83  2000/01/31 12:29:56  os
      #70943# SwBorderDlg: call SvxBorderTabPage::SetSWMode

      Revision 1.82  1997/11/24 16:40:16  MA
      include


      Rev 1.81   24 Nov 1997 17:40:16   MA
   include

      Rev 1.80   03 Nov 1997 13:19:46   MA
   precomp entfernt

      Rev 1.79   14 Nov 1996 15:32:36   TRI
   includes

      Rev 1.78   11 Nov 1996 10:44:14   MA
   ResMgr

      Rev 1.77   28 Aug 1996 11:52:58   OS
   includes

      Rev 1.76   24 Nov 1995 16:58:12   OM
   PCH->PRECOMPILED

      Rev 1.75   16 Aug 1995 17:48:26   MA
   Riesenheader dialogs entfernt.

      Rev 1.74   31 Mar 1995 13:10:40   OM
   SfxModalDialog -> SfxSingleTabDialog

      Rev 1.73   29 Mar 1995 08:32:18   OS
   SfxModalDialog - Parameter zusatzlich

      Rev 1.72   07 Feb 1995 19:19:12   PK
   caption fuer uiborder und pattern

      Rev 1.71   01 Feb 1995 17:45:16   PK
   hideshadowcontrol()

      Rev 1.70   27 Jan 1995 07:24:36   MS
   HideShadowControls auskommentiert

      Rev 1.69   26 Jan 1995 17:37:32   PK
   hideshadowcontrols() scharfgeschaltet

      Rev 1.68   26 Jan 1995 17:02:00   PK
   ctor erweiert

*************************************************************************/


diff --git a/sw/source/ui/frmdlg/wrap.cxx b/sw/source/ui/frmdlg/wrap.cxx
new file mode 100644
index 0000000..a817643
--- /dev/null
+++ b/sw/source/ui/frmdlg/wrap.cxx
@@ -0,0 +1,974 @@
/*************************************************************************
 *
 *  $RCSfile: wrap.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:38 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "hintids.hxx"

#ifndef _SV_GRAPH_HXX
#include <vcl/graph.hxx>
#endif
#ifndef _SVX_HTMLMODE_HXX
#include <svx/htmlmode.hxx>
#endif
#ifndef _SFX_OBJSH_HXX //autogen
#include <sfx2/objsh.hxx>
#endif
#ifndef _SFXINTITEM_HXX //autogen
#include <svtools/intitem.hxx>
#endif
#ifndef _SVX_OPAQITEM_HXX //autogen
#include <svx/opaqitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif


#include "cmdid.h"
#include "uitool.hxx"
#include "wrtsh.hxx"
#include "swmodule.hxx"
#include "viewopt.hxx"
#include "frmatr.hxx"
#include "frmmgr.hxx"
#include "globals.hrc"
#include "frmui.hrc"
#include "wrap.hrc"
#include "wrap.hxx"


/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

static USHORT __FAR_DATA aWrapPageRg[] = {
    RES_LR_SPACE, RES_UL_SPACE,
    RES_PROTECT, RES_SURROUND,
    RES_PRINT, RES_PRINT,
    0
};


/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



SwWrapDlg::SwWrapDlg(Window* pParent, SfxItemSet& rSet, SwWrtShell* pSh, BOOL bDrawMode) :
    SfxSingleTabDialog(pParent, rSet, 0),
    pWrtShell(pSh)

{
    // TabPage erzeugen
    SwWrapTabPage* pPage = (SwWrapTabPage*) SwWrapTabPage::Create(this, rSet);
    pPage->SetFormatUsed(FALSE, bDrawMode);
    pPage->SetShell(pWrtShell);
    SetTabPage(pPage);

    String sTitle(SW_RES(STR_FRMUI_WRAP));
    SetText(sTitle);
}



SwWrapDlg::~SwWrapDlg()
{
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



SwWrapTabPage::SwWrapTabPage(Window *pParent, const SfxItemSet &rSet) :
    SfxTabPage(pParent, SW_RES(TP_FRM_WRAP), rSet),

    aWrapBoxC           (this, SW_RES(C_WRAP_BOX)),
    aNoWrapRB           (this, SW_RES(RB_NO_WRAP)),
    aWrapLeftRB         (this, SW_RES(RB_WRAP_LEFT)),
    aWrapRightRB        (this, SW_RES(RB_WRAP_RIGHT)),
    aWrapParallelRB     (this, SW_RES(RB_WRAP_PARALLEL)),
    aWrapThroughRB      (this, SW_RES(RB_WRAP_THROUGH)),
    aIdealWrapRB        (this, SW_RES(RB_WRAP_IDEAL)),
    aWrapAnchorOnlyCB   (this, SW_RES(CB_ANCHOR_ONLY)),
    aWrapTransparentCB  (this, SW_RES(CB_TRANSPARENT)),
    aWrapOutlineCB      (this, SW_RES(CB_OUTLINE)),
    aWrapOutsideCB      (this, SW_RES(CB_ONLYOUTSIDE)),
    aOptionsGB          (this, SW_RES(GB_OPTION)),
    aLeftMarginFT       (this, SW_RES(FT_LEFT_MARGIN)),
    aLeftMarginED       (this, SW_RES(ED_LEFT_MARGIN)),
    aRightMarginFT      (this, SW_RES(FT_RIGHT_MARGIN)),
    aRightMarginED      (this, SW_RES(ED_RIGHT_MARGIN)),
    aTopMarginFT        (this, SW_RES(FT_TOP_MARGIN)),
    aTopMarginED        (this, SW_RES(ED_TOP_MARGIN)),
    aBottomMarginFT     (this, SW_RES(FT_BOTTOM_MARGIN)),
    aBottomMarginED     (this, SW_RES(ED_BOTTOM_MARGIN)),
    aMarginGB           (this, SW_RES(GB_MARGIN)),

    aWrapIL             (SW_RES(IL_WRAP)),
    nHtmlMode(0),
    bNew(TRUE),
    bFormat(FALSE),
    bHtmlMode(FALSE),
    bContourImage(FALSE),
    nAnchorId(0)
{
    FreeResource();
    SetExchangeSupport();


    Link aLk = LINK(this, SwWrapTabPage, RangeModifyHdl);
    aLeftMarginED.SetUpHdl(aLk);
    aLeftMarginED.SetDownHdl(aLk);
    aLeftMarginED.SetFirstHdl(aLk);
    aLeftMarginED.SetLastHdl(aLk);
    aLeftMarginED.SetLoseFocusHdl(aLk);

    aRightMarginED.SetUpHdl(aLk);
    aRightMarginED.SetDownHdl(aLk);
    aRightMarginED.SetFirstHdl(aLk);
    aRightMarginED.SetLastHdl(aLk);
    aRightMarginED.SetLoseFocusHdl(aLk);

    aTopMarginED.SetUpHdl(aLk);
    aTopMarginED.SetDownHdl(aLk);
    aTopMarginED.SetFirstHdl(aLk);
    aTopMarginED.SetLastHdl(aLk);
    aTopMarginED.SetLoseFocusHdl(aLk);

    aBottomMarginED.SetUpHdl(aLk);
    aBottomMarginED.SetDownHdl(aLk);
    aBottomMarginED.SetFirstHdl(aLk);
    aBottomMarginED.SetLastHdl(aLk);
    aBottomMarginED.SetLoseFocusHdl(aLk);

    aLk = LINK(this, SwWrapTabPage, WrapTypeHdl);
    aNoWrapRB.SetClickHdl(aLk);
    aWrapLeftRB.SetClickHdl(aLk);
    aWrapRightRB.SetClickHdl(aLk);
    aWrapParallelRB.SetClickHdl(aLk);
    aWrapThroughRB.SetClickHdl(aLk);
    aIdealWrapRB.SetClickHdl(aLk);
    aWrapThroughRB.SetImage(aWrapIL.GetImage(IMG_THROUGH));

    aWrapOutlineCB.SetClickHdl(LINK(this, SwWrapTabPage, ContourHdl));
}



SwWrapTabPage::~SwWrapTabPage()
{
}



SfxTabPage* SwWrapTabPage::Create(Window *pParent, const SfxItemSet &rSet)
{
    return new SwWrapTabPage(pParent, rSet);
}
/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



void SwWrapTabPage::Reset(const SfxItemSet &rSet)
{
    //Contour fuer Draw, Grafik und OLE (Einfuegen/Grafik/Eigenschaften fehlt noch!)
    if( bDrawMode )
    {
        aWrapOutlineCB.Show();
        aWrapOutsideCB.Show();

        aWrapTransparentCB.Check( 0 == ((const SfxInt16Item&)rSet.Get(
                                        FN_DRAW_WRAP_DLG)).GetValue() );
        aWrapTransparentCB.SaveValue();
    }
    else
    {
        BOOL bShowCB = bFormat;
        if( !bFormat )
        {
            int nSelType = pWrtSh->GetSelectionType();
            if( ( nSelType & SwWrtShell::SEL_GRF ) ||
                ( nSelType & SwWrtShell::SEL_OLE && GRAPHIC_NONE !=
                            pWrtSh->GetIMapGraphic().GetType() ))
                bShowCB = TRUE;
        }
        if( bShowCB )
        {
            aWrapOutlineCB.Show();
            aWrapOutsideCB.Show();
        }
    }

    nHtmlMode = ::GetHtmlMode((const SwDocShell*)SfxObjectShell::Current());
    bHtmlMode = nHtmlMode & HTMLMODE_ON ? TRUE : FALSE;

    FieldUnit aMetric = ::GetDfltMetric(bHtmlMode);
    SetMetric( aLeftMarginED  , aMetric );
    SetMetric( aRightMarginED , aMetric );
    SetMetric( aTopMarginED   , aMetric );
    SetMetric( aBottomMarginED, aMetric );

    const SwFmtSurround& rSurround = (const SwFmtSurround&)rSet.Get(RES_SURROUND);

    USHORT nSur = rSurround.GetSurround();
    const SwFmtAnchor &rAnch = (const SwFmtAnchor&)rSet.Get(RES_ANCHOR);
    nAnchorId = rAnch.GetAnchorId();

    if ( (nAnchorId == FLY_AT_CNTNT || nAnchorId == FLY_AUTO_CNTNT) && nSur != SURROUND_NONE )
        aWrapAnchorOnlyCB.Check( rSurround.IsAnchorOnly() );
    else
        aWrapAnchorOnlyCB.Enable( FALSE );

    BOOL bContour = rSurround.IsContour();
    aWrapOutlineCB.Check( bContour );
    aWrapOutsideCB.Check( rSurround.IsOutside() );
    aWrapThroughRB.Enable(!aWrapOutlineCB.IsChecked());
    bContourImage = !bContour;

    ImageRadioButton* pBtn = NULL;

    switch (nSur)
    {
        case SURROUND_NONE:
        {
            pBtn = &aNoWrapRB;
            break;
        }

        case SURROUND_THROUGHT:
        {
            // transparent ?
            pBtn = &aWrapThroughRB;

            if (!bDrawMode)
            {
                const SvxOpaqueItem& rOpaque = (const SvxOpaqueItem&)rSet.Get(RES_OPAQUE);
                aWrapTransparentCB.Check(!rOpaque.GetValue());
            }
            break;
        }

        case SURROUND_PARALLEL:
        {
            pBtn = &aWrapParallelRB;
            break;
        }

        case SURROUND_IDEAL:
        {
            pBtn = &aIdealWrapRB;
            break;
        }

        default:
        {
            if (nSur == SURROUND_LEFT)
                pBtn = &aWrapLeftRB;
            else if (nSur == SURROUND_RIGHT)
                pBtn = &aWrapRightRB;
        }
    }
    if (pBtn)
    {
        pBtn->Check();
        WrapTypeHdl(pBtn);
        // Hier wird fuer Zeichenobjekte, die im Moment auf Durchlauf stehen,
        // schon mal der Default "Kontur an" vorbereitet, falls man spaeter auf
        // irgendeinen Umlauf umschaltet.
        if (bDrawMode && !aWrapOutlineCB.IsEnabled())
            aWrapOutlineCB.Check();
    }
    aWrapTransparentCB.Enable( pBtn == &aWrapThroughRB && !bHtmlMode );

    const SvxULSpaceItem& rUL = (const SvxULSpaceItem&)rSet.Get(RES_UL_SPACE);
    const SvxLRSpaceItem& rLR = (const SvxLRSpaceItem&)rSet.Get(RES_LR_SPACE);

    // Abstand zum Text
    aLeftMarginED.SetValue(aLeftMarginED.Normalize(rLR.GetLeft()), FUNIT_TWIP);
    aRightMarginED.SetValue(aRightMarginED.Normalize(rLR.GetRight()), FUNIT_TWIP);
    aTopMarginED.SetValue(aTopMarginED.Normalize(rUL.GetUpper()), FUNIT_TWIP);
    aBottomMarginED.SetValue(aBottomMarginED.Normalize(rUL.GetLower()), FUNIT_TWIP);

    ContourHdl(0);
    ActivatePage( rSet );
}

/*--------------------------------------------------------------------
    Beschreibung:   Attribute in den Set stopfen bei OK
 --------------------------------------------------------------------*/



BOOL SwWrapTabPage::FillItemSet(SfxItemSet &rSet)
{
    BOOL bModified = FALSE;
    const SfxPoolItem* pOldItem;

    const SwFmtSurround& rOldSur = (const SwFmtSurround&)GetItemSet().Get(RES_SURROUND);
    SwFmtSurround aSur( rOldSur );

    SvxOpaqueItem aOp;

    if (!bDrawMode)
    {
        const SvxOpaqueItem& rOpaque = (const SvxOpaqueItem&)GetItemSet().Get(RES_OPAQUE);
        SvxOpaqueItem aOp = rOpaque;
        aOp.SetValue(TRUE);
    }

    if (aNoWrapRB.IsChecked())
        aSur.SetSurround(SURROUND_NONE);
    else if (aWrapLeftRB.IsChecked())
        aSur.SetSurround(SURROUND_LEFT);
    else if (aWrapRightRB.IsChecked())
        aSur.SetSurround(SURROUND_RIGHT);
    else if (aWrapParallelRB.IsChecked())
        aSur.SetSurround(SURROUND_PARALLEL);
    else if (aWrapThroughRB.IsChecked())
    {
        aSur.SetSurround(SURROUND_THROUGHT);
        if (aWrapTransparentCB.IsChecked() && !bDrawMode)
            aOp.SetValue(FALSE);
    }
    else if (aIdealWrapRB.IsChecked())
        aSur.SetSurround(SURROUND_IDEAL);

    aSur.SetAnchorOnly( aWrapAnchorOnlyCB.IsChecked() );
    BOOL bContour = aWrapOutlineCB.IsChecked() && aWrapOutlineCB.IsEnabled();
    aSur.SetContour( bContour );

    if ( bContour )
        aSur.SetOutside(aWrapOutsideCB.IsChecked());

    if(0 == (pOldItem = GetOldItem( rSet, RES_SURROUND )) ||
                aSur != *pOldItem )
    {
        rSet.Put(aSur);
        bModified = TRUE;
    }

    if (!bDrawMode)
    {
        if(0 == (pOldItem = GetOldItem( rSet, FN_OPAQUE )) ||
                    aOp != *pOldItem )
        {
            rSet.Put(aOp);
            bModified = TRUE;
        }
    }

    BOOL bTopMod = aTopMarginED.IsValueModified();
    BOOL bBottomMod = aBottomMarginED.IsValueModified();

    SvxULSpaceItem aUL;
    aUL.SetUpper((USHORT)aTopMarginED.Denormalize(aTopMarginED.GetValue(FUNIT_TWIP)));
    aUL.SetLower((USHORT)aBottomMarginED.Denormalize(aBottomMarginED.GetValue(FUNIT_TWIP)));

    if ( bTopMod || bBottomMod )
    {
        if(0 == (pOldItem = GetOldItem(rSet, RES_UL_SPACE)) ||
                aUL != *pOldItem )
        {
            rSet.Put( aUL, RES_UL_SPACE );
            bModified = TRUE;
        }
    }

    BOOL bLeftMod = aLeftMarginED.IsValueModified();
    BOOL bRightMod = aRightMarginED.IsValueModified();

    SvxLRSpaceItem aLR;
    aLR.SetLeft((USHORT)aLeftMarginED.Denormalize(aLeftMarginED.GetValue(FUNIT_TWIP)));
    aLR.SetRight((USHORT)aRightMarginED.Denormalize(aRightMarginED.GetValue(FUNIT_TWIP)));

    if ( bLeftMod || bRightMod )
    {
        if( 0 == (pOldItem = GetOldItem(rSet, RES_LR_SPACE)) ||
                aLR != *pOldItem )
        {
            rSet.Put(aLR, RES_LR_SPACE);
            bModified = TRUE;
        }
    }

    if ( bDrawMode )
    {
        BOOL bChecked = aWrapTransparentCB.IsChecked() & aWrapTransparentCB.IsEnabled();
        if (aWrapTransparentCB.GetSavedValue() != bChecked)
            bModified |= 0 != rSet.Put(SfxInt16Item(FN_DRAW_WRAP_DLG, bChecked ? 0 : 1));
    }

    return bModified;
}

/*--------------------------------------------------------------------
    Beschreibung:   Bsp - Update
 --------------------------------------------------------------------*/



void SwWrapTabPage::ActivatePage(const SfxItemSet& rSet)
{
    // Anchor
    const SwFmtAnchor &rAnch = (const SwFmtAnchor&)rSet.Get(RES_ANCHOR);
    nAnchorId = rAnch.GetAnchorId();
    BOOL bEnable = nAnchorId != FLY_IN_CNTNT;

    if (!bDrawMode)
    {
        SwWrtShell* pSh = bFormat ? ::GetActiveWrtShell() : pWrtSh;
        SwFlyFrmAttrMgr aMgr( bNew, pSh, (const SwAttrSet&)GetItemSet() );
        SwFrmValid      aVal;

        // Size
        const SwFmtFrmSize& rFrmSize = (const SwFmtFrmSize&)rSet.Get(RES_FRM_SIZE);
        Size aSize = rFrmSize.GetSize();

        // Rand
        const SvxULSpaceItem& rUL = (const SvxULSpaceItem&)rSet.Get(RES_UL_SPACE);
        const SvxLRSpaceItem& rLR = (const SvxLRSpaceItem&)rSet.Get(RES_LR_SPACE);
        nOldLeftMargin  = rLR.GetLeft();
        nOldRightMargin = rLR.GetRight();
        nOldUpperMargin = rUL.GetUpper();
        nOldLowerMargin = rUL.GetLower();

        // Position
        const SwFmtHoriOrient& rHori = (const SwFmtHoriOrient&)rSet.Get(RES_HORI_ORIENT);
        const SwFmtVertOrient& rVert = (const SwFmtVertOrient&)rSet.Get(RES_VERT_ORIENT);

        aVal.eArea = (RndStdIds)nAnchorId;
        aVal.bAuto = rFrmSize.GetSizeType() == ATT_MIN_SIZE;
        aVal.bMirror = rHori.IsPosToggle();

        aVal.eHori = rHori.GetHoriOrient();
        aVal.eVert = (SvxFrameVertOrient)rVert.GetVertOrient();

        aVal.nHPos = rHori.GetPos();
        aVal.eHRel = rHori.GetRelationOrient();
        aVal.nVPos = rVert.GetPos();
        aVal.eVRel = rVert.GetRelationOrient();

        if (rFrmSize.GetWidthPercent() && rFrmSize.GetWidthPercent() != 0xff)
            aSize.Width() = aSize.Width() * rFrmSize.GetWidthPercent() / 100;

        if (rFrmSize.GetHeightPercent() && rFrmSize.GetHeightPercent() != 0xff)
            aSize.Height() = aSize.Height() * rFrmSize.GetHeightPercent() / 100;

        aVal.nWidth  = aSize.Width();
        aVal.nHeight = aSize.Height();
        aFrmSize = aSize;

        aMgr.ValidateMetrics(aVal);

        SwTwips nLeft;
        SwTwips nRight;
        SwTwips nTop;
        SwTwips nBottom;

        nLeft   = aVal.nHPos - aVal.nMinHPos;
        nRight  = aVal.nMaxWidth - aVal.nWidth;
        nTop    = aVal.nVPos - aVal.nMinVPos;
        nBottom = aVal.nMaxHeight - aVal.nHeight;

        if (bHtmlMode && 0 == (nHtmlMode & HTMLMODE_FULL_ABS_POS))
        {
            nLeft = nRight = ( nLeft + nRight ) / 2;
            nTop = nBottom = ( nTop + nBottom ) / 2;
        }
        else
        {
            if (aVal.eArea == FLY_IN_CNTNT)
            {
                nLeft = nRight;

                if (aVal.nVPos < 0)
                {
                    if (aVal.nVPos <= aVal.nMaxHeight)
                        nTop = aVal.nMaxVPos - aVal.nHeight;
                    else
                        nTop = nBottom = 0; // Kein Umlauf
                }
                else
                    nTop = aVal.nMaxVPos - aVal.nHeight - aVal.nVPos;
            }
            else
            {
                nLeft += nRight;
                nTop += nBottom;
            }

            nBottom = nTop;
            nRight = nLeft;
        }

        aLeftMarginED.SetMax(aLeftMarginED.Normalize(nLeft), FUNIT_TWIP);
        aRightMarginED.SetMax(aRightMarginED.Normalize(nRight), FUNIT_TWIP);

        aTopMarginED.SetMax(aTopMarginED.Normalize(nTop), FUNIT_TWIP);
        aBottomMarginED.SetMax(aBottomMarginED.Normalize(nBottom), FUNIT_TWIP);

        RangeModifyHdl(&aLeftMarginED);
        RangeModifyHdl(&aTopMarginED);
    }

    const SwFmtSurround& rSurround = (const SwFmtSurround&)rSet.Get(RES_SURROUND);
    USHORT nSur = rSurround.GetSurround();

    aWrapTransparentCB.Enable( bEnable && !bHtmlMode && nSur == SURROUND_THROUGHT );
    if(bHtmlMode)
    {
        BOOL bSomeAbsPos = 0 != (nHtmlMode & HTMLMODE_SOME_ABS_POS);
        const SwFmtHoriOrient& rHori = (const SwFmtHoriOrient&)rSet.Get(RES_HORI_ORIENT);
        SwHoriOrient eHOrient = rHori.GetHoriOrient();
        SwRelationOrient  eHRelOrient = rHori.GetRelationOrient();
        aWrapOutlineCB.Hide();
        BOOL bAllHtmlModes = (nAnchorId == FLY_AT_CNTNT || nAnchorId == FLY_AUTO_CNTNT) &&
                            (eHOrient == HORI_RIGHT || eHOrient == HORI_LEFT);
        aWrapAnchorOnlyCB.Enable( bAllHtmlModes && nSur != SURROUND_NONE );
        aWrapOutsideCB.Hide();
        aIdealWrapRB.Enable( FALSE );


        aWrapTransparentCB.Enable( FALSE );
        aNoWrapRB.Enable( FLY_AT_CNTNT == nAnchorId );
        aWrapParallelRB.Enable( FALSE  );
        aWrapLeftRB       .Enable( FLY_AT_CNTNT == nAnchorId ||
                            (FLY_AUTO_CNTNT == nAnchorId && eHOrient == HORI_RIGHT && eHRelOrient == PRTAREA));
        aWrapRightRB      .Enable( FLY_AT_CNTNT == nAnchorId ||
                            ( FLY_AUTO_CNTNT == nAnchorId && eHOrient == HORI_LEFT && eHRelOrient == PRTAREA));

        aWrapThroughRB.Enable( (FLY_PAGE == nAnchorId ||
                                (FLY_AUTO_CNTNT == nAnchorId && eHRelOrient != PRTAREA) || FLY_AT_CNTNT == nAnchorId )
                                    && bSomeAbsPos &&
                                        eHOrient != HORI_RIGHT);
        if(aNoWrapRB.IsChecked() && !aNoWrapRB.IsEnabled())
        {
            if(aWrapThroughRB.IsEnabled())
                aWrapThroughRB.Check(TRUE);
            else if(aWrapLeftRB.IsEnabled())
                aWrapLeftRB.Check();
            else if(aWrapRightRB.IsEnabled())
                aWrapRightRB.Check();

        }
        if(aWrapLeftRB.IsChecked() && !aWrapLeftRB.IsEnabled())
        {
            if(aWrapRightRB.IsEnabled())
                aWrapRightRB.Check();
            else if(aWrapThroughRB.IsEnabled())
                aWrapThroughRB.Check();
        }
        if(aWrapRightRB.IsChecked() && !aWrapRightRB.IsEnabled())
        {
            if(aWrapLeftRB.IsEnabled())
                aWrapLeftRB.Check();
            else if(aWrapThroughRB.IsEnabled())
                aWrapThroughRB.Check();
        }
        if(aWrapThroughRB.IsChecked() && !aWrapThroughRB.IsEnabled())
            if(aNoWrapRB.IsEnabled())
                aNoWrapRB.Check();

        if(aWrapParallelRB.IsChecked() && !aWrapParallelRB.IsEnabled())
            aWrapThroughRB.Check();
    }
    else
    {
        aNoWrapRB.Enable( bEnable );
        aWrapLeftRB.Enable( bEnable );
        aWrapRightRB.Enable( bEnable );
        aIdealWrapRB.Enable( bEnable );
        aWrapThroughRB.Enable( bEnable );
        aWrapParallelRB.Enable( bEnable );
        aWrapAnchorOnlyCB.Enable( (nAnchorId == FLY_AT_CNTNT || nAnchorId == FLY_AUTO_CNTNT)
                && nSur != SURROUND_NONE && nSur != SURROUND_THROUGHT );
    }
    ContourHdl(0);
}



int SwWrapTabPage::DeactivatePage(SfxItemSet* pSet)
{
    if(pSet)
        FillItemSet(*pSet);

    return TRUE;
}

/*--------------------------------------------------------------------
    Beschreibung:   Bereichspruefung
 --------------------------------------------------------------------*/



IMPL_LINK( SwWrapTabPage, RangeModifyHdl, MetricField *, pEdit )
{
    if(bHtmlMode && 0 == (nHtmlMode & HTMLMODE_FULL_ABS_POS))
    {
        long nValue = pEdit->GetValue();
        if (pEdit == &aLeftMarginED)
            aRightMarginED.SetUserValue(nValue, FUNIT_NONE);
        else if (pEdit == &aRightMarginED)
            aLeftMarginED.SetUserValue(nValue, FUNIT_NONE);
        else if (pEdit == &aTopMarginED)
            aBottomMarginED.SetUserValue(nValue, FUNIT_NONE);
        else if (pEdit == &aBottomMarginED)
            aTopMarginED.SetUserValue(nValue, FUNIT_NONE);
    }
    else
    {
        long nValue = pEdit->GetValue();
        MetricField *pOpposite;

        if (pEdit == &aLeftMarginED)
            pOpposite = &aRightMarginED;
        else if (pEdit == &aRightMarginED)
            pOpposite = &aLeftMarginED;
        else if (pEdit == &aTopMarginED)
            pOpposite = &aBottomMarginED;
        else if (pEdit == &aBottomMarginED)
            pOpposite = &aTopMarginED;

        long nOpposite = pOpposite->GetValue();

        if (nValue + nOpposite > Max(pEdit->GetMax(), pOpposite->GetMax()))
            pOpposite->SetValue(pOpposite->GetMax() - nValue);
    }

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



IMPL_LINK( SwWrapTabPage, WrapTypeHdl, ImageRadioButton *, pBtn )
{
    BOOL bWrapThrough = (pBtn == &aWrapThroughRB);
    aWrapTransparentCB.Enable( bWrapThrough && !bHtmlMode );
    bWrapThrough |= ( nAnchorId == FLY_IN_CNTNT );
    aWrapOutlineCB.Enable( !bWrapThrough );
    aWrapOutsideCB.Enable( !bWrapThrough && aWrapOutlineCB.IsChecked() );
    aWrapAnchorOnlyCB.Enable( (nAnchorId == FLY_AT_CNTNT || nAnchorId == FLY_AUTO_CNTNT) &&
        (pBtn != &aNoWrapRB) && !bWrapThrough );

    ContourHdl(0);
    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



IMPL_LINK( SwWrapTabPage, ContourHdl, CheckBox *, pBtn )
{
    BOOL bEnable = !(aWrapOutlineCB.IsChecked() && aWrapOutlineCB.IsEnabled());

    aWrapOutsideCB.Enable(!bEnable);

    bEnable =  !aWrapOutlineCB.IsChecked();
    if (bEnable == bContourImage) // damit es nicht immer flackert
    {
        if(bEnable)
        {
            aNoWrapRB.SetImage(aWrapIL.GetImage(IMG_NONE));
            aWrapLeftRB.SetImage(aWrapIL.GetImage(IMG_LEFT));
            aWrapRightRB.SetImage(aWrapIL.GetImage(IMG_RIGHT));
            aWrapParallelRB.SetImage(aWrapIL.GetImage(IMG_PARALLEL));
            aIdealWrapRB.SetImage(aWrapIL.GetImage(IMG_IDEAL));
            bContourImage = FALSE;
        }
        else
        {
            aNoWrapRB.SetImage(aWrapIL.GetImage( IMG_KON_NONE ));
            aWrapLeftRB.SetImage(aWrapIL.GetImage( IMG_KON_LEFT ));
            aWrapRightRB.SetImage(aWrapIL.GetImage( IMG_KON_RIGHT ));
            aWrapParallelRB.SetImage(aWrapIL.GetImage(IMG_KON_PARALLEL ));
            aIdealWrapRB.SetImage(aWrapIL.GetImage( IMG_KON_IDEAL ));
            bContourImage = TRUE;
        }
    }

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



USHORT* SwWrapTabPage::GetRanges()
{
    return aWrapPageRg;
}

/*--------------------------------------------------------------------

   $Log: not supported by cvs2svn $
   Revision 1.61  2000/09/18 16:05:35  willem.vandorp
   OpenOffice header added.

   Revision 1.60  2000/03/13 16:42:50  jp
   Bug #73538#: Reset - show or hide the contour checkboxes

   Revision 1.59  1999/09/28 10:24:03  os
   #68077# :ActivatePage AnchorOnly not enabled in wrap through

   Revision 1.58  1998/09/08 14:57:00  OS
   #56134# Metric fuer Text und HTML getrennt


      Rev 1.57   08 Sep 1998 16:57:00   OS
   #56134# Metric fuer Text und HTML getrennt

      Rev 1.56   10 Jul 1998 10:14:24   OS
   Fix im Umlauf fuer HTML

      Rev 1.55   23 Apr 1998 12:58:00   OS
   noch ein paar HTML-Reste

      Rev 1.54   16 Apr 1998 13:11:04   OS
   Rahmenanpassung die zweite

      Rev 1.53   07 Apr 1998 12:00:48   OM
   Maximalwerte fuer Umlauf

      Rev 1.52   06 Apr 1998 09:48:30   OS
   HTML-Anpassungen

      Rev 1.51   30 Mar 1998 13:20:54   OM
   Umlauf nicht mehr auf naechsten Rand begrenzen

      Rev 1.50   25 Feb 1998 15:12:36   OM
   AnchorOnly auch bei Auto-Anker

      Rev 1.49   04 Feb 1998 11:46:30   OM
   #45775# Keine Maximalwerteinschraenkung bei Rahmenvorlagen

      Rev 1.48   28 Nov 1997 19:49:20   MA
   basobj

      Rev 1.47   24 Nov 1997 17:39:32   MA
   include

      Rev 1.46   20 Nov 1997 12:14:58   AMA
   Opt. SwSurround: GoldCut jetzt als Enum; nicht implementierte Enums entfernt

      Rev 1.45   03 Nov 1997 13:19:50   MA
   precomp entfernt

      Rev 1.44   30 Sep 1997 18:34:22   MA
   nicht gepostete MUSS-Aenderung eingebaut

      Rev 1.43   01 Sep 1997 13:26:22   OS
   DLL-Umstellung

      Rev 1.42   12 Aug 1997 15:58:08   OS
   frmitems/textitem/paraitem aufgeteilt

      Rev 1.41   07 Aug 1997 14:59:16   OM
   Headerfile-Umstellung

      Rev 1.40   10 Jul 1997 15:56:44   OM
   Abstand oben/unten

      Rev 1.39   02 Jul 1997 13:43:50   AMA
   New: Abstaende nach oben/unten, noch nicht freigeschaltet

      Rev 1.38   05 May 1997 16:37:48   OM
   Ohne Umlauf kein erster Absatz

      Rev 1.37   11 Mar 1997 15:18:18   OM
   Bei Html-Mode falsche Umlaufform nicht korrigieren

      Rev 1.36   23 Feb 1997 16:59:34   AMA
   Fix: Zeichengeb.: Abstand oben/unten zulassen; Outline nicht

      Rev 1.35   20 Feb 1997 13:45:48   AMA
   Fix #36502#: Rahmenabstaende im HTML-Mode zulassen.

      Rev 1.34   20 Feb 1997 13:42:58   AMA
   Fix #36502#: Rahmenabstaende im HTML-Mode zulassen.

      Rev 1.33   10 Feb 1997 10:02:24   OM
   Aufgeraeumt

      Rev 1.31   05 Feb 1997 16:18:20   OS
   keine Kontur fuer Html

      Rev 1.30   04 Feb 1997 16:28:56   OM
   Controller disablen

      Rev 1.29   03 Feb 1997 16:30:24   OM
   Maximalwertberechnung fuer zeichengebundene Rahmen geaendert

      Rev 1.28   03 Feb 1997 16:00:42   OM
   Maximalwertberechnung fuer zeichengebundene Rahmen geaendert

      Rev 1.27   28 Jan 1997 18:36:22   HJS
   includes

      Rev 1.26   28 Jan 1997 16:31:50   OS
   HtmlMode mit GetHtmlMode ermitteln

      Rev 1.25   24 Jan 1997 16:58:26   HJS
   #35241# GPF gefixed - fuer OM

      Rev 1.25   24 Jan 1997 13:39:56   OM
   #35241# GPF gefixt

      Rev 1.24   22 Jan 1997 11:32:08   MA
   Umstellung Put

      Rev 1.23   21 Jan 1997 10:21:28   OM
   Checkbox fuer: nur aussen

      Rev 1.22   13 Jan 1997 16:59:10   MA
   Kontur fuer Grafik und OLE

      Rev 1.21   08 Jan 1997 10:56:44   OS
   SID_HTML_MODE jetzt UInt16Item

      Rev 1.20   07 Jan 1997 08:54:46   MA
   new_frm_size entfernt

      Rev 1.19   18 Dec 1996 12:15:00   OM
   Konturumfluss defaulten

      Rev 1.18   17 Dec 1996 16:28:14   OM
   Kontur defaulten

      Rev 1.17   27 Nov 1996 16:14:38   OM
   #33427# Zeichenobjekte: automatischer Layerwechsel je nach Umlaufart

      Rev 1.16   19 Nov 1996 11:42:28   OS
   +ImageList

      Rev 1.15   15 Nov 1996 20:24:52   MA
   #32280#

      Rev 1.14   14 Nov 1996 12:00:42   OS
   Zusaetze-Group ausgelagert, Flackern verhindert, keine ContourImage fuer Durchlauf

      Rev 1.13   12 Nov 1996 16:11:20   MA
   Vorb. Rahmenabstand

      Rev 1.12   11 Nov 1996 10:39:36   MA
   ResMgr

      Rev 1.11   08 Nov 1996 15:58:52   OM
   Schuetzen neu organisiert, transparenz im Draw-Mode

      Rev 1.10   06 Nov 1996 15:21:52   OM
   Kontur enabled

      Rev 1.9   06 Nov 1996 11:31:18   OM
   #33048# Transparent-CB nur bei Durchlauf enablen

      Rev 1.8   05 Nov 1996 17:44:16   OM
   #33046# Rand-Maximalwertberechnung korrigiert

      Rev 1.7   04 Nov 1996 16:50:46   OM
   Maximalwertbegrenzung fuer Umlauf-TP

      Rev 1.6   30 Oct 1996 15:40:00   OM
   Neue Segs

      Rev 1.5   30 Oct 1996 15:39:40   OM
   Durchlauf auch bei Draw-Objekten

      Rev 1.4   29 Oct 1996 17:14:40   OM
   Abstaende auch im Drawmode

      Rev 1.3   29 Oct 1996 15:39:04   OM
   Controls im Drawmode verstecken

      Rev 1.2   25 Oct 1996 16:01:26   OM
   Controls im Drawmode verstecken

      Rev 1.1   25 Oct 1996 15:06:42   OM
   Neue Umfluss-Tabpage in Rahmendialog uebernommen

      Rev 1.0   23 Oct 1996 19:54:46   OM
   Initial revision.

--------------------------------------------------*/


diff --git a/sw/source/ui/frmdlg/wrap.hrc b/sw/source/ui/frmdlg/wrap.hrc
new file mode 100644
index 0000000..ffa36ad
--- /dev/null
+++ b/sw/source/ui/frmdlg/wrap.hrc
@@ -0,0 +1,98 @@
/*************************************************************************
 *
 *  $RCSfile: wrap.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:38 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#define RB_NO_WRAP          2
#define RB_WRAP_LEFT        3
#define RB_WRAP_RIGHT       4
#define RB_WRAP_PARALLEL    5
#define RB_WRAP_THROUGH     6
#define RB_WRAP_IDEAL       7
#define CB_ANCHOR_ONLY      8
#define FT_LEFT_MARGIN      13
#define ED_LEFT_MARGIN      14
#define FT_RIGHT_MARGIN     15
#define ED_RIGHT_MARGIN     16
#define FT_TOP_MARGIN       17
#define ED_TOP_MARGIN       18
#define ED_BOTTOM_MARGIN    19
#define FT_BOTTOM_MARGIN    20
#define GB_MARGIN           21
#define CB_TRANSPARENT      22
#define CB_OUTLINE          23
#define GB_OPTION           24
#define CB_ONLYOUTSIDE      25
#define C_WRAP_BOX          31

#define IL_WRAP             32
// nur fuer die ImageList
#define IMG_BEGIN       1
#define IMG_NONE        (IMG_BEGIN)
#define IMG_LEFT        (IMG_BEGIN + 1)
#define IMG_RIGHT               (IMG_BEGIN + 2)
#define IMG_PARALLEL            (IMG_BEGIN + 3)
#define IMG_THROUGH             (IMG_BEGIN + 4)
#define IMG_IDEAL       (IMG_BEGIN + 5)
#define IMG_KON_NONE        (IMG_BEGIN + 6)
#define IMG_KON_LEFT            (IMG_BEGIN + 7)
#define IMG_KON_RIGHT           (IMG_BEGIN + 8)
#define IMG_KON_PARALLEL        (IMG_BEGIN + 9)
#define IMG_KON_IDEAL           (IMG_BEGIN + 10)


diff --git a/sw/source/ui/frmdlg/wrap.src b/sw/source/ui/frmdlg/wrap.src
new file mode 100644
index 0000000..848d70d
--- /dev/null
+++ b/sw/source/ui/frmdlg/wrap.src
@@ -0,0 +1,597 @@
/*************************************************************************
 *
 *  $RCSfile: wrap.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:38 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "frmui.hrc"
#include "wrap.hrc"
#include "globals.hrc"
#include "helpid.h"
TabPage TP_FRM_WRAP
{
    SVLook = TRUE ;
    HelpID = HID_FRM_EXT ;
    Pos = MAP_APPFONT ( 0 , 0 ) ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Hide = TRUE;
    GroupBox C_WRAP_BOX
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 248 , 48 ) ;
    };
    ImageRadioButton RB_NO_WRAP
    {
        Pos = MAP_APPFONT ( 9 , 10 ) ;
        Size = MAP_APPFONT ( 37 , 37 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? ~Kein : ~Keiner */
        /* ### ACHTUNG: Neuer Text in Resource? ~Kein : ~Keiner */
        /* ### ACHTUNG: Neuer Text in Resource? ~Kein : ~Keiner */
        Text = "~Kein" ;
        Text [ ENGLISH ] = "No Wrap" ;
        Text [ english_us ] = "~None" ;
        TopImage = True ;
        Text [ dutch ] = "~Geen" ;
        Text [ italian ] = "~Senza" ;
        Text [ spanish ] = "~Ninguno" ;
        Text [ french ] = "~Aucun(e)" ;
        Text [ swedish ] = "~Ingen" ;
        Text [ danish ] = "Ingen" ;
        Text [ portuguese ] = "~Nenhum" ;
        Text [ portuguese_brazilian ] = "~Kein" ;
        Text[ chinese_simplified ] = "ÎÞ(~N)";
        Text[ russian ] = "Áåç";
        Text[ polish ] = "Brak";
        Text[ japanese ] = "ã‰º(~N)";
        Text[ language_user1 ] = "Íåò";
        Text[ chinese_traditional ] = "µL(~N)";
        Text[ arabic ] = "ÈÏæä";
        Text[ greek ] = "ÊáíÝíá";
        Text[ korean ] = "¾øÀ½(~N)";
        Text[ turkish ] = "~Yok";
    };
    ImageRadioButton RB_WRAP_LEFT
    {
        Pos = MAP_APPFONT ( 50 , 10 ) ;
        Size = MAP_APPFONT ( 37 , 37 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? ~Links : Links */
        /* ### ACHTUNG: Neuer Text in Resource? ~Links : Links */
        /* ### ACHTUNG: Neuer Text in Resource? ~Links : Links */
        Text = "~Links" ;
        Text [ ENGLISH ] = "~Left" ;
        Text [ english_us ] = "~Left" ;
        TopImage = True ;
        Text [ dutch ] = "~Links" ;
        Text [ italian ] = "Sinistra" ;
        Text [ spanish ] = "Iz~quierda" ;
        Text [ french ] = "~À gauche" ;
        Text [ swedish ] = "V~änster" ;
        Text [ danish ] = "Venstre" ;
        Text [ portuguese ] = "~Esquerda" ;
        Text [ portuguese_brazilian ] = "~Links" ;
        Text[ chinese_simplified ] = "×ó(~L)";
        Text[ russian ] = "Ñëåâà";
        Text[ polish ] = "Z le~wej";
        Text[ japanese ] = "¶(~L)";
        Text[ chinese_traditional ] = "¥ª(~L)";
        Text[ arabic ] = "Åáì ÇáíÓÇÑ";
        Text[ greek ] = "ÁñéóôåñÜ";
        Text[ korean ] = "¿ÞÂÊ(~L)";
        Text[ turkish ] = "So~l";
    };
    ImageRadioButton RB_WRAP_RIGHT
    {
        Pos = MAP_APPFONT ( 91 , 10 ) ;
        Size = MAP_APPFONT ( 37 , 37 ) ;
        Text = "~Rechts" ;
        Text [ ENGLISH ] = "~Right" ;
        Text [ english_us ] = "R~ight" ;
        TopImage = True ;
        Text [ dutch ] = "~Rechts" ;
        Text [ italian ] = "Destra" ;
        Text [ spanish ] = "~Derecha" ;
        Text [ french ] = "À ~droite" ;
        Text [ swedish ] = "Hö~ger" ;
        Text [ danish ] = "Højre" ;
        Text [ portuguese ] = "~Direita" ;
        Text [ portuguese_brazilian ] = "~Rechts" ;
        Text[ chinese_simplified ] = "ÓÒ(~R)";
        Text[ russian ] = "Ñïðàâà";
        Text[ polish ] = "Z prawej";
        Text[ japanese ] = "‰E(~R)";
        Text[ chinese_traditional ] = "¥k(~R)";
        Text[ arabic ] = "Åáì Çáíãíä";
        Text[ greek ] = "ÄåîéÜ";
        Text[ korean ] = "¿À¸¥ÂÊ(~I)";
        Text[ turkish ] = "Sa~ð";
    };
    ImageRadioButton RB_WRAP_PARALLEL
    {
        Pos = MAP_APPFONT ( 132 , 10 ) ;
        Size = MAP_APPFONT ( 37 , 37 ) ;
        Text = "~Parallel" ;
        Text [ ENGLISH ] = "~Parallel" ;
        Text [ english_us ] = "~Parallel" ;
        TopImage = True ;
        Text [ dutch ] = "~Parallel" ;
        Text [ italian ] = "~Parallelo" ;
        Text [ spanish ] = "~Paralelo" ;
        Text [ french ] = "~Parallèle" ;
        Text [ swedish ] = "~Parallell" ;
        Text [ danish ] = "Parallel" ;
        Text [ portuguese ] = "~Paralelo" ;
        Text [ portuguese_brazilian ] = "~Parallel" ;
        Text[ chinese_simplified ] = "ƽÐÐ(~P)";
        Text[ russian ] = "Ïàðàëëåëüíî";
        Text[ polish ] = "Równ~olegle";
        Text[ japanese ] = "—¼‘¤(~P)";
        Text[ chinese_traditional ] = "¥­¦æ(~P)";
        Text[ arabic ] = "ãÊæÇÒ";
        Text[ greek ] = "ÐáñÜëëçëá";
        Text[ korean ] = "ÆòÇà(~P)";
        Text[ turkish ] = "~Paralel";
    };
    ImageRadioButton RB_WRAP_THROUGH
    {
        Pos = MAP_APPFONT ( 173 , 10 ) ;
        Size = MAP_APPFONT ( 37 , 37 ) ;
        Text = "~Durchlauf" ;
        Text [ ENGLISH ] = "Wrap ~through" ;
        Text [ norwegian ] = "Wrap ~through" ;
        Text [ italian ] = "~Attraverso" ;
        Text [ portuguese_brazilian ] = "Circundarmento ~através" ;
        Text [ portuguese ] = "~Através do objecto" ;
        Text [ finnish ] = "Kierrätys ~läpi" ;
        Text [ danish ] = "Gennem" ;
        Text [ french ] = "À ~travers" ;
        Text [ swedish ] = "Genomflö~de" ;
        Text [ dutch ] = "~Doorloop" ;
        Text [ spanish ] = "~Continuo" ;
        Text [ english_us ] = "Thro~ugh" ;
        TopImage = True ;
        Text[ chinese_simplified ] = "¹á´©(~T)";
        Text[ russian ] = "Ñêâîçíîå";
        Text[ polish ] = "Przep³. te~kstu";
        Text[ japanese ] = "Ü‚è•Ô‚µ‚È‚µ(~T)";
        Text[ chinese_traditional ] = "¤£Àô¶(~T)";
        Text[ arabic ] = "ÚÈÑ";
        Text[ greek ] = "Äéá ìÝóïõ";
        Text[ korean ] = "Àüü µ¹¸²(~U)";
        Text[ turkish ] = "~Metin arkasýna gönder";
    };
    ImageRadioButton RB_WRAP_IDEAL
    {
        Pos = MAP_APPFONT ( 214 , 10 ) ;
        Size = MAP_APPFONT ( 37 , 37 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? D~ynamisch : ~Optimal */
        /* ### ACHTUNG: Neuer Text in Resource? D~ynamisch : ~Optimal */
        Text = "D~ynamisch" ;
        Text [ ENGLISH ] = "D~ynamic Wrap" ;
        TopImage = True ;
        Text [ dutch ] = "D~ynamisch" ;
        Text [ english_us ] = "~Optimal" ;
        Text [ italian ] = "~Dinamico" ;
        Text [ spanish ] = "Diná~mico" ;
        Text [ french ] = "~Dynamique" ;
        Text [ swedish ] = "D~ynamisk" ;
        Text [ danish ] = "Dynamisk" ;
        Text [ portuguese ] = "D~inâmico" ;
        Text [ portuguese_brazilian ] = "D~ynamisch" ;
        Text[ chinese_simplified ] = "×î¼Ñ(~O)";
        Text[ russian ] = "Îïòèìàëüíîå";
        Text[ polish ] = "Dyna~miczny";
        Text[ japanese ] = "¶‰E“®“I(~O)";
        Text[ chinese_traditional ] = "³ÌÓì(~O)";
        Text[ arabic ] = "ÏíäÇãíßí";
        Text[ greek ] = "ÄõíáìéêÜ";
        Text[ korean ] = "ÃÖÀûÀÇ(~O)";
        Text[ turkish ] = "D~inamik";
    };
    CheckBox CB_ANCHOR_ONLY
    {
        Pos = MAP_APPFONT ( 12 , 65 ) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "Er~ster Absatz" ;
        Text [ ENGLISH ] = "First paragraph only" ;
        Text [ english_us ] = "~First paragraph" ;
        Text [ italian ] = "Primo paragrafo" ;
        Text [ spanish ] = "Primer párra~fo" ;
        Text [ french ] = "1~er paragraphe" ;
        Text [ dutch ] = "~Eerste alinea" ;
        Text [ swedish ] = "För~sta stycket" ;
        Text [ danish ] = "Første afsnit" ;
        Text [ portuguese_brazilian ] = "Erster Absat~z" ;
        Text [ portuguese ] = "Primeiro pará~grafo" ;
        Text[ chinese_simplified ] = "µÚÒ»¶ÎÂä(~F)";
        Text[ russian ] = "Ïåðâûé àáçàö";
        Text[ polish ] = "Pierwszy akapit";
        Text[ japanese ] = "Å‰‚Ì’i—Ž(~F)";
        Text[ chinese_traditional ] = "²Ä¤@¬q¸¨(~F)";
        Text[ arabic ] = "ÇáÝÞÑÉ ÇáÃæáì";
        Text[ greek ] = "Ðñþôç ðáñÜãñáöï~ò";
        Text[ korean ] = "ù ´Ü¶ô(~F)";
        Text[ turkish ] = "Ýlk paragraf";
    };
    CheckBox CB_TRANSPARENT
    {
        Pos = MAP_APPFONT ( 12 , 81 ) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? Im Hin~tergrund : ~Transparent */
        /* ### ACHTUNG: Neuer Text in Resource? Im Hin~tergrund : ~Transparent */
        /* ### ACHTUNG: Neuer Text in Resource? Im Hin~tergrund : ~Transparent */
        Text = "Im Hin~tergrund" ;
        Text [ ENGLISH ] = "To background" ;
        Text [ dutch ] = "~Op achtergrond" ;
        Text [ english_us ] = "In bac~kground" ;
        Text [ italian ] = "~Attraverso trasparente" ;
        Text [ spanish ] = "En el f~ondo" ;
        Text [ french ] = "À l'~arrière-plan" ;
        Text [ swedish ] = "I ~bakgrunden" ;
        Text [ danish ] = "I baggrunden" ;
        Text [ portuguese ] = "Em ~segundo plano" ;
        Text [ portuguese_brazilian ] = "Im Hin~tergrund" ;
        Text[ chinese_simplified ] = "ÖÃÓÚ±³¾°(~K)";
        Text[ russian ] = "Íà ôîíå";
        Text[ polish ] = "W tle";
        Text[ japanese ] = "”wŒi‚É(~K)";
        Text[ chinese_traditional ] = "¸m©ó­I´º(~K)";
        Text[ arabic ] = "Ýí ÇáÎáÝíÉ";
        Text[ greek ] = "Óå öüíôï";
        Text[ korean ] = "¹è°æ¿¡(~K)";
        Text[ turkish ] = "Arta~landa";
    };
    CheckBox CB_OUTLINE
    {
        Pos = MAP_APPFONT ( 12 , 97 ) ;
        Size = MAP_APPFONT ( 109 , 10 ) ;
        Text = "Kont~ur" ;
        Text [ ENGLISH ] = "Contou~r" ;
        Hide = TRUE ;
        Text [ dutch ] = "~Contour" ;
        Text [ english_us ] = "~Contour" ;
        Text [ italian ] = "Contorno" ;
        Text [ spanish ] = "Conto~rno" ;
        Text [ french ] = "~Contour" ;
        Text [ swedish ] = "Kont~ur" ;
        Text [ danish ] = "Kontur" ;
        Text [ portuguese ] = "~Contorno" ;
        Text [ portuguese_brazilian ] = "Kontu~r" ;
        Text[ chinese_simplified ] = "ÂÖÀª(~C)";
        Text[ russian ] = "Êîíòóð";
        Text[ polish ] = "Kontur";
        Text[ japanese ] = "—ÖŠs(~C)";
        Text[ chinese_traditional ] = "½ü¹ø(~C)";
        Text[ arabic ] = "ÇáÎØ ÇáßÝÇÝí";
        Text[ greek ] = "Ðåñßãñáììá";
        Text[ korean ] = "À±°û(~C)";
        Text[ turkish ] = "Kontu~r";
    };
    CheckBox CB_ONLYOUTSIDE
    {
        Pos = MAP_APPFONT ( 22 , 110 ) ;
        Size = MAP_APPFONT ( 99 , 10 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? Nur außen : Nur au˜en */
        Text = "~Nur außen" ;
        Text [ ENGLISH ] = "Only outside" ;
        Hide = TRUE ;
        Text [ portuguese ] = "Só ~exterior" ;
        Text [ english_us ] = "Outside only" ;
        Text [ portuguese_brazilian ] = "Nur außen" ;
        Text [ swedish ] = "Bara uta~nför" ;
        Text [ danish ] = "Kun yderside" ;
        Text [ italian ] = "Solo esterno" ;
        Text [ spanish ] = "Solo en el exterior" ;
        Text [ french ] = "~Seul l'extérieur" ;
        Text [ dutch ] = "~Alleen buiten" ;
        Text[ chinese_simplified ] = "Ö»ÊÇÍâ²à";
        Text[ russian ] = "Òîëüêî ñíàðóæè";
        Text[ polish ] = "Tylko na zewn¹trz";
        Text[ japanese ] = "ŠO‘¤‚Ì‚Ý";
        Text[ chinese_traditional ] = "¥u¬O¥~°¼";
        Text[ arabic ] = "Ýí ÇáÎÇÑÌ ÝÞØ";
        Text[ greek ] = "Ìü~íï åîùôåñéêÜ";
        Text[ korean ] = "¿ÜºÎ¸¸";
        Text[ turkish ] = "Yalnýzca dýþarýda";
    };
    GroupBox GB_OPTION
    {
        Pos = MAP_APPFONT ( 6 , 54 ) ;
        Size = MAP_APPFONT ( 121 , 75 ) ;
        Text = "Optionen" ;
        Text [ ENGLISH ] = "Options" ;
        Text [ dutch ] = "Opties" ;
        Text [ english_us ] = "Options" ;
        Text [ italian ] = "Opzioni" ;
        Text [ spanish ] = "Opciones" ;
        Text [ french ] = "Options" ;
        Text [ swedish ] = "Alternativ" ;
        Text [ danish ] = "Indstillinger" ;
        Text [ portuguese ] = "Opções" ;
        Text [ portuguese_brazilian ] = "Optionen" ;
        Text[ chinese_simplified ] = "Ñ¡Ïî";
        Text[ russian ] = "Ïàðàìåòðû";
        Text[ polish ] = "Opcje";
        Text[ japanese ] = "µÌß¼®Ý";
        Text[ chinese_traditional ] = "¿ï¶µ";
        Text[ arabic ] = "ÎíÇÑÇÊ";
        Text[ greek ] = "ÅðéëïãÝò";
        Text[ korean ] = "¿É¼Ç";
        Text[ turkish ] = "Seçenekler";
    };
    FixedText FT_LEFT_MARGIN
    {
        Pos = MAP_APPFONT ( 139 , 66 ) ;
        Size = MAP_APPFONT ( 60 , 10 ) ;
        Text = "L~inks" ;
        Text [ ENGLISH ] = "~Left" ;
        Text [ norwegian ] = "~Left" ;
        Text [ italian ] = "~Sinistra" ;
        Text [ portuguese_brazilian ] = "~Esquerda" ;
        Text [ portuguese ] = "~Esquerda" ;
        Text [ finnish ] = "~Vasemmalle" ;
        Text [ danish ] = "Venstre" ;
        Text [ french ] = "À ~gauche" ;
        Text [ swedish ] = "~Vänster" ;
        Text [ dutch ] = "L~inks" ;
        Text [ spanish ] = "I~zquierda" ;
        Text [ english_us ] = "L~eft" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "×ó(~E)";
        Text[ russian ] = "Ñëåâà";
        Text[ polish ] = "Z lewej";
        Text[ japanese ] = "¶(~E)";
        Text[ chinese_traditional ] = "¥ª(~E)";
        Text[ arabic ] = "Åáì ÇáíÓÇÑ";
        Text[ greek ] = "ÁñéóôåñÜ";
        Text[ korean ] = "¿ÞÂÊ(~E)";
        Text[ turkish ] = "S~ol";
    };
    MetricField ED_LEFT_MARGIN
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 208 , 65 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Maximum = 9999 ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        Last = 9999 ;
        SpinSize = 10 ;
    };
    FixedText FT_RIGHT_MARGIN
    {
        Pos = MAP_APPFONT ( 139 , 81 ) ;
        Size = MAP_APPFONT ( 60 , 10 ) ;
        Text = "Re~chts" ;
        Text [ ENGLISH ] = "~Right" ;
        Text [ norwegian ] = "~Right" ;
        Text [ italian ] = "Destra" ;
        Text [ portuguese_brazilian ] = "~Direita" ;
        Text [ portuguese ] = "~Direita" ;
        Text [ finnish ] = "~Oikealle" ;
        Text [ danish ] = "Højre" ;
        Text [ french ] = "À ~droite" ;
        Text [ swedish ] = "H~öger" ;
        Text [ dutch ] = "Rec~hts" ;
        Text [ spanish ] = "D~erecha" ;
        Text [ english_us ] = "Rig~ht" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "ÓÒ(~H)";
        Text[ russian ] = "Ñïðàâà";
        Text[ polish ] = "Z prawej";
        Text[ japanese ] = "‰E(~H)";
        Text[ chinese_traditional ] = "¥k(~H)";
        Text[ arabic ] = "Åáì Çáíãíä";
        Text[ greek ] = "ÄåîéÜ";
        Text[ korean ] = "¿À¸¥ÂÊ(~H)";
        Text[ turkish ] = "S~að";
    };
    MetricField ED_RIGHT_MARGIN
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 208 , 80 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Maximum = 9999 ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        Last = 9999 ;
        SpinSize = 10 ;
    };
    FixedText FT_TOP_MARGIN
    {
        Pos = MAP_APPFONT ( 139 , 96 ) ;
        Size = MAP_APPFONT ( 60 , 10 ) ;
        Text = "O~ben" ;
        Text [ ENGLISH ] = "~Top" ;
        Text [ norwegian ] = "~Top" ;
        Text [ italian ] = "~Alto" ;
        Text [ portuguese_brazilian ] = "~Topo" ;
        Text [ portuguese ] = "Em ~cima" ;
        Text [ finnish ] = "~Ylös" ;
        Text [ danish ] = "Øverst" ;
        Text [ french ] = "En ~haut" ;
        Text [ swedish ] = "Övers~t" ;
        Text [ dutch ] = "~Boven" ;
        Text [ spanish ] = "~Arriba" ;
        Text [ english_us ] = "~Top" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "ÉÏ(~T)";
        Text[ russian ] = "Ââåðõó";
        Text[ polish ] = "W górze";
        Text[ japanese ] = "ã(~T)";
        Text[ chinese_traditional ] = "¤W(~T)";
        Text[ arabic ] = "ÃÚáì";
        Text[ greek ] = "ÐÜíù";
        Text[ korean ] = "ˤ(~T)";
        Text[ turkish ] = "Üs~t";
    };
    MetricField ED_TOP_MARGIN
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 208 , 95 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Maximum = 9999 ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        Last = 9999 ;
        SpinSize = 10 ;
    };
    FixedText FT_BOTTOM_MARGIN
    {
        Pos = MAP_APPFONT ( 139 , 111 ) ;
        Size = MAP_APPFONT ( 60 , 10 ) ;
        Text = "Unt~en" ;
        Text [ ENGLISH ] = "~Bottom" ;
        Text [ norwegian ] = "~Bottom" ;
        Text [ italian ] = "~Basso" ;
        Text [ portuguese_brazilian ] = "~Base" ;
        Text [ portuguese ] = "Em ~baixo" ;
        Text [ finnish ] = "~Alas" ;
        Text [ danish ] = "Nederst" ;
        Text [ french ] = "En ~bas" ;
        Text [ swedish ] = "Und~erst" ;
        Text [ dutch ] = "Be~neden" ;
        Text [ spanish ] = "~Abajo" ;
        Text [ english_us ] = "~Bottom" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "ÏÂ(~B)";
        Text[ russian ] = "Âíèçó";
        Text[ polish ] = "Na dole";
        Text[ japanese ] = "‰º(~B)";
        Text[ chinese_traditional ] = "¤U(~B)";
        Text[ arabic ] = "ÃÓÝá";
        Text[ greek ] = "ÊÜôù";
        Text[ korean ] = "¾Æ·¡(~B)";
        Text[ turkish ] = "A~lt";
    };
    MetricField ED_BOTTOM_MARGIN
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 208 , 110 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Maximum = 9999 ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        Last = 9999 ;
        SpinSize = 10 ;
    };
    GroupBox GB_MARGIN
    {
        Pos = MAP_APPFONT ( 133 , 54 ) ;
        Size = MAP_APPFONT ( 121 , 75 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? Abstände : Abstõnde */
        Text = "Abstände" ;
        Text [ ENGLISH ] = "Margins" ;
        Text [ norwegian ] = "Margins" ;
        Text [ italian ] = "Distanze" ;
        Text [ portuguese_brazilian ] = "Margens" ;
        Text [ portuguese ] = "Espaçamento" ;
        Text [ finnish ] = "Reunukset" ;
        Text [ danish ] = "Afstand" ;
        Text [ french ] = "Écarts" ;
        Text [ swedish ] = "Avstånd" ;
        Text [ dutch ] = "Afstanden" ;
        Text [ spanish ] = "Distancias" ;
        Text [ english_us ] = "Spacing" ;
        Text[ chinese_simplified ] = "¼ä¸ô";
        Text[ russian ] = "Èíòåðâàëû";
        Text[ polish ] = "Odstêpy";
        Text[ japanese ] = "ŠÔŠu";
        Text[ chinese_traditional ] = "¶¡¹j";
        Text[ arabic ] = "ÇáÊÈÇÚÏ";
        Text[ greek ] = "AðïóôÜóåéò";
        Text[ korean ] = "°£°Ý";
        Text[ turkish ] = "Aralýk";
    };
                                                                                                                                                        #define IMAGE_STDBTN_COLOR Color { Red = 0xC000; Green = 0xC000; Blue = 0xC000; }
    ImageList IL_WRAP
    {
        ImageBitmap = Bitmap { File = "wraplist.bmp" ; };
        MaskColor = IMAGE_STDBTN_COLOR ;
        IdList =
        {
            IMG_NONE ;
            IMG_LEFT ;
            IMG_RIGHT ;
            IMG_PARALLEL ;
            IMG_THROUGH ;
            IMG_IDEAL ;
            IMG_KON_NONE ;
            IMG_KON_LEFT ;
            IMG_KON_RIGHT ;
            IMG_KON_PARALLEL ;
            IMG_KON_IDEAL ;
        };
        IdCount = { 11 ; };
    };
};
diff --git a/sw/source/ui/globdoc/globdoc.cxx b/sw/source/ui/globdoc/globdoc.cxx
new file mode 100644
index 0000000..e128b7e
--- /dev/null
+++ b/sw/source/ui/globdoc/globdoc.cxx
@@ -0,0 +1,181 @@
/*************************************************************************
 *
 *  $RCSfile: globdoc.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:38 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SV_EXCHANGE_HXX //autogen
#include <vcl/exchange.hxx>
#endif

#ifndef _SO_CLSIDS_HXX
#include <so3/clsids.hxx>
#endif

#include "swtypes.hxx"


#include "shellio.hxx"
#include "globdoc.hxx"
#include "globdoc.hrc"

/*--------------------------------------------------------------------
    Beschreibung:   Alle Filter registrieren
 --------------------------------------------------------------------*/

// 4.0: {340AC970-E30D-11d0-A53F-00A0249D57B1}
// 4.0: 0x340ac970, 0xe30d, 0x11d0, 0xa5, 0x3f, 0x0, 0xa0, 0x24, 0x9d, 0x57, 0xb1
// 5.0: 0xc20cf9d3, 0x85ae, 0x11d1, 0xaa, 0xb4, 0x0, 0x60, 0x97, 0xda, 0x56, 0x1a
SFX_IMPL_OBJECTFACTORY_LOD(SwGlobalDocShell, SFXOBJECTSHELL_STD_NORMAL|SFXOBJECTSHELL_HASMENU, /*swriter4/GlobalDocument,*/ \
        SvGlobalName(SO3_SWGLOB_CLASSID) , Sw)

TYPEINIT1(SwGlobalDocShell, SwDocShell);

SwGlobalDocShell::SwGlobalDocShell(SfxObjectCreateMode eMode ) :
        SwDocShell(eMode)
{
}

__EXPORT SwGlobalDocShell::~SwGlobalDocShell()
{
}

// Anforderung der pIo-Struktur fuer den Zugriff auf Substorages
// und Streams

void __EXPORT SwGlobalDocShell::FillRegInfo( SvEmbeddedRegistryInfo * pInfo)
{
    SfxInPlaceObject::FillRegInfo( pInfo );
    pInfo->aObjName = String::CreateFromAscii("StarWriterGlobalDocument");
    pInfo->nMajorVers = 5;
    pInfo->nMinorVers = 0;
    pInfo->aHumanShortTypeName = SW_RESSTR(STR_HUMAN_SWGLOBDOC_NAME);
    pInfo->nIconResId =
#ifdef REG_ICON_RESID_SW_GLOBDOC
    REG_ICON_RESID_SW_GLOBDOC;
#else
    9;
#endif
}

void __EXPORT SwGlobalDocShell::FillClass( SvGlobalName * pClassName,
                                   ULONG * pClipFormat,
                                   String * pAppName,
                                   String * pLongUserName,
                                   String * pUserName,
                                   long nVersion ) const
{
    SfxInPlaceObject::FillClass(pClassName, pClipFormat, pAppName, pLongUserName,
                                pUserName, nVersion);

    if (nVersion == SOFFICE_FILEFORMAT_40)
    {
        *pClassName = SvGlobalName( SO3_SWGLOB_CLASSID_40 );
        *pClipFormat = SOT_FORMATSTR_ID_STARWRITERGLOB_40;
        *pAppName = String::CreateFromAscii("StarWriter 4.0/GlobalDocument");

        *pLongUserName = SW_RESSTR(STR_WRITER_GLOBALDOC_FULLTYPE_40);
    }
    else if (nVersion == SOFFICE_FILEFORMAT_NOW)
    {
        *pLongUserName = SW_RESSTR(STR_WRITER_GLOBALDOC_FULLTYPE);
    }
    *pUserName = SW_RESSTR(STR_HUMAN_SWGLOBDOC_NAME);
}


/*------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.9  2000/09/18 16:05:35  willem.vandorp
    OpenOffice header added.

    Revision 1.8  2000/04/18 15:32:07  os
    UNICODE

    Revision 1.7  2000/02/11 14:47:35  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.6  1999/09/10 13:19:20  os
    Chg: resource types removed

    Revision 1.5  1998/11/18 14:16:34  JP
    Task #59398#: ClipboardFormatId Umstellungen


      Rev 1.4   18 Nov 1998 15:16:34   JP
   Task #59398#: ClipboardFormatId Umstellungen

      Rev 1.3   07 Jan 1998 18:38:32   MIB
   5.0 Fileformat

      Rev 1.2   28 Nov 1997 19:52:58   MA
   includes

      Rev 1.1   01 Sep 1997 13:11:20   OS
   DLL-Umstellung

      Rev 1.0   12 Jun 1997 16:14:44   MA
   Initial revision.

------------------------------------------------------------------------*/
diff --git a/sw/source/ui/globdoc/globdoc.src b/sw/source/ui/globdoc/globdoc.src
new file mode 100644
index 0000000..cec4922
--- /dev/null
+++ b/sw/source/ui/globdoc/globdoc.src
@@ -0,0 +1,96 @@
/*************************************************************************
 *
 *  $RCSfile: globdoc.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:38 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "globdoc.hrc"
String STR_HUMAN_SWGLOBDOC_NAME
{
    Text = "Globaldokument" ;
    Text [ English ] = "Global Document" ;
    Text [ english_us ] = "Master Document" ;
    Text [ portuguese_brazilian ] = "Globaldokument" ;
    Text [ swedish ] = "Samlingsdokument" ;
    Text [ danish ] = "Hoveddokument" ;
    Text [ italian ] = "Documento master" ;
    Text [ spanish ] = "Documento maestro" ;
    Text [ french ] = "Document maître" ;
    Text [ dutch ] = "Master-document" ;
    Text [ portuguese ] = "Documento-mestre" ;
    Text[ chinese_simplified ] = "Ö÷¿ØÎĵµ";
    Text[ russian ] = "Ãëàâíûé äîêóìåíò";
    Text[ polish ] = "Dokument g³ówny";
    Text[ japanese ] = "ϽÀ°ÄÞ·­ÒÝÄ";
    Text[ chinese_traditional ] = "¥D±±¤å¥ó";
    Text[ arabic ] = "ãÓÊäÏ ÔÇãá";
    Text[ dutch ] = "Master-document";
    Text[ chinese_simplified ] = "Ö÷¿ØÎĵµ";
    Text[ greek ] = "Kýñéï Ýããñáöï";
    Text[ korean ] = "¸¶½ºÅÍ ¹®¼­";
    Text[ turkish ] = "Ana belge";
    Text[ language_user1 ] = " ";
};
String STR_WRITER_GLOBALDOC_FULLTYPE_40
{
    Text = "StarOffice 4.0 Global Document" ;
};
String STR_WRITER_GLOBALDOC_FULLTYPE
{
    Text = "StarOffice 5.0 Global Document" ;
};
diff --git a/sw/source/ui/globdoc/makefile.mk b/sw/source/ui/globdoc/makefile.mk
new file mode 100644
index 0000000..f057495
--- /dev/null
+++ b/sw/source/ui/globdoc/makefile.mk
@@ -0,0 +1,94 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:38 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=..$/..$/..

PRJNAME=sw
TARGET=globdoc

AUTOSEG=true

PROJECTPCH=ui_pch
PDBTARGET=ui_pch
PROJECTPCHSOURCE=..\ui_1st\ui_pch

# --- Settings -----------------------------------------------------

.INCLUDE :  $(PRJ)$/inc$/swpre.mk
.INCLUDE :  settings.mk
.INCLUDE :  $(PRJ)$/inc$/sw.mk

# --- Files --------------------------------------------------------

CXXFILES = \
        globdoc.cxx

SRCFILES =  \
        globdoc.src

SLOFILES =  \
        $(SLO)$/globdoc.obj

# --- Tagets -------------------------------------------------------

.INCLUDE :  target.mk

diff --git a/sw/source/ui/inc/abstract.hxx b/sw/source/ui/inc/abstract.hxx
new file mode 100644
index 0000000..6b86b66
--- /dev/null
+++ b/sw/source/ui/inc/abstract.hxx
@@ -0,0 +1,113 @@
/*************************************************************************
 *
 *  $RCSfile: abstract.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:38 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _ABSTRACT_HXX
#define _ABSTRACT_HXX

#ifndef _BASEDLGS_HXX //autogen
#include <sfx2/basedlgs.hxx>
#endif

#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif

#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif

#ifndef _FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif

#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif


/*-----------------22.02.97 15.06-------------------

--------------------------------------------------*/
class SwInsertAbstractDlg  : public SfxModalDialog
{
    GroupBox        aGB;
    FixedText       aLevelFT;
    NumericField    aLevelNF;
    FixedText       aParaFT;
    NumericField    aParaNF;
    FixedText       aDescFT;
    OKButton        aOkPB;
    CancelButton    aCancelPB;
    HelpButton      aHelpPB;

protected:

public:
    SwInsertAbstractDlg( Window* pParent );
    ~SwInsertAbstractDlg();

    BYTE    GetLevel() const;
    BYTE    GetPara() const;
};

#endif



diff --git a/sw/source/ui/inc/actctrl.hxx b/sw/source/ui/inc/actctrl.hxx
new file mode 100644
index 0000000..22d82bb
--- /dev/null
+++ b/sw/source/ui/inc/actctrl.hxx
@@ -0,0 +1,123 @@
/*************************************************************************
 *
 *  $RCSfile: actctrl.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:38 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _ACTCTRL_HXX
#define _ACTCTRL_HXX

#ifndef _FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif

/*--------------------------------------------------------------------
    Beschreibung:   numerische Eingabe
 --------------------------------------------------------------------*/

class NumEditAction: public NumericField
{
    Link aActionLink;

protected:
    virtual void Action();
#ifdef VCL
    virtual long    Notify( NotifyEvent& rNEvt );
#else
    virtual long    ParentNotify( NotifyEvent& rNEvt );
#endif
public:
    NumEditAction( Window* pParent, const ResId& rResId ) :
                                NumericField(pParent, rResId) {}

    void        SetActionHdl( const Link& rLink )   { aActionLink = rLink;}
    const Link& GetActionHdl() const                { return aActionLink; }
};


/* -----------------21.04.98 08:11-------------------
 * Edit, dass keine Spaces akzeptiert
 * --------------------------------------------------*/
class NoSpaceEdit : public Edit
{
    String sForbiddenChars;
protected:
    virtual void KeyInput( const KeyEvent& );
    virtual void        Modify();

public:
    NoSpaceEdit( Window* pParent, const ResId& rResId)
        : Edit(pParent, rResId),
        sForbiddenChars(String::CreateFromAscii(" "))
    {}
    void            SetForbiddenChars(const String& rSet){sForbiddenChars = rSet;}
    const String&   GetForbiddenChars(){return sForbiddenChars;}
};

/* -----------------21.04.98 08:33-------------------
 * Kein Space und kein Punkt
 * --------------------------------------------------*/
class TableNameEdit : public NoSpaceEdit
{
public:
    TableNameEdit(Window* pWin, const ResId& rResId) :
                            NoSpaceEdit(pWin, rResId)
                                {SetForbiddenChars(String::CreateFromAscii(" .<>"));}
};


#endif
diff --git a/sw/source/ui/inc/addrdlg.hxx b/sw/source/ui/inc/addrdlg.hxx
new file mode 100644
index 0000000..08e34cf
--- /dev/null
+++ b/sw/source/ui/inc/addrdlg.hxx
@@ -0,0 +1,80 @@
/*************************************************************************
 *
 *  $RCSfile: addrdlg.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:38 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _ADDRDLG_HXX
#define _ADDRDLG_HXX

#ifndef _BASEDLGS_HXX //autogen
#include <sfx2/basedlgs.hxx>
#endif

class SwAddrDlg : public SfxSingleTabDialog
{
public:

     SwAddrDlg( Window* pParent, SfxItemSet& rSet );
    ~SwAddrDlg();
};

#endif




diff --git a/sw/source/ui/inc/app.hrc b/sw/source/ui/inc/app.hrc
new file mode 100644
index 0000000..11a0ad8
--- /dev/null
+++ b/sw/source/ui/inc/app.hrc
@@ -0,0 +1,204 @@
/*************************************************************************
 *
 *  $RCSfile: app.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:38 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _APP_HRC
#define _APP_HRC

#include "rcid.hrc"

// Default Bitmap fuer ToolBox
#define BMP_FEHLT                   (RC_APP_BEGIN + 1)

// Document-Icon
#define RC_DOC_ICON                 (RC_APP_BEGIN + 2)

//Soll das Clipboard fuer andere Applikationen...
#define MSG_CLPBRD_CLEAR            (RC_APP_BEGIN + 3)

#define STR_CANTCREATE              (RC_APP_BEGIN + 4)
#define STR_CANTOPEN                (RC_APP_BEGIN + 5)

// Messages
#define MSG_ERROR_SEND_MAIL         ( RC_APP_BEGIN + 6)
#define MSG_SAVE_HTML_QUERY         ( RC_APP_BEGIN + 7)

//Fuer das Interface, weil der RID_APP_BEGIN jetzt Desktop ist.
#define RID_SW_NAME                 ( RC_APP_BEGIN + 8)

#define MSG_INDEX_OVERFLOW          ( RC_APP_BEGIN + 10)

#define STR_UNBENANNT               (RC_APP_BEGIN + 13)
#define STR_VERSION                 (RC_APP_BEGIN + 14)
#define STR_PRINT_MERGE_MACRO       (RC_APP_BEGIN + 15)
#define STR_PAGE_COUNT_MACRO        (RC_APP_BEGIN + 16)

// Bitmap fuer die NumerierungsVorlagen im Organizer
#define BMP_STYLES_FAMILY_NUM       (RC_APP_BEGIN + 17)

// Strings fuer Bereiche in der Konfiguration
#define STR_GRP_FILE                (RC_APP_BEGIN + 56)
#define STR_GRP_EDIT                (RC_APP_BEGIN + 57)
#define STR_GRP_TRAVELLING          (RC_APP_BEGIN + 58)
#define STR_GRP_VIEW                (RC_APP_BEGIN + 59)
#define STR_GRP_INSERT              (RC_APP_BEGIN + 60)
#define STR_GRP_FORMAT              (RC_APP_BEGIN + 61)
#define STR_GRP_STYLE               (RC_APP_BEGIN + 62)
#define STR_GRP_TEXT                (RC_APP_BEGIN + 63)
#define STR_GRP_FRAME               (RC_APP_BEGIN + 64)
#define STR_GRP_GRAPHIC             (RC_APP_BEGIN + 65)
#define STR_GRP_TABLE               (RC_APP_BEGIN + 66)
#define STR_GRP_TOOLS               (RC_APP_BEGIN + 67)
#define STR_GRP_NUMBERING           (RC_APP_BEGIN + 68)
#define STR_GRP_WINDOW              (RC_APP_BEGIN + 69)
#define STR_GRP_MISC                (RC_APP_BEGIN + 70)
#define STR_GRP_MACRO               (RC_APP_BEGIN + 71)
#define RES_EXT_HELP_STRING         (RC_APP_BEGIN + 72)
#define RES_STD_HELP_STRING         (RC_APP_BEGIN + 73)
#define STR_PAGEOFFSET              (RC_APP_BEGIN + 74)
#define STR_PAGEBREAK               (RC_APP_BEGIN + 75)


#define SID_TOGGLETOOLBOX           (RC_APP_BEGIN + 89)

#define STR_ENV_TITLE               (RC_APP_BEGIN + 91)
#define STR_LAB_TITLE               (RC_APP_BEGIN + 92)

#define STR_HUMAN_SWDOC_NAME        (RC_APP_BEGIN + 93)

#define RID_SW_ERRHDL               (RC_APP_BEGIN + 95)

#define STR_FDLG_TEMPLATE_BUTTON    (RC_APP_BEGIN + 1)
#define STR_FDLG_TEMPLATE_NAME      (RC_APP_BEGIN + 2)


// Ids fuer die einzelnen PopUpMenues
#define MN_WIZARD                   (RC_APP_BEGIN + 9)
#define MN_INDEX                    (RC_APP_BEGIN + 10)
#define MN_FILE                     (RC_APP_BEGIN + 11)
#define MN_EDIT                     (RC_APP_BEGIN + 12)
#define MN_VIEW                     (RC_APP_BEGIN + 13)
#define MN_INS                      (RC_APP_BEGIN + 14)
#define MN_TEXT                     (RC_APP_BEGIN + 15)
#define MN_FORMAT                   (RC_APP_BEGIN + 16)
#define MN_FORMAT_STYLE             (RC_APP_BEGIN + 17)
#define MN_FORMAT_ALGN              (RC_APP_BEGIN + 18)
#define MN_FORMAT_LINESPACE         (RC_APP_BEGIN + 19)
#define MN_EXTRA                    (RC_APP_BEGIN + 20)
#define MN_WIN                      (RC_APP_BEGIN + 21)
#define MN_HELP                     (RC_APP_BEGIN + 22)
#define MN_FORMAT_FRM_HORZ          (RC_APP_BEGIN + 23)
#define MN_FORMAT_FRM_VERT          (RC_APP_BEGIN + 24)
#define MN_PICKLIST                 (RC_APP_BEGIN + 25)
#define MN_WINLIST                  (RC_APP_BEGIN + 26)
#define MN_MACRO                    (RC_APP_BEGIN + 27)
#define MN_FORMAT_HIERARCHY         (RC_APP_BEGIN + 28)
#define MN_CELL                     (RC_APP_BEGIN + 29)
#define MN_HELP_TIP                 (RC_APP_BEGIN + 30)
#define MN_HELP_SEARCH              (RC_APP_BEGIN + 31)
#define MN_HELP_ACTIVE              (RC_APP_BEGIN + 32)
#define MN_HELP_INDEX               (RC_APP_BEGIN + 33)
#define MN_OBJECT                   (RC_APP_BEGIN + 34)
#define MN_DATABASE                 (RC_APP_BEGIN + 35)
#define MN_DIRSUBMENU               (RC_APP_BEGIN + 36)
#define MN_MAIL                     (RC_APP_BEGIN + 37)
#define MN_WRAP                     (RC_APP_BEGIN + 38)
#define MN_SUB_TBLROW               (RC_APP_BEGIN + 39)
#define MN_SUB_TBLCOL               (RC_APP_BEGIN + 40)
#define MN_SUB_AUTOFORMAT           (RC_APP_BEGIN + 41)
#define MN_SUB_TOOLBAR              (RC_APP_BEGIN + 42)
#define MN_SUB_FIELD                (RC_APP_BEGIN + 43)
#define MN_SUB_GRAPHIC              (RC_APP_BEGIN + 44)
#define MN_SUB_TEMPLATES            (RC_APP_BEGIN + 45)
#define MN_SUB_ARRANGE              (RC_APP_BEGIN + 46)
#define MN_SUB_SPELLING             (RC_APP_BEGIN + 47)
#define MN_SUB_UPDATE               (RC_APP_BEGIN + 48)
#define MN_SUB_MIRROR               (RC_APP_BEGIN + 49)
#define MN_SUB_ALIGN                (RC_APP_BEGIN + 50)
#define MN_SUB_OPTIONS              (RC_APP_BEGIN + 51)
#define MN_SUB_SENDTO               (RC_APP_BEGIN + 52)
#define MN_SUB_REVISE               (RC_APP_BEGIN + 53)
#define MN_TEMPLATES                (RC_APP_BEGIN + 54)
#define MN_FILE_PORT                (RC_APP_BEGIN + 55)
#define MN_EDIT_PORT                (RC_APP_BEGIN + 56)
#define MN_VIEW_PORT                (RC_APP_BEGIN + 57)
#define MN_INS_PORT                 (RC_APP_BEGIN + 58)
#define MN_FORMAT_PORT              (RC_APP_BEGIN + 59)
#define MN_EXTRA_PORT               (RC_APP_BEGIN + 60)
#define MN_WIN_PORT                 (RC_APP_BEGIN + 61)
#define MN_HELP_PORT                (RC_APP_BEGIN + 62)


#define RC_INTRO_BEGIN              (RC_APP_BEGIN + 90)
#define RC_INTRO_END                (RC_APP_BEGIN + 96)

#define STR_WRITER_DOCUMENT_FULLTYPE_31     (RC_APP_BEGIN + 97)
#define STR_WRITER_DOCUMENT_FULLTYPE_40     (RC_APP_BEGIN + 98)
#define STR_WRITER_DOCUMENT_FULLTYPE    (RC_APP_BEGIN + 100)

#define STR_ABSTRACT_TITLE          (RC_APP_BEGIN +99)

#define APP_ACT_END                 STR_WRITER_DOCUMENT_FULLTYPE

#if APP_ACT_END > RC_APP_END
#error Resource-Id Ueberlauf in #file, #line
#endif

#endif
diff --git a/sw/source/ui/inc/ascfldlg.hxx b/sw/source/ui/inc/ascfldlg.hxx
new file mode 100644
index 0000000..0f34e28
--- /dev/null
+++ b/sw/source/ui/inc/ascfldlg.hxx
@@ -0,0 +1,119 @@
/*************************************************************************
 *
 *  $RCSfile: ascfldlg.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:38 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _ASCFLDLG_HXX
#define _ASCFLDLG_HXX

#ifndef _BASEDLGS_HXX
#include <sfx2/basedlgs.hxx>
#endif
#ifndef _SV_GROUP_HXX
#include <vcl/group.hxx>
#endif
#ifndef _SV_FIXED_HXX
#include <vcl/fixed.hxx>
#endif
#ifndef _SV_BUTTON_HXX
#include <vcl/button.hxx>
#endif
#ifndef _SV_LSTBOX_HXX
#include <vcl/lstbox.hxx>
#endif

class SwAsciiOptions;
class SvStream;
class SwDocShell;

class SwAsciiFilterDlg : public SfxModalDialog
{
    GroupBox        aGB;
    FixedText       aCharSetFT;
    ListBox         aCharSetLB;
    FixedText       aFontFT;
    ListBox         aFontLB;
    FixedText       aLanguageFT;
    ListBox         aLanguageLB;
    FixedText       aCRLF_FT;
    RadioButton     aCRLF_RB, aCR_RB, aLF_RB;
    OKButton        aOkPB;
    CancelButton    aCancelPB;
    HelpButton      aHelpPB;
    String          sNoLanguage, sCharSet, sSystemCharSet;
    BOOL            bSaveLineStatus;

    DECL_LINK( CharSetSelHdl, ListBox* );
    DECL_LINK( LineEndHdl, RadioButton* );
    void SetCRLF( LineEnd eEnd );
    LineEnd GetCRLF() const;

public:
    // CTOR:    for import - pStream is the inputstream
    //          for export - pStream must be 0
    SwAsciiFilterDlg( Window* pParent, SwDocShell& rDocSh,
                        SvStream* pStream );
    virtual ~SwAsciiFilterDlg();

    void FillOptions( SwAsciiOptions& rOptions );
};



#endif

diff --git a/sw/source/ui/inc/autoedit.hxx b/sw/source/ui/inc/autoedit.hxx
new file mode 100644
index 0000000..c7c89d4
--- /dev/null
+++ b/sw/source/ui/inc/autoedit.hxx
@@ -0,0 +1,84 @@
/*************************************************************************
 *
 *  $RCSfile: autoedit.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:38 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _AUTOEDIT_HXX
#define _AUTOEDIT_HXX

#ifndef _EDIT_HXX //autogen
#include <vcl/edit.hxx>
#endif


class AutoEdit : public Edit
{
public:
    AutoEdit( Window* pParent, ResId aResId ) : Edit( pParent, aResId ){}

protected:
    virtual void KeyInput( const KeyEvent& rEvent );
};

// Implementieriung im autocorr.cxx



#endif


diff --git a/sw/source/ui/inc/barcfg.hxx b/sw/source/ui/inc/barcfg.hxx
new file mode 100644
index 0000000..421a042
--- /dev/null
+++ b/sw/source/ui/inc/barcfg.hxx
@@ -0,0 +1,86 @@
/*************************************************************************
 *
 *  $RCSfile: barcfg.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:38 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef SW_BARCFG_HXX
#define SW_BARCFG_HXX

#ifndef _SFXCFGITEM_HXX //autogen
#include <sfx2/cfgitem.hxx>
#endif

class CfgUSHORTTable;

class SwToolbarConfigItem : public SfxConfigItem
{
    CfgUSHORTTable *pTbl;
private:
    virtual int  Load (SvStream& rStrm);
    virtual BOOL Store(SvStream& rStrm);
    virtual void UseDefault();

public:
    SwToolbarConfigItem( BOOL bWeb );
    ~SwToolbarConfigItem();

    void    SetTopToolbar( int nSelType, USHORT nBarId );
    USHORT  GetTopToolbar( int nSelType );  //USHRT_MAX: noch nicht eingetragen
};

#endif
diff --git a/sw/source/ui/inc/basesh.hxx b/sw/source/ui/inc/basesh.hxx
new file mode 100644
index 0000000..67e7bf0
--- /dev/null
+++ b/sw/source/ui/inc/basesh.hxx
@@ -0,0 +1,177 @@
/*************************************************************************
 *
 *  $RCSfile: basesh.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:38 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWBASESH_HXX
#define _SWBASESH_HXX

#ifndef _SHELLID_HXX
#include <shellid.hxx>
#endif

#ifndef _SFXMODULE_HXX //autogen
#include <sfx2/module.hxx>
#endif
#ifndef _SFX_SHELL_HXX //autogen
#include <sfx2/shell.hxx>
#endif

#ifndef _LINK_HXX //autogen
#include <tools/link.hxx>
#endif
#ifndef _SV_TIMER_HXX //autogen
#include <vcl/timer.hxx>
#endif

class SwWrtShell;
class SwCrsrShell;
class SwView;
class GraphicFilter;
class SwFlyFrmAttrMgr;
class SfxItemSet;
class Graphic;

extern void DisableAllItems(SfxItemSet &);

class SwBaseShell: public SfxShell
{
    SwView      &rView;

    // DragModus
    static USHORT nFrameMode;

    // Bug 75078 - if in GetState the asynch call of GetGraphic returns
    //              synch, the set the state directly into the itemset
    SfxItemSet*         pGetStateSet;

    //Update-Timer fuer Graphic
    BOOL        bUpdateSID_IMap     :1;
    BOOL        bUpdateSID_IMapExec :1;
    BOOL        bUpdateSID_IContour :1;
    BOOL        bUpdateSID_IContourDlg :1;

    DECL_LINK( GraphicArrivedHdl, SwCrsrShell* );
    DECL_LINK( UpdatePercentHdl, GraphicFilter* );

protected:

    SwWrtShell& GetShell   ();
    SwWrtShell* GetShellPtr();

    SwView&     GetView() { return rView; }

    SwFlyFrmAttrMgr *pFrmMgr;

    DECL_STATIC_LINK( SwBaseShell, InsertDBTextHdl, String* );

public:
    SwBaseShell(SwView &rShell);
    virtual     ~SwBaseShell();
    SFX_DECL_INTERFACE(SW_BASESHELL);
    TYPEINFO();

    void        ExecDelete(SfxRequest &);

    void        ExecClpbrd(SfxRequest &);
    void        StateClpbrd(SfxItemSet &);

    void        ExecUndo(SfxRequest &);
    void        StateUndo(SfxItemSet &);

    void        Execute(SfxRequest &);
    void        GetState(SfxItemSet &);
    void        StateStyle(SfxItemSet &);

    void        ExecuteGallery(SfxRequest&);
    void        GetGalleryState(SfxItemSet&);

    void        ExecDlg(SfxRequest &);

    void        StateStatusLine(SfxItemSet &rSet);
    void        ExecTxtCtrl(SfxRequest& rReq);
    void        GetTxtCtrlState(SfxItemSet& rSet);
    void        GetBorderState(SfxItemSet &rSet);
    void        GetBckColState(SfxItemSet &rSet);

    void        ExecBckCol(SfxRequest& rReq);
    void        SetWrapMode( USHORT nSlot );

    void        ExecDB(SfxRequest &rReq);

    void        StateDisableItems(SfxItemSet &);

    void        EditRegionDialog(SfxRequest& rReq);
    void        InsertRegionDialog(SfxRequest& rReq);

    void        ExecField(SfxRequest& rReq);

    static void    SetFrmMode( USHORT nMode, SwWrtShell *pShell );  //Mit Update!
    static void   _SetFrmMode( USHORT nMode )   { nFrameMode = nMode; }
    static USHORT  GetFrmMode()                 { return nFrameMode;  }

    //public fuer D&D
    int     InsertGraphic( const String &rPath, const String &rFilter,
                            BOOL bLink = TRUE, GraphicFilter *pFlt = 0,
                            Graphic* pPreviewGrf = 0,
                            BOOL bRule = FALSE );

};


#endif
diff --git a/sw/source/ui/inc/beziersh.hxx b/sw/source/ui/inc/beziersh.hxx
new file mode 100644
index 0000000..8a3d70a
--- /dev/null
+++ b/sw/source/ui/inc/beziersh.hxx
@@ -0,0 +1,78 @@
/*************************************************************************
 *
 *  $RCSfile: beziersh.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:38 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWBEZIERSH_HXX
#define _SWBEZIERSH_HXX

#include "basesh.hxx"

class SwBezierShell: public SwBaseShell
{
public:
    SFX_DECL_INTERFACE(SW_BEZIERSHELL);
    TYPEINFO();

            SwBezierShell(SwView &rView);

    void    GetState(SfxItemSet &);
    void    Execute(SfxRequest &);
};

#endif
diff --git a/sw/source/ui/inc/bmpwin.hxx b/sw/source/ui/inc/bmpwin.hxx
new file mode 100644
index 0000000..b866754
--- /dev/null
+++ b/sw/source/ui/inc/bmpwin.hxx
@@ -0,0 +1,104 @@
/*************************************************************************
 *
 *  $RCSfile: bmpwin.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:38 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _BMPWIN_HXX
#define _BMPWIN_HXX

#ifndef _GRAPH_HXX //autogen
#include <vcl/graph.hxx>
#endif
#ifndef _BITMAP_HXX //autogen
#include <vcl/bitmap.hxx>
#endif
#ifndef _WINDOW_HXX //autogen
#include <vcl/window.hxx>
#endif


/*--------------------------------------------------------------------
    Beschreibung:   Extended Page fuer Grafiken
 --------------------------------------------------------------------*/

class BmpWindow : public Window
{
    void Paint(const Rectangle& rRect);
    Graphic aGraphic;
    Bitmap  aBmp;
    BOOL    bHorz : 1;
    BOOL    bVert : 1;
    BOOL    bGraphic : 1;
    BOOL    bLeftAlign : 1;

public:
    BmpWindow(Window* pPar, USHORT nId,
                const Graphic& rGraphic, const Bitmap& rBmp);
    BmpWindow(Window* pParent, const ResId rResId) :
        Window(pParent, rResId), bLeftAlign(TRUE),
        bHorz(FALSE), bVert(FALSE),bGraphic(FALSE){}
    ~BmpWindow();
    void MirrorVert(BOOL bMirror) { bVert = bMirror; Invalidate(); }
    void MirrorHorz(BOOL bMirror) { bHorz = bMirror; Invalidate(); }
    void SetGraphic(const Graphic& rGrf)
            {aGraphic = rGrf; bGraphic = TRUE; Invalidate();}

};

#endif
diff --git a/sw/source/ui/inc/bookctrl.hxx b/sw/source/ui/inc/bookctrl.hxx
new file mode 100644
index 0000000..0b8fc48
--- /dev/null
+++ b/sw/source/ui/inc/bookctrl.hxx
@@ -0,0 +1,95 @@
/*************************************************************************
 *
 *  $RCSfile: bookctrl.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:38 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _BOOKCTRL_HXX
#define _BOOKCTRL_HXX

// include ---------------------------------------------------------------

#ifndef _SFXSTBITEM_HXX //autogen
#include <sfx2/stbitem.hxx>
#endif

#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif

// class BookmarkToolBoxControl -------------------------------------------

class SwBookmarkControl : public SfxStatusBarControl
{
    virtual void    Command( const CommandEvent& rCEvt );

public:
    virtual void    StateChanged( const SfxPoolItem* pState );
    virtual void    Paint( const UserDrawEvent& rEvt );

    SFX_DECL_STATUSBAR_CONTROL();

    SwBookmarkControl( USHORT nId, StatusBar& rStb, SfxBindings& rBind );
    ~SwBookmarkControl();

private:
    String  sPageNumber;
};


#endif

diff --git a/sw/source/ui/inc/bookmark.hxx b/sw/source/ui/inc/bookmark.hxx
new file mode 100644
index 0000000..c7978a2
--- /dev/null
+++ b/sw/source/ui/inc/bookmark.hxx
@@ -0,0 +1,127 @@
/*************************************************************************
 *
 *  $RCSfile: bookmark.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:38 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _BOOKMARK_HXX
#define _BOOKMARK_HXX

#ifndef _SVX_STDDLG_HXX //autogen
#include <svx/stddlg.hxx>
#endif

#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif

#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif

#include "swlbox.hxx"       // SwComboBox

class SwWrtShell;

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

class BookmarkCombo : public SwComboBox
{
    USHORT          GetFirstSelEntryPos() const;
    USHORT          GetNextSelEntryPos(USHORT nPos) const;
    USHORT          GetSelEntryPos(USHORT nPos) const;

    virtual long    PreNotify(NotifyEvent& rNEvt);
public:
    BookmarkCombo( Window* pWin, const ResId& rResId );

    USHORT          GetSelectEntryCount() const;
    XubString       GetSelectEntry( USHORT nSelIndex = 0 ) const;
    USHORT          GetSelectEntryPos( USHORT nSelIndex = 0 ) const;

    static const String aForbiddenChars;
};

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

class SwInsertBookmarkDlg: public SvxStandardDialog
{
    BookmarkCombo   aBookmarkBox;
    GroupBox        aBookmarkFrm;
    OKButton        aOkBtn;
    CancelButton    aCancelBtn;
    PushButton      aDeleteBtn;

    String          sRemoveWarning;
    SwWrtShell      &rSh;

    DECL_LINK( ModifyHdl, BookmarkCombo * );
    DECL_LINK( DeleteHdl, Button * );

    virtual void Apply();

public:
    SwInsertBookmarkDlg( Window *pParent, SwWrtShell &rSh );
    ~SwInsertBookmarkDlg();

};

#endif
diff --git a/sw/source/ui/inc/break.hxx b/sw/source/ui/inc/break.hxx
new file mode 100644
index 0000000..d28342f
--- /dev/null
+++ b/sw/source/ui/inc/break.hxx
@@ -0,0 +1,124 @@
/*************************************************************************
 *
 *  $RCSfile: break.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:38 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _BREAK_HXX
#define _BREAK_HXX

#ifndef _SVX_STDDLG_HXX //autogen
#include <svx/stddlg.hxx>
#endif

#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif

#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif

#ifndef _LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif

#ifndef _FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif

#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif

class SwWrtShell;

class SwBreakDlg: public SvxStandardDialog
{
    SwWrtShell     &rSh;
    RadioButton     aLineBtn;
    RadioButton     aColumnBtn;
    RadioButton     aPageBtn;
    FixedText       aPageCollText;
    ListBox         aPageCollBox;
    CheckBox        aPageNumBox;
    NumericField    aPageNumEdit;
    GroupBox        aBreakFrm;

    OKButton        aOkBtn;
    CancelButton    aCancelBtn;
    HelpButton      aHelpBtn;

    BOOL            bHtmlMode;

    DECL_LINK( ClickHdl, void * );
    DECL_LINK( PageNumHdl, CheckBox * );
    DECL_LINK( PageNumModifyHdl, Edit * );
    DECL_LINK( OkHdl, Button * );

    void CheckEnable();

protected:
    virtual void Apply();

public:
    SwBreakDlg( Window *pParent, SwWrtShell &rSh );
    ~SwBreakDlg();
};

#endif

diff --git a/sw/source/ui/inc/caption.hxx b/sw/source/ui/inc/caption.hxx
new file mode 100644
index 0000000..b8f575d
--- /dev/null
+++ b/sw/source/ui/inc/caption.hxx
@@ -0,0 +1,146 @@
/*************************************************************************
 *
 *  $RCSfile: caption.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:38 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _CAPTION_HXX
#define _CAPTION_HXX

#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif
#ifndef _STREAM_HXX //autogen
#include <tools/stream.hxx>
#endif
#ifndef _GLOBNAME_HXX //autogen
#include <tools/globname.hxx>
#endif

enum SwCapObjType
{
    FRAME_CAP, GRAPHIC_CAP, TABLE_CAP, OLE_CAP
};

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

class InsCaptionOpt
{
private:
    BOOL         bUseCaption;
    SwCapObjType eObjType;
    SvGlobalName aOleId;
    String       sCategory;
    USHORT       nNumType;
    String       sCaption;
    USHORT       nPos;
    USHORT       nLevel;
    sal_Unicode  cSeparator;
    BOOL         bIgnoreSeqOpts;    // wird nicht gespeichert
    BOOL         bCopyAttributes;   //          -""-

public:
    InsCaptionOpt(const SwCapObjType eType = FRAME_CAP, const SvGlobalName* pOleId = 0);
    InsCaptionOpt(const InsCaptionOpt&);
    ~InsCaptionOpt();

    inline BOOL&            UseCaption()                    { return bUseCaption; }
    inline BOOL             UseCaption() const              { return bUseCaption; }

    inline SwCapObjType     GetObjType() const              { return eObjType; }
    inline void             SetObjType(const SwCapObjType eType) { eObjType = eType; }

    inline const SvGlobalName&  GetOleId() const                { return aOleId; }
    inline void             SetOleId(const SvGlobalName &rId)   { aOleId = rId; }

    inline const String&    GetCategory() const             { return sCategory; }
    inline void             SetCategory(const String& rCat) { sCategory = rCat; }

    inline USHORT           GetNumType() const              { return nNumType; }
    inline void             SetNumType(const USHORT nNT)    { nNumType = nNT; }

    inline const String&    GetCaption() const              { return sCaption; }
    inline void             SetCaption(const String& rCap)  { sCaption = rCap; }

    inline USHORT           GetPos() const                  { return nPos; }
    inline void             SetPos(const USHORT nP)         { nPos = nP; }

    inline USHORT           GetLevel() const                { return nLevel; }
    inline void             SetLevel(const USHORT nLvl)     { nLevel = nLvl; }

    inline sal_Unicode      GetSeparator() const                { return cSeparator; }
    inline void             SetSeparator(const sal_Unicode cSep){ cSeparator = cSep; }

    inline BOOL&            IgnoreSeqOpts()                 { return bIgnoreSeqOpts; }
    inline BOOL             IgnoreSeqOpts() const           { return bIgnoreSeqOpts; }

    inline BOOL&            CopyAttributes()                { return bCopyAttributes; }
    inline BOOL             CopyAttributes() const          { return bCopyAttributes; }

    BOOL                    operator==( const InsCaptionOpt& rOpt ) const;
    InsCaptionOpt&          operator= ( const InsCaptionOpt& rOpt );
    inline BOOL             operator< ( const InsCaptionOpt & rObj ) const
                                                { return aOleId < rObj.aOleId; }
    friend SvStream&        operator>>( SvStream& rIStream, InsCaptionOpt& rCapOpt );
    friend SvStream&        operator<<( SvStream& rOStream, const InsCaptionOpt& rCapOpt );
};

#endif


diff --git a/sw/source/ui/inc/cfgdesc.hxx b/sw/source/ui/inc/cfgdesc.hxx
new file mode 100644
index 0000000..2423ab0
--- /dev/null
+++ b/sw/source/ui/inc/cfgdesc.hxx
@@ -0,0 +1,105 @@
/*************************************************************************
 *
 *  $RCSfile: cfgdesc.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:38 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _CFGDESC_HXX
#define _CFGDESC_HXX

#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif

class SwCfgDesc
{
protected:
    String aFuncText;
    String aLibName;
    USHORT nEvent;

    SwCfgDesc(const String &rFuncName, USHORT nId);
    SwCfgDesc(const String &rLib,const String &rMacro);
    ~SwCfgDesc();

public:
    void SetEvent(USHORT nE);               // inline
    void SetFuncText(const String &rStr);   // inline
    void SetMacro(const String &rLib, const String &rMac);
    BOOL IsMacro() const;
    USHORT GetEvent() const;                // inline
    String GetFuncText() const;             // inline
    String GetMacro() const;                // inline
    String GetLib() const;              // inline
};

// INLINE METHODE --------------------------------------------------------
inline void SwCfgDesc::SetEvent(USHORT nE) {
    nEvent = nE;
}

inline void SwCfgDesc::SetFuncText(const String &rStr) {
    aFuncText = rStr;
}

inline  USHORT SwCfgDesc::GetEvent() const { return nEvent; }
inline  String SwCfgDesc::GetFuncText() const { return aFuncText; }
inline  String SwCfgDesc::GetMacro() const { return aFuncText; }
inline  String SwCfgDesc::GetLib() const { return aLibName; }


#endif
diff --git a/sw/source/ui/inc/cfgid.h b/sw/source/ui/inc/cfgid.h
new file mode 100644
index 0000000..4595bff
--- /dev/null
+++ b/sw/source/ui/inc/cfgid.h
@@ -0,0 +1,180 @@
/*************************************************************************
 *
 *  $RCSfile: cfgid.h,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:38 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _CFGID_H
#define _CFGID_H

#ifndef _SFX_HRC //autogen
#include <sfx2/sfx.hrc>
#endif

#define CFG_DBDESCMGR_ITEM      SFX_ITEMTYPE_SW_BEGIN
#define CFG_USERPREF_ITEM       (SFX_ITEMTYPE_SW_BEGIN + 1)

#define CFG_COLOR_ITEM          (SFX_ITEMTYPE_SW_BEGIN + 3)
#define CFG_PRINT_ITEM          (SFX_ITEMTYPE_SW_BEGIN + 4)
#define CFG_AUTOCORR_ITEM       (SFX_ITEMTYPE_SW_BEGIN + 5)
#define CFG_AUTOFMT_ITEM        (SFX_ITEMTYPE_SW_BEGIN + 6)
#define CFG_NUMRULE_ITEM        (SFX_ITEMTYPE_SW_BEGIN + 7)
#define CFG_ENV_ITEM            (SFX_ITEMTYPE_SW_BEGIN + 8)
#define CFG_LAB_ITEM            (SFX_ITEMTYPE_SW_BEGIN + 9)
#define CFG_CHAPTER_ITEM        (SFX_ITEMTYPE_SW_BEGIN +10)
//#define CFG_BROWSEPREF_ITEM   (SFX_ITEMTYPE_SW_BEGIN +11) //UsrPrefs fuer BrowseView
#define CFG_STDFONT_ITEM        (SFX_ITEMTYPE_SW_BEGIN +12)
#define CFG_STATUSBAR           (SFX_ITEMTYPE_SW_BEGIN +13)
#define CFG_NAVIPI              (SFX_ITEMTYPE_SW_BEGIN +14)
#define CFG_SRCVIEW             (SFX_ITEMTYPE_SW_BEGIN +15)
#define CFG_SW_MENU             (SFX_ITEMTYPE_SW_BEGIN +16)
#define CFG_SW_ACCEL            (SFX_ITEMTYPE_SW_BEGIN +17)
#define CFG_SW_MODULE           (SFX_ITEMTYPE_SW_BEGIN +18)
#define CFG_SWWEB_MENU          (SFX_ITEMTYPE_SW_BEGIN +19)
#define CFG_SWWEB_ACCEL         (SFX_ITEMTYPE_SW_BEGIN +20)
#define CFG_SWWEB_USRPREF       (SFX_ITEMTYPE_SW_BEGIN +21)
#define CFG_WEBPRINT_ITEM       (SFX_ITEMTYPE_SW_BEGIN +22)
#define CFG_TOOLBARCONFIG_ITEM      (SFX_ITEMTYPE_SW_BEGIN +23)
#define CFG_WEBTOOLBARCONFIG_ITEM   (SFX_ITEMTYPE_SW_BEGIN +24)
#define CFG_INSERT_DBCOLUMN_ITEM    (SFX_ITEMTYPE_SW_BEGIN +25)
#define CFG_INSERT_HEADFOOT_ITEM    (SFX_ITEMTYPE_SW_BEGIN +26)
#define CFG_SW_MENU_PORTAL          (SFX_ITEMTYPE_SW_BEGIN +27)
#define CFG_SWWEB_MENU_PORTAL       (SFX_ITEMTYPE_SW_BEGIN +28)

/*-------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.25  2000/09/18 16:05:37  willem.vandorp
    OpenOffice header added.

    Revision 1.24  2000/08/07 14:02:28  os
    portal menu added

    Revision 1.23  1998/05/25 08:06:20  JP
    neue ConfigId fuers einfuegen von Standard Kopf-/Fusszeilen


      Rev 1.22   25 May 1998 10:06:20   JP
   neue ConfigId fuers einfuegen von Standard Kopf-/Fusszeilen

      Rev 1.21   20 May 1998 21:24:56   JP
   neue ConfigId fuer Datenbankspalten einfuegen Autopilot

      Rev 1.20   02 Apr 1998 10:05:00   MA
   new: ToolbarCfg

      Rev 1.19   28 Nov 1997 08:26:12   MA
   includes

      Rev 1.18   05 Feb 1997 13:35:44   OS
   PrintOptins auch fuer Web

      Rev 1.17   30 Jan 1997 11:13:36   OS
   Id fuer BrowseUsrPref

      Rev 1.16   24 Jan 1997 14:57:20   OS
   defines fuer WebMenue und -Accel

      Rev 1.15   13 Jan 1997 16:54:00   OS
   neu: SwModuleOptions

      Rev 1.14   18 Nov 1996 09:27:14   OS
   neue ConfigIds

      Rev 1.13   15 Nov 1996 10:52:58   OS
   SFX_ITEMTYPE_USER_BEGIN -> SFX_ITEMTYPE_SW_BEGIN

      Rev 1.12   13 Nov 1996 14:33:08   OS
   neues ConfigItem: SwNavigationConfig

      Rev 1.11   07 Nov 1996 16:18:56   OS
   neue Id fuer StatusBar

      Rev 1.10   03 Sep 1996 16:55:08   OS
   neu: ConfigItem fuer Standardfonts

      Rev 1.9   24 Apr 1996 15:04:04   OS
   Umstellung UsrPref/ViewOption

      Rev 1.8   03 Jan 1996 10:33:28   OS
   neue Id fuer Kapitelnumerierung

      Rev 1.7   20 Feb 1995 19:38:26   PK
   neu: efg_(env|lab)_item

      Rev 1.6   10 Jan 1995 18:53:26   ER
   #endif ohne Kommentar

      Rev 1.5   31 Oct 1994 11:16:34   MS
   ifndef angepasst

      Rev 1.4   06 Oct 1994 17:15:52   VB
   cfgid.h -> T:/sw/source/ui/inc/cfgid.h_v
   Enter description of changes made
   NumRules wieder scharf geschaltet.

      Rev 1.3   28 Sep 1994 14:14:24   MS
   Umstellung auf SfxConfigItem

      Rev 1.2   27 Sep 1994 10:47:38   MS

      Rev 1.1   19 Sep 1994 15:28:32   MS
   Fix fuers Update

      Rev 1.0   15 Sep 1994 16:41:46   MS
   Initial revision.
 -------------------------------------------------------------------------*/
#endif
diff --git a/sw/source/ui/inc/cfgitems.hxx b/sw/source/ui/inc/cfgitems.hxx
new file mode 100644
index 0000000..067b482
--- /dev/null
+++ b/sw/source/ui/inc/cfgitems.hxx
@@ -0,0 +1,300 @@
/*************************************************************************
 *
 *  $RCSfile: cfgitems.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:38 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _CFGITEMS_HXX
#define _CFGITEMS_HXX

#ifndef _SFXPOOLITEM_HXX //autogen
#include <svtools/poolitem.hxx>
#endif

#ifndef _AUTHRATR_HXX
#include <authratr.hxx>
#endif

class SwWriterApp;
class SwModule;
#ifndef PRODUCT
class SwTestTabPage;
#endif
class SwAddPrinterTabPage;
class SfxPrinter;
class ViewShell;
class SwViewOption;
class SwPrintOptions;
class SwContentOptPage;
class SwLayoutOptPage;
class SwDocEditDialog;

SfxPrinter* GetPrt( ViewShell* );
void        SetPrt( SfxPrinter* );


/*--------OS 12.01.95 -----------------------------------
Item fuer Einstellungsdialog - Dokumentanzeige
--------------------------------------------------------- */
#ifdef FN_PARAM_DOCDISP

class SwDocDisplayItem : public SfxPoolItem
{
    friend SwWriterApp;
    friend SwContentOptPage;
    friend SwModule;

    BOOL bParagraphEnd      :1;
    BOOL bTab               :1;
    BOOL bSpace             :1;
    BOOL bNonbreakingSpace  :1;
    BOOL bSoftHyphen        :1;
    BOOL bHiddenText        :1;
    BOOL bManualBreak       :1;
    BOOL bIndexEntry        :1;
    BOOL bIndexBackground   :1;
    BOOL bFootnoteBackground:1;
    BOOL bField             :1;
    BOOL bTable             :1;
    BOOL bGraphic           :1;
    BOOL bDrawing           :1;
    BOOL bFieldName         :1;
    BOOL bNotes             :1;
    BOOL bShowHiddenPara    :1;

    Color aIndexBackgrndCol;


public:
                                TYPEINFO();
                                SwDocDisplayItem( USHORT nWhich = FN_PARAM_DOCDISP );
                                SwDocDisplayItem(
                                    const SwDocDisplayItem& rSwDocDisplayItem );
                                SwDocDisplayItem( const SwViewOption& rVOpt,
                                                                USHORT nWhich );


    virtual SfxPoolItem*        Clone( SfxItemPool *pPool = 0 ) const;
    virtual int                 operator==( const SfxPoolItem& ) const;
    void                        operator=( const SwDocDisplayItem& );
    void                        FillViewOptions( SwViewOption& rVOpt) const;
};
#endif
/*--------OS 12.01.95 -----------------------------------
Item fuer Einstellungsdialog, Elementeseite
--------------------------------------------------------- */
#ifdef FN_PARAM_ELEM
class SwElemItem : public SfxPoolItem
{
    BOOL bHorzScrollbar :1;
    BOOL bVertScrollbar :1;
    BOOL bHorzRuler     :1;
    BOOL bVertRuler     :1;
    BOOL bTableBounds   :1;
    BOOL bSectionBounds :1;
    BOOL bCrosshair     :1;
    BOOL bHandles       :1;
    BOOL bBigHandles    :1;
    BOOL bBounds        :1;
    BOOL bStatusLine    :1;
    BOOL bSmoothScroll  :1;

    friend SwLayoutOptPage;

public:
                            TYPEINFO();
                            SwElemItem( USHORT nWhich = FN_PARAM_ELEM );
                            SwElemItem(const SwElemItem& rElemItem);
                            SwElemItem(const SwViewOption& rVOpt, USHORT nWhich);


    virtual SfxPoolItem*    Clone( SfxItemPool *pPool = 0 ) const;
    virtual int             operator==( const SfxPoolItem& ) const;
    void                    operator=( const SwElemItem& );

    void                    FillViewOptions( SwViewOption& rVOpt) const;

    void        SetStatusLine(BOOL bSet){bStatusLine = bSet;}
    BOOL        IsStatusLine()const     {return bStatusLine;}
};
#endif
/*--------OS 12.01.95 -----------------------------------
Item fuer Einstellungsdialog - Drucker/Zusaetze
--------------------------------------------------------- */
#ifdef FN_PARAM_ADDPRINTER

class SwAddPrinterItem : public SfxPoolItem
{
    friend  SwAddPrinterTabPage;

    String sFaxName;
    UINT16 nPrintPostIts;

    BOOL bPrintGraphic      :1,
         bPrintTable        :1,
         bPrintDrawing      :1,
         bPrintLeftPage     :1,
         bPrintRightPage    :1,
         bPrintControl      :1,
         bPrintReverse      :1,
         bPaperFromSetup    :1,
         bPrintProspect     :1,
         bPrintPageBackground:1,
         bPrintBlackFont    :1,
         bPrintSingleJobs   :1;

public:
    TYPEINFO();
    SwAddPrinterItem( USHORT nWhich = FN_PARAM_ADDPRINTER );
    SwAddPrinterItem( USHORT nWhich, SwPrintOptions* pPrtOpt );
    SwAddPrinterItem( const SwAddPrinterItem& rAddPrinterItem);

    virtual SfxPoolItem* Clone( SfxItemPool *pPool = 0 ) const;
    virtual int          operator==( const SfxPoolItem& ) const;
    void          SetPrintOptions( SwPrintOptions* pPrtOpt ) const;
    const String &GetFax() const              { return sFaxName; }
    void          SetFax( const String& rFax) { sFaxName = rFax; }


    BOOL   IsPrintProspect() const      { return bPrintProspect; }
    void   SetPrintProspect(BOOL bFlag ){ bPrintProspect = bFlag; }
    BOOL IsPrintGraphic () const { return bPrintGraphic; }
    BOOL IsPrintTable () const { return bPrintTable; }
    BOOL IsPrintDraw () const { return bPrintDrawing; }
    BOOL IsPrintControl () const { return bPrintControl; }
    BOOL IsPrintLeftPage () const { return bPrintLeftPage; }
    BOOL IsPrintRightPage() const { return bPrintRightPage; }
    BOOL IsPrintReverse  () const { return bPrintReverse; }
    BOOL IsPaperFromSetup() const { return bPaperFromSetup; }
    BOOL IsPrintPageBackground() const { return bPrintPageBackground; }
    BOOL IsPrintBlackFont() const { return bPrintBlackFont; }
    BOOL IsPrintSingleJobs() const { return bPrintSingleJobs; }
    UINT16 GetPrintPostIts () const { return nPrintPostIts; }

};
#endif


/*--------OS 12.01.95 -----------------------------------
Item fuer Einstellungsdialog, ShadowCursorSeite
--------------------------------------------------------- */
#ifdef FN_PARAM_SHADOWCURSOR

class SwShadowCursorItem : public SfxPoolItem
{
    Color aColor;
    BYTE eMode;
    BOOL bOn;
public:
    TYPEINFO();
    SwShadowCursorItem( USHORT nWhich = FN_PARAM_SHADOWCURSOR );
    SwShadowCursorItem( const SwShadowCursorItem& rElemItem );
    SwShadowCursorItem( const SwViewOption& rVOpt, USHORT nWhich );


    virtual SfxPoolItem*    Clone( SfxItemPool *pPool = 0 ) const;
    virtual int             operator==( const SfxPoolItem& ) const;
    void                    operator=( const SwShadowCursorItem& );

    void FillViewOptions( SwViewOption& rVOpt) const;

    const Color& GetColor() const       { return aColor; }
    BYTE GetMode() const                { return eMode; }
    BOOL IsOn() const                   { return bOn; }

    void SetColor( const Color& rCol )  { aColor = rCol; }
    void SetMode( BYTE eM )             { eMode = eM; }
    void SetOn( BOOL bFlag )            { bOn = bFlag; }
};
#endif

#ifndef PRODUCT
/*--------OS 12.01.95 -----------------------------------
Item fuer Einstellungsdialog - Testeinstellungen
--------------------------------------------------------- */
class SwTestItem : public SfxPoolItem
{
    friend SwModule;
    friend SwWriterApp;
    friend SwTestTabPage;
    friend SwDocEditDialog;

    BOOL    bTest1:1;
    BOOL    bTest2:1;
    BOOL    bTest3:1;
    BOOL    bTest4:1;
    BOOL    bTest5:1;
    BOOL    bTest6:1;
    BOOL    bTest7:1;
    BOOL    bTest8:1;
    BOOL    bTest9:1;
    BOOL    bTest10:1;

public:
                            SwTestItem( USHORT nWhich):
                                            SfxPoolItem(nWhich){};
                            SwTestItem( const SwTestItem& pTestItem);

    virtual SfxPoolItem*    Clone( SfxItemPool *pPool = 0 ) const;
    virtual int             operator==( const SfxPoolItem& ) const;

};
#endif

#endif


diff --git a/sw/source/ui/inc/changedb.hxx b/sw/source/ui/inc/changedb.hxx
new file mode 100644
index 0000000..6ffe345
--- /dev/null
+++ b/sw/source/ui/inc/changedb.hxx
@@ -0,0 +1,135 @@
/*************************************************************************
 *
 *  $RCSfile: changedb.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:38 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _CHANGEDB_HXX
#define _CHANGEDB_HXX


#ifndef _BITMAP_HXX //autogen
#include <vcl/bitmap.hxx>
#endif
#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif
#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif
#ifndef _STDCTRL_HXX //autogen
#include <svtools/stdctrl.hxx>
#endif
#ifndef _SVTREEBOX_HXX //autogen
#include <svtools/svtreebx.hxx>
#endif
#ifndef _SVX_STDDLG_HXX //autogen
#include <svx/stddlg.hxx>
#endif
#ifndef _DBTREE_HXX
#include "dbtree.hxx"
#endif

#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif

class SwFldMgr;
class SwView;
class SwWrtShell;

/*--------------------------------------------------------------------
     Beschreibung: Datenbank an Feldern austauschen
 --------------------------------------------------------------------*/

class SwChangeDBDlg: public SvxStandardDialog
{
    FixedInfo       aDescFT;
    FixedText       aUsedDBFT;
    FixedText       aAvailDBFT;
    SvTreeListBox   aUsedDBTLB;
    SwDBTreeList    aAvailDBTLB;
    GroupBox        aDBListGB;
    FixedText       aDocDBTextFT;
    FixedText       aDocDBNameFT;
    OKButton        aOKBT;
    CancelButton    aCancelBT;
    HelpButton      aHelpBT;
//  PushButton      aChangeBT;
    Bitmap          aRootOpened;
    Bitmap          aRootClosed;
    Image           aDBBMP;
    Image           aTableBMP;

    SwWrtShell      *pSh;
    SwFldMgr        *pMgr;

    DECL_LINK(TreeSelectHdl, SvTreeListBox* pBox = 0);
    DECL_LINK(ButtonHdl, Button* pBtn);

    virtual void    Apply();
    void            UpdateFlds();
    void            FillDBPopup();
    SvLBoxEntry*    Insert(const String& rDBName);
    void            ShowDBName(const String& rDBName);

public:
    SwChangeDBDlg(SwView& rVw);
    ~SwChangeDBDlg();
};

#endif
diff --git a/sw/source/ui/inc/chartins.hxx b/sw/source/ui/inc/chartins.hxx
new file mode 100644
index 0000000..fad5a97
--- /dev/null
+++ b/sw/source/ui/inc/chartins.hxx
@@ -0,0 +1,160 @@
/*************************************************************************
 *
 *  $RCSfile: chartins.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:39 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
/*
/*
/*  (C) 1995 - 2000 StarDivision GmbH, Hamburg, Germany
/*  $Author: hr $ $Date: 2000-09-18 17:14:39 $ $Revision: 1.1.1.1 $
/*  $Logfile:   T:/sw/source/ui/inc/chartins.hxv  $ $Workfile:   CHARTINS.HXX  $
/*
/*  Dialog Einfuegen StarChart
/*
/*------------------------------------------------------------------ */

#ifndef _CHARTINS_HXX
#define _CHARTINS_HXX

#ifndef _SFX_CHILDWIN_HXX //autogen
#include <sfx2/childwin.hxx>
#endif

#ifdef _CHARTINS_CXX

#ifndef _BASEDLGS_HXX //autogen
#include <sfx2/basedlgs.hxx>
#endif

#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif

#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif

#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif

#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif

#include "autoedit.hxx"

class SfxItemSet;
class SwWrtShell;
class SchMemChart;

//========================================================================

class SwInsertChartDlg : public SfxModelessDialog
{
    FixedText       aTextFt;
    FixedText       aRangeFt;
    AutoEdit        aRangeEd;
    HelpButton      aHelp;
    CancelButton    aCancel;
    FixedText       aHLine;
    PushButton      aPrev;
    PushButton      aNext;
    PushButton      aFinish;
    CheckBox        aFirstRow;
    CheckBox        aFirstCol;
    GroupBox        aGroup1;
    SchMemChart *   pChartData;
    ModalDialog*    pChartDlg;
    SfxItemSet*     pInItemSet;
    SfxItemSet*     pOutItemSet;
    SwWrtShell*     pWrtShell;
    String          aAktTableName;
    BOOL            bUpdateChartData;
    BOOL            bChartInserted;

    void UpdateData();
    virtual BOOL        Close();

public:
    SwInsertChartDlg( SfxBindings*, SfxChildWindow*,
                      Window *pParent, SwWrtShell * );
    ~SwInsertChartDlg();

    DECL_LINK( SelTblCellsNotify, SwWrtShell * );
    DECL_LINK( ModifyHdl, Edit* );
    DECL_LINK( NextHdl, Button* );
    DECL_LINK( FinishHdl, Button* );
    DECL_LINK( CloseHdl, Button* );
    DECL_LINK( ClickHdl, CheckBox* );
};
#endif

class SwInsertChartChild : public SfxChildWindow
{
public:
    SwInsertChartChild( Window* ,
                        USHORT nId,
                        SfxBindings*,
                        SfxChildWinInfo*  );
    SFX_DECL_CHILDWINDOW( SwInsertChartChild );
};


#endif

diff --git a/sw/source/ui/inc/chldwrap.hxx b/sw/source/ui/inc/chldwrap.hxx
new file mode 100644
index 0000000..3bc8e98
--- /dev/null
+++ b/sw/source/ui/inc/chldwrap.hxx
@@ -0,0 +1,94 @@
/*************************************************************************
 *
 *  $RCSfile: chldwrap.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:39 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _CHLDWRAP_HXX
#define _CHLDWRAP_HXX

#ifndef _SFX_CHILDWIN_HXX //autogen
#include <sfx2/childwin.hxx>
#endif

#ifndef _SV_TIMER_HXX //autogen
#include <vcl/timer.hxx>
#endif

class SwDocShell;

class SwChildWinWrapper : public SfxChildWindow
{
    Timer       aUpdateTimer;
    SwDocShell* pDocSh;

    DECL_LINK( UpdateHdl, void* );

    // Implementation in fldtdlg.cxx
protected:
    SwChildWinWrapper(Window *pParentWindow, USHORT nId);

public:
    virtual BOOL    ReInitDlg(SwDocShell *pDocSh);

    inline SwDocShell*  GetOldDocShell()                    { return pDocSh; }
    inline void         SetOldDocShell(SwDocShell *pDcSh)   { pDocSh = pDcSh; }
};


#endif

diff --git a/sw/source/ui/inc/chrdlg.hxx b/sw/source/ui/inc/chrdlg.hxx
new file mode 100644
index 0000000..8fdb151
--- /dev/null
+++ b/sw/source/ui/inc/chrdlg.hxx
@@ -0,0 +1,157 @@
/*************************************************************************
 *
 *  $RCSfile: chrdlg.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:39 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWCHARDLG_HXX
#define _SWCHARDLG_HXX

#ifndef _SFXTABDLG_HXX //autogen
#include <sfx2/tabdlg.hxx>
#endif

#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif

#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif

#ifndef _EDIT_HXX //autogen
#include <vcl/edit.hxx>
#endif

#ifndef _COMBOBOX_HXX //autogen
#include <vcl/combobox.hxx>
#endif

#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif

#ifndef _LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif

class FontList;
class SwView;
class SvxMacroItem;

/*--------------------------------------------------------------------
   Beschreibung:    Der Tabdialog Traeger der TabPages
 --------------------------------------------------------------------*/

class SwCharDlg: public SfxTabDialog
{
    SwView&   rView;
    BOOL      bIsDrwTxtMode;

public:
    SwCharDlg(Window* pParent, SwView& pVw, const SfxItemSet& rCoreSet,
              const String* pFmtStr = 0, BOOL bIsDrwTxtDlg = FALSE);

    ~SwCharDlg();

    virtual void PageCreated( USHORT nId, SfxTabPage &rPage );
};

/*-----------------14.08.96 11.03-------------------
    Beschreibung: Tabpage fuer URL-Attribut
--------------------------------------------------*/

class SwCharURLPage : public SfxTabPage
{
    GroupBox            aURLGB;

    FixedText           aURLFT;
    Edit                aURLED;
    FixedText           aTextFT;
    Edit                aTextED;
    FixedText           aNameFT;
    Edit                aNameED;
    FixedText           aTargetFrmFT;
    ComboBox            aTargetFrmLB;
    PushButton          aURLPB;
    PushButton          aEventPB;
    GroupBox            aStyleGB;
    FixedText           aVisitedFT;
    ListBox             aVisitedLB;
    FixedText           aNotVisitedFT;
    ListBox             aNotVisitedLB;

    SvxMacroItem*       pINetItem;
    BOOL                bModified;

    DECL_LINK( InsertFileHdl, PushButton * );
    DECL_LINK( EventHdl, PushButton * );

public:
                        SwCharURLPage( Window* pParent,
                                           const SfxItemSet& rSet );

                        ~SwCharURLPage();
    static SfxTabPage*  Create( Window* pParent,
                                const SfxItemSet& rAttrSet);

    virtual BOOL        FillItemSet( SfxItemSet& rSet );
    virtual void        Reset( const SfxItemSet& rSet );
};

#endif

diff --git a/sw/source/ui/inc/cnttab.hxx b/sw/source/ui/inc/cnttab.hxx
new file mode 100644
index 0000000..e8a3012
--- /dev/null
+++ b/sw/source/ui/inc/cnttab.hxx
@@ -0,0 +1,581 @@
/*************************************************************************
 *
 *  $RCSfile: cnttab.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:39 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _CNTTAB_HXX
#define _CNTTAB_HXX

#ifndef _SVX_STDDLG_HXX //autogen
#include <svx/stddlg.hxx>
#endif

#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif

#ifndef _EDIT_HXX //autogen
#include <vcl/edit.hxx>
#endif

#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif

#ifndef _FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif
#ifndef _SV_LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif
#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif

#ifndef _SFXTABDLG_HXX //autogen
#include <sfx2/tabdlg.hxx>
#endif

#include "tox.hxx"
#ifndef _LIST_HXX //autogen
#include <tools/list.hxx>
#endif
#ifndef _TOXMGR_HXX
#include <toxmgr.hxx>
#endif
#ifndef _SVX_CHECKLBX_HXX //autogen wg. SvxCheckListBox
#include <svx/checklbx.hxx>
#endif
#ifndef _SV_RESARY_HXX //autogen wg. ResStringArray
#include <vcl/resary.hxx>
#endif
#ifndef _SVTREEBOX_HXX
#include <svtools/svtreebx.hxx>
#endif
#ifndef _SV_MENUBTN_HXX
#include <vcl/menubtn.hxx>
#endif

class SwWrtShell;
class SwTOXMgr;
/* -----------------14.06.99 12:12-------------------

 --------------------------------------------------*/
struct CurTOXType
{
    TOXTypes    eType;
    USHORT      nIndex; //for TOX_USER only

    BOOL operator==(const CurTOXType aCmp)
       {
        return eType == aCmp.eType && nIndex == aCmp.nIndex;
       }
    USHORT GetFlatIndex() const;

};
//-----------------------------------------------------------------------------
#if 0
class IdxExampleResource : public Resource
{
    ResStringArray      aTextArray;

public:
    IdxExampleResource(const ResId& rResId);

    ResStringArray& GetTextArray() {return aTextArray;}
};
#endif

//-----------------------------------------------------------------------------
class SwOneExampleFrame;
struct SwIndexSections_Impl;

class SwMultiTOXTabDialog : public SfxTabDialog
{
    Window                  aExampleContainerWIN;
    Window                  aExampleWIN;
    CheckBox                aShowExampleCB;
    SwTOXMgr*               pMgr;
    SwWrtShell&             rSh;

    SwOneExampleFrame*      pExampleFrame;

    SwTOXDescription**      pDescArr; //
    SwForm**                pFormArr; //
    SwIndexSections_Impl**  pxIndexSectionsArr;

    CurTOXType              eCurrentTOXType;

    String                  sUserDefinedIndex;
    USHORT                  nTypeCount;
    USHORT                  nInitialTOXType;

    BOOL                    bEditTOX;
    BOOL                    bExampleCreated;
    BOOL                    bGlobalFlag;

    virtual short       Ok();
    SwTOXDescription*   CreateTOXDescFromTOXBase(const SwTOXBase*pCurTOX);

    DECL_LINK(CreateExample_Hdl, void* );
    DECL_LINK(ShowPreviewHdl, CheckBox*);

public:
    SwMultiTOXTabDialog(Window* pParent, const SfxItemSet& rSet,
                        SwWrtShell &rShell,
                        const SwTOXBase* pCurTOX, USHORT nToxType = USHRT_MAX,
                        BOOL bGlobal = FALSE);
    ~SwMultiTOXTabDialog();

    virtual void        PageCreated( USHORT nId, SfxTabPage &rPage );

    SwForm*             GetForm(CurTOXType eType);

    CurTOXType          GetCurrentTOXType() const { return eCurrentTOXType;}
    void                SetCurrentTOXType(CurTOXType    eSet)
                                {
                                    eCurrentTOXType = eSet;
                                }

    void                UpdateExample();
    BOOL                IsTOXEditMode() const { return bEditTOX;}
//  const SwTOXBase*    GetCurTOX() const;

    SwWrtShell&         GetWrtShell() {return rSh;}

    SwTOXDescription&   GetTOXDescription(CurTOXType eTOXTypes);
    void                CreateOrUpdateExample(
                            USHORT nTOXIndex, USHORT nPage = 0, USHORT nCurLevel = USHRT_MAX);

    static BOOL IsNoNum(SwWrtShell& rSh, const String& rName);
};

/* -----------------14.06.99 12:17-------------------

 --------------------------------------------------*/
class SwOLENames : public Resource
{
    ResStringArray      aNamesAry;
public:
    SwOLENames(const ResId& rResId) :
        Resource(rResId),
        aNamesAry(ResId(1)){FreeResource();}

    ResStringArray&     GetNames() { return aNamesAry;}

};
/* -----------------14.07.99 12:17-------------------

 --------------------------------------------------*/
class SwTOXSelectTabPage : public SfxTabPage
{
    FixedText       aTypeFT;
    ListBox         aTypeLB;
    CheckBox        aReadOnlyCB;
    FixedText       aTitleFT;
    Edit            aTitleED;
    GroupBox        aTypeTitleGB;

    ListBox         aAreaLB;
    FixedText       aLevelFT;   //content, user
    NumericField    aLevelNF;   //content, user
    GroupBox        aAreaGB;

    //content
    CheckBox        aFromHeadingsCB;
    PushButton      aChapterDlgPB;
    CheckBox        aAddStylesCB;
    PushButton      aAddStylesPB;
    //user
//  CheckBox        aFromStylesCB; -> aAddStylesCB;
//  PushButton      aFromStylesPB; -> aAddStylesPB;
    CheckBox        aFromTablesCB;
    CheckBox        aFromFramesCB;
    CheckBox        aFromGraphicsCB;
    CheckBox        aFromOLECB;
    CheckBox        aLevelFromChapterCB;

    //illustration + table
    RadioButton     aFromCaptionsRB;
    RadioButton     aFromObjectNamesRB;

    //illustration and tables
    FixedText       aCaptionSequenceFT;
    ListBox         aCaptionSequenceLB;
    FixedText       aDisplayTypeFT;
    ListBox         aDisplayTypeLB;

    //all but illustration and table
    CheckBox        aTOXMarksCB;

    //
    GroupBox        aCreateFromGB;  // content, user, illustration

    //index only
    CheckBox        aCollectSameCB;
    CheckBox        aUseFFCB;
    CheckBox        aUseDashCB;
    CheckBox        aCaseSensitiveCB;
    CheckBox        aInitialCapsCB;
    CheckBox        aKeyAsEntryCB;
    CheckBox        aFromFileCB;
    MenuButton      aAutoMarkPB;
//  PushButton      aCreateAutoMarkPB;
//  PushButton      aEditAutoMarkPB;
    GroupBox        aIdxOptionsGB; // index only

    // object only
    SwOLENames      aFromNames;
    SvxCheckListBox aFromObjCLB;
    GroupBox        aFromObjGB;

    CheckBox        aSequenceCB;
    FixedText       aBracketFT;
    ListBox         aBracketLB;
    GroupBox        aAuthorityFormatGB;

    Point           aCBLeftPos1;
    Point           aCBLeftPos2;
    Point           aCBLeftPos3;

    String          aStyleArr[MAXLEVEL];
    String          sAutoMarkURL;
    String          sAutoMarkType;
    String          sAddStyleUser;
    String          sAddStyleContent;

    BOOL            bFirstCall;

    DECL_LINK(TOXTypeHdl,   ListBox* );
    DECL_LINK(TOXAreaHdl,   ListBox* );
    DECL_LINK(ChapterHdl,   PushButton* );
    DECL_LINK(AddStylesHdl, PushButton* );
//  DECL_LINK(AutoMarkHdl,  PushButton* );
//  DECL_LINK(CreateEditAutoMarkHdl,PushButton* );
    DECL_LINK(MenuEnableHdl, Menu*);
    DECL_LINK(MenuExecuteHdl, Menu*);

    DECL_LINK(CheckBoxHdl,  CheckBox*   );
    DECL_LINK(RadioButtonHdl, RadioButton* );
    DECL_LINK(ModifyHdl, void*);

      void  ApplyTOXDescription();
    void    FillTOXDescription();
public:
    SwTOXSelectTabPage(Window* pParent, const SfxItemSet& rAttrSet);
    ~SwTOXSelectTabPage();

    virtual BOOL        FillItemSet( SfxItemSet& );
    virtual void        Reset( const SfxItemSet& );
    virtual void        ActivatePage( const SfxItemSet& );
    virtual int         DeactivatePage( SfxItemSet* pSet = 0 );

    static SfxTabPage*  Create( Window* pParent,
                                const SfxItemSet& rAttrSet);

    void                SelectType(TOXTypes eSet);  //preset TOXType, GlobalDoc
    void                SetWrtShell(SwWrtShell& rSh);
};
/* -----------------16.06.99 08:33-------------------

 --------------------------------------------------*/

DECLARE_LIST(TOXControlList, Control*);
class SwTOXEdit;
class SwTOXButton;
class SwTOXEntryTabPage;
class SwTokenWindow : public Window
{
    ImageButton     aLeftScrollWin;
    Window          aCtrlParentWin;
    ImageButton     aRightScrollWin;
    TOXControlList  aControlList;
    SwForm*         pForm;
    USHORT          nLevel;
    BOOL            bValid;
    String          aButtonTexts[TOKEN_END]; // Text of the buttons
    String          aButtonHelpTexts[TOKEN_END]; // QuickHelpText of the buttons
    String          sCharStyle;
    Link            aButtonSelectedHdl;
    Control*        pActiveCtrl;
    Link            aModifyHdl;

    SwTOXEntryTabPage*  m_pParent;

    DECL_LINK(EditResize, Edit*);
    DECL_LINK(NextItemHdl, SwTOXEdit* );
    DECL_LINK(TbxFocusHdl, SwTOXEdit* );
    DECL_LINK(NextItemBtnHdl, SwTOXButton* );
    DECL_LINK(TbxFocusBtnHdl, SwTOXButton* );
    DECL_LINK(ScrollHdl, ImageButton* );

    void    SetActiveControl(Control* pSet);

    Control*    InsertItem(const String& rText, const SwFormToken& aToken);
    void        AdjustPositions();
    void        AdjustScrolling();
    void        MoveControls(long nOffset);

public:
    SwTokenWindow(SwTOXEntryTabPage* pParent, const ResId& rResId);
    ~SwTokenWindow();

    void        SetForm(SwForm& rForm, USHORT nLevel);
    USHORT      GetLastLevel()const {return nLevel;};

    BOOL        IsValid() const {return bValid;}
    void        Invalidate() {bValid = FALSE;}

    String      GetPattern() const;

    void        SetButtonSelectedHdl(const Link& rLink)
                { aButtonSelectedHdl = rLink;}

    void        SetModifyHdl(const Link& rLink){aModifyHdl = rLink;}

    Control*    GetActiveControl()
                    { return pActiveCtrl;}

    void        InsertAtSelection(const String& rText, const SwFormToken& aToken);
    void        RemoveControl(SwTOXButton* pDel, BOOL bInternalCall = FALSE);

    BOOL        Contains(FormTokenType) const;

    BOOL        DetermineLinkStart();

    //helper for pattern buttons and edits
    BOOL        CreateQuickHelp(Control* pCtrl,
                    const SwFormToken& rToken, const HelpEvent& );

    virtual void        Resize();
};
/* -----------------------------23.12.99 14:16--------------------------------

 ---------------------------------------------------------------------------*/
class SwTOXEntryTabPage;
class SwIdxTreeListBox : public SvTreeListBox
{
    SwTOXEntryTabPage* pParent;

    virtual void    RequestHelp( const HelpEvent& rHEvt );
public:
    SwIdxTreeListBox(SwTOXEntryTabPage* pPar, const ResId& rResId);
};

/* -----------------16.06.99 12:49-------------------

 --------------------------------------------------*/
class SwTOXEntryTabPage : public SfxTabPage
{
    SwIdxTreeListBox    aLevelLB;
    FixedText           aLevelFT;

    SwTokenWindow   aTokenWIN;
    PushButton      aAllLevelsPB;

    PushButton      aEntryNoPB;
    PushButton      aEntryPB;
    PushButton      aTabPB;
    PushButton      aChapterInfoPB;
    PushButton      aPageNoPB;
    PushButton      aHyperLinkPB;

    ListBox         aAuthFieldsLB;
    PushButton      aAuthInsertPB;
    PushButton      aAuthRemovePB;

    FixedText       aCharStyleFT;
    ListBox         aCharStyleLB;       // character style of the current token
    PushButton      aEditStylePB;

    FixedText       aChapterEntryFT;
    ListBox         aChapterEntryLB;    // type of chapter info
//  FixedText       aSortingFT;
//  ListBox         aSortingLB;

    FixedText       aFillCharFT;
    ComboBox        aFillCharCB;        // fill char for tab stop
    FixedText       aTabPosFT;
    MetricField     aTabPosMF;          // tab stop position
    CheckBox        aAutoRightCB;
    GroupBox        aEntryGB;

    CheckBox        aRelToStyleCB;      // position relative to the right margin of the para style
    FixedText       aMainEntryStyleFT;
    ListBox         aMainEntryStyleLB;  // character style of main entries in indexes
    CheckBox        aAlphaDelimCB;
    CheckBox        aCommaSeparatedCB;
    GroupBox        aFormatGB;

    RadioButton     aSortDocPosRB;
    RadioButton     aSortContentRB;
    GroupBox        aSortingGB;

    FixedText           aFirstKeyFT;
    ListBox             aFirstKeyLB;
    ImageRadioButton    aFirstSortUpRB;
    ImageRadioButton    aFirstSortDownRB;

    FixedText           aSecondKeyFT;
    ListBox             aSecondKeyLB;
    ImageRadioButton    aSecondSortUpRB;
    ImageRadioButton    aSecondSortDownRB;

    FixedText           aThirdKeyFT;
    ListBox             aThirdKeyLB;
    ImageRadioButton    aThirdSortUpRB;
    ImageRadioButton    aThirdSortDownRB;

    GroupBox        aSortKeyGB;

    String          sDelimStr;
    String          sLevelStr;
    String          sAuthTypeStr;

    String          sNoCharStyle;
    String          sNoCharSortKey;
    Point           aButtonPositions[5];
    SwForm*         pCurrentForm;

    Point           aRelToStylePos;
    Point           aRelToStyleIdxPos;
    Size            aLevelGBSize;

    CurTOXType      aLastTOXType;
    BOOL            bInLevelHdl;

    DECL_LINK(StyleSelectHdl, ListBox*);
    DECL_LINK(EditStyleHdl, PushButton*);
    DECL_LINK(InsertTokenHdl, PushButton*);
    DECL_LINK(LevelHdl, SvTreeListBox*);
    DECL_LINK(AutoRightHdl, CheckBox*);
    DECL_LINK(TokenSelectedHdl, SwFormToken*);
    DECL_LINK(TabPosHdl, MetricField*);
    DECL_LINK(FillCharHdl, ComboBox*);
    DECL_LINK(RemoveInsertAuthHdl, PushButton*);
    DECL_LINK(SortKeyHdl, RadioButton*);
    DECL_LINK(ChapterInfoHdl, ListBox*);
    DECL_LINK(AllLevelsHdl, PushButton*);

    void            EnableButtons();
    void            WriteBackLevel();
    void            UpdateDescriptor();
    DECL_LINK(ModifyHdl, void*);

public:
    SwTOXEntryTabPage(Window* pParent, const SfxItemSet& rAttrSet);
    ~SwTOXEntryTabPage();

    virtual BOOL        FillItemSet( SfxItemSet& );
    virtual void        Reset( const SfxItemSet& );
    virtual void        ActivatePage( const SfxItemSet& );
    virtual int         DeactivatePage( SfxItemSet* pSet = 0 );

    static SfxTabPage*  Create( Window* pParent,
                                const SfxItemSet& rAttrSet);
    void                SetWrtShell(SwWrtShell& rSh);

    String              GetLevelHelp(USHORT nLevel) const;

    void                PreTokenButtonRemoved(const SwFormToken& rToken);
};
/* -----------------05.07.99 13:00-------------------

 --------------------------------------------------*/
class SwTOXStylesTabPage : public SfxTabPage
{
    FixedText       aLevelFT2;
    ListBox         aLevelLB;
    FixedText       aTemplateFT;
    ListBox         aParaLayLB;
    PushButton      aStdBT;
    PushButton      aAssignBT;
    PushButton      aEditStyleBT;
    GroupBox        aFormatGB;

    SwForm*         pCurrentForm;
//  void            UpdatePattern();

    DECL_LINK( EditStyleHdl, Button *);
    DECL_LINK( StdHdl, Button * );
    DECL_LINK( EnableSelectHdl, ListBox * );
    DECL_LINK( DoubleClickHdl, Button * );
    DECL_LINK( AssignHdl, Button * );
    DECL_LINK( ModifyHdl, void*);

    SwForm&     GetForm()
        {
            SwMultiTOXTabDialog* pDlg = (SwMultiTOXTabDialog*)GetTabDialog();
            return *pDlg->GetForm(pDlg->GetCurrentTOXType());
        }
public:
    SwTOXStylesTabPage(Window* pParent, const SfxItemSet& rAttrSet);
    ~SwTOXStylesTabPage();

    virtual BOOL        FillItemSet( SfxItemSet& );
    virtual void        Reset( const SfxItemSet& );
    virtual void        ActivatePage( const SfxItemSet& );
    virtual int         DeactivatePage( SfxItemSet* pSet = 0 );

    static SfxTabPage*  Create( Window* pParent,
                                const SfxItemSet& rAttrSet);

};

#endif // _CNTTAB_HXX

diff --git a/sw/source/ui/inc/colex.hxx b/sw/source/ui/inc/colex.hxx
new file mode 100644
index 0000000..1424de2
--- /dev/null
+++ b/sw/source/ui/inc/colex.hxx
@@ -0,0 +1,119 @@
/*************************************************************************
 *
 *  $RCSfile: colex.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:39 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _COLEX_HXX
#define _COLEX_HXX

#ifndef _SVX_PAGECTRL_HXX //autogen
#include <svx/pagectrl.hxx>
#endif
#ifndef _FMTCLDS_HXX //autogen
#include <fmtclds.hxx>
#endif

#include "frmatr.hxx"

class SwColMgr;
class SfxItemSet;

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

class SwColExample : public SvxPageWindow
{
private:
    SwColMgr*   pColMgr;
protected:
    virtual void DrawPage( const Point& rPoint,
                           const BOOL bSecond,
                           const BOOL bEnabled );

public:
        SwColExample(Window* pPar, const ResId& rResId );

    void UpdateExample( const SfxItemSet& rSet, SwColMgr* pMgr = 0  );

};

/*-----------------25.10.96 08.23-------------------

--------------------------------------------------*/
class SwColumnOnlyExample : public Window
{
private:
    Size        aWinSize;

    Size        aFrmSize;
    SwFmtCol    aCols;
    long        nDistance;

protected:
    virtual void Paint( const Rectangle& rRect );

public:
    SwColumnOnlyExample( Window* , const ResId& );

    void        SetColumns(const SwFmtCol& rCol)  { aCols = rCol; }
    void        SetFrameSize(const Size& rS, long nDist);

};

#endif // _COLEX_HXX
diff --git a/sw/source/ui/inc/colmgr.hxx b/sw/source/ui/inc/colmgr.hxx
new file mode 100644
index 0000000..b7041cf
--- /dev/null
+++ b/sw/source/ui/inc/colmgr.hxx
@@ -0,0 +1,166 @@
/*************************************************************************
 *
 *  $RCSfile: colmgr.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:39 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _COLMGR_HXX
#define _COLMGR_HXX

#ifndef _FMTCLDS_HXX //autogen
#include <fmtclds.hxx>
#endif

void FitToActualSize(SwFmtCol& rCol, USHORT nWidth);

class SwColMgr
{
public:
        // lActWidth wird aus den Edits des Seitendialogs
        // direkt uebergeben
    SwColMgr(const SfxItemSet &rSet, USHORT nActWidth = USHRT_MAX);
    ~SwColMgr();


    inline USHORT       GetCount() const;
    void                SetCount(USHORT nCount, USHORT nGutterWidth);
    USHORT              GetGutterWidth(USHORT nPos = USHRT_MAX) const;
    void                SetGutterWidth(USHORT nWidth, USHORT nPos = USHRT_MAX);

    USHORT              GetColWidth(USHORT nIdx) const;
    void                SetColWidth(USHORT nIdx, USHORT nWidth);

    inline BOOL         IsAutoWidth() const;
    void                SetAutoWidth(BOOL bOn = TRUE, USHORT lGutterWidth = 0);

    inline BOOL         HasLine() const;
    inline void         SetNoLine();

    inline void         SetLineWidthAndColor(ULONG nWidth, const Color& rCol);
    inline ULONG        GetLineWidth() const;
    inline const Color& GetLineColor() const;

    inline SwColLineAdj GetAdjust() const;
    inline void         SetAdjust(SwColLineAdj);

    short               GetLineHeightPercent() const;
    void                SetLineHeightPercent(short nPercent);

    inline void         NoCols();
    void                Update();

    const SwFmtCol&     GetColumns() const { return aFmtCol; }

    void                SetActualWidth(USHORT nW);
    USHORT              GetActualSize() const { return nWidth; }


private:

    SwFmtCol            aFmtCol;
    USHORT              nWidth;
};

// INLINE METHODE --------------------------------------------------------

inline  USHORT SwColMgr::GetCount() const
{
    return aFmtCol.GetNumCols();
}
inline void         SwColMgr::SetLineWidthAndColor(ULONG nWidth, const Color& rCol)
{
    aFmtCol.SetLineWidth(nWidth);
    aFmtCol.SetLineColor(rCol);
}
inline ULONG        SwColMgr::GetLineWidth() const
{
    return aFmtCol.GetLineWidth();
}
inline const Color& SwColMgr::GetLineColor() const
{
    return aFmtCol.GetLineColor();
}
inline  SwColLineAdj SwColMgr::GetAdjust() const
{
    return aFmtCol.GetLineAdj();
}
inline  void SwColMgr::SetAdjust(SwColLineAdj eAdj)
{
    aFmtCol.SetLineAdj(eAdj);
}
inline BOOL SwColMgr::IsAutoWidth() const
{
    return aFmtCol.IsOrtho();
}
inline void SwColMgr::SetAutoWidth(BOOL bOn, USHORT nGutterWidth)
{
    aFmtCol.SetOrtho(bOn, nGutterWidth, nWidth);
}
inline void SwColMgr::NoCols()
{
    aFmtCol.GetColumns().DeleteAndDestroy(0, aFmtCol.GetColumns().Count());
}
inline BOOL SwColMgr::HasLine() const
{
    return GetAdjust() != COLADJ_NONE;
}
inline void SwColMgr::SetNoLine()
{
    SetAdjust(COLADJ_NONE);
}

#endif
diff --git a/sw/source/ui/inc/column.hxx b/sw/source/ui/inc/column.hxx
new file mode 100644
index 0000000..57934a8
--- /dev/null
+++ b/sw/source/ui/inc/column.hxx
@@ -0,0 +1,266 @@
/*************************************************************************
 *
 *  $RCSfile: column.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:39 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _COLUMN_HXX
#define _COLUMN_HXX


#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif
#ifndef _FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif
#ifndef _IMAGE_HXX //autogen
#include <vcl/image.hxx>
#endif
#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif
#ifndef _LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif
#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif
#ifndef _TIMER_HXX //autogen
#include <vcl/timer.hxx>
#endif
#ifndef _IMAGEBTN_HXX //autogen
#include <vcl/imagebtn.hxx>
#endif
#ifndef _CTRLBOX_HXX
#include <svtools/ctrlbox.hxx>
#endif
#ifndef _VALUESET_HXX //autogen
#include <svtools/valueset.hxx>
#endif
#ifndef _BASEDLGS_HXX //autogen
#include <sfx2/basedlgs.hxx>
#endif
#ifndef _SFXTABDLG_HXX //autogen
#include <sfx2/tabdlg.hxx>
#endif

#ifndef _FMTCLBL_HXX
#include <fmtclbl.hxx>
#endif
#ifndef _COLEX_HXX
#include <colex.hxx>
#endif
#ifndef _PRCNTFLD_HXX
#include <prcntfld.hxx>
#endif

const nMaxCols = 99;
class SwColMgr;
class SwWrtShell;
class SwColumnPage;
/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

class SwColumnDlg : public SfxModalDialog
{
    OKButton            aOK;
    CancelButton        aCancel;
    HelpButton          aHelp;

    FixedText           aApplyToFT;
    ListBox             aApplyToLB;

    SwWrtShell&         rWrtShell;
    SwColumnPage*       pTabPage;
    SfxItemSet*         pPageSet;
    SfxItemSet*         pSectionSet;
    SfxItemSet*         pSelectionSet;
    SfxItemSet*         pFrameSet;

    long                nOldSelection;
    long                nSelectionWidth;
    long                nPageWidth;

    BOOL                bPageChanged : 1;
    BOOL                bSectionChanged : 1;
    BOOL                bSelSectionChanged : 1;
    BOOL                bFrameChanged : 1;


    DECL_LINK(ObjectHdl, ListBox*);
    DECL_LINK(OkHdl, OKButton*);

public:
    SwColumnDlg(Window* pParent, SwWrtShell& rSh);
    virtual ~SwColumnDlg();

    SwWrtShell&     GetWrtShell()   { return rWrtShell; }
};

/*-----------------07.03.97 08.26-------------------

--------------------------------------------------*/
class ColumnValueSet : public ValueSet
{
    public:
        ColumnValueSet(Window* pParent, const ResId& rResId) :
            ValueSet(pParent, rResId){}
        ~ColumnValueSet();

    virtual void    UserDraw( const UserDrawEvent& rUDEvt );
};
/*--------------------------------------------------------------------
    Beschreibung:   Spaltendialog jetzt als TabPage
 --------------------------------------------------------------------*/
class SwColumnPage : public SfxTabPage
{
    FixedText       aClNrLbl;
    NumericField    aCLNrEdt;
    ColumnValueSet  aDefaultVS;
    ImageList       aPreColsIL;
    CheckBox        aBalanceColsCB;
    GroupBox        aCLGroup;

    ImageButton     aBtnUp;
    FixedText       aWidthFT;
    FixedText       aDistFT;
    FixedText       aLbl1;
    PercentField    aEd1;
    PercentField    aDistEd1;
    FixedText       aLbl2;
    PercentField    aEd2;
    PercentField    aDistEd2;
    FixedText       aLbl3;
    PercentField    aEd3;
    ImageButton     aBtnDown;
    CheckBox        aAutoWidthBox;

    GroupBox        aLayoutGrp;

    FixedText       aLineTypeLbl;
    LineListBox     aLineTypeDLB;
    FixedText       aLineHeightLbl;
    MetricField     aLineHeightEdit;
    FixedText       aLinePosLbl;
    ListBox         aLinePosDLB;
    GroupBox        aLineTypeGrp;

    // Example
    SwColExample        aPgeExampleWN;
    SwColumnOnlyExample aFrmExampleWN;
    GroupBox        aExampleGB;

    SwColMgr*       pColMgr;

    USHORT          nFirstVis;
    USHORT          nCols;
    long            nColWidth[nMaxCols];
    long            nColDist[nMaxCols];
    USHORT          nMinWidth;
    PercentField    *pModifiedField;
    BOOL            bFormat;
    BOOL            bFrm;
    BOOL            bHtmlMode;
    BOOL            bLockUpdate;

    // Handler
    DECL_LINK( ColModify, NumericField * );
    DECL_LINK( GapModify, PercentField * );
    DECL_LINK( EdModify, PercentField * );
    DECL_LINK( AutoWidthHdl, CheckBox * );
    DECL_LINK( Timeout, Timer * );
    DECL_LINK( SetDefaultsHdl, ValueSet * );

    DECL_LINK( Up, Button * );
    DECL_LINK( Down, Button * );
    void            Apply(Button *);
    DECL_LINK( UpdateColMgr, void* );

    void            Update();
    void            UpdateCols();
    void            Init();
    void            ResetColWidth();
    void            SetLabels( USHORT nVis );

    virtual void    ActivatePage(const SfxItemSet& rSet);
    virtual int     DeactivatePage(SfxItemSet *pSet);

    SwColumnPage(Window *pParent, const SfxItemSet &rSet);

public:
    ~SwColumnPage();

    static SfxTabPage *Create(Window *pParent, const SfxItemSet &rSet);
    static USHORT* GetRanges();

    virtual BOOL    FillItemSet(SfxItemSet &rSet);
    virtual void    Reset(const SfxItemSet &rSet);

    void SetFrmMode(BOOL bMod);
    void SetPageWidth(long nPageWidth);

    void SetFormatUsed(BOOL bFmt) { bFormat = bFmt; }

    void ShowBalance(BOOL bShow) {aBalanceColsCB.Show(bShow);}

};

#endif

diff --git a/sw/source/ui/inc/conarc.hxx b/sw/source/ui/inc/conarc.hxx
new file mode 100644
index 0000000..1c7b0c1
--- /dev/null
+++ b/sw/source/ui/inc/conarc.hxx
@@ -0,0 +1,91 @@
/*************************************************************************
 *
 *  $RCSfile: conarc.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:39 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _CONARC_HXX
#define _CONARC_HXX

#include "drawbase.hxx"

/*************************************************************************
|*
|* Rechteck zeichnen
|*
\************************************************************************/

class ConstArc : public SwDrawBase
{
    Point aStartPnt;
    UINT16 nAnzButUp;

public:
    ConstArc(SwWrtShell* pSh, SwEditWin* pWin, SwView* pView);

                                       // Mouse- & Key-Events
    virtual BOOL    MouseButtonUp(const MouseEvent& rMEvt);
    virtual BOOL    MouseButtonDown(const MouseEvent& rMEvt);

    virtual void    Activate(const USHORT nSlotId); // Funktion aktivieren
    virtual void    Deactivate();
};



#endif      // _CONARC_HXX

diff --git a/sw/source/ui/inc/condedit.hxx b/sw/source/ui/inc/condedit.hxx
new file mode 100644
index 0000000..29b0d3b
--- /dev/null
+++ b/sw/source/ui/inc/condedit.hxx
@@ -0,0 +1,103 @@
/*************************************************************************
 *
 *  $RCSfile: condedit.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:39 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _CONDEDTI_HXX
#define _CONDEDTI_HXX

#ifndef _EDIT_HXX //autogen
#include <vcl/edit.hxx>
#endif

class DropEvent;

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

class ConditionEdit : public Edit
{
    BOOL bBrackets;

    virtual BOOL QueryDrop( DropEvent& rEvt );

public:
    ConditionEdit( Window* pParent, const ResId& rResId );

    inline void ShowBrackets(BOOL bShow) { bBrackets = bShow; }
};


#endif
















diff --git a/sw/source/ui/inc/conform.hxx b/sw/source/ui/inc/conform.hxx
new file mode 100644
index 0000000..fc98177
--- /dev/null
+++ b/sw/source/ui/inc/conform.hxx
@@ -0,0 +1,80 @@
/*************************************************************************
 *
 *  $RCSfile: conform.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:39 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _CONFORM_HXX
#define _CONFORM_HXX

#include "drawbase.hxx"

class ConstFormControl : public SwDrawBase
{
public:
    ConstFormControl(SwWrtShell* pSh, SwEditWin* pWin, SwView* pView);

                                       // Mouse- & Key-Events
    virtual BOOL MouseButtonDown(const MouseEvent& rMEvt);

    virtual void Activate(const USHORT nSlotId);    // Function aktivieren
};



#endif

diff --git a/sw/source/ui/inc/conpoly.hxx b/sw/source/ui/inc/conpoly.hxx
new file mode 100644
index 0000000..3005b04
--- /dev/null
+++ b/sw/source/ui/inc/conpoly.hxx
@@ -0,0 +1,89 @@
/*************************************************************************
 *
 *  $RCSfile: conpoly.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:39 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _CONPOLY_HXX
#define _CONPOLY_HXX

#include "drawbase.hxx"

/*************************************************************************
|*
|* Basisklasse fuer alle Funktionen
|*
\************************************************************************/

class ConstPolygon : public SwDrawBase
{
    Point aLastPos;

public:
    ConstPolygon(SwWrtShell* pSh, SwEditWin* pWin, SwView* pView);

                                       // Mouse- & Key-Events
    virtual BOOL MouseMove(const MouseEvent& rMEvt);
    virtual BOOL MouseButtonUp(const MouseEvent& rMEvt);
    virtual BOOL MouseButtonDown(const MouseEvent& rMEvt);

    virtual void Activate(const USHORT nSlotId);    // Function aktivieren
};


#endif      // _CONPOLY_HXX

diff --git a/sw/source/ui/inc/conrect.hxx b/sw/source/ui/inc/conrect.hxx
new file mode 100644
index 0000000..baefac2
--- /dev/null
+++ b/sw/source/ui/inc/conrect.hxx
@@ -0,0 +1,90 @@
/*************************************************************************
 *
 *  $RCSfile: conrect.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:39 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _SW_CONRECT_HXX
#define _SW_CONRECT_HXX

#include "drawbase.hxx"

/*************************************************************************
|*
|* Rechteck zeichnen
|*
\************************************************************************/

class ConstRectangle : public SwDrawBase
{
    BOOL bMarquee;

 public:
    ConstRectangle(SwWrtShell* pSh, SwEditWin* pWin, SwView* pView);

                                       // Mouse- & Key-Events
    virtual BOOL MouseButtonUp(const MouseEvent& rMEvt);
    virtual BOOL MouseButtonDown(const MouseEvent& rMEvt);

    virtual void Activate(const USHORT nSlotId);    // Function aktivieren
};



#endif      // _SW_CONRECT_HXX

diff --git a/sw/source/ui/inc/content.hxx b/sw/source/ui/inc/content.hxx
new file mode 100644
index 0000000..8162ec6
--- /dev/null
+++ b/sw/source/ui/inc/content.hxx
@@ -0,0 +1,256 @@
/*************************************************************************
 *
 *  $RCSfile: content.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:39 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _CONTENT_HXX
#define _CONTENT_HXX

#include <limits.h>     // USHRT_MAX
#ifndef _SWCONT_HXX
#include "swcont.hxx"
#endif

#ifndef _MENU_HXX //autogen
#include <vcl/menu.hxx>
#endif

class SwWrtShell;
class SwContentArr;
class SwContentType;
class SwNavigationPI;
class SwFmtFld;
class SwTxtINetFmt;
class SwNavigationConfig;
class SwDocShell;
class SvDataObject;
class SwTOXBase;

//----------------------------------------------------------------------------
//  Hilfsklassen
//----------------------------------------------------------------------------

class SwPopup : public PopupMenu
{
    USHORT          nCurId;
    virtual void    Select(){nCurId = GetCurItemId();}

public:
    SwPopup() :
        PopupMenu(),
        nCurId(USHRT_MAX){}

    USHORT          GetCurId() const { return nCurId; }

};

//----------------------------------------------------------------------------

class SwOutlineContent : public SwContent
{
    USHORT  nOutlinePos;
    BYTE    nOutlineLevel;
    BOOL    bIsMoveable;
    public:
        SwOutlineContent(   const SwContentType* pCnt,
                            const String& rName,
                            USHORT nArrPos,
                            BYTE nLevel,
                            BOOL bMove,
                            long nYPos) :
            SwContent(pCnt, rName, nYPos), nOutlineLevel(nLevel),
                        nOutlinePos(nArrPos), bIsMoveable(bMove){}

    USHORT  GetPos(){return nOutlinePos;}
    BYTE    GetOutlineLevel(){return nOutlineLevel;}
    BOOL    IsMoveable(){return bIsMoveable;};
};

//----------------------------------------------------------------------------
class SwRegionContent : public SwContent
{

    BYTE    nRegionLevel;

    public:
        SwRegionContent(    const SwContentType* pCnt,
                            const String& rName,
                            BYTE nLevel,
                            long nYPos) :
            SwContent(pCnt, rName, nYPos),
                        nRegionLevel(nLevel){}
    BYTE    GetRegionLevel() const {return nRegionLevel;}
};
//----------------------------------------------------------------------------

class SwURLFieldContent : public SwContent
{
    const SwTxtINetFmt* pINetAttr;
    String sURL;

public:
    SwURLFieldContent(  const SwContentType* pCnt,
                            const String& rName,
                            const String& rURL,
                            const SwTxtINetFmt* pAttr,
                            long nYPos )
        : SwContent( pCnt, rName, nYPos ), sURL( rURL ), pINetAttr( pAttr )
    {}

    virtual BOOL    IsProtect() const;
    const String&   GetURL()                { return sURL; }
    const SwTxtINetFmt* GetINetAttr()       { return pINetAttr; }
};

//----------------------------------------------------------------------------

class SwPostItContent : public SwContent
{
    const SwFmtFld*     pFld;
public:
    SwPostItContent( const SwContentType* pCnt,
                            const String& rName,
                            const SwFmtFld* pField,
                            long nYPos )
        : SwContent( pCnt, rName, nYPos ), pFld( pField )
    {}

    const SwFmtFld* GetPostIt()     { return pFld; }
    virtual BOOL    IsProtect() const;
};

//----------------------------------------------------------------------------

class SwGraphicContent : public SwContent
{
    String      sLink;
public:
    SwGraphicContent(const SwContentType* pCnt, const String& rName, const String& rLink, long nYPos)
        : SwContent( pCnt, rName, nYPos ), sLink( rLink )
        {}
    virtual ~SwGraphicContent();

    const String&   GetLink() const {return sLink;}
};

//----------------------------------------------------------------------------
class SwTOXBaseContent : public SwContent
{
    const SwTOXBase* pBase;
public:
    SwTOXBaseContent(const SwContentType* pCnt, const String& rName, long nYPos, const SwTOXBase& rBase)
        : SwContent( pCnt, rName, nYPos ), pBase(&rBase)
        {}
    virtual ~SwTOXBaseContent();

    const SwTOXBase* GetTOXBase() const {return pBase;}
};
/*
    class ContentType enthaelt Informationen zu einer Inhaltsform
    Das MemberArray wird nur gefuellt, wenn der Inhalt mit GetMember
    angefordert wird. Es wird nach Invalidate() nur dann neu geladen,
    wenn der Inhalt erneut ausgelesen werden soll.
*/
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------

class SwContentType : public SwTypeNumber
{
    SwWrtShell*         pWrtShell;
    SwContentArr*       pMember;            // Array fuer Inhalte
    String              sContentTypeName;   // Name der Inhaltsform
    String              sSingleContentTypeName; // Name der Inhaltsform, Singular
    String              sTypeToken;         // Anhaengsel fuer URL
    USHORT              nMemberCount;       // Inhaltsanzahl
    USHORT              nContentType;       // Id der Inhaltsform
    BYTE                nOutlineLevel;
    BOOL                bMemberFilled : 1;  // wurden die Inhalte bereits eingefuegt?
    BOOL                bIsInternalDrag:1;  // koennen die Inhalte verschoben werden?
    BOOL                bDataValid :    1;  //
    BOOL                bEdit:          1;  // kann diese Type bearbeitet werden ?
    BOOL                bDelete:        1;  // kann diese Type geloescht werden ?
protected:
        void            RemoveNewline(String&);
public:
        SwContentType(SwWrtShell* pParent, USHORT nType, BYTE nLevel );
        ~SwContentType();

        void                Init(BOOL* pbInvalidateWindow = 0);
        void                FillMemberList(BOOL* pbLevelChanged = NULL);
        USHORT              GetMemberCount() const
                                {return nMemberCount;};
        USHORT              GetType() const {return nContentType;}
        const SwContent*    GetMember(USHORT nIndex);
        const String&       GetName() {return sContentTypeName;}
        const String&       GetSingleName() const {return sSingleContentTypeName;}
        const String&       GetTypeToken() const{return sTypeToken;}

        void                SetOutlineLevel(BYTE nNew)
                            {
                                nOutlineLevel = nNew;
                                Invalidate();
                            }

        void                Invalidate(); // nur nMemberCount wird neu gelesen

        BOOL                IsEditable() const {return bEdit;}
        BOOL                IsDeletable() const {return bDelete;}
};

#endif

diff --git a/sw/source/ui/inc/conttree.hxx b/sw/source/ui/inc/conttree.hxx
new file mode 100644
index 0000000..1732d87
--- /dev/null
+++ b/sw/source/ui/inc/conttree.hxx
@@ -0,0 +1,332 @@
/*************************************************************************
 *
 *  $RCSfile: conttree.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:39 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _CONTTREE_HXX
#define _CONTTREE_HXX
#ifndef _SWCONT_HXX
#include "swcont.hxx"
#endif

#ifndef _SVTREEBOX_HXX //autogen
#include <svtools/svtreebx.hxx>
#endif

class SwWrtShell;
class SwContentArr;
class SwContentType;
class SwNavigationPI;
class SwFmtFld;
class SwTxtINetFmt;
class SwNavigationConfig;
class SwDocShell;
class SvDataObject;
class Menu;
class ToolBox;

#define EDIT_MODE_EDIT          0
#define EDIT_MODE_UPD_IDX       1
#define EDIT_MODE_RMV_IDX       2
#define EDIT_UNPROTECT_TABLE    3
#define EDIT_MODE_DELETE        4
#define EDIT_MODE_RENAME        5

//----------------------------------------------------------------------------
//----------------------------------------------------------------------------

class SwContentTree : public SvTreeListBox
{
    SwWrtShell*         pHiddenShell;   // gedropptes Doc
    SwWrtShell*         pActiveShell;   // die aktive oder eine konst. offene View
    SwNavigationConfig* pConfig;
    ImageList           aEntryImages;
    String              sSpace;
    AutoTimer           aUpdTimer;

    USHORT              nActiveBlock;
    USHORT              nHiddenBlock;
    USHORT              nRootType;
    USHORT              nLastSelType;
    USHORT              nDragMode; // wir fuer den StaticLink gebraucht
    BYTE                nOutlineLevel;

    BOOL                bIsActive           :1;
    BOOL                bIsConstant         :1;
    BOOL                bIsHidden           :1;
    BOOL                bDocChgdInDragging  :1;
    BOOL                bIsInternalDrag     :1;
    BOOL                bIsRoot             :1;
    BOOL                bIsIdleClear        :1;
    BOOL                bIsLastReadOnly     :1;
    BOOL                bIsOutlineMoveable  :1;
    BOOL                bViewHasChanged     :1;
    BOOL                bIsImageListInitialized : 1;

    static BOOL         bIsInDrag;

    SwContentType*      aActiveContentArr[CONTENT_TYPE_MAX];
    SwContentType*      aHiddenContentArr[CONTENT_TYPE_MAX];
    String              aContextStrings[CONTEXT_COUNT + 1];
    String              sRemoveIdx;
    String              sUpdateIdx;
    String              sUnprotTbl;
    String              sRename;
    String              sReadonlyIdx;
    String              sInvisible;

    void                FindActiveTypeAndRemoveUserData();

protected:
    virtual BOOL    Drop( const DropEvent& rEvt);
    virtual BOOL    QueryDrop( DropEvent& rEvt);
    virtual void    Command( const CommandEvent& rCEvt );
    virtual void    RequestHelp( const HelpEvent& rHEvt );
    virtual void    InitEntry(SvLBoxEntry*,const XubString&,const Image&,const Image&);

    SwNavigationPI* GetParentWindow(){return
                        (SwNavigationPI*)Window::GetParent();}

    void            StartExecuteDrag();
    BOOL            FillDragServer(USHORT& nDragMode);
    BOOL            HasContentChanged();

    virtual DragDropMode    NotifyBeginDrag( SvLBoxEntry* );

    virtual BOOL    NotifyMoving(   SvLBoxEntry*  pTarget,
                                    SvLBoxEntry*  pEntry,
                                    SvLBoxEntry*& rpNewParent,
                                    ULONG&        rNewChildPos
                                );
    virtual BOOL    NotifyCopying(  SvLBoxEntry*  pTarget,
                                    SvLBoxEntry*  pEntry,
                                    SvLBoxEntry*& rpNewParent,
                                    ULONG&        rNewChildPos
                                );
    virtual BOOL    NotifyQueryDrop( SvLBoxEntry* );
    virtual void    BeginDrag( const Point& );
    virtual void    EndDrag();
    virtual void    MouseButtonDown( const MouseEvent& rMEvt );

    void            EditEntry(SvLBoxEntry* pEntry, BYTE nMode = EDIT_MODE_EDIT);
    void            GotoContent(SwContent* pCnt);
    static void     SetInDrag(BOOL bSet) {bIsInDrag = bSet;}

    USHORT          GetDragMode() const {return nDragMode;}
    DECL_STATIC_LINK(SwContentTree, ExecDragHdl, SwContentTree*);

public:
    SwContentTree(Window* pParent, const ResId& rResId);
    ~SwContentTree();

    BOOL            ToggleToRoot();
    BOOL            IsRoot() const {return bIsRoot;}
    USHORT          GetRootType() const {return nRootType;}
    void            SetRootType(USHORT nType);
    void            Display( BOOL bActiveView );
    void            Clear();
    void            SetHiddenShell(SwWrtShell* pSh);
    void            ShowHiddenShell();
    void            ShowActualView();
    void            SetActiveShell(SwWrtShell* pSh);
    void            SetConstantShell(SwWrtShell* pSh);

    SwWrtShell*     GetWrtShell()
                        {return bIsActive||bIsConstant ?
                                    pActiveShell :
                                        pHiddenShell;}

    static BOOL     IsInDrag() {return bIsInDrag;}
    BOOL            IsInternalDrag() const {return bIsInternalDrag != 0;}

    USHORT          GetActiveBlock() const {return nActiveBlock;}

    BYTE            GetOutlineLevel()const {return nOutlineLevel;}
    void            SetOutlineLevel(BYTE nSet);
    BOOL            Expand( SvLBoxEntry* pParent );
    BOOL            Collapse( SvLBoxEntry* pParent );
    void            ExecCommand(USHORT nCmd, BOOL bModifier);
    void            Show();
    void            Hide();

    BOOL            IsConstantView() {return bIsConstant;}
    BOOL            IsActiveView()   {return bIsActive;}
    BOOL            IsHiddenView()   {return bIsHidden;}

    const SwWrtShell*   GetActiveWrtShell() {return pActiveShell;}
    SwWrtShell*         GetHiddenWrtShell() {return pHiddenShell;}

    DECL_LINK( ContentDoubleClickHdl, SwContentTree * );
    DECL_LINK( PopupHdl, Menu* );
    DECL_LINK( TimerUpdate, Timer * );

    virtual long    GetTabPos( SvLBoxEntry*, SvLBoxTab* );
    virtual void    RequestingChilds( SvLBoxEntry* pParent );
    virtual void    GetFocus();
    virtual void    KeyInput(const KeyEvent& rKEvt);
    virtual BOOL    Select( SvLBoxEntry* pEntry, BOOL bSelect=TRUE );
};


//----------------------------------------------------------------------------
// TreeListBox fuer Globaldokumente
//----------------------------------------------------------------------------

class SwGlblDocContents;
class SwGlblDocContent;

class SwLBoxString : public SvLBoxString
{
public:

    SwLBoxString( SvLBoxEntry* pEntry, USHORT nFlags,
        const String& rStr ) : SvLBoxString(pEntry,nFlags,rStr)
    {
    }

    virtual void Paint( const Point& rPos, SvLBox& rDev, USHORT nFlags,
        SvLBoxEntry* pEntry);
};

class SwGlobalTree : public SvTreeListBox
{
    AutoTimer           aUpdateTimer;
    String              aContextStrings[GLOBAL_CONTEXT_COUNT];

    ImageList           aEntryImages;

    SwWrtShell*         pActiveShell;   //
    SvLBoxEntry*        pEmphasisEntry; // Drag'n Drop-Emphasis
    SvLBoxEntry*        pDDSource;      // Quelle beim DnD
    SwGlblDocContents*  pSwGlblDocContents; // Array mit sortierten Inhalten

    BOOL                bIsInternalDrag     :1;
    BOOL                bLastEntryEmphasis  :1; // Drag'n Drop
    BOOL                bIsImageListInitialized : 1;

    static const SfxObjectShell* pShowShell;

    protected:
        virtual BOOL    Drop( const DropEvent& rEvt);
        virtual BOOL    QueryDrop( DropEvent& rEvt);
        virtual void    Command( const CommandEvent& rCEvt );
        virtual void    RequestHelp( const HelpEvent& rHEvt );

        virtual long    GetTabPos( SvLBoxEntry*, SvLBoxTab* );
        virtual DragDropMode   NotifyBeginDrag( SvLBoxEntry* );
        virtual BOOL    NotifyMoving(   SvLBoxEntry*  pTarget,
                                        SvLBoxEntry*  pEntry,
                                        SvLBoxEntry*& rpNewParent,
                                        ULONG&        rNewChildPos
                                    );
        virtual BOOL    NotifyCopying(  SvLBoxEntry*  pTarget,
                                        SvLBoxEntry*  pEntry,
                                        SvLBoxEntry*& rpNewParent,
                                        ULONG&        rNewChildPos
                                    );
        virtual BOOL    NotifyQueryDrop( SvLBoxEntry* );
        virtual void    BeginDrag( const Point& );
        virtual void    EndDrag();
        virtual void    MouseButtonDown( const MouseEvent& rMEvt );
        virtual void    KeyInput(const KeyEvent& rKEvt);
        virtual void    GetFocus();
        virtual void    SelectHdl();
        virtual void    DeselectHdl();
        virtual void InitEntry(SvLBoxEntry*,const XubString&,const Image&,const Image&);

        void            Clear();

        DECL_LINK(      PopupHdl, Menu* );
        DECL_LINK(      Timeout, Timer* );
        DECL_LINK(      DoubleClickHdl, SwGlobalTree * );

        BOOL            IsInternalDrag() const {return bIsInternalDrag != 0;}
        SwNavigationPI* GetParentWindow(){return
                            (SwNavigationPI*)Window::GetParent();}

        void            OpenDoc(const SwGlblDocContent*);
        void            GotoContent(const SwGlblDocContent*);
        USHORT          GetEnableFlags() const;

    static const SfxObjectShell*    GetShowShell() {return pShowShell;}
    static void         SetShowShell(const SfxObjectShell*pSet) {pShowShell = pSet;}
    DECL_STATIC_LINK(SwGlobalTree, ShowFrameHdl, SwGlobalTree*);

    public:
        SwGlobalTree(Window* pParent, const ResId& rResId);
        ~SwGlobalTree();

    void                TbxMenuHdl(USHORT nTbxId, ToolBox* pBox);
    void                InsertRegion(const SwGlblDocContent* pCont,
                                        const String* pFileName = 0 );
    void                EditContent(const SwGlblDocContent* pCont );
    void                Show();
    void                Hide();

    void                ExecCommand(USHORT nCmd);

    void                Display(BOOL bOnlyUpdateUserData = FALSE);
    BOOL                Update(BOOL bHard = FALSE);
};



#endif


diff --git a/sw/source/ui/inc/convert.hxx b/sw/source/ui/inc/convert.hxx
new file mode 100644
index 0000000..e73666a
--- /dev/null
+++ b/sw/source/ui/inc/convert.hxx
@@ -0,0 +1,120 @@
/*************************************************************************
 *
 *  $RCSfile: convert.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:39 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SW_CONVERT_HXX
#define _SW_CONVERT_HXX

#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif
#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif
#ifndef _SV_EDIT_HXX //autogen
#include <vcl/edit.hxx>
#endif
#ifndef _BASEDLGS_HXX //autogen
#include <sfx2/basedlgs.hxx>
#endif

class SwTableAutoFmt;
class SwView;
class SwWrtShell;

class SwConvertTableDlg: public SfxModalDialog
{
    RadioButton     aTabBtn;
    RadioButton     aSemiBtn;
    RadioButton     aParaBtn;
    RadioButton     aOtherBtn;
    Edit            aOtherEd;
    CheckBox        aKeepColumn;
    GroupBox        aDelimFrm;

    CheckBox        aHeaderCB;
    CheckBox        aRepeatHeaderCB;
    CheckBox        aDontSplitCB;
    CheckBox        aBorderCB;
    GroupBox        aOptionsGB;

    OKButton        aOkBtn;
    CancelButton    aCancelBtn;
    HelpButton      aHelpBtn;
    PushButton      aAutoFmtBtn;

    String          sConvertTextTable;
    SwTableAutoFmt* pTAutoFmt;
    SwWrtShell*     pShell;

    DECL_LINK( AutoFmtHdl, PushButton* );
    DECL_LINK( BtnHdl, Button* );
    DECL_LINK( CheckBoxHdl, CheckBox *pCB = 0 );

public:
    SwConvertTableDlg( SwView& rView );
    ~SwConvertTableDlg();

    void GetValues( char& rDelim,
                    USHORT& rInsTblFlags,
                    SwTableAutoFmt *& prTAFmt );
};


#endif
diff --git a/sw/source/ui/inc/cption.hxx b/sw/source/ui/inc/cption.hxx
new file mode 100644
index 0000000..2e411d0
--- /dev/null
+++ b/sw/source/ui/inc/cption.hxx
@@ -0,0 +1,176 @@
/*************************************************************************
 *
 *  $RCSfile: cption.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:39 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _CPTION_HXX
#define _CPTION_HXX

#ifndef _SVX_STDDLG_HXX //autogen
#include <svx/stddlg.hxx>
#endif

#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif

#ifndef _LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif

#ifndef _EDIT_HXX //autogen
#include <vcl/edit.hxx>
#endif

#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif

#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif
#ifndef _ACTCTRL_HXX //autogen
#include <actctrl.hxx>
#endif


#ifndef _COM_SUN_STAR_CONTAINER_XENUMERATIONACCESS_HPP_
#include <com/sun/star/container/XEnumerationAccess.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XHIERARCHICALNAMEACCESS_HPP_
#include <com/sun/star/container/XHierarchicalNameAccess.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XNAMEACCESS_HPP_
#include <com/sun/star/container/XNameAccess.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XCONTENTENUMERATIONACCESS_HPP_
#include <com/sun/star/container/XContentEnumerationAccess.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XENUMERATION_HPP_
#include <com/sun/star/container/XEnumeration.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XELEMENTACCESS_HPP_
#include <com/sun/star/container/XElementAccess.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XINDEXACCESS_HPP_
#include <com/sun/star/container/XIndexAccess.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XNAMED_HPP_
#include <com/sun/star/container/XNamed.hpp>
#endif

class SwFldMgr;
class SwView;

#include "swlbox.hxx"

class NoSpaceCombo : public SwComboBox
{
protected:
    virtual void KeyInput( const KeyEvent& );

public:
    NoSpaceCombo( Window* pParent, const ResId& rResId)
        : SwComboBox(pParent, rResId)
    {}
};

class SwCaptionDialog : public SvxStandardDialog
{
    FixedText    aSampleText;
    FixedText    aCategoryText;
    NoSpaceCombo aCategoryBox;
    FixedText    aFormatText;
    ListBox      aFormatBox;
    FixedText    aTextText;
    Edit         aTextEdit;
    FixedText    aPosText;
    ListBox      aPosBox;
    CheckBox     aCopyAttributesCB;
    FixedText    aObjectNameFT;
    NoSpaceEdit  aObjectNameED;
    GroupBox     aSettingsGroup;
    OKButton     aOKButton;
    CancelButton aCancelButton;
    HelpButton   aHelpButton;
    PushButton   aOptionButton;

    SwView       &rView;    //Suchen per aktive ::com::sun::star::sdbcx::View vermeiden.
    SwFldMgr     *pMgr;     //Ptr um das include zu sparen
    sal_uInt16       eType;

    String          sObjectName;
    ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >    xNameAccess;
    ::com::sun::star::uno::Reference< ::com::sun::star::container::XNamed >         xNamed;

    DECL_LINK( SelectHdl, ListBox * );
    DECL_LINK( ModifyHdl, Edit * );
    DECL_LINK( OptionHdl, Button * );

    virtual void Apply();

    void DrawSample();

public:
     SwCaptionDialog( Window *pParent, SwView &rV );
    ~SwCaptionDialog();
};

#endif


diff --git a/sw/source/ui/inc/dbinsdlg.hxx b/sw/source/ui/inc/dbinsdlg.hxx
new file mode 100644
index 0000000..54ff61b
--- /dev/null
+++ b/sw/source/ui/inc/dbinsdlg.hxx
@@ -0,0 +1,245 @@
/*************************************************************************
 *
 *  $RCSfile: dbinsdlg.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:39 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _DBINSDLG_HXX
#define _DBINSDLG_HXX


#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif
#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif
#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif
#ifndef _EDIT_HXX //autogen
#include <vcl/edit.hxx>
#endif
#ifndef _SV_LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif
#ifndef _SVEDIT_HXX //autogen
#include <svtools/svmedit.hxx>
#endif
#ifndef _BASEDLGS_HXX //autogen
#include <sfx2/basedlgs.hxx>
#endif
#ifndef _SVARRAY_HXX //autogen
#include <svtools/svarray.hxx>
#endif
#ifndef _SWNUMFMTLB_HXX //autogen
#include <numfmtlb.hxx>
#endif
#ifdef REPLACE_OFADBMGR
#ifndef _COM_SUN_STAR_UNO_REFERENCE_H_
#include <com/sun/star/uno/Reference.h>
#endif
namespace com{namespace sun{namespace star{namespace sdbcx{
    class XColumnsSupplier;
}}}}
#endif

class SwTableAutoFmt;
class SwView;
class SbaSelectionList;
class _DB_ColumnConfig;
class SfxItemSet;
class SwTableRep;
class _DB_Columns;

struct SwInsDBColumn
{
    String sColumn, sUsrNumFmt;
    ULONG nDBNumFmt, nUsrNumFmt;        // besser ist NumFormatStr  !!
    LanguageType eUsrNumFmtLng;
    USHORT nCol;
    BOOL bHasFmt : 1;
    BOOL bIsDBFmt : 1;

    SwInsDBColumn( const String& rStr, USHORT nColumn )
        : sColumn( rStr ), nCol( nColumn ), nDBNumFmt( 0 ), nUsrNumFmt( 0 ),
        bHasFmt(FALSE), bIsDBFmt(TRUE), eUsrNumFmtLng( LANGUAGE_SYSTEM )
    {}

    int operator==( const SwInsDBColumn& rCmp ) const
        { return sColumn == rCmp.sColumn; }
    int operator<( const SwInsDBColumn& rCmp ) const;
};

#ifdef REPLACE_OFADBMGR
struct SwInsDBData
{
    String sDataBaseName;
    String sDataTableName;
    String sStatement;
};
#endif
typedef SwInsDBColumn* SwInsDBColumnPtr;
SV_DECL_PTRARR_SORT_DEL( SwInsDBColumns, SwInsDBColumnPtr, 32, 32 )


class SwInsertDBColAutoPilot : public SfxModalDialog
{
    FixedText       aFtInsertData;
    RadioButton     aRbAsTable;
    RadioButton     aRbAsField;
    RadioButton     aRbAsText;

    GroupBox        aGbSelection;
    FixedText       aFtDbColumn;

    ListBox         aLbTblDbColumn;
    ListBox         aLbTxtDbColumn;

    GroupBox        aGbDbFormat;
    RadioButton     aRbDbFmtFromDb;
    RadioButton     aRbDbFmtFromUsr;
    NumFormatListBox aLbDbFmtFromUsr;

    /* ----- Page Text/Field ------- */
    PushButton      aPbDbcolToEdit;
    MultiLineEdit   aEdDbText;
    FixedText       aFtDbParaColl;
    ListBox         aLbDbParaColl;

    /* ----- Page Table ------------ */
    PushButton      aPbDbcolAllTo;
    PushButton      aPbDbcolOneTo;
    PushButton      aPbDbcolOneFrom;
    PushButton      aPbDbcolAllFrom;
    FixedText       aFtTableCol;
    ListBox         aLbTableCol;
    GroupBox        aGbTableHead;
    CheckBox        aCbTableHeadon;
    RadioButton     aRbHeadlColnms;
    RadioButton     aRbHeadlEmpty;
    PushButton      aPbTblFormat;
    PushButton      aPbTblAutofmt;

    OKButton        aBtOk;
    CancelButton    aBtCancel;
    HelpButton      aBtHelp;

    SwInsDBColumns  aDBColumns;
#ifdef REPLACE_OFADBMGR
    const SwInsDBData   aDBData;
#else

#endif //REPLACE_OFADBMGR

    Link            aOldNumFmtLnk;
    String          sNoTmpl;

    SwView*         pView;
    SwTableAutoFmt* pTAutoFmt;
    _DB_ColumnConfig* pConfig;

    SfxItemSet*     pTblSet;
    SwTableRep*     pRep;
    USHORT          nGBFmtLen;

    DECL_LINK( PageHdl, Button* );
    DECL_LINK( AutoFmtHdl, PushButton* );
    DECL_LINK( TblFmtHdl, PushButton* );
    DECL_LINK( DBFormatHdl, Button* );
    DECL_LINK( TblToFromHdl, Button* );
    DECL_LINK( SelectHdl, ListBox* );
    DECL_LINK( DblClickHdl, ListBox* );
    DECL_LINK( HeaderHdl, Button* );

    FASTBOOL SplitTextToColArr( const String& rTxt, _DB_Columns& rColArr, BOOL bInsField );

    // Daten ins INI-File schreiben
    void WriteUIToIni();
    // Daten aus dem INI-File lesen:
    void ReadIniToUI();
    // setze die Tabellen - Eigenschaften
    void SetTabSet();

public:
#ifdef REPLACE_OFADBMGR
    SwInsertDBColAutoPilot( SwView& rView,
        ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDataSource> rxSource,
        com::sun::star::uno::Reference<com::sun::star::sdbcx::XColumnsSupplier>,
        const SwInsDBData& rData  );
#else
    SwInsertDBColAutoPilot( SwView& rView );
#endif //REPLACE_OFADBMGR

    virtual ~SwInsertDBColAutoPilot();

#ifdef REPLACE_OFADBMGR
    void DataToDoc( const SbaSelectionList*,
        ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDataSource> rxSource,
        ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection> xConnection);
#else
    BOOL HasValidDB() const { return 0 != aDBColumns.Count(); }
    void DataToDoc( const SbaSelectionList* );
#endif //REPLACE_OFADBMGR

};




#endif
diff --git a/sw/source/ui/inc/dbtree.hxx b/sw/source/ui/inc/dbtree.hxx
new file mode 100644
index 0000000..b8439bd
--- /dev/null
+++ b/sw/source/ui/inc/dbtree.hxx
@@ -0,0 +1,121 @@
/*************************************************************************
 *
 *  $RCSfile: dbtree.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:39 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _DBTREE_HXX
#define _DBTREE_HXX

#ifndef _SVTREEBOX_HXX //autogen
#include <svtools/svtreebx.hxx>
#endif

#ifdef REPLACE_OFADBMGR
#ifndef _COM_SUN_STAR_UNO_REFERENCE_H_
#include <com/sun/star/uno/Reference.h>
#endif
namespace com{namespace sun{namespace star{namespace container{
    class XNameAccess;
}}}}
#endif

#include "swtypes.hxx"

class SwDBTreeList : public SvTreeListBox
{
    Bitmap          aRootOpened;
    Bitmap          aRootClosed;
    Image           aDBBMP;
    Image           aTableBMP;
    Image           aQueryBMP;

    String          sDefDBName;
    BOOL            bInitialized;
    BOOL            bShowColumns;

#ifdef REPLACE_OFADBMGR
    com::sun::star::uno::Reference<com::sun::star::container::XNameAccess> xDBContext;
#endif
    DECL_LINK( DBCompare, SvSortData* );

    void            InitTreeList();
    virtual void    RequestingChilds( SvLBoxEntry* pParent );

    virtual void    Command( const CommandEvent& rCEvt );
    virtual BOOL    QueryDrop( DropEvent& rEvt);

    void            StartExecuteDrag();

public:
     SwDBTreeList(Window* pParent, const ResId& rResId, const String& rDefDBName = aEmptyStr, const BOOL bShowCol = FALSE );
    ~SwDBTreeList();

#ifdef REPLACE_OFADBMGR
    String  GetDBName(String& rTableName, String& rColumnName, BOOL* pbIsTable = 0);
    void    Select(const String& rDBName, const String& rTableName, const String& rColumnName);
#else
    String  GetDBName() const;
    void    Select(const String& rDBName);      // Format: Datenbank.Tabelle
#endif

    void    Show();
    void    ShowColumns(BOOL bShowCol);
};

#endif

diff --git a/sw/source/ui/inc/dbui.hxx b/sw/source/ui/inc/dbui.hxx
new file mode 100644
index 0000000..ffb5571
--- /dev/null
+++ b/sw/source/ui/inc/dbui.hxx
@@ -0,0 +1,114 @@
/*************************************************************************
 *
 *  $RCSfile: dbui.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:39 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _DBUI_HXX
#define _DBUI_HXX

#ifndef _SVX_STDDLG_HXX //autogen
#include <svx/stddlg.hxx>
#endif

#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif

#ifndef _SV_FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif

#include "dbtree.hxx"
#include "swtypes.hxx"

class SwWrtShell;
class SbaObject;

class SwDBSelect : public SvxStandardDialog
{
    SwDBTreeList    aTree;

    OKButton        aOkBTN;
    CancelButton    aCancelBTN;
    HelpButton      aHelpBTN;

    DECL_LINK(TreeSelectHdl, SvTreeListBox* pBox);

    virtual void    Apply();

public:
     SwDBSelect(Window* pParent, SwWrtShell* pSh, const String& rDefDBName = aEmptyStr);
    ~SwDBSelect();

    String GetDBName() const;
};

class PrintMonitor: public ModelessDialog
{
public:
    FixedText       aDocName;
    FixedText       aPrinting;
    FixedText       aPrinter;
    FixedText       aPrintInfo;
    CancelButton    aCancel;

    PrintMonitor( Window *pParent, BOOL bEMail = FALSE );
};

#endif

diff --git a/sw/source/ui/inc/docfnote.hxx b/sw/source/ui/inc/docfnote.hxx
new file mode 100644
index 0000000..ff632ca
--- /dev/null
+++ b/sw/source/ui/inc/docfnote.hxx
@@ -0,0 +1,86 @@
/*************************************************************************
 *
 *  $RCSfile: docfnote.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:39 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _DOCFNOTE_HXX
#define _DOCFNOTE_HXX

#ifndef _SFXTABDLG_HXX //autogen
#include <sfx2/tabdlg.hxx>
#endif

class SwWrtShell;

class SwFootNoteOptionDlg :public SfxTabDialog
{
    SwWrtShell &rSh;
    Link aOldOkHdl;

    virtual void PageCreated( USHORT nId, SfxTabPage &rPage );

#ifdef __PRIVATE
    DECL_LINK( OkHdl, Button * );
#endif

public:
    SwFootNoteOptionDlg(Window *pParent, SwWrtShell &rSh );
    ~SwFootNoteOptionDlg();
};

#endif
diff --git a/sw/source/ui/inc/docstdlg.hxx b/sw/source/ui/inc/docstdlg.hxx
new file mode 100644
index 0000000..792d31b
--- /dev/null
+++ b/sw/source/ui/inc/docstdlg.hxx
@@ -0,0 +1,124 @@
/*************************************************************************
 *
 *  $RCSfile: docstdlg.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:39 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _DOCSTDLG_HXX
#define _DOCSTDLG_HXX

#ifndef _SFXTABDLG_HXX //autogen
#include <sfx2/tabdlg.hxx>
#endif

#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif

#ifndef _STDCTRL_HXX //autogen
#include <svtools/stdctrl.hxx>
#endif

#include "docstat.hxx"

/*--------------------------------------------------------------------
    Beschreibung:   DocInfo jetzt als Page
 --------------------------------------------------------------------*/

class SwDocStatPage: public SfxTabPage
{
public:
    SwDocStatPage(Window *pParent, const SfxItemSet &rSet);
    ~SwDocStatPage();

    static SfxTabPage *Create(Window *pParent, const SfxItemSet &rSet);

protected:
    virtual BOOL    FillItemSet(      SfxItemSet &rSet);
    virtual void    Reset      (const SfxItemSet &rSet);

    DECL_LINK( UpdateHdl, PushButton*);

private:
    FixedText       aTableLbl;
    FixedText       aGrfLbl;
    FixedText       aOLELbl;
    FixedText       aPageLbl;
    FixedText       aParaLbl;
    FixedText       aWordLbl;
    FixedText       aWordDelimFT;
    Edit            aWordDelim;
    FixedText       aCharLbl;
    FixedText       aLineLbl;

    FixedInfo       aTableNo;
    FixedInfo       aGrfNo;
    FixedInfo       aOLENo;
    FixedInfo       aPageNo;
    FixedInfo       aParaNo;
    FixedInfo       aWordNo;
    FixedInfo       aCharNo;
    FixedInfo       aLineNo;

    PushButton      aUpdatePB;
    SwDocStat       aDocStat;

    void            Update();
    void            SetData(const SwDocStat &rStat);
};

#endif
diff --git a/sw/source/ui/inc/drawbase.hxx b/sw/source/ui/inc/drawbase.hxx
new file mode 100644
index 0000000..f55dc84
--- /dev/null
+++ b/sw/source/ui/inc/drawbase.hxx
@@ -0,0 +1,117 @@
/*************************************************************************
 *
 *  $RCSfile: drawbase.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:39 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SW_DRAWBASE_HXX
#define _SW_DRAWBASE_HXX

#ifndef _GEN_HXX //autogen
#include <tools/gen.hxx>
#endif

class SwView;
class SwWrtShell;
class SwEditWin;
class KeyEvent;
class MouseEvent;

#define MIN_FREEHAND_DISTANCE   10

/*************************************************************************
|*
|* Basisklasse fuer alle Funktionen
|*
\************************************************************************/

class SwDrawBase
{
protected:
    SwView*         pView;
    SwWrtShell*     pSh;
    SwEditWin*      pWin;
    Point           aStartPos;              // Position von BeginCreate
    Point           aMDPos;                 // Position von MouseButtonDown
    BOOL            bCreateObj  :1;
    BOOL            bInsForm    :1;

public:
    SwDrawBase(SwWrtShell *pSh, SwEditWin* pWin, SwView* pView);
    virtual ~SwDrawBase();

    void         SetDrawPointer();
    void         EnterSelectMode(const MouseEvent& rMEvt);
    inline BOOL  IsInsertForm() const { return bInsForm; }
    inline BOOL  IsCreateObj() const { return bCreateObj; }

    // Mouse- & Key-Events; Returnwert=TRUE: Event wurde bearbeitet
    virtual BOOL KeyInput(const KeyEvent& rKEvt);
    virtual BOOL MouseMove(const MouseEvent& rMEvt);
    virtual BOOL MouseButtonUp(const MouseEvent& rMEvt);
    virtual BOOL MouseButtonDown(const MouseEvent& rMEvt);

    void         BreakCreate();

    virtual void Activate(const USHORT nSlotId);    // Function aktivieren
    virtual void Deactivate();                      // Function deaktivieren
};



#endif      // _SW_DRAWBASE_HXX

diff --git a/sw/source/ui/inc/drawsh.hxx b/sw/source/ui/inc/drawsh.hxx
new file mode 100644
index 0000000..e148bad
--- /dev/null
+++ b/sw/source/ui/inc/drawsh.hxx
@@ -0,0 +1,88 @@
/*************************************************************************
 *
 *  $RCSfile: drawsh.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:39 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _SWDRAWSH_HXX
#define _SWDRAWSH_HXX

#include "drwbassh.hxx"

class SdrObject;
class SwDrawBaseShell;

class SwDrawShell: public SwDrawBaseShell
{
public:
    SFX_DECL_INTERFACE(SW_DRAWSHELL);
    TYPEINFO();

                SwDrawShell(SwView &rView);

    void        Execute(SfxRequest &);
    void        GetState(SfxItemSet &);
    void        ExecDrawDlg(SfxRequest& rReq);
    void        ExecDrawAttrArgs(SfxRequest& rReq);
    void        GetDrawAttrState(SfxItemSet &rSet);

    void        ExecFormText(SfxRequest& rReq);
    void        GetFormTextState(SfxItemSet& rSet);
};

#endif
diff --git a/sw/source/ui/inc/drformsh.hxx b/sw/source/ui/inc/drformsh.hxx
new file mode 100644
index 0000000..475cb4a
--- /dev/null
+++ b/sw/source/ui/inc/drformsh.hxx
@@ -0,0 +1,83 @@
/*************************************************************************
 *
 *  $RCSfile: drformsh.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:39 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _SWDRWFORMSH_HXX
#define _SWDRWFORMSH_HXX

#include "drwbassh.hxx"

class SdrObject;
class SwDrawBaseShell;

class SwDrawFormShell: public SwDrawBaseShell
{
public:
    SFX_DECL_INTERFACE(SW_DRAWFORMSHELL);
    TYPEINFO();

                SwDrawFormShell(SwView &rView);
    virtual     ~SwDrawFormShell();

    void        Execute(SfxRequest &);
    void        GetState(SfxItemSet &);
};

#endif
diff --git a/sw/source/ui/inc/drpcps.hxx b/sw/source/ui/inc/drpcps.hxx
new file mode 100644
index 0000000..e239fbb
--- /dev/null
+++ b/sw/source/ui/inc/drpcps.hxx
@@ -0,0 +1,166 @@
/*************************************************************************
 *
 *  $RCSfile: drpcps.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:39 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _DRPCPS_HXX
#define _DRPCPS_HXX

#ifndef _BASEDLGS_HXX //autogen
#include <sfx2/basedlgs.hxx>
#endif

#ifndef _SFXTABDLG_HXX //autogen
#include <sfx2/tabdlg.hxx>
#endif

#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif

#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif

#ifndef _FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif

#ifndef _EDIT_HXX //autogen
#include <vcl/edit.hxx>
#endif

#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif

#ifndef _LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif

class SwWrtShell;

// class SwDropCapsDlg ******************************************************

class SwDropCapsDlg : public SfxSingleTabDialog
{

public:

     SwDropCapsDlg(Window *pParent, const SfxItemSet &rSet );
    ~SwDropCapsDlg();

};

class SwDropCapsPict;

// class SwDropCapsPage *****************************************************

class SwDropCapsPage : public SfxTabPage
{
friend class SwDropCapsPict;

    CheckBox        aDropCapsBox;
    CheckBox        aWholeWordCB;
    FixedText       aSwitchText;
    NumericField    aDropCapsField;
    FixedText       aLinesText;
    NumericField    aLinesField;
    FixedText       aDistanceText;
    MetricField     aDistanceField;
    GroupBox        aSettingsGroup;

    FixedText       aTextText;
    Edit            aTextEdit;
    FixedText       aTemplateText;
    ListBox         aTemplateBox;
    GroupBox        aContentBox;

    SwDropCapsPict  *pPict;
    GroupBox        aPictBox;

    BOOL            bModified;
    BOOL            bFormat;
    BOOL            bHtmlMode;

    SwWrtShell &rSh;

     SwDropCapsPage(Window *pParent, const SfxItemSet &rSet);
    ~SwDropCapsPage();

    virtual int     DeactivatePage(SfxItemSet *pSet);
    void    FillSet( SfxItemSet &rSet );

    DECL_LINK( ClickHdl, Button * );
    DECL_LINK( ModifyHdl, Edit * );
    DECL_LINK( SelectHdl, ListBox * );
    DECL_LINK( WholeWordHdl, CheckBox * );

public:

    static SfxTabPage *Create(Window *pParent, const SfxItemSet &rSet);
    static USHORT* GetRanges();

    virtual BOOL FillItemSet(      SfxItemSet &rSet);
    virtual void Reset      (const SfxItemSet &rSet);

    void    SetFormat(BOOL bSet){bFormat = bSet;}
};

#endif

diff --git a/sw/source/ui/inc/drwbassh.hxx b/sw/source/ui/inc/drwbassh.hxx
new file mode 100644
index 0000000..54d8343
--- /dev/null
+++ b/sw/source/ui/inc/drwbassh.hxx
@@ -0,0 +1,101 @@
/*************************************************************************
 *
 *  $RCSfile: drwbassh.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:39 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWDRWBASSH_HXX
#define _SWDRWBASSH_HXX

#include "basesh.hxx"

class SwWrtShell;
class SwView;
class SfxItemSet;
class SwDrawBase;

class SwDrawBaseShell: public SwBaseShell
{
    SwDrawBase* pDrawActual;

    UINT16      eDrawMode;
    BOOL        bRotate : 1;
    BOOL        bSelMove: 1;

public:
                SwDrawBaseShell(SwView &rShell);
    virtual     ~SwDrawBaseShell();

    SFX_DECL_INTERFACE(SW_DRAWBASESHELL);
    TYPEINFO();

    void        Execute(SfxRequest &);
    void        GetState(SfxItemSet &);
    void        DisableState(SfxItemSet &rSet)               { Disable(rSet);}
    BOOL        Disable(SfxItemSet& rSet, USHORT nWhich = 0);

    void        StateStatusline(SfxItemSet &rSet);

/*  SwDrawBase* GetDrawFuncPtr()                    { return (pDrawActual); }
    void        SetDrawFuncPtr(SwDrawBase* pFuncPtr);
    UINT16      GetDrawMode()                       { return (eDrawMode);   }
    void        SetDrawMode(UINT16 eDrwMode)        { eDrawMode = eDrwMode; }
*/
};


#endif
diff --git a/sw/source/ui/inc/drwtxtsh.hxx b/sw/source/ui/inc/drwtxtsh.hxx
new file mode 100644
index 0000000..0f9ba8e
--- /dev/null
+++ b/sw/source/ui/inc/drwtxtsh.hxx
@@ -0,0 +1,123 @@
/*************************************************************************
 *
 *  $RCSfile: drwtxtsh.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:39 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWDRWTXTSH_HXX
#define _SWDRWTXTSH_HXX


#ifndef _SFX_SHELL_HXX //autogen
#include <sfx2/shell.hxx>
#endif
#include "shellid.hxx"

class OutlinerView;
class SdrOutliner;
class SdrView;
class SwView;
class SfxModule;
class SwWrtShell;

class SwDrawTextShell: public SfxShell
{
    SwView      &rView;

    SdrView     *pSdrView;
    OutlinerView*pOLV;
    SdrOutliner *pOutliner;

    BOOL        bRotate : 1;
    BOOL        bSelMove: 1;

    void        SetAttrToMarked(const SfxItemSet& rAttr);
    void        InsertSymbol();
    BOOL        IsTextEdit();
public:
    SFX_DECL_INTERFACE(SW_DRWTXTSHELL);
    TYPEINFO();

    SwView     &GetView() { return rView; }
    SwWrtShell &GetShell();

                SwDrawTextShell(SwView &rView);
    virtual     ~SwDrawTextShell();

    void        StateDisableItems(SfxItemSet &);

    void        Execute(SfxRequest &);
    void        ExecDraw(SfxRequest &);
    void        GetState(SfxItemSet &);
    void        GetDrawTxtCtrlState(SfxItemSet&);

    void        ExecFontWork(SfxRequest& rReq);
    void        StateFontWork(SfxItemSet& rSet);
    void        ExecFormText(SfxRequest& rReq);
    void        GetFormTextState(SfxItemSet& rSet);
    void        ExecDrawLingu(SfxRequest &rReq);
    void        ExecUndo(SfxRequest &rReq);
    void        StateUndo(SfxItemSet &rSet);
    void        ExecClpbrd(SfxRequest &rReq);
    void        StateClpbrd(SfxItemSet &rSet);
    void        StateInsert(SfxItemSet &rSet);

    void        Init();
    void        StateStatusline(SfxItemSet &rSet);
};

#endif
diff --git a/sw/source/ui/inc/dselect.hxx b/sw/source/ui/inc/dselect.hxx
new file mode 100644
index 0000000..5fcb53b
--- /dev/null
+++ b/sw/source/ui/inc/dselect.hxx
@@ -0,0 +1,86 @@
/*************************************************************************
 *
 *  $RCSfile: dselect.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:39 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SW_DSELECT_HXX
#define _SW_DSELECT_HXX

#include "drawbase.hxx"

/*************************************************************************
|*
|* Rechteck zeichnen
|*
\************************************************************************/

class DrawSelection : public SwDrawBase
{
 public:
    DrawSelection(SwWrtShell* pSh, SwEditWin* pWin, SwView* pView);

                                       // Mouse- & Key-Events
    virtual BOOL KeyInput(const KeyEvent& rKEvt);

    virtual void Activate(const USHORT nSlotId);    // Function aktivieren
};



#endif      // _SW_DSELECT_HXX

diff --git a/sw/source/ui/inc/edtwin.hxx b/sw/source/ui/inc/edtwin.hxx
new file mode 100644
index 0000000..5f631cd
--- /dev/null
+++ b/sw/source/ui/inc/edtwin.hxx
@@ -0,0 +1,304 @@
/*************************************************************************
 *
 *  $RCSfile: edtwin.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:39 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _EDTWIN_HXX
#define _EDTWIN_HXX

#ifndef _LINK_HXX //autogen
#include <tools/link.hxx>
#endif
#ifndef _TIMER_HXX //autogen
#include <vcl/timer.hxx>
#endif
#ifndef _WINDOW_HXX //autogen
#include <vcl/window.hxx>
#endif
#ifndef _SOT_EXCHANGE_HXX //autogen
#include <sot/exchange.hxx>
#endif
#ifndef _SWEVENT_HXX
#include <swevent.hxx>
#endif

#define _SVSTDARR_STRINGSISORTDTOR
#include <svtools/svstdarr.hxx>

class   SwWrtShell;
class   SwView;
class   SwRect;
class   SwDrawBase;
class   ViewShell;
class   SwAnchorMarker;
class   SdrViewUserMarker;
class   SdrObject;
class   SwShadowCursor;
class   DataChangedEvent;

struct  SwApplyTemplate;
struct  QuickHelpData;

/*--------------------------------------------------------------------
    Beschreibung:   Eingabe-Fenster
 --------------------------------------------------------------------*/

class SwEditWin: public Window
{
friend void     ScrollMDI(ViewShell* pVwSh, const SwRect&,
                          USHORT nRangeX, USHORT nRangeY);
friend BOOL     IsScrollMDI(ViewShell* pVwSh, const SwRect&);

friend void     SizeNotify(ViewShell* pVwSh, const Size &);

friend void     PageNumNotify(  ViewShell* pVwSh,
                                USHORT nPhyNum,
                                USHORT nVirtNum,
                                const String& rPg );

    static  QuickHelpData* pQuickHlpData;

    static  BOOL    bReplaceQuote;
    static  long    nDDStartPosX, nDDStartPosY;

    static  Color   aTextColor;     //Textfarbe, fuer die Giesskanne
    static  BOOL    bTransparentBackColor; // Hintergrund transparent
    static  Color   aTextBackColor; //Texthintergrundfarbe, fuer die Giesskanne

    /*
     * Timer und Handler fuer das Weiterscrollen, wenn der
     * Mauspointer innerhalb eines Drag-Vorgangs ausserhalb des
     * EditWin stehen bleibt.  In regelmaessigen Intervallen wird
     * die Selektion in Richtung der Mausposition vergroessert.
     */
    AutoTimer       aTimer;
    // Timer fuer verschachtelte KeyInputs (z.B. fuer Tabellen)
    Timer           aKeyInputTimer;
    // timer for ANY-KeyInut question without a following KeyInputEvent
    Timer           aKeyInputFlushTimer;

    String          aInBuffer;
    Point           aStartPos;
    Point           aMovePos;
    Point           aRszMvHdlPt;
    Timer           aTemplateTimer;

    // Type/Objecte ueber dem der MousePointer steht
    SwCallMouseEvent aSaveCallEvent;

    SwApplyTemplate     *pApplyTempl;
    SwAnchorMarker      *pAnchorMarker; // zum Verschieben eines Ankers

    SdrViewUserMarker   *pUserMarker;
    SdrObject           *pUserMarkerObj;
    SwShadowCursor      *pShadCrsr;

    SwView         &rView;

    int             aActHitType;    // aktueller Mauspointer

    ULONG           nDropFormat;    //Format aus dem letzten QueryDrop
    USHORT          nDropAction;    //Action aus dem letzten QueryDrop
    USHORT          nDropDestination;   //Ziel aus dem letzten QueryDrop

    UINT16          eDrawMode;
    UINT16          eBezierMode;
    UINT16          nInsFrmColCount; //Spaltenzahl fuer interaktiven Rahmen
    BOOL            bLinkRemoved    : 1,
                    bMBPressed      : 1,
                    bInsDraw        : 1,
                    bInsFrm         : 1,
                    bGrfToOle       : 1, //Grf to Sim, fuer den Rueckweg.
                    bIsInMove       : 1,
                    bIsInDrag       : 1, //StartExecuteDrag nich doppelt ausfuehren
                    bOldIdle        : 1, //Zum abschalten des Idle'ns
                    bOldIdleSet     : 1, //waehrend QeueryDrop
                    bTblInsDelMode  : 1, //
                    bTblIsInsMode   : 1, //
                    bTblIsColMode   : 1, //
                    bChainMode      : 1, //Rahmen verbinden
                    bWasShdwCrsr    : 1, //ShadowCrsr war im MouseButtonDown an
                    bLockInput      : 1; //Lock waehrend die Rechenleiste aktiv ist


    void            LeaveArea(const Point &);
    void            JustifyAreaTimer();
    inline void     EnterArea();

    void            RstMBDownFlags();

    void            ChangeFly( BYTE nDir, BOOL bWeb = FALSE );

    BOOL            EnterDrawMode(const MouseEvent& rMEvt, const Point& aDocPos);
    BOOL            RulerClook( SwView& , const MouseEvent& rMEvt);

    //Hilfsfunktionen fuer D&D
    void            DropCleanup();
    void            CleanupDropUserMarker();


    /*
     * Handler fuer das Weiterscrollen, wenn der Mauspointer innerhalb eines
     * Drag-Vorgangs ausserhalb des EditWin stehen bleibt. In regelmaessigen
     * Intervallen wird die Selektion in Richtung der Mausposition
     * vergroessert.
     */
    DECL_LINK( TimerHandler, Timer * );
    void            StartDDTimer();
    void            StopDDTimer(SwWrtShell *, const Point &);
    DECL_LINK( DDHandler, Timer * );

    // timer for ANY-KeyInut question without a following KeyInputEvent
    DECL_LINK( KeyInputFlushHandler, Timer * );

    // Timer fuer verschachtelte KeyInputs (z.B. fuer Tabellen)
    DECL_LINK( KeyInputTimerHandler, Timer * );

    // Timer fuer das ApplyTemplates per Maus (verkapptes Drag&Drop)
    DECL_LINK( TemplateTimerHdl, Timer* );

protected:

    virtual void    DataChanged( const DataChangedEvent& );
    virtual void    Paint( const Rectangle& rRect );
    virtual void    KeyInput(const KeyEvent &rKEvt);

    virtual void    GetFocus();
    virtual void    LoseFocus();


    virtual void    MouseMove(const MouseEvent& rMEvt);
    virtual void    MouseButtonDown(const MouseEvent& rMEvt);
    virtual void    MouseButtonUp(const MouseEvent& rMEvt);
    virtual void    RequestHelp(const HelpEvent& rEvt);

    virtual void    Command( const CommandEvent& rCEvt );

    virtual BOOL    Drop(const DropEvent& rEvt);
    virtual BOOL    QueryDrop( DropEvent& rEvt);

public:


    void            OleToGrf();
    void            GrfToOle();

    void            UpdatePointer(const Point &, USHORT nButtons = 0);

    BOOL            IsDrawSelMode();
    BOOL            IsDrawAction()                  { return (bInsDraw); }
    void            SetDrawAction(BOOL bFlag)       { bInsDraw = bFlag; }
    inline UINT16   GetDrawMode(BOOL bBuf = FALSE) const { return eDrawMode; }
    inline void     SetDrawMode(UINT16 eDrwMode)    { eDrawMode = eDrwMode; }
    void            StdDrawMode(USHORT nSlotId);
    BOOL            IsFrmAction()                   { return (bInsFrm); }
    inline UINT16   GetBezierMode()                 { return eBezierMode; }
    void            SetBezierMode(UINT16 eBezMode)  { eBezierMode = eBezMode; }
    void            EnterDrawTextMode(const Point& aDocPos); // DrawTextEditMode einschalten
    void            InsFrm(USHORT nCols);
    void            StopInsFrm();
    UINT16          GetFrmColCount() const {return nInsFrmColCount;} //Spaltenzahl fuer interaktiven Rahmen


    void            SetChainMode( BOOL bOn );
    BOOL            IsChainMode() const             { return bChainMode; }

    void            FlushInBuffer( SwWrtShell *pSh );

    static  void    SetReplaceQuote(BOOL bOn = TRUE) { bReplaceQuote = bOn; }
    static  BOOL    IsReplaceQuote() { return bReplaceQuote; }

    void             SetApplyTemplate(const SwApplyTemplate &);
    SwApplyTemplate* GetApplyTemplate() const { return pApplyTempl; }

    void            StartExecuteDrag();
    USHORT          GetDropAction() const { return nDropAction; }
    ULONG           GetDropFormat() const { return nDropFormat; }

    Color           GetTextColor() { return aTextColor; }
    void            SetTextColor(const Color& rCol ) { aTextColor = rCol; }

    Color           GetTextBackColor()
                                            { return aTextBackColor; }
    void            SetTextBackColor(const Color& rCol )
                                            { aTextBackColor = rCol; }
    void            SetTextBackColorTransparent(BOOL bSet)
                                    { bTransparentBackColor = bSet; }
    BOOL            IsTextBackColorTransparent()
                                    { return bTransparentBackColor; }
    void            LockKeyInput(BOOL bSet){bLockInput = bSet;}

    const SwView &GetView() const { return rView; }
          SwView &GetView()       { return rView; }

    // Tipfenster loeschen
    static void ClearTip();

    static inline long GetDDStartPosX() { return nDDStartPosX; }
    static inline long GetDDStartPosY() { return nDDStartPosY; }

    static void _InitStaticData();
    static void _FinitStaticData();

    SwEditWin(Window *pParent, SwView &);
    virtual ~SwEditWin();
};


#endif

diff --git a/sw/source/ui/inc/envimg.hxx b/sw/source/ui/inc/envimg.hxx
new file mode 100644
index 0000000..e6f7ea7
--- /dev/null
+++ b/sw/source/ui/inc/envimg.hxx
@@ -0,0 +1,138 @@
/*************************************************************************
 *
 *  $RCSfile: envimg.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:39 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _ENVIMG_HXX
#define _ENVIMG_HXX

#ifndef _SFXPOOLITEM_HXX //autogen
#include <svtools/poolitem.hxx>
#endif

#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif

#ifndef _SFXCFGITEM_HXX //autogen
#include <sfx2/cfgitem.hxx>
#endif


// enum -----------------------------------------------------------------------

enum SwEnvAlign
{
    ENV_HOR_LEFT = 0,
    ENV_HOR_CNTR,
    ENV_HOR_RGHT,
    ENV_VER_LEFT,
    ENV_VER_CNTR,
    ENV_VER_RGHT
};

// class SwEnvItem ------------------------------------------------------------

class SwEnvItem : public SfxPoolItem
{
public:

    String     aAddrText;       // Text fuer Empfaenger
    BOOL       bSend;           // Absender?
    String     aSendText;       // Text fuer Absender
    long       lAddrFromLeft;   // Linker Abstand fuer Empfaenger (twips)
    long       lAddrFromTop;    // Oberer Abstand fuer Empfaenger (twips)
    long       lSendFromLeft;   // Linker Abstand fuer Absender   (twips)
    long       lSendFromTop;    // Oberer Abstand fuer Absender   (twips)
    long       lWidth;          // Breite des Umschlags           (twips)
    long       lHeight;         // Hoehe  des Umschlags           (twips)
    SwEnvAlign eAlign;          // Ausrichtung beim Einzug
    BOOL       bPrintFromAbove; // Von oben drucken?
    long       lShiftRight;     // Verschiebung nach rechts       (twips)
    long       lShiftDown;      // Verschiebung nach unten        (twips)
    String     aSlot;           // Druckerschacht

    SwEnvItem();
    SwEnvItem(const SwEnvItem& rItem);

    SwEnvItem& operator =(const SwEnvItem& rItem);

    virtual int operator ==(const SfxPoolItem& rItem) const;

    virtual SfxPoolItem*     Clone(SfxItemPool* = 0) const;
};

// class SwEnvCfgItem -------------------------------------------------------

class SwEnvCfgItem : public SfxConfigItem
{
protected:

    virtual int  Load (SvStream& rStrm);
    virtual BOOL Store(SvStream& rStrm);
    virtual void UseDefault();

public:
    SwEnvItem aEnvItem;
    SwEnvCfgItem();

    virtual String  GetName() const;
};

#endif

diff --git a/sw/source/ui/inc/envlop.hxx b/sw/source/ui/inc/envlop.hxx
new file mode 100644
index 0000000..e27815d
--- /dev/null
+++ b/sw/source/ui/inc/envlop.hxx
@@ -0,0 +1,181 @@
/*************************************************************************
 *
 *  $RCSfile: envlop.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:39 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _ENVLOP_HXX
#define _ENVLOP_HXX

#ifdef VCL
#ifndef _SV_MEDIT_HXX
#include <svtools/svmedit.hxx>
#endif
#endif

#ifndef _SFXTABDLG_HXX //autogen
#include <sfx2/tabdlg.hxx>
#endif

#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif

#ifndef _EDIT_HXX //autogen
#include <vcl/edit.hxx>
#endif

#ifndef _LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif

#ifndef _IMAGEBTN_HXX //autogen
#include <vcl/imagebtn.hxx>
#endif

#include "envimg.hxx"

#define GetFldVal(rField)         (rField).Denormalize((rField).GetValue(FUNIT_TWIP))
#define SetFldVal(rField, lValue) (rField).SetValue((rField).Normalize(lValue), FUNIT_TWIP)

class SwEnvPage;
class SwEnvFmtPage;
class SwWrtShell;
class Printer;

// class SwEnvPreview ---------------------------------------------------------

class SwEnvPreview : public Window
{
    void Paint(const Rectangle&);

public:

     SwEnvPreview(SfxTabPage* pParent, const ResId& rResID);
    ~SwEnvPreview();
};

// class SwEnvDlg -----------------------------------------------------------

class SwEnvDlg : public SfxTabDialog
{
friend class SwEnvPage;
friend class SwEnvFmtPage;
friend class SwEnvPrtPage;
friend class SwEnvPreview;

    String          sInsert;
    String          sChange;
    SwEnvItem       aEnvItem;
    SwWrtShell      *pSh;
    Printer         *pPrinter;
    SfxItemSet      *pAddresseeSet;
    SfxItemSet      *pSenderSet;

    virtual void    PageCreated( USHORT nId, SfxTabPage &rPage );
    virtual short   Ok();

public:
     SwEnvDlg(Window* pParent, const SfxItemSet& rSet, SwWrtShell* pWrtSh, Printer* pPrt, BOOL bInsert);
    ~SwEnvDlg();
};

// class SwEnvPage ----------------------------------------------------------

class SwEnvPage : public SfxTabPage
{
    FixedText     aAddrText;
    MultiLineEdit aAddrEdit;
    FixedText     aDatabaseFT;
    ListBox       aDatabaseLB;
    FixedText     aTableFT;
    ListBox       aTableLB;
    ImageButton   aInsertBT;
    FixedText     aDBFieldFT;
    ListBox       aDBFieldLB;
    CheckBox      aSenderBox;
    MultiLineEdit aSenderEdit;
    SwEnvPreview  aPreview;

    SwWrtShell*   pSh;
    String        sActDBName;

     SwEnvPage(Window* pParent, const SfxItemSet& rSet);
    ~SwEnvPage();

    DECL_LINK( DatabaseHdl, ListBox * );
    DECL_LINK( FieldHdl, Button * );
    DECL_LINK( SenderHdl, Button * );

    void InitDatabaseBox();

    SwEnvDlg* GetParent() {return (SwEnvDlg*) SfxTabPage::GetParent()->GetParent();}

public:

    static SfxTabPage* Create(Window* pParent, const SfxItemSet& rSet);

    virtual void ActivatePage(const SfxItemSet& rSet);
    virtual int  DeactivatePage(SfxItemSet* pSet = 0);
            void FillItem(SwEnvItem& rItem);
    virtual BOOL FillItemSet(SfxItemSet& rSet);
    virtual void Reset(const SfxItemSet& rSet);
};

#endif


diff --git a/sw/source/ui/inc/fldedt.hxx b/sw/source/ui/inc/fldedt.hxx
new file mode 100644
index 0000000..610635d
--- /dev/null
+++ b/sw/source/ui/inc/fldedt.hxx
@@ -0,0 +1,108 @@
/*************************************************************************
 *
 *  $RCSfile: fldedt.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:39 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FLDEDT_HXX
#define _FLDEDT_HXX

#ifndef _BASEDLGS_HXX //autogen
#include <sfx2/basedlgs.hxx>
#endif

#ifndef _SV_BUTTON_HXX //autogen
#include <vcl/imagebtn.hxx>
#endif

class Window;
class SfxItemSet;
class SwView;
class SwWrtShell;

/*--------------------------------------------------------------------
   Beschreibung:
 --------------------------------------------------------------------*/

class SwFldEditDlg : public SfxSingleTabDialog
{
    SwWrtShell* pSh;
    ImageButton aPrevBT;
    ImageButton aNextBT;
    PushButton  aAddressBT;

    DECL_LINK( AddressHdl, PushButton *pBt = 0 );
    DECL_LINK( NextPrevHdl, Button *pBt = 0 );

    void            Init();
    SfxTabPage*     CreatePage(USHORT nGroup);

public:

     SwFldEditDlg(SwView& rVw);
    ~SwFldEditDlg();

    DECL_LINK( OKHdl, Button * );

    virtual short   Execute();

    void            EnableInsert(BOOL bEnable);
    void            InsertHdl();
};


#endif
diff --git a/sw/source/ui/inc/fldmgr.hxx b/sw/source/ui/inc/fldmgr.hxx
new file mode 100644
index 0000000..31d043d
--- /dev/null
+++ b/sw/source/ui/inc/fldmgr.hxx
@@ -0,0 +1,273 @@
/*************************************************************************
 *
 *  $RCSfile: fldmgr.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:39 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FLDMGR_HXX
#define _FLDMGR_HXX

#ifndef _SVSTDARR_HXX
#define _SVSTDARR_STRINGSDTOR
#include <svtools/svstdarr.hxx>
#endif

#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif

#include "swtypes.hxx"

#ifdef REPLACE_OFADBMGR
#ifndef _COM_SUN_STAR_UNO_REFERENCE_H_
#include <com/sun/star/uno/Reference.h>
#endif
namespace com{namespace sun{namespace star{namespace container{
    class XNameAccess;
}}}}
#else
#endif

class SwWrtShell;
class SwField;
class SwFieldType;
class SwFmtRefMark;
class SbModule;
class SvxMacroItem;
class ListBox;
class SvNumberFormatter;

/*--------------------------------------------------------------------
    Beschreibung: Shell setzen auf der der SwFldMgr arbeitet
 --------------------------------------------------------------------*/

void SetFldMgrShell(SwWrtShell* pSh);

/*--------------------------------------------------------------------
    Beschreibung: Die Gruppen von Feldern
 --------------------------------------------------------------------*/

enum SwFldGroups
{
    GRP_DOC,
    GRP_FKT,
    GRP_REF,
    GRP_REG,
    GRP_DB,
    GRP_VAR
};

struct SwFldGroupRgn
{
    USHORT nStart;
    USHORT nEnd;
};

/*--------------------------------------------------------------------
    Beschreibung:  Der FeldManager handelt das Einfuegen von Felder
                    ueber Command-Strings
 --------------------------------------------------------------------*/

class SwFldMgr
{
private:
    SvStringsDtor   aSubLst;

    SwField*            pCurFld;
    SbModule*           pModule;
    const SvxMacroItem* pMacroItem;
    SwWrtShell*         pWrtShell; // darf auch NULL sein!
    String          aCurPar1;
    String          aCurPar2;
    String          sCurFrame;

    String          sMacroPath;

    ULONG           nCurFmt;
    BOOL            bEvalExp;

    USHORT          GetCurrLanguage() const;

#ifdef REPLACE_OFADBMGR
    com::sun::star::uno::Reference<com::sun::star::container::XNameAccess> xDBContext;

    com::sun::star::uno::Reference<com::sun::star::container::XNameAccess> GetDBContext();
#endif

public:
    SwFldMgr(SwWrtShell* pSh = 0);
    ~SwFldMgr();

    // Feld einfuegen ueber TypeId (TYP_ ...)
    BOOL            InsertFld(  USHORT nTypeId,
                                USHORT nSubType,
                                const String& rPar1,
                                const String& rPar2,
                                ULONG nFormatId,
                                SwWrtShell* pSh = NULL,
                                sal_Unicode cSeparator = ' ');

    BOOL            InsertURL(  const String& rName,
                                const String& rVal,
                                const String& rFrame,
                                const SvxMacroItem* pItem = 0);

    // Direkt das aktuelle Feld aendern
    void            UpdateCurFld(ULONG nFormat,
                                 const String& rPar1,
                                 const String& rPar2);

    inline const String& GetCurFldPar1() const;
    inline const String& GetCurFldPar2() const;
    inline const ULONG   GetCurFldFmt() const;

    // Ein Feld ermitteln
    SwField*        GetCurFld();

    // Zugriff  auf Feldtypen
    void            RemoveDBTypes();
    void            InsertFldType(SwFieldType& rType);

    BOOL            ChooseMacro(const String &rSelMacro = aEmptyStr);
    inline void     SetMacroPath(const String& rPath) { sMacroPath = rPath; }
    inline const String& GetMacroPath() const         { return (sMacroPath); }
    inline void     SetMacroModule(SbModule* pMod)    { pModule = pMod; }

    // Vorheriger Naechster gleichen Typ
    BOOL GoNextPrev( BOOL bNext = TRUE, SwFieldType* pTyp = 0 );
    BOOL GoNext( SwFieldType* pTyp = 0 )    { return GoNextPrev( TRUE, pTyp ); }
    BOOL GoPrev( SwFieldType* pTyp = 0 )    { return GoNextPrev( FALSE, pTyp ); }

    // Setzen von Werten aus Benutzerfeldern (BASIC)
    //
    BOOL            SetFieldValue(const String &rFieldName,
                                  const String &rValue);

    // Erfragen von Werten aus Datenbankfeldern (BASIC )
    String          GetDataBaseFieldValue(const String &rDBName, const String &rFieldName, SwWrtShell* pSh);
#ifdef REPLACE_OFADBMGR
    BOOL            IsDBNumeric(const String& rDBName, const String& rTblQryName,
                                        BOOL bIsTable, const String& rFldName);
#else
    BOOL            IsDBNumeric(const String& rDBName, USHORT nColumn);
    BOOL            IsDBNumeric(const String& rDBName, const String& rFldName);
#endif

    // RefMark mit Namen organisieren
    BOOL            CanInsertRefMark( const String& rStr );


    // Zugriff ueber ResId auf Feldtypen
    USHORT          GetFldTypeCount(USHORT nResId = USHRT_MAX) const;
    SwFieldType*    GetFldType(USHORT nResId, USHORT nId = 0) const;
    SwFieldType*    GetFldType(USHORT nResId, const String& rName) const;

    void            RemoveFldType(USHORT nResId, USHORT nId = 0);
    void            RemoveFldType(USHORT nResId, const String& rName);

    // Zugriff ueber TypeId aus dem Dialog
    // Ids fuer einen Bereich von Feldern
    const SwFldGroupRgn& GetGroupRange(BOOL bHtmlMode, USHORT nGrpId) const;
    USHORT          GetGroup(BOOL bHtmlMode, USHORT nTypeId, USHORT nSubType = 0) const;

    // TypeId des aktuellen Feldes
    USHORT          GetCurTypeId() const;
    // TypeId fuer einen konkrete Pos in der Liste
    USHORT          GetTypeId(USHORT nPos) const;
    // Name des Typen in der Liste der Felder
    const String&   GetTypeStr(USHORT nPos) const;

    // Pos in der Liste der Felder
    USHORT          GetPos(USHORT nTypeId) const;

    // Untertypen zu einem Typ
    SvStringsDtor&  GetSubTypes(USHORT nId);

    BOOL            SetUserSubType(const String& rName, USHORT nSubType);

    // Formate zu einem Typ
    USHORT          GetFormatCount(USHORT nTypeId, BOOL bIsText, BOOL bHtmlMode = FALSE) const;
    String          GetFormatStr(USHORT nTypeId, ULONG nFormatId) const;
    USHORT          GetFormatId(USHORT nTypeId, ULONG nFormatId) const;
    ULONG           GetDefaultFormat(USHORT nTypeId, BOOL bIsText, SvNumberFormatter* pFormatter, double* pVal = 0L);

    // Evaluierung der ExpressionFelder ausschalten fuer das Einfuegen
    // vieler Expressionfelder (siehe Etiketten)
    //
    inline void     SetEvalExpFlds(BOOL bEval);
    void            EvalExpFlds(SwWrtShell* pSh = NULL);

    // public, damit sie im fldini initialisiert werden koennen.
    static String   *pDate, *pTime;

};

inline void SwFldMgr::SetEvalExpFlds(BOOL bEval)
    { bEvalExp = bEval; }

inline const String& SwFldMgr::GetCurFldPar1() const
    { return aCurPar1; }

inline const String& SwFldMgr::GetCurFldPar2() const
    { return aCurPar2; }

inline const ULONG   SwFldMgr::GetCurFldFmt() const
    { return nCurFmt; }


#endif

diff --git a/sw/source/ui/inc/fldwrap.hxx b/sw/source/ui/inc/fldwrap.hxx
new file mode 100644
index 0000000..4784d04
--- /dev/null
+++ b/sw/source/ui/inc/fldwrap.hxx
@@ -0,0 +1,80 @@
/*************************************************************************
 *
 *  $RCSfile: fldwrap.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:39 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FLDWRAP_HXX
#define _FLDWRAP_HXX

#include "chldwrap.hxx"

class SwFldDlgWrapper : public SwChildWinWrapper
{
public:
    SwFldDlgWrapper( Window* pParent, USHORT nId,
                        SfxBindings* pBindings, SfxChildWinInfo* pInfo );

    SFX_DECL_CHILDWINDOW(SwFldDlgWrapper);

    virtual BOOL    ReInitDlg(SwDocShell *pDocSh);
    void            ShowPage(USHORT nPage = 0);
};


#endif

diff --git a/sw/source/ui/inc/fontcfg.hxx b/sw/source/ui/inc/fontcfg.hxx
new file mode 100644
index 0000000..5e83b60
--- /dev/null
+++ b/sw/source/ui/inc/fontcfg.hxx
@@ -0,0 +1,154 @@
/*************************************************************************
 *
 *  $RCSfile: fontcfg.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:40 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FONTCFG_HXX
#define _FONTCFG_HXX

#ifndef _UTL_CONFIGITEM_HXX_
#include <unotools/configitem.hxx>
#endif
#ifndef _STRING_HXX
#include <tools/string.hxx>
#endif

#define FONT_STANDARD   0
#define FONT_OUTLINE    1
#define FONT_LIST       2
#define FONT_CAPTION    3
#define FONT_INDEX      4

class SwStdFontConfig : public utl::ConfigItem
{
    String      sFontStandard;
    String      sFontOutline ;
    String      sFontList    ;
    String      sFontCaption ;
    String      sFontIndex   ;

    com::sun::star::uno::Sequence<rtl::OUString>    GetPropertyNames();

public:
    SwStdFontConfig();
    ~SwStdFontConfig();

    virtual void    Commit();

    const String&   GetFontStandard() const {return sFontStandard   ;}
    const String&   GetFontOutline()  const {return sFontOutline ;}
    const String&   GetFontList   ()  const {return sFontList ;}
    const String&   GetFontCaption()  const {return sFontCaption ;}
    const String&   GetFontIndex  ()  const {return sFontIndex  ;}

    BOOL            IsFontDefault(USHORT nFontType) const;

    inline void     SetFontStandard(const String& rSet);
    inline void     SetFontOutline(const String& rSet);
    inline void     SetFontList   (const String& rSet);
    inline void     SetFontCaption(const String& rSet);
    inline void     SetFontIndex  (const String& rSet);

    static String   GetDefaultFor(USHORT nFontType);
};

inline void SwStdFontConfig::SetFontStandard   (const String& rSet)
{
    if( sFontStandard != rSet)
    {
        SetModified();
        sFontStandard = rSet;
    }
}
inline void SwStdFontConfig::SetFontOutline(const String& rSet)
{
    if( sFontOutline != rSet)
    {
        SetModified();
        sFontOutline  = rSet;
    }
}
inline void SwStdFontConfig::SetFontList      (const String& rSet)
{
    if(sFontList != rSet)
    {
        SetModified();
        sFontList = rSet;
    }
}

inline void SwStdFontConfig::SetFontCaption(const String& rSet)
{
    if(sFontCaption != rSet)
    {
        SetModified();
        sFontCaption  = rSet;
    }
}

inline void SwStdFontConfig::SetFontIndex  (const String& rSet)
{
    if(sFontIndex != rSet)
    {
        SetModified();
        sFontIndex = rSet;
    }
}
#endif


diff --git a/sw/source/ui/inc/formedt.hxx b/sw/source/ui/inc/formedt.hxx
new file mode 100644
index 0000000..cccfb99
--- /dev/null
+++ b/sw/source/ui/inc/formedt.hxx
@@ -0,0 +1,148 @@
/*************************************************************************
 *
 *  $RCSfile: formedt.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:40 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FORMEDT_HXX
#define _FORMEDT_HXX

#ifndef _SVX_STDDLG_HXX //autogen
#include <svx/stddlg.hxx>
#endif

#ifndef _LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif

#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif

#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif

#ifndef _EDIT_HXX //autogen
#include <vcl/edit.hxx>
#endif

#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif

#include "toxe.hxx"

class SwWrtShell;
class SwForm;

/*--------------------------------------------------------------------
     Beschreibung:  Markierung fuer Verzeichniseintrag einfuegen
 --------------------------------------------------------------------*/

class SwIdxFormDlg : public SvxStandardDialog
{
    DECL_LINK( EntryHdl, Button * );
    DECL_LINK( PageHdl, Button * );
    DECL_LINK( TabHdl, Button * );
    DECL_LINK( JumpHdl, Button * );
    DECL_LINK( StdHdl, Button * );
    DECL_LINK( SelectHdl, ListBox * );
    DECL_LINK( EnableSelectHdl, ListBox * );
    DECL_LINK( DoubleClickHdl, Button * );
    DECL_LINK( ModifyHdl, Edit * );
    DECL_LINK( AssignHdl, Button * );
    void            UpdatePattern();
    void            Apply();

    ListBox         aEntryLB;
    OKButton        aOKBtn;
    CancelButton    aCancelBT;
    FixedText       aLevelFT;
    Edit            aEntryED;
    PushButton      aEntryBT;
    PushButton      aTabBT;
    PushButton      aPageBT;
    PushButton      aJumpBT;
    GroupBox        aEntryGB;
    FixedText       aLevelFT2;
    ListBox         aLevelLB;
    FixedText       aTemplateFT;
    ListBox         aParaLayLB;
    PushButton      aStdBT;
    PushButton      aAssignBT;
    GroupBox        aFormatGB;

    SwWrtShell     &rSh;
    SwForm         *pForm;
    USHORT          nAktLevel;
    BOOL            bLastLinkIsEnd;

public:
    SwIdxFormDlg( Window* pParent, SwWrtShell &rShell, const SwForm& rForm );
    ~SwIdxFormDlg();

    static BOOL     IsNoNum(SwWrtShell& rSh, const String& rName);
    const SwForm&   GetTOXForm();
};

inline const SwForm& SwIdxFormDlg::GetTOXForm()
{
    return *pForm;
}

#endif
diff --git a/sw/source/ui/inc/frmdlg.hxx b/sw/source/ui/inc/frmdlg.hxx
new file mode 100644
index 0000000..aa12e64
--- /dev/null
+++ b/sw/source/ui/inc/frmdlg.hxx
@@ -0,0 +1,102 @@
/*************************************************************************
 *
 *  $RCSfile: frmdlg.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:40 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _FRMDLG_HXX
#define _FRMDLG_HXX

#include "globals.hrc"

#ifndef _SFXTABDLG_HXX //autogen
#include <sfx2/tabdlg.hxx>
#endif
class SwWrtShell;

/*--------------------------------------------------------------------
   Beschreibung:    Rahmendialog
 --------------------------------------------------------------------*/

class SwFrmDlg : public SfxTabDialog
{
    BOOL                bFormat;
    BOOL                bNew;
    const SfxItemSet&   rSet;
    USHORT              nDlgType;
    SwWrtShell*         pWrtShell;


    virtual void PageCreated( USHORT nId, SfxTabPage &rPage );

public:
    SwFrmDlg(   SfxViewFrame *pFrame, Window *pParent,
                const SfxItemSet& rCoreSet,
                BOOL            bNewFrm  = TRUE,
                USHORT          nResType = DLG_FRM_STD,
                BOOL            bFmt     = FALSE,
                UINT16          nDefPage = 0,
                const String*   pFmtStr  = 0);

    ~SwFrmDlg();

    inline SwWrtShell*  GetWrtShell()   { return pWrtShell; }
};


#endif // _FRMDLG_HXX
diff --git a/sw/source/ui/inc/frmmgr.hxx b/sw/source/ui/inc/frmmgr.hxx
new file mode 100644
index 0000000..f74092c
--- /dev/null
+++ b/sw/source/ui/inc/frmmgr.hxx
@@ -0,0 +1,283 @@
/*************************************************************************
 *
 *  $RCSfile: frmmgr.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:40 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _FRMMGR_HXX
#define _FRMMGR_HXX

#include "swtypes.hxx"
#include "frmatr.hxx"

#ifndef _SVX_SVXENUM_HXX //autogen
#include <svx/svxenum.hxx>
#endif
#ifndef _GEN_HXX //autogen
#include <tools/gen.hxx>
#endif
#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _FMTSRND_HXX //autogen
#include <fmtsrnd.hxx>
#endif
#ifndef _FMTORNT_HXX //autogen
#include <fmtornt.hxx>
#endif
#ifndef _FMTANCHR_HXX //autogen
#include <fmtanchr.hxx>
#endif

class   SwWrtShell;
struct  SwFrmValid;

class   SwFmt;
class   SwFmtCol;

const SwTwips   DFLT_WIDTH      = MM50 * 4;
const SwTwips   DFLT_HEIGHT     = MM50;

#define FULL_ATTRSET    0xffff

#define FRMMGR_TYPE_NONE    0x00
#define FRMMGR_TYPE_TEXT    0x01
#define FRMMGR_TYPE_GRF     0x02
#define FRMMGR_TYPE_OLE     0x04
#define FRMMGR_TYPE_LABEL   0x08
#define FRMMGR_TYPE_ENVELP  0x10

class SwFlyFrmAttrMgr
{
    SfxItemSet  aSet;
    Point       aAbsPos;
    SwWrtShell  *pOwnSh;

    BOOL        bAbsPos,
                bNewFrm;

    // interne Verrechnung fuer Umrandung
    SwTwips             CalcTopSpace();
    SwTwips             CalcBottomSpace();
    SwTwips             CalcLeftSpace();
    SwTwips             CalcRightSpace();

    void _UpdateFlyFrm();   //Nacharbeit nach Einfuegen oder Update

public:
    SwFlyFrmAttrMgr( BOOL bNew, SwWrtShell* pSh, BYTE nType );

    //CopyCtor fuer die Dialoge, zum Pruefen der Metrics
    SwFlyFrmAttrMgr( BOOL bNew, SwWrtShell *pSh, const SfxItemSet &rSet );

    inline SwWrtShell*  GetShell() { return pOwnSh; }

    void                SetAnchor(RndStdIds eId);
    inline RndStdIds    GetAnchor()  const;

    void                SetHorzOrientation(SwHoriOrient eOrient);
    void                SetVertOrientation(SvxFrameVertOrient eOrient);

    // Absolute Position
    void                SetAbsPos(const Point& rLPoint);

    // Relative Position vom Anker
    void                SetPos(const Point& rLPoint);
    inline Point        GetPos() const;

    // Groesse
    void                SetSize(const Size& rLSize);
    inline const Size&  GetSize() const;
    void                SetFrmSize(const SwFmtFrmSize& rFrmSize);

    inline USHORT       GetHeightPercent() const;

    void                SetSizeType(SwFrmSize eType);

    // Abstand zum Inhalt
    void                SetLRSpace( long nLeft  = LONG_MAX,
                                    long nRight = LONG_MAX );
    void                SetULSpace( long nTop   = LONG_MAX,
                                    long nBottom= LONG_MAX );

    void                SetWrapType(SwSurround eSurround);

    void                SetAnchorOnly(BOOL bSet);
    void                SetContour( BOOL bSet);
    void                SetTransparent(BOOL bTrans);

    void                ProtectPosSize(BOOL bProt);

    void                SetCol( const SwFmtCol &rCol);

    // Attribute aendern und erfragen
    void                UpdateAttrMgr();
    void                UpdateFlyFrm();

    // neuen Rahmen erzeugen
    BOOL                InsertFlyFrm();
    void                InsertFlyFrm(RndStdIds      eAnchorType,
                                   const Point    &rPos,
                                   const Size     &rSize,
                                   BOOL           bAbsPos = FALSE);

    // Metriken pruefen und  aendern
    void                ValidateMetrics(SwFrmValid& rVal, BOOL bOnlyPercentRefValue = FALSE);

    void                DelAttr(USHORT nId);

    // Set rausreichen
    inline const SfxItemSet &GetAttrSet() const { return aSet; }
    inline       SfxItemSet &GetAttrSet()       { return aSet; }
    void                     SetAttrSet(const SfxItemSet& rSet);

    inline const SwFmtVertOrient &GetVertOrient() const;
    inline const SwFmtHoriOrient &GetHoriOrient() const;
    inline const SvxShadowItem   &GetShadow() const;
    inline const SvxBoxItem      &GetBox() const;
    inline const SwFmtSurround   &GetSurround() const;
    inline const SwFmtFrmSize    &GetFrmSize() const;

    long CalcWidthSpace();
    long CalcHeightSpace();

    long CalcWidthBorder()  { return CalcLeftSpace()+CalcRightSpace(); }
    long CalcHeightBorder() { return CalcTopSpace()+CalcBottomSpace(); }
};

/*--------------------------------------------------------------------
    Beschreibung: Validierung von Metriken
 --------------------------------------------------------------------*/

struct SwFrmValid
{
    RndStdIds           eArea;
    SwHoriOrient        eHori;
    SvxFrameVertOrient  eVert;
    SwRelationOrient    eHRel;
    SwRelationOrient    eVRel;
    BOOL                bAuto;
    BOOL                bMirror;

    SwTwips nHPos;
    SwTwips nMaxHPos;
    SwTwips nMinHPos;

    SwTwips nVPos;
    SwTwips nMaxVPos;
    SwTwips nMinVPos;

    SwTwips nWidth;
    SwTwips nMinWidth;
    SwTwips nMaxWidth;

    SwTwips nHeight;
    SwTwips nMinHeight;
    SwTwips nMaxHeight;

    Size    aPercentSize;   // Size fuer 100%-Wert

    SwFrmValid();
};


inline const Size& SwFlyFrmAttrMgr::GetSize() const
{
    return ((SwFmtFrmSize&)aSet.Get(RES_FRM_SIZE)).GetSize();
}

inline const SwFmtVertOrient &SwFlyFrmAttrMgr::GetVertOrient() const
{
    return ((SwFmtVertOrient&)aSet.Get(RES_VERT_ORIENT));
}
inline const SwFmtHoriOrient &SwFlyFrmAttrMgr::GetHoriOrient() const
{
    return ((SwFmtHoriOrient &)aSet.Get(RES_HORI_ORIENT));
}
inline const SwFmtFrmSize& SwFlyFrmAttrMgr::GetFrmSize() const
{
    return ((SwFmtFrmSize&)aSet.Get(RES_FRM_SIZE));
}
inline const SvxShadowItem &SwFlyFrmAttrMgr::GetShadow() const
{
    return ((SvxShadowItem&)aSet.Get(RES_SHADOW));
}
inline const SvxBoxItem &SwFlyFrmAttrMgr::GetBox() const
{
    return ((SvxBoxItem&)aSet.Get(RES_BOX));
}
inline const SwFmtSurround &SwFlyFrmAttrMgr::GetSurround() const
{
    return ((SwFmtSurround&)aSet.Get(RES_SURROUND));
}

inline Point SwFlyFrmAttrMgr::GetPos() const
{
    return Point( GetHoriOrient().GetPos(), GetVertOrient().GetPos() );
}

inline RndStdIds SwFlyFrmAttrMgr::GetAnchor()  const
{
    return ((SwFmtAnchor&)aSet.Get(RES_ANCHOR)).GetAnchorId();
}

inline USHORT SwFlyFrmAttrMgr::GetHeightPercent() const
{
    return GetFrmSize().GetHeightPercent();
}

#endif
diff --git a/sw/source/ui/inc/frmpage.hxx b/sw/source/ui/inc/frmpage.hxx
new file mode 100644
index 0000000..abb10de
--- /dev/null
+++ b/sw/source/ui/inc/frmpage.hxx
@@ -0,0 +1,337 @@
/*************************************************************************
 *
 *  $RCSfile: frmpage.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:40 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _FRMPAGE_HXX
#define _FRMPAGE_HXX

#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif
#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif
#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif
#ifndef _LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif
#ifndef _FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif
#ifndef _SFXTABDLG_HXX //autogen
#include <sfx2/tabdlg.hxx>
#endif

#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _BMPWIN_HXX
#include <bmpwin.hxx>
#endif
#ifndef _FRMEX_HXX
#include <frmex.hxx>
#endif
#ifndef _PRCNTFLD_HXX
#include <prcntfld.hxx>
#endif

class SvxImportGraphicDialog;
class SwWrtShell;
struct FrmMap;


/*--------------------------------------------------------------------
     Beschreibung:  Rahmendialog
 --------------------------------------------------------------------*/

class SwFrmPage: public SfxTabPage
{
    // Size
    FixedText       aWidthFT;
    PercentField    aWidthED;
    CheckBox        aRelWidthCB;
    FixedText       aHeightFT;
    PercentField    aHeightED;
    CheckBox        aRelHeightCB;
    CheckBox        aFixedRatioCB;
    CheckBox        aAutoHeightCB;
    GroupBox        aSizeGB;
    BOOL            bWidthLastChanged;

    // Anker
    RadioButton     aAnchorTypeRB;
    RadioButton     aAnchorAsCharRB;
    ListBox         aAnchorTypeLB;
    GroupBox        aTypeGB;

    // Position
    FixedText       aHorizontalFT;
    ListBox         aHorizontalDLB;
    FixedText       aAtHorzPosFT;
    MetricField     aAtHorzPosED;
    FixedText       aHoriRelationFT;
    ListBox         aHoriRelationLB;
    CheckBox        aMirrorPagesCB;
    FixedText       aVerticalFT;
    ListBox         aVerticalDLB;
    FixedText       aAtVertPosFT;
    MetricField     aAtVertPosED;
    FixedText       aVertRelationFT;
    ListBox         aVertRelationLB;
    GroupBox        aPositionGB;
    BOOL            bAtHorzPosModified;
    BOOL            bAtVertPosModified;

    PushButton      aRealSizeBT;

    // Example
    SwFrmPagePreview    aExampleWN;

    BOOL            bFormat;
    BOOL            bNew;
    BOOL            bHtmlMode;
    BOOL            bNoModifyHdl;
    USHORT          nHtmlMode;
    USHORT          nDlgType;
    Size            aGrfSize;
    Size            aWrap;
    SwTwips         nUpperBorder;
    SwTwips         nLowerBorder;

    // Die alten Ausrichtungen
    USHORT          nOldH;
    USHORT          nOldHRel;
    USHORT          nOldV;
    USHORT          nOldVRel;

    virtual void    ActivatePage(const SfxItemSet& rSet);
    virtual int     DeactivatePage(SfxItemSet *pSet);


    DECL_LINK( RangeModifyHdl, Edit * );
    DECL_LINK( TypHdl, ListBox *pLB = 0 );
    DECL_LINK( PosHdl, ListBox * );
    DECL_LINK( RelHdl, ListBox * );
    void            InitPos(USHORT nId, USHORT nH, USHORT nHRel,
                            USHORT nV,  USHORT nVRel,
                            long   nX,  long   nY);

    DECL_LINK( EditModifyHdl, Edit * );
    DECL_LINK( AspectRatioCheckHdl, CheckBox * );
    DECL_LINK( RealSizeHdl, Button * );
    DECL_LINK( RelSizeClickHdl, CheckBox * );
    DECL_LINK( MirrorHdl, CheckBox * );

    DECL_LINK( ManualHdl, Button * );

    // Beispiel aktualisieren
    void            UpdateExample();
    DECL_LINK( ModifyHdl, Edit * );

    void            Init(const SfxItemSet& rSet, BOOL bReset = FALSE);
    USHORT          FillPosLB(FrmMap *pMap, USHORT nAlign, ListBox &rLB);
    ULONG           FillRelLB(FrmMap *pMap, USHORT nLBSelPos, USHORT nAlign, USHORT nRel, ListBox &rLB);
    USHORT          GetMapPos(FrmMap *pMap, ListBox &rAlignLB);
    USHORT          GetAlignment(FrmMap *pMap, USHORT nMapPos, ListBox &rAlignLB, ListBox &rRelationLB);
    USHORT          GetRelation(FrmMap *pMap, ListBox &rRelationLB);
    USHORT          GetAnchor();

    SwFrmPage(Window *pParent, const SfxItemSet &rSet);
    ~SwFrmPage();

public:
    static SfxTabPage *Create(Window *pParent, const SfxItemSet &rSet);
    static USHORT* GetRanges();

    virtual BOOL FillItemSet(SfxItemSet &rSet);
    virtual void Reset(const SfxItemSet &rSet);

    void            SetNewFrame(BOOL bNewFrame) { bNew      = bNewFrame; }
    void            SetFormatUsed(BOOL bFmt)    { bFormat   = bFmt;      }
    void            SetFrmType(USHORT nType)    { nDlgType  = nType;     }
};

class SwGrfExtPage: public SfxTabPage
{
    BmpWindow       aBmpWin;

    GroupBox        aConnectGB;
    FixedText       aConnectFT;
    Edit            aConnectED;
    PushButton      aBrowseBT;

    // Spiegeln
    GroupBox        aMirrorFrm;
    CheckBox        aMirrorHorzBox;
    CheckBox        aMirrorVertBox;
//  ListBox         aMirrorPagesLB;
    RadioButton     aAllPagesRB;
    RadioButton     aLeftPagesRB;
    RadioButton     aRightPagesRB;
//  FixedText       aMirrorPagesFT;

    String          aFilterName;
    String          aGrfName, aNewGrfName;

    SvxImportGraphicDialog*     pGrfDlg;

    BOOL            bHtmlMode;

    // Handler fuer Spiegeln
    DECL_LINK( MirrorHdl, CheckBox * );
    DECL_LINK( BrowseHdl, Button * );

    virtual void    ActivatePage(const SfxItemSet& rSet);
    SwGrfExtPage(Window *pParent, const SfxItemSet &rSet);
    ~SwGrfExtPage();

public:
    static SfxTabPage *Create(Window *pParent, const SfxItemSet &rSet);

    virtual BOOL FillItemSet(SfxItemSet &rSet);
    virtual void Reset(const SfxItemSet &rSet);
    virtual int  DeactivatePage(SfxItemSet *pSet);
};


class SwFrmURLPage : public SfxTabPage
{
    //Hyperlink
    GroupBox        aHyperLinkGB;
    FixedText       aURLFT;
    Edit            aURLED;
    FixedText       aNameFT;
    Edit            aNameED;
    FixedText       aFrameFT;
    ComboBox        aFrameCB;
    PushButton      aSearchPB;

    //Image map
    GroupBox        aImageGB;
    CheckBox        aServerCB;
    CheckBox        aClientCB;

    DECL_LINK( InsertFileHdl, PushButton * );


    SwFrmURLPage(Window *pParent, const SfxItemSet &rSet);
    ~SwFrmURLPage();
public:
    static SfxTabPage *Create(Window *pParent, const SfxItemSet &rSet);

    virtual BOOL FillItemSet(SfxItemSet &rSet);
    virtual void Reset(const SfxItemSet &rSet);
};

/*-----------------13.11.96 12.59-------------------

--------------------------------------------------*/

class SwFrmAddPage : public SfxTabPage
{
    FixedText   aNameFT;
    Edit        aNameED;
    FixedText   aAltNameFT;
    Edit        aAltNameED;
    FixedText   aPrevFT;
    Edit        aPrevED;
    FixedText   aNextFT;
    Edit        aNextED;
    GroupBox    aNamesGB;

    CheckBox    aProtectContentCB;
    CheckBox    aProtectFrameCB;
    CheckBox    aProtectSizeCB;
    GroupBox    aProtectGB;

    CheckBox    aEditInReadonlyCB;
    CheckBox    aPrintFrameCB;
    GroupBox    aExtGB;

    SwWrtShell* pWrtSh;

    USHORT      nDlgType;
    BOOL        bHtmlMode;
    BOOL        bFormat;
    BOOL        bNew;

    DECL_LINK(EditModifyHdl, Edit*);

    SwFrmAddPage(Window *pParent, const SfxItemSet &rSet);
    ~SwFrmAddPage();

public:

    static SfxTabPage*  Create(Window *pParent, const SfxItemSet &rSet);
    static USHORT*      GetRanges();

    virtual BOOL FillItemSet(SfxItemSet &rSet);
    virtual void Reset(const SfxItemSet &rSet);

    void            SetFormatUsed(BOOL bFmt) { bFormat  = bFmt;  }
    void            SetFrmType(USHORT nType) { nDlgType = nType; }
    void            SetNewFrame(BOOL bNewFrame) { bNew  = bNewFrame; }
    void            SetShell(SwWrtShell* pSh) { pWrtSh  = pSh; }

};

#endif // _FRMPAGE_HXX
diff --git a/sw/source/ui/inc/frmsh.hxx b/sw/source/ui/inc/frmsh.hxx
new file mode 100644
index 0000000..6172f3d
--- /dev/null
+++ b/sw/source/ui/inc/frmsh.hxx
@@ -0,0 +1,86 @@
/*************************************************************************
 *
 *  $RCSfile: frmsh.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:40 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWFRMSH_HXX
#define _SWFRMSH_HXX

#include "basesh.hxx"

class SwFrameShell: public SwBaseShell
{

public:
    SFX_DECL_INTERFACE(SW_FRAMESHELL);

            SwFrameShell(SwView &rView);

    void    Execute(SfxRequest &);
    void    GetState(SfxItemSet &);
    void    ExecFrameStyle(SfxRequest& rReq);
    void    GetLineStyleState(SfxItemSet &rSet);
    void    StateInsert(SfxItemSet &rSet);

    void    StateStatusline(SfxItemSet &rSet);

    void    GetBckColState(SfxItemSet &rSet);
    void    ExecBckCol(SfxRequest& rReq);
};

#endif
diff --git a/sw/source/ui/inc/frmui.hrc b/sw/source/ui/inc/frmui.hrc
new file mode 100644
index 0000000..677d767
--- /dev/null
+++ b/sw/source/ui/inc/frmui.hrc
@@ -0,0 +1,176 @@
/*************************************************************************
 *
 *  $RCSfile: frmui.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:40 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _FRMUI_HRC
#define _FRMUI_HRC

#include "rcid.hrc"
#include "globals.hrc"

#define DLG_FRMOPT              (RC_FRMDLG_BEGIN +  1)
#define DLG_PATTERN             (RC_FRMDLG_BEGIN +  2)
#define DLG_BORDER              (RC_FRMDLG_BEGIN +  3)
#define DLG_COLUMN              (RC_FRMDLG_BEGIN +  4)
#define DLG_FOOTNOTE            (RC_FRMDLG_BEGIN +  5)
#define DLG_INSERT_FOOTNOTE     (RC_FRMDLG_BEGIN +  6)

#define DLG_VIEW_HEADER         (RC_FRMDLG_BEGIN +  8)
#define DLG_FORMAT_COLUMN       (RC_FRMDLG_BEGIN + 10)
#define DLG_CAPTION             (RC_FRMDLG_BEGIN + 11)
#define DLG_SEQUENCE_OPTION     (RC_FRMDLG_BEGIN + 12)

#define TP_FOOTNOTEOPTION       (RC_FRMDLG_BEGIN + 12)
#define TP_ENDNOTEOPTION        (RC_FRMDLG_BEGIN + 13)

#define STR_PATTERN_BRD         (RC_FRMDLG_BEGIN + 13)
#define STR_SHPATTERN           (RC_FRMDLG_BEGIN + 14)
#define STR_LNPATTERN           (RC_FRMDLG_BEGIN + 15)
#define STR_FRMUI_BORDER        (RC_FRMDLG_BEGIN + 16)
#define STR_FRMUI_PATTERN       (RC_FRMDLG_BEGIN + 17)
#define STR_FRMUI_WRAP          (RC_FRMDLG_BEGIN + 18)

#define BMP_PORTRAIT            (RC_FRMDLG_BEGIN + 16)
#define BMP_LANDSCAPE           (RC_FRMDLG_BEGIN + 17)
#define BMP_BEGIN               (RC_FRMDLG_BEGIN + 18)
#define BMP_WRAP                (BMP_BEGIN)
#define BMP_LEFT                (BMP_BEGIN+1)
#define BMP_RIGHT               (BMP_BEGIN+2)
#define BMP_OPAQUE              (BMP_BEGIN+3)
#define BMP_OPAQUET             (BMP_BEGIN+4)
#define BMP_NOWRAP              (BMP_BEGIN+5)

#define BMP_END                 (BMP_NOWRAP)

#define MN_OPTION               (BMP_END + 1)
#define MN_COLUMN               (BMP_END + 2)
#define MN_PAPERSZ              (BMP_END + 3)
#define MN_BACKGROUND           (BMP_END + 4)
#define MN_FRAME                (BMP_END + 5)
#define STR_BACKGROUND          (BMP_END + 6)
#define MN_FOOTNOTE             (BMP_END + 7)

#define STR_FRMDLG_BEGIN        (MN_FOOTNOTE + 1)

#define STR_TOPPRT              (STR_FRMDLG_BEGIN + 1)
#define STR_FROMBOTTOM          (STR_FRMDLG_BEGIN + 2)
#define STR_FROMTOP             (STR_FRMDLG_BEGIN + 3)
#define STR_BELOW               (STR_FRMDLG_BEGIN + 4)

#define STR_LEFT                (STR_FRMDLG_BEGIN + 5)
#define STR_RIGHT               (STR_FRMDLG_BEGIN + 6)
#define STR_FROMLEFT            (STR_FRMDLG_BEGIN + 7)
#define STR_MIR_LEFT            (STR_FRMDLG_BEGIN + 8)
#define STR_MIR_RIGHT           (STR_FRMDLG_BEGIN + 9)
#define STR_MIR_FROMLEFT        (STR_FRMDLG_BEGIN + 10)

#define STR_BORDER              (STR_FRMDLG_BEGIN + 16)
#define STR_COLUMN              (STR_FRMDLG_BEGIN + 17)
#define STR_PARA                (STR_FRMDLG_BEGIN + 18)
#define STR_CHAR                (STR_FRMDLG_BEGIN + 19)

#define STR_FRAME               (STR_FRMDLG_BEGIN + 20)
#define STR_PRTAREA             (STR_FRMDLG_BEGIN + 21)
#define STR_REL_PG_LEFT         (STR_FRMDLG_BEGIN + 22)
#define STR_REL_PG_RIGHT        (STR_FRMDLG_BEGIN + 23)
#define STR_REL_FRM_LEFT        (STR_FRMDLG_BEGIN + 24)
#define STR_REL_FRM_RIGHT       (STR_FRMDLG_BEGIN + 25)
#define STR_MIR_REL_PG_LEFT     (STR_FRMDLG_BEGIN + 26)
#define STR_MIR_REL_PG_RIGHT    (STR_FRMDLG_BEGIN + 27)
#define STR_MIR_REL_FRM_LEFT    (STR_FRMDLG_BEGIN + 28)
#define STR_MIR_REL_FRM_RIGHT   (STR_FRMDLG_BEGIN + 29)
#define STR_REL_PG_FRAME        (STR_FRMDLG_BEGIN + 30)
#define STR_REL_PG_PRTAREA      (STR_FRMDLG_BEGIN + 31)
#define STR_REL_BASE            (STR_FRMDLG_BEGIN + 32)
#define STR_REL_CHAR            (STR_FRMDLG_BEGIN + 33)
#define STR_REL_ROW             (STR_FRMDLG_BEGIN + 34)
#define STR_REL_BORDER          (STR_FRMDLG_BEGIN + 35)
#define STR_REL_PRTAREA         (STR_FRMDLG_BEGIN + 36)
#define STR_FLY_REL_PG_LEFT     (STR_FRMDLG_BEGIN + 37)
#define STR_FLY_REL_PG_RIGHT    (STR_FRMDLG_BEGIN + 38)
#define STR_FLY_REL_PG_FRAME    (STR_FRMDLG_BEGIN + 39)
#define STR_FLY_REL_PG_PRTAREA  (STR_FRMDLG_BEGIN + 40)
#define STR_FLY_MIR_REL_PG_LEFT     (STR_FRMDLG_BEGIN + 41)
#define STR_FLY_MIR_REL_PG_RIGHT    (STR_FRMDLG_BEGIN + 42)
#define STR_FLY_MIR_REL_PG_FRAME    (STR_FRMDLG_BEGIN + 43)
#define STR_FLY_MIR_REL_PG_PRTAREA  (STR_FRMDLG_BEGIN + 44)

#define STR_OLE_INSERT          (STR_FRMDLG_BEGIN + 45)
#define STR_OLE_EDIT            (STR_FRMDLG_BEGIN + 46)
#define STR_COLL_HEADER         (STR_FRMDLG_BEGIN + 47)

#define MSG_COLUMN_ERR_BOUNDWIDTH  (STR_FRMDLG_BEGIN + 48)
#define STR_EDIT_GRF            (STR_FRMDLG_BEGIN + 49)

#define STR_LINE_TOP            (STR_FRMDLG_BEGIN + 50)
#define STR_LINE_BOTTOM         (STR_FRMDLG_BEGIN + 51)
#define STR_LINE_CENTER         (STR_FRMDLG_BEGIN + 52)
#define STR_CHAR_TOP            (STR_FRMDLG_BEGIN + 53)
#define STR_CHAR_BOTTOM         (STR_FRMDLG_BEGIN + 54)
#define STR_CHAR_CENTER         (STR_FRMDLG_BEGIN + 55)

#define FRMDLG_ACT_END          STR_CHAR_CENTER

#if FRMDLG_ACT_END > RC_FRMDLG_END
#error Resource-Id Ueberlauf in #file, #line
#endif


#endif // FRMUI_HRC
diff --git a/sw/source/ui/inc/globals.h b/sw/source/ui/inc/globals.h
new file mode 100644
index 0000000..a555a87
--- /dev/null
+++ b/sw/source/ui/inc/globals.h
@@ -0,0 +1,83 @@
/*************************************************************************
 *
 *  $RCSfile: globals.h,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:40 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _GLOBALS_H
#define _GLOBALS_H

enum SwChangeState
{
    STATE_OFF = 0,
    STATE_ON = 1,
    STATE_TOGGLE = 2
};

/*-------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.2  2000/09/18 16:05:42  willem.vandorp
    OpenOffice header added.

    Revision 1.1  1994/09/20 12:07:48  MS
    Initial revision.


      Rev 1.0   20 Sep 1994 14:07:48   MS
   Initial revision.
 -------------------------------------------------------------------------*/
#endif
diff --git a/sw/source/ui/inc/globdoc.hrc b/sw/source/ui/inc/globdoc.hrc
new file mode 100644
index 0000000..ad8e21b
--- /dev/null
+++ b/sw/source/ui/inc/globdoc.hrc
@@ -0,0 +1,80 @@
/*************************************************************************
 *
 *  $RCSfile: globdoc.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:40 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _GLOBDOC_HRC
#define _GLOBDOC_HRC

#include "rcid.hrc"

#define STR_HUMAN_SWGLOBDOC_NAME                (RC_GLOBDOC_BEGIN + 2)
#define STR_WRITER_GLOBALDOC_FULLTYPE_40        (RC_GLOBDOC_BEGIN + 3)
#define STR_WRITER_GLOBALDOC_FULLTYPE           (RC_GLOBDOC_BEGIN + 4)

// ------------------------------------------------------------------------

#define GLOBDOC_ACT_END             STR_WRITER_GLOBALDOC_FULLTYPE


#if GLOBDOC_ACT_END > RC_GLOBDOC_END
#error Resource-Id Ueberlauf in #file, #line
#endif

#endif
diff --git a/sw/source/ui/inc/glosbib.hxx b/sw/source/ui/inc/glosbib.hxx
new file mode 100644
index 0000000..1c8f112
--- /dev/null
+++ b/sw/source/ui/inc/glosbib.hxx
@@ -0,0 +1,163 @@
/*************************************************************************
 *
 *  $RCSfile: glosbib.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:40 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _GLOSBIB_HXX
#define _GLOSBIB_HXX

#ifndef _EDIT_HXX //autogen
#include <vcl/edit.hxx>
#endif

#ifndef _SVX_STDDLG_HXX //autogen
#include <svx/stddlg.hxx>
#endif

#ifndef _LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif

#ifndef _SVTABBX_HXX //autogen
#include <svtools/svtabbx.hxx>
#endif

#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif

#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif

class SwGlossaryHdl;
class SvStrings;

class FEdit : public Edit
{
    public:
        FEdit(Window * pParent, const ResId& rResId) :
            Edit(pParent, rResId){}

    virtual void KeyInput( const KeyEvent& rKEvent );
};
/* -----------------------------08.02.00 15:04--------------------------------

 ---------------------------------------------------------------------------*/
struct GlosBibUserData
{
    String sPath;
    String sGroupName;
    String sGroupTitle;
};
class SwGlossaryGroupTLB : public SvTabListBox
{
public:
    SwGlossaryGroupTLB(Window* pParent, const ResId& rResId) :
        SvTabListBox(pParent, rResId) {}

    virtual void    RequestHelp( const HelpEvent& rHEvt );
    void            Clear();
};

class SwGlossaryGroupDlg : public SvxStandardDialog
{

    FEdit               aNameED;
    ListBox             aPathLB;
    SwGlossaryGroupTLB  aGroupTLB;

    OKButton        aOkPB;
    CancelButton    aCancelPB;
    HelpButton      aHelpPB;
    PushButton      aNewPB;
    PushButton      aDelPB;
    PushButton      aRenamePB;
    GroupBox        aBibGB;

    SvStrings*      pRemovedArr;
    SvStrings*      pInsertedArr;
    SvStrings*      pRenamedArr;

    SwGlossaryHdl   *pGlosHdl;

    String          sCreatedGroup;

    BOOL            IsDeleteAllowed(const String &rGroup);

protected:
    virtual void Apply();
    DECL_LINK( SelectHdl, SvTabListBox* );
    DECL_LINK( NewHdl, Button* );
    DECL_LINK( DeleteHdl, Button*  );
    DECL_LINK( ModifyHdl, Edit* );
    DECL_LINK( RenameHdl, Button*  );

public:
    SwGlossaryGroupDlg(Window * pParent,
                        const SvStrings* pPathArr,
                        SwGlossaryHdl *pGlosHdl);
    ~SwGlossaryGroupDlg();

    const String&       GetCreatedGroupName() const {return sCreatedGroup;}
};


#endif

diff --git a/sw/source/ui/inc/glosdoc.hxx b/sw/source/ui/inc/glosdoc.hxx
new file mode 100644
index 0000000..9eb9ab7
--- /dev/null
+++ b/sw/source/ui/inc/glosdoc.hxx
@@ -0,0 +1,132 @@
/*************************************************************************
 *
 *  $RCSfile: glosdoc.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:40 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _GLOSDOC_HXX
#define _GLOSDOC_HXX


#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif

#ifndef _SVARRAY_HXX //autogen
#include <svtools/svarray.hxx>
#endif
#ifndef _COM_SUN_STAR_TEXT_XAUTOTEXTGROUP_HPP_
#include <com/sun/star/text/XAutoTextGroup.hpp>
#endif

class SwTextBlocks;
class SvStrings;

typedef com::sun::star::uno::Reference<com::sun::star::text::XAutoTextGroup>* XAutoTextGroupPtr;
SV_DECL_PTRARR_DEL(XAutoTextGroupPtrArr, XAutoTextGroupPtr, 4, 4)

typedef com::sun::star::uno::Reference<com::sun::star::uno::XInterface>* XInterfacePtr;
SV_DECL_PTRARR_DEL(XAutoTextEntryPtrArr, XInterfacePtr, 4, 4)

#define GLOS_DELIM (sal_Unicode)'*'

// CLASS -----------------------------------------------------------------
class SwGlossaries
{
    XAutoTextGroupPtrArr    aGlosGroupArr;
    XAutoTextEntryPtrArr    aGlosEntryArr;
    String                  aPath;
    String                  sOldErrPath;
    String                  sErrPath;
    SvStrings               *pPathArr;
    SvStrings               *pGlosArr;
    BOOL                    bError;

    SwTextBlocks*   GetGlosDoc(const String &rName, BOOL bCreate = TRUE) const;
    SvStrings       *GetNameList();
public:
    SwGlossaries();
    ~SwGlossaries();

    XAutoTextGroupPtrArr&   GetUnoGroupArray()  { return aGlosGroupArr; }
    XAutoTextEntryPtrArr&   GetUnoEntryArray()  { return aGlosEntryArr; }

    USHORT                  GetGroupCnt();
    String                  GetGroupName(USHORT );
    String                  GetGroupTitle( const String& rGroupName );

    BOOL            FindGroupName(String & rGroup);

    SwTextBlocks*   GetGroupDoc(const String &rName,
                                BOOL bCreate = FALSE) const;
    SwTextBlocks*   GetDefGroupDoc() const {return GetGroupDoc(GetDefName());}
    void            PutGroupDoc(SwTextBlocks *pBlock);
    static String   GetDefName();
    static String   GetExtension();

    BOOL            NewGroupDoc(String &rGroupName, const String& rTitle);
    BOOL            RenameGroupDoc(const String& sOldGroup, String& sNewGroup, const String& rNewTitle);
    BOOL            DelGroupDoc(const String &);
    void            EditGroupDoc(const String &rGrpName, const String& rShortName );
    void            SaveGroupDoc(const String &rGrpName, const String& rLongName );
    void            UpdateGlosPath(BOOL bFull);
    void            ShowError();
    inline ULONG    IsGlosPathErr() { return bError; }
    const SvStrings*    GetPathArray() const {return pPathArr;}
};

#endif // _GLOSDOC_HXX
diff --git a/sw/source/ui/inc/gloshdl.hxx b/sw/source/ui/inc/gloshdl.hxx
new file mode 100644
index 0000000..c2e9c5c
--- /dev/null
+++ b/sw/source/ui/inc/gloshdl.hxx
@@ -0,0 +1,150 @@
/*************************************************************************
 *
 *  $RCSfile: gloshdl.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:40 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _GLOSHDL_HXX
#define _GLOSHDL_HXX


#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif
class SwWrtShell;
class SwTextBlocks;
class SvxMacro;
class SwGlossaries;
class SfxViewFrame;

// CLASS -----------------------------------------------------------------
class SwGlossaryHdl
{

    SwGlossaries&   rStatGlossaries;
    String          aCurGrp;
    SfxViewFrame*   pViewFrame;
    SwWrtShell*     pWrtShell;
    SwTextBlocks*   pCurGrp;

    void    _SetMacros(const String &rName,
                       const SvxMacro *pStart,
                       const SvxMacro *pEnd);

    BOOL    Expand( const String& rShortName,
                    SwGlossaries* pGlossaries,
                    SwTextBlocks *pGlossary,
                    BOOL bApi = FALSE );
public:
    void    GlossaryDlg();

    USHORT  GetGroupCnt() const;
    String  GetGroupName( USHORT, String* pTitle = 0 );
    BOOL    NewGroup(String & rGroupName, const String& rTitle);
    BOOL    DelGroup(const String &);
    BOOL    RenameGroup(const String & rOld, String& rNew, const String& rNewTitle);
    void    SetCurGroup(const String &aGrp, BOOL bApi = FALSE, BOOL bAlwaysCreateNew = FALSE);

    const String &GetCurGroup() const { return aCurGrp; }

    USHORT  GetGlossaryCnt();
    USHORT  GetGlossaryCnt(const String& rGrpName); //fuer Basic
    String  GetGlossaryName(USHORT);
    String  GetGlossaryName(USHORT, const String& rGrpName); //fuer Basic
    String  GetGlossaryShortName(const String &rName);
    String  GetGlossaryShortName(USHORT);

    BOOL    Rename( const String& rOldShortName,  const String& rNewShortName,
                        const String& rNewName);
    BOOL    CopyOrMove( const String& rSourceGroupName,  String& rSourceShortName,
                        const String& rDestGroupName, const String& rLongName, BOOL bMove );
    BOOL    HasShortName(const String &rShortName) const;
    //wird NewGlossary vom Basic gerufen, dann soll dir zuvor eingestellte
    //Gruppe ggf. neu erstellt werden
    BOOL    NewGlossary(const String &rName, const String &rShortName,
                BOOL bApiCall = FALSE, BOOL bNoAttr = FALSE );
    BOOL    DelGlossary(const String&);
    BOOL    CopyToClipboard(SwWrtShell& rSh, const String& rShortName);

    BOOL    ExpandGlossary(BOOL bUseStandard = TRUE, BOOL bApi = FALSE);
    BOOL    ExpandGlossary( const String& rShortName, BOOL bApi = FALSE );
    BOOL    InsertGlossary(const String &rName);

    void    SetMacros(const String& rName,
                      const SvxMacro* pStart,
                      const SvxMacro* pEnd,
                      SwTextBlocks *pGlossary = 0 );
    void    GetMacros(const String& rShortName,
                      SvxMacro& rStart,
                      SvxMacro& rEnd,
                      SwTextBlocks* pGlossary = 0 );

    BOOL    IsReadOnly( const String* = 0 ) const;
    BOOL    IsOld() const;

    BOOL    FindGroupName(String & rGroup); // Gruppe ohne Pfadindex finden

    BOOL    ImportGlossaries( const String& rName );

    String  GetValidShortCut( const String& rLong,
                                 BOOL bCheckInBlock = FALSE ) const;

            SwGlossaryHdl(SfxViewFrame* pViewFrame, SwWrtShell *);
            ~SwGlossaryHdl();
};

#endif // _GLOSHDL_HXX
diff --git a/sw/source/ui/inc/gloslst.hxx b/sw/source/ui/inc/gloslst.hxx
new file mode 100644
index 0000000..7805af3
--- /dev/null
+++ b/sw/source/ui/inc/gloslst.hxx
@@ -0,0 +1,131 @@
/*************************************************************************
 *
 *  $RCSfile: gloslst.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:40 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _GLOSLST_HXX
#define _GLOSLST_HXX


#ifndef _DATETIME_HXX
#include <tools/datetime.hxx>
#endif
#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif
#ifndef _TIMER_HXX //autogen
#include <vcl/timer.hxx>
#endif
#ifndef _SVARRAY_HXX //autogen
#include <svtools/svarray.hxx>
#endif

class SwGlossaries;
class SvStringsISortDtor;

struct AutoTextGroup
{
    USHORT      nCount;
    String      sName;
    String      sTitle;
    String      sLongNames;   // durch 0x0A getrennte Langnamen
    String      sShortNames;  // durch 0x0A getrennte Kurznamen
    DateTime    aDateModified;
};


typedef AutoTextGroup* AutoTextGroupPtr;
SV_DECL_PTRARR(AutoTextGroups, AutoTextGroupPtr, 4, 4);

class SwGlossaryList : public AutoTimer
{
    AutoTextGroups  aGroupArr;
    String          sPath;
    BOOL            bFilled;

    AutoTextGroup*  FindGroup(const String& rGroupName);
    void            FillGroup(AutoTextGroup* pGroup, SwGlossaries* pGloss);

public:
        SwGlossaryList();
        ~SwGlossaryList();

    BOOL            HasLongName(const String& rBegin, SvStringsISortDtor* pLongNames );
    BOOL            GetShortName(const String& rLongName,
                                        String& rShortName, String& rGroupName );

    USHORT          GetGroupCount();
    String          GetGroupName(USHORT nPos, BOOL bNoPath = TRUE, String* pTitle = 0);
    USHORT          GetBlockCount(USHORT nGroup);
    String          GetBlockName(USHORT nGroup, USHORT nBlock, String& rShortName);

    void            Update();

    virtual void    Timeout();

    void            ClearGroups();
};

#endif






diff --git a/sw/source/ui/inc/glossary.hxx b/sw/source/ui/inc/glossary.hxx
new file mode 100644
index 0000000..bcc118e
--- /dev/null
+++ b/sw/source/ui/inc/glossary.hxx
@@ -0,0 +1,249 @@
/*************************************************************************
 *
 *  $RCSfile: glossary.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:40 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _GLOSSARY_HXX
#define _GLOSSARY_HXX

#ifndef _EDIT_HXX //autogen
#include <vcl/edit.hxx>
#endif

#ifndef _SVTREEBOX_HXX //autogen
#include <svtools/svtreebx.hxx>
#endif

#ifndef _SVX_STDDLG_HXX //autogen
#include <svx/stddlg.hxx>
#endif

#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif

#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif

#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif

#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif

#ifndef _COMBOBOX_HXX //autogen
#include <vcl/combobox.hxx>
#endif

#ifndef _MENUBTN_HXX //autogen
#include <vcl/menubtn.hxx>
#endif

#ifndef _ACTCTRL_HXX
#include <actctrl.hxx>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XENUMERATIONACCESS_HPP_
#include <com/sun/star/container/XEnumerationAccess.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XHIERARCHICALNAMEACCESS_HPP_
#include <com/sun/star/container/XHierarchicalNameAccess.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XNAMEACCESS_HPP_
#include <com/sun/star/container/XNameAccess.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XCONTENTENUMERATIONACCESS_HPP_
#include <com/sun/star/container/XContentEnumerationAccess.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XENUMERATION_HPP_
#include <com/sun/star/container/XEnumeration.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XELEMENTACCESS_HPP_
#include <com/sun/star/container/XElementAccess.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XINDEXACCESS_HPP_
#include <com/sun/star/container/XIndexAccess.hpp>
#endif

class SwGlossaryHdl;
class SwNewGlosNameDlg;
class SwWrtShell;
class SfxViewFrame;
class PopupMenu;
class Menu;

const short RET_EDIT = 100;

//------------------------------------------------------------------

class SwGlTreeListBox : public SvTreeListBox
{
    const String    sReadonly;

    SvLBoxEntry*            pDragEntry;

    virtual DragDropMode    NotifyBeginDrag( SvLBoxEntry* );
    virtual sal_Bool    NotifyQueryDrop( SvLBoxEntry* );

    virtual sal_Bool    NotifyMoving(   SvLBoxEntry*  pTarget,
                                    SvLBoxEntry*  pEntry,
                                    SvLBoxEntry*& rpNewParent,
                                    sal_uInt32&        rNewChildPos
                                );
    virtual sal_Bool    NotifyCopying(  SvLBoxEntry*  pTarget,
                                    SvLBoxEntry*  pEntry,
                                    SvLBoxEntry*& rpNewParent,
                                    sal_uInt32&       rNewChildPos);
    public:
            SwGlTreeListBox(Window* pParent, const ResId& rResId);

    virtual void    RequestHelp( const HelpEvent& rHEvt );
    void            Clear();
};

//------------------------------------------------------------------
class SwOneExampleFrame;
class SwGlossaryDlg : public SvxStandardDialog
{
    friend SwNewGlosNameDlg;
    friend SwGlTreeListBox;

    GroupBox        aExampleGB;
    Window          aExampleWIN;
    CheckBox        aShowExampleCB;

    CheckBox        aInsertTipCB;

    FixedText       aNameLbl;
    Edit            aNameED;
    FixedText       aShortNameLbl;
    NoSpaceEdit     aShortNameEdit;

    SwGlTreeListBox aCategoryBox;
    GroupBox        aGlossaryFrm;

    CheckBox        aFileRelCB;
    CheckBox        aNetRelCB;
    GroupBox        aRelativeGB;

    OKButton        aInsertBtn;
    CancelButton    aCloseBtn;
    HelpButton      aHelpBtn;
    MenuButton      aEditBtn;
    PushButton      aBibBtn;
    PushButton      aPathBtn;

    String          sReadonlyPath;

    ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >        _xAutoText;
    SwOneExampleFrame*  pExampleFrame;

    PopupMenu*      pMenu;
    SwGlossaryHdl*  pGlossaryHdl;
    const sal_Bool      bSelection : 1;
    sal_Bool            bReadOnly : 1;
    sal_Bool            bIsOld : 1;
    sal_Bool            bIsDocReadOnly:1;

    SwWrtShell*     pSh;

    void EnableShortName(sal_Bool bOn = sal_True);

    DECL_LINK( NameModify, Edit * );
    DECL_LINK( NameDoubleClick, SvTreeListBox * );
    DECL_LINK( GrpSelect, SvTreeListBox * );
    DECL_LINK( MenuHdl, Menu * );
    DECL_LINK( EnableHdl, Menu * );
    DECL_LINK( BibHdl, Button * );
    DECL_LINK( EditHdl, Button * );
    DECL_LINK( PathHdl, Button * );
    DECL_LINK( CheckBoxHdl, CheckBox * );
    DECL_LINK( ShowPreviewHdl, CheckBox * );
    DECL_LINK( PreviewLoadedHdl, void * );


    virtual void    Apply();
    void            Init();
    SvLBoxEntry*    DoesBlockExist(const String& sBlock, const String& rShort);
    void            ShowAutoText(const String& rGroup, const String& rShortName);

public:
    SwGlossaryDlg(SfxViewFrame* pViewFrame, SwGlossaryHdl* pGlosHdl, SwWrtShell *pWrtShell);
    ~SwGlossaryDlg();
    String          GetCurrGrpName() const;
    inline String   GetCurrLongName() const;
    inline String   GetCurrShortName() const;
    static String   GetCurrGroup();
    static void     SetActGroup(const String& rNewGroup);
    static String   GetExtension();
};

inline String SwGlossaryDlg::GetCurrLongName() const
{
    return aNameED.GetText();
}
inline String SwGlossaryDlg::GetCurrShortName() const
{
    return aShortNameEdit.GetText();
}


#endif

diff --git a/sw/source/ui/inc/glshell.hxx b/sw/source/ui/inc/glshell.hxx
new file mode 100644
index 0000000..7028294
--- /dev/null
+++ b/sw/source/ui/inc/glshell.hxx
@@ -0,0 +1,140 @@
/*************************************************************************
 *
 *  $RCSfile: glshell.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:40 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _AUTODOC_HXX
#define _AUTODOC_HXX

#include "wdocsh.hxx"

class SwTextBlocks;

class SwGlosDocShell : public SwDocShell
{
    String          aLongName;
    String          aShortName;
    String          aGroupName;
protected:
    virtual BOOL Save();

public:
    TYPEINFO();
    SFX_DECL_INTERFACE(SW_GLOSDOCSHELL);
                SwGlosDocShell();
        virtual ~SwGlosDocShell();

    void            Execute( SfxRequest& );
    void            GetState( SfxItemSet& );
    void            SetLongName( const String& rLongName )
                        { aLongName = rLongName; }
    void            SetShortName( const String& rShortName )
                        { aShortName = rShortName; }
    void            SetGroupName( const String& rGroupName )
                        { aGroupName = rGroupName; }
    const String&   GetShortName(){return aShortName;}
};


class SwWebGlosDocShell : public SwWebDocShell
{
    String          aLongName;
    String          aShortName;
    String          aGroupName;
protected:
    virtual BOOL Save();

public:
    TYPEINFO();
    SFX_DECL_INTERFACE(SW_WEBGLOSDOCSHELL);
                SwWebGlosDocShell();
        virtual ~SwWebGlosDocShell();

    void            Execute( SfxRequest& );
    void            GetState( SfxItemSet& );
    void            SetLongName( const String& rLongName )
                        { aLongName = rLongName; }
    void            SetShortName( const String& rShortName )
                        { aShortName = rShortName; }
    void            SetGroupName( const String& rGroupName )
                        { aGroupName = rGroupName; }
    const String&   GetShortName(){return aShortName;}
};

#endif





















diff --git a/sw/source/ui/inc/grfsh.hxx b/sw/source/ui/inc/grfsh.hxx
new file mode 100644
index 0000000..1ace70f
--- /dev/null
+++ b/sw/source/ui/inc/grfsh.hxx
@@ -0,0 +1,79 @@
/*************************************************************************
 *
 *  $RCSfile: grfsh.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:40 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWGRFSH_HXX
#define _SWGRFSH_HXX

#include "frmsh.hxx"

class SwGrfShell: public SwBaseShell
{
public:
    SFX_DECL_INTERFACE(SW_GRFSHELL);

    void    Execute(SfxRequest &);
    void    GetState(SfxItemSet &);
    void    ExecAttr(SfxRequest &);
    void    GetAttrState(SfxItemSet &);

            SwGrfShell(SwView &rView);
};

#endif
diff --git a/sw/source/ui/inc/hidfunc.h b/sw/source/ui/inc/hidfunc.h
new file mode 100644
index 0000000..00f296a
--- /dev/null
+++ b/sw/source/ui/inc/hidfunc.h
@@ -0,0 +1,383 @@
/*************************************************************************
 *
 *  $RCSfile: hidfunc.h,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:40 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#define HID_EXIT    1017
#define HID_NEW_WINDOW  1701
#define HID_ARRANGE_CASCADE_WIN 1703
#define HID_ARRANGE_HORZ_WIN    1704
#define HID_ARRANGE_VERT_WIN    1705
#define HID_ARRANGE_ALL_WIN 1702
#define HID_SHOW_HELP_INDEX 1802
#define HID_NEW_FILE    1005
#define HID_NEW_FILE_DEFAULT    1024
#define HID_CLOSE_FILE  1001
#define HID_DOC_MGR_DLG 1032
#define HID_CONFIG_TOOLBOX  1629
#define HID_CONFIG_MENU 1630
#define HID_CONFIG_KEY  1631
#define HID_TEMPLATE_PI 1657
#define HID_ADDR_PI 1658
#define HID_AUTO_FORMAT 1651
#define HID_NAVIGATION_PI   1656
#define HID_NAVIGATION_PI_GOTO_PAGE 1659
#define HID_HELP_PI 1655
#define HID_FORMAT_DROPCAPS 1454
#define HID_CONFIG_VIEWOPTIONS  1635
#define HID_CONFIG_COLORS   1636
#define HID_TOOLBOX 1213
#define HID_RIBBON  1210
#define HID_RULER   1211
#define HID_VLINEAL 1216
#define HID_VSCROLLBAR  1217
#define HID_HSCROLLBAR  1218
#define HID_SAVE_FILE   1013
#define HID_SAVE_ALL    1023
#define HID_SAVE_FILE_AS    1012
#define HID_OPEN_LASTVERSION    1009
#define HID_STATUSBAR   1212
#define HID_ABOUT_DLG   1806
#define HID_SEND_MAIL   1022
#define HID_OPEN_FILE   1007
#define HID_INSERT_FILE 1309
#define HID_DOCSTAT_DLG 1020
#define HID_LOAD_TEMPLATE_DLG   1021
#define HID_ESCAPE  1941
#define HID_PLAY_MACRO_DLG  1624
#define HID_RECORD_MACRO_DLG    1622
#define HID_ASSIGN_LOCAL_MACRO_DLG  1632
#define HID_COMPILE_MACRO   1633
#define HID_CREATE_DOCUMENT 1019
#define HID_PAGEUP  1937
#define HID_PAGEDOWN    1938
#define HID_SET_LEFT_PARA   1418
#define HID_SET_RIGHT_PARA  1419
#define HID_SET_CENTER_PARA 1420
#define HID_SET_JUSTIFY_PARA    1421
#define HID_SET_ADJUST  1428
#define HID_FORMAT_RESET    1469
#define HID_INDENT_TO_TABSTOP   1417
#define HID_UNINDENT_TO_TABSTOP 1431
#define HID_SET_BOLD    1405
#define HID_SET_ITALIC  1406
#define HID_SET_UNDERLINE   1409
#define HID_SET_STRIKEOUT   1410
#define HID_SET_OUTLINE 1408
#define HID_SET_SHADOW  1407
#define HID_SET_SUPER_SCRIPT    1411
#define HID_SET_SUB_SCRIPT  1412
#define HID_SET_COLOR   1413
#define HID_SET_CASEMAP 1414
#define HID_SET_LANGUAGE    1415
#define HID_SET_KERNING 1416
#define HID_SET_FONT    1401
#define HID_SET_FONT_SIZE   1402
#define HID_GROW_FONT_SIZE  1403
#define HID_SHRINK_FONT_SIZE    1404
#define HID_SET_LINE_SPACE_1    1422
#define HID_SET_LINE_SPACE_15   1423
#define HID_SET_LINE_SPACE_2    1424
#define HID_SET_PROP_LINE_SPACE 1540
#define HID_SET_ABS_LINE_SPACE  1541
#define HID_INSERT_SYMBOL   1328
#define HID_INSERT_OBJECT_DLG   1322
#define HID_EDIT_OBJECT 1110
#define HID_EDIT_LINK_DLG   1109
#define HID_EDIT_FILE_INFO_DLG  1107
#define HID_EDIT_IDX_ENTRY_DLG  1123
#define HID_NUM_BULLET_DOWN 1130
#define HID_NUM_BULLET_MOVEUP   1134
#define HID_NUM_BULLET_MOVEDOWN 1135
#define HID_NUM_BULLET_UP   1131
#define HID_NUM_BULLET_PREV 1132
#define HID_NUM_BULLET_NEXT 1133
#define HID_NUM_BULLET_OUTLINE_MOVEDOWN 1142
#define HID_NUM_BULLET_OUTLINE_MOVEUP   1141
#define HID_NUM_BULLET_OUTLINE_UP   1140
#define HID_NUM_BULLET_OUTLINE_DOWN 1139
#define HID_NUM_BULLET_NONUM    1136
#define HID_NUM_NUMBERING_ON    1144
#define HID_NUM_BULLET_ON   1138
#define HID_NUM_BULLET_OFF  1137
#define HID_INSERT_IDX_ENTRY_DLG    1335
#define HID_POSTIT  1329
#define HID_INSERT_CAPTION  1310
#define HID_INSERT_IDX  1336
#define HID_INSERT_USERIDX  1337
#define HID_INSERT_CNTNTIDX 1338
#define HID_INSERT_IDX_ENTRY    1340
#define HID_INSERT_USERIDX_ENTRY    1341
#define HID_INSERT_CNTNTIDX_ENTRY   1342
#define HID_INSERT_FRAME    1334
#define HID_INSERT_FRAME_INTERACT   1333
#define HID_INSERT_SOFT_HYPHEN  1350
#define HID_INSERT_HARD_SPACE   1351
#define HID_FORMAT_FRAME_DLG    1456
#define HID_FRAME_TO_TOP    1470
#define HID_FRAME_TO_BOTTOM 1471
#define HID_FRAME_NOWRAP    1472
#define HID_FRAME_WRAP  1473
#define HID_FRAME_WRAPTHRU  1474
#define HID_FRAME_ALIGN_HORZ_LEFT   1475
#define HID_FRAME_ALIGN_HORZ_RIGHT  1476
#define HID_FRAME_ALIGN_HORZ_CENTER 1477
#define HID_FRAME_ALIGN_VERT_TOP    1478
#define HID_FRAME_ALIGN_VERT_BOTTOM 1479
#define HID_FRAME_ALIGN_VERT_CENTER 1480
#define HID_EDIT_FIELD  1104
#define HID_SET_FIELD_VALUE 1112
#define HID_INSERT_FIELD    1308
#define HID_INSERT_MERGEFIELD_DLG   1320
#define HID_EXECUTE_MACROFIELD  1127
#define HID_UPDATE_FIELDS   1126
#define HID_UPDATE_INPUTFIELDS  1143
#define HID_CALC_TABLE  1129
#define HID_INSERT_BREAK_DLG    1304
#define HID_INSERT_BOOKMARK 1302
#define HID_DELETE_BOOKMARK 1301
#define HID_INSERT_GRAFIC   1315
#define HID_FORMAT_TABLE_DLG    1460
#define HID_INSERT_TABLE    1330
#define HID_INSERT_COLS 1332
#define HID_PAGE_STYLE_SET_COLS 1538
#define HID_CONVERT_TEXT_TABLE  1500
#define HID_TABLE_INSERT_ROW    1501
#define HID_TABLE_INSERT_COL    1502
#define HID_TABLE_DELETE_ROW    1503
#define HID_TABLE_DELETE_COL    1504
#define HID_TABLE_SPLIT_CELLS   1505
#define HID_TABLE_MERGE_CELLS   1506
#define HID_TABLE_SET_ROW_HEIGHT    1507
#define HID_TABLE_SET_COL_WIDTH 1508
#define HID_TABLE_SET_ULSPACE   1509
#define HID_TABLE_SET_GRID  1510
#define HID_TABLE_SET_SHADOW    1511
#define HID_FORMAT_CHAR_DLG 1441
#define HID_FORMAT_PAGE_DLG 1452
#define HID_CHANGE_PAGENUM  1634
#define HID_FORMAT_PARA_DLG 1443
#define HID_FORMAT_TAB_DLG  1445
#define HID_FORMAT_BORDER_DLG   1447
#define HID_FORMAT_BORDER   1439
#define HID_FORMAT_SHADOW   1438
#define HID_FORMAT_BACKGROUND   1448
#define HID_FORMAT_BACKGROUND_DLG   1450
#define HID_SET_FRM_SIZE    1481
#define HID_SET_FRM_POSITION    1482
#define HID_SET_FRM_ANCHOR  1483
#define HID_SET_FRM_WRAP    1484
#define HID_SET_FRM_DIST    1485
#define HID_SET_FRM_OPTIONS 1486
#define HID_SET_FRM_MACRO   1494
#define HID_SET_FRM_COLUMNS 1495
#define HID_SET_FRM_COLUMN_WIDTH    1496
#define HID_SET_GRF_MIRROR  1488
#define HID_SET_TABLE_WIDTH 1489
#define HID_SET_TABLE_ALIGN 1490
#define HID_TABLE_SET_READ_ONLY_CELLS   1517
#define HID_TABLE_UNSET_READ_ONLY_CELLS 1519
#define HID_NEW_STYLE_BY_EXAMPLE    1462
#define HID_UPDATE_STYLES_DIRECT    1497
#define HID_UPDATE_STYLE_BY_EXAMPLE 1463
#define HID_STYLE_SHEET_FRAME_DLG   1464
#define HID_STYLE_SHEET_DOC_DLG 1465
#define HID_SET_STANDARD_FONTS  1442
#define HID_COPY    1102
#define HID_PASTE   1113
#define HID_PASTESPECIAL    1114
#define HID_CUT 1103
#define HID_FLIP_HORZ_GRAFIC    1425
#define HID_FLIP_VERT_GRAFIC    1426
#define HID_FORMAT_GRAFIC_DLG   1458
#define HID_VIEW_BOUNDS 1214
#define HID_VIEW_FIELDS 1215
#define HID_VIEW_META_CHARS 1224
#define HID_VIEW_MARKS  1225
#define HID_VIEW_FIELDNAME  1226
#define HID_VIEW_TABLEGRID  1227
#define HID_SEARCH  1117
#define HID_REPEAT_SEARCH   1150
#define HID_REPLACE 1118
#define HID_GOTO    1111
#define HID_SETUP_PRINTER_DLG   1015
#define HID_PRINT_FILE  1010
#define HID_PRINT_FILE_DEFAULT  1025
#define HID_FAX 1028
#define HID_PRINT_FILE_OPTIONS  1011
#define HID_THESAURUS_DLG   1604
#define HID_SPELLING_DLG    1601
#define HID_HYPHENATE_OPT_DLG   1607
#define HID_MERGE_FILE_DLG  1004
#define HID_SELECT_DATABASE 1030
#define HID_DOC_INFO_DLG    1031
#define HID_MERGE_FILE  1003
#define HID_MERGE_RECORD    1327
#define HID_INSERT_RECORD   1326
#define HID_NUMBERING_OUTLINE_DLG   1612
#define HID_NUMBER_BULLETS  1121
#define HID_ZOOM    1231
#define HID_SORTING 1613
#define HID_SORTING_DLG 1614
#define HID_CALCULATE   1615
#define HID_REFRESH_VIEW    1201
#define HID_CHAR_LEFT   1901
#define HID_CHAR_RIGHT  1902
#define HID_LINE_UP 1903
#define HID_LINE_DOWN   1904
#define HID_START_OF_LINE   1905
#define HID_END_OF_LINE 1906
#define HID_START_OF_DOCUMENT   1907
#define HID_END_OF_DOCUMENT 1908
#define HID_SELECT_WORD 1943
#define HID_SELECT_ALL  1119
#define HID_START_OF_NEXT_PAGE  1909
#define HID_END_OF_NEXT_PAGE    1910
#define HID_START_OF_PREV_PAGE  1911
#define HID_END_OF_PREV_PAGE    1912
#define HID_START_OF_PAGE   1913
#define HID_END_OF_PAGE 1914
#define HID_NEXT_WORD   1921
#define HID_START_OF_PARA   1919
#define HID_END_OF_PARA 1920
#define HID_PREV_WORD   1922
#define HID_NEXT_SENT   1923
#define HID_PREV_SENT   1924
#define HID_SET_INS_MODE    1936
#define HID_SET_ADD_MODE    1939
#define HID_SET_EXT_MODE    1940
#define HID_START_TABLE 1947
#define HID_END_TABLE   1948
#define HID_NEXT_TABLE  1949
#define HID_PREV_TABLE  1950
#define HID_TABLE_SELECT_ALL    1515
#define HID_TABLE_SELECT_COL    1514
#define HID_TABLE_SELECT_ROW    1513
#define HID_START_OF_COLUMN 1917
#define HID_END_OF_COLUMN   1918
#define HID_START_OF_NEXT_COLUMN    1951
#define HID_END_OF_NEXT_COLUMN  1952
#define HID_START_OF_PREV_COLUMN    1953
#define HID_END_OF_PREV_COLUMN  1954
#define HID_FOOTNOTE_TO_ANCHOR  1955
#define HID_NEXT_FOOTNOTE   1956
#define HID_PREV_FOOTNOTE   1957
#define HID_CNTNT_TO_NEXT_FRAME 1958
#define HID_FRAME_TO_ANCHOR 1959
#define HID_TO_HEADER   1960
#define HID_TO_FOOTER   1961
#define HID_IDX_MARK_TO_IDX 1962
#define HID_DELETE  1925
#define HID_BACKSPACE   1926
#define HID_DELETE_SENT 1927
#define HID_DELETE_BACK_SENT    1928
#define HID_DELETE_WORD 1929
#define HID_DELETE_BACK_WORD    1930
#define HID_DELETE_LINE 1931
#define HID_DELETE_BACK_LINE    1932
#define HID_DELETE_PARA 1933
#define HID_DELETE_BACK_PARA    1934
#define HID_DELETE_WHOLE_LINE   1935
#define HID_INSERT_BREAK    1303
#define HID_INSERT_PAGEBREAK    1323
#define HID_INSERT_LINEBREAK    1318
#define HID_INSERT_COLUMN_BREAK 1305
#define HID_INSERT_FOOTNOTE 1311
#define HID_INSERT_FOOTNOTE_DLG 1312
#define HID_FORMAT_FOOTNOTE_DLG 1468
#define HID_UNDO    1120
#define HID_REDO    1116
#define HID_REPEAT  1122
#define HID_REPAGINATE  1161
#define HID_SHOW_UPDATE_HELP    1805
#define HID_SHOW_KEYBOARD_HELP  1803
#define HID_SHOW_HELP_MANUAL    1804
#define HID_GLOSSARY_DLG    1620
#define HID_EXPAND_GLOSSARY 1628
#define HID_INSERT_GLOSSARY 1640
#define HID_AUTO_CORRECT_DLG    1650
#define HID_AUTO_CORRECT    1649
#define HID_CONFIG_DLG  1627
#define HID_INSERT_STRING   1331
#define HID_SET_CHAR_STYLE  1491
#define HID_SET_PARA_STYLE  1492
#define HID_SET_PAGE_STYLE  1493
#define HID_SET_LRMARGIN    1429
#define HID_SET_ULMARGIN    1430
#define HID_SET_HYPHEN_ZONE 1432
#define HID_SET_PAGE_BREAK  1433
#define HID_FORMAT_PAGE 1451
#define HID_SET_KEEP_TOGETHER   1434
#define HID_SET_WIDOW   1436
#define HID_SET_ORPHAN  1437
#define HID_BUFFER_UPDATE   1124
#define HID_FORMAT_TAB  1444
#define HID_IS_END_OF_PARA  2000
#define HID_IS_END_OF_WORD  2000
#define HID_IS_END_OF_DOC   2000
#define HID_IS_START_OF_PARA    2000
#define HID_IS_START_OF_WORD    2000
#define HID_IS_START_OF_DOC 2000
#define HID_EDIT_FORMULA    1128
#define HID_ENVELOP 2050
#define HID_LABEL   2051
#define HID_AGENDA_WIZZARD  1663
#define HID_MEMO_WIZZARD    1662
#define HID_FAX_WIZZARD 1661
#define HID_LETTER_WIZZARD  1660
#define HID_LAUNCH_REGISTRY 1002
diff --git a/sw/source/ui/inc/hyp.hxx b/sw/source/ui/inc/hyp.hxx
new file mode 100644
index 0000000..0f6f025
--- /dev/null
+++ b/sw/source/ui/inc/hyp.hxx
@@ -0,0 +1,105 @@
/*************************************************************************
 *
 *  $RCSfile: hyp.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:40 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _HYP_HXX
#define _HYP_HXX

#ifndef _LINK_HXX
#include <tools/link.hxx>
#endif
#ifndef _SVX_SPLWRAP_HXX //autogen
#include <svx/splwrap.hxx>
#endif
#ifndef _COM_SUN_STAR_LINGUISTIC_XHYPHENATOR_HPP_
#include <com/sun/star/linguistic/XHyphenator.hpp>
#endif

class SwView;

class SwHyphWrapper : public SvxSpellWrapper {
private:
    SwView* pView;
    ::com::sun::star::uno::Reference<
        ::com::sun::star::linguistic::XHyphenator >  xHyph;
    Link            aOldLnk;
    sal_uInt32          nLangError;     // nicht vorhandene Sprache
    sal_uInt16          nPageCount;     // Seitenanzahl fuer Progressanzeige
    sal_uInt16          nPageStart;     // 1. gepruefte Seite
    sal_Bool            bInSelection : 1; // Trennen von selektiertem Text
    sal_Bool            bShowError : 1; // nicht vorhandene Sprache melden
    sal_Bool            bAutomatic : 1; // Trennstellen ohne Rueckfrage einfuegen
    DECL_LINK( SpellError, void * );

public:
    SwHyphWrapper( SwView* pVw, ::com::sun::star::uno::Reference<
        ::com::sun::star::linguistic::XHyphenator >  &rxHyph,
        sal_Bool bStart, sal_Bool bOther, sal_Bool bSelect );

    ~SwHyphWrapper();
protected:
    virtual void SpellStart( SvxSpellArea eSpell );
    virtual sal_Bool SpellContinue();
    virtual void SpellEnd( );
    virtual sal_Bool SpellMore();
    virtual void InsertHyphen( const sal_uInt16 nPos ); // Hyphen einfuegen
};

#endif
diff --git a/sw/source/ui/inc/idxmrk.hxx b/sw/source/ui/inc/idxmrk.hxx
new file mode 100644
index 0000000..47daae1
--- /dev/null
+++ b/sw/source/ui/inc/idxmrk.hxx
@@ -0,0 +1,345 @@
/*************************************************************************
 *
 *  $RCSfile: idxmrk.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:40 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _IDXMRK_HXX
#define _IDXMRK_HXX

#ifndef _COM_SUN_STAR_CONTAINER_XNAMEACCESS_HPP_
#include <com/sun/star/container/XNameAccess.hpp>
#endif
#ifndef _BASEDLGS_HXX
#include <sfx2/basedlgs.hxx>
#endif

#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif

#ifndef _SV_LSTBOX_HXX
#include <vcl/lstbox.hxx>
#endif
#ifndef _COMBOBOX_HXX //autogen
#include <vcl/combobox.hxx>
#endif
#ifndef _SVX_STDDLG_HXX
#include <svx/stddlg.hxx>
#endif

#ifndef _FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif

#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif

#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif

#ifndef _IMAGEBTN_HXX //autogen
#include <vcl/imagebtn.hxx>
#endif
#ifndef _SFX_CHILDWIN_HXX //autogen
#include <sfx2/childwin.hxx>
#endif
#ifndef _TOXE_HXX
#include "toxe.hxx"
#endif
#ifndef _STDCTRL_HXX
#include <svtools/stdctrl.hxx>
#endif
class SwWrtShell;
class SwTOXMgr;

/*--------------------------------------------------------------------
     Beschreibung:  Markierung fuer Verzeichniseintrag einfuegen
 --------------------------------------------------------------------*/
class SwIndexMarkFloatDlg;
class SwIndexMarkModalDlg;
class SwIndexMarkDlg : public Window //SvxStandardDialog
{
    friend class SwIndexMarkFloatDlg;
    friend class SwIndexMarkModalDlg;
    FixedText       aTypeFT;
    ListBox         aTypeDCB;
    ImageButton     aNewBT;
    FixedText       aEntryFT;
    Edit            aEntryED;
    FixedText       aKeyFT;
    ComboBox        aKeyDCB;
    FixedText       aKey2FT;
    ComboBox        aKey2DCB;
    FixedText       aLevelFT;
    NumericField    aLevelED;
     CheckBox       aMainEntryCB;
     CheckBox       aApplyToAllCB;
     CheckBox       aSearchCaseSensitiveCB;
     CheckBox       aSearchCaseWordOnlyCB;

     GroupBox       aIndexGB;

    OKButton        aOKBT;
    CancelButton    aCancelBT;
    HelpButton      aHelpBT;
    PushButton      aDelBT;
    //PushButton        aNewBT;

    ImageButton     aPrevSameBT;
    ImageButton     aNextSameBT;
    ImageButton     aPrevBT;
    ImageButton     aNextBT;

    String          aOrgStr;
    sal_Bool            bDel;
    sal_Bool            bNewMark;
    sal_Bool            bSelected;

    SwTOXMgr*       pTOXMgr;
    SwWrtShell*     pSh;

    void            Apply();
    void            InitControls();
    void            InsertMark();
    void            UpdateMark();

    DECL_LINK( InsertHdl, Button * );
    DECL_LINK( CloseHdl, Button * );
    DECL_LINK( DelHdl, Button * );
    DECL_LINK( NextHdl, Button * );
    DECL_LINK( NextSameHdl, Button * );
    DECL_LINK( PrevHdl, Button * );
    DECL_LINK( PrevSameHdl, Button * );
    DECL_LINK( ModifyHdl, ListBox* pBox = 0 );
    DECL_LINK( KeyDCBModifyHdl, ComboBox * );
    DECL_LINK( NewUserIdxHdl, Button*);
    DECL_LINK( SearchTypeHdl, CheckBox*);

    void            UpdateKeyBoxes();

    void            UpdateDialog();
    void            InsertUpdate();

    virtual void    Activate();

public:

    SwIndexMarkDlg( Window *pParent,
                       sal_Bool bNewDlg,
                    const ResId& rResId);


    ~SwIndexMarkDlg();

    void    ReInitDlg(SwWrtShell& rWrtShell);
    sal_Bool    IsTOXType(const String& rName)
                {return LISTBOX_ENTRY_NOTFOUND != aTypeDCB.GetEntryPos(rName);}
};
/* -----------------06.10.99 10:11-------------------

 --------------------------------------------------*/
class SwIndexMarkFloatDlg : public SfxModelessDialog
{
    SwIndexMarkDlg      aDlg;
    virtual void    Activate();
    public:
        SwIndexMarkFloatDlg(    SfxBindings* pBindings,
                                   SfxChildWindow* pChild,
                                   Window *pParent,
                                   sal_Bool bNew=sal_True);

        SwIndexMarkDlg&     GetDlg() {return aDlg;}
};
/* -----------------06.10.99 10:33-------------------

 --------------------------------------------------*/
class SwIndexMarkModalDlg : public SvxStandardDialog
{
    SwIndexMarkDlg      aDlg;
public:
    SwIndexMarkModalDlg(Window *pParent, SwWrtShell& rSh);

    SwIndexMarkDlg&     GetDlg() {return aDlg;}
    virtual void        Apply();
};

/* -----------------07.09.99 08:02-------------------

 --------------------------------------------------*/
class SwInsertIdxMarkWrapper : public SfxChildWindow
{
protected:
    SwInsertIdxMarkWrapper( Window *pParentWindow,
                            sal_uInt16 nId,
                            SfxBindings* pBindings,
                            SfxChildWinInfo* pInfo );

    SFX_DECL_CHILDWINDOW(SwInsertIdxMarkWrapper);

public:
    void    ReInitDlg(SwWrtShell& rWrtShell)
        {((SwIndexMarkFloatDlg*)pWindow)->GetDlg().ReInitDlg(rWrtShell);}

};

/* -----------------15.09.99 08:39-------------------

 --------------------------------------------------*/
class SwAuthMarkModalDlg;
class SwAuthMarkDlg : public Window
{
    static sal_Bool     bIsFromComponent;

    friend class SwAuthMarkModalDlg;
    RadioButton     aFromComponentRB;
    RadioButton     aFromDocContentRB;
    FixedText       aEntryFT;
    Edit            aEntryED;
    ListBox         aEntryLB;
    FixedText       aAuthorFT;
    FixedInfo       aAuthorFI;
    FixedText       aTitleFT;
    FixedInfo       aTitleFI;

    GroupBox        aEntryGB;

    OKButton        aOKBT;
    CancelButton    aCancelBT;
    HelpButton      aHelpBT;
    PushButton      aCreateEntryPB;
    PushButton      aEditEntryPB;

    String          sChangeST;
    sal_Bool            bNewEntry;
    sal_Bool            bBibAccessInitialized;

    SwWrtShell*     pSh;

    String          m_sColumnTitles[AUTH_FIELD_END];
    String          m_sFields[AUTH_FIELD_END];

    String          m_sCreatedEntry[AUTH_FIELD_END];

    ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >    xBibAccess;

    DECL_LINK(InsertHdl, PushButton*);
    DECL_LINK(CloseHdl, PushButton*);
    DECL_LINK(CreateEntryHdl, PushButton*);
    DECL_LINK(CompEntryHdl, ListBox*);
    DECL_LINK(ChangeSourceHdl, RadioButton*);
    DECL_LINK(IsEntryAllowedHdl, Edit*);

    void InitControls();
public:

    SwAuthMarkDlg( Window *pParent,
                    const ResId& rResId,
                       sal_Bool bNew=sal_True);
    ~SwAuthMarkDlg();

    void    ReInitDlg(SwWrtShell& rWrtShell);
};
/* -----------------07.09.99 08:02-------------------

 --------------------------------------------------*/
class SwInsertAuthMarkWrapper : public SfxChildWindow
{
protected:
    SwInsertAuthMarkWrapper(    Window *pParentWindow,
                            sal_uInt16 nId,
                            SfxBindings* pBindings,
                            SfxChildWinInfo* pInfo );

    SFX_DECL_CHILDWINDOW(SwInsertAuthMarkWrapper);

public:
    void    ReInitDlg(SwWrtShell& rWrtShell);
};
/* -----------------06.10.99 10:11-------------------

 --------------------------------------------------*/
class SwAuthMarkFloatDlg : public SfxModelessDialog
{
    SwAuthMarkDlg       aDlg;
    virtual void    Activate();
    public:
        SwAuthMarkFloatDlg(     SfxBindings* pBindings,
                                   SfxChildWindow* pChild,
                                   Window *pParent,
                                   sal_Bool bNew=sal_True);

        SwAuthMarkDlg&      GetDlg() {return aDlg;}
};
/* -----------------06.10.99 10:33-------------------

 --------------------------------------------------*/
class SwAuthMarkModalDlg : public SvxStandardDialog
{
    SwAuthMarkDlg       aDlg;
public:
    SwAuthMarkModalDlg(Window *pParent, SwWrtShell& rSh);

    SwAuthMarkDlg&      GetDlg() {return aDlg;}
    virtual void        Apply();
};


#endif // _IDXMRK_HXX

diff --git a/sw/source/ui/inc/initui.hxx b/sw/source/ui/inc/initui.hxx
new file mode 100644
index 0000000..c482530
--- /dev/null
+++ b/sw/source/ui/inc/initui.hxx
@@ -0,0 +1,109 @@
/*************************************************************************
 *
 *  $RCSfile: initui.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:40 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _INITUI_HXX
#define _INITUI_HXX

#ifndef _SOLAR_H
#include <tools/solar.h>
#endif

/*
 * Forward Declarations
 */
class String;
class SwThesaurus;
class SpellCheck;
class SvStringsDtor;

/*
 * Extern Definitions
 */
extern  SwThesaurus*    pThes;
extern  String          GetSWGVersion();

extern  String*         pOldGrfCat;
extern  String*         pOldTabCat;
extern  String*         pOldFrmCat;

extern  String*         pCurrGlosGroup;

extern SvStringsDtor*   pDBNameList;

extern SvStringsDtor*   pAuthFieldNameList;
extern SvStringsDtor*   pAuthFieldTypeList;

// stellt die Textbausteinverwaltung zur Verfuegung
class SwGlossaries;
SwGlossaries* GetGlossaries();

class SwGlossaryList;

BOOL HasGlossaryList();
SwGlossaryList* GetGlossaryList();

extern  void _InitUI();
extern  void _FinitUI();
extern  void _InitSpell();
extern  void _FinitSpell();


#endif
diff --git a/sw/source/ui/inc/inpdlg.hxx b/sw/source/ui/inc/inpdlg.hxx
new file mode 100644
index 0000000..6ff63ad
--- /dev/null
+++ b/sw/source/ui/inc/inpdlg.hxx
@@ -0,0 +1,123 @@
/*************************************************************************
 *
 *  $RCSfile: inpdlg.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:40 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _INPDLG_HXX
#define _INPDLG_HXX

#ifndef _SVX_STDDLG_HXX //autogen
#include <svx/stddlg.hxx>
#endif

#ifndef VCL
#ifndef _EDIT_HXX //autogen
#include <vcl/edit.hxx>
#endif
#else
#ifndef _SV_SVMEDIT_HXX //autogen
#include <svtools/svmedit.hxx>
#endif
#endif

#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif

#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif

class SwInputField;
class SwSetExpField;
class SwUserFieldType;
class SwField;
class SwWrtShell;

/*--------------------------------------------------------------------
     Beschreibung: Einfuegen Felder
 --------------------------------------------------------------------*/

class SwFldInputDlg: public SvxStandardDialog
{
    virtual void    Apply();

    SwWrtShell         &rSh;
    SwInputField*       pInpFld;
    SwSetExpField*      pSetFld;
    SwUserFieldType*    pUsrType;

    Edit                aLabelED;

    MultiLineEdit       aEditED;
    GroupBox            aEditGB;

    OKButton            aOKBT;
    CancelButton        aCancelBT;
    PushButton          aNextBT;
    HelpButton          aHelpBT;

    DECL_LINK(NextHdl, PushButton*);
public:
    SwFldInputDlg(  Window *pParent, SwWrtShell &rSh,
                    SwField* pField, BOOL bNextButton = FALSE );
    ~SwFldInputDlg();
};


#endif
diff --git a/sw/source/ui/inc/inputwin.hxx b/sw/source/ui/inc/inputwin.hxx
new file mode 100644
index 0000000..57aa016
--- /dev/null
+++ b/sw/source/ui/inc/inputwin.hxx
@@ -0,0 +1,165 @@
/*************************************************************************
 *
 *  $RCSfile: inputwin.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:40 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef SW_INPUTWIN_HXX
#define SW_INPUTWIN_HXX


#ifndef _MENU_HXX //autogen
#include <vcl/menu.hxx>
#endif
#ifndef _SFX_CHILDWIN_HXX //autogen
#include <sfx2/childwin.hxx>
#endif
#ifndef _TOOLBOX_HXX //autogen
#include <vcl/toolbox.hxx>
#endif
#ifndef _EDIT_HXX //autogen
#include <vcl/edit.hxx>
#endif

class SwFldMgr;
class SwWrtShell;
class SwView;
class SfxDispatcher;

//========================================================================
class InputEdit : public Edit
{
public:
                    InputEdit(Window* pParent, WinBits nStyle) :
                        Edit(pParent , nStyle){}

    void            UpdateRange(const String& aSel,
                                const String& aTblName );

protected:
    virtual void    KeyInput( const KeyEvent&  );
};

//========================================================================

class SwInputWindow : public ToolBox
{
friend class InputEdit;

    Edit            aPos;
    InputEdit       aEdit;
    PopupMenu       aPopMenu;
    SwFldMgr*       pMgr;
    SwWrtShell*     pWrtShell;
    SwView*         pView;
    String          aAktTableName, sOldFml;
    USHORT          nActionCnt;

    BOOL            bFirst : 1;  //Initialisierungen beim ersten Aufruf
    BOOL            bActive : 1; //fuer Hide/Show beim Dokumentwechsel
    BOOL            bIsTable : 1;
    BOOL            bDelSel : 1;
    BOOL            bDoesUndo : 1;
    BOOL            bResetUndo : 1;
    BOOL            bCallUndo : 1;


    void DelBoxCntnt();
    DECL_LINK( ModifyHdl, InputEdit* );

protected:
    virtual void    Resize();
    virtual void    Click();
    DECL_LINK( MenuHdl, Menu * );
    void            ApplyFormula();
    void            CancelFormula();
public:
                    SwInputWindow( Window* pParent );
    virtual         ~SwInputWindow();


    void            SelectHdl( ToolBox*);
    virtual void    Show();
    BOOL            IsActive(){ return bActive; };
    DECL_LINK( SelTblCellsNotify, SwWrtShell * );

    void            SetFormula( const String& rFormula, BOOL bDelSel = TRUE );
    const SwView*   GetView() const{return pView;}
};

class SwInputChild : public SfxChildWindow
{
    BOOL            bObjVis;
    SfxDispatcher*  pDispatch;
public:
    SwInputChild( Window* ,
                        USHORT nId,
                        SfxBindings*,
                        SfxChildWinInfo*  );
    ~SwInputChild();
    SFX_DECL_CHILDWINDOW( SwInputChild );
    void            SetFormula( const String& rFormula, BOOL bDelSel = TRUE )
                        { ((SwInputWindow*)pWindow)->SetFormula(
                                    rFormula, bDelSel ); }
    const SwView*   GetView() const{return ((SwInputWindow*)pWindow)->GetView();}

};

//==================================================================

#endif

diff --git a/sw/source/ui/inc/insfnote.hxx b/sw/source/ui/inc/insfnote.hxx
new file mode 100644
index 0000000..9c91d2b
--- /dev/null
+++ b/sw/source/ui/inc/insfnote.hxx
@@ -0,0 +1,125 @@
/*************************************************************************
 *
 *  $RCSfile: insfnote.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:40 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _INSFNOTE_HXX
#define _INSFNOTE_HXX

#ifndef _SVX_STDDLG_HXX //autogen
#include <svx/stddlg.hxx>
#endif

#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif

#ifndef _EDIT_HXX //autogen
#include <vcl/edit.hxx>
#endif

#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif


class SwWrtShell;

class SwInsFootNoteDlg: public SvxStandardDialog
{
    SwWrtShell     &rSh;

    //Alles fuer das/die Zeichen
    String          aFontName;
    CharSet         eCharSet;
    char            cExtChar;
    BOOL            bExtCharAvailable;
    BOOL            bEdit;
    RadioButton     aNumberAutoBtn;
    RadioButton     aNumberCharBtn;
    Edit            aNumberCharEdit;
    PushButton      aNumberExtChar;
    GroupBox        aNumberFrm;

    //Alles fuer die Auswahl Fussnote/Endnote
    RadioButton     aFtnBtn;
    RadioButton     aEndNoteBtn;
    GroupBox        aTypeBox;

    OKButton        aOkBtn;
    CancelButton    aCancelBtn;
    HelpButton      aHelpBtn;
    ImageButton     aPrevBT;
    ImageButton     aNextBT;

    DECL_LINK( NumberCharHdl, Button * );
    DECL_LINK( NumberEditHdl, void * );
    DECL_LINK( NumberAutoBtnHdl, Button *);
    DECL_LINK( NumberExtCharHdl, Button *);
    DECL_LINK( NextPrevHdl, Button * );

    virtual void    Apply();

    void            Init();

public:
    SwInsFootNoteDlg(Window * pParent, SwWrtShell &rSh, BOOL bEd = FALSE);
    ~SwInsFootNoteDlg();
};

#endif
diff --git a/sw/source/ui/inc/insrc.hxx b/sw/source/ui/inc/insrc.hxx
new file mode 100644
index 0000000..1414cc0
--- /dev/null
+++ b/sw/source/ui/inc/insrc.hxx
@@ -0,0 +1,125 @@
/*************************************************************************
 *
 *  $RCSfile: insrc.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:40 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _INSRC_HXX
#define _INSRC_HXX

#ifndef _SVX_STDDLG_HXX //autogen
#include <svx/stddlg.hxx>
#endif

#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif

#ifndef _FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif

#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif

#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif

#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif

#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif

#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif

class SwView;
class SwInsRowColDlg : public SvxStandardDialog
{
    FixedText       aCount;
    NumericField    aCountEdit;
    GroupBox        aInsGrp;

    RadioButton     aBeforeBtn;
    RadioButton     aAfterBtn;
    GroupBox        aPosGrp;

    String          aRow;
    String          aCol;

    OKButton        aOKBtn;
    CancelButton    aCancelBtn;
    HelpButton      aHelpBtn;

    SwView&         rView;
    BOOL            bColumn;

protected:
    virtual void Apply();

public:
    SwInsRowColDlg( SwView& rView, BOOL bCol );
};

#endif

diff --git a/sw/source/ui/inc/insrule.hxx b/sw/source/ui/inc/insrule.hxx
new file mode 100644
index 0000000..8f59642
--- /dev/null
+++ b/sw/source/ui/inc/insrule.hxx
@@ -0,0 +1,105 @@
/*************************************************************************
 *
 *  $RCSfile: insrule.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:40 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _INSRULE_HXX
#define _INSRULE_HXX

#ifndef _NUM_HXX
#include "num.hxx"
#endif

class SwDocShell;

class SwRulerValueSet;
class ValueSet;
/*-----------------14.02.97 12.30-------------------

--------------------------------------------------*/
class SwInsertGrfRulerDlg  : public SfxModalDialog
{
    GroupBox        aSelectionGB;
    OKButton        aOkPB;
    CancelButton    aCancelPB;
    HelpButton      aHelpPB;

    List            aGrfNames;
    String          sSimple;

    USHORT          nSelPos;

    SwRulerValueSet* pExampleVS;

protected:
    DECL_LINK(SelectHdl, ValueSet*);
    DECL_LINK(DoubleClickHdl, ValueSet*);

public:
    SwInsertGrfRulerDlg( Window* pParent, SwDocShell* pDocSh );
    ~SwInsertGrfRulerDlg();

    String          GetGraphicName();
    BOOL            IsSimpleLine() {return nSelPos == 1;}
    BOOL            HasImages() const {return 0 != aGrfNames.Count();}
};

#endif



diff --git a/sw/source/ui/inc/instable.hxx b/sw/source/ui/inc/instable.hxx
new file mode 100644
index 0000000..9539157
--- /dev/null
+++ b/sw/source/ui/inc/instable.hxx
@@ -0,0 +1,127 @@
/*************************************************************************
 *
 *  $RCSfile: instable.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:40 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _INSTABLE_HXX
#define _INSTABLE_HXX


#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif
#ifndef _FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif
#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif
#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif
#ifndef _EDIT_HXX //autogen
#include <vcl/edit.hxx>
#endif
#ifndef _BASEDLGS_HXX //autogen
#include <sfx2/basedlgs.hxx>
#endif
#ifndef _ACTCTRL_HXX
#include <actctrl.hxx>
#endif
class SwWrtShell;
class SwTableAutoFmt;

class SwInsTableDlg : public SfxModalDialog
{
    TableNameEdit   aNameEdit;
    GroupBox        aNameFrm;
    FixedText       aColLbl;
    NumericField    aColEdit;
    FixedText       aRowLbl;
    NumericField    aRowEdit;

    CheckBox        aHeaderCB;
    CheckBox        aRepeatHeaderCB;
    CheckBox        aDontSplitCB;
    CheckBox        aBorderCB;
    GroupBox        aOptionsGB;

    GroupBox        aFrm;
    OKButton        aOkBtn;
    CancelButton    aCancelBtn;
    HelpButton      aHelpBtn;
    PushButton      aAutoFmtBtn;

    SwWrtShell*     pShell;
    SwTableAutoFmt* pTAutoFmt;

    DECL_LINK( ModifyName, Edit * );
    DECL_LINK( ModifyRowCol, NumericField * );
    DECL_LINK( AutoFmtHdl, PushButton* );
    DECL_LINK( CheckBoxHdl, CheckBox *pCB = 0 );

public:
    SwInsTableDlg( SwView& rView );
    ~SwInsTableDlg();

    void GetValues( String& rName, USHORT& rRow, USHORT& rCol,
                    USHORT& rInsTblFlags,
                    SwTableAutoFmt *& prTAFmt );
};

#endif
diff --git a/sw/source/ui/inc/itemdef.hxx b/sw/source/ui/inc/itemdef.hxx
new file mode 100644
index 0000000..f655af2
--- /dev/null
+++ b/sw/source/ui/inc/itemdef.hxx
@@ -0,0 +1,73 @@
/*************************************************************************
 *
 *  $RCSfile: itemdef.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:40 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef ITEMDEF_HXX
#define ITEMDEF_HXX


#ifndef _SFXMSG_HXX //autogen
#include <sfx2/msg.hxx>
#endif

SFX_DECL_TYPE(10); //SwElemItem
SFX_DECL_TYPE(13); //SwAddPrinterItem
SFX_DECL_TYPE(16); //SwDocDisplayItem

#endif
diff --git a/sw/source/ui/inc/javaedit.hxx b/sw/source/ui/inc/javaedit.hxx
new file mode 100644
index 0000000..5afac53
--- /dev/null
+++ b/sw/source/ui/inc/javaedit.hxx
@@ -0,0 +1,144 @@
/*************************************************************************
 *
 *  $RCSfile: javaedit.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:40 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SW_JAVAEDIT_HXX
#define _SW_JAVAEDIT_HXX

// include ---------------------------------------------------------------

#ifndef _SVX_STDDLG_HXX //autogen
#include <svx/stddlg.hxx>
#endif

#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif

#ifndef VCL
#ifndef _EDIT_HXX //autogen
#include <vcl/edit.hxx>
#endif
#else
#ifndef _SV_SVMEDIT_HXX //autogen
#include <svtools/svmedit.hxx>
#endif
#endif

#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif

#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif

#ifndef _IMAGEBTN_HXX //autogen
#include <vcl/imagebtn.hxx>
#endif

class SwWrtShell;
class SwFldMgr;
class SwScriptField;

// class SwJavaEditDialog -------------------------------------------------

class SwJavaEditDialog : public SvxStandardDialog
{
public:
    SwJavaEditDialog(Window* pParent, SwWrtShell* pWrtSh);
    ~SwJavaEditDialog();

private:
    FixedText           aTypeFT;
    Edit                aTypeED;
    RadioButton         aUrlRB;
    RadioButton         aEditRB;
    PushButton          aUrlPB;
    Edit                aUrlED;
    MultiLineEdit       aEditED;
    GroupBox            aPostItGB;

    OKButton            aOKBtn;
    CancelButton        aCancelBtn;
    ImageButton         aPrevBtn;
    ImageButton         aNextBtn;
    HelpButton          aHelpBtn;

    BOOL                bNew;

    SwScriptField*      pFld;
    SwFldMgr*           pMgr;
    SwWrtShell*         pSh;

    DECL_LINK( OKHdl, Button* );
    DECL_LINK( PrevHdl, Button* );
    DECL_LINK( NextHdl, Button* );
    DECL_LINK( RadioButtonHdl, RadioButton* pBtn );
    DECL_LINK( InsertFileHdl, PushButton * );

    virtual void    Apply();

    void            CheckTravel();
    void            SetFld();
};


#endif

diff --git a/sw/source/ui/inc/label.hxx b/sw/source/ui/inc/label.hxx
new file mode 100644
index 0000000..8660d82
--- /dev/null
+++ b/sw/source/ui/inc/label.hxx
@@ -0,0 +1,136 @@
/*************************************************************************
 *
 *  $RCSfile: label.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:40 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _LABEL_HXX
#define _LABEL_HXX

#ifndef _SVSTDARR_HXX
#define _SVSTDARR_STRINGSDTOR
#define _SVSTDARR_USHORTS
#include <svtools/svstdarr.hxx>
#endif

#ifndef _SFXTABDLG_HXX //autogen
#include <sfx2/tabdlg.hxx>
#endif
#ifndef _COM_SUN_STAR_FRAME_XMODEL_HPP_
#include <com/sun/star/frame/XModel.hpp>
#endif

class SwLabRec;
class SwLabRecs;
class SwLabItem;
class SwLabPrtPage;
class SwNewDBMgr;
class Printer;

class SwLabDlg : public SfxTabDialog
{
    SwNewDBMgr*     pNewDBMgr;
    SwLabPrtPage*   pPrtPage;

    SvUShorts       aTypeIds;
    SvStringsDtor   aMakes;

    SwLabRecs*      pRecs;
    String          aLstGroup;
    String          sBusinessCardDlg;
    String          sFormat;
    String          sMedium;
    BOOL            m_bLabel;
    void          _ReplaceGroup( const String &rMake, SwLabItem *pItem );

    virtual void PageCreated( USHORT nId, SfxTabPage &rPage );
public:

     SwLabDlg( Window* pParent, const SfxItemSet& rSet,
                 SwNewDBMgr* pNewDBMgr, BOOL bLabel);
    ~SwLabDlg();

    void MakeConfigItem(SwLabItem& rItem) const;

    SwLabRec*   GetRecord(const String &rRecName, BOOL bCont);
    void        GetLabItem(SwLabItem &rItem);

          SwLabRecs &Recs()           { return *pRecs;   }
    const SwLabRecs &Recs()     const { return *pRecs;   }

          SvUShorts  &TypeIds()       { return aTypeIds; }
    const SvUShorts  &TypeIds() const { return aTypeIds; }

          SvStringsDtor  &Makes()         { return aMakes;   }
    const SvStringsDtor  &Makes()   const { return aMakes;   }

    Printer *GetPrt();
    inline void ReplaceGroup( const String &rMake, SwLabItem *pItem );
    static void UpdateFieldInformation(::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel>& xModel,
                                                                                const SwLabItem& rItem);
    const String& GetBusinessCardStr() const {return sBusinessCardDlg;}

};

inline void SwLabDlg::ReplaceGroup( const String &rMake, SwLabItem *pItem )
{
    if ( rMake != aLstGroup )
        _ReplaceGroup( rMake, pItem );
}

#endif

diff --git a/sw/source/ui/inc/labimg.hxx b/sw/source/ui/inc/labimg.hxx
new file mode 100644
index 0000000..432d5d2
--- /dev/null
+++ b/sw/source/ui/inc/labimg.hxx
@@ -0,0 +1,176 @@
/*************************************************************************
 *
 *  $RCSfile: labimg.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:40 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _LABIMG_HXX
#define _LABIMG_HXX

#ifndef _SFXPOOLITEM_HXX //autogen
#include <svtools/poolitem.hxx>
#endif

#ifndef _SFXCFGITEM_HXX //autogen
#include <sfx2/cfgitem.hxx>
#endif

#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif

// class SwLabItem ----------------------------------------------------------

class SwLabItem : public SfxPoolItem
{
public:

    SwLabItem();
    SwLabItem(const SwLabItem& rItem);

    SwLabItem& operator =(const SwLabItem& rItem);

    virtual int operator ==(const SfxPoolItem& rItem) const;

    virtual SfxPoolItem*     Clone(SfxItemPool* = 0) const;

    int  Load (SvStream& rStrm, USHORT nVersion, BOOL bLabel);
    BOOL Store(SvStream& rStrm, BOOL bLabel);

    String aLstMake; //Letzte Auswahl merken.
    String aLstType;
    String sDBName;  // Verwendete Datenbank

    String aWriting; // Aufschrift
    String aMake;    // Etikettenmarke
    String aType;    // Etikettentyp
    String aBin;     // Druckerschacht
    long   lHDist;   // Horizontaler Abstand   (Benutzer)
    long   lVDist;   // Vertikaler Abstand     (Benutzer)
    long   lWidth;   // Breite                 (Benutzer)
    long   lHeight;  // Hoehe                  (Benutzer)
    long   lLeft;    // Rand links             (Benutzer)
    long   lUpper;   // Rand oben              (Benutzer)
    USHORT nCols;    // Anzahl Spalten         (Benutzer)
    USHORT nRows;    // Anzahl Zeilen          (Benutzer)
    USHORT nCol;     // Spalte fuer Einzeldruck
    USHORT nRow;     // Zeile fuer Einzeldruck
    BOOL   bAddr  :1;// Adresse als Aufschrift?
    BOOL   bCont  :1;// Endlospapier?
    BOOL   bPage  :1;// Ganze Seite oder einzelnes Etikett?
    BOOL   bSynchron:1;// Alle Etiketten synchronisieren

    //parts of the business card
    String  aPrivFirstName;
    String  aPrivName;
    String  aPrivShortCut;
    String  aPrivFirstName2;
    String  aPrivName2;
    String  aPrivShortCut2;
    String  aPrivStreet;
    String  aPrivZip;
    String  aPrivCity;
    String  aPrivCountry;
    String  aPrivState;
    String  aPrivTitle;
    String  aPrivProfession;
    String  aPrivPhone;
    String  aPrivMobile;
    String  aPrivFax;
    String  aPrivWWW;
    String  aPrivMail;
    String  aCompCompany;
    String  aCompCompanyExt;
    String  aCompSlogan;
    String  aCompStreet;
    String  aCompZip;
    String  aCompCity;
    String  aCompCountry;
    String  aCompState;
    String  aCompPosition;
    String  aCompPhone;
    String  aCompMobile;
    String  aCompFax;
    String  aCompWWW;
    String  aCompMail;

    String  sGlossaryGroup;
    String  sGlossaryBlockName;
};

// class SwLabCfgItem -------------------------------------------------------

class SwLabCfgItem : public SfxConfigItem
{
    SwLabItem aLabItem;
    SwLabItem aBusinessItem;
protected:
    virtual int  Load (SvStream& rStrm);
    virtual BOOL Store(SvStream& rStrm);
    virtual void UseDefault();

public:
    SwLabCfgItem();

    SwLabItem&      GetLabItem() {return aLabItem;}
    SwLabItem&      GetBusinessItem() {return aBusinessItem;}
    virtual String  GetName() const;
};

#endif

diff --git a/sw/source/ui/inc/linenum.hxx b/sw/source/ui/inc/linenum.hxx
new file mode 100644
index 0000000..8e7a408
--- /dev/null
+++ b/sw/source/ui/inc/linenum.hxx
@@ -0,0 +1,158 @@
/*************************************************************************
 *
 *  $RCSfile: linenum.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:40 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWLINENUM_HXX
#define _SWLINENUM_HXX

#ifndef _BASEDLGS_HXX //autogen
#include <sfx2/basedlgs.hxx>
#endif

#ifndef _SFXTABDLG_HXX //autogen
#include <sfx2/tabdlg.hxx>
#endif

#ifndef _SV_FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif

#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif

#ifndef _SV_FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif

#ifndef _LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif

class Window;
class SfxItemSet;
class SwView;
class SwWrtShell;

/*--------------------------------------------------------------------
   Beschreibung: SingleTabDialog
 --------------------------------------------------------------------*/

class SwLineNumberingDlg : public SfxSingleTabDialog
{
    SwWrtShell* pSh;

    DECL_LINK( OKHdl, Button * );

public:
    inline SwWrtShell* GetWrtShell() const { return pSh; }

     SwLineNumberingDlg(SwView *pVw);
    ~SwLineNumberingDlg();
};

/*--------------------------------------------------------------------
   Beschreibung: TabPage
 --------------------------------------------------------------------*/

class SwLineNumberingPage : public SfxTabPage
{
    CheckBox        aNumberingOnCB;
    FixedText       aCharStyleFT;
    ListBox         aCharStyleLB;
    FixedText       aFormatFT;
    ListBox         aFormatLB;
    FixedText       aPosFT;
    ListBox         aPosLB;
    FixedText       aOffsetFT;
    MetricField     aOffsetMF;
    FixedText       aNumIntervalFT;
    NumericField    aNumIntervalNF;
    FixedText       aNumRowsFT;
    GroupBox        aDisplayGB;
    FixedText       aDivisorFT;
    Edit            aDivisorED;
    FixedText       aDivIntervalFT;
    NumericField    aDivIntervalNF;
    FixedText       aDivRowsFT;
    GroupBox        aDivisorGB;
    CheckBox        aCountEmptyLinesCB;
    CheckBox        aCountFrameLinesCB;
    CheckBox        aRestartEachPageCB;
    GroupBox        aCountGB;

    SwWrtShell*     pSh;

    SwLineNumberingPage( Window* pParent, const SfxItemSet& rSet );
    ~SwLineNumberingPage();

    DECL_LINK( LineOnOffHdl, CheckBox *pCB = 0 );
    DECL_LINK( ModifyHdl, Edit *pED = 0 );

public:

    static SfxTabPage*  Create( Window* pParent, const SfxItemSet& rAttrSet );

    virtual BOOL        FillItemSet( SfxItemSet& rSet );
    virtual void        Reset( const SfxItemSet& rSet );
};

#endif


diff --git a/sw/source/ui/inc/listsh.hxx b/sw/source/ui/inc/listsh.hxx
new file mode 100644
index 0000000..a963517
--- /dev/null
+++ b/sw/source/ui/inc/listsh.hxx
@@ -0,0 +1,78 @@
/*************************************************************************
 *
 *  $RCSfile: listsh.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:40 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWLISTSH_HXX
#define _SWLISTSH_HXX

#include "basesh.hxx"

class SwListShell: public SwBaseShell
{
public:
    SFX_DECL_INTERFACE(SW_LISTSHELL);
    TYPEINFO();

            SwListShell(SwView &rView);

    void    Execute(SfxRequest &);
    void    GetState(SfxItemSet &);
};

#endif
diff --git a/sw/source/ui/inc/macassgn.hxx b/sw/source/ui/inc/macassgn.hxx
new file mode 100644
index 0000000..dc14743
--- /dev/null
+++ b/sw/source/ui/inc/macassgn.hxx
@@ -0,0 +1,96 @@
/*************************************************************************
 *
 *  $RCSfile: macassgn.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:41 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _MACASSGN_HXX
#define _MACASSGN_HXX

#ifndef _MACROPG_HXX //autogen
#include <sfx2/macropg.hxx>
#endif

class SwWrtShell;
class SvxMacroItem;

enum DlgEventType
{
    MACASSGN_TEXTBAUST,
    MACASSGN_GRAPHIC,
    MACASSGN_OLE,
    MACASSGN_FRMURL,
    MACASSGN_INETFMT,
    MACASSGN_ALLFRM
};

class SwMacroAssignDlg : public SfxMacroAssignDlg
{
public:
    SwMacroAssignDlg( Window* pParent, SfxItemSet& rSet, DlgEventType eType );
    virtual ~SwMacroAssignDlg();

    static void AddEvents( SfxSmallMacroTabPage& rPg, DlgEventType eType );
    static BOOL INetFmtDlg( Window* pParent, SwWrtShell& rSh,
                            SvxMacroItem*& rpINetItem );
};




#endif

diff --git a/sw/source/ui/inc/mailmrge.hxx b/sw/source/ui/inc/mailmrge.hxx
new file mode 100644
index 0000000..1b6271e
--- /dev/null
+++ b/sw/source/ui/inc/mailmrge.hxx
@@ -0,0 +1,178 @@
/*************************************************************************
 *
 *  $RCSfile: mailmrge.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:41 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _MAILMRGE_HXX
#define _MAILMRGE_HXX

#ifndef _SVX_STDDLG_HXX //autogen
#include <svx/stddlg.hxx>
#endif

#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif

#ifndef _FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif

#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif

#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif

#ifndef _EDIT_HXX //autogen
#include <vcl/edit.hxx>
#endif

#ifndef _LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif

class SwWrtShell;
class SbaObject;
class SbaSelectionListRef;
class SwModuleOptions;

class SwMailMergeDlg : public SvxStandardDialog
{
    RadioButton     aAllRB;
    RadioButton     aMarkedRB;
    RadioButton     aFromRB;
    NumericField    aFromNF;
    FixedText       aBisFT;
    NumericField    aToNF;
    GroupBox        aRecordGB;

    RadioButton     aPrinterRB;
    RadioButton     aMailingRB;
    RadioButton     aFileRB;

    CheckBox        aSingleJobsCB;

    FixedText       aPathFT;
    Edit            aPathED;
    PushButton      aPathPB;
    FixedText       aFilenameFT;
    RadioButton     aColumnRB;
    RadioButton     aFilenameRB;
    ListBox         aColumnLB;
    Edit            aFilenameED;

    FixedText       aAddressFT;
    ListBox         aAddressFldLB;
    FixedText       aSubjectFT;
    Edit            aSubjectED;
    FixedText       aFormatFT;
    FixedText       aAttachFT;
    Edit            aAttachED;
    PushButton      aAttachPB;
    CheckBox        aFormatHtmlCB;
    CheckBox        aFormatRtfCB;
    CheckBox        aFormatSwCB;
    GroupBox        aDestGB;

    OKButton        aOkBTN;
    CancelButton    aCancelBTN;
    HelpButton      aHelpBTN;

    SwWrtShell*     pSh;
#ifdef REPLACE_OFADBMGR
#else
    SbaObject*      pSbaObject;
#endif
    SwModuleOptions* pModOpt;
    const String&   rDBName;
#ifdef REPLACE_OFADBMGR
    const String&   rTableName;
#endif
    const String&   rStatement;
    SbaSelectionListRef& rSelectionList;

    USHORT          nMergeType;

    DECL_LINK( ButtonHdl, Button* pBtn );
    DECL_LINK( InsertPathHdl, PushButton * );
    DECL_LINK( AttachFileHdl, PushButton * );
    DECL_LINK( RadioButtonHdl, RadioButton* pBtn );
    DECL_LINK( FilenameHdl, RadioButton* pBtn );
    DECL_LINK( ModifyHdl, NumericField* pLB );

    virtual void    Apply();
    void            ExecQryShell(BOOL bVisible);

public:

     SwMailMergeDlg(Window* pParent, SwWrtShell* pSh,
         const String& rName,
#ifdef REPLACE_OFADBMGR
        const String& rTblName,
#endif
                        const String& rStat, SbaSelectionListRef& pSelList);
    ~SwMailMergeDlg();

    inline USHORT   GetMergeType() { return nMergeType; }
};

#endif

diff --git a/sw/source/ui/inc/makefile.mk b/sw/source/ui/inc/makefile.mk
new file mode 100644
index 0000000..221888a
--- /dev/null
+++ b/sw/source/ui/inc/makefile.mk
@@ -0,0 +1,61 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:41 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************
diff --git a/sw/source/ui/inc/mergetbl.hxx b/sw/source/ui/inc/mergetbl.hxx
new file mode 100644
index 0000000..ef84817
--- /dev/null
+++ b/sw/source/ui/inc/mergetbl.hxx
@@ -0,0 +1,94 @@
/*************************************************************************
 *
 *  $RCSfile: mergetbl.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:41 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _MERGETBL_HXX
#define _MERGETBL_HXX

#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif
#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif
#ifndef _SVX_STDDLG_HXX //autogen
#include <svx/stddlg.hxx>
#endif


class SwMergeTblDlg : public SvxStandardDialog
{
    OKButton        aOKPB;
    CancelButton    aCancelPB;
    HelpButton      aHelpPB;
    GroupBox        aMergeGB;
    RadioButton     aMergePrevRB;
    RadioButton     aMergeNextRB;

    BOOL&           rMergePrev;
protected:
    virtual void Apply();

public:
    SwMergeTblDlg( Window *pParent, BOOL& rWithPrev );
};

#endif


diff --git a/sw/source/ui/inc/misc.hrc b/sw/source/ui/inc/misc.hrc
new file mode 100644
index 0000000..657d6f3
--- /dev/null
+++ b/sw/source/ui/inc/misc.hrc
@@ -0,0 +1,142 @@
/*************************************************************************
 *
 *  $RCSfile: misc.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:41 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _MISC_HRC
#define _MISC_HRC

#include "rcid.hrc"

#define DLG_QUERY_DELETE            (RC_MISC_BEGIN + 2)

#define DLG_MASTERDOC_PAGE          (RC_MISC_BEGIN + 3)
#define DLG_QUERY_ADD               (RC_MISC_BEGIN + 4)

#define STR_GLOSSARY_BIB_DLG        (RC_MISC_BEGIN + 5)
#define STR_DOCUMENT_BIB_DLG        (RC_MISC_BEGIN + 6)

#define WIN_GLOBAL_DOC              (RC_MISC_BEGIN + 7)
#define DLG_GLOBAL_DOC_OPTION       (RC_MISC_BEGIN + 8)
#define DLG_NUMBERING               (RC_MISC_BEGIN + 9)
#define DLG_ZOOM                    (RC_MISC_BEGIN + 10)
#define DLG_GLOSSARY                (RC_MISC_BEGIN + 11)
#define DLG_INS_FOOTNOTE            (RC_MISC_BEGIN + 12)
#define DLG_DOC_FOOTNOTE            (RC_MISC_BEGIN + 13)
#define DLG_PG_FOOTNOTE             (RC_MISC_BEGIN + 14)
#define DLG_NUMBERING_OUTLINE       (RC_MISC_BEGIN + 15)
#define DLG_BIB_BASE                (RC_MISC_BEGIN + 16)
#define DLG_INSERT_BOOKMARK         (RC_MISC_BEGIN + 17)
#define DLG_NUM_NAMES               (RC_MISC_BEGIN + 18)
#define DLG_SORTING                 (RC_MISC_BEGIN + 19)
#define DLG_CHARMAP                 (RC_MISC_BEGIN + 20)
#define DLG_AUTOCORR                (RC_MISC_BEGIN + 23)
#define DLG_AUTOFMT_OPT             (RC_MISC_BEGIN + 24)
#define DLG_RENAME_GLOS             (RC_MISC_BEGIN + 25)
#define DLG_AUTOFMT_TAB             (RC_MISC_BEGIN + 26)
#define DLG_PRCNT_SET               (RC_MISC_BEGIN + 27)
#define DLG_INSERT_RULER            (RC_MISC_BEGIN + 28)
#define DLG_REDLINE_ACCEPT          (RC_MISC_BEGIN + 29)
#define DLG_SEL_TEMPLATE            (RC_MISC_BEGIN + 30)
#define DLG_TAB_OUTLINE             (RC_MISC_BEGIN + 31)
#define DLG_MOD_REDLINE_ACCEPT      (RC_MISC_BEGIN + 32)


#define MSG_DOUBLE_SHORTNAME        (RC_MISC_BEGIN + 30)
#define MSG_QUERY_DELETE            (RC_MISC_BEGIN + 31)
#define STR_QUERY_DELETE_GROUP1     (RC_MISC_BEGIN + 32)
#define STR_QUERY_DELETE_GROUP2     (RC_MISC_BEGIN + 33)
#define MSG_NO_GLOSSARIES           (RC_MISC_BEGIN + 34)

#define BMP_ROOT_CLOSED             (RC_MISC_BEGIN + 35)
#define BMP_ROOT_OPENED             (RC_MISC_BEGIN + 36)

#define MSG_BLOCK_CREATE_ERR        (RC_MISC_BEGIN + 40)
#define MSG_BLOCK_DELETE_ERR        (RC_MISC_BEGIN + 41)
#define MSG_SRTERR                  (RC_MISC_BEGIN + 42)

#define STR_GLOSSARY                (RC_MISC_BEGIN + 43)
#define STR_CHANGE_START            (RC_MISC_BEGIN + 44)
#define STR_CHANGE_END              (RC_MISC_BEGIN + 45)
#define STR_SAVE_GLOSSARY           (RC_MISC_BEGIN + 46)

#define STR_FULLNUMS_START          (RC_MISC_BEGIN + 47)
#define STR_FULLNUMS_1              (STR_FULLNUMS_START )
#define STR_FULLNUMS_2              (STR_FULLNUMS_START + 1)
#define STR_FULLNUMS_3              (STR_FULLNUMS_START + 2)
#define STR_FULLNUMS_4              (STR_FULLNUMS_START + 3)
#define STR_FULLNUMS_5              (STR_FULLNUMS_START + 4)
#define STR_FULLNUMS_6              (STR_FULLNUMS_START + 5)
#define STR_FULLNUMS_7              (STR_FULLNUMS_START + 6)
#define STR_FULLNUMS_8              (STR_FULLNUMS_START + 7)

#define STR_BULLET_THEME            (RC_MISC_BEGIN + 55)
#define MSG_NO_BULLETS              (RC_MISC_BEGIN + 56)

#define STR_NUMRULE_UNKNOWN         (RC_MISC_BEGIN + 60)
#define MN_REDLINE_POPUP            (RC_MISC_BEGIN + 61)
#define STR_REMOVE_WARNING          (RC_MISC_BEGIN + 62)

#define MISC_ACT_END                STR_REMOVE_WARNING

#if MISC_ACT_END > RC_MISC_END
#error Resource-Id Ueberlauf in #file, #line
#endif

#endif  // _MISC_HRC
diff --git a/sw/source/ui/inc/multmrk.hxx b/sw/source/ui/inc/multmrk.hxx
new file mode 100644
index 0000000..917c3d05b
--- /dev/null
+++ b/sw/source/ui/inc/multmrk.hxx
@@ -0,0 +1,119 @@
/*************************************************************************
 *
 *  $RCSfile: multmrk.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:41 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _MULTMRK_HXX
#define _MULTMRK_HXX


#ifndef _SVX_STDDLG_HXX //autogen
#include <svx/stddlg.hxx>
#endif

#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif

#ifndef _STDCTRL_HXX //autogen
#include <svtools/stdctrl.hxx>
#endif

#ifndef _LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif

#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif

#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif

class SwTOXMgr;

/*--------------------------------------------------------------------
     Beschreibung:  Markierung fuer Verzeichniseintrag einfuegen
 --------------------------------------------------------------------*/

class SwMultiTOXMarkDlg : public SvxStandardDialog
{
    DECL_LINK( SelectHdl, ListBox * );

    FixedText           aEntryFT;
    FixedInfo           aTextFT;
    FixedText           aTOXFT;
    ListBox             aTOXLB;
    GroupBox            aTOXGB;
    OKButton            aOkBT;
    CancelButton        aCancelBT;

    SwTOXMgr           &rMgr;
    USHORT              nPos;

    void                Apply();
public:
    SwMultiTOXMarkDlg( Window* pParent, SwTOXMgr &rTOXMgr );
    ~SwMultiTOXMarkDlg();
};


#endif // _MULTMRK_HXX

diff --git a/sw/source/ui/inc/navicfg.hxx b/sw/source/ui/inc/navicfg.hxx
new file mode 100644
index 0000000..50ff218
--- /dev/null
+++ b/sw/source/ui/inc/navicfg.hxx
@@ -0,0 +1,154 @@
/*************************************************************************
 *
 *  $RCSfile: navicfg.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:41 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _NAVICFG_HXX
#define _NAVICFG_HXX

#ifndef _UTL_CONFIGITEM_HXX_
#include <unotools/configitem.hxx>
#endif
/* -----------------------------08.09.00 16:27--------------------------------

 ---------------------------------------------------------------------------*/
class SwNavigationConfig : public utl::ConfigItem
{
    sal_Int32   nRootType;      //RootType
    sal_Int32   nSelectedPos;   //SelectedPosition
    sal_Int32   nOutlineLevel;  //OutlineLevel
    sal_Int32   nRegionMode;    //InsertMode
    sal_Int32   nActiveBlock;   //ActiveBlock//Expand/CollapsState
    sal_Bool    bIsSmall;       //ShowListBox
    sal_Bool    bIsGlobalActive; //GlobalDocMode// Globalansicht fuer GlobalDoc gueltig?

    com::sun::star::uno::Sequence<rtl::OUString> GetPropertyNames();

public:
    SwNavigationConfig();
    ~SwNavigationConfig();

    virtual void            Commit();

    sal_Int32   GetRootType()const {return nRootType;}
    void        SetRootType(sal_Int32 nSet){
                        if(nRootType != nSet)
                        {
                            SetModified();
                            nRootType = nSet;
                        }
                    }

    sal_Int32   GetSelectedPos()const {return nSelectedPos;}
    void        SetSelectedPos(sal_Int32 nSet){
                        if(nSelectedPos != nSet)
                        {
                            SetModified();
                            nSelectedPos = nSet;
                        }
                    }


    sal_Int32   GetOutlineLevel()const {return nOutlineLevel;}
    void        SetOutlineLevel(sal_Int32 nSet){
                        if(nOutlineLevel != nSet)
                        {
                            SetModified();
                            nOutlineLevel = nSet;
                        }
                    }

    sal_Int32   GetRegionMode()const {return nRegionMode;}
    void        SetRegionMode(sal_Int32 nSet){
                    if(nRegionMode != nSet)
                    {
                        SetModified();
                        nRegionMode = nSet;
                    }
                }


    sal_Int32   GetActiveBlock()const {return nActiveBlock;}
    void        SetActiveBlock(sal_Int32 nSet){
                        if(nActiveBlock != nSet)
                        {
                            SetModified();
                            nActiveBlock = nSet;
                        }
                    }

    sal_Bool    IsSmall() const {return bIsSmall;}
    void        SetSmall(sal_Bool bSet){
                        if(bIsSmall != bSet)
                        {
                            SetModified();
                            bIsSmall = bSet;
                        }
                    }

    sal_Bool    IsGlobalActive() const {return bIsGlobalActive;}
    void        SetGlobalActive(sal_Bool bSet){
                        if(bIsGlobalActive != bSet)
                        {
                            SetModified();
                            bIsGlobalActive = bSet;
                        }
                    }
};
#endif

diff --git a/sw/source/ui/inc/navicont.hxx b/sw/source/ui/inc/navicont.hxx
new file mode 100644
index 0000000..d273c1e
--- /dev/null
+++ b/sw/source/ui/inc/navicont.hxx
@@ -0,0 +1,112 @@
/*************************************************************************
 *
 *  $RCSfile: navicont.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:41 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _NAVICONT_HXX
#define _NAVICONT_HXX


#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif
class SwDocShell;
class SotDataObject;

/*-----------------06.02.97 19.10-------------------

--------------------------------------------------*/


class NaviContentBookmark

/*  [Beschreibung]

    Navigator-Bookmark zur eindeutigen Identifizierung im Sw

*/

{
    String          aUrl;       // URL inkl. Sprungmarke
    String          aDescr;     // Description
    long            nDocSh;     // Adresse der DocShell
    USHORT          nDefDrag;   // Description enthaelt defaultDragType

protected:

public:
                    NaviContentBookmark( const String &rUrl, const String& rDesc,
                                            USHORT nDragType, const SwDocShell* );
                    NaviContentBookmark();

    const String&   GetURL() const { return aUrl; }
    const String&   GetDescription() const { return aDescr; }
    USHORT          GetDefaultDragType() const { return nDefDrag; }
    long            GetDocShell() const {return(nDocSh);}

    static BOOL     DragServerHasFormat( USHORT nItem, const SwDocShell* pDocSh );
    static ULONG    HasFormat( SotDataObject& rObj );


    BOOL            CopyDragServer() const;
    BOOL            PasteDragServer( USHORT nItem );
    BOOL            Paste( SotDataObject& rObj, ULONG nFormat );
};

#endif
diff --git a/sw/source/ui/inc/navipi.hxx b/sw/source/ui/inc/navipi.hxx
new file mode 100644
index 0000000..73f5002
--- /dev/null
+++ b/sw/source/ui/inc/navipi.hxx
@@ -0,0 +1,235 @@
/*************************************************************************
 *
 *  $RCSfile: navipi.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:41 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _NAVIPI_HXX
#define _NAVIPI_HXX

// INCLUDE ---------------------------------------------------------------

#ifndef _SFXCTRLITEM_HXX //autogen
#include <sfx2/ctrlitem.hxx>
#endif

#ifndef _SFXLSTNER_HXX //autogen
#include <svtools/lstner.hxx>
#endif

#ifndef _LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif

#ifndef _SFX_CHILDWIN_HXX //autogen
#include <sfx2/childwin.hxx>
#endif

#include "conttree.hxx"
#include "popbox.hxx"

class SwWrtShell;
class SwNavigationPI;
class SwNavigationChild;
class SfxBindings;
class NumEditAction;
class SwView;
class SwNavigationConfig;
class SfxObjectShellLock;
class SfxChildWindowContext;

//-----------------------------------------------------------------------

class SwNavHelpToolBox : public SwHelpToolBox
{
    virtual void    MouseButtonDown(const MouseEvent &rEvt);
    virtual void    RequestHelp( const HelpEvent& rHEvt );

    public:
        SwNavHelpToolBox(Window* pParent, const ResId &rResId) :
            SwHelpToolBox(pParent, rResId){}
};


// CLASS -----------------------------------------------------------------
class SwNavigationPI: public Window,
                            public SfxControllerItem, public SfxListener
{
    friend class SwNavigationChild;
    friend class SwContentTree;
    friend class SwGlobalTree;

private:

    SwNavHelpToolBox    aContentToolBox;
    SwHelpToolBox       aGlobalToolBox;
    ImageList           aContentImageList;
    SwContentTree       aContentTree;
    SwGlobalTree        aGlobalTree;
    ListBox             aDocListBox;

    Timer               aPageChgTimer;

    SfxObjectShellLock* pxObjectShell;
    SwView*             pContentView;
    SwWrtShell*         pContentWrtShell;
    SwView*             pActContView;

    SfxChildWindowContext* pContextWin;

    SwNavigationConfig* pConfig;

    String              sContentFileName;
    String              aContextArr[3];
    String              aStatusArr[4];

    Point   aBoxBottomLeft; // Pos., wenn Box unten ist
    long    nDocLBIniHeight;
    long    nWishWidth;
    USHORT  nActMark;
    USHORT  nAutoMarkIdx;
    USHORT  nRegionMode; // 0 - URL, 1 - Bereich mit Link 2 - B. ohne Link
    short   nZoomIn;
    short   nZoomOutInit;
    short   nZoomOut;

    BOOL    bSmallMode :    1;
    BOOL    bIsZoomedIn :   1;
    BOOL    bPageCtrlsVisible : 1;
    BOOL    bGlobalMode : 1;

    SfxBindings &rBindings;

    BOOL _IsZoomedIn() const {return bIsZoomedIn;}
    void _ZoomOut();
    void _ZoomIn();

    void FillBox();
    void MakeMark();

    DECL_LINK( DocListBoxSelectHdl, ListBox * );
    DECL_LINK( ToolBoxSelectHdl, ToolBox * );
    DECL_LINK( ToolBoxClickHdl, ToolBox * );
    DECL_LINK( EditAction, NumEditAction * );
    DECL_LINK( EditGetFocus, NumEditAction * );
    DECL_LINK( DoneLink, SfxPoolItem * );
    DECL_LINK( MenuSelectHdl, Menu * );
    DECL_LINK( ReadOnlyHdl, void * );
    DECL_LINK( ChangePageHdl, Timer* );
    DECL_LINK( PageEditModifyHdl, Edit* );
    void UsePage(SwWrtShell *);

    void MakeVisible();

    virtual SfxChildAlignment
                    CheckAlignment(SfxChildAlignment,SfxChildAlignment);

protected:

    virtual         BOOL Close();
    virtual         void Resize();

    virtual BOOL    Drop( const DropEvent& rEvt);
    virtual BOOL    QueryDrop( DropEvent& rEvt);

    // zum App-Ende rechtzeitig ObjectShellLock loslassen
    virtual void    Notify( SfxBroadcaster& rBC, const SfxHint& rHint );

    NumEditAction&  GetPageEdit();
    BOOL            ToggleTree();
    void            SetGlobalMode(BOOL bSet) {bGlobalMode = bSet;}


public:
    SwNavigationPI(SfxBindings*, SfxChildWindowContext*, Window*);
    ~SwNavigationPI();

    void            GotoPage(); // Seite anspringen; bindbare Funktion

    void            Update() { FillBox(); }
    void            UpdateListBox();
    void            MoveOutline(USHORT nSource, USHORT nTarget, BOOL bWithCilds);
    virtual void    StateChanged( USHORT nSID, SfxItemState eState,
                                            const SfxPoolItem* pState );

    static String   CreateDropFileName(USHORT nItem);
    static void     CleanEntry( String& rEntry );

    USHORT          GetRegionDropMode() const {return nRegionMode;}
    void            SetRegionDropMode(USHORT nNewMode);
    BOOL            IsInDrag() const;

    BOOL            IsGlobalDoc() const;
    BOOL            IsGlobalMode() const {return    bGlobalMode;}

};

class SwNavigationChild : public SfxChildWindowContext
{
protected:
    virtual BOOL    Drop( const DropEvent& rEvt);
    virtual BOOL    QueryDrop( DropEvent& rEvt);
public:
    SwNavigationChild( Window* ,
                        USHORT nId,
                        SfxBindings*,
                        SfxChildWinInfo*  );

    SFX_DECL_CHILDWINDOW_CONTEXT( SwNavigationChild )

};
#endif
diff --git a/sw/source/ui/inc/num.hxx b/sw/source/ui/inc/num.hxx
new file mode 100644
index 0000000..710b359
--- /dev/null
+++ b/sw/source/ui/inc/num.hxx
@@ -0,0 +1,236 @@
/*************************************************************************
 *
 *  $RCSfile: num.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:40 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _NUM_HXX
#define _NUM_HXX


#ifndef _SFXTABDLG_HXX //autogen
#include <sfx2/tabdlg.hxx>
#endif
#ifndef _MENUBTN_HXX //autogen
#include <vcl/menubtn.hxx>
#endif
#ifndef _FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif
#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif
#ifndef _STDCTRL_HXX //autogen
#include <svtools/stdctrl.hxx>
#endif
#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif
#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif
#ifndef _LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif
#ifndef _EDIT_HXX //autogen
#include <vcl/edit.hxx>
#endif
#ifndef _SVX_STDDLG_HXX //autogen
#include <svx/stddlg.hxx>
#endif
#ifndef _NUMPREVW_HXX
#include <numprevw.hxx>
#endif
#ifndef _SVX_NUMPAGES_HXX
#include <svx/numpages.hxx>
#endif
#include "numrule.hxx"
#include "bmpwin.hxx" // BmpWindow

class SwWrtShell;
class SwDocShell;
class SwUiNumRules;
class SwCharFmt;
class SvxBrushItem;
class SwOutlineTabDialog;


/*-----------------13.02.97 14.02-------------------

--------------------------------------------------*/

struct SwBmpItemInfo
{
    SvxBrushItem*   pBrushItem;
    USHORT          nItemId;
};


/*-----------------07.02.97 15.37-------------------

--------------------------------------------------*/
#define NUM_PAGETYPE_BULLET         0
#define NUM_PAGETYPE_SINGLENUM      1
#define NUM_PAGETYPE_NUM            2
#define NUM_PAGETYPE_BMP            3
#define PAGETYPE_USER_START         10



/*-----------------08.02.97 10.48-------------------
    struct aktuelle Numerierung, wird in einem PointerItem
    uebertragen und von allen Tabpages geshared
--------------------------------------------------*/

class SwNumValueSet;
class ValueSet;
class SwBmpNumValueSet;


/*-----------------03.12.97 10:18-------------------

--------------------------------------------------*/
class SwNumPositionTabPage : public SfxTabPage
{
    GroupBox        aLevelGB;
    MultiListBox    aLevelLB;

    GroupBox            aPositionGB;
    FixedText           aAlignFT;
    ListBox             aAlignLB;
    FixedText           aDistBorderFT;
    CheckBox            aRelativeCB;
    MetricField         aDistBorderMF;
    FixedText           aIndentFT;
    MetricField         aIndentMF;
    FixedText           aDistNumFT;
    MetricField         aDistNumMF;
    PushButton          aStandardPB;

    GroupBox            aPreviewGB;
    NumberingPreview    aPreviewWIN;

    SwNumRule*          pActNum;
    SwNumRule*          pSaveNum;
    SwWrtShell*         pWrtSh;

    SwOutlineTabDialog* pOutlineDlg;
    USHORT              nActNumLvl;

    BOOL                bModified           : 1;
    BOOL                bHasChild           : 1;
    BOOL                bPreset             : 1;
    BOOL                bInInintControl     : 1;  //Modify-Fehler umgehen, soll ab 391 behoben sein

//  void                SetMinDist();
    void                InitControls();

    DECL_LINK( LevelHdl, ListBox * );
    DECL_LINK( EditModifyHdl, Edit*);
    DECL_LINK( DistanceHdl, MetricField * );
    DECL_LINK( RelativeHdl, CheckBox * );
    DECL_LINK( StandardHdl, PushButton * );

    public:
        SwNumPositionTabPage(Window* pParent,
                               const SfxItemSet& rSet);
        ~SwNumPositionTabPage();

    virtual void        ActivatePage(const SfxItemSet& rSet);
    virtual int         DeactivatePage(SfxItemSet *pSet);
    virtual BOOL        FillItemSet( SfxItemSet& rSet );
    virtual void        Reset( const SfxItemSet& rSet );

    static SfxTabPage*  Create( Window* pParent,
                                const SfxItemSet& rAttrSet);

    void                SetOutlineTabDialog(SwOutlineTabDialog* pDlg){pOutlineDlg = pDlg;}
    void                SetWrtShell(SwWrtShell* pSh);
#ifdef DEBUG
    void                SetModified(BOOL bRepaint = TRUE);
#else
    void                SetModified(BOOL bRepaint = TRUE)
                            {bModified = TRUE;
                                if(bRepaint)
                                {
                                    aPreviewWIN.SetLevel(nActNumLvl);
                                    aPreviewWIN.Invalidate();
                                }
                            }
#endif
};

class SwSvxNumBulletTabDialog : public SfxTabDialog
{
    SwWrtShell&         rWrtSh;

    String              sRemoveText;
    int                 nRetOptionsDialog;

    protected:
        virtual short   Ok();
        virtual void    PageCreated(USHORT nPageId, SfxTabPage& rPage);
        DECL_LINK(RemoveNumberingHdl, PushButton*);
    public:
        SwSvxNumBulletTabDialog(Window* pParent,
                    const SfxItemSet* pSwItemSet,
                    SwWrtShell &);
        ~SwSvxNumBulletTabDialog();
};
#endif // _NUM_CXX

diff --git a/sw/source/ui/inc/numfmtlb.hxx b/sw/source/ui/inc/numfmtlb.hxx
new file mode 100644
index 0000000..2a050a9
--- /dev/null
+++ b/sw/source/ui/inc/numfmtlb.hxx
@@ -0,0 +1,116 @@
/*************************************************************************
 *
 *  $RCSfile: numfmtlb.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:41 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWNUMFMTLB_HXX
#define _SWNUMFMTLB_HXX

#ifndef _SV_LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif

#ifndef _ZFORLIST_HXX //autogen
#include <svtools/zforlist.hxx>
#endif

class SwView;

class NumFormatListBox : public ListBox
{
    short               nCurrFormatType;
    USHORT              nStdEntry;
    BOOL                bOneArea;
    ULONG               nDefFormat;
    SwView*             pVw;
    SvNumberFormatter*  pOwnFormatter;
    LanguageType        eCurLanguage;

    DECL_LINK( SelectHdl, ListBox * );

    double          GetDefValue(SvNumberFormatter* pFormatter, const short nFormatType) const;
    void            Init(short nFormatType, BOOL bUsrFmts);
    SwView*         GetView();

public:
    NumFormatListBox( Window* pWin, const ResId& rResId,
        short nFormatType = NUMBERFORMAT_NUMBER, ULONG nDefFmt = 0,
        BOOL bUsrFmts = TRUE );

    NumFormatListBox( Window* pWin, SwView* pView, const ResId& rResId,
        short nFormatType = NUMBERFORMAT_NUMBER, ULONG nDefFmt = 0,
        BOOL bUsrFmts = TRUE );

    ~NumFormatListBox();

    void            Clear();

    inline void     SetOneArea(BOOL bOnlyOne = TRUE) { bOneArea = bOnlyOne; }

    void            SetFormatType(const short nFormatType);
    inline short    GetFormatType() const { return nCurrFormatType; }
    void            SetDefFormat(const ULONG nDefFmt);
    ULONG           GetFormat() const;
    const String&   GetFormatStr() const;

    inline LanguageType GetCurLanguage() const { return eCurLanguage;}
};


#endif

diff --git a/sw/source/ui/inc/numpara.hxx b/sw/source/ui/inc/numpara.hxx
new file mode 100644
index 0000000..21229ec
--- /dev/null
+++ b/sw/source/ui/inc/numpara.hxx
@@ -0,0 +1,134 @@
/*************************************************************************
 *
 *  $RCSfile: numpara.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:41 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _NUMPARA_HXX
#define _NUMPARA_HXX


#ifndef _SFXTABDLG_HXX //autogen
#include <sfx2/tabdlg.hxx>
#endif
#ifndef _SV_GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif
#ifndef _SV_LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif
#ifndef _SV_FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif
#ifndef _SV_FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif
#ifndef _SV_BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif


/* --- class SwParagraphNumTabPage ----------------------------------------
    Mit dieser TabPage werden Numerierungseinstellungen am Absatz bzw. der
    Absatzvorlage vorgenommen.

 ---------------------------------------------------------------------------*/
class SwParagraphNumTabPage : public SfxTabPage
{
    GroupBox                aNumberStyleGB;
    ListBox                 aNumberStyleLB;

    GroupBox                aNewStartGB;
    TriStateBox             aNewStartCB;
    FixedText               aNewStartFT;
    NumericField            aNewStartNF;

    GroupBox                aCountParaGB;
    TriStateBox             aCountParaCB;
    TriStateBox             aRestartParaCountCB;
    FixedText               aRestartFT;
    NumericField            aRestartNF;

    BOOL                    bModified : 1;
    BOOL                    bCurNumrule : 1;

    DECL_LINK( NewStartHdl_Impl, CheckBox* );
    DECL_LINK( StyleHdl_Impl, ListBox* );
    DECL_LINK( LineCountHdl_Impl, CheckBox* );

protected:
        SwParagraphNumTabPage(Window* pParent, const SfxItemSet& rSet );

public:
        ~SwParagraphNumTabPage();

    static SfxTabPage*  Create( Window* pParent,
                                const SfxItemSet& rSet );
    static USHORT*      GetRanges();

    virtual BOOL        FillItemSet( SfxItemSet& rSet );
    virtual void        Reset( const SfxItemSet& rSet );

    void                EnableNewStart();

    ListBox&            GetStyleBox() {return aNumberStyleLB;};

};


#endif

diff --git a/sw/source/ui/inc/numprevw.hxx b/sw/source/ui/inc/numprevw.hxx
new file mode 100644
index 0000000..729d854
--- /dev/null
+++ b/sw/source/ui/inc/numprevw.hxx
@@ -0,0 +1,107 @@
/*************************************************************************
 *
 *  $RCSfile: numprevw.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:41 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _NUMPREVW_HXX
#define _NUMPREVW_HXX


#ifndef _SV_WINDOW_HXX //autogen
#include <vcl/window.hxx>
#endif

class SwNumRule;
/*-----------------02.12.97 10:31-------------------

--------------------------------------------------*/

class NumberingPreview : public Window
{
    const SwNumRule*    pActNum;
    Font                aStdFont;
    long                nPageWidth;
    const String*       pOutlineNames;
    BOOL                bPosition;
    UINT16              nActLevel;

    protected:
        virtual void        Paint( const Rectangle& rRect );

    public:
        NumberingPreview(Window* pParent, const ResId& rResId ) :
            Window(pParent, rResId),
            pActNum(0),nPageWidth(0), pOutlineNames(0), bPosition(FALSE), nActLevel(USHRT_MAX) {}
        ~NumberingPreview();

        void    SetNumRule(const SwNumRule* pNum)
                    {pActNum = pNum; Invalidate();};
        void    SetPageWidth(long nPgWidth)
                                {nPageWidth = nPgWidth;}
        void    SetOutlineNames(const String* pNames)
                        {pOutlineNames = pNames;}
        void    SetPositionMode()
                        { bPosition = TRUE;}
        void    SetLevel(USHORT nSet) {nActLevel = nSet;}

};

#endif


diff --git a/sw/source/ui/inc/olesh.hxx b/sw/source/ui/inc/olesh.hxx
new file mode 100644
index 0000000..2f1742d
--- /dev/null
+++ b/sw/source/ui/inc/olesh.hxx
@@ -0,0 +1,82 @@
/*************************************************************************
 *
 *  $RCSfile: olesh.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:41 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWOLESH_HXX
#define _SWOLESH_HXX

#include "frmsh.hxx"

class SwOleShell: public SwFrameShell
{
public:
    SFX_DECL_INTERFACE(SW_OLESHELL);

            SwOleShell(SwView &rView);

};

#endif







diff --git a/sw/source/ui/inc/olmenu.hxx b/sw/source/ui/inc/olmenu.hxx
new file mode 100644
index 0000000..5c5f66d
--- /dev/null
+++ b/sw/source/ui/inc/olmenu.hxx
@@ -0,0 +1,102 @@
/*************************************************************************
 *
 *  $RCSfile: olmenu.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:41 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _OLMENU_HXX
#define _OLMENU_HXX

#ifndef _COM_SUN_STAR_LINGUISTIC_XDICTIONARY_HPP_
#include <com/sun/star/linguistic/XDictionary.hpp>
#endif
#ifndef _COM_SUN_STAR_LINGUISTIC_XSPELLALTERNATIVES_HPP_
#include <com/sun/star/linguistic/XSpellAlternatives.hpp>
#endif
#ifndef _COM_SUN_STAR_LINGUISTIC_XOTHERLINGU_HPP_
#include <com/sun/star/linguistic/XOtherLingu.hpp>
#endif

#ifndef _MENU_HXX //autogen
#include <vcl/menu.hxx>
#endif

class SwWrtShell;
class SvStringsDtor;

class SwSpellPopup : public PopupMenu
{
    SwWrtShell* pSh;
    ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference<
        ::com::sun::star::linguistic::XDictionary >  >      aDics;
    ::com::sun::star::uno::Reference<
        ::com::sun::star::linguistic::XSpellAlternatives >  xSpellAlt;
    ::com::sun::star::uno::Reference<
        ::com::sun::star::linguistic::XOtherLingu>          xOther;
    LanguageType                nCorrLang;

public:
    SwSpellPopup( SwWrtShell*,
            const ::com::sun::star::uno::Reference<
                ::com::sun::star::linguistic::XSpellAlternatives >  &xAlt );

    sal_uInt16  Execute( Window* pWin, const Point& rPopupPos );
};


#endif

diff --git a/sw/source/ui/inc/optload.hxx b/sw/source/ui/inc/optload.hxx
new file mode 100644
index 0000000..71b65ae
--- /dev/null
+++ b/sw/source/ui/inc/optload.hxx
@@ -0,0 +1,118 @@
/*************************************************************************
 *
 *  $RCSfile: optload.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:41 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _OPTLOAD_HXX
#define _OPTLOAD_HXX

#ifndef _SFXTABDLG_HXX //autogen
#include <sfx2/tabdlg.hxx>
#endif

#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif
#ifndef _SV_FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif

class SwWrtShell;

/*-----------------31.08.96 10.09-------------------

--------------------------------------------------*/

class SwLoadOptPage : public SfxTabPage
{
private:
    RadioButton aAlwaysRB;
    RadioButton aRequestRB;
    RadioButton aNeverRB;
    CheckBox    aLinkDocOnlyCB;
    GroupBox    aLinkGB;

    CheckBox    aAutoUpdateFields;
    CheckBox    aAutoUpdateCharts;
    CheckBox    aFldDocOnlyCB;
    GroupBox    aFldGB;

    CheckBox    aMergeDistCB;
    CheckBox    aMergeDistPageStartCB;
    GroupBox    aCompatGB;

    SwWrtShell* pWrtShell;
    USHORT      nOldLinkMode;

    DECL_LINK(  UpdateHdl, CheckBox* );

public:
                        SwLoadOptPage( Window* pParent,
                                         const SfxItemSet& rSet );
                        ~SwLoadOptPage();

    static SfxTabPage*  Create( Window* pParent,
                                const SfxItemSet& rAttrSet);

    virtual BOOL        FillItemSet( SfxItemSet& rSet );
    virtual void        Reset( const SfxItemSet& rSet );
};

#endif


diff --git a/sw/source/ui/inc/optpage.hxx b/sw/source/ui/inc/optpage.hxx
new file mode 100644
index 0000000..87942b3
--- /dev/null
+++ b/sw/source/ui/inc/optpage.hxx
@@ -0,0 +1,531 @@
/*************************************************************************
 *
 *  $RCSfile: optpage.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:41 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _OPTPAGE_HXX
#define _OPTPAGE_HXX

#ifndef _SFXTABDLG_HXX //autogen
#include <sfx2/tabdlg.hxx>
#endif

#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif

#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif

#ifndef _LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif

#ifndef _FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif

#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif

#ifndef _CTRLBOX_HXX //autogen
#include <svtools/ctrlbox.hxx>
#endif

#ifndef _SVX_FNTCTRL_HXX //autogen
#include <svx/fntctrl.hxx>
#endif

#ifndef _SVX_STRARRAY_HXX //autogen
#include <svx/strarray.hxx>
#endif

class SvStringsDtor;
class SfxPrinter;
class SwStdFontConfig;
class SwWrtShell;

/*-----------------31.08.96 10.09-------------------

--------------------------------------------------*/

class SwContentOptPage : public SfxTabPage
{

private:
    GroupBox    aDispBox;
    CheckBox    aGrfCB;
    CheckBox    aTblCB;
    CheckBox    aDrwCB;
    CheckBox    aFldNameCB;
    CheckBox    aPostItCB;

    GroupBox    aBackBox;
    CheckBox    aIdxEntryCB;
    CheckBox    aIdxBackCB;
    CheckBox    aFootBackCB;
    CheckBox    aFldBackCB;

    GroupBox    aUnprintBox;
    CheckBox    aParaCB;
    CheckBox    aSHyphCB;
    CheckBox    aSpacesCB;
    CheckBox    aHSpacesCB;
    CheckBox    aTabCB;
    CheckBox    aBreakCB;
    CheckBox    aHiddenCB;
    CheckBox    aHiddenParaCB;

public:
                        SwContentOptPage( Window* pParent,
                                           const SfxItemSet& rSet );
                        ~SwContentOptPage();

    static SfxTabPage*  Create( Window* pParent,
                                const SfxItemSet& rAttrSet);

    virtual BOOL        FillItemSet( SfxItemSet& rSet );
    virtual void        Reset( const SfxItemSet& rSet );

};

/*-----------------31.08.96 10.10-------------------

--------------------------------------------------*/

class SwLayoutOptPage : public SfxTabPage
{

    GroupBox    aLineGB;
    CheckBox    aTxtbegCB;
    CheckBox    aTblbegCB;
    CheckBox    aSectBoundsCB;
    CheckBox    aCrossCB;
    CheckBox    aSolidHandleCB;
    CheckBox    aBigHandleCB;

    GroupBox    aWindowGB;
    CheckBox    aHScrollBox;
    CheckBox    aVScrollBox;
    CheckBox    aHRulerCBox;
    CheckBox    aVRulerCBox;
    CheckBox    aSmoothCBox;

    ListBox     aMetricLB;
    GroupBox    aMetricGB;

    GroupBox    aTabGB;
    MetricField aTabMF;

    UINT16      nLastTab;

    SvxStringArray aMetricArr;

    DECL_LINK(MetricHdl, ListBox*);

                        SwLayoutOptPage( Window* pParent,
                                           const SfxItemSet& rSet );
                        ~SwLayoutOptPage();
public:
    static SfxTabPage*  Create( Window* pParent,
                                const SfxItemSet& rAttrSet);

    virtual BOOL        FillItemSet( SfxItemSet& rSet );
    virtual void        Reset( const SfxItemSet& rSet );

};

/*-------- OS 27.01.95 -----------------------------------
 TabPage Druckereinstellungen Zusaetze
--------------------------------------------------------- */


class SwAddPrinterTabPage : public SfxTabPage
{
    CheckBox        aGrfCB;
    CheckBox        aTabCB;
    CheckBox        aDrawCB;
    CheckBox        aCtrlFldCB;
    CheckBox        aBackgroundCB;
    CheckBox        aBlackFontCB;
    GroupBox        aGroup1;
    CheckBox        aLeftPageCB;
    CheckBox        aRightPageCB;
    CheckBox        aReverseCB;
    CheckBox        aProspectCB;
    GroupBox        aGroup2;
    RadioButton     aNoRB;
    RadioButton     aOnlyRB;
    RadioButton     aEndRB;
    RadioButton     aEndPageRB;
    GroupBox        aGroup3;
    CheckBox        aSingleJobsCB;
    GroupBox        aGroup4;
    ListBox         aFaxLB;
    GroupBox        aFaxGB;
    CheckBox        aPaperFromSetupCB;
    GroupBox        aGroup5;

    BOOL        bAttrModified;
    BOOL        bPreview;

    void        Init();
                DECL_LINK( AutoClickHdl, CheckBox * );
                DECL_LINK( SelectHdl, ListBox * );


                SwAddPrinterTabPage( Window* pParent,
                                           const SfxItemSet& rSet );

public:

    static SfxTabPage*  Create( Window* pParent,
                                const SfxItemSet& rAttrSet );

    virtual BOOL        FillItemSet( SfxItemSet& rSet );
    virtual void        Reset( const SfxItemSet& rSet );
    void                SetFax( const SvStringsDtor& );
    void                SelectFax( const String& );
    void                SetPreview(BOOL bPrev);

};

/*-----------------03.09.96 11.50-------------------

--------------------------------------------------*/

class SwStdFontTabPage : public SfxTabPage
{
    FixedText       aStandardLbl;
    ComboBox        aStandardBox;
    FixedText       aTitleLbl   ;
    ComboBox        aTitleBox   ;
    FixedText       aListLbl    ;
    ComboBox        aListBox    ;
    FixedText       aLabelLbl   ;
    ComboBox        aLabelBox   ;
    FixedText       aIdxLbl     ;
    ComboBox        aIdxBox     ;
    CheckBox        aDocOnlyCB  ;
    GroupBox        aStdChrFrm  ;
    PushButton      aStandardPB;

    String          sShellStd;
    String          sShellTitle;
    String          sShellList;
    String          sShellLabel;
    String          sShellIndex;

    SfxPrinter*         pPrt;
    SwStdFontConfig*    pFontConfig;
    SwWrtShell*         pWrtShell;
    // waren nur defaults vorhanden? wurden sie mit den Boxen ueberschrieben
    BOOL    bListDefault    :1;
    BOOL    bSetListDefault :1;
    BOOL    bLabelDefault   :1;
    BOOL    bSetLabelDefault :1;
    BOOL    bIdxDefault     :1;
    BOOL    bSetIdxDefault  :1;
    BOOL    bDeletePrinter :1;



    DECL_LINK( StandardHdl, PushButton * );
    DECL_LINK( ModifyHdl, ComboBox * );

            SwStdFontTabPage( Window* pParent,
                                       const SfxItemSet& rSet );
            ~SwStdFontTabPage();

public:
    static SfxTabPage*  Create( Window* pParent,
                                const SfxItemSet& rAttrSet );

    virtual BOOL        FillItemSet( SfxItemSet& rSet );
    virtual void        Reset( const SfxItemSet& rSet );

};

/*-----------------18.01.97 12.10-------------------

--------------------------------------------------*/

class SwTableOptionsTabPage : public SfxTabPage
{
    GroupBox    aMoveGB;
    FixedText   aRowMoveFT;
    MetricField aRowMoveMF;
    FixedText   aColMoveFT;
    MetricField aColMoveMF;

    GroupBox    aInsertGB;
    FixedText   aRowInsertFT;
    MetricField aRowInsertMF;
    FixedText   aColInsertFT;
    MetricField aColInsertMF;

    GroupBox    aHandlingGB;
    RadioButton aFixRB;
    RadioButton aFixPropRB;
    RadioButton aVarRB;
    FixedText   aFixFT;
    FixedText   aFixPropFT;
    FixedText   aVarFT;

    FixedText   aDescFT;

    SwWrtShell* pWrtShell;


                SwTableOptionsTabPage( Window* pParent,
                                           const SfxItemSet& rSet );
                ~SwTableOptionsTabPage();

public:

    static SfxTabPage*  Create( Window* pParent,
                                const SfxItemSet& rAttrSet );

    virtual BOOL        FillItemSet( SfxItemSet& rSet );
    virtual void        Reset( const SfxItemSet& rSet );

    void SetWrtShell(SwWrtShell* pSh) {pWrtShell = pSh;}


};
/*-----------------19.04.97 13:17-------------------

--------------------------------------------------*/
class SwSourceViewOptionsTabPage : public SfxTabPage
{
    GroupBox        aColorGB;
    FixedText       aSGMLFT;
    ColorListBox    aSGMLLB;
    FixedText       aCommentFT;
    ColorListBox    aCommentLB;
    FixedText       aKeywdFT;
    ColorListBox    aKeywdLB;
    FixedText       aUnknownFT;
    ColorListBox    aUnknownLB;

                SwSourceViewOptionsTabPage( Window* pParent,
                                           const SfxItemSet& rSet );
                ~SwSourceViewOptionsTabPage();

public:

    static SfxTabPage*  Create( Window* pParent,
                                const SfxItemSet& rAttrSet );

    virtual BOOL        FillItemSet( SfxItemSet& rSet );
    virtual void        Reset( const SfxItemSet& rSet );

};

/*-----------------31.10.97 17:55-------------------
 TabPage fuer ShadowCrsr
--------------------------------------------------*/

class SwShdwCrsrOptionsTabPage : public SfxTabPage
{
    GroupBox        aFlagGB;
    CheckBox        aOnOffCB;

    FixedText       aFillModeFT;
    RadioButton     aFillMarginRB;
    RadioButton     aFillIndentRB;
    RadioButton     aFillTabRB;
    RadioButton     aFillSpaceRB;

    FixedText       aColorFT;
    ColorListBox    aColorLB;

    GroupBox        aCrsrOptGB;
    CheckBox        aCrsrInProtCB;

    SwShdwCrsrOptionsTabPage( Window* pParent, const SfxItemSet& rSet );
    ~SwShdwCrsrOptionsTabPage();

public:

    static SfxTabPage*  Create( Window* pParent, const SfxItemSet& rAttrSet );

    virtual BOOL        FillItemSet( SfxItemSet& rSet );
    virtual void        Reset( const SfxItemSet& rSet );
};

/*-----------------------------------------------------------------------
    Beschreibung: Markierungsvorschau
 -----------------------------------------------------------------------*/

class SwMarkPreview : public Window
{
    Color       aTransColor;    // Transparente Farbe
    Color       aMarkColor;     // Farbe der Markierungen

    Rectangle   aPage;
    Rectangle   aLeftPagePrtArea;
    Rectangle   aRightPagePrtArea;

    USHORT      nMarkPos;

    void DrawRect(const Rectangle &rRect, const Color &rFillColor, const Color &rLineColor);
    void Paint(const Rectangle&);
    void PaintPage(const Rectangle &rRect);

public:

     SwMarkPreview(Window* pParent, const ResId& rResID);
    ~SwMarkPreview();

    inline void SetColor(Color aCol)    { aMarkColor = aCol; }
    inline void SetMarkPos(USHORT nPos) { nMarkPos = nPos; }
};

/*-----------------------------------------------------------------------
    Beschreibung: Redlining-Optionen
 -----------------------------------------------------------------------*/

class SwRedlineOptionsTabPage : public SfxTabPage
{
    RadioButton         aInsertRB;
    RadioButton         aDeletedRB;
    RadioButton         aChangedRB;

    FixedText           aInsertFT;
    ListBox             aInsertLB;
    ListBox             aDeletedLB;
    ListBox             aChangedLB;
    FixedText           aInsertColorFT;
    ColorListBox        aInsertColorLB;
    ColorListBox        aDeletedColorLB;
    ColorListBox        aChangedColorLB;
    SvxFontPrevWindow   aAttribPreviewWN;
    GroupBox            aInsertGB;

    FixedText           aMarkPosFT;
    ListBox             aMarkPosLB;
    FixedText           aMarkColorFT;
    ColorListBox        aMarkColorLB;
    SwMarkPreview       aMarkPreviewWN;
    GroupBox            aChangedGB;
    String              sAuthor;
    String              sNone;

    SwRedlineOptionsTabPage( Window* pParent, const SfxItemSet& rSet );
    ~SwRedlineOptionsTabPage();

    DECL_LINK( RadioHdl, RadioButton *pRB );

    DECL_LINK( AttribHdl, ListBox *pLB );
    DECL_LINK( ChangedMaskPrevHdl, ListBox *pLB = 0 );
    DECL_LINK( ColorHdl, ColorListBox *pColorLB );

    void                InitFontStyle(SvxFontPrevWindow& rExampleWin);

public:

    static SfxTabPage*  Create( Window* pParent, const SfxItemSet& rAttrSet );

    virtual BOOL        FillItemSet( SfxItemSet& rSet );
    virtual void        Reset( const SfxItemSet& rSet );
};

/*--------OS 11.01.95 -----------------------------------
 TabPage Testeinstellungen fuer SW
--------------------------------------------------------- */

#ifndef PRODUCT

class SwTestTabPage : public SfxTabPage
{
public:
                        SwTestTabPage( Window* pParent,
                                           const SfxItemSet& rSet );

    static SfxTabPage*  Create( Window* pParent,
                                const SfxItemSet& rAttrSet );

    virtual BOOL        FillItemSet( SfxItemSet& rSet );
    virtual void        Reset( const SfxItemSet& rSet );

private:
    GroupBox aTestGBox;
    CheckBox aTest1CBox;
    CheckBox aTest2CBox;
    CheckBox aTest3CBox;
    CheckBox aTest4CBox;
    CheckBox aTest5CBox;
    CheckBox aTest6CBox;
    CheckBox aTest7CBox;
    CheckBox aTest8CBox;
    CheckBox aTest9CBox;
    CheckBox aTest10CBox;

    BOOL        bAttrModified;

    void        Init();
    DECL_LINK( AutoClickHdl, CheckBox * );

};
#endif //PRODUCT
#endif


diff --git a/sw/source/ui/inc/outline.hxx b/sw/source/ui/inc/outline.hxx
new file mode 100644
index 0000000..8205e16
--- /dev/null
+++ b/sw/source/ui/inc/outline.hxx
@@ -0,0 +1,209 @@
/*************************************************************************
 *
 *  $RCSfile: outline.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:41 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _OUTLINE_HXX
#define _OUTLINE_HXX


#ifndef _SFXTABDLG_HXX //autogen
#include <sfx2/tabdlg.hxx>
#endif


#ifndef _SV_MENU_HXX //autogen
#include <vcl/menu.hxx>
#endif

#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif

#ifndef _STDCTRL_HXX //autogen
#include <svtools/stdctrl.hxx>
#endif

#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif

#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif

#ifndef _LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif

#ifndef _EDIT_HXX //autogen
#include <vcl/edit.hxx>
#endif

#ifndef _FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif

#include "swtypes.hxx"      //fuer MAXLEVEL
#ifndef _NUMPREVW_HXX
#include <numprevw.hxx>
#endif

class SwWrtShell;
class SwTxtFmtColl;
class SwNumRule;
class SwChapterNumRules;

/* -----------------07.07.98 13:38-------------------
 *
 * --------------------------------------------------*/
class SwOutlineTabDialog : public SfxTabDialog
{
    String              aNullStr;
    String              aCollNames[MAXLEVEL];
    PopupMenu           aFormMenu;

    SwWrtShell&         rWrtSh;
    SwNumRule*          pNumRule;
    SwChapterNumRules*  pChapterNumRules;

    USHORT              nNumLevel;
    BOOL                bModified : 1;

    protected:
    DECL_LINK( CancelHdl, Button * );
    DECL_LINK( FormHdl, Button * );
    DECL_LINK( MenuSelectHdl, Menu * );

        virtual void    PageCreated(USHORT nPageId, SfxTabPage& rPage);
        virtual short   Ok();

    public:
        SwOutlineTabDialog(Window* pParent,
                    const SfxItemSet* pSwItemSet,
                    SwWrtShell &);
        ~SwOutlineTabDialog();

    SwNumRule*          GetNumRule() {return pNumRule;}
    USHORT              GetLevel(const String &rFmtName) const;
    String*             GetCollNames() {return aCollNames;}
    USHORT              GetActNumLevel() {return nNumLevel;}
    void                SetActNumLevel(USHORT nSet) {nNumLevel = nSet;}
};
/* -----------------07.07.98 13:47-------------------
 *
 * --------------------------------------------------*/
class SwOutlineSettingsTabPage : public SfxTabPage
{
    ListBox         aLevelLB;
    GroupBox        aLevelGB;

    FixedText       aCollLbl;
    ListBox         aCollBox;
    FixedText       aNumberLbl;
    ListBox         aNumberBox;
    FixedText       aCharFmtFT;
    ListBox         aCharFmtLB;
    FixedText       aAllLevelFT;
    NumericField    aAllLevelNF;
    FixedText       aDelim;
    FixedText       aPrefixFT;
    Edit            aPrefixED;
    FixedText       aSuffixFT;
    Edit            aSuffixED;
    FixedText       aStartLbl;
    NumericField    aStartEdit;
    GroupBox        aNumberGrp;
    GroupBox        aPreviewGB;
    NumberingPreview aPreviewWIN;

    String              aNoFmtName;
    String              aSaveCollNames[MAXLEVEL];
    SwWrtShell*         pSh;
    SwNumRule*          pNumRule;
    String*             pCollNames;
    USHORT              nActLevel;

    DECL_LINK( LevelHdl, ListBox * );
    DECL_LINK( ToggleComplete, NumericField * );
    DECL_LINK( CollSelect, ListBox * );
    DECL_LINK( CollSelectGetFocus, ListBox * );
    DECL_LINK( NumberSelect, ListBox * );
    DECL_LINK( DelimModify, Edit * );
    DECL_LINK( StartModified, NumericField * );
    DECL_LINK( CharFmtHdl, ListBox * );

    void    Update();

    void    SetModified(){aPreviewWIN.Invalidate();}


public:
    SwOutlineSettingsTabPage(Window* pParent, const SfxItemSet& rSet);
    ~SwOutlineSettingsTabPage();

    void SetWrtShell(SwWrtShell* pShell);

    virtual void        ActivatePage(const SfxItemSet& rSet);
    virtual int         DeactivatePage(SfxItemSet *pSet);
    virtual BOOL        FillItemSet( SfxItemSet& rSet );
    virtual void        Reset( const SfxItemSet& rSet );
    static SfxTabPage*  Create( Window* pParent,
                                const SfxItemSet& rAttrSet);
};
#endif
diff --git a/sw/source/ui/inc/pardlg.hxx b/sw/source/ui/inc/pardlg.hxx
new file mode 100644
index 0000000..501f8f3
--- /dev/null
+++ b/sw/source/ui/inc/pardlg.hxx
@@ -0,0 +1,96 @@
/*************************************************************************
 *
 *  $RCSfile: pardlg.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:41 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SW_PARDLG_HXX
#define _SW_PARDLG_HXX

#ifndef _SFXTABDLG_HXX //autogen
#include <sfx2/tabdlg.hxx>
#endif

class SwView;
class SfxItemSet;

//DialogModes:
#define DLG_STD         0
#define DLG_ENVELOP     2

class SwParaDlg: public SfxTabDialog
{
    SwView& rView;
    USHORT nHtmlMode;
    BYTE nDlgMode;
    BOOL bDrawParaDlg;

    void PageCreated(USHORT nID, SfxTabPage& rPage);

public:
    SwParaDlg(  Window *pParent,
                SwView& rVw,
                const SfxItemSet&,
                BYTE nDialogMode,
                const String *pCollName = 0,
                BOOL bDraw = FALSE,
                UINT16 nDefPage = 0);
    ~SwParaDlg();
};


#endif
diff --git a/sw/source/ui/inc/pattern.hxx b/sw/source/ui/inc/pattern.hxx
new file mode 100644
index 0000000..b4ebc85
--- /dev/null
+++ b/sw/source/ui/inc/pattern.hxx
@@ -0,0 +1,80 @@
/*************************************************************************
 *
 *  $RCSfile: pattern.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:41 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _PATTERN_HXX
#define _PATTERN_HXX

#ifndef _BASEDLGS_HXX //autogen
#include <sfx2/basedlgs.hxx>
#endif
class Window;
class SfxItemSet;

class SwBackgroundDlg : public SfxSingleTabDialog
{
public:

     SwBackgroundDlg(Window* pParent, const SfxItemSet& rSet);
    ~SwBackgroundDlg();
};

#endif

diff --git a/sw/source/ui/inc/pgfnote.hxx b/sw/source/ui/inc/pgfnote.hxx
new file mode 100644
index 0000000..a350a77
--- /dev/null
+++ b/sw/source/ui/inc/pgfnote.hxx
@@ -0,0 +1,141 @@
/*************************************************************************
 *
 *  $RCSfile: pgfnote.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:41 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _PGFNOTE_HXX
#define _PGFNOTE_HXX

#ifndef _SFXTABDLG_HXX //autogen
#include <sfx2/tabdlg.hxx>
#endif

#ifndef _FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif

#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif

#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif

#ifdef VCL
#ifndef _CTRLBOX_HXX
#include <svtools/ctrlbox.hxx>
#endif
#else
#include "linbox.hxx"
#endif
#include "colex.hxx"

/*--------------------------------------------------------------------
    Beschreibung:   Fussnoteneinstellungs-TabPage
 --------------------------------------------------------------------*/

class SwFootNotePage: public SfxTabPage
{
public:
    static SfxTabPage *Create(Window *pParent, const SfxItemSet &rSet);
    static USHORT* GetRanges();

    virtual BOOL FillItemSet(SfxItemSet &rSet);
    virtual void Reset(const SfxItemSet &rSet);

private:
    SwFootNotePage(Window *pParent, const SfxItemSet &rSet);
    ~SwFootNotePage();

    RadioButton     aMaxHeightPageBtn;
    RadioButton     aMaxHeightBtn;
    MetricField     aMaxHeightEdit;
    FixedText       aDistLbl;
    MetricField     aDistEdit;
    GroupBox        aPosFrm;

    FixedText       aLinePosLbl;
    ListBox         aLinePosBox;
    FixedText       aLineTypeLbl;
#ifdef VCL
    LineListBox     aLineTypeBox;
#else
    SwLineBox       aLineTypeBox;
#endif
    FixedText       aLineWidthLbl;
    MetricField     aLineWidthEdit;
    FixedText       aLineDistLbl;
    MetricField     aLineDistEdit;
    GroupBox        aLineFrm;
    SwColExample    aBspWin;
    GroupBox        aBspFrm;

    DECL_LINK( HeightPage, Button * );
    DECL_LINK( HeightMetric, Button * );
    DECL_LINK( HeightModify, MetricField * );
    void            InitBsp(const SfxItemSet& rSet);

    long            lMaxHeight;

    virtual void    ActivatePage( const SfxItemSet& rSet );
    virtual int     DeactivatePage( SfxItemSet* pSet = 0 );

};

#endif
diff --git a/sw/source/ui/inc/popbox.hxx b/sw/source/ui/inc/popbox.hxx
new file mode 100644
index 0000000..c7091ae
--- /dev/null
+++ b/sw/source/ui/inc/popbox.hxx
@@ -0,0 +1,94 @@
/*************************************************************************
 *
 *  $RCSfile: popbox.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:41 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _POPBOX_HXX
#define _POPBOX_HXX


#ifndef _TOOLBOX_HXX //autogen
#include <vcl/toolbox.hxx>
#endif

class SwHelpToolBox: public ToolBox
{
    Link aDoubleClickLink;
    Link aRightClickLink;       // Link bekommt MouseEvent als Parameter !!!
protected:
    virtual void MouseButtonDown(const MouseEvent &rEvt);
    virtual long DoubleClick(ToolBox *);
    virtual BOOL    Drop( const DropEvent& rEvt);
    virtual BOOL    QueryDrop( DropEvent& rEvt);
public:
    SwHelpToolBox(Window* pParent, const ResId &);
    ~SwHelpToolBox();
    void SetDoubleClickLink(const Link &);      // inline
    void SetRightClickLink(const Link &);       // inline
};

inline void SwHelpToolBox::SetDoubleClickLink(const Link &rLink) {
    aDoubleClickLink = rLink;
}

inline void SwHelpToolBox::SetRightClickLink(const Link &rLink) {
    aRightClickLink = rLink;
}


#endif
diff --git a/sw/source/ui/inc/popup.hrc b/sw/source/ui/inc/popup.hrc
new file mode 100644
index 0000000..e825a01
--- /dev/null
+++ b/sw/source/ui/inc/popup.hrc
@@ -0,0 +1,84 @@
/*************************************************************************
 *
 *  $RCSfile: popup.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:41 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _POPUP_HRC
#define _POPUP_HRC

#include "rcid.hrc"

#define MN_TEXT_POPUPMENU           (RC_POPUPS_BEGIN + 0)
#define MN_TAB_POPUPMENU            (RC_POPUPS_BEGIN + 1)
#define MN_FRM_POPUPMENU            (RC_POPUPS_BEGIN + 2)
#define MN_DRAW_POPUPMENU           (RC_POPUPS_BEGIN + 3)
#define MN_DRWTXT_POPUPMENU         (RC_POPUPS_BEGIN + 4)
#define MN_GRF_POPUPMENU            (RC_POPUPS_BEGIN + 5)
#define MN_OLE_POPUPMENU            (RC_POPUPS_BEGIN + 6)
#define MN_PPREVIEW_POPUPMENU       (RC_POPUPS_BEGIN + 7)
#define MN_SRCVIEW_POPUPMENU        (RC_POPUPS_BEGIN + 8)
#define MN_DRAWFORM_POPUPMENU       (RC_POPUPS_BEGIN + 9)

#if MN_DRAWFORM_POPUPMENU > RC_POPUPS_END

#error Resource-Id Ueberlauf in #file, #line
#endif


#endif // _POPUP_HRC
diff --git a/sw/source/ui/inc/prcntfld.hxx b/sw/source/ui/inc/prcntfld.hxx
new file mode 100644
index 0000000..47ee3cf
--- /dev/null
+++ b/sw/source/ui/inc/prcntfld.hxx
@@ -0,0 +1,106 @@
/*************************************************************************
 *
 *  $RCSfile: prcntfld.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:41 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _PRCNTFLD_HXX
#define _PRCNTFLD_HXX

#ifndef _FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif

class PercentField : public MetricField
{
    long        nRefValue;      // 100%-Wert fuer Umrechnung (in Twips)
    long        nOldMax, nOldMin, nOldSpinSize, nOldBaseValue;
    long        nLastPercent, nLastValue;
    USHORT      nOldDigits;
    FieldUnit   eOldUnit;

    long        ImpPower10(USHORT n);

public:
    PercentField( Window* pWin, const ResId& rResId );

    void        SetValue(long nNewValue, FieldUnit eInUnit = FUNIT_NONE);
    void        SetUserValue(long nNewValue, FieldUnit eInUnit = FUNIT_NONE);
    void        SetBaseValue(long nNewValue, FieldUnit eInUnit = FUNIT_NONE);
    long        GetValue(FieldUnit eOutUnit = FUNIT_NONE);
    BOOL        IsValueModified();

    void        SetMax(long nNewMax, FieldUnit eInUnit = FUNIT_NONE);
    void        SetMin(long nNewMin, FieldUnit eInUnit = FUNIT_NONE);

    long        Normalize(long nValue);
    long        Denormalize(long nValue);

    void        SetRefValue(long nValue);
    inline long GetRefValue() const { return nRefValue; }
    long        GetRealValue(FieldUnit eOutUnit = FUNIT_NONE);

    long        Convert(long nValue, FieldUnit eInUnit, FieldUnit eOutUnit);

    void        ShowPercent(BOOL bPercent);

    USHORT      GetOldDigits() const {return nOldDigits;}

};

#endif // _PRCNTFLD_HXX

diff --git a/sw/source/ui/inc/prtopt.hxx b/sw/source/ui/inc/prtopt.hxx
new file mode 100644
index 0000000..35f2409
--- /dev/null
+++ b/sw/source/ui/inc/prtopt.hxx
@@ -0,0 +1,129 @@
/*************************************************************************
 *
 *  $RCSfile: prtopt.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:41 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _PRTOPT_HXX
#define _PRTOPT_HXX

#ifndef _UTL_CONFIGITEM_HXX_
#include <unotools/configitem.hxx>
#endif

class SwPrintOptions : public utl::ConfigItem
{
    sal_Bool
         bPrintGraphic       :1,
         bPrintTable         :1,
         bPrintDraw          :1,
         bPrintControl       :1,
         bPrintPageBackground:1,
         bPrintBlackFont     :1,

         bPrintLeftPage      :1,
         bPrintRightPage     :1,
         bReverse            :1,
         bPrintProspect      :1,
         bPrintSingleJobs    :1,

         bPaperFromSetup     :1;

    sal_uInt32  nPrintPostIts;
    rtl::OUString       sFaxName;

    com::sun::star::uno::Sequence<rtl::OUString> GetPropertyNames();
public:
    SwPrintOptions(sal_Bool bWeb);
    virtual ~SwPrintOptions();

    virtual void            Notify( const com::sun::star::uno::Sequence<rtl::OUString>& aPropertyNames);
    virtual void            Commit();

    sal_Bool IsPrintGraphic()   const { return bPrintGraphic; }
    sal_Bool IsPrintTable()     const { return bPrintTable; }
    sal_Bool IsPrintDraw()      const { return bPrintDraw; }
    sal_Bool IsPrintControl()   const { return bPrintControl; }
    sal_Bool IsPrintLeftPage()  const { return bPrintLeftPage; }
    sal_Bool IsPrintRightPage() const { return bPrintRightPage; }
    sal_Bool IsPrintReverse()   const { return bReverse; }
    sal_Bool IsPaperFromSetup() const { return bPaperFromSetup; }
    sal_Bool IsPrintProspect()  const { return bPrintProspect; }
    sal_Bool IsPrintPageBackground() const { return bPrintPageBackground; }
    sal_Bool IsPrintBlackFont() const { return bPrintBlackFont;}
    sal_Bool IsPrintSingleJobs() const { return bPrintSingleJobs;}
    sal_uInt32 GetPrintPostIts() const { return nPrintPostIts; }
    const rtl::OUString     GetFaxName() const{return sFaxName;}

    void SetPrintGraphic  ( sal_Bool b ) { SetModified(); bPrintGraphic = b;}
    void SetPrintTable    ( sal_Bool b ) { SetModified(); bPrintTable = b;}
    void SetPrintDraw     ( sal_Bool b ) { SetModified(); bPrintDraw = b;}
    void SetPrintControl  ( sal_Bool b ) { SetModified(); bPrintControl = b; }
    void SetPrintLeftPage ( sal_Bool b ) { SetModified(); bPrintLeftPage = b;}
    void SetPrintRightPage( sal_Bool b ) { SetModified(); bPrintRightPage = b;}
    void SetPrintReverse  ( sal_Bool b ) { SetModified(); bReverse = b;}
    void SetPaperFromSetup( sal_Bool b ) { SetModified(); bPaperFromSetup = b;}
    void SetPrintPostIts    ( sal_uInt32 n){ SetModified(); nPrintPostIts = n; }
    void SetPrintProspect   ( sal_Bool b ) { SetModified(); bPrintProspect = b; }
    void SetPrintPageBackground(sal_Bool b){ SetModified(); bPrintPageBackground = b;}
    void SetPrintBlackFont(sal_Bool b){ SetModified(); bPrintBlackFont = b;}
    void SetPrintSingleJobs(sal_Bool b){ SetModified(); bPrintSingleJobs = b;}
    void SetFaxName(const rtl::OUString& rSet){sFaxName = rSet;}
};

#endif

diff --git a/sw/source/ui/inc/pview.hxx b/sw/source/ui/inc/pview.hxx
new file mode 100644
index 0000000..57883c6
--- /dev/null
+++ b/sw/source/ui/inc/pview.hxx
@@ -0,0 +1,283 @@
/*************************************************************************
 *
 *  $RCSfile: pview.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:41 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWPVIEW_HXX
#define _SWPVIEW_HXX

#ifndef _SFXVIEWFRM_HXX //autogen
#include <sfx2/viewfrm.hxx>
#endif
#ifndef _VIEWFAC_HXX //autogen
#include <sfx2/viewfac.hxx>
#endif
#ifndef _LINK_HXX //autogen
#include <tools/link.hxx>
#endif
#ifndef _WINDOW_HXX //autogen
#include <vcl/window.hxx>
#endif
#ifndef _SFXVIEWSH_HXX //autogen
#include <sfx2/viewsh.hxx>
#endif
#include "shellid.hxx"

class SwViewOption;
class SwDocShell;
class SwScrollbar;
class ViewShell;
class SwPagePreView;
class ImageButton;
class Button;
class SwRect;
class DataChangedEvent;
class CommandEvent;

class SwPagePreViewWin : public Window
{
    ViewShell*          pViewShell;
    USHORT              nSttPage, nVirtPage;
    BYTE                nRow, nCol;
    Size                aWinSize, aPgSize;
    Fraction            aScale;
    SwPagePreView&      rView;

    void SetPagePreview( BYTE nRow, BYTE nCol );

public:
    SwPagePreViewWin( Window* pParent, SwPagePreView& rView );
    ~SwPagePreViewWin();

    //Ruft ViewShell::Paint
    virtual void Paint( const Rectangle& rRect );
    virtual void KeyInput( const KeyEvent & );
    virtual void Command( const CommandEvent& rCEvt );
    virtual void MouseButtonDown(const MouseEvent& rMEvt);
    virtual void DataChanged( const DataChangedEvent& );

    void SetViewShell( ViewShell* pShell ) { pViewShell = pShell; }
    ViewShell* GetViewShell() const { return pViewShell; }

    BYTE    GetRow() const      { return nRow; }
    void    SetRow( BYTE n )    { if( n ) nRow = n; }

    BYTE    GetCol() const      { return nCol; }
    void    SetCol( BYTE n )    { if( n ) nCol = n; }

    USHORT  GetVirtPage() const     { return nVirtPage; }
    USHORT  GetSttPage() const      { return nSttPage; }
    void    SetSttPage( USHORT n )
        { nSttPage = nVirtPage = n; if( !n ) ++nVirtPage; }

    //JP 19.08.98: bei Einspaltigkeit gibt es keine 0. Seite!
    USHORT  GetDefSttPage() const   { return 1 == nCol ? 1 : 0; }

    void CalcWish( BYTE nNewRow, BYTE nNewCol );

    const Size& GetWinSize() const  { return aWinSize; }
    void SetWinSize( const Size& rNewSize );

    enum MoveMode{ MV_CALC, MV_PAGE_UP, MV_PAGE_DOWN, MV_DOC_STT, MV_DOC_END };
    int MovePage( int eMoveMode );

    // erzeuge den String fuer die StatusLeiste
    void GetStatusStr( String& rStr, USHORT nPageCount ) const;
    void GetOptimalSize( Size& rSize ) const;

    void RepaintCoreRect( const SwRect& rRect );
};


/*--------------------------------------------------------------------
    Beschreibung:   Sicht auf ein Dokument
 --------------------------------------------------------------------*/

class SwPagePreView: public SfxViewShell
{
    // ViewWindow und Henkel zur Core
    // aktuelle Dispatcher-Shell
    SwPagePreViewWin        aViewWin;
    //viewdata of the previous SwView and the new crsrposition
    String                  sSwViewData,
    //and the new cursor position if the user double click in the PagePreView
                            sNewCrsrPos;
    // Sichtbarer Bereich
    String                  sPageStr;
    Size                    aDocSz;
    Rectangle               aVisArea;

    // MDI Bedienelemente
    SwScrollbar             *pHScrollbar;
    SwScrollbar             *pVScrollbar;
    ImageButton             *pPageUpBtn,
                            *pPageDownBtn;
    // Dummy-Window zum Fllen der rechten unteren Ecke, wenn beide Scrollbars
    // aktiv sind
    Window                  *pScrollFill;

    USHORT                  nPageCount;
    BOOL                    bNormalPrint;

    void            Init(const SwViewOption* = 0);
    Point           AlignToPixel(const Point& rPt) const;

    int             _CreateScrollbar( int bHori );
    int             _KillScrollbar( int bHori );
    DECL_LINK( ScrollHdl, SwScrollbar * );
    DECL_LINK( EndScrollHdl, SwScrollbar * );
    DECL_LINK( BtnPage, Button * );
    int             ChgPage( int eMvMode, int bUpdateScrollbar = TRUE );


    virtual USHORT          Print( SfxProgress &rProgress,
                                   PrintDialog *pPrintDialog = 0 );
    virtual SfxPrinter*     GetPrinter( BOOL bCreate = FALSE );
    virtual USHORT          SetPrinter( SfxPrinter *pNewPrinter, USHORT nDiffFlags = SFX_PRINTER_ALL );
    virtual SfxTabPage*     CreatePrintOptionsPage( Window *pParent,
                                                const SfxItemSet &rOptions );
    virtual PrintDialog*    CreatePrintDialog( Window *pParent );

    void CalcAndSetBorderPixel( SvBorder &rToFill, FASTBOOL bInner );


protected:
    virtual void    InnerResizePixel( const Point &rOfs, const Size &rSize );
    virtual void    OuterResizePixel( const Point &rOfs, const Size &rSize );
    virtual Size    GetOptimalSizePixel() const;

public:
    SFX_DECL_VIEWFACTORY(SwPagePreView);
    SFX_DECL_INTERFACE(SW_PAGEPREVIEW);
    TYPEINFO();

    inline Window*          GetFrameWindow() const { return &(GetViewFrame())->GetWindow(); }
    inline ViewShell&       GetViewShell() const { return *aViewWin.GetViewShell(); }
    inline const Rectangle& GetVisArea() const { return aVisArea; }
    inline void             GrabFocusViewWin() { aViewWin.GrabFocus(); }
    inline void             RepaintCoreRect( const SwRect& rRect )
                                { aViewWin.RepaintCoreRect( rRect ); }

    void            DocSzChgd(const Size& rNewSize);
    const Size&     GetDocSz() const { return aDocSz; }

    virtual void    SetVisArea( const Rectangle&, BOOL bUpdateScrollbar = TRUE);

    inline int      StatHScrollbar() const;
    inline int      CreateHScrollbar();
    inline int      KillHScrollbar();
    inline int      CreateVScrollbar();
    inline int      KillVScrollbar();
    inline int      StatVScrollbar() const;
    inline void     AdjustEditWin();

    void            VScrollViewSzChg();
    void            VScrollDocSzChg();

    USHORT          GetPageCount() const        { return nPageCount; }

    BOOL            HandleWheelCommands( const CommandEvent& );

    const String&   GetPrevSwViewData() const       { return sSwViewData; }
    void            SetNewCrsrPos( const String& rStr ) { sNewCrsrPos = rStr; }
    const String&   GetNewCrsrPos() const           { return sNewCrsrPos; }
        // Handler
    void            Execute(SfxRequest&);
    void            GetState(SfxItemSet&);
    void            StateUndo(SfxItemSet&);

    SwDocShell*     GetDocShell();

    SwPagePreView( SfxViewFrame* pFrame, SfxViewShell* );
    ~SwPagePreView();
};

// ----------------- inline Methoden ----------------------

inline int SwPagePreView::StatHScrollbar() const
{
    return  0 != pHScrollbar;
}
inline int SwPagePreView::CreateHScrollbar()
{
    return StatHScrollbar() ? 1 : _CreateScrollbar( TRUE );
}
inline int SwPagePreView::KillHScrollbar()
{
    return StatHScrollbar() ? _KillScrollbar( TRUE ) : 1;
}

inline int SwPagePreView::StatVScrollbar() const
{
    return  0 != pVScrollbar;
}
inline int SwPagePreView::CreateVScrollbar()
{
    return StatVScrollbar() ? 1 : _CreateScrollbar( FALSE );
}
inline int SwPagePreView::KillVScrollbar()
{
    return StatVScrollbar() ? _KillScrollbar( FALSE ) : 1;
}

inline void SwPagePreView::AdjustEditWin()
{
    OuterResizePixel( Point(), GetFrameWindow()->GetOutputSizePixel() );
}

#endif
diff --git a/sw/source/ui/inc/redlndlg.hxx b/sw/source/ui/inc/redlndlg.hxx
new file mode 100644
index 0000000..21cdc68
--- /dev/null
+++ b/sw/source/ui/inc/redlndlg.hxx
@@ -0,0 +1,131 @@
/*************************************************************************
 *
 *  $RCSfile: redlndlg.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:41 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWREDLNDLG_HXX
#define _SWREDLNDLG_HXX

#include "chldwrap.hxx"

#ifndef _BASEDLGS_HXX //autogen
#include <sfx2/basedlgs.hxx>
#endif

class SwChildWinWrapper;
class SwRedlineAcceptDlg;

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

class SwModelessRedlineAcceptDlg : public SfxModelessDialog
{
    SwRedlineAcceptDlg*     pImplDlg;
    SwChildWinWrapper*      pChildWin;

    virtual void    Resize();

public:
    SwModelessRedlineAcceptDlg(SfxBindings*, SwChildWinWrapper*, Window *pParent);
    ~SwModelessRedlineAcceptDlg();

    virtual void    Activate();
    virtual void    FillInfo(SfxChildWinInfo&) const;
    void            Initialize (SfxChildWinInfo* pInfo);
};

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

class SwModalRedlineAcceptDlg : public SfxModalDialog
{
    SwRedlineAcceptDlg*     pImplDlg;

    virtual void    Resize();

public:
    SwModalRedlineAcceptDlg(Window *pParent);
    ~SwModalRedlineAcceptDlg();

    void            AcceptAll( BOOL bAccept );
    virtual void    Activate();
};

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

class SwRedlineAcceptChild : public SwChildWinWrapper
{
public:
    SwRedlineAcceptChild(   Window* ,
                            USHORT nId,
                            SfxBindings*,
                            SfxChildWinInfo*  );

    SFX_DECL_CHILDWINDOW( SwRedlineAcceptChild );

    virtual BOOL    ReInitDlg(SwDocShell *pDocSh);
};


#endif


diff --git a/sw/source/ui/inc/regionsw.hxx b/sw/source/ui/inc/regionsw.hxx
new file mode 100644
index 0000000..d533f68
--- /dev/null
+++ b/sw/source/ui/inc/regionsw.hxx
@@ -0,0 +1,418 @@
/*************************************************************************
 *
 *  $RCSfile: regionsw.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:41 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _REGIONSW_HXX
#define _REGIONSW_HXX

#ifndef _SV_FIELD_HXX
#include <vcl/field.hxx>
#endif
#ifndef _SV_LSTBOX_HXX
#include <vcl/lstbox.hxx>
#endif
#ifndef _EDIT_HXX //autogen
#include <vcl/edit.hxx>
#endif
#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif
#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif
#ifndef _COMBOBOX_HXX //autogen
#include <vcl/combobox.hxx>
#endif
#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif
#ifndef _BITMAP_HXX //autogen
#include <vcl/bitmap.hxx>
#endif
#ifndef _SVTREEBOX_HXX //autogen
#include <svtools/svtreebx.hxx>
#endif
#ifndef _BASEDLGS_HXX //autogen
#include <sfx2/basedlgs.hxx>
#endif
#ifndef _SFXTABDLG_HXX //autogen
#include <sfx2/tabdlg.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif

#ifndef _CONDEDIT_HXX
#include <condedit.hxx>
#endif
#ifndef _SECTION_HXX
#include <section.hxx>
#endif
#ifndef _FMTCLDS_HXX
#include <fmtclds.hxx>
#endif
#ifndef _FMTFTNTX_HXX
#include <fmtftntx.hxx>
#endif
#ifndef _FMTCLBL_HXX
#include <fmtclbl.hxx>
#endif

class SwWrtShell;
class EditRegionDlg;
class DropEvent;

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

class SectRepr
{
    SwSection               aSection;
    SwFmtCol                aCol;
    SvxBrushItem            aBrush;
    SwFmtFtnAtTxtEnd        aFtnNtAtEnd;
    SwFmtEndAtTxtEnd        aEndNtAtEnd;
    SwFmtNoBalancedColumns  aBalance;
    USHORT                  nArrPos;
    USHORT                  nColumn;
    BOOL                    bContent    : 1; //zeigt an, ob evtl. Textinhalt im Bereich ist
    BOOL                    bSelected   : 1; //fuer Multiselektion erst markieren, dann mit der TreeListBox arbeiten!
    BOOL                    bIsCondition: 1; //

public:
    SectRepr(USHORT nPos, SwSection& rSect);
    int     operator ==(SectRepr& rSectRef) const
            {return nArrPos==rSectRef.GetArrPos();}

    int     operator <(SectRepr& rSectRef) const
            {return nArrPos<rSectRef.GetArrPos();}

    SwSection&          GetSection()        { return aSection; }
    SwFmtCol&           GetCol()            { return aCol; }
    SvxBrushItem&       GetBackground()     { return aBrush; }
    SwFmtFtnAtTxtEnd&   GetFtnNtAtEnd()     { return aFtnNtAtEnd; }
    SwFmtEndAtTxtEnd&   GetEndNtAtEnd()     { return aEndNtAtEnd; }
    SwFmtNoBalancedColumns& GetBalance()        { return aBalance; }

    USHORT              GetArrPos() const {return nArrPos;}
    const String&       GetCondition() const {return aSection.GetCondition();}
    const String&       GetName() const { return aSection.GetName(); }
    String              GetFile() const;
    String              GetSubRegion() const;
    void                SetFile( const String& rFile );
    void                SetFilter( const String& rFilter );
    void                SetSubRegion( const String& rSubRegion );

    void                SetFilePasswd( const String& rPasswd )
                        { aSection.SetLinkFilePassWd( rPasswd ); }
    void                SetCondition( const String& rString )
                        {aSection.SetCondition( rString);}
    int                 IsCondHidden()const
                        {return aSection.IsCondHidden();}
    int                 IsHidden()const
                        {return aSection.IsHidden();}
    int                 IsProtect()const
                        {return aSection.IsProtect();}
    void                SetHidden(int bFlag = TRUE)
                        {aSection.SetHidden(bFlag);}
    void                SetCondHidden(int bFlag = TRUE)
                        {aSection.SetCondHidden(bFlag);}
    void                SetProtect(int bFlag = TRUE)
                        {aSection.SetProtect(bFlag);}
    BOOL                IsContent(){return bContent;}
    void                SetContent(BOOL bValue){bContent = bValue;}
    void                SetSectionType(SectionType eSectionType) {aSection.SetType(eSectionType);}
    SectionType         GetSectionType(){return aSection.GetType();}

    void                SetSelected(){bSelected = TRUE;}
    BOOL                IsSelected() const {return bSelected;}

    BOOL                IsConditionValid() const {return bIsCondition;}
    void                SetConditionValid(BOOL bSet) { bIsCondition = bSet;}

};

/*************************************************************************
    Dialog "Bereiche bearbeiten"
*************************************************************************/

typedef SectRepr* SectReprPtr;
SV_DECL_PTRARR_SORT( SectReprArr, SectReprPtr, 0, 4 )

class SwEditRegionDlg : public SfxModalDialog
{
    SvTreeListBox   aTree;
    CheckBox        aPasswdCB;
    FixedText       aNameFT;
    Edit            aCurName;
    TriStateBox     aProtectCB;
    TriStateBox     aHideCB;
    TriStateBox     aCondCB;
    ConditionEdit   aConditionED;

    TriStateBox     aFileCB;
#ifdef DDE_AVAILABLE
    CheckBox        aDDECB;
#endif
    FixedText       aFileNameFT;
#ifdef DDE_AVAILABLE
    FixedText       aDDECommandFT;
#endif
    Edit            aFileNameED;
    ComboBox        aSubRegionED;
    FixedText       aSubRegionFT;
    OKButton        aOK;
    CancelButton    aCancel;
    PushButton      aOptionsPB;
    PushButton      aDismiss;
    HelpButton      aHelp;
    PushButton      aFilePB;
    GroupBox        aGroupBoxName;
    GroupBox        aGroupBoxOptions;
    Bitmap          aProtHideBM;
    Bitmap          aProtNoHideBM;
    Bitmap          aNoProtHideBM;
    Bitmap          aNoProtNoHideBM;
    Bitmap          aExpNode;
    Bitmap          aCollNode;

    Bitmap          aBmpArr[4];
    String          aNewPasswd;
    SwWrtShell&     rSh;
    SectReprArr     aSectReprArr;
    SvLBoxEntry*    pAktEntry;
    const SwSection*pCurrSect;

    BOOL            bIsPasswd       :1;
    BOOL            bIsPasswdSet    :1;
    BOOL            bWeb            :1;


    Bitmap&         BuildBitmap(BOOL bProtect,BOOL bHidden)
                    { return aBmpArr[bProtect+(bHidden<<1)]; }

public:
    SwEditRegionDlg( Window* pParent, SwWrtShell& rWrtSh );
    virtual ~SwEditRegionDlg();

    void    RecurseList( const SwSectionFmt* pFmt, SvLBoxEntry* pEntry);
    USHORT  FindArrPos(const SwSectionFmt* pFmt);

    void    SetPassword(const String& rPassWd);

    DECL_LINK( GetFirstEntryHdl, SvTreeListBox * );
    DECL_LINK( DeselectHdl, SvTreeListBox * );

    DECL_LINK( OkHdl, CheckBox * );
    DECL_LINK( NameEditHdl, Edit * );
    DECL_LINK( ConditionEditHdl, Edit * );

    DECL_LINK( ChangePasswdHdl, CheckBox * );
    DECL_LINK( ChangeProtectHdl, TriStateBox * );
    DECL_LINK( ChangeHideHdl, TriStateBox * );
    DECL_LINK( ChangeCondHdl, TriStateBox * );
    DECL_LINK( ChangeDismissHdl, CheckBox * );
    DECL_LINK( UseFileHdl, CheckBox* );
    DECL_LINK( FileSearchHdl, PushButton* );
    DECL_LINK( OptionsHdl, PushButton* );
    DECL_LINK( FileNameHdl, Edit* );
#ifdef DDE_AVAILABLE
    DECL_LINK( DDEHdl, CheckBox* );
#endif
};
/*************************************************************************
    Dialog "Bereich einfuegen"
*************************************************************************/

/* -----------------21.05.99 11:05-------------------
 *
 * --------------------------------------------------*/
class SwInsertSectionTabPage : public SfxTabPage
{
    ComboBox        aCurName;
    CheckBox        aProtectCB;
    CheckBox        aHideCB;
    CheckBox        aCondCB;
    ConditionEdit   aConditionED;
    CheckBox        aFileCB;
#ifdef DDE_AVAILABLE
    CheckBox        aDDECB;
    FixedText       aDDECommandFT;
#endif
    FixedText       aFileNameFT;
    Edit            aFileNameED;
    FixedText       aSubRegionFT;
    ComboBox        aSubRegionED;
    PushButton      aFilePB;
    GroupBox        aGroupBoxName;
    GroupBox        aGroupBoxOptions;
    String          sSection;
    String          sFileName;
    String          sFilterName;
    String          sFilePasswd;

//  SwFmtCol*       pCols;
    const String*   pPasswdSect;
//  SfxRequest*     pRequest;
    SwWrtShell*     pWrtSh;

    DECL_LINK( ChangeHideHdl, CheckBox * );
    DECL_LINK( ChangeProtectHdl, CheckBox * );
    DECL_LINK( ChangeCondHdl, CheckBox * );
    DECL_LINK( NameEditHdl, Edit * );
    DECL_LINK( UseFileHdl, CheckBox* );
    DECL_LINK( FileSearchHdl, PushButton* );
#ifdef DDE_AVAILABLE
    DECL_LINK( DDEHdl, CheckBox* );
#endif

    void            FillList(  const SwSectionFmt* pFmt = 0 );

public:
    SwInsertSectionTabPage(Window *pParent, const SfxItemSet &rAttrSet);
    virtual ~SwInsertSectionTabPage();

    void    SetWrtShell(SwWrtShell& rSh);

    virtual BOOL        FillItemSet( SfxItemSet& );
    virtual void        Reset( const SfxItemSet& );

    static SfxTabPage*  Create( Window* pParent,
                                const SfxItemSet& rAttrSet);
};

class SwSectionFtnEndTabPage : public SfxTabPage
{
    GroupBox        aGroupBoxFtn;
    CheckBox        aFtnNtAtTextEndCB;

    CheckBox        aFtnNtNumCB;
    FixedText       aFtnOffsetLbl;
    NumericField    aFtnOffsetFld;

    CheckBox        aFtnNtNumFmtCB;
    FixedText       aFtnPrefixFT;
    Edit            aFtnPrefixED;
    ListBox         aFtnNumViewBox;
    FixedText       aFtnSuffixFT;
    Edit            aFtnSuffixED;

    GroupBox        aGroupBoxEnd;
    CheckBox        aEndNtAtTextEndCB;

    CheckBox        aEndNtNumCB;
    FixedText       aEndOffsetLbl;
    NumericField    aEndOffsetFld;

    CheckBox        aEndNtNumFmtCB;
    FixedText       aEndPrefixFT;
    Edit            aEndPrefixED;
    ListBox         aEndNumViewBox;
    FixedText       aEndSuffixFT;
    Edit            aEndSuffixED;


    DECL_LINK( FootEndHdl, CheckBox * );
    void ResetState( BOOL bFtn, const SwFmtFtnEndAtTxtEnd& );

public:
    SwSectionFtnEndTabPage( Window *pParent, const SfxItemSet &rAttrSet );
    virtual ~SwSectionFtnEndTabPage();

    virtual BOOL        FillItemSet( SfxItemSet& );
    virtual void        Reset( const SfxItemSet& );

    static SfxTabPage*  Create( Window* pParent,
                                const SfxItemSet& rAttrSet);
};

/* -----------------21.05.99 13:07-------------------
 *
 * --------------------------------------------------*/
class SwInsertSectionTabDialog : public SfxTabDialog
{
    SwWrtShell&     rWrtSh;
    SwSection*      pToInsertSection;
protected:
    virtual void    PageCreated( USHORT nId, SfxTabPage &rPage );
    virtual short   Ok();
public:
    SwInsertSectionTabDialog(Window* pParent, const SfxItemSet& rSet, SwWrtShell& rSh);
    virtual ~SwInsertSectionTabDialog();

    void        SetSection(const SwSection& rSect);
    SwSection*  GetSection() { return pToInsertSection;}
};

/* -----------------21.05.99 13:07-------------------
 *
 * --------------------------------------------------*/
class SwSectionPropertyTabDialog : public SfxTabDialog
{
protected:
    virtual void    PageCreated( USHORT nId, SfxTabPage &rPage );
public:
    SwSectionPropertyTabDialog(Window* pParent, const SfxItemSet& rSet, SwWrtShell& rSh);
    virtual ~SwSectionPropertyTabDialog();
};

#endif


diff --git a/sw/source/ui/inc/ribbar.hrc b/sw/source/ui/inc/ribbar.hrc
new file mode 100644
index 0000000..68d73f2
--- /dev/null
+++ b/sw/source/ui/inc/ribbar.hrc
@@ -0,0 +1,168 @@
/*************************************************************************
 *
 *  $RCSfile: ribbar.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:41 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _RIBBAR_HRC
#define _RIBBAR_HRC

#include "rcid.hrc"

#define MN_FORM1        1           // Defines fuer NumNames-Popup
#define MN_FORMBASE     MN_FORM1
#define MN_FORM2        2
#define MN_FORM3        3
#define MN_FORM4        4
#define MN_FORM5        5

#define WIN_RIBBAR          RC_RIBBAR_BEGIN

#define CB_FORMAT           (RC_RIBBAR_BEGIN +1)
#define CB_FONT             (RC_RIBBAR_BEGIN +2)
#define CB_SIZE             (RC_RIBBAR_BEGIN +3)
#define PB_FORMULA_OK       (RC_RIBBAR_BEGIN +4)
#define PB_FORMULA_CANCEL   (RC_RIBBAR_BEGIN +5)
#define BMP_OK              PB_FORMULA_OK
#define BMP_CANCEL          PB_FORMULA_CANCEL
#define RID_TBX_FORMULA     (RC_RIBBAR_BEGIN +6)
#define FT_POS              (RC_RIBBAR_BEGIN +7)
#define BT_FORMULA          (RC_RIBBAR_BEGIN +8)
#define STR_FORMULA         (RC_RIBBAR_BEGIN +9)

#define STR_BACKGROUND_PATTERN      (RC_RIBBAR_BEGIN + 10)
#define STR_BACKGROUND_COLOR        (RC_RIBBAR_BEGIN + 11)
#define STR_BORDER_COLOR            (RC_RIBBAR_BEGIN + 12)
#define STR_BORDER_STYLE            (RC_RIBBAR_BEGIN + 13)
#define STR_BORDER_LINE             (RC_RIBBAR_BEGIN + 14)
#define STR_TEXT_COLOR              (RC_RIBBAR_BEGIN + 15)
#define STR_NUMLIST                 (RC_RIBBAR_BEGIN + 16)

#define STR_HELP_TOOLBOX_TOGGLE     (RC_RIBBAR_BEGIN + 17)

#define RID_DRAW_WIN                (RC_RIBBAR_BEGIN + 18)
#define RID_CNTRLR_WIN              (RC_RIBBAR_BEGIN + 19)
#define RID_ALIGNMENT_WIN           (RC_RIBBAR_BEGIN + 20)

//Resourcen fuer Inputwin (Rechenleiste)
#define RID_WIN_FORMULA             (RC_RIBBAR_BEGIN + 21)
#define MN_CALC_POPUP               (RC_RIBBAR_BEGIN + 22)

#define MN_NUMNAMES_POPUP           (RC_RIBBAR_BEGIN + 23)
#define RID_INSERT_CTRL             (RC_RIBBAR_BEGIN + 24)
#define RID_INSERT_OBJ_CTRL         (RC_RIBBAR_BEGIN + 25)
#define RID_INSERT_FIELD_CTRL       (RC_RIBBAR_BEGIN + 26)
#define RID_TBL_OPT_CTRL            (RC_RIBBAR_BEGIN + 27)
#define RID_BEZIER_WIN              (RC_RIBBAR_BEGIN + 28)
#define RID_SCROLL_NAVI_TBX         (RC_RIBBAR_BEGIN + 29)
#define RID_SCROLL_NAVIGATION_WIN   (RC_RIBBAR_BEGIN + 30)

#define STR_IMGBTN_START            (RC_RIBBAR_BEGIN + 31)

#define STR_IMGBTN_NEXT_DOWN        (STR_IMGBTN_START + 0)
#define STR_IMGBTN_PREV_DOWN        (STR_IMGBTN_START + 1)
#define STR_IMGBTN_TBL_DOWN         (STR_IMGBTN_START + 2)
#define STR_IMGBTN_FRM_DOWN         (STR_IMGBTN_START + 3)
#define STR_IMGBTN_PGE_DOWN         (STR_IMGBTN_START + 4)
#define STR_IMGBTN_DRW_DOWN         (STR_IMGBTN_START + 5)
#define STR_IMGBTN_CTRL_DOWN        (STR_IMGBTN_START + 6)
#define STR_IMGBTN_REG_DOWN         (STR_IMGBTN_START + 7)
#define STR_IMGBTN_BKM_DOWN         (STR_IMGBTN_START + 8)
#define STR_IMGBTN_GRF_DOWN         (STR_IMGBTN_START + 9)
#define STR_IMGBTN_OLE_DOWN         (STR_IMGBTN_START +10)
#define STR_IMGBTN_OUTL_DOWN        (STR_IMGBTN_START +11)
#define STR_IMGBTN_SEL_DOWN         (STR_IMGBTN_START +12)
#define STR_IMGBTN_FTN_DOWN         (STR_IMGBTN_START +13)
#define STR_IMGBTN_MARK_DOWN        (STR_IMGBTN_START +14)
#define STR_IMGBTN_POSTIT_DOWN      (STR_IMGBTN_START +15)
#define STR_IMGBTN_SRCH_REP_DOWN    (STR_IMGBTN_START +16)
#define STR_IMGBTN_INDEX_ENTRY_DOWN (STR_IMGBTN_START +17)
#define STR_IMGBTN_TBLFML_DOWN      (STR_IMGBTN_START +18)
#define STR_IMGBTN_TBLFML_ERR_DOWN  (STR_IMGBTN_START +19)

#define STR_IMGBTN_NEXT_UP          (STR_IMGBTN_START +20)
#define STR_IMGBTN_PREV_UP      (STR_IMGBTN_START +21)
#define STR_IMGBTN_TBL_UP           (STR_IMGBTN_START +22)
#define STR_IMGBTN_FRM_UP           (STR_IMGBTN_START +23)
#define STR_IMGBTN_PGE_UP           (STR_IMGBTN_START +24)
#define STR_IMGBTN_DRW_UP           (STR_IMGBTN_START +25)
#define STR_IMGBTN_CTRL_UP          (STR_IMGBTN_START +26)
#define STR_IMGBTN_REG_UP           (STR_IMGBTN_START +27)
#define STR_IMGBTN_BKM_UP           (STR_IMGBTN_START +28)
#define STR_IMGBTN_GRF_UP           (STR_IMGBTN_START +29)
#define STR_IMGBTN_OLE_UP           (STR_IMGBTN_START +30)
#define STR_IMGBTN_OUTL_UP          (STR_IMGBTN_START +31)
#define STR_IMGBTN_SEL_UP           (STR_IMGBTN_START +32)
#define STR_IMGBTN_FTN_UP           (STR_IMGBTN_START +33)
#define STR_IMGBTN_MARK_UP          (STR_IMGBTN_START +34)
#define STR_IMGBTN_POSTIT_UP        (STR_IMGBTN_START +35)
#define STR_IMGBTN_SRCH_REP_UP      (STR_IMGBTN_START +36)
#define STR_IMGBTN_INDEX_ENTRY_UP   (STR_IMGBTN_START +37)
#define STR_IMGBTN_TBLFML_UP        (STR_IMGBTN_START +38)
#define STR_IMGBTN_TBLFML_ERR_UP    (STR_IMGBTN_START +39)

#define BTN_NAVI                    (STR_IMGBTN_START +40)

#define MN_ANCHOR_POPUP             (STR_IMGBTN_START +41)

#define RC_RIBBAR_ACT_END           MN_ANCHOR_POPUP

#if  RC_RIBBAR_ACT_END   >  RC_RIBBAR_END
#error Resource-Id Ueberlauf in #file, #line
#endif

#endif
diff --git a/sw/source/ui/inc/rowht.hxx b/sw/source/ui/inc/rowht.hxx
new file mode 100644
index 0000000..4357697
--- /dev/null
+++ b/sw/source/ui/inc/rowht.hxx
@@ -0,0 +1,103 @@
/*************************************************************************
 *
 *  $RCSfile: rowht.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:41 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _ROWHT_HXX
#define _ROWHT_HXX

#ifndef _SVX_STDDLG_HXX //autogen
#include <svx/stddlg.hxx>
#endif

#ifndef _FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif

#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif

#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif

#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif

class SwWrtShell;

class SwTableHeightDlg : public SvxStandardDialog
{
    MetricField     aHeightEdit;
    CheckBox        aAutoHeightCB;
    GroupBox        aHeightFrm;
    OKButton        aOKBtn;
    CancelButton    aCancelBtn;
    HelpButton      aHelpBtn;
    SwWrtShell      &rSh;

protected:
    virtual void Apply();

public:
    SwTableHeightDlg( Window *pParent, SwWrtShell &rS );
};

#endif
diff --git a/sw/source/ui/inc/scroll.hxx b/sw/source/ui/inc/scroll.hxx
new file mode 100644
index 0000000..0d15009
--- /dev/null
+++ b/sw/source/ui/inc/scroll.hxx
@@ -0,0 +1,105 @@
/*************************************************************************
 *
 *  $RCSfile: scroll.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:41 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SCROLL_HXX
#define _SCROLL_HXX

#ifndef _SCRBAR_HXX //autogen
#include <vcl/scrbar.hxx>
#endif

class SwRect;

class SwScrollbar: public ScrollBar
{
    Size    aDocSz;
    BOOL    bHori       :1;     // Horizontal = TRUE, sonst Vertikal
    BOOL    bAuto       :1;     // fuer Scrollingmode
    BOOL    bThumbEnabled:1;
    BOOL    bVisible    :1;     // Show/Hide sollen nur noch dieses Flag setzen
    BOOL    bSizeSet    :1;     // wurde die Groesse bereits gesetzt?

    void    AutoShow();
public:
    void    Show( BOOL bVisible = TRUE );
    void    Hide() { Show( FALSE ); }
    void    SetPosSizePixel( const Point& rNewPos, const Size& rNewSize );
    BOOL    IsVisible(BOOL bReal = FALSE) const { return bReal ? ScrollBar::IsVisible() : bVisible; }
    void    SetUpdateMode( BOOL bUpdate );
        // Aenderung der Dokumentgroesse
    void    DocSzChgd(const Size &rNewSize);
        // Aenderung des sichtbaren Bereiches
    void    ViewPortChgd(const Rectangle &rRectangle);
        // was fuer einer ist es denn ??
    int     IsHoriScroll() const { return bHori; }

    void    SetAuto(BOOL bSet);
    BOOL    IsAuto() { return bAuto;}

    //Bewegungen des Thumbs abklemmen
    void    EnableThumbPos( BOOL bEnable, const SwRect &rVisArea );

    SwScrollbar(Window *pParent, int bHori = TRUE );
    ~SwScrollbar();
};



#endif
diff --git a/sw/source/ui/inc/selglos.hxx b/sw/source/ui/inc/selglos.hxx
new file mode 100644
index 0000000..a348d55
--- /dev/null
+++ b/sw/source/ui/inc/selglos.hxx
@@ -0,0 +1,113 @@
/*************************************************************************
 *
 *  $RCSfile: selglos.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:42 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SELGLOS_HXX
#define _SELGLOS_HXX

#ifndef _DIALOG_HXX //autogen
#include <vcl/dialog.hxx>
#endif


#ifndef _LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif

#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif

#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif


class SwSelGlossaryDlg : public ModalDialog
{
protected:
    ListBox         aGlosBox;
    GroupBox        aGlosFrm;
    OKButton        aOKBtn;
    CancelButton    aCancelBtn;
    HelpButton      aHelpBtn;

    DECL_LINK(DoubleClickHdl, ListBox*);
public:
    SwSelGlossaryDlg(Window * pParent, const String &rShortName);
    ~SwSelGlossaryDlg();
    void InsertGlos(const String &rRegion, const String &rGlosName);    // inline
    USHORT GetSelectedIdx() const;  // inline
    void SelectEntryPos(USHORT nIdx);   // inline
};

inline void SwSelGlossaryDlg::InsertGlos(const String &rRegion,
                                const String &rGlosName)
{
    String aTmp( rRegion );
    aTmp += ':';
    aTmp += rGlosName;
    aGlosBox.InsertEntry( aTmp );
}
inline USHORT SwSelGlossaryDlg::GetSelectedIdx() const
{   return aGlosBox.GetSelectEntryPos(); }
inline void SwSelGlossaryDlg::SelectEntryPos(USHORT nIdx)
{   aGlosBox.SelectEntryPos(nIdx); }

#endif
diff --git a/sw/source/ui/inc/shdwcrsr.hxx b/sw/source/ui/inc/shdwcrsr.hxx
new file mode 100644
index 0000000..17b6324
--- /dev/null
+++ b/sw/source/ui/inc/shdwcrsr.hxx
@@ -0,0 +1,105 @@
/*************************************************************************
 *
 *  $RCSfile: shdwcrsr.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:42 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SHDWCRSR_HXX
#define _SHDWCRSR_HXX


#ifndef _GEN_HXX //autogen
#include <tools/gen.hxx>
#endif
#ifndef _SV_COLOR_HXX //autogen
#include <vcl/color.hxx>
#endif
#include  <limits.h>

class Window;

class SwShadowCursor
{
    Window* pWin;
    Color aCol;
    Point aOldPt;
    long nOldHeight;
    USHORT nOldMode;

    void DrawTri( const Point& rPt, long nHeight, BOOL bLeft );
    void DrawCrsr( const Point& rPt, long nHeight, USHORT nMode );

public:
    SwShadowCursor( Window& rWin, const Color& rCol )
        : pWin( &rWin ), nOldMode( USHRT_MAX ), aCol( rCol ) {}
    ~SwShadowCursor();

    void SetPos( const Point& rPt, long nHeight, USHORT nMode );

    void Paint();

    const Point& GetPoint() const   { return aOldPt; }
    long GetHeight() const          { return nOldHeight; }
    USHORT GetMode() const          { return nOldMode; }

    Rectangle GetRect() const;
};



#endif

diff --git a/sw/source/ui/inc/shells.hrc b/sw/source/ui/inc/shells.hrc
new file mode 100644
index 0000000..44eb7ef
--- /dev/null
+++ b/sw/source/ui/inc/shells.hrc
@@ -0,0 +1,140 @@
/*************************************************************************
 *
 *  $RCSfile: shells.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:42 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _SHELLS_HRC
#define _SHELLS_HRC

#include "rcid.hrc"

#define MSG_REMOVE_LINK            (RC_SHELLS_BEGIN +  1)

#define STR_GRFILTER_OPENERROR     (RC_SHELLS_BEGIN +  1)
#define STR_GRFILTER_IOERROR       (RC_SHELLS_BEGIN +  2)
#define STR_GRFILTER_FORMATERROR   (RC_SHELLS_BEGIN +  3)
#define STR_GRFILTER_VERSIONERROR  (RC_SHELLS_BEGIN +  4)
#define STR_GRFILTER_FILTERERROR   (RC_SHELLS_BEGIN +  5)
#define STR_GRFILTER_TOOBIG        (RC_SHELLS_BEGIN +  6)
#define STR_INSERT_GRAPHIC         (RC_SHELLS_BEGIN +  7)
#define STR_NOTIZ_INSERT           (RC_SHELLS_BEGIN +  8)
#define DLG_IMPORT_DBNAME          (RC_SHELLS_BEGIN +  9)
#define STR_NO_ADDRESSBOOK         (RC_SHELLS_BEGIN + 10)
#define STR_REDLINE_COMMENT        (RC_SHELLS_BEGIN + 11)
#define STR_REDLINE_INSERTED       (RC_SHELLS_BEGIN + 12)
#define STR_REDLINE_DELETED        (RC_SHELLS_BEGIN + 13)
#define STR_REDLINE_FMTCOLLSET     (RC_SHELLS_BEGIN + 14)

#define RID_TEXT_TOOLBOX           (RC_SHELLS_BEGIN +  15)
#define RID_TABLE_TOOLBOX          (RC_SHELLS_BEGIN +  16)
#define RID_FRAME_TOOLBOX          (RC_SHELLS_BEGIN +  17)
#define RID_GRAFIK_TOOLBOX         (RC_SHELLS_BEGIN +  18)
#define RID_DRAW_TOOLBOX           (RC_SHELLS_BEGIN +  19)
#define RID_DRAW_TEXT_TOOLBOX      (RC_SHELLS_BEGIN +  20)
#define RID_NUM_TOOLBOX            (RC_SHELLS_BEGIN +  21)
#define RID_OLE_TOOLBOX            (RC_SHELLS_BEGIN +  22)
#define RID_TOOLS_TOOLBOX          (RC_SHELLS_BEGIN +  23)

#define STR_SHELLNAME_TEXT         (RC_SHELLS_BEGIN +  24)
#define STR_SHELLNAME_TABLE        (RC_SHELLS_BEGIN +  25)
#define STR_SHELLNAME_FRAME        (RC_SHELLS_BEGIN +  26)
#define STR_SHELLNAME_GRAPHIC      (RC_SHELLS_BEGIN +  27)
#define STR_SHELLNAME_OBJECT       (RC_SHELLS_BEGIN +  28)
#define STR_SHELLNAME_LIST         (RC_SHELLS_BEGIN +  29)
#define STR_SHELLNAME_DRAW         (RC_SHELLS_BEGIN +  30)
#define STR_SHELLNAME_DRAW_TEXT    (RC_SHELLS_BEGIN +  31)

#define RID_SRCVIEW_TOOLBOX        (RC_SHELLS_BEGIN +  32)

#define RID_BEZIER_TOOLBOX         (RC_SHELLS_BEGIN +  33)
#define STR_SHELLNAME_BEZIER       (RC_SHELLS_BEGIN +  34)

#define STR_SWBG_PARAGRAPH         (RC_SHELLS_BEGIN +  37)
#define STR_SWBG_GRAPHIC           (RC_SHELLS_BEGIN +  38)
#define STR_SWBG_OLE               (RC_SHELLS_BEGIN +  39)
#define STR_SWBG_FRAME             (RC_SHELLS_BEGIN +  40)
#define STR_SWBG_TABLE             (RC_SHELLS_BEGIN +  41)
#define STR_SWBG_TABLE_ROW         (RC_SHELLS_BEGIN +  42)
#define STR_SWBG_TABLE_CELL        (RC_SHELLS_BEGIN +  43)
#define STR_SWBG_PAGE              (RC_SHELLS_BEGIN +  44)
#define STR_SWBG_HEADER            (RC_SHELLS_BEGIN +  45)
#define STR_SWBG_FOOTER            (RC_SHELLS_BEGIN +  46)
#define MSG_NO_RULER               (RC_SHELLS_BEGIN +  47)

#define STR_SHELLNAME_DRAWFORM     (RC_SHELLS_BEGIN +  48)
#define RID_DRAWFORM_TOOLBOX       (RC_SHELLS_BEGIN +  49)

#define STR_REDLINE_FORMATED       (RC_SHELLS_BEGIN + 50)
#define STR_REDLINE_TABLECHG       (RC_SHELLS_BEGIN + 51)

#define STR_REDLINE_TITLE           (RC_SHELLS_BEGIN + 52)
#define STR_REDLINE_MSG             (RC_SHELLS_BEGIN + 53)
#define STR_REDLINE_ACCEPT_ALL      (RC_SHELLS_BEGIN + 54)
#define STR_REDLINE_REJECT_ALL      (RC_SHELLS_BEGIN + 55)
#define STR_REDLINE_EDIT            (RC_SHELLS_BEGIN + 56)
#define STR_REDLINE_AUTOFMT         (RC_SHELLS_BEGIN + 57)

#define SHELLS_ACT_END              STR_REDLINE_AUTOFMT

#if SHELLS_ACT_END > RC_SHELLS_END
#error Resource-Id Ueberlauf in #file, #line
#endif

#endif

diff --git a/sw/source/ui/inc/split.hxx b/sw/source/ui/inc/split.hxx
new file mode 100644
index 0000000..432e302
--- /dev/null
+++ b/sw/source/ui/inc/split.hxx
@@ -0,0 +1,115 @@
/*************************************************************************
 *
 *  $RCSfile: split.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:42 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _TAB_SPLIT_HXX
#define _TAB_SPLIT_HXX

#ifndef _SVX_STDDLG_HXX //autogen
#include <svx/stddlg.hxx>
#endif

#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif

#ifndef _FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif

#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif

#ifndef _IMAGEBTN_HXX //autogen
#include <vcl/imagebtn.hxx>
#endif

#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif

#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif

class SwWrtShell;

class SwSplitTableDlg : public SvxStandardDialog
{
    FixedText           aCountLbl;
    NumericField        aCountEdit;
    GroupBox            aCountFrm;
    ImageRadioButton    aHorzBox;
    ImageRadioButton    aVertBox;
    GroupBox            aDirFrm;
    OKButton            aOKBtn;
    CancelButton        aCancelBtn;
    HelpButton          aHelpBtn;
    SwWrtShell&         rSh;

protected:
    virtual void Apply();

public:
    SwSplitTableDlg(Window *pParent, SwWrtShell& rShell );
    DECL_STATIC_LINK( SwSplitTableDlg, ClickHdl, Button * );
};

#endif
diff --git a/sw/source/ui/inc/splittbl.hxx b/sw/source/ui/inc/splittbl.hxx
new file mode 100644
index 0000000..d516ae0
--- /dev/null
+++ b/sw/source/ui/inc/splittbl.hxx
@@ -0,0 +1,100 @@
/*************************************************************************
 *
 *  $RCSfile: splittbl.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:42 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SPLITTBL_HXX
#define _SPLITTBL_HXX

#ifndef _SVX_STDDLG_HXX //autogen
#include <svx/stddlg.hxx>
#endif

#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif

#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif

class SwWrtShell;

class SwSplitTblDlg : public SvxStandardDialog
{
    OKButton        aOKPB;
    CancelButton    aCancelPB;
    HelpButton      aHelpPB;
    GroupBox        aSplitGB;
    RadioButton     aCntntCopyRB;
    RadioButton     aBoxAttrCopyWithParaRB ;
    RadioButton     aBoxAttrCopyNoParaRB ;
    RadioButton     aBorderCopyRB;

    SwWrtShell      &rShell;

protected:
    virtual void Apply();

public:
    SwSplitTblDlg( Window *pParent, SwWrtShell &rSh );
};

#endif


diff --git a/sw/source/ui/inc/srcedtw.hxx b/sw/source/ui/inc/srcedtw.hxx
new file mode 100644
index 0000000..0e76a8b
--- /dev/null
+++ b/sw/source/ui/inc/srcedtw.hxx
@@ -0,0 +1,198 @@
/*************************************************************************
 *
 *  $RCSfile: srcedtw.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:42 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SRCEDTW_HXX
#define _SRCEDTW_HXX

#ifndef _WINDOW_HXX //autogen
#include <vcl/window.hxx>
#endif

#ifndef _SFXLSTNER_HXX //autogen
#include <svtools/lstner.hxx>
#endif

#ifndef _TIMER_HXX //autogen
#include <vcl/timer.hxx>
#endif

#ifndef _TABLE_HXX //autogen
#include <tools/table.hxx>
#endif

#ifndef _XTEXTEDT_HXX //autogen
#include <svtools/xtextedt.hxx>
#endif

class ScrollBar;
class SwSrcView;
class SwSrcEditWindow;
class SwSrcViewConfig;
class TextEngine;
class ExtTextView;
class DataChangedEvent;

class TextViewOutWin : public Window
{
    ExtTextView*    pTextView;

protected:
    virtual void    Paint( const Rectangle& );
    virtual void    KeyInput( const KeyEvent& rKeyEvt );
    virtual void    MouseMove( const MouseEvent& rMEvt );
    virtual void    MouseButtonDown( const MouseEvent& rMEvt );
    virtual void    MouseButtonUp( const MouseEvent& rMEvt );
    virtual void    Command( const CommandEvent& rCEvt );
    virtual BOOL    Drop( const DropEvent& rEvt );
    virtual BOOL    QueryDrop( DropEvent& rEvt );
    virtual void    DataChanged( const DataChangedEvent& );

public:
        TextViewOutWin(Window* pParent, WinBits nBits) :
            Window(pParent, nBits), pTextView(0){}

    void    SetTextView( ExtTextView* pView ) {pTextView = pView;}

};

//------------------------------------------------------------

class SwSrcEditWindow : public Window, public SfxListener
{
private:
    ExtTextView*    pTextView;
    ExtTextEngine*  pTextEngine;

    TextViewOutWin* pOutWin;
    ScrollBar       *pHScrollbar,
                    *pVScrollbar;

    SwSrcView*      pSrcView;

    const SwSrcViewConfig*  pSrcVwConfig;

    long            nCurTextWidth;
    USHORT          nStartLine;
    BOOL            bReadonly;
    BOOL            bDoSyntaxHighlight;
    BOOL            bHighlighting;

    Timer           aSyntaxIdleTimer;
    Table           aSyntaxLineTable;

    void            ImpDoHighlight( const String& rSource, USHORT nLineOff );

    DECL_LINK( SyntaxTimerHdl, Timer * );
    DECL_LINK( TimeoutHdl, Timer * );

protected:

    virtual void    Resize();
    virtual void    DataChanged( const DataChangedEvent& );
    virtual void    GetFocus();
//  virtual void    LoseFocus();

    void            CreateTextEngine();
    void            DoSyntaxHighlight( USHORT nPara );

    virtual void    Notify( SfxBroadcaster& rBC, const SfxHint& rHint );

    DECL_LINK(ScrollHdl, ScrollBar*);

public:
                    SwSrcEditWindow( Window* pParent, SwSrcView* pParentView );
                    ~SwSrcEditWindow();

    void            SetScrollBarRanges();
    void            InitScrollBars();
    ULONG           Read( SvStream& rInput)
                        {return pTextEngine->Read(rInput);}
    ULONG           Write( SvStream& rOutput)
                        {return pTextEngine->Write(rOutput);}

    ExtTextView*    GetTextView()
                        {return pTextView;}
    TextEngine*     GetTextEngine()
                        {return pTextEngine;}
    SwSrcView*      GetSrcView() {return pSrcView;}

    TextViewOutWin* GetOutWin() {return pOutWin;}
    void            Invalidate();

    void            ClearModifyFlag()
                        { pTextEngine->SetModified(FALSE); }
    BOOL            IsModified() const
                        { return pTextEngine->IsModified();}
    void            CreateScrollbars();

    void            SetReadonly(BOOL bSet){bReadonly = bSet;}
    BOOL            IsReadonly(){return bReadonly;}

    void            DoDelayedSyntaxHighlight( USHORT nPara );

    void            SyntaxColorsChanged();

    void            SetStartLine(USHORT nLine){nStartLine = nLine;}

    virtual void    Command( const CommandEvent& rCEvt );
    void            HandleWheelCommand( const CommandEvent& rCEvt );
};

#endif
diff --git a/sw/source/ui/inc/srcview.hxx b/sw/source/ui/inc/srcview.hxx
new file mode 100644
index 0000000..d7f73e6
--- /dev/null
+++ b/sw/source/ui/inc/srcview.hxx
@@ -0,0 +1,165 @@
/*************************************************************************
 *
 *  $RCSfile: srcview.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:42 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SRCVIEW_HXX
#define _SRCIEW_HXX

#ifndef _VIEWFAC_HXX //autogen
#include <sfx2/viewfac.hxx>
#endif
#ifndef _SFXVIEWSH_HXX //autogen
#include <sfx2/viewsh.hxx>
#endif
#include "srcedtw.hxx"
#include "shellid.hxx"

class SwDocShell;
class SvxSearchItem;
class SwSrcViewConfig;
class SfxMedium;

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

class SwSrcView: public SfxViewShell
{
    SwSrcEditWindow     aEditWin;

    SvxSearchItem*      pSearchItem;
    SwSrcViewConfig*    pSrcViewConfig;

    BOOL                bSourceSaved    :1;
    void                Init();

    // fuer Readonly-Umschaltung
    virtual void        Notify( SfxBroadcaster& rBC, const SfxHint& rHint );


protected:
    USHORT              StartSearchAndReplace(const SvxSearchItem& rItem,
                                                        BOOL bFromStart,
                                                        BOOL bApi,
                                                        BOOL bRecursive = FALSE);


public:

    SFX_DECL_VIEWFACTORY(SwSrcView);
    SFX_DECL_INTERFACE(SW_SRC_VIEWSHELL);
    TYPEINFO();


    SwSrcView(SfxViewFrame* pFrame, const SwSrcView&);
    SwSrcView(SfxViewFrame* pFrame, SfxViewShell*);

    ~SwSrcView();

    SwDocShell*         GetDocShell();
    SwSrcEditWindow&    GetEditWin() {return aEditWin;}
    void                SaveContent(const String& rTmpFile);
    void                SaveContentTo(SfxMedium& rMed);

    BOOL                IsModified() {return aEditWin.IsModified();}



    void            Execute(SfxRequest&);
    void            GetState(SfxItemSet&);

    SvxSearchItem*  GetSearchItem();
    void            SetSearchItem( const SvxSearchItem& rItem );

    void            Load(SwDocShell* pDocShell);

    virtual USHORT  SetPrinter( SfxPrinter* pNew,
                                        USHORT nDiff = SFX_PRINTER_ALL);
    virtual ErrCode         DoPrint( SfxPrinter *pPrinter, PrintDialog *pPrintDialog,
                                     BOOL bSilent );
    virtual         SfxPrinter*     GetPrinter( BOOL bCreate = FALSE );

    void            SourceSaved() {bSourceSaved = TRUE;}
    BOOL            HasSourceSaved() const {return bSourceSaved;}

};


#endif





















diff --git a/sw/source/ui/inc/srtdlg.hxx b/sw/source/ui/inc/srtdlg.hxx
new file mode 100644
index 0000000..cbda0c7
--- /dev/null
+++ b/sw/source/ui/inc/srtdlg.hxx
@@ -0,0 +1,142 @@
/*************************************************************************
 *
 *  $RCSfile: srtdlg.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:42 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SRTDLG_HXX
#define _SRTDLG_HXX

#ifndef _SVX_STDDLG_HXX //autogen
#include <svx/stddlg.hxx>
#endif

#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif

#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif

#ifndef _FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif

#ifndef _LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif

#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif

class SwWrtShell;

class SwSortDlg : public SvxStandardDialog
{
    FixedText           aColLbl;
    FixedText           aTypLbl;
    FixedText           aDirLbl;

    CheckBox            aKeyCB1;
    NumericField        aColEdt1;
    ListBox             aTypDLB1;
    RadioButton         aSortUpRB;
    RadioButton         aSortDnRB;
    CheckBox            aKeyCB2;
    NumericField        aColEdt2;
    ListBox             aTypDLB2;
    RadioButton         aSortUp2RB;
    RadioButton         aSortDn2RB;
    CheckBox            aKeyCB3;
    NumericField        aColEdt3;
    ListBox             aTypDLB3;
    RadioButton         aSortUp3RB;
    RadioButton         aSortDn3RB;
    GroupBox            aSortGrp;
    RadioButton         aColumnRB;
    RadioButton         aRowRB;

    GroupBox            aDirGrp;

    RadioButton         aDelimTabRB;
    RadioButton         aDelimFreeRB;
    Edit                aDelimEdt;
    GroupBox            aDelimGrp;
    OKButton            aOkBtn;
    CancelButton        aCancelBtn;
    HelpButton          aHelpBtn;

    String aColTxt;
    String aRowTxt;
    USHORT nX;
    USHORT nY;

    SwWrtShell          &rSh;

    virtual void        Apply();
    DECL_LINK( CheckHdl, CheckBox * );
    DECL_LINK( DelimHdl, RadioButton* );

public:
    SwSortDlg(Window * pParent, SwWrtShell &rSh);
    ~SwSortDlg();
};

#endif

diff --git a/sw/source/ui/inc/swcont.hxx b/sw/source/ui/inc/swcont.hxx
new file mode 100644
index 0000000..1d18350
--- /dev/null
+++ b/sw/source/ui/inc/swcont.hxx
@@ -0,0 +1,149 @@
/*************************************************************************
 *
 *  $RCSfile: swcont.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:42 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _SWCONT_HXX
#define _SWCONT_HXX

#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif

class SwContentType;

//Reihenfolge und Anzahl mit ResIds abgleichen!!
#define CONTENT_TYPE_OUTLINE        0
#define CONTENT_TYPE_TABLE          1
#define CONTENT_TYPE_FRAME          2
#define CONTENT_TYPE_GRAPHIC        3
#define CONTENT_TYPE_OLE            4
#define CONTENT_TYPE_BOOKMARK       5
#define CONTENT_TYPE_REGION         6
#define CONTENT_TYPE_URLFIELD       7
#define CONTENT_TYPE_REFERENCE      8
#define CONTENT_TYPE_INDEX          9
#define CONTENT_TYPE_POSTIT         10
#define CONTENT_TYPE_DRAWOBJECT     11
#define CONTENT_TYPE_MAX            CONTENT_TYPE_DRAWOBJECT +1


// Typen fuer das Globaldokument
#define GLOBAL_CONTENT_REGION       100
#define GLOBAL_CONTENT_INDEX        101
#define GLOBAL_CONTENT_TEXT         102
#define GLOBAL_CONTENT_MAX          3

// Strings fuer Kontextmenue
#define CONTEXT_COUNT   12
#define GLOBAL_CONTEXT_COUNT 13

// Modi fuer Drag 'n Drop
#define REGION_MODE_NONE        0
#define REGION_MODE_LINK        1
#define REGION_MODE_EMBEDDED    2

//----------------------------------------------------------------------------
//----------------------------------------------------------------------------

//mini rtti
class SwTypeNumber
{
    BYTE nTypeId;

    public:
        SwTypeNumber(BYTE nId) :nTypeId(nId){}
        virtual ~SwTypeNumber();

        virtual BYTE    GetTypeId();
};
//----------------------------------------------------------------------------

class SwContent : public SwTypeNumber
{
    const SwContentType*    pParent;
    String                  sContentName;
    long                    nYPosition;
    BOOL                    bInvisible;
public:
        SwContent(const SwContentType* pCnt, const String& rName, long nYPos );

    virtual BOOL            IsProtect() const;
    const SwContentType*    GetParent() const {return pParent;}
    const String&           GetName()   const {return sContentName;}
    int                     operator==(const SwContent& rCont) const
                                {
                                    //gleich sind sie nie, sonst fallen sie aus dem Array
                                    return FALSE;
                                }
    int                     operator<(const SwContent& rCont) const
                                {
                                    //zuerst nach Position dann nach Name sortieren
                                    return nYPosition != rCont.nYPosition ?
                                        nYPosition < rCont.nYPosition :
                                            sContentName < rCont.sContentName;;
                                }

    long        GetYPos() const {return nYPosition;}

    BOOL        IsInvisible() const {return bInvisible;}
    void        SetInvisible(){ bInvisible = TRUE;}
};

#endif
diff --git a/sw/source/ui/inc/swlbox.hxx b/sw/source/ui/inc/swlbox.hxx
new file mode 100644
index 0000000..7802eaa
--- /dev/null
+++ b/sw/source/ui/inc/swlbox.hxx
@@ -0,0 +1,231 @@
/*************************************************************************
 *
 *  $RCSfile: swlbox.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:42 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWLBOX_HXX
#define _SWLBOX_HXX

#ifndef _SVARRAY_HXX //autogen
#include <svtools/svarray.hxx>
#endif

#ifndef _LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif

#ifndef _COMBOBOX_HXX //autogen
#include <vcl/combobox.hxx>
#endif

class SwBoxEntry;
class Window;

SV_DECL_PTRARR_DEL(SwEntryLst, SwBoxEntry*, 10, 10)

/*--------------------------------------------------------------------
     Beschreibung: SwBoxEntry
 --------------------------------------------------------------------*/

class SwBoxEntry
{
    friend class SwComboBox;

    BOOL    bModified : 1;
    BOOL    bNew : 1;

public:
    SwBoxEntry(const String& aName, USHORT nId=0);
    SwBoxEntry(const SwBoxEntry& rOrg);
    SwBoxEntry();

    String  aName;
    USHORT  nId;
};

/*--------------------------------------------------------------------
     Beschreibung:  Listbox mit Entry-Verwaltung
 --------------------------------------------------------------------*/

/*class SwListBox : private ListBox
{
    SwEntryLst  aEntryLst;
    SwBoxEntry  aDefault;

    BOOL SeekEntry( const SwBoxEntry& rEntryLst, USHORT* pPos = 0 );
public:
    // die SwListBox ist default NICHT sortiert!
    // Eine Sortierung erfolgt nur ueber das interne Array. Das errechnet
    // die richtige Position in der Box!
    SwListBox( Window* pParent, const ResId& rId );
    ~SwListBox();

    void                    InsertEntry( const SwBoxEntry&,
                                        USHORT nPos = LISTBOX_APPEND );
    void                    InsertEntrySort( const SwBoxEntry& );
    void                    RemoveEntry( USHORT nPos );
    void                    Clear();

    const SwBoxEntry&       GetEntry( USHORT ) const;
    const SwBoxEntry&       GetSelectEntry() const;

    // ueberladene Methoden der ListBox:
    inline void SetSelectHdl( const Link& rLink );
    inline void SetDoubleClickHdl( const Link& rLink );
    inline void SetUpdateMode( BOOL bFlag );
    inline void SelectEntryPos( USHORT nPos, BOOL bSelect = TRUE );
    inline void SelectEntry( const String& rStr, BOOL bSelect = TRUE );
    inline USHORT GetSelectEntryPos( USHORT nSelIndex = 0 ) const;
    inline USHORT GetEntryPos( const String& rStr ) const;
    inline USHORT GetEntryCount() const;
    // fuer zugriffe aufs Control, aber nicht auf die ListBox!
    inline Control& GetControl()    { return *this; }
};

/*--------------------------------------------------------------------
     Beschreibung: fuer ComboBoxen
 --------------------------------------------------------------------*/

enum SwComboBoxStyle
{
    CBS_UPPER       = 0x01,
    CBS_LOWER       = 0x02,
    CBS_ALL         = 0x04,
    CBS_FILENAME    = 0x08,
#ifdef WIN
    CBS_SW_FILENAME = CBS_FILENAME | CBS_LOWER
#else
    CBS_SW_FILENAME = CBS_FILENAME
#endif
};

class SwComboBox : public ComboBox
{
    SwEntryLst              aEntryLst;
    SwEntryLst              aDelEntryLst;
    SwBoxEntry              aDefault;
    USHORT                  nStyle;

    void                    InitComboBox();
    void                    InsertSorted(SwBoxEntry* pEntry);
public:
    SwComboBox(Window* pParent, const ResId& rId,
               USHORT nStyleBits = CBS_ALL);
    ~SwComboBox();

    virtual void            KeyInput( const KeyEvent& rKEvt );

    void                    InsertNewEntry(const SwBoxEntry&);
    void                    InsertEntry(const SwBoxEntry&);

    void                    RemoveEntry(USHORT nPos);

    USHORT                  GetEntryPos(const SwBoxEntry& rEntry) const;
    const SwBoxEntry&       GetEntry(USHORT) const;

    USHORT                  GetRemovedCount() const;
    const SwBoxEntry&       GetRemovedEntry(USHORT nPos) const;

    USHORT                  GetNewCount() const;
    const SwBoxEntry&       GetNewEntry(USHORT nPos) const;

    USHORT                  GetStyle() const            { return nStyle;    }
    void                    SetStyle(const USHORT nSt)  { nStyle = nSt;     }

    String                  GetText() const;
};

/*--------------------------------------------------------------------
     Beschreibung: Inlines
 --------------------------------------------------------------------*/

/*inline void SwListBox::SetSelectHdl( const Link& rLink )
{
    ListBox::SetSelectHdl(rLink);
}
inline void SwListBox::SetDoubleClickHdl( const Link& rLink )
{
    ListBox::SetDoubleClickHdl( rLink );
}
inline void SwListBox::SetUpdateMode( BOOL bFlag )
{
    ListBox::SetUpdateMode(bFlag);
}
inline void SwListBox::SelectEntryPos( USHORT nPos, BOOL bSelect )
{
    ListBox::SelectEntryPos( nPos, bSelect );
}
inline void SwListBox::SelectEntry( const String& rStr, BOOL bSelect )
{
    ListBox::SelectEntry( rStr, bSelect );
}
inline USHORT SwListBox::GetSelectEntryPos( USHORT nSelIndex ) const
{
    return ListBox::GetSelectEntryPos( nSelIndex );
}
inline USHORT SwListBox::GetEntryPos( const String& rStr ) const
{
    return ListBox::GetEntryPos( rStr );
}
inline USHORT SwListBox::GetEntryCount() const
{
    return ListBox::GetEntryCount();
}
*/
#endif  // _SWLBOX_HXX

diff --git a/sw/source/ui/inc/swvset.hxx b/sw/source/ui/inc/swvset.hxx
new file mode 100644
index 0000000..d9b828f
--- /dev/null
+++ b/sw/source/ui/inc/swvset.hxx
@@ -0,0 +1,88 @@
/*************************************************************************
 *
 *  $RCSfile: swvset.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:42 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWVSET_HXX
#define _SWVSET_HXX

#ifndef _LIST_HXX //autogen
#include <tools/list.hxx>
#endif
#ifndef _SVX_NUMVSET_HXX
#include <svx/numvset.hxx>
#endif

class SwDocShell;

class SwRulerValueSet : public SvxBmpNumValueSet
{
    SwDocShell*     pSwDocSh;
    public:
        SwRulerValueSet( Window* pParent,
                        const ResId& rResId,
                        const List& rStrNames,
                        SwDocShell* pSwDocSh );
        ~SwRulerValueSet();

    virtual void    UserDraw( const UserDrawEvent& rUDEvt );
    DECL_STATIC_LINK(SwRulerValueSet, GraphicArrivedHdl_Impl, SvxBrushItem*);

};
#endif

diff --git a/sw/source/ui/inc/syncbtn.hxx b/sw/source/ui/inc/syncbtn.hxx
new file mode 100644
index 0000000..361cf06
--- /dev/null
+++ b/sw/source/ui/inc/syncbtn.hxx
@@ -0,0 +1,113 @@
/*************************************************************************
 *
 *  $RCSfile: syncbtn.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:42 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWSYNCBTN_HXX
#define _SWSYNCBTN_HXX

#ifndef _SFX_CHILDWIN_HXX //autogen
#include <sfx2/childwin.hxx>
#endif

#ifdef _SYNCDLG

#ifndef _BASEDLGS_HXX //autogen
#include <sfx2/basedlgs.hxx>
#endif

#ifndef _SV_BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif

class SwWrtShell;

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

class SwSyncBtnDlg : public SfxFloatingWindow
{
    PushButton              aSyncBtn;

    DECL_LINK( BtnHdl,      PushButton* pBtn = 0 );

public:
    SwSyncBtnDlg(SfxBindings*, SfxChildWindow*, Window *pParent);
    ~SwSyncBtnDlg();
};
#endif

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

class SwSyncChildWin : public SfxChildWindow
{
public:
    SwSyncChildWin( Window* ,
                    USHORT nId,
                    SfxBindings*,
                    SfxChildWinInfo*  );

    SFX_DECL_CHILDWINDOW( SwSyncChildWin );
};


#endif

diff --git a/sw/source/ui/inc/table.hrc b/sw/source/ui/inc/table.hrc
new file mode 100644
index 0000000..b0cd509
--- /dev/null
+++ b/sw/source/ui/inc/table.hrc
@@ -0,0 +1,84 @@
/*************************************************************************
 *
 *  $RCSfile: table.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:42 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "rcid.hrc"

#define DLG_INSERT_TABLE        RC_TABLE_BEGIN
#define DLG_FORMAT_TABLE        (RC_TABLE_BEGIN + 1)
#define DLG_CONV_TEXT_TABLE     (RC_TABLE_BEGIN + 2)
#define DLG_INS_ROW_COL         (RC_TABLE_BEGIN + 3)
#define DLG_ROW_HEIGHT          (RC_TABLE_BEGIN + 4)
#define DLG_SPLIT           (RC_TABLE_BEGIN + 5)
#define DLG_COL_WIDTH           (RC_TABLE_BEGIN + 6)
#define MSG_ERR_TABLE_MERGE     (RC_TABLE_BEGIN + 7)
#define DLG_AUTOFMT_TABLE       (RC_TABLE_BEGIN + 9)
#define DLG_SWDLG_STRINPUT      (RC_TABLE_BEGIN + 10)
#define TP_TABLE_COLUMN         (RC_TABLE_BEGIN + 11)
#define DLG_INSERT_CHART        (RC_TABLE_BEGIN + 12)
#define MSG_WRONG_TABLENAME     (RC_TABLE_BEGIN + 13)
#define DLG_SPLIT_TABLE         (RC_TABLE_BEGIN + 14)
#define DLG_MERGE_TABLE         (RC_TABLE_BEGIN + 15)

#define TABLE_ACT_END           DLG_MERGE_TABLE

#if TABLE_ACT_END > RC_TABLE_END
#error Resource-Id Ueberlauf in #file, #line
#endif
diff --git a/sw/source/ui/inc/tabledlg.hxx b/sw/source/ui/inc/tabledlg.hxx
new file mode 100644
index 0000000..bcc4ace
--- /dev/null
+++ b/sw/source/ui/inc/tabledlg.hxx
@@ -0,0 +1,148 @@
/*************************************************************************
 *
 *  $RCSfile: tabledlg.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:42 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _TABLEDLG_HXX
#define _TABLEDLG_HXX

#ifndef _SFXTABDLG_HXX //autogen
#include <sfx2/tabdlg.hxx>
#endif

#include "swtypes.hxx"

class SwWrtShell;
class SwTabCols;
struct TColumn;

void lcl_ItemSetToTableParam( const SfxItemSet&, SwWrtShell& );
extern const USHORT __FAR_DATA aUITableAttrRange[];

/*-------------------------------------------------------
 Tabellendialog
--------------------------------------------------------- */
class SwTableTabDlg : public SfxTabDialog
{
    SwWrtShell* pShell;
    USHORT      nHtmlMode;

    virtual void        PageCreated(USHORT nId, SfxTabPage& rPage);
public:
     SwTableTabDlg( Window* pParent, SfxItemPool& Pool,
                    const SfxItemSet* pItemSet, SwWrtShell* pSh );
};

class SwTableRep
{
    TColumn*    pTColumns;

    SwTwips     nTblWidth;
    SwTwips     nSpace;
    SwTwips     nLeftSpace;
    SwTwips     nRightSpace;
    USHORT      nAlign;
    USHORT      nColCount;
    USHORT      nAllCols;
    USHORT      nWidthPercent;
    BOOL        bComplex : 1;
    BOOL        bLineSelected : 1;
    BOOL        bWidthChanged : 1;
    BOOL        bColsChanged : 1;

public:
    SwTableRep( const SwTabCols& rTabCol, BOOL bComplex );
    ~SwTableRep();

    BOOL        FillTabCols( SwTabCols& rTabCol ) const;

    SwTwips     GetLeftSpace() const            {return nLeftSpace;}
    void        SetLeftSpace(SwTwips nSet)      {nLeftSpace = nSet;}

    SwTwips     GetRightSpace() const           {return nRightSpace;}
    void        SetRightSpace(SwTwips nSet)     {nRightSpace = nSet;}

    SwTwips     GetWidth() const                {return nTblWidth;}
    void        SetWidth(SwTwips nSet)          {nTblWidth = nSet;}

    USHORT      GetWidthPercent() const         {return nWidthPercent;}
    void        SetWidthPercent(USHORT nSet)    {nWidthPercent = nSet;}

    USHORT      GetAlign() const                {return nAlign;}
    void        SetAlign(USHORT nSet)           {nAlign = nSet;}

    BOOL        IsComplex() const               {return bComplex;}
    USHORT      GetColCount() const             {return nColCount;}
    USHORT      GetAllColCount() const          {return nAllCols;}

    BOOL        HasColsChanged() const          {return bColsChanged;}
    void        SetColsChanged()                {bColsChanged = TRUE;}

    BOOL        HasWidthChanged() const         {return bWidthChanged;}
    void        SetWidthChanged()               {bWidthChanged  = TRUE;}

    BOOL        IsLineSelected() const          {return bLineSelected;}
    void        SetLineSelected(BOOL bSet)      {bLineSelected = bSet;}

    SwTwips     GetSpace() const                { return nSpace;}
    void        SetSpace(SwTwips nSet)          {nSpace = nSet;}

    TColumn*    GetColumns() const              {return pTColumns;}
};

#endif
diff --git a/sw/source/ui/inc/tablemgr.hxx b/sw/source/ui/inc/tablemgr.hxx
new file mode 100644
index 0000000..464e6a3
--- /dev/null
+++ b/sw/source/ui/inc/tablemgr.hxx
@@ -0,0 +1,112 @@
/*************************************************************************
 *
 *  $RCSfile: tablemgr.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:42 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _TABLEMGR_HXX
#define _TABLEMGR_HXX

#include "swtypes.hxx"
#include "tabcol.hxx"

class SwFrmFmt;
class SwWrtShell;
class Window;
class SchMemChart;
class SfxItemSet;

const SwTwips lAutoWidth = INVALID_TWIPS;
const char cParaDelim = 0x0a;

class SwTableFUNC
{
    SwFrmFmt    *pFmt;
    SwWrtShell  *pSh;
    BOOL        bCopy;
    SwTabCols   aCols;
private:
    int GetRightSeparator(int nNum) const;
public:
    inline SwTableFUNC(SwFrmFmt &);
           SwTableFUNC(SwWrtShell *pShell, BOOL bCopyFmt = FALSE);
           ~SwTableFUNC();

    void    InitTabCols();
    void    ColWidthDlg(Window *pParent );
    SwTwips GetColWidth(USHORT nNum) const;
    SwTwips GetMaxColWidth(USHORT nNum) const;
    void    SetColWidth(USHORT nNum, SwTwips nWidth );
    USHORT  GetColCount() const;
    USHORT  GetCurColNum() const;

    BOOL IsTableSelected() const { return pFmt != 0; }

    const SwFrmFmt *GetTableFmt() const { return pFmt; }

    void InsertChart( SchMemChart& rData, const SfxItemSet* pSet = 0 );
    void UpdateChart();
};

inline SwTableFUNC::SwTableFUNC(SwFrmFmt &rFmt) :
    pFmt(&rFmt),
    bCopy(FALSE),
    pSh(0)
{
}

#endif
diff --git a/sw/source/ui/inc/tabsh.hxx b/sw/source/ui/inc/tabsh.hxx
new file mode 100644
index 0000000..9e6b3a05
--- /dev/null
+++ b/sw/source/ui/inc/tabsh.hxx
@@ -0,0 +1,83 @@
/*************************************************************************
 *
 *  $RCSfile: tabsh.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:42 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWTABSH_HXX
#define _SWTABSH_HXX

#include "basesh.hxx"

class SwTableShell: public SwBaseShell
{
public:
    SFX_DECL_INTERFACE(SW_TABSHELL);
    TYPEINFO();

    void    Execute(SfxRequest &);
    void    GetState(SfxItemSet &);
    void    GetFrmBorderState(SfxItemSet &rSet);
    void    GetLineStyleState(SfxItemSet &rSet);
    void    ExecTableStyle(SfxRequest& rReq);

    void    ExecNumberFormat(SfxRequest& rReq);

            SwTableShell(SwView &rView);
};

#endif
diff --git a/sw/source/ui/inc/tautofmt.hxx b/sw/source/ui/inc/tautofmt.hxx
new file mode 100644
index 0000000..a85da1b
--- /dev/null
+++ b/sw/source/ui/inc/tautofmt.hxx
@@ -0,0 +1,162 @@
/*************************************************************************
 *
 *  $RCSfile: tautofmt.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:42 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef SW_TAUTOFMT_HXX
#define SW_TAUTOFMT_HXX

#ifndef _BASEDLGS_HXX //autogen
#include <sfx2/basedlgs.hxx>
#endif

#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif

#ifndef _LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif

#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif

#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif

#ifndef _MOREBTN_HXX //autogen
#include <vcl/morebtn.hxx>
#endif

#ifndef _VIRDEV_HXX //autogen
#include <vcl/virdev.hxx>
#endif

class SwView;
class SwTableAutoFmt;
class SvxBoxItem;
class SvxBorderLine;
class AutoFmtPreview;
class SwTableAutoFmtTbl;

//------------------------------------------------------------------------

enum AutoFmtLine { TOP_LINE, BOTTOM_LINE, LEFT_LINE, RIGHT_LINE };

//========================================================================

class SwAutoFormatDlg : public SfxModalDialog
{
    FixedText       aFtFormat;
    ListBox         aLbFormat;
    GroupBox        aGbPreview;
    CheckBox        aBtnNumFormat;
    CheckBox        aBtnBorder;
    CheckBox        aBtnFont;
    CheckBox        aBtnPattern;
    CheckBox        aBtnAlignment;
    GroupBox        aGbFormat;
    OKButton        aBtnOk;
    CancelButton    aBtnCancel;
    HelpButton      aBtnHelp;
    PushButton      aBtnAdd;
    PushButton      aBtnRemove;
    PushButton      aBtnRename;
    MoreButton      aBtnMore;
    String          aStrTitle;
    String          aStrLabel;
    String          aStrClose;
    String          aStrDelTitle;
    String          aStrDelMsg;
    String          aStrRenameTitle;
    String          aStrInvalidFmt;
    AutoFmtPreview* pWndPreview;

    //------------------------
    SwWrtShell*             pShell;
    SwTableAutoFmtTbl*      pTableTbl;
    BYTE                    nIndex;
    BYTE                    nDfltStylePos;
    BOOL                    bCoreDataChanged : 1;
    BOOL                    bSetAutoFmt : 1;


    void Init( const SwTableAutoFmt* pSelFmt );
    void UpdateChecks( const SwTableAutoFmt&, BOOL bEnableBtn );
    //------------------------
    DECL_LINK( CheckHdl, Button * );
    DECL_LINK( OkHdl, Button * );
    DECL_LINK( AddHdl, void * );
    DECL_LINK( RemoveHdl, void * );
    DECL_LINK( RenameHdl, void * );
    DECL_LINK( SelFmtHdl, void * );

public:
    SwAutoFormatDlg( Window* pParent, SwWrtShell* pShell,
                        BOOL bSetAutoFmt = TRUE,
                        const SwTableAutoFmt* pSelFmt = 0 );
    virtual ~SwAutoFormatDlg();

    void FillAutoFmtOfIndex( SwTableAutoFmt*& rToFill ) const;
};


#endif // SW_AUTOFMT_HXX

diff --git a/sw/source/ui/inc/tblctrl.hxx b/sw/source/ui/inc/tblctrl.hxx
new file mode 100644
index 0000000..63c54b0
--- /dev/null
+++ b/sw/source/ui/inc/tblctrl.hxx
@@ -0,0 +1,93 @@
/*************************************************************************
 *
 *  $RCSfile: tblctrl.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:42 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _TBLCTRL_HXX
#define _TBLCTRL_HXX


#ifndef _SFXTBXCTRL_HXX //autogen
#include <sfx2/tbxctrl.hxx>
#endif


//----------------------------------------------------------------------------
//
//----------------------------------------------------------------------------

class SwTableOptimizeCtrl : public SfxToolBoxControl
{

public:
    SFX_DECL_TOOLBOX_CONTROL();

    SwTableOptimizeCtrl( USHORT nId, ToolBox& rTbx, SfxBindings& rBind );
    ~SwTableOptimizeCtrl();

    virtual SfxPopupWindowType  GetPopupWindowType() const;
    virtual SfxPopupWindow*     CreatePopupWindow();

};

//
//----------------------------------------------------------------------------

#endif


diff --git a/sw/source/ui/inc/tblnumfm.hxx b/sw/source/ui/inc/tblnumfm.hxx
new file mode 100644
index 0000000..f24cb39
--- /dev/null
+++ b/sw/source/ui/inc/tblnumfm.hxx
@@ -0,0 +1,80 @@
/*************************************************************************
 *
 *  $RCSfile: tblnumfm.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:42 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _TBLNUMFM_HXX
#define _TBLNUMFM_HXX

#ifndef _BASEDLGS_HXX //autogen
#include <sfx2/basedlgs.hxx>
#endif

class Window;
class SfxItemSet;

class SwNumFmtDlg : public SfxSingleTabDialog
{
public:

     SwNumFmtDlg(Window* pParent, SfxItemSet& rSet);
    ~SwNumFmtDlg();
};

#endif

diff --git a/sw/source/ui/inc/tbxanchr.hxx b/sw/source/ui/inc/tbxanchr.hxx
new file mode 100644
index 0000000..c8f0471
--- /dev/null
+++ b/sw/source/ui/inc/tbxanchr.hxx
@@ -0,0 +1,84 @@
/*************************************************************************
 *
 *  $RCSfile: tbxanchr.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:42 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _TBXANCHR_HXX
#define _TBXANCHR_HXX

#ifndef _SFXTBXCTRL_HXX //autogen
#include <sfx2/tbxctrl.hxx>
#endif

class SwTbxAnchor : public SfxToolBoxControl
{
    USHORT nActAnchorId;

public:

    virtual void StateChanged( USHORT nSID, SfxItemState eState, const SfxPoolItem* pState );
    virtual void Click();

    SFX_DECL_TOOLBOX_CONTROL();

    SwTbxAnchor( USHORT nId, ToolBox& rTbx, SfxBindings& rBind );
    ~SwTbxAnchor();
};

#endif

diff --git a/sw/source/ui/inc/tbxmgr.hxx b/sw/source/ui/inc/tbxmgr.hxx
new file mode 100644
index 0000000..86ffbd8
--- /dev/null
+++ b/sw/source/ui/inc/tbxmgr.hxx
@@ -0,0 +1,86 @@
/*************************************************************************
 *
 *  $RCSfile: tbxmgr.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:42 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _TBXMGR_HXX
#define _TBXMGR_HXX

#ifndef _TBXDRAW_HXX //autogen
#include <svx/tbxdraw.hxx>
#endif

class SwPopupWindowTbxMgr : public SvxPopupWindowTbxMgr
{
    BOOL                bWeb:1;     //gilt der WebMode?
    ResId               aRIdWinTemp;
    ResId               aRIdTbxTemp;

public:
    SwPopupWindowTbxMgr(    USHORT nId,
                            WindowAlign eAlign,
                            ResId aRIdWin,
                            ResId aRIdTbx,
                            SfxBindings& rBindings );

    virtual void StateChanged(USHORT nSID, SfxItemState eState, const SfxPoolItem* pState);
    virtual SfxPopupWindow* Clone() const;
};


#endif      // _TBX_DRAW_HXX
diff --git a/sw/source/ui/inc/textsh.hxx b/sw/source/ui/inc/textsh.hxx
new file mode 100644
index 0000000..02a9290
--- /dev/null
+++ b/sw/source/ui/inc/textsh.hxx
@@ -0,0 +1,132 @@
/*************************************************************************
 *
 *  $RCSfile: textsh.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:42 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _SWTEXTSH_HXX
#define _SWTEXTSH_HXX

#ifndef _SWBASESH_HXX
#include <basesh.hxx>
#endif

class Button;
class SwFldMgr;
class SvxHyperlinkItem;

class SwTextShell: public SwBaseShell
{
    SwFldMgr*   pPostItFldMgr;

    // Itemset pointer for the Graphic-Insert Dialog. This set contains all
    // graphic sepcifict attributes and will only be created / deletec by the
    // methods InsertGraphicDialog and InitGraphicFrame
    SfxItemSet* pInsGrfSetPtr;

    void InsertSymbol( const String& rChars, const String& rFont );
    void InsertHyperlink(const SvxHyperlinkItem& rHlnkItem);
    BOOL InsertGraphicDlg();
    void InsertURLButton(const String& rURL, const String& rTarget, const String& rTxt);
    void InsertDBFld(const String& sFldName);

public:
    SFX_DECL_INTERFACE(SW_TEXTSHELL);
    TYPEINFO();

    DECL_LINK( PostItNextHdl, Button * );
    DECL_LINK( PostItPrevHdl, Button * );
    DECL_LINK( RedlineNextHdl, Button * );
    DECL_LINK( RedlinePrevHdl, Button * );

    DECL_LINK( InitGraphicFrame, Button * );

    void    Execute(SfxRequest &);
    void    GetState(SfxItemSet &);

    void    ExecInsert(SfxRequest &);
    void    StateInsert(SfxItemSet&);
    void    ExecDelete(SfxRequest &);
    void    ExecEnterNum(SfxRequest &);
    void    ExecBasicMove(SfxRequest &);
    void    ExecMove(SfxRequest &);
    void    ExecMovePage(SfxRequest &);
    void    ExecMoveCol(SfxRequest &);
    void    ExecMoveLingu(SfxRequest &);
    void    ExecMoveMisc(SfxRequest &);
    void    ExecField(SfxRequest &rReq);
    void    StateField(SfxItemSet &);
    void    ExecIdx(SfxRequest &);
    void    GetIdxState(SfxItemSet &);
    void    ExecGlossary(SfxRequest &);

    void    ExecCharAttr(SfxRequest &);
    void    ExecCharButtonAttr(SfxRequest &);
    void    ExecCharAttrArgs(SfxRequest &);
    void    ExecParaAttr(SfxRequest &);
    void    ExecParaAttrArgs(SfxRequest &);
    void    ExecAttr(SfxRequest &);
    void    ExecDB(SfxRequest &);

    void    GetAttrState(SfxItemSet &);

             SwTextShell(SwView &rView);
    virtual ~SwTextShell();
};

#endif
diff --git a/sw/source/ui/inc/tmpdlg.hxx b/sw/source/ui/inc/tmpdlg.hxx
new file mode 100644
index 0000000..680b1cf
--- /dev/null
+++ b/sw/source/ui/inc/tmpdlg.hxx
@@ -0,0 +1,104 @@
/*************************************************************************
 *
 *  $RCSfile: tmpdlg.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:42 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _SWCHARDLG_HXX
#define _SWCHARDLG_HXX

#ifndef _SFX_STYLEDLG_HXX //autogen
#include <sfx2/styledlg.hxx>
#endif

class SfxItemSet;
class FontList;
class SwWrtShell;

/*--------------------------------------------------------------------
   Beschreibung:    Der Tabdialog Traeger der TabPages
 --------------------------------------------------------------------*/

class SwTemplateDlg: public SfxStyleDialog
{

    USHORT      nType;
    USHORT      nHtmlMode;
    SwWrtShell* pWrtShell;
    BOOL        bNewStyle;

    DECL_LINK( NumOptionsHdl, PushButton* );

public:
    SwTemplateDlg(  Window*             pParent,
                    SfxStyleSheetBase&  rBase,
                    USHORT              nRegion,
                    BOOL                bColumn = FALSE,
                    SwWrtShell*         pActShell = 0,
                    BOOL                bNew = FALSE );

    ~SwTemplateDlg();
    const SfxItemSet* GetRefreshedSet();

    virtual void PageCreated( USHORT nId, SfxTabPage &rPage );
    virtual short Ok();
};


#endif

diff --git a/sw/source/ui/inc/tmplctrl.hxx b/sw/source/ui/inc/tmplctrl.hxx
new file mode 100644
index 0000000..dfaac87
--- /dev/null
+++ b/sw/source/ui/inc/tmplctrl.hxx
@@ -0,0 +1,96 @@
/*************************************************************************
 *
 *  $RCSfile: tmplctrl.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:42 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _TMPLCTRL_HXX
#define _TMPLCTRL_HXX

// include ---------------------------------------------------------------

#ifndef _SFXSTBITEM_HXX //autogen
#include <sfx2/stbitem.hxx>
#endif

#ifndef _STRING_HXX //autogen
#include <tools/string.hxx>
#endif


// class BookmarkToolBoxControl -------------------------------------------

class SwTemplateControl : public SfxStatusBarControl
{
protected:
    virtual void    Command( const CommandEvent& rCEvt );
public:
    virtual void    StateChanged( const SfxPoolItem* pState );
    virtual void    Paint( const UserDrawEvent& rEvt );

    SFX_DECL_STATUSBAR_CONTROL();

    SwTemplateControl( USHORT nId, StatusBar& rStb, SfxBindings& rBind );
    ~SwTemplateControl();

private:
    String  sTemplate;
};


#endif

diff --git a/sw/source/ui/inc/toxmgr.hxx b/sw/source/ui/inc/toxmgr.hxx
new file mode 100644
index 0000000..05ed028
--- /dev/null
+++ b/sw/source/ui/inc/toxmgr.hxx
@@ -0,0 +1,351 @@
/*************************************************************************
 *
 *  $RCSfile: toxmgr.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:42 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _TOXMGR_HXX
#define _TOXMGR_HXX

#include "tox.hxx"
#ifndef _AUTHFLD_HXX
#include <authfld.hxx>
#endif

class SwWrtShell;
class SwForm;

/*--------------------------------------------------------------------
    Beschreibung: Manager fuer Verzeichnisfunktionalitaet
 --------------------------------------------------------------------*/
//one single method will be sufficient to insert AND upate indexes

class SwTOXDescription
{
    TOXTypes            eTOXType;
    String              aStyleNames[MAXLEVEL];
    String              sSequenceName;
    String              sMainEntryCharStyle;
    String              sAutoMarkURL;
    String*             pTitle;
    String*             pTOUName;
    SwForm*             pForm;
    USHORT              nContent;
    USHORT              nIndexOptions;
    USHORT              nOLEOptions;
    String              sAuthBrackets;
    SwCaptionDisplay    eCaptionDisplay;
    SwTOXSortKey        eSortKey1;
    SwTOXSortKey        eSortKey2;
    SwTOXSortKey        eSortKey3;
    BYTE                nLevel;
    BOOL                bFromObjectNames : 1;
    BOOL                bFromChapter : 1;
    BOOL                bReadonly: 1;
    BOOL                bLevelFromChapter : 1;
    BOOL                bIsAuthSequence :1;
    BOOL                bSortByDocument :1;

    //TODO: TemplateNames
    //const String* pTemplateName = 0, ???
    SwTOXDescription(SwTOXDescription&);
public:
    SwTOXDescription(TOXTypes eType) :
        eTOXType(eType),
        pTitle(0),
        pForm(0),
        nContent(TOX_MARK | TOX_OUTLINELEVEL),
        nLevel(MAXLEVEL),
        pTOUName(0),
        nIndexOptions(TOI_SAME_ENTRY|TOI_FF|TOI_CASE_SENSITIVE),
        nOLEOptions(0),
        eCaptionDisplay(CAPTION_COMPLETE),
        bFromObjectNames(FALSE),
        bFromChapter(FALSE),
        bReadonly(TRUE),
        bLevelFromChapter(FALSE),
        bIsAuthSequence(FALSE),
        bSortByDocument(TRUE)
        {}
    ~SwTOXDescription()
        {
            delete pTitle;
            delete pForm;
            delete pTOUName;
        }

    void            SetTOXType(TOXTypes eSet) { eTOXType = eSet;}
    TOXTypes        GetTOXType() const { return eTOXType;}

    const String&   GetStyleNames(USHORT nLevel) const
                                {return aStyleNames[nLevel];}
    void            SetStyleNames(const String& rSet, USHORT nLevel)
                                {aStyleNames[nLevel] = rSet; }

    const String&   GetAutoMarkURL() const { return sAutoMarkURL;}
    void            SetAutoMarkURL(const String& rSet) {sAutoMarkURL = rSet;}

    void            SetTitle(const String& pSet) {delete pTitle; pTitle = new String(pSet);}
    const String*   GetTitle() const {return pTitle; }

    void            SetTOUName(const String& pSet) {delete pTOUName; pTOUName = new String(pSet);}
    const String*   GetTOUName() const {return pTOUName; }

    void            SetForm(const SwForm& rSet) {delete pForm; pForm = new SwForm(rSet);}
    const SwForm*   GetForm() const {return pForm;}

    void            SetContentOptions(USHORT nSet) { nContent = nSet;}
    USHORT          GetContentOptions() const { return nContent;}

    void            SetIndexOptions(USHORT nSet) { nIndexOptions = nSet;}
    USHORT          GetIndexOptions() const { return nIndexOptions;}

    const String&   GetMainEntryCharStyle() const {return sMainEntryCharStyle;}
    void            SetMainEntryCharStyle(const String& rSet)  {sMainEntryCharStyle = rSet;}

    void            SetLevel(BYTE nSet) {nLevel = nSet;}
    BYTE            GetLevel()const  {return nLevel; }

    void            SetCreateFromObjectNames(BOOL bSet) { bFromObjectNames = bSet;}
    BOOL            IsCreateFromObjectNames() const {return bFromObjectNames;}

    const String&   GetSequenceName() const {return sSequenceName;}
    void            SetSequenceName(const String& rSet) {sSequenceName = rSet;}

    SwCaptionDisplay    GetCaptionDisplay() const { return eCaptionDisplay;}
    void                SetCaptionDisplay(SwCaptionDisplay eSet) {eCaptionDisplay = eSet;}

    void            SetFromChapter(BOOL bSet) { bFromChapter = bSet;}
    BOOL            IsFromChapter() const {return bFromChapter;}

    void            SetReadonly(BOOL bSet){bReadonly = bSet;}
    BOOL            IsReadonly() const {return bReadonly;}

    USHORT          GetOLEOptions() const {return nOLEOptions;}
    void            SetOLEOptions(USHORT nOpt) {nOLEOptions = nOpt;}

    BOOL            IsLevelFromChapter() const {return bLevelFromChapter;}
    void            SetLevelFromChapter(BOOL bSet) {bLevelFromChapter = bSet;}

    String          GetAuthBrackets() const {return sAuthBrackets;}
    void            SetAuthBrackets(const String& rSet) {sAuthBrackets = rSet;}

    BOOL            IsAuthSequence() const {return bIsAuthSequence;}
    void            SetAuthSequence(BOOL bSet){bIsAuthSequence = bSet;}

    BOOL            IsSortByDocument()const {return bSortByDocument ;}
    void            SetSortByDocument(BOOL bSet) {bSortByDocument = bSet;}

    void SetSortKeys(SwTOXSortKey eKey1,
                        SwTOXSortKey eKey2,
                            SwTOXSortKey eKey3);

    SwTOXSortKey GetSortKey1() const {return eSortKey1;}
    SwTOXSortKey GetSortKey2() const {return eSortKey2;}
    SwTOXSortKey GetSortKey3() const {return eSortKey3;}


    void            ApplyTo(SwTOXBase& rTOXBase);
};
// --------------------------------------------------------------------------------
class SwTOXMarkDescription
{
    TOXTypes    eTOXType;
    int         nLevel;
    BOOL        bMainEntry;

    String*     pPrimKey;
    String*     pSecKey;
    String*     pAltStr;
    String*     pTOUName;

public:
    SwTOXMarkDescription(TOXTypes eType) :
        eTOXType(eType),
        pPrimKey(0),
        pSecKey(0),
        pAltStr(0),
        pTOUName(0),
        nLevel(0),
        bMainEntry(FALSE)
        {
        }
    ~SwTOXMarkDescription()
    {
        delete pPrimKey;
        delete pSecKey;
        delete pAltStr;
        delete pTOUName;
    }

    TOXTypes        GetTOXType()const {return eTOXType;}

    void            SetLevel(int nSet) {nLevel = nSet;}
    int             GetLevel() const {return nLevel;}

    void            SetMainEntry(BOOL bSet) {bMainEntry = bSet;}
    BOOL            IsMainEntry() const {return bMainEntry;}

    void            SetPrimKey(const String& rSet)
                                {delete pPrimKey; pPrimKey = new String(rSet);}
    const String*   GetPrimKey() const {return pPrimKey;}

    void            SetSecKey(const String& rSet)
                                {delete pSecKey;  pSecKey  = new String(rSet);}
    const String*   GetSecKey() const { return pSecKey; }

    void            SetAltStr(const String& rSet)
                                {delete pAltStr;  pAltStr  = new String(rSet);}
    const String*   GetAltStr() const { return pAltStr; }

    void            SetTOUName(const String& rSet)
                                {delete pTOUName; pTOUName = new String(rSet);}
    const String*   GetTOUName() const {return pTOUName;}
};

class SwTOXMgr
{
    SwWrtShell*         pSh;
    SwTOXMark*          pCurTOXMark;
    SwTOXMarks          aCurMarks;

    USHORT              GetUserTypeID(const String& rStr);

public:
    SwTOXMgr(SwWrtShell* pShell);
    //
    // Methoden fuer Verzeichnismarkierungen
    //
    void    InsertTOXMark(const SwTOXMarkDescription& rDesc);

    void    UpdateTOXMark(const SwTOXMarkDescription& rDesc);


    void                DeleteTOXMark();
    void                NextTOXMark(BOOL bSame=FALSE);
    void                PrevTOXMark(BOOL bSame=FALSE);

    // Aktuelle TOXmarks holen
    USHORT              GetTOXMarks();
    USHORT              GetTOXMarkCount();
    SwTOXMark*          GetTOXMark(USHORT nId);
    SwTOXMark*          GetCurTOXMark();
    void                SetCurTOXMark(USHORT nId);

    //
    // Methoden fuer Verzeichnisse
    //
    BOOL    UpdateOrInsertTOX(const SwTOXDescription& rDesc, SwTOXBase** ppBase = 0, const SfxItemSet* pSet = 0);

#ifdef USE_OLD_INDEXES
    void    InsertTOI(const USHORT nOptions = TOI_SAME_ENTRY|TOI_FF|TOI_CASE_SENSITIVE,
                        const String* pTitel = 0,
                        const SwForm* pForm  = 0,
                        SwTOXBase** ppBase = 0 );

    BOOL    UpdateTOI(const USHORT nOptions,
                      const String* pTitel = 0,
                      const SwForm* pForm = 0);


    void    InsertTOC(const USHORT nContent = TOX_MARK | TOX_OUTLINELEVEL,
                        int nLevel = MAXLEVEL,
                        const String* pTitel = 0,
                        const SwForm* pForm = 0,
                        SwTOXBase** ppBase = 0);

    BOOL    UpdateTOC(const USHORT nContent = TOX_MARK | TOX_OUTLINELEVEL,
                      int nLevel = MAXLEVEL,
                      const String* pTitel = 0,
                      const SwForm* pForm = 0);

    void    InsertTOU(const USHORT nContent = TOX_MARK,
                        const String* pTOUName = 0,
                        const String* pTemplateName = 0,
                        int nLevel = MAXLEVEL,
                        const String* pTitel = 0,
                        const SwForm* pForm = 0,
                        SwTOXBase** ppBase = 0);

    BOOL    UpdateTOU(const USHORT nContent,
                        const String* pTOUName = 0,
                        const String* pTemplateName = 0,
                        int nLevel = MAXLEVEL,
                        const String* pTitel = 0,
                        const SwForm* pForm = 0);

#endif

    const SwTOXType*    GetTOXType(TOXTypes eTyp, USHORT nId) const;
    const SwTOXBase*    GetCurTOX();

};


/*--------------------------------------------------------------------
    Beschreibung: Inlines
 --------------------------------------------------------------------*/

inline USHORT SwTOXMgr::GetTOXMarkCount()
    {   return aCurMarks.Count();   }


inline SwTOXMark* SwTOXMgr::GetCurTOXMark()
    {   return pCurTOXMark; }

#endif
diff --git a/sw/source/ui/inc/uiborder.hxx b/sw/source/ui/inc/uiborder.hxx
new file mode 100644
index 0000000..fb2790a
--- /dev/null
+++ b/sw/source/ui/inc/uiborder.hxx
@@ -0,0 +1,85 @@
/*************************************************************************
 *
 *  $RCSfile: uiborder.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:42 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _UIBORDER_HXX
#define _UIBORDER_HXX


#ifndef _BASEDLGS_HXX //autogen
#include <sfx2/basedlgs.hxx>
#endif
class Window;
class SfxItemSet;

class SwBorderDlg : public SfxSingleTabDialog
{
public:

     // nType may be:
     // SW_BORDER_MODE_PARA
     // SW_BORDER_MODE_TABLE
     // SW_BORDER_MODE_FRAME

     SwBorderDlg(Window* pParent, SfxItemSet& rSet, USHORT nType);
    ~SwBorderDlg();
};

#endif

diff --git a/sw/source/ui/inc/uiitems.hxx b/sw/source/ui/inc/uiitems.hxx
new file mode 100644
index 0000000..4516476
--- /dev/null
+++ b/sw/source/ui/inc/uiitems.hxx
@@ -0,0 +1,147 @@
/*************************************************************************
 *
 *  $RCSfile: uiitems.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:43 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _UIITEMS_HXX
#define _UIITEMS_HXX

#include "pagedesc.hxx"
#include "cmdid.h"
#ifndef _SFXINTITEM_HXX
#include <svtools/intitem.hxx>
#endif
class SwNumRule;
class International;

/*--------------------------------------------------------------------
    Beschreibung: Container fuer FootNote
 --------------------------------------------------------------------*/
class SwPageFtnInfoItem : public SfxPoolItem
{
    SwPageFtnInfo aFtnInfo;

public:

    SwPageFtnInfoItem(const USHORT nId, SwPageFtnInfo& rInfo);
    SwPageFtnInfoItem(const SwPageFtnInfoItem& rItem );
    ~SwPageFtnInfoItem();

    virtual SfxPoolItem*    Clone( SfxItemPool *pPool = 0 ) const;
    virtual int             operator==( const SfxPoolItem& ) const;
    virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres,
                                    SfxMapUnit eCoreMetric,
                                    SfxMapUnit ePresMetric,
                                    String &rText,
                                    const International*    pIntl = 0 ) const;
    SwPageFtnInfo& GetPageFtnInfo()             { return aFtnInfo; }
    const SwPageFtnInfo& GetPageFtnInfo() const { return aFtnInfo; }
    void SetPageFtnInfo(SwPageFtnInfo& rInf)    { aFtnInfo = rInf; }
};

/*******************************************************************/

class SwPtrItem : public SfxPoolItem
{
    void* pMisc;

public:
    SwPtrItem( const USHORT nId = FN_PARAM_GRF_DIALOG, void* pPtr = 0);
    SwPtrItem( const SwPtrItem& rItem );

    virtual SfxPoolItem*    Clone( SfxItemPool *pPool = 0 ) const;
    virtual int             operator==( const SfxPoolItem& ) const;

    void    SetValue(void * pPtr)   { pMisc= pPtr; }
    void*   GetValue() const        { return pMisc; }
};

/*******************************************************************/

class SwUINumRuleItem : public SfxPoolItem
{
    SwNumRule* pRule;

public:
    SwUINumRuleItem( const String& rName, const USHORT = FN_PARAM_ACT_NUMBER);
    SwUINumRuleItem( const SwNumRule& rRule, const USHORT = FN_PARAM_ACT_NUMBER);
    SwUINumRuleItem( const SwUINumRuleItem& rItem );
    virtual ~SwUINumRuleItem();

    virtual SfxPoolItem*    Clone( SfxItemPool *pPool = 0 ) const;
    virtual int             operator==( const SfxPoolItem& ) const;

    virtual BOOL             QueryValue( com::sun::star::uno::Any& rVal, BYTE nMemberId = 0 ) const;
    virtual BOOL             PutValue( const com::sun::star::uno::Any& rVal, BYTE nMemberId = 0 );

    const SwNumRule* GetNumRule() const         { return pRule; }
          SwNumRule* GetNumRule()               { return pRule; }
};

/* -----------------17.06.98 17:40-------------------
 *
 * --------------------------------------------------*/
class SwBackgroundDestinationItem : public SfxUInt16Item
{
public:
    SwBackgroundDestinationItem(USHORT  nWhich, USHORT nValue);

    virtual SfxPoolItem*     Clone( SfxItemPool *pPool = 0 ) const;
};

#endif // _UIITEMS_HXX
diff --git a/sw/source/ui/inc/uinums.hxx b/sw/source/ui/inc/uinums.hxx
new file mode 100644
index 0000000..601e2a1
--- /dev/null
+++ b/sw/source/ui/inc/uinums.hxx
@@ -0,0 +1,178 @@
/*************************************************************************
 *
 *  $RCSfile: uinums.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:43 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _UINUMS_HXX
#define _UINUMS_HXX

#ifndef _SVARRAY_HXX //autogen
#include <svtools/svarray.hxx>
#endif

#ifndef _NUMRULE_HXX
#include <numrule.hxx>
#endif
#ifndef _CFGID_H
#include <cfgid.h>
#endif

class SfxPoolItem;
class SwWrtShell;
class SvStream;

#define MAX_NUM_RULES 9

typedef SfxPoolItem* SfxPoolItemPtr;
SV_DECL_PTRARR_DEL( _SwNumFmtsAttrs, SfxPoolItemPtr, 5,0 )

//------------------------------------------------------------------------
class SwNumRulesWithName
{
    String aName;
    // die Formate der NumRule muessen! unabhaengig von einem Document sein
    // (Sie sollen immer vorhanden sein!)
    class _SwNumFmtGlobal
    {
        SwNumFmt aFmt;
        String sCharFmtName;
        USHORT nCharPoolId;
        _SwNumFmtsAttrs aItems;

        _SwNumFmtGlobal& operator=( const _SwNumFmtGlobal& );

    public:
        _SwNumFmtGlobal( const SwNumFmt& rFmt );
        _SwNumFmtGlobal( const _SwNumFmtGlobal& );
        _SwNumFmtGlobal( SvStream&, USHORT nVersion );
        ~_SwNumFmtGlobal();

        void Store( SvStream& );
        void ChgNumFmt( SwWrtShell& rSh, SwNumFmt& rChg ) const;
    };

    _SwNumFmtGlobal* aFmts[ MAXLEVEL ];
protected:
    void SetName(const String& rSet) {aName = rSet;}

public:
    SwNumRulesWithName(const SwNumRule &, const String &);
    SwNumRulesWithName( const SwNumRulesWithName & );
    SwNumRulesWithName(SvStream &, USHORT nVersion);
    ~SwNumRulesWithName();

    const SwNumRulesWithName &operator=(const SwNumRulesWithName &);

    const String& GetName() const               { return aName; }
    void MakeNumRule( SwWrtShell& rSh, SwNumRule& rChg ) const;

    void Store( SvStream& );
};
/********************************************************************

********************************************************************/
class SwBaseNumRules
{
public:
    enum { nMaxRules = MAX_NUM_RULES };         // zur Zeit 9 definierte Forms
protected:
    SwNumRulesWithName  *pNumRules[ MAX_NUM_RULES ];
    String              sFileName;
    USHORT              nVersion;
     BOOL               bModified;

    virtual int         Load(SvStream&);
    virtual BOOL        Store(SvStream&);

    void                Init();

public:
    SwBaseNumRules(const String& rFileName);
    virtual ~SwBaseNumRules();

    inline const SwNumRulesWithName*    GetRules(USHORT nIdx) const;
    const SwNumRulesWithName*           GetRules(const String &rName) const;
    virtual void                        ApplyNumRules(
                                                const SwNumRulesWithName &rCopy,
                                                USHORT nIdx);

};

/********************************************************************

********************************************************************/
class SwChapterNumRules : public SwBaseNumRules
{

public:
    SwChapterNumRules();
    virtual ~SwChapterNumRules();

    virtual String      GetName() const;
    virtual void        ApplyNumRules(  const SwNumRulesWithName &rCopy,
                                            USHORT nIdx);
};

// INLINE METHODE --------------------------------------------------------
inline const SwNumRulesWithName *SwBaseNumRules::GetRules(USHORT nIdx) const
{
    ASSERT(nIdx < nMaxRules, Array der NumRules ueberindiziert.);
    return pNumRules[nIdx];
}

#endif
diff --git a/sw/source/ui/inc/uitool.hxx b/sw/source/ui/inc/uitool.hxx
new file mode 100644
index 0000000..08f8c1c
--- /dev/null
+++ b/sw/source/ui/inc/uitool.hxx
@@ -0,0 +1,139 @@
/*************************************************************************
 *
 *  $RCSfile: uitool.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:43 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _UITOOL_HXX
#define _UITOOL_HXX

#ifndef _SV_WINTYPES_HXX //autogen
#include <vcl/wintypes.hxx>
#endif
#ifndef _SV_FIELD_HXX
#include <vcl/field.hxx>
#endif

#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif

class MetricFormatter;
class SfxItemSet;
class SfxMedium;
class SwPageDesc;
class Printer;
class SvxTabStopItem;
class SwWrtShell;
class ListBox;
class SwDocShell;
class SwFrmFmt;
class SwTabCols;


// Umschalten einer Metric
void SetMetric(MetricFormatter& rCtrl, FieldUnit eUnit);

// BoxInfoAttribut fuellen
void PrepareBoxInfo(SfxItemSet& rSet, const SwWrtShell& rSh);

// SfxItemSets <-> PageDesc
void ItemSetToPageDesc(const SfxItemSet& rSet,
                       SwPageDesc& rPageDesc,
                       SwWrtShell* pShell );

void PageDescToItemSet( const SwPageDesc& rPageDesc, SfxItemSet& rSet);

// Auffuellen der Tabs mit DefaultTabs
void    MakeDefTabs(SwTwips nDefDist, SvxTabStopItem& rTabs);

// DefaultTabs loeschen aus dem TabStopArray
//void  EraseDefTabs(SvxTabStopItem& rTabs);

// Abstand zwischen dem 1. und zweitem Element ermitteln
USHORT  GetTabDist(const SvxTabStopItem& rTabs);

// erfrage ob im Set eine Sfx-PageDesc-Kombination vorliegt
// und setze diesen im Set und loesche die Transport Items
// (PageBreak & PageModel) aus dem Set
void SwToSfxPageDescAttr( SfxItemSet& rSet );
void SfxToSwPageDescAttr( const SwWrtShell& rShell, SfxItemSet& rSet );

FieldUnit   GetDfltMetric(BOOL bWeb);
void        SetDfltMetric(FieldUnit eMetric, BOOL bWeb);

// Umwandlung:  Sub(LibName.ModulName) -> LibName.ModulName.Sub
String ConvertMacroFormat(const String& rInput );

// besorge einen Filenamen/Filternamen. Wird ppMed uebergeben, wird das
// erzeugte Medium returnt. Auch das FilePassword kann returnt werden.
BOOL GetFileFilterNameDlg( Window& rParent, String& rFileName,
                            String* pFilePassword =0, String* pFilterName =0,
                            SfxMedium** ppMed = 0 );

// ListBox mit allen Zeichenvorlagen fuellen - ausser Standard!
void FillCharStyleListBox(ListBox& rToFill, SwDocShell* pDocSh, BOOL bSorted = FALSE);
//inserts a string sorted into a ListBox,
USHORT InsertStringSorted(const String& rEntry, ListBox& rToFill, BOOL bHasOffset, const International& rInt);

// Tabellenbreite und Ausrichtung ermitteln
SwTwips GetTableWidth( SwFrmFmt* pFmt, SwTabCols& rCols, USHORT *pPercent,
        SwWrtShell* pSh );


#endif // _UITOOL_HXX
diff --git a/sw/source/ui/inc/uivwimp.hxx b/sw/source/ui/inc/uivwimp.hxx
new file mode 100644
index 0000000..cdd3e79
--- /dev/null
+++ b/sw/source/ui/inc/uivwimp.hxx
@@ -0,0 +1,121 @@
/*************************************************************************
 *
 *  $RCSfile: uivwimp.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:43 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _UIVWIMP_HXX
#define _UIVWIMP_HXX

#ifndef _SWVIEW_HXX //autogen
#include <view.hxx>
#endif

#ifndef _COM_SUN_STAR_VIEW_XSELECTIONSUPPLIER_HPP_
#include <com/sun/star/view/XSelectionSupplier.hpp>
#endif
#ifndef _CPPUHELPER_IMPLBASE1_HXX_
#include <cppuhelper/implbase1.hxx> // helper for implementations
#endif

class SwXTextView;
/* -----------------------------29.05.00 08:22--------------------------------

 ---------------------------------------------------------------------------*/
class SwScannerEventListener : public ::cppu::WeakImplHelper1< ::com::sun::star::lang::XEventListener >
{
private:

    SwView*                 m_pParent;

public:

                            SwScannerEventListener( SwView* pParent ) : m_pParent( pParent )  {};
    virtual                 ~SwScannerEventListener();

    // XEventListener
    virtual void SAL_CALL   disposing( const ::com::sun::star::lang::EventObject& rEventObject );

    void                    ParentDestroyed() { m_pParent = NULL; }
};
/* ---------------------------------------------------------------------------

 ---------------------------------------------------------------------------*/
class SwView_Impl
{
    SwView*                     pView;
    ::com::sun::star::uno::Reference< ::com::sun::star::view::XSelectionSupplier > *pxXTextView;        // UNO object
    ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >      xScanEvtLstnr;
    SwScannerEventListener*     pScanEvtLstnr;
    ShellModes                  eShellMode;

    public:
        SwView_Impl(SwView* pShell);
        ~SwView_Impl();

        void                            SetShellMode(ShellModes eSet);

         ::com::sun::star::view::XSelectionSupplier* GetUNOObject();
        SwXTextView*                    GetUNOObject_Impl();

        ShellModes                      GetShellMode() {return eShellMode;}

        void                            ExcuteScan(USHORT nSlot);
        SwScannerEventListener&         GetScannerEventListener();
};
#endif

diff --git a/sw/source/ui/inc/unotools.hxx b/sw/source/ui/inc/unotools.hxx
new file mode 100644
index 0000000..fad07a5
--- /dev/null
+++ b/sw/source/ui/inc/unotools.hxx
@@ -0,0 +1,218 @@
/*************************************************************************
 *
 *  $RCSfile: unotools.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:43 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _UNOTOOLS_HXX
#define _UNOTOOLS_HXX


#ifndef _SV_DIALOG_HXX //autogen
#include <vcl/dialog.hxx>
#endif
#ifndef _SV_FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif
#ifndef _SV_EDIT_HXX //autogen
#include <vcl/edit.hxx>
#endif
#ifndef _SV_GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif
#ifndef _SV_BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif
#ifndef _ACTCTRL_HXX //autogen
#include <actctrl.hxx>
#endif
#ifndef _COM_SUN_STAR_FRAME_XCONTROLLER_HPP_
#include <com/sun/star/frame/XController.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXTCURSOR_HPP_
#include <com/sun/star/text/XTextCursor.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XNAMEACCESS_HPP_
#include <com/sun/star/container/XNameAccess.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XCONTROL_HPP_
#include <com/sun/star/awt/XControl.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XNAMED_HPP_
#include <com/sun/star/container/XNamed.hpp>
#endif

#ifndef _SV_RESARY_HXX
#include <vcl/resary.hxx>
#endif

/* -----------------09.06.99 14:36-------------------
 *
 * --------------------------------------------------*/
class SwRenameXNamedDlg : public ModalDialog
{
    FixedText       aNewNameFT;
    NoSpaceEdit     aNewNameED;
    GroupBox        aNameGB;
    OKButton        aOk;
    CancelButton    aCancel;
    HelpButton      aHelp;

    String          sRemoveWarning;

    ::com::sun::star::uno::Reference< ::com::sun::star::container::XNamed > &           xNamed;
    ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > &  xNameAccess;
    ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >        xSecondAccess;
    ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >        xThirdAccess;

    DECL_LINK(OkHdl, OKButton*);
    DECL_LINK(ModifyHdl, NoSpaceEdit*);

public:
    SwRenameXNamedDlg(Window* pParent, ::com::sun::star::uno::Reference< ::com::sun::star::container::XNamed > & xNamed, ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > & xNameAccess);

    void    SetForbiddenChars(const String& rSet){aNewNameED.SetForbiddenChars(rSet);}

    void    SetAlternativeAccess( ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > & xSecond, ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > & xThird)
            {
            xSecondAccess = xSecond;
            xThirdAccess = xThird;
            }

};
/* -----------------------------15.12.99 09:55--------------------------------

 ---------------------------------------------------------------------------*/
class SwOneExampleFrame;
class SwFrmCtrlWindow : public Window
{
    SwOneExampleFrame*  pExampleFrame;
public:
    SwFrmCtrlWindow(Window* pParent, WinBits nBits, SwOneExampleFrame*  pFrame);

    virtual void    Command( const CommandEvent& rCEvt );
};
/* -----------------------------15.12.99 12:56--------------------------------

 ---------------------------------------------------------------------------*/
class MenuResource : public Resource
{
    ResStringArray      aMenuArray;

public:
    MenuResource(const ResId& rResId);

    ResStringArray& GetMenuArray() {return aMenuArray;}
};
/* -----------------27.07.99 15:20-------------------

 --------------------------------------------------*/
#define EX_SHOW_ONLINE_LAYOUT   0x001

//online layout and hard zoom value
#define EX_SHOW_BUSINESS_CARDS  0x003

class SwView;
class SwOneExampleFrame
{
    SwFrmCtrlWindow aTopWindow;
    Window&         rWindow;
    ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl >         _xControl;
    ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel >         _xModel;
    ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController >    _xController;
    ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextCursor >     _xCursor;

    Timer           aLoadedTimer;
    Link            aInitializedLink;

    MenuResource    aMenuRes;

    SwView*         pModuleView;

    sal_uInt32          nStyleFlags;

    sal_Bool            bIsInitialized;
    sal_Bool            bServiceAvailable;

    static  sal_Bool    bShowServiceNotAvailableMessage;

    DECL_LINK( TimeoutHdl, Timer* );
    DECL_LINK( PopupHdl, Menu* );

public:
    SwOneExampleFrame(Window& rWin,
                    sal_uInt32 nStyleFlags = EX_SHOW_ONLINE_LAYOUT,
                    const Link* pInitalizedLink = 0,
                    String* pURL = 0);
    ~SwOneExampleFrame();

    ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl > &       GetControl() {return _xControl;}
    ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > &       GetModel() {return _xModel;}
    ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController > &  GetController() {return _xController;}
    ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextCursor > & GetTextCursor() {return   _xCursor;}

    void            ExecUndo();

    sal_Bool            IsInitialized() const {return bIsInitialized;}
    sal_Bool            IsServiceAvailable() const {return bServiceAvailable;}

    void CreatePopup(const Point& rPt);

    static void     CreateErrorMessage(Window* pParent);
};
#endif

diff --git a/sw/source/ui/inc/unotxvw.hxx b/sw/source/ui/inc/unotxvw.hxx
new file mode 100644
index 0000000..b792953
--- /dev/null
+++ b/sw/source/ui/inc/unotxvw.hxx
@@ -0,0 +1,262 @@
/*************************************************************************
 *
 *  $RCSfile: unotxvw.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:43 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _UNOTXVW_HXX
#define _UNOTXVW_HXX

#ifndef _SFX_SFXBASECONTROLLER_HXX_
#include <sfx2/sfxbasecontroller.hxx>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXTVIEWCURSOR_HPP_
#include <com/sun/star/text/XTextViewCursor.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXTVIEWCURSORSUPPLIER_HPP_
#include <com/sun/star/text/XTextViewCursorSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_VIEW_XCONTROLACCESS_HPP_
#include <com/sun/star/view/XControlAccess.hpp>
#endif
#ifndef _COM_SUN_STAR_VIEW_XSCREENCURSOR_HPP_
#include <com/sun/star/view/XScreenCursor.hpp>
#endif
#ifndef _COM_SUN_STAR_VIEW_XVIEWSETTINGSSUPPLIER_HPP_
#include <com/sun/star/view/XViewSettingsSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_VIEW_XSELECTIONSUPPLIER_HPP_
#include <com/sun/star/view/XSelectionSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_VIEW_XLINECURSOR_HPP_
#include <com/sun/star/view/XLineCursor.hpp>
#endif
#ifndef _COM_SUN_STAR_VIEW_XVIEWCURSOR_HPP_
#include <com/sun/star/view/XViewCursor.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XPAGECURSOR_HPP_
#include <com/sun/star/text/XPageCursor.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
#include <com/sun/star/beans/XPropertySet.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSTATE_HPP_
#include <com/sun/star/beans/XPropertyState.hpp>
#endif
#ifndef _COM_SUN_STAR_LANG_XSERVICEINFO_HPP_
#include <com/sun/star/lang/XServiceInfo.hpp>
#endif
#ifndef _CPPUHELPER_IMPLBASE8_HXX_
#include <cppuhelper/implbase8.hxx> // helper for implementations
#endif
#ifndef _SFX_ITEMPROP_HXX
#include <svtools/itemprop.hxx>
#endif


class SwView;
typedef ::com::sun::star::uno::Reference< ::com::sun::star::view::XSelectionChangeListener > * XSelectionChangeListenerPtr;
SV_DECL_PTRARR_DEL( SelectionChangeListenerArr, XSelectionChangeListenerPtr, 4, 4 );

/******************************************************************************
 *
 ******************************************************************************/
class SwXTextView :
    public ::com::sun::star::view::XSelectionSupplier,
    public ::com::sun::star::lang::XServiceInfo,
    public ::com::sun::star::view::XControlAccess,
    public ::com::sun::star::text::XTextViewCursorSupplier,
    public ::com::sun::star::view::XViewSettingsSupplier,
    public SfxBaseController
{
    SelectionChangeListenerArr aSelChangedListeners;

    SwView*                 pView;
    ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > *         pxViewSettings;
    ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextViewCursor > *   pxTextViewCursor;

public:
    SwXTextView(SwView* pSwView);
    virtual ~SwXTextView();

    virtual     ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type& aType ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL acquire(  ) throw();
    virtual void SAL_CALL release(  ) throw();

    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId(  ) throw(::com::sun::star::uno::RuntimeException);

    //XSelectionSupplier
    virtual ::com::sun::star::uno::Any SAL_CALL getSelection(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual sal_Bool SAL_CALL select(const ::com::sun::star::uno::Any& aInterface) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL addSelectionChangeListener(const ::com::sun::star::uno::Reference< ::com::sun::star::view::XSelectionChangeListener > & xListener) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL removeSelectionChangeListener(const ::com::sun::star::uno::Reference< ::com::sun::star::view::XSelectionChangeListener > & xListener) throw( ::com::sun::star::uno::RuntimeException );

    //XControlAccess
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl >  SAL_CALL getControl(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel > & Model) throw( ::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException );

    //XTextViewCursorSupplier
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextViewCursor >  SAL_CALL getViewCursor(void) throw( ::com::sun::star::uno::RuntimeException );

    //XViewSettings
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >  SAL_CALL getViewSettings(void) throw( ::com::sun::star::uno::RuntimeException );

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    void                    NotifySelChanged();

    SwView*                 GetView() {return pView;}
    void                    Invalidate(){pView = 0;}
};

/* -----------------17.09.98 12:52-------------------
 *
 * --------------------------------------------------*/
class SwXTextViewCursor : public cppu::WeakImplHelper8
<
::com::sun::star::text::XTextViewCursor,
::com::sun::star::lang::XServiceInfo,
::com::sun::star::text::XPageCursor,
::com::sun::star::view::XScreenCursor,
::com::sun::star::view::XViewCursor,
::com::sun::star::view::XLineCursor,
::com::sun::star::beans::XPropertySet,
::com::sun::star::beans::XPropertyState
>
{
    SwView*             pView;
    SfxItemPropertySet  aPropSet;
public:
    SwXTextViewCursor(SwView* pVw);
    virtual ~SwXTextViewCursor();

    //XTextViewCursor
    virtual sal_Bool SAL_CALL isVisible(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL setVisible(sal_Bool bVisible) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::awt::Point SAL_CALL getPosition(void) throw( ::com::sun::star::uno::RuntimeException );

    //XTextCursor - neu
    virtual void SAL_CALL collapseToStart(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL collapseToEnd(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual BOOL SAL_CALL isCollapsed(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual BOOL SAL_CALL goLeft( sal_Int16 nCount, BOOL bExpand ) throw(::com::sun::star::uno::RuntimeException);
    virtual BOOL SAL_CALL goRight( sal_Int16 nCount, BOOL bExpand ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL gotoStart( BOOL bExpand ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL gotoEnd( BOOL bExpand ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL gotoRange( const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange >& xRange, BOOL bExpand ) throw(::com::sun::star::uno::RuntimeException);

    //XPageCursor
    virtual sal_Bool SAL_CALL jumpToFirstPage(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual sal_Bool SAL_CALL jumpToLastPage(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual sal_Bool SAL_CALL jumpToPage(sal_Int16 nPage) throw( ::com::sun::star::uno::RuntimeException );
    virtual sal_Bool SAL_CALL jumpToNextPage(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual sal_Bool SAL_CALL jumpToPreviousPage(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual sal_Bool SAL_CALL jumpToEndOfPage(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual sal_Bool SAL_CALL jumpToStartOfPage(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual sal_Int16 SAL_CALL getPage(void) throw( ::com::sun::star::uno::RuntimeException );

    //XTextRange
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XText >  SAL_CALL getText(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > SAL_CALL  getStart(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > SAL_CALL   getEnd(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual rtl::OUString SAL_CALL  getString(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL  setString(const rtl::OUString& aString) throw( ::com::sun::star::uno::RuntimeException );

    //XScreenCursor
    virtual sal_Bool SAL_CALL screenDown(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual sal_Bool SAL_CALL screenUp(void) throw( ::com::sun::star::uno::RuntimeException );

    //XViewCursor
    virtual sal_Bool SAL_CALL goDown(sal_Int16 nCount, sal_Bool bExpand) throw( ::com::sun::star::uno::RuntimeException );
    virtual sal_Bool SAL_CALL goUp(sal_Int16 nCount, sal_Bool bExpand) throw( ::com::sun::star::uno::RuntimeException );
//    virtual sal_Bool goLeft(sal_Int16 nCount, sal_Bool bExpand) throw( ::com::sun::star::uno::RuntimeException );
//    virtual sal_Bool goRight(sal_Int16 nCount, sal_Bool bExpand) throw( ::com::sun::star::uno::RuntimeException );

    //XLineCursor
    virtual sal_Bool SAL_CALL isAtStartOfLine(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual sal_Bool SAL_CALL isAtEndOfLine(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL gotoEndOfLine(sal_Bool bExpand) throw( ::com::sun::star::uno::RuntimeException );
    virtual void SAL_CALL gotoStartOfLine(sal_Bool bExpand) throw( ::com::sun::star::uno::RuntimeException );

    //XPropertySet
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removePropertyChangeListener( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //XPropertyState
    virtual ::com::sun::star::beans::PropertyState SAL_CALL getPropertyState( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyState > SAL_CALL getPropertyStates( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aPropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setPropertyToDefault( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException);
    virtual ::com::sun::star::uno::Any SAL_CALL getPropertyDefault( const ::rtl::OUString& aPropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);

    //XServiceInfo
    virtual rtl::OUString SAL_CALL getImplementationName(void) throw( ::com::sun::star::uno::RuntimeException );
    virtual BOOL SAL_CALL supportsService(const rtl::OUString& ServiceName) throw( ::com::sun::star::uno::RuntimeException );
    virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(void) throw( ::com::sun::star::uno::RuntimeException );

    void    Invalidate(){pView = 0;}
};
#endif


diff --git a/sw/source/ui/inc/usrpref.hxx b/sw/source/ui/inc/usrpref.hxx
new file mode 100644
index 0000000..d07bf09
--- /dev/null
+++ b/sw/source/ui/inc/usrpref.hxx
@@ -0,0 +1,86 @@
/*************************************************************************
 *
 *  $RCSfile: usrpref.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:43 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _USRPREF_HXX
#define _USRPREF_HXX


#ifndef _SFXCFGITEM_HXX //autogen
#include <sfx2/cfgitem.hxx>
#endif
#include "viewopt.hxx"

class SwMasterUsrPref: public SwViewOption, public SfxConfigItem
{
protected:
    virtual int     Load(SvStream&);
    virtual BOOL    Store(SvStream&);
    virtual void    UseDefault();

public:
    SwMasterUsrPref(USHORT nType);

    virtual String GetName() const;

    void SetUsrPref(const SwViewOption &rCopy);
};

#endif

diff --git a/sw/source/ui/inc/utlui.hrc b/sw/source/ui/inc/utlui.hrc
new file mode 100644
index 0000000..0b1d6ceb
--- /dev/null
+++ b/sw/source/ui/inc/utlui.hrc
@@ -0,0 +1,198 @@
/*************************************************************************
 *
 *  $RCSfile: utlui.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:43 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _UTLUI_HRC
#define _UTLUI_HRC

#include "rcid.hrc"


#define RID_SW_SHELLRES             (RC_UTLUI_BEGIN + 1)
#define RID_STR_SYSTEM              (RC_UTLUI_BEGIN + 2)

// ------------------------------------------------------------------------

// Strings in NumberFormatter-Listbox
#define STR_DEFINE_NUMBERFORMAT                 (RC_UTLUI_BEGIN + 4)

// Namene der Inhaltstypen                      (RC_UTLUI_BEGIN + 7)
#define STR_CONTENT_TYPE_FIRST                  (RC_UTLUI_BEGIN + 8)
#define STR_CONTENT_TYPE_OUTLINE                STR_CONTENT_TYPE_FIRST
#define STR_CONTENT_TYPE_TABLE                  (RC_UTLUI_BEGIN + 9)
#define STR_CONTENT_TYPE_FRAME                  (RC_UTLUI_BEGIN + 10)
#define STR_CONTENT_TYPE_GRAPHIC                (RC_UTLUI_BEGIN + 11)
#define STR_CONTENT_TYPE_OLE                    (RC_UTLUI_BEGIN + 12)
#define STR_CONTENT_TYPE_BOOKMARK               (RC_UTLUI_BEGIN + 13)
#define STR_CONTENT_TYPE_REGION                 (RC_UTLUI_BEGIN + 14)
#define STR_CONTENT_TYPE_URLFIELD               (RC_UTLUI_BEGIN + 15)
#define STR_CONTENT_TYPE_REFERENCE              (RC_UTLUI_BEGIN + 16)
#define STR_CONTENT_TYPE_INDEX                  (RC_UTLUI_BEGIN + 17)
#define STR_CONTENT_TYPE_POSTIT                 (RC_UTLUI_BEGIN + 18)
#define STR_CONTENT_TYPE_DRAWOBJECT             (RC_UTLUI_BEGIN + 19)
#define STR_CONTENT_END                         (RC_UTLUI_BEGIN + 19)

#define STR_CONTENT_TYPE_SINGLE_FIRST           (STR_CONTENT_END + 1)
#define STR_CONTENT_TYPE_SINGLE_OUTLINE         (STR_CONTENT_TYPE_SINGLE_FIRST + 0)
#define STR_CONTENT_TYPE_SINGLE_TABLE           (STR_CONTENT_TYPE_SINGLE_FIRST + 1)
#define STR_CONTENT_TYPE_SINGLE_FRAME           (STR_CONTENT_TYPE_SINGLE_FIRST + 2)
#define STR_CONTENT_TYPE_SINGLE_GRAPHIC         (STR_CONTENT_TYPE_SINGLE_FIRST + 3)
#define STR_CONTENT_TYPE_SINGLE_OLE             (STR_CONTENT_TYPE_SINGLE_FIRST + 4)
#define STR_CONTENT_TYPE_SINGLE_BOOKMARK        (STR_CONTENT_TYPE_SINGLE_FIRST + 5)
#define STR_CONTENT_TYPE_SINGLE_REGION          (STR_CONTENT_TYPE_SINGLE_FIRST + 6)
#define STR_CONTENT_TYPE_SINGLE_URLFIELD        (STR_CONTENT_TYPE_SINGLE_FIRST + 7)
#define STR_CONTENT_TYPE_SINGLE_REFERENCE       (STR_CONTENT_TYPE_SINGLE_FIRST + 8)
#define STR_CONTENT_TYPE_SINGLE_INDEX           (STR_CONTENT_TYPE_SINGLE_FIRST + 9)
#define STR_CONTENT_TYPE_SINGLE_POSTIT          (STR_CONTENT_TYPE_SINGLE_FIRST + 10)
#define STR_CONTENT_TYPE_SINGLE_DRAWOBJECT      (STR_CONTENT_TYPE_SINGLE_FIRST + 11)
#define STR_CONTENT_SINGLE_END                  STR_CONTENT_TYPE_SINGLE_DRAWOBJECT

#define FLD_DOCINFO_BEGIN   STR_CONTENT_SINGLE_END
#define FLD_DOCINFO_TITEL   FLD_DOCINFO_BEGIN
#define FLD_DOCINFO_THEMA   (FLD_DOCINFO_BEGIN + 1)
#define FLD_DOCINFO_KEYS    (FLD_DOCINFO_BEGIN + 2)
#define FLD_DOCINFO_COMMENT (FLD_DOCINFO_BEGIN + 3)
#define FLD_DOCINFO_INFO1   (FLD_DOCINFO_BEGIN + 4)
#define FLD_DOCINFO_INFO2   (FLD_DOCINFO_BEGIN + 5)
#define FLD_DOCINFO_INFO3   (FLD_DOCINFO_BEGIN + 6)
#define FLD_DOCINFO_INFO4   (FLD_DOCINFO_BEGIN + 7)
#define FLD_DOCINFO_CREATE  (FLD_DOCINFO_BEGIN + 8)
#define FLD_DOCINFO_CHANGE  (FLD_DOCINFO_BEGIN + 9)
#define FLD_DOCINFO_PRINT   (FLD_DOCINFO_BEGIN + 10)
#define FLD_DOCINFO_DOCNO   (FLD_DOCINFO_BEGIN + 11)
#define FLD_DOCINFO_EDIT    (FLD_DOCINFO_BEGIN + 12)
#define FLD_DOCINFO_END     (FLD_DOCINFO_BEGIN + 13)

#define STR_SERVICE_UNAVAILABLE (FLD_DOCINFO_END  + 1)

#define STR_AUTH_TYPE_START     (FLD_DOCINFO_END  + 2)
#define STR_AUTH_TYPE_ARTICLE       (STR_AUTH_TYPE_START + 0)
#define STR_AUTH_TYPE_BOOK          (STR_AUTH_TYPE_START + 1)
#define STR_AUTH_TYPE_BOOKLET       (STR_AUTH_TYPE_START + 2)
#define STR_AUTH_TYPE_CONFERENCE    (STR_AUTH_TYPE_START + 3)
#define STR_AUTH_TYPE_INBOOK        (STR_AUTH_TYPE_START + 4)
#define STR_AUTH_TYPE_INCOLLECTION  (STR_AUTH_TYPE_START + 5)
#define STR_AUTH_TYPE_INPROCEEDINGS (STR_AUTH_TYPE_START + 6)
#define STR_AUTH_TYPE_JOURNAL       (STR_AUTH_TYPE_START + 7)
#define STR_AUTH_TYPE_MANUAL        (STR_AUTH_TYPE_START + 8)
#define STR_AUTH_TYPE_MASTERSTHESIS (STR_AUTH_TYPE_START + 9)
#define STR_AUTH_TYPE_MISC          (STR_AUTH_TYPE_START + 10)
#define STR_AUTH_TYPE_PHDTHESIS     (STR_AUTH_TYPE_START + 11)
#define STR_AUTH_TYPE_PROCEEDINGS   (STR_AUTH_TYPE_START + 12)
#define STR_AUTH_TYPE_TECHREPORT    (STR_AUTH_TYPE_START + 13)
#define STR_AUTH_TYPE_UNPUBLISHED   (STR_AUTH_TYPE_START + 14)
#define STR_AUTH_TYPE_EMAIL         (STR_AUTH_TYPE_START + 15)
#define STR_AUTH_TYPE_WWW           (STR_AUTH_TYPE_START + 16)
#define STR_AUTH_TYPE_CUSTOM1       (STR_AUTH_TYPE_START + 17)
#define STR_AUTH_TYPE_CUSTOM2       (STR_AUTH_TYPE_START + 18)
#define STR_AUTH_TYPE_CUSTOM3       (STR_AUTH_TYPE_START + 19)
#define STR_AUTH_TYPE_CUSTOM4       (STR_AUTH_TYPE_START + 20)
#define STR_AUTH_TYPE_CUSTOM5       (STR_AUTH_TYPE_START + 21)
#define STR_AUTH_TYPE_END           (STR_AUTH_TYPE_CUSTOM5)

#define STR_AUTH_FIELD_START            (STR_AUTH_TYPE_END + 1)
#define STR_AUTH_FIELD_IDENTIFIER       (STR_AUTH_FIELD_START + 0)
#define STR_AUTH_FIELD_AUTHORITY_TYPE   (STR_AUTH_FIELD_START + 1)
#define STR_AUTH_FIELD_ADDRESS          (STR_AUTH_FIELD_START + 2)
#define STR_AUTH_FIELD_ANNOTE           (STR_AUTH_FIELD_START + 3)
#define STR_AUTH_FIELD_AUTHOR           (STR_AUTH_FIELD_START + 4)
#define STR_AUTH_FIELD_BOOKTITLE        (STR_AUTH_FIELD_START + 5)
#define STR_AUTH_FIELD_CHAPTER          (STR_AUTH_FIELD_START + 6)
#define STR_AUTH_FIELD_EDITION          (STR_AUTH_FIELD_START + 7)
#define STR_AUTH_FIELD_EDITOR           (STR_AUTH_FIELD_START + 8)
#define STR_AUTH_FIELD_HOWPUBLISHED     (STR_AUTH_FIELD_START + 9)
#define STR_AUTH_FIELD_INSTITUTION      (STR_AUTH_FIELD_START + 10)
#define STR_AUTH_FIELD_JOURNAL          (STR_AUTH_FIELD_START + 11)
#define STR_AUTH_FIELD_MONTH            (STR_AUTH_FIELD_START + 12)
#define STR_AUTH_FIELD_NOTE             (STR_AUTH_FIELD_START + 13)
#define STR_AUTH_FIELD_NUMBER           (STR_AUTH_FIELD_START + 14)
#define STR_AUTH_FIELD_ORGANIZATIONS    (STR_AUTH_FIELD_START + 15)
#define STR_AUTH_FIELD_PAGES            (STR_AUTH_FIELD_START + 16)
#define STR_AUTH_FIELD_PUBLISHER        (STR_AUTH_FIELD_START + 17)
#define STR_AUTH_FIELD_SCHOOL           (STR_AUTH_FIELD_START + 18)
#define STR_AUTH_FIELD_SERIES           (STR_AUTH_FIELD_START + 19)
#define STR_AUTH_FIELD_TITLE            (STR_AUTH_FIELD_START + 20)
#define STR_AUTH_FIELD_TYPE             (STR_AUTH_FIELD_START + 21)
#define STR_AUTH_FIELD_VOLUME           (STR_AUTH_FIELD_START + 22)
#define STR_AUTH_FIELD_YEAR             (STR_AUTH_FIELD_START + 23)
#define STR_AUTH_FIELD_URL              (STR_AUTH_FIELD_START + 24)
#define STR_AUTH_FIELD_CUSTOM1          (STR_AUTH_FIELD_START + 25)
#define STR_AUTH_FIELD_CUSTOM2          (STR_AUTH_FIELD_START + 26)
#define STR_AUTH_FIELD_CUSTOM3          (STR_AUTH_FIELD_START + 27)
#define STR_AUTH_FIELD_CUSTOM4          (STR_AUTH_FIELD_START + 28)
#define STR_AUTH_FIELD_CUSTOM5          (STR_AUTH_FIELD_START + 29)
#define STR_AUTH_FIELD_ISBN             (STR_AUTH_FIELD_START + 30)
#define STR_AUTH_FIELD_END              (STR_AUTH_FIELD_ISBN)

#define RES_FRMEX_MENU                  (STR_AUTH_FIELD_END + 1)

#define DLG_NAVIGATION_PI           (RC_UTLUI_BEGIN + 1)
#define DLG_ADDR_PI                 (RC_UTLUI_BEGIN + 2)
#define DLG_GLOSSARY_DECIDE_DLG     (RC_UTLUI_BEGIN + 3)

#define IMG_NAVI_ENTRYBMP           (RC_UTLUI_BEGIN + 4)

#define UTLUI_ACT_END               RES_FRMEX_MENU

#if UTLUI_ACT_END > RC_UTLUI_END
#error Resource-Id Ueberlauf in #file, #line
#endif

#endif
diff --git a/sw/source/ui/inc/view.hxx b/sw/source/ui/inc/view.hxx
new file mode 100644
index 0000000..3869452
--- /dev/null
+++ b/sw/source/ui/inc/view.hxx
@@ -0,0 +1,655 @@
/*************************************************************************
 *
 *  $RCSfile: view.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:43 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWVIEW_HXX
#define _SWVIEW_HXX

#ifndef _TIMER_HXX //autogen
#include <vcl/timer.hxx>
#endif
#ifndef _SV_FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif
#ifndef _VIEWFAC_HXX //autogen
#include <sfx2/viewfac.hxx>
#endif
#ifndef _SFXVIEWSH_HXX //autogen
#include <sfx2/viewsh.hxx>
#endif
#ifndef _SVX_SVXENUM_HXX //autogen
#include <svx/svxenum.hxx>
#endif
#ifndef _SVX_ZOOMITEM_HXX //autogen
#include <svx/zoomitem.hxx>
#endif

#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _SHELLID_HXX
#include <shellid.hxx>
#endif

class SwBaseShell;
class Button;
class ImageButton;
class SwTxtFmtColl;
class SwPageDesc;
class SwFrmFmt;
class SwCharFmt;
class SwNumRule;
class SwViewOption;
class SwGlossaryHdl;
class SwDrawBase;
class SvxRuler;
class SvxLRSpaceItem;
class SwDocShell;
class SwScrollbar;
class PrintDialog;
class SvxVCBrowser;
class SvBorder;
class Ruler;
class OutlinerView;
class SvxSearchItem;
class SearchAttrItemList;
class SvxSearchDialog;
class SdrView;
class Dialog;
class SdrObject;
class SdrPageView;
class SwNaviImageButton;
class SwHlpImageButton;
class Outliner;
class SwView;
class SwEditWin;
class SwWrtShell;
class SwView_Impl;
namespace com{ namespace sun { namespace star {namespace view{ class XSelectionSupplier;}}}}
class XSelectionObject;
struct SwSearchOptions;
class FmFormShell;
class CommandEvent;
class InsCaptionOpt;
class SvGlobalName;

const long nLeftOfst = -370;
const long nScrollX  =   30;
const long nScrollY  =   30;

#define MINZOOM 20
#define MAXZOOM 600

#define MAX_MARKS 5


enum ShellModes
{
    SEL_TEXT,
    SEL_FRAME,
    SEL_GRAPHIC,
    SEL_OBJECT,
    SEL_DRAW,
    SEL_DRAW_CTRL,
    SEL_DRAW_FORM,
    SEL_DRAWTEXT,
    SEL_BEZIER,
    SEL_LIST_TEXT,
    SEL_TABLE_TEXT,
    SEL_TABLE_LIST_TEXT
};

/*--------------------------------------------------------------------
    Beschreibung:   Anwendung einer Vorlage
 --------------------------------------------------------------------*/

struct SwApplyTemplate
{
    union
    {
        SwTxtFmtColl* pTxtColl;
        SwPageDesc*   pPageDesc;
        SwFrmFmt*     pFrmFmt;
        SwCharFmt*    pCharFmt;
        SwNumRule*    pNumRule;
    } aColl;

    int eType;
    USHORT nColor;
    BOOL bUndo;

    SwApplyTemplate() :
        eType(0),
        nColor(0),
        bUndo(FALSE)
    {
        aColl.pTxtColl = 0;
    }
};


/*--------------------------------------------------------------------
    Beschreibung:   Sicht auf ein Dokument
 --------------------------------------------------------------------*/

class SwView: public SfxViewShell
{
    //Messehack (MA,MBA)
    friend void lcl_SelectShellForDrop( SwView &rView );

    friend class TestTemplateItem;
    friend class SwSpellWrapper;
    friend class SwHyphWrapper;
    friend class SwView_Impl;

    //suchen & ersetzen
    static SvxSearchDialog *pSrchDlg;
    static SvxSearchItem   *pSrchItem;

    static USHORT           nInsertCtrlState;
    static USHORT           nWebInsertCtrlState;
    static USHORT           nInsertObjectCtrlState;
    static USHORT           nInsertFieldCtrlState;
    static USHORT           nMoveType; // fuer Buttons unter dem Scrollbar (viewmdi)
    static BYTE             nActMark; // aktuelle Sprungmarke fuer unbenannte Merker

    static BOOL             bExtra;
    static BOOL             bFound;
    static BOOL             bJustOpened;

    static SearchAttrItemList* pSrchList;
    static SearchAttrItemList* pReplList;


    Timer               aTimer;         //Fuer verzoegerte ChgLnks waehrend
                                        //einer Aktion
    String              aPageStr;       //Statusanzeige, aktuelle Seite
    String              sSwViewData,
    //and the new cursor position if the user double click in the PagePreView
                        sNewCrsrPos;

    Point               aTabColFromDocPos;  //Verschieben von Tabellenspalten aus
                                            //aus dem Dokument heraus.
    Size                aDocSz;         // aktuelle Dokumentgroesse
    Rectangle           aVisArea;       // sichtbarer Bereich

    SwEditWin           *pEditWin;
    SwWrtShell          *pWrtShell;

    SfxShell            *pShell;        //aktuelle SubShell auf dem Dispatcher
    FmFormShell         *pFormShell;    // DB-FormShell

    SwView_Impl         *pViewImpl;     // Impl-Daten fuer UNO + Basic


    SwScrollbar         *pHScrollbar,   // MDI Bedienelemente
                        *pVScrollbar;

    Window              *pScrollFill;   // Dummy-Window zum Fllen der rechten
                                        // unteren Ecke, wenn beide Scrollbars
                                        // aktiv sind

    SvxRuler            *pHLineal,
                        *pVLineal;
    ImageButton         *pTogglePageBtn;

    SwHlpImageButton    *pPageUpBtn,
                        *pPageDownBtn;

    SwNaviImageButton   *pNaviBtn;
    SwGlossaryHdl       *pGlosHdl;          // Henkel Textbausteine
    SwDrawBase          *pDrawActual;

    const SwFrmFmt*     pLastTableFormat;

    int                 nSelectionType;

    // Aktueller Drawmode
    USHORT          nDrawSfxId;
    USHORT          nFormSfxId;

    BOOL            bCenterCrsr : 1,
                    bTopCrsr : 1,
                    bAllwaysShowSel : 1,
                    bTabColFromDoc : 1,
                    bSetTabColFromDoc : 1 ,
                    bAttrChgNotified : 1,
                    bAttrChgNotifiedWithRegistrations : 1,
                    bVerbsActive : 1,
                    bDrawRotate : 1,
                    bDrawSelMode : 1,
                    bShowAtResize : 1,
                    bInOuterResizePixel : 1,
                    bIsApi : 1;

    // Methoden fuers Suchen
    // Suchkontext setzen
    BOOL            SearchAndWrap(BOOL bApi = FALSE);
    BOOL            SearchAll(USHORT* pFound = 0);
    ULONG           FUNC_Search( const SwSearchOptions& rOptions );
    void            Replace();

    inline BOOL     IsDocumentBorder();

    BOOL            IsTextTool() const;

    // Bedienelemente verwalten anlegen
    void            CreateBtns();
    DECL_LINK( BtnPage, Button * );

    DECL_LINK( TimeoutHdl, Timer * );

    inline long     GetXScroll() const;
    inline long     GetYScroll() const;
           Point    AlignToPixel(const Point& rPt) const;
           void     CalcPt( Point* pPt,const Rectangle& rRect,
                            USHORT nRangeX = USHRT_MAX,
                            USHORT nRangeY = USHRT_MAX);

    BOOL            GetPageScrollUpOffset(SwTwips& rOff) const;
    BOOL            GetPageScrollDownOffset(SwTwips& rOff) const;

    // Scrollbar Movements
    long            PageUp();
    long            PageDown();
    long            PageUpCrsr(BOOL bSelect);
    long            PageDownCrsr(BOOL bSelect);
    long            PhyPageUp();
    long            PhyPageDown();

    int             _CreateScrollbar( int bHori );
    int             _KillScrollbar( int bHori );
    DECL_LINK( ScrollHdl, SwScrollbar * );
    DECL_LINK( EndScrollHdl, SwScrollbar * );
    BOOL            UpdateScrollbars();
    void            CalcVisArea( const Size &rPixelSz );

    int             _CreateVLineal();
    int             _KillVLineal();
    int             _CreateTab();
    int             _KillTab();
    void            CreatePageButtons(BOOL bShow);

    // Linguistik-Funktionen
    void            SpellDocument( const String* pStr, BOOL bAllRight = FALSE );
    void            HyphenateDocument();
    BOOL            IsDrawTextHyphenate();
    void            HyphenateDrawText();
    void            StartThesaurus();

    void            SpellStart( SvxSpellArea eSpell, BOOL bStartDone,
                                BOOL bEndDone );
    void            HyphStart( SvxSpellArea eSpell );
    void            SpellEnd();
    void            _SpellDocument( const String* pStr, BOOL bAllRight );
    BOOL            CheckSpecialCntnt();
    void            SpellKontext(BOOL bOn = TRUE)
                            { bCenterCrsr = bOn; bAllwaysShowSel = bOn; }

    // Methoden fuers Printing
    virtual SfxPrinter*     GetPrinter( BOOL bCreate = FALSE );
    virtual PrintDialog*    CreatePrintDialog( Window* pParent );
            SfxTabPage*     CreatePrintOptionsPage( Window* pParent,
                                                    const SfxItemSet& rSet);
    // fuer Readonly-Umschaltung
    virtual void    Notify( SfxBroadcaster& rBC, const SfxHint& rHint );
    void            _CheckReadonlyState();
    void            _CheckReadonlySelection();

    // Methode fuer PageDesc drehen
    void            SwapPageMargin(const SwPageDesc&, SvxLRSpaceItem& rLR);

    void            _SetZoom( const Size &rEditSz,
                              SvxZoomType eZoomType,
                              short nFactor = 100,
                              BOOL bViewOnly = FALSE);
    void            CalcAndSetBorderPixel( SvBorder &rToFill, FASTBOOL bInner );

    void            ShowAtResize();

    virtual void    Move();


protected:

    SwView_Impl*    GetViewImpl() {return pViewImpl;}

    void ImpSetVerb( int nSelType );

    int             GetSelectionType() const { return nSelectionType; }
    void            SetSelectionType(int nSet) { nSelectionType = nSet;}

    // fuer die SwWebView
    void            SetShell( SfxShell* pS )            { pShell = pS; }
    void            SetFormShell( FmFormShell* pSh )    { pFormShell = pSh; }

    virtual void    SelectShell();

    virtual void    Activate(BOOL);
    virtual void    Deactivate(BOOL);
    virtual void    InnerResizePixel( const Point &rOfs, const Size &rSize );
    virtual void    OuterResizePixel( const Point &rOfs, const Size &rSize );
    virtual Size    GetOptimalSizePixel() const;

    void            SetImageButtonColor(Color& rColor);

    const SwFrmFmt* GetLastTblFrmFmt() const {return pLastTableFormat;}
    void            SetLastTblFrmFmt(const SwFrmFmt* pSet) {pLastTableFormat = pSet;}

public:

    SFX_DECL_VIEWFACTORY(SwView);
    SFX_DECL_INTERFACE(SW_VIEWSHELL);
    TYPEINFO();

    SfxDispatcher   &GetDispatcher();

    virtual SdrView*        GetDrawView() const;
    virtual void            UIDeactivate( SvInPlaceObject *pIPObj );
    virtual BOOL            HasUIFeature( ULONG nFeature );
    virtual void            ShowCursor( FASTBOOL bOn = TRUE );
    virtual ErrCode         DoVerb( long nVerb );

    virtual USHORT          SetPrinter( SfxPrinter* pNew,
                                        USHORT nDiff = SFX_PRINTER_ALL);
    virtual ErrCode         DoPrint( SfxPrinter *pPrinter, PrintDialog *pPrintDialog,
                                     BOOL bSilent );
    ShellModes              GetShellMode();

    com::sun::star::view::XSelectionSupplier*       GetUNOObject();

    String                  GetSelectionTextParam(  BOOL bCompleteWords,
                                                BOOL bEraseTrail,
                                                BOOL bExtendedDelimiter = FALSE );
    virtual BOOL            HasSelection( BOOL  bText ) const;
    virtual String          GetSelectionText( BOOL bCompleteWords );
    virtual USHORT          PrepareClose( BOOL bUI = TRUE, BOOL bForBrowsing = FALSE );
    virtual void            MarginChanged();

    // Shell sofort wechseln ->  fuer GetSelectionObject
    void        StopShellTimer();
    // hier wird bei Bedarf SelectShell gerufen (getSelection)
    void        PrepareGetSelection();

    inline SwWrtShell&      GetWrtShell   () const { return *pWrtShell; }
    inline SwWrtShell*      GetWrtShellPtr() const { return  pWrtShell; }

    inline       SwEditWin &GetEditWin()        { return *pEditWin; }
    inline const SwEditWin &GetEditWin () const { return *pEditWin; }

#if defined WIN || defined WNT || defined UNX
    void ScannerEventHdl( const ::com::sun::star::lang::EventObject& rEventObject );
#endif

    //Handler fuer Textbausteine an die Textshell rausreichen, gfs. anlegen
    SwGlossaryHdl*          GetGlosHdl();

    inline const Rectangle& GetVisArea() const { return aVisArea; }

    BOOL            IsScroll(const Rectangle& rRect) const;
    void            Scroll( const Rectangle& rRect,
                            USHORT nRangeX = USHRT_MAX,
                            USHORT nRangeY = USHRT_MAX);

    long        SetVScrollMax(long lMax);
    long        SetHScrollMax(long lMax);

    DECL_LINK( SpellError, void * );
    BOOL            ExecSpellPopup( const Point& rPt );
    BOOL            ExecDrwTxtSpellPopup(const Point& rPt);

    void            SetTabColFromDocPos( const Point &rPt ) { aTabColFromDocPos = rPt; }
    void            SetTabColFromDoc( BOOL b ) { bTabColFromDoc = b; }
    BOOL            IsTabColFromDoc() const    { return bTabColFromDoc; }

            void    DocSzChgd( const Size& rNewSize );
    const   Size&   GetDocSz() const { return aDocSz; }
    virtual void    SetVisArea( const Rectangle&, BOOL bUpdateScrollbar = TRUE);
            void    SetVisArea( const Point&, BOOL bUpdateScrollbar = TRUE);
            void    CheckVisArea();

    static Dialog*  GetSearchDialog();

    static USHORT   GetMoveType();
    static void     SetMoveType(USHORT nSet);
    void            MoveNavigation(BOOL bNext);
    static void     SetActMark(BYTE nSet);

    BOOL            HandleWheelCommands( const CommandEvent& );

    // Rahmen einfuegen
    void            InsFrmMode(USHORT nCols);

    void            SetZoom( SvxZoomType eZoomType, short nFactor = 100, BOOL bViewOnly = FALSE);
    virtual void    SetZoomFactor( const Fraction &rX, const Fraction & );

    inline int      StatHScrollbar() const;
    inline int      CreateHScrollbar();
    inline int      KillHScrollbar();

    inline int      CreateVScrollbar();
    inline int      KillVScrollbar();
    inline int      StatVScrollbar() const;

    inline int      CreateVLineal();
    inline int      KillVLineal();
    int             StatVLineal() const { return pVLineal != 0; }
    void            ChangeVLinealMetric(FieldUnit eUnit);

    inline int      CreateTab();
    inline int      KillTab();
    int             StatTab() const { return ((Window*)pHLineal)->IsVisible(); }
    SvxRuler       *GetHLineal()    { return pHLineal; }
    SvxRuler       *GetVLineal()    { return pVLineal; }
    void            InvalidateRulerPos();
    void            ChangeTabMetric(FieldUnit eUnit);

        // Handler
    void            Execute(SfxRequest&);
    void            ExecPageMove(SfxRequest&);
    void            ExecStyle(SfxRequest&);
    void            ExecLingu(SfxRequest&);
    void            ExecDataBase(SfxRequest&);
    void            ExecDlg(SfxRequest&);
    void            ExecDlgExt(SfxRequest&);
    void            ExecDBDlg(SfxRequest &);
    void            ExecColl(SfxRequest&);
    void            ExecutePrint(SfxRequest&);
    void            ExecDraw(SfxRequest&);
    void            ExecTabWin(SfxRequest&);
    void            ExecuteStatusLine(SfxRequest&);
    DECL_LINK( ExecRulerClick, Ruler * );
    void            ExecSearch(SfxRequest&, BOOL bNoMessage = FALSE);

    void            StateSearch(SfxItemSet &);
    void            GetState(SfxItemSet&);
    void            StateStatusLine(SfxItemSet&);


    // Funktionen fuer Drawing
    void            SetDrawFuncPtr(SwDrawBase* pFuncPtr);
    inline SwDrawBase* GetDrawFuncPtr(BOOL bBuf = FALSE) const  { return pDrawActual; }
    void            GetDrawState(SfxItemSet &rSet);
    void            ExitDraw();
    inline BOOL     IsDrawRotate()      { return bDrawRotate; }
    inline void     FlipDrawRotate()    { bDrawRotate = !bDrawRotate; }
    inline BOOL     IsDrawSelMode()     { return bDrawSelMode; }
    void            SetSelDrawSlot();
    inline void     FlipDrawSelMode()   { bDrawSelMode = !bDrawSelMode; }
    void            NoRotate();     // Rotate-Mode abschalten
    BOOL            EnterDrawTextMode(const Point& aDocPos);
    void            LeaveDrawCreate()   { nDrawSfxId = nFormSfxId = USHRT_MAX; }
    BOOL            IsDrawMode()        { return (nDrawSfxId != USHRT_MAX || nFormSfxId != USHRT_MAX); }
    BOOL            IsFormMode() const;
    BOOL            IsBezierEditMode();
    BOOL            AreOnlyFormsSelected() const;
    BOOL            HasDrwObj(SdrObject *pSdrObj) const;
    BOOL            HasOnlyObj(SdrObject *pSdrObj, UINT32 eObjInventor) const;
    BOOL            BeginTextEdit(  SdrObject* pObj, SdrPageView* pPV=NULL,
                                    Window* pWin=NULL, BOOL bIsNewObj=FALSE);

    void            StateTabWin(SfxItemSet&);

    // Attribute haben sich geaendert
    DECL_LINK( AttrChangedNotify, SwWrtShell * );

    // Links bearbeiten
    void            EditLinkDlg();
    void            AutoCaption(const USHORT nType, const SvGlobalName *pOleId = 0);
    void            InsertCaption(const InsCaptionOpt *pOpt);

    // Async Aufruf durch Core
    void        UpdatePageNums(USHORT nPhyNum, USHORT nVirtNum, const String& rPgStr);

    String      GetPageStr(USHORT nPhyNum, USHORT nVirtNum, const String& rPgStr);

    // Shell rausreichen
                 SfxShell       *GetCurShell()  { return pShell; }
                 SwDocShell     *GetDocShell();
    inline const SwDocShell     *GetDocShell() const;
    inline       FmFormShell    *GetFormShell() { return pFormShell; }

    //damit in DToren der SubShells ggf. pShell zurueckgesetzt werden kann
    void ResetSubShell()    { pShell = 0; }

    virtual void    WriteUserData(String &, BOOL bBrowse = FALSE );
    virtual void    ReadUserData(const String &, BOOL bBrowse = FALSE );

    void SetCrsrAtTop( BOOL bFlag, BOOL bCenter = FALSE )
        { bTopCrsr = bFlag, bCenterCrsr = bCenter; }
    BOOL IsCrsrAtTop() const                    { return bTopCrsr; }
    BOOL IsCrsrAtCenter() const                 { return bCenterCrsr; }

    BOOL JumpToSwMark( const String& rMark );

    long InsertDoc( USHORT nSlotId, const String& rFileName,
                    const String& rFilterName, INT16 nVersion = 0 );

    SwView(SfxViewFrame* pFrame, SfxViewShell*);
    ~SwView();
};

// ----------------- inline Methoden ----------------------

inline int SwView::StatHScrollbar() const
{
    return  0 != pHScrollbar;
}
inline int SwView::CreateHScrollbar()
{
    return StatHScrollbar() ? 1 : _CreateScrollbar( TRUE );
}
inline int SwView::KillHScrollbar()
{
    return StatHScrollbar() ? _KillScrollbar( TRUE ) : 1;
}

inline int SwView::StatVScrollbar() const
{
    return  0 != pVScrollbar;
}
inline int SwView::CreateVScrollbar()
{
    return StatVScrollbar() ? 1 : _CreateScrollbar( FALSE );
}
inline int SwView::KillVScrollbar()
{
    return StatVScrollbar() ? _KillScrollbar( FALSE ) : 1;
}

inline int SwView::CreateVLineal()
{
    return StatVLineal() ? 1 : _CreateVLineal();
}
inline int SwView::KillVLineal()
{
    return StatVLineal() ? _KillVLineal() : 1;
}

inline int SwView::CreateTab()
{
    return StatTab() ? 1 : _CreateTab();
}
inline int  SwView::KillTab()
{
    return StatTab() ? _KillTab() : 1;
}

inline long SwView::GetXScroll() const
{
    return aVisArea.GetWidth() * nScrollX / 100L;
}

inline long SwView::GetYScroll() const
{
    return aVisArea.GetHeight() * nScrollY / 100L;
}

inline const SwDocShell *SwView::GetDocShell() const
{
    return ((SwView*)this)->GetDocShell();
}

//***********************************************************

SfxTabPage* CreatePrintOptionsPage( Window *pParent,
                                    const SfxItemSet &rOptions,
                                    BOOL bPreview);

#endif
diff --git a/sw/source/ui/inc/web.hrc b/sw/source/ui/inc/web.hrc
new file mode 100644
index 0000000..10795ac
--- /dev/null
+++ b/sw/source/ui/inc/web.hrc
@@ -0,0 +1,117 @@
/*************************************************************************
 *
 *  $RCSfile: web.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:43 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _WEB_HRC
#define _WEB_HRC

#include "rcid.hrc"

#define RC_WEB_ICON                             (RC_WEB_BEGIN + 1)
#define RID_WEBTOOLS_TOOLBOX                    (RC_WEB_BEGIN + 2)
#define RID_WEBTEXT_TOOLBOX                     (RC_WEB_BEGIN + 3)
#define STR_HUMAN_SWWEBDOC_NAME                 (RC_WEB_BEGIN + 4)
#define STR_WRITER_WEBDOC_FULLTYPE_40           (RC_WEB_BEGIN + 5)
#define STR_SHELLNAME_WEBTEXT                   (RC_WEB_BEGIN + 6)
#define STR_SHELLNAME_WEBFRAME                  (RC_WEB_BEGIN + 7)
#define RID_WEBFRAME_TOOLBOX                    (RC_WEB_BEGIN + 8)
#define STR_WRITER_WEBDOC_FULLTYPE              (RC_WEB_BEGIN + 9)
#define RID_WEBGRAPHIC_TOOLBOX                  (RC_WEB_BEGIN + 10)
#define RID_WEBOLE_TOOLBOX                      (RC_WEB_BEGIN + 11)


#define MN_WEBFILE                              (RC_WEB_BEGIN + 30)
#define MN_WEBEDIT                              (RC_WEB_BEGIN + 31)
#define MN_WEBVIEW                              (RC_WEB_BEGIN + 32)
#define MN_WEBINS                               (RC_WEB_BEGIN + 33)
#define MN_WEBFORMAT                            (RC_WEB_BEGIN + 34)
#define MN_WEBEXTRA                             (RC_WEB_BEGIN + 35)
#define MN_WEBWIN                               (RC_WEB_BEGIN + 36)

#define MN_OBJECTMENU_WEBTEXT               (RC_WEB_BEGIN + 37)
#define MN_OBJECTMENU_WEBLIST               (RC_WEB_BEGIN + 38)
#define MN_OBJECTMENU_WEBTABLE              (RC_WEB_BEGIN + 39)
#define MN_OBJECTMENU_WEBFRAME              (RC_WEB_BEGIN + 40)
#define MN_OBJECTMENU_WEBGRAFIK             (RC_WEB_BEGIN + 41)
#define MN_OBJECTMENU_WEBDRAW               (RC_WEB_BEGIN + 42)
#define MN_OBJECTMENU_WEBDRWTXT             (RC_WEB_BEGIN + 43)
#define MN_OBJECTMENU_WEBOLE                (RC_WEB_BEGIN + 44)
#define MN_OBJECTMENU_WEBDRAWCONTROL        (RC_WEB_BEGIN + 45)

#define MN_WEB_TEXT_POPUPMENU               (RC_WEB_BEGIN + 46)

#define MN_WEBFILE_PORT                         (RC_WEB_BEGIN + 47)
#define MN_WEBEDIT_PORT                         (RC_WEB_BEGIN + 48)
#define MN_WEBVIEW_PORT                         (RC_WEB_BEGIN + 49)
#define MN_WEBINS_PORT                          (RC_WEB_BEGIN + 50)
#define MN_WEBFORMAT_PORT                       (RC_WEB_BEGIN + 51)
#define MN_WEBEXTRA_PORT                        (RC_WEB_BEGIN + 52)
#define MN_WEBWIN_PORT                          (RC_WEB_BEGIN + 53)

// ------------------------------------------------------------------------

#define WEB_ACT_END                 MN_OBJECTMENU_WEBDRAWCONTROL


#if WEB_ACT_END > RC_WEB_END
#error Resource-Id Ueberlauf in #file, #line
#endif

#endif
diff --git a/sw/source/ui/inc/wformsh.hxx b/sw/source/ui/inc/wformsh.hxx
new file mode 100644
index 0000000..dfa89ca
--- /dev/null
+++ b/sw/source/ui/inc/wformsh.hxx
@@ -0,0 +1,79 @@
/*************************************************************************
 *
 *  $RCSfile: wformsh.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:43 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWWDRWFORMSH_HXX
#define _SWWDRWFORMSH_HXX

#include "drformsh.hxx"

class SwWebDrawFormShell : public SwDrawFormShell
{
public:
    SwWebDrawFormShell(SwView &rShell);
    virtual     ~SwWebDrawFormShell();

    SFX_DECL_INTERFACE(SW_WEBDRAWFORMSHELL);
    TYPEINFO();
};


#endif


diff --git a/sw/source/ui/inc/wfrmsh.hxx b/sw/source/ui/inc/wfrmsh.hxx
new file mode 100644
index 0000000..e7f40ae
--- /dev/null
+++ b/sw/source/ui/inc/wfrmsh.hxx
@@ -0,0 +1,82 @@
/*************************************************************************
 *
 *  $RCSfile: wfrmsh.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:43 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _SWWFRMSH_HXX
#define _SWWFRMSH_HXX

#include "frmsh.hxx"


class SwWebFrameShell: public SwFrameShell
{

public:
    SFX_DECL_INTERFACE(SW_WEBFRAMESHELL);
    TYPEINFO();

             SwWebFrameShell(SwView &rView);
    virtual ~SwWebFrameShell();
};

#endif



diff --git a/sw/source/ui/inc/wgrfsh.hxx b/sw/source/ui/inc/wgrfsh.hxx
new file mode 100644
index 0000000..56b1c44
--- /dev/null
+++ b/sw/source/ui/inc/wgrfsh.hxx
@@ -0,0 +1,79 @@
/*************************************************************************
 *
 *  $RCSfile: wgrfsh.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:43 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWWGRFSH_HXX
#define _SWWGRFSH_HXX

#include "grfsh.hxx"

class SwWebGrfShell: public SwGrfShell
{
public:
    SwWebGrfShell(SwView &rShell);
    virtual     ~SwWebGrfShell();

    SFX_DECL_INTERFACE(SW_WEBGRFSHELL);
    TYPEINFO();
};


#endif


diff --git a/sw/source/ui/inc/wlistsh.hxx b/sw/source/ui/inc/wlistsh.hxx
new file mode 100644
index 0000000..7c824c8
--- /dev/null
+++ b/sw/source/ui/inc/wlistsh.hxx
@@ -0,0 +1,76 @@
/*************************************************************************
 *
 *  $RCSfile: wlistsh.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:43 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWWLISTSH_HXX
#define _SWWLISTSH_HXX

#include "listsh.hxx"

class SwWebListShell: public SwListShell
{
public:
    SFX_DECL_INTERFACE(SW_WEBLISTSHELL);
    TYPEINFO();

    virtual     ~SwWebListShell();
                SwWebListShell(SwView &rView);
};

#endif
diff --git a/sw/source/ui/inc/wolesh.hxx b/sw/source/ui/inc/wolesh.hxx
new file mode 100644
index 0000000..fccee3a
--- /dev/null
+++ b/sw/source/ui/inc/wolesh.hxx
@@ -0,0 +1,82 @@
/*************************************************************************
 *
 *  $RCSfile: wolesh.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:43 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWWOLESH_HXX
#define _SWWOLESH_HXX

#include "olesh.hxx"

class SwWebOleShell: public SwOleShell
{
public:
    SFX_DECL_INTERFACE(SW_WEBOLESHELL);

    virtual     ~SwWebOleShell();
                SwWebOleShell(SwView &rView);
};

#endif







diff --git a/sw/source/ui/inc/workctrl.hxx b/sw/source/ui/inc/workctrl.hxx
new file mode 100644
index 0000000..982461e
--- /dev/null
+++ b/sw/source/ui/inc/workctrl.hxx
@@ -0,0 +1,228 @@
/*************************************************************************
 *
 *  $RCSfile: workctrl.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:43 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _WORKCTRL_HXX
#define _WORKCTRL_HXX

#ifndef _SFXTBXCTRL_HXX //autogen
#include <sfx2/tbxctrl.hxx>
#endif

#ifndef _VALUESET_HXX //autogen
#include <svtools/valueset.hxx>
#endif

#ifndef _IMAGEBTN_HXX //autogen
#include <vcl/imagebtn.hxx>
#endif

class PopupMenu;
class SwView;

// doppelter Eintrag! hrc und hxx
// diese Ids bestimmen, was die Buttons unter dem Scrollbar tun
#define NID_START   20000
#define NID_NEXT    20000
#define NID_PREV    20001
#define NID_TBL     20002
#define NID_FRM     20003
#define NID_PGE     20004
#define NID_DRW     20005
#define NID_CTRL    20006
#define NID_REG     20007
#define NID_BKM     20008
#define NID_GRF     20009
#define NID_OLE     20010
#define NID_OUTL    20011
#define NID_SEL     20012
#define NID_FTN     20013
#define NID_MARK    20014
#define NID_POSTIT  20015
#define NID_SRCH_REP 20016
#define NID_INDEX_ENTRY  20017
#define NID_TABLE_FORMULA   20018
#define NID_TABLE_FORMULA_ERROR     20019
#define NID_COUNT  20



//----------------------------------------------------------------------------
//
//----------------------------------------------------------------------------

class SwTbxInsertCtrl : public SfxToolBoxControl
{
    USHORT                  nLastSlotId;

    virtual void            Select( BOOL bMod1 = FALSE );

public:
    SFX_DECL_TOOLBOX_CONTROL();

    SwTbxInsertCtrl( USHORT nId, ToolBox& rTbx, SfxBindings& rBind );
    ~SwTbxInsertCtrl();

    virtual SfxPopupWindowType  GetPopupWindowType() const;
    virtual SfxPopupWindow*     CreatePopupWindow();
    virtual void                StateChanged( USHORT nSID,
                                              SfxItemState eState,
                                              const SfxPoolItem* pState );

};

//----------------------------------------------------------------------------
//
//----------------------------------------------------------------------------

class SwTbxAutoTextCtrl : public SfxToolBoxControl
{
    PopupMenu*              pPopup;
    SwView*                 pView;


    void                    DelPopup();
public:
    SFX_DECL_TOOLBOX_CONTROL();

    SwTbxAutoTextCtrl( USHORT nId, ToolBox& rTbx, SfxBindings& rBind );
    ~SwTbxAutoTextCtrl();

    virtual SfxPopupWindowType  GetPopupWindowType() const;
    virtual SfxPopupWindow*     CreatePopupWindow();
    virtual void                StateChanged( USHORT nSID,
                                              SfxItemState eState,
                                              const SfxPoolItem* pState );

    DECL_LINK(PopupHdl, PopupMenu*);
};


//----------------------------------------------------------------------------
//
//----------------------------------------------------------------------------

class SwScrollNaviValueSet : public ValueSet
{
    virtual void    MouseButtonUp( const MouseEvent& rMEvt );
    virtual void    RequestHelp( const HelpEvent& rHEvt );

    public:
        SwScrollNaviValueSet(Window* pParent, WinBits nWinStyle ) :
            ValueSet(pParent, nWinStyle ) {}
};

class SwScrollNaviPopup : public SfxPopupWindow
{
    SwScrollNaviValueSet    aVSet;
    ImageList       aIList;
    const ResId&    rResId;

    String          sQuickHelp[2 * NID_COUNT];

    USHORT          nFwdId;
    USHORT          nBackId;

    protected:
        DECL_LINK(SelectHdl, ValueSet*);

    public:
        SwScrollNaviPopup( USHORT nId, const ResId &rId, SfxBindings & );
        ~SwScrollNaviPopup();

    static String           GetQuickHelpText(BOOL bNext);
    virtual void            PopupModeEnd();
    virtual SfxPopupWindow* Clone() const;
};

//----------------------------------------------------------------------------
//
//----------------------------------------------------------------------------

class SwNaviImageButton : public ImageButton
{
        SwScrollNaviPopup*  pPopup;
        Image               aImage;
        String              sQuickText;

    protected:
        virtual void    MouseButtonDown( const MouseEvent& rMEvt );
        virtual void    MouseButtonUp( const MouseEvent& rMEvt );
    public:
        SwNaviImageButton(Window* pParent);
};

//----------------------------------------------------------------------------
//  Die ImageButtons muessen sich bei Bedarf den HelpText selbst setzen
//----------------------------------------------------------------------------

class SwHlpImageButton : public ImageButton
{
    BOOL        bUp;
    public:
        SwHlpImageButton(Window* pParent, const ResId& rResId, BOOL bUpBtn) :
            ImageButton(pParent, rResId), bUp(bUpBtn){}

    virtual void    RequestHelp( const HelpEvent& rHEvt );

};
#endif



diff --git a/sw/source/ui/inc/wrap.hxx b/sw/source/ui/inc/wrap.hxx
new file mode 100644
index 0000000..3a9cc0f
--- /dev/null
+++ b/sw/source/ui/inc/wrap.hxx
@@ -0,0 +1,185 @@
/*************************************************************************
 *
 *  $RCSfile: wrap.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:43 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _WRAP_HXX
#define _WRAP_HXX

#ifndef _SFXTABDLG_HXX //autogen
#include <sfx2/tabdlg.hxx>
#endif

#ifndef _BASEDLGS_HXX //autogen
#include <sfx2/basedlgs.hxx>
#endif

#ifndef _IMAGEBTN_HXX //autogen
#include <vcl/imagebtn.hxx>
#endif

#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif

#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif

#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif

#ifndef _FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif

class Window;
class SfxItemSet;
class SwWrtShell;

class SwWrapDlg : public SfxSingleTabDialog
{
    SwWrtShell*         pWrtShell;

public:
     SwWrapDlg(Window* pParent, SfxItemSet& rSet, SwWrtShell* pSh, BOOL bDrawMode);
    ~SwWrapDlg();

    inline SwWrtShell*  GetWrtShell()   { return pWrtShell; }
};


/*--------------------------------------------------------------------
    Beschreibung:   Umlauf-TabPage
 --------------------------------------------------------------------*/

class SwWrapTabPage: public SfxTabPage
{
    // WRAPPING
    ImageRadioButton    aNoWrapRB;
    ImageRadioButton    aWrapLeftRB;
    ImageRadioButton    aWrapRightRB;
    ImageRadioButton    aWrapParallelRB;
    ImageRadioButton    aWrapThroughRB;
    ImageRadioButton    aIdealWrapRB;
    GroupBox            aWrapBoxC;

    CheckBox            aWrapAnchorOnlyCB;
    CheckBox            aWrapTransparentCB;
    CheckBox            aWrapOutlineCB;
    CheckBox            aWrapOutsideCB;
    GroupBox            aOptionsGB;

    // MARGIN
    FixedText           aLeftMarginFT;
    MetricField         aLeftMarginED;
    FixedText           aRightMarginFT;
    MetricField         aRightMarginED;
    FixedText           aTopMarginFT;
    MetricField         aTopMarginED;
    FixedText           aBottomMarginFT;
    MetricField         aBottomMarginED;
    GroupBox            aMarginGB;

    ImageList           aWrapIL;

    USHORT              nOldLeftMargin;
    USHORT              nOldRightMargin;
    USHORT              nOldUpperMargin;
    USHORT              nOldLowerMargin;

    USHORT              nAnchorId;
    USHORT              nHtmlMode;

    Size aFrmSize;
    SwWrtShell*         pWrtSh;

    BOOL bFormat;
    BOOL bNew;
    BOOL bHtmlMode;
    BOOL bDrawMode;
    BOOL bContourImage;

    SwWrapTabPage(Window *pParent, const SfxItemSet &rSet);
    ~SwWrapTabPage();

    void            EnableModes(const SfxItemSet& rSet);
    virtual void    ActivatePage(const SfxItemSet& rSet);
    virtual int     DeactivatePage(SfxItemSet *pSet);

    DECL_LINK( RangeModifyHdl, MetricField * );
    DECL_LINK( WrapTypeHdl, ImageRadioButton * );
    DECL_LINK( ContourHdl, CheckBox * );

public:
    static SfxTabPage *Create(Window *pParent, const SfxItemSet &rSet);

    virtual BOOL    FillItemSet(SfxItemSet &rSet);
    virtual void    Reset(const SfxItemSet &rSet);

    static USHORT*  GetRanges();
    inline void     SetNewFrame(BOOL bNewFrame) { bNew = bNewFrame; }
    inline void     SetFormatUsed(BOOL bFmt, BOOL bDrw) { bFormat = bFmt;
                                                            bDrawMode = bDrw; }
    inline void     SetShell(SwWrtShell* pSh) { pWrtSh = pSh; }
};

#endif


diff --git a/sw/source/ui/inc/wrtsh.hxx b/sw/source/ui/inc/wrtsh.hxx
new file mode 100644
index 0000000..410a6a8
--- /dev/null
+++ b/sw/source/ui/inc/wrtsh.hxx
@@ -0,0 +1,611 @@
/*************************************************************************
 *
 *  $RCSfile: wrtsh.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:43 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _WRTSH_HXX
#define _WRTSH_HXX

#ifndef _FESH_HXX
#include <fesh.hxx>
#endif
#ifndef _SORTOPT_HXX
#include <sortopt.hxx>
#endif
#ifndef _SWURL_HXX
#include <swurl.hxx>
#endif

class Window;
class SbxArray;
class SwDoc;
class SvInPlaceObjectRef;
class SvEmbeddedObjectRef;
class SpellCheck;
class SwViewOption;
class SwFlyFrmAttrMgr;
class SwField;
class SwTOXBase;
class SdrView;
class SwView;
class SvGlobalName;
class SwInputFieldList;
class SwSection;
class Timer;
class SvxMacro;
class SwFmtINetFmt;
class SvxINetBookmark;
class SvxAutoCorrect;
class NaviContentBookmark;
struct SwCallMouseEvent;
class DropEvent;
struct ChartSelectionInfo;

#ifndef _COM_SUN_STAR_LINGUISTIC_XSPELLCHECKER1_HPP_
#include <com/sun/star/linguistic/XSpellChecker1.hpp>
#endif
#ifndef _COM_SUN_STAR_LINGUISTIC_XHYPHENATOR_HPP_
#include <com/sun/star/linguistic/XHyphenator.hpp>
#endif

class SwWrtShell: public SwFEShell
{
public:
    typedef long (SwWrtShell::*SELECTFUNC)(const Point *, BOOL bProp );

    SELECTFUNC  fnDrag;
    SELECTFUNC  fnSetCrsr;
    SELECTFUNC  fnEndDrag;
    SELECTFUNC  fnKillSel;

    // Alle Selektionen aufheben
    long ResetSelect( const Point *, BOOL );

    //setzt den Cursorstack nach dem Bewegen mit PageUp/-Down
    //zurueck, falls ein Stack aufgebaut ist
    inline void ResetCursorStack();

    enum SelectionType
    {
        SEL_TXT       = CNT_TXT, // Text, niemals auch Rahmen   0x0001
        SEL_GRF       = CNT_GRF, // Grafik                      0x0002
        SEL_OLE       = CNT_OLE, // OLE                         0x0010
        SEL_FRM       = 0x0020, // Rahmen, keine Inhaltsform
        SEL_NUM       = 0x0040, // NumListe
        SEL_TBL       = 0x0080, // Cursor steht in Tabelle
        SEL_TBL_CELLS = 0x0100, // Tabellenzellen sind selektiert
        SEL_DRW       = 0x0200, // Zeichenobjekte (Rechteck, Kreis...)
        SEL_DRW_TXT   = 0x0400, // Draw-Textobjekte im Editmode
        SEL_BEZ       = 0x0800, // Bezierobjekte editieren
        SEL_DRW_FORM  = 0x1000  // Zeichenobjekte: DB-Forms
    };
    int     GetSelectionType() const;

    BOOL    IsModePushed() const { return 0 != pModeStack; }
    void    PushMode();
    void    PopMode();

    void    SttSelect();
    void    EndSelect();
    BOOL    IsInSelect() const { return bInSelect; }
    void    SetInSelect(BOOL bSel = TRUE) { bInSelect = bSel; }
        // Liegt eine Text- oder Rahmenselektion vor?
    BOOL    HasSelection() const { return IsSelection() || IsSelFrmMode() || IsObjSelected(); }
    FASTBOOL Pop( BOOL bOldCrsr = TRUE );

    void    EnterStdMode();
    BOOL    IsStdMode() const { return !bExtMode && !bAddMode; }

    void    EnterExtMode();
    void    LeaveExtMode();
    long    ToggleExtMode();
    BOOL    IsExtMode() const { return bExtMode; }

    void    EnterAddMode();
    void    LeaveAddMode();
    long    ToggleAddMode();
    BOOL    IsAddMode() const { return bAddMode; }

    void    SetInsMode( BOOL bOn = TRUE );
    void    ToggleInsMode() { SetInsMode( !bIns ); }
    BOOL    IsInsMode() const { return bIns; }

    void    EnterSelFrmMode(const Point *pStartDrag = 0);
    void    LeaveSelFrmMode();
    BOOL    IsSelFrmMode() const { return bLayoutMode; }
        // Selektion von Rahmen aufheben
    void    UnSelectFrm();

    // Tabellenzellen selektieren fuer Bearbeiten von Formeln in der Ribbonbar
    inline void SelTblCells( const Link &rLink, BOOL bMark = TRUE );
    inline void EndSelTblCells();

    //Wortweisen oder zeilenweisen Selektionsmodus verlassen. Wird
    //in der Regel in MB-Up gerufen.
    BOOL    IsExtSel() const { return bSelWrd || bSelLn; }

    // erfrage, ob der akt. fnDrag - Pointer auf BeginDrag gesetzt ist
    // Wird fuer MouseMove gebraucht, um die Bugs 55592/55931 zu umgehen.
    inline BOOL Is_FnDragEQBeginDrag() const;

    //Basisabfragen
    BOOL    IsInWrd()           { return IsInWord(); }
    BOOL    IsSttWrd()          { return IsStartWord(); }
    BOOL    IsEndWrd();
    BOOL    IsSttOfPara() const { return IsSttPara(); }
    BOOL    IsEndOfPara() const { return IsEndPara(); }

    //Word bzw. Satz selektieren.
    BOOL    SelNearestWrd();
    BOOL    SelWrd      (const Point * = 0, BOOL bProp=FALSE );
    BOOL    SelSentence (const Point * = 0, BOOL bProp=FALSE );
    void    SelLine     (const Point * = 0, BOOL bProp=FALSE );
    long    SelAll();

    //Basiscursortravelling
typedef FASTBOOL (SwWrtShell:: *FNSimpleMove)();
    FASTBOOL SimpleMove( FNSimpleMove, FASTBOOL bSelect );

    FASTBOOL Left       ( FASTBOOL bSelect = FALSE, USHORT nCount = 1,
                            BOOL bBasicCall = FALSE );
    FASTBOOL Right      ( FASTBOOL bSelect = FALSE, USHORT nCount = 1,
                            BOOL bBasicCall = FALSE );
    FASTBOOL Up         ( FASTBOOL bSelect = FALSE, USHORT nCount = 1,
                            BOOL bBasicCall = FALSE );
    FASTBOOL Down       ( FASTBOOL bSelect = FALSE, USHORT nCount = 1,
                            BOOL bBasicCall = FALSE );
    FASTBOOL NxtWrd     ( FASTBOOL bSelect = FALSE ) { return SimpleMove( &SwWrtShell::_NxtWrd, bSelect ); }
    FASTBOOL PrvWrd     ( FASTBOOL bSelect = FALSE ) { return SimpleMove( &SwWrtShell::_PrvWrd, bSelect ); }
    FASTBOOL LeftMargin ( FASTBOOL bSelect = FALSE, FASTBOOL bBasicCall = FALSE );
    FASTBOOL RightMargin( FASTBOOL bSelect = FALSE, FASTBOOL bBasicCall = FALSE );
    FASTBOOL SttDoc     ( FASTBOOL bSelect = FALSE );
    FASTBOOL EndDoc     ( FASTBOOL bSelect = FALSE );

    FASTBOOL SttNxtPg   ( FASTBOOL bSelect = FALSE );
    FASTBOOL SttPrvPg   ( FASTBOOL bSelect = FALSE );
    FASTBOOL EndNxtPg   ( FASTBOOL bSelect = FALSE );
    FASTBOOL EndPrvPg   ( FASTBOOL bSelect = FALSE );
    FASTBOOL SttPg      ( FASTBOOL bSelect = FALSE );
    FASTBOOL EndPg      ( FASTBOOL bSelect = FALSE );
    FASTBOOL SttPara    ( FASTBOOL bSelect = FALSE );
    FASTBOOL EndPara    ( FASTBOOL bSelect = FALSE );
    FASTBOOL FwdPara    ( FASTBOOL bSelect = FALSE )
                { return SimpleMove( &SwWrtShell::_FwdPara, bSelect ); }
    FASTBOOL BwdPara    ( FASTBOOL bSelect = FALSE )
                { return SimpleMove( &SwWrtShell::_BwdPara, bSelect ); }
    FASTBOOL FwdSentence( FASTBOOL bSelect = FALSE )
                { return SimpleMove( &SwWrtShell::_FwdSentence, bSelect ); }
    FASTBOOL BwdSentence( FASTBOOL bSelect = FALSE )
                { return SimpleMove( &SwWrtShell::_BwdSentence, bSelect ); }

    FASTBOOL SelectTableRow();
    FASTBOOL SelectTableCol();
    FASTBOOL SelectTxtAttr( USHORT nWhich, const SwTxtAttr* pAttr = 0 );

    // Spaltenweise Spruenge
    FASTBOOL StartOfColumn      ( FASTBOOL bSelect = FALSE );
    FASTBOOL EndOfColumn        ( FASTBOOL bSelect = FALSE );
    FASTBOOL StartOfNextColumn  ( FASTBOOL bSelect = FALSE );
    FASTBOOL EndOfNextColumn    ( FASTBOOL bSelect = FALSE );
    FASTBOOL StartOfPrevColumn  ( FASTBOOL bSelect = FALSE );
    FASTBOOL EndOfPrevColumn    ( FASTBOOL bSelect = FALSE );

    // setze den Cursor auf die Seite "nPage" an den Anfang
    // zusaetzlich zu der gleichnamigen Implementierung in crsrsh.hxx
    // werden hier alle bestehenden Selektionen vor dem Setzen des
    // Cursors aufgehoben
    BOOL    GotoPage(USHORT nPage, BOOL bRecord = TRUE);

    //setzen des Cursors; merken der alten Position fuer Zurueckblaettern.
    DECL_LINK( ExecFlyMac, void * );

    BOOL    PageCrsr(SwTwips lOffset, BOOL bSelect);

    // Felder Update
    void    UpdateInputFlds( SwInputFieldList* pLst = 0, BOOL bOnlyInSel = FALSE );

    void    NoEdit(BOOL bHideCrsr = TRUE);
    void    Edit();
    BOOL    IsNoEdit() const { return bNoEdit; }

    // Loeschen
    long    DelToEndOfLine();
    long    DelToStartOfLine();
    long    DelLine();
    long    DelLeft();

    // loescht auch Rahmen bzw. setzt den Cursor in den Rahmen,
    // wenn bDelFrm == FALSE ist
    long    DelRight( BOOL bDelFrm = FALSE );
    long    DelToEndOfPara();
    long    DelToStartOfPara();
    long    DelToEndOfSentence();
    long    DelToStartOfSentence();
    long    DelNxtWord();
    long    DelPrvWord();

    // Prueft, ob eine Wortselektion vorliegt.
    // Gemaess den Regeln fuer intelligentes Cut / Paste
    // werden umgebende Spaces rausgeschnitten.
    // Liefert Art der Wortselektion zurueck (siehe enum)
    enum {
            NO_WORD = 0,
            WORD_SPACE_BEFORE = 1,
            WORD_SPACE_AFTER = 2,
            WORD_NO_SPACE = 3
        };
    int     IntelligentCut(int nSelectionType, BOOL bCut = TRUE);

    // Editieren
    void    Insert(SwField &);
    void    Insert(const String &);
    void    InsertByWord( const String & );
    void    InsertPageBreak(const String *pPageDesc = 0, USHORT nPgNum = 0 );
    void    InsertLineBreak();
    void    InsertColumnBreak();
    void    InsertFootnote(const String &, BOOL bEndNote = FALSE, BOOL bEdit = TRUE );
    void    SplitNode( BOOL bAutoFormat = FALSE, BOOL bCheckTableStart = TRUE );
    BOOL    CanInsert();

    // Verzeichnisse
    void    InsertTableOf(const SwTOXBase& rTOX, const SfxItemSet* pSet = 0);
    BOOL    UpdateTableOf(const SwTOXBase& rTOX, const SfxItemSet* pSet = 0);

    // Numerierung und Bullets
    void    NumOn();
    void    BulletOn();

    // Graphic
    void    Insert( const String &rPath, const String &rFilter,
                    const Graphic &, SwFlyFrmAttrMgr * = 0,
                    BOOL bRule = FALSE );
    //OLE
    void    Insert      ( SvInPlaceObjectRef *pObj,     // != 0 fuer Clipboard
                          SvGlobalName *pName = 0,      // != 0 entspr. Object erzeugen.
                          BOOL bActivate = TRUE,
                          USHORT nSlotId = 0);          // SlotId fuer Dialog
    BOOL    InsertOle   ( SvInPlaceObjectRef aRef  );   // In die Core einfuegen.
    void    LaunchOLEObj( long nVerb = 0 );             // Server starten
    BOOL    FinishOLEObj();                             // Server wird beendet
    BOOL    IsOLEObj() const { return GetCntType() == CNT_OLE;}
    virtual void CalcAndSetScale( SvEmbeddedObjectRef xObj,
                                  const SwRect *pFlyPrtRect = 0,
                                  const SwRect *pFlyFrmRect = 0 );
    virtual void ConnectObj( SvInPlaceObjectRef xIPObj, const SwRect &rPrt,
                             const SwRect &rFrm );
    DECL_LINK( ChartSelectionHdl, ChartSelectionInfo * );

    // Vorlagen und Formate

    // enum gibt an, was geschehen soll, wenn das Style nicht gefunden wurde
    enum GetStyle { GETSTYLE_NOCREATE,          // keins anlegen
                    GETSTYLE_CREATESOME,        // falls auf PoolId mapt anlegen
                    GETSTYLE_CREATEANY };       // ggfs Standard returnen

    SwTxtFmtColl*   GetParaStyle(const String &rCollName,
                                    GetStyle eCreate = GETSTYLE_NOCREATE);
    SwCharFmt*      GetCharStyle(const String &rFmtName,
                                    GetStyle eCreate = GETSTYLE_NOCREATE);
    SwFrmFmt*       GetTblStyle(const String &rFmtName);

    void    SetPageStyle(const String &rCollName);

    String  GetCurPageStyle( const BOOL bCalcFrm = TRUE ) const;

    // Aktuelle Vorlage anhand der geltenden Attribute aendern
    void    QuickUpdateStyle();

    enum DoType { UNDO, REDO, REPEAT };

    void    Do( DoType eDoType );
    String  GetDoString( DoType eDoType ) const;
    String  GetRepeatString() const;

    //Suchen oder Ersetzen
    ULONG SearchPattern(const SearchParam& rParam,
                         SwDocPositions eStart, SwDocPositions eEnde,
                         FindRanges eFlags = FND_IN_BODY,
                         int bReplace = FALSE );

    ULONG SearchTempl  (const String &rTempl,
                         SwDocPositions eStart, SwDocPositions eEnde,
                         FindRanges eFlags = FND_IN_BODY,
                         const String* pReplTempl = 0 );

    ULONG SearchAttr   (const SfxItemSet& rFindSet,
                         BOOL bNoColls,
                         SwDocPositions eStart,SwDocPositions eEnde,
                         FindRanges eFlags = FND_IN_BODY,
                         const SearchParam* pParam = 0,
                         const SfxItemSet* pReplaceSet = 0);

    void AutoCorrect( SvxAutoCorrect& rACorr, sal_Unicode cChar = ' ' );

    // Aktion vor Cursorbewegung
    // Hebt gfs. Selektionen auf, triggert Timer und GCAttr()
    void    MoveCrsr( FASTBOOL bWithSelect = FALSE );

    // Eingabefelder updaten
    BOOL    StartInputFldDlg(SwField*, BOOL bNextButton);

    //"Handler" fuer Anederungen an der DrawView - fuer Controls.
    virtual void DrawSelChanged( SdrView * );

    // springe zum Bookmark und setze die "Selections-Flags" wieder richtig
    FASTBOOL GotoBookmark( USHORT nPos );
    FASTBOOL GotoBookmark( USHORT nPos, BOOL bSelect, BOOL bStart );
    FASTBOOL GotoBookmark( const String& rName );
    FASTBOOL GoNextBookmark(); // TRUE, wenn's noch eine gab
    FASTBOOL GoPrevBookmark();

    // Zugehoerige SwView ermitteln
    const SwView&       GetView() const { return rView; }
    SwView&             GetView() { return rView; }

    //Weil es sonst keiner macht, gibt es hier eine ExecMacro()
    void ExecMacro( const SvxMacro& rMacro, String* pRet = 0, SbxArray* pArgs = 0 );
    // rufe ins dunkle Basic/JavaScript
    USHORT CallEvent( USHORT nEvent, const SwCallMouseEvent& rCallEvent,
                        BOOL bCheckPtr = FALSE, SbxArray* pArgs = 0,
                        const Link* pCallBack = 0 );

    void    StartBasicAction();
    void    EndBasicAction();
    void    SetBasicActionCount(USHORT nSet);
    USHORT  EndAllBasicActions();

    // ein Klick aus das angegebene Feld. Der Cursor steht auf diesem.
    // Fuehre die vor definierten Aktionen aus.
    void ClickToField( const SwField& rFld, USHORT nFilter = URLLOAD_NOFILTER );
    void ClickToINetAttr( const SwFmtINetFmt& rItem, USHORT nFilter = URLLOAD_NOFILTER );
    BOOL ClickToINetGrf( const Point& rDocPt, USHORT nFilter = URLLOAD_NOFILTER );
    inline BOOL IsInClickToEdit() const ;

    // fall ein URL-Button selektiert ist, dessen URL returnen, ansonsten
    // einen LeerString
    BOOL GetURLFromButton( String& rURL, String& rDescr ) const;
    BOOL SetURLToButton( const String& rURL, const String& rDescr );

    void NavigatorPaste( const NaviContentBookmark& rBkmk, const DropEvent* pEvt );

    // die Core erzeugt eine Selektion, das SttSelect muss gerufen werden
    virtual void NewCoreSelection();

    // autom. Update von Vorlagen
    void AutoUpdateFrame(SwFrmFmt* pFmt, const SfxItemSet& rStyleSet);
    void AutoUpdatePara(SwTxtFmtColl* pColl, const SfxItemSet& rStyleSet);

    // Link fuers einfuegen von Bereichen uebers Drag&Drop/Clipboard
    DECL_STATIC_LINK( SwWrtShell, InsertRegionDialog, SwSection* );


    //ctoren, der erstere ist eine Art kontrollierter copy ctor fuer weitere
    //Sichten auf ein Dokument
    SwWrtShell( SwWrtShell *, Window *pWin, SwView &rShell);
    SwWrtShell( SwDoc *pDoc,
                ::com::sun::star::uno::Reference<
                    ::com::sun::star::linguistic::XSpellChecker1 >&,
                ::com::sun::star::uno::Reference<
                    ::com::sun::star::linguistic::XHyphenator >&,
                Window *pWin, SwView &rShell,
                SwRootFrm* pMaster = 0, const SwViewOption *pViewOpt = 0);
    ~SwWrtShell();

private:

    void    OpenMark();
    void    CloseMark( BOOL bOkFlag );

    String  GetWrdDelim();
    String  GetSDelim();
    String  GetBothDelim();

    struct ModeStack
    {
        ModeStack   *pNext;
        BOOL        bAdd,
                    bExt,
                    bIns;
        ModeStack(ModeStack *pNextMode, BOOL _bIns, BOOL _bExt, BOOL _bAdd):
            pNext(pNextMode),
            bIns(_bIns),
            bExt(_bExt),
            bAdd(_bAdd) {}
    } *pModeStack;

    // Cursor bei PageUp / -Down mitnehmen
    enum PageMove
    {
        MV_NO,
        MV_PAGE_UP,
        MV_PAGE_DOWN
    }  ePageMove;

    struct CrsrStack
    {
        Point aDocPos;
        CrsrStack *pNext;
        BOOL bValidCurPos : 1;
        BOOL bIsFrmSel : 1;
        SwTwips lOffset;

        CrsrStack( BOOL bValid, BOOL bFrmSel, const Point &rDocPos,
                    SwTwips lOff, CrsrStack *pN )
            : aDocPos(rDocPos), lOffset(lOff), pNext(pN)
        {
            bValidCurPos = bValid;
            bIsFrmSel = bFrmSel;
        }

    } *pCrsrStack;

    SwView  &rView;

    Point   aDest;
    BOOL    bDestOnStack;
    BOOL    HasCrsrStack() const { return 0 != pCrsrStack; }
    BOOL    PushCrsr(SwTwips lOffset, BOOL bSelect);
    BOOL    PopCrsr(BOOL bUpdate, BOOL bSelect = FALSE);

    // ENDE Cursor bei PageUp / -Down mitnehmen
    FASTBOOL _SttWrd();
    FASTBOOL _EndWrd();
    FASTBOOL _NxtWrd();
    FASTBOOL _PrvWrd();
    FASTBOOL _FwdSentence();
    FASTBOOL _BwdSentence();
    FASTBOOL _FwdPara();
    FASTBOOL _BwdPara();

        //  Selektionen
    BOOL    bIns            :1;
    BOOL    bInSelect       :1;
    BOOL    bExtMode        :1;
    BOOL    bAddMode        :1;
    BOOL    bLayoutMode     :1;
    BOOL    bNoEdit         :1;
    BOOL    bCopy           :1;
    BOOL    bSelWrd         :1;
    BOOL    bSelLn          :1;
    BOOL    bIsInClickToEdit:1;
    BOOL    bClearMark      :1;     // Selektion fuer ChartAutoPilot nicht loeschen

    Point   aStart;
    Link    aSelTblLink;

    SELECTFUNC  fnLeaveSelect;

    //setzt den Cursorstack nach dem Bewegen mit PageUp/-Down zurueck.
    void    _ResetCursorStack();

    void    SttDragDrop(Timer *);
    long    SetCrsr(const Point *, BOOL bProp=FALSE );
    long    SetCrsrKillSel(const Point *, BOOL bProp=FALSE );

    long    StdSelect(const Point *, BOOL bProp=FALSE );
    long    BeginDrag(const Point *, BOOL bProp=FALSE );
    long    Drag(const Point *, BOOL bProp=FALSE );
    long    EndDrag(const Point *, BOOL bProp=FALSE );

    long    ExtSelWrd(const Point *, BOOL bProp=FALSE );
    long    ExtSelLn(const Point *, BOOL bProp=FALSE );

    //Verschieben von Text aus Drag and Drop; Point ist
    //Destination fuer alle Selektionen.
    long    MoveText(const Point *, BOOL bProp=FALSE );

    long    BeginFrmDrag(const Point *, BOOL bProp=FALSE );

    //nach SSize/Move eines Frames Update; Point ist Destination.
    long    UpdateLayoutFrm(const Point *, BOOL bProp=FALSE );

    long    SttLeaveSelect(const Point *, BOOL bProp=FALSE );
    long    AddLeaveSelect(const Point *, BOOL bProp=FALSE );
    long    Ignore(const Point *, BOOL bProp=FALSE );

    void    LeaveExtSel() { bSelWrd = bSelLn = FALSE;}
    BOOL    _CanInsert();

    BOOL    GoStart(BOOL KeepArea = FALSE, BOOL * = 0,
            BOOL bSelect = FALSE, BOOL bDontMoveRegion = FALSE);
    BOOL    GoEnd(BOOL KeepArea = FALSE, BOOL * = 0);

    enum BookMarkMove
    {
        BOOKMARK_INDEX,
        BOOKMARK_NEXT,
        BOOKMARK_PREV,
        BOOKMARK_LAST_LAST_ENTRY
    };

    FASTBOOL MoveBookMark(  BookMarkMove eFuncId,
                            USHORT nPos = 0,
                            BOOL bStart = TRUE );
};

inline void SwWrtShell::ResetCursorStack()
{
    if ( HasCrsrStack() )
        _ResetCursorStack();
}

inline void SwWrtShell::SelTblCells(const Link &rLink, BOOL bMark )
{
    SetSelTblCells( TRUE );
    bClearMark = bMark;
    aSelTblLink = rLink;
}
inline void SwWrtShell::EndSelTblCells()
{
    SetSelTblCells( FALSE );
    bClearMark = TRUE;
}

inline BOOL SwWrtShell::IsInClickToEdit() const { return bIsInClickToEdit; }

inline BOOL SwWrtShell::Is_FnDragEQBeginDrag() const
{
#ifdef GCC
    SELECTFUNC  fnTmp = &SwWrtShell::BeginDrag;
    return fnDrag == fnTmp;
#else
    return fnDrag == &SwWrtShell::BeginDrag;
#endif
}

#endif
diff --git a/sw/source/ui/inc/wtabsh.hxx b/sw/source/ui/inc/wtabsh.hxx
new file mode 100644
index 0000000..8fda4ba
--- /dev/null
+++ b/sw/source/ui/inc/wtabsh.hxx
@@ -0,0 +1,76 @@
/*************************************************************************
 *
 *  $RCSfile: wtabsh.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:43 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWWTABSH_HXX
#define _SWWTABSH_HXX

#include "tabsh.hxx"

class SwWebTableShell: public SwTableShell
{
public:
    SFX_DECL_INTERFACE(SW_WEBTABSHELL);
    TYPEINFO();

    virtual     ~SwWebTableShell();
                SwWebTableShell(SwView &rView);
};

#endif
diff --git a/sw/source/ui/inc/wtextsh.hxx b/sw/source/ui/inc/wtextsh.hxx
new file mode 100644
index 0000000..71c82eb
--- /dev/null
+++ b/sw/source/ui/inc/wtextsh.hxx
@@ -0,0 +1,82 @@
/*************************************************************************
 *
 *  $RCSfile: wtextsh.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:43 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _SWWTEXTSH_HXX
#define _SWWTEXTSH_HXX

#include "textsh.hxx"


class SwWebTextShell: public SwTextShell
{

public:
    SFX_DECL_INTERFACE(SW_WEBTEXTSHELL);
    TYPEINFO();

             SwWebTextShell(SwView &rView);
    virtual ~SwWebTextShell();
};

#endif



diff --git a/sw/source/ui/inc/wview.hxx b/sw/source/ui/inc/wview.hxx
new file mode 100644
index 0000000..56c2a1e
--- /dev/null
+++ b/sw/source/ui/inc/wview.hxx
@@ -0,0 +1,85 @@
/*************************************************************************
 *
 *  $RCSfile: wview.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:43 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWWVIEW_HXX
#define _SWWVIEW_HXX

#include "view.hxx"


/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

class SwWebView: public SwView
{
protected:
    virtual void    SelectShell();
public:

    SFX_DECL_VIEWFACTORY(SwWebView);
    SFX_DECL_INTERFACE(SW_WEBVIEWSHELL);
    TYPEINFO();

    SwWebView(SfxViewFrame* pFrame, SfxViewShell*);
    ~SwWebView();
};

#endif
diff --git a/sw/source/ui/inc/zoomctrl.hxx b/sw/source/ui/inc/zoomctrl.hxx
new file mode 100644
index 0000000..422baa8
--- /dev/null
+++ b/sw/source/ui/inc/zoomctrl.hxx
@@ -0,0 +1,88 @@
/*************************************************************************
 *
 *  $RCSfile: zoomctrl.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:43 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _ZOOMCTRL_HXX
#define _ZOOMCTRL_HXX

#ifndef _SVX_ZOOMCTRL_HXX //autogen
#include <svx/zoomctrl.hxx>
#endif

class SwZoomControl : public SvxZoomStatusBarControl
{
private:
    String  sPreviewZoom;
public:
    virtual void    Command( const CommandEvent& rCEvt );
    virtual void    StateChanged( USHORT nSID, SfxItemState eState,
                                  const SfxPoolItem* pState );
    virtual void    Paint( const UserDrawEvent& rEvt );

    SFX_DECL_STATUSBAR_CONTROL();

    SwZoomControl( USHORT nId, StatusBar& rStb, SfxBindings& rBind );
    ~SwZoomControl();

};


#endif


diff --git a/sw/source/ui/index/cnttab.cxx b/sw/source/ui/index/cnttab.cxx
new file mode 100644
index 0000000..f5d3074
--- /dev/null
+++ b/sw/source/ui/index/cnttab.cxx
@@ -0,0 +1,4853 @@
/*************************************************************************
 *
 *  $RCSfile: cnttab.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:43 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include <rsc/rscsfx.hxx>

#ifndef _SV_MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SV_HELP_HXX
#include <vcl/help.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef SVTOOLS_URIHELPER_HXX
#include <svtools/urihelper.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SFXVIEWFRM_HXX //autogen
#include <sfx2/viewfrm.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SFX_INIMGR_HXX
#include <sfx2/inimgr.hxx>
#endif
#ifndef _IODLG_HXX
#include <sfx2/iodlg.hxx>
#endif
#ifndef _SVX_BACKGRND_HXX //autogen
#include <svx/backgrnd.hxx>
#endif
#ifndef _SVX_SIMPTABL_HXX //autogen wg. SvxSimpleTable
#include <svx/simptabl.hxx>
#endif
#ifndef _COM_SUN_STAR_TEXT_XDOCUMENTINDEXESSUPPLIER_HPP_
#include <com/sun/star/text/XDocumentIndexesSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XDOCUMENTINDEX_HPP_
#include <com/sun/star/text/XDocumentIndex.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXTSECTIONSSUPPLIER_HPP_
#include <com/sun/star/text/XTextSectionsSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_STYLE_BREAKTYPE_HPP_
#include <com/sun/star/style/BreakType.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXTFIELDSSUPPLIER_HPP_
#include <com/sun/star/text/XTextFieldsSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XDEPENDENTTEXTFIELD_HPP_
#include <com/sun/star/text/XDependentTextField.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XPARAGRAPHCURSOR_HPP_
#include <com/sun/star/text/XParagraphCursor.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XDOCUMENTINDEX_HPP_
#include <com/sun/star/text/XDocumentIndex.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_CHAPTERFORMAT_HPP_
#include <com/sun/star/text/ChapterFormat.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXTSECTION_HPP_
#include <com/sun/star/text/XTextSection.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_CONTROLCHARACTER_HPP_
#include <com/sun/star/text/ControlCharacter.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_PROPERTYVALUES_HPP_
#include <com/sun/star/beans/PropertyValues.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_TEXTCONTENTANCHORTYPE_HPP_
#include <com/sun/star/text/TextContentAnchorType.hpp>
#endif
#ifndef _COM_SUN_STAR_UCB_XCOMMANDENVIRONMENT_HPP_
#include <com/sun/star/ucb/XCommandEnvironment.hpp>
#endif
#ifndef _UCBHELPER_CONTENT_HXX
#include <ucbhelper/content.hxx>
#endif

#ifndef _COLUMN_HXX //autogen
#include <column.hxx>
#endif
#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _SHELLIO_HXX
#include <shellio.hxx>
#endif
#ifndef _AUTHFLD_HXX
#include <authfld.hxx>
#endif
#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _BASESH_HXX
#include <basesh.hxx>
#endif
#ifndef _OUTLINE_HXX
#include <outline.hxx>
#endif
#ifndef _CNTTAB_HXX
#include <cnttab.hxx>
#endif
#ifndef _FORMEDT_HXX
#include <formedt.hxx>
#endif
#ifndef _TOXMGR_HXX
#include <toxmgr.hxx>
#endif
#ifndef _POOLFMT_HXX
#include <poolfmt.hxx>
#endif
#ifndef _UITOOL_HXX
#include <uitool.hxx>
#endif
#ifndef _UIITEMS_HXX //autogen
#include <uiitems.hxx>
#endif
#ifndef _FMTCOL_HXX //autogen
#include <fmtcol.hxx>
#endif
#ifndef _FLDBAS_HXX //autogen wg. SwFieldType
#include <fldbas.hxx>
#endif
#ifndef _EXPFLD_HXX //autogen wg. SwSetExpFieldType
#include <expfld.hxx>
#endif
#ifndef _UNOPRNMS_HXX
#include <unoprnms.hxx>
#endif
#ifndef _UNOTOOLS_HXX
#include <unotools.hxx>
#endif
#ifndef _UNOTXDOC_HXX
#include <unotxdoc.hxx>
#endif
#ifndef _SWDOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _MODOPT_HXX
#include <modcfg.hxx>
#endif

#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _HELPID_H
#include <helpid.h>
#endif
#ifndef _UTLUI_HRC
#include <utlui.hrc>
#endif
#ifndef _INDEX_HRC
#include <index.hrc>
#endif
#ifndef _CNTTAB_HRC
#include <cnttab.hrc>
#endif
#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif



using namespace ::com::sun::star;
using namespace ::com::sun::star::text;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::container;
using namespace ::com::sun::star::ucb;
using namespace ::rtl;

#define C2S(cChar) UniString::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM(cChar))
#define C2U(cChar) OUString::createFromAscii(cChar)

#ifndef _SVX_DBBROWSE_HXX
#include <svx/dbbrowse.hxx>
#endif

static const sal_Unicode aDeliStart = '['; //fuer die form
static const sal_Unicode aDeliEnd    = ']'; //fuer die form

#define POS_GRF     0
#define POS_OLE     1
#define POS_TABLE   2
#define POS_FRAME   3

#define IDX_FILE_EXTENSION String::CreateFromAscii( \
                            RTL_CONSTASCII_STRINGPARAM( "*.sdi" ))
#define INDEX_SECTION_NAME String::CreateFromAscii( \
                            RTL_CONSTASCII_STRINGPARAM( "IndexSection_" ))

#define TOX_PAGE_SELECT 1
#define TOX_PAGE_ENTRY  2
#define TOX_PAGE_STYLES 3

//-----------------------------------------------------------------------------
struct SwIndexSections_Impl
{
    uno::Reference< text::XTextSection >    xContainerSection;
    uno::Reference< text::XDocumentIndex >    xDocumentIndex;
};

/* -----------------14.06.99 13:10-------------------

 --------------------------------------------------*/
String lcl_CreateAutoMarkFileDlg( Window* pParent, const String& rURL,
                                const String& rFileString, sal_Bool bOpen )
{
    String sRet;
    SfxFileDialog* pFileDlg = new SfxFileDialog( pParent,
                                    bOpen ? WB_OPEN | WB_3DLOOK
                                           : WB_SAVEAS | WB_3DLOOK );
    pFileDlg->DisableSaveLastDirectory();
    pFileDlg->SetHelpId(HID_FILEDLG_SRCVIEW);
    {
        String sCurFltr( IDX_FILE_EXTENSION );
        pFileDlg->AddFilter( rFileString, sCurFltr );
        pFileDlg->SetCurFilter( sCurFltr );
    }

    String& rLastSaveDir = (String&)SFX_APP()->GetLastSaveDirectory();
    String sSaveDir = rLastSaveDir;

    if( rURL.Len() )
        pFileDlg->SetPath( rURL );
    else
        pFileDlg->SetPath( SFX_INIMANAGER()->Get(SFX_KEY_USERCONFIG_PATH) );

    if( RET_OK == pFileDlg->Execute())
        sRet = pFileDlg->GetPath();

    delete pFileDlg;
    rLastSaveDir = sSaveDir;

    return sRet;
}
/* -----------------------------19.01.00 11:09--------------------------------

 ---------------------------------------------------------------------------*/
struct AutoMarkEntry
{
    String sSearch;
    String sAlternative;
    String sPrimKey;
    String sSecKey;
    String sComment;
    sal_Bool    bCase;
    sal_Bool    bWord;

    AutoMarkEntry() :
        bCase(sal_False),
        bWord(sal_False){}
};
typedef AutoMarkEntry* AutoMarkEntryPtr;
SV_DECL_PTRARR_DEL(AutoMarkEntryArr, AutoMarkEntryPtr, 0, 4);
SV_IMPL_PTRARR(AutoMarkEntryArr, AutoMarkEntryPtr);

class SwEntryBrowseBox : public DbBrowseBox
{
    Edit            aCellEdit;
    DbCheckBoxCtrl  aCellCheckBox;

    String  sSearch;
    String  sAlternative;
    String  sPrimKey;
    String  sSecKey;
    String  sComment;
    String  sCaseSensitive;
    String  sWordOnly;
    String  sYes;
    String  sNo;

    AutoMarkEntryArr    aEntryArr;

    DbCellControllerRef xController;
    DbCellControllerRef xCheckController;

    long    nCurrentRow;
    sal_Bool    bModified;

    const String& GetCellText( long nRow, long nColumn ) const;
    void                        SetModified() {bModified = sal_True;}

protected:
    virtual sal_Bool                SeekRow( long nRow );
//  virtual void                PaintField( OutputDevice& rDev, const awt::Rectangle& rRect,
//                                          sal_uInt16 nColumnId ) const;
    virtual void                PaintCell(OutputDevice& rDev, const Rectangle& rRect, sal_uInt16 nColId) const;
    virtual void                InitController(DbCellControllerRef& rController, long nRow, sal_uInt16 nCol);
    virtual DbCellController*   GetController(long nRow, sal_uInt16 nCol);
    virtual sal_Bool                SaveModified();

public:
                    SwEntryBrowseBox(Window* pParent, const ResId& rId,
                               BrowserMode nMode = 0 );
    void    ReadEntries(SvStream& rInStr);
    void    WriteEntries(SvStream& rOutStr);

    sal_Bool                        IsModified()const;
};

class SwAutoMarkDlg_Impl : public ModalDialog
{
    OKButton            aOKPB;
    CancelButton        aCancelPB;
    HelpButton          aHelpPB;

    SwEntryBrowseBox    aEntriesBB;
    GroupBox            aEntriesGB;

    String              sAutoMarkURL;
    const String        sAutoMarkType;

    sal_Bool                bCreateMode;

    DECL_LINK(OkHdl, OKButton*);
public:
    SwAutoMarkDlg_Impl(Window* pParent, const String& rAutoMarkURL,
                        const String& rAutoMarkType, sal_Bool bCreate);
    ~SwAutoMarkDlg_Impl();

};
/* -----------------04.11.99 11:02-------------------

 --------------------------------------------------*/
sal_uInt16 CurTOXType::GetFlatIndex() const
{
    sal_uInt16 nRet = eType;
    if(eType == TOX_USER && nIndex)
    {
        nRet = TOX_AUTHORITIES + nIndex;
    }
    return nRet;
}
/* -----------------29.11.99 09:04-------------------

 --------------------------------------------------*/
#if 0
IdxExampleResource::IdxExampleResource(const ResId& rResId) :
    Resource(rResId),
    aTextArray(ResId(ARR_TEXT))
{
    FreeResource();
}
#endif
/*************************************************************************

*************************************************************************/
#define EDIT_MINWIDTH 15

/* -----------------14.06.99 12:12-------------------

 --------------------------------------------------*/
SwMultiTOXTabDialog::SwMultiTOXTabDialog(Window* pParent, const SfxItemSet& rSet,
                    SwWrtShell &rShell,
                    const SwTOXBase* pCurTOX,
                    sal_uInt16 nToxType, sal_Bool bGlobal) :
        SfxTabDialog(   pParent, SW_RES(DLG_MULTI_TOX), &rSet),
        aExampleContainerWIN(this, ResId(WIN_EXAMPLE)),
        aExampleWIN( &aExampleContainerWIN, 0 ),
        aShowExampleCB( this, ResId(CB_SHOWEXAMPLE)),
        sUserDefinedIndex(ResId(ST_USERDEFINEDINDEX)),
        pMgr( new SwTOXMgr( &rShell ) ),
        rSh(rShell),
        nInitialTOXType(nToxType),
        bEditTOX(sal_False),
        pExampleFrame(0),
        bExampleCreated(sal_False),
        bGlobalFlag(bGlobal)
{
    FreeResource();
    aExampleWIN.SetPosSizePixel(aExampleContainerWIN.GetPosPixel(),
                                aExampleContainerWIN.GetSizePixel());
    eCurrentTOXType.eType = TOX_CONTENT;
    eCurrentTOXType.nIndex = 0;

    sal_uInt16 nUserTypeCount = rSh.GetTOXTypeCount(TOX_USER);
    nTypeCount = nUserTypeCount + 6;
    pFormArr = new SwForm*[nTypeCount];
    pDescArr = new SwTOXDescription*[nTypeCount];
    pxIndexSectionsArr = new SwIndexSections_Impl*[nTypeCount];
    //the standard user index is on position TOX_USER
    //all user user indexes follow after position TOX_AUTHORITIES
    if(pCurTOX)
    {
        bEditTOX = sal_True;
    }
    for(int i = nTypeCount - 1; i > -1; i--)
    {
        pFormArr[i] = 0;
        pDescArr[i] = 0;
        pxIndexSectionsArr[i] = new SwIndexSections_Impl;
        if(pCurTOX)
        {
            eCurrentTOXType.eType = pCurTOX->GetType();
            sal_uInt16 nArrayIndex = eCurrentTOXType.eType;
            if(eCurrentTOXType.eType == TOX_USER)
            {
                //which user type is it?
                for(sal_uInt16 nUser = 0; nUser < nUserTypeCount; nUser++)
                {
                    const SwTOXType* pTemp = rSh.GetTOXType(TOX_USER, nUser);
                    if(pCurTOX->GetTOXType() == pTemp)
                    {
                        eCurrentTOXType.nIndex = nUser;
                        nArrayIndex = nUser > 0 ? TOX_AUTHORITIES + nUser : TOX_USER;
                        break;
                    }
                }
            }
            pFormArr[nArrayIndex] = new SwForm(pCurTOX->GetTOXForm());
            pDescArr[nArrayIndex] = CreateTOXDescFromTOXBase(pCurTOX);
            if(TOX_AUTHORITIES == eCurrentTOXType.eType)
            {
                const SwAuthorityFieldType* pFType = (const SwAuthorityFieldType*)
                                                rSh.GetFldType(RES_AUTHORITY, aEmptyStr);
                if(pFType)
                {
                    String sBrackets(pFType->GetPrefix());
                    sBrackets += pFType->GetSuffix();
                    pDescArr[nArrayIndex]->SetAuthBrackets(sBrackets);
                    pDescArr[nArrayIndex]->SetAuthSequence(pFType->IsSequence());
                }
                else
                {
                    pDescArr[nArrayIndex]->SetAuthBrackets(C2S("[]"));
                }
            }
        }
    }

    AddTabPage(TP_TOX_SELECT, SwTOXSelectTabPage::Create, 0);
    AddTabPage(TP_TOX_STYLES, SwTOXStylesTabPage::Create, 0);
    AddTabPage(TP_COLUMN,   SwColumnPage::Create,    0);
    AddTabPage(TP_BACKGROUND,SvxBackgroundTabPage::Create,  0);
    AddTabPage(TP_TOX_ENTRY, SwTOXEntryTabPage::Create,     0);
    if(!pCurTOX)
        SetCurPageId(TP_TOX_SELECT);

    aShowExampleCB.SetClickHdl(LINK(this, SwMultiTOXTabDialog, ShowPreviewHdl));

    aShowExampleCB.Check( SW_MOD()->GetModuleConfig()->IsShowIndexPreview());
    SetViewAlign( WINDOWALIGN_LEFT );
    // SetViewWindow does not work if the dialog is visible!
    if(!aShowExampleCB.IsChecked())
    {
        SetViewWindow( &aExampleContainerWIN );
    }
    Point aOldPos = GetPosPixel();
    ShowPreviewHdl(0);
     Point aNewPos = GetPosPixel();
    //72040: initial position may be left of the view - that has to be corrected
    if(aNewPos.X() < 0)
        SetPosPixel(aOldPos);
}
/*-- 14.06.99 13:11:40---------------------------------------------------

  -----------------------------------------------------------------------*/
SwMultiTOXTabDialog::~SwMultiTOXTabDialog()
{
    SW_MOD()->GetModuleConfig()->SetShowIndexPreview(aShowExampleCB.IsChecked());

    for(sal_uInt16 i = 0; i < nTypeCount; i++)
    {
        delete pFormArr[i];
        delete pDescArr[i];
        delete pxIndexSectionsArr[i];
    }
    delete pxIndexSectionsArr;

    delete pFormArr;
    delete pDescArr;
    delete pMgr;
    delete pExampleFrame;
}
/*-- 14.06.99 13:11:40---------------------------------------------------

  -----------------------------------------------------------------------*/
void    SwMultiTOXTabDialog::PageCreated( sal_uInt16 nId, SfxTabPage &rPage )
{
    if( TP_BACKGROUND == nId  )

        ((SvxBackgroundTabPage&)rPage).ShowSelector();
    else if(TP_COLUMN == nId )
    {
        const SwFmtFrmSize& rSize = (const SwFmtFrmSize&)GetInputSetImpl()->Get(RES_FRM_SIZE);

        ((SwColumnPage&)rPage).SetPageWidth(rSize.GetWidth());
    }
    else if(TP_TOX_ENTRY == nId)
        ((SwTOXEntryTabPage&)rPage).SetWrtShell(rSh);
    if(TP_TOX_SELECT == nId)
    {
        ((SwTOXSelectTabPage&)rPage).SetWrtShell(rSh);
        if(USHRT_MAX != nInitialTOXType)
            ((SwTOXSelectTabPage&)rPage).SelectType((TOXTypes)nInitialTOXType);
    }
}
/*-- 14.06.99 13:11:40---------------------------------------------------

  -----------------------------------------------------------------------*/
short   SwMultiTOXTabDialog::Ok()
{
    short nRet = SfxTabDialog::Ok();
    SwTOXDescription& rDesc = GetTOXDescription(eCurrentTOXType);
    SwTOXBase aNewDef(*rSh.GetDefaultTOXBase( eCurrentTOXType.eType, sal_True ));

    sal_uInt16 nIndex = eCurrentTOXType.eType;
    if(eCurrentTOXType.eType == TOX_USER && eCurrentTOXType.nIndex)
    {
        nIndex = TOX_AUTHORITIES + eCurrentTOXType.nIndex;
    }

    if(pFormArr[nIndex])
    {
        rDesc.SetForm(*pFormArr[nIndex]);
        aNewDef.SetTOXForm(*pFormArr[nIndex]);
    }
    rDesc.ApplyTo(aNewDef);
    if(!bGlobalFlag)
        pMgr->UpdateOrInsertTOX(
                rDesc, 0, GetOutputItemSet());

    if(!eCurrentTOXType.nIndex)
        rSh.SetDefaultTOXBase(aNewDef);

    return nRet;
}
/* -----------------16.06.99 11:59-------------------

 --------------------------------------------------*/
SwForm* SwMultiTOXTabDialog::GetForm(CurTOXType eType)
{
    sal_uInt16 nIndex = eType.GetFlatIndex();
    if(!pFormArr[nIndex])
        pFormArr[nIndex] = new SwForm(eType.eType);
    return pFormArr[nIndex];
}
/* -----------------09.09.99 11:29-------------------

 --------------------------------------------------*/
SwTOXDescription&   SwMultiTOXTabDialog::GetTOXDescription(CurTOXType eType)
{
    sal_uInt16 nIndex = eType.GetFlatIndex();
    if(!pDescArr[nIndex])
    {
        const SwTOXBase* pDef = rSh.GetDefaultTOXBase( eType.eType );
        if(pDef)
            pDescArr[nIndex] = CreateTOXDescFromTOXBase(pDef);
        else
        {
            pDescArr[nIndex] = new SwTOXDescription(eType.eType);
            if(eType.eType == TOX_USER)
                pDescArr[nIndex]->SetTitle(sUserDefinedIndex);
            else
                pDescArr[nIndex]->SetTitle(
                    rSh.GetTOXType(eType.eType, 0)->GetTypeName());
        }
        if(TOX_AUTHORITIES == eType.eType)
        {
            const SwAuthorityFieldType* pFType = (const SwAuthorityFieldType*)
                                            rSh.GetFldType(RES_AUTHORITY, aEmptyStr);
            if(pFType)
            {
                String sBrackets(pFType->GetPrefix());
                sBrackets += pFType->GetSuffix();
                pDescArr[nIndex]->SetAuthBrackets(sBrackets);
                pDescArr[nIndex]->SetAuthSequence(pFType->IsSequence());
            }
            else
            {
                pDescArr[nIndex]->SetAuthBrackets(C2S("[]"));
            }
        }
    }
    return *pDescArr[nIndex];
}
/* -----------------09.09.99 11:36-------------------

 --------------------------------------------------*/
SwTOXDescription* SwMultiTOXTabDialog::CreateTOXDescFromTOXBase(
            const SwTOXBase*pCurTOX)
{
    SwTOXDescription * pDesc = new SwTOXDescription(pCurTOX->GetType());
    for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
        pDesc->SetStyleNames(pCurTOX->GetStyleNames(i), i);
    pDesc->SetAutoMarkURL(rSh.GetTOIAutoMarkURL());
    pDesc->SetTitle(pCurTOX->GetTitle());


    pDesc->SetContentOptions(pCurTOX->GetCreateType());
    if(pDesc->GetTOXType() == TOX_INDEX)
        pDesc->SetIndexOptions(pCurTOX->GetOptions());
    pDesc->SetMainEntryCharStyle(pCurTOX->GetMainEntryCharStyle());
    if(pDesc->GetTOXType() != TOX_INDEX)
        pDesc->SetLevel(pCurTOX->GetLevel());
    pDesc->SetCreateFromObjectNames(pCurTOX->IsFromObjectNames());
    pDesc->SetSequenceName(pCurTOX->GetSequenceName());
    pDesc->SetCaptionDisplay(pCurTOX->GetCaptionDisplay());
    pDesc->SetFromChapter(pCurTOX->IsFromChapter());
    pDesc->SetReadonly(pCurTOX->IsProtected());
    pDesc->SetOLEOptions(pCurTOX->GetOLEOptions());
    pDesc->SetLevelFromChapter(pCurTOX->IsLevelFromChapter());
    return pDesc;
}

/* -----------------------------29.12.99 09:53--------------------------------

 ---------------------------------------------------------------------------*/

IMPL_LINK( SwMultiTOXTabDialog, ShowPreviewHdl, CheckBox *, pBox )
{
    if(aShowExampleCB.IsChecked())
    {
        if(!pExampleFrame && !bExampleCreated)
        {
            bExampleCreated = sal_True;
            SfxIniManager* pIniMan = SFX_INIMANAGER();
            const sal_Unicode  cSearch = SFX_SEARCHPATH_DELIMITER;
            const String  sAccess = INET_PATH_TOKEN;

            String sPath(pIniMan->Get(SFX_KEY_TEMPLATE_PATH));
            sal_uInt16 nTokenCount = sPath.GetTokenCount(cSearch);
            sal_uInt16 nToken = 0;
            sal_Bool bExist = sal_False;
            String sFile = sAccess;
            sFile.AppendAscii( RTL_CONSTASCII_STRINGPARAM("internal"));
            sFile += sAccess;
            sFile.AppendAscii( RTL_CONSTASCII_STRINGPARAM("idxexample.sdw"));
            String sURL;
            do
            {
                sURL = sPath.GetToken(nToken, cSearch);
                sURL = URIHelper::SmartRelToAbs(sURL);
                sURL += sFile;
                nToken++;
                try
                {
                    ::ucb::Content aTestContent(
                        sURL,
                        uno::Reference< XCommandEnvironment >());

                    uno::Any aAny = aTestContent.getPropertyValue( OUString::createFromAscii("IsDocument") );
                    bExist = aAny.hasValue() ? *(sal_Bool*)aAny.getValue() : FALSE;
                }
                catch(...)
                {
                    bExist = FALSE;
                }

            }while(!bExist && nToken < nTokenCount);

            if(!bExist)
            {
                String sInfo(SW_RES(STR_FILE_NOT_FOUND));
                sInfo.SearchAndReplaceAscii("%1", sFile);
                sInfo.SearchAndReplaceAscii("%2", sPath);
                InfoBox aInfo(GetParent(), sInfo);
                aInfo.Execute();
            }
            else
            {
                Link aLink(LINK(this, SwMultiTOXTabDialog, CreateExample_Hdl));
                pExampleFrame = new SwOneExampleFrame(
                            aExampleWIN, EX_SHOW_ONLINE_LAYOUT, &aLink, &sURL);

                if(!pExampleFrame->IsServiceAvailable())
                {
                    pExampleFrame->CreateErrorMessage(0);
                }
            }
            aShowExampleCB.Show(pExampleFrame && pExampleFrame->IsServiceAvailable());
        }
    }
    sal_Bool bSetViewWindow = aShowExampleCB.IsChecked()
        && pExampleFrame && pExampleFrame->IsServiceAvailable();
    aExampleContainerWIN.Show(bSetViewWindow);

    SetViewWindow( bSetViewWindow ? &aExampleContainerWIN  : 0);
     Point aPos = GetPosPixel();
     Size aSize = GetSizePixel();
    if(pBox)
        AdjustLayout();
    long nDiffWidth = GetSizePixel().Width() - aSize.Width();
    aPos.X() -= nDiffWidth;
    SetPosPixel(aPos);

    return 0;
}
//-----------------------------------------------------------------------------
IMPL_LINK( SwMultiTOXTabDialog, CreateExample_Hdl, void*, EMPTYARG )
{
    try
    {
         uno::Reference< frame::XModel > & xModel = pExampleFrame->GetModel();
        uno::Reference< lang::XUnoTunnel > xDocTunnel(xModel, uno::UNO_QUERY);
        SwXTextDocument* pDoc = (SwXTextDocument*)xDocTunnel->getSomething(SwXTextDocument::getUnoTunnelId());

        if( pDoc )
            pDoc->GetDocShell()->LoadStyles( *rSh.GetView().GetDocShell() );

         uno::Reference< lang::XMultiServiceFactory >  xFact(
                                             xModel, uno::UNO_QUERY);
         uno::Reference< text::XTextCursor > & xCrsr =
                                             pExampleFrame->GetTextCursor();

         uno::Reference< text::XTextSectionsSupplier >  xSectionSupplier(
                                                 xModel, uno::UNO_QUERY);
         uno::Reference< container::XNameAccess >  xSections =
                                        xSectionSupplier->getTextSections();

        String sSectionName( INDEX_SECTION_NAME );
        for(int i = 0; i < 7; ++i )
        {
            String sTmp( sSectionName ); sTmp += String::CreateFromInt32(i);
            uno::Any aSection = xSections->getByName( sTmp );
            pxIndexSectionsArr[i]->xContainerSection = * (uno::Reference<
                                text::XTextSection > *)aSection.getValue();
         }
         uno::Reference< text::XDocumentIndexesSupplier >  xIdxSupp(xModel, uno::UNO_QUERY);
         uno::Reference< container::XIndexAccess >  xIdxs = xIdxSupp->getDocumentIndexes();
        int n = xIdxs->getCount();
        while(n)
        {
            n--;
            uno::Any aIdx = xIdxs->getByIndex(n);
             uno::Reference< text::XDocumentIndex >  xIdx = * (uno::Reference< text::XDocumentIndex > *)aIdx.getValue();
            xIdx->dispose();
        }
        CreateOrUpdateExample(eCurrentTOXType.eType);
    }
    catch(...)
    {
        DBG_ERROR("::CreateExample() - exception caught")
    }
    return 0;
}
/* -----------------04.11.99 11:28-------------------

 --------------------------------------------------*/
void lcl_SetProp( uno::Reference< XPropertySetInfo > & xInfo,
    uno::Reference< XPropertySet > & xProps,
    const char* rPropName,
    const String& rValue)
{
    OUString uPropName(C2U(rPropName));
    if(xInfo->hasPropertyByName(uPropName))
    {
        uno::Any aValue;
        aValue <<= OUString(rValue);
        xProps->setPropertyValue(uPropName, aValue);
    }
}
void lcl_SetProp( uno::Reference< XPropertySetInfo > & xInfo,
    uno::Reference< beans::XPropertySet > & xProps,
    const char* rPropName, sal_Int16 nValue)
{
    OUString uPropName(C2U(rPropName));
    if(xInfo->hasPropertyByName(uPropName))
    {
        uno::Any aValue;
        aValue <<= nValue;
        xProps->setPropertyValue(uPropName, aValue);
    }
}
/* --------------------------------------------------

 --------------------------------------------------*/
void lcl_SetBOOLProp( uno::Reference< beans::XPropertySetInfo > & xInfo,
    uno::Reference< beans::XPropertySet > & xProps,
    const char* rPropName, sal_Bool bValue)
{
    OUString uPropName(C2U(rPropName));
    if(xInfo->hasPropertyByName(uPropName))
    {
        uno::Any aValue;
        aValue.setValue(&bValue, ::getCppuBooleanType());
        xProps->setPropertyValue(uPropName, aValue);
    }
}
/* --------------------------------------------------

 --------------------------------------------------*/
void SwMultiTOXTabDialog::CreateOrUpdateExample(
    sal_uInt16 nTOXIndex, sal_uInt16 nPage, sal_uInt16 nCurrentLevel)
{
    if(!pExampleFrame || !pExampleFrame->IsInitialized())
        return;

    const char* __FAR_DATA IndexServiceNames[] =
    {
        "com.sun.star.text.DocumentIndex",
        "com.sun.star.text.UserIndex",
        "com.sun.star.text.ContentIndex",
        "com.sun.star.text.IllustrationsIndex",
        "com.sun.star.text.ObjectIndex",
        "com.sun.star.text.TableIndex",
        "com.sun.star.text.Bibliography"
    };

    try
    {
        DBG_ASSERT(pxIndexSectionsArr[nTOXIndex] &&
                        pxIndexSectionsArr[nTOXIndex]->xContainerSection.is(),
                            "Section not created")
         uno::Reference< frame::XModel > & xModel = pExampleFrame->GetModel();
        sal_Bool bInitialCreate = sal_True;
        if(!pxIndexSectionsArr[nTOXIndex]->xDocumentIndex.is())
        {
            bInitialCreate = sal_True;
         uno::Reference< text::XTextRange >  xAnchor = pxIndexSectionsArr[nTOXIndex]->xContainerSection->getAnchor();
            xAnchor = xAnchor->getStart();
         uno::Reference< text::XTextCursor >  xCrsr = xAnchor->getText()->createTextCursorByRange(xAnchor);

         uno::Reference< lang::XMultiServiceFactory >  xFact(xModel, uno::UNO_QUERY);

            String sIndexTypeName;
            sIndexTypeName.AssignAscii( IndexServiceNames[
                    nTOXIndex <= TOX_AUTHORITIES ? nTOXIndex : TOX_USER] );
            pxIndexSectionsArr[nTOXIndex]->xDocumentIndex = uno::Reference< text::XDocumentIndex > (xFact->createInstance(
                                                    sIndexTypeName), uno::UNO_QUERY);
         uno::Reference< text::XTextContent >  xContent(pxIndexSectionsArr[nTOXIndex]->xDocumentIndex, uno::UNO_QUERY);
         uno::Reference< text::XTextRange >  xRg(xCrsr, uno::UNO_QUERY);
            xCrsr->getText()->insertTextContent(xRg, xContent, sal_False);
        }
        OUString uIsVisible(C2U(UNO_NAME_IS_VISIBLE));
        for(sal_uInt16 i = 0 ; i <= TOX_AUTHORITIES; i++)
        {
         uno::Reference< beans::XPropertySet >  xSectPr(pxIndexSectionsArr[i]->xContainerSection, uno::UNO_QUERY);
            uno::Any aVal;

            if(xSectPr.is())
            {
                BOOL bTemp = i == nTOXIndex;
                aVal.setValue(&bTemp, ::getBooleanCppuType());
                xSectPr->setPropertyValue(uIsVisible, aVal);
            }
        }
        // set properties
     uno::Reference< beans::XPropertySet >  xIdxProps(pxIndexSectionsArr[nTOXIndex]->xDocumentIndex, uno::UNO_QUERY);
     uno::Reference< beans::XPropertySetInfo >  xInfo = xIdxProps->getPropertySetInfo();
        SwTOXDescription& rDesc = GetTOXDescription(eCurrentTOXType);
        sal_uInt16 nIdxOptions = rDesc.GetIndexOptions();
        if(bInitialCreate || !nPage || nPage == TOX_PAGE_SELECT)
        {
            //title
            if(rDesc.GetTitle())
                lcl_SetProp(xInfo, xIdxProps, UNO_NAME_TITLE, *rDesc.GetTitle());

            //stylenames
            sal_uInt16  nContentOptions = rDesc.GetContentOptions();
            if(xInfo->hasPropertyByName(C2U(UNO_NAME_LEVEL_PARAGRAPH_STYLES)))
            {
                sal_Bool bOn = 0!=(nContentOptions&TOX_TEMPLATE    );
                uno::Any aStyleNames(xIdxProps->getPropertyValue(C2U(UNO_NAME_LEVEL_PARAGRAPH_STYLES)));
                 uno::Reference< container::XIndexReplace >  xAcc =
                    *(uno::Reference< container::XIndexReplace > *)aStyleNames.getValue();

                for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
                {
                    String sLevel;
                    if(bOn)
                        sLevel = rDesc.GetStyleNames(i);
                    sal_uInt16 nStyles = sLevel.GetTokenCount(TOX_STYLE_DELIMITER);
                    uno::Sequence<OUString> aStyles(nStyles);
                    OUString* pArr = aStyles.getArray();
                    for(sal_uInt16 nStyle = 0; nStyle < nStyles; nStyle++)
                        pArr[nStyle] = sLevel.GetToken(nStyle, TOX_STYLE_DELIMITER);
                    uno::Any aAny(&aStyles, ::getCppuType((uno::Sequence<OUString>*)0));
                    xAcc->replaceByIndex(i, aAny);
                }
            }
            lcl_SetProp(xInfo, xIdxProps, UNO_NAME_LEVEL, (sal_Int16)rDesc.GetLevel());
            lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_CREATE_FROM_MARKS,           0!=(nContentOptions&TOX_MARK        ));
            lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_CREATE_FROM_OUTLINE,         0!=(nContentOptions&TOX_OUTLINELEVEL));
            lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_CREATE_FROM_EMBEDDED_OBJECTS,0!=(nContentOptions&TOX_OLE            ));
            lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_CREATE_FROM_TABLES ,         0!=(nContentOptions&TOX_TABLE          ));
            lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_CREATE_FROM_GRAPHIC_OBJECTS, 0!=(nContentOptions&TOX_GRAPHIC        ));
            lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_CREATE_FROM_TEXT_FRAMES,     0!=(nContentOptions&TOX_FRAME          ));
            lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_CREATE_FROM_LABELS,          0!=(nContentOptions&TOX_SEQUENCE       ));

            lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_CREATE_FROM_CHAPTER, rDesc.IsFromChapter());
            lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_IS_PROTECTED, rDesc.IsReadonly());

            lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_USE_COMBINED_ENTRIES,        0 != (nIdxOptions&TOI_SAME_ENTRY        ));
            lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_USE_P_P,                     0 != (nIdxOptions&TOI_FF                   ));
            lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_IS_CASE_SENSITIVE,           0 != (nIdxOptions&TOI_CASE_SENSITIVE     ));
            lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_USE_KEY_AS_ENTRY,            0 != (nIdxOptions&TOI_KEY_AS_ENTRY     ));
            lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_USE_ALPHABETICAL_SEPARATORS, 0 != (nIdxOptions&TOI_ALPHA_DELIMITTER));
            lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_USE_DASH,                    0 != (nIdxOptions&TOI_DASH             ));
            lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_USE_UPPER_CASE,              0 != (nIdxOptions&TOI_INITIAL_CAPS     ));

            lcl_SetProp(xInfo, xIdxProps, UNO_NAME_LABEL_CATEGORY,          rDesc.GetSequenceName());
            lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_CREATE_FROM_LABELS,  !rDesc.IsCreateFromObjectNames());

            sal_Int16 nSet = text::ChapterFormat::NAME_NUMBER;
            switch (rDesc.GetCaptionDisplay())
            {
                case CAPTION_COMPLETE:  nSet = text::ChapterFormat::NAME_NUMBER;break;
                case CAPTION_NUMBER  :  nSet = text::ChapterFormat::NUMBER; break;
                case CAPTION_TEXT    :  nSet = text::ChapterFormat::NAME;      break;
            }
            lcl_SetProp(xInfo, xIdxProps, UNO_NAME_LABEL_DISPLAY_TYPE, nSet);

            sal_uInt16  nOLEOptions = rDesc.GetOLEOptions();
            lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_CREATE_FROM_STAR_MATH,   0 != (TOO_MATH  &nOLEOptions           ));
            lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_CREATE_FROM_STAR_CHART,  0 != (TOO_CHART &nOLEOptions       ));
            lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_CREATE_FROM_STAR_IMAGE,  0 != (TOO_IMAGE &nOLEOptions           ));
            lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_CREATE_FROM_STAR_CALC,   0 != (TOO_CALC  &nOLEOptions           ));
            lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_CREATE_FROM_STAR_DRAW,   0 != (TOO_DRAW_IMPRESS&nOLEOptions));
            lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_CREATE_FROM_OTHER_EMBEDDED_OBJECTS, 0 != (TOO_OTHER|nOLEOptions       ));

            //lcl_SetBOOLProp(xInfo, xIdxProps, , rDesc.IsLevelFromChapter());
        }
        const SwForm* pForm = GetForm(eCurrentTOXType);
        if(bInitialCreate || !nPage || nPage == TOX_PAGE_ENTRY)
        {
            lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_IS_COMMA_SEPARATED, pForm->IsCommaSeparated());
            lcl_SetBOOLProp(xInfo, xIdxProps, UNO_NAME_USE_ALPHABETICAL_SEPARATORS, 0 != (nIdxOptions&TOI_ALPHA_DELIMITTER));
            if(nCurrentLevel < pForm->GetFormMax() &&
                xInfo->hasPropertyByName(C2U(UNO_NAME_LEVEL_FORMAT)))
            {
                String sTokenType;
                 uno::Sequence< beans::PropertyValues> aSequPropVals(10);
                long nTokenIndex = 0;
                long nParamCount = 2;
                sal_Bool bTabRightAligned = sal_False;
                SwFormTokenEnumerator aTokenEnum(pForm->GetPattern(nCurrentLevel));
                while(aTokenEnum.HasNextToken())
                {
                    if( aSequPropVals.getLength() <= nTokenIndex)
                        aSequPropVals.realloc(nTokenIndex + 10);

                    SwFormToken aToken = aTokenEnum.GetNextToken();
                    switch(aToken.eTokenType)
                    {
                        case TOKEN_ENTRY_NO     :
                            sTokenType.AssignAscii(RTL_CONSTASCII_STRINGPARAM(
                                                    "TokenEntryNumber"));
                            // fuer Inhaltsverzeichnis Numerierung
                        break;
                        case TOKEN_ENTRY_TEXT   :
                        case TOKEN_ENTRY        :
                            sTokenType.AssignAscii(RTL_CONSTASCII_STRINGPARAM(
                                                    "TokenEntryText"));
                        break;
                        case TOKEN_TAB_STOP     :
                            nParamCount += 3;
                            sTokenType.AssignAscii(RTL_CONSTASCII_STRINGPARAM(
                                                    "TokenTabStop"));
                        break;
                        case TOKEN_TEXT         :
                            sTokenType.AssignAscii(RTL_CONSTASCII_STRINGPARAM(
                                                    "TokenText"));
                            nParamCount += 1;
                        break;
                        case TOKEN_PAGE_NUMS    :
                            sTokenType.AssignAscii(RTL_CONSTASCII_STRINGPARAM(
                                                    "TokenPageNumber"));
                        break;
                        case TOKEN_CHAPTER_INFO :
                            sTokenType.AssignAscii(RTL_CONSTASCII_STRINGPARAM(
                                                    "TokenChapterInfo"));
                        {
                            aToken.nChapterFormat;
                        }
                        break;
                        case TOKEN_LINK_START   :
                            sTokenType.AssignAscii(RTL_CONSTASCII_STRINGPARAM(
                                                    "TokenHyperlinkStart"));
                        break;
                        case TOKEN_LINK_END     :
                            sTokenType.AssignAscii(RTL_CONSTASCII_STRINGPARAM(
                                                    "TokenHyperlinkEnd"));
                        break;
                        case TOKEN_AUTHORITY :
                        {
                            sTokenType.AssignAscii(RTL_CONSTASCII_STRINGPARAM(
                                                "TokenBibliographyDataField"));
                            ToxAuthorityField eField = (ToxAuthorityField)aToken.nAuthorityField;
                        }
                        break;
                    }
                     beans::PropertyValues aPropVals(nParamCount);
                     beans::PropertyValue* pPropValArr = aPropVals.getArray();
                    pPropValArr[0].Name = C2U("TokenType");
                    pPropValArr[0].Value <<= OUString(sTokenType);
                    pPropValArr[1].Name = C2U("CharacterStyleName");
                    pPropValArr[1].Value <<= OUString(aToken.sCharStyleName);
                    if(TOKEN_TAB_STOP == aToken.eTokenType)
                    {
                        pPropValArr[2].Name = C2U("TabStopRightAligned");
                        BOOL bTemp = SVX_TAB_ADJUST_END == aToken.eTabAlign;
                        pPropValArr[2].Value.setValue(&bTemp, ::getBooleanCppuType());
                        pPropValArr[3].Name = C2U("TabStopFillCharacter");
                        pPropValArr[3].Value <<= OUString(aToken.cTabFillChar);
                        pPropValArr[4].Name = C2U("TabStopPosition");
                        SwTwips nTempPos = aToken.nTabStopPosition >= 0 ?
                                                        aToken.nTabStopPosition : 0;
                        nTempPos = TWIP_TO_MM100(nTempPos);
                        pPropValArr[4].Value <<= (sal_Int32)nTempPos;
                    }
                    else if(TOKEN_TEXT == aToken.eTokenType)
                    {
                        pPropValArr[2].Name = C2U("Text");
                        pPropValArr[2].Value <<= OUString(aToken.sText);
                    }
                 beans::PropertyValues* pValues = aSequPropVals.getArray();
                    pValues[nTokenIndex] = aPropVals;
                    nTokenIndex++;
                }
                aSequPropVals.realloc(nTokenIndex);

                uno::Any aFormatAccess = xIdxProps->getPropertyValue(C2U(UNO_NAME_LEVEL_FORMAT));
                DBG_ASSERT(aFormatAccess.getValueType() == ::getCppuType((uno::Reference<container::XIndexReplace>*)0),
                    "wrong property type")


                 uno::Reference< container::XIndexReplace >  xFormatAccess =
                    *(uno::Reference< container::XIndexReplace > *)aFormatAccess.getValue();
                 uno::Any aLevelProp(&aSequPropVals, ::getCppuType((uno::Sequence<beans::PropertyValues>*)0));
                xFormatAccess->replaceByIndex(nCurrentLevel, aLevelProp);
            }
        }
        if(bInitialCreate || !nPage || nPage == TOX_PAGE_STYLES)
        {
            lcl_SetProp(xInfo, xIdxProps, "ParaStyleHeading", pForm->GetTemplate(0));
            sal_uInt16 nOffset = 0;
            sal_uInt16 nEndLevel = 2;
            switch(eCurrentTOXType.eType)
            {
                case  TOX_INDEX:
                {
                    nOffset = 1;
                    nEndLevel = 4;
                    lcl_SetProp(xInfo, xIdxProps, "ParaStyleSeparator", pForm->GetTemplate(1));
                }
                break;
                case TOX_CONTENT :
                    nEndLevel = 11;
                break;

            }
            for(sal_uInt16 i = 1; i < nEndLevel; i++)
            {
                String sPropName(C2S("ParaStyleLevel"));
                sPropName += String::CreateFromInt32( i );
                lcl_SetProp(xInfo,
                    xIdxProps,
                    ByteString(sPropName, RTL_TEXTENCODING_ASCII_US).GetBuffer(),
                    pForm->GetTemplate(i + nOffset));
            }
        }
/*
    const String&   GetAutoMarkURL() const { return sAutoMarkURL;}
    const String&   GetMainEntryCharStyle() const {return sMainEntryCharStyle;}

    String          GetAuthBrackets() const {return sAuthBrackets;}
    sal_Bool            IsAuthSequence() const {return bIsAuthSequence;}
    sal_Bool            IsSortByDocument()const {return bSortByDocument ;}

    SwTOXSortKey GetSortKey1() const {return eSortKey1;}
    SwTOXSortKey GetSortKey2() const {return eSortKey2;}
    SwTOXSortKey GetSortKey3() const {return eSortKey3;}
*/
        //
        pxIndexSectionsArr[nTOXIndex]->xDocumentIndex->update();

//#ifdef DEBUG
//      uno::Reference< frame::XStorable >  xStor(xModel, uno::UNO_QUERY);
//      String sURL("file:///e|/temp/sw/idxexample.sdw");
//   uno::Sequence< beans::PropertyValue > aArgs(0);
//      xStor->storeToURL(S2U(sURL), aArgs);
//#endif

    }
    catch(...)
    {
        DBG_ERROR("::CreateExample() - exception caught")
    }
}
/* -----------------05.07.99 09:49-------------------

 --------------------------------------------------*/
sal_Bool SwMultiTOXTabDialog::IsNoNum(SwWrtShell& rSh, const String& rName)
{
    SwTxtFmtColl* pColl = rSh.GetParaStyle(rName);
    if(pColl && pColl->GetOutlineLevel() == NO_NUMBERING)
        return sal_True;

    sal_uInt16 nId = rSh.GetPoolId(rName, GET_POOLID_TXTCOLL);
    if(nId != USHRT_MAX &&
       rSh.GetTxtCollFromPool(nId)->GetOutlineLevel() == NO_NUMBERING)
        return sal_True;

    return sal_False;
}
/* -----------------14.07.99 16:01-------------------

 --------------------------------------------------*/
class SwIndexTreeLB : public SvTreeListBox
{
    const HeaderBar* pHeaderBar;
public:
    SwIndexTreeLB(Window* pWin, const ResId& rResId) :
        SvTreeListBox(pWin, rResId), pHeaderBar(0){}

    virtual void    KeyInput( const KeyEvent& rKEvt );
    virtual long    GetTabPos( SvLBoxEntry*, SvLBoxTab* );
    void            SetHeaderBar(const HeaderBar* pHB) {pHeaderBar = pHB;}
};
/* -----------------14.07.99 16:03-------------------

 --------------------------------------------------*/
long  SwIndexTreeLB::GetTabPos( SvLBoxEntry* pEntry, SvLBoxTab* pTab)
{
    long nData = (long)pEntry->GetUserData();
    if(nData != USHRT_MAX)
    {
        sal_uInt16  nPos = pHeaderBar->GetItemRect( 101 + nData ).TopLeft().X();
        nData = nPos;
    }
    else
        nData = 0;
    nData += pTab->GetPos();
    return nData;
}
/* -----------------25.08.99 11:14-------------------

 --------------------------------------------------*/
void    SwIndexTreeLB::KeyInput( const KeyEvent& rKEvt )
{
    SvLBoxEntry* pEntry = FirstSelected();
    KeyCode aCode = rKEvt.GetKeyCode();
    sal_Bool bChanged = sal_False;
    if(pEntry)
    {
        long nLevel = (long)pEntry->GetUserData();
        if(aCode.GetCode() == KEY_ADD )
        {
            if(nLevel < MAXLEVEL - 1)
                nLevel++;
            else if(nLevel == USHRT_MAX)
                nLevel = 0;
            bChanged = sal_True;
        }
        else if(aCode.GetCode() == KEY_SUBTRACT)
        {
            if(!nLevel)
                nLevel = USHRT_MAX;
            else if(nLevel != USHRT_MAX)
                nLevel--;
            bChanged = sal_True;
        }
        if(bChanged)
        {
            pEntry->SetUserData((void*)nLevel);
            Invalidate();
        }
    }
    if(!bChanged)
        SvTreeListBox::KeyInput(rKEvt);
}

/* -----------------16.07.99 10:01-------------------

 --------------------------------------------------*/
class SwHeaderTree : public Control
{
    HeaderBar       aStylesHB;
    SwIndexTreeLB   aStylesTLB;

public:
    SwHeaderTree(Window* pParent, const ResId rResId);

    HeaderBar&      GetHeaderBar() {return aStylesHB;}
    SwIndexTreeLB&  GetTreeListBox() { return aStylesTLB;}

    virtual void    GetFocus();
};
/* -----------------16.07.99 10:11-------------------

 --------------------------------------------------*/
SwHeaderTree::SwHeaderTree(Window* pParent, const ResId rResId) :
        Control(pParent, rResId),
        aStylesHB(  this, ResId(HB_STYLES)),
        aStylesTLB( this, ResId(TLB_STYLES  ))
{
    FreeResource();
    aStylesHB.SetStyle(aStylesHB.GetStyle()|WB_BUTTONSTYLE|WB_TABSTOP|WB_BORDER);
     Size aHBSize(aStylesHB.GetSizePixel());
    aHBSize.Height() = aStylesHB.CalcWindowSizePixel().Height();
    aStylesHB.SetSizePixel(aHBSize);
    aStylesTLB.SetPosPixel(Point(0, aHBSize.Height()));
     Size aTLBSize(aStylesHB.GetSizePixel());
    aTLBSize.Height() = GetOutputSizePixel().Height() - aHBSize.Height();
    aStylesTLB.SetSizePixel(aTLBSize);
    aStylesTLB.SetHeaderBar(&aStylesHB);
}
/* -----------------25.08.99 10:38-------------------

 --------------------------------------------------*/
void    SwHeaderTree::GetFocus()
{
    Control::GetFocus();
    aStylesTLB.GrabFocus();
}
/* -----------------13.07.99 15:29-------------------

 --------------------------------------------------*/
class SwAddStylesDlg_Impl : public SfxModalDialog
{
    OKButton        aOk;
    CancelButton    aCancel;
    HelpButton      aHelp;

    GroupBox        aStylesGB;
    SwHeaderTree    aHeaderTree;
    PushButton      aLeftPB;
    PushButton      aRightPB;

    String          sHBFirst;
    String*         pStyleArr;

    DECL_LINK(OkHdl, OKButton*);
    DECL_LINK(LeftRightHdl, PushButton*);
    DECL_LINK(HeaderDragHdl, HeaderBar*);

public:
    SwAddStylesDlg_Impl(Window* pParent, SwWrtShell& rWrtSh, String rStringArr[]);
    ~SwAddStylesDlg_Impl();
};
/* -----------------13.07.99 15:39-------------------

 --------------------------------------------------*/
SwAddStylesDlg_Impl::SwAddStylesDlg_Impl(Window* pParent,
            SwWrtShell& rWrtSh, String rStringArr[]) :
    SfxModalDialog(pParent, SW_RES(DLG_ADD_IDX_STYLES)),
    pStyleArr(rStringArr),
    aHeaderTree(this, ResId(TR_HEADER   )),
    aStylesGB(  this, ResId(GB_STYLES   )),
    aOk(        this, ResId(PB_OK       )),
    aCancel(    this, ResId(PB_CANCEL   )),
    aHelp(      this, ResId(PB_HELP     )),
    aLeftPB(    this, ResId(PB_LEFT     )),
    aRightPB(   this, ResId(PB_RIGHT    )),
    sHBFirst(   ResId(ST_HB_FIRST))
{
    FreeResource();

    aOk.SetClickHdl(LINK(this, SwAddStylesDlg_Impl, OkHdl));
    aLeftPB.SetClickHdl(LINK(this, SwAddStylesDlg_Impl, LeftRightHdl));
    aRightPB.SetClickHdl(LINK(this, SwAddStylesDlg_Impl, LeftRightHdl));

    HeaderBar& rHB = aHeaderTree.GetHeaderBar();
    rHB.SetEndDragHdl(LINK(this, SwAddStylesDlg_Impl, HeaderDragHdl));

    long nWidth = rHB.GetSizePixel().Width();
    nWidth /= 14;
    nWidth--;
    rHB.InsertItem( 100, sHBFirst,  4 * nWidth );
    for(sal_uInt16 i = 1; i <= MAXLEVEL; i++)
        rHB.InsertItem( 100 + i, String::CreateFromInt32(i), nWidth );
    rHB.Show();

    SwIndexTreeLB& rTLB = aHeaderTree.GetTreeListBox();
    rTLB.SetWindowBits(WB_CLIPCHILDREN|WB_SORT);
    //aStylesTLB.SetSelectHdl(LINK(this, SwAddStylesDlg_Impl, SelectHdl));
    rTLB.GetModel()->SetSortMode(SortAscending);
    for(i = 0; i < MAXLEVEL; ++i)
    {
        String sStyles(rStringArr[i]);
        for(sal_uInt16 nToken = 0; nToken < sStyles.GetTokenCount(TOX_STYLE_DELIMITER); nToken++)
        {
            String sTmp(sStyles.GetToken(nToken, TOX_STYLE_DELIMITER));
            SvLBoxEntry* pEntry = rTLB.InsertEntry(sTmp);
            pEntry->SetUserData((void*)i);
        }
    }
    // now the other styles
    //
    const SwTxtFmtColl *pColl   = 0;
    const sal_uInt16 nSz = rWrtSh.GetTxtFmtCollCount();

    for ( sal_uInt16 j = 0;j < nSz; ++j )
    {
        pColl = &rWrtSh.GetTxtFmtColl(j);
        if(pColl->IsDefault())
            continue;

        const String& rName = pColl->GetName();

        if(rName.Len() > 0)
        {
            SvLBoxEntry* pEntry = rTLB.First();
            sal_Bool bFound = sal_False;
            while(pEntry && !bFound)
            {
                if(rTLB.GetEntryText(pEntry) == rName)
                    bFound = sal_True;
                pEntry = rTLB.Next(pEntry);
            }
            if(!bFound)
            {
                rTLB.InsertEntry(rName)->SetUserData((void*)USHRT_MAX);
            }
        }
    }
    rTLB.GetModel()->Resort();
}

/* -----------------13.07.99 15:39-------------------

 --------------------------------------------------*/
SwAddStylesDlg_Impl::~SwAddStylesDlg_Impl()
{
}
/* -----------------13.07.99 15:39-------------------

 --------------------------------------------------*/
IMPL_LINK(SwAddStylesDlg_Impl, OkHdl, OKButton*, pBtn)
{
    for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
        pStyleArr[i].Erase();

    SwIndexTreeLB& rTLB = aHeaderTree.GetTreeListBox();
    SvLBoxEntry* pEntry = rTLB.First();
    while(pEntry)
    {
        long nLevel = (long)pEntry->GetUserData();
        if(nLevel != USHRT_MAX)
        {
            String sName(rTLB.GetEntryText(pEntry));
            if(pStyleArr[nLevel].Len())
                pStyleArr[nLevel] += TOX_STYLE_DELIMITER;
            pStyleArr[nLevel] += sName;
        }
        pEntry = rTLB.Next(pEntry);
    }

    //TODO write back style names
    EndDialog(RET_OK);
    return 0;
}
/* -----------------16.07.99 09:27-------------------

 --------------------------------------------------*/
IMPL_LINK(SwAddStylesDlg_Impl, HeaderDragHdl, HeaderBar*, pHB)
{
    aHeaderTree.GetTreeListBox().Invalidate();
    //pHB->SetSizePixel(pHB->CalcWindowSizePixel());
    return 0;
}
/* -----------------13.07.99 15:39-------------------

 --------------------------------------------------*/
IMPL_LINK(SwAddStylesDlg_Impl, LeftRightHdl, PushButton*, pBtn)
{
    sal_Bool bLeft = pBtn == &aLeftPB;
    SvLBoxEntry* pEntry = aHeaderTree.GetTreeListBox().FirstSelected();
    if(pEntry)
    {
        long nLevel = (long)pEntry->GetUserData();
        if(bLeft)
        {
            if(!nLevel)
                nLevel = USHRT_MAX;
            else if(nLevel != USHRT_MAX)
                nLevel--;
        }
        else
        {
            if(nLevel < MAXLEVEL - 1)
                nLevel++;
            else if(nLevel == USHRT_MAX)
                nLevel = 0;
        }
        pEntry->SetUserData((void*)nLevel);
        aHeaderTree.GetTreeListBox().Invalidate();
    }
    return 0;
}

/*-- 14.06.99 13:11:40---------------------------------------------------

  -----------------------------------------------------------------------*/
SwTOXSelectTabPage::SwTOXSelectTabPage(Window* pParent, const SfxItemSet& rAttrSet) :
    SfxTabPage(pParent, SW_RES(TP_TOX_SELECT), rAttrSet),
    aTypeFT(            this, ResId(FT_TYPE             )),
    aTypeLB(            this, ResId(LB_TYPE             )),
    aReadOnlyCB(        this, ResId(CB_READONLY         )),
    aTitleFT(           this, ResId(FT_TITLE            )),
    aTitleED(           this, ResId(ED_TITLE            )),
    aTypeTitleGB(       this, ResId(GB_TYPETITLE        )),
    aAreaLB(            this, ResId(LB_AREA             )),
    aLevelFT(           this, ResId(FT_LEVEL            )),
    aLevelNF(           this, ResId(NF_LEVEL            )),
    aAreaGB(            this, ResId(GB_AREA             )),
    aFromHeadingsCB(    this, ResId(CB_FROMHEADINGS     )),
    aChapterDlgPB(      this, ResId(PB_CHAPTERDLG       )),
    aAddStylesCB(       this, ResId(CB_ADDSTYLES        )),
    aAddStylesPB(       this, ResId(PB_ADDSTYLES        )),
    aFromTablesCB(      this, ResId(CB_FROMTABLES       )),
    aFromFramesCB(      this, ResId(CB_FROMFRAMES       )),
    aFromGraphicsCB(    this, ResId(CB_FROMGRAPHICS     )),
    aFromOLECB(         this, ResId(CB_FROMOLE          )),
    aLevelFromChapterCB(this, ResId(CB_LEVELFROMCHAPTER )),
    aFromCaptionsRB(    this, ResId(RB_FROMCAPTIONS     )),
    aFromObjectNamesRB( this, ResId(RB_FROMOBJECTNAMES  )),
    aCaptionSequenceFT( this, ResId(FT_CAPTIONSEQUENCE  )),
    aCaptionSequenceLB( this, ResId(LB_CAPTIONSEQUENCE  )),
    aDisplayTypeFT(     this, ResId(FT_DISPLAYTYPE      )),
    aDisplayTypeLB(     this, ResId(LB_DISPLAYTYPE      )),
    aTOXMarksCB(        this, ResId(CB_TOXMARKS         )),
    aCreateFromGB(      this, ResId(GB_CREATEFROM       )),
    aCollectSameCB(     this, ResId(CB_COLLECTSAME      )),
    aUseFFCB(           this, ResId(CB_USEFF            )),
    aUseDashCB(         this, ResId(CB_USE_DASH         )),
    aCaseSensitiveCB(   this, ResId(CB_CASESENSITIVE    )),
    aInitialCapsCB(     this, ResId(CB_INITIALCAPS      )),
    aKeyAsEntryCB(      this, ResId(CB_KEYASENTRY       )),
    aFromFileCB(        this, ResId(CB_FROMFILE         )),
    aAutoMarkPB(        this, ResId(MB_AUTOMARK         )),
//  aFilePB(            this, ResId(PB_FILE             )),
//  aCreateAutoMarkPB(  this, ResId(PB_CREATE_AUTOMARK  )),
//  aEditAutoMarkPB(    this, ResId(PB_EDIT_AUTOMARK    )),
    aIdxOptionsGB(      this, ResId(GB_IDXOPTIONS       )),
    aFromNames(         ResId(RES_SRCTYPES              )),
    aFromObjCLB(        this, ResId(CLB_FROMOBJ         )),
    aFromObjGB(         this, ResId(GB_FROMOBJ          )),
    aSequenceCB(        this, ResId(CB_SEQUENCE         )),
    aBracketFT(         this, ResId(FT_BRACKET          )),
    aBracketLB(         this, ResId(LB_BRACKET          )),
    aAuthorityFormatGB( this, ResId(GB_AUTHORITY        )),
    sAddStyleUser(ResId(ST_USER_ADDSTYLE)),
    sAutoMarkType(ResId(ST_AUTOMARK_TYPE)),
    bFirstCall(sal_True)
{
    FreeResource();
    sAddStyleContent = aAddStylesCB.GetText();

    aCBLeftPos1 = aFromHeadingsCB.GetPosPixel();
    aCBLeftPos2 = aAddStylesCB.GetPosPixel();
    aCBLeftPos3 = aTOXMarksCB.GetPosPixel();

    ResStringArray& rNames = aFromNames.GetNames();
    for(sal_uInt16 i = 0; i < rNames.Count(); i++)
    {
        aFromObjCLB.InsertEntry(rNames.GetString(i));
        aFromObjCLB.SetEntryData( i, (void*)rNames.GetValue(i) );
    }
    aFromObjCLB.SetHelpId(HID_OLE_CHECKLB);

    SetExchangeSupport();
    aTypeLB.SetSelectHdl(LINK(this, SwTOXSelectTabPage, TOXTypeHdl));

    aAddStylesPB.SetClickHdl(LINK(this, SwTOXSelectTabPage, AddStylesHdl));
    aChapterDlgPB.SetClickHdl(LINK(this, SwTOXSelectTabPage, ChapterHdl));

    PopupMenu*  pMenu = aAutoMarkPB.GetPopupMenu();
    pMenu->SetActivateHdl(LINK(this, SwTOXSelectTabPage, MenuEnableHdl));
    pMenu->SetSelectHdl(LINK(this, SwTOXSelectTabPage, MenuExecuteHdl));

//  aFilePB.SetClickHdl(LINK(this, SwTOXSelectTabPage, AutoMarkHdl));
//  aCreateAutoMarkPB.SetClickHdl(LINK(this, SwTOXSelectTabPage, CreateEditAutoMarkHdl));
//  aEditAutoMarkPB.SetClickHdl(LINK(this, SwTOXSelectTabPage, CreateEditAutoMarkHdl));

    Link aLk =  LINK(this, SwTOXSelectTabPage, CheckBoxHdl);
    aAddStylesCB    .SetClickHdl(aLk);
    aFromHeadingsCB .SetClickHdl(aLk);
    aTOXMarksCB     .SetClickHdl(aLk);
    aFromFileCB     .SetClickHdl(aLk);
    aCollectSameCB  .SetClickHdl(aLk);
    aUseFFCB        .SetClickHdl(aLk);
    aUseDashCB      .SetClickHdl(aLk);
    aInitialCapsCB  .SetClickHdl(aLk);
    aKeyAsEntryCB   .SetClickHdl(aLk);

    Link aModifyLk = LINK(this, SwTOXSelectTabPage, ModifyHdl);
    aTitleED.SetModifyHdl(aModifyLk);
    aLevelNF.SetModifyHdl(aModifyLk);

    aLk =  LINK(this, SwTOXSelectTabPage, RadioButtonHdl);
    aFromCaptionsRB.SetClickHdl(aLk);
    aFromObjectNamesRB.SetClickHdl(aLk);
    RadioButtonHdl(&aFromCaptionsRB);

    aTypeLB.SelectEntryPos(0);
    aTitleED.SaveValue();
}
/*-- 14.06.99 13:11:41---------------------------------------------------

  -----------------------------------------------------------------------*/
SwTOXSelectTabPage::~SwTOXSelectTabPage()
{
}
/* -----------------21.10.99 17:03-------------------

 --------------------------------------------------*/
void SwTOXSelectTabPage::SetWrtShell(SwWrtShell& rSh)
{
    sal_uInt16 nUserTypeCount = rSh.GetTOXTypeCount(TOX_USER);
    if(nUserTypeCount > 1)
    {
        //insert all new user indexes names after the standard user index
        sal_uInt16 nPos = aTypeLB.GetEntryPos((void*)(sal_uInt32)TO_USER);
        nPos++;
        for(sal_uInt16 nUser = 1; nUser < nUserTypeCount; nUser++)
        {
            nPos = aTypeLB.InsertEntry(rSh.GetTOXType(TOX_USER, nUser)->GetTypeName(), nPos);
            sal_uInt32 nEntryData = nUser << 8;
            nEntryData |= TO_USER;
            aTypeLB.SetEntryData(nPos, (void*)nEntryData);
        }
    }
}
/* -----------------14.06.99 13:10-------------------

 --------------------------------------------------*/
sal_Bool SwTOXSelectTabPage::FillItemSet( SfxItemSet& )
{
    return sal_True;
}
/* -----------------25.08.99 14:31-------------------

 --------------------------------------------------*/
long lcl_TOXTypesToUserData(CurTOXType eType)
{
    sal_uInt16 nRet;
    switch(eType.eType)
    {
        case TOX_INDEX       : nRet = TO_INDEX;     break;
        case TOX_USER        :
        {
            nRet = eType.nIndex << 8;
            nRet |= TO_USER;
        }
        break;
        case TOX_CONTENT     : nRet = TO_CONTENT;   break;
        case TOX_ILLUSTRATIONS:nRet = TO_ILLUSTRATION; break;
        case TOX_OBJECTS     : nRet = TO_OBJECT;    break;
        case TOX_TABLES      : nRet = TO_TABLE;     break;
        case TOX_AUTHORITIES : nRet = TO_AUTHORITIES; break;
    }
    return nRet;
}
//-----------------------------------------------------------------
void SwTOXSelectTabPage::SelectType(TOXTypes eSet)
{
    CurTOXType eCurType = {eSet, 0};

    long nData = lcl_TOXTypesToUserData(eCurType);
    aTypeLB.SelectEntryPos(aTypeLB.GetEntryPos((void*)nData));
    aTypeFT.Enable(sal_False);
    aTypeLB.Enable(sal_False);
    TOXTypeHdl(&aTypeLB);
}

/*-- 14.06.99 13:10:45---------------------------------------------------

  -----------------------------------------------------------------------*/
//-----------------------------------------------------------------
CurTOXType lcl_UserData2TOXTypes(sal_uInt16 nData)
{
    CurTOXType eRet;
    eRet.nIndex = 0;
    switch(nData&0xff)
    {
        case TO_INDEX       : eRet.eType = TOX_INDEX;       break;
        case TO_USER        :
        {
            eRet.eType = TOX_USER;
            eRet.nIndex  = (nData&0xff00) >> 8;
        }
        break;
        case TO_CONTENT     : eRet.eType = TOX_CONTENT;     break;
        case TO_ILLUSTRATION: eRet.eType = TOX_ILLUSTRATIONS; break;
        case TO_OBJECT      : eRet.eType = TOX_OBJECTS;     break;
        case TO_TABLE       : eRet.eType = TOX_TABLES;      break;
        case TO_AUTHORITIES : eRet.eType = TOX_AUTHORITIES; break;
        default: DBG_ERROR("what a type?");
    }
    return eRet;
}
/* -----------------02.09.99 08:16-------------------

 --------------------------------------------------*/
void    SwTOXSelectTabPage::ApplyTOXDescription()
{
    SwMultiTOXTabDialog* pTOXDlg = (SwMultiTOXTabDialog*)GetTabDialog();
    const CurTOXType aCurType = pTOXDlg->GetCurrentTOXType();
    SwTOXDescription& rDesc = pTOXDlg->GetTOXDescription(aCurType);
    aReadOnlyCB.Check(rDesc.IsReadonly());
    if(aTitleED.GetText() == aTitleED.GetSavedValue())
    {
        if(rDesc.GetTitle())
            aTitleED.SetText(*rDesc.GetTitle());
        else
            aTitleED.SetText(aEmptyStr);
        aTitleED.SaveValue();
    }

    aAreaLB.SelectEntryPos(rDesc.IsFromChapter() ? 1 : 0);

    if(aCurType.eType != TOX_INDEX)
        aLevelNF.SetValue(rDesc.GetLevel());   //content, user

    sal_uInt16 nCreateType = rDesc.GetContentOptions();

    //user + content
    sal_Bool bHasStyleNames = sal_False;
    for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
        if(rDesc.GetStyleNames(i).Len())
        {
            bHasStyleNames = sal_True;
            break;
        }
    aAddStylesCB.Check(bHasStyleNames && (nCreateType & TOX_TEMPLATE));

    aFromOLECB.Check(nCreateType&TOX_OLE);
    aFromTablesCB.Check(nCreateType&TOX_TABLE);
    aFromGraphicsCB.Check(nCreateType&TOX_GRAPHIC);
    aFromFramesCB.Check(nCreateType&TOX_FRAME);

    aLevelFromChapterCB.Check(rDesc.IsLevelFromChapter());

    //all but illustration and table
    aTOXMarksCB.Check(nCreateType&TOX_MARK );

    //content
    if(TOX_CONTENT == aCurType.eType)
    {
        aFromHeadingsCB.Check(nCreateType&TOX_OUTLINELEVEL);
        aChapterDlgPB.Enable(aFromHeadingsCB.IsChecked());
        aAddStylesCB.SetText(sAddStyleContent);
        aAddStylesPB.Enable(aAddStylesCB.IsChecked());
    }
    //index only
    else if(TOX_INDEX == aCurType.eType)
    {
        sal_uInt16 nIndexOptions = rDesc.GetIndexOptions();
        aCollectSameCB.     Check(nIndexOptions&TOI_SAME_ENTRY);
        aUseFFCB.           Check(nIndexOptions&TOI_FF);
        aUseDashCB.         Check(nIndexOptions&TOI_DASH);
        if(aUseFFCB.IsChecked())
            aUseDashCB.Enable(sal_False);
        else if(aUseDashCB.IsChecked())
            aUseFFCB.Enable(sal_False);

        aCaseSensitiveCB.   Check(nIndexOptions&TOI_CASE_SENSITIVE);
        aInitialCapsCB.     Check(nIndexOptions&TOI_INITIAL_CAPS);
        aKeyAsEntryCB.      Check(nIndexOptions&TOI_KEY_AS_ENTRY);
    }
    else if(TOX_ILLUSTRATIONS == aCurType.eType ||
        TOX_TABLES == aCurType.eType)
    {
        aFromObjectNamesRB.Check(rDesc.IsCreateFromObjectNames());
        aFromCaptionsRB.Check(!rDesc.IsCreateFromObjectNames());
        aCaptionSequenceLB.SelectEntry(rDesc.GetSequenceName());
        aDisplayTypeLB.SelectEntryPos(rDesc.GetCaptionDisplay());
        RadioButtonHdl(&aFromCaptionsRB);

    }
    else if(TOX_OBJECTS == aCurType.eType)
    {
        long nOLEData = rDesc.GetOLEOptions();
        for(sal_uInt16 i = 0; i < aFromObjCLB.GetEntryCount(); i++)
        {
            long nData = (long)aFromObjCLB.GetEntryData(i);
            aFromObjCLB.CheckEntryPos(i, 0 != (nData & nOLEData));
        }
    }
    else if(TOX_AUTHORITIES == aCurType.eType)
    {
        aBracketLB.SelectEntry(rDesc.GetAuthBrackets());
        aSequenceCB.Check(rDesc.IsAuthSequence());
    }
    aAutoMarkPB.Enable(aFromFileCB.IsChecked());
//  aCreateAutoMarkPB.Enable(aFromFileCB.IsChecked());
//  aEditAutoMarkPB.Enable(aFromFileCB.IsChecked() && sAutoMarkURL.Len());

    for(i = 0; i < MAXLEVEL; i++)
        aStyleArr[i] = rDesc.GetStyleNames(i);
}
/* -----------------09.09.99 11:57-------------------

 --------------------------------------------------*/
void SwTOXSelectTabPage::FillTOXDescription()
{
    SwMultiTOXTabDialog* pTOXDlg = (SwMultiTOXTabDialog*)GetTabDialog();
    CurTOXType aCurType = pTOXDlg->GetCurrentTOXType();
    SwTOXDescription& rDesc = pTOXDlg->GetTOXDescription(aCurType);
    rDesc.SetTitle(aTitleED.GetText());
    rDesc.SetFromChapter(1 == aAreaLB.GetSelectEntryPos());
    sal_uInt16 nContentOptions = 0;
    if(aTOXMarksCB.IsVisible() && aTOXMarksCB.IsChecked())
        nContentOptions |= TOX_MARK;

    sal_uInt16 nIndexOptions = rDesc.GetIndexOptions()&TOI_ALPHA_DELIMITTER;
    switch(rDesc.GetTOXType())
    {
        case TOX_CONTENT:
            if(aFromHeadingsCB.IsChecked())
                nContentOptions |= TOX_OUTLINELEVEL;
        break;
        case TOX_USER:
        {
            rDesc.SetTOUName(aTypeLB.GetSelectEntry());

            if(aFromOLECB.IsChecked())
                nContentOptions |= TOX_OLE;
            if(aFromTablesCB.IsChecked())
                nContentOptions |= TOX_TABLE;
            if(aFromFramesCB.IsChecked())
                nContentOptions |= TOX_FRAME;
            if(aFromGraphicsCB.IsChecked())
                nContentOptions |= TOX_GRAPHIC;
        }
        break;
        case  TOX_INDEX:
        {
            nContentOptions = TOX_MARK;

            if(aCollectSameCB.IsChecked())
                nIndexOptions |= TOI_SAME_ENTRY;
            if(aUseFFCB.IsChecked())
                nIndexOptions |= TOI_FF;
            if(aUseDashCB.IsChecked())
                nIndexOptions |= TOI_DASH;
            if(aCaseSensitiveCB.IsChecked())
                nIndexOptions |= TOI_CASE_SENSITIVE;
            if(aInitialCapsCB.IsChecked())
                nIndexOptions |= TOI_INITIAL_CAPS;
            if(aKeyAsEntryCB.IsChecked())
                nIndexOptions |= TOI_KEY_AS_ENTRY;
            if(aFromFileCB.IsChecked())
                rDesc.SetAutoMarkURL(sAutoMarkURL);
            else
                rDesc.SetAutoMarkURL(aEmptyStr);
        }
        break;
        case TOX_ILLUSTRATIONS:
        case TOX_TABLES :
            rDesc.SetCreateFromObjectNames(aFromObjectNamesRB.IsChecked());
            rDesc.SetSequenceName(aCaptionSequenceLB.GetSelectEntry());
            rDesc.SetCaptionDisplay((SwCaptionDisplay)aDisplayTypeLB.GetSelectEntryPos());
        break;
        case TOX_OBJECTS:
        {
            long nOLEData = 0;
            for(sal_uInt16 i = 0; i < aFromObjCLB.GetEntryCount(); i++)
            {
                if(aFromObjCLB.IsChecked(i))
                {
                    long nData = (long)aFromObjCLB.GetEntryData(i);
                    nOLEData |= nData;
                }
            }
            rDesc.SetOLEOptions(nOLEData);
        }
        break;
        case TOX_AUTHORITIES:
        {
            rDesc.SetAuthBrackets(aBracketLB.GetSelectEntry());
            rDesc.SetAuthSequence(aSequenceCB.IsChecked());
        }
        break;
    }

    rDesc.SetLevelFromChapter(  aLevelFromChapterCB.IsVisible() &&
                                aLevelFromChapterCB.IsChecked());
    if(aTOXMarksCB.IsChecked() && aTOXMarksCB.IsVisible())
        nContentOptions |= TOX_MARK;
    if(aFromHeadingsCB.IsChecked() && aFromHeadingsCB.IsVisible())
        nContentOptions |= TOX_OUTLINELEVEL;
    if(aAddStylesCB.IsChecked() && aAddStylesCB.IsVisible())
        nContentOptions |= TOX_TEMPLATE;

    rDesc.SetContentOptions(nContentOptions);
    rDesc.SetIndexOptions(nIndexOptions);
    rDesc.SetLevel(aLevelNF.GetValue());

    rDesc.SetReadonly(aReadOnlyCB.IsChecked());

    for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
        rDesc.SetStyleNames(aStyleArr[i], i);
}
/* -----------------05.07.99 15:09-------------------

 --------------------------------------------------*/
void SwTOXSelectTabPage::Reset( const SfxItemSet& )
{
    SwMultiTOXTabDialog* pTOXDlg = (SwMultiTOXTabDialog*)GetTabDialog();
    SwWrtShell& rSh = pTOXDlg->GetWrtShell();
    const CurTOXType aCurType = pTOXDlg->GetCurrentTOXType();
    long nData = lcl_TOXTypesToUserData(aCurType);
    aTypeLB.SelectEntryPos(aTypeLB.GetEntryPos((void*)nData));

    sAutoMarkURL = INetURLObject::decode( rSh.GetTOIAutoMarkURL(),
                                        INET_HEX_ESCAPE,
                                           INetURLObject::DECODE_WITH_CHARSET,
                                        RTL_TEXTENCODING_UTF8 );
    aFromFileCB.Check(sAutoMarkURL.Len());

    aCaptionSequenceLB.Clear();
    sal_uInt16 i, nCount = rSh.GetFldTypeCount(RES_SETEXPFLD);
    for (i = 0; i < nCount; i++)
    {
        SwFieldType *pType = rSh.GetFldType( i, RES_SETEXPFLD );
        if( pType->Which() == RES_SETEXPFLD &&
            ((SwSetExpFieldType *) pType)->GetType() & GSE_SEQ )
            aCaptionSequenceLB.InsertEntry(pType->GetName());
    }

    if(pTOXDlg->IsTOXEditMode())
    {
        aTypeFT.Enable(sal_False);
        aTypeLB.Enable(sal_False);
    }
    TOXTypeHdl(&aTypeLB);
    CheckBoxHdl(&aAddStylesCB);
}
/*-- 14.06.99 13:10:52---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwTOXSelectTabPage::ActivatePage( const SfxItemSet& )
{
    //nothing to do
}
/*-- 14.06.99 13:11:00---------------------------------------------------

  -----------------------------------------------------------------------*/
int SwTOXSelectTabPage::DeactivatePage( SfxItemSet* pSet )
{
    if(pSet)
        pSet->Put(SfxUInt16Item(FN_PARAM_TOX_TYPE,
            (sal_uInt16)(long)aTypeLB.GetEntryData( aTypeLB.GetSelectEntryPos() )));
    sal_uInt16 nUserData = (sal_uInt16)(long)aTypeLB.GetEntryData( aTypeLB.GetSelectEntryPos() );
    FillTOXDescription();
    return LEAVE_PAGE;
}

/* -----------------14.06.99 13:10-------------------

 --------------------------------------------------*/
SfxTabPage* SwTOXSelectTabPage::Create( Window* pParent, const SfxItemSet& rAttrSet)
{
    return new SwTOXSelectTabPage(pParent, rAttrSet);
}
/* -----------------14.06.99 13:10-------------------

 --------------------------------------------------*/
IMPL_LINK(SwTOXSelectTabPage, TOXTypeHdl,   ListBox*, pBox)
{
    SwMultiTOXTabDialog* pTOXDlg = (SwMultiTOXTabDialog*)GetTabDialog();
    if(!bFirstCall)
    {
        // save current values into the proper TOXDescription
        FillTOXDescription();
    }
    bFirstCall = sal_False;
    const long nType = (long)pBox->GetEntryData( pBox->GetSelectEntryPos() );
    CurTOXType eCurType = lcl_UserData2TOXTypes(nType);
    pTOXDlg->SetCurrentTOXType(eCurType);

    aAreaLB.Show(nType & (TO_CONTENT|TO_ILLUSTRATION|TO_USER|TO_INDEX|TO_TABLE|TO_OBJECT));
    aLevelFT.Show(nType & (TO_CONTENT));
    aLevelNF.Show(nType & (TO_CONTENT));
    aLevelFromChapterCB.Show(nType & (TO_USER));
    aAreaGB.Show(nType & (TO_CONTENT|TO_ILLUSTRATION|TO_USER|TO_INDEX|TO_TABLE|TO_OBJECT));

    aFromHeadingsCB.Show(nType & (TO_CONTENT));
    aChapterDlgPB.Show(nType & (TO_CONTENT));
    aAddStylesCB.Show(nType & (TO_CONTENT|TO_USER));
    aAddStylesPB.Show(nType & (TO_CONTENT|TO_USER));

    aFromTablesCB.Show(nType & (TO_USER));
    aFromFramesCB.Show(nType & (TO_USER));
    aFromGraphicsCB.Show(nType & (TO_USER));
    aFromOLECB.Show(nType & (TO_USER));

    aFromCaptionsRB.Show(nType & (TO_ILLUSTRATION|TO_TABLE));
    aFromObjectNamesRB.Show(nType & (TO_ILLUSTRATION|TO_TABLE));

    aTOXMarksCB.Show(nType & (TO_CONTENT|TO_USER));

    aCreateFromGB.Show(nType & (TO_CONTENT|TO_ILLUSTRATION|TO_USER|TO_TABLE));
    aCaptionSequenceFT.Show(nType & (TO_ILLUSTRATION|TO_TABLE));
    aCaptionSequenceLB.Show(nType & (TO_ILLUSTRATION|TO_TABLE));
    aDisplayTypeFT.Show(nType & (TO_ILLUSTRATION|TO_TABLE));
    aDisplayTypeLB.Show(nType & (TO_ILLUSTRATION|TO_TABLE));

    aSequenceCB.Show(nType & TO_AUTHORITIES);
    aBracketFT.Show(nType & TO_AUTHORITIES);
    aBracketLB.Show(nType & TO_AUTHORITIES);
    aAuthorityFormatGB.Show(nType & TO_AUTHORITIES);

    String sStr;
    if(nType & TO_CONTENT)
    {
         Point aPos(aAddStylesPB.GetPosPixel());
        aPos.X() = aChapterDlgPB.GetPosPixel().X();
        aAddStylesPB.SetPosPixel(aPos);
    }
    else if( nType & TO_ILLUSTRATION )
        aCaptionSequenceLB.SelectEntry( GetDocPoolNm( RES_POOLCOLL_LABEL_ABB, sStr ));
    else if( nType & TO_TABLE )
        aCaptionSequenceLB.SelectEntry( GetDocPoolNm( RES_POOLCOLL_LABEL_TABLE, sStr ));
    else if( nType & TO_USER )
    {
        aAddStylesCB.SetText(sAddStyleUser);
        // move left!
         Point aPos(aAddStylesPB.GetPosPixel());
        aPos.X() = aChapterDlgPB.GetPosPixel().X();
        aPos.X() -= 2 * aAddStylesPB.GetSizePixel().Width();
        aAddStylesPB.SetPosPixel(aPos);
    }

    aCollectSameCB.Show(nType & TO_INDEX);
    aUseFFCB.Show(nType & TO_INDEX);
    aUseDashCB.Show(nType & TO_INDEX);
    aCaseSensitiveCB.Show(nType & TO_INDEX);
    aInitialCapsCB.Show(nType & TO_INDEX);
    aKeyAsEntryCB.Show(nType & TO_INDEX);
    aFromFileCB.Show(nType & TO_INDEX);
    aAutoMarkPB.Show(nType & TO_INDEX);
//  aCreateAutoMarkPB.Show(nType &TO_INDEX);
//  aEditAutoMarkPB.Show(nType & TO_INDEX);

    aIdxOptionsGB.Show(nType & TO_INDEX);

    //object index
    aFromObjCLB.Show(nType & TO_OBJECT);
    aFromObjGB.Show(nType & TO_OBJECT);

    //move controls
    aAddStylesCB.SetPosPixel(nType & TO_USER ? aCBLeftPos1 : aCBLeftPos2);
 Point aPBPos(aAddStylesPB.GetPosPixel());
    aPBPos.Y() = nType & TO_USER ? aCBLeftPos1.Y() : aCBLeftPos2.Y();
    aAddStylesPB.SetPosPixel(aPBPos);
    aTOXMarksCB.SetPosPixel(nType & TO_USER ? aCBLeftPos2 : aCBLeftPos3);
    //set control values from the proper TOXDescription
    {
        ApplyTOXDescription();
    }
    ModifyHdl(0);
    return 0;
}
/* -----------------30.11.99 12:48-------------------

 --------------------------------------------------*/
IMPL_LINK(SwTOXSelectTabPage, ModifyHdl, void*, EMPTYARG)
{
    SwMultiTOXTabDialog* pTOXDlg = (SwMultiTOXTabDialog*)GetTabDialog();
    if(pTOXDlg)
    {
        FillTOXDescription();
        pTOXDlg->CreateOrUpdateExample(pTOXDlg->GetCurrentTOXType().eType, TOX_PAGE_SELECT);
    }
    return 0;
}
/* -----------------05.07.99 10:13-------------------

 --------------------------------------------------*/
IMPL_LINK(SwTOXSelectTabPage, CheckBoxHdl,  CheckBox*, pBox )
{
    SwMultiTOXTabDialog* pTOXDlg = (SwMultiTOXTabDialog*)GetTabDialog();
    const CurTOXType aCurType = pTOXDlg->GetCurrentTOXType();
    if(TOX_CONTENT == aCurType.eType)
    {
        //at least one of the three CheckBoxes must be checked
        if(!aAddStylesCB.IsChecked() && !aFromHeadingsCB.IsChecked() && !aTOXMarksCB.IsChecked())
        {
            //TODO: InfoBox?
            pBox->Check(sal_True);
        }
        aAddStylesPB.Enable(aAddStylesCB.IsChecked());
        aChapterDlgPB.Enable(aFromHeadingsCB.IsChecked());
    }
    if(TOX_USER == aCurType.eType)
    {
        aAddStylesPB.Enable(aAddStylesCB.IsChecked());
    }
    else if(TOX_INDEX == aCurType.eType)
    {
        aAutoMarkPB.Enable(aFromFileCB.IsChecked());
//      aCreateAutoMarkPB.Enable(aFromFileCB.IsChecked());
//      aEditAutoMarkPB.Enable(aFromFileCB.IsChecked() && sAutoMarkURL.Len());

        aUseFFCB.Enable(aCollectSameCB.IsChecked() && !aUseDashCB.IsChecked());
        aUseDashCB.Enable(aCollectSameCB.IsChecked() && !aUseFFCB.IsChecked());
        aCaseSensitiveCB.Enable(aCollectSameCB.IsChecked());
    }
    ModifyHdl(0);
    return 0;
};
/* -----------------14.07.99 14:21-------------------

 --------------------------------------------------*/
IMPL_LINK(SwTOXSelectTabPage, RadioButtonHdl, RadioButton*, pButton )
{
    sal_Bool bEnable = aFromCaptionsRB.IsChecked();
    aCaptionSequenceFT.Enable(bEnable);
    aCaptionSequenceLB.Enable(bEnable);
    aDisplayTypeFT.Enable(bEnable);
    aDisplayTypeLB.Enable(bEnable);
    ModifyHdl(0);
    return 0;
}
/* -----------------14.06.99 13:10-------------------

 --------------------------------------------------*/
IMPL_LINK(SwTOXSelectTabPage, TOXAreaHdl,   ListBox*, pBox)
{
    DBG_WARNING("not implemented")
    switch((long)pBox->GetEntryData( pBox->GetSelectEntryPos() ))
    {
        case AREA_DOCUMENT  : break;
        case AREA_CHAPTER   : break;
    }
    return 0;
}
/* -----------------14.06.99 13:10-------------------

 --------------------------------------------------*/
IMPL_LINK(SwTOXSelectTabPage, ChapterHdl,   PushButton*, pButton)
{
    SwMultiTOXTabDialog* pTOXDlg = (SwMultiTOXTabDialog*)GetTabDialog();
    SwWrtShell& rSh = pTOXDlg->GetWrtShell();

    SfxItemSet aTmp(rSh.GetView().GetPool(), FN_PARAM_1, FN_PARAM_1);
    SwOutlineTabDialog* pDlg = new SwOutlineTabDialog(pButton, &aTmp, rSh);
    if(RET_OK == pDlg->Execute())
    {
        CurTOXType aCurType = pTOXDlg->GetCurrentTOXType();
        SwForm* pForm = ((SwMultiTOXTabDialog*)GetTabDialog())->GetForm(aCurType);
        // jetzt muss ueberprueft werden, ob dem sdbcx::Index Ueberschriftenvorlagen
        // zugewiesen wurden
        String sStr;
        for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
        {
            sal_Bool bNum = !SwMultiTOXTabDialog::IsNoNum(rSh, pForm->GetTemplate( i + 1 ));
            if(bNum)
            {
                //es gibt getrennte Resourcebereiche fuer die Inhaltsverzeichnisse
                if(i < 5)
                    GetDocPoolNm( RES_POOLCOLL_TOX_CNTNT1 + i, sStr );
                else
                    GetDocPoolNm( RES_POOLCOLL_TOX_CNTNT6 + i - 5, sStr );
                pForm->SetTemplate( i + 1, sStr );
            }
        }

    }
    delete pDlg;
    return 0;
}
/* -----------------14.06.99 13:10-------------------

 --------------------------------------------------*/
IMPL_LINK(SwTOXSelectTabPage, AddStylesHdl, PushButton*, pButton)
{
    SwAddStylesDlg_Impl* pDlg = new SwAddStylesDlg_Impl(pButton,
        ((SwMultiTOXTabDialog*)GetTabDialog())->GetWrtShell(),
        aStyleArr);
    pDlg->Execute();
    delete pDlg;
    ModifyHdl(0);
    return 0;
}
/* -----------------------------19.01.00 10:59--------------------------------

 ---------------------------------------------------------------------------*/

IMPL_LINK(SwTOXSelectTabPage, MenuEnableHdl, Menu*, pMenu)
{
    pMenu->EnableItem(MN_AUTOMARK_EDIT, sAutoMarkURL.Len());
    return 0;
}

IMPL_LINK(SwTOXSelectTabPage, MenuExecuteHdl, Menu*, pMenu)
{
    const String sSaveAutoMarkURL = sAutoMarkURL;
    switch(pMenu->GetCurItemId())
    {
        case  MN_AUTOMARK_OPEN:
            sAutoMarkURL = lcl_CreateAutoMarkFileDlg( &aAutoMarkPB,
                                    sAutoMarkURL, sAutoMarkType, sal_True);
        break;
        case  MN_AUTOMARK_NEW :
            sAutoMarkURL = lcl_CreateAutoMarkFileDlg( &aAutoMarkPB,
                                    sAutoMarkURL, sAutoMarkType, sal_False);
            if( !sAutoMarkURL.Len() )
                break;
        //no break
        case  MN_AUTOMARK_EDIT:
        {
            sal_Bool bNew = pMenu->GetCurItemId()== MN_AUTOMARK_NEW;
            SwAutoMarkDlg_Impl* pAutoMarkDlg = new SwAutoMarkDlg_Impl(
                    &aAutoMarkPB, sAutoMarkURL, sAutoMarkType, bNew );

            if( RET_OK != pAutoMarkDlg->Execute() && bNew )
                sAutoMarkURL = sSaveAutoMarkURL;
            delete pAutoMarkDlg;

            sAutoMarkURL = URIHelper::SmartRelToAbs( sAutoMarkURL );
        }
        break;
    }
    return 0;
}

/* -----------------16.06.99 10:46-------------------

 --------------------------------------------------*/
class SwTOXEdit : public Edit
{
    SwFormToken aFormToken;
    Link        aPrevNextControlLink;
    Link        aGetFocusLink;
       sal_Bool     bNextControl;
    SwTokenWindow* m_pParent;
public:
    SwTOXEdit( Window* pParent, SwTokenWindow* pTokenWin,
                const SwFormToken& aToken)
        : Edit( pParent, WB_BORDER|WB_TABSTOP|WB_CENTER),
        bNextControl(sal_False),
        aFormToken(aToken),
        m_pParent( pTokenWin )
    {
        SetHelpId( HID_TOX_ENTRY_EDIT );
    }

    virtual void    KeyInput( const KeyEvent& rKEvt );
    virtual void    GetFocus();
    virtual void    RequestHelp( const HelpEvent& rHEvt );

    sal_Bool    IsNextControl() const {return bNextControl;}
    void SetPrevNextLink( const Link& rLink )   {aPrevNextControlLink = rLink;}
    void SetGetFocusLink(const Link& rLink)     {aGetFocusLink = rLink;}

    const SwFormToken&  GetFormToken()
        {
            aFormToken.sText = GetText();
            return aFormToken;
        }

    void    SetCharStyleName(const String& rSet, sal_uInt16 nPoolId)
        {
            aFormToken.sCharStyleName = rSet;
            aFormToken.nPoolId = nPoolId;
        }

    void    AdjustSize();
};

//---------------------------------------------------
void    SwTOXEdit::RequestHelp( const HelpEvent& rHEvt )
{
    if(!m_pParent->CreateQuickHelp(this, aFormToken, rHEvt))
        Edit::RequestHelp(rHEvt);
}
//---------------------------------------------------
void    SwTOXEdit::KeyInput( const KeyEvent& rKEvt )
{
    const Selection& rSel = GetSelection();
    sal_uInt16 nTextLen = GetText().Len();
    if(rSel.A() == rSel.B() &&
        !rSel.A() || rSel.A() == nTextLen )
    {
        sal_Bool bCall = sal_False;
        KeyCode aCode = rKEvt.GetKeyCode();
        if(aCode.GetCode() == KEY_RIGHT && rSel.A() == nTextLen)
        {
            bNextControl = sal_True;
            bCall = sal_True;
        }
        else if(aCode.GetCode() == KEY_LEFT && !rSel.A() )
        {
            bNextControl = sal_False;
            bCall = sal_True;
        }

        if(bCall && aPrevNextControlLink.IsSet())
            aPrevNextControlLink.Call(this);

    }
    Edit::KeyInput(rKEvt);
}
/* -----------------16.07.99 12:41-------------------

 --------------------------------------------------*/
void SwTOXEdit::AdjustSize()
{
     Size aSize(GetSizePixel());
     Size aTextSize(GetTextWidth(GetText()), GetTextHeight());
    aTextSize = LogicToPixel(aTextSize);
    aSize.Width() = aTextSize.Width() + EDIT_MINWIDTH;
    SetSizePixel(aSize);
}

//---------------------------------------------------
void    SwTOXEdit::GetFocus()
{
    if(aGetFocusLink.IsSet())
        aGetFocusLink.Call(this);
    Edit::GetFocus();
}

//---------------------------------------------------
//---------------------------------------------------
class SwTOXButton : public PushButton
{
    SwFormToken aFormToken;
    Link        aPrevNextControlLink;
    Link        aGetFocusLink;
    sal_Bool        bNextControl;
    SwTokenWindow* m_pParent;
public:
    SwTOXButton( Window* pParent, SwTokenWindow* pTokenWin,
                const SwFormToken& rToken)
        : PushButton(pParent, WB_BORDER|WB_TABSTOP),
        bNextControl(sal_False),
        aFormToken(rToken),
        m_pParent(pTokenWin)
    {
        SetHelpId(HID_TOX_ENTRY_BUTTON);
    }

    virtual void    KeyInput( const KeyEvent& rKEvt );
    virtual void    GetFocus();
    virtual void    RequestHelp( const HelpEvent& rHEvt );

    sal_Bool IsNextControl() const          {return bNextControl;}
    void SetPrevNextLink(const Link& rLink) {aPrevNextControlLink = rLink;}
    void SetGetFocusLink(const Link& rLink) {aGetFocusLink = rLink;}
    const SwFormToken& GetFormToken() const {return aFormToken;}

    void SetCharStyleName(const String& rSet, sal_uInt16 nPoolId)
        {
            aFormToken.sCharStyleName = rSet;
            aFormToken.nPoolId = nPoolId;
        }

    void SetTabPosition(SwTwips nSet)
        { aFormToken.nTabStopPosition = nSet; }

    void SetFillChar( sal_Unicode cSet )
        { aFormToken.cTabFillChar = cSet; }

    void SetTabAlign(SvxTabAdjust eAlign)
         {  aFormToken.eTabAlign = eAlign;}

    void SetChapterInfo(sal_uInt16 nSet) { aFormToken.nChapterFormat = nSet;}
    sal_uInt16 GetChapterInfo() const{ return aFormToken.nChapterFormat;}

    void SetLinkEnd()
        {
            DBG_ASSERT(TOKEN_LINK_START == aFormToken.eTokenType,
                                    "call SetLinkEnd for link start only!")
            aFormToken.eTokenType = TOKEN_LINK_END;
            aFormToken.sText.AssignAscii(SwForm::aFormLinkEnd);
            SetText(aFormToken.sText);
        }
    void SetLinkStart()
        {
            DBG_ASSERT(TOKEN_LINK_END == aFormToken.eTokenType,
                                    "call SetLinkStart for link start only!")
            aFormToken.eTokenType = TOKEN_LINK_START;
            aFormToken.sText.AssignAscii(SwForm::aFormLinkStt);
            SetText(aFormToken.sText);
        }
};

//---------------------------------------------------
void    SwTOXButton::KeyInput( const KeyEvent& rKEvt )
{
    sal_Bool bCall = sal_False;
    KeyCode aCode = rKEvt.GetKeyCode();
    if(aCode.GetCode() == KEY_RIGHT)
    {
        bNextControl = sal_True;
        bCall = sal_True;
    }
    else if(aCode.GetCode() == KEY_LEFT  )
    {
        bNextControl = sal_False;
        bCall = sal_True;
    }
    else if(aCode.GetCode() == KEY_DELETE)
    {
        m_pParent->RemoveControl(this, sal_True);
        //this is invalid here
        return;
    }
    if(bCall && aPrevNextControlLink.IsSet())
            aPrevNextControlLink.Call(this);
    else
        PushButton::KeyInput(rKEvt);
}
//---------------------------------------------------
void    SwTOXButton::GetFocus()
{
    if(aGetFocusLink.IsSet())
        aGetFocusLink.Call(this);
    PushButton::GetFocus();
}
//---------------------------------------------------
void    SwTOXButton::RequestHelp( const HelpEvent& rHEvt )
{
    if(!m_pParent->CreateQuickHelp(this, aFormToken, rHEvt))
        Button::RequestHelp(rHEvt);
}
/* -----------------------------23.12.99 14:28--------------------------------

 ---------------------------------------------------------------------------*/
SwIdxTreeListBox::SwIdxTreeListBox(SwTOXEntryTabPage* pPar, const ResId& rResId) :
        SvTreeListBox(pPar, rResId),
        pParent(pPar)
{
}
/* -----------------------------23.12.99 14:19--------------------------------

 ---------------------------------------------------------------------------*/
void    SwIdxTreeListBox::RequestHelp( const HelpEvent& rHEvt )
{
    if( rHEvt.GetMode() & HELPMODE_QUICK )
    {
     Point aPos( ScreenToOutputPixel( rHEvt.GetMousePosPixel() ));
        SvLBoxEntry* pEntry = GetEntry( aPos );
        if( pEntry )
        {
            sal_uInt16 nLevel = GetModel()->GetAbsPos(pEntry);
            String sEntry = pParent->GetLevelHelp(++nLevel);
            if('*' == sEntry)
                sEntry = GetEntryText(pEntry);
            if(sEntry.Len())
            {
                SvLBoxTab* pTab;
                SvLBoxItem* pItem = GetItem( pEntry, aPos.X(), &pTab );
                if( pItem && SV_ITEM_ID_LBOXSTRING == pItem->IsA())
                {
                    aPos = GetEntryPos( pEntry );

                    aPos.X() = GetTabPos( pEntry, pTab );
                 Size aSize( pItem->GetSize( this, pEntry ) );

                    if((aPos.X() + aSize.Width()) > GetSizePixel().Width())
                        aSize.Width() = GetSizePixel().Width() - aPos.X();

                    aPos = OutputToScreenPixel(aPos);
                     Rectangle aItemRect( aPos, aSize );
                    Help::ShowQuickHelp( this, aItemRect, sEntry,
                            QUICKHELP_LEFT|QUICKHELP_VCENTER );
                }
            }
        }
    }
    else
        SvTreeListBox::RequestHelp(rHEvt);
}
//---------------------------------------------------
SwTOXEntryTabPage::SwTOXEntryTabPage(Window* pParent, const SfxItemSet& rAttrSet) :
        SfxTabPage(pParent, SW_RES(TP_TOX_ENTRY), rAttrSet),
    aLevelLB(this,              ResId(LB_LEVEL              )),
    aLevelFT(this,              ResId(FT_LEVEL              )),
    aTokenWIN(this,             ResId(WIN_TOKEN             )),
    aAllLevelsPB(this,          ResId(PB_ALL_LEVELS         )),
    aEntryNoPB(this,            ResId(PB_ENTRYNO            )),
    aEntryPB(this,              ResId(PB_ENTRY              )),
    aChapterInfoPB(this,        ResId(PB_CHAPTERINFO        )),
    aPageNoPB(this,             ResId(PB_PAGENO             )),
    aTabPB(this,                ResId(PB_TAB                )),
    aHyperLinkPB(this,          ResId(PB_HYPERLINK          )),
    aAuthFieldsLB(this,         ResId(LB_AUTHFIELD          )),
    aAuthInsertPB(this,         ResId(PB_AUTHINSERT         )),
    aAuthRemovePB(this,         ResId(PB_AUTHREMOVE         )),
    aCharStyleFT(this,          ResId(FT_CHARSTYLE          )),
    aCharStyleLB(this,          ResId(LB_CHARSTYLE          )),
    aEditStylePB(this,          ResId(PB_EDITSTYLE          )),
    aFillCharFT(this,           ResId(FT_FILLCHAR           )),
    aFillCharCB(this,           ResId(CB_FILLCHAR           )),
    aChapterEntryFT(this,       ResId(FT_CHAPTERENTRY       )),
    aChapterEntryLB(this,       ResId(LB_CHAPTERENTRY       )),
    aTabPosFT(this,             ResId(FT_TABPOS             )),
    aTabPosMF(this,             ResId(MF_TABPOS             )),
    aAutoRightCB(this,          ResId(CB_AUTORIGHT          )),
    aEntryGB(this,              ResId(GB_ENTRY              )),
    aRelToStyleCB(this,         ResId(CB_RELTOSTYLE         )),
    aMainEntryStyleFT(this,     ResId(FT_MAIN_ENTRY_STYLE)),
    aMainEntryStyleLB(this,     ResId(LB_MAIN_ENTRY_STYLE)),
    aAlphaDelimCB(this,         ResId(CB_ALPHADELIM         )),
    aCommaSeparatedCB(this,     ResId(CB_COMMASEPARATED     )),
    aFormatGB(this,             ResId(GB_FORMAT             )),

    aSortDocPosRB(this,         ResId(RB_DOCPOS             )),
    aSortContentRB(this,        ResId(RB_SORTCONTENT        )),
    aSortingGB(this,            ResId(GB_SORTING            )),

    aFirstKeyFT(this,           ResId(FT_FIRSTKEY           )),
    aFirstKeyLB(this,           ResId(LB_FIRSTKEY           )),
    aSecondKeyFT(this,          ResId(FT_SECONDKEY          )),
    aSecondKeyLB(this,          ResId(LB_SECONDKEY          )),
    aThirdKeyFT(this,           ResId(FT_THIRDDKEY          )),
    aThirdKeyLB(this,           ResId(LB_THIRDKEY           )),
    aFirstSortUpRB(this,        ResId(RB_SORTUP1            )),
    aFirstSortDownRB(this,      ResId(RB_SORTDOWN1          )),
    aSecondSortUpRB(this,       ResId(RB_SORTUP2            )),
    aSecondSortDownRB(this,     ResId(RB_SORTDOWN2          )),
    aThirdSortUpRB(this,        ResId(RB_SORTUP3            )),
    aThirdSortDownRB(this,      ResId(RB_SORTDOWN3          )),
    aSortKeyGB(this,            ResId(GB_SORTKEY            )),
    sNoCharStyle(               ResId(STR_NO_CHAR_STYLE)),
    sNoCharSortKey(             ResId(STR_NOSORTKEY     )),
    sDelimStr(                  ResId(STR_DELIM)),
    sAuthTypeStr(               ResId(ST_AUTHTYPE)),
    pCurrentForm(0),
    bInLevelHdl(sal_False)
{
    FreeResource();

    sLevelStr = aLevelFT.GetText();

    aLevelLB.SetWindowBits( WB_HSCROLL );
    aLevelLB.SetSpaceBetweenEntries(0);
    aLevelLB.SetSelectionMode( SINGLE_SELECTION );
    aLevelLB.SetHighlightRange();   // select full width
    aLevelLB.SetHelpId(HID_INSERT_INDEX_ENTRY_LEVEL_LB);
    aLevelLB.Show();

    aLastTOXType.eType = (TOXTypes)USHRT_MAX;
    aLastTOXType.nIndex = 0;
    //aLevelGBSize = aLevelGB.GetSizePixel();
    aLevelGBSize = aLevelFT.GetSizePixel();

    SetExchangeSupport();
    aEntryNoPB.SetClickHdl(LINK(this, SwTOXEntryTabPage, InsertTokenHdl));
    aEntryPB.SetClickHdl(LINK(this, SwTOXEntryTabPage, InsertTokenHdl));
    aChapterInfoPB.SetClickHdl(LINK(this, SwTOXEntryTabPage, InsertTokenHdl));
    aPageNoPB.SetClickHdl(LINK(this, SwTOXEntryTabPage, InsertTokenHdl));
    aTabPB.SetClickHdl(LINK(this, SwTOXEntryTabPage, InsertTokenHdl));
    aHyperLinkPB.SetClickHdl(LINK(this, SwTOXEntryTabPage, InsertTokenHdl));
    aEditStylePB.SetClickHdl(LINK(this, SwTOXEntryTabPage, EditStyleHdl));
    aLevelLB.SetSelectHdl(LINK(this, SwTOXEntryTabPage, LevelHdl));
    aTokenWIN.SetButtonSelectedHdl(LINK(this, SwTOXEntryTabPage, TokenSelectedHdl));
    aTokenWIN.SetModifyHdl(LINK(this, SwTOXEntryTabPage, ModifyHdl));
    aCharStyleLB.SetSelectHdl(LINK(this, SwTOXEntryTabPage, StyleSelectHdl));
    aCharStyleLB.InsertEntry(sNoCharStyle);
    aChapterEntryLB.SetSelectHdl(LINK(this, SwTOXEntryTabPage, ChapterInfoHdl));
    aTabPosMF.SetModifyHdl(LINK(this, SwTOXEntryTabPage, TabPosHdl));
    aFillCharCB.SetModifyHdl(LINK(this, SwTOXEntryTabPage, FillCharHdl));
    aAutoRightCB.SetClickHdl(LINK(this, SwTOXEntryTabPage, AutoRightHdl));
    aAuthInsertPB.SetClickHdl(LINK(this, SwTOXEntryTabPage, RemoveInsertAuthHdl));
    aAuthRemovePB.SetClickHdl(LINK(this, SwTOXEntryTabPage, RemoveInsertAuthHdl));
    aSortDocPosRB.SetClickHdl(LINK(this, SwTOXEntryTabPage, SortKeyHdl));
    aSortContentRB.SetClickHdl(LINK(this, SwTOXEntryTabPage, SortKeyHdl));
    aAllLevelsPB.SetClickHdl(LINK(this, SwTOXEntryTabPage, AllLevelsHdl));

    aAlphaDelimCB.SetClickHdl(LINK(this, SwTOXEntryTabPage, ModifyHdl));
    aCommaSeparatedCB.SetClickHdl(LINK(this, SwTOXEntryTabPage, ModifyHdl));
    aRelToStyleCB.SetClickHdl(LINK(this, SwTOXEntryTabPage, ModifyHdl));

    aSortDocPosRB.Check();

    aFillCharCB.SetMaxTextLen(1);
    aFillCharCB.InsertEntry(' ');
    aFillCharCB.InsertEntry('.');
    aFillCharCB.InsertEntry('-');
    aFillCharCB.InsertEntry('_');

    aButtonPositions[0] = aEntryNoPB.GetPosPixel();
    aButtonPositions[1] = aEntryPB.GetPosPixel();
    aButtonPositions[2] = aChapterInfoPB.GetPosPixel();
    aButtonPositions[3] = aPageNoPB.GetPosPixel();
    aButtonPositions[4] = aTabPB.GetPosPixel();

    aRelToStylePos = aRelToStyleCB.GetPosPixel();
    aRelToStyleIdxPos = aRelToStylePos;
    aRelToStyleIdxPos.Y() +=
        2 * (aAlphaDelimCB.GetPosPixel().Y() - aRelToStyleIdxPos.Y());
    aEditStylePB.Enable(sal_False);

    //fill the types in
    sal_uInt32 i;
    for( i = 0; i < AUTH_FIELD_END; i++)
    {
        String sTmp(SW_RES(STR_AUTH_FIELD_START + i));
        sTmp.EraseAllChars('~');
        sal_uInt16 nPos = aAuthFieldsLB.InsertEntry(sTmp);
        aAuthFieldsLB.SetEntryData(nPos, (void*)(i));
    }
    sal_uInt16 nPos = aFirstKeyLB.InsertEntry(sNoCharSortKey);
    aFirstKeyLB.SetEntryData(nPos, (void*)(USHRT_MAX));
    nPos = aSecondKeyLB.InsertEntry(sNoCharSortKey);
    aSecondKeyLB.SetEntryData(nPos, (void*)(USHRT_MAX));
    nPos = aThirdKeyLB.InsertEntry(sNoCharSortKey);
    aThirdKeyLB.SetEntryData(nPos, (void*)(USHRT_MAX));

    for( i = 0; i < AUTH_FIELD_END; i++)
    {
        String sTmp(aAuthFieldsLB.GetEntry(i));
        void* pEntryData = aAuthFieldsLB.GetEntryData(i);
        nPos = aFirstKeyLB.InsertEntry(sTmp);
        aFirstKeyLB.SetEntryData(nPos, pEntryData);
        nPos = aSecondKeyLB.InsertEntry(sTmp);
        aSecondKeyLB.SetEntryData(nPos, pEntryData);
        nPos = aThirdKeyLB.InsertEntry(sTmp);
        aThirdKeyLB.SetEntryData(nPos, pEntryData);
    }
    aFirstKeyLB.SelectEntryPos(0);
    aSecondKeyLB.SelectEntryPos(0);
    aThirdKeyLB.SelectEntryPos(0);

}
/* -----------------30.11.99 13:37-------------------
    pVoid is used as signal to change all levels of the example
 --------------------------------------------------*/
IMPL_LINK(SwTOXEntryTabPage, ModifyHdl, void*, pVoid)
{
    UpdateDescriptor();
    SwMultiTOXTabDialog* pTOXDlg = (SwMultiTOXTabDialog*)GetTabDialog();

    if(pTOXDlg)
    {
        sal_uInt16 nCurLevel = aLevelLB.GetModel()->GetAbsPos(aLevelLB.FirstSelected()) + 1;
        if(aLastTOXType.eType == TOX_CONTENT && pVoid)
            nCurLevel = USHRT_MAX;
        pTOXDlg->CreateOrUpdateExample(
            pTOXDlg->GetCurrentTOXType().eType, TOX_PAGE_ENTRY, nCurLevel);
    }
    return 0;
}

/*-- 16.06.99 10:47:33---------------------------------------------------

  -----------------------------------------------------------------------*/
SwTOXEntryTabPage::~SwTOXEntryTabPage()
{
}
/*-- 16.06.99 10:47:33---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Bool    SwTOXEntryTabPage::FillItemSet( SfxItemSet& )
{
    // nothing to do
    return sal_True;
}
/*-- 16.06.99 10:47:34---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwTOXEntryTabPage::Reset( const SfxItemSet& )
{
    SwMultiTOXTabDialog* pTOXDlg = (SwMultiTOXTabDialog*)GetTabDialog();
    const CurTOXType aCurType = pTOXDlg->GetCurrentTOXType();
    pCurrentForm = pTOXDlg->GetForm(aCurType);
    if(TOX_INDEX == aCurType.eType)
    {
        SwTOXDescription& rDesc = pTOXDlg->GetTOXDescription(aCurType);
        String sMainEntryCharStyle = rDesc.GetMainEntryCharStyle();
        if(sMainEntryCharStyle.Len())
        {
            if( LISTBOX_ENTRY_NOTFOUND ==
                    aMainEntryStyleLB.GetEntryPos(sMainEntryCharStyle))
                aMainEntryStyleLB.InsertEntry(
                        sMainEntryCharStyle);
            aMainEntryStyleLB.SelectEntry(sMainEntryCharStyle);
        }
        else
            aMainEntryStyleLB.SelectEntry(sNoCharStyle);
        aRelToStyleCB.Check(pCurrentForm->IsRelTabPos());
        aAlphaDelimCB.Check(rDesc.GetIndexOptions()&TOI_ALPHA_DELIMITTER);
    }
    aCommaSeparatedCB.Check(pCurrentForm->IsCommaSeparated());
}
/*-- 16.06.99 10:47:34---------------------------------------------------

  -----------------------------------------------------------------------*/
void lcl_ChgWidth(Window& rWin, long nDiff)
{
 Size aTempSz(rWin.GetSizePixel());
    aTempSz.Width() += nDiff;
    rWin.SetSizePixel(aTempSz);
}
/* ----------------------------------------------------------------------

  -----------------------------------------------------------------------*/
void lcl_ChgXPos(Window& rWin, long nDiff)
{
    Point aTempPos(rWin.GetPosPixel());
    aTempPos.X() += nDiff;
    rWin.SetPosPixel(aTempPos);
}
/* ----------------------------------------------------------------------

  -----------------------------------------------------------------------*/
void SwTOXEntryTabPage::ActivatePage( const SfxItemSet& rSet)
{
    SwMultiTOXTabDialog* pTOXDlg = (SwMultiTOXTabDialog*)GetTabDialog();
    const CurTOXType aCurType = pTOXDlg->GetCurrentTOXType();

    pCurrentForm = pTOXDlg->GetForm(aCurType);
    if( !( aLastTOXType == aCurType ))
    {
        BOOL bToxIsAuthorities = TOX_AUTHORITIES == aCurType.eType;
        BOOL bToxIsIndex =       TOX_INDEX == aCurType.eType;
        BOOL bToxIsContent =     TOX_CONTENT == aCurType.eType;

        aLevelLB.Clear();
        for(sal_uInt16 i = 1; i < pCurrentForm->GetFormMax(); i++)
        {
            if(bToxIsAuthorities)
                aLevelLB.InsertEntry( SwAuthorityFieldType::GetAuthTypeName(
                                            (ToxAuthorityType) (i - 1)) );
            else if( bToxIsIndex )
            {
                if(i == 1)
                    aLevelLB.InsertEntry( sDelimStr );
                else
                    aLevelLB.InsertEntry( String::CreateFromInt32(i - 1) );
            }
            else
                aLevelLB.InsertEntry(String::CreateFromInt32(i));
        }
        if(bToxIsAuthorities)
        {
            //
            SwWrtShell& rSh = pTOXDlg->GetWrtShell();
            const SwAuthorityFieldType* pFType = (const SwAuthorityFieldType*)
                                    rSh.GetFldType(RES_AUTHORITY, aEmptyStr);
            if(pFType)
            {
                if(pFType->IsSortByDocument())
                    aSortDocPosRB.Check();
                else
                {
                    aSortContentRB.Check();
                    sal_uInt16 nKeyCount = pFType->GetSortKeyCount();
                    if(0 < nKeyCount)
                    {
                        const SwTOXSortKey* pKey = pFType->GetSortKey(0);
                        aFirstKeyLB.SelectEntryPos(
                            aFirstKeyLB.GetEntryPos((void*)(sal_uInt32)pKey->eField));
                        aFirstSortUpRB.Check(pKey->bSortAscending);
                        aFirstSortDownRB.Check(!pKey->bSortAscending);
                    }
                    if(1 < nKeyCount)
                    {
                        const SwTOXSortKey* pKey = pFType->GetSortKey(1);
                        aSecondKeyLB.SelectEntryPos(
                            aSecondKeyLB.GetEntryPos((void*)(sal_uInt32)pKey->eField));
                        aSecondSortUpRB.Check(pKey->bSortAscending);
                        aSecondSortDownRB.Check(!pKey->bSortAscending);
                    }
                    if(2 < nKeyCount)
                    {
                        const SwTOXSortKey* pKey = pFType->GetSortKey(2);
                        aThirdKeyLB.SelectEntryPos(
                            aThirdKeyLB.GetEntryPos((void*)(sal_uInt32)pKey->eField));
                        aThirdSortUpRB.Check(pKey->bSortAscending);
                        aThirdSortDownRB.Check(!pKey->bSortAscending);
                    }
                }
            }
            SortKeyHdl(aSortDocPosRB.IsChecked() ? &aSortDocPosRB : &aSortContentRB);
            aLevelFT.SetText(sAuthTypeStr);
        }
        else
            aLevelFT.SetText(sLevelStr);

        long nDiff = 0;
        if( bToxIsAuthorities ? aLevelFT.GetSizePixel() == aLevelGBSize
                              : aLevelFT.GetSizePixel() != aLevelGBSize )
        {
            nDiff = aLevelGBSize.Width();
            if( !bToxIsAuthorities )
                nDiff *= -1;
        }

        if(nDiff)
        {
//          lcl_ChgWidth(aLevelGB, nDiff);
            lcl_ChgWidth(aLevelFT, nDiff);
            lcl_ChgWidth(aLevelLB, nDiff);
            lcl_ChgXPos(aCharStyleFT, nDiff);
            lcl_ChgXPos(aCharStyleLB, nDiff);
            lcl_ChgWidth(aCharStyleLB, -nDiff);
    //          lcl_ChgXPos(aEditStylePB, -nDiff);
            lcl_ChgXPos(aFillCharFT,  nDiff);
            lcl_ChgXPos(aFillCharCB,  nDiff);
            lcl_ChgXPos(aTabPosFT,   nDiff);
            lcl_ChgXPos(aTabPosMF,   nDiff);
            lcl_ChgXPos(aAutoRightCB, nDiff);
            lcl_ChgXPos(aAuthFieldsLB,   nDiff);
            lcl_ChgXPos(aAuthInsertPB,   nDiff);
            lcl_ChgXPos(aAuthRemovePB,   nDiff);
            lcl_ChgXPos(aTokenWIN,   nDiff);
            lcl_ChgWidth(aTokenWIN, -nDiff);
            lcl_ChgXPos(aSortDocPosRB,   nDiff);
            lcl_ChgXPos(aSortContentRB,      nDiff);
            lcl_ChgXPos(aFormatGB,  nDiff);
            lcl_ChgWidth(aFormatGB,     -nDiff);
            lcl_ChgXPos(aSortingGB, nDiff);
            lcl_ChgWidth(aSortingGB,    -nDiff);
            lcl_ChgXPos(aEntryGB,   nDiff);
            lcl_ChgWidth(aEntryGB,  -nDiff);
        }
        Link aLink = aLevelLB.GetSelectHdl();
        aLevelLB.SetSelectHdl(Link());
        aLevelLB.Select( aLevelLB.GetEntry( bToxIsIndex ? 1 : 0 ) );
        aLevelLB.SetSelectHdl(aLink);

        // sort token buttons
        aEntryNoPB.SetPosPixel(aButtonPositions[0]);
        aEntryPB.SetPosPixel(aButtonPositions[ bToxIsContent ? 1 : 0]);
        aChapterInfoPB.SetPosPixel(aButtonPositions[2]);
        aPageNoPB.SetPosPixel(aButtonPositions[3]);
        sal_uInt16 nBtPos = 1;
        if( bToxIsContent )
            nBtPos = 2;
        else if( bToxIsAuthorities )
            nBtPos = 4;
        aTabPB.SetPosPixel(aButtonPositions[nBtPos]);
        aHyperLinkPB.SetPosPixel(aButtonPositions[4]);

        //show or hide controls
        aAllLevelsPB.Show(      bToxIsContent );
        aEntryNoPB.Show(        bToxIsContent );
        aHyperLinkPB.Show(      bToxIsContent );
        aRelToStyleCB.Show(    !bToxIsAuthorities );
        aChapterInfoPB.Show(    bToxIsIndex );
        aEntryPB.Show(         !bToxIsAuthorities );
        aPageNoPB.Show(        !bToxIsAuthorities );
        aAuthFieldsLB.Show(     bToxIsAuthorities );
        aAuthInsertPB.Show(     bToxIsAuthorities );
        aAuthRemovePB.Show(     bToxIsAuthorities );
        aFormatGB.Show(        !bToxIsAuthorities );
        aSortDocPosRB.Show(     bToxIsAuthorities );
        aSortContentRB.Show(    bToxIsAuthorities );
        aSortingGB.Show(        bToxIsAuthorities );
        aFirstKeyFT.Show(       bToxIsAuthorities );
        aFirstKeyLB.Show(       bToxIsAuthorities );
        aSecondKeyFT.Show(      bToxIsAuthorities );
        aSecondKeyLB.Show(      bToxIsAuthorities );
        aThirdKeyFT.Show(       bToxIsAuthorities );
        aThirdKeyLB.Show(       bToxIsAuthorities );
        aSortKeyGB.Show(        bToxIsAuthorities );
        aFirstSortUpRB.Show(    bToxIsAuthorities );
        aFirstSortDownRB.Show(  bToxIsAuthorities );
        aSecondSortUpRB.Show(   bToxIsAuthorities );
        aSecondSortDownRB.Show( bToxIsAuthorities );
        aThirdSortUpRB.Show(    bToxIsAuthorities );
        aThirdSortDownRB.Show(  bToxIsAuthorities );

        aRelToStyleCB.SetPosPixel( bToxIsIndex ? aRelToStyleIdxPos
                                               : aRelToStylePos );

//      aRecalcTabCB.Show(  aCurType.eType == TOX_CONTENT);

        aMainEntryStyleFT.Show( bToxIsIndex );
        aMainEntryStyleLB.Show( bToxIsIndex );
        aAlphaDelimCB.Show(     bToxIsIndex );
        aCommaSeparatedCB.Show( bToxIsIndex );

        //Resizing
        if( TOX_CONTENT == aLastTOXType.eType|| bToxIsContent )
        {
         Point aTokenWinPos(aTokenWIN.GetPosPixel());
         Size aTokenWinSz(aTokenWIN.GetSizePixel());

            long nButtonWidth = aAllLevelsPB.GetSizePixel().Width();
            long nButtonXPos = aAllLevelsPB.GetPosPixel().X();
            long nTokenWinSize;
            if( bToxIsContent )
                nTokenWinSize = nButtonXPos - ( nButtonWidth / 13);
            else
                nTokenWinSize = nButtonXPos + nButtonWidth;
            nTokenWinSize -= aTokenWinPos.X();
            aTokenWinSz.Width() = nTokenWinSize;
            aTokenWIN.SetSizePixel(aTokenWinSz);
        }
    }
    aLastTOXType = aCurType;

    //invalidate PatternWindow
    aTokenWIN.Invalidate();
    LevelHdl(&aLevelLB);
}
/* -----------------30.11.99 15:04-------------------

 --------------------------------------------------*/
void SwTOXEntryTabPage::UpdateDescriptor()
{
    WriteBackLevel();
    SwMultiTOXTabDialog* pTOXDlg = (SwMultiTOXTabDialog*)GetTabDialog();
    SwTOXDescription& rDesc = pTOXDlg->GetTOXDescription(aLastTOXType);
    if(TOX_INDEX == aLastTOXType.eType)
    {
        String sTemp(aMainEntryStyleLB.GetSelectEntry());
        rDesc.SetMainEntryCharStyle(sNoCharStyle == sTemp ? aEmptyStr : sTemp);
        sal_uInt16 nIdxOptions = rDesc.GetIndexOptions() & ~TOI_ALPHA_DELIMITTER;
        if(aAlphaDelimCB.IsChecked())
            nIdxOptions |= TOI_ALPHA_DELIMITTER;
        rDesc.SetIndexOptions(nIdxOptions);
    }
    else if(TOX_AUTHORITIES == aLastTOXType.eType)
    {
        rDesc.SetSortByDocument(aSortDocPosRB.IsChecked());
        SwTOXSortKey aKey1, aKey2, aKey3;
        aKey1.eField = (ToxAuthorityField)(sal_uInt32)aFirstKeyLB.GetEntryData(
                                    aFirstKeyLB.GetSelectEntryPos());
        aKey1.bSortAscending = aFirstSortUpRB.IsChecked();
        aKey2.eField = (ToxAuthorityField)(sal_uInt32)aSecondKeyLB.GetEntryData(
                                    aSecondKeyLB.GetSelectEntryPos());
        aKey2.bSortAscending = aSecondSortUpRB.IsChecked();
        aKey3.eField = (ToxAuthorityField)(sal_uInt32)aThirdKeyLB.GetEntryData(
                                aThirdKeyLB.GetSelectEntryPos());
        aKey3.bSortAscending = aThirdSortUpRB.IsChecked();


        rDesc.SetSortKeys(aKey1, aKey2, aKey3);
    }
    SwForm* pCurrentForm = pTOXDlg->GetForm(aLastTOXType);
    if(aRelToStyleCB.IsVisible())
    {
        pCurrentForm->SetRelTabPos(aRelToStyleCB.IsChecked());
    }
    if(aCommaSeparatedCB.IsVisible())
        pCurrentForm->SetCommaSeparated(aCommaSeparatedCB.IsChecked());
}
/*-- 16.06.99 10:47:34---------------------------------------------------

  -----------------------------------------------------------------------*/
int SwTOXEntryTabPage::DeactivatePage( SfxItemSet* pSet)
{
    UpdateDescriptor();
    return LEAVE_PAGE;
}
/*-- 16.06.99 10:47:34---------------------------------------------------

  -----------------------------------------------------------------------*/
SfxTabPage* SwTOXEntryTabPage::Create( Window* pParent,     const SfxItemSet& rAttrSet)
{
    return new SwTOXEntryTabPage(pParent, rAttrSet);
}
/*-- 16.06.99 10:47:35---------------------------------------------------

  -----------------------------------------------------------------------*/
IMPL_LINK(SwTOXEntryTabPage, EditStyleHdl, PushButton*, pBtn)
{
    if( LISTBOX_ENTRY_NOTFOUND != aCharStyleLB.GetSelectEntryPos())
    {
        SfxStringItem aStyle(SID_STYLE_EDIT, aCharStyleLB.GetSelectEntry());
        SfxUInt16Item aFamily(SID_STYLE_FAMILY, SFX_STYLE_FAMILY_CHAR);
        // TODO: WrtShell?
//      SwPtrItem aShell(FN_PARAM_WRTSHELL, pWrtShell);
        Window* pDefDlgParent = Application::GetDefDialogParent();
        Application::SetDefDialogParent( pBtn );
        ((SwMultiTOXTabDialog*)GetTabDialog())->GetWrtShell().
        GetView().GetViewFrame()->GetDispatcher()->Execute(
        SID_STYLE_EDIT, SFX_CALLMODE_SYNCHRON|SFX_CALLMODE_MODAL,
            &aStyle, &aFamily/*, &aShell*/, 0L);
        Application::SetDefDialogParent( pDefDlgParent );
    }
    return 0;
}
/* -----------------04.10.99 11:34-------------------

 --------------------------------------------------*/
IMPL_LINK(SwTOXEntryTabPage, RemoveInsertAuthHdl, PushButton*, pButton)
{
    sal_Bool bInsert = pButton == &aAuthInsertPB;
    if(bInsert)
    {
        sal_uInt16 nSelPos = aAuthFieldsLB.GetSelectEntryPos();
        String sToInsert(aAuthFieldsLB.GetSelectEntry());
        SwFormToken aInsert(TOKEN_AUTHORITY);
        aInsert.nAuthorityField = (sal_uInt16)(sal_uInt32)aAuthFieldsLB.GetEntryData(nSelPos);
        aTokenWIN.InsertAtSelection(String::CreateFromAscii(
                                            SwForm::aFormAuth), aInsert);
        aAuthFieldsLB.RemoveEntry(sToInsert);
        aAuthFieldsLB.SelectEntryPos( nSelPos ? nSelPos - 1 : 0);
    }
    else
    {
        Control* pCtrl = aTokenWIN.GetActiveControl();
        DBG_ASSERT(WINDOW_EDIT != pCtrl->GetType(), "Remove should be disabled")
        if( WINDOW_EDIT != pCtrl->GetType() )
        {
            //fill it into the ListBox
            const SwFormToken& rToken = ((SwTOXButton*)pCtrl)->GetFormToken();
            PreTokenButtonRemoved(rToken);
            aTokenWIN.RemoveControl((SwTOXButton*)pCtrl);
        }
    }
    ModifyHdl(0);
    return 0;
}
/* -----------------------------17.01.00 13:44--------------------------------

 ---------------------------------------------------------------------------*/
void SwTOXEntryTabPage::PreTokenButtonRemoved(const SwFormToken& rToken)
{
    //fill it into the ListBox
    sal_uInt32 nData = rToken.nAuthorityField;
    String sTemp(SW_RES(STR_AUTH_FIELD_START + nData));
    sTemp.EraseAllChars('~');
    sal_uInt16 nPos = aAuthFieldsLB.InsertEntry(sTemp);
    aAuthFieldsLB.SetEntryData(nPos, (void*)(nData));
}
/*-- 16.06.99 10:47:35---------------------------------------------------

  -----------------------------------------------------------------------*/
IMPL_LINK(SwTOXEntryTabPage, InsertTokenHdl, PushButton*, pBtn)
{
    String sText;
    FormTokenType eTokenType;
    if(pBtn == &aEntryNoPB)
    {
        sText.AssignAscii(SwForm::aFormEntryNum);
        eTokenType = TOKEN_ENTRY_NO;
    }
    else if(pBtn == &aEntryPB)
    {
        if( TOX_CONTENT == pCurrentForm->GetTOXType() )
        {
            sText.AssignAscii( SwForm::aFormEntryTxt );
            eTokenType = TOKEN_ENTRY_TEXT;
        }
        else
        {
            sText.AssignAscii( SwForm::aFormEntry);
            eTokenType = TOKEN_ENTRY;
        }
    }
    else if(pBtn == &aChapterInfoPB)
    {
        sText.AssignAscii( SwForm::aFormChapterMark);
        eTokenType = TOKEN_CHAPTER_INFO;
    }
    else if(pBtn == &aPageNoPB)
    {
        sText.AssignAscii(SwForm::aFormPageNums);
        eTokenType = TOKEN_PAGE_NUMS;
    }
    else if(pBtn == &aHyperLinkPB)
    {
        sText.AssignAscii(SwForm::aFormLinkStt);
        eTokenType = TOKEN_LINK_START;
    }
    else if(pBtn == &aTabPB)
    {
        sText.AssignAscii(SwForm::aFormTab);
        eTokenType = TOKEN_TAB_STOP;
    }
    SwFormToken aInsert(eTokenType);
    aInsert.nTabStopPosition = 0;
    aTokenWIN.InsertAtSelection(sText, aInsert);
    ModifyHdl(0);
    return 0;
}
/* -----------------------------14.01.00 11:53--------------------------------

 ---------------------------------------------------------------------------*/
IMPL_LINK(SwTOXEntryTabPage, AllLevelsHdl, PushButton*, pButton)
{
    //get current level
    //write it into all levels
    if(aTokenWIN.IsValid())
    {
        String sNewToken = aTokenWIN.GetPattern();
        for(sal_uInt16 i = 1; i < pCurrentForm->GetFormMax(); i++)
            pCurrentForm->SetPattern(i, sNewToken);
        //
        ModifyHdl(this);
    }
    return 0;
}

/* -----------------02.12.99 12:40-------------------

 --------------------------------------------------*/
void SwTOXEntryTabPage::WriteBackLevel()
{
    if(aTokenWIN.IsValid())
    {
        String sNewToken = aTokenWIN.GetPattern();
        sal_uInt16 nLastLevel = aTokenWIN.GetLastLevel();
        if(nLastLevel != USHRT_MAX)
            pCurrentForm->SetPattern(nLastLevel + 1, sNewToken );
    }
}
/*-- 16.06.99 10:47:35---------------------------------------------------

  -----------------------------------------------------------------------*/
IMPL_LINK(SwTOXEntryTabPage, LevelHdl, SvTreeListBox*, pBox)
{
    if(bInLevelHdl)
        return 0;
    bInLevelHdl = sal_True;
    WriteBackLevel();

    sal_uInt16 nLevel = pBox->GetModel()->GetAbsPos(pBox->FirstSelected());
    aTokenWIN.SetForm(*pCurrentForm, nLevel);
    if(TOX_AUTHORITIES == pCurrentForm->GetTOXType())
    {
        //fill the types in
        aAuthFieldsLB.Clear();
        for( sal_uInt32 i = 0; i < AUTH_FIELD_END; i++)
        {
            String sTmp(SW_RES(STR_AUTH_FIELD_START + i));
            sTmp.EraseAllChars('~');
            sal_uInt16 nPos = aAuthFieldsLB.InsertEntry(sTmp);
            aAuthFieldsLB.SetEntryData(nPos, (void*)(i));
        }
        String sLevelPattern(pCurrentForm->GetPattern(nLevel + 1));
        SwFormTokenEnumerator aEnumerator(sLevelPattern);
        while(aEnumerator.HasNextToken())
        {
            SwFormToken aToken = aEnumerator.GetNextToken();
            if(TOKEN_AUTHORITY == aToken.eTokenType)
            {
                sal_uInt32 nSearch = aToken.nAuthorityField;
                sal_uInt16  nLstBoxPos = aAuthFieldsLB.GetEntryPos( (void*) nSearch );
                DBG_ASSERT(LISTBOX_ENTRY_NOTFOUND != nLstBoxPos, "Entry not found?")
                aAuthFieldsLB.RemoveEntry(nLstBoxPos);
            }
        }
        aAuthFieldsLB.SelectEntryPos(0);
    }
    bInLevelHdl = sal_False;
    pBox->GrabFocus();
    return 0;
}
/* -----------------20.10.99 13:16-------------------

 --------------------------------------------------*/
IMPL_LINK(SwTOXEntryTabPage, SortKeyHdl, RadioButton*, pButton)
{
    sal_Bool bEnable = &aSortContentRB == pButton;
    aFirstKeyFT.Enable(bEnable);
    aFirstKeyLB.Enable(bEnable);
    aSecondKeyFT.Enable(bEnable);
    aSecondKeyLB.Enable(bEnable);
    aThirdKeyFT.Enable(bEnable);
    aThirdKeyLB.Enable(bEnable);
    aSortKeyGB.Enable(bEnable);
    aFirstSortUpRB.Enable(bEnable);
    aFirstSortDownRB.Enable(bEnable);
    aSecondSortUpRB.Enable(bEnable);
    aSecondSortDownRB.Enable(bEnable);
    aThirdSortUpRB.Enable(bEnable);
    aThirdSortDownRB.Enable(bEnable);
    return 0;
}
/* -----------------01.07.99 12:21-------------------

 --------------------------------------------------*/
IMPL_LINK(SwTOXEntryTabPage, TokenSelectedHdl, SwFormToken*, pToken)
{
    if(pToken->sCharStyleName.Len())
        aCharStyleLB.SelectEntry(pToken->sCharStyleName);
    else
        aCharStyleLB.SelectEntry(sNoCharStyle);
    //StyleSelectHdl(&aCharStyleLB);

    sal_Bool bTabStop = pToken->eTokenType == TOKEN_TAB_STOP;

    aCharStyleLB.Enable(!bTabStop);
    String sEntry = aCharStyleLB.GetSelectEntry();
    aEditStylePB.Enable(!bTabStop && sEntry != sNoCharStyle);

    if(pToken->eTokenType == TOKEN_CHAPTER_INFO)
    {
        if(pToken->nChapterFormat < 3)
            aChapterEntryLB.SelectEntryPos(pToken->nChapterFormat);
        else
            aChapterEntryLB.SetNoSelection();
    }

    aFillCharFT.Show(bTabStop);
    aFillCharCB.Show(bTabStop);
    aTabPosFT.Show(bTabStop);
    aTabPosMF.Show(bTabStop);
    aAutoRightCB.Show(bTabStop);
    aAutoRightCB.Enable(bTabStop);
    if(bTabStop)
    {
        aTabPosMF.SetValue(aTabPosMF.Normalize(pToken->nTabStopPosition), FUNIT_TWIP);
        aAutoRightCB.Check(SVX_TAB_ADJUST_END == pToken->eTabAlign);
        aFillCharCB.SetText(pToken->cTabFillChar);
        aTabPosFT.Enable(!aAutoRightCB.IsChecked());
        aTabPosMF.Enable(!aAutoRightCB.IsChecked());
    }
    else
    {
        aTabPosMF.Enable(sal_False);
    }

    aChapterEntryFT.Show(pToken->eTokenType == TOKEN_CHAPTER_INFO);
    aChapterEntryLB.Show(pToken->eTokenType == TOKEN_CHAPTER_INFO);

    //now enable the visible buttons
    //- inserting the same type of control is not allowed
    //- some types of controls can only appear once (EntryText EntryNumber)

    if(aEntryNoPB.IsVisible())
    {
        aEntryNoPB.Enable(TOKEN_ENTRY_NO != pToken->eTokenType );
    }
    if(aEntryPB.IsVisible())
    {
        aEntryPB.Enable(TOKEN_ENTRY_TEXT != pToken->eTokenType &&
                                !aTokenWIN.Contains(TOKEN_ENTRY_TEXT)
                                && !aTokenWIN.Contains(TOKEN_ENTRY));
    }

    if(aChapterInfoPB.IsVisible())
    {
        aChapterInfoPB.Enable(TOKEN_CHAPTER_INFO != pToken->eTokenType);
    }
    if(aPageNoPB.IsVisible())
    {
        aPageNoPB.Enable(TOKEN_PAGE_NUMS != pToken->eTokenType &&
                                !aTokenWIN.Contains(TOKEN_PAGE_NUMS));
    }
    if(aTabPB.IsVisible())
    {
        aTabPB.Enable(!bTabStop);
    }
    if(aHyperLinkPB.IsVisible())
    {
        aHyperLinkPB.Enable(TOKEN_LINK_START != pToken->eTokenType &&
                            TOKEN_LINK_END != pToken->eTokenType);
    }
    //table of authorities
    if(aAuthInsertPB.IsVisible())
    {
        sal_Bool bText = TOKEN_TEXT == pToken->eTokenType;
        aAuthInsertPB.Enable(bText && aAuthFieldsLB.GetSelectEntry().Len());
        aAuthRemovePB.Enable(!bText);
    }

    return 0;
}
/* -----------------01.07.99 12:36-------------------

 --------------------------------------------------*/
IMPL_LINK(SwTOXEntryTabPage, StyleSelectHdl, ListBox*, pBox)
{
    String sEntry = pBox->GetSelectEntry();
    sal_uInt16 nId = (sal_uInt16)(long)pBox->GetEntryData(pBox->GetSelectEntryPos());
    aEditStylePB.Enable(sEntry != sNoCharStyle);
    if(sEntry == sNoCharStyle)
        sEntry.Erase();
    Control* pCtrl = aTokenWIN.GetActiveControl();
    DBG_ASSERT(pCtrl, "no active control?")
    if(pCtrl)
    {
        if(WINDOW_EDIT == pCtrl->GetType())
            ((SwTOXEdit*)pCtrl)->SetCharStyleName(sEntry, nId);
        else
            ((SwTOXButton*)pCtrl)->SetCharStyleName(sEntry, nId);

    }
    ModifyHdl(0);
    return 0;
}
/* -----------------------------11.01.00 12:54--------------------------------

 ---------------------------------------------------------------------------*/
IMPL_LINK(SwTOXEntryTabPage, ChapterInfoHdl, ListBox*, pBox)
{
    sal_uInt16 nPos = pBox->GetSelectEntryPos();
    if(LISTBOX_ENTRY_NOTFOUND != nPos)
    {
        Control* pCtrl = aTokenWIN.GetActiveControl();
        DBG_ASSERT(pCtrl, "no active control?")
        if(pCtrl && WINDOW_EDIT != pCtrl->GetType())
            ((SwTOXButton*)pCtrl)->SetChapterInfo(nPos);

        ModifyHdl(0);
    }
    return 0;
}
/* -----------------19.08.99 15:37-------------------

 --------------------------------------------------*/
IMPL_LINK(SwTOXEntryTabPage, TabPosHdl, MetricField*, pField)
{
    Control* pCtrl = aTokenWIN.GetActiveControl();
    DBG_ASSERT(pCtrl && WINDOW_EDIT != pCtrl->GetType() &&
        TOKEN_TAB_STOP == ((SwTOXButton*)pCtrl)->GetFormToken().eTokenType,
                "no active style::TabStop control?")
    if( pCtrl && WINDOW_EDIT != pCtrl->GetType() )
    {
        ((SwTOXButton*)pCtrl)->SetTabPosition(
                pField->Denormalize( pField->GetValue( FUNIT_TWIP )));
    }
    ModifyHdl(0);
    return 0;
}
/* -----------------09.09.99 15:37-------------------

 --------------------------------------------------*/
IMPL_LINK(SwTOXEntryTabPage, FillCharHdl, ComboBox*, pBox)
{
    Control* pCtrl = aTokenWIN.GetActiveControl();
    DBG_ASSERT(pCtrl && WINDOW_EDIT != pCtrl->GetType() &&
        TOKEN_TAB_STOP == ((SwTOXButton*)pCtrl)->GetFormToken().eTokenType,
                "no active style::TabStop control?")
    if(pCtrl && WINDOW_EDIT != pCtrl->GetType())
    {
        sal_Unicode cSet;
        if( pBox->GetText().Len() )
            cSet = pBox->GetText().GetChar(0);
        else
            cSet = ' ';
        ((SwTOXButton*)pCtrl)->SetFillChar( cSet );
    }
    ModifyHdl(0);
    return 0;
}

/*-- 16.06.99 10:47:36---------------------------------------------------

  -----------------------------------------------------------------------*/
IMPL_LINK(SwTOXEntryTabPage, AutoRightHdl, CheckBox*, pBox)
{
    //the most right style::TabStop is usually right aligned
    Control* pCurCtrl = aTokenWIN.GetActiveControl();
    DBG_ASSERT(WINDOW_EDIT != pCurCtrl->GetType() &&
            ((SwTOXButton*)pCurCtrl)->GetFormToken().eTokenType == TOKEN_TAB_STOP,
            "no style::TabStop selected!")

    const SwFormToken& rToken = ((SwTOXButton*)pCurCtrl)->GetFormToken();
    sal_Bool bChecked = pBox->IsChecked();
    if(rToken.eTokenType == TOKEN_TAB_STOP)
        ((SwTOXButton*)pCurCtrl)->SetTabAlign(
            bChecked ? SVX_TAB_ADJUST_END : SVX_TAB_ADJUST_LEFT);
    aTabPosFT.Enable(!bChecked);
    aTabPosMF.Enable(!bChecked);
    ModifyHdl(0);
    return 0;
}
/* -----------------16.06.99 11:00-------------------

 --------------------------------------------------*/
void SwTOXEntryTabPage::SetWrtShell(SwWrtShell& rSh)
{
    SwDocShell* pDocSh = rSh.GetView().GetDocShell();
    ::FillCharStyleListBox(aCharStyleLB, pDocSh, TRUE);
    for(sal_uInt16 i = 0; i < aCharStyleLB.GetEntryCount(); i++)
    {
        aMainEntryStyleLB.InsertEntry( aCharStyleLB.GetEntry(i) );
        aMainEntryStyleLB.SetEntryData(i, aCharStyleLB.GetEntryData(i));
    }
    String sTmp; GetDocPoolNm( RES_POOLCHR_IDX_MAIN_ENTRY, sTmp );
    aMainEntryStyleLB.SelectEntry(sTmp);
}
/* -----------------------------23.12.99 14:23--------------------------------

 ---------------------------------------------------------------------------*/
String  SwTOXEntryTabPage::GetLevelHelp(sal_uInt16 nLevel) const
{
    String sRet;
    SwMultiTOXTabDialog* pTOXDlg = (SwMultiTOXTabDialog*)GetTabDialog();
    const CurTOXType aCurType = pTOXDlg->GetCurrentTOXType();
    if( TOX_INDEX == aCurType.eType )
        GetDocPoolNm( 1 == nLevel ? RES_POOLCOLL_TOX_IDXBREAK
                                  : RES_POOLCOLL_TOX_IDX1 + nLevel-2, sRet );

    else if( TOX_AUTHORITIES == aCurType.eType )
    {
        //wildcard -> show entry text
        sRet = '*';
    }
    return sRet;
}
/* -----------------16.06.99 15:18-------------------

 --------------------------------------------------*/

SwTokenWindow::SwTokenWindow(SwTOXEntryTabPage* pParent, const ResId& rResId) :
        Window( pParent, rResId ),
        aLeftScrollWin(this, ResId(WIN_LEFT_SCROLL   )),
        aCtrlParentWin(this, ResId(WIN_CTRL_PARENT   )),
        aRightScrollWin(this, ResId(WIN_RIGHT_SCROLL )),
        pForm(0),
        m_pParent(pParent),
        nLevel(0),
        bValid(sal_False),
        pActiveCtrl(0),
        sCharStyle(ResId(STR_CHARSTYLE))
{
    SetHelpId(HID_TOKEN_WINDOW);
    for(sal_uInt16 i = 0; i < TOKEN_END; i++)
    {
        sal_uInt16 nTextId = STR_BUTTON_TEXT_START + i;
        if( STR_TOKEN_ENTRY_TEXT == nTextId )
            nTextId = STR_TOKEN_ENTRY;
        aButtonTexts[i] = String(ResId(nTextId));

        sal_uInt16 nHelpId = STR_BUTTON_HELP_TEXT_START + i;
        if(STR_TOKEN_HELP_ENTRY_TEXT == nHelpId)
            nHelpId = STR_TOKEN_HELP_ENTRY;
        aButtonHelpTexts[i] = String(ResId(nHelpId));
    }

    FreeResource();

    Link aLink(LINK(this, SwTokenWindow, ScrollHdl));
    aLeftScrollWin.SetClickHdl(aLink);
    aRightScrollWin.SetClickHdl(aLink);
}
/* -----------------01.07.99 12:17-------------------

 --------------------------------------------------*/
SwTokenWindow::~SwTokenWindow()
{
//  for(sal_uInt16 i = GetItemCount(); i ; i--)
//      RemoveItem(i - 1);

    for( sal_uInt16 i = aControlList.Count(); i; )
    {
        Control* pControl = aControlList.Remove( --i );
        delete pControl;
    }
}
/* -----------------16.06.99 13:56-------------------

 --------------------------------------------------*/
void    SwTokenWindow::SetForm(SwForm& rForm, sal_uInt16 nL)
{
    SetActiveControl(0);
    bValid = sal_True;
    if(pForm)
    {
        //apply current level settings to the form
        for( sal_uInt16 i = aControlList.Count(); i; )
        {
            Control* pControl = aControlList.Remove( --i );
            delete pControl;
        }
    }
    nLevel = nL;
    pForm = &rForm;
    //now the display
    if(nLevel < MAXLEVEL || rForm.GetTOXType() == TOX_AUTHORITIES)
    {
        sal_uInt16 nControlId = 1;
         Size aToolBoxSize = GetSizePixel();

        String sLevelPattern(pForm->GetPattern(nLevel + 1));
        SwFormTokenEnumerator aEnumerator(sLevelPattern);
        sal_Bool bLastWasText = sal_False; //assure alternating text - code - text

        Control* pSetActiveControl = 0;
        while(aEnumerator.HasNextToken())
        {
            SwFormToken aToken(aEnumerator.GetNextToken());
            if(TOKEN_TEXT == aToken.eTokenType)
            {
                DBG_ASSERT(!bLastWasText, "text following text is invalid")
                Control* pCtrl = InsertItem(aToken.sText, aToken);
                bLastWasText = sal_True;
                if(!GetActiveControl())
                    SetActiveControl(pCtrl);
            }
            else
            {
                if( !bLastWasText )
                {
                    bLastWasText = sal_True;
                    SwFormToken aTemp(TOKEN_TEXT);
                    Control* pCtrl = InsertItem(aEmptyStr, aTemp);
                    if(!pSetActiveControl)
                        pSetActiveControl = pCtrl;
                }
                const sal_Char* pTmp = 0;
                switch( aToken.eTokenType )
                {
                case TOKEN_ENTRY_NO:    pTmp = SwForm::aFormEntryNum; break;
                case TOKEN_ENTRY_TEXT:  pTmp = SwForm::aFormEntryTxt; break;
                case TOKEN_ENTRY:       pTmp = SwForm::aFormEntry; break;
                case TOKEN_TAB_STOP:    pTmp = SwForm::aFormTab; break;
                case TOKEN_PAGE_NUMS:   pTmp = SwForm::aFormPageNums; break;
                case TOKEN_CHAPTER_INFO:pTmp = SwForm::aFormChapterMark; break;
                case TOKEN_LINK_START:  pTmp = SwForm::aFormLinkStt; break;
                case TOKEN_LINK_END:    pTmp = SwForm::aFormLinkEnd; break;
                case TOKEN_AUTHORITY:   pTmp = SwForm::aFormAuth; break;
                }

                InsertItem( pTmp ? String::CreateFromAscii(pTmp)
                                 : aEmptyStr, aToken );
                bLastWasText = sal_False;
            }
        }
        SetActiveControl(pSetActiveControl);

        if(!bLastWasText)
        {
            bLastWasText = sal_True;
            SwFormToken aTemp(TOKEN_TEXT);
            InsertItem(aEmptyStr, aTemp);
        }
    }
    AdjustScrolling();
}
/* -----------------19.08.99 13:00-------------------

 --------------------------------------------------*/
void SwTokenWindow::SetActiveControl(Control* pSet)
{
    if( pSet != pActiveCtrl )
    {
        if( pActiveCtrl && WINDOW_EDIT == pActiveCtrl->GetType() )
            ((SwTOXEdit*)pActiveCtrl)->SetControlBackground( COL_WHITE );

        pActiveCtrl = pSet;
        if( pActiveCtrl )
        {
            pActiveCtrl->GrabFocus();
            //it must be a SwTOXEdit
            const SwFormToken* pFToken;
            if( WINDOW_EDIT == pActiveCtrl->GetType() )
            {
                ((SwTOXEdit*)pActiveCtrl)->SetControlBackground(COL_LIGHTGRAY);
                pFToken = &((SwTOXEdit*)pActiveCtrl)->GetFormToken();
            }
            else
                pFToken = &((SwTOXButton*)pActiveCtrl)->GetFormToken();

            SwFormToken aTemp( *pFToken );
            aButtonSelectedHdl.Call( &aTemp );
        }
    }
}

/* -----------------17.06.99 09:53-------------------

 --------------------------------------------------*/
Control*    SwTokenWindow::InsertItem(const String& rText, const SwFormToken& rToken)
{
    Control* pRet = 0;
    Control* pLast = aControlList.Last();
    Size aControlSize(GetOutputSizePixel());
     Point aControlPos;
    if( pLast )
    {
        aControlSize = pLast->GetSizePixel();
        aControlPos = pLast->GetPosPixel();
        aControlPos.X() += aControlSize.Width();
    }
    if(TOKEN_TEXT == rToken.eTokenType)
    {
        SwTOXEdit* pEdit = new SwTOXEdit(&aCtrlParentWin, this, rToken);
        pEdit->SetPosPixel(aControlPos);
        aControlList.Insert(pEdit, aControlList.Count());
        pEdit->SetText(rText);
         Size aEditSize(aControlSize);
        aEditSize.Width() = pEdit->GetTextWidth(rText) + EDIT_MINWIDTH;
        pEdit->SetSizePixel(aEditSize);
        pEdit->SetModifyHdl(LINK(this, SwTokenWindow, EditResize ));
        pEdit->SetPrevNextLink(LINK(this, SwTokenWindow, NextItemHdl));
        pEdit->SetGetFocusLink(LINK(this, SwTokenWindow, TbxFocusHdl));
        pEdit->Show();
        pRet = pEdit;
    }
    else
    {
        SwTOXButton* pButton = new SwTOXButton(&aCtrlParentWin, this, rToken);
        pButton->SetPosPixel(aControlPos);
        aControlList.Insert(pButton, aControlList.Count());
         Size aEditSize(aControlSize);
        aEditSize.Width() = pButton->GetTextWidth(rText) + 5;
        pButton->SetControlBackground(Color(COL_WHITE));
        pButton->SetSizePixel(aEditSize);
        pButton->SetPrevNextLink(LINK(this, SwTokenWindow, NextItemBtnHdl));
        pButton->SetGetFocusLink(LINK(this, SwTokenWindow, TbxFocusBtnHdl));
        if(TOKEN_AUTHORITY != rToken.eTokenType)
            pButton->SetText(aButtonTexts[rToken.eTokenType]);
        else
        {
            //use the first two chars as symbol
            String sTmp(SwAuthorityFieldType::GetAuthFieldName(
                        (ToxAuthorityField)rToken.nAuthorityField));
            pButton->SetText(sTmp.Copy(0, 2));
        }
        pButton->Show();
        pRet = pButton;
    }
    return pRet;
}
/* -----------------16.07.99 11:50-------------------

 --------------------------------------------------*/
void    SwTokenWindow::InsertAtSelection(
            const String& rText,
            const SwFormToken& rToken)
{
    DBG_ASSERT(pActiveCtrl, "no active control!")
    if(!pActiveCtrl)
        return;
    SwFormToken aToInsertToken(rToken);
    if(TOKEN_LINK_START == aToInsertToken.eTokenType)
    {
        //determine if start or end of hyperlink is appropriate
        //eventually change a following link start into a link end
        // groups of LS LE should be ignored
        // <insert>
        //LS <insert>
        //LE <insert>
        //<insert> LS
        //<insert> LE
        //<insert>
        sal_Bool bPreStartLinkFound = sal_False; //
        sal_Bool bPreEndLinkFound = sal_False;

        const Control* pControl = aControlList.First();
        const Control* pExchange = 0;
        while( pControl && pActiveCtrl != pControl )
        {
            if( WINDOW_EDIT != pControl->GetType())
            {
                const SwFormToken& rNewToken =
                                ((SwTOXButton*)pControl)->GetFormToken();
                if( TOKEN_LINK_START == rNewToken.eTokenType )
                {
                    bPreStartLinkFound = sal_True;
                    pExchange = 0;
                }
                else if(TOKEN_LINK_END == rNewToken.eTokenType)
                {
                    if( bPreStartLinkFound )
                        bPreStartLinkFound = sal_False;
                    else
                    {
                        bPreEndLinkFound = sal_False;
                        pExchange = pControl;
                    }
                }
            }
            pControl = aControlList.Next();
        }

        sal_Bool bPostLinkEndFound = sal_False;
        sal_Bool bPostLinkStartFound = sal_False;
        if(!bPreStartLinkFound && !bPreEndLinkFound)
            while(pControl)
            {
                if( pControl != pActiveCtrl &&
                    WINDOW_EDIT != pControl->GetType())
                {
                    const SwFormToken& rNewToken =
                                    ((SwTOXButton*)pControl)->GetFormToken();
                    if( TOKEN_LINK_START == rNewToken.eTokenType )
                    {
                        if(bPostLinkStartFound)
                            break;
                        bPostLinkStartFound = sal_True;
                        pExchange = pControl;
                    }
                    else if(TOKEN_LINK_END == rNewToken.eTokenType )
                    {
                        if(bPostLinkStartFound)
                        {
                            bPostLinkStartFound = sal_False;
                            pExchange = 0;
                        }
                        else
                        {
                            bPostLinkEndFound = sal_True;
                        }
                        break;
                    }
                }
                pControl = aControlList.Next();
            }

        if(bPreStartLinkFound)
        {
            aToInsertToken.eTokenType = TOKEN_LINK_END;
            aToInsertToken.sText =  aButtonTexts[TOKEN_LINK_END];
        }

        if(bPostLinkStartFound)
        {
            DBG_ASSERT(pExchange, "no control to exchange?")
            if(pExchange)
            {
                ((SwTOXButton*)pExchange)->SetLinkEnd();
                ((SwTOXButton*)pExchange)->SetText(aButtonTexts[TOKEN_LINK_END]);
            }
        }

        if(bPreEndLinkFound)
        {
            DBG_ASSERT(pExchange, "no control to exchange?")
            if(pExchange)
            {
                ((SwTOXButton*)pExchange)->SetLinkStart();
                ((SwTOXButton*)pExchange)->SetText(aButtonTexts[TOKEN_LINK_START]);
            }
        }
    }

    //if the active control is text then insert a new button at the selection
    //else replace the button
    sal_uInt32 nActivePos = aControlList.GetPos(pActiveCtrl);
    sal_uInt32 nInsertPos = nActivePos;

 Size aControlSize(GetOutputSizePixel());
    if( WINDOW_EDIT == pActiveCtrl->GetType())
    {
        nInsertPos++;
         Selection aSel = ((SwTOXEdit*)pActiveCtrl)->GetSelection();
        aSel.Justify();
        String sEditText = ((SwTOXEdit*)pActiveCtrl)->GetText();
        String sLeft = sEditText.Copy(0, aSel.A());
        String sRight = sEditText.Copy(aSel.B(), sEditText.Len() - aSel.B());

        ((SwTOXEdit*)pActiveCtrl)->SetText(sLeft);
        ((SwTOXEdit*)pActiveCtrl)->AdjustSize();

        SwFormToken aTmpToken(TOKEN_TEXT);
        SwTOXEdit* pEdit = new SwTOXEdit(&aCtrlParentWin, this, aTmpToken);
        aControlList.Insert(pEdit, nActivePos + 1);
        pEdit->SetText(sRight);
        pEdit->SetSizePixel(aControlSize);
        pEdit->AdjustSize();
        pEdit->SetModifyHdl(LINK(this, SwTokenWindow, EditResize ));
        pEdit->SetPrevNextLink(LINK(this, SwTokenWindow, NextItemHdl));
        pEdit->SetGetFocusLink(LINK(this, SwTokenWindow, TbxFocusHdl));
        pEdit->Show();
    }
    else
    {
        aControlList.Remove(pActiveCtrl);
        pActiveCtrl->Hide();
        delete pActiveCtrl;
    }
    //now the new button
    SwTOXButton* pButton = new SwTOXButton(&aCtrlParentWin, this, aToInsertToken);
    aControlList.Insert(pButton, nInsertPos);
    pButton->SetControlBackground(Color(COL_WHITE));
    pButton->SetPrevNextLink(LINK(this, SwTokenWindow, NextItemBtnHdl));
    pButton->SetGetFocusLink(LINK(this, SwTokenWindow, TbxFocusBtnHdl));
    if(TOKEN_AUTHORITY != aToInsertToken.eTokenType)
        pButton->SetText(aButtonTexts[aToInsertToken.eTokenType]);
    else
    {
        //use the first two chars as symbol
        String sTmp(SwAuthorityFieldType::GetAuthFieldName(
                    (ToxAuthorityField)aToInsertToken.nAuthorityField));
        pButton->SetText(sTmp.Copy(0, 2));
    }

 Size aEditSize(GetOutputSizePixel());
    aEditSize.Width() = pButton->GetTextWidth(rText) + 5;
    pButton->SetSizePixel(aEditSize);
    pButton->Check(sal_True);
    pButton->Show();
    SetActiveControl(pButton);

    AdjustPositions();
}
/* -----------------19.08.99 12:42-------------------

 --------------------------------------------------*/
void SwTokenWindow::RemoveControl(SwTOXButton* pDel, sal_Bool bInternalCall )
{
    if(bInternalCall && TOX_AUTHORITIES == pForm->GetTOXType())
        m_pParent->PreTokenButtonRemoved(pDel->GetFormToken());

    sal_uInt32 nActivePos = aControlList.GetPos(pDel);
    DBG_ASSERT(nActivePos != 0xffffffff, "Control does not exist!");
    // the two neighbours of the box must be merged
    // the properties of the right one will be lost
    DBG_ASSERT(nActivePos && nActivePos < aControlList.Count() - 1,
        "Button at first or last position?");
    aControlList.Seek(nActivePos - 1);
    Control* pLeftEdit = aControlList.GetCurObject();
    aControlList.Seek(nActivePos + 1);
    Control* pRightEdit = aControlList.GetCurObject();
    String sTemp(((SwTOXEdit*)pLeftEdit)->GetText());
    sTemp += ((SwTOXEdit*)pRightEdit)->GetText();
    ((SwTOXEdit*)pLeftEdit)->SetText(sTemp);
    ((SwTOXEdit*)pLeftEdit)->AdjustSize();

    aControlList.Remove(pRightEdit);
    delete pRightEdit;

    aControlList.Remove(pDel);
    pActiveCtrl->Hide();
    delete pActiveCtrl;
    SetActiveControl(pLeftEdit);
    AdjustPositions();
    if(aModifyHdl.IsSet())
        aModifyHdl.Call(0);
}

/* -----------------16.07.99 12:39-------------------

 --------------------------------------------------*/
void SwTokenWindow::AdjustPositions()
{
    if(aControlList.Count() > 1)
    {
        Control* pCtrl = aControlList.First();
     Point aNextPos = pCtrl->GetPosPixel();
        aNextPos.X() += pCtrl->GetSizePixel().Width();
        while(0 != (pCtrl = aControlList.Next()))
        {
            pCtrl->SetPosPixel(aNextPos);
            aNextPos.X() += pCtrl->GetSizePixel().Width();
        }
        AdjustScrolling();
    }
};
/* -----------------------------16.08.00 13:22--------------------------------

 ---------------------------------------------------------------------------*/
void SwTokenWindow::MoveControls(long nOffset)
{
    // move the complete list
    Control* pCtrl = aControlList.First();
    do
    {
        Point aPos = pCtrl->GetPosPixel();
        aPos.X() += nOffset;
        pCtrl->SetPosPixel(aPos);
    }while(0 != (pCtrl = aControlList.Next()));
}
/* -----------------------------14.01.00 13:03--------------------------------

 ---------------------------------------------------------------------------*/
void SwTokenWindow::AdjustScrolling()
{
    if(aControlList.Count() > 1)
    {
        //validate scroll buttons
        Control* pLastCtrl = aControlList.Last();
        Control* pFirstCtrl = aControlList.First();
        long nSpace = aCtrlParentWin.GetSizePixel().Width();
        long nWidth = pLastCtrl->GetPosPixel().X() - pFirstCtrl->GetPosPixel().X()
                                                    + pLastCtrl->GetSizePixel().Width();
        sal_Bool bEnable = nWidth > nSpace;
        //the active control must be visible
        if(bEnable && pActiveCtrl)
        {
             Point aActivePos(pActiveCtrl->GetPosPixel());
            long nMove = 0;
            if(aActivePos.X() < 0)
                nMove = -aActivePos.X();
            else if((aActivePos.X() + pActiveCtrl->GetSizePixel().Width())  > nSpace)
                nMove = -(aActivePos.X() + pActiveCtrl->GetSizePixel().Width() - nSpace);
            if(nMove)
                MoveControls(nMove);
            aLeftScrollWin.Enable(aControlList.First()->GetPosPixel().X() < 0);
            Control* pCtrl = aControlList.Last();
            aRightScrollWin.Enable((pCtrl->GetPosPixel().X() + pCtrl->GetSizePixel().Width()) > nSpace);
        }
        else
        {
            if(pFirstCtrl)
            {
                //if the control fits into the space then the first control must be at postion 0
                long nFirstPos = pFirstCtrl->GetPosPixel().X();
                if(nFirstPos != 0)
                    MoveControls(-nFirstPos);
            }
            aRightScrollWin.Enable(sal_False);
            aLeftScrollWin.Enable(sal_False);
        }
    }
}
/* -----------------------------14.01.00 13:57--------------------------------

 ---------------------------------------------------------------------------*/
IMPL_LINK(SwTokenWindow, ScrollHdl, ImageButton*, pBtn )
{
    if(aControlList.Count())
    {
        const long nSpace = aCtrlParentWin.GetSizePixel().Width();
#ifdef DEBUG
    //find all start/end positions and print it
    String sMessage(String::CreateFromAscii("Space: "));
    sMessage += String::CreateFromInt32(nSpace);
    sMessage += String::CreateFromAscii(" | ");
    Control* pDebugCtrl = aControlList.First();
    do
    {
        long nDebugXPos = pDebugCtrl->GetPosPixel().X();
        long nDebugWidth = pDebugCtrl->GetSizePixel().Width();
        sMessage += String::CreateFromInt32( nDebugXPos );
        sMessage += String::CreateFromAscii(" ");
        sMessage += String::CreateFromInt32(nDebugXPos + nDebugWidth);
        sMessage += String::CreateFromAscii(" | ");

    }while(0 != (pDebugCtrl = aControlList.Next()));

#endif

        long nMove = 0;
        if(pBtn == &aLeftScrollWin)
        {
            //find the first completely visible control (left edge visible)
            for(sal_uInt16 i = 0; i < aControlList.Count(); i++ )
            {
                Control* pCtrl = aControlList.GetObject(i);
                long nXPos = pCtrl->GetPosPixel().X();
                if(nXPos >= 0)
                {
                    if(!i)
                        //move the current control to the left edge
                        nMove = -nXPos;
                    else
                        //move the left neighbor to the start position
                        nMove = -aControlList.GetObject(i - 1)->GetPosPixel().X();
                    break;
                }
            }
        }
        else
        {
            //find the first completely visible control (left edge visible)
            for(sal_uInt16 i = aControlList.Count(); i; i-- )
            {
                Control* pCtrl = aControlList.GetObject(i - 1);
                long nCtrlWidth = pCtrl->GetSizePixel().Width();
                long nXPos = pCtrl->GetPosPixel().X() + nCtrlWidth;
                if(nXPos <= nSpace)
                {
                    if( i < aControlList.Count())
                    {
                        //move the right neighbor  to the right edge right aligned
                        Control* pRight = aControlList.GetObject(i);
                        nMove = nSpace - pRight->GetPosPixel().X() - pRight->GetSizePixel().Width();
                    }
                    break;
                }
            }

            //move it left until it's completely visible
        }
        if(nMove)
        {
            // move the complete list
            Control* pCtrl = aControlList.First();
            do
            {
             Point aPos = pCtrl->GetPosPixel();
                aPos.X() += nMove;
                pCtrl->SetPosPixel(aPos);
            }while(0 != (pCtrl = aControlList.Next()));
            aLeftScrollWin.Enable(aControlList.First()->GetPosPixel().X() < 0);
            pCtrl = aControlList.Last();
            aRightScrollWin.Enable((pCtrl->GetPosPixel().X() + pCtrl->GetSizePixel().Width()) > nSpace);

#ifdef DEBUG
            sMessage.AppendAscii("Move: ");
            sMessage += String::CreateFromInt32(nMove);
            GetParent()->GetParent()->GetParent()->SetText(sMessage);
#endif
        }
    }
    return 0;
}
/* -----------------17.06.99 11:59-------------------

 --------------------------------------------------*/
String  SwTokenWindow::GetPattern() const
{
    String sRet;
    const Control* pControl = ((SwTokenWindow*)this)->aControlList.First();
    while(pControl)
    {
        const SwFormToken& rNewToken = WINDOW_EDIT == pControl->GetType()
                    ? ((SwTOXEdit*)pControl)->GetFormToken()
                    : ((SwTOXButton*)pControl)->GetFormToken();

        //TODO: prevent input of TOX_STYLE_DELIMITER in KeyInput
        sRet += rNewToken.GetString();

        pControl = ((SwTokenWindow*)this)->aControlList.Next();
    }
    return sRet;
}
/* -----------------19.08.99 11:27-------------------
    Description: Check if a control of the specified
                    TokenType is already contained in the list
 --------------------------------------------------*/
sal_Bool SwTokenWindow::Contains(FormTokenType eSearchFor) const
{
    sal_Bool bRet = sal_False;
    const Control* pControl = ((SwTokenWindow*)this)->aControlList.First();
    while(pControl)
    {
        const SwFormToken& rNewToken = WINDOW_EDIT == pControl->GetType()
                    ? ((SwTOXEdit*)pControl)->GetFormToken()
                    : ((SwTOXButton*)pControl)->GetFormToken();

        if(eSearchFor == rNewToken.eTokenType)
        {
            bRet = sal_True;
            break;
        }
        pControl = ((SwTokenWindow*)this)->aControlList.Next();
    }
    return bRet;
}
//---------------------------------------------------
BOOL SwTokenWindow::CreateQuickHelp(Control* pCtrl,
            const SwFormToken& rToken,
            const HelpEvent& rHEvt)
{
    BOOL bRet = FALSE;
    if( rHEvt.GetMode() & HELPMODE_QUICK )
    {
        sal_Bool bBalloon = Help::IsBalloonHelpEnabled();
        String sEntry;
        if(bBalloon || rToken.eTokenType != TOKEN_AUTHORITY)
            sEntry = (aButtonHelpTexts[rToken.eTokenType]);
        if(rToken.eTokenType == TOKEN_AUTHORITY )
        {
             sEntry += SwAuthorityFieldType::GetAuthFieldName(
                                (ToxAuthorityField) rToken.nAuthorityField);
        }

     Point aPos = OutputToScreenPixel(pCtrl->GetPosPixel());
     Rectangle aItemRect( aPos, pCtrl->GetSizePixel() );
        if(rToken.eTokenType == TOKEN_TAB_STOP )
        {
//          sEntry += '\n';
//          sEntry += rToken.nTabStopPosition;
        }
        else
        {
            if(rToken.sCharStyleName.Len())
            {
                if(bBalloon)
                    sEntry += '\n';
                else
                    sEntry += ' ';
                sEntry += sCharStyle;
                  sEntry += rToken.sCharStyleName;
            }
        }
        if(bBalloon)
        {
            Help::ShowBalloon( this, aPos, aItemRect, sEntry );
        }
        else
            Help::ShowQuickHelp( this, aItemRect, sEntry,
                QUICKHELP_LEFT|QUICKHELP_VCENTER );
        bRet = TRUE;
    }
    return bRet;
}
/* -----------------------------14.01.00 12:22--------------------------------

 ---------------------------------------------------------------------------*/
void SwTokenWindow::Resize()
{
 Size aCompleteSize(GetOutputSizePixel());

 Point aRightPos(aRightScrollWin.GetPosPixel());
 Size aRightSize(aRightScrollWin.GetSizePixel());

 Size aMiddleSize(aCtrlParentWin.GetSizePixel());

    long nMove = aCompleteSize.Width() - aRightSize.Width() - aRightPos.X();

    aRightPos.X() += nMove;
    aRightScrollWin.SetPosPixel(aRightPos);
    aMiddleSize.Width() += nMove;
    aCtrlParentWin.SetSizePixel(aMiddleSize);
}

/* -----------------16.06.99 15:23-------------------

 --------------------------------------------------*/
IMPL_LINK(SwTokenWindow, EditResize, Edit*, pEdit)
{
    ((SwTOXEdit*)pEdit)->AdjustSize();
    AdjustPositions();
    if(aModifyHdl.IsSet())
        aModifyHdl.Call(0);
    return 0;
}
/* -----------------16.06.99 15:56-------------------

 --------------------------------------------------*/
IMPL_LINK(SwTokenWindow, NextItemHdl, SwTOXEdit*,  pEdit)
{
    sal_uInt16 nPos = (sal_uInt16)aControlList.GetPos(pEdit);
    if(nPos && !pEdit->IsNextControl() ||
        nPos < aControlList.Count() - 1 && pEdit->IsNextControl())
    {
        aControlList.Seek(nPos);
        Control* pNextPrev = pEdit->IsNextControl() ? aControlList.Next() : aControlList.Prev();
        nPos += pEdit->IsNextControl() ? 1 : -1;
        pNextPrev->GrabFocus();
        ((SwTOXButton*)pNextPrev)->Check();
        AdjustScrolling();
    }
    return 0;
}
/* -----------------17.06.99 08:58-------------------

 --------------------------------------------------*/
IMPL_LINK(SwTokenWindow, TbxFocusHdl, SwTOXEdit*, pEdit)
{
    for(sal_uInt16 i = 0; i < aControlList.Count(); i++)
    {
        Control* pControl = aControlList.First();
        while(pControl)
        {
            if(WINDOW_EDIT != pControl->GetType() )
                ((SwTOXButton*)pControl)->Check(sal_False);
            pControl = aControlList.Next();
        }
    }
    SetActiveControl(pEdit);
    return 0;
}
/* -----------------17.06.99 10:05-------------------

 --------------------------------------------------*/
IMPL_LINK(SwTokenWindow, NextItemBtnHdl, SwTOXButton*, pBtn )
{
    sal_uInt16 nPos = (sal_uInt16)aControlList.GetPos(pBtn);
    if(nPos && !pBtn->IsNextControl() ||
        nPos < aControlList.Count() - 1 && pBtn->IsNextControl())
    {
        aControlList.Seek(nPos);
        sal_Bool bNext = pBtn->IsNextControl();
        Control* pNextPrev = bNext ? aControlList.Next() : aControlList.Prev();
        pNextPrev->GrabFocus();
         Selection aSel(0, 0);
        if(!bNext)
        {
            sal_uInt16 nLen = ((SwTOXEdit*)pNextPrev)->GetText().Len();
            aSel.A() = nLen;
            aSel.B() = nLen;
        }
        ((SwTOXEdit*)pNextPrev)->SetSelection(aSel);
        pBtn->Check(sal_False);
        AdjustScrolling();
    }
    return 0;
}

/* -----------------17.06.99 10:04-------------------

 --------------------------------------------------*/
IMPL_LINK(SwTokenWindow, TbxFocusBtnHdl, SwTOXButton*, pBtn )
{
    for(sal_uInt16 i = 0; i < aControlList.Count(); i++)
    {
        Control* pControl = aControlList.First();
        while(pControl)
        {
            if(WINDOW_EDIT != pControl->GetType() )
                ((SwTOXButton*)pControl)->Check(pBtn == pControl);
            pControl = aControlList.Next();
        }
    }
    SetActiveControl(pBtn);
    return 0;
}

/* -----------------25.03.99 15:17-------------------
 *
 * --------------------------------------------------*/
SwTOXStylesTabPage::SwTOXStylesTabPage(Window* pParent, const SfxItemSet& rAttrSet ) :
    SfxTabPage(pParent, SW_RES(TP_TOX_STYLES), rAttrSet),
    aLevelFT2(this,     SW_RES(FT_LEVEL  )),
    aLevelLB(this,      SW_RES(LB_LEVEL  )),
    aTemplateFT(this,   SW_RES(FT_TEMPLATE)),
    aParaLayLB(this,    SW_RES(LB_PARALAY )),
    aStdBT(this,        SW_RES(BT_STD    )),
    aAssignBT(this,     SW_RES(BT_ASSIGN  )),
    aEditStyleBT(this,  SW_RES(BT_EDIT_STYLE    )),
    aFormatGB(this,     SW_RES(GB_FORMAT  )),
    pCurrentForm(0)
{
    FreeResource();
    SetExchangeSupport( sal_True );

    aEditStyleBT.SetClickHdl   (LINK(   this, SwTOXStylesTabPage, EditStyleHdl));
    aAssignBT.SetClickHdl      (LINK(   this, SwTOXStylesTabPage, AssignHdl));
    aStdBT.SetClickHdl         (LINK(   this, SwTOXStylesTabPage, StdHdl));
    aParaLayLB.SetSelectHdl    (LINK(   this, SwTOXStylesTabPage, EnableSelectHdl));
    aLevelLB.SetSelectHdl      (LINK(   this, SwTOXStylesTabPage, EnableSelectHdl));
    aParaLayLB.SetDoubleClickHdl(LINK(  this, SwTOXStylesTabPage, DoubleClickHdl));
}
/* -----------------25.03.99 15:17-------------------
 *
 * --------------------------------------------------*/
SwTOXStylesTabPage::~SwTOXStylesTabPage()
{
    delete pCurrentForm;
}
/* -----------------25.03.99 15:17-------------------
 *
 * --------------------------------------------------*/
sal_Bool    SwTOXStylesTabPage::FillItemSet( SfxItemSet& )
{
    return sal_True;
}
/* -----------------25.03.99 15:17-------------------
 *
 * --------------------------------------------------*/
void    SwTOXStylesTabPage::Reset( const SfxItemSet& rSet )
{
    ActivatePage(rSet);
}
/* -----------------25.03.99 15:17-------------------
 *
 * --------------------------------------------------*/
void    SwTOXStylesTabPage::ActivatePage( const SfxItemSet& )
{
    pCurrentForm = new SwForm(GetForm());
    aParaLayLB.Clear();
    aLevelLB.Clear();

    // kein Hyperlink fuer Benutzerverzeichnisse

    sal_uInt16 i, nSize = pCurrentForm->GetFormMax();

    // form-Pattern anzeigen ohne Titel

    //1. TemplateEntry  anzeigen
    String aStr( SW_RES( STR_TITLE ));
    if( pCurrentForm->GetTemplate( 0 ).Len() )
    {
        aStr += ' ';
        aStr += aDeliStart;
        aStr += pCurrentForm->GetTemplate( 0 );
        aStr += aDeliEnd;
    }
    aLevelLB.InsertEntry(aStr);

    for( i=1; i < nSize; ++i )
    {
        if( TOX_INDEX == pCurrentForm->GetTOXType() &&
            FORM_ALPHA_DELIMITTER == i )
            aStr = SW_RESSTR(STR_ALPHA);
        else
        {
            aStr  = SW_RESSTR(STR_LEVEL);
            aStr += String::CreateFromInt32(
                    TOX_INDEX == pCurrentForm->GetTOXType() ? i - 1 : i );
        }
        String aCpy( aStr );
        aStr += ' ';
        aStr += aDeliStart;
        aStr += pCurrentForm->GetPattern(i);
        aStr += aDeliEnd;

        if( pCurrentForm->GetTemplate( i ).Len() )
        {
            aCpy += ' ';
            aCpy += aDeliStart;
            aCpy += pCurrentForm->GetTemplate( i );
            aCpy += aDeliEnd;
        }
        aLevelLB.InsertEntry( aCpy );
    }

    // Templates initialisieren
    const SwTxtFmtColl *pColl;
    SwWrtShell& rSh = ((SwMultiTOXTabDialog*)GetTabDialog())->GetWrtShell();
    const sal_uInt16 nSz = rSh.GetTxtFmtCollCount();

    for( i = 0; i < nSz; ++i )
        if( !(pColl = &rSh.GetTxtFmtColl( i ))->IsDefault() )
            aParaLayLB.InsertEntry( pColl->GetName() );

    // Pool-Collections abfragen und fuer das Verzeichnis setzen
    for( i = 0; i < pCurrentForm->GetFormMax(); ++i )
    {
        aStr = pCurrentForm->GetTemplate( i );
        if( aStr.Len() &&
            LISTBOX_ENTRY_NOTFOUND == aParaLayLB.GetEntryPos( aStr ))
            aParaLayLB.InsertEntry( aStr );
    }

    EnableSelectHdl(&aParaLayLB);
}
/* -----------------25.03.99 15:17-------------------
 *
 * --------------------------------------------------*/
int     SwTOXStylesTabPage::DeactivatePage( SfxItemSet* pSet  )
{
    GetForm() = *pCurrentForm;
    return LEAVE_PAGE;
}

/* -----------------25.03.99 15:17-------------------
 *
 * --------------------------------------------------*/
SfxTabPage* SwTOXStylesTabPage::Create( Window* pParent,
                                const SfxItemSet& rAttrSet)
{
    return new SwTOXStylesTabPage(pParent, rAttrSet);
}
/* -----------------26.03.99 12:47-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK( SwTOXStylesTabPage, EditStyleHdl, Button *, pBtn )
{
    if( LISTBOX_ENTRY_NOTFOUND != aParaLayLB.GetSelectEntryPos())
    {
        SfxStringItem aStyle(SID_STYLE_EDIT, aParaLayLB.GetSelectEntry());
        SfxUInt16Item aFamily(SID_STYLE_FAMILY, SFX_STYLE_FAMILY_PARA);
//      SwPtrItem aShell(FN_PARAM_WRTSHELL, pWrtShell);
        Window* pDefDlgParent = Application::GetDefDialogParent();
        Application::SetDefDialogParent( pBtn );
        SwWrtShell& rSh = ((SwMultiTOXTabDialog*)GetTabDialog())->GetWrtShell();
        rSh.GetView().GetViewFrame()->GetDispatcher()->Execute(
        SID_STYLE_EDIT, SFX_CALLMODE_SYNCHRON|SFX_CALLMODE_MODAL,
            &aStyle, &aFamily/*, &aShell*/, 0L);
        Application::SetDefDialogParent( pDefDlgParent );
    }
    return 0;
}
/*--------------------------------------------------------------------
     Beschreibung: Vorlagen zuweisen
 --------------------------------------------------------------------*/
IMPL_LINK( SwTOXStylesTabPage, AssignHdl, Button *, EMPTYARG )
{
    sal_uInt16 nLevPos   = aLevelLB.GetSelectEntryPos();
    sal_uInt16 nTemplPos = aParaLayLB.GetSelectEntryPos();
    if(nLevPos   != LISTBOX_ENTRY_NOTFOUND &&
       nTemplPos != LISTBOX_ENTRY_NOTFOUND)
    {
        String aStr(aLevelLB.GetEntry(nLevPos));
        sal_uInt16 nDelPos = aStr.Search(aDeliStart);
        if(nDelPos != STRING_NOTFOUND)
            aStr.Erase(nDelPos-1);
        aStr += ' ';
        aStr += aDeliStart;
        aStr += aParaLayLB.GetSelectEntry();

        pCurrentForm->SetTemplate(nLevPos, aParaLayLB.GetSelectEntry());

        aStr += aDeliEnd;

        aLevelLB.RemoveEntry(nLevPos);
        aLevelLB.InsertEntry(aStr, nLevPos);
        aLevelLB.SelectEntry(aStr);
        ModifyHdl(0);
    }
    return 0;
}
/* -----------------26.03.99 09:10-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK( SwTOXStylesTabPage, StdHdl, Button *, EMPTYARG )
{
    sal_uInt16 nPos = aLevelLB.GetSelectEntryPos();
    if(nPos != LISTBOX_ENTRY_NOTFOUND)
    {   String aStr(aLevelLB.GetEntry(nPos));
        sal_uInt16 nDelPos = aStr.Search(aDeliStart);
        if(nDelPos != STRING_NOTFOUND)
            aStr.Erase(nDelPos-1);
        aLevelLB.RemoveEntry(nPos);
        aLevelLB.InsertEntry(aStr, nPos);
        aLevelLB.SelectEntry(aStr);
        pCurrentForm->SetTemplate(nPos, aEmptyStr);
        ModifyHdl(0);
    }
    return 0;
}
/* -----------------26.03.99 09:11-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK_INLINE_START( SwTOXStylesTabPage, DoubleClickHdl, Button *, EMPTYARG )
{
    String aTmpName( aParaLayLB.GetSelectEntry() );
    SwWrtShell& rSh = ((SwMultiTOXTabDialog*)GetTabDialog())->GetWrtShell();

    if(aParaLayLB.GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND &&
       (aLevelLB.GetSelectEntryPos() == 0 || SwMultiTOXTabDialog::IsNoNum(rSh, aTmpName)))
        AssignHdl(&aAssignBT);
    return 0;
}
IMPL_LINK_INLINE_END( SwTOXStylesTabPage, DoubleClickHdl, Button *, EMPTYARG )
/*--------------------------------------------------------------------
     Beschreibung: nur wenn selektiert enable
 --------------------------------------------------------------------*/
IMPL_LINK( SwTOXStylesTabPage, EnableSelectHdl, ListBox *, EMPTYARG )
{
    //UpdatePattern();
    aStdBT.Enable(aLevelLB.GetSelectEntryPos()  != LISTBOX_ENTRY_NOTFOUND);

    SwWrtShell& rSh = ((SwMultiTOXTabDialog*)GetTabDialog())->GetWrtShell();
    String aTmpName(aParaLayLB.GetSelectEntry());
    aAssignBT.Enable(aParaLayLB.GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND &&
                     LISTBOX_ENTRY_NOTFOUND != aLevelLB.GetSelectEntryPos() &&
       (aLevelLB.GetSelectEntryPos() == 0 || SwMultiTOXTabDialog::IsNoNum(rSh, aTmpName)));
    aEditStyleBT.Enable(aParaLayLB.GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND );
    return 0;
}
/* -----------------------------18.01.00 16:54--------------------------------

 ---------------------------------------------------------------------------*/
IMPL_LINK(SwTOXStylesTabPage, ModifyHdl, void*, EMPTYARG)
{
    SwMultiTOXTabDialog* pTOXDlg = (SwMultiTOXTabDialog*)GetTabDialog();
    if(pTOXDlg)
    {
        GetForm() = *pCurrentForm;
        pTOXDlg->CreateOrUpdateExample(pTOXDlg->GetCurrentTOXType().eType, TOX_PAGE_STYLES);
    }
    return 0;
}
/******************************************************************************

******************************************************************************/
#define ITEM_SEARCH         1
#define ITEM_ALTERNATIVE    2
#define ITEM_PRIM_KEY       3
#define ITEM_SEC_KEY        4
#define ITEM_COMMENT        5
#define ITEM_CASE           6
#define ITEM_WORDONLY       7


SwEntryBrowseBox::SwEntryBrowseBox(Window* pParent, const ResId& rId,
                                                       BrowserMode nMode ) :
            DbBrowseBox( pParent, rId, nMode,
                           BROWSER_KEEPSELECTION |
                           BROWSER_COLUMNSELECTION |
                           BROWSER_MULTISELECTION |
                           BROWSER_TRACKING_TIPS |
                           BROWSER_HLINESFULL |
                           BROWSER_VLINESFULL |
                           BROWSER_AUTO_VSCROLL|
                           BROWSER_HIDECURSOR   ),
            sSearch(        ResId(ST_SEARCH         )),
            sAlternative(   ResId(ST_ALTERNATIVE    )),
            sPrimKey(       ResId(ST_PRIMKEY        )),
            sSecKey(        ResId(ST_SECKEY         )),
            sComment(       ResId(ST_COMMENT        )),
            sCaseSensitive( ResId(ST_CASESENSITIVE  )),
            sWordOnly(      ResId(ST_WORDONLY       )),
            sYes(           ResId(ST_TRUE           )),
            sNo(            ResId(ST_FALSE          )),
            aCellEdit(&GetDataWindow(), 0),
            aCellCheckBox(&GetDataWindow()),
            bModified(sal_False)
{
    FreeResource();
    aCellCheckBox.GetBox().EnableTriState(sal_False);
    xController = new DbEditCellController(&aCellEdit);
    xCheckController = new DbCheckBoxCellController(&aCellCheckBox);

    //////////////////////////////////////////////////////////////////////
    // HACK: BrowseBox invalidiert nicht ihre Childs, wie es eigentlich sein sollte.
    // Deshalb wird WB_CLIPCHILDREN zurueckgesetzt, wodurch das Invalidieren
    // der Childs erzwungen wird.
    WinBits aStyle = GetStyle();
    if( aStyle & WB_CLIPCHILDREN )
    {
        aStyle &= ~WB_CLIPCHILDREN;
        SetStyle( aStyle );
    }
    const String* aTitles[7] =
    {
        &sSearch,
        &sAlternative,
        &sPrimKey,
        &sSecKey,
        &sComment,
        &sCaseSensitive,
        &sWordOnly
    };

    long nWidth = GetSizePixel().Width();
    nWidth /=7;
    --nWidth;
    for(sal_uInt16 i = 1; i < 8; i++)
        InsertDataColumn( i, *aTitles[i - 1], nWidth,
                          HIB_STDSTYLE, HEADERBAR_APPEND );

}
/* -----------------------------19.01.00 11:29--------------------------------

 ---------------------------------------------------------------------------*/
sal_Bool    SwEntryBrowseBox::SeekRow( long nRow )
{
    nCurrentRow = nRow;
    return TRUE;
}
/* -----------------------------19.01.00 15:32--------------------------------

 ---------------------------------------------------------------------------*/
const String& SwEntryBrowseBox::GetCellText(long nRow, long nColumn) const
{
    const String* pRet = &aEmptyStr;
    if(aEntryArr.Count() > nRow)
    {
        AutoMarkEntry* pEntry = aEntryArr[nRow];
        switch(nColumn)
        {
            case  ITEM_SEARCH       :pRet = &pEntry->sSearch; break;
            case  ITEM_ALTERNATIVE  :pRet = &pEntry->sAlternative; break;
            case  ITEM_PRIM_KEY     :pRet = &pEntry->sPrimKey   ; break;
            case  ITEM_SEC_KEY      :pRet = &pEntry->sSecKey    ; break;
            case  ITEM_COMMENT      :pRet = &pEntry->sComment   ; break;
            case  ITEM_CASE         :pRet = pEntry->bCase ? &sYes : &sNo; break;
            case  ITEM_WORDONLY     :pRet = pEntry->bWord ? &sYes : &sNo; break;
        }
    }
    return *pRet;
}

/* -----------------------------19.01.00 11:29--------------------------------

 ---------------------------------------------------------------------------*/
void    SwEntryBrowseBox::PaintCell(OutputDevice& rDev,
                                const Rectangle& rRect, sal_uInt16 nColumnId) const
{
    const String& rPaint = GetCellText( nCurrentRow, nColumnId );
    sal_uInt16 nStyle = TEXT_DRAW_CLIP | TEXT_DRAW_CENTER;
    rDev.DrawText( rRect, rPaint, nStyle );
}
/* -----------------------------19.01.00 14:51--------------------------------

 ---------------------------------------------------------------------------*/
DbCellController* SwEntryBrowseBox::GetController(long nRow, sal_uInt16 nCol)
{
    return nCol < ITEM_CASE ? xController : xCheckController;
}
/* -----------------------------19.01.00 15:36--------------------------------

 ---------------------------------------------------------------------------*/
sal_Bool SwEntryBrowseBox::SaveModified()
{
    SetModified();
    long nRow = GetCurRow();
    sal_uInt16 nCol = GetCurColumnId();

    String sNew;
    sal_Bool bVal = sal_False;
    DbCellController* pController = 0;
    if(nCol < ITEM_CASE)
    {
        pController = xController;
        sNew = ((DbEditCellController*)pController)->GetEditWindow().GetText();
    }
    else
    {
        pController = xCheckController;
        bVal = ((DbCheckBoxCellController*)pController)->GetCheckBox().IsChecked();
    }
    AutoMarkEntry* pEntry = nRow >= aEntryArr.Count() ? new AutoMarkEntry
                                                      : aEntryArr[nRow];
    switch(nCol)
    {
        case  ITEM_SEARCH       : pEntry->sSearch = sNew; break;
        case  ITEM_ALTERNATIVE  : pEntry->sAlternative = sNew; break;
        case  ITEM_PRIM_KEY     : pEntry->sPrimKey   = sNew; break;
        case  ITEM_SEC_KEY      : pEntry->sSecKey    = sNew; break;
        case  ITEM_COMMENT      : pEntry->sComment   = sNew; break;
        case  ITEM_CASE         : pEntry->bCase = bVal; break;
        case  ITEM_WORDONLY     : pEntry->bWord = bVal; break;
    }
    if(nRow >= aEntryArr.Count())
    {
        aEntryArr.Insert( pEntry, aEntryArr.Count() );
        RowInserted(nRow, 1, sal_True, sal_True);
        if(nCol < ITEM_WORDONLY)
        {
            pController->ClearModified();
            GoToRow( nRow );
        }
    }
    return sal_True;
}
/* -----------------------------19.01.00 14:32--------------------------------

 ---------------------------------------------------------------------------*/
void    SwEntryBrowseBox::InitController(
                DbCellControllerRef& rController, long nRow, sal_uInt16 nCol)
{
    const String& rTxt = GetCellText( nRow, nCol );
    if(nCol < ITEM_CASE)
    {
        rController = xController;
        DbCellController* pController = xController;
        ((DbEditCellController*)pController)->GetEditWindow().SetText( rTxt );
    }
    else
    {
        rController = xCheckController;
        DbCellController* pController = xCheckController;
        ((DbCheckBoxCellController*)pController)->GetCheckBox().Check(
                                                            rTxt == sYes );
     }
}
/* -----------------------------19.01.00 12:19--------------------------------

 ---------------------------------------------------------------------------*/
void    SwEntryBrowseBox::ReadEntries(SvStream& rInStr)
{
    AutoMarkEntry* pToInsert = 0;
    const String sZero('0');
    rtl_TextEncoding  eTEnc = gsl_getSystemTextEncoding();
    while( !rInStr.GetError() && !rInStr.IsEof() )
    {
        String sLine;
        rInStr.ReadByteStringLine( sLine, eTEnc );

        // # -> comment
        // ; -> delimiter between entries ->
        // Format: TextToSearchFor;AlternativeString;PrimaryKey;SecondaryKey
        // Leading and trailing blanks are ignored
        if( sLine.Len() )
        {
            //comments are contained in separate lines but are put into the struct of the following data
            //line (if available)
            if( '#' != sLine.GetChar(0) )
            {
                if( !pToInsert )
                    pToInsert = new AutoMarkEntry;

                USHORT nSttPos = 0;
                pToInsert->sSearch      = sLine.GetToken(0, ';', nSttPos );
                pToInsert->sAlternative = sLine.GetToken(0, ';', nSttPos );
                pToInsert->sPrimKey     = sLine.GetToken(0, ';', nSttPos );
                pToInsert->sSecKey      = sLine.GetToken(0, ';', nSttPos );

                String sStr = sLine.GetToken(0, ';', nSttPos );
                pToInsert->bCase = sStr.Len() && sStr != sZero;

                sStr = sLine.GetToken(0, ';', nSttPos );
                pToInsert->bWord = sStr.Len() && sStr != sZero;

                aEntryArr.Insert( pToInsert, aEntryArr.Count() );
                pToInsert = 0;
            }
            else
            {
                if(pToInsert)
                    aEntryArr.Insert(pToInsert, aEntryArr.Count());
                pToInsert = new AutoMarkEntry;
                pToInsert->sComment = sLine;
                pToInsert->sComment.Erase(0, 1);
            }
        }
    }
    if( pToInsert )
        aEntryArr.Insert(pToInsert, aEntryArr.Count());
    RowInserted(0, aEntryArr.Count() + 1, sal_True);
}
/* -----------------------------19.01.00 12:19--------------------------------

 ---------------------------------------------------------------------------*/
void    SwEntryBrowseBox::WriteEntries(SvStream& rOutStr)
{
    //check if the current controller is modified
    sal_uInt16 nCol = GetCurColumnId();
    DbCellController* pController;
    if(nCol < ITEM_CASE)
        pController = xController;
    else
        pController = xCheckController;
    if(pController ->IsModified())
        GoToColumnId(nCol < ITEM_CASE ? ++nCol : --nCol );

    rtl_TextEncoding  eTEnc = gsl_getSystemTextEncoding();
    for(sal_uInt16 i = 0; i < aEntryArr.Count();i++)
    {
        AutoMarkEntry* pEntry = aEntryArr[i];
        if(pEntry->sComment.Len())
        {
            String sWrite('#');
            sWrite += pEntry->sComment;
            rOutStr.WriteByteStringLine( sWrite, eTEnc );
        }

        String sWrite( pEntry->sSearch );
        sWrite += ';';
        sWrite += pEntry->sAlternative;
        sWrite += ';';
        sWrite += pEntry->sPrimKey;
        sWrite += ';';
        sWrite += pEntry->sSecKey;
        sWrite += ';';
        sWrite += pEntry->bCase ? '1' : '0';
        sWrite += ';';
        sWrite += pEntry->bWord ? '1' : '0';

        if( sWrite.Len() > 5 )
            rOutStr.WriteByteStringLine( sWrite, eTEnc );
    }
}
/* -----------------------------21.01.00 11:49--------------------------------

 ---------------------------------------------------------------------------*/
sal_Bool SwEntryBrowseBox::IsModified()const
{
    if(bModified)
        return sal_True;


    //check if the current controller is modified
    sal_uInt16 nCol = GetCurColumnId();
    DbCellController* pController;
    if(nCol < ITEM_CASE)
        pController = xController;
    else
        pController = xCheckController;
    return pController ->IsModified();
}
/* -----------------------------19.01.00 11:29--------------------------------

 ---------------------------------------------------------------------------*/
SwAutoMarkDlg_Impl::SwAutoMarkDlg_Impl(Window* pParent, const String& rAutoMarkURL,
        const String& rAutoMarkType, sal_Bool bCreate) :
    ModalDialog(pParent, SW_RES(DLG_CREATE_AUTOMARK)),
    aOKPB(      this, ResId(PB_OK       )),
    aCancelPB(  this, ResId(PB_CANCEL   )),
    aHelpPB(    this, ResId(PB_HELP     )),
    aEntriesBB( this, ResId(BB_ENTRIES  )),
    aEntriesGB( this, ResId(GB_ENTRIES  )),
    sAutoMarkURL(rAutoMarkURL),
    sAutoMarkType(rAutoMarkType),
    bCreateMode(bCreate)
{
    FreeResource();
    aOKPB.SetClickHdl(LINK(this, SwAutoMarkDlg_Impl, OkHdl));

    INetURLObject aURLObj( sAutoMarkURL );
    sAutoMarkURL = aURLObj.PathToFileName();
    String sTitle = GetText();
    sTitle.AppendAscii( RTL_CONSTASCII_STRINGPARAM(": "));
    sTitle += sAutoMarkURL;
    SetText(sTitle);
    sal_Bool bError = sal_False;
    if( bCreateMode )
        aEntriesBB.RowInserted(0, 1, sal_True);
    else
    {
        SvFileStream aStream(sAutoMarkURL, STREAM_STD_READ);
        aStream.ReOpen();
        aStream.Seek(0);
        sal_uInt32 nError = aStream.GetError();
        if(!nError)
        {
            aEntriesBB.ReadEntries(aStream);
            aStream.Close();
        }
        else
            bError = sal_True;
    }

    if(bError)
        EndDialog(RET_CANCEL);
}
/* -----------------------------19.01.00 11:12--------------------------------

 ---------------------------------------------------------------------------*/
SwAutoMarkDlg_Impl::~SwAutoMarkDlg_Impl()
{
}
/* -----------------------------19.01.00 16:43--------------------------------

 ---------------------------------------------------------------------------*/
IMPL_LINK(SwAutoMarkDlg_Impl, OkHdl, OKButton*, pButton)
{
    sal_Bool bError = sal_False;
    if(aEntriesBB.IsModified() || bCreateMode)
    {
        SvFileStream aStream(sAutoMarkURL,
            bCreateMode ? STREAM_WRITE : STREAM_WRITE| STREAM_TRUNC);
        if(!bCreateMode)
        {
            aStream.ReOpen();
            aStream.Seek(0);
        }
        sal_uInt32 nError = aStream.GetError();
        aStream.SetStreamCharSet( RTL_TEXTENCODING_MS_1253 );
        if(!nError)
        {
            aEntriesBB.WriteEntries(aStream);
            aStream.Close();
        }
        else
            bError = sal_True;

    }
    if(!bError)
        EndDialog(RET_OK);
    return 0;
}
/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.162  2000/09/18 16:05:51  willem.vandorp
    OpenOffice header added.

    Revision 1.161  2000/08/24 12:22:06  os
    #71235# RequestHelp must call the base class

    Revision 1.160  2000/08/22 13:00:34  os
    #77818# SeekRow has to return TRUE

    Revision 1.159  2000/08/17 14:06:28  jp
    UI with decode URL

    Revision 1.158  2000/08/16 11:47:07  os
    #73593# set first token control to start position if all controls fit into the window

    Revision 1.157  2000/08/16 10:05:41  os
    #74364# additional style CheckBox now set correctly

    Revision 1.156  2000/08/14 06:58:34  os
    #77101# don't call AdjustLayout initially

    Revision 1.155  2000/08/09 14:53:25  os
    #77101# call AdjustLayout

    Revision 1.154  2000/08/03 07:56:09  jp
    change for syntax gcc and optimized

    Revision 1.153  2000/08/02 11:37:09  hjs
    syntax gcc

    Revision 1.152  2000/07/27 21:16:20  jp
    opt: get template names direct from the doc and don't load it from the resource

    Revision 1.151  2000/07/26 12:10:47  jp
    Bug #77101#: ShowPreviewHdl - don't call StateChanged

    Revision 1.150  2000/07/19 11:01:59  os
    properties added/renamed

    Revision 1.149  2000/07/03 08:53:42  jp
    must changes for VCL

    Revision 1.148  2000/06/26 13:06:16  os
    INetURLObject::SmartRelToAbs removed

    Revision 1.147  2000/06/19 12:12:28  os
    #71623# FillCharStyleListBox: optional sorted insertion

    Revision 1.146  2000/06/13 15:38:52  os
    CreateFromInt32

    Revision 1.145  2000/06/08 09:46:08  os
    using UCB

    Revision 1.144  2000/05/23 19:10:28  jp
    Bugfixes for Unicode

    Revision 1.143  2000/05/16 09:15:12  os
    project usr removed

    Revision 1.142  2000/04/26 14:51:23  os
    GetName() returns const String&

    Revision 1.141  2000/04/19 12:56:35  os
    include sfx2/filedlg.hxx removed

    Revision 1.140  2000/04/18 15:32:23  os
    UNICODE

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/index/cnttab.hrc b/sw/source/ui/index/cnttab.hrc
new file mode 100644
index 0000000..d40988f
--- /dev/null
+++ b/sw/source/ui/index/cnttab.hrc
@@ -0,0 +1,308 @@
/*************************************************************************
 *
 *  $RCSfile: cnttab.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:43 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#define CB_MARKS        4
#define CB_OUTLN        5
#define FT_LEVEL        6
#define ED_LEVEL        7
#define GB_CREATE       8
#define ED_BSP         11
#define GB_BSP         12
#define BT_OUTLN       13
#define GB_TITLE       14
#define ED_TITLE       15
#define BT_HELP        16
#define ST_AUTHTYPE    17

#define LB_ENTRY       20
#define FT_NUM         21
#define ED_ENTRY       22
#define BT_ENTRY_NUMBER  23
#define BT_ENTRY_TEXT  24
#define BT_TAB         25
#define BT_STD         26
#define BT_PAGE        27
#define GB_ENTRY       28
//#define FT_LEVEL       28
#define LB_LEVEL       29
#define FT_TEMPLATE    30
#define LB_PARALAY     31
#define BT_ASSIGN      32
#define GB_FORMAT      33
#define BT_ENTRY        34
//#define BT_EDIT        34
#define BT_JUMP        35
#define CB_RECALC_TABS      36
#define CB_FIRST_TAB_POS    37
#define MF_FIRST_TAB_POS    38
#define CB_REL_TO_TEXT      39
#define BT_EDIT_STYLE       40
#define CB_SAME             41
#define CB_FF               42
#define CB_CASE             43
#define CB_SEC              44
#define CB_ALPHA            45
#define GB_OPT              46
#define CB_MAKRS            47
#define DLB_TOD             48
#define CB_TEMPL            49
#define DLB_LAYOUT          50
#define CB_OBJECT           51
#define DLB_OBJECT          52
#define GB_SOURCE           53
#define CB_USER_MARKS       54
#define BT_ALL_LEVEL        55
#define FT_MAIN_ENTRY_STYLE 56
#define LB_MAIN_ENTRY_STYLE 57

//restart numbering
#define FT_TYPE             1
#define LB_TYPE             2
#define CB_READONLY         3
#define FT_TITLE            4
//#define ED_TITLE          5
#define GB_TYPETITLE        6
#define LB_AREA             7
//#define FT_LEVEL          8
#define NF_LEVEL            9
#define GB_AREA             10
#define CB_FROMHEADINGS     11
#define PB_CHAPTERDLG       12
#define CB_ADDSTYLES        13
#define PB_ADDSTYLES        14


#define CB_FROMOLE          17
#define CB_LEVELFROMCHAPTER 18
#define RB_FROMCAPTIONS     19
#define RB_FROMOBJECTNAMES  20
#define CB_TOXMARKS         21
#define GB_CREATEFROM       22
#define CB_COLLECTSAME      23
#define CB_USEFF            24
#define CB_CASESENSITIVE    25
#define CB_INITIALCAPS      26
#define CB_KEYASENTRY       27
#define CB_FROMFILE         28
//#define PB_FILE               29
#define MB_AUTOMARK         29
#define GB_IDXOPTIONS       30
//#define PB_CREATE_AUTOMARK    31
//#define PB_EDIT_AUTOMARK    32

#define CB_USE_DASH         33

#define GB_LEVEL                34
#define WIN_TOKEN               35
#define PB_ENTRYNO              36
#define PB_ENTRY                37
#define PB_CHAPTERINFO          38
#define PB_PAGENO               39
#define PB_TAB                  40
#define PB_HYPERLINK            41
#define FT_CHARSTYLE            42
#define LB_CHARSTYLE            43
#define PB_EDITSTYLE            44
#define FT_FILLCHAR             45
#define CB_FILLCHAR             46
#define FT_CHAPTERENTRY         47
#define LB_CHAPTERENTRY         48
#define FT_SORTING              49
#define LB_SORTING              50
#define FT_TABPOS               51
#define MF_TABPOS               52
#define CB_AUTORIGHT            53
#define CB_RELTOSTYLE           54
//#define GB_ENTRY              55
#define CB_RECALCTAB            56
#define CB_NUMSTYLEFROMPDESC    57
#define CB_ALPHADELIM           58
#define CB_COMMASEPARATED       59
//#define GB_FORMAT             60

#define STR_NO_CHAR_STYLE       61
#define CLB_FROMOBJ             62
#define GB_FROMOBJ              63
#define RES_SRCTYPES            64
#define WIN_LEFT_SCROLL         65
#define WIN_CTRL_PARENT         66
#define WIN_RIGHT_SCROLL        67
#define PB_ALL_LEVELS           68


#define STR_BUTTON_TEXT_START   70
#define STR_TOKEN_ENTRY_NO      (STR_BUTTON_TEXT_START)
#define STR_TOKEN_ENTRY_TEXT    (STR_BUTTON_TEXT_START + 1)
#define STR_TOKEN_ENTRY         (STR_BUTTON_TEXT_START + 2)
#define STR_TOKEN_TAB_STOP      (STR_BUTTON_TEXT_START + 3)
#define STR_TOKEN_TEXT          (STR_BUTTON_TEXT_START + 4)
#define STR_TOKEN_PAGE_NUMS     (STR_BUTTON_TEXT_START + 5)
#define STR_TOKEN_CHAPTER_INFO  (STR_BUTTON_TEXT_START + 6)
#define STR_TOKEN_LINK_START    (STR_BUTTON_TEXT_START + 7)
#define STR_TOKEN_LINK_END      (STR_BUTTON_TEXT_START + 8)
#define STR_TOKEN_AUTHORITY     (STR_BUTTON_TEXT_START + 9)

#define STR_BUTTON_HELP_TEXT_START  (STR_TOKEN_AUTHORITY + 1)
#define STR_TOKEN_HELP_ENTRY_NO      (STR_BUTTON_HELP_TEXT_START)
#define STR_TOKEN_HELP_ENTRY_TEXT    (STR_BUTTON_HELP_TEXT_START + 1)
#define STR_TOKEN_HELP_ENTRY         (STR_BUTTON_HELP_TEXT_START + 2)
#define STR_TOKEN_HELP_TAB_STOP      (STR_BUTTON_HELP_TEXT_START + 3)
#define STR_TOKEN_HELP_TEXT          (STR_BUTTON_HELP_TEXT_START + 4)
#define STR_TOKEN_HELP_PAGE_NUMS     (STR_BUTTON_HELP_TEXT_START + 5)
#define STR_TOKEN_HELP_CHAPTER_INFO  (STR_BUTTON_HELP_TEXT_START + 6)
#define STR_TOKEN_HELP_LINK_START    (STR_BUTTON_HELP_TEXT_START + 7)
#define STR_TOKEN_HELP_LINK_END      (STR_BUTTON_HELP_TEXT_START + 8)
#define STR_TOKEN_HELP_AUTHORITY     (STR_BUTTON_HELP_TEXT_START + 9)

#define STR_CHARSTYLE               (STR_TOKEN_HELP_AUTHORITY + 1)
#define TLB_STYLES              100
#define GB_STYLES               101
#define PB_OK                   102
#define PB_CANCEL               103
#define PB_HELP                 104
#define FT_CAPTIONSEQUENCE      105
#define LB_CAPTIONSEQUENCE      106
#define FT_DISPLAYTYPE          107
#define LB_DISPLAYTYPE          108
#define TR_HEADER               109
#define PB_LEFT                 110
#define PB_RIGHT                111
#define HB_STYLES               112
#define ST_HB_FIRST             113
#define CB_FROMTABLES           114
#define CB_FROMFRAMES           115
#define CB_FROMGRAPHICS         116
#define ST_USER_ADDSTYLE        117
#define ST_AUTOMARK_TYPE        118
#define LB_AUTHFIELD            119
#define PB_AUTHINSERT           120
#define PB_AUTHREMOVE           121
#define CB_SEQUENCE             122
#define FT_BRACKET              123
#define LB_BRACKET              124
#define GB_AUTHORITY            125
#define RB_DOCPOS               126
#define RB_SORTCONTENT          127
#define FT_FIRSTKEY             128
#define LB_FIRSTKEY             129
#define FT_SECONDKEY            130
#define LB_SECONDKEY            131
#define FT_THIRDDKEY            132
#define LB_THIRDKEY             133
#define GB_SORTKEY              134
#define GB_SORTING              135
#define STR_NOSORTKEY           136
#define RB_SORTUP1              137
#define RB_SORTUP2              138
#define RB_SORTUP3              139
#define RB_SORTDOWN1            140
#define RB_SORTDOWN2            141
#define RB_SORTDOWN3            142

#define STR_DELIM               143

#define TO_CONTENT          1
#define TO_INDEX            2
#define TO_ILLUSTRATION     4
#define TO_TABLE            8
#define TO_USER             16
#define TO_OBJECT           32
#define TO_AUTHORITIES      64

#define AREA_DOCUMENT       1
#define AREA_CHAPTER        2

//TabDialog
#define WIN_EXAMPLE         1
#define RES_EXAMPLE_TEXT    2
#define ARR_TEXT            3
#define ST_HEADING_1        4
#define ST_TEXT_1           5
#define ST_HEADING_1_1      6
#define ST_TEXT_1_1         7
#define ST_HEADING_1_2      8
#define ST_TEXT_1_2         9
#define ST_TABLE_LABEL      10
#define ST_FRAME_LABEL      11
#define ST_GRAPHIC_LABEL    12
#define ST_USERDEFINEDINDEX 13
#define CB_SHOWEXAMPLE      14


// AutoMark dialog
#define BB_ENTRIES          1
#define GB_ENTRIES          2

#define ST_SEARCH           10
#define ST_ALTERNATIVE      11
#define ST_PRIMKEY          12
#define ST_SECKEY           13
#define ST_COMMENT          14
#define ST_CASESENSITIVE    15
#define ST_WORDONLY         16
#define ST_TRUE             17
#define ST_FALSE            18


//ButtonMenu
#define MN_AUTOMARK_OPEN    1
#define MN_AUTOMARK_NEW     2
#define MN_AUTOMARK_EDIT    3

diff --git a/sw/source/ui/index/cnttab.src b/sw/source/ui/index/cnttab.src
new file mode 100644
index 0000000..7d61640
--- /dev/null
+++ b/sw/source/ui/index/cnttab.src
@@ -0,0 +1,4444 @@
/*************************************************************************
 *
 *  $RCSfile: cnttab.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:43 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "index.hrc"
#include "globals.hrc"
#include "cnttab.hrc"
#include "cmdid.h"
#include "helpid.h"

String STR_TITLE
{
    Text = "Titel" ;
    Text [ ENGLISH ] = "Titel" ;
    Text [ norwegian ] = "Tittel" ;
    Text [ italian ] = "Titolo" ;
    Text [ portuguese_brazilian ] = "Títilo" ;
    Text [ portuguese ] = "Título" ;
    Text [ finnish ] = "Otsikko" ;
    Text [ danish ] = "Titel" ;
    Text [ french ] = "Titre" ;
    Text [ swedish ] = "Titel" ;
    Text [ dutch ] = "Titel" ;
    Text [ spanish ] = "Título" ;
    Text [ english_us ] = "Title" ;
    Text[ chinese_simplified ] = "±êÌâ";
    Text[ russian ] = "Çàãëàâèå";
    Text[ polish ] = "Tytu³";
    Text[ japanese ] = "À²ÄÙ";
    Text[ greek ] = "Ôßôëïò";
    Text[ korean ] = "Á¦¸ñ";
    Text[ chinese_traditional ] = "¼ÐÃD";
    Text[ arabic ] = "ÇáÚäæÇä";
    Text[ turkish ] = "Baþlýk";
    Text[ language_user1 ] = " ";
};
String STR_ALPHA
{
    Text = "Trennzeichen" ;
    Text [ ENGLISH ] = "Delimiter" ;
    Text [ norwegian ] = "Skilletegn" ;
    Text [ italian ] = "Separatore" ;
    Text [ portuguese_brazilian ] = "Delimitador" ;
    Text [ portuguese ] = "Separador" ;
    Text [ finnish ] = "Erotin" ;
    Text [ danish ] = "Skilletegn" ;
    Text [ french ] = "Séparateur" ;
    Text [ swedish ] = "Skiljetecken" ;
    Text [ dutch ] = "Scheidingsteken" ;
    Text [ spanish ] = "Separador" ;
    Text [ english_us ] = "Separator" ;
    Text[ chinese_simplified ] = "·Ö¸ô·û";
    Text[ russian ] = "Ðàçäåëèòåëü";
    Text[ polish ] = "Separator";
    Text[ japanese ] = "‹æØ‚è‹L†";
    Text[ greek ] = "Äéá÷ùñéóôéêü";
    Text[ korean ] = "±¸ºÐ";
    Text[ chinese_traditional ] = "³s¦r²Å";
    Text[ arabic ] = "ÇáÝÇÕá";
    Text[ turkish ] = "Ayýrma iþareti";
    Text[ language_user1 ] = " ";
};
String STR_LEVEL
{
    Text = "Ebene " ;
    Text [ ENGLISH ] = "Level " ;
    Text [ norwegian ] = "Nivå " ;
    Text [ italian ] = "Livello  " ;
    Text [ portuguese_brazilian ] = "Nível" ;
    Text [ portuguese ] = "Nível " ;
    Text [ finnish ] = "Taso " ;
    Text [ danish ] = "Niveau " ;
    Text [ french ] = "Niveau " ;
    Text [ swedish ] = "Nivå  " ;
    Text [ dutch ] = "Niveau  " ;
    Text [ spanish ] = "Nivel " ;
    Text [ english_us ] = "Level " ;
    Text[ chinese_simplified ] = "¼¶ ";
    Text[ russian ] = "Óðîâåíü ";
    Text[ polish ] = "Poziom ";
    Text[ japanese ] = "ÚÍÞÙ ";
    Text[ greek ] = "Åðßðåäï ";
    Text[ korean ] = "·¹À̾î ";
    Text[ chinese_traditional ] = "¯Å ";
    Text[ arabic ] = "ÇáãÓÊæì ";
    Text[ turkish ] = "Düzey ";
    Text[ language_user1 ] = " ";
};
String STR_FILE_NOT_FOUND
{
    Text = "Die Datei \"%1\" konnte im Pfad \"%2\" nicht gefunden werden." ;
    Text [ ENGLISH ] = "The file \"%1\" could not be found in path \"%2\"." ;
    Text[ english_us ] = "The file, \"%1\" in the \"%2\" path could not be found.";
    Text[ portuguese ] = "Foi impossível encontrar o ficheiro \"%1\" no atalho \"%2\".";
    Text[ russian ] = "Íàéòè ôàéë \"%1\" ïî ìàðøðóòó \"%2\" íå óäàåòñÿ.";
    Text[ greek ] = "Ôï áñ÷åßï \"%1\" äåí Þôáí äõíáôüí íá âñåèåß óôç äéáäñïìÞ \"%2\".";
    Text[ dutch ] = "Bestand \"%1\" niet gevonden  in pad \"%2\".";
    Text[ french ] = "Impossible de trouver le fichier \"%1\" sur le chemin \"%2\" !";
    Text[ spanish ] = "No se pudo encontrar el archivo \"%1\" en la ruta \"%2\".";
    Text[ italian ] = "Non è stato possibile trovare il file \"%1\" nel percorso \"%2\".";
    Text[ danish ] = "Det var ikke muligt at finde filen \"%1\" på sti \"%2\".";
    Text[ swedish ] = "Filen \"%1\" kunde inte hittas i sökväg \"%2\".";
    Text[ polish ] = "Nie znaleziono pliku \"%1\" w œcie¿ce \"%2\".";
    Text[ portuguese_brazilian ] = "The file \"%1\" could not be found.";
    Text[ japanese ] = "̧²Ù \"%1\" ‚ÍÊß½ \"%2\" ‚ÉŒ©‚‚©‚è‚Ü‚¹‚ñ‚Å‚µ‚½B";
    Text[ korean ] = "\"%1\" ÆÄÀÏÀÌ\"%2\" °æ·Î¿¡¼­ ¹ß°ßµÇÁö ¾Ê½À´Ï´Ù.";
    Text[ chinese_simplified ] = "ÔÚ·¾¶ \"%2\" ÖÐÎÞ·¨ÕÒµ½Îļþ \"%1\" ¡£";
    Text[ chinese_traditional ] = "µLªk¦b¸ô®|¡§%2¡¨¤º§ä¨ìÀɮס§%1¡¨¡C";
    Text[ arabic ] = "ÊÚÐÑ ÇáÚ辄 Úáì ÇáãáÝ \"%1\" Ýí ÇáãÓÇÑ \"%2\".";
    Text[ turkish ] = "Dosya \"%1\" \"%2\" veri yolunda bulunamadý.";
};
/*************************************************************************

*************************************************************************/
TabDialog DLG_MULTI_TOX
{
    HelpID = HID_MULTI_TOX_DLG;
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Text = "Verzeichnis einfügen" ;
    Text [ ENGLISH ] = "Insert index" ;

    Moveable = TRUE ;

    TabControl 1
    {
        OutputSize = TRUE ;
        PageList =
        {
            PageItem
            {
                Identifier =  TP_TOX_SELECT;
                PageResID = TP_TOX_SELECT;
                Text = "Verzeichnis" ;
                Text [ ENGLISH ] = "Index" ;
                Text[ english_us ] = "Index";
                Text[ portuguese ] = "Índice";
                Text[ russian ] = "Óêàçàòåëü";
                Text[ greek ] = "ÅõñåôÞñéï";
                Text[ dutch ] = "Index";
                Text[ french ] = "Index";
                Text[ spanish ] = "Índice";
                Text[ italian ] = "Indice";
                Text[ danish ] = "Indeks";
                Text[ swedish ] = "Förteckning";
                Text[ polish ] = "Indeks";
                Text[ portuguese_brazilian ] = "Index";
                Text[ japanese ] = "õˆø";
                Text[ korean ] = "»öÀÎ";
                Text[ chinese_simplified ] = "Ŀ¼";
                Text[ chinese_traditional ] = "¥Ø¿ý";
                Text[ arabic ] = "ÝåÑÓ";
                Text[ turkish ] = "Dizin";
            };
            PageItem
            {
                Identifier =  TP_TOX_ENTRY;
                PageResID = TP_TOX_ENTRY;
                Text = "Einträge";
                Text [English] = "Entries";
                Text[ english_us ] = "Entries";
                Text[ portuguese ] = "Entradas";
                Text[ russian ] = "Ýëåìåíòû";
                Text[ greek ] = "ÅããñáöÝò";
                Text[ dutch ] = "Items";
                Text[ french ] = "Entrées";
                Text[ spanish ] = "Entradas";
                Text[ italian ] = "Voci";
                Text[ danish ] = "Elementer";
                Text[ swedish ] = "Poster";
                Text[ polish ] = "Wpisy";
                Text[ portuguese_brazilian ] = "Entries";
                Text[ japanese ] = "€–Ú";
                Text[ korean ] = "Ç׸ñ";
                Text[ chinese_simplified ] = "ÌõÄ¿";
                Text[ chinese_traditional ] = "±ø¥Ø";
                Text[ arabic ] = "ÅÏÎÇáÇÊ";
                Text[ turkish ] = "Giriþler";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier =  TP_TOX_STYLES;
                PageResID = TP_TOX_STYLES;
                Text = "Vorlagen" ;
                Text [ ENGLISH ] = "Styles" ;
                Text[ english_us ] = "Styles";
                Text[ portuguese ] = "Estilos";
                Text[ russian ] = "Ñòèëè";
                Text[ dutch ] = "Opmaakprofielen";
                Text[ french ] = "Styles";
                Text[ spanish ] = "Estilos";
                Text[ italian ] = "Modelli";
                Text[ danish ] = "Typografi";
                Text[ swedish ] = "Mallar";
                Text[ polish ] = "Szablony";
                Text[ portuguese_brazilian ] = "Styles";
                Text[ japanese ] = "½À²Ù";
                Text[ chinese_simplified ] = "Ñùʽ";
                Text[ chinese_traditional ] = "¼Ë¦¡";
                Text[ arabic ] = "ÃäãÇØ";
                Text[ greek ] = "Ðñüôõðá";
                Text[ korean ] = "À¯Çü";
                Text[ turkish ] = "Þablonlar";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_COLUMN ;
                PageResID = TP_COLUMN ;
                Text = "Spalten" ;
                Text [ ENGLISH ] = "Columns" ;
                Text [ norwegian ] = "Kolonner" ;
                Text [ italian ] = "Colonne" ;
                Text [ portuguese_brazilian ] = "Colunas" ;
                Text [ portuguese ] = "Colunas" ;
                Text [ finnish ] = "Sarakkeet" ;
                Text [ danish ] = "Kolonner" ;
                Text [ french ] = "Colonnes" ;
                Text [ swedish ] = "Kolumner" ;
                Text [ dutch ] = "Kolommen" ;
                Text [ spanish ] = "Columnas" ;
                Text [ english_us ] = "Columns" ;
                Text[ chinese_simplified ] = "À¸";
                Text[ russian ] = "Êîëîíêè";
                Text[ polish ] = "Kolumny";
                Text[ japanese ] = "’i‘g‚Ý";
                Text[ chinese_traditional ] = "Äæ";
                Text[ greek ] = "ÓôÞëåò";
                Text[ korean ] = "¿­";
                Text[ arabic ] = "ÃÚãÏÉ";
                Text[ turkish ] = "Sütunlar";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_BACKGROUND ;
                PageResID = TP_BACKGROUND ;
                Text = "Hintergrund" ;
                Text [ ENGLISH ] = "Background" ;
                Text [ norwegian ] = "Background" ;
                Text [ italian ] = "Sfondo" ;
                Text [ portuguese_brazilian ] = "Fundo" ;
                Text [ portuguese ] = "Plano de fundo" ;
                Text [ finnish ] = "Tausta" ;
                Text [ danish ] = "Baggrund" ;
                Text [ french ] = "Arrière-plan" ;
                Text [ swedish ] = "Bakgrund" ;
                Text [ dutch ] = "Achtergrond" ;
                Text [ spanish ] = "Fondo" ;
                Text [ english_us ] = "Background" ;
                Text[ chinese_simplified ] = "±³¾°";
                Text[ russian ] = "Ôîí";
                Text[ polish ] = "T³o";
                Text[ japanese ] = "”wŒi";
                Text[ chinese_traditional ] = "­I´º";
                Text[ greek ] = "Öüíôï";
                Text[ korean ] = "¹è°æ";
                Text[ arabic ] = "ÇáÎáÝíÉ";
                Text[ turkish ] = "Artalan";
                Text[ language_user1 ] = " ";
            };
        };
    };
    Window WIN_EXAMPLE
    {
        Pos = MAP_APPFONT ( 0 , 10 ) ;
        Size = MAP_APPFONT (  150, 160 ) ;
    };
    String ST_USERDEFINEDINDEX
    {
        Text = "Benutzerdefiniertes Verzeichnis" ;
        Text [ ENGLISH ] = "User-define index" ;
        Text[ english_us ] = "User-Defined Index";
        Text[ portuguese ] = "Índice personalizado";
        Text[ russian ] = "Óêàçàòåëü ïîëüçîâàòåëÿ";
        Text[ greek ] = "ÐñïóáñìïóìÝíï åõñåôÞñéï";
        Text[ dutch ] = "Gebruikergedefinieerde index";
        Text[ french ] = "Index personnalisé";
        Text[ spanish ] = "Índice del usuario";
        Text[ italian ] = "Indice personalizzato";
        Text[ danish ] = "Brugerdefineret indeks";
        Text[ swedish ] = "Användardefinierad förteckning";
        Text[ polish ] = "Indeks u¿ytkownika";
        Text[ portuguese_brazilian ] = "User-define index";
        Text[ japanese ] = "Õ°»Þ°’è‹`‚̍õˆø";
        Text[ korean ] = "»ç¿ëÀÚ Á¤ÀÇ »öÀÎ";
        Text[ chinese_simplified ] = "Óû§¶¨ÒåµÄĿ¼";
        Text[ chinese_traditional ] = "¦Û­q¥Ø¿ý";
        Text[ arabic ] = "ÝåÑÓ ãÚÑÝ ãä ÞÈá ÇáãÓÊÎÏã";
        Text[ turkish ] = "Kullanýcý tanýmlý dizin";
    };
    CheckBox CB_SHOWEXAMPLE
    {
        Size = MAP_APPFONT (  100, 10 ) ;
        Text = "~Vorschau anzeigen" ;
        Text [ ENGLISH ] = "Show ~preview" ;
        Text[ english_us ] = "Sho~w preview";
        Text[ portuguese ] = "~Mostrar Previsualizar";
        Text[ russian ] = "Âêëþ÷èòü ïðîñìîòð";
        Text[ greek ] = "Åì~öÜíéóç ðñïåðéóêüðçóçò";
        Text[ dutch ] = "~Voorbeeld weergeven";
        Text[ french ] = "Afficher l'~aperçu";
        Text[ spanish ] = "Previsuali~zación";
        Text[ italian ] = "Mostra anteprima";
        Text[ danish ] = "Vis eksempel";
        Text[ swedish ] = "~Visa förhandsvisning";
        Text[ polish ] = "Wyœwietl podgl¹d";
        Text[ portuguese_brazilian ] = "Show ~preview";
        Text[ japanese ] = "ÌßÚËÞ­°‚Ì•\\ަ(~W)";
        Text[ korean ] = "¹Ì¸®º¸±â º¸±â(~W)";
        Text[ chinese_simplified ] = "ÏÔʾԤÊÓ(~P)";
        Text[ chinese_traditional ] = "Åã¥Ü¹wÄý(~P)";
        Text[ arabic ] = "ÅÙåÇÑ ÇáãÚÇíäÉ";
        Text[ turkish ] = "Önizlemeyi görüntüle";
    };
    Text[ english_us ] = "Insert Index";
    Text[ portuguese ] = "Inserir índice";
    Text[ russian ] = "Âñòàâèòü óêàçàòåëü";
    Text[ greek ] = "ÐñïóèÞêç åõñåôçñßïõ";
    Text[ dutch ] = "Index invoegen";
    Text[ french ] = "Insertion d'index";
    Text[ spanish ] = "Insertar índice";
    Text[ italian ] = "Inserisci indice";
    Text[ danish ] = "Indsæt indeks";
    Text[ swedish ] = "Infoga förteckning";
    Text[ polish ] = "Wstaw indeks";
    Text[ portuguese_brazilian ] = "Insert index";
    Text[ japanese ] = "õˆø‚Ì‘}“ü";
    Text[ korean ] = "»öÀÎ »ðÀÔ";
    Text[ chinese_simplified ] = "²åÈëĿ¼";
    Text[ chinese_traditional ] = "´¡¤J¥Ø¿ý";
    Text[ arabic ] = "ÅÏÑÇÌ ÝåÑÓ";
    Text[ english_us ] = "Insert Index";
    Text[ portuguese ] = "Inserir índice";
    Text[ russian ] = "Âñòàâèòü óêàçàòåëü";
    Text[ greek ] = "ÐñïóèÞêç åõñåôçñßïõ";
    Text[ dutch ] = "Index invoegen";
    Text[ french ] = "Insertion d'index";
    Text[ spanish ] = "Insertar índice";
    Text[ italian ] = "Inserisci indice";
    Text[ danish ] = "Indsæt indeks";
    Text[ swedish ] = "Infoga förteckning";
    Text[ polish ] = "Wstaw indeks";
    Text[ portuguese_brazilian ] = "Insert index";
    Text[ japanese ] = "õˆø‚Ì‘}“ü";
    Text[ korean ] = "»öÀÎ »ðÀÔ";
    Text[ chinese_simplified ] = "²åÈëĿ¼";
    Text[ chinese_traditional ] = "´¡¤J¥Ø¿ý";
    Text[ arabic ] = "ÅÏÑÇÌ ÝåÑÓ";
    Text[ turkish ] = "Dizin ekle";
    Text[ language_user1 ] = " ";
};
//------------------------------------------------------------------
TabPage TP_TOX_SELECT
{
    HelpID =  HID_TP_TOX_SELECT;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Hide = TRUE ;

    FixedText       FT_TYPE
    {
        Pos = MAP_APPFONT ( 12 , 16 ) ;
        Size = MAP_APPFONT (  30, 10 ) ;
        Text = "T~yp" ;
        Text [ ENGLISH ] = "Type" ;
        Text[ english_us ] = "Type";
        Text[ portuguese ] = "T~ipo";
        Text[ russian ] = "Òèï";
        Text[ greek ] = "Ôý~ðïò";
        Text[ dutch ] = "~Type";
        Text[ french ] = "~Type";
        Text[ spanish ] = "Tip~o";
        Text[ italian ] = "Tipo";
        Text[ danish ] = "Type";
        Text[ swedish ] = "T~yp";
        Text[ polish ] = "Typ";
        Text[ portuguese_brazilian ] = "Type";
        Text[ japanese ] = "Ží—Þ";
        Text[ korean ] = "ŸÀÔ";
        Text[ chinese_simplified ] = "ÀàÐÍ";
        Text[ chinese_traditional ] = "Ãþ«¬";
        Text[ arabic ] = "ÇáäæÚ";
        Text[ turkish ] = "Tip";
        Text[ language_user1 ] = " ";
    };
    ListBox         LB_TYPE
    {
        Pos = MAP_APPFONT ( 45 , 14 ) ;
        Size = MAP_APPFONT ( 80 , 80 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        StringList =
        {
            < "Inhaltsverzeichnis" ;    TO_CONTENT      ;> ;
            < "Stichwortverzeichnis" ;  TO_INDEX        ;> ;
            < "Abbildungsverzeichnis" ; TO_ILLUSTRATION ;> ;
            < "Tabellenverzeichnis" ;   TO_TABLE        ;> ;
            < "Benutzerdefiniert" ;     TO_USER         ;> ;
            < "Objektverzeichnis" ;     TO_OBJECT       ;> ;
            < "Literaturverzeichnis" ;  TO_AUTHORITIES  ;> ;
        };
        StringList [ ENGLISH ] =
        {
            < "Table of contents" ;     TO_CONTENT        ;> ;
            < "Index" ;                 TO_INDEX          ;> ;
            < "Table of illustrations" ;TO_ILLUSTRATION   ;> ;
            < "Table of tables" ;       TO_TABLE          ;> ;
            < "User-Defined" ;  TO_USER           ;> ;
            < "Table of objects" ;      TO_OBJECT         ;> ;
            < "Table of authorities" ;  TO_AUTHORITIES    ;> ;
        };
    StringList [ language_user1 ] =
    {
            < " " ;     TO_CONTENT      ;> ;
        < " " ;     TO_INDEX        ;> ;
        < " " ; TO_ILLUSTRATION ;> ;
        < " " ;     TO_TABLE        ;> ;
        < " " ;     TO_USER         ;> ;
        < " " ;     TO_OBJECT       ;> ;
        < " " ; TO_AUTHORITIES  ;> ;
        };
    StringList [ english_us ] =
    {
            < "Table of Contents" ;     TO_CONTENT      ;> ;
        < "Alphabetical Index" ;    TO_INDEX        ;> ;
        < "Illustration Index" ; TO_ILLUSTRATION ;> ;
        < "Index of Tables" ;   TO_TABLE        ;> ;
        < "User-Defined" ;  TO_USER         ;> ;
        < "Table of Objects" ;  TO_OBJECT       ;> ;
        < "Bibliography" ;  TO_AUTHORITIES  ;> ;
    };
    StringList [ portuguese ] =
    {
            < "Índice geral" ;  TO_CONTENT      ;> ;
        < "Índice remissivo" ;  TO_INDEX        ;> ;
        < "Índice de ilustrações" ; TO_ILLUSTRATION ;> ;
        < "Índice de tabelas" ;     TO_TABLE        ;> ;
        < "Personalizado" ;     TO_USER         ;> ;
        < "Índice de objectos" ;    TO_OBJECT       ;> ;
        < "Bibliografia" ;  TO_AUTHORITIES  ;> ;
    };
    StringList [ russian ] =
    {
            < "Îãëàâëåíèå" ;    TO_CONTENT      ;> ;
        < "Ïðåäìåòíûé óêàçàòåëü" ;  TO_INDEX        ;> ;
        < "Ñïèñîê ðèñóíêîâ" ; TO_ILLUSTRATION ;> ;
        < "Ñïèñîê òàáëèö" ;     TO_TABLE        ;> ;
        < "Çàäàíî ïîëüçîâàòåëåì" ;  TO_USER         ;> ;
        < "Ñïèñîê îáúåêòîâ" ;   TO_OBJECT       ;> ;
        < "Ñïèñîê ëèòåðàòóðû" ; TO_AUTHORITIES  ;> ;
    };
    StringList [ greek ] =
    {
            < "ÊáôÜëïãïò ðåñéå÷ïìÝíùí" ;    TO_CONTENT      ;> ;
        < "ÅõñåôÞñéï ëÝîåùí" ;  TO_INDEX        ;> ;
        < "ÊáôÜëïãïò åéêüíùí" ; TO_ILLUSTRATION ;> ;
        < "ÅõñåôÞñéï ðéíÜêùí" ;     TO_TABLE        ;> ;
        < "ÐñïóáñìïóìÝíá" ;     TO_USER         ;> ;
        < "ÊáôÜëïãïò áíôéêåéìÝíùí" ;    TO_OBJECT       ;> ;
        < "Âéâëéïãñáößá" ;  TO_AUTHORITIES  ;> ;
    };
    StringList [ dutch ] =
    {
            < "Inhoudsopgave" ;     TO_CONTENT      ;> ;
        < "Trefwoordenregister" ;   TO_INDEX        ;> ;
        < "Afbeeldingenregister" ; TO_ILLUSTRATION ;> ;
        < "Tabellenregister" ;  TO_TABLE        ;> ;
        < "Gebruikergedefinieerd" ;     TO_USER         ;> ;
        < "Objectenregister" ;  TO_OBJECT       ;> ;
        < "Literatuurlijst" ;   TO_AUTHORITIES  ;> ;
    };
    StringList [ french ] =
    {
            < "Table des matières" ;    TO_CONTENT      ;> ;
        < "Index lexical" ;     TO_INDEX        ;> ;
        < "Index des illustrations" ; TO_ILLUSTRATION ;> ;
        < "Index des tables" ;  TO_TABLE        ;> ;
        < "Index personnalisé" ;    TO_USER         ;> ;
        < "Index des objets" ;  TO_OBJECT       ;> ;
        < "Bibliographie" ; TO_AUTHORITIES  ;> ;
    };
    StringList [ spanish ] =
    {
            < "Índice de contenido" ;   TO_CONTENT      ;> ;
        < "Índice alfabético" ;     TO_INDEX        ;> ;
        < "Índice de ilustraciones" ; TO_ILLUSTRATION ;> ;
        < "Índice de tablas" ;  TO_TABLE        ;> ;
        < "Índice del usuario" ;    TO_USER         ;> ;
        < "Índice de objetos" ;     TO_OBJECT       ;> ;
        < "Bibliografía" ;  TO_AUTHORITIES  ;> ;
    };
    StringList [ italian ] =
    {
            < "Indice generale" ;   TO_CONTENT      ;> ;
        < "Indice analitico" ;  TO_INDEX        ;> ;
        < "Indice delle illustrazioni" ; TO_ILLUSTRATION ;> ;
        < "Indice delle tabelle" ;  TO_TABLE        ;> ;
        < "Indice personalizzato" ;     TO_USER         ;> ;
        < "Indice degli oggetti" ;  TO_OBJECT       ;> ;
        < "Bibliografia" ;  TO_AUTHORITIES  ;> ;
    };
    StringList [ danish ] =
    {
            < "Indholdsfortegnelse" ;   TO_CONTENT      ;> ;
        < "Stikordsregister" ;  TO_INDEX        ;> ;
        < "Figuroversigt" ; TO_ILLUSTRATION ;> ;
        < "Tabeloversigt" ;     TO_TABLE        ;> ;
        < "Brugerdefineret" ;   TO_USER         ;> ;
        < "Objektindeks" ;  TO_OBJECT       ;> ;
        < "Litteraturliste" ;   TO_AUTHORITIES  ;> ;
    };
    StringList [ swedish ] =
    {
            < "Innehållsförteckning" ;  TO_CONTENT      ;> ;
        < "Sakregister" ;   TO_INDEX        ;> ;
        < "Illustrationsförteckning" ; TO_ILLUSTRATION ;> ;
        < "Tabellförteckning" ;     TO_TABLE        ;> ;
        < "Användardefinierad" ;    TO_USER         ;> ;
        < "Objektförteckning" ;     TO_OBJECT       ;> ;
        < "Litteraturförteckning" ; TO_AUTHORITIES  ;> ;
    };
    StringList [ polish ] =
    {
            < "Spis treœci" ;   TO_CONTENT      ;> ;
        < "Zestaw hase³" ;  TO_INDEX        ;> ;
        < "Spis obrazów" ; TO_ILLUSTRATION ;> ;
        < "Spis tabel" ;    TO_TABLE        ;> ;
        < "Zdefiniowane przez u¿ytkownika" ;    TO_USER         ;> ;
        < "Spis obiektów" ;     TO_OBJECT       ;> ;
        < "Spis literatury" ;   TO_AUTHORITIES  ;> ;
    };
    StringList [ portuguese_brazilian ] =
    {
            < "Inhaltsverzeichnis" ;    TO_CONTENT      ;> ;
        < "Stichwortverzeichnis" ;  TO_INDEX        ;> ;
        < "Abbildungsverzeichnis" ; TO_ILLUSTRATION ;> ;
        < "Tabellenverzeichnis" ;   TO_TABLE        ;> ;
        < "Benutzerverzeichnis" ;   TO_USER         ;> ;
        < "Objektverzeichnis" ;     TO_OBJECT       ;> ;
        < "Literaturverzeichnis" ;  TO_AUTHORITIES  ;> ;
    };
    StringList [ japanese ] =
    {
            < "–ÚŽŸ" ;  TO_CONTENT      ;> ;
        < "õˆø" ;  TO_INDEX        ;> ;
        < "}‚̍õˆø" ; TO_ILLUSTRATION ;> ;
        < "•\\‚̍õˆø" ;     TO_TABLE        ;> ;
        < "Õ°»Þ°’è‹`" ;     TO_USER         ;> ;
        < "µÌÞ¼Þª¸Ä‚̍õˆø" ;    TO_OBJECT       ;> ;
        < "ŽQl•¶Œ£•\\" ;   TO_AUTHORITIES  ;> ;
    };
    StringList [ korean ] =
    {
            < "³»¿ë Ç¥" ;   TO_CONTENT      ;> ;
        < "¾ËÆÄºª ¼øÀÇ »öÀÎ" ;  TO_INDEX        ;> ;
        < "»ðÈ­ »öÀÎ" ; TO_ILLUSTRATION ;> ;
        < "Ç¥ »öÀÎ" ;   TO_TABLE        ;> ;
        < "»ç¿ëÀÚ Á¤ÀÇ" ;   TO_USER         ;> ;
        < "°³Ã¼ Ç¥" ;   TO_OBJECT       ;> ;
        < "Âü°í ¹®Çå" ; TO_AUTHORITIES  ;> ;
    };
    StringList [ chinese_simplified ] =
    {
            < "ÄÚÈÝĿ¼" ;  TO_CONTENT      ;> ;
        < "Ë÷Òý" ;  TO_INDEX        ;> ;
        < "²åͼĿ¼" ; TO_ILLUSTRATION ;> ;
        < "±í¸ñĿ¼" ;  TO_TABLE        ;> ;
        < "Óû§×Ô¶¨µÄ" ;    TO_USER         ;> ;
        < "¶ÔÏóĿ¼" ;  TO_OBJECT       ;> ;
        < "ÎÄÏ×Ŀ¼" ;  TO_AUTHORITIES  ;> ;
    };
    StringList [ chinese_traditional ] =
    {
            < "¤º®e¥Ø¿ý" ;  TO_CONTENT      ;> ;
        < "¯Á¤Þ" ;  TO_INDEX        ;> ;
        < "´¡¹Ï¥Ø¿ý" ; TO_ILLUSTRATION ;> ;
        < "ªí®æ¥Ø¿ý" ;  TO_TABLE        ;> ;
        < "¦Û­q" ;  TO_USER         ;> ;
        < "ª«¥ó¥Ø¿ý" ;  TO_OBJECT       ;> ;
        < "¤åÄm¥Ø¿ý" ;  TO_AUTHORITIES  ;> ;
    };
    StringList [ arabic ] =
    {
            < "ÝåÑÓ ÇáãÍÊæíÇÊ" ;    TO_CONTENT      ;> ;
        < "ÝåÑÓ ÃÈÌÏí" ;    TO_INDEX        ;> ;
        < "ÝåÑÓ ÇáÕæÑ ÇáÅíÖÇÍíÉ" ; TO_ILLUSTRATION ;> ;
        < "ÝåÑÓ ÇáÌÏÇæá" ;  TO_TABLE        ;> ;
        < "ãÚÑÝ ãä ÞÈá ÇáãÓÊÎÏã" ;  TO_USER         ;> ;
        < "ÝåÑÓ ÇáßÇÆäÇÊ" ;     TO_OBJECT       ;> ;
        < "ÝåÑÓ ÇáãÑÇÌÚ" ;  TO_AUTHORITIES  ;> ;
    };
    StringList [ turkish ] =
    {
            < "Ýçindekiler" ;   TO_CONTENT      ;> ;
        < "Alfabetik dizin" ;   TO_INDEX        ;> ;
        < "Resim dizini" ; TO_ILLUSTRATION ;> ;
        < "Tablo dizini" ;  TO_TABLE        ;> ;
        < "Kullanýcý tanýmlý" ;     TO_USER         ;> ;
        < "Nesne dizini" ;  TO_OBJECT       ;> ;
        < "Kaynakça" ;  TO_AUTHORITIES  ;> ;
    };
    };
    CheckBox        CB_READONLY
    {
        Pos = MAP_APPFONT ( 130 , 16 ) ;
        Size = MAP_APPFONT ( 120 , 10 ) ;
        Text = "G~eschützt vor manuellen Änderungen" ;
        Text [ ENGLISH ] = "Protected against manual changes" ;
        Check = TRUE;
        Text[ english_us ] = "Protected against manual changes";
        Text[ portuguese ] = "~Protegido contra modificações manuais";
        Text[ russian ] = "Çàùèùåíî îò èçìåíåíèé âðó÷íóþ";
        Text[ greek ] = "Ðñïóôáóßá Ýíáíôé ÷~åéñïêßí. áëëáãþí";
        Text[ dutch ] = "B~eveiligd tegen handmatige wijzigingen.";
        Text[ french ] = "~Protégé contre toute modification manuelle";
        Text[ spanish ] = "Protegido contra modificaciones ~manuales";
        Text[ italian ] = "Prot~etto contro modifiche manuali";
        Text[ danish ] = "Beskyttet mod manuelle ændringer";
        Text[ swedish ] = "Skyddad för manuella ändringar";
        Text[ polish ] = "Chroniony przed rêcznymi zmianami";
        Text[ portuguese_brazilian ] = "Protected against manual changes";
        Text[ japanese ] = "”CˆÓ•ύX‚©‚ç•ÛŒì";
        Text[ korean ] = "¼öµ¿º¯È¯À¸·Î ºÎÅÍ º¸È£";
        Text[ chinese_simplified ] = "·ÀÖ¹ÊÖ¶¯¸ü¸Ä";
        Text[ chinese_traditional ] = "¤£¤¹³\\¤â¤uÅܧó";
        Text[ arabic ] = "ãÄãøä ÖÏ ÇáÊÛííÑÇÊ ÇáíÏæíÉ";
        Text[ turkish ] = "Manüel deðiþikliklere karþý koru";
        Text[ language_user1 ] = " ";
    };
    FixedText       FT_TITLE
    {
        Pos = MAP_APPFONT ( 12 , 31 ) ;
        Size = MAP_APPFONT ( 30 ,10 ) ;
        Text = "T~itel" ;
        Text [ ENGLISH ] = "Title" ;
        Text[ english_us ] = "~Title";
        Text[ portuguese ] = "~Título";
        Text[ russian ] = "Çàãîëîâîê";
        Text[ greek ] = "Ôßôëïò";
        Text[ dutch ] = "T~itel";
        Text[ french ] = "~Titre";
        Text[ spanish ] = "Títu~lo";
        Text[ italian ] = "T~itolo";
        Text[ danish ] = "Overskrift";
        Text[ swedish ] = "T~itel";
        Text[ polish ] = "Tytu³";
        Text[ portuguese_brazilian ] = "Title";
        Text[ japanese ] = "À²ÄÙ(~T)";
        Text[ korean ] = "Á¦¸ñ(~T)";
        Text[ chinese_simplified ] = "±êÌâ(~T)";
        Text[ chinese_traditional ] = "¼ÐÃD(~T)";
        Text[ arabic ] = "ÇáÚäæÇä";
        Text[ turkish ] = "Baþlýk";
        Text[ language_user1 ] = " ";
    };
    Edit            ED_TITLE
    {
        Pos = MAP_APPFONT ( 45 , 29 ) ;
        Size = MAP_APPFONT ( 203 , 12 ) ;
        Border = TRUE;
    };
    GroupBox        GB_TYPETITLE
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 248, 41 ) ;
        Text = "Typ und Titel" ;
        Text [ ENGLISH ] = "Type and title" ;
        Text[ english_us ] = "Type and title";
        Text[ portuguese ] = "Tipo e título";
        Text[ russian ] = "Òèï è çàãîëîâîê";
        Text[ greek ] = "Ôýðïò êáé ôßôëïò";
        Text[ dutch ] = "Type en titel";
        Text[ french ] = "Type et titre";
        Text[ spanish ] = "Tipo y título";
        Text[ italian ] = "Tipo e titolo";
        Text[ danish ] = "Type og overskrift";
        Text[ swedish ] = "Typ och titel";
        Text[ polish ] = "Typ i tytu³";
        Text[ portuguese_brazilian ] = "Type and title";
        Text[ japanese ] = "À²Ì߂ÆÀ²ÄÙ";
        Text[ korean ] = "ŸÀÔ°ú Á¦¸ñ";
        Text[ chinese_simplified ] = "±êÌâºÍÀàÐÍ";
        Text[ chinese_traditional ] = "Ãþ«¬©M¼ÐÃD";
        Text[ arabic ] = "ÇáäæÚ æÇáÚäæÇä";
        Text[ turkish ] = "Tip ve baþlýk";
        Text[ language_user1 ] = " ";
    };
    ListBox         LB_AREA
    {
        Pos = MAP_APPFONT ( 12 , 58 ) ;
        Size = MAP_APPFONT ( 113 , 12 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        StringList =
        {
            < "Gesamtes Dokument" ;     AREA_DOCUMENT       ;> ;
            < "Kapitel" ;               AREA_CHAPTER        ;> ;
        };
        StringList [ ENGLISH ] =
        {
            < "Entire document" ;   AREA_DOCUMENT         ;> ;
            < "Chapter" ;           AREA_CHAPTER          ;> ;
        };
    StringList [ language_user1 ] =
    {
            < " " ;     AREA_DOCUMENT       ;> ;
        < " " ;                 AREA_CHAPTER        ;> ;
    };
    StringList [ english_us ] =
    {
            < "Entire document" ;   AREA_DOCUMENT       ;> ;
        < "Chapter" ;               AREA_CHAPTER        ;> ;
    };
    StringList [ portuguese ] =
    {
            < "Documento inteiro" ;     AREA_DOCUMENT       ;> ;
        < "Capítulo" ;              AREA_CHAPTER        ;> ;
    };
    StringList [ russian ] =
    {
            < "Âåñü äîêóìåíò" ;     AREA_DOCUMENT       ;> ;
        < "Ãëàâà" ;                 AREA_CHAPTER        ;> ;
    };
    StringList [ greek ] =
    {
            < "Ïëüêëçñï ôï Ýããñáöï" ;   AREA_DOCUMENT       ;> ;
        < "ÊåöÜëáéï" ;              AREA_CHAPTER        ;> ;
    };
    StringList [ dutch ] =
    {
            < "Compleet document" ;     AREA_DOCUMENT       ;> ;
        < "Hoofdstuk" ;                 AREA_CHAPTER        ;> ;
    };
    StringList [ french ] =
    {
            < "Document entier" ;   AREA_DOCUMENT       ;> ;
        < "Chapitre" ;              AREA_CHAPTER        ;> ;
    };
    StringList [ spanish ] =
    {
            < "Todo el documento" ;     AREA_DOCUMENT       ;> ;
        < "Capítulo" ;              AREA_CHAPTER        ;> ;
    };
    StringList [ italian ] =
    {
            < "Intero documento" ;  AREA_DOCUMENT       ;> ;
        < "Capitolo" ;              AREA_CHAPTER        ;> ;
    };
    StringList [ danish ] =
    {
            < "Hele dokumentet" ;   AREA_DOCUMENT       ;> ;
        < "Kapitel" ;               AREA_CHAPTER        ;> ;
    };
    StringList [ swedish ] =
    {
            < "Hela dokumentet" ;   AREA_DOCUMENT       ;> ;
        < "Kapitel" ;               AREA_CHAPTER        ;> ;
    };
    StringList [ polish ] =
    {
            < "Ca³y dokument" ;     AREA_DOCUMENT       ;> ;
        < "Rozdzia³" ;              AREA_CHAPTER        ;> ;
    };
    StringList [ portuguese_brazilian ] =
    {
            < "Gesamtes Dokument" ;     AREA_DOCUMENT       ;> ;
        < "Kapitel" ;               AREA_CHAPTER        ;> ;
    };
    StringList [ japanese ] =
    {
            < "‚·‚ׂĂÌÄÞ·­ÒÝÄ" ;   AREA_DOCUMENT       ;> ;
        < "Í" ;                AREA_CHAPTER        ;> ;
    };
    StringList [ korean ] =
    {
            < "Àüü ¹®¼­" ;     AREA_DOCUMENT       ;> ;
        < "Àå" ;                AREA_CHAPTER        ;> ;
    };
    StringList [ chinese_simplified ] =
    {
            < "È«²¿Îĵµ" ;  AREA_DOCUMENT       ;> ;
        < "ÕÂ" ;                AREA_CHAPTER        ;> ;
    };
    StringList [ chinese_traditional ] =
    {
            < "¾ã­Ó¤å¥ó" ;  AREA_DOCUMENT       ;> ;
        < "³¹¸`" ;              AREA_CHAPTER        ;> ;
    };
    StringList [ arabic ] =
    {
            < "ãÓÊäÏ ßÇãá" ;    AREA_DOCUMENT       ;> ;
        < "ÇáÝÕá" ;                 AREA_CHAPTER        ;> ;
    };
    StringList [ turkish ] =
    {
            < "Tüm belge" ;     AREA_DOCUMENT       ;> ;
        < "Bölüm" ;                 AREA_CHAPTER        ;> ;
    };
    };
    FixedText       FT_LEVEL
    {
        Pos = MAP_APPFONT ( 145 , 59 ) ;
        Size = MAP_APPFONT ( 80 , 10 ) ;
        Text = "A~uswerten bis Ebene" ;
        Text [ ENGLISH ] = "Evaluation level" ;
        Text[ english_us ] = "Evaluation level";
        Text[ portuguese ] = "A~valiar até nível";
        Text[ russian ] = "Îöåíèòü äî óðîâíÿ";
        Text[ greek ] = "Áðïôßìçóç ùò åðßðåäï";
        Text[ dutch ] = "~Aantal niveaus";
        Text[ french ] = "~Niveau de profondeur souhaité";
        Text[ spanish ] = "E~valuar hasta nivel";
        Text[ italian ] = "Val~uta fino a livello";
        Text[ danish ] = "Evaluer indtil niveau";
        Text[ swedish ] = "~Utvärdera till nivå";
        Text[ polish ] = "Ewaluuj do poziomu";
        Text[ portuguese_brazilian ] = "Evaluation level";
        Text[ japanese ] = "ŽŸ‚ÌÚÍÞق܂œK—p";
        Text[ korean ] = "Æò°¡ ´Ü°è";
        Text[ chinese_simplified ] = "°üÀ¨±êÌâ¼¶±ð";
        Text[ chinese_traditional ] = "¥]¬A¼ÐÃD¯Å§O";
        Text[ arabic ] = "ÊÞííã ÍÊì ÇáãÓÊæì";
        Text[ turkish ] = "Þu düzeye kadar:";
        Text[ language_user1 ] = " ";
    };
    NumericField    NF_LEVEL
    {
        Pos = MAP_APPFONT ( 228 , 59 ) ;
        Size = MAP_APPFONT ( 20 , 12 ) ;
        Border = TRUE ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 1 ;
        Maximum = 10 ;
        Value = 10 ;
        SpinSize = 1 ;
    };
    GroupBox        GB_AREA
    {
        Pos = MAP_APPFONT ( 6 , 47 ) ;
        Size = MAP_APPFONT ( 248, 27 ) ;
        Text = "~Verzeichnis erstellen für" ;
        Text [ ENGLISH ] = "Create index of" ;
        Text[ english_us ] = "Create index for";
        Text[ portuguese ] = "Criar ín~dice para";
        Text[ russian ] = "Ñîçäàòü óêàçàòåëü äëÿ";
        Text[ greek ] = "Äçìéïõñãßá åõñåôçñßïõ ãéá";
        Text[ dutch ] = "~Index maken voor";
        Text[ french ] = "Créer un ~index pour";
        Text[ spanish ] = "Crear í~ndice para";
        Text[ italian ] = "Crea indice per";
        Text[ danish ] = "Opret indeks for";
        Text[ swedish ] = "Skapa fö~rteckning för";
        Text[ polish ] = "Utwórz indeks dla";
        Text[ portuguese_brazilian ] = "Create index of";
        Text[ japanese ] = "õˆøì¬‚̑ΏÛ";
        Text[ korean ] = "»öÀÎ ¸¸µé±â";
        Text[ chinese_simplified ] = "½¨Á¢Ä¿Â¼ÓÃÓÚ";
        Text[ chinese_traditional ] = "¥Í¦¨¥Ø¿ý¥Î©ó";
        Text[ arabic ] = "ÅäÔÇÁ ÝåÑÓ áÜ";
        Text[ turkish ] = "Þunun için dizin oluþtur:";
        Text[ language_user1 ] = " ";
    };
    CheckBox        CB_FROMHEADINGS
    {
        Pos = MAP_APPFONT ( 12 , 87 ) ;
        Size = MAP_APPFONT ( 95 , 10 ) ;
        Check = TRUE;
        Text = "~Gliederung" ;
        Text [ ENGLISH ] = "Outline" ;
        Text[ english_us ] = "Outline";
        Text[ portuguese ] = "~Esquema";
        Text[ russian ] = "Ñòðóêòóðà";
        Text[ greek ] = "ÄéÜñèñùóç";
        Text[ dutch ] = "~Overzicht";
        Text[ french ] = "~Structure";
        Text[ spanish ] = "~Esquema";
        Text[ italian ] = "Struttura";
        Text[ danish ] = "Disposition";
        Text[ swedish ] = "~Disposition";
        Text[ polish ] = "Konspekt";
        Text[ portuguese_brazilian ] = "Outline";
        Text[ japanese ] = "±³ÄײÝ";
        Text[ korean ] = "À±°û";
        Text[ chinese_simplified ] = "´ó¸Ù";
        Text[ chinese_traditional ] = "¤jºõ";
        Text[ arabic ] = "ÊÞÓíã";
        Text[ turkish ] = "Anahat";
        Text[ language_user1 ] = " ";
    };
    PushButton  PB_CHAPTERDLG
    {
        Pos = MAP_APPFONT ( 115 , 85 ) ;
        Size = MAP_APPFONT ( 10 , 10 ) ;
        Text = "~..." ;
        //Text [ ENGLISH ] = "" ;
        TabStop = TRUE ;
    };
    CheckBox CB_ADDSTYLES
    {
        Pos = MAP_APPFONT ( 12 , 100 ) ;
        Size = MAP_APPFONT ( 75 , 10  ) ;
        Text = "~weiteren Vorlagen" ;
        Text [ ENGLISH ] = "additional styles" ;
        Text[ english_us ] = "~Additional Styles";
        Text[ portuguese ] = "~Outros estilos";
        Text[ russian ] = "Äîïîëíèòåëüíûå ñòèëè";
        Text[ greek ] = "~Ðñüóèåôá ðñüôõðá";
        Text[ dutch ] = "~andere opmaakprofielen";
        Text[ french ] = "Styles ~supplémentaires";
        Text[ spanish ] = "Otro~s estilos";
        Text[ italian ] = "Altri modelli";
        Text[ danish ] = "Yderligere typografier";
        Text[ swedish ] = "Ytterligare ~mallar";
        Text[ polish ] = "Inne szablony";
        Text[ portuguese_brazilian ] = "additional styles";
        Text[ japanese ] = "‚»‚Ì‘¼‚̽À²Ù";
        Text[ korean ] = "ºÎ°¡ÀûÀÎ À¯Çü(~A)";
        Text[ chinese_simplified ] = "ÆäËüÑùʽ";
        Text[ chinese_traditional ] = "¨ä¥L¼Ë¦¡";
        Text[ arabic ] = "ÃäãÇØ ÅÖÇÝíÉ";
        Text[ turkish ] = "Diðer þablonlar";
        Text[ language_user1 ] = " ";
    };
    String ST_USER_ADDSTYLE
    {
        Text = "~Vorlagen" ;
        Text [ ENGLISH ] = "Styles" ;
        Text[ english_us ] = "Styl~es";
        Text[ portuguese ] = "E~stilos";
        Text[ russian ] = "Ñòèëè";
        Text[ greek ] = "Ðñüôõðá";
        Text[ dutch ] = "~Opmaakprofielen";
        Text[ french ] = "~Styles";
        Text[ spanish ] = "~Estilos";
        Text[ italian ] = "Modelli";
        Text[ danish ] = "Typografi";
        Text[ swedish ] = "~Mallar";
        Text[ polish ] = "Szablony";
        Text[ portuguese_brazilian ] = "Styles";
        Text[ japanese ] = "½À²Ù(~E)";
        Text[ korean ] = "À¯Çü(~E)";
        Text[ chinese_simplified ] = "Ñùʽ(~E)";
        Text[ chinese_traditional ] = "¼Ë¦¡(~E)";
        Text[ arabic ] = "ÃäãÇØ";
        Text[ turkish ] = "Þablonlar";
        Text[ language_user1 ] = " ";
    };
    PushButton      PB_ADDSTYLES
    {
        Pos = MAP_APPFONT ( 115 , 98 ) ;
        Size = MAP_APPFONT ( 10 , 10 ) ;
        Text = "..." ;
        //Text [ ENGLISH ] = "" ;
        TabStop = TRUE ;
    };
    RadioButton     RB_FROMCAPTIONS
    {
        Pos = MAP_APPFONT ( 12 , 87 ) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "Bes~chriftungen" ;
        Text [ ENGLISH ] = "Captions" ;
        Text[ english_us ] = "Captions";
        Text[ portuguese ] = "~Legendas";
        Text[ russian ] = "Íàçâàíèÿ";
        Text[ greek ] = "ÅðéãñáöÝò";
        Text[ dutch ] = "~Bijschriften";
        Text[ french ] = "Légendes";
        Text[ spanish ] = "Etiq~uetas";
        Text[ italian ] = "Diciture";
        Text[ danish ] = "Billedtekster";
        Text[ swedish ] = "Bi~ldtexter";
        Text[ polish ] = "Ety~kiety";
        Text[ portuguese_brazilian ] = "Captions";
        Text[ japanese ] = "×ÍÞÙ";
        Text[ korean ] = "ĸ¼Ç";
        Text[ chinese_simplified ] = "±êÇ©";
        Text[ chinese_traditional ] = "¼ÐÅÒ";
        Text[ arabic ] = "ÊÓãíÇÊ ÊæÖíÍíÉ";
        Text[ turkish ] = "Resim yazýsý";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_CAPTIONSEQUENCE
    {
        Pos = MAP_APPFONT ( 12 , 101 ) ;
        Size = MAP_APPFONT ( 40 , 10 ) ;
        Text = "~Kategorie" ;
        Text [ ENGLISH ] = "Category" ;
        Text[ english_us ] = "Category";
        Text[ portuguese ] = "~Categoria";
        Text[ russian ] = "Êàòåãîðèÿ";
        Text[ greek ] = "Êáôçãïñßá";
        Text[ dutch ] = "~Categorie";
        Text[ french ] = "~Catégorie";
        Text[ spanish ] = "~Categoría";
        Text[ italian ] = "C~ategoria";
        Text[ danish ] = "Kategori";
        Text[ swedish ] = "~Kategori";
        Text[ polish ] = "Kategorie";
        Text[ portuguese_brazilian ] = "Category";
        Text[ japanese ] = "¶ÃºÞذ";
        Text[ korean ] = "ºÐ·ùÇ׸ñ";
        Text[ chinese_simplified ] = "·ÖÀà";
        Text[ chinese_traditional ] = "­S³ò";
        Text[ arabic ] = "ÇáÝÆÉ";
        Text[ turkish ] = "Kategori";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_CAPTIONSEQUENCE
    {
        Pos = MAP_APPFONT ( 55 , 99 ) ;
        Size = MAP_APPFONT ( 70 , 40 ) ;
        DropDown = TRUE;
        TabStop = TRUE;
    };
    FixedText FT_DISPLAYTYPE
    {
        Pos = MAP_APPFONT ( 12 , 115 ) ;
        Size = MAP_APPFONT ( 40 , 10 ) ;
        Text = "~Anzeige" ;
        Text [ ENGLISH ] = "Display" ;
        Text[ english_us ] = "Display";
        Text[ portuguese ] = "~Monitor";
        Text[ russian ] = "Ïîêàçàòü";
        Text[ greek ] = "Ïèüíç";
        Text[ dutch ] = "~Weergave";
        Text[ french ] = "~Affichage";
        Text[ spanish ] = "Visuali~zación";
        Text[ italian ] = "~Visualizzazione";
        Text[ danish ] = "Visning";
        Text[ swedish ] = "Visning";
        Text[ polish ] = "Poka¿";
        Text[ portuguese_brazilian ] = "Display";
        Text[ japanese ] = "•\\ަ";
        Text[ korean ] = "Ç¥½Ã";
        Text[ chinese_simplified ] = "ÏÔʾ";
        Text[ chinese_traditional ] = "Åã¥Ü";
        Text[ arabic ] = "ÚÑÖ";
        Text[ turkish ] = "Görüntü";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_DISPLAYTYPE
    {
        Pos = MAP_APPFONT ( 55 , 114 ) ;
        Size = MAP_APPFONT ( 70 , 40 ) ;
        DropDown = TRUE;
        TabStop = TRUE;
        StringList =
        {
            < "Referenztext" ; > ;
            < "Kategorie und Nummer" ; > ;
            < "Beschriftungstext" ; > ;
        };
        StringList [English]=
        {
            < "Reference text" ; > ;
            < "Category and number" ; > ;
            < "Caption text" ; > ;
        };
    StringList [ language_user1 ] =
    {
            < " " ; > ;
        < " " ; > ;
        < " " ; > ;
    };
    StringList [ english_us ] =
    {
            < "References" ; > ;
        < "Category and Number" ; > ;
        < "Caption Text" ; > ;
    };
    StringList [ portuguese ] =
    {
            < "Texto de referência" ; > ;
        < "Categoria e número" ; > ;
        < "Texto para legenda" ; > ;
    };
    StringList [ russian ] =
    {
            < "Òåêñò ññûëêè" ; > ;
        < "Êàòåãîðèÿ è íîìåð" ; > ;
        < "Òåêñò íàçâàíèÿ" ; > ;
    };
    StringList [ greek ] =
    {
            < "Êåßìåíï áíáöïñÜò" ; > ;
        < "Êáôçãïñßá êáé áñéèìüò" ; > ;
        < "Êåßìåíï åðéãñáöÞò" ; > ;
    };
    StringList [ dutch ] =
    {
            < "Referentietekst" ; > ;
        < "Categorie en nummer" ; > ;
        < "Bijschrifttekst" ; > ;
    };
    StringList [ french ] =
    {
            < "Texte de référence" ; > ;
        < "Catégorie et numéro" ; > ;
        < "Texte de légende" ; > ;
    };
    StringList [ spanish ] =
    {
            < "Texto de referencia" ; > ;
        < "Categoría y número" ; > ;
        < "Texto de la etiqueta" ; > ;
    };
    StringList [ italian ] =
    {
            < "Testo di riferimento" ; > ;
        < "Categoria e numero" ; > ;
        < "Dicitura" ; > ;
    };
    StringList [ danish ] =
    {
            < "Referencetekst" ; > ;
        < "Kategori og nummer" ; > ;
        < "Billedtekst" ; > ;
    };
    StringList [ swedish ] =
    {
            < "Referenstext" ; > ;
        < "Kategori och nummer" ; > ;
        < "Bildtext" ; > ;
    };
    StringList [ polish ] =
    {
            < "Tekst odwo³añ" ; > ;
        < "Kategoria i numer" ; > ;
        < "Tekst etykiety" ; > ;
    };
    StringList [ portuguese_brazilian ] =
    {
            < "Referenztext" ; > ;
        < "Kategorie und Nummer" ; > ;
        < "Beschriftungstext" ; > ;
    };
    StringList [ japanese ] =
    {
            < "ŽQÆ•¶Žš—ñ" ; > ;
        < "¶ÃºÞذ‚Ɣԍ†" ; > ;
        < "×ÍÞÙ" ; > ;
    };
    StringList [ korean ] =
    {
            < "ÂüÁ¶" ; > ;
        < "ºÐ·ùÇ׸ñ°ú ¼ýÀÚ" ; > ;
        < "ĸ¼Ç ÅØ½ºÆ®" ; > ;
    };
    StringList [ chinese_simplified ] =
    {
            < "²Î¿¼ÎÄ" ; > ;
        < "·ÖÀàºÍ±àºÅ" ; > ;
        < "±êÇ©ÎÄ" ; > ;
    };
    StringList [ chinese_traditional ] =
    {
            < "°Ñ·Ó¤å" ; > ;
        < "­S³ò©M¸¹½X" ; > ;
        < "¼ÐÅÒ¤å" ; > ;
    };
    StringList [ arabic ] =
    {
            < "äÕ ãÑÌÚí" ; > ;
        < "ÇáÝÆÉ æÇáÑÞã" ; > ;
        < "äÕ ÇáÊÓãíÉ ÇáÊæÖíÍíÉ" ; > ;
    };
    StringList [ turkish ] =
    {
            < "Referans metni" ; > ;
        < "Kategori ve numara" ; > ;
        < "Resim yazýsý" ; > ;
    };
    };
    RadioButton        RB_FROMOBJECTNAMES
    {
        Pos = MAP_APPFONT ( 156 , 87 ) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "Obje~ktnamen" ;
        Text [ ENGLISH ] = "Object names" ;
        Text[ english_us ] = "Object names";
        Text[ portuguese ] = "Nomes de ~objectos";
        Text[ russian ] = "Íàçâàíèÿ îáúåêòîâ";
        Text[ greek ] = "Ïíüìáôá áíôéêåéìÝíïõ";
        Text[ dutch ] = "Obje~ctnamen";
        Text[ french ] = "~Noms d'objets";
        Text[ spanish ] = "Nombres de o~bjeto";
        Text[ italian ] = "~Nome oggetti";
        Text[ danish ] = "Objektnavne";
        Text[ swedish ] = "Objektnamn";
        Text[ polish ] = "Nazwy obiektów";
        Text[ portuguese_brazilian ] = "Object names";
        Text[ japanese ] = "µÌÞ¼Þª¸Ä–¼";
        Text[ korean ] = "°³Ã¼ À̸§";
        Text[ chinese_simplified ] = "¶ÔÏóÃû³Æ";
        Text[ chinese_traditional ] = "ª«¥ó¦WºÙ";
        Text[ arabic ] = "ÃÓãÇÁ ÇáßÇÆä";
        Text[ turkish ] = "Nesne adlarý";
        Text[ language_user1 ] = " ";
    };
    CheckBox        CB_TOXMARKS
    {
        Pos = MAP_APPFONT ( 12 , 113 ) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "Verzeichnism~arkierungen" ;
        Text [ ENGLISH ] = "Index entries" ;
        Text[ english_us ] = "Inde~x marks";
        Text[ portuguese ] = "~Marcas do índice";
        Text[ russian ] = "Ìåòêè óêàçàòåëÿ";
        Text[ greek ] = "ÓçìÜíóåéò åõñåôçñßïõ";
        Text[ dutch ] = "~Indexmarkeringen";
        Text[ french ] = "~Marques d'index";
        Text[ spanish ] = "Mar~cas del índice";
        Text[ italian ] = "Contrasse~gni indice";
        Text[ danish ] = "Indeksmarkeringer";
        Text[ swedish ] = "Förteckningsm~arkeringar";
        Text[ polish ] = "Zaz~naczanie indeksów";
        Text[ portuguese_brazilian ] = "Index entries";
        Text[ japanese ] = "õˆø‘I‘ð€–Ú";
        Text[ korean ] = "À妽º Ç¥±â(~X)";
        Text[ chinese_simplified ] = "±ê¼ÇĿ¼ÌõÄ¿";
        Text[ chinese_traditional ] = "¥Ø¿ý¼Ð°O";
        Text[ arabic ] = "ÊÍÏíÏÇÊ ÇáÝåÑÓ";
        Text[ turkish ] = "Dizin ~iþaretleri";
    };
    GroupBox        GB_CREATEFROM
    {
        Pos = MAP_APPFONT ( 6 , 77 ) ;
        Size = MAP_APPFONT ( 248, 56 ) ;
        Text = "Erzeugen aus" ;
        Text [ ENGLISH ] = "Create from" ;
        Text[ english_us ] = "Create from";
        Text[ portuguese ] = "Criar a partir de";
        Text[ russian ] = "Ñîçäàòü èç";
        Text[ greek ] = "Äçìéïõñãßá áðü";
        Text[ dutch ] = "Maken van";
        Text[ french ] = "Créer à partir de";
        Text[ spanish ] = "Crear de";
        Text[ italian ] = "Crea da";
        Text[ danish ] = "Opret ud fra";
        Text[ swedish ] = "Skapa från";
        Text[ polish ] = "Utwórz z";
        Text[ portuguese_brazilian ] = "Create from";
        Text[ japanese ] = "ì¬Œó•â";
        Text[ korean ] = "·ÎºÎÅÍ ¸¸µé±â";
        Text[ chinese_simplified ] = "Éú³É²ÉÓÃ";
        Text[ chinese_traditional ] = "¥Í¦¨±q";
        Text[ arabic ] = "ÅäÔÇÁ ãä";
        Text[ turkish ] = "Kaynak";
        Text[ language_user1 ] = " ";
    };
    CheckBox        CB_COLLECTSAME
    {
        Pos = MAP_APPFONT ( 12 , 86 ) ;
        Size = MAP_APPFONT ( 121 , 10 ) ;
        Text = "Zusammenfassen ~gleicher Einträge" ;
        Text [ ENGLISH ] = "Combine identical entries" ;
        Text[ english_us ] = "Combine identical entries";
        Text[ portuguese ] = "Agrupar entradas ~idênticas";
        Text[ russian ] = "Îáúåäèíÿòü îäèíàêîâûå ýëåìåíòû";
        Text[ greek ] = "Óõ~ãêÝíôñùóç ôáõôüóçìùí åããñáöþí";
        Text[ dutch ] = "~Samenvatten van identieke items";
        Text[ french ] = "Grouper les entrées ~identiques";
        Text[ spanish ] = "Com~binar entradas idénticas";
        Text[ italian ] = "Riunisci voci ~uguali";
        Text[ danish ] = "Kombiner identiske elementer";
        Text[ swedish ] = "Kom~binera likadana poster";
        Text[ polish ] = "Sc~al takie same wpisy";
        Text[ portuguese_brazilian ] = "Combine identical entries";
        Text[ japanese ] = "“¯ˆê€–ڂ𓝍‡";
        Text[ korean ] = "µ¿ÀÏ Ç׸ñ Á¶ÇÕ";
        Text[ chinese_simplified ] = "ºÏ²¢ÏàͬµÄÌõÄ¿";
        Text[ chinese_traditional ] = "¦X¦}¦P¤@±ø¥Ø";
        Text[ arabic ] = "Öã ÇáÅÏÎÇáÇÊ ÇáãÊãÇËáÉ";
        Text[ turkish ] = "~Eþ giriþleri birleþtir";
    };
    CheckBox        CB_USEFF
    {
        Pos = MAP_APPFONT ( 18 ,  98 ) ;
        Size = MAP_APPFONT ( 115 , 10 ) ;
        Text = "Zusammenfassen mit ~f oder ff" ;
        Text [ english ] = "Combine identical entries with ~pp." ;
        Text[ english_us ] = "Combine identical entries with p or ~pp";
        Text[ portuguese ] = "Combinar com entradas ~seguinte(s)";
        Text[ russian ] = "Îáúåäèíÿòü ýëåìåíòû ñ ñ èëè ññ";
        Text[ greek ] = "ÁíÜëõóç ìå ~å Þ ìå åð.";
        Text[ dutch ] = "Samenvatten met ~e.v.";
        Text[ french ] = "~avec \"et suiv.\"";
        Text[ spanish ] = "Combinar entradas con las ~siguiente(s)";
        Text[ italian ] = "Riunisci con ~p. o pp.";
        Text[ danish ] = "Kombiner med f. eller ff.";
        Text[ swedish ] = "Kombinera med ~f eller ff";
        Text[ polish ] = "Streœæ za pomoc¹ s lub ss";
        Text[ portuguese_brazilian ] = "Combine identical entries with ~pp.";
        Text[ japanese ] = "‘±‚«Íß°¼Þ‚ð p ‚Ü‚½‚Í pp ‚Å•\\ަ(~P)";
        Text[ korean ] = "p ¶Ç´Âpp¿Í µ¿ÀÏ Ç׸ñÀ» Çϳª·Î ¹­À½(~P)";
        Text[ chinese_simplified ] = "ºÏ²¢´ø f »ò ff µÄÌõÄ¿(~P)";
        Text[ chinese_traditional ] = "¦X¦}¥Î ~f ©Î ff";
        Text[ arabic ] = "Combine identical entries with ~pp.";
        Text[ turkish ] = "Sonraki ~sayfa ya da sayfalar ile birleþtir";
    };
    CheckBox CB_USE_DASH
    {
        Pos = MAP_APPFONT ( 18 , 110 ) ;
        Size = MAP_APPFONT ( 115 , 10 ) ;
        Text = "Zusammenfassen ~mit -" ;
        Text [ english ] = "Combine identical entries with -" ;
        Text[ english_us ] = "Combine with -";
        Text[ portuguese ] = "Agrupar ~com -";
        Text[ russian ] = "Îáúåäèíÿòü ýëåìåíòû ñ -";
        Text[ greek ] = "ÓõãêÝíôñùóç ~ìå";
        Text[ dutch ] = "Samenvatten ~met -";
        Text[ french ] = "a~vec -";
        Text[ spanish ] = "U~nir con -";
        Text[ italian ] = "Riunisci ~con -";
        Text[ danish ] = "Kombiner med -";
        Text[ swedish ] = "Kombinera ~med -";
        Text[ polish ] = "~Scal z -";
        Text[ portuguese_brazilian ] = "Combine identical entries with -";
        Text[ japanese ] = "‘±‚«Íß°¼Þ‚ð - ‚Å•\\ަ";
        Text[ korean ] = "-¿Í µ¿ÀÏ Ç׸ñ Á¶ÇÕ";
        Text[ chinese_simplified ] = "Óà - ºÏ²¢";
        Text[ chinese_traditional ] = "¦X¦}¥Î -";
        Text[ arabic ] = "Öã ÈÇÓÊÎÏÇã -";
        Text[ turkish ] = "~Birleþme -";
    };
    CheckBox        CB_CASESENSITIVE
    {
        Pos = MAP_APPFONT ( 18 , 122 ) ;
        Size = MAP_APPFONT ( 115 , 10 ) ;
        Text = "Groß- und ~Kleinschreibung beachten" ;
        Text [ ENGLISH ] = "Case sensitive" ;
        Text[ english_us ] = "Case sensitive";
        Text[ portuguese ] = "Maiús~culas e minúsculas";
        Text[ russian ] = "Ó÷èòûâàòü ðåãèñòð";
        Text[ greek ] = "Óõìöùíßá ðåæþí-êåöáëáßùí";
        Text[ dutch ] = "Hoofdletters/~kleine letters belangrijk";
        Text[ french ] = "en respectant la ~casse";
        Text[ spanish ] = "~Mayúsculas/minúsculas";
        Text[ italian ] = "Maiuscole/minu~scole";
        Text[ danish ] = "Forskel på store og små bogstaver";
        Text[ swedish ] = "Observera stor och liten bo~kstav";
        Text[ polish ] = "Uwzglêd~nij ma³e i du¿e litery";
        Text[ portuguese_brazilian ] = "Case sensitive";
        Text[ japanese ] = "‘å•¶Žš/¬•¶Žš‚ð‹æ•Ê";
        Text[ korean ] = "´ë/¼Ò¹®ÀÚ ±¸ºÐ";
        Text[ chinese_simplified ] = "Çø·Ö´óСд";
        Text[ chinese_traditional ] = "°Ï¤À¦r¥À¤j¤p¼g";
        Text[ arabic ] = "ãÑÇÚÇÉ ÇáÃÍÑÝ ÇáßÈíÑÉ/ÇáÕÛíÑÉ";
        Text[ turkish ] = "Büyük/küçük harf duyarlý";
        Text[ language_user1 ] = " ";
    };
    CheckBox        CB_INITIALCAPS
    {
        Pos = MAP_APPFONT ( 136 , 86 ) ;
        Size = MAP_APPFONT ( 115 , 10 ) ;
        Text = "Einträge ~automatisch großschreiben";
        Text [ ENGLISH ] = "Capitalize entries";
        Text[ english_us ] = "AutoCapitalize entries";
        Text[ portuguese ] = "~Escrever entradas em maiúsculas autom.";
        Text[ russian ] = "Ýëåìåíòû çàãëàâíûìè áóêâàìè (àâòîì.)";
        Text[ greek ] = "ÅããñáöÝò áõôïìÜôùò ìå êåöáëáßá ãñÜììáôá";
        Text[ dutch ] = "Items automatisch in ~hoofdletterss";
        Text[ french ] = "Entrées en majuscules (autom.)";
        Text[ spanish ] = "Escribir entradas automáticamente en ma~yúsculas";
        Text[ italian ] = "Scrivi le voci maiusc~ole";
        Text[ danish ] = "Skriv elementer automatisk med stort";
        Text[ swedish ] = "Skriv ~automatiskt poster med stor bokstav";
        Text[ polish ] = "Wpisy autom. zapisywa~æ du¿ymi literami";
        Text[ portuguese_brazilian ] = "Capitalize entries";
        Text[ japanese ] = "Œê“ª‚ðŽ©“®“I‚É‘å•¶Žš‚É‚·‚é";
        Text[ korean ] = "´ë¹®ÀÚ Ç׸ñ";
        Text[ chinese_simplified ] = "×Ô¶¯×ª»»³É´óдÌõÄ¿";
        Text[ chinese_traditional ] = "Âà°ÊÂà´«¦¨¤j¼g¦r¥À";
        Text[ arabic ] = "ßÊÇÈÉ ÇáÅÏÎÇáÇÊ ÈÃÍÑÝ ßÈíÑÉ ÊáÞÇÆíÇð";
        Text[ turkish ] = "Giriþleri otomatik olarak büyük harfle baþla";
        Text[ language_user1 ] = " ";
    };
    CheckBox        CB_KEYASENTRY
    {
        Pos = MAP_APPFONT ( 136, 98 ) ;
        Size = MAP_APPFONT ( 100 , 10 ) ;
        Text = "~Schlüssel als eigener Eintrag" ;
        Text [ ENGLISH ] = "Keys as separate entries" ;
        Text[ english_us ] = "Keys as separate entries";
        Text[ portuguese ] = "~Chaves como entradas separadas";
        Text[ russian ] = "Êëþ÷ êàê îòäåëüíûé ýëåìåíò";
        Text[ greek ] = "ÊëåéäéÜ ùò îå÷ùñé~óôÞ åéóáãùãÞ";
        Text[ dutch ] = "~Sleutel als extra item";
        Text[ french ] = "~Clé comme entrée séparée";
        Text[ spanish ] = "~Claves como entradas propias";
        Text[ italian ] = "~Chiavi come voci separate";
        Text[ danish ] = "Nøgle som separat element";
        Text[ swedish ] = "~Nyckel som egen post";
        Text[ polish ] = "Klucz ja~ko wpis w³asny";
        Text[ portuguese_brazilian ] = "Keys as separate entries";
        Text[ japanese ] = "”CˆÓ“ü—Í—p·°";
        Text[ korean ] = "ºÐ¸® Ç׸ñÀ¸·Î¼­ÀÇ Å°";
        Text[ chinese_simplified ] = "¼üÂë×÷Ϊµ¥¶ÀµÄÌõÄ¿";
        Text[ chinese_traditional ] = "Áä½X·í§@¤@­Ó¦Û¤vªº±ø¥Ø";
        Text[ arabic ] = "ÇáãÝÊÇÍ ßÅÏÎÇá ãäÝÕá";
        Text[ turkish ] = "Anahtarlarý ayrý giriþ olarak gir";
    };
    CheckBox    CB_FROMFILE
    {
        Pos = MAP_APPFONT ( 136 , 110 ) ;
        Size = MAP_APPFONT ( 73 , 10 ) ;
        Text = "Konko~rdanzdatei" ;
        Text [ ENGLISH ] = "...file??" ;
        Text[ english_us ] = "~Concordance file";
        Text[ portuguese ] = "~Ficheiro de concordância";
        Text[ russian ] = "Ôàéë-êîíêîðäàíñ";
        Text[ greek ] = "~Áñ÷åßï ôáîéíüìçóçò";
        Text[ dutch ] = "~Concordantiebestand";
        Text[ french ] = "Fichier de ~concordance";
        Text[ spanish ] = "~Archivo de concordancia";
        Text[ italian ] = "File di conco~rdanza";
        Text[ danish ] = "Konkordansfil";
        Text[ swedish ] = "Konkordansfil";
        Text[ polish ] = "Plik konkordancji";
        Text[ portuguese_brazilian ] = "Create entries from file";
        Text[ japanese ] = "—pŒêõˆø(~C)";
        Text[ korean ] = "ÀÏÄ¡ÇÏ´Â ÆÄÀÏ(~C)";
        Text[ chinese_simplified ] = "ÓÉÎļþ»ã±à³öÌõÄ¿(~C)";
        Text[ chinese_traditional ] = "±qÀÉ®×¶×½s±ø¥Ø(~C)";
        Text[ arabic ] = "ãáÝ ÝåÑÓ ÃÈÌÏí";
        Text[ turkish ] = "Uyumluluk dosyasý";
    };
    CheckBox    CB_FROMTABLES
    {
        Pos = MAP_APPFONT ( 112 , 87 ) ;
        Size = MAP_APPFONT ( 68 , 10 ) ;
        Text = "~Tabellen" ;
        Text [ ENGLISH ] = "Tables" ;
        Text[ english_us ] = "Tables";
        Text[ portuguese ] = "~Tabelas";
        Text[ russian ] = "Òàáëèöû";
        Text[ greek ] = "Ðßíáêåò";
        Text[ dutch ] = "~Tabellen";
        Text[ french ] = "~Tables";
        Text[ spanish ] = "~Tablas";
        Text[ italian ] = "Ta~belle";
        Text[ danish ] = "Tabeller";
        Text[ swedish ] = "~Tabeller";
        Text[ polish ] = "Tabele";
        Text[ portuguese_brazilian ] = "Tables";
        Text[ japanese ] = "•\\";
        Text[ korean ] = "ǥ";
        Text[ chinese_simplified ] = "±í¸ñ";
        Text[ chinese_traditional ] = "ªí®æ";
        Text[ arabic ] = "ÌÏÇæá";
        Text[ turkish ] = "Tablolar";
        Text[ language_user1 ] = " ";
    };
    CheckBox    CB_FROMFRAMES
    {
        Pos = MAP_APPFONT ( 182 , 87 ) ;
        Size = MAP_APPFONT ( 68 , 10 ) ;
        Text = "Te~xtrahmen" ;
        Text [ ENGLISH ] = "Text frames" ;
        Text[ english_us ] = "Te~xt frames";
        Text[ portuguese ] = "~Molduras de texto";
        Text[ russian ] = "Òåêñòîâûå ðàìêè";
        Text[ greek ] = "Ðëáßóéï êåéìÝíïõ";
        Text[ dutch ] = "~Tekstkaders";
        Text[ french ] = "Cadre ~texte";
        Text[ spanish ] = "Marco de te~xto";
        Text[ italian ] = "Cornici";
        Text[ danish ] = "Tekstboks";
        Text[ swedish ] = "Textramar";
        Text[ polish ] = "Ramki tekstu";
        Text[ portuguese_brazilian ] = "Text frames";
        Text[ japanese ] = "÷½Ä˜g(~X)";
        Text[ korean ] = "ÅØ½ºÆ® ÇÁ·¹ÀÓ(~X)";
        Text[ chinese_simplified ] = "Îı¾¿ò(~X)";
        Text[ chinese_traditional ] = "¤å¦r¤è®Ø(~X)";
        Text[ arabic ] = "ÅØÇÑÇÊ äÕ";
        Text[ turkish ] = "Metin çerçevesi";
        Text[ language_user1 ] = " ";
    };
    CheckBox    CB_FROMGRAPHICS
    {
        Pos = MAP_APPFONT ( 112 , 100 ) ;
        Size = MAP_APPFONT ( 68 , 10 ) ;
        Text = "~Grafiken" ;
        Text [ ENGLISH ] = "Graphics" ;
        Text[ english_us ] = "Graphics";
        Text[ portuguese ] = "~Imagens";
        Text[ russian ] = "Ðèñóíêè";
        Text[ greek ] = "ÃñáöéêÜ";
        Text[ dutch ] = "~Afbeeldingen";
        Text[ french ] = "~Images";
        Text[ spanish ] = "Imágene~s";
        Text[ italian ] = "~Immagini";
        Text[ danish ] = "Billeder";
        Text[ swedish ] = "~Grafiker";
        Text[ polish ] = "Grafiki";
        Text[ portuguese_brazilian ] = "Graphics";
        Text[ japanese ] = "}";
        Text[ korean ] = "±×·¡ÇÈ";
        Text[ chinese_simplified ] = "ͼÐÎ";
        Text[ chinese_traditional ] = "¹Ï§Î";
        Text[ arabic ] = "ÕæÑ";
        Text[ turkish ] = "Grafikler";
        Text[ language_user1 ] = " ";
    };
    CheckBox        CB_FROMOLE
    {
        Pos = MAP_APPFONT ( 182 , 100 ) ;
        Size = MAP_APPFONT ( 68 , 10 ) ;
        Text = "~OLE-Objekten" ;
        Text [ ENGLISH ] = "OLE objects" ;
        Text[ english_us ] = "OLE objects";
        Text[ portuguese ] = "~Objectos OLE";
        Text[ russian ] = "Îáúåêòû OLE";
        Text[ greek ] = "Áíôéêåßìåíá OLE";
        Text[ dutch ] = "~OLE-objecten";
        Text[ french ] = "Objets ~OLE";
        Text[ spanish ] = "Objetos O~LE";
        Text[ italian ] = "O~ggetti OLE";
        Text[ danish ] = "OLE-objekter";
        Text[ swedish ] = "~OLE-objekt";
        Text[ polish ] = "Obiekty OLE";
        Text[ portuguese_brazilian ] = "OLE objects";
        Text[ japanese ] = "OLEµÌÞ¼Þª¸Ä";
        Text[ korean ] = "OLE °³Ã¼";
        Text[ chinese_simplified ] = "OLE ¶ÔÏó";
        Text[ chinese_traditional ] = "OLE ª«¥ó";
        Text[ arabic ] = "ßÇÆäÇÊ OLE";
        Text[ turkish ] = "OLE nesneleri";
        Text[ language_user1 ] = " ";
    };
    CheckBox        CB_LEVELFROMCHAPTER
    {
        Pos = MAP_APPFONT ( 118 ,  113 ) ;
        Size = MAP_APPFONT ( 103 , 10 ) ;
        Text = "Ebene aus Urs~prungskapitel" ;
        Text [ ENGLISH ] = "Use level from source" ;
        Text[ english_us ] = "Use level from source chapter";
        Text[ portuguese ] = "Nível do ~capítulo de origem";
        Text[ russian ] = "Óðîâåíü èç èñõîäíîé ãëàâû";
        Text[ greek ] = "Åðßðåäï ùò êåöÜëáéï ~ðñïÝëåõóçò";
        Text[ dutch ] = "Niveau als ~oorsprongshoofdstuk";
        Text[ french ] = "Niveau du chapitre d'~origine";
        Text[ spanish ] = "Nivel del capítulo orige~n";
        Text[ italian ] = "Livello dal capitolo ~sorgente";
        Text[ danish ] = "Niveau fra kildekapitel";
        Text[ swedish ] = "Nivå från urs~prungskapitel";
        Text[ polish ] = "Poziom ze Ÿród³a";
        Text[ portuguese_brazilian ] = "Use level from source";
        Text[ japanese ] = "‚à‚Æ‚̏͂ÌÚÍÞÙ";
        Text[ korean ] = "¿ø·¡ Àå¿¡¼­ÀÇ ¼öÁØ »ç¿ë";
        Text[ chinese_simplified ] = "ʹÓÃÔ´Õ½ڵļ¶";
        Text[ chinese_traditional ] = "¯Å±q·½³¹¸`";
        Text[ arabic ] = "ÇÓÊÎÏÇã ãÓÊæì ãä ÇáÝÕá ÇáãÕÏÑí";
        Text[ turkish ] = "Kaynak bölümdeki düzeyi kullan";
    };
    MenuButton  MB_AUTOMARK
    {
        Pos = MAP_APPFONT ( 210 , 110 ) ;
        Size = MAP_APPFONT ( 40 , 10 ) ;
        Text = "~Datei" ;
        Text [ ENGLISH ] = "File" ;
        TabStop = TRUE ;
        ButtonMenu = Menu
        {
            ItemList =
            {
                MenuItem
                {
                    Identifier = MN_AUTOMARK_OPEN ;
                    Text = "Öffnen";
                    Text[English] = "Open";
                    Text[ english_us ] = "Open";
                    Text[ portuguese ] = "Abrir";
                    Text[ russian ] = "Îòêðûòü";
                    Text[ greek ] = "¢íïéãìá";
                    Text[ dutch ] = "Open";
                    Text[ french ] = "Ouvrir";
                    Text[ spanish ] = "Abrir";
                    Text[ italian ] = "Apri";
                    Text[ danish ] = "Åbn";
                    Text[ swedish ] = "Öppna";
                    Text[ polish ] = "Otwórz";
                    Text[ portuguese_brazilian ] = "Open";
                    Text[ japanese ] = "ŠJ‚­";
                    Text[ korean ] = "¿­±â";
                    Text[ chinese_simplified ] = "´ò¿ª";
                    Text[ chinese_traditional ] = "¶}±ÒÂÂÀÉ";
                    Text[ arabic ] = "ÝÊÍ";
                    Text[ turkish ] = "Aç";
                };
                MenuItem
                {
                    Identifier = MN_AUTOMARK_NEW ;
                    Text = "~Neu..." ;
                    Text [ ENGLISH ] = "New..." ;
                    Text[ english_us ] = "~New...";
                    Text[ portuguese ] = "~Novo...";
                    Text[ russian ] = "Ñîçäàòü...";
                    Text[ greek ] = "~Äçìéïõñãßá...";
                    Text[ dutch ] = "~Nieuw...";
                    Text[ french ] = "~Nouveau...";
                    Text[ spanish ] = "~Nuevo...";
                    Text[ italian ] = "~Nuovo...";
                    Text[ danish ] = "~Ny...";
                    Text[ swedish ] = "~Nytt...";
                    Text[ polish ] = "~Nowy...";
                    Text[ portuguese_brazilian ] = "New...";
                    Text[ japanese ] = "V‹Kì¬(~N)...";
                    Text[ korean ] = "»õ·Î(~N)...";
                    Text[ chinese_simplified ] = "н¨...";
                    Text[ chinese_traditional ] = "¶}±Ò·sÀÉ(~N)...";
                    Text[ arabic ] = "ÌÏíÏ...";
                    Text[ turkish ] = "Yeni...";
                };
                MenuItem
                {
                    Identifier = MN_AUTOMARK_EDIT ;
                    Text = "~Bearbeiten..." ;
                    Text [ ENGLISH ] = "Edit..." ;
                    Text[ english_us ] = "~Edit...";
                    Text[ portuguese ] = "~Editar...";
                    Text[ russian ] = "Ïðàâêà...";
                    Text[ greek ] = "~Åðåîåñãáóßá...";
                    Text[ dutch ] = "~Bewerken...";
                    Text[ french ] = "~Éditer...";
                    Text[ spanish ] = "~Editar...";
                    Text[ italian ] = "~Modifica...";
                    Text[ danish ] = "~Rediger...";
                    Text[ swedish ] = "~Redigera...";
                    Text[ polish ] = "~Edytuj...";
                    Text[ portuguese_brazilian ] = "Edit...";
                    Text[ japanese ] = "•ҏW(~E)...";
                    Text[ korean ] = "ÆíÁý(~E)...";
                    Text[ chinese_simplified ] = "±à¼­...";
                    Text[ chinese_traditional ] = "½s¿è(~E)...";
                    Text[ arabic ] = "ÊÍÑíÑ...";
                    Text[ turkish ] = "Düzenle...";
                };
            };
        };
        Text[ english_us ] = "~File";
        Text[ portuguese ] = "~Ficheiro";
        Text[ russian ] = "Ôàéë";
        Text[ greek ] = "~Áñ÷åßï";
        Text[ dutch ] = "~Bestand";
        Text[ french ] = "~Fichier";
        Text[ spanish ] = "~Archivo";
        Text[ italian ] = "File";
        Text[ danish ] = "~Filer";
        Text[ swedish ] = "~Fil";
        Text[ polish ] = "~Plik";
        Text[ portuguese_brazilian ] = "File";
        Text[ japanese ] = "̧²Ù";
        Text[ korean ] = "ÆÄÀÏ(~F)";
        Text[ chinese_simplified ] = "Îļþ";
        Text[ chinese_traditional ] = "ÀÉ®×";
        Text[ arabic ] = "ãáÝ";
        Text[ turkish ] = "Dosya";
    };
/*  PushButton      PB_FILE
    {
        Pos = MAP_APPFONT ( 234 , 110 ) ;
        Size = MAP_APPFONT ( 12 , 12 ) ;
        Text = "~..." ;
        //Text [ ENGLISH ] = "" ;
        TabStop = TRUE ;
        QuickHelpText = "Öffnen";
        QuickHelpText[English] = "Open";
    };
    PushButton PB_CREATE_AUTOMARK
    {
        Pos = MAP_APPFONT ( 143 , 125 ) ;
        Size = MAP_APPFONT ( 50 , 12 ) ;
        Text = "~Neu..." ;
        Text [ ENGLISH ] = "New..." ;
        TabStop = TRUE ;
    };
    PushButton PB_EDIT_AUTOMARK
    {
        Pos = MAP_APPFONT ( 196 , 125 ) ;
        Size = MAP_APPFONT ( 50 , 12 ) ;
        Text = "~Bearbeiten..." ;
        Text [ ENGLISH ] = "Edit..." ;
        TabStop = TRUE ;
    };*/

    GroupBox        GB_IDXOPTIONS
    {
        Pos = MAP_APPFONT ( 6 , 77 ) ;
        Size = MAP_APPFONT ( 248, 56 ) ;
        Text = "Zusätze" ;
        Text [ ENGLISH ] = "Options" ;
        Text[ english_us ] = "Options";
        Text[ portuguese ] = "Opções";
        Text[ russian ] = "Ïàðàìåòðû";
        Text[ greek ] = "Ðñüóèåôá";
        Text[ dutch ] = "Overige";
        Text[ french ] = "Options";
        Text[ spanish ] = "Opciones";
        Text[ italian ] = "Extra";
        Text[ danish ] = "Indstillinger";
        Text[ swedish ] = "Tillägg";
        Text[ polish ] = "Dodatki";
        Text[ portuguese_brazilian ] = "Options";
        Text[ japanese ] = "µÌß¼®Ý";
        Text[ korean ] = "¿É¼Ç";
        Text[ chinese_simplified ] = "ÆäËü";
        Text[ chinese_traditional ] = "¨ä¥L";
        Text[ arabic ] = "ÎíÇÑÇÊ";
        Text[ turkish ] = "Seçenekler";
        Text[ language_user1 ] = " ";
    };
    Control CLB_FROMOBJ
    {
        Pos = MAP_APPFONT ( 12 , 87 ) ;
        Size = MAP_APPFONT ( 236 , 43 ) ;
        Border = TRUE ;
        TabStop = TRUE ;
    };
    Resource RES_SRCTYPES
    {
        StringArray 1
        {
/*  ids from tox.hxx
    TOO_MATH        = 0x01,
    TOO_CHART       = 0x02,
    TOO_IMAGE       = 0x04,
    TOO_CALC        = 0x08,
    TOO_DRAW_IMPRESS= 0x10,
    TOO_OTHER       = 0x80*/

            ItemList =
            {
                < "StarMath" ;              1;> ;
                < "StarChart" ;             2;> ;
                < "StarImage" ;             4;> ;
                < "StarCalc" ;              8;> ;
                < "StarDraw/StarImpress" ;  16;> ;
                < "Andere OLE-Objekte";     128;> ;
            };
            ItemList[ ENGLISH ] =
            {
                < "StarMath" ;              1; > ;
                < "StarChart" ;             2;> ;
                < "StarImage" ;             4;> ;
                < "StarCalc" ;              8;> ;
                < "StarDraw/StarImpress" ;  16;> ;
                < "Other OLE objects" ;     128;> ;
            };
            ItemList [ language_user1 ] =
        {
            < " " ;                 1;> ;
            < " " ;             2;> ;
            < " " ;             4;> ;
            < " " ;                 8;> ;
            < " " ;     16;> ;
            < " ";  128;> ;
        };
        ItemList [ english_us ] =
        {
            < "StarOffice Math" ;               1;> ;
            < "StarOffice Chart" ;          2;> ;
            < "StarOffice Image" ;          4;> ;
            < "StarOffice Calc" ;               8;> ;
            < "StarOffice Draw/StarOffice Impress" ;    16;> ;
            < "Other OLE objects";  128;> ;
        };
        ItemList [ portuguese ] =
        {
            < "StarOffice Math" ;               1;> ;
            < "StarOffice Chart" ;          2;> ;
            < "StarOffice Image" ;          4;> ;
            < "StarOffice Calc" ;               8;> ;
            < "StarOffice Draw/StarOffice Impress" ;    16;> ;
            < "Outros obejctos OLE";    128;> ;
        };
        ItemList [ russian ] =
        {
            < "StarOffice Math" ;               1;> ;
            < "StarOffice Chart" ;          2;> ;
            < "StarOffice Image" ;          4;> ;
            < "StarOffice Calc" ;               8;> ;
            < "StarOffice Draw/StarOffice Impress" ;    16;> ;
            < "Äðóãèå îáúêòû OLE";  128;> ;
        };
        ItemList [ greek ] =
        {
            < "StarOffice Math" ;               1;> ;
            < "StarOffice Chart" ;          2;> ;
            < "StarOffice Image" ;          4;> ;
            < "StarOffice Calc" ;               8;> ;
            < "StarOffice Draw/StarOffice Impress" ;    16;> ;
            < "¢ëëá áíôéêåßìåíá OLE";   128;> ;
        };
        ItemList [ dutch ] =
        {
            < "StarOffice Math" ;               1;> ;
            < "StarOffice Chart" ;          2;> ;
            < "StarOffice Image" ;          4;> ;
            < "StarOffice Calc" ;               8;> ;
            < "StarOffice Draw/StarOffice Impress" ;    16;> ;
            < "Andere OLE-objecten";    128;> ;
        };
        ItemList [ french ] =
        {
            < "StarOffice Math" ;               1;> ;
            < "StarOffice Chart" ;          2;> ;
            < "StarOffice Image" ;          4;> ;
            < "StarOffice Calc" ;               8;> ;
            < "StarOffice Draw/StarOffice Impress" ;    16;> ;
            < "Autres objets OLE";  128;> ;
        };
        ItemList [ spanish ] =
        {
            < "StarOffice Math" ;               1;> ;
            < "StarOffice Chart" ;          2;> ;
            < "StarOffice Image" ;          4;> ;
            < "StarOffice Calc" ;               8;> ;
            < "StarOffice Draw/StarOffice Impress" ;    16;> ;
            < "Otros objetos OLE";  128;> ;
        };
        ItemList [ italian ] =
        {
            < "StarOffice Math" ;               1;> ;
            < "StarOffice Chart" ;          2;> ;
            < "StarOffice Image" ;          4;> ;
            < "StarOffice Calc" ;               8;> ;
            < "StarOffice Draw/StarOffice Impress" ;    16;> ;
            < "Altri oggetti OLE";  128;> ;
        };
        ItemList [ danish ] =
        {
            < "StarOffice Math" ;               1;> ;
            < "StarOffice Chart" ;          2;> ;
            < "StarOffice Image" ;          4;> ;
            < "StarOffice Calc" ;               8;> ;
            < "StarOffice Draw/StarOffice Impress" ;    16;> ;
            < "Andre OLE-objekter";     128;> ;
        };
        ItemList [ swedish ] =
        {
            < "StarOffice Math" ;               1;> ;
            < "StarOffice Chart" ;          2;> ;
            < "StarOffice Image" ;          4;> ;
            < "StarOffice Calc" ;               8;> ;
            < "StarOffice Draw/StarOffice Impress" ;    16;> ;
            < "Andra OLE-objekt";   128;> ;
        };
        ItemList [ polish ] =
        {
            < "StarOffice Math" ;               1;> ;
            < "StarOffice Chart" ;          2;> ;
            < "StarOffice Image" ;          4;> ;
            < "StarOffice Calc" ;               8;> ;
            < "StarOffice Draw/StarOffice Impress" ;    16;> ;
            < "Inne obiekty OLE";   128;> ;
        };
        ItemList [ portuguese_brazilian ] =
        {
            < "StarOffice Math" ;               1;> ;
            < "StarOffice Chart" ;          2;> ;
            < "StarOffice Image" ;          4;> ;
            < "StarOffice Calc" ;               8;> ;
            < "StarOffice Draw/StarOffice Impress" ;    16;> ;
            < "Andere OLE-Objekte";     128;> ;
        };
        ItemList [ japanese ] =
        {
            < "StarOffice Math" ;               1;> ;
            < "StarOffice Chart" ;          2;> ;
            < "StarOffice Image" ;          4;> ;
            < "StarOffice Calc" ;               8;> ;
            < "StarOffice Draw/StarOffice Impress" ;    16;> ;
            < "‚Ù‚©‚Ì OLE µÌÞ¼Þª¸Ä";    128;> ;
        };
        ItemList [ korean ] =
        {
            < "StarOffice Math" ;               1;> ;
            < "StarOffice Chart" ;          2;> ;
            < "StarOffice Image" ;          4;> ;
            < "StarOffice Calc" ;               8;> ;
            < "StarOffice Draw/StarOffice Impress" ;    16;> ;
            < "±âŸ OLE °³Ã¼";  128;> ;
        };
        ItemList [ chinese_simplified ] =
        {
            < "StarOffice Math" ;               1;> ;
            < "StarOffice Chart" ;          2;> ;
            < "StarOffice Image" ;          4;> ;
            < "StarOffice Calc" ;               8;> ;
            < "StarOffice Draw/StarOffice Impress" ;    16;> ;
            < "ÆäËü OLE ¶ÔÏó";  128;> ;
        };
        ItemList [ chinese_traditional ] =
        {
            < "StarOffice Math" ;               1;> ;
            < "StarOffice Chart" ;          2;> ;
            < "StarOffice Image" ;          4;> ;
            < "StarOffice Calc" ;               8;> ;
            < "StarOffice Draw/StarOffice Impress" ;    16;> ;
            < "¨ä¥L OLE ª«¥ó";  128;> ;
        };
        ItemList [ arabic ] =
        {
            < "StarOffice Math" ;               1;> ;
            < "StarOffice Chart" ;          2;> ;
            < "StarOffice Image" ;          4;> ;
            < "StarOffice Calc" ;               8;> ;
            < "StarOffice Draw/StarOffice Impress" ;    16;> ;
            < "ßÇÆäÇÊ OLE ÃÎÑì";    128;> ;
        };
        ItemList [ turkish ] =
        {
            < "StarOffice Math" ;               1;> ;
            < "StarOffice Chart" ;          2;> ;
            < "StarOffice Image" ;          4;> ;
            < "StarOffice Calc" ;               8;> ;
            < "StarOffice Draw/StarOffice Impress" ;    16;> ;
            < "Diðer OLE nesneleri";    128;> ;
        };
    };
    };
    GroupBox GB_FROMOBJ
    {
        Pos = MAP_APPFONT ( 6 , 77) ;
        Size = MAP_APPFONT ( 248, 56 ) ;
        Text = "Aus folgenden Objekten erzeugen" ;
        Text [ ENGLISH ] = "Create from the following objects" ;
        Text[ english_us ] = "Create from the following objects";
        Text[ portuguese ] = "Criar a partir dos seguintes objectos";
        Text[ russian ] = "Ñîçäàòü èç ñëåäóþùèõ îáúåêòîâ";
        Text[ greek ] = "Äçìéïõñãßá áðü ôá áêüëïõèá áíôéêåßìåíá";
        Text[ dutch ] = "Uit de volgende objecten samenstellen";
        Text[ french ] = "Créer à partir des objets suivants";
        Text[ spanish ] = "Crear de los siguientes objetos";
        Text[ italian ] = "Crea dai seguenti oggetti";
        Text[ danish ] = "Opret ud fra følgende objekter";
        Text[ swedish ] = "Skapa utifrån följande objekt";
        Text[ polish ] = "Utwórz z nastêpuj¹cych obiektów";
        Text[ portuguese_brazilian ] = "Create from the following objects";
        Text[ japanese ] = "ˆÈ‰º‚̵ÌÞ¼Þª¸Ä‚©‚çì¬";
        Text[ korean ] = "´ÙÀ½ÀÇ °³Ã¼·Î ºÎÅÍ ¸¸µé±â";
        Text[ chinese_simplified ] = "ÓÉÏÂÁжÔÏóÉú³É";
        Text[ chinese_traditional ] = "±q¤U¦Cª«¥ó¥Í¦¨";
        Text[ arabic ] = "ÅäÔÇÁ ãä ÇáßÇÆäÇÊ ÇáÊÇáíÉ";
        Text[ turkish ] = "Þu nesnelerden oluþtur:";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_SEQUENCE
    {
        Pos = MAP_APPFONT ( 12, 57) ;
        Size = MAP_APPFONT ( 100, 10 ) ;
        Text = "~Einträge nummerieren" ;
        Text [ ENGLISH ] = "Number entries" ;
        Text[ english_us ] = "~Number entries";
        Text[ portuguese ] = "~Numerar entradas";
        Text[ russian ] = "Ïðîíóìåðîâàòü ýëåìåíòû";
        Text[ greek ] = "Áñßèìçóç åããñáöþí";
        Text[ dutch ] = "~Items nummeren";
        Text[ french ] = "~Numéroter les entrées";
        Text[ spanish ] = "~Numerar entradas";
        Text[ italian ] = "Num~era voci";
        Text[ danish ] = "Nummerer elementer";
        Text[ swedish ] = "Numrera poster";
        Text[ polish ] = "Numeruj wpisy";
        Text[ portuguese_brazilian ] = "Number entries";
        Text[ japanese ] = "€–ڂɔԍ†‚ð•t‚¯‚é(~N)";
        Text[ korean ] = "¼ýÀÚ Ç׸ñ(~N)";
        Text[ chinese_simplified ] = "±àÅÅÌõÄ¿(~N)";
        Text[ chinese_traditional ] = "¶µ¥Ø½s¸¹(~N)";
        Text[ arabic ] = "ÊÑÞíã ÇáÅÏÎÇáÇÊ";
        Text[ turkish ] = "Giriþleri numarala";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_BRACKET
    {
        Pos = MAP_APPFONT ( 12, 70) ;
        Size = MAP_APPFONT ( 60, 10 ) ;
        Text = "~Klammern" ;
        Text [ ENGLISH ] = "Brackets" ;
        Text[ english_us ] = "~Brackets";
        Text[ portuguese ] = "~Parêntesis";
        Text[ russian ] = "Ñêîáêè";
        Text[ greek ] = "ÐáñåíèÝóåéò";
        Text[ dutch ] = "~Haakjes";
        Text[ french ] = "~Parenthèses";
        Text[ spanish ] = "~Paréntesis";
        Text[ italian ] = "Parentesi";
        Text[ danish ] = "Parenteser";
        Text[ swedish ] = "Parenteser";
        Text[ polish ] = "Nawiasy";
        Text[ portuguese_brazilian ] = "Brackets";
        Text[ japanese ] = "ЇŒÊ(~B)";
        Text[ korean ] = "°ýÈ£(~B)";
        Text[ chinese_simplified ] = "À¨ºÅ(~B)";
        Text[ chinese_traditional ] = "¬A¸¹(~B)";
        Text[ arabic ] = "ÃÞæÇÓ";
        Text[ turkish ] = "Ayraçlar";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_BRACKET
    {
        Pos = MAP_APPFONT ( 75, 70) ;
        Size = MAP_APPFONT ( 20, 50 ) ;
        Border = TRUE;
        DropDown = TRUE;
        StringList =
        {
            < "[]" ;> ;
            < "()" ;> ;
            < "{}" ;> ;
            < "<>" ;> ;
        };
    };
    GroupBox GB_AUTHORITY
    {
        Pos = MAP_APPFONT ( 6 , 47) ;
        Size = MAP_APPFONT ( 248, 86 ) ;
        Text = "Formatierung der Einträge" ;
        Text [ ENGLISH ] = "Formatting of the marks" ;
        Text[ english_us ] = "Formatting of the entries";
        Text[ portuguese ] = "Formatação das entradas";
        Text[ russian ] = "Ôîðìàòèðîâàíèÿ ýëåìåíòîâ";
        Text[ greek ] = "Ìïñöïðïßçóç åããñáöþí";
        Text[ dutch ] = "Items opmaken";
        Text[ french ] = "Formatage des entrées";
        Text[ spanish ] = "Formateado de las entradas";
        Text[ italian ] = "Formattazione delle voci";
        Text[ danish ] = "Elementernes formatering";
        Text[ swedish ] = "Formatering av poster";
        Text[ polish ] = "Formatowanie wpisów";
        Text[ portuguese_brazilian ] = "Formatting of the marks";
        Text[ japanese ] = "€–ڂ̏‘Ž®Ý’è";
        Text[ korean ] = "Ç׸ñ ¼­½Ä";
        Text[ chinese_simplified ] = "ÌõÄ¿¸ñʽ";
        Text[ chinese_traditional ] = "¶µ¥Ø®æ¦¡";
        Text[ arabic ] = "ÊäÓíÞ ÇáÅÏÎÇáÇÊ";
        Text[ turkish ] = "Giriþ formatlama";
        Text[ language_user1 ] = " ";
    };
    String ST_AUTOMARK_TYPE
    {
        Text = "Markierungsdatei für Stichwortverzeichnis (*.sdi)" ;
        Text [ ENGLISH ] = "Mark up file for index (*.sdi)" ;
        Text[ english_us ] = "Selection file for the alphabetical index (*.sdi)";
        Text[ portuguese ] = "Ficheiro de marcas para índice remissivo (*.sdi)";
        Text[ russian ] = "Âûäåëåííûé ôàéë äëÿ ïðåäìåòíîãî óêàçàòåëÿ (*.sdi)";
        Text[ greek ] = "Áñ÷åßï óÞìáíóçò ãéá åõñåôÞñéï ëÝîåùí (*.sdi)";
        Text[ dutch ] = "Bestand met markeringen voor trefwoordenregister (*.sdi)";
        Text[ french ] = "Fichier descriptif pour l'index lexical (*.sdi)";
        Text[ spanish ] = "Archivo de marcas para índice alfabético (*.sdi)";
        Text[ italian ] = "File di selezione per indice analitico (*.sdi)";
        Text[ danish ] = "Markeringsfil for stikordsregister (*.sdi)";
        Text[ swedish ] = "Markeringsfil för sakregister (*.sdi)";
        Text[ polish ] = "Plik zaznaczaj¹cy dla zestawu hase³ (*.sdi) ";
        Text[ portuguese_brazilian ] = "Mark up file for index";
        Text[ japanese ] = "õˆø€–Ú—p‚Éϰ¸‚ð‚‚¯‚½Ì§²Ù (*.sdi)";
        Text[ korean ] = "¾ËÆÄºª ¼øÀÇ »öÀÎÀ» À§ÇÑ ¼±Åà ÆÄÀÏ  (*.sdi)";
        Text[ chinese_simplified ] = "ÓÃÓÚË÷ÒýĿ¼µÄ±ê¼ÇÎļþ(*.sdi)";
        Text[ chinese_traditional ] = "¥Î©ó¯Á¤Þªº¼Ð°OÀÉ®×(*.sdi)";
        Text[ arabic ] = "ãáÝ ÇáÊÍÏíÏ ááÝåÑÓ ÇáÃÈÌÏí (*.sdi)";
        Text[ turkish ] = "Alfabetik dizin için seçim dosyasý (*.sdi)";
    };
};

TabPage TP_TOX_ENTRY
{
    HelpID =  HID_TP_TOX_ENTRY;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Hide = TRUE ;
    Control LB_LEVEL
    {
        Pos = MAP_APPFONT (  6, 15 ) ;
        Size = MAP_APPFONT ( 25, 118 ) ;
        TabStop = TRUE ;
        Border = TRUE;
//      HScroll = TRUE;
/*      StringList =
        {
            < "1" ; > ;
            < "2" ; > ;
            < "3" ; > ;
            < "4" ; > ;
            < "5" ; > ;
            < "6" ; > ;
            < "7" ; > ;
            < "8" ; > ;
            < "9" ; > ;
            < "10" ; > ;
            < "1-10" ; > ;
        };*/
    };
    FixedText FT_LEVEL
    {
        Pos = MAP_APPFONT ( 6, 3 ) ;
        Size = MAP_APPFONT ( 25, 8 ) ;
        Text = "E~bene" ;
        Text [ ENGLISH ] = "Level" ;
        Text[ english_us ] = "~Level";
        Text[ portuguese ] = "~Nível";
        Text[ russian ] = "Óðîâåíü";
        Text[ greek ] = "Åðßðåäï";
        Text[ dutch ] = "~Niveau";
        Text[ french ] = "~Niveau";
        Text[ spanish ] = "Ni~vel";
        Text[ italian ] = "Livello";
        Text[ danish ] = "Niveau";
        Text[ swedish ] = "~Nivå";
        Text[ polish ] = "Poziom";
        Text[ portuguese_brazilian ] = "Level";
        Text[ japanese ] = "ÚÍÞÙ(~L)";
        Text[ korean ] = "¼öÁØ(~L)";
        Text[ chinese_simplified ] = "¼¶(~L)";
        Text[ chinese_traditional ] = "¯Å(~L)";
        Text[ arabic ] = "ÇáãÓÊæì";
        Text[ turkish ] = "Düzey";
        Text[ language_user1 ] = " ";
    };
    String ST_AUTHTYPE
    {
        Text = "~Art";
        Text[English]= "Type";
        Text[ english_us ] = "~Type";
        Text[ portuguese ] = "T~ipo";
        Text[ russian ] = "Òèï";
        Text[ greek ] = "Ôýðïò";
        Text[ dutch ] = "~Type";
        Text[ french ] = "T~ype";
        Text[ spanish ] = "~Tipo";
        Text[ italian ] = "Tipo";
        Text[ danish ] = "Type";
        Text[ swedish ] = "Ty~p";
        Text[ polish ] = "Typ";
        Text[ portuguese_brazilian ] = "Type";
        Text[ japanese ] = "À²Ìß(~T)";
        Text[ korean ] = "Çü½Ä(~T)";
        Text[ chinese_simplified ] = "ÀàÐÍ(~T)";
        Text[ chinese_traditional ] = "Ãþ«¬(~T)";
        Text[ arabic ] = "ÇáäæÚ";
        Text[ turkish ] = "Tür";
    };
    Window WIN_TOKEN
    {
        Pos = MAP_APPFONT (  37, 12 ) ;
        Size = MAP_APPFONT ( 212, 12 ) ;
        ImageButton WIN_LEFT_SCROLL
        {
            Pos = MAP_APPFONT (  0, 0 ) ;
            Size = MAP_APPFONT ( 10, 12 ) ;
            Symbol = IMAGEBUTTON_ARROW_LEFT;
        };
        Window WIN_CTRL_PARENT
        {
            Pos = MAP_APPFONT (  11, 0 ) ;
            Size = MAP_APPFONT ( 190, 12 ) ;
        };
        ImageButton WIN_RIGHT_SCROLL
        {
            Pos = MAP_APPFONT (  202, 0 ) ;
            Size = MAP_APPFONT ( 10, 12 ) ;
            Symbol = IMAGEBUTTON_ARROW_RIGHT;
        };
        String STR_TOKEN_ENTRY_NO
        {
            Text = "E#";
            Text [English] = "E#";
            Text[ language_user1 ] = " ";
            Text[ english_us ] = "E#";
            Text[ portuguese ] = "E#";
            Text[ russian ] = "Ý#";
            Text[ greek ] = "E#";
            Text[ dutch ] = "I#";
            Text[ french ] = "E#";
            Text[ spanish ] = "E#";
            Text[ italian ] = "E#";
            Text[ danish ] = "E#";
            Text[ swedish ] = "E#";
            Text[ polish ] = "W#";
            Text[ portuguese_brazilian ] = "E#";
            Text[ japanese ] = "E#";
            Text[ korean ] = "E#";
            Text[ chinese_simplified ] = "E#";
            Text[ chinese_traditional ] = "E#";
            Text[ arabic ] = "E#";
            Text[ turkish ] = "B#";
        };
        String STR_TOKEN_ENTRY
        {
            Text = "E";
            Text [English] = "E";
            Text[ english_us ] = "E";
            Text[ portuguese ] = "E";
            Text[ russian ] = "Ý";
            Text[ greek ] = "E";
            Text[ dutch ] = "I";
            Text[ french ] = "E";
            Text[ spanish ] = "E";
            Text[ italian ] = "E";
            Text[ danish ] = "E";
            Text[ swedish ] = "E";
            Text[ polish ] = "W";
            Text[ portuguese_brazilian ] = "E";
            Text[ japanese ] = "E";
            Text[ korean ] = "E";
            Text[ chinese_simplified ] = "E";
            Text[ chinese_traditional ] = "E";
            Text[ arabic ] = "E";
            Text[ turkish ] = "G";
        };
        String STR_TOKEN_TAB_STOP
        {
            Text = "T";
            Text [English] = "T";
            Text[ english_us ] = "T";
            Text[ portuguese ] = "T";
            Text[ russian ] = "Ò";
            Text[ greek ] = "Ó";
            Text[ dutch ] = "T";
            Text[ french ] = "T";
            Text[ spanish ] = "T";
            Text[ italian ] = "T";
            Text[ danish ] = "T";
            Text[ swedish ] = "T";
            Text[ polish ] = "T";
            Text[ portuguese_brazilian ] = "T";
            Text[ japanese ] = "T";
            Text[ korean ] = "T";
            Text[ chinese_simplified ] = "ÖÆ±í·û";
            Text[ chinese_traditional ] = "¨îªí²Å";
            Text[ arabic ] = "T";
            Text[ turkish ] = "T";
        };
        String STR_TOKEN_TEXT
        {
            Text = "";
            //unused
        };
        String STR_TOKEN_PAGE_NUMS
        {
            Text = "#";
            Text [English] = "#";
            Text[ english_us ] = "#";
            Text[ portuguese ] = "#";
            Text[ russian ] = "#";
            Text[ greek ] = "#";
            Text[ dutch ] = "#";
            Text[ french ] = "#";
            Text[ spanish ] = "#";
            Text[ italian ] = "#";
            Text[ danish ] = "#";
            Text[ swedish ] = "#";
            Text[ polish ] = "#";
            Text[ portuguese_brazilian ] = "#";
            Text[ japanese ] = "#";
            Text[ korean ] = "#";
            Text[ chinese_simplified ] = "#";
            Text[ chinese_traditional ] = "#";
            Text[ arabic ] = "#";
            Text[ turkish ] = "#";
            Text[ language_user1 ] = " ";
        };
        String STR_TOKEN_CHAPTER_INFO
        {
            Text = "KI";
            Text [English] = "CI";
            Text[ english_us ] = "CI";
            Text[ portuguese ] = "IC";
            Text[ russian ] = "ÈÃ";
            Text[ greek ] = "ÐÊ";
            Text[ dutch ] = "HI";
            Text[ french ] = "IC";
            Text[ spanish ] = "CI";
            Text[ italian ] = "CI";
            Text[ danish ] = "KI";
            Text[ swedish ] = "CI";
            Text[ polish ] = "IR";
            Text[ portuguese_brazilian ] = "CI";
            Text[ japanese ] = "CI";
            Text[ korean ] = "CI";
            Text[ chinese_simplified ] = "CI";
            Text[ chinese_traditional ] = "CI";
            Text[ arabic ] = "CI";
            Text[ turkish ] = "Bh";
            Text[ language_user1 ] = " ";
        };
        String STR_TOKEN_LINK_START
        {
            Text = "LS";
            Text [English] = "LS";
            Text[ english_us ] = "LS";
            Text[ portuguese ] = "LS";
            Text[ russian ] = "ÃÍ";
            Text[ greek ] = "ÅÕ";
            Text[ dutch ] = "LS";
            Text[ french ] = "DH";
            Text[ spanish ] = "HI";
            Text[ italian ] = "LS";
            Text[ danish ] = "HB";
            Text[ swedish ] = "LS";
            Text[ polish ] = "HS";
            Text[ portuguese_brazilian ] = "LS";
            Text[ japanese ] = "LS";
            Text[ korean ] = "LS";
            Text[ chinese_simplified ] = "LS";
            Text[ chinese_traditional ] = "LS";
            Text[ arabic ] = "LS";
            Text[ turkish ] = "Bb";
        };
        String STR_TOKEN_LINK_END
        {
            Text = "LE";
            Text [English] = "LE";
            Text[ english_us ] = "LE";
            Text[ portuguese ] = "LE";
            Text[ russian ] = "ÃÊ";
            Text[ greek ] = "ÔÕ";
            Text[ dutch ] = "LE";
            Text[ french ] = "FH";
            Text[ spanish ] = "HF";
            Text[ italian ] = "LE";
            Text[ danish ] = "HS";
            Text[ swedish ] = "LE";
            Text[ polish ] = "HK";
            Text[ portuguese_brazilian ] = "LE";
            Text[ japanese ] = "LE";
            Text[ korean ] = "LE";
            Text[ chinese_simplified ] = "LE";
            Text[ chinese_traditional ] = "LE";
            Text[ arabic ] = "LE";
            Text[ turkish ] = "Bs";
        };
        String STR_TOKEN_AUTHORITY
        {
            Text = "A";
            Text [English] = "A";
            Text[ english_us ] = "A";
            Text[ portuguese ] = "A";
            Text[ russian ] = "A";
            Text[ greek ] = "A";
            Text[ dutch ] = "A";
            Text[ french ] = "A";
            Text[ spanish ] = "A";
            Text[ italian ] = "A";
            Text[ danish ] = "A";
            Text[ swedish ] = "A";
            Text[ polish ] = "A";
            Text[ portuguese_brazilian ] = "A";
            Text[ japanese ] = "A";
            Text[ korean ] = "A";
            Text[ chinese_simplified ] = "A";
            Text[ chinese_traditional ] = "A";
            Text[ arabic ] = "A";
            Text[ turkish ] = "A";
            Text[ language_user1 ] = " ";
        };
        String STR_TOKEN_HELP_ENTRY_NO
        {
            Text = "Kapitelnummer";
            Text [English] = "Chapter number";
            Text[ english_us ] = "Chapter number";
            Text[ portuguese ] = "Número de capítulo";
            Text[ russian ] = "Íîìåð ãëàâû";
            Text[ greek ] = "Áñéèìüò êåöáëáßïõ";
            Text[ dutch ] = "Hoofdstuknummer";
            Text[ french ] = "Numéro de chapitre";
            Text[ spanish ] = "Número de capítulo";
            Text[ italian ] = "Numero capitolo";
            Text[ danish ] = "Kapitelnummer";
            Text[ swedish ] = "Kapitelnummer";
            Text[ polish ] = "Numer rozdzia³u";
            Text[ portuguese_brazilian ] = "Chapter number";
            Text[ japanese ] = "Í”ԍ†";
            Text[ korean ] = "Àå ¹øÈ£";
            Text[ chinese_simplified ] = "Õ½ڱàºÅ";
            Text[ chinese_traditional ] = "³¹¸`½s¸¹";
            Text[ arabic ] = "ÑÞã ÇáÝÕá";
            Text[ turkish ] = "Bölüm numarasý";
            Text[ language_user1 ] = " ";
        };
        String STR_TOKEN_HELP_ENTRY
        {
            Text = "Eintrag";
            Text [English] = "Entry";
            Text[ english_us ] = "Entry";
            Text[ portuguese ] = "Entrada";
            Text[ russian ] = "Ýëåìåíò";
            Text[ greek ] = "Êáôá÷þñéóç";
            Text[ dutch ] = "Item";
            Text[ french ] = "Entrée";
            Text[ spanish ] = "Entrada";
            Text[ italian ] = "Voce";
            Text[ danish ] = "Element";
            Text[ swedish ] = "Post";
            Text[ polish ] = "Wpis";
            Text[ portuguese_brazilian ] = "Entry";
            Text[ japanese ] = "€–Ú";
            Text[ korean ] = "Ç׸ñ";
            Text[ chinese_simplified ] = "ÌõÄ¿";
            Text[ chinese_traditional ] = "±ø¥Ø";
            Text[ arabic ] = "ÇáÅÏÎÇá";
            Text[ turkish ] = "Giriþ";
            Text[ language_user1 ] = " ";
        };
        String STR_TOKEN_HELP_TAB_STOP
        {
            Text = "Tabulator";
            Text [English] = "Tab stop";
            Text[ english_us ] = "Tab stop";
            Text[ portuguese ] = "Tabulação";
            Text[ russian ] = "Òàáóëÿòîð";
            Text[ greek ] = "ÓôçëïèÝôçò";
            Text[ dutch ] = "Tabstop";
            Text[ french ] = "Tabulation";
            Text[ spanish ] = "Tabulación";
            Text[ italian ] = "Tabulazione";
            Text[ danish ] = "Tabulator";
            Text[ swedish ] = "Tabulator";
            Text[ polish ] = "Tabulator";
            Text[ portuguese_brazilian ] = "Tab stop";
            Text[ japanese ] = "ÀÌÞ";
            Text[ korean ] = "ÅÇ Á¤Áö";
            Text[ chinese_simplified ] = "ÖÆ±í·û";
            Text[ chinese_traditional ] = "¨îªí²Å";
            Text[ arabic ] = "ÚáÇãÉ ÌÏæáÉ";
            Text[ turkish ] = "Sekme";
            Text[ language_user1 ] = " ";
        };
        String STR_TOKEN_HELP_TEXT
        {
            Text = "Text";
            Text [English] = "Text";
            Text[ english_us ] = "Text";
            Text[ portuguese ] = "Texto";
            Text[ russian ] = "Òåêñò";
            Text[ greek ] = "Êåßìåíï";
            Text[ dutch ] = "Tekst";
            Text[ french ] = "Texte";
            Text[ spanish ] = "Texto";
            Text[ italian ] = "Testo";
            Text[ danish ] = "Tekst";
            Text[ swedish ] = "Text";
            Text[ polish ] = "Text";
            Text[ portuguese_brazilian ] = "Text";
            Text[ japanese ] = "•¶Žš—ñ";
            Text[ korean ] = "ÅØ½ºÆ®";
            Text[ chinese_simplified ] = "ÎÄ×Ö";
            Text[ chinese_traditional ] = "¤å¦r";
            Text[ arabic ] = "äÕ";
            Text[ turkish ] = "Metin";
            Text[ language_user1 ] = " ";
        };
        String STR_TOKEN_HELP_PAGE_NUMS
        {
            Text = "Seitennummer";
            Text [English] = "Page number";
            Text[ english_us ] = "Page number";
            Text[ portuguese ] = "Página nº";
            Text[ russian ] = "Íîìåð ñòðàíèöû";
            Text[ greek ] = "Áñéèìüò óåëßäáò";
            Text[ dutch ] = "Paginanummer";
            Text[ french ] = "Numéro de page";
            Text[ spanish ] = "Número de página";
            Text[ italian ] = "Numero pagina";
            Text[ danish ] = "Sidetal";
            Text[ swedish ] = "Sidnummer";
            Text[ polish ] = "Numer strony";
            Text[ portuguese_brazilian ] = "Page number";
            Text[ japanese ] = "Íß°¼Þ”ԍ†";
            Text[ korean ] = "ÆäÀÌÁö ¹øÈ£";
            Text[ chinese_simplified ] = "Ò³Âë";
            Text[ chinese_traditional ] = "­¶½X";
            Text[ arabic ] = "ÑÞã ÇáÕÝÍÉ";
            Text[ turkish ] = "Sayfa numarasý";
            Text[ language_user1 ] = " ";
        };
        String STR_TOKEN_HELP_CHAPTER_INFO
        {
            Text = "Kapitelinformation";
            Text [English] = "Chapter information";
            Text[ english_us ] = "Chapter info";
            Text[ portuguese ] = "Informação sobre capítulo";
            Text[ russian ] = "Èíôîðìàöèÿ ãëàâû";
            Text[ greek ] = "Ðëçñïöïñßåò êåöáëáßïõ";
            Text[ dutch ] = "Informatie over hoofdstuk";
            Text[ french ] = "Information sur le chapitre";
            Text[ spanish ] = "Información sobre el capítulo";
            Text[ italian ] = "Informazioni capitolo";
            Text[ danish ] = "Kapitelinformation";
            Text[ swedish ] = "Kapitelinformation";
            Text[ polish ] = "Informacja o rozdziale";
            Text[ portuguese_brazilian ] = "Chapter information";
            Text[ japanese ] = "Í‚̏î•ñ";
            Text[ korean ] = "Àå Á¤º¸";
            Text[ chinese_simplified ] = "Õ½ÚÐÅÏ¢";
            Text[ chinese_traditional ] = "³¹¸`¸ê°T";
            Text[ arabic ] = "ãÚáæãÇÊ ÇáÝÕá";
            Text[ turkish ] = "Bölüm bilgileri";
            Text[ language_user1 ] = " ";
        };
        String STR_TOKEN_HELP_LINK_START
        {
            Text = "Hyperlink Anfang";
            Text [English] = "Hyperlink start";
            Text[ english_us ] = "Hyperlink start";
            Text[ portuguese ] = "Início de hiperligação";
            Text[ russian ] = "Íà÷àëî ãèïåðññûëêè";
            Text[ greek ] = "Áñ÷Þ õðåñ-óýíäåóçò";
            Text[ dutch ] = "Hyperlink start";
            Text[ french ] = "Début de l'hyperlien";
            Text[ spanish ] = "Comienzo de hiperenlace";
            Text[ italian ] = "Inizio hyperlink";
            Text[ danish ] = "Hyperlink start";
            Text[ swedish ] = "Hyperlänk start";
            Text[ polish ] = "Pocz¹tek hiper³¹cza";
            Text[ portuguese_brazilian ] = "Hyperlink start";
            Text[ japanese ] = "ʲÊß°ØÝ¸ŠJŽn";
            Text[ korean ] = "ÇÏÀÌÆÛ¸µÅ© ½ÃÀÛ";
            Text[ chinese_simplified ] = "³¬Á´½Ó¿ªÊ¼´¦";
            Text[ chinese_traditional ] = "¶W³sµ² ¶}©l";
            Text[ arabic ] = "ÈÏÇíÉ ÇáÇÑÊÈÇØ ÇáÊÔÚÈí";
            Text[ turkish ] = "Hyperlink baþlangýcý";
            Text[ language_user1 ] = " ";
        };
        String STR_TOKEN_HELP_LINK_END
        {
            Text = "Hyperlink Ende";
            Text [English] = "Hyperlink End";
            Text[ english_us ] = "Hyperlink end";
            Text[ portuguese ] = "Final de hiperligação";
            Text[ russian ] = "Êîíåö ãèïåðññûëêè";
            Text[ greek ] = "ÔÝëïò õðåñ-óýíäåóçò";
            Text[ dutch ] = "Hyperlink einde";
            Text[ french ] = "Fin de l'hyperlien";
            Text[ spanish ] = "Final de hiperenlace";
            Text[ italian ] = "Fine hyperlink";
            Text[ danish ] = "Hyperlink slut";
            Text[ swedish ] = "Hyperlänk slut";
            Text[ polish ] = "Koniec hiper³¹cza";
            Text[ portuguese_brazilian ] = "Hyperlink End";
            Text[ japanese ] = "ʲÊß°ØÝ¸I—¹";
            Text[ korean ] = "ÇÏÀÌÆÛ¸µÅ© Á¾·á";
            Text[ chinese_simplified ] = "³¬Á´½ÓÖÕÖ¹´¦";
            Text[ chinese_traditional ] = "¶W³sµ² µ²§ô";
            Text[ arabic ] = "äåÇíÉ ÇáÇÑÊÈÇØ ÇáÊÔÚÈí";
            Text[ turkish ] = "Hyperlink sonu";
            Text[ language_user1 ] = " ";
        };
        String STR_TOKEN_HELP_AUTHORITY
        {
            Text = "Literatureintrag: ";
            Text [English] = "Authority entry: ";
            Text[ english_us ] = "Bibliography entry: ";
            Text[ portuguese ] = "Entrada bibliográfica: ";
            Text[ russian ] = "Ýëåìåíò ñïèñêà ëèòåðàòóðû: ";
            Text[ greek ] = "ÅéóáãùãÞ âéâëéïãñáößáò: ";
            Text[ dutch ] = "Literatuuritem:  ";
            Text[ french ] = "Entrée de bibliographie :  ";
            Text[ spanish ] = "Entrada de bibliografía:  ";
            Text[ italian ] = "Voce bibliografica: ";
            Text[ danish ] = "Litteraturlisteelement: ";
            Text[ swedish ] = "Litteraturpost:  ";
            Text[ polish ] = "Wpis bibliograficzny:  ";
            Text[ portuguese_brazilian ] = "Authority entry: ";
            Text[ japanese ] = "ŽQl•¶Œ£€–Ú: ";
            Text[ korean ] = "Âü°í ¹®Çå Ç׸ñ: ";
            Text[ chinese_simplified ] = "ÎÄÏ×ÌõÄ¿£º ";
            Text[ chinese_traditional ] = "°Ñ¦Ò¤åÄm±ø¥Ø ";
            Text[ arabic ] = "ÅÏÑÇÌ Ýí ÝåÑÓ ÇáãÑÇÌÚ: ";
            Text[ turkish ] = "Kaynakça giriþi: ";
        };
        String STR_CHARSTYLE
        {
            Text = "Zeichenvorlage: ";
            Text [English] = "Character style: ";
            Text[ english_us ] = "Character Style: ";
            Text[ portuguese ] = "Estilo de caracteres: ";
            Text[ russian ] = "Ñòèëü çíàêîâ: ";
            Text[ greek ] = "Óôõë ÷áñáêôÞñùí:  ";
            Text[ dutch ] = "Tekenopmaakprofiel:  ";
            Text[ french ] = "Style de caractère : ";
            Text[ spanish ] = "Estilo de carácter:  ";
            Text[ italian ] = "Modello di carattere:  ";
            Text[ danish ] = "Tegntypografi: ";
            Text[ swedish ] = "Teckenformatmall:  ";
            Text[ polish ] = "Styl znaków:  ";
            Text[ portuguese_brazilian ] = "Character style: ";
            Text[ japanese ] = "•¶Žš½À²Ù: ";
            Text[ korean ] = "¹®ÀÚ À¯Çü: ";
            Text[ chinese_simplified ] = "×Ö·ûÑùʽ£º ";
            Text[ chinese_traditional ] = "¦r«¬¼Ë¦¡¡G ";
            Text[ arabic ] = "äãØ ÇáÃÍÑÝ: ";
            Text[ turkish ] = "Karakter þablonu: ";
            Text[ language_user1 ] = " ";
        };
    };
    PushButton PB_ALL_LEVELS
    {
        Pos = MAP_APPFONT ( 199 , 12 ) ;
        Size = MAP_APPFONT ( 50, 12 ) ;
        Text = "~Alle Ebenen" ;
        Text [ ENGLISH ] = "All levels" ;
        Text[ english_us ] = "~All levels";
        Text[ portuguese ] = "~Níveis todos";
        Text[ russian ] = "Âñå óðîâíè";
        Text[ greek ] = "¼ë~á ôá åðßðåäá";
        Text[ dutch ] = "~Alle niveaus";
        Text[ french ] = "~Tous les niveaux";
        Text[ spanish ] = "Todos los ~niveles";
        Text[ italian ] = "Tutti i livelli";
        Text[ danish ] = "Alle niveauer";
        Text[ swedish ] = "~Alla nivåer";
        Text[ polish ] = "Wszystkie poziomy";
        Text[ portuguese_brazilian ] = "All levels";
        Text[ japanese ] = "‚·‚ׂĂÌÚÍÞÙ";
        Text[ korean ] = "¸ðµç ¼öÁØ(~A)";
        Text[ chinese_simplified ] = "ËùÓеȼ¶";
        Text[ chinese_traditional ] = "©Ò¦³¯Å";
        Text[ arabic ] = "ßá ÇáãÓÊæíÇÊ";
        Text[ turkish ] = "Tüm düzeyler";
    };
    PushButton PB_ENTRYNO
    {
        Pos = MAP_APPFONT ( 37 , 25 ) ;
        Size = MAP_APPFONT ( 40, 12 ) ;
        Text = "~Kapitelnr." ;
        Text [ ENGLISH ] = "Chapter no." ;
        Text[ english_us ] = "Chapter no.";
        Text[ portuguese ] = "~Capítulo nº.";
        Text[ russian ] = "Ãëàâà ¹";
        Text[ greek ] = "Áñéèìüò êåöáëáßïõ";
        Text[ dutch ] = "~Hoofdstuknr.";
        Text[ french ] = "N° de ~chapitre";
        Text[ spanish ] = "Nú~m. capítulo";
        Text[ italian ] = "Capitolo no.";
        Text[ danish ] = "Kapitelnr.";
        Text[ swedish ] = "~Kapitelnr";
        Text[ polish ] = "Rozdzia³ nr.";
        Text[ portuguese_brazilian ] = "Chapter no.";
        Text[ japanese ] = "Í”ԍ†";
        Text[ korean ] = "Àå ¹øÈ£.";
        Text[ chinese_simplified ] = "Õ½ڱàºÅ";
        Text[ chinese_traditional ] = "³¹¸`½s¸¹";
        Text[ arabic ] = "ÑÞã ÇáÝÕá";
        Text[ turkish ] = "Bölüm no.";
        Text[ language_user1 ] = " ";
    };
    PushButton PB_ENTRY
    {
        Pos = MAP_APPFONT (  80, 25 ) ;
        Size = MAP_APPFONT ( 40, 12 ) ;
        Text = "~Eintragstext" ;
        Text [ ENGLISH ] = "Entry text" ;
        Text[ english_us ] = "Entry text";
        Text[ portuguese ] = "E~ntrada";
        Text[ russian ] = "Òåêñò ýëåìåíòà";
        Text[ greek ] = "Êåßìåíï êáôá÷þñéóçò";
        Text[ dutch ] = "Tekst~item";
        Text[ french ] = "~Texte";
        Text[ spanish ] = "Te~xto de entrada";
        Text[ italian ] = "Testo voce";
        Text[ danish ] = "Elementtekst";
        Text[ swedish ] = "~Posttext";
        Text[ polish ] = "Tekst wpisu";
        Text[ portuguese_brazilian ] = "Entry text";
        Text[ japanese ] = "“ü—Í•¶Žš—ñ";
        Text[ korean ] = "Ç׸ñ ÅØ½ºÆ®";
        Text[ chinese_simplified ] = "ÌõÄ¿ÎÄ×Ö";
        Text[ chinese_traditional ] = "±ø¥Ø¤å";
        Text[ arabic ] = "äÕ ÇáÅÏÎÇá";
        Text[ turkish ] = "Giriþ metni";
        Text[ language_user1 ] = " ";
    };
    PushButton PB_CHAPTERINFO
    {
        Pos = MAP_APPFONT ( 123 , 25 ) ;
        Size = MAP_APPFONT ( 40, 12 ) ;
        Text = "~Kapitelinfo" ;
        Text [ ENGLISH ] = "Chapter info" ;
        Text[ english_us ] = "~Chapter info";
        Text[ portuguese ] = "Inform. sobre ~capítulo";
        Text[ russian ] = "Èíôîðìàöèÿ ãëàâû";
        Text[ greek ] = "Ðëçñïöïñßåò êåöáëáßïõ";
        Text[ dutch ] = "Hoo~fdstukinfo";
        Text[ french ] = "Info ~chapitre";
        Text[ spanish ] = "Información ~cap.";
        Text[ italian ] = "Info capitolo";
        Text[ danish ] = "Kapitelinfo";
        Text[ swedish ] = "~Kapitelinfo";
        Text[ polish ] = "Informacja o rozdziale";
        Text[ portuguese_brazilian ] = "Chapter info";
        Text[ japanese ] = "Í‚̏î•ñ";
        Text[ korean ] = "Àå Á¤º¸(~C)";
        Text[ chinese_simplified ] = "Õ½ÚÐÅÏ¢";
        Text[ chinese_traditional ] = "³¹¸`¸ê°T";
        Text[ arabic ] = "ãÚáæãÇÊ ÇáÝÕá";
        Text[ turkish ] = "Bölüm bilgileri";
        Text[ language_user1 ] = " ";
    };
    PushButton PB_PAGENO
    {
        Pos = MAP_APPFONT ( 166 , 25 ) ;
        Size = MAP_APPFONT ( 40, 12 ) ;
        Text = "~Seitennr." ;
        Text [ ENGLISH ] = "Page no." ;
        Text[ english_us ] = "Page no.";
        Text[ portuguese ] = "~Página nº.";
        Text[ russian ] = "Ñòðàíèöà ¹";
        Text[ greek ] = "Áñéèìüò óåëßäáò";
        Text[ dutch ] = "~Paginanr.";
        Text[ french ] = "~No. de page";
        Text[ spanish ] = "Nú~m. página";
        Text[ italian ] = "Pag. no.";
        Text[ danish ] = "Sidetal";
        Text[ swedish ] = "~Sidnr";
        Text[ polish ] = "Numer str.";
        Text[ portuguese_brazilian ] = "Page no.";
        Text[ japanese ] = "Íß°¼Þ”ԍ†";
        Text[ korean ] = "ÆäÀÌÁö ¹øÈ£.";
        Text[ chinese_simplified ] = "Ò³Âë";
        Text[ chinese_traditional ] = "­¶­±¸¹½X";
        Text[ arabic ] = "ÑÞã ÇáÕÝÍÉ";
        Text[ turkish ] = "Sayfa no.";
        Text[ language_user1 ] = " ";
    };
    PushButton PB_TAB
    {
        Pos = MAP_APPFONT ( 209 ,25  ) ;
        Size = MAP_APPFONT ( 40, 12 ) ;
        Text = "~Tabulator" ;
        Text [ ENGLISH ] = "Tab stop" ;
        Text[ english_us ] = "Tab stop";
        Text[ portuguese ] = "~Tabulação";
        Text[ russian ] = "Òàáóëÿòîð";
        Text[ greek ] = "ÓôçëïèÝôçò";
        Text[ dutch ] = "~Tabstop";
        Text[ french ] = "~Tabulation";
        Text[ spanish ] = "~Tabulación";
        Text[ italian ] = "~Tabulazione";
        Text[ danish ] = "Tabulator";
        Text[ swedish ] = "~Tabulator";
        Text[ polish ] = "Tabulator";
        Text[ portuguese_brazilian ] = "Tab stop";
        Text[ japanese ] = "ÀÌÞ";
        Text[ korean ] = "ÅÇ Á¤Áö";
        Text[ chinese_simplified ] = "ÖÆ±í·û";
        Text[ chinese_traditional ] = "¨îªí²Å";
        Text[ arabic ] = "ÚáÇãÉ ÌÏæáÉ";
        Text[ turkish ] = "Sekme";
        Text[ language_user1 ] = " ";
    };
    PushButton PB_HYPERLINK
    {
        Pos = MAP_APPFONT ( 209 , 25 ) ;
        Size = MAP_APPFONT ( 40, 12 ) ;
        Text = "H~yperlink" ;
        Text [ ENGLISH ] = "Hyperlink" ;
        Text[ english_us ] = "~Hyperlink";
        Text[ portuguese ] = "~Hiperligação";
        Text[ russian ] = "Ãèïåðññûëêà";
        Text[ greek ] = "Õðåñ-óýíäåóç";
        Text[ dutch ] = "H~yperlink";
        Text[ french ] = "~Hyperlien";
        Text[ spanish ] = "~Hiperenlace";
        Text[ italian ] = "H~yperlink";
        Text[ danish ] = "H~yperlink";
        Text[ swedish ] = "H~yperlänk";
        Text[ polish ] = "Hiper³¹cze";
        Text[ portuguese_brazilian ] = "Hyperlink";
        Text[ japanese ] = "ʲÊß°ØÝ¸(~H)";
        Text[ korean ] = "ÇÏÀÌÆÛ¸µÅ©(~H)";
        Text[ chinese_simplified ] = "³¬Á´½Ó(~H)";
        Text[ chinese_traditional ] = "¶W³sµ²(~H)";
        Text[ arabic ] = "ÇÑÊÈÇØ ÊÔÚÈí";
        Text[ turkish ] = "Hyperlink";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_AUTHFIELD
    {
        Pos = MAP_APPFONT ( 37 , 25 ) ;
        Size = MAP_APPFONT ( 59, 60 ) ;
        DropDown = TRUE;
        Border = TRUE;
        Sort = TRUE;
    };
    PushButton PB_AUTHINSERT
    {
        Pos = MAP_APPFONT ( 99 , 25 ) ;
        Size = MAP_APPFONT ( 39, 12 ) ;
        Text = "~Einfügen" ;
        Text [ ENGLISH ] = "Insert" ;
        Text[ english_us ] = "~Insert";
        Text[ portuguese ] = "~Inserir";
        Text[ russian ] = "Âñòàâèòü";
        Text[ greek ] = "ÅéóáãùãÞ";
        Text[ dutch ] = "~Invoegen";
        Text[ french ] = "~Insérer";
        Text[ spanish ] = "In~sertar";
        Text[ italian ] = "Inserisci";
        Text[ danish ] = "Indsæt";
        Text[ swedish ] = "~Infoga";
        Text[ polish ] = "Wstaw";
        Text[ portuguese_brazilian ] = "Insert";
        Text[ japanese ] = "‘}“ü(~I)";
        Text[ korean ] = "»ðÀÔ(~I)";
        Text[ chinese_simplified ] = "²åÈë(~I)";
        Text[ chinese_traditional ] = "´¡¤J(~I)";
        Text[ arabic ] = "ÅÏÑÇÌ";
        Text[ turkish ] = "Ekle";
        Text[ language_user1 ] = " ";
    };
    PushButton PB_AUTHREMOVE
    {
        Pos = MAP_APPFONT ( 142 , 25 ) ;
        Size = MAP_APPFONT ( 39, 12 ) ;
        Text = "~Entfernen" ;
        Text [ ENGLISH ] = "Remove" ;
        Text[ english_us ] = "~Remove";
        Text[ portuguese ] = "E~liminar";
        Text[ russian ] = "Óáðàòü";
        Text[ greek ] = "ÊáôÜñãçóç";
        Text[ dutch ] = "~Verwijderen";
        Text[ french ] = "~Supprimer";
        Text[ spanish ] = "~Eliminar";
        Text[ italian ] = "Rimuovi";
        Text[ danish ] = "Fjern";
        Text[ swedish ] = "~Ta bort";
        Text[ polish ] = "Usuñ";
        Text[ portuguese_brazilian ] = "Remove";
        Text[ japanese ] = "íœ(~R)";
        Text[ korean ] = "Á¦°Å(~R)";
        Text[ chinese_simplified ] = "ɾ³ý(~R)";
        Text[ chinese_traditional ] = "§R°£(~R)";
        Text[ arabic ] = "ÅÒÇáÉ";
        Text[ turkish ] = "Kaldýr";
        Text[ language_user1 ] = " ";
    };




    FixedText FT_CHARSTYLE
    {
        Pos = MAP_APPFONT ( 37 , 42 ) ;
        Size = MAP_APPFONT (60 , 10 ) ;
        Text = "Zeichen~vorlage" ;
        Text [ ENGLISH ] = "Character style" ;
        Text[ english_us ] = "Character Style";
        Text[ portuguese ] = "~Estilos de caracteres";
        Text[ russian ] = "Ñòèëü çíàêîâ";
        Text[ greek ] = "Óôõë ÷áñáêôÞñùí";
        Text[ dutch ] = "Teken~opmaakprofiel";
        Text[ french ] = "Style de ~caractère";
        Text[ spanish ] = "Estilo de ~carácter";
        Text[ italian ] = "Modello di carattere";
        Text[ danish ] = "Tegntypografi";
        Text[ swedish ] = "T~eckenformatmall";
        Text[ polish ] = "Styl znaku";
        Text[ portuguese_brazilian ] = "Character style";
        Text[ japanese ] = "•¶Žš½À²Ù";
        Text[ korean ] = "¹®ÀÚ À¯Çü";
        Text[ chinese_simplified ] = "×Ö·ûÑùʽ";
        Text[ chinese_traditional ] = "¦r«¬¼Ë¦¡";
        Text[ arabic ] = "äãØ ÇáÃÍÑÝ";
        Text[ turkish ] = "Karakter þablonu";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_CHARSTYLE
    {
        Pos = MAP_APPFONT ( 100 , 40 ) ;
        Size = MAP_APPFONT ( 98, 40 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
    };
    PushButton PB_EDITSTYLE
    {
        Pos = MAP_APPFONT ( 199 , 40 ) ;
        Size = MAP_APPFONT ( 50, 12 ) ;
        Text = "~Bearbeiten..." ;
        Text [ ENGLISH ] = "Edit..." ;
        Text[ english_us ] = "~Edit...";
        Text[ portuguese ] = "~Editar...";
        Text[ russian ] = "Ïðàâêà...";
        Text[ greek ] = "Åðåîåñãáóßá...";
        Text[ dutch ] = "~Bewerken...";
        Text[ french ] = "~Éditer...";
        Text[ spanish ] = "~Editar...";
        Text[ italian ] = "~Modifica...";
        Text[ danish ] = "Rediger...";
        Text[ swedish ] = "~Redigera...";
        Text[ polish ] = "Edytuj...";
        Text[ portuguese_brazilian ] = "Edit...";
        Text[ japanese ] = "•ҏW(~E)...";
        Text[ korean ] = "ÆíÁý(~E)...";
        Text[ chinese_simplified ] = "±à¼­(~E)...";
        Text[ chinese_traditional ] = "½s¿è(~E)...";
        Text[ arabic ] = "ÊÍÑíÑ...";
        Text[ turkish ] = "Düzenle...";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_FILLCHAR
    {
        Pos = MAP_APPFONT ( 37 , 57 ) ;
        Size = MAP_APPFONT (60 , 10 ) ;
        Text = "~Füllzeichen" ;
        Text [ ENGLISH ] = "Fill character" ;
        Text[ english_us ] = "Fill character";
        Text[ portuguese ] = "Caracter de ~preenchimento";
        Text[ russian ] = "Çàïîëíèòåëü";
        Text[ greek ] = "×áñáêôÞñáò ãåìßóìáôïò";
        Text[ dutch ] = "Opv~ulteken";
        Text[ french ] = "Caractères de ~remplissage";
        Text[ spanish ] = "Carácter de ~relleno";
        Text[ italian ] = "Caratteri riempitivi";
        Text[ danish ] = "Fyldtegn";
        Text[ swedish ] = "Ut~fyllnadstecken";
        Text[ polish ] = "Znak-wype³niacz";
        Text[ portuguese_brazilian ] = "Fill character";
        Text[ japanese ] = "ذÀÞ°";
        Text[ korean ] = "¹®ÀÚ Ã¤¿ì±â";
        Text[ chinese_simplified ] = "³äÌî×Ö·û";
        Text[ chinese_traditional ] = "¥R¶ñ¦r«¬";
        Text[ arabic ] = "ÍÑæÝ ÊÚÈÆÉ";
        Text[ turkish ] = "Öncü";
        Text[ language_user1 ] = " ";
    };
    ComboBox CB_FILLCHAR
    {
        Pos = MAP_APPFONT ( 100 , 55 ) ;
        Size = MAP_APPFONT ( 20, 40 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
    };
    FixedText FT_CHAPTERENTRY
    {
        Pos = MAP_APPFONT ( 37 , 57 ) ;
        Size = MAP_APPFONT ( 60, 10 ) ;
        Text = "Ka~piteleintrag" ;
        Text [ ENGLISH ] = "Chapter entry" ;
        Text[ english_us ] = "Chapter entry";
        Text[ portuguese ] = "Entrada de ~capítulo";
        Text[ russian ] = "Ýëåìåíò ãëàâû";
        Text[ greek ] = "ÅããñáöÞ êåöáëáßïõ";
        Text[ dutch ] = "Hoofd~stukitem";
        Text[ french ] = "Entrée de ~chapitre";
        Text[ spanish ] = "E~ntrada de capítulo";
        Text[ italian ] = "Voce capitolo";
        Text[ danish ] = "Kapitelelement";
        Text[ swedish ] = "Ka~pitelpost";
        Text[ polish ] = "Wpis do rozdzia³u";
        Text[ portuguese_brazilian ] = "Chapter entry";
        Text[ japanese ] = "ÍŒ©o‚µ";
        Text[ korean ] = "Àå Ç׸ñ";
        Text[ chinese_simplified ] = "Õ½ÚÌõÄ¿";
        Text[ chinese_traditional ] = "³¹¸`±ø¥Ø";
        Text[ arabic ] = "ÅÏÎÇá Ýí ÝÕá";
        Text[ turkish ] = "Bölüm giriþi";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_CHAPTERENTRY
    {
        Pos = MAP_APPFONT ( 100 , 55 ) ;
        Size = MAP_APPFONT ( 98, 40 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        StringList =
        {
            < "Nur Nummernkreis" ; > ;
            < "Nur Beschreibung" ; > ;
            < "Nummernkreis und Beschreibung" ; > ;
        };
        StringList [English]=
        {
            < "Sequence only" ; > ;
            < "Description only" ; > ;
            < "Sequence and description" ; > ;
        };
    StringList [ language_user1 ] =
    {
        < " " ; > ;
        < " " ; > ;
            < " " ; > ;
    };
    StringList [ english_us ] =
    {
            < "Number range only" ; > ;
        < "Description only" ; > ;
        < "Number range and description" ; > ;
    };
    StringList [ portuguese ] =
    {
            < "Só sequência" ; > ;
        < "Só descrição" ; > ;
        < "Sequência e descrição" ; > ;
    };
    StringList [ russian ] =
    {
            < "Òîëüêî ïîðÿäêîâûé íîìåð" ; > ;
        < "Òîëüêî îïèñàíèå" ; > ;
        < "Ïîðÿäêîâûé íîìåð è îïèñàíèå" ; > ;
    };
    StringList [ greek ] =
    {
            < "Ìüíï êýêëïò áñéèìþí" ; > ;
        < "Ìüíï ðåñéãñáöÞ" ; > ;
        < "Ìüíï ðåñéãñáöÞ" ; > ;
    };
    StringList [ dutch ] =
    {
            < "Alleen nummerreeks" ; > ;
        < "Alleen beschrijving" ; > ;
        < "Nummerreeks en beschrijving" ; > ;
    };
    StringList [ french ] =
    {
            < "Uniquement la séquence" ; > ;
        < "Uniquement la description" ; > ;
        < "Séquence et description" ; > ;
    };
    StringList [ spanish ] =
    {
            < "Solo secuencia" ; > ;
        < "Solo descripción" ; > ;
        < "Secuencia y descripción" ; > ;
    };
    StringList [ italian ] =
    {
            < "Solo sequenza" ; > ;
        < "Solo descrizione" ; > ;
        < "Sequenza e descrizione" ; > ;
    };
    StringList [ danish ] =
    {
            < "Kun sekvensnummerering" ; > ;
        < "Kun beskrivelse" ; > ;
        < "Sekvensnummerering og beskrivelse" ; > ;
    };
    StringList [ swedish ] =
    {
            < "Bara nummersekvens" ; > ;
        < "Bara beskrivning" ; > ;
        < "Nummersekvens och beskrivning" ; > ;
    };
    StringList [ polish ] =
    {
            < "Tylko sekwencja" ; > ;
        < "Tylko opis" ; > ;
        < "Sekwencja i opis" ; > ;
    };
    StringList [ portuguese_brazilian ] =
    {
            < "Nummernkreis und Beschreibung" ; > ;
        < "Nur Nummernkreis" ; > ;
        < "Nur Beschreibung" ; > ;
    };
    StringList [ japanese ] =
    {
            < "˜A”Ô‚Ì‚Ý" ; > ;
        < "×ÍÞق̂Ý" ; > ;
        < "˜A”Ô‚Æ×ÍÞÙ" ; > ;
    };
    StringList [ korean ] =
    {
            < "¼ýÀÚ ¿µ¿ª¸¸" ; > ;
        < "¼³¸í¸¸" ; > ;
        < "¼ýÀÚ ¿µ¿ª°ú ¼³¸í" ; > ;
    };
    StringList [ chinese_simplified ] =
    {
            < "Ö»ÊÇÅÅÁбàºÅ" ; > ;
        < "Ö»ÊÇ˵Ã÷" ; > ;
        < "ÅÅÁбàºÅºÍ˵Ã÷" ; > ;
    };
    StringList [ chinese_traditional ] =
    {
            < "¶È±Ä¥Î¸¹½X" ; > ;
        < "¶È±Ä¥Î´y­z" ; > ;
        < "¸¹½X©M´y­z" ; > ;
    };
    StringList [ arabic ] =
    {
            < "ÊÓáÓá ÝÞØ" ; > ;
        < "æÕÝ ÝÞØ" ; > ;
        < "ÊÓáÓá ææÕÝ" ; > ;
    };
    StringList [ turkish ] =
    {
            < "Yalnýzca numara aralýðý" ; > ;
        < "Yalnýzca açýklama" ; > ;
        < "Numara aralýðý ve açýklama" ; > ;
    };
    };
/*  FixedText FT_SORTING
    {
        Pos = MAP_APPFONT ( 43 , 85 ) ;
        Size = MAP_APPFONT ( 60, 10 ) ;
        Text = "Sortierung" ;
        Text [ ENGLISH ] = "Sorting" ;
    };
    ListBox LB_SORTING
    {
        Pos = MAP_APPFONT ( 100 , 85 ) ;
        Size = MAP_APPFONT ( 100, 40 ) ;
        DropDown = TRUE;
        TabStop = TRUE;
        StringList =
        {
            < "Alphabetisch" ; > ;
            < "Fortlaufend" ; > ;
        };
        StringList [English]=
        {
            < "Alphabetical" ; > ;
            < "Consecutively" ; > ;
        };
    };
*/  FixedText FT_TABPOS
    {
        Pos = MAP_APPFONT ( 37 , 70 ) ;
        Size = MAP_APPFONT ( 60, 10 ) ;
        Text = "Tab~ulatorposition" ;
        Text [ ENGLISH ] = "Tab stop position" ;
        Text[ english_us ] = "Tab stop position";
        Text[ portuguese ] = "~Posição da tabulação";
        Text[ russian ] = "Ïîçèöèÿ òàáóëÿòîðà";
        Text[ greek ] = "ÈÝóç óôçëïèÝôç";
        Text[ dutch ] = "T~abstoppositie";
        Text[ french ] = "Position de ~tabulation";
        Text[ spanish ] = "Po~sición de tabulación";
        Text[ italian ] = "Posizione tab~ulazione";
        Text[ danish ] = "Tabulatorposition";
        Text[ swedish ] = "Tab~ulatorposition";
        Text[ polish ] = "Pozycja tabulatora";
        Text[ portuguese_brazilian ] = "Tab stop position";
        Text[ japanese ] = "ÀÌވʒu";
        Text[ korean ] = "ÅÇ À§Ä¡";
        Text[ chinese_simplified ] = "ÖÆ±í·ûλÖÃ";
        Text[ chinese_traditional ] = "¨îªí²Å¦ì¸m";
        Text[ arabic ] = "ãæÖÚ ÚáÇãÉ ÇáÌÏæáÉ";
        Text[ turkish ] = "Sekme konumu";
        Text[ language_user1 ] = " ";
    };
    MetricField MF_TABPOS
    {
        Pos = MAP_APPFONT ( 100 , 70 ) ;
        Size = MAP_APPFONT ( 40, 10 ) ;
        Border = TRUE ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 0 ;
        Maximum = 1999 ;
        DecimalDigits = 2 ;
        Value = 0 ;
        Unit = FUNIT_CM ;
        First = 0 ;
        Last = 1999 ;
        SpinSize = 5 ;
    };
    CheckBox CB_AUTORIGHT
    {
        Pos = MAP_APPFONT ( 143 , 70 ) ;
        Size = MAP_APPFONT ( 100, 10 ) ;
        Text = "Am ~rechten Rand" ;
        Text [ ENGLISH ] = "Right border" ;
        Text[ english_us ] = "T~o right margin";
        Text[ portuguese ] = "Na margem ~direita";
        Text[ russian ] = "Â ïðàâîì ïîëå";
        Text[ greek ] = "Óôï äåîß ðåñéèþñéï";
        Text[ dutch ] = "Aan rechter ~marge";
        Text[ french ] = "Bord ~droit";
        Text[ spanish ] = "Al bor~de derecho";
        Text[ italian ] = "Bordo dest~ro";
        Text[ danish ] = "Ved højre margen";
        Text[ swedish ] = "Vid högermarginalen";
        Text[ polish ] = "Z prawej krawêdzi";
        Text[ portuguese_brazilian ] = "Right border";
        Text[ japanese ] = "‰E—]”’";
        Text[ korean ] = "¿À¸¥ÂÊ ¿©¹é(~O)";
        Text[ chinese_simplified ] = "Óұ߿հ×";
        Text[ chinese_traditional ] = "¦b¥kÃäªÅ¥Õ¤W";
        Text[ arabic ] = "Úáì ÇáåÇãÔ ÇáÃíãä";
        Text[ turkish ] = "Sað kenar";
        Text[ language_user1 ] = " ";
    };
    GroupBox GB_ENTRY
    {
        Pos = MAP_APPFONT ( 34 , 3 ) ;
        Size = MAP_APPFONT ( 220, 80 ) ;
        Text = "Aufbau" ;
        Text [ ENGLISH ] = "Structure" ;
        Text[ english_us ] = "Structure";
        Text[ portuguese ] = "Estrutura";
        Text[ russian ] = "Ñòðîåíèå";
        Text[ greek ] = "ÄïìÞ";
        Text[ dutch ] = "Structuur";
        Text[ french ] = "Structure";
        Text[ spanish ] = "Estructura";
        Text[ italian ] = "Struttura";
        Text[ danish ] = "Struktur";
        Text[ swedish ] = "Struktur";
        Text[ polish ] = "Struktura";
        Text[ portuguese_brazilian ] = "Structure";
        Text[ japanese ] = "\\¬";
        Text[ korean ] = "±¸Á¶";
        Text[ chinese_simplified ] = "¹¹³É";
        Text[ chinese_traditional ] = "µ²ÌÛ";
        Text[ arabic ] = "ÇáÈäíÉ";
        Text[ turkish ] = "Yapý";
        Text[ language_user1 ] = " ";
    };
/*  CheckBox CB_RECALCTAB
    {
        Pos = MAP_APPFONT ( 37 , 98 ) ;
        Size = MAP_APPFONT ( 200, 10 ) ;
        Text = "Tabulatorposition immer neu berechnen" ;
        Text [ ENGLISH ] = "Recalculate tab stop position" ;
    };
*/  CheckBox CB_RELTOSTYLE
    {
        Pos = MAP_APPFONT ( 37 , 96 ) ;
        Size = MAP_APPFONT ( 200, 10 ) ;
        Text = "P~osition der Tabulatoren relativ zum Einzug aus der Absatzvorlage" ;
        Text [ ENGLISH ] = "Position of tab stops relativ to the paragraph style indent" ;
        Text[ english_us ] = "Tab position relati~ve to Paragraph Style indent";
        Text[ portuguese ] = "~Posição relativa ao avanço do estilo de parágrafo";
        Text[ russian ] = "Ïîçèöèÿ òàáóëÿòîðîâ îòíîñ. îòñòóïà èç ñòèëÿ àáçàöà";
        Text[ greek ] = "ÈÝóç óôçëïèåôþí áíÜëïãá ìå ôçí åóï÷Þ ôïõ ðñïôýðïõ ôçò ðáñáãñÜöïõ";
        Text[ dutch ] = "~Positie in verhouding tot de inspringing uit het alinea-opmaakprofiel.";
        Text[ french ] = "P~osition en fonction du style de paragraphe (retrait)";
        Text[ spanish ] = "Posición relati~va a sangría de estilo de párrafo";
        Text[ italian ] = "P~osizione relativa al rientro del modello di paragrafo";
        Text[ danish ] = "Tabulatorernes position relativ til indrykningen fra afsnitstypografien";
        Text[ swedish ] = "Tabulatorernas p~osition relativ till indraget från styckeformatmallen";
        Text[ polish ] = "Pozycja relatywna do wciêcia ze stylu akapitu";
        Text[ portuguese_brazilian ] = "Position relativ to the paragraph style indent";
        Text[ japanese ] = "ÀÌވʒu‚Í’i—޽À²Ù‚̲ÝÃÞÝĂ©‚ç";
        Text[ korean ] = "´Ü¶ôÀÇ Ã¹¹®Àå ¶ç¾î¾²±â¿¡ °ü·ÃµÈ ÅÇ À§Ä¡";
        Text[ chinese_simplified ] = "ÖÆ±í·ûλÖúͶÎÂäÑùʽµÄËõ½ø±£³ÖÏà¶ÔλÖÃ";
        Text[ chinese_traditional ] = "©M¬q¸¨¼Ë¦¡ªºÁY±Æ«O«ù¬Û¹ï¦ì¸m";
        Text[ arabic ] = "ãæÖÚ ÚáÇãÇÊ ÇáÌÏæáÉ äÓÈÉ áÅÒÇÍÉ äãØ ÇáÝÞÑÉ";
        Text[ turkish ] = "Paragraf biçimi girintisine göre orantýlý sekme konumu";
        Text[ language_user1 ] = " ";
    };
/*  CheckBox CB_NUMSTYLEFROMPDESC
    {
        Pos = MAP_APPFONT ( 37 , 119 ) ;
        Size = MAP_APPFONT ( 200, 10 ) ;
        Text = "Zahlenformat aus der Seitenvorlage" ;
        Text [ ENGLISH ] = "Numbering type from page style" ;
    };
*/
    FixedText FT_MAIN_ENTRY_STYLE
    {
        Pos = MAP_APPFONT ( 37 , 95 ) ;
        Size = MAP_APPFONT ( 105, 10 ) ;
        Text = "Zeichenvorla~ge für Haupteinträge" ;
        Text [ ENGLISH ] = "Character style of main entries" ;
        Text[ english_us ] = "Character Style for main entries";
        Text[ portuguese ] = "Estilo de ~caracteres para entradas principais";
        Text[ russian ] = "Ñòèëü çíàêîâ äëÿ ãëàâíûõ ýëåìåíòîâ";
        Text[ greek ] = "Óôõë ÷áñáêôÞñùí ôùí êõñßùí åããñáöþí";
        Text[ dutch ] = "~Tekenopmaakprofiel voor hoofditems";
        Text[ french ] = "Style de ~caractère des entrées principales";
        Text[ spanish ] = "~Estilo de caracteres para entradas principales";
        Text[ italian ] = "Modello di carattere per voci principali";
        Text[ danish ] = "Tegntypografi til hovedelementer";
        Text[ swedish ] = "Te~ckenformatmall för huvudposter";
        Text[ polish ] = "Styl znaku wpisów g³ównych";
        Text[ portuguese_brazilian ] = "Character style of main entries";
        Text[ japanese ] = "Žå“ü—Í—p•¶Žš½À²Ù";
        Text[ korean ] = "ÁÖ Ç׸ñ¿¡´ëÇÑ ¹®ÀÚ À¯Çü";
        Text[ chinese_simplified ] = "Ö÷ÌõÄ¿µÄ×Ö·ûÑùʽ";
        Text[ chinese_traditional ] = "¥D¶µ¥Øªº¦r«¬¼Ë¦¡";
        Text[ arabic ] = "äãØ ÇáÃÍÑÝ ááÅÏÎÇáÇÊ ÇáÃÓÇÓíÉ";
        Text[ turkish ] = "Ana giriþler için karakter þablonu";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_MAIN_ENTRY_STYLE
    {
        Pos = MAP_APPFONT ( 144 , 93 ) ;
        Size = MAP_APPFONT ( 100, 40 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
    };

    CheckBox CB_ALPHADELIM
    {
        Pos = MAP_APPFONT ( 37 , 108 ) ;
        Size = MAP_APPFONT ( 105, 10 ) ;
        Text = "Alphabet~isches Trennzeichen" ;
        Text [ ENGLISH ] = "Alphabetical delimiter" ;
        Text[ english_us ] = "Alphabetical delimiter";
        Text[ portuguese ] = "Separador alfa~bético";
        Text[ russian ] = "Àëôàâèòíûé ðàçäåëèòåëü";
        Text[ greek ] = "Áëöáâçôéêü åíùôéêü";
        Text[ dutch ] = "~Alphabetisch scheidingsteken";
        Text[ french ] = "Séparateur ~alphabétique";
        Text[ spanish ] = "Separador alfa~bético";
        Text[ italian ] = "Separatori alfabetici";
        Text[ danish ] = "Alfabetisk skilletegn";
        Text[ swedish ] = "Alfabetiskt skiljetecken";
        Text[ polish ] = "Alfabetyczny separator";
        Text[ portuguese_brazilian ] = "Alphabetical delimiter";
        Text[ japanese ] = "±Ù̧ÍÞ¯Ä‚Ì‹æØ‚è‹L†";
        Text[ korean ] = "¾ËÆÄºª¼øÀÇ ±¸ºÐ ±âÈ£";
        Text[ chinese_simplified ] = "×Öĸ·Ö¸ô·û";
        Text[ chinese_traditional ] = "¦r¥À¤À¹j²Å";
        Text[ arabic ] = "ÝÇÕá ÃÈÌÏí";
        Text[ turkish ] = "Alfabetik ayýrma iþareti";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_COMMASEPARATED
    {
        Pos = MAP_APPFONT ( 144 , 108 ) ;
        Size = MAP_APPFONT ( 105, 10 ) ;
        Text = "S~chlüssel kommasepariert" ;
        Text [ ENGLISH ] = "Comma separated keys" ;
        Text[ english_us ] = "Key separated by commas";
        Text[ portuguese ] = "~Chaves separadas por vírgulas";
        Text[ russian ] = "Êëþ÷, ðàçäåëåííûé çàïÿòîé";
        Text[ greek ] = "ÊëåéäéÜ äéá÷ùñéæüìåíá ìå êüììáôá";
        Text[ dutch ] = "~Sleutel afgescheiden door komma";
        Text[ french ] = "~Clés séparées par une virgule";
        Text[ spanish ] = "Cla~ves separadas por comas";
        Text[ italian ] = "~Chiavi separate da virgola";
        Text[ danish ] = "Kommasepareret nøgle";
        Text[ swedish ] = "Nyckel, kommaseparerad";
        Text[ polish ] = "Klucz odseparowany przecinkiem";
        Text[ portuguese_brazilian ] = "Comma separated keys";
        Text[ japanese ] = "ºÝςŷ°‚𗣂·";
        Text[ korean ] = "Äĸ¶¿¡ÀÇÇØ ±¸ºÐµÈ Ű";
        Text[ chinese_simplified ] = "¼üÂëÓöººÅ·Ö¿ª";
        Text[ chinese_traditional ] = "Áä½X¥Î³r¸¹¤À¶}";
        Text[ arabic ] = "ãÝÇÊíÍ ÈíäåÇ ÝÇÕáÉ";
        Text[ turkish ] = "Virgüllerle ayrýlmýþ anahtar";
        Text[ language_user1 ] = " ";
    };
    GroupBox GB_FORMAT
    {
        Pos = MAP_APPFONT ( 34 , 84 ) ;
        Size = MAP_APPFONT ( 220, 49  ) ;
        Text = "Formatierung" ;
        Text [ ENGLISH ] = "Format" ;
        Text[ english_us ] = "Format";
        Text[ portuguese ] = "Formatação";
        Text[ russian ] = "Ôîðìàò";
        Text[ greek ] = "ÌïñöïðïéçìÝíï ðåäßï";
        Text[ dutch ] = "Opmaak";
        Text[ french ] = "Formatage";
        Text[ spanish ] = "Formato";
        Text[ italian ] = "Formattazione";
        Text[ danish ] = "Formatering";
        Text[ swedish ] = "Formatering";
        Text[ polish ] = "Formatowanie";
        Text[ portuguese_brazilian ] = "Format";
        Text[ japanese ] = "‘Ž®";
        Text[ korean ] = "¼­½Ä";
        Text[ chinese_simplified ] = "¸ñʽ»¯";
        Text[ chinese_traditional ] = "®æ¦¡¤Æ";
        Text[ arabic ] = "ÇáÊäÓíÞ";
        Text[ turkish ] = "Formatlama";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_DOCPOS
    {
        Pos = MAP_APPFONT ( 40 , 97) ;
        Size = MAP_APPFONT ( 110, 10  ) ;
        Text = "Dokument~position " ;
        Text [ ENGLISH ] = "document position" ;
        Text[ english_us ] = "Document ~position ";
        Text[ portuguese ] = "~Posição do documento ";
        Text[ russian ] = "Ïîëîæåíèå äîêóìåíòà  ";
        Text[ greek ] = "ÈÝóç åããñÜöïõ ";
        Text[ dutch ] = "Document~positie  ";
        Text[ french ] = "~Emplacement ds le document   ";
        Text[ spanish ] = "P~osición del documento ";
        Text[ italian ] = "~Posizione del documento  ";
        Text[ danish ] = "Dokumentets placering ";
        Text[ swedish ] = "Dokument~position   ";
        Text[ polish ] = "Pozycja dokumentu ";
        Text[ portuguese_brazilian ] = "by document position";
        Text[ japanese ] = "ÄÞ·­ÒÝĂ̈ʒu(~P)";
        Text[ korean ] = "¹®¼­ À§Ä¡ (~P)";
        Text[ chinese_simplified ] = "ÎĵµÎ»Öà (~P)";
        Text[ chinese_traditional ] = "¤å¥ó¦ì¸m (~P)";
        Text[ arabic ] = "ãæÖÚ ÇáãÓÊäÏ ";
        Text[ turkish ] = "Belge konumu ";
    };
    RadioButton RB_SORTCONTENT
    {
        Pos = MAP_APPFONT ( 40 , 110 ) ;
        Size = MAP_APPFONT ( 110, 10  ) ;
        Text = "~Inhalt" ;
        Text [ ENGLISH ] = "content" ;
        Text[ english_us ] = "~Content";
        Text[ portuguese ] = "~Conteúdo";
        Text[ russian ] = "Ñîäåðæèìîå";
        Text[ greek ] = "Ðåñéå÷üìåíá";
        Text[ dutch ] = "~Inhoud";
        Text[ french ] = "le ~contenu";
        Text[ spanish ] = "C~ontenido";
        Text[ italian ] = "Contenuto";
        Text[ danish ] = "Indhold";
        Text[ swedish ] = "I~nnehåll";
        Text[ polish ] = "ZawartoϾ";
        Text[ portuguese_brazilian ] = "Sort by content";
        Text[ japanese ] = "“à—e(~C)";
        Text[ korean ] = "³»¿ë(~C)";
        Text[ chinese_simplified ] = "ÄÚÈÝ(~C)";
        Text[ chinese_traditional ] = "¤º®e(~C)";
        Text[ arabic ] = "ÇáãÍÊæíÇÊ";
        Text[ turkish ] = "Ýçerik";
        Text[ language_user1 ] = " ";
    };
    GroupBox GB_SORTING
    {
        Pos = MAP_APPFONT ( 34 , 84 ) ;
        Size = MAP_APPFONT ( 117, 49  ) ;
        Text = "Sortierung nach" ;
        Text [ ENGLISH ] = "Sort by" ;
        Text[ english_us ] = "Sort by";
        Text[ portuguese ] = "Ordenar por ...";
        Text[ russian ] = "Ñîðòèðîâàòü ïî";
        Text[ greek ] = "Ôáîéíüìçóç êáôÜ ...";
        Text[ dutch ] = "Sorteren op";
        Text[ french ] = "Trier en fonction de";
        Text[ spanish ] = "Ordenar según";
        Text[ italian ] = "Ordine per";
        Text[ danish ] = "Sorter efter";
        Text[ swedish ] = "Sortering efter ...";
        Text[ polish ] = "Sortuj wed³ug";
        Text[ portuguese_brazilian ] = "Sort by ...";
        Text[ japanese ] = "•À‚בւ¦‚̏‡˜";
        Text[ korean ] = "¿¡ÀÇÇÑ Á¤·Ä ...";
        Text[ chinese_simplified ] = "ÅÅÐò°´ÕÕ ...";
        Text[ chinese_traditional ] = "½s±Æ«ö·Ó...";
        Text[ arabic ] = "ÇáÝÑÒ ÍÓÈ";
        Text[ turkish ] = "Sýralama ölçütü:";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_FIRSTKEY
    {
        Pos = MAP_APPFONT ( 160 , 94 ) ;
        Size = MAP_APPFONT ( 10, 8  ) ;
        Text = "~1" ;
    };
    ListBox LB_FIRSTKEY
    {
        Pos = MAP_APPFONT ( 171 , 93 ) ;
        Size = MAP_APPFONT ( 50, 50  ) ;
        Border = TRUE;
        DropDown = TRUE;
    };
    ImageRadioButton RB_SORTUP1
    {
        Pos = MAP_APPFONT ( 223 , 93 ) ;
        Size = MAP_APPFONT ( 12, 12  ) ;
        RadioButtonImage =
            Image
            {
                ImageBitmap = Bitmap{File = "sc10712.bmp"; };
            };
        Check = TRUE;
        QuickHelpText = "Aufsteigend";
        QuickHelpText[English] = "Ascending";
        QuickHelpText[ english_us ] = "Ascending";
        QuickHelpText[ portuguese ] = "Ascending";
        QuickHelpText[ russian ] = "Ïî âîçðàñòàíèþ";
        QuickHelpText[ greek ] = "Áýîïõóá";
        QuickHelpText[ dutch ] = "Aplopend";
        QuickHelpText[ french ] = "Croissant";
        QuickHelpText[ spanish ] = "Ascending";
        QuickHelpText[ italian ] = "Crescente";
        QuickHelpText[ danish ] = "Stigende";
        QuickHelpText[ swedish ] = "Stigande";
        QuickHelpText[ polish ] = "Rosn¹co";
        QuickHelpText[ portuguese_brazilian ] = "Ascending";
        QuickHelpText[ japanese ] = "¸‡";
        QuickHelpText[ korean ] = "Ascending";
        QuickHelpText[ chinese_simplified ] = "Ascending";
        QuickHelpText[ chinese_traditional ] = "¦V¤W";
        QuickHelpText[ arabic ] = "ÊÕÇÚÏí";
        QuickHelpText[ language_user1 ] = " ";
        QuickHelpText[ language_user1 ] = " ";
        QuickHelpText[ language_user1 ] = " ";
    };
    ImageRadioButton RB_SORTDOWN1
    {
        Pos = MAP_APPFONT ( 237 , 93 ) ;
        Size = MAP_APPFONT ( 12, 12  ) ;
        RadioButtonImage =
            Image
            {
                ImageBitmap = Bitmap{File = "sc10713.bmp"; };
            };
        QuickHelpText = "Absteigend";
        QuickHelpText[English] = "Descending";
        QuickHelpText[ english_us ] = "Descending";
        QuickHelpText[ portuguese ] = "Descending";
        QuickHelpText[ russian ] = "Ïî óáûâàíèþ";
        QuickHelpText[ greek ] = "Öèßíïõóá";
        QuickHelpText[ dutch ] = "Aflopend";
        QuickHelpText[ french ] = "Décroissant";
        QuickHelpText[ spanish ] = "Descending";
        QuickHelpText[ italian ] = "Decrescente";
        QuickHelpText[ danish ] = "Faldende";
        QuickHelpText[ swedish ] = "Fallande";
        QuickHelpText[ polish ] = "Malej¹co";
        QuickHelpText[ portuguese_brazilian ] = "Descending";
        QuickHelpText[ japanese ] = "~‡";
        QuickHelpText[ korean ] = "Descending";
        QuickHelpText[ chinese_simplified ] = "Descending";
        QuickHelpText[ chinese_traditional ] = "¦V¤U";
        QuickHelpText[ arabic ] = "ÊäÇÒáí";
        QuickHelpText[ language_user1 ] = " ";
        QuickHelpText[ language_user1 ] = " ";
        QuickHelpText[ language_user1 ] = " ";
    };
    ImageRadioButton RB_SORTUP2
    {
        Pos = MAP_APPFONT ( 223 , 106 ) ;
        Size = MAP_APPFONT ( 12, 12  ) ;
        RadioButtonImage =
            Image
            {
                ImageBitmap = Bitmap{File = "sc10712.bmp"; };
            };
        Check = TRUE;
        QuickHelpText = "Aufsteigend";
        QuickHelpText[English] = "Ascending";
        QuickHelpText[ english_us ] = "Ascending";
        QuickHelpText[ portuguese ] = "Ascending";
        QuickHelpText[ russian ] = "Ïî âîçðàñòàíèþ";
        QuickHelpText[ greek ] = "Áýîïõóá";
        QuickHelpText[ dutch ] = "Oplopend";
        QuickHelpText[ french ] = "Croissant";
        QuickHelpText[ spanish ] = "Ascending";
        QuickHelpText[ italian ] = "Crescente";
        QuickHelpText[ danish ] = "Stigende";
        QuickHelpText[ swedish ] = "Stigande";
        QuickHelpText[ polish ] = "Rosn¹co";
        QuickHelpText[ portuguese_brazilian ] = "Ascending";
        QuickHelpText[ japanese ] = "¸‡";
        QuickHelpText[ korean ] = "Ascending";
        QuickHelpText[ chinese_simplified ] = "Ascending";
        QuickHelpText[ chinese_traditional ] = "¦V¤W";
        QuickHelpText[ arabic ] = "ÊÕÇÚÏí";
        QuickHelpText[ language_user1 ] = " ";
        QuickHelpText[ language_user1 ] = " ";
        QuickHelpText[ language_user1 ] = " ";
    };
    ImageRadioButton RB_SORTDOWN2
    {
        Pos = MAP_APPFONT ( 237 , 106 ) ;
        Size = MAP_APPFONT ( 12, 12  ) ;
        RadioButtonImage =
            Image
            {
                ImageBitmap = Bitmap{File = "sc10713.bmp"; };
            };
        QuickHelpText = "Absteigend";
        QuickHelpText[English] = "Descending";
        QuickHelpText[ english_us ] = "Descending";
        QuickHelpText[ portuguese ] = "Descending";
        QuickHelpText[ russian ] = "Ïî óáûâàíèþ";
        QuickHelpText[ greek ] = "Öèßíïõóá";
        QuickHelpText[ dutch ] = "Aflopend";
        QuickHelpText[ french ] = "Décroissant";
        QuickHelpText[ spanish ] = "Descending";
        QuickHelpText[ italian ] = "Decrescente";
        QuickHelpText[ danish ] = "Faldende";
        QuickHelpText[ swedish ] = "Fallande";
        QuickHelpText[ polish ] = "Malej¹co";
        QuickHelpText[ portuguese_brazilian ] = "Descending";
        QuickHelpText[ japanese ] = "~‡";
        QuickHelpText[ korean ] = "Descending";
        QuickHelpText[ chinese_simplified ] = "Descending";
        QuickHelpText[ chinese_traditional ] = "¦V¤U";
        QuickHelpText[ arabic ] = "ÊäÇÒáí";
        QuickHelpText[ language_user1 ] = " ";
        QuickHelpText[ language_user1 ] = " ";
        QuickHelpText[ language_user1 ] = " ";
    };
    ImageRadioButton RB_SORTUP3
    {
        Pos = MAP_APPFONT ( 223 , 119 ) ;
        Size = MAP_APPFONT ( 12, 12  ) ;
        RadioButtonImage =
            Image
            {
                ImageBitmap = Bitmap{File = "sc10712.bmp"; };
            };
        Check = TRUE;
        QuickHelpText = "Aufsteigend";
        QuickHelpText[English] = "Ascending";
        QuickHelpText[ english_us ] = "Ascending";
        QuickHelpText[ portuguese ] = "Ascending";
        QuickHelpText[ russian ] = "Ïî âîçðàñòàíèþ";
        QuickHelpText[ greek ] = "Áýîïõóá";
        QuickHelpText[ dutch ] = "Oplopend";
        QuickHelpText[ french ] = "Croissant";
        QuickHelpText[ spanish ] = "Ascending";
        QuickHelpText[ italian ] = "Crescente";
        QuickHelpText[ danish ] = "Stigende";
        QuickHelpText[ swedish ] = "Stigande";
        QuickHelpText[ polish ] = "Rosn¹co";
        QuickHelpText[ portuguese_brazilian ] = "Ascending";
        QuickHelpText[ japanese ] = "¸‡";
        QuickHelpText[ korean ] = "Ascending";
        QuickHelpText[ chinese_simplified ] = "Ascending";
        QuickHelpText[ chinese_traditional ] = "¦V¤W";
        QuickHelpText[ arabic ] = "ÊÕÇÚÏí";
        QuickHelpText[ language_user1 ] = " ";
        QuickHelpText[ language_user1 ] = " ";
        QuickHelpText[ language_user1 ] = " ";
    };
    ImageRadioButton RB_SORTDOWN3
    {
        Pos = MAP_APPFONT ( 237 ,119 ) ;
        Size = MAP_APPFONT ( 12, 12  ) ;
        RadioButtonImage =
            Image
            {
                ImageBitmap = Bitmap{File = "sc10713.bmp"; };
            };
        QuickHelpText = "Absteigend";
        QuickHelpText[English] = "Descending";
        QuickHelpText[ english_us ] = "Descending";
        QuickHelpText[ portuguese ] = "Descending";
        QuickHelpText[ russian ] = "Ïî óáûâàíèþ";
        QuickHelpText[ greek ] = "Öèßíïõóá";
        QuickHelpText[ dutch ] = "Aflopend";
        QuickHelpText[ french ] = "Décroissant";
        QuickHelpText[ spanish ] = "Descending";
        QuickHelpText[ italian ] = "Decrescente";
        QuickHelpText[ danish ] = "Faldende";
        QuickHelpText[ swedish ] = "Fallande";
        QuickHelpText[ polish ] = "Malej¹co";
        QuickHelpText[ portuguese_brazilian ] = "Descending";
        QuickHelpText[ japanese ] = "~‡";
        QuickHelpText[ korean ] = "Descending";
        QuickHelpText[ chinese_simplified ] = "Descending";
        QuickHelpText[ chinese_traditional ] = "¦V¤U";
        QuickHelpText[ arabic ] = "ÊäÇÒáí";
        QuickHelpText[ language_user1 ] = " ";
        QuickHelpText[ language_user1 ] = " ";
        QuickHelpText[ language_user1 ] = " ";
    };
    FixedText FT_SECONDKEY
    {
        Pos = MAP_APPFONT ( 160 , 107 ) ;
        Size = MAP_APPFONT ( 10, 8  ) ;
        Text = "~2" ;
    };
    ListBox LB_SECONDKEY
    {
        Pos = MAP_APPFONT ( 171 , 106 ) ;
        Size = MAP_APPFONT ( 50, 50  ) ;
        Border = TRUE;
        DropDown = TRUE;
    };
    FixedText FT_THIRDDKEY
    {
        Pos = MAP_APPFONT ( 160 , 120 ) ;
        Size = MAP_APPFONT ( 10, 8  ) ;
        Text = "~3" ;
    };
    ListBox LB_THIRDKEY
    {
        Pos = MAP_APPFONT ( 171 , 119 ) ;
        Size = MAP_APPFONT ( 50, 50  ) ;
        Border = TRUE;
        DropDown = TRUE;
    };
    GroupBox GB_SORTKEY
    {
        Pos = MAP_APPFONT ( 154 , 84 ) ;
        Size = MAP_APPFONT ( 100, 49  ) ;
        Text = "Sortierschlüssel" ;
        Text [ ENGLISH ] = "Sort keys" ;
        Text[ english_us ] = "Sort keys";
        Text[ portuguese ] = "Critérios de ordem";
        Text[ russian ] = "Êëþ÷ ñîðòèðîâêè";
        Text[ greek ] = "Êëåéäß ôáîéíüìçóçò";
        Text[ dutch ] = "Sorteersleutel";
        Text[ french ] = "Critère de tri";
        Text[ spanish ] = "Criterios de ordenación";
        Text[ italian ] = "Criteri";
        Text[ danish ] = "Sorteringsnøgle";
        Text[ swedish ] = "Sorteringsnyckel";
        Text[ polish ] = "Klucz sortowania";
        Text[ portuguese_brazilian ] = "Sort keys";
        Text[ japanese ] = "•À‚בւ¦·°";
        Text[ korean ] = "Á¤·Ä Ű";
        Text[ chinese_simplified ] = "ÅÅÐòµÄ¹Ø¼ü×Ö";
        Text[ chinese_traditional ] = "±Æ§ÇªºÃöÁä¦r";
        Text[ arabic ] = "ãÝÇÊíÍ ÇáÝÑÒ";
        Text[ turkish ] = "Sýralama anahtarý";
        Text[ language_user1 ] = " ";
    };

    String STR_NOSORTKEY
    {
        Text = "<Keiner>";
        Text [English] = "<None>";
        Text[ english_us ] = "<None>";
        Text[ portuguese ] = "<Nenhum>";
        Text[ russian ] = "<Áåç>";
        Text[ greek ] = "<ÊáíÝíá>";
        Text[ dutch ] = "<Geen>";
        Text[ french ] = "<Aucun>";
        Text[ spanish ] = "<Ninguno>";
        Text[ italian ] = "<nessuno>";
        Text[ danish ] = "<Ingen>";
        Text[ swedish ] = "<Ingen>";
        Text[ polish ] = "<Brak>";
        Text[ portuguese_brazilian ] = "<None>";
        Text[ japanese ] = "<‚È‚µ>";
        Text[ korean ] = "<¾øÀ½>";
        Text[ chinese_simplified ] = "<ÎÞ>";
        Text[ chinese_traditional ] = "<µL>";
        Text[ arabic ] = "<ÈÏæä>";
        Text[ turkish ] = "<Yok>";
    };
    String STR_NO_CHAR_STYLE
    {
        Text = "<Keine>";
        Text [English] = "<None>";
        Text[ english_us ] = "<None>";
        Text[ portuguese ] = "<Nenhum>";
        Text[ russian ] = "<Áåç>";
        Text[ greek ] = "<ÊáíÝíá>";
        Text[ dutch ] = "<Geen>";
        Text[ french ] = "<Aucun>";
        Text[ spanish ] = "<Ninguno>";
        Text[ italian ] = "<Nessuno>";
        Text[ danish ] = "<Ingen>";
        Text[ swedish ] = "<Ingen>";
        Text[ polish ] = "<Brak>";
        Text[ portuguese_brazilian ] = "<None>";
        Text[ japanese ] = "<‚È‚µ>";
        Text[ korean ] = "<¾øÀ½>";
        Text[ chinese_simplified ] = "<ÎÞ>";
        Text[ chinese_traditional ] = "<µL>";
        Text[ arabic ] = "<ÈÏæä>";
        Text[ turkish ] = "<Yok>";
        Text[ language_user1 ] = " ";
    };
    String STR_DELIM
    {
        Text = "T";
        Text [English] = "S";
        Text[ language_user1 ] = " ";
        Text[ english_us ] = "S";
        Text[ portuguese ] = "S";
        Text[ russian ] = "Ð";
        Text[ greek ] = "Ä";
        Text[ dutch ] = "S";
        Text[ french ] = "S";
        Text[ spanish ] = "S";
        Text[ italian ] = "S";
        Text[ danish ] = "S";
        Text[ swedish ] = "A";
        Text[ polish ] = "S";
        Text[ portuguese_brazilian ] = "S";
        Text[ japanese ] = "S";
        Text[ korean ] = "S";
        Text[ chinese_simplified ] = "S";
        Text[ chinese_traditional ] = "S";
        Text[ arabic ] = "Ý";
        Text[ turkish ] = "T";
    };
};
TabPage TP_TOX_STYLES
{
    HelpID =  HID_TOX_STYLES_PAGE;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Hide = TRUE ;
    FixedText FT_LEVEL
    {
        Pos = MAP_APPFONT ( 11 , 15 ) ;
        Size = MAP_APPFONT ( 24 , 8 ) ;
        Text = "Stu~fen" ;
        Text [ ENGLISH ] = "~Levels" ;
        Text [ norwegian ] = "~Nivåer" ;
        Text [ italian ] = "~Livelli" ;
        Text [ portuguese_brazilian ] = "~Níveis" ;
        Text [ portuguese ] = "~Níveis" ;
        Text [ finnish ] = "~Tasot" ;
        Text [ danish ] = "Niveauer" ;
        Text [ french ] = "~Niveaux" ;
        Text [ swedish ] = "Nivåer" ;
        Text [ dutch ] = "~Niveaus" ;
        Text [ spanish ] = "~Niveles" ;
        Text [ english_us ] = "~Levels" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "¼¶(~L)";
        Text[ russian ] = "Óðîâíè";
        Text[ polish ] = "Poziomy";
        Text[ japanese ] = "ÚÍÞÙ(~L)";
        Text[ chinese_traditional ] = "¯Å(~L)";
        Text[ arabic ] = "ÇáãÓÊæíÇÊ";
        Text[ greek ] = "Åðßðåäá";
        Text[ korean ] = "¼öÁØ(~L)";
        Text[ turkish ] = "Düzeyler";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_LEVEL
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 12 , 25 ) ;
        Size = MAP_APPFONT ( 115 , 81 ) ;
        TabStop = TRUE ;
        AutoHScroll = TRUE ;
    };
    FixedText FT_TEMPLATE
    {
        Pos = MAP_APPFONT ( 133 , 15 ) ;
        Size = MAP_APPFONT ( 54 , 8 ) ;
        Text = "~Absatzvorlagen" ;
        Text [ ENGLISH ] = "~Paragraph styles" ;
        Text [ norwegian ] = "~Avsnittsmaler" ;
        Text [ italian ] = "Mo~delli di paragrafo" ;
        Text [ portuguese_brazilian ] = "~Estilos de parágrafo" ;
        Text [ portuguese ] = "Estilo~s de parágrafo" ;
        Text [ finnish ] = "~Kappaletyylit" ;
        Text [ danish ] = "Afsnitstypografi" ;
        Text [ french ] = "~Styles de paragraphe" ;
        Text [ swedish ] = "Styckeformatmallar" ;
        Text [ dutch ] = "~Alinea-opmaakprofielen" ;
        Text [ spanish ] = "Estilos de párra~fo" ;
        Text [ english_us ] = "Paragraph ~Styles" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "¶ÎÂäÑùʽ(~S)";
        Text[ russian ] = "Ñòèëè àáçàöåâ";
        Text[ polish ] = "Style akapitów";
        Text[ japanese ] = "’i—޽À²Ù(~S)";
        Text[ chinese_traditional ] = "¬q¸¨¼Ë¦¡(~S)";
        Text[ arabic ] = "ÃäãÇØ ÝÞÑÉ";
        Text[ greek ] = "Ðñüôõð~á ðáñáãñÜöïõ";
        Text[ korean ] = "´Ü¶ô À¯Çü(~S)";
        Text[ turkish ] = "Paragraf þablonlarý";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_PARALAY
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 133 , 25 ) ;
        Size = MAP_APPFONT ( 110 , 81 ) ;
        TabStop = TRUE ;
        Sort = TRUE ;
        AutoHScroll = TRUE ;
    };
    PushButton BT_STD
    {
        Pos = MAP_APPFONT ( 32 , 112 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        Text = "Sta~ndard" ;
        Text [ ENGLISH ] = "Sta~ndard" ;
        TabStop = TRUE ;
        Text [ dutch ] = "Stan~daard" ;
        Text [ english_us ] = "~Default" ;
        Text [ italian ] = "Sta~ndard" ;
        Text [ spanish ] = "~Predeterminado" ;
        Text [ french ] = "~Standard" ;
        Text [ swedish ] = "Sta~ndard" ;
        Text [ danish ] = "Standard" ;
        Text [ portuguese ] = "~Padrão" ;
        Text [ portuguese_brazilian ] = "Sta~ndard" ;
        Text[ chinese_simplified ] = "±ê×¼(~D)";
        Text[ russian ] = "Ñòàíäàðò";
        Text[ polish ] = "Standard";
        Text[ japanese ] = "•W€(~D)";
        Text[ language_user1 ] = " ";
        Text[ chinese_traditional ] = "¼Ð·Ç(~D)";
        Text[ arabic ] = "ÇÝÊÑÇÖí";
        Text[ greek ] = "ÐñïåðéëïãÞ";
        Text[ korean ] = "±âº»°ª(~D)";
        Text[ turkish ] = "Standart";
    };
    PushButton BT_ASSIGN
    {
        Pos = MAP_APPFONT ( 133 , 112 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        Text = "<- ~Zuordnen" ;
        Text [ ENGLISH ] = "<- ~Assign" ;
        Text [ norwegian ] = "<- ~Tilordne" ;
        Text [ italian ] = "<- ~Assegna" ;
        Text [ portuguese_brazilian ] = "<- ~Designar" ;
        Text [ portuguese ] = "<- ~Atribuir" ;
        Text [ finnish ] = "<- ~Liitä" ;
        Text [ danish ] = "<- Tildel" ;
        Text [ french ] = "<- Assigner" ;
        Text [ swedish ] = "<- Ti~lldela" ;
        Text [ dutch ] = "<- ~Toewijzen" ;
        Text [ spanish ] = "<- ~Asignar" ;
        Text [ english_us ] = "<- ~Assign" ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "<- Ö¸¶¨(~A)";
        Text[ russian ] = "<- Í~àçíà÷èòü";
        Text[ polish ] = "<- Przypis~z";
        Text[ japanese ] = "<- ”z’u(~A)";
        Text[ chinese_traditional ] = "<- «ü©w(~A)";
        Text[ arabic ] = "ÊÚííä<- ";
        Text[ greek ] = "<- ÊáôÜôáîç";
        Text[ korean ] = "<- ÁöÁ¤(~A)";
        Text[ turkish ] = "<- Ata";
        Text[ language_user1 ] = " ";
    };
    PushButton BT_EDIT_STYLE
    {
        Pos = MAP_APPFONT ( 186 , 112 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        Text = "~Bearbeiten" ;
        Text [ ENGLISH ] = "~Edit" ;
        TabStop = TRUE ;
        Text[ english_us ] = "~Edit";
        Text[ portuguese ] = "~Editar";
        Text[ russian ] = "~Ïðàâêà";
        Text[ dutch ] = "~Bewerken";
        Text[ french ] = "Modifier";
        Text[ spanish ] = "~Editar";
        Text[ italian ] = "~Modifica";
        Text[ danish ] = "Rediger";
        Text[ swedish ] = "~Redigera";
        Text[ polish ] = "~Edytuj";
        Text[ portuguese_brazilian ] = "~Edit";
        Text[ japanese ] = "•ҏW(~E)";
        Text[ chinese_simplified ] = "±à¼­(~E)";
        Text[ chinese_traditional ] = "½s¿è(~E)";
        Text[ arabic ] = "ÊÍÑíÑ";
        Text[ greek ] = "Åðåîåñãáóßá";
        Text[ korean ] = "ÆíÁý(~E)";
        Text[ turkish ] = "Düzenle";
        Text[ language_user1 ] = " ";
    };
    GroupBox GB_FORMAT
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 248 , 129 ) ;
        Text = "Zuordnung" ;
        Text [ ENGLISH ] = "Assignment" ;
        Text[ english_us ] = "Assignment";
        Text[ portuguese ] = "Atribuição";
        Text[ russian ] = "Íàçíà÷åíèå";
        Text[ dutch ] = "Toewijzing";
        Text[ french ] = "Assignation";
        Text[ spanish ] = "Asignación";
        Text[ italian ] = "Assegnazione";
        Text[ danish ] = "Tildel";
        Text[ swedish ] = "Tilldelning";
        Text[ polish ] = "Przypisanie";
        Text[ portuguese_brazilian ] = "Layout";
        Text[ japanese ] = "”z’u";
        Text[ chinese_simplified ] = "Ö¸¶¨";
        Text[ chinese_traditional ] = "«ü©w";
        Text[ arabic ] = "ÊÚííä";
        Text[ greek ] = "Áíôéóôïß÷éóç";
        Text[ korean ] = "ÁöÁ¤";
        Text[ turkish ] = "Atama";
        Text[ language_user1 ] = " ";
    };
};
ModalDialog DLG_ADD_IDX_STYLES
{
    HelpId = HID_DLG_ADD_IDX_STYLES;
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 350 , 200 ) ;
    Text = "Vorlage zuweisen" ;
    Text [ ENGLISH ] = "Assign styles" ;
    Moveable = TRUE ;
    Control TR_HEADER
    {
        Pos = MAP_APPFONT ( 12 , 15 ) ;
        Size = MAP_APPFONT ( 276 , 164 ) ;
        Border = TRUE;
        TabStop = TRUE;
        Window HB_STYLES
        {
            Pos = MAP_APPFONT ( 0 , 0 ) ;
            Size = MAP_APPFONT ( 276 , 20 ) ;
        };
        Control TLB_STYLES
        {
            Pos = MAP_APPFONT ( 0 , 20 ) ;
            Size = MAP_APPFONT ( 276 , 132 ) ;
            Border = TRUE;
        };
    };
    PushButton PB_LEFT
    {
        Pos = MAP_APPFONT ( 12 , 182 ) ;
        Size = MAP_APPFONT ( 50 , 12 ) ;
        Text = "~<<";
    };
    PushButton PB_RIGHT
    {
        Pos = MAP_APPFONT ( 65 , 182 ) ;
        Size = MAP_APPFONT ( 50 , 12 ) ;
        Text = "~>>";
    };
    GroupBox GB_STYLES
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 288 , 194 ) ;
        Text = "~Vorlagen";
        Text [English] = "Styles";
        Text[ english_us ] = "Styl~es";
        Text[ portuguese ] = "E~stilos";
        Text[ russian ] = "Ñòèëè";
        Text[ greek ] = "Ðñüôõðá";
        Text[ dutch ] = "~Opmaakprofielen";
        Text[ french ] = "~Styles";
        Text[ spanish ] = "~Estilos";
        Text[ italian ] = "~Modelli";
        Text[ danish ] = "Typografi";
        Text[ swedish ] = "Mallar";
        Text[ polish ] = "Szablony";
        Text[ portuguese_brazilian ] = "Styles";
        Text[ japanese ] = "½À²Ù(~E)";
        Text[ korean ] = "À¯Çü(~E)";
        Text[ chinese_simplified ] = "Ñùʽ(~E)";
        Text[ chinese_traditional ] = "¼Ë¦¡(~E)";
        Text[ arabic ] = "ÃäãÇØ";
        Text[ turkish ] = "Þablonlar";
        Text[ language_user1 ] = " ";
    };
    OKButton PB_OK
    {
        Pos = MAP_APPFONT ( 297 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        DefButton = TRUE ;
    };
    CancelButton PB_CANCEL
    {
        Pos = MAP_APPFONT ( 297 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    HelpButton PB_HELP
    {
        Pos = MAP_APPFONT ( 297 , 40 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    String  ST_HB_FIRST
    {
        Text = "Nicht zugewiesen";
        Text [English] = "Not applied";
        Text[ english_us ] = "Not applied";
        Text[ portuguese ] = "Não aplicado";
        Text[ russian ] = "Íå ïðèìåíåíî";
        Text[ greek ] = "Äåí Ý÷åé ãßíåé áíôéóôïß÷éóç";
        Text[ dutch ] = "Niet toegewezen";
        Text[ french ] = "Non assigné";
        Text[ spanish ] = "No asignado";
        Text[ italian ] = "Non applicato";
        Text[ danish ] = "Ikke tildelt";
        Text[ swedish ] = "Inte tilldelat";
        Text[ polish ] = "Nie przypisany";
        Text[ portuguese_brazilian ] = "Not applied";
        Text[ japanese ] = "“K—p‚µ‚È‚¢";
        Text[ korean ] = "Àû¿ëµÇÁö ¾Ê¾Ò½À´Ï´Ù.";
        Text[ chinese_simplified ] = "²»ÒªÖ¸¶¨";
        Text[ chinese_traditional ] = "¤£«ü©w";
        Text[ arabic ] = "ÚÏã ÇáÊØÈíÞ";
        Text[ turkish ] = "Uygulanmadý";
        Text[ language_user1 ] = " ";
    };
    Text[ english_us ] = "Assign Styles";
    Text[ portuguese ] = "Aplicar estilos";
    Text[ russian ] = "Íàçíà÷èòü ñòèëè";
    Text[ greek ] = "Áíôéóôïß÷éóç ðñüôõðïõ";
    Text[ dutch ] = "Opmaakprofiel toewijzen";
    Text[ french ] = "Assigner le style";
    Text[ spanish ] = "Asignar estilos";
    Text[ italian ] = "Assegna modello";
    Text[ danish ] = "Tildel typografi";
    Text[ swedish ] = "Tilldela mall";
    Text[ polish ] = "Przypisz styl";
    Text[ portuguese_brazilian ] = "Assign styles";
    Text[ japanese ] = "½À²Ù‚Ì“K—p";
    Text[ korean ] = "ÁöÁ¤ À¯Çü";
    Text[ chinese_simplified ] = "Ö¸¶¨Ñùʽ";
    Text[ chinese_traditional ] = "«ü©w¼Ë¦¡";
    Text[ arabic ] = "ÊÚííä ÇáÃäãÇØ";
    Text[ turkish ] = "Þablon ata";
    Text[ language_user1 ] = " ";
};
/*-----------------------------------------------------------

-----------------------------------------------------------*/
ModalDialog DLG_CREATE_AUTOMARK
{
    HelpId = HID_DLG_CREATE_AUTOMARK;
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 350 , 200 ) ;
    Text = "Konkordanzdatei bearbeiten" ;
    Text [ ENGLISH ] = "Edit concordance file" ;
    Moveable = TRUE ;
    OKButton PB_OK
    {
        Pos = MAP_APPFONT ( 297 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        DefButton = TRUE ;
    };
    CancelButton PB_CANCEL
    {
        Pos = MAP_APPFONT ( 297 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    HelpButton PB_HELP
    {
        Pos = MAP_APPFONT ( 297 , 40 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    Control BB_ENTRIES
    {
        Pos = MAP_APPFONT ( 12 , 18 ) ;
        Size = MAP_APPFONT ( 276 , 175 ) ;
        TabStop = TRUE ;
        Border = TRUE;
        String ST_SEARCH
        {
            Text = "Suchbegriff" ;
            Text [ ENGLISH ] = "Search entry" ;
            Text[ english_us ] = "Search term";
            Text[ portuguese ] = "Expressão procurada";
            Text[ russian ] = "Èñêîìîå ïîíÿòèå";
            Text[ greek ] = "¼ñïò áíáæÞôçóçò";
            Text[ dutch ] = "Zoekbegrip";
            Text[ french ] = "Élément recherché";
            Text[ spanish ] = "Término de búsqueda";
            Text[ italian ] = "Voce cercata";
            Text[ danish ] = "Søgeord";
            Text[ swedish ] = "Sökord";
            Text[ polish ] = "Szukany wyraz";
            Text[ portuguese_brazilian ] = "Search entry";
            Text[ japanese ] = "ŒŸõ·°";
            Text[ korean ] = "Á¶È¸ ¿ë¾î";
            Text[ chinese_simplified ] = "ËÑѰÌõÄ¿";
            Text[ chinese_traditional ] = "·j´M±ø¥Ø";
            Text[ arabic ] = "ãÕØáÍ ÇáÈÍË";
            Text[ turkish ] = "Arama terimi";
        };
        String ST_ALTERNATIVE
        {
            Text = "Alternativeintrag" ;
            Text [ ENGLISH ] = "Alternative entry" ;
            Text[ english_us ] = "Alternative entry";
            Text[ portuguese ] = "Entrada alternativa";
            Text[ russian ] = "Àëüòåðíàòèâíûé ýëåìåíò";
            Text[ greek ] = "ÅíáëëáêôéêÞ åããñáöÞ";
            Text[ dutch ] = "Alternatief item";
            Text[ french ] = "Entrée de remplacement";
            Text[ spanish ] = "Entrada alternativa";
            Text[ italian ] = "Voce alternativa";
            Text[ danish ] = "Alternativt element";
            Text[ swedish ] = "Alternativpost";
            Text[ polish ] = "Wpis alternatywny";
            Text[ portuguese_brazilian ] = "Alternative entry";
            Text[ japanese ] = "‚Ç‚¿‚ç‚©ˆê•û‚ð‘I‚Ô";
            Text[ korean ] = "´ëü Ç׸ñ";
            Text[ chinese_simplified ] = "Ñ¡ÔñÌõÄ¿";
            Text[ chinese_traditional ] = "¨ä¥¦±ø¥Ø";
            Text[ arabic ] = "ÅÏÎÇá ÈÏíá";
            Text[ turkish ] = "Alternatif giriþ";
        };
        String ST_PRIMKEY
        {
            Text = "1. Schlüssel" ;
            Text [ ENGLISH ] = "1. Key" ;
            Text[ english_us ] = "1st key";
            Text[ portuguese ] = "1ª chave";
            Text[ russian ] = "1-é êëþ÷";
            Text[ greek ] = "1. Êëåéäß";
            Text[ dutch ] = "1e sleutel";
            Text[ french ] = "1re clé";
            Text[ spanish ] = "1era clave";
            Text[ italian ] = "1° criterio";
            Text[ danish ] = "1. nøgle";
            Text[ swedish ] = "1 nyckel";
            Text[ polish ] = "1 klucz";
            Text[ portuguese_brazilian ] = "1. Key";
            Text[ japanese ] = "1. ·°";
            Text[ korean ] = "1.Ű";
            Text[ chinese_simplified ] = "1. Ö÷¹Ø¼ü×Ö";
            Text[ chinese_traditional ] = "²Ä¤@­Ó¥DÃöÁä¦r";
            Text[ arabic ] = "ÇáãÝÊÇÍ ÇáÃæá";
            Text[ turkish ] = "1. Anahtar";
        };
        String ST_SECKEY
        {
            Text = "2. Schlüssel" ;
            Text [ ENGLISH ] = "2. Key" ;
            Text[ english_us ] = "2nd key";
            Text[ portuguese ] = "2ª chave";
            Text[ russian ] = "2-é êëþ÷";
            Text[ greek ] = "2. Êëåéäß";
            Text[ dutch ] = "2e sleutel";
            Text[ french ] = "2ème clé";
            Text[ spanish ] = "2da llave";
            Text[ italian ] = "2° criterio";
            Text[ danish ] = "2. nøgle";
            Text[ swedish ] = "2 nyckel";
            Text[ polish ] = "2 klucz";
            Text[ portuguese_brazilian ] = "2. Key";
            Text[ japanese ] = "2. ·°";
            Text[ korean ] = "2.Ű";
            Text[ chinese_simplified ] = "2. Ö÷¹Ø¼ü×Ö";
            Text[ chinese_traditional ] = "²Ä¤G­Ó¥DÃöÁä¦r";
            Text[ arabic ] = "ÇáãÝÊÇÍ ÇáËÇäí";
            Text[ turkish ] = "2. Anahtar";
        };
        String ST_COMMENT
        {
            Text = "Kommentar" ;
            Text [ ENGLISH ] = "Comment" ;
            Text[ english_us ] = "Comment";
            Text[ portuguese ] = "Comentário";
            Text[ russian ] = "Êîììåíòàðèé";
            Text[ greek ] = "Ó÷üëéï";
            Text[ dutch ] = "Commentaar";
            Text[ french ] = "Commentaire";
            Text[ spanish ] = "Comentario";
            Text[ italian ] = "Commento";
            Text[ danish ] = "Kommentar";
            Text[ swedish ] = "Kommentar";
            Text[ polish ] = "Komentarz";
            Text[ portuguese_brazilian ] = "Comment";
            Text[ japanese ] = "ºÒÝÄ";
            Text[ korean ] = "¸Þ¸ð";
            Text[ chinese_simplified ] = "×¢½â";
            Text[ chinese_traditional ] = "ª`¸Ñ";
            Text[ arabic ] = "ÊÚáíÞ";
            Text[ turkish ] = "Açýklama";
        };
        String ST_CASESENSITIVE
        {
            Text = "Exakt" ;
            Text [ ENGLISH ] = "Match case" ;
            Text[ english_us ] = "Match case";
            Text[ portuguese ] = "Respeitar maiúsc./minúsculas";
            Text[ russian ] = "Òî÷íûé ïîèñê";
            Text[ greek ] = "Áêñéâþò";
            Text[ dutch ] = "Exact";
            Text[ french ] = "Respecter la casse";
            Text[ spanish ] = "Coincidencia exacta";
            Text[ italian ] = "Ricerca esatta";
            Text[ danish ] = "Eksakt";
            Text[ swedish ] = "Exakt";
            Text[ polish ] = "Dok³adnie";
            Text[ portuguese_brazilian ] = "Match case";
            Text[ japanese ] = "Š®‘S‚É“¯ˆê";
            Text[ korean ] = "´ë/¼Ò¹®ÀÚ ±¸ºÐ";
            Text[ chinese_simplified ] = "¾«È·";
            Text[ chinese_traditional ] = "ºëÚÌ";
            Text[ arabic ] = "ãØÇÈÞÉ ÍÇáÉ ÇáÃÍÑÝ";
            Text[ turkish ] = "Büyük/küçük harf duyarlý";
        };
        String ST_WORDONLY
        {
            Text = "Ganze Wörter" ;
            Text [ ENGLISH ] = "Whole words" ;
            Text[ english_us ] = "Word only";
            Text[ portuguese ] = "Palavras inteiras";
            Text[ russian ] = "Âñå ñëîâî";
            Text[ greek ] = "Ïëüêëçñåò ëÝîåéò";
            Text[ dutch ] = "Hele woorden";
            Text[ french ] = "Mots entiers";
            Text[ spanish ] = "Palabras completas";
            Text[ italian ] = "Parole intere";
            Text[ danish ] = "Hele ord";
            Text[ swedish ] = "Hela ord";
            Text[ polish ] = "Ca³e s³owa";
            Text[ portuguese_brazilian ] = "Whole words";
            Text[ japanese ] = "Š®‘S‚È’PŒê";
            Text[ korean ] = "´Ü¾î ¸¸";
            Text[ chinese_simplified ] = "Õû¸ö´Ê";
            Text[ chinese_traditional ] = "§¹¾ãªº¦rµü";
            Text[ arabic ] = "ßáãÇÊ ßÇãáÉ";
            Text[ turkish ] = "Tam sözcükler";
        };
        String ST_TRUE
        {
            Text = "Ja" ;
            Text [ ENGLISH ] = "Yes" ;
            Text[ english_us ] = "Yes";
            Text[ portuguese ] = "Sim";
            Text[ russian ] = "Äà";
            Text[ greek ] = "Íáé";
            Text[ dutch ] = "Ja";
            Text[ french ] = "Oui";
            Text[ spanish ] = "Sí";
            Text[ italian ] = "Sì";
            Text[ danish ] = "Ja";
            Text[ swedish ] = "Ja";
            Text[ polish ] = "Tak";
            Text[ portuguese_brazilian ] = "Yes";
            Text[ japanese ] = "‚Í‚¢";
            Text[ korean ] = "¿¹";
            Text[ chinese_simplified ] = "ÊÇ";
            Text[ chinese_traditional ] = "¬O";
            Text[ arabic ] = "äÚã";
            Text[ turkish ] = "Evet";
        };
        String ST_FALSE
        {
            Text = "Nein" ;
            Text [ ENGLISH ] = "No" ;
            Text[ english_us ] = "No";
            Text[ portuguese ] = "Não";
            Text[ russian ] = "Íåò";
            Text[ greek ] = "¼÷é";
            Text[ dutch ] = "Nee";
            Text[ french ] = "Non";
            Text[ spanish ] = "No";
            Text[ italian ] = "No";
            Text[ danish ] = "Nej";
            Text[ swedish ] = "Nej";
            Text[ polish ] = "Nie";
            Text[ portuguese_brazilian ] = "No";
            Text[ japanese ] = "‚¢‚¢‚¦";
            Text[ korean ] = "¾Æ´Ï¿À";
            Text[ chinese_simplified ] = "·ñ";
            Text[ chinese_traditional ] = "§_";
            Text[ arabic ] = "áÇ";
            Text[ turkish ] = "Hayýr";
        };
    };
    GroupBox        GB_ENTRIES
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 288, 194 ) ;
        Text = "Einträge" ;
        Text [ ENGLISH ] = "Entries" ;
        Text[ english_us ] = "Entries";
        Text[ portuguese ] = "Entradas";
        Text[ russian ] = "Ýëåìåíòû";
        Text[ greek ] = "ÅããñáöÝò";
        Text[ dutch ] = "Items";
        Text[ french ] = "Entrées";
        Text[ spanish ] = "Entradas";
        Text[ italian ] = "Voci";
        Text[ danish ] = "Elementer";
        Text[ swedish ] = "Poster";
        Text[ polish ] = "Wpisy";
        Text[ portuguese_brazilian ] = "Entries";
        Text[ japanese ] = "€–Ú";
        Text[ korean ] = "Ç׸ñ";
        Text[ chinese_simplified ] = "ÌõÄ¿";
        Text[ chinese_traditional ] = "±ø¥Ø";
        Text[ arabic ] = "ÅÏÎÇáÇÊ";
        Text[ turkish ] = "Giriþler";
    };
    Text[ english_us ] = "Edit Concordance File";
    Text[ portuguese ] = "Editar ficheiro de concordância";
    Text[ russian ] = "Ïðàâêà ôàéëà-êîíêîðäàíñà";
    Text[ greek ] = "Åðåîåñãáóßá áñ÷åßïõ óõìöùíßáò";
    Text[ dutch ] = "Concordantiebestand bewerken";
    Text[ french ] = "Édition du fichier de concordance";
    Text[ spanish ] = "Editar archivo de concordancia";
    Text[ italian ] = "Modifica file di concordanza";
    Text[ danish ] = "Rediger konkordansfil";
    Text[ swedish ] = "Redigera konkordansfil";
    Text[ polish ] = "Edytuj plik konkordancji";
    Text[ portuguese_brazilian ] = "Edit concordance file";
    Text[ japanese ] = "—pŒêõˆøÌ§²Ù‚̕ҏW";
    Text[ korean ] = "ÀÏÄ¡ÇÏ´Â ÆÄÀÏ ÆíÁý";
    Text[ chinese_simplified ] = "±à¼­Óï»ãË÷ÒýÎļþ";
    Text[ chinese_traditional ] = "½s¿è»y¶×¯Á¤ÞÀÉ®×";
    Text[ arabic ] = "ÊÍÑíÑ ãáÝ ÝåÑÓ ÃÈÌÏí";
    Text[ turkish ] = "Uyumluluk dosyasýný düzenle";
};

diff --git a/sw/source/ui/index/idxmrk.cxx b/sw/source/ui/index/idxmrk.cxx
new file mode 100644
index 0000000..90d4588
--- /dev/null
+++ b/sw/source/ui/index/idxmrk.cxx
@@ -0,0 +1,1892 @@
/*************************************************************************
 *
 *  $RCSfile: idxmrk.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:44 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _UNOTOOLS_PROCESSFACTORY_HXX_
#include <unotools/processfactory.hxx>
#endif
#ifndef _COM_SUN_STAR_LANG_XMULTISERVICEFACTORY_HPP_
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_PROPERTYVALUE_HPP_
#include <com/sun/star/beans/PropertyValue.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
#include <com/sun/star/beans/XPropertySet.hpp>
#endif

#include "helpid.h"
#define _SVSTDARR_STRINGSSORT
#include <svtools/svstdarr.hxx>

#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _TXTCMP_HXX //autogen
#include <svtools/txtcmp.hxx>
#endif
#ifndef _SFXVIEWFRM_HXX
#include <sfx2/viewfrm.hxx>
#endif
#ifndef _IDXMRK_HXX
#include <idxmrk.hxx>
#endif
#ifndef _TXTTXMRK_HXX
#include <txttxmrk.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _TOXMGR_HXX
#include <toxmgr.hxx>
#endif
#ifndef _MULTMRK_HXX
#include <multmrk.hxx>
#endif
#ifndef _SWUNDO_HXX
#include <swundo.hxx>                   // fuer Undo-Ids
#endif

#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _INDEX_HRC
#include <index.hrc>
#endif
#ifndef _IDXMRK_HRC
#include <idxmrk.hrc>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _FLDMGR_HXX
#include <fldmgr.hxx>
#endif
#ifndef _FLDBAS_HXX
#include <fldbas.hxx>
#endif
#include <utlui.hrc>
#ifndef _SWCONT_HXX
#include <swcont.hxx>
#endif
#ifndef _AUTHFLD_HXX
#include <authfld.hxx>
#endif

#define POS_CONTENT 0
#define POS_INDEX   1
#define POS_USER    2

static sal_uInt16 nTypePos = 1; // TOX_INDEX as standard
static sal_uInt16 nKey1Pos = USHRT_MAX;

static sal_uInt16 nKey2Pos = USHRT_MAX;

using namespace ::rtl;
using namespace ::utl;
using namespace ::com::sun::star;
#define C2U(cChar) OUString::createFromAscii(cChar)
/*--------------------------------------------------------------------
     Beschreibung:  Dialog zum Einfuegen einer Verzeichnismarkierung
 --------------------------------------------------------------------*/
SwIndexMarkDlg::SwIndexMarkDlg(Window *pParent,
                               sal_Bool bNewDlg,
                               const ResId& rResId ) :
      Window(pParent, rResId),
    bDel(sal_False),
    bNewMark(bNewDlg),
    pTOXMgr(0),
    pSh(0),
    aOKBT(this,     SW_RES(BT_OK    )),
    aCancelBT(this, SW_RES(BT_CANCEL )),
    aHelpBT(this,   SW_RES(BT_HELP   )),
    aDelBT(this,    SW_RES(BT_DEL   )),
    aNewBT(this,    SW_RES(BT_NEW   )),
    aPrevBT(this,   SW_RES(BT_PREV  )),
    aPrevSameBT(this,SW_RES(BT_PREVSAME)),
    aNextBT(this,   SW_RES(BT_NXT   )),
    aNextSameBT(this,SW_RES(BT_NXTSAME)),
    aTypeFT (this,  SW_RES(LBL_INDEX    )),
    aTypeDCB(this,  SW_RES(DCB_INDEX    )),
    aEntryFT(this,  SW_RES(LBL_ENTRY    )),
    aEntryED(this,  SW_RES(SL_ENTRY )),
    aKeyFT(this,    SW_RES(LBL_KEY  )),
    aKeyDCB(this,   SW_RES(DCB_KEY  )),
    aKey2FT(this,   SW_RES(LBL_KEY2 )),
    aKey2DCB(this,  SW_RES(DCB_KEY2 )),
    aLevelFT(this,  SW_RES(LBL_LEVEL    )),
    aLevelED(this,  SW_RES(SL_LEVEL )),
    aMainEntryCB(this, SW_RES(CB_MAIN_ENTRY )),
    aApplyToAllCB(this,SW_RES(CB_APPLY_TO_ALL)),
    aSearchCaseSensitiveCB(this,    SW_RES(CB_CASESENSITIVE )),
    aSearchCaseWordOnlyCB(this,     SW_RES(CB_WORDONLY      )),
    aIndexGB(this,  SW_RES(GB_INDEX )),
    bSelected(sal_False)
{
    SetStyle(GetStyle()|WB_DIALOGCONTROL);
    FreeResource();
    aOKBT           .SetHelpId(HID_INSERT_IDX_MRK_OK        );
    aCancelBT       .SetHelpId(HID_INSERT_IDX_MRK_CLOSE     );
    aDelBT          .SetHelpId(HID_INSERT_IDX_MRK_DELETE    );
    aNewBT          .SetHelpId(HID_INSERT_IDX_MRK_NEW       );
    aPrevBT         .SetHelpId(HID_INSERT_IDX_MRK_PREV      );
    aPrevSameBT     .SetHelpId(HID_INSERT_IDX_MRK_PREV_SAME );
    aNextBT         .SetHelpId(HID_INSERT_IDX_MRK_NEXT      );
    aNextSameBT     .SetHelpId(HID_INSERT_IDX_MRK_NEXT_SAME );
    aTypeDCB        .SetHelpId(HID_INSERT_IDX_MRK_TYPE      );
    aEntryED        .SetHelpId(HID_INSERT_IDX_MRK_ENTRY     );
    aKeyDCB         .SetHelpId(HID_INSERT_IDX_MRK_PRIM_KEY  );
    aKey2DCB        .SetHelpId(HID_INSERT_IDX_MRK_SEC_KEY   );
    aLevelED        .SetHelpId(HID_INSERT_IDX_MRK_LEVEL     );
    aMainEntryCB    .SetHelpId(HID_INSERT_IDX_MRK_MAIN_ENTRY);
    aApplyToAllCB   .SetHelpId(HID_INSERT_IDX_MRK_APPLY_ALL );
    aSearchCaseSensitiveCB.SetHelpId(   HID_INSERT_IDX_MRK_SRCH_CASESENSITIVE   );
    aSearchCaseWordOnlyCB.SetHelpId(    HID_INSERT_IDX_MRK_SRCH_WORDONLY        );


    GetParent()->SetText( SW_RESSTR( bNewMark ? STR_IDXMRK_INSERT : STR_IDXMRK_EDIT));

    aDelBT.SetClickHdl(LINK(this,SwIndexMarkDlg,        DelHdl));
    aPrevBT.SetClickHdl(LINK(this,SwIndexMarkDlg,       PrevHdl));
    aPrevSameBT.SetClickHdl(LINK(this,SwIndexMarkDlg,   PrevSameHdl));
    aNextBT.SetClickHdl(LINK(this,SwIndexMarkDlg,       NextHdl));
    aNextSameBT.SetClickHdl(LINK(this,SwIndexMarkDlg,   NextSameHdl));
    //aTypeDCB.SetModifyHdl(LINK(this,SwIndexMarkDlg,   ModifyHdl));
    aTypeDCB.SetSelectHdl(LINK(this,SwIndexMarkDlg,     ModifyHdl));
    aKeyDCB.SetModifyHdl(LINK(this,SwIndexMarkDlg,      KeyDCBModifyHdl));
    aOKBT.SetClickHdl(LINK(this,SwIndexMarkDlg,         InsertHdl));
    aCancelBT.SetClickHdl(LINK(this,SwIndexMarkDlg,     CloseHdl));
    aEntryED.SetModifyHdl(LINK(this,SwIndexMarkDlg,     ModifyHdl));
    aNewBT.SetClickHdl(LINK(this, SwIndexMarkDlg,       NewUserIdxHdl));
    aApplyToAllCB.SetClickHdl(LINK(this, SwIndexMarkDlg, SearchTypeHdl));

    if(bNewMark)
    {
        aDelBT.Hide();
        ImageList aTempList(SW_RES(IMG_NAVI_ENTRYBMP));
        aNewBT.SetImage(aTempList.GetImage(SID_SW_START + CONTENT_TYPE_INDEX));
    }
    else
    {
        aNewBT.Hide();
        OKButton aTmp(this, WB_HIDE);
        aOKBT.SetText( aTmp.GetText() );
    }
}

/*--------------------------------------------------------------------
     Beschreibung:  Controls neu initialisieren mit der aktuellen
                    Markierung
 --------------------------------------------------------------------*/


void SwIndexMarkDlg::InitControls()
{
    DBG_ASSERT(pSh && pTOXMgr, "Shell nicht da?")
    // Inhalts-Verzeichnis
    const SwTOXType* pType = pTOXMgr->GetTOXType(TOX_CONTENT, 0);
    ASSERT(pType, "Kein Verzeichnistyp !!");
    String sTmpTypeSelection;
    if(aTypeDCB.GetSelectEntryCount())
        sTmpTypeSelection = aTypeDCB.GetSelectEntry();
    aTypeDCB.Clear();
    aTypeDCB.InsertEntry(pType->GetTypeName());

    // Stichwort-Verzeichnis
    pType = pTOXMgr->GetTOXType(TOX_INDEX, 0);
    ASSERT(pType, "Kein Verzeichnistyp !!");
    aTypeDCB.InsertEntry(pType->GetTypeName());

    // Benutzerverzeichnisse
    sal_uInt16 nCount = pSh->GetTOXTypeCount(TOX_USER);
    for(sal_uInt16 i=0; i< nCount; ++i)
        aTypeDCB.InsertEntry( pSh->GetTOXType(TOX_USER, i)->GetTypeName() );

    // KeyWords Primary einlesen
    SvStringsSort aArr;
    nCount = pSh->GetTOIKeys( TOI_PRIMARY, aArr );
    for(i=0; i < nCount; ++i)
        aKeyDCB.InsertEntry( *aArr[ i ] );

    // KeyWords Secondary einlesen
    nCount = pSh->GetTOIKeys( TOI_SECONDARY, aArr );
    for(i=0; i < nCount; ++i)
        aKey2DCB.InsertEntry( *aArr[ i ] );

    // Aktueller Eintrag
    const SwTOXMark* pMark = pTOXMgr->GetCurTOXMark();
    if( pMark && !bNewMark)
    {
        // Controls-Handling

        // nur wenn mehr als eins vorhanden
        // wenn gleich landet es auf dem gleichen Eintrag
        pSh->SttCrsrMove();

        const SwTOXMark* pMoveMark;
        sal_Bool bShow = sal_False;

        pMoveMark = &pSh->GotoTOXMark( *pMark, TOX_PRV );
        if( pMoveMark != pMark )
            pSh->GotoTOXMark( *pMoveMark, TOX_NXT ), bShow = sal_True;
        aPrevBT.Enable( pMoveMark != pMark );
        pMoveMark = &pSh->GotoTOXMark( *pMark, TOX_NXT );
        if( pMoveMark != pMark )
            pSh->GotoTOXMark( *pMoveMark, TOX_PRV ), bShow = sal_True;
        aNextBT.Enable( pMoveMark != pMark );
        if( bShow )
        {
            aPrevBT.Show();
            aNextBT.Show();
            bShow = sal_False;
        }

        pMoveMark = &pSh->GotoTOXMark( *pMark, TOX_SAME_PRV );
        if( pMoveMark != pMark )
            pSh->GotoTOXMark( *pMoveMark, TOX_SAME_NXT ), bShow = sal_True;
        aPrevSameBT.Enable( pMoveMark != pMark );
        pMoveMark = &pSh->GotoTOXMark( *pMark, TOX_SAME_NXT );
        if( pMoveMark != pMark )
            pSh->GotoTOXMark( *pMoveMark, TOX_SAME_PRV ), bShow = sal_True;
        aNextSameBT.Enable( pMoveMark != pMark );
        if( bShow )
        {
            aNextSameBT.Show();
            aPrevSameBT.Show();
        }
        pSh->EndCrsrMove();

        aTypeFT.Show();

        aTypeDCB.Enable(sal_False);
        aTypeFT.Enable(sal_False);

        UpdateDialog();
    }
    else
    {   // aktuelle Selektion (1.Element) anzeigen  ????
        sal_uInt16 nCnt = pSh->GetCrsrCnt();
        if (nCnt < 2)
        {
            bSelected = !pSh->HasSelection();
            aOrgStr = pSh->GetView().GetSelectionTextParam(sal_True, sal_False, sal_True);
            aEntryED.SetText(aOrgStr);

            //alle gleichen Eintraege aufzunehmen darf nur im Body und auch da nur
            //bei vorhandener einfacher Selektion erlaubt werden
            const sal_uInt16 nFrmType = pSh->GetFrmType(0,sal_True);
            aApplyToAllCB.Show();
            aSearchCaseSensitiveCB.Show();
            aSearchCaseWordOnlyCB.Show();
            aApplyToAllCB.Enable(0 != aOrgStr.Len() &&
                0 == (nFrmType & ( FRMTYPE_HEADER | FRMTYPE_FOOTER | FRMTYPE_FLY_ANY )));
            SearchTypeHdl(&aApplyToAllCB);
        }

        // Verzeichnistyp ist default
        if( sTmpTypeSelection.Len() &&
            LISTBOX_ENTRY_NOTFOUND != aTypeDCB.GetEntryPos( sTmpTypeSelection ) )
            aTypeDCB.SelectEntry(sTmpTypeSelection);
        else
            aTypeDCB.SelectEntry(aTypeDCB.GetEntry(nTypePos));
        ModifyHdl(&aTypeDCB);
    }
}
/* -----------------07.09.99 10:43-------------------
    Change the content of aEntryED if text is selected
 --------------------------------------------------*/

void    SwIndexMarkDlg::Activate()
{
    // aktuelle Selektion (1.Element) anzeigen  ????
    if(bNewMark)
    {
        sal_uInt16 nCnt = pSh->GetCrsrCnt();
        if (nCnt < 2)
        {
            bSelected = !pSh->HasSelection();
            aOrgStr = pSh->GetView().GetSelectionTextParam(sal_True, sal_False, sal_True);
            aEntryED.SetText(aOrgStr);

            //alle gleichen Eintraege aufzunehmen darf nur im Body und auch da nur
            //bei vorhandener einfacher Selektion erlaubt werden
            const sal_uInt16 nFrmType = pSh->GetFrmType(0,sal_True);
            aApplyToAllCB.Show();
            aSearchCaseSensitiveCB.Show();
            aSearchCaseWordOnlyCB.Show();
            aApplyToAllCB.Enable(0 != aOrgStr.Len() &&
                0 == (nFrmType & ( FRMTYPE_HEADER | FRMTYPE_FOOTER | FRMTYPE_FLY_ANY )));
            SearchTypeHdl(&aApplyToAllCB);
        }
        ModifyHdl(&aTypeDCB);
    }
}

/*--------------------------------------------------------------------
     Beschreibung:  Ok-Button auswerten
 --------------------------------------------------------------------*/
void SwIndexMarkDlg::Apply()
{
    InsertUpdate();
    if(bSelected)
        pSh->ResetSelect(0, sal_False);
}

/*--------------------------------------------------------------------
    Beschreibung: Aenderungen uebernehmen
 --------------------------------------------------------------------*/


void SwIndexMarkDlg::InsertUpdate()
{
    pSh->StartUndo(UNDO_INSATTR);
    pSh->StartAllAction();

    if( bNewMark )
        InsertMark();
    else if( !pSh->HasReadonlySel() )
    {
        if( bDel )
            pTOXMgr->DeleteTOXMark();
        else if( pTOXMgr->GetCurTOXMark() )
            UpdateMark();
    }

    pSh->EndAllAction();
    pSh->EndUndo(UNDO_INSATTR);

    if((nTypePos = aTypeDCB.GetEntryPos(aTypeDCB.GetSelectEntry())) == LISTBOX_ENTRY_NOTFOUND)
        nTypePos = 0;

    nKey1Pos = aKeyDCB.GetEntryPos(aKeyDCB.GetText());
    nKey2Pos = aKey2DCB.GetEntryPos(aKey2DCB.GetText());
}

/*--------------------------------------------------------------------
     Beschreibung:  Marke einfuegen
 --------------------------------------------------------------------*/
void lcl_SelectSameStrings(SwWrtShell& rSh, BOOL bWordOnly, BOOL bCaseSensitive)
{
    rSh.Push();
    SearchParam aParam( rSh.GetSelTxt(), SearchParam::SRCH_NORMAL,
                                                TRUE, FALSE, FALSE );

    aParam.SetCaseSensitive( bCaseSensitive );
    aParam.SetSrchWordOnly( bWordOnly );

    rSh.ClearMark();
    ULONG nRet = rSh.Find( aParam,  DOCPOS_START, DOCPOS_END,
                        (FindRanges)(FND_IN_SELALL|FND_IN_BODYONLY), FALSE );
}


void SwIndexMarkDlg::InsertMark()
{
    sal_uInt16 nPos = aTypeDCB.GetEntryPos(aTypeDCB.GetSelectEntry());
    TOXTypes eType = nPos == POS_CONTENT ? TOX_CONTENT :
                        nPos == POS_INDEX ? TOX_INDEX : TOX_USER;

    SwTOXMarkDescription aDesc(eType);

    sal_uInt16 nLevel = (sal_uInt16)aLevelED.Denormalize(aLevelED.GetValue());
    switch(nPos)
    {
        case POS_CONTENT : break;
        case POS_INDEX:     // Stichwortverzeichnismarke
        {
            UpdateKeyBoxes();
            String  aPrim(aKeyDCB.GetText());
            String  aSec(aKey2DCB.GetText());
            aDesc.SetPrimKey(aPrim);
            aDesc.SetSecKey(aSec);
            aDesc.SetMainEntry(aMainEntryCB.IsChecked());
        }
        break;
        default:            // Userdefinedverz.-Marke
        {
            String aName(aTypeDCB.GetSelectEntry());
            aDesc.SetTOUName(aName);
        }
    }
    if (aOrgStr != aEntryED.GetText())
        aDesc.SetAltStr(aEntryED.GetText());
    BOOL bApplyAll = aApplyToAllCB.IsChecked();
    BOOL bWordOnly = aApplyToAllCB.IsChecked();
    BOOL bCaseSensitive = aSearchCaseSensitiveCB.IsChecked();

    pSh->StartAllAction();
    // hier muessen alle gleichen Strings selektiert werden
    // damit der Eintrag auf alle gleichen Strings angewandt wird
    if(bApplyAll)
    {
        lcl_SelectSameStrings(*pSh, bWordOnly, bCaseSensitive);
    }
    aDesc.SetLevel(nLevel);
    SwTOXMgr aMgr(pSh);
    aMgr.InsertTOXMark(aDesc);
    if(bApplyAll)
        pSh->Pop(FALSE);

    pSh->EndAllAction();
}

/*--------------------------------------------------------------------
     Beschreibung:  Marke Updaten
 --------------------------------------------------------------------*/


void SwIndexMarkDlg::UpdateMark()
{
    String  aAltText(aEntryED.GetText());
    String* pAltText = aOrgStr != aEntryED.GetText() ? &aAltText : 0;
    //empty alternative texts are not allowed
    if(pAltText && !pAltText->Len())
        return;

    UpdateKeyBoxes();

    sal_uInt16 nPos = aTypeDCB.GetEntryPos(aTypeDCB.GetSelectEntry());
    TOXTypes eType = TOX_USER;
    if(POS_CONTENT == nPos)
        eType = TOX_CONTENT;
    else if(POS_INDEX == nPos)
        eType = TOX_INDEX;

    SwTOXMarkDescription aDesc(eType);
    aDesc.SetLevel(aLevelED.GetValue());
    if(pAltText)
        aDesc.SetAltStr(*pAltText);

    String  aPrim(aKeyDCB.GetText());
    if(aPrim.Len())
        aDesc.SetPrimKey(aPrim);
    String  aSec(aKey2DCB.GetText());
    if(aSec.Len())
        aDesc.SetSecKey(aSec);
    aDesc.SetMainEntry(aMainEntryCB.IsVisible() && aMainEntryCB.IsChecked());
    pTOXMgr->UpdateTOXMark(aDesc);
}

/*--------------------------------------------------------------------
    Beschreibung: Neue Keys eintragen
 --------------------------------------------------------------------*/


void SwIndexMarkDlg::UpdateKeyBoxes()
{
    String aKey(aKeyDCB.GetText());
    sal_uInt16 nPos = aKeyDCB.GetEntryPos(aKey);

    if(nPos == LISTBOX_ENTRY_NOTFOUND && aKey.Len() > 0)
    {   // neuen Key erzeugen
        aKeyDCB.InsertEntry(aKey);
    }

    aKey = aKey2DCB.GetText();
    nPos = aKey2DCB.GetEntryPos(aKey);

    if(nPos == LISTBOX_ENTRY_NOTFOUND && aKey.Len() > 0)
    {   // neuen Key erzeugen
        aKey2DCB.InsertEntry(aKey);
    }
}
/* -----------------13.10.99 15:10-------------------

 --------------------------------------------------*/
class SwNewUserIdxDlg : public ModalDialog
{
    OKButton        aOKPB;
    CancelButton    aCancelPB;
    HelpButton      aHelpPB;
    GroupBox        aNameGB;
    FixedText       aNameFT;
    Edit            aNameED;

    SwIndexMarkDlg* pDlg;

    DECL_LINK( ModifyHdl, Edit*);

    public:
        SwNewUserIdxDlg(SwIndexMarkDlg* pParent) :
            ModalDialog(pParent, SW_RES(DLG_NEW_USER_IDX)),
            pDlg(pParent),
            aOKPB(this, ResId(      PB_OK       )),
            aCancelPB(this, ResId(  PB_CANCEL   )),
            aHelpPB(this, ResId(    PB_HELP     )),
            aNameGB(this, ResId(    GB_NAME     )),
            aNameFT(this, ResId(    FT_NAME     )),
            aNameED(this, ResId(    ED_NAME     ))
            {
                FreeResource();
                aNameED.SetModifyHdl(LINK(this, SwNewUserIdxDlg, ModifyHdl));
                aOKPB.Enable(sal_False);
                aNameED.GrabFocus();
            }

    virtual void    Apply();
    String  GetName(){return aNameED.GetText();}
};
void SwNewUserIdxDlg::Apply()
{
}

IMPL_LINK( SwNewUserIdxDlg, ModifyHdl, Edit*, pEdit)
{
    aOKPB.Enable(pEdit->GetText().Len() && !pDlg->IsTOXType(pEdit->GetText()));
    return 0;
}

IMPL_LINK( SwIndexMarkDlg, NewUserIdxHdl, Button*, pButton)
{
    SwNewUserIdxDlg* pDlg = new SwNewUserIdxDlg(this);
    if(RET_OK == pDlg->Execute())
    {
        String sNewName(pDlg->GetName());
        aTypeDCB.InsertEntry(sNewName);
        aTypeDCB.SelectEntry(sNewName);
    }
    delete pDlg;
    return 0;
}
/* -----------------------------17.01.00 12:18--------------------------------

 ---------------------------------------------------------------------------*/
IMPL_LINK( SwIndexMarkDlg, SearchTypeHdl, CheckBox*, pBox)
{
    sal_Bool bEnable = pBox->IsChecked() && pBox->IsEnabled();
    aSearchCaseWordOnlyCB.Enable(bEnable);
    aSearchCaseSensitiveCB.Enable(bEnable);
    return 0;
}
/* -----------------07.09.99 10:30-------------------

 --------------------------------------------------*/
IMPL_LINK( SwIndexMarkDlg, InsertHdl, Button *, pButton )
{
    Apply();
    //close the dialog if only one entry is available
    if(!bNewMark && !aPrevBT.IsVisible() && !aNextBT.IsVisible())
        CloseHdl(pButton);
    return 0;
}
/* -----------------07.09.99 10:29-------------------

 --------------------------------------------------*/
IMPL_LINK( SwIndexMarkDlg, CloseHdl, Button *, pButton )
{
    if(bNewMark)
    {
        sal_uInt16 nSlot = FN_INSERT_IDX_ENTRY_DLG;
        SfxViewFrame::Current()->GetDispatcher()->Execute(nSlot,
                    SFX_CALLMODE_ASYNCHRON|SFX_CALLMODE_RECORD);
    }
    else
    {
        ((SwIndexMarkModalDlg*)GetParent())->EndDialog(RET_CANCEL);
    }
    return 0;
}
/*--------------------------------------------------------------------
     Beschreibung:  VerzeichnisTyp auswaehlen nur bei Einfuegen
 --------------------------------------------------------------------*/
IMPL_LINK( SwIndexMarkDlg, ModifyHdl, ListBox *, pBox )
{
    if(&aTypeDCB == pBox)
    {
        // Verzeichnistyp setzen
        sal_uInt16 nPos = aTypeDCB.GetEntryPos(aTypeDCB.GetSelectEntry());
        sal_Bool bLevelEnable = sal_False,
             bKeyEnable   = sal_False,
             bSetKey2     = sal_False,
             bKey2Enable  = sal_False;
        if(nPos == POS_INDEX)
        {
            bKeyEnable = sal_True;
            aKeyDCB.SetText(aKeyDCB.GetEntry(nKey1Pos));
            if(aKeyDCB.GetText().Len() > 0)
            {
                bSetKey2 = bKey2Enable = sal_True;
                aKey2DCB.SetText(aKey2DCB.GetEntry(nKey2Pos));
            }
        }
        else
        {
            bLevelEnable = sal_True;
            aLevelED.SetMax(MAXLEVEL);
            aLevelED.SetValue(aLevelED.Normalize(0));
            bSetKey2 = sal_True;
        }
        aLevelFT.Show(bLevelEnable);
        aLevelED.Show(bLevelEnable);
        aMainEntryCB.Show(nPos == POS_INDEX);

        aKeyFT.Enable(bKeyEnable);
        aKeyDCB.Enable(bKeyEnable);
        if ( bSetKey2 )
        {
            aKey2DCB.Enable(bKey2Enable);
            aKey2FT.Enable(bKey2Enable);
        }
    }
    aOKBT.Enable(aEntryED.GetText().Len() || pSh->GetCrsrCnt(sal_False));
    return 0;
}

/*--------------------------------------------------------------------
     Beschreibung:
 --------------------------------------------------------------------*/


IMPL_LINK_INLINE_START( SwIndexMarkDlg, NextHdl, Button *, EMPTYARG )
{
    InsertUpdate();
    pTOXMgr->NextTOXMark();
    UpdateDialog();
    return 0;
}
IMPL_LINK_INLINE_END( SwIndexMarkDlg, NextHdl, Button *, EMPTYARG )


IMPL_LINK_INLINE_START( SwIndexMarkDlg, NextSameHdl, Button *, EMPTYARG )
{
    InsertUpdate();
    pTOXMgr->NextTOXMark(sal_True);
    UpdateDialog();
    return 0;
}
IMPL_LINK_INLINE_END( SwIndexMarkDlg, NextSameHdl, Button *, EMPTYARG )


IMPL_LINK_INLINE_START( SwIndexMarkDlg, PrevHdl, Button *, EMPTYARG )
{
    InsertUpdate();
    pTOXMgr->PrevTOXMark();
    UpdateDialog();
    return 0;
}
IMPL_LINK_INLINE_END( SwIndexMarkDlg, PrevHdl, Button *, EMPTYARG )


IMPL_LINK_INLINE_START( SwIndexMarkDlg, PrevSameHdl, Button *, EMPTYARG )
{
    InsertUpdate();
    pTOXMgr->PrevTOXMark(sal_True);
    UpdateDialog();

    return 0;
}
IMPL_LINK_INLINE_END( SwIndexMarkDlg, PrevSameHdl, Button *, EMPTYARG )


IMPL_LINK( SwIndexMarkDlg, DelHdl, Button *, EMPTYARG )
{
    bDel = sal_True;
    InsertUpdate();
    bDel = sal_False;

    if(pTOXMgr->GetCurTOXMark())
        UpdateDialog();
    else
    {
        CloseHdl(&aCancelBT);
        SfxViewFrame::Current()->GetBindings().Invalidate(FN_EDIT_IDX_ENTRY_DLG);
    }
    return 0;
}

/*--------------------------------------------------------------------
     Beschreibung: Dialoganzeige erneuern
 --------------------------------------------------------------------*/


void SwIndexMarkDlg::UpdateDialog()
{
    DBG_ASSERT(pSh && pTOXMgr, "Shell nicht da?")
    SwTOXMark* pMark = pTOXMgr->GetCurTOXMark();
    ASSERT(pMark, "Keine aktuelle Markierung");
    if(!pMark)
        return;

    ViewShell::SetCareWin( GetParent() );

    aOrgStr = pMark->GetText();
    aEntryED.SetText(aOrgStr);

    // Verzeichnistyp setzen
    sal_Bool bLevelEnable = sal_True,
         bKeyEnable   = sal_False,
         bKey2Enable  = sal_False;

    TOXTypes eCurType = pMark->GetTOXType()->GetType();
    if(TOX_INDEX == eCurType)
    {
        bLevelEnable = sal_False;
        bKeyEnable = sal_True;
        bKey2Enable = 0 != pMark->GetPrimaryKey().Len();
        aKeyDCB.SetText( pMark->GetPrimaryKey() );
        aKey2DCB.SetText( pMark->GetSecondaryKey() );
        aMainEntryCB.Check(pMark->IsMainEntry());
    }
    else if(TOX_CONTENT == eCurType || TOX_USER == eCurType)
    {
        aLevelED.SetValue(aLevelED.Normalize(pMark->GetLevel()));
    }
    aKeyFT.Enable(bKeyEnable);
    aKeyDCB.Enable(bKeyEnable);
    aLevelED.SetMax(MAXLEVEL);
    aLevelFT.Show(bLevelEnable);
    aLevelED.Show(bLevelEnable);
    aMainEntryCB.Show(!bLevelEnable);
    aKey2FT.Enable(bKey2Enable);
    aKey2DCB.Enable(bKey2Enable);

    // Verzeichnis-Typ setzen
    aTypeDCB.SelectEntry(pMark->GetTOXType()->GetTypeName());

    // Next - Prev - Buttons setzen
    pSh->SttCrsrMove();
    if( aPrevBT.IsVisible() )
    {
        const SwTOXMark* pMoveMark = &pSh->GotoTOXMark( *pMark, TOX_PRV );
        if( pMoveMark != pMark )
            pSh->GotoTOXMark( *pMoveMark, TOX_NXT );
        aPrevBT.Enable( pMoveMark != pMark );
        pMoveMark = &pSh->GotoTOXMark( *pMark, TOX_NXT );
        if( pMoveMark != pMark )
            pSh->GotoTOXMark( *pMoveMark, TOX_PRV );
        aNextBT.Enable( pMoveMark != pMark );
    }

    if( aPrevSameBT.IsVisible() )
    {
        const SwTOXMark* pMoveMark = &pSh->GotoTOXMark( *pMark, TOX_SAME_PRV );
        if( pMoveMark != pMark )
            pSh->GotoTOXMark( *pMoveMark, TOX_SAME_NXT );
        aPrevSameBT.Enable( pMoveMark != pMark );
        pMoveMark = &pSh->GotoTOXMark( *pMark, TOX_SAME_NXT );
        if( pMoveMark != pMark )
            pSh->GotoTOXMark( *pMoveMark, TOX_SAME_PRV );
        aNextSameBT.Enable( pMoveMark != pMark );
    }

    sal_Bool bEnable = !pSh->HasReadonlySel();
    aOKBT.Enable( bEnable );
    aDelBT.Enable( bEnable );
    aEntryED.SetReadOnly( !bEnable );
    aLevelED.SetReadOnly( !bEnable );
    aKeyDCB.SetReadOnly( !bEnable );
    aKey2DCB.SetReadOnly( !bEnable );

    pSh->SelectTxtAttr( RES_TXTATR_TOXMARK, pMark->GetTxtTOXMark() );
    // we need the point at the start of the attribut
    pSh->SwapPam();

    pSh->EndCrsrMove();
}

/*--------------------------------------------------------------------
     Beschreibung: Enable Disable des 2. Schluessels
 --------------------------------------------------------------------*/


IMPL_LINK( SwIndexMarkDlg, KeyDCBModifyHdl, ComboBox *, pBox )
{
    sal_Bool bEnable = pBox->GetText().Len() > 0;
    if(!bEnable)
        aKey2DCB.SetText(aEmptyStr);
    aKey2DCB.Enable(bEnable);
    aKey2FT.Enable(bEnable);
    return 0;
}

/*-----------------25.02.94 21:19-------------------
 dtor ueberladen
--------------------------------------------------*/


SwIndexMarkDlg::~SwIndexMarkDlg()
{
    delete pTOXMgr;
    ViewShell::SetCareWin( 0 );
}
/* -----------------07.09.99 08:41-------------------

 --------------------------------------------------*/
void    SwIndexMarkDlg::ReInitDlg(SwWrtShell& rWrtShell)
{
    pSh = &rWrtShell;
    delete pTOXMgr;
    pTOXMgr = new SwTOXMgr(pSh);
    InitControls();
}
/* -----------------06.10.99 10:00-------------------

 --------------------------------------------------*/
SwIndexMarkFloatDlg::SwIndexMarkFloatDlg(SfxBindings* pBindings,
                                   SfxChildWindow* pChild,
                                   Window *pParent,
                                   sal_Bool bNew) :
    SfxModelessDialog(pBindings, pChild, pParent, SW_RES(DLG_INSIDXMARK)),
    aDlg(this, bNew, ResId(WIN_DLG))
{
    FreeResource();
}
/* -----------------06.10.99 10:27-------------------

 --------------------------------------------------*/
void    SwIndexMarkFloatDlg::Activate()
{
    SfxModelessDialog::Activate();
    GetDlg().Activate();
}
/* -----------------06.10.99 10:35-------------------

 --------------------------------------------------*/
SwIndexMarkModalDlg::SwIndexMarkModalDlg(Window *pParent, SwWrtShell& rSh) :
    SvxStandardDialog(pParent, SW_RES(DLG_EDIT_IDXMARK)),
    aDlg(this, sal_False, ResId(WIN_DLG))
{
    FreeResource();
    aDlg.ReInitDlg(rSh);
}
/* -----------------06.10.99 10:46-------------------

 --------------------------------------------------*/
void    SwIndexMarkModalDlg::Apply()
{
    aDlg.Apply();
}
/* -----------------07.09.99 08:15-------------------

 --------------------------------------------------*/
SFX_IMPL_CHILDWINDOW(SwInsertIdxMarkWrapper, FN_INSERT_IDX_ENTRY_DLG)

SwInsertIdxMarkWrapper::SwInsertIdxMarkWrapper( Window *pParentWindow,
                            sal_uInt16 nId,
                            SfxBindings* pBindings,
                            SfxChildWinInfo* pInfo ) :
        SfxChildWindow(pParentWindow, nId)
{

    pWindow = new SwIndexMarkFloatDlg(pBindings, this, pParentWindow );

    SwIndexMarkDlg& rDlg = ((SwIndexMarkFloatDlg*)pWindow)->GetDlg();
    SwWrtShell* pWrtShell = ::GetActiveWrtShell();
    DBG_ASSERT(pWrtShell, "No shell?")
    rDlg.ReInitDlg(*pWrtShell);

    ((SwIndexMarkFloatDlg*)pWindow)->Initialize(pInfo);
    eChildAlignment = SFX_ALIGN_NOALIGNMENT;
}
/* -----------------07.09.99 09:14-------------------

 --------------------------------------------------*/
SfxChildWinInfo SwInsertIdxMarkWrapper::GetInfo() const
{
    SfxChildWinInfo aInfo = SfxChildWindow::GetInfo();

    return aInfo;
}
/* -----------------16.09.99 14:19-------------------

 --------------------------------------------------*/
class SwCreateAuthEntryDlg_Impl : public ModalDialog
{
    OKButton        aOKBT;
    CancelButton    aCancelBT;
    HelpButton      aHelpBT;

    GroupBox        aEntriesGB;

    FixedText*      pFixedTexts[AUTH_FIELD_END];
    ListBox*        pTypeListBox;
    ComboBox*       pIdentifierBox;
    Edit*           pEdits[AUTH_FIELD_END];

    Link            aShortNameCheckLink;

    SwWrtShell&     rWrtSh;

    sal_Bool            m_bNewEntryMode;
    sal_Bool            m_bNameAllowed;

    DECL_LINK(IdentifierHdl, ComboBox*);
    DECL_LINK(ShortNameHdl, Edit*);
    DECL_LINK(EnableHdl, ListBox* pBox);

public:
    SwCreateAuthEntryDlg_Impl(Window* pParent,
                            const String pFields[],
                            SwWrtShell& rSh,
                            sal_Bool bNewEntry,
                            sal_Bool bCreate);
    ~SwCreateAuthEntryDlg_Impl();

    String          GetEntryText(ToxAuthorityField eField) const;

    void            SetCheckNameHdl(Link& rLink) {aShortNameCheckLink = rLink;}

};
/*-- 15.09.99 08:43:24---------------------------------------------------

  -----------------------------------------------------------------------*/
struct TextInfo
{
    sal_uInt16 nToxField;
    sal_uInt16 nHelpId;
};
static const TextInfo aTextInfoArr[] =
{
    {AUTH_FIELD_IDENTIFIER,      HID_AUTH_FIELD_IDENTIFIER      },
    {AUTH_FIELD_AUTHORITY_TYPE,  HID_AUTH_FIELD_AUTHORITY_TYPE  },
    {AUTH_FIELD_AUTHOR,          HID_AUTH_FIELD_AUTHOR          },
    {AUTH_FIELD_TITLE,           HID_AUTH_FIELD_TITLE           },
    {AUTH_FIELD_YEAR,            HID_AUTH_FIELD_YEAR            },
    {AUTH_FIELD_PUBLISHER,       HID_AUTH_FIELD_PUBLISHER       },
    {AUTH_FIELD_ADDRESS,         HID_AUTH_FIELD_ADDRESS         },
    {AUTH_FIELD_ISBN,            HID_AUTH_FIELD_ISBN            },
    {AUTH_FIELD_CHAPTER,         HID_AUTH_FIELD_CHAPTER         },
    {AUTH_FIELD_PAGES,           HID_AUTH_FIELD_PAGES           },
    {AUTH_FIELD_EDITOR,          HID_AUTH_FIELD_EDITOR          },
    {AUTH_FIELD_EDITION,         HID_AUTH_FIELD_EDITION         },
    {AUTH_FIELD_BOOKTITLE,       HID_AUTH_FIELD_BOOKTITLE       },
    {AUTH_FIELD_VOLUME,          HID_AUTH_FIELD_VOLUME          },
    {AUTH_FIELD_HOWPUBLISHED,    HID_AUTH_FIELD_HOWPUBLISHED    },
    {AUTH_FIELD_ORGANIZATIONS,   HID_AUTH_FIELD_ORGANIZATIONS   },
    {AUTH_FIELD_INSTITUTION,     HID_AUTH_FIELD_INSTITUTION     },
    {AUTH_FIELD_SCHOOL,          HID_AUTH_FIELD_SCHOOL          },
    {AUTH_FIELD_REPORT_TYPE,     HID_AUTH_FIELD_REPORT_TYPE     },
    {AUTH_FIELD_MONTH,           HID_AUTH_FIELD_MONTH           },
    {AUTH_FIELD_JOURNAL,         HID_AUTH_FIELD_JOURNAL         },
    {AUTH_FIELD_NUMBER,          HID_AUTH_FIELD_NUMBER          },
    {AUTH_FIELD_SERIES,          HID_AUTH_FIELD_SERIES          },
    {AUTH_FIELD_ANNOTE,          HID_AUTH_FIELD_ANNOTE          },
    {AUTH_FIELD_NOTE,            HID_AUTH_FIELD_NOTE            },
    {AUTH_FIELD_URL,             HID_AUTH_FIELD_URL             },
    {AUTH_FIELD_CUSTOM1,         HID_AUTH_FIELD_CUSTOM1         },
    {AUTH_FIELD_CUSTOM2,         HID_AUTH_FIELD_CUSTOM2         },
    {AUTH_FIELD_CUSTOM3,         HID_AUTH_FIELD_CUSTOM3         },
    {AUTH_FIELD_CUSTOM4,         HID_AUTH_FIELD_CUSTOM4         },
    {AUTH_FIELD_CUSTOM5,         HID_AUTH_FIELD_CUSTOM5         }
};

sal_Bool SwAuthMarkDlg::bIsFromComponent = sal_True;

SwAuthMarkDlg::SwAuthMarkDlg(  Window *pParent,
                               const ResId& rResId,
                               sal_Bool bNewDlg) :
    Window(pParent, rResId),
    aFromComponentRB(   this, ResId(RB_FROMCOMPONENT    )),
    aFromDocContentRB(  this, ResId(RB_FROMDOCCONTENT   )),
    aEntryFT(   this, ResId(FT_ENTRY    )),
    aEntryED(   this, ResId(ED_ENTRY    )),
    aEntryLB(   this, ResId(LB_ENTRY    )),
    aAuthorFT(  this, ResId(FT_AUTHOR       )),
    aAuthorFI(  this, ResId(FI_AUTHOR   )),
    aTitleFT(   this, ResId(FT_TITLE    )),
    aTitleFI(   this, ResId(FI_TITLE    )),
    aEntryGB(   this, ResId(GB_ENTRY    )),
    aOKBT(      this, ResId(PB_OK       )),
    aCancelBT(  this, ResId(PB_CANCEL   )),
    aHelpBT(    this, ResId(PB_HELP )),
    sChangeST(  ResId(ST_CHANGE)),
    aCreateEntryPB(this,ResId(PB_CREATEENTRY)),
    aEditEntryPB(this,  ResId(PB_EDITENTRY)),
    bNewEntry(bNewDlg),
    pSh(0),
    bBibAccessInitialized(sal_False)
{
    SetStyle(GetStyle()|WB_DIALOGCONTROL);
    FreeResource();

    aFromComponentRB.SetHelpId(HID_AUTH_MARK_DLG_FROM_COMP_RB);
    aFromDocContentRB.SetHelpId(HID_AUTH_MARK_DLG_FROM_DOC_RB );
    aEntryED.SetHelpId(HID_AUTH_MARK_DLG_ID_LISTBOX           );
    aEntryLB.SetHelpId(HID_AUTH_MARK_DLG_ID_LISTBOX           );

    aFromComponentRB.Show(bNewEntry);
    aFromDocContentRB.Show(bNewEntry);
    aFromComponentRB.Check(bIsFromComponent);
    aFromDocContentRB.Check(!bIsFromComponent);

    aOKBT       .SetHelpId(HID_INSERT_AUTH_MRK_OK   );
    aCancelBT   .SetHelpId(HID_INSERT_AUTH_MRK_CLOSE);
    aEntryED        .SetHelpId(HID_INSERT_AUTH_MRK_ENTRY        );
    aCreateEntryPB  .SetHelpId(HID_INSERT_AUTH_MRK_CREATE_ENTRY );
    aEditEntryPB    .SetHelpId(HID_INSERT_AUTH_MRK_EDIT_ENTRY   );

    aOKBT.SetClickHdl(LINK(this,SwAuthMarkDlg, InsertHdl));
    aCancelBT.SetClickHdl(LINK(this,SwAuthMarkDlg, CloseHdl));
    aCreateEntryPB.SetClickHdl(LINK(this,SwAuthMarkDlg, CreateEntryHdl));
    aEditEntryPB.SetClickHdl(LINK(this,SwAuthMarkDlg, CreateEntryHdl));
    aFromComponentRB.SetClickHdl(LINK(this,SwAuthMarkDlg, ChangeSourceHdl));
    aFromDocContentRB.SetClickHdl(LINK(this,SwAuthMarkDlg, ChangeSourceHdl));

    GetParent()->SetText(String(SW_RES(
                    bNewEntry ? STR_AUTHMRK_INSERT : STR_AUTHMRK_EDIT)));
    aEntryED.Show(!bNewEntry);
    aEntryLB.Show(bNewEntry);
    if(!bNewEntry)
    {
        aOKBT.SetText(sChangeST);
    }
    else
    {
        aEntryLB.SetSelectHdl(LINK(this, SwAuthMarkDlg, CompEntryHdl));
    }
}
/*-- 15.09.99 08:43:25---------------------------------------------------

  -----------------------------------------------------------------------*/
SwAuthMarkDlg::~SwAuthMarkDlg()
{
}
/*-- 15.09.99 08:43:25---------------------------------------------------

  -----------------------------------------------------------------------*/
void    SwAuthMarkDlg::ReInitDlg(SwWrtShell& rWrtShell)
{
    pSh = &rWrtShell;
    InitControls();
}
/* -----------------15.09.99 08:57-------------------

 --------------------------------------------------*/
IMPL_LINK( SwAuthMarkDlg, CloseHdl, PushButton *, EMPTYARG )
{
    if(bNewEntry)
    {
        sal_uInt16 nSlot = FN_INSERT_AUTH_ENTRY_DLG;
        SfxViewFrame::Current()->GetDispatcher()->Execute(nSlot,
                    SFX_CALLMODE_ASYNCHRON|SFX_CALLMODE_RECORD);
    }
    else
    {
        ((SwAuthMarkModalDlg*)GetParent())->EndDialog(RET_CANCEL);
    }
    return 0;
}
/* -----------------06.12.99 13:54-------------------

 --------------------------------------------------*/
String lcl_FindColumnEntry(const beans::PropertyValue* pFields, sal_Int32 nLen, const String& rColumnTitle)
{
    String sRet;
    OUString uColumnTitle = rColumnTitle;
    for(sal_uInt16 i = 0; i < nLen; i++)
    {
        if(pFields[i].Name == uColumnTitle &&
            pFields[i].Value.getValueType() == ::getCppuType((const OUString*)0))

        {
            OUString uTmp;
            pFields[i].Value >>= uTmp;
            sRet = String(uTmp);
            break;
        }
    }
    return sRet;
}
/* -----------------------------07.12.99 15:39--------------------------------

 ---------------------------------------------------------------------------*/
IMPL_LINK( SwAuthMarkDlg, CompEntryHdl, ListBox*, pBox)
{
    String sEntry(pBox->GetSelectEntry());
    if(bIsFromComponent)
    {
        if(xBibAccess.is() && sEntry.Len())
        {
            OUString uEntry(sEntry);
            if(xBibAccess->hasByName(uEntry))
            {
                uno::Any aEntry(xBibAccess->getByName(uEntry));
                if(aEntry.getValueType() == ::getCppuType((uno::Sequence<beans::PropertyValue>*)0))

                {
                    uno::Sequence<beans::PropertyValue> aFieldProps = *(uno::Sequence<beans::PropertyValue>*)aEntry.getValue();
                    const beans::PropertyValue* pProps = aFieldProps.getConstArray();
                    for(sal_uInt16 i = 0; i < AUTH_FIELD_END; i++)
                    {
                        m_sFields[i] = lcl_FindColumnEntry(
                                pProps, aFieldProps.getLength(), m_sColumnTitles[i]);
                    }
                }
            }
        }
    }
    else
    {
        if(sEntry.Len())
        {
            const SwAuthorityFieldType* pFType = (const SwAuthorityFieldType*)
                                        pSh->GetFldType(RES_AUTHORITY, aEmptyStr);
            const SwAuthEntry*  pEntry = pFType ? pFType->GetEntryByIdentifier(sEntry) : 0;
            for(sal_uInt16 i = 0; i < AUTH_FIELD_END; i++)
                m_sFields[i] = pEntry ?
                            pEntry->GetAuthorField((ToxAuthorityField)i) : aEmptyStr;
        }
    }
    if(!pBox->GetSelectEntry().Len())
    {
        for(sal_uInt16 i = 0; i < AUTH_FIELD_END; i++)
            m_sFields[i] = aEmptyStr;
    }
    aAuthorFI.SetText(m_sFields[AUTH_FIELD_AUTHOR]);
    aTitleFI.SetText(m_sFields[AUTH_FIELD_TITLE]);
    return 0;
}

/* -----------------15.09.99 08:57-------------------

 --------------------------------------------------*/
IMPL_LINK( SwAuthMarkDlg, InsertHdl, PushButton *, EMPTYARG )
{
    //insert or update the SwAuthorityField...
    if(pSh)
    {
        sal_Bool bDifferent = sal_False;
        DBG_ASSERT(m_sFields[AUTH_FIELD_IDENTIFIER].Len() , "No Id is set!")
        DBG_ASSERT(m_sFields[AUTH_FIELD_AUTHORITY_TYPE].Len() , "No authority type is set!")
        //check if the entry already exists with different content
        const SwAuthorityFieldType* pFType = (const SwAuthorityFieldType*)
                                        pSh->GetFldType(RES_AUTHORITY, aEmptyStr);
        const SwAuthEntry*  pEntry = pFType ?
                pFType->GetEntryByIdentifier( m_sFields[AUTH_FIELD_IDENTIFIER])
                : 0;
        if(pEntry)
        {
            for(sal_uInt16 i = 0; i < AUTH_FIELD_END && !bDifferent; i++)
                bDifferent |= m_sFields[i] != pEntry->GetAuthorField((ToxAuthorityField)i);
            if(bDifferent)
            {
                QueryBox aQuery(this, SW_RES(DLG_CHANGE_AUTH_ENTRY));
                if(RET_YES != aQuery.Execute())
                    return 0;
            }
        }

        SwFldMgr aMgr(pSh);
        String sFields;
        for(sal_uInt16 i = 0; i < AUTH_FIELD_END; i++)
        {
            sFields += m_sFields[i];
            sFields += TOX_STYLE_DELIMITER;
        }
        if(bNewEntry)
        {
            if(bDifferent)
            {
                SwAuthEntry aNewData;
                for(sal_uInt16 i = 0; i < AUTH_FIELD_END; i++)
                    aNewData.SetAuthorField((ToxAuthorityField)i, m_sFields[i]);
                pSh->ChangeAuthorityData(&aNewData);
            }
            aMgr.InsertFld( TYP_AUTHORITY, 0, sFields, aEmptyStr, 0 );
        }
        else if(aMgr.GetCurFld())
        {
            aMgr.UpdateCurFld(0, sFields, aEmptyStr);
        }
    }
    if(!bNewEntry)
        CloseHdl(0);
    return 0;
}
/* -----------------17.09.99 13:06-------------------

 --------------------------------------------------*/
IMPL_LINK(SwAuthMarkDlg, CreateEntryHdl, PushButton*, pButton)
{
    sal_Bool bCreate = pButton == &aCreateEntryPB;
    String sOldId = m_sCreatedEntry[0];
    for(sal_uInt16 i = 0; i < AUTH_FIELD_END; i++)
        m_sCreatedEntry[i] = bCreate ? aEmptyStr : m_sFields[i];
    SwCreateAuthEntryDlg_Impl aDlg(pButton,
                bCreate ? m_sCreatedEntry : m_sFields,
                *pSh, bNewEntry, bCreate);
    if(bNewEntry)
    {
        aDlg.SetCheckNameHdl(LINK(this, SwAuthMarkDlg, IsEntryAllowedHdl));
    }
    if(RET_OK == aDlg.Execute())
    {
        if(bCreate && sOldId.Len())
        {
            aEntryLB.RemoveEntry(sOldId);
        }
        for(sal_uInt16 i = 0; i < AUTH_FIELD_END; i++)
        {
            m_sFields[i] = aDlg.GetEntryText((ToxAuthorityField)i);
            m_sCreatedEntry[i] = m_sFields[i];
        }
        if(bNewEntry && !aFromDocContentRB.IsChecked())
        {
            aFromDocContentRB.Check(sal_True);
            ChangeSourceHdl(&aFromDocContentRB);
        }
        if(bCreate)
        {
            DBG_ASSERT(LISTBOX_ENTRY_NOTFOUND ==
                        aEntryLB.GetEntryPos(m_sFields[AUTH_FIELD_IDENTIFIER]),
                        "entry exists!")
            aEntryLB.InsertEntry(m_sFields[AUTH_FIELD_IDENTIFIER]);
            aEntryLB.SelectEntry(m_sFields[AUTH_FIELD_IDENTIFIER]);
        }
        aEntryED.SetText(m_sFields[AUTH_FIELD_IDENTIFIER]);
        aAuthorFI.SetText(m_sFields[AUTH_FIELD_AUTHOR]);
        aTitleFI.SetText(m_sFields[AUTH_FIELD_TITLE]);
    }
    return 0;
}
/* -----------------------------20.12.99 14:26--------------------------------

 ---------------------------------------------------------------------------*/
IMPL_LINK(SwAuthMarkDlg, ChangeSourceHdl, RadioButton*, pButton)
{
    sal_Bool bFromComp = (pButton == &aFromComponentRB);
    bIsFromComponent = bFromComp;
    aCreateEntryPB.Enable(!bIsFromComponent);
    aEntryLB.Clear();
    if(bIsFromComponent)
    {
        if(!bBibAccessInitialized)
        {
             uno::Reference< lang::XMultiServiceFactory > xMSF = getProcessServiceFactory();
            xBibAccess = uno::Reference< container::XNameAccess > (
                            xMSF->createInstance( C2U("com.sun.star.frame.Bibliography") ),
                                                                        uno::UNO_QUERY );
            uno::Reference< beans::XPropertySet >  xPropSet(xBibAccess, uno::UNO_QUERY);
            OUString uPropName(C2U("BibliographyDataFieldNames"));
            if(xPropSet.is() && xPropSet->getPropertySetInfo()->hasPropertyByName(uPropName))
            {
                uno::Any aNames = xPropSet->getPropertyValue(uPropName);
                if(aNames.getValueType() == ::getCppuType((uno::Sequence<beans::PropertyValue>*)0))
                {
                    uno::Sequence<beans::PropertyValue> aSeq = *(uno::Sequence<beans::PropertyValue>*)aNames.getValue();
                    const beans::PropertyValue* pArr = aSeq.getConstArray();
                    for(sal_uInt16 i = 0; i < aSeq.getLength(); i++)
                    {
                        String sTitle = pArr[i].Name;
                        sal_Int16 nField;
                        pArr[i].Value >>= nField;
                        if(nField >= 0 && nField < AUTH_FIELD_END)
                            m_sColumnTitles[nField] = sTitle;
                    }
                }
            }
            bBibAccessInitialized = sal_True;
        }
        if(xBibAccess.is())
        {
            uno::Sequence<OUString> aIdentifiers = xBibAccess->getElementNames();
            const OUString* pNames = aIdentifiers.getConstArray();
            for(sal_uInt16 i = 0; i < aIdentifiers.getLength(); i++)
            {
                aEntryLB.InsertEntry(pNames[i]);
            }
        }
    }
    else
    {
        const SwAuthorityFieldType* pFType = (const SwAuthorityFieldType*)
                                    pSh->GetFldType(RES_AUTHORITY, aEmptyStr);
        if(pFType)
        {
            SvStringsDtor aIds;
            pFType->GetAllEntryIdentifiers( aIds );
            for(sal_uInt16 n = 0; n < aIds.Count(); n++)
                aEntryLB.InsertEntry(*aIds.GetObject(n));
        }
        if(m_sCreatedEntry[AUTH_FIELD_IDENTIFIER].Len())
            aEntryLB.InsertEntry(m_sCreatedEntry[AUTH_FIELD_IDENTIFIER]);
    }
    aEntryLB.SelectEntryPos(0);
    CompEntryHdl(&aEntryLB);
    return 0;
}
/* -----------------------------20.12.99 15:11--------------------------------

 ---------------------------------------------------------------------------*/
IMPL_LINK(SwAuthMarkDlg, IsEntryAllowedHdl, Edit*, pEdit)
{
    String sEntry = pEdit->GetText();
    sal_Bool bAllowed = sal_False;
    if(sEntry.Len())
    {
        if(aEntryLB.GetEntryPos(sEntry) != LISTBOX_ENTRY_NOTFOUND)
            return 0;
        else if(bIsFromComponent)
        {
            const SwAuthorityFieldType* pFType = (const SwAuthorityFieldType*)
                                        pSh->GetFldType(RES_AUTHORITY, aEmptyStr);
            bAllowed = !pFType || !pFType->GetEntryByIdentifier(sEntry);
        }
        else
        {
            bAllowed = !xBibAccess.is() || !xBibAccess->hasByName(sEntry);
        }
    }
    return bAllowed;
}
/* -----------------21.09.99 14:19-------------------

 --------------------------------------------------*/
void SwAuthMarkDlg::InitControls()
{
    DBG_ASSERT(pSh, "Shell nicht da?")
    SwField* pField = pSh->GetCurFld();
    ASSERT(bNewEntry || pField, "Keine aktuelle Markierung");
    if(bNewEntry)
    {
        ChangeSourceHdl(aFromComponentRB.IsChecked() ? &aFromComponentRB : &aFromDocContentRB);
        aCreateEntryPB.Enable(!aFromComponentRB.IsChecked());
        if(!aFromComponentRB.IsChecked() && m_sCreatedEntry[0].Len())
            for(sal_uInt16 i = 0; i < AUTH_FIELD_END; i++)
                m_sFields[i] = m_sCreatedEntry[i];
    }
    if(bNewEntry || !pField || pField->GetTyp()->Which() != RES_AUTHORITY)
        return;

    const SwAuthEntry* pEntry = ((SwAuthorityFieldType*)pField->GetTyp())->
            GetEntryByIdentifier(((SwAuthorityField*)pField)->
                                    GetFieldText(AUTH_FIELD_IDENTIFIER));

    DBG_ASSERT(pEntry, "No authority entry found")
    if(!pEntry)
        return;
    for(sal_uInt16 i = 0; i < AUTH_FIELD_END; i++)
        m_sFields[i] = pEntry->GetAuthorField((ToxAuthorityField)i);

    aEntryED.SetText(pEntry->GetAuthorField(AUTH_FIELD_IDENTIFIER));
    aAuthorFI.SetText(pEntry->GetAuthorField(AUTH_FIELD_AUTHOR));
    aTitleFI.SetText(pEntry->GetAuthorField(AUTH_FIELD_TITLE));

}

/* -----------------07.09.99 08:15-------------------

 --------------------------------------------------*/
SFX_IMPL_CHILDWINDOW(SwInsertAuthMarkWrapper, FN_INSERT_AUTH_ENTRY_DLG)

SwInsertAuthMarkWrapper::SwInsertAuthMarkWrapper(   Window *pParentWindow,
                            sal_uInt16 nId,
                            SfxBindings* pBindings,
                            SfxChildWinInfo* pInfo ) :
        SfxChildWindow(pParentWindow, nId)
{

    pWindow = new SwAuthMarkFloatDlg(pBindings, this, pParentWindow );

    SwAuthMarkDlg& rDlg = ((SwAuthMarkFloatDlg*)pWindow)->GetDlg();
    ((SwAuthMarkFloatDlg*)pWindow)->Initialize(pInfo);
    SwWrtShell* pWrtShell = ::GetActiveWrtShell();
    DBG_ASSERT(pWrtShell, "No shell?")
    rDlg.ReInitDlg(*pWrtShell);

    eChildAlignment = SFX_ALIGN_NOALIGNMENT;
}
/* -----------------07.09.99 09:14-------------------

 --------------------------------------------------*/
SfxChildWinInfo SwInsertAuthMarkWrapper::GetInfo() const
{
    SfxChildWinInfo aInfo = SfxChildWindow::GetInfo();
    return aInfo;
}
/* -----------------19.10.99 11:16-------------------

 --------------------------------------------------*/
void    SwInsertAuthMarkWrapper::ReInitDlg(SwWrtShell& rWrtShell)
{
    ((SwAuthMarkFloatDlg*)pWindow)->GetDlg().ReInitDlg(rWrtShell);
}

/* -----------------16.09.99 14:27-------------------

 --------------------------------------------------*/
SwCreateAuthEntryDlg_Impl::SwCreateAuthEntryDlg_Impl(Window* pParent,
        const String pFields[],
        SwWrtShell& rSh,
        sal_Bool bNewEntry,
        sal_Bool bCreate) :
    ModalDialog(pParent, SW_RES(DLG_CREATE_AUTH_ENTRY)),
    aOKBT(this,         ResId(PB_OK         )),
    aCancelBT(this,     ResId(PB_CANCEL     )),
    aHelpBT(this,       ResId(PB_HELP       )),
    aEntriesGB(this,    ResId(GB_ENTRIES    )),
    pIdentifierBox(0),
    pTypeListBox(0),
    rWrtSh(rSh),
    m_bNewEntryMode(bNewEntry),
    m_bNameAllowed(sal_True)
{
    FreeResource();
    Point aGBPos(aEntriesGB.GetPosPixel());
    Point aTL1(aGBPos);
    Size aGBSz(aEntriesGB.GetSizePixel());
    long nControlSpace = aGBSz.Width() / 4;
    long nControlWidth = nControlSpace - 2 * aTL1.X();
    aTL1.X() *= 2;
    aTL1.Y() *= 5;
    Point aTR1(aTL1);
    aTR1.X() += nControlSpace;
    Point aTL2(aTR1);
    aTL2.X() += nControlSpace;
    Point aTR2(aTL2);
    aTR2.X() += nControlSpace;
    Size aFixedTextSize(aGBSz);
    Size aTmpSz(8,10);
    aTmpSz = LogicToPixel(aTmpSz, MAP_APPFONT);
    aFixedTextSize.Height() = aTmpSz.Width();
    Size aEditSize(aFixedTextSize);
    aFixedTextSize.Width() = nControlWidth + aGBPos.X();
    aEditSize.Height() = aTmpSz.Height();
    aEditSize.Width() = nControlWidth;

    sal_uInt16 nOffset = aTmpSz.Width() * 3 / 2;
    sal_Bool bLeft = sal_True;
    for(sal_uInt16 nIndex = 0; nIndex < AUTH_FIELD_END; nIndex++)
    {
        const TextInfo aCurInfo = aTextInfoArr[nIndex];

        pFixedTexts[nIndex] = new FixedText(this);

        pFixedTexts[nIndex]->SetSizePixel(aFixedTextSize);
        pFixedTexts[nIndex]->SetPosPixel(bLeft ? aTL1 : aTL2);
        pFixedTexts[nIndex]->SetText(SW_RES(STR_AUTH_FIELD_START + aCurInfo.nToxField));
        pFixedTexts[nIndex]->Show();
        pEdits[nIndex] = 0;
        if( AUTH_FIELD_AUTHORITY_TYPE == aCurInfo.nToxField )
        {
            pTypeListBox = new ListBox(this, WB_DROPDOWN|WB_BORDER);
            for(sal_uInt16 j = 0; j < AUTH_TYPE_END; j++)
                pTypeListBox->InsertEntry(String(SW_RES(STR_AUTH_TYPE_START + j)));
            if(pFields[aCurInfo.nToxField].Len())
            {
                sal_uInt16 nIndexPos = pFields[aCurInfo.nToxField].ToInt32();
                pTypeListBox->SelectEntryPos(nIndexPos);
            }
            Size aTmp(aEditSize);
            aTmp.Height() *= 4;
            pTypeListBox->SetSizePixel(aTmp);
            pTypeListBox->SetPosPixel(bLeft ? aTR1 : aTR2);
            pTypeListBox->Show();
            pTypeListBox->SetSelectHdl(LINK(this, SwCreateAuthEntryDlg_Impl, EnableHdl));
            pTypeListBox->SetHelpId(aCurInfo.nHelpId);

        }
        else if(AUTH_FIELD_IDENTIFIER == aCurInfo.nToxField && !m_bNewEntryMode)
        {
            pIdentifierBox = new ComboBox(this, WB_BORDER|WB_DROPDOWN);
            pIdentifierBox->SetSelectHdl(LINK(this,
                                    SwCreateAuthEntryDlg_Impl, IdentifierHdl));


            const SwAuthorityFieldType* pFType = (const SwAuthorityFieldType*)
                                        rSh.GetFldType(RES_AUTHORITY, aEmptyStr);
            if(pFType)
            {
                SvStringsDtor aIds;
                pFType->GetAllEntryIdentifiers( aIds );
                for(sal_uInt16 n = 0; n < aIds.Count(); n++)
                    pIdentifierBox->InsertEntry(*aIds.GetObject(n));
            }
            pIdentifierBox->SetText(pFields[aCurInfo.nToxField]);
            Size aTmp(aEditSize);
            aTmp.Height() *= 4;
            pIdentifierBox->SetSizePixel(aTmp);
            pIdentifierBox->SetPosPixel(bLeft ? aTR1 : aTR2);
            pIdentifierBox->Show();
            pIdentifierBox->SetHelpId(aCurInfo.nHelpId);
        }
        else
        {
            pEdits[nIndex] = new Edit(this, WB_BORDER);
            pEdits[nIndex]->SetSizePixel(aEditSize);
            pEdits[nIndex]->SetPosPixel(bLeft ? aTR1 : aTR2);
            pEdits[nIndex]->SetText(pFields[aCurInfo.nToxField]);
            pEdits[nIndex]->Show();
            pEdits[nIndex]->SetHelpId(aCurInfo.nHelpId);
            if(AUTH_FIELD_IDENTIFIER == aCurInfo.nToxField)
            {
                pEdits[nIndex]->SetModifyHdl(LINK(this, SwCreateAuthEntryDlg_Impl, ShortNameHdl));
                m_bNameAllowed = pFields[nIndex].Len() > 0;
                if(!bCreate)
                {
                    pFixedTexts[nIndex]->Enable(sal_False);
                    pEdits[nIndex]->Enable(sal_False);
                }
            }
        }
        if(bLeft)
        {
            aTL1.Y() += nOffset;
            aTR1.Y() += nOffset;
        }
        else
        {
            aTL2.Y() += nOffset;
            aTR2.Y() += nOffset;
        }
        bLeft = !bLeft;
    }
    EnableHdl(pTypeListBox);

    long nHeightDiff = - aGBSz.Height();
    aGBSz.Height() = aTL1.Y();
    nHeightDiff += aGBSz.Height();
    aEntriesGB.SetSizePixel(aGBSz);
    Size aDlgSize(GetSizePixel());
    aDlgSize.Height() += nHeightDiff;
    SetSizePixel(aDlgSize);

}
/* -----------------16.09.99 14:47-------------------

 --------------------------------------------------*/
SwCreateAuthEntryDlg_Impl::~SwCreateAuthEntryDlg_Impl()
{
    for(sal_uInt16 i = 0; i < AUTH_FIELD_END; i++)
    {
        delete pFixedTexts[i];
        delete pEdits[i];
    }
    delete pTypeListBox;
    delete pIdentifierBox;
}
/* -----------------16.09.99 14:27-------------------

 --------------------------------------------------*/
String  SwCreateAuthEntryDlg_Impl::GetEntryText(ToxAuthorityField eField) const
{
    String sRet;
    if( AUTH_FIELD_AUTHORITY_TYPE == eField )
    {
        DBG_ASSERT(pTypeListBox, "No ListBox")
        sRet = pTypeListBox->GetSelectEntryPos();
    }
    else if( AUTH_FIELD_IDENTIFIER == eField && !m_bNewEntryMode)
    {
        DBG_ASSERT(pIdentifierBox, "No ComboBox")
        sRet = pIdentifierBox->GetText();
    }
    else
    {
        for(sal_uInt16 nIndex = 0; nIndex < AUTH_FIELD_END; nIndex++)
        {
            const TextInfo aCurInfo = aTextInfoArr[nIndex];
            if(aCurInfo.nToxField == eField)
            {
                sRet = pEdits[nIndex]->GetText();
                break;
            }
        }
    }
    return sRet;
}
/* -----------------21.09.99 13:54-------------------

 --------------------------------------------------*/
IMPL_LINK(SwCreateAuthEntryDlg_Impl, IdentifierHdl, ComboBox*, pBox)
{
    const SwAuthorityFieldType* pFType = (const SwAuthorityFieldType*)
                                rWrtSh.GetFldType(RES_AUTHORITY, aEmptyStr);
    if(pFType)
    {
        const SwAuthEntry* pEntry = pFType->GetEntryByIdentifier(
                                                        pBox->GetText());
        if(pEntry)
        {
            for(sal_uInt16 i = 0; i < AUTH_FIELD_END; i++)
            {
                if(AUTH_FIELD_IDENTIFIER == i)
                    continue;
                if(AUTH_FIELD_AUTHORITY_TYPE == i)
                    pTypeListBox->SelectEntry(
                                pEntry->GetAuthorField((ToxAuthorityField)i));
                else
                    pEdits[i]->SetText(
                                pEntry->GetAuthorField((ToxAuthorityField)i));
            }
        }
    }
    return 0;
}
/* -----------------------------20.12.99 15:07--------------------------------

 ---------------------------------------------------------------------------*/

IMPL_LINK(SwCreateAuthEntryDlg_Impl, ShortNameHdl, Edit*, pEdit)
{
    if(aShortNameCheckLink.IsSet())
    {
        sal_Bool bEnable = 0 != aShortNameCheckLink.Call(pEdit);
        m_bNameAllowed |= bEnable;
        aOKBT.Enable(pTypeListBox->GetSelectEntryCount() && bEnable);
    }
    return 0;
}
/* -----------------------------20.12.99 15:54--------------------------------

 ---------------------------------------------------------------------------*/
IMPL_LINK(SwCreateAuthEntryDlg_Impl, EnableHdl, ListBox*, pBox)
{
    aOKBT.Enable(m_bNameAllowed && pBox->GetSelectEntryCount());
    return 0;
};
/* -----------------06.10.99 10:00-------------------

 --------------------------------------------------*/
SwAuthMarkFloatDlg::SwAuthMarkFloatDlg(SfxBindings* pBindings,
                                   SfxChildWindow* pChild,
                                   Window *pParent,
                                   sal_Bool bNew) :
    SfxModelessDialog(pBindings, pChild, pParent, SW_RES(DLG_INSAUTHMARK)),
    aDlg(this, ResId(WIN_DLG), bNew)
{
    FreeResource();
}
/* -----------------06.10.99 10:27-------------------

 --------------------------------------------------*/
void    SwAuthMarkFloatDlg::Activate()
{
    SfxModelessDialog::Activate();
    GetDlg().Activate();
}
/* -----------------06.10.99 10:35-------------------

 --------------------------------------------------*/
SwAuthMarkModalDlg::SwAuthMarkModalDlg(Window *pParent, SwWrtShell& rSh) :
    SvxStandardDialog(pParent, SW_RES(DLG_EDIT_AUTHMARK)),
    aDlg(this, ResId(WIN_DLG), sal_False)
{
    FreeResource();
    aDlg.ReInitDlg(rSh);
}
/* -----------------06.10.99 10:46-------------------

 --------------------------------------------------*/
void    SwAuthMarkModalDlg::Apply()
{
    aDlg.InsertHdl(0);
}
/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.105  2000/09/18 16:05:53  willem.vandorp
    OpenOffice header added.

    Revision 1.104  2000/09/07 15:59:25  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.103  2000/07/03 08:27:55  os
    #72742# resource warnings corrected

    Revision 1.102  2000/06/27 19:42:06  jp
    Bug #70447#: select the current TOXMark if the EditDialog is open

    Revision 1.101  2000/05/26 07:21:31  os
    old SW Basic API Slots removed

    Revision 1.100  2000/05/16 17:29:33  jp
    Changes for Unicode

    Revision 1.99  2000/05/16 09:15:13  os
    project usr removed

    Revision 1.98  2000/04/18 15:32:23  os
    UNICODE

    Revision 1.97  2000/04/04 15:21:07  os
    #74729# Author-Title assignment corrected

    Revision 1.96  2000/03/30 13:19:03  os
    UNO III

    Revision 1.95  2000/03/23 07:42:45  os
    UNO III

    Revision 1.94  2000/02/18 14:36:57  kz
    #65293# include PropertyValue

    Revision 1.93  2000/02/11 14:55:46  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.92  2000/01/31 10:48:04  os
    #71961# TOX_INDEX as default

    Revision 1.91  2000/01/18 14:44:14  os
    #72050# base class changed

    Revision 1.90  2000/01/18 09:15:45  os
    #72010# type is numeric

    Revision 1.89  2000/01/17 12:02:19  os
    #70703# apply to all similar texts: search options case sensitive and word only

    Revision 1.88  1999/12/27 12:22:18  os
    #71307# HelpIds added

    Revision 1.87  1999/12/21 13:47:39  os
    #70508# select source for bibliography entries

    Revision 1.86  1999/12/14 10:18:42  os
    #70819# new index button now an ImageButton at a better position

    Revision 1.85  1999/12/07 16:37:15  os
    #70508# get data from bib component

    Revision 1.84  1999/11/30 13:47:52  os
    #68736# HelpId for insert index mark dialogs

    Revision 1.83  1999/11/25 08:56:01  os
    prevent from changing content in readonly

    Revision 1.82  1999/10/19 09:32:39  os
    casts corrected

    Revision 1.81  1999/10/18 11:42:53  os
    Helpids for Modeless idx entry dialogs

    Revision 1.80  1999/10/13 14:14:59  os
    create new user index via button

    Revision 1.79  1999/10/11 09:00:21  os
    AuthorityField(Type):Import/Export interfaces

    Revision 1.78  1999/10/06 12:11:23  os
    edit tox entry dialogs now modal

    Revision 1.77  1999/09/21 13:43:20  os
    edit Authority fields

    Revision 1.76  1999/09/20 09:36:38  os
    new Dialog: SwCreateAuthEntryDlg_Impl

    Revision 1.75  1999/09/15 13:57:24  os
    dialog for authorities

    Revision 1.74  1999/09/14 13:29:37  os
    call ModifyHdl if entry text is changed

    Revision 1.73  1999/09/07 13:55:04  os
    Insert/EditIndexEntry as FloatingWindow

    Revision 1.72  1999/08/24 08:41:10  OS
    level count of user indexes now on MAXLEVEL


      Rev 1.71   24 Aug 1999 10:41:10   OS
   level count of user indexes now on MAXLEVEL

      Rev 1.70   23 Aug 1999 10:24:30   OS
   extended indexes: InsertTOXMark simplified; main entry in indexes

      Rev 1.69   18 Jun 1999 11:53:56   OS
   #66778# empty alternative texts are not allowed

      Rev 1.68   10 Jun 1999 13:02:04   OS
   restore selection

      Rev 1.67   28 Apr 1999 12:42:54   OS
   #65478# Level fuer Benutzerverzeichnis erlauben

      Rev 1.66   21 Jan 1999 09:15:06   JP
   Task #58677#: Crsr in Readonly Bereichen zulassen

      Rev 1.65   20 Jan 1999 11:35:28   OS
   #60881# Verzeichniseintraege mehrfach einf?gen

      Rev 1.64   10 Feb 1998 07:49:00   OS
   Level nur fuer Inhaltsverzeichnisse #47169#

      Rev 1.63   25 Nov 1997 10:51:02   MA
   includes

      Rev 1.62   05 Nov 1997 12:42:56   OS
   richtiges Flag uebergeben #43766#

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/index/idxmrk.hrc b/sw/source/ui/index/idxmrk.hrc
new file mode 100644
index 0000000..184d1f0
--- /dev/null
+++ b/sw/source/ui/index/idxmrk.hrc
@@ -0,0 +1,105 @@
/*************************************************************************
 *
 *  $RCSfile: idxmrk.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:44 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#define BT_OK       100
#define BT_CANCEL   101
#define BT_NXT      102
#define BT_NXTSAME  103
#define BT_PREV     104
#define BT_PREVSAME 105
#define BT_DEL      106
#define BT_HELP     107
#define LBL_INDEX   1
#define DCB_INDEX   2
#define LBL_ENTRY   3
#define SL_ENTRY    4
#define LBL_KEY     5
#define DCB_KEY     6
#define LBL_LEVEL   7
#define SL_LEVEL    8
#define GB_INDEX    10
#define LBL_KEY2    11
#define DCB_KEY2    12
#define CB_APPLY_TO_ALL 13
#define CB_MAIN_ENTRY   14
#define FT_ENTRY    20
#define ED_ENTRY    21
#define PB_OK       22
#define PB_CANCEL   23
#define PB_HELP     24
#define GB_ENTRIES  25
#define PB_CREATEENTRY 26
#define GB_ENTRY    27
#define FT_TITLE    28
#define FI_TITLE    29
#define FT_AUTHOR   30
#define FI_AUTHOR   31
#define ST_CHANGE   32
#define WIN_DLG     33
#define BT_NEW      34
#define GB_NAME     37
#define FT_NAME     38
#define ED_NAME     39
#define LB_ENTRY    40
#define RB_FROMCOMPONENT    41
#define RB_FROMDOCCONTENT   42
#define PB_EDITENTRY        43
#define CB_CASESENSITIVE    44
#define CB_WORDONLY         45
diff --git a/sw/source/ui/index/idxmrk.src b/sw/source/ui/index/idxmrk.src
new file mode 100644
index 0000000..cc37317
--- /dev/null
+++ b/sw/source/ui/index/idxmrk.src
@@ -0,0 +1,1236 @@
/*************************************************************************
 *
 *  $RCSfile: idxmrk.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:44 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "index.hrc"
#include "idxmrk.hrc"
#include "helpid.h"
#include "cmdid.h"

#define IDX_DIALOG_WINDOW \
    Window WIN_DLG                                                  \
    {                                                               \
        Pos = MAP_APPFONT ( 0 , 0 ) ;                               \
        Size = MAP_APPFONT ( 218 , WINDOW_HEIGHT ) ;                          \
        OKButton BT_OK                                              \
        {                                                           \
            Pos = MAP_APPFONT ( 162 , 6 ) ;                         \
            Size = MAP_APPFONT ( 50 , 14 ) ;                        \
            TabStop = TRUE ;                                        \
            DefButton = TRUE ;                                      \
            Text = "Einfügen";                                      \
            Text[English] = "Insert";                               \
            Text[ english_us ] = "Insert";\
            Text[ portuguese ] = "Inserir";\
            Text[ russian ] = "Âñòàâèòü";\
            Text[ greek ] = "ÐñïóèÞêç";\
            Text[ dutch ] = "Invoegen";\
            Text[ french ] = "Insérer";\
            Text[ spanish ] = "Insertar";\
            Text[ italian ] = "Inserisci";\
            Text[ danish ] = "Indsæt";\
            Text[ swedish ] = "Infoga";\
            Text[ polish ] = "Wstaw";\
            Text[ portuguese_brazilian ] = "Insert";\
            Text[ japanese ] = "‘}“ü";\
            Text[ korean ] = "»ðÀÔ";\
            Text[ chinese_simplified ] = "²åÈë";\
            Text[ chinese_traditional ] = "´¡¤J";\
            Text[ arabic ] = "ÅÏÑÇÌ";\
            Text[ turkish ] = "Ekle";\
            Text[ language_user1 ] = " ";\
        };                                                          \
        CancelButton BT_CANCEL                                      \
        {                                                           \
            Pos = MAP_APPFONT ( 162 , 23 ) ;                        \
            Size = MAP_APPFONT ( 50 , 14 ) ;                        \
            Text = "Schließen";                                     \
            Text[English] = "Close";                                \
            Text[ english_us ] = "Close";\
            Text[ portuguese ] = "Fechar";\
            Text[ russian ] = "Çàêðûòü";\
            Text[ greek ] = "Êëåßóéìï";\
            Text[ dutch ] = "Sluiten";\
            Text[ french ] = "Fermer";\
            Text[ spanish ] = "Cerrar";\
            Text[ italian ] = "Chiudi";\
            Text[ danish ] = "Luk";\
            Text[ swedish ] = "Stäng";\
            Text[ polish ] = "Zamknij";\
            Text[ portuguese_brazilian ] = "Close";\
            Text[ japanese ] = "•‚¶‚é";\
            Text[ korean ] = "´Ý±â";\
            Text[ chinese_simplified ] = "¹Ø±Õ";\
            Text[ chinese_traditional ] = "Ãö³¬";\
            Text[ arabic ] = "ÅÛáÇÞ";\
            Text[ turkish ] = "Kapat";\
            Text[ language_user1 ] = " ";\
        };                                                          \
        HelpButton BT_HELP                                          \
        {                                                           \
            Pos = MAP_APPFONT ( 162 , 43 ) ;                        \
            Size = MAP_APPFONT ( 50 , 14 ) ;                        \
        };                                                          \
        PushButton BT_DEL                                           \
        {                                                           \
            Pos = MAP_APPFONT ( 162 , 63 ) ;                        \
            Size = MAP_APPFONT ( 50 , 14 ) ;                        \
            Text = "L~öschen" ;                                     \
            Text [ ENGLISH ] = "~Delete" ;                          \
            Text [ norwegian ] = "~Slett" ;                         \
            Text [ italian ] = "~Elimina" ;                         \
            Text [ portuguese_brazilian ] = "~Apagar" ;             \
            Text [ portuguese ] = "E~liminar" ;                     \
            Text [ finnish ] = "~Poista" ;                          \
            Text [ danish ] = "Slet" ;                              \
            Text [ french ] = "~Supprimer" ;                        \
            Text [ swedish ] = "~Radera" ;                         \
            Text [ dutch ] = "~Wissen" ;                            \
            Text [ spanish ] = "~Eliminar" ;                        \
            Text [ english_us ] = "~Delete" ;                       \
            TabStop = TRUE ;                                        \
            Text[ chinese_simplified ] = "ɾ³ý(~D)";               \
            Text[ russian ] = "Óäàëèòü";                            \
            Text[ polish ] = "Usuñ";                                \
            Text[ japanese ] = "íœ(~D)";                         \
            Text[ chinese_traditional ] = "§R°£(~D)";              \
            Text[ arabic ] = "ÍÐÝ";                                 \
            Text[ greek ] = "ÄéáãñáöÞ";\
            Text[ korean ] = "»èÁ¦(~D)";\
            Text[ turkish ] = "~Sil";\
            Text[ language_user1 ] = " ";\
        };                                                          \
        ListBox DCB_INDEX                                           \
        {                                                           \
            Pos = MAP_APPFONT ( 56 , 14) ;                          \
            Size = MAP_APPFONT ( DCB_INDEX_WIDTH , 56 ) ;           \
            TabStop = TRUE ;                                        \
            DropDown = TRUE ;                                       \
        };                                                          \
        ImageButton BT_NEW                                          \
        {                                                           \
            Pos = MAP_APPFONT ( 137 , 14 ) ;                        \
            Size = MAP_APPFONT ( 12 , 12 ) ;                        \
            QuickHelpText = "Neues benutzerdefiniertes Verzeichnis";            \
            QuickHelpText[English] = "New user defined index";      \
            QuickHelpText[ english_us ] = "New user-defined index";\
            QuickHelpText[ portuguese ] = "New user defined index";\
            QuickHelpText[ russian ] = "Íîâûé óêàçàòåëü ïîëüçîâàòåëÿ";\
            QuickHelpText[ greek ] = "Äçìéïõñãßá åõñåôçñßïõ ïñéóìÝíï áðü ôïí ÷ñÞóôç";\
            QuickHelpText[ dutch ] = "Nieuwe gebruikergedefinieerde index";\
            QuickHelpText[ french ] = "Definir un nouvel index personnalisé";\
            QuickHelpText[ spanish ] = "New user defined index";\
            QuickHelpText[ italian ] = "Nuovo indice personalizzato";\
            QuickHelpText[ danish ] = "Nyt brugerdefineret indeks";\
            QuickHelpText[ swedish ] = "Ny användardefinierad förteckning";\
            QuickHelpText[ polish ] = "Nowy indeks u¿ytkownika";\
            QuickHelpText[ portuguese_brazilian ] = "New user defined index";\
            QuickHelpText[ japanese ] = "V‚µ‚¢Õ°»Þ°Ý’è‚̍õˆø";\
            QuickHelpText[ korean ] = "New user defined index";\
            QuickHelpText[ chinese_simplified ] = "New user defined index";\
            QuickHelpText[ chinese_traditional ] = "·s¼W¦Û­q¥Ø¿ý";\
            QuickHelpText[ arabic ] = "ÝåÑÓ ÌÏíÏ ãÚÑÝ ãä ÞÈá ÇáãÓÊÎÏã";\
        };                                                          \
        ImageButton BT_PREVSAME                                     \
        {                                                           \
            Hide = TRUE ;                                           \
            Pos = MAP_APPFONT ( 162 , 80 ) ;                        \
            Size = MAP_APPFONT ( 24 , 14 ) ;                        \
            TabStop = TRUE ;                                        \
            SYMBOL = IMAGEBUTTON_FIRST ;                            \
        };                                                          \
        ImageButton BT_PREV                                         \
        {                                                           \
            Hide = TRUE ;                                           \
            Pos = MAP_APPFONT ( 162 , 97 ) ;                        \
            Size = MAP_APPFONT ( 24 , 14 ) ;                        \
            TabStop = TRUE ;                                        \
            SYMBOL = IMAGEBUTTON_PREV ;                             \
        };                                                          \
        ImageButton BT_NXT                                          \
        {                                                           \
            Hide = TRUE ;                                           \
            Pos = MAP_APPFONT ( 188 , 97 ) ;                        \
            Size = MAP_APPFONT ( 24 , 14 ) ;                        \
            TabStop = TRUE ;                                        \
            SYMBOL = IMAGEBUTTON_NEXT ;                             \
        };                                                          \
        ImageButton BT_NXTSAME                                      \
        {                                                           \
            Hide = TRUE ;                                           \
            Pos = MAP_APPFONT ( 188 , 80 ) ;                        \
            Size = MAP_APPFONT ( 24 , 14 ) ;                        \
            TabStop = TRUE ;                                        \
            SYMBOL = IMAGEBUTTON_LAST ;                             \
        };                                                          \
        GroupBox GB_INDEX                                           \
        {                                                           \
            Pos = MAP_APPFONT ( 6 , 3 ) ;                           \
            Size = MAP_APPFONT ( 151 , GB_HEIGHT ) ;                      \
            Text = "Markierung" ;                                   \
            Text [ ENGLISH ] = "Mark" ;                             \
            Text [ norwegian ] = "Merk" ;                           \
            Text [ italian ] = "Contrassegna" ;                     \
            Text [ portuguese_brazilian ] = "Marca" ;               \
            Text [ portuguese ] = "Selecção" ;                        \
            Text [ finnish ] = "Merkintä" ;                         \
            Text [ danish ] = "Markering" ;                             \
            Text [ french ] = "Marque" ;                            \
            Text [ swedish ] = "Markering" ;                        \
            Text [ dutch ] = "Markering" ;                          \
            Text [ spanish ] = "Marca" ;                            \
            Text [ english_us ] = "Selection" ;                    \
            Text[ chinese_simplified ] = "񈬀";                    \
            Text[ russian ] = "Âûäåëåíèå";                          \
            Text[ polish ] = "Zaznaczenie";                         \
            Text[ japanese ] = "‘I‘ð";                           \
            Text[ chinese_traditional ] = "¼Ð°O";                   \
            Text[ arabic ] = "ÇáÊÍÏíÏ";                      \
            Text[ greek ] = "ÓÞìáíóç";\
            Text[ korean ] = "¼±ÅÃ";\
            Text[ turkish ] = "Seçim";\
            Text[ language_user1 ] = " ";\
        };                                                          \
        FixedText LBL_INDEX                                         \
        {                                                           \
            Pos = MAP_APPFONT ( 12 , 16 ) ;                         \
            Size = MAP_APPFONT ( 40 , 10 ) ;                        \
            Text = "~Verzeichnis" ;                                 \
            Text [ ENGLISH ] = "~Index" ;                           \
            Text [ norwegian ] = "~Index" ;                         \
            Text [ italian ] = "Indice" ;                          \
            Text [ portuguese_brazilian ] = "~Índice" ;             \
            Text [ portuguese ] = "~Índice" ;                       \
            Text [ finnish ] = "~Hakemisto" ;                       \
            Text [ danish ] = "Indeks" ;                           \
            Text [ french ] = "~Type" ;                             \
            Text [ swedish ] = "Fö~rteckning" ;                     \
            Text [ dutch ] = "~Index" ;                             \
            Text [ spanish ] = "Ín~dice" ;                          \
            Text [ english_us ] = "~Index" ;                        \
            Left = TRUE ;                                           \
            Text[ chinese_simplified ] = "Ŀ¼(~I)";               \
            Text[ russian ] = "Óêàçàòåëü";                          \
            Text[ polish ] = "Indeks";                              \
            Text[ japanese ] = "õˆø(~I)";                         \
            Text[ chinese_traditional ] = "¥Ø¿ý(~I)";              \
            Text[ arabic ] = "ÝåÑÓ";                                \
            Text[ greek ] = "ÅõñåôÞñéï";\
            Text[ korean ] = "»öÀÎ(~I)";\
            Text[ language_user1 ] = " ";\
            Text[ turkish ] = "~Dizin";\
        };                                                          \
        Edit SL_ENTRY                                               \
        {                                                           \
            Border = TRUE ;                                         \
            Pos = MAP_APPFONT ( 56 , 29 ) ;                         \
            Size = MAP_APPFONT ( 94 , 12 ) ;                        \
            TabStop = TRUE ;                                        \
            Left = TRUE ;                                           \
        };                                                          \
        FixedText LBL_ENTRY                                         \
        {                                                           \
            Pos = MAP_APPFONT ( 12 , 31 ) ;                         \
            Size = MAP_APPFONT ( 27 , 8 ) ;                         \
            Text = "~Eintrag" ;                                     \
            Text [ ENGLISH ] = "~Entry" ;                           \
            Text [ norwegian ] = "~Inngang" ;                       \
            Text [ italian ] = "Voc~e" ;                            \
            Text [ portuguese_brazilian ] = "~Entrada" ;            \
            Text [ portuguese ] = "E~ntrada" ;                      \
            Text [ finnish ] = "~Hakusana" ;                        \
            Text [ danish ] = "Element" ;                           \
            Text [ french ] = "~Entrée" ;                           \
            Text [ swedish ] = "~Post" ;                       \
            Text [ dutch ] = "~Item" ;                              \
            Text [ spanish ] = "~Entrada" ;                         \
            Text [ english_us ] = "~Entry" ;                        \
            Left = TRUE ;                                           \
            Text[ chinese_simplified ] = "ÌõÄ¿(~E)";               \
            Text[ russian ] = "Ýëåìåíò";                            \
            Text[ polish ] = "Wpis";                                \
            Text[ japanese ] = "€–Ú(~E)";                         \
            Text[ chinese_traditional ] = "¶µ¥Ø(~E)";              \
            Text[ arabic ] = "ÇáÅÏÎÇá";                               \
            Text[ greek ] = "ÅããñáöÞ";\
            Text[ korean ] = "Ç׸ñ(~E)";\
            Text[ turkish ] = "~Giriþ";\
            Text[ language_user1 ] = " ";\
        };                                                          \
        FixedText LBL_KEY                                           \
        {                                                           \
            Disable = TRUE ;                                        \
            Pos = MAP_APPFONT ( 12 , 46 ) ;                         \
            Size = MAP_APPFONT ( 42 , 8 ) ;                         \
            Text = "~1. Schlüssel" ;                                \
            Text [ ENGLISH ] = "~1. Key" ;                          \
            Text [ norwegian ] = "~1. Nøkkel" ;                     \
            Text [ italian ] = "Chiave ~1" ;                        \
            Text [ portuguese_brazilian ] = "~1. Tecla" ;           \
            Text [ portuguese ] = "~1ª chave" ;                    \
            Text [ finnish ] = "~1. avain" ;                        \
            Text [ danish ] = "1. nøgle" ;                         \
            Text [ french ] = "~1re clé" ;                      \
            Text [ swedish ] = "Sorteringskod ~1" ;                  \
            Text [ dutch ] = "~1e sleutel" ;                        \
            Text [ spanish ] = "~1ra clave" ;                      \
            Text [ english_us ] = "~1st key" ;                      \
            Left = TRUE ;                                           \
            Text[ chinese_simplified ] = "µÚÒ»¸ö¹Ø¼ü×Ö";            \
            Text[ russian ] = "1-ûé êëþ÷";                          \
            Text[ polish ] = "Pierwszy klucz";                      \
            Text[ japanese ] = "·° 1";                         \
            Text[ chinese_traditional ] = "²Ä¤@­ÓÃöÁä¦r(~K)";       \
            Text[ arabic ] = "ÇáãÝÊÇÍ ÇáÃæá";                       \
            Text[ greek ] = "~1ï êëåéäß";\
            Text[ korean ] = "1¹øÂ° Ű";\
            Text[ turkish ] = "~1. Anahtar";\
            Text[ language_user1 ] = " ";\
        };                                                          \
        ComboBox DCB_KEY                                            \
        {                                                           \
            Disable = TRUE ;                                        \
            Pos = MAP_APPFONT ( 56 , 44 ) ;                         \
            Size = MAP_APPFONT ( 94 , 56 ) ;                        \
            TabStop = TRUE ;                                        \
            DropDown = TRUE ;                                       \
        };                                                          \
        FixedText LBL_KEY2                                          \
        {                                                           \
            Disable = TRUE ;                                        \
            Pos = MAP_APPFONT ( 12 , 62 ) ;                         \
            Size = MAP_APPFONT ( 42 , 8 ) ;                         \
            Text = "~2. Schlüssel" ;                                \
            Text [ ENGLISH ] = "~2. Key" ;                          \
            Text [ norwegian ] = "~2. Nøkkel" ;                     \
            Text [ italian ] = "Chiave ~2" ;                        \
            Text [ portuguese_brazilian ] = "~2. Tecla" ;           \
            Text [ portuguese ] = "~2ª chave" ;                    \
            Text [ finnish ] = "~2. avain" ;                        \
            Text [ danish ] = "2. nøgle" ;                         \
            Text [ french ] = "~2ème clé" ;                     \
            Text [ swedish ] = "Sorteringskod ~2" ;                  \
            Text [ dutch ] = "~2e sleutel" ;                        \
            Text [ spanish ] = "~2da clave" ;                      \
            Text [ english_us ] = "~2nd key" ;                      \
            Left = TRUE ;                                           \
            Text[ chinese_simplified ] = "µÚ¶þ¸ö¹Ø¼ü×Ö";            \
            Text[ russian ] = "2-îé êëþ÷";                          \
            Text[ polish ] = "Drugi klucz";                         \
            Text[ japanese ] = "·° 2";                         \
            Text[ chinese_traditional ] = "²Ä¤G­ÓÃöÁä¦r(~E)";       \
            Text[ arabic ] = "ÇáãÝÊÇÍ ÇáËÇäí";                      \
            Text[ greek ] = "~2ï Êëåéäß";\
            Text[ korean ] = "2¹øÂ° Ű";\
            Text[ turkish ] = "~2. Anahtar";\
            Text[ language_user1 ] = " ";\
        };                                                          \
        ComboBox DCB_KEY2                                           \
        {                                                           \
            Disable = TRUE ;                                        \
            Pos = MAP_APPFONT ( 56 , 59 ) ;                         \
            Size = MAP_APPFONT ( 94 , 56 ) ;                        \
            TabStop = TRUE ;                                        \
            DropDown = TRUE ;                                       \
        };                                                          \
        FixedText LBL_LEVEL                                         \
        {                                                           \
            Pos = MAP_APPFONT ( 12 , 76 ) ;                         \
            Size = MAP_APPFONT ( 21 , 8 ) ;                         \
            Text = "St~ufe" ;                                       \
            Text [ ENGLISH ] = "~Level" ;                           \
            Text [ norwegian ] = "~Nivå" ;                          \
            Text [ italian ] = "Livello" ;                         \
            Text [ portuguese_brazilian ] = "~Nível" ;              \
            Text [ portuguese ] = "~Nível" ;                        \
            Text [ finnish ] = "~Taso" ;                            \
            Text [ danish ] = "Niveau" ;                             \
            Text [ french ] = "~Niveau" ;                           \
            Text [ swedish ] = "Ni~vå" ;                            \
            Text [ dutch ] = "~Niveau" ;                            \
            Text [ spanish ] = "~Nivel" ;                           \
            Text [ english_us ] = "~Level" ;                        \
            Left = TRUE ;                                           \
            Text[ chinese_simplified ] = "¼¶(~L)";                 \
            Text[ russian ] = "Óðîâåíü";                            \
            Text[ polish ] = "Poziom";                              \
            Text[ japanese ] = "ÚÍÞÙ(~L)";                         \
            Text[ chinese_traditional ] = "¯Å(~L)";                \
            Text[ arabic ] = "ÇáãÓÊæì";                             \
            Text[ greek ] = "Åðßðåäï";\
            Text[ korean ] = "¼öÁØ(~L)";\
            Text[ turkish ] = "D~üzey";\
            Text[ language_user1 ] = " ";\
        };                                                          \
        NumericField SL_LEVEL                                       \
        {                                                           \
            Border = TRUE ;                                         \
            Pos = MAP_APPFONT ( 56 , 74 ) ;                         \
            Size = MAP_APPFONT ( 18 , 12 ) ;                        \
            TabStop = TRUE ;                                        \
            Left = TRUE ;                                           \
            Repeat = TRUE ;                                         \
            Spin = TRUE ;                                           \
            Minimum = 1 ;                                           \
            Maximum = 5 ;                                           \
            Value = 1 ;                                             \
            Last = 4 ;                                              \
            SpinSize = 1 ;                                          \
        };                                                          \
        CheckBox CB_MAIN_ENTRY                                      \
        {                                                                       \
            Pos = MAP_APPFONT ( 12 , 76 ) ;                                     \
            Size = MAP_APPFONT ( 100 , 8 ) ;                                    \
            Text = "Ha~upteintrag" ;                                            \
            Text [ ENGLISH ] = "~Main entry" ;                                  \
            Text[ english_us ] = "~Main entry";\
            Text[ portuguese ] = "~Entrada principal";\
            Text[ russian ] = "Îñíîâíîé ýëåìåíò";\
            Text[ greek ] = "Êýñéá åããñáöÞ";\
            Text[ dutch ] = "~Hoofditem";\
            Text[ french ] = "~Entrée principale";\
            Text[ spanish ] = "~Entrada principal";\
            Text[ italian ] = "Voce principale";\
            Text[ danish ] = "Hovedelement";\
            Text[ swedish ] = "H~uvudpost";\
            Text[ polish ] = "Wpis g³ówny";\
            Text[ portuguese_brazilian ] = "~Main entry";\
            Text[ japanese ] = "Žå€–Ú(~M)";\
            Text[ korean ] = "ÁÖ Ç׸ñ(~M)";\
            Text[ chinese_simplified ] = "Ö÷ÌõÄ¿(~M)";\
            Text[ chinese_traditional ] = "¥D¶µ¥Ø(~M)";\
            Text[ arabic ] = "ÅÏÎÇá ÑÆíÓí";\
            Text[ turkish ] = "A~na giriþ";\
            Text[ language_user1 ] = " ";\
        };                                                                      \
        CheckBox CB_APPLY_TO_ALL                                                \
        {                                                                       \
            Pos = MAP_APPFONT ( 12 , 90 ) ;                                     \
            Size = MAP_APPFONT ( 140 , 12 ) ;                                   \
            Text = "~Auf alle gleichen Texte anwenden." ;                       \
            Text [ ENGLISH ] = "~Apply to all similar texts." ;                 \
            Hide = TRUE;                                                        \
            Text[ english_us ] = "~Apply to all similar texts.";                \
            Text[ portuguese ] = "~Aplicar em todos os textos semelhantes";     \
            Text[ russian ] = "Ïðèìåíèòü êî âñåì îäèíàêîâûì òåêñòàì";           \
            Text[ dutch ] = "~Voor alle dezelfde tekst gebruiken";              \
            Text[ french ] = "~Appliquer à tous les textes similaires.";         \
            Text[ spanish ] = "~Aplicar a todos los textos iguales.";           \
            Text[ italian ] = "~Applica a tutti i testi simili";                 \
            Text[ danish ] = "Anvend på alle lignende tekster.";                    \
            Text[ swedish ] = "~Använd på alla liknande texter.";               \
            Text[ polish ] = "Zastosuj w podobnych tekstach.";                  \
            Text[ portuguese_brazilian ] = "~Apply to all similar texts.";      \
            Text[ japanese ] = "‚·‚ׂĂ̎—‚Ä‚¢‚é•¶Žš—ñ‚É“K—p(~A)";               \
            Text[ chinese_simplified ] = "ÊÊÓÃÓÚÏàͬµÄÕýÎÄ(~A)";           \
            Text[ chinese_traditional ] = "¥Î©ó©Ò¦³¬Û¦Pªº¤º¤å(~A)";            \
            Text[ arabic ] = "ÊØÈíÞ Úáì ßá ÇáäÕæÕ ÇáããÇËáÉ.";                   \
            Text[ greek ] = "ÅöáñìïãÞ óå üëá ôá ðáñüìïéá êåßìåíá.";\
            Text[ korean ] = "Àüü À¯»ç ÅØ½ºÆ® Àû¿ë(~A)";\
            Text[ turkish ] = "~Tüm eþ metinlere uygula.";\
            Text[ language_user1 ] = " ";\
        };                                                                      \
        CheckBox CB_CASESENSITIVE                                                \
        {                                                                       \
            Pos = MAP_APPFONT ( 18 , 104 ) ;                                     \
            Size = MAP_APPFONT ( 134 , 12 ) ;                                   \
            Text = "E~xakte Suche" ;                       \
            Text [ ENGLISH ] = "Match case" ;                 \
            Hide = TRUE;\
            Text[ english_us ] = "Ma~tch case";\
            Text[ portuguese ] = "Procura e~xacta";\
            Text[ russian ] = "Òî÷íûé ïîèñê";\
            Text[ greek ] = "ÁêñéâÞò áíáæÞôçóç";\
            Text[ dutch ] = "~Exact dezelfde tekens zoeken";\
            Text[ french ] = "Respecter la ~casse";\
            Text[ spanish ] = "Búsqueda e~xacta";\
            Text[ italian ] = "Ricerca esatta";\
            Text[ danish ] = "Søg eksakt";\
            Text[ swedish ] = "E~xakt sökning";\
            Text[ polish ] = "Dok³adne wyszukiwanie";\
            Text[ portuguese_brazilian ] = "Match case";\
            Text[ japanese ] = "Š®‘S‚É“¯ˆê‚È’PŒê‚ÌŒŸõ";\
            Text[ korean ] = "´ë/¼Ò¹®ÀÚ ±¸ºÐ(~T)";\
            Text[ chinese_simplified ] = "¾«È·ËÑѰ";\
            Text[ chinese_traditional ] = "ºëÚÌ´M§ä";\
            Text[ arabic ] = "ÈÍË ÏÞíÞ";\
            Text[ turkish ] = "BÜYÜK/küçük ~harf duyarlý";\
        };                                                                      \
        CheckBox CB_WORDONLY                                                \
        {                                                                       \
            Pos = MAP_APPFONT ( 18 , 118 ) ;                                     \
            Size = MAP_APPFONT ( 134 , 12 ) ;                                   \
            Text = "Nur ganze ~Wörter" ;                       \
            Text [ ENGLISH ] = "Whole words only" ;                 \
            Hide = TRUE;\
            Text[ english_us ] = "~Whole words only";\
            Text[ portuguese ] = "Só ~palavras inteiras";\
            Text[ russian ] = "Òîëüêî ïîëíûå ñëîâà";\
            Text[ greek ] = "Ìüíï ïëüêëçñåò ëÝîåéò";\
            Text[ dutch ] = "Alleen hele ~woorden";\
            Text[ french ] = "~Mots entiers";\
            Text[ spanish ] = "Solo palabras e~nteras";\
            Text[ italian ] = "Solo parole intere";\
            Text[ danish ] = "Kun hele ord";\
            Text[ swedish ] = "Bara hela ~ord";\
            Text[ polish ] = "Tylko ca³e wyrazy";\
            Text[ portuguese_brazilian ] = "Whole words only";\
            Text[ japanese ] = "’PŒê’PˆÊ‚ł̂Ý";\
            Text[ korean ] = "Àüü ´Ü¾î¸¸(~W)";\
            Text[ chinese_simplified ] = "Ö»ÔÊÐíÕû¸ö´Ê";\
            Text[ chinese_traditional ] = "¥u¬O¾ã­Ó¦r";\
            Text[ arabic ] = "ßáãÇÊ ßÇãáÉ ÝÞØ";\
            Text[ turkish ] = "Yalnýzca ~tam sözcükler bul";\
        };                                                                      \
    };

ModalDialog DLG_EDIT_IDXMARK
{
    OutputSize = TRUE ;
    Moveable = TRUE ;
    Closeable = TRUE;
    Sizeable = FALSE ;
    HelpID = FN_EDIT_IDX_ENTRY_DLG;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 218 , 118 ) ;
    #define GB_HEIGHT 109
    #define DCB_INDEX_WIDTH 94
    #define WINDOW_HEIGHT   118
    IDX_DIALOG_WINDOW
};
ModelessDialog DLG_INSIDXMARK
{
    OutputSize = TRUE ;
    Moveable = TRUE ;
    Closeable = TRUE;
    Sizeable = FALSE ;
//  Zoomable = TRUE ;
    HelpID = FN_INSERT_IDX_ENTRY_DLG;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 218 , 138) ;
//  Moveable = TRUE ;
    #define GB_HEIGHT 129
    #define DCB_INDEX_WIDTH 79
    #define WINDOW_HEIGHT   138
    IDX_DIALOG_WINDOW
};
ModalDialog DLG_NEW_USER_IDX
{
    OutputSize = TRUE ;
    Moveable = TRUE ;
    Closeable = TRUE;
    Sizeable = FALSE ;
    HelpID = HID_DLG_NEW_USER_IDX;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 194 , 60 ) ;
    Text = "Neues benutzerdefiniertes  Verzeichnis anlegen" ;
    Text [ ENGLISH ] = "Create new user-defined index" ;
    OKButton PB_OK
    {
        Pos = MAP_APPFONT ( 141 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        DefButton = TRUE ;
    };
    CancelButton PB_CANCEL
    {
        Pos = MAP_APPFONT ( 141 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
    };
    HelpButton PB_HELP
    {
        Pos = MAP_APPFONT ( 141 , 43 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
    };
    GroupBox GB_NAME
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 132 , 54 ) ;
        Text = "Neues Benutzerverzeichnis" ;
        Text [ ENGLISH ] = "New user index name" ;

        Text[ english_us ] = "New user index";
        Text[ portuguese ] = "Novo índice personalizado";
        Text[ russian ] = "Íîâûé óêàçàòåëü ïîëüçîâàòåëÿ";
        Text[ greek ] = "Äçìéïõñãßá åõñåôçñßïõ ÷ñÞóôç";
        Text[ dutch ] = "Nieuwe gebruikersindex";
        Text[ french ] = "Nouvel index personnalisé";
        Text[ spanish ] = "Nuevo índice de usuario";
        Text[ italian ] = "Nuovo indice personalizzato";
        Text[ danish ] = "Nyt brugerindeks";
        Text[ swedish ] = "Ny användarförteckning";
        Text[ polish ] = "Nowy indeks u¿ytkownika";
        Text[ portuguese_brazilian ] = "New user index name";
        Text[ japanese ] = "V‚µ‚¢Õ°»Þ°’è‹`‚̍õˆø";
        Text[ korean ] = "»õ·Î¿î »ç¿ëÀÚ »öÀÎ";
        Text[ chinese_simplified ] = "н¨Óû§Ä¿Â¼";
        Text[ chinese_traditional ] = "·s«Ø¦Û­q¥Ø¿ý";
        Text[ arabic ] = "ÝåÑÓ ãÓÊÎÏã ÌÏíÏ";
        Text[ turkish ] = "Yeni kullanýcý dizini";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_NAME
    {
        Pos = MAP_APPFONT ( 12 , 16 ) ;
        Size = MAP_APPFONT ( 40 , 10 ) ;
        Text = "~Name" ;
        Text [ ENGLISH ] = "Name" ;

        Text[ english_us ] = "~Name";
        Text[ portuguese ] = "~Nome";
        Text[ russian ] = "Èìÿ";
        Text[ greek ] = "¼íïìá";
        Text[ dutch ] = "~Naam";
        Text[ french ] = "~Nom";
        Text[ spanish ] = "~Nombre";
        Text[ italian ] = "~Nome";
        Text[ danish ] = "Navn";
        Text[ swedish ] = "~Namn";
        Text[ polish ] = "Nazwa";
        Text[ portuguese_brazilian ] = "Name";
        Text[ japanese ] = "–¼‘O(~N)";
        Text[ korean ] = "À̸§(~N)";
        Text[ chinese_simplified ] = "Ãû³Æ(~N)";
        Text[ chinese_traditional ] = "¦WºÙ(~N)";
        Text[ arabic ] = "ÇÓã";
        Text[ turkish ] = "~Ad";
        Text[ language_user1 ] = " ";
    };
    Edit ED_NAME
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 55 , 15 ) ;
        Size = MAP_APPFONT ( 80 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
    };
    Text[ english_us ] = "Create New User-defined Index";
    Text[ portuguese ] = "Definir novo índice personalizado";
    Text[ russian ] = "Ñîçäàòü íîâûé óêàçàòåëü ïîëüçîâàòåëÿ";
    Text[ greek ] = "Äçìéïõñãßá íÝïõ åõñåôçñßïõ ÷ñÞóôç";
    Text[ dutch ] = "Nieuwe gebruikersindex definiëren";
    Text[ french ] = "Création d'un nouvel index personnalisé";
    Text[ spanish ] = "Crear nuevo índice de usuario";
    Text[ italian ] = "Definisci nuovo indice personalizzato";
    Text[ danish ] = "Opret nyt brugerdefineret indeks";
    Text[ swedish ] = "Skapa ny användardefinierad förteckning";
    Text[ polish ] = "Utwórz nowy indeks zdeiniowany przez u¿ytkownika";
    Text[ portuguese_brazilian ] = "Define new user index";
    Text[ japanese ] = "V‚µ‚¢Õ°»Þ°’è‹`‚̍õˆø‚̍쐬";
    Text[ korean ] = "»õ·Î¿î »ç¿ëÀÚ Á¤ÀÇ »öÀÎ ¸¸µé±â";
    Text[ chinese_simplified ] = "н¨Óû§×Ô¶¨Ä¿Â¼";
    Text[ chinese_traditional ] = "·s¼W¦Û­qªº¥Ø¿ý";
    Text[ arabic ] = "ÅäÔÇÁ ÝåÑÓ ÌÏíÏ ãõÚóÑøóÝ ãä ÞÈá ÇáãÓÊÎÏã";
    Text[ turkish ] = "Yeni kullanýcý tanýmlý dizin oluþtur";
    Text[ language_user1 ] = " ";
};

String STR_IDXMRK_EDIT
{
    Text = "Verzeichniseintrag bearbeiten" ;
    Text [ ENGLISH ] = "Edit index entry" ;
    Text [ norwegian ] = "Rediger stikkordregisterinngang" ;
    Text [ italian ] = "Modifica voce di indice" ;
    Text [ portuguese_brazilian ] = "Editar entrada de índice" ;
    Text [ portuguese ] = "Editar entrada de índice" ;
    Text [ finnish ] = "Muokkaa hakusanaa" ;
    Text [ danish ] = "Rediger indekselement" ;
    Text [ french ] = "Édition d'une entrée d'index" ;
    Text [ swedish ] = "Redigera förteckningspost" ;
    Text [ dutch ] = "Indexgegeven bewerken" ;
    Text [ spanish ] = "Editar entrada de índice" ;
    Text [ english_us ] = "Edit Index Entry" ;
    Text[ chinese_simplified ] = "±à¼­Ä¿Â¼ÌõÄ¿";
    Text[ russian ] = "Ïðàâêà ýëåìåíòà óêàçàòåëÿ";
    Text[ polish ] = "Edytuj wpis do indeksu";
    Text[ japanese ] = "õˆø€–ڂ̕ҏW";
    Text[ chinese_traditional ] = "½s¿è¥Ø¿ý¶µ¥Ø";
    Text[ arabic ] = "ÊÍÑíÑ ÅÏÎÇá ÝåÑÓí";
    Text[ greek ] = "Åðåîåñãáóßá åããñáöÞò åõñåôçñßïõ";
    Text[ korean ] = "»öÀÎ Ç׸ñ ÆíÁý";
    Text[ turkish ] = "Dizin giriþini düzenle";
    Text[ language_user1 ] = " ";
};
String STR_IDXMRK_INSERT
{
    /* ### ACHTUNG: Neuer Text in Resource? Verzeichniseintrag einfügen : Verzeichniseintrag einf³gen */
    Text = "Verzeichniseintrag einfügen" ;
    Text [ ENGLISH ] = "Insert index entry" ;
    Text [ norwegian ] = "Sett inn oppføring i stikkkordregister" ;
    Text [ italian ] = "Inserisci voce di indice" ;
    Text [ portuguese_brazilian ] = "Inserir entrada de índice" ;
    Text [ portuguese ] = "Inserir entrada no índice remissivo" ;
    Text [ finnish ] = "Lisää hakemistotekstin" ;
    Text [ danish ] = "Indsæt indekselement" ;
    Text [ french ] = "Insertion d'une entrée d'index" ;
    Text [ swedish ] = "Infoga förteckningspost" ;
    Text [ dutch ] = "Indexgegeven invoegen" ;
    Text [ spanish ] = "Insertar una entrada de índice" ;
    Text [ english_us ] = "Insert Index Entry" ;
    Text[ chinese_simplified ] = "²åÈëË÷ÒýÌõÄ¿";
    Text[ russian ] = "Âñòàâèòü ýëåìåíò óêàçàòåëÿ";
    Text[ polish ] = "Wstaw wpis do indeksu";
    Text[ japanese ] = "–ÚŽŸ‚ƍõˆø€–Ú‚Ì‘}“ü";
    Text[ chinese_traditional ] = "´¡¤J¥Ø¿ý±ø¥Ø";
    Text[ arabic ] = "ÅÏÑÇÌ ÅÏÎÇá ÝåÑÓí";
    Text[ greek ] = "ÐñïóèÞêç åããñáöÞò åõñåôçñßïõ";
    Text[ korean ] = "»öÀÎ Ç׸ñ »ðÀÔ";
    Text[ turkish ] = "Dizin giriþi ekle";
    Text[ language_user1 ] = " ";
};

#define     AUTH_DIALOG_WINDOW  \
    Window  WIN_DLG                                 \
    {                                                   \
        Pos = MAP_APPFONT ( 0 , 0 ) ;                   \
        Size = MAP_APPFONT ( 218 , 118 + RADIO_BUTTON_HEIGHT) ;     \
        RadioButton RB_FROMCOMPONENT                                \
        {                                                           \
            Pos = MAP_APPFONT ( 12 , 14 ) ;                         \
            Size = MAP_APPFONT ( 147 , 12 ) ;                       \
            Text = "Aus Literatur~datenbank" ;                      \
            Text [ ENGLISH ] = "Form bibliography database" ;       \
            Text[ english_us ] = "From bibliography ~database";\
            Text[ portuguese ] = "A partir da ~base de dados bibliográfica";\
            Text[ russian ] = "Èç áàçû äàííûõ áèáëèîãðàôèè";\
            Text[ greek ] = "Áðü ôç âÜóç ~äåäïìÝíùí âéâëéïãñáößáò";\
            Text[ dutch ] = "Uit ~literatuur-database";\
            Text[ french ] = "À partir de la ~base de données bibliographique";\
            Text[ spanish ] = "De la base de datos ~bibliográfica";\
            Text[ italian ] = "Dal ~database bibliografico";\
            Text[ danish ] = "fra litteraturdatabasen";\
            Text[ swedish ] = "Från litteratur~databas";\
            Text[ polish ] = "Z bibliograficznej bazy danych";\
            Text[ portuguese_brazilian ] = "Form bibliography database";\
            Text[ japanese ] = "‘ ‘ŠÇ—ÃÞ°ÀÍÞ°½‚©‚ç(~D)";\
            Text[ korean ] = "Âü°í¹®Çå µ¥ÀÌÅͺ£À̽º·Î ºÎÅÍ(~D)";\
            Text[ chinese_simplified ] = "²ÉÓÃÎÄÏ×Êý¾Ý¿â";\
            Text[ chinese_traditional ] = "±q¤åÄm¸ê®Æ®w";\
            Text[ arabic ] = "ãä ÞÇÚÏÉ ÈíÇäÇÊ ÇáãÑÇÌÚ";\
            Text[ turkish ] = "Kaynakça veritabanýndan";\
        };                                                          \
        RadioButton RB_FROMDOCCONTENT                               \
        {                                                           \
            Pos = MAP_APPFONT ( 12,  29 ) ;                         \
            Size = MAP_APPFONT ( 147 , 12 ) ;                       \
            Text = "~Aus Dokumentinhalt" ;                          \
            Text [ ENGLISH ] = "From document content" ;            \
            Text[ english_us ] = "~From document content";\
            Text[ portuguese ] = "A partir do ~conteúdo do documento";\
            Text[ russian ] = "Èç ñîäåðæèìîãî äîêóìåíòà";\
            Text[ greek ] = "~Áðü ôï ðåñéå÷üìåíï ôïõ åããñÜöïõ";\
            Text[ dutch ] = "Uit ~documentinhoud";\
            Text[ french ] = "À partir du contenu du ~document";\
            Text[ spanish ] = "~Del contenido del documento";\
            Text[ italian ] = "Dal contenuto del documento";\
            Text[ danish ] = "fra dokumentindholdet";\
            Text[ swedish ] = "~Från dokumentinnehåll";\
            Text[ polish ] = "Z zawartoœci dokumentu";\
            Text[ portuguese_brazilian ] = "From document content";\
            Text[ japanese ] = "•¶‘“à—e‚©‚ç(~F)";\
            Text[ korean ] = "¹®¼­ ³»¿ë¿¡¼­ ºÎÅÍ(~F)";\
            Text[ chinese_simplified ] = "²ÉÓÃÎĵµÄÚÈÝ";\
            Text[ chinese_traditional ] = "±q¤å¥ó¤º®e";\
            Text[ arabic ] = "ãä ãÍÊæíÇÊ ÇáãÓÊäÏ";\
            Text[ turkish ] = "~Belge içeriðinden";\
        };                                                          \
        FixedText FT_ENTRY                              \
        {                                               \
            Pos = MAP_APPFONT ( 12 , 15 + RADIO_BUTTON_HEIGHT) ; \
            Size = MAP_APPFONT ( 60 , 8 ) ;             \
            Text = "~Kurzbezeichnung" ;                 \
            Text [ ENGLISH ] = "Short name" ;           \
            Text[ english_us ] = "Short ~name";\
            Text[ portuguese ] = "~Abreviatura";\
            Text[ russian ] = "Ñîêðàùåííîå íàçâàíèå";\
            Text[ greek ] = "Óõíôïìïãñáößá";\
            Text[ dutch ] = "Beknopte aand~uiding";\
            Text[ french ] = "~Abrégé";\
            Text[ spanish ] = "Abre~viatura";\
            Text[ italian ] = "Abbreviazione";\
            Text[ danish ] = "Kort betegnelse";\
            Text[ swedish ] = "~Kort beteckning";\
            Text[ polish ] = "Skrót";\
            Text[ portuguese_brazilian ] = "Short name";\
            Text[ japanese ] = "—ªÌ(~N)";\
            Text[ korean ] = "ªÀº À̸§(~N)";\
            Text[ chinese_simplified ] = "¼ò³Æ(~N)";\
            Text[ chinese_traditional ] = "²µu´y­z(~N)";\
            Text[ arabic ] = "ÇÓã ãÎÊÕÑ";\
            Text[ turkish ] = "K~ýsaltma";\
            Text[ language_user1 ] = " ";\
        };                                              \
        Edit ED_ENTRY                                   \
        {                                               \
            Border = TRUE ;                             \
            Pos = MAP_APPFONT ( 75 , 14 + RADIO_BUTTON_HEIGHT) ; \
            Size = MAP_APPFONT ( 74 , 12 ) ;            \
            TabStop = TRUE ;                            \
            Left = TRUE ;                               \
        };                                              \
        ListBox LB_ENTRY                                   \
        {                                               \
            Border = TRUE ;                             \
            Pos = MAP_APPFONT ( 75 , 14 + RADIO_BUTTON_HEIGHT) ; \
            Size = MAP_APPFONT ( 74 , 50 ) ;            \
            TabStop = TRUE ;                            \
            DropDown = TRUE ;                           \
        };                                              \
        FixedText FT_AUTHOR                             \
        {                                               \
            Pos = MAP_APPFONT ( 12 , 28 + RADIO_BUTTON_HEIGHT) ; \
            Size = MAP_APPFONT ( 60 , 8 ) ;             \
            Text = "Autor" ;                            \
            Text [ ENGLISH ] = "Author" ;               \
            Text[ english_us ] = "Author";\
            Text[ portuguese ] = "Autor";\
            Text[ russian ] = "Àâòîð";\
            Text[ greek ] = "ÓõíôÜêôçò";\
            Text[ dutch ] = "Auteur";\
            Text[ french ] = "Auteur";\
            Text[ spanish ] = "Autor";\
            Text[ italian ] = "Autore";\
            Text[ danish ] = "Forfatter";\
            Text[ swedish ] = "Författare";\
            Text[ polish ] = "Autor";\
            Text[ portuguese_brazilian ] = "Author";\
            Text[ japanese ] = "’˜ŽÒ";\
            Text[ korean ] = "ÀÛ¼ºÀÚ";\
            Text[ chinese_simplified ] = "×÷Õß";\
            Text[ chinese_traditional ] = "§@ªÌ";\
            Text[ arabic ] = "ÇáãÄáÝ";\
            Text[ turkish ] = "Yazan";\
            Text[ language_user1 ] = " ";\
        };                                              \
        FixedText   FI_AUTHOR                           \
        {                                               \
            Pos = MAP_APPFONT ( 75 , 28 + RADIO_BUTTON_HEIGHT) ; \
            Size = MAP_APPFONT ( 74 , 20 ) ;            \
            WordBreak = TRUE;                           \
        };                                              \
        FixedText FT_TITLE                              \
        {                                               \
            Pos = MAP_APPFONT ( 12 , 54 + RADIO_BUTTON_HEIGHT) ; \
            Size = MAP_APPFONT ( 60 , 8 ) ;             \
            Text = "Titel" ;                            \
            Text [ ENGLISH ] = "Title" ;                \
            Text[ english_us ] = "Title";\
            Text[ portuguese ] = "Título";\
            Text[ russian ] = "Çàãîëîâîê";\
            Text[ greek ] = "Ôßôëïò";\
            Text[ dutch ] = "Titel";\
            Text[ french ] = "Titre";\
            Text[ spanish ] = "Título";\
            Text[ italian ] = "Titolo";\
            Text[ danish ] = "Titel";\
            Text[ swedish ] = "Titel";\
            Text[ polish ] = "Tytu³";\
            Text[ portuguese_brazilian ] = "Title";\
            Text[ japanese ] = "À²ÄÙ";\
            Text[ korean ] = "Á¦¸ñ";\
            Text[ chinese_simplified ] = "±êÌâ";\
            Text[ chinese_traditional ] = "¼ÐÃD";\
            Text[ arabic ] = "ÇáÚäæÇä";\
            Text[ turkish ] = "Baþlýk";\
            Text[ language_user1 ] = " ";\
        };                                              \
        FixedText   FI_TITLE                            \
        {                                               \
            Pos = MAP_APPFONT ( 75 , 54  + RADIO_BUTTON_HEIGHT) ; \
            Size = MAP_APPFONT ( 74 , 20 ) ;            \
            WordBreak = TRUE;                           \
        };                                              \
        GroupBox GB_ENTRY                               \
        {                                               \
            Pos = MAP_APPFONT ( 6 , 3 ) ;               \
            Size = MAP_APPFONT ( 146 , 112  + RADIO_BUTTON_HEIGHT) ; \
            Text = "Eintrag" ;                          \
            Text [ ENGLISH ] = "Entry" ;                \
            Text[ english_us ] = "Entry";\
            Text[ portuguese ] = "Entrada";\
            Text[ russian ] = "Ýëåìåíò";\
            Text[ greek ] = "Êáôá÷þñéóç";\
            Text[ dutch ] = "Item";\
            Text[ french ] = "Entrée";\
            Text[ spanish ] = "Entrada";\
            Text[ italian ] = "Voce";\
            Text[ danish ] = "Element";\
            Text[ swedish ] = "Post";\
            Text[ polish ] = "Wpis";\
            Text[ portuguese_brazilian ] = "Entry";\
            Text[ japanese ] = "€–Ú";\
            Text[ korean ] = "Ç׸ñ";\
            Text[ chinese_simplified ] = "ÌõÄ¿";\
            Text[ chinese_traditional ] = "¶µ¥Ø";\
            Text[ arabic ] = "ÅÏÎÇá";\
            Text[ turkish ] = "Giriþ";\
            Text[ language_user1 ] = " ";\
        };                                              \
        OKButton PB_OK                                  \
        {                                               \
            Pos = MAP_APPFONT ( 162 , 6 ) ;             \
            Size = MAP_APPFONT ( 50 , 14 ) ;            \
            TabStop = TRUE ;                            \
            DefButton = TRUE ;                          \
            Text = "Einfügen";                          \
            Text[English] = "Insert";                   \
            Text[ english_us ] = "Insert";\
            Text[ portuguese ] = "Inserir";\
            Text[ russian ] = "Âñòàâèòü";\
            Text[ greek ] = "ÐñïóèÞêç";\
            Text[ dutch ] = "Invoegen";\
            Text[ french ] = "Insérer";\
            Text[ spanish ] = "Insertar";\
            Text[ italian ] = "Inserisci";\
            Text[ danish ] = "Indsæt";\
            Text[ swedish ] = "Infoga";\
            Text[ polish ] = "Wstaw";\
            Text[ portuguese_brazilian ] = "Insert";\
            Text[ japanese ] = "‘}“ü";\
            Text[ korean ] = "»ðÀÔ";\
            Text[ chinese_simplified ] = "²åÈë";\
            Text[ chinese_traditional ] = "´¡¤J";\
            Text[ arabic ] = "ÅÏÑÇÌ";\
            Text[ turkish ] = "Ekle";\
            Text[ language_user1 ] = " ";\
        };                                              \
        CancelButton PB_CANCEL                          \
        {                                               \
            Pos = MAP_APPFONT ( 162 , 23 ) ;            \
            Size = MAP_APPFONT ( 50 , 14 ) ;            \
            Text = "Schließen";                         \
            Text[English] = "Close";                    \
            Text[ english_us ] = "Close";\
            Text[ portuguese ] = "Fechar";\
            Text[ russian ] = "Çàêðûòü";\
            Text[ greek ] = "Êëåßóéìï";\
            Text[ dutch ] = "Sluiten";\
            Text[ french ] = "Fermer";\
            Text[ spanish ] = "Cerrar";\
            Text[ italian ] = "Chiudi";\
            Text[ danish ] = "Luk";\
            Text[ swedish ] = "Stäng";\
            Text[ polish ] = "Zamknij";\
            Text[ portuguese_brazilian ] = "Close";\
            Text[ japanese ] = "•‚¶‚é";\
            Text[ korean ] = "´Ý±â";\
            Text[ chinese_simplified ] = "¹Ø±Õ";\
            Text[ chinese_traditional ] = "Ãö³¬";\
            Text[ arabic ] = "ÅÛáÇÞ";\
            Text[ turkish ] = "Kapat";\
            Text[ language_user1 ] = " ";\
        };                                              \
        HelpButton PB_HELP                              \
        {                                               \
            Pos = MAP_APPFONT ( 162 , 43 ) ;            \
            Size = MAP_APPFONT ( 50 , 14 ) ;            \
        };                                              \
        PushButton PB_CREATEENTRY                       \
        {                                               \
            Pos = MAP_APPFONT ( 162 , 60 ) ;            \
            Size = MAP_APPFONT ( 50 , 14 ) ;            \
            Text = "Ne~u";                  \
            Text[English] = "New";             \
            Text[ english_us ] = "~New";\
            Text[ portuguese ] = "~Novo";\
            Text[ russian ] = "Ñîçäàòü";\
            Text[ greek ] = "Äçìéïõñãßá";\
            Text[ dutch ] = "Nie~uw";\
            Text[ french ] = "~Nouvelle entrée";\
            Text[ spanish ] = "N~uevo";\
            Text[ italian ] = "Nuovo";\
            Text[ danish ] = "Ny";\
            Text[ swedish ] = "N~y";\
            Text[ polish ] = "Nowy";\
            Text[ portuguese_brazilian ] = "Create entry";\
            Text[ japanese ] = "V‹Kì¬";\
            Text[ korean ] = "»õ·Î(~N)";\
            Text[ chinese_simplified ] = "н¨";\
            Text[ chinese_traditional ] = "·s«Ø";\
            Text[ arabic ] = "ÌÏíÏ";\
            Text[ turkish ] = "~Yeni";\
            Text[ language_user1 ] = " ";\
        };                                              \
        PushButton PB_EDITENTRY                       \
        {                                               \
            Pos = MAP_APPFONT ( 162 , 77 ) ;            \
            Size = MAP_APPFONT ( 50 , 14 ) ;            \
            Text = "~Bearbeiten";                  \
            Text[English] = "Edit";             \
            Text[ english_us ] = "Edit";\
            Text[ portuguese ] = "~Editar";\
            Text[ russian ] = "Ïðàâêà";\
            Text[ greek ] = "Åðåîåñãáóßá";\
            Text[ dutch ] = "~Bewerken";\
            Text[ french ] = "É~diter";\
            Text[ spanish ] = "~Editar";\
            Text[ italian ] = "~Modifica";\
            Text[ danish ] = "Rediger";\
            Text[ swedish ] = "Redigera";\
            Text[ polish ] = "~Edytuj";\
            Text[ portuguese_brazilian ] = "Edit";\
            Text[ japanese ] = "•ҏW(~Ej";\
            Text[ korean ] = "ÆíÁý";\
            Text[ chinese_simplified ] = "±à¼­";\
            Text[ chinese_traditional ] = "½s¿è";\
            Text[ arabic ] = "ÊÍÑíÑ";\
            Text[ turkish ] = "D~üzenle";\
        };                                              \
        String ST_CHANGE                                \
        {                                               \
            Text = "Ändern";                            \
            Text[English] = "Apply";                    \
            Text[ english_us ] = "Modify";\
            Text[ portuguese ] = "Modificar";\
            Text[ russian ] = "Èçìåíèòü";\
            Text[ greek ] = "ÁëëáãÞ";\
            Text[ dutch ] = "Wijzigen";\
            Text[ french ] = "Modifier";\
            Text[ spanish ] = "Modificar";\
            Text[ italian ] = "Cambia";\
            Text[ danish ] = "Modificer";\
            Text[ swedish ] = "Ändra";\
            Text[ polish ] = "Modyfikuj";\
            Text[ portuguese_brazilian ] = "Apply";\
            Text[ japanese ] = "•ύX";\
            Text[ korean ] = "¼öÁ¤";\
            Text[ chinese_simplified ] = "¸ü¸Ä";\
            Text[ chinese_traditional ] = "Åܧó";\
            Text[ arabic ] = "ÊØÈíÞ";\
            Text[ turkish ] = "Deðiþtir";\
            Text[ language_user1 ] = " ";\
        };                                              \
    };

ModalDialog DLG_EDIT_AUTHMARK
{
    OutputSize = TRUE ;
    Moveable = TRUE ;
    Closeable = TRUE ;
    Sizeable = FALSE ;
    HelpID = FN_EDIT_AUTH_ENTRY_DLG;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 218 , 118 ) ;
    #define RADIO_BUTTON_HEIGHT 0
    AUTH_DIALOG_WINDOW
};
ModelessDialog DLG_INSAUTHMARK
{
    OutputSize = TRUE ;
    Moveable = TRUE ;
    Closeable = TRUE ;
    Sizeable = FALSE ;
//  Zoomable = TRUE ;
    HelpID = FN_INSERT_AUTH_ENTRY_DLG;
    SVLook = TRUE ;
    #define RADIO_BUTTON_HEIGHT 30
    Size = MAP_APPFONT ( 218 , 118 + RADIO_BUTTON_HEIGHT) ;
//  Moveable = TRUE ;
    AUTH_DIALOG_WINDOW
};
ModalDialog DLG_CREATE_AUTH_ENTRY
{
    HelpId = HID_DLG_CREATE_AUTH_ENTRY;
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 365 , 203 ) ;
    Text = "Literatureintrag definieren" ;
    Text [ ENGLISH ] = "Define authority entry" ;
    Moveable = TRUE ;
    OKButton PB_OK
    {
        Pos = MAP_APPFONT ( 312 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        DefButton = TRUE ;
    };
    CancelButton PB_CANCEL
    {
        Pos = MAP_APPFONT ( 312 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
    };
    HelpButton PB_HELP
    {
        Pos = MAP_APPFONT ( 312 , 43 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
    };
    GroupBox GB_ENTRIES
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 300 , 197 ) ;
        Text = "Eintragsdaten" ;
        Text [ ENGLISH ] = "Entry data" ;
        Text[ english_us ] = "Entry data";
        Text[ portuguese ] = "Dados da entrada";
        Text[ russian ] = "Äàííûå ýëåìåíòà";
        Text[ greek ] = "ÄåäïìÝíá åããñáöÞò";
        Text[ dutch ] = "Itemgegevens";
        Text[ french ] = "Données de l'entrée";
        Text[ spanish ] = "Datos de la entrada";
        Text[ italian ] = "Dati voce";
        Text[ danish ] = "Elementdata";
        Text[ swedish ] = "Postdata";
        Text[ polish ] = "Dane wpisu";
        Text[ portuguese_brazilian ] = "Entry data";
        Text[ japanese ] = "“ü—Í“ú";
        Text[ korean ] = "Ç׸ñ µ¥ÀÌÅÍ";
        Text[ chinese_simplified ] = "ÌõÄ¿Êý¾Ý";
        Text[ chinese_traditional ] = "±ø¥Ø¼ÆÕu";
        Text[ arabic ] = "ÈíÇäÇÊ ÇáÅÏÎÇá";
        Text[ turkish ] = "Giriþ verileri";
        Text[ language_user1 ] = " ";
    };
    Text[ english_us ] = "Define Bibliography Entry";
    Text[ portuguese ] = "Definir entrada bibliográfica";
    Text[ russian ] = "Çàäàòü ýëåìåíò ñïèñêà ëèòåðàòóðû";
    Text[ greek ] = "Ïñéóìüò åããñáöÞò âéâëéïãñáößáò";
    Text[ dutch ] = "Als Item voor literatuurlijst definiëren";
    Text[ french ] = "Définir une entrée de bibliographie";
    Text[ spanish ] = "Definir entrada de bibliografía";
    Text[ italian ] = "Definisci voce bibliografica";
    Text[ danish ] = "Definer litteraturlisteelement";
    Text[ swedish ] = "Definiera litteraturpost";
    Text[ polish ] = "Zdefiniuj wpis bibliograficzny";
    Text[ portuguese_brazilian ] = "Define authority entry";
    Text[ japanese ] = "ŽQl•¶Œ£€–Ú‚Ì’è‹`";
    Text[ korean ] = "Âü°í¹®Çå Ç׸ñ Á¤ÀÇ";
    Text[ chinese_simplified ] = "¶¨ÒåÎÄÏ×ÌõÄ¿";
    Text[ chinese_traditional ] = "©w¸q°Ñ¦Ò¤åÄm±ø¥Ø";
    Text[ arabic ] = "ÊÚÑíÝ ÅÏÎÇá Ýí ÝåÑÓ ÇáãÑÇÌÚ";
    Text[ turkish ] = "Kaynakça giriþini tanýmla";
};
String STR_AUTHMRK_EDIT
{
    Text = "Literaturverzeichniseintrag bearbeiten" ;
    Text [ ENGLISH ] = "Edit authority entry" ;

    Text[ english_us ] = "Edit bibliography entry";
    Text[ portuguese ] = "Editar entrada bibliográfica";
    Text[ russian ] = "Ïðàâêà ýëåìåíòà ñïèñêà ëèòåðàòóðû";
    Text[ greek ] = "Åðåîåñãáóßá åããñáöÞò âéâëéïãñáößáò";
    Text[ dutch ] = "Item voor literatuurlijst bewerken";
    Text[ french ] = "Éditer une entrée de bibliographie";
    Text[ spanish ] = "Editar entrada de bibliografía";
    Text[ italian ] = "Modifica voce bibliografica";
    Text[ danish ] = "Rediger litteraturlisteelement";
    Text[ swedish ] = "Redigera post i litteraturförteckning";
    Text[ polish ] = "Edytuj wpis bibliograficzny";
    Text[ portuguese_brazilian ] = "Edit authority entry";
    Text[ japanese ] = "ŽQl•¶Œ£•\\‚̕ҏW";
    Text[ korean ] = "Âü°í¹®Çå Ç׸ñ ÆíÁý";
    Text[ chinese_simplified ] = "±à¼­ÎÄÏ×Ŀ¼ÌõÄ¿";
    Text[ chinese_traditional ] = "½s¿è°Ñ¦Ò¤åÄm±ø¥Ø";
    Text[ arabic ] = "ÊÍÑíÑ ÅÏÎÇá Ýí ÝåÑÓ ÇáãÑÇÌÚ";
    Text[ turkish ] = "Kaynakça dizini giriþini düzenle";
    Text[ language_user1 ] = " ";
};
String STR_AUTHMRK_INSERT
{
    Text = "Literaturverzeichniseintrag einfügen" ;
    Text [ ENGLISH ] = "Insert authority entry" ;

    Text[ english_us ] = "Insert bibliography entry";
    Text[ portuguese ] = "Inserir entrada bibliográfica";
    Text[ russian ] = "Âñòàâèòü ýëåìåíò ñïèñêà ëèòåðàòóðû";
    Text[ greek ] = "ÐñïóèÞêç åããñáöÞò âéâëéïãñáößáò";
    Text[ dutch ] = "Item invoegen in literatuurlijst";
    Text[ french ] = "Insérer une entrée de bibliographie";
    Text[ spanish ] = "Insertar entrada de bibliografía";
    Text[ italian ] = "Inserisci voce bibliografica";
    Text[ danish ] = "Indsæt litteraturlisteelement";
    Text[ swedish ] = "Infoga post i litteraturförteckning";
    Text[ polish ] = "Wstaw wpis bibliograficzny";
    Text[ portuguese_brazilian ] = "Insert authority entry";
    Text[ japanese ] = "ŽQl•¶Œ£‚Ì‘}“ü";
    Text[ korean ] = "Âüº¸¹®Çå Ç׸ñ Á¤ÀÇ";
    Text[ chinese_simplified ] = "²åÈëÎÄÏ×Ŀ¼ÌõÄ¿";
    Text[ chinese_traditional ] = "´¡¤J°Ñ¦Ò¤åÄm±ø¥Ø";
    Text[ arabic ] = "ÅÏÑÇÌ ÅÏÎÇá Ýí ÝåÑÓ ÇáãÑÇÌÚ";
    Text[ turkish ] = "Kaynakça dizini giriþi ekle";
    Text[ language_user1 ] = " ";
};
QueryBox DLG_CHANGE_AUTH_ENTRY
{
    BUTTONS = WB_YES_NO ;
    DEFBUTTON = WB_DEF_NO ;
    MESSAGE = "Der Bibliographie-Eintrag ist bereits mit abweichenden Daten im Dokument enthalten. "\
    "Möchten sie die bereits enthaltenen Einträge anpassen?" ;
    MESSAGE [ English ] = "The bibliography entry is already contained in the document with different data."\
    "Do you want to adjust the existing bibliography entries?" ;
    MESSAGE[ english_us ] = "The bibliography entry is already contained in the document with different data. ";
    MESSAGE[ portuguese ] = "A entrada bibliográfica já existe no documento com dados diferentes. ";
    MESSAGE[ russian ] = "Ýòîò ýëåìåíò áèáëèîãðàôèè ñ íåêîòîðûìè îòëè÷íûìè äàííûìè óæå ñîäåðæèòñÿ â äîêóìåíòå. ";
    MESSAGE[ greek ] = "Ç åããñáöÞ âéâëéïèÞêçò ðåñéÝ÷åôáé ìå Þäç ìç óõìðßðôïíôá äåäïìÝíá óôï Ýããñáöï. ";
    MESSAGE[ dutch ] = "Het bibliografie-item bevindt zich reeds met andere gegevens in het document. ";
    MESSAGE[ french ] = "L'entrée de bibliographie existe déjà en relation avec des données différentes dans le document.  ";
    MESSAGE[ spanish ] = "La entrada de bibliografía existe ya con datos diferentes en el documento. ";
    MESSAGE[ italian ] = "La voce bibliografica è già presente nel documento con dati diversi. ";
    MESSAGE[ danish ] = "Litteraturlisteelementet er allerede indeholdt i dokumentet med afvigende data. ";
    MESSAGE[ swedish ] = "Bibliografiposten finns redan med avvikande data i dokumentet. ";
    MESSAGE[ polish ] = "Wpis bibliograficzny zawarty jest w dokumencie ³¹cznie z innymi danymi.";
    MESSAGE[ portuguese_brazilian ] = "The bibliography entry is already contained in the document with different data.";
    MESSAGE[ japanese ] = "‚±‚ÌŽQl•¶Œ£‚Í‚±‚Ì•¶‘‚Ì•Ê‚ÌŒÂŠ‚É‚·‚łɏo‚Ä‚«‚Ä‚¢‚Ü‚·B ";
    MESSAGE[ korean ] = "Âü°í¹®Çå Ç׸ñÀº ÀÌ¹Ì ´Ù¸¥ µ¥ÀÌÅÍ¿Í ÇÔ²² ¹®¼­¿¡ Æ÷ÇԵǾî ÀÖ½À´Ï´Ù. ";
    MESSAGE[ chinese_simplified ] = "ÎĵµÄÚÒѾ­º¬Óи½´ø²»Í¬Êý¾ÝµÄĿ¼ÌõÄ¿¡£ ";
    MESSAGE[ chinese_traditional ] = "¦b¤å¥ó¤º¤w¸g§t¦³¤£¦P¼ÆÕuªº¥Ø¿ý¶µ¥Ø¡C ";
    MESSAGE[ arabic ] = "ÅÏÎÇá ÇáãÑÌÚ ãæÌæÏ ÈÇáÝÚá Ýí ÇáãÓÊäÏ ÈÈíÇäÇÊ ãÎÊáÝÉ. ";
    MESSAGE[ turkish ] = "Kaynakça giriþi, farklý veriler ile belgede mevcut.";
};

diff --git a/sw/source/ui/index/makefile.mk b/sw/source/ui/index/makefile.mk
new file mode 100644
index 0000000..60b1812
--- /dev/null
+++ b/sw/source/ui/index/makefile.mk
@@ -0,0 +1,105 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:43 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=..$/..$/..

PRJNAME=sw
TARGET=index

AUTOSEG=true

PROJECTPCH=ui_pch
PDBTARGET=ui_pch
PROJECTPCHSOURCE=..\ui_1st\ui_pch

# --- Settings -----------------------------------------------------

.INCLUDE :  $(PRJ)$/inc$/swpre.mk
.INCLUDE :  settings.mk
.INCLUDE :  $(PRJ)$/inc$/sw.mk

# --- Files --------------------------------------------------------

CXXFILES = \
        cnttab.cxx \
        idxmrk.cxx \
        multmrk.cxx \
        toxmgr.cxx

SRCFILES =  \
        cnttab.src \
        idxmrk.src \
        multmrk.src

SLOFILES =  \
        $(SLO)$/cnttab.obj \
        $(SLO)$/idxmrk.obj \
        $(SLO)$/multmrk.obj \
        $(SLO)$/toxmgr.obj

EXCEPTIONSFILES =  \
        $(SLO)$/cnttab.obj \

# --- Tagets -------------------------------------------------------

.INCLUDE :  target.mk

diff --git a/sw/source/ui/index/multmrk.cxx b/sw/source/ui/index/multmrk.cxx
new file mode 100644
index 0000000..2baf57d
--- /dev/null
+++ b/sw/source/ui/index/multmrk.cxx
@@ -0,0 +1,224 @@
/*************************************************************************
 *
 *  $RCSfile: multmrk.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:44 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "swtypes.hxx"

#include "multmrk.hxx"
#include "toxmgr.hxx"

#include "index.hrc"
#include "multmrk.hrc"


SwMultiTOXMarkDlg::SwMultiTOXMarkDlg( Window* pParent, SwTOXMgr& rTOXMgr ) :

    SvxStandardDialog(pParent, SW_RES(DLG_MULTMRK)),

    aEntryFT(this,  SW_RES(FT_ENTRY)),
    aTextFT(this,   SW_RES(FT_TEXT)),
    aTOXFT(this,    SW_RES(FT_TOX)),
    aOkBT(this,     SW_RES(OK_BT)),
    aCancelBT(this, SW_RES(CANCEL_BT)),
    aTOXLB(this,    SW_RES(LB_TOX)),
    aTOXGB(this,    SW_RES(GB_TOX)),
    rMgr( rTOXMgr ),
    nPos(0)
{
    aTOXLB.SetSelectHdl(LINK(this, SwMultiTOXMarkDlg, SelectHdl));

    USHORT nSize = rMgr.GetTOXMarkCount();
    for(USHORT i=0; i < nSize; ++i)
        aTOXLB.InsertEntry(rMgr.GetTOXMark(i)->GetText());

    aTOXLB.SelectEntryPos(0);
    aTextFT.SetText(rMgr.GetTOXMark(0)->GetTOXType()->GetTypeName());

    FreeResource();
}


IMPL_LINK_INLINE_START( SwMultiTOXMarkDlg, SelectHdl, ListBox *, pBox )
{
    if(pBox->GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND)
    {   SwTOXMark* pMark = rMgr.GetTOXMark(pBox->GetSelectEntryPos());
        aTextFT.SetText(pMark->GetTOXType()->GetTypeName());
        nPos = pBox->GetSelectEntryPos();
    }
    return 0;
}
IMPL_LINK_INLINE_END( SwMultiTOXMarkDlg, SelectHdl, ListBox *, pBox )


void SwMultiTOXMarkDlg::Apply()
{
    rMgr.SetCurTOXMark(nPos);
}

/*-----------------25.02.94 22:06-------------------
 dtor ueberladen
--------------------------------------------------*/


SwMultiTOXMarkDlg::~SwMultiTOXMarkDlg() {}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.28  2000/09/18 16:05:53  willem.vandorp
    OpenOffice header added.

    Revision 1.27  1997/11/05 11:43:50  OS
    Segmentierung entfernt


      Rev 1.26   05 Nov 1997 12:43:50   OS
   Segmentierung entfernt

      Rev 1.25   03 Nov 1997 13:20:56   MA
   precomp entfernt

      Rev 1.24   14 Nov 1996 15:34:12   TRI
   includes

      Rev 1.23   11 Nov 1996 10:55:34   MA
   ResMgr

      Rev 1.22   26 Jul 1996 21:04:22   MA
   includes

      Rev 1.21   06 Feb 1996 15:20:48   JP
   Link Umstellung 305

      Rev 1.20   24 Nov 1995 16:59:04   OM
   PCH->PRECOMPILED

      Rev 1.19   08 Nov 1995 13:47:00   OM
   Change->Set

      Rev 1.18   30 Aug 1995 14:07:02   MA
   fix: sexport'iert

      Rev 1.17   21 Aug 1995 09:36:02   MA
   chg: swstddlg -> svxstandarddialog, Optimierungen

      Rev 1.16   25 Oct 1994 18:18:46   ER
   add: PCH

      Rev 1.15   26 Feb 1994 02:03:52   ER
   virt. dtor mit export

      Rev 1.14   25 Feb 1994 22:07:08   ER
   virtuellen dtor wegen export ueberladen

      Rev 1.13   22 Feb 1994 14:39:38   ER
   EXPORT --> SEXPORT

      Rev 1.12   21 Feb 1994 22:39:20   ER
   LINK EXPORT

      Rev 1.11   17 Feb 1994 08:46:28   MI
   SEG_FUNCDEFS ausgefuellt

      Rev 1.10   16 Feb 1994 20:07:06   MI
   SEG_FUNCDEFS ausgefuellt

      Rev 1.9   16 Feb 1994 16:46:26   MI
   Pragmas zurechtgerueckt

      Rev 1.8   28 Jan 1994 11:43:50   MI
   TCOV() entfernt, SW_... nach SEG_... umbenannt

      Rev 1.7   13 Jan 1994 08:44:40   MI
   Segmentierung per #define ermoeglicht

      Rev 1.6   09 Jan 1994 21:12:12   MI
   Provisorische Segmentierung

      Rev 1.5   26 Sep 1993 18:42:02   MI
   Segmentierung

      Rev 1.4   28 May 1993 11:48:22   VB
   Umstellung Precompiled Headers

      Rev 1.3   26 May 1993 10:36:32   MS
   Anpassung SwTOXMgr

      Rev 1.2   27 Apr 1993 08:37:28   OK
   NEU: #pragma hdrstop

      Rev 1.1   26 Apr 1993 11:49:12   MS
   Markentraveling aktiviert

      Rev 1.0   25 Feb 1993 14:47:06   MS
   Initial revision.

      Rev 1.12   23 Feb 1993 13:42:18   MS
   Form auswerten

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/index/multmrk.hrc b/sw/source/ui/index/multmrk.hrc
new file mode 100644
index 0000000..254a016
--- /dev/null
+++ b/sw/source/ui/index/multmrk.hrc
@@ -0,0 +1,68 @@
/*************************************************************************
 *
 *  $RCSfile: multmrk.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:44 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#define FT_ENTRY    1
#define FT_TOX      2
#define OK_BT       3
#define LB_TOX      4
#define FT_TEXT     5
#define GB_TOX      6
#define CANCEL_BT   7

diff --git a/sw/source/ui/index/multmrk.src b/sw/source/ui/index/multmrk.src
new file mode 100644
index 0000000..b99b690
--- /dev/null
+++ b/sw/source/ui/index/multmrk.src
@@ -0,0 +1,217 @@
/*************************************************************************
 *
 *  $RCSfile: multmrk.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:44 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "index.hrc"
#include "multmrk.hrc"
#include "cmdid.h"
#include "helpid.h"
ModalDialog DLG_MULTMRK
{
    HelpID = FN_EDIT_IDX_ENTRY_DLG ;
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 220 , 95 ) ;
    Text = "Verzeichnismarkierungen" ;
    Text [ English ] = "Index marks" ;
    Text [ norwegian ] = "Stikkordregistermerker" ;
    Text [ italian ] = "Contrassegni indice" ;
    Text [ portuguese_brazilian ] = "Marcas do índice" ;
    Text [ portuguese ] = "Marcas do índice" ;
    Text [ finnish ] = "Hakemistomerkinnät" ;
    Text [ danish ] = "Indeksmarkeringer" ;
    Text [ french ] = "Marques d'index" ;
    Text [ swedish ] = "Förteckningsmarkeringar" ;
    Text [ dutch ] = "Indexmarkeringen" ;
    Text [ spanish ] = "Marcas del índice" ;
    Text [ english_us ] = "Index Markings" ;
    Moveable = TRUE ;
    FixedText FT_ENTRY
    {
        Pos = MAP_APPFONT ( 12 , 14 ) ;
        Size = MAP_APPFONT ( 41 , 8 ) ;
        Text = "Verzeichnis" ;
        Text [ English ] = "Index" ;
        Text [ norwegian ] = "Stikkordregister" ;
        Text [ italian ] = "Indice" ;
        Text [ portuguese_brazilian ] = "Índice" ;
        Text [ portuguese ] = "Índice" ;
        Text [ finnish ] = "Hakemisto" ;
        Text [ danish ] = "Indeks" ;
        Text [ french ] = "Index" ;
        Text [ swedish ] = "Förteckning" ;
        Text [ dutch ] = "Index" ;
        Text [ spanish ] = "Índice" ;
        Text [ english_us ] = "Index" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "Ŀ¼";
        Text[ russian ] = "Óêàçàòåëü";
        Text[ polish ] = "Indeks";
        Text[ japanese ] = "õˆø";
        Text[ chinese_traditional ] = "¥Ø¿ý";
        Text[ arabic ] = "ÇáÝåÑÓ";
        Text[ dutch ] = "Index";
        Text[ chinese_simplified ] = "Ŀ¼";
        Text[ greek ] = "ÅõñåôÞñéï";
        Text[ korean ] = "»öÀÎ";
        Text[ turkish ] = "Dizin";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_TEXT
    {
        Pos = MAP_APPFONT ( 53 , 14 ) ;
        Size = MAP_APPFONT ( 100 , 8 ) ;
        Left = TRUE ;
    };
    FixedText FT_TOX
    {
        Pos = MAP_APPFONT ( 12 , 28 ) ;
        Size = MAP_APPFONT ( 41 , 8 ) ;
        Text = "Eintrag" ;
        Text [ English ] = "Entry" ;
        Text [ norwegian ] = "Inngang" ;
        Text [ italian ] = "Voce" ;
        Text [ portuguese_brazilian ] = "Entrada" ;
        Text [ portuguese ] = "Entrada" ;
        Text [ finnish ] = "Merkintä" ;
        Text [ danish ] = "Element" ;
        Text [ french ] = "Entrée" ;
        Text [ swedish ] = "Post" ;
        Text [ dutch ] = "Item" ;
        Text [ spanish ] = "Entrada" ;
        Text [ english_us ] = "Entry" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "ÌõÄ¿";
        Text[ russian ] = "Ýëåìåíò";
        Text[ polish ] = "Wpis";
        Text[ japanese ] = "€–Ú";
        Text[ chinese_traditional ] = "¶µ¥Ø";
        Text[ arabic ] = "ÇáÅÏÎÇá";
        Text[ dutch ] = "Item";
        Text[ chinese_simplified ] = "ÌõÄ¿";
        Text[ greek ] = "Êáôá÷þñéóç";
        Text[ korean ] = "Ç׸ñ";
        Text[ turkish ] = "Giriþ";
        Text[ language_user1 ] = " ";
    };
    OKButton OK_BT
    {
        Pos = MAP_APPFONT ( 165 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        DefButton = TRUE ;
    };
    CancelButton CANCEL_BT
    {
        Pos = MAP_APPFONT ( 165 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    ListBox LB_TOX
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 53 , 28 ) ;
        Size = MAP_APPFONT ( 100 , 52 ) ;
        TabStop = TRUE ;
        AutoHScroll = TRUE ;
    };
    GroupBox GB_TOX
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 153 , 85 ) ;
        Text = "Auswahl" ;
        Text [ English ] = "Choice" ;
        Text [ norwegian ] = "Choice" ;
        Text [ italian ] = "Scelta" ;
        Text [ portuguese_brazilian ] = "Escolha" ;
        Text [ portuguese ] = "Opções" ;
        Text [ finnish ] = "Määritykset" ;
        Text [ danish ] = "Udvalg" ;
        Text [ french ] = "Sélection" ;
        Text [ swedish ] = "Urval" ;
        Text [ dutch ] = "Selectie" ;
        Text [ spanish ] = "Opción" ;
        Text [ english_us ] = "Selection" ;
        Text[ chinese_simplified ] = "Ñ¡Ôñ";
        Text[ russian ] = "Îòáîð";
        Text[ polish ] = "Wybór";
        Text[ japanese ] = "‘I‘ð";
        Text[ chinese_traditional ] = "¿ï¾Ü";
        Text[ arabic ] = "ÊÍÏíÏ";
        Text[ dutch ] = "Selectie";
        Text[ chinese_simplified ] = "Ñ¡Ôñ";
        Text[ greek ] = "ÅðéëïãÞ";
        Text[ korean ] = "¼±ÅÃ";
        Text[ turkish ] = "Seçim";
        Text[ language_user1 ] = " ";
    };
    Text[ chinese_simplified ] = "Ŀ¼±ê¼Ç";
    Text[ russian ] = "Âûäåëåíèÿ óêàçàòåëÿ";
    Text[ polish ] = "Znaczniki indeksu";
    Text[ japanese ] = "õˆø‘I‘ð€–Ú";
    Text[ chinese_traditional ] = "¯Á¤Þ¿ï¨ú";
    Text[ arabic ] = "ÊÍÏíÏÇÊ ÇáÝåÑÓ";
    Text[ dutch ] = "Indexmarkeringen";
    Text[ chinese_simplified ] = "Ŀ¼±ê¼Ç";
    Text[ greek ] = "ÓçìÜíóåéò åõñåôçñßïõ";
    Text[ korean ] = "»öÀΠǥ½Ã";
    Text[ turkish ] = "Dizin için iþaretlenen giriþler";
    Text[ language_user1 ] = " ";
};
diff --git a/sw/source/ui/index/toxmgr.cxx b/sw/source/ui/index/toxmgr.cxx
new file mode 100644
index 0000000..cd937c8
--- /dev/null
+++ b/sw/source/ui/index/toxmgr.cxx
@@ -0,0 +1,798 @@
/*************************************************************************
 *
 *  $RCSfile: toxmgr.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:44 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _SHELLRES_HXX
#include <shellres.hxx>
#endif
#ifndef _SWWAIT_HXX
#include <swwait.hxx>
#endif
#ifndef _SWVIEW_HXX
#include <view.hxx>
#endif
#ifndef _TOXMGR_HXX
#include <toxmgr.hxx>
#endif
#ifndef _AUTHFLD_HXX
#include <authfld.hxx>
#endif

#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif

/*-----------------23.01.98 07:41-------------------
    Standard - Verzeichnisnamen herausreichen
--------------------------------------------------*/
const String&   SwTOXBase::GetTOXName(TOXTypes eType)
{
    const String* pRet;
    ShellResource* pShellRes = ViewShell::GetShellRes();
    switch(eType)
    {
        case  TOX_CONTENT      :    pRet = &pShellRes->aTOXContentName;       break;
        case  TOX_INDEX        :    pRet = &pShellRes->aTOXIndexName;         break;
        case  TOX_USER         :    pRet = &pShellRes->aTOXUserName;          break;
        case  TOX_ILLUSTRATIONS:    pRet = &pShellRes->aTOXIllustrationsName; break;
        case  TOX_OBJECTS      :    pRet = &pShellRes->aTOXObjectsName;       break;
        case  TOX_TABLES       :    pRet = &pShellRes->aTOXTablesName;        break;
        case  TOX_AUTHORITIES :     pRet = &pShellRes->aTOXAuthoritiesName;   break;
    }
    return *pRet;
}

/*--------------------------------------------------------------------
    Beschreibung: Handhabung der Verzeichnisse durch TOXMgr
 --------------------------------------------------------------------*/


SwTOXMgr::SwTOXMgr(SwWrtShell* pShell):
    pSh(pShell)
{
    GetTOXMarks();
    SetCurTOXMark(0);
}

/*--------------------------------------------------------------------
    Beschreibung: Aktuelle TOXMarks behandeln
 --------------------------------------------------------------------*/


USHORT SwTOXMgr::GetTOXMarks()
{
    return pSh->GetCurTOXMarks(aCurMarks);
}


SwTOXMark* SwTOXMgr::GetTOXMark(USHORT nId)
{
    if(aCurMarks.Count() > 0)
        return aCurMarks[nId];
    return 0;
}


void SwTOXMgr::DeleteTOXMark()
{
    SwTOXMark* pNext = 0;
    if( pCurTOXMark )
    {
        pNext = (SwTOXMark*)&pSh->GotoTOXMark( *pCurTOXMark, TOX_NXT );
        if( pNext == pCurTOXMark )
            pNext = 0;

        pSh->DeleteTOXMark( pCurTOXMark );
        pSh->SetModified();
    }
    // zur naechsten wandern
    pCurTOXMark = pNext;
}

/*--------------------------------------------------------------------
    Beschreibung: Stichwortmarkierung einfuegen
 --------------------------------------------------------------------*/


/*void SwTOXMgr::InsertTOIMark(const String* pPrimKey, const String* pSecKey,
                             const String* pAltStr)
{
    SwTOXMark aMark(pSh->GetTOXType(TOX_INDEX, 0));

    if( pPrimKey && pPrimKey->Len() )
    {
        aMark.SetPrimaryKey( *pPrimKey );

        if( pSecKey && pSecKey->Len() )
            aMark.SetSecondaryKey( *pSecKey );
    }

    if(pAltStr)
        aMark.SetAlternativeText(*pAltStr);

    pSh->StartAllAction();
    pSh->SwEditShell::Insert(aMark);
    pSh->EndAllAction();

}
/*--------------------------------------------------------------------
    Beschreibung: Inhaltsverzeichnismarkierung einfuegen
 --------------------------------------------------------------------*/


/*void SwTOXMgr::InsertTOCMark(int nLevel, const String* pAltStr)
{
    ASSERT(nLevel > 0 && nLevel <= MAXLEVEL, ungueltiger Level InsertTOCMark);
    SwTOXMark aMark(pSh->GetTOXType(TOX_CONTENT, 0));
    aMark.SetLevel(nLevel);

    if(pAltStr)
        aMark.SetAlternativeText(*pAltStr);

    pSh->StartAllAction();
    pSh->SwEditShell::Insert(aMark);
    pSh->EndAllAction();
}

/*--------------------------------------------------------------------
    Beschreibung: Benutzerverzeichnismarkierungen einfuegen
 --------------------------------------------------------------------*/


/*void SwTOXMgr::InsertTOUMark(const String& rTOUName, int nLevel,
                             const String* pAltStr)
{
    ASSERT(nLevel > 0 && nLevel <= MAXLEVEL, ungueltiger Level InsertTOCMark);
    USHORT nId = GetUserTypeID(rTOUName);
    SwTOXMark aMark(pSh->GetTOXType(TOX_USER, nId));
    aMark.SetLevel(nLevel);

    if(pAltStr)
        aMark.SetAlternativeText(*pAltStr);

    pSh->StartAllAction();
    pSh->SwEditShell::Insert(aMark);
    pSh->EndAllAction();
}
/* -----------------20.08.99 10:48-------------------

 --------------------------------------------------*/
void    SwTOXMgr::InsertTOXMark(const SwTOXMarkDescription& rDesc)
{
    SwTOXMark* pMark = 0;
    switch(rDesc.GetTOXType())
    {
        case  TOX_CONTENT:
        {
            ASSERT(rDesc.GetLevel() > 0 && rDesc.GetLevel() <= MAXLEVEL,
                                            ungueltiger Level InsertTOCMark);
            pMark = new SwTOXMark(pSh->GetTOXType(TOX_CONTENT, 0));
            pMark->SetLevel(rDesc.GetLevel());

            if(rDesc.GetAltStr())
                pMark->SetAlternativeText(*rDesc.GetAltStr());
        }
        break;
        case  TOX_INDEX:
        {
            pMark = new SwTOXMark(pSh->GetTOXType(TOX_INDEX, 0));

            if( rDesc.GetPrimKey() && rDesc.GetPrimKey()->Len() )
            {
                pMark->SetPrimaryKey( *rDesc.GetPrimKey() );

                if( rDesc.GetSecKey() && rDesc.GetSecKey()->Len() )
                    pMark->SetSecondaryKey( *rDesc.GetSecKey() );
            }
            if(rDesc.GetAltStr())
                pMark->SetAlternativeText(*rDesc.GetAltStr());
            pMark->SetMainEntry(rDesc.IsMainEntry());
        }
        break;
        case  TOX_USER:
        {
            ASSERT(rDesc.GetLevel() > 0 && rDesc.GetLevel() <= MAXLEVEL,
                                            ungueltiger Level InsertTOCMark);
            USHORT nId = rDesc.GetTOUName() ?
                GetUserTypeID(*rDesc.GetTOUName()) : 0;
            pMark = new SwTOXMark(pSh->GetTOXType(TOX_USER, nId));
            pMark->SetLevel(rDesc.GetLevel());

            if(rDesc.GetAltStr())
                pMark->SetAlternativeText(*rDesc.GetAltStr());
        }
        break;
    }
    pSh->StartAllAction();
    pSh->SwEditShell::Insert(*pMark);
    pSh->EndAllAction();
}
/*--------------------------------------------------------------------
    Beschreibung: Update eines TOXMarks
 --------------------------------------------------------------------*/


void SwTOXMgr::UpdateTOXMark(const SwTOXMarkDescription& rDesc)
{
    ASSERT(pCurTOXMark, "kein aktuelles TOXMark");

    pSh->StartAllAction();
    if(pCurTOXMark->GetTOXType()->GetType() == TOX_INDEX)
    {
        if(rDesc.GetPrimKey() && rDesc.GetPrimKey()->Len() )
        {
            pCurTOXMark->SetPrimaryKey( *rDesc.GetPrimKey() );

            if( rDesc.GetSecKey() && rDesc.GetSecKey()->Len() )
                pCurTOXMark->SetSecondaryKey( *rDesc.GetSecKey() );
            else
                pCurTOXMark->SetSecondaryKey( aEmptyStr );
        }
        else
            pCurTOXMark->SetPrimaryKey( aEmptyStr );
        pCurTOXMark->SetMainEntry(rDesc.IsMainEntry());
    }
    else
        pCurTOXMark->SetLevel(rDesc.GetLevel());

    if(rDesc.GetAltStr())
    {
        // JP 26.08.96: Bug 30344 - entweder der Text aus dem Doc oder
        //                          ein Alternativ-Text, beides gibts nicht!
        BOOL bReplace = pCurTOXMark->IsAlternativeText();
        pCurTOXMark->SetAlternativeText( *rDesc.GetAltStr() );
        if( !bReplace )
        {
            SwTOXMark aCpy( *pCurTOXMark );
            aCurMarks.Remove(0, aCurMarks.Count());
            pSh->DeleteTOXMark(pCurTOXMark);
            pSh->SwEditShell::Insert( aCpy );
            pCurTOXMark = 0;
        }
    }
    pSh->SetModified();
    pSh->EndAllAction();
    // Bug 36207 pCurTOXMark zeigt hier in den Wald!
    if(!pCurTOXMark)
    {
        pSh->Left();
        pSh->GetCurTOXMarks(aCurMarks);
        SetCurTOXMark(0);
    }
}


/*--------------------------------------------------------------------
    Beschreibung:   UserTypeID ermitteln
 --------------------------------------------------------------------*/


USHORT SwTOXMgr::GetUserTypeID(const String& rStr)
{
    USHORT nSize = pSh->GetTOXTypeCount(TOX_USER);
    for(USHORT i=0; i < nSize; ++i)
    {
        const SwTOXType* pTmp = pSh->GetTOXType(TOX_USER, i);
        if(pTmp && pTmp->GetTypeName() == rStr)
            return i;
    }
    SwTOXType aUserType(TOX_USER, rStr);
    pSh->InsertTOXType(aUserType);
    return nSize;
}

/*--------------------------------------------------------------------
    Beschreibung: Traveling zwischen den TOXMarks
 --------------------------------------------------------------------*/


void SwTOXMgr::NextTOXMark(BOOL bSame)
{
    ASSERT(pCurTOXMark, "kein aktuelles TOXMark");
    if( pCurTOXMark )
    {
        SwTOXSearch eDir = bSame ? TOX_SAME_NXT : TOX_NXT;
        pCurTOXMark = (SwTOXMark*)&pSh->GotoTOXMark( *pCurTOXMark, eDir );
    }
}


void SwTOXMgr::PrevTOXMark(BOOL bSame)
{
    ASSERT(pCurTOXMark, "kein aktuelles TOXMark");
    if( pCurTOXMark )
    {
        SwTOXSearch eDir = bSame ? TOX_SAME_PRV : TOX_PRV;
        pCurTOXMark = (SwTOXMark*)&pSh->GotoTOXMark(*pCurTOXMark, eDir );
    }
}

/*--------------------------------------------------------------------
    Beschreibung: Stichwortverzeichnis einfuegen
 --------------------------------------------------------------------*/

/*
void SwTOXMgr::InsertTOI(const USHORT nOptions, const String* pTitel,
                         const SwForm* pForm,
                         SwTOXBase** ppBase)
{
    SwWait aWait( *pSh->GetView().GetDocShell(), TRUE );

    const SwTOXType* pType = pSh->GetTOXType(TOX_INDEX, 0);

    SwForm aForm(TOX_INDEX);
    SwTOXBase* pTOX = new SwTOXBase(pType, aForm, TOX_MARK, pType->GetTypeName());
    pTOX->SetOptions(nOptions);

    if(pTitel)  pTOX->SetTitle(*pTitel);
    if(pForm)   pTOX->SetTOXForm(*pForm);

    // wird ppBase uebergeben, dann wird das TOXBase hier nur erzeugt
    // und dann ueber den Dialog in ein Globaldokument eingefuegt
    if(ppBase)
        (*ppBase) = pTOX;
    else
    {
        pSh->InsertTableOf(*pTOX);
        delete pTOX;
    }
}


BOOL SwTOXMgr::UpdateTOI(const USHORT nOptions, const String* pTitel,
                         const SwForm* pForm)
{
    if(pSh->HasSelection())
        pSh->DelRight();
    SwTOXBase* pTOX = (SwTOXBase*)GetCurTOX();
    if(!pTOX)
    {
        InsertTOI(nOptions, pTitel, pForm);
        return TRUE;
    }

    SwWait aWait( *pSh->GetView().GetDocShell(), TRUE );

    pTOX->SetOptions(nOptions);
    if(pTitel)  pTOX->SetTitle(*pTitel);
    if(pForm)   pTOX->SetTOXForm(*pForm);

    BOOL bRet = pSh->UpdateTableOf(*pTOX);

    return bRet;
}

/*--------------------------------------------------------------------
    Beschreibung: Inhaltsverzeichnis einfuegen
 --------------------------------------------------------------------*/

/*
void SwTOXMgr::InsertTOC(const USHORT nContent, int nLevel,
                         const String* pTitel, const SwForm* pForm,
                         SwTOXBase** ppBase)
{
    SwWait aWait( *pSh->GetView().GetDocShell(), TRUE );

    const SwTOXType* pType = pSh->GetTOXType(TOX_CONTENT, 0);
    SwForm aForm(TOX_CONTENT);

    SwTOXBase* pTOX = new SwTOXBase(pType, aForm, nContent, pType->GetTypeName());

    pTOX->SetLevel(nLevel);
    if(pTitel)  pTOX->SetTitle(*pTitel);
    if(pForm)   pTOX->SetTOXForm(*pForm);
    if(ppBase)
        (*ppBase) = pTOX;
    else
    {
        pSh->InsertTableOf(*pTOX);
        delete pTOX;
    }
}


BOOL SwTOXMgr::UpdateTOC(const USHORT  nContent,int nLevel,
                         const String* pTitel, const SwForm* pForm)
{
    if(pSh->HasSelection())
        pSh->DelRight();
    SwTOXBase* pTOX = (SwTOXBase*)GetCurTOX();
    if(!pTOX)
    {
        InsertTOC(nContent, nLevel, pTitel, pForm);
        return TRUE;
    }

    SwWait aWait( *pSh->GetView().GetDocShell(), TRUE );

    pTOX->SetCreate(nContent);
    pTOX->SetLevel(nLevel);

    if(pTitel)  pTOX->SetTitle(*pTitel);
    if(pForm)   pTOX->SetTOXForm(*pForm);

    BOOL bRet = pSh->UpdateTableOf(*pTOX);
    return bRet;
}

/*--------------------------------------------------------------------
    Beschreibung: Userverzeichnis einfuegen
 --------------------------------------------------------------------*/

/*
 void SwTOXMgr::InsertTOU(const USHORT nContent, const String* pTOUName,
                        const String* pTemplateName, int nLevel,
                         const String* pTitel,
                        const SwForm* pForm, SwTOXBase** ppBase)
{
    SwWait aWait( *pSh->GetView().GetDocShell(), TRUE );

    USHORT nPos  = 0;
    USHORT nSize = pSh->GetTOXTypeCount(TOX_USER);
    for(USHORT i=0; pTOUName && i < nSize; ++i)
    {   const SwTOXType* pType = pSh->GetTOXType(TOX_USER, i);
        if(pType->GetTypeName() == *pTOUName)
        {   nPos = i;
            break;
        }
    }
    const SwTOXType* pType = pSh->GetTOXType(TOX_USER, nPos);

    SwForm aForm(TOX_USER);
    SwTOXBase* pTOX = new SwTOXBase(pType, aForm, nContent, pType->GetTypeName());

    if(pTemplateName)   pTOX->SetTemplateName(*pTemplateName);
    if(pTitel)          pTOX->SetTitle(*pTitel);
    if(pForm)           pTOX->SetTOXForm(*pForm);

    if(ppBase)
        (*ppBase) = pTOX;
    else
    {
        pSh->InsertTableOf(*pTOX);
        delete pTOX;
    }
}


BOOL SwTOXMgr::UpdateTOU(const USHORT nContent,
                        const String* pTOUName,
                        const String* pTemplateName,
                        int nLevel,
                         const String* pTitel, const SwForm* pForm)
{
    if(pSh->HasSelection())
        pSh->DelRight();
    SwTOXBase* pTOX = (SwTOXBase*)GetCurTOX();
    if(!pTOX)
    {
        InsertTOU(nContent, pTOUName, pTemplateName, nLevel, pTitel, pForm);
        return TRUE;
    }

    SwWait aWait( *pSh->GetView().GetDocShell(), TRUE );

    pTOX->SetCreate(nContent);
    if(pTemplateName)   pTOX->SetTemplateName(*pTemplateName);
    if(pTitel)          pTOX->SetTitle(*pTitel);
    if(pForm)           pTOX->SetTOXForm(*pForm);

    BOOL bRet = pSh->UpdateTableOf(*pTOX);
    return bRet;
}
*/

const SwTOXBase* SwTOXMgr::GetCurTOX()
{
    return pSh->GetCurTOX();
}

const SwTOXType* SwTOXMgr::GetTOXType(TOXTypes eTyp, USHORT nId) const
{
    return pSh->GetTOXType(eTyp, nId);
}

void SwTOXMgr::SetCurTOXMark(USHORT nId)
{
    pCurTOXMark = (nId < aCurMarks.Count()) ? aCurMarks[nId] : 0;
}

/* -----------------01.07.99 16:23-------------------

 --------------------------------------------------*/

BOOL SwTOXMgr::UpdateOrInsertTOX(const SwTOXDescription& rDesc,
                                    SwTOXBase** ppBase,
                                    const SfxItemSet* pSet)
{
    SwWait aWait( *pSh->GetView().GetDocShell(), TRUE );
    BOOL bRet = TRUE;
    const SwTOXBase* pCurTOX = GetCurTOX();
    SwTOXBase* pTOX = (SwTOXBase*)pCurTOX;
    TOXTypes eCurTOXType = rDesc.GetTOXType();
    if(pCurTOX && !ppBase && pSh->HasSelection())
        pSh->DelRight();

    switch(eCurTOXType)
    {
        case TOX_INDEX :
        {
            if(!pCurTOX || ppBase)
            {
                const SwTOXType* pType = pSh->GetTOXType(eCurTOXType, 0);
                SwForm aForm(eCurTOXType);
                pTOX = new SwTOXBase(pType, aForm, TOX_MARK, pType->GetTypeName());
            }
            pTOX->SetOptions(rDesc.GetIndexOptions());
            pTOX->SetMainEntryCharStyle(rDesc.GetMainEntryCharStyle());
            pSh->SetTOIAutoMarkURL(rDesc.GetAutoMarkURL());
            pSh->ApplyAutoMark();
        }
        break;
        case TOX_CONTENT :
        {
            if(!pCurTOX || ppBase)
            {
                const SwTOXType* pType = pSh->GetTOXType(eCurTOXType, 0);
                SwForm aForm(eCurTOXType);
                pTOX = new SwTOXBase(pType, aForm, rDesc.GetContentOptions(), pType->GetTypeName());
            }
            pTOX->SetCreate(rDesc.GetContentOptions());
            pTOX->SetLevel(rDesc.GetLevel());
        }
        break;
        case TOX_USER :
        {
            if(!pCurTOX || ppBase)
            {
                USHORT nPos  = 0;
                USHORT nSize = pSh->GetTOXTypeCount(eCurTOXType);
                for(USHORT i=0; rDesc.GetTOUName() && i < nSize; ++i)
                {   const SwTOXType* pType = pSh->GetTOXType(TOX_USER, i);
                    if(pType->GetTypeName() == *rDesc.GetTOUName())
                    {   nPos = i;
                        break;
                    }
                }
                const SwTOXType* pType = pSh->GetTOXType(eCurTOXType, nPos);

                SwForm aForm(eCurTOXType);
                pTOX = new SwTOXBase(pType, aForm, rDesc.GetContentOptions(), pType->GetTypeName());

            }
            else
            {
                SwTOXBase* pTOX = (SwTOXBase*)pCurTOX;
                pTOX->SetCreate(rDesc.GetContentOptions());
            }
            pTOX->SetLevelFromChapter(rDesc.IsLevelFromChapter());
        }
        break;
        case TOX_OBJECTS:
        case TOX_TABLES:
        case TOX_AUTHORITIES:
        case TOX_ILLUSTRATIONS:
        {
            //Special handling for TOX_AUTHORITY
            if(TOX_AUTHORITIES == eCurTOXType)
            {
                SwAuthorityFieldType* pFType = (SwAuthorityFieldType*)
                                                pSh->GetFldType(RES_AUTHORITY, aEmptyStr);
                if(pFType)
                {
                    pFType->SetPreSuffix(rDesc.GetAuthBrackets().GetChar(0),
                        rDesc.GetAuthBrackets().GetChar(1));
                    pFType->SetSequence(rDesc.IsAuthSequence());
                    SwTOXSortKey rArr[3];
                    rArr[0] = rDesc.GetSortKey1();
                    rArr[1] = rDesc.GetSortKey2();
                    rArr[2] = rDesc.GetSortKey3();
                    pFType->SetSortKeys(3, rArr);
                    pFType->SetSortByDocument(rDesc.IsSortByDocument());

                    pFType->UpdateFlds();
                }
            }
            // TODO: consider properties of the current TOXType
            if(!pCurTOX || ppBase)
            {
                const SwTOXType* pType = pSh->GetTOXType(eCurTOXType, 0);
                SwForm aForm(eCurTOXType);
                pTOX = new SwTOXBase(
                    pType, aForm,
                    TOX_AUTHORITIES == eCurTOXType ? TOX_MARK : 0, pType->GetTypeName());
            }
            else
            {
                if(pSh->HasSelection())
                    pSh->DelRight();
                pTOX = (SwTOXBase*)pCurTOX;
            }
//          pTOX->SetOptions(rDesc.GetIndexOptions());
            pTOX->SetFromObjectNames(rDesc.IsCreateFromObjectNames());
            pTOX->SetOLEOptions(rDesc.GetOLEOptions());
        }
        break;
    }


    DBG_ASSERT(pTOX, "no TOXBase created!" )
    if(!pTOX)
        return FALSE;
    pTOX->SetFromChapter(rDesc.IsFromChapter());
    pTOX->SetSequenceName(rDesc.GetSequenceName());
    pTOX->SetCaptionDisplay(rDesc.GetCaptionDisplay());
    pTOX->SetProtected(rDesc.IsReadonly());

    for(USHORT nLevel = 0; nLevel < MAXLEVEL; nLevel++)
        pTOX->SetStyleNames(rDesc.GetStyleNames(nLevel), nLevel);

    if(rDesc.GetTitle())
        pTOX->SetTitle(*rDesc.GetTitle());
    if(rDesc.GetForm())
        pTOX->SetTOXForm(*rDesc.GetForm());
    if(!pCurTOX || ppBase)
    {
        // wird ppBase uebergeben, dann wird das TOXBase hier nur erzeugt
        // und dann ueber den Dialog in ein Globaldokument eingefuegt
        if(ppBase)
            (*ppBase) = pTOX;
        else
        {
            pSh->InsertTableOf(*pTOX, pSet);
            delete pTOX;
        }
    }
    else
        bRet = pSh->UpdateTableOf(*pTOX, pSet);

    return bRet;
}
/* -----------------20.10.99 14:11-------------------

 --------------------------------------------------*/
void SwTOXDescription::SetSortKeys(SwTOXSortKey eKey1,
                        SwTOXSortKey eKey2,
                            SwTOXSortKey eKey3)
{
    SwTOXSortKey aArr[3];
    USHORT nPos = 0;
    if(AUTH_FIELD_END > eKey1.eField)
        aArr[nPos++] = eKey1;
    if(AUTH_FIELD_END > eKey2.eField)
        aArr[nPos++] = eKey2;
    if(AUTH_FIELD_END > eKey3.eField)
        aArr[nPos++] = eKey3;

    eSortKey1 = aArr[0];
    eSortKey2 = aArr[1];
    eSortKey3 = aArr[2];
}

/* -----------------10.09.99 10:02-------------------

 --------------------------------------------------*/
void SwTOXDescription::ApplyTo(SwTOXBase& rTOXBase)
{
    for(USHORT i = 0; i < MAXLEVEL; i++)
        rTOXBase.SetStyleNames(GetStyleNames(i), i);
    rTOXBase.SetTitle(GetTitle() ? *GetTitle() : aEmptyStr);
//  const String*   GetTOUName() const {return pTOUName; }
    rTOXBase.SetCreate(GetContentOptions());

    if(GetTOXType() == TOX_INDEX)
        rTOXBase.SetOptions(GetIndexOptions());
    if(GetTOXType() != TOX_INDEX)
        rTOXBase.SetLevel(GetLevel());
    rTOXBase.SetFromObjectNames(IsCreateFromObjectNames());
    rTOXBase.SetSequenceName(GetSequenceName());
    rTOXBase.SetCaptionDisplay(GetCaptionDisplay());
    rTOXBase.SetFromChapter(IsFromChapter());
    rTOXBase.SetProtected(IsReadonly());
    rTOXBase.SetOLEOptions(GetOLEOptions());
    rTOXBase.SetLevelFromChapter(IsLevelFromChapter());

}

/*------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.59  2000/09/18 16:05:53  willem.vandorp
    OpenOffice header added.

    Revision 1.58  2000/06/27 19:42:10  jp
    Bug #70447#: select the current TOXMark if the EditDialog is open

    Revision 1.57  1999/10/21 08:53:42  os
    sorting authority entries by content

    Revision 1.56  1999/10/20 06:37:21  os
    rsequence impl., Brackets selectable

    Revision 1.55  1999/10/05 14:20:43  os
    no jumps to null-pointers

    Revision 1.54  1999/09/10 08:30:20  os
    use doc default TOXs

    Revision 1.53  1999/09/08 12:42:45  os
    new: Is/SetLevelFromChapter

    Revision 1.52  1999/08/26 14:01:00  OS
    AutoMark implemented


      Rev 1.51   26 Aug 1999 16:01:00   OS
   AutoMark implemented

      Rev 1.50   25 Aug 1999 15:29:14   OS
   extended indexes: OLEOptions

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/lingu/cvdata.mac b/sw/source/ui/lingu/cvdata.mac
new file mode 100644
index 0000000..1f26c95
--- /dev/null
+++ b/sw/source/ui/lingu/cvdata.mac
@@ -0,0 +1,19 @@
#############
## Deutsch ##
#############
rename "GR_HYP.DAT" "German Hyph"
setfile -c 'SW/g' -t 'Lexi' "German Hyph"
rename "GR_SPL.DAT" "German Spell"
setfile -c 'SW/g' -t 'Lexi' "German Spell"
rename "GR_THE.DAT" "German Thes"
setfile -c 'SW/g' -t 'Lexi' "German Thes"

#############
## English ##
#############
rename "EN_HYP.DAT" "English Hyph"
setfile -c 'SW/g' -t 'Lexi' "English Hyph"
rename "EN_SPL.DAT" "English Spell"
setfile -c 'SW/g' -t 'Lexi' "English Spell"
rename "EN_THE.DAT" "English Thes"
setfile -c 'SW/g' -t 'Lexi' "English Thes"
diff --git a/sw/source/ui/lingu/hyp.cxx b/sw/source/ui/lingu/hyp.cxx
new file mode 100644
index 0000000..da77942
--- /dev/null
+++ b/sw/source/ui/lingu/hyp.cxx
@@ -0,0 +1,505 @@
/*************************************************************************
 *
 *  $RCSfile: hyp.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:44 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "initui.hxx"
#include "view.hxx"
#include "edtwin.hxx"
#include "wrtsh.hxx"
#include "globals.hrc"

#ifndef _SV_MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _WRKWIN_HXX //autogen
#include <vcl/wrkwin.hxx>
#endif

#ifndef _LINGU_LNGPROPS_HHX_
#include <lingu/lngprops.hxx>
#endif
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
#include <com/sun/star/beans/XPropertySet.hpp>
#endif

#ifndef _SWWAIT_HXX
#include <swwait.hxx>
#endif


#include "hyp.hxx"
#include "mdiexp.hxx"
#include "olmenu.hrc"

#define HYPHHERE    '-'
#define PSH         (&pView->GetWrtShell())

using namespace ::com::sun::star;
using namespace ::rtl;
#define C2U(cChar) OUString::createFromAscii(cChar)
/*--------------------------------------------------------------------
     Beschreibung: Interaktive Trennung
 --------------------------------------------------------------------*/

SwHyphWrapper::SwHyphWrapper( SwView* pVw,
            uno::Reference< linguistic::XHyphenator >  &rxHyph,
            sal_Bool bStart, sal_Bool bOther, sal_Bool bSelect ) :
    SvxSpellWrapper( &pVw->GetEditWin(), rxHyph, bStart, bOther ),
    xHyph( rxHyph ),
    nLangError( 0 ),
    nPageCount( 0 ),
    nPageStart( 0 ),
    bInSelection( bSelect ),
    bShowError( sal_False ),
    pView( pVw )
{
    uno::Reference< beans::XPropertySet >  xProp( GetLinguPropertySet() );
    bAutomatic = xProp.is() ?
            *(sal_Bool*)xProp->getPropertyValue( C2U(UPN_IS_HYPH_AUTO) ).getValue() : sal_False;
    SetHyphen();
}

// -----------------------------------------------------------------------
void SwHyphWrapper::SpellStart( SvxSpellArea eSpell )
{
    if( SVX_SPELL_OTHER == eSpell && nPageCount )
    {
        ::EndProgress( pView->GetDocShell() );
        nPageCount = 0;
        nPageStart = 0;
    }
    pView->HyphStart( eSpell );
}

// -----------------------------------------------------------------------

sal_Bool SwHyphWrapper::SpellContinue()
{
    // Fuer autom. Trennung Aktionen erst am Ende sichtbar machen
    SwWait *pWait;
    if( bAutomatic )
    {
        PSH->StartAllAction();
        pWait = new SwWait( *pView->GetDocShell(), sal_True );
    }

        uno::Reference< uno::XInterface >  xHyphWord = bInSelection ?
                PSH->HyphContinue( NULL, NULL ) :
                PSH->HyphContinue( &nPageCount, &nPageStart );
        SetLast( xHyphWord );

    // Fuer autom. Trennung Aktionen erst am Ende sichtbar machen
    if( bAutomatic )
    {
        PSH->EndAllAction();
        delete pWait;
    }

    if( bShowError )
    {
        bShowError = sal_False;
        PSH->Push();
        PSH->ClearMark();
        pView->SpellError( (void*)nLangError );
        PSH->Combine();
    }
    return GetLast().is();
}

// -----------------------------------------------------------------------
void SwHyphWrapper::SpellEnd()
{
    PSH->HyphEnd();
    SvxSpellWrapper::SpellEnd();
}

IMPL_LINK( SwHyphWrapper, SpellError, void *, nLang )
{
    sal_uInt32 nNew = (sal_uInt32)nLang;
    if( nNew != nLangError )
    {
        nLangError = nNew;
        bShowError = sal_True;
    }
    return 0;
}


// -----------------------------------------------------------------------
sal_Bool SwHyphWrapper::SpellMore()
{
    PSH->Push();
    InfoBox( &pView->GetEditWin(), SW_RESSTR(STR_HYP_OK) ).Execute();
    PSH->Combine();
    return sal_False;
}

// -----------------------------------------------------------------------

void SwHyphWrapper::InsertHyphen( const sal_uInt16 nPos )
{
    if( nPos)
        PSH->InsertSoftHyph( nPos + 1); // does nPos == 1 really mean
                                        // insert hyphen after first char?
                                        // (instead of nPos == 0)
    else
        PSH->HyphIgnore();
}

// -----------------------------------------------------------------------
SwHyphWrapper::~SwHyphWrapper()
{
    if( nPageCount )
        ::EndProgress( pView->GetDocShell() );
}
/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.95  2000/09/18 16:05:54  willem.vandorp
    OpenOffice header added.

    Revision 1.94  2000/07/04 15:20:20  tl
    XHyphenator1 => XHyphenator

    Revision 1.93  2000/04/18 15:35:07  os
    UNICODE

    Revision 1.92  2000/03/23 07:42:45  os
    UNO III

    Revision 1.91  2000/03/08 17:23:12  os
    GetAppWindow() - misuse as parent window eliminated

    Revision 1.90  2000/02/24 12:14:03  tl
    #71915# SvxSpellWrapper::SpellEnd called in SpellEnd now

    Revision 1.89  2000/02/16 20:58:34  tl
    #72219# Locale Umstellung

    Revision 1.88  2000/02/11 14:55:51  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.87  1999/11/24 18:28:37  tl
    check for Service availability

    Revision 1.86  1999/11/19 16:40:23  os
    modules renamed

    Revision 1.85  1999/11/10 11:01:24  tl
     XInterface SpellContinue() -> sal_Bool SpellContinue()
    Ongoing ONE_LINGU implementation

    Revision 1.84  1999/10/25 19:13:24  tl
    ongoing ONE_LINGU implementation

    Revision 1.83  1999/08/31 08:37:30  TL
    #if[n]def ONE_LINGU inserted (for transition of lingu to StarOne)


      Rev 1.82   31 Aug 1999 10:37:30   TL
   #if[n]def ONE_LINGU inserted (for transition of lingu to StarOne)

      Rev 1.81   08 Jul 1999 16:16:14   MA
   Use internal object to toggle wait cursor

      Rev 1.80   08 Jul 1999 10:31:44   MA
   limit wait cursor to document window

      Rev 1.79   12 Aug 1998 18:16:00   HR
   #54781#: GCC braucht Temporary

      Rev 1.78   03 Dec 1997 17:10:10   AMA
   Fix: Paintprobleme durch Actionklammerung bei automatischer Trennung

      Rev 1.77   28 Nov 1997 15:30:32   MA
   includes

      Rev 1.76   28 Nov 1997 13:35:34   AMA
   Fix #45841#: Auch Fehlermeldungen duerfen verschoben werden.

      Rev 1.75   03 Nov 1997 13:21:46   MA
   precomp entfernt

      Rev 1.74   24 Oct 1997 10:30:54   AMA
   Fix #44994#: InfoBox nach Abschluss der Silbentrennung anzeigen

      Rev 1.73   05 Sep 1997 11:46:26   MH
   chg: header

      Rev 1.72   14 Feb 1997 15:19:30   AMA
   Fix #36204#: Falsche Parentbeziehung des Dialogs.

      Rev 1.71   08 Jan 1997 12:55:14   AMA
   New: Rueckwaerts kann unterbunden werden, wird genutzt von der Silbentrennung

      Rev 1.70   04 Dec 1996 23:04:40   MH
   chg: header

      Rev 1.69   09 Oct 1996 18:00:26   MA
   Progress

      Rev 1.68   28 Aug 1996 12:52:34   OS
   includes

      Rev 1.67   14 Mar 1996 11:37:24   AMA
   New: Progress-Anzeige bei Rechtschr. und Silbentrennung

      Rev 1.66   24 Nov 1995 16:57:40   OM
   PCH->PRECOMPILED

      Rev 1.65   31 Oct 1995 18:39:42   OM
   GetFrameWindow entfernt

      Rev 1.64   09 Aug 1995 17:14:04   AMA
   SEG_GLOBALS wieder da

      Rev 1.63   06 Aug 1995 14:36:54   AMA
   Benutzt den SvxSpellWrapper als HyphWrapper

      Rev 1.62   25 Feb 1995 13:33:08   MS
   IBM-Linguistik

      Rev 1.61   18 Nov 1994 16:10:40   MA
   min -> Min, max -> Max

      Rev 1.60   09 Nov 1994 07:59:42   MS
   Includes geaendert

      Rev 1.59   08 Nov 1994 16:47:46   MS
   pSpell ist global

      Rev 1.58   25 Oct 1994 18:21:54   ER
   add: PCH

      Rev 1.57   07 Oct 1994 14:30:30   MS
   Anpassung Sfx

      Rev 1.56   04 Aug 1994 09:59:56   SWG
   swg32: SED awt::Size to SSize, LSize to awt::Size etc.

      Rev 1.55   02 Aug 1994 16:00:18   MS
   Umstellung Linguistik

      Rev 1.54   22 Jul 1994 09:49:36   MS
   Bug 8784 richtuge Anzeige des zu trennenden Wortes

      Rev 1.53   21 Jun 1994 13:26:44   MS
   Bug 8526 Abrrechen des Trennvorganges und Defbutton auf dem MAC

      Rev 1.52   07 Apr 1994 16:58:08   MS
   neues Pragma

      Rev 1.51   07 Apr 1994 16:26:36   MS
   neu LangError

      Rev 1.50   26 Feb 1994 01:58:24   ER
   virt. dtor mit export

      Rev 1.49   26 Feb 1994 01:10:18   ER
   virtuellen dtor wegen export ueberladen

      Rev 1.48   25 Feb 1994 20:44:40   ER
   virtuellen dtor wegen export ueberladen

      Rev 1.47   23 Feb 1994 10:58:24   ER
   SEXPORT

      Rev 1.46   22 Feb 1994 14:40:04   ER
   EXPORT --> SEXPORT

      Rev 1.45   21 Feb 1994 21:35:46   ER
   LINK EXPORT

      Rev 1.44   17 Feb 1994 08:47:02   MI
   SEG_FUNCDEFS ausgefuellt

      Rev 1.43   16 Feb 1994 20:07:34   MI
   SEG_FUNCDEFS ausgefuellt

      Rev 1.42   16 Feb 1994 16:50:56   MI
   Pragmas zurechtgerueckt

      Rev 1.41   01 Feb 1994 18:18:58   MI
   TCOV() entfernt, SW_... nach SEG_... umbenannt

      Rev 1.40   01 Feb 1994 13:44:18   MS
   Umstellung Linguistik v2.0

      Rev 1.39   21 Jan 1994 09:53:10   MS
   Ablauf interaktive Trennung geaendert

      Rev 1.38   20 Jan 1994 18:41:18   MS
   Ablauf geaendert

      Rev 1.37   13 Jan 1994 08:44:48   MI
   Segmentierung per #define ermoeglicht

      Rev 1.36   09 Jan 1994 21:12:54   MI
   Provisorische Segmentierung

      Rev 1.35   06 Dec 1993 13:09:58   MS
   Anpassung der Selektion

      Rev 1.34   06 Dec 1993 10:31:56   MS
   Trennstellen selektieren

      Rev 1.33   27 Sep 1993 01:23:40   MI
   Segmentierung

      Rev 1.32   20 Sep 1993 14:58:52   MS
   Umstellung Lingu

      Rev 1.31   26 Aug 1993 09:46:08   MS
   Nach Weiter am Dokumentanfang Controlls initialisieren

      Rev 1.30   08 Aug 1993 11:56:24   MS
   fuer MSC

      Rev 1.29   08 Aug 1993 09:31:42   MS
   Ablauf interaktive Silbentrennung geaendert

      Rev 1.28   06 Aug 1993 08:13:38   ER
   String Array-Indexe mit sal_uInt16 statt short

      Rev 1.28   06 Aug 1993 08:11:36   ER
   String Array-Indexe mit sal_uInt16 statt short

      Rev 1.27   05 Aug 1993 10:32:30   MS
   Drunken Hyphenator beseitigt

      Rev 1.26   18 Jun 1993 09:21:28   BP
   bug: InitControls(), Initialisierung von nHyphPos

      Rev 1.25   28 May 1993 11:51:42   VB
   Umstellung Precompiled Headers

      Rev 1.24   14 May 1993 11:31:36   MS
   Traveling innerhalb des zu trennenden Wortes korrigiert

      Rev 1.23   27 Apr 1993 08:39:08   OK
   NEU: #pragma hdrstop

      Rev 1.22   20 Apr 1993 13:13:38   MS
   Entflechtung Linguistik

      Rev 1.21   23 Mar 1993 18:18:20   MS

      Rev 1.20   23 Mar 1993 18:10:30   MS
   richtigen Trennindex bestimmen

      Rev 1.19   22 Mar 1993 10:08:26   OK
   Anpassung fuer NT

      Rev 1.18   16 Mar 1993 08:32:42   MS
   Fix fuer kk entfernt

      Rev 1.17   12 Mar 1993 14:49:06   MS
   Uebergeben des SoftHyph geaendert

      Rev 1.16   12 Mar 1993 14:02:34   MS
   Navigation geaendert

      Rev 1.15   11 Mar 1993 14:00:04   MS
   keine alternativwoerter fuer Formatierung

      Rev 1.14   11 Mar 1993 13:54:54   MS
   Ablauf geaendert

      Rev 1.13   09 Mar 1993 10:48:24   MS
   Trennung mit Start und Continue - Mimik

      Rev 1.12   10 Feb 1993 19:59:46   TB
   Umstellung SV21

      Rev 1.11   22 Jan 1993 14:30:32   MS
   String im Header geaendert

      Rev 1.10   05 Jan 1993 10:01:56   MS
   neu mit Sprachanzeige

      Rev 1.9   22 Dec 1992 20:19:00   VB
   Aenderung der FN_-Ids

      Rev 1.8   22 Dec 1992 10:12:26   OK
   Anpassung an M70

      Rev 1.7   21 Dec 1992 16:19:34   MS
   Enable Disable Buttons

      Rev 1.6   18 Dec 1992 11:54:24   MS
   mit SL_SOFT_HYPHEN

      Rev 1.5   11 Dec 1992 13:42:48   MS
   IgnoreButton

      Rev 1.4   17 Nov 1992 16:55:44   MS
   Trennhilfe-Dialog geaendert

------------------------------------------------------------------------*/

diff --git a/sw/source/ui/lingu/makefile.mk b/sw/source/ui/lingu/makefile.mk
new file mode 100644
index 0000000..7f395cae
--- /dev/null
+++ b/sw/source/ui/lingu/makefile.mk
@@ -0,0 +1,100 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:44 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=..$/..$/..

PRJNAME=sw
TARGET=lingu

AUTOSEG=true

PROJECTPCH=ui_pch
PDBTARGET=ui_pch
PROJECTPCHSOURCE=..\ui_1st\ui_pch

# --- Settings -----------------------------------------------------

.INCLUDE :  $(PRJ)$/inc$/swpre.mk
.INCLUDE :  settings.mk
.INCLUDE :  $(PRJ)$/inc$/sw.mk

# --- Files --------------------------------------------------------

CXXFILES = \
        hyp.cxx \
        olmenu.cxx \
        sdrspell.cxx \
        splwrp.cxx

SLOFILES =  \
        $(SLO)$/hyp.obj \
        $(SLO)$/olmenu.obj \
        $(SLO)$/sdrspell.obj \
        $(SLO)$/splwrp.obj

SRCFILES =  \
        olmenu.src

# --- Targets -------------------------------------------------------

.INCLUDE :  target.mk

diff --git a/sw/source/ui/lingu/olmenu.cxx b/sw/source/ui/lingu/olmenu.cxx
new file mode 100644
index 0000000..99b8d6f
--- /dev/null
+++ b/sw/source/ui/lingu/olmenu.cxx
@@ -0,0 +1,895 @@
/*************************************************************************
 *
 *  $RCSfile: olmenu.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:44 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _SVSTDARR_HXX
#define _SVSTDARR_STRINGSDTOR
#include <svtools/svstdarr.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _MySVXACORR_HXX //autogen
#include <svx/svxacorr.hxx>
#endif
#ifndef _SVX_SPLDLG_HXX
#include <svx/spldlg.hxx>
#endif

#ifndef _SFXINIMGR_HXX
#include <svtools/iniman.hxx>
#endif
#ifndef _LINGU_LNGPROPS_HHX_
#include <lingu/lngprops.hxx>
#endif
#ifndef _UNOTOOLS_PROCESSFACTORY_HXX_
#include <unotools/processfactory.hxx>
#endif
#ifndef _UNO_LINGU_HXX
#include <svx/unolingu.hxx>
#endif
#ifndef _COM_SUN_STAR_LINGUISTIC_XOTHERLINGU2_HPP_
#include <com/sun/star/linguistic/XOtherLingu2.hpp>
#endif
#ifndef _COM_SUN_STAR_FRAME_XSTORABLE_HPP_
#include <com/sun/star/frame/XStorable.hpp>
#endif
#ifndef _COM_SUN_STAR_LANG_XMULTISERVICEFACTORY_HPP_
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#endif
#ifndef _SVX_DLGUTIL_HXX
#include <svx/dlgutil.hxx>
#endif
#ifndef _SFXITEMSET_HXX //autogen
#include <svtools/itemset.hxx>
#endif
#ifndef _SVX_LANGITEM_HXX //autogen
#include <svx/langitem.hxx>
#endif


#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _HELPID_H
#include <helpid.h>
#endif
#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>        //CheckSpellChanges
#endif
#ifndef _OLMENU_HXX
#include <olmenu.hxx>
#endif
#ifndef _SWUNDO_HXX
#include <swundo.hxx>
#endif
#ifndef _TEMPAUTO_HXX
#include <tempauto.hxx>     // temporaere Autokorrektur
#endif
#ifndef _OLMENU_HRC
#include <olmenu.hrc>
#endif

using namespace ::com::sun::star;
using namespace ::rtl;

#define C2U(cChar) OUString::createFromAscii(cChar)

/*--------------------------------------------------------------------------

---------------------------------------------------------------------------*/

util::Language lcl_CheckLanguage( const OUString &rWord, uno::Reference< linguistic::XSpellChecker1 >  xSpell )
{
    // andere Sprachen automatisch pr"ufen
    // auch wenn beliebiger Schwachsinn rauskommt
    // NUR: wenn Sprache KEINE oder die neue die Alte ist oder die Sprache
    // nicht vorhanden ist

     util::Language nLang = LANGUAGE_NONE;

    uno::Reference< linguistic::XSpellAlternatives >    xAlt;
    uno::Sequence< util::Language > aLangs;
    if (xSpell.is())
        aLangs = xSpell->getLanguages();
    const util::Language *pLang = aLangs.getConstArray();
    sal_Int16   nCount = aLangs.getLength();

    for (sal_Int16 i = 0;  i < nCount;  i++)
    {
        if (pLang[i] != LANGUAGE_NONE)
        {
            if (xSpell->isValid( rWord, pLang[i] ))
            {
                nLang = pLang[i];
                break;
            }
        }
    }
    return nLang;
}


/*SwSpellPopup::SwSpellPopup( SwWrtShell* pWrtSh, const uno::Reference< linguistic::XSpellAlternatives >  &xAlt ) :
    PopupMenu(SW_RES(MN_SPELL_POPUP)),
    pSh ( pWrtSh ),
    xSpellAlt   (xAlt)
{
    DBG_ASSERT(xSpellAlt.is(), "no spelling alternatives available");

    uno::Sequence< UString >    aStrings;
    if (xSpellAlt.is())
        aStrings = xSpellAlt->getAlternatives();
    const UString *pString = aStrings.getConstArray();
    sal_Int16 nStringCount = aStrings.getLength();

    PopupMenu *pMenu = GetPopupMenu(MN_AUTOCORR);
    sal_Bool bEnable = sal_False;
    if( nStringCount )
    {
        InsertSeparator(0);
        bEnable = sal_True;
        for( sal_uInt16 i = 0, nPos = 1, nId = MN_AUTOCORR_START + 1;
            i < nStringCount; ++i, ++nPos, ++nId )
        {
            const String aEntry = U2S( pString[ i ] );
            InsertItem( nPos, aEntry, 0, i );
            SetHelpId( nPos, HID_LINGU_REPLACE);
            pMenu->InsertItem( nId, aEntry );
            pMenu->SetHelpId( nId, HID_LINGU_AUTOCORR);
        }
    }
    EnableItem( MN_AUTOCORR, bEnable );

    nCorrLang = LANGUAGE_NONE;
    if (xSpellAlt.is())
        nCorrLang = lcl_CheckLanguage( xSpellAlt->getWord(), ::GetSpellChecker() );
    if( nCorrLang != LANGUAGE_NONE )
    {
        InsertSeparator();
        String aTmp( ::GetLanguageString( nCorrLang ) );
        InsertItem( MN_LANGUAGE_WORD, String( SW_RES( STR_WORD ) ) + aTmp );
        SetHelpId( MN_LANGUAGE_WORD, HID_LINGU_WORD_LANGUAGE );
        InsertItem( MN_LANGUAGE_PARA, String( SW_RES( STR_PARAGRAPH ) ) + aTmp );
        SetHelpId( MN_LANGUAGE_PARA, HID_LINGU_PARA_LANGUAGE );
    }

    pMenu = GetPopupMenu(MN_INSERT);
    //DBG_ASSERT(0, "Fremdlinguistik fehlt noch");
<<<<<<< olmenu.cxx
#ifdef NOT_YET
    if( pSpell->HasOtherLingu() && pSpell->HasOtherSpell() )
    {
        bEnable = sal_True;
        pMenu->InsertItem( MN_INSERT_START,
            pSpell->GetOtherLinguName( pSpell->GetOtherIdx() ) );
        pMenu->SetHelpId( MN_INSERT_START, HID_LINGU_ADD_WORD);
    }
    else
#endif
    {
        bEnable = sal_False;

        uno::Reference< linguistic::XDictionaryList >   xDicList( SvxGetDictionaryList() );
=======


    bEnable = FALSE;    // enable MN_INSERT?

    INT16 nOtherIndex       = -1;
    BOOL  bHasOtherFunc     = FALSE;
    BOOL  bIsStandardSpell  = TRUE;
    XPropertySetRef xProp( SvxGetLinguPropertySet() );
    if (xProp.is())
    {
        nOtherIndex = xProp->getPropertyValue(
                            S2U(UPN_OTHER_LINGU_INDEX) ).getINT16();
        bIsStandardSpell = xProp->getPropertyValue(
                            S2U(UPN_IS_STANDARD_SPELL_CHECKER) ).getBOOL();
    }

    if (nOtherIndex >= 0)
    {
        XMultiServiceFactoryRef xMgr( NAMESPACE_USR( getProcessServiceManager)() );
        xOther = XOtherLinguRef( xMgr->createInstance(
                        S2U("com.sun.star.linguistic.OtherLingu") ), USR_QUERY );
        if (xOther.is())
        {
            bHasOtherFunc = xOther->hasSpellChecker( nOtherIndex );
            if (  bHasOtherFunc)
            {
                bEnable = TRUE;
                pMenu->InsertItem( MN_INSERT_START,
                    U2S( xOther->getIdentifier( nOtherIndex ) ) );
                pMenu->SetHelpId( MN_INSERT_START, HID_LINGU_ADD_WORD);
            }
        }
    }

    if (nOtherIndex < 0  ||  bIsStandardSpell)
    {
        XDictionaryListRef  xDicList( SvxGetDictionaryList() );
>>>>>>> 1.55
        if (xDicList.is())
        {
            // add active, positive dictionary to dic-list (if not already done).
            // This is to ensure that there is at least on dictionary to which
            // words could be added.
            uno::Reference< linguistic::XDictionary1 >  xDic( SvxGetOrCreatePosDic( xDicList ) );
            if (xDic.is())
                xDic->setActive( sal_True );

            aDics = xDicList->getDictionaries();
            const uno::Reference< linguistic::XDictionary >  *pDic = aDics.getConstArray();
            sal_Int32 nDicCount = aDics.getLength();

            sal_Int16 nLanguage = LANGUAGE_NONE;
            if (xSpellAlt.is())
                nLanguage = SvxLocaleToLanguage( xSpellAlt->getLocale() );

            for( sal_Int32 i = 0; i < nDicCount; i++ )
            {
                uno::Reference< linguistic::XDictionary1 >  xDic( pDic[i], uno::UNO_QUERY );
                if (!xDic.is())
                    continue;

                LanguageType nActLanguage = xDic->getLanguage();
                if( xDic->isActive()
                    &&  xDic->getDictionaryType() != linguistic::DictionaryType_NEGATIVE
                    && (nLanguage == nActLanguage || LANGUAGE_NONE == nActLanguage )
                    && SvxGetIgnoreAllList() != xDic )
                {
                    // the extra 1 is because of the (possible) external
                    // linguistic entry above
                    pMenu->InsertItem( MN_INSERT_START + i + 1, U2S( xDic->getName() ) );
                    bEnable = sal_True;
                }
            }
        }
    }
    EnableItem( MN_INSERT, bEnable );

    RemoveDisabledEntries( sal_True, sal_True );
}
*/
SwSpellPopup::SwSpellPopup( SwWrtShell* pWrtSh, const uno::Reference< linguistic::XSpellAlternatives >  &xAlt ) :
    PopupMenu(SW_RES(MN_SPELL_POPUP)),
    pSh ( pWrtSh ),
    xSpellAlt   (xAlt)
{
    DBG_ASSERT(xSpellAlt.is(), "no spelling alternatives available");

    uno::Sequence< OUString >   aStrings;
    if (xSpellAlt.is())
        aStrings = xSpellAlt->getAlternatives();
    const OUString *pString = aStrings.getConstArray();
    sal_Int16 nStringCount = aStrings.getLength();

    PopupMenu *pMenu = GetPopupMenu(MN_AUTOCORR);
    sal_Bool bEnable = sal_False;
    if( nStringCount )
    {
        InsertSeparator(0);
        bEnable = sal_True;
        for( sal_uInt16 i = 0, nPos = 1, nId = MN_AUTOCORR_START + 1;
            i < nStringCount; ++i, ++nPos, ++nId )
        {
            const String aEntry = pString[ i ];
            InsertItem( nPos, aEntry, 0, i );
            SetHelpId( nPos, HID_LINGU_REPLACE);
            pMenu->InsertItem( nId, aEntry );
            pMenu->SetHelpId( nId, HID_LINGU_AUTOCORR);
        }
    }
    EnableItem( MN_AUTOCORR, bEnable );

    nCorrLang = LANGUAGE_NONE;
    if (xSpellAlt.is())
        nCorrLang = lcl_CheckLanguage( xSpellAlt->getWord(), ::GetSpellChecker() );
    if( nCorrLang != LANGUAGE_NONE )
    {
        InsertSeparator();
        String aTmp( ::GetLanguageString( nCorrLang ) );
        InsertItem( MN_LANGUAGE_WORD, String( SW_RES( STR_WORD ) ).Append(aTmp) );
        SetHelpId( MN_LANGUAGE_WORD, HID_LINGU_WORD_LANGUAGE );
        InsertItem( MN_LANGUAGE_PARA, String( SW_RES( STR_PARAGRAPH ) ).Append(aTmp) );
        SetHelpId( MN_LANGUAGE_PARA, HID_LINGU_PARA_LANGUAGE );
    }

    pMenu = GetPopupMenu(MN_INSERT);
    //DBG_ASSERT(0, "Fremdlinguistik fehlt noch");

    bEnable = FALSE;    // enable MN_INSERT?

    sal_Int16 nOtherIndex       = -1;
    sal_Bool  bHasOtherFunc     = FALSE;
    sal_Bool  bIsStandardSpell  = TRUE;
    uno::Reference< beans::XPropertySet > xProp( SvxGetLinguPropertySet() );
    if (xProp.is())
    {
        nOtherIndex = *(sal_Int16*)xProp->getPropertyValue(C2U(UPN_OTHER_LINGU_INDEX) ).getValue();
        bIsStandardSpell = *(sal_Bool*)xProp->getPropertyValue(
                            C2U(UPN_IS_STANDARD_SPELL_CHECKER) ).getValue();
    }

    if (nOtherIndex >= 0)
    {

        uno::Reference< lang::XMultiServiceFactory >
                                    xMgr = utl::getProcessServiceFactory();
        xOther = uno::Reference< linguistic::XOtherLingu >( xMgr->createInstance(
                            C2U("com.sun.star.linguistic.OtherLingu") ), uno::UNO_QUERY );
        if (xOther.is())
        {
            bHasOtherFunc = xOther->hasSpellChecker( nOtherIndex );
            if (/*nOtherIndex >= 0  &&*/  bHasOtherFunc)
            {
                bEnable = TRUE;
                pMenu->InsertItem( MN_INSERT_START,
                    xOther->getIdentifier( nOtherIndex ) );
                pMenu->SetHelpId( MN_INSERT_START, HID_LINGU_ADD_WORD);
            }
        }
    }

    if (nOtherIndex < 0  ||  bIsStandardSpell)
    {
        uno::Reference< linguistic::XDictionaryList >   xDicList( SvxGetDictionaryList() );
        if (xDicList.is())
        {
            // add active, positive dictionary to dic-list (if not already done).
            // This is to ensure that there is at least on dictionary to which
            // words could be added.
            uno::Reference< linguistic::XDictionary1 >  xDic( SvxGetOrCreatePosDic( xDicList ) );
            if (xDic.is())
                xDic->setActive( sal_True );

            aDics = xDicList->getDictionaries();
            const uno::Reference< linguistic::XDictionary >  *pDic = aDics.getConstArray();
            sal_Int32 nDicCount = aDics.getLength();

            sal_Int16 nLanguage = LANGUAGE_NONE;
            if (xSpellAlt.is())
                nLanguage = SvxLocaleToLanguage( xSpellAlt->getLocale() );

            for( sal_Int32 i = 0; i < nDicCount; i++ )
            {
                uno::Reference< linguistic::XDictionary1 >  xDic( pDic[i], uno::UNO_QUERY );
                if (!xDic.is() || SvxGetIgnoreAllList() == xDic)
                    continue;

                uno::Reference< frame::XStorable > xStor( xDic, uno::UNO_QUERY );
                LanguageType nActLanguage = xDic->getLanguage();
                if( xDic->isActive()
                    &&  xDic->getDictionaryType() != linguistic::DictionaryType_NEGATIVE
                    && (nLanguage == nActLanguage || LANGUAGE_NONE == nActLanguage )
                    && (!xStor.is() || !xStor->isReadonly()) )
                {
                    // the extra 1 is because of the (possible) external
                    // linguistic entry above
                    pMenu->InsertItem( MN_INSERT_START + i + 1, xDic->getName() );
                    bEnable = sal_True;
                }
            }
        }
    }
    EnableItem( MN_INSERT, bEnable );

    RemoveDisabledEntries( TRUE, TRUE );

}

/*--------------------------------------------------------------------------

---------------------------------------------------------------------------*/
sal_uInt16  SwSpellPopup::Execute( Window* pWin, const Point& rWordPos )
{
    sal_uInt16 nRet = PopupMenu::Execute(pWin, pWin->LogicToPixel(rWordPos));
    sal_Bool bAutoCorr = sal_False;
    if( nRet > MN_AUTOCORR_START && nRet != USHRT_MAX )
    {
        nRet -= MN_AUTOCORR_START;
        bAutoCorr = sal_True;
    }

    if( nRet && nRet != USHRT_MAX)
    {
        int nAltIdx = nRet - 1;
        if( xSpellAlt.is()  &&  nAltIdx < xSpellAlt->getAlternativesCount() )
        {
            sal_Bool bOldIns = pSh->IsInsMode();
            pSh->SetInsMode( sal_True );

            pSh->StartUndo(UIUNDO_REPLACE);
            pSh->StartAction();
            pSh->DelLeft();

            const OUString *pString = xSpellAlt->getAlternatives().getConstArray();
            DBG_ASSERT( 0 <= nAltIdx && nAltIdx <= xSpellAlt->getAlternativesCount(),
                    "index out of range");
            String aTmp( pString[ nAltIdx ] );
            String aOrig( xSpellAlt->getWord());

            // if orginal word has a trailing . (likely the end of a sentence)
            // and the replacement text hasn't, then add it to the replacement
            if (aTmp.Len() && aOrig.Len() &&
                '.' == aOrig.GetChar( aOrig.Len() - 1) && /* !IsAlphaNumeric ??*/
                '.' != aTmp.GetChar( aTmp.Len() - 1))
            {
                aTmp += '.';
            }

            pSh->Insert( aTmp );
            pSh->EndAction();
            pSh->EndUndo(UIUNDO_REPLACE);

            pSh->SetInsMode( bOldIns );


            // nur aufnehmen, wenn es NICHT schon in der Autokorrektur vorhanden ist
            SvxAutoCorrect* pACorr = OFF_APP()->GetAutoCorrect();

            LanguageType eLanguage = SvxLocaleToLanguage( xSpellAlt->getLocale() );

            String aOrigWord( xSpellAlt->getWord() ) ;
            String aNewWord;
            if( nRet )
                aNewWord = pString[ nAltIdx ];
            else
                aNewWord = aOrigWord;
            SvxPrepareAutoCorrect( aOrigWord, aNewWord );
            if( bAutoCorr )
            {
                pACorr->PutText( aOrigWord, aNewWord, eLanguage );
                if( pTempAuto )
                    pTempAuto->Delete( aOrigWord );
            }
            else
            {
                SvxAutocorrWord aAWord( aOrigWord, aEmptyStr );
                if( !pACorr->GetAutocorrWordList(eLanguage)->Seek_Entry( &aAWord ))
                {
                    SwCorrection* pCorr = new SwCorrection( aAWord.GetShort() );
                    pCorr->Correct() = aNewWord;
                    if( !pTempAuto )
                        pTempAuto = new SwTempAuto();
                    pTempAuto->Insert( pCorr );
                }
            }

        }
        else
            switch( nRet )
            {
                case MN_SPELLING:
                {
                    pSh->Left();
                    {
                        SvxDicListChgClamp aClamp( SvxGetDictionaryList() );
                        pSh->GetView().GetViewFrame()->GetDispatcher()->
                            Execute( FN_SPELLING_DLG, SFX_CALLMODE_ASYNCHRON );
                    }
                    // should be superfluos by adding the ignore list to
                    // the dictionary list.
                    // SW_MOD()->CheckSpellChanges( sal_False, );
                }
                break;
                case MN_IGNORE :
                {
                    sal_Int16 nAddRes = SvxAddEntryToDic(
                            uno::Reference< linguistic::XDictionary > ( SvxGetIgnoreAllList(), uno::UNO_QUERY ),
                            xSpellAlt->getWord(), sal_False,
                            aEmptyStr, LANGUAGE_NONE );
                }
                break;
                case MN_INSERT:
                    DBG_ERROR("geht noch nicht!")
                break;
                case MN_LANGUAGE_WORD:
                case MN_LANGUAGE_PARA:
                {
                    pSh->StartAction();

                    if( MN_LANGUAGE_PARA == nRet )
                    {
                        if( !pSh->IsSttPara() )
                            pSh->MovePara( fnParaCurr, fnParaStart );
                        pSh->SwapPam();
                        if( !pSh->IsEndPara() )
                            pSh->MovePara( fnParaCurr,  fnParaEnd );
                    }

                    SfxItemSet aSet(pSh->GetAttrPool(), RES_CHRATR_LANGUAGE,
                                                        RES_CHRATR_LANGUAGE);
                    aSet.Put( SvxLanguageItem( nCorrLang ) );
                    pSh->SetAttr( aSet );

                    pSh->EndAction();
                }
                break;
                default:
                    if(nRet >= MN_INSERT_START )
                    {
                        OUString aWord( xSpellAlt->getWord() );
                        if (MN_INSERT_START == nRet)
                        {
                            uno::Reference< linguistic::XOtherLingu2 > xOther2( xOther, uno::UNO_QUERY );
                            if (xOther2.is())
                            {
                                xOther2->addWord( 0, aWord,
                                    SvxLocaleToLanguage( xSpellAlt->getLocale() ) );

                                // first parameter is TRUE since this menue
                                // is only invoked while online-spelling is
                                // active
                                SW_MOD()->CheckSpellChanges( TRUE, TRUE, FALSE );
                            }
                        }
                        else
                        {
                            INT32 nDicIdx = nRet - MN_INSERT_START - 1;
                            DBG_ASSERT( nDicIdx < aDics.getLength(),
                                        "dictionary index out of range" );
                            uno::Reference< linguistic::XDictionary > xDic =
                                aDics.getConstArray()[nDicIdx];
                            INT16 nAddRes = SvxAddEntryToDic( xDic,
                                aWord, FALSE, aEmptyStr, LANGUAGE_NONE );

                            /*if (DIC_ERR_NONE == nAddRes)
                                SW_MOD()->CheckSpellChanges( FALSE, TRUE, FALSE );
                            else*/
                            if (DIC_ERR_NONE != nAddRes
                                 && !xDic->getEntry( aWord ).is())
                            {
                                SvxDicError(
                                    &pSh->GetView().GetViewFrame()->GetWindow(),
                                    nAddRes );
                            }
                        }

                        //should work with dictionaryListener mechanism
                        //SW_MOD()->CheckSpellChanges( FALSE, FALSE, FALSE );
                    }
            }
    }
    pSh->EnterStdMode();
    return nRet;
}




/*************************************************************************

      $Log: not supported by cvs2svn $
      Revision 1.64  2000/09/18 16:05:54  willem.vandorp
      OpenOffice header added.

      Revision 1.63  2000/09/07 15:59:25  os
      change: SFX_DISPATCHER/SFX_BINDINGS removed

      Revision 1.62  2000/05/24 11:54:40  khz
      Change for Unicode

      Revision 1.61  2000/05/16 17:27:46  jp
      Changes for Unicode

      Revision 1.60  2000/05/16 09:15:13  os
      project usr removed

      Revision 1.59  2000/05/09 14:46:08  os
      UNICODE

      Revision 1.58  2000/04/18 15:35:07  os
      UNICODE

      Revision 1.57  2000/04/12 11:01:24  tl
      #74727# bugfix von src569 nachgezogen

      Revision 1.56  2000/03/23 07:32:27  os
      UNO III

      Revision 1.55  2000/03/16 10:51:17  tl
      #73839# use language of word to check for dictionories to be displayed in SwSpellPopup

      Revision 1.54  2000/03/15 14:49:19  tl
      #70734# AddWord for external linguistic added

      Revision 1.53  2000/03/07 10:40:19  tl
      #72833# SvxPrepareAutoCorrect used

      Revision 1.52  2000/02/25 10:44:07  tl
      #62869# new error message when adding word to dictionary failed

      Revision 1.51  2000/02/22 16:38:05  tl
      #73380# standard.dic created, acivated and added to list

      Revision 1.50  2000/02/21 15:57:17  tl
      #72081# strip '.' from word before adding to dictionaries

      Revision 1.49  2000/02/16 20:58:50  tl
      #72219# Locale Umstellung

      Revision 1.48  2000/02/04 12:22:19  tl
      #72446# IgnoreAllList removed from list of selectable dictionaries

      Revision 1.47  2000/02/01 11:53:12  tl
      #71634# insert '.' to replacement if original word has it

      Revision 1.46  2000/01/11 10:28:08  tl
      #70735# use isActive/setActive from linguistic::XDictionary now

      Revision 1.45  1999/12/22 19:56:14  jp
      Bug #71270#: SwSpellPopup - insert separator

      Revision 1.44  1999/12/16 13:52:07  tl
      #70973# PopupMenu ok even without spelling alternatives

      Revision 1.43  1999/11/24 18:30:28  tl
      check for Service availability

      Revision 1.42  1999/11/19 16:40:23  os
      modules renamed

      Revision 1.41  1999/11/10 11:03:36  tl
      Ongoing ONE_LINGU implementation

      Revision 1.40  1999/10/18 13:15:34  os
      external lingu: no special handling in WIN

      Revision 1.39  1999/09/21 10:22:26  rt
      #65293# sysdep.hxx -> svwin.h

      Revision 1.38  1999/09/21 10:16:23  os
      Sysdepen::GethWnd -> return 0

      Revision 1.37  1999/09/20 11:08:21  hr
      #65293#: removed <vcl/sysdep.hxx>

      Revision 1.36  1999/08/31 08:37:26  TL
      #if[n]def ONE_LINGU inserted (for transition of lingu to StarOne)


      Rev 1.35   31 Aug 1999 10:37:26   TL
   #if[n]def ONE_LINGU inserted (for transition of lingu to StarOne)

      Rev 1.34   22 Feb 1999 13:37:56   MA
   #62126# gesperrte Eintraege entfernen lassen

      Rev 1.33   24 Nov 1998 10:05:10   OS
   #59590# mehrsprachige Autokorrektur

      Rev 1.32   29 Oct 1998 16:29:54   AMA
   Fix #58621#: Falsch geschriebene Woerter _nicht_ in AusnahmeWB uebernehmen

      Rev 1.31   28 Jul 1998 15:34:50   AMA
   Fix #54147#: Nicht zuviel loeschen, Ueberschreibmodus kurzzeitig ausschalten

      Rev 1.30   09 Jun 1998 15:28:44   AMA
   Fix #50994#: Bei der Absatzselektion nicht uebers Ziel hinausschiessen

      Rev 1.29   07 May 1998 15:05:04   AMA
   New: SpellPopup bietet Sprachumstellung am Wort oder Absatz an

      Rev 1.28   29 Apr 1998 09:30:04   MA
   ucb::Command, Contextmenu auch fuer Tastatur

      Rev 1.27   21 Nov 1997 13:00:26   MA
   includes

      Rev 1.26   18 Sep 1997 14:00:10   OS
   Pointer::GetPosPixel fuer VCL ersetzt

      Rev 1.25   29 Aug 1997 16:35:50   MH
   chg: Syntax

      Rev 1.24   29 Aug 1997 15:59:24   OS
   PopupMenu::Execute mit Window* fuer VCL

      Rev 1.23   29 Aug 1997 14:02:46   OS
   DLL-Umbau

      Rev 1.22   07 Aug 1997 14:34:00   HJS
   includes

      Rev 1.21   14 Jul 1997 08:07:58   OS
   HelpIDs fuer SpellPopup #41627#

      Rev 1.20   30 Jun 1997 10:29:06   MH
   cat fuer OS2

      Rev 1.19   26 Jun 1997 13:31:40   AMA
   New: AddWord mit Window-Handle + Automatisches Aufnehmen unbekannter Woerter

      Rev 1.18   05 Jun 1997 17:28:52   AMA
   New: Fremdlinguistik nimmt auch Woerter auf

      Rev 1.17   04 Feb 1997 13:13:00   AMA
   New: Online-Spelling-Vorschlag in die Autokorrektur aufnehmen

      Rev 1.16   11 Nov 1996 10:58:52   MA
   ResMgr

      Rev 1.15   06 Nov 1996 19:57:04   MH
   SwSplCfg -> OfaSplCfg

      Rev 1.14   24 Oct 1996 13:36:28   JP
   String Umstellung: [] -> GetChar()

      Rev 1.13   23 Oct 1996 13:49:28   JP
   SVMEM -> SVSTDARR Umstellung

      Rev 1.12   15 Oct 1996 14:14:46   JP
   AutoCorrCfg in die OfficeApplication verschoben

      Rev 1.11   28 Aug 1996 12:52:34   OS
   includes

      Rev 1.10   21 Jun 1996 10:33:32   AMA
   New #28010#: Temporaere Autokorrektur

      Rev 1.9   20 May 1996 09:58:38   AMA
   Fix: SvStringsDtor statt SvStrings

      Rev 1.8   26 Apr 1996 15:47:10   AMA
   Fix #27394#: Geprueftes Wort jetzt als erstes der Alternativen

      Rev 1.7   26 Apr 1996 10:18:10   AMA
   Fix #27394#: Geprueftes Wort jetzt als erstes Element der Alternativ-Liste.

      Rev 1.6   23 Apr 1996 10:33:28   AMA
   Fix #27260#: Online-Spelling-PopUp und Punkte, Anfuehrungszeichen etc.

      Rev 1.5   05 Mar 1996 11:13:30   AMA
   Fix: GetCorrect() selektiert; Fix: Punkte bei Abkrzg. und Satzende beachten

      Rev 1.4   29 Feb 1996 10:31:30   AMA
   Opt: SpellItAgainSam startet Idlen ggf. auch ohne Spell-Invalidierung

      Rev 1.3   27 Feb 1996 17:04:56   AMA
   New: CheckSpellChanges()

      Rev 1.2   26 Feb 1996 07:50:56   OS
   Aufnehmen-enable berichtigt

      Rev 1.1   23 Feb 1996 08:33:42   OS
   Woerterbuecher nach Sprache anbieten, Woerter aufnehmen

      Rev 1.0   22 Feb 1996 15:55:28   OS
   Initial revision.

*************************************************************************/




















































diff --git a/sw/source/ui/lingu/olmenu.hrc b/sw/source/ui/lingu/olmenu.hrc
new file mode 100644
index 0000000..71937ef
--- /dev/null
+++ b/sw/source/ui/lingu/olmenu.hrc
@@ -0,0 +1,87 @@
/*************************************************************************
 *
 *  $RCSfile: olmenu.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:44 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _OLMENU_HRC
#define _OLMENU_HRC

#include "rcid.hrc"

#define MN_SPELL_POPUP  (RC_LINGU_BEGIN + 1)
#define STR_SPELL_OK    (RC_LINGU_BEGIN + 2)
#define STR_HYP_OK      (RC_LINGU_BEGIN + 3)
#define STR_WORD        (RC_LINGU_BEGIN + 4)
#define STR_PARAGRAPH   (RC_LINGU_BEGIN + 5)

#define MN_SPELLING     100
#define MN_IGNORE       102
#define MN_INSERT       103
#define MN_AUTOCORR     104
#define MN_LANGUAGE_WORD 105
#define MN_LANGUAGE_PARA 106

#define MN_INSERT_START 500
#define MN_AUTOCORR_START 900

#endif




diff --git a/sw/source/ui/lingu/olmenu.src b/sw/source/ui/lingu/olmenu.src
new file mode 100644
index 0000000..4e72d69
--- /dev/null
+++ b/sw/source/ui/lingu/olmenu.src
@@ -0,0 +1,298 @@
/*************************************************************************
 *
 *  $RCSfile: olmenu.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:44 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
/* StarView ressource file */

#include "olmenu.hrc"
#include "helpid.h"
#define SEPARATOR       MenuItem { Separator = TRUE; };
Menu MN_SPELL_POPUP
{
    ItemList =
    {
        MenuItem
        {
            Identifier = MN_SPELLING ;
            HelpID = HID_LINGU_SPELLING_DLG ;
            Text = "~Rechtschreibung" ;
            Text [ English ] = "~Spelling" ;
            Text [ english_us ] = "~Spellcheck" ;
            Text [ italian ] = "Controllo ~ortografico" ;
            Text [ spanish ] = "Ortogra~fía" ;
            Text [ french ] = "~Orthographe" ;
            Text [ dutch ] = "~Spellingcontrole" ;
            Text [ swedish ] = "~Rättstavning" ;
            Text [ danish ] = "Stavekont~rol" ;
            Text [ portuguese ] = "Or~tografia" ;
            Text [ portuguese_brazilian ] = "~Rechtschreibung" ;
            Text[ chinese_simplified ] = "Õý×Ö·¨(~S)";
            Text[ russian ] = "Ïðàâ~îïèñàíèå";
            Text[ polish ] = "~Pisownia";
            Text[ japanese ] = "•¶ÍZ³(~S)";
            Text[ chinese_traditional ] = "«÷¦r(~S)";
            Text[ arabic ] = "~ÊÏÞíÞ ÅãáÇÆí";
            Text[ dutch ] = "~Spellingcontrole";
            Text[ chinese_simplified ] = "Õý×Ö·¨(~S)";
            Text[ greek ] = "Ïñèïã~ñáößá";
            Text[ korean ] = "¸ÂÃã¹ý(~S)";
            Text[ turkish ] = "~Yazým kýlavuzu";
            Text[ language_user1 ] = " ";
        };
        MenuItem
        {
            Identifier = MN_INSERT ;
            HelpID = HID_LINGU_ADD_WORD ;
            Text = "~Aufnehmen" ;
            Text [ English ] = "~Insert" ;
            SubMenu = Menu
            {
            };
            Text [ english_us ] = "~Add" ;
            Text [ italian ] = "A~ggiungi" ;
            Text [ spanish ] = "~Incluir" ;
            Text [ french ] = "~Ajouter" ;
            Text [ dutch ] = "~Toevoegen" ;
            Text [ swedish ] = "~Lägg till" ;
            Text [ danish ] = "Tilføj" ;
            Text [ portuguese ] = "~Adicionar" ;
            Text [ portuguese_brazilian ] = "~Aufnehmen" ;
            Text[ chinese_simplified ] = "½ÓÊÜ(~A)";
            Text[ russian ] = "Äîáàâèòü";
            Text[ polish ] = "Dodaj";
            Text[ japanese ] = "’ljÁ(~A)";
            Text[ chinese_traditional ] = "¥[¤J(~A)";
            Text[ arabic ] = "ÅÖÇÝÉ";
            Text[ dutch ] = "~Toevoegen";
            Text[ chinese_simplified ] = "½ÓÊÜ(~A)";
            Text[ greek ] = "Ðñ~ïóèÞêç";
            Text[ korean ] = "Ãß°¡(~A)";
            Text[ turkish ] = "Ekle";
            Text[ language_user1 ] = " ";
        };
        MenuItem
        {
            Identifier = MN_IGNORE ;
            HelpID = HID_LINGU_IGNORE_WORD ;
            /* ### ACHTUNG: Neuer Text in Resource? Alle i~gnorieren : ~Ignorieren */
            /* ### ACHTUNG: Neuer Text in Resource? Alle i~gnorieren : ~Ignorieren */
            Text = "Alle i~gnorieren" ;
            Text [ ENGLISH ] = "I~gnore all" ;
            Text [ norwegian ] = "I~gnorer alle" ;
            Text [ italian ] = "~Ignora tutto" ;
            Text [ portuguese_brazilian ] = "I~gnorar tudo" ;
            Text [ portuguese ] = "~Ignorar tudo" ;
            Text [ finnish ] = "O~hita kaikki" ;
            Text [ danish ] = "Ignorer alle" ;
            Text [ french ] = "~Ignorer tout" ;
            Text [ swedish ] = "~Ignorera alla" ;
            Text [ dutch ] = "Alle ~negeren" ;
            Text [ spanish ] = "~Ignorar todo" ;
            Text [ english_us ] = "Ignore All" ;
            Text[ chinese_simplified ] = "È«²¿ºöÂÔ(~I)";
            Text[ russian ] = "Ïðîïóñêàòü âñå";
            Text[ polish ] = "Zignoruj wszystkie";
            Text[ japanese ] = "‚·‚ׂ˳ދ‚·‚é";
            Text[ language_user1 ] = " ";
            Text[ chinese_traditional ] = "¥þ³¡©¿²¤(~I)";
            Text[ arabic ] = "ÊÌÇåá Çáßá";
            Text[ dutch ] = "Alle ~negeren";
            Text[ chinese_simplified ] = "È«²¿ºöÂÔ(~I)";
            Text[ greek ] = "ÐáñÜ~âëåøç üëùí";
            Text[ korean ] = "¸ðµÎ ¹«½Ã";
            Text[ turkish ] = "Tümünü yok say";
        };
        MenuItem
        {
            Identifier = MN_AUTOCORR ;
            HelpID = HID_LINGU_AUTOCORR ;
            Text = "Auto~Korrektur" ;
            Text [ English ] = "~AutoCorrect" ;
            SubMenu = Menu
            {
            };
            Text [ english_us ] = "AutoCorrect" ;
            Text [ portuguese_brazilian ] = "Auto~Korrektur" ;
            Text [ swedish ] = "Auto~Korrigering" ;
            Text [ danish ] = "AutoKorrektur" ;
            Text [ italian ] = "Correzione automatica" ;
            Text [ spanish ] = "Auto~Corrección" ;
            Text [ french ] = "AutoCo~rrection" ;
            Text [ dutch ] = "Auto~Correctie" ;
            Text [ portuguese ] = "Auto~Correcção" ;
            Text[ chinese_simplified ] = "×Ô¶¯¸üÕý(~K)";
            Text[ russian ] = "Àâòîçàìåíà";
            Text[ polish ] = "Autokorekta";
            Text[ japanese ] = "µ°ÄºÚ¸Ä";
            Text[ chinese_traditional ] = "¦Û°Ê®Õ¥¿(~K)";
            Text[ arabic ] = "ÊÕÍíÍ ÊáÞÇÆí";
            Text[ dutch ] = "Auto~Correctie";
            Text[ chinese_simplified ] = "×Ô¶¯¸üÕý(~K)";
            Text[ greek ] = "Áõôï~Äéüñèùóç";
            Text[ korean ] = "ÀÚµ¿ ¸ÂÃã";
            Text[ turkish ] = "Otomatik düzeltme";
            Text[ language_user1 ] = " ";
        };
    };
};
String STR_WORD
{
    Text = "Wort ist " ;
    Text [ ENGLISH ] = "word in" ;
    Text [ portuguese ] = "Palavra em " ;
    Text [ english_us ] = "word is " ;
    Text [ portuguese_brazilian ] = "Wort ist " ;
    Text [ swedish ] = "ord är " ;
    Text [ danish ] = "Ordet er " ;
    Text [ italian ] = "Il termine è " ;
    Text [ spanish ] = "La palabra es " ;
    Text [ french ] = "Le mot est en " ;
    Text [ dutch ] = "Woord is  " ;
    Text[ chinese_simplified ] = "µ¥´ÊÊÇ ";
    Text[ russian ] = "ßçûê ñëîâà: ";
    Text[ polish ] = "S³owo jest   ";
    Text[ japanese ] = "’PŒê‚Í ";
    Text[ chinese_traditional ] = "¦r¬O ";
    Text[ language_user1 ] = " ";
    Text[ arabic ] = "áÛÉ ÇáßáãÉ: ";
    Text[ dutch ] = "Woord is  ";
    Text[ chinese_simplified ] = "µ¥´ÊÊÇ ";
    Text[ greek ] = "Ç ëÝîç åßíáé ";
    Text[ korean ] = "´Ü¾î´Â ";
    Text[ turkish ] = "Sözcük: ";
};
String STR_PARAGRAPH
{
    Text = "Absatz ist " ;
    Text [ ENGLISH ] = "Paragraph in" ;
    Text [ portuguese ] = "Parágrafo em " ;
    Text [ english_us ] = "Paragraph is " ;
    Text [ portuguese_brazilian ] = "Absatz ist " ;
    Text [ swedish ] = "Stycket är " ;
    Text [ danish ] = "Afsnittet er " ;
    Text [ italian ] = "Il paragrafo è " ;
    Text [ spanish ] = "El párrafo es  " ;
    Text [ french ] = "Le paragraphe est en" ;
    Text [ dutch ] = "Alinea is  " ;
    Text[ chinese_simplified ] = "¶ÎÂäÊÇ ";
    Text[ russian ] = "ßçûê àáçàöà: ";
    Text[ polish ] = "Akapit jest   ";
    Text[ japanese ] = "’i—Ž‚Í ";
    Text[ chinese_traditional ] = "¬q¸¨¬O ";
    Text[ arabic ] = "áÛÉ ÇáÝÞÑÉ: ";
    Text[ language_user1 ] = " ";
    Text[ dutch ] = "Alinea is  ";
    Text[ chinese_simplified ] = "¶ÎÂäÊÇ ";
    Text[ greek ] = "Ç ðáñÜãñáöïò åßíáé ";
    Text[ korean ] = "´Ü¶ôÀº ";
    Text[ turkish ] = "Paragraf: ";
};
String STR_SPELL_OK
{
    /* ### ACHTUNG: Neuer Text in Resource? Die Rechtschreibprüfung ist abgeschlossen! : Die Rechtschreibpr³fung ist abgeschlossen! */
    Text = "Die Rechtschreibprüfung ist abgeschlossen!" ;
    Text [ ENGLISH ] = "Spell checking has finished." ;
    Text [ portuguese ] = "A verificação ortográfica está concluída!" ;
    Text [ english_us ] = "The spellcheck is complete." ;
    Text [ portuguese_brazilian ] = "Die Rechtschreibprüfung ist abgeschlossen!" ;
    Text [ swedish ] = "Rättstavningskontrollen är avslutad!" ;
    Text [ danish ] = "Stavekontrollen er afsluttet!" ;
    Text [ italian ] = "Controllo ortografico terminato!" ;
    Text [ spanish ] = "¡Ha finalizado la revisión ortográfica!" ;
    Text [ french ] = "La vérification de l'orthographe est terminée !" ;
    Text [ dutch ] = "De spellingcontrole is beëindigd!" ;
    Text[ chinese_simplified ] = "Õý×Ö·¨¼ì²éÒѾ­½áÊø£¡";
    Text[ russian ] = "Ïðîâåðêà ïðàâîïèñàíèÿ çàêîí÷åíà!";
    Text[ polish ] = "Sprawdzanie pisowni zosta³o zakoñczone!";
    Text[ japanese ] = "½ÍßÙÁª¯¸‚ªI—¹‚µ‚Ü‚µ‚½B";
    Text[ chinese_traditional ] = "«÷¦rÀˬd¤w¸gµ²§ô¡T";
    Text[ arabic ] = ".Êã ÇáÇäÊåÇÁ ãä ÇáÊÏÞíÞ ÇáÅãáÇÆí";
    Text[ dutch ] = "De spellingcontrole is beëindigd!";
    Text[ chinese_simplified ] = "Õý×Ö·¨¼ì²éÒѾ­½áÊø£¡";
    Text[ greek ] = "Ï ïñèïãñáöéêüò Ýëåã÷ïò ïëïêëçñþèçêå!";
    Text[ korean ] = "¸ÂÃã¹ý °Ë»ç°¡ ¿Ï·áµÇ¾ú½À´Ï´Ù.";
    Text[ turkish ] = "Yazým denetimi tamamlandý!";
    Text[ language_user1 ] = " ";
};
String STR_HYP_OK
{
    Text = "Die Silbentrennung ist abgeschlossen!" ;
    Text [ ENGLISH ] = "Hyphenating has finished." ;
    Text [ portuguese ] = "Separação silábica está completa!" ;
    Text [ english_us ] = "Hyphenation completed" ;
    Text [ portuguese_brazilian ] = "Die Silbentrennung ist abgeschlossen!" ;
    Text [ swedish ] = "Avstavningen är avslutad!" ;
    Text [ danish ] = "Orddelingen er afsluttet!" ;
    Text [ italian ] = "La sillabazione è conclusa!" ;
    Text [ spanish ] = "La separación silábica ha finalizado" ;
    Text [ french ] = "La coupure des mots est terminée !" ;
    Text [ dutch ] = "De verdeling in lettergrepen is beëindigd!" ;
    Text[ chinese_simplified ] = "Á¬×Ö·û¼ì²éÒѾ­Íê³É£¡";
    Text[ russian ] = "Ðàññòàíîâêà ïåðåíîñîâ çàêîí÷åíà!";
    Text[ polish ] = "Dzielenie wyrazów zosta³o zakoñczone.";
    Text[ japanese ] = "ʲÌȰ¼®Ý‚ªI—¹‚µ‚Ü‚µ‚½!";
    Text[ chinese_traditional ] = "³s¦r²ÅÀˬd¤w¸g§¹¦¨¡I";
    Text[ arabic ] = "ÊãøóÊ ÚãáíÉ ÝÕá ÇáãÞÇØÚ!";
    Text[ dutch ] = "De verdeling in lettergrepen is beëindigd!";
    Text[ chinese_simplified ] = "Á¬×Ö·û¼ì²éÒѾ­Íê³É£¡";
    Text[ greek ] = "Ï óõëëáâéóìüò Ý÷åé ïëïêëçñùèåß!";
    Text[ korean ] = "ÇÏÀÌÇÂÀÌ ¿Ï·áµÇ¾ú½À´Ï´Ù.";
    Text[ turkish ] = "Heceleme tamamlandý.";
    Text[ language_user1 ] = " ";
};
diff --git a/sw/source/ui/makefile.mk b/sw/source/ui/makefile.mk
new file mode 100644
index 0000000..52fc555
--- /dev/null
+++ b/sw/source/ui/makefile.mk
@@ -0,0 +1,320 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:31 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=..$/..

PRJNAME=sw
TARGET=ui

PROJECTPCH=ui_pch
PDBTARGET=ui_pch
PROJECTPCHSOURCE=.$/ui_1st$/ui_pch

.IF "$(CALLTARGETS)"=="ui"
RC_SUBDIRS=
.ENDIF

# --- Settings -----------------------------------------------------

.INCLUDE :  $(PRJ)$/inc$/swpre.mk
.INCLUDE :  settings.mk
.INCLUDE :  $(PRJ)$/inc$/sw.mk

.IF "$(GUI)" != "WNT"
.IF "$(GUI)" != "MAC"
.IF "$(COM)" != "BLC"
.IF "$(COM)" != "WTC"
LIBFLAGS=/NOI /NOE /PAGE:256
.ENDIF
.ENDIF
.ENDIF
.ENDIF

# --- Files --------------------------------------------------------

# andere Label als Verzeichnisnamen fuer VC++/NT
.IF "$(RC_SUBDIRS)" == ""
SWSUBDIRS= \
        ui_1st \
        app      \
        cctrl    \
        chrdlg   \
        config   \
        dbui     \
        dialog   \
        dochdl   \
        docvw    \
        envelp   \
        fldui    \
        fmtui    \
        frmdlg   \
        globdoc  \
        index    \
        lingu    \
        misc     \
        ribbar   \
        shells   \
        table    \
        uno	\
        uiview   \
        utlui    \
        web	  \
        wizard	  \
        wrtsh
.ENDIF

SUBLIBS1= \
        $(SLB)$/app.lib      \
        $(SLB)$/cctrl.lib    \
        $(SLB)$/chrdlg.lib   \
        $(SLB)$/config.lib   \
        $(SLB)$/dbui.lib     \
        $(SLB)$/dialog.lib   \
        $(SLB)$/dochdl.lib   \
        $(SLB)$/docvw.lib    \
        $(SLB)$/envelp.lib   \
        $(SLB)$/fldui.lib    \
        $(SLB)$/fmtui.lib    \
        $(SLB)$/frmdlg.lib   \
        $(SLB)$/globdoc.lib

SUBLIBS2= \
        $(SLB)$/index.lib    \
        $(SLB)$/lingu.lib    \
        $(SLB)$/misc.lib     \
        $(SLB)$/ribbar.lib   \
        $(SLB)$/shells.lib   \
        $(SLB)$/table.lib    \
        $(SLB)$/unoidl.lib   \
        $(SLB)$/utlui.lib    \
        $(SLB)$/web.lib   \
        $(SLB)$/wizard.lib   \
        $(SLB)$/uiview.lib   \
        $(SLB)$/wrtsh.lib

# -----------------------------------------------------------

.IF "$(RC_SUBDIRS)" == ""
.IF "$(depend)" == ""
ui:						\
    ui_1st				\
    $(SWSUBDIRS) \
    ALLTAR
.ELSE
ui:
    @+echo Doing nothing in source\ui
.ENDIF
.ENDIF

################################################################

LIB1TARGET=$(SLB)$/ui1.lib
LIB1FILES= \
        $(SUBLIBS1)

LIB2TARGET=$(SLB)$/ui2.lib
LIB2FILES= \
        $(SUBLIBS2)

.INCLUDE :  target.mk

################################################################

.IF "$(dbutil)" != ""
dbutilx="dbutil=true"
.ENDIF
.IF "$(debug)" != ""
.IF "$(debug)"!="D_FORCE_OPT"
dbutilx="debug=$(debug)"
.ENDIF
.ENDIF

.IF "$(compact)" != ""
dcompact="compact=true"
.ELSE
dcompact=
.ENDIF

.IF "$(CALLTARGETS)"!="ui"
.IF "$(DOPLD)$(dopld)" == ""

.IF "$(RC_SUBDIRS)" == ""
#rule lib / subdir
$(LB)$/%.lib : %
    @echo @

ui_1st .SETDIR=ui_1st:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS)  $(dbutilx) $(CALLMACROS)

#	app $(LB)$/app.lib .SETDIR=app:
app .SETDIR=app:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(dcompact) $(CALLMACROS)

cctrl  .SETDIR=cctrl:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(dcompact) $(CALLMACROS)

chrdlg  .SETDIR=chrdlg:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(dcompact) $(CALLMACROS)

config  .SETDIR=config:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(dcompact) $(CALLMACROS)

dbui  .SETDIR=dbui:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(dcompact) $(CALLMACROS)

dialog  .SETDIR=dialog:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(dcompact) $(CALLMACROS)

dochdl  .SETDIR=dochdl:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(dcompact) $(CALLMACROS)

docvw  .SETDIR=docvw:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(dcompact) $(CALLMACROS)

envelp  .SETDIR=envelp:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(dcompact) $(CALLMACROS)

fldui  .SETDIR=fldui:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(dcompact) $(CALLMACROS)

fmtui  .SETDIR=fmtui:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(dcompact) $(CALLMACROS)

frmdlg  .SETDIR=frmdlg:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(dcompact) $(CALLMACROS)

globdoc  .SETDIR=globdoc:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(dcompact) $(CALLMACROS)

index  .SETDIR=index:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(dcompact) $(CALLMACROS)

lingu  .SETDIR=lingu:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(dcompact) $(CALLMACROS)

misc  .SETDIR=misc:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(dcompact) $(CALLMACROS)

ribbar  .SETDIR=ribbar:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(dcompact) $(CALLMACROS)

shells  .SETDIR=shells:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(dcompact) $(CALLMACROS)

table  .SETDIR=table:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(dcompact) $(CALLMACROS)

uiview  .SETDIR=uiview:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(dcompact) $(CALLMACROS)

utlui  .SETDIR=utlui:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(dcompact) $(CALLMACROS)

uno  .SETDIR=uno:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(dcompact) $(CALLMACROS)

wizard  .SETDIR=wizard:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(dcompact) $(CALLMACROS)

web  .SETDIR=web:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(dcompact) $(CALLMACROS)

wrtsh  .SETDIR=wrtsh:
        @echo $@
        @$(MAKECMD) -d $(MFLAGS) $(dbutilx) $(dcompact) $(CALLMACROS)
.ENDIF
.ELSE
ui_1st:
    @echo nix
.ENDIF
.ENDIF

kill:
    @+$(RM) $(SLB)$/ui.lst
    @+$(RM) $(SLB)$/ui.lib


diff --git a/sw/source/ui/misc/autocorr.src b/sw/source/ui/misc/autocorr.src
new file mode 100644
index 0000000..feb1953
--- /dev/null
+++ b/sw/source/ui/misc/autocorr.src
@@ -0,0 +1,63 @@
/*************************************************************************
 *
 *  $RCSfile: autocorr.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:44 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
/* StarView ressource file */


diff --git a/sw/source/ui/misc/bookmark.cxx b/sw/source/ui/misc/bookmark.cxx
new file mode 100644
index 0000000..d6c208b
--- /dev/null
+++ b/sw/source/ui/misc/bookmark.cxx
@@ -0,0 +1,452 @@
/*************************************************************************
 *
 *  $RCSfile: bookmark.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:44 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif

#ifndef _SV_MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif


#include "view.hxx"
#include "basesh.hxx"
#include "wrtsh.hxx"        //
#include "cmdid.h"
#include "bookmark.hxx"     // SwInsertBookmarkDlg
#include "bookmrk.hxx"      //  SwBookmark
#include "bookmark.hrc"
#include "misc.hrc"


const String BookmarkCombo::aForbiddenChars = String::CreateFromAscii("/\\@:*?\";,.#");


IMPL_LINK( SwInsertBookmarkDlg, ModifyHdl, BookmarkCombo *, pBox )
{
    BOOL bSelEntries = pBox->GetSelectEntryCount() != 0;
    // if a string has been pasted from the clipboard then
    // there may be illegal characters in the box
    if(!bSelEntries)
    {
        String sTmp = pBox->GetText();
        USHORT nLen = sTmp.Len();
        String sMsg;
        for(USHORT i = 0; i < BookmarkCombo::aForbiddenChars.Len(); i++)
        {
            USHORT nTmpLen = sTmp.Len();
            sTmp.EraseAllChars(BookmarkCombo::aForbiddenChars.GetChar(i));
            if(sTmp.Len() != nTmpLen)
                sMsg += BookmarkCombo::aForbiddenChars.GetChar(i);
        }
        if(sTmp.Len() != nLen)
        {
            pBox->SetText(sTmp);
            String sWarning(sRemoveWarning);
            sWarning += sMsg;
            InfoBox(this, sWarning).Execute();
        }


    }

    aOkBtn.Enable(!bSelEntries);    // neue Textmarke
    aDeleteBtn.Enable(bSelEntries); // loeschbar?

    return 0;
}

/*------------------------------------------------------------------------
     Beschreibung: Callback zum Loeschen einer Textmarke
 -----------------------------------------------------------------------*/

IMPL_LINK( SwInsertBookmarkDlg, DeleteHdl, Button *, EMPTYARG )
{
    // Textmarken aus der ComboBox entfernen

    for (USHORT i = aBookmarkBox.GetSelectEntryCount(); i; i-- )
        aBookmarkBox.RemoveEntry(aBookmarkBox.GetSelectEntryPos(i - 1));

    aBookmarkBox.SetText(aEmptyStr);
    aDeleteBtn.Enable(FALSE);   // keine weiteren Eintraege vorhanden
    // aBookmarkBox.SetText(aEmptyStr);

    aOkBtn.Enable();            // Im OK Handler wird geloescht
    return 0;
}

/*------------------------------------------------------------------------
     Beschreibung: Callback fuer OKButton. Fuegt eine neue Textmarke
     an die akt. Position ein. Geloeschte Textmarken werden auch am Modell
     entfernt.
 -----------------------------------------------------------------------*/


void SwInsertBookmarkDlg::Apply()
{
    // Textmarke einfuegen
    USHORT      nLen = aBookmarkBox.GetText().Len();
    SwBoxEntry  aTmpEntry(aBookmarkBox.GetText(), 0 );

    if (nLen && (aBookmarkBox.GetEntryPos(aTmpEntry) == COMBOBOX_ENTRY_NOTFOUND))
    {
        String sEntry(aBookmarkBox.GetText());
        sEntry.EraseAllChars(aBookmarkBox.GetMultiSelectionSeparator());

        rSh.SetBookmark( KeyCode(), sEntry, aEmptyStr );
    }

    for (USHORT nCount = aBookmarkBox.GetRemovedCount(); nCount > 0; nCount--)
    {
        rSh.DelBookmark( aBookmarkBox.GetRemovedEntry( nCount -1 ).aName );
    }
}

/*------------------------------------------------------------------------
     Beschreibung: CTOR
 -----------------------------------------------------------------------*/


SwInsertBookmarkDlg::SwInsertBookmarkDlg( Window *pParent, SwWrtShell &rS ) :

    SvxStandardDialog(pParent,SW_RES(DLG_INSERT_BOOKMARK)),

    aBookmarkBox(this,SW_RES(CB_BOOKMARK)),
    aBookmarkFrm(this,SW_RES(GB_BOOKMARK)),
    aOkBtn(this,SW_RES(BT_OK)),
    aCancelBtn(this,SW_RES(BT_CANCEL)),
    aDeleteBtn(this,SW_RES(BT_DELETE)),
    rSh( rS )
{
    aBookmarkBox.SetModifyHdl(LINK(this, SwInsertBookmarkDlg, ModifyHdl));
    aBookmarkBox.EnableMultiSelection(TRUE);
    aBookmarkBox.EnableAutocomplete( TRUE, TRUE );

    aDeleteBtn.SetClickHdl(LINK(this, SwInsertBookmarkDlg, DeleteHdl));

    // Combobox mit vorhandenen Bookmarks fuellen
    USHORT nCount = rSh.GetBookmarkCnt(TRUE);

    for( USHORT nId = 0; nId < nCount; nId++ )
    {
        SwBookmark& rBkmk = rSh.GetBookmark( nId, TRUE );
        aBookmarkBox.InsertEntry( SwBoxEntry( rBkmk.GetName(), nId ) );
    }

    FreeResource();
    sRemoveWarning = String(SW_RES(STR_REMOVE_WARNING));

}

/*------------------------------------------------------------------------
     Beschreibung:
 -----------------------------------------------------------------------*/

SwInsertBookmarkDlg::~SwInsertBookmarkDlg()
{
}

/*------------------------------------------------------------------------
     Beschreibung:
 -----------------------------------------------------------------------*/

BookmarkCombo::BookmarkCombo( Window* pWin, const ResId& rResId ) :
    SwComboBox(pWin, rResId)
{
}

/*------------------------------------------------------------------------
     Beschreibung:
 -----------------------------------------------------------------------*/

USHORT BookmarkCombo::GetFirstSelEntryPos() const
{
    return GetSelEntryPos(0);
}

/*------------------------------------------------------------------------
     Beschreibung:
 -----------------------------------------------------------------------*/

USHORT BookmarkCombo::GetNextSelEntryPos(USHORT nPos) const
{
    return GetSelEntryPos(nPos + 1);
}

/*------------------------------------------------------------------------
     Beschreibung:
 -----------------------------------------------------------------------*/

USHORT BookmarkCombo::GetSelEntryPos(USHORT nPos) const
{
    char cSep = GetMultiSelectionSeparator();

    USHORT nCnt = GetText().GetTokenCount(cSep);

    for (; nPos < nCnt; nPos++)
    {
        String sEntry(GetText().GetToken(nPos, cSep));
        sEntry.EraseLeadingChars();
        sEntry.EraseTrailingChars();
        if (GetEntryPos(sEntry) != COMBOBOX_ENTRY_NOTFOUND)
            return nPos;
    }

    return COMBOBOX_ENTRY_NOTFOUND;
}

/*------------------------------------------------------------------------
     Beschreibung:
 -----------------------------------------------------------------------*/

USHORT BookmarkCombo::GetSelectEntryCount() const
{
    USHORT nCnt = 0;

    USHORT nPos = GetFirstSelEntryPos();
    while (nPos != COMBOBOX_ENTRY_NOTFOUND)
    {
        nPos = GetNextSelEntryPos(nPos);
        nCnt++;
    }

    return nCnt;
}

/*------------------------------------------------------------------------
     Beschreibung:
 -----------------------------------------------------------------------*/

String BookmarkCombo::GetSelectEntry( USHORT nSelIndex ) const
{
    USHORT nCnt = 0;
    USHORT nPos = GetFirstSelEntryPos();
    String sEntry;

    while (nPos != COMBOBOX_ENTRY_NOTFOUND)
    {
        if (nSelIndex == nCnt)
        {
            char cSep = GetMultiSelectionSeparator();
            sEntry = GetText().GetToken(nPos, cSep);
            sEntry.EraseLeadingChars();
            sEntry.EraseTrailingChars();

            break;
        }
        nPos = GetNextSelEntryPos(nPos);
        nCnt++;
    }

    return sEntry;
}

/*------------------------------------------------------------------------
     Beschreibung: Position in der Listbox (der ComboBox)
 -----------------------------------------------------------------------*/

USHORT BookmarkCombo::GetSelectEntryPos( USHORT nSelIndex ) const
{
    USHORT nCnt = 0;
    USHORT nPos = GetFirstSelEntryPos();

    while (nPos != COMBOBOX_ENTRY_NOTFOUND)
    {
        if (nSelIndex == nCnt)
        {
            char cSep = GetMultiSelectionSeparator();
            String sEntry(GetText().GetToken(nPos, cSep));
            sEntry.EraseLeadingChars();
            sEntry.EraseTrailingChars();

            return GetEntryPos(sEntry);
        }
        nPos = GetNextSelEntryPos(nPos);
        nCnt++;
    }

    return COMBOBOX_ENTRY_NOTFOUND;
}
/* -----------------05.02.99 08:39-------------------
 *
 * --------------------------------------------------*/
long BookmarkCombo::PreNotify( NotifyEvent& rNEvt )
{
    long nHandled = 0;
    if ( rNEvt.GetType() == EVENT_KEYINPUT )
    {
        const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
        String sKey = pKEvt->GetCharCode();
        if(STRING_NOTFOUND != aForbiddenChars.Search(sKey))
            nHandled = 1;
    }
    if(!nHandled)
        nHandled = SwComboBox::PreNotify( rNEvt );
    return nHandled;
}
/*------------------------------------------------------------------------

      $Log: not supported by cvs2svn $
      Revision 1.50  2000/09/18 16:05:55  willem.vandorp
      OpenOffice header added.

      Revision 1.49  2000/05/10 11:53:42  os
      Basic API removed

      Revision 1.48  2000/04/18 15:08:16  os
      UNICODE

      Revision 1.47  1999/07/02 07:13:56  OS
      #63003# NameWarning also in StarOne rename dialog


      Rev 1.46   02 Jul 1999 09:13:56   OS
   #63003# NameWarning also in StarOne rename dialog

      Rev 1.45   18 Jun 1999 13:04:58   OS
   #63003# prevent illegal characters from beeing pasted

      Rev 1.44   25 Feb 1999 13:43:04   OS
   #62407# AutoComplete casesensitive

      Rev 1.43   08 Feb 1999 15:04:12   OS
   #61421# einige Sonderzeichen in Textmarken nicht erlauben

      Rev 1.42   08 Oct 1998 15:45:34   OM
   #57748# Multiselektion beim Loeschen von Bookmarks

      Rev 1.41   23 Feb 1998 07:28:18   OS
   GetBookmark/ Cnt mit Bookmark-Flag

      Rev 1.40   24 Nov 1997 16:47:42   MA
   includes

      Rev 1.39   03 Nov 1997 13:22:42   MA
   precomp entfernt

      Rev 1.38   08 Aug 1997 17:28:20   OM
   Headerfile-Umstellung

      Rev 1.37   30 Jul 1997 18:33:30   HJS
   includes

      Rev 1.36   07 Apr 1997 16:08:26   MH
   chg: header

      Rev 1.35   20 Feb 1997 10:00:44   MA
   #36242# richtig enablen

      Rev 1.34   14 Jan 1997 09:22:28   TRI
   includes wegen Internal Compiler Error

      Rev 1.33   11 Nov 1996 11:05:46   MA
   ResMgr

      Rev 1.32   02 Oct 1996 18:28:58   MA
   Umstellung Enable/Disable

      Rev 1.31   28 Aug 1996 14:12:20   OS
   includes

      Rev 1.30   06 Feb 1996 15:21:06   JP
   Link Umstellung 305

      Rev 1.29   24 Nov 1995 16:58:44   OM
   PCH->PRECOMPILED

      Rev 1.28   08 Nov 1995 13:31:40   JP
   Umstellung zur 301: Change -> Set

      Rev 1.27   24 Oct 1995 17:05:06   OS
   Textmarken einfuegen/loeschen recordable

      Rev 1.26   17 Oct 1995 20:54:50   JP
   IsMark oder IsBookmark am Bookmark benutzen

      Rev 1.25   30 Aug 1995 14:00:54   MA
   fix: sexport'iert

      Rev 1.24   21 Aug 1995 09:32:42   MA
   chg: swstddlg -> svxstandarddialog, Optimierungen

      Rev 1.23   05 Jul 1995 19:08:14   JP
   SwBookmarkFUNC gibts nicht mehr, rufe Methoden an die Shell-Methoden

      Rev 1.22   20 Mar 1995 19:28:20   OS
   unbenutzte Funktionen entfernt

      Rev 1.21   26 Oct 1994 12:18:00   ER
   add: PCH (missed the misc)

 -----------------------------------------------------------------------*/



diff --git a/sw/source/ui/misc/bookmark.hrc b/sw/source/ui/misc/bookmark.hrc
new file mode 100644
index 0000000..ea0efd8
--- /dev/null
+++ b/sw/source/ui/misc/bookmark.hrc
@@ -0,0 +1,68 @@
/*************************************************************************
 *
 *  $RCSfile: bookmark.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:44 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/


#define CB_BOOKMARK     1
#define GB_BOOKMARK     2

#define BT_OK           20
#define BT_CANCEL       21
#define BT_DELETE       22
diff --git a/sw/source/ui/misc/bookmark.src b/sw/source/ui/misc/bookmark.src
new file mode 100644
index 0000000..4a7dc15
--- /dev/null
+++ b/sw/source/ui/misc/bookmark.src
@@ -0,0 +1,199 @@
/*************************************************************************
 *
 *  $RCSfile: bookmark.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:44 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "misc.hrc"
#include "bookmark.hrc"
#include "cmdid.h"
#include "helpid.h"
ModalDialog DLG_INSERT_BOOKMARK
{
    HelpID = FN_INSERT_BOOKMARK ;
    OUTPUTSIZE = TRUE ;
    Size = MAP_APPFONT ( 179 , 96 ) ;
    /* ### ACHTUNG: Neuer Text in Resource? Textmarke einfügen : Textmarke einf³gen */
    TEXT = "Textmarke einfügen" ;
    TEXT [ English ] = "Insert bookmark" ;
    TEXT [ norwegian ] = "Sett inn bokmerke" ;
    TEXT [ italian ] = "Inserisci segnalibro" ;
    TEXT [ portuguese_brazilian ] = "Inserir marca" ;
    TEXT [ portuguese ] = "Inserir marcador de texto" ;
    TEXT [ finnish ] = "Lisää kirjanmerkki" ;
    TEXT [ danish ] = "Indsæt tekstmarkering" ;
    TEXT [ french ] = "Insertion d'un repère de texte" ;
    TEXT [ swedish ] = "Infoga bokmärke" ;
    TEXT [ dutch ] = "Tekstmarkering invoegen" ;
    TEXT [ spanish ] = "Insertar marca" ;
    TEXT [ english_us ] = "Insert Bookmark" ;
    MOVEABLE = TRUE ;
    SVLOOK = TRUE ;
    OkButton BT_OK
    {
        DISABLE = TRUE ;
        Pos = MAP_APPFONT ( 123 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TABSTOP = TRUE ;
        DefButton = TRUE ;
    };
    CancelButton BT_CANCEL
    {
        Pos = MAP_APPFONT ( 123 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TABSTOP = TRUE ;
    };
    ComboBox CB_BOOKMARK
    {
        Pos = MAP_APPFONT ( 12 , 14 ) ;
        Size = MAP_APPFONT ( 99 , 70 ) ;
        TABSTOP = TRUE ;
        AutoHScroll = TRUE ;
        SORT = TRUE ;
    };
    PushButton BT_DELETE
    {
        Pos = MAP_APPFONT ( 123 , 40 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? ~Löschen : ~L÷schen */
        TEXT = "~Löschen" ;
        TEXT [ English ] = "~Delete" ;
        TEXT [ norwegian ] = "~Slett" ;
        TEXT [ italian ] = "~Elimina" ;
        TEXT [ portuguese_brazilian ] = "~Apagar" ;
        TEXT [ portuguese ] = "E~liminar" ;
        TEXT [ finnish ] = "~Poista" ;
        TEXT [ danish ] = "Slet" ;
        TEXT [ french ] = "~Supprimer" ;
        TEXT [ swedish ] = "~Radera" ;
        TEXT [ dutch ] = "~Wissen" ;
        TEXT [ spanish ] = "~Eliminar" ;
        TEXT [ english_us ] = "~Delete" ;
        TABSTOP = TRUE ;
        DISABLE = TRUE ;
        TEXT[ chinese_simplified ] = "ɾ³ý(~D)";
        TEXT[ russian ] = "Óäàëèòü";
        TEXT[ polish ] = "~Usuñ";
        TEXT[ japanese ] = "íœ(~D)";
        TEXT[ chinese_traditional ] = "§R°£(~D)";
        TEXT[ greek ] = "ÄéáãñáöÞ";
        TEXT[ korean ] = "»èÁ¦(~D)";
        TEXT[ arabic ] = "ÍÐÝ";
        TEXT[ turkish ] = "~Sil";
    };
    GroupBox GB_BOOKMARK
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 111 , 87 ) ;
        TEXT = "Textmarken" ;
        TEXT [ English ] = "Bookmarks" ;
        TEXT [ norwegian ] = "Bokmerker" ;
        TEXT [ italian ] = "Segnalibri" ;
        TEXT [ portuguese_brazilian ] = "Marcas" ;
        TEXT [ portuguese ] = "Marcadores de texto" ;
        TEXT [ finnish ] = "Kirjanmerkit" ;
        TEXT [ danish ] = "Tekstmarkeringer" ;
        TEXT [ french ] = "Repères de texte" ;
        TEXT [ swedish ] = "Bokmärken" ;
        TEXT [ dutch ] = "Tekstmarkeringen" ;
        TEXT [ spanish ] = "Marcas de texto" ;
        TEXT [ english_us ] = "Bookmarks" ;
        TEXT[ chinese_simplified ] = "ÊéÇ©";
        TEXT[ russian ] = "Çàêëàäêè";
        TEXT[ polish ] = "Zak³adki";
        TEXT[ japanese ] = "÷½Äϰ¸";
        TEXT[ chinese_traditional ] = "¤º¤å¼ÐÅÒ";
        TEXT[ greek ] = "Óåëéäïäåßêôåò";
        TEXT[ korean ] = "Ã¥ °¥ÇÇ";
        TEXT[ arabic ] = "ÅÔÇÑÇÊ ãÑÌÚíÉ";
        TEXT[ turkish ] = "Metin iþareti";
    };
    TEXT[ chinese_simplified ] = "²åÈëÊéÇ©";
    TEXT[ russian ] = "Âñòàâêà çàêëàäîê";
    TEXT[ polish ] = "Wstaw zak³adkê";
    TEXT[ japanese ] = "÷½Äϰ¸‚Ì‘}“ü";
    TEXT[ chinese_traditional ] = "´¡¤J¤º¤å¼ÐÅÒ";
    TEXT[ greek ] = "ÅéóáãùãÞ óåëéäïäåßêôç";
    TEXT[ korean ] = "Ã¥ °¥ÇÇ »ðÀÔ";
    TEXT[ arabic ] = "ÅÏÑÇÌ ÅÔÇÑÉ ãÑÌÚíÉ";
    TEXT[ turkish ] = "Metin iþareti ekle";
};
String STR_REMOVE_WARNING
{
    Text = "Die folgenden Zeichen sind nicht zulässig und wurden deshalb entfernt: ";
    Text [English] = "The following characters are not valid and have been removed: ";
    Text[ english_us ] = "The following characters are not valid and have been removed: ";
    Text[ portuguese ] = "Os seguintes caracteres foram eliminados porque não são válidos: ";
    Text[ russian ] = "Ñëåäóþùèå çíàêè íå äîïóñêàþòñÿ è ïîýòîìó áóäóò óäàëåíû: ";
    Text[ greek ] = "Ïé áêüëïõèïé ÷áñáêôÞñåò Ý÷ïõí äéáãñáöåß åðåéäÞ äåí åßíáé Ýãêõñïé. ";
    Text[ dutch ] = "De volgende tekens zijn niet toegestaan en werden daarom verwijderd. ";
    Text[ french ] = "Les caractères suivants ont été supprimés car ils ne sont pas permis :  ";
    Text[ spanish ] = "Los siguientes caracteres han sido eliminados porque no se permiten:  ";
    Text[ italian ] = "I caratteri seguenti non sono ammessi e per questo eliminati. ";
    Text[ danish ] = "De følgende tegn er ikke tilladte og er derfor blevet fjernet: ";
    Text[ swedish ] = "Följande tecken är inte tillåtna och har därför tagits bort:  ";
    Text[ polish ] = "Nastêpuj¹cy znak jest niedozwolony i zosta³ dlatego usuniêty: ";
    Text[ portuguese_brazilian ] = "The following characters are not valid and have been removed: ";
    Text[ japanese ] = "ŽŸ‚Ì•¶Žš‚Í‹–‰Â‚³‚ê‚Ä‚¢‚È‚¢‚̂ŏœ‹Ž‚³‚ê‚Ü‚µ‚½B ";
    Text[ korean ] = "´ÙÀ½ÀÇ ¹®ÀÚµéÀº À¯È¿ÇÏÁö ¾Ê¾Æ¼­ Á¦°ÅµÇ¾ú½À´Ï´Ù: ";
    Text[ chinese_simplified ] = "ÏÂÁÐ×Ö·ûÎÞЧÇÒÒѾ­±»É¾³ý£º ";
    Text[ chinese_traditional ] = "¤U¦Cªº¦r«¬µL®Ä¦Ó³Q§R°£¡G ";
    Text[ arabic ] = "ÇáÃÍÑÝ ÇáÊÇáíÉ ÛíÑ ÕÇáÍÉ¡ áåÐÇ Êã ÍÐÝåÇ: ";
    Text[ turkish ] = "Aþaðýdaki karakterler geçerli deðiller ve bu nedenle çýkartýldýlar: ";
};

diff --git a/sw/source/ui/misc/docfnote.cxx b/sw/source/ui/misc/docfnote.cxx
new file mode 100644
index 0000000..08276b7
--- /dev/null
+++ b/sw/source/ui/misc/docfnote.cxx
@@ -0,0 +1,719 @@
/*************************************************************************
 *
 *  $RCSfile: docfnote.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:44 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SFXSTYLE_HXX //autogen
#include <svtools/style.hxx>
#endif

#ifndef _ERRHDL_HXX
#include <errhdl.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _DOCFNOTE_HXX
#include <docfnote.hxx>
#endif
#ifndef _IMPFNOTE_HXX
#include <impfnote.hxx>
#endif
#ifndef _FTNINFO_HXX
#include <ftninfo.hxx>
#endif
#ifndef _FMTCOL_HXX
#include <fmtcol.hxx>
#endif
#ifndef _PAGEDESC_HXX
#include <pagedesc.hxx>
#endif
#ifndef _CHARFMT_HXX //autogen
#include <charfmt.hxx>
#endif
#ifndef _DOCSTYLE_HXX //autogen
#include <docstyle.hxx>
#endif
#ifndef _SWWDOCSH_HXX //autogen
#include <wdocsh.hxx>
#endif
#ifndef _UITOOL_HXX
#include <uitool.hxx>
#endif
#ifndef _POOLFMT_HXX
#include <poolfmt.hxx>
#endif

#ifndef _SWSTYLE_H
#include <swstyle.h>
#endif
#ifndef _HELPID_H
#include <helpid.h>
#endif
#ifndef _MISC_HRC
#include <misc.hrc>
#endif
#ifndef _DOCFNOTE_HRC
#include <docfnote.hrc>
#endif
#ifndef _FRMUI_HRC
#include <frmui.hrc>
#endif


// Numerierungsformat Umsetzung:
// ListBox  - Format            - Enum-Wert
// 0        - A, B, C, ...      - 0
// 1        - a, b, c, ...      - 1
// 2        - I, II, III, ...   - 2
// 3        - i, ii, iii, ...   - 3
// 4        - 1, 2, 3, ...      - 4
// 5        - A, .., AA, ..,    - 9
// 6        - a, .., aa, ..,    - 10

inline USHORT GetNumPos( USHORT n )
{
    return SVX_NUM_ARABIC < n ? n - 4 : n;
}

inline SvxExtNumType GetNumType( USHORT n )
{
    return (SvxExtNumType)(4 < n ? n + 4 : n );
}

SwFootNoteOptionDlg::SwFootNoteOptionDlg( Window *pParent, SwWrtShell &rS ) :
    SfxTabDialog( pParent, SW_RES(DLG_DOC_FOOTNOTE) ),
    rSh( rS )
{
    FreeResource();
    RemoveResetButton();

    aOldOkHdl = GetOKButton().GetClickHdl();
    GetOKButton().SetClickHdl( LINK( this, SwFootNoteOptionDlg, OkHdl ) );

    AddTabPage( TP_FOOTNOTEOPTION, SwFootNoteOptionPage::Create, 0 );
    AddTabPage( TP_ENDNOTEOPTION,  SwEndNoteOptionPage::Create, 0 );
}

void SwFootNoteOptionDlg::PageCreated( USHORT nId, SfxTabPage &rPage )
{
    ((SwEndNoteOptionPage&)rPage).SetShell( rSh );
}

SwFootNoteOptionDlg::~SwFootNoteOptionDlg()
{
}

IMPL_LINK( SwFootNoteOptionDlg, OkHdl, Button *, pBtn )
{
    SfxItemSet *pSet = 0;
    SfxTabPage *pPage = GetTabPage( TP_FOOTNOTEOPTION );
    if ( pPage )
        pPage->FillItemSet( (SfxItemSet&)pSet );
    pPage = GetTabPage( TP_ENDNOTEOPTION  );
    if ( pPage )
        pPage->FillItemSet( (SfxItemSet&)pSet );
    aOldOkHdl.Call( pBtn );
    return 0;
}


//----------------------------------------------------------------------


SwEndNoteOptionPage::SwEndNoteOptionPage( Window *pParent, BOOL bEN,
                                          const SfxItemSet &rSet ) :
    SfxTabPage( pParent, SW_RES(bEN ? TP_ENDNOTEOPTION : TP_FOOTNOTEOPTION), rSet ),
    aPosPageBox     (this, SW_RES( RB_POS_PAGE   )),
    aPosChapterBox  (this, SW_RES( RB_POS_CHAPTER)),
    aPosGrp         (this, SW_RES( GB_POS        )),

    aNumViewBox     (this, SW_RES( LB_NUMVIEW   )),
    aOffsetLbl      (this, SW_RES( FT_OFFSET    )),
    aOffsetFld      (this, SW_RES( FLD_OFFSET   )),
    aNumCountBox    (this, SW_RES( LB_NUMCOUNT  )),
    aPrefixFT       (this, SW_RES( FT_PREFIX    )),
    aPrefixED       (this, SW_RES( ED_PREFIX    )),
    aSuffixFT       (this, SW_RES( FT_SUFFIX    )),
    aSuffixED       (this, SW_RES( ED_SUFFIX    )),


    aNumGrp         (this, SW_RES( GB_NUM       )),

    aParaTemplLbl   (this, SW_RES( FT_PARA_TEMPL)),
    aParaTemplBox   (this, SW_RES( LB_PARA_TEMPL)),
    aPageTemplLbl   (this, SW_RES( FT_PAGE_TEMPL)),
    aPageTemplBox   (this, SW_RES( LB_PAGE_TEMPL)),
    aTemplGrp       (this, SW_RES( GB_TEMPL     )),

    aFtnCharTextTemplLbl(   this, SW_RES( FT_TEXT_CHARFMT)),
    aFtnCharTextTemplBox(   this, SW_RES( LB_TEXT_CHARFMT)),
    aFtnCharAnchorTemplLbl( this, SW_RES( FT_ANCHR_CHARFMT)),
    aFtnCharAnchorTemplBox( this, SW_RES( LB_ANCHR_CHARFMT)),
    aCharTemplGrp(          this, SW_RES(GB_CHAR_TEMPL)),

    aContLbl        (this, SW_RES( FT_CONT      )),
    aContEdit       (this, SW_RES( ED_CONT      )),
    aContFromLbl    (this, SW_RES( FT_CONT_FROM )),
    aContFromEdit   (this, SW_RES( ED_CONT_FROM )),
    aContGrp        (this, SW_RES( GB_CONT      )),

    aNumPage(aNumCountBox.GetEntry(FTNNUM_PAGE)),
    pSh( 0 ),
    bPosDoc(FALSE),
    bEndNote( bEN )
{
    FreeResource();

    aPosPageBox.SetClickHdl(LINK(this, SwEndNoteOptionPage, PosPage));
    aPosChapterBox.SetClickHdl(LINK(this, SwEndNoteOptionPage, PosChapter));
    aNumCountBox.SetSelectHdl(LINK(this, SwEndNoteOptionPage, NumCount));

}

void SwEndNoteOptionPage::Reset( const SfxItemSet& )
{
    SwEndNoteInfo *pInf = bEndNote ? new SwEndNoteInfo( pSh->GetEndNoteInfo() )
                                   : new SwFtnInfo( pSh->GetFtnInfo() );
    SfxObjectShell * pDocSh = SfxObjectShell::Current();
    if(PTR_CAST(SwWebDocShell, pDocSh))
    {
        aParaTemplLbl   .Hide();
        aParaTemplBox   .Hide();
        aPageTemplLbl   .Hide();
        aPageTemplBox   .Hide();
        aFtnCharTextTemplLbl.Hide();
        aFtnCharTextTemplBox.Hide();
        aFtnCharAnchorTemplLbl.Hide();
        aFtnCharAnchorTemplBox.Hide();
        aCharTemplGrp   .Hide();
        aTemplGrp       .Hide();
        if(!bEndNote)
        {
            // die unteren Controls sollen nach oben verschoben werden
            long nYDiff = aPosGrp.GetPosPixel().Y() - aTemplGrp.GetPosPixel().Y();
            Point aTmpPos(aPosGrp.GetPosPixel());
            aTmpPos.Y() -= nYDiff;
            aPosGrp.SetPosPixel(aTmpPos);
            aTmpPos = aPosPageBox.GetPosPixel();
            aTmpPos.Y() -= nYDiff;
            aPosPageBox.SetPosPixel(aTmpPos);
            aTmpPos = aPosChapterBox.GetPosPixel();
            aTmpPos.Y() -= nYDiff;
            aPosChapterBox.SetPosPixel(aTmpPos);
            aTmpPos = aNumCountBox.GetPosPixel();
            aTmpPos.Y() -= nYDiff;
            aNumCountBox.SetPosPixel(aTmpPos);
            aTmpPos = aContLbl.GetPosPixel();
            aTmpPos.Y() -= nYDiff;
            aContLbl.SetPosPixel(aTmpPos);
            aTmpPos = aContEdit.GetPosPixel();
            aTmpPos.Y() -= nYDiff;
            aContEdit.SetPosPixel(aTmpPos);
            aTmpPos = aContFromLbl.GetPosPixel();
            aTmpPos.Y() -= nYDiff;
            aContFromLbl.SetPosPixel(aTmpPos);
            aTmpPos = aContFromEdit.GetPosPixel();
            aTmpPos.Y() -= nYDiff;
            aContFromEdit.SetPosPixel(aTmpPos);
            aTmpPos = aContGrp.GetPosPixel();
            aTmpPos.Y() -= nYDiff;
            aContGrp.SetPosPixel(aTmpPos);
        }
    }
    if ( bEndNote )
    {
        aPosGrp.Hide();
        aPosPageBox.Hide();
        aPosChapterBox.Hide();
        aNumCountBox.Hide();
        aContLbl.Hide();
        aContEdit.Hide();
        aContFromLbl.Hide();
        aContFromEdit.Hide();
        aContGrp.Hide();
        bPosDoc = TRUE;
    }
    else
    {
        const SwFtnInfo &rInf = pSh->GetFtnInfo();
        // Position (Seite, Kapitel) setzen
        if ( rInf.ePos == FTNPOS_PAGE )
        {
            aPosPageBox.Check();
            aPageTemplLbl.Enable(FALSE);
            aPageTemplBox.Enable(FALSE);
        }
        else // if ( rInf.ePos == FTNPOS_CHAPTER )
        {
            aPosChapterBox.Check();
            aNumCountBox.RemoveEntry(aNumPage);
            bPosDoc = TRUE;
        }
            // Verweistexte
        aContEdit.SetText(rInf.aQuoVadis);
        aContFromEdit.SetText(rInf.aErgoSum);

            // gesammelt wo
        SelectNumbering(rInf.eNum);
    }

        // Numerierung
        // Art
    aNumViewBox.SelectEntryPos( GetNumPos( pInf->aFmt.eType ));
    aOffsetFld.SetValue(pInf->nFtnOffset + 1);
    aPrefixED.SetText(pInf->GetPrefix());
    aSuffixED.SetText(pInf->GetSuffix());

    const SwCharFmt* pCharFmt = pInf->GetCharFmt(
                        *pSh->GetView().GetDocShell()->GetDoc());
    aFtnCharTextTemplBox.SelectEntry(pCharFmt->GetName());
    aFtnCharTextTemplBox.SaveValue();

    pCharFmt = pInf->GetAnchorCharFmt( *pSh->GetDoc() );
    aFtnCharAnchorTemplBox.SelectEntry( pCharFmt->GetName() );
    aFtnCharAnchorTemplBox.SaveValue();

        // Vorlagen - Sonderbereiche
        // Absatz
    SfxStyleSheetBasePool* pStyleSheetPool = pSh->GetView().GetDocShell()->GetStyleSheetPool();
    pStyleSheetPool->SetSearchMask(SFX_STYLE_FAMILY_PARA, SWSTYLEBIT_EXTRA);
    SfxStyleSheetBase *pStyle = pStyleSheetPool->First();
    while(pStyle)
    {
        aParaTemplBox.InsertEntry(pStyle->GetName());
        pStyle = pStyleSheetPool->Next();
    }

    String sStr;
    GetDocPoolNm( bEndNote ? RES_POOLCOLL_ENDNOTE
                           : RES_POOLCOLL_FOOTNOTE, sStr );
    if(LISTBOX_ENTRY_NOTFOUND == aParaTemplBox.GetEntryPos( sStr ) )
        aParaTemplBox.InsertEntry( sStr );

    SwTxtFmtColl* pColl = pInf->GetFtnTxtColl();
    if( !pColl )
        aParaTemplBox.SelectEntry( sStr );      // Default
    else
    {
        ASSERT(!pColl->IsDefault(), "Defaultvorlage fuer Fussnoten ist falsch.");
        const USHORT nPos = aParaTemplBox.GetEntryPos(pColl->GetName());
        if( LISTBOX_ENTRY_NOTFOUND != nPos )
            aParaTemplBox.SelectEntryPos( nPos );
        else
        {
            aParaTemplBox.InsertEntry(pColl->GetName());
            aParaTemplBox.SelectEntry(pColl->GetName());
        }
    }

        // Seite
    for( USHORT i = RES_POOLPAGE_BEGIN; i <= RES_POOLPAGE_ENDNOTE; ++i )
        aPageTemplBox.InsertEntry(GetDocPoolNm( i, sStr ));

    USHORT nCount = pSh->GetPageDescCnt();
    for(i = 0; i < nCount; ++i)
    {
        const SwPageDesc &rPageDesc = pSh->GetPageDesc(i);
        if(LISTBOX_ENTRY_NOTFOUND == aPageTemplBox.GetEntryPos(rPageDesc.GetName()))
            aPageTemplBox.InsertEntry(rPageDesc.GetName());
    }

    aPageTemplBox.SelectEntry( pInf->GetPageDesc( *pSh->GetDoc() )->GetName());
    delete pInf;
}

SwEndNoteOptionPage::~SwEndNoteOptionPage()
{
}

SfxTabPage *SwEndNoteOptionPage::Create( Window *pParent, const SfxItemSet &rSet )
{
    return new SwEndNoteOptionPage( pParent, TRUE, rSet );
}

/*------------------------------------------------------------------------
 Beschreibung:  Unterschiedliche Arten der Numerierung; da die Listbox
                unterschiedlich viele Eintraege hat, hier Funktionen
                fuer das Setzen und Erfragen der gemeinten Art
                der Numerierung.
------------------------------------------------------------------------*/
inline void SwEndNoteOptionPage::SelectNumbering(int eNum)
{
    aNumCountBox.SelectEntryPos(bPosDoc? (USHORT)eNum - 1: eNum);
    NumCount( &aNumCountBox );
}



int SwEndNoteOptionPage::GetNumbering() const
{
    const USHORT nPos = aNumCountBox.GetSelectEntryPos();
    return (int) bPosDoc? nPos + 1: nPos;
}

/*-----------------09.02.98 11:17-------------------

--------------------------------------------------*/
void SwEndNoteOptionPage::SetShell( SwWrtShell &rShell )
{
    pSh = &rShell;
    // Zeichenvorlagen sammeln
    aFtnCharTextTemplBox.Clear();
    aFtnCharAnchorTemplBox.Clear();
    ::FillCharStyleListBox(aFtnCharTextTemplBox,
                        pSh->GetView().GetDocShell());

    ::FillCharStyleListBox(aFtnCharAnchorTemplBox,
                        pSh->GetView().GetDocShell());
}

/*------------------------------------------------------------------------
 Beschreibung:  Handler hinter dem Button fuer Sammeln der Fussnote
                auf der Seite.
                In diesem Fall koennen alle Numerierungsarten verwendet
                werden.
------------------------------------------------------------------------*/


IMPL_LINK( SwEndNoteOptionPage, PosPage, Button *, EMPTYARG )
{
    const SwFtnNum eNum = (const SwFtnNum)GetNumbering();
    bPosDoc = FALSE;
    if(LISTBOX_ENTRY_NOTFOUND == aNumCountBox.GetEntryPos(aNumPage)) {
        aNumCountBox.InsertEntry(aNumPage, FTNNUM_PAGE);
        SelectNumbering(eNum);
    }
    aPageTemplLbl.Enable(FALSE);
    aPageTemplBox.Enable(FALSE);

    return 0;
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/


IMPL_LINK( SwEndNoteOptionPage, NumCount, ListBox*, EMPTYARG )
{
    BOOL bEnable = TRUE;
    if( aNumCountBox.GetEntryCount() - 1 != aNumCountBox.GetSelectEntryPos() )
    {
        bEnable = FALSE;
        aOffsetFld.SetValue(1);
    }
    aOffsetLbl.Enable(bEnable);
    aOffsetFld.Enable(bEnable);
    return 0;
}

/*------------------------------------------------------------------------
 Beschreibung:  Handler hinter dem Button fuer Sammeln der Fussnote
                am Kapitel oder Dokumentende.
                In diesem Fall kann keine seitenweise Numerierung verwendet
                werden.
------------------------------------------------------------------------*/


IMPL_LINK_INLINE_START( SwEndNoteOptionPage, PosChapter, Button *, EMPTYARG )
{
    if ( !bPosDoc )
        SelectNumbering(FTNNUM_DOC);

    bPosDoc = TRUE;
    aNumCountBox.RemoveEntry(aNumPage);
    aPageTemplLbl.Enable();
    aPageTemplBox.Enable();
    return 0;
}
IMPL_LINK_INLINE_END( SwEndNoteOptionPage, PosChapter, Button *, EMPTYARG )

SwCharFmt* lcl_GetCharFormat( SwWrtShell* pSh, const String& rCharFmtName )
{
    SwCharFmt* pFmt = 0;
    USHORT nChCount = pSh->GetCharFmtCount();
    for(USHORT i = 0; i< nChCount; i++)
    {
        SwCharFmt& rChFmt = pSh->GetCharFmt(i);
        if(rChFmt.GetName() == rCharFmtName )
        {
            pFmt = &rChFmt;
            break;
        }
    }
    if(!pFmt)
    {
        SfxStyleSheetBasePool* pPool = pSh->GetView().GetDocShell()->GetStyleSheetPool();
        SfxStyleSheetBase* pBase;
        pBase = pPool->Find(rCharFmtName, SFX_STYLE_FAMILY_CHAR);
        if(!pBase)
            pBase = &pPool->Make(rCharFmtName, SFX_STYLE_FAMILY_CHAR);
        pFmt = ((SwDocStyleSheet*)pBase)->GetCharFmt();
    }
    return pFmt;
}

BOOL SwEndNoteOptionPage::FillItemSet( SfxItemSet &rSet )
{
    SwEndNoteInfo *pInf = bEndNote ? new SwEndNoteInfo() : new SwFtnInfo();

    pInf->nFtnOffset = aOffsetFld.GetValue() -1;
    pInf->aFmt.eType = GetNumType( aNumViewBox.GetSelectEntryPos() );
    pInf->SetPrefix(aPrefixED.GetText());
    pInf->SetSuffix(aSuffixED.GetText());

    pInf->SetCharFmt( lcl_GetCharFormat( pSh,
                        aFtnCharTextTemplBox.GetSelectEntry() ) );
    pInf->SetAnchorCharFmt( lcl_GetCharFormat( pSh,
                        aFtnCharAnchorTemplBox.GetSelectEntry() ) );

    // Absatzvorlage
    USHORT nPos = aParaTemplBox.GetSelectEntryPos();
    if(LISTBOX_ENTRY_NOTFOUND != nPos)
    {
        const String aFmtName( aParaTemplBox.GetSelectEntry() );
        SwTxtFmtColl *pColl = pSh->GetParaStyle(aFmtName, SwWrtShell::GETSTYLE_CREATEANY);
        ASSERT(pColl, "Absatzvorlage nicht gefunden.");
        pInf->SetFtnTxtColl(*pColl);
    }

    // Seitenvorlage
    pInf->ChgPageDesc( pSh->FindPageDescByName(
                                aPageTemplBox.GetSelectEntry(), TRUE ) );

    if ( bEndNote )
    {
        if ( !(*pInf == pSh->GetEndNoteInfo()) )
            pSh->SetEndNoteInfo( *pInf );
    }
    else
    {
        SwFtnInfo *pI = (SwFtnInfo*)pInf;
        pI->ePos = aPosPageBox.IsChecked() ? FTNPOS_PAGE : FTNPOS_CHAPTER;
        pI->eNum = (SwFtnNum)GetNumbering();
        pI->aQuoVadis = aContEdit.GetText();
        pI->aErgoSum = aContFromEdit.GetText();
        if ( !(*pI == pSh->GetFtnInfo()) )
            pSh->SetFtnInfo( *pI );
    }
    delete pInf;
    return TRUE;
}

SwFootNoteOptionPage::SwFootNoteOptionPage( Window *pParent, const SfxItemSet &rSet ) :
    SwEndNoteOptionPage( pParent, FALSE, rSet )
{
}

SwFootNoteOptionPage::~SwFootNoteOptionPage()
{
}

SfxTabPage *SwFootNoteOptionPage::Create(Window *pParent, const SfxItemSet &rSet )
{
    return new SwFootNoteOptionPage( pParent, rSet );
}



/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.72  2000/09/18 16:05:56  willem.vandorp
    OpenOffice header added.

    Revision 1.71  2000/07/27 21:16:43  jp
    opt: get template names direct from the doc and don't load it from the resource

    Revision 1.70  2000/04/26 14:57:09  os
    GetName() returns const String&

    Revision 1.69  2000/02/22 14:50:14  os
    #72894# footnote option dialog in HTML documents

    Revision 1.68  1999/11/12 13:02:12  jp
    call Set-/GetAnchorCharFormat at SwEndnoteInfo

    Revision 1.67  1999/11/05 12:45:36  os
    character style for footnote anchor

    Revision 1.66  1999/02/05 16:45:26  JP
    Task #61467#/#61014#: neu FindPageDescByName


      Rev 1.65   05 Feb 1999 17:45:26   JP
   Task #61467#/#61014#: neu FindPageDescByName

      Rev 1.64   17 Nov 1998 10:57:52   OS
   #58263# NumType durch SvxExtNumType ersetzt

      Rev 1.63   06 Nov 1998 16:36:02   OS
   #58450# Fussnoten auch im HTML

      Rev 1.62   06 Aug 1998 21:41:14   JP
   Bug #54796#: neue NumerierungsTypen (WW97 kompatibel)

      Rev 1.61   26 Jun 1998 16:17:42   OM
   #51758# Unterschiedliche HelpIDs fuer alle Controls

      Rev 1.60   15 Apr 1998 14:34:58   OS
   CharStyles sortiert

      Rev 1.59   26 Feb 1998 17:09:28   OS
   FillItemSet: erst aendern, dann vergleichen

      Rev 1.58   24 Feb 1998 12:17:08   OS
   Endnotesymbol #47534#

      Rev 1.57   19 Feb 1998 13:52:18   OM
   Zeichen statt Seitenvorlagen

      Rev 1.56   09 Feb 1998 13:07:28   OS
   Fuss-/Endnoten mit Zeichenvorlage und Pre-/Suffix

      Rev 1.55   03 Feb 1998 12:54:48   OM
   #46624# HelpIDs fuer Fuss- und Endnoten TPs

      Rev 1.54   21 Jan 1998 11:03:56   JP
   FootNodeOptionPage: unoetiges und falsche FreeResource entfernt

      Rev 1.53   15 Dec 1997 10:45:20   MA
   FtnInfo: client fuer Pagedesc; TxtColl fuer Endnote

      Rev 1.52   12 Dec 1997 16:07:14   MA
   poolpage fuer footnote und endnote

      Rev 1.51   12 Dec 1997 10:10:22   MA
   Fuss-/Endnoteneinstellungen

      Rev 1.50   24 Nov 1997 16:47:44   MA
   includes

      Rev 1.49   03 Nov 1997 13:22:42   MA
   precomp entfernt

      Rev 1.48   07 Feb 1997 15:48:18   MA
   fix: ClickHdl wird gerufen, der darf dann aber die Defaults nicht verstellen.

      Rev 1.47   11 Nov 1996 11:05:44   MA
   ResMgr

      Rev 1.46   24 Oct 1996 17:08:28   JP
   Optimierung: Find...ByName

      Rev 1.45   02 Oct 1996 18:28:58   MA
   Umstellung Enable/Disable

      Rev 1.44   28 Aug 1996 14:12:20   OS
   includes

      Rev 1.43   22 Mar 1996 14:06:46   HJS
   umstellung 311

      Rev 1.42   17 Feb 1996 10:25:06   OS
   Absatzvorlagen-Listbox zeigt jetzt alle Vorlagen/Sonderbereiche an

      Rev 1.41   13 Feb 1996 11:37:46   OS
   Offset fuer Fussnoten nur pro Dokument

      Rev 1.40   12 Feb 1996 16:42:18   OS
   neu: Offset fuer Fussnotennumerierung

      Rev 1.39   06 Feb 1996 15:21:06   JP
   Link Umstellung 305

      Rev 1.38   24 Nov 1995 16:58:44   OM
   PCH->PRECOMPILED

      Rev 1.37   08 Nov 1995 13:31:40   JP
   Umstellung zur 301: Change -> Set

      Rev 1.36   12 Sep 1995 17:29:26   OM
   Helpbutton eingefuegt

      Rev 1.35   30 Aug 1995 14:00:46   MA
   fix: sexport'iert

      Rev 1.34   21 Aug 1995 09:33:48   MA
   chg: swstddlg -> svxstandarddialog, Optimierungen

      Rev 1.33   26 Oct 1994 12:17:50   ER
   add: PCH (missed the misc)

      Rev 1.32   17 Oct 1994 16:26:14   PK
   ausgeboxtes wieder reingeboxt

------------------------------------------------------------------------*/




diff --git a/sw/source/ui/misc/docfnote.hrc b/sw/source/ui/misc/docfnote.hrc
new file mode 100644
index 0000000..80a4282
--- /dev/null
+++ b/sw/source/ui/misc/docfnote.hrc
@@ -0,0 +1,92 @@
/*************************************************************************
 *
 *  $RCSfile: docfnote.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:44 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#define RB_POS_PAGE     1
#define RB_POS_CHAPTER  2
#define GB_POS          3

#define LB_NUMVIEW      10
#define LB_NUMCOUNT     11
#define FLD_OFFSET      12
#define FT_OFFSET       13
#define GB_NUM          14

#define LB_PARA_TEMPL   30
#define LB_PAGE_TEMPL   31
#define FT_PARA_TEMPL   32
#define FT_PAGE_TEMPL   33
#define GB_TEMPL        34

#define FT_CONT         40
#define ED_CONT         41
#define FT_CONT_FROM    42
#define ED_CONT_FROM    43
#define GB_CONT         44

#define FT_PREFIX       45
#define ED_PREFIX       46
#define FT_SUFFIX       47
#define ED_SUFFIX       48
#define FT_TEXT_CHARFMT     49
#define LB_TEXT_CHARFMT     50
#define FT_ANCHR_CHARFMT    51
#define GB_CHAR_TEMPL       52
#define LB_ANCHR_CHARFMT    53

diff --git a/sw/source/ui/misc/docfnote.src b/sw/source/ui/misc/docfnote.src
new file mode 100644
index 0000000..0b9ef56
--- /dev/null
+++ b/sw/source/ui/misc/docfnote.src
@@ -0,0 +1,1577 @@
/*************************************************************************
 *
 *  $RCSfile: docfnote.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:44 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "misc.hrc"
#include "docfnote.hrc"
#include "helpid.h"
#include "cmdid.h"
#include "frmui.hrc"
TabDialog DLG_DOC_FOOTNOTE
{
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Text = "Fußnoteneinstellung" ;
    Text [ ENGLISH ] = "Footnote Options" ;
    Text [ norwegian ] = "Fotnotevalg" ;
    Text [ italian ] = "Impostazioni note a piè pagina" ;
    Text [ portuguese_brazilian ] = "Opções de nota de rodapé" ;
    Text [ portuguese ] = "Opções de notas de rodapé" ;
    Text [ finnish ] = "Alaviitteen määritykset" ;
    Text [ danish ] = "Fodnoteindstillinger" ;
    Text [ french ] = "Paramètres des notes de bas de page" ;
    Text [ swedish ] = "Fotnotsinställning" ;
    Text [ dutch ] = "Voetnootinstelling" ;
    Text [ spanish ] = "Opciones de notas al pie" ;
    Text [ english_us ] = "Footnote Settings" ;
    Moveable = TRUE ;
    TabControl 1
    {
        OutputSize = TRUE ;
        PageList =
        {
            PageItem
            {
                Identifier = TP_FOOTNOTEOPTION ;
                PageResID = TP_FOOTNOTEOPTION ;
                Text = "Fußnoten" ;
                Text [ ENGLISH ] = "Footnotes" ;
                Text [ english_us ] = "Footnotes" ;
                Text [ portuguese_brazilian ] = "Fußnoten" ;
                Text [ swedish ] = "Fotnoter" ;
                Text [ danish ] = "Fodnoter" ;
                Text [ italian ] = "Note a piè pagina" ;
                Text [ spanish ] = "Notas al pie" ;
                Text [ french ] = "Notes de bas de page" ;
                Text [ dutch ] = "Voetnoten" ;
                Text [ portuguese ] = "Notas de rodapé" ;
                Text[ chinese_simplified ] = "×¢½Å";
                Text[ russian ] = "Ñíîñêè";
                Text[ polish ] = "Przypisy dolne";
                Text[ japanese ] = "‹r’";
                Text[ chinese_traditional ] = "µù¸}";
                Text[ arabic ] = "ÍæÇÔí ÓÝáíÉ";
                Text[ greek ] = "Õðïóçìåéþóåéò";
                Text[ korean ] = "°¢ÁÖ";
                Text[ turkish ] = "Dipnot";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_ENDNOTEOPTION ;
                PageResID = TP_ENDNOTEOPTION ;
                Text = "Endnoten" ;
                Text [ ENGLISH ] = "Endnotes" ;
                Text [ english_us ] = "Endnotes" ;
                Text [ portuguese_brazilian ] = "Endnoten" ;
                Text [ swedish ] = "Slutnoter" ;
                Text [ danish ] = "Slutnoter" ;
                Text [ italian ] = "Note di chiusura" ;
                Text [ spanish ] = "Notas finales" ;
                Text [ french ] = "Notes de fin" ;
                Text [ dutch ] = "Eindnoten" ;
                Text [ portuguese ] = "Notas finais" ;
                Text[ chinese_simplified ] = "βע";
                Text[ russian ] = "Êîíöåâûå ñíîñêè";
                Text[ polish ] = "Przypisy koñc.";
                Text[ japanese ] = "•¶––‹r’";
                Text[ chinese_traditional ] = "§Àª`";
                Text[ arabic ] = "ÊÚáíÞÇÊ ÎÊÇãíÉ";
                Text[ greek ] = "Óçìåéþóåéò ôÝëïõò";
                Text[ korean ] = "¹ÌÁÖ";
                Text[ turkish ] = "Sonnot";
                Text[ language_user1 ] = " ";
            };
        };
    };
    Text[ chinese_simplified ] = "É趨ע½Å";
    Text[ russian ] = "Óñòàíîâêà ñíîñîê";
    Text[ polish ] = "Ustawienie przypisów dolnych";
    Text[ japanese ] = "‹r’‚̐ݒè";
    Text[ chinese_traditional ] = "³]©wµù¸}";
    Text[ arabic ] = "ÅÚÏÇÏ ÇáÍÇÔíÉ ÇáÓÝáíÉ";
    Text[ greek ] = "Ñõèìßóåéò õðïóçìåéþóåùí";
    Text[ korean ] = "°¢ÁÖ ¿É¼Ç";
    Text[ turkish ] = "Dipnot ayarlarý";
    Text[ language_user1 ] = " ";
};
TabPage TP_FOOTNOTEOPTION
{
    SVLook = TRUE ;
    Hide = TRUE;
    HelpID = HID_FOOTNOTE_OPTIONS ;
    Pos = MAP_APPFONT ( 0 , 0 ) ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    GroupBox GB_NUM
    {
        Pos = MAP_APPFONT ( 6 , 2 ) ;
        Size = MAP_APPFONT ( 248 , 42 ) ;
        Text = "Automatische Nummerierung" ;
        Text [ ENGLISH ] = "Automatic numbering" ;
        Text [ norwegian ] = "Auto. nummerering" ;
        Text [ italian ] = "Numerazione automatica" ;
        Text [ portuguese_brazilian ] = "Numeração automática" ;
        Text [ portuguese ] = "Numeração automática" ;
        Text [ finnish ] = "Automaattinumerointi" ;
        Text [ danish ] = "Automatisk nummerering" ;
        Text [ french ] = "Numérotation automatique" ;
        Text [ swedish ] = "Automatisk numrering" ;
        Text [ dutch ] = "Automatische nummering" ;
        Text [ spanish ] = "Numeración automática" ;
        Text [ english_us ] = "AutoNumbering" ;
        Group = TRUE ;
        Text[ chinese_simplified ] = "×Ô¶¯±àºÅ";
        Text[ russian ] = "Àâòîìàòè÷åñêàÿ íóìåðàöèÿ";
        Text[ polish ] = "Automatyczna numeracja";
        Text[ japanese ] = "Ž©“®”ԍ†•t‚¯";
        Text[ chinese_traditional ] = "¦Û°Ê½s¸¹";
        Text[ arabic ] = "ÊÑÞíã ÊáÞÇÆí";
        Text[ greek ] = "Áõôüìáôç áñßèìçóç";
        Text[ korean ] = "ÀÚµ¿ ¹øÈ£ ¸Å±â±â";
        Text[ turkish ] = "Otomatik numaralama";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_NUMVIEW
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 12 , 12 ) ;
        Size = MAP_APPFONT ( 62 , 50 ) ;
        TabStop = TRUE ;
        Group = TRUE ;
        DropDown = TRUE ;
        CurPos = 0 ;
        StringList =
        {
            "A, B, C" ;
            "a, b, c" ;
            "I, II, III" ;
            "i, ii, iii" ;
            "1, 2, 3" ;
            "A, .., AA, .., AAA" ;
            "a, .., aa, .., aaa" ;
        };
    };
    FixedText FT_OFFSET
    {
        Pos = MAP_APPFONT ( 82 , 14 ) ;
        Size = MAP_APPFONT ( 36 , 8 ) ;
        Text = "Be~ginn bei" ;
        Text [ ENGLISH ] = "~Start at" ;
        Left = TRUE ;
        Text [ english_us ] = "~Start at" ;
        Text [ italian ] = "Ini~zia con" ;
        Text [ spanish ] = "Comen~zar en" ;
        Text [ french ] = "À partir de" ;
        Text [ dutch ] = "~Begin met" ;
        Text [ swedish ] = "~Börja vid" ;
        Text [ danish ] = "Begynd med" ;
        Text [ portuguese_brazilian ] = "Be~ginn bei" ;
        Text [ portuguese ] = "~Iniciar em" ;
        Text[ chinese_simplified ] = "¿ªÊ¼´Ó(~S)";
        Text[ russian ] = "Íà÷àòü ñ";
        Text[ polish ] = "Zacznij od";
        Text[ japanese ] = "ŠJŽn‹r’”ԍ†(~S)";
        Text[ chinese_traditional ] = "¶}©l±q(~S)";
        Text[ arabic ] = "ÇáÈÏÁ ÈÜ";
        Text[ greek ] = "ÈÝóç åêêßíçóçò";
        Text[ korean ] = "½ÃÀÛÇÒ °÷(~S)";
        Text[ turkish ] = "B~aþlangýç";
        Text[ language_user1 ] = " ";
    };
    NumericField FLD_OFFSET
    {
        Pos = MAP_APPFONT ( 133 , 12 ) ;
        Size = MAP_APPFONT ( 30 , 12 ) ;
        Spin = TRUE ;
        Minimum = 1 ;
        First = 1 ;
        Last = 9999 ;
        Maximum = 9999 ;
        TabStop = TRUE ;
        Border = TRUE ;
    };
    ListBox LB_NUMCOUNT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 12 , 27 ) ;
        Size = MAP_APPFONT ( 62 , 50 ) ;
        TabStop = TRUE ;
        Group = TRUE ;
        DropDown = TRUE ;
        CurPos = 0 ;
        StringList =
        {
            < "Pro Seite" ; > ;
            < "Pro Kapitel" ; > ;
            < "Pro Dokument" ; > ;
        };
        StringList [ ENGLISH ] =
        {
            < "Pro Seite" ; > ;
            < "Pro Kapitel" ; > ;
            < "Pro Dokument" ; > ;
        };
        StringList [ norwegian ] =
        {
            < "Pro Seite" ; > ;
            < "Pro Kapitel" ; > ;
            < "Pro Dokument" ; > ;
        };
        StringList [ italian ] =
        {
            < "Per pagina" ; > ;
            < "Per capitolo" ; > ;
            < "Per documento" ; > ;
        };
        StringList [ portuguese_brazilian ] =
        {
            < "Por página" ; > ;
            < "Por capítulo" ; > ;
            < "Por documento" ; > ;
        };
        StringList [ portuguese ] =
        {
            < "Por página" ; > ;
            < "Por capítulo" ; > ;
            < "Por documento" ; > ;
        };
        StringList [ finnish ] =
        {
            < "Pro Seite" ; > ;
            < "Pro Kapitel" ; > ;
            < "Pro Dokument" ; > ;
        };
        StringList [ danish ] =
        {
            < "Per side" ; > ;
            < "Per kapitel" ; > ;
            < "Per dokument" ; > ;
        };
        StringList [ french ] =
        {
            < "Par page" ; > ;
            < "Par chapitre" ; > ;
            < "Par document" ; > ;
        };
        StringList [ swedish ] =
        {
            < "Per sida" ; > ;
            < "Per kapitel" ; > ;
            < "Per dokument" ; > ;
        };
        StringList [ dutch ] =
        {
            < "Per pagina" ; > ;
            < "Per hoofdstuk" ; > ;
            < "Per document" ; > ;
        };
        StringList [ spanish ] =
        {
            < "Por página" ; > ;
            < "Por capítulo" ; > ;
            < "Por documento" ; > ;
        };
        StringList [ english_us ] =
        {
            < "Per page" ; > ;
            < "Per chapter" ; > ;
            < "Per document" ; > ;
        };
    StringList [ chinese_simplified ] =
    {
            < "ÿҳ" ; > ;
        < "ÿÕÂ" ; > ;
        < "ÿÎĵµ" ; > ;
    };
    StringList [ russian ] =
    {
            < "Íà îäíó ñòðàíèöó" ; > ;
        < "Íà îäíó ãëàâó" ; > ;
        < "Íà îäèí äîêóìåíò" ; > ;
    };
    StringList [ polish ] =
    {
            < "Na stronê" ; > ;
        < "Na rozdzia³" ; > ;
        < "Na dokument" ; > ;
    };
    StringList [ japanese ] =
    {
            < "Íß°¼Þ‚²‚Æ" ; > ;
        < "Í‚²‚Æ" ; > ;
        < "•¶‘‚²‚Æ" ; > ;
    };
    StringList [ chinese_traditional ] =
    {
            < "¨C­¶" ; > ;
        < "¨C³¹" ; > ;
        < "¨C­Ó¤å¥ó" ; > ;
    };
    StringList [ arabic ] =
    {
            < "Ýí ÇáÕÝÍÉ" ; > ;
        < "Ýí ÇáÝÕá" ; > ;
        < "Ýí ÇáãÓÊäÏ" ; > ;
    };
    StringList [ greek ] =
    {
            < "ÁíÜ óåëßäá" ; > ;
        < "ÁíÜ êåöÜëáéï" ; > ;
        < "ÁíÜ Ýããñáöï" ; > ;
    };
    StringList [ korean ] =
    {
            < "ÆäÀÌÁö ´ç" ; > ;
        < "Àå ¸¶´Ù" ; > ;
        < "¹®¼­ ´ç" ; > ;
    };
    StringList [ turkish ] =
    {
            < "Beher sayfa" ; > ;
        < "Beher bölüm" ; > ;
        < "Beher belge" ; > ;
    };
    StringList [ language_user1 ] =
    {
            < " " ; > ;
        < " " ; > ;
        < " " ; > ;
    };
    };
    FixedText FT_PREFIX
    {
        Pos = MAP_APPFONT ( 82 , 27 ) ;
        Size = MAP_APPFONT ( 30 , 10 ) ;
        Text = "~Davor" ;
        Text [ ENGLISH ] = "Before" ;
        Text [ norwegian ] = "Før" ;
        Text [ italian ] = "~Davanti" ;
        Text [ portuguese_brazilian ] = "Antes" ;
        Text [ portuguese ] = "An~tes" ;
        Text [ finnish ] = "Edellä" ;
        Text [ danish ] = "Før" ;
        Text [ french ] = "Avant" ;
        Text [ swedish ] = "~Framför" ;
        Text [ dutch ] = "~Ervoor" ;
        Text [ spanish ] = "~Delante" ;
        Text [ english_us ] = "Be~fore" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "֮ǰ(~F)";
        Text[ russian ] = "Äî";
        Text[ polish ] = "Przed";
        Text[ japanese ] = "”ԍ†‘O(~F)";
        Text[ chinese_traditional ] = "¤§«e(~F)";
        Text[ arabic ] = "ÞÈá";
        Text[ greek ] = "Ðñéí áðü";
        Text[ korean ] = "ÀÌÀü(~F)";
        Text[ turkish ] = "Ba~þýnda";
        Text[ language_user1 ] = " ";
    };
    Edit ED_PREFIX
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 133 , 27 ) ;
        Size = MAP_APPFONT ( 30 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        MaxTextLength = 50 ;
    };
    FixedText FT_SUFFIX
    {
        Pos = MAP_APPFONT ( 166 , 27 ) ;
        Size = MAP_APPFONT ( 30 , 10 ) ;
        Text = "Dahin~ter" ;
        Text [ ENGLISH ] = "Behind" ;
        Text [ norwegian ] = "Bak" ;
        Text [ italian ] = "Die~tro" ;
        Text [ portuguese_brazilian ] = "Atrás" ;
        Text [ portuguese ] = "At~rás" ;
        Text [ finnish ] = "Jäljessä" ;
        Text [ danish ] = "Efter" ;
        Text [ french ] = "Après" ;
        Text [ swedish ] = "~Bakom" ;
        Text [ dutch ] = "E~rachter" ;
        Text [ spanish ] = "D~etrás" ;
        Text [ english_us ] = "Aft~er" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "Ö®ºó(~E)";
        Text[ russian ] = "Ïîñëå";
        Text[ polish ] = "Za";
        Text[ japanese ] = "”ԍ†Œã(~E)";
        Text[ chinese_traditional ] = "¤§«á(~E)";
        Text[ arabic ] = "ÈÚÏ";
        Text[ greek ] = "ÌåôÜ áðü";
        Text[ korean ] = "ÀÌÈÄ(~E)";
        Text[ turkish ] = "A~rkasýnda";
        Text[ language_user1 ] = " ";
    };
    Edit ED_SUFFIX
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 221 , 27 ) ;
        Size = MAP_APPFONT ( 30 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        MaxTextLength = 50 ;
    };
    GroupBox GB_TEMPL
    {
        Pos = MAP_APPFONT ( 6 , 46 ) ;
        Size = MAP_APPFONT ( 115 , 42 ) ;
        Text = "Vorlagen" ;
        Text [ ENGLISH ] = "Styles" ;
        Text [ norwegian ] = "Styles" ;
        Text [ italian ] = "Modelli" ;
        Text [ portuguese_brazilian ] = "Estilos" ;
        Text [ portuguese ] = "Estilos" ;
        Text [ finnish ] = "Tyylit" ;
        Text [ danish ] = "Typografi" ;
        Text [ french ] = "Styles" ;
        Text [ swedish ] = "Formatmallar" ;
        Text [ dutch ] = "Opmaakprofielen" ;
        Text [ spanish ] = "Estilos" ;
        Text [ english_us ] = "Styles" ;
        Text[ chinese_simplified ] = "Ñùʽ";
        Text[ russian ] = "Ñòèëè";
        Text[ polish ] = "Szablony";
        Text[ japanese ] = "½À²Ù";
        Text[ chinese_traditional ] = "¼Ë¦¡";
        Text[ arabic ] = "ÃäãÇØ";
        Text[ greek ] = "Ðñüôõðá";
        Text[ korean ] = "À¯Çü";
        Text[ turkish ] = "Biçim";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_PARA_TEMPL
    {
        Pos = MAP_APPFONT ( 12 , 58 ) ;
        Size = MAP_APPFONT ( 38 , 8 ) ;
        Text = "~Absatz" ;
        Text [ ENGLISH ] = "~Paragraph" ;
        Text [ norwegian ] = "~Paragraf" ;
        Text [ italian ] = "~Paragrafo" ;
        Text [ portuguese_brazilian ] = "~Parágrafo" ;
        Text [ portuguese ] = "~Parágrafo" ;
        Text [ finnish ] = "~Kappale" ;
        Text [ danish ] = "Afsnit" ;
        Text [ french ] = "~Paragraphe" ;
        Text [ swedish ] = "Sty~cke" ;
        Text [ dutch ] = "~Alinea" ;
        Text [ spanish ] = "Párra~fo" ;
        Text [ english_us ] = "Pa~ragraph" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "¶ÎÂä(~R)";
        Text[ russian ] = "Àáçàö";
        Text[ polish ] = "Akapit";
        Text[ japanese ] = "’i—Ž(~R)";
        Text[ chinese_traditional ] = "¬q¸¨(~R)";
        Text[ arabic ] = "ÝÞÑÉ";
        Text[ greek ] = "ÐáñÜãñáöïò";
        Text[ korean ] = "´Ü¶ô(~R)";
        Text[ turkish ] = "~Paragraf";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_PARA_TEMPL
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 51 , 56 ) ;
        Size = MAP_APPFONT ( 67 , 54 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        CurPos = 0 ;
        Sort = TRUE ;
    };
    FixedText FT_PAGE_TEMPL
    {
        Pos = MAP_APPFONT ( 12 , 73 ) ;
        Size = MAP_APPFONT ( 38 , 8 ) ;
        Text = "~Seite" ;
        Text [ ENGLISH ] = "~Page" ;
        Text [ norwegian ] = "~Page" ;
        Text [ italian ] = "~Pagina" ;
        Text [ portuguese_brazilian ] = "~Página" ;
        Text [ portuguese ] = "~Página" ;
        Text [ finnish ] = "~Sivu" ;
        Text [ danish ] = "Side" ;
        Text [ french ] = "P~age" ;
        Text [ swedish ] = "~Sida" ;
        Text [ dutch ] = "~Pagina" ;
        Text [ spanish ] = "Pá~gina" ;
        Text [ english_us ] = "~Page" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "ҳ(~P)";
        Text[ russian ] = "Ñòðàíèöà";
        Text[ polish ] = "Strona";
        Text[ japanese ] = "Íß°¼Þ(~P)";
        Text[ chinese_traditional ] = "­¶(~P)";
        Text[ arabic ] = "ÇáÕÝÍÉ";
        Text[ greek ] = "Óåëßäá";
        Text[ korean ] = "ÆäÀÌÁö(~P)";
        Text[ turkish ] = "~Sayfa";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_PAGE_TEMPL
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 51 , 71 ) ;
        Size = MAP_APPFONT ( 67 , 54 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
    };
    GroupBox GB_CHAR_TEMPL
    {
        Pos = MAP_APPFONT ( 125 , 46 ) ;
        Size = MAP_APPFONT ( 129 , 42 ) ;
        Text = "Zeichenvorlagen" ;
        Text [ ENGLISH ] = "Character styles" ;

        Text[ english_us ] = "Character Styles";
        Text[ portuguese ] = "Estilos de caracteres";
        Text[ russian ] = "Ñòèëè çíàêîâ";
        Text[ greek ] = "Óôõë ÷áñáêôÞñùí";
        Text[ dutch ] = "Tekenopmaakprofielen";
        Text[ french ] = "Styles de caractère";
        Text[ spanish ] = "Estilos de carácter";
        Text[ italian ] = "Modelli di carattere";
        Text[ danish ] = "Tegntypografi";
        Text[ swedish ] = "Teckenformatmallar";
        Text[ polish ] = "Style znaków";
        Text[ portuguese_brazilian ] = "Character styles";
        Text[ japanese ] = "•¶Žš½À²Ù";
        Text[ korean ] = "¹®ÀÚ À¯Çü";
        Text[ chinese_simplified ] = "×Ö·ûÑùʽ";
        Text[ chinese_traditional ] = "¦r¤¸¼Ë¦¡";
        Text[ arabic ] = "ÃäãÇØ ÃÍÑÝ";
        Text[ turkish ] = "Karakter biçimi";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_ANCHR_CHARFMT
    {
        Pos = MAP_APPFONT ( 129 , 58 ) ;
        Size = MAP_APPFONT ( 55 , 8 ) ;
        Text = "Te~xtbereich" ;
        Text [ ENGLISH ] = "Text" ;
        Left = TRUE ;
        Text [ english_us ] = "Te~xt area" ;
        Text [ portuguese_brazilian ] = "~Fußnotensymbol" ;
        Text [ swedish ] = "Textområde" ;
        Text [ danish ] = "Tekstområde" ;
        Text [ italian ] = "Area del testo" ;
        Text [ spanish ] = "Área de ~texto" ;
        Text [ french ] = "Plage de ~texte" ;
        Text [ dutch ] = "~Tekstbereik" ;
        Text [ portuguese ] = "~Área de texto" ;
        Text[ chinese_simplified ] = "ÎÄ×ÖÇøÓò(~X)";
        Text[ russian ] = "Îáëàñòü òåêñòà";
        Text[ polish ] = "Obszar tekstu";
        Text[ japanese ] = "•¶‘”͈Í(~X)";
        Text[ chinese_traditional ] = "¤å¦r°Ï°ì(~X)";
        Text[ arabic ] = "äØÇÞ ÇáäÕ";
        Text[ greek ] = "Ðåäßï êåéìÝíïõ";
        Text[ korean ] = "¹Ù´Ú±Û ±âÈ£(~X)";
        Text[ turkish ] = "Metin a~laný";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_ANCHR_CHARFMT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 186 , 56 ) ;
        Size = MAP_APPFONT ( 65 , 54 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        Sort = TRUE ;
    };
    FixedText FT_TEXT_CHARFMT
    {
        Pos = MAP_APPFONT ( 129 , 73 ) ;
        Size = MAP_APPFONT ( 55 , 8 ) ;
        Text = "~Fußnotenbereich" ;
        Text [ ENGLISH ] = "~Footnote text" ;
        Left = TRUE ;
        Text [ english_us ] = "~Footnote area" ;
        Text [ portuguese_brazilian ] = "~Fußnotensymbol" ;
        Text [ swedish ] = "Fotnotsområde" ;
        Text [ danish ] = "Fodnoteområde" ;
        Text [ italian ] = "Area note a piè pagina" ;
        Text [ spanish ] = "Área de ~nota al pie" ;
        Text [ french ] = "Plage de la ~note" ;
        Text [ dutch ] = "Voetnoot~bereik" ;
        Text [ portuguese ] = "Á~rea de nota de rodapé" ;
        Text[ chinese_simplified ] = "×¢½ÅÇøÓò(~F)";
        Text[ russian ] = "Îáëàñòü ñíîñêè";
        Text[ polish ] = "Obszar przyp. doln.";
        Text[ japanese ] = "‹r’”͈Í(~F)";
        Text[ chinese_traditional ] = "µù¸}°Ï°ì(~F)";
        Text[ arabic ] = "äØÇÞ ÇáÍÇÔíÉ ÇáÓÝáíÉ";
        Text[ greek ] = "Ðåäßï õðïóçìåéþóåùí";
        Text[ korean ] = "°¢ÁÖ ¿µ¿ª(~F)";
        Text[ turkish ] = "D~ipnot alaný";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_TEXT_CHARFMT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 186 , 71 ) ;
        Size = MAP_APPFONT ( 65 , 54 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        Sort = TRUE ;
    };
    GroupBox GB_POS
    {
        Pos = MAP_APPFONT ( 6 , 91 ) ;
        Size = MAP_APPFONT ( 71 , 42 ) ;
        Text = "Position" ;
        Text [ English ] = "Position" ;
        Group = TRUE ;
        Text [ english_us ] = "Position" ;
        Text [ portuguese_brazilian ] = "Position" ;
        Text [ swedish ] = "Position" ;
        Text [ danish ] = "Placering" ;
        Text [ italian ] = "Posizione" ;
        Text [ spanish ] = "Posición" ;
        Text [ french ] = "Position" ;
        Text [ dutch ] = "Positie" ;
        Text [ portuguese ] = "Posição" ;
        Text[ chinese_simplified ] = "λÖÃ";
        Text[ russian ] = "Ïîçèöèÿ";
        Text[ polish ] = "Pozycja";
        Text[ japanese ] = "ˆÊ’u";
        Text[ chinese_traditional ] = "¦ì¸m";
        Text[ arabic ] = "ÇáãæÖÚ";
        Text[ greek ] = "ÈÝóç";
        Text[ korean ] = "À§Ä¡";
        Text[ turkish ] = "Konum";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_POS_PAGE
    {
        Pos = MAP_APPFONT ( 12 , 104 ) ;
        Size = MAP_APPFONT ( 60 , 10 ) ;
        Text = "Seiten~ende" ;
        Text [ ENGLISH ] = "End of ~page" ;
        Text [ norwegian ] = "End of ~page" ;
        Text [ italian ] = "Fine ~pagina" ;
        Text [ portuguese_brazilian ] = "Final de ~página" ;
        Text [ portuguese ] = "Fim de ~página" ;
        Text [ finnish ] = "~Sivun loppu" ;
        Text [ danish ] = "Sidens slutning" ;
        Text [ french ] = "Fin de ~page" ;
        Text [ swedish ] = "S~idslut" ;
        Text [ dutch ] = "Pag~ina-einde" ;
        Text [ spanish ] = "Fin de ~página" ;
        Text [ english_us ] = "~End of page" ;
        TabStop = TRUE ;
        Group = TRUE ;
        Text[ chinese_simplified ] = "ҳβ(~O)";
        Text[ russian ] = "Êîíåö ñòðàíèöû";
        Text[ polish ] = "Koniec strony";
        Text[ japanese ] = "Íß°¼Þ––(~O)";
        Text[ chinese_traditional ] = "­¶§À(~O)";
        Text[ arabic ] = "äåÇíÉ ÇáÕÝÍÉ";
        Text[ greek ] = "ÔÝëïò óåëßäáò";
        Text[ korean ] = "ÆäÀÌÁö ¸¶Áö¸·(~E)";
        Text[ turkish ] = "Sayfa so~nu";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_POS_CHAPTER
    {
        Pos = MAP_APPFONT ( 12 , 118 ) ;
        Size = MAP_APPFONT ( 60 , 10 ) ;
        Text = "Do~kumentende" ;
        Text [ ENGLISH ] = "End of ~doc." ;
        Text [ norwegian ] = "Slutt på ~dok." ;
        Text [ italian ] = "Fine ~documento" ;
        Text [ portuguese_brazilian ] = "Final de~doc." ;
        Text [ portuguese ] = "Fim do ~documento" ;
        Text [ finnish ] = "~Asiakirjan loppu" ;
        Text [ danish ] = "Dokumentets slutn." ;
        Text [ french ] = "Fin de ~document" ;
        Text [ swedish ] = "Do~kumentslut" ;
        Text [ dutch ] = "~Documenteinde" ;
        Text [ spanish ] = "F~in del documento" ;
        Text [ english_us ] = "En~d of document" ;
        Text[ chinese_simplified ] = "ÎĵµÎ²¶Ë(~D)";
        Text[ russian ] = "Êîíåö äîêóìåíòà";
        Text[ polish ] = "Koniec dokumentu";
        Text[ japanese ] = "•¶‘––(~D)";
        Text[ chinese_traditional ] = "¤å¥ó§ÀºÝ(~D)";
        Text[ arabic ] = "äåÇíÉ ÇáãÓÊäÏ";
        Text[ greek ] = "ÔÝëïò êåéìÝíïõ";
        Text[ korean ] = "¹®¼­ ¸¶Áö¸·(~D)";
        Text[ turkish ] = "~Belge sonunda";
        Text[ language_user1 ] = " ";
    };
    GroupBox GB_CONT
    {
        Pos = MAP_APPFONT ( 80 , 91 ) ;
        Size = MAP_APPFONT ( 174 , 42 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? Hinweistext mehrseitige Fußnoten : Hinweistext mehrseitige Fu˜noten */
        Text = "Hinweistext mehrseitige Fußnoten" ;
        Text [ ENGLISH ] = "Continuation notice" ;
        Text [ norwegian ] = "+++Continuation notice" ;
        Text [ italian ] = "Avvertenza che la nota continua" ;
        Text [ portuguese_brazilian ] = "Aviso de continuação" ;
        Text [ portuguese ] = "Continuação das notas de rodapé" ;
        Text [ finnish ] = "Jatkumisilmoitus" ;
        Text [ danish ] = "Henvisningstekst for flersidede fodnoter" ;
        Text [ french ] = "Indication de suite" ;
        Text [ swedish ] = "Meddelandetext för mersidiga fotnoter" ;
        Text [ dutch ] = "Verwijstekst bij voetnoten verdeeld over meer dan een pagina" ;
        Text [ spanish ] = "Indicación para notas al pie en varias páginas" ;
        Text [ english_us ] = "Continuation notice" ;
        Text[ chinese_simplified ] = "¶àÒ³×¢½ÅµÄÌáʾÎÄ";
        Text[ russian ] = "Óêàçàòåëüíûé òåêñò äëÿ ñíîñîê íà íåñêîëüêèõ ñòðàíèöàõ";
        Text[ polish ] = "Tekst wskazuj¹cy na kilkustronne przypisy dolne.";
        Text[ japanese ] = "‹r’‚ªŽŸÍß°¼Þ‚É‘±‚­Û‚Ì’ˆÓ‘‚«";
        Text[ chinese_traditional ] = "¦h­¶µù¸}ªº´£¥Ü¤å";
        Text[ arabic ] = "ãáÇÍÙÉ Úáì Ôßá ÍæÇÔí ÓÝáíÉ Ýí ÃßËÑ ãä ÕÝÍÉ";
        Text[ greek ] = "Êåßìåíï õðüäåéîçò óõíÝ÷éóçò õðïóçìåéþóåùí";
        Text[ korean ] = "¿©·¯ ÆäÀÌÁöÀÇ ¹Ù´Ú±Û¿¡ ´ëÇÑ Âü°í";
        Text[ turkish ] = "Devam eden dipnotu ile ilgili bilgi metni";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_CONT
    {
        Pos = MAP_APPFONT ( 86 , 103 ) ;
        Size = MAP_APPFONT ( 58 , 8 ) ;
        Text = "Am Fußn~otenende" ;
        Text [ ENGLISH ] = "~Continued" ;
        Text [ norwegian ] = "~Fortsetter" ;
        Text [ italian ] = "Alla fine del piè pagina" ;
        Text [ portuguese_brazilian ] = "~Continuado" ;
        Text [ portuguese ] = "No fim da nota de ~rodapé" ;
        Text [ finnish ] = "~Jatkuu" ;
        Text [ danish ] = "Ved fodnotens slutning" ;
        Text [ french ] = "En ~fin de note de bas de page" ;
        Text [ swedish ] = "Vid slutet av f~otnoten" ;
        Text [ dutch ] = "~Voetnooteinde" ;
        Text [ spanish ] = "Final de n~ota al pie" ;
        Text [ english_us ] = "End ~of footnote" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "×¢½Åβ¶Ë(~O)";
        Text[ russian ] = "Â êîíöå ñíîñêè";
        Text[ polish ] = "Na koncu przypisów dolnych";
        Text[ japanese ] = "‹r’––(~O)";
        Text[ chinese_traditional ] = "¦bª`¸}¥½(~N)";
        Text[ arabic ] = "ÚäÏ äåÇíÉ ÇáÍÇÔíÉ ÇáÓÝáíÉ";
        Text[ greek ] = "Óôï ôÝëïò ôçò õð~ïóçìåßùóçò";
        Text[ korean ] = "´ÙÀ½ ÆäÀÌÁö(~N)";
        Text[ turkish ] = "~Dipnot altýnda";
        Text[ language_user1 ] = " ";
    };
    Edit ED_CONT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 147 , 101 ) ;
        Size = MAP_APPFONT ( 104 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        MaxTextLength = 30 ;
    };
    FixedText FT_CONT_FROM
    {
        Pos = MAP_APPFONT ( 86 , 118 ) ;
        Size = MAP_APPFONT ( 58 , 8 ) ;
        Text = "A~uf Folgeseite" ;
        Text [ ENGLISH ] = "~Started" ;
        Text [ norwegian ] = "~Startet" ;
        Text [ italian ] = "Alla pagina succ." ;
        Text [ portuguese_brazilian ] = "~Iniciado" ;
        Text [ portuguese ] = "~Página seguinte" ;
        Text [ finnish ] = "~Alkaa" ;
        Text [ danish ] = "På følgesiden" ;
        Text [ french ] = "~Sur la page suivante" ;
        Text [ swedish ] = "~På följande sida" ;
        Text [ dutch ] = "V~olgende pagina" ;
        Text [ spanish ] = "En pág. sig~uiente" ;
        Text [ english_us ] = "~Start of next page" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "ÐøÒ³(~S)";
        Text[ russian ] = "Íà ñëåäóþùåé ñòðàíèöå";
        Text[ polish ] = "Na nastepnej stronie";
        Text[ japanese ] = "ŽŸ‚ÌÍß°¼Þ(~S)";
        Text[ language_user1 ] = " ";
        Text[ chinese_traditional ] = "±qÄò­¶¶}©l(~S)";
        Text[ arabic ] = "Úáì ÇáÕÝÍÉ ÇáÊÇáíÉ";
        Text[ greek ] = "Óôçí å~ðüìåíç óåëßäá";
        Text[ korean ] = "½ÃÀÛ(~S)";
        Text[ turkish ] = "~Sonraki sayfada";
    };
    Edit ED_CONT_FROM
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 147 , 116 ) ;
        Size = MAP_APPFONT ( 104 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        MaxTextLength = 30 ;
    };
};
TabPage TP_ENDNOTEOPTION
{
    SVLook = TRUE ;
    Hide = TRUE;
    HelpID = HID_ENDNOTE_OPTIONS ;
    Pos = MAP_APPFONT ( 0 , 0 ) ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    GroupBox GB_NUM
    {
        Pos = MAP_APPFONT ( 6 , 2 ) ;
        Size = MAP_APPFONT ( 248 , 42 ) ;
        Text = "Automatische Nummerierung" ;
        Text [ ENGLISH ] = "Automatic numbering" ;
        Text [ norwegian ] = "Auto. nummerering" ;
        Text [ italian ] = "Numerazione automatica" ;
        Text [ portuguese_brazilian ] = "Numeração automática" ;
        Text [ portuguese ] = "Numeração automática" ;
        Text [ finnish ] = "Automaattinumerointi" ;
        Text [ danish ] = "Automatisk nummerering" ;
        Text [ french ] = "Numérotation automatique" ;
        Text [ swedish ] = "Automatisk numrering" ;
        Text [ dutch ] = "Automatische nummering" ;
        Text [ spanish ] = "Numeración automática" ;
        Text [ english_us ] = "AutoNumbering" ;
        Group = TRUE ;
        Text[ chinese_simplified ] = "×Ô¶¯±àºÅ";
        Text[ russian ] = "Àâòîìàòè÷åñêàÿ íóìåðàöèÿ";
        Text[ polish ] = "Automatyczna numeracja";
        Text[ japanese ] = "Ž©“®”ԍ†•t‚¯";
        Text[ chinese_traditional ] = "¦Û°Ê½s¸¹";
        Text[ arabic ] = "ÊÑÞíã ÊáÞÇÆí";
        Text[ greek ] = "Áõôüìáôç áñßèìçóç";
        Text[ korean ] = "ÀÚµ¿ ¹øÈ£ ¸Å±â±â";
        Text[ turkish ] = "Otomatik numaralama";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_NUMVIEW
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 12 , 12 ) ;
        Size = MAP_APPFONT ( 62 , 50 ) ;
        TabStop = TRUE ;
        Group = TRUE ;
        DropDown = TRUE ;
        CurPos = 0 ;
        StringList =
        {
            "A, B, C" ;
            "a, b, c" ;
            "I, II, III" ;
            "i, ii, iii" ;
            "1, 2, 3" ;
            "A, .., AA, .., AAA" ;
            "a, .., aa, .., aaa" ;
        };
    };
    FixedText FT_OFFSET
    {
        Pos = MAP_APPFONT ( 82 , 14 ) ;
        Size = MAP_APPFONT ( 36 , 8 ) ;
        Text = "Be~ginn bei" ;
        Text [ ENGLISH ] = "~Start at" ;
        Left = TRUE ;
        Text [ english_us ] = "~Start at" ;
        Text [ italian ] = "Ini~zia con" ;
        Text [ spanish ] = "Comen~zar en" ;
        Text [ french ] = "À partir de" ;
        Text [ dutch ] = "~Begin met" ;
        Text [ swedish ] = "~Börja vid" ;
        Text [ danish ] = "Begynd med" ;
        Text [ portuguese_brazilian ] = "Be~ginn bei" ;
        Text [ portuguese ] = "~Iniciar em" ;
        Text[ chinese_simplified ] = "¿ªÊ¼´Ó(~S)";
        Text[ russian ] = "Íà÷àòü ñ";
        Text[ polish ] = "Zacznij od";
        Text[ japanese ] = "ŠJŽn•¶––‹r’”ԍ†(~S)";
        Text[ chinese_traditional ] = "¶}©l±q(~S)";
        Text[ arabic ] = "ÇáÈÏÁ ÈÜ";
        Text[ greek ] = "ÈÝóç åêêßíçóçò";
        Text[ korean ] = "½ÃÀÛ(~S)";
        Text[ turkish ] = "B~aþlangýç";
        Text[ language_user1 ] = " ";
    };
    NumericField FLD_OFFSET
    {
        Pos = MAP_APPFONT ( 133 , 12 ) ;
        Size = MAP_APPFONT ( 30 , 12 ) ;
        Spin = TRUE ;
        Minimum = 1 ;
        First = 1 ;
        Last = 9999 ;
        Maximum = 9999 ;
        TabStop = TRUE ;
        Border = TRUE ;
    };
    ListBox LB_NUMCOUNT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 12 , 27 ) ;
        Size = MAP_APPFONT ( 62 , 50 ) ;
        TabStop = TRUE ;
        Group = TRUE ;
        DropDown = TRUE ;
        CurPos = 0 ;
        StringList =
        {
            < "Pro Seite" ; > ;
            < "Pro Kapitel" ; > ;
            < "Pro Dokument" ; > ;
        };
        StringList [ ENGLISH ] =
        {
            < "Pro Seite" ; > ;
            < "Pro Kapitel" ; > ;
            < "Pro Dokument" ; > ;
        };
        StringList [ norwegian ] =
        {
            < "Pro Seite" ; > ;
            < "Pro Kapitel" ; > ;
            < "Pro Dokument" ; > ;
        };
        StringList [ italian ] =
        {
            < "Per pagina" ; > ;
            < "Per capitolo" ; > ;
            < "Per documento" ; > ;
        };
        StringList [ portuguese_brazilian ] =
        {
            < "Por página" ; > ;
            < "Por capítulo" ; > ;
            < "Por documento" ; > ;
        };
        StringList [ portuguese ] =
        {
            < "Por página" ; > ;
            < "Por capítulo" ; > ;
            < "Por documento" ; > ;
        };
        StringList [ finnish ] =
        {
            < "Pro Seite" ; > ;
            < "Pro Kapitel" ; > ;
            < "Pro Dokument" ; > ;
        };
        StringList [ danish ] =
        {
            < "Per side" ; > ;
            < "Per kapitel" ; > ;
            < "Per dokument" ; > ;
        };
        StringList [ french ] =
        {
            < "Par page" ; > ;
            < "Par chapitre" ; > ;
            < "Par document" ; > ;
        };
        StringList [ swedish ] =
        {
            < "Per sida" ; > ;
            < "Per kapitel" ; > ;
            < "Per dokument" ; > ;
        };
        StringList [ dutch ] =
        {
            < "Per pagina" ; > ;
            < "Per hoofdstuk" ; > ;
            < "Per document" ; > ;
        };
        StringList [ spanish ] =
        {
            < "Por página" ; > ;
            < "Por capítulo" ; > ;
            < "Por documento" ; > ;
        };
        StringList [ english_us ] =
        {
            < "Per page" ; > ;
            < "Per chapter" ; > ;
            < "Per document" ; > ;
        };
    StringList [ chinese_simplified ] =
    {
            < "ÿҳ" ; > ;
        < "ÿÕÂ" ; > ;
        < "ÿ¸öÎĵµ" ; > ;
    };
    StringList [ russian ] =
    {
            < "Íà îäíó ñòðàíèöó" ; > ;
        < "Íà îäíó ãëàâó" ; > ;
        < "Íà îäèí äîêóìåíò" ; > ;
    };
    StringList [ polish ] =
    {
            < "Na stronê" ; > ;
        < "Na rozdzia³" ; > ;
        < "Na dokument" ; > ;
    };
    StringList [ japanese ] =
    {
            < "Íß°¼Þ‚²‚Æ" ; > ;
        < "Í‚²‚Æ" ; > ;
        < "•¶‘‚²‚Æ" ; > ;
    };
    StringList [ chinese_traditional ] =
    {
            < "¨C­¶" ; > ;
        < "¨C³¹" ; > ;
        < "¨C­Ó¤å¥ó" ; > ;
    };
    StringList [ arabic ] =
    {
            < "Ýí ÇáÕÝÍÉ" ; > ;
        < "Ýí ÇáÝÕá" ; > ;
        < "Ýí ÇáãÓÊäÏ" ; > ;
    };
    StringList [ greek ] =
    {
            < "ÁíÜ óåëßäá" ; > ;
        < "ÁíÜ êåöÜëáéï" ; > ;
        < "ÁíÜ Ýããñáöï" ; > ;
    };
    StringList [ korean ] =
    {
            < "ÆäÀÌÁö ´ç" ; > ;
        < "Àå ¸¶´Ù" ; > ;
        < "¹®¼­ ´ç" ; > ;
    };
    StringList [ turkish ] =
    {
            < "Beher sayfa" ; > ;
        < "Beher bölüm" ; > ;
        < "Beher belge" ; > ;
    };
    StringList [ language_user1 ] =
    {
            < " " ; > ;
        < " " ; > ;
        < " " ; > ;
    };
    };
    FixedText FT_PREFIX
    {
        Pos = MAP_APPFONT ( 82 , 27 ) ;
        Size = MAP_APPFONT ( 30 , 10 ) ;
        Text = "~Davor" ;
        Text [ ENGLISH ] = "Before" ;
        Text [ norwegian ] = "Før" ;
        Text [ italian ] = "~Davanti" ;
        Text [ portuguese_brazilian ] = "Antes" ;
        Text [ portuguese ] = "An~tes" ;
        Text [ finnish ] = "Edellä" ;
        Text [ danish ] = "Før" ;
        Text [ french ] = "Avant" ;
        Text [ swedish ] = "~Före" ;
        Text [ dutch ] = "~Ervoor" ;
        Text [ spanish ] = "~Delante" ;
        Text [ english_us ] = "Be~fore" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "֮ǰ(~F)";
        Text[ russian ] = "Äî";
        Text[ polish ] = "Przed";
        Text[ japanese ] = "”ԍ†‘O(~F)";
        Text[ chinese_traditional ] = "¤§«e(~F)";
        Text[ arabic ] = "ÞÈá";
        Text[ greek ] = "Ðñéí áðü";
        Text[ korean ] = "ÀÌÀü(~F)";
        Text[ turkish ] = "Ba~þýnda";
        Text[ language_user1 ] = " ";
    };
    Edit ED_PREFIX
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 133 , 27 ) ;
        Size = MAP_APPFONT ( 30 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        MaxTextLength = 50 ;
    };
    FixedText FT_SUFFIX
    {
        Pos = MAP_APPFONT ( 166 , 27 ) ;
        Size = MAP_APPFONT ( 30 , 10 ) ;
        Text = "Dahin~ter" ;
        Text [ ENGLISH ] = "Behind" ;
        Text [ norwegian ] = "Bak" ;
        Text [ italian ] = "Die~tro" ;
        Text [ portuguese_brazilian ] = "Atrás" ;
        Text [ portuguese ] = "A~trás" ;
        Text [ finnish ] = "Jäljessä" ;
        Text [ danish ] = "Efter" ;
        Text [ french ] = "Après" ;
        Text [ swedish ] = "~Bakom" ;
        Text [ dutch ] = "E~rachter" ;
        Text [ spanish ] = "D~etrás" ;
        Text [ english_us ] = "Aft~er" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "Ö®ºó(~E)";
        Text[ russian ] = "Ïîñëå";
        Text[ polish ] = "Za";
        Text[ japanese ] = "”ԍ†Œã(~E)";
        Text[ chinese_traditional ] = "¤§«á(~E)";
        Text[ arabic ] = "ÈÚÏ";
        Text[ greek ] = "Ðßóù áðü";
        Text[ korean ] = "ÀÌÈÄ(~E)";
        Text[ turkish ] = "A~rkasýnda";
        Text[ language_user1 ] = " ";
    };
    Edit ED_SUFFIX
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 221 , 27 ) ;
        Size = MAP_APPFONT ( 30 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        MaxTextLength = 50 ;
    };
    GroupBox GB_TEMPL
    {
        Pos = MAP_APPFONT ( 6 , 46 ) ;
        Size = MAP_APPFONT ( 115 , 42 ) ;
        Text = "Vorlagen" ;
        Text [ ENGLISH ] = "Styles" ;
        Text [ norwegian ] = "Styles" ;
        Text [ italian ] = "Modelli" ;
        Text [ portuguese_brazilian ] = "Estilos" ;
        Text [ portuguese ] = "Estilos" ;
        Text [ finnish ] = "Tyylit" ;
        Text [ danish ] = "Typografi" ;
        Text [ french ] = "Styles" ;
        Text [ swedish ] = "Formatmallar" ;
        Text [ dutch ] = "Opmaakprofielen" ;
        Text [ spanish ] = "Estilos" ;
        Text [ english_us ] = "Styles" ;
        Text[ chinese_simplified ] = "Ñùʽ";
        Text[ russian ] = "Ñòèëè";
        Text[ polish ] = "Szablony";
        Text[ japanese ] = "½À²Ù";
        Text[ chinese_traditional ] = "¼Ë¦¡";
        Text[ arabic ] = "ÃäãÇØ";
        Text[ greek ] = "Ðñüôõðá";
        Text[ korean ] = "À¯Çü";
        Text[ turkish ] = "Biçim";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_PARA_TEMPL
    {
        Pos = MAP_APPFONT ( 12 , 58 ) ;
        Size = MAP_APPFONT ( 38 , 8 ) ;
        Text = "~Absatz" ;
        Text [ ENGLISH ] = "~Paragraph" ;
        Text [ norwegian ] = "~Paragraf" ;
        Text [ italian ] = "~Paragrafo" ;
        Text [ portuguese_brazilian ] = "~Parágrafo" ;
        Text [ portuguese ] = "~Parágrafo" ;
        Text [ finnish ] = "~Kappale" ;
        Text [ danish ] = "Afsnit" ;
        Text [ french ] = "~Paragraphe" ;
        Text [ swedish ] = "Sty~cke" ;
        Text [ dutch ] = "~Alinea" ;
        Text [ spanish ] = "Párra~fo" ;
        Text [ english_us ] = "Pa~ragraph" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "¶ÎÂä(~R)";
        Text[ russian ] = "Àáçàö";
        Text[ polish ] = "Akapit";
        Text[ japanese ] = "’i—Ž(~R)";
        Text[ chinese_traditional ] = "¬q¸¨(~R)";
        Text[ arabic ] = "ÝÞÑÉ";
        Text[ greek ] = "ÐáñÜãñáöïò";
        Text[ korean ] = "´Ü¶ô(~R)";
        Text[ turkish ] = "~Paragraf";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_PARA_TEMPL
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 51 , 56 ) ;
        Size = MAP_APPFONT ( 67 , 54 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        CurPos = 0 ;
        Sort = TRUE ;
    };
    FixedText FT_PAGE_TEMPL
    {
        Pos = MAP_APPFONT ( 12 , 73 ) ;
        Size = MAP_APPFONT ( 38 , 8 ) ;
        Text = "~Seite" ;
        Text [ ENGLISH ] = "~Page" ;
        Text [ norwegian ] = "~Page" ;
        Text [ italian ] = "~Pagina" ;
        Text [ portuguese_brazilian ] = "~Página" ;
        Text [ portuguese ] = "~Página" ;
        Text [ finnish ] = "~Sivu" ;
        Text [ danish ] = "Side" ;
        Text [ french ] = "P~age" ;
        Text [ swedish ] = "~Sida" ;
        Text [ dutch ] = "~Pagina" ;
        Text [ spanish ] = "Pá~gina" ;
        Text [ english_us ] = "~Page" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "ҳ(~P)";
        Text[ russian ] = "Ñòðàíèöà";
        Text[ polish ] = "Strona";
        Text[ japanese ] = "Íß°¼Þ(~P)";
        Text[ chinese_traditional ] = "­¶(~P)";
        Text[ arabic ] = "ÇáÕÝÍÉ";
        Text[ greek ] = "Óåëßäá";
        Text[ korean ] = "ÆäÀÌÁö(~P)";
        Text[ turkish ] = "~Sayfa";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_PAGE_TEMPL
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 51 , 71 ) ;
        Size = MAP_APPFONT ( 67 , 54 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
    };
    GroupBox GB_CHAR_TEMPL
    {
        Pos = MAP_APPFONT ( 125 , 46 ) ;
        Size = MAP_APPFONT ( 129 , 42 ) ;
        Text = "Zeichenvorlagen" ;
        Text [ ENGLISH ] = "Character styles" ;
        Text[ english_us ] = "Character Styles";
        Text[ portuguese ] = "Estilos de caracteres";
        Text[ russian ] = "Ñòèëè çíàêîâ";
        Text[ greek ] = "Óôõë ÷áñáêôÞñùí";
        Text[ dutch ] = "Tekenopmaakprofielen";
        Text[ french ] = "Styles de caractère";
        Text[ spanish ] = "Estilos de carácter";
        Text[ italian ] = "Modelli di carattere";
        Text[ danish ] = "Tegntypografi";
        Text[ swedish ] = "Teckenformatmallar";
        Text[ polish ] = "Style znaku";
        Text[ portuguese_brazilian ] = "Character styles";
        Text[ japanese ] = "•¶Žš½À²Ù";
        Text[ korean ] = "¹®ÀÚ À¯Çü";
        Text[ chinese_simplified ] = "×Ö·ûÑùʽ";
        Text[ chinese_traditional ] = "¦r¤¸¼Ë¦¡";
        Text[ arabic ] = "ÃäãÇØ ÃÍÑÝ";
        Text[ turkish ] = "Karakter biçimi";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_ANCHR_CHARFMT
    {
        Pos = MAP_APPFONT ( 129 , 58 ) ;
        Size = MAP_APPFONT ( 55 , 8 ) ;
        Text = "Te~xtbereich" ;
        Text [ ENGLISH ] = "Text" ;
        Left = TRUE ;
        Text [ english_us ] = "Te~xt area" ;
        Text [ portuguese_brazilian ] = "~Endnotensymbol" ;
        Text [ swedish ] = "Textområde" ;
        Text [ danish ] = "Tekstområde" ;
        Text [ italian ] = "Area del testo" ;
        Text [ spanish ] = "Área de ~texto" ;
        Text [ french ] = "Plage de ~texte" ;
        Text [ dutch ] = "~Eindemarkeringsbereik" ;
        Text [ portuguese ] = "Área de te~xto" ;
        Text[ chinese_simplified ] = "ÎÄ×ÖÇøÓò(~X)";
        Text[ russian ] = "Îáëàñòü òåêñòà";
        Text[ polish ] = "Obszar tekstu";
        Text[ japanese ] = "•¶‘”͈Í(~X)";
        Text[ chinese_traditional ] = "¤å¦r°Ï°ì(~X)";
        Text[ arabic ] = "äØÇÞ ÇáäÕ";
        Text[ greek ] = "Ðåäßï êåéìÝíïõ";
        Text[ korean ] = "ÅØ½ºÆ® ¿µ¿ª(~X)";
        Text[ turkish ] = "Metin ~alaný";
    };
    ListBox LB_ANCHR_CHARFMT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 186 , 56 ) ;
        Size = MAP_APPFONT ( 65 , 54 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        Sort = TRUE ;
    };
    FixedText FT_TEXT_CHARFMT
    {
        Pos = MAP_APPFONT ( 129 , 73 ) ;
        Size = MAP_APPFONT ( 55 , 8 ) ;
        Text = "E~ndnotenbereich" ;
        Text [ ENGLISH ] = "Endnote text" ;
        Left = TRUE ;
        Text [ english_us ] = "~Endnote area" ;
        Text [ portuguese_brazilian ] = "~Endnotensymbol" ;
        Text [ swedish ] = "Slutnotsområde" ;
        Text [ danish ] = "Slutnoteområde" ;
        Text [ italian ] = "Area note di chiusura" ;
        Text [ spanish ] = "Área de n~ota al final" ;
        Text [ french ] = "Plage de la ~note" ;
        Text [ dutch ] = "~Eindnotenbereik" ;
        Text [ portuguese ] = "Área de ~nota final" ;
        Text[ chinese_simplified ] = "Î²×¢ÇøÓò(~E)";
        Text[ russian ] = "Îáëàñòü êîíöåâîé ñíîñêè";
        Text[ polish ] = "Obszar przyp. koñc.";
        Text[ japanese ] = "•¶––‹r’”͈Í(~E)";
        Text[ chinese_traditional ] = "§Àª`°Ï°ì(~E)";
        Text[ arabic ] = "äØÇÞ ÇáÊÚáíÞ ÇáÎÊÇãí";
        Text[ greek ] = "Ðåñéï÷Þ óçìåßùóçò ôÝëïõò";
        Text[ korean ] = "¹ÌÁÖ ±âÈ£(~E)";
        Text[ turkish ] = "S~onnot alaný";
    };
    ListBox LB_TEXT_CHARFMT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 186 , 71 ) ;
        Size = MAP_APPFONT ( 65 , 54 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        Sort = TRUE ;
    };
    GroupBox GB_POS
    {
        Pos = MAP_APPFONT ( 6 , 91 ) ;
        Size = MAP_APPFONT ( 71 , 42 ) ;
        Text = "Position" ;
        Text [ English ] = "Position" ;
        Group = TRUE ;
        Text [ english_us ] = "Position" ;
        Text [ portuguese_brazilian ] = "Position" ;
        Text [ swedish ] = "Position" ;
        Text [ danish ] = "Placering" ;
        Text [ italian ] = "Posizione" ;
        Text [ spanish ] = "Posición" ;
        Text [ french ] = "Position" ;
        Text [ dutch ] = "Positie" ;
        Text [ portuguese ] = "Posição" ;
        Text[ chinese_simplified ] = "λÖÃ";
        Text[ russian ] = "Ïîçèöèÿ";
        Text[ polish ] = "Pozycja";
        Text[ japanese ] = "ˆÊ’u";
        Text[ chinese_traditional ] = "¦ì¸m";
        Text[ arabic ] = "ÇáãæÖÚ";
        Text[ greek ] = "ÈÝóç";
        Text[ korean ] = "À§Ä¡";
        Text[ turkish ] = "Konum";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_POS_PAGE
    {
        Pos = MAP_APPFONT ( 12 , 104 ) ;
        Size = MAP_APPFONT ( 60 , 10 ) ;
        Text = "Seiten~ende" ;
        Text [ ENGLISH ] = "End of ~page" ;
        Text [ norwegian ] = "End of ~page" ;
        Text [ italian ] = "Fine ~pagina" ;
        Text [ portuguese_brazilian ] = "Final de ~página" ;
        Text [ portuguese ] = "Fim de ~página" ;
        Text [ finnish ] = "~Sivun loppu" ;
        Text [ danish ] = "Sidens slutning" ;
        Text [ french ] = "Fin de ~page" ;
        Text [ swedish ] = "~Sidslut" ;
        Text [ dutch ] = "Pag~ina-einde" ;
        Text [ spanish ] = "Fin de ~página" ;
        Text [ english_us ] = "End ~of page" ;
        TabStop = TRUE ;
        Group = TRUE ;
        Text[ chinese_simplified ] = "ҳβ(~O)";
        Text[ russian ] = "Êîíåö ñòðàíèöû";
        Text[ polish ] = "Koniec strony";
        Text[ japanese ] = "Íß°¼Þ––(~O)";
        Text[ chinese_traditional ] = "­¶§À(~O)";
        Text[ arabic ] = "äåÇíÉ ÇáÕÝÍÉ";
        Text[ greek ] = "ÔÝëïò óåëßäáò";
        Text[ korean ] = "ÆäÀÌÁö ¸¶Áö¸·(~O)";
        Text[ turkish ] = "Sayfa so~nu";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_POS_CHAPTER
    {
        Pos = MAP_APPFONT ( 12 , 118 ) ;
        Size = MAP_APPFONT ( 60 , 10 ) ;
        Text = "~Dokumentende" ;
        Text [ ENGLISH ] = "End of ~doc." ;
        Text [ norwegian ] = "Slutt på ~dok." ;
        Text [ italian ] = "Fine ~documento" ;
        Text [ portuguese_brazilian ] = "Final de~doc." ;
        Text [ portuguese ] = "Fim do ~documento" ;
        Text [ finnish ] = "~Asiakirjan loppu" ;
        Text [ danish ] = "Dokumentets slutn." ;
        Text [ french ] = "Fin de ~document" ;
        Text [ swedish ] = "~Dokumentslut" ;
        Text [ dutch ] = "~Documenteinde" ;
        Text [ spanish ] = "Fin del ~documento" ;
        Text [ english_us ] = "End of ~document" ;
        Text[ chinese_simplified ] = "ÎĵµÎ²¶Ë(~D)";
        Text[ russian ] = "Êîíåö äîêóìåíòà";
        Text[ polish ] = "Koniec dokumentu";
        Text[ japanese ] = "•¶‘––(~D)";
        Text[ chinese_traditional ] = "¤å¥ó§ÀºÝ(~D)";
        Text[ arabic ] = "äåÇíÉ ÇáãÓÊäÏ";
        Text[ greek ] = "ÔÝëïò êåéìÝíïõ";
        Text[ korean ] = "¹®¼­ ³¡(~D)";
        Text[ turkish ] = "~Belge sonunda";
        Text[ language_user1 ] = " ";
    };
    GroupBox GB_CONT
    {
        Pos = MAP_APPFONT ( 80 , 91 ) ;
        Size = MAP_APPFONT ( 174 , 42 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? Hinweistext mehrseitige Fußnoten : Hinweistext mehrseitige Fu˜noten */
        Text = "Hinweistext mehrseitige Fußnoten" ;
        Text [ ENGLISH ] = "Continuation notice" ;
        Text [ norwegian ] = "+++Continuation notice" ;
        Text [ italian ] = "Avvertenza che la nota continua" ;
        Text [ portuguese_brazilian ] = "Aviso de continuação" ;
        Text [ portuguese ] = "Continuação das notas de rodapé" ;
        Text [ finnish ] = "Jatkumisilmoitus" ;
        Text [ danish ] = "Henvisningstekst for flersidede fodnoter" ;
        Text [ french ] = "Indication de suite" ;
        Text [ swedish ] = "Meddelandetext för mersidiga fotnoter" ;
        Text [ dutch ] = "Verwijstekst bij voetnoten verdeeld over meer dan een pagina" ;
        Text [ spanish ] = "Indicación para notas al pie en varias páginas" ;
        Text [ english_us ] = "Continuation notice" ;
        Text[ chinese_simplified ] = "¶àÒ³×¢½ÅµÄÌáʾÎÄ";
        Text[ russian ] = "Óêàçàòåëüíûé òåêñò äëÿ ñíîñîê íà íåñêîëüêèõ ñòðàíèöàõ";
        Text[ polish ] = "Tekst wskazuj¹cy na kilkustronne przypisy dolne.";
        Text[ japanese ] = "‹r’‚ªŽŸÍß°¼Þ‚É‘±‚­Û‚Ì’ˆÓ‘‚«";
        Text[ chinese_traditional ] = "¦h­¶µù¸}ªº´£¥Ü¤å";
        Text[ arabic ] = "ãáÇÍÙÉ Úáì Ôßá ÍæÇÔí ÓÝáíÉ Ýí ÃßËÑ ãä ÕÝÍÉ";
        Text[ greek ] = "Êåßìåíï õðüäåéîçò óõíÝ÷éóçò õðïóçìåéþóåùí";
        Text[ korean ] = "¿©·¯ ÆäÀÌÁöÀÇ ¹Ù´Ú±Û¿¡ ´ëÇÑ Âü°í";
        Text[ turkish ] = "Devam eden dipnotu ile ilgili bilgi metni";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_CONT
    {
        Pos = MAP_APPFONT ( 86 , 103 ) ;
        Size = MAP_APPFONT ( 38 , 8 ) ;
        Text = "~Folgeseite" ;
        Text [ ENGLISH ] = "~Continued" ;
        Text [ norwegian ] = "~Fortsetter" ;
        Text [ italian ] = "Pagina su~cc." ;
        Text [ portuguese_brazilian ] = "~Continuado" ;
        Text [ portuguese ] = "Página ~seguinte" ;
        Text [ finnish ] = "~Jatkuu" ;
        Text [ danish ] = "Følgeside" ;
        Text [ french ] = "~Page suivante" ;
        Text [ swedish ] = "~Följande sida" ;
        Text [ dutch ] = "~Volg. pagina" ;
        Text [ spanish ] = "Página ~siguiente" ;
        Text [ english_us ] = "~Following page" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "ÐøÒ³(~F)";
        Text[ russian ] = "Ñëåäóþùàÿ ñòðàíèöà";
        Text[ polish ] = "Nastêp. str.";
        Text[ japanese ] = "ŽŸ‚ÌÍß°¼Þ(~F)";
        Text[ chinese_traditional ] = "Äò­¶(~F)";
        Text[ arabic ] = "ÇáÕÝÍÉ ÇáÊÇáíÉ";
        Text[ greek ] = "Åðüìåíç óåëßäá";
        Text[ korean ] = "´ÙÀ½ ÆäÀÌÁö(~F)";
        Text[ turkish ] = "~Sonraki sayfa";
        Text[ language_user1 ] = " ";
    };
    Edit ED_CONT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 137 , 101 ) ;
        Size = MAP_APPFONT ( 114 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        MaxTextLength = 30 ;
    };
    FixedText FT_CONT_FROM
    {
        Pos = MAP_APPFONT ( 86 , 118 ) ;
        Size = MAP_APPFONT ( 38 , 8 ) ;
        Text = "~Beginn" ;
        Text [ ENGLISH ] = "~Started" ;
        Text [ norwegian ] = "~Startet" ;
        Text [ italian ] = "~Inizio" ;
        Text [ portuguese_brazilian ] = "~Iniciado" ;
        Text [ portuguese ] = "~Iniciar" ;
        Text [ finnish ] = "~Alkaa" ;
        Text [ danish ] = "Begyndelse" ;
        Text [ french ] = "~Début" ;
        Text [ swedish ] = "~Börja" ;
        Text [ dutch ] = "~Begin" ;
        Text [ spanish ] = "~Comenzar" ;
        Text [ english_us ] = "~Start" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "¿ªÊ¼(~S)";
        Text[ russian ] = "Íà÷àëî";
        Text[ polish ] = "Pocz¹tek";
        Text[ japanese ] = "ŠJŽn(~S)";
        Text[ language_user1 ] = " ";
        Text[ chinese_traditional ] = "¶}©l(~S)";
        Text[ arabic ] = "ÇáÈÏÁ";
        Text[ greek ] = "Åêêßíçóç";
        Text[ korean ] = "½ÃÀÛ(~S)";
        Text[ turkish ] = "~Baþlangýç";
    };
    Edit ED_CONT_FROM
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 137 , 116 ) ;
        Size = MAP_APPFONT ( 114 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        MaxTextLength = 30 ;
    };
};
diff --git a/sw/source/ui/misc/glosbib.cxx b/sw/source/ui/misc/glosbib.cxx
new file mode 100644
index 0000000..69f89eb
--- /dev/null
+++ b/sw/source/ui/misc/glosbib.cxx
@@ -0,0 +1,723 @@
/*************************************************************************
 *
 *  $RCSfile: glosbib.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:44 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#define _SVSTDARR_STRINGS

#ifndef _URLOBJ_HXX
#include <tools/urlobj.hxx>
#endif
#ifndef _TOOLS_TEMPFILE_HXX
#include <tools/tempfile.hxx>
#endif
#ifndef _STREAM_HXX
#include <tools/stream.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SV_SVAPP_HXX
#include <vcl/svapp.hxx>
#endif
#ifndef _SV_HELP_HXX
#include <vcl/help.hxx>
#endif
#ifndef _SFXINIMGR_HXX
#include <svtools/iniman.hxx>
#endif
#ifndef _UNOTOOLS_PROCESSFACTORY_HXX_
#include <unotools/processfactory.hxx>
#endif
#ifndef _COM_SUN_STAR_UCB_XCONTENTPROVIDER_HPP_
#include <com/sun/star/ucb/XContentProvider.hpp>
#endif
#ifndef _UCBHELPER_CONTENTBROKER_HXX
#include <ucbhelper/contentbroker.hxx>
#endif
#ifndef _UCBHELPER_CONTENTIDENTIFIER_HXX
#include <ucbhelper/contentidentifier.hxx>
#endif

#include <svtools/svstdarr.hxx>

#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _GLOSBIB_HXX
#include <glosbib.hxx>
#endif
#ifndef _GLOSHDL_HXX
#include <gloshdl.hxx>
#endif
#ifndef _GLOSSARY_HXX
#include <glossary.hxx>
#endif
#ifndef _GLOSDOC_HXX
#include <glosdoc.hxx>
#endif
#ifndef _GLOSBIB_HRC
#include <glosbib.hrc>
#endif

#ifndef _MISC_HRC
#include <misc.hrc>
#endif
#ifndef _HELPID_H
#include <helpid.h>
#endif

using namespace ::com::sun::star;
using namespace ::com::sun::star::ucb;
using namespace ::com::sun::star::uno;
using namespace ::ucb;
using namespace ::rtl;

#define PATH_CASE_SENSITIVE 0x01
#define PATH_READONLY       0x02

#define RENAME_TOKEN_DELIM      (sal_Unicode)1

/*-----------------09.06.97 13:05-------------------

--------------------------------------------------*/
SwGlossaryGroupDlg::SwGlossaryGroupDlg(Window * pParent,
                        const SvStrings* pPathArr,
                        SwGlossaryHdl *pHdl) :
    SvxStandardDialog(pParent, SW_RES(DLG_BIB_BASE)),

    aGroupTLB(  this, SW_RES(TLB_GROUPS)),
    aNameED(    this, SW_RES(ED_NAME)),
    aPathLB(    this, SW_RES(LB_PATH)),
    aBibGB(     this, SW_RES(GB_BIB)),
    aRenamePB(  this, SW_RES(PB_RENAME)),
    aNewPB(     this, SW_RES(PB_NEW)),
    aDelPB(     this, SW_RES(PB_DELETE)),
    aOkPB(      this, SW_RES(BT_OK)),
    aCancelPB(  this, SW_RES(BT_CANCEL)),
    aHelpPB(    this, SW_RES(BT_HELP)),
    pRemovedArr(0),
    pInsertedArr(0),
    pRenamedArr(0),
    pGlosHdl(pHdl)
{
    FreeResource();

    long nTabs[] =
    {   2, // Number of Tabs
        0, 160
    };

    aGroupTLB.SetHelpId(HID_GLOS_GROUP_TREE);
    aGroupTLB.SetTabs( &nTabs[0], MAP_APPFONT );
    aGroupTLB.SetWindowBits(WB_HSCROLL|WB_CLIPCHILDREN|WB_SORT);
    aGroupTLB.SetSelectHdl(LINK(this, SwGlossaryGroupDlg, SelectHdl));
    aGroupTLB.GetModel()->SetSortMode(SortAscending);
    aNewPB.SetClickHdl(LINK(this, SwGlossaryGroupDlg, NewHdl));
    aDelPB.SetClickHdl(LINK(this, SwGlossaryGroupDlg, DeleteHdl));
    aNameED.SetModifyHdl(LINK(this, SwGlossaryGroupDlg, ModifyHdl));
    aPathLB.SetSelectHdl(LINK(this, SwGlossaryGroupDlg, ModifyHdl));
    aRenamePB.SetClickHdl(LINK(this, SwGlossaryGroupDlg, RenameHdl));
    for(USHORT i = 0; i < pPathArr->Count(); i++)
    {
        String sPath(*(*pPathArr)[i]);
        aPathLB.InsertEntry(sPath);
        ULONG nCaseReadonly = 0;
        TempFile aTempFile(&sPath);
        aTempFile.EnableKillingFile();
        if(!aTempFile.IsValid())
            nCaseReadonly |= PATH_READONLY;
        else
        {
            Reference< lang::XMultiServiceFactory > xMSF = utl::getProcessServiceFactory();
            try
            {
                INetURLObject aTempObj(aTempFile.GetName());
                aTempObj.SetBase(aTempObj.GetBase().ToLowerAscii());
                Reference<XContentIdentifier> xRef1 = new
                    ::ucb::ContentIdentifier( xMSF, aTempObj.GetMainURL() );

                aTempObj.SetBase(aTempObj.GetBase().ToUpperAscii());
                Reference<XContentIdentifier> xRef2 = new
                    ::ucb::ContentIdentifier( xMSF, aTempObj.GetMainURL() );

                ContentBroker& rBroker = *ContentBroker::get();

                Reference<XContentProvider > xProv = rBroker.getContentProviderInterface();
                sal_Int32 nCompare = xProv->compareContentIds( xRef1, xRef2 );
                if( nCompare )
                    nCaseReadonly |= PATH_CASE_SENSITIVE;
            }
            catch(...)
            {
            }
        }
        aPathLB.SetEntryData(i, (void*)nCaseReadonly);
    }
    aPathLB.SelectEntryPos(0);
    aPathLB.Enable(TRUE);

    const USHORT nCount = pHdl->GetGroupCnt();
    for(i = 0; i < nCount; ++i)
    {
        GlosBibUserData* pData = new GlosBibUserData;
        String sTitle;
        String sGroup = pHdl->GetGroupName(i, &sTitle);
        pData->sGroupName = sGroup;
        pData->sGroupTitle = sTitle;
        String sTemp(sTitle);
        //sGroup.GetToken(0, GLOS_DELIM)
        sTemp += '\t';
        pData->sPath = aPathLB.GetEntry(sGroup.GetToken(1, GLOS_DELIM).ToInt32());
        sTemp += pData->sPath;
        SvLBoxEntry* pEntry = aGroupTLB.InsertEntry(sTemp);
        pEntry->SetUserData(pData);

    }
    aGroupTLB.GetModel()->Resort();
}

/*-----------------09.06.97 13:05-------------------

--------------------------------------------------*/
SwGlossaryGroupDlg::~SwGlossaryGroupDlg()
{

    if(pInsertedArr)
    {
        pInsertedArr->DeleteAndDestroy(0, pInsertedArr->Count());
        delete pInsertedArr;
    }
    if(pRemovedArr)
    {
        pRemovedArr->DeleteAndDestroy(0, pRemovedArr->Count());
        delete pRemovedArr;
    }
    if(pRenamedArr)
    {
        pRenamedArr->DeleteAndDestroy(0, pRenamedArr->Count());
        delete pRenamedArr;
    }

}

/*-----------------09.06.97 13:11-------------------

--------------------------------------------------*/

void __EXPORT SwGlossaryGroupDlg::Apply()
{
    if(aNewPB.IsEnabled())
        NewHdl(&aNewPB);

    String aActGroup = SwGlossaryDlg::GetCurrGroup();

    if(pRemovedArr && pRemovedArr->Count())
    {
        USHORT nCount = pRemovedArr->Count();
        for(USHORT i = 0; i < nCount; ++i)
        {
            const String* pDelEntry = (*pRemovedArr)[i];
            const String sDelGroup = pDelEntry->GetToken(0, '\t');
            if( sDelGroup == aActGroup )
            {
                //soll die aktuelle Gruppe geloescht werden, muss die akt. Gruppe
                //umgesetzt werden
                if(aGroupTLB.GetEntryCount())
                {
                    SvLBoxEntry* pFirst = aGroupTLB.First();
                    GlosBibUserData* pUserData = (GlosBibUserData*)pFirst->GetUserData();
                    pGlosHdl->SetCurGroup(pUserData->sGroupName);
                }
            }
            String sMsg(SW_RES(STR_QUERY_DELETE_GROUP1));
            String sTitle(pDelEntry->GetToken(1, '\t'));
            if(sTitle.Len())
                sMsg += sTitle;
            else
                sDelGroup.GetToken(1, GLOS_DELIM);
            sMsg += SW_RESSTR(STR_QUERY_DELETE_GROUP2);
            QueryBox aQuery(this->GetParent(), WB_YES_NO|WB_DEF_NO, sMsg );
            if(RET_YES == aQuery.Execute())
                pGlosHdl->DelGroup( sDelGroup );
        }

    }
    //erst umbenennen, falls es schon eins gab
    if(pRenamedArr && pRenamedArr->Count())
    {
        USHORT nCount = pRenamedArr->Count();
        for(USHORT i = 0; i < nCount; ++i)
        {
            String * pEntry = (*pRenamedArr)[i];
            xub_StrLen nStrSttPos = 0;
            String sOld( pEntry->GetToken(0, RENAME_TOKEN_DELIM, nStrSttPos ) );
            String sNew( pEntry->GetToken(0, RENAME_TOKEN_DELIM, nStrSttPos) );
            String sTitle( pEntry->GetToken(0, RENAME_TOKEN_DELIM, nStrSttPos) );
            pGlosHdl->RenameGroup(sOld, sNew, sTitle);
            if(!i)
                sCreatedGroup = sNew;
        }
    }
    if(pInsertedArr && pInsertedArr->Count())
    {
        USHORT nCount = pInsertedArr->Count();
        for(USHORT i = 0; i < nCount; ++i)
        {
            String sNewGroup = *(*pInsertedArr)[i];
            String sNewTitle = sNewGroup.GetToken(0, GLOS_DELIM);
            if( *(*pInsertedArr)[i] != aActGroup )
            {
                pGlosHdl->NewGroup(sNewGroup, sNewTitle);
                if(!sCreatedGroup.Len())
                    sCreatedGroup = sNewGroup;
            }
        }
    }
}
/*-----------------09.06.97 13:12-------------------

--------------------------------------------------*/
IMPL_LINK( SwGlossaryGroupDlg, SelectHdl, SvTabListBox*, EMPTYARG  )
{
    aNewPB.Enable(FALSE);
    SvLBoxEntry* pEntry = aGroupTLB.FirstSelected();
    if(pEntry)
    {
        GlosBibUserData* pUserData = (GlosBibUserData*)pEntry->GetUserData();
        String sEntry(pUserData->sGroupName);
        String sName(aNameED.GetText());
        BOOL bExists = FALSE;
        ULONG nPos = aGroupTLB.GetEntryPos(sName, 0);
        if( 0xffffffff > nPos)
        {
            SvLBoxEntry* pEntry = aGroupTLB.GetEntry(nPos);
            GlosBibUserData* pFoundData = (GlosBibUserData*)pEntry->GetUserData();
            String sGroup = pFoundData->sGroupName;
            bExists = sGroup == sEntry;
        }

        aRenamePB.Enable(!bExists && sName.Len());
        aDelPB.Enable(IsDeleteAllowed(sEntry));
    }
    return 0;
}

/*-----------------09.06.97 13:22-------------------

--------------------------------------------------*/
IMPL_LINK( SwGlossaryGroupDlg, NewHdl, Button*, EMPTYARG )
{
    String sGroup(aNameED.GetText());
//  sGroup.ToLower();
    sGroup += GLOS_DELIM;
    sGroup += String::CreateFromInt32(aPathLB.GetSelectEntryPos());
    DBG_ASSERT(!pGlosHdl->FindGroupName(sGroup), "Gruppe bereits vorhanden!")
    if(!pInsertedArr)
        pInsertedArr = new SvStrings;
    pInsertedArr->Insert(new String(sGroup), pInsertedArr->Count());
    String sTemp(aNameED.GetText());
//  sTemp.ToLower();
    sTemp += '\t';
    sTemp += aPathLB.GetSelectEntry();
    SvLBoxEntry* pEntry = aGroupTLB.InsertEntry(sTemp);
    GlosBibUserData* pData = new GlosBibUserData;
    pData->sPath = aPathLB.GetSelectEntry();
    pData->sGroupName = sGroup;
    pData->sGroupTitle = aNameED.GetText();
    pEntry->SetUserData(pData);
    aGroupTLB.Select(pEntry);
    aGroupTLB.MakeVisible(pEntry);
    aGroupTLB.GetModel()->Resort();

    return 0;
}
/*-----------------09.06.97 13:22-------------------

--------------------------------------------------*/
IMPL_LINK( SwGlossaryGroupDlg, DeleteHdl, Button*, pButton  )
{
    SvLBoxEntry* pEntry = aGroupTLB.FirstSelected();
    if(!pEntry)
    {
        pButton->Enable(FALSE);
        return 0;
    }
    GlosBibUserData* pUserData = (GlosBibUserData*)pEntry->GetUserData();
    String sEntry(pUserData->sGroupName);
    // befindet sich der zu loeschende Name schon unter den
    // den neuen - dann weg damit
    BOOL bDelete = TRUE;
    if(pInsertedArr && pInsertedArr->Count())
    {
        USHORT nCount = pInsertedArr->Count();
        for(USHORT i = 0; i < nCount; ++i)
        {
            const String* pTemp = (*pInsertedArr)[i];
            if(*pTemp == sEntry)
            {
                pInsertedArr->Remove(i);
                bDelete = FALSE;
                break;
            }

        }
    }
    // moeglicherweise sollte es schon umbenannt werden?
    if(bDelete)
    {
        if(pRenamedArr && pRenamedArr->Count())
        {
            USHORT nCount = pRenamedArr->Count();
            for(USHORT i = 0; i < nCount; ++i)
            {
                const String* pTemp = (*pRenamedArr)[i];
                String sTemp( pTemp->GetToken(0, RENAME_TOKEN_DELIM ));
                if(sTemp == sEntry)
                {
                    pRenamedArr->Remove(i);
                    bDelete = FALSE;
                    break;
                }
            }
        }
    }
    if(bDelete)
    {
        if(!pRemovedArr)
            pRemovedArr = new SvStrings;
        String sEntry(pUserData->sGroupName);
        sEntry += '\t';
        sEntry += pUserData->sGroupTitle;
        pRemovedArr->Insert(new String(sEntry), pRemovedArr->Count());
    }
    delete pUserData;
    aGroupTLB.GetModel()->Remove(pEntry);
    if(!aGroupTLB.First())
        pButton->Enable(FALSE);
    //the content must be deleted - otherwise the new handler would be called in Apply()
    aNameED.SetText(aEmptyStr);
    return 0;
}

/* -----------------23.11.98 12:26-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK( SwGlossaryGroupDlg, RenameHdl, Button *, EMPTYARG )
{
    SvLBoxEntry* pEntry = aGroupTLB.FirstSelected();
    GlosBibUserData* pUserData = (GlosBibUserData*)pEntry->GetUserData();
    String sEntryText(aGroupTLB.GetEntryText(pEntry));
    String sEntry(pUserData->sGroupName);

    String sNewName(aNameED.GetText());
    String sNewTitle(sNewName);

    sNewName += GLOS_DELIM;
    sNewName += String::CreateFromInt32(aPathLB.GetSelectEntryPos());
    DBG_ASSERT(!pGlosHdl->FindGroupName(sNewName), "Gruppe bereits vorhanden!")

    // befindet sich der umzubenennende Name unter den
    // den neuen - dann austauschen
    BOOL bDone = FALSE;
    if(pInsertedArr && pInsertedArr->Count())
    {
        USHORT nCount = pInsertedArr->Count();
        for(USHORT i = 0; i < nCount; ++i)
        {
            const String* pTemp = (*pInsertedArr)[i];
            if(*pTemp == sEntry)
            {
                pInsertedArr->Remove(i);
                pInsertedArr->Insert(new String(sNewName), pInsertedArr->Count());
                bDone = TRUE;
                break;
            }
        }
    }
    if(!bDone)
    {
        if(!pRenamedArr)
            pRenamedArr = new SvStrings;
        sEntry += RENAME_TOKEN_DELIM;
        sEntry += sNewName;
        sEntry += RENAME_TOKEN_DELIM;
        sEntry += sNewTitle;
        pRenamedArr->Insert(new String(sEntry), pRenamedArr->Count());
    }
    delete (GlosBibUserData*)pEntry->GetUserData();
    aGroupTLB.GetModel()->Remove(pEntry);
    String sTemp(aNameED.GetText());
//  sTemp.ToLower();
    sTemp += '\t';
    sTemp += aPathLB.GetSelectEntry();
    pEntry = aGroupTLB.InsertEntry(sTemp);
    GlosBibUserData* pData = new GlosBibUserData;
    pData->sPath = aPathLB.GetSelectEntry();
    pData->sGroupName = sNewName;
    pData->sGroupTitle = sNewTitle;
    pEntry->SetUserData(pData);
    aGroupTLB.Select(pEntry);
    aGroupTLB.MakeVisible(pEntry);
    aGroupTLB.GetModel()->Resort();
    return 0;
}
/*-----------------09.06.97 13:42-------------------

--------------------------------------------------*/
IMPL_LINK( SwGlossaryGroupDlg, ModifyHdl, Edit*, EMPTYARG )
{
    String sEntry(aNameED.GetText());
//  sEntry.ToLower();
    BOOL bEnableNew = TRUE;
    BOOL bEnableDel = FALSE;
    ULONG nCaseReadonly =
            (ULONG)aPathLB.GetEntryData(aPathLB.GetSelectEntryPos());
    BOOL bDirReadonly = 0 != (nCaseReadonly&PATH_READONLY);

    if(!sEntry.Len() || bDirReadonly)
        bEnableNew = FALSE;
    else if(sEntry.Len())
    {
        ULONG nPos = 0xffffffff;


        nPos = aGroupTLB.GetEntryPos(sEntry, 0);
        //ist es nicht case sensitive muss man selbst suchen
        if( 0xffffffff == nPos)
        {
            for(USHORT i = 0; i < aGroupTLB.GetEntryCount(); i++)
            {
                String sTemp = aGroupTLB.GetEntryText( i, 0 );
                ULONG nCaseReadonly = (ULONG)aPathLB.GetEntryData(
                    aPathLB.GetEntryPos(aGroupTLB.GetEntryText(i,1)));
                BOOL bCase = 0 != (nCaseReadonly & PATH_CASE_SENSITIVE);
                const International& rInt = Application::GetAppInternational();
                if(!bCase && rInt.CompareEqual(sTemp, sEntry, INTN_COMPARE_IGNORECASE))
                {
                    nPos = i;
                    break;
                }
            }
        }
        if( 0xffffffff > nPos)
        {
            bEnableNew = FALSE;
            aGroupTLB.Select(aGroupTLB.GetEntry( nPos ));
            aGroupTLB.MakeVisible(aGroupTLB.GetEntry( nPos ));
        }
    }
    SvLBoxEntry* pEntry = aGroupTLB.FirstSelected();
    if(pEntry)
    {
        String sGroup = aGroupTLB.GetEntryText(pEntry, 0);
        sGroup += GLOS_DELIM;
        sGroup += String::CreateFromInt32(aPathLB.GetEntryPos(aGroupTLB.GetEntryText(pEntry, 1)));
        bEnableDel = IsDeleteAllowed(sGroup);
    }

    aDelPB.Enable(bEnableDel);
    aNewPB.Enable(bEnableNew);
    aRenamePB.Enable(bEnableNew && pEntry);
    return 0;
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

BOOL SwGlossaryGroupDlg::IsDeleteAllowed(const String &rGroup)
{
    BOOL bDel = (!pGlosHdl->IsReadOnly(&rGroup));

    // OM: befindet sich der Name unter den den neuen Bereichsnamen,
    // dann ist er auch loeschbar! Bei noch nicht existenten Bereichsnamen
    // liefert ReadOnly naemlich TRUE.

    if(pInsertedArr && pInsertedArr->Count())
    {
        USHORT nCount = pInsertedArr->Count();
        for(USHORT i = 0; i < nCount; ++i)
        {
            const String* pTemp = (*pInsertedArr)[i];
            if(*pTemp == rGroup)
            {
                bDel = TRUE;
                break;
            }
        }
    }

    return bDel;
}

/*-----------------18.07.97 19:06-------------------

--------------------------------------------------*/
void FEdit::KeyInput( const KeyEvent& rKEvent )
{
    String sKey(rKEvent.GetCharCode());
    KeyCode aCode = rKEvent.GetKeyCode();

    if (aCode.GetGroup() == KEYGROUP_CURSOR ||
        ((aCode.GetGroup() == KEYGROUP_MISC) && aCode.GetCode() <= KEY_DELETE) ||
        sKey != SFX_SEARCHPATH_DELIMITER)
        Edit::KeyInput( rKEvent );
}
/* -----------------------------08.02.00 15:07--------------------------------

 ---------------------------------------------------------------------------*/
void    SwGlossaryGroupTLB::RequestHelp( const HelpEvent& rHEvt )
{
    Point aPos( ScreenToOutputPixel( rHEvt.GetMousePosPixel() ));
    SvLBoxEntry* pEntry = GetEntry( aPos );
    if(pEntry)
    {
        SvLBoxTab* pTab;
        SvLBoxItem* pItem = GetItem( pEntry, aPos.X(), &pTab );
        if(pItem)
        {
            aPos = SvTreeListBox::GetEntryPos( pEntry );
            Size aSize(pItem->GetSize( this, pEntry ));
            aPos.X() = GetTabPos( pEntry, pTab );

            if((aPos.X() + aSize.Width()) > GetSizePixel().Width())
                aSize.Width() = GetSizePixel().Width() - aPos.X();
            aPos = OutputToScreenPixel(aPos);
            Rectangle aItemRect( aPos, aSize );
            String sMsg;
            GlosBibUserData* pData = (GlosBibUserData*)pEntry->GetUserData();
            sMsg = pData->sPath;
            sMsg += INET_PATH_TOKEN;
            sMsg += pData->sGroupName.GetToken(0, GLOS_DELIM);
            sMsg += SwGlossaries::GetExtension();

            Help::ShowQuickHelp( this, aItemRect, sMsg,
                        QUICKHELP_LEFT|QUICKHELP_VCENTER );
        }
    }
}
/* -----------------------------08.02.00 15:08--------------------------------

 ---------------------------------------------------------------------------*/
void    SwGlossaryGroupTLB::Clear()
{
    SvLBoxEntry* pEntry = First();
    while(pEntry)
    {
        GlosBibUserData* pData = (GlosBibUserData*)pEntry->GetUserData();
        delete pData;
        pEntry = Next(pEntry);
    }
    SvTabListBox::Clear();
}

/*--------------------------------------------------------------------

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.64  2000/09/18 16:05:56  willem.vandorp
      OpenOffice header added.

      Revision 1.63  2000/07/20 15:24:32  jp
      Bug #77040#: don't create references with stack objects, must always created on the heap

      Revision 1.62  2000/07/20 13:17:12  jp
      change old txtatr-character to the two new characters

      Revision 1.61  2000/06/13 09:57:14  os
      using UCB

      Revision 1.60  2000/06/07 13:27:58  os
      using UCB

      Revision 1.59  2000/05/30 14:34:29  os
      #75706# removing of glossary groups: ask for title instead of group name

      Revision 1.58  2000/05/23 19:22:32  jp
      Bugfixes for Unicode

      Revision 1.57  2000/04/18 15:08:16  os
      UNICODE

      Revision 1.56  2000/03/14 10:09:58  os
      #73944# check if directories are readonly

      Revision 1.55  2000/03/06 15:49:27  os
      #70359# dialog size increased

      Revision 1.54  2000/03/03 15:17:02  os
      StarView remainders removed

      Revision 1.53  2000/02/22 13:26:21  os
      #73271# always append path index

      Revision 1.52  2000/02/14 14:40:48  os
      #70473# Unicode

 --------------------------------------------------------------------*/


diff --git a/sw/source/ui/misc/glosbib.hrc b/sw/source/ui/misc/glosbib.hrc
new file mode 100644
index 0000000..d5c501a
--- /dev/null
+++ b/sw/source/ui/misc/glosbib.hrc
@@ -0,0 +1,73 @@
/*************************************************************************
 *
 *  $RCSfile: glosbib.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:44 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#define GB_BIB              1
#define CO_NAME             2
#define PB_NEW              3
#define PB_DELETE           4
#define BT_OK               5
#define BT_CANCEL           6
#define BT_HELP             7
#define LB_PATH             8
#define TLB_GROUPS          9
#define ED_NAME             10
#define PB_RENAME           11

diff --git a/sw/source/ui/misc/glosbib.src b/sw/source/ui/misc/glosbib.src
new file mode 100644
index 0000000..ed07ae5
--- /dev/null
+++ b/sw/source/ui/misc/glosbib.src
@@ -0,0 +1,280 @@
/*************************************************************************
 *
 *  $RCSfile: glosbib.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:44 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "glosbib.hrc"
#include "misc.hrc"
#include "helpid.h"
ModalDialog DLG_BIB_BASE
{
    HelpID = HID_BIB_BASE ;
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 349 , 121 ) ;
    Moveable = TRUE ;
    Text = "Bereiche bearbeiten" ;
    Text [ ENGLISH ] = "Edit groups" ;
    Text [ dutch ] = "Bereiken bewerken" ;
    Text [ english_us ] = "Edit Categories" ;
    Text [ italian ] = "Modifica categorie" ;
    Text [ spanish ] = "Modificar áreas" ;
    Text [ french ] = "Édition des catégories" ;
    Text [ swedish ] = "Redigera områden" ;
    Text [ danish ] = "Rediger områder" ;
    Text [ portuguese ] = "Editar categorias" ;
    Text [ portuguese_brazilian ] = "Bereiche bearbeiten" ;
    PushButton PB_NEW
    {
        Disable = TRUE ;
        Pos = MAP_APPFONT ( 293 , 66 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        Text = "~Neu" ;
        Text [ ENGLISH ] = "~New" ;
        Text [ norwegian ] = "~New" ;
        Text [ italian ] = "~Nuovo" ;
        Text [ portuguese_brazilian ] = "~Novo" ;
        Text [ portuguese ] = "~Novo" ;
        Text [ finnish ] = "~Uusi" ;
        Text [ danish ] = "Ny" ;
        Text [ french ] = "~Nouvelle" ;
        Text [ swedish ] = "~Nytt" ;
        Text [ dutch ] = "~Nieuw" ;
        Text [ spanish ] = "~Nuevo" ;
        Text [ english_us ] = "~New" ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "н¨(~N)";
        Text[ russian ] = "Ñîçä~àòü";
        Text[ polish ] = "Nowy";
        Text[ japanese ] = "V‹Kì¬(~N)";
        Text[ chinese_traditional ] = "¶}±Ò·sÀÉ(~N)";
        Text[ arabic ] = "ÌÏíÏ";
        Text[ greek ] = "Äçìéïõñãßá";
        Text[ korean ] = "»õ·Î(~N)";
        Text[ turkish ] = "~Yeni";
        Text[ language_user1 ] = " ";
    };
    PushButton PB_DELETE
    {
        Pos = MAP_APPFONT ( 293 , 83 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? ~Löschen : ~L÷schen */
        Text = "~Löschen" ;
        Text [ ENGLISH ] = "~Delete" ;
        Text [ norwegian ] = "~Slett" ;
        Text [ italian ] = "~Elimina" ;
        Text [ portuguese_brazilian ] = "~Apagar" ;
        Text [ portuguese ] = "E~liminar" ;
        Text [ finnish ] = "~Poista" ;
        Text [ danish ] = "Slet" ;
        Text [ french ] = "~Supprimer" ;
        Text [ swedish ] = "~Radera" ;
        Text [ dutch ] = "~Wissen" ;
        Text [ spanish ] = "~Eliminar" ;
        Text [ english_us ] = "~Delete" ;
        TabStop = TRUE ;
        Disable = TRUE ;
        Text[ chinese_simplified ] = "ɾ³ý(~D)";
        Text[ russian ] = "Óäàëèòü";
        Text[ polish ] = "Usuñ";
        Text[ japanese ] = "íœ(~D)";
        Text[ chinese_traditional ] = "§R°£(~D)";
        Text[ arabic ] = "ÍÐÝ";
        Text[ greek ] = "ÄéáãñáöÞ";
        Text[ korean ] = "»èÁ¦(~D)";
        Text[ turkish ] = "~Sil";
        Text[ language_user1 ] = " ";
    };
    PushButton PB_RENAME
    {
        Disable = TRUE ;
        Pos = MAP_APPFONT ( 293 , 100 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        Text = "~Umbenennen" ;
        Text [ ENGLISH ] = "Ren~ame" ;
        Text [ dutch ] = "~Naam wijzigen" ;
        Text [ english_us ] = "~Rename" ;
        Text [ italian ] = "~Rinomina" ;
        Text [ spanish ] = "~Cambiar nombre" ;
        Text [ french ] = "~Renommer" ;
        Text [ swedish ] = "~Byt namn" ;
        Text [ danish ] = "Omdøb" ;
        Text [ portuguese ] = "~Mudar nome" ;
        TabStop = TRUE ;
        Text[ portuguese_brazilian ] = "Ren~ame";
        Text[ chinese_simplified ] = "ÖØÃüÃû(~R)";
        Text[ russian ] = "Ïåðåèìåíîâàòü";
        Text[ polish ] = "Zmieñ nazwê";
        Text[ japanese ] = "–¼‘O‚̕ύX(~R)";
        Text[ chinese_traditional ] = "­«·s©R¦W(~R)";
        Text[ arabic ] = "ÅÚÇÏÉ ÇáÊÓãíÉ";
        Text[ greek ] = "Ìåôïíïìáóßá";
        Text[ korean ] = "À̸§ ¹Ù²Ù±â(~R)";
        Text[ turkish ] = "Y~eniden adlandýr";
        Text[ language_user1 ] = " ";
    };
    GroupBox GB_BIB
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 281 , 111 ) ;
        Text = "Bereich" ;
        Text [ ENGLISH ] = "Group" ;
        Text [ norwegian ] = "Gruppe" ;
        Text [ italian ] = "Sezione" ;
        Text [ portuguese_brazilian ] = "Grupo" ;
        Text [ portuguese ] = "Categoria" ;
        Text [ finnish ] = "Ryhmä" ;
        Text [ danish ] = "Område" ;
        Text [ french ] = "Catégorie" ;
        Text [ swedish ] = "Område" ;
        Text [ dutch ] = "Bereik" ;
        Text [ spanish ] = "Area" ;
        Text [ english_us ] = "Category" ;
        Text[ chinese_simplified ] = "·ÖÀà";
        Text[ russian ] = "Êàòåãîðèÿ";
        Text[ polish ] = "Obszar";
        Text[ japanese ] = "•ª—Þ";
        Text[ chinese_traditional ] = "°Ï°ì";
        Text[ arabic ] = "ÝÆÉ";
        Text[ greek ] = "Êáôçãïñßá";
        Text[ korean ] = "Ç׸ñ ºÐ·ù";
        Text[ turkish ] = "Kategori";
        Text[ language_user1 ] = " ";
    };
    OKButton BT_OK
    {
        Pos = MAP_APPFONT ( 293 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        DefButton = TRUE ;
    };
    CancelButton BT_CANCEL
    {
        Pos = MAP_APPFONT ( 293 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    HelpButton BT_HELP
    {
        Pos = MAP_APPFONT ( 293 , 43 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    Edit ED_NAME
    {
        Pos = MAP_APPFONT ( 12 , 14 ) ;
        Size = MAP_APPFONT ( 159 , 12 ) ;
        TabStop = TRUE ;
        Border = TRUE ;
        MaxTextLength = 256 ;
    };
    ListBox LB_PATH
    {
        Pos = MAP_APPFONT ( 174 , 14 ) ;
        Size = MAP_APPFONT ( 107 , 50 ) ;
        DropDown = TRUE ;
        Border = TRUE ;
        TabStop = TRUE ;
        DDExtraWidth = TRUE ;
    };
    Control TLB_GROUPS
    {
        Pos = MAP_APPFONT ( 12 , 46 ) ;
        Size = MAP_APPFONT ( 269 , 61 ) ;
        TabStop = TRUE ;
        Border = TRUE ;
    };
    /*    ComboBox CO_NAME
    {
        Pos = MAP_APPFONT ( 12 , 14 ) ;
        Size = MAP_APPFONT ( 89 , 76 ) ;
        TabStop = TRUE ;
#ifdef WIN
        MaxTextLength = 8 ;
#else
        MaxTextLength = 32 ;
#endif
        Sort = TRUE ;
    };*/
    Text[ chinese_simplified ] = "±à¼­ÇøÓò";
    Text[ russian ] = "Ïðàâêà êàòåãîðèé";
    Text[ polish ] = "Edytuj obszary";
    Text[ japanese ] = "•ª—ނ̕ҏW";
    Text[ chinese_traditional ] = "½s¿è°Ï°ì";
    Text[ arabic ] = "ÊÍÑíÑ ÇáÝÆÇÊ";
    Text[ greek ] = "Åðåîåñãáóßá êáôçãïñéþí";
    Text[ korean ] = "ºÐ·ù Ç׸ñ ÆíÁý";
    Text[ turkish ] = "Kategorileri düzenle";
    Text[ language_user1 ] = " ";
};
/*
String STR_GLOSSARY_BIB_DLG
{
    Text = "Bereiche bearbeiten" ;
    Text [ ENGLISH ] = "Edit groups" ;
    Text [ dutch ] = "Bereiken bewerken" ;
    Text [ english_us ] = "Edit Categories" ;
    Text [ italian ] = "Modifica aree" ;
    Text [ spanish ] = "Editar secciones" ;
    Text [ french ] = "Modifier sections" ;
    Text [ swedish ] = "Redigera områden" ;
    Text [ danish ] = "Rediger område" ;
    Text [ portuguese ] = "Editar secções" ;
    Text [ portuguese_brazilian ] = "Bereiche bearbeiten" ;
};*/
diff --git a/sw/source/ui/misc/glosdoc.cxx b/sw/source/ui/misc/glosdoc.cxx
new file mode 100644
index 0000000..f96274a
--- /dev/null
+++ b/sw/source/ui/misc/glosdoc.cxx
@@ -0,0 +1,1101 @@
/*************************************************************************
 *
 *  $RCSfile: glosdoc.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:44 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif


#pragma hdrstop

#ifndef _COM_SUN_STAR_UCB_XCOMMANDENVIRONMENT_HPP_
#include <com/sun/star/ucb/XCommandEnvironment.hpp>
#endif
#ifndef _COM_SUN_STAR_UCB_XCONTENTACCESS_HPP_
#include <com/sun/star/ucb/XContentAccess.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBC_XRESULTSET_HPP_
#include <com/sun/star/sdbc/XResultSet.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBC_XROW_HPP_
#include <com/sun/star/sdbc/XRow.hpp>
#endif
#ifndef _UCBHELPER_CONTENT_HXX
#include <ucbhelper/content.hxx>
#endif
#ifndef _UCBHELPER_CONTENTIDENTIFIER_HXX
#include <ucbhelper/contentidentifier.hxx>
#endif
#ifndef _COM_SUN_STAR_UCB_XCONTENTPROVIDER_HPP_
#include <com/sun/star/ucb/XContentProvider.hpp>
#endif
#ifndef _COM_SUN_STAR_UCB_TRANSFERINFO_HPP_
#include <com/sun/star/ucb/TransferInfo.hpp>
#endif
#ifndef _COM_SUN_STAR_UCB_NAMECLASH_HPP_
#include <com/sun/star/ucb/NameClash.hpp>
#endif
#ifndef _UCBHELPER_CONTENTBROKER_HXX
#include <ucbhelper/contentbroker.hxx>
#endif
#ifndef _UNOTOOLS_PROCESSFACTORY_HXX_
#include <unotools/processfactory.hxx>
#endif
#ifndef _APP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _SHL_HXX
#include <tools/shl.hxx>
#endif
#define _SVSTDARR_STRINGS
#include <svtools/svstdarr.hxx>
#ifndef SVTOOLS_URIHELPER_HXX
#include <svtools/urihelper.hxx>
#endif
#ifndef __RSC //autogen
#include <tools/errinf.hxx>
#endif
#ifndef _SFXINIMGR_HXX //autogen
#include <svtools/iniman.hxx>
#endif
#ifndef _TOOLS_DEBUG_HXX //autogen
#include <tools/debug.hxx>
#endif
#ifndef _SFX_INIMGR_HXX
#include <sfx2/inimgr.hxx>
#endif

#ifndef _UNOATXT_HXX
#include <unoatxt.hxx>
#endif
#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _ERRHDL_HXX
#include <errhdl.hxx>       // ASSERT
#endif
#ifndef _UITOOL_HXX
#include <uitool.hxx>
#endif
#ifndef _GLOSDOC_HXX
#include <glosdoc.hxx>
#endif
#ifndef _SHELLIO_HXX
#include <shellio.hxx>
#endif

#ifndef _SWERROR_H
#include <swerror.h>
#endif
#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif

using namespace ::com::sun::star;
using namespace ::com::sun::star::ucb;
using namespace ::com::sun::star::uno;
using namespace ::ucb;
using namespace ::rtl;

#define C2S(cChar) UniString::CreateFromAscii(cChar)
// INCLUDEs die nicht bedingungslos im MSC-PCH landen --------------------


// STATIC ---------------------------------------------------------------
static const char __FAR_DATA pDefName[] = "standard";

char __FAR_DATA aExt[] = ".bau";
extern const char* __FAR_DATA pGlosExt = aExt;

SV_IMPL_PTRARR(XAutoTextGroupPtrArr, XAutoTextGroupPtr)
SV_IMPL_PTRARR(XAutoTextEntryPtrArr, XInterfacePtr)

// PUBLIC METHODES -------------------------------------------------------
/* -----------------23.11.98 14:30-------------------
 *
 * --------------------------------------------------*/
sal_Bool lcl_RemoveFileFromList(SvStrings* pGlosArr,
                            XAutoTextEntryPtrArr& rGlosEntryArr,
                            XAutoTextGroupPtrArr& rGlosGroupArr,
                            const String& rName)
{
    if(pGlosArr)
    {
        const sal_uInt16 nCount = pGlosArr->Count();
        for(sal_uInt16 i = 0; i < nCount; ++i)
        {
            String *pTmp = (*pGlosArr)[i];
            if(*pTmp == rName)
            {
                //UNO-Objekt fuer die Gruppe aus dem Array loeschen
                OUString aUName = rName;
                sal_uInt16 nXCount = rGlosGroupArr.Count();
                for(sal_uInt16 j = 0; j < nXCount; ++j)
                {
                    uno::Reference< text::XAutoTextGroup > * pxGroup = rGlosGroupArr.GetObject(j);
                    uno::Reference< container::XNamed >  xNamed(*pxGroup, uno::UNO_QUERY);


                    if(xNamed->getName() == aUName )
                    {
                        text::XAutoTextGroup* pGroup = pxGroup->get();
                        ((SwXAutoTextGroup*)pGroup)->Invalidate();
                        rGlosGroupArr.Remove(j);
                        delete pxGroup;
                        break;
                    }
                }
                // alle UNO-Objekte fuer enthaltene Entries loeschen - rueckwaerts!
                nXCount = rGlosEntryArr.Count();
                for(j = nXCount; j; --j)
                {
                    uno::Reference< uno::XInterface > * pxEntry = rGlosEntryArr.GetObject(j);
                    uno::Reference< lang::XUnoTunnel >  xTunnel(*pxEntry, uno::UNO_QUERY);
                    SwXAutoTextEntry* pEntry = (SwXAutoTextEntry*)
                                xTunnel->getSomething(SwXAutoTextEntry::getUnoTunnelId());
                    if(pEntry->GetGroupName() == rName )
                    {
                        pEntry->Invalidate();
                        rGlosEntryArr.Remove(j);
                        delete pxEntry;
                    }
                }

                pGlosArr->Remove(i);
                delete pTmp;
                break;
            }
        }
    }
    return sal_True;
}
/* -----------------------------08.02.00 15:54--------------------------------

 ---------------------------------------------------------------------------*/
String lcl_CheckFileName(const String& rNewFilePath, const String& rNewGroupName)
{
    String sRet;
    //group name should contain only A-Z and a-z and spaces
    for(sal_uInt16 i = 0; i < rNewGroupName.Len(); i++)
    {
        char cChar = rNewGroupName.GetChar(i);
        if( (cChar >= 'A') && (cChar <= 'Z') ||
                (cChar >= 'a') && (cChar <= 'z') ||
                    (cChar >= '0') && (cChar <= '9') ||
                        (cChar = '_') ||
                    cChar == 0x20 )
        {
            sRet += cChar;
        }
    }
    sRet.EraseLeadingChars();
    sRet.EraseTrailingChars();
    String sTmpDir(rNewFilePath);
    sTmpDir += INET_PATH_TOKEN;
    sTmpDir += sRet;
    sTmpDir += SwGlossaries::GetExtension();

    BOOL bCreated = FALSE;
    try
    {
        ::ucb::Content aTestContent(    sTmpDir ,
                                        uno::Reference< XCommandEnvironment >());
        bCreated = aTestContent.isDocument();
    }
    catch(...)
    {
        bCreated = FALSE;
    }
    if(!sRet.Len() || bCreated)
    {
        //generate generic name
        const String sGroupBaseName(C2S("group"));
        String sTmpDir(rNewFilePath);
        sTmpDir += INET_PATH_TOKEN;
        for(sal_uInt16 i = 0; i < USHRT_MAX; i++)
        {
            String sName(sGroupBaseName);
            sName += String::CreateFromInt32(i);
            sName += SwGlossaries::GetExtension();
            sName.Insert(sTmpDir, 0);
            try
            {
                ::ucb::Content aTestContent(sName ,
                                            uno::Reference< XCommandEnvironment >());
                bCreated = aTestContent.isDocument();
            }
            catch(...)
            {
                bCreated = FALSE;
            }

            if(!bCreated)
            {
                sRet = sGroupBaseName;
                sRet += String::CreateFromInt32(i);
                break;
            }
        }
    }
    return sRet;
}
/*------------------------------------------------------------------------
    Beschreibung: Liefert den Namen der Default-Gruppe
------------------------------------------------------------------------*/


String  SwGlossaries::GetDefName()
{
    return C2S(pDefName);
}
/*------------------------------------------------------------------------
    Beschreibung: Liefert die Anzahl der Textbausteingruppen
------------------------------------------------------------------------*/


sal_uInt16 SwGlossaries::GetGroupCnt()
{
    return  GetNameList()->Count();
}
/*------------------------------------------------------------------------
    Beschreibung: Liefert den Gruppennamen
------------------------------------------------------------------------*/
sal_Bool SwGlossaries::FindGroupName(String & rGroup)
{
    //  enthaelt der Gruppenname keinen Pfad, kann hier ein passender
    // Gruppeneintrag gesucht werden;
    sal_uInt16 nCount = GetGroupCnt();
    sal_uInt16 i;
    for(i= 0; i < nCount; i++)
    {
        String sTemp(GetGroupName(i));
        if(rGroup.Equals( sTemp.GetToken(0, GLOS_DELIM)))
        {
            rGroup = sTemp;
            return sal_True;
        }
    }
    //man darf zweimal suchen, denn bei mehreren Verzeichnissen koennte der caseinsensitive Name mehrfach auftreten
    const International& rInt = Application::GetAppInternational();
    Reference< lang::XMultiServiceFactory > xMSF = utl::getProcessServiceFactory();

    for(i = 0; i < nCount; i++)
    {
        String sTemp(GetGroupName(i));
        String sPath = sTemp.GetToken(1, GLOS_DELIM);
        sal_uInt16 nPath = sPath.ToInt32();

        BOOL bCaseSensitive = FALSE;
        try
        {
            INetURLObject aTempObj(*(*pPathArr)[nPath]);
            aTempObj.SetBase(aTempObj.GetBase().ToLowerAscii());
            Reference<XContentIdentifier> xRef1 = new
                    ::ucb::ContentIdentifier( xMSF, aTempObj.GetMainURL());
            aTempObj.SetBase(aTempObj.GetBase().ToUpperAscii());
            Reference<XContentIdentifier> xRef2 = new
                    ::ucb::ContentIdentifier( xMSF, aTempObj.GetMainURL());

            ContentBroker& rBroker = *ContentBroker::get();

            Reference<XContentProvider > xProv = rBroker.getContentProviderInterface();
            sal_Int32 nCompare = xProv->compareContentIds( xRef1, xRef2 );
            bCaseSensitive = nCompare != 0;
        }
        catch(...)
        {
        }

        if( !bCaseSensitive &&
                rInt.CompareEqual( rGroup, sTemp.GetToken(0, GLOS_DELIM),
                                    INTN_COMPARE_IGNORECASE))
        {
            rGroup = sTemp;
            return sal_True;
        }
    }
    return sal_False;
}
/* ---------------------------------------------------------------------------

 ---------------------------------------------------------------------------*/

String SwGlossaries::GetGroupName(sal_uInt16 nGroupId)
{
    ASSERT(nGroupId < pGlosArr->Count(), Textbausteinarray ueberindiziert);
    return *(*pGlosArr)[nGroupId];
}
/* -----------------------------08.02.00 13:04--------------------------------

 ---------------------------------------------------------------------------*/
String  SwGlossaries::GetGroupTitle( const String& rGroupName )
{
    String  sRet;
    String sGroup(rGroupName);
    if(STRING_NOTFOUND == sGroup.Search(GLOS_DELIM))
        FindGroupName(sGroup);
    SwTextBlocks* pGroup = GetGroupDoc(sGroup, sal_False);
    if(pGroup)
    {
        sRet = pGroup->GetName();
         PutGroupDoc( pGroup );
    }
    return sRet;
}

/*------------------------------------------------------------------------
    Beschreibung: Liefert das Textbaustein-Dokument der Gruppe rName
------------------------------------------------------------------------*/

SwTextBlocks* SwGlossaries::GetGroupDoc(const String &rName,
                                        sal_Bool bCreate) const
{
        // gfs. in die Liste der Textbausteine eintragen
    if(bCreate && pGlosArr)
    {
        const String aName(rName);
        const sal_uInt16 nCount = pGlosArr->Count();
        for(sal_uInt16 i = 0; i < nCount; ++i)
        {
            const String *pName = (*pGlosArr)[i];
            if(*pName == aName)
                break;
        }
        if(i == nCount)
        {   // Baustein nicht in der Liste
            String *pTmp = new String(aName);
            pGlosArr->Insert(pTmp, pGlosArr->Count());
        }
    }
    return GetGlosDoc( rName, bCreate );
}

/*------------------------------------------------------------------------
 Beschreibung:  Loeschen Textblock
------------------------------------------------------------------------*/

void SwGlossaries::PutGroupDoc(SwTextBlocks *pBlock) {
    delete pBlock;
}
/*------------------------------------------------------------------------
    Beschreibung:   Erzeugt ein neues Dokument mit dem Gruppenname
                    Wird temp. auch als File angelegt, damit die
                    Gruppen auch spaeter (ohne Zugriff) vorhanden sind.
------------------------------------------------------------------------*/


sal_Bool SwGlossaries::NewGroupDoc(String& rGroupName, const String& rTitle)
{
    sal_uInt16 nNewPath = rGroupName.GetToken(1, GLOS_DELIM).ToInt32();
    String sNewFilePath(*(*pPathArr)[nNewPath]);
    String sNewGroup = lcl_CheckFileName(sNewFilePath, rGroupName.GetToken(0, GLOS_DELIM));
    sNewGroup += GLOS_DELIM;
    sNewGroup += rGroupName.GetToken(1, GLOS_DELIM);
    SwTextBlocks *pBlock = GetGlosDoc( sNewGroup );
    if(pBlock)
    {
        String *pTmp =
            new String(sNewGroup);
        SvStrings* pList = GetNameList();
        pList->Insert(pTmp, pList->Count());
        pBlock->SetName(rTitle);
        PutGroupDoc(pBlock);
        rGroupName = sNewGroup;
        rGroupName += GLOS_DELIM;
        rGroupName += String::CreateFromInt32(nNewPath);
        return sal_True;
    }
    return sal_False;
}
/* -----------------23.11.98 13:13-------------------
 *
 * --------------------------------------------------*/
sal_Bool    SwGlossaries::RenameGroupDoc(
    const String& rOldGroup, String& rNewGroup, const String& rNewTitle)
{
    sal_Bool bRet = sal_False;
    sal_uInt16 nOldPath = rOldGroup.GetToken(1, GLOS_DELIM).ToInt32();
    if(nOldPath < pPathArr->Count())
    {
        String sOldFileURL(*(*pPathArr)[nOldPath]);
        sOldFileURL += INET_PATH_TOKEN;
        sOldFileURL += rOldGroup.GetToken(0, GLOS_DELIM);
        sOldFileURL.AppendAscii(pGlosExt);
        BOOL bExist = FALSE;
        try
        {
            ::ucb::Content aTestContent(    sOldFileURL ,
                                            uno::Reference< XCommandEnvironment >());
            bExist = aTestContent.isDocument();
        }
        catch(...)
        {
        }
        DBG_ASSERT(bExist, "Gruppe existiert nicht!")
        if(bExist)
        {
            sal_uInt16 nNewPath = rNewGroup.GetToken(1, GLOS_DELIM).ToInt32();
            if( nNewPath < pPathArr->Count())
            {
                String sNewFilePath(*(*pPathArr)[nNewPath]);
                String sNewFileName = lcl_CheckFileName(
                                    sNewFilePath, rNewGroup.GetToken(0, GLOS_DELIM));
                //String aTmp( rNewGroup.GetToken(0, GLOS_DELIM));
                const sal_uInt16 nFileNameLen = sNewFileName.Len();
                sNewFileName.AppendAscii(pGlosExt);
                String sTempNewFilePath(sNewFilePath);
                sTempNewFilePath += INET_PATH_TOKEN;
                sTempNewFilePath += sNewFileName ;
                BOOL bExist = FALSE;
                try
                {
                    ::ucb::Content aTestContent( sTempNewFilePath,
                                                    uno::Reference< XCommandEnvironment >());
                    bExist = aTestContent.isDocument();
                }
                catch(...)
                {
                }
                DBG_ASSERT(!bExist, "Gruppe existiert bereits!")
                if(!bExist)
                {
                    BOOL bCopyCompleted = TRUE;
                    try
                    {
                        ::ucb::Content aTempContent(sNewFilePath,
                                                    Reference< XCommandEnvironment > ());

                        Any aAny;
                        TransferInfo aInfo;
                        aInfo.NameClash = NameClash::ERROR;
                        aInfo.NewTitle = sNewFileName;
                        aInfo.SourceURL = sOldFileURL;
                        aInfo.MoveData  = TRUE;

                        aAny <<= aInfo;
                        aTempContent.executeCommand( rtl::OUString::createFromAscii( "transfer" ),
                                            aAny);
                    }
                    catch( Exception& rEx )
                    {
                        bCopyCompleted = FALSE;
                    }
                    if(bCopyCompleted)
                    {
                        bRet = sal_True;
                        lcl_RemoveFileFromList(pGlosArr, aGlosEntryArr, aGlosGroupArr, rOldGroup);
                        rNewGroup = sNewFileName.Copy(0, nFileNameLen);
                        rNewGroup += GLOS_DELIM;
                        rNewGroup += String::CreateFromInt32(nNewPath);
                        String *pTmp = new String(rNewGroup);
                        if(!pGlosArr)
                            GetNameList();
                        else
                            pGlosArr->Insert(pTmp, pGlosArr->Count());

                        sNewFilePath += INET_PATH_TOKEN;
                        sNewFilePath += sNewFileName ;
                        SwTextBlocks* pNewBlock = new SwTextBlocks( sNewFilePath );
                        pNewBlock->SetName(rNewTitle);
                        delete pNewBlock;
                    }
                }
            }
        }
    }
    return bRet;
}

/*------------------------------------------------------------------------
    Beschreibung: Loescht eine Textbausteingruppe
------------------------------------------------------------------------*/


sal_Bool SwGlossaries::DelGroupDoc(const String &rName)
{
    sal_uInt16 nPath = rName.GetToken(1, GLOS_DELIM).ToInt32();
    if(nPath >= pPathArr->Count())
        return sal_False;
    String sFileURL(*(*pPathArr)[nPath]);
    String aTmp( rName.GetToken(0, GLOS_DELIM));

    String aName(aTmp);
    aName += GLOS_DELIM;
    aName += String::CreateFromInt32(nPath);

    aTmp.AppendAscii(pGlosExt);
    sFileURL += INET_PATH_TOKEN;
    sFileURL += aTmp;
        // Auch, wenn das File nicht existiert, muss es aus der Liste
        // der Textbausteinbereiche entfernt werden
    // Kein && wegen CFfront
#ifdef DBG_UTIL
    BOOL bRemoved = FALSE;
#endif
    try
    {
        ::ucb::Content aTempContent(sFileURL,
                                    Reference< XCommandEnvironment > ());
        aTempContent.executeCommand( rtl::OUString::createFromAscii( "delete" ),
                            makeAny( sal_Bool( sal_True ) ) );
#ifdef DBG_UTIL
        bRemoved = TRUE;
#endif
    }
    catch( ... )
    {
        DBG_ERRORFILE( "Exception" );
    }
    DBG_ASSERT(bRemoved, "file has not been removed")
    return lcl_RemoveFileFromList(pGlosArr, aGlosEntryArr, aGlosGroupArr, aName);
}
/*------------------------------------------------------------------------
    Beschreibung: DTOR
------------------------------------------------------------------------*/


SwGlossaries::~SwGlossaries()
{
    sal_uInt16 nCount = pGlosArr? pGlosArr->Count() : 0;
    for(sal_uInt16 i = 0; i < nCount; ++i)
    {
        String *pTmp = (*pGlosArr)[i];
        delete pTmp;
    }
    nCount = pPathArr? pPathArr->Count() : 0;
    for(i = 0; i < nCount; ++i)
    {
        String *pTmp = (*pPathArr)[i];
        delete pTmp;
    }
    delete pGlosArr;
    delete pPathArr;
    nCount = aGlosGroupArr.Count();
    for(i = 0; i < nCount; ++i)
    {
        text::XAutoTextGroup* pGroup = aGlosGroupArr.GetObject(i)->get();
        ((SwXAutoTextGroup*)pGroup)->Invalidate();
    }
    nCount = aGlosEntryArr.Count();
    for(i = 0; i < nCount; ++i)
    {
        uno::Reference< uno::XInterface > * pxEntry = aGlosEntryArr.GetObject(i);
        uno::Reference< lang::XUnoTunnel > xTunnel(*pxEntry, uno::UNO_QUERY);
        DBG_ASSERT(xTunnel.is(), "No tunnel for SwXAutoTextEntry?");
        SwXAutoTextEntry* pEntry =
            (SwXAutoTextEntry*)xTunnel->getSomething(SwXAutoTextEntry::getUnoTunnelId());
        pEntry->Invalidate();
    }
}
/*------------------------------------------------------------------------
    Beschreibung: Bausteindokument einlesen
------------------------------------------------------------------------*/


SwTextBlocks* SwGlossaries::GetGlosDoc( const String &rName, sal_Bool bCreate ) const
{
    sal_uInt16 nPath = rName.GetToken(1, GLOS_DELIM).ToInt32();
    SwTextBlocks *pTmp = 0;
    if(nPath < pPathArr->Count())
    {
        String sFileURL(*(*pPathArr)[nPath]);
        String aTmp( rName.GetToken(0, GLOS_DELIM));
        aTmp.AppendAscii(pGlosExt);
        sFileURL += INET_PATH_TOKEN;
        sFileURL += aTmp;

        BOOL bExist = FALSE;
        if(!bCreate)
        {
            try
            {
                ::ucb::Content aTestContent(sFileURL,
                                            uno::Reference< XCommandEnvironment >());
                bExist = aTestContent.isDocument();
            }
            catch(...)
            {
                bExist = FALSE;
            }
        }

        if (bCreate || bExist)
        {
            pTmp = new SwTextBlocks( sFileURL );
            sal_Bool bOk = sal_True;
            if( pTmp->GetError() )
            {
                ErrorHandler::HandleError( pTmp->GetError() );
                bOk = !IsError( pTmp->GetError() );
            }

            if( bOk && !pTmp->GetName().Len() )
                pTmp->SetName( rName );
        }
    }

    return pTmp;
}

/*------------------------------------------------------------------------
    Beschreibung: Zugriff auf die Liste der Name; diese wird gfs. eingelesen
------------------------------------------------------------------------*/


SvStrings* SwGlossaries::GetNameList()
{
    if(!pGlosArr)
    {
        pGlosArr = new SvStrings;
        for(sal_uInt16 i = 0; i < pPathArr->Count(); i++)
        {
                  try
                {
                    ::ucb::Content aCnt(*(*pPathArr)[i],
                                        uno::Reference< XCommandEnvironment >());
                       Reference< sdbc::XResultSet > xResultSet;
                      Sequence< OUString > aProps(1);
                    OUString* pProps = aProps.getArray();
                    pProps[ 0 ] = OUString::createFromAscii( "Title" );
                    try
                    {
                           xResultSet = aCnt.createCursor(
                                        aProps, ::ucb::INCLUDE_DOCUMENTS_ONLY );
                    }
                    catch ( Exception )
                    {
                        DBG_ERRORFILE( "create cursor failed!" );
                    }

                    if ( aCnt.isFolder() && xResultSet.is() )
                    {
                          Reference< sdbc::XRow > xRow( xResultSet, UNO_QUERY );
                        Reference< XContentAccess >
                        xContentAccess( xResultSet, UNO_QUERY );
                        try
                        {
                            if ( xResultSet->first() )
                            {
                                do
                                {
//                                  OUString sId( xContentAccess->queryContentIdentfierString() );
                                    // an den Gruppennamen wird der Pfad-Index angehaengt
                                    // damit spaeter richtig zugegriffen werden kann
                                    String sTitle = xRow->getString( 1 );
                                    String sExt;
                                    if(sTitle.Len() > 4)  //length of ".bau"
                                    {
                                        String sExt  = sTitle.Copy( sTitle.Len() - 4, 4);
                                        if(sExt.EqualsIgnoreCaseAscii(pGlosExt))
                                        {
                                            sTitle.Erase( sTitle.Len() - 4, 4);
                                            sTitle += GLOS_DELIM;
                                            sTitle += String::CreateFromInt32(i);
                                            String *pTitle = new String(sTitle);
                                            pGlosArr->Insert(pTitle, pGlosArr->Count());
                                        }
                                    }
                                }
                                while ( xResultSet->next() );
                              }
                        }
                        catch ( ... )
                        {
                            DBG_ERRORFILE( "Exception caught!" );
                        }
                    }
                }
                catch ( ... )
                {
                    DBG_ERRORFILE( "Exception caught!" );
                }
            }

        if(!pGlosArr->Count())
        {
            // Der Standard-Baustein steht im ersten Teil des Pfades
            String *pTmp = new String(C2S(pDefName));
            (*pTmp) += GLOS_DELIM;
            (*pTmp) += '0';
            pGlosArr->Insert(pTmp, pGlosArr->Count());
        }
    }
    return pGlosArr;
}

/*------------------------------------------------------------------------
    Beschreibung: CTOR
------------------------------------------------------------------------*/


SwGlossaries::SwGlossaries() :
    pGlosArr(0),
    pPathArr(0)
{
    pPathArr = new SvStrings;
    UpdateGlosPath(sal_True);
}

/*------------------------------------------------------------------------
    Beschreibung: Neuen Pfad einstellen und internes Array neu aufbauen
------------------------------------------------------------------------*/

/* -----------------21.01.99 15:36-------------------
*   #61050# Doppelte Pfade fuehren zu Verwirrung - als raus damit
 * --------------------------------------------------*/
sal_Bool lcl_FindSameEntry(const SvStrings& rDirArr, const String& rEntryURL)
{
    sal_uInt16 nSize = rDirArr.Count();
    for(sal_uInt16 i = 0; i < rDirArr.Count(); i++)
        if(rEntryURL == (*rDirArr.GetObject(i)))
            return sal_True;
    return sal_False;
}

void SwGlossaries::UpdateGlosPath(sal_Bool bFull)
{
    String aNewPath( SFX_INIMANAGER()->Get( SFX_KEY_GLOSSARY_PATH ) );
    sal_Bool bPathChanged = aPath != aNewPath;
    if (bFull || bPathChanged)
    {
        aPath = aNewPath;
        sal_uInt16 nCount = pPathArr? pPathArr->Count() : 0;
        for(sal_uInt16 i = nCount; i; --i)
        {
            String *pTmp = (*pPathArr)[i - 1];
            pPathArr->Remove(i - 1);
            delete pTmp;
        }
        String sErrPath;
        sal_uInt16 nTokenCount = aPath.GetTokenCount(SFX_SEARCHPATH_DELIMITER);
        SvStrings aDirArr;
        for( i = 0; i < nTokenCount; i++ )
        {
            String sPth(aPath.GetToken(i, SFX_SEARCHPATH_DELIMITER));
            sPth = URIHelper::SmartRelToAbs(sPth);

            if(i && lcl_FindSameEntry(aDirArr, sPth))
            {
                continue;
            }
            aDirArr.Insert(new String(sPth), aDirArr.Count());
            BOOL bExists = FALSE;
            try
            {
                ::ucb::Content aTestContent(sPth, uno::Reference< XCommandEnvironment >());
                bExists = aTestContent.isFolder();
            }
            catch(...)
            {
                DBG_ERROR("exception <getPropertyValue(IsFolder)>")
            }

            if(!bExists)
            {
                if(sErrPath.Len())
                    sErrPath += SFX_SEARCHPATH_DELIMITER;
                INetURLObject aTemp(sPth);
                sErrPath += aTemp.GetFull();

            }
            else
                pPathArr->Insert(new String(sPth), pPathArr->Count());
        }
        aDirArr.DeleteAndDestroy(0, aDirArr.Count());

        if(!nTokenCount ||
            sErrPath.Len() && (bPathChanged || sOldErrPath != sErrPath) )
        {
            sOldErrPath = sErrPath;
            // Falscher Pfad, d.h. AutoText-Verzeichnis existiert nicht

            ErrorHandler::HandleError( *new StringErrorInfo(
                                    ERR_AUTOPATH_ERROR, sErrPath,
                                    ERRCODE_BUTTON_OK | ERRCODE_MSG_ERROR ));
            bError = sal_True;
        }
        else
            bError = sal_False;

        if(pGlosArr)
        {
            const sal_uInt16 nCount = pGlosArr->Count();
            for(sal_uInt16 i = 0; i < nCount; ++i)
            {
                delete (String *)(*pGlosArr)[i];
            }
            DELETEZ(pGlosArr);
            GetNameList();
        }
    }
}

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/


void SwGlossaries::ShowError()
{
    sal_uInt32 nPathError = *new StringErrorInfo(ERR_AUTOPATH_ERROR,
                                            sErrPath, ERRCODE_BUTTON_OK );
    ErrorHandler::HandleError( nPathError );
}
/* -----------------------------09.02.00 11:37--------------------------------

 ---------------------------------------------------------------------------*/
String  SwGlossaries::GetExtension()
{
    return C2S(aExt);
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.115  2000/09/18 16:05:56  willem.vandorp
    OpenOffice header added.

    Revision 1.114  2000/08/08 10:37:27  os
    #77403# rename of AutoText category repaired

    Revision 1.113  2000/08/08 10:14:48  os
    ucb transfer command used

    Revision 1.112  2000/08/07 08:52:02  os
    #77227# '_' allowed in glossary names

    Revision 1.111  2000/07/20 15:24:37  jp
    Bug #77040#: don't create references with stack objects, must always created on the heap

    Revision 1.110  2000/07/13 13:39:40  os
    #76805# ignore case of .bau extension

    Revision 1.109  2000/06/26 13:16:26  os
    INetURLObject::SmartRelToAbs removed

    Revision 1.108  2000/06/20 14:51:24  os
    SUPD removed

    Revision 1.107  2000/06/13 09:57:14  os
    using UCB

    Revision 1.106  2000/06/08 09:47:32  os
    using UCB

    Revision 1.105  2000/06/07 13:27:12  os
    using UCB

    Revision 1.104  2000/05/23 19:22:29  jp
    Bugfixes for Unicode

    Revision 1.103  2000/05/19 12:08:36  os
    appending of indices corrected

    Revision 1.102  2000/04/18 15:08:17  os
    UNICODE

    Revision 1.101  2000/03/23 07:49:13  os
    UNO III

    Revision 1.100  2000/03/06 08:43:31  os
    #70359# renames glossary groups: return corrected group name

    Revision 1.99  2000/02/22 13:26:49  os
    #73271# always append path index

    Revision 1.98  2000/02/14 14:40:48  os
    #70473# Unicode

    Revision 1.97  2000/02/10 10:34:32  os
    #70359# titles added to AutoText groups

    Revision 1.96  1999/10/21 17:48:55  jp
    have to change - SearchFile with SfxIniManager, dont use SwFinder for this

    Revision 1.95  1999/07/21 14:12:06  JP
    Bug #67779#: set any MsgBoxType at the StringErrorInfo


      Rev 1.94   21 Jul 1999 16:12:06   JP
   Bug #67779#: set any MsgBoxType at the StringErrorInfo

      Rev 1.93   09 Feb 1999 10:47:04   OS
   #61205# AutoText-Gruppen koennen beliebige Namen erhalten

      Rev 1.92   25 Jan 1999 13:40:16   HR
   Insert() jetzt richtig

      Rev 1.91   25 Jan 1999 13:26:44   OS
   #61050# C40_INSERT

      Rev 1.90   21 Jan 1999 15:45:40   OS
   #61050# doppelte Pfade abfangen

      Rev 1.89   10 Dec 1998 15:57:06   OS
   #56371# TF_ONE51 Zwischenstand

      Rev 1.88   27 Nov 1998 13:57:38   OS
   #59548# illegales Sonderzeichen entfernt

      Rev 1.87   24 Nov 1998 08:54:42   OS
   #59548# AutoText-Gruppen umbenennbar

      Rev 1.86   19 Jun 1998 16:34:58   OS
   GetGroupName liefert String, nicht UString

      Rev 1.85   19 Jun 1998 14:55:26   MH
   add: cast

      Rev 1.84   18 Jun 1998 18:17:42   OS
   Array fuer Textbausteine

      Rev 1.83   16 Jun 1998 16:49:36   OS
   AutoText-interface verbessert

      Rev 1.82   27 May 1998 17:08:18   OM
   Uno ::com::sun::star::text::AutoTextContainer

      Rev 1.81   17 Feb 1998 14:29:42   RG
   Mac: sysdep raus

      Rev 1.80   16 Dec 1997 18:14:18   JP
   GetSearchDelim gegen SFX_SEARCH_DELIMITER ausgetauscht

      Rev 1.79   28 Nov 1997 19:57:08   MA
   includes

      Rev 1.78   24 Nov 1997 16:47:46   MA
   includes

      Rev 1.77   03 Nov 1997 13:22:40   MA
   precomp entfernt

      Rev 1.76   10 Oct 1997 12:28:38   OS
   vollstaendige Pfadpruefung

      Rev 1.75   07 Oct 1997 07:28:56   OS
   Path-Index ueberpruefen #44360#

      Rev 1.74   26 Aug 1997 16:02:16   TRI
   VCL Anpassungen

      Rev 1.73   30 Jul 1997 18:33:30   HJS
   includes

      Rev 1.72   30 Jul 1997 11:27:32   OM
   #41772# Bereich einfuegen und sofort wieder loeschen

      Rev 1.71   17 Jun 1997 10:16:18   OS
   Leerstring als AutoText-Pfad ueberleben

      Rev 1.70   10 Jun 1997 14:38:52   OS
   AutoText aus mehreren Verzeichnissen

      Rev 1.69   23 Oct 1996 13:49:30   JP
   SVMEM -> SVSTDARR Umstellung

      Rev 1.68   18 Oct 1996 13:49:04   JP
   GetGlosDoc: defaultetes Flag entfernt

      Rev 1.67   26 Sep 1996 20:24:58   HJS
   del: pDBAddress und aDBAddress

      Rev 1.66   26 Sep 1996 16:59:14   OS
   +default-Extension fuer Autotexte in swtypes

      Rev 1.65   30 Aug 1996 12:38:34   OS
   UpdateGlosPath kann Blockliste aktualisieren

      Rev 1.64   28 Aug 1996 14:12:16   OS
   includes

      Rev 1.63   03 Jul 1996 13:11:32   OS
   UpdateGlosPath: Ohne das Array zu loeschen, wird es nichts

      Rev 1.62   19 Jun 1996 12:32:38   OM
   Umstellung auf 323

      Rev 1.61   14 Dec 1995 23:00:38   JP
   Filter Umstellung: ErrorHandling und Read/Write-Parameter

      Rev 1.60   13 Dec 1995 17:19:48   MA
   opt: International

      Rev 1.59   30 Nov 1995 16:26:08   JP
   Umstellung SV304 - ErrorHandling

      Rev 1.58   24 Nov 1995 16:58:48   OM
   PCH->PRECOMPILED

      Rev 1.57   16 Nov 1995 18:45:36   OM
   Methoden zur Fehlerbehandlung

      Rev 1.56   26 Oct 1995 18:08:40   JP
   Umstellung auf SfxErrorHandler

      Rev 1.55   03 Oct 1995 10:16:20   JP
   FAR_DATA auf den String und nicht auf den Pointer

      Rev 1.54   07 Sep 1995 07:21:16   OS
    ',' in PM2-ifdef

------------------------------------------------------------------------*/

diff --git a/sw/source/ui/misc/glossary.cxx b/sw/source/ui/misc/glossary.cxx
new file mode 100644
index 0000000..26c582d
--- /dev/null
+++ b/sw/source/ui/misc/glossary.cxx
@@ -0,0 +1,1433 @@
/*************************************************************************
 *
 *  $RCSfile: glossary.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:44 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#define _SVSTDARR_STRINGSDTOR
#define _SVSTDARR_STRINGS

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _UIPARAM_HXX
#include <uiparam.hxx>
#endif

#ifndef _MENU_HXX //autogen
#include <vcl/menu.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _HELP_HXX //autogen
#include <vcl/help.hxx>
#endif
#ifndef _SVSTDARR_HXX
#include <svtools/svstdarr.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _SFXINIMGR_HXX //autogen
#include <svtools/iniman.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SFX_INIMGR_HXX //autogen
#include <sfx2/inimgr.hxx>
#endif
#ifndef _IODLG_HXX
#include <sfx2/iodlg.hxx>
#endif
#ifndef _SFX_FCONTNR_HXX
#include <sfx2/fcontnr.hxx>
#endif
#ifndef _SVX_MULTIPAT_HXX //autogen
#include <svx/multipat.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _OFAACCFG_HXX //autogen
#include <offmgr/ofaaccfg.hxx>
#endif

#ifndef _DOC_HXX //autogen wg. SwDoc
#include <doc.hxx>
#endif
#ifndef _UNOCRSR_HXX //autogen wg. SwUnoCrsr
#include <unocrsr.hxx>
#endif
#ifndef _UNOTOOLS_HXX
#include <unotools.hxx>
#endif
#ifndef _UNOOBJ_HXX
#include <unoobj.hxx>
#endif
#ifndef _UNOTOOLS_PROCESSFACTORY_HXX_
#include <unotools/processfactory.hxx>
#endif
#ifndef _UCBHELPER_CONTENT_HXX
#include <ucbhelper/content.hxx>
#endif
#ifndef _COM_SUN_STAR_TEXT_XAUTOTEXTGROUP_HPP_
#include <com/sun/star/text/XAutoTextGroup.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XAUTOTEXTENTRY_HPP_
#include <com/sun/star/text/XAutoTextEntry.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XAUTOTEXTCONTAINER_HPP_
#include <com/sun/star/text/XAutoTextContainer.hpp>
#endif
#ifndef _COM_SUN_STAR_LANG_XMULTISERVICEFACTORY_HPP_
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#endif
#ifndef _COM_SUN_STAR_LANG_XSINGLESERVICEFACTORY_HPP_
#include <com/sun/star/lang/XSingleServiceFactory.hpp>
#endif
#ifndef SVTOOLS_URIHELPER_HXX
#include <svtools/urihelper.hxx>
#endif
#ifndef _UNOTOOLS_CHARCLASS_HXX
#include <unotools/charclass.hxx>
#endif

#ifndef _SWWAIT_HXX
#include <swwait.hxx>
#endif
#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _BASESH_HXX
#include <basesh.hxx>
#endif
#ifndef _GLOSSARY_HXX
#include <glossary.hxx>
#endif
#ifndef _GLOSHDL_HXX
#include <gloshdl.hxx>
#endif
#ifndef _GLOSBIB_HXX
#include <glosbib.hxx>
#endif
#ifndef _INITUI_HXX
#include <initui.hxx>                   // fuer ::GetGlossaries()
#endif
#ifndef _GLOSDOC_HXX
#include <glosdoc.hxx>
#endif
#ifndef _MACASSGN_HXX
#include <macassgn.hxx>
#endif
#ifndef _SWEVENT_HXX
#include <swevent.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _SHELLIO_HXX
#include <shellio.hxx>
#endif

#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _HELPID_H
#include <helpid.h>
#endif
#ifndef _SWERROR_H
#include <swerror.h>
#endif
#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif
#ifndef _MISC_HRC
#include <misc.hrc>
#endif
#ifndef _GLOSSARY_HRC
#include <glossary.hrc>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _MODOPT_HXX
#include <modcfg.hxx>
#endif
#ifndef _URLOBJ_HXX
#include <tools/urlobj.hxx>
#endif

#define LONG_LENGTH 60
#define SHORT_LENGTH 30

using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::text;
using namespace ::com::sun::star::ucb;
using namespace ::utl;
using namespace ::ucb;
using namespace ::rtl;

/* -----------------------------08.02.00 10:28--------------------------------

 ---------------------------------------------------------------------------*/
struct GroupUserData
{
    String      sGroupName;
    sal_uInt16  nPathIdx;
    BOOL        bReadonly;

    GroupUserData()
        : nPathIdx(0),
          bReadonly(FALSE)  {}
};

/*------------------------------------------------------------------------
 Beschreibung:  Dialog fuer neuen Bausteinnamen
------------------------------------------------------------------------*/
class SwNewGlosNameDlg : public ModalDialog
{
    FixedText       aNNFT;
    Edit            aNewName;
    FixedText       aNSFT;
    NoSpaceEdit     aNewShort;
    OKButton        aOk;
    CancelButton    aCancel;
     GroupBox       aGrp;
    FixedText       aONFT;
    Edit            aOldName;
    FixedText       aOSFT;
    Edit            aOldShort;

protected:
    DECL_LINK( Modify, Edit * );
    DECL_LINK( Rename, Button * );

public:
    SwNewGlosNameDlg( Window* pParent,
                      const String& rOldName,
                      const String& rOldShort );

    String GetNewName()  const { return aNewName.GetText(); }
    String GetNewShort() const { return aNewShort.GetText(); }
};

SwNewGlosNameDlg::SwNewGlosNameDlg(Window* pParent,
                            const String& rOldName,
                            const String& rOldShort ) :
    ModalDialog( pParent, SW_RES( DLG_RENAME_GLOS ) ),
    aOk     (this, SW_RES( BT_OKNEW)),
    aCancel (this, SW_RES( BT_CANCEL)),
    aONFT   (this, SW_RES( FT_ON    )),
    aOSFT   (this, SW_RES( FT_OS    )),
    aNNFT   (this, SW_RES( FT_NN    )),
    aNSFT   (this, SW_RES( FT_NS    )),
    aOldName(this, SW_RES( ED_ON    )),
    aOldShort(this,SW_RES( ED_OS    )),
    aNewName(this, SW_RES( ED_NN    )),
    aNewShort(this,SW_RES( ED_NS    )),
    aGrp    (this, SW_RES( GB_NN    ))
{
    FreeResource();
    aOldName.SetText( rOldName );
    aOldShort.SetText( rOldShort );
    aNewShort.SetMaxTextLen(SHORT_LENGTH);
    aNewName.SetMaxTextLen(LONG_LENGTH);
    aNewName.SetModifyHdl(LINK(this, SwNewGlosNameDlg, Modify ));
    aNewShort.SetModifyHdl(LINK(this, SwNewGlosNameDlg, Modify ));
    aOk.SetClickHdl(LINK(this, SwNewGlosNameDlg, Rename ));
    aNewName.GrabFocus();
}

/*------------------------------------------------------------------------
 Beschreibung:  aktuell eingestellte Gruppe erfragen / setzen
------------------------------------------------------------------------*/

String SwGlossaryDlg::GetCurrGroup()
{
    if( pCurrGlosGroup && pCurrGlosGroup->Len() )
        return *pCurrGlosGroup;
    return SwGlossaries::GetDefName();
}



void SwGlossaryDlg::SetActGroup(const String &rGrp)
{
    if( !pCurrGlosGroup )
        pCurrGlosGroup = new String;
    *pCurrGlosGroup = rGrp;
}



SwGlossaryDlg::SwGlossaryDlg(SfxViewFrame* pViewFrame,
                            SwGlossaryHdl * pGlosHdl, SwWrtShell *pWrtShell) :

    SvxStandardDialog(&pViewFrame->GetWindow(), SW_RES(DLG_GLOSSARY)),
    aExampleGB    (this, SW_RES(GB_EXAMPLE  )),
    aExampleWIN   (this, SW_RES(WIN_EXAMPLE )),
    aShowExampleCB(this, SW_RES(CB_SHOW_EXAMPLE )),
    aInsertTipCB  (this, SW_RES(CB_INSERT_TIP)),
    aNameLbl      (this, SW_RES(FT_NAME)),
    aNameED       (this, SW_RES(ED_NAME)),
    aShortNameLbl (this, SW_RES(FT_SHORTNAME)),
    aShortNameEdit(this, SW_RES(ED_SHORTNAME)),
    aCategoryBox  (this, SW_RES(LB_BIB)),
    aGlossaryFrm  (this, SW_RES(GB_GLOSSARY)),
    aFileRelCB    (this, SW_RES(CB_FILE_REL)),
    aNetRelCB     (this, SW_RES(CB_NET_REL)),
    aRelativeGB    (this, SW_RES(GB_RELATIVE)),
    aInsertBtn    (this, SW_RES(PB_INSERT)),
    aEditBtn      (this, SW_RES(PB_EDIT)),
    aBibBtn       (this, SW_RES(PB_BIB)),
    aPathBtn      (this, SW_RES(PB_PATH)),
    aCloseBtn     (this, SW_RES(PB_CLOSE)),
    aHelpBtn      (this, SW_RES(PB_HELP)),
    sReadonlyPath (SW_RES(ST_READONLY_PATH)),
    pMenu         (new PopupMenu(SW_RES(MNU_EDIT))),
    pGlossaryHdl  (pGlosHdl),
    pSh           (pWrtShell),
    pExampleFrame(0),
    bSelection( pWrtShell->IsSelection() ),
    bReadOnly( sal_False ),
    bIsOld( sal_False ),
    bIsDocReadOnly(sal_False)
{
    // Static-Pointer initialisieren
    if( !pCurrGlosGroup )
        pCurrGlosGroup = new String;//(SwGlossaries::GetDefName());

    pMenu->SetActivateHdl(LINK(this,SwGlossaryDlg,EnableHdl));
    pMenu->SetSelectHdl(LINK(this,SwGlossaryDlg,MenuHdl));
    aEditBtn.SetPopupMenu(pMenu);
    aEditBtn.SetSelectHdl(LINK(this,SwGlossaryDlg,EditHdl));
    aPathBtn.SetClickHdl(LINK(this, SwGlossaryDlg, PathHdl));

    aNameED.SetModifyHdl(LINK(this,SwGlossaryDlg,NameModify));
    aShortNameEdit.SetModifyHdl(LINK(this,SwGlossaryDlg,NameModify));

    aCategoryBox.SetDoubleClickHdl(LINK(this,SwGlossaryDlg, NameDoubleClick));
    aCategoryBox.SetSelectHdl(LINK(this,SwGlossaryDlg,GrpSelect));
    aBibBtn.SetClickHdl(LINK(this,SwGlossaryDlg,BibHdl));
    aShowExampleCB.SetClickHdl(LINK(this, SwGlossaryDlg, ShowPreviewHdl));

    aShortNameEdit.SetMaxTextLen(SHORT_LENGTH);
    aNameED.SetMaxTextLen(LONG_LENGTH);
    FreeResource();

    aShowExampleCB.Check( SW_MOD()->GetModuleConfig()->IsShowAutoTextPreview());
    ShowPreviewHdl(&aShowExampleCB);

    bIsDocReadOnly = pSh->GetView().GetDocShell()->IsReadOnly() ||
                      pSh->HasReadonlySel();
    if( bIsDocReadOnly )
        aInsertBtn.Enable(sal_False);
    aNameED.GrabFocus();
    aCategoryBox.SetHelpId(HID_MD_GLOS_CATEGORY);
    aCategoryBox.SetWindowBits(WB_HASBUTTONS|WB_HASBUTTONSATROOT|WB_HSCROLL|WB_VSCROLL|WB_CLIPCHILDREN|WB_SORT);
    aCategoryBox.GetModel()->SetSortMode(SortAscending);
    aCategoryBox.SetHighlightRange();   // ueber volle Breite selektieren
    Bitmap aRootClosed      (SW_RES(BMP_ROOT_CLOSED));
    Bitmap aRootOpened      (SW_RES(BMP_ROOT_OPENED));
    aCategoryBox.SetNodeBitmaps( aRootClosed, aRootOpened );

    Init();
}
/*--------------------------------------------------------------------
     Beschreibung:
 --------------------------------------------------------------------*/


SwGlossaryDlg::~SwGlossaryDlg()
{
    SW_MOD()->GetModuleConfig()->SetShowAutoTextPreview(aShowExampleCB.IsChecked());
    aCategoryBox.Clear();
    aEditBtn.SetPopupMenu(0);
    delete pMenu;
    delete pExampleFrame;
}
/*------------------------------------------------------------------------
 Beschreibung:  Auswahl neue Gruppe
------------------------------------------------------------------------*/


IMPL_LINK( SwGlossaryDlg, GrpSelect, SvTreeListBox *, pBox )
{
    SvLBoxEntry* pEntry = pBox->FirstSelected();
    if(!pEntry)
        return 0;
    SvLBoxEntry* pParent = pBox->GetParent(pEntry) ? pBox->GetParent(pEntry) : pEntry;
    GroupUserData* pGroupData = (GroupUserData*)pParent->GetUserData();
    (*pCurrGlosGroup) = pGroupData->sGroupName;
    (*pCurrGlosGroup) += GLOS_DELIM;
    (*pCurrGlosGroup) += String::CreateFromInt32(pGroupData->nPathIdx);
    pGlossaryHdl->SetCurGroup(*pCurrGlosGroup);
    const sal_uInt16 nCount = pGlossaryHdl->GetGlossaryCnt();
    // Aktuellen Textbaustein setzen
    bReadOnly = pGlossaryHdl->IsReadOnly();
    EnableShortName( !bReadOnly );
    aEditBtn.Enable(!bReadOnly);
    bIsOld = pGlossaryHdl->IsOld();
    if( pParent != pEntry)
    {
        String aName(pBox->GetEntryText(pEntry));
        aNameED.SetText(aName);
        aShortNameEdit.SetText(*(String*)pEntry->GetUserData());
        pEntry = pBox->GetParent(pEntry);
        aInsertBtn.Enable( !bIsDocReadOnly);
        ShowAutoText(*pCurrGlosGroup, aShortNameEdit.GetText());
    }
    else
        ShowAutoText(aEmptyStr, aEmptyStr);
    //Controls aktualisieren
    NameModify(&aShortNameEdit);
    return 0;
}
/*--------------------------------------------------------------------
     Beschreibung:
 --------------------------------------------------------------------*/


void SwGlossaryDlg::Apply()
{
    const String aGlosName(aShortNameEdit.GetText());
    if(aGlosName.Len()) pGlossaryHdl->InsertGlossary(aGlosName);
}
/*--------------------------------------------------------------------
     Beschreibung:
 --------------------------------------------------------------------*/
/* inline */ void SwGlossaryDlg::EnableShortName(sal_Bool bOn)
{
    aShortNameLbl.Enable(bOn);
    aShortNameEdit.Enable(bOn);
}

/* -----------------26.11.98 16:15-------------------
 * existiert der Titel in der ausgewaehlten Gruppe?
 * --------------------------------------------------*/
SvLBoxEntry* SwGlossaryDlg::DoesBlockExist(const String& rBlock,
                const String& rShort)
{
    //evtl. vorhandenen Eintrag in der TreeListBox suchen
    SvLBoxEntry* pEntry = aCategoryBox.FirstSelected();
    DBG_ASSERT(pEntry, "keine Selektion?")
    if(aCategoryBox.GetParent(pEntry))
        pEntry = aCategoryBox.GetParent(pEntry);
    sal_uInt32 nChildCount = aCategoryBox.GetChildCount( pEntry );
    for(sal_uInt32 i = 0; i < nChildCount; i++)
    {
        SvLBoxEntry* pChild = aCategoryBox.GetEntry( pEntry, i );
        if(rBlock == aCategoryBox.GetEntryText(pChild) &&
            (!rShort.Len() || rShort == *(String*)pChild->GetUserData()))
        {
            return pChild;
        }
    }
    return 0;
}

/*--------------------------------------------------------------------
     Beschreibung:
 --------------------------------------------------------------------*/


IMPL_LINK( SwGlossaryDlg, NameModify, Edit *, pEdit )
{
    String aName(aNameED.GetText());
    sal_Bool bNameED = pEdit == &aNameED;
    if( !aName.Len() )
    {
        if(bNameED)
            aShortNameEdit.SetText(aName);
        aInsertBtn.Enable(sal_False);
        return 0;
    }
    String sShortSearch;
    if(!bNameED)
        sShortSearch = pEdit->GetText();
    sal_Bool bNotFound = !DoesBlockExist(aName, sShortSearch);
    if(bNameED)
    {
            // ist der Text durch einen Klick in die Listbox in das
            // Edit gekommem?
        if(bNotFound)
        {
            sal_uInt16 nSz = aName.Len();
            sal_uInt16 nStart = 1;
            while( aName.GetChar( nStart-1 ) == ' ' && nStart < nSz )
                nStart++;
            String aBuf( aName.GetChar( nStart-1 ));
            for( nStart ; nStart < nSz; ++nStart )
            {
                if( aName.GetChar( nStart-1 ) == ' ' && aName.GetChar( nStart ) != ' ')
                    aBuf += aName.GetChar( nStart );
            }
            aShortNameEdit.SetText(aBuf);
            EnableShortName();
        }
        else
        {
            aShortNameEdit.SetText(pGlossaryHdl->GetGlossaryShortName(aName));
            EnableShortName(!bReadOnly);
        }
        aInsertBtn.Enable(!bNotFound && !bIsDocReadOnly);
    }
    else
    {
        //ShortNameEdit
        if(!bNotFound)
        {
            sal_Bool bEnable = !bNotFound;
            bEnable &= !bIsDocReadOnly;
            aInsertBtn.Enable(bEnable);
        }
    }
    return 0;
}
/*--------------------------------------------------------------------
     Beschreibung:
 --------------------------------------------------------------------*/


IMPL_LINK_INLINE_START( SwGlossaryDlg, NameDoubleClick, SvTreeListBox*, pBox )
{
    SvLBoxEntry* pEntry = pBox->FirstSelected();
    if(pBox->GetParent(pEntry) && !bIsDocReadOnly)
        EndDialog( RET_OK );
    return 0;
}
IMPL_LINK_INLINE_END( SwGlossaryDlg, NameDoubleClick, SvTreeListBox*, EMPTYARG )
/*--------------------------------------------------------------------
     Beschreibung:
 --------------------------------------------------------------------*/


IMPL_LINK( SwGlossaryDlg, EnableHdl, Menu *, pMn )
{
    const String aEditText(aNameED.GetText());
    const sal_Bool bHasEntry = aEditText.Len() && aShortNameEdit.GetText().Len();
    const sal_Bool bExists = 0 != DoesBlockExist(aEditText, aShortNameEdit.GetText());
    pMn->EnableItem(FN_GL_DEFINE, bSelection && bHasEntry && !bExists);
    pMn->EnableItem(FN_GL_DEFINE_TEXT, bSelection && bHasEntry && !bExists);
    pMn->EnableItem(FN_GL_COPY_TO_CLIPBOARD, bExists);
    pMn->EnableItem(FN_GL_REPLACE, bSelection && bExists && !bIsOld );
    pMn->EnableItem(FN_GL_EDIT, bExists );
    pMn->EnableItem(FN_GL_RENAME, bExists && !bIsOld );
    pMn->EnableItem(FN_GL_DELETE, bExists && !bIsOld );
    pMn->EnableItem(FN_GL_MACRO, bExists && !bIsOld  &&
                                    !pGlossaryHdl->IsReadOnly() );

    SvLBoxEntry* pEntry = aCategoryBox.FirstSelected();
    DBG_ASSERT(pEntry, "keine Selektion?")
    sal_Bool bEnable = !aCategoryBox.GetParent( pEntry ) && !bIsOld &&
                        !pGlossaryHdl->IsReadOnly();
    pMn->EnableItem( FN_GL_IMPORT, bEnable );
    return 1;
}
/*--------------------------------------------------------------------
     Beschreibung:
 --------------------------------------------------------------------*/


IMPL_LINK( SwGlossaryDlg, MenuHdl, Menu *, pMn )
{
    sal_Bool bNoAttr = sal_False;

    switch(pMn->GetCurItemId())
    {
        case FN_GL_REPLACE:
            pGlossaryHdl->NewGlossary(  aNameED.GetText(),
                                        aShortNameEdit.GetText() );
        break;
        case FN_GL_DEFINE_TEXT:
            bNoAttr = sal_True;
            // Kein break!!!
        case FN_GL_DEFINE:
        {
            const String aStr(aNameED.GetText());
            const String aShortName(aShortNameEdit.GetText());
            if(pGlossaryHdl->HasShortName(aShortName))
            {
                InfoBox(this, SW_RES(MSG_DOUBLE_SHORTNAME)).Execute();
                aShortNameEdit.SetSelection(Selection(0, SELECTION_MAX));
                aShortNameEdit.GrabFocus();
                break;
            }
            if(pGlossaryHdl->NewGlossary(aStr, aShortName, sal_False, bNoAttr ))
            {
                SvLBoxEntry* pEntry = aCategoryBox.FirstSelected();
                if(aCategoryBox.GetParent(pEntry))
                    pEntry = aCategoryBox.GetParent(pEntry);

                SvLBoxEntry* pChild = aCategoryBox.InsertEntry(aStr, pEntry);
                pChild->SetUserData(new String(aShortName));
                aNameED.SetText(aStr);
                aShortNameEdit.SetText(aShortName);
                NameModify(&aNameED);       // fuer Schalten der Buttons

            }
        }
        break;
        case FN_GL_COPY_TO_CLIPBOARD :
        {
            pGlossaryHdl->CopyToClipboard(*pSh, aShortNameEdit.GetText());
        }
        break;
        case FN_GL_EDIT:
        break;
        case FN_GL_RENAME:
        {
            aShortNameEdit.SetText(pGlossaryHdl->GetGlossaryShortName(aNameED.GetText()));
            SwNewGlosNameDlg* pNewNameDlg = new SwNewGlosNameDlg(this, aNameED.GetText(),
                                            aShortNameEdit.GetText() );
            if(pNewNameDlg->Execute() == RET_OK)
            {
                pGlossaryHdl->Rename( aShortNameEdit.GetText(),
                                        pNewNameDlg->GetNewShort(),
                                        pNewNameDlg->GetNewName());
                SvLBoxEntry* pEntry = aCategoryBox.FirstSelected();
                SvLBoxEntry* pNewEntry = aCategoryBox.InsertEntry(
                        pNewNameDlg->GetNewName(), aCategoryBox.GetParent(pEntry));
                pNewEntry->SetUserData(new String(pNewNameDlg->GetNewShort()));
                delete (String*)pEntry->GetUserData();
                aCategoryBox.GetModel()->Remove(pEntry);
                aCategoryBox.Select(pNewEntry);
                aCategoryBox.MakeVisible(pNewEntry);
            }
            GrpSelect( &aCategoryBox );
            delete pNewNameDlg;
        }
        break;
        case FN_GL_DELETE:
        {
            QueryBox aQuery(this, SW_RES(MSG_QUERY_DELETE));
            if(RET_YES == aQuery.Execute())
            {
                const String aShortName(aShortNameEdit.GetText());
                const String aTitle(aNameED.GetText());
                if(aTitle.Len() && pGlossaryHdl->DelGlossary(aShortName))
                {
                    SvLBoxEntry* pChild = DoesBlockExist(aTitle, aShortName);
                    DBG_ASSERT(pChild, "Eintrag nicht gefunden!")
                    SvLBoxEntry* pParent = aCategoryBox.GetParent(pChild);
                    aCategoryBox.Select(pParent);

                    aCategoryBox.GetModel()->Remove(pChild);
                    aNameED.SetText( aEmptyStr );
                    NameModify(&aNameED);
                }
            }
        }
        break;
        case FN_GL_MACRO:
        {
            SfxItemSet aSet( pSh->GetAttrPool(), RES_FRMMACRO, RES_FRMMACRO );

            SvxMacro aStart(aEmptyStr, aEmptyStr, STARBASIC);
            SvxMacro aEnd(aEmptyStr, aEmptyStr, STARBASIC);
            pGlossaryHdl->GetMacros(aShortNameEdit.GetText(), aStart, aEnd );

            SvxMacroItem aItem;
            if( aStart.GetMacName().Len() )
                aItem.SetMacro( SW_EVENT_START_INS_GLOSSARY, aStart );
            if( aEnd.GetMacName().Len() )
                aItem.SetMacro( SW_EVENT_END_INS_GLOSSARY, aEnd );

            aSet.Put( aItem );

            const SfxPoolItem* pItem;
            SwMacroAssignDlg aMacDlg( this, aSet, MACASSGN_TEXTBAUST );
            if( RET_OK == aMacDlg.Execute() &&
                SFX_ITEM_SET == aMacDlg.GetOutputItemSet()->GetItemState(
                    RES_FRMMACRO, sal_False, &pItem ))
            {
                const SvxMacroTableDtor& rTbl = ((SvxMacroItem*)pItem)->GetMacroTable();

                pGlossaryHdl->SetMacros( aShortNameEdit.GetText(),
                                            rTbl.Get( SW_EVENT_START_INS_GLOSSARY ),
                                            rTbl.Get( SW_EVENT_END_INS_GLOSSARY ) );
            }
        }
        break;

        case FN_GL_IMPORT:
        {
            // call the FileOpenDialog do find WinWord - Files with templates
            SfxFileDialog* pDlg = new SfxFileDialog( this, WB_OPEN | WB_3DLOOK );
            pDlg->SetPath( SFX_INIMANAGER()->Get( SFX_KEY_WORK_PATH ));
            String sWW8( C2S(FILTER_WW8) );

            sal_uInt16 i = 0;

            const SfxFactoryFilterContainer* pFltCnt =
                    SwDocShell::Factory().GetFilterContainer();
            if( pFltCnt )
            {
                const SfxFilter* pFilter;
                sal_uInt16 nCount = pFltCnt->GetFilterCount();
                for( i = 0; i < nCount; ++i )
                    if( ( pFilter = pFltCnt->GetFilter( i ))
                        /*->IsAllowedAsTemplate()
                        && pFilter*/->GetUserData() == sWW8 )
                    {
                        pDlg->AddFilter( pFilter->GetUIName(),
                                ((WildCard&)pFilter->GetWildcard())(),
                                pFilter->GetTypeName() );
                        pDlg->SetCurFilter( pFilter->GetUIName() );
                }
            }

            if( i && RET_OK == pDlg->Execute() )
            {
                if( pGlossaryHdl->ImportGlossaries( pDlg->GetPath() ))
                    Init();
                else
                {
                    InfoBox(this, SW_RES( MSG_NO_GLOSSARIES )).Execute();
                }
            }
            delete pDlg;
        }
           break;

        default:
            return 0;
    }
    return 1;
}
/*--------------------------------------------------------------------
     Beschreibung:  Dialog Verwaltung Bereiche
 --------------------------------------------------------------------*/


IMPL_LINK( SwGlossaryDlg, BibHdl, Button *, EMPTYARG )
{
    SwGlossaries* pGloss = ::GetGlossaries();
    if( pGloss->IsGlosPathErr() )
        pGloss->ShowError();
    else
    {
        //check if at least one glossary path is write enabled
        String sGlosPath( SFX_INIMANAGER()->Get( SFX_KEY_GLOSSARY_PATH ) );
        USHORT nPaths = sGlosPath.GetTokenCount(';');
        BOOL bIsWritable = FALSE;
        for(USHORT nPath = 0; nPath < nPaths; nPath++)
        {
            String sPath = URIHelper::SmartRelToAbs(sGlosPath.GetToken(nPath, ';'));
            try
            {
                Content aTestContent( sPath,
                            uno::Reference< XCommandEnvironment >());
                Any aAny = aTestContent.getPropertyValue( C2U("IsReadOnly") );
                if(aAny.hasValue())
                {
                    bIsWritable = !*(sal_Bool*)aAny.getValue();
                }
            }
            catch(...)
            {}
            if(bIsWritable)
                break;
        }
        if(bIsWritable)
        {

            SwGlossaryGroupDlg *pDlg = new SwGlossaryGroupDlg( this, pGloss->GetPathArray(), pGlossaryHdl );
            if ( RET_OK == pDlg->Execute() )
            {
                Init();
                //if new groups were created - select one of them
                String sNewGroup = pDlg->GetCreatedGroupName();
                SvLBoxEntry* pEntry = aCategoryBox.First();
                while(sNewGroup.Len() && pEntry)
                {
                    if(!aCategoryBox.GetParent(pEntry))
                    {
                        GroupUserData* pGroupData = (GroupUserData*)pEntry->GetUserData();
                        String sGroup = pGroupData->sGroupName;
                        sGroup += GLOS_DELIM;
                        sGroup += String::CreateFromInt32(pGroupData->nPathIdx);
                        if(sGroup == sNewGroup)
                        {
                            aCategoryBox.Select(pEntry);
                            aCategoryBox.MakeVisible(pEntry);
                            GrpSelect(&aCategoryBox);
                            break;
                        }
                    }
                    pEntry = aCategoryBox.Next(pEntry);
                }

            }
            delete pDlg;
        }
        else
        {
            QueryBox aBox(this, WB_YES_NO, sReadonlyPath);
            if(RET_YES == aBox.Execute())
                PathHdl(&aPathBtn);
        }
    }
    return 0;
}

/*------------------------------------------------------------------------
 Beschreibung:  Initialisierung; aus Ctor und nach Bearbeiten Bereiche
------------------------------------------------------------------------*/


void SwGlossaryDlg::Init()
{
    aCategoryBox.SetUpdateMode( sal_False );
    aCategoryBox.Clear();
    // Textbausteinbereiche anzeigen
    const sal_uInt16 nCnt = pGlossaryHdl->GetGroupCnt();
    SvLBoxEntry* pSelEntry = 0;
    const String sSelStr(pCurrGlosGroup->GetToken(0, GLOS_DELIM));
    const sal_uInt16 nSelPath = pCurrGlosGroup->GetToken(1, GLOS_DELIM).ToInt32();
    for(sal_uInt16 nId = 0; nId < nCnt; ++nId )
    {
        String sTitle;
        String sGroupName(pGlossaryHdl->GetGroupName(nId, &sTitle));
        if(!sTitle.Len())
            sTitle = sGroupName.GetToken( 0, GLOS_DELIM );
        SvLBoxEntry* pEntry = aCategoryBox.InsertEntry( sTitle );
        sal_uInt16 nPath = sGroupName.GetToken( 1, GLOS_DELIM ).ToInt32();

        GroupUserData* pData = new GroupUserData;
        pData->sGroupName = sGroupName.GetToken(0, GLOS_DELIM);
        pData->nPathIdx = nPath;
        pData->bReadonly = pGlossaryHdl->IsReadOnly(&sGroupName);

        pEntry->SetUserData(pData);
        if(sSelStr == pData->sGroupName && nSelPath == nPath)
            pSelEntry = pEntry;

        //Eintraege fuer die Gruppen auffuellen
        {
            pGlossaryHdl->SetCurGroup(sGroupName, sal_False, sal_True);
            const sal_uInt16 nCount = pGlossaryHdl->GetGlossaryCnt();
            for(sal_uInt16 i = 0; i < nCount; ++i)
            {
                String sTitle(pGlossaryHdl->GetGlossaryName(i));
                SvLBoxEntry* pChild = aCategoryBox.InsertEntry(
                                    sTitle, pEntry);
                pChild->SetUserData(new String(pGlossaryHdl->GetGlossaryShortName(i)));
            }
        }
    }
        // Aktuelle Gruppe setzen und Textbausteine anzeigen
    if(!pSelEntry)
    {
        //find a non-readonly group
        SvLBoxEntry* pSearch = aCategoryBox.First();
        while(pSearch)
        {
            if(!aCategoryBox.GetParent(pSearch))
            {
                GroupUserData* pData = (GroupUserData*)pSearch->GetUserData();
                if(!pData->bReadonly)
                {
                    pSelEntry = pSearch;
                    break;
                }
            }
            pSearch = aCategoryBox.Next(pSearch);
        }
        if(!pSelEntry)
            pSelEntry = aCategoryBox.GetEntry(0);
    }
    if(pSelEntry)
    {
        aCategoryBox.Expand(pSelEntry);
        aCategoryBox.Select(pSelEntry);
        aCategoryBox.MakeVisible(pSelEntry);
        GrpSelect(&aCategoryBox);
    }
    //JP 16.11.99: the SvxTreeListBox has a Bug. The Box dont recalc the
    //      outputsize, when all entries are insertet. The result is, that
    //      the Focus/Highlight rectangle is to large and paintet over the
    //      HScrollbar. -> Fix: call the resize
    aCategoryBox.Resize();

    aCategoryBox.GetModel()->Resort();
    aCategoryBox.SetUpdateMode( sal_True );
    aCategoryBox.Update();

    const OfaAutoCorrCfg* pCfg = OFF_APP()->GetAutoCorrConfig();
    aFileRelCB.Check( pCfg->IsSaveRelFile() );
    aFileRelCB.SetClickHdl(LINK(this, SwGlossaryDlg, CheckBoxHdl));
    aNetRelCB.Check( pCfg->IsSaveRelNet() );
    aNetRelCB.SetClickHdl(LINK(this, SwGlossaryDlg, CheckBoxHdl));
    aInsertTipCB.Check( pCfg->IsAutoTextTip() );
    aInsertTipCB.SetClickHdl(LINK(this, SwGlossaryDlg, CheckBoxHdl));
}
/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/


IMPL_LINK_INLINE_START( SwGlossaryDlg, EditHdl, Button *, EMPTYARG )
{
//EndDialog darf nicht im MenuHdl aufgerufen werden
    if(aEditBtn.GetCurItemId() == FN_GL_EDIT )
        EndDialog(RET_EDIT);
    return 0;
}
IMPL_LINK_INLINE_END( SwGlossaryDlg, EditHdl, Button *, EMPTYARG )

/*------------------------------------------------------------------------
 Beschreibung:  KeyInput fuer ShortName - Edits ohne Spaces
------------------------------------------------------------------------*/

IMPL_LINK( SwNewGlosNameDlg, Modify, Edit *, pBox )
{
    String aName(aNewName.GetText());
    SwGlossaryDlg* pDlg = (SwGlossaryDlg*)GetParent();

    if( pBox == &aNewName )
    {
        if( aName.Len() )
            aNewShort.SetText( pDlg->pGlossaryHdl->GetValidShortCut( aName ));
        else
            aNewShort.SetText(aName);
    }

    sal_Bool bEnable = aName.Len() && aNewShort.GetText().Len() &&
        (!pDlg->DoesBlockExist(aName, aNewShort.GetText())
            || aName == aOldName.GetText());
    aOk.Enable(bEnable);
    return 0;
}
/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

IMPL_LINK( SwNewGlosNameDlg, Rename, Button *, EMPTYARG )
{
    SwGlossaryDlg* pDlg = (SwGlossaryDlg*)GetParent();
    String sNew = aNewShort.GetText();
    GetAppCharClass().toUpper(sNew);
    if( pDlg->pGlossaryHdl->HasShortName(aNewShort.GetText())
        && sNew != aOldShort.GetText() )
    {
        InfoBox(this, SW_RES(MSG_DOUBLE_SHORTNAME)).Execute();
        aNewShort.GrabFocus();
    }
    else
        EndDialog(sal_True);
    return 0;
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

IMPL_LINK( SwGlossaryDlg, CheckBoxHdl, CheckBox *, pBox )
{
    OfaAutoCorrCfg* pCfg = OFF_APP()->GetAutoCorrConfig();
    sal_Bool bCheck = pBox->IsChecked();
    if( pBox == &aInsertTipCB )
        pCfg->SetAutoTextTip(bCheck);
    else if(pBox == &aFileRelCB)
        pCfg->SetSaveRelFile(bCheck);
    else
        pCfg->SetSaveRelNet(bCheck);
    return 0;
}

/* -----------------26.11.98 15:18-------------------
 * TreeListBox fuer Gruppen und Bausteine
 * --------------------------------------------------*/
SwGlTreeListBox::SwGlTreeListBox(Window* pParent, const ResId& rResId) :
    SvTreeListBox(pParent, rResId),
    sReadonly     (SW_RES(ST_READONLY)),
    pDragEntry(0)
{
    FreeResource();
    SetDragDropMode( SV_DRAGDROP_CTRL_MOVE|SV_DRAGDROP_CTRL_COPY );
}
/* -----------------30.11.98 10:49-------------------
 *
 * --------------------------------------------------*/
void SwGlTreeListBox::Clear()
{
    SvLBoxEntry* pEntry = First();
    while(pEntry)
    {
        if(GetParent(pEntry))
            delete (String*)pEntry->GetUserData();
        else
            delete (GroupUserData*)pEntry->GetUserData();
        pEntry = Next(pEntry);
    }
    SvTreeListBox::Clear();
}

/*-----------------10.06.97 14.52-------------------

--------------------------------------------------*/
void SwGlTreeListBox::RequestHelp( const HelpEvent& rHEvt )
{
    Point aPos( ScreenToOutputPixel( rHEvt.GetMousePosPixel() ));
    SvLBoxEntry* pEntry = GetEntry( aPos );
    // Hilfe gibt es nur fuer die Gruppennamen
    if(pEntry)
    {
        SvLBoxTab* pTab;
        SvLBoxItem* pItem = GetItem( pEntry, aPos.X(), &pTab );
        if(pItem)
        {
            aPos = SvTreeListBox::GetEntryPos( pEntry );
             Size aSize(pItem->GetSize( this, pEntry ));
            aPos.X() = GetTabPos( pEntry, pTab );

            if((aPos.X() + aSize.Width()) > GetSizePixel().Width())
                aSize.Width() = GetSizePixel().Width() - aPos.X();
            aPos = OutputToScreenPixel(aPos);
             Rectangle aItemRect( aPos, aSize );
            String sMsg;
            if(!GetParent(pEntry))
            {
                GroupUserData* pData = (GroupUserData*)pEntry->GetUserData();
                const SvStrings* pPathArr = ::GetGlossaries()->GetPathArray();
                if(pPathArr->Count())
                {
                    sMsg = (*(*pPathArr)[pData->nPathIdx]);
                    sMsg += INET_PATH_TOKEN;
                    sMsg += pData->sGroupName;
                    sMsg += SwGlossaries::GetExtension();
                    INetURLObject aTmp(sMsg);
                    sMsg = aTmp.GetPath();

                    if(pData->bReadonly)
                    {
                        sMsg += ' ';
                        sMsg += '(';
                        sMsg += sReadonly;
                        sMsg += ')';
                    }


                }
            }
            else
                sMsg = *(String*)pEntry->GetUserData();
            Help::ShowQuickHelp( this, aItemRect, sMsg,
                        QUICKHELP_LEFT|QUICKHELP_VCENTER );
        }
    }
}
/* -----------------26.11.98 14:42-------------------
 *
 * --------------------------------------------------*/
DragDropMode  SwGlTreeListBox::NotifyBeginDrag( SvLBoxEntry* pEntry)
{
    DragDropMode  eRet;
    pDragEntry = pEntry;
    String sEntry;
    if(!GetParent(pEntry))
        eRet = SV_DRAGDROP_NONE;
    else
    {
        SwGlossaryDlg* pDlg = (SwGlossaryDlg*)Window::GetParent();
        SvLBoxEntry* pParent = GetParent(pEntry);

        GroupUserData* pGroupData = (GroupUserData*)pParent->GetUserData();
        String sEntry(pGroupData->sGroupName);
        sEntry += GLOS_DELIM;
        sEntry += String::CreateFromInt32(pGroupData->nPathIdx);
        sal_uInt16 nDragOptions = DRAG_COPYABLE;
        eRet = SV_DRAGDROP_CTRL_COPY;
        if(!pDlg->pGlossaryHdl->IsReadOnly(&sEntry))
        {
            eRet |= SV_DRAGDROP_CTRL_MOVE;
            nDragOptions |= DRAG_MOVEABLE;
        }
        SetDragOptions( nDragOptions );
    }
    return eRet;
}
/* -----------------27.11.98 09:35-------------------
 *
 * --------------------------------------------------*/
sal_Bool    SwGlTreeListBox::NotifyQueryDrop( SvLBoxEntry* pEntry)
{
    // TODO: Readonly - Ueberpruefung fehlt noch!
    SvLBoxEntry* pSrcParent = GetParent(pEntry) ? GetParent(pEntry) : pEntry;
    SvLBoxEntry* pDestParent =
        GetParent(pDragEntry ) ? GetParent(pDragEntry ) : pDragEntry ;
    return pDestParent != pSrcParent;

}
/* -----------------26.11.98 14:42-------------------
 *
 * --------------------------------------------------*/
sal_Bool  SwGlTreeListBox::NotifyMoving(   SvLBoxEntry*  pTarget,
                                    SvLBoxEntry*  pEntry,
                                    SvLBoxEntry*& rpNewParent,
                                    sal_uInt32&        rNewChildPos
                                )
{
    pDragEntry = 0;
    if(!pTarget) //An den Anfang verschieben
    {
        pTarget = GetEntry(0);
    }
    // 1. wird in verschiedene Gruppen verschoben?
    // 2. darf in beiden Gruppen geschrieben werden?
    SvLBoxEntry* pSrcParent = GetParent(pEntry);
    SvLBoxEntry* pDestParent =
        GetParent(pTarget) ? GetParent(pTarget) : pTarget;
    sal_Bool bRet = sal_False;
    if(pDestParent != pSrcParent)
    {
        SwGlossaryDlg* pDlg = (SwGlossaryDlg*)Window::GetParent();
        SwWait aWait( *pDlg->pSh->GetView().GetDocShell(), sal_True );

        GroupUserData* pGroupData = (GroupUserData*)pSrcParent->GetUserData();
        String sSourceGroup(pGroupData->sGroupName);
        sSourceGroup += GLOS_DELIM;
        sSourceGroup += String::CreateFromInt32(pGroupData->nPathIdx);
        pDlg->pGlossaryHdl->SetCurGroup(sSourceGroup);
        String sTitle(GetEntryText(pEntry));
        String sShortName(*(String*)pEntry->GetUserData());

        GroupUserData* pDestData = (GroupUserData*)pDestParent->GetUserData();
        String sDestName = pDestData->sGroupName;
        sDestName += GLOS_DELIM;
        sDestName += String::CreateFromInt32(pDestData->nPathIdx);
        bRet = pDlg->pGlossaryHdl->CopyOrMove( sSourceGroup,  sShortName,
                        sDestName, sTitle, sal_True );
        if(bRet)
        {
            SvLBoxEntry* pChild = InsertEntry(sTitle, pDestParent);
            pChild->SetUserData(new String(sShortName));
            GetModel()->Remove(pEntry);
        }
    }
    return sal_False; //sonst wird der Eintrag automatisch vorgenommen
}
/* -----------------26.11.98 14:42-------------------
 *
 * --------------------------------------------------*/
sal_Bool  SwGlTreeListBox::NotifyCopying(   SvLBoxEntry*  pTarget,
                                    SvLBoxEntry*  pEntry,
                                    SvLBoxEntry*& rpNewParent,
                                    sal_uInt32&        rNewChildPos
                                )
{
    pDragEntry = 0;
    // 1. wird in verschiedene Gruppen verschoben?
    // 2. darf in beiden Gruppen geschrieben werden?
    if(!pTarget) //An den Anfang verschieben
    {
        pTarget = GetEntry(0);
    }
    SvLBoxEntry* pSrcParent = GetParent(pEntry);
    SvLBoxEntry* pDestParent =
        GetParent(pTarget) ? GetParent(pTarget) : pTarget;
    sal_Bool bRet = sal_False;
    if(pDestParent != pSrcParent)
    {
        SwGlossaryDlg* pDlg = (SwGlossaryDlg*)Window::GetParent();
        SwWait aWait( *pDlg->pSh->GetView().GetDocShell(), sal_True );

        GroupUserData* pGroupData = (GroupUserData*)pSrcParent->GetUserData();
        String sSourceGroup(pGroupData->sGroupName);
        sSourceGroup += GLOS_DELIM;
        sSourceGroup += String::CreateFromInt32(pGroupData->nPathIdx);

        pDlg->pGlossaryHdl->SetCurGroup(sSourceGroup);
        String sTitle(GetEntryText(pEntry));
        String sShortName(*(String*)pEntry->GetUserData());

        GroupUserData* pDestData = (GroupUserData*)pDestParent->GetUserData();
        String sDestName = pDestData->sGroupName;
        sDestName += GLOS_DELIM;
        sDestName += String::CreateFromInt32(pDestData->nPathIdx);

        bRet = pDlg->pGlossaryHdl->CopyOrMove( sSourceGroup,  sShortName,
                        sDestName, sTitle, sal_False );
        if(bRet)
        {
            SvLBoxEntry* pChild = InsertEntry(sTitle, pDestParent);
            pChild->SetUserData(new String(sShortName));
        }
    }
    return sal_False; //sonst wird der Eintrag automatisch vorgenommen
}


/*-----------------10.06.97 15.18-------------------

--------------------------------------------------*/
String SwGlossaryDlg::GetCurrGrpName() const
{
    SvLBoxEntry* pEntry = aCategoryBox.FirstSelected();
    String sRet;
    if(pEntry)
    {
        pEntry =
            aCategoryBox.GetParent(pEntry) ? aCategoryBox.GetParent(pEntry) : pEntry;
        GroupUserData* pGroupData = (GroupUserData*)pEntry->GetUserData();
        sRet = pGroupData->sGroupName;
        sRet += GLOS_DELIM;
        sRet += String::CreateFromInt32(pGroupData->nPathIdx);
    }
    return sRet;
}

/*-----------------11.06.97 08.17-------------------

--------------------------------------------------*/
IMPL_LINK( SwGlossaryDlg, PathHdl, Button *, pBtn )
{
    SvxMultiPathDialog* pDlg = new SvxMultiPathDialog(pBtn);
    String sGlosPath( SFX_INIMANAGER()->Get( SFX_KEY_GLOSSARY_PATH ) );
    pDlg->SetPath(sGlosPath);
    if(RET_OK == pDlg->Execute())
    {
        String sTmp(pDlg->GetPath());
        if(sTmp != sGlosPath)
        {
            SFX_INIMANAGER()->Set(sTmp, SFX_KEY_GLOSSARY_PATH);
            ::GetGlossaries()->UpdateGlosPath( sal_True );
            Init();
        }
    }
    delete pDlg;
    return 0;
}
/* -----------------28.07.99 13:48-------------------

 --------------------------------------------------*/
IMPL_LINK( SwGlossaryDlg, ShowPreviewHdl, CheckBox *, pBox )
{
    sal_Bool bCreated = sal_False;
    if(pBox->IsChecked())
    {
        //create example
        if(!pExampleFrame)
        {
            Link aLink(LINK(this, SwGlossaryDlg, PreviewLoadedHdl));
            pExampleFrame = new SwOneExampleFrame(aExampleWIN, EX_SHOW_ONLINE_LAYOUT, &aLink);
            bCreated = sal_True;
        }
    }

    aExampleWIN.Show(pBox->IsChecked() && !bCreated);
    if(pCurrGlosGroup)
        ShowAutoText(*pCurrGlosGroup, aShortNameEdit.GetText());

    return 0;
};
/* -----------------18.11.99 17:09-------------------

 --------------------------------------------------*/
IMPL_LINK( SwGlossaryDlg, PreviewLoadedHdl, void *, EMPTYARG )
{
    if(pCurrGlosGroup)
        ShowAutoText(*pCurrGlosGroup, aShortNameEdit.GetText());
    aExampleWIN.Show(aShowExampleCB.IsChecked());
    return 0;
};

/* -----------------28.07.99 16:28-------------------

 --------------------------------------------------*/
void SwGlossaryDlg::ShowAutoText(const String& rGroup, const String& rShortName)
{
    if(aExampleWIN.IsVisible())
    {
        if(!_xAutoText.is())
        {
            uno::Reference< lang::XMultiServiceFactory >
                                    xMgr = getProcessServiceFactory();
            //now the AutoText ListBoxes have to be filled

            uno::Reference< uno::XInterface >  xAText = xMgr->createInstance( C2U("com.sun.star.text.AutoTextContainer") );
            _xAutoText = uno::Reference< container::XNameAccess >(xAText, uno::UNO_QUERY);
        }

        //try to make an Undo()
        pExampleFrame->ExecUndo();
        uno::Reference< XTextCursor > & xCrsr = pExampleFrame->GetTextCursor();
        if(xCrsr.is())
        {
            if(rShortName.Len())
            {
                uno::Any aGroup = _xAutoText->getByName(rGroup);
                uno::Reference< XAutoTextGroup >  xGroup = *(uno::Reference< XAutoTextGroup > *)aGroup.getValue();
                OUString uShortName(rShortName);
                if(xGroup->hasByName(uShortName))
                {
                    uno::Any aEntry(xGroup->getByName(uShortName));
                    uno::Reference< XAutoTextEntry >  xEntry = *(uno::Reference< XAutoTextEntry > *)aEntry.getValue();
                    uno::Reference< XTextRange >  xRange(xCrsr, uno::UNO_QUERY);
                    xEntry->applyTo(xRange);
                }
            }
        }
    }
}
/*--------------------------------------------------------------------

      $Log: not supported by cvs2svn $
      Revision 1.154  2000/09/18 16:05:56  willem.vandorp
      OpenOffice header added.

      Revision 1.153  2000/08/31 06:33:07  jp
      use CharClass instead of international

      Revision 1.152  2000/08/16 07:33:39  os
      #71166# handling of readonly AutoText groups improved

      Revision 1.151  2000/07/03 08:54:04  jp
      must changes for VCL

      Revision 1.150  2000/06/07 13:20:47  os
      using UCB

      Revision 1.149  2000/05/16 17:30:17  jp
      Changes for Unicode

      Revision 1.148  2000/05/16 09:15:13  os
      project usr removed

      Revision 1.147  2000/05/10 11:53:43  os
      Basic API removed

      Revision 1.146  2000/04/19 12:56:35  os
      include sfx2/filedlg.hxx removed

      Revision 1.145  2000/04/18 15:08:17  os
      UNICODE

      Revision 1.144  2000/03/23 08:42:49  os
      UNO III

      Revision 1.143  2000/03/14 10:53:19  os
      #73958# select non-readonly group after start up

      Revision 1.142  2000/03/06 08:50:43  os
      #70359# GetGroupName: if no title is set use group name

      Revision 1.141  2000/03/03 15:17:02  os
      StarView remainders removed

      Revision 1.140  2000/02/14 14:40:48  os
      #70473# Unicode

      Revision 1.139  2000/02/10 10:34:32  os
      #70359# titles added to AutoText groups

      Revision 1.138  2000/02/03 11:07:05  jp
      Task #72579#: SwTextblocks - use the new method GetValidShortCut

      Revision 1.137  2000/02/02 17:03:02  jp
      Task #72579#: WW8Reader can import glossaries

      Revision 1.136  2000/02/02 11:23:21  os
      #72564# select one of the created groups; #72563# D'n'D: set copy mode for readonly blocks

      Revision 1.135  1999/12/29 07:58:25  os
      #71320# flags for AutoText preview in module config

      Revision 1.134  1999/12/27 10:35:11  os
      #71262# Undo in SwOneExampleFrame

      Revision 1.133  1999/12/15 15:32:24  os
      #70234# ExampleFrame: OnlineLayout, ContextMenu, disabled

      Revision 1.132  1999/11/25 13:11:59  hr
      #65293#: cast

      Revision 1.131  1999/11/19 16:40:24  os
      modules renamed

      Revision 1.130  1999/11/19 11:47:36  os
      #67410# consider path index selection restore

      Revision 1.129  1999/11/19 11:11:52  os
      #69862# Example window corrected

      Revision 1.128  1999/11/16 16:09:00  jp
      Init: call resize at SvTreeListBox

      Revision 1.127  1999/10/21 17:48:59  jp
      have to change - SearchFile with SfxIniManager, dont use SwFinder for this

 --------------------------------------------------------------------*/


diff --git a/sw/source/ui/misc/glossary.hrc b/sw/source/ui/misc/glossary.hrc
new file mode 100644
index 0000000..1bba3cd
--- /dev/null
+++ b/sw/source/ui/misc/glossary.hrc
@@ -0,0 +1,126 @@
/*************************************************************************
 *
 *  $RCSfile: glossary.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:44 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/


// Box Textbausteine
#define FT_SHORTNAME        1
#define ED_SHORTNAME        2
#define FT_NAME             3
//#define DCB_NAME          4
#define ED_NAME             4
#define CB_INSERT_TIP                   5

//#define FT_BIB                10

#define GB_GLOSSARY         30

#define PB_INSERT           50
#define PB_EDIT             52
#define PB_BIB              54
#define PB_CLOSE            55
#define PB_PATH             56
#define PB_HELP             57

#define MNU_EDIT            60
#define FN_GL_DEFINE        61
#define FN_GL_DEFINE_TEXT   62
#define FN_GL_REPLACE       63
#define FN_GL_EDIT          64
#define FN_GL_DELETE        65
#define FN_GL_RENAME        66
#define FN_GL_MACRO         67
#define CB_FILE_REL         68
#define CB_NET_REL          69
#define GB_RELATIVE         70
#define GB_EXAMPLE          71
#define WIN_EXAMPLE         72
#define CB_SHOW_EXAMPLE     73
#define FN_GL_COPY_TO_CLIPBOARD 74
#define FN_GL_IMPORT        75
#define ST_READONLY         76
#define ST_READONLY_PATH    77

// Box Bibliothek Textbausteine
#define GB_EDIT             1
#define GB_BIB              2
#define ED_BIB              3

#define PB_NEW              10
#define PB_DELETE           11

#define BT_OK               100

// beide
#define LB_BIB              80

// Dialog Namensaenderung
#define   FT_ON              1
#define   FT_OS              2
#define   FT_NN              3
#define   FT_NS              4
#define   ED_ON              5
#define   ED_OS              6
#define   ED_NN              7
#define   ED_NS              8
#define   GB_NN              9
#define   BT_CANCEL         10
#define   BT_OKNEW          11

diff --git a/sw/source/ui/misc/glossary.src b/sw/source/ui/misc/glossary.src
new file mode 100644
index 0000000..cfcd209
--- /dev/null
+++ b/sw/source/ui/misc/glossary.src
@@ -0,0 +1,1169 @@
/*************************************************************************
 *
 *  $RCSfile: glossary.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:44 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "misc.hrc"
#include "glossary.hrc"
#include "cmdid.h"
#include "helpid.h"
 // #define DLG_GLOSSARY 256
ModalDialog DLG_GLOSSARY
{
    HelpID = FN_GLOSSARY_DLG ;
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 375 , 164 ) ;
    Text = "AutoText" ;
    Text [ ENGLISH ] = "AutoText" ;
    Text [ norwegian ] = "AutoTekst" ;
    Text [ italian ] = "Testo automatico" ;
    Text [ portuguese_brazilian ] = "Texto autom tico" ;
    Text [ portuguese ] = "AutoTexto" ;
    Text [ finnish ] = "Automaattiteksti" ;
    Text [ danish ] = "AutoTekst" ;
    Text [ french ] = "AutoTexte" ;
    Text [ swedish ] = "AutoText" ;
    Text [ dutch ] = "AutoTekst" ;
    Text [ spanish ] = "AutoTexto" ;
    Text [ english_us ] = "AutoText" ;
    Moveable = TRUE ;
    GroupBox GB_EXAMPLE
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 94 , 155 ) ;
        Text = "Vorschau" ;
        Text [ ENGLISH ] = "Preview" ;
        Text[ english_us ] = "Preview";
        Text[ portuguese ] = "Previsualizar";
        Text[ russian ] = "Ïðîñìîòð";
        Text[ greek ] = "Ðñïåðéóêüðçóç";
        Text[ dutch ] = "Voorbeeld";
        Text[ french ] = "Aperçu";
        Text[ spanish ] = "Previsualización";
        Text[ italian ] = "Anteprima";
        Text[ danish ] = "Eksempel";
        Text[ swedish ] = "Förhandsvisning";
        Text[ polish ] = "Podgl¹d";
        Text[ portuguese_brazilian ] = "Preview";
        Text[ japanese ] = "ÌßÚËÞ­°";
        Text[ korean ] = "¹Ì¸®º¸±â";
        Text[ chinese_simplified ] = "Ô¤ÊÓ";
        Text[ chinese_traditional ] = "¹wÄý";
        Text[ arabic ] = "ÇáãÚÇíäÉ";
        Text[ turkish ] = "Önizleme";
        Text[ language_user1 ] = " ";
    };
    Window WIN_EXAMPLE
    {
        Pos = MAP_APPFONT ( 12 , 16 ) ;
        Size = MAP_APPFONT ( 82 , 124 ) ;
    };
    CheckBox CB_SHOW_EXAMPLE
    {
        Pos = MAP_APPFONT ( 12 , 143 ) ;
        Size = MAP_APPFONT ( 82 , 12 ) ;
        Text = "~Vorschau anzeigen" ;
        Text [ ENGLISH ] = "Show ~preview" ;
        Text[ english_us ] = "Sho~w preview";
        Text[ portuguese ] = "~Mostrar Previsualizar";
        Text[ russian ] = "Âêëþ÷èòü ïðîñìîòð";
        Text[ greek ] = "ÅìöÜíéóç ðñïåðéóêüðçóçò";
        Text[ dutch ] = "~Voorbeeld weergeven";
        Text[ french ] = "Afficher l'~aperçu";
        Text[ spanish ] = "Mostrar pre~visualización";
        Text[ italian ] = "Mostra ~anteprima";
        Text[ danish ] = "Vis eksempel";
        Text[ swedish ] = "Visa förhandsvisning";
        Text[ polish ] = "Wyœwietl podgl¹d";
        Text[ portuguese_brazilian ] = "Show ~preview";
        Text[ japanese ] = "ÌßÚËÞ­°•\\ަ(~P)";
        Text[ korean ] = "¹Ì¸®º¸±â º¸±â(~W)";
        Text[ chinese_simplified ] = "ÏÔʾԤÊÓ(~P)";
        Text[ chinese_traditional ] = "±Ä¥Î¹wÄý(~P)";
        Text[ arabic ] = "ÅÙåÇÑ ÇáãÚÇíäÉ";
        Text[ turkish ] = "Önizlemeyi görüntüle";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_INSERT_TIP
    {
        Pos = MAP_APPFONT ( 112 , 12 ) ;
        Size = MAP_APPFONT ( 200 , 12 ) ;
        TabStop = TRUE ;
        Text = "~Rest des Namens bei der Eingabe als Tipp anzeigen" ;
        Text [ ENGLISH ] = "Show the rest of the name as tip while typing" ;
        Text [ english_us ] = "~Display remainder of name as suggestion while typing" ;
        Text [ italian ] = "Visualizza il resto del nome nella digitazione come suggerimento" ;
        Text [ spanish ] = "~Muestra el resto del nombre como sugerencia durante la entrada" ;
        Text [ french ] = "Lors de la saisie, afficher le nom complet sous forme d'~infobulle" ;
        Text [ dutch ] = "~Rest van de naam bij invoer als tip weergeven" ;
        Text [ swedish ] = "~Visa resten av namnet som tips vid inmatningen" ;
        Text [ danish ] = "Vis resten af navnet som tip under skrivning" ;
        Text [ portuguese_brazilian ] = "~Rest des Namens bei der Eingabe als Tip anzeigen" ;
        Text [ portuguese ] = "Mostrar ~resto do nome durante a digitação como sugestão" ;
        Text[ chinese_simplified ] = "×Ô¶¯ÏÔʾÊäÈëÎÄÌáʾ(~D)";
        Text[ russian ] = "Ïðè ââîäå ïîêàçûâàòü âåñü àâòîòåêñò êàê ïîäñêàçêó";
        Text[ polish ] = "Wyœwietl pozosta³¹ czêœæ nazwy przy wprowadzaniu jako wskazówkê";
        Text[ japanese ] = "“ü—Í’†‚É“ü—ÍŽx‰‡€–Ú–¼‚ð•\\ަ‚·‚é(~D)";
        Text[ chinese_traditional ] = "¦Û°Ê§¹¦¨Åã¥Ü(~D)";
        Text[ arabic ] = "ÚÑÖ ÈÞíÉ ÅÏÎÇá ÇáäÕ ÇáÊáÞÇÆí ÃËäÇÁ ÇáßÊÇÈÉ Úáì Ôßá ÊáãíÍ";
        Text[ greek ] = "ÅìöÜíéóç ôïõ õðüëïéðïõ ìÝ~ñïõò ôïõ ïíüìáôïò ùò õðüäåéîç êáôÜ ôçí äáêôõëïãñÜöçóç";
        Text[ korean ] = "±âÀÔÇÏ´Â µ¿¾È  Á¦¾ÈÀ¸·Î¼­ ³ª¸ÓÁö À̸§ Ç¥½Ã(~D)";
        Text[ turkish ] = "Giriþ sýrasýnda adýn tamamýný öneri olarak görüntüle";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_NAME
    {
        Pos = MAP_APPFONT ( 112 , 31 ) ;
//        Pos = MAP_APPFONT ( 80 , 31 ) ;
        Size = MAP_APPFONT ( 27 , 8 ) ;
        Text = "~Name" ;
        Text [ ENGLISH ] = "~Name" ;
        Text [ norwegian ] = "~Navn" ;
        Text [ italian ] = "~Nome" ;
        Text [ portuguese_brazilian ] = "~Nome" ;
        Text [ portuguese ] = "~Nome" ;
        Text [ finnish ] = "~Nimi" ;
        Text [ danish ] = "Navn" ;
        Text [ french ] = "~Nom" ;
        Text [ swedish ] = "~Namn" ;
        Text [ dutch ] = "~Naam" ;
        Text [ spanish ] = "N~ombre" ;
        Text [ english_us ] = "~Name" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "Ãû³Æ(~N)";
        Text[ russian ] = "Àâòîòåêñò";
        Text[ polish ] = "Nazwa";
        Text[ japanese ] = "€–Ú–¼(~N)";
        Text[ chinese_traditional ] = "¦WºÙ(~N)";
        Text[ arabic ] = "ÇáÇÓã";
        Text[ greek ] = "¼íïìá";
        Text[ korean ] = "À̸§(~N)";
        Text[ turkish ] = "Ad";
        Text[ language_user1 ] = " ";
    };
    Edit ED_NAME
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 145 , 29 ) ;
        Size = MAP_APPFONT ( 100 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
    };
    FixedText FT_SHORTNAME
    {
        Disable = TRUE ;
        Pos = MAP_APPFONT ( 248 , 31 ) ;
        Size = MAP_APPFONT ( 32 , 8 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? ~Kürzel : ~K³rzel */
        Text = "~Kürzel" ;
        Text [ ENGLISH ] = "~Shortcut" ;
        Text [ norwegian ] = "+++~Shortcut" ;
        Text [ italian ] = "Sigla" ;
        Text [ portuguese_brazilian ] = "~Atalho" ;
        Text [ portuguese ] = "~Atalho" ;
        Text [ finnish ] = "~Pikatoiminto" ;
        Text [ danish ] = "Genvej" ;
        Text [ french ] = "~Raccourci" ;
        Text [ swedish ] = "~Förkortning" ;
        Text [ dutch ] = "~Afkorting" ;
        Text [ spanish ] = "~Abrev." ;
        Text [ english_us ] = "~Shortcut" ;
        Right = TRUE ;
        Text[ chinese_simplified ] = "Ëõд(~S)";
        Text[ russian ] = "Ñîêðàùåíèå";
        Text[ polish ] = "Inicja³y";
        Text[ japanese ] = "¼®°Ä¶¯Ä·°";
        Text[ chinese_traditional ] = "ÁY¼g(~S)";
        Text[ arabic ] = "ÇáÇÎÊÕÇÑ";
        Text[ greek ] = "Óõíôüìåõóç";
        Text[ korean ] = "¹Ù·Î°¡±â(~S)";
        Text[ turkish ] = "Kýsaltma";
        Text[ language_user1 ] = " ";
    };
    Edit ED_SHORTNAME
    {
        Disable = TRUE ;
        Border = TRUE ;
        Pos = MAP_APPFONT ( 286 , 29 ) ;
        Size = MAP_APPFONT ( 21 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
    };
    Control LB_BIB
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 112 , 44 ) ;
        Size = MAP_APPFONT ( 195 , 78 ) ;
        TabStop = TRUE ;
         //        Sort = TRUE ;
         //        CurPos = 0 ;
        String ST_READONLY
        {
            Text = "schreibgeschützt" ;
            Text [ ENGLISH ] = "readonly" ;
        };
    };
    GroupBox GB_GLOSSARY
    {
        Pos = MAP_APPFONT ( 106 , 3 ) ;
        Size = MAP_APPFONT ( 207 , 125 ) ;
        Text = "AutoText" ;
        Text [ ENGLISH ] = "AutoText" ;
        Text [ norwegian ] = "AutoTekst" ;
        Text [ italian ] = "Testo automatico" ;
        Text [ portuguese_brazilian ] = "Texto autom tico" ;
        Text [ portuguese ] = "AutoTexto" ;
        Text [ finnish ] = "Automaattiteksti" ;
        Text [ danish ] = "AutoTekst" ;
        Text [ french ] = "AutoTexte" ;
        Text [ swedish ] = "AutoText" ;
        Text [ dutch ] = "AutoTekst" ;
        Text [ spanish ] = "AutoTexto" ;
        Text [ english_us ] = "AutoText" ;
        Text[ chinese_simplified ] = "×Ô¶¯Í¼Îļ¯";
        Text[ russian ] = "Àâòîòåêñò";
        Text[ polish ] = "Autotekst";
        Text[ japanese ] = "“ü—ÍŽx‰‡";
        Text[ chinese_traditional ] = "¦Û°Ê¹Ï¤å¶°";
        Text[ arabic ] = "äÕ ÊáÞÇÆí";
        Text[ greek ] = "ÁõôïÊåßìåíï";
        Text[ korean ] = "ÀÚµ¿ ÅØ½ºÆ®";
        Text[ turkish ] = "Otomatik metin";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_FILE_REL
    {
        Pos = MAP_APPFONT ( 114 , 144 ) ;
        Size = MAP_APPFONT ( 90 , 12 ) ;
        Text = "Im ~Dateisystem" ;
        Text [ ENGLISH ] = "on ~filesystem" ;
        TabStop = TRUE ;
        Text [ english_us ] = "~File system" ;
        Text [ italian ] = "Al file system" ;
        Text [ spanish ] = "En el ~sistema de archivos" ;
        Text [ french ] = "Dans le système de ~fichiers" ;
        Text [ dutch ] = "In b~estandsysteem" ;
        Text [ swedish ] = "I ~filsystem" ;
        Text [ danish ] = "i ~filsystemet" ;
        Text [ portuguese_brazilian ] = "Im ~Dateisystem" ;
        Text [ portuguese ] = "~Sistema do ficheiro" ;
        Text[ chinese_simplified ] = "ÔÚÎļþϵͳÄÚ(~F)";
        Text[ russian ] = "Â ñèñòåìå ôàéëîâ";
        Text[ polish ] = "W systemie plików";
        Text[ japanese ] = "̧²Ù ¼½ÃтÉ(~F)";
        Text[ chinese_traditional ] = "Àɮרt²Î(~F)";
        Text[ arabic ] = "Ýí äÙÇã ÇáãáÝ";
        Text[ greek ] = "óôï óýóôçìá áñ÷åßùí";
        Text[ korean ] = "ÆÄÀÏ ½Ã½ºÅÛ(~F)";
        Text[ turkish ] = "Dosya sistemi";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_NET_REL
    {
        Pos = MAP_APPFONT ( 209 , 144 ) ;
        Size = MAP_APPFONT ( 90 , 12 ) ;
        Text = "Im ~Internet" ;
        Text [ ENGLISH ] = "on int~ernet" ;
        Text [ english_us ] = "Inte~rnet" ;
        Text [ italian ] = "In ~Internet" ;
        Text [ spanish ] = "En I~nternet" ;
        Text [ french ] = "Sur l'~Internet" ;
        Text [ dutch ] = "In Interne~t" ;
        Text [ swedish ] = "På ~Internet" ;
        Text [ danish ] = "på ~Internettet" ;
        Text [ portuguese_brazilian ] = "Im ~Internet" ;
        Text [ portuguese ] = "~Internet" ;
        Text[ chinese_simplified ] = "ÔÚ¹ú¼Ê»¥ÁªÍøÄÚ(~R)";
        Text[ russian ] = "Â Èíòåðíåòå";
        Text[ polish ] = "W Int~ernecie";
        Text[ japanese ] = "²ÝÀ°È¯Ä(~R)";
        Text[ chinese_traditional ] = "Inte~rnet";
        Text[ arabic ] = "Ýí ÇáÅäÊÑäÊ";
        Text[ greek ] = "Óôï Internet";
        Text[ korean ] = "ÀÎÅͳÝ(~R)";
        Text[ turkish ] = "Internet";
        Text[ language_user1 ] = " ";
    };
    GroupBox GB_RELATIVE
    {
        Pos = MAP_APPFONT ( 106 , 134 ) ;
        Size = MAP_APPFONT ( 207 , 24 ) ;
        Text= "Verknüpfungen relativ speichern";
        Text[ italian ] = "Salvare i collegamenti in modo relativo";
        Text[ portuguese_brazilian ] = "Verknüpfungen relativ speichern";
        Text[ portuguese ] = "Guardar ligações relacionadas com";
        Text[ danish ] = "Gem kæderne relativt";
        Text[ french ] = "Enregistrement relatif des liens";
        Text[ swedish ] = "Spara länkar relativt";
        Text[ dutch ] = "Koppelingen relatief opslaan";
        Text[ spanish ] = "Guardar vínculos relativamente";
        Text[ english_us ] = "Save links relative to";
    Text[ chinese_simplified ] = "´æÅÌÏà¶ÔµÄÁ´½Ó";
        Text = "Verknüpfungen relativ speichern" ;
    Text[ chinese_traditional ] = "Àx¦s¬Û¹ïªº±¶®|";
        Text[ russian ] = "Ñîõðàíèòü ññûëêè îòíîñ.";
        Text[ greek ] = "Ó÷åôéêÞ áðïèÞêåõóç óõíäÝóåùí";
        Text[ polish ] = "Zapisz ³¹cza wzglêdnie";
        Text[ japanese ] = "ØÝ¸‚̊‘Ώۂð•Û‘¶";
        Text[ korean ] = "¿¡°üÇÑ ¿¬°á ÀúÀå";
        Text[ arabic ] = "ÍÝÙ ÇáÇÑÊÈÇØÇÊ ÍÝÙÇð äÓÈíÇð";
        Text[ turkish ] = "Baðlantýlarý göreceli kaydet";
        Text[ language_user1 ] = " ";
    };
    OKButton PB_INSERT
    {
        Pos = MAP_APPFONT ( 319 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? ~Einfügen : ~Einf³gen */
        Text = "~Einfügen" ;
        Text [ ENGLISH ] = "~Insert" ;
        Text [ norwegian ] = "~Insert" ;
        Text [ italian ] = "~Inserisci" ;
        Text [ portuguese_brazilian ] = "~Inserir" ;
        Text [ portuguese ] = "~Inserir" ;
        Text [ finnish ] = "~Lisää" ;
        Text [ danish ] = "~Indsæt" ;
        Text [ french ] = "~Insérer" ;
        Text [ swedish ] = "Infog~a" ;
        Text [ dutch ] = "~Invoegen" ;
        Text [ spanish ] = "~Insertar" ;
        Text [ english_us ] = "~Insert" ;
        /* ### ACHTUNG: Neuer Text in Resource? Fügt den aktuellen Textblock ein und schließt das Dialogfeld : F³gt den aktuellen Textblock ein und schlie˜t das Dialogfeld */
        TabStop = TRUE ;
        DefButton = TRUE ;
        Text[ chinese_simplified ] = "²åÈë(~I)";
        Text[ russian ] = "Âñòàâèòü";
        Text[ polish ] = "Wstaw";
        Text[ japanese ] = "‘}“ü(~I)";
        Text[ russian ] = "Âñòàâèòü";
    Text[ polish ] = "Wstaw";
    Text[ japanese ] = "‘}“ü(~I)";
    Text[ chinese_simplified ] = "²åÈë(~I)";
    Text[ chinese_traditional ] = "´¡¤J(~I)";
        Text[ arabic ] = "ÅÏÑÇÌ";
        Text[ greek ] = "ÅéóáãùãÞ";
        Text[ korean ] = "»ðÀÔ(~I)";
        Text[ turkish ] = "Ekle";
        Text[ language_user1 ] = " ";
    };
    CancelButton PB_CLOSE
    {
        Pos = MAP_APPFONT ( 319 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? ~Schließen : ~Schlie˜en */
        Text = "~Schließen" ;
        Text [ ENGLISH ] = "~Close" ;
        Text [ norwegian ] = "~Lukk" ;
        Text [ italian ] = "~Chiudi" ;
        Text [ portuguese_brazilian ] = "~Fechar" ;
        Text [ portuguese ] = "~Fechar" ;
        Text [ finnish ] = "~Sulje" ;
        Text [ danish ] = "~Luk" ;
        Text [ french ] = "~Fermer" ;
        Text [ swedish ] = "~Stäng" ;
        Text [ dutch ] = "~Sluiten" ;
        Text [ spanish ] = "~Cerrar" ;
        Text [ english_us ] = "~Close" ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "¹Ø±Õ(~C)";
        Text[ russian ] = "Çàêðûòü";
        Text[ polish ] = "Zamknij";
        Text[ japanese ] = "•‚¶‚é(~C)";
        Text[ chinese_traditional ] = "Ãö³¬(~C)";
        Text[ arabic ] = "ÅÛáÇÞ";
        Text[ greek ] = "Êëåßóéìï";
        Text[ korean ] = "´Ý±â(~C)";
        Text[ turkish ] = "Kapat";
        Text[ language_user1 ] = " ";
    };
    HelpButton PB_HELP
    {
        Pos = MAP_APPFONT ( 319 , 43 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
    };
    MenuButton PB_EDIT
    {
        Pos = MAP_APPFONT ( 319 , 60 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        Text = "AutoTe~xt" ;
        Text [ ENGLISH ] = "AutoTe~xt" ;
        Text [ norwegian ] = "AutoTekst" ;
        Text [ italian ] = "Testo auto." ;
        Text [ portuguese_brazilian ] = "Texto autom tico" ;
        Text [ portuguese ] = "AutoTe~xto" ;
        Text [ finnish ] = "Automaattiteksti" ;
        Text [ danish ] = "AutoTekst" ;
        Text [ french ] = "~AutoTexte" ;
        Text [ swedish ] = "AutoTe~xt" ;
        Text [ dutch ] = "~AutoTekst" ;
        Text [ spanish ] = "AutoTe~xto" ;
        Text [ english_us ] = "AutoTe~xt" ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "×Ô¶¯Í¼Îļ¯(~X)";
        Text[ russian ] = "Àâòîòåêñò";
        Text[ polish ] = "Autote~kst";
        Text[ japanese ] = "“ü—ÍŽx‰‡(~X)";
        Text[ chinese_traditional ] = "¦Û°Ê¹Ï¤å¶°(~X)";
        Text[ arabic ] = "äÕ ÊáÞÇÆí";
        Text[ greek ] = "Áõôï~Êåßìåíï";
        Text[ korean ] = "ÀÚµ¿ ÅØ½ºÆ®(~X)";
        Text[ turkish ] = "Otomatik metin";
        Text[ language_user1 ] = " ";
    };
    PushButton PB_BIB
    {
        Pos = MAP_APPFONT ( 319 , 77 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        Text = "~Bereiche..." ;
        Text [ ENGLISH ] = "~Groups..." ;
        Text [ norwegian ] = "~Grupper..." ;
        Text [ italian ] = "Categorie..." ;
        Text [ portuguese_brazilian ] = "~Grupos..." ;
        Text [ portuguese ] = "~Categorias..." ;
        Text [ finnish ] = "~Ryhmät..." ;
        Text [ danish ] = "Områder..." ;
        Text [ french ] = "Caté~gories..." ;
        Text [ swedish ] = "~Områden..." ;
        Text [ dutch ] = "~Bereiken..." ;
        Text [ spanish ] = "~Areas..." ;
        Text [ english_us ] = "C~ategories..." ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "·ÖÀà(~A)...";
        Text[ russian ] = "Êàòåãîðèè...";
        Text[ polish ] = "Obszary...";
        Text[ japanese ] = "”͈Í(~A)...";
        Text[ chinese_traditional ] = "°Ï°ì(~A)...";
        Text[ arabic ] = "ÝÆÇÊ...";
        Text[ greek ] = "Êáôçãïñßåò...";
        Text[ korean ] = "ºÐ·ùÇ׸ñ(~A)...";
        Text[ turkish ] = "Bölümler...";
        Text[ language_user1 ] = " ";
    };
    PushButton PB_PATH
    {
        Pos = MAP_APPFONT ( 319 , 94 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        Text = "~Pfad..." ;
        Text [ ENGLISH ] = "~Path..." ;
        TabStop = TRUE ;
        Text [ portuguese ] = "~Atalho..." ;
        Text [ english_us ] = "~Path..." ;
        Text [ portuguese_brazilian ] = "~Pfad..." ;
        Text [ swedish ] = "Sök~väg..." ;
        Text [ danish ] = "Sti..." ;
        Text [ italian ] = "~Percorso..." ;
        Text [ spanish ] = "~Ruta..." ;
        Text [ french ] = "~Chemin..." ;
        Text [ dutch ] = "~Pad..." ;
        Text[ chinese_simplified ] = "·¾¶(~P)...";
        Text[ russian ] = "Ïóòü...";
        Text[ polish ] = "Œcie¿ka...";
        Text[ japanese ] = "Êß½(~P)...";
        Text[ chinese_traditional ] = "¸ô®|(~P)...";
        Text[ arabic ] = "ÇáãÓÇÑ...";
        Text[ greek ] = "ÄéáäñïìÞ...";
        Text[ korean ] = "°æ·Î(~P)...";
        Text[ turkish ] = "Veri yolu...";
        Text[ language_user1 ] = " ";
    };
    String ST_READONLY_PATH
    {
        Text = "Für die Verzeichnisse für 'AutoText' sind sind keine Schreibrechte vorhanden. Möchten Sie den Pfaddialog aufrufen?" ;
        Text [ ENGLISH ] = "The directories of 'AutoText' don't have write access. Do you want to call the path settings dialog?" ;
    };
    Menu MNU_EDIT
    {
        ItemList =
        {
            MenuItem
            {
                Identifier = FN_GL_DEFINE ;
                HelpID = HID_MD_GLOS_DEFINE ;
                Text = "~Neu" ;
                Text [ ENGLISH ] = "~New" ;
                Text [ norwegian ] = "~New" ;
                Text [ italian ] = "~Nuovo" ;
                Text [ portuguese_brazilian ] = "~Novo" ;
                Text [ portuguese ] = "~Novo" ;
                Text [ finnish ] = "~Uusi" ;
                Text [ danish ] = "~Ny(t)" ;
                Text [ french ] = "~Nouveau" ;
                Text [ swedish ] = "~Nytt" ;
                Text [ dutch ] = "N~ieuw" ;
                Text [ spanish ] = "~Nuevo" ;
                Text [ english_us ] = "~New" ;
                Text[ chinese_simplified ] = "н¨(~N)";
                Text[ russian ] = "Ñîçä~àòü";
                Text[ polish ] = "~Nowy";
                Text[ japanese ] = "V‹Kì¬(~N)";
                Text[ chinese_traditional ] = "¶}±Ò·sÀÉ(~N)";
                Text[ arabic ] = "~ÌÏíÏ";
                Text[ greek ] = "~Äçìéïõñãßá";
                Text[ korean ] = "»õ·Î(~N)";
                Text[ turkish ] = "~Yeni";
                Text[ language_user1 ] = " ";
            };
            MenuItem
            {
                Identifier = FN_GL_DEFINE_TEXT ;
                HelpID = HID_MD_GLOS_DEFINE_TEXT ;
                Text = "Neu (nur ~Text)" ;
                Text [ ENGLISH ] = "New (only ~text)" ;
                Text [ english_us ] = "New (text only)" ;
                Text [ portuguese_brazilian ] = "Neu (nur ~Text)" ;
                Text [ swedish ] = "Ny (endast ~text)" ;
                Text [ danish ] = "Ny (kun tekst)" ;
                Text [ italian ] = "Nuovo (solo ~testo)" ;
                Text [ spanish ] = "Nuevo (solo ~texto)" ;
                Text [ french ] = "Nouveau (t~exte seulement)" ;
                Text [ dutch ] = "Nieuw (alleen ~tekst)" ;
                Text [ portuguese ] = "Novo (só ~texto)" ;
                Text[ chinese_simplified ] = "н¨(Ö»ÊÇÎı¾)(~T)";
                Text[ russian ] = "Ñîçäàòü (òîëüêî òåêñò)";
                Text[ polish ] = "Nowy (tylko tekst)";
                Text[ japanese ] = "V‹Kì¬(÷½Ä‚Ì‚Ý)";
                Text[ chinese_traditional ] = "¶}±Ò·sÀÉ(¯Â¤å¦r)(~T)";
                Text[ arabic ] = "ÌÏíÏ (ÇáäÕ ÝÞØ)";
                Text[ greek ] = "Äçìéïõñãßá (ìüíï ~êåßìåíï)";
                Text[ korean ] = "»õ·Î (ÅØ½ºÆ® ¸¸)";
                Text[ turkish ] = "Yeni (yalnýzca metin)";
                Text[ language_user1 ] = " ";
            };
            MenuItem
            {
                Identifier = FN_GL_COPY_TO_CLIPBOARD;
                HelpID = HID_MD_COPY_TO_CLIPBOARD;
                Text = "~Kopieren";
                Text [English] = "Copy";
                Text[ english_us ] = "~Copy";
                Text[ portuguese ] = "~Copiar";
                Text[ russian ] = "Êîïèðîâàòü";
                Text[ greek ] = "Áíôé~ãñáöÞ";
                Text[ dutch ] = "~Kopiëren";
                Text[ french ] = "~Copier";
                Text[ spanish ] = "~Copiar";
                Text[ italian ] = "~Copia";
                Text[ danish ] = "K~opier";
                Text[ swedish ] = "Kopiera";
                Text[ polish ] = "Kopiuj";
                Text[ portuguese_brazilian ] = "Copy";
                Text[ japanese ] = "ºËß°(~C)";
                Text[ korean ] = "º¹»ç(~C)";
                Text[ chinese_simplified ] = "¸´ÖÆ(~C)";
                Text[ chinese_traditional ] = "Î`»s(~C)";
                Text[ arabic ] = "äÓÎ";
                Text[ turkish ] = "Kopyala";
                Text[ language_user1 ] = " ";
            };
            MenuItem
            {
                Identifier = FN_GL_REPLACE ;
                HelpID = HID_MD_GLOS_REPLACE ;
                Text = "~Ersetzen" ;
                Text [ ENGLISH ] = "~Replace" ;
                Text [ norwegian ] = "~Erstatte" ;
                Text [ italian ] = "~Sostituisci" ;
                Text [ portuguese_brazilian ] = "~Substituir" ;
                Text [ portuguese ] = "~Substituir" ;
                Text [ finnish ] = "~Korvaa" ;
                Text [ danish ] = "~Erstat" ;
                Text [ french ] = "R~emplacer" ;
                Text [ swedish ] = "~Ersätta" ;
                Text [ dutch ] = "V~ervangen" ;
                Text [ spanish ] = "Ree~mplazar" ;
                Text [ english_us ] = "Replace" ;
                Text[ chinese_simplified ] = "¸üÌæ(~R)";
                Text[ russian ] = "Çàìåíèòü";
                Text[ polish ] = "Zamieñ";
                Text[ japanese ] = "’uŠ·";
                Text[ chinese_traditional ] = "¥N´À(~R)";
                Text[ arabic ] = "ÇÓÊÈÏÇá";
                Text[ greek ] = "Á~íôéêáôÜóôáóç";
                Text[ korean ] = "¹Ù²Ù±â";
                Text[ turkish ] = "Deðiþtir";
                Text[ language_user1 ] = " ";
            };
            MenuItem
            {
                Identifier = FN_GL_RENAME ;
                HelpID = HID_MD_GLOS_RENAME ;
                Text = "~Umbenennen..." ;
                Text [ ENGLISH ] = "Ren~ame..." ;
                Text [ dutch ] = "~Naam wijzigen..." ;
                Text [ english_us ] = "Rename..." ;
                Text [ italian ] = "~Rinomina..." ;
                Text [ spanish ] = "~Cambiar nombre..." ;
                Text [ french ] = "~Renommer..." ;
                Text [ swedish ] = "~Byt namn..." ;
                Text [ danish ] = "Omdøb" ;
                Text [ portuguese_brazilian ] = "~Umbenennen" ;
                Text [ portuguese ] = "~Mudar nome..." ;
                Text[ chinese_simplified ] = "ÖØÃüÃû(~A)...";
                Text[ russian ] = "Ïåðåèìåíîâàòü...";
                Text[ polish ] = "Zmieñ nazwê...";
                Text[ japanese ] = "–¼‘O‚̕ύX...";
                Text[ chinese_traditional ] = "­«·s©R¦W(~A)...";
                Text[ arabic ] = "...ÅÚÇÏÉ ÊÓãíÉ";
                Text[ greek ] = "~Ìåôïíïìáóßá...";
                Text[ korean ] = "À̸§ ¹Ù²Ù±â...";
                Text[ turkish ] = "Yeniden adlandýr...";
                Text[ language_user1 ] = " ";
            };
            MenuItem
            {
                Identifier = FN_GL_DELETE ;
                HelpID = HID_MD_GLOS_DELETE ;
                /* ### ACHTUNG: Neuer Text in Resource? ~Löschen : ~L÷schen */
                Text = "~Löschen" ;
                Text [ ENGLISH ] = "~Delete" ;
                Text [ norwegian ] = "~Slett" ;
                Text [ italian ] = "~Elimina" ;
                Text [ portuguese_brazilian ] = "~Apagar" ;
                Text [ portuguese ] = "E~liminar" ;
                Text [ finnish ] = "~Poista" ;
                Text [ danish ] = "~Slet" ;
                Text [ french ] = "~Supprimer" ;
                Text [ swedish ] = "~Radera" ;
                Text [ dutch ] = "~Verwijderen" ;
                Text [ spanish ] = "~Eliminar" ;
                Text [ english_us ] = "~Delete" ;
                Text[ chinese_simplified ] = "ɾ³ý(~D)";
                Text[ russian ] = "Óäàëèòü";
                Text[ polish ] = "Usuñ";
                Text[ japanese ] = "íœ(~D)";
                Text[ chinese_traditional ] = "§R°£(~D)";
                Text[ arabic ] = "ÍÐÝ";
                Text[ greek ] = "Äéáãñá~öÞ";
                Text[ korean ] = "»èÁ¦(~D)";
                Text[ turkish ] = "Sil";
                Text[ language_user1 ] = " ";
            };
            MenuItem
            {
                Separator = TRUE ;
            };
            MenuItem
            {
                Identifier = FN_GL_EDIT ;
                HelpID = HID_MD_GLOS_EDIT ;
                Text = "~Bearbeiten" ;
                Text [ ENGLISH ] = "~Edit" ;
                Text [ norwegian ] = "~Rediger" ;
                Text [ italian ] = "~Modifica" ;
                Text [ portuguese_brazilian ] = "~Editar" ;
                Text [ portuguese ] = "E~ditar" ;
                Text [ finnish ] = "~Muokkaa" ;
                Text [ danish ] = "~Rediger" ;
                Text [ french ] = "~Edition" ;
                Text [ swedish ] = "~Redigera" ;
                Text [ dutch ] = "Be~werken" ;
                Text [ spanish ] = "~Editar" ;
                Text [ english_us ] = "~Edit" ;
                Text[ chinese_simplified ] = "±à¼­(~E)";
                Text[ russian ] = "~Ïðàâêà";
                Text[ polish ] = "~Edytuj";
                Text[ japanese ] = "•ҏWi~‚dj";
                Text[ chinese_traditional ] = "½s¿è(~E)";
                Text[ arabic ] = "~ÊÍÑíÑ";
                Text[ greek ] = "~Åðåîåñãáóßá";
                Text[ korean ] = "ÆíÁý(~E)";
                Text[ turkish ] = "Düzenle";
                Text[ language_user1 ] = " ";
            };
            MenuItem
            {
                Separator = TRUE ;
            };
            MenuItem
            {
                Identifier = FN_GL_MACRO ;
                HelpID = HID_MD_GLOS_MACRO ;
                Text = "~Makro..." ;
                Text [ ENGLISH ] = "~Macro..." ;
                Text [ norwegian ] = "~Macro..." ;
                Text [ italian ] = "Macro..." ;
                Text [ portuguese_brazilian ] = "~Macro..." ;
                Text [ portuguese ] = "~Macro..." ;
                Text [ finnish ] = "~Makro..." ;
                Text [ danish ] = "~Makro..." ;
                Text [ french ] = "~Macro..." ;
                Text [ swedish ] = "~Makro..." ;
                Text [ dutch ] = "~Macro..." ;
                Text [ spanish ] = "~Macro..." ;
                Text [ english_us ] = "~Macro..." ;
                Text[ chinese_simplified ] = "ºê(~M)...";
                Text[ russian ] = "Ìàêðîñ...";
                Text[ polish ] = "Makro...";
                Text[ japanese ] = "ϸÛ(~M)...";
                Text[ chinese_traditional ] = "¥¨¶°(~M)...";
                Text[ arabic ] = "ÇáãÇßÑæ...";
                Text[ greek ] = "~ÌáêñïåíôïëÞ...";
                Text[ korean ] = "¸ÅÅ©·Î(~M)...";
                Text[ turkish ] = "Makro...";
                Text[ language_user1 ] = " ";
            };
            MenuItem
            {
                Separator = TRUE ;
            };
            MenuItem
            {
                Identifier = FN_GL_IMPORT;
                HelpID = HID_MD_GLOS_IMPORT ;
                Text = "~Importieren..." ;
                Text [ ENGLISH ] = "~Import..." ;
                Text[ english_us ] = "~Import...";
                Text[ portuguese ] = "~Importar...";
                Text[ russian ] = "~Èìïîðò...";
                Text[ greek ] = "Å~éóáãùãÞ...";
                Text[ dutch ] = "~Importeren...";
                Text[ french ] = "~Importer...";
                Text[ spanish ] = "~Importar...";
                Text[ italian ] = "~Importa...";
                Text[ danish ] = "~Importer...";
                Text[ swedish ] = "~Importera...";
                Text[ polish ] = "~Importuj...";
                Text[ portuguese_brazilian ] = "~Import...";
                Text[ japanese ] = "²ÝÎ߰Ă·‚é(~I)...";
                Text[ korean ] = "°¡Á®¿À±â(~I)...";
                Text[ chinese_simplified ] = "ÊäÈë(~I)...";
                Text[ chinese_traditional ] = "¿é¤J(~I)...";
                Text[ arabic ] = "ÇÓÊíÑÇÏ...";
                Text[ turkish ] = "~Ýçe aktar...";
            };
        };
    };
    Text[ chinese_simplified ] = "×Ô¶¯Í¼Îļ¯";
    Text[ russian ] = "Àâòîòåêñò";
    Text[ polish ] = "Autotekst";
    Text[ japanese ] = "“ü—ÍŽx‰‡";
    Text[ chinese_traditional ] = "¦Û°Ê¹Ï¤å¶°";
    Text[ arabic ] = "äÕ ÊáÞÇÆí";
    Text[ greek ] = "ÁõôïÊåßìåíï";
    Text[ korean ] = "ÀÚµ¿ ÅØ½ºÆ®";
    Text[ turkish ] = "Otomatik metin";
    Text[ language_user1 ] = " ";
};
InfoBox MSG_DOUBLE_SHORTNAME
{
    /* ### ACHTUNG: Neuer Text in Resource? Kürzel wird bereits verwendet. Bitte einen anderen Namen vergeben! : K³rzel wird bereits verwendet. Bitte einen anderen Namen vergeben! */
    MESSAGE = "Kürzel wird bereits verwendet. Bitte einen anderen Namen vergeben!" ;
    MESSAGE [ ENGLISH ] = "Short name already in use. Please choose annother name!" ;
    MESSAGE [ norwegian ] = "Kort navn er i bruk. Vennligst velg et annet navn!" ;
    MESSAGE [ italian ] = "La sigla è già in uso. Scegliere un altro nome." ;
    MESSAGE [ portuguese_brazilian ] = "AbreviaçÆo j  em uso. Por favor escolha outro nome!" ;
    MESSAGE [ portuguese ] = "Abreviatura já existe. Por favor escolha outro nome!" ;
    MESSAGE [ finnish ] = "Lyhenne on jo käytössä. Valitse toinen nimi!" ;
    MESSAGE [ danish ] = "Denne genvej eksisterer allerede. Vælg venligst et andet navn!" ;
    MESSAGE [ french ] = "Abréviation déjà utilisée. Choisissez un autre nom !" ;
    MESSAGE [ swedish ] = "Kortkommandonamnet används redan. Välj ett annat namn!" ;
    MESSAGE [ dutch ] = "Deze afkorting bestaat al. Probeer een andere naam!" ;
    MESSAGE [ spanish ] = "Esta abreviatura ya está en uso. ¡Elija otro nombre por favor!" ;
    MESSAGE [ english_us ] = "Shortcut name already exists. Please choose another name." ;
    MESSAGE[ chinese_simplified ] = "ÒѾ­´æÔÚÕâ¸öËõд¡£ÇëÄúÊäÈëÒ»¸öÆäËûËõдÃû³Æ£¡";
    MESSAGE[ russian ] = "Ýòî ñîêðàùåíèå óæå ñóùåñòâóåò. Ïîæàëóéñòà, âûáåðèòå äðóãîå èìÿ!";
    MESSAGE[ polish ] = "Te inicja³y ju¿ zosta³y u¿yte. Proszê podaæ inn¹ nazwê!";
    MESSAGE[ japanese ] = "‚±‚̼®°Ä¶¯Ä·°‚Í‚·‚łɎg—p‚³‚ê‚Ä‚¢‚Ü‚·B•ʂ̷°‚ð‘I‘ð‚µ‚Ä‰º‚³‚¢B";
    MESSAGE[ chinese_traditional ] = "¤w¸g¨Ï¥Î¤F³o­ÓÁY¼g¡C½Ð±z¿é¤J¤@­Ó¤£¦Pªº¦WºÙ¡T";
    MESSAGE[ arabic ] = "åÐÇ ÇáÇÎÊÕÇÑ ãæÌæÏ ÈÇáÝÚá. ÇáÑÌÇÁ ÇÓÊÎÏÇã ÇÓã ÌÏíÏ!";
    MESSAGE[ greek ] = "Ôï üíïìá óõíôüìåõóçò õðÜñ÷åé Þäç. Ðáñáêáëþ äþóôå Ýíá Üëëï üíïìá!";
    MESSAGE[ korean ] = "¹Ù·Î°¡±â À̸§ÀÌ ÀÌ¹Ì Á¸ÀçÇÕ´Ï´Ù. ´Ù¸¥ À̸§À» ¼±ÅÃÇØ ÁֽʽÿÀ";
    MESSAGE[ turkish ] = "Bu kýsaltma mevcut durumda. Baþka bir ad seçin!";
    MESSAGE[ language_user1 ] = " ";
};
QueryBox MSG_QUERY_DELETE
{
    BUTTONS = WB_YES_NO ;
    DEFBUTTON = WB_DEF_NO ;
    /* ### ACHTUNG: Neuer Text in Resource? Soll der AutoText gelöscht werden? : Soll der AutoText gel÷scht werden? */
    MESSAGE = "Soll der AutoText gelöscht werden?" ;
    MESSAGE [ English ] = "Delete AutoText?" ;
    MESSAGE [ norwegian ] = "Slette AutoTekst?" ;
    MESSAGE [ italian ] = "Elimina inserimento testo automatico?." ;
    MESSAGE [ portuguese_brazilian ] = "Apagar TextoAutom tico?" ;
    MESSAGE [ portuguese ] = "Deseja apagar o AutoTexto?" ;
    MESSAGE [ finnish ] = "Poistetaanko automaattiteksti?" ;
    MESSAGE [ danish ] = "Skal denne AutoTekst slettes?" ;
    MESSAGE [ french ] = "Supprimer l'AutoTexte ?" ;
    MESSAGE [ swedish ] = "Skall AutoText raderas?" ;
    MESSAGE [ dutch ] = "AutoTekst wissen?" ;
    MESSAGE [ spanish ] = "¿Desea eliminar el AutoTexto?" ;
    MESSAGE [ english_us ] = "Delete AutoText?" ;
    MESSAGE[ chinese_simplified ] = "ÄúҪɾ³ý×Ô¶¯Í¼Îļ¯?";
    MESSAGE[ russian ] = "Óäàëèòü àâòîòåêñò?";
    MESSAGE[ polish ] = "Usun¹æ autotekst?";
    MESSAGE[ japanese ] = "“ü—ÍŽx‰‡‚ðíœ‚µ‚Ü‚·‚©H";
    MESSAGE[ chinese_traditional ] = "­n§R°£¦Û°Ê¹Ï¤å¶°?";
    MESSAGE[ arabic ] = "åá ÊÑíÏ ÍÐÝ ÇáäÕ ÇáÊáÞÇÆí¿";
    MESSAGE[ greek ] = "ÄéáãñáöÞ ÁõôïÊåéìÝíïõ;";
    MESSAGE[ korean ] = "ÀÚµ¿ ÅØ½ºÆ®¸¦ »èÁ¦ ÇϽðڽÀ´Ï±î?";
    MESSAGE[ turkish ] = "Otomatik metin silinsin mi?";
    MESSAGE[ language_user1 ] = " ";
};
String STR_QUERY_DELETE_GROUP1
{
    TEXT = "Soll der Bereich " ;
    TEXT [ English ] = "Delete Group " ;
    TEXT [ english_us ] = "Delete the category " ;
    Text [ dutch ] = "Wilt u het bereik  " ;
    Text [ italian ] = "Cancellare la categoria  " ;
    Text [ spanish ] = "¿Desea usted eliminar  " ;
    Text [ french ] = "Supprimer la catégorie " ;
    Text [ swedish ] = "Ska kategorin " ;
    Text [ danish ] = "Skal området " ;
    Text [ portuguese ] = "Deseja eliminar " ;
    Text [ portuguese_brazilian ] = "Soll der Bereich " ;
    Text[ chinese_simplified ] = "Ҫɾ³ýÕâ¸öÇøÓò ";
    Text[ russian ] = "Óäàëèòü  ";
    Text[ polish ] = "Czy ten obszar  ";
    Text[ japanese ] = "‚±‚Ì•ª—Þ‚ðíœ‚µ‚Ü‚·‚©H ";
    Text[ chinese_traditional ] = "­n§R°£³o­Ó°Ï°ì ";
    Text[ arabic ] = "åá ÊÑíÏ ÍÐÝ ÇáÝÆÉ ";
    Text[ greek ] = "ÈÝëåôå ç êáôçãïñßá ";
    Text[ korean ] = "ºÐ·ùÇ׸ñÀ» »èÁ¦ÇϽðڽÀ´Ï±î? ";
    Text[ turkish ] = "Bölüm ";
    Text[ language_user1 ] = " ";
};
String STR_QUERY_DELETE_GROUP2
{
    /* ### ACHTUNG: Neuer Text in Resource?  gelöscht werden? :  gel÷scht werden? */
    TEXT = " gelöscht werden?" ;
    TEXT [ English ] = "?" ;
    TEXT [ english_us ] = "?" ;
    Text [ dutch ] = "wissen?" ;
    Text [ italian ] = "?" ;
    Text [ spanish ] = "la categoría?" ;
    Text [ french ] = "?" ;
    Text [ swedish ] = "raderas?" ;
    Text [ danish ] = "slettes?" ;
    Text [ portuguese ] = "a secção?" ;
    Text [ portuguese_brazilian ] = "gelöscht werden?" ;
    Text[ chinese_simplified ] = "£¿";
    Text[ russian ] = "îáëàñòü?";
    Text[ polish ] = "ma zostaæ usuniêty?";
    Text[ japanese ] = "íœ‚µ‚Ü‚·‚©H";
    Text[ chinese_traditional ] = "?";
    Text[ arabic ] = "¿";
    Text[ language_user1 ] = " ";
    Text[ greek ] = "íá äéáãñáöåß;";
    Text[ korean ] = "?";
    Text[ turkish ] = "silinsin mi?";
};
String STR_GLOSSARY
{
    Text = "Textbaustein : " ;
    Text [ English ] = "Textblock : " ;
    Text [ norwegian ] = "Textblock : " ;
    Text [ italian ] = "Modulo di testo: " ;
    Text [ portuguese_brazilian ] = "Textblock : " ;
    Text [ portuguese ] = "Módulo de texto : " ;
    Text [ french ] = "Module de texte :  " ;
    Text [ dutch ] = "Tekstbouwsteen :  " ;
    Text [ spanish ] = "Módulo de texto :  " ;
    Text [ danish ] = "Tekstelement : " ;
    Text [ swedish ] = "Textblock :  " ;
    Text [ finnish ] = "Textblock : " ;
    Text [ english_us ] = "Text block : " ;
    Text[ chinese_simplified ] = "´ÊÌõ: ";
    Text[ russian ] = "Òåêñòîâûé áëîê :  ";
    Text[ polish ] = "Blok tekstu :  ";
    Text[ japanese ] = "÷½ÄÌÞÛ¯¸: ";
    Text[ chinese_traditional ] = "¶µ¥Ø¡G ";
    Text[ arabic ] = "ÚäÕÑ ÇáäÕ : ";
    Text[ greek ] = "ÔìÞìá êåéìÝíïõ : ";
    Text[ korean ] = "ÅØ½ºÆ® ºí·Ï : ";
    Text[ turkish ] = "Metin öðesi: ";
    Text[ language_user1 ] = " ";
};
ModalDialog DLG_RENAME_GLOS
{
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 287 , 47 ) ;
    Text = "Textbaustein umbenennen" ;
    Text [ ENGLISH ] = "Rename textblock" ;
    Moveable = TRUE ;
    HelpID = HID_RENAME_GLOSSARY ;
    OKButton BT_OKNEW
    {
        Disable = TRUE ;
        Pos = MAP_APPFONT ( 231 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        DefButton = TRUE ;
        TabStop = TRUE ;
    };
    CancelButton BT_CANCEL
    {
        Pos = MAP_APPFONT ( 231 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    FixedText FT_ON
    {
        Pos = MAP_APPFONT ( 12 , 14 ) ;
        Size = MAP_APPFONT ( 30 , 8 ) ;
         // ### ACHTUNG: Neuer Text in Resource? Na~me : Name
        Text = "Na~me" ;
        Text [ ENGLISH ] = "Name" ;
        Text [ dutch ] = "Naa~m" ;
        Text [ english_us ] = "Na~me" ;
        Text [ italian ] = "Nome" ;
        Text [ spanish ] = "N~ombre" ;
        Text [ french ] = "~Nom" ;
        Text [ swedish ] = "Na~mn" ;
        Text [ danish ] = "Navn" ;
        Text [ portuguese_brazilian ] = "Na~me" ;
        Text [ portuguese ] = "No~me" ;
        Text[ chinese_simplified ] = "Ãû³Æ(~M)";
        Text[ russian ] = "Àâòîòåêñò";
        Text[ polish ] = "Nazwa";
        Text[ japanese ] = "–¼‘O(~M)";
        Text[ chinese_traditional ] = "¦WºÙ(~M)";
        Text[ arabic ] = "ÇáÇÓã";
        Text[ greek ] = "¼íïìá";
        Text[ korean ] = "À̸§(~M)";
        Text[ turkish ] = "Ad";
        Text[ language_user1 ] = " ";
    };
    Edit ED_ON
    {
        ReadOnly = TRUE ;
        Border = TRUE ;
        Pos = MAP_APPFONT ( 44 , 12 ) ;
        Size = MAP_APPFONT ( 118 , 12 ) ;
        Left = TRUE ;
    };
    FixedText FT_OS
    {
        Pos = MAP_APPFONT ( 165 , 14 ) ;
        Size = MAP_APPFONT ( 34 , 8 ) ;
         // ### ACHTUNG: Neuer Text in Resource? Kü~rzel : Kürzel
        /* ### ACHTUNG: Neuer Text in Resource? Kü~rzel : K³~rzel */
        Text = "Kü~rzel" ;
        Text [ ENGLISH ] = "Shortcut" ;
        Text [ english_us ] = "Short~cut" ;
        Text [ italian ] = "Sigla" ;
        Text [ spanish ] = "~Abrev." ;
        Text [ french ] = "Ab~r." ;
        Text [ dutch ] = "Afko~rting" ;
        Text [ swedish ] = "~Förkortning" ;
        Text [ danish ] = "Genvej" ;
        Text [ portuguese_brazilian ] = "Kü~rzel" ;
        Text [ portuguese ] = "Iniciais" ;
        Text[ chinese_simplified ] = "Ëõд(~C)";
        Text[ russian ] = "Ñîêðàùåíèå";
        Text[ polish ] = "Inicja³y";
        Text[ japanese ] = "¼®°Ä¶¯Ä·°";
        Text[ chinese_traditional ] = "ÁY¼g(~C)";
        Text[ arabic ] = "ÇáÇÎÊÕÇÑ";
        Text[ greek ] = "Óõíôüìåõóç";
        Text[ korean ] = "¹Ù·Î°¡±â(~C)";
        Text[ turkish ] = "Kýsaltma";
        Text[ language_user1 ] = " ";
    };
    Edit ED_OS
    {
        ReadOnly = TRUE ;
        Border = TRUE ;
        Pos = MAP_APPFONT ( 200 , 12 ) ;
        Size = MAP_APPFONT ( 21 , 12 ) ;
        Left = TRUE ;
    };
    FixedText FT_NN
    {
        Pos = MAP_APPFONT ( 12 , 29 ) ;
        Size = MAP_APPFONT ( 30 , 8 ) ;
        Text = "~Neu" ;
        Text [ ENGLISH ] = "~New" ;
        Text [ dutch ] = "~Nieuw" ;
        Text [ english_us ] = "~New" ;
        Text [ italian ] = "~Nuovo" ;
        Text [ spanish ] = "~Nuevo" ;
        Text [ french ] = "Nou~veau" ;
        Text [ swedish ] = "~Nytt" ;
        Text [ danish ] = "Ny" ;
        Text [ portuguese ] = "~Novo" ;
        Text [ portuguese_brazilian ] = "~Neu" ;
        Text[ chinese_simplified ] = "н¨(~N)";
        Text[ russian ] = "Ñîçä~àòü";
        Text[ polish ] = "Nowy";
        Text[ japanese ] = "V‹Kì¬(~N)";
        Text[ chinese_traditional ] = "¶}±Ò·sÀÉ(~N)";
        Text[ arabic ] = "ÌÏíÏ";
        Text[ greek ] = "Äçìéïõñãßá";
        Text[ korean ] = "»õ·Î(~N)";
        Text[ turkish ] = "Yeni";
        Text[ language_user1 ] = " ";
    };
    Edit ED_NN
    {
        TabStop = TRUE ;
        Border = TRUE ;
        Pos = MAP_APPFONT ( 44 , 27 ) ;
        Size = MAP_APPFONT ( 118 , 12 ) ;
        Left = TRUE ;
    };
    FixedText FT_NS
    {
        Pos = MAP_APPFONT ( 165 , 29 ) ;
        Size = MAP_APPFONT ( 34 , 8 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? ~Kürzel : ~K³rzel */
        Text = "~Kürzel" ;
        Text [ ENGLISH ] = "~Shortcut" ;
        Text [ english_us ] = "~Shortcut" ;
        Text [ italian ] = "Sigla" ;
        Text [ spanish ] = "~Abreviatura" ;
        Text [ french ] = "~Abr." ;
        Text [ dutch ] = "~Afkorting" ;
        Text [ swedish ] = "~Ersätt" ;
        Text [ danish ] = "Erstat" ;
        Text [ portuguese_brazilian ] = "~Kürzel" ;
        Text [ portuguese ] = "S~ubstituir" ;
        Text[ chinese_simplified ] = "Á´½Ó(~S)";
        Text[ russian ] = "Ñîêðàùåíèå";
        Text[ polish ] = "Inicja³y";
        Text[ japanese ] = "¼®°Ä¶¯Ä·°";
        Text[ chinese_traditional ] = "±¶®|(~S)";
        Text[ arabic ] = "ÇáÇÎÊÕÇÑ";
        Text[ greek ] = "Óõíôüìåõóç";
        Text[ korean ] = "¹Ù·Î°¡±â(~S)";
        Text[ turkish ] = "Kýsaltma";
        Text[ language_user1 ] = " ";
    };
    Edit ED_NS
    {
        TabStop = TRUE ;
        Border = TRUE ;
        Pos = MAP_APPFONT ( 200 , 27 ) ;
        Size = MAP_APPFONT ( 21 , 12 ) ;
        Left = TRUE ;
    };
    GroupBox GB_NN
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 219 , 41 ) ;
    };
    Text [ dutch ] = "Naam tekstbouwsteen wijzigen" ;
    Text [ english_us ] = "Rename Text Block" ;
    Text [ italian ] = "Rinomina modulo di testo" ;
    Text [ spanish ] = "Cambiar nombre al módulo de texto" ;
    Text [ french ] = "Renommer le module de texte" ;
    Text [ swedish ] = "Byt namn på textblock" ;
    Text [ danish ] = "Omdøb tekstelement" ;
    Text [ portuguese_brazilian ] = "Textbaustein umbenennen" ;
    Text [ portuguese ] = "Mudar nome do módulo de texto" ;
    Text[ chinese_simplified ] = "ÖØÃüÃû´ÊÌõ";
    Text[ russian ] = "Ïåðåèìåíîâàòü àâòîòåêñò";
    Text[ polish ] = "Zmieñ nazwê bloków tekstu";
    Text[ japanese ] = "÷½ÄÌÞÛ¯¸‚Ì–¼‘O‚̕ύX";
    Text[ chinese_traditional ] = "­«·s©R¦W¶µ¥Ø";
    Text[ arabic ] = "ÅÚÇÏÉ ÊÓãíÉ ÚäÕÑ ÇáäÕ";
    Text[ greek ] = "Ìåôïíïìáóßá ôìÞìáôïò êåéìÝíïõ";
    Text[ korean ] = "ÅØ½ºÆ® ºí·Ï À̸§ ¹Ù²Ù±â";
    Text[ turkish ] = "Metin öðesini yeniden adlandýr";
    Text[ language_user1 ] = " ";
};
String STR_SAVE_GLOSSARY
{
    Text= "Textbaustein speichern";
    Text[ italian ] = "Salva modulo di testo";
    Text[ portuguese_brazilian ] = "Textbaustein speichern";
    Text[ portuguese ] = "Guardar módulo de texto";
    Text[ danish ] = "Gem tekstelementer";
    Text[ french ] = "Enregistrer le module de texte";
    Text[ swedish ] = "Spara textblock";
    Text[ dutch ] = "Tekstbouwsteen opslaan";
    Text[ spanish ] = "Guardar módulo de texto";
    Text[ english_us ] = "Save Text Block";
    Text[ chinese_simplified ] = "´æÅÌ´ÊÌõ";
    Text[ russian ] = "Ñîõðàíèòü òåêñòîâûé áëîê";
    Text[ polish ] = "Zapisz blok tekstu";
    Text[ japanese ] = "÷½ÄÌÞÛ¯¸‚̕ۑ¶";
    Text[ chinese_traditional ] = "Àx¦s¶µ¥Ø";
    Text[ arabic ] = "ÍÝÙ ÚäÕÑ ÇáäÕ";
    Text [ English ] = "Save textblock" ;
    Text[ greek ] = "ÁðïèÞêåõóç ôìÞìáôïò êåéìÝíïõ";
    Text[ korean ] = "ÅØ½ºÆ® ºí·Ï ÀúÀå";
    Text[ turkish ] = "Metin öðesi";
    Text[ language_user1 ] = " ";
};
InfoBox MSG_NO_GLOSSARIES
{
    MESSAGE = "Diese Datei enthält keine Textbausteine." ;
    MESSAGE [ ENGLISH ] = "There are no textblocks in this file." ;
    MESSAGE[ english_us ] = "There is no AutoText in this file.";
    MESSAGE[ portuguese ] = "Este ficheiro não contém módulos de texto.";
    MESSAGE[ russian ] = "Ýòîò ôàéë íå ñîäåðæèò ýëåìåíòîâ òåêñòà.";
    MESSAGE[ greek ] = "Ôï áñ÷åßï áõôü äåí ðåñéÝ÷åé ôìÞìáôá êåéìÝíïõ.";
    MESSAGE[ dutch ] = "Dit bestand bevat geen tekstbouwstenen";
    MESSAGE[ french ] = "Ce fichier ne contient aucun module de texte.";
    MESSAGE[ spanish ] = "Este archivo no contiene módulos de texto.";
    MESSAGE[ italian ] = "Questo documento non contiene testi automatici.";
    MESSAGE[ danish ] = "Denne fil indeholder ingen tekstelementer.";
    MESSAGE[ swedish ] = "Den här filen innehåller inga textblock.";
    MESSAGE[ polish ] = "Plik ten nie zawiera ¿adnych bloków tekstu.";
    MESSAGE[ portuguese_brazilian ] = "There are no textblocks in this file.";
    MESSAGE[ japanese ] = "‚±‚Ì̧²Ù‚É‚Í÷½ÄÌÞÛ¯¸‚ª‚ ‚è‚Ü‚¹‚ñB";
    MESSAGE[ korean ] = "ÀÌ ÆÄÀÏ¿¡´Â ÀÚµ¿ ÅØ½ºÆ®°¡ ¾ø½À´Ï´Ù. .";
    MESSAGE[ chinese_simplified ] = "Õâ¸öÎļþÄÚ²»°üº¬´ÊÌõ";
    MESSAGE[ chinese_traditional ] = "³o­ÓÀɮרS¦³¤å¦r¬q";
    MESSAGE[ arabic ] = "áÇ íÍÊæí åÐÇ ÇáãáÝ Úáì ßÊá äÕíÉ.";
    MESSAGE[ turkish ] = "Bu dosya metin bileþenleri içermiyor";
};
diff --git a/sw/source/ui/misc/glshell.cxx b/sw/source/ui/misc/glshell.cxx
new file mode 100644
index 0000000..0d49ae6
--- /dev/null
+++ b/sw/source/ui/misc/glshell.cxx
@@ -0,0 +1,515 @@
/*************************************************************************
 *
 *  $RCSfile: glshell.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:44 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _LIST_HXX //autogen
#include <tools/list.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _SFX_PRINTER_HXX //autogen
#include <sfx2/printer.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SFXSIDS_HRC //autogen
#include <sfx2/sfxsids.hrc>
#endif
#ifndef _SVX_SRCHITEM_HXX
#include <svx/srchitem.hxx>
#endif
#ifndef _OFAACCFG_HXX //autogen
#include <offmgr/ofaaccfg.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _SFXMACITEM_HXX
#include <svtools/macitem.hxx>
#endif
#ifndef _GLOSHDL_HXX
#include <gloshdl.hxx>
#endif

#ifndef _UITOOL_HXX
#include <uitool.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _GLSHELL_HXX
#include <glshell.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _GLOSDOC_HXX
#include <glosdoc.hxx>
#endif
#ifndef _SHELLIO_HXX
#include <shellio.hxx>
#endif
#ifndef _INITUI_HXX
#include <initui.hxx>                   // fuer ::GetGlossaries()
#endif
#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _SWERROR_H
#include <swerror.h>
#endif
#ifndef _MISC_HRC
#include <misc.hrc>
#endif


#define SwWebGlosDocShell
#define SwGlosDocShell
#ifndef _ITEMDEF_HXX
#include <itemdef.hxx>
#endif
#ifndef _SWSLOTS_HXX
#include <swslots.hxx>
#endif


SFX_IMPL_INTERFACE( SwGlosDocShell, SwDocShell, SW_RES(0) )
{
}


SFX_IMPL_INTERFACE( SwWebGlosDocShell, SwWebDocShell, SW_RES(0) )
{
}


TYPEINIT1( SwGlosDocShell, SwDocShell );
TYPEINIT1( SwWebGlosDocShell, SwWebDocShell );


void lcl_Execute( SwDocShell& rSh, SfxRequest& rReq )
{
    if ( rReq.GetSlot() == SID_SAVEDOC )
    {
        if( !rSh.HasName() )
        {
            rReq.SetReturnValue( SfxBoolItem( 0, rSh.Save() ) );
        }
        else
        {
            const SfxBoolItem* pRes = ( const SfxBoolItem* )
                                        rSh.ExecuteSlot( rReq,
                                        rSh.SfxObjectShell::GetInterface() );
            if( pRes->GetValue() )
                rSh.GetDoc()->ResetModified();
        }
    }
}


void lcl_GetState( SwDocShell& rSh, SfxItemSet& rSet )
{
    if( SFX_ITEM_AVAILABLE >= rSet.GetItemState( SID_SAVEDOC, FALSE ))
    {
        if( !rSh.GetDoc()->IsModified() )
            rSet.DisableItem( SID_SAVEDOC );
        else
            rSet.Put( SfxStringItem( SID_SAVEDOC, SW_RESSTR(STR_SAVE_GLOSSARY)));
    }
}


BOOL lcl_Save( SwWrtShell& rSh, const String& rGroupName,
                const String& rShortNm, const String& rLongNm )
{
    const OfaAutoCorrCfg* pCfg = OFF_APP()->GetAutoCorrConfig();
    SwTextBlocks * pBlock = ::GetGlossaries()->GetGroupDoc( rGroupName );

    SvxMacro aStart(aEmptyStr, aEmptyStr);
    SvxMacro aEnd(aEmptyStr, aEmptyStr);

    SwGlossaryHdl* pGlosHdl = rSh.GetView().GetGlosHdl();
    pGlosHdl->GetMacros( rShortNm, aStart, aEnd, pBlock );



    USHORT nRet = rSh.SaveGlossaryDoc( *pBlock, rLongNm, rShortNm,
                                pCfg->IsSaveRelFile(), pCfg->IsSaveRelNet(),
                                pBlock->IsOnlyTextBlock( rShortNm ) );

    if(aStart.GetMacName().Len() || aEnd.GetMacName().Len())
    {
        SvxMacro* pStart = aStart.GetMacName().Len() ? &aStart : 0;
        SvxMacro* pEnd = aEnd.GetMacName().Len() ? &aEnd : 0;
        pGlosHdl->SetMacros( rShortNm, pStart, pEnd, pBlock );
    }

    rSh.EnterStdMode();
    if( USHRT_MAX != nRet )
        rSh.ResetModified();
    delete pBlock;
    return nRet != USHRT_MAX;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


SwGlosDocShell::SwGlosDocShell()
    : SwDocShell( SFX_CREATE_MODE_STANDARD )
{
    SetHelpId(SW_GLOSDOCSHELL);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


SwGlosDocShell::~SwGlosDocShell(  )
{
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwGlosDocShell::Execute( SfxRequest& rReq )
{
    ::lcl_Execute( *this, rReq );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwGlosDocShell::GetState( SfxItemSet& rSet )
{
    ::lcl_GetState( *this, rSet );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


BOOL SwGlosDocShell::Save()
{
    return ::lcl_Save( *GetWrtShell(), aGroupName, aShortName, aLongName );
}


/**/

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


SwWebGlosDocShell::SwWebGlosDocShell()
    : SwWebDocShell( SFX_CREATE_MODE_STANDARD )
{
    SetHelpId(SW_WEBGLOSDOCSHELL);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


SwWebGlosDocShell::~SwWebGlosDocShell(  )
{
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwWebGlosDocShell::Execute( SfxRequest& rReq )
{
    ::lcl_Execute( *this, rReq );
}
/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwWebGlosDocShell::GetState( SfxItemSet& rSet )
{
    ::lcl_GetState( *this, rSet );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


BOOL SwWebGlosDocShell::Save()
{
    return ::lcl_Save( *GetWrtShell(), aGroupName, aShortName, aLongName );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


SV_DECL_REF(SwDocShell)
SV_IMPL_REF(SwDocShell)

void SwGlossaries::EditGroupDoc( const String& rGroup, const String& rShortName )
{
    SwTextBlocks* pGroup = GetGroupDoc( rGroup );
    if(pGroup->IsOld())
    {
        pGroup->ConvertToNew();
        if( pGroup->GetError() )
            ErrorHandler::HandleError( pGroup->GetError() );
    }

    if( pGroup && pGroup->GetCount() )
    {
        SwDocShellRef xDocSh;

        // erfrage welche View registriert ist. Im WebWriter gibts es keine
        // normale View
        USHORT nViewId = 0 != &SwView::Factory() ? 2 : 6;
        String sLongName = pGroup->GetLongName(pGroup->GetIndex( rShortName ));

        if( 6 == nViewId )
        {
            xDocSh = new SwWebGlosDocShell();
            SwWebGlosDocShell* pDocSh = (SwWebGlosDocShell*)&xDocSh;
            pDocSh->DoInitNew( 0 );

            pDocSh->SetLongName( sLongName );
            pDocSh->SetShortName( rShortName);
            pDocSh->SetGroupName( rGroup );
        }
        else
        {
            xDocSh = new SwGlosDocShell();
            SwGlosDocShell* pDocSh = (SwGlosDocShell*)&xDocSh;
            pDocSh->DoInitNew( 0 );

            pDocSh->SetLongName( sLongName );
            pDocSh->SetShortName( rShortName );
            pDocSh->SetGroupName( rGroup );
        }

        // Dokumenttitel setzen
        SfxViewFrame* pFrame = SFX_APP()->CreateViewFrame( *xDocSh, nViewId );
        String aDocTitle(SW_RES( STR_GLOSSARY ));
        aDocTitle += sLongName;

        BOOL bDoesUndo = xDocSh->GetDoc()->DoesUndo();
        xDocSh->GetDoc()->DoUndo( FALSE );

        xDocSh->GetWrtShell()->InsertGlossary( *pGroup, rShortName );
        if( !xDocSh->GetDoc()->GetPrt() )
        {
            // wir erzeugen einen default SfxPrinter.
            // Das ItemSet wird vom Sfx geloescht!
            SfxItemSet *pSet = new SfxItemSet( xDocSh->GetDoc()->GetAttrPool(),
                        FN_PARAM_ADDPRINTER, FN_PARAM_ADDPRINTER,
                        SID_PRINTER_NOTFOUND_WARN, SID_PRINTER_NOTFOUND_WARN,
                        SID_PRINTER_CHANGESTODOC, SID_PRINTER_CHANGESTODOC,
                        0 );
            SfxPrinter* pPrinter = new SfxPrinter( pSet );

            // und haengen ihn ans Dokument.
            xDocSh->GetDoc()->SetPrt( pPrinter );
        }

        xDocSh->SetTitle( aDocTitle );
        xDocSh->GetDoc()->DoUndo( bDoesUndo );
        xDocSh->GetDoc()->ResetModified();
        pFrame->GetFrame()->Appear();
        delete pGroup;
    }
}


/*------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.59  2000/09/18 16:05:57  willem.vandorp
    OpenOffice header added.

    Revision 1.58  2000/05/10 11:53:43  os
    Basic API removed

    Revision 1.57  1999/12/22 09:21:04  os
    #71203# editing of AutoText: keep macros

    Revision 1.56  1999/07/23 08:23:24  OS
    #67828# glossary - methods on doc level


      Rev 1.55   23 Jul 1999 10:23:24   OS
   #67828# glossary - methods on doc level

      Rev 1.54   09 Feb 1999 10:47:04   OS
   #61205# AutoText-Gruppen koennen beliebige Namen erhalten

      Rev 1.53   22 Jan 1999 13:06:14   JP
   Task #61076#: UndoFlag zuruecksetzen

      Rev 1.52   27 Jun 1998 15:59:06   JP
   neu: Textbausteine ohne Formatierung

      Rev 1.51   19 Jan 1998 11:57:42   MBA
   CreateViewFrame verwenden

      Rev 1.50   25 Nov 1997 11:58:26   TJ
   include fuer SfxPrinter

      Rev 1.49   24 Nov 1997 16:47:44   MA
   includes

      Rev 1.48   13 Nov 1997 13:21:16   MH
   chg: header

      Rev 1.47   03 Sep 1997 19:09:14   MBA
   Kein wswslots.hxx mehr includen

      Rev 1.46   01 Sep 1997 13:16:34   OS
   DLL-Umstellung

      Rev 1.45   26 Aug 1997 16:05:10   HJS
   internal comp. err. - header vor-includet

      Rev 1.44   05 Aug 1997 16:14:20   TJ
   include svx/srchitem.hxx

      Rev 1.43   31 Jul 1997 15:22:04   MH
   chg: header

      Rev 1.42   11 Jul 1997 16:35:46   JP
   Bug #41481#: SaveGlossaryDoc - beachtet auch Tabellen am Anfang

      Rev 1.41   07 Apr 1997 16:08:24   MH
   chg: header

      Rev 1.40   12 Feb 1997 12:01:16   JP
   neu: WebGlossryDocShell

      Rev 1.39   11 Nov 1996 11:05:46   MA
   ResMgr

      Rev 1.38   15 Oct 1996 14:13:26   JP
   AutoCorrCfg in die OfficeApplication verschoben

      Rev 1.37   23 Sep 1996 08:07:54   OS
   Statusstring fuer SID_SAVE

      Rev 1.36   28 Aug 1996 14:12:12   OS
   includes

      Rev 1.35   09 Aug 1996 11:08:04   OS
   Appear am Frame aufrufen, damit das Fenster richtige erkannt wird

      Rev 1.34   08 Aug 1996 21:37:50   JP
   Save: das gesamte Doc selektieren, nicht den akt. Bereich

      Rev 1.33   09 Jul 1996 10:11:16   OS
   Autotexte relativ sichern

      Rev 1.32   25 Jun 1996 18:39:36   HJS
   includes

      Rev 1.31   19 Jun 1996 12:29:24   OM
   Umstellung auf 323

      Rev 1.30   27 Mar 1996 09:39:20   OS
   GlosDocShell ueber Ref anlegen

      Rev 1.29   22 Mar 1996 14:06:50   HJS
   umstellung 311

      Rev 1.28   14 Dec 1995 23:00:40   JP
   Filter Umstellung: ErrorHandling und Read/Write-Parameter

      Rev 1.27   03 Dec 1995 11:24:32   OS
   +include itemdef.hxx

      Rev 1.26   29 Nov 1995 13:47:00   OS
   -slotadd.hxx

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/misc/impfnote.hxx b/sw/source/ui/misc/impfnote.hxx
new file mode 100644
index 0000000..a60e2842a
--- /dev/null
+++ b/sw/source/ui/misc/impfnote.hxx
@@ -0,0 +1,155 @@
/*************************************************************************
 *
 *  $RCSfile: impfnote.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:45 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _IMPFNOTE_HXX
#define _IMPFNOTE_HXX

#ifndef _SFXTABDLG_HXX //autogen
#include <sfx2/tabdlg.hxx>
#endif
#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif
#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif
#ifndef _LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif
#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif
#ifndef _FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif

class SwWrtShell;

class SwEndNoteOptionPage : public SfxTabPage
{
    RadioButton aPosPageBox;
    RadioButton aPosChapterBox;
    GroupBox aPosGrp;

    ListBox         aNumViewBox;
    FixedText       aOffsetLbl;
    NumericField    aOffsetFld;
    ListBox         aNumCountBox;
    FixedText       aPrefixFT;
    Edit            aPrefixED;
    FixedText       aSuffixFT;
    Edit            aSuffixED;
    GroupBox        aNumGrp;

    FixedText       aParaTemplLbl;
    ListBox         aParaTemplBox;
    FixedText       aPageTemplLbl;
    ListBox         aPageTemplBox;
    GroupBox        aTemplGrp;

    FixedText       aFtnCharAnchorTemplLbl;
    ListBox         aFtnCharAnchorTemplBox;
    FixedText       aFtnCharTextTemplLbl;
    ListBox         aFtnCharTextTemplBox;
    GroupBox        aCharTemplGrp;

    FixedText aContLbl;
    Edit aContEdit;
    FixedText aContFromLbl;
    Edit aContFromEdit;
    GroupBox aContGrp;

    String aNumPage;
    SwWrtShell *pSh;
    BOOL    bPosDoc;
    BOOL    bEndNote;

    inline void SelectNumbering(int eNum);
    int GetNumbering() const;

    DECL_LINK( PosPage, Button * );
    DECL_LINK( PosChapter, Button * );
    DECL_LINK( NumCount, ListBox * );


public:
    SwEndNoteOptionPage( Window *pParent, BOOL bEndNote,
                         const SfxItemSet &rSet );
    ~SwEndNoteOptionPage();

    static SfxTabPage *Create(Window *pParent, const SfxItemSet &rSet);
    virtual BOOL FillItemSet(SfxItemSet &rSet);
    virtual void Reset( const SfxItemSet& );

    void SetShell( SwWrtShell &rShell );
};

class SwFootNoteOptionPage : public SwEndNoteOptionPage
{
    SwFootNoteOptionPage( Window *pParent, const SfxItemSet &rSet );
    ~SwFootNoteOptionPage();

public:
    static SfxTabPage *Create(Window *pParent, const SfxItemSet &rSet);
};



#endif
diff --git a/sw/source/ui/misc/insfnote.cxx b/sw/source/ui/misc/insfnote.cxx
new file mode 100644
index 0000000..19caab6
--- /dev/null
+++ b/sw/source/ui/misc/insfnote.cxx
@@ -0,0 +1,487 @@
/*************************************************************************
 *
 *  $RCSfile: insfnote.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:45 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SVX_CHARMAP_HXX //autogen
#include <svx/charmap.hxx>
#endif
#ifndef _SVX_FONTITEM_HXX //autogen
#include <svx/fontitem.hxx>
#endif
#ifndef _SV_MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif


#ifndef _FMTFTN_HXX //autogen
#include <fmtftn.hxx>
#endif
#include <swundo.hxx>
#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _BASESH_HXX
#include <basesh.hxx>
#endif
#ifndef _INSFNOTE_HXX
#include <insfnote.hxx>
#endif

#ifndef _MISC_HRC
#include <misc.hrc>
#endif
#ifndef _INSFNOTE_HRC
#include <insfnote.hrc>
#endif

static BOOL bFootnote = TRUE;

/*------------------------------------------------------------------------
 Beschreibung:  Einfuegen der Fussnote durch OK
------------------------------------------------------------------------*/

void __EXPORT SwInsFootNoteDlg::Apply()
{
    String aStr;

    if ( aNumberCharBtn.IsChecked() )
        aStr = aNumberCharEdit.GetText();

    if ( bEdit )
    {
        rSh.StartAction();
        rSh.Left();
        rSh.StartUndo( UNDO_START );
        SwFmtFtn aNote( aEndNoteBtn.IsChecked() );
        aNote.SetNumStr( aStr );

        if( rSh.SetCurFtn( aNote ) && bExtCharAvailable )
        {
            rSh.Right(TRUE);
            SfxItemSet aSet( rSh.GetAttrPool(), RES_CHRATR_FONT, RES_CHRATR_FONT );
            rSh.GetAttr( aSet );
            SvxFontItem &rFont = (SvxFontItem &) aSet.Get( RES_CHRATR_FONT );
            SvxFontItem aFont( rFont.GetFamily(), aFontName,
                               rFont.GetStyleName(), rFont.GetPitch(),
                               eCharSet );
            aSet.Put( aFont );
            rSh.SetAttr( aSet, SETATTR_DONTEXPAND );
            rSh.ResetSelect(0, FALSE);
            rSh.Left();
        }
        rSh.EndUndo( UNDO_END );
        rSh.EndAction();
    }
    else
    {
        rSh.StartUndo( UIUNDO_INSERT_FOOTNOTE );
        rSh.InsertFootnote( aStr, aEndNoteBtn.IsChecked(), !bExtCharAvailable );

        if ( bExtCharAvailable )
        {
            rSh.Left( TRUE );
            SfxItemSet aSet( rSh.GetAttrPool(), RES_CHRATR_FONT, RES_CHRATR_FONT );
            rSh.GetAttr( aSet );
            SvxFontItem &rFont = (SvxFontItem &) aSet.Get( RES_CHRATR_FONT );
            SvxFontItem aFont( rFont.GetFamily(), aFontName,
                               rFont.GetStyleName(), rFont.GetPitch(),
                               eCharSet );
            aSet.Put( aFont );
            rSh.SetAttr( aSet, SETATTR_DONTEXPAND );
            // zur Bearbeitung des Fussnotentextes
            rSh.ResetSelect(0, FALSE);
            rSh.GotoFtnTxt();
        }
        rSh.EndUndo( UIUNDO_INSERT_FOOTNOTE );
    }

    bFootnote = aFtnBtn.IsChecked();
}


/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

IMPL_LINK_INLINE_START( SwInsFootNoteDlg, NumberCharHdl, Button *, EMPTYARG )
{
    aNumberCharEdit.GrabFocus();
    aOkBtn.Enable( aNumberCharEdit.GetText().Len() || bExtCharAvailable );
    return 0;
}
IMPL_LINK_INLINE_END( SwInsFootNoteDlg, NumberCharHdl, Button *, EMPTYARG )

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

IMPL_LINK_INLINE_START( SwInsFootNoteDlg, NumberEditHdl, void *, EMPTYARG )
{
    aNumberCharBtn.Check( TRUE );
    aOkBtn.Enable( 0 != aNumberCharEdit.GetText().Len() );

    return 0;
}
IMPL_LINK_INLINE_END( SwInsFootNoteDlg, NumberEditHdl, void *, EMPTYARG )

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

IMPL_LINK_INLINE_START( SwInsFootNoteDlg, NumberAutoBtnHdl, Button *, EMPTYARG )
{
    aOkBtn.Enable( TRUE );
    return 0;
}
IMPL_LINK_INLINE_END( SwInsFootNoteDlg, NumberAutoBtnHdl, Button *, EMPTYARG )

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

IMPL_LINK( SwInsFootNoteDlg, NumberExtCharHdl, Button *, EMPTYARG )
{
    aNumberCharBtn.Check( TRUE );

    SfxItemSet aSet( rSh.GetAttrPool(), RES_CHRATR_FONT, RES_CHRATR_FONT );
    rSh.GetAttr( aSet );
    const SvxFontItem &rFont = (SvxFontItem &) aSet.Get( RES_CHRATR_FONT );

    SvxCharacterMap* pDlg = new SvxCharacterMap(this, FALSE);

    Font aDlgFont( pDlg->GetCharFont() );
    aDlgFont.SetName( rFont.GetFamilyName() );
    aDlgFont.SetCharSet( rFont.GetCharSet() );

    pDlg->SetCharFont( aDlgFont );
    if (RET_OK == pDlg->Execute())
    {
        String sExtChars(pDlg->GetCharacters());

        aFontName = pDlg->GetCharFont().GetName();
        eCharSet  = pDlg->GetCharFont().GetCharSet();
        aNumberCharEdit.SetText( sExtChars );
        aNumberCharEdit.SetFont( pDlg->GetCharFont() );
        bExtCharAvailable = TRUE;
        aOkBtn.Enable(0 != aNumberCharEdit.GetText().Len());
    }
    delete pDlg;

    return 0;
}

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

IMPL_LINK( SwInsFootNoteDlg, NextPrevHdl, Button *, pBtn )
{
    Apply();

    // Hier zur naechsten Fuss/Endnote wandern
    rSh.ResetSelect(0, FALSE);
    if (pBtn == &aNextBT)
        rSh.GotoNextFtnAnchor();
    else
        rSh.GotoPrevFtnAnchor();

    Init();

    return 0;
}

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

SwInsFootNoteDlg::SwInsFootNoteDlg(Window *pParent, SwWrtShell &rShell, BOOL bEd) :

    SvxStandardDialog(pParent,SW_RES(DLG_INS_FOOTNOTE)),

    rSh(rShell),
    bEdit(bEd),
    bExtCharAvailable(FALSE),
    aNumberAutoBtn  (this,SW_RES(RB_NUMBER_AUTO)),
    aNumberCharBtn  (this,SW_RES(RB_NUMBER_CHAR)),
    aNumberCharEdit (this,SW_RES(ED_NUMBER_CHAR)),
    aNumberExtChar  (this,SW_RES(BT_NUMBER_CHAR)),
    aNumberFrm      (this,SW_RES(GB_NUMBER)),
    aFtnBtn         (this,SW_RES(RB_TYPE_FTN)),
    aEndNoteBtn     (this,SW_RES(RB_TYPE_ENDNOTE)),
    aTypeBox        (this,SW_RES(GB_TYPE)),

    aOkBtn          (this,SW_RES(BT_OK)),
    aCancelBtn      (this,SW_RES(BT_CANCEL)),
    aHelpBtn        (this,SW_RES(BT_HELP)),
    aPrevBT         (this,SW_RES(BT_PREV)),
    aNextBT         (this,SW_RES(BT_NEXT))
{
    aNumberAutoBtn.SetClickHdl(LINK(this,SwInsFootNoteDlg,NumberAutoBtnHdl));
    aNumberExtChar.SetClickHdl(LINK(this,SwInsFootNoteDlg,NumberExtCharHdl));
    aNumberCharBtn.SetClickHdl(LINK(this,SwInsFootNoteDlg,NumberCharHdl));
    aNumberCharEdit.SetModifyHdl(LINK(this,SwInsFootNoteDlg,NumberEditHdl));
    aNumberCharEdit.SetMaxTextLen(10);
    aNumberCharEdit.Enable();

    aPrevBT.SetClickHdl(LINK(this, SwInsFootNoteDlg, NextPrevHdl));
    aNextBT.SetClickHdl(LINK(this, SwInsFootNoteDlg, NextPrevHdl));

    FreeResource();
    rSh.SetCareWin(this);

    if (bEdit)
    {
        Init();

        aPrevBT.Show();
        aNextBT.Show();
    }
}


/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

SwInsFootNoteDlg::~SwInsFootNoteDlg()
{
    rSh.SetCareWin(0);

    if (bEdit)
        rSh.ResetSelect(0, FALSE);
}

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

void SwInsFootNoteDlg::Init()
{
    SwFmtFtn aFtnNote;
    String sNumStr;
    Font aFont;
    bExtCharAvailable = FALSE;

    rSh.StartAction();

    if( rSh.GetCurFtn( &aFtnNote ))
    {
        if(aFtnNote.GetNumStr().Len())
        {
            sNumStr = aFtnNote.GetNumStr();

            rSh.Right(TRUE);
            SfxItemSet aSet( rSh.GetAttrPool(), RES_CHRATR_FONT, RES_CHRATR_FONT );
            rSh.GetAttr( aSet );
            const SvxFontItem &rFont = (SvxFontItem &) aSet.Get( RES_CHRATR_FONT );

            aFont = aNumberCharEdit.GetFont();
            aFontName = rFont.GetFamilyName();
            eCharSet = rFont.GetCharSet();
            aFont.SetName(aFontName);
            aFont.SetCharSet(eCharSet);
            bExtCharAvailable = TRUE;
            rSh.Left();
        }
        bFootnote = !aFtnNote.IsEndNote();
    }
    aNumberCharEdit.SetFont(aFont);

    BOOL bNumChar = sNumStr.Len() != 0;

    aNumberCharEdit.SetText(sNumStr);
    aNumberCharBtn.Check(bNumChar);
    aNumberAutoBtn.Check(!bNumChar);
    if (bNumChar)
        aNumberCharEdit.GrabFocus();

    if (bFootnote)
        aFtnBtn.Check();
    else
        aEndNoteBtn.Check();

    BOOL bNext = rSh.GotoNextFtnAnchor();

    if (bNext)
        rSh.GotoPrevFtnAnchor();

    BOOL bPrev = rSh.GotoPrevFtnAnchor();

    if (bPrev)
        rSh.GotoNextFtnAnchor();

    aPrevBT.Enable(bPrev);
    aNextBT.Enable(bNext);

    rSh.Right(TRUE);

    rSh.EndAction();
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.46  2000/09/18 16:05:57  willem.vandorp
    OpenOffice header added.

    Revision 1.45  2000/05/10 11:53:43  os
    Basic API removed

    Revision 1.44  2000/02/11 14:56:21  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.43  1999/12/22 19:50:26  jp
    Bug #71204#: SetCurFtn - return change state

    Revision 1.42  1998/04/02 15:17:46  OM
    Fussnoten: Traveling u.a.


      Rev 1.41   02 Apr 1998 17:17:46   OM
   Fussnoten: Traveling u.a.

      Rev 1.40   26 Feb 1998 19:01:10   MA
   #47622# richtig initialisieren

      Rev 1.39   09 Feb 1998 09:55:12   OM
   #46894# Letzten Mode merken

      Rev 1.38   12 Dec 1997 14:46:04   MA
   undo chgftn jetzt in der core

      Rev 1.37   12 Dec 1997 11:04:16   TJ
   include

      Rev 1.36   10 Dec 1997 13:08:56   MA
   weiteres fuer Fuss-/Endnoten

      Rev 1.35   24 Nov 1997 16:47:44   MA
   includes

      Rev 1.34   03 Nov 1997 13:22:42   MA
   precomp entfernt

      Rev 1.33   15 Aug 1997 12:19:34   OS
   chartar/frmatr/txtatr aufgeteilt

      Rev 1.32   07 Apr 1997 16:08:26   MH
   chg: header

      Rev 1.31   11 Nov 1996 11:05:44   MA
   ResMgr

      Rev 1.30   28 Aug 1996 14:12:10   OS
   includes

      Rev 1.29   17 Jul 1996 14:09:04   JP
   SS von GetCurFtn geaendert

      Rev 1.28   06 Feb 1996 15:21:08   JP
   Link Umstellung 305

      Rev 1.27   24 Nov 1995 16:58:44   OM
   PCH->PRECOMPILED

      Rev 1.26   08 Nov 1995 13:31:42   JP
   Umstellung zur 301: Change -> Set

      Rev 1.25   24 Oct 1995 18:19:22   MA
   chg: AutoCheck bei Edit

      Rev 1.24   23 Oct 1995 17:28:00   OS
   Insert/EditFootnote recordable

      Rev 1.23   12 Sep 1995 17:29:32   OM
   Helpbutton eingefuegt

      Rev 1.22   30 Aug 1995 14:00:46   MA
   fix: __EXPORT'iert

      Rev 1.21   24 Aug 1995 14:33:22   MA
   swstddlg -> svxstandarddialog

      Rev 1.20   21 Jun 1995 16:17:32   OS
   Max. Fussnotenlaenge auf 10 begrenzt

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/misc/insfnote.hrc b/sw/source/ui/misc/insfnote.hrc
new file mode 100644
index 0000000..780a89c
--- /dev/null
+++ b/sw/source/ui/misc/insfnote.hrc
@@ -0,0 +1,75 @@
/*************************************************************************
 *
 *  $RCSfile: insfnote.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:45 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#define RB_NUMBER_AUTO      1
#define RB_NUMBER_CHAR      2
#define ED_NUMBER_CHAR      3
#define BT_NUMBER_CHAR      4
#define GB_NUMBER           5
#define GB_TYPE             6
#define RB_TYPE_FTN         7
#define RB_TYPE_ENDNOTE     8

#define BT_OK               100
#define BT_CANCEL           101
#define BT_HELP             102
#define BT_PREV             103
#define BT_NEXT             104
diff --git a/sw/source/ui/misc/insfnote.src b/sw/source/ui/misc/insfnote.src
new file mode 100644
index 0000000..0c5b2d3
--- /dev/null
+++ b/sw/source/ui/misc/insfnote.src
@@ -0,0 +1,318 @@
/*************************************************************************
 *
 *  $RCSfile: insfnote.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:45 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "misc.hrc"
#include "insfnote.hrc"
#include "helpid.h"
 // #define DLG_INS_FOOTNOTE 257
ModalDialog DLG_INS_FOOTNOTE
{
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 145 , 100 ) ;
    /* ### ACHTUNG: Neuer Text in Resource? Fußnote einfügen : Fu˜note einf³gen */
    Text = "Fußnote einfügen" ;
    Text [ ENGLISH ] = "Insert footnote" ;
    Text [ norwegian ] = "Sette inn fotnote" ;
    Text [ italian ] = "Inserisci nota a piè pagina" ;
    Text [ portuguese_brazilian ] = "Inserir nota de rodapé" ;
    Text [ portuguese ] = "Inserir nota de rodapé" ;
    Text [ finnish ] = "Lisää alaviitteen" ;
    Text [ danish ] = "Indsæt fodnote" ;
    Text [ french ] = "Insérer une note de bas de page" ;
    Text [ swedish ] = "Infoga fotnot" ;
    Text [ dutch ] = "Voetnoot invoegen" ;
    Text [ spanish ] = "Insertar nota al pie" ;
    Text [ english_us ] = "Insert Footnote" ;
    Moveable = TRUE ;
    Edit ED_NUMBER_CHAR
    {
        Disable = TRUE ;
        Border = TRUE ;
        Pos = MAP_APPFONT ( 54 , 27 ) ;
        Size = MAP_APPFONT ( 23 , 12 ) ;
        TabStop = TRUE ;
        Group = TRUE ;
        Left = TRUE ;
    };
    OKButton BT_OK
    {
        Pos = MAP_APPFONT ( 89 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        Group = TRUE ;
        DefButton = TRUE ;
    };
    CancelButton BT_CANCEL
    {
        Pos = MAP_APPFONT ( 89 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        Group = TRUE ;
    };
    HelpButton BT_HELP
    {
        Pos = MAP_APPFONT ( 89 , 43 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        Group = TRUE ;
    };
    ImageButton BT_PREV
    {
        Pos = MAP_APPFONT ( 89 , 82 ) ;
        Size = MAP_APPFONT ( 24 , 14 ) ;
        TabStop = TRUE ;
        Hide = TRUE ;
        SYMBOL = IMAGEBUTTON_PREV ;
    };
    ImageButton BT_NEXT
    {
        Pos = MAP_APPFONT ( 115 , 82 ) ;
        Size = MAP_APPFONT ( 24 , 14 ) ;
        TabStop = TRUE ;
        Hide = TRUE ;
        SYMBOL = IMAGEBUTTON_NEXT ;
    };
    RadioButton RB_NUMBER_AUTO
    {
        Pos = MAP_APPFONT ( 12 , 14 ) ;
        Size = MAP_APPFONT ( 54 , 10 ) ;
        Text = "~Automatisch" ;
        Text [ ENGLISH ] = "~Auto" ;
        Text [ norwegian ] = "~Auto" ;
        Text [ italian ] = "~Automatico" ;
        Text [ portuguese_brazilian ] = "~Auto" ;
        Text [ portuguese ] = "~Automática" ;
        Text [ finnish ] = "~Automaattinen" ;
        Text [ danish ] = "Automatisk" ;
        Text [ french ] = "~Automatique" ;
        Text [ swedish ] = "~Automatisk" ;
        Text [ dutch ] = "~Automatisch" ;
        Text [ spanish ] = "~Automático" ;
        Text [ english_us ] = "~Automatic" ;
        TabStop = TRUE ;
        Group = TRUE ;
        Check = TRUE ;
        Text[ chinese_simplified ] = "×Ô¶¯(~A)";
        Text[ russian ] = "Àâòî";
        Text[ polish ] = "~Automatycznie";
        Text[ japanese ] = "Ž©“®(~A)";
        Text[ chinese_traditional ] = "¦Û°Ê(~A)";
        Text[ arabic ] = "ÊáÞÇÆí";
        Text[ greek ] = "Áõôüìáôá";
        Text[ korean ] = "ÀÚµ¿(~A)";
        Text[ turkish ] = "~Otomatik";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_NUMBER_CHAR
    {
        Pos = MAP_APPFONT ( 12 , 27 ) ;
        Size = MAP_APPFONT ( 39 , 10 ) ;
        Text = "~Zeichen" ;
        Text [ ENGLISH ] = "~Char" ;
        Text [ norwegian ] = "~Tegn" ;
        Text [ italian ] = "~Carattere" ;
        Text [ portuguese_brazilian ] = "~Caracter" ;
        Text [ portuguese ] = "~Caracteres" ;
        Text [ finnish ] = "~Merkki" ;
        Text [ danish ] = "Tegn" ;
        Text [ french ] = "~Caractère" ;
        Text [ swedish ] = "~Tecken" ;
        Text [ dutch ] = "~Teken" ;
        Text [ spanish ] = "~Caracteres" ;
        Text [ english_us ] = "~Character" ;
        Text[ chinese_simplified ] = "×Ö·û(~C)";
        Text[ russian ] = "Çíàê";
        Text[ polish ] = "Znak";
        Text[ japanese ] = "•¶Žš(~C)";
        Text[ chinese_traditional ] = "¦r¤¸(~C)";
        Text[ arabic ] = "ÃÍÑÝ";
        Text[ greek ] = "×áñáêôÞñåò";
        Text[ korean ] = "¹®ÀÚ(~C)";
        Text[ turkish ] = "~Karakter";
        Text[ language_user1 ] = " ";
    };
    GroupBox GB_NUMBER
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 77 , 54 ) ;
        Text = "Nummerierung" ;
        Text [ ENGLISH ] = "Numbering" ;
        Text [ norwegian ] = "Nummering" ;
        Text [ italian ] = "Numerazione" ;
        Text [ portuguese_brazilian ] = "Numeração" ;
        Text [ portuguese ] = "Numeração" ;
        Text [ finnish ] = "Numerointi" ;
        Text [ danish ] = "Nummerering" ;
        Text [ french ] = "Numérotation" ;
        Text [ swedish ] = "Numrering" ;
        Text [ dutch ] = "Nummering" ;
        Text [ spanish ] = "Numeración" ;
        Text [ english_us ] = "Numbering" ;
        Text[ chinese_simplified ] = "񅧏";
        Text[ russian ] = "Íóìåðàöèÿ";
        Text[ polish ] = "Numeracja";
        Text[ japanese ] = "”ԍ†•t‚¯";
        Text[ chinese_traditional ] = "½s¸¹";
        Text[ arabic ] = "ÇáÊÑÞíã";
        Text[ greek ] = "Áñßèìçóç";
        Text[ korean ] = "¹øÈ£ ¸Å±â±â";
        Text[ turkish ] = "Numaralama";
        Text[ language_user1 ] = " ";
    };
    PushButton BT_NUMBER_CHAR
    {
        Pos = MAP_APPFONT ( 54 , 42 ) ;
        Size = MAP_APPFONT ( 12 , 12 ) ;
        Text = "..." ;
    };
    RadioButton RB_TYPE_FTN
    {
        Pos = MAP_APPFONT ( 12 , 70 ) ;
        Size = MAP_APPFONT ( 64 , 10 ) ;
        Text = "~Fußnote" ;
        Text [ ENGLISH ] = "~Footnote" ;
        TabStop = TRUE ;
        Group = TRUE ;
        Check = TRUE ;
        Text [ portuguese ] = "~Nota de rodapé" ;
        Text [ english_us ] = "~Footnote" ;
        Text [ portuguese_brazilian ] = "~Fußnote" ;
        Text [ swedish ] = "~Fotnot" ;
        Text [ danish ] = "Fodnote" ;
        Text [ italian ] = "~Nota a piè pagina" ;
        Text [ spanish ] = "N~ota al pie" ;
        Text [ french ] = "Note de ~bas de page" ;
        Text [ dutch ] = "~Voetnoot" ;
        Text[ chinese_simplified ] = "×¢½Å(~F)";
        Text[ russian ] = "Îáû÷íàÿ";
        Text[ polish ] = "Przypis ~dolny";
        Text[ japanese ] = "‹r’(~‚e)";
        Text[ chinese_traditional ] = "µù¸}(~F)";
        Text[ arabic ] = "ÍÇÔíÉ ÓÝáíÉ";
        Text[ greek ] = "Õðïóçìåßùóç";
        Text[ korean ] = "°¢ÁÖ(~F)";
        Text[ turkish ] = "~Dipnot";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_TYPE_ENDNOTE
    {
        Pos = MAP_APPFONT ( 12 , 83 ) ;
        Size = MAP_APPFONT ( 64 , 10 ) ;
        Text = "~Endnote" ;
        Text [ ENGLISH ] = "~Endnote" ;
        Text [ portuguese ] = "~Nota final" ;
        Text [ english_us ] = "~Endnote" ;
        Text [ portuguese_brazilian ] = "~Endnote" ;
        Text [ swedish ] = "~Slutnot" ;
        Text [ danish ] = "Slutnote" ;
        Text [ italian ] = "~Nota di chiusura" ;
        Text [ spanish ] = "Nota al ~final" ;
        Text [ french ] = "~Note de fin" ;
        Text [ dutch ] = "~Eindnoot" ;
        Text[ chinese_simplified ] = "βע(~E)";
        Text[ russian ] = "Êîíöåâàÿ";
        Text[ polish ] = "P~rzypis koñcowy";
        Text[ japanese ] = "•¶––‹r’(~‚d)";
        Text[ chinese_traditional ] = "§Àª`(~E)";
        Text[ arabic ] = "ÊÚáíÞ ÎÊÇãí";
        Text[ greek ] = "Óçìåßùóç ôÝëïõò";
        Text[ korean ] = "¹ÌÁÖ(~E)";
        Text[ turkish ] = "~Sonnot";
        Text[ language_user1 ] = " ";
    };
    GroupBox GB_TYPE
    {
        Pos = MAP_APPFONT ( 6 , 60 ) ;
        Size = MAP_APPFONT ( 77 , 36 ) ;
        Text = "Art" ;
        Text [ ENGLISH ] = "Type" ;
        Text [ english_us ] = "Type" ;
        Text [ portuguese_brazilian ] = "Art" ;
        Text [ swedish ] = "Typ" ;
        Text [ danish ] = "Type" ;
        Text [ italian ] = "Tipo" ;
        Text [ spanish ] = "Tipo" ;
        Text [ french ] = "Type" ;
        Text [ dutch ] = "Type" ;
        Text [ portuguese ] = "Tipo" ;
        Text[ chinese_simplified ] = "ÀàÐÍ";
        Text[ russian ] = "Òèï ñíîñêè";
        Text[ polish ] = "Typ";
        Text[ japanese ] = "Ží—Þ";
        Text[ chinese_traditional ] = "Ãþ«¬";
        Text[ arabic ] = "ÇáäæÚ";
        Text[ greek ] = "Ôýðïò";
        Text[ korean ] = "ÇüÅÂ";
        Text[ turkish ] = "Tür";
        Text[ language_user1 ] = " ";
    };
    Text[ chinese_simplified ] = "²åÈë×¢½Å";
    Text[ russian ] = "Âñòàâèòü ñíîñêó";
    Text[ polish ] = "Wstaw przypis dolny";
    Text[ japanese ] = "‹r’‚Ì‘}“ü";
    Text[ chinese_traditional ] = "´¡¤Jµù¸}";
    Text[ arabic ] = "ÅÏÑÇÌ ÍÇÔíÉ ÓÝáíÉ";
    Text[ greek ] = "ÐñïóèÞêç õðïóçìåßùóçò";
    Text[ korean ] = "°¢ÁÖ »ðÀÔ";
    Text[ turkish ] = "Dipnot ekle";
    Text[ language_user1 ] = " ";
};
diff --git a/sw/source/ui/misc/insrule.cxx b/sw/source/ui/misc/insrule.cxx
new file mode 100644
index 0000000..b41f960
--- /dev/null
+++ b/sw/source/ui/misc/insrule.cxx
@@ -0,0 +1,377 @@
/*************************************************************************
 *
 *  $RCSfile: insrule.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:45 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "uiparam.hxx"
#include "hintids.hxx"

#ifndef _GALLERY_HXX_ //autogen
#include <svx/gallery.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif

#include "swtypes.hxx"
#include "docsh.hxx"
#include "insrule.hxx"
#include "swvset.hxx"
#include "insrule.hrc"
#include "misc.hrc"
#include "helpid.h"

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/


SwInsertGrfRulerDlg::SwInsertGrfRulerDlg( Window* pParent, SwDocShell* pDocSh ) :
    SfxModalDialog(pParent, SW_RES(DLG_INSERT_RULER)),
    aSelectionGB(this, ResId(GB_SEL     )),
    pExampleVS  (new SwRulerValueSet(this, ResId(VS_EXAMPLE ), aGrfNames, pDocSh)),
    aOkPB       (this, ResId(PB_OK      )),
    aCancelPB   (this, ResId(PB_CANCEL  )),
    aHelpPB     (this, ResId(PB_HELP    )),
    sSimple (ResId(ST_SIMPLE)),
    nSelPos(USHRT_MAX)
{
    FreeResource();
    pExampleVS->SetLineCount(6);
    pExampleVS->SetColCount(1);
    pExampleVS->SetSelectHdl(LINK(this, SwInsertGrfRulerDlg, SelectHdl));
    pExampleVS->SetDoubleClickHdl(LINK(this, SwInsertGrfRulerDlg, DoubleClickHdl));
    pExampleVS->GrabFocus();

    // Grafiknamen ermitteln
    GalleryExplorer::FillObjList( GALLERY_THEME_RULERS, aGrfNames );
    pExampleVS->SetHelpId(HID_VS_RULER);
    Color aColor(COL_WHITE);
    pExampleVS->InsertItem( 1, 1);
    pExampleVS->SetItemText( 1, sSimple);

    for(USHORT i = 1; i <= aGrfNames.Count(); i++)
    {
        pExampleVS->InsertItem( i + 1, i);
        pExampleVS->SetItemText( i + 1, *((String*)aGrfNames.GetObject(i-1)));
    }
    pExampleVS->Show();

}
/*-----------------14.02.97 13.18-------------------

--------------------------------------------------*/

SwInsertGrfRulerDlg::~SwInsertGrfRulerDlg()
{
    delete pExampleVS;
}

/*-----------------14.02.97 13.17-------------------

--------------------------------------------------*/

String SwInsertGrfRulerDlg::GetGraphicName()
{
    String sRet;
    if(nSelPos != USHRT_MAX)
    {
        SvxBmpItemInfo* pInfo = pExampleVS->FindInfo(nSelPos);
        if(pInfo)
            sRet = *pInfo->pBrushItem->GetGraphicLink();
    }
    return sRet;
}

/*-----------------14.02.97 13.20-------------------

--------------------------------------------------*/

IMPL_LINK(SwInsertGrfRulerDlg, SelectHdl, ValueSet*, pVS)
{
    nSelPos = pVS->GetSelectItemId();
    aOkPB.Enable();
    return 0;
}

/*-----------------14.02.97 14.17-------------------

--------------------------------------------------*/

SwRulerValueSet::SwRulerValueSet(   Window* pParent,
                                    const ResId& rResId,
                                    const List& rStrNames,
                                    SwDocShell* pDocSh) :
    SvxBmpNumValueSet(pParent, rResId, rStrNames),
    pSwDocSh(pDocSh)
{

    SetStyle(  GetStyle()
                    & ~WB_ITEMBORDER     );

}

/*-----------------14.02.97 14.17-------------------

--------------------------------------------------*/

SwRulerValueSet::~SwRulerValueSet()
{
}


/*-----------------13.02.97 09.41-------------------

--------------------------------------------------*/

IMPL_STATIC_LINK(SwRulerValueSet, GraphicArrivedHdl_Impl, SvxBrushItem*, pItem)
{
    // Ueber Timer wird ein Format angeworfen
    pThis->GetFormatTimer().Start();
    return 0;
}

/*-----------------14.02.97 13.42-------------------

--------------------------------------------------*/

void __EXPORT SwRulerValueSet::UserDraw( const UserDrawEvent& rUDEvt )
{
    Rectangle aRect = rUDEvt.GetRect();
    OutputDevice*  pDev = rUDEvt.GetDevice();
    USHORT  nItemId = rUDEvt.GetItemId();
    Point aBLPos = aRect.TopLeft();

    const List& rStrList = GetStringList();
    // Itemzaehlung beginnt bei 1, und die 1. ist die einfache Linie
    if(nItemId > 1)
    {
        if(rStrList.Count() > nItemId - 2)
        {
            String* pGrfName = (String*)rStrList.GetObject(nItemId - 2);
            SvxBmpItemInfo* pInfo;
            if(0 == (pInfo = FindInfo(nItemId)))
            {
                pInfo = new SvxBmpItemInfo();
                pInfo->nItemId = nItemId;
                pInfo->pBrushItem = new SvxBrushItem(*pGrfName, aEmptyStr, GPOS_AREA);
                pInfo->pBrushItem->SetDoneLink(STATIC_LINK(
                                        this, SwRulerValueSet, GraphicArrivedHdl_Impl));
                GetGrfBrushItems().Insert(pInfo);
            }

            const Graphic* pGraphic = pInfo->pBrushItem->GetGraphic(pSwDocSh);

            if(pGraphic)
            {
                Size aGrfSize = pGraphic->GetPrefSize();
                if(aGrfSize.Width() && aGrfSize.Height())
                {
                    int nRelGrf = aGrfSize.Height() * 100 / aGrfSize.Width();
                    Size aWinSize = aRect.GetSize();
                    Size aPaintSize = aWinSize;
                    int nRelWin = aWinSize.Height() * 100 / aWinSize.Width();
                    if(nRelGrf > nRelWin)
                    {
                        aPaintSize.Width() = aWinSize.Height() * 100 / nRelGrf;
                        aBLPos.X() += (aWinSize.Width() - aPaintSize.Width()) /2;
                    }
                    else
                    {
                        aPaintSize.Height() = aWinSize.Width() * nRelGrf/100;
                        aBLPos.Y() += (aWinSize.Height() - aPaintSize.Height()) /2;
                    }
                    aBLPos.X() -= aPaintSize.Width() /2;
                    aBLPos.Y() -= aPaintSize.Height() /2;

                    aPaintSize.Width() *= 2;
                    aPaintSize.Height() *= 2;
                    if(aPaintSize.Height() < 2)
                        aPaintSize.Height() = 2;
                    Region aRegion = pDev->GetClipRegion();
                    pDev->SetClipRegion(aRect);
                    pGraphic->Draw(pDev, aBLPos, aPaintSize);
                    pDev->SetClipRegion(aRegion);
                }
            }
            else
            {
                SetGrfNotFound(TRUE);
            }
        }
    }
    else
    {
        // Text fuer einfache Linie painten
        Font aOldFont = pDev->GetFont();
        Font aFont = pDev->GetFont();
        Size aSize = aFont.GetSize();
        int nRectHeight = aRect.GetHeight();
        aSize.Height() = nRectHeight * 2 / 3;
        aFont.SetSize(aSize);
        pDev->SetFont(aFont);
        String aText(GetItemText(nItemId));
        aSize.Width() = pDev->GetTextWidth(aText);
        aSize.Height() = pDev->GetTextHeight();
        Point aPos(aBLPos);
        aPos.Y() += (nRectHeight - aSize.Height()) / 2;
        aPos.X() += (aRect.GetWidth() - aSize.Width()) / 2;
        pDev->DrawText(aPos, aText);

        pDev->SetFont(aOldFont);
    }
}

/*-----------------15.02.97 10.03-------------------

--------------------------------------------------*/

IMPL_LINK(SwInsertGrfRulerDlg, DoubleClickHdl, ValueSet*, pVS)
{
    EndDialog(RET_OK);
    return 0;
}

/*--------------------------------------------------------------------

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.22  2000/09/18 16:05:57  willem.vandorp
      OpenOffice header added.

      Revision 1.21  2000/09/05 10:40:43  kz
      chg. SetWinStyle/GetWinStyle to SetStyle/GetStyle

      Revision 1.20  2000/04/18 15:08:17  os
      UNICODE

      Revision 1.19  2000/02/11 14:56:03  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.18  1999/03/16 11:43:36  MA
      #62507# Ruler uber ID besorgen


      Rev 1.17   16 Mar 1999 12:43:36   MA
   #62507# Ruler uber ID besorgen

      Rev 1.16   18 Nov 1998 08:31:54   OS
   #58263# Numerierung in den Svx - Reste

      Rev 1.15   17 Nov 1998 13:01:56   OS
   #58263# alte Methoden verschoben

      Rev 1.14   17 Mar 1998 17:04:24   OS
   Focus initial ins ValueSet#48169#

      Rev 1.13   24 Nov 1997 16:47:42   MA
   includes

      Rev 1.12   22 Sep 1997 15:14:42   OS
   MessageBox nicht im Dlg-Ctor aufrufen #44095#

      Rev 1.11   09 Sep 1997 13:34:28   OS
   Header aufgeteilt

      Rev 1.10   09 Aug 1997 13:31:34   OS
   paraitem/frmitems/textitem aufgeteilt

      Rev 1.9   08 Aug 1997 17:28:26   OM
   Headerfile-Umstellung

      Rev 1.8   26 May 1997 10:32:18   TRI
   __EXPORT benutzt

      Rev 1.7   23 May 1997 10:09:36   OS
   Ableitung von SfxModalDialog

      Rev 1.6   10 Mar 1997 17:28:22   OS
   fuer NULL-Size nicht painten (DrawObjekte)

      Rev 1.5   25 Feb 1997 12:21:08   OS
   Mindesthoehe fuer Ruler: 2 Pixel

      Rev 1.4   22 Feb 1997 20:21:42   OS
   doppelte Groesse, nur noch 6 Zeilen

      Rev 1.3   20 Feb 1997 17:50:22   OS
   Itemborder abgeschaltet

      Rev 1.2   19 Feb 1997 16:22:22   OS
   Dialogtitel jetzt >Horizontale Linie einfuegen<

      Rev 1.1   17 Feb 1997 16:38:08   OS
   Offset korrigiert

      Rev 1.0   15 Feb 1997 15:15:36   OS
   Initial revision.

 --------------------------------------------------------------------*/


diff --git a/sw/source/ui/misc/insrule.hrc b/sw/source/ui/misc/insrule.hrc
new file mode 100644
index 0000000..a395f18
--- /dev/null
+++ b/sw/source/ui/misc/insrule.hrc
@@ -0,0 +1,69 @@
/*************************************************************************
 *
 *  $RCSfile: insrule.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:45 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "misc.hrc"

#define GB_SEL              1
#define VS_EXAMPLE          2
#define PB_OK               3
#define PB_CANCEL           4
#define PB_HELP             5
#define ST_SIMPLE           6
diff --git a/sw/source/ui/misc/insrule.src b/sw/source/ui/misc/insrule.src
new file mode 100644
index 0000000..9e71fec
--- /dev/null
+++ b/sw/source/ui/misc/insrule.src
@@ -0,0 +1,171 @@
/*************************************************************************
 *
 *  $RCSfile: insrule.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:45 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "insrule.hrc"
#include "helpid.h"
ModalDialog DLG_INSERT_RULER
{
    HelpID = HID_RULER_DIALOG ;
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 242 , 124 ) ;
    Text = "Horizontale Linie einfügen" ;
    Text [ ENGLISH ] = "InsertRuler" ;
    Moveable = TRUE ;
    GroupBox GB_SEL
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 174 , 118 ) ;
        Text = "Auswahl" ;
        Text [ ENGLISH ] = "Selection" ;
        Text [ english_us ] = "Selection" ;
        Text [ portuguese_brazilian ] = "Auswahl" ;
        Text [ swedish ] = "Urval" ;
        Text [ danish ] = "Udvalg" ;
        Text [ italian ] = "Selezione" ;
        Text [ spanish ] = "Selección" ;
        Text [ french ] = "Sélection" ;
        Text [ dutch ] = "Selectie" ;
        Text [ portuguese ] = "Selecção" ;
        Text[ chinese_simplified ] = "Ñ¡Ôñ";
        Text[ russian ] = "Âûáîð";
        Text[ polish ] = "Wybór";
        Text[ japanese ] = "‘I‘ð";
        Text[ chinese_traditional ] = "¿ï¨ú";
        Text[ arabic ] = "ÊÍÏíÏ";
        Text[ greek ] = "ÅðéëïãÞ";
        Text[ korean ] = "¼±ÅÃ";
        Text[ turkish ] = "Seçim";
        Text[ language_user1 ] = " ";
    };
    Control VS_EXAMPLE
    {
        Pos = MAP_APPFONT ( 9 , 12 ) ;
        Size = MAP_APPFONT ( 168 , 106 ) ;
        Hide = TRUE ;
        Border = TRUE ;
        TabStop = TRUE ;
        Group = TRUE ;
    };
    OKButton PB_OK
    {
        Pos = MAP_APPFONT ( 186 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        DefButton = TRUE ;
        Disable = TRUE ;
    };
    CancelButton PB_CANCEL
    {
        Pos = MAP_APPFONT ( 186 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    HelpButton PB_HELP
    {
        Pos = MAP_APPFONT ( 186 , 43 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    String ST_SIMPLE
    {
        Text = "Einfach" ;
        Text [ English ] = "Simple" ;
        Text [ portuguese ] = "Simples" ;
        Text [ english_us ] = "Single" ;
        Text [ portuguese_brazilian ] = "Einfach" ;
        Text [ swedish ] = "Enkel" ;
        Text [ danish ] = "Enkelt" ;
        Text [ italian ] = "Semplice" ;
        Text [ spanish ] = "Sencilla" ;
        Text [ french ] = "Simple" ;
        Text [ dutch ] = "Enkel" ;
        Text[ chinese_simplified ] = "µ¥Ïß";
        Text[ russian ] = "Îáû÷íàÿ";
        Text[ polish ] = "Pojedyncze";
        Text[ japanese ] = "¼ÝÌßÙ";
        Text[ chinese_traditional ] = "³æ½u";
        Text[ arabic ] = "ãÝÑÏ";
        Text[ greek ] = "Áðëü";
        Text[ korean ] = "´ÜÀÏ";
        Text[ turkish ] = "Tek";
        Text[ language_user1 ] = " ";
    };
    Text [ english_us ] = "Insert Horizontal Ruler" ;
    Text [ portuguese_brazilian ] = "Horizontale Linie einfügen" ;
    Text [ swedish ] = "Infoga horisontell linje" ;
    Text [ danish ] = "Indsæt vandret linje" ;
    Text [ italian ] = "Inserisci linea orizzontale" ;
    Text [ spanish ] = "Insertar línea horizontal" ;
    Text [ french ] = "Insertion de ligne horizontale" ;
    Text [ dutch ] = "Horizontale lijn invoegen" ;
    Text [ portuguese ] = "Inserir linha horizontal" ;
    Text[ chinese_simplified ] = "²åÈëˮƽÏß";
    Text[ russian ] = "Âñòàâèòü ãîðèçîíòàëüíóþ ëèíèþ";
    Text[ polish ] = "Wstaw liniê poziom¹";
    Text[ japanese ] = "…•½ü‚Ì‘}“ü";
    Text[ chinese_traditional ] = "´¡¤J¤ô¥­½u";
    Text[ arabic ] = "ÅÏÑÇÌ ÎØ ÃÝÞí";
    Text[ greek ] = "ÐñïóèÞêç ïñéæüíôéáò ãñáììÞò";
    Text[ korean ] = "¼öÆò ´«±ÝÀÚ »ðÀÔ";
    Text[ turkish ] = "Yatay çizgi ekle";
    Text[ language_user1 ] = " ";
};
diff --git a/sw/source/ui/misc/linenum.cxx b/sw/source/ui/misc/linenum.cxx
new file mode 100644
index 0000000..4513dea
--- /dev/null
+++ b/sw/source/ui/misc/linenum.cxx
@@ -0,0 +1,431 @@
/*************************************************************************
 *
 *  $RCSfile: linenum.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:45 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SFXVIEWFRM_HXX //autogen
#include <sfx2/viewfrm.hxx>
#endif

#ifndef _SFXSTYLE_HXX //autogen
#include <svtools/style.hxx>
#endif

#ifndef _SV_MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif

#ifndef _SWVIEW_HXX //autogen
#include <view.hxx>
#endif

#ifndef _WRTSH_HXX //autogen
#include <wrtsh.hxx>
#endif

#ifndef _SWDOCSH_HXX //autogen
#include <docsh.hxx>
#endif

#ifndef _CHARFMT_HXX //autogen
#include <charfmt.hxx>
#endif

#ifndef _FLDMGR_HXX //autogen
#include <fldmgr.hxx>
#endif

#ifndef _DOC_HXX //autogen
#include <doc.hxx>
#endif

#ifndef _DOCSTYLE_HXX //autogen
#include <docstyle.hxx>
#endif

#include "fldbas.hxx"
#include "lineinfo.hxx"
#include "globals.hrc"
#include "linenum.hrc"
#include "linenum.hxx"
#include "uitool.hxx"

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SwLineNumberingDlg::SwLineNumberingDlg(SwView *pVw) :
    SfxSingleTabDialog(&pVw->GetViewFrame()->GetWindow(), 0, 0),
    pSh(pVw->GetWrtShellPtr())
{
    // TabPage erzeugen
    SfxTabPage* pPage = SwLineNumberingPage::Create(this, *(SfxItemSet*)0);
    SetTabPage(pPage);

    GetOKButton()->SetClickHdl(LINK(this, SwLineNumberingDlg, OKHdl));
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

__EXPORT SwLineNumberingDlg::~SwLineNumberingDlg()
{
}

/*--------------------------------------------------------------------
     Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwLineNumberingDlg, OKHdl, Button *, pBtn )
{
    if (GetOKButton()->IsEnabled())
    {
        SfxTabPage* pPage = GetTabPage();
        if (pPage)
            pPage->FillItemSet(*(SfxItemSet*)0);

        EndDialog( RET_OK );
    }

    return 0;
}

/*-----------------------------------------------------------------------
    Beschreibung:
 -----------------------------------------------------------------------*/

SwLineNumberingPage::SwLineNumberingPage( Window* pParent,
                                                    const SfxItemSet& rSet )
    : SfxTabPage(pParent, SW_RES(TP_LINENUMBERING), rSet),
    aNumberingOnCB      ( this, SW_RES( CB_NUMBERING_ON )),
    aCharStyleFT        ( this, SW_RES( FT_CHAR_STYLE )),
    aCharStyleLB        ( this, SW_RES( LB_CHAR_STYLE )),
    aFormatFT           ( this, SW_RES( FT_FORMAT )),
    aFormatLB           ( this, SW_RES( LB_FORMAT )),
    aPosFT              ( this, SW_RES( FT_POS )),
    aPosLB              ( this, SW_RES( LB_POS )),
    aOffsetFT           ( this, SW_RES( FT_OFFSET )),
    aOffsetMF           ( this, SW_RES( MF_OFFSET )),
    aNumIntervalFT      ( this, SW_RES( FT_NUM_INVERVAL )),
    aNumIntervalNF      ( this, SW_RES( NF_NUM_INVERVAL )),
    aNumRowsFT          ( this, SW_RES( FT_NUM_ROWS )),
    aDisplayGB          ( this, SW_RES( GB_DISPLAY )),
    aDivisorFT          ( this, SW_RES( FT_DIVISOR )),
    aDivisorED          ( this, SW_RES( ED_DIVISOR )),
    aDivIntervalFT      ( this, SW_RES( FT_DIV_INTERVAL )),
    aDivIntervalNF      ( this, SW_RES( NF_DIV_INTERVAL )),
    aDivRowsFT          ( this, SW_RES( FT_DIV_ROWS )),
    aDivisorGB          ( this, SW_RES( GB_DIVISOR )),
    aCountEmptyLinesCB  ( this, SW_RES( CB_COUNT_EMPTYLINES )),
    aCountFrameLinesCB  ( this, SW_RES( CB_COUNT_FRAMELINES )),
    aRestartEachPageCB  ( this, SW_RES( CB_RESTART_PAGE )),
    aCountGB            ( this, SW_RES( GB_COUNT ))

{
    FreeResource();
    SwLineNumberingDlg *pDlg = (SwLineNumberingDlg *)GetParent();
    pSh = pDlg->GetWrtShell();
    // Zeichenvorlagen
    ::FillCharStyleListBox(aCharStyleLB, pSh->GetView().GetDocShell());
}

/*-----------------------------------------------------------------------
    Beschreibung:
 -----------------------------------------------------------------------*/

__EXPORT SwLineNumberingPage::~SwLineNumberingPage()
{
}

/*-----------------------------------------------------------------------
    Beschreibung:
 -----------------------------------------------------------------------*/

SfxTabPage* __EXPORT SwLineNumberingPage::Create( Window* pParent, const SfxItemSet& rSet )
{
    return new SwLineNumberingPage( pParent, rSet );
}

/*-----------------------------------------------------------------------
    Beschreibung:
 -----------------------------------------------------------------------*/

void __EXPORT SwLineNumberingPage::Reset( const SfxItemSet& rSet )
{
    const SwLineNumberInfo &rInf = pSh->GetLineNumberInfo();

    String sStyleName(rInf.GetCharFmt(*pSh->GetDoc())->GetName());
    const USHORT nPos = aCharStyleLB.GetEntryPos(sStyleName);

    if (nPos != LISTBOX_ENTRY_NOTFOUND)
        aCharStyleLB.SelectEntryPos(nPos);
    else
    {
        if (sStyleName.Len())
        {
            aCharStyleLB.InsertEntry(sStyleName);
            aCharStyleLB.SelectEntry(sStyleName);
        }
    }

    // Format
    SwFldMgr aMgr( pSh );
    USHORT nSelFmt = rInf.GetNumType().eType;
    USHORT nCnt = aMgr.GetFormatCount( TYP_SEQFLD, FALSE );

    for( USHORT i = 0; i < nCnt; i++)
    {
        aFormatLB.InsertEntry(aMgr.GetFormatStr( TYP_SEQFLD, i));
        USHORT nFmtId = aMgr.GetFormatId( TYP_SEQFLD, i );
        aFormatLB.SetEntryData( i, (void*)nFmtId );
        if( nFmtId == nSelFmt )
            aFormatLB.SelectEntryPos( i );
    }

    if ( !aFormatLB.GetSelectEntryCount() )
        aFormatLB.SelectEntryPos(aFormatLB.GetEntryCount() - 1);

    // Position
    aPosLB.SelectEntryPos((USHORT)rInf.GetPos());

    // Offset
    USHORT nOffset = rInf.GetPosFromLeft();
    if (nOffset == USHRT_MAX)
        nOffset = 0;

    aOffsetMF.SetValue(aOffsetMF.Normalize(nOffset), FUNIT_TWIP);

    // Numerierungsoffset
    aNumIntervalNF.SetValue(rInf.GetCountBy());

    // Teiler
    aDivisorED.SetText(rInf.GetDivider());

    // Teileroffset
    aDivIntervalNF.SetValue(rInf.GetDividerCountBy());

    // Zaehlen
    aCountEmptyLinesCB.Check(rInf.IsCountBlankLines());
    aCountFrameLinesCB.Check(rInf.IsCountInFlys());
    aRestartEachPageCB.Check(rInf.IsRestartEachPage());

    aNumberingOnCB.Check(rInf.IsPaintLineNumbers());

    aNumberingOnCB.SetClickHdl(LINK(this, SwLineNumberingPage, LineOnOffHdl));
    aDivisorED.SetModifyHdl(LINK(this, SwLineNumberingPage, ModifyHdl));
    ModifyHdl();
    LineOnOffHdl();
}

/*--------------------------------------------------------------------
    Beschreibung: Modify
 --------------------------------------------------------------------*/

IMPL_LINK( SwLineNumberingPage, ModifyHdl, Edit *, EMPTYARG )
{
    BOOL bHasValue = aDivisorED.GetText().Len() != 0;

    aDivIntervalFT.Enable(bHasValue);
    aDivIntervalNF.Enable(bHasValue);
    aDivRowsFT.Enable(bHasValue);

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung: On/Off
 --------------------------------------------------------------------*/

IMPL_LINK( SwLineNumberingPage, LineOnOffHdl, CheckBox *, EMPTYARG )
{
    BOOL bEnable = aNumberingOnCB.IsChecked();

    aCharStyleFT.Enable(bEnable);
    aCharStyleLB.Enable(bEnable);
    aFormatFT.Enable(bEnable);
    aFormatLB.Enable(bEnable);
    aPosFT.Enable(bEnable);
    aPosLB.Enable(bEnable);
    aOffsetFT.Enable(bEnable);
    aOffsetMF.Enable(bEnable);
    aNumIntervalFT.Enable(bEnable);
    aNumIntervalNF.Enable(bEnable);
    aNumRowsFT.Enable(bEnable);
    aDisplayGB.Enable(bEnable);
    aDivisorFT.Enable(bEnable);
    aDivisorED.Enable(bEnable);
    aDivIntervalFT.Enable(bEnable);
    aDivIntervalNF.Enable(bEnable);
    aDivRowsFT.Enable(bEnable);
    aDivisorGB.Enable(bEnable);
    aCountEmptyLinesCB.Enable(bEnable);
    aCountFrameLinesCB.Enable(bEnable);
    aRestartEachPageCB.Enable(bEnable);
    aCountGB.Enable(bEnable);

    return 0;
}

/*-----------------------------------------------------------------------
    Beschreibung:
 -----------------------------------------------------------------------*/

BOOL __EXPORT SwLineNumberingPage::FillItemSet( SfxItemSet& rSet )
{
    SwLineNumberInfo aInf(pSh->GetLineNumberInfo());

    // Zeichenvorlagen
    String sCharFmtName(aCharStyleLB.GetSelectEntry());
    SwCharFmt *pCharFmt = pSh->FindCharFmtByName(sCharFmtName);

    if (!pCharFmt)
    {
        SfxStyleSheetBasePool* pPool = pSh->GetView().GetDocShell()->GetStyleSheetPool();
        SfxStyleSheetBase* pBase;
        pBase = pPool->Find(sCharFmtName, SFX_STYLE_FAMILY_CHAR);
        if(!pBase)
            pBase = &pPool->Make(sCharFmtName, SFX_STYLE_FAMILY_CHAR);
        pCharFmt = ((SwDocStyleSheet*)pBase)->GetCharFmt();
    }

    if (pCharFmt)
        aInf.SetCharFmt(pCharFmt);

    // Format
    SwNumType aType;
    aType.eType = (SvxExtNumType)(USHORT)(ULONG)aFormatLB.GetEntryData(
                                    aFormatLB.GetSelectEntryPos() );
    aInf.SetNumType(aType);

    // Position
    aInf.SetPos((LineNumberPosition)aPosLB.GetSelectEntryPos());

    // Offset
    aInf.SetPosFromLeft((USHORT)aOffsetMF.Denormalize(aOffsetMF.GetValue(FUNIT_TWIP)));

    // Numerierungsoffset
    aInf.SetCountBy((USHORT)aNumIntervalNF.GetValue());

    // Teiler
    aInf.SetDivider(aDivisorED.GetText());

    // Teileroffset
    aInf.SetDividerCountBy((USHORT)aDivIntervalNF.GetValue());

    // Zaehlen
    aInf.SetCountBlankLines(aCountEmptyLinesCB.IsChecked());
    aInf.SetCountInFlys(aCountFrameLinesCB.IsChecked());
    aInf.SetRestartEachPage(aRestartEachPageCB.IsChecked());

    aInf.SetPaintLineNumbers(aNumberingOnCB.IsChecked());

    pSh->SetLineNumberInfo(aInf);

    return FALSE;
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.11  2000/09/18 16:05:57  willem.vandorp
    OpenOffice header added.

    Revision 1.10  2000/08/14 12:50:15  ma
    optional restart at each page for line numbering

    Revision 1.9  2000/04/26 14:55:46  os
    GetName() returns const String&

    Revision 1.8  2000/02/11 14:56:26  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.7  1998/11/17 09:57:52  OS
    #58263# NumType durch SvxExtNumType ersetzt


      Rev 1.6   17 Nov 1998 10:57:52   OS
   #58263# NumType durch SvxExtNumType ersetzt

      Rev 1.5   11 Aug 1998 14:26:30   HR
   void* kann nicht direkt nach USHORT gecastet werden

      Rev 1.4   10 Aug 1998 16:42:10   JP
   Bug #54796#: neue NumerierungsTypen (WW97 kompatibel)

      Rev 1.3   15 Apr 1998 14:34:08   OS
   CharStyles sortiert

      Rev 1.2   20 Feb 1998 11:23:22   MA
   Restarbeiten Zeilennummerierung

      Rev 1.1   19 Feb 1998 13:51:32   OM
   Zeilennumerierung

      Rev 1.0   18 Feb 1998 18:56:48   OM
   Initial revision.

------------------------------------------------------------------------*/

diff --git a/sw/source/ui/misc/linenum.hrc b/sw/source/ui/misc/linenum.hrc
new file mode 100644
index 0000000..e3e3e63
--- /dev/null
+++ b/sw/source/ui/misc/linenum.hrc
@@ -0,0 +1,84 @@
/*************************************************************************
 *
 *  $RCSfile: linenum.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:45 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#define CB_NUMBERING_ON     1
#define FT_CHAR_STYLE       2
#define LB_CHAR_STYLE       3
#define FT_FORMAT           4
#define LB_FORMAT           5
#define FT_POS              6
#define LB_POS              7
#define FT_OFFSET           8
#define MF_OFFSET           9
#define FT_NUM_INVERVAL     10
#define NF_NUM_INVERVAL     11
#define FT_NUM_ROWS         12
#define GB_DISPLAY          13
#define FT_DIVISOR          14
#define ED_DIVISOR          15
#define FT_DIV_INTERVAL     16
#define NF_DIV_INTERVAL     17
#define FT_DIV_ROWS         18
#define GB_DIVISOR          19
#define CB_COUNT_EMPTYLINES 20
#define CB_COUNT_FRAMELINES 21
#define GB_COUNT            22
#define CB_RESTART_PAGE     23

diff --git a/sw/source/ui/misc/linenum.src b/sw/source/ui/misc/linenum.src
new file mode 100644
index 0000000..f966969
--- /dev/null
+++ b/sw/source/ui/misc/linenum.src
@@ -0,0 +1,729 @@
/*************************************************************************
 *
 *  $RCSfile: linenum.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:45 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
/* StarView ressource file */

#ifndef _SFX_HRC
#include <sfx2/sfx.hrc>
#endif
#ifndef _SVX_DIALOGS_HRC
#include <svx/dialogs.hrc>
#endif
#include "globals.hrc"
#include "misc.hrc"
#include "linenum.hrc"
#include "helpid.h"
/**************************************************************************/
/*                                                                        */
/**************************************************************************/
TabPage TP_LINENUMBERING
{
    HelpID = HID_LINENUMBERING ;
    SVLook = TRUE ;
    Hide = TRUE ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Text = "Zeilennummerierung" ;
    Text [ ENGLISH ] = "Line Numbering" ;
    CheckBox CB_NUMBERING_ON
    {
        Pos = MAP_APPFONT ( 6 , 6 ) ;
        Size = MAP_APPFONT ( 248 , 10 ) ;
        Text = "~Nummerierung einschalten" ;
        Text [ ENGLISH ] = "~Turn line numbering on" ;
        TabStop = TRUE ;
        Text [ english_us ] = "~Show numbering" ;
        Text [ portuguese_brazilian ] = "Numerierung einschalten" ;
        Text [ swedish ] = "~Numrering på" ;
        Text [ danish ] = "Aktiver nummerering" ;
        Text [ italian ] = "Att~iva numerazione" ;
        Text [ spanish ] = "Mostrar ~numeración" ;
        Text [ french ] = "Activer la ~numérotation" ;
        Text [ dutch ] = "~Nummering inschakelen" ;
        Text [ portuguese ] = "Activar ~numeração" ;
        Text[ chinese_simplified ] = "ÏÔʾ±àºÅ";
        Text[ russian ] = "Âêëþ÷èòü íóìåðàöèþ";
        Text[ polish ] = "W³¹cz numeracjê";
        Text[ japanese ] = "”ԍ†•t‚¯‚ðµÝ‚É‚·‚é(~S)";
        Text[ chinese_traditional ] = "Åã¥Ü½s¸¹";
        Text[ arabic ] = "ÅÙåÇÑ ÇáÊÑÞíã";
        Text[ greek ] = "Åíåñãïðïßçóç áñßèìçóçò";
        Text[ korean ] = "¹øÈ£ º¸À̱â(~S)";
        Text[ turkish ] = "~Numaralamayý etkinleþtir";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_CHAR_STYLE
    {
        Pos = MAP_APPFONT ( 12 , 32 ) ;
        Size = MAP_APPFONT ( 50 , 10 ) ;
        Text = "~Zeichenvorlage" ;
        Text [ English ] = "~Char style" ;
        Text [ english_us ] = "~Character Style" ;
        Text [ portuguese_brazilian ] = "Zeichenvorlage" ;
        Text [ swedish ] = "~Teckenformatmall" ;
        Text [ danish ] = "Tegntypografi" ;
        Text [ italian ] = "~Modelli di carattere" ;
        Text [ spanish ] = "Est~ilo de caracteres" ;
        Text [ french ] = "Style de ~caractères" ;
        Text [ dutch ] = "~Tekenopmaakprofiel" ;
        Text [ portuguese ] = "~Estilos de caracteres" ;
        Text[ chinese_simplified ] = "×Ö·ûÑùʽ";
        Text[ russian ] = "Ñòèëü çíàêîâ";
        Text[ polish ] = "Styl znaku";
        Text[ japanese ] = "•¶Žš½À²Ù";
        Text[ chinese_traditional ] = "¤å¦r¼Ë¦¡";
        Text[ arabic ] = "äãØ ÇáÃÍÑÝ";
        Text[ greek ] = "Óôõë ÷áñáêôÞñùí";
        Text[ korean ] = "¹®ÀÚ À¯Çü(~C)";
        Text[ turkish ] = "~Karakter biçimi";
        Text[ language_user1 ] = "All \"Vorlage\"/Styles are always written with capital S. 10.5.00EM";
    };
    ListBox LB_CHAR_STYLE
    {
        Pos = MAP_APPFONT ( 65 , 30 ) ;
        Size = MAP_APPFONT ( 75 , 60 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        Sort = TRUE ;
    };
    FixedText FT_FORMAT
    {
        Pos = MAP_APPFONT ( 12 , 50 ) ;
        Size = MAP_APPFONT ( 50 , 10 ) ;
        Text = "~Format" ;
        Text [ English ] = "~Format" ;
        Text [ english_us ] = "F~ormat" ;
        Text [ portuguese_brazilian ] = "Format" ;
        Text [ swedish ] = "~Format" ;
        Text [ danish ] = "~Format" ;
        Text [ italian ] = "~Formato" ;
        Text [ spanish ] = "~Formato" ;
        Text [ french ] = "~Format" ;
        Text [ dutch ] = "~Opmaak" ;
        Text [ portuguese ] = "~Formato" ;
        Text[ chinese_simplified ] = "¸ñʽ(~O)";
        Text[ russian ] = "Ôîðìàò";
        Text[ polish ] = "Format";
        Text[ japanese ] = "‘Ž®(~O)";
        Text[ chinese_traditional ] = "®æ¦¡(~O)";
        Text[ arabic ] = "ÇáÊäÓíÞ";
        Text[ greek ] = "Ìïñ~öÞ";
        Text[ korean ] = "¼­½Ä(~O)";
        Text[ turkish ] = "~Format";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_FORMAT
    {
        Pos = MAP_APPFONT ( 65 , 48 ) ;
        Size = MAP_APPFONT ( 75 , 60 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
    };
    FixedText FT_POS
    {
        Pos = MAP_APPFONT ( 12 , 68 ) ;
        Size = MAP_APPFONT ( 50 , 10 ) ;
        Text = "~Position" ;
        Text [ English ] = "~Position" ;
        Text [ english_us ] = "Position" ;
        Text [ portuguese_brazilian ] = "Position" ;
        Text [ swedish ] = "~Position" ;
        Text [ danish ] = "Placering" ;
        Text [ italian ] = "~Posizione" ;
        Text [ spanish ] = "~Posición" ;
        Text [ french ] = "~Position" ;
        Text [ dutch ] = "~Positie" ;
        Text [ portuguese ] = "~Posição" ;
        Text[ chinese_simplified ] = "λÖÃ";
        Text[ russian ] = "Ïîçèöèÿ";
        Text[ polish ] = "Pozycja";
        Text[ japanese ] = "ˆÊ’u";
        Text[ chinese_traditional ] = "¦ì¸m";
        Text[ arabic ] = "ÇáãæÖÚ";
        Text[ greek ] = "ÈÝóç";
        Text[ korean ] = "À§Ä¡";
        Text[ turkish ] = "Konum";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_POS
    {
        Pos = MAP_APPFONT ( 65 , 66 ) ;
        Size = MAP_APPFONT ( 75 , 60 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        StringList =
        {
            < "Links" ; > ;
            < "Rechts" ; > ;
            < "Innen" ; > ;
            < "Außen" ; > ;
        };
        StringList [ English ] =
        {
            < "Links" ; > ;
            < "Rechts" ; > ;
            < "Innen" ; > ;
            < "Außen" ; > ;
        };
        stringlist [ english_us ] =
        {
            < "Left" ; > ;
            < "Right" ; > ;
            < "Inner" ; > ;
            < "outer" ; > ;
        };
        stringlist [ portuguese_brazilian ] =
        {
            < "Links" ; > ;
            < "Rechts" ; > ;
            < "Innen" ; > ;
            < "Außen" ; > ;
        };
        stringlist [ swedish ] =
        {
            < "Vänster" ; > ;
            < "Höger" ; > ;
            < "Inre" ; > ;
            < "utanför" ; > ;
        };
        stringlist [ danish ] =
        {
            < "Venstre" ; > ;
            < "Højre" ; > ;
            < "Inderside" ; > ;
            < "Yderside" ; > ;
        };
        stringlist [ italian ] =
        {
            < "Sinistra" ; > ;
            < "Destra" ; > ;
            < "Interno" ; > ;
            < "Fuori" ; > ;
        };
        stringlist [ spanish ] =
        {
            < "Izquierda" ; > ;
            < "Derecha" ; > ;
            < "Interior" ; > ;
            < "Exterior" ; > ;
        };
        stringlist [ french ] =
        {
            < "À gauche" ; > ;
            < "À droite" ; > ;
            < "A l'intérieur" ; > ;
            < "A l'extérieur" ; > ;
        };
        stringlist [ dutch ] =
        {
            < "Links" ; > ;
            < "Rechts" ; > ;
            < "Binnen" ; > ;
            < "Buiten" ; > ;
        };
        stringlist [ portuguese ] =
        {
            < "Esquerda" ; > ;
            < "Direita" ; > ;
            < "Interior" ; > ;
            < "Exterior" ; > ;
        };
    StringList [ chinese_simplified ] =
    {
            < "×ó" ; > ;
        < "ÓÒ" ; > ;
        < "ÄÚ" ; > ;
        < "Íâ" ; > ;
    };
    StringList [ russian ] =
    {
            < "Ñëåâà" ; > ;
        < "Ñïðàâà" ; > ;
        < "Âíóòðè" ; > ;
        < "Ñíàðóæè" ; > ;
    };
    StringList [ polish ] =
    {
            < "Z lewej" ; > ;
        < "Z prawej" ; > ;
        < "W œrodku" ; > ;
        < "Na zewn¹trz" ; > ;
    };
    StringList [ japanese ] =
    {
            < "¶" ; > ;
        < "‰E" ; > ;
        < "“à‘¤" ; > ;
        < "ŠO‘¤" ; > ;
    };
    StringList [ chinese_traditional ] =
    {
            < "¥ª" ; > ;
        < "¥k" ; > ;
        < "¤º" ; > ;
        < "¥~" ; > ;
    };
    StringList [ arabic ] =
    {
            < "Úáì ÇáíÓÇÑ" ; > ;
        < "Úáì Çáíãíä" ; > ;
        < "Ýí ÇáÏÇÎá" ; > ;
        < "Ýí ÇáÎÇÑÌ" ; > ;
    };
    StringList [ greek ] =
    {
            < "ÁñéóôåñÜ" ; > ;
        < "ÄåîéÜ" ; > ;
        < "ÅóùôåñéêÜ" ; > ;
        < "ÅîùôåñéêÜ" ; > ;
    };
    StringList [ korean ] =
    {
            < "¿ÞÂÊ" ; > ;
        < "¿À¸¥ÂÊ" ; > ;
        < "³»ºÎ" ; > ;
        < "¿ÜºÎ" ; > ;
    };
    StringList [ turkish ] =
    {
            < "Sol" ; > ;
        < "Sað" ; > ;
        < "Ýç" ; > ;
        < "Dýþ" ; > ;
    };
    StringList [ language_user1 ] =
    {
            < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
    };
    };
    FixedText FT_OFFSET
    {
        Pos = MAP_APPFONT ( 12 , 86 ) ;
        Size = MAP_APPFONT ( 50 , 10 ) ;
        Text = "~Abstand" ;
        Text [ English ] = "~Offset" ;
        Text [ english_us ] = "Spacing" ;
        Text [ portuguese_brazilian ] = "Abstand" ;
        Text [ swedish ] = "~Avstånd" ;
        Text [ danish ] = "Afstand" ;
        Text [ italian ] = "Distan~za" ;
        Text [ spanish ] = "E~spacio" ;
        Text [ french ] = "~Écart" ;
        Text [ dutch ] = "~Afstand" ;
        Text [ portuguese ] = "Es~paçamento" ;
        Text[ chinese_simplified ] = "¼ä¸ô";
        Text[ russian ] = "Ðàññòîÿíèå";
        Text[ polish ] = "Odstêp";
        Text[ japanese ] = "ŠÔŠu";
        Text[ language_user1 ] = " ";
        Text[ chinese_traditional ] = "¶¡¹j";
        Text[ arabic ] = "ÇáÊÈÇÚÏ";
        Text[ greek ] = "~Áðüóôáóç";
        Text[ korean ] = "°£°Ý";
        Text[ turkish ] = "~Uzaklýk";
    };
    MetricField MF_OFFSET
    {
        Pos = MAP_APPFONT ( 65 , 84 ) ;
        Size = MAP_APPFONT ( 45 , 12 ) ;
        Border = TRUE ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 0 ;
        Maximum = 9999 ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        First = 0 ;
        Last = 9999 ;
        SpinSize = 10 ;
    };
    FixedText FT_NUM_INVERVAL
    {
        Pos = MAP_APPFONT ( 12 , 104 ) ;
        Size = MAP_APPFONT ( 50 , 10 ) ;
        Text = "~Intervall" ;
        Text [ English ] = "~Interval" ;
        Text [ english_us ] = "Interval" ;
        Text [ portuguese_brazilian ] = "Intervall" ;
        Text [ swedish ] = "~Intervall" ;
        Text [ danish ] = "Interval" ;
        Text [ italian ] = "I~ntervallo" ;
        Text [ spanish ] = "~Intervalo" ;
        Text [ french ] = "~Intervalle" ;
        Text [ dutch ] = "~Interval" ;
        Text [ portuguese ] = "~Intervalo" ;
        Text[ chinese_simplified ] = "¼ä¸ô";
        Text[ russian ] = "Èíòåðâàë";
        Text[ polish ] = "Przedzia³";
        Text[ japanese ] = "”ԍ†•t‚¯‚ÌŠÔŠu";
        Text[ chinese_traditional ] = "¶¡¹j";
        Text[ arabic ] = "ÇáÝÇÕá";
        Text[ greek ] = "ÄéÜóôçìá";
        Text[ korean ] = "±¸°£";
        Text[ turkish ] = "~Aralýk";
        Text[ language_user1 ] = " ";
    };
    NumericField NF_NUM_INVERVAL
    {
        Pos = MAP_APPFONT ( 65 , 102 ) ;
        Size = MAP_APPFONT ( 30 , 12 ) ;
        Border = TRUE ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 1 ;
        Maximum = 1000 ;
        First = 1 ;
        Last = 1000 ;
        SpinSize = 1 ;
    };
    FixedText FT_NUM_ROWS
    {
        Pos = MAP_APPFONT ( 100 , 104 ) ;
        Size = MAP_APPFONT ( 40 , 10 ) ;
        Text = "Zeilen" ;
        Text [ English ] = "Rows" ;
        Text [ english_us ] = "lines" ;
        Text [ portuguese_brazilian ] = "Zeilen" ;
        Text [ swedish ] = "Rader" ;
        Text [ danish ] = "linjer" ;
        Text [ italian ] = "Righe" ;
        Text [ spanish ] = "Líneas" ;
        Text [ french ] = "lignes" ;
        Text [ dutch ] = "Regels" ;
        Text [ portuguese ] = "Linhas" ;
        Text[ chinese_simplified ] = "ÐÐ";
        Text[ russian ] = "Ñòðîêè";
        Text[ polish ] = "Wiersze";
        Text[ japanese ] = "s";
        Text[ chinese_traditional ] = "¦æ";
        Text[ arabic ] = "ÃÓØÑ";
        Text[ greek ] = "ÃñáììÝò";
        Text[ korean ] = "¼±";
        Text[ turkish ] = "Satýr";
        Text[ language_user1 ] = " ";
    };
    GroupBox GB_DISPLAY
    {
        Pos = MAP_APPFONT ( 6 , 19 ) ;
        Size = MAP_APPFONT ( 140 , 103 ) ;
        Text = "Anzeige" ;
        Text [ English ] = "Display" ;
        Text [ english_us ] = "View" ;
        Text [ portuguese_brazilian ] = "Anzeige" ;
        Text [ swedish ] = "Visa" ;
        Text [ danish ] = "Vis" ;
        Text [ italian ] = "Visualizzazione" ;
        Text [ spanish ] = "Visualización" ;
        Text [ french ] = "Affichage" ;
        Text [ dutch ] = "Weergave" ;
        Text [ portuguese ] = "Vista" ;
        Text[ chinese_simplified ] = "ÏÔʾ";
        Text[ russian ] = "Ïîêàç";
        Text[ polish ] = "Wyœwietlenie";
        Text[ japanese ] = "•\\ަ";
        Text[ chinese_traditional ] = "Åã¥Ü";
        Text[ arabic ] = "ÇáÚÑÖ";
        Text[ greek ] = "ÐñïâïëÞ";
        Text[ korean ] = "º¸±â";
        Text[ turkish ] = "Görünüm";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_DIVISOR
    {
        Pos = MAP_APPFONT ( 158 , 32 ) ;
        Size = MAP_APPFONT ( 27 , 10 ) ;
        Text = "~Text" ;
        Text [ English ] = "~Text" ;
        Text [ portuguese ] = "~Texto" ;
        Text [ english_us ] = "Text" ;
        Text [ portuguese_brazilian ] = "Text" ;
        Text [ swedish ] = "T~ext" ;
        Text [ danish ] = "Tekst" ;
        Text [ italian ] = "T~esto" ;
        Text [ spanish ] = "Te~xto" ;
        Text [ french ] = "~Texte" ;
        Text [ dutch ] = "~Tekst" ;
        Text[ chinese_simplified ] = "ÎÄ×Ö";
        Text[ russian ] = "Òåêñò";
        Text[ polish ] = "Tekst";
        Text[ japanese ] = "÷½Ä";
        Text[ chinese_traditional ] = "¤å¦r";
        Text[ arabic ] = "ÇáäÕ";
        Text[ greek ] = "Êåßìåíï";
        Text[ korean ] = "ÅØ½ºÆ®";
        Text[ turkish ] = "M~etin";
        Text[ language_user1 ] = " ";
    };
    Edit ED_DIVISOR
    {
        Pos = MAP_APPFONT ( 186 , 31 ) ;
        Size = MAP_APPFONT ( 62 , 12 ) ;
        Left = TRUE ;
        Border = TRUE ;
    };
    FixedText FT_DIV_INTERVAL
    {
        Pos = MAP_APPFONT ( 158 , 46 ) ;
        Size = MAP_APPFONT ( 27 , 10 ) ;
        Text = "A~lle" ;
        Text [ English ] = "A~ll" ;
         //        Disable = TRUE ;
        Text [ english_us ] = "Every" ;
        Text [ portuguese_brazilian ] = "Alle" ;
        Text [ swedish ] = "A~lla" ;
        Text [ danish ] = "Alle" ;
        Text [ italian ] = "~Tutti" ;
        Text [ spanish ] = "Ca~da" ;
        Text [ french ] = "~Toutes les" ;
        Text [ dutch ] = "~Alle" ;
        Text [ portuguese ] = "Tu~do" ;
        Text[ chinese_simplified ] = "ÿ";
        Text[ russian ] = "Âñå";
        Text[ polish ] = "Co";
        Text[ japanese ] = "‚·‚ׂÄ";
        Text[ chinese_traditional ] = "¨C";
        Text[ arabic ] = "ßá";
        Text[ language_user1 ] = " ";
        Text[ greek ] = "ÊÜèå";
        Text[ korean ] = "¸ðµç";
        Text[ turkish ] = "~Tümü";
    };
    NumericField NF_DIV_INTERVAL
    {
        Pos = MAP_APPFONT ( 186 , 44 ) ;
        Size = MAP_APPFONT ( 30 , 12 ) ;
        Border = TRUE ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 0 ;
        Maximum = 1000 ;
        First = 0 ;
        Last = 1000 ;
        SpinSize = 1 ;
         //        Disable = TRUE ;
    };
    FixedText FT_DIV_ROWS
    {
        Pos = MAP_APPFONT ( 221 , 46 ) ;
        Size = MAP_APPFONT ( 27 , 10 ) ;
        Text = "Zeilen" ;
        Text [ English ] = "Rows" ;
        Text [ english_us ] = "Lines" ;
        Text [ portuguese_brazilian ] = "Zeilen" ;
        Text [ swedish ] = "Rader" ;
        Text [ danish ] = "linjer" ;
        Text [ italian ] = "Righe" ;
        Text [ spanish ] = "Líneas" ;
        Text [ french ] = "lignes" ;
        Text [ dutch ] = "Regels" ;
        Text [ portuguese ] = "Linhas" ;
        Text[ chinese_simplified ] = "ÐÐ";
        Text[ russian ] = "Ñòðîêè";
        Text[ polish ] = "Wiersze";
        Text[ japanese ] = "s";
        Text[ chinese_traditional ] = "¦æ";
        Text[ arabic ] = "ÃÓØÑ";
        Text[ greek ] = "ÃñáììÝò";
        Text[ korean ] = "¼±";
        Text[ turkish ] = "Satýr";
        Text[ language_user1 ] = " ";
    };
    GroupBox GB_DIVISOR
    {
        Pos = MAP_APPFONT ( 152 , 19 ) ;
        Size = MAP_APPFONT ( 102 , 44 ) ;
        Text = "Teiler" ;
        Text [ English ] = "Divisor" ;
        Text [ english_us ] = "Separator" ;
        Text [ portuguese_brazilian ] = "Teiler" ;
        Text [ swedish ] = "Delare" ;
        Text [ danish ] = "Separator" ;
        Text [ italian ] = "Separatore" ;
        Text [ spanish ] = "Separador" ;
        Text [ french ] = "Séparateur" ;
        Text [ dutch ] = "Deelteken" ;
        Text [ portuguese ] = "Separador" ;
        Text[ chinese_simplified ] = "·Ö¸ô·û";
        Text[ russian ] = "Ðàçäåëèòåëü";
        Text[ polish ] = "Separator";
        Text[ japanese ] = "ŽdØ‚è";
        Text[ chinese_traditional ] = "¤À¹j²Å";
        Text[ arabic ] = "ÇáÝÇÕá";
        Text[ greek ] = "Äéá÷ùñéóôéêü";
        Text[ korean ] = "±¸ºÐÀÚ";
        Text[ turkish ] = "Ayýrma iþareti";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_COUNT_EMPTYLINES
    {
        Pos = MAP_APPFONT ( 158 , 80 ) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "L~eerzeilen" ;
        Text [ ENGLISH ] = "~Empty lines" ;
        TabStop = TRUE ;
        Text [ english_us ] = "Blank lines" ;
        Text [ portuguese_brazilian ] = "Leerzeilen" ;
        Text [ swedish ] = "T~omma rader" ;
        Text [ danish ] = "Tomme rækker" ;
        Text [ italian ] = "~Righe vuote" ;
        Text [ spanish ] = "Líneas en ~blanco" ;
        Text [ french ] = "~Renvois à la ligne" ;
        Text [ dutch ] = "~Tussenregels" ;
        Text [ portuguese ] = "Linhas em ~branco" ;
        Text[ chinese_simplified ] = "¿ÕÐÐ";
        Text[ russian ] = "Ïóñòûå ñòðîêè";
        Text[ polish ] = "Spacje";
        Text[ japanese ] = "‹ó”’‚̍s";
        Text[ chinese_traditional ] = "ªÅ¦æ";
        Text[ arabic ] = "ÇáÃÓØÑ ÇáÝÇÑÛÉ";
        Text[ greek ] = "ÊåíÝò ãñáììÝò";
        Text[ korean ] = "ºó ÁÙ";
        Text[ turkish ] = "B~oþ satýrlar";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_COUNT_FRAMELINES
    {
        Pos = MAP_APPFONT ( 158 , 93 ) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "Zeilen in Te~xtrahmen" ;
        Text [ ENGLISH ] = "Text frame l~ines" ;
        TabStop = TRUE ;
        Text [ english_us ] = "Lines in text frames" ;
        Text [ portuguese_brazilian ] = "Zeilen in Textrahmen" ;
        Text [ swedish ] = "Rader i te~xtram" ;
        Text [ danish ] = "Rækker i tekstboks" ;
        Text [ italian ] = "Rig~he nella cornice di testo" ;
        Text [ spanish ] = "Líneas en ma~rco de texto" ;
        Text [ french ] = "Lignes dans le cadre texte" ;
        Text [ dutch ] = "~Regels in tekstkaders" ;
        Text [ portuguese ] = "Linhas na ~moldura do texto" ;
        Text[ chinese_simplified ] = "Îı¾¿òÄÚµÄÐÐ";
        Text[ russian ] = "Ñòðîêè â òåêñòîâîé ðàìêå";
        Text[ polish ] = "Wi~ersze w ramce tekstowej";
        Text[ japanese ] = "÷½Ä˜g“à‚̍s";
        Text[ chinese_traditional ] = "¤å¦r¤è¶ô¤ºªº¦æ";
        Text[ arabic ] = "ÃÓØÑ Ýí ÅØÇÑ ÇáäÕ";
        Text[ greek ] = "ÃñáììÝò óå ðëáßóéï êåéìÝíïõ";
        Text[ korean ] = "ÅØ½ºÆ® ÇÁ·¹ÀÓÀÇ ¼±";
        Text[ turkish ] = "Metin kutusu içindeki sa~týrlar";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_RESTART_PAGE
    {
        Pos = MAP_APPFONT ( 158 , 106 );
        Size = MAP_APPFONT ( 90 , 10 );
        Text = "~Neustart am Seitenanfang";
        Text [ ENGLISH ] = "~Restart each new page";
        TabStop = TRUE;
    };
    GroupBox GB_COUNT
    {
        Pos = MAP_APPFONT ( 152 , 67 ) ;
        Size = MAP_APPFONT ( 102 , 55 ) ;
        Text = "Zählen" ;
        Text [ English ] = "Count" ;
        Text [ english_us ] = "Count" ;
        Text [ portuguese_brazilian ] = "Zählen" ;
        Text [ swedish ] = "Räkna" ;
        Text [ danish ] = "Tæl" ;
        Text [ italian ] = "Conta" ;
        Text [ spanish ] = "Contar" ;
        Text [ french ] = "Compter" ;
        Text [ dutch ] = "Tellen" ;
        Text [ portuguese ] = "Contar" ;
        Text[ chinese_simplified ] = "¼ÆÊý";
        Text[ russian ] = "×èñëà";
        Text[ polish ] = "Licz";
        Text[ japanese ] = "”‚¦‚é";
        Text[ chinese_traditional ] = "­p¼Æ";
        Text[ arabic ] = "ÚÏ";
        Text[ greek ] = "ÊáôáìÝôñçóç";
        Text[ korean ] = "Ä«¿îÆ®";
        Text[ turkish ] = "Say";
        Text[ language_user1 ] = " ";
    };
    Text [ english_us ] = "Line Numbering" ;
    Text [ portuguese_brazilian ] = "Zeilennumerierung" ;
    Text [ swedish ] = "Radnumrering" ;
    Text [ danish ] = "Linjenummerering" ;
    Text [ italian ] = "Numerazione righe" ;
    Text [ spanish ] = "Numeración de líneas" ;
    Text [ french ] = "Numérotation de lignes" ;
    Text [ dutch ] = "Regelnummering" ;
    Text [ portuguese ] = "Numeração de linhas" ;
    Text[ chinese_simplified ] = "ÐбàºÅ";
    Text[ russian ] = "Íóìåðàöèÿ ñòðîê";
    Text[ polish ] = "Numeracja wierszy";
    Text[ japanese ] = "s‚̔ԍ†•t‚¯";
    Text[ chinese_traditional ] = "¦æ¼Æ";
    Text[ arabic ] = "ÊÑÞíã ÇáÃÓØÑ";
    Text[ greek ] = "Áñßèìçóç ãñáììþí";
    Text[ korean ] = "¼± ¹øÈ£";
    Text[ turkish ] = "Satýr numaralamasý";
    Text[ language_user1 ] = " ";
};
diff --git a/sw/source/ui/misc/makefile.mk b/sw/source/ui/misc/makefile.mk
new file mode 100644
index 0000000..ee09ea6
--- /dev/null
+++ b/sw/source/ui/misc/makefile.mk
@@ -0,0 +1,141 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:45 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=..$/..$/..

PRJNAME=sw
TARGET=misc

AUTOSEG=true

PROJECTPCH=ui_pch
PDBTARGET=ui_pch
PROJECTPCHSOURCE=..$/ui_1st$/ui_pch

# --- Settings -----------------------------------------------------

.INCLUDE :	$(PRJ)$/inc$/swpre.mk
.INCLUDE :	settings.mk
.INCLUDE :	$(PRJ)$/inc$/sw.mk

# --- Files --------------------------------------------------------

CXXFILES = \
        bookmark.cxx \
        docfnote.cxx \
        glosbib.cxx \
        glosdoc.cxx \
        glossary.cxx \
        glshell.cxx \
        hdftctrl.cxx \
        insfnote.cxx \
        insrule.cxx \
        linenum.cxx \
        num.cxx \
        outline.cxx \
        pgfnote.cxx \
        redlndlg.cxx \
        srtdlg.cxx \
        tmpldlg.cxx

SRCFILES=\
    bookmark.src \
    docfnote.src \
    glossary.src \
    glosbib.src \
    insfnote.src \
    insrule.src \
    linenum.src \
    num.src \
    outline.src \
    pgfnote.src \
    redlndlg.src \
    srtdlg.src \
    tmpldlg.src

SLOFILES =	\
        $(SLO)$/bookmark.obj \
        $(SLO)$/docfnote.obj \
        $(SLO)$/glosbib.obj \
        $(SLO)$/glosdoc.obj \
        $(SLO)$/glossary.obj \
        $(SLO)$/glshell.obj \
        $(SLO)$/hdftctrl.obj \
        $(SLO)$/insfnote.obj \
        $(SLO)$/insrule.obj \
        $(SLO)$/linenum.obj \
        $(SLO)$/num.obj \
        $(SLO)$/outline.obj \
        $(SLO)$/pgfnote.obj \
        $(SLO)$/redlndlg.obj \
        $(SLO)$/srtdlg.obj \
        $(SLO)$/tmpldlg.obj

EXCEPTIONSFILES = \
        $(SLO)$/glosdoc.obj \
        $(SLO)$/glosbib.obj \
        $(SLO)$/glossary.obj \

# --- Tagets -------------------------------------------------------

.INCLUDE :	target.mk

diff --git a/sw/source/ui/misc/num.cxx b/sw/source/ui/misc/num.cxx
new file mode 100644
index 0000000..4c8c209
--- /dev/null
+++ b/sw/source/ui/misc/num.cxx
@@ -0,0 +1,1000 @@
/*************************************************************************
 *
 *  $RCSfile: num.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:45 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#define USE_NUMTABPAGES
#define _NUM_CXX

#ifndef _UIPARAM_HXX
#include <uiparam.hxx>
#endif
#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _URLOBJ_HXX //autogen
#include <tools/urlobj.hxx>
#endif
#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif
#ifndef _SFXIMGMGR_HXX //autogen
#include <sfx2/imgmgr.hxx>
#endif
#ifndef _GALLERY_HXX_
#include <svx/gallery.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_IMPGRF_HXX //autogen
#include <svx/impgrf.hxx>
#endif
#ifndef _SVX_CHARMAP_HXX //autogen
#include <svx/charmap.hxx>
#endif
#ifndef _SV_MENU_HXX //autogen
#include <vcl/menu.hxx>
#endif
#ifndef _SVX_DIALOGS_HRC
#include <svx/dialogs.hrc>
#endif
#ifndef _SVX_NUMITEM_HXX //autogen wg. SvxNumBulletItem
#include <svx/numitem.hxx>
#endif


#ifndef _SWVSET_HXX //autogen
#include <swvset.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _WVIEW_HXX
#include <wview.hxx>
#endif
#ifndef _UITOOL_HXX
#include <uitool.hxx>
#endif
#ifndef _WDOCSH_HXX
#include <wdocsh.hxx>
#endif
#ifndef _UIITEMS_HXX
#include <uiitems.hxx>
#endif
#ifndef _DOCSTYLE_HXX
#include <docstyle.hxx>
#endif
#ifndef _CHARFMT_HXX
#include <charfmt.hxx>
#endif
#ifndef _UINUMS_HXX
#include <uinums.hxx>
#endif
#ifndef _POOLFMT_HXX
#include <poolfmt.hxx>
#endif
#ifndef _SHELLRES_HXX
#include <shellres.hxx>
#endif
#ifndef _OUTLINE_HXX
#include <outline.hxx>
#endif
#ifndef _NUM_HXX
#include <num.hxx>
#endif
#ifndef _VIEWOPT_HXX
#include <viewopt.hxx>
#endif
#ifndef _FRMMGR_HXX
#include <frmmgr.hxx>
#endif

#ifndef _MISC_HRC
#include <misc.hrc>
#endif
#ifndef _FRMUI_HRC
#include <frmui.hrc>
#endif
#ifndef _NUM_HRC
#include <num.hrc>
#endif
#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif
#ifndef _HELPID_H
#include <helpid.h>
#endif


static BOOL bLastRelative = FALSE;

/*-----------------03.12.97 10:02-------------------

--------------------------------------------------*/
SwNumPositionTabPage::SwNumPositionTabPage(Window* pParent,
                               const SfxItemSet& rSet) :
    SfxTabPage( pParent, SW_RES( TP_NUM_POSITION ), rSet ),
    aLevelGB(       this, ResId(GB_LEVEL    )),
    aLevelLB(       this, ResId(LB_LEVEL    )),
    aPositionGB(    this, ResId(GB_POSITION )),
    aAlignFT(       this, ResId(FT_ALIGN    )),
    aAlignLB(       this, ResId(LB_ALIGN    )),
    aDistBorderFT(  this, ResId(FT_BORDERDIST   )),
    aDistBorderMF(  this, ResId(MF_BORDERDIST   )),
    aDistNumFT(     this, ResId(FT_NUMDIST      )),
    aDistNumMF(     this, ResId(MF_NUMDIST      )),
    aRelativeCB(    this, ResId(CB_RELATIVE     )),
    aIndentFT(      this, ResId(FT_INDENT       )),
    aIndentMF(      this, ResId(MF_INDENT       )),
    aStandardPB(    this, ResId(PB_STANDARD     )),
    aPreviewGB(     this, ResId(GB_PREVIEW      )),
    aPreviewWIN(    this, ResId(WIN_PREVIEW     )),
    bInInintControl(FALSE),
    pActNum(0),
    pOutlineDlg(0),
    pSaveNum(0)
{
    FreeResource();
    SetExchangeSupport();
    aPreviewWIN.SetBackground(Wallpaper(Color(COL_TRANSPARENT)));

    aRelativeCB.Check();
    aAlignLB.SetSelectHdl(LINK(this, SwNumPositionTabPage, EditModifyHdl));

    Link aLk = LINK(this, SwNumPositionTabPage, DistanceHdl);
    aDistBorderMF.SetUpHdl(aLk);
    aDistNumMF.SetUpHdl(aLk);
    aIndentMF.SetUpHdl(aLk);
    aDistBorderMF.SetDownHdl(aLk);
    aDistNumMF.SetDownHdl(aLk);
    aIndentMF.SetDownHdl(aLk);
    aDistBorderMF.SetLoseFocusHdl(aLk);
    aDistNumMF.SetLoseFocusHdl(aLk);
    aIndentMF.SetLoseFocusHdl(aLk);

    aLevelLB.SetSelectHdl(LINK(this, SwNumPositionTabPage, LevelHdl));
    aRelativeCB.SetClickHdl(LINK(this, SwNumPositionTabPage, RelativeHdl));
    aStandardPB.SetClickHdl(LINK(this, SwNumPositionTabPage, StandardHdl));

    // Ebenen einfuegen
    for(USHORT i = 1; i <= MAXLEVEL; i++)
        aLevelLB.InsertEntry(String::CreateFromInt32(i));
    String sEntry(String::CreateFromAscii("1 - "));
    sEntry += String::CreateFromInt32(MAXLEVEL);
    aLevelLB.InsertEntry(sEntry);
    aLevelLB.SelectEntry(sEntry);

    aRelativeCB.Check(bLastRelative);
    aPreviewWIN.SetPositionMode();

}
/*-----------------03.12.97 10:02-------------------

--------------------------------------------------*/
SwNumPositionTabPage::~SwNumPositionTabPage()
{
    delete pActNum;
}
/*-----------------03.12.97 10:06-------------------

--------------------------------------------------*/
void SwNumPositionTabPage::InitControls()
{
    bInInintControl = TRUE;
    BOOL bRelative = aRelativeCB.IsChecked() && aRelativeCB.IsEnabled();
//  SetMinDist();
    BOOL bSingleSelection = aLevelLB.GetSelectEntryCount() == 1 && USHRT_MAX != nActNumLvl;
    aDistBorderMF.Enable(bSingleSelection || bRelative || 0 != pOutlineDlg);

    SwTwips nWidth = pWrtSh->GetAnyCurRect(RECT_FRM).Width();

    aDistBorderMF.SetMax(aDistBorderMF.Normalize( nWidth ), FUNIT_TWIP );
    aDistNumMF   .SetMax(aDistNumMF   .Normalize( nWidth ), FUNIT_TWIP );
    aIndentMF    .SetMax(aIndentMF    .Normalize( nWidth ), FUNIT_TWIP );
    SwTwips nLast2 = nWidth /2;
    aDistBorderMF.SetLast( aDistBorderMF.Normalize(   nLast2 ), FUNIT_TWIP );
    aDistNumMF   .SetLast( aDistNumMF     .Normalize( nLast2 ), FUNIT_TWIP );
    aIndentMF    .SetLast( aIndentMF      .Normalize( nLast2 ), FUNIT_TWIP );


    BOOL bSetDistEmpty = FALSE;
//  BOOL bSameDistBorder= TRUE;
    BOOL bSameDistBorderNum = TRUE;
    BOOL bSameDist      = TRUE;
    BOOL bSameIndent    = TRUE;
    BOOL bSameAdjust    = TRUE;

    const SwNumFmt* aNumFmtArr[MAXLEVEL];
    const SwFmtVertOrient* pFirstOrient = 0;
    USHORT nMask = 1;
    USHORT nLvl = USHRT_MAX;
//  SwTwips nFirstLSpace = 0;
    long nFirstBorderText = 0;
    long nFirstBorderTextRelative = -1;
    for(USHORT i = 0; i < MAXLEVEL; i++)
    {
        aNumFmtArr[i] = &pActNum->Get(i);
        if(nActNumLvl & nMask)
        {
            if(USHRT_MAX == nLvl)
            {
                nLvl = i;
                pFirstOrient = aNumFmtArr[nLvl]->GetGrfOrient();
//              nFirstLSpace = nLvl > 0 ?
//                  aNumFmtArr[nLvl]->GetAbsLSpace() - aNumFmtArr[nLvl - 1]->GetAbsLSpace():
//                      aNumFmtArr[nLvl]->GetAbsLSpace();
                nFirstBorderText = nLvl > 0 ?
                    aNumFmtArr[nLvl]->GetAbsLSpace() + aNumFmtArr[nLvl]->GetFirstLineOffset() -
                    aNumFmtArr[nLvl - 1]->GetAbsLSpace() + aNumFmtArr[nLvl - 1]->GetFirstLineOffset():
                        aNumFmtArr[nLvl]->GetAbsLSpace() + aNumFmtArr[nLvl]->GetFirstLineOffset();
            }

            if( i > nLvl)
            {
                if(bRelative)
                {
                    if(nFirstBorderTextRelative == -1)
                        nFirstBorderTextRelative =
                        (aNumFmtArr[i]->GetAbsLSpace() + aNumFmtArr[i]->GetFirstLineOffset() -
                        aNumFmtArr[i - 1]->GetAbsLSpace() + aNumFmtArr[i - 1]->GetFirstLineOffset());
                    else
                        bSameDistBorderNum &= nFirstBorderTextRelative ==
                        (aNumFmtArr[i]->GetAbsLSpace() + aNumFmtArr[i]->GetFirstLineOffset() -
                        aNumFmtArr[i - 1]->GetAbsLSpace() + aNumFmtArr[i - 1]->GetFirstLineOffset());

                }
                else
                {
                    bSameDistBorderNum &=
                    aNumFmtArr[i]->GetAbsLSpace() - aNumFmtArr[i]->GetFirstLineOffset() ==
                    aNumFmtArr[i - 1]->GetAbsLSpace() - aNumFmtArr[i - 1]->GetFirstLineOffset();
//                  bSameDistBorder &= aNumFmtArr[i]->GetAbsLSpace() == aNumFmtArr[nLvl]->GetAbsLSpace();
                }

                bSameDist       &= aNumFmtArr[i]->GetCharTextOffset() == aNumFmtArr[nLvl]->GetCharTextOffset();
                bSameIndent     &= aNumFmtArr[i]->GetFirstLineOffset() == aNumFmtArr[nLvl]->GetFirstLineOffset();
                bSameAdjust     &= aNumFmtArr[i]->GetAdjust() == aNumFmtArr[nLvl]->GetAdjust();

            }
        }
//          else
//              aNumFmtArr[i] = 0;
        nMask <<= 1;

    }
    if(bSameDistBorderNum)
//  if(bSameDistBorder)
    {
        long nDistBorderNum;
        if(bRelative)
        {
            nDistBorderNum = (long)aNumFmtArr[nLvl]->GetAbsLSpace()+ aNumFmtArr[nLvl]->GetFirstLineOffset();
            if(nLvl)
                nDistBorderNum -= (long)aNumFmtArr[nLvl - 1]->GetAbsLSpace()+ aNumFmtArr[nLvl - 1]->GetFirstLineOffset();
        }
        else
        {
            nDistBorderNum = (long)aNumFmtArr[nLvl]->GetAbsLSpace()+ aNumFmtArr[nLvl]->GetFirstLineOffset();
        }
        aDistBorderMF.SetValue(aDistBorderMF.Normalize(nDistBorderNum),FUNIT_TWIP);

//      aDistBorderMF.SetValue(aDistBorderMF.Normalize(
//              bRelative ? (long)nFirstLSpace : (long)aNumFmtArr[nLvl]->GetAbsLSpace()),
//                                                      FUNIT_TWIP);
    }
    else
        bSetDistEmpty = TRUE;

    if(bSameDist)
        aDistNumMF   .SetValue(aDistNumMF.Normalize(aNumFmtArr[nLvl]->GetCharTextOffset()), FUNIT_TWIP);
    else
        aDistNumMF.SetText(aEmptyStr);
    if(bSameIndent)
        aIndentMF.SetValue(aIndentMF.Normalize(-aNumFmtArr[nLvl]->GetFirstLineOffset()), FUNIT_TWIP);
    else
        aIndentMF.SetText(aEmptyStr);

    if(bSameAdjust)
    {
        USHORT nPos = 1; // zentriert
        if(aNumFmtArr[nLvl]->GetAdjust() == SVX_ADJUST_LEFT)
            nPos = 0;
        else if(aNumFmtArr[nLvl]->GetAdjust() == SVX_ADJUST_RIGHT)
            nPos = 2;
        aAlignLB.SelectEntryPos(nPos);
    }
    else
    {
        aAlignLB.SetNoSelection();
    }

    if(TRUE == bSetDistEmpty)
        aDistBorderMF.SetText(aEmptyStr);

    bInInintControl = FALSE;
}
/*-----------------03.12.97 12:21-------------------

--------------------------------------------------*/
/*void SwNumPositionTabPage::SetMinDist()
{
    // JP 03.04.97: Bug 32903 - MinWert fuer DistBorderMF setzen

    // ggfs. den akt. NumLevel anpassen
    USHORT nStart = 0;
    USHORT nEnd = MAXLEVEL;
    USHORT nMask = 1;
    USHORT nTmpLvl = USHRT_MAX;
    SwTwips nMinVal = 0;
    BOOL bInit = FALSE;

    for(USHORT i = 0; i < MAXLEVEL; i++)
    {
        if(nActNumLvl & nMask)
        {
            if(USHRT_MAX == nTmpLvl)
            {
                nTmpLvl = i;
                const SwNumFmt& rNumFmt = pActNum->Get( nTmpLvl );

                nMinVal = - rNumFmt.GetFirstLineOffset();
                if( nTmpLvl )
                    nMinVal -= pActNum->Get( nTmpLvl - 1 ).GetAbsLSpace();
            }
            const SwNumFmt& rAktNumFmt = pActNum->Get( nStart );
            if( rAktNumFmt.GetAbsLSpace() < nMinVal )
            {
                bInit = TRUE;
                SwNumFmt aNumFmt( rAktNumFmt );
                aNumFmt.SetAbsLSpace( nMinVal );
                pActNum->Set( nStart, aNumFmt );
            }
        }
        nMask <<=1;
    }

    if(!aRelativeCB.IsChecked() && aRelativeCB.IsEnabled())
        nMinVal = 0;
    nMinVal = aDistBorderMF.Normalize( nMinVal );
    aDistBorderMF.SetMin( nMinVal, FUNIT_TWIP );
    aDistBorderMF.SetFirst( nMinVal, FUNIT_TWIP );
    if(bInit)
        InitControls();
}
 */

/*-----------------03.12.97 10:02-------------------

--------------------------------------------------*/
void SwNumPositionTabPage::ActivatePage(const SfxItemSet& rSet)
{
    const SfxPoolItem* pItem;
    UINT16 nTmpNumLvl =
        pOutlineDlg ? pOutlineDlg->GetActNumLevel() : 0;
//          ((SwNumBulletTabDialog*)GetTabDialog())->GetActNumLevel();
    const SfxItemSet* pExampleSet = GetTabDialog()->GetExampleSet();
    if(pExampleSet && pExampleSet->GetItemState(FN_PARAM_NUM_PRESET, FALSE, &pItem))
    {
        bPreset = ((const SfxBoolItem*)pItem)->GetValue();
    }
    //
    bModified = (!pActNum->GetNumFmt( 0 ) || bPreset);
    if(*pActNum != *pSaveNum ||
        nActNumLvl != nTmpNumLvl )
    {
        *pActNum = *pSaveNum;
        nActNumLvl = nTmpNumLvl;
        USHORT nMask = 1;
        aLevelLB.SetUpdateMode(FALSE);
        aLevelLB.SetNoSelection();
        aLevelLB.SelectEntryPos( MAXLEVEL, nActNumLvl == USHRT_MAX);
        if(nActNumLvl != USHRT_MAX)
            for(USHORT i = 0; i < MAXLEVEL; i++)
            {
                if(nActNumLvl & nMask)
                    aLevelLB.SelectEntryPos( i, TRUE);
                nMask <<= 1 ;
            }
        aLevelLB.SetUpdateMode(TRUE);
        InitControls();
    }
    aRelativeCB.Enable(1 != nActNumLvl);
    aPreviewWIN.Invalidate();
}

/*-----------------03.12.97 10:02-------------------

--------------------------------------------------*/
int  SwNumPositionTabPage::DeactivatePage(SfxItemSet *pSet)
{
    if(pOutlineDlg)
        pOutlineDlg->SetActNumLevel(nActNumLvl);
//  else
//      ((SwNumBulletTabDialog*)GetTabDialog())->SetActNumLevel(nActNumLvl);
    if(pSet)
        FillItemSet(*pSet);
    return TRUE;

}

/*-----------------03.12.97 10:02-------------------

--------------------------------------------------*/
BOOL SwNumPositionTabPage::FillItemSet( SfxItemSet& rSet )
{
    if(pOutlineDlg)
        *pOutlineDlg->GetNumRule() = *pActNum;
    else if(bModified && pActNum)
    {
        *pSaveNum = *pActNum;
        rSet.Put(SwUINumRuleItem( *pSaveNum ));
        rSet.Put(SfxBoolItem(FN_PARAM_NUM_PRESET, FALSE));
    }
    return bModified;
}

/*-----------------03.12.97 10:02-------------------

--------------------------------------------------*/
void SwNumPositionTabPage::Reset( const SfxItemSet& rSet )
{
    const SfxPoolItem* pItem;
    if(pOutlineDlg)
    {
        pSaveNum = pOutlineDlg->GetNumRule();
        aLevelLB.EnableMultiSelection(FALSE);
    }
    else if(SFX_ITEM_SET == rSet.GetItemState(FN_PARAM_ACT_NUMBER, FALSE, &pItem))
        pSaveNum = ((SwUINumRuleItem*)pItem)->GetNumRule();

    nActNumLvl =
        pOutlineDlg ? pOutlineDlg->GetActNumLevel() : 0;
//      ((SwNumBulletTabDialog*)GetTabDialog())->GetActNumLevel();
    USHORT nMask = 1;
    aLevelLB.SetUpdateMode(FALSE);
    aLevelLB.SetNoSelection();
    if(nActNumLvl == USHRT_MAX)
    {
        aLevelLB.SelectEntryPos( MAXLEVEL, TRUE);
    }
    else
        for(USHORT i = 0; i < MAXLEVEL; i++)
        {
            if(nActNumLvl & nMask)
                aLevelLB.SelectEntryPos( i, TRUE);
            nMask <<= 1;
        }
    aLevelLB.SetUpdateMode(TRUE);

    if(SFX_ITEM_SET == rSet.GetItemState(FN_PARAM_CHILD_LEVELS, FALSE, &pItem))
        bHasChild = ((const SfxBoolItem*)pItem)->GetValue();
    if(!pActNum)
        pActNum = new  SwNumRule(*pSaveNum);
    else if(*pSaveNum != *pActNum)
        *pActNum = *pSaveNum;
    aPreviewWIN.SetNumRule(pActNum);
    InitControls();
    bModified = FALSE;
}

/*-----------------03.12.97 10:02-------------------

--------------------------------------------------*/
SfxTabPage* SwNumPositionTabPage::Create( Window* pParent,
                                const SfxItemSet& rAttrSet)
{
    return new SwNumPositionTabPage(pParent, rAttrSet);
}

/*-----------------04.12.97 12:51-------------------

--------------------------------------------------*/
void SwNumPositionTabPage::SetWrtShell(SwWrtShell* pSh)
{
    pWrtSh = pSh;
    const SwRect& rPrtRect = pWrtSh->GetAnyCurRect(RECT_PAGE);
    aPreviewWIN.SetPageWidth(rPrtRect.Width());
    FieldUnit eMetric = ::GetDfltMetric(0 != PTR_CAST(SwWebView, &pWrtSh->GetView()));
    if(eMetric == FUNIT_MM)
    {
        aDistBorderMF .SetDecimalDigits(1);
        aDistNumMF    .SetDecimalDigits(1);
        aIndentMF     .SetDecimalDigits(1);
    }
    aDistBorderMF .SetUnit( eMetric );
    aDistNumMF    .SetUnit( eMetric );
    aIndentMF     .SetUnit( eMetric );
}

/*-----------------03.12.97 11:06-------------------

--------------------------------------------------*/
IMPL_LINK( SwNumPositionTabPage, EditModifyHdl, Edit *, pEdit )
{

    USHORT nStart = 0;
    USHORT nEnd = MAXLEVEL;
    USHORT nMask = 1;
    for(USHORT i = 0; i < MAXLEVEL; i++)
    {
        if(nActNumLvl & nMask)
        {
            SwNumFmt aNumFmt(pActNum->Get(i));

            USHORT nPos = aAlignLB.GetSelectEntryPos();
            SvxAdjust eAdjust = SVX_ADJUST_CENTER;
            if(nPos == 0)
                eAdjust = SVX_ADJUST_LEFT;
            else if(nPos == 2)
                eAdjust = SVX_ADJUST_RIGHT;
            aNumFmt.SetAdjust( eAdjust );
            pActNum->Set(i, aNumFmt);
        }
        nMask <<= 1;
    }
    SetModified();
    return 0;
}
/*-----------------03.12.97 11:11-------------------

--------------------------------------------------*/
IMPL_LINK( SwNumPositionTabPage, LevelHdl, ListBox *, pBox )
{
    USHORT nSaveNumLvl = nActNumLvl;
    nActNumLvl = 0;
    if(pBox->IsEntryPosSelected( MAXLEVEL ) &&
            (pBox->GetSelectEntryCount() == 1 || nSaveNumLvl != 0xffff))
    {
        nActNumLvl = 0xFFFF;
        pBox->SetUpdateMode(FALSE);
        for( USHORT i = 0; i < MAXLEVEL; i++ )
            pBox->SelectEntryPos( i, FALSE );
        pBox->SetUpdateMode(TRUE);
    }
    else if(pBox->GetSelectEntryCount())
    {
        USHORT nMask = 1;
        for( USHORT i = 0; i < MAXLEVEL; i++ )
        {
            if(pBox->IsEntryPosSelected( i ))
                nActNumLvl |= nMask;
            nMask <<= 1;
        }
        pBox->SelectEntryPos( MAXLEVEL, FALSE );
    }
    else
    {
        nActNumLvl = nSaveNumLvl;
        USHORT nMask = 1;
        for( USHORT i = 0; i < MAXLEVEL; i++ )
        {
            if(nActNumLvl & nMask)
            {
                pBox->SelectEntryPos(i);
                break;
            }
            nMask <<=1;
        }
    }
    aRelativeCB.Enable(1 != nActNumLvl);
    SetModified();
    InitControls();
    return 0;
}
/*-----------------03.12.97 12:24-------------------

--------------------------------------------------*/
IMPL_LINK( SwNumPositionTabPage, DistanceHdl, MetricField *, pFld )
{
    if(bInInintControl)
        return 0;
    long nValue = pFld->Denormalize(pFld->GetValue(FUNIT_TWIP));
    USHORT nMask = 1;
    for(USHORT i = 0; i < MAXLEVEL; i++)
    {
        if(nActNumLvl & nMask)
        {
            SwNumFmt aNumFmt( pActNum->Get( i ) );
            if(pFld == &aDistBorderMF)
            {

                if(aRelativeCB.IsChecked() && aRelativeCB.IsEnabled())
                {
                    if(0 == i)
                    {
                        long nTmp = aNumFmt.GetFirstLineOffset();
                        aNumFmt.SetAbsLSpace( USHORT(nValue - nTmp));
                    }
                    else
                    {
                        long nTmp = pActNum->Get( i - 1 ).GetAbsLSpace() +
                                    pActNum->Get( i - 1 ).GetFirstLineOffset() -
                                    pActNum->Get( i ).GetFirstLineOffset();

                        aNumFmt.SetAbsLSpace( USHORT(nValue + nTmp));
                    }
                }
                else
                {
                    aNumFmt.SetAbsLSpace( (short)nValue - aNumFmt.GetFirstLineOffset());
                }
            }
            else if(pFld == &aDistNumMF)
            {
                aNumFmt.SetCharTextOffset( (short)nValue );
            }
            else if(pFld == &aIndentMF)
            {
                //jetzt muss mit dem FirstLineOffset auch der AbsLSpace veraendert werden
                long nDiff = nValue + aNumFmt.GetFirstLineOffset();
                long nAbsLSpace = aNumFmt.GetAbsLSpace();
                aNumFmt.SetAbsLSpace(USHORT(nAbsLSpace + nDiff));
                aNumFmt.SetFirstLineOffset( -(short)nValue );
            }

            pActNum->Set( i, aNumFmt );
        }
        nMask <<= 1;
    }

    SetModified();
//  SetMinDist();
    if(!aDistBorderMF.IsEnabled())
        aDistBorderMF.SetText(aEmptyStr);

    return 0;
}

/*-----------------04.12.97 12:35-------------------

--------------------------------------------------*/
IMPL_LINK( SwNumPositionTabPage, RelativeHdl, CheckBox *, pBox )
{
    BOOL bOn = pBox->IsChecked();
//  SetMinDist();
    BOOL bSingleSelection = aLevelLB.GetSelectEntryCount() == 1 && USHRT_MAX != nActNumLvl;
    BOOL bSetValue = FALSE;
    long nValue = 0;
    if(bOn || bSingleSelection)
    {
        USHORT nMask = 1;
        BOOL bFirst = TRUE;
        bSetValue = TRUE;
        for(USHORT i = 0; i < MAXLEVEL; i++)
        {
            if(nActNumLvl & nMask)
            {
                const SwNumFmt &rNumFmt = pActNum->Get(i);
                if(bFirst)
                {
                    nValue = rNumFmt.GetAbsLSpace();
                    if(bOn && i)
                        nValue -= pActNum->Get(i - 1).GetAbsLSpace();
                }
                else
                    bSetValue = nValue == rNumFmt.GetAbsLSpace() - pActNum->Get(i - 1).GetAbsLSpace();
                bFirst = FALSE;
            }
            nMask <<= 1;
        }

    }
    if(bSetValue)
        aDistBorderMF.SetValue(aDistBorderMF.Normalize(nValue), FUNIT_TWIP);
    else
        aDistBorderMF.SetText(aEmptyStr);
    aDistBorderMF.Enable(bOn || bSingleSelection||0 != pOutlineDlg);
    bLastRelative = bOn;
    return 0;
}
/*-----------------05.12.97 15:33-------------------

--------------------------------------------------*/
IMPL_LINK( SwNumPositionTabPage, StandardHdl, PushButton *, EMPTYARG )
{
    USHORT nMask = 1;
    for(USHORT i = 0; i < MAXLEVEL; i++)
    {
        if(nActNumLvl & nMask)
        {
            SwNumFmt aNumFmt( pActNum->Get( i ) );
            SwNumRule aTmpNumRule(pWrtSh->GetUniqueNumRuleName(),
                pOutlineDlg ? OUTLINE_RULE : NUM_RULE
                );
            SwNumFmt aTempFmt(aTmpNumRule.Get( i ));
            aNumFmt.SetAbsLSpace( aTempFmt.GetAbsLSpace());
            aNumFmt.SetCharTextOffset( aTempFmt.GetCharTextOffset() );
            aNumFmt.SetFirstLineOffset( aTempFmt.GetFirstLineOffset() );

            pActNum->Set( i, aNumFmt );
        }
        nMask <<= 1;
    }

    InitControls();
    SetModified();
    return 0;
}

#ifdef DEBUG
void SwNumPositionTabPage::SetModified(BOOL bRepaint)
{
    bModified = TRUE;
    if(bRepaint)
    {
        aPreviewWIN.SetLevel(nActNumLvl);
        aPreviewWIN.Invalidate();
    }
}

#endif

/**************************************************************************/
/*                                                                        */
/*                                                                        */
/**************************************************************************/


SwSvxNumBulletTabDialog::SwSvxNumBulletTabDialog(Window* pParent,
                    const SfxItemSet* pSwItemSet, SwWrtShell & rSh) :
    SfxTabDialog(pParent, SW_RES(DLG_SVXTEST_NUM_BULLET), pSwItemSet, FALSE, &aEmptyStr),
    rWrtSh(rSh),
    nRetOptionsDialog(USHRT_MAX),
    sRemoveText(ResId(ST_RESET))
{
    FreeResource();
    GetUserButton()->SetText(sRemoveText);
    GetUserButton()->SetHelpId(HID_NUM_RESET);
    GetUserButton()->SetClickHdl(LINK(this, SwSvxNumBulletTabDialog, RemoveNumberingHdl));
    if(!rWrtSh.GetCurNumRule())
        GetUserButton()->Enable(FALSE);
    AddTabPage(RID_SVXPAGE_PICK_SINGLE_NUM,     &SvxSingleNumPickTabPage::Create, 0);
    AddTabPage(RID_SVXPAGE_PICK_BULLET, &SvxBulletPickTabPage::Create, 0);
    AddTabPage(RID_SVXPAGE_PICK_NUM,    &SvxNumPickTabPage::Create, 0);
    AddTabPage(RID_SVXPAGE_PICK_BMP,    &SvxBitmapPickTabPage::Create, 0);
    AddTabPage(RID_SVXPAGE_NUM_OPTIONS, &SvxNumOptionsTabPage::Create, 0);
    AddTabPage(RID_SVXPAGE_NUM_POSITION,&SvxNumPositionTabPage::Create, 0);

}
/*-----------------07.02.97 12.08-------------------

--------------------------------------------------*/

SwSvxNumBulletTabDialog::~SwSvxNumBulletTabDialog()
{
}

/*-----------------07.02.97 14.48-------------------

--------------------------------------------------*/

void SwSvxNumBulletTabDialog::PageCreated(USHORT nPageId, SfxTabPage& rPage)
{
    //Namen der Vorlagen und Metric setzen
    String sNumCharFmt; GetDocPoolNm( RES_POOLCHR_NUM_LEVEL, sNumCharFmt );
    String sBulletCharFmt; GetDocPoolNm( RES_POOLCHR_BUL_LEVEL, sBulletCharFmt );

    switch ( nPageId )
    {
    case RID_SVXPAGE_PICK_NUM:
        ((SvxNumPickTabPage&)rPage).SetCharFmtNames(sNumCharFmt, sBulletCharFmt);
        break;
    case RID_SVXPAGE_PICK_BULLET :
        ((SvxBulletPickTabPage&)rPage).SetCharFmtName(sBulletCharFmt);
        break;

    case RID_SVXPAGE_NUM_OPTIONS:
        {
            ((SvxNumOptionsTabPage&)rPage).SetCharFmts(sNumCharFmt, sBulletCharFmt);
            ListBox& rCharFmtLB = ((SvxNumOptionsTabPage&)rPage).GetCharFmtListBox();
            // Zeichenvorlagen sammeln
            rCharFmtLB.Clear();
            rCharFmtLB.InsertEntry( ViewShell::GetShellRes()->aStrNone );
            SwDocShell* pDocShell = rWrtSh.GetView().GetDocShell();
            ::FillCharStyleListBox(rCharFmtLB,  pDocShell);
            FieldUnit eMetric = ::GetDfltMetric(0 != PTR_CAST(SwWebDocShell, pDocShell));
            ((SvxNumOptionsTabPage&)rPage).SetMetric(eMetric);
        }
        break;
    case RID_SVXPAGE_NUM_POSITION:
        {
            SwDocShell* pDocShell = rWrtSh.GetView().GetDocShell();
            FieldUnit eMetric = ::GetDfltMetric(0 != PTR_CAST(SwWebDocShell, pDocShell));
            ((SvxNumPositionTabPage&)rPage).SetMetric(eMetric);
//          ((SvxNumPositionTabPage&)rPage).SetWrtShell(&rWrtSh);
        }
        break;
    }
}
/*-----------------17.02.97 16.52-------------------

--------------------------------------------------*/
short  SwSvxNumBulletTabDialog::Ok()
{
    short nRet = SfxTabDialog::Ok();
    pExampleSet->ClearItem(SID_PARAM_NUM_PRESET);
    return nRet;
}
/* -----------------02.12.98 08:35-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK(SwSvxNumBulletTabDialog, RemoveNumberingHdl, PushButton*, EMPTYARG)
{
    EndDialog(RET_USER);
    return 0;
}

/*--------------------------------------------------------------------


      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.198  2000/09/18 16:05:58  willem.vandorp
      OpenOffice header added.

      Revision 1.197  2000/07/27 21:16:39  jp
      opt: get template names direct from the doc and don't load it from the resource

      Revision 1.196  2000/06/30 15:08:15  os
      #76568# CreateFromInt32

      Revision 1.195  2000/05/23 19:22:35  jp
      Bugfixes for Unicode

      Revision 1.194  2000/04/18 15:08:17  os
      UNICODE

      Revision 1.193  2000/03/03 15:17:02  os
      StarView remainders removed

      Revision 1.192  2000/02/11 14:56:31  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.191  1999/08/19 14:26:00  OS
      #67374# embedded graphics in numberings


      Rev 1.190   19 Aug 1999 16:26:00   OS
   #67374# embedded graphics in numberings

      Rev 1.189   23 Apr 1999 16:09:20   OS
   #64476# Differenz zu numpages.cxx

      Rev 1.188   14 Apr 1999 08:57:14   OS
   #64476# noch ein Problem behoben

      Rev 1.187   13 Apr 1999 16:04:20   OS
   #64473# CheckBox an der richtigen Stelle enablen/disablen

      Rev 1.186   08 Apr 1999 13:30:58   OS
   #64476# SetMinDist wird nicht mehr gebraucht

      Rev 1.185   19 Mar 1999 07:38:10   OS
   #62656# Abstand Num->Text jetzt richtig

      Rev 1.184   18 Mar 1999 09:25:40   OS
   #63049# gemogelte Anzeige der Numerierungseinzuege

      Rev 1.183   02 Dec 1998 09:20:56   OS
   #58263# Entfernen-Button fuer Numerierungen

      Rev 1.182   17 Nov 1998 10:57:20   OS
   #58263# Numerierungs-Tabseiten aus dem Svx

      Rev 1.181   03 Nov 1998 07:25:04   OS
   #58263# Numerierungsdialog in den Svx

      Rev 1.180   12 Oct 1998 13:17:26   OS
   #57760# Fontgroesse fuer das Beispiel eleganter ermitteln

      Rev 1.179   22 Sep 1998 10:04:02   OS
   #56894# vollstaendig fuer fortlaufende Num. veraendern

      Rev 1.178   08 Sep 1998 17:01:42   OS
   #56134# Metric fuer Text und HTML getrennt

      Rev 1.177   06 Aug 1998 21:41:14   JP
   Bug #54796#: neue NumerierungsTypen (WW97 kompatibel)

      Rev 1.176   18 Jul 1998 14:50:46   OS
   richtige Ebenenanzahl fuer vollst. Numerierung #53233#

      Rev 1.175   09 Jul 1998 14:03:12   OS
   Kapitelnumerierung jetzt TabDialog

      Rev 1.174   07 Jul 1998 11:31:08   OS
   InitControls: erst Min/Max setzen, dann Inhalte setzn

      Rev 1.173   07 Jul 1998 09:16:40   OS
   DisableItem ist nicht zulaessig #52134#

      Rev 1.172   04 Jul 1998 15:44:10   OS
   Grafikhoehe und Ausrichtung richtig anzeigen #52140#

      Rev 1.171   25 Jun 1998 11:26:48   OS
   RelLSpace ausbgebaut #51379#

      Rev 1.170   24 Jun 1998 09:00:44   OS
   MS-Optimierungs-GPF #51425#


 --------------------------------------------------------------------*/


diff --git a/sw/source/ui/misc/num.hrc b/sw/source/ui/misc/num.hrc
new file mode 100644
index 0000000..4775a03
--- /dev/null
+++ b/sw/source/ui/misc/num.hrc
@@ -0,0 +1,80 @@
/*************************************************************************
 *
 *  $RCSfile: num.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:45 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/


#define GB_LEVEL        1
#define LB_LEVEL        2
#define GB_POSITION     3
#define FT_BORDERDIST   4
#define MF_BORDERDIST   5
#define CB_RELATIVE     6
#define FT_INDENT       7
#define MF_INDENT       8
#define FT_NUMDIST      9
#define MF_NUMDIST      10
#define FT_ALIGN        11
#define LB_ALIGN        12
#define PB_STANDARD     13
#define GB_PREVIEW      14
#define WIN_PREVIEW     15
#define ST_RESET        16


diff --git a/sw/source/ui/misc/num.src b/sw/source/ui/misc/num.src
new file mode 100644
index 0000000..dfdadaa
--- /dev/null
+++ b/sw/source/ui/misc/num.src
@@ -0,0 +1,755 @@
/*************************************************************************
 *
 *  $RCSfile: num.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:45 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
/* StarView ressource file */


#include "globals.hrc"
#include "misc.hrc"
#include "num.hrc"
#include "cmdid.h"
#include "helpid.h"
#include "svx/dialogs.hrc"

/**************************************************************************/
/*                                                                        */
/*  TabPage Positionen                                                    */
/*                                                                        */
/**************************************************************************/
TabPage TP_NUM_POSITION
{
    HelpID = HID_NUM_POSITION ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Hide = TRUE;
    GroupBox GB_LEVEL
    {
        Pos = MAP_APPFONT ( 6 , 1 ) ;
        Size = MAP_APPFONT ( 38 , 130 ) ;
        Text = "Ebene" ;
        Text [ ENGLISH ] = "Level" ;
        Text [ norwegian ] = "Level" ;
        Text [ italian ] = "Livello" ;
        Text [ portuguese_brazilian ] = "Nível" ;
        Text [ portuguese ] = "Nível" ;
        Text [ finnish ] = "Taso" ;
        Text [ danish ] = "Niveau" ;
        Text [ french ] = "Niveau" ;
        Text [ swedish ] = "Nivå" ;
        Text [ dutch ] = "Niveau" ;
        Text [ spanish ] = "Nivel" ;
        Text [ english_us ] = "Level" ;
        Text[ chinese_simplified ] = "¼¶";
        Text[ russian ] = "Óðîâåíü";
        Text[ polish ] = "Poziom";
        Text[ japanese ] = "ÚÍÞÙ";
        Text[ chinese_traditional ] = "¯Å";
        Text[ arabic ] = "ÇáãÓÊæì";
        Text[ greek ] = "Åðßðåäï";
        Text[ korean ] = "¼öÁØ";
        Text[ turkish ] = "Düzey";
        Text[ language_user1 ] = " ";
    };
    MultiListBox LB_LEVEL
    {
        Pos = MAP_APPFONT ( 12 , 14 ) ;
        Size = MAP_APPFONT ( 26 , 114 ) ;
        TabStop = TRUE ;
        DropDown = FALSE ;
        Border = TRUE ;
        SimpleMode = TRUE ;
    };
    GroupBox GB_POSITION
    {
        Pos = MAP_APPFONT ( 47 , 1 ) ;
        Size = MAP_APPFONT ( 207 , 77 ) ;
        Text = "Position und Abstand" ;
        Text [ ENGLISH ] = "Position and distance" ;
        Group = TRUE ;
        Text [ english_us ] = "Position and spacing" ;
        Text [ italian ] = "Posizione" ;
        Text [ spanish ] = "Posición y espacio" ;
        Text [ french ] = "Position et écart" ;
        Text [ dutch ] = "Positie en afstand" ;
        Text [ swedish ] = "Position och avstånd" ;
        Text [ danish ] = "Placering og afstand" ;
        Text [ portuguese_brazilian ] = "Position" ;
        Text [ portuguese ] = "Posicionamento" ;
        Text[ chinese_simplified ] = "λÖúͼä¸ô";
        Text[ russian ] = "Ïîçèöèÿ è èíòåðâàë";
        Text[ polish ] = "Pozycja i odstêp";
        Text[ japanese ] = "ˆÊ’u‚ÆŠÔŠu";
        Text[ chinese_traditional ] = "¦ì¸m©M¶¡¹j";
        Text[ arabic ] = "ÇáãæÞÚ æÇáãÓÇÝÉ";
        Text[ greek ] = "ÈÝóç êáé áðüóôáóç";
        Text[ korean ] = "À§Ä¡¿Í °£°Ý";
        Text[ language_user1 ] = " ";
        Text[ turkish ] = "Konum ve aralýk";
    };
    FixedText FT_BORDERDIST
    {
        Pos = MAP_APPFONT ( 50 , 14 ) ;
        Size = MAP_APPFONT ( 105 , 10 ) ;
        Text = "Ein~rückung";
//        Text = "Abstand Text <-> Rand" ;
        Text [ ENGLISH ] = "Distance text <-> border" ;
        Text [ english_us ] = "Indent" ;
        Text [ swedish ] = "Indrag" ;
        Text [ danish ] = "Indrykning" ;
        Text [ italian ] = "~Rientro" ;
        Text [ spanish ] = "~Sangría" ;
        Text [ french ] = "~Retrait" ;
        Text [ dutch ] = "~Inspringing" ;
        Text [ portuguese_brazilian ] = "Ab~stand Text <-> Rand" ;
        Text [ portuguese ] = "A~vanço" ;
        Text[ chinese_simplified ] = "Ëõ½ø";
        Text[ russian ] = "Îòñòóï";
        Text[ polish ] = "Wciêcie";
        Text[ japanese ] = "ŠÔŠu(~B)";
        Text[ chinese_traditional ] = "ÁY±Æ";
        Text[ arabic ] = "ÇáÅÒÇÍÉ";
        Text[ greek ] = "Åóï÷Þ";
        Text[ korean ] = "µé¿©¾²±â";
        Text[ turkish ] = "Girinti";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_RELATIVE
    {
        Pos = MAP_APPFONT ( 201 , 14 ) ;
        Size = MAP_APPFONT ( 49 , 10 ) ;
        Text = "Relati~v" ;
        Text [ ENGLISH ] = "Relati~ve" ;
        Text [ portuguese ] = "~Relativo" ;
        Text [ english_us ] = "Relati~ve" ;
        Text [ portuguese_brazilian ] = "Relati~v" ;
        Text [ swedish ] = "Relati~v" ;
        Text [ danish ] = "Relativ" ;
        Text [ italian ] = "Relati~vo" ;
        Text [ spanish ] = "Relati~vo" ;
        Text [ french ] = "~Relatif" ;
        Text [ dutch ] = "Relati~ef" ;
        Text[ chinese_simplified ] = "Ïà¹Ø(~R)";
        Text[ russian ] = "Îòíîñèò.";
        Text[ polish ] = "Wzglêd~ny";
        Text[ japanese ] = "‘OÚÍÞق©‚ç(~R)";
        Text[ chinese_traditional ] = "¬ÛÃö(~R)";
        Text[ arabic ] = "äÓÈí";
        Text[ language_user1 ] = " ";
        Text[ greek ] = "Ó÷åôéêÜ";
        Text[ korean ] = "ºñ·Ê(~V)";
        Text[ turkish ] = "Orantýlý";
    };
    MetricField MF_BORDERDIST
    {
        Pos = MAP_APPFONT ( 158 , 12 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        Border = TRUE ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 0 ;
        Maximum = 1999 ;
        DecimalDigits = 2 ;
        Value = 0 ;
        Unit = FUNIT_CM ;
        First = 0 ;
        Last = 1999 ;
        SpinSize = 5 ;
    };
    FixedText FT_INDENT
    {
        Pos = MAP_APPFONT ( 50 , 29 ) ;
        Size = MAP_APPFONT ( 105 , 10 ) ;
        Text = "Abstand zum Te~xt" ;
//        Text = "Einr~ückung" ;
        Text [ ENGLISH ] = "Indent" ;
        Text [ english_us ] = "Space to Te~xt" ;
        Text [ swedish ] = "Avstånd till text" ;
        Text [ danish ] = "Afstand til tekst" ;
        Text [ italian ] = "~Rientro" ;
        Text [ spanish ] = "~Distancia al texto" ;
        Text [ french ] = "~Écart du texte" ;
        Text [ dutch ] = "Afstand tot ~tekst" ;
        Text [ portuguese_brazilian ] = "Einr~ückung" ;
        Text [ portuguese ] = "~Distância do texto" ;
        Text[ chinese_simplified ] = "ÖÁÕýÎĵľàÀë(~X)";
        Text[ russian ] = "Ðàññòîÿíèå îò òåêñòà";
        Text[ polish ] = "Odstêp do tekstu";
        Text[ japanese ] = "÷½Ä‚܂ł̊Ԋu(~X)";
        Text[ chinese_traditional ] = "¦Ü¤º¤åªº¶ZÖÃ(~X)";
        Text[ arabic ] = "ÇáãÓÇÝÉ ÍÊì ÇáäÕ";
        Text[ greek ] = "Áðüóôáóç áðü ~êåßìåíï";
        Text[ korean ] = "ÅØ½ºÆ®¿ÍÀÇ °£°Ý(~X)";
        Text[ turkish ] = "Metin uzaklýðý";
        Text[ language_user1 ] = " ";
    };
    MetricField MF_INDENT
    {
        Pos = MAP_APPFONT ( 158 , 27 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        Border = TRUE ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 0 ;
        Maximum = 1999 ;
        DecimalDigits = 2 ;
        Value = 0 ;
        Unit = FUNIT_CM ;
        First = 0 ;
        Last = 1999 ;
        SpinSize = 5 ;
    };
    FixedText FT_NUMDIST
    {
        Pos = MAP_APPFONT ( 50 , 44 ) ;
        Size = MAP_APPFONT ( 105 , 10 ) ;
        Text = "Mindestabstand Nummer <-> Text" ;
//        Text = "Abstand Te~xt <-> Numerierung" ;
        Text [ ENGLISH ] = "Distance text <-> numbering" ;
        Text [ english_us ] = "Minimum space numbering <-> text" ;
        Text [ swedish ] = "Minsta avstånd nummer <-> text" ;
        Text [ danish ] = "Min. afstand nummer <-> tekst" ;
        Text [ italian ] = "Distanza testo <-> numerazione" ;
        Text [ spanish ] = "Distancia mínima Número <-> Texto" ;
        Text [ french ] = "Écart minimum numéro <-> texte" ;
        Text [ dutch ] = "Min. afstand nummer <-> tekst" ;
        Text [ portuguese_brazilian ] = "Abstand Te~xt <-> Numerierung" ;
        Text [ portuguese ] = "Distância mínima número <-> texto" ;
        Text[ chinese_simplified ] = "×îС¼ä¸ô ±àºÅÖÁÕýÎÄ(~B)";
        Text[ russian ] = "Ìèí. èíòåðâàë íîìåð <-> òåêñò";
        Text[ polish ] = "Odstêp conajmniej Numer <-> tekst";
        Text[ japanese ] = "”ԍ†‚ÆÃ·½Ä‚̍ŏ¬ŠÔŠu(~B)";
        Text[ chinese_traditional ] = "³Ì¤p¶¡¹j ½s¸¹ <-> ¤º¤å(~B)";
        Text[ arabic ] = "ÃÞá ãÓÇÝÉ Èíä ÇáÑÞã <-> ÇáäÕ";
        Text[ greek ] = "ÅëÜ÷éóôç áðüóôáóç áñéèìïý <-> Êåßìåíï";
        Text[ korean ] = "ÃÖ¼Ò °£°Ý  Å©±â <-> ÅØ½ºÆ®(~B)";
        Text[ turkish ] = "Asgari numara <-> metin aralýðý";
        Text[ language_user1 ] = " ";
    };
    MetricField MF_NUMDIST
    {
        Pos = MAP_APPFONT ( 158 , 42 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 0 ;
        Maximum = 1999 ;
        DecimalDigits = 2 ;
        Value = 0 ;
        Unit = FUNIT_CM ;
        First = 0 ;
        Last = 1999 ;
        SpinSize = 5 ;
        Border = TRUE ;
        TabStop = TRUE ;
    };
    FixedText FT_ALIGN
    {
        Pos = MAP_APPFONT ( 50 , 59 ) ;
        Size = MAP_APPFONT ( 105 , 10 ) ;
        Text = "Ausri~chtung der Nummerierung" ;
        Text [ ENGLISH ] = "Alignment of the numbering" ;
         //???
        Text [ english_us ] = "Numbering ~alignment" ;
        Text [ swedish ] = "~Placering av numrering" ;
        Text [ danish ] = "Justering af nummerering" ;
        Text [ italian ] = "~Allineamento della numerazione" ;
        Text [ spanish ] = "~Alineación de la numeración" ;
        Text [ french ] = "~Alignement de la numérotation" ;
        Text [ dutch ] = "~Nummeringsopties" ;
        Text [ portuguese_brazilian ] = "Ausri~chtung der Numerierung" ;
        Text [ portuguese ] = "A~linhamento da numeração" ;
        Text[ chinese_simplified ] = "±àºÅ¶ÔÆë(~A)";
        Text[ russian ] = "Âûðàâíèâàíèå íóìåðàöèè";
        Text[ polish ] = "Wyrównanie numeracji";
        Text[ japanese ] = "”ԍ†•t‚¯‚Ì”z’u(~A)";
        Text[ language_user1 ] = " ";
        Text[ chinese_traditional ] = "½s¸¹¹ï»ô(~A)";
        Text[ arabic ] = "ãÍÇÐÇÉ ÇáÊÑÞíã";
        Text[ greek ] = "Óôïß÷éóç áñßèìçóçò";
        Text[ korean ] = "¹øÈ£ ¸Å±â±â ¸ÂÃã(~A)";
        Text[ turkish ] = "Numara hizalama";
    };
    ListBox LB_ALIGN
    {
        Pos = MAP_APPFONT ( 158 , 57 ) ;
        Size = MAP_APPFONT ( 40 , 40 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        StringList =
        {
            < "Links" ; > ;
            < "Zentriert" ; > ;
            < "Rechts" ; > ;
        };
        StringList [ ENGLISH ] =
        {
            < "Links" ; > ;
            < "Zentriert" ; > ;
            < "Rechts" ; > ;
        };
        stringlist [ english_us ] =
        {
            < "Left" ; > ;
            < "Centered" ; > ;
            < "Right" ; > ;
        };
        stringlist [ portuguese_brazilian ] =
        {
            < "Links" ; > ;
            < "Zentriert" ; > ;
            < "Rechts" ; > ;
        };
        stringlist [ swedish ] =
        {
            < "Vänster" ; > ;
            < "Centrerad" ; > ;
            < "Höger" ; > ;
        };
        stringlist [ danish ] =
        {
            < "Venstre" ; > ;
            < "Centreret" ; > ;
            < "Højre" ; > ;
        };
        stringlist [ italian ] =
        {
            < "Sinistra" ; > ;
            < "Centrato" ; > ;
            < "Destra" ; > ;
        };
        stringlist [ spanish ] =
        {
            < "Izquierda" ; > ;
            < "Centrado" ; > ;
            < "Derecha" ; > ;
        };
        stringlist [ french ] =
        {
            < "À gauche" ; > ;
            < "Centré" ; > ;
            < "À droite" ; > ;
        };
        stringlist [ dutch ] =
        {
            < "Links" ; > ;
            < "Gecentreerd" ; > ;
            < "Rechts" ; > ;
        };
        stringlist [ portuguese ] =
        {
            < "Esquerda" ; > ;
            < "Centrado" ; > ;
            < "Direita" ; > ;
        };
    StringList [ chinese_simplified ] =
    {
            < "×ó" ; > ;
        < "¾ÓÖÐ" ; > ;
        < "ÓÒ" ; > ;
    };
    StringList [ russian ] =
    {
            < "Ñëåâà" ; > ;
        < "Ïî öåíòðó" ; > ;
        < "Ñïðàâà" ; > ;
    };
    StringList [ polish ] =
    {
            < "Z lewej" ; > ;
        < "Wyœrodkowany" ; > ;
        < "Z prawej" ; > ;
    };
    StringList [ japanese ] =
    {
            < "¶" ; > ;
        < "’†‰›" ; > ;
        < "‰E" ; > ;
    };
    StringList [ chinese_traditional ] =
    {
            < "¥ª" ; > ;
        < "¸m¤¤" ; > ;
        < "¥k" ; > ;
    };
    StringList [ arabic ] =
    {
            < "íÓÇÑ" ; > ;
        < "ÊæÓíØ" ; > ;
        < "íãíä" ; > ;
    };
    StringList [ greek ] =
    {
            < "ÁñéóôåñÜ" ; > ;
        < "ÊåíôñáñéóìÝíá" ; > ;
        < "ÄåîéÜ" ; > ;
    };
    StringList [ korean ] =
    {
            < "¿ÞÂÊ" ; > ;
        < "°¡¿îµ¥" ; > ;
        < "¿À¸¥ÂÊ" ; > ;
    };
    StringList [ turkish ] =
    {
            < "Sol" ; > ;
        < "Orta" ; > ;
        < "Sað" ; > ;
    };
    StringList [ language_user1 ] =
    {
            < " " ; > ;
        < " " ; > ;
        < " " ; > ;
    };
    };
    PushButton PB_STANDARD
    {
        Pos = MAP_APPFONT ( 201 , 63 ) ;
        Size = MAP_APPFONT ( 50 , 12 ) ;
        Text = "~Standard" ;
        Text [ ENGLISH ] = "~Standard" ;
        Text [ english_us ] = "~Default" ;
        Text [ portuguese_brazilian ] = "~Standard" ;
        Text [ swedish ] = "~Standard" ;
        Text [ danish ] = "Standard" ;
        Text [ italian ] = "~Standard" ;
        Text [ spanish ] = "~Predeterminado" ;
        Text [ french ] = "~Par défaut" ;
        Text [ dutch ] = "~Standaard" ;
        Text [ portuguese ] = "~Padrão" ;
        Text[ chinese_simplified ] = "±ê×¼(~D)";
        Text[ russian ] = "Ñòàíäàðò";
        Text[ polish ] = "Domyœlnie";
        Text[ japanese ] = "•W€(~D)";
        Text[ language_user1 ] = " ";
        Text[ chinese_traditional ] = "¼Ð·Ç(~D)";
        Text[ arabic ] = "ýÞíÇÓí";
        Text[ greek ] = "ÐñïåðéëïãÞ";
        Text[ korean ] = "±âº»°ª(~D)";
        Text[ turkish ] = "Standart";
    };
    GroupBox GB_PREVIEW
    {
        Pos = MAP_APPFONT ( 47 , 81 ) ;
        Size = MAP_APPFONT ( 207 , 50 ) ;
        Text = "Vorschau" ;
        Text [ ENGLISH ] = "Preview" ;
        Text [ english_us ] = "Preview" ;
        Text [ portuguese_brazilian ] = "Vorschau" ;
        Text [ swedish ] = "Förhandsvisning" ;
        Text [ danish ] = "Eksempel" ;
        Text [ italian ] = "Anteprima" ;
        Text [ spanish ] = "Previsualización" ;
        Text [ french ] = "Aperçu" ;
        Text [ dutch ] = "Voorbeeld" ;
        Text [ portuguese ] = "Previsualizar" ;
        Text[ chinese_simplified ] = "Ô¤ÊÓ";
        Text[ russian ] = "Ïðîñìîòð";
        Text[ polish ] = "Podgl¹d";
        Text[ japanese ] = "ÌßÚËÞ­°";
        Text[ chinese_traditional ] = "¹wÄý";
        Text[ arabic ] = "ÇáãÚÇíäÉ";
        Text[ greek ] = "Ðñïåðéóêüðçóç";
        Text[ korean ] = "¹Ì¸®º¸±â";
        Text[ turkish ] = "Önizleme";
        Text[ language_user1 ] = " ";
    };
    Window WIN_PREVIEW
    {
        Pos = MAP_APPFONT ( 50 , 92 ) ;
        Size = MAP_APPFONT ( 201 , 34 ) ;
    };
};

/**************************************************************************/
/*                                                                        */
/*  Dialog fuer Test der Svx-Implementation                               */
/*                                                                        */
/**************************************************************************/
TabDialog DLG_SVXTEST_NUM_BULLET
{
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Text = "Nummerierung/Aufzählung" ;
    Text [ ENGLISH ] = "" ;
    Moveable = TRUE ;
    TabControl 1
    {
        SVLook = TRUE ;
        PageList =
        {
            PageItem
            {
                Identifier = RID_SVXPAGE_PICK_BULLET ;
                Text = "Bullets" ;
                Text [ ENGLISH ] = "Bullets" ;
                Text [ english_us ] = "Bullets" ;
                Text [ portuguese_brazilian ] = "Bullets" ;
                Text [ swedish ] = "Bullets" ;
                Text [ danish ] = "Punkttegn" ;
                Text [ italian ] = "Punti" ;
                Text [ spanish ] = "Viñetas" ;
                Text [ french ] = "Puces" ;
                Text [ dutch ] = "Opsommingstekens" ;
                Text [ portuguese ] = "Marcas" ;
                Text[ chinese_simplified ] = "ÏîÄ¿·ûºÅ";
                Text[ russian ] = "Ìàðêåðû";
                Text[ polish ] = "Wypunktowanie";
                Text[ japanese ] = "‰Óð‘‚«";
                Text[ chinese_traditional ] = "¶µ¥Ø²Å¸¹";
                Text[ arabic ] = "ÚáÇãÇÊ ÊÚÏÇÏ";
                Text[ greek ] = "Êïõêßäåò";
                Text[ korean ] = "±Û ¸Ó¸® ±âÈ£";
                Text[ turkish ] = "Madde iþaretleri";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = RID_SVXPAGE_PICK_SINGLE_NUM ;
                Text = "Nummerierungsart" ;
                Text [ ENGLISH ] = "Digits" ;
                Text [ english_us ] = "Numbering type" ;
                Text [ portuguese_brazilian ] = "Numerierungsart" ;
                Text [ swedish ] = "Numreringstyp" ;
                Text [ danish ] = "Nummereringstype" ;
                Text [ italian ] = "Tipo di numerazione" ;
                Text [ spanish ] = "Tipo de numeración" ;
                Text [ french ] = "Type de numérotation" ;
                Text [ dutch ] = "Nummeringstijl" ;
                Text [ portuguese ] = "Tipo de numeração" ;
                Text[ chinese_simplified ] = "±àºÅÀàÐÍ";
                Text[ russian ] = "Òèï íóìåðàöèè";
                Text[ polish ] = "Rodzaj numeracji";
                Text[ japanese ] = "”ԍ†•t‚¯‚ÌŽí—Þ";
                Text[ chinese_traditional ] = "½s¸¹Ãþ«¬";
                Text[ arabic ] = "ØÑíÞÉ ÇáÊÑÞíã";
                Text[ greek ] = "Óôõë áñßèìçóçò";
                Text[ korean ] = "¹øÈ£ ¸Å±â±âÀ¯Çü";
                Text[ turkish ] = "Numaralama türü";
                Text[ language_user1 ] = "Avoid use of \"style\" whenever possible if it could be confused with Styles. EM15.5.00";
            };
            PageItem
            {
                Identifier = RID_SVXPAGE_PICK_NUM ;
                Text = "Gliederung" ;
                Text [ ENGLISH ] = "Outline" ;
                Text [ english_us ] = "Outline" ;
                Text [ portuguese_brazilian ] = "Numerierung" ;
                Text [ swedish ] = "Disposition" ;
                Text [ danish ] = "Nummerering" ;
                Text [ italian ] = "Struttura" ;
                Text [ spanish ] = "Esquema" ;
                Text [ french ] = "Plan" ;
                Text [ dutch ] = "Overzicht" ;
                Text [ portuguese ] = "Esquema" ;
                Text[ chinese_simplified ] = "´ó¸Ù";
                Text[ russian ] = "Ñòðóêòóðà";
                Text[ polish ] = "Konspekt";
                Text[ japanese ] = "±³ÄײÝ";
                Text[ chinese_traditional ] = "¤jºõ";
                Text[ arabic ] = "ÊÞÓíã";
                Text[ greek ] = "ÄéÜñèñùóç";
                Text[ korean ] = "¿Ü°û¼±";
                Text[ turkish ] = "Anahat";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = RID_SVXPAGE_PICK_BMP ;
                Text = "Grafiken" ;
                Text [ ENGLISH ] = "Images" ;
                Text [ english_us ] = "Graphics" ;
                Text [ portuguese_brazilian ] = "Grafiken" ;
                Text [ swedish ] = "Grafiker" ;
                Text [ danish ] = "Billeder" ;
                Text [ italian ] = "Immagini" ;
                Text [ spanish ] = "Imágenes" ;
                Text [ french ] = "Images" ;
                Text [ dutch ] = "Afbeeldingen" ;
                Text [ portuguese ] = "Imagens" ;
                Text[ chinese_simplified ] = "ͼÐÎ";
                Text[ russian ] = "Ðèñóíêè";
                Text[ polish ] = "Grafiki";
                Text[ japanese ] = "}";
                Text[ chinese_traditional ] = "¹Ï¤ù";
                Text[ arabic ] = "ÕæÑ";
                Text[ greek ] = "ÃñáöéêÜ";
                Text[ korean ] = "±×·¡ÇÈ";
                Text[ turkish ] = "Grafikler";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = RID_SVXPAGE_NUM_POSITION ;
                Text = "Position" ;
                Text [ ENGLISH ] = "Position" ;
                Text [ english_us ] = "Position" ;
                Text [ portuguese_brazilian ] = "Position" ;
                Text [ swedish ] = "Position" ;
                Text [ danish ] = "Placering" ;
                Text [ italian ] = "Posizione" ;
                Text [ spanish ] = "Posición" ;
                Text [ french ] = "Position" ;
                Text [ dutch ] = "Positie" ;
                Text [ portuguese ] = "Posição" ;
                Text[ chinese_simplified ] = "λÖÃ";
                Text[ russian ] = "Ïîçèöèÿ";
                Text[ polish ] = "Pozycja";
                Text[ japanese ] = "ˆÊ’u";
                Text[ chinese_traditional ] = "¦ì¸m";
                Text[ arabic ] = "ÇáãæÞÚ";
                Text[ greek ] = "ÈÝóç";
                Text[ korean ] = "À§Ä¡";
                Text[ turkish ] = "Konum";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = RID_SVXPAGE_NUM_OPTIONS ;
                /* ### ACHTUNG: Neuer Text in Resource? Optionen : ~Optionen */
                Text = "Optionen" ;
                Text [ ENGLISH ] = "Customize" ;
                Text [ english_us ] = "Options" ;
                Text [ portuguese_brazilian ] = "~Optionen" ;
                Text [ swedish ] = "Alternativ" ;
                Text [ danish ] = "Indstillinger" ;
                Text [ italian ] = "Opzioni" ;
                Text [ spanish ] = "Opciones" ;
                Text [ french ] = "Options" ;
                Text [ dutch ] = "Opties" ;
                Text [ portuguese ] = "Opções" ;
                Text[ chinese_simplified ] = "Ñ¡Ïî";
                Text[ russian ] = "Íàñòðîéêè";
                Text[ polish ] = "Opcje";
                Text[ japanese ] = "µÌß¼®Ý";
                Text[ chinese_traditional ] = "¿ï¶µ";
                Text[ arabic ] = "ÎíÇÑÇÊ";
                Text[ greek ] = "ÅðéëïãÝò";
                Text[ korean ] = "»ç¿ëÀÚ È¯°æ ¼³Á¤";
                Text[ turkish ] = "Seçenekler";
                Text[ language_user1 ] = "KW had called this \"Customize\" which leads to unnecessary confusion in translation. EM";
            };
        };
        Text[ english_us ] = "Numbering/Bullets";
    Text[ portuguese ] = "Numeração & Marcas";
    Text[ russian ] = "Numerierung/Aufzählung";
    Text[ dutch ] = "Nummering/opsomming";
    Text[ french ] = "Numérotation/Puces";
    Text[ spanish ] = "Numeración/Viñetas";
    Text[ italian ] = "Elenchi puntati e numerati";
    Text[ danish ] = "Nummerering/Punkttegn";
    Text[ swedish ] = "Numrering/punktmarkering";
    Text[ polish ] = "Numeracja/Liczenie";
    Text[ portuguese_brazilian ] = "Numerierung/Aufzählung";
    Text[ japanese ] = "’i—Ž”Ô†/‰Óð‘‚«";
    Text[ chinese_simplified ] = "±àºÅ/ÏîÄ¿·ûºÅ";
};
    String ST_RESET
    {
        Text = "~Entfernen" ;
        Text [ ENGLISH ] = "~Remove" ;
        Text [ norwegian ] = "~Fjern" ;
        Text [ italian ] = "Rimuovi" ;
        Text [ portuguese_brazilian ] = "~Remover" ;
        Text [ portuguese ] = "~Remover" ;
        Text [ finnish ] = "~Poista" ;
        Text [ danish ] = "Fjern" ;
        Text [ french ] = "~Supprimer" ;
        Text [ swedish ] = "~Radera" ;
        Text [ dutch ] = "Ve~rwijderen" ;
        Text [ spanish ] = "~Eliminar" ;
        Text [ english_us ] = "~Remove" ;
        Text[ chinese_simplified ] = "ɾ³ý(~R)";
        Text[ russian ] = "Óäàëèòü";
        Text[ polish ] = "Usuñ";
        Text[ japanese ] = "íœ(~R)";
        Text[ chinese_traditional ] = "§R°£(~R)";
        Text[ arabic ] = "ÅÒÇáÉ";
        Text[ greek ] = "ÄéáãñáöÞ";
        Text[ korean ] = "»èÁ¦(~R)";
        Text[ turkish ] = "Kaldýr";
        Text[ language_user1 ] = " ";
    };
    Text [ english_us ] = "Numbering/Bullets" ;
    Text [ portuguese_brazilian ] = "Numerierung/Aufzählung" ;
    Text [ swedish ] = "Numrering/punktmarkering" ;
    Text [ danish ] = "Nummerering/punkttegn" ;
    Text [ italian ] = "Elenchi puntati e numerati" ;
    Text [ spanish ] = "Numeración/Viñetas" ;
    Text [ french ] = "Numérotation/Puces" ;
    Text [ dutch ] = "Nummering/opsomming" ;
    Text [ portuguese ] = "Numeração & Marcas" ;
    Text[ chinese_simplified ] = "±àºÅ/ÏîÄ¿·ûºÅ";
    Text[ russian ] = "Íóìåðàöèÿ/Ñïèñîê";
    Text[ polish ] = "Numeracja/Wypunktowanie";
    Text[ japanese ] = "”ԍ†•t‚¯/‰Óð‘‚«";
    Text[ chinese_traditional ] = "½s¸¹/¶µ¥Ø²Å¸¹";
    Text[ arabic ] = "ÊÑÞíã/ÊÚÏÇÏ";
    Text[ greek ] = "Áñßèìçóç/Êïõêßäåò";
    Text[ korean ] = "¹øÈ£ ¸Å±â±â/±Û ¸Ó¸® ±âÈ£";
    Text[ turkish ] = "Numaralama/madde iþaretleri";
    Text[ language_user1 ] = " ";
};

diff --git a/sw/source/ui/misc/outline.cxx b/sw/source/ui/misc/outline.cxx
new file mode 100644
index 0000000..aa73fbf
--- /dev/null
+++ b/sw/source/ui/misc/outline.cxx
@@ -0,0 +1,1371 @@
/*************************************************************************
 *
 *  $RCSfile: outline.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:45 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _SHL_HXX //autogen
#include <tools/shl.hxx>
#endif
#ifndef _MENU_HXX //autogen
#include <vcl/menu.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SFXTABDLG_HXX //autogen
#include <sfx2/tabdlg.hxx>
#endif
#ifndef _SV_SYSTEM_HXX //autogen
#include <vcl/system.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif

#ifndef _NUM_HXX //autogen
#define USE_NUMTABPAGES
#include <num.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _UITOOL_HXX
#include <uitool.hxx>
#endif
#ifndef _ERRHDL_HXX
#include <errhdl.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _NUMRULE_HXX
#include <numrule.hxx>
#endif
#ifndef _FMTCOL_HXX
#include <fmtcol.hxx>
#endif
#ifndef _OUTLINE_HXX
#include <outline.hxx>
#endif
#ifndef _UINUMS_HXX
#include <uinums.hxx>
#endif
#ifndef _POOLFMT_HXX
#include <poolfmt.hxx>
#endif
#ifndef _SHELLRES_HXX //autogen
#include <shellres.hxx>
#endif
#ifndef _SFXSTYLE_HXX //autogen
#include <svtools/style.hxx>
#endif
#ifndef _CHARFMT_HXX //autogen
#include <charfmt.hxx>
#endif
#ifndef _DOCSTYLE_HXX //autogen
#include <docstyle.hxx>
#endif

#ifndef _HELPID_H
#include <helpid.h>
#endif
#ifndef _GLOBALS_HRC
#include <globals.hrc>      // fuer Vorlagenname 'keins'
#endif
#ifndef _MISC_HRC
#include <misc.hrc>
#endif
#ifndef _OUTLINE_HRC
#include <outline.hrc>
#endif


#define C2S(cChar) UniString::CreateFromAscii(cChar)

DBG_NAME(outlinehdl);

// ReplaceTabStr implementiert in doc/docedt.cxx
//extern void ReplaceTabsStr( String& rStr, const String& rSrch,
//                              const String& rRepl );

USHORT lcl_AdjustToPos(SvxAdjust eAdjust)
{
    USHORT nRet = 0;
    switch( eAdjust )
    {
        case SVX_ADJUST_CENTER: nRet = 1;break;
        case SVX_ADJUST_RIGHT: nRet = 2; break;
    }
    return nRet;
}

// Numerierungsformat Umsetzung:
// ListBox  - Format            - Enum-Wert
// 0        - A, B, C, ...      - 0
// 1        - a, b, c, ...      - 1
// 2        - I, II, III, ...   - 2
// 3        - i, ii, iii, ...   - 3
// 4        - 1, 2, 3, ...      - 4
// 5        - A, .., AA, ..,    - 9
// 6        - a, .., aa, ..,    - 10
// 7        - Ohne              - 5

inline USHORT GetNumPos( USHORT n )
{
    return SVX_NUM_NUMBER_NONE == n ? 7 : SVX_NUM_ARABIC < n ? n - 4 : n;
}

inline SvxExtNumType GetNumType( USHORT n )
{
    return (SvxExtNumType)(7 == n ? SVX_NUM_NUMBER_NONE : SVX_NUM_ARABIC < n ? n + 4 : n);
}

/*---------------------------------------------------------------------

---------------------------------------------------------------------*/

class SwNumNamesDlg: public ModalDialog
{
    Edit         aFormEdit;
    ListBox      aFormBox;
    GroupBox     aFormGrp;
    OKButton     aOKBtn;
    CancelButton aCancelBtn;
    HelpButton   aHelpBtn;

    DECL_LINK( ModifyHdl, Edit * );
    DECL_LINK( SelectHdl, ListBox * );
    DECL_LINK( DoubleClickHdl, ListBox * );

public:
    SwNumNamesDlg(Window *pParent);
    ~SwNumNamesDlg();
    void SetUserNames(const String *pList[]);
    String GetName() const { return aFormEdit.GetText(); }
    USHORT GetCurEntryPos() const { return aFormBox.GetSelectEntryPos(); }
};

/*------------------------------------------------------------------------
 Beschreibung:  selektierten Eintrag merken
------------------------------------------------------------------------*/


IMPL_LINK_INLINE_START( SwNumNamesDlg, SelectHdl, ListBox *, pBox )
{
    aFormEdit.SetText(pBox->GetSelectEntry());
    aFormEdit.SetSelection(Selection(0, SELECTION_MAX));
    return 0;
}
IMPL_LINK_INLINE_END( SwNumNamesDlg, SelectHdl, ListBox *, pBox )

/*------------------------------------------------------------------------
 Beschreibung:  Setzen der vom Benutzer vergebenen Namen
 Parameter:     Liste der vom Benutzer vergebenen Namen;
                nicht vom Benutzer benannte Positionen sind 0.
------------------------------------------------------------------------*/


void SwNumNamesDlg::SetUserNames(const String *pList[])
{
    USHORT nSelect = 0;
    for(USHORT i = 0; i < SwBaseNumRules::nMaxRules; ++i)
    {
        if(pList[i])
        {
            aFormBox.RemoveEntry(i);
            aFormBox.InsertEntry(*pList[i], i);
            if(i == nSelect && nSelect < SwBaseNumRules::nMaxRules)
                nSelect++;
        }
    }
    aFormBox.SelectEntryPos(nSelect);
    SelectHdl(&aFormBox);
}
/*------------------------------------------------------------------------
 Beschreibung:  OK-Button freischalten, wenn Text im Edit steht.
------------------------------------------------------------------------*/


IMPL_LINK_INLINE_START( SwNumNamesDlg, ModifyHdl, Edit *, pBox )
{
    aOKBtn.Enable(0 != pBox->GetText().Len());
    return 0;
}
IMPL_LINK_INLINE_END( SwNumNamesDlg, ModifyHdl, Edit *, pBox )
/*------------------------------------------------------------------------
 Beschreibung:  DoubleClickHdl
------------------------------------------------------------------------*/


IMPL_LINK_INLINE_START( SwNumNamesDlg, DoubleClickHdl, ListBox *, EMPTYARG )
{
    EndDialog(RET_OK);
    return 0;
}
IMPL_LINK_INLINE_END( SwNumNamesDlg, DoubleClickHdl, ListBox *, EMPTYARG )

/*--------------------------------------------------

--------------------------------------------------*/

SwNumNamesDlg::SwNumNamesDlg(Window *pParent)
    : ModalDialog(pParent, SW_RES(DLG_NUM_NAMES)),
    aFormEdit(this, SW_RES(ED_FORM)),
    aFormBox(this, SW_RES(LB_FORM)),
    aFormGrp(this, SW_RES(GB_FORM)),
    aOKBtn(this, SW_RES(BT_OK)),
    aCancelBtn(this, SW_RES(BT_CANCEL)),
    aHelpBtn(this, SW_RES(BT_HELP))
{
    FreeResource();
    aFormEdit.SetModifyHdl(LINK(this, SwNumNamesDlg, ModifyHdl));
    aFormBox.SetSelectHdl(LINK(this, SwNumNamesDlg, SelectHdl));
    aFormBox.SetDoubleClickHdl(LINK(this, SwNumNamesDlg, DoubleClickHdl));
    SelectHdl(&aFormBox);
}

/*--------------------------------------------------

--------------------------------------------------*/

__EXPORT SwNumNamesDlg::~SwNumNamesDlg() {}


/* -----------------08.07.98 08:46-------------------
 *
 * --------------------------------------------------*/
USHORT lcl_BitToLevel(USHORT nActLevel)
{
    USHORT nTmp = nActLevel;
    USHORT nTmpLevel = 0;
    while( 0 != (nTmp >>= 1) )
        nTmpLevel++;
    return nTmpLevel;
}

/* -----------------07.07.98 14:13-------------------
 *
 * --------------------------------------------------*/
SwOutlineTabDialog::SwOutlineTabDialog(Window* pParent,
                    const SfxItemSet* pSwItemSet,
                    SwWrtShell &rSh) :
                                    //der UserString wird danach richtig gesetzt
        SfxTabDialog(pParent, SW_RES(DLG_TAB_OUTLINE), pSwItemSet, FALSE, &aEmptyStr),
        aFormMenu(SW_RES(MN_FORM)),
        bModified(rWrtSh.IsModified()),
        aNullStr(C2S("____")),
        nNumLevel(1),
        pChapterNumRules(SW_MOD()->GetChapterNumRules()),
        rWrtSh(rSh)
{
    PushButton* pUserBtn = GetUserButton();
    pUserBtn->SetText(SW_RES(ST_FORM));
    pUserBtn->SetHelpId(HID_OUTLINE_FORM);
    pUserBtn->SetClickHdl(LINK(this, SwOutlineTabDialog, FormHdl));

    FreeResource();
    pNumRule = new SwNumRule( *rSh.GetOutlineNumRule() );
    GetCancelButton().SetClickHdl(LINK(this, SwOutlineTabDialog, CancelHdl));

    AddTabPage(TP_NUM_POSITION   , &SwNumPositionTabPage::Create, 0);
    AddTabPage(TP_OUTLINE_NUM    , &SwOutlineSettingsTabPage::Create, 0);

    String sHeadline;
    for(USHORT i = 0; i < MAXLEVEL; ++i )
    {
        // wurde die Vorlage noch nicht angelegt, dann ist sie noch an dieserPosition
        if( !rWrtSh.GetParaStyle( GetDocPoolNm( RES_POOLCOLL_HEADLINE1 + i,
                                                    sHeadline )) )
            aCollNames[i] = sHeadline;
    }

    // Erfragen der Gliederungsebenen der Textvorlagen
    const USHORT nCount = rWrtSh.GetTxtFmtCollCount();
    for(i = 0; i < nCount; ++i )
    {
        SwTxtFmtColl &rTxtColl = rWrtSh.GetTxtFmtColl(i);
        if(!rTxtColl.IsDefault())
        {
            BYTE nOutLevel = rTxtColl.GetOutlineLevel();
            if(nOutLevel != NO_NUMBERING)
                aCollNames[ nOutLevel ] = rTxtColl.GetName();
        }
    }
}

/* -----------------07.07.98 14:13-------------------
 *
 * --------------------------------------------------*/
SwOutlineTabDialog::~SwOutlineTabDialog()
{
    delete pNumRule;
}

/* -----------------07.07.98 14:13-------------------
 *
 * --------------------------------------------------*/
void    SwOutlineTabDialog::PageCreated(USHORT nPageId, SfxTabPage& rPage)
{
    switch ( nPageId )
    {
        case TP_NUM_POSITION:
                ((SwNumPositionTabPage&)rPage).SetWrtShell(&rWrtSh);
                ((SwNumPositionTabPage&)rPage).SetOutlineTabDialog(this);
        break;
        case TP_OUTLINE_NUM:
                ((SwOutlineSettingsTabPage&)rPage).SetWrtShell(&rWrtSh);
        break;
    }
}
/* -----------------07.07.98 14:19-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK( SwOutlineTabDialog, CancelHdl, Button *, pBtn )
{
    if (!bModified)
        rWrtSh.ResetModified();
    EndDialog(RET_CANCEL);
    return 0;
}
/* -----------------08.07.98 12:14-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK( SwOutlineTabDialog, FormHdl, Button *, pBtn )
{
    //PopupMenu auffuellen
    for( USHORT i = 0; i < SwChapterNumRules::nMaxRules; ++i )
    {
        const SwNumRulesWithName *pRules = pChapterNumRules->GetRules(i);
        if( pRules )
            aFormMenu.SetItemText(i + MN_FORMBASE, pRules->GetName());
    }
    aFormMenu.SetSelectHdl(LINK(this, SwOutlineTabDialog, MenuSelectHdl));
    aFormMenu.Execute(pBtn, Rectangle(Point(0,0), pBtn->GetSizePixel()), POPUPMENU_EXECUTE_DOWN);
    return 0;
}

/* -----------------08.07.98 12:14-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK( SwOutlineTabDialog, MenuSelectHdl, Menu *, pMenu )
{
    BYTE nLevelNo = 0;
    switch(pMenu->GetCurItemId())
    {
        case MN_FORM1: nLevelNo = 1;    break;
        case MN_FORM2: nLevelNo = 2;    break;
        case MN_FORM3: nLevelNo = 3;    break;
        case MN_FORM4: nLevelNo = 4;    break;
        case MN_FORM5: nLevelNo = 5;    break;
        case MN_FORM6: nLevelNo = 6;    break;
        case MN_FORM7: nLevelNo = 7;    break;
        case MN_FORM8: nLevelNo = 8;    break;
        case MN_FORM9: nLevelNo = 9;    break;

        case MN_SAVE:
        {
            SwNumNamesDlg *pDlg = new SwNumNamesDlg(this);
            const String *aStrArr[SwChapterNumRules::nMaxRules];
            for(USHORT i = 0; i < SwChapterNumRules::nMaxRules; ++i)
            {
                const SwNumRulesWithName *pRules = pChapterNumRules->GetRules(i);
                if(pRules)
                    aStrArr[i] = &pRules->GetName();
                else
                    aStrArr[i] = 0;
            }
            pDlg->SetUserNames(aStrArr);
            if(RET_OK == pDlg->Execute())
            {
                const String aName(pDlg->GetName());
                pChapterNumRules->ApplyNumRules( SwNumRulesWithName(
                        *pNumRule, aName ), pDlg->GetCurEntryPos() );
                pMenu->SetItemText(
                        pDlg->GetCurEntryPos() + MN_FORMBASE, aName);
            }
            delete pDlg;
            return 0;

        }

    }
    if( nLevelNo-- )
    {
        const SwNumRulesWithName *pRules = pChapterNumRules->GetRules( nLevelNo );
        if( pRules )
        {
            pRules->MakeNumRule( rWrtSh, *pNumRule );
            pNumRule->SetRuleType( OUTLINE_RULE );
        }
        else
            *pNumRule = *rWrtSh.GetOutlineNumRule();
    }

    USHORT  nPageId = GetCurPageId();
    SfxTabPage* pPage = GetTabPage( nPageId );
    pPage->Reset(*GetOutputItemSet());

    return 0;
}
/* -----------------07.07.98 14:19-------------------
 *
 * --------------------------------------------------*/
USHORT  SwOutlineTabDialog::GetLevel(const String &rFmtName) const
{
    for(USHORT i = 0; i < MAXLEVEL; ++i)
    {
        if(aCollNames[i] == rFmtName)
            return i;
    }
    return NO_NUMBERING;
}
/* -----------------07.07.98 16:30-------------------
 *
 * --------------------------------------------------*/
short SwOutlineTabDialog::Ok()
{
    short nRet = SfxTabDialog::Ok();
    // bei allen erzeugten Vorlagen die Ebenen setzen, muss
    // geschehen, um evtl. aufgehobene Zuordnungen
    // auch wieder zu loeschen
    USHORT i, nCount = rWrtSh.GetTxtFmtCollCount();
    for( i = 0; i < nCount; ++i )
    {
        SwTxtFmtColl &rTxtColl = rWrtSh.GetTxtFmtColl(i);
        if( !rTxtColl.IsDefault() )
            rTxtColl.SetOutlineLevel( (BYTE)GetLevel(rTxtColl.GetName()));
    }

    for( i = 0; i < MAXLEVEL; ++i )
        if( !aCollNames[i].Len() )
        {
            SwTxtFmtColl* pTxtColl = rWrtSh.GetTxtCollFromPool(
                                                RES_POOLCOLL_HEADLINE1 + i );
            pTxtColl->SetOutlineLevel( NO_NUMBERING );
        }

    rWrtSh.SetOutlineNumRule( *pNumRule );
    return RET_OK;
}

/* -----------------07.07.98 14:19-------------------
 *
 * --------------------------------------------------*/
SwOutlineSettingsTabPage::SwOutlineSettingsTabPage(Window* pParent, const SfxItemSet& rSet) :
    SfxTabPage(pParent, SW_RES(TP_OUTLINE_NUM), rSet),
    aLevelGB(       this, ResId(GB_LEVEL    )),
    aLevelLB(       this, ResId(LB_LEVEL    )),
    aPreviewGB(     this, ResId(GB_PREVIEW  )),
    aPreviewWIN(    this, ResId(WIN_PREVIEW )),
    aCollLbl(this, SW_RES(FT_COLL)),
    aCollBox(this, SW_RES(LB_COLL)),
    aNumberLbl(this, SW_RES(FT_NUMBER)),
    aNumberBox(this, SW_RES(LB_NUMBER)),
    aCharFmtFT(this, SW_RES(FT_CHARFMT)),
    aCharFmtLB(this, SW_RES(LB_CHARFMT)),
    aAllLevelFT(    this, ResId(FT_ALL_LEVEL)),
    aAllLevelNF(    this, ResId(NF_ALL_LEVEL)),
    aDelim(this, SW_RES(FT_DELIM)),
    aPrefixFT(this, SW_RES(FT_PREFIX)),
    aPrefixED(this, SW_RES(ED_PREFIX)),
    aSuffixFT(this, SW_RES(FT_SUFFIX)),
    aSuffixED(this, SW_RES(ED_SUFFIX)),
    aStartLbl(this, SW_RES(FT_START)),
    aStartEdit(this, SW_RES(ED_START)),
    aNumberGrp(this, SW_RES(GB_NUMBER)),
    aNoFmtName(SW_RES(ST_NO_COLL)),
    nActLevel(1),
    pCollNames(0),
    pSh(0)
{
    FreeResource();
    SetExchangeSupport();

    aCollBox.InsertEntry(aNoFmtName);
    aLevelLB.SetSelectHdl(LINK(this,    SwOutlineSettingsTabPage, LevelHdl));
    aAllLevelNF.SetModifyHdl(LINK(this, SwOutlineSettingsTabPage, ToggleComplete));
    aCollBox.SetSelectHdl(LINK(this,    SwOutlineSettingsTabPage, CollSelect));
    aCollBox.SetGetFocusHdl(LINK(this,  SwOutlineSettingsTabPage, CollSelectGetFocus));
    aNumberBox.SetSelectHdl(LINK(this,  SwOutlineSettingsTabPage, NumberSelect));
    aPrefixED.SetModifyHdl(LINK(this,   SwOutlineSettingsTabPage, DelimModify));
    aSuffixED.SetModifyHdl(LINK(this,   SwOutlineSettingsTabPage, DelimModify));
    aStartEdit.SetModifyHdl(LINK(this,  SwOutlineSettingsTabPage, StartModified));
    aCharFmtLB.SetSelectHdl(LINK(this,  SwOutlineSettingsTabPage, CharFmtHdl));
}
/* -----------------07.07.98 14:19-------------------
 *
 * --------------------------------------------------*/
void    SwOutlineSettingsTabPage::Update()
{
        // falls eine Vorlage fuer diese Ebene bereits selektiert wurde,
        // diese in der ListBox auswaehlean
    aCollBox.Enable(USHRT_MAX != nActLevel);
    if(USHRT_MAX == nActLevel)
    {
        BOOL bSamePrefix = TRUE;
        BOOL bSameSuffix = TRUE;
        BOOL bSameType = TRUE;
        BOOL bSameComplete = TRUE;
        BOOL bSameStart = TRUE;
        BOOL bSameCharFmt = TRUE;

        const SwNumFmt* aNumFmtArr[MAXLEVEL];
        const SwCharFmt* pFirstFmt = 0;

        for(USHORT i = 0; i < MAXLEVEL; i++)
        {

            aNumFmtArr[ i ] = &pNumRule->Get(i);
            if(i == 0)
                pFirstFmt = aNumFmtArr[i]->GetCharFmt();
            else
            {
                bSameType   &= aNumFmtArr[i]->eType == aNumFmtArr[0]->eType;
                bSameStart  &= aNumFmtArr[i]->GetStartValue() == aNumFmtArr[0]->GetStartValue();
                bSamePrefix &= aNumFmtArr[i]->GetPrefix() == aNumFmtArr[0]->GetPrefix();
                bSameSuffix &= aNumFmtArr[i]->GetPostfix() == aNumFmtArr[0]->GetPostfix();
                bSameComplete &= aNumFmtArr[i]->GetUpperLevel() == aNumFmtArr[0]->GetUpperLevel();
                const SwCharFmt* pFmt = aNumFmtArr[i]->GetCharFmt();
                bSameCharFmt &=     !pFirstFmt && !pFmt
                                    || pFirstFmt && pFmt && pFmt->GetName() == pFirstFmt->GetName();
            }
        }
        if(bSameType)
            aNumberBox.SelectEntryPos( GetNumPos( aNumFmtArr[0]->eType ));
        else
            aNumberBox.SetNoSelection();
        if(bSameStart)
            aStartEdit.SetValue(aNumFmtArr[0]->GetStartValue());
        else
            aStartEdit.SetText(aEmptyStr);
        if(bSamePrefix)
            aPrefixED.SetText(aNumFmtArr[0]->GetPrefix());
        else
            aPrefixED.SetText(aEmptyStr);
        if(bSameSuffix)
            aSuffixED.SetText(aNumFmtArr[0]->GetPostfix());
        else
            aSuffixED.SetText(aEmptyStr);

        if(bSameCharFmt)
        {
            if(pFirstFmt)
                aCharFmtLB.SelectEntry(pFirstFmt->GetName());
            else
                aCharFmtLB.SelectEntry( ViewShell::GetShellRes()->aStrNone );
        }
        else
            aCharFmtLB.SetNoSelection();

        aAllLevelNF.Enable(TRUE);
        aAllLevelNF.SetMax(MAXLEVEL);
        if(bSameComplete)
        {
            aAllLevelNF.SetValue(aNumFmtArr[0]->GetUpperLevel());
        }
        else
        {
            aAllLevelNF.SetText(aEmptyStr);
        }
    }
    else
    {
        USHORT nTmpLevel = lcl_BitToLevel(nActLevel);
        String aColl(pCollNames[nTmpLevel]);
        if(aColl.Len())
            aCollBox.SelectEntry(aColl);
        else
            aCollBox.SelectEntry(aNoFmtName);
        const SwNumFmt &rFmt = pNumRule->Get(nTmpLevel);
        aNumberBox.SelectEntryPos( GetNumPos( rFmt.eType ));
        aPrefixED.SetText(rFmt.GetPrefix());
        aSuffixED.SetText(rFmt.GetPostfix());
        const SwCharFmt* pFmt = rFmt.GetCharFmt();
        if(pFmt)
            aCharFmtLB.SelectEntry(pFmt->GetName());
        else
            aCharFmtLB.SelectEntry( ViewShell::GetShellRes()->aStrNone );

        if(nTmpLevel)
        {
            aAllLevelNF.Enable(TRUE);
            aAllLevelNF.SetMax(nTmpLevel + 1);
            aAllLevelNF.SetValue(rFmt.GetUpperLevel());
        }
        else
        {
            aAllLevelNF.SetText(aEmptyStr);
            aAllLevelNF.Enable(FALSE);
        }

        aStartEdit.SetValue( rFmt.GetStartValue() );
    }
    SetModified();
}

/* -----------------07.07.98 14:19-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK( SwOutlineSettingsTabPage, LevelHdl, ListBox *, pBox )
{
    nActLevel = 0;
    if(pBox->IsEntryPosSelected( MAXLEVEL ))
    {
        nActLevel = 0xFFFF;
    }
    else
    {
        USHORT nMask = 1;
        for( USHORT i = 0; i < MAXLEVEL; i++ )
        {
            if(pBox->IsEntryPosSelected( i ))
                nActLevel |= nMask;
            nMask <<= 1;
        }
    }
    Update();
    return 0;
}
/* -----------------07.07.98 14:19-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK( SwOutlineSettingsTabPage, ToggleComplete, NumericField *, pFld )
{
    USHORT nStart = 0;
    USHORT nEnd = MAXLEVEL;
    USHORT nMask = 1;
    for(USHORT i = 0; i < MAXLEVEL; i++)
    {
        if(nActLevel & nMask)
        {
            SwNumFmt aNumFmt(pNumRule->Get(i));
            aNumFmt.SetUpperLevel((BYTE) min(pFld->GetValue(), i + 1) );
            pNumRule->Set(i, aNumFmt);
        }
        nMask <<= 1;
    }
    SetModified();
    return 0;
}
/* -----------------07.07.98 14:19-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK( SwOutlineSettingsTabPage, CollSelect, ListBox *, pBox )
{
    BYTE i;

    const String aCollName(pBox->GetSelectEntry());
    //0xFFFF darf hier nicht sein (disable)
    USHORT nTmp = nActLevel;
    USHORT nTmpLevel = lcl_BitToLevel(nActLevel);
    String sOldName( pCollNames[nTmpLevel] );

    for( i = 0; i < MAXLEVEL; ++i)
        pCollNames[i] = aSaveCollNames[i];

    if(aCollName == aNoFmtName)
        pCollNames[nTmpLevel] = aEmptyStr;
    else
    {
        pCollNames[nTmpLevel] = aCollName;
                // wird die Vorlage bereits verwendet ?
        for( i = 0; i < MAXLEVEL; ++i)
            if(i != nTmpLevel && pCollNames[i] == aCollName )
                pCollNames[i] = aEmptyStr;
    }

    // search the oldname and put it into the current entries
    if( sOldName.Len() )
        for( i = 0; i < MAXLEVEL; ++i)
            if( aSaveCollNames[ i ] == sOldName && i != nTmpLevel &&
                !pCollNames[ i ].Len() )
            {
                BYTE n;
                for( n = 0; n < MAXLEVEL; ++n )
                    if( pCollNames[ n ] == sOldName )
                        break;

                if( MAXLEVEL == n )
                    // it was a outline leveld name and the current entries is zero.
                    pCollNames[ i ] = sOldName;
            }

    SetModified();
    return 0;
}

IMPL_LINK( SwOutlineSettingsTabPage, CollSelectGetFocus, ListBox *, pBox )
{
    for( BYTE i = 0; i < MAXLEVEL; ++i)
        aSaveCollNames[i] =  pCollNames[i];
    return 0;
}

/* -----------------07.07.98 14:19-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK( SwOutlineSettingsTabPage, NumberSelect, ListBox *, pBox )
{
    USHORT nStart = 0;
    USHORT nEnd = MAXLEVEL;
    USHORT nMask = 1;
    for(USHORT i = 0; i < MAXLEVEL; i++)
    {
        if(nActLevel & nMask)
        {
            SwNumFmt aNumFmt(pNumRule->Get(i));
            aNumFmt.eType = GetNumType( pBox->GetSelectEntryPos() );
            pNumRule->Set(i, aNumFmt);
        }
        nMask <<= 1;
    }
    SetModified();
    return 0;
}
/* -----------------07.07.98 14:19-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK( SwOutlineSettingsTabPage, DelimModify, Edit *, pEdt )
{
    USHORT nStart = 0;
    USHORT nEnd = MAXLEVEL;
    USHORT nMask = 1;
    for(USHORT i = 0; i < MAXLEVEL; i++)
    {
        if(nActLevel & nMask)
        {
            SwNumFmt aNumFmt(pNumRule->Get(i));
            aNumFmt.SetPrefix( aPrefixED.GetText() );
            aNumFmt.SetPostfix( aSuffixED.GetText() );
            pNumRule->Set(i, aNumFmt);
        }
        nMask <<= 1;
    }
    SetModified();
    return 0;
}
/* -----------------07.07.98 14:19-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK( SwOutlineSettingsTabPage, StartModified, NumericField *, pFld )
{
    USHORT nStart = 0;
    USHORT nEnd = MAXLEVEL;
    USHORT nMask = 1;
    for(USHORT i = 0; i < MAXLEVEL; i++)
    {
        if(nActLevel & nMask)
        {
            SwNumFmt aNumFmt(pNumRule->Get(i));
            aNumFmt.SetStartValue( (USHORT)pFld->GetValue() );
            pNumRule->Set(i, aNumFmt);
        }
        nMask <<= 1;
    }
//    SetModified();
    return 0;
}
/* -----------------21.09.98 12:21-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK( SwOutlineSettingsTabPage, CharFmtHdl, ListBox *, EMPTYARG )
{
//  bAutomaticCharStyles = FALSE;
    String sEntry = aCharFmtLB.GetSelectEntry();
    USHORT nMask = 1;
    BOOL bFormatNone = sEntry == ViewShell::GetShellRes()->aStrNone;
    SwCharFmt* pFmt = 0;
    if(!bFormatNone)
    {
        USHORT nChCount = pSh->GetCharFmtCount();
        for(USHORT i = 0; i < nChCount; i++)
        {
            SwCharFmt& rChFmt = pSh->GetCharFmt(i);
            if(rChFmt.GetName() == sEntry)
            {
                pFmt = &rChFmt;
                break;
            }
        }
        if(!pFmt)
        {
            SfxStyleSheetBasePool* pPool = pSh->GetView().GetDocShell()->GetStyleSheetPool();
            SfxStyleSheetBase* pBase;
            pBase = pPool->Find(sEntry, SFX_STYLE_FAMILY_CHAR);
            if(!pBase)
                pBase = &pPool->Make(sEntry, SFX_STYLE_FAMILY_PAGE);
            pFmt = ((SwDocStyleSheet*)pBase)->GetCharFmt();

        }
    }

    for(USHORT i = 0; i < MAXLEVEL; i++)
    {
        if(nActLevel & nMask)
        {
            SwNumFmt aNumFmt(pNumRule->Get(i));
            if(bFormatNone)
                aNumFmt.SetCharFmt(0);
            else
                aNumFmt.SetCharFmt(pFmt);
            pNumRule->Set(i, aNumFmt);
        }
        nMask <<= 1;
    }
//  SetModified(FALSE);
    return RET_OK;
}
/* -----------------07.07.98 14:19-------------------
 *
 * --------------------------------------------------*/
SwOutlineSettingsTabPage::~SwOutlineSettingsTabPage()
{
}
/* -----------------07.07.98 16:27-------------------
 *
 * --------------------------------------------------*/
void SwOutlineSettingsTabPage::SetWrtShell(SwWrtShell* pShell)
{
    pSh = pShell;
    // Erfragen der NumRules dieses Dokumentes
    pNumRule = ((SwOutlineTabDialog*)GetTabDialog())->GetNumRule();
    pCollNames = ((SwOutlineTabDialog*)GetTabDialog())->GetCollNames();

    //pNumRule = new SwNumRule( *rSh.GetOutlineNumRule() );

    aPreviewWIN.SetNumRule(pNumRule);
    aPreviewWIN.SetOutlineNames(pCollNames);
    // Startwert setzen - nActLevel muss hier 1 sein
    USHORT nTmpLevel = lcl_BitToLevel(nActLevel);
    const SwNumFmt& rNumFmt = pNumRule->Get( nTmpLevel );
    aStartEdit.SetValue( rNumFmt.GetStartValue() );

    // Poolformate fuer Ueberschriften anlegen
    String sStr;
    USHORT i;
    for( i = 0; i < MAXLEVEL; ++i )
    {
        aCollBox.InsertEntry( GetDocPoolNm( RES_POOLCOLL_HEADLINE1 + i, sStr ));
        aLevelLB.InsertEntry( String::CreateFromInt32(i + 1) );
    }
    sStr.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "1 - " ));
    sStr += String::CreateFromInt32(MAXLEVEL);
    aLevelLB.InsertEntry( sStr );

    // Erfragen der Gliederungsebenen der Textvorlagen
    const USHORT nCount = pSh->GetTxtFmtCollCount();
    for( i = 0; i < nCount; ++i )
    {
        SwTxtFmtColl &rTxtColl = pSh->GetTxtFmtColl(i);
        if(!rTxtColl.IsDefault())
        {
            BYTE nOutLevel = rTxtColl.GetOutlineLevel();
            sStr = rTxtColl.GetName();
            if(LISTBOX_ENTRY_NOTFOUND == aCollBox.GetEntryPos( sStr ))
                aCollBox.InsertEntry( sStr );
        }
    }

    aNumberBox.SelectEntryPos( GetNumPos( rNumFmt.eType ));
    USHORT nOutlinePos = pSh->GetOutlinePos(MAXLEVEL);
    USHORT nTmp = 0;
    if(nOutlinePos != USHRT_MAX)
    {
        nTmp = pSh->GetOutlineLevel(nOutlinePos);
    }
    aLevelLB.SelectEntryPos(nTmp);

    // Zeichenvorlagen sammeln
    aCharFmtLB.Clear();
    aCharFmtLB.InsertEntry( ViewShell::GetShellRes()->aStrNone );

    // Zeichenvorlagen
    ::FillCharStyleListBox(aCharFmtLB,
                        pSh->GetView().GetDocShell());
    Update();
}
/* -----------------07.07.98 14:19-------------------
 *
 * --------------------------------------------------*/
void    SwOutlineSettingsTabPage::ActivatePage(const SfxItemSet& rSet)
{
    nActLevel = ((SwOutlineTabDialog*)GetTabDialog())->GetActNumLevel();
    if(nActLevel != USHRT_MAX)
        aLevelLB.SelectEntryPos(lcl_BitToLevel(nActLevel));
    else
        aLevelLB.SelectEntryPos(MAXLEVEL);
    LevelHdl(&aLevelLB);
}
/* -----------------07.07.98 14:19-------------------
 *
 * --------------------------------------------------*/
int     SwOutlineSettingsTabPage::DeactivatePage(SfxItemSet *pSet)
{
    ((SwOutlineTabDialog*)GetTabDialog())->SetActNumLevel(nActLevel);
    return LEAVE_PAGE;
}
/* -----------------07.07.98 14:19-------------------
 *
 * --------------------------------------------------*/
BOOL    SwOutlineSettingsTabPage::FillItemSet( SfxItemSet& rSet )
{
    return TRUE;
}
/* -----------------07.07.98 14:19-------------------
 *
 * --------------------------------------------------*/
void    SwOutlineSettingsTabPage::Reset( const SfxItemSet& rSet )
{
    ActivatePage(rSet);
}
/* -----------------07.07.98 14:19-------------------
 *
 * --------------------------------------------------*/
SfxTabPage* SwOutlineSettingsTabPage::Create( Window* pParent,
                                const SfxItemSet& rAttrSet)
{
    return new SwOutlineSettingsTabPage(pParent, rAttrSet);
}

/*-----------------09.12.97 11:54-------------------

--------------------------------------------------*/
USHORT lcl_DrawBullet(VirtualDevice* pVDev,
            const SwNumFmt& rFmt, USHORT nXStart,
            USHORT nYStart, const Size& rSize)
{
    Font aTmpFont(pVDev->GetFont());

    Font aFont(*rFmt.GetBulletFont());
    aFont.SetSize(rSize);
    aFont.SetTransparent(TRUE);
    pVDev->SetFont( aFont );
    String aText(rFmt.GetBulletChar());
    pVDev->DrawText( Point(nXStart, nYStart), aText );
    USHORT nRet = (USHORT)pVDev->GetTextWidth(aText);

    pVDev->SetFont(aTmpFont);
    return nRet;
}
/*-----------------09.12.97 11:49-------------------

--------------------------------------------------*/
USHORT lcl_DrawGraphic(VirtualDevice* pVDev, const SwNumFmt &rFmt, USHORT nXStart,
                        USHORT nYStart, USHORT nDivision)
{
    const SvxBrushItem* pBrushItem = rFmt.GetGrfBrush();
    USHORT nRet = 0;
    if(pBrushItem)
    {
        const Graphic* pGrf = pBrushItem->GetGraphic();
        if(pGrf)
        {
            Size aGSize( rFmt.GetGrfSize() );
            aGSize.Width() /= nDivision;
            nRet = (USHORT)aGSize.Width();
            aGSize.Height() /= nDivision;
            pGrf->Draw( pVDev, Point(nXStart,nYStart),
                    pVDev->PixelToLogic( aGSize ) );
        }
    }
    return nRet;

}
/*-----------------02.12.97 10:34-------------------
    Vorschau der Numerierung painten
--------------------------------------------------*/
void    NumberingPreview::Paint( const Rectangle& rRect )
{
    Size aSize(PixelToLogic(GetOutputSizePixel()));
    Rectangle aRect(Point(0,0), aSize);

    VirtualDevice* pVDev = new VirtualDevice(*this);
    pVDev->SetMapMode(GetMapMode());
    pVDev->SetOutputSize( aSize );


    pVDev->SetFillColor( Color( COL_WHITE ) );
    pVDev->DrawRect(aRect);

    if(pActNum)
    {
        USHORT nWidthRelation;
        if(nPageWidth)
        {
            nWidthRelation = USHORT (nPageWidth / aSize.Width());
            if(bPosition)
                nWidthRelation = nWidthRelation * 2 / 3;
            else
                nWidthRelation = nWidthRelation / 4;
        }
        else
            nWidthRelation = 30; // Kapiteldialog

        //Hoehe pro Ebene
        USHORT nXStep = aSize.Width() / (3 * MAXLEVEL);
        if(MAXLEVEL < 10)
            nXStep /= 2;
        USHORT nYStart = 4;
        USHORT nYStep = (aSize.Height() - 6)/ MAXLEVEL;
//      USHORT nLineHeight = nYStep * 8 / 10;
        aStdFont = System::GetStandardFont(STDFONT_SWISS);

        //
        USHORT nFontHeight = nYStep * 6 / 10;
        if(bPosition)
            nFontHeight = nYStep * 15 / 10;
        aStdFont.SetSize(Size( 0, nFontHeight ));

        SwNodeNum aNum( (BYTE)0 );
        USHORT nPreNum = pActNum->Get(0).GetStartValue();

        if(bPosition)
        {
            USHORT nLineHeight = nFontHeight * 8 / 7;
            BYTE nStart = 0;
            while( !(nActLevel & (1<<nStart)) )
            {
                nStart++;
            }
            if(nStart) // damit moeglichs Vorgaenger und Nachfolger gezeigt werden
                nStart--;
            BYTE nEnd = min(nStart + 3, MAXLEVEL);
            for( BYTE nLevel = nStart; nLevel < nEnd; ++nLevel )
            {
                const SwNumFmt &rFmt = pActNum->Get(nLevel);
                aNum.GetLevelVal()[ nLevel ] = rFmt.GetStartValue();
                USHORT nXStart = rFmt.GetAbsLSpace() / nWidthRelation;
                USHORT nTextOffset = rFmt.GetCharTextOffset() / nWidthRelation;
                USHORT nNumberXPos = nXStart;
                USHORT nFirstLineOffset = (-rFmt.GetFirstLineOffset()) / nWidthRelation;

                if(nFirstLineOffset <= nNumberXPos)
                    nNumberXPos -= nFirstLineOffset;
                else
                    nNumberXPos = 0;

                USHORT nBulletWidth = 0;
                if( SVX_NUM_BITMAP == rFmt.eType )
                {
                    nBulletWidth = lcl_DrawGraphic(pVDev, rFmt,
                                        nNumberXPos,
                                            nYStart, nWidthRelation);
                }
                else if( SVX_NUM_CHAR_SPECIAL == rFmt.eType )
                {
                    nBulletWidth =  lcl_DrawBullet(pVDev, rFmt, nNumberXPos, nYStart, aStdFont.GetSize());
                }
                else
                {
                    pVDev->SetFont(aStdFont);
                    aNum.SetLevel( nLevel );
                    if(pActNum->IsContinusNum())
                        aNum.GetLevelVal()[nLevel] = nPreNum;
                    String aText(pActNum->MakeNumString( aNum ));
                    pVDev->DrawText( Point(nNumberXPos, nYStart), aText );
                    nBulletWidth = (USHORT)pVDev->GetTextWidth(aText);
                    nPreNum++;
                }
                USHORT nTextXPos = nXStart;
                if(nNumberXPos + nBulletWidth + nTextOffset > nTextXPos )
                    nTextXPos = nNumberXPos + nBulletWidth + nTextOffset;
                Rectangle aRect1(Point(nTextXPos, nYStart + nFontHeight / 2), Size(aSize.Width() / 2, 2));
                pVDev->SetFillColor( Color( COL_BLACK ) );
                pVDev->DrawRect( aRect1 );

                Rectangle aRect2(Point(nXStart, nYStart + nLineHeight + nFontHeight / 2 ), Size(aSize.Width() / 2, 2));
                pVDev->DrawRect( aRect2 );
                nYStart += 2 * nLineHeight;
            }
        }
        else
        {
            USHORT nLineHeight = nFontHeight * 3 / 2;
            for( BYTE nLevel = 0; nLevel < MAXLEVEL;
                            ++nLevel, nYStart += nYStep )
            {
                const SwNumFmt &rFmt = pActNum->Get(nLevel);
                aNum.GetLevelVal()[ nLevel ] = rFmt.GetStartValue();
                USHORT nXStart = (rFmt.GetAbsLSpace() / nWidthRelation) / 2 + 2;
                USHORT nTextOffset = 2 * nXStep;
                if( SVX_NUM_BITMAP == rFmt.eType )
                {
                    lcl_DrawGraphic(pVDev, rFmt, nXStart, nYStart, nWidthRelation);
                    nTextOffset = nLineHeight + nXStep;
                }
                else if( SVX_NUM_CHAR_SPECIAL == rFmt.eType )
                {
//                  aNum.GetLevelVal()[ nLevel ] = 0;
                    nTextOffset =  lcl_DrawBullet(pVDev, rFmt, nXStart, nYStart, aStdFont.GetSize());
                    nTextOffset += nXStep;
                }
                else
                {
                    pVDev->SetFont(aStdFont);
                    aNum.SetLevel( nLevel );
                    if(pActNum->IsContinusNum())
                        aNum.GetLevelVal()[nLevel] = nPreNum;
                    String aText(pActNum->MakeNumString( aNum ));
                    pVDev->DrawText( Point(nXStart, nYStart), aText );
                    nTextOffset = (USHORT)pVDev->GetTextWidth(aText);
                    nTextOffset += nXStep;
                    nPreNum++;
                }
                pVDev->SetFont(aStdFont);
                String sMsg(C2S("StarOffice"));
                if(pOutlineNames)
                    sMsg = pOutlineNames[nLevel];
                pVDev->DrawText( Point(nXStart + nTextOffset, nYStart), sMsg );
            }
        }
    }
    DrawOutDev( Point(0,0), aSize,
                Point(0,0), aSize,
                        *pVDev );
    delete pVDev;

}

/*-----------------02.12.97 10:34-------------------

--------------------------------------------------*/
NumberingPreview::~NumberingPreview()
{
}



/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.105  2000/09/18 16:05:58  willem.vandorp
    OpenOffice header added.

    Revision 1.104  2000/07/26 12:03:33  jp
    OkHdl: don't use invalid PoolIds

    Revision 1.103  2000/07/25 10:40:29  jp
    Bug #76772#,#76774#: don't remove all selected templates from the preview, LoadNameRules must set the outline type

    Revision 1.102  2000/07/03 08:54:11  jp
    must changes for VCL

    Revision 1.101  2000/06/13 14:11:58  os
    #74049# save outline numbering form to the first empty position

    Revision 1.100  2000/05/23 19:22:39  jp
    Bugfixes for Unicode

    Revision 1.99  2000/04/26 14:55:46  os
    GetName() returns const String&

    Revision 1.98  2000/04/18 15:08:17  os
    UNICODE

    Revision 1.97  2000/03/14 09:32:31  os
    #74039# outline assignment corrected

    Revision 1.96  2000/03/03 15:17:02  os
    StarView remainders removed

    Revision 1.95  2000/02/11 14:56:40  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.94  1999/01/06 14:04:56  OS
    #58643# Positionsbeispiel berichtigt


      Rev 1.93   06 Jan 1999 15:04:56   OS
   #58643# Positionsbeispiel berichtigt

      Rev 1.92   18 Nov 1998 08:35:04   OS
   #58263# Numerierung in den Svx - Reste

      Rev 1.91   17 Nov 1998 10:57:52   OS
   #58263# NumType durch SvxExtNumType ersetzt

      Rev 1.90   10 Nov 1998 16:03:34   OS
   #58201# HelpId fuer Form-Button

      Rev 1.89   09 Nov 1998 14:03:04   AWO
   Inlcudes hinzugefuegt

      Rev 1.88   06 Nov 1998 14:10:00   OS
   #45264# Outline-Ebenen nicht fuer index-ebenen

      Rev 1.87   21 Sep 1998 15:31:30   OS
   #56738# Zeichenvorlage fuer Kapitelnumerierung einstellbar

      Rev 1.86   06 Aug 1998 21:42:08   JP
   Bug #54796#: neue NumerierungsTypen (WW97 kompatibel)

      Rev 1.85   18 Jul 1998 14:50:52   OS
   richtige Ebenenanzahl fuer vollst. Numerierung #53233#

      Rev 1.84   09 Jul 1998 14:03:06   OS
   Kapitelnumerierung jetzt TabDialog

      Rev 1.83   01 Apr 1998 15:15:22   OS
   Beispielhintergrund zuruecksetzen #49133#

      Rev 1.82   26 Feb 1998 17:07:34   OS
   keins->keine #47632#

      Rev 1.81   24 Feb 1998 15:44:48   OS
   Ausrichtung berichtigt #47417#

      Rev 1.80   08 Dec 1997 11:53:30   OS
   benannte Numerierungen entfernt

      Rev 1.79   05 Dec 1997 16:50:56   OS
   Numerierungsumbau

      Rev 1.78   05 Dec 1997 10:42:50   OS
   Numerierungsumbau

      Rev 1.77   04 Dec 1997 16:57:20   OS
   Numerierungsumbau

      Rev 1.76   24 Nov 1997 16:47:44   MA
   includes

      Rev 1.75   17 Nov 1997 10:20:58   JP
   Umstellung Numerierung

      Rev 1.74   03 Nov 1997 13:22:42   MA
   precomp entfernt

      Rev 1.73   09 Oct 1997 08:48:32   OS
   Beispieltexte nur noch setzen, wenn sie sich veraendert wurden #44493#

      Rev 1.72   08 Aug 1997 17:28:08   OM
   Headerfile-Umstellung

      Rev 1.71   31 Jul 1997 15:22:06   MH
   chg: header

      Rev 1.70   08 Jul 1997 14:09:44   OS
   ConfigItems von der App ans Module

      Rev 1.69   01 Jul 1997 09:49:52   OS
   Erweiterung auf neun Formen

      Rev 1.68   09 Jan 1997 18:49:44   OS
   gfs. aktuelle Ebene selektieren

      Rev 1.67   11 Dec 1996 10:27:02   MA
   Warnings

      Rev 1.66   11 Nov 1996 11:05:44   MA
   ResMgr

      Rev 1.65   02 Oct 1996 18:29:00   MA
   Umstellung Enable/Disable

      Rev 1.64   28 Aug 1996 14:12:18   OS
   includes

      Rev 1.63   20 Aug 1996 16:22:50   OS
   Handler zusammengefasst, timeouthdl vor Levelumschaltung rufen

      Rev 1.62   22 Jul 1996 20:54:02   JP
   Anpassung an die neuen SwUiNumRules

      Rev 1.61   19 Jul 1996 15:32:32   JP
   Umstellung Numerierung

      Rev 1.60   21 Mar 1996 10:46:00   MA
   Umstellung SV311

      Rev 1.59   19 Feb 1996 12:33:28   JP
   MakeNumString kann den Post-/Prefix-String per Flag selbst zufuegen

      Rev 1.58   06 Feb 1996 15:21:12   JP
   Link Umstellung 305

      Rev 1.57   01 Feb 1996 11:45:58   mk
   SINIX

      Rev 1.56   03 Jan 1996 11:07:56   OS
   Format fuer Kapitelnumerierung kann jetzt gespeichert werden

      Rev 1.55   24 Nov 1995 16:58:48   OM
   PCH->PRECOMPILED

      Rev 1.54   13 Nov 1995 10:51:34   OM
   static entfernt

------------------------------------------------------------------------*/

diff --git a/sw/source/ui/misc/outline.hrc b/sw/source/ui/misc/outline.hrc
new file mode 100644
index 0000000..2e7f639
--- /dev/null
+++ b/sw/source/ui/misc/outline.hrc
@@ -0,0 +1,133 @@
/*************************************************************************
 *
 *  $RCSfile: outline.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:45 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#define RB_1            1
#define RB_2            2
#define RB_3            3
#define RB_4            4
#define RB_5            5
#define FT_1            6
#define FT_2            7
#define FT_3            8
#define FT_4            9
#define FT_5            10
#define FI_1            11
#define FI_2            12
#define FI_3            13
#define FI_4            14
#define FI_5            15
//#define GB_LEVEL        16

#define FT_COLL         20
#define LB_COLL         21
#define FT_NUMBER       22
#define LB_NUMBER       23
#define FT_DELIM        24
#define FT_DELIM_BEVOR  25
#define FT_DELIM_AFTER  26
#define ED_DELIM_BEVOR  27
#define ED_DELIM_AFTER  28
#define CB_COMPLETE     29
#define GB_NUMBER       30

#define LB_ALIGN        31
#define GB_ALIGN        33

#define FT_START        40
#define ED_START        41
#define GB_START        42

#define BT_OK           100
#define BT_CANCEL       101
#define BT_HELP         102
#define BT_FORM         103
#define BT_RESET        104
#define GB_FORM         105
#define LB_FORM         106
#define ED_FORM         107
#define FT_ALL_LEVEL    108
#define NF_ALL_LEVEL    109

#define MN_FORM     110
#define MN_FORM1        111
#define MN_FORMBASE     MN_FORM1
#define MN_FORM2        112
#define MN_FORM3        113
#define MN_FORM4        114
#define MN_FORM5        115
#define MN_FORM6        116
#define MN_FORM7        117
#define MN_FORM8        118
#define MN_FORM9        119
#define MN_SAVE         120

#define GB_LEVEL        130
#define LB_LEVEL        131
#define WIN_PREVIEW     132
#define GB_PREVIEW      133
#define FT_SUFFIX       134
#define ED_SUFFIX       135
#define FT_PREFIX       136
#define ED_PREFIX       137
#define ST_NO_COLL      138

#define ST_FORM         140
#define FT_CHARFMT      141
#define LB_CHARFMT      141
diff --git a/sw/source/ui/misc/outline.src b/sw/source/ui/misc/outline.src
new file mode 100644
index 0000000..dd91b65
--- /dev/null
+++ b/sw/source/ui/misc/outline.src
@@ -0,0 +1,1506 @@
/*************************************************************************
 *
 *  $RCSfile: outline.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:45 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "misc.hrc"
#include "outline.hrc"
#include "globals.hrc"
#include "cmdid.h"
#include "helpid.h"
ModalDialog DLG_NUM_NAMES
{
    HelpID = HID_NUM_NAMES ;
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 164 , 82 ) ;
    Text= "Speichern als";
    Text[ italian ] = "Salva con nome";
    Text[ portuguese_brazilian ] = "Gravar como";
    Text[ portuguese ] = "Guardar como";
    Text[ danish ] = "Ge~m som";
    Text[ french ] = "Enregistrer sous";
    Text[ swedish ] = "Spara som";
    Text[ dutch ] = "Opslaan als";
    Text[ spanish ] = "Guardar como";
    Text[ english_us ] = "Save As";
    Text[ chinese_simplified ] = "Áí´æÎª";
    Text[ russian ] = "Ñîõðàíèòü êàê";
    Text[ polish ] = "Zapisz jako";
    Text[ japanese ] = "–¼‘O‚ð•t‚¯‚ĕۑ¶";
    Text[ chinese_traditional ] = "¥t¦s·sÀÉ";
    Text[ arabic ] = "ÍÝÙ ßÜ";
    Text = "Speichern als" ;
    Text [ ENGLISH ] = "Save as" ;
    Moveable = TRUE ;
    OKButton BT_OK
    {
        Pos = MAP_APPFONT ( 108 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        DefButton = TRUE ;
    };
    CancelButton BT_CANCEL
    {
        Pos = MAP_APPFONT ( 108 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    HelpButton BT_HELP
    {
        Pos = MAP_APPFONT ( 108 , 43 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    GroupBox GB_FORM
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 96 , 73 ) ;
        Text = "Form" ;
        Text [ ENGLISH ] = "Form" ;
        Text [ english_us ] = "Format" ;
        Text [ swedish ] = "Format" ;
        Text [ danish ] = "Form" ;
        Text [ italian ] = "Forma" ;
        Text [ spanish ] = "Forma" ;
        Text [ french ] = "Format" ;
        Text [ dutch ] = "Vorm" ;
        Text [ portuguese_brazilian ] = "Form" ;
        Text [ portuguese ] = "Formato" ;
        Text[ chinese_simplified ] = "¸ñʽ";
        Text[ russian ] = "Ôîðìàò";
        Text[ polish ] = "Format";
        Text[ japanese ] = "Ì«°Ñ";
        Text[ language_user1 ] = " ";
        Text[ chinese_traditional ] = "ªí®æ";
        Text[ arabic ] = "ÇáÊäÓíÞ";
        Text[ greek ] = "ÌïñöÞ";
        Text[ korean ] = "¼­½Ä";
        Text[ turkish ] = "Format";
    };
    ListBox LB_FORM
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 12 , 29 ) ;
        Size = MAP_APPFONT ( 84 , 42 ) ;
        TabStop = TRUE ;
        CurPos = 0 ;
        StringList =
        {
            < "Unbenannt 1" ; > ;
            < "Unbenannt 2" ; > ;
            < "Unbenannt 3" ; > ;
            < "Unbenannt 4" ; > ;
            < "Unbenannt 5" ; > ;
            < "Unbenannt 6" ; > ;
            < "Unbenannt 7" ; > ;
            < "Unbenannt 8" ; > ;
            < "Unbenannt 9" ; > ;
        };
        StringList [ ENGLISH ] =
        {
            < "Unbenannt 1" ; > ;
            < "Unbenannt 2" ; > ;
            < "Unbenannt 3" ; > ;
            < "Unbenannt 4" ; > ;
            < "Unbenannt 5" ; > ;
            < "Unbenannt 6" ; > ;
            < "Unbenannt 7" ; > ;
            < "Unbenannt 8" ; > ;
            < "Unbenannt 9" ; > ;
        };
        stringlist [ english_us ] =
        {
            < "Untitled 1" ; > ;
            < "Untitled 2" ; > ;
            < "Untitled 3" ; > ;
            < "Untitled 4" ; > ;
            < "Untitled 5" ; > ;
            < "Untitled 6" ; > ;
            < "Untitled 7" ; > ;
            < "Untitled 8" ; > ;
            < "Untitled 9" ; > ;
        };
        stringlist [ swedish ] =
        {
            < "Namnlös 1" ; > ;
            < "Namnlös 2" ; > ;
            < "Namnlös 3" ; > ;
            < "Namnlös 4" ; > ;
            < "Namnlös 5" ; > ;
            < "Namnlös 6" ; > ;
            < "Namnlös 7" ; > ;
            < "Namnlös 8" ; > ;
            < "Namnlös 9" ; > ;
        };
        stringlist [ danish ] =
        {
            < "Ikke-navngivet 1" ; > ;
            < "Ikke-navngivet 2" ; > ;
            < "Ikke-navngivet 3" ; > ;
            < "Ikke-navngivet 4" ; > ;
            < "Ikke-navngivet 5" ; > ;
            < "Ikke-navngivet 6" ; > ;
            < "Ikke-navngivet 7" ; > ;
            < "Ikke-navngivet 8" ; > ;
            < "Ikke-navngivet 9" ; > ;
        };
        stringlist [ italian ] =
        {
            < "Senza nome 1" ; > ;
            < "Senza nome 2" ; > ;
            < "Senza nome 3" ; > ;
            < "Senza nome 4" ; > ;
            < "Senza nome 5" ; > ;
            < "Senza nome 6" ; > ;
            < "Senza nome 7" ; > ;
            < "Senza nome 8" ; > ;
            < "Senza nome 9" ; > ;
        };
        stringlist [ spanish ] =
        {
            < "Sin nombre 1" ; > ;
            < "Sin nombre 2" ; > ;
            < "Sin nombre 3" ; > ;
            < "Sin nombre 4" ; > ;
            < "Sin nombre 5" ; > ;
            < "Sin nombre 6" ; > ;
            < "Sin nombre 7" ; > ;
            < "Sin nombre 8" ; > ;
            < "Sin nombre 9" ; > ;
        };
        stringlist [ french ] =
        {
            < "Sans nom 1" ; > ;
            < "Sans nom 2" ; > ;
            < "Sans nom 3" ; > ;
            < "Sans nom 4" ; > ;
            < "Sans nom 5" ; > ;
            < "Sans nom 6" ; > ;
            < "Sans nom 7" ; > ;
            < "Sans nom 8" ; > ;
            < "Sans nom 9" ; > ;
        };
        stringlist [ dutch ] =
        {
            < "Naamloos 1" ; > ;
            < "Naamloos 2" ; > ;
            < "Naamloos 3" ; > ;
            < "Naamloos 4" ; > ;
            < "Naamloos 5" ; > ;
            < "Naamloos 6" ; > ;
            < "Naamloos 7" ; > ;
            < "Naamloos 8" ; > ;
            < "Naamloos 9" ; > ;
        };
        stringlist [ portuguese ] =
        {
            < "Sem nome 1" ; > ;
            < "Sem nome 2" ; > ;
            < "Sem nome 3" ; > ;
            < "Sem nome 4" ; > ;
            < "Sem nome 5" ; > ;
            < "Sem nome 6" ; > ;
            < "Sem nome 7" ; > ;
            < "Sem nome 8" ; > ;
            < "Sem nome 9" ; > ;
        };
        stringlist [ portuguese_brazilian ] =
        {
            < "Unbenannt 1" ; > ;
            < "Unbenannt 2" ; > ;
            < "Unbenannt 3" ; > ;
            < "Unbenannt 4" ; > ;
            < "Unbenannt 5" ; > ;
            < "Unbenannt 6" ; > ;
            < "Unbenannt 7" ; > ;
            < "Unbenannt 8" ; > ;
            < "Unbenannt 9" ; > ;
        };
    StringList [ chinese_simplified ] =
    {
            < "δÃüÃû 1" ; > ;
        < "δÃüÃû 2" ; > ;
        < "δÃüÃû 3" ; > ;
        < "δÃüÃû 4" ; > ;
        < "δÃüÃû 5" ; > ;
        < "δÃüÃû 6" ; > ;
        < "δÃüÃû 7" ; > ;
        < "δÃüÃû 8" ; > ;
        < "δÃüÃû 9" ; > ;
    };
    StringList [ russian ] =
    {
            < "Áåç èìåíè 1" ; > ;
        < "Áåç èìåíè 2" ; > ;
        < "Áåç èìåíè 3" ; > ;
        < "Áåç èìåíè 4" ; > ;
        < "Áåç èìåíè 5" ; > ;
        < "Áåç èìåíè 6" ; > ;
        < "Áåç èìåíè 7" ; > ;
        < "Áåç èìåíè 8" ; > ;
        < "Áåç èìåíè 9" ; > ;
    };
    StringList [ polish ] =
    {
            < "Bez nazwy 1" ; > ;
        < "Bez nazwy 2" ; > ;
        < "Bez nazwy 3" ; > ;
        < "Bez nazwy 4" ; > ;
        < "Bez nazwy 5" ; > ;
        < "Bez nazwy 6" ; > ;
        < "Bez nazwy 7" ; > ;
        < "Bez nazwy 8" ; > ;
        < "Bez nazwy 9" ; > ;
    };
    StringList [ japanese ] =
    {
            < "–³‘è 1" ; > ;
        < "–³‘è 2" ; > ;
        < "–³‘è 3" ; > ;
        < "–³‘è 4" ; > ;
        < "–³‘è 5" ; > ;
        < "–³‘è 6" ; > ;
        < "–³‘è 7" ; > ;
        < "–³‘è 8" ; > ;
        < "–³‘è 9" ; > ;
    };
    StringList [ chinese_traditional ] =
    {
            < "¥¼©R¦W 1" ; > ;
        < "¥¼©R¦W 2" ; > ;
        < "¥¼©R¦W 3" ; > ;
        < "¥¼©R¦W 4" ; > ;
        < "¥¼©R¦W 5" ; > ;
        < "¥¼©R¦W 6" ; > ;
        < "¥¼©R¦W 7" ; > ;
        < "¥¼©R¦W 8" ; > ;
        < "¥¼©R¦W 9" ; > ;
    };
    StringList [ arabic ] =
    {
            < "ÈÏæä ÚäæÇä 1" ; > ;
        < "ÈÏæä ÚäæÇä 2" ; > ;
        < "ÈÏæä ÚäæÇä 3" ; > ;
        < "ÈÏæä ÚäæÇä 4" ; > ;
        < "ÈÏæä ÚäæÇä 5" ; > ;
        < "ÈÏæä ÚäæÇä 6" ; > ;
        < "ÈÏæä ÚäæÇä 7" ; > ;
        < "ÈÏæä ÚäæÇä 8" ; > ;
        < "ÈÏæä ÚäæÇä 9" ; > ;
    };
    StringList [ greek ] =
    {
            < "Äß÷ùò üíïìá 1" ; > ;
        < "Äß÷ùò üíïìá 2" ; > ;
        < "Äß÷ùò üíïìá 3" ; > ;
        < "Äß÷ùò üíïìá 4" ; > ;
        < "Äß÷ùò üíïìá 5" ; > ;
        < "Äß÷ùò üíïìá 6" ; > ;
        < "Äß÷ùò üíïìá 7" ; > ;
        < "Äß÷ùò üíïìá 8" ; > ;
        < "Äß÷ùò üíïìá 9" ; > ;
    };
    StringList [ korean ] =
    {
            < "Á¦¸ñ¾øÀ½ 1" ; > ;
        < "Á¦¸ñ¾øÀ½2" ; > ;
        < "Á¦¸ñ¾øÀ½3" ; > ;
        < "Á¦¸ñ¾øÀ½4" ; > ;
        < "Á¦¸ñ¾øÀ½5" ; > ;
        < "Á¦¸ñ¾øÀ½6" ; > ;
        < "Á¦¸ñ¾øÀ½7" ; > ;
        < "Á¦¸ñ¾øÀ½8" ; > ;
        < "Á¦¸ñ¾øÀ½9" ; > ;
    };
    StringList [ turkish ] =
    {
            < "Adsýz 1" ; > ;
        < "Adsýz 2" ; > ;
        < "Adsýz 3" ; > ;
        < "Adsýz 4" ; > ;
        < "Adsýz 5" ; > ;
        < "Adsýz 6" ; > ;
        < "Adsýz 7" ; > ;
        < "Adsýz 8" ; > ;
        < "Adsýz 9" ; > ;
    };
    StringList [ language_user1 ] =
    {
            < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
        < " " ; > ;
    };
    };
    Edit ED_FORM
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 12 , 14 ) ;
        Size = MAP_APPFONT ( 84 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
    };
    Text = "Speichern als" ;
    Text[ greek ] = "ÁðïèÞêåõóç ùò";
    Text[ korean ] = "´Ù¸¥ À̸§À¸·Î ÀúÀå";
    Text[ turkish ] = "Farklý kaydet...";
    Text[ language_user1 ] = " ";
};
/**************************************************************************/
/*                                                                        */
/*                                                                        */
/*                                                                        */
/**************************************************************************/
TabDialog DLG_TAB_OUTLINE
{
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Text = "Kapitelnummerierung" ;
    Text [ ENGLISH ] = "Outline Numbering" ;
    Text [ norwegian ] = "Outline Numbering" ;
    Text [ italian ] = "Numerazione capitolo" ;
    Text [ portuguese_brazilian ] = "Numeração Vazada" ;
    Text [ portuguese ] = "Numeração de capítulos" ;
    Text [ finnish ] = "Jäsennysnumerointi" ;
    Text [ danish ] = "Kapitelnummerering" ;
    Text [ french ] = "Numérotation de chapitres" ;
    Text [ swedish ] = "Kapitelnumrering" ;
    Text [ dutch ] = "Hoofdstuknummering" ;
    Text [ spanish ] = "Numeración de capítulos" ;
    Text [ english_us ] = "Outline Numbering" ;
    Moveable = TRUE ;
    TabControl 1
    {
        SVLook = TRUE ;
        PageList =
        {
            PageItem
            {
                Identifier = TP_OUTLINE_NUM ;
                Text = "Nummerierung" ;
                Text [ ENGLISH ] = "Numbering" ;
                Text [ english_us ] = "Numbering" ;
                Text [ portuguese_brazilian ] = "Numerierung" ;
                Text [ swedish ] = "Numrering" ;
                Text [ danish ] = "Nummerering" ;
                Text [ italian ] = "Numerazione" ;
                Text [ spanish ] = "Numeración" ;
                Text [ french ] = "Numérotation" ;
                Text [ dutch ] = "Nummering" ;
                Text [ portuguese ] = "Numeração" ;
                Text[ chinese_simplified ] = "񅧏";
                Text[ russian ] = "Íóìåðàöèÿ";
                Text[ polish ] = "Numeracja";
                Text[ japanese ] = "”ԍ†•t‚¯";
                Text[ chinese_traditional ] = "½s¸¹";
                Text[ arabic ] = "ÇáÊÑÞíã";
                Text[ greek ] = "Áñßèìçóç";
                Text[ korean ] = "¹øÈ£ ¸Å±â±â";
                Text[ turkish ] = "Numaralama";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_NUM_POSITION ;
                Text = "Position" ;
                Text [ ENGLISH ] = "Position" ;
                Text [ english_us ] = "Position" ;
                Text [ portuguese_brazilian ] = "Position" ;
                Text [ swedish ] = "Position" ;
                Text [ danish ] = "Placering" ;
                Text [ italian ] = "Posizione" ;
                Text [ spanish ] = "Posición" ;
                Text [ french ] = "Position" ;
                Text [ dutch ] = "Positie" ;
                Text [ portuguese ] = "Posição" ;
                Text[ chinese_simplified ] = "λÖÃ";
                Text[ russian ] = "Ïîçèöèÿ";
                Text[ polish ] = "Pozycja";
                Text[ japanese ] = "ˆÊ’u";
                Text[ chinese_traditional ] = "¦ì¸m";
                Text[ arabic ] = "ÇáãæÞÚ";
                Text[ greek ] = "ÈÝóç";
                Text[ korean ] = "À§Ä¡";
                Text[ turkish ] = "Konum";
                Text[ language_user1 ] = " ";
            };
        };
    };
    String ST_FORM
    {
        Text = "~Form" ;
        Text [ ENGLISH ] = "T~ype" ;
        Text [ english_us ] = "~Format" ;
        Text [ italian ] = "~Forma" ;
        Text [ spanish ] = "~Forma" ;
        Text [ french ] = "Format" ;
        Text [ dutch ] = "~Vorm" ;
        Text [ swedish ] = "~Format" ;
        Text [ danish ] = "Format" ;
        Text [ portuguese_brazilian ] = "~Form" ;
        Text [ portuguese ] = "Forma~to" ;
        Text[ chinese_simplified ] = "¸ñʽ(~F)";
        Text[ russian ] = "Ôîðìàò";
        Text[ polish ] = "Format";
        Text[ japanese ] = "Ì«°Ñ(~F)";
        Text[ language_user1 ] = " ";
        Text[ chinese_traditional ] = "ªí®æ(~F)";
        Text[ arabic ] = "ÇáÊäÓíÞ";
        Text[ greek ] = "Ìïñ~öÞ";
        Text[ korean ] = "¼­½Ä(~F)";
        Text[ turkish ] = "Format";
    };
    Menu MN_FORM
    {
        ItemList =
        {
            MenuItem
            {
                Identifier = MN_FORM1 ;
                Text = "Unbenannt 1" ;
                Text [ ENGLISH ] = "Noname 1" ;
                Text [ norwegian ] = "+++Noname 1" ;
                Text [ italian ] = "Senza nome 1" ;
                Text [ portuguese_brazilian ] = "Semnome 1" ;
                Text [ portuguese ] = "Sem nome 1" ;
                Text [ finnish ] = "Nimetön 1" ;
                Text [ danish ] = "Ikke-navngivet 1" ;
                Text [ french ] = "Sans nom 1" ;
                Text [ swedish ] = "Namnlös 1" ;
                Text [ dutch ] = "Naamloos 1" ;
                Text [ spanish ] = "Sin nombre 1" ;
                Text [ english_us ] = "Untitled 1" ;
                HelpID = HID_NUM_OUTL_NAMED_NUMS ;
                Text[ chinese_simplified ] = "δÃüÃû 1";
                Text[ russian ] = "Áåç èìåíè 1";
                Text[ polish ] = "Bez nazwy 1";
                Text[ japanese ] = "–³‘è 1";
                Text[ chinese_traditional ] = "¥¼©R¦W 1";
                Text[ arabic ] = "ÈÏæä ÚäæÇä 1";
                Text[ greek ] = "Äß÷ùò üíïìá 1";
                Text[ korean ] = "Á¦¸ñ¾øÀ½ 1";
                Text[ turkish ] = "Adsýz 1";
                Text[ language_user1 ] = " ";
            };
            MenuItem
            {
                Identifier = MN_FORM2 ;
                Text = "Unbenannt 2" ;
                Text [ ENGLISH ] = "Noname 2" ;
                Text [ norwegian ] = "+++Noname 2" ;
                Text [ italian ] = "Senza nome 2" ;
                Text [ portuguese_brazilian ] = "Semnome 2" ;
                Text [ portuguese ] = "Sem nome 2" ;
                Text [ finnish ] = "Nimetön 2" ;
                Text [ danish ] = "Ikke-navngivet 2" ;
                Text [ french ] = "Sans nom 2" ;
                Text [ swedish ] = "Namnlös 2" ;
                Text [ dutch ] = "Naamloos 2" ;
                Text [ spanish ] = "Sin nombre 2" ;
                Text [ english_us ] = "Untitled 2" ;
                HelpID = HID_NUM_OUTL_NAMED_NUMS ;
                Text[ chinese_simplified ] = "δÃüÃû 2";
                Text[ russian ] = "Áåç èìåíè 2";
                Text[ polish ] = "Bez nazwy 2";
                Text[ japanese ] = "–³‘è 2";
                Text[ chinese_traditional ] = "¥¼©R¦W 2";
                Text[ arabic ] = "ÈÏæä ÚäæÇä 2";
                Text[ greek ] = "Äß÷ùò üíïìá 2";
                Text[ korean ] = "Á¦¸ñ¾øÀ½2";
                Text[ turkish ] = "Adsýz 2";
                Text[ language_user1 ] = " ";
            };
            MenuItem
            {
                Identifier = MN_FORM3 ;
                Text = "Unbenannt 3" ;
                Text [ ENGLISH ] = "Noname 3" ;
                Text [ norwegian ] = "+++Noname 3" ;
                Text [ italian ] = "Senza nome 3" ;
                Text [ portuguese_brazilian ] = "Semnome 3" ;
                Text [ portuguese ] = "Sem nome 3" ;
                Text [ finnish ] = "Nimetön 3" ;
                Text [ danish ] = "Ikke-navngivet 3" ;
                Text [ french ] = "Sans nom 3" ;
                Text [ swedish ] = "Namnlös 3" ;
                Text [ dutch ] = "Naamloos 3" ;
                Text [ spanish ] = "Sin nombre 3" ;
                Text [ english_us ] = "Untitled 3" ;
                HelpID = HID_NUM_OUTL_NAMED_NUMS ;
                Text[ chinese_simplified ] = "δÃüÃû 3";
                Text[ russian ] = "Áåç èìåíè 3";
                Text[ polish ] = "Bez nazwy 3";
                Text[ japanese ] = "–³‘è 3";
                Text[ chinese_traditional ] = "¥¼©R¦W 3";
                Text[ arabic ] = "ÈÏæä ÚäæÇä 3";
                Text[ greek ] = "Äß÷ùò üíïìá 3";
                Text[ korean ] = "Á¦¸ñ¾øÀ½3";
                Text[ turkish ] = "Adsýz 3";
                Text[ language_user1 ] = " ";
            };
            MenuItem
            {
                Identifier = MN_FORM4 ;
                Text = "Unbenannt 4" ;
                Text [ ENGLISH ] = "Noname 4" ;
                Text [ norwegian ] = "+++Noname 4" ;
                Text [ italian ] = "Senza nome 4" ;
                Text [ portuguese_brazilian ] = "Semnome 4" ;
                Text [ portuguese ] = "Sem nome 4" ;
                Text [ finnish ] = "Nimetön 4" ;
                Text [ danish ] = "Ikke-navngivet 4" ;
                Text [ french ] = "Sans nom 4" ;
                Text [ swedish ] = "Namnlös 4" ;
                Text [ dutch ] = "Naamloos 4" ;
                Text [ spanish ] = "Sin nombre 4" ;
                Text [ english_us ] = "Untitled 4" ;
                HelpID = HID_NUM_OUTL_NAMED_NUMS ;
                Text[ chinese_simplified ] = "δÃüÃû 4";
                Text[ russian ] = "Áåç èìåíè 4";
                Text[ polish ] = "Bez nazwy 4";
                Text[ japanese ] = "–³‘è 4";
                Text[ chinese_traditional ] = "¥¼©R¦W 4";
                Text[ arabic ] = "ÈÏæä ÚäæÇä 4";
                Text[ greek ] = "Äß÷ùò üíïìá 4";
                Text[ korean ] = "Á¦¸ñ¾øÀ½4";
                Text[ turkish ] = "Adsýz 4";
                Text[ language_user1 ] = " ";
            };
            MenuItem
            {
                Identifier = MN_FORM5 ;
                Text = "Unbenannt 5" ;
                Text [ ENGLISH ] = "Noname 5" ;
                Text [ norwegian ] = "+++Noname 5" ;
                Text [ italian ] = "Senza nome 5" ;
                Text [ portuguese_brazilian ] = "Semnome 5" ;
                Text [ portuguese ] = "Sem nome 5" ;
                Text [ finnish ] = "Nimetön 5" ;
                Text [ danish ] = "Ikke-navngivet 5" ;
                Text [ french ] = "Sans nom 5" ;
                Text [ swedish ] = "Namnlös 5" ;
                Text [ dutch ] = "Naamloos 5" ;
                Text [ spanish ] = "Sin nombre 5" ;
                Text [ english_us ] = "Untitled 5" ;
                HelpID = HID_NUM_OUTL_NAMED_NUMS ;
                Text[ chinese_simplified ] = "δÃüÃû 5";
                Text[ russian ] = "Áåç èìåíè 5";
                Text[ polish ] = "Bez nazwy 5";
                Text[ japanese ] = "–³‘è 5";
                Text[ chinese_traditional ] = "¥¼©R¦W 5";
                Text[ arabic ] = "ÈÏæä ÚäæÇä 5";
                Text[ greek ] = "Äß÷ùò üíïìá 5";
                Text[ korean ] = "Á¦¸ñ¾øÀ½5";
                Text[ turkish ] = "Adsýz 5";
                Text[ language_user1 ] = " ";
            };
            MenuItem
            {
                Identifier = MN_FORM6 ;
                Text = "Unbenannt 6" ;
                Text [ ENGLISH ] = "Noname 6" ;
                Text [ norwegian ] = "+++Noname 6" ;
                Text [ italian ] = "Senza nome 6" ;
                Text [ portuguese_brazilian ] = "Semnome 6" ;
                Text [ portuguese ] = "Sem nome 6" ;
                Text [ finnish ] = "Nimetön 6" ;
                Text [ danish ] = "Ikke-navngivet 6" ;
                Text [ french ] = "Sans nom 6" ;
                Text [ swedish ] = "Namnlös 6" ;
                Text [ dutch ] = "Naamloos 6" ;
                Text [ spanish ] = "Sin nombre 6" ;
                Text [ english_us ] = "Untitled 6" ;
                HelpID = HID_NUM_OUTL_NAMED_NUMS ;
                Text[ chinese_simplified ] = "δÃüÃû 6";
                Text[ russian ] = "Áåç èìåíè 6";
                Text[ polish ] = "Bez nazwy 6";
                Text[ japanese ] = "–³‘è 6";
                Text[ chinese_traditional ] = "¥¼©R¦W 6";
                Text[ arabic ] = "ÈÏæä ÚäæÇä 6";
                Text[ greek ] = "Äß÷ùò üíïìá 6";
                Text[ korean ] = "Á¦¸ñ¾øÀ½6";
                Text[ turkish ] = "Adsýz 6";
                Text[ language_user1 ] = " ";
            };
            MenuItem
            {
                Identifier = MN_FORM7 ;
                Text = "Unbenannt 7" ;
                Text [ ENGLISH ] = "Noname 7" ;
                Text [ norwegian ] = "+++Noname 7" ;
                Text [ italian ] = "Senza nome 7" ;
                Text [ portuguese_brazilian ] = "Semnome 7" ;
                Text [ portuguese ] = "Sem nome 7" ;
                Text [ finnish ] = "Nimetön 7" ;
                Text [ danish ] = "Ikke-navngivet 7" ;
                Text [ french ] = "Sans nom 7" ;
                Text [ swedish ] = "Namnlös 7" ;
                Text [ dutch ] = "Naamloos 7" ;
                Text [ spanish ] = "Sin nombre 7" ;
                Text [ english_us ] = "Untitled 7" ;
                HelpID = HID_NUM_OUTL_NAMED_NUMS ;
                Text[ chinese_simplified ] = "δÃüÃû 7";
                Text[ russian ] = "Áåç èìåíè 7";
                Text[ polish ] = "Bez nazwy 7";
                Text[ japanese ] = "–³‘è 7";
                Text[ chinese_traditional ] = "¥¼©R¦W 7";
                Text[ arabic ] = "ÈÏæä ÚäæÇä 7";
                Text[ greek ] = "Äß÷ùò üíïìá 7";
                Text[ korean ] = "Á¦¸ñ¾øÀ½7";
                Text[ turkish ] = "Adsýz 7";
                Text[ language_user1 ] = " ";
            };
            MenuItem
            {
                Identifier = MN_FORM8 ;
                Text = "Unbenannt 8" ;
                Text [ ENGLISH ] = "Noname 8" ;
                Text [ norwegian ] = "+++Noname 8" ;
                Text [ italian ] = "Senza nome 8" ;
                Text [ portuguese_brazilian ] = "Semnome 8" ;
                Text [ portuguese ] = "Sem nome 8" ;
                Text [ finnish ] = "Nimetön 8" ;
                Text [ danish ] = "Ikke-navngivet 8" ;
                Text [ french ] = "Sans nom 8" ;
                Text [ swedish ] = "Namnlös 8" ;
                Text [ dutch ] = "Naamloos 8" ;
                Text [ spanish ] = "Sin nombre 8" ;
                Text [ english_us ] = "Untitled 8" ;
                HelpID = HID_NUM_OUTL_NAMED_NUMS ;
                Text[ chinese_simplified ] = "δÃüÃû 8";
                Text[ russian ] = "Áåç èìåíè 8";
                Text[ polish ] = "Bez nazwy 8";
                Text[ japanese ] = "–³‘è 8";
                Text[ chinese_traditional ] = "¥¼©R¦W 8";
                Text[ arabic ] = "ÈÏæä ÚäæÇä 8";
                Text[ greek ] = "Äß÷ùò üíïìá 8";
                Text[ korean ] = "Á¦¸ñ¾øÀ½8";
                Text[ turkish ] = "Adsýz 8";
                Text[ language_user1 ] = " ";
            };
            MenuItem
            {
                Identifier = MN_FORM9 ;
                Text = "Unbenannt 9" ;
                Text [ ENGLISH ] = "Noname 9" ;
                Text [ norwegian ] = "+++Noname 9" ;
                Text [ italian ] = "Senza nome 9" ;
                Text [ portuguese_brazilian ] = "Semnome 9" ;
                Text [ portuguese ] = "Sem nome 9" ;
                Text [ finnish ] = "Nimetön 9" ;
                Text [ danish ] = "Ikke-navngivet 9" ;
                Text [ french ] = "Sans nom 9" ;
                Text [ swedish ] = "Namnlös 9" ;
                Text [ dutch ] = "Naamloos 9" ;
                Text [ spanish ] = "Sin nombre 9" ;
                Text [ english_us ] = "Untitled 9" ;
                HelpID = HID_NUM_OUTL_NAMED_NUMS ;
                Text[ chinese_simplified ] = "δÃüÃû 9";
                Text[ russian ] = "Áåç èìåíè 9";
                Text[ polish ] = "Bez nazwy 9";
                Text[ japanese ] = "–³‘è 9";
                Text[ chinese_traditional ] = "¥¼©R¦W 9";
                Text[ arabic ] = "ÈÏæä ÚäæÇä 9";
                Text[ greek ] = "Äß÷ùò üíïìá 9";
                Text[ korean ] = "Á¦¸ñ¾øÀ½9";
                Text[ turkish ] = "Adsýz 9";
                Text[ language_user1 ] = " ";
            };
            MenuItem
            {
                Separator = TRUE ;
            };
            MenuItem
            {
                Identifier = MN_SAVE ;
                Text= "Speichern ~als...";
                Text[ italian ] = "Salva con nome...";
                Text[ portuguese_brazilian ] = "Gravar ~como...";
                Text[ portuguese ] = "Guardar ~como...";
                Text[ danish ] = "Gem som...";
                Text[ french ] = "Enregistrer comme...";
                Text[ swedish ] = "Spara so~m...";
                Text[ dutch ] = "Ops~laan als...";
                Text[ spanish ] = "G~uardar como...";
                Text[ english_us ] = "Save ~As...";
    Text[ russian ] = "Ñîõðàíèòü êàê...";
                Text[ polish ] = "Zapisz jako...";
                Text[ japanese ] = "–¼‘O‚ð•t‚¯‚ĕۑ¶(~A)...";
                Text[ chinese_simplified ] = "Áí´æÎª(~A)...";
                Text = "Speichern ~als..." ;
    Text[ arabic ] = "...ÍÝÙ ßÜ";
                HelpID = HID_NUM_OUTL_NUM_SAVEAS ;
                Text[ greek ] = "~ÁðïèÞêåõóç ùò...";
                Text[ korean ] = "´Ù¸¥ À̸§À¸·Î ÀúÀå(~A)...";
                Text[ chinese_traditional ] = "Àx¦s·sÀÉ(~A)...";
                Text[ turkish ] = "Farklý kaydet...";
                Text[ language_user1 ] = " ";
            };
        };
    };
    Text[ chinese_simplified ] = "Õ±àºÅ";
    Text[ russian ] = "Íóìåðàöèÿ ãëàâ";
    Text[ polish ] = "Numeracja rozdzia³ów";
    Text[ japanese ] = "Í‚̔ԍ†•t‚¯";
    Text[ chinese_traditional ] = "³¹½s¸¹";
    Text[ arabic ] = "ÊÑÞíã ÇáÝÕæá";
    Text[ greek ] = "Áñßèìçóç êåöáëáßùí";
    Text[ korean ] = "Àå ¹øÈ£ ¸Å±â±â";
    Text[ turkish ] = "Bölüm numaralama";
    Text[ language_user1 ] = " ";
};
/**************************************************************************/
/*                                                                        */
/*  TabPage                                                               */
/*                                                                        */
/**************************************************************************/
TabPage TP_OUTLINE_NUM
{
    HelpID = HID_TP_OUTLINE_NUM ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
        Hide = TRUE;
    ListBox LB_LEVEL
    {
        Pos = MAP_APPFONT ( 12 , 14 ) ;
        Size = MAP_APPFONT ( 21 , 114 ) ;
        TabStop = TRUE ;
        DropDown = FALSE ;
        Border = TRUE ;
    };
    GroupBox GB_LEVEL
    {
        Pos = MAP_APPFONT ( 6 , 1 ) ;
        Size = MAP_APPFONT ( 33 , 131 ) ;
        Text = "Ebene" ;
        Text [ ENGLISH ] = "Level" ;
        Text [ norwegian ] = "Level" ;
        Text [ italian ] = "Livello" ;
        Text [ portuguese_brazilian ] = "Nível" ;
        Text [ portuguese ] = "Nível" ;
        Text [ finnish ] = "Taso" ;
        Text [ danish ] = "Niveau" ;
        Text [ french ] = "Niveau" ;
        Text [ swedish ] = "Nivå" ;
        Text [ dutch ] = "Niveau" ;
        Text [ spanish ] = "Nivel" ;
        Text [ english_us ] = "Level" ;
        Text[ chinese_simplified ] = "¼¶";
        Text[ russian ] = "Óðîâåíü";
        Text[ polish ] = "Poziom";
        Text[ japanese ] = "ÚÍÞÙ";
        Text[ chinese_traditional ] = "¯Å";
        Text[ arabic ] = "ÇáãÓÊæì";
        Text[ greek ] = "Åðßðåäï";
        Text[ korean ] = "¼öÁØ";
        Text[ turkish ] = "Düzey";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_COLL
    {
        Pos = MAP_APPFONT ( 48 , 10 ) ;
        Size = MAP_APPFONT ( 81 , 8 ) ;
        Text = "~Absatzvorlage" ;
        Text [ ENGLISH ] = "~Paragraph style" ;
        Text [ norwegian ] = "~Avsnittsoppsett" ;
        Text [ italian ] = "~Modello di paragrafo" ;
        Text [ portuguese_brazilian ] = "~Estilo de parágrafo" ;
        Text [ portuguese ] = "~Estilo de parágrafo" ;
        Text [ finnish ] = "~Kappaletyyli" ;
        Text [ danish ] = "Afsnitstypografi" ;
        Text [ french ] = "~Style de paragraphe" ;
        Text [ swedish ] = "~Styckeformatmall" ;
        Text [ dutch ] = "~Alinea-opmaakprofiel" ;
        Text [ spanish ] = "Estilo de ~párrafo" ;
        Text [ english_us ] = "~Paragraph Style" ;
        Group = TRUE ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "¶ÎÂäÑùʽ(~P)";
        Text[ russian ] = "Ñòèëü àáçàöà";
        Text[ polish ] = "Styl akapitu";
        Text[ japanese ] = "’i—޽À²Ùi~P)";
        Text[ chinese_traditional ] = "¬q¸¨¼Ë¦¡(~P)";
        Text[ arabic ] = "äãØ ÇáÝÞÑÉ";
        Text[ language_user1 ] = "All \"Vorlage\"/Styles are always written with capital S. 10.5.00EM";
        Text[ greek ] = "Ðñüôõðá ðáñáãñÜöïõ";
        Text[ korean ] = "´Ü¶ô À¯Çü(~P)";
        Text[ turkish ] = "Paragraf þablonu";
    };
    ListBox LB_COLL
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 48 , 20 ) ;
        Size = MAP_APPFONT ( 122 , 75 ) ;
        TabStop = TRUE ;
        Group = TRUE ;
        Sort = TRUE ;
        DropDown = TRUE ;
        CurPos = 0 ;
    };
    FixedText FT_NUMBER
    {
        Pos = MAP_APPFONT ( 48 , 40 ) ;
        Size = MAP_APPFONT ( 35 , 8 ) ;
        Text = "~Nummer" ;
        Text [ ENGLISH ] = "~Number" ;
        Text [ norwegian ] = "~Number" ;
        Text [ italian ] = "~Numero" ;
        Text [ portuguese_brazilian ] = "~Número" ;
        Text [ portuguese ] = "~Número" ;
        Text [ finnish ] = "~Numero" ;
        Text [ danish ] = "Nummer" ;
        Text [ french ] = "~Numéro" ;
        Text [ swedish ] = "~Nummer" ;
        Text [ dutch ] = "~Nummer" ;
        Text [ spanish ] = "~Número" ;
        Text [ english_us ] = "~Number" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "񅧏(~N)";
        Text[ russian ] = "Íîìåð";
        Text[ polish ] = "Numer";
        Text[ japanese ] = "”ԍ†(~N)";
        Text[ chinese_traditional ] = "½s¸¹(~N)";
        Text[ arabic ] = "ÑÞã";
        Text[ greek ] = "Áñéèìüò";
        Text[ korean ] = "¼ö(~N)";
        Text[ turkish ] = "Numara";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_NUMBER
    {
        Pos = MAP_APPFONT ( 97 , 38 ) ;
        Size = MAP_APPFONT ( 73 , 65 ) ;
        TabStop = TRUE ;
        Group = TRUE ;
        DropDown = TRUE ;
        CurPos = 0 ;
        StringList =
        {
            "A, B, C, ..." ;
            "a, b, c, ..." ;
            "I, II, III, ..." ;
            "i, ii, iii, ..." ;
            "1, 2, 3, ..." ;
            "A, .., AA, .., AAA, ..." ;
            "a, .., aa, .., aaa, ..." ;
            "Ohne" ;
        };
        StringList [ ENGLISH ] =
        {
            "A, B, C, ..." ;
            "a, b, c, ..." ;
            "I, II, III, ..." ;
            "i, ii, iii, ..." ;
            "1, 2, 3, ..." ;
            "A, .., AA, .., AAA, ..." ;
            "a, .., aa, .., aaa, ..." ;
            "None" ;
        };
        StringList [ norwegian ] =
        {
            "A, B, C, ..." ;
            "a, b, c, ..." ;
            "I, II, III, ..." ;
            "i, ii, iii, ..." ;
            "1, 2, 3, ..." ;
            "A, .., AA, .., AAA, ..." ;
            "a, .., aa, .., aaa, ..." ;
            "Ingen" ;
        };
        StringList [ italian ] =
        {
            "A, B, C, ..." ;
            "a, b, c, ..." ;
            "I, II, III, ..." ;
            "i, ii, iii, ..." ;
            "1, 2, 3, ..." ;
            "A, .., AA, .., AAA, ..." ;
            "a, .., aa, .., aaa, ..." ;
            "Senza" ;
        };
        StringList [ portuguese_brazilian ] =
        {
            "A, B, C, ..." ;
            "a, b, c, ..." ;
            "I, II, III, ..." ;
            "i, ii, iii, ..." ;
            "1, 2, 3, ..." ;
            "A, .., AA, .., AAA, ..." ;
            "a, .., aa, .., aaa, ..." ;
            "Nenhum" ;
        };
        StringList [ portuguese ] =
        {
            "A, B, C, ..." ;
            "a, b, c, ..." ;
            "I, II, III, ..." ;
            "i, ii, iii, ..." ;
            "1, 2, 3, ..." ;
            "A, .., AA, .., AAA, ..." ;
            "a, .., aa, .., aaa, ..." ;
            "Sem" ;
        };
        StringList [ finnish ] =
        {
            "A, B, C, ..." ;
            "a, b, c, ..." ;
            "I, II, III, ..." ;
            "i, ii, iii, ..." ;
            "1, 2, 3, ..." ;
            "A, .., AA, .., AAA, ..." ;
            "a, .., aa, .., aaa, ..." ;
            "Ei ole" ;
        };
        StringList [ danish ] =
        {
            "A, B, C, ..." ;
            "a, b, c, ..." ;
            "I, II, III, ..." ;
            "i, ii, iii, ..." ;
            "1, 2, 3, ..." ;
            "A, .., AA, .., AAA, ..." ;
            "a, .., aa, .., aaa, ..." ;
            "Uden" ;
        };
        StringList [ french ] =
        {
            "A, B, C, ..." ;
            "a, b, c, ..." ;
            "I, II, III, ..." ;
            "i, ii, iii, ..." ;
            "1, 2, 3, ..." ;
            "A, .., AA, .., AAA, ..." ;
            "a, .., aa, .., aaa, ..." ;
            "Aucun(e)" ;
        };
        StringList [ swedish ] =
        {
            "A, B, C, ..." ;
            "a, b, c, ..." ;
            "I, II, III, ..." ;
            "i, ii, iii, ..." ;
            "1, 2, 3, ..." ;
            "A, .., AA, .., AAA, ..." ;
            "a, .., aa, .., aaa, ..." ;
            "Utan" ;
        };
        StringList [ dutch ] =
        {
            "A, B, C, ..." ;
            "a, b, c, ..." ;
            "I, II, III, ..." ;
            "i, ii, iii, ..." ;
            "1, 2, 3, ..." ;
            "A, .., AA, .., AAA, ..." ;
            "a, .., aa, .., aaa, ..." ;
            "Geen" ;
        };
        StringList [ spanish ] =
        {
            "A, B, C, ..." ;
            "a, b, c, ..." ;
            "I, II, III, ..." ;
            "i, ii, iii, ..." ;
            "1, 2, 3, ..." ;
            "A, .., AA, .., AAA, ..." ;
            "a, .., aa, .., aaa, ..." ;
            "Ninguno" ;
        };
        StringList [ english_us ] =
        {
            "A, B, C, ..." ;
            "a, b, c, ..." ;
            "I, II, III, ..." ;
            "i, ii, iii, ..." ;
            "1, 2, 3, ..." ;
            "A, .., AA, .., AAA, ..." ;
            "a, .., aa, .., aaa, ..." ;
            "None" ;
        };
    StringList [ language_user1 ] =
    {
        " " ;
        " " ;
        " " ;
        " " ;
        " " ;
        " " ;
        " " ;
        " " ;
    };
    StringList [ russian ] =
    {
        "A, B, C, ..." ;
        "a, b, c, ..." ;
        "I, II, III, ..." ;
        "i, ii, iii, ..." ;
        "1, 2, 3, ..." ;
        "A, .., AA, .., AAA, ..." ;
        "a, .., aa, .., aaa, ..." ;
        "Áåç" ;
    };
    StringList [ greek ] =
    {
        "A, B, C, ..." ;
        "a, b, c, ..." ;
        "I, II, III, ..." ;
        "i, ii, iii, ..." ;
        "1, 2, 3, ..." ;
        "A, .., AA, .., AAA, ..." ;
        "a, .., aa, .., aaa, ..." ;
        "×ùñßò" ;
    };
    StringList [ polish ] =
    {
        "A, B, C, ..." ;
        "a, b, c, ..." ;
        "I, II, III, ..." ;
        "i, ii, iii, ..." ;
        "1, 2, 3, ..." ;
        "A, .., AA, .., AAA, ..." ;
        "a, .., aa, .., aaa, ..." ;
        "Brak" ;
    };
    StringList [ japanese ] =
    {
        "A, B, C, ..." ;
        "a, b, c, ..." ;
        "I, II, III, ..." ;
        "i, ii, iii, ..." ;
        "1, 2, 3, ..." ;
        "A, .., AA, .., AAA, ..." ;
        "a, .., aa, .., aaa, ..." ;
        "‚È‚µ" ;
    };
    StringList [ korean ] =
    {
        "A, B, C, ..." ;
        "a, b, c, ..." ;
        "I, II, III, ..." ;
        "i, ii, iii, ..." ;
        "1, 2, 3, ..." ;
        "A, .., AA, .., AAA, ..." ;
        "a, .., aa, .., aaa, ..." ;
        "¾øÀ½" ;
    };
    StringList [ chinese_simplified ] =
    {
        "A, B, C, ..." ;
        "a, b, c, ..." ;
        "I, II, III, ..." ;
        "i, ii, iii, ..." ;
        "1, 2, 3, ..." ;
        "A, .., AA, .., AAA, ..." ;
        "a, .., aa, .., aaa, ..." ;
        "ÎÞ" ;
    };
    StringList [ chinese_traditional ] =
    {
        "A, B, C, ..." ;
        "a, b, c, ..." ;
        "I, II, III, ..." ;
        "i, ii, iii, ..." ;
        "1, 2, 3, ..." ;
        "A, .., AA, .., AAA, ..." ;
        "a, .., aa, .., aaa, ..." ;
        "µL" ;
    };
    StringList [ arabic ] =
    {
        "A, B, C, ..." ;
        "...áȡÊ" ;
        "I, II, III, ..." ;
        "i, ii, iii, ..." ;
        "1, 2, 3, ..." ;
        "A, .., AA, .., AAA, ..." ;
        "a, .., aa, .., aaa, ..." ;
        "ÈÏæä" ;
    };
    StringList [ turkish ] =
    {
        "A, B, C, ..." ;
        "a, b, c, ..." ;
        "I, II, III, ..." ;
        "i, ii, iii, ..." ;
        "1, 2, 3, ..." ;
        "A, .., AA, .., AAA, ..." ;
        "a, .., aa, .., aaa, ..." ;
        "Yok" ;
    };
    };
    FixedText FT_CHARFMT
    {
        Pos = MAP_APPFONT ( 48 , 58 ) ;
        Size = MAP_APPFONT ( 45 , 8 ) ;
        Text = "Zeichenv~orlage" ;
        Text [ ENGLISH ] = "Character style" ;
        Text [ english_us ] = "~Character Style" ;
        Text [ swedish ] = "~Teckenformatmall" ;
        Text [ danish ] = "Tegntypografi" ;
        Text [ italian ] = "Modello di carattere" ;
        Text [ spanish ] = "E~stilo de carácter" ;
        Text [ french ] = "St~yle de caractères" ;
        Text [ dutch ] = "~Tekenopmaakprofiel" ;
        Text [ portuguese_brazilian ] = "Zeichenv~orlage" ;
        Text [ portuguese ] = "~Estilo de caracteres:" ;
        Text[ chinese_simplified ] = "×Ö·ûÑùʽ";
        Text[ russian ] = "Ñòèëü çíàêîâ";
        Text[ polish ] = "Styl znaku";
        Text[ japanese ] = "•¶Žš½À²Ù";
        Text[ chinese_traditional ] = "¦r¤¸¼Ë¦¡";
        Text[ arabic ] = "äãØ ÇáÃÍÑÝ";
        Text[ greek ] = "Óôõë ÷áñáêôÞñùí";
        Text[ korean ] = "¹®ÀÚ À¯Çü(~C)";
        Text[ turkish ] = "Karakter þablonu";
        Text[ language_user1 ] = "All \"Vorlage\"/Styles are always written with capital S. 10.5.00EM";
    };
    ListBox LB_CHARFMT
    {
        TabStop = TRUE ;
        DropDown = TRUE ;
        Pos = MAP_APPFONT ( 97 , 56 ) ;
        Size = MAP_APPFONT ( 73 , 65 ) ;
    };
    FixedText FT_ALL_LEVEL
    {
        Pos = MAP_APPFONT ( 48 , 76 ) ;
        Size = MAP_APPFONT ( 48 , 10 ) ;
        Text = "~Vollständig" ;
        Text [ ENGLISH ] = "~Complete" ;
        Text [ norwegian ] = "~Fullstendig" ;
        Text [ italian ] = "~Completo" ;
        Text [ portuguese_brazilian ] = "~Completar" ;
        Text [ portuguese ] = "Co~mpleto" ;
        Text [ finnish ] = "~Täydellinen" ;
        Text [ danish ] = "Fuldstændig" ;
        Text [ french ] = "C~omplet" ;
        Text [ swedish ] = "~Fullständig" ;
        Text [ dutch ] = "~Volledig" ;
        Text [ spanish ] = "~Completo" ;
        Text [ english_us ] = "Sho~w sublevels" ;
        Text[ chinese_simplified ] = "ÍêÕûµÄ(~W)";
        Text[ russian ] = "Ïîëíîñòüþ";
        Text[ polish ] = "Kompletny";
        Text[ japanese ] = "‘Í”(~W)";
        Text[ chinese_traditional ] = "§¹¾ãªº(~W)";
        Text[ arabic ] = "ßÇãá";
        Text[ greek ] = "ÏëïêëçñùìÝíï";
        Text[ korean ] = "ÇÏÀ§ ¼öÁØ º¸À̱â(~W)";
        Text[ turkish ] = "Tüm düzeyler";
        Text[ language_user1 ] = " ";
    };
    NumericField NF_ALL_LEVEL
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 97 , 74 ) ;
        Size = MAP_APPFONT ( 73 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 1 ;
        Maximum = 10 ;
        Value = 1 ;
        First = 1 ;
        Last = 10 ;
    };
    FixedText FT_DELIM
    {
        Pos = MAP_APPFONT ( 48 , 90 ) ;
        Size = MAP_APPFONT ( 40 , 8 ) ;
        Text = "Trennzeichen" ;
        Text [ ENGLISH ] = "Delimiter" ;
        Text [ norwegian ] = "Skilletegn" ;
        Text [ italian ] = "Separatore" ;
        Text [ portuguese_brazilian ] = "Delimitador" ;
        Text [ portuguese ] = "Separador" ;
        Text [ finnish ] = "Erotin" ;
        Text [ danish ] = "Skilletegn" ;
        Text [ french ] = "Séparateur" ;
        Text [ swedish ] = "Skiljetecken" ;
        Text [ dutch ] = "Scheidingsteken" ;
        Text [ spanish ] = "Separador" ;
        Text [ english_us ] = "Separator" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "·Ö¸ô·û";
        Text[ russian ] = "Ðàçäåëèòåëü";
        Text[ polish ] = "Separator";
        Text[ japanese ] = "‹æØ‚è‹L†";
        Text[ chinese_traditional ] = "¤À¹j²Å";
        Text[ arabic ] = "ÝÇÕá";
        Text[ greek ] = "Åíùôéêü";
        Text[ korean ] = "±¸ºÐÀÚ";
        Text[ turkish ] = "Ayýrma iþareti";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_PREFIX
    {
        Pos = MAP_APPFONT ( 97 , 90 ) ;
        Size = MAP_APPFONT ( 21 , 8 ) ;
        Text = "~davor" ;
        Text [ ENGLISH ] = "before" ;
        Text [ norwegian ] = "før" ;
        Text [ italian ] = "~Davanti" ;
        Text [ portuguese_brazilian ] = "antes" ;
        Text [ portuguese ] = "an~tes" ;
        Text [ finnish ] = "Edellä" ;
        Text [ danish ] = "Før" ;
        Text [ french ] = "Devant" ;
        Text [ swedish ] = "f~ramför" ;
        Text [ dutch ] = "~ervoor" ;
        Text [ spanish ] = "~delante" ;
        Text [ english_us ] = "~Before" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "֮ǰ(~B)";
        Text[ russian ] = "äî";
        Text[ polish ] = "przed";
        Text[ japanese ] = "”ԍ†‘O(~B)";
        Text[ chinese_traditional ] = "¤§«e(~B)";
        Text[ arabic ] = "ÞÈáå";
        Text[ greek ] = "ðñéí áðü";
        Text[ korean ] = "Àü¿¡(~B)";
        Text[ turkish ] = "Baþ. ekle";
        Text[ language_user1 ] = " ";
    };
    Edit ED_PREFIX
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 97 , 101 ) ;
        Size = MAP_APPFONT ( 36 , 12 ) ;
        TabStop = TRUE ;
        Group = TRUE ;
        Left = TRUE ;
    };
    FixedText FT_SUFFIX
    {
        Pos = MAP_APPFONT ( 134 , 90 ) ;
        Size = MAP_APPFONT ( 30 , 8 ) ;
         // ### ACHTUNG: Neuer Text in Resource? dah~inter : da~hinter
        Text = "dah~inter" ;
        Text [ ENGLISH ] = "behind" ;
        Text [ norwegian ] = "bak" ;
        Text [ italian ] = "D~ietro" ;
        Text [ portuguese_brazilian ] = "atrßs" ;
        Text [ portuguese ] = "~Atrás" ;
        Text [ finnish ] = "jäljessä" ;
        Text [ danish ] = "Efter" ;
        Text [ french ] = "Derrière" ;
        Text [ swedish ] = "ba~kom" ;
        Text [ dutch ] = "era~chter" ;
        Text [ spanish ] = "d~etrás" ;
        Text [ english_us ] = "~After" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "Ö®ºó(~A)";
        Text[ russian ] = "ïîñëå";
        Text[ polish ] = "za";
        Text[ japanese ] = "”ԍ†Œã(~A)";
        Text[ chinese_traditional ] = "¤§«á(~A)";
        Text[ arabic ] = "ÈÚÏå";
        Text[ greek ] = "ìåôÜ áðü";
        Text[ korean ] = "ÈÄ¿¡(~A)";
        Text[ turkish ] = "Son. ekle";
        Text[ language_user1 ] = " ";
    };
    Edit ED_SUFFIX
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 134 , 101 ) ;
        Size = MAP_APPFONT ( 36 , 12 ) ;
        TabStop = TRUE ;
        Group = TRUE ;
        Left = TRUE ;
    };
    FixedText FT_START
    {
        Pos = MAP_APPFONT ( 48 , 119 ) ;
        Size = MAP_APPFONT ( 43 , 8 ) ;
        Text = "~Beginn bei" ;
        Text [ English ] = "~Start at" ;
        Text [ norwegian ] = "~Start på" ;
        Text [ italian ] = "~Inizia con" ;
        Text [ portuguese_brazilian ] = "~Começar em" ;
        Text [ portuguese ] = "~Começar em" ;
        Text [ finnish ] = "~Start at" ;
        Text [ danish ] = "Begynd med" ;
        Text [ french ] = "~À partir de" ;
        Text [ swedish ] = "~Börja vid" ;
        Text [ dutch ] = "~Begin met" ;
        Text [ spanish ] = "Comen~zar en" ;
        Text [ english_us ] = "~Start at" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "¿ªÊ¼´Ó(~S)";
        Text[ russian ] = "Íà÷àòü ñ";
        Text[ polish ] = "Zacznij od";
        Text[ japanese ] = "ŠJŽnÍ”ԍ†(~S)";
        Text[ chinese_traditional ] = "¶}©l±q(~S)";
        Text[ arabic ] = "ÈÏÁð ÈÜ";
        Text[ greek ] = "ÈÝóç åêêßíçóçò";
        Text[ korean ] = "¿¡¼­ ½ÃÀÛ(~S)";
        Text[ turkish ] = "Baþlangýç:";
        Text[ language_user1 ] = " ";
    };
    NumericField ED_START
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 97 , 117 ) ;
        Size = MAP_APPFONT ( 73 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Spin = TRUE ;
        Repeat = TRUE ;
        Maximum = 999 ;
        Value = 0 ;
        First = 0 ;
        Last = 99 ;
        SpinSize = 1 ;
    };
    GroupBox GB_NUMBER
    {
        Pos = MAP_APPFONT ( 42 , 1 ) ;
        Size = MAP_APPFONT ( 131 , 131 ) ;
        Text = "Nummerierung" ;
        Text [ ENGLISH ] = "Numbering" ;
        Text [ norwegian ] = "Nummering" ;
        Text [ italian ] = "Numerazione" ;
        Text [ portuguese_brazilian ] = "Numeração" ;
        Text [ portuguese ] = "Numeração" ;
        Text [ finnish ] = "Numerointi" ;
        Text [ danish ] = "Nummerering" ;
        Text [ french ] = "Numérotation" ;
        Text [ swedish ] = "Numrering" ;
        Text [ dutch ] = "Nummering" ;
        Text [ spanish ] = "Numeración" ;
        Text [ english_us ] = "Numbering" ;
        Group = TRUE ;
        Text[ chinese_simplified ] = "񅧏";
        Text[ russian ] = "Íóìåðàöèÿ";
        Text[ polish ] = "Numeracja";
        Text[ japanese ] = "”ԍ†•t‚¯";
        Text[ chinese_traditional ] = "½s¸¹";
        Text[ arabic ] = "ÇáÊÑÞíã";
        Text[ greek ] = "Áñßèìçóç";
        Text[ korean ] = "¹øÈ£ ¸Å±â±â";
        Text[ turkish ] = "Numaralama";
        Text[ language_user1 ] = " ";
    };
    Window WIN_PREVIEW
    {
        Pos = MAP_APPFONT ( 179 , 12 ) ;
        Size = MAP_APPFONT ( 72 , 114 ) ;
    };
    GroupBox GB_PREVIEW
    {
        Pos = MAP_APPFONT ( 176 , 1 ) ;
        Size = MAP_APPFONT ( 78 , 130 ) ;
        Text = "Vorschau" ;
        Text [ ENGLISH ] = "Preview" ;
        Text [ english_us ] = "Preview" ;
        Text [ portuguese_brazilian ] = "Vorschau" ;
        Text [ swedish ] = "Förhandsvisning" ;
        Text [ danish ] = "Eksempel" ;
        Text [ italian ] = "Anteprima" ;
        Text [ spanish ] = "Previsualización" ;
        Text [ french ] = "Aperçu" ;
        Text [ dutch ] = "Voorbeeld" ;
        Text [ portuguese ] = "Previsualizar" ;
        Text[ chinese_simplified ] = "Ô¤ÊÓ";
        Text[ russian ] = "Ïðîñìîòð";
        Text[ polish ] = "Podgl¹d";
        Text[ japanese ] = "ÌßÚËÞ­°";
        Text[ chinese_traditional ] = "¹wÄý";
        Text[ arabic ] = "ÇáãÚÇíäÉ";
        Text[ greek ] = "Ðñïåðéóêüðçóç";
        Text[ korean ] = "¹Ì¸®º¸±â";
        Text[ turkish ] = "Önizleme";
        Text[ language_user1 ] = " ";
    };
    String ST_NO_COLL
    {
        Text = "(keine)" ;
        TEXT [ English ] = "(none)" ;
        TEXT [ norwegian ] = "(ingen)" ;
        TEXT [ italian ] = "(nessuno)" ;
        TEXT [ portuguese_brazilian ] = "(nenhum)" ;
        TEXT [ portuguese ] = "(nenhum)" ;
        TEXT [ finnish ] = "(ei mitään)" ;
        TEXT [ danish ] = "(ingen)" ;
        TEXT [ french ] = "(aucun(e))" ;
        TEXT [ swedish ] = "(inga)" ;
        TEXT [ dutch ] = "(geen)" ;
        TEXT [ spanish ] = "(ninguna)" ;
        TEXT [ english_us ] = "(none)" ;
        TEXT[ chinese_simplified ] = "(ÎÞ)";
        TEXT[ russian ] = "(áåç)";
        TEXT[ polish ] = "(brak)";
        TEXT[ japanese ] = "(‚È‚µ)";
        TEXT[ chinese_traditional ] = "(µL)";
        TEXT[ arabic ] = "(ÈÏæä)";
        TEXT[ greek ] = "(êáíÝíá)";
        TEXT[ korean ] = "(¾øÀ½)";
        TEXT[ turkish ] = "(Yok)";
        TEXT[ language_user1 ] = " ";
    };
};

diff --git a/sw/source/ui/misc/pgfnote.cxx b/sw/source/ui/misc/pgfnote.cxx
new file mode 100644
index 0000000..c60da0a
--- /dev/null
+++ b/sw/source/ui/misc/pgfnote.cxx
@@ -0,0 +1,478 @@
/*************************************************************************
 *
 *  $RCSfile: pgfnote.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:45 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _REF_HXX //to avoid internal compiler errors
#include <tools/ref.hxx>
#endif

#include "cmdid.h"
#include "hintids.hxx"
#include "uiparam.hxx"

#ifndef _SVX_DIALOGS_HRC
#include <svx/dialogs.hrc>
#endif
#ifndef _SV_FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif
#ifndef _SV_SVAPP_HXX
#include <vcl/svapp.hxx>
#endif


#include "uitool.hxx"
#include "globals.hrc"
#include "pagedesc.hxx"
#include "pgfnote.hxx"
#include "uiitems.hxx"

#include "misc.hrc"
#include "pgfnote.hrc"

#define TWIP_TO_LBOX 5
/*-----------------------------------------------------#---------------
    Beschreibung:   vordefinierte Linien in Point
 --------------------------------------------------------------------*/

static const USHORT __FAR_DATA nLines[] = {
    0,
    50,
    100,
    150,
    200,
    500
};

static const USHORT nLineCount = sizeof(nLines) / sizeof(nLines[0]);

static USHORT __FAR_DATA aPageRg[] = {
    FN_PARAM_FTN_INFO, FN_PARAM_FTN_INFO,
    0
};


/*------------------------------------------------------------------------
 Beschreibung:  liefert zurueck, ob die Linienbreite nWidth bereits
                in der Listbox enthalten ist.
------------------------------------------------------------------------*/


BOOL lcl_HasLineWidth(USHORT nWidth)
{
    for(USHORT i = 0; i < nLineCount; ++i) {
        if(nLines[i] == nWidth)
            return TRUE;
    }
    return FALSE;
}

/*------------------------------------------------------------------------
 Beschreibung:  Handler fuer umschalten zwischen den unterschiedlichen
                Arten, wie die Hoehe des Fussnotenbereiches angegeben
                werden kann.
------------------------------------------------------------------------*/


IMPL_LINK_INLINE_START( SwFootNotePage, HeightPage, Button *, EMPTYARG )
{
    aMaxHeightEdit.Enable(FALSE);
    return 0;
}
IMPL_LINK_INLINE_END( SwFootNotePage, HeightPage, Button *, EMPTYARG )


IMPL_LINK_INLINE_START( SwFootNotePage, HeightMetric, Button *, EMPTYARG )
{
    aMaxHeightEdit.Enable();
    aMaxHeightEdit.GrabFocus();
    return 0;
}
IMPL_LINK_INLINE_END( SwFootNotePage, HeightMetric, Button *, EMPTYARG )

/*------------------------------------------------------------------------
 Beschreibung:  Handler Grenzwerte
------------------------------------------------------------------------*/


IMPL_LINK( SwFootNotePage, HeightModify, MetricField *, EMPTYARG )
{
    aMaxHeightEdit.SetMax(aMaxHeightEdit.Normalize(lMaxHeight -
            (aDistEdit.Denormalize(aDistEdit.GetValue(FUNIT_TWIP)) +
            aLineDistEdit.Denormalize(aLineDistEdit.GetValue(FUNIT_TWIP)))),
            FUNIT_TWIP);
    if(aMaxHeightEdit.GetValue() < 0)
        aMaxHeightEdit.SetValue(0);
    aDistEdit.SetMax(aDistEdit.Normalize(lMaxHeight -
            (aMaxHeightEdit.Denormalize(aMaxHeightEdit.GetValue(FUNIT_TWIP)) +
            aLineDistEdit.Denormalize(aLineDistEdit.GetValue(FUNIT_TWIP)))),
            FUNIT_TWIP);
    if(aDistEdit.GetValue() < 0)
        aDistEdit.SetValue(0);
    aLineDistEdit.SetMax(aLineDistEdit.Normalize(lMaxHeight -
            (aMaxHeightEdit.Denormalize(aMaxHeightEdit.GetValue(FUNIT_TWIP)) +
            aDistEdit.Denormalize(aDistEdit.GetValue(FUNIT_TWIP)))),
            FUNIT_TWIP);
    return 0;
}

// CTOR / DTOR -----------------------------------------------------------

SwFootNotePage::SwFootNotePage(Window *pParent, const SfxItemSet &rSet) :

    SfxTabPage(pParent, SW_RES(TP_FOOTNOTE_PAGE), rSet),

    aMaxHeightPageBtn(this, SW_RES(RB_MAXHEIGHT_PAGE)),
    aMaxHeightBtn(this,     SW_RES(RB_MAXHEIGHT)),
    aMaxHeightEdit(this,    SW_RES(ED_MAXHEIGHT)),
    aDistLbl(this,          SW_RES(FT_DIST)),
    aDistEdit(this,         SW_RES(ED_DIST)),
    aPosFrm(this,           SW_RES(GB_FOOTNOTE_SIZE)),

    aLinePosLbl(this,       SW_RES(FT_LINEPOS)),
    aLinePosBox(this,       SW_RES(DLB_LINEPOS)),
    aLineTypeLbl(this,      SW_RES(FT_LINETYPE)),
    aLineTypeBox(this,      SW_RES(DLB_LINETYPE)),
    aLineWidthLbl(this,     SW_RES(FT_LINEWIDTH)),
    aLineWidthEdit(this,    SW_RES(ED_LINEWIDTH)),
    aLineDistLbl(this,      SW_RES(FT_LINEDIST)),
    aLineDistEdit(this,     SW_RES(ED_LINEDIST)),
    aLineFrm(this,          SW_RES(GB_LINE)),
    aBspWin(this,           SW_RES(WN_BSP)),
    aBspFrm(this,           SW_RES(GB_BSP))
{
    FreeResource();

    SetExchangeSupport();
    FieldUnit aMetric = ::GetDfltMetric(FALSE);
    SetMetric( aMaxHeightEdit,  aMetric );
    SetMetric( aDistEdit,       aMetric );
    SetMetric( aLineDistEdit,   aMetric );
    MeasurementSystem eSys = Application::GetAppInternational().GetMeasurementSystem();
    long nHeightValue = MEASURE_METRIC != eSys ? 1440 : 1134;
    aMaxHeightEdit.SetValue(aMaxHeightEdit.Normalize(nHeightValue),FUNIT_TWIP);;
}

SwFootNotePage::~SwFootNotePage()
{
}


SfxTabPage* SwFootNotePage::Create(Window *pParent, const SfxItemSet &rSet)
{
    return new SwFootNotePage(pParent, rSet);
}


/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwFootNotePage::Reset(const SfxItemSet &rSet)
{
    // Falls noch kein Bsp vorhanden Init hier sonst im Activate
    //
    SwPageFtnInfo* pDefFtnInfo = 0;
    const SwPageFtnInfo* pFtnInfo;
    const SfxPoolItem* pItem = SfxTabPage::GetItem(rSet, FN_PARAM_FTN_INFO);
    if( pItem )
    {
        pFtnInfo = &((const SwPageFtnInfoItem*)pItem)->GetPageFtnInfo();
    }
    else
    {
        // wenn "Standard" betaetigt wird, wird das Fussnotenitem geloescht,
        // deswegen muss hier eine Fussnotenstruktur erzeugt werden
        pDefFtnInfo = new SwPageFtnInfo();
        pFtnInfo = pDefFtnInfo;
    }
        // Hoehe Fussnotenbereich
    SwTwips lHeight = pFtnInfo->GetHeight();
    if(lHeight)
    {
        aMaxHeightEdit.SetValue(aMaxHeightEdit.Normalize(lHeight),FUNIT_TWIP);
        aMaxHeightBtn.Check(TRUE);
    }
    else
    {
        aMaxHeightPageBtn.Check(TRUE);
        aMaxHeightEdit.Enable(FALSE);
    }
    aMaxHeightPageBtn.SetClickHdl(LINK(this,SwFootNotePage,HeightPage));
    aMaxHeightBtn.SetClickHdl(LINK(this,SwFootNotePage,HeightMetric));
    Link aLk = LINK(this, SwFootNotePage, HeightModify);
    aMaxHeightEdit.SetLoseFocusHdl( aLk );
    aDistEdit.SetLoseFocusHdl( aLk );
    aLineDistEdit.SetLoseFocusHdl( aLk );

    // Trennlinie
    for(USHORT i = 0; i < nLineCount; ++i)
        aLineTypeBox.InsertEntry(nLines[i]);

    const USHORT nWidth = (USHORT)pFtnInfo->GetLineWidth() * TWIP_TO_LBOX;
    if(lcl_HasLineWidth(nWidth))
        aLineTypeBox.SelectEntry(nWidth);
    else
    {
        aLineTypeBox.InsertEntry(nWidth);
        aLineTypeBox.SelectEntry(nWidth);
    }

        // Position
    aLinePosBox.SelectEntryPos(pFtnInfo->GetAdj());

        // Breite
    Fraction aTmp( 100, 1 );
    aTmp *= pFtnInfo->GetWidth();
    aLineWidthEdit.SetValue( aTmp );

        // Abstand Fussnotenbereich
    aDistEdit.SetValue(aDistEdit.Normalize(pFtnInfo->GetTopDist()),FUNIT_TWIP);
    aLineDistEdit.SetValue(
        aLineDistEdit.Normalize(pFtnInfo->GetBottomDist()), FUNIT_TWIP);
    ActivatePage( rSet );
    delete pDefFtnInfo;
}

/*--------------------------------------------------------------------
    Beschreibung:   Attribute in den Set stopfen bei OK
 --------------------------------------------------------------------*/


BOOL SwFootNotePage::FillItemSet(SfxItemSet &rSet)
{
    SwPageFtnInfoItem aItem((const SwPageFtnInfoItem&)GetItemSet().Get(FN_PARAM_FTN_INFO));

    // Das ist das Original
    SwPageFtnInfo &rFtnInfo = aItem.GetPageFtnInfo();

        // Hoehe Fussnotenbereich
    if(aMaxHeightBtn.IsChecked())
        rFtnInfo.SetHeight(aMaxHeightEdit.
            Denormalize(aMaxHeightEdit.GetValue(FUNIT_TWIP)));
    else
        rFtnInfo.SetHeight(0);

        // Abstand Fussnotenbereich
    rFtnInfo.SetTopDist(aDistEdit.Denormalize(aDistEdit.GetValue(FUNIT_TWIP)));
    rFtnInfo.SetBottomDist(
        aLineDistEdit.Denormalize(aLineDistEdit.GetValue(FUNIT_TWIP)));

        // Trennlinie
    //Pen aPen(rFtnInfo.GetPen());

    const USHORT nPos = aLineTypeBox.GetSelectEntryPos();
        if( LISTBOX_ENTRY_NOTFOUND != nPos )
            rFtnInfo.SetLineWidth(nLines[nPos] / TWIP_TO_LBOX);
    //rFtnInfo.SetPen(aPen);

        // Position
    rFtnInfo.SetAdj((SwFtnAdj)aLinePosBox.GetSelectEntryPos());

        // Breite
    rFtnInfo.SetWidth(Fraction(aLineWidthEdit.GetValue(), 100));

    const SfxPoolItem* pOldItem;
    if(0 == (pOldItem = GetOldItem( rSet, FN_PARAM_FTN_INFO )) ||
                aItem != *pOldItem )
        rSet.Put(aItem);

    return TRUE;
}

/*--------------------------------------------------------------------
    Beschreibung:   Bsp Uebernehmen
 --------------------------------------------------------------------*/


void SwFootNotePage::ActivatePage(const SfxItemSet& rSet)
{
    aBspWin.UpdateExample( rSet );
    lMaxHeight = aBspWin.GetSize().Height() -
                 aBspWin.GetHdDist() - aBspWin.GetHdHeight() -
                 aBspWin.GetFtDist() - aBspWin.GetFtHeight()-
                 aBspWin.GetTop() - aBspWin.GetBottom();
    lMaxHeight *= 8;
    lMaxHeight /= 10;

    // Maximalwerte setzen
    HeightModify(0);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


int SwFootNotePage::DeactivatePage( SfxItemSet* pSet)
{
    if(pSet)
        FillItemSet(*pSet);

    return TRUE;
}


USHORT* SwFootNotePage::GetRanges()
{
    return aPageRg;
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.79  2000/09/18 16:05:59  willem.vandorp
    OpenOffice header added.

    Revision 1.78  2000/03/03 15:17:03  os
    StarView remainders removed

    Revision 1.77  2000/02/11 14:56:44  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.76  1999/09/20 11:23:04  os
    set initial value for max footnote height

    Revision 1.75  1999/07/29 11:40:06  MA
    avoid internal compiler errors


      Rev 1.74   29 Jul 1999 13:40:06   MA
   avoid internal compiler errors

      Rev 1.73   08 Sep 1998 17:01:46   OS
   #56134# Metric fuer Text und HTML getrennt

      Rev 1.72   17 Apr 1998 16:24:44   OS
   Design verbessert, Linienstaerken berichtigt

      Rev 1.71   28 Nov 1997 20:11:46   MA
   includes

      Rev 1.70   24 Nov 1997 16:47:42   MA
   includes

      Rev 1.69   03 Nov 1997 13:22:44   MA
   precomp entfernt

      Rev 1.68   10 Oct 1997 12:24:12   OS
   Index fuer LineType berichtigt

      Rev 1.67   09 Sep 1997 16:11:18   OS
   fuer VCL LineListBox benutzen #43663#

      Rev 1.66   09 Aug 1997 13:31:40   OS
   paraitem/frmitems/textitem aufgeteilt

      Rev 1.65   05 Feb 1997 10:19:18   OM
   FillItemSet in DeactivatePage rufen

      Rev 1.64   11 Nov 1996 11:05:46   MA
   ResMgr

      Rev 1.63   02 Oct 1996 18:28:58   MA
   Umstellung Enable/Disable

      Rev 1.62   29 Aug 1996 16:09:16   OS
   Korrektur: max. Hoehe des Fussnotenbereichs

      Rev 1.61   28 Aug 1996 14:12:12   OS
   includes

      Rev 1.60   02 Jul 1996 10:09:56   NF
   includes

      Rev 1.59   06 Feb 1996 15:21:14   JP
   Link Umstellung 305

      Rev 1.58   23 Jan 1996 11:27:10   OS
   richtige Reaktion auf Standard-Button im Formatdialog

      Rev 1.57   29 Nov 1995 17:51:26   OS
   im Reset Default-Fussnote erzeugen

      Rev 1.56   28 Nov 1995 21:13:18   JP
   UiSystem-Klasse aufgehoben, in initui/swtype aufgeteilt

      Rev 1.55   24 Nov 1995 16:58:46   OM
   PCH->PRECOMPILED

      Rev 1.54   13 Nov 1995 10:51:34   OM
   static entfernt

      Rev 1.53   08 Nov 1995 13:31:44   JP
   Umstellung zur 301: Change -> Set

      Rev 1.52   05 Oct 1995 17:31:02   JP
   eigene TabPages mit GetRanges versehen (fuer Vorlagen editieren)

      Rev 1.51   22 Aug 1995 09:34:22   MA
   svxitems-header entfernt

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/misc/pgfnote.hrc b/sw/source/ui/misc/pgfnote.hrc
new file mode 100644
index 0000000..1f30840
--- /dev/null
+++ b/sw/source/ui/misc/pgfnote.hrc
@@ -0,0 +1,80 @@
/*************************************************************************
 *
 *  $RCSfile: pgfnote.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:45 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#define RB_MAXHEIGHT_PAGE   1
#define RB_MAXHEIGHT        2
#define ED_MAXHEIGHT        3
#define FT_DIST             4
#define ED_DIST             5
#define GB_FOOTNOTE_SIZE    10

#define FT_LINETYPE         20
#define DLB_LINETYPE        21
#define FT_LINEPOS          22
#define DLB_LINEPOS         23
#define FT_LINEWIDTH        24
#define ED_LINEWIDTH        25
#define FT_LINEDIST         26
#define ED_LINEDIST         27
#define GB_LINE             30

#define GB_BSP              31
#define WN_BSP              32
diff --git a/sw/source/ui/misc/pgfnote.src b/sw/source/ui/misc/pgfnote.src
new file mode 100644
index 0000000..fe89f4d
--- /dev/null
+++ b/sw/source/ui/misc/pgfnote.src
@@ -0,0 +1,590 @@
/*************************************************************************
 *
 *  $RCSfile: pgfnote.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:45 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#include "globals.hrc"
#include "pgfnote.hrc"
#include "helpid.h"
 // #define TP_FOOTNOTE_PAGE 256
TabPage TP_FOOTNOTE_PAGE
{
    HelpID = HID_FOOTNOTE_PAGE ;
    Pos = MAP_APPFONT ( 0 , 0 ) ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Hide = TRUE;
    RadioButton RB_MAXHEIGHT
    {
        Pos = MAP_APPFONT ( 14 , 31 ) ;
        Size = MAP_APPFONT ( 95 , 10 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? Ma~x. Höhe der Fußnote : Ma~x. H÷he der Fu˜note */
        Text = "Ma~x. Höhe der Fußnote" ;
        Text [ ENGLISH ] = "Max. ~Height of Footnote" ;
        Text [ norwegian ] = "Maks. ~Høyde på Fotnote" ;
        Text [ italian ] = "Altezza massima nota a piè pagina" ;
        Text [ portuguese_brazilian ] = "Max. ~Height of Footnote" ;
        Text [ portuguese ] = "~Altura máxima da nota de rodapé" ;
        Text [ finnish ] = "Max. ~Height of Footnote" ;
        Text [ danish ] = "Maks. højde fodnote" ;
        Text [ french ] = "Hauteur max. du ~pied de page" ;
        Text [ swedish ] = "Fotnotens ma~x höjd" ;
        Text [ dutch ] = "~Maximum hoogte voetnoot" ;
        Text [ spanish ] = "Altura máx. de ~nota al pie" ;
        Text [ english_us ] = "Maximum footnote ~height" ;
        Text[ chinese_simplified ] = "×¢½ÅµÄ×î¸ß¶È(~H)";
        Text[ russian ] = "Ìàêñ. âûñîòà ñíîñêè";
        Text[ polish ] = "~Maks. wysokoœæ przypisów doln.";
        Text[ japanese ] = "‹r’‚̍ō‚‚̍‚‚³(~H)";
        Text[ chinese_traditional ] = "µù¸}ªº³Ì°ª(~H)";
        Text[ arabic ] = "ÇáÇÑÊÝÇÚ ÇáÃÞÕì ááÍÇÔíÉ ÇáÓÝáíÉ";
        Text[ greek ] = "ÌÝãéóôï ýøïò õðïóçìåßùóçò";
        Text[ korean ] = "°¢ÁÖ ÃÖ´ë ³ôÀÌ(~H)";
        Text[ turkish ] = "Azami dipnot yüksekliði";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_MAXHEIGHT_PAGE
    {
        Pos = MAP_APPFONT ( 14 , 16 ) ;
        Size = MAP_APPFONT ( 95 , 10 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? Höhe maximal wie ~Seite : H÷he maximal wie ~Seite */
        Text = "Höhe maximal wie ~Seite" ;
        Text [ ENGLISH ] = "Page height at maximum" ;
        Text [ norwegian ] = "Maksimum Sidehøyde" ;
        Text [ italian ] = "Altezza massima come pagina" ;
        Text [ portuguese_brazilian ] = "Altura de página no m ximo" ;
        Text [ portuguese ] = "Não superior à área da página" ;
        Text [ finnish ] = "Sivun korkeus" ;
        Text [ danish ] = "Op til maksimal sidehøjde" ;
        Text [ french ] = "Hauteur maximale de la p~age" ;
        Text [ swedish ] = "Höjd maximalt som ~sidan" ;
        Text [ dutch ] = "Pag~inahoogte is max. hoogte" ;
        Text [ spanish ] = "Altura má~xima como página" ;
        Text [ english_us ] = "~Not larger than page area" ;
        TabStop = TRUE ;
        Group = TRUE ;
        Text[ chinese_simplified ] = "×î¸ß²»³¬¹ýÒ³¸ß(~N)";
        Text[ russian ] = "Íåáîëüøå âûñîòû ñòðàíèöû";
        Text[ polish ] = "Nie wy¿ej ni¿ na obszarze strony";
        Text[ japanese ] = "Å‚‚ÍÍß°¼Þ‚̍‚‚³(~N)";
        Text[ chinese_traditional ] = "³Ì°ª¤£¶W¹L­¶°ª(~N)";
        Text[ arabic ] = "áíÓ ÃßÈÑ ãä äØÇÞ ÇáÕÝÍÉ";
        Text[ greek ] = "¼÷é ìåãáëýôåñï ýøïò áðü ôçí ðåñéï÷Þ óåëßäáò";
        Text[ korean ] = "ÆäÀÌÁö ¿µ¿ªº¸´Ù Å©Áö ¾Ê½À´Ï´Ù.(~N)";
        Text[ turkish ] = "En fazla sayfa yüksekliðinde";
        Text[ language_user1 ] = " ";
    };
    MetricField ED_MAXHEIGHT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 115 , 30 ) ;
        Size = MAP_APPFONT ( 42 , 12 ) ;
        TabStop = TRUE ;
        Group = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 50 ;
        Maximum = 99999 ;
        DecimalDigits = 2 ;
        Value = 200 ;
        Unit = FUNIT_CM ;
        First = 10 ;
        Last = 99999 ;
        SpinSize = 10 ;
    };
    FixedText FT_DIST
    {
        Pos = MAP_APPFONT ( 25 , 51 ) ;
        Size = MAP_APPFONT ( 85 , 10 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? ~Abstand zum Textkörper : ~Abstand zum Textk÷rper */
        Text = "~Abstand zum Textkörper" ;
        Text [ ENGLISH ] = "~Distance from Bodytext" ;
        Text [ norwegian ] = "~Avstand fra Hovedtekst" ;
        Text [ italian ] = "~Distanza dal corpo del testo" ;
        Text [ portuguese_brazilian ] = "~Distância do Corpo do Texto" ;
        Text [ portuguese ] = "~Distância até corpo do texto" ;
        Text [ finnish ] = "~Etäisyys runkotekstistä" ;
        Text [ danish ] = "Afstand til brødtekst" ;
        Text [ french ] = "~Écart du corps de texte" ;
        Text [ swedish ] = "A~vstånd från brödtext" ;
        Text [ dutch ] = "A~fstand tot tekst" ;
        Text [ spanish ] = "~Distancia al cuerpo del texto" ;
        Text [ english_us ] = "Space to text" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "ÖÁÕýÎĵľàÀë(~D)";
        Text[ russian ] = "Ðàññòîÿíèå îò òåêñòà";
        Text[ polish ] = "Odstep do obszaru tekstowego";
        Text[ japanese ] = "–{•¶‚܂ł̊Ԋu(~D)";
        Text[ chinese_traditional ] = "¦Ü¤º¤åªº¶ZÖÃ(~D)";
        Text[ arabic ] = "ÇáãÓÇÝÉ ÍÊì ÇáäÕ";
        Text[ greek ] = "~Áðüóôáóç áðü ôï óþìá êåéìÝíïõ";
        Text[ korean ] = "ÅØ½ºÆ®·Î ºÎÅÍ °Å¸®(~D)";
        Text[ turkish ] = "Metinden uzaklýk";
        Text[ language_user1 ] = " ";
    };
    MetricField ED_DIST
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 115 , 50 ) ;
        Size = MAP_APPFONT ( 42 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Maximum = 999 ;
        DecimalDigits = 2 ;
        Value = 10 ;
        Unit = FUNIT_CM ;
        First = 5 ;
        Last = 99999 ;
        SpinSize = 10 ;
    };
    GroupBox GB_FOOTNOTE_SIZE
    {
        Pos = MAP_APPFONT ( 6 , 2 ) ;
        Size = MAP_APPFONT ( 157 , 67 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? Fußnotenbereich : Fu˜notenbereich */
        Text = "Fußnotenbereich" ;
        Text [ ENGLISH ] = "Footnote range" ;
        Text [ norwegian ] = "+++Footnote range" ;
        Text [ italian ] = "Area note a piè pagina" ;
        Text [ portuguese_brazilian ] = "Faixa de nota de pé de página" ;
        Text [ portuguese ] = "Faixa da nota de rodapé" ;
        Text [ finnish ] = "Alaviitealue" ;
        Text [ danish ] = "Fodnoteområde" ;
        Text [ french ] = "Plage notes de bas de page" ;
        Text [ swedish ] = "Fotnotsområde" ;
        Text [ dutch ] = "Voetnotenbereik" ;
        Text [ spanish ] = "Área de la nota al pie" ;
        Text [ english_us ] = "Footnote area" ;
        Text[ chinese_simplified ] = "×¢½ÅÇøÓò";
        Text[ russian ] = "Îáëàñòü ñíîñîê";
        Text[ polish ] = "Obszar przypisów dolnych";
        Text[ japanese ] = "‹r’”͈Í";
        Text[ chinese_traditional ] = "µù¸}­S³ò";
        Text[ arabic ] = "äØÇÞ ÇáÍÇÔíÉ ÇáÓÝáíÉ";
        Text[ greek ] = "Ðåñéï÷Þ õðïóçìåßùóçò";
        Text[ korean ] = "°¢ÁÖ ¿µ¿ª";
        Text[ turkish ] = "Dipnot bölümü";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_LINEPOS
    {
        Pos = MAP_APPFONT ( 12 , 87 ) ;
        Size = MAP_APPFONT ( 26 , 10 ) ;
        Text = "~Position" ;
        Text [ English ] = "~Position" ;
        Left = TRUE ;
        Text [ portuguese ] = "~Posição" ;
        Text [ english_us ] = "~Position" ;
        Text [ portuguese_brazilian ] = "~Position" ;
        Text [ swedish ] = "~Position" ;
        Text [ danish ] = "Placering" ;
        Text [ italian ] = "~Posizione" ;
        Text [ spanish ] = "~Posición" ;
        Text [ french ] = "~Position" ;
        Text [ dutch ] = "~Positie" ;
        Text[ chinese_simplified ] = "λÖÃ(~P)";
        Text[ russian ] = "Ïîçèöèÿ";
        Text[ polish ] = "Pozycja";
        Text[ japanese ] = "ˆÊ’u(~P)";
        Text[ chinese_traditional ] = "¦ì¸m(~P)";
        Text[ arabic ] = "ÇáãæÖÚ";
        Text[ greek ] = "ÈÝóç";
        Text[ korean ] = "À§Ä¡(~P)";
        Text[ turkish ] = "Konum";
        Text[ language_user1 ] = " ";
    };
    ListBox DLB_LINEPOS
    {
        Pos = MAP_APPFONT ( 40 , 85 ) ;
        Size = MAP_APPFONT ( 57 , 40 ) ;
        TabStop = TRUE ;
        Group = TRUE ;
        DropDown = TRUE ;
        CurPos = 0 ;
        StringList =
        {
            < "Links" ; Default ; > ;
            < "Zentriert" ; Default ; > ;
            < "Rechts" ; Default ; > ;
        };
        StringList [ ENGLISH ] =
        {
            < "Links" ; Default ; > ;
            < "Zentriert" ; Default ; > ;
            < "Rechts" ; Default ; > ;
        };
        StringList [ norwegian ] =
        {
            < "Links" ; Default ; > ;
            < "Zentriert" ; Default ; > ;
            < "Rechts" ; Default ; > ;
        };
        StringList [ italian ] =
        {
            < "Sinistra" ; Default ; > ;
            < "Centrato" ; Default ; > ;
            < "Destra" ; Default ; > ;
        };
        StringList [ portuguese_brazilian ] =
        {
            < "Links" ; Default ; > ;
            < "Zentriert" ; Default ; > ;
            < "A Direita" ; Default ; > ;
        };
        StringList [ portuguese ] =
        {
            < "Esquerda" ; Default ; > ;
            < "Centrado" ; Default ; > ;
            < "Direita" ; Default ; > ;
        };
        StringList [ finnish ] =
        {
            < "Links" ; Default ; > ;
            < "Zentriert" ; Default ; > ;
            < "Rechts" ; Default ; > ;
        };
        StringList [ danish ] =
        {
            < "Venstre" ; Default ; > ;
            < "Centreret" ; Default ; > ;
            < "Højre" ; Default ; > ;
        };
        StringList [ french ] =
        {
            < "À gauche" ; Default ; > ;
            < "Centré" ; Default ; > ;
            < "À droite" ; Default ; > ;
        };
        StringList [ swedish ] =
        {
            < "Vänster" ; Default ; > ;
            < "Centrerad" ; Default ; > ;
            < "Höger" ; Default ; > ;
        };
        StringList [ dutch ] =
        {
            < "Links" ; Default ; > ;
            < "Gecentreerd" ; Default ; > ;
            < "Rechts" ; Default ; > ;
        };
        StringList [ spanish ] =
        {
            < "A la izquierda" ; Default ; > ;
            < "Centrado" ; Default ; > ;
            < "Derecha" ; Default ; > ;
        };
        StringList [ english_us ] =
        {
            < "Left" ; Default ; > ;
            < "Centered" ; Default ; > ;
            < "Right" ; Default ; > ;
        };
    StringList [ chinese_simplified ] =
    {
            < "×ó" ; Default ; > ;
        < "¾ÓÖÐ" ; Default ; > ;
        < "ÓÒ" ; Default ; > ;
    };
    StringList [ russian ] =
    {
            < "Ñëåâà" ; Default ; > ;
        < "Ïî öåíòðó" ; Default ; > ;
        < "Ñïðàâà" ; Default ; > ;
    };
    StringList [ polish ] =
    {
            < "Z lewej" ; Default ; > ;
        < "Wyœrodkowany" ; Default ; > ;
        < "Z prawej" ; Default ; > ;
    };
    StringList [ japanese ] =
    {
            < "¶" ; Default ; > ;
        < "’†‰›" ; Default ; > ;
        < "‰E" ; Default ; > ;
    };
    StringList [ chinese_traditional ] =
    {
            < "¥ª" ; Default ; > ;
        < "¸m¤¤" ; Default ; > ;
        < "¥k" ; Default ; > ;
    };
    StringList [ arabic ] =
    {
            < "Úáì ÇáíÓÇÑ" ; Default ; > ;
        < "ÊæÓíØ" ; Default ; > ;
        < "Úáì Çáíãíä" ; Default ; > ;
    };
    StringList [ greek ] =
    {
            < "ÁñéóôåñÜ" ; Default ; > ;
        < "ÊåíôñáñéóìÝíá" ; Default ; > ;
        < "ÄåîéÜ" ; Default ; > ;
    };
    StringList [ korean ] =
    {
            < "¿ÞÂÊ" ; Default ; > ;
        < "°¡¿îµ¥" ; Default ; > ;
        < "¿À¸¥ÂÊ" ; Default ; > ;
    };
    StringList [ turkish ] =
    {
            < "Sol" ; Default ; > ;
        < "Orta" ; Default ; > ;
        < "Sað" ; Default ; > ;
    };
    StringList [ language_user1 ] =
    {
            < " " ; Default ; > ;
        < " " ; Default ; > ;
        < " " ; Default ; > ;
    };
    };
    FixedText FT_LINETYPE
    {
        Pos = MAP_APPFONT ( 12 , 107 ) ;
        Size = MAP_APPFONT ( 26 , 10 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? Stär~ke : A~rt */
        Text = "Stär~ke" ;
        Text [ ENGLISH ] = "~Thickness" ;
        Group = TRUE ;
        Left = TRUE ;
        Text [ portuguese ] = "~Espessura da linha" ;
        Text [ english_us ] = "~Weight" ;
        Text [ portuguese_brazilian ] = "~Tipo" ;
        Text [ swedish ] = "Styr~ka" ;
        Text [ danish ] = "Styrke" ;
        Text [ italian ] = "~Spessore" ;
        Text [ spanish ] = "~Grosor" ;
        Text [ french ] = "~Épaisseur" ;
        Text [ dutch ] = "~Sterkte" ;
        Text[ chinese_simplified ] = "ÏßÌõ´Öϸ(~L)";
        Text[ russian ] = "Òîëùèíà ëèíèé";
        Text[ polish ] = "GruboϾ";
        Text[ japanese ] = "ü‚Ì‘¾‚³(~L)";
        Text[ chinese_traditional ] = "½u±ø²Ê²Ó(~L)";
        Text[ arabic ] = "Óõãúß ÇáÎØ";
        Text[ greek ] = "ÐÜ÷ïò ãñáììÞò";
        Text[ korean ] = "¼± µÎ²²(~W)";
        Text[ turkish ] = "Çizgi kal.";
        Text[ language_user1 ] = " ";
    };
    ListBox DLB_LINETYPE
    {
        Pos = MAP_APPFONT ( 40 , 105 ) ;
        Size = MAP_APPFONT ( 57 , 50 ) ;
        TabStop = TRUE ;
        Group = TRUE ;
        DropDown = TRUE ;
        CurPos = 0 ;
    };
    FixedText FT_LINEWIDTH
    {
        Pos = MAP_APPFONT ( 99 , 87 ) ;
        Size = MAP_APPFONT ( 105 , 10 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? Län~ge : Br~eite */
        Text = "Län~ge" ;
        Text [ ENGLISH ] = "~Length" ;
        Left = TRUE ;
        Text [ portuguese ] = "~Comprimento" ;
        Text [ english_us ] = "~Length" ;
        Text [ portuguese_brazilian ] = "~Largura" ;
        Text [ swedish ] = "L~ängd" ;
        Text [ danish ] = "Længde" ;
        Text [ italian ] = "~Lunghezza" ;
        Text [ spanish ] = "~Longitud" ;
        Text [ french ] = "~Longueur" ;
        Text [ dutch ] = "L~engte" ;
        Text[ chinese_simplified ] = "³¤¶È(~L)";
        Text[ russian ] = "Äëèíà";
        Text[ polish ] = "D³ugoœæ";
        Text[ japanese ] = "’·‚³(~L)";
        Text[ chinese_traditional ] = "ªø«×(~L)";
        Text[ arabic ] = "ÇáØæá";
        Text[ greek ] = "ÌÞêïò";
        Text[ korean ] = "±æÀÌ(~L)";
        Text[ turkish ] = "Uzunluk";
        Text[ language_user1 ] = " ";
    };
    MetricField ED_LINEWIDTH
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 208 , 84 ) ;
        Size = MAP_APPFONT ( 42 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Maximum = 100 ;
        Value = 100 ;
        Unit = FUNIT_CUSTOM ;
        CustomUnitText = "%" ;
        First = 10 ;
        Last = 100 ;
    };
    FixedText FT_LINEDIST
    {
        Pos = MAP_APPFONT ( 99 , 107 ) ;
        Size = MAP_APPFONT ( 105 , 10 ) ;
        Text = "Abstan~d zum Fußnoteninhalt" ;
        Text [ ENGLISH ] = "Distan~ce" ;
        Text [ norwegian ] = "Avsta~nd" ;
        Text [ italian ] = "Distanza dal contenuto delle note" ;
        Text [ portuguese_brazilian ] = "Distân~cia" ;
        Text [ portuguese ] = "E~spaçam. entre traço e texto" ;
        Text [ finnish ] = "~Etäisyys" ;
        Text [ danish ] = "Afstand til fodnoteindholdet" ;
        Text [ french ] = "~Écart entre trait et texte" ;
        Text [ swedish ] = "Avstå~nd till fotnotens innehåll" ;
        Text [ dutch ] = "~Afstand tot inhoud voetnoot" ;
        Text [ spanish ] = "~Espacio al contenido de la nota" ;
        Text [ english_us ] = "~Spacing to footnote contents" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "ÖÁ×¢½ÅÎĵļä¸ô(~S)";
        Text[ russian ] = "Ðàññòîÿíèå îò òåêñòà ñíîñêè";
        Text[ polish ] = "Odstêp do treœci przypisów dolnych";
        Text[ japanese ] = "‹r’‚܂ł̊Ԋu(~‚r)";
        Text[ chinese_traditional ] = "¦Üµù¸}¤åªº¶¡¹j(~S)";
        Text[ arabic ] = "ÇáãÓÇÝÉ ÍÊì ãÍÊæíÇÊ ÇáÍÇÔíÉ ÇáÓÝáíÉ";
        Text[ language_user1 ] = " ";
        Text[ greek ] = "Áðüó~ôáóç áðü ôï ðåñéå÷üìåíï õðïóçìåßùóçò";
        Text[ korean ] = "°¢ÁÖ ³»¿ë¿¡ °£°ÝÁÖ±â(~S)";
        Text[ turkish ] = "Dipnot içeriðine uzaklýk";
    };
    MetricField ED_LINEDIST
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 208 , 104 ) ;
        Size = MAP_APPFONT ( 42 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Maximum = 999 ;
        DecimalDigits = 2 ;
        Value = 10 ;
        Unit = FUNIT_CM ;
        First = 5 ;
        Last = 99999 ;
        SpinSize = 10 ;
    };
    GroupBox GB_LINE
    {
        Pos = MAP_APPFONT ( 6 , 72 ) ;
        Size = MAP_APPFONT ( 247 , 57 ) ;
        Text = "Trennlinie" ;
        Text [ ENGLISH ] = "Line" ;
        Text [ norwegian ] = "Linje" ;
        Text [ italian ] = "Linea di separazione" ;
        Text [ portuguese_brazilian ] = "Linha" ;
        Text [ portuguese ] = "Separador" ;
        Text [ finnish ] = "Viiva" ;
        Text [ danish ] = "Skillelinje" ;
        Text [ french ] = "Trait de séparation" ;
        Text [ swedish ] = "Skiljelinje" ;
        Text [ dutch ] = "Scheidingslijn" ;
        Text [ spanish ] = "Línea de separación" ;
        Text [ english_us ] = "Separator line" ;
        Text[ chinese_simplified ] = "·Ö¸ôÏß";
        Text[ russian ] = "Ðàçäåëèòåëüíàÿ ëèíèÿ";
        Text[ polish ] = "Linia podzia³u";
        Text[ japanese ] = "‹æØ‚èü";
        Text[ chinese_traditional ] = "¤À¹j½u";
        Text[ arabic ] = "ÇáÎØ ÇáÝÇÕá";
        Text[ greek ] = "Äéá÷ùñéóôéêÞ ãñáììÞ";
        Text[ korean ] = "±¸ºÐ¼±";
        Text[ turkish ] = "Ayýrma çizgisi";
        Text[ language_user1 ] = " ";
    };
    Window WN_BSP
    {
        Pos = MAP_APPFONT ( 175 , 12 ) ;
        Size = MAP_APPFONT ( 72 , 52 ) ;
        Text = "Window" ;
    };
    GroupBox GB_BSP
    {
        Pos = MAP_APPFONT ( 169 , 2 ) ;
        Size = MAP_APPFONT ( 84 , 67 ) ;
        Text = "Vorschau" ;
        Text [ ENGLISH ] = "Example" ;
        Text [ norwegian ] = "Eksempel" ;
        Text [ italian ] = "Anteprima" ;
        Text [ portuguese_brazilian ] = "Exemplo" ;
        Text [ portuguese ] = "Previsualizar" ;
        Text [ finnish ] = "Malli" ;
        Text [ danish ] = "Eksempel" ;
        Text [ french ] = "Aperçu" ;
        Text [ swedish ] = "Förhandsvisning" ;
        Text [ dutch ] = "Voorbeeld" ;
        Text [ spanish ] = "Previsualización" ;
        Text [ english_us ] = "Preview" ;
        Text[ chinese_simplified ] = "Ô¤ÊÓ";
        Text[ russian ] = "Ïðîñìîòð";
        Text[ polish ] = "Podgl¹d";
        Text[ japanese ] = "ÌßÚËÞ­°";
        Text[ chinese_traditional ] = "¹wÄý";
        Text[ arabic ] = "ãÚÇíäÉ";
        Text[ greek ] = "Ðñïåðéóêüðçóç";
        Text[ korean ] = "¹Ì¸®º¸±â";
        Text[ turkish ] = "Önizleme";
        Text[ language_user1 ] = " ";
    };
};
diff --git a/sw/source/ui/misc/redlndlg.cxx b/sw/source/ui/misc/redlndlg.cxx
new file mode 100644
index 0000000..be1417d
--- /dev/null
+++ b/sw/source/ui/misc/redlndlg.cxx
@@ -0,0 +1,1708 @@
/*************************************************************************
 *
 *  $RCSfile: redlndlg.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:45 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#define _SVSTDARR_STRINGSSORTDTOR
#define _SVSTDARR_USHORTSSORT
#define _SVSTDARR_USHORTS

#ifndef _UIPARAM_HXX
#include <uiparam.hxx>
#endif

#ifndef _REDLINE_HXX
#include <redline.hxx>
#endif
#ifndef _REDLENUM_HXX
#include <redlenum.hxx>
#endif
#ifndef _TOOLS_INTN_HXX //autogen
#include <tools/intn.hxx>
#endif
#ifndef _DATETIME_HXX //autogen
#include <tools/datetime.hxx>
#endif
#ifndef _SV_MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SVSTDARR_HXX
#include <svtools/svstdarr.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SFXVIEWFRM_HXX //autogen
#include <sfx2/viewfrm.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SVX_CTREDLIN_HXX //autogen
#include <svx/ctredlin.hxx>
#endif
#ifndef _SVX_POSTATTR_HXX //autogen
#include <svx/postattr.hxx>
#endif
#ifndef _SVX_POSTDLG_HXX //autogen
#include <svx/postdlg.hxx>
#endif

#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _REDLNDLG_HXX
#define _REDLNACCEPTDLG
#include <redlndlg.hxx>
#endif
#ifndef _SWWAIT_HXX
#include <swwait.hxx>
#endif

#ifndef _HELPID_H
#include <helpid.h>
#endif
#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _MISC_HRC
#include <misc.hrc>
#endif
#ifndef _REDLNDLG_HRC
#include <redlndlg.hrc>
#endif
#ifndef _SHELLS_HRC
#include <shells.hrc>
#endif

#define C2S(cChar) UniString::CreateFromAscii(cChar)
/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

SFX_IMPL_MODELESSDIALOG( SwRedlineAcceptChild, FN_REDLINE_ACCEPT )

struct SwRedlineDataChild
{
    const SwRedlineData*        pChild;     // Verweis auf originale gestackte Daten
    const SwRedlineDataChild*   pNext;      // Verweis auf gestackte Daten
    SvLBoxEntry*                pTLBChild;  // zugehoeriger TreeListBox-Eintrag
};

struct SwRedlineDataParent
{
    const SwRedlineData*        pData;      // RedlineDataPtr
    const SwRedlineDataChild*   pNext;      // Verweis auf gestackte Daten
    SvLBoxEntry*                pTLBParent; // zugehoeriger TreeListBox-Eintrag
    String                      sComment;   // Redline-Kommentar

    inline BOOL operator==( const SwRedlineDataParent& rObj ) const
                        { return (pData && pData->GetSeqNo() == rObj.pData->GetSeqNo()); }
    inline BOOL operator< ( const SwRedlineDataParent& rObj ) const
                        { return (pData && pData->GetSeqNo() <  rObj.pData->GetSeqNo()); }
};

typedef SwRedlineDataParent* SwRedlineDataParentPtr;
SV_DECL_PTRARR_DEL(SwRedlineDataParentArr, SwRedlineDataParentPtr, 10, 20)
SV_IMPL_PTRARR(SwRedlineDataParentArr, SwRedlineDataParentPtr)

SV_DECL_PTRARR_SORT(SwRedlineDataParentSortArr, SwRedlineDataParentPtr, 10, 20)
SV_IMPL_OP_PTRARR_SORT(SwRedlineDataParentSortArr, SwRedlineDataParentPtr)

typedef SwRedlineDataChild* SwRedlineDataChildPtr;
SV_DECL_PTRARR_DEL(SwRedlineDataChildArr, SwRedlineDataChildPtr, 4, 4)
SV_IMPL_PTRARR(SwRedlineDataChildArr, SwRedlineDataChildPtr)

typedef SvLBoxEntry* SvLBoxEntryPtr;
SV_DECL_PTRARR(SvLBoxEntryArr, SvLBoxEntryPtr, 100, 100)
SV_IMPL_PTRARR(SvLBoxEntryArr, SvLBoxEntryPtr)

static USHORT nSortMode = 0xffff;
static BOOL   bSortDir = TRUE;

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

class SwRedlineAcceptDlg
{
    Dialog*                 pParentDlg;
    SwRedlineDataParentArr  aRedlineParents;
    SwRedlineDataChildArr   aRedlineChilds;
    SwRedlineDataParentSortArr aUsedSeqNo;
    SvxAcceptChgCtr         aTabPagesCTRL;
    const International&    rIntl;
    PopupMenu               aPopup;
    Timer                   aDeselectTimer;
    Timer                   aSelectTimer;
    Bitmap                  aRootOpened;
    Bitmap                  aRootClosed;
    String                  sInserted;
    String                  sDeleted;
    String                  sFormated;
    String                  sTableChgd;
    String                  sFmtCollSet;
    String                  sFilterAction;
    String                  sAutoFormat;
    Size                    aBorderSz;
    SvxTPView*              pTPView;
    SvxRedlinTable*         pTable;
    Link                    aOldSelectHdl;
    Link                    aOldDeselectHdl;
    BOOL                    bOnlyFormatedRedlines;
    BOOL                    bHasReadonlySel;
    BOOL                    bRedlnAutoFmt;

    DECL_LINK( AcceptHdl,       void* );
    DECL_LINK( AcceptAllHdl,    void* );
    DECL_LINK( RejectHdl,       void* );
    DECL_LINK( RejectAllHdl,    void* );
    DECL_LINK( UndoHdl,         void* );
    DECL_LINK( DeselectHdl,     void* );
    DECL_LINK( SelectHdl,       void* );
    DECL_LINK( GotoHdl,         void* );
    DECL_LINK( CommandHdl,      void* );

    USHORT          CalcDiff(USHORT nStart, BOOL bChild);
    void            InsertChilds(SwRedlineDataParent *pParent, const SwRedline& rRedln, const USHORT nAutoFmt);
    void            InsertParents(USHORT nStart, USHORT nEnd = USHRT_MAX);
    void            RemoveParents(USHORT nStart, USHORT nEnd);
    void            InitAuthors();

    String          GetRedlineText(const SwRedline& rRedln, DateTime &rDateTime, USHORT nStack = 0);
    const String&   GetActionText(const SwRedline& rRedln, USHORT nStack = 0);
    USHORT          GetRedlinePos( const SvLBoxEntry& rEntry) const;

public:
    SwRedlineAcceptDlg(Dialog *pParent, BOOL bAutoFmt = FALSE);
    ~SwRedlineAcceptDlg();

    DECL_LINK( FilterChangedHdl, void *pDummy = 0 );

    inline SvxAcceptChgCtr* GetChgCtrl()        { return &aTabPagesCTRL; }
    inline BOOL     HasRedlineAutoFmt() const   { return bRedlnAutoFmt; }

    void            Init(USHORT nStart = 0);
    void            CallAcceptReject( BOOL bSelect, BOOL bAccept );

    void            Initialize(const String &rExtraData);
    void            FillInfo(String &rExtraData) const;

    virtual void    Activate();
    virtual void    Resize();
};

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

SwRedlineAcceptChild::SwRedlineAcceptChild( Window* pParent,
                                            USHORT nId,
                                            SfxBindings* pBindings,
                                            SfxChildWinInfo* pInfo ) :
    SwChildWinWrapper( pParent, nId )
{
    pWindow = new SwModelessRedlineAcceptDlg( pBindings, this, pParent);

    ((SwModelessRedlineAcceptDlg *)pWindow)->Initialize(pInfo);
}

/*--------------------------------------------------------------------
    Beschreibung: Nach Dok-Wechsel Dialog neu initialisieren
 --------------------------------------------------------------------*/

BOOL SwRedlineAcceptChild::ReInitDlg(SwDocShell *pDocSh)
{
    BOOL bRet;

    if ((bRet = SwChildWinWrapper::ReInitDlg(pDocSh)) == TRUE)  // Sofort aktualisieren, Dok-Wechsel
        ((SwModelessRedlineAcceptDlg*)GetWindow())->Activate();

    return bRet;
}

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

SwModelessRedlineAcceptDlg::SwModelessRedlineAcceptDlg( SfxBindings* pBindings,
                                                        SwChildWinWrapper* pChild,
                                                        Window *pParent) :
    SfxModelessDialog(pBindings, pChild, pParent, SW_RES(DLG_REDLINE_ACCEPT)),
    pChildWin       (pChild)
{
    pImplDlg = new SwRedlineAcceptDlg(this);

    FreeResource();
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwModelessRedlineAcceptDlg::Activate()
{
    SwView *pView = ::GetActiveView();

    if (!pView) // Kann passieren, wenn man auf eine andere App umschaltet, wenn
        return; // vorher eine Listbox im Dialog den Focus hatte (eigentlich THs Bug)

    SwDocShell *pDocSh = pView->GetDocShell();

    if (pChildWin->GetOldDocShell() != pDocSh)
    {   // Dok-Wechsel
        SwWait aWait( *pDocSh, FALSE );
        SwWrtShell* pSh = pView->GetWrtShellPtr();

        pChildWin->SetOldDocShell(pDocSh);  // Rekursion vermeiden (durch Modified-Hdl)

        BOOL bMod = pSh->IsModified();
        SfxBoolItem aShow(FN_REDLINE_SHOW, TRUE);
        pSh->GetView().GetViewFrame()->GetDispatcher()->Execute(
            FN_REDLINE_SHOW, SFX_CALLMODE_SYNCHRON|SFX_CALLMODE_RECORD, &aShow, 0L);
        if (!bMod)
            pSh->ResetModified();
        pImplDlg->Init();

        return;
    }

    pImplDlg->Activate();
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwModelessRedlineAcceptDlg::Initialize(SfxChildWinInfo *pInfo)
{
    String aStr;
    if (pInfo != NULL)
        pImplDlg->Initialize(pInfo->aExtraString);

    SfxModelessDialog::Initialize(pInfo);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwModelessRedlineAcceptDlg::FillInfo(SfxChildWinInfo& rInfo) const
{
    SfxModelessDialog::FillInfo(rInfo);
    pImplDlg->FillInfo(rInfo.aExtraString);
}

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

void SwModelessRedlineAcceptDlg::Resize()
{
    pImplDlg->Resize();
    SfxModelessDialog::Resize();
}

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

SwModelessRedlineAcceptDlg::~SwModelessRedlineAcceptDlg()
{
    delete pImplDlg;
}

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

SwModalRedlineAcceptDlg::SwModalRedlineAcceptDlg(Window *pParent) :
    SfxModalDialog(pParent, SW_RES(DLG_MOD_REDLINE_ACCEPT))
{
    pImplDlg = new SwRedlineAcceptDlg(this, TRUE);

    pImplDlg->Initialize(GetExtraData());
    pImplDlg->Activate();   // Zur Initialisierung der Daten

    FreeResource();
}

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

SwModalRedlineAcceptDlg::~SwModalRedlineAcceptDlg()
{
    AcceptAll(FALSE);   // Alles uebriggebliebene ablehnen
    pImplDlg->FillInfo(GetExtraData());

    delete pImplDlg;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwModalRedlineAcceptDlg::Activate()
{
}

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

void SwModalRedlineAcceptDlg::Resize()
{
    pImplDlg->Resize();
    SfxModalDialog::Resize();
}

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

void SwModalRedlineAcceptDlg::AcceptAll( BOOL bAccept )
{
    SvxTPFilter* pFilterTP = pImplDlg->GetChgCtrl()->GetFilterPage();

    if (pFilterTP->IsDate() || pFilterTP->IsAuthor() ||
        pFilterTP->IsRange() || pFilterTP->IsAction())
    {
        pFilterTP->CheckDate(FALSE);    // Alle Filter abschalten
        pFilterTP->CheckAuthor(FALSE);
        pFilterTP->CheckRange(FALSE);
        pFilterTP->CheckAction(FALSE);
        pImplDlg->FilterChangedHdl();
    }

    pImplDlg->CallAcceptReject( FALSE, bAccept );
}

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

SwRedlineAcceptDlg::SwRedlineAcceptDlg(Dialog *pParent, BOOL bAutoFmt) :
    pParentDlg      (pParent),
    rIntl           (Application::GetAppInternational()),
    aTabPagesCTRL   (pParent, SW_RES(CTRL_TABPAGES)),
    aPopup          (SW_RES(MN_REDLINE_POPUP)),
    aRootClosed     (SW_RES(BMP_ROOT_CLOSED)),
    aRootOpened     (SW_RES(BMP_ROOT_OPENED)),
    sInserted       (SW_RES(STR_REDLINE_INSERTED)),
    sDeleted        (SW_RES(STR_REDLINE_DELETED)),
    sFormated       (SW_RES(STR_REDLINE_FORMATED)),
    sTableChgd      (SW_RES(STR_REDLINE_TABLECHG)),
    sFmtCollSet     (SW_RES(STR_REDLINE_FMTCOLLSET)),
    sAutoFormat     (SW_RES(STR_REDLINE_AUTOFMT)),
    bOnlyFormatedRedlines( FALSE ),
    bHasReadonlySel ( FALSE ),
    bRedlnAutoFmt   (bAutoFmt)
{
    aTabPagesCTRL.SetHelpId(HID_REDLINE_CTRL);
    pTPView = aTabPagesCTRL.GetViewPage();
    pTable = pTPView->GetTableControl();

    pTPView->InsertWriterHeader();
    pTPView->SetAcceptClickHdl(LINK(this, SwRedlineAcceptDlg, AcceptHdl));
    pTPView->SetAcceptAllClickHdl(LINK(this, SwRedlineAcceptDlg, AcceptAllHdl));
    pTPView->SetRejectClickHdl(LINK(this, SwRedlineAcceptDlg, RejectHdl));
    pTPView->SetRejectAllClickHdl(LINK(this, SwRedlineAcceptDlg, RejectAllHdl));
    pTPView->SetUndoClickHdl(LINK(this, SwRedlineAcceptDlg, UndoHdl));

    aTabPagesCTRL.GetFilterPage()->SetReadyHdl(LINK(this, SwRedlineAcceptDlg, FilterChangedHdl));

    ListBox *pActLB = aTabPagesCTRL.GetFilterPage()->GetLbAction();
    pActLB->InsertEntry(sInserted);
    pActLB->InsertEntry(sDeleted);
    pActLB->InsertEntry(sFormated);
    pActLB->InsertEntry(sTableChgd);

    if (HasRedlineAutoFmt())
    {
        pActLB->InsertEntry(sFmtCollSet);
        pActLB->InsertEntry(sAutoFormat);
        pTPView->ShowUndo(TRUE);
        pTPView->DisableUndo();     // Noch gibts keine UNDO-Events
    }

    pActLB->SelectEntryPos(0);

    pTable->SetWindowBits(WB_HASLINES|WB_CLIPCHILDREN|WB_HASBUTTONS|WB_HASBUTTONSATROOT|WB_HSCROLL);
    pTable->SetNodeBitmaps( aRootClosed, aRootOpened );
    pTable->SetSelectionMode(MULTIPLE_SELECTION);
    pTable->SetHighlightRange(1);

    static long aStaticTabs[]=
    {
        4,10,70,120,170
    };

    pTable->SetTabs(aStaticTabs);

    // Minimalgroesse setzen
    Size aMinSz(aTabPagesCTRL.GetMinSizePixel());
    Point aPos(aTabPagesCTRL.GetPosPixel());

    aMinSz.Width() += (aPos.X() * 2 - 1);
    aMinSz.Height() += (aPos.Y() * 2 - 1);
    pParentDlg->SetMinOutputSizePixel(aMinSz);

    if (pParentDlg->GetOutputSizePixel().Width() < aMinSz.Width())
        pParentDlg->SetOutputSizePixel(Size(aMinSz.Width(), pParentDlg->GetOutputSizePixel().Height()));
    if (pParentDlg->GetOutputSizePixel().Height() < aMinSz.Height())
        pParentDlg->SetOutputSizePixel(Size(pParentDlg->GetOutputSizePixel().Width(), aMinSz.Height()));

    pTable->SortByCol(nSortMode, bSortDir);

    aOldSelectHdl = pTable->GetSelectHdl();
    aOldDeselectHdl = pTable->GetDeselectHdl();
    pTable->SetSelectHdl(LINK(this, SwRedlineAcceptDlg, SelectHdl));
    pTable->SetDeselectHdl(LINK(this, SwRedlineAcceptDlg, DeselectHdl));
    pTable->SetCommandHdl(LINK(this, SwRedlineAcceptDlg, CommandHdl));

    // Flackern der Buttons vermeiden:
    aDeselectTimer.SetTimeout(100);
    aDeselectTimer.SetTimeoutHdl(LINK(this, SwRedlineAcceptDlg, SelectHdl));

    // Mehrfachselektion der selben Texte vermeiden:
    aSelectTimer.SetTimeout(100);
    aSelectTimer.SetTimeoutHdl(LINK(this, SwRedlineAcceptDlg, GotoHdl));
}

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

SwRedlineAcceptDlg::~SwRedlineAcceptDlg()
{
}

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

void SwRedlineAcceptDlg::Init(USHORT nStart)
{
    SwWait aWait( *::GetActiveView()->GetDocShell(), FALSE );
    pTable->SetUpdateMode(FALSE);
    aUsedSeqNo.Remove((USHORT)0, aUsedSeqNo.Count());

    if (nStart)
        RemoveParents(nStart, aRedlineParents.Count() - 1);
    else
    {
        pTable->Clear();
        aRedlineChilds.DeleteAndDestroy(0, aRedlineChilds.Count());
        aRedlineParents.DeleteAndDestroy(nStart, aRedlineParents.Count() - nStart);
    }

    // Parents einfuegen
    InsertParents(nStart);
    InitAuthors();

    pTable->SetUpdateMode(TRUE);
}

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

void SwRedlineAcceptDlg::InitAuthors()
{
    SwWrtShell* pSh = ::GetActiveView()->GetWrtShellPtr();

    SvxTPFilter *pFilterPage = aTabPagesCTRL.GetFilterPage();

    String sAuthor;
    SvStringsSortDtor aStrings;
    String sOldAuthor(pFilterPage->GetSelectedAuthor());
    pFilterPage->ClearAuthors();

    String sParent;
    USHORT nCount = pSh->GetRedlineCount();

    bOnlyFormatedRedlines = TRUE;
    bHasReadonlySel = FALSE;
    BOOL bReadonlySel = FALSE;
    BOOL bIsNotFormated = FALSE;

    // Autoren ermitteln
    for (USHORT i = 0; i < nCount; i++)
    {
        const SwRedline& rRedln = pSh->GetRedline(i);

        if( bOnlyFormatedRedlines && REDLINE_FORMAT != rRedln.GetType() )
            bOnlyFormatedRedlines = FALSE;

        if( !bHasReadonlySel && rRedln.HasReadonlySel() )
            bHasReadonlySel = TRUE;

        String *pAuthor = new String(rRedln.GetAuthorString());
        if (!aStrings.Insert(pAuthor))
            delete pAuthor;

        for (USHORT nStack = 1; nStack < rRedln.GetStackCount(); nStack++)
        {
            pAuthor = new String(rRedln.GetAuthorString(nStack));
            if (!aStrings.Insert(pAuthor))
                delete pAuthor;
        }
    }

    for (i = 0; i < aStrings.Count(); i++)
        pFilterPage->InsertAuthor(*aStrings[i]);

    if (pFilterPage->SelectAuthor(sOldAuthor) == LISTBOX_ENTRY_NOTFOUND && aStrings.Count())
        pFilterPage->SelectAuthor(*aStrings[0]);

    BOOL bEnable = pTable->GetEntryCount() != 0;
    BOOL bSel = pTable->FirstSelected() != 0;

    SvLBoxEntry* pSelEntry = pTable->FirstSelected();
    while (pSelEntry)
    {
        USHORT nPos = GetRedlinePos(*pSelEntry);
        const SwRedline& rRedln = pSh->GetRedline( nPos );

        bIsNotFormated |= REDLINE_FORMAT != rRedln.GetType();
        pSelEntry = pTable->NextSelected(pSelEntry);
    }

    pTPView->EnableAccept( bEnable && bSel );
    pTPView->EnableReject( bEnable && bIsNotFormated && bSel );
    pTPView->EnableAcceptAll( bEnable && !bHasReadonlySel );
    pTPView->EnableRejectAll( bEnable && !bHasReadonlySel &&
                                !bOnlyFormatedRedlines );
}

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

String SwRedlineAcceptDlg::GetRedlineText(const SwRedline& rRedln, DateTime &rDateTime, USHORT nStack)
{
    String sEntry(GetActionText(rRedln, nStack));
    sEntry += '\t';
    sEntry += rRedln.GetAuthorString(nStack);
    sEntry += '\t';

    const DateTime &rDT = rRedln.GetTimeStamp(nStack);
    rDateTime = rDT;

    sEntry += rIntl.GetDate( rDT );
    sEntry += ' ';
    sEntry += rIntl.GetTime( rDT, FALSE, FALSE );
    sEntry += '\t';

    sEntry += rRedln.GetComment(nStack);

    return sEntry;
}

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

const String &SwRedlineAcceptDlg::GetActionText(const SwRedline& rRedln, USHORT nStack)
{
    switch( rRedln.GetType(nStack) )
    {
        case REDLINE_INSERT:    return sInserted;
        case REDLINE_DELETE:    return sDeleted;
        case REDLINE_FORMAT:    return sFormated;
        case REDLINE_TABLE:     return sTableChgd;
        case REDLINE_FMTCOLL:   return sFmtCollSet;
    }

    return aEmptyStr;
}

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

void SwRedlineAcceptDlg::Resize()
{
    Size aSz(pParentDlg->GetOutputSizePixel());

    Point aPos(aTabPagesCTRL.GetPosPixel());

    aSz.Width() -= (aPos.X() * 2 - 1);
    aSz.Height() -= (aPos.Y() * 2 - 1);

    aTabPagesCTRL.SetOutputSizePixel(aSz);
}

/*--------------------------------------------------------------------
    Beschreibung: Nach Aktivierung neu initialisieren
 --------------------------------------------------------------------*/

void SwRedlineAcceptDlg::Activate()
{
    SwView *pView = ::GetActiveView();
    SwWait aWait( *pView->GetDocShell(), FALSE );

    aUsedSeqNo.Remove((USHORT)0, aUsedSeqNo.Count());

    if (!pView) // Kann passieren, wenn man auf eine andere App umschaltet, wenn
        return; // vorher eine Listbox im Dialog den Focus hatte (eigentlich THs Bug)

/*  if (HasRedlineAutoFmt())
    {
        Init();
        return;
    }*/

    // Hat sich was geaendert?
    SwWrtShell* pSh = pView->GetWrtShellPtr();
    USHORT nCount = pSh->GetRedlineCount();

    // Anzahl und Pointer ueberpruefen
    SwRedlineDataParent *pParent = 0;

    for (USHORT i = 0; i < nCount; i++)
    {
        const SwRedline& rRedln = pSh->GetRedline(i);

        if (i >= aRedlineParents.Count())
        {
            // Neue Eintraege wurden angehaengt
            Init(i);
            return;
        }

        pParent = aRedlineParents[i];
        if (&rRedln.GetRedlineData() != pParent->pData)
        {
            // Redline-Parents wurden eingefuegt, geaendert oder geloescht
            if ((i = CalcDiff(i, FALSE)) == USHRT_MAX)
                return;
            continue;
        }

        const SwRedlineData *pRedlineData = rRedln.GetRedlineData().Next();
        const SwRedlineDataChild *pBackupData = pParent->pNext;

        if (!pRedlineData && pBackupData)
        {
            // Redline-Childs wurden geloescht
            if ((i = CalcDiff(i, TRUE)) == USHRT_MAX)
                return;
            continue;
        }
        else
        {
            while (pRedlineData)
            {
                if (pRedlineData != pBackupData->pChild)
                {
                    // Redline-Childs wurden eingefuegt, geaendert oder geloescht
                    if ((i = CalcDiff(i, TRUE)) == USHRT_MAX)
                        return;
                    continue;
                }
                if (pBackupData)
                    pBackupData = pBackupData->pNext;
                pRedlineData = pRedlineData->Next();
            }
        }
    }

    if (nCount != aRedlineParents.Count())
    {
        // Redlines wurden am Ende geloescht
        Init(nCount);
        return;
    }

    // Kommentar ueberpruefen
    for (i = 0; i < nCount; i++)
    {
        const SwRedline& rRedln = pSh->GetRedline(i);
        pParent = aRedlineParents[i];

        if(!rRedln.GetComment().Equals(pParent->sComment))
        {
            if (pParent->pTLBParent)
            {
                // Nur Kommentar aktualisieren
                pTable->SetEntryText(rRedln.GetComment(), pParent->pTLBParent, 3);
            }
            pParent->sComment = rRedln.GetComment();
        }
    }

    InitAuthors();
}

/* -----------------05.06.98 13:06-------------------
 *
 * --------------------------------------------------*/

USHORT SwRedlineAcceptDlg::CalcDiff(USHORT nStart, BOOL bChild)
{
    if (!nStart)
    {
        Init();
        return USHRT_MAX;
    }

    pTable->SetUpdateMode(FALSE);
    SwView *pView   = ::GetActiveView();
    SwWrtShell* pSh = pView->GetWrtShellPtr();
    USHORT nAutoFmt = HasRedlineAutoFmt() ? REDLINE_FORM_AUTOFMT : 0;
    SvLBoxTreeList* pModel = pTable->GetModel();
    SwRedlineDataParent *pParent = aRedlineParents[nStart];
    const SwRedline& rRedln = pSh->GetRedline(nStart);

    if (bChild)     // Sollte eigentlich nie vorkommen, aber sicher ist sicher...
    {
        // Alle Childs des Eintrags wegwerfen und neu initialisieren
        SwRedlineDataChildPtr pBackupData = (SwRedlineDataChildPtr)pParent->pNext;
        SwRedlineDataChildPtr pNext;

        while (pBackupData)
        {
            pNext = (SwRedlineDataChildPtr)pBackupData->pNext;
            if (pBackupData->pTLBChild)
                pModel->Remove(pBackupData->pTLBChild);

            aRedlineChilds.DeleteAndDestroy(aRedlineChilds.GetPos(pBackupData), 1);
            pBackupData = pNext;
        }
        pParent->pNext = 0;

        // Neue Childs einfuegen
        InsertChilds(pParent, rRedln, nAutoFmt);

        pTable->SetUpdateMode(TRUE);
        return nStart;
    }

    // Wurden Eintraege geloescht?
    const SwRedlineData *pRedlineData = &rRedln.GetRedlineData();
    for (USHORT i = nStart + 1; i < aRedlineParents.Count(); i++)
    {
        if (aRedlineParents[i]->pData == pRedlineData)
        {
            // Eintraege von nStart bis i-1 entfernen
            RemoveParents(nStart, i - 1);
            pTable->SetUpdateMode(TRUE);
            return nStart - 1;
        }
    }

    // Wurden Eintraege eingefuegt?
    USHORT nCount = pSh->GetRedlineCount();
    pRedlineData = aRedlineParents[nStart]->pData;

    for (i = nStart + 1; i < nCount; i++)
    {
        if (&pSh->GetRedline(i).GetRedlineData() == pRedlineData)
        {
            // Eintraege von nStart bis i-1 einfuegen
            InsertParents(nStart, i - 1);
            pTable->SetUpdateMode(TRUE);
            return nStart - 1;
        }
    }

    pTable->SetUpdateMode(TRUE);
    Init(nStart);   // Alle Eintraege bis zum Ende abgleichen
    return USHRT_MAX;
}

/* -----------------05.06.98 13:57-------------------
 *
 * --------------------------------------------------*/

void SwRedlineAcceptDlg::InsertChilds(SwRedlineDataParent *pParent, const SwRedline& rRedln, const USHORT nAutoFmt)
{
    String sChild;
    SwRedlineDataChild *pLastRedlineChild = 0;
    const SwRedlineData *pRedlineData = &rRedln.GetRedlineData();
    BOOL bAutoFmt = (rRedln.GetRealType() & nAutoFmt) != 0;

    const String *pAction = &GetActionText(rRedln);
    BOOL bValidParent = !sFilterAction.Len() || sFilterAction == *pAction;
    bValidParent = bValidParent && pTable->IsValidEntry(&rRedln.GetAuthorString(), &rRedln.GetTimeStamp(), &rRedln.GetComment());
    if (nAutoFmt)
    {
        USHORT nPos;

        if (pParent->pData->GetSeqNo() && !aUsedSeqNo.Insert(pParent, nPos))    // Gibts schon
        {
            if (pParent->pTLBParent)
            {
                pTable->SetEntryText(sAutoFormat, aUsedSeqNo[nPos]->pTLBParent, 0);
                pTable->GetModel()->Remove(pParent->pTLBParent);
                pParent->pTLBParent = 0;
            }
            return;
        }
        bValidParent = bValidParent && bAutoFmt;
    }
    BOOL bValidTree = bValidParent;

    for (USHORT nStack = 1; nStack < rRedln.GetStackCount(); nStack++)
    {
        pRedlineData = pRedlineData->Next();

        SwRedlineDataChildPtr pRedlineChild = new SwRedlineDataChild;
        pRedlineChild->pChild = pRedlineData;
        aRedlineChilds.Insert(pRedlineChild, aRedlineChilds.Count());

        if ( pLastRedlineChild )
            pLastRedlineChild->pNext = pRedlineChild;
        else
            pParent->pNext = pRedlineChild;

        pAction = &GetActionText(rRedln, nStack);
        BOOL bValidChild = !sFilterAction.Len() || sFilterAction == *pAction;
        bValidChild = bValidChild && pTable->IsValidEntry(&rRedln.GetAuthorString(nStack), &rRedln.GetTimeStamp(nStack), &rRedln.GetComment());
        if (nAutoFmt)
            bValidChild = bValidChild && bAutoFmt;
        bValidTree |= bValidChild;

        if (bValidChild)
        {
            RedlinData *pData = new RedlinData;
            pData->pData = pRedlineChild;
            pData->bDisabled = TRUE;
            sChild = GetRedlineText(rRedln, pData->aDateTime, nStack);

            SvLBoxEntry* pChild = pTable->InsertEntry(sChild, pData, pParent->pTLBParent);

            pRedlineChild->pTLBChild = pChild;
            if (!bValidParent)
                pTable->Expand(pParent->pTLBParent);
        }
        else
            pRedlineChild->pTLBChild = 0;

        pLastRedlineChild = pRedlineChild;
    }

    if (pLastRedlineChild)
        pLastRedlineChild->pNext = 0;

    if (!bValidTree && pParent->pTLBParent)
    {
        pTable->GetModel()->Remove(pParent->pTLBParent);
        pParent->pTLBParent = 0;
        if (nAutoFmt)
            aUsedSeqNo.Remove(pParent);
    }
}

/* -----------------05.06.98 15:20-------------------
 *
 * --------------------------------------------------*/

void SwRedlineAcceptDlg::RemoveParents(USHORT nStart, USHORT nEnd)
{
    SwWrtShell* pSh = ::GetActiveView()->GetWrtShellPtr();
    USHORT nCount = pSh->GetRedlineCount();

    SvLBoxEntryArr aLBoxArr;

    // Wegen Bug der TLB, die bei Remove den SelectHandler IMMER ruft:
    pTable->SetSelectHdl(aOldSelectHdl);
    pTable->SetDeselectHdl(aOldDeselectHdl);
    BOOL bChildsRemoved = FALSE;
    pTable->SelectAll(FALSE);

    // Hinter dem letzten Eintrag Cursor setzen, da sonst Performance-Problem in TLB.
    // TLB wuerde sonst bei jedem Remove den Cursor erneut umsetzen (teuer)
    USHORT nPos = Min((USHORT)nCount, (USHORT)aRedlineParents.Count()) - 1;
    SvLBoxEntry *pCurEntry = aRedlineParents[nPos]->pTLBParent;
    if (!pCurEntry)
        while (--nPos && (pCurEntry = aRedlineParents[nPos]->pTLBParent) == 0);

    if (pCurEntry)
        pTable->SetCurEntry(pCurEntry);

    SvLBoxTreeList* pModel = pTable->GetModel();

    for (USHORT i = nStart; i <= nEnd; i++)
    {
        if (!bChildsRemoved && aRedlineParents[i]->pNext)
        {
            SwRedlineDataChildPtr pChildPtr = (SwRedlineDataChildPtr)aRedlineParents[i]->pNext;
            USHORT nPos = aRedlineChilds.GetPos(pChildPtr);

            if (nPos != USHRT_MAX)
            {
                USHORT nChilds = 0;

                while (pChildPtr)
                {
                    pChildPtr = (SwRedlineDataChildPtr)pChildPtr->pNext;
                    nChilds++;
                }

                aRedlineChilds.DeleteAndDestroy(nPos, nChilds);
                bChildsRemoved = TRUE;
            }
        }
        SvLBoxEntry *pEntry = aRedlineParents[i]->pTLBParent;
        if (pEntry)
        {
            long nIdx = (long)aLBoxArr.Count() - 1L;
            ULONG nAbsPos = pModel->GetAbsPos(pEntry);
            while (nIdx >= 0 &&
                    pModel->GetAbsPos(aLBoxArr[nIdx]) > nAbsPos)
                nIdx--;
            aLBoxArr.Insert(pEntry, ++nIdx);
        }
    }

    // TLB von hinten abraeumen
    long nIdx = (long)aLBoxArr.Count() - 1L;
    while (nIdx >= 0)
        pModel->Remove(aLBoxArr[nIdx--]);

    pTable->SetSelectHdl(LINK(this, SwRedlineAcceptDlg, SelectHdl));
    pTable->SetDeselectHdl(LINK(this, SwRedlineAcceptDlg, DeselectHdl));
    // Durch Remove wurde leider wieder dauernd von der TLB selektiert...
    pTable->SelectAll(FALSE);

    aRedlineParents.DeleteAndDestroy( nStart, nEnd - nStart + 1);
}

/* -----------------05.06.98 15:20-------------------
 *
 * --------------------------------------------------*/

void SwRedlineAcceptDlg::InsertParents(USHORT nStart, USHORT nEnd)
{
    SwView *pView   = ::GetActiveView();
    SwWrtShell* pSh = pView->GetWrtShellPtr();
    USHORT nAutoFmt = HasRedlineAutoFmt() ? REDLINE_FORM_AUTOFMT : 0;

    String sParent;
    USHORT nCount = pSh->GetRedlineCount();
    nEnd = Min((USHORT)nEnd, (USHORT)(nCount - 1)); // Handelt auch nEnd=USHRT_MAX (bis zum Ende) ab

    if (nEnd == USHRT_MAX)
        return;     // Keine Redlines im Dokument

    RedlinData *pData = 0;
    SvLBoxEntry* pParent = 0;
    SwRedlineDataParentPtr pRedlineParent = 0;

    for (USHORT i = nStart; i <= nEnd; i++)
    {
        const SwRedline& rRedln = pSh->GetRedline(i);
        const SwRedlineData *pRedlineData = &rRedln.GetRedlineData();

        pRedlineParent = new SwRedlineDataParent;
        pRedlineParent->pData    = pRedlineData;
        pRedlineParent->pNext    = 0;
        pRedlineParent->sComment = rRedln.GetComment();
        aRedlineParents.Insert(pRedlineParent, i);

        pData = new RedlinData;
        pData->pData = pRedlineParent;
        pData->bDisabled = FALSE;

        sParent = GetRedlineText(rRedln, pData->aDateTime);
        pParent = pTable->InsertEntry(sParent, pData, 0, i);
        pRedlineParent->pTLBParent = pParent;

        InsertChilds(pRedlineParent, rRedln, nAutoFmt);
    }
}

/* -----------------05.06.98 13:06-------------------
 *
 * --------------------------------------------------*/

void SwRedlineAcceptDlg::CallAcceptReject( BOOL bSelect, BOOL bAccept )
{
    SwWrtShell* pSh = ::GetActiveView()->GetWrtShellPtr();
    SvLBoxEntry* pEntry = bSelect ? pTable->FirstSelected() : pTable->First();
    ULONG nPos = LONG_MAX;
    SvUShortsSort aIdx;

    while( pEntry )
    {
        if( !pTable->GetParent( pEntry ) )
        {
            if( bSelect && LONG_MAX == nPos )
                nPos = pTable->GetModel()->GetAbsPos( pEntry );

            RedlinData *pData = (RedlinData *)pEntry->GetUserData();

            if( !pData->bDisabled )
                aIdx.Insert(GetRedlinePos( *pEntry ));
        }

        pEntry = bSelect ? pTable->NextSelected(pEntry) : pTable->Next(pEntry);
    }

    BOOL (SwEditShell:: *FnAccRej)( USHORT ) = &SwEditShell::AcceptRedline;
    if( !bAccept )
        FnAccRej = &SwEditShell::RejectRedline;

    SwWait aWait( *pSh->GetView().GetDocShell(), TRUE );
    pSh->StartAction();
    pSh->StartUndo();

    for( USHORT i = aIdx.Count(); i; )
        (pSh->*FnAccRej)( aIdx[ --i ] );

    pSh->EndUndo();
    pSh->EndAction();

    Activate();

    if( ULONG_MAX != nPos && pTable->GetEntryCount() )
    {
        if( nPos >= pTable->GetEntryCount() )
            nPos = pTable->GetEntryCount() - 1;
        pEntry = pTable->GetEntry( nPos );
        if( !pEntry && nPos-- )
            pEntry = pTable->GetEntry( nPos );
        if( pEntry )
        {
            pTable->Select( pEntry );
            pTable->MakeVisible( pEntry );
            pTable->SetCurEntry(pEntry);
        }
    }
    pTPView->EnableUndo();
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

USHORT SwRedlineAcceptDlg::GetRedlinePos( const SvLBoxEntry& rEntry ) const
{
    SwWrtShell* pSh = ::GetActiveView()->GetWrtShellPtr();
    return pSh->FindRedlineOfData( *((SwRedlineDataParent*)((RedlinData *)
                                    rEntry.GetUserData())->pData)->pData );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwRedlineAcceptDlg, AcceptHdl, void*, EMPTYARG)
{
    CallAcceptReject( TRUE, TRUE );
    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwRedlineAcceptDlg, AcceptAllHdl, void*, EMPTYARG )
{
    CallAcceptReject( FALSE, TRUE );
    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwRedlineAcceptDlg, RejectHdl, void*, EMPTYARG )
{
    CallAcceptReject( TRUE, FALSE );
    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwRedlineAcceptDlg, RejectAllHdl, void*, EMPTYARG )
{
    CallAcceptReject( FALSE, FALSE );
    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwRedlineAcceptDlg, UndoHdl, void*, EMPTYARG )
{
    SwView * pView = ::GetActiveView();
    pView->GetViewFrame()->GetDispatcher()->
                Execute(SID_UNDO, SFX_CALLMODE_SYNCHRON);
    pTPView->EnableUndo(pView->GetSlotState(SID_UNDO) != 0);

    Activate();

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwRedlineAcceptDlg, FilterChangedHdl, void*, EMPTYARG )
{
    SvxTPFilter *pFilterTP = aTabPagesCTRL.GetFilterPage();

    if (pFilterTP->IsAction())
        sFilterAction = pFilterTP->GetLbAction()->GetSelectEntry();
    else
        sFilterAction = aEmptyStr;

    Init();

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwRedlineAcceptDlg, DeselectHdl, void*, EMPTYARG )
{
    // Flackern der Buttons vermeiden:
    aDeselectTimer.Start();

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwRedlineAcceptDlg, SelectHdl, void*, EMPTYARG )
{
    aDeselectTimer.Stop();
    aSelectTimer.Start();

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwRedlineAcceptDlg, GotoHdl, void*, EMPTYARG )
{
    SwWrtShell* pSh = ::GetActiveView()->GetWrtShellPtr();
    aSelectTimer.Stop();

    BOOL bIsNotFormated = FALSE;
    BOOL bSel = FALSE;
    BOOL bReadonlySel = FALSE;

    SvLBoxEntry* pSelEntry = pTable->FirstSelected();
    if( pSelEntry )
    {
        SvLBoxEntry* pActEntry = pSelEntry;
        pSh->StartAction();
        pSh->EnterStdMode();
        pSh->SetCareWin(pParentDlg);

        while (pSelEntry)
        {
            if (pTable->GetParent(pSelEntry))
            {
                pActEntry = pTable->GetParent(pSelEntry);

                if (pTable->IsSelected(pActEntry))
                {
                    pSelEntry = pActEntry = pTable->NextSelected(pSelEntry);
                    continue;   // Nicht zweimal selektieren
                }
            }
            else
                bSel = TRUE;

            USHORT nPos = GetRedlinePos(*pActEntry);

            const SwRedline& rRedln = pSh->GetRedline( nPos );
            bIsNotFormated |= REDLINE_FORMAT != rRedln.GetType();

            if( !bReadonlySel && rRedln.HasReadonlySel() )
                bReadonlySel = TRUE;

            if (pSh->GotoRedline(nPos, TRUE))
            {
                pSh->SetInSelect();
                pSh->EnterAddMode();
            }

            pSelEntry = pActEntry = pTable->NextSelected(pSelEntry);
        }

        pSh->LeaveAddMode();
        pSh->EndAction();
        pSh->SetCareWin(NULL);
    }
    pTPView->EnableAccept( bSel && !bReadonlySel );
    pTPView->EnableReject( bSel && bIsNotFormated && !bReadonlySel );
    pTPView->EnableRejectAll( !bOnlyFormatedRedlines && !bHasReadonlySel );

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwRedlineAcceptDlg, CommandHdl, void*, EMPTYARG )
{
    const CommandEvent aCEvt(pTable->GetCommandEvent());

    switch ( aCEvt.GetCommand() )
    {
        case COMMAND_CONTEXTMENU:
        {
            SwWrtShell* pSh = ::GetActiveView()->GetWrtShellPtr();
            SvLBoxEntry* pEntry = pTable->FirstSelected();
            const SwRedline *pRed = 0;

            if (pEntry)
            {
                SvLBoxEntry* pTopEntry = pEntry;

                if (pTable->GetParent(pEntry))
                    pTopEntry = pTable->GetParent(pEntry);

                USHORT nPos = GetRedlinePos(*pTopEntry);

                // Bei geschuetzten Bereichen kommentieren disablen
                if ((pRed = pSh->GotoRedline(nPos, TRUE)) != 0)
                {
                    if( pSh->IsCrsrPtAtEnd() )
                        pSh->SwapPam();
                    pSh->SetInSelect();
                }
            }

            aPopup.EnableItem( MN_EDIT_COMMENT, pEntry && pRed &&
                                            !pTable->GetParent(pEntry) &&
                                            !pTable->NextSelected(pEntry) &&
                                            !pRed->HasReadonlySel() );

            aPopup.EnableItem( MN_SUB_SORT, pTable->First() != 0 );
            USHORT nColumn = pTable->GetSortedCol();
            if (nColumn == 0xffff)
                nColumn = 4;

            PopupMenu *pSubMenu = aPopup.GetPopupMenu(MN_SUB_SORT);
            if (pSubMenu)
            {
                for (USHORT i = MN_SORT_ACTION; i < MN_SORT_ACTION + 5; i++)
                    pSubMenu->CheckItem(i, FALSE);

                pSubMenu->CheckItem(nColumn + MN_SORT_ACTION);
            }

            USHORT nRet = aPopup.Execute(pTable, aCEvt.GetMousePosPixel());

            switch( nRet )
            {
            case MN_EDIT_COMMENT:
                {
                    String sComment;

                    if (pEntry)
                    {
                        if (pTable->GetParent(pEntry))
                            pEntry = pTable->GetParent(pEntry);

                        USHORT nPos = GetRedlinePos(*pEntry);

                        const SwRedline &rRedline = pSh->GetRedline(nPos);
                        sComment = rRedline.GetComment();
                        SfxItemSet aSet(pSh->GetAttrPool(), SvxPostItDialog::GetRanges());
                        const International& rIntl = Application::GetAppInternational();

                        aSet.Put(SvxPostItTextItem(sComment.ConvertLineEnd(), SID_ATTR_POSTIT_TEXT));
                        aSet.Put(SvxPostItAuthorItem(rRedline.GetAuthorString(), SID_ATTR_POSTIT_AUTHOR));

                        const DateTime &rDT = rRedline.GetRedlineData().GetTimeStamp();

                        String sDate(rIntl.GetDate( rDT ));
                        (sDate += ' ' ) += rIntl.GetTime( rDT, FALSE, FALSE );

                        aSet.Put(SvxPostItDateItem(sDate, SID_ATTR_POSTIT_DATE));

                        SvxPostItDialog *pDlg = new SvxPostItDialog(pParentDlg, aSet, FALSE);
                        pDlg->HideAuthor();

                        USHORT nResId = 0;
                        switch( rRedline.GetType() )
                        {
                        case REDLINE_INSERT:
                            nResId = STR_REDLINE_INSERTED;
                            break;
                        case REDLINE_DELETE:
                            nResId = STR_REDLINE_DELETED;
                            break;
                        case REDLINE_FORMAT:
                            nResId = STR_REDLINE_FORMATED;
                            break;
                        case REDLINE_TABLE:
                            nResId = STR_REDLINE_TABLECHG;
                            break;
                        }
                        String sTitle(SW_RES(STR_REDLINE_COMMENT));
                        if( nResId )
                            sTitle += SW_RESSTR( nResId );
                        pDlg->SetText(sTitle);

                        pSh->SetCareWin(pDlg);

                        if ( pDlg->Execute() == RET_OK )
                        {
                            const SfxItemSet* pOutSet = pDlg->GetOutputItemSet();
                            String sMsg(((const SvxPostItTextItem&)pOutSet->Get(SID_ATTR_POSTIT_TEXT)).GetValue());

                            // Kommentar einfuegen bzw aendern
                            pSh->SetRedlineComment(sMsg);
                            pTable->SetEntryText(sMsg, pEntry, 3);
                        }

                        delete pDlg;
                        pSh->SetCareWin(NULL);
                    }
                }
                break;

            case MN_SORT_ACTION:
            case MN_SORT_AUTHOR:
            case MN_SORT_DATE:
            case MN_SORT_COMMENT:
            case MN_SORT_POSITION:
                {
                    bSortDir = TRUE;
                    if (nRet - MN_SORT_ACTION == 4 && pTable->GetSortedCol() == 0xffff)
                        break;  // Haben wir schon

                    nSortMode = nRet - MN_SORT_ACTION;
                    if (nSortMode == 4)
                        nSortMode = 0xffff; // unsortiert bzw sortiert nach Position

                    if (pTable->GetSortedCol() == nSortMode)
                        bSortDir = !pTable->GetSortDirection();

                    SwWait aWait( *::GetActiveView()->GetDocShell(), FALSE );
                    pTable->SortByCol(nSortMode, bSortDir);
                    if (nSortMode == 0xffff)
                        Init();             // Alles neu fuellen
                }
                break;
            }
        }
        break;
    }

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwRedlineAcceptDlg::Initialize(const String& rExtraData)
{
    if (rExtraData.Len())
    {
        USHORT nPos = rExtraData.Search(C2S("AcceptChgDat:"));

        // Versuche, den Alignment-String "ALIGN:(...)" einzulesen; wenn
        // er nicht vorhanden ist, liegt eine "altere Version vor
        if (nPos != STRING_NOTFOUND)
        {
            USHORT n1 = rExtraData.Search('(', nPos);
            if (n1 != STRING_NOTFOUND)
            {
                USHORT n2 = rExtraData.Search(')', n1);
                if (n2 != STRING_NOTFOUND)
                {
                    // Alignment-String herausschneiden
                    String aStr = rExtraData.Copy(nPos, n2 - nPos + 1);
                    aStr.Erase(0, n1 - nPos + 1);

                    if (aStr.Len())
                    {
                        USHORT nCount = aStr.ToInt32();

                        for (USHORT i = 0; i < nCount; i++)
                        {
                            USHORT n1 = aStr.Search(';');
                            aStr.Erase(0, n1 + 1);
                            pTable->SetTab(i, aStr.ToInt32(), MAP_PIXEL);
                        }
                    }
                }
            }
        }
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwRedlineAcceptDlg::FillInfo(String &rExtraData) const
{
    rExtraData.AppendAscii("AcceptChgDat:(");

    USHORT  nCount = pTable->TabCount();

    rExtraData += String(nCount);
    rExtraData += ';';
    for(USHORT i = 0; i < nCount; i++)
    {
        rExtraData += String(pTable->GetTab(i));
        rExtraData += ';';
    }
    rExtraData += ')';
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.54  2000/09/18 16:05:59  willem.vandorp
    OpenOffice header added.

    Revision 1.53  2000/09/07 15:59:26  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.52  2000/06/14 09:06:30  os
    #75451# enabling of buttons corrected

    Revision 1.51  2000/04/18 15:08:17  os
    UNICODE

    Revision 1.50  2000/02/25 08:56:58  hr
    #73447#: removed temporary

    Revision 1.49  2000/02/11 14:56:07  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.48  1999/09/10 13:19:27  os
    Chg: resource types removed

    Revision 1.47  1999/07/08 14:31:40  MA
    Use internal object to toggle wait cursor


      Rev 1.46   08 Jul 1999 16:31:40   MA
   Use internal object to toggle wait cursor

      Rev 1.45   22 Jan 1999 11:51:20   JP
   Task #58677#: Crsr in Readonly Bereichen zulassen

      Rev 1.44   12 Jan 1999 14:37:10   OS
   #60805# ChildWindow darf kein Show rufen

      Rev 1.43   18 Nov 1998 15:44:28   OM
   #59103# Redlines nach Kommentaren filtern

      Rev 1.42   13 Nov 1998 16:41:08   OM
   #59103# Autofmt-Redlines: zusammengehoerige filtern

      Rev 1.41   13 Nov 1998 15:35:18   OM
   #59103# Autofmt-Redlines: zusammengehoerige filtern

      Rev 1.40   21 Oct 1998 10:56:34   OM
   #57586# Redlining nach Autoformat

      Rev 1.39   20 Oct 1998 17:52:22   OM
   #57586# Redlining nach Autoformat

      Rev 1.38   20 Oct 1998 11:39:04   OM
   #57586# Redlining nach Autoformat

      Rev 1.37   13 Oct 1998 16:09:38   OM
   #57859# Redline-Dlg: Spaltenbreite merken

      Rev 1.36   09 Oct 1998 17:05:22   JP
   Bug #57741#: neue ResourceIds

      Rev 1.35   18 Aug 1998 11:46:48   OM
   #54866# Nach Aktionen filtern

      Rev 1.34   28 Jul 1998 13:04:14   JP
   Bug #53951#: Selektionen nicht aufheben, wenn keine Selektion in der Listbox ist

      Rev 1.33   14 Jul 1998 14:19:54   OM
   #52859# Autor-Button nicht anzeigen

      Rev 1.32   13 Jul 1998 11:32:58   OM
   #51840# HelpId fuer Redline-Control

      Rev 1.31   10 Jun 1998 17:14:18   OM
   WaitCursor

      Rev 1.30   08 Jun 1998 17:58:16   OM
   Ohne Redlines kein GPF

      Rev 1.29   08 Jun 1998 15:04:22   OM
   Optimiert

      Rev 1.28   05 Jun 1998 17:13:16   OM
   Optimiert

      Rev 1.27   05 Jun 1998 10:46:00   OM
   Optimierungen

      Rev 1.26   03 Jun 1998 17:27:54   OM
   Performance Optimierungen

      Rev 1.25   03 Jun 1998 12:17:08   OM
   Performance Optimierungen

      Rev 1.24   07 Apr 1998 14:21:34   OM
   RedlinData nicht mehr selber loeschen

      Rev 1.23   07 Apr 1998 08:47:10   OM
   Linien anzeigen

      Rev 1.22   03 Apr 1998 13:05:30   OM
   Kein Absturz bei fehlender SwView

      Rev 1.21   01 Apr 1998 13:09:20   OM
   Rekursion vermieden

      Rev 1.20   31 Mar 1998 13:01:32   OM
   Redline-Kommentare in schreibgeschuetzten bereichen nicht editierbar

      Rev 1.19   27 Mar 1998 14:14:42   OM
   ChildWindows im Modified-Hdl updaten

      Rev 1.18   26 Mar 1998 21:48:36   JP
   CallAcceptReject: wenn Pos am Ende steht, dann sollte der letzte Eintrag wieder selektiert werden

      Rev 1.17   26 Mar 1998 15:30:16   JP
   optimiert und Accept/Reject - behalten ihre Position in der Liste

      Rev 1.16   24 Mar 1998 13:45:02   JP
   neu: Redline fuer harte Attributierung

      Rev 1.15   18 Mar 1998 18:30:46   OM
   #48735# GPF im Redlining behoben

      Rev 1.14   18 Mar 1998 11:34:10   OM
   Resize der Basisklasse rufen

      Rev 1.13   17 Mar 1998 09:36:22   OM
   Groesse korrekt initialisieren

      Rev 1.12   16 Mar 1998 19:10:42   OM
   Zugriff auf Ini optimiert

      Rev 1.11   16 Mar 1998 11:00:38   OM
   Autoren vom Dokument zusammensuchen

      Rev 1.10   16 Mar 1998 09:35:42   OM
   4 Spalten

      Rev 1.9   15 Mar 1998 16:20:36   OM
   Groesse merken

      Rev 1.8   10 Mar 1998 12:52:26   OM
   Keine Sortierung per Default

      Rev 1.7   09 Mar 1998 12:59:24   OM
   Sortieren und filtern

      Rev 1.6   09 Mar 1998 11:52:06   OM
   Sortieren und filtern

      Rev 1.5   07 Mar 1998 14:33:36   OM
   Filtern und sortieren

      Rev 1.4   03 Mar 1998 16:03:00   OM
   Aufgeraeumt

      Rev 1.3   03 Mar 1998 10:42:50   OM
   Redline-Browser

      Rev 1.2   28 Feb 1998 15:21:02   OM
   Author vorselektieren

      Rev 1.1   28 Feb 1998 15:12:06   OM
   Accept / reject changes

      Rev 1.0   27 Feb 1998 18:22:16   OM
   Initial revision.

------------------------------------------------------------------------*/
diff --git a/sw/source/ui/misc/redlndlg.hrc b/sw/source/ui/misc/redlndlg.hrc
new file mode 100644
index 0000000..ccd849d
--- /dev/null
+++ b/sw/source/ui/misc/redlndlg.hrc
@@ -0,0 +1,72 @@
/*************************************************************************
 *
 *  $RCSfile: redlndlg.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:45 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#define CTRL_TABPAGES       1

#define MN_EDIT_COMMENT     1
#define MN_SUB_SORT         2
#define MN_SORT_ACTION      3
#define MN_SORT_AUTHOR      4
#define MN_SORT_DATE        5
#define MN_SORT_COMMENT     6
#define MN_SORT_POSITION    7

#define XBORDER     3
#define YBORDER     3
diff --git a/sw/source/ui/misc/redlndlg.src b/sw/source/ui/misc/redlndlg.src
new file mode 100644
index 0000000..29c5344
--- /dev/null
+++ b/sw/source/ui/misc/redlndlg.src
@@ -0,0 +1,347 @@
/*************************************************************************
 *
 *  $RCSfile: redlndlg.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:45 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
/* StarView ressource file */

#include "redlndlg.hrc"
#include "misc.hrc"
#include "helpid.h"

#define WIDTH 297
#define HEIGHT 169

#define REDLNDLG \
    OutputSize = TRUE ; \
    SVLook = TRUE ; \
    Size = MAP_APPFONT ( WIDTH , HEIGHT ) ; \
    Moveable = TRUE ; \
    Closeable = TRUE ; \
    Sizeable = TRUE ; \
    Hide = TRUE ; \
    Control CTRL_TABPAGES\
    {\
        Pos = MAP_APPFONT ( XBORDER , YBORDER ) ; \
        Size = MAP_APPFONT ( WIDTH - XBORDER * 2 , HEIGHT - YBORDER * 2 ) ; \
        HelpID = HID_REDLINE_CTRL ; \
        TabStop = TRUE ; \
    };\

ModelessDialog DLG_REDLINE_ACCEPT
{
    HelpID = HID_REDLINE_ACCEPT ;
    /* ### ACHTUNG: Neuer Text in Resource? Änderungen akzeptieren oder verwerfen : Redlining */
    Text = "Änderungen akzeptieren oder verwerfen" ;
    Text [ English ] = "Accept or reject changes" ;
    Text [ english_us ] = "Accept or Reject Changes" ;
    Text [ portuguese_brazilian ] = "Redlining" ;
    Text [ swedish ] = "Acceptera eller kasta bort ändringarna" ;
    Text [ danish ] = "Accepter eller forkast ændringer" ;
    Text [ italian ] = "Accettare o rigettare le modifiche" ;
    Text [ spanish ] = "Aceptar o rechazar modificaciones" ;
    Text [ french ] = "Accepter ou rejeter les modifications" ;
    Text [ dutch ] = "Wijzigingen accepteren of verwerpen" ;
    Text [ portuguese ] = "Aceitar ou rejeitar modificações" ;
    REDLNDLG
    Text[ chinese_simplified ] = "½ÓÊÜ»òÕßÈ¡Ïû¸ü¸Ä";
    Text[ russian ] = "Ïðèíÿòü èëè îòêëîíèòü èçìåíåíèÿ";
    Text[ polish ] = "Zaakceptuj albo odrzuæ zmiany";
    Text[ japanese ] = "•ύX‰ÓŠ‚ÌŠm”F";
    Text[ chinese_traditional ] = "±µ¨ü©Î¨ú®øÅܧó";
    Text[ arabic ] = "ÞÈæá Ãæ ÑÝÖ ÇáÊÛííÑÇÊ";
    Text[ greek ] = "Áðïäï÷Þ Þ áðüññéøç áëëáãþí";
    Text[ korean ] = "º¯°æ Àû¿ë ¶Ç´Â Ãë¼Ò";
    Text[ turkish ] = "Deðiþiklikleri onayla ya da reddet";
    Text[ language_user1 ] = " ";
};

ModalDialog DLG_MOD_REDLINE_ACCEPT
{
    HelpID = HID_REDLINE_AUTOFMT_ACCEPT ;
    Text = "AutoFormat: Änderungen akzeptieren oder verwerfen" ;
    Text [ English ] = "Accept or reject AutoFormat changes" ;
    REDLNDLG
    Text[ italian ] = "Formattazione automatica: accetta o annulla cambiamenti";
    Text[ portuguese_brazilian ] = "Accept or reject AutoFormat changes";
    Text[ portuguese ] = "AutoFormato: aceitar ou rejeitar modificações";
    Text[ danish ] = "Accepter eller forkast AutoFormat ændringer";
    Text[ french ] = "Revoir les modifications de l'AutoFormat";
    Text[ swedish ] = "Acceptera eller kasta bort AutoFormat ändringar";
    Text[ dutch ] = "AutoOpmaak: Wijzigingen accepteren of verwerpen";
    Text[ spanish ] = "AutoFormato: Aceptar o rechazar cambios";
    Text[ english_us ] = "Accept or reject AutoFormat changes";
    Text[ chinese_simplified ] = "×Ô¶¯¸ñʽ: ½ÓÊÜ»òÕ߾ܾø¸ü¸Ä";
    Text[ russian ] = "Àâòîôîðìàò: ïðèíÿòü èëè îòêëîíèòü èçìåíåíèÿ";
    Text[ polish ] = "Autoformatowanie: Zaakceptuj lub odrzuæ zmiany";
    Text[ japanese ] = "µ°ÄÌ«°Ï¯Ä‚É‚æ‚é•ύX‚ÌŽÀs‚ ‚é‚¢‚Í·¬Ý¾Ù";
    Text[ chinese_traditional ] = "¦Û°Ê®æ¦¡: ±µ¨ü©Î©Úµ´Åܧó";
    Text[ arabic ] = "ÞÈæá Ãæ ÑÝÖ ÊÛííÑÇÊ ÇáÊäÓíÞ ÇáÊáÞÇÆí";
    Text[ greek ] = "ÁõôïÌïñöïðïßçóç:Áðïäï÷Þ Þ áðüññéøç áëëáãþí";
    Text[ korean ] = "ÀÚµ¿ ¼­½Ä º¯°æ Àû¿ë ¶Ç´Â Ãë¼Ò";
    Text[ turkish ] = "Otomatik formatlama: Deðiþiklikleri onayla ya da reddet";
    Text[ language_user1 ] = " ";
};

Menu MN_REDLINE_POPUP
{
    ItemList =
    {
        MenuItem
        {
            Identifier = MN_EDIT_COMMENT ;
            HelpID = HID_EDIT_COMMENT ;
            Text = "Kommentar bearbeiten..." ;
            Text [ English ] = "Edit Comment..." ;
            Text [ english_us ] = "Edit Comment..." ;
            Text [ portuguese_brazilian ] = "Kommentar bearbeiten..." ;
            Text [ swedish ] = "Bearbeta kommentar..." ;
            Text [ danish ] = "Rediger kommentar..." ;
            Text [ italian ] = "Modifica commento..." ;
            Text [ spanish ] = "Modificar comentario..." ;
            Text [ french ] = "Éditer le commentaire..." ;
            Text [ dutch ] = "Commentaar bewerken..." ;
            Text [ portuguese ] = "Editar comentário..." ;
            Text[ chinese_simplified ] = "±à¼­×¢½â...";
            Text[ russian ] = "Îáðàáîòêà êîììåíòàðèÿ...";
            Text[ polish ] = "Edytuj komentarz...";
            Text[ japanese ] = "ºÒÝĂ̕ҏW...";
            Text[ language_user1 ] = " ";
            Text[ chinese_traditional ] = "½s¿èª`¸Ñ...";
            Text[ arabic ] = "ÊÍÑíÑ ÇáÊÚáíÞ...";
            Text[ greek ] = "Åðåîåñãáóßá ó÷ïëßïõ...";
            Text[ korean ] = "¸Þ¸ð ÆíÁý...";
            Text[ turkish ] = "Açýklamalarý düzenle...";
        };
        MenuItem
        {
            Identifier = MN_SUB_SORT ;
            Text = "Sortiere" ;
            Text [ english ] = "Sort" ;
            RadioCheck = TRUE ;
            SubMenu = Menu
            {
                ItemList =
                {
                    MenuItem
                    {
                        Identifier = MN_SORT_ACTION ;
                        HelpID = HID_SORT_ACTION ;
                        Text = "Aktion" ;
                        Text [ english ] = "Action" ;
                        RadioCheck = TRUE ;
                        Text [ english_us ] = "Action" ;
                        Text [ portuguese_brazilian ] = "Aktion" ;
                        Text [ swedish ] = "Aktivitet" ;
                        Text [ danish ] = "Handling" ;
                        Text [ italian ] = "Operazione" ;
                        Text [ spanish ] = "Acción" ;
                        Text [ french ] = "Action" ;
                        Text [ dutch ] = "Activiteit" ;
                        Text [ portuguese ] = "Acção" ;
                        Text[ chinese_simplified ] = "²Ù×÷";
                        Text[ russian ] = "Äåéñòâèå";
                        Text[ polish ] = "Akcja";
                        Text[ japanese ] = "±¸¼®Ý";
                        Text[ language_user1 ] = " ";
                        Text[ chinese_traditional ] = "¾Þ§@";
                        Text[ arabic ] = "ÅÌÑÇÁ";
                        Text[ greek ] = "ÅíÝñãåéá";
                        Text[ korean ] = "µ¿ÀÛ";
                        Text[ turkish ] = "Ýþlem";
                    };
                    MenuItem
                    {
                        Identifier = MN_SORT_AUTHOR ;
                        HelpID = HID_SORT_AUTHOR ;
                        Text = "Autor" ;
                        Text [ english ] = "Author" ;
                        RadioCheck = TRUE ;
                        Text [ english_us ] = "Author" ;
                        Text [ portuguese_brazilian ] = "Autor" ;
                        Text [ swedish ] = "Författare" ;
                        Text [ danish ] = "Forfatter" ;
                        Text [ italian ] = "Autore" ;
                        Text [ spanish ] = "Autor" ;
                        Text [ french ] = "Auteur" ;
                        Text [ dutch ] = "Auteur" ;
                        Text [ portuguese ] = "Autor" ;
                        Text[ chinese_simplified ] = "×÷Õß";
                        Text[ russian ] = "Àâòîð";
                        Text[ polish ] = "Autor";
                        Text[ japanese ] = "ì¬ŽÒ";
                        Text[ chinese_traditional ] = "§@ªÌ";
                        Text[ arabic ] = "ÇáãÄáÝ";
                        Text[ greek ] = "ÓõíôÜêôçò";
                        Text[ korean ] = "ÀÛ¼ºÀÎ";
                        Text[ turkish ] = "Yazan";
                        Text[ language_user1 ] = " ";
                    };
                    MenuItem
                    {
                        Identifier = MN_SORT_DATE ;
                        HelpID = HID_SORT_DATE ;
                        Text = "Datum" ;
                        Text [ english ] = "Date" ;
                        RadioCheck = TRUE ;
                        Text [ english_us ] = "Date" ;
                        Text [ portuguese_brazilian ] = "Datum" ;
                        Text [ swedish ] = "Datum" ;
                        Text [ danish ] = "Dato" ;
                        Text [ italian ] = "Data" ;
                        Text [ spanish ] = "Fecha" ;
                        Text [ french ] = "Date" ;
                        Text [ dutch ] = "Datum" ;
                        Text [ portuguese ] = "Data" ;
                        Text[ chinese_simplified ] = "ÈÕÆÚ";
                        Text[ russian ] = "Äàòà";
                        Text[ polish ] = "Data";
                        Text[ japanese ] = "“ú•t";
                        Text[ chinese_traditional ] = "¤é´Á";
                        Text[ arabic ] = "ÇáÊÇÑíÎ";
                        Text[ greek ] = "Çìåñïìçíßá";
                        Text[ korean ] = "ÀÏÀÚ";
                        Text[ turkish ] = "Tarih";
                        Text[ language_user1 ] = " ";
                    };
                    MenuItem
                    {
                        Identifier = MN_SORT_COMMENT ;
                        HelpID = HID_SORT_COMMENT ;
                        Text = "Beschreibung" ;
                        Text [ english ] = "Comment" ;
                        RadioCheck = TRUE ;
                        Text [ english_us ] = "Comment" ;
                        Text [ portuguese_brazilian ] = "Beschreibung" ;
                        Text [ swedish ] = "Beskrivning" ;
                        Text [ danish ] = "Beskrivelse" ;
                        Text [ italian ] = "Descrizione" ;
                        Text [ spanish ] = "Descripción" ;
                        Text [ french ] = "Description" ;
                        Text [ dutch ] = "Beschrijving" ;
                        Text [ portuguese ] = "Descrição" ;
                        Text[ chinese_simplified ] = "˵Ã÷";
                        Text[ russian ] = "Îïèñàíèå";
                        Text[ polish ] = "Opis";
                        Text[ japanese ] = "ºÒÝÄ";
                        Text[ chinese_traditional ] = "´y­z";
                        Text[ arabic ] = "ÊÚáíÞ";
                        Text[ greek ] = "ÐåñéãñáöÞ";
                        Text[ korean ] = "¸Þ¸ð";
                        Text[ turkish ] = "Açýklama";
                        Text[ language_user1 ] = " ";
                    };
                    MenuItem
                    {
                        Identifier = MN_SORT_POSITION ;
                        HelpID = HID_SW_SORT_POSITION ;
                        Text = "Dokumentposition" ;
                        Text [ english ] = "Document position" ;
                        RadioCheck = TRUE ;
                        Text [ english_us ] = "Document position" ;
                        Text [ portuguese_brazilian ] = "Dokumentposition" ;
                        Text [ swedish ] = "Dokumentposition" ;
                        Text [ danish ] = "Dokumentplacering" ;
                        Text [ italian ] = "Posizione documento" ;
                        Text [ spanish ] = "Posición del documento" ;
                        Text [ french ] = "Emplacement dans le document" ;
                        Text [ dutch ] = "Documentpositie" ;
                        Text [ portuguese ] = "Posição do documento" ;
                        Text[ chinese_simplified ] = "ÎĵµÎ»ÖÃ";
                        Text[ russian ] = "Ïîçèöèÿ äîêóìåíòà";
                        Text[ polish ] = "Pozycja dokumentu";
                        Text[ japanese ] = "ÄÞ·­ÒÝĂ̈ʒu";
                        Text[ chinese_traditional ] = "¤å¥ó¦ì¸m";
                        Text[ arabic ] = "ãæÞÚ ÇáãÓÊäÏ";
                        Text[ greek ] = "ÈÝóç åããñÜöïõ";
                        Text[ korean ] = "¹®¼­ À§Ä¡";
                        Text[ turkish ] = "Belge konumu";
                        Text[ language_user1 ] = " ";
                    };
                };
            };
            Text [ english_us ] = "Sorting" ;
            Text [ portuguese_brazilian ] = "Sortiere" ;
            Text [ swedish ] = "Sorterar" ;
            Text [ danish ] = "Sorter" ;
            Text [ italian ] = "Ordina" ;
            Text [ spanish ] = "Ordenar" ;
            Text [ french ] = "Trier" ;
            Text [ dutch ] = "Sorteer" ;
            Text [ portuguese ] = "Ordenar" ;
            Text[ chinese_simplified ] = "ÅÅÐò";
            Text[ russian ] = "Ñîðòèðîâêà";
            Text[ polish ] = "Sortuj";
            Text[ japanese ] = "•À‚בւ¦";
            Text[ chinese_traditional ] = "±Æ§Ç";
            Text[ arabic ] = "ÝÑÒ";
            Text[ greek ] = "Ôáîéíüìçóç";
            Text[ korean ] = "Á¤¿­";
            Text[ turkish ] = "Sýrala";
            Text[ language_user1 ] = " ";
        };
    };
};
Bitmap BMP_ROOT_CLOSED
{
    File = "plus.bmp" ;
};
Bitmap BMP_ROOT_OPENED
{
    File = "minus.bmp" ;
};
diff --git a/sw/source/ui/misc/srtdlg.cxx b/sw/source/ui/misc/srtdlg.cxx
new file mode 100644
index 0000000..7c5318f
--- /dev/null
+++ b/sw/source/ui/misc/srtdlg.cxx
@@ -0,0 +1,459 @@
/*************************************************************************
 *
 *  $RCSfile: srtdlg.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:45 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SFXINTITEM_HXX //autogen
#include <svtools/intitem.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SVX_SVXIDS_HRC //autogen
#include <svx/svxids.hrc>
#endif
#ifndef _SWWAIT_HXX
#include <swwait.hxx>
#endif
#include "view.hxx"
#include "cmdid.h"
#include "wrtsh.hxx"
#include "srtdlg.hxx"
#include "sortopt.hxx"
#include "misc.hrc"
#include "srtdlg.hrc"
#include "swtable.hxx"
#include "node.hxx"
#include "tblsel.hxx"

static BOOL bCheck1 = TRUE;
static BOOL bCheck2 = FALSE;
static BOOL bCheck3 = FALSE;

static USHORT nCol1 = 1;
static USHORT nCol2 = 1;
static USHORT nCol3 = 1;

static USHORT nType1 = 0;
static USHORT nType2 = 0;
static USHORT nType3 = 0;

static BOOL   bAsc1  = TRUE;
static BOOL   bAsc2  = TRUE;
static BOOL   bAsc3  = TRUE;
static BOOL   bCol   = FALSE;
static char   nDeli  = '\t';



/*--------------------------------------------------------------------
     Beschreibung:  Fuer Tabellenselektion sel. Zeilen und Spalten
                    feststellen
 --------------------------------------------------------------------*/


BOOL lcl_GetSelTbl( SwWrtShell &rSh,USHORT& rX, USHORT& rY )
{
    const SwTableNode* pTblNd = rSh.IsCrsrInTbl();
    if( !pTblNd )
        return FALSE;

    _FndBox aFndBox( 0, 0 );

    // suche alle Boxen / Lines
    {
        SwSelBoxes aSelBoxes;
        ::GetTblSel( rSh, aSelBoxes );
        _FndPara aPara( aSelBoxes, &aFndBox );
        const SwTable& rTbl = pTblNd->GetTable();
        ((SwTableLines&)rTbl.GetTabLines()).ForEach( &_FndLineCopyCol, &aPara );
    }
    rX = aFndBox.GetLines().Count();
    if( !rX )
        return FALSE;

    rY = aFndBox.GetLines()[0]->GetBoxes().Count();
    return TRUE;
}

/*--------------------------------------------------------------------
     Beschreibung: Init-Liste
 --------------------------------------------------------------------*/



SwSortDlg::SwSortDlg(Window* pParent, SwWrtShell &rShell) :

    SvxStandardDialog(pParent, SW_RES(DLG_SORTING)),
    rSh(rShell),
    aOkBtn(this,        SW_RES(BT_OK    )),
    aCancelBtn(this,    SW_RES(BT_CANCEL)),
    aHelpBtn(this,      SW_RES(BT_HELP  )),
    aColLbl(this,       SW_RES(FT_COL   )),
    aTypLbl(this,       SW_RES(FT_KEYTYP)),
    aDirLbl(this,       SW_RES(FT_DIR   )),
    aKeyCB1(this,       SW_RES(CB_KEY1  )),
    aColEdt1(this,      SW_RES(ED_KEY1  )),
    aTypDLB1(this,      SW_RES(DLB_KEY1 )),
    aSortUpRB(this,     SW_RES(RB_UP    )),
    aSortDnRB(this,     SW_RES(RB_DN    )),
    aKeyCB2(this,       SW_RES(CB_KEY2  )),
    aColEdt2(this,      SW_RES(ED_KEY2  )),
    aTypDLB2(this,      SW_RES(DLB_KEY2 )),
    aSortUp2RB(this,    SW_RES(RB_UP2    )),
    aSortDn2RB(this,    SW_RES(RB_DN2    )),
    aKeyCB3(this,       SW_RES(CB_KEY3  )),
    aColEdt3(this,      SW_RES(ED_KEY3  )),
    aTypDLB3(this,      SW_RES(DLB_KEY3 )),
    aSortUp3RB(this,    SW_RES(RB_UP3    )),
    aSortDn3RB(this,    SW_RES(RB_DN3    )),
    aSortGrp(this,      SW_RES(GB_SORT  )),
    aColumnRB(this,     SW_RES(RB_COL   )),
    aRowRB(this,        SW_RES(RB_ROW   )),
    aDirGrp(this,       SW_RES(GB_DIR   )),
    aDelimTabRB(this,   SW_RES(RB_TAB   )),
    aDelimFreeRB(this,  SW_RES(RB_TABCH )),
    aDelimEdt(this,     SW_RES(ED_TABCH )),
    aDelimGrp(this,     SW_RES(GB_DELIM )),
    aColTxt(SW_RES(STR_COL)),
    aRowTxt(SW_RES(STR_ROW)),
    nX( 99 ),
    nY( 99 )
{
    aDelimEdt.SetMaxTextLen( 1 );
    if(rSh.GetSelectionType() &
            (SwWrtShell::SEL_TBL|SwWrtShell::SEL_TBL_CELLS) )
    {
        aColumnRB.Check(bCol);
        aColLbl.SetText(bCol ? aRowTxt : aColTxt);
        aRowRB.Check(!bCol);
        aDelimTabRB.Enable(FALSE);
        aDelimFreeRB.Enable(FALSE);
        aDelimEdt.Enable(FALSE);
    }
    else
    {
        aColumnRB.Enable(FALSE);
        aRowRB.Check(TRUE);
        aColLbl.SetText(aColTxt);
    }

    // Initialisieren
    Link aLk = LINK(this,SwSortDlg, CheckHdl);
    aKeyCB1.SetClickHdl( aLk );
    aKeyCB2.SetClickHdl( aLk );
    aKeyCB3.SetClickHdl( aLk );
    aColumnRB.SetClickHdl( aLk );
    aRowRB.SetClickHdl( aLk );

    aLk = LINK(this,SwSortDlg, DelimHdl);
    aDelimFreeRB.SetClickHdl(aLk);
    aDelimTabRB.SetClickHdl(aLk);

    aKeyCB1.Check(bCheck1);
    aKeyCB2.Check(bCheck2);
    aKeyCB3.Check(bCheck3);

    aColEdt1.SetValue(nCol1);
    aColEdt2.SetValue(nCol2);
    aColEdt3.SetValue(nCol3);

    aTypDLB1.SelectEntryPos(nType1);
    aTypDLB2.SelectEntryPos(nType2);
    aTypDLB3.SelectEntryPos(nType3);

    aSortUpRB.Check(bAsc1);
    aSortDnRB.Check(!bAsc1);
    aSortUp2RB.Check(bAsc2);
    aSortDn2RB.Check(!bAsc2);
    aSortUp3RB.Check(bAsc3);
    aSortDn3RB.Check(!bAsc3);
    aDelimTabRB.Check(nDeli == '\t');

    if(!aDelimTabRB.IsChecked())
    {
        aDelimEdt.SetText(nDeli);
        aDelimFreeRB.Check(TRUE);
        DelimHdl(&aDelimFreeRB);
    }
    else
        DelimHdl(&aDelimTabRB);

    FreeResource();
    if( ::lcl_GetSelTbl( rSh, nX, nY) )
    {
        USHORT nMax = aRowRB.IsChecked()? nY : nX;
        aColEdt1.SetMax(nMax);
        aColEdt2.SetMax(nMax);
        aColEdt3.SetMax(nMax);
    }
}




SwSortDlg::~SwSortDlg()
{
}

/*--------------------------------------------------------------------
    Beschreibung: An die Core weiterreichen
 --------------------------------------------------------------------*/
void SwSortDlg::Apply()
{
    SwSortOptions aOptions;
    if(aKeyCB1.IsChecked())
    {
        USHORT nSort = aSortUpRB.IsChecked() ?
                                (USHORT)SRT_ASCENDING : (USHORT)SRT_DESCENDING ;
        SwSortKey *pKey = new SwSortKey(aColEdt1.GetValue(),
                (SwSortKeyType)aTypDLB1.GetSelectEntryPos(),
                (SwSortOrder)nSort);
        aOptions.aKeys.C40_INSERT(SwSortKey, pKey, aOptions.aKeys.Count());
    }

    if(aKeyCB2.IsChecked())
    {
        USHORT nSort = aSortUp2RB.IsChecked() ?
                                (USHORT)SRT_ASCENDING : (USHORT)SRT_DESCENDING ;
        SwSortKey *pKey = new SwSortKey(aColEdt2.GetValue(),
                (SwSortKeyType)aTypDLB2.GetSelectEntryPos(),
                (SwSortOrder)nSort);
        aOptions.aKeys.C40_INSERT(SwSortKey, pKey, aOptions.aKeys.Count());
    }

    if(aKeyCB3.IsChecked())
    {
        USHORT nSort = aSortUp3RB.IsChecked() ?
                                (USHORT)SRT_ASCENDING : (USHORT)SRT_DESCENDING ;
        SwSortKey *pKey = new SwSortKey(aColEdt3.GetValue(),
                (SwSortKeyType)aTypDLB3.GetSelectEntryPos(),
                (SwSortOrder)nSort);
        aOptions.aKeys.C40_INSERT(SwSortKey, pKey, aOptions.aKeys.Count());
    }
    aOptions.eDirection =  aRowRB.IsChecked() ?
                        SRT_ROWS    : SRT_COLUMNS;
    sal_Unicode nDeli = '\t';
    if(!aDelimTabRB.IsChecked())
    {
        String aTmp(aDelimEdt.GetText());
        if( aTmp.Len() )
            nDeli = aTmp.GetChar( 0 );
    }
    aOptions.nDeli      =  nDeli;
    aOptions.bTable     =  rSh.IsTableMode();

    SwWait aWait( *rSh.GetView().GetDocShell(), TRUE );
    rSh.StartAllAction();
    BOOL bRet = rSh.Sort(aOptions);
    rSh.EndAllAction();
    if(bRet)
        InfoBox(this->GetParent(), SW_RES(MSG_SRTERR)).Execute();
    else
        rSh.SetModified();

    // Alte Einstellung speichern
    //
    bCheck1 = aKeyCB1.IsChecked();
    bCheck2 = aKeyCB2.IsChecked();
    bCheck3 = aKeyCB3.IsChecked();

    nCol1 = (USHORT)aColEdt1.GetValue();
    nCol2 = (USHORT)aColEdt2.GetValue();
    nCol3 = (USHORT)aColEdt3.GetValue();

    nType1 = aTypDLB1.GetSelectEntryPos();
    nType2 = aTypDLB2.GetSelectEntryPos();
    nType3 = aTypDLB3.GetSelectEntryPos();

    bAsc1 = aSortUpRB.IsChecked();
    bAsc2 = aSortUp2RB.IsChecked();
    bAsc3 = aSortUp3RB.IsChecked();
    bCol = aColumnRB.IsChecked();
}
/* -----------------30.09.98 10:03-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK( SwSortDlg, DelimHdl, RadioButton*, pButton )
{
    aDelimEdt.Enable(pButton == &aDelimFreeRB && aDelimFreeRB.IsEnabled());
    return 0;
}


IMPL_LINK( SwSortDlg, CheckHdl, CheckBox *, pCheck )
{
    if( pCheck == ( CheckBox* ) &aRowRB)
    {
        aColLbl.SetText(aColTxt);
        aColEdt1.SetMax(nY);
        aColEdt2.SetMax(nY);
        aColEdt3.SetMax(nY);

    }
    else if( pCheck == ( CheckBox* ) &aColumnRB)
    {
        aColLbl.SetText(aRowTxt);
        aColEdt1.SetMax(nX);
        aColEdt2.SetMax(nX);
        aColEdt3.SetMax(nX);
    }
    else if(!aKeyCB1.IsChecked() &&
                !aKeyCB2.IsChecked() &&
                    !aKeyCB3.IsChecked())
        pCheck->Check(TRUE);
    return 0;
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.58  2000/09/18 16:06:00  willem.vandorp
    OpenOffice header added.

    Revision 1.57  2000/05/26 07:21:31  os
    old SW Basic API Slots removed

    Revision 1.56  2000/02/11 14:56:48  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.55  1998/09/30 08:29:10  OS
    #52654# Sortable und SortDescriptor eingebaut, auf- und absteigend fuer jeden Schluessel


      Rev 1.54   30 Sep 1998 10:29:10   OS
   #52654# Sortable und SortDescriptor eingebaut, auf- und absteigend fuer jeden Schluessel

      Rev 1.53   07 Apr 1998 13:04:20   OM
   #49223 Infobox nicht mit hidden Parent executen

      Rev 1.52   24 Nov 1997 16:47:48   MA
   includes

      Rev 1.51   21 Nov 1997 13:50:44   OS
   richtigen Schluesseltext setzen #45697#

      Rev 1.50   03 Nov 1997 13:22:42   MA
   precomp entfernt

      Rev 1.49   25 Jul 1997 15:39:10   HJS
   includes

      Rev 1.48   11 Nov 1996 11:05:44   MA
   ResMgr

      Rev 1.47   24 Oct 1996 13:36:36   JP
   String Umstellung: [] -> GetChar()

      Rev 1.46   02 Oct 1996 18:29:32   MA
   Umstellung Enable/Disable

      Rev 1.45   11 Sep 1996 17:23:46   NF
   add: svxids.hrc

      Rev 1.44   28 Aug 1996 14:12:24   OS
   includes

      Rev 1.43   26 Jun 1996 15:25:54   OS
   Aufruf von Dispatcher.Execute an 324 angepasst

      Rev 1.42   25 Jun 1996 18:39:38   HJS
   includes

      Rev 1.41   07 Jun 1996 14:25:56   OS
   SelectionType auf SEL_TBL* testen, nicht auf SEL_TXT

      Rev 1.40   06 Feb 1996 15:21:14   JP
   Link Umstellung 305

      Rev 1.39   24 Nov 1995 16:58:46   OM
   PCH->PRECOMPILED

      Rev 1.38   13 Nov 1995 10:52:46   OM
   Neues Seg

      Rev 1.37   13 Nov 1995 10:51:34   OM
   static entfernt

      Rev 1.36   08 Nov 1995 13:31:48   JP
   Umstellung zur 301: Change -> Set

      Rev 1.35   24 Oct 1995 17:05:52   OS
   Sorting recordable und dazu ueber Slot imlementiert

      Rev 1.34   12 Sep 1995 17:30:20   OM
   Helpbutton eingefuegt


------------------------------------------------------------------------*/



diff --git a/sw/source/ui/misc/srtdlg.hrc b/sw/source/ui/misc/srtdlg.hrc
new file mode 100644
index 0000000..ef4ea11
--- /dev/null
+++ b/sw/source/ui/misc/srtdlg.hrc
@@ -0,0 +1,93 @@
/*************************************************************************
 *
 *  $RCSfile: srtdlg.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:45 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#define BT_OK        1
#define BT_CANCEL    2
#define FT_COL       3
#define FT_KEYTYP    4
#define CB_KEY1      5
#define ED_KEY1      6
#define DLB_KEY1     7
#define CB_KEY2      8
#define ED_KEY2      9
#define DLB_KEY2    10
#define CB_KEY3     11
#define ED_KEY3     12
#define DLB_KEY3    13
#define GB_SORT     14
#define RB_COL      15
#define RB_ROW      16
#define GB_DIR      17
#define RB_UP       18
#define RB_DN       19
#define GB_ORDER    20
#define RB_TAB      21
#define RB_TABCH    22
#define ED_TABCH    23
#define GB_DELIM    24
#define STR_ROW     25
#define STR_COL     26
#define BT_HELP     27
#define FT_DIR      28
#define RB_UP2      29
#define RB_DN2      30
#define RB_UP3      31
#define RB_DN3      32

diff --git a/sw/source/ui/misc/srtdlg.src b/sw/source/ui/misc/srtdlg.src
new file mode 100644
index 0000000..f80236b
--- /dev/null
+++ b/sw/source/ui/misc/srtdlg.src
@@ -0,0 +1,1193 @@
/*************************************************************************
 *
 *  $RCSfile: srtdlg.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:46 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "misc.hrc"
#include "srtdlg.hrc"
#include "cmdid.h"
#include "helpid.h"
ModalDialog DLG_SORTING
{
    HelpID = FN_SORTING_DLG ;
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 268 , 153 ) ;
    Text = "Sortieren" ;
    Text [ ENGLISH ] = "Sort" ;
    Text [ norwegian ] = "Sorter" ;
    Text [ italian ] = "Ordina" ;
    Text [ portuguese_brazilian ] = "Ordenar" ;
    Text [ portuguese ] = "Ordenar" ;
    Text [ finnish ] = "Lajittelu" ;
    Text [ danish ] = "Sorter" ;
    Text [ french ] = "Trier" ;
    Text [ swedish ] = "Sortera" ;
    Text [ dutch ] = "Sorteren" ;
    Text [ spanish ] = "Ordenar" ;
    Text [ english_us ] = "Sort" ;
    Moveable = TRUE ;
    OKButton BT_OK
    {
        Pos = MAP_APPFONT ( 212 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        DefButton = TRUE ;
    };
    CancelButton BT_CANCEL
    {
        Pos = MAP_APPFONT ( 212 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    HelpButton BT_HELP
    {
        Pos = MAP_APPFONT ( 212 , 43 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    FixedText FT_COL
    {
        Pos = MAP_APPFONT ( 68 , 12 ) ;
        Size = MAP_APPFONT ( 25 , 8 ) ;
        Text = "Spalte" ;
        Text [ ENGLISH ] = "Column" ;
        Text [ norwegian ] = "Column" ;
        Text [ italian ] = "Colonna" ;
        Text [ portuguese_brazilian ] = "Coluna" ;
        Text [ portuguese ] = "Coluna" ;
        Text [ finnish ] = "Sarake" ;
        Text [ danish ] = "Kolonne" ;
        Text [ french ] = "Colonne" ;
        Text [ swedish ] = "Kolumn" ;
        Text [ dutch ] = "Kolom" ;
        Text [ spanish ] = "Columna" ;
        Text [ english_us ] = "Column" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "ÁÐ";
        Text[ russian ] = "Êîëîíêà";
        Text[ polish ] = "Kolumna";
        Text[ japanese ] = "—ñ";
        Text[ chinese_traditional ] = "Äæ";
        Text[ arabic ] = "ÚãæÏ";
        Text[ greek ] = "ÓôÞëç";
        Text[ korean ] = "¿­";
        Text[ turkish ] = "Sütun";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_KEYTYP
    {
        Pos = MAP_APPFONT ( 101, 12 ) ;
        Size = MAP_APPFONT ( 48 , 8 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? Schlüsseltyp : Schl³sseltyp */
        Text = "Schlüsseltyp" ;
        Text [ ENGLISH ] = "Key type" ;
        Text [ norwegian ] = "Tasttype" ;
        Text [ italian ] = "Tipo chiave" ;
        Text [ portuguese_brazilian ] = "Tipo de tecla" ;
        Text [ portuguese ] = "Tipo de chave" ;
        Text [ finnish ] = "Avainlaji" ;
        Text [ danish ] = "Nøgletype" ;
        Text [ french ] = "Type de critère" ;
        Text [ swedish ] = "Kodtyp" ;
        Text [ dutch ] = "Sleuteltype" ;
        Text [ spanish ] = "Tipo de clave" ;
        Text [ english_us ] = "Key type" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "ÃÜÂëÀàÐÍ";
        Text[ russian ] = "Òèï êëþ÷à";
        Text[ polish ] = "Typ klucza";
        Text[ japanese ] = "·°‚ÌŽí—Þ";
        Text[ language_user1 ] = " ";
        Text[ chinese_traditional ] = "±K½XÃþ«¬";
        Text[ arabic ] = "äæÚ ÇáãÝÊÇÍ";
        Text[ greek ] = "Ôýðïò êëåéäéïý";
        Text[ korean ] = "Ű ÇüÅÂ";
        Text[ turkish ] = "Anahtar tipi";
    };
    FixedText FT_DIR
    {
        Pos = MAP_APPFONT ( 155 , 12 ) ;
        Size = MAP_APPFONT ( 49 , 10 ) ;
        Text = "Reihenfolge" ;
        Text [ ENGLISH ] = "Order" ;
        Text [ norwegian ] = "Rekkefølge" ;
        Text [ italian ] = "Sequenza" ;
        Text [ portuguese_brazilian ] = "Ordem" ;
        Text [ portuguese ] = "Ordem" ;
        Text [ finnish ] = "Järjestys" ;
        Text [ danish ] = "Rækkefølge" ;
        Text [ french ] = "Ordre" ;
        Text [ swedish ] = "Ordning" ;
        Text [ dutch ] = "Volgorde" ;
        Text [ spanish ] = "Orden" ;
        Text [ english_us ] = "Order" ;
        Text[ chinese_simplified ] = "˳Ðò";
        Text[ russian ] = "Ïîðÿäîê";
        Text[ polish ] = "KolejnoϾ";
        Text[ japanese ] = "‡˜";
        Text[ language_user1 ] = " ";
        Text[ chinese_traditional ] = "¶¶§Ç";
        Text[ arabic ] = "ÇáÊÑÊíÈ";
        Text[ greek ] = "ÓåéñÜ";
        Text[ korean ] = "¼ø¼­";
        Text[ turkish ] = "Sýra";
    };
    CheckBox CB_KEY1
    {
        Pos = MAP_APPFONT ( 12 , 25 ) ;
        Size = MAP_APPFONT ( 49 , 8 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? Schlüssel ~1 : Schl³ssel ~1 */
        Text = "Schlüssel ~1" ;
        Text [ ENGLISH ] = "Key ~1" ;
        Text [ norwegian ] = "Tast ~1" ;
        Text [ italian ] = "Chiave ~1" ;
        Text [ portuguese_brazilian ] = "Tecla ~1" ;
        Text [ portuguese ] = "Tecla ~1" ;
        Text [ finnish ] = "Avain ~1" ;
        Text [ danish ] = "Nøgle 1" ;
        Text [ french ] = "Critère ~1" ;
        Text [ swedish ] = "Nyckel ~1" ;
        Text [ dutch ] = "Sleutel ~1" ;
        Text [ spanish ] = "Clave ~1" ;
        Text [ english_us ] = "Key ~1" ;
        Check = TRUE ;
        Text[ chinese_simplified ] = "ÃÜÂë 1(~1)";
        Text[ russian ] = "Êëþ÷ ~1";
        Text[ polish ] = "Klucz ~1";
        Text[ japanese ] = "·° 1";
        Text[ language_user1 ] = " ";
        Text[ chinese_traditional ] = "±K½X ~1";
        Text[ arabic ] = "ãÝÊÇÍ 1";
        Text[ greek ] = "Êëåéäß ~1";
        Text[ korean ] = "Ű 1";
        Text[ turkish ] = "Anahtar ~1";
    };
    NumericField ED_KEY1
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 66 , 23 ) ;
        Size = MAP_APPFONT ( 25 , 12 ) ;
        Text = "10" ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 1 ;
        Maximum = 99 ;
        Value = 1 ;
        First = 1 ;
        Last = 99 ;
        SpinSize = 1 ;
    };
    ListBox DLB_KEY1
    {
        Pos = MAP_APPFONT ( 96 , 23 ) ;
        Size = MAP_APPFONT ( 55 , 45 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        CurPos = 0 ;
        StringList =
        {
            < "alphanumerisch" ; > ;
            < "numerisch" ; > ;
        };
        StringList [ ENGLISH ] =
        {
            < "alphanumerisch" ; > ;
            < "numerisch" ; > ;
        };
        StringList [ norwegian ] =
        {
            < "alphanumerisch" ; > ;
            < "numerisch" ; > ;
        };
        StringList [ italian ] =
        {
            < "alfanumerica" ; > ;
            < "numerica" ; > ;
        };
        StringList [ portuguese_brazilian ] =
        {
            < "alfanumérico" ; > ;
            < "numérico" ; > ;
        };
        StringList [ portuguese ] =
        {
            < "alfanumérico" ; > ;
            < "numérico" ; > ;
        };
        StringList [ finnish ] =
        {
            < "alphanumerisch" ; > ;
            < "numerisch" ; > ;
        };
        StringList [ danish ] =
        {
            < "alfanumerisk" ; > ;
            < "numerisk" ; > ;
        };
        StringList [ french ] =
        {
            < "alphanumérique" ; > ;
            < "numérique" ; > ;
        };
        StringList [ swedish ] =
        {
            < "alfanumerisk" ; > ;
            < "numerisk" ; > ;
        };
        StringList [ dutch ] =
        {
            < "alfanumeriek" ; > ;
            < "numeriek" ; > ;
        };
        StringList [ spanish ] =
        {
            < "alfanumérica" ; > ;
            < "numérica" ; > ;
        };
        StringList [ english_us ] =
        {
            < "alphanumeric" ; > ;
            < "numeric" ; > ;
        };
    StringList [ chinese_simplified ] =
    {
            < "×Öĸ" ; > ;
        < "Êý×Ö" ; > ;
    };
    StringList [ russian ] =
    {
            < "àëôàâèòíî-öèôðîâîé" ; > ;
        < "öèôðîâîé" ; > ;
    };
    StringList [ polish ] =
    {
            < "alfanumeryczny" ; > ;
        < "numeryczny" ; > ;
    };
    StringList [ japanese ] =
    {
            < "±Ù̧Íޯď‡" ; > ;
        < "”Žš" ; > ;
    };
    StringList [ chinese_traditional ] =
    {
            < "¦r¥À" ; > ;
        < "¼Æ¦r" ; > ;
    };
    StringList [ arabic ] =
    {
            < "åÌÇÆí ÚÏÏí" ; > ;
        < "ÚÏÏí" ; > ;
    };
    StringList [ greek ] =
    {
            < "áëöáñéèìçôéêÜ" ; > ;
        < "áñéèìçôéêÜ" ; > ;
    };
    StringList [ korean ] =
    {
            < "¿µ¼ýÀÚ" ; > ;
        < "¹øÈ£" ; > ;
    };
    StringList [ turkish ] =
    {
            < "alfanümerik" ; > ;
        < "nümerik" ; > ;
    };
    StringList [ language_user1 ] =
    {
            < " " ; > ;
        < " " ; > ;
    };
    };
    RadioButton RB_UP
    {
        Pos = MAP_APPFONT ( 155 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 10 ) ;
        Text = "~Aufsteigend" ;
        Text [ ENGLISH ] = "~Ascending" ;
        Text [ norwegian ] = "St~igende" ;
        Text [ italian ] = "~Crescente" ;
        Text [ portuguese_brazilian ] = "~Ascendente" ;
        Text [ portuguese ] = "~Ascendente" ;
        Text [ finnish ] = "~Nouseva" ;
        Text [ danish ] = "Stigende" ;
        Text [ french ] = "~Croissant" ;
        Text [ swedish ] = "Stig~ande" ;
        Text [ dutch ] = "~Oplopend" ;
        Text [ spanish ] = "~Ascendente" ;
        Text [ english_us ] = "~Ascending" ;
        TabStop = TRUE ;
        Check = TRUE ;
        Text[ chinese_simplified ] = "µÝÔö(~A)";
        Text[ russian ] = "Ïî âîçðàñòàíèþ";
        Text[ polish ] = "Rosn¹co";
        Text[ japanese ] = "¸‡(~A)";
        Text[ chinese_traditional ] = "»¼¼W(~A)";
        Text[ arabic ] = "ÊÕÇÚÏí";
        Text[ greek ] = "Áýîïõóá";
        Text[ korean ] = "¿À¸§Â÷¼ø(~A)";
        Text[ turkish ] = "Ar~tan";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_DN
    {
        Pos = MAP_APPFONT ( 155 , 35 ) ;
        Size = MAP_APPFONT ( 50 , 10 ) ;
        Text = "A~bsteigend" ;
        Text [ ENGLISH ] = "~Descending" ;
        Text [ norwegian ] = "~Synkende" ;
        Text [ italian ] = "~Decrescente" ;
        Text [ portuguese_brazilian ] = "~Descendente" ;
        Text [ portuguese ] = "~Descendente" ;
        Text [ finnish ] = "~Laskeva" ;
        Text [ danish ] = "Faldende" ;
        Text [ french ] = "~Décroissant" ;
        Text [ swedish ] = "Fallan~de" ;
        Text [ dutch ] = "~Aflopend" ;
        Text [ spanish ] = "~Descendente" ;
        Text [ english_us ] = "~Descending" ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "µÝ¼õ(~D)";
        Text[ russian ] = "Ïî óáûâàíèþ";
        Text[ polish ] = "Malej¹co";
        Text[ japanese ] = "~‡";
        Text[ chinese_traditional ] = "»¼´î(~D)";
        Text[ arabic ] = "ÊäÇÒáí";
        Text[ greek ] = "Öèßíïõóá";
        Text[ korean ] = "³»¸²Â÷¼ø(~D)";
        Text[ turkish ] = "A~zalan";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_KEY2
    {
        Pos = MAP_APPFONT ( 12 , 52 ) ;
        Size = MAP_APPFONT ( 49 , 8 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? Schlüssel ~2 : Schl³ssel ~2 */
        Text = "Schlüssel ~2" ;
        Text [ ENGLISH ] = "Key ~2" ;
        Text [ norwegian ] = "Tast ~2" ;
        Text [ italian ] = "Chiave ~2" ;
        Text [ portuguese_brazilian ] = "Tecla ~2" ;
        Text [ portuguese ] = "Tecla ~2" ;
        Text [ finnish ] = "Avain ~2" ;
        Text [ danish ] = "Nøgle 2" ;
        Text [ french ] = "Critère ~2" ;
        Text [ swedish ] = "Nyckel ~2" ;
        Text [ dutch ] = "Sleutel ~2" ;
        Text [ spanish ] = "Clave ~2" ;
        Text [ english_us ] = "Key ~2" ;
        Text[ chinese_simplified ] = "ÃÜÂë 2(~2)";
        Text[ russian ] = "Êëþ÷ ~2";
        Text[ polish ] = "Klucz 2";
        Text[ japanese ] = "·° 2";
        Text[ language_user1 ] = " ";
        Text[ chinese_traditional ] = "±K½X ~2";
        Text[ arabic ] = "ãÝÊÇÍ 2";
        Text[ greek ] = "Êëåéäß ~2";
        Text[ korean ] = "Ű 2";
        Text[ turkish ] = "Anahtar ~2";
    };
    NumericField ED_KEY2
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 66 , 50 ) ;
        Size = MAP_APPFONT ( 25 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 1 ;
        Maximum = 99 ;
        Value = 1 ;
        First = 1 ;
        Last = 99 ;
        SpinSize = 1 ;
    };
    ListBox DLB_KEY2
    {
        Pos = MAP_APPFONT ( 96 , 50 ) ;
        Size = MAP_APPFONT ( 55 , 45 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        CurPos = 0 ;
        StringList =
        {
            < "alphanumerisch" ; > ;
            < "numerisch" ; > ;
        };
        StringList [ ENGLISH ] =
        {
            < "alphanumerisch" ; > ;
            < "numerisch" ; > ;
        };
        StringList [ norwegian ] =
        {
            < "alphanumerisch" ; > ;
            < "numerisch" ; > ;
        };
        StringList [ italian ] =
        {
            < "alfanumerica" ; > ;
            < "numerica" ; > ;
        };
        StringList [ portuguese_brazilian ] =
        {
            < "alfanumérico" ; > ;
            < "numérico" ; > ;
        };
        StringList [ portuguese ] =
        {
            < "alfanumérico" ; > ;
            < "numérico" ; > ;
        };
        StringList [ finnish ] =
        {
            < "alphanumerisch" ; > ;
            < "numerisch" ; > ;
        };
        StringList [ danish ] =
        {
            < "alfanumerisk" ; > ;
            < "numerisk" ; > ;
        };
        StringList [ french ] =
        {
            < "alphanumérique" ; > ;
            < "numérique" ; > ;
        };
        StringList [ swedish ] =
        {
            < "alfanumerisk" ; > ;
            < "numerisk" ; > ;
        };
        StringList [ dutch ] =
        {
            < "alfanumeriek" ; > ;
            < "numeriek" ; > ;
        };
        StringList [ spanish ] =
        {
            < "alfanumérica" ; > ;
            < "numérica" ; > ;
        };
        StringList [ english_us ] =
        {
            < "alphanumeric" ; > ;
            < "numeric" ; > ;
        };
    StringList [ chinese_simplified ] =
    {
            < "×Öĸ" ; > ;
        < "Êý×Ö" ; > ;
    };
    StringList [ russian ] =
    {
            < "àëôàâèòíî-öèôðîâîé" ; > ;
        < "öèôðîâîé" ; > ;
    };
    StringList [ polish ] =
    {
            < "alfanumeryczny" ; > ;
        < "numeryczny" ; > ;
    };
    StringList [ japanese ] =
    {
            < "±Ù̧Íޯď‡" ; > ;
        < "”Žš" ; > ;
    };
    StringList [ chinese_traditional ] =
    {
            < "¦r¥À" ; > ;
        < "¼Æ¦r" ; > ;
    };
    StringList [ arabic ] =
    {
            < "åÌÇÆí ÚÏÏí" ; > ;
        < "ÚÏÏí" ; > ;
    };
    StringList [ greek ] =
    {
            < "áëöáñéèìçôéêÜ" ; > ;
        < "áñéèìçôéêÜ" ; > ;
    };
    StringList [ korean ] =
    {
            < "¿µ¼ýÀÚ" ; > ;
        < "¹øÈ£" ; > ;
    };
    StringList [ turkish ] =
    {
            < "alfanümerik" ; > ;
        < "nümerik" ; > ;
    };
    StringList [ language_user1 ] =
    {
            < " " ; > ;
        < " " ; > ;
    };
    };
    RadioButton RB_UP2
    {
        Pos = MAP_APPFONT ( 155 , 50 ) ;
        Size = MAP_APPFONT ( 50 , 10 ) ;
        Text = "A~ufsteigend" ;
        Text [ ENGLISH ] = "~Ascending" ;
        Text [ norwegian ] = "St~igende" ;
        Text [ italian ] = "~Crescente" ;
        Text [ portuguese_brazilian ] = "~Ascendente" ;
        Text [ portuguese ] = "~Ascendente" ;
        Text [ finnish ] = "~Nouseva" ;
        Text [ danish ] = "Stigende" ;
        Text [ french ] = "~Croissant" ;
        Text [ swedish ] = "Sti~gande" ;
        Text [ dutch ] = "~Oplopend" ;
        Text [ spanish ] = "A~scendente" ;
        Text [ english_us ] = "Ascending" ;
        TabStop = TRUE ;
        Check = TRUE ;
        Text[ chinese_simplified ] = "µÝÔö";
        Text[ russian ] = "Ïî âîçðàñòàíèþ";
        Text[ polish ] = "Rosn¹co";
        Text[ japanese ] = "¸‡";
        Text[ chinese_traditional ] = "»¼¼W";
        Text[ arabic ] = "ÊÕÇÚÏí";
        Text[ greek ] = "Áýîïõóá";
        Text[ korean ] = "¿À¸§Â÷¼ø";
        Text[ turkish ] = "Arta~n";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_DN2
    {
        Pos = MAP_APPFONT ( 155 , 62 ) ;
        Size = MAP_APPFONT ( 50 , 10 ) ;
        Text = "Ab~steigend" ;
        Text [ ENGLISH ] = "~Descending" ;
        Text [ norwegian ] = "~Synkende" ;
        Text [ italian ] = "~Decrescente" ;
        Text [ portuguese_brazilian ] = "~Descendente" ;
        Text [ portuguese ] = "~Descendente" ;
        Text [ finnish ] = "~Laskeva" ;
        Text [ danish ] = "Faldende" ;
        Text [ french ] = "~Décroissant" ;
        Text [ swedish ] = "Fa~llande" ;
        Text [ dutch ] = "~Aflopend" ;
        Text [ spanish ] = "Desc~endente" ;
        Text [ english_us ] = "Descending" ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "µÝ¼õ";
        Text[ russian ] = "Ïî óáûâàíèþ";
        Text[ polish ] = "Malej¹co";
        Text[ japanese ] = "~‡";
        Text[ chinese_traditional ] = "»¼´î";
        Text[ arabic ] = "ÊäÇÒáí";
        Text[ greek ] = "Öèßíïõóá";
        Text[ korean ] = "³»¸²Â÷¼ø";
        Text[ turkish ] = "A~rtan";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_KEY3
    {
        Pos = MAP_APPFONT ( 12 , 81 ) ;
        Size = MAP_APPFONT ( 49 , 8 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? Schlüssel ~3 : Schl³ssel ~3 */
        Text = "Schlüssel ~3" ;
        Text [ ENGLISH ] = "Key ~3" ;
        Text [ norwegian ] = "Tast ~3" ;
        Text [ italian ] = "Chiave ~3" ;
        Text [ portuguese_brazilian ] = "Tecla ~3" ;
        Text [ portuguese ] = "Tecla ~3" ;
        Text [ finnish ] = "Avain ~3" ;
        Text [ danish ] = "Nøgle 3" ;
        Text [ french ] = "Critère ~3" ;
        Text [ swedish ] = "Nyckel ~3" ;
        Text [ dutch ] = "Sleutel ~3" ;
        Text [ spanish ] = "Clave ~3" ;
        Text [ english_us ] = "Key ~3" ;
        Text[ chinese_simplified ] = "ÃÜÂë 3(~3)";
        Text[ russian ] = "Êëþ÷ ~3";
        Text[ polish ] = "Klucz 3";
        Text[ japanese ] = "·° 3";
        Text[ language_user1 ] = " ";
        Text[ chinese_traditional ] = "±K½X ~3";
        Text[ arabic ] = "ãÝÊÇÍ 3";
        Text[ greek ] = "Êëåéäß ~3";
        Text[ korean ] = "Ű 3";
        Text[ turkish ] = "Anahtar ~3";
    };
    NumericField ED_KEY3
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 66 , 79 ) ;
        Size = MAP_APPFONT ( 25 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 1 ;
        Maximum = 99 ;
        Value = 1 ;
        First = 1 ;
        Last = 99 ;
        SpinSize = 1 ;
    };
    ListBox DLB_KEY3
    {
        Pos = MAP_APPFONT ( 96 , 79 ) ;
        Size = MAP_APPFONT ( 55 , 45 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
        CurPos = 0 ;
        StringList =
        {
            < "alphanumerisch" ; > ;
            < "numerisch" ; > ;
        };
        StringList [ ENGLISH ] =
        {
            < "alphanumerisch" ; > ;
            < "numerisch" ; > ;
        };
        StringList [ norwegian ] =
        {
            < "alphanumerisch" ; > ;
            < "numerisch" ; > ;
        };
        StringList [ italian ] =
        {
            < "alfanumerica" ; > ;
            < "numerica" ; > ;
        };
        StringList [ portuguese_brazilian ] =
        {
            < "alfanumérico" ; > ;
            < "numérico" ; > ;
        };
        StringList [ portuguese ] =
        {
            < "alfanumérico" ; > ;
            < "numérico" ; > ;
        };
        StringList [ finnish ] =
        {
            < "alphanumerisch" ; > ;
            < "numerisch" ; > ;
        };
        StringList [ danish ] =
        {
            < "alfanumerisk" ; > ;
            < "numerisk" ; > ;
        };
        StringList [ french ] =
        {
            < "alphanumérique" ; > ;
            < "numérique" ; > ;
        };
        StringList [ swedish ] =
        {
            < "alfanumerisk" ; > ;
            < "numerisk" ; > ;
        };
        StringList [ dutch ] =
        {
            < "alfanumeriek" ; > ;
            < "numeriek" ; > ;
        };
        StringList [ spanish ] =
        {
            < "alfanumérica" ; > ;
            < "numérica" ; > ;
        };
        StringList [ english_us ] =
        {
            < "alphanumeric" ; > ;
            < "numeric" ; > ;
        };
    StringList [ chinese_simplified ] =
    {
            < "×Öĸ" ; > ;
        < "Êý×Ö" ; > ;
    };
    StringList [ russian ] =
    {
            < "àëôàâèòíî-öèôðîâîé" ; > ;
        < "öèôðîâîé" ; > ;
    };
    StringList [ polish ] =
    {
            < "alfanumeryczny" ; > ;
        < "numeryczny" ; > ;
    };
    StringList [ japanese ] =
    {
            < "±Ù̧Íޯď‡" ; > ;
        < "”Žš" ; > ;
    };
    StringList [ chinese_traditional ] =
    {
            < "¦r¥À" ; > ;
        < "¼Æ¦r" ; > ;
    };
    StringList [ arabic ] =
    {
            < "åÌÇÆí ÚÏÏí" ; > ;
        < "ÚÏÏí" ; > ;
    };
    StringList [ greek ] =
    {
            < "áëöáñéèìçôéêÜ" ; > ;
        < "áñéèìçôéêÜ" ; > ;
    };
    StringList [ korean ] =
    {
            < "¿µ¼ýÀÚ" ; > ;
        < "¹øÈ£" ; > ;
    };
    StringList [ turkish ] =
    {
            < "alfanümerik" ; > ;
        < "nümerik" ; > ;
    };
    StringList [ language_user1 ] =
    {
            < " " ; > ;
        < " " ; > ;
    };
    };
    RadioButton RB_UP3
    {
        Pos = MAP_APPFONT ( 155 , 79 ) ;
        Size = MAP_APPFONT ( 50 , 10 ) ;
        Text = "Aufstei~gend" ;
        Text [ ENGLISH ] = "~Ascending" ;
        Text [ norwegian ] = "St~igende" ;
        Text [ italian ] = "~Crescente" ;
        Text [ portuguese_brazilian ] = "~Ascendente" ;
        Text [ portuguese ] = "~Ascendente" ;
        Text [ finnish ] = "~Nouseva" ;
        Text [ danish ] = "Stigende" ;
        Text [ french ] = "~Croissant" ;
        Text [ swedish ] = "Stiga~nde" ;
        Text [ dutch ] = "~Oplopend" ;
        Text [ spanish ] = "Ascende~nte" ;
        Text [ english_us ] = "Ascending" ;
        TabStop = TRUE ;
        Check = TRUE ;
        Text[ chinese_simplified ] = "µÝÔö";
        Text[ russian ] = "Ïî âîçðàñòàíèþ";
        Text[ polish ] = "Rosn¹co";
        Text[ japanese ] = "¸‡";
        Text[ chinese_traditional ] = "»¼¼W";
        Text[ arabic ] = "ÊÕÇÚÏí";
        Text[ greek ] = "Áýîïõóá";
        Text[ korean ] = "¿À¸§Â÷¼ø";
        Text[ turkish ] = "Artan";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_DN3
    {
        Pos = MAP_APPFONT ( 155 , 91 ) ;
        Size = MAP_APPFONT ( 50 , 10 ) ;
        Text = "Absteigen~d" ;
        Text [ ENGLISH ] = "~Descending" ;
        Text [ norwegian ] = "~Synkende" ;
        Text [ italian ] = "~Decrescente" ;
        Text [ portuguese_brazilian ] = "~Descendente" ;
        Text [ portuguese ] = "~Descendente" ;
        Text [ finnish ] = "~Laskeva" ;
        Text [ danish ] = "Faldende" ;
        Text [ french ] = "~Décroissant" ;
        Text [ swedish ] = "Falland~e" ;
        Text [ dutch ] = "~Aflopend" ;
        Text [ spanish ] = "Des~cendente" ;
        Text [ english_us ] = "Descending" ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "µÝ¼õ";
        Text[ russian ] = "Ïî óáûâàíèþ";
        Text[ polish ] = "Malej¹co";
        Text[ japanese ] = "~‡";
        Text[ chinese_traditional ] = "»¼´î";
        Text[ arabic ] = "ÊäÇÒáí";
        Text[ greek ] = "Öèßíïõóá";
        Text[ korean ] = "³»¸²Â÷¼ø";
        Text[ turkish ] = "Aza~lan";
        Text[ language_user1 ] = " ";
    };
    GroupBox GB_SORT
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 200 , 102 ) ;
        Text = "Regel" ;
        Text [ ENGLISH ] = "Rule" ;
        Text [ norwegian ] = "+++Rule" ;
        Text [ italian ] = "Criteri" ;
        Text [ portuguese_brazilian ] = "Regra" ;
        Text [ portuguese ] = "Regra" ;
        Text [ finnish ] = "Sääntö" ;
        Text [ danish ] = "Kriterier" ;
        Text [ french ] = "Règle" ;
        Text [ swedish ] = "Regel" ;
        Text [ dutch ] = "Rij" ;
        Text [ spanish ] = "Regla" ;
        Text [ english_us ] = "Sort criteria" ;
        Text[ chinese_simplified ] = "ÅÅÐò¹æÔò";
        Text[ russian ] = "Ïîðÿäîê ñîðòèðîâêè";
        Text[ polish ] = "Regu³a";
        Text[ japanese ] = "ðŒ";
        Text[ language_user1 ] = " ";
        Text[ chinese_traditional ] = "±Æ§Ç³W«h";
        Text[ arabic ] = "ÇáÞæÇÚÏ";
        Text[ greek ] = "ÊñéôÞñéï";
        Text[ korean ] = "Á¤·Ä ±âÁØ";
        Text[ turkish ] = "Kural";
    };
    RadioButton RB_COL
    {
        Pos = MAP_APPFONT ( 12 , 120 ) ;
        Size = MAP_APPFONT ( 38 , 10 ) ;
        Text = "S~palten" ;
        Text [ ENGLISH ] = "~Columns" ;
        Text [ norwegian ] = "~Columns" ;
        Text [ italian ] = "Colonne" ;
        Text [ portuguese_brazilian ] = "~Colunas" ;
        Text [ portuguese ] = "~Colunas" ;
        Text [ finnish ] = "~Sarakkeet" ;
        Text [ danish ] = "Kolonner" ;
        Text [ french ] = "C~olonnes" ;
        Text [ swedish ] = "Kolumner" ;
        Text [ dutch ] = "~Kolommen" ;
        Text [ spanish ] = "Co~lumnas" ;
        Text [ english_us ] = "Col~umns" ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "ÁÐ(~L)";
        Text[ russian ] = "Êîëîíêè";
        Text[ polish ] = "~Kolumny";
        Text[ japanese ] = "’i‘g‚Ý(~L)";
        Text[ chinese_traditional ] = "Äæ(~L)";
        Text[ arabic ] = "ÃÚãÏÉ";
        Text[ greek ] = "ÓôÞëåò";
        Text[ korean ] = "¿­(~U)";
        Text[ turkish ] = "S~ütun";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_ROW
    {
        Pos = MAP_APPFONT ( 12 , 133 ) ;
        Size = MAP_APPFONT ( 34 , 10 ) ;
        Text = "~Zeilen" ;
        Text [ ENGLISH ] = "~Lines" ;
        Text [ norwegian ] = "~Linjer" ;
        Text [ italian ] = "R~ighe" ;
        Text [ portuguese_brazilian ] = "~Linhas" ;
        Text [ portuguese ] = "~Linhas" ;
        Text [ finnish ] = "~Viivat" ;
        Text [ danish ] = "Rækker" ;
        Text [ french ] = "~Lignes" ;
        Text [ swedish ] = "~Rader" ;
        Text [ dutch ] = "~Rijen" ;
        Text [ spanish ] = "~Filas" ;
        Text [ english_us ] = "~Rows" ;
        TabStop = TRUE ;
        Check = TRUE ;
        Text[ chinese_simplified ] = "ÐÐ(~R)";
        Text[ russian ] = "Ñòðîêè";
        Text[ polish ] = "Wiersze";
        Text[ japanese ] = "s(~R)";
        Text[ chinese_traditional ] = "¦æ(~R)";
        Text[ arabic ] = "ÕÝæÝ";
        Text[ greek ] = "ÃñáììÝò";
        Text[ korean ] = "¿­(~R)";
        Text[ turkish ] = "~Satýr";
        Text[ language_user1 ] = " ";
    };
    GroupBox GB_DIR
    {
        Pos = MAP_APPFONT ( 6 , 108 ) ;
        Size = MAP_APPFONT ( 98 , 42 ) ;
        Text = "Richtung" ;
        Text [ ENGLISH ] = "Direction" ;
        Text [ norwegian ] = "Retning" ;
        Text [ italian ] = "Direzione" ;
        Text [ portuguese_brazilian ] = "Direção" ;
        Text [ portuguese ] = "Direcção" ;
        Text [ finnish ] = "Suunta" ;
        Text [ danish ] = "Retning" ;
        Text [ french ] = "Direction" ;
        Text [ swedish ] = "Riktning" ;
        Text [ dutch ] = "Richting" ;
        Text [ spanish ] = "Dirección" ;
        Text [ english_us ] = "Direction" ;
        Text[ chinese_simplified ] = "·½Ïò";
        Text[ russian ] = "Íàïðàâëåíèå";
        Text[ polish ] = "Kierunek";
        Text[ japanese ] = "•ûŒü";
        Text[ chinese_traditional ] = "¤è¦V";
        Text[ arabic ] = "ÇáÇÊÌÇå";
        Text[ greek ] = "Ðñïóáíáôïëéóìüò";
        Text[ korean ] = "¹æÇâ";
        Text[ turkish ] = "Yön";
        Text[ language_user1 ] = " ";
    };
/*    GroupBox GB_ORDER
    {
        Pos = MAP_APPFONT ( 59 , 76 ) ;
        Size = MAP_APPFONT ( 58 , 42 ) ;
        Text = "Reihenfolge" ;
        Text [ ENGLISH ] = "Order" ;
        Text [ norwegian ] = "Rekkefølge" ;
        Text [ italian ] = "Ordine" ;
        Text [ portuguese_brazilian ] = "Ordem" ;
        Text [ portuguese ] = "Ordem" ;
        Text [ finnish ] = "Järjestys" ;
        Text [ danish ] = "Rækkefølge" ;
        Text [ french ] = "Ordre" ;
        Text [ swedish ] = "Ordning" ;
        Text [ dutch ] = "Volgorde" ;
        Text [ spanish ] = "Orden" ;
        Text [ english_us ] = "Order" ;
    };*/
    RadioButton RB_TAB
    {
        Pos = MAP_APPFONT ( 113 , 120 ) ;
        Size = MAP_APPFONT ( 44 , 9 ) ;
        Text = "~Tabulator" ;
        Text [ ENGLISH ] = "~Tab" ;
        Text [ norwegian ] = "~Tab" ;
        Text [ italian ] = "~Tabulazione" ;
        Text [ portuguese_brazilian ] = "~Tabulação" ;
        Text [ portuguese ] = "~Tabulações" ;
        Text [ finnish ] = "~Sarkain" ;
        Text [ danish ] = "Tabulator" ;
        Text [ french ] = "~Tabulation" ;
        Text [ swedish ] = "~Tabulator" ;
        Text [ dutch ] = "Ta~b" ;
        Text [ spanish ] = "~Tabulación" ;
        Text [ english_us ] = "~Tabs" ;
        TabStop = TRUE ;
        Check = TRUE ;
        Text[ chinese_simplified ] = "ÖÆ±í·û(~T)";
        Text[ russian ] = "Òàáóëÿöèÿ";
        Text[ polish ] = "Tabulator";
        Text[ japanese ] = "ÀÌÞ(~T)";
        Text[ chinese_traditional ] = "»sªí²Å(~T)";
        Text[ arabic ] = "ÚáÇãÉ ÌÏæáÉ";
        Text[ greek ] = "ÓôçëïèÝôçò";
        Text[ korean ] = "ÅÇ(~T)";
        Text[ turkish ] = "~Sekmeler";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_TABCH
    {
        Pos = MAP_APPFONT ( 113 , 133 ) ;
        Size = MAP_APPFONT ( 38 , 10 ) ;
        Text = "Z~eichen" ;
        Text [ ENGLISH ] = "~Char." ;
        Text [ norwegian ] = "~Kull." ;
        Text [ italian ] = "Carattere" ;
        Text [ portuguese_brazilian ] = "~Caracter" ;
        Text [ portuguese ] = "~Caracteres" ;
        Text [ finnish ] = "~Merkki" ;
        Text [ danish ] = "Tegn" ;
        Text [ french ] = "C~aractère" ;
        Text [ swedish ] = "Te~cken" ;
        Text [ dutch ] = "~Teken" ;
        Text [ spanish ] = "Ca~rácter" ;
        Text [ english_us ] = "~Character" ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "×Ö·û(~H)";
        Text[ russian ] = "Çíàê";
        Text[ polish ] = "Znak";
        Text[ japanese ] = "‹L†(~H)";
        Text[ chinese_traditional ] = "¦r¤¸(~H)";
        Text[ arabic ] = "ÃÍÑÝ";
        Text[ greek ] = "×áñáêôÞñåò";
        Text[ korean ] = "¹®ÀÚ(~C)";
        Text[ turkish ] = "~Karakter";
        Text[ language_user1 ] = " ";
    };
    Edit ED_TABCH
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 195 , 133 ) ;
        Size = MAP_APPFONT ( 8 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
    };
    GroupBox GB_DELIM
    {
        Pos = MAP_APPFONT ( 107 , 108 ) ;
        Size = MAP_APPFONT ( 99 , 42 ) ;
        Text = "Trenner" ;
        Text [ ENGLISH ] = "Delimiter" ;
        Text [ norwegian ] = "Skilletegn" ;
        Text [ italian ] = "Separatore" ;
        Text [ portuguese_brazilian ] = "Delimitador" ;
        Text [ portuguese ] = "Separador" ;
        Text [ finnish ] = "Erotin" ;
        Text [ danish ] = "Separator" ;
        Text [ french ] = "Séparateur" ;
        Text [ swedish ] = "Avgränsare" ;
        Text [ dutch ] = "Scheidingsteken" ;
        Text [ spanish ] = "Separador" ;
        Text [ english_us ] = "Separator" ;
        Text[ chinese_simplified ] = "·Ö¸ô·û";
        Text[ russian ] = "Ðàçäåëèòåëü";
        Text[ polish ] = "Separator";
        Text[ japanese ] = "‹æØ‚è‹L†";
        Text[ chinese_traditional ] = "¤À¹j²Å";
        Text[ arabic ] = "ÇáÝÇÕá";
        Text[ greek ] = "Äéá÷ùñéóôéêü";
        Text[ korean ] = "±¸ºÐÀÚ";
        Text[ turkish ] = "Ayýrma iþareti";
        Text[ language_user1 ] = " ";
    };
    String STR_ROW
    {
        Text = "Zeile" ;
        Text [ ENGLISH ] = "Row" ;
        Text [ norwegian ] = "Row" ;
        Text [ italian ] = "Riga" ;
        Text [ portuguese_brazilian ] = "Fileira" ;
        Text [ portuguese ] = "Linha" ;
        Text [ finnish ] = "Rivi" ;
        Text [ danish ] = "Række" ;
        Text [ french ] = "Ligne" ;
        Text [ swedish ] = "Rad" ;
        Text [ dutch ] = "Rij" ;
        Text [ spanish ] = "Filas" ;
        Text [ english_us ] = "Rows" ;
        Text[ chinese_simplified ] = "ÐÐ";
        Text[ russian ] = "Ñòðîêà";
        Text[ polish ] = "Wiersz";
        Text[ japanese ] = "s";
        Text[ chinese_traditional ] = "¦æ";
        Text[ arabic ] = "ÕÝ";
        Text[ greek ] = "ÃñáììÝò";
        Text[ korean ] = "Çà";
        Text[ turkish ] = "Satýr";
        Text[ language_user1 ] = " ";
    };
    String STR_COL
    {
        Text = "Spalte" ;
        Text [ ENGLISH ] = "Column" ;
        Text [ norwegian ] = "Column" ;
        Text [ italian ] = "Colonna" ;
        Text [ portuguese_brazilian ] = "Coluna" ;
        Text [ portuguese ] = "Coluna" ;
        Text [ finnish ] = "Sarake" ;
        Text [ danish ] = "Kolonne" ;
        Text [ french ] = "Colonne" ;
        Text [ swedish ] = "Kolumn" ;
        Text [ dutch ] = "Kolom" ;
        Text [ spanish ] = "Columna" ;
        Text [ english_us ] = "Column" ;
        Text[ chinese_simplified ] = "ÁÐ";
        Text[ russian ] = "Êîëîíêà";
        Text[ polish ] = "Kolumna";
        Text[ japanese ] = "—ñ";
        Text[ chinese_traditional ] = "Äæ";
        Text[ arabic ] = "ÚãæÏ";
        Text[ greek ] = "ÓôÞëç";
        Text[ korean ] = "¿­";
        Text[ turkish ] = "Sütun";
        Text[ language_user1 ] = " ";
    };
    Text[ chinese_simplified ] = "ÅÅÐò";
    Text[ russian ] = "Ñîðòèðîâêà";
    Text[ polish ] = "Sortuj";
    Text[ japanese ] = "•À‚בւ¦";
    Text[ chinese_traditional ] = "±Æ§Ç";
    Text[ arabic ] = "ÝÑÒ";
    Text[ greek ] = "Ôáîéíüìçóç";
    Text[ korean ] = "Á¤·Ä";
    Text[ turkish ] = "Sýrala";
    Text[ language_user1 ] = " ";
};
InfoBox MSG_SRTERR
{
    BUTTONS = WB_OK ;
    DEFBUTTON = WB_DEF_OK ;
    MESSAGE = "Selektion konnte nicht sortiert werden" ;
    MESSAGE [ English ] = "Cannot sort selection" ;
    MESSAGE [ norwegian ] = "Kan ikke sortere utvalget" ;
    MESSAGE [ italian ] = "Impossibile ordinare la selezione" ;
    MESSAGE [ portuguese_brazilian ] = "Não posso ordenar seleção" ;
    MESSAGE [ portuguese ] = "Impossível ordenar selecção" ;
    MESSAGE [ finnish ] = "Valittuja tietoja ei voi lajitella" ;
    MESSAGE [ danish ] = "Kan ikke sortere det markerede" ;
    MESSAGE [ french ] = "Impossible de trier la sélection" ;
    MESSAGE [ swedish ] = "Kan inte sortera markering" ;
    MESSAGE [ dutch ] = "Selectie kan niet worden gesorteerd" ;
    MESSAGE [ spanish ] = "No se pudo ordenar la selección" ;
    MESSAGE [ english_us ] = "Cannot sort selection" ;
    MESSAGE[ chinese_simplified ] = "ÎÞ·¨ÅÅÐòÑ¡ÔñµÄÄÚÈÝ¡£";
    MESSAGE[ russian ] = "Ñîðòèðîâêà îòáîðà íåâîçìîæíà";
    MESSAGE[ polish ] = "Nie mo¿na sortowaæ selekcji";
    MESSAGE[ japanese ] = "‘I‘ð”͈͕͂À‚בւ¦o—ˆ‚Ü‚¹‚ñB";
    MESSAGE[ chinese_traditional ] = "µLªk±Æ§Ç¿ï¾Üªº¤º®e¡C";
    MESSAGE[ arabic ] = "ÊÚÐÑ ÝÑÒ ÇáÊÍÏíÏ";
    MESSAGE[ greek ] = "Ç ôáîéíüìçóç ôçò åðéëïãÞò äåí Þôáí äõíáôÞ";
    MESSAGE[ korean ] = "¼±ÅÃÀ» Á¤·ÄÇÒ¼ö ¾ø½À´Ï´Ù.";
    MESSAGE[ turkish ] = "Seçim sýralanamadý";
    MESSAGE[ language_user1 ] = " ";
};
diff --git a/sw/source/ui/mui b/sw/source/ui/mui
new file mode 100644
index 0000000..0f96b21
--- /dev/null
+++ b/sw/source/ui/mui
@@ -0,0 +1,110 @@
########################################################################
#	makescript UI; OK 8.12.1992
########################################################################
set DEF_MAKE_SCRIPT nmake

FOR i IN {2}
	If "{i}" =~ /CO/;	set DEF_MAKE_SCRIPT cmake
						Break; End
	If "{i}" =~ /FU/;	set DEF_MAKE_SCRIPT nmake
						Break; End
END

echo "-------------------------------"
echo "MUi        © StarDivision  1992"
echo {DEF_MAKE_SCRIPT} {1}
echo "-------------------------------"

############################################################
set exit 0
export exit
set curdir `cd`


cd "{PRJ_ROOT}SW:SOURCE:UI:app
{DEF_MAKE_SCRIPT} {Parameters}

cd "{PRJ_ROOT}SW:SOURCE:UI:cctrl
{DEF_MAKE_SCRIPT} {Parameters}

cd "{PRJ_ROOT}SW:SOURCE:UI:chrdlg
{DEF_MAKE_SCRIPT} {Parameters}

cd "{PRJ_ROOT}SW:SOURCE:UI:config
{DEF_MAKE_SCRIPT} {Parameters}

cd "{PRJ_ROOT}SW:SOURCE:UI:dbui
{DEF_MAKE_SCRIPT} {Parameters}

cd "{PRJ_ROOT}SW:SOURCE:UI:dialog
{DEF_MAKE_SCRIPT} {Parameters}

cd "{PRJ_ROOT}SW:SOURCE:UI:dochdl
{DEF_MAKE_SCRIPT} {Parameters}

cd "{PRJ_ROOT}SW:SOURCE:UI:docvw
{DEF_MAKE_SCRIPT} {Parameters}

cd "{PRJ_ROOT}SW:SOURCE:UI:fldui
{DEF_MAKE_SCRIPT} {Parameters}

cd "{PRJ_ROOT}SW:SOURCE:UI:fmtui
{DEF_MAKE_SCRIPT} {Parameters}

cd "{PRJ_ROOT}SW:SOURCE:UI:frmdlg
{DEF_MAKE_SCRIPT} {Parameters}

cd "{PRJ_ROOT}SW:SOURCE:UI:globdoc
{DEF_MAKE_SCRIPT} {Parameters}

cd "{PRJ_ROOT}SW:SOURCE:UI:grfdlg
{DEF_MAKE_SCRIPT} {Parameters}

cd "{PRJ_ROOT}SW:SOURCE:UI:index
{DEF_MAKE_SCRIPT} {Parameters}

cd "{PRJ_ROOT}SW:SOURCE:UI:lingu
{DEF_MAKE_SCRIPT} {Parameters}

cd "{PRJ_ROOT}SW:SOURCE:UI:misc
{DEF_MAKE_SCRIPT} {Parameters}

cd "{PRJ_ROOT}SW:SOURCE:UI:prndlg
{DEF_MAKE_SCRIPT} {Parameters}

cd "{PRJ_ROOT}SW:SOURCE:UI:ribbar
{DEF_MAKE_SCRIPT} {Parameters}

cd "{PRJ_ROOT}SW:SOURCE:UI:shells
{DEF_MAKE_SCRIPT} {Parameters}

cd "{PRJ_ROOT}SW:SOURCE:UI:table
{DEF_MAKE_SCRIPT} {Parameters}

cd "{PRJ_ROOT}SW:SOURCE:UI:tabwin
{DEF_MAKE_SCRIPT} {Parameters}

cd "{PRJ_ROOT}SW:SOURCE:UI:uiview
{DEF_MAKE_SCRIPT} {Parameters}

cd "{PRJ_ROOT}SW:SOURCE:UI:utlui
{DEF_MAKE_SCRIPT} {Parameters}

cd "{PRJ_ROOT}SW:SOURCE:UI:window
{DEF_MAKE_SCRIPT} {Parameters}

cd "{PRJ_ROOT}SW:SOURCE:UI:wizard
{DEF_MAKE_SCRIPT} {Parameters}

cd "{PRJ_ROOT}SW:SOURCE:UI:wrtsh
{DEF_MAKE_SCRIPT} {Parameters}

cd {curdir}

beep 1c,1
beep 1d,1
beep 1e,1
beep 1f,1
beep 1g,1
beep 1a,1
############################################################
diff --git a/sw/source/ui/ribbar/conarc.cxx b/sw/source/ui/ribbar/conarc.cxx
new file mode 100644
index 0000000..fac5c69
--- /dev/null
+++ b/sw/source/ui/ribbar/conarc.cxx
@@ -0,0 +1,257 @@
/*************************************************************************
 *
 *  $RCSfile: conarc.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:46 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SVDOBJ_HXX //autogen
#include <svx/svdobj.hxx>
#endif


#include "view.hxx"
#include "edtwin.hxx"
#include "wrtsh.hxx"
#include "drawbase.hxx"
#include "conarc.hxx"



/*************************************************************************
|*
|* Konstruktor
|*
\************************************************************************/



ConstArc::ConstArc(SwWrtShell* pWrtShell, SwEditWin* pEditWin, SwView* pSwView)
    : SwDrawBase(pWrtShell, pEditWin, pSwView), nAnzButUp(0)
{
}

/*************************************************************************
|*
|* MouseButtonDown-event
|*
\************************************************************************/



BOOL ConstArc::MouseButtonDown( const MouseEvent& rMEvt )
{
    BOOL bReturn;

    if ((bReturn = SwDrawBase::MouseButtonDown(rMEvt)) == TRUE)
    {
        if (!nAnzButUp)
            aStartPnt = pWin->PixelToLogic(rMEvt.GetPosPixel());
    }
    return (bReturn);
}

/*************************************************************************
|*
|* MouseButtonUp-event
|*
\************************************************************************/



BOOL ConstArc::MouseButtonUp( const MouseEvent& rMEvt )
{
    BOOL bReturn = FALSE;

    if ((pSh->IsDrawCreate() || pWin->IsDrawAction()) && rMEvt.IsLeft())
    {
        Point aPnt(pWin->PixelToLogic(rMEvt.GetPosPixel()));
        if (!nAnzButUp && aPnt == aStartPnt)
        {
            SwDrawBase::MouseButtonUp(rMEvt);
            bReturn = TRUE;
        }
        else
        {   nAnzButUp++;

            if (nAnzButUp == 3)     // Kreisbogenerzeugung beendet
            {
                SwDrawBase::MouseButtonUp(rMEvt);
                nAnzButUp = 0;
                bReturn = TRUE;
            }
            else
                pSh->EndCreate(SDRCREATE_NEXTPOINT);
        }
    }
/*  else if ( pView->IsCreateObj() && rMEvt.IsRight() )
    {
        pView->EndCreateObj( SDRCREATE_FORCEEND );
        bReturn = TRUE;
    }*/

    return (bReturn);
}

/*************************************************************************
|*
|* Function aktivieren
|*
\************************************************************************/



void ConstArc::Activate(const USHORT nSlotId)
{
    switch (nSlotId)
    {
        case SID_DRAW_ARC:
            pWin->SetDrawMode(OBJ_CARC);
            break;
        case SID_DRAW_PIE:
            pWin->SetDrawMode(OBJ_SECT);
            break;
        case SID_DRAW_CIRCLECUT:
            pWin->SetDrawMode(OBJ_CCUT);
            break;
        default:
            pWin->SetDrawMode(OBJ_NONE);
            break;
    }

    SwDrawBase::Activate(nSlotId);
}

/*************************************************************************
|*
|* Funktion deaktivieren
|*
\************************************************************************/

void ConstArc::Deactivate()
{
    nAnzButUp = 0;

    SwDrawBase::Deactivate();
}

/*************************************************************************

      Source Code Control System - History

      $Log: not supported by cvs2svn $
      Revision 1.24  2000/09/18 16:06:00  willem.vandorp
      OpenOffice header added.

      Revision 1.23  1997/11/24 13:53:58  MA
      includes


      Rev 1.22   24 Nov 1997 14:53:58   MA
   includes

      Rev 1.21   03 Nov 1997 13:24:22   MA
   precomp entfernt

      Rev 1.20   05 Sep 1997 11:59:36   MH
   chg: header

      Rev 1.19   04 Feb 1997 15:20:32   OM
   Bugs in Selektionsmodi behoben

      Rev 1.18   28 Aug 1996 13:39:26   OS
   includes

      Rev 1.17   14 Aug 1996 11:31:02   JP
   svdraw.hxx entfernt

      Rev 1.16   23 May 1996 08:50:16   OS
   ein define weniger

      Rev 1.15   07 Mar 1996 14:27:30   HJS
   2 defines zu viel

      Rev 1.14   24 Nov 1995 16:58:04   OM
   PCH->PRECOMPILED

      Rev 1.13   15 Nov 1995 18:35:26   OM
   Virtuelle Fkt rausgeworfen

      Rev 1.12   21 Sep 1995 18:38:28   OM
   Selektionsmodi ueberarbeitet

      Rev 1.11   20 Sep 1995 10:07:02   OM
   Control-Browser: Stati gefixt

      Rev 1.10   09 Aug 1995 16:55:38   MA
   drawing-undo-header rein

      Rev 1.9   21 Jun 1995 16:15:26   OS
   SID_TOOL => SID_DRAW

      Rev 1.8   24 Apr 1995 12:44:36   OM
   Absturz bei Delete gefixt

*************************************************************************/


diff --git a/sw/source/ui/ribbar/conform.cxx b/sw/source/ui/ribbar/conform.cxx
new file mode 100644
index 0000000..0fd7e44
--- /dev/null
+++ b/sw/source/ui/ribbar/conform.cxx
@@ -0,0 +1,193 @@
/*************************************************************************
 *
 *  $RCSfile: conform.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:46 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop


#ifndef _SVX_FMGLOB_HXX //autogen
#include <svx/fmglob.hxx>
#endif
#ifndef _SVDVIEW_HXX //autogen
#include <svx/svdview.hxx>
#endif
#ifndef _SVDOBJ_HXX //autogen
#include <svx/svdobj.hxx>
#endif
#ifndef _SVX_FMSHELL_HXX //autogen
#include <svx/fmshell.hxx>
#endif


#include "view.hxx"
#include "edtwin.hxx"
#include "wrtsh.hxx"
#include "drawbase.hxx"
#include "conform.hxx"

extern BOOL bNoInterrupt;       // in mainwn.cxx

/*************************************************************************
|*
|* Konstruktor
|*
\************************************************************************/


ConstFormControl::ConstFormControl(SwWrtShell* pWrtShell, SwEditWin* pEditWin, SwView* pSwView) :
    SwDrawBase(pWrtShell, pEditWin, pSwView)
{
    bInsForm = TRUE;
}

/*************************************************************************
|*
|* MouseButtonDown-event
|*
\************************************************************************/


BOOL ConstFormControl::MouseButtonDown(const MouseEvent& rMEvt)
{
    BOOL bReturn = FALSE;

    SdrView *pSdrView = pSh->GetDrawView();

    pSdrView->SetOrtho(rMEvt.IsShift());
    pSdrView->SetAngleSnapEnabled(rMEvt.IsShift());

    if (rMEvt.IsMod2())
    {
        pSdrView->SetCreate1stPointAsCenter(TRUE);
        pSdrView->SetResizeAtCenter(TRUE);
    }
    else
    {
        pSdrView->SetCreate1stPointAsCenter(FALSE);
        pSdrView->SetResizeAtCenter(FALSE);
    }

    SdrViewEvent aVEvt;
    SdrHitKind eHit = pSdrView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt);

    // Nur neues Objekt, wenn nicht im Basismode (bzw reinem Selektionsmode)
    if (rMEvt.IsLeft() && !pWin->IsDrawAction() &&
        (eHit == SDRHIT_UNMARKEDOBJECT || eHit == SDRHIT_NONE || pSh->IsDrawCreate()))
    {
        bNoInterrupt = TRUE;
        pWin->CaptureMouse();

        pWin->SetPointer(Pointer(POINTER_DRAW_RECT));

        aStartPos = pWin->PixelToLogic(rMEvt.GetPosPixel());
        bReturn = pSh->BeginCreate(pWin->GetDrawMode(), FmFormInventor, aStartPos);

        if (bReturn)
            pWin->SetDrawAction(TRUE);
    }
    else
        bReturn = SwDrawBase::MouseButtonDown(rMEvt);

    return (bReturn);
}

/*************************************************************************
|*
|* Function aktivieren
|*
\************************************************************************/


void ConstFormControl::Activate(const USHORT nSlotId)
{
    pWin->SetDrawMode(nSlotId);
    SwDrawBase::Activate(nSlotId);
    pSh->GetDrawView()->SetCurrentObj(nSlotId);

    pWin->SetPointer(Pointer(POINTER_DRAW_RECT));
}

/*************************************************************************

      Source Code Control System - History

      $Log: not supported by cvs2svn $
      Revision 1.4  2000/09/18 16:06:00  willem.vandorp
      OpenOffice header added.

      Revision 1.3  1998/03/16 11:03:42  MA
      Verbindung FormShell->DrawView immer herstellen


      Rev 1.2   16 Mar 1998 12:03:42   MA
   Verbindung FormShell->DrawView immer herstellen

      Rev 1.1   11 Mar 1998 17:12:08   OM
   DB-FormShell

      Rev 1.0   10 Mar 1998 14:15:20   OM
   Initial revision.

*************************************************************************/

diff --git a/sw/source/ui/ribbar/conpoly.cxx b/sw/source/ui/ribbar/conpoly.cxx
new file mode 100644
index 0000000..ff74bf0
--- /dev/null
+++ b/sw/source/ui/ribbar/conpoly.cxx
@@ -0,0 +1,304 @@
/*************************************************************************
 *
 *  $RCSfile: conpoly.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:46 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SVDMARK_HXX //autogen
#include <svx/svdmark.hxx>
#endif
#ifndef _SVDVIEW_HXX //autogen
#include <svx/svdview.hxx>
#endif
#ifndef _SVDOPATH_HXX //autogen
#include <svx/svdopath.hxx>
#endif

#include "view.hxx"
#include "edtwin.hxx"
#include "wrtsh.hxx"
#include "drawbase.hxx"
#include "conpoly.hxx"


/************************************************************************/

#define CLOSE_PIXDIST   5   // Pixelabstand, ab dem geschlossen wird

/*************************************************************************
|*
|* Konstruktor
|*
\************************************************************************/



ConstPolygon::ConstPolygon(SwWrtShell* pWrtShell, SwEditWin* pEditWin, SwView* pSwView) :
                SwDrawBase(pWrtShell, pEditWin, pSwView)
{
}

/*************************************************************************
|*
|* MouseButtonDown-event
|*
\************************************************************************/



BOOL ConstPolygon::MouseButtonDown(const MouseEvent& rMEvt)
{
    BOOL bReturn;

    if ((bReturn = SwDrawBase::MouseButtonDown(rMEvt)) == TRUE)
        aLastPos = rMEvt.GetPosPixel();

    return (bReturn);
}

/*************************************************************************
|*
|* MouseMove-event
|*
\************************************************************************/



BOOL ConstPolygon::MouseMove(const MouseEvent& rMEvt)
{
    BOOL bReturn = FALSE;

    bReturn = SwDrawBase::MouseMove(rMEvt);

    return bReturn;
}

/*************************************************************************
|*
|* MouseButtonUp-event
|*
\************************************************************************/



BOOL ConstPolygon::MouseButtonUp(const MouseEvent& rMEvt)
{
    BOOL bReturn = FALSE;

    if (pSh->IsDrawCreate())
    {
        if (rMEvt.IsLeft() && rMEvt.GetClicks() == 1 &&
                                        pWin->GetDrawMode() != OBJ_FREELINE)
        {
            if (!pSh->EndCreate(SDRCREATE_NEXTPOINT))
            {
                pSh->BreakCreate();
                EnterSelectMode(rMEvt);
                return TRUE;
            }
        }
        else
        {
            Point aPnt(pWin->PixelToLogic(rMEvt.GetPosPixel()));
            bReturn = SwDrawBase::MouseButtonUp(rMEvt);

            if (!(bReturn && (aPnt == aStartPos || rMEvt.IsRight())))
            {
                SdrView *pSdrView = pSh->GetDrawView();

                long nCloseDist = pWin->PixelToLogic(Size(CLOSE_PIXDIST, 0)).Width();
                const SdrMarkList& rMarkList = pSdrView->GetMarkList();
                if (rMarkList.GetMark(0))
                {
                    SdrPathObj* pPathObj = (SdrPathObj *)rMarkList.GetMark(0)->GetObj();
                    const XPolyPolygon& rXPP = pPathObj->GetPathPoly();
                    if (rXPP.Count() == 1)
                    {
                        USHORT nPntMax = rXPP[0].GetPointCount() - 1;
                        Point aDiff = rXPP[0][nPntMax] - rXPP[0][0];
                        long nSqDist = aDiff.X() * aDiff.X() + aDiff.Y() * aDiff.Y();
                        nCloseDist *= nCloseDist;

                        if (nSqDist <= nCloseDist && !pPathObj->IsClosed())
                            pPathObj->ToggleClosed(0);
                    }
                }
            }
        }
    }
    else
        bReturn = SwDrawBase::MouseButtonUp(rMEvt);

    return (bReturn);
}

/*************************************************************************
|*
|* Function aktivieren
|*
\************************************************************************/



void ConstPolygon::Activate(const USHORT nSlotId)
{
    switch (nSlotId)
    {
        case SID_DRAW_POLYGON_NOFILL:
            pWin->SetDrawMode(OBJ_PLIN);
            break;

        case SID_DRAW_BEZIER_NOFILL:
            pWin->SetDrawMode(OBJ_PATHLINE);
            break;

        case SID_DRAW_FREELINE_NOFILL:
            pWin->SetDrawMode(OBJ_FREELINE);
            break;

        default:
            break;
    }

    SwDrawBase::Activate(nSlotId);
}

/*************************************************************************

      Source Code Control System - History

      $Log: not supported by cvs2svn $
      Revision 1.29  2000/09/18 16:06:01  willem.vandorp
      OpenOffice header added.

      Revision 1.28  1997/11/28 19:14:18  MA
      includes


      Rev 1.27   28 Nov 1997 20:14:18   MA
   includes

      Rev 1.26   24 Nov 1997 14:53:58   MA
   includes

      Rev 1.25   03 Nov 1997 13:24:20   MA
   precomp entfernt

      Rev 1.24   05 Sep 1997 11:57:52   MH
   chg: header

      Rev 1.23   13 Aug 1997 12:18:56   OM
   #42383# Selektion von Punkten im Konstruktionsmode

      Rev 1.22   20 Mar 1997 12:14:28   OM
   GPF in Beziermode behoben

      Rev 1.21   30 Jan 1997 11:48:08   OM
   Freihandzeichnen

      Rev 1.20   29 Jan 1997 11:22:08   OM
   Freihandzeichnen

      Rev 1.19   23 Jan 1997 16:07:06   OM
   Neuer Polygon Zeichenmode

      Rev 1.18   16 Jan 1997 12:35:58   OM
   Neuer Objekttyp: Bezier

      Rev 1.17   28 Aug 1996 13:39:32   OS
   includes

      Rev 1.16   14 Aug 1996 11:31:00   JP
   svdraw.hxx entfernt

      Rev 1.15   24 Nov 1995 16:58:06   OM
   PCH->PRECOMPILED

      Rev 1.14   15 Nov 1995 18:35:28   OM
   Virtuelle Fkt rausgeworfen

      Rev 1.13   10 Aug 1995 18:15:00   OM
   CreateMode geaendert

      Rev 1.12   09 Aug 1995 16:53:02   MA
   drawing-undo-header rein

      Rev 1.11   20 Jul 1995 19:26:38   OM
   Umbenamsung obj_pathline->obj_plin

      Rev 1.10   06 May 1995 20:38:04   OM
   Polygonerzeugung bei Einfachklick

      Rev 1.9   21 Apr 1995 02:18:44   ER
   ToggleClosed erwartet jetzt ein long und kein Size() mehr

      Rev 1.8   06 Apr 1995 20:15:56   OM
   Polygon beenden mit rechter Maustaste

      Rev 1.7   21 Mar 1995 00:47:02   ER
   _svdorect_hxx definiert => _svdcapt_hxx definieren

*************************************************************************/


diff --git a/sw/source/ui/ribbar/conrect.cxx b/sw/source/ui/ribbar/conrect.cxx
new file mode 100644
index 0000000..cba447d
--- /dev/null
+++ b/sw/source/ui/ribbar/conrect.cxx
@@ -0,0 +1,338 @@
/*************************************************************************
 *
 *  $RCSfile: conrect.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:46 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SFX_BINDINGS_HXX //autogen
#include <sfx2/bindings.hxx>
#endif
#ifndef _SVX_HTMLMODE_HXX //autogen
#include <svx/htmlmode.hxx>
#endif
#ifndef sdtacitm_hxx //autogen
#include <svx/sdtacitm.hxx>
#endif
#ifndef _SVDOBJ_HXX //autogen
#include <svx/svdobj.hxx>
#endif
#ifndef _SDTAGITM_HXX //autogen
#include <svx/sdtagitm.hxx>
#endif
#ifndef SDTAKITM_HXX //autogen
#include <svx/sdtakitm.hxx>
#endif
#ifndef _SDTADITM_HXX //autogen
#include <svx/sdtaditm.hxx>
#endif
#ifndef _SDTAAITM_HXX //autogen
#include <svx/sdtaaitm.hxx>
#endif
#ifndef _SVDVIEW_HXX //autogen
#include <svx/svdview.hxx>
#endif
#ifndef _SFXVIEWFRM_HXX
#include <sfx2/viewfrm.hxx>
#endif

#include "cmdid.h"
#include "view.hxx"
#include "edtwin.hxx"
#include "wrtsh.hxx"
#include "viewopt.hxx"
#include "drawbase.hxx"
#include "conrect.hxx"


/*************************************************************************
|*
|* Konstruktor
|*
\************************************************************************/



ConstRectangle::ConstRectangle(SwWrtShell* pWrtShell, SwEditWin* pEditWin, SwView* pSwView) :
                SwDrawBase(pWrtShell, pEditWin, pSwView),
                bMarquee(FALSE)
{
}

/*************************************************************************
|*
|* MouseButtonDown-event
|*
\************************************************************************/



BOOL ConstRectangle::MouseButtonDown(const MouseEvent& rMEvt)
{
    BOOL bReturn;

    if ((bReturn = SwDrawBase::MouseButtonDown(rMEvt)) == TRUE
                                    && pWin->GetDrawMode() == OBJ_CAPTION)
    {
        pView->NoRotate();
        if (pView->IsDrawSelMode())
        {
            pView->FlipDrawSelMode();
            pSh->GetDrawView()->SetFrameDragSingles(pView->IsDrawSelMode());
        }
    }
    return (bReturn);
}

/*************************************************************************
|*
|* MouseButtonUp-event
|*
\************************************************************************/



BOOL ConstRectangle::MouseButtonUp(const MouseEvent& rMEvt)
{
    Point aPnt(pWin->PixelToLogic(rMEvt.GetPosPixel()));

    BOOL bRet = SwDrawBase::MouseButtonUp(rMEvt);

    if (bRet && pWin->GetDrawMode() == OBJ_TEXT)
    {
        SdrView *pSdrView = pSh->GetDrawView();

        if (bMarquee)
        {
            BOOL bNewMode = (::GetHtmlMode(pView->GetDocShell()) & HTMLMODE_ON) != 0;
                pSh->ChgAnchor(FLY_IN_CNTNT);

            const SdrMarkList& rMarkList = pSdrView->GetMarkList();

            if (rMarkList.GetMark(0))
            {
                SdrObject* pObj = rMarkList.GetMark(0)->GetObj();

                // die fuer das Scrollen benoetigten Attribute setzen
                SfxItemSet aItemSet( pSdrView->GetModel()->GetItemPool(),
                                        SDRATTR_MISC_FIRST, SDRATTR_MISC_LAST);

                aItemSet.Put( SdrTextAutoGrowWidthItem( FALSE ) );
                aItemSet.Put( SdrTextAutoGrowHeightItem( FALSE ) );
                aItemSet.Put( SdrTextAniKindItem( SDRTEXTANI_SCROLL ) );
                aItemSet.Put( SdrTextAniDirectionItem( SDRTEXTANI_LEFT ) );
                aItemSet.Put( SdrTextAniCountItem( 0 ) );
                aItemSet.Put( SdrTextAniAmountItem((INT16)pWin->PixelToLogic(Size(2,1)).Width()) );
                pObj->SetAttributes(aItemSet, FALSE);
            }
        }

        pView->LeaveDrawCreate();   // In Selektionsmode wechseln

        pSh->GetView().GetViewFrame()->GetBindings().Invalidate(SID_INSERT_DRAW);

        SdrPageView* pPV = pSdrView->GetPageViewPvNum(0);
        const SdrMarkList& rMarkList = pSdrView->GetMarkList();
        if (rMarkList.GetMark(0))
        {
            SdrObject* pObj = rMarkList.GetMark(0)->GetObj();

            pView->BeginTextEdit(pObj, pPV, pWin, TRUE);
        }
    }
    return bRet;
}

/*************************************************************************
|*
|* Function aktivieren
|*
\************************************************************************/



void ConstRectangle::Activate(const USHORT nSlotId)
{
    bMarquee = FALSE;

    switch (nSlotId)
    {
        case SID_DRAW_LINE:
            pWin->SetDrawMode(OBJ_LINE);
            break;
        case SID_DRAW_RECT:
            pWin->SetDrawMode(OBJ_RECT);
            break;
        case SID_DRAW_ELLIPSE:
            pWin->SetDrawMode(OBJ_CIRC);
            break;
        case SID_DRAW_TEXT_MARQUEE:
            bMarquee = TRUE;
        case SID_DRAW_TEXT:
            pWin->SetDrawMode(OBJ_TEXT);
            break;

        case SID_DRAW_CAPTION:
            pWin->SetDrawMode(OBJ_CAPTION);
            break;
        default:
            pWin->SetDrawMode(OBJ_NONE);
            break;
    }

    SwDrawBase::Activate(nSlotId);
}

/*************************************************************************

      Source Code Control System - History

      $Log: not supported by cvs2svn $
      Revision 1.45  2000/09/18 16:06:01  willem.vandorp
      OpenOffice header added.

      Revision 1.44  2000/09/07 15:59:26  os
      change: SFX_DISPATCHER/SFX_BINDINGS removed

      Revision 1.43  1998/06/09 13:34:00  OM
      VC-Controls entfernt


      Rev 1.42   09 Jun 1998 15:34:00   OM
   VC-Controls entfernt

      Rev 1.41   28 Nov 1997 20:05:50   MA
   includes

      Rev 1.40   24 Nov 1997 14:53:58   MA
   includes

      Rev 1.39   18 Nov 1997 10:35:12   OM
   Lauftext nur im HTML-Mode zeichengebunden einfuegen

      Rev 1.38   03 Nov 1997 13:24:22   MA
   precomp entfernt

      Rev 1.37   05 Sep 1997 11:55:04   MH
   chg: header

      Rev 1.36   07 Apr 1997 13:39:28   MH
   chg: header

      Rev 1.35   07 Mar 1997 17:13:38   OM
   Lauftext unendlich oft durchlaufen

      Rev 1.34   07 Mar 1997 17:05:12   OM
   Lauftext unendlich oft durchlaufen

      Rev 1.33   24 Feb 1997 16:55:48   OM
   Lauftext-Objekt sofort editieren

      Rev 1.32   14 Feb 1997 14:00:34   OM
   lauftextobjekt zeichengebunden

      Rev 1.31   11 Feb 1997 14:03:32   OM
   Lauftext im Webmode

      Rev 1.30   10 Feb 1997 17:29:42   OM
   Lauftext

      Rev 1.29   09 Sep 1996 21:13:44   MH
   Umstellungen wg. internal Compiler Errors

      Rev 1.28   28 Aug 1996 13:39:22   OS
   includes

      Rev 1.27   14 Aug 1996 11:31:00   JP
   svdraw.hxx entfernt

      Rev 1.26   07 Aug 1996 14:59:24   JP
   Umstellung fuer Upd. 330

      Rev 1.25   24 Nov 1995 16:58:04   OM
   PCH->PRECOMPILED

      Rev 1.24   15 Nov 1995 18:35:28   OM
   Virtuelle Fkt rausgeworfen

      Rev 1.23   14 Nov 1995 17:36:56   OM
   Cast entfernt

      Rev 1.22   08 Nov 1995 15:29:48   OM
   Invalidate-Reihenfolge geaendert

      Rev 1.21   08 Nov 1995 14:15:50   OS
   Change => Set

      Rev 1.20   08 Nov 1995 10:35:42   OM
   Invalidate optimiert

      Rev 1.19   26 Oct 1995 16:41:36   OM
   Leere Textobjekte beim Verlassen loeschen

      Rev 1.18   08 Oct 1995 18:06:46   OM
   Textobjekt nach einfuegen oeffnen

*************************************************************************/


diff --git a/sw/source/ui/ribbar/drawbase.cxx b/sw/source/ui/ribbar/drawbase.cxx
new file mode 100644
index 0000000..4710570
--- /dev/null
+++ b/sw/source/ui/ribbar/drawbase.cxx
@@ -0,0 +1,873 @@
/*************************************************************************
 *
 *  $RCSfile: drawbase.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:46 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop
#include <hintids.hxx>
#ifndef _UIPARAM_HXX
#include <uiparam.hxx>
#endif

#ifndef _LIST_HXX //autogen
#include <tools/list.hxx>
#endif
#ifndef _SVDVIEW_HXX //autogen
#include <svx/svdview.hxx>
#endif
#ifndef _SVDOBJ_HXX //autogen
#include <svx/svdobj.hxx>
#endif
#ifndef _SFXPTITEM_HXX //autogen
#include <svtools/ptitem.hxx>
#endif
#ifndef _SVX_SIZEITEM_HXX //autogen
#include <svx/sizeitem.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SFX_BINDINGS_HXX //autogen
#include <sfx2/bindings.hxx>
#endif
#ifndef _FMTCLDS_HXX
#include <fmtclds.hxx>
#endif
#ifndef _FRMFMT_HXX //autogen
#include <frmfmt.hxx>
#endif
#ifndef _SFXVIEWFRM_HXX
#include <sfx2/viewfrm.hxx>
#endif

#include "cmdid.h"
#include "basesh.hxx"
#include "view.hxx"
#include "wrtsh.hxx"
#include "drawbase.hxx"
#include "edtwin.hxx"
#include "caption.hxx"
#include "swundo.hxx"

extern BOOL bNoInterrupt;       // in mainwn.cxx

#define MINMOVE ((USHORT)pSh->GetOut()->PixelToLogic(Size(pSh->GetDrawView()->GetMarkHdlSizePixel()/2,0)).Width())


/*************************************************************************
|*
|* Konstruktor
|*
\************************************************************************/


SwDrawBase::SwDrawBase(SwWrtShell* pSwWrtShell, SwEditWin* pWindow, SwView* pSwView) :
    pSh(pSwWrtShell),
    pWin(pWindow),
    pView(pSwView),
    bInsForm(FALSE),
    bCreateObj(TRUE)
{
    if ( !pSh->HasDrawView() )
        pSh->MakeDrawView();
}

/*************************************************************************
|*
|* Destruktor
|*
\************************************************************************/

__EXPORT SwDrawBase::~SwDrawBase()
{
    if (pView->GetWrtShellPtr())    // Im view-Dtor koennte die wrtsh bereits geloescht worden sein...
        pSh->GetDrawView()->SetEditMode(TRUE);
}

/*************************************************************************
|*
|* MouseButtonDown-event
|*
\************************************************************************/


BOOL SwDrawBase::MouseButtonDown(const MouseEvent& rMEvt)
{
    BOOL bReturn = FALSE;

    SdrView *pSdrView = pSh->GetDrawView();

    pSdrView->SetOrtho(rMEvt.IsShift());
    pSdrView->SetAngleSnapEnabled(rMEvt.IsShift());

    if (rMEvt.IsMod2())
    {
        pSdrView->SetCreate1stPointAsCenter(TRUE);
        pSdrView->SetResizeAtCenter(TRUE);
    }
    else
    {
        pSdrView->SetCreate1stPointAsCenter(FALSE);
        pSdrView->SetResizeAtCenter(FALSE);
    }

    SdrViewEvent aVEvt;
    SdrHitKind eHit = pSdrView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt);

    // Nur neues Objekt, wenn nicht im Basismode (bzw reinem Selektionsmode)
    if (rMEvt.IsLeft() && !pWin->IsDrawAction())
    {
        if (IsCreateObj() && (eHit == SDRHIT_UNMARKEDOBJECT || eHit == SDRHIT_NONE || pSh->IsDrawCreate()))
        {
            bNoInterrupt = TRUE;
            pWin->CaptureMouse();

            aStartPos = pWin->PixelToLogic(rMEvt.GetPosPixel());

            bReturn = pSh->BeginCreate(pWin->GetDrawMode(), aStartPos);

            SetDrawPointer();

            if ( bReturn )
                pWin->SetDrawAction(TRUE);
        }
        else if (!pSdrView->IsAction())
        {
            /**********************************************************************
            * BEZIER-EDITOR
            **********************************************************************/
            pWin->CaptureMouse();
            aStartPos = pWin->PixelToLogic(rMEvt.GetPosPixel());
            UINT16 nEditMode = pWin->GetBezierMode();

            if (eHit == SDRHIT_HANDLE && aVEvt.pHdl->GetKind() == HDL_BWGT)
            {
                /******************************************************************
                * Handle draggen
                ******************************************************************/
                bNoInterrupt = TRUE;
                bReturn = pSdrView->BegDragObj(aStartPos, (OutputDevice*) NULL, aVEvt.pHdl);
                pWin->SetDrawAction(TRUE);
            }
            else if (eHit == SDRHIT_MARKEDOBJECT && nEditMode == SID_BEZIER_INSERT)
            {
                /******************************************************************
                * Klebepunkt einfuegen
                ******************************************************************/
                bNoInterrupt = TRUE;
                bReturn = pSdrView->BegInsObjPoint(aStartPos, rMEvt.IsMod1(), NULL, 0);
                pWin->SetDrawAction(TRUE);
            }
            else if (eHit == SDRHIT_MARKEDOBJECT && rMEvt.IsMod1())
            {
                /******************************************************************
                * Klebepunkt selektieren
                ******************************************************************/
                if (!rMEvt.IsShift())
                    pSdrView->UnmarkAllPoints();

                bReturn = pSdrView->BegMarkPoints(aStartPos, (OutputDevice*) NULL);
                pWin->SetDrawAction(TRUE);
            }
            else if (eHit == SDRHIT_MARKEDOBJECT && !rMEvt.IsShift() && !rMEvt.IsMod2())
            {
                /******************************************************************
                * Objekt verschieben
                ******************************************************************/
                return FALSE;
            }
            else if (eHit == SDRHIT_HANDLE)
            {
                /******************************************************************
                * Klebepunkt selektieren
                ******************************************************************/
                if (pSdrView->HasMarkablePoints() && (!pSdrView->IsPointMarked(*aVEvt.pHdl) || rMEvt.IsShift()))
                {
                    SdrHdl* pHdl = NULL;

                    if (!rMEvt.IsShift())
                    {
                        pSdrView->UnmarkAllPoints();
                        pHdl = pSdrView->HitHandle(aStartPos, *pWin);
                    }
                    else
                    {
                        if (pSdrView->IsPointMarked(*aVEvt.pHdl))
                        {
                            bReturn = pSdrView->UnmarkPoint(*aVEvt.pHdl);
                            pHdl = NULL;
                        }
                        else
                        {
                            pHdl = pSdrView->HitHandle(aStartPos, *pWin);
                        }
                    }

                    if (pHdl)
                    {
                        bNoInterrupt = TRUE;
                        pSdrView->MarkPoint(*pHdl);
//                      bReturn = pSdrView->BegDragObj(aStartPos, (OutputDevice*) NULL, pHdl);
//                      pWin->SetDrawAction(TRUE);
                    }
                }
            }
            else
            {
                /******************************************************************
                * Objekt selektieren oder draggen
                ******************************************************************/
                if (pSh->IsObjSelectable(aStartPos) && eHit == SDRHIT_UNMARKEDOBJECT)
                {
                    if (pSdrView->HasMarkablePoints())
                        pSdrView->UnmarkAllPoints();

                    bNoInterrupt = FALSE;
                    // Drag im edtwin verwenden
                    return FALSE;
                }

                bNoInterrupt = TRUE;

                if (pSh->IsObjSelected())
                {
                    if (!rMEvt.IsShift())
                    {
                        if (!pSdrView->HasMarkablePoints())
                            pSh->SelectObj(Point(LONG_MAX, LONG_MAX));  // Alles deselektieren
                        else
                            pSdrView->UnmarkAllPoints();
                    }
                }
                BOOL bMarked = FALSE;

                if (!pSh->IsSelFrmMode())
                    pSh->EnterSelFrmMode(NULL);

                if ((bReturn = pSh->BeginMark(aStartPos)) == TRUE)
                        pWin->SetDrawAction(TRUE);

                SetDrawPointer();
            }
        }
    }
    return bReturn;
}

/*************************************************************************
|*
|* MouseMove-event
|*
\************************************************************************/


BOOL SwDrawBase::MouseMove(const MouseEvent& rMEvt)
{
    SdrView *pSdrView = pSh->GetDrawView();
    Point aPnt(pWin->PixelToLogic(rMEvt.GetPosPixel()));
    BOOL bRet = FALSE;

    if (IsCreateObj() && !pWin->IsDrawSelMode() && pSdrView->IsCreateObj())
    {
        pSdrView->SetOrtho(rMEvt.IsShift());
        pSdrView->SetAngleSnapEnabled(rMEvt.IsShift());

        pSh->MoveCreate(aPnt);
        bRet = TRUE;
    }
    else if (pSdrView->IsAction() || pSdrView->IsInsObjPoint() || pSdrView->IsMarkPoints())
    {
        pSh->MoveMark(aPnt);
        bRet = TRUE;
    }

    return (bRet);
}

/*************************************************************************
|*
|* MouseButtonUp-event
|*
\************************************************************************/


BOOL SwDrawBase::MouseButtonUp(const MouseEvent& rMEvt)
{
    BOOL bReturn = FALSE;
    BOOL bCheckShell = FALSE;
    BOOL bAutoCap = FALSE;

    Point aPnt(pWin->PixelToLogic(rMEvt.GetPosPixel()));

    if (IsCreateObj() && pSh->IsDrawCreate() && !pWin->IsDrawSelMode())
    {
        if (aPnt == aStartPos || rMEvt.IsRight())
        {
            pSh->BreakCreate();
            pView->LeaveDrawCreate();
        }
        else
        {
            if (pWin->GetDrawMode() == OBJ_NONE)
                pSh->StartUndo(UNDO_INSERT);

            pSh->EndCreate(SDRCREATE_FORCEEND);
            if (pWin->GetDrawMode() == OBJ_NONE)    // Textrahmen eingefuegt
            {
                bAutoCap = TRUE;
                if(pWin->GetFrmColCount() > 1)
                {
                    SfxItemSet aSet(pView->GetPool(),RES_COL,RES_COL);
                    SwFmtCol aCol((const SwFmtCol&)aSet.Get(RES_COL));
                    aCol.Init(pWin->GetFrmColCount(), aCol.GetGutterWidth(), aCol.GetWishWidth());
                    aSet.Put(aCol);
                    // Vorlagen-AutoUpdate
                    SwFrmFmt* pFmt = pSh->GetCurFrmFmt();
                    if(pFmt && pFmt->IsAutoUpdateFmt())
                        pSh->AutoUpdateFrame(pFmt, aSet);
                    else
                        pSh->SetFlyFrmAttr( aSet );
                }
            }
            if (pWin->GetDrawMode() == OBJ_NONE)
                pSh->EndUndo(UNDO_INSERT);
        }

        bReturn = TRUE;

        EnterSelectMode(rMEvt);
    }
    else
    {
        SdrView *pSdrView = pSh->GetDrawView();

        if (!pSdrView->HasMarkablePoints())
        {
            /**********************************************************************
            * KEIN BEZIER_EDITOR
            **********************************************************************/
            if ((pSh->GetDrawView()->IsMarkObj() || pSh->GetDrawView()->IsMarkPoints())
                 && rMEvt.IsLeft())
            {
                bReturn = pSh->EndMark();

                pWin->SetDrawAction(FALSE);

                if (aPnt == aStartPos && pSh->IsObjSelectable(aPnt))
                {
                    pSh->SelectObj(aPnt, rMEvt.IsShift() && pSh->IsSelFrmMode());

                    if (!pSh->IsObjSelected())
                    {
                        pView->LeaveDrawCreate();   // In Selektionsmode wechseln

                        pSh->GetView().GetViewFrame()->GetBindings().Invalidate(SID_INSERT_DRAW);

                        if (pSh->IsSelFrmMode())
                            pSh->LeaveSelFrmMode();
                    }
                    pView->NoRotate();

                    bCheckShell = TRUE; // ggf BezierShell anwerfen
                }
                else if (!pSh->IsObjSelected() && !pWin->IsDrawAction())
                {
                    if (pSh->IsObjSelectable(aPnt))
                        pSh->SelectObj(aPnt, rMEvt.IsShift() && pSh->IsSelFrmMode());
                    else
                    {
                        pView->LeaveDrawCreate();
                        if (pSh->IsSelFrmMode())
                            pSh->LeaveSelFrmMode();
                    }
                    pView->NoRotate();

                    bReturn = TRUE;
                }
            }
        }
        else
        {
            /**********************************************************************
            * BEZIER_EDITOR
            **********************************************************************/
            if ( pSdrView->IsAction() )
            {
                if ( pSdrView->IsInsObjPoint() )
                    bReturn = pSdrView->EndInsObjPoint(SDRCREATE_FORCEEND);
                else if (pSdrView->IsMarkPoints() )
                    bReturn = pSdrView->EndMarkPoints();
                else
                {
                    pSdrView->EndAction();
                    bReturn = TRUE;
                }
                pWin->SetDrawAction(FALSE);

                if (aPnt == aStartPos)
                {
                    if (!pSh->IsObjSelectable(aPnt))
                        pSh->SelectObj(Point(LONG_MAX, LONG_MAX));
                    else if (!bReturn)
                    {
                        if (!rMEvt.IsShift())
                            pSdrView->UnmarkAllPoints();
                        pSh->SelectObj(aPnt, rMEvt.IsShift() && pSh->IsSelFrmMode());
                    }

                    if (!pSh->IsObjSelected())
                    {
                        pView->LeaveDrawCreate();   // In Selektionsmode wechseln

                        pSh->GetView().GetViewFrame()->GetBindings().Invalidate(SID_INSERT_DRAW);

                        if (pSh->IsSelFrmMode())
                            pSh->LeaveSelFrmMode();
                    }
                    pView->NoRotate();

                    bCheckShell = TRUE; // ggf BezierShell anwerfen
                }
            }

            SetDrawPointer();

            if (!pSh->IsObjSelected() && !pWin->IsDrawAction())
            {
                pView->LeaveDrawCreate();
                if (pSh->IsSelFrmMode())
                    pSh->LeaveSelFrmMode();

                pView->NoRotate();
                bReturn = TRUE;
            }
        }
    }

    if (bCheckShell)
        pView->AttrChangedNotify( pSh );    // ggf BezierShell anwerfen

    //!!!!!!!!!! Achtung Suizid !!!!!!!!!!! Sollte alles mal erneuert werden
    if ( bAutoCap )
        pView->AutoCaption(FRAME_CAP);  //Kann derzeit nur FRAME sein, sonst auf
                                        //enums umstellen
    return (bReturn);
}

/*************************************************************************
|*
|* Function aktivieren
|*
\************************************************************************/


void SwDrawBase::Activate(const USHORT nSlotId)
{
    SdrView *pSdrView = pSh->GetDrawView();

    pSdrView->SetCurrentObj(pWin->GetDrawMode());
    pSdrView->SetEditMode(FALSE);

    SetDrawPointer();
    pSh->NoEdit();
}

/*************************************************************************
|*
|* Function deaktivieren
|*
\************************************************************************/


void __EXPORT SwDrawBase::Deactivate()
{
    SdrView *pSdrView = pSh->GetDrawView();
    pSdrView->SetOrtho(FALSE);
    pSdrView->SetAngleSnapEnabled(FALSE);

    if (pWin->IsDrawAction() && pSh->IsDrawCreate())
        pSh->BreakCreate();

    pWin->SetDrawAction(FALSE);

    pWin->ReleaseMouse();
    bNoInterrupt = FALSE;

//  if(!pSh->IsObjSelected())
//      pSh->Edit();

    if(pWin->GetApplyTemplate())
        pWin->SetApplyTemplate(SwApplyTemplate());
    pSh->GetView().GetViewFrame()->GetBindings().Invalidate(SID_INSERT_DRAW);
}

/*************************************************************************
|*
|* Tastaturereignisse bearbeiten
|*
|* Wird ein KeyEvent bearbeitet, so ist der Return-Wert TRUE, andernfalls
|* FALSE.
|*
\************************************************************************/


BOOL SwDrawBase::KeyInput(const KeyEvent& rKEvt)
{
    BOOL bReturn = FALSE;
    USHORT nCode = rKEvt.GetKeyCode().GetCode();

    switch (nCode)
    {
        case KEY_ESCAPE:
        {
            if (pWin->IsDrawAction())
            {
                BreakCreate();
                pView->LeaveDrawCreate();
            }

            bReturn = TRUE;
        }
        break;

        case KEY_DELETE:
        {
            pSh->DelSelectedObj();
            bReturn = TRUE;
        }
        break;

        case KEY_UP:
        case KEY_DOWN:
        case KEY_LEFT:
        case KEY_RIGHT:
        {
            SdrView *pSdrView = pSh->GetDrawView();

            if (!pSdrView->IsTextEdit())
            {
                long nX = 0;
                long nY = 0;

                if (nCode == KEY_UP)
                {
                    // Scroll nach oben
                    nX = 0;
                    nY =-1;
                }
                else if (nCode == KEY_DOWN)
                {
                    // Scroll nach unten
                    nX = 0;
                    nY = 1;
                }
                else if (nCode == KEY_LEFT)
                {
                    // Scroll nach links
                    nX =-1;
                    nY = 0;
                }
                else if (nCode == KEY_RIGHT)
                {
                    // Scroll nach rechts
                    nX = 1;
                    nY = 0;
                }

                if (pSdrView->HasMarkedObj() && rKEvt.GetKeyCode().IsMod2())
                {
                    // Objekte verschieben
                    nX *= 100;
                    nY *= 100;
                    pSdrView->MoveAllMarked(Size(nX, nY));
                }

                bReturn = TRUE;
            }
        }
        break;
    }

    return (bReturn);
}


/*************************************************************************
|*
|* Tastaturereignisse bearbeiten
|*
|* Wird ein KeyEvent bearbeitet, so ist der Return-Wert TRUE, andernfalls
|* FALSE.
|*
\************************************************************************/


void SwDrawBase::BreakCreate()
{
    pSh->BreakCreate();
    pWin->SetDrawAction(FALSE);
    pWin->ReleaseMouse();

    Deactivate();
//  pView->LeaveDrawCreate();
}

/*************************************************************************
|*
|* Mauspointer umschalten
|*
\************************************************************************/


void SwDrawBase::SetDrawPointer()
{
    SdrView *pSdrView = pSh->GetDrawView();
#ifdef VCL
        Point aPnt(pWin->OutputToScreenPixel(pWin->GetPointerPosPixel()));
#else
        Point aPnt = Pointer::GetPosPixel();
#endif
    aPnt = pWin->PixelToLogic(pWin->ScreenToOutputPixel(aPnt));
    const Pointer aPointTyp = pSdrView->GetPreferedPointer(aPnt, pSh->GetOut());
    const Pointer aDrawPt(aPointTyp);
    pWin->SetPointer(aDrawPt);
}

/*************************************************************************
|*
|* Ggf in Selektionsmode wechseln
|*
\************************************************************************/

void SwDrawBase::EnterSelectMode(const MouseEvent& rMEvt)
{
    pWin->SetDrawAction(FALSE);

    if (!pSh->IsObjSelected() && !pWin->IsDrawAction())
    {
        Point aPnt(pWin->PixelToLogic(rMEvt.GetPosPixel()));

        if (pSh->IsObjSelectable(aPnt))
        {
            pSh->SelectObj(aPnt);
            if (rMEvt.GetModifier() == KEY_SHIFT || !pSh->IsObjSelected())
            {
                pView->LeaveDrawCreate();   // In Selektionsmode wechseln

                pSh->GetView().GetViewFrame()->GetBindings().Invalidate(SID_INSERT_DRAW);
            }
        }
        else
        {
            pView->LeaveDrawCreate();
            if (pSh->IsSelFrmMode())
                pSh->LeaveSelFrmMode();
        }
        pView->NoRotate();
    }
}

/*************************************************************************

      $Log: not supported by cvs2svn $
      Revision 1.80  2000/09/18 16:06:01  willem.vandorp
      OpenOffice header added.

      Revision 1.79  2000/09/07 15:59:27  os
      change: SFX_DISPATCHER/SFX_BINDINGS removed

      Revision 1.78  2000/05/10 11:54:15  os
      Basic API removed

      Revision 1.77  1999/05/27 11:04:40  OS
      Einf?gen/Bearbeiten von Spalten ueberarbeitet


      Rev 1.76   27 May 1999 13:04:40   OS
   Einf?gen/Bearbeiten von Spalten ueberarbeitet

      Rev 1.75   11 Mar 1999 11:31:22   MA
   #63192# mit Suizid fertig werden

      Rev 1.74   16 Nov 1998 17:18:52   OM
   #58158# Beschriftung fuer weiter OLE-Objekte

      Rev 1.73   06 Nov 1998 17:05:04   OM
   #58158# Automatische Beschriftung

      Rev 1.72   09 Sep 1998 12:14:46   OM
   #56223# Kein GPF bei Klick in Seitenrand

      Rev 1.71   22 Jul 1998 16:06:00   TJ
   add: header wg. int comp. error

      Rev 1.70   09 Jun 1998 15:34:00   OM
   VC-Controls entfernt

      Rev 1.69   11 Mar 1998 17:12:08   OM
   DB-FormShell

      Rev 1.68   28 Nov 1997 20:16:46   MA
   includes

      Rev 1.67   24 Nov 1997 14:54:00   MA
   includes

      Rev 1.66   18 Sep 1997 13:59:46   OS
   Pointer::GetPosPixel fuer VCL ersetzt

      Rev 1.65   12 Sep 1997 10:36:42   OS
   ITEMID_* definiert

      Rev 1.64   04 Sep 1997 17:14:02   MA
   includes

      Rev 1.63   01 Sep 1997 13:14:38   OS
   DLL-Umstellung

      Rev 1.62   13 Aug 1997 12:19:54   OM
   #42383# Selektion von Punkten im Konstruktionsmode

      Rev 1.61   13 Aug 1997 12:18:56   OM
   #42383# Selektion von Punkten im Konstruktionsmode

      Rev 1.60   09 Aug 1997 13:33:42   OS
   paraitem/frmitems/textitem aufgeteilt

      Rev 1.59   30 Jul 1997 18:40:48   HJS
   includes

      Rev 1.58   07 Apr 1997 13:40:24   MH
   chg: header

      Rev 1.57   20 Mar 1997 11:33:46   OM
   Insert und CreateMode merken

      Rev 1.56   24 Feb 1997 16:51:46   OS
   ::Deactivate: Template-Pointer gfs. abschalten

      Rev 1.55   04 Feb 1997 15:20:32   OM
   Bugs in Selektionsmodi behoben

      Rev 1.54   31 Jan 1997 10:58:26   OM
   Statusupdate

      Rev 1.53   30 Jan 1997 11:48:10   OM
   Freihandzeichnen

      Rev 1.52   29 Jan 1997 11:22:08   OM
   Freihandzeichnen

      Rev 1.51   23 Jan 1997 16:07:06   OM
   Neuer Polygon Zeichenmode

      Rev 1.50   22 Jan 1997 11:19:48   OM
   Neue Shells: DrawBaseShell und DrawControlShell

      Rev 1.49   16 Jan 1997 12:35:58   OM
   Neuer Objekttyp: Bezier

      Rev 1.48   13 Jan 1997 15:50:18   OM
   Bezier-Punkte loeschen

      Rev 1.47   08 Jan 1997 12:44:26   OM
   Aenderungen fuer Bezier-Shell

      Rev 1.46   27 Nov 1996 17:26:22   OM
   Neu: SetAngleSnap

      Rev 1.45   28 Aug 1996 13:39:30   OS
   includes

      Rev 1.44   14 Aug 1996 15:05:28   OM
   Zentrisch konstruieren

      Rev 1.43   14 Aug 1996 11:31:00   JP
   svdraw.hxx entfernt

      Rev 1.42   09 Aug 1996 14:33:20   OM
   #29784# GPF im Dtor behoben

      Rev 1.41   07 Mar 1996 14:27:30   HJS
   2 defines zu viel

      Rev 1.40   24 Jan 1996 15:19:58   OM
   #24663# Haenger bei Polygon im Rastermode behoben

      Rev 1.39   14 Jan 1996 17:59:08   OS
   recording Rahmen einfuegen: Position von GetAnchorObjDiff() holen

      Rev 1.38   17 Dec 1995 17:28:18   OS
   Rahmen einfuegen wird jetzt an der Textshell recorded

      Rev 1.37   30 Nov 1995 13:59:52   MA
   opt: SV304, keine Pruefung vor SetPointer

      Rev 1.36   24 Nov 1995 16:58:04   OM
   PCH->PRECOMPILED

      Rev 1.35   23 Nov 1995 14:29:00   MA
   chg: GetObjAnchorDiff(), GetObjAbsPos()

*************************************************************************/


diff --git a/sw/source/ui/ribbar/dselect.cxx b/sw/source/ui/ribbar/dselect.cxx
new file mode 100644
index 0000000..d82b857
--- /dev/null
+++ b/sw/source/ui/ribbar/dselect.cxx
@@ -0,0 +1,253 @@
/*************************************************************************
 *
 *  $RCSfile: dselect.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:46 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SFX_BINDINGS_HXX //autogen
#include <sfx2/bindings.hxx>
#endif
#ifndef _SFXVIEWFRM_HXX
#include <sfx2/viewfrm.hxx>
#endif


#include "view.hxx"
#include "edtwin.hxx"
#include "wrtsh.hxx"
#include "cmdid.h"
#include "drawbase.hxx"
#include "dselect.hxx"

extern BOOL bNoInterrupt;       // in mainwn.cxx

/*************************************************************************
|*
|* Konstruktor
|*
\************************************************************************/

DrawSelection::DrawSelection(SwWrtShell* pWrtShell, SwEditWin* pEditWin, SwView* pSwView) :
                SwDrawBase(pWrtShell, pEditWin, pSwView)
{
    bCreateObj = FALSE;
}

/*************************************************************************
|*
|* Tastaturereignisse bearbeiten
|*
|* Wird ein KeyEvent bearbeitet, so ist der Return-Wert TRUE, andernfalls
|* FALSE.
|*
\************************************************************************/

BOOL DrawSelection::KeyInput(const KeyEvent& rKEvt)
{
    BOOL bReturn = FALSE;

    switch (rKEvt.GetKeyCode().GetCode())
    {
        case KEY_ESCAPE:
        {
            if (pWin->IsDrawAction())
            {
                pSh->BreakMark();
                pWin->ReleaseMouse();
            }
            bReturn = TRUE;
        }
        break;
    }

    if (!bReturn)
        bReturn = SwDrawBase::KeyInput(rKEvt);

    return (bReturn);
}

/*************************************************************************
|*
|* Function aktivieren
|*
\************************************************************************/

void DrawSelection::Activate(const USHORT nSlotId)
{
    pWin->SetDrawMode(SID_OBJECT_SELECT);
    SwDrawBase::Activate(nSlotId);

    pSh->GetView().GetViewFrame()->GetBindings().Invalidate(SID_INSERT_DRAW);
}

/*************************************************************************

      Source Code Control System - History

      $Log: not supported by cvs2svn $
      Revision 1.44  2000/09/18 16:06:01  willem.vandorp
      OpenOffice header added.

      Revision 1.43  2000/09/07 15:59:27  os
      change: SFX_DISPATCHER/SFX_BINDINGS removed

      Revision 1.42  1998/06/12 11:33:44  OM
      Wieder SID_OBJECT_SELECT statt SID_DRAW_SELECT


      Rev 1.41   12 Jun 1998 13:33:44   OM
   Wieder SID_OBJECT_SELECT statt SID_DRAW_SELECT

      Rev 1.40   09 Jun 1998 15:34:00   OM
   VC-Controls entfernt

      Rev 1.39   28 Nov 1997 20:15:30   MA
   includes

      Rev 1.38   24 Nov 1997 14:53:58   MA
   includes

      Rev 1.37   03 Nov 1997 13:24:22   MA
   precomp entfernt

      Rev 1.36   05 Sep 1997 12:00:44   MH
   chg: header

      Rev 1.35   13 Aug 1997 12:18:56   OM
   #42383# Selektion von Punkten im Konstruktionsmode

      Rev 1.34   11 Jul 1997 15:26:24   OM
   Redraw-Bug behoben

      Rev 1.33   07 Apr 1997 13:39:48   MH
   chg: header

      Rev 1.32   20 Mar 1997 11:34:16   OM
   Insert und CreateMode merken

      Rev 1.31   14 Mar 1997 16:36:40   OM
   #37682# Bemassungsobjekt deselektieren

      Rev 1.30   04 Feb 1997 15:20:32   OM
   Bugs in Selektionsmodi behoben

      Rev 1.29   31 Jan 1997 10:58:26   OM
   Statusupdate

      Rev 1.28   30 Jan 1997 11:48:10   OM
   Freihandzeichnen

      Rev 1.27   22 Jan 1997 11:19:50   OM
   Neue Shells: DrawBaseShell und DrawControlShell

      Rev 1.26   14 Jan 1997 15:37:06   OM
   Bezierpunkte bearbeiten

      Rev 1.25   13 Jan 1997 17:23:28   OM
   Bezier-Punkte einfuegen

      Rev 1.24   13 Jan 1997 15:50:18   OM
   Bezier-Punkte loeschen

      Rev 1.23   13 Jan 1997 10:11:54   OM
   Selektionsmode fuer Bezier-Objekte

      Rev 1.22   08 Jan 1997 12:44:26   OM
   Aenderungen fuer Bezier-Shell

      Rev 1.21   28 Aug 1996 13:39:24   OS
   includes

      Rev 1.20   16 Aug 1996 15:22:32   OM
   #30046#Haenger bei Selektion beseitigt

      Rev 1.19   14 Aug 1996 11:31:00   JP
   svdraw.hxx entfernt

      Rev 1.18   07 Mar 1996 14:27:32   HJS
   2 defines zu viel

      Rev 1.17   24 Nov 1995 16:58:06   OM
   PCH->PRECOMPILED

      Rev 1.16   15 Nov 1995 18:35:28   OM
   Virtuelle Fkt rausgeworfen

      Rev 1.15   14 Nov 1995 17:36:56   OM
   Cast entfernt

      Rev 1.14   08 Nov 1995 15:29:48   OM
   Invalidate-Reihenfolge geaendert

      Rev 1.13   08 Nov 1995 14:15:50   OS
   Change => Set

      Rev 1.12   08 Nov 1995 10:35:42   OM
   Invalidate optimiert

      Rev 1.11   19 Oct 1995 18:30:44   OM
   Acceleratorproblem behoben

*************************************************************************/

diff --git a/sw/source/ui/ribbar/inputwin.cxx b/sw/source/ui/ribbar/inputwin.cxx
new file mode 100644
index 0000000..0aafb4a
--- /dev/null
+++ b/sw/source/ui/ribbar/inputwin.cxx
@@ -0,0 +1,881 @@
/*************************************************************************
 *
 *  $RCSfile: inputwin.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:46 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _GEN_HXX //autogen
#include <tools/gen.hxx>
#endif
#ifndef _SFXIMGMGR_HXX //autogen
#include <sfx2/imgmgr.hxx>
#endif
#ifndef _SFXVIEWFRM_HXX //autogen
#include <sfx2/viewfrm.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SVX_RULER_HXX //autogen
#include <svx/ruler.hxx>
#endif
#ifndef _ZFORLIST_HXX //autogen
#include <svtools/zforlist.hxx>
#endif


#include "swtypes.hxx"
#include "cmdid.h"
#include "swmodule.hxx"
#include "wrtsh.hxx"
#include "view.hxx"
#include "calc.hxx"
#include "inputwin.hxx"
#include "fldbas.hxx"
#include "fldmgr.hxx"
#include "frmfmt.hxx"
#include "cellatr.hxx"
#include "edtwin.hxx"
#include "helpid.h"

// nur fuers UpdateRange - Box in dem der gestackte Cursor sthet loeschen
#include "pam.hxx"
#include "doc.hxx"

#include "swundo.hxx"
#include "ribbar.hrc"
#include "inputwin.hrc"


SFX_IMPL_POS_CHILDWINDOW( SwInputChild, FN_EDIT_FORMULA, SFX_OBJECTBAR_OBJECT )

//==================================================================

SwInputWindow::SwInputWindow( Window* pParent )
    : ToolBox(  pParent ,   SW_RES( RID_TBX_FORMULA )),
    aEdit(      this, WB_3DLOOK|WB_TABSTOP|WB_BORDER|WB_NOHIDESELECTION),
    aPos(       this,       SW_RES(ED_POS)),
    aPopMenu(   SW_RES(MN_CALC_POPUP)),
    pMgr(0),
    pView(0),
    pWrtShell(0),
    aAktTableName(aEmptyStr)
{
    bFirst = bDoesUndo = TRUE;
    bActive = bIsTable = bDelSel = bResetUndo = bCallUndo = FALSE;

    FreeResource();
    SFX_APP()->GetImageManager()->RegisterToolBox(this);

    pView = ::GetActiveView();
    pWrtShell = pView ? pView->GetWrtShellPtr() : 0;

    InsertWindow( ED_POS, &aPos, 0, 0);
    InsertSeparator ( 1 );
    InsertSeparator ();
    InsertWindow( ED_FORMULA, &aEdit);
    SetHelpId(ED_FORMULA, HID_EDIT_FORMULA);

    SfxImageManager* pManager = SFX_IMAGEMANAGER();
    SetItemImage( FN_FORMULA_CALC, pManager->GetImage(FN_FORMULA_CALC ));
    SetItemImage( FN_FORMULA_CANCEL, pManager->GetImage(FN_FORMULA_CANCEL ));
    SetItemImage( FN_FORMULA_APPLY, pManager->GetImage(FN_FORMULA_APPLY ));

    Size    aSizeTbx = CalcWindowSizePixel();
    Size aSize = GetSizePixel();
    aSize.Height() = aSizeTbx.Height();
    SetSizePixel( aSize );
    Size    aPosSize = aPos.GetSizePixel();
    Size    aEditSize = aEdit.GetSizePixel();
    aPosSize.Height() = aEditSize.Height() = GetItemRect(FN_FORMULA_CALC).GetHeight() - 2;

    Point aPosPos = aPos.GetPosPixel();
    Point aEditPos= aEdit.GetPosPixel();
    aPosPos.Y() = aEditPos.Y() = GetItemRect( FN_FORMULA_CALC ).TopLeft().Y() + 1;
    aPos.SetPosSizePixel( aPosPos, aPosSize );
    aEdit.SetPosSizePixel( aEditPos, aEditSize );

    aPopMenu.SetSelectHdl(LINK( this, SwInputWindow, MenuHdl ));
}

//==================================================================

__EXPORT SwInputWindow::~SwInputWindow()
{
    SFX_APP()->GetImageManager()->ReleaseToolBox(this);
    //Lineale aufwecken
    if(pView)
    {
        pView->GetHLineal()->SetActive( TRUE );
        if( pView->GetVLineal())
            pView->GetVLineal()->SetActive( TRUE );
    }
    if ( pMgr )
        delete pMgr;
    if(pWrtShell)
        pWrtShell->EndSelTblCells();

    if( bResetUndo )
    {
        DelBoxCntnt();
        pWrtShell->DoUndo( bDoesUndo );
        if(bCallUndo)
            pWrtShell->Undo();
        SwEditShell::SetUndoActionCount( nActionCnt );
    }
}

//==================================================================

void __EXPORT SwInputWindow::Resize()
{
    ToolBox::Resize();

    long    nWidth      = GetSizePixel().Width();
    long    nLeft       = aEdit.GetPosPixel().X();
    Size    aEditSize   = aEdit.GetSizePixel();

    aEditSize.Width() = Max( ((long)(nWidth - nLeft - 5)), (long)0 );
    aEdit.SetSizePixel( aEditSize );
    aEdit.Invalidate();
}

//==================================================================

void SwInputWindow::Show()
{
    bIsTable = FALSE;
    //Lineale anhalten
    if(pView)
    {
        pView->GetHLineal()->SetActive( FALSE );
        if( pView->GetVLineal())
            pView->GetVLineal()->SetActive( FALSE );

        DBG_ASSERT(pWrtShell, "Keine WrtShell!")
        // Cursor in Tabelle
        bIsTable = pWrtShell->IsCrsrInTbl() ? TRUE : FALSE;

        if( bFirst )
            pWrtShell->SelTblCells( LINK( this, SwInputWindow,
                                                SelTblCellsNotify) );
        if( bIsTable )
        {
            const String& rPos = pWrtShell->GetBoxNms();
            USHORT nPos = 0;
            short nSrch = -1;
            while( (nPos = rPos.Search( ':',nPos + 1 ) ) != STRING_NOTFOUND )
                nSrch = (short) nPos;
            aPos.SetText( rPos.Copy( ++nSrch ) );
            aAktTableName = pWrtShell->GetTableFmt()->GetName();
        }
        else
            aPos.SetText(SW_RESSTR(STR_FORMULA));

        // Aktuelles Feld bearbeiten
        ASSERT(pMgr == 0, FieldManager nicht geloescht.);
        pMgr = new SwFldMgr;

        // JP 13.01.97: Formel soll immer mit einem "=" beginnen, hier
        //              also setzen
        String sEdit( '=' );
        if( pMgr->GetCurFld() && TYP_FORMELFLD == pMgr->GetCurTypeId() )
        {
            sEdit += pMgr->GetCurFldPar2();
        }
        else if( bFirst )
        {
            if( bIsTable )
            {
                bResetUndo = TRUE;
                nActionCnt = SwEditShell::GetUndoActionCount();
                SwEditShell::SetUndoActionCount( nActionCnt + 1 );

                bDoesUndo = pWrtShell->DoesUndo();
                if( !bDoesUndo )
                    pWrtShell->DoUndo( TRUE );

                if( !pWrtShell->SwCrsrShell::HasSelection() )
                {
                    pWrtShell->MoveSection( fnSectionCurr, fnSectionStart );
                    pWrtShell->SetMark();
                    pWrtShell->MoveSection( fnSectionCurr, fnSectionEnd );
                }
                if( pWrtShell->SwCrsrShell::HasSelection() )
                {
                    pWrtShell->StartUndo( UNDO_DELETE );
                    pWrtShell->Delete();
                    if( 0 != pWrtShell->EndUndo( UNDO_DELETE ))
                        bCallUndo = TRUE;
                }
                pWrtShell->DoUndo( FALSE );

                SfxItemSet aSet( pWrtShell->GetAttrPool(), RES_BOXATR_FORMULA, RES_BOXATR_FORMULA );
                if( pWrtShell->GetTblBoxFormulaAttrs( aSet ))
                    sEdit += ((SwTblBoxFormula&)aSet.Get( RES_BOXATR_FORMULA )).GetFormula();
            }
        }

        if( bFirst )
        {
            // WrtShell Flags richtig setzen
            pWrtShell->SttSelect();
            pWrtShell->EndSelect();
        }

        bFirst = FALSE;

        aEdit.SetModifyHdl( LINK( this, SwInputWindow, ModifyHdl ));

        aEdit.SetText( sEdit );
        aEdit.SetSelection( Selection( sEdit.Len(), sEdit.Len() ) );
        sOldFml = sEdit;

        aEdit.Invalidate();
        aEdit.Update();
        aEdit.GrabFocus();
        // UserInterface fuer die Eingabe abklemmen

        pView->GetEditWin().LockKeyInput(TRUE);
        pView->GetViewFrame()->GetDispatcher()->Lock(TRUE);
        pWrtShell->Push();
    }
    ToolBox::Show();
}
//==================================================================

IMPL_LINK( SwInputWindow, MenuHdl, Menu *, pMenu )
{
static const char * __READONLY_DATA aStrArr[] = {
    sCalc_Phd,
    sCalc_Sqrt,
    sCalc_Or,
    sCalc_Xor,
    sCalc_And,
    sCalc_Not,
    sCalc_Eq,
    sCalc_Neq,
    sCalc_Leq,
    sCalc_Geq,
    sCalc_L,
    sCalc_G,
    sCalc_Sum,
    sCalc_Mean,
    sCalc_Min,
    sCalc_Max,
    sCalc_Sin,
    sCalc_Cos,
    sCalc_Tan,
    sCalc_Asin,
    sCalc_Acos,
    sCalc_Atan,
    sCalc_Pow,
    "|",
    sCalc_Round
};

    USHORT nId = pMenu->GetCurItemId();
    if ( nId <= MN_CALC_ROUND )
    {
        String aTmp( String::CreateFromAscii(aStrArr[nId - 1]) );
        aTmp += ' ';
        aEdit.ReplaceSelected( aTmp );
    }
    return 0;
}

//==================================================================


void __EXPORT SwInputWindow::Click( )
{
    USHORT nCurID = GetCurItemId();
    EndSelection(); // setzt CurItemId zurueck !
    switch ( nCurID )
    {
        case FN_FORMULA_CALC :
        {
            Point aBL = GetItemRect( FN_FORMULA_CALC ).BottomLeft();
            Point aPt(aBL.X(), aBL.Y());
#ifdef VCL
            aPopMenu.Execute( this, aPt );
#else
            aPt = OutputToScreenPixel( aPt );
            aPopMenu.Execute( aPt );
#endif
        }
        break;
        case FN_FORMULA_CANCEL:
        {
            CancelFormula();
        }
        break;
        case FN_FORMULA_APPLY:
        {
            ApplyFormula();
        }
        break;
   }
}

//==================================================================

void  SwInputWindow::ApplyFormula()
{
    pView->GetViewFrame()->GetDispatcher()->Lock(FALSE);
    pView->GetEditWin().LockKeyInput(FALSE);
    if( bResetUndo )
    {
        DelBoxCntnt();
        pWrtShell->DoUndo( bDoesUndo );
        SwEditShell::SetUndoActionCount( nActionCnt );
        if( bCallUndo )
            pWrtShell->Undo();
        bResetUndo = FALSE;
    }
    pWrtShell->Pop( FALSE );

    // JP 13.01.97: Formel soll immer mit einem "=" beginnen, hier
    //              also wieder entfernen
    BOOL bIsFormula = FALSE;
    String sEdit( aEdit.GetText() );
    sEdit.EraseLeadingChars().EraseTrailingChars();
    if( sEdit.Len() && '=' == sEdit.GetChar( 0 ) )
    {
        sEdit.Erase( 0, 1 );
        bIsFormula = TRUE;
    }

    pWrtShell->StartAllAction();
    if( bDelSel && pWrtShell->HasSelection() )
    {
        pWrtShell->StartUndo( UNDO_START );
        pWrtShell->DelRight();
    }
    else
    {
        pWrtShell->EnterStdMode();
        bDelSel = FALSE;
    }

    if( !bDelSel && pMgr->GetCurFld() && TYP_FORMELFLD == pMgr->GetCurTypeId() )
        pMgr->UpdateCurFld( pMgr->GetCurFld()->GetFormat(), aEmptyStr, sEdit );
    else if( sEdit.Len() )
    {
        if( bIsTable )
        {
            SfxItemSet aSet( pWrtShell->GetAttrPool(), RES_BOXATR_FORMULA, RES_BOXATR_FORMULA );
            aSet.Put( SwTblBoxFormula( sEdit ));
            pWrtShell->SetTblBoxFormulaAttrs( aSet );
            pWrtShell->UpdateTable();
        }
        else
        {
            SvNumberFormatter* pFormatter = pWrtShell->GetNumberFormatter();
            ULONG nSysNumFmt = pFormatter->GetFormatIndex( NF_NUMBER_STANDARD, LANGUAGE_SYSTEM);
            pMgr->InsertFld(TYP_FORMELFLD, GSE_FORMULA, aEmptyStr, sEdit, nSysNumFmt);
        }
     }

    if( bDelSel )
        pWrtShell->EndUndo( UNDO_END );
    pWrtShell->EndAllAction();

    pWrtShell->EndSelTblCells();
    pView->GetEditWin().GrabFocus();
    pView->GetViewFrame()->GetDispatcher()->Execute( FN_EDIT_FORMULA, SFX_CALLMODE_ASYNCHRON );
}

//==================================================================

void  SwInputWindow::CancelFormula()
{
    if(pView)
    {
        pView->GetViewFrame()->GetDispatcher()->Lock( FALSE );
        pView->GetEditWin().LockKeyInput(FALSE);
        if( bResetUndo )
        {
            DelBoxCntnt();
            pWrtShell->DoUndo( bDoesUndo );
            SwEditShell::SetUndoActionCount( nActionCnt );
            if( bCallUndo )
                pWrtShell->Undo();
            bResetUndo = FALSE;
        }
        pWrtShell->Pop( FALSE );

        if( bDelSel )
            pWrtShell->EnterStdMode();

        pWrtShell->EndSelTblCells();

        pView->GetEditWin().GrabFocus();
    }
    pView->GetViewFrame()->GetDispatcher()->Execute( FN_EDIT_FORMULA, SFX_CALLMODE_ASYNCHRON);
}
//==================================================================

IMPL_LINK( SwInputWindow, SelTblCellsNotify, SwWrtShell *, pCaller )
{
    if(bIsTable)
    {
        SwFrmFmt* pTblFmt = pCaller->GetTableFmt();
        String sBoxNms( pCaller->GetBoxNms() );
        String sTblNm;
        if( pTblFmt && aAktTableName != pTblFmt->GetName() )
            sTblNm = pTblFmt->GetName();

        aEdit.UpdateRange( sBoxNms, sTblNm );

        String sNew( aEdit.GetText() );
        if( sNew != sOldFml )
        {
            // Die WrtShell ist in der Tabellen Selektion
            // dann die Tabellen Selektion wieder aufheben, sonst steht der
            // Cursor "im Wald" und das LiveUpdate funktioniert nicht!
            pWrtShell->StartAllAction();

            SwPaM aPam( *pWrtShell->GetStkCrsr()->GetPoint() );
            aPam.Move( fnMoveBackward, fnGoSection );
            aPam.SetMark();
            aPam.Move( fnMoveForward, fnGoSection );

            pWrtShell->GetDoc()->Delete( aPam );
            pWrtShell->GetDoc()->Insert( aPam, sNew );
            pWrtShell->EndAllAction();
            sOldFml = sNew;
        }
    }
    else
        aEdit.GrabFocus();
    return 0;
}


void SwInputWindow::SetFormula( const String& rFormula, BOOL bDelFlag )
{
    String sEdit( '=' );
    if( rFormula.Len() )
    {
        if( '=' == rFormula.GetChar( 0 ) )
            sEdit = rFormula;
        else
            sEdit += rFormula;
    }
    aEdit.SetText( sEdit );
    aEdit.SetSelection( Selection( sEdit.Len(), sEdit.Len() ) );
    aEdit.Invalidate();
    bDelSel = bDelFlag;
}


IMPL_LINK( SwInputWindow, ModifyHdl, InputEdit*, EMPTYARG )
{
    if( bIsTable && bResetUndo )
    {
        pWrtShell->StartAllAction();
        DelBoxCntnt();
        String sNew( aEdit.GetText() );
        pWrtShell->SwEditShell::Insert( sNew );
        pWrtShell->EndAllAction();
        sOldFml = sNew;
    }
    return 0;
}


void SwInputWindow::DelBoxCntnt()
{
    if( bIsTable )
    {
        pWrtShell->StartAllAction();
        pWrtShell->ClearMark();
        pWrtShell->Pop( FALSE );
        pWrtShell->Push();
        pWrtShell->MoveSection( fnSectionCurr, fnSectionStart );
        pWrtShell->SetMark();
        pWrtShell->MoveSection( fnSectionCurr, fnSectionEnd );
        pWrtShell->SwEditShell::Delete();
        pWrtShell->EndAllAction();
    }
}

//==================================================================

void __EXPORT InputEdit::KeyInput(const KeyEvent& rEvent)
{
    const KeyCode aCode = rEvent.GetKeyCode();
    if(aCode == KEY_RETURN || aCode == KEY_F2 )
        ((SwInputWindow*)GetParent())->ApplyFormula();
    else if(aCode == KEY_ESCAPE )
        ((SwInputWindow*)GetParent())->CancelFormula();
    else
        Edit::KeyInput(rEvent);
}

//==================================================================

void __EXPORT InputEdit::UpdateRange(const String& rBoxes,
                                    const String& rName )
{
    if( !rBoxes.Len() )
    {
        GrabFocus();
        return;
    }
    const sal_Unicode   cOpen = '<', cClose = '>',
                cOpenBracket = '(', cCloseBracket = ')';
    String aPrefix = rName;
    if(rName.Len())
        aPrefix += '.';
    String aBoxes = aPrefix;
    aBoxes += rBoxes;
    Selection aSelection(GetSelection());
    USHORT nSel = (USHORT) aSelection.Len();
    //OS: mit dem folgenden Ausdruck wird sichergestellt, dass im overwrite-Modus
    //die selektierte schliessende Klammer nicht geloescht wird
    if( nSel && ( nSel > 1 ||
        GetText().GetChar( (USHORT)aSelection.Min() ) != cClose ) )
        Cut();
    else
        aSelection.Max() = aSelection.Min();
    String aActText(GetText());
    const USHORT nLen = aActText.Len();
    if( !nLen )
    {
        String aStr(cOpen);
        aStr += aBoxes;
        aStr += cClose;
        SetText(aStr);
        USHORT nPos = aStr.Search( cClose );
        ASSERT(nPos < aStr.Len(), Delimiter nicht gefunden.);
        ++nPos;
        SetSelection( Selection( nPos, nPos ));
    }
    else
    {
        BOOL bFound = FALSE;
        unsigned char cCh;
        USHORT nPos, nEndPos, nStartPos = (USHORT) aSelection.Min();
        if( nStartPos-- )
        {
            do {
                if( cOpen  == (cCh = aActText.GetChar( nStartPos ) ) ||
                    cOpenBracket == cCh )
                {
                    bFound = cCh == cOpen;
                    break;
                }
            } while( nStartPos-- > 0 );
        }
        if( bFound )
        {
            bFound = FALSE;
            nEndPos = nStartPos;
            while( nEndPos < nLen )
            {
                if( cClose == (cCh = aActText.GetChar( nEndPos )) /*||
                    cCh == cCloseBracket*/ )
                {
                    bFound = TRUE;
                    break;
                }
                ++nEndPos;
            }
            // nur wenn akt. Pos im Breich oder direkt dahinter liegt
            if( bFound && !( nStartPos < (USHORT)aSelection.Max() &&
                             (USHORT)aSelection.Max() <= nEndPos + 1 ))
                bFound = FALSE;
        }
        if( bFound )
        {
            nPos = ++nStartPos + 1; // wir wollen dahinter
            aActText.Erase( nStartPos, nEndPos - nStartPos );
            aActText.Insert( aBoxes, nStartPos );
            nPos += aBoxes.Len();
        }
        else
        {
            String aTmp( (char)cOpen );
            aTmp += aBoxes;
            aTmp += (char)cClose;
            nPos = (USHORT)aSelection.Min();
            aActText.Insert( aTmp, nPos );
            nPos += aTmp.Len();
        }
        if( GetText() != aActText )
        {
            SetText( aActText );
            SetSelection( Selection( nPos, nPos ) );
//          GetModifyHdl().Call( this );
        }
    }
    GrabFocus();

}
//==================================================================


SwInputChild::SwInputChild(Window* pParent,
                                USHORT nId,
                                SfxBindings* ,
                                SfxChildWinInfo* ) :
                                SfxChildWindow( pParent, nId )
{
    SwView* pActiveView = GetActiveView();
    pDispatch = pActiveView ? pActiveView->GetViewFrame()->GetDispatcher() : 0;
    pWindow = new SwInputWindow( pParent );
    ((SwInputWindow*)pWindow)->Show();
    eChildAlignment = SFX_ALIGN_LOWESTTOP;

}


__EXPORT SwInputChild::~SwInputChild()
{
    if(pDispatch)
        pDispatch->Lock(FALSE);
}


SfxChildWinInfo __EXPORT SwInputChild::GetInfo() const
{
    SfxChildWinInfo aInfo = SfxChildWindow::GetInfo();     \
    return aInfo;
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.88  2000/09/18 16:06:01  willem.vandorp
    OpenOffice header added.

    Revision 1.87  2000/09/07 15:59:27  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.86  2000/07/03 08:54:31  jp
    must changes for VCL

    Revision 1.85  2000/04/26 14:56:39  os
    GetName() returns const String&

    Revision 1.84  2000/04/18 14:54:44  os
    UNICODE

    Revision 1.83  2000/03/03 15:17:03  os
    StarView remainders removed

    Revision 1.82  1999/05/18 13:20:16  OS
    #66203# Undo im Dtor nur, wenn erforderlich


      Rev 1.81   18 May 1999 15:20:16   OS
   #66203# Undo im Dtor nur, wenn erforderlich

      Rev 1.80   24 Apr 1998 17:22:46   OS
   kein KeyInput waehrend die Rechenleiste aktiv ist #49301#

      Rev 1.79   12 Mar 1998 13:33:12   OM
   #48084# Formelfeld mit Standardformat einfuegen

      Rev 1.78   22 Jan 1998 20:07:40   JP
   CTOR des SwPaM umgestellt

      Rev 1.77   19 Jan 1998 20:08:32   JP
   Bug #46705#: Undo nur rufen, wenn etwas geloescht wurde

      Rev 1.76   24 Nov 1997 14:53:58   MA
   includes

      Rev 1.75   10 Nov 1997 11:43:12   OS
   HelpId fuer Edit #45436#

      Rev 1.74   30 Sep 1997 16:28:22   TJ

      Rev 1.73   19 Sep 1997 13:42:56   OS
   Edit mit WB_NOHIDESELECTION #43891#

      Rev 1.72   04 Sep 1997 17:14:02   MA
   includes

      Rev 1.71   01 Sep 1997 10:01:24   OS
   fuer VCL Window uebergeben

      Rev 1.70   29 Aug 1997 16:52:24   MH
   chg: Syntax

      Rev 1.69   29 Aug 1997 15:45:32   OS
   PopupMenu::Execute mit Window* fuer VCL

      Rev 1.68   29 Aug 1997 14:20:12   OS
   DLL-Umbau

      Rev 1.67   09 Jul 1997 17:36:10   HJS
   includes

      Rev 1.66   09 May 1997 09:28:42   JP
   Bug #39214#: Formel nur ersetzen, wenn die sich veraendert hat

      Rev 1.65   29 Apr 1997 16:18:50   OM
   Unsichtbare Benutzerfelder

      Rev 1.64   09 Apr 1997 16:18:42   MH
   chg: header

      Rev 1.63   07 Apr 1997 13:40:48   MH
   chg: header

      Rev 1.62   10 Feb 1997 16:26:40   OS
   Dispatcher im Childwindow merken

      Rev 1.61   07 Feb 1997 16:41:54   OS
   Dispatcher nur noch vom ViewFrame holen

      Rev 1.60   05 Feb 1997 14:32:00   JP
   FormatMenu bei Tabellenzellen entfernen

      Rev 1.59   29 Jan 1997 14:47:18   JP
   Umstellungen fuers neue Rechnen in Tabellen

      Rev 1.58   21 Jan 1997 13:48:40   JP
   Update der Eingabe in die TabellenBox

      Rev 1.57   14 Jan 1997 18:22:28   JP
   UpdateRange: Anfang des BoxNamens korrekt suchen

      Rev 1.56   14 Jan 1997 09:50:32   JP
   neu: SetFormula; UpdateRange: Crsr hinter die BoxNamen

      Rev 1.55   21 Nov 1996 17:56:44   MA
   chg: Kein ResMgr fuer GetImage()

      Rev 1.54   11 Nov 1996 11:11:30   MA
   ResMgr

      Rev 1.53   09 Nov 1996 13:51:40   OS
   PopupMenu immer im Click

      Rev 1.52   24 Oct 1996 13:36:38   JP
   String Umstellung: [] -> GetChar()

      Rev 1.51   10 Oct 1996 10:37:12   OS
   Registrierung der Toolbox am SfxImageManager

      Rev 1.50   28 Aug 1996 13:39:28   OS
   includes

      Rev 1.49   09 Jul 1996 17:52:42   OM
   Alternatives Formatmenue fuer Expressionfields

      Rev 1.48   26 Jun 1996 15:26:42   OS
   Aufruf von Dispatcher.Execute an 324 angepasst

      Rev 1.47   10 Jun 1996 18:47:04   HJS
   ; vergessen

      Rev 1.46   10 Jun 1996 11:38:08   OS
   Reihenfolge Apply und CancelFormula angepasst

      Rev 1.45   09 May 1996 15:34:12   OS
   HLineal an der View wird nicht mehr geloescht

      Rev 1.44   26 Apr 1996 10:00:32   SWG
   IMPL-Macro getauscht, GetInfo impl.

      Rev 1.43   10 Mar 1996 15:50:22   OS
   neu: Round

      Rev 1.42   29 Feb 1996 12:58:30   OS
   UpdateRange mit zusaetzlichem Parameter

      Rev 1.41   07 Feb 1996 07:29:20   OS
   Linkumstellung: return sollte ans Ende

      Rev 1.40   06 Feb 1996 15:21:16   JP
   Link Umstellung 305

------------------------------------------------------------------------*/






















diff --git a/sw/source/ui/ribbar/inputwin.hrc b/sw/source/ui/ribbar/inputwin.hrc
new file mode 100644
index 0000000..38fc01c
--- /dev/null
+++ b/sw/source/ui/ribbar/inputwin.hrc
@@ -0,0 +1,118 @@
/*************************************************************************
 *
 *  $RCSfile: inputwin.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:46 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _INPUTWIN_HRC
#define _INPUTWIN_HRC


//PopupMenu Id's
#define MN_CALC_PHD         1
#define MN_CALC_SQRT        2
#define MN_CALC_OR          3
#define MN_CALC_XOR         4
#define MN_CALC_AND         5
#define MN_CALC_NOT         6
#define MN_CALC_EQ          7
#define MN_CALC_NEQ         8
#define MN_CALC_LEQ         9
#define MN_CALC_GEQ         10
#define MN_CALC_LES         11
#define MN_CALC_GRE         12
#define MN_CALC_SUM         13
#define MN_CALC_MEAN        14
#define MN_CALC_MIN         15
#define MN_CALC_MAX         16
#define MN_CALC_SIN         17
#define MN_CALC_COS         18
#define MN_CALC_TAN         19
#define MN_CALC_ASIN        20
#define MN_CALC_ACOS        21
#define MN_CALC_ATAN        22
#define MN_CALC_POW         23
#define MN_CALC_LISTSEP     24
#define MN_CALC_ROUND       25

#define MN_POP_OPS          29
#define MN_POP_STATISTICS   30
#define MN_POP_FUNC         31
#define MN_RSC_END          32

#define TBX_FORMULA         1
#define ED_POS              2
#define ED_FORMULA          3

#endif

















diff --git a/sw/source/ui/ribbar/inputwin.src b/sw/source/ui/ribbar/inputwin.src
new file mode 100644
index 0000000..6caeb7b
--- /dev/null
+++ b/sw/source/ui/ribbar/inputwin.src
@@ -0,0 +1,1137 @@
/*************************************************************************
 *
 *  $RCSfile: inputwin.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:46 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
/* HelpID ressource file */
/* HelpID ressource file */

#include "cmdid.h"
#include "helpid.h"
#include "globals.hrc"
#include "ribbar.hrc"
#include "inputwin.hrc"
ToolBox RID_TBX_FORMULA
{
    Pos = MAP_APPFONT ( 0 , 0 ) ;
    Size = MAP_APPFONT ( 600 , 14 ) ;
    HelpID = HID_CALC_TOOLBOX ;
    SVLook = TRUE ;
    Border = TRUE ;
    ItemList =
    {
        ToolBoxItem
        {
            Identifier = FN_FORMULA_CALC ;
            HelpID = FN_FORMULA_CALC ;
            DropDown = TRUE ;
            Text = "Formel" ;
            Text [ English ] = "Formula" ;
            Text [ norwegian ] = "Formel" ;
            Text [ italian ] = "Formula" ;
            Text [ portuguese_brazilian ] = "Fórmula" ;
            Text [ portuguese ] = "Fórmula" ;
            Text [ finnish ] = "Kaava" ;
            Text [ danish ] = "Formel" ;
            Text [ french ] = "Formule" ;
            Text [ swedish ] = "Formel" ;
            Text [ dutch ] = "Formule" ;
            Text [ spanish ] = "Fórmula" ;
            Text [ english_us ] = "Formula" ;
            /* ### ACHTUNG: Neuer Text in Resource? Formel auswählen : Formel auswõhlen */
            Text[ chinese_simplified ] = "¹«Ê½";
            Text[ russian ] = "Ôîðìóëà";
            Text[ polish ] = "Formu³a";
            Text[ japanese ] = "”Ž®";
            Text[ chinese_traditional ] = "¤½¦¡";
            Text[ arabic ] = "ÕíÛÉ";
            Text[ dutch ] = "Formule";
            Text[ chinese_simplified ] = "¹«Ê½";
            Text[ greek ] = "Ôýðïò";
            Text[ korean ] = "¼ö½Ä";
            Text[ turkish ] = "Formül";
        };
        ToolBoxItem
        {
            Identifier = FN_FORMULA_CANCEL ;
            HelpID = FN_FORMULA_CANCEL ;
            Text = "Abbrechen" ;
            Text [ English ] = "Cancel" ;
            Text [ norwegian ] = "Avbryt" ;
            Text [ italian ] = "Annulla" ;
            Text [ portuguese_brazilian ] = "Cancelar" ;
            Text [ portuguese ] = "Cancelar" ;
            Text [ finnish ] = "Peruuta" ;
            Text [ danish ] = "Annuller" ;
            Text [ french ] = "Annuler" ;
            Text [ swedish ] = "Avbryt" ;
            Text [ dutch ] = "Annuleren" ;
            Text [ spanish ] = "Cancelar" ;
            Text [ english_us ] = "Cancel" ;
            /* ### ACHTUNG: Neuer Text in Resource? Formel nicht übenehmen : Formel nicht ³benehmen */
            Text[ chinese_simplified ] = "È¡Ïû";
            Text[ russian ] = "Îòìåíà";
            Text[ polish ] = "Anuluj";
            Text[ japanese ] = "·¬Ý¾Ù";
            Text[ chinese_traditional ] = "¨ú®ø";
            Text[ arabic ] = "ÅáÛÇÁ ÇáÃãÑ";
            Text[ dutch ] = "Annuleren";
            Text[ chinese_simplified ] = "È¡Ïû";
            Text[ greek ] = "Áêýñùóç";
            Text[ korean ] = "Ãë¼Ò";
            Text[ turkish ] = "Ýptal";
        };
        ToolBoxItem
        {
            Identifier = FN_FORMULA_APPLY ;
            HelpID = FN_FORMULA_APPLY ;
            /* ### ACHTUNG: Neuer Text in Resource? Übernehmen : šbernehmen */
            Text = "Übernehmen" ;
            Text [ English ] = "Apply" ;
            Text [ norwegian ] = "Benytt" ;
            Text [ italian ] = "Applica" ;
            Text [ portuguese_brazilian ] = "Aplicar" ;
            Text [ portuguese ] = "Aplicar" ;
            Text [ finnish ] = "Käytä" ;
            Text [ danish ] = "Anvend" ;
            Text [ french ] = "Appliquer" ;
            Text [ swedish ] = "Överta" ;
            Text [ dutch ] = "Overnemen" ;
            Text [ spanish ] = "Aplicar" ;
            Text [ english_us ] = "Apply" ;
            /* ### ACHTUNG: Neuer Text in Resource? Formel einfügen : Formel einf³gen */
            Text[ chinese_simplified ] = "ʹÓÃ";
            Text[ russian ] = "Âûïîëíèòü";
            Text[ polish ] = "Zastosuj";
            Text[ japanese ] = "“K—p‚·‚é";
            Text[ chinese_traditional ] = "¨Ï¥Î";
            Text[ arabic ] = "ÅÏÎÇá";
            Text[ dutch ] = "Overnemen";
            Text[ chinese_simplified ] = "ʹÓÃ";
            Text[ greek ] = "ÅöáñìïãÞ";
            Text[ korean ] = "Àû¿ë";
            Text[ turkish ] = "Uygula";
        };
    };
    Edit ED_POS
    {
        Border = TRUE ;
        Size = MAP_APPFONT ( 45 , 11 ) ;
        ReadOnly = TRUE ;
        SVLook = TRUE ;
        Center = TRUE ;
    };
    Edit ED_FORMULA
    {
        Border = TRUE ;
        TabStop = TRUE ;
        Size = MAP_APPFONT ( 500 , 11 ) ;
        SVLook = TRUE ;
    };
};
Menu MN_CALC_POPUP
{
    ItemList =
    {
        MenuItem
        {
            Identifier = MN_CALC_SUM ;
            HelpID = HID_MN_CALC_SUM ;
            Text = "~Summe" ;
            Text [ English ] = "~Sum" ;
            Text [ dutch ] = "~Soml" ;
            Text [ spanish ] = "~Suma" ;
            Text [ english_us ] = "Sum" ;
            Text [ norwegian ] = "~Sum" ;
            Text [ italian ] = "~Somma" ;
            Text [ portuguese_brazilian ] = "~Somatório" ;
            Text [ portuguese ] = "~Soma" ;
            Text [ finnish ] = "~Summa" ;
            Text [ danish ] = "Sum" ;
            Text [ french ] = "~Somme" ;
            Text [ swedish ] = "~Summa" ;
            Text[ chinese_simplified ] = "×ܼÆ";
            Text[ russian ] = "Ñóììà";
            Text[ polish ] = "Suma";
            Text[ japanese ] = "‡Œv";
            Text[ chinese_traditional ] = "¤p­p";
            Text[ arabic ] = "ÇáãÌãæÚ";
            Text[ dutch ] = "~Soml";
            Text[ chinese_simplified ] = "×ܼÆ";
            Text[ greek ] = "¢èñïé~óìá";
            Text[ korean ] = "ÇÕ°è";
            Text[ turkish ] = "Toplam";
        };
        MenuItem
        {
            Identifier = MN_CALC_ROUND ;
            HelpID = HID_MN_CALC_ROUND ;
            Text = "Run~den" ;
            Text [ English ] = "Roun~d" ;
            Text [ english_us ] = "Round" ;
            Text [ italian ] = "Arroto~nda" ;
            Text [ spanish ] = "R~edondear" ;
            Text [ french ] = "A~rrondir" ;
            Text [ dutch ] = "~Afronden" ;
            Text [ swedish ] = "~Avrunda" ;
            Text [ danish ] = "Rund" ;
            Text [ portuguese ] = "A~rredondar" ;
            Text [ portuguese_brazilian ] = "Run~den" ;
            Text[ chinese_simplified ] = "ת»»³ÉÕûÊý";
            Text[ russian ] = "Îêðóãëèòü";
            Text[ polish ] = "Zaokr¹glaj";
            Text[ japanese ] = "’[”‚ðØ‚èã‚°‚é";
            Text[ chinese_traditional ] = "Âà´«¦¨¾ã¼Æ";
            Text[ arabic ] = "ÊÞÑíÈ";
            Text[ dutch ] = "~Afronden";
            Text[ chinese_simplified ] = "ת»»³ÉÕûÊý";
            Text[ greek ] = "Ó~ôñïããõëïðïßçóç";
            Text[ korean ] = "¹Ý¿Ã¸²";
            Text[ turkish ] = "Yuvarla";
        };
        MenuItem
        {
            Identifier = MN_CALC_PHD ;
            HelpID = HID_MN_CALC_PHD ;
            Text = "~Prozent" ;
            Text [ English ] = "~Percent" ;
            Text [ dutch ] = "Pro~cent" ;
            Text [ spanish ] = "~Porcentaje" ;
            Text [ english_us ] = "Percent" ;
            Text [ norwegian ] = "~Prosent" ;
            Text [ italian ] = "~Percentuale" ;
            Text [ portuguese_brazilian ] = "~Percentual" ;
            Text [ portuguese ] = "~Percentagem" ;
            Text [ finnish ] = "~Prosentti" ;
            Text [ danish ] = "Procent" ;
            Text [ french ] = "~Pourcentage" ;
            Text [ swedish ] = "~Procent" ;
            Text[ chinese_simplified ] = "°Ù·Ö±È(~P)";
            Text[ russian ] = "Ïðîöåíòû";
            Text[ polish ] = "Procent";
            Text[ japanese ] = "Êß°¾ÝÄ";
            Text[ chinese_traditional ] = "¦Ê¤À¤ñ(~P)";
            Text[ arabic ] = "ÈÇáãÇÆÉ";
            Text[ dutch ] = "Pro~cent";
            Text[ chinese_simplified ] = "°Ù·Ö±È(~P)";
            Text[ greek ] = "~Ðïóïóôü (%)";
            Text[ korean ] = "¹éºÐÀ²";
            Text[ turkish ] = "Yüzde";
        };
        MenuItem
        {
            Identifier = MN_CALC_SQRT ;
            HelpID = HID_MN_CALC_SQRT ;
            Text = "~Wurzel" ;
            Text [ English ] = "Square ~Root" ;
            Text [ dutch ] = "~Vierkantswortel" ;
            Text [ spanish ] = "~Raíz" ;
            Text [ english_us ] = "Square Root" ;
            Text [ norwegian ] = "Kvadrat ~Rot" ;
            Text [ italian ] = "~Radice" ;
            Text [ portuguese_brazilian ] = "Raiz ~Quadrada" ;
            Text [ portuguese ] = "Raíz ~quadrada" ;
            Text [ finnish ] = "~Neliöjuuri" ;
            Text [ danish ] = "Kvadratrod" ;
            Text [ french ] = "~Racine carrée" ;
            Text [ swedish ] = "~Kvadratrot" ;
            Text[ chinese_simplified ] = "ƽ·½¸ù(~R)";
            Text[ russian ] = "Êîðåíü";
            Text[ polish ] = "Pierwiastek";
            Text[ japanese ] = "•½•ûª";
            Text[ chinese_traditional ] = "¥­¤è®Ú(~R)";
            Text[ arabic ] = "ÌÐÑ";
            Text[ dutch ] = "~Vierkantswortel";
            Text[ chinese_simplified ] = "ƽ·½¸ù(~R)";
            Text[ language_user1 ] = "(ÄÄ) ; - - - - - -";
            Text[ greek ] = "Ôåôñáã~ùíéêÞ ñßæá";
            Text[ korean ] = "Á¦°ö±Ù";
            Text[ turkish ] = "Karekök";
        };
        MenuItem
        {
            Identifier = MN_CALC_POW ;
            HelpID = HID_MN_CALC_POW ;
            Text = "Poten~ziere" ;
            Text [ English ] = "Po~wer" ;
            Text [ dutch ] = "~Machtsverheffen" ;
            Text [ spanish ] = "Po~tenciando" ;
            Text [ english_us ] = "Power" ;
            Text [ norwegian ] = "Po~tens" ;
            Text [ italian ] = "Elevare a potenza" ;
            Text [ portuguese_brazilian ] = "Po~tência" ;
            Text [ portuguese ] = "Elevar a po~tência" ;
            Text [ finnish ] = "Po~tenssi" ;
            Text [ danish ] = "Opløft i potens" ;
            Text [ french ] = "Pu~issance" ;
            Text [ swedish ] = "~Upphöja" ;
            Text[ chinese_simplified ] = "³ËÃÝ(~W)";
            Text[ russian ] = "Ñòåïåíü";
            Text[ polish ] = "Potêguj";
            Text[ japanese ] = "—ݏæ";
            Text[ chinese_traditional ] = "­¼¾­(~W)";
            Text[ arabic ] = "ÞæÉ";
            Text[ dutch ] = "~Machtsverheffen";
            Text[ chinese_simplified ] = "³ËÃÝ(~W)";
            Text[ greek ] = "¾ø~ùóç óå äýíáìç";
            Text[ korean ] = "°ö";
            Text[ turkish ] = "Kuvvet çýkar";
        };
        MenuItem
        {
            Identifier = MN_POP_OPS ;
            HelpID = HID_MN_POP_OPS ;
            Text = "~Operatoren" ;
            Text [ ENGLISH ] = "~Operators" ;
            Text [ dutch ] = "O~peratoren" ;
            Text [ spanish ] = "~Operadores" ;
            Text [ english_us ] = "Operators" ;
            Text [ norwegian ] = "+++~Operators" ;
            Text [ italian ] = "Operatori" ;
            Text [ portuguese_brazilian ] = "~Operadores" ;
            Text [ portuguese ] = "~Operadores" ;
            Text [ finnish ] = "~Operaattorit" ;
            Text [ danish ] = "Operatorer" ;
            Text [ french ] = "~Opérateurs" ;
            Text [ swedish ] = "~Operatorer" ;
            SubMenu = Menu
            {
                ItemList =
                {
                    MenuItem
                    {
                        Identifier = MN_CALC_LISTSEP ;
                        HelpID = HID_MN_CALC_LISTSEP ;
                        Text = "~Listentrenner" ;
                        Text [ English ] = "Lis~t Separator" ;
                        Text [ dutch ] = "Lijst~scheidingsteken" ;
                        Text [ spanish ] = "~Separador de lista" ;
                        Text [ english_us ] = "List Separator" ;
                        Text [ norwegian ] = "+++Lis~t Separator" ;
                        Text [ italian ] = "~Separatore elenco" ;
                        Text [ portuguese_brazilian ] = "Separador de Lis~ta" ;
                        Text [ portuguese ] = "Separador de lis~ta" ;
                        Text [ finnish ] = "~Luettelon erotin" ;
                        Text [ danish ] = "Listeseparator" ;
                        Text [ french ] = "Séparateur de lis~te" ;
                        Text [ swedish ] = "List~avgränsare" ;
                        Text[ chinese_simplified ] = "Áбí·Ö¸ô·û(~S)";
                        Text[ russian ] = "Ðàçäåëèòåëü ñïèñêà";
                        Text[ polish ] = "Separator list";
                        Text[ japanese ] = "Ø½Ä‚Ì‹æØ‚è‹L†";
                        Text[ chinese_traditional ] = "²M³æ¤À¹j²Å(~S)";
                        Text[ arabic ] = "ÝÇÕá ÇáÞÇÆãÉ";
                        Text[ dutch ] = "Lijst~scheidingsteken";
                        Text[ chinese_simplified ] = "Áбí·Ö¸ô·û(~S)";
                        Text[ greek ] = "Äéá÷ùñéóôéêÜ ~ëßóôáò";
                        Text[ korean ] = "¸ñ·Ï ±¸ºÐÀÚ";
                        Text[ turkish ] = "~Liste öðeleri ayýrýcýsý";
                    };
                    MenuItem
                    {
                        Identifier = MN_CALC_EQ ;
                        HelpID = HID_MN_CALC_EQ ;
                        Text = "~Gleich" ;
                        Text [ English ] = "~Equal" ;
                        Text [ dutch ] = "~Gelijk aan" ;
                        Text [ spanish ] = "~Igual" ;
                        Text [ english_us ] = "Equal" ;
                        Text [ norwegian ] = "~Lik" ;
                        Text [ italian ] = "~Uguale" ;
                        Text [ portuguese_brazilian ] = "~Igual" ;
                        Text [ portuguese ] = "~Igual" ;
                        Text [ finnish ] = "~Yhtä suuri kuin" ;
                        Text [ danish ] = "Lig med" ;
                        Text [ french ] = "~Égal" ;
                        Text [ swedish ] = "~Lika med" ;
                        Text[ chinese_simplified ] = "µÈÓÚ(~E)";
                        Text[ russian ] = "Ðàâíî";
                        Text[ polish ] = "Równy";
                        Text[ japanese ] = "“™‚µ‚¢";
                        Text[ chinese_traditional ] = "µ¥©ó(~E)";
                        Text[ arabic ] = "íÓÇæí";
                        Text[ dutch ] = "~Gelijk aan";
                        Text[ chinese_simplified ] = "µÈÓÚ(~E)";
                        Text[ greek ] = "º~óï";
                        Text[ korean ] = "µ¿ÀÏ";
                        Text[ turkish ] = "Eþittir";
                    };
                    MenuItem
                    {
                        Identifier = MN_CALC_NEQ ;
                        HelpID = HID_MN_CALC_NEQ ;
                        Text = "~Nicht Gleich" ;
                        Text [ English ] = "~Not Equal" ;
                        Text [ dutch ] = "~Niet gelijk aan" ;
                        Text [ spanish ] = "~No igual" ;
                        Text [ english_us ] = "Not Equal" ;
                        Text [ norwegian ] = "~Ulik" ;
                        Text [ italian ] = "Non uguale" ;
                        Text [ portuguese_brazilian ] = "~Não Igual" ;
                        Text [ portuguese ] = "~Desigual" ;
                        Text [ finnish ] = "~Eri suuri kuin" ;
                        Text [ danish ] = "Forskellig fra" ;
                        Text [ french ] = "D~ifférent" ;
                        Text [ swedish ] = "~Inte lika med" ;
                        Text[ chinese_simplified ] = "²»µÈÓÚ(~N)";
                        Text[ russian ] = "Íå ðàâíî";
                        Text[ polish ] = "Nie równy";
                        Text[ japanese ] = "“™‚µ‚­‚È‚¢";
                        Text[ chinese_traditional ] = "¤£µ¥©ó(~N)";
                        Text[ arabic ] = "áÇ íÓÇæí";
                        Text[ dutch ] = "~Niet gelijk aan";
                        Text[ chinese_simplified ] = "²»µÈÓÚ(~N)";
                        Text[ greek ] = "~ÄéÜöïñï";
                        Text[ korean ] = "µ¿ÀÏÇÏÁö ¾ÊÀ½";
                        Text[ turkish ] = "Eþit deðil";
                    };
                    MenuItem
                    {
                        Identifier = MN_CALC_LEQ ;
                        HelpID = HID_MN_CALC_LEQ ;
                        Text = "~Kleiner Gleich" ;
                        Text [ English ] = "Le~ss Equal" ;
                        Text [ dutch ] = "~Kleiner dan of gelijk aan" ;
                        Text [ spanish ] = "Me~nor o igual" ;
                        Text [ english_us ] = "Less Than or Equal" ;
                        Text [ norwegian ] = "Mind~re enn" ;
                        Text [ italian ] = "Minore o uguale" ;
                        Text [ portuguese_brazilian ] = "Me~nor ou Igual" ;
                        Text [ portuguese ] = "Me~nor ou igual" ;
                        Text [ finnish ] = "P~ienempi tai yhtä kuin" ;
                        Text [ danish ] = "Mindre end eller lig med" ;
                        Text [ french ] = "I~nférieur ou égal à" ;
                        Text [ swedish ] = "Mi~ndre än eller lika med" ;
                        Text[ chinese_simplified ] = "СÓÚ»òµÈÓÚ(~Q)";
                        Text[ russian ] = "Ìåíüøå èëè ðàâíî";
                        Text[ polish ] = "Mniejszy lub równy";
                        Text[ japanese ] = "¬‚Ȃ貺°Ù";
                        Text[ chinese_traditional ] = "¤p©ó©Îµ¥©ó(~Q)";
                        Text[ arabic ] = "ÃÕÛÑ ãä Ãæ íÓÇæí";
                        Text[ dutch ] = "~Kleiner dan of gelijk aan";
                        Text[ chinese_simplified ] = "СÓÚ»òµÈÓÚ(~Q)";
                        Text[ greek ] = "Ìé~êñüôåñï Þ ßóï";
                        Text[ korean ] = "ÀÌÇÏ";
                        Text[ turkish ] = "Küçük ya da eþittir";
                    };
                    MenuItem
                    {
                        Identifier = MN_CALC_GEQ ;
                        HelpID = HID_MN_CALC_GEQ ;
                        /* ### ACHTUNG: Neuer Text in Resource? Gr~ößer Gleich : Gr~÷˜er Gleich */
                        Text = "Gr~ößer Gleich" ;
                        Text [ English ] = "~Greater Equal" ;
                        Text [ dutch ] = "G~roter dan of gelijk aan" ;
                        Text [ spanish ] = "M~ayor o igual" ;
                        Text [ english_us ] = "Greater Than or Equal" ;
                        Text [ norwegian ] = "~Større enn" ;
                        Text [ italian ] = "~Maggiore uguale" ;
                        Text [ portuguese_brazilian ] = "~Maior ou Igual" ;
                        Text [ portuguese ] = "M~aior ou igual" ;
                        Text [ finnish ] = "S~uurempi tai yhtä kuin" ;
                        Text [ danish ] = "Større end lig med" ;
                        Text [ french ] = "~Supérieur ou égal" ;
                        Text [ swedish ] = "St~örre än eller lika med" ;
                        Text[ chinese_simplified ] = "´óÓÚ»òµÈÓÚ(~G)";
                        Text[ russian ] = "Áîëüøå èëè ðàâíî";
                        Text[ polish ] = "Wiêkszy lub równy";
                        Text[ japanese ] = "‘å‚Ȃ貺°Ù";
                        Text[ chinese_traditional ] = "¤j©ó©Îµ¥©ó(~G)";
                        Text[ arabic ] = "ÃßÈÑ ãä Ãæ íÓÇæí";
                        Text[ dutch ] = "G~roter dan of gelijk aan";
                        Text[ chinese_simplified ] = "´óÓÚ»òµÈÓÚ(~G)";
                        Text[ greek ] = "Ìå~ãáëýôåñï Þ ßóï";
                        Text[ korean ] = "ÀÌ»ó";
                        Text[ turkish ] = "Büyük ya da eþittir";
                    };
                    MenuItem
                    {
                        Identifier = MN_CALC_LES ;
                        HelpID = HID_MN_CALC_LES ;
                        Text = "Kle~iner" ;
                        Text [ English ] = "~Less" ;
                        Text [ dutch ] = "K~leiner" ;
                        Text [ spanish ] = "M~enor" ;
                        Text [ english_us ] = "Less" ;
                        Text [ norwegian ] = "~Mindre" ;
                        Text [ italian ] = "Minore" ;
                        Text [ portuguese_brazilian ] = "~Menos" ;
                        Text [ portuguese ] = "~Menor" ;
                        Text [ finnish ] = "~Pienempi kuin" ;
                        Text [ danish ] = "Mindre end" ;
                        Text [ french ] = "In~férieur" ;
                        Text [ swedish ] = "~Mindre än" ;
                        Text[ chinese_simplified ] = "СÓÚ(~L)";
                        Text[ russian ] = "Ìåíüøå";
                        Text[ polish ] = "Mniejszy";
                        Text[ japanese ] = "‚æ‚菭‚È‚¢";
                        Text[ chinese_traditional ] = "¤p©ó(~L)";
                        Text[ arabic ] = "ÃÕÛÑ";
                        Text[ dutch ] = "K~leiner";
                        Text[ chinese_simplified ] = "СÓÚ(~L)";
                        Text[ greek ] = "Ì~éêñüôåñï";
                        Text[ korean ] = "¹Ì¸¸";
                        Text[ turkish ] = "Küçüktür";
                    };
                    MenuItem
                    {
                        Identifier = MN_CALC_GRE ;
                        HelpID = HID_MN_CALC_GRE ;
                        /* ### ACHTUNG: Neuer Text in Resource? G~rößer : G~r÷˜er */
                        Text = "G~rößer" ;
                        Text [ English ] = "G~reater" ;
                        Text [ dutch ] = "Gro~ter" ;
                        Text [ spanish ] = "~Mayor" ;
                        Text [ english_us ] = "Greater" ;
                        Text [ norwegian ] = "S~tørre" ;
                        Text [ italian ] = "Maggiore" ;
                        Text [ portuguese_brazilian ] = "M~aior" ;
                        Text [ portuguese ] = "M~aior" ;
                        Text [ finnish ] = "~Suurempi kuin" ;
                        Text [ danish ] = "Større end" ;
                        Text [ french ] = "S~upérieur" ;
                        Text [ swedish ] = "~Större än" ;
                        Text[ chinese_simplified ] = "´óÓÚ(~R)";
                        Text[ russian ] = "Áîëüøå";
                        Text[ polish ] = "Wiêkszy";
                        Text[ japanese ] = "‚æ‚è‘å‚«‚¢";
                        Text[ chinese_traditional ] = "¤j©ó(~R)";
                        Text[ arabic ] = "ÃßÈÑ";
                        Text[ dutch ] = "Gro~ter";
                        Text[ chinese_simplified ] = "´óÓÚ(~R)";
                        Text[ greek ] = "Ìåãáëýôå~ñï";
                        Text[ korean ] = "Ãʰú";
                        Text[ turkish ] = "Büyüktür";
                    };
                    MenuItem
                    {
                        Separator = TRUE ;
                    };
                    MenuItem
                    {
                        Identifier = MN_CALC_OR ;
                        HelpID = HID_MN_CALC_OR ;
                        Text = "Logisches ~Oder" ;
                        Text [ English ] = "Logical ~Or" ;
                        Text [ dutch ] = "Logisch ~Of" ;
                        Text [ spanish ] = "~O lógico" ;
                        Text [ english_us ] = "Boolean Or" ;
                        Text [ norwegian ] = "Logisk ~Eller" ;
                        Text [ italian ] = "Logica ~O" ;
                        Text [ portuguese_brazilian ] = "Ou lógico ~" ;
                        Text [ portuguese ] = "~OU lógico" ;
                        Text [ finnish ] = "Looginen ~Or" ;
                        Text [ danish ] = "Logisk ELLER" ;
                        Text [ french ] = "~OU logique" ;
                        Text [ swedish ] = "Logiskt ~Eller" ;
                        Text[ chinese_simplified ] = "Âß¼­µÄ ~Or";
                        Text[ russian ] = "Ëîãè÷åñêîå Èëè";
                        Text[ polish ] = "Funkcja logiczna LUB";
                        Text[ japanese ] = "˜_—Ï(Or)";
                        Text[ chinese_traditional ] = "Å޿誺 ~Or";
                        Text[ arabic ] = "Ãæ ãäØÞíÉ";
                        Text[ dutch ] = "Logisch ~Of";
                        Text[ chinese_simplified ] = "Âß¼­µÄ ~Or";
                        Text[ greek ] = "ÔåëåóôÞò ~Or ôïõ Boole";
                        Text[ korean ] = "ºÒ¸®¾ð Or";
                        Text[ turkish ] = "Mantýksal Veya";
                    };
                    MenuItem
                    {
                        Identifier = MN_CALC_XOR ;
                        HelpID = HID_MN_CALC_XOR ;
                        Text = "Logisches E~xklusives Oder" ;
                        Text [ English ] = "Logical ~Xor" ;
                        Text [ dutch ] = "Logisch e~xclusief Of" ;
                        Text [ spanish ] = "O lógico e~xclusivo" ;
                        Text [ english_us ] = "Boolean Xor" ;
                        Text [ norwegian ] = "Logisk ~Xeller" ;
                        Text [ italian ] = "Logica O esclusiva" ;
                        Text [ portuguese_brazilian ] = "Xou lógico" ;
                        Text [ portuguese ] = "OU lógico e~xclusivo" ;
                        Text [ finnish ] = "Looginen ~Xor" ;
                        Text [ danish ] = "Logisk eksklusiv ELLER" ;
                        Text [ french ] = "Ou logique e~xclusif" ;
                        Text [ swedish ] = "Logiskt E~xklusivt Eller" ;
                        Text[ chinese_simplified ] = "Âß¼­µÄ³ýÍâµÄ Or";
                        Text[ russian ] = "Ëîãè÷åñêîå ðàçäåëèòåëüíîå \"èëè\"";
                        Text[ polish ] = "Wy³¹czna funkcja logiczna LUB";
                        Text[ japanese ] = "˜_—˜a(Xor)";
                        Text[ chinese_traditional ] = "Å޿誺°£¥~ªº Or";
                        Text[ arabic ] = "Ãæ ãäØÞíÉ ÎÇÕÉ";
                        Text[ dutch ] = "Logisch e~xclusief Of";
                        Text[ chinese_simplified ] = "Âß¼­µÄ³ýÍâµÄ Or";
                        Text[ greek ] = "ÔåëåóôÞò ~Xor ôïõ Boole";
                        Text[ korean ] = "ºÒ¸®¾ð Xor";
                        Text[ turkish ] = "Mantýksal ~tek Veya";
                    };
                    MenuItem
                    {
                        Identifier = MN_CALC_AND ;
                        HelpID = HID_MN_CALC_AND ;
                        Text = "Logisches ~Und" ;
                        Text [ English ] = "Logical ~And" ;
                        Text [ dutch ] = "Logisch ~En" ;
                        Text [ spanish ] = "~Y lógico" ;
                        Text [ english_us ] = "Boolean And" ;
                        Text [ norwegian ] = "Logisk ~Og" ;
                        Text [ italian ] = "Logica ~E" ;
                        Text [ portuguese_brazilian ] = "E ~lógico" ;
                        Text [ portuguese ] = "~E lógico" ;
                        Text [ finnish ] = "Looginen ~And" ;
                        Text [ danish ] = "Logisk OG" ;
                        Text [ french ] = "~ET logique" ;
                        Text [ swedish ] = "Logiskt ~Och" ;
                        Text[ chinese_simplified ] = "Âß¼­µÄ ~And";
                        Text[ russian ] = "Ëîãè÷åñêîå ~È";
                        Text[ polish ] = "Funkcja logiczna ORAZ";
                        Text[ japanese ] = "˜_—Ï(And)";
                        Text[ chinese_traditional ] = "Å޿誺 ~And";
                        Text[ arabic ] = "æ ãäØÞíÉ";
                        Text[ dutch ] = "Logisch ~En";
                        Text[ chinese_simplified ] = "Âß¼­µÄ ~And";
                        Text[ greek ] = "ÔåëåóôÞò ~And ôïõ Boole";
                        Text[ korean ] = "ºÒ¸®¾ð And";
                        Text[ turkish ] = "Mantýksal ~Ve";
                    };
                    MenuItem
                    {
                        Identifier = MN_CALC_NOT ;
                        HelpID = HID_MN_CALC_NOT ;
                        Text = "Logi~sches Nicht" ;
                        Text [ English ] = "Log~ical Not" ;
                        Text [ dutch ] = "Log~isch Niet" ;
                        Text [ spanish ] = "~No lógico" ;
                        Text [ english_us ] = "Boolean Not" ;
                        Text [ norwegian ] = "Log~isk Ikke" ;
                        Text [ italian ] = "Logica Non" ;
                        Text [ portuguese_brazilian ] = "Não Lóg~ico" ;
                        Text [ portuguese ] = "~NÃO lógico" ;
                        Text [ finnish ] = "Looginen ~Not" ;
                        Text [ danish ] = "Logisk IKKE" ;
                        Text [ french ] = "NON log~ique" ;
                        Text [ swedish ] = "Logiskt I~nte" ;
                        Text[ chinese_simplified ] = "Âß¼­µÄ Not";
                        Text[ russian ] = "Ëîãè÷åñêîå Íå";
                        Text[ polish ] = "Funkcja logiczna NIE";
                        Text[ japanese ] = "˜_—”Û’è(Not)";
                        Text[ chinese_traditional ] = "Å޿誺 Not";
                        Text[ arabic ] = "áÇ ãäØÞíÉ";
                        Text[ dutch ] = "Log~isch Niet";
                        Text[ chinese_simplified ] = "Âß¼­µÄ Not";
                        Text[ greek ] = "Ôåëå~óôÞò Not ôïõ Boole";
                        Text[ korean ] = "ºÒ¸®¾ð Not";
                        Text[ turkish ] = "Matýk~al Deðil";
                    };
                };
            };
            Text[ chinese_simplified ] = "ÔËËã·û(~O)";
            Text[ russian ] = "Îïåðàòîðû";
            Text[ polish ] = "Operatory";
            Text[ japanese ] = "‰‰ŽZŽq";
            Text[ chinese_traditional ] = "¹Bºâ²Å(~O)";
            Text[ arabic ] = "ÚæÇãá ÇáÊÔÛíá";
            Text[ dutch ] = "O~peratoren";
            Text[ chinese_simplified ] = "ÔËËã·û(~O)";
            Text[ greek ] = "~ÔåëåóôÝò";
            Text[ korean ] = "¿¬»êÀÚ";
            Text[ turkish ] = "Ýþleçler";
        };
        MenuItem
        {
            Identifier = MN_POP_STATISTICS ;
            HelpID = HID_MN_POP_STATISTICS ;
            Text = "S~tatistische Funktionen" ;
            Text [ ENGLISH ] = "S~tatistical Functions" ;
            Text [ dutch ] = "~Statistische functies" ;
            Text [ spanish ] = "F~unciones estadísticas" ;
            Text [ english_us ] = "Statistical Functions" ;
            Text [ norwegian ] = "S~tatistiske Funksjoner" ;
            Text [ italian ] = "Funzioni statistiche" ;
            Text [ portuguese_brazilian ] = "Funç~oes Estatísticas" ;
            Text [ portuguese ] = "Funções e~statísticas" ;
            Text [ finnish ] = "~Tilastofunktiot" ;
            Text [ danish ] = "Statistiske funktioner" ;
            Text [ french ] = "Fonctions s~tatistiques" ;
            Text [ swedish ] = "S~tatistiska funktioner" ;
            SubMenu = Menu
            {
                ItemList =
                {
                    MenuItem
                    {
                        Identifier = MN_CALC_MEAN ;
                        HelpID = HID_MN_CALC_MEAN ;
                        Text = "~Mittelwert" ;
                        Text [ English ] = "Average" ;
                        Text [ dutch ] = "~Gemiddelde waarde" ;
                        Text [ spanish ] = "Pro~medio" ;
                        Text [ english_us ] = "Mean" ;
                        Text [ norwegian ] = "Gjennomsnitt" ;
                        Text [ italian ] = "Valore medio" ;
                        Text [ portuguese_brazilian ] = "Média" ;
                        Text [ portuguese ] = "~Média" ;
                        Text [ finnish ] = "Keskiarvo" ;
                        Text [ danish ] = "Middel" ;
                        Text [ french ] = "~Moyenne" ;
                        Text [ swedish ] = "M~edelvärde" ;
                        Text[ chinese_simplified ] = "ƽ¾ùÖµ(~M)";
                        Text[ russian ] = "Ñðåäíåå çíà÷åíèå";
                        Text[ polish ] = "Œrednia wartoœæ";
                        Text[ japanese ] = "•½‹Ï’l";
                        Text[ chinese_traditional ] = "¥­§¡­È(~M)";
                        Text[ arabic ] = "ÇáãÚÏá";
                        Text[ dutch ] = "~Gemiddelde waarde";
                        Text[ chinese_simplified ] = "ƽ¾ùÖµ(~M)";
                        Text[ greek ] = "~ÌÝóç ôéìÞ";
                        Text[ korean ] = "Æò±Õ";
                        Text[ turkish ] = "Ortalama deðer";
                    };
                    MenuItem
                    {
                        Identifier = MN_CALC_MIN ;
                        HelpID = HID_MN_CALC_MIN ;
                        Text = "Mi~nimalwert" ;
                        Text [ English ] = "Minimum" ;
                        Text [ dutch ] = "M~inimumwaarde" ;
                        Text [ spanish ] = "Valor mí~nimo" ;
                        Text [ english_us ] = "Minimum" ;
                        Text [ norwegian ] = "Minimum" ;
                        Text [ italian ] = "Valore minimo" ;
                        Text [ portuguese_brazilian ] = "Mínimo" ;
                        Text [ portuguese ] = "Valor mí~nimo" ;
                        Text [ finnish ] = "Vähintään" ;
                        Text [ danish ] = "Minimumværdi" ;
                        Text [ french ] = "~Minimum" ;
                        Text [ swedish ] = "M~inimum" ;
                        Text[ chinese_simplified ] = "×îСֵ(~N)";
                        Text[ russian ] = "Ìèíèìàëüíîå çíà÷åíèå";
                        Text[ polish ] = "Minimum";
                        Text[ japanese ] = "Å¬’l";
                        Text[ chinese_traditional ] = "³Ì¤p­È(~N)";
                        Text[ arabic ] = "ÃÏäì ÞíãÉ";
                        Text[ dutch ] = "M~inimumwaarde";
                        Text[ chinese_simplified ] = "×îСֵ(~N)";
                        Text[ greek ] = "ÅëÜ÷éóôç ôé~ìÞ";
                        Text[ korean ] = "ÃÖ¼Ò";
                        Text[ turkish ] = "Asgari deðer";
                    };
                    MenuItem
                    {
                        Identifier = MN_CALC_MAX ;
                        HelpID = HID_MN_CALC_MAX ;
                        Text = "Ma~ximalwert" ;
                        Text [ English ] = "Maximum" ;
                        Text [ dutch ] = "~Maximumwaarde" ;
                        Text [ spanish ] = "Valor má~ximo" ;
                        Text [ english_us ] = "Maximum" ;
                        Text [ norwegian ] = "Maksimum" ;
                        Text [ italian ] = "Valore massimo" ;
                        Text [ portuguese_brazilian ] = "Máximo" ;
                        Text [ portuguese ] = "Valor má~ximo" ;
                        Text [ finnish ] = "Suurin arvo" ;
                        Text [ danish ] = "Maksimumværdi" ;
                        Text [ french ] = "Ma~ximum" ;
                        Text [ swedish ] = "M~aximum" ;
                        Text[ chinese_simplified ] = "×î´óÖµ(~X)";
                        Text[ russian ] = "Ìàêñèìàëüíîå çíà÷åíèå";
                        Text[ polish ] = "Maksimum";
                        Text[ japanese ] = "Å‘å’l";
                        Text[ chinese_traditional ] = "³Ì¤j­È(~X)";
                        Text[ arabic ] = "ÃÞÕì ÞíãÉ";
                        Text[ dutch ] = "~Maximumwaarde";
                        Text[ chinese_simplified ] = "×î´óÖµ(~X)";
                        Text[ greek ] = "ÌÝ~ãéóôç ôéìÞ";
                        Text[ korean ] = "ÃÖ´ë";
                        Text[ turkish ] = "Azami deðer";
                    };
                };
            };
            Text[ chinese_simplified ] = "ͳ¼Æ¹¦ÄÜ(~T)";
            Text[ russian ] = "Ñòàòèñòè÷åñêèå ôóíêöèè";
            Text[ polish ] = "Funkcje statystyczne";
            Text[ japanese ] = "“ŒvŠw“IŠÖ”";
            Text[ chinese_traditional ] = "²Î­p¥\\¯à(~T)";
            Text[ arabic ] = "ÏÇáÇÊ ÅÍÕÇÆíÉ";
            Text[ dutch ] = "~Statistische functies";
            Text[ chinese_simplified ] = "ͳ¼Æ¹¦ÄÜ(~T)";
            Text[ greek ] = "Ó~ôáôéóôéêÝò óõíáñôÞóåéò";
            Text[ korean ] = "Åë°è ÇÔ¼ö";
            Text[ turkish ] = "Ýstatistik iþlevleri";
        };
        MenuItem
        {
            Identifier = MN_POP_FUNC ;
            HelpID = HID_MN_POP_FUNC ;
            Text = "~Funktionen" ;
            Text [ ENGLISH ] = "~Functions" ;
            Text [ dutch ] = "~Functies" ;
            Text [ spanish ] = "~Funciones" ;
            Text [ english_us ] = "Functions" ;
            Text [ norwegian ] = "~Funksjoner" ;
            Text [ italian ] = "Funzioni" ;
            Text [ portuguese_brazilian ] = "~Funções" ;
            Text [ portuguese ] = "~Funções" ;
            Text [ finnish ] = "~Funktiot" ;
            Text [ danish ] = "Funktioner" ;
            Text [ french ] = "~Fonctions" ;
            Text [ swedish ] = "~Funktioner" ;
            SubMenu = Menu
            {
                ItemList =
                {
                    MenuItem
                    {
                        Identifier = MN_CALC_SIN ;
                        HelpID = HID_MN_CALC_SIN ;
                        Text = "~Sinus" ;
                        Text [ english ] = "~Sinus" ;
                        Text [ english_us ] = "Sine" ;
                        Text [ portuguese_brazilian ] = "~Sinus" ;
                        Text [ swedish ] = "~sinus" ;
                        Text [ danish ] = "Sinus" ;
                        Text [ italian ] = "~Seno" ;
                        Text [ spanish ] = "~Seno" ;
                        Text [ french ] = "~Sinus" ;
                        Text [ dutch ] = "~Sinus" ;
                        Text [ portuguese ] = "~Seno" ;
                        Text[ chinese_simplified ] = "ÕýÏÒ(~S)";
                        Text[ russian ] = "Ñèíóñ";
                        Text[ polish ] = "Sinus";
                        Text[ japanese ] = "»²Ý";
                        Text[ chinese_traditional ] = "¥¿©¶(~S)";
                        Text[ arabic ] = "ÌíÈ ÇáÒÇæíÉ";
                        Text[ dutch ] = "~Sinus";
                        Text[ chinese_simplified ] = "ÕýÏÒ(~S)";
                        Text[ greek ] = "~Çìßôïíï";
                        Text[ korean ] = "»çÀÎ";
                        Text[ turkish ] = "Sinüs";
                    };
                    MenuItem
                    {
                        Identifier = MN_CALC_COS ;
                        HelpID = HID_MN_CALC_COS ;
                        Text = "~Cosinus" ;
                        Text [ english ] = "~Cosinus" ;
                        Text [ english_us ] = "Cosine" ;
                        Text [ portuguese_brazilian ] = "~Cosinus" ;
                        Text [ swedish ] = "~cosinus" ;
                        Text [ danish ] = "Cosinus" ;
                        Text [ italian ] = "~Coseno" ;
                        Text [ spanish ] = "~Coseno" ;
                        Text [ french ] = "~Cosinus" ;
                        Text [ dutch ] = "~Cosinus" ;
                        Text [ portuguese ] = "~Coseno" ;
                        Text[ chinese_simplified ] = "ÓàÏÒ(~C)";
                        Text[ russian ] = "Êîñèíóñ";
                        Text[ polish ] = "Cosinus";
                        Text[ japanese ] = "º»²Ý";
                        Text[ chinese_traditional ] = "§E©¶(~C)";
                        Text[ arabic ] = "ÌíÈ ÊãÇã";
                        Text[ dutch ] = "~Cosinus";
                        Text[ chinese_simplified ] = "ÓàÏÒ(~C)";
                        Text[ greek ] = "~Óõíçìßôïíï";
                        Text[ korean ] = "ÄÚ»çÀÎ";
                        Text[ turkish ] = "Kosinüs";
                    };
                    MenuItem
                    {
                        Identifier = MN_CALC_TAN ;
                        HelpID = HID_MN_CALC_TAN ;
                        Text = "~Tangens" ;
                        Text [ english ] = "~Tangens" ;
                        Text [ english_us ] = "Tangent" ;
                        Text [ portuguese_brazilian ] = "~Tangens" ;
                        Text [ swedish ] = "~tangens" ;
                        Text [ danish ] = "Tangens" ;
                        Text [ italian ] = "~Tangente" ;
                        Text [ spanish ] = "~Tangente" ;
                        Text [ french ] = "~Tangente" ;
                        Text [ dutch ] = "~Tangens" ;
                        Text [ portuguese ] = "~Tangente" ;
                        Text[ chinese_simplified ] = "ÕýÇÐ(~T)";
                        Text[ russian ] = "Òàíãåíñ";
                        Text[ polish ] = "Tangens";
                        Text[ japanese ] = "ÀݼުÝÄ";
                        Text[ chinese_traditional ] = "¥¿¤Á(~T)";
                        Text[ arabic ] = "Ùá";
                        Text[ dutch ] = "~Tangens";
                        Text[ chinese_simplified ] = "ÕýÇÐ(~T)";
                        Text[ greek ] = "Åöáð~ôïìÝíç";
                        Text[ korean ] = "źÁ¨Æ®";
                        Text[ turkish ] = "Tanjant";
                    };
                    MenuItem
                    {
                        Identifier = MN_CALC_ASIN ;
                        HelpID = HID_MN_CALC_ASIN ;
                        Text = "~Arcussinus" ;
                        Text [ english ] = "~Arcussinus" ;
                        Text [ english_us ] = "Arcsine" ;
                        Text [ portuguese_brazilian ] = "~Arcussinus" ;
                        Text [ swedish ] = "~arcussinus" ;
                        Text [ danish ] = "Arcus sinus" ;
                        Text [ italian ] = "~Arcoseno" ;
                        Text [ spanish ] = "Seno de ~arco" ;
                        Text [ french ] = "~Arc sinus" ;
                        Text [ dutch ] = "~Boogsinus" ;
                        Text [ portuguese ] = "~Arco seno" ;
                        Text[ chinese_simplified ] = "·´ÕýÏÒ";
                        Text[ russian ] = "Àðêñèíóñ";
                        Text[ polish ] = "Arcus sinus";
                        Text[ japanese ] = "±°¸»²Ý";
                        Text[ chinese_traditional ] = "¤Ï¥¿©¶";
                        Text[ arabic ] = "ãÞÇÈá ÇáÌíÈ";
                        Text[ dutch ] = "~Boogsinus";
                        Text[ chinese_simplified ] = "·´ÕýÏÒ";
                        Text[ greek ] = "~Ôüîï çìéôüíïõ";
                        Text[ korean ] = "¾ÆÅ©»çÀÎ";
                        Text[ turkish ] = "Arksinüs";
                    };
                    MenuItem
                    {
                        Identifier = MN_CALC_ACOS ;
                        HelpID = HID_MN_CALC_ACOS ;
                        Text = "A~rcuscosinus" ;
                        Text [ english ] = "A~rcuscosinus" ;
                        Text [ english_us ] = "Arccosine" ;
                        Text [ portuguese_brazilian ] = "A~rcuscosinus" ;
                        Text [ swedish ] = "a~rcuscosinus" ;
                        Text [ danish ] = "Arcus cosinus" ;
                        Text [ italian ] = "A~rcocoseno" ;
                        Text [ spanish ] = "Coseno de a~rco" ;
                        Text [ french ] = "~Arc cosinus" ;
                        Text [ dutch ] = "B~oogcosinus" ;
                        Text [ portuguese ] = "Arco cose~no" ;
                        Text[ chinese_simplified ] = "·´ÓàÏÒ";
                        Text[ russian ] = "Àðêêîñèíóñ";
                        Text[ polish ] = "Arcus cosinus";
                        Text[ japanese ] = "±°¸º»²Ý";
                        Text[ chinese_traditional ] = "¤Ï§E©¶";
                        Text[ arabic ] = "ãÞÇÈá ÌíÈ ÇáÊãÇã";
                        Text[ dutch ] = "B~oogcosinus";
                        Text[ chinese_simplified ] = "·´ÓàÏÒ";
                        Text[ greek ] = "Ôü~îï óõíçìéôüíïõ";
                        Text[ korean ] = "¾ÆÅ© ÄÚ»çÀÎ";
                        Text[ turkish ] = "Arkkosinüs";
                    };
                    MenuItem
                    {
                        Identifier = MN_CALC_ATAN ;
                        HelpID = HID_MN_CALC_ATAN ;
                        Text = "Arcustan~gens" ;
                        Text [ english ] = "Arcustan~gens" ;
                        Text [ english_us ] = "Arctangent" ;
                        Text [ portuguese_brazilian ] = "Arcustan~gens" ;
                        Text [ swedish ] = "arcustan~gens" ;
                        Text [ danish ] = "Arcus tangens" ;
                        Text [ italian ] = "Arcotan~gente" ;
                        Text [ spanish ] = "~Tangente de arco" ;
                        Text [ french ] = "Arc tan~gente" ;
                        Text [ dutch ] = "Boogtan~gens" ;
                        Text [ portuguese ] = "~Arco tangente" ;
                        Text[ chinese_simplified ] = "·´ÕýÇÐ";
                        Text[ russian ] = "Àðêòàíãåíñ";
                        Text[ polish ] = "Arcus tangens";
                        Text[ japanese ] = "±°¸ÀݼުÝÄ";
                        Text[ chinese_traditional ] = "¤Ï¥¿¤Á";
                        Text[ arabic ] = "ãÞÇÈá ÇáÙá";
                        Text[ dutch ] = "Boogtan~gens";
                        Text[ chinese_simplified ] = "·´ÕýÇÐ";
                        Text[ greek ] = "Ôüîï å~öáðôïìÝíçò";
                        Text[ korean ] = "¾ÆÅ© źÁ¨Æ®";
                        Text[ turkish ] = "Arktanjant";
                    };
                };
            };
            Text[ chinese_simplified ] = "º¯Êý(~F)";
            Text[ russian ] = "Ôóíêöèè";
            Text[ polish ] = "Funkcje";
            Text[ japanese ] = "ŠÖ”";
            Text[ chinese_traditional ] = "¨ç¼Æ(~F)";
            Text[ arabic ] = "ÏÇáÇÊ";
            Text[ dutch ] = "~Functies";
            Text[ chinese_simplified ] = "º¯Êý(~F)";
            Text[ language_user1 ] = "(ÄÄ) ; - - - - - -";
            Text[ greek ] = "~ÓõíáñôÞóåéò";
            Text[ korean ] = "ÇÔ¼ö";
            Text[ turkish ] = "Ýþlevler";
        };
    };
};
String STR_FORMULA
{
    Text = "Textformel" ;
    Text [ ENGLISH ] = "Text Formula" ;
    Text [ dutch ] = "Tekstformule" ;
    Text [ spanish ] = "Fórmula de texto" ;
    Text [ english_us ] = "Text formula" ;
    Text [ norwegian ] = "Tekstformel" ;
    Text [ italian ] = "Formula testo" ;
    Text [ portuguese_brazilian ] = "Fórmula do Texto" ;
    Text [ portuguese ] = "Fórmula do texto" ;
    Text [ finnish ] = "Tekstikaava" ;
    Text [ danish ] = "Tekstformel" ;
    Text [ french ] = "Formule texte" ;
    Text [ swedish ] = "Textformel" ;
    Text[ chinese_simplified ] = "Îı¾±í¸ñ";
    Text[ russian ] = "Ôîðìóëà òåêñòà";
    Text[ polish ] = "Formu³a tekstu";
    Text[ japanese ] = "÷½ÄŒ`Ž®";
    Text[ chinese_traditional ] = "¤å¦rªí®æ";
    Text[ arabic ] = "ÕíÛÉ ÇáäÕ";
    Text[ dutch ] = "Tekstformule";
    Text[ chinese_simplified ] = "Îı¾±í¸ñ";
    Text[ language_user1 ] = "(ÄÄ) ; - - - - - -";
    Text[ greek ] = "Ôýðïò êåéìÝíïõ";
    Text[ korean ] = "ÅØ½ºÆ® ¼ö½Ä";
    Text[ turkish ] = "Metin formulü";
};
#define TB_INPUT  \
    ToolBoxItem\
    {\
        Identifier = FN_FORMULA_CALC ; \
        HelpID = FN_FORMULA_CALC ; \
        Text = "Formel" ; \
        Text [ English ] = "Formula" ; \
        Text [ norwegian ] = "Formel" ; \
        Text [ italian ] = "Formula" ; \
        Text [ portuguese_brazilian ] = "Fórmula" ; \
        Text [ portuguese ] = "Fórmula" ; \
        Text [ finnish ] = "Kaava" ; \
        Text [ danish ] = "Formel" ; \
        Text [ french ] = "Formule" ; \
        Text [ swedish ] = "Formel" ; \
        Text [ dutch ] = "Formule" ; \
        Text [ spanish ] = "Fórmula" ; \
        Text [ english_us ] = "Formula" ; \
        /* ### ACHTUNG: Neuer Text in Resource? Formel auswählen : Formel auswõhlen */\
        Text[ chinese_simplified ] = "¹«Ê½";\
        Text[ russian ] = "Ôîðìóëà";\
        Text[ polish ] = "Formu³a";\
        Text[ japanese ] = "”Ž®";\
        Text[ chinese_traditional ] = "¤½¦¡";\
        Text[ arabic ] = "ÕíÛÉ";\
        Text[ dutch ] = "Formule";\
        Text[ chinese_simplified ] = "¹«Ê½";\
        Text[ greek ] = "Ôýðïò";\
        Text[ korean ] = "¼ö½Ä";\
        Text[ turkish ] = "Formül";\
    };\
    ToolBoxItem\
    {\
        Identifier = FN_FORMULA_CANCEL ; \
        HelpID = FN_FORMULA_CANCEL ; \
        Text = "Abbrechen" ; \
        Text [ English ] = "Cancel" ; \
        Text [ norwegian ] = "Avbryt" ; \
        Text [ italian ] = "Annulla" ; \
        Text [ portuguese_brazilian ] = "Cancelar" ; \
        Text [ portuguese ] = "Cancelar" ; \
        Text [ finnish ] = "Peruuta" ; \
        Text [ danish ] = "Annuller" ; \
        Text [ french ] = "Annuler " ; \
        Text [ swedish ] = "Avbryt" ; \
        Text [ dutch ] = "Annuleren" ; \
        Text [ spanish ] = "Cancelar" ; \
        Text [ english_us ] = "Cancel" ; \
        /* ### ACHTUNG: Neuer Text in Resource? Formel nicht übenehmen : Formel nicht ³benehmen */\
        Text[ chinese_simplified ] = "È¡Ïû";\
        Text[ russian ] = "Îòìåíà";\
        Text[ polish ] = "Anuluj";\
        Text[ japanese ] = "·¬Ý¾Ù";\
        Text[ chinese_traditional ] = "¨ú®ø";\
        Text[ arabic ] = "ÅáÛÇÁ ÇáÃãÑ";\
        Text[ dutch ] = "Annuleren";\
        Text[ chinese_simplified ] = "È¡Ïû";\
        Text[ greek ] = "Áêýñùóç";\
        Text[ korean ] = "Ãë¼Ò";\
        Text[ turkish ] = "Ýptal";\
    };\
    ToolBoxItem\
    {\
        Identifier = FN_FORMULA_APPLY ; \
        HelpID = FN_FORMULA_APPLY ; \
        /* ### ACHTUNG: Neuer Text in Resource? Übernehmen : šbernehmen */\
        Text = "Übernehmen" ; \
        Text [ English ] = "Apply" ; \
        Text [ norwegian ] = "Benytt" ; \
        Text [ italian ] = "Applica" ; \
        Text [ portuguese_brazilian ] = "Aplicar" ; \
        Text [ portuguese ] = "Aplicar" ; \
        Text [ finnish ] = "Käytä" ; \
        Text [ danish ] = "Anvend" ; \
        Text [ french ] = "Appliquer" ; \
        Text [ swedish ] = "Överta" ; \
        Text [ dutch ] = "Overnemen" ; \
        Text [ spanish ] = "Aplicar" ; \
        Text [ english_us ] = "Apply" ; \
        /* ### ACHTUNG: Neuer Text in Resource? Formel einfügen : Formel einf³gen */\
        Text[ chinese_simplified ] = "Ó¦ÓÃ";\
        Text[ russian ] = "Âûïîëíèòü";\
        Text[ polish ] = "Zastosuj";\
        Text[ japanese ] = "“K—p‚·‚é";\
        Text[ chinese_traditional ] = "¨Ï¥Î";\
        Text[ arabic ] = "ÅÏÎÇá";\
        Text[ dutch ] = "Overnemen";\
        Text[ chinese_simplified ] = "Ó¦ÓÃ";\
        Text[ greek ] = "ÅöáñìïãÞ";\
        Text[ korean ] = "Àû¿ë";\
        Text[ turkish ] = "Uygula";\
    };

diff --git a/sw/source/ui/ribbar/makefile.mk b/sw/source/ui/ribbar/makefile.mk
new file mode 100644
index 0000000..571eabd
--- /dev/null
+++ b/sw/source/ui/ribbar/makefile.mk
@@ -0,0 +1,109 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:46 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=..$/..$/..

PRJNAME=sw
TARGET=ribbar

AUTOSEG=true

PROJECTPCH=ui_pch
PDBTARGET=ui_pch
PROJECTPCHSOURCE=..\ui_1st\ui_pch

# --- Settings -----------------------------------------------------

.INCLUDE :  $(PRJ)$/inc$/swpre.mk
.INCLUDE :  settings.mk
.INCLUDE :  $(PRJ)$/inc$/sw.mk

IMGLST_SRS=$(SRS)$/ribbar.srs
BMP_IN=$(PRJ)$/win/imglst

# --- Files --------------------------------------------------------

SRCFILES =  \
        tbxanchr.src \
        inputwin.src \
        tblctrl.src \
        workctrl.src

SLOFILES =  \
        $(SLO)$/inputwin.obj \
        $(SLO)$/tbxanchr.obj \
        $(SLO)$/tbxmgr.obj \
        $(SLO)$/conrect.obj \
        $(SLO)$/conform.obj \
        $(SLO)$/conpoly.obj \
        $(SLO)$/conarc.obj \
        $(SLO)$/dselect.obj \
        $(SLO)$/drawbase.obj \
        $(SLO)$/tblctrl.obj \
        $(SLO)$/workctrl.obj

# --- Tagets -------------------------------------------------------

.INCLUDE :  target.mk

$(SRS)$/ribbar.srs: $(SOLARINCDIR)$/svx$/globlmn.hrc

diff --git a/sw/source/ui/ribbar/tblctrl.cxx b/sw/source/ui/ribbar/tblctrl.cxx
new file mode 100644
index 0000000..89a3f08
--- /dev/null
+++ b/sw/source/ui/ribbar/tblctrl.cxx
@@ -0,0 +1,209 @@
/*************************************************************************
 *
 *  $RCSfile: tblctrl.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:46 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SFXINTITEM_HXX //autogen
#include <svtools/intitem.hxx>
#endif


#include "cmdid.h"
#include "swtypes.hxx"
#include "tbxmgr.hxx"
#include "tblctrl.hxx"
#include "tblctrl.hrc"



SFX_IMPL_TOOLBOX_CONTROL( SwTableOptimizeCtrl, SfxUInt16Item );

/**********************************************************************

**********************************************************************/




SwTableOptimizeCtrl::SwTableOptimizeCtrl( USHORT nId,
                                    ToolBox& rTbx,
                                    SfxBindings& rBind ) :
        SfxToolBoxControl( nId, rTbx, rBind )
{
}
/**********************************************************************

**********************************************************************/



SwTableOptimizeCtrl::~SwTableOptimizeCtrl()
{
}

/**********************************************************************

**********************************************************************/



SfxPopupWindow* SwTableOptimizeCtrl::CreatePopupWindow()
{
    USHORT nWinResId, nTbxResId;
        nWinResId = RID_TBL_OPT_CTRL;
        nTbxResId = TBX_OPTIMIZE_TABLE;

    WindowAlign eAlign = WINDOWALIGN_TOP;
    if(GetToolBox().IsHorizontal())
        eAlign = WINDOWALIGN_LEFT;
    SwPopupWindowTbxMgr *pWin = new SwPopupWindowTbxMgr( GetId(),
                                    eAlign,
                                    SW_RES(nWinResId),
                                    SW_RES(nTbxResId),
                                    GetBindings());
    pWin->StartPopupMode(&GetToolBox(), TRUE);
    pWin->StartSelection();
    pWin->Show();
    return pWin;

}

/**********************************************************************

**********************************************************************/



SfxPopupWindowType  SwTableOptimizeCtrl::GetPopupWindowType() const
{
    return SFX_POPUPWINDOW_ONCLICK;
}


/***********************************************************************

        $Log: not supported by cvs2svn $
        Revision 1.10  2000/09/18 16:06:01  willem.vandorp
        OpenOffice header added.

        Revision 1.9  2000/03/03 15:17:03  os
        StarView remainders removed

        Revision 1.8  1997/11/24 13:54:00  MA
        includes


      Rev 1.7   24 Nov 1997 14:54:00   MA
   includes

      Rev 1.6   03 Nov 1997 13:24:22   MA
   precomp entfernt

      Rev 1.5   24 Mar 1997 01:43:52   OS
   Alignment aussen einstellen

      Rev 1.4   23 Mar 1997 23:54:26   OS
   ToolBoxAlign statt ToolBoxControl uebergeben

      Rev 1.3   29 Jan 1997 14:52:24   OM
   Draw-Toolboxen ins Svx verschoben

      Rev 1.2   14 Nov 1996 15:40:48   TRI
   includes

      Rev 1.1   11 Nov 1996 11:15:14   MA
   ResMgr

      Rev 1.0   08 Nov 1996 13:39:36   OS
   Initial revision.


***********************************************************************/


























diff --git a/sw/source/ui/ribbar/tblctrl.hrc b/sw/source/ui/ribbar/tblctrl.hrc
new file mode 100644
index 0000000..83e06af
--- /dev/null
+++ b/sw/source/ui/ribbar/tblctrl.hrc
@@ -0,0 +1,69 @@
/*************************************************************************
 *
 *  $RCSfile: tblctrl.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:46 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _TBLCTRL_HRC
#define _TBLCTRL_HRC
#include "ribbar.hrc"

#define TBX_OPTIMIZE_TABLE  1

#endif


diff --git a/sw/source/ui/ribbar/tblctrl.src b/sw/source/ui/ribbar/tblctrl.src
new file mode 100644
index 0000000..2a1fb1d
--- /dev/null
+++ b/sw/source/ui/ribbar/tblctrl.src
@@ -0,0 +1,123 @@
/*************************************************************************
 *
 *  $RCSfile: tblctrl.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:46 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "tblctrl.hrc"
#include "helpid.h"
#include "cmdid.h"
#define IMAGE_STDBTN_COLOR Color { Red = 0xC000; Green = 0xC000; Blue = 0xC000; }
FloatingWindow RID_TBL_OPT_CTRL
{
    Moveable = TRUE ;
    Closeable = TRUE ;
    Hide = TRUE ;
    SVLook = TRUE ;
    HelpID = HID_TBL_OPT_CTRL ;
    Text = "Optimieren" ;
    Text [ English ] = "Optimieren" ;
    ToolBox TBX_OPTIMIZE_TABLE
    {
        MenuStrings = TRUE ;
        SVLook = TRUE ;
        HelpID = 1 ;
        ItemList =
        {
            ToolBoxItem
            {
                Identifier = FN_TABLE_BALANCE_CELLS ;
                HelpID = FN_TABLE_BALANCE_CELLS ;
            };
            ToolBoxItem
            {
                Identifier = FN_TABLE_BALANCE_ROWS ;
                HelpID = FN_TABLE_BALANCE_ROWS ;
            };
            ToolBoxItem
            {
                Identifier = FN_TABLE_OPTIMAL_HEIGHT ;
                HelpID = FN_TABLE_OPTIMAL_HEIGHT ;
            };
            ToolBoxItem
            {
                Identifier = FN_TABLE_ADJUST_CELLS ;
                HelpID = FN_TABLE_ADJUST_CELLS ;
            };
        };
    };
    Text [ english_us ] = "Optimize" ;
    Text [ italian ] = "Ottimizza" ;
    Text [ spanish ] = "Optimar" ;
    Text [ french ] = "Optimiser" ;
    Text [ dutch ] = "Optimaliseren" ;
    Text [ swedish ] = "Optimera" ;
    Text [ danish ] = "Optimer" ;
    Text [ portuguese_brazilian ] = "Optimieren" ;
    Text [ portuguese ] = "Optimizar" ;
    Text[ chinese_simplified ] = "×î¼Ñ»¯";
    Text[ russian ] = "Îïòèìèçèðîâàòü";
    Text[ polish ] = "Optymalizuj";
    Text[ japanese ] = "Å“K‰»‚·‚é";
    Text[ chinese_traditional ] = "³ÌÓì¤Æ";
    Text[ arabic ] = "ÇáÔßá ÇáÃãËá";
    Text[ greek ] = "Âåëôéóôïðïßçóç";
    Text[ korean ] = "ÃÖÀûÈ­";
    Text[ turkish ] = "Optimize et";
    Text[ language_user1 ] = " ";
};
diff --git a/sw/source/ui/ribbar/tbxanchr.cxx b/sw/source/ui/ribbar/tbxanchr.cxx
new file mode 100644
index 0000000..c981b55
--- /dev/null
+++ b/sw/source/ui/ribbar/tbxanchr.cxx
@@ -0,0 +1,240 @@
/*************************************************************************
 *
 *  $RCSfile: tbxanchr.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:46 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include <string> // HACK: prevent conflict between STLPORT and Workshop headers

#ifndef _SV_TIMER_HXX //autogen
#include <vcl/timer.hxx>
#endif

#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif
#ifndef _SVX_HTMLMODE_HXX //autogen
#include <svx/htmlmode.hxx>
#endif
#ifndef _SFXINTITEM_HXX //autogen
#include <svtools/intitem.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _TOOLBOX_HXX //autogen
#include <vcl/toolbox.hxx>
#endif
#ifndef _SFXMNUMGR_HXX //autogen
#include <sfx2/mnumgr.hxx>
#endif


#include "cmdid.h"
#include "docsh.hxx"
#include "swtypes.hxx"
#include "swmodule.hxx"
#include "wrtsh.hxx"
#include "view.hxx"
#include "viewopt.hxx"
#include "errhdl.hxx"
#include "ribbar.hrc"
#include "tbxanchr.hxx"



SFX_IMPL_TOOLBOX_CONTROL(SwTbxAnchor, SfxUInt16Item);

/******************************************************************************
 *  Beschreibung:
 ******************************************************************************/

SwTbxAnchor::SwTbxAnchor(USHORT nId, ToolBox& rTbx, SfxBindings& rBind) :
    SfxToolBoxControl(nId, rTbx, rBind),
    nActAnchorId(0)
{
}

/******************************************************************************
 *  Beschreibung:
 ******************************************************************************/

 SwTbxAnchor::~SwTbxAnchor()
{
}

/******************************************************************************
 *  Beschreibung:
 ******************************************************************************/

void  SwTbxAnchor::StateChanged( USHORT nSID, SfxItemState eState, const SfxPoolItem* pState )
{
    GetToolBox().EnableItem( GetId(), (GetItemState(pState) != SFX_ITEM_DISABLED) );

    if( eState == SFX_ITEM_AVAILABLE )
    {
        const SfxUInt16Item* pItem = PTR_CAST( SfxUInt16Item, pState );
        if(pItem)
            nActAnchorId = pItem->GetValue();
    }

}

/******************************************************************************
 *  Beschreibung:
 ******************************************************************************/

void  SwTbxAnchor::Click()
{
    PopupMenu aPopMenu(SW_RES(MN_ANCHOR_POPUP));

    SwView* pView = ::GetActiveView();
    SwWrtShell* pWrtShell = pView->GetWrtShellPtr();
    aPopMenu.EnableItem( FN_TOOL_ANKER_FRAME, 0 != pWrtShell->IsFlyInFly() );

    Rectangle aRect(GetToolBox().GetItemRect(FN_TOOL_ANKER));
    USHORT nHtmlMode = ::GetHtmlMode((SwDocShell*)SfxObjectShell::Current());
    BOOL bHtmlModeNoAnchor = ( nHtmlMode & HTMLMODE_ON) && 0 == (nHtmlMode & HTMLMODE_SOME_ABS_POS);

    if (bHtmlModeNoAnchor || pWrtShell->IsInHeaderFooter())
        aPopMenu.RemoveItem(aPopMenu.GetItemPos(FN_TOOL_ANKER_PAGE));

    if (!pWrtShell->IsFrmSelected())
        aPopMenu.RemoveItem(aPopMenu.GetItemPos(FN_TOOL_ANKER_AT_CHAR));

    if (nActAnchorId)
        aPopMenu.CheckItem(nActAnchorId);


    USHORT nSlotId = aPopMenu.Execute(&GetToolBox(), aRect.BottomLeft());
    GetToolBox().EndSelection();

    if (nSlotId)
        pView->GetViewFrame()->GetDispatcher()->Execute(nSlotId, SFX_CALLMODE_ASYNCHRON|SFX_CALLMODE_RECORD);
}

/***********************************************************************

        $Log: not supported by cvs2svn $
        Revision 1.18  2000/09/18 16:06:02  willem.vandorp
        OpenOffice header added.

        Revision 1.17  2000/09/07 15:59:27  os
        change: SFX_DISPATCHER/SFX_BINDINGS removed

        Revision 1.16  2000/05/24 12:36:18  hr
        conflict between STLPORT and Workshop header

        Revision 1.15  2000/02/11 14:56:54  hr
        #70473# changes for unicode ( patched by automated patchtool )

        Revision 1.14  1999/07/02 11:22:28  OS
        #64782# anchor type page in hader or footer disabled


      Rev 1.13   02 Jul 1999 13:22:28   OS
   #64782# anchor type page in hader or footer disabled

      Rev 1.12   24 Apr 1998 08:57:10   OS
   Seitenbindung fuer HTML-Rahmen bedingt erlauben

      Rev 1.11   31 Mar 1998 15:21:02   AMA
   Fix #47521#: IsFlyInFly liefert jetzt das Format des potentiellen Ankers

      Rev 1.10   29 Jan 1998 14:59:22   OM
   Am Zeichen verankern

      Rev 1.9   10 Dec 1997 11:38:48   TJ
   include

      Rev 1.8   28 Nov 1997 19:57:26   MA
   includes

      Rev 1.7   24 Nov 1997 14:53:58   MA
   includes

      Rev 1.6   12 Sep 1997 15:33:26   AMA
   Neu: IsFlyInFly wird gefragt, ob Verankerung am Rahmen zugelassen ist.

      Rev 1.5   29 Aug 1997 15:45:34   OS
   PopupMenu::Execute mit Window* fuer VCL

      Rev 1.4   08 Aug 1997 17:29:58   OM
   Headerfile-Umstellung

      Rev 1.3   04 Jun 1997 16:07:06   MH
   Syntax

      Rev 1.2   04 Jun 1997 12:37:22   OS
   Rahmen an Rahmen nicht in der 4.0; Segmentierung raus

      Rev 1.1   03 Mar 1997 16:41:22   OM
   Segmentiert

      Rev 1.0   03 Mar 1997 14:24:08   OM
   Initial revision.

***********************************************************************/


diff --git a/sw/source/ui/ribbar/tbxanchr.src b/sw/source/ui/ribbar/tbxanchr.src
new file mode 100644
index 0000000..90ee969
--- /dev/null
+++ b/sw/source/ui/ribbar/tbxanchr.src
@@ -0,0 +1,204 @@
/*************************************************************************
 *
 *  $RCSfile: tbxanchr.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:46 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "ribbar.hrc"
#include "cmdid.h"
Menu MN_ANCHOR_POPUP
{
    ItemList =
    {
        MenuItem
        {
            _MenuItemFlags = MIB_RADIOCHECK ;
            RadioCheck = TRUE ;
            Identifier = FN_TOOL_ANKER_PAGE ;
            Text = "Seite" ;
            Text [ ENGLISH ] = "Page" ;
            Text [ portuguese ] = "Página" ;
            Text [ english_us ] = "Page" ;
            Text [ portuguese_brazilian ] = "Seite" ;
            Text [ swedish ] = "Sida" ;
            Text [ danish ] = "Side" ;
            Text [ italian ] = "Pagina" ;
            Text [ spanish ] = "Página" ;
            Text [ french ] = "À la page" ;
            Text [ dutch ] = "Pagina" ;
            Text[ chinese_simplified ] = "ҳ";
            Text[ russian ] = "Ñòðàíèöà";
            Text[ polish ] = "Strona";
            Text[ japanese ] = "Íß°¼Þ";
            Text[ chinese_traditional ] = "­¶";
            Text[ arabic ] = "ÕÝÍÉ";
            Text[ greek ] = "Óåëßäá";
            Text[ korean ] = "ÆäÀÌÁö";
            Text[ turkish ] = "Sayfa";
            Text[ language_user1 ] = " ";
        };
        MenuItem
        {
            _MenuItemFlags = MIB_RADIOCHECK ;
            RadioCheck = TRUE ;
            Identifier = FN_TOOL_ANKER_PARAGRAPH ;
            Text = "Absatz" ;
            Text [ ENGLISH ] = "Paragraph" ;
            Text [ portuguese ] = "Parágrafo" ;
            Text [ english_us ] = "Paragraph" ;
            Text [ portuguese_brazilian ] = "Absatz" ;
            Text [ swedish ] = "Stycke" ;
            Text [ danish ] = "Afsnit" ;
            Text [ italian ] = "Paragrafo" ;
            Text [ spanish ] = "Párrafo" ;
            Text [ french ] = "Paragraphe" ;
            Text [ dutch ] = "Alinea" ;
            Text[ chinese_simplified ] = "¶ÎÂä";
            Text[ russian ] = "Àáçàö";
            Text[ polish ] = "Akapit";
            Text[ japanese ] = "’i—Ž";
            Text[ chinese_traditional ] = "¬q¸¨";
            Text[ arabic ] = "ÝÞÑÉ";
            Text[ greek ] = "ÐáñÜãñáöïò";
            Text[ korean ] = "´Ü¶ô";
            Text[ turkish ] = "Paragrafa";
            Text[ language_user1 ] = " ";
        };
        MenuItem
        {
            _MenuItemFlags = MIB_RADIOCHECK ;
            RadioCheck = TRUE ;
            Identifier = FN_TOOL_ANKER_AT_CHAR ;
            Text = "Am Zeichen" ;
            Text [ ENGLISH ] = "At character" ;
            Text [ english_us ] = "At Character" ;
            Text [ portuguese_brazilian ] = "Am Zeichen" ;
            Text [ swedish ] = "Vid tecken" ;
            Text [ danish ] = "Til tegn" ;
            Text [ italian ] = "Al carattere" ;
            Text [ spanish ] = "Al carácter" ;
            Text [ french ] = "Au caractère" ;
            Text [ dutch ] = "Aan teken" ;
            Text [ portuguese ] = "No carácter" ;
            Text[ chinese_simplified ] = "ÔÚ×Ö·ûÉÏ";
            Text[ russian ] = "Ê çíàêó";
            Text[ polish ] = "Przy znaku";
            Text[ japanese ] = "•¶Žš‚É";
            Text[ chinese_traditional ] = "¦b¦r¤¸¤W";
            Text[ arabic ] = "Úáì ÇáÍÑÝ";
            Text[ greek ] = "Ùò ÷áñáêôÞñáò";
            Text[ korean ] = "¹®ÀÚ¿¡";
            Text[ turkish ] = "Karaktere";
            Text[ language_user1 ] = " ";
        };
        MenuItem
        {
            _MenuItemFlags = MIB_RADIOCHECK ;
            RadioCheck = TRUE ;
            Identifier = FN_TOOL_ANKER_CHAR ;
            Text = "Als Zeichen" ;
            Text [ ENGLISH ] = "Like a character" ;
            Text [ portuguese ] = "Como carácter" ;
            Text [ english_us ] = "As Character" ;
            Text [ portuguese_brazilian ] = "Zeichen" ;
            Text [ swedish ] = "Som tecken" ;
            Text [ danish ] = "Som tegn" ;
            Text [ italian ] = "Quale carattere" ;
            Text [ spanish ] = "Como carácter" ;
            Text [ french ] = "Comme caractère" ;
            Text [ dutch ] = "Als teken" ;
            Text[ chinese_simplified ] = "µ±×÷×Ö·û";
            Text[ russian ] = "Êàê çíàê";
            Text[ polish ] = "Jako znak";
            Text[ japanese ] = "•¶Žš‚Æ‚µ‚Ä";
            Text[ chinese_traditional ] = "·í§@¦r¤¸";
            Text[ arabic ] = "ßÍÑÝ";
            Text[ greek ] = "Ùò ÷áñáêôÞñáò";
            Text[ korean ] = "¹®ÀÚ·Î";
            Text[ turkish ] = "Karakter olarak";
            Text[ language_user1 ] = " ";
        };
        MenuItem
        {
            _MenuItemFlags = MIB_RADIOCHECK ;
            RadioCheck = TRUE ;
            Identifier = FN_TOOL_ANKER_FRAME ;
            Text = "Rahmen" ;
            Text [ ENGLISH ] = "Frame" ;
            Text [ portuguese ] = "Moldura" ;
            Text [ english_us ] = "Frame" ;
            Text [ portuguese_brazilian ] = "Rahmen" ;
            Text [ swedish ] = "Ram" ;
            Text [ danish ] = "Ramme" ;
            Text [ italian ] = "Cornice" ;
            Text [ spanish ] = "Marco" ;
            Text [ french ] = "Cadre" ;
            Text [ dutch ] = "Kader" ;
            Text[ chinese_simplified ] = "¿ò";
            Text[ russian ] = "Ðàìêà";
            Text[ polish ] = "Ramka";
            Text[ japanese ] = "˜g";
            Text[ chinese_traditional ] = "¤å¦r¤è¶ô";
            Text[ arabic ] = "ÅØÇÑ";
            Text[ greek ] = "Ðåñßãñáììá";
            Text[ korean ] = "ÇÁ·¹ÀÓ";
            Text[ turkish ] = "Çerçeve";
            Text[ language_user1 ] = " ";
        };
    };
};
diff --git a/sw/source/ui/ribbar/tbxmgr.cxx b/sw/source/ui/ribbar/tbxmgr.cxx
new file mode 100644
index 0000000..bf7b2cc
--- /dev/null
+++ b/sw/source/ui/ribbar/tbxmgr.cxx
@@ -0,0 +1,304 @@
/*************************************************************************
 *
 *  $RCSfile: tbxmgr.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:46 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "cmdid.h"
#include "swtypes.hxx"          // nur wegen aEmptyString??
#include "errhdl.hxx"
#include "wdocsh.hxx"
#include "tbxmgr.hxx"


/*************************************************************************
|*
|*
|*
\************************************************************************/

SwPopupWindowTbxMgr::SwPopupWindowTbxMgr( USHORT nId, WindowAlign eAlign,
                      ResId aRIdWin, ResId aRIdTbx,
                      SfxBindings& rBindings ) :
                SvxPopupWindowTbxMgr( nId, eAlign, aRIdWin, aRIdTbx, rBindings),
                bWeb(FALSE),
                aRIdWinTemp(aRIdWin),
                aRIdTbxTemp(aRIdTbx)
{
    SfxObjectShell* pObjShell = SfxObjectShell::Current();
    if(PTR_CAST(SwWebDocShell, pObjShell))
    {
        bWeb = TRUE;
        ToolBox& rTbx = GetTbxMgr().GetToolBox();
        // jetzt muessen ein paar Items aus der Toolbox versteckt werden:
        switch(nId)
        {
            case FN_INSERT_CTRL:
                rTbx.ShowItem(FN_INSERT_FRAME_INTERACT_NOCOL);
                rTbx.HideItem(FN_INSERT_FRAME_INTERACT);
                rTbx.HideItem(FN_INSERT_FOOTNOTE);
                rTbx.HideItem(FN_INSERT_ENDNOTE);
                rTbx.HideItem(FN_PAGE_STYLE_SET_COLS);
                rTbx.HideItem(FN_INSERT_IDX_ENTRY_DLG);

            break;
            case FN_INSERT_FIELD_CTRL:
                rTbx.HideItem(FN_INSERT_FLD_PGNUMBER);
                rTbx.HideItem(FN_INSERT_FLD_PGCOUNT);
                rTbx.HideItem(FN_INSERT_FLD_TOPIC);
                rTbx.HideItem(FN_INSERT_FLD_TITLE);
            break;
        }
    }
    else if( FN_INSERT_CTRL == nId)
    {
        ToolBox& rTbx = GetTbxMgr().GetToolBox();
        rTbx.ShowItem(FN_INSERT_FRAME_INTERACT);
        rTbx.HideItem(FN_INSERT_FRAME_INTERACT_NOCOL);
    }

    Size aSize = GetTbxMgr().CalcWindowSizePixel();
    GetTbxMgr().SetPosSizePixel( Point(), aSize );
    SetOutputSizePixel( aSize );
}

/*************************************************************************
|*
|*
|*
\************************************************************************/

void SwPopupWindowTbxMgr::StateChanged(USHORT nSID, SfxItemState eState,
                                                    const SfxPoolItem* pState)
{
    static USHORT __READONLY_DATA aInsertCtrl[] =
    {
        FN_INSERT_FRAME_INTERACT,
        FN_INSERT_FOOTNOTE,
        FN_INSERT_ENDNOTE,
        FN_PAGE_STYLE_SET_COLS,
        FN_INSERT_IDX_ENTRY_DLG,
        0
    };
    static USHORT __READONLY_DATA aInsertFld[] =
    {
        FN_INSERT_FLD_PGNUMBER,
        FN_INSERT_FLD_PGCOUNT,
        FN_INSERT_FLD_TOPIC,
        FN_INSERT_FLD_TITLE,
        0
    };

    SfxObjectShell* pObjShell = SfxObjectShell::Current();
    BOOL bNewWeb = 0 != PTR_CAST(SwWebDocShell, pObjShell);
    if(bWeb != bNewWeb)
    {
        bWeb = bNewWeb;
        ToolBox& rTbx = GetTbxMgr().GetToolBox();
        // jetzt muessen ein paar Items aus der Toolbox versteckt werden:
        const USHORT* pSid = 0;

        switch(nSID)
        {
            case FN_INSERT_CTRL:
            pSid = &aInsertCtrl[0];
                if(bWeb)
                    rTbx.ShowItem(FN_INSERT_FRAME_INTERACT_NOCOL);
                else
                    rTbx.HideItem(FN_INSERT_FRAME_INTERACT_NOCOL);
            break;
            case FN_INSERT_FIELD_CTRL:
                pSid = & aInsertFld[0];
            break;
        }
        if(pSid)
        {
            if(bWeb)
                while(*pSid)
                {
                    rTbx.HideItem(*pSid);
                    pSid++;
                }
            else
                while(*pSid)
                {
                    rTbx.ShowItem(*pSid);
                    pSid++;
                }
            Size aSize = GetTbxMgr().CalcWindowSizePixel();
            GetTbxMgr().SetPosSizePixel( Point(), aSize );
            SetOutputSizePixel( aSize );
        }
    }
    SfxPopupWindow::StateChanged(nSID, eState, pState);
}


SfxPopupWindow* SwPopupWindowTbxMgr::Clone() const
{
    return new SwPopupWindowTbxMgr(
            GetId(),
            ((SwPopupWindowTbxMgr*)this)->GetTbxMgr().GetToolBox().GetAlign(),
            aRIdWinTemp,
            aRIdTbxTemp,
            (SfxBindings&)GetBindings()
            );
}

/***********************************************************************

        $Log: not supported by cvs2svn $
        Revision 1.10  2000/09/18 16:06:02  willem.vandorp
        OpenOffice header added.

        Revision 1.9  2000/06/20 14:48:39  os
        #70060# less occurences of columns in HTML

        Revision 1.8  2000/03/03 15:17:03  os
        StarView remainders removed

        Revision 1.7  1999/02/12 07:21:26  OS
        #61547# InsertEndnote in der Wz.Leiste


      Rev 1.6   12 Feb 1999 08:21:26   OS
   #61547# InsertEndnote in der Wz.Leiste

      Rev 1.5   06 Apr 1998 09:57:30   OS
   INSERT_FRAME_INTERACT fuer HTML wieder erlaubt

      Rev 1.4   24 Nov 1997 14:53:58   MA
   includes

      Rev 1.3   03 Nov 1997 13:24:20   MA
   precomp entfernt

      Rev 1.2   23 Mar 1997 23:54:26   OS
   ToolBoxAlign statt ToolBoxControl uebergeben

      Rev 1.1   29 Jan 1997 17:16:36   NF
   includes...

      Rev 1.0   29 Jan 1997 14:51:48   OM
   Initial revision.

      Rev 1.36   28 Jan 1997 16:29:50   OS
   Anpassung der ToolBox an die DocShell

      Rev 1.35   15 Jan 1997 11:32:52   OM
   Bezier-Controller entfernt

      Rev 1.34   11 Dec 1996 12:33:46   OM
   Bezier-Controller

      Rev 1.33   30 Nov 1996 14:07:24   OS
   SID_OBJECT_ALIGN: dieser Controller tauscht die Images nicht aus!

      Rev 1.32   25 Nov 1996 10:56:50   OS
   SwPopupWindowTbx entfernt

      Rev 1.31   23 Nov 1996 12:41:26   OS
   StateChanged fuer ...TbxMgr

      Rev 1.30   14 Nov 1996 10:22:50   TRI
   includes

      Rev 1.29   13 Nov 1996 15:30:08   OS
   RegisterToolBox nur noch fuer ..OUTSTYLE

      Rev 1.28   12 Nov 1996 10:20:32   OS
   Image an der Toolbox kann nur der Toolboxmgr selbst setzen

      Rev 1.27   22 Oct 1996 10:47:38   OS
   Image an der Toolbox austauschen

      Rev 1.26   18 Oct 1996 08:52:02   OS
   Alignment berichtigt

      Rev 1.25   14 Oct 1996 13:38:26   OS
   UseDefault statt Initialize am SfxToolBoxManager

      Rev 1.24   10 Oct 1996 10:37:14   OS
   Registrierung der Toolbox am SfxImageManager

      Rev 1.23   26 Sep 1996 08:17:24   OS
   Execute am Dispatcher mit OL abschliessen

      Rev 1.22   23 Sep 1996 14:44:00   OS
   Slot fuer ToolboxItem auch im SelectHdl rufen

      Rev 1.21   19 Sep 1996 19:40:04   HJS
   fehlende includes

      Rev 1.20   19 Sep 1996 16:05:14   OS
   neu: SwPopupWindowTbxMgr

      Rev 1.19   28 Aug 1996 13:39:28   OS
   includes

      Rev 1.18   29 Jul 1996 15:16:04   OS
   Clone impl.

***********************************************************************/

diff --git a/sw/source/ui/ribbar/workctrl.cxx b/sw/source/ui/ribbar/workctrl.cxx
new file mode 100644
index 0000000..c0c4eb9
--- /dev/null
+++ b/sw/source/ui/ribbar/workctrl.cxx
@@ -0,0 +1,838 @@
/*************************************************************************
 *
 *  $RCSfile: workctrl.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:46 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include <string> // HACK: prevent conflict between STLPORT and Workshop headers

#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SVX_HTMLMODE_HXX //autogen
#include <svx/htmlmode.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SFX_BINDINGS_HXX //autogen
#include <sfx2/bindings.hxx>
#endif


#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _INITUI_HXX
#include <initui.hxx>
#endif
#ifndef _VIEWOPT_HXX
#include <viewopt.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _GLOSHDL_HXX
#include <gloshdl.hxx>
#endif
#ifndef _GLOSSARY_HXX
#include <glossary.hxx>
#endif
#ifndef _GLOSDOC_HXX
#include <glosdoc.hxx>
#endif
#ifndef _GLOSLST_HXX
#include <gloslst.hxx>
#endif
#ifndef _TBXMGR_HXX
#include <tbxmgr.hxx>
#endif
#ifndef _WORKCTRL_HXX
#include <workctrl.hxx>
#endif
#ifndef _WORKCTRL_HRC
#include <workctrl.hrc>
#endif
#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _HELPID_H
#include <helpid.h>
#endif
#ifndef _WRTSH_HXX //autogen
#include <wrtsh.hxx>
#endif


//JP 14.01.99: Size Abpruefung
#define NAVI_ENTRIES 20
#if NAVI_ENTRIES != NID_COUNT
#error SwScrollNaviPopup-CTOR static Array falsche Size. Wurden neue IDs zugefuegt ??
#endif


SFX_IMPL_TOOLBOX_CONTROL( SwTbxInsertCtrl, SfxUInt16Item);
SFX_IMPL_TOOLBOX_CONTROL( SwTbxAutoTextCtrl, SfxBoolItem );

/**********************************************************************

**********************************************************************/



SwTbxInsertCtrl::SwTbxInsertCtrl( USHORT nId,
                                    ToolBox& rTbx,
                                    SfxBindings& rBind ) :
        SfxToolBoxControl( nId, rTbx, rBind ),
        nLastSlotId(0)
{
}
/**********************************************************************

**********************************************************************/


SwTbxInsertCtrl::~SwTbxInsertCtrl()
{
}

/**********************************************************************

**********************************************************************/


void SwTbxInsertCtrl::StateChanged( USHORT nSID,
                                      SfxItemState eState,
                                      const SfxPoolItem* pState )
{
    USHORT nId = GetId();
    GetToolBox().EnableItem( nId, (GetItemState(pState) != SFX_ITEM_DISABLED) );

    if( eState == SFX_ITEM_AVAILABLE )
    {
        const SfxUInt16Item* pItem = PTR_CAST( SfxUInt16Item, pState );
        if(pItem)
        {
            nLastSlotId = pItem->GetValue();
            if( nLastSlotId )
                nId = nLastSlotId;
            Image aImage = SFX_IMAGEMANAGER()->GetImage( nId, SW_MOD() );
            GetToolBox().SetItemImage(GetId(), aImage);
        }
    }

}
/**********************************************************************

**********************************************************************/


SfxPopupWindow* SwTbxInsertCtrl::CreatePopupWindow()
{
    USHORT nWinResId, nTbxResId;
    if(GetId() == FN_INSERT_CTRL)
    {
        nWinResId = RID_INSERT_CTRL;
        nTbxResId = TBX_INSERT;
    }
    else /* FN_INSERT_OBJ_CTRL */
    {
        nWinResId = RID_INSERT_OBJ_CTRL;
        nTbxResId = TBX_OBJ_INSERT;
    }

    WindowAlign eAlign = WINDOWALIGN_TOP;
    if(GetToolBox().IsHorizontal())
        eAlign = WINDOWALIGN_LEFT;
    SwPopupWindowTbxMgr *pWin = new SwPopupWindowTbxMgr( GetId(),
                                    eAlign,
                                    SW_RES(nWinResId),
                                    SW_RES(nTbxResId),
                                    GetBindings());

    pWin->StartPopupMode(&GetToolBox(), TRUE);
    pWin->StartSelection();
    pWin->Show();
    return pWin;

}

/**********************************************************************

**********************************************************************/


SfxPopupWindowType  SwTbxInsertCtrl::GetPopupWindowType() const
{
    return nLastSlotId ? SFX_POPUPWINDOW_ONTIMEOUT : SFX_POPUPWINDOW_ONCLICK;
}


/**********************************************************************

**********************************************************************/


void SwTbxInsertCtrl::Select( BOOL bMod1 )
{
    if(nLastSlotId)
        SfxViewFrame::Current()->GetDispatcher()->Execute(nLastSlotId);
}

/**********************************************************************

**********************************************************************/


SwTbxAutoTextCtrl::SwTbxAutoTextCtrl( USHORT nId,
                                    ToolBox& rTbx,
                                    SfxBindings& rBind ) :
    SfxToolBoxControl( nId, rTbx, rBind ),
    pView(0),
    pPopup(0)
{
}
/**********************************************************************

**********************************************************************/


SwTbxAutoTextCtrl::~SwTbxAutoTextCtrl()
{
    DelPopup();
}

/**********************************************************************

**********************************************************************/


SfxPopupWindow* SwTbxAutoTextCtrl::CreatePopupWindow()
{
    pView = ::GetActiveView();
    if(pView && !pView->GetDocShell()->IsReadOnly() &&
       !pView->GetWrtShell().HasReadonlySel() )
    {
        ToolBox& rBox = GetToolBox();
        Point aPt(rBox.OutputToScreenPixel(rBox.GetPointerPosPixel()));
        if(pView)
        {
            Link aLnk = LINK(this, SwTbxAutoTextCtrl, PopupHdl);

            if (GetId() == FN_INSERT_FIELD_CTRL)
            {
                pPopup = new PopupMenu(SW_RES(RID_INSERT_FIELD_CTRL));
                pPopup->SetSelectHdl(aLnk);

                if (::GetHtmlMode(pView->GetDocShell()) & HTMLMODE_ON)
                {
                    pPopup->RemoveItem(pPopup->GetItemPos(FN_INSERT_FLD_PGCOUNT));
                    pPopup->RemoveItem(pPopup->GetItemPos(FN_INSERT_FLD_TOPIC));
                }
            }
            else
            {
                pPopup = new PopupMenu;
                SwGlossaryList* pGlossaryList = ::GetGlossaryList();
                USHORT nGroupCount = pGlossaryList->GetGroupCount();
                for(USHORT i = 1; i <= nGroupCount; i++)
                {
                    // Gruppenname mit Pfad-Extension besorgen
                    String sTitle;
                    String sGroupName = pGlossaryList->GetGroupName(i - 1, FALSE, &sTitle);
                    USHORT nBlockCount = pGlossaryList->GetBlockCount(i -1);
                    if(nBlockCount)
                    {
                        USHORT nIndex = 100 * (i);
                        // aber ohne extension einfuegen
                        pPopup->InsertItem( i, sTitle);//sGroupName.GetToken(0, GLOS_DELIM));
                        PopupMenu* pSub = new PopupMenu;
                        pSub->SetSelectHdl(aLnk);
                        pPopup->SetPopupMenu(i, pSub);
                        for(USHORT j = 0; j < nBlockCount; j++)
                        {
                            String sEntry;
                            String sLongName(pGlossaryList->GetBlockName(i - 1, j, sEntry));
                            sEntry.AppendAscii(" - ");
                            sEntry += sLongName;
                            pSub->InsertItem(++nIndex, sEntry);
                        }
                    }
                }
            }
        }
        ToolBox* pToolBox = &GetToolBox();
        USHORT nId = GetId();
        pToolBox->SetItemDown( nId, TRUE );
        pPopup->Execute( pToolBox, pToolBox->ScreenToOutputPixel( aPt ) );
        pToolBox->SetItemDown( nId, FALSE );
    }
    GetToolBox().EndSelection();
    DelPopup();
    return 0;

}


/**********************************************************************

**********************************************************************/


SfxPopupWindowType SwTbxAutoTextCtrl::GetPopupWindowType() const
{
    return SFX_POPUPWINDOW_ONTIMEOUT;
}

/**********************************************************************

**********************************************************************/


void SwTbxAutoTextCtrl::StateChanged( USHORT nSID,
                                              SfxItemState eState,
                                              const SfxPoolItem* pState )
{
    GetToolBox().EnableItem( GetId(), (GetItemState(pState) != SFX_ITEM_DISABLED) );
    if(FN_INSERT_FIELD_CTRL == nSID && eState >= SFX_ITEM_DEFAULT)
    {
        GetToolBox().CheckItem( GetId(), ((SfxBoolItem*)pState)->GetValue() );
    }
}

/**********************************************************************

**********************************************************************/


IMPL_LINK(SwTbxAutoTextCtrl, PopupHdl, PopupMenu*, pMenu)
{
    int nId = pMenu->GetCurItemId();

    if (GetId() == FN_INSERT_FIELD_CTRL)
    {
        SfxViewFrame::Current()->GetDispatcher()->Execute(nId);
    }
    else
    {
        USHORT nBlock = nId/100;

        SwGlossaryList* pGlossaryList = ::GetGlossaryList();
        String sShortName;
        String sGroup = pGlossaryList->GetGroupName(nBlock - 1, FALSE);
        String sLongName(pGlossaryList->GetBlockName(nBlock - 1, nId - (100 * nBlock) - 1, sShortName));

        SwGlossaryHdl* pGlosHdl = pView->GetGlosHdl();
        SwGlossaryDlg::SetActGroup(sGroup);
        pGlosHdl->SetCurGroup(sGroup, TRUE);
        pGlosHdl->InsertGlossary(sShortName);
    }
    return 0;
}

/**********************************************************************

**********************************************************************/


void SwTbxAutoTextCtrl::DelPopup()
{
    if(pPopup)
    {
        if (GetId() != FN_INSERT_FIELD_CTRL)
        {
            for( USHORT i = 0; i < pPopup->GetItemCount(); i ++ )
            {
                PopupMenu* pSubPopup = pPopup->GetPopupMenu(pPopup->GetItemId(i));
                delete pSubPopup;
            }
        }
        delete pPopup;
        pPopup = 0;
    }
}

/*-----------------19.02.97 10.52-------------------
    Navigations-Popup
--------------------------------------------------*/

SwScrollNaviPopup::SwScrollNaviPopup( USHORT nId,
                                const ResId &rId,
                                SfxBindings & rBnd)
    : SfxPopupWindow(nId, rId, rBnd),
    aVSet(this, WB_NAMEFIELD),
    aIList(ResId(IL_VALUES)),
    rResId(rId),
    nFwdId(FN_START_OF_NEXT_PAGE),
    nBackId(FN_START_OF_PREV_PAGE)
{
    aVSet.SetHelpId(HID_NAVI_VS);
    // die Konvertierungstabelle legt die Reihenfolge fest
    static USHORT __READONLY_DATA aInsert[ NAVI_ENTRIES ] =
    {
        // -- erste Zeile
        NID_TBL,
        NID_FRM,
        NID_GRF,
        NID_OLE,
        NID_PGE,
        NID_OUTL,
        NID_MARK,
        NID_DRW,
        NID_CTRL,
        // -- zweite Zeile
        NID_REG,
        NID_BKM,
        NID_SEL,
        NID_FTN,
        NID_POSTIT,
        NID_SRCH_REP,
        NID_INDEX_ENTRY,
        NID_TABLE_FORMULA,
        NID_TABLE_FORMULA_ERROR
    };

    aVSet.SetLineCount( 2 );
    aVSet.SetColCount(NID_COUNT / 2 - 1);
    for(USHORT i = 0; i < NID_COUNT - 2; i++)
    {
        USHORT nId = aInsert[i];
        aVSet.InsertItem(nId, aIList.GetImage(nId));
        // -2, weil es fuer Next/Prev keinen String gibt
        USHORT nResStr = ST_TBL - 2 + nId - NID_START;
        aVSet.SetItemText(nId, ResId(nResStr));
    }
    // erst hier!
    FreeResource();

    // diese Strings sind global
    for( i = 0; i < 2 * NID_COUNT; i++)
    {
        sQuickHelp[i] = String(SW_RES(STR_IMGBTN_START + i));
    }

    Size aImgSize = aIList.GetImageSize();
    aImgSize.Width() += 5;
    aImgSize.Height() += 5;
    Size aSz = aVSet.CalcWindowSizePixel(aImgSize, aVSet.GetItemCount() / 2, 2);
    aVSet.SetPosSizePixel( Point(), aSz );
    SetOutputSizePixel(aSz);
    aVSet.SetSelectHdl(LINK(this, SwScrollNaviPopup, SelectHdl));
    aVSet.StartSelection();
    aVSet.Show();
    SetBackground(Wallpaper(Color(COL_WHITE)));
}
/*-----------------19.02.97 12.45-------------------

--------------------------------------------------*/

SwScrollNaviPopup::~SwScrollNaviPopup()
{
}
/*-----------------19.02.97 13.58-------------------

--------------------------------------------------*/

SfxPopupWindow* SwScrollNaviPopup::Clone() const
{
    return new SwScrollNaviPopup(GetId(), rResId, ( SfxBindings & ) GetBindings());
}

/*-----------------19.02.97 14.10-------------------

--------------------------------------------------*/

IMPL_LINK(SwScrollNaviPopup, SelectHdl, ValueSet*, pSet)
{
    USHORT nSet = pSet->GetSelectItemId();
    if( nSet != NID_PREV && nSet != NID_NEXT )
    {
        SwView::SetMoveType(nSet);
        aVSet.SetItemText(NID_NEXT, sQuickHelp[nSet - NID_START]);
        aVSet.SetItemText(NID_PREV, sQuickHelp[nSet - NID_START + NID_COUNT]);
    }
    else
    {
        SfxBoolItem aNext(FN_SCROLL_NEXT_PREV, NID_NEXT == nSet);
        SfxViewFrame::Current()->GetDispatcher()->
                Execute(FN_SCROLL_NEXT_PREV,SFX_CALLMODE_SYNCHRON ,&aNext, 0L);
    }
    return 0;
}
/*-----------------23.02.97 18.21-------------------

--------------------------------------------------*/

void SwScrollNaviValueSet::MouseButtonUp( const MouseEvent& rMEvt )
{
    ValueSet::MouseButtonUp(rMEvt);
    if ( ((SwScrollNaviPopup*)GetParent())->IsInPopupMode() )
        ((SwScrollNaviPopup*)GetParent())->EndPopupMode( FLOATWIN_POPUPMODEEND_CLOSEALL );
}

/*-----------------20.06.97 13:28-------------------

--------------------------------------------------*/
void  SwScrollNaviValueSet::RequestHelp( const HelpEvent& rHEvt )
{
    USHORT nMoveType = SwView::GetMoveType();
    SetItemText(NID_NEXT, SwScrollNaviPopup::GetQuickHelpText(TRUE));
    SetItemText(NID_PREV, SwScrollNaviPopup::GetQuickHelpText(FALSE));
    ValueSet::RequestHelp( rHEvt );

}
/*-----------------21.02.97 11:25-------------------

--------------------------------------------------*/

void  SwScrollNaviPopup::PopupModeEnd()
{
    if(aVSet.GetItemCount() < NID_COUNT)
    {
        aVSet.InsertItem(NID_NEXT, aIList.GetImage(NID_NEXT), NID_COUNT);
        aVSet.InsertItem(NID_PREV, aIList.GetImage(NID_PREV), NID_COUNT/2 - 1);
        USHORT nItemBits = aVSet.GetItemBits(NID_NEXT);
        nItemBits |= VIB_NODOUBLECLICK;
        aVSet.SetItemBits(NID_NEXT, nItemBits);
        aVSet.SetItemBits(NID_PREV, nItemBits);
        Size aImgSize = aIList.GetImageSize();
        aImgSize.Width() += 5;
        aImgSize.Height() += 5;
        aVSet.SetColCount(NID_COUNT/2);
        Size aSz = aVSet.CalcWindowSizePixel(aImgSize, NID_COUNT / 2, 2);
        aVSet.SetPosSizePixel( Point(), aSz );
        SetOutputSizePixel(aSz);
    }
    SfxPopupWindow::PopupModeEnd();
}

/*-----------------20.06.97 13:41-------------------

--------------------------------------------------*/
String  SwScrollNaviPopup::GetQuickHelpText(BOOL bNext)
{
    USHORT nResId = STR_IMGBTN_START;
    nResId += SwView::GetMoveType() - NID_START;
    if(!bNext)
        nResId += NID_COUNT;
    return String(SW_RES(nResId));
}


/*-----------------20.02.97 10:17-------------------

--------------------------------------------------*/

void SwNaviImageButton::MouseButtonDown( const MouseEvent& rMEvt )
{
    if(MOUSE_LEFT == rMEvt.GetButtons())
    {
        SfxBindings& rBind = SfxViewFrame::Current()->GetBindings();
        rBind.ENTERREGISTRATIONS();
        pPopup = new
            SwScrollNaviPopup(FN_SCROLL_NAVIGATION,
                            SW_RES(RID_SCROLL_NAVIGATION_WIN),
                            rBind);
        rBind.LEAVEREGISTRATIONS();
        Point aPos = OutputToScreenPixel(Point(0,0));
        Rectangle aRect(aPos, GetSizePixel());
        pPopup->StartPopupMode(aRect, FLOATWIN_POPUPMODE_LEFT|FLOATWIN_POPUPMODE_ALLOWTEAROFF);
    }
    else
        ImageButton::MouseButtonDown(rMEvt);
}
/*-----------------20.02.97 10:17-------------------

--------------------------------------------------*/

void SwNaviImageButton::MouseButtonUp( const MouseEvent& rMEvt )
{
}

/*-----------------21.02.97 09:41-------------------

--------------------------------------------------*/

void SwHlpImageButton::RequestHelp( const HelpEvent& rHEvt )
{

    SetQuickHelpText(SwScrollNaviPopup::GetQuickHelpText(!bUp));

    ImageButton::RequestHelp(rHEvt);
}

/*-----------------25.02.97 12:38-------------------

--------------------------------------------------*/

SwNaviImageButton::SwNaviImageButton(Window* pParent) :
            ImageButton(pParent, SW_RES(BTN_NAVI)), pPopup(0),
            aImage(ResId(IMG_BTN)),
            sQuickText(ResId(ST_QUICK))
{
    FreeResource();
    SetStyle(GetStyle()|WB_NOPOINTERFOCUS);
    SetQuickHelpText(sQuickText);
    SetImage(aImage);
}

/***********************************************************************

        $Log: not supported by cvs2svn $
        Revision 1.62  2000/09/18 16:06:02  willem.vandorp
        OpenOffice header added.

        Revision 1.61  2000/09/07 15:59:27  os
        change: SFX_DISPATCHER/SFX_BINDINGS removed

        Revision 1.60  2000/07/03 08:54:35  jp
        must changes for VCL

        Revision 1.59  2000/06/13 09:58:28  os
        using UCB

        Revision 1.58  2000/05/24 12:36:18  hr
        conflict between STLPORT and Workshop header

        Revision 1.57  2000/04/18 14:54:44  os
        UNICODE

        Revision 1.56  2000/03/03 15:17:03  os
        StarView remainders removed

        Revision 1.55  2000/02/10 10:37:03  os
        #70359# titles added to AutoText groups

        Revision 1.54  1999/04/01 11:58:32  OS
        #64278# Zugriff auf Gruppen und Eintraege nur noch ueber Ids


      Rev 1.53   01 Apr 1999 13:58:32   OS
   #64278# Zugriff auf Gruppen und Eintraege nur noch ueber Ids

      Rev 1.52   09 Feb 1999 10:47:44   OS
   #61205# AutoText-Gruppen koennen beliebige Namen erhalten

      Rev 1.51   05 Feb 1999 15:52:58   MA
   #61463# Kein Popup fuer Glossary in Readonly

      Rev 1.50   14 Jan 1999 15:49:58   JP
   Bug #60794#: Fehlererkennung beim Tabellenrechnen und anspringen von Formeln

      Rev 1.49   14 Jan 1999 14:18:46   JP
   Bug #60794#: Fehlererkennung beim Tabellenrechnen und anspringen von Formeln

      Rev 1.48   03 Dec 1998 10:25:20   OS
   #59441# Verzeichniseintrag in der Navigation

      Rev 1.47   03 Nov 1998 12:24:56   OS
   58830# Enter/LeaveRegistrations

      Rev 1.46   12 Oct 1998 08:46:42   OS
   #52973# GetImage() mit Module* aufrufen

      Rev 1.45   18 Aug 1998 17:28:44   OS
   GetShortName sollte auf bekannte Gruppe richtig reagieren #55219#

      Rev 1.44   15 Jun 1998 10:39:28   OS
   WB_NOPOINTERFOCUS

      Rev 1.43   15 Jun 1998 09:36:42   OS
   AutoText-Popup: Kuerzel mit angeben

      Rev 1.42   24 Feb 1998 12:10:32   OS
   Navigationstool erweitert

      Rev 1.41   18 Feb 1998 14:45:12   OS
   ItemBits an der richtigen Position setzen #46669#

      Rev 1.40   16 Feb 1998 08:03:22   OS
   VIB_NODOUBLECLICK setzen #46669#

      Rev 1.39   07 Feb 1998 11:09:16   OS
   initiale Groesse berichtigt #47144#

      Rev 1.38   20 Jan 1998 12:27:42   OS
   Next und Prev im SelectHdl ausfuehren #46669#

      Rev 1.37   28 Nov 1997 20:17:34   MA
   includes

      Rev 1.36   24 Nov 1997 14:53:58   MA
   includes

      Rev 1.35   17 Oct 1997 09:11:08   OS
   EndPopup rufen #44773#

      Rev 1.34   19 Sep 1997 12:51:24   PB
   chg: fuer VCL ToolBox::SetItemDown() eingebaut

      Rev 1.33   18 Sep 1997 13:59:46   OS
   Pointer::GetPosPixel fuer VCL ersetzt

      Rev 1.32   18 Sep 1997 13:18:08   TJ
   include

      Rev 1.31   29 Aug 1997 15:45:34   OS
   PopupMenu::Execute mit Window* fuer VCL

      Rev 1.30   29 Aug 1997 14:27:06   OS
   DLL-Umbau

      Rev 1.29   09 Jul 1997 17:36:10   HJS
   includes

      Rev 1.28   20 Jun 1997 13:52:52   OS
   Merker und Notizen in der Navigation

      Rev 1.27   07 May 1997 15:30:12   OS
   Execute mit 0L abschliessen fuer W16

      Rev 1.26   05 May 1997 12:26:24   OS
   QuickHelpText als Member, MouseButtonDwon: nur linke Taste!

      Rev 1.25   07 Apr 1997 12:36:44   OS
   HelpId fuer ValueSet

      Rev 1.24   24 Mar 1997 01:43:52   OS
   Alignment aussen einstellen

      Rev 1.23   23 Mar 1997 23:54:26   OS
   ToolBoxAlign statt ToolBoxControl uebergeben

      Rev 1.22   25 Feb 1997 13:04:24   OS
   Spruenge im MouseButtonUp

      Rev 1.21   23 Feb 1997 22:07:40   OS
   richtige Hilfetexte fuer Prev/Next-Buttons

      Rev 1.20   23 Feb 1997 19:36:52   OS
   MouseButtonDown im ValueSet erledigt die Spruenge -> kein hakliges Verhalten mehr

      Rev 1.19   22 Feb 1997 20:16:26   OS
   eigenes Image fuer Button

      Rev 1.18   21 Feb 1997 19:35:42   OS
   mit Prev/Next-Button

      Rev 1.17   21 Feb 1997 17:04:48   OS
   fast fertig

      Rev 1.16   20 Feb 1997 16:45:02   OS
   Navigation funktioniert

      Rev 1.15   19 Feb 1997 20:56:26   HJS
   auf nicht const gecastet

      Rev 1.14   19 Feb 1997 16:55:16   OS
   Popup fuer Navigation

      Rev 1.13   17 Feb 1997 10:39:42   OM
   Neue Feldbefehle im Webmode

      Rev 1.12   06 Feb 1997 14:50:26   OM
   feldbefehl Seitennummer im html-Mode erlauben

      Rev 1.11   06 Feb 1997 14:32:52   OM
   Popup-Controller fuer Feldbefehle einfuegen

      Rev 1.10   29 Jan 1997 14:52:24   OM
   Draw-Toolboxen ins Svx verschoben

      Rev 1.9   11 Nov 1996 11:15:14   MA
   ResMgr

      Rev 1.8   27 Sep 1996 16:21:26   HJS
   vertipper

      Rev 1.7   27 Sep 1996 12:56:42   OS
   PopupMenu wird bei Bedarf angelegt

      Rev 1.6   26 Sep 1996 16:57:00   OS
   Update der AutoText-Liste

      Rev 1.5   24 Sep 1996 16:45:06   OS
   View-Wechsel vor jedem Aufruf

      Rev 1.4   23 Sep 1996 13:43:46   OS
   beschleunigter Zugriff auf den GlosHdl

      Rev 1.3   23 Sep 1996 08:11:42   OS
   Menu fuer Autotexte

      Rev 1.2   20 Sep 1996 14:44:28   OS
   Zuerst kommt die Toolbox ohne Timer

      Rev 1.1   19 Sep 1996 19:40:04   HJS
   fehlende includes

      Rev 1.0   19 Sep 1996 16:02:36   OS
   Initial revision.

***********************************************************************/


diff --git a/sw/source/ui/ribbar/workctrl.hrc b/sw/source/ui/ribbar/workctrl.hrc
new file mode 100644
index 0000000..220dbc3
--- /dev/null
+++ b/sw/source/ui/ribbar/workctrl.hrc
@@ -0,0 +1,118 @@
/*************************************************************************
 *
 *  $RCSfile: workctrl.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:46 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _WORKCTRL_HRC
#define _WORKCTRL_HRC
#include "ribbar.hrc"

#define TBX_INSERT          1
#define TBX_OBJ_INSERT      2
#define TBX_FIELD_INSERT    3
#define TBX_NAVIGATION      4
#define IL_VALUES           5
#define IMG_BTN             6
#define ST_QUICK            7


#define ST_TBL          12
#define ST_FRM          13
#define ST_PGE          14
#define ST_DRW          15
#define ST_CTRL         16
#define ST_REG          17
#define ST_BKM          18
#define ST_GRF          19
#define ST_OLE          20
#define ST_OUTL         21
#define ST_SEL          22
#define ST_FTN          23
#define ST_MARK         24
#define ST_POSTIT       25
#define ST_SRCH_REP     26
#define ST_INDEX_ENTRY  27
#define ST_TABLE_FORMULA  28
#define ST_TABLE_FORMULA_ERROR  29

// doppelter Eintrag! hrc und hxx
// diese Ids bestimmen, was die Buttons unter dem Scrollbar tun
#define NID_START   20000
#define NID_NEXT    20000
#define NID_PREV    20001
#define NID_TBL     20002
#define NID_FRM     20003
#define NID_PGE     20004
#define NID_DRW     20005
#define NID_CTRL    20006
#define NID_REG     20007
#define NID_BKM     20008
#define NID_GRF     20009
#define NID_OLE     20010
#define NID_OUTL    20011
#define NID_SEL     20012
#define NID_FTN     20013
#define NID_MARK    20014
#define NID_POSTIT  20015
#define NID_SRCH_REP 20016
#define NID_INDEX_ENTRY  20017
#define NID_TABLE_FORMULA   20018
#define NID_TABLE_FORMULA_ERROR     20019
#define NID_COUNT  20

#endif
diff --git a/sw/source/ui/ribbar/workctrl.src b/sw/source/ui/ribbar/workctrl.src
new file mode 100644
index 0000000..01315ea
--- /dev/null
+++ b/sw/source/ui/ribbar/workctrl.src
@@ -0,0 +1,1936 @@
/*************************************************************************
 *
 *  $RCSfile: workctrl.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:46 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _SVXIDS_HRC
#include <svx/svxids.hrc>
#endif
#ifndef _GLOBLMN_HRC
#include <svx/globlmn.hrc>
#endif
#include "workctrl.hrc"
#include "workctrl.hrc"
#include "helpid.h"
#include "cmdid.h"
#define IMAGE_STDBTN_COLOR Color { Red = 0xC000; Green = 0xC000; Blue = 0xC000; }
FloatingWindow RID_INSERT_CTRL
{
    Moveable = TRUE ;
    Closeable = TRUE ;
    Hide = TRUE ;
    SVLook = TRUE ;
    HelpID = HID_INSERT_CTRL ;
    /* ### ACHTUNG: Neuer Text in Resource? Einfügen : Einf³gen */
    Text = "Einfügen" ;
    Text [ English ] = "Insert" ;
    ToolBox TBX_INSERT
    {
        MenuStrings = TRUE ;
        SVLook = TRUE ;
        HelpID = 1 ;
        ItemList =
        {
            ToolBoxItem
            {
                Identifier = FN_INSERT_FRAME_INTERACT_NOCOL ;
                HelpID = FN_INSERT_FRAME_INTERACT_NOCOL ;
            };
            ToolBoxItem
            {
                Identifier = FN_INSERT_FRAME_INTERACT ;
                HelpID = FN_INSERT_FRAME_INTERACT ;
                DropDown = TRUE ;
            };
            ToolBoxItem
            {
                Identifier = SID_INSERT_GRAPHIC ;
                HelpID = SID_INSERT_GRAPHIC ;
            };
            ToolBoxItem
            {
                Identifier = FN_INSERT_TABLE ;
                HelpID = FN_INSERT_TABLE ;
                DropDown = TRUE ;
            };
            ToolBoxItem
            {
                Identifier = SID_INSERTDOC ;
                HelpID = SID_INSERTDOC ;
            };
            ToolBoxItem
            {
                Identifier = FN_INSERT_FOOTNOTE ;
                HelpID = FN_INSERT_FOOTNOTE ;
            };
            ToolBoxItem
            {
                Identifier = FN_INSERT_ENDNOTE ;
                HelpID = FN_INSERT_ENDNOTE ;
            };
            ToolBoxItem
            {
                Identifier = FN_INSERT_SYMBOL ;
                HelpID = FN_INSERT_SYMBOL ;
            };
            ToolBoxItem
            {
                Identifier = FN_INSERT_COLUMN_SECTION ;
                HelpID = FN_INSERT_COLUMN_SECTION;
                DropDown = TRUE ;
            };
            ToolBoxItem
            {
                Identifier = FN_INSERT_IDX_ENTRY_DLG ;
                HelpID = FN_INSERT_IDX_ENTRY_DLG ;
            };
            ToolBoxItem
            {
                Identifier = FN_INSERT_BOOKMARK ;
                HelpID = FN_INSERT_BOOKMARK ;
                RadioCheck = TRUE ;
            };
        };
    };
    Text [ english_us ] = "Insert" ;
    Text [ italian ] = "Inserisci" ;
    Text [ spanish ] = "Insertar" ;
    Text [ french ] = "Insérer" ;
    Text [ dutch ] = "Invoegen" ;
    Text [ swedish ] = "Infoga" ;
    Text [ danish ] = "Indsæt" ;
    Text [ portuguese_brazilian ] = "Einfügen" ;
    Text [ portuguese ] = "Inserir" ;
    Text[ chinese_simplified ] = "²åÈë";
    Text[ russian ] = "Âñòàâèòü";
    Text[ polish ] = "Wstaw";
    Text[ japanese ] = "‘}“ü";
    Text[ chinese_traditional ] = "´¡¤J";
    Text[ arabic ] = "ÅÏÑÇÌ";
    Text[ greek ] = "ÅéóáãùãÞ";
    Text[ korean ] = "»ðÀÔ";
    Text[ turkish ] = "Ekle";
    Text[ language_user1 ] = " ";
};
FloatingWindow RID_INSERT_OBJ_CTRL
{
    Moveable = TRUE ;
    Closeable = TRUE ;
    Hide = TRUE ;
    SVLook = TRUE ;
    HelpID = HID_INSERT_OBJ_CTRL ;
    /* ### ACHTUNG: Neuer Text in Resource? Objekt einfügen : Objekt einf³gen */
    Text = "Objekt einfügen" ;
    Text [ English ] = "Insert object" ;
    ToolBox TBX_OBJ_INSERT
    {
        MenuStrings = TRUE ;
        SVLook = TRUE ;
        HelpID = 1 ;
        ItemList =
        {
            ToolBoxItem
            {
                Identifier = SID_INSERT_DIAGRAM ;
                HelpID = SID_INSERT_DIAGRAM ;
            };
            ToolBoxItem
            {
                Identifier = FN_INSERT_SIM ;
                HelpID = FN_INSERT_SIM ;
            };
            ToolBoxItem
            {
                Identifier = FN_INSERT_SMA ;
                HelpID = FN_INSERT_SMA ;
            };
            ToolBoxItem
            {
                Identifier = SID_INSERT_FLOATINGFRAME ;
                HelpID = SID_INSERT_FLOATINGFRAME ;
            };
            ToolBoxItem
            {
                Identifier = SID_INSERT_OBJECT ;
                HelpID = SID_INSERT_OBJECT ;
            };
#ifdef SOLAR_PLUGIN
            ToolBoxItem
            {
                Identifier = SID_INSERT_PLUGIN ;
                HelpID = SID_INSERT_PLUGIN ;
            };
#endif
#ifdef SOLAR_JAVA
            ToolBoxItem
            {
                Identifier = SID_INSERT_APPLET ;
                HelpID = SID_INSERT_APPLET ;
            };
#endif
        };
    };
    Text [ dutch ] = "Object invoegen" ;
    Text [ english_us ] = "Insert Object" ;
    Text [ italian ] = "Inserisci oggetto" ;
    Text [ spanish ] = "Insertar objeto" ;
    Text [ french ] = "Insérer un objet" ;
    Text [ swedish ] = "Infoga objekt" ;
    Text [ danish ] = "Indsæt objekt" ;
    Text [ portuguese ] = "Inserir objecto" ;
    Text [ portuguese_brazilian ] = "Objekt einfügen" ;
    Text[ chinese_simplified ] = "²åÈë¶ÔÏó";
    Text[ russian ] = "Âñòàâèòü îáúåêò";
    Text[ polish ] = "Wstaw obiekt";
    Text[ japanese ] = "µÌÞ¼Þª¸Ä‚Ì‘}“ü";
    Text[ chinese_traditional ] = "´¡¤Jª«¥ó";
    Text[ arabic ] = "ÅÏÎÇá ßÇÆä";
    Text[ greek ] = "ÅéóáãùãÞ áíôéêåéìÝíïõ";
    Text[ korean ] = "°³Ã¼ »ðÀÔ";
    Text[ turkish ] = "Nesne ekle";
    Text[ language_user1 ] = " ";
};
Menu RID_INSERT_FIELD_CTRL
{
    ItemList =
    {
        MenuItem
        {
            Identifier = FN_INSERT_FLD_DATE ;
            HelpID = FN_INSERT_FLD_DATE ;
            Text = "Datum" ;
            Text [ English ] = "Date" ;
            Text [ english_us ] = "Date" ;
            Text [ italian ] = "Data" ;
            Text [ spanish ] = "Fecha" ;
            Text [ french ] = "Date" ;
            Text [ dutch ] = "Datum" ;
            Text [ swedish ] = "Datum" ;
            Text [ danish ] = "Dato" ;
            Text [ portuguese_brazilian ] = "Datum" ;
            Text [ portuguese ] = "Data" ;
            Text[ chinese_simplified ] = "ÈÕÆÚ";
            Text[ russian ] = "Äàòà";
            Text[ polish ] = "Data";
            Text[ japanese ] = "“ú•t";
            Text[ chinese_traditional ] = "¤é´Á";
            Text[ arabic ] = "ÊÇÑíÎ";
            Text[ greek ] = "Çìåñïìçíßá";
            Text[ korean ] = "µ¥ÀÌÅÍ";
            Text[ turkish ] = "Tarih";
            Text[ language_user1 ] = " ";
        };
        MenuItem
        {
            Identifier = FN_INSERT_FLD_TIME ;
            HelpID = FN_INSERT_FLD_TIME ;
            Text = "Uhrzeit" ;
            Text [ English ] = "Time" ;
            Text [ english_us ] = "Time" ;
            Text [ italian ] = "Orario" ;
            Text [ spanish ] = "Hora" ;
            Text [ french ] = "Heure" ;
            Text [ dutch ] = "Tijd" ;
            Text [ swedish ] = "Klockslag" ;
            Text [ danish ] = "Klokkeslæt" ;
            Text [ portuguese_brazilian ] = "Uhrzeit" ;
            Text [ portuguese ] = "Hora" ;
            Text[ chinese_simplified ] = "ʱ¼ä";
            Text[ russian ] = "Âðåìÿ";
            Text[ polish ] = "Godzina";
            Text[ japanese ] = "Žž";
            Text[ chinese_traditional ] = "®É¶¡";
            Text[ arabic ] = "ÇáæÞÊ";
            Text[ greek ] = "¿ñá";
            Text[ korean ] = "½Ã°£";
            Text[ turkish ] = "Saat";
            Text[ language_user1 ] = " ";
        };
         //#ifndef MN_SW_WEB
        MenuItem
        {
            Identifier = FN_INSERT_FLD_PGNUMBER ;
            HelpID = FN_INSERT_FLD_PGNUMBER ;
            Text = "Seitennummer" ;
            Text [ English ] = "Pagenumber" ;
            Text [ dutch ] = "Paginanummer" ;
            Text [ english_us ] = "Page Numbers" ;
            Text [ italian ] = "Numeri di pagina" ;
            Text [ spanish ] = "Número de página" ;
            Text [ french ] = "Numéro de page" ;
            Text [ swedish ] = "Sidnummer" ;
            Text [ danish ] = "Sidetal" ;
            Text [ portuguese_brazilian ] = "Seitennummer" ;
            Text [ portuguese ] = "Número de página" ;
            Text[ chinese_simplified ] = "Ò³Âë";
            Text[ russian ] = "Íîìåð ñòðàíèöû";
            Text[ polish ] = "Numer strony";
            Text[ japanese ] = "Íß°¼Þ”ԍ†";
            Text[ chinese_traditional ] = "­¶½X";
            Text[ arabic ] = "ÑÞã ÇáÕÝÍÉ";
            Text[ greek ] = "Áñéèìüò óåëßäáò";
            Text[ korean ] = "ÆäÀÌÁö ¼ö";
            Text[ turkish ] = "Sayfa numarasý";
            Text[ language_user1 ] = " ";
        };
        MenuItem
        {
            Identifier = FN_INSERT_FLD_PGCOUNT ;
            HelpID = FN_INSERT_FLD_PGCOUNT ;
            Text = "Seitenanzahl" ;
            Text [ English ] = "Pagecount" ;
            Text [ dutch ] = "Aantal pagina´s" ;
            Text [ english_us ] = "Page Count" ;
            Text [ italian ] = "Numero di pagine" ;
            Text [ spanish ] = "Contar páginas" ;
            Text [ french ] = "Nombre de pages" ;
            Text [ swedish ] = "Sidantal" ;
            Text [ danish ] = "Sideantal" ;
            Text [ portuguese_brazilian ] = "Seitenanzahl" ;
            Text [ portuguese ] = "Total de páginas" ;
            Text[ chinese_simplified ] = "Ò³Êý";
            Text[ russian ] = "Êîëè÷åñòâî ñòðàíèö";
            Text[ polish ] = "Liczba stron";
            Text[ japanese ] = "Íß°¼Þ‘”";
            Text[ chinese_traditional ] = "­¶¼Æ";
            Text[ arabic ] = "ÚÏÏ ÇáÕÝÍÇÊ";
            Text[ greek ] = "Óýíïëï óåëéäþí";
            Text[ korean ] = "ÆäÀÌÁö Ä«¿îÆ®";
            Text[ turkish ] = "Sayfa sayýsý";
            Text[ language_user1 ] = " ";
        };
        MenuItem
        {
            Identifier = FN_INSERT_FLD_TOPIC ;
            HelpID = FN_INSERT_FLD_TOPIC ;
            Text = "Thema" ;
            Text [ English ] = "Topic" ;
            Text [ english_us ] = "Subject" ;
            Text [ italian ] = "Argomento" ;
            Text [ spanish ] = "Tema" ;
            Text [ french ] = "Sujet" ;
            Text [ dutch ] = "Onderwerp" ;
            Text [ swedish ] = "Ämne" ;
            Text [ danish ] = "Emne" ;
            Text [ portuguese_brazilian ] = "Thema" ;
            Text [ portuguese ] = "Assunto" ;
            Text[ chinese_simplified ] = "Ö÷Ìâ";
            Text[ russian ] = "Òåìà";
            Text[ polish ] = "Temat";
            Text[ japanese ] = "ðÏ";
            Text[ chinese_traditional ] = "¥DÃD";
            Text[ arabic ] = "ÇáãæÖæÚ";
            Text[ greek ] = "ÈÝìá";
            Text[ korean ] = "ÁÖÁ¦";
            Text[ turkish ] = "Konu";
            Text[ language_user1 ] = " ";
        };
        MenuItem
        {
            Identifier = FN_INSERT_FLD_TITLE ;
            HelpID = FN_INSERT_FLD_TITLE ;
            Text = "Titel" ;
            Text [ English ] = "Title" ;
            Text [ dutch ] = "Titel" ;
            Text [ english_us ] = "Title" ;
            Text [ italian ] = "Titolo" ;
            Text [ spanish ] = "Título" ;
            Text [ french ] = "Titre" ;
            Text [ swedish ] = "Titel" ;
            Text [ danish ] = "Titel" ;
            Text [ portuguese_brazilian ] = "Titel" ;
            Text [ portuguese ] = "Título" ;
            Text[ chinese_simplified ] = "±êÌâ";
            Text[ russian ] = "Çàãëàâèå";
            Text[ polish ] = "Tytu³";
            Text[ japanese ] = "À²ÄÙ";
            Text[ chinese_traditional ] = "¼ÐÃD";
            Text[ arabic ] = "ÇáÚäæÇä";
            Text[ greek ] = "Ôßôëïò";
            Text[ korean ] = "Á¦¸ñ";
            Text[ turkish ] = "Baþlýk";
            Text[ language_user1 ] = " ";
        };
         //#endif
        MenuItem
        {
            Identifier = FN_INSERT_FLD_AUTHOR ;
            HelpID = FN_INSERT_FLD_AUTHOR ;
            Text = "Autor" ;
            Text [ English ] = "Author" ;
            Text [ dutch ] = "Auteur" ;
            Text [ english_us ] = "Author" ;
            Text [ italian ] = "Autore" ;
            Text [ spanish ] = "Autor" ;
            Text [ french ] = "Auteur" ;
            Text [ swedish ] = "Författare" ;
            Text [ danish ] = "Forfatter" ;
            Text [ portuguese_brazilian ] = "Autor" ;
            Text [ portuguese ] = "Autor" ;
            Text[ chinese_simplified ] = "×÷Õß";
            Text[ russian ] = "Àâòîð";
            Text[ polish ] = "Autor";
            Text[ japanese ] = "ì¬ŽÒ";
            Text[ chinese_traditional ] = "§@ªÌ";
            Text[ arabic ] = "ÇáãÄáÝ";
            Text[ greek ] = "ÓõíôÜêôçò";
            Text[ korean ] = "ÀÛ¼ºÀÎ";
            Text[ turkish ] = "Yazan";
            Text[ language_user1 ] = " ";
        };
        MenuItem
        {
            Separator = TRUE ;
        };
        MenuItem
        {
            Identifier = FN_INSERT_FIELD ;
            HelpID = FN_INSERT_FIELD ;
            Text = "Andere..." ;
            Text [ English ] = "Other..." ;
            Text [ english_us ] = "Other..." ;
            Text [ italian ] = "Altro..." ;
            Text [ spanish ] = "Otros..." ;
            Text [ french ] = "Autres..." ;
            Text [ dutch ] = "Andere..." ;
            Text [ swedish ] = "Andra..." ;
            Text [ danish ] = "Andre..." ;
            Text [ portuguese ] = "Outros..." ;
            Text [ portuguese_brazilian ] = "Andere..." ;
            Text[ chinese_simplified ] = "ÆäËû...";
            Text[ russian ] = "Äðóãèå...";
            Text[ polish ] = "Inne...";
            Text[ japanese ] = "‚»‚Ì‘¼...";
            Text[ chinese_traditional ] = "¨ä¥L...";
            Text[ arabic ] = "ÃÎÑì...";
            Text[ greek ] = "¢ëëá...";
            Text[ korean ] = "±âŸ...";
            Text[ turkish ] = "Diðer...";
            Text[ language_user1 ] = " ";
        };
    };
};
FloatingWindow RID_SCROLL_NAVIGATION_WIN
{
    Moveable = TRUE ;
    Closeable = TRUE ;
    Hide = TRUE ;
    SVLook = TRUE ;
    HelpID = HID_INSERT_CTRL ;
    Text = "Navigation" ;
    Text [ English ] = "Navigation" ;
    ImageList IL_VALUES
    {
        ImageBitmap = Bitmap { File = "srnavi.bmp" ; };
        MaskColor = IMAGE_STDBTN_COLOR ;
        IdList =
        {
            NID_NEXT ;
            NID_PREV ;
            NID_TBL ;
            NID_FRM ;
            NID_PGE ;
            NID_DRW ;
            NID_CTRL ;
            NID_REG ;
            NID_BKM ;
            NID_GRF ;
            NID_OLE ;
            NID_OUTL ;
            NID_SEL ;
            NID_FTN ;
            NID_MARK ;
            NID_POSTIT ;
            NID_SRCH_REP ;
            NID_INDEX_ENTRY;
            NID_TABLE_FORMULA;
            NID_TABLE_FORMULA_ERROR;
        };
        IdCount = { 20 ; };
    };
    String ST_TBL
    {
        Text = "Tabelle" ;
        Text [ English ] = "Table" ;
        Text [ english_us ] = "Table" ;
        Text [ portuguese_brazilian ] = "Tabelle" ;
        Text [ swedish ] = "Tabell" ;
        Text [ danish ] = "Tabel" ;
        Text [ italian ] = "Tabella" ;
        Text [ spanish ] = "Tabla" ;
        Text [ french ] = "Tableau" ;
        Text [ dutch ] = "Tabel" ;
        Text [ portuguese ] = "Tabela" ;
        Text[ chinese_simplified ] = "±í¸ñ";
        Text[ russian ] = "Òàáëèöà";
        Text[ polish ] = "Tabela";
        Text[ japanese ] = "•\\";
        Text[ chinese_traditional ] = "ªí®æ";
        Text[ arabic ] = "ÌÏæá";
        Text[ greek ] = "Ðßíáêáò";
        Text[ korean ] = "ǥ";
        Text[ turkish ] = "Tablo";
        Text[ language_user1 ] = " ";
    };
    String ST_FRM
    {
        Text = "Textrahmen" ;
        Text [ English ] = "Frame" ;
        Text [ english_us ] = "Text Frame" ;
        Text [ portuguese_brazilian ] = "Textrahmen" ;
        Text [ swedish ] = "Textram" ;
        Text [ danish ] = "Tekstboks" ;
        Text [ italian ] = "Cornice" ;
        Text [ spanish ] = "Marco de texto" ;
        Text [ french ] = "Cadre texte" ;
        Text [ dutch ] = "Tekstkader" ;
        Text [ portuguese ] = "Moldura de texto" ;
        Text[ chinese_simplified ] = "Îı¾¿ò";
        Text[ russian ] = "Òåêñòîâàÿ ðàìêà";
        Text[ polish ] = "Ramka tekstu";
        Text[ japanese ] = "÷½Ä˜g";
        Text[ chinese_traditional ] = "¤å¦r¤è¶ô";
        Text[ arabic ] = "ÅØÇÑ äÕ";
        Text[ greek ] = "Ðëáßóéï êåéìÝíïõ";
        Text[ korean ] = "ÅØ½ºÆ® ÇÁ·¹ÀÓ";
        Text[ turkish ] = "Metin çerçevesi";
        Text[ language_user1 ] = " ";
    };
    String ST_PGE
    {
        Text = "Seite" ;
        Text [ English ] = "Page" ;
        Text [ english_us ] = "Page" ;
        Text [ portuguese_brazilian ] = "Seite" ;
        Text [ swedish ] = "Sida" ;
        Text [ danish ] = "Side" ;
        Text [ italian ] = "Pagina" ;
        Text [ spanish ] = "Página" ;
        Text [ french ] = "Page" ;
        Text [ dutch ] = "Pagina" ;
        Text [ portuguese ] = "Página" ;
        Text[ chinese_simplified ] = "ҳ";
        Text[ russian ] = "Ñòðàíèöà";
        Text[ polish ] = "Strona";
        Text[ japanese ] = "Íß°¼Þ";
        Text[ chinese_traditional ] = "­¶";
        Text[ arabic ] = "ÕÝÍÉ";
        Text[ greek ] = "Óåëßäá";
        Text[ korean ] = "ÆäÀÌÁö";
        Text[ turkish ] = "Sayfa";
        Text[ language_user1 ] = " ";
    };
    String ST_DRW
    {
        Text = "Zeichenobjekt" ;
        Text [ English ] = "Drawing" ;
        Text [ english_us ] = "Drawing" ;
        Text [ portuguese_brazilian ] = "Zeichenobjekt" ;
        Text [ swedish ] = "Ritobjekt" ;
        Text [ danish ] = "Tegneobjekt" ;
        Text [ italian ] = "Oggetto di disegno" ;
        Text [ spanish ] = "Objeto de dibujo" ;
        Text [ french ] = "Objet de dessin" ;
        Text [ dutch ] = "Tekenobject" ;
        Text [ portuguese ] = "Desenho" ;
        Text[ chinese_simplified ] = "»æÍ¼¶ÔÏó";
        Text[ russian ] = "Ãðàôè÷åñêèé îáúåêò";
        Text[ polish ] = "Obiekt rysunkowy";
        Text[ japanese ] = "}Œ`•`‰æµÌÞ¼Þª¸Ä";
        Text[ english_us ] = "Drawing";
    Text[ portuguese ] = "Desenho";
    Text[ russian ] = "Ãðàôè÷åñêèé îáúåêò";
    Text[ dutch ] = "Tekenobject";
    Text[ french ] = "Objet de dessin";
    Text[ spanish ] = "Objeto de dibujo";
    Text[ italian ] = "Oggetto di disegno";
    Text[ danish ] = "Tegneobjekt";
    Text[ swedish ] = "Ritobjekt";
    Text[ polish ] = "Obiekt rysunkowy";
    Text[ portuguese_brazilian ] = "Zeichenobjekt";
    Text[ japanese ] = "}Œ`•`‰æµÌÞ¼Þª¸Ä";
    Text[ chinese_simplified ] = "»æÍ¼¶ÔÏó";
    Text[ chinese_traditional ] = "¹Ï¤ùª«¥ó";
        Text[ arabic ] = "ßÇÆä ÑÓæãí";
        Text[ greek ] = "Áíôéêåßìåíï ó÷åäßáóçò";
        Text[ korean ] = "±×¸®±â";
        Text[ turkish ] = "Çizim";
        Text[ language_user1 ] = " ";
    };
    String ST_CTRL
    {
        Text = "Kontrollfeld" ;
        Text [ English ] = "Control" ;
        Text [ english_us ] = "Control" ;
        Text [ portuguese_brazilian ] = "Kontrollfeld" ;
        Text [ swedish ] = "Kontrollfält" ;
        Text [ danish ] = "Kontrolelement" ;
        Text [ italian ] = "Campo di controllo" ;
        Text [ spanish ] = "Campo de control" ;
        Text [ french ] = "Champ de contrôle" ;
        Text [ dutch ] = "Controleveld" ;
        Text [ portuguese ] = "Campo de controlo" ;
        Text[ chinese_simplified ] = "¿ØÖÆ";
        Text[ russian ] = "Ýëåìåíò óïðàâëåíèÿ";
        Text[ polish ] = "Pole kontrolne";
        Text[ japanese ] = "ºÝÄÛ°Ù";
        Text[ chinese_traditional ] = "±±¨î¶µ";
        Text[ arabic ] = "ÚäÕÑ ÊÍßã";
        Text[ greek ] = "Ðåäßï åëÝã÷ïõ";
        Text[ korean ] = "ÄÁÆ®·Ñ";
        Text[ turkish ] = "Komut alaný";
        Text[ language_user1 ] = " ";
    };
    String ST_REG
    {
        Text = "Bereich" ;
        Text [ English ] = "Region" ;
        Text [ english_us ] = "Section" ;
        Text [ portuguese_brazilian ] = "Bereich" ;
        Text [ swedish ] = "Område" ;
        Text [ danish ] = "Område" ;
        Text [ italian ] = "Sezione" ;
        Text [ spanish ] = "Area" ;
        Text [ french ] = "Section" ;
        Text [ dutch ] = "Bereik" ;
        Text [ portuguese ] = "Secção" ;
        Text[ chinese_simplified ] = "ÇøÓò";
        Text[ russian ] = "Îáëàñòü";
        Text[ polish ] = "Sekcja";
        Text[ japanese ] = "”͈Í";
        Text[ chinese_traditional ] = "°Ï°ì";
        Text[ arabic ] = "äØÇÞ";
        Text[ greek ] = "Åíüôçôá";
        Text[ korean ] = "±¸¿ª";
        Text[ turkish ] = "Bölüm";
        Text[ language_user1 ] = " ";
    };
    String ST_BKM
    {
        Text = "Textmarke" ;
        Text [ English ] = "Bookmark" ;
        Text [ english_us ] = "Bookmark" ;
        Text [ portuguese_brazilian ] = "Textmarke" ;
        Text [ swedish ] = "Bokmärke" ;
        Text [ danish ] = "Tekstmarkering" ;
        Text [ italian ] = "Segnalibro" ;
        Text [ spanish ] = "Marca de texto" ;
        Text [ french ] = "Repère de texte" ;
        Text [ dutch ] = "Tekstmarkering" ;
        Text [ portuguese ] = "Marcador de texto" ;
        Text[ chinese_simplified ] = "ÊéÇ©";
        Text[ russian ] = "Çàêëàäêè";
        Text[ polish ] = "Zak³adka";
        Text[ japanese ] = "÷½Äϰ¸";
        Text[ chinese_traditional ] = "¤º¤å¼ÐÅÒ";
        Text[ arabic ] = "ÅÔÇÑÉ ãÑÌÚíÉ";
        Text[ greek ] = "Óåëéäïäåßêôçò";
        Text[ korean ] = "Ã¥ °¥ÇÇ";
        Text[ turkish ] = "Metin iþareti";
        Text[ language_user1 ] = " ";
    };
    String ST_GRF
    {
        Text = "Grafik" ;
        Text [ English ] = "Graphic" ;
        Text [ english_us ] = "Graphics" ;
        Text [ portuguese_brazilian ] = "Grafik" ;
        Text [ swedish ] = "Grafik" ;
        Text [ danish ] = "Billede" ;
        Text [ italian ] = "Immagine" ;
        Text [ spanish ] = "Imagen" ;
        Text [ french ] = "Image" ;
        Text [ dutch ] = "Afbeelding" ;
        Text [ portuguese ] = "Imagem" ;
        Text[ chinese_simplified ] = "ͼÐÎ";
        Text[ russian ] = "Ðèñóíîê";
        Text[ polish ] = "Grafika";
        Text[ japanese ] = "¸Þ×̨¯¸";
        Text[ chinese_traditional ] = "¹Ï¤ù";
        Text[ arabic ] = "ÕæÑÉ";
        Text[ greek ] = "Ãñáöéêü";
        Text[ korean ] = "±×·¡ÇÈ";
        Text[ turkish ] = "Grafik";
        Text[ language_user1 ] = " ";
    };
    String ST_OLE
    {
        Text = "OLE-Objekt" ;
        Text [ English ] = "OLE object" ;
        Text [ english_us ] = "OLE object" ;
        Text [ portuguese_brazilian ] = "OLE-Objekt" ;
        Text [ swedish ] = "OLE-objekt" ;
        Text [ danish ] = "OLE-objekt" ;
        Text [ italian ] = "Oggetto OLE" ;
        Text [ spanish ] = "Objeto OLE" ;
        Text [ french ] = "Objet OLE" ;
        Text [ dutch ] = "OLE-object" ;
        Text [ portuguese ] = "Objecto OLE" ;
        Text[ chinese_simplified ] = "OLE ¶ÔÏó";
        Text[ russian ] = "Îáúåêò OLE";
        Text[ polish ] = "Obiekt OLE";
        Text[ japanese ] = "OLEµÌÞ¼Þª¸Ä";
        Text[ chinese_traditional ] = "OLE - ª«¥ó";
        Text[ arabic ] = "OLE ßÇÆä";
        Text[ greek ] = "Áíôéêåßìåíï OLE";
        Text[ korean ] = "OLE °³Ã¼";
        Text[ turkish ] = "OLE nesnesi";
        Text[ language_user1 ] = " ";
    };
    String ST_OUTL
    {
        /* ### ACHTUNG: Neuer Text in Resource? Überschrift : šberschrift */
        Text = "Überschrift" ;
        Text [ English ] = "Outline" ;
        Text [ english_us ] = "Headings" ;
        Text [ portuguese_brazilian ] = "Überschrift" ;
        Text [ swedish ] = "Överskrift" ;
        Text [ danish ] = "Overskrift" ;
        Text [ italian ] = "Intestazione" ;
        Text [ spanish ] = "Encabezado" ;
        Text [ french ] = "Titre" ;
        Text [ dutch ] = "Kop" ;
        Text [ portuguese ] = "Título" ;
        Text[ chinese_simplified ] = "±êÌâ";
        Text[ russian ] = "Çàãîëîâîê";
        Text[ polish ] = "Tytu³";
        Text[ japanese ] = "Œ©o‚µ";
        Text[ chinese_traditional ] = "¼ÐÃD";
        Text[ arabic ] = "ÚäæÇä";
        Text[ greek ] = "Åðéêåöáëßäá";
        Text[ korean ] = "Á¦¸ñ";
        Text[ turkish ] = "Baþlýk";
        Text[ language_user1 ] = " ";
    };
    String ST_SEL
    {
        Text = "Markierung" ;
        Text [ English ] = "Selection" ;
        Text [ english_us ] = "Selection" ;
        Text [ portuguese_brazilian ] = "Markierung" ;
        Text [ swedish ] = "Markering" ;
        Text [ danish ] = "Markering" ;
        Text [ italian ] = "Selezione" ;
        Text [ spanish ] = "Selección" ;
        Text [ french ] = "Sélection" ;
        Text [ dutch ] = "Markering" ;
        Text [ portuguese ] = "Selecção" ;
        Text[ chinese_simplified ] = "Ñ¡ÖÐ";
        Text[ russian ] = "Âûäåëåíèå";
        Text[ polish ] = "Zaznaczenie";
        Text[ japanese ] = "‘I‘ð";
        Text[ chinese_traditional ] = "¿ï¨ú";
        Text[ arabic ] = "ÊÍÏíÏ";
        Text[ greek ] = "ÅðéëïãÞ";
        Text[ korean ] = "¼±ÅÃ";
        Text[ turkish ] = "Seçim";
        Text[ language_user1 ] = " ";
    };
    String ST_FTN
    {
        /* ### ACHTUNG: Neuer Text in Resource? Fußnote : Fu˜note */
        Text = "Fußnote" ;
        Text [ English ] = "Footnote" ;
        Text [ english_us ] = "Footnote" ;
        Text [ portuguese_brazilian ] = "Fußnote" ;
        Text [ swedish ] = "Fotnot" ;
        Text [ danish ] = "Fodnote" ;
        Text [ italian ] = "Nota a piè pagina" ;
        Text [ spanish ] = "Nota al pie" ;
        Text [ french ] = "Note de bas de page" ;
        Text [ dutch ] = "Voetnoot" ;
        Text [ portuguese ] = "Nota de rodapé" ;
        Text[ chinese_simplified ] = "×¢½Å";
        Text[ russian ] = "Ñíîñêè";
        Text[ polish ] = "Przypis dolny";
        Text[ japanese ] = "‹r’";
        Text[ chinese_traditional ] = "µù¸}";
        Text[ arabic ] = "ÍÇÔíÉ ÓÝáíÉ";
        Text[ greek ] = "Õðïóçìåßùóç";
        Text[ korean ] = "°¢ ÁÖ";
        Text[ turkish ] = "Dipnot";
        Text[ language_user1 ] = " ";
    };
    String ST_MARK
    {
        Text = "Merker" ;
        Text [ English ] = "Reminder" ;
        Text [ english_us ] = "Reminder" ;
        Text [ portuguese_brazilian ] = "Merker" ;
        Text [ swedish ] = "Temporärt bokmärke" ;
        Text [ danish ] = "Påmindelse" ;
        Text [ italian ] = "Contrassegno" ;
        Text [ spanish ] = "Marca" ;
        Text [ french ] = "Pense-bête" ;
        Text [ dutch ] = "Merktekens" ;
        Text [ portuguese ] = "Marca" ;
        Text[ chinese_simplified ] = "񈬀";
        Text[ russian ] = "Ïîìåòêà";
        Text[ polish ] = "Znacznik";
        Text[ japanese ] = "Šo‚¦Ž~‚ß";
        Text[ chinese_traditional ] = "´£¿ô";
        Text[ arabic ] = "ÚáÇãÉ ÊÐßíÑ";
        Text[ greek ] = "Õðåíèýìéóç";
        Text[ korean ] = "³ª¸ÓÁö";
        Text[ turkish ] = "Anýmsatýcý";
        Text[ language_user1 ] = " ";
    };
    String ST_POSTIT
    {
        Text = "Notiz" ;
        Text [ English ] = "Annotation" ;
        Text [ english_us ] = "Note" ;
        Text [ portuguese_brazilian ] = "Notiz" ;
        Text [ swedish ] = "Anteckning" ;
        Text [ danish ] = "Note" ;
        Text [ italian ] = "Nota" ;
        Text [ spanish ] = "Nota" ;
        Text [ french ] = "Note" ;
        Text [ dutch ] = "Aantekening" ;
        Text [ portuguese ] = "Anotação" ;
        Text[ chinese_simplified ] = "±¸×¢";
        Text[ russian ] = "Ïðèìå÷àíèå";
        Text[ polish ] = "Notatka";
        Text[ japanese ] = "ÒÓ";
        Text[ chinese_traditional ] = "³Æµù";
        Text[ arabic ] = "ãáÇÍÙÉ";
        Text[ greek ] = "Óçìåßùóç";
        Text[ korean ] = "¸Þ¸ð";
        Text[ turkish ] = "Not";
        Text[ language_user1 ] = " ";
    };
    String ST_SRCH_REP
    {
        Text = "Suche wiederholen" ;
        Text [ English ] = "Repeat search" ;
        Text [ english_us ] = "Repeat search" ;
        Text [ portuguese_brazilian ] = "Suche wiederholen" ;
        Text [ swedish ] = "Upprepa sökning" ;
        Text [ danish ] = "Gentag søgning" ;
        Text [ italian ] = "Ripeti ricerca" ;
        Text [ spanish ] = "Repetir búsqueda" ;
        Text [ french ] = "Répéter la recherche" ;
        Text [ dutch ] = "Zoeken herhalen" ;
        Text [ portuguese ] = "Repetir procura" ;
        Text[ chinese_simplified ] = "ÖØ¸´ËÑѰ";
        Text[ russian ] = "Ïîâòîð ïîèñêà";
        Text[ polish ] = "Powtórz wyszukiwanie";
        Text[ japanese ] = "ÄŒŸõ";
        Text[ chinese_traditional ] = "­«½Æ·j´M";
        Text[ arabic ] = "ÊßÑÇÑ ÇáÈÍË";
        Text[ greek ] = "ÅðáíÜëçøç áíáæÞôçóçò";
        Text[ korean ] = "¹Ýº¹ °Ë»ö";
        Text[ turkish ] = "Aramayý yinele";
        Text[ language_user1 ] = " ";
    };
    String ST_INDEX_ENTRY
    {
        Text = "Verzeichniseintrag" ;
        Text [ English ] = "Index entry" ;
        Text[ italian ] = "Voce di indice";
        Text[ portuguese_brazilian ] = "Index entry";
        Text[ portuguese ] = "Entrada do índice";
        Text[ danish ] = "Indekselement";
        Text[ french ] = "Entrée d'index";
        Text[ swedish ] = "Förteckningspost";
        Text[ dutch ] = "Index item";
        Text[ spanish ] = "Entrada del índice";
        Text[ english_us ] = "Index entry";
        Text[ chinese_simplified ] = "Ŀ¼ÌõÄ¿";
        Text[ russian ] = "Ýëåìåíò óêàçàòåëÿ";
        Text[ polish ] = "Wpis do indeksu";
        Text[ japanese ] = "õˆø€–Ú";
        Text[ chinese_traditional ] = "¥Ø¿ý¶µ¥Ø";
        Text[ arabic ] = "ÅÏÎÇá ÝåÑÓí";
        Text[ greek ] = "Êáôá÷þñéóç åõñåôçñßïõ";
        Text[ korean ] = "»öÀÎ Ç׸ñ";
        Text[ turkish ] = "Dizin giriþi";
        Text[ language_user1 ] = " ";
    };
    String ST_TABLE_FORMULA
    {
        Text = "Tabellenformel" ;
        Text [ English ] = "Table formula" ;
        Text[ english_us ] = "Table formula";
        Text[ portuguese ] = "Fórmula de tabela";
        Text[ russian ] = "Ôîðìóëà òàáëèöû";
        Text[ dutch ] = "Tabellenformule";
        Text[ french ] = "Formule de table";
        Text[ spanish ] = "Fórmula de tabla";
        Text[ italian ] = "Formula tabella";
        Text[ danish ] = "Tabelformel";
        Text[ swedish ] = "Tabellformel";
        Text[ polish ] = "Formu³a tabeli";
        Text[ portuguese_brazilian ] = "Table formula";
        Text[ japanese ] = "•\\‚̐”Ž®";
        Text[ chinese_simplified ] = "¹¤×÷±í¹«Ê½";
        Text[ chinese_traditional ] = "¤u§@ªí¤½¦¡";
        Text[ arabic ] = "ÕíÛÉ ÌÏæá";
        Text[ greek ] = "Ôýðïò ðßíáêá";
        Text[ korean ] = "Ç¥ ¼ö½Ä";
        Text[ turkish ] = "Tablo formülü";
        Text[ language_user1 ] = " ";
    };
    String ST_TABLE_FORMULA_ERROR
    {
        Text = "Fehlerhafte Tabellenformel" ;
        Text [ English ] = "Wrong table formula" ;
        Text[ english_us ] = "Wrong table formula";
        Text[ portuguese ] = "Fórmula de tabela errada";
        Text[ russian ] = "Íåïðàâèëüíàÿ ôîðìóëà òàáëèöû";
        Text[ dutch ] = "Foutieve tabellenformule";
        Text[ french ] = "Formule de table erronée";
        Text[ spanish ] = "Fórmula errónea de tabla";
        Text[ italian ] = "Formula tabella errata";
        Text[ danish ] = "Fejlagtig tabelformel";
        Text[ swedish ] = "Felaktig tabellformel";
        Text[ polish ] = "Nieprawid³owa formu³a tabeli";
        Text[ portuguese_brazilian ] = "Wrong table formula";
        Text[ japanese ] = "³‚µ‚­‚È‚¢•\\‚̐”Ž®";
        Text[ chinese_simplified ] = "´íÎóµÄ¹¤×÷±í¹«Ê½";
        Text[ chinese_traditional ] = "¿ù»~ªº¤u§@ªí¤½¦¡";
        Text[ arabic ] = "ÕíÛÉ ÌÏæá ÎÇØÆÉ";
        Text[ greek ] = "ËáíèáóìÝíïò ôýðïò ðßíáêá";
        Text[ korean ] = "À߸øµÈ Ç¥ ¼ö½Ä";
        Text[ turkish ] = "Hatalý tablo formülü";
        Text[ language_user1 ] = " ";
    };
    Text [ portuguese ] = "Navegação" ;
    Text [ english_us ] = "Navigation" ;
    Text [ portuguese_brazilian ] = "Navigation" ;
    Text [ swedish ] = "Navigation" ;
    Text [ danish ] = "Navigation" ;
    Text [ italian ] = "Navigazione" ;
    Text [ spanish ] = "Navegación" ;
    Text [ french ] = "Navigation" ;
    Text [ dutch ] = "Navigatie" ;
    Text[ chinese_simplified ] = "ä¯ÀÀ";
    Text[ russian ] = "Íàâèãàöèÿ";
    Text[ polish ] = "Nawigacja";
    Text[ japanese ] = "ÅËÞ¹Þ°¼®Ý";
    Text[ chinese_traditional ] = "ÂsÄý";
    Text[ arabic ] = "ÇáãáÇÍÉ";
    Text[ greek ] = "Ìåôáêßíçóç";
    Text[ korean ] = "³×ºñ°ÔÀ̼Ç";
    Text[ turkish ] = "Dolaþma";
    Text[ language_user1 ] = " ";
};
/*
Noch ein paar Reserven
            ToolBoxItem
            {
                                Identifier = NID_NEXT;
                Text = "Vorwärts" ;
                Text [ ENGLISH ] = "Forward" ;
                        };
            ToolBoxItem
            {
                                Identifier = NID_PREV;
                Text = "Rückwärts" ;
                Text [ ENGLISH ] = "Backward" ;
                        };
            ToolBoxItem
            {
                                Identifier = NID_CTRL;
                Text = "Control" ;
                        };
            ToolBoxItem
            {
                                Identifier = NID_DRW;
                Text = "Zeichenobjekt" ;
                        };


*/
/***************************************************************
    Strings fuer die Quickhelp der View-PgUp/Down-Buttons
***************************************************************/
String STR_IMGBTN_NEXT_DOWN
{
    Text = "" ;
};
String STR_IMGBTN_PREV_DOWN
{
    Text = "" ;
};
String STR_IMGBTN_TBL_DOWN
{
    /* ### ACHTUNG: Neuer Text in Resource? Nächste Tabelle : Nõchste Tabelle */
    Text = "Nächste Tabelle" ;
    Text [ English ] = "Next Table" ;
    Text [ english_us ] = "Next table" ;
    Text [ portuguese_brazilian ] = "Nächste Tabelle" ;
    Text [ swedish ] = "Nästa tabell" ;
    Text [ danish ] = "Næste tabel" ;
    Text [ italian ] = "Tabella successiva" ;
    Text [ spanish ] = "Tabla siguiente" ;
    Text [ french ] = "Tableau suivant" ;
    Text [ dutch ] = "Volgende tabel" ;
    Text [ portuguese ] = "Tabela seguinte" ;
    Text[ chinese_simplified ] = "ÏÂÒ»¸ö±í¸ñ";
    Text[ russian ] = "Ñëåäóþùàÿ òàáëèöà";
    Text[ polish ] = "Nastêpna tabela";
    Text[ japanese ] = "ŽŸ‚Ì•\\";
    Text[ chinese_traditional ] = "¤U¤@­Óªí®æ";
    Text[ arabic ] = "ÇáÌÏæá ÇáÊÇáí";
    Text[ greek ] = "Åðüìåíïò ðßíáêáò";
    Text[ korean ] = "´ÙÀ½ Ç¥";
    Text[ turkish ] = "Sonraki tablo";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_FRM_DOWN
{
    /* ### ACHTUNG: Neuer Text in Resource? Nächster Textrahmen : Nõchster Textrahmen */
    Text = "Nächster Textrahmen" ;
    Text [ English ] = "Next Frame" ;
    Text [ english_us ] = "Next text frame" ;
    Text [ portuguese_brazilian ] = "Nächster Textrahmen" ;
    Text [ swedish ] = "Nästa textram" ;
    Text [ danish ] = "Næste tekstboks" ;
    Text [ italian ] = "Cornice successiva" ;
    Text [ spanish ] = "Marco de texto siguiente" ;
    Text [ french ] = "Cadre texte suivant" ;
    Text [ dutch ] = "Volgend tekstkader" ;
    Text [ portuguese ] = "Moldura de texto seguinte" ;
    Text[ chinese_simplified ] = "ÏÂÒ»¸öÎı¾¿ò";
    Text[ russian ] = "Ñëåäóþùàÿ òåêñòîâàÿ ðàìêà";
    Text[ polish ] = "Nastêpna ramka tekstowa";
    Text[ japanese ] = "ŽŸ‚Ì÷½Ä˜g";
    Text[ chinese_traditional ] = "¤U¤@­Ó¤å¦r¤è®Ø";
    Text[ arabic ] = "ÅØÇÑ ÇáäÕ ÇáÊÇáí";
    Text[ greek ] = "Åðüìåíï ðëáßóéï êåéìÝíïõ";
    Text[ korean ] = "´ÙÀ½ ÅØ½ºÆ® ÇÁ·¹ÀÓ";
    Text[ turkish ] = "Sonraki metin çerçevesi";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_PGE_DOWN
{
    /* ### ACHTUNG: Neuer Text in Resource? Nächste Seite : Nõchste Seite */
    Text = "Nächste Seite" ;
    Text [ English ] = "Next Page" ;
    Text [ english_us ] = "Next page" ;
    Text [ portuguese_brazilian ] = "Nächste Seite" ;
    Text [ swedish ] = "Nästa sida" ;
    Text [ danish ] = "Næste side" ;
    Text [ italian ] = "Pagina successiva" ;
    Text [ spanish ] = "Página siguiente" ;
    Text [ french ] = "Page suivante" ;
    Text [ dutch ] = "Volgende pagina" ;
    Text [ portuguese ] = "Página seguinte" ;
    Text[ chinese_simplified ] = "ÏÂÒ»Ò³";
    Text[ russian ] = "Ñëåäóþùàÿ ñòðàíèöà";
    Text[ polish ] = "Nastêpna strona";
    Text[ japanese ] = "ŽŸ‚ÌÍß°¼Þ";
    Text[ chinese_traditional ] = "¤U¤@­¶";
    Text[ arabic ] = "ÇáÕÝÍÉ ÇáÊÇáíÉ";
    Text[ greek ] = "Åðüìåíç óåëßäá";
    Text[ korean ] = "´ÙÀ½ ÆäÀÌÁö";
    Text[ turkish ] = "Sonraki sayfa";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_DRW_DOWN
{
    /* ### ACHTUNG: Neuer Text in Resource? Nächstes Zeichenobjekt : Nõchstes Zeichenobjekt */
    Text = "Nächstes Zeichenobjekt" ;
    Text [ English ] = "Next drawing" ;
    Text [ english_us ] = "Next drawing" ;
    Text [ portuguese_brazilian ] = "Nächstes Zeichenobjekt" ;
    Text [ swedish ] = "Nästa ritobjekt" ;
    Text [ danish ] = "Næste tegneobjekt" ;
    Text [ italian ] = "Oggetto di disegno successivo" ;
    Text [ spanish ] = "Objeto de dibujo siguiente" ;
    Text [ french ] = "Objet de dessin suivant" ;
    Text [ dutch ] = "Volgend tekenobject" ;
    Text [ portuguese ] = "Objecto de desenho seguinte" ;
    Text[ chinese_simplified ] = "ÏÂÒ»¸ö×Ö·û¶ÔÏó";
    Text[ russian ] = "Ñëåäóþùèé ãðàôè÷åñêèé îáúåêò";
    Text[ polish ] = "Nastêpny obiekt rysunkowy";
    Text[ japanese ] = "ŽŸ‚Ì•¶ŽšµÌÞ¼Þª¸Ä";
    Text[ chinese_traditional ] = "¤U¤@­Ó¦r¤¸ª«¥ó";
    Text[ arabic ] = "ÇáßÇÆä ÇáÑÓæãí ÇáÊÇáí";
    Text[ greek ] = "Åðüìåíï áíôéêåßìåíï ó÷åäßáóçò";
    Text[ korean ] = "´ÙÀ½ ±×¸®±â";
    Text[ turkish ] = "Sonraki çizim";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_CTRL_DOWN
{
    /* ### ACHTUNG: Neuer Text in Resource? Nächstes Kontrollfeld : Nõchstes Kontrollfeld */
    Text = "Nächstes Kontrollfeld" ;
    Text [ English ] = "Next control" ;
    Text [ english_us ] = "Next control" ;
    Text [ portuguese_brazilian ] = "Nächstes Kontrollfeld" ;
    Text [ swedish ] = "Nästa kontrollfält" ;
    Text [ danish ] = "Næste kontrolelement" ;
    Text [ italian ] = "Campo di controllo successivo" ;
    Text [ spanish ] = "Campo de control siguiente" ;
    Text [ french ] = "Elément de contrôle suivant" ;
    Text [ dutch ] = "Volgend controleveld" ;
    Text [ portuguese ] = "Controlo seguinte" ;
    Text[ chinese_simplified ] = "ÏÂÒ»¸ö¿ØÖÆ";
    Text[ russian ] = "Ñëåäóþùèé ýëåìåíò óïðàâëåíèÿ";
    Text[ polish ] = "Nastêpne pole kontrolne";
    Text[ japanese ] = "ŽŸ‚̺ÝÄÛ°Ù";
    Text[ chinese_traditional ] = "¤U¤@­Ó±±¨î¶µ";
    Text[ arabic ] = "ÚäÕÑ ÇáÊÍßã ÇáÊÇáí";
    Text[ greek ] = "Åðüìåíï ðåäßï åëÝã÷ïõ";
    Text[ korean ] = "´ÙÀ½ ÄÁÆ®·Ñ";
    Text[ turkish ] = "Sonraki komut alaný";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_REG_DOWN
{
    /* ### ACHTUNG: Neuer Text in Resource? Nächster Bereich : Nõchster Bereich */
    Text = "Nächster Bereich" ;
    Text [ English ] = "Next region" ;
    Text [ english_us ] = "Next section" ;
    Text [ portuguese_brazilian ] = "Nächster Bereich" ;
    Text [ swedish ] = "Nästa område" ;
    Text [ danish ] = "Næste område" ;
    Text [ italian ] = "Area successiva" ;
    Text [ spanish ] = "Area siguiente" ;
    Text [ french ] = "Section suivante" ;
    Text [ dutch ] = "Volgend bereik" ;
    Text [ portuguese ] = "Secção seguinte" ;
    Text[ chinese_simplified ] = "ÏÂÒ»¸öÇøÓò";
    Text[ russian ] = "Ñëåäóþùàÿ îáëàñòü";
    Text[ polish ] = "Nastêpna sekcja";
    Text[ japanese ] = "ŽŸ‚͈̔Í";
    Text[ chinese_traditional ] = "¤U¤@­Ó°Ï°ì";
    Text[ arabic ] = "ÇáäØÇÞ ÇáÊÇáí";
    Text[ greek ] = "Åðüìåíç åíüôçôá";
    Text[ korean ] = "´ÙÀ½ ±¸¿ª";
    Text[ turkish ] = "Sonraki bölüm";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_BKM_DOWN
{
    /* ### ACHTUNG: Neuer Text in Resource? Nächste Textmarke : Nõchste Textmarke */
    Text = "Nächste Textmarke" ;
    Text [ English ] = "Next bookmark" ;
    Text [ english_us ] = "Next bookmark" ;
    Text [ portuguese_brazilian ] = "Nächste Textmarke" ;
    Text [ swedish ] = "Nästa bokmärke" ;
    Text [ danish ] = "Næste tekstmarkering" ;
    Text [ italian ] = "Segnalibro successivo" ;
    Text [ spanish ] = "Marcador siguiente" ;
    Text [ french ] = "Repère de texte suivant" ;
    Text [ dutch ] = "Volgende tekstmarkering" ;
    Text [ portuguese ] = "Marcador de texto seguinte" ;
    Text[ chinese_simplified ] = "ÏÂÒ»¸öÊéÇ©";
    Text[ russian ] = "Ñëåäóþùàÿ çàêëàäêà";
    Text[ polish ] = "Nastêpna zak³adka";
    Text[ japanese ] = "ŽŸ‚Ì÷½Äϰ¸";
    Text[ chinese_traditional ] = "¤U¤@­Ó®ÑÅÒ";
    Text[ arabic ] = "ÇáÅÔÇÑÉ ÇáãÑÌÚíÉ ÇáÊÇáíÉ";
    Text[ greek ] = "Åðüìåíï óçìÜäé êåéìÝíïõ";
    Text[ korean ] = "´ÙÀ½ Ã¥ °¥ÇÇ";
    Text[ turkish ] = "Sonraki metin iþareti";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_GRF_DOWN
{
    /* ### ACHTUNG: Neuer Text in Resource? Nächste Grafik : Nõchste Grafik */
    Text = "Nächste Grafik" ;
    Text [ English ] = "Next graphic" ;
    Text [ english_us ] = "Next picture" ;
    Text [ portuguese_brazilian ] = "Nächste Grafik" ;
    Text [ swedish ] = "Nästa grafik" ;
    Text [ danish ] = "Næste billede" ;
    Text [ italian ] = "Immagine successiva" ;
    Text [ spanish ] = "Imagen siguiente" ;
    Text [ french ] = "Image suivante" ;
    Text [ dutch ] = "Volgende afbeelding" ;
    Text [ portuguese ] = "Imagem seguinte" ;
    Text[ chinese_simplified ] = "ÏÂÒ»¸öͼÐÎ";
    Text[ russian ] = "Ñëåäóþùèé ðèñóíîê";
    Text[ polish ] = "Nastêpna grafika";
    Text[ japanese ] = "ŽŸ‚̸Þ×̨¯¸";
    Text[ chinese_traditional ] = "¤U¤@­Ó¹Ï¤ù";
    Text[ arabic ] = "ÇáÕæÑÉ ÇáÊÇáíÉ";
    Text[ greek ] = "Åðüìåíï ãñáöéêü";
    Text[ korean ] = "´ÙÀ½ ±×¸²";
    Text[ turkish ] = "Sonraki grafik";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_OLE_DOWN
{
    /* ### ACHTUNG: Neuer Text in Resource? Nächstes OLE-Objekt : Nächstes OLE object */
    /* ### ACHTUNG: Neuer Text in Resource? Nächstes OLE-Objekt : Nõchstes OLE-Objekt */
    Text = "Nächstes OLE-Objekt" ;
    Text [ English ] = "Next OLE object" ;
    Text [ english_us ] = "Next OLE object" ;
    Text [ portuguese_brazilian ] = "Nächstes OLE object" ;
    Text [ swedish ] = "Nästa OLE-objekt" ;
    Text [ danish ] = "Næste OLE-objekt" ;
    Text [ italian ] = "Oggetto OLE successivo" ;
    Text [ spanish ] = "Objeto OLE siguiente" ;
    Text [ french ] = "Objet OLE suivant" ;
    Text [ dutch ] = "Volgend OLE-object" ;
    Text [ portuguese ] = "Objecto OLE seguinte" ;
    Text[ chinese_simplified ] = "ÏÂÒ»¸ö OLE-¶ÔÏó";
    Text[ russian ] = "Ñëåäóþùèé îáúåêò OLE";
    Text[ polish ] = "Nastêpny obiekt OLE";
    Text[ japanese ] = "ŽŸ‚ÌOLE-µÌÞ¼Þª¸Ä";
    Text[ chinese_traditional ] = "¤U¤@­Ó OLE-ª«¥ó";
    Text[ arabic ] = "ÇáÊÇáí OLE ÇáßÇÆä";
    Text[ greek ] = "Åðüìåíï áíôéêåßìåíï OLE";
    Text[ korean ] = "´ÙÀ½ OLE°³Ã¼";
    Text[ turkish ] = "Sonraki OLE nesnesi";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_OUTL_DOWN
{
    /* ### ACHTUNG: Neuer Text in Resource? Nächste Überschrift : Nõchste šberschrift */
    Text = "Nächste Überschrift" ;
    Text [ English ] = "Next outline" ;
    Text [ english_us ] = "Next heading" ;
    Text [ portuguese_brazilian ] = "Nächste Überschrift" ;
    Text [ swedish ] = "Nästa överskrift" ;
    Text [ danish ] = "Næste overskrift" ;
    Text [ italian ] = "Intestazione successiva" ;
    Text [ spanish ] = "Encabezado siguiente" ;
    Text [ french ] = "Titre suivant" ;
    Text [ dutch ] = "Volgende kop" ;
    Text [ portuguese ] = "Título seguinte" ;
    Text[ chinese_simplified ] = "ÏÂÒ»¸ö±êÌâ";
    Text[ russian ] = "Ñëåäóþùèé çàãîëîâîê";
    Text[ polish ] = "Nastêpny tytu³";
    Text[ japanese ] = "ŽŸ‚ÌŒ©o‚µ";
    Text[ chinese_traditional ] = "¤U¤@­Ó¼ÐÃD";
    Text[ arabic ] = "ÇáÚäæÇä ÇáÊÇáí";
    Text[ greek ] = "Åðüìåíç åðéêåöáëßäá";
    Text[ korean ] = "´ÙÀ½ Á¦¸ñ";
    Text[ turkish ] = "Sonraki baþlýk";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_SEL_DOWN
{
    /* ### ACHTUNG: Neuer Text in Resource? Nächste Markierung : Nõchste Markierung */
    Text = "Nächste Markierung" ;
    Text [ English ] = "Next selection" ;
    Text [ english_us ] = "Next selection" ;
    Text [ portuguese_brazilian ] = "Nächste Markierung" ;
    Text [ swedish ] = "Nästa markering" ;
    Text [ danish ] = "Næste markering" ;
    Text [ italian ] = "Selezione successiva" ;
    Text [ spanish ] = "Selección siguiente" ;
    Text [ french ] = "Sélection suivante" ;
    Text [ dutch ] = "Volgende markering" ;
    Text [ portuguese ] = "Selecção seguinte" ;
    Text[ chinese_simplified ] = "ÏÂÒ»¸öÑ¡Ôñ";
    Text[ russian ] = "Ñëåäóþùåå âûäåëåíèå";
    Text[ polish ] = "Nastêpne zaznaczenie";
    Text[ japanese ] = "ŽŸ‚Ì‘I‘ð";
    Text[ chinese_traditional ] = "¤U¤@­Ó¿ï¨ú";
    Text[ arabic ] = "ÇáÊÍÏíÏ ÇáÊÇáí";
    Text[ greek ] = "Åðüìåíç åðéëïãÞ";
    Text[ korean ] = "´ÙÀ½ ¼±ÅÃ";
    Text[ turkish ] = "Önceki seçim";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_FTN_DOWN
{
    /* ### ACHTUNG: Neuer Text in Resource? Nächste Fußnote : Nõchste Fu˜note */
    Text = "Nächste Fußnote" ;
    Text [ English ] = "Next Footnote" ;
    Text [ english_us ] = "Next footnote" ;
    Text [ portuguese_brazilian ] = "Nächste Fußnote" ;
    Text [ swedish ] = "Nästa fotnot" ;
    Text [ danish ] = "Næste fodnote" ;
    Text [ italian ] = "Nota a piè pagina successiva" ;
    Text [ spanish ] = "Nota al pie siguiente" ;
    Text [ french ] = "Note de bas de page suivante" ;
    Text [ dutch ] = "Volgende voetnoot" ;
    Text [ portuguese ] = "Nota de rodapé seguinte" ;
    Text[ chinese_simplified ] = "ÏÂÒ»¸ö×¢½Å";
    Text[ russian ] = "Ñëåäóþùàÿ ñíîñêà";
    Text[ polish ] = "Nastêpny przypis dolny";
    Text[ japanese ] = "ŽŸ‚Ì‹r’";
    Text[ chinese_traditional ] = "¤U¤@­Óµù¸}";
    Text[ arabic ] = "ÇáÍÇÔíÉ ÇáÓÝáíÉ ÇáÊÇáíÉ";
    Text[ greek ] = "Åðüìåíç õðïóçìåßùóç";
    Text[ korean ] = "´ÙÀ½ °¢ÁÖ";
    Text[ turkish ] = "Sonraki dipnot";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_MARK_DOWN
{
    /* ### ACHTUNG: Neuer Text in Resource? Nächster Merker : Nõchster Merker */
    Text = "Nächster Merker" ;
    Text [ English ] = "Next Reminder" ;
    Text [ english_us ] = "Next Reminder" ;
    Text [ portuguese_brazilian ] = "Nächster Merker" ;
    Text [ swedish ] = "Nästa temporära bokmärke" ;
    Text [ danish ] = "Næste påmindelse" ;
    Text [ italian ] = "Contrassegno successivo" ;
    Text [ spanish ] = "Marca siguiente" ;
    Text [ french ] = "Pense-bête suivant" ;
    Text [ dutch ] = "Volgend merkteken" ;
    Text [ portuguese ] = "Marca seguinte" ;
    Text[ chinese_simplified ] = "ÏÂÒ»¸ö±ê¼Ç";
    Text[ russian ] = "Ñëåäóþùàÿ ïîìåòêà";
    Text[ polish ] = "Nastêpny znacznik";
    Text[ japanese ] = "ŽŸ‚ÌŠo‚¦Ž~‚ß";
    Text[ chinese_traditional ] = "¤U¤@­Ó´£¿ô";
    Text[ arabic ] = "ÚáÇãÉ ÇáÊÐßíÑ ÇáÊÇáíÉ";
    Text[ greek ] = "Åðüìåíç õðåíèýìéóç";
    Text[ korean ] = "´ÙÀ½ ³ª¸ÓÁö";
    Text[ turkish ] = "Sonraki anýmsatýcý";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_POSTIT_DOWN
{
    /* ### ACHTUNG: Neuer Text in Resource? Nächste Notiz : Nõchste Notiz */
    Text = "Nächste Notiz" ;
    Text [ English ] = "Next Annotation" ;
    Text [ english_us ] = "Next Note" ;
    Text [ portuguese_brazilian ] = "Nächste Notiz" ;
    Text [ swedish ] = "Nästa anteckning" ;
    Text [ danish ] = "Næste note" ;
    Text [ italian ] = "Nota successiva" ;
    Text [ spanish ] = "Nota siguiente" ;
    Text [ french ] = "Note suivante" ;
    Text [ dutch ] = "Volgende aantekening" ;
    Text [ portuguese ] = "Anotação seguinte" ;
    Text[ chinese_simplified ] = "ÏÂÒ»¸ö±¸×¢";
    Text[ russian ] = "Ñëåäóþùåå ïðèìå÷àíèå";
    Text[ polish ] = "Nastêpna notatka";
    Text[ japanese ] = "ŽŸ‚ÌÒÓ";
    Text[ chinese_traditional ] = "¤U¤@­Ó³Æµù";
    Text[ arabic ] = "ÇáãáÇÍÙÉ ÇáÊÇáíÉ";
    Text[ greek ] = "Åðüìåíç óçìåßùóç";
    Text[ korean ] = "´ÙÀ½ ¸Þ¸ð";
    Text[ turkish ] = "Sonraki not";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_SRCH_REP_DOWN
{
    Text = "Vorwärts weitersuchen" ;
    Text [ English ] = "Repeat search " ;
    Text [ english_us ] = "Continue search forward" ;
    Text [ portuguese_brazilian ] = "Vorwärts weitersuchen" ;
    Text [ swedish ] = "Sök vidare framåt" ;
    Text [ danish ] = "Fortsæt søgning fremad" ;
    Text [ italian ] = "Continua a cercare in avanti" ;
    Text [ spanish ] = "Continuar búsqueda hacia delante" ;
    Text [ french ] = "Continuer la recherche vers le bas" ;
    Text [ dutch ] = "Voorwaarts verder zoeken" ;
    Text [ portuguese ] = "Continuar a procura para a frente" ;
    Text[ chinese_simplified ] = "ÏòǰËÑѰ";
    Text[ russian ] = "Ïîèñê âïåðåä";
    Text[ polish ] = "Szukaj dalej do przodu";
    Text[ japanese ] = "•¶––•ûŒü‚ÉŒŸõ‘±s";
    Text[ chinese_traditional ] = "¦V«e·j´M";
    Text[ arabic ] = "ãÊÇÈÚÉ ÇáÈÍË ááÃãÇã";
    Text[ greek ] = "ÓõíÝ÷éóç áíáæÞôçóçò ðñïò ôá åìðñüò";
    Text[ korean ] = "°è¼Ó ¾ÕÀ¸·Î °Ë»ö";
    Text[ turkish ] = "Ýleri dogru ara";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_INDEX_ENTRY_DOWN
{
    Text = "Nächster Verzeichniseintrag" ;
    Text [ English ] = "Next index entry" ;
    Text[ italian ] = "Voce d'indice successiva";
    Text[ portuguese_brazilian ] = "Next index entry";
    Text[ portuguese ] = "Entrada do índice seguinte";
    Text[ danish ] = "Næste indekselement";
    Text[ french ] = "Entrée d'index suivante";
    Text[ swedish ] = "Nästa förteckningspost";
    Text[ dutch ] = "Volgend index item";
    Text[ spanish ] = "Entrada de índice siguiente";
    Text[ english_us ] = "Next index entry";
    Text[ chinese_simplified ] = "ÏÂÒ»¸öĿ¼ÌõÄ¿";
    Text[ russian ] = "Ñëåäóþùèé ýëåìåíò óêàçàòåëÿ";
    Text[ polish ] = "Nastêpny wpis do indeksu";
    Text[ japanese ] = "ŽŸ‚̍õˆø€–Ú";
    Text[ chinese_traditional ] = "¤U¤@­Ó¥Ø¿ý¶µ¥Ø";
    Text[ arabic ] = "ÇáÅÏÎÇá ÇáÝåÑÓí ÇáÊÇáí";
    Text[ greek ] = "Åðüìåíç åããñáöÞ åõñåôçñßïõ";
    Text[ korean ] = "´ÙÀ½ »öÀÎ Ç׸ñ";
    Text[ turkish ] = "Sonraki dizin giriþi";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_NEXT_UP
{
    Text = "" ;
};
String STR_IMGBTN_PREV_UP
{
    Text = "" ;
};
String STR_IMGBTN_TBL_UP
{
    Text = "Vorige Tabelle" ;
    Text [ English ] = "Previous table" ;
    Text [ english_us ] = "Previous table" ;
    Text [ portuguese_brazilian ] = "Vorige Tabelle" ;
    Text [ swedish ] = "Föregående tabell" ;
    Text [ danish ] = "Forrige tabel" ;
    Text [ italian ] = "Tabella precedente" ;
    Text [ spanish ] = "Tabla anterior" ;
    Text [ french ] = "Tableau précédent" ;
    Text [ dutch ] = "Vorige tabel" ;
    Text [ portuguese ] = "Tabela anterior" ;
    Text[ chinese_simplified ] = "ÉÏÒ»¸ö±í¸ñ";
    Text[ russian ] = "Ïðåäûäóùàÿ òàáëèöà";
    Text[ polish ] = "Poprzednia tabela";
    Text[ japanese ] = "‘O‚Ì•\\";
    Text[ chinese_traditional ] = "¤W¤@­Óªí®æ";
    Text[ arabic ] = "ÇáÌÏæá ÇáÓÇÈÞ";
    Text[ greek ] = "Ðñïçãïýìåíïò ðßíáêáò";
    Text[ korean ] = "ÀÌÀüÇ¥";
    Text[ turkish ] = "Önceki tablo";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_FRM_UP
{
    Text = "Voriger Textrahmen" ;
    Text [ English ] = "Previous frame" ;
    Text [ english_us ] = "Previous text frame" ;
    Text [ portuguese_brazilian ] = "Voriger Textrahmen" ;
    Text [ swedish ] = "Föregående textram" ;
    Text [ danish ] = "Forrige tekstboks" ;
    Text [ italian ] = "Cornice di testo precedente" ;
    Text [ spanish ] = "Marco de texto anterior" ;
    Text [ french ] = "Cadre texte précédent" ;
    Text [ dutch ] = "Vorig tekstkader" ;
    Text [ portuguese ] = "Moldura de texto anterior" ;
    Text[ chinese_simplified ] = "ÉÏÒ»¸öÎı¾¿ò";
    Text[ russian ] = "Ïðåäûäóùàÿ òåêñòîâàÿ ðàìêà";
    Text[ polish ] = "Poprzednia ramka tekstowa";
    Text[ japanese ] = "‘O‚Ì÷½Ä˜g";
    Text[ chinese_traditional ] = "¤W¤@­Ó¤å¦r¤è®Ø";
    Text[ arabic ] = "ÅØÇÑ ÇáäÕ ÇáÓÇÈÞ";
    Text[ greek ] = "Ðñïçãïýìåíï ðëáßóéï êåéìÝíïõ";
    Text[ korean ] = "ÀÌÀü ÅØ½ºÆ® ÇÁ·¹ÀÓ";
    Text[ turkish ] = "Önceki metin çerçevesi";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_PGE_UP
{
    Text = "Vorige Seite" ;
    Text [ English ] = "Previous page" ;
    Text [ english_us ] = "Previous page" ;
    Text [ portuguese_brazilian ] = "Vorige Seite" ;
    Text [ swedish ] = "Föregående sida" ;
    Text [ danish ] = "Forrige side" ;
    Text [ italian ] = "Pagina precedente" ;
    Text [ spanish ] = "Página anterior" ;
    Text [ french ] = "Page précédente" ;
    Text [ dutch ] = "Vorige pagina" ;
    Text [ portuguese ] = "Página anterior" ;
    Text[ chinese_simplified ] = "ÉÏÒ»Ò³";
    Text[ russian ] = "Ïðåäûäóùàÿ ñòðàíèöà";
    Text[ polish ] = "Poprzednia strona";
    Text[ japanese ] = "‘O‚ÌÍß°¼Þ";
    Text[ chinese_traditional ] = "¤W¤@­¶";
    Text[ arabic ] = "ÇáÕÝÍÉ ÇáÓÇÈÞÉ";
    Text[ greek ] = "Ðñïçãïýìåíç óåëßäá";
    Text[ korean ] = "ÀÌÀü ÆäÀÌÁö";
    Text[ turkish ] = "Önceki sayfa";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_DRW_UP
{
    Text = "Voriges Zeichenobjekt" ;
    Text [ English ] = "Previous drawing" ;
    Text [ english_us ] = "Previous drawing" ;
    Text [ portuguese_brazilian ] = "Voriges Zeichenobjekt" ;
    Text [ swedish ] = "Föregående ritobjekt" ;
    Text [ danish ] = "Forrige tegneobjekt" ;
    Text [ italian ] = "Oggetto di disegno precedente" ;
    Text [ spanish ] = "Objeto de dibujo anterior" ;
    Text [ french ] = "Objet de dessin précédent" ;
    Text [ dutch ] = "Vorig tekenobject" ;
    Text [ portuguese ] = "Objecto de desenho anterior" ;
    Text[ chinese_simplified ] = "ÉÏÒ»¸ö×Ö·û¶ÔÏó";
    Text[ russian ] = "Ïðåäûäóùèé ãðàôè÷åñêèé îáúåêò";
    Text[ polish ] = "Poprzedni obiekt rysunkowy";
    Text[ japanese ] = "‘O‚Ì•¶ŽšµÌÞ¼Þª¸Ä";
    Text[ chinese_traditional ] = "¤W¤@­Ó¦r¤¸ª«¥ó";
    Text[ arabic ] = "ÇáßÇÆä ÇáÑÓæãí ÇáÓÇÈÞ";
    Text[ greek ] = "Ðñïçãïýìåíï áíôéêåßìåíï ó÷åäßáóçò";
    Text[ korean ] = "ÀÌÀü ±×¸®±â";
    Text[ turkish ] = "Önceki çizim";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_CTRL_UP
{
    Text = "Voriges Kontrollfeld" ;
    Text [ English ] = "Previous control" ;
    Text [ english_us ] = "Previous control" ;
    Text [ portuguese_brazilian ] = "Voriges Kontrollfeld" ;
    Text [ swedish ] = "Föregående kontrollfält" ;
    Text [ danish ] = "Forrige kontrolelement" ;
    Text [ italian ] = "Campo di controllo precedente" ;
    Text [ spanish ] = "Campo de control anterior" ;
    Text [ french ] = "Elément de contrôle précédent" ;
    Text [ dutch ] = "Vorig controleveld" ;
    Text [ portuguese ] = "Controlo anterior" ;
    Text[ chinese_simplified ] = "ÉÏÒ»¸ö¿ØÖÆ";
    Text[ russian ] = "Ïðåäûäóùèé ýëåìåíò óïðàâëåíèÿ";
    Text[ polish ] = "Poprzednie pole kontrolne";
    Text[ japanese ] = "‘O‚̺ÝÄÛ°Ù";
    Text[ chinese_traditional ] = "¤W¤@­Ó±±¨î¶µ";
    Text[ arabic ] = "ÚäÕÑ ÇáÊÍßã ÇáÓÇÈÞ";
    Text[ greek ] = "Ðñïçãïýìåíï ðåäßï åëÝã÷ïõ";
    Text[ korean ] = "ÀÌÀü ÄÁÆ®·Ñ";
    Text[ turkish ] = "Önceki komut alaný";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_REG_UP
{
    Text = "Voriger Bereich" ;
    Text [ English ] = "Previous region" ;
    Text [ english_us ] = "Previous section" ;
    Text [ portuguese_brazilian ] = "Voriger Bereich" ;
    Text [ swedish ] = "Föregående område" ;
    Text [ danish ] = "Forrige område" ;
    Text [ italian ] = "Area precedente" ;
    Text [ spanish ] = "Area anterior" ;
    Text [ french ] = "Section précédente" ;
    Text [ dutch ] = "Vorig bereik" ;
    Text [ portuguese ] = "Secção anterior" ;
    Text[ chinese_simplified ] = "ÉÏÒ»¸öÇøÓò";
    Text[ russian ] = "Ïðåäûäóùàÿ îáëàñòü";
    Text[ polish ] = "Poprzednia sekcja";
    Text[ japanese ] = "‘O‚͈̔Í";
    Text[ chinese_traditional ] = "¤W¤@­Ó°Ï°ì";
    Text[ arabic ] = "ÇáäØÇÞ ÇáÓÇÈÞ";
    Text[ greek ] = "Ðñïçãïýìåíç åíüôçôá";
    Text[ korean ] = "ÀÌÀü ±¸¿ª";
    Text[ turkish ] = "Önceki Bölüm";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_BKM_UP
{
    Text = "Vorige Textmarke" ;
    Text [ English ] = "Previous bookmark" ;
    Text [ english_us ] = "Previous bookmark" ;
    Text [ portuguese_brazilian ] = "Vorige Textmarke" ;
    Text [ swedish ] = "Föregående bokmärke" ;
    Text [ danish ] = "Forrige tekstmarkering" ;
    Text [ italian ] = "Segnalibro precedente" ;
    Text [ spanish ] = "Marcador anterior" ;
    Text [ french ] = "Repère de texte précédent" ;
    Text [ dutch ] = "Vorige tekstmarkering" ;
    Text [ portuguese ] = "Marcador de texto anterior" ;
    Text[ chinese_simplified ] = "ÉÏÒ»¸öÊéÇ©";
    Text[ russian ] = "Ïðåäûäóùàÿ çàêëàäêà";
    Text[ polish ] = "Poprzednia zak³adka";
    Text[ japanese ] = "‘O‚Ì÷½Äϰ¸";
    Text[ chinese_traditional ] = "¤W¤@­Ó®ÑÅÒ";
    Text[ arabic ] = "ÇáÅÔÇÑÉ ÇáãÑÌÚíÉ ÇáÓÇÈÞÉ";
    Text[ greek ] = "Ðñïçãïýìåíï óçìÜäé êåéìÝíïõ";
    Text[ korean ] = "ÀÌÀü  Ã¥ °¥ÇÇ";
    Text[ turkish ] = "Önceki metin iþareti";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_GRF_UP
{
    Text = "Vorige Grafik" ;
    Text [ English ] = "Previous graphic" ;
    Text [ english_us ] = "Previous picture" ;
    Text [ portuguese_brazilian ] = "Vorige Grafik" ;
    Text [ swedish ] = "Föregående grafik" ;
    Text [ danish ] = "Forrige billede" ;
    Text [ italian ] = "Immagine precedente" ;
    Text [ spanish ] = "Imagen anterior" ;
    Text [ french ] = "Image précédente" ;
    Text [ dutch ] = "Vorige afbeelding" ;
    Text [ portuguese ] = "Imagem anterior" ;
    Text[ chinese_simplified ] = "ÉÏÒ»¸öͼÐÎ";
    Text[ russian ] = "Ïðåäûäóùèé ðèñóíîê";
    Text[ polish ] = "Poprzednia grafika";
    Text[ japanese ] = "‘O‚̐}";
    Text[ chinese_traditional ] = "¤W¤@­Ó¹Ï¤ù";
    Text[ arabic ] = "ÇáÕæÑÉ ÇáÓÇÈÞÉ";
    Text[ greek ] = "Ðñïçãïýìåíï ãñáöéêü";
    Text[ korean ] = "ÀÌÀü ±×¸²";
    Text[ turkish ] = "Önceki grafik";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_OLE_UP
{
    /* ### ACHTUNG: Neuer Text in Resource? Voriges OLE-Objekt : Voriges OLE object */
    Text = "Voriges OLE-Objekt" ;
    Text [ English ] = "Previous OLE object" ;
    Text [ english_us ] = "Previous OLE object" ;
    Text [ portuguese_brazilian ] = "Voriges OLE object" ;
    Text [ swedish ] = "Föregående OLE-objekt" ;
    Text [ danish ] = "Forrige OLE-objekt" ;
    Text [ italian ] = "Oggetto OLE precedente" ;
    Text [ spanish ] = "Objeto OLE anterior" ;
    Text [ french ] = "Objet OLE précédent" ;
    Text [ dutch ] = "Vorig OLE-object" ;
    Text [ portuguese ] = "Objecto OLE anterior" ;
    Text[ chinese_simplified ] = "ÉÏÒ»¸ö OLE-¶ÔÏó";
    Text[ russian ] = "Ïðåäûäóùèé îáúåêò OLE";
    Text[ polish ] = "Poprzedni obiekt OLE";
    Text[ japanese ] = "‘O‚ÌOLE-µÌÞ¼Þª¸Ä";
    Text[ chinese_traditional ] = "¤W¤@­Ó OLE-ª«¥ó";
    Text[ arabic ] = "ÇáÓÇÈÞ OLE ÇáßÇÆä";
    Text[ greek ] = "Ðñïçãïýìåíï áíôéêåßìåíï OLE";
    Text[ korean ] = "ÀÌÀü OLE°³Ã¼";
    Text[ turkish ] = "Önceki OLE nesnesi";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_OUTL_UP
{
    /* ### ACHTUNG: Neuer Text in Resource? Vorige Überschrift : Vorige šberschrift */
    Text = "Vorige Überschrift" ;
    Text [ English ] = "Previous outline" ;
    Text [ english_us ] = "Previous heading" ;
    Text [ portuguese_brazilian ] = "Vorige Überschrift" ;
    Text [ swedish ] = "Föregående överskrift" ;
    Text [ danish ] = "Forrige overskrift" ;
    Text [ italian ] = "Intestazione precedente" ;
    Text [ spanish ] = "Encabezado anterior" ;
    Text [ french ] = "Titre précédent" ;
    Text [ dutch ] = "Vorige kop" ;
    Text [ portuguese ] = "Título anterior" ;
    Text[ chinese_simplified ] = "ÉÏÒ»¸ö±êÌâ";
    Text[ russian ] = "Ïðåäûäóùèé çàãîëîâîê";
    Text[ polish ] = "Poprzedni tytu³";
    Text[ japanese ] = "‘O‚ÌŒ©o‚µ";
    Text[ chinese_traditional ] = "¤W¤@­Ó¼ÐÃD";
    Text[ arabic ] = "ÇáÚäæÇä ÇáÓÇÈÞ";
    Text[ greek ] = "Ðñïçãïýìåíç åðéêåöáëßäá";
    Text[ korean ] = "ÀÌÀüÁ¦¸ñ";
    Text[ turkish ] = "Önceki baþlýk";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_SEL_UP
{
    Text = "Vorige Markierung" ;
    Text [ English ] = "Previous selection" ;
    Text [ english_us ] = "Previous selection" ;
    Text [ portuguese_brazilian ] = "Vorige Markierung" ;
    Text [ swedish ] = "Föregående markering" ;
    Text [ danish ] = "Forrige markering" ;
    Text [ italian ] = "Selezione precedente" ;
    Text [ spanish ] = "Selección anterior" ;
    Text [ french ] = "Sélection précédente" ;
    Text [ dutch ] = "Vorige markering" ;
    Text [ portuguese ] = "Selecção anterior" ;
    Text[ chinese_simplified ] = "ÉÏÒ»¸öÑ¡Ôñ";
    Text[ russian ] = "Ïðåäûäóùåå âûäåëåíèå";
    Text[ polish ] = "Poprzednie zaznaczenie";
    Text[ japanese ] = "‘O‚Ì‘I‘ð";
    Text[ chinese_traditional ] = "¤W¤@­Ó¿ï¨ú";
    Text[ arabic ] = "ÇáÊÍÏíÏ ÇáÓÇÈÞ";
    Text[ greek ] = "Ðñïçãïýìåíç åðéëïãÞ";
    Text[ korean ] = "ÀÌÀü ¼±ÅÃ";
    Text[ turkish ] = "Sonraki seçim";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_FTN_UP
{
    /* ### ACHTUNG: Neuer Text in Resource? Vorige Fußnote : Vorige Fu˜note */
    Text = "Vorige Fußnote" ;
    Text [ English ] = "Previous Footnote" ;
    Text [ english_us ] = "Previous footnote" ;
    Text [ portuguese_brazilian ] = "Vorige Fußnote" ;
    Text [ swedish ] = "Föregående fotnot" ;
    Text [ danish ] = "Forrige fodnote" ;
    Text [ italian ] = "Nota a piè pagina precedente" ;
    Text [ spanish ] = "Nota al pie anterior" ;
    Text [ french ] = "Note de bas de page précédente" ;
    Text [ dutch ] = "Vorige voetnoot" ;
    Text [ portuguese ] = "Nota de rodapé anterior" ;
    Text[ chinese_simplified ] = "ÉÏÒ»¸ö×¢½Å";
    Text[ russian ] = "Ïðåäûäóùàÿ ñíîñêà";
    Text[ polish ] = "Poprzedni przypis dolny";
    Text[ japanese ] = "‘O‚Ì‹r’";
    Text[ chinese_traditional ] = "¤W¤@­Óµù¸}";
    Text[ arabic ] = "ÇáÍÇÔíÉ ÇáÓÝáíÉ ÇáÓÇÈÞÉ";
    Text[ greek ] = "Ðñïçãïýìåíç õðïóçìåßùóç";
    Text[ korean ] = "ÀÌÀü °¢ÁÖ";
    Text[ turkish ] = "Önceki dipnot";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_MARK_UP
{
    Text = "Voriger Merker" ;
    Text [ English ] = "Previous Reminder" ;
    Text [ english_us ] = "Previous Reminder" ;
    Text [ portuguese_brazilian ] = "Voriger Merker" ;
    Text [ swedish ] = "Föregående temporära bokmärke" ;
    Text [ danish ] = "Forrige påmindelse" ;
    Text [ italian ] = "Contrassegno precedente" ;
    Text [ spanish ] = "Marca anterior" ;
    Text [ french ] = "Pense-bête précédent" ;
    Text [ dutch ] = "Vorig merkteken" ;
    Text [ portuguese ] = "Marca anterior" ;
    Text[ chinese_simplified ] = "ÉÏÒ»¸ö±ê¼Ç";
    Text[ russian ] = "Ïðåäûäóùàÿ ïîìåòêà";
    Text[ polish ] = "Poprzedni znacznik";
    Text[ japanese ] = "‘O‚ÌŠo‚¦Ž~‚ß";
    Text[ chinese_traditional ] = "¤W¤@­Ó´£¿ô";
    Text[ arabic ] = "ÚáÇãÉ ÇáÊÐßíÑ ÇáÓÇÈÞÉ";
    Text[ greek ] = "Ðñïçãïýìåíç õðåíèýìéóç";
    Text[ korean ] = "ÀÌÀü ³ª¸ÓÁö";
    Text[ turkish ] = "Önceki anýmsatýcý";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_POSTIT_UP
{
    Text = "Vorige Notiz" ;
    Text [ English ] = "Previous Annotation" ;
    Text [ english_us ] = "Previous Note" ;
    Text [ portuguese_brazilian ] = "Vorige Notiz" ;
    Text [ swedish ] = "Föregående anteckning" ;
    Text [ danish ] = "Forrige note" ;
    Text [ italian ] = "Nota precedente" ;
    Text [ spanish ] = "Nota anterior" ;
    Text [ french ] = "Note précédente" ;
    Text [ dutch ] = "Vorige aantekening" ;
    Text [ portuguese ] = "Anotação anterior" ;
    Text[ chinese_simplified ] = "ÉÏÒ»¸ö±¸×¢";
    Text[ russian ] = "Ïðåäûäóùåå ïðèìå÷àíèå";
    Text[ polish ] = "Poprzednia notatka";
    Text[ japanese ] = "‘O‚ÌÒÓ";
    Text[ chinese_traditional ] = "¤W¤@­Ó³Æµù";
    Text[ arabic ] = "ÇáãáÇÍÙÉ ÇáÓÇÈÞÉ";
    Text[ greek ] = "Ðñïçãïýìåíç óçìåßùóç";
    Text[ korean ] = "ÀÌÀü ¸Þ¸ð";
    Text[ turkish ] = "Önceki not";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_SRCH_REP_UP
{
    Text = "Rückwärts weitersuchen" ;
    Text [ English ] = "Repeat search backwards" ;
    Text [ english_us ] = "Continue search backwards" ;
    Text [ portuguese_brazilian ] = "Rückwärts weitersuchen" ;
    Text [ swedish ] = "Sök vidare bakåt" ;
    Text [ danish ] = "Fortsæt søgning tilbage" ;
    Text [ italian ] = "Cerca all'indietro" ;
    Text [ spanish ] = "Continuar búsqueda en sentido inverso" ;
    Text [ french ] = "Continuer la recherche vers le haut" ;
    Text [ dutch ] = "Achterwaarts verder zoeken" ;
    Text [ portuguese ] = "Continuar a procura para trás" ;
    Text[ chinese_simplified ] = "¼ÌÐøÏòºóËÑѰ";
    Text[ russian ] = "Îáðàòíûé ïîèñê";
    Text[ polish ] = "Szukaj dalej wstecz";
    Text[ japanese ] = "•¶“ª•ûŒü‚ÉŒŸõ‘±s";
    Text[ chinese_traditional ] = "Ä~Äò¦V«á·j´M";
    Text[ arabic ] = "ãÊÇÈÚÉ ÇáÈÍË ááÎáÝ";
    Text[ greek ] = "ÓõíÝ÷éóç áíáæÞôçóçò ðßóù";
    Text[ korean ] = "°è¼Ó µÚ·Î °Ë»ö";
    Text[ turkish ] = "Geriye doðru ara";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_INDEX_ENTRY_UP
{
    Text = "Voriger Verzeichniseintrag" ;
    Text [ English ] = "Previous index entry" ;
    Text[ italian ] = "Voce d'indice precedente";
    Text[ portuguese_brazilian ] = "Previous index entry";
    Text[ portuguese ] = "Entrada do índice anterior";
    Text[ danish ] = "Forrige indekselement";
    Text[ french ] = "Entrée d'index précédente";
    Text[ swedish ] = "Föregående förteckningspost";
    Text[ dutch ] = "Vorig index item";
    Text[ spanish ] = "Entrada de índice anterior";
    Text[ english_us ] = "Previous index entry";
    Text[ chinese_simplified ] = "ÉÏÒ»¸öĿ¼ÌõÄ¿";
    Text[ russian ] = "Ïðåäûäóùèé ýëåìåíò óêàçàòåëÿ";
    Text[ polish ] = "Poprzedni wpis do indeksu";
    Text[ japanese ] = "‘O‚̍õˆø€–Ú";
    Text[ chinese_traditional ] = "¤W¤@­Ó¥Ø¿ý¶µ¥Ø";
    Text[ arabic ] = "ÇáÅÏÎÇá ÇáÝåÑÓí ÇáÓÇÈÞ";
    Text[ greek ] = "Ðñïçãïýìåíç åããñáöÞ åõñåôçñßïõ";
    Text[ korean ] = "ÀÌÀü »öÀÎ Ç׸ñ";
    Text[ turkish ] = "Önceki dizin giriþi";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_TBLFML_UP
{
    Text = "Vorige Tabellenformel" ;
    Text [ English ] = "Previous table formula" ;
    Text[ english_us ] = "Previous table formula";
    Text[ portuguese ] = "Fórmula de tabela anterior";
    Text[ russian ] = "Ïðåäûäóùàÿ ôîðìóëà òàáëèöû";
    Text[ dutch ] = "Vorige tabellenformule";
    Text[ french ] = "Formule de table précédente";
    Text[ spanish ] = "Fórmula de tabla anterior";
    Text[ italian ] = "Formula tabella precedente";
    Text[ danish ] = "Forrige tabelformel";
    Text[ swedish ] = "Föregående tabellformel";
    Text[ polish ] = "Poprzednia formu³a tabeli";
    Text[ portuguese_brazilian ] = "Previous table formula";
    Text[ japanese ] = "‘O‚Ì•\\‚̐”Ž®";
    Text[ chinese_simplified ] = "ÉÏÒ»¸ö¹¤×÷±í¹«Ê½";
    Text[ chinese_traditional ] = "¤W¤@­Ó¤u§@ªí¤½¦¡";
    Text[ arabic ] = "ÕíÛÉ ÇáÌÏæá ÇáÓÇÈÞÉ";
    Text[ greek ] = "Ðñïçãïýìåíïò ôýðïò ðßíáêá";
    Text[ korean ] = "ÀÌÀü Ç¥ ¼ö½Ä";
    Text[ turkish ] = "Önceki tablo formülü";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_TBLFML_DOWN
{
    Text = "Nächste Tabellenformel" ;
    Text [ English ] = "Next table formula" ;
    Text[ english_us ] = "Next table formula";
    Text[ portuguese ] = "Fórmula de tabela seguinte";
    Text[ russian ] = "Ñëåäóþùàÿ ôîðìóëà òàáëèöû";
    Text[ dutch ] = "Volgende tabellenformule";
    Text[ french ] = "Formule de table suivante";
    Text[ spanish ] = "Siguiente fórmula de tabla";
    Text[ italian ] = "Formula tabella successiva";
    Text[ danish ] = "Næste tabelformel";
    Text[ swedish ] = "Nästa tabellformel";
    Text[ polish ] = "Nastêpna formu³a tabeli";
    Text[ portuguese_brazilian ] = "Next table formula";
    Text[ japanese ] = "ŽŸ‚Ì•\\‚̐”Ž®";
    Text[ chinese_simplified ] = "ÏÂÒ»¸ö¹¤×÷±í¸ñʽ";
    Text[ chinese_traditional ] = "¤U¤@­Ó¤u§@ªí®æ¦¡";
    Text[ arabic ] = "ÕíÛÉ ÇáÌÏæá ÇáÊÇáíÉ";
    Text[ greek ] = "Åðüìåíïò ôýðïò ðßíáêá";
    Text[ korean ] = "´ÙÀ½ Ç¥ ¼ö½Ä";
    Text[ turkish ] = "Sonraki tablo formülü";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_TBLFML_ERR_UP
{
    Text = "Vorige fehlerhafte Tabellenformel" ;
    Text [ English ] = "Previous wrong table formula" ;
    Text[ english_us ] = "Previous faulty table formula";
    Text[ portuguese ] = "Fórmula de tabela anterior errada";
    Text[ russian ] = "Íåïðàâèëüíàÿ ïðåäûäóùàÿ ôîðìóëà òàáëèöû";
    Text[ dutch ] = "Vorige foutieve tabellenformule";
    Text[ french ] = "Formule de table erronée précédente";
    Text[ spanish ] = "Fórmula de tabla anterior errónea";
    Text[ italian ] = "Formula tabella errata precedente";
    Text[ danish ] = "Forrige fejlagtige tabelformel";
    Text[ swedish ] = "Föregående felaktiga tabellformel";
    Text[ polish ] = "Poprzednia b³êdna formu³a tabeli";
    Text[ portuguese_brazilian ] = "Previous wrong table formula";
    Text[ japanese ] = "‘O‚̐³‚µ‚­‚È‚¢•\\‚̐”Ž®";
    Text[ chinese_simplified ] = "ÉÏÒ»¸ö´íÎóµÄ¹¤×÷±í¹«Ê½";
    Text[ chinese_traditional ] = "¤W¤@­Ó¿ù»~ªº¤u§@ªí®æ¦¡";
    Text[ arabic ] = "ÕíÛÉ ÇáÌÏæá ÇáÎÇØÆÉ ÇáÓÇÈÞÉ";
    Text[ greek ] = "Ðñïçãïýìåíïò ëáíèáóìÝíïò ôýðïò ðßíáêá";
    Text[ korean ] = "À߸øµÈ ÀÌÀü Ç¥ ¼ö½Ä";
    Text[ turkish ] = "Önceki hatalý tablo formülü";
    Text[ language_user1 ] = " ";
};
String STR_IMGBTN_TBLFML_ERR_DOWN
{
    Text = "Nächste fehlerhafte Tabellenformel" ;
    Text [ English ] = "Next wrong table formula" ;
    Text[ english_us ] = "Next faulty table formula";
    Text[ portuguese ] = "Fórmula de tabela seguinte errada";
    Text[ russian ] = "Íåïðàâèëüíàÿ ñëåäóþùàÿ ôîðìóëà òàáëèöû";
    Text[ dutch ] = "Volgende foutieve tabellenformule";
    Text[ french ] = "Formule de table erronée suivante";
    Text[ spanish ] = "Siguiente fórmula errónea de tabla";
    Text[ italian ] = "Formula tabella errata successiva";
    Text[ danish ] = "Næste fejlagtige tabelformel";
    Text[ swedish ] = "Nästa felaktiga tabellformel";
    Text[ polish ] = "Nastêpna b³êdna formu³a tabeli";
    Text[ portuguese_brazilian ] = "Next wrong table formula";
    Text[ japanese ] = "ŽŸ‚̐³‚µ‚­‚È‚¢•\\‚̐”Ž®";
    Text[ chinese_simplified ] = "ÏÂÒ»¸ö´íÎóµÄ¹¤×÷±í¸ñʽ";
    Text[ chinese_traditional ] = "¤U¤@­Ó¿ù»~ªº¤u§@ªí®æ¦¡";
    Text[ arabic ] = "ÕíÛÉ ÇáÌÏæá ÇáÎÇØÆÉ ÇáÊÇáíÉ";
    Text[ greek ] = "Åðüìåíïò ëáíèáóìÝíïò ôýðïò ðßíáêá";
    Text[ korean ] = "À߸øµÈ ´ÙÀ½ Ç¥ ¼ö½Ä";
    Text[ turkish ] = "Sonraki hatalý tablo formülü";
    Text[ language_user1 ] = " ";
};
ImageButton BTN_NAVI
{
    HelpID = HID_NAVIGATION_IMGBTN ;
    SVLOOK = TRUE ;
    HIDE = TRUE ;
    RectStyle = TRUE ;
    SmallStyle = TRUE ;
    Image IMG_BTN
    {
        ImageBitmap = Bitmap { File = "punkt.bmp" ; };
    };
    String ST_QUICK
    {
        Text [ english_us ] = "Navigation" ;
        Text [ portuguese_brazilian ] = "Navigation" ;
        Text [ swedish ] = "Navigation" ;
        Text [ danish ] = "Navigation" ;
        Text [ italian ] = "Navigazione" ;
        Text [ spanish ] = "Navegación" ;
        Text [ french ] = "Navigation" ;
        Text [ dutch ] = "Navigatie" ;
        Text [ portuguese ] = "Navegação" ;
        Text = "Navigation" ;
        Text[ chinese_simplified ] = "ä¯ÀÀ";
        Text[ russian ] = "Íàâèãàöèÿ";
        Text[ polish ] = "Nawigacja";
        Text[ japanese ] = "ÅËÞ¹Þ°¼®Ý";
        Text[ chinese_traditional ] = "ÂsÄý";
        Text[ arabic ] = "ÇáãáÇÍÉ";
        Text[ greek ] = "Ìåôáêßíçóç";
        Text[ korean ] = "³×ºñ°ÔÀ̼Ç";
        Text[ turkish ] = "Dolaþma";
        Text[ language_user1 ] = " ";
    };
};
diff --git a/sw/source/ui/shells/basesh.cxx b/sw/source/ui/shells/basesh.cxx
new file mode 100644
index 0000000..5c3e1a4b
--- /dev/null
+++ b/sw/source/ui/shells/basesh.cxx
@@ -0,0 +1,2507 @@
/*************************************************************************
 *
 *  $RCSfile: basesh.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:46 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop
#include <sot/factory.hxx>
#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _UIPARAM_HXX
#include <uiparam.hxx>
#endif
#ifndef SVTOOLS_URIHELPER_HXX
#include <svtools/urihelper.hxx>
#endif


#ifndef _SVXLINKMGR_HXX //autogen
#include <svx/linkmgr.hxx>
#endif
#ifndef _SVX_HTMLMODE_HXX //autogen
#include <svx/htmlmode.hxx>
#endif
#ifndef _IMAPDLG_HXX_ //autogen
#include <svx/imapdlg.hxx>
#endif
#ifndef _SBASLTID_HRC //autogen
#include <offmgr/sbasltid.hrc>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _EXPLORER_HXX //autogen
#include <sfx2/explorer.hxx>
#endif
#ifndef _SFX_BINDINGS_HXX //autogen
#include <sfx2/bindings.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SFX_WHITER_HXX //autogen
#include <svtools/whiter.hxx>
#endif
#ifndef _SFX_OBJITEM_HXX //autogen
#include <sfx2/objitem.hxx>
#endif
#ifndef _FILTER_HXX //autogen
#include <svtools/filter.hxx>
#endif
#ifndef _GALLERY_HXX_ //autogen
#include <svx/gallery.hxx>
#endif
#ifndef _CLIP_HXX //autogen
#include <vcl/clip.hxx>
#endif
#ifndef _CONTDLG_HXX_ //autogen
#include <svx/contdlg.hxx>
#endif
#ifndef _GRAPH_HXX //autogen
#include <vcl/graph.hxx>
#endif
#ifndef _SVX_IMPGRF_HXX //autogen
#include <svx/impgrf.hxx>
#endif
#ifndef _SFXSLSTITM_HXX //autogen
#include <svtools/slstitm.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SFXPTITEM_HXX //autogen
#include <svtools/ptitem.hxx>
#endif
#ifndef _POLY_HXX //autogen
#include <vcl/poly.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _SVX_COLRITEM_HXX //autogen
#include <svx/colritem.hxx>
#endif
#ifndef _SVX_SHADITEM_HXX //autogen
#include <svx/shaditem.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_SRCHITEM_HXX
#include <svx/srchitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _SVX_OPAQITEM_HXX //autogen
#include <svx/opaqitem.hxx>
#endif
#ifndef _SVX_SIZEITEM_HXX //autogen
#include <svx/sizeitem.hxx>
#endif
#ifndef _SVX_BORDER_HXX
#include <svx/border.hxx>
#endif

#ifndef _FMTURL_HXX //autogen
#include <fmturl.hxx>
#endif
#ifndef _FMTHDFT_HXX //autogen
#include <fmthdft.hxx>
#endif
#ifndef _FMTCLDS_HXX //autogen
#include <fmtclds.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _SWUNDO_HXX
#include <swundo.hxx>
#endif
#ifndef _FLDBAS_HXX
#include <fldbas.hxx>
#endif
#ifndef _UITOOL_HXX
#include <uitool.hxx>
#endif
#ifndef _BASESH_HXX
#include <basesh.hxx>
#endif
#ifndef _VIEWOPT_HXX
#include <viewopt.hxx>
#endif
#ifndef _CHANGEDB_HXX
#include <changedb.hxx>
#endif
#ifndef _BOOKMARK_HXX
#include <bookmark.hxx>
#endif
#ifndef _BOOKMRK_HXX
#include <bookmrk.hxx>
#endif
#ifndef _DOCSTAT_HXX
#include <docstat.hxx>
#endif
#ifndef _USRFLD_HXX
#include <usrfld.hxx>
#endif
#ifndef _EXPFLD_HXX
#include <expfld.hxx>
#endif
#ifndef _FLDMGR_HXX
#include <fldmgr.hxx>
#endif
#ifndef _FRMMGR_HXX
#include <frmmgr.hxx>
#endif
#ifndef _TABLEMGR_HXX
#include <tablemgr.hxx>
#endif
#ifndef _MDIEXP_HXX
#include <mdiexp.hxx>
#endif
#ifndef _DATAEX_HXX
#include <dataex.hxx>
#endif
#ifndef _PAGEDESC_HXX
#include <pagedesc.hxx>
#endif
#ifndef _CONVERT_HXX
#include <convert.hxx>
#endif
#ifndef _PATTERN_HXX
#include <pattern.hxx>
#endif
#ifndef _UIBORDER_HXX
#include <uiborder.hxx>
#endif
#ifndef _FMTCOL_HXX
#include <fmtcol.hxx>
#endif
#ifndef _EDTWIN_HXX
#include <edtwin.hxx>
#endif
#ifndef _TBLAFMT_HXX
#include <tblafmt.hxx>
#endif
#ifndef _CAPTION_HXX
#include <caption.hxx>
#endif
#ifndef _SWWAIT_HXX
#include <swwait.hxx>
#endif

#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif
#ifndef _SHELLS_HRC
#include <shells.hrc>
#endif
#ifndef _STATSTR_HRC
#include <statstr.hrc>
#endif
#ifndef _GLOBALS_H
#include <globals.h>
#endif

#ifdef OS2
#include <vcl/sysdep.hxx>
#endif
#ifndef _FSYS_HXX
#include <tools/fsys.hxx>
#endif

USHORT SwBaseShell::nFrameMode = FLY_DRAG_END;
#define C2S(cChar) UniString::CreateFromAscii(cChar)

//Fuer die Erkennung der Id, die variable von Gallery mit SID_GALLERY_BG_BRUSH
//ankommt.
static BYTE nParagraphPos;
static BYTE nGraphicPos;
static BYTE nOlePos;
static BYTE nFramePos;
static BYTE nTablePos;
static BYTE nTableRowPos;
static BYTE nTableCellPos;
static BYTE nPagePos;
static BYTE nHeaderPos;
static BYTE nFooterPos;

//!!OS: das muss ein if/else bleiben, weil BLC das nicht anders versteht
#define SVDATAOBJ                                                       \
    SvDataObjectRef xObj;                                               \
    if ( Clipboard::GetFormatCount() )                                  \
    {                                                                   \
        SwModule* pMod = SW_MOD();                                      \
        if ( pMod->pClipboard )                                         \
            xObj = pMod->pClipboard ;                                   \
        else                                                            \
            xObj = SvDataObject::PasteClipboard();                      \
    }

#define Interior
#include <svx/svxslots.hxx>

#define SwBaseShell
#define Shadow
#include "itemdef.hxx"
#include "swslots.hxx"

#define SWCONTOURDLG(rView) ( (SvxContourDlg*) ( rView.GetViewFrame()->GetChildWindow(  \
                          SvxContourDlgChildWindow::GetChildWindowId() )->  \
                          GetWindow() ) )

#define SWIMAPDLG(rView) ( (SvxIMapDlg*) ( rView.GetViewFrame()->GetChildWindow(        \
                        SvxIMapDlgChildWindow::GetChildWindowId() )->   \
                        GetWindow() ) )

SFX_IMPL_INTERFACE(SwBaseShell, SfxShell, SW_RES(0))
{
    SFX_CHILDWINDOW_REGISTRATION(SvxIMapDlgChildWindow::GetChildWindowId());
    SFX_CHILDWINDOW_REGISTRATION(SvxContourDlgChildWindow::GetChildWindowId());
}

TYPEINIT1(SwBaseShell,SfxShell)

/*--------------------------------------------------------------------
    Beschreibung:   statics
 --------------------------------------------------------------------*/


void lcl_UpdateIMapDlg(SwWrtShell& rSh)
{
    Graphic aGrf(rSh.GetIMapGraphic());
    TargetList* pList = new TargetList;
    rSh.GetView().GetViewFrame()->GetTopFrame()->GetTargetList(*pList);

    SfxItemSet aSet( rSh.GetAttrPool(), RES_URL, RES_URL );
    rSh.GetFlyFrmAttr( aSet );
    const SwFmtURL &rURL = (SwFmtURL&)aSet.Get( RES_URL );
    SvxIMapDlgChildWindow::UpdateIMapDlg(
            aGrf, rURL.GetMap(), pList, rSh.GetIMapInventor() );

    USHORT nCount = (USHORT)pList->Count();
    if(nCount)
        for( USHORT i = nCount; i; i--  )
        {
            delete pList->GetObject(i-1);
        }
    delete pList;
}


BOOL lcl_UpdateContourDlg( SwWrtShell &rSh, int nSel )
{
    Graphic aGraf( rSh.GetIMapGraphic() );
    BOOL bRet = GRAPHIC_NONE != aGraf.GetType();
    if( bRet )
    {
        String aGrfName;
        if ( nSel & SwWrtShell::SEL_GRF )
            rSh.GetGrfNms( &aGrfName, 0 );

        SvxContourDlg *pDlg = SWCONTOURDLG(rSh.GetView());
        pDlg->Update( aGraf, aGrfName.Len() > 0,
                  rSh.GetGraphicPolygon(), rSh.GetIMapInventor() );
    }
    return bRet;
}

/*--------------------------------------------------------------------
    Beschreibung:   Alle Items disablen, wird auch aus anderen Source gerufen
 --------------------------------------------------------------------*/

void DisableAllItems(SfxItemSet &rSet)
{
    SfxWhichIter aIter(rSet);

    USHORT nWhich = aIter.FirstWhich();
    ASSERT(nWhich, leeres Set);
    while(nWhich)
    {
        rSet.DisableItem(nWhich);
        nWhich = aIter.NextWhich();
    }
}

/*--------------------------------------------------------------------
    Beschreibung:   loeschen
 --------------------------------------------------------------------*/

void SwBaseShell::ExecDelete(SfxRequest &rReq)
{
    SwWrtShell &rSh = GetShell();
    switch(rReq.GetSlot())
    {
        case SID_DELETE:
            rSh.DelRight(TRUE);
            break;

        case FN_BACKSPACE:

            if( rSh.IsNoNum() )
            {
                rSh.SttCrsrMove();
                BOOL bLeft = rSh.Left( TRUE );
                if( bLeft )
                {
                    // JP 28.03.96: ein Backspace im Absatz ohne Nummer wird zum Delete
                    rSh.SwapPam();
                    rSh.DelRight( FALSE );
                }
                else
                    // JP 15.07.96: wenns nicht mehr nach vorne geht, die
                    //              Numerierung aufheben. Z.B. am Doc-/
                    //              Rahmen-/Tabellen-/Bereichs-Anfang
                    rSh.DelNumRules();

                rSh.EndCrsrMove();
                break;
            }

            // ansonsten DelLeft rufen
        case FN_SHIFT_BACKSPACE:
            rSh.DelLeft();
            break;
        default:
            DBG_ERROR("falscher Dispatcher");
            return;
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwBaseShell::ExecClpbrd(SfxRequest &rReq)
{
    //Achtung: Suizid gefaehrdet! Nach Paste, Paste special kann der die
    //Shell zerstoert sein.


    SwWrtShell &rSh = GetShell();
    USHORT nId = rReq.GetSlot();
    switch( nId )
    {
        case SID_CUT:
        case SID_COPY:
            rView.GetEditWin().FlushInBuffer( &rSh );
            if ( rSh.HasSelection() )
            {
                SwDataExchangeRef aDataEx( new SwDataExchange( rSh ) );
                if ( nId == SID_CUT )
                    aDataEx->Cut();
                else
                    aDataEx->Copy( FALSE );
                break;
            }
            return;

        case SID_PASTE:
            {
                SVDATAOBJ;
                if ( xObj.Is() && SwDataExchange::IsPaste( GetShell(), *xObj ) )
                {
                    // temp. Variablen, da die Shell nach dem Paste schon
                    // zerstoert sein kann
                    SwView* pView = &rView;
                    SwDataExchange::Paste( rSh, *xObj );
                    if( rSh.IsFrmSelected() || rSh.IsObjSelected())
                        rSh.EnterSelFrmMode();
                    pView->AttrChangedNotify(&rSh);
                }
                else
                    return;
            }
            break;
        case FN_PASTESPECIAL:
            {
                SVDATAOBJ;
                int nRet;
                if ( xObj.Is() &&
                     SwDataExchange::IsPasteSpecial( rSh, *xObj ) )
                {
                    // temp. Variablen, da die Shell nach dem Paste schon
                    // zerstoert sein kann
                    SwView* pView = &rView;

                    nRet = SwDataExchange::PasteSpecial( rSh, *xObj );
                    if (rSh.IsFrmSelected() || rSh.IsObjSelected())
                        rSh.EnterSelFrmMode();
                    pView->AttrChangedNotify(&rSh);
                }
                else
                    return;
                rReq.SetReturnValue(SfxInt16Item(nId, nRet));
            }
            break;
        default:
            DBG_ERROR("falscher Dispatcher");
            return;
    }
}

/*--------------------------------------------------------------------
    Beschreibung:   ClipBoard-Status
 --------------------------------------------------------------------*/

void SwBaseShell::StateClpbrd(SfxItemSet &rSet)
{
    SwWrtShell &rSh = GetShell();
    SfxWhichIter aIter(rSet);

    const BOOL bCopy = rSh.HasSelection();
    SVDATAOBJ;

    USHORT nWhich = aIter.FirstWhich();

    while(nWhich)
    {
        switch(nWhich)
        {
            case SID_CUT:
                if (rSh.IsSelObjProtected( (FlyProtectType)(FLYPROTECT_CONTENT|FLYPROTECT_PARENT) ) != 0)
                {
                    rSet.DisableItem( nWhich );
                    break;
                }
            case SID_COPY:
                if( !bCopy )
                    rSet.DisableItem( nWhich );
                break;
            case SID_PASTE:
                if( !xObj.Is() || !SwDataExchange::IsPaste( rSh, *xObj))
                    rSet.DisableItem( SID_PASTE );
                break;
            case FN_PASTESPECIAL:
                if( !xObj.Is() ||
                    !SwDataExchange::IsPasteSpecial( rSh, *xObj ) )
                    rSet.DisableItem( FN_PASTESPECIAL );
                break;
        }
        nWhich = aIter.NextWhich();
    }
}

/*--------------------------------------------------------------------
    Beschreibung:   Undo ausfuehren
 --------------------------------------------------------------------*/

void SwBaseShell::ExecUndo(SfxRequest &rReq)
{
    SwWrtShell &rSh = GetShell();
    switch(rReq.GetSlot())
    {
        case SID_UNDO:
            rSh.Do( SwWrtShell::UNDO );
            break;

        case SID_REDO:
            rSh.Do( SwWrtShell::REDO );
            break;

        case SID_REPEAT:
            rSh.Do( SwWrtShell::REPEAT );
            break;

        default:
            DBG_ERROR("falscher Dispatcher");
            return;
    }
}

/*--------------------------------------------------------------------
    Beschreibung:   Zustand Undo
 --------------------------------------------------------------------*/

void SwBaseShell::StateUndo(SfxItemSet &rSet)
{
    SwWrtShell &rSh = GetShell();
    SfxWhichIter aIter(rSet);
    USHORT nWhich = aIter.FirstWhich();
    while(nWhich)
    {
        switch(nWhich)
        {
            case SID_UNDO:
            {
                if(rSh.GetUndoIds())
                    rSet.Put(SfxStringItem(nWhich,
                        rSh.GetDoString(SwWrtShell::UNDO)));
                else
                    rSet.DisableItem(nWhich);
                break;
            }
            case SID_REDO:
            {
                if(rSh.GetRedoIds())
                    rSet.Put(SfxStringItem(nWhich,
                        rSh.GetDoString(SwWrtShell::REDO)));
                else
                    rSet.DisableItem(nWhich);
                break;
            }
            case SID_REPEAT:
            {   // Repeat nur moeglich wenn kein REDO moeglich - UI-Restriktion
                if(rSh.GetRedoIds() == 0 &&
                    !rSh.IsSelFrmMode() &&
                    rSh.GetRepeatIds() )
                    rSet.Put(SfxStringItem(nWhich, rSh.GetRepeatString()));
                else
                    rSet.DisableItem(nWhich);
                break;
            }
        }
        nWhich = aIter.NextWhich();
    }
}

/*--------------------------------------------------------------------
    Beschreibung:   Slot-Id auswerten bzw. Dispatchen
 --------------------------------------------------------------------*/

void SwBaseShell::Execute(SfxRequest &rReq)
{
    const SfxPoolItem *pItem;
    SwWrtShell &rSh = GetShell();
    const SfxItemSet* pArgs = rReq.GetArgs();
    BOOL bUp = FALSE;
    BOOL bMore = FALSE;

    USHORT nSlot = rReq.GetSlot();
    switch(nSlot)
    {
        case FN_REPAGINATE:
            rSh.CalcLayout();
            break;
        case FN_UPDATE_FIELDS:
            {
                SwDocStat aDocStat;
                rSh.UpdateDocStat(aDocStat);
                rSh.EndAllTblBoxEdit();
                rSh.ViewShell::UpdateFlds(TRUE);

                if( rSh.IsCrsrInTbl() )
                {
                    if( !rSh.IsTblComplexForChart() )
                        SwTableFUNC( &rSh, FALSE).UpdateChart();
                    rSh.ClearTblBoxCntnt();
                    rSh.SaveTblBoxCntnt();
                }
            }
            break;
        case FN_UPDATE_CHARTS:
            {
                SwWait aWait( *rView.GetDocShell(), TRUE );
                rSh.UpdateAllCharts();
            }
            break;

        case FN_UPDATE_ALL:
            {
                rSh.EnterStdMode();
                if( rSh.GetLinkManager().GetLinks().Count() )
                {
                    rSh.StartAllAction();
                    rSh.GetLinkManager().UpdateAllLinks( FALSE, TRUE, TRUE );
                    rSh.EndAllAction();
                }
                SfxDispatcher &rDis = *GetView().GetViewFrame()->GetDispatcher();
                rDis.Execute( FN_UPDATE_FIELDS );
                rDis.Execute( FN_UPDATE_TOX );
                rDis.Execute( FN_UPDATE_CHARTS );
                rSh.CalcLayout();
            }
            break;

        case FN_UPDATE_INPUTFIELDS:
            rSh.UpdateInputFlds(NULL, FALSE);
            break;
        case FN_PREV_BOOKMARK:
            rReq.SetReturnValue(SfxBoolItem( nSlot, rSh.GoPrevBookmark()));
            break;
        case FN_NEXT_BOOKMARK:
            rReq.SetReturnValue(SfxBoolItem( nSlot, rSh.GoNextBookmark()));
            break;

        case FN_GOTO_NEXT_MARK:
        case FN_GOTO_PREV_MARK:
        {
            SwFldMgr aFldMgr;
            SwFieldType* pFldType = aFldMgr.GetFldType(RES_JUMPEDITFLD);

            if (pFldType)
            {
                if (rSh.IsSelFrmMode())
                {
                    rSh.UnSelectFrm();
                    rSh.LeaveSelFrmMode();
                }

                if (rSh.HasMark())
                {
                    MV_KONTEXT(&rSh);
                    if (rSh.IsCrsrPtAtEnd())
                        rSh.SwapPam();
                    rSh.ClearMark();
                    rSh.EndSelect();
                }
                BOOL bRet = rSh.MoveFldType(pFldType, nSlot == FN_GOTO_NEXT_MARK);
                if (bRet)
                    rSh.ClickToField(*rSh.GetCurFld());
                rReq.SetReturnValue(SfxBoolItem( nSlot, bRet));
            }
        }
        break;

        case FN_START_DOC_DIRECT:
        case FN_END_DOC_DIRECT:
        {
            if (rSh.IsSelFrmMode())
            {
                rSh.UnSelectFrm();
                rSh.LeaveSelFrmMode();
            }
            rSh.EnterStdMode();
            nSlot == FN_START_DOC_DIRECT ?
                rSh.SwCrsrShell::SttDoc() :
                    rSh.SwCrsrShell::EndDoc();
        }
        break;
        case FN_GOTO_PREV_OBJ:
        case FN_GOTO_NEXT_OBJ:
        {
                BOOL bSuccess = rSh.GotoObj(
                            nSlot == FN_GOTO_NEXT_OBJ ? TRUE : FALSE);
                rReq.SetReturnValue(SfxBoolItem(nSlot, bSuccess));
                if (bSuccess && !rSh.IsSelFrmMode())
                {
                    rSh.HideCrsr();
                    rSh.EnterSelFrmMode();
                    GetView().AttrChangedNotify( &rSh );
                }
        }
        break;
        case SID_GALLERY_FORMATS:
        {
            const int nSelType = rSh.GetSelectionType();
            if ( !rSh.IsSelFrmMode() || nSelType & SwWrtShell::SEL_GRF )
            {
                if( SFX_ITEM_SET == pArgs->GetItemState( nSlot, TRUE, &pItem) &&
                    SGA_FORMAT_GRAPHIC & ((SfxUInt32Item*)pItem)->GetValue())
                {

                    GalleryExplorer* pGal = SVX_GALLERY();

                    if ( pGal )
                    {
                        SwWait aWait( *rView.GetDocShell(), TRUE );

                        String aGrfName, aFltName;
                        const Graphic aGrf( pGal->GetGraphic() );

                        if( pGal->IsLinkage() )
                        {
                            // Verknuepft
                            aGrfName = pGal->GetURL().PathToFileName();
                            aGrfName = URIHelper::SmartRelToAbs(aGrfName);
                            aFltName = pGal->GetFilterName();
                        }

                        if ( nSelType & SwWrtShell::SEL_GRF )
                            rSh.ReRead( aGrfName, aFltName, &aGrf );
                        else
                            rSh.Insert( aGrfName, aFltName, aGrf );

                        GetView().GetEditWin().GrabFocus();
                    }
                }
            }
        }
        break;
        case FN_PAGE_STYLE_SET_COLS:
        {
            if (pArgs)
            {
                // aktuellen PageDescriptor ermitteln und damit den Set fuellen
                const USHORT nCurIdx = rSh.GetCurPageDesc();
                SwPageDesc aPageDesc(rSh.GetPageDesc(nCurIdx));

                SwFrmFmt &rFmt = aPageDesc.GetMaster();

                SwFmtCol aFmtCol = rFmt.GetCol();

                USHORT nCount;
                if(SFX_ITEM_SET == pArgs->GetItemState(nSlot))
                    nCount = ((SfxUInt16Item &)pArgs->Get(nSlot)).GetValue();
                else
                    nCount = ((SfxUInt16Item &)pArgs->Get(SID_ATTR_COLUMNS)).GetValue();
                USHORT nGutterWidth = DEF_GUTTER_WIDTH;

                aFmtCol.Init(nCount ? nCount : 1, nGutterWidth, USHRT_MAX);
                aFmtCol.SetWishWidth(USHRT_MAX);
                aFmtCol.SetGutterWidth(nGutterWidth, USHRT_MAX);

                rFmt.SetAttr(aFmtCol);

                rSh.ChgPageDesc(nCurIdx, aPageDesc);
            }
            else
                GetView().GetViewFrame()->GetDispatcher()->Execute(FN_FORMAT_PAGE_COLUMN_DLG, FALSE);
        }
        break;
        case FN_CONVERT_TEXT_TABLE:
        {
            char cDelim = 0;
            USHORT nInsTblFlags = ALL_TBL_INS_ATTR;
            SwTableAutoFmt* pTAFmt = 0;
            SwConvertTableDlg *pDlg = new SwConvertTableDlg( GetView() );
            if( RET_OK == pDlg->Execute() )
            {
                pDlg->GetValues( cDelim, nInsTblFlags, pTAFmt );

            }
            delete pDlg;

            if( cDelim )
            {
                //Shellwechsel!
                SwView& rSaveView = rView;
                BOOL bInserted = FALSE;
                if( rSh.GetTableFmt() )
                    rSh.TableToText( cDelim );
                else
                    bInserted = rSh.TextToTable( cDelim, HORI_FULL,
                                                nInsTblFlags, pTAFmt );
                rSh.EnterStdMode();

                if( bInserted )
                    rSaveView.AutoCaption( TABLE_CAP );
            }
            delete pTAFmt;
        }
        break;
        case SID_STYLE_WATERCAN:
        case SID_STYLE_UPDATE_BY_EXAMPLE:
        case SID_STYLE_NEW_BY_EXAMPLE:
        case SID_STYLE_APPLY:
        {
            ShellModes eMode = GetView().GetShellMode();
            if ( SEL_DRAW != eMode &&
                 SEL_DRAW_CTRL != eMode &&
                 SEL_DRAW_FORM != eMode &&
                 SEL_DRAWTEXT != eMode &&
                 SEL_BEZIER != eMode )
            {
                // wird von der DocShell aufgezeichnet
                GetView().GetDocShell()->ExecStyleSheet(rReq);
            }
        }
        break;
        case FN_ESCAPE:
            GetView().ExecuteSlot(rReq);
        break;
        case SID_IMAP:
        {
            USHORT      nId = SvxIMapDlgChildWindow::GetChildWindowId();

            SfxViewFrame* pVFrame = GetView().GetViewFrame();
            pVFrame->ToggleChildWindow( nId );
            pVFrame->GetBindings().Invalidate( SID_IMAP );

            if ( pVFrame->HasChildWindow( nId ) && rSh.IsFrmSelected() )
                lcl_UpdateIMapDlg(rSh);
        }
        break;
        case SID_IMAP_EXEC:
        {
            SvxIMapDlg* pDlg = SWIMAPDLG(GetView());

            // Kontrolle, ob Zuweisung ueberhaupt sinnvoll/erlaubt
            if ( rSh.IsFrmSelected() &&
                 pDlg->GetEditingObject() == rSh.GetIMapInventor() )
            {
                    SfxItemSet aSet( rSh.GetAttrPool(), RES_URL, RES_URL );
                    rSh.GetFlyFrmAttr( aSet );
                    SwFmtURL aURL( (SwFmtURL&)aSet.Get( RES_URL ) );
                    aURL.SetMap( &pDlg->GetImageMap() );
                    aSet.Put( aURL );
                    rSh.SetFlyFrmAttr( aSet );
            }
        }
        break;
        case SID_CONTOUR_DLG:
        {
            USHORT nId = SvxContourDlgChildWindow::GetChildWindowId();

            SfxViewFrame* pVFrame = GetView().GetViewFrame();
            pVFrame->ToggleChildWindow( nId );
            pVFrame->GetBindings().Invalidate( SID_CONTOUR_DLG );

            int nSel = rSh.GetSelectionType();
            if ( pVFrame->HasChildWindow( nId ) &&
                 (nSel & (SwWrtShell::SEL_GRF|SwWrtShell::SEL_OLE)) )
            {
                lcl_UpdateContourDlg( rSh, nSel );
            }
        }
        break;
        case SID_CONTOUR_EXEC:
        {
            SvxContourDlg *pDlg = SWCONTOURDLG(GetView());

            // Kontrolle, ob Zuweisung ueberhaupt sinnvoll/erlaubt
            int nSel = rSh.GetSelectionType();
            if ( nSel & (SwWrtShell::SEL_GRF|SwWrtShell::SEL_OLE) )
            {
                if ( pDlg->GetEditingObject() == rSh.GetIMapInventor() )
                {
                    rSh.StartAction();
                    SfxItemSet aSet( rSh.GetAttrPool(), RES_SURROUND, RES_SURROUND);
                    rSh.GetFlyFrmAttr( aSet );
                    SwFmtSurround aSur( (SwFmtSurround&)aSet.Get( RES_SURROUND ) );
                    if ( !aSur.IsContour() )
                    {
                        aSur.SetContour( TRUE );
                        if ( aSur.GetSurround() == SURROUND_NONE )
                            aSur.SetSurround( SURROUND_PARALLEL );
                        aSet.Put( aSur );
                        rSh.SetFlyFrmAttr( aSet );
                    }
                    const PolyPolygon aPoly( pDlg->GetPolyPolygon() );
                    rSh.SetGraphicPolygon( &aPoly );
                    if ( pDlg->IsGraphicChanged() )
                        rSh.ReRead( aEmptyStr, aEmptyStr, &pDlg->GetGraphic());
                    rSh.EndAction();
                }
            }
        }
        break;
        case FN_FRAME_TO_ANCHOR:
        {
            rSh.GotoFlyAnchor();
            rSh.EnterStdMode();
            rSh.CallChgLnk();
        }
        break;
        case FN_TOOL_ANKER:
            break;
        case FN_TOOL_ANKER_PAGE:
        case FN_TOOL_ANKER_PARAGRAPH:
        case FN_TOOL_ANKER_CHAR:
        case FN_TOOL_ANKER_AT_CHAR:
        case FN_TOOL_ANKER_FRAME:
        {
            RndStdIds eSet = nSlot == FN_TOOL_ANKER_PAGE
                                ? FLY_PAGE
                                : nSlot == FN_TOOL_ANKER_PARAGRAPH
                                    ? FLY_AT_CNTNT
                                    : nSlot == FN_TOOL_ANKER_FRAME
                                        ? FLY_AT_FLY
                                        : nSlot == FN_TOOL_ANKER_CHAR
                                            ? FLY_IN_CNTNT
                                            : FLY_AUTO_CNTNT;
            rSh.StartUndo();
            if( rSh.IsObjSelected() )
                rSh.ChgAnchor( eSet );
            else if( rSh.IsFrmSelected() )
            {
                // Der Set beinhaltet auch VERT/HORI_ORIENT, da in FEShell::
                // SetFlyFrmAttr/SetFlyFrmAnchor ggf. als Folge des Umankerns
                // die Ausrichtungen veraendert werden sollen.
                SfxItemSet aSet( GetPool(), RES_VERT_ORIENT, RES_ANCHOR );
                SwFmtAnchor aAnc( eSet, rSh.GetPhyPageNum() );
                aSet.Put( aAnc );
                rSh.SetFlyFrmAttr(aSet);
            }

            USHORT nHtmlMode = ::GetHtmlMode(GetView().GetDocShell());
            if( nHtmlMode )
            {
                SfxItemSet aSet(GetPool(), RES_SURROUND, RES_HORI_ORIENT);
                rSh.GetFlyFrmAttr(aSet);

                const SwFmtSurround& rSurround = (const SwFmtSurround&)aSet.Get(RES_SURROUND);
                const SwFmtVertOrient& rVert = (const SwFmtVertOrient&)aSet.Get(RES_VERT_ORIENT);
                const SwFmtHoriOrient& rHori = (const SwFmtHoriOrient&)aSet.Get(RES_HORI_ORIENT);
                SwVertOrient eVOrient = rVert.GetVertOrient();
                SwHoriOrient eHOrient = rHori.GetHoriOrient();
                SwSurround eSurround = rSurround.GetSurround();

                switch( eSet )
                {
                case FLY_AT_FLY:
                case FLY_PAGE:

                    //Durchlauf, links oder von links, oben, von oben
                    if(eSurround != SURROUND_THROUGHT)
                        aSet.Put(SwFmtSurround(SURROUND_THROUGHT));

                    if( eVOrient != VERT_TOP && eVOrient != VERT_NONE)
                        aSet.Put(SwFmtVertOrient(0, VERT_TOP));

                    if(eHOrient != HORI_NONE || eHOrient != HORI_LEFT)
                        aSet.Put(SwFmtHoriOrient(0, HORI_LEFT));
                    break;

                case FLY_AT_CNTNT:
                    //links, von links, rechts, oben, kein Uml, li+re Umlauf,
                    if(eSurround != SURROUND_LEFT || eSurround != SURROUND_RIGHT)
                        aSet.Put(SwFmtSurround(SURROUND_LEFT));

                    if( eVOrient != VERT_TOP)
                        aSet.Put(SwFmtVertOrient(0, VERT_TOP));

                    if(eHOrient != HORI_NONE || eHOrient != HORI_LEFT || eHOrient != HORI_RIGHT)
                        aSet.Put(SwFmtHoriOrient(0, HORI_LEFT));
                    break;

                case FLY_AUTO_CNTNT:
                    //links, von links, rechts, oben,  Durchlauf
                    if(eSurround != SURROUND_THROUGHT)
                        aSet.Put(SwFmtSurround(SURROUND_THROUGHT));

                    if( eVOrient != VERT_TOP)
                        aSet.Put(SwFmtVertOrient(0, VERT_TOP));

                    if(eHOrient != HORI_NONE || eHOrient != HORI_LEFT || eHOrient != HORI_RIGHT)
                        aSet.Put(SwFmtHoriOrient(0, HORI_LEFT));
                    break;
                }

                if( aSet.Count() )
                    rSh.SetFlyFrmAttr( aSet );
            }
            rSh.EndUndo();

            GetView().GetViewFrame()->GetBindings().Invalidate( FN_TOOL_ANKER );
        }
        break;

        case FN_FRAME_NOWRAP:
        case FN_FRAME_WRAP:
        case FN_FRAME_WRAP_IDEAL:
        case FN_FRAME_WRAPTHRU:
        case FN_FRAME_WRAPTHRU_TRANSP:
        case FN_FRAME_WRAP_CONTOUR:
        case FN_WRAP_ANCHOR_ONLY:
        case FN_FRAME_WRAP_LEFT:
        case FN_FRAME_WRAP_RIGHT:
            SetWrapMode( nSlot );
            break;

        case FN_UPDATE_ALL_LINKS:
            {
                if( rSh.GetLinkManager().GetLinks().Count() )
                {
                    BOOL bUpdateGrf = FALSE, bCallErrHdl = FALSE;
                    rSh.EnterStdMode();
                    rSh.StartAllAction();
                    rSh.GetLinkManager().UpdateAllLinks( FALSE, bCallErrHdl, bUpdateGrf );
                    rSh.EndAllAction();
                }
            }
            break;

        default:
            bMore = TRUE;
    }
    if(bMore && pArgs)
    {
        pItem = 0;
        pArgs->GetItemState(GetPool().GetWhich(nSlot), FALSE, &pItem);
        if(pItem)
        switch(nSlot)
        {
        case SID_ATTR_BORDER_SHADOW:
        case RES_SHADOW:
        {
            rSh.StartAllAction();
            SfxItemSet   aSet( rSh.GetAttrPool(),
                                RES_SHADOW, RES_SHADOW );

            aSet.Put(*pItem);
            // Tabellenzelle(n) selektiert?
            if ( rSh.IsTableMode() )
            {
                SwFrmFmt *pFmt = rSh.GetTableFmt();
                pFmt->SetAttr( *pItem );
            }
            else if ( rSh.IsFrmSelected() )
            {
                // Umrandungsattribute ueber Frame-Manager setzen
                SwFlyFrmAttrMgr aMgr( FALSE, &rSh, FRMMGR_TYPE_NONE );
                aMgr.SetAttrSet( *pArgs );
                aMgr.UpdateFlyFrm();
            }
            else
            {
                rSh.SetAttr( *pArgs );
            }
            rSh.EndAllAction();
        }
        break;
        case FN_PAGE_STYLE_SET_LR_MARGIN:
        case FN_PAGE_STYLE_SET_UL_MARGIN:
        case FN_PAGE_STYLE_SET_NUMBER_FORMAT:
        case FN_PAGE_STYLE_SET_PAPER_SIZE:
        case FN_PAGE_STYLE_SET_PAPER_BIN:
        {
            DBG_ERROR("not implemented")
        }
        break;

        case SID_ATTR_BORDER_OUTER:
        {
            // Tabellenzelle(n) selektiert?
            if ( rSh.IsTableMode() )
            {
                // Umrandungattribute Get/SetTabBorders() setzen
                rSh.SetTabBorders(*pArgs);
            }
            else if ( rSh.IsFrmSelected() )
            {
                // Umrandungsattribute ueber Frame-Manager setzen
                SwFlyFrmAttrMgr aMgr( FALSE, &rSh, FRMMGR_TYPE_NONE );
                aMgr.SetAttrSet(*pArgs);
                aMgr.UpdateFlyFrm();
            }
            else
            {
                // Umrandungsattribute ganz normal ueber Shell setzen
                rSh.SetAttr( *pItem );
            }
        }
        break;
        default:
                DBG_ERROR("falscher Dispatcher");
        }

    }

    if(bUp)
    {
        SfxBindings &rBnd = GetView().GetViewFrame()->GetBindings();
        rBnd.Invalidate(rReq.GetSlot());
        rBnd.Update(rReq.GetSlot());
    }
}

/* -----------------14.04.99 15:10-------------------
 * Hier wird der State fuer SID_IMAP / SID_CONTOUR behandelt,
 * wenn die Grafik ausgeswappt ist
 * --------------------------------------------------*/
IMPL_LINK(SwBaseShell, GraphicArrivedHdl, SwCrsrShell* , pCrShell )
{
    SwWrtShell &rSh = GetShell();
    if( CNT_GRF == rSh.SwEditShell::GetCntType() &&
        GRAPHIC_NONE != rSh.GetGraphicType() )
    {
        BOOL bProtect = 0 != rSh.IsSelObjProtected( (FlyProtectType)
                                    (FLYPROTECT_CONTENT|FLYPROTECT_PARENT) );

        SfxViewFrame* pVFrame = GetView().GetViewFrame();
        if( bUpdateSID_IMap || bUpdateSID_IMapExec )
        {
            USHORT nId = SvxIMapDlgChildWindow::GetChildWindowId();
            SvxIMapDlg *pDlg = pVFrame->HasChildWindow( nId ) ?
                (SvxIMapDlg*) ( pVFrame->GetChildWindow( nId )->GetWindow()) : 0;

            if( pDlg && ( bUpdateSID_IMapExec || (bUpdateSID_IMap && !bProtect)) &&
                pDlg->GetEditingObject() != rSh.GetIMapInventor() )
                    lcl_UpdateIMapDlg(rSh);

            if( !bProtect && bUpdateSID_IMap )
            {
                SfxBoolItem aBool(SID_IMAP, 0 != pDlg);
                if( pGetStateSet )
                    pGetStateSet->Put( aBool );
                else
                    pVFrame->GetBindings().SetState( aBool );
            }
        }

        if( !bProtect && ( bUpdateSID_IContour || bUpdateSID_IContourDlg ))
        {
            if( bUpdateSID_IContourDlg )
            {
                USHORT nId = SvxContourDlgChildWindow::GetChildWindowId();
                SvxIMapDlg *pDlg = pVFrame->HasChildWindow( nId ) ?
                    (SvxIMapDlg*) ( pVFrame->GetChildWindow( nId )->GetWindow()) : 0;
                if( pDlg && pDlg->GetEditingObject() != rSh.GetIMapInventor() )
                    lcl_UpdateContourDlg( rSh, SwWrtShell::SEL_GRF );

                SfxBoolItem aBool(SID_CONTOUR_DLG, 0 != pDlg);
                if( pGetStateSet )
                    pGetStateSet->Put( aBool );
                else
                    pVFrame->GetBindings().SetState( aBool );
            }
            if( bUpdateSID_IContour )
            {
                SfxItemSet aSet(GetPool(), RES_SURROUND, RES_SURROUND);
                rSh.GetFlyFrmAttr(aSet);
                const SwFmtSurround& rWrap = (const SwFmtSurround&)aSet.Get(RES_SURROUND);

                SfxBoolItem aBool( FN_FRAME_WRAP_CONTOUR, rWrap.IsContour() );
                if( pGetStateSet )
                    pGetStateSet->Put( aBool );
                else
                    pVFrame->GetBindings().SetState( aBool );
            }
        }

        bUpdateSID_IMap         = FALSE;
        bUpdateSID_IMapExec     = FALSE;
        bUpdateSID_IContour     = FALSE;
        bUpdateSID_IContourDlg  = FALSE;
    }
    return 0;
}

void SwBaseShell::GetState( SfxItemSet &rSet )
{
    SwWrtShell &rSh = GetShell();
    SfxViewFrame* pVFrame = GetView().GetViewFrame();
    SfxWhichIter aIter( rSet );
    USHORT nWhich = aIter.FirstWhich();
    pGetStateSet = &rSet;
    while ( nWhich )
    {
        switch ( nWhich )
        {
            case SID_GALLERY_FORMATS:
                if ( rSh.IsObjSelected() ||
                     (rSh.IsSelFrmMode() &&
                      !(rSh.GetSelectionType() & SwWrtShell::SEL_GRF)) )
                    rSet.DisableItem( nWhich );
                break;
            case SID_GALLERY_ENABLE_ADDCOPY:
                rSet.Put( SfxBoolItem( SID_GALLERY_ENABLE_ADDCOPY,
                    0 == (HTMLMODE_ON & ::GetHtmlMode(GetView().GetDocShell()))));
                break;
            case FN_EDIT_REGION:
                if( !rSh.IsAnySectionInDoc() )
                    rSet.DisableItem(nWhich);
                break;

            case FN_INSERT_REGION:
            case FN_INSERT_COLUMN_SECTION:
                if( rSh.IsSelFrmMode() ||
                    !rSh.IsInsRegionAvailable() )
                    rSet.DisableItem( nWhich );
                break;
            case FN_CONVERT_TEXT_TABLE:
            {
                USHORT eFrmType = rSh.GetFrmType(0,TRUE);
                if( (eFrmType & FRMTYPE_FOOTNOTE) ||
                    (!rSh.GetTableFmt() && !rSh.IsTextToTableAvailable() ) )
                    rSet.DisableItem( nWhich );
            }
            break;
            case RES_SHADOW:
            {
                SfxItemSet   aSet( rSh.GetAttrPool(),
                                    RES_SHADOW, RES_SHADOW );

                // Tabellenzelle(n) selektiert?
                if ( rSh.IsTableMode() )
                {
                    SwFrmFmt *pFmt = rSh.GetTableFmt();
                    aSet.Put(pFmt->GetAttr( nWhich, TRUE ));
                }
                else if( rSh.IsFrmSelected() )
                {
                    SwFlyFrmAttrMgr aMgr( FALSE, &rSh, FRMMGR_TYPE_NONE );
                    aSet.Put( aMgr.GetAttrSet() );
                }
                else
                    rSh.GetAttr( aSet );
#ifdef DEBUG

                const SvxShadowItem& rShItem = (const SvxShadowItem&)aSet.Get(nWhich);
                rSet.Put(rShItem);
#else
                rSet.Put((const SvxShadowItem&)aSet.Get(nWhich));
#endif
            }
            break;
            case SID_IMAP:
            {
                USHORT  nId = SvxIMapDlgChildWindow::GetChildWindowId();
                BOOL bHas = pVFrame->HasChildWindow( nId );
                BOOL bFrmSel = rSh.IsFrmSelected();
                BOOL bProtect = 0 != rSh.IsSelObjProtected( (FlyProtectType)
                                    (FLYPROTECT_CONTENT|FLYPROTECT_PARENT) );

                BOOL bIsGraphicSelection = rSh.GetSelectionType() == SwWrtShell::SEL_GRF;

                //wenn die Grafik ausgeswappt ist, dann muss der
                //Status asynchron ermittelt werden
                //bis dahin wird der Slot disabled
                if(bIsGraphicSelection && rSh.IsGrfSwapOut(TRUE))
                {
                    rSet.DisableItem(nWhich);
                    if( !bUpdateSID_IMap )
                    {
                        bUpdateSID_IMap = TRUE;
                        rSh.GetGraphic(FALSE);  // start the loading
                    }
                }
                else
                {

                    if( bProtect || ( !bHas && ( !bFrmSel ||
                            (bIsGraphicSelection &&
                            rSh.GetIMapGraphic().GetType() == GRAPHIC_NONE )) ))
                        rSet.DisableItem( nWhich );
                    else
                    {
                        SfxBoolItem aBool(nWhich, bHas);
                        if ( bHas && bFrmSel )
                            lcl_UpdateIMapDlg(rSh);
                        rSet.Put(aBool);
                    }
                }
            }
            break;
            case SID_IMAP_EXEC:
            {
                BOOL bDisable = FALSE;
                if( !rSh.IsFrmSelected())
                    bDisable = TRUE;
                USHORT nId = SvxIMapDlgChildWindow::GetChildWindowId();
                if(!bDisable && pVFrame->HasChildWindow( nId ))
                {
                    if(rSh.GetSelectionType() == SwWrtShell::SEL_GRF
                                    && rSh.IsGrfSwapOut(TRUE))
                    {
                        if( !bUpdateSID_IMapExec )
                        {
                            bUpdateSID_IMapExec = TRUE;
                            rSh.GetGraphic(FALSE);  // start the loading
                        }
                    }
                    else
                    {
                        SvxIMapDlg *pDlg = SWIMAPDLG(GetView());
                        if( pDlg->GetEditingObject() != rSh.GetIMapInventor() )
                            lcl_UpdateIMapDlg(rSh);
                    }
                }
                rSet.Put(SfxBoolItem(nWhich, bDisable));
            }
            break;
            case FN_BACKSPACE:
            case SID_DELETE:
                if (rSh.IsSelObjProtected( (FlyProtectType)(FLYPROTECT_CONTENT|FLYPROTECT_PARENT) ) != 0)
                    rSet.DisableItem( nWhich );
                break;
            case SID_CONTOUR_DLG:
            {
                BOOL bParentCntProt = 0 != rSh.IsSelObjProtected(
                    (FlyProtectType)(FLYPROTECT_CONTENT|FLYPROTECT_PARENT) );

                if( bParentCntProt || 0 != (HTMLMODE_ON & ::GetHtmlMode(
                                            GetView().GetDocShell() )) )
                    rSet.DisableItem( nWhich );
                else
                {
                    USHORT nId = SvxContourDlgChildWindow::GetChildWindowId();
                    BOOL bHas = GetView().GetViewFrame()->HasChildWindow( nId );
                    int nSel = rSh.GetSelectionType();
                    BOOL bOk = 0 != (nSel & (SwWrtShell::SEL_GRF|SwWrtShell::SEL_OLE));

                    BOOL bDisable;
                    if( !bHas && !bOk )
                        bDisable = TRUE;
                    // wenn die Grafik ausgeswappt ist, dann muss der Status
                    // asynchron ermittelt werden bis dahin wird der Slot
                    // disabled
                    else if( (nSel & SwWrtShell::SEL_GRF) &&
                                rSh.IsGrfSwapOut(TRUE))
                    {
                        bDisable = TRUE;
                        if( !bUpdateSID_IContourDlg )
                        {
                            bUpdateSID_IContourDlg = TRUE;
                            rSh.GetGraphic(FALSE);  // start the loading
                        }
                    }
                    else if( bHas && bOk )
                        bDisable = !lcl_UpdateContourDlg( rSh, nSel );
                    else if( bOk )
                        bDisable = GRAPHIC_NONE == rSh.GetIMapGraphic().GetType();

                    if( bDisable )
                        rSet.DisableItem( nWhich );
                    else
                        rSet.Put( SfxBoolItem(nWhich, bHas) );
                }
            }
            break;
            case SID_CONTOUR_EXEC:
            {
                BOOL bDisable = FALSE;
                int nSel = rSh.GetSelectionType();
                if( !(nSel & (SwWrtShell::SEL_GRF|SwWrtShell::SEL_OLE)) )
                    bDisable = TRUE;
                USHORT nId = SvxContourDlgChildWindow::GetChildWindowId();
                if( !bDisable && GetView().GetViewFrame()->HasChildWindow( nId ))
                {
                    SvxContourDlg *pDlg = SWCONTOURDLG(GetView());
                    if( pDlg->GetEditingObject() != rSh.GetIMapInventor() )
                        bDisable = TRUE;
                }
                rSet.Put(SfxBoolItem(nWhich, bDisable));
            }
            break;

            case SID_SBA_BRW_UPDATE:
            case SID_SBA_BRW_INSERT:
            case SID_SBA_BRW_MERGE:
            {
                //Damit der Datenbankbrowser die Buttons fuer alle Shells
                //anzeigt. Aber nur disabled, enabled wird nur in der Textsh.
                const int nSelType = rSh.GetSelectionType();
                rSet.Put(SfxBoolItem(nWhich,
                            nSelType & SwWrtShell::SEL_TXT ? TRUE : FALSE ));
            }
            break;

            case FN_TOOL_ANKER:
            case FN_TOOL_ANKER_PAGE:
            case FN_TOOL_ANKER_PARAGRAPH:
            case FN_TOOL_ANKER_CHAR:
            case FN_TOOL_ANKER_AT_CHAR:
            case FN_TOOL_ANKER_FRAME:
            {
                BOOL bObj = 0 != rSh.IsObjSelected();
                BOOL bParentCntProt = rSh.IsSelObjProtected( (FlyProtectType)(FLYPROTECT_CONTENT|FLYPROTECT_PARENT) ) != 0;

                if( !bParentCntProt && (bObj || rSh.IsFrmSelected()))
                {
                    SfxItemSet aSet(GetPool(), RES_ANCHOR, RES_ANCHOR);
                    if(bObj)
                        rSh.GetObjAttr(aSet);
                    else
                        rSh.GetFlyFrmAttr(aSet);
                    RndStdIds eSet = ((SwFmtAnchor&)aSet.Get(RES_ANCHOR)).GetAnchorId();
                    BOOL bSet;
                    bSet = (nWhich == FN_TOOL_ANKER_PAGE && eSet == FLY_PAGE) ||
                            (nWhich == FN_TOOL_ANKER_PARAGRAPH && eSet == FLY_AT_CNTNT) ||
                            (nWhich == FN_TOOL_ANKER_FRAME && eSet == FLY_AT_FLY) ||
                            (nWhich == FN_TOOL_ANKER_AT_CHAR && eSet == FLY_AUTO_CNTNT) ||
                            (nWhich == FN_TOOL_ANKER_CHAR && eSet == FLY_IN_CNTNT);
                    if(nWhich != FN_TOOL_ANKER)
                    {
                        USHORT nHtmlMode = ::GetHtmlMode(GetView().GetDocShell());
                        if( ( nWhich == FN_TOOL_ANKER_PAGE &&
                              ((HTMLMODE_ON & nHtmlMode) && (0 == (nHtmlMode & HTMLMODE_SOME_ABS_POS)))) ||
                            ( nWhich == FN_TOOL_ANKER_FRAME && !rSh.IsFlyInFly() ) ||
                            ( nWhich == FN_TOOL_ANKER_AT_CHAR && !rSh.IsFrmSelected())||
                            ( nWhich == FN_TOOL_ANKER_PAGE && rSh.IsInHeaderFooter() ))
                            rSet.DisableItem(nWhich);
                        else
                            rSet.Put(SfxBoolItem(nWhich, bSet));
                    }
                    else
                    {
                        USHORT nSlotId = 0;

                        switch (eSet)
                        {
                            case FLY_PAGE:
                                nSlotId = FN_TOOL_ANKER_PAGE;
                            break;
                            case FLY_AT_CNTNT:
                                nSlotId = FN_TOOL_ANKER_PARAGRAPH;
                            break;
                            case FLY_IN_CNTNT:
                                nSlotId = FN_TOOL_ANKER_CHAR;
                            break;
                            case FLY_AUTO_CNTNT:
                                nSlotId = FN_TOOL_ANKER_AT_CHAR;
                            break;
                            case FLY_AT_FLY:
                                nSlotId = FN_TOOL_ANKER_FRAME;
                            break;
                        }
                        rSet.Put(SfxUInt16Item(nWhich, nSlotId));
                    }
                }
                else
                    rSet.DisableItem( nWhich );
            }
            break;
            case FN_FRAME_NOWRAP:
            case FN_FRAME_WRAP:
            case FN_FRAME_WRAP_IDEAL:
            case FN_FRAME_WRAPTHRU:
            case FN_FRAME_WRAPTHRU_TRANSP:
            case FN_FRAME_WRAP_CONTOUR:
            case FN_WRAP_ANCHOR_ONLY:
            case FN_FRAME_WRAP_LEFT:
            case FN_FRAME_WRAP_RIGHT:
            {
                BOOL bObj = 0 != rSh.IsObjSelected();
                BOOL bParentCntProt = rSh.IsSelObjProtected( (FlyProtectType)(FLYPROTECT_CONTENT|FLYPROTECT_PARENT) ) != 0;

                if( !bParentCntProt && (bObj || rSh.IsFrmSelected()))
                {
                    SfxItemSet aSet(GetPool(), RES_OPAQUE, RES_ANCHOR);
                    int nAnchorType;
                    if(bObj)
                    {
                        rSh.GetObjAttr(aSet);
                        nAnchorType = rSh.GetAnchorId();
                    }
                    else
                    {
                        rSh.GetFlyFrmAttr(aSet);
                        nAnchorType = ((SwFmtAnchor&)aSet.Get(RES_ANCHOR)).GetAnchorId();
                    }
                    const SwFmtSurround& rWrap = (const SwFmtSurround&)aSet.Get(RES_SURROUND);

                    const SvxOpaqueItem& rOpaque = (const SvxOpaqueItem&)aSet.Get(RES_OPAQUE);
                    BOOL bOpaque = rOpaque.GetValue();
                    SwSurround nSurround = rWrap.GetSurround();
                    BOOL bSet;

                    BOOL bDisable = nAnchorType == - 1 || nAnchorType == FLY_IN_CNTNT;
                    BOOL bHtmlMode = 0 != ::GetHtmlMode(GetView().GetDocShell());

                    switch( nWhich )
                    {
                        case FN_FRAME_NOWRAP:
                            bDisable |= (bHtmlMode ||
                                ( nAnchorType != FLY_AT_CNTNT &&
                                    nAnchorType != FLY_AUTO_CNTNT && nAnchorType != FLY_PAGE));
                            bSet = nSurround == SURROUND_NONE;
                        break;
                        case FN_FRAME_WRAP:
                            bDisable |= bHtmlMode;
                            bSet = nSurround == SURROUND_PARALLEL;
                        break;
                        case FN_FRAME_WRAP_IDEAL:
                            bDisable |= bHtmlMode;
                            bSet = nSurround == SURROUND_IDEAL;
                        break;
                        case FN_FRAME_WRAPTHRU:
                            bDisable |= (bHtmlMode ||
                                (nAnchorType != FLY_AT_CNTNT&& nAnchorType != FLY_AUTO_CNTNT && nAnchorType != FLY_PAGE));
                            if(bObj)
                                bSet = nSurround == SURROUND_THROUGHT && rSh.GetLayerId();
                            else
                                bSet = nSurround == SURROUND_THROUGHT && bOpaque;
                        break;
                        case FN_FRAME_WRAPTHRU_TRANSP:
                            bDisable |= bHtmlMode;
                            if(bObj)
                                bSet = nSurround == SURROUND_THROUGHT && !rSh.GetLayerId();
                            else
                                bSet = nSurround == SURROUND_THROUGHT && !bOpaque;
                        break;
                        case FN_FRAME_WRAP_CONTOUR:
                            bDisable |= bHtmlMode;
                            bSet = rWrap.IsContour();
                            if( !bDisable )
                            {
                                int nSel = rSh.GetSelectionType();
                                if( (nSel & SwWrtShell::SEL_GRF) &&
                                            rSh.IsGrfSwapOut(TRUE))
                                {
                                    bDisable = TRUE;
                                    if( !bUpdateSID_IContour )
                                    {
                                        bUpdateSID_IContour = TRUE;
                                        rSh.GetGraphic(FALSE);  // start the loading
                                    }
                                }
                                else if( rSh.IsFrmSelected() )
                                    bDisable = GRAPHIC_NONE ==
                                            rSh.GetIMapGraphic().GetType();
                            }
                            bSet = bDisable ? FALSE : rWrap.IsContour();

                        break;
                        case FN_WRAP_ANCHOR_ONLY:
                            bDisable |= (bHtmlMode ||
                                (nAnchorType != FLY_AT_CNTNT));
                            bSet = rWrap.IsAnchorOnly();
                        break;
                        case FN_FRAME_WRAP_LEFT:
                            bSet = nSurround == SURROUND_LEFT;
                        break;
                        case FN_FRAME_WRAP_RIGHT:
                            bSet = nSurround == SURROUND_RIGHT;
                        break;
                    }

                    if(bDisable)
                        rSet.DisableItem(nWhich);
                    else
                        rSet.Put(SfxBoolItem(nWhich, bSet));
                }
                else
                    rSet.DisableItem(nWhich);
            }
            break;
            case FN_UPDATE_CHARTS:
                if( !rSh.HasCharts() )
                    rSet.DisableItem( nWhich );
                break;
            case FN_UPDATE_ALL_LINKS:
                if ( !rSh.GetLinkManager().GetLinks().Count() )
                    rSet.DisableItem(nWhich);
                break;
        }
        nWhich = aIter.NextWhich();
    }
    pGetStateSet = 0;
}

/*--------------------------------------------------------------------
    Beschreibung:   Slots mit dieser Statusmethode disablen
 --------------------------------------------------------------------*/


void SwBaseShell::StateDisableItems( SfxItemSet &rSet )
{
    SfxWhichIter aIter(rSet);
    USHORT nWhich = aIter.FirstWhich();

    while (nWhich)
    {
        rSet.DisableItem( nWhich );
        nWhich = aIter.NextWhich();
    }
}

/*--------------------------------------------------------------------
    Beschreibung:   Slots mit dieser Statusmethode disablen
 --------------------------------------------------------------------*/


void SwBaseShell::StateStyle( SfxItemSet &rSet )
{
    BOOL bParentCntProt = GetShell().IsSelObjProtected( (FlyProtectType)(FLYPROTECT_CONTENT|FLYPROTECT_PARENT) ) != 0;
    ShellModes eMode = GetView().GetShellMode();

    if ( bParentCntProt ||
         SEL_DRAW == eMode ||
         SEL_DRAW_CTRL == eMode ||
         SEL_DRAW_FORM == eMode ||
         SEL_DRAWTEXT == eMode ||
         SEL_BEZIER == eMode )
    {
        SfxWhichIter aIter( rSet );
        USHORT nWhich = aIter.FirstWhich();
        while ( nWhich )
        {
            rSet.DisableItem( nWhich );
            nWhich = aIter.NextWhich();
        }
    }
    else
        GetView().GetDocShell()->StateStyleSheet(rSet, &GetShell());
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwBaseShell::SetWrapMode( USHORT nSlot )
{
    SwWrtShell &rSh = GetShell();
    BOOL bObj = 0 != rSh.IsObjSelected();
    if( bObj || rSh.IsFrmSelected())
    {
        SfxItemSet aSet(GetPool(), RES_OPAQUE, RES_SURROUND);
        if(bObj)
            rSh.GetObjAttr(aSet);
        else
            rSh.GetFlyFrmAttr(aSet);
        SwFmtSurround aWrap( (SwFmtSurround&)aSet.Get(RES_SURROUND) );
        SwSurround nOldSurround(aWrap.GetSurround());
        SwSurround nSurround = SURROUND_PARALLEL;

        switch (nSlot)
        {
            case FN_FRAME_NOWRAP:
                nSurround = SURROUND_NONE;
                if (aWrap.IsContour())
                    aWrap.SetContour(FALSE);
                break;
            case FN_FRAME_WRAP_IDEAL:
                nSurround = SURROUND_IDEAL;
                break;
            case FN_WRAP_ANCHOR_ONLY:
                aWrap.SetAnchorOnly(!aWrap.IsAnchorOnly());
                break;
            case FN_FRAME_WRAP_CONTOUR:
                aWrap.SetContour(!aWrap.IsContour());
                if (nSurround == SURROUND_THROUGHT)
                    nSurround = SURROUND_PARALLEL;
                break;
            case FN_FRAME_WRAPTHRU_TRANSP:
                if (aWrap.IsContour())
                    aWrap.SetContour(FALSE);
                // kein break!!!
            case FN_FRAME_WRAPTHRU:
                nSurround = SURROUND_THROUGHT;
                break;

            case FN_FRAME_WRAP_LEFT:
                nSurround = SURROUND_LEFT;
                break;

            case FN_FRAME_WRAP_RIGHT:
                nSurround = SURROUND_RIGHT;
                break;

            default:
                break;
        }
        aWrap.SetSurround(nSurround);

        if (nSlot != FN_FRAME_WRAP_CONTOUR)
        {
            // Konturumfluss bei Draw-Objekten defaulten
            if (bObj && nOldSurround != nSurround &&
                (nOldSurround == SURROUND_NONE || nOldSurround == SURROUND_THROUGHT))
            {
                aWrap.SetContour(TRUE);
            }
        }

        aSet.Put( aWrap );
        aSet.Put(SvxOpaqueItem(RES_OPAQUE, nSlot != FN_FRAME_WRAPTHRU_TRANSP));
        if(bObj)
        {
            rSh.SetObjAttr(aSet);
            if (nSlot != FN_FRAME_WRAPTHRU_TRANSP)
                rSh.SelectionToHeaven();
            else
                rSh.SelectionToHell();
        }
        else
            rSh.SetFlyFrmAttr(aSet);
    }
}

/*--------------------------------------------------------------------
    Beschreibung:   Update der Statuszeile erzwingen
 --------------------------------------------------------------------*/

void SwBaseShell::SetFrmMode(USHORT nMode, SwWrtShell *pSh )
{
    nFrameMode = nMode;
    SfxBindings &rBnd = pSh->GetView().GetViewFrame()->GetBindings();

    if( nMode == FLY_DRAG ||
        (pSh && (pSh->IsFrmSelected() || pSh->IsObjSelected())) )
    {
        const SfxPointItem aTmp1( SID_ATTR_POSITION, pSh->GetAnchorObjDiff());
        const SvxSizeItem  aTmp2( SID_ATTR_SIZE,     pSh->GetObjSize());
        rBnd.SetState( aTmp1 );
        rBnd.SetState( aTmp2 );
    }
    else if( nMode == FLY_DRAG_END )
    {
        static USHORT __READONLY_DATA aInval[] =
        {
            SID_ATTR_POSITION, SID_ATTR_SIZE, 0
        };
        rBnd.Invalidate(aInval);
    }
}

/*--------------------------------------------------------------------
    Beschreibung:   Ctor
 --------------------------------------------------------------------*/

SwBaseShell::SwBaseShell(SwView& rVw) :
    SfxShell( &rVw ),
    rView(rVw),
    pFrmMgr(0),
    pGetStateSet(0),
    bUpdateSID_IMap(FALSE),
    bUpdateSID_IMapExec(FALSE),
    bUpdateSID_IContour(FALSE),
    bUpdateSID_IContourDlg(FALSE)
{
    SwWrtShell& rWrtSh = rView.GetWrtShell();

    SetPool(&rWrtSh.GetAttrPool());
    SetName(C2S("Base"));
    rWrtSh.SetGrfArrivedLnk( LINK( this, SwBaseShell, GraphicArrivedHdl));
}


SwBaseShell::~SwBaseShell()
{
    delete pFrmMgr;
    if( rView.GetCurShell() == this )
        rView.ResetSubShell();

    Link aTmp( LINK( this, SwBaseShell, GraphicArrivedHdl));
    if( aTmp == rView.GetWrtShell().GetGrfArrivedLnk() )
        rView.GetWrtShell().SetGrfArrivedLnk( Link() );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwBaseShell::ExecTxtCtrl(SfxRequest& rReq)
{
    const SfxItemSet *pArgs = rReq.GetArgs();

    SwWrtShell &rSh = GetShell();
    if (!pArgs)
        GetView().GetViewFrame()->GetDispatcher()->Execute( SID_CHAR_DLG, FALSE);
    else
    {
        rSh.SetAttr(*pArgs);
        SwTxtFmtColl* pColl = rSh.GetCurTxtFmtColl();
        if(pColl && pColl->IsAutoUpdateFmt())
            rSh.AutoUpdatePara(pColl, *pArgs);

    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwBaseShell::GetTxtCtrlState(SfxItemSet& rSet)
{
    GetShell().GetAttr(rSet);
/*
#ifdef UNX
    // Timing-Probleme: Wenn der Timer ausloest, der u.a. die FontList ermitteln
    // will, ist die DocShell u.U. (bei langen Startup-Phasen wie z.B. unter
    // Unix) noch gar nicht angelegt (->SF). In diesem Fall holen wir uns
    // die FontList einfach vom AppWindow. Ein sp"aterer Timer-Aufruf wird's
    // dann schon richten.
    if( !GetView().GetDocShell() )
    {
        FontList aFontList(::GetGetpApp()()->GetAppWindow());
        SvxFontListItem aFontListItem( &aFontList , SID_ATTR_CHAR_FONTLIST );
        rSet.Put( aFontListItem );
    }
    else
#endif
    {
        SvxFontListItem aFontListItem(GetView().GetDocShell()->GetFontList(), SID_ATTR_CHAR_FONTLIST);
        rSet.Put(aFontListItem);
    }

    GetShell().GetAttr(rSet);   // *alle* Textattribute von der Core erfragen
    */
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwBaseShell::GetBckColState(SfxItemSet &rSet)
{
    SwWrtShell &rSh = GetShell();
    SfxWhichIter aIter( rSet );
    USHORT nWhich = aIter.FirstWhich();
    int nSelType = rSh.GetSelectionType();

//  if ( nSelType & SwWrtShell::SEL_GRF ||
    if( nSelType & SwWrtShell::SEL_OLE )
    {
        rSet.DisableItem( SID_BACKGROUND_COLOR );
        return;
    }

    if ( nSelType & SwWrtShell::SEL_FRM )
    {
        BOOL bParentCntProt = rSh.IsSelObjProtected( (FlyProtectType)(FLYPROTECT_CONTENT|FLYPROTECT_PARENT) ) != 0;
        if (bParentCntProt)
        {
            rSet.DisableItem( SID_BACKGROUND_COLOR );
            return;
        }
    }

    SvxBrushItem aBrushItem;

    if( SwWrtShell::SEL_TBL_CELLS & nSelType )
        rSh.GetBoxBackground( aBrushItem );
    else
    {
        SfxItemSet aCoreSet(GetPool(), RES_BACKGROUND, RES_BACKGROUND);
        if( nSelType & SwWrtShell::SEL_GRF || SwWrtShell::SEL_FRM & nSelType )
            rSh.GetFlyFrmAttr( aCoreSet );
        else
            rSh.GetAttr( aCoreSet );
        aBrushItem = (const SvxBrushItem&)aCoreSet.Get(RES_BACKGROUND);
    }

    while ( nWhich )
    {
        switch(nWhich)
        {
            case SID_BACKGROUND_COLOR  :
            {
                SvxColorItem aColorItem(aBrushItem.GetColor());
                rSet.Put( aColorItem, SID_BACKGROUND_COLOR );
            }
            break;
            case SID_ATTR_BRUSH:
            case RES_BACKGROUND:
                rSet.Put( aBrushItem, GetPool().GetWhich(nWhich) );
            break;
        }
        nWhich = aIter.NextWhich();
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwBaseShell::ExecBckCol(SfxRequest& rReq)
{
    SwWrtShell &rSh = GetShell();
    int nSelType = rSh.GetSelectionType();
    if ( nSelType & SwWrtShell::SEL_OLE )
    {
        return;
    }

    const SfxItemSet* pArgs = rReq.GetArgs();
    USHORT nSlot = rReq.GetSlot();
    if( !pArgs  && nSlot != SID_BACKGROUND_COLOR)
        return ;

    SvxBrushItem aBrushItem;

    if( SwWrtShell::SEL_TBL & nSelType )
    {
        rSh.GetBoxBackground( aBrushItem );
    }
    else
    {
        SfxItemSet aCoreSet(GetPool(), RES_BACKGROUND, RES_BACKGROUND);
        if( (SwWrtShell::SEL_FRM & nSelType) || (SwWrtShell::SEL_GRF & nSelType) )
            rSh.GetFlyFrmAttr( aCoreSet );
        else
            rSh.GetAttr( aCoreSet );
        aBrushItem = (const SvxBrushItem&)aCoreSet.Get(RES_BACKGROUND);
    }

//  BOOL bMsgOk = FALSE;

    switch (nSlot)
    {
        // RES_BACKGROUND (=SID_ATTR_BRUSH) muss ueber zwei IDs
        // gesetzt werden:
        case SID_BACKGROUND_COLOR:
            {
                aBrushItem.SetGraphicPos(GPOS_NONE);

                //Brush &rBrush = aBrushItem.GetBrush();
                if(pArgs)
                {
                    const SvxColorItem& rNewColorItem = (const SvxColorItem&)
                                            pArgs->Get(SID_BACKGROUND_COLOR);
                    const Color& rNewColor = rNewColorItem.GetValue();
                    aBrushItem.SetColor( rNewColor );
                    GetView().GetViewFrame()->GetBindings().SetState(rNewColorItem);
                }
                else
                    aBrushItem.SetColor( COL_TRANSPARENT );
            }
            break;

        case SID_ATTR_BRUSH:
        case RES_BACKGROUND:
        {
            const SvxBrushItem& rNewBrushItem = (const SvxBrushItem&)
                                    pArgs->Get( GetPool().GetWhich(nSlot) );
            aBrushItem = rNewBrushItem;
        }
        break;
        default:
//          bMsgOk = FALSE;
            DBG_ERROR( "Unbekannte Message bei ExecuteAttr!" );
            return;
    }

    if( SwWrtShell::SEL_TBL & nSelType )
    {
        rSh.SetBoxBackground( aBrushItem );
    }
    else if( (SwWrtShell::SEL_FRM & nSelType) ||
        (SwWrtShell::SEL_GRF & nSelType)  )
    {
        SfxItemSet aCoreSet(GetPool(), RES_BACKGROUND, RES_BACKGROUND);
        aCoreSet.Put( aBrushItem );
        // Vorlagen-AutoUpdate
        SwFrmFmt* pFmt = rSh.GetCurFrmFmt();
        if(pFmt && pFmt->IsAutoUpdateFmt())
            rSh.AutoUpdateFrame( pFmt, aCoreSet);
        else
            rSh.SetFlyFrmAttr( aCoreSet );
    }
    else
    {
        SwTxtFmtColl* pColl = rSh.GetCurTxtFmtColl();
        if( pColl && pColl->IsAutoUpdateFmt())
        {
            SfxItemSet aSet(GetPool(), RES_BACKGROUND, RES_BACKGROUND );
            aSet.Put(aBrushItem);
            rSh.AutoUpdatePara( pColl, aSet);
        }
        else
            rSh.SetAttr( aBrushItem );
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwBaseShell::GetBorderState(SfxItemSet &rSet)
{
    SwWrtShell &rSh = GetShell();
    // Tabellenzelle(n) selektiert?
    BOOL bPrepare = TRUE;
    if ( rSh.IsTableMode() )
    {
        SfxItemSet aCoreSet( GetPool(),
                             RES_BOX, RES_BOX,
                             SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER, 0 );
        SvxBoxInfoItem aBoxInfo;
        aCoreSet.Put( aBoxInfo );
        rSh.GetTabBorders( aCoreSet );
        rSet.Put( aCoreSet );
    }
    else if ( rSh.IsFrmSelected() )
    {
        SwFlyFrmAttrMgr aMgr( FALSE, &rSh, FRMMGR_TYPE_NONE );
        rSet.Put( aMgr.GetAttrSet() );
        bPrepare = FALSE;
    }
    else
        // Umrandungsattribute ganz normal ueber Shell holen
        rSh.GetAttr( rSet );

    if ( bPrepare )
        ::PrepareBoxInfo( rSet, rSh );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwBaseShell::ExecDlg(SfxRequest &rReq)
{
    SwWrtShell &rSh = GetShell();
    Window *pMDI = &GetView().GetViewFrame()->GetWindow();
    //Damit aus dem Basic keine Dialoge fuer Hintergrund-Views aufgerufen werden:
    BOOL bBackground = (&GetView() != GetActiveView());
    const SfxPoolItem* pItem = 0;
    const SfxItemSet* pArgs = rReq.GetArgs();

    USHORT nSlot = rReq.GetSlot();
    const SfxItemSet* pOutSet = 0;
    if(pArgs)
        pArgs->GetItemState( GetPool().GetWhich(nSlot), FALSE, &pItem );

    switch ( nSlot )
    {
        case FN_FORMAT_PAGE_COLUMN_DLG:
        case FN_FORMAT_PAGE_DLG:
        {
            if( !bBackground )
            {
                const USHORT nCurIdx = rSh.GetCurPageDesc();
                const SwPageDesc& rPageDesc = rSh.GetPageDesc( nCurIdx );
                //temp. View, weil die Shell nach dem Dialog nicht mehr gueltig sein muss
                //z.B. Kopfzeile ausschalten
                SwView& rView = GetView();
                rView.GetDocShell()->FormatPage(rPageDesc.GetName(),
                                    nSlot == FN_FORMAT_PAGE_COLUMN_DLG,
                                    &rSh );
                rView.InvalidateRulerPos();
            }
        }
        break;
        case FN_FORMAT_BORDER_DLG:
        {
            SfxItemSet   aSet( rSh.GetAttrPool(),
                               RES_BOX              , RES_SHADOW,
                               SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER,
                               0 );
            SwBorderDlg* pDlg = 0;

            // Tabellenzelle(n) selektiert?
            if ( rSh.IsTableMode() )
            {
                // Umrandungattribute Get/SetTabBorders() setzen
                ::PrepareBoxInfo( aSet, rSh );
                rSh.GetTabBorders( aSet );
                pDlg = new SwBorderDlg( pMDI, aSet, SW_BORDER_MODE_TABLE );
                if ( pDlg->Execute() == RET_OK )
                {
                    rSh.SetTabBorders( *pDlg->GetOutputItemSet() );
                    pOutSet = pDlg->GetOutputItemSet();
                }
            }
            else if ( rSh.IsFrmSelected() )
            {
                // Umrandungsattribute ueber Frame-Manager setzen
                SwFlyFrmAttrMgr aMgr( FALSE, &rSh, FRMMGR_TYPE_NONE );
                aSet.Put( aMgr.GetAttrSet() );

                pDlg = new SwBorderDlg( pMDI, aSet, SW_BORDER_MODE_FRAME );
                if ( pDlg->Execute() == RET_OK )
                {
                    aMgr.SetAttrSet( *pDlg->GetOutputItemSet() );
                    aMgr.UpdateFlyFrm();
                    pOutSet = pDlg->GetOutputItemSet();
                }
            }
            else
            {
                // Umrandungsattribute ganz normal ueber Shell setzen
                rSh.GetAttr( aSet );
                ::PrepareBoxInfo( aSet, rSh );

                pDlg = new SwBorderDlg( pMDI, aSet, SW_BORDER_MODE_PARA );
                if ( pDlg->Execute() == RET_OK )
                {
                    rSh.SetAttr( *pDlg->GetOutputItemSet() );
                    pOutSet = pDlg->GetOutputItemSet();
                }
            }
            delete pDlg;
        }
        break;
        case FN_FORMAT_BACKGROUND_DLG:
        {
            SfxItemSet aSet( rSh.GetAttrPool(),
                             RES_BACKGROUND, RES_BACKGROUND );

            SwBackgroundDlg* pDlg = 0;

            // Tabellenzelle(n) selektiert?
            if ( rSh.IsTableMode() )
            {
                //Hintergrundattribute der Tabelle holen und in den Set packen
                SvxBrushItem aBrush(RES_BACKGROUND);
                rSh.GetBoxBackground( aBrush );
                pDlg = new SwBackgroundDlg( pMDI, aSet );
                aSet.Put( aBrush );
                if ( pDlg->Execute() == RET_OK )
                {
                    //aBrush = (SvxBrushItem) pDlg->GetOutputItemSet()->Get( RES_BACKGROUND );

                    rSh.SetBoxBackground( (SvxBrushItem&)
                        pDlg->GetOutputItemSet()->Get( RES_BACKGROUND ));
                    pOutSet = pDlg->GetOutputItemSet();
                }
            }
            else if ( rSh.IsFrmSelected() )
            {

                rSh.GetFlyFrmAttr( aSet );

                pDlg = new SwBackgroundDlg( pMDI, aSet );
                if ( pDlg->Execute() == RET_OK )
                {
                    rSh.SetFlyFrmAttr((SfxItemSet &) *pDlg->GetOutputItemSet() );
                    pOutSet = pDlg->GetOutputItemSet();
                }
            }
            else
            {
                // Umrandungsattribute ganz normal ueber Shell setzen
                rSh.GetAttr( aSet );

                pDlg = new SwBackgroundDlg( pMDI, aSet );
                if ( pDlg->Execute() == RET_OK )
                {
                    rSh.SetAttr( *pDlg->GetOutputItemSet() );
                    pOutSet = pDlg->GetOutputItemSet();
                }
            }
            delete pDlg;

        }
        break;
        default:DBG_ERROR("falscher Dispatcher (basesh.cxx)");
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

int SwBaseShell::InsertGraphic( const String &rPath, const String &rFilter,
                                BOOL bLink, GraphicFilter *pFlt,
                                Graphic* pPreviewGrf, BOOL bRule )
{
    SwWait aWait( *rView.GetDocShell(), TRUE );

    Graphic aGrf;
    int nRes = GRFILTER_OK;
    if ( pPreviewGrf )
        aGrf = *pPreviewGrf;
    else
    {
        if( !pFlt )
            pFlt = ::GetGrfFilter();
        Link aOldLink = pFlt->GetUpdatePercentHdl();
        pFlt->SetUpdatePercentHdl( LINK( this, SwBaseShell, UpdatePercentHdl ));
        ::StartProgress( STR_STATSTR_IMPGRF, 0, 100, rView.GetDocShell() );
        nRes = ::LoadGraphic( rPath, rFilter, aGrf, pFlt /*, nFilter*/ );
        ::EndProgress( rView.GetDocShell() );
        pFlt->SetUpdatePercentHdl( aOldLink );
    }

    if( GRFILTER_OK == nRes )
    {
        SwWrtShell &rSh = GetShell();
        rSh.StartAction();
        if( bLink )
            rSh.Insert( URIHelper::SmartRelToAbs( rPath ),
                        rFilter, aGrf, pFrmMgr, bRule );
        else
            rSh.Insert( aEmptyStr, aEmptyStr, aGrf, pFrmMgr );
        // nach dem EndAction ist es zu spaet, weil die Shell dann schon zerstoert sein kann
        DELETEZ(pFrmMgr);
        rSh.EndAction();
    }
    return nRes;
}


IMPL_LINK_INLINE_START( SwBaseShell, UpdatePercentHdl, GraphicFilter *, pFilter )
{
    ::SetProgressState( pFilter->GetPercent(), rView.GetDocShell() );
    return 0;
}
IMPL_LINK_INLINE_END( SwBaseShell, UpdatePercentHdl, GraphicFilter *, pFilter )


// ----------------------------------------------------------------------------


SwWrtShell& SwBaseShell::GetShell()
{
    return rView.GetWrtShell();
}

// ----------------------------------------------------------------------------

SwWrtShell* SwBaseShell::GetShellPtr()
{
    return rView.GetWrtShellPtr();
}


void SwBaseShell::GetGalleryState( SfxItemSet &rSet )
{
    SwWrtShell &rSh = GetShell();
    SfxWhichIter aIter( rSet );
    USHORT nWhich = aIter.FirstWhich();
    switch ( nWhich )
    {
        case SID_GALLERY_BG_BRUSH:
        {
            int nSel = rSh.GetSelectionType();
            SfxStringListItem aLst( nWhich );
            List *pLst = aLst.GetList();
            nParagraphPos = nGraphicPos = nOlePos = nFramePos = nTablePos =
            nTableRowPos  = nTableCellPos = nPagePos =
            nHeaderPos    = nFooterPos = 0;
            BYTE nPos = 1;
            pLst->Insert( (void*) new SW_RESSTR( STR_SWBG_PAGE ), pLst->Count() );
            nPagePos = nPos++;
            USHORT nHtmlMode = ::GetHtmlMode(GetView().GetDocShell());
            BOOL bHtmlMode = 0 != (nHtmlMode & HTMLMODE_ON);

            if ( (!bHtmlMode || (nHtmlMode & HTMLMODE_FULL_STYLES)) &&
                 (nSel & SwWrtShell::SEL_TXT) )
            {
                pLst->Insert( (void*) new SW_RESSTR( STR_SWBG_PARAGRAPH ), pLst->Count() );
                nParagraphPos = nPos++;
            }
            if ( (!bHtmlMode || (nHtmlMode & HTMLMODE_SOME_STYLES)) &&
                    nSel & (SwWrtShell::SEL_TBL|SwWrtShell::SEL_TBL_CELLS) )
            {
                pLst->Insert( (void*) new SW_RESSTR( STR_SWBG_TABLE ), pLst->Count() );
                nTablePos = nPos++;

                if(!bHtmlMode)
                {
                    pLst->Insert( (void*) new SW_RESSTR( STR_SWBG_TABLE_ROW ), pLst->Count() );
                    nTableRowPos = nPos++;
                }

                pLst->Insert( (void*) new SW_RESSTR( STR_SWBG_TABLE_CELL), pLst->Count() );
                nTableCellPos = nPos++;
            }
            if(!bHtmlMode)
            {
                if ( nSel & SwWrtShell::SEL_FRM )
                {
                    pLst->Insert( (void*) new SW_RESSTR( STR_SWBG_FRAME ), pLst->Count() );
                    nFramePos = nPos++;
                }
                if ( nSel & SwWrtShell::SEL_GRF )
                {
                    pLst->Insert( (void*) new SW_RESSTR( STR_SWBG_GRAPHIC ), pLst->Count() );
                    nGraphicPos = nPos++;
                }
                if ( nSel & SwWrtShell::SEL_OLE )
                {
                    pLst->Insert( (void*) new SW_RESSTR( STR_SWBG_OLE ), pLst->Count() );
                    nOlePos = nPos++;
                }
                const USHORT nType = rSh.GetFrmType(0,TRUE);
                if ( nType & FRMTYPE_HEADER )
                {
                    pLst->Insert( (void*) new SW_RESSTR( STR_SWBG_HEADER ), pLst->Count() );
                    nHeaderPos = nPos++;
                }
                if ( nType & FRMTYPE_FOOTER )
                {
                    pLst->Insert( (void*) new SW_RESSTR( STR_SWBG_FOOTER ), pLst->Count() );
                    nFooterPos = nPos;
                }
            }
            if ( pLst->Count() )
                rSet.Put( aLst );
            else
                rSet.DisableItem( nWhich );
            break;
        }
    }
}


void SwBaseShell::ExecuteGallery(SfxRequest &rReq)
{
    SwWrtShell &rSh = GetShell();
    rSh.StartAction();
    const SfxItemSet* pArgs = rReq.GetArgs();
    USHORT nSlot = rReq.GetSlot();
    switch(nSlot)
    {
        case SID_GALLERY_BG_BRUSH:
        {
            int nSel = rSh.GetSelectionType();
            if ( nSel & SwWrtShell::SEL_DRW_TXT )
                break;

            BYTE nPos = (BYTE)((SfxUInt16Item &)pArgs->Get(SID_GALLERY_BG_POS)).GetValue();
            ++nPos;

            SvxBrushItem aBrush( (SvxBrushItem&)pArgs->Get(SID_GALLERY_BG_BRUSH));
            aBrush.SetWhich( RES_BACKGROUND );
            if ( nPos == nParagraphPos )
                rSh.SetAttr( aBrush );
            else if ( nPos == nTablePos )
                rSh.SetTabBackground( aBrush );
            else if ( nPos == nTableRowPos )
                rSh.SetRowBackground( aBrush );
            else if ( nPos == nTableCellPos )
                rSh.SetBoxBackground( aBrush );
            else if ( nPos == nFramePos || nPos == nGraphicPos || nPos == nOlePos )
            {
                SfxItemSet aCoreSet(GetPool(), RES_BACKGROUND, RES_BACKGROUND);
                aCoreSet.Put( aBrush );
                rSh.SetFlyFrmAttr( aCoreSet );
            }
            else if ( nPos == nPagePos || nPos == nHeaderPos || nPos == nFooterPos )
            {
                USHORT nDesc = rSh.GetCurPageDesc();
                SwPageDesc aDesc( rSh.GetPageDesc( nDesc ) );
                if ( nPos == nPagePos )
                    aDesc.GetMaster().SetAttr( aBrush );
                else if ( nPos == nHeaderPos )
                {
                    SwFmtHeader aHead( aDesc.GetMaster().GetHeader() );
                    aHead.GetHeaderFmt()->SetAttr( aBrush );
                    aDesc.GetMaster().SetAttr( aHead );
                }
                else if ( nPos == nFooterPos )
                {
                    SwFmtFooter aFoot( aDesc.GetMaster().GetFooter() );
                    aFoot.GetFooterFmt()->SetAttr( aBrush );
                    aDesc.GetMaster().SetAttr( aFoot );
                }
                rSh.ChgPageDesc( nDesc, aDesc );
            }
            break;
        }
    }
    rSh.EndAction();
}

void SwBaseShell::ExecField( SfxRequest& rReq )
{
    USHORT nSlot = rReq.GetSlot();
    switch( nSlot )
    {
        case FN_CHANGE_DBFIELD:
        {
            SwChangeDBDlg *pDlg = new SwChangeDBDlg(GetView());
            pDlg->Execute();
            delete pDlg;
        }
        break;
        default:
            ASSERT(FALSE, falscher Dispatcher);
    }
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.404  2000/09/18 16:06:02  willem.vandorp
    OpenOffice header added.

    Revision 1.403  2000/09/13 11:38:45  ka
    use URL method of Gallery instead of DirEntry method

    Revision 1.402  2000/09/12 13:16:50  kz
    add. include tools/fsys.hxx

    Revision 1.401  2000/09/08 08:12:51  os
    Change: Set/Toggle/Has/Knows/Show/GetChildWindow

    Revision 1.400  2000/09/07 15:59:28  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.399  2000/08/17 11:42:20  jp
    remove the SW graphicmanager

    Revision 1.398  2000/08/15 13:51:49  os
    #77616# allow background color for graphic objects

    Revision 1.397  2000/07/11 18:54:25  jp
    Task #70407#: use the GraphikObject

    Revision 1.396  2000/07/11 17:56:35  jp
    Bug #76736#: Execute - UpdateFields reativate

    Revision 1.395  2000/06/26 13:17:56  os
    INetURLObject::SmartRelToAbs removed

    Revision 1.394  2000/06/07 13:18:20  os
    using UCB

    Revision 1.393  2000/05/30 10:40:31  os
    unused slots removed

    Revision 1.392  2000/05/26 07:21:31  os
    old SW Basic API Slots removed

    Revision 1.391  2000/05/10 11:53:01  os
    Basic API removed

    Revision 1.390  2000/05/09 14:41:35  os
    BASIC interface partially removed

    Revision 1.389  2000/05/08 11:22:47  os
    CreateSubObject

    Revision 1.388  2000/04/18 14:58:23  os
    UNICODE

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/shells/beziersh.cxx b/sw/source/ui/shells/beziersh.cxx
new file mode 100644
index 0000000..939a164
--- /dev/null
+++ b/sw/source/ui/shells/beziersh.cxx
@@ -0,0 +1,488 @@
/*************************************************************************
 *
 *  $RCSfile: beziersh.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:46 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "cmdid.h"

#ifndef _SVDVIEW_HXX //autogen
#include <svx/svdview.hxx>
#endif
#ifndef _SVX_SRCHITEM_HXX //autogen
#include <svx/srchitem.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SFX_WHITER_HXX //autogen
#include <svtools/whiter.hxx>
#endif
#ifndef _SVDOPATH_HXX //autogen
#include <svx/svdopath.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SFXVIEWFRM_HXX
#include <sfx2/viewfrm.hxx>
#endif
#ifndef _SFX_BINDINGS_HXX //autogen
#include <sfx2/bindings.hxx>
#endif
#ifndef _SFXOBJFACE_HXX //autogen
#include <sfx2/objface.hxx>
#endif
#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif

#include "wrtsh.hxx"
#include "view.hxx"
#include "edtwin.hxx"
#include "helpid.h"
#include "globals.hrc"
#include "drawbase.hxx"
#include "beziersh.hxx"

#include "popup.hrc"
#include "shells.hrc"

#define SwBezierShell
#include "itemdef.hxx"
#include "swslots.hxx"

#define C2S(cChar) UniString::CreateFromAscii(cChar)
SFX_IMPL_INTERFACE(SwBezierShell, SwBezierShell, SW_RES(STR_SHELLNAME_BEZIER))
{
    SFX_POPUPMENU_REGISTRATION(SW_RES(MN_DRAW_POPUPMENU));
    SFX_OBJECTBAR_REGISTRATION(SFX_OBJECTBAR_OBJECT, SW_RES(RID_BEZIER_TOOLBOX));
    SFX_OBJECTMENU_REGISTRATION(SID_OBJECTMENU0, SW_RES(MN_OBJECTMENU_DRAW));
}

TYPEINIT1(SwBezierShell,SwBaseShell)

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


SwBezierShell::SwBezierShell(SwView &rView):
    SwBaseShell( rView )
{
    SetName(C2S("Bezier"));
    SetHelpId(SW_BEZIERSHELL);

    SwWrtShell *pSh = &GetShell();
    SdrView*    pSdrView = pSh->GetDrawView();
    pSdrView->SetEliminatePolyPointLimitAngle(1500L);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwBezierShell::Execute(SfxRequest &rReq)
{
    SwWrtShell *pSh = &GetShell();
    SdrView*    pSdrView = pSh->GetDrawView();
    const SfxItemSet *pArgs = rReq.GetArgs();
    USHORT      nSlotId = rReq.GetSlot();
    BOOL        bChanged = pSdrView->GetModel()->IsChanged();
    pSdrView->GetModel()->SetChanged(FALSE);
    const SfxPoolItem* pItem;
    if(pArgs)
        pArgs->GetItemState(nSlotId, FALSE, &pItem);

    switch (nSlotId)
    {
        case SID_DELETE:
        case FN_BACKSPACE:
            if (pSh->IsObjSelected())
            {
                if (pSdrView->HasMarkedPoints())
                    pSh->GetView().GetViewFrame()->GetDispatcher()->Execute(SID_BEZIER_DELETE, FALSE);
                else
                {
                    pSh->DelSelectedObj();
                    if (pSh->IsSelFrmMode())
                    {
                        pSh->LeaveSelFrmMode();
                        pSh->NoEdit();
                    }
                    GetView().AttrChangedNotify(pSh); // ggf Shellwechsel...
                }
            }
            break;

        case FN_ESCAPE:
            if (pSdrView->HasMarkedPoints())
                pSdrView->UnmarkAllPoints();
            else
            {
                if ( pSh->IsDrawCreate() )
                {
                    GetView().GetDrawFuncPtr()->BreakCreate();
                    GetView().AttrChangedNotify(pSh); // ggf Shellwechsel...
                }
                else if ( pSh->HasSelection() || GetView().IsDrawMode() )
                {
                    GetView().LeaveDrawCreate();
                    pSh->EnterStdMode();
                    GetView().AttrChangedNotify(pSh); // ggf Shellwechsel...
                }
            }
            break;

        case SID_BEZIER_MOVE:
        case SID_BEZIER_INSERT:
            {
                GetView().GetEditWin().SetBezierMode(nSlotId);
                static USHORT __READONLY_DATA aInva[] =
                                {
                                    SID_BEZIER_INSERT,
                                    SID_BEZIER_MOVE,
                                    0
                                };
                GetView().GetViewFrame()->GetBindings().Invalidate(aInva);
            }
            break;

        case SID_BEZIER_DELETE:
        case SID_BEZIER_CUTLINE:
        case SID_BEZIER_CONVERT:
        case SID_BEZIER_EDGE:
        case SID_BEZIER_SMOOTH:
        case SID_BEZIER_SYMMTR:
        case SID_BEZIER_CLOSE:
        case SID_BEZIER_ELIMINATE_POINTS:
        {
            const SdrMarkList& rMarkList = pSdrView->GetMarkList();

            if (rMarkList.GetMark(0) && !pSdrView->IsAction())
            {
                switch (nSlotId)
                {
                    case SID_BEZIER_DELETE:
                        pSdrView->DeleteMarkedPoints();
                        break;

                    case SID_BEZIER_CUTLINE:
                        {
                            pSdrView->RipUpAtMarkedPoints();
                            pSh->CheckUnboundObjects();
                        }
                        break;

                    case SID_BEZIER_CONVERT:
                    {
                        pSdrView->SetMarkedSegmentsKind(SDRPATHSEGMENT_TOGGLE);
                        break;
                    }

                    case SID_BEZIER_EDGE:
                    case SID_BEZIER_SMOOTH:
                    case SID_BEZIER_SYMMTR:
                    {
                        SdrPathSmoothKind eKind;

                        switch (nSlotId)
                        {
                            case SID_BEZIER_EDGE:   eKind = SDRPATHSMOOTH_ANGULAR; break;
                            case SID_BEZIER_SMOOTH: eKind = SDRPATHSMOOTH_ASYMMETRIC; break;
                            case SID_BEZIER_SYMMTR: eKind = SDRPATHSMOOTH_SYMMETRIC; break;
                        }

                        SdrPathSmoothKind eSmooth = pSdrView->GetMarkedPointsSmooth();
                        if (eKind != eSmooth)
                        {
                            pSdrView->SetMarkedPointsSmooth(eKind);

                            static USHORT __READONLY_DATA aInva[] =
                                            {
                                                SID_BEZIER_SMOOTH,
                                                SID_BEZIER_EDGE,
                                                SID_BEZIER_SYMMTR,
                                                0
                                            };
                            GetView().GetViewFrame()->GetBindings().Invalidate(aInva);
                        }
                        break;
                    }

                    case SID_BEZIER_CLOSE:
                    {
                        SdrPathObj* pPathObj = (SdrPathObj*) rMarkList.GetMark(0)->GetObj();
                        pSdrView->UnmarkAllPoints();
                        Size aDist(GetView().GetEditWin().PixelToLogic(Size(8,8)));
                        pPathObj->ToggleClosed(aDist.Width());
                        break;
                    }

                    case SID_BEZIER_ELIMINATE_POINTS:
                        pSdrView->SetEliminatePolyPoints(!pSdrView->IsEliminatePolyPoints());
                        break;
                }
            }
        }
        break;

        default:
            break;
    }

    if (pSdrView->GetModel()->IsChanged())
        GetShell().SetModified();
    else if (bChanged)
        pSdrView->GetModel()->SetChanged(TRUE);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwBezierShell::GetState(SfxItemSet &rSet)
{
    SdrView* pSdrView = GetShell().GetDrawView();

    SfxWhichIter aIter( rSet );
    USHORT nWhich = aIter.FirstWhich();

    while( nWhich )
    {
        switch( nWhich )
        {
            case SID_BEZIER_MOVE:
            case SID_BEZIER_INSERT:
            {
                USHORT nEditMode = GetView().GetEditWin().GetBezierMode();

                rSet.Put(SfxBoolItem(nWhich, nEditMode == nWhich));
            }
            break;

            case SID_BEZIER_CUTLINE:
                if (!pSdrView->IsRipUpAtMarkedPointsPossible())
                {
                    rSet.DisableItem(SID_BEZIER_CUTLINE);
                }
                break;

            case SID_BEZIER_DELETE:
                if (!pSdrView->IsDeleteMarkedPointsPossible())
                {
                    rSet.DisableItem(SID_BEZIER_DELETE);
                }
                break;

            case SID_BEZIER_CONVERT:
                if (!pSdrView->IsSetMarkedSegmentsKindPossible())
                {
                    rSet.DisableItem(SID_BEZIER_CONVERT);
                }
                else
                {
                    SdrPathSegmentKind eSegm = pSdrView->GetMarkedSegmentsKind();
                    switch (eSegm)
                    {
                        case SDRPATHSEGMENT_DONTCARE: rSet.InvalidateItem(SID_BEZIER_CONVERT); break;
                        case SDRPATHSEGMENT_LINE    : rSet.Put(SfxBoolItem(SID_BEZIER_CONVERT,FALSE)); break; // Button reingedrueckt = Kurve
                        case SDRPATHSEGMENT_CURVE   : rSet.Put(SfxBoolItem(SID_BEZIER_CONVERT,TRUE));  break;
                    }
                }
                break;

            case SID_BEZIER_EDGE:
            case SID_BEZIER_SMOOTH:
            case SID_BEZIER_SYMMTR:
                if (!pSdrView->IsSetMarkedPointsSmoothPossible())
                    rSet.DisableItem(nWhich);
                else
                {
                    SdrPathSmoothKind eSmooth = pSdrView->GetMarkedPointsSmooth();
                    BOOL bEnable = FALSE;
                    switch (eSmooth)
                    {
                        case SDRPATHSMOOTH_DONTCARE  :
                            break;
                        case SDRPATHSMOOTH_ANGULAR   :
                            bEnable = nWhich == SID_BEZIER_EDGE;
                            break;
                        case SDRPATHSMOOTH_ASYMMETRIC:
                            bEnable = nWhich == SID_BEZIER_SMOOTH;
                            break;
                        case SDRPATHSMOOTH_SYMMETRIC :
                            bEnable = nWhich == SID_BEZIER_SYMMTR;
                            break;
                    }
                    rSet.Put(SfxBoolItem(nWhich, bEnable));
                }
                break;

            case SID_BEZIER_CLOSE:
                if (!pSdrView->IsOpenCloseMarkedObjectsPossible())
                {
                    rSet.DisableItem(SID_BEZIER_CLOSE);
                }
                else
                {
                    SdrObjClosedKind eClose = pSdrView->GetMarkedObjectsClosedState();
                    switch (eClose)
                    {
                        case SDROBJCLOSED_DONTCARE: rSet.InvalidateItem(SID_BEZIER_CLOSE); break;
                        case SDROBJCLOSED_OPEN    : rSet.Put(SfxBoolItem(SID_BEZIER_CLOSE,FALSE)); break;
                        case SDROBJCLOSED_CLOSED  : rSet.Put(SfxBoolItem(SID_BEZIER_CLOSE,TRUE)); break;
                    }
                }
                break;

            case SID_BEZIER_ELIMINATE_POINTS:
                rSet.Put(SfxBoolItem(SID_BEZIER_ELIMINATE_POINTS, pSdrView->IsEliminatePolyPoints()));
                break;

            default:
                break;
        }
        nWhich = aIter.NextWhich();
    }
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.21  2000/09/18 16:06:03  willem.vandorp
    OpenOffice header added.

    Revision 1.20  2000/09/07 15:59:28  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.19  2000/05/26 07:21:32  os
    old SW Basic API Slots removed

    Revision 1.18  2000/05/10 11:53:01  os
    Basic API removed

    Revision 1.17  2000/04/18 14:58:23  os
    UNICODE

    Revision 1.16  1997/11/29 14:51:26  MA
    includes


      Rev 1.15   29 Nov 1997 15:51:26   MA
   includes

      Rev 1.14   24 Nov 1997 09:46:54   MA
   includes

      Rev 1.13   03 Nov 1997 13:55:46   MA
   precomp entfernt

      Rev 1.12   05 Sep 1997 12:02:00   MH
   chg: header

      Rev 1.11   05 Aug 1997 16:18:42   TJ
   include svx/srchitem.hxx

      Rev 1.10   01 Aug 1997 11:45:44   MH
   chg: header

      Rev 1.9   08 Jul 1997 12:07:10   OM
   Draw-Selektionsmodi aufgeraeumt

      Rev 1.8   16 Jun 1997 15:30:24   OM
   GPF behoben: Backspace wie Delete behandeln

      Rev 1.7   07 Apr 1997 17:50:00   MH
   chg: header

      Rev 1.6   21 Feb 1997 13:25:14   MA
   #35942# Hack: CheckUnboundObjects

      Rev 1.5   23 Jan 1997 16:07:44   OM
   Aufgeraeumt

      Rev 1.4   22 Jan 1997 11:20:48   OM
   Neue Shells: DrawBaseShell und DrawControlShell

      Rev 1.3   16 Jan 1997 14:46:24   OM
   Zweistufiges Escape

      Rev 1.2   14 Jan 1997 15:37:38   OM
   Statusmethode fuer Bezier-Fkts

      Rev 1.1   13 Jan 1997 15:56:10   OM
   Bezier-Punkte loeschen

      Rev 1.0   08 Jan 1997 12:46:44   OM
   Initial revision.

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/shells/drawdlg.cxx b/sw/source/ui/shells/drawdlg.cxx
new file mode 100644
index 0000000..fabaee6
--- /dev/null
+++ b/sw/source/ui/shells/drawdlg.cxx
@@ -0,0 +1,439 @@
/*************************************************************************
 *
 *  $RCSfile: drawdlg.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:46 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#define ITEMID_COLOR_TABLE      SID_COLOR_TABLE


#ifndef _SVX_SVXIDS_HRC //autogen
#include <svx/svxids.hrc>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SFX_BINDINGS_HXX //autogen
#include <sfx2/bindings.hxx>
#endif
#ifndef _SVDVIEW_HXX //autogen
#include <svx/svdview.hxx>
#endif
#ifndef _SVX_TEXTANIM_HXX //autogen
#include <svx/textanim.hxx>
#endif
#ifndef _SVX_TAB_AREA_HXX //autogen
#include <svx/tabarea.hxx>
#endif
#ifndef _SVX_TAB_LINE_HXX //autogen
#include <svx/tabline.hxx>
#endif
#ifndef _SVX_DRAWITEM_HXX //autogen
#include <svx/drawitem.hxx>
#endif


#include "view.hxx"
#include "wrtsh.hxx"
#include "docsh.hxx"
#include "cmdid.h"

#include "drawsh.hxx"


/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwDrawShell::ExecDrawDlg(SfxRequest& rReq)
{
    SwWrtShell*     pSh     = &GetShell();
    SdrView*        pView   = pSh->GetDrawView();
    SdrModel*       pDoc    = pView->GetModel();
    Window*         pWin    = GetView().GetWindow();
    BOOL            bChanged = pDoc->IsChanged();
    pDoc->SetChanged(FALSE);

    SfxItemSet aNewAttr( pDoc->GetItemPool() );
    pView->GetAttributes( aNewAttr );

    GetView().NoRotate();

    pSh->StartAction();

    switch (rReq.GetSlot())
    {
        case FN_DRAWTEXT_ATTR_DLG:
        {
            SvxTextTabDialog* pDlg = new SvxTextTabDialog( NULL, &aNewAttr , pView);
            USHORT nResult = pDlg->Execute();

            if (nResult == RET_OK)
            {
                if (pView->HasMarkedObj())
                    pView->SetAttributes(*pDlg->GetOutputItemSet());
            }
            delete( pDlg );
        }
        break;

        case SID_ATTRIBUTES_AREA:
        {
            BOOL bHasMarked = pView->HasMarkedObj();


#if SUPD>352
            SvxAreaTabDialog* pDlg = new SvxAreaTabDialog( NULL, &aNewAttr, pDoc, pView );
#else
            SvxAreaTabDialog* pDlg = new SvxAreaTabDialog( NULL, &aNewAttr, pDoc);
#endif
            const SvxColorTableItem* pColorItem = (const SvxColorTableItem*)
                                    GetView().GetDocShell()->GetItem(SID_COLOR_TABLE);
            if(pColorItem->GetColorTable() == OFF_APP()->GetStdColorTable())
                pDlg->DontDeleteColorTable();
            if (pDlg->Execute() == RET_OK)
            {
                if (bHasMarked)
                    pView->SetAttributes(*pDlg->GetOutputItemSet());
                else
                    pView->SetDefaultAttr(*pDlg->GetOutputItemSet(), FALSE);

                static USHORT __READONLY_DATA aInval[] =
                {
                    SID_ATTR_FILL_STYLE, SID_ATTR_FILL_COLOR, 0
                };
                SfxBindings &rBnd = GetView().GetViewFrame()->GetBindings();
                rBnd.Invalidate(aInval);
                rBnd.Update(SID_ATTR_FILL_STYLE);
                rBnd.Update(SID_ATTR_FILL_COLOR);
            }
            delete pDlg;
        }
        break;

        case SID_ATTRIBUTES_LINE:
        {
            BOOL bHasMarked = pView->HasMarkedObj();

            const SdrObject* pObj = NULL;
            const SdrMarkList& rMarkList = pView->GetMarkList();
            if( rMarkList.GetMarkCount() == 1 )
                pObj = rMarkList.GetMark(0)->GetObj();

            SvxLineTabDialog* pDlg = new SvxLineTabDialog(NULL, &aNewAttr,
                                                            pDoc, pObj, bHasMarked);

            if (pDlg->Execute() == RET_OK)
            {
                if(bHasMarked)
                    pView->SetAttrToMarked(*pDlg->GetOutputItemSet(), FALSE);
                else
                    pView->SetDefaultAttr(*pDlg->GetOutputItemSet(), FALSE);

                static USHORT __READONLY_DATA aInval[] =
                {
                    SID_ATTR_LINE_STYLE, SID_ATTR_LINE_WIDTH,
                    SID_ATTR_LINE_COLOR, 0
                };

                GetView().GetViewFrame()->GetBindings().Invalidate(aInval);
            }
            delete pDlg;
        }
        break;

        default:
            break;
    }

    pSh->EndAction();

    if (pDoc->IsChanged())
        GetShell().SetModified();
    else
        if (bChanged)
            pDoc->SetChanged(TRUE);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwDrawShell::ExecDrawAttrArgs(SfxRequest& rReq)
{
    SwWrtShell* pSh   = &GetShell();
    SdrView*    pView = pSh->GetDrawView();
    const SfxItemSet* pArgs = rReq.GetArgs();
    BOOL        bChanged = pView->GetModel()->IsChanged();
    pView->GetModel()->SetChanged(FALSE);

    GetView().NoRotate();

    if (pArgs)
    {
        if(pView->HasMarkedObj())
            pView->SetAttrToMarked(*rReq.GetArgs(), FALSE);
        else
            pView->SetDefaultAttr(*rReq.GetArgs(), FALSE);
    }
    else
    {
        SfxDispatcher* pDis = pSh->GetView().GetViewFrame()->GetDispatcher();
        switch (rReq.GetSlot())
        {
            case SID_ATTR_FILL_STYLE:
            case SID_ATTR_FILL_COLOR:
            case SID_ATTR_FILL_GRADIENT:
            case SID_ATTR_FILL_HATCH:
            case SID_ATTR_FILL_BITMAP:
                pDis->Execute(SID_ATTRIBUTES_AREA, FALSE);
                break;
            case SID_ATTR_LINE_STYLE:
            case SID_ATTR_LINE_DASH:
            case SID_ATTR_LINE_WIDTH:
            case SID_ATTR_LINE_COLOR:
                pDis->Execute(SID_ATTRIBUTES_LINE, FALSE);
                break;
        }
    }
    if (pView->GetModel()->IsChanged())
        GetShell().SetModified();
    else
        if (bChanged)
            pView->GetModel()->SetChanged(TRUE);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwDrawShell::GetDrawAttrState(SfxItemSet& rSet)
{
    SdrView* pSdrView = GetShell().GetDrawView();

    if (pSdrView->HasMarkedObj())
    {
        BOOL bDisable = Disable( rSet );

        if( !bDisable )
            pSdrView->GetAttributes( rSet );
    }
    else
        rSet.Put(pSdrView->GetDefaultAttr());
}

/*************************************************************************

      Source Code Control System - History

      $Log: not supported by cvs2svn $
      Revision 1.85  2000/09/18 16:06:03  willem.vandorp
      OpenOffice header added.

      Revision 1.84  2000/09/07 15:59:28  os
      change: SFX_DISPATCHER/SFX_BINDINGS removed

      Revision 1.83  2000/07/14 14:41:26  ama
      Fix #75805#: Start/EndAction prevents from performanceproblems

      Revision 1.82  2000/05/26 07:21:32  os
      old SW Basic API Slots removed

      Revision 1.81  2000/02/11 14:57:07  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.80  1999/06/21 13:20:24  JP
      Interface changes: SdrView::GetAttributes


      Rev 1.79   21 Jun 1999 15:20:24   JP
   Interface changes: SdrView::GetAttributes

      Rev 1.78   29 Nov 1997 15:54:02   MA
   includes

      Rev 1.77   24 Nov 1997 09:46:54   MA
   includes

      Rev 1.76   02 Sep 1997 13:23:16   OS
   includes

      Rev 1.75   01 Sep 1997 13:27:30   OS
   DLL-Umstellung

      Rev 1.74   26 Aug 1997 16:13:08   TRI
   VCL Anpassungen

      Rev 1.73   07 Apr 1997 17:42:54   MH
   chg: header

      Rev 1.72   23 Jan 1997 10:45:50   OM
   Neue Shells: Control- und DrawBaseShell

      Rev 1.71   22 Jan 1997 11:35:56   OM
   Neuer Parameter fuer SvxAreaTabDialog

      Rev 1.70   22 Jan 1997 11:20:50   OM
   Neue Shells: DrawBaseShell und DrawControlShell

      Rev 1.69   13 Jan 1997 15:56:10   OM
   Bezier-Punkte loeschen

      Rev 1.68   08 Jan 1997 12:48:56   OM
   Neue Segs

      Rev 1.67   08 Jan 1997 12:47:20   OM
   Aenderungen fuer Bezier-Shell

      Rev 1.66   20 Dec 1996 13:22:18   MA
   includes

      Rev 1.65   13 Dec 1996 12:19:10   OM
   Bezier-Controller Status und Execute

      Rev 1.64   29 Nov 1996 10:57:42   OM
   #33865# Fehlende Draw-Attribute gesetzt

      Rev 1.63   28 Nov 1996 16:32:32   OM
   Malattribute nur ohne selektiertes Objekt als Default setzen

      Rev 1.62   28 Nov 1996 13:07:44   OM
   #33823# Dok-Switch bei Draw-Dialogen unterbunden

      Rev 1.61   27 Nov 1996 16:15:08   OM
   #33427# Zeichenobjekte: automatischer Layerwechsel je nach Umlaufart

      Rev 1.60   27 Nov 1996 10:05:18   OM
   #33627# SetGeoAttr durch SetAttributes ersetzt

      Rev 1.59   19 Nov 1996 15:55:20   NF
   clooks...

      Rev 1.58   15 Nov 1996 13:34:00   OS
   SvxTextTabDialog angebunden

      Rev 1.57   08 Nov 1996 15:59:24   OM
   Schuetzen neu organisiert, transparenz im Draw-Mode

      Rev 1.56   29 Oct 1996 17:21:48   OM
   Abstaende auch im Drawmode

      Rev 1.55   23 Oct 1996 20:04:46   OM
   Drawobjekt Textumfluss-Dlg

      Rev 1.54   23 Oct 1996 13:04:46   OS
   DontDeleteColorTable am SvxAreaTabDialog ruen

      Rev 1.53   01 Oct 1996 16:54:00   OM
   Hyperlinks editieren

      Rev 1.52   28 Aug 1996 15:55:02   OS
   includes

      Rev 1.51   15 Aug 1996 13:44:20   JP
   svdraw.hxx entfernt

      Rev 1.50   31 May 1996 11:01:36   NF
   CLOOKS

      Rev 1.49   29 May 1996 13:05:26   OS
   headerstop wieder vor den Win31-defines

      Rev 1.48   29 May 1996 09:49:00   TRI
   CLOOKS

      Rev 1.47   21 May 1996 16:57:12   AMA
   Fix: Start+EndAction nach dem DrawDialog.

      Rev 1.46   21 May 1996 08:50:42   NF
   CLOOKS

      Rev 1.45   14 May 1996 15:17:06   HJS
   CLOOKS

      Rev 1.44   10 May 1996 15:57:18   OS
   Zeichenbindung an Drawobjekten

      Rev 1.43   30 Apr 1996 13:45:18   OS
   veraenderter TransformDlg ab 315

      Rev 1.42   07 Mar 1996 14:55:58   HJS
   2 defines zu viel

*************************************************************************/



diff --git a/sw/source/ui/shells/drawsh.cxx b/sw/source/ui/shells/drawsh.cxx
new file mode 100644
index 0000000..59ba1473
--- /dev/null
+++ b/sw/source/ui/shells/drawsh.cxx
@@ -0,0 +1,640 @@
/*************************************************************************
 *
 *  $RCSfile: drawsh.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:46 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop


#ifndef _SVDVIEW_HXX //autogen
#include <svx/svdview.hxx>
#endif
#ifndef _SVDOTEXT_HXX //autogen
#include <svx/svdotext.hxx>
#endif
#ifndef _SFX_WHITER_HXX //autogen
#include <svtools/whiter.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SVX_FONTWORK_HXX //autogen
#include <svx/fontwork.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SFX_BINDINGS_HXX //autogen
#include <sfx2/bindings.hxx>
#endif
#ifndef _SFXOBJFACE_HXX //autogen
#include <sfx2/objface.hxx>
#endif
#ifndef _SFXITEMITER_HXX //autogen
#include <svtools/itemiter.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _SVX_SRCHITEM_HXX
#include <svx/srchitem.hxx>
#endif
#ifndef _SVX_XFTSFIT_HXX //autogen
#include <svx/xftsfit.hxx>
#endif
#ifndef _SFXVIEWFRM_HXX
#include <sfx2/viewfrm.hxx>
#endif


#include "swundo.hxx"
#include "view.hxx"
#include "wrtsh.hxx"
#include "cmdid.h"
#include "globals.hrc"
#include "helpid.h"
#include "popup.hrc"
#include "shells.hrc"
#include "drwbassh.hxx"
#include "drawsh.hxx"

#define SwDrawShell
#include "itemdef.hxx"
#include "swslots.hxx"


SFX_IMPL_INTERFACE(SwDrawShell, SwDrawBaseShell, SW_RES(STR_SHELLNAME_DRAW))
{
    SFX_POPUPMENU_REGISTRATION(SW_RES(MN_DRAW_POPUPMENU));
    SFX_OBJECTBAR_REGISTRATION(SFX_OBJECTBAR_OBJECT, SW_RES(RID_DRAW_TOOLBOX));
    SFX_OBJECTMENU_REGISTRATION(SID_OBJECTMENU0, SW_RES(MN_OBJECTMENU_DRAW));
    SFX_CHILDWINDOW_REGISTRATION(SvxFontWorkChildWindow::GetChildWindowId());
}

TYPEINIT1(SwDrawShell,SwDrawBaseShell)

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwDrawShell::Execute(SfxRequest &rReq)
{
    SwWrtShell          &rSh = GetShell();
    SdrView             *pSdrView = rSh.GetDrawView();
    const SfxItemSet    *pArgs = rReq.GetArgs();
    SfxBindings         &rBnd  = GetView().GetViewFrame()->GetBindings();
    USHORT               nSlotId = rReq.GetSlot();
    BOOL                 bChanged = pSdrView->GetModel()->IsChanged();

    pSdrView->GetModel()->SetChanged(FALSE);

    const SfxPoolItem* pItem;
    if(pArgs)
        pArgs->GetItemState(nSlotId, FALSE, &pItem);

    BOOL bMirror = TRUE, bTopParam = TRUE, bBottomParam = TRUE;

    switch (nSlotId)
    {
        case SID_OBJECT_ROTATE:
            if (rSh.IsObjSelected() && pSdrView->IsRotateAllowed())
            {
                if (GetView().IsDrawRotate())
                    rSh.SetDragMode(SDRDRAG_MOVE);
                else
                    rSh.SetDragMode(SDRDRAG_ROTATE);

                GetView().FlipDrawRotate();
            }
            break;

        case SID_BEZIER_EDIT:
            if (GetView().IsDrawRotate())
            {
                rSh.SetDragMode(SDRDRAG_MOVE);
                GetView().FlipDrawRotate();
            }
            GetView().FlipDrawSelMode();
            pSdrView->SetFrameDragSingles(GetView().IsDrawSelMode());
            GetView().AttrChangedNotify(&rSh); // Shellwechsel...
            break;

        case SID_OBJECT_HELL:
            if (rSh.IsObjSelected())
            {
                rSh.StartUndo( UNDO_START );
                SetWrapMode(FN_FRAME_WRAPTHRU_TRANSP);
                rSh.SelectionToHell();
                rSh.EndUndo( UNDO_END );
                rBnd.Invalidate(SID_OBJECT_HEAVEN);
            }
            break;

        case SID_OBJECT_HEAVEN:
            if (rSh.IsObjSelected())
            {
                rSh.StartUndo( UNDO_START );
                SetWrapMode(FN_FRAME_WRAPTHRU);
                rSh.SelectionToHeaven();
                rSh.EndUndo( UNDO_END );
                rBnd.Invalidate(SID_OBJECT_HELL);
            }
            break;

        case FN_TOOL_HIERARCHIE:
            if (rSh.IsObjSelected())
            {
                rSh.StartUndo( UNDO_START );
                if (rSh.GetLayerId() == 0)
                {
                    SetWrapMode(FN_FRAME_WRAPTHRU);
                    rSh.SelectionToHeaven();
                }
                else
                {
                    SetWrapMode(FN_FRAME_WRAPTHRU_TRANSP);
                    rSh.SelectionToHell();
                }
                rSh.EndUndo( UNDO_END );
                rBnd.Invalidate( SID_OBJECT_HELL, SID_OBJECT_HEAVEN, 0 );
            }
            break;

        case FN_TOOL_VMIRROR:
            bMirror = FALSE;
            /* no break */
        case FN_TOOL_HMIRROR:
            rSh.MirrorSelection( bMirror );
            break;

        case SID_FONTWORK:
        {
            SfxViewFrame* pVFrame = GetView().GetViewFrame();
            if (pArgs)
            {
                pVFrame->SetChildWindow(SvxFontWorkChildWindow::GetChildWindowId(),
                    ((const SfxBoolItem&)(pArgs->Get(SID_FONTWORK))).GetValue());
            }
            else
                pVFrame->ToggleChildWindow( SvxFontWorkChildWindow::GetChildWindowId() );
            pVFrame->GetBindings().Invalidate(SID_FONTWORK);
        }
        break;

        default:
            DBG_ASSERT(!this, "falscher Dispatcher");
            return;
    }
    if (pSdrView->GetModel()->IsChanged())
        rSh.SetModified();
    else if (bChanged)
        pSdrView->GetModel()->SetChanged(TRUE);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



void SwDrawShell::GetState(SfxItemSet& rSet)
{
    SwWrtShell &rSh = GetShell();
    SdrView* pSdrView = rSh.GetDrawViewWithValidMarkList();
    SfxWhichIter aIter( rSet );
    USHORT nWhich = aIter.FirstWhich();
    BOOL bProtected = rSh.IsSelObjProtected(FLYPROTECT_CONTENT);

    if (!bProtected)    // Im Parent nachsehen
        bProtected |= rSh.IsSelObjProtected( (FlyProtectType)(FLYPROTECT_CONTENT|FLYPROTECT_PARENT) ) != 0;

    while( nWhich )
    {
        switch( nWhich )
        {
            case SID_OBJECT_HELL:
                if ( !rSh.IsObjSelected() || rSh.GetLayerId() == 0 || bProtected )
                    rSet.DisableItem( nWhich );
                break;

            case SID_OBJECT_HEAVEN:
                if ( !rSh.IsObjSelected() || rSh.GetLayerId() == 1 || bProtected )
                    rSet.DisableItem( nWhich );
                break;

            case FN_TOOL_HIERARCHIE:
                if ( !rSh.IsObjSelected() || bProtected )
                    rSet.DisableItem( nWhich );
                break;

            case SID_OBJECT_ROTATE:
            {
                const BOOL bIsRotate = GetView().IsDrawRotate();
                if ( !bIsRotate && !pSdrView->IsRotateAllowed() || bProtected )
                    rSet.DisableItem( nWhich );
                else
                    rSet.Put( SfxBoolItem( nWhich, bIsRotate ) );
            }
            break;

            case SID_BEZIER_EDIT:
                if (!Disable(rSet, nWhich))
                    rSet.Put( SfxBoolItem( nWhich, !GetView().IsDrawSelMode()));
            break;

            case FN_TOOL_VMIRROR:
                if ( !pSdrView->IsMirrorAllowed() || bProtected )
                    rSet.DisableItem( nWhich );
                break;

            case FN_TOOL_HMIRROR:
                if ( !pSdrView->IsMirrorAllowed() || bProtected )
                    rSet.DisableItem( nWhich );
                break;

            case SID_FONTWORK:
            {
                if (bProtected)
                    rSet.DisableItem( nWhich );
                else
                {
                    const USHORT nId = SvxFontWorkChildWindow::GetChildWindowId();
                    rSet.Put(SfxBoolItem( nWhich , GetView().GetViewFrame()->HasChildWindow(nId)));
                }
            }
            break;
        }
        nWhich = aIter.NextWhich();
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



SwDrawShell::SwDrawShell(SwView &rView) :
    SwDrawBaseShell(rView)
{
    SetHelpId(SW_DRAWSHELL);
    SetName(String::CreateFromAscii("Draw"));
}

/*************************************************************************
|*
|* SfxRequests fuer FontWork bearbeiten
|*
\************************************************************************/



void SwDrawShell::ExecFormText(SfxRequest& rReq)
{
    SwWrtShell &rSh = GetShell();
    SdrView*    pDrView = rSh.GetDrawView();
    BOOL        bChanged = pDrView->GetModel()->IsChanged();
    pDrView->GetModel()->SetChanged(FALSE);

    const SdrMarkList& rMarkList = pDrView->GetMarkList();

    if ( rMarkList.GetMarkCount() == 1 && rReq.GetArgs() )
    {
        const SfxItemSet& rSet = *rReq.GetArgs();
        const SfxPoolItem* pItem;

        if ( pDrView->IsTextEdit() )
        {
            pDrView->EndTextEdit( TRUE );
            GetView().AttrChangedNotify(&rSh);
        }

        if ( rSet.GetItemState(XATTR_FORMTXTSTDFORM, TRUE, &pItem) ==
             SFX_ITEM_SET &&
            ((const XFormTextStdFormItem*) pItem)->GetValue() != XFTFORM_NONE )
        {

            const USHORT nId = SvxFontWorkChildWindow::GetChildWindowId();

            SvxFontWorkDialog* pDlg = (SvxFontWorkDialog*)(GetView().GetViewFrame()->
                                        GetChildWindow(nId)->GetWindow());

            pDlg->CreateStdFormObj(*pDrView, *pDrView->GetPageViewPvNum(0),
                                    rSet, *rMarkList.GetMark(0)->GetObj(),
                                   ((const XFormTextStdFormItem*) pItem)->
                                   GetValue());

        }
        else
            pDrView->SetAttributes(rSet);
    }
    if (pDrView->GetModel()->IsChanged())
        rSh.SetModified();
    else
        if (bChanged)
            pDrView->GetModel()->SetChanged(TRUE);
}

/*************************************************************************
|*
|* Statuswerte fuer FontWork zurueckgeben
|*
\************************************************************************/



void SwDrawShell::GetFormTextState(SfxItemSet& rSet)
{
    SwWrtShell &rSh = GetShell();
    SdrView* pDrView = rSh.GetDrawView();
    const SdrMarkList& rMarkList = pDrView->GetMarkList();
    const SdrObject* pObj = NULL;
    SvxFontWorkDialog* pDlg = NULL;

    const USHORT nId = SvxFontWorkChildWindow::GetChildWindowId();

    SfxViewFrame* pVFrame = GetView().GetViewFrame();
    if ( pVFrame->HasChildWindow(nId) )
        pDlg = (SvxFontWorkDialog*)(pVFrame->GetChildWindow(nId)->GetWindow());

    if ( rMarkList.GetMarkCount() == 1 )
        pObj = rMarkList.GetMark(0)->GetObj();

    if ( pObj == NULL || !pObj->ISA(SdrTextObj) ||
        !((SdrTextObj*) pObj)->HasText() )
    {
#define XATTR_ANZ 12
        static const USHORT nXAttr[ XATTR_ANZ ] =
        {
            XATTR_FORMTXTSTYLE, XATTR_FORMTXTADJUST, XATTR_FORMTXTDISTANCE,
            XATTR_FORMTXTSTART, XATTR_FORMTXTMIRROR, XATTR_FORMTXTSTDFORM,
            XATTR_FORMTXTHIDEFORM, XATTR_FORMTXTOUTLINE, XATTR_FORMTXTSHADOW,
            XATTR_FORMTXTSHDWCOLOR, XATTR_FORMTXTSHDWXVAL, XATTR_FORMTXTSHDWYVAL
        };
        for( USHORT i = 0; i < XATTR_ANZ; )
            rSet.DisableItem( nXAttr[ i++ ] );
    }
    else
    {
        if ( pDlg )
            pDlg->SetColorTable(OFF_APP()->GetStdColorTable());

        pDrView->GetAttributes( rSet );
    }
}

/*************************************************************************

      Source Code Control System - History

      $Log: not supported by cvs2svn $
      Revision 1.143  2000/09/18 16:06:03  willem.vandorp
      OpenOffice header added.

      Revision 1.142  2000/09/08 08:12:51  os
      Change: Set/Toggle/Has/Knows/Show/GetChildWindow

      Revision 1.141  2000/09/07 15:59:29  os
      change: SFX_DISPATCHER/SFX_BINDINGS removed

      Revision 1.140  2000/05/26 07:21:32  os
      old SW Basic API Slots removed

      Revision 1.139  2000/05/10 11:53:01  os
      Basic API removed

      Revision 1.138  2000/04/18 14:58:23  os
      UNICODE

      Revision 1.137  1999/06/21 13:20:24  JP
      Interface changes: SdrView::GetAttributes


      Rev 1.136   21 Jun 1999 15:20:24   JP
   Interface changes: SdrView::GetAttributes

      Rev 1.135   12 Jan 1999 17:13:44   TJ
   include

      Rev 1.134   11 Jan 1999 12:41:48   MA
   #60294# Undo-Klammerung vervollstaendigt

      Rev 1.133   06 Oct 1998 12:44:58   JP
   Bug #57153#: neu GetDrawViewWithValidMarkList

      Rev 1.132   10 Jun 1998 11:23:18   OM
   Hell/Heaven nicht in FormShell

      Rev 1.131   15 Apr 1998 15:32:24   OM
   #49467 Objekte innerhalb von geschuetzten Rahmen duerfen nicht veraendert werden

      Rev 1.130   29 Nov 1997 15:52:14   MA
   includes

      Rev 1.129   24 Nov 1997 09:46:56   MA
   includes

      Rev 1.128   03 Nov 1997 13:55:44   MA
   precomp entfernt

      Rev 1.127   01 Sep 1997 13:23:04   OS
   DLL-Umstellung

      Rev 1.126   05 Aug 1997 16:21:54   TJ
   include svx/srchitem.hxx

      Rev 1.125   05 Aug 1997 13:29:54   MH
   chg: header

      Rev 1.124   01 Aug 1997 11:47:18   MH
   chg: header

      Rev 1.123   18 Jun 1997 18:10:34   HJS
   Typeinit wieder hinein

      Rev 1.122   17 Jun 1997 16:15:18   MA
   DrawTxtShell nicht von BaseShell ableiten + Opts

      Rev 1.121   13 May 1997 13:24:26   OM
   Unnoetigen Include entfernt

      Rev 1.120   07 Apr 1997 17:41:54   MH
   chg: header

      Rev 1.119   24 Feb 1997 16:53:08   OM
   Silbentrennung in Draw-Objekten

      Rev 1.118   22 Jan 1997 14:40:30   OM
   unnoetige Includes entfernt

      Rev 1.117   22 Jan 1997 11:20:50   OM
   Neue Shells: DrawBaseShell und DrawControlShell

      Rev 1.116   16 Jan 1997 16:46:46   OM
   Editmode on/off nur im richtigen Mode

      Rev 1.115   14 Jan 1997 15:37:58   OM
   Beziermode korrigiert

      Rev 1.114   13 Jan 1997 15:56:10   OM
   Bezier-Punkte loeschen

      Rev 1.113   13 Jan 1997 10:12:10   OM
   Selektionsmode fuer Bezier-Objekte

      Rev 1.112   09 Jan 1997 16:24:02   OM
   Selektionsmode fuer Bezier-Objekte

      Rev 1.111   08 Jan 1997 12:48:58   OM
   Neue Segs

      Rev 1.110   08 Jan 1997 12:47:22   OM
   Aenderungen fuer Bezier-Shell

      Rev 1.109   18 Dec 1996 15:47:28   OM
   #34500# Keine Texteingabe im Drawmode

      Rev 1.108   13 Dec 1996 12:19:10   OM
   Bezier-Controller Status und Execute

      Rev 1.107   11 Dec 1996 12:34:06   OM
   Bezier-Controller

      Rev 1.106   30 Nov 1996 14:06:16   OS
   Ausrichtung ueber Menue: EnumItem auswerten

      Rev 1.105   29 Nov 1996 17:02:48   OS
   FN_TOOL_ANKER jetzt in der Baseshell

      Rev 1.104   27 Nov 1996 16:15:18   OM
   #33427# Zeichenobjekte: automatischer Layerwechsel je nach Umlaufart

      Rev 1.103   26 Nov 1996 11:56:22   NF
   defines entfernt...

      Rev 1.102   25 Nov 1996 10:55:28   OS
   Slotumrechnung fuer SID_OBJECT_ALIGN entfernt

      Rev 1.101   18 Nov 1996 13:39:32   MA
   chg: State fuer align

      Rev 1.100   15 Nov 1996 19:38:56   MA
   opt, include

      Rev 1.99   11 Nov 1996 13:37:34   MA
   ResMgr

      Rev 1.97   08 Nov 1996 11:59:20   HJS
   include w.g. positivdefine

      Rev 1.96   07 Nov 1996 16:20:08   OS
   Wrap- und Anker-Methoden an die BaseShell

      Rev 1.95   17 Oct 1996 14:35:18   MH
   add: include

      Rev 1.94   01 Oct 1996 16:54:00   OM
   Hyperlinks editieren

      Rev 1.93   28 Aug 1996 15:54:54   OS
   includes

      Rev 1.92   23 Aug 1996 12:51:56   HJS
   clooks

      Rev 1.91   22 Aug 1996 16:37:44   NF
   clooks

      Rev 1.90   14 Aug 1996 19:33:06   JP
   svdraw.hxx entfernt

      Rev 1.89   13 Aug 1996 12:38:42   OS
   neue Shellnamen im IDL-Interface

      Rev 1.88   09 Aug 1996 15:15:04   OS
   neu: ObjectName und Value an Controls

      Rev 1.87   02 Aug 1996 10:39:36   MH
   Wer zum Teufel braucht sfxexp.hxx an dieser Stelle ?
   Win16 jedenfalls nicht

      Rev 1.86   30 Jul 1996 16:43:02   OS
   FN_TOOL_ANKER_PAGE wieder ohne Statusmethode

      Rev 1.85   27 Jul 1996 14:58:42   OS
   Aenderungen fuer den Html-Mode

      Rev 1.84   24 Jul 1996 11:06:36   NF
   defines in ifdef win geklammert...

      Rev 1.83   24 Jul 1996 09:13:04   NF
   defines entfernt ...

      Rev 1.82   23 Jul 1996 14:33:28   NF
   CLOOKS

*************************************************************************/



diff --git a/sw/source/ui/shells/drformsh.cxx b/sw/source/ui/shells/drformsh.cxx
new file mode 100644
index 0000000..eccfd0e
--- /dev/null
+++ b/sw/source/ui/shells/drformsh.cxx
@@ -0,0 +1,375 @@
/*************************************************************************
 *
 *  $RCSfile: drformsh.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:46 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include <hintids.hxx>
#ifndef _SVX_HLNKITEM_HXX //autogen
#include <svx/hlnkitem.hxx>
#endif
#ifndef _SVDVIEW_HXX //autogen
#include <svx/svdview.hxx>
#endif
#ifndef _SFX_WHITER_HXX //autogen
#include <svtools/whiter.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SFXOBJFACE_HXX //autogen
#include <sfx2/objface.hxx>
#endif
#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif
#ifndef _SVX_SRCHITEM_HXX
#include <svx/srchitem.hxx>
#endif
#ifndef _SVX_FMGLOB_HXX
#include <svx/fmglob.hxx>
#endif
#ifndef _SVDOUNO_HXX //autogen
#include <svx/svdouno.hxx>
#endif
#ifndef _COM_SUN_STAR_FORM_FORMBUTTONTYPE_HPP_
#include <com/sun/star/form/FormButtonType.hpp>
#endif
#ifndef _SVX_HTMLMODE_HXX
#include <svx/htmlmode.hxx>
#endif
#ifndef _URLOBJ_HXX //autogen
#include <tools/urlobj.hxx>
#endif

#include "viewopt.hxx"
#include "swmodule.hxx"
#include "wrtsh.hxx"
#include "cmdid.h"
#include "globals.hrc"
#include "helpid.h"
#include "popup.hrc"
#include "shells.hrc"
#include "drwbassh.hxx"
#include "drformsh.hxx"
#include "view.hxx"

#define SwDrawFormShell
#include "itemdef.hxx"
#include "swslots.hxx"

#define C2U(cChar) OUString::createFromAscii(cChar)

using namespace ::com::sun::star;
using namespace ::rtl;

SFX_IMPL_INTERFACE(SwDrawFormShell, SwDrawBaseShell, SW_RES(STR_SHELLNAME_DRAWFORM))
{
    SFX_POPUPMENU_REGISTRATION(SW_RES(MN_DRAWFORM_POPUPMENU));
    SFX_OBJECTBAR_REGISTRATION(SFX_OBJECTBAR_OBJECT, SW_RES(RID_DRAWFORM_TOOLBOX));
    SFX_OBJECTMENU_REGISTRATION(SID_OBJECTMENU0, SW_RES(MN_OBJECTMENU_DRAWFORM));
}


TYPEINIT1(SwDrawFormShell, SwDrawBaseShell)


void SwDrawFormShell::Execute(SfxRequest &rReq)
{
    SwWrtShell &rSh = GetShell();
    const SfxPoolItem* pItem = 0;
    const SfxItemSet *pArgs = rReq.GetArgs();

    switch ( rReq.GetSlot() )
    {
        case SID_HYPERLINK_SETLINK:
        {
        if(pArgs)
            pArgs->GetItemState(SID_HYPERLINK_SETLINK, sal_False, &pItem);
        if(pItem)
        {
            SdrView *pSdrView = rSh.GetDrawView();
            const SvxHyperlinkItem& rHLinkItem = *(const SvxHyperlinkItem *)pItem;
            const SdrMarkList& rMarkList = pSdrView->GetMarkList();
            if (rMarkList.GetMark(0))
            {
                SdrUnoObj* pUnoCtrl = PTR_CAST(SdrUnoObj, rMarkList.GetMark(0)->GetObj());
                if (pUnoCtrl && FmFormInventor == pUnoCtrl->GetObjInventor())
                {
                    uno::Reference< awt::XControlModel >  xControlModel = pUnoCtrl->GetUnoControlModel();

                    ASSERT( xControlModel.is(), "UNO-Control ohne Model" );
                    if( !xControlModel.is() )
                        return;

                    uno::Reference< beans::XPropertySet >  xPropSet(xControlModel, uno::UNO_QUERY);

                    uno::Any aTmp;

                    // Darf man eine URL an dem Objekt setzen?
                    uno::Reference< beans::XPropertySetInfo >  xPropInfoSet = xPropSet->getPropertySetInfo();
                    beans::Property aProp = xPropInfoSet->getPropertyByName( C2U("TargetURL" ));
                    if (aProp.Name.getLength())
                    {
                        // Ja!
                        aTmp <<= OUString(rHLinkItem.GetName());
                        xPropSet->setPropertyValue(C2U("Label"), aTmp );

                        aTmp <<=  OUString(INetURLObject::RelToAbs(rHLinkItem.GetURL()));
                        xPropSet->setPropertyValue( C2U("TargetURL"), aTmp );

                        if( rHLinkItem.GetTargetFrame().Len() )
                        {
                            aTmp <<=  OUString(rHLinkItem.GetTargetFrame());
                            xPropSet->setPropertyValue( C2U("TargetFrame"), aTmp );
                        }


                         form::FormButtonType eButtonType = form::FormButtonType_URL;
                        aTmp.setValue( &eButtonType, ::getCppuType((const form::FormButtonType*)0));
                        xPropSet->setPropertyValue( C2U("ButtonType"), aTmp );
                    }
                }
            }
        }
        }
        break;

        default:
            DBG_ASSERT(!this, "falscher Dispatcher");
            return;
    }
}

void SwDrawFormShell::GetState(SfxItemSet& rSet)
{
    SwWrtShell &rSh = GetShell();
    SfxWhichIter aIter( rSet );
    sal_uInt16 nWhich = aIter.FirstWhich();

    while( nWhich )
    {
        switch( nWhich )
        {
            case SID_HYPERLINK_GETLINK:
            {
                SdrView* pSdrView = rSh.GetDrawViewWithValidMarkList();
                const SdrMarkList& rMarkList = pSdrView->GetMarkList();
                SvxHyperlinkItem aHLinkItem;
                if (rMarkList.GetMark(0))
                {
                    SdrUnoObj* pUnoCtrl = PTR_CAST(SdrUnoObj, rMarkList.GetMark(0)->GetObj());
                    if (pUnoCtrl && FmFormInventor == pUnoCtrl->GetObjInventor())
                    {
                        uno::Reference< awt::XControlModel >  xControlModel = pUnoCtrl->GetUnoControlModel();

                        ASSERT( xControlModel.is(), "UNO-Control ohne Model" );
                        if( !xControlModel.is() )
                            return;

                        uno::Reference< beans::XPropertySet >  xPropSet(xControlModel, uno::UNO_QUERY);

                        uno::Any aTmp;
                        uno::Reference< beans::XPropertySetInfo >  xInfo = xPropSet->getPropertySetInfo();
                        if(xInfo->hasPropertyByName(C2U("ButtonType" )))
                        {
                             form::FormButtonType eButtonType = form::FormButtonType_URL;
                            aTmp = xPropSet->getPropertyValue( C2U("ButtonType") );
                            if( aTmp.getValueType() == ::getCppuType((form::FormButtonType*)0)
                                &&  eButtonType == *( form::FormButtonType*)aTmp.getValue())
                            {
                                // Label
                                if(xInfo->hasPropertyByName( C2U("Label") ))
                                {
                                    aTmp = xPropSet->getPropertyValue( C2U("Label") );
                                    if( aTmp.getValueType() == ::getCppuType((const OUString*)0) )
                                    {
                                        OUString sTmp = *(OUString*)aTmp.getValue();
                                        if(sTmp.getLength())
                                            aHLinkItem.SetName(sTmp);
                                    }
                                }

                                // URL
                                if(xInfo->hasPropertyByName( C2U("TargetURL" )))
                                {
                                    aTmp = xPropSet->getPropertyValue( C2U("TargetURL") );
                                    if( aTmp.getValueType() == ::getCppuType((const OUString*)0))
                                    {
                                        OUString sTmp = *(OUString*)aTmp.getValue();
                                        if(sTmp.getLength())
                                            aHLinkItem.SetURL(sTmp);
                                    }
                                }

                                // Target
                                if(xInfo->hasPropertyByName( C2U("TargetFrame") ))
                                {
                                    aTmp = xPropSet->getPropertyValue( C2U("TargetFrame") );
                                    if( aTmp.getValueType() == ::getCppuType((const OUString*)0))
                                    {
                                        OUString sTmp = *(OUString*) aTmp.getValue();
                                        if(sTmp.getLength())
                                            aHLinkItem.SetTargetFrame(sTmp);
                                    }
                                }
                                aHLinkItem.SetInsertMode(HLINK_BUTTON);
                            }
                        }
                    }
                }
                sal_uInt16 nHtmlMode = ::GetHtmlMode(GetView().GetDocShell());
                aHLinkItem.SetInsertMode((SvxLinkInsertMode)(aHLinkItem.GetInsertMode() |
                    ((nHtmlMode & HTMLMODE_ON) != 0 ? HLINK_HTMLMODE : 0)));

                rSet.Put(aHLinkItem);
            }
            break;
        }
        nWhich = aIter.NextWhich();
    }
}


SwDrawFormShell::SwDrawFormShell(SwView &rView) :
    SwDrawBaseShell(rView)
{
    SetHelpId(SW_DRAWFORMSHELL);
    GetShell().NoEdit(sal_True);
    SetName(String::CreateFromAscii("DrawForm"));
}

SwDrawFormShell::~SwDrawFormShell()
{
}

/*************************************************************************

      Source Code Control System - History

      $Log: not supported by cvs2svn $
      Revision 1.19  2000/09/18 16:06:03  willem.vandorp
      OpenOffice header added.

      Revision 1.18  2000/05/26 07:21:32  os
      old SW Basic API Slots removed

      Revision 1.17  2000/05/16 09:15:13  os
      project usr removed

      Revision 1.16  2000/05/10 11:53:01  os
      Basic API removed

      Revision 1.15  2000/04/18 14:58:23  os
      UNICODE

      Revision 1.14  2000/03/23 07:49:14  os
      UNO III

      Revision 1.13  2000/02/11 14:57:20  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.12  1999/11/19 16:40:24  os
      modules renamed

      Revision 1.11  1999/09/24 14:38:32  os
      hlnkitem.hxx now in SVX

      Revision 1.10  1999/03/29 08:31:06  OS
      #64017# vor getPropertyValue immer hasPropertyByName rufen


      Rev 1.9   29 Mar 1999 10:31:06   OS
   #64017# vor getPropertyValue immer hasPropertyByName rufen

      Rev 1.8   26 Jan 1999 14:48:26   OS
   #56371# TF_ONE51

      Rev 1.7   26 Nov 1998 15:19:44   MA
   #59896# Raster usw jetzt an der Application

      Rev 1.6   02 Nov 1998 09:22:10   MA
   #58294# Slots fuer Raster

      Rev 1.5   07 Oct 1998 10:58:48   JP
   Bug #57153#: in allen GetStates einer DrawShell die MarkListe aktualisieren

      Rev 1.4   07 Jul 1998 14:03:54   OM
   #51853# URL-Button wiederbelebt

      Rev 1.3   06 Jul 1998 14:18:44   OM
   #51853# URL-Button einfuegen

      Rev 1.2   19 May 1998 12:45:50   OM
   SvxMacro-Umstellung

      Rev 1.1   08 Apr 1998 13:46:58   OM
   #42505 Keine URL-Buttons in Html-Dokumenten

      Rev 1.0   11 Mar 1998 17:06:02   OM
   Initial revision.

*************************************************************************/


diff --git a/sw/source/ui/shells/drwbassh.cxx b/sw/source/ui/shells/drwbassh.cxx
new file mode 100644
index 0000000..e4acb4d
--- /dev/null
+++ b/sw/source/ui/shells/drwbassh.cxx
@@ -0,0 +1,762 @@
/*************************************************************************
 *
 *  $RCSfile: drwbassh.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:46 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "hintids.hxx"

#ifndef _SFXOBJFACE_HXX //autogen
#include <sfx2/objface.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SFX_BINDINGS_HXX //autogen
#include <sfx2/bindings.hxx>
#endif
#ifndef _AEITEM_HXX //autogen
#include <svtools/aeitem.hxx>
#endif
#ifndef _SVDVIEW_HXX //autogen
#include <svx/svdview.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SVX_SRCHITEM_HXX //autogen
#include <svx/srchitem.hxx>
#endif
#ifndef _SFX_WHITER_HXX //autogen
#include <svtools/whiter.hxx>
#endif
#ifndef _SVX_TRANSFRM_HXX //autogen
#include <svx/transfrm.hxx>
#endif
#ifndef _SVX_LABDLG_HXX //autogen
#include <svx/labdlg.hxx>
#endif
#ifndef _SVX_ANCHORID_HXX //autogen
#include <svx/anchorid.hxx>
#endif
#ifndef _SVX_HTMLMODE_HXX //autogen
#include <svx/htmlmode.hxx>
#endif
#ifndef _SFXVIEWFRM_HXX
#include <sfx2/viewfrm.hxx>
#endif


#ifndef _FMTORNT_HXX
#include <fmtornt.hxx>
#endif
#include "cmdid.h"
#include "wrtsh.hxx"
#include "view.hxx"
#include "edtwin.hxx"
#include "viewopt.hxx"
#include "dcontact.hxx"
#include "frmfmt.hxx"
#include "wrap.hxx"
#include "drawbase.hxx"
#include "drwbassh.hxx"

#define SwDrawBaseShell
#include "itemdef.hxx"
#include "swslots.hxx"

SFX_IMPL_INTERFACE(SwDrawBaseShell, SwBaseShell, SW_RES(0))
{
}

TYPEINIT1(SwDrawBaseShell,SwBaseShell)

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


SwDrawBaseShell::SwDrawBaseShell(SwView &rView):
    SwBaseShell( rView )
{
    GetShell().NoEdit(TRUE);

    SwEditWin& rWin = GetView().GetEditWin();

    rWin.SetBezierMode(SID_BEZIER_MOVE);

    if ( !rView.GetDrawFuncPtr() )
        rView.GetEditWin().StdDrawMode(SID_OBJECT_SELECT);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


__EXPORT SwDrawBaseShell::~SwDrawBaseShell()
{
    GetView().ExitDraw();
    GetShell().Edit();
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwDrawBaseShell::Execute(SfxRequest &rReq)
{
    SwWrtShell *pSh = &GetShell();
    SdrView*    pSdrView = pSh->GetDrawView();
    const SfxItemSet *pArgs = rReq.GetArgs();
    USHORT      nSlotId = rReq.GetSlot();
    BOOL        bChanged = pSdrView->GetModel()->IsChanged();
    pSdrView->GetModel()->SetChanged(FALSE);
    const SfxPoolItem* pItem = 0;
    if(pArgs)
        pArgs->GetItemState(nSlotId, FALSE, &pItem);

    //Sonderfall Align per Menue
    if(pItem && nSlotId == SID_OBJECT_ALIGN)
    {
        DBG_ASSERT(PTR_CAST(SfxEnumItem, pItem),"SfxEnumItem erwartet")
        nSlotId += ((const SfxEnumItem*)pItem)->GetValue();
        nSlotId++;
    }

    BOOL bAlignPossible = pSh->IsAlignPossible();

    BOOL bTopParam = TRUE, bBottomParam = TRUE;
    BOOL bNotify = FALSE;
    BOOL bDone = FALSE;
    SfxBindings& rBind = GetView().GetViewFrame()->GetBindings();

    switch (nSlotId)
    {
        case FN_DRAW_WRAP_DLG:
        {
            if(pSdrView->HasMarkedObj())
            {
                const SfxItemSet* pArgs = rReq.GetArgs();

                if(!pArgs)
                {
                    const SdrMarkList& rMarkList = pSdrView->GetMarkList();
                    if( rMarkList.GetMark(0) != 0 )
                    {
                        SfxItemSet aSet(GetPool(),  RES_SURROUND, RES_SURROUND,
                                                    RES_ANCHOR, RES_ANCHOR,
                                                    RES_LR_SPACE, RES_UL_SPACE,
                                                    SID_HTML_MODE, SID_HTML_MODE,
                                                    FN_DRAW_WRAP_DLG, FN_DRAW_WRAP_DLG,
                                                    0);

                        const SwViewOption* pVOpt = pSh->GetViewOptions();
                        aSet.Put(SfxBoolItem(SID_HTML_MODE,
                            0 != ::GetHtmlMode(pSh->GetView().GetDocShell())));

                        aSet.Put(SfxInt16Item(FN_DRAW_WRAP_DLG, pSh->GetLayerId()));

                        pSh->GetObjAttr(aSet);
                        SwWrapDlg aDlg(GetView().GetWindow(), aSet, pSh, TRUE);

                        if (aDlg.Execute() == RET_OK)
                        {
                            const SfxPoolItem* pItem;
                            const SfxItemSet* pOutSet = aDlg.GetOutputItemSet();
                            if(SFX_ITEM_SET == pOutSet->GetItemState(FN_DRAW_WRAP_DLG, FALSE, &pItem))
                            {
                                short nLayer = ((const SfxInt16Item*)pItem)->GetValue();
                                if (nLayer == 1)
                                    pSh->SelectionToHeaven();
                                else
                                    pSh->SelectionToHell();
                            }

                            pSh->SetObjAttr(*pOutSet);
                        }
                    }
                }
            }
        }
        break;

        case SID_ATTR_TRANSFORM:
        {
            if(pSdrView->HasMarkedObj())
            {
                const SfxItemSet* pArgs = rReq.GetArgs();

                if(!pArgs)
                {
                    const SdrMarkList& rMarkList = pSdrView->GetMarkList();
                    if( rMarkList.GetMark(0) != 0 )
                    {
                        SdrObject* pObj = rMarkList.GetMark(0)->GetObj();
                        SfxTabDialog *pDlg;
                        BOOL bCaption = FALSE;

                        // Erlaubte Verankerungen:
                        USHORT nAnchor = pSh->GetAnchorId();
                        USHORT nAllowedAnchors = SVX_OBJ_AT_CNTNT|SVX_OBJ_IN_CNTNT;
                        USHORT nHtmlMode = ::GetHtmlMode(pSh->GetView().GetDocShell());
                        if( !((HTMLMODE_ON & nHtmlMode) && (0 == (nHtmlMode & HTMLMODE_SOME_ABS_POS))) )
                            nAllowedAnchors |= SVX_OBJ_PAGE;
                        if ( pSh->IsFlyInFly() )
                            nAllowedAnchors |= SVX_OBJ_AT_FLY;

                        if (pObj->GetObjIdentifier() == OBJ_CAPTION )
                            bCaption = TRUE;

                        if (bCaption)
                            pDlg = new SvxCaptionTabDialog(NULL, pSdrView, nAllowedAnchors);
                        else
                            pDlg = new SvxTransformTabDialog(NULL, NULL, pSdrView, nAllowedAnchors);

                        SfxItemSet aNewAttr(pSdrView->GetGeoAttrFromMarked());

                        const USHORT* pRange = pDlg->GetInputRanges( *aNewAttr.GetPool() );
                        SfxItemSet aSet( *aNewAttr.GetPool(), pRange );
                        aSet.Put( aNewAttr, FALSE );

                        if (bCaption)
                            pSdrView->GetAttributes( aSet );

                        aSet.Put(SfxUInt16Item(SID_ATTR_TRANSFORM_ANCHOR, nAnchor));

                        SwFrmFmt* pFrmFmt = FindFrmFmt( pObj );
                        SwFmtVertOrient aVOrient((SwFmtVertOrient&)pFrmFmt->GetAttr(RES_VERT_ORIENT));
                        USHORT nOrient = aVOrient.GetVertOrient();
                        aSet.Put(SfxUInt16Item(SID_ATTR_TRANSFORM_VERT_ORIENT, nOrient));

                        pDlg->SetInputSet( &aSet );

                        if (pDlg->Execute() == RET_OK)
                        {
                            const SfxItemSet* pOutSet = pDlg->GetOutputItemSet();
                            pSh->StartAllAction();
                            pSdrView->SetGeoAttrToMarked(*pOutSet);

                            if (bCaption)
                                pSdrView->SetAttributes(*pOutSet);

                            BOOL bPosCorr =
                                SFX_ITEM_SET != pOutSet->GetItemState(
                                    SID_ATTR_TRANSFORM_POS_X, FALSE ) &&
                                SFX_ITEM_SET != pOutSet->GetItemState(
                                    SID_ATTR_TRANSFORM_POS_Y, FALSE );

                            const SfxPoolItem* pItem;
                            if(SFX_ITEM_SET == pOutSet->GetItemState(
                                SID_ATTR_TRANSFORM_ANCHOR, FALSE, &pItem))
                                pSh->ChgAnchor(((const SfxUInt16Item*)pItem)
                                    ->GetValue(), FALSE, bPosCorr );

                            if( SFX_ITEM_SET == pOutSet->GetItemState(
                                SID_ATTR_TRANSFORM_VERT_ORIENT, FALSE, &pItem))
                            {
                                aVOrient.SetVertOrient( (SwVertOrient)
                                    ((const SfxUInt16Item*)pItem)->GetValue());
                                pFrmFmt->SetAttr( aVOrient );
                            }

                            rBind.InvalidateAll(FALSE);
                            pSh->EndAllAction();
                        }
                        delete pDlg;
                    }
                }
            }
        }
        break;

        case SID_DELETE:
        case FN_BACKSPACE:
            if (pSh->IsObjSelected() && !pSdrView->IsTextEdit())
            {
                bDone = TRUE;

                if( GetView().IsDrawRotate() )
                {
                    pSh->SetDragMode( SDRDRAG_MOVE );
                    GetView().FlipDrawRotate();
                }

                pSh->SetModified();
                pSh->DelSelectedObj();

                if (rReq.IsAPI())
                {
                    // Wenn Basic-Aufruf, dann zurck in die Textshell, da das
                    // Basic sonst keine Rckkehrm”glichkeit hat.
                    if (GetView().GetDrawFuncPtr())
                    {
                        GetView().GetDrawFuncPtr()->Deactivate();
                        GetView().SetDrawFuncPtr(NULL);
                    }
                    GetView().LeaveDrawCreate();    // In Selektionsmode wechseln
                }

                if (pSh->IsSelFrmMode())
                {
                    pSh->LeaveSelFrmMode();
                    pSh->NoEdit();
                }
                bNotify = TRUE;
            }
            break;

        case SID_GROUP:
            if (pSh->IsObjSelected() > 1 && pSh->IsGroupAllowed())
            {
                pSh->GroupSelection();  // Objekt gruppieren
                rBind.Invalidate(SID_UNGROUP);
            }
            break;

        case SID_UNGROUP:
            if (pSh->IsGroupSelected())
            {
                pSh->UnGroupSelection();    // Objektgruppierung aufheben
                rBind.Invalidate(SID_GROUP);
            }
            break;

        case SID_ENTER_GROUP:
            if (pSh->IsGroupSelected())
            {
                pSdrView->EnterMarkedGroup();
                rBind.InvalidateAll(FALSE);
            }
            break;

        case SID_LEAVE_GROUP:
            if (pSdrView->IsGroupEntered())
            {
                pSdrView->LeaveOneGroup();
                rBind.Invalidate(SID_ENTER_GROUP);
                rBind.Invalidate(SID_UNGROUP);
            }
            break;

        case SID_OBJECT_ALIGN_LEFT:
        case SID_OBJECT_ALIGN_CENTER:
        case SID_OBJECT_ALIGN_RIGHT:
        case SID_OBJECT_ALIGN_UP:
        case SID_OBJECT_ALIGN_MIDDLE:
        case SID_OBJECT_ALIGN_DOWN:
        {
            if ( bAlignPossible )
            {
                const SdrMarkList& rMarkList = pSdrView->GetMarkList();
                if( rMarkList.GetMarkCount() == 1 && bAlignPossible )
                {   // Objekte nicht aneinander ausrichten

                    USHORT nAnchor = pSh->GetAnchorId();
                    if (nAnchor == FLY_IN_CNTNT)
                    {
                        int nVertOrient = -1;

                        switch (nSlotId)
                        {
                            case SID_OBJECT_ALIGN_UP:
                                nVertOrient = SVX_VERT_TOP;
                                break;
                            case SID_OBJECT_ALIGN_MIDDLE:
                                nVertOrient = SVX_VERT_CENTER;
                                break;
                            case SID_OBJECT_ALIGN_DOWN:
                                nVertOrient = SVX_VERT_BOTTOM;
                                break;
                            default:
                                break;
                        }
                        if (nVertOrient != -1)
                        {
                            pSh->StartAction();
                            SdrObject* pObj = rMarkList.GetMark(0)->GetObj();
                            SwFrmFmt* pFrmFmt = FindFrmFmt( pObj );
                            SwFmtVertOrient aVOrient((SwFmtVertOrient&)pFrmFmt->GetAttr(RES_VERT_ORIENT));
                            aVOrient.SetVertOrient((SwVertOrient)nVertOrient);
                            pFrmFmt->SetAttr(aVOrient);
                            pSh->EndAction();
                        }
                        break;
                    }
                    if (nAnchor == FLY_AT_CNTNT)
                        break;  // Absatzverankerte Rahmen nicht ausrichten
                }

                pSh->StartAction();
                switch (nSlotId)
                {
                    case SID_OBJECT_ALIGN_LEFT:
                        pSdrView->AlignMarkedObjects(SDRHALIGN_LEFT, SDRVALIGN_NONE);
                        break;
                    case SID_OBJECT_ALIGN_CENTER:
                        pSdrView->AlignMarkedObjects(SDRHALIGN_CENTER, SDRVALIGN_NONE);
                        break;
                    case SID_OBJECT_ALIGN_RIGHT:
                        pSdrView->AlignMarkedObjects(SDRHALIGN_RIGHT, SDRVALIGN_NONE);
                        break;
                    case SID_OBJECT_ALIGN_UP:
                        pSdrView->AlignMarkedObjects(SDRHALIGN_NONE, SDRVALIGN_TOP);
                        break;
                    case SID_OBJECT_ALIGN_MIDDLE:
                        pSdrView->AlignMarkedObjects(SDRHALIGN_NONE, SDRVALIGN_CENTER);
                        break;
                    case SID_OBJECT_ALIGN_DOWN:
                        pSdrView->AlignMarkedObjects(SDRHALIGN_NONE, SDRVALIGN_BOTTOM);
                        break;
                }
                pSh->EndAction();
            }
        }
        break;

        case FN_FRAME_UP:
            bTopParam = FALSE;
            /* no break */
        case SID_FRAME_TO_TOP:
            pSh->SelectionToTop( bTopParam );
            break;

        case FN_FRAME_DOWN:
            bBottomParam = FALSE;
            /* no break */
        case SID_FRAME_TO_BOTTOM:
            pSh->SelectionToBottom( bBottomParam );
            break;

        default:
            DBG_ASSERT(!this, "falscher Dispatcher");
            return;
    }
    if(!bDone)
    {
        if(nSlotId >= SID_OBJECT_ALIGN_LEFT && nSlotId <= SID_OBJECT_ALIGN_DOWN)
            rBind.Invalidate(SID_ATTR_LONG_LRSPACE);
        if (pSdrView->GetModel()->IsChanged())
            pSh->SetModified();
        else if (bChanged)
            pSdrView->GetModel()->SetChanged(TRUE);
        // 40220: Nach dem Loeschen von DrawObjekten ueber die API GPF durch Selbstzerstoerung
        if(bNotify)
            GetView().AttrChangedNotify(pSh); // ggf Shellwechsel...
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwDrawBaseShell::GetState(SfxItemSet& rSet)
{
    SwWrtShell &rSh = GetShell();
    SdrView* pSdrView = rSh.GetDrawViewWithValidMarkList();
    SfxWhichIter aIter( rSet );
    USHORT nWhich = aIter.FirstWhich();
    BOOL bProtected = rSh.IsSelObjProtected(FLYPROTECT_CONTENT);

    if (!bProtected)    // Im Parent nachsehen
        bProtected |= rSh.IsSelObjProtected( (FlyProtectType)(FLYPROTECT_CONTENT|FLYPROTECT_PARENT) ) != 0;

    while( nWhich )
    {
        switch( nWhich )
        {
            case FN_DRAW_WRAP_DLG:
            case SID_ATTR_TRANSFORM:
            case SID_FRAME_TO_TOP:
            case SID_FRAME_TO_BOTTOM:
            case FN_FRAME_UP:
            case FN_FRAME_DOWN:
            case SID_DELETE:
            case FN_BACKSPACE:
                if (bProtected)
                    rSet.DisableItem( nWhich );
                break;
            case SID_GROUP:
                if ( rSh.IsObjSelected() < 2 || bProtected || !rSh.IsGroupAllowed() )
                    rSet.DisableItem( nWhich );
                break;
            case SID_UNGROUP:
                if ( !rSh.IsGroupSelected() || bProtected )
                    rSet.DisableItem( nWhich );
                break;
            case SID_ENTER_GROUP:
                if ( !rSh.IsGroupSelected() )
                    rSet.DisableItem( nWhich );
                break;
            case SID_LEAVE_GROUP:
                if ( !pSdrView->IsGroupEntered() )
                    rSet.DisableItem( nWhich );
                break;
            case SID_OBJECT_ALIGN_LEFT:
            case SID_OBJECT_ALIGN_CENTER:
            case SID_OBJECT_ALIGN_RIGHT:
            case SID_OBJECT_ALIGN_UP:
            case SID_OBJECT_ALIGN_MIDDLE:
            case SID_OBJECT_ALIGN_DOWN:
            case SID_OBJECT_ALIGN:
                if ( !rSh.IsAlignPossible() || bProtected )
                    rSet.DisableItem( nWhich );
                else
                {
                    rSet.Put(SfxAllEnumItem(nWhich, USHRT_MAX));
                }
                break;
        }
        nWhich = aIter.NextWhich();
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


BOOL SwDrawBaseShell::Disable(SfxItemSet& rSet, USHORT nWhich)
{
    BOOL bDisable = GetShell().IsSelObjProtected(FLYPROTECT_CONTENT);

    if (bDisable)
    {
        if (nWhich)
            rSet.DisableItem( nWhich );
        else
        {
            SfxWhichIter aIter( rSet );
            nWhich = aIter.FirstWhich();
            while (nWhich)
            {
                rSet.DisableItem( nWhich );
                nWhich = aIter.NextWhich();
            }
        }
    }

    return bDisable;
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.49  2000/09/18 16:06:03  willem.vandorp
    OpenOffice header added.

    Revision 1.48  2000/09/07 15:59:29  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.47  2000/08/10 16:34:18  jp
    Bug #77310#: don't call a method with a zero pointer

    Revision 1.46  2000/05/29 16:40:53  jp
    Bug #69159#: delete selection reset the rotate mode

    Revision 1.45  2000/05/26 07:21:32  os
    old SW Basic API Slots removed

    Revision 1.44  2000/05/10 11:53:01  os
    Basic API removed

    Revision 1.43  2000/02/11 14:57:25  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.42  1999/06/21 13:20:24  JP
    Interface changes: SdrView::GetAttributes


      Rev 1.41   21 Jun 1999 15:20:24   JP
   Interface changes: SdrView::GetAttributes

      Rev 1.40   07 Oct 1998 10:58:48   JP
   Bug #57153#: in allen GetStates einer DrawShell die MarkListe aktualisieren

      Rev 1.39   06 Jul 1998 18:10:14   OM
   Images zum gruppieren

      Rev 1.38   06 Jul 1998 16:09:54   OM
   #52065# Gruppe verlassen bei Beendigung der DrawShell

      Rev 1.37   03 Jul 1998 16:28:48   OM
   #51420# Nur erlaubte Verankerungsarten im PositionsDialog

      Rev 1.36   01 Jul 1998 12:13:44   OM
   #51323# Zeichengebundene Objekte nicht gruppieren

      Rev 1.35   16 Jun 1998 13:03:32   OM
   Gruppenobjekte per Ctrl selektieren

      Rev 1.34   12 Jun 1998 16:08:56   OM
   Gruppierung betreten/verlassen

      Rev 1.33   12 Jun 1998 13:34:02   OM
   Wieder SID_OBJECT_SELECT statt SID_DRAW_SELECT

      Rev 1.32   11 Jun 1998 16:13:14   OM
   Gruppierungsmenue

      Rev 1.31   10 Jun 1998 11:23:18   OM
   Hell/Heaven nicht in FormShell

      Rev 1.30   09 Jun 1998 15:36:00   OM
   VC-Controls entfernt

      Rev 1.29   22 May 1998 15:19:06   OS
   wird ein DrawObject geloescht, darf nicht mehr auf this zugegriffen werden

      Rev 1.28   15 May 1998 16:22:02   OM
   #49467# Geschtzte Rahmen nicht bearbeiten

      Rev 1.27   15 Apr 1998 15:32:24   OM
   #49467 Objekte innerhalb von geschuetzten Rahmen duerfen nicht veraendert werden

      Rev 1.26   29 Nov 1997 15:51:24   MA
   includes

      Rev 1.25   24 Nov 1997 09:46:58   MA
   includes

      Rev 1.24   20 Oct 1997 12:45:06   OM
   Kein Legenden-Dialog bei URL-Buttons

      Rev 1.23   20 Oct 1997 12:15:18   OM
   #44751# Umankern auch bei Legendenobjekten

      Rev 1.22   15 Oct 1997 13:00:06   AMA
   Fix #44651#: Umankern mit gleichzeitiger Positionsaenderung

      Rev 1.21   05 Sep 1997 12:04:22   MH
   chg: header

      Rev 1.20   02 Sep 1997 13:23:16   OS
   includes

      Rev 1.19   16 Aug 1997 12:59:54   OS
   include

      Rev 1.18   05 Aug 1997 16:23:12   TJ
   include svx/srchitem.hxx

      Rev 1.17   01 Aug 1997 11:47:18   MH
   chg: header

      Rev 1.16   10 Jul 1997 17:27:44   MA
   #41589# nicht die dontcare verlieren, damit auch GPF umpopeln

      Rev 1.15   08 Jul 1997 12:16:26   OM
   Draw-Selektionsmodi aufgeraeumt

      Rev 1.14   08 Jul 1997 12:07:10   OM
   Draw-Selektionsmodi aufgeraeumt

      Rev 1.13   25 Jun 1997 13:34:18   OM
   #40966# DrawBaseShell-Ptr wieder eingefuehrt

      Rev 1.12   25 Jun 1997 09:10:18   MA
   #40965#, SubShell abmelden

      Rev 1.11   17 Jun 1997 15:52:52   MA
   DrawTxtShell nicht von BaseShell ableiten + Opts

      Rev 1.10   16 Jun 1997 15:31:56   OM
   GPF behoben: Backspace wie Delete behandeln

      Rev 1.9   27 May 1997 16:39:24   OM
   Zeichengebundene Zeichenobjekte korrekt ausrichten

      Rev 1.8   27 May 1997 12:52:46   OS
   AttrChangedNotify erst am Ende des ::Execute rufen #40220#

      Rev 1.7   30 Apr 1997 11:34:50   MA
   #39469# erstmal GPF umpopelt

      Rev 1.6   07 Apr 1997 17:43:34   MH
   chg: header

      Rev 1.5   02 Apr 1997 21:42:20   MH
   chg: header SfxDialoge

      Rev 1.4   19 Mar 1997 11:54:26   OM
   #37302# Shellwechsel nach Basic-Delete ausloesen

      Rev 1.3   27 Jan 1997 16:31:04   OS
   HtmlMode entfernt

      Rev 1.2   23 Jan 1997 10:45:52   OM
   Neue Shells: Control- und DrawBaseShell

      Rev 1.1   22 Jan 1997 14:40:32   OM
   unnoetige Includes entfernt

      Rev 1.0   22 Jan 1997 11:23:24   OM
   Initial revision.

------------------------------------------------------------------------*/



diff --git a/sw/source/ui/shells/drwtxtex.cxx b/sw/source/ui/shells/drwtxtex.cxx
new file mode 100644
index 0000000..d1c8a3b
--- /dev/null
+++ b/sw/source/ui/shells/drwtxtex.cxx
@@ -0,0 +1,1021 @@
/*************************************************************************
 *
 *  $RCSfile: drwtxtex.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:46 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "hintids.hxx"

#ifndef _SVDVIEW_HXX //autogen
#include <svx/svdview.hxx>
#endif
#ifndef _SVX_SPLTITEM_HXX //autogen
#include <svx/spltitem.hxx>
#endif
#ifndef _SVX_ORPHITEM_HXX //autogen
#include <svx/orphitem.hxx>
#endif
#ifndef _SVX_BRKITEM_HXX //autogen
#include <svx/brkitem.hxx>
#endif
#ifndef _SVX_WIDWITEM_HXX //autogen
#include <svx/widwitem.hxx>
#endif
#ifndef _SVX_BRKITEM_HXX //autogen
#include <svx/brkitem.hxx>
#endif
#ifndef _SVX_KERNITEM_HXX //autogen
#include <svx/kernitem.hxx>
#endif
#ifndef _SVX_ESCPITEM_HXX //autogen
#include <svx/escpitem.hxx>
#endif
#ifndef _SVX_PARAITEM_HXX //autogen
#include <svx/lspcitem.hxx>
#endif
#ifndef _SVX_ADJITEM_HXX //autogen
#include <svx/adjitem.hxx>
#endif
#ifndef _SVX_CRSDITEM_HXX //autogen
#include <svx/crsditem.hxx>
#endif
#ifndef _SVX_SHDDITEM_HXX //autogen
#include <svx/shdditem.hxx>
#endif
#ifndef _SVX_HYZNITEM_HXX //autogen
#include <svx/hyznitem.hxx>
#endif
#ifndef _SVX_UDLNITEM_HXX //autogen
#include <svx/udlnitem.hxx>
#endif
#ifndef _SVX_FONTITEM_HXX //autogen
#include <svx/fontitem.hxx>
#endif
#ifndef _SVX_FHGTITEM_HXX //autogen
#include <svx/fhgtitem.hxx>
#endif
#ifndef _SVX_COLRITEM_HXX //autogen
#include <svx/colritem.hxx>
#endif
#ifndef _SVX_WGHTITEM_HXX //autogen
#include <svx/wghtitem.hxx>
#endif
#ifndef _SVX_CNTRITEM_HXX //autogen
#include <svx/cntritem.hxx>
#endif
#ifndef _SVX_POSTITEM_HXX //autogen
#include <svx/postitem.hxx>
#endif
#ifndef _SVDOUTL_HXX
#include <svx/svdoutl.hxx>
#endif
#ifndef _SFXVIEWFRM_HXX
#include <sfx2/viewfrm.hxx>
#endif
#ifndef _SFX_WHITER_HXX //autogen
#include <svtools/whiter.hxx>
#endif
#ifndef _SFX_BINDINGS_HXX //autogen
#include <sfx2/bindings.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SFX_SAVEOPT_HXX //autogen
#include <sfx2/saveopt.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SVX_FLDITEM_HXX
#   ifndef ITEMID_FIELD
#       ifndef _MyEDITDATA_HXX //autogen
#           include <svx/editdata.hxx>  // das include wird wg. EE_FEATURE_FIELD benoetigt
#       endif
#       define ITEMID_FIELD EE_FEATURE_FIELD  /* wird fuer #include <flditem.hxx> benoetigt */
#   endif
#   ifndef _SVX_FLDITEM_HXX //autogen
#       include <svx/flditem.hxx>
#   endif
#endif
#ifndef _EDITSTAT_HXX //autogen
#include <svx/editstat.hxx>
#endif
#ifndef _OUTLINER_HXX //autogen
#include <svx/outliner.hxx>
#endif
#ifndef _SVX_HLNKITEM_HXX //autogen
#include <svx/hlnkitem.hxx>
#endif
#ifndef _SVX_HTMLMODE_HXX
#include <svx/htmlmode.hxx>
#endif

#ifndef _SVX_LANGITEM_HXX
#include <svx/langitem.hxx>
#endif
#ifndef _UNO_LINGU_HXX
#include <svx/unolingu.hxx>
#endif

#include "doc.hxx"

#ifndef _COM_SUN_STAR_LINGUISTIC_XTHESAURUS_HPP_
#include <com/sun/star/linguistic/XThesaurus.hpp>
#endif

#include "wview.hxx"
#include "viewopt.hxx"
#include "wrtsh.hxx"
#include "uiparam.hxx"
#include "uitool.hxx"
#include "cmdid.h"
#include "globals.hrc"
#include "shells.hrc"
#include "chrdlg.hxx"
#include "pardlg.hxx"
#include "dataex.hxx"
#include "drwtxtsh.hxx"
#include "swmodule.hxx"
#include "initui.hxx"               // fuer SpellPointer

using namespace ::com::sun::star;

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



void SwDrawTextShell::Execute(SfxRequest &rReq)
{
    SwWrtShell &rSh = GetShell();

    SfxItemSet aEditAttr(pOLV->GetAttribs());
    SfxItemSet aNewAttr(*(aEditAttr.GetPool()), aEditAttr.GetRanges());

    sal_uInt16 nSlot = rReq.GetSlot();
    sal_uInt16 nWhich = GetPool().GetWhich(nSlot);
    const SfxItemSet *pNewAttrs = rReq.GetArgs();

    switch (nSlot)
    {
        case SID_ATTR_CHAR_FONT:
        case SID_ATTR_CHAR_FONTHEIGHT:
        case SID_ATTR_CHAR_COLOR:
        {
            if (!pNewAttrs)
                rSh.GetView().GetViewFrame()->GetDispatcher()->Execute(SID_CHAR_DLG, sal_False);
            else
            {
                switch (nSlot)
                {
                    case SID_ATTR_CHAR_FONT:
                        aNewAttr.Put(((const SvxFontItem&)pNewAttrs->Get(nWhich)), EE_CHAR_FONTINFO);
                        break;
                    case SID_ATTR_CHAR_FONTHEIGHT:
                        aNewAttr.Put(((const SvxFontHeightItem&)pNewAttrs->Get(nWhich)), EE_CHAR_FONTHEIGHT);
                        break;
                    case SID_ATTR_CHAR_COLOR:
                        aNewAttr.Put(((const SvxColorItem&)pNewAttrs->Get(nWhich)), EE_CHAR_COLOR);
                        break;
                }
            }
        }
        break;

        case SID_ATTR_CHAR_WEIGHT:
        {
             FontWeight eFW = ((const SvxWeightItem&)aEditAttr.Get(EE_CHAR_WEIGHT)).GetWeight();
            aNewAttr.Put(SvxWeightItem(eFW == WEIGHT_NORMAL ? WEIGHT_BOLD : WEIGHT_NORMAL, EE_CHAR_WEIGHT));
        }
        break;

        case SID_ATTR_CHAR_POSTURE:
        {
            FontItalic eFI = ((const SvxPostureItem&)aEditAttr.Get(EE_CHAR_ITALIC)).GetPosture();
            aNewAttr.Put(SvxPostureItem(eFI == ITALIC_NORMAL ? ITALIC_NONE : ITALIC_NORMAL, EE_CHAR_ITALIC));
        }
        break;

        case SID_ATTR_CHAR_UNDERLINE:
        {
             FontUnderline eFU = ((const SvxUnderlineItem&)aEditAttr.Get(EE_CHAR_UNDERLINE)).GetUnderline();
            aNewAttr.Put(SvxUnderlineItem(eFU == UNDERLINE_SINGLE ? UNDERLINE_NONE : UNDERLINE_SINGLE, EE_CHAR_UNDERLINE));
        }
        break;

        case SID_ATTR_CHAR_CONTOUR:
            aNewAttr.Put((const SvxContourItem&)pNewAttrs->Get(nWhich), EE_CHAR_OUTLINE);
            break;
        case SID_ATTR_CHAR_SHADOWED:
            aNewAttr.Put((const SvxShadowedItem&)pNewAttrs->Get(nWhich), EE_CHAR_SHADOW);
            break;
        case SID_ATTR_CHAR_STRIKEOUT:
            aNewAttr.Put((const SvxCrossedOutItem&)pNewAttrs->Get(nWhich), EE_CHAR_STRIKEOUT);
            break;

        case SID_ATTR_PARA_ADJUST_LEFT:
            aNewAttr.Put(SvxAdjustItem(SVX_ADJUST_LEFT, EE_PARA_JUST));
            break;
        case SID_ATTR_PARA_ADJUST_CENTER:
            aNewAttr.Put(SvxAdjustItem(SVX_ADJUST_CENTER, EE_PARA_JUST));
            break;
        case SID_ATTR_PARA_ADJUST_RIGHT:
            aNewAttr.Put(SvxAdjustItem(SVX_ADJUST_RIGHT, EE_PARA_JUST));
            break;
        case SID_ATTR_PARA_ADJUST_BLOCK:
            aNewAttr.Put(SvxAdjustItem(SVX_ADJUST_BLOCK, EE_PARA_JUST));
            break;

        case SID_ATTR_PARA_LINESPACE_10:
        {
            SvxLineSpacingItem aItem(SVX_LINESPACE_ONE_LINE, EE_PARA_SBL);
            aItem.SetPropLineSpace(100);
            aNewAttr.Put(aItem);
        }
        break;
        case SID_ATTR_PARA_LINESPACE_15:
        {
            SvxLineSpacingItem aItem(SVX_LINESPACE_ONE_POINT_FIVE_LINES, EE_PARA_SBL);
            aItem.SetPropLineSpace(150);
            aNewAttr.Put(aItem);
        }
        break;
        case SID_ATTR_PARA_LINESPACE_20:
        {
            SvxLineSpacingItem aItem(SVX_LINESPACE_TWO_LINES, EE_PARA_SBL);
            aItem.SetPropLineSpace(200);
            aNewAttr.Put(aItem);
        }
        break;

        case FN_SET_SUPER_SCRIPT:
        {
            SvxEscapementItem aItem(EE_CHAR_ESCAPEMENT);
            SvxEscapement eEsc = (SvxEscapement ) ( (const SvxEscapementItem&)
                            aEditAttr.Get( EE_CHAR_ESCAPEMENT ) ).GetEnumValue();

            if( eEsc == SVX_ESCAPEMENT_SUPERSCRIPT )
                aItem.SetEscapement( SVX_ESCAPEMENT_OFF );
            else
                aItem.SetEscapement( SVX_ESCAPEMENT_SUPERSCRIPT );
            aNewAttr.Put( aItem, EE_CHAR_ESCAPEMENT );
        }
        break;
        case FN_SET_SUB_SCRIPT:
        {
            SvxEscapementItem aItem(EE_CHAR_ESCAPEMENT);
            SvxEscapement eEsc = (SvxEscapement ) ( (const SvxEscapementItem&)
                            aEditAttr.Get( EE_CHAR_ESCAPEMENT ) ).GetEnumValue();

            if( eEsc == SVX_ESCAPEMENT_SUBSCRIPT )
                aItem.SetEscapement( SVX_ESCAPEMENT_OFF );
            else
                aItem.SetEscapement( SVX_ESCAPEMENT_SUBSCRIPT );
            aNewAttr.Put( aItem, EE_CHAR_ESCAPEMENT );
        }
        break;

        case SID_CHAR_DLG:
        {
            const SfxItemSet* pArgs = rReq.GetArgs();

            if( !pArgs )
            {
                SwView* pView = &GetView();
                FieldUnit eMetric = ::GetDfltMetric(0 != PTR_CAST(SwWebView, pView));
                SW_MOD()->PutItem(SfxUInt16Item(SID_ATTR_METRIC, eMetric));
                SfxItemSet aDlgAttr(GetPool(), EE_ITEMS_START, EE_ITEMS_END);

                // util::Language gibts an der EditEngine nicht! Daher nicht im Set.

                aDlgAttr.Put( aEditAttr );
                aDlgAttr.Put( SvxKerningItem() );

                SwCharDlg* pDlg = new SwCharDlg(pView->GetWindow(), *pView, aDlgAttr, 0, sal_True);

                sal_uInt16 nResult = pDlg->Execute();

                switch( nResult )
                {
                    case RET_OK:
                    {
                        pArgs = rReq.GetArgs();
                    }
                    break;

                    default:
                    {
                        delete pDlg;
                    }
                    return; // Abbruch
                }
                delete( pDlg );
            }
            aNewAttr.Put(*pArgs);
        }
        break;

        case SID_PARA_DLG:
        {
            const SfxItemSet* pArgs = rReq.GetArgs();

            if (!pArgs)
            {
                SwView* pView = &GetView();
                FieldUnit eMetric = ::GetDfltMetric(0 != PTR_CAST(SwWebView, pView));
                SW_MOD()->PutItem(SfxUInt16Item(SID_ATTR_METRIC, eMetric));
                SfxItemSet aDlgAttr(GetPool(),
                                    EE_ITEMS_START, EE_ITEMS_END,
                                    SID_ATTR_PARA_HYPHENZONE, SID_ATTR_PARA_HYPHENZONE,
                                    SID_ATTR_PARA_SPLIT, SID_ATTR_PARA_SPLIT,
                                    SID_ATTR_PARA_WIDOWS, SID_ATTR_PARA_WIDOWS,
                                    SID_ATTR_PARA_ORPHANS, SID_ATTR_PARA_ORPHANS,
                                    0);

                aDlgAttr.Put(aEditAttr);

                // Die Werte sind erst einmal uebernommen worden, um den Dialog anzuzeigen.
                // Muss natuerlich noch geaendert werden
                // aDlgAttr.Put( SvxParaDlgLimitsItem( 567 * 50, 5670) );

                aDlgAttr.Put( SvxHyphenZoneItem() );
                aDlgAttr.Put( SvxFmtBreakItem() );
                aDlgAttr.Put( SvxFmtSplitItem() );
                aDlgAttr.Put( SvxWidowsItem() );
                aDlgAttr.Put( SvxOrphansItem() );

                SwParaDlg* pDlg = new SwParaDlg(GetView().GetWindow(), GetView(), aDlgAttr, DLG_STD, 0, sal_True);

                sal_uInt16 nResult = pDlg->Execute();

                switch( nResult )
                {
                    case RET_OK:
                    {
                        pArgs = rReq.GetArgs();
                    }
                    break;

                    default:
                    {
                        delete pDlg;
                    }
                    return; // Abbruch
                }
                delete( pDlg );
            }
            aNewAttr.Put(*pArgs);
        }
        break;
        case SID_AUTOSPELL_MARKOFF:
        case SID_AUTOSPELL_CHECK:
        {
            pSdrView = rSh.GetDrawView();
            pOutliner = pSdrView->GetTextEditOutliner();
            sal_uInt32 nCtrl = pOutliner->GetControlWord();

            sal_Bool bSet = ((const SfxBoolItem&)rReq.GetArgs()->Get(nSlot)).GetValue();
            if(nSlot == SID_AUTOSPELL_MARKOFF)
            {
                if(bSet)
                    nCtrl |= EE_CNTRL_NOREDLINES;
                else
                    nCtrl &= ~EE_CNTRL_NOREDLINES;
            }
            else
            {
                if(bSet)
                    nCtrl |= EE_CNTRL_ONLINESPELLING|EE_CNTRL_ALLOWBIGOBJS;
                else
                    nCtrl &= ~EE_CNTRL_ONLINESPELLING;
            }
            pOutliner->SetControlWord(nCtrl);

            SW_MOD()->ExecuteSlot(rReq);
        }
        break;
        case SID_HYPERLINK_SETLINK:
        {
            const SfxPoolItem* pItem = 0;
            if(pNewAttrs)
                pNewAttrs->GetItemState(nSlot, sal_False, &pItem);

            if(pItem)
            {
                const SvxHyperlinkItem& rHLinkItem = *(const SvxHyperlinkItem *)pItem;
                SvxURLField aFld(rHLinkItem.GetURL(), rHLinkItem.GetName(), SVXURLFORMAT_APPDEFAULT);
                aFld.SetTargetFrame(rHLinkItem.GetTargetFrame());

                const SvxFieldItem* pFieldItem = pOLV->GetFieldAtSelection();

                if (pFieldItem && pFieldItem->GetField()->ISA(SvxURLField))
                {
                    // Feld selektieren, so dass es beim Insert geloescht wird
                    ESelection aSel = pOLV->GetSelection();
                    aSel.nEndPos++;
                    pOLV->SetSelection(aSel);
                }
                pOLV->InsertField(aFld);
            }
        }
        break;

        default:
            ASSERT(!this, falscher Dispatcher);
            return;
    }
    SetAttrToMarked(aNewAttr);

    GetView().GetViewFrame()->GetBindings().InvalidateAll(sal_False);

    if (IsTextEdit() && pOLV->GetOutliner()->IsModified())
        rSh.SetModified();
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



void SwDrawTextShell::GetState(SfxItemSet& rSet)
{
    if (!IsTextEdit())  // Sonst manchmal Absturz!
        return;

    SfxItemSet aEditAttr(pOLV->GetAttribs());
    sal_uInt16 nWhich = 0;

    const SfxPoolItem* pItem = 0;
    SfxItemState eState = aEditAttr.GetItemState(EE_PARA_JUST, sal_False, &pItem);
    if (eState == SFX_ITEM_DONTCARE || !pItem)
    {
        rSet.InvalidateItem( SID_ATTR_PARA_ADJUST_LEFT );
        rSet.InvalidateItem( SID_ATTR_PARA_ADJUST_CENTER );
        rSet.InvalidateItem( SID_ATTR_PARA_ADJUST_RIGHT );
        rSet.InvalidateItem( SID_ATTR_PARA_ADJUST_BLOCK );
    }
    else
    {
        SvxAdjust eAdjust = ((const SvxAdjustItem*)pItem)->GetAdjust();
        switch( eAdjust )
        {
            case SVX_ADJUST_LEFT:   nWhich = SID_ATTR_PARA_ADJUST_LEFT;     break;
            case SVX_ADJUST_CENTER: nWhich = SID_ATTR_PARA_ADJUST_CENTER;   break;
            case SVX_ADJUST_RIGHT:  nWhich = SID_ATTR_PARA_ADJUST_RIGHT;    break;
            case SVX_ADJUST_BLOCK:  nWhich = SID_ATTR_PARA_ADJUST_BLOCK;            break;
        }
        if( nWhich )
            rSet.Put( SfxBoolItem( nWhich, sal_True ) );
    }

    eState = aEditAttr.GetItemState(EE_PARA_SBL, sal_False, &pItem);
    if (eState == SFX_ITEM_DONTCARE || !pItem)
    {
        rSet.InvalidateItem( SID_ATTR_PARA_LINESPACE_10 );
        rSet.InvalidateItem( SID_ATTR_PARA_LINESPACE_15 );
        rSet.InvalidateItem( SID_ATTR_PARA_LINESPACE_20 );
    }
    else
    {
        const sal_Int8 nSpace = ((const SvxLineSpacingItem*)pItem)->GetPropLineSpace();
        nWhich = 0;
        switch( nSpace )
        {
            case 100:
                nWhich = SID_ATTR_PARA_LINESPACE_10;
                break;
            case 150:
                nWhich = SID_ATTR_PARA_LINESPACE_15;
                break;
            case 200:
                nWhich = SID_ATTR_PARA_LINESPACE_20;
                break;
        }
        if( nWhich )
            rSet.Put( SfxBoolItem( nWhich, sal_True ) );
    }

    SvxEscapement eEsc = (SvxEscapement)((const SvxEscapementItem&)
                    aEditAttr.Get(EE_CHAR_ESCAPEMENT)).GetEnumValue();

    if( eEsc == SVX_ESCAPEMENT_SUPERSCRIPT )
        rSet.Put( SfxBoolItem( FN_SET_SUPER_SCRIPT, sal_True ) );
    else if( eEsc == SVX_ESCAPEMENT_SUBSCRIPT )
        rSet.Put( SfxBoolItem( FN_SET_SUB_SCRIPT, sal_True ) );


    // disable "Thesaurus" if the language is not supported
    const SfxPoolItem &rItem = GetShell().GetDoc()->GetDefault(RES_CHRATR_LANGUAGE);
    LanguageType nLang = ((const SvxLanguageItem &) rItem).GetLanguage();
    //
    uno::Reference< linguistic::XThesaurus >  xThes( ::GetThesaurus() );
    if (!xThes.is() || nLang == LANGUAGE_NONE ||
        !xThes->hasLocale( SvxCreateLocale( nLang ) ))
        rSet.DisableItem( FN_THESAURUS_DLG );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



void SwDrawTextShell::GetDrawTxtCtrlState(SfxItemSet& rSet)
{
    if (!IsTextEdit())  // Sonst Absturz!
        return;

    SfxItemSet aEditAttr(pOLV->GetAttribs());

    SfxWhichIter aIter(rSet);
    sal_uInt16 nWhich = aIter.FirstWhich();

    while(nWhich)
    {
        switch(GetPool().GetSlotId(nWhich))
        {
            case SID_ATTR_CHAR_FONT:
                rSet.Put(aEditAttr.Get(EE_CHAR_FONTINFO, sal_True), nWhich);
                break;
            case SID_ATTR_CHAR_FONTHEIGHT:
                rSet.Put(aEditAttr.Get(EE_CHAR_FONTHEIGHT, sal_True), nWhich);
                break;
            case SID_ATTR_CHAR_COLOR:
                rSet.Put(aEditAttr.Get(EE_CHAR_COLOR, sal_True), nWhich);
                break;
            case SID_ATTR_CHAR_WEIGHT:
                rSet.Put(aEditAttr.Get(EE_CHAR_WEIGHT, sal_True), nWhich);
                break;
            case SID_ATTR_CHAR_POSTURE:
                rSet.Put(aEditAttr.Get(EE_CHAR_ITALIC, sal_True), nWhich);
                break;
            case SID_ATTR_CHAR_UNDERLINE:
                rSet.Put(aEditAttr.Get(EE_CHAR_UNDERLINE, sal_True), nWhich);
                break;
            case SID_ATTR_CHAR_CONTOUR:
                rSet.Put(aEditAttr.Get(EE_CHAR_OUTLINE, sal_True), nWhich);
                break;
            case SID_ATTR_CHAR_SHADOWED:
                rSet.Put(aEditAttr.Get(EE_CHAR_SHADOW, sal_True), nWhich);
                break;
            case SID_ATTR_CHAR_STRIKEOUT:
                rSet.Put(aEditAttr.Get(EE_CHAR_STRIKEOUT, sal_True), nWhich);
                break;
            case SID_AUTOSPELL_MARKOFF:
            case SID_AUTOSPELL_CHECK:
                const SfxPoolItem* pState = SW_MOD()->GetSlotState(nWhich);
                if (pState)
                    rSet.Put(SfxBoolItem(nWhich, ((const SfxBoolItem*)pState)->GetValue()));
                else
                    rSet.DisableItem( nWhich );
            break;
        }
        nWhich = aIter.NextWhich();
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



void SwDrawTextShell::ExecClpbrd(SfxRequest &rReq)
{
    if (!IsTextEdit())  // Sonst Absturz!
        return;

    sal_uInt16 nId = rReq.GetSlot();
    switch( nId )
    {
        case SID_CUT:
            pOLV->Cut();
            return;

        case SID_COPY:
            pOLV->Copy();
            return;

        case SID_PASTE:
            pOLV->PasteSpecial();
            break;

        default:
            DBG_ERROR("falscher Dispatcher");
            return;
    }
}

/*--------------------------------------------------------------------
    Beschreibung:   ClipBoard-Status
 --------------------------------------------------------------------*/



void SwDrawTextShell::StateClpbrd(SfxItemSet &rSet)
{
    if (!IsTextEdit())  // Sonst Absturz!
        return;

    ESelection aSel(pOLV->GetSelection());
    const sal_Bool bCopy = (aSel.nStartPara != aSel.nEndPara) || (aSel.nStartPos != aSel.nEndPos);


    SfxWhichIter aIter(rSet);
    sal_uInt16 nWhich = aIter.FirstWhich();

    while(nWhich)
    {
        switch(nWhich)
        {
            case SID_CUT:
            case SID_COPY:
                if( !bCopy )
                    rSet.DisableItem( nWhich );
                break;

            case SID_PASTE:
                {
                    //!!OS: das muss ein if/else bleiben, weil BLC das
                    //      nicht anders versteht
                    SwModule* pMod = SW_MOD();
                    SvDataObjectRef xObj;
                    if( pMod->pClipboard )
                        xObj = pMod->pClipboard;
                    else
                        xObj = SvDataObject::PasteClipboard();

                    if( !xObj.Is() ||
                        !SwDataExchange::IsPaste( GetShell(), *xObj ) )
                        rSet.DisableItem( SID_PASTE );
                }
                break;

            case FN_PASTESPECIAL:
                rSet.DisableItem( FN_PASTESPECIAL );
                break;
        }
        nWhich = aIter.NextWhich();
    }
}

/*--------------------------------------------------------------------
    Beschreibung:   Hyperlink-Status
 --------------------------------------------------------------------*/

void SwDrawTextShell::StateInsert(SfxItemSet &rSet)
{
    if (!IsTextEdit())  // Sonst Absturz!
        return;

    SfxWhichIter aIter(rSet);
    sal_uInt16 nWhich = aIter.FirstWhich();

    while(nWhich)
    {
        switch(nWhich)
        {
            case SID_HYPERLINK_GETLINK:
                {
                    SvxHyperlinkItem aHLinkItem;
                    aHLinkItem.SetInsertMode(HLINK_FIELD);

                    const SvxFieldItem* pFieldItem = pOLV->GetFieldAtSelection();

                    if (pFieldItem)
                    {
                        const SvxFieldData* pField = pFieldItem->GetField();

                        if (pField->ISA(SvxURLField))
                        {
                            aHLinkItem.SetName(((const SvxURLField*) pField)->GetRepresentation());
                            aHLinkItem.SetURL(((const SvxURLField*) pField)->GetURL());
                            aHLinkItem.SetTargetFrame(((const SvxURLField*) pField)->GetTargetFrame());
                        }
                    }
                    else
                    {
                        String sSel(pOLV->GetSelected());
                        sSel.Erase(255);
                        sSel.EraseTrailingChars();
                        aHLinkItem.SetName(sSel);
                    }

                    sal_uInt16 nHtmlMode = ::GetHtmlMode(GetView().GetDocShell());
                    aHLinkItem.SetInsertMode((SvxLinkInsertMode)(aHLinkItem.GetInsertMode() |
                        ((nHtmlMode & HTMLMODE_ON) != 0 ? HLINK_HTMLMODE : 0)));

                    rSet.Put(aHLinkItem);
                }
                break;
        }
        nWhich = aIter.NextWhich();
    }
}

/*************************************************************************

      $Log: not supported by cvs2svn $
      Revision 1.69  2000/09/18 16:06:03  willem.vandorp
      OpenOffice header added.

      Revision 1.68  2000/09/07 15:59:29  os
      change: SFX_DISPATCHER/SFX_BINDINGS removed

      Revision 1.67  2000/05/26 07:21:32  os
      old SW Basic API Slots removed

      Revision 1.66  2000/04/18 14:58:23  os
      UNICODE

      Revision 1.65  2000/03/23 07:49:14  os
      UNO III

      Revision 1.64  2000/02/16 21:00:17  tl
      #72219# Locale Umstellung

      Revision 1.63  2000/02/11 14:57:32  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.62  2000/01/21 13:34:45  tl
      #70503# GetState method added for FN_THESAURUS_DLG

      Revision 1.61  1999/11/30 09:44:05  jp
      StateClpbrd: pObj contains sometimes no Pointer

      Revision 1.60  1999/09/24 14:38:32  os
      hlnkitem.hxx now in SVX

      Revision 1.59  1999/08/04 09:09:50  JP
      have to change: Outliner -> SdrOutlines


      Rev 1.58   04 Aug 1999 11:09:50   JP
   have to change: Outliner -> SdrOutlines

      Rev 1.57   18 Mar 1999 14:41:18   OS
   #61169# #61489# Masseinheiten fuer Text u. HTML am Module setzen, nicht an der App

      Rev 1.56   04 Nov 1998 17:29:54   OM
   #58904# Assertion umpropelt

      Rev 1.55   08 Sep 1998 17:03:08   OS
   #56134# Metric fuer Text und HTML getrennt

      Rev 1.54   25 Jun 1998 14:11:18   JP
   SvDataObject -> SotObject

      Rev 1.53   08 Apr 1998 13:47:22   OM
   #42505 Keine util::URL-Buttons in Html-Dokumenten

      Rev 1.52   12 Mar 1998 11:28:12   OM
   #48017# GPF entfernt

      Rev 1.51   05 Feb 1998 14:48:14   OS
   Absatzdialog enthaelt keinen TableMode

      Rev 1.50   29 Nov 1997 15:52:12   MA
   includes

      Rev 1.49   24 Nov 1997 09:47:00   MA
   includes

      Rev 1.48   03 Nov 1997 13:55:46   MA
   precomp entfernt

      Rev 1.47   17 Sep 1997 13:09:18   OM
   Editierbare Links in DrawText-Objekten

      Rev 1.46   01 Sep 1997 13:24:00   OS
   DLL-Umstellung

      Rev 1.45   11 Aug 1997 08:50:18   OS
   paraitem/frmitems/textitem aufgeteilt

      Rev 1.44   08 Aug 1997 17:28:46   OM
   Headerfile-Umstellung

      Rev 1.43   07 Jul 1997 12:28:14   OM
   #41258# Execute: Nur benoetigte Items putten

      Rev 1.42   17 Jun 1997 16:00:00   MA
   DrawTxtShell nicht von BaseShell ableiten + Opts

      Rev 1.41   04 Jun 1997 11:24:06   TRI
   svwin.h nur unter WIN oder WNT includen

      Rev 1.40   04 Jun 1997 09:50:08   NF
   Includes...

      Rev 1.39   28 May 1997 15:06:30   OM
   #40067# DontCare-State fuer Absatzausrichtung beruecksichtigen

      Rev 1.38   16 May 1997 17:16:40   OM
   Links aus Hyperlinkleiste in DrawText-Objekte einfuegen

      Rev 1.37   19 Mar 1997 12:48:42   AMA
   Fix #37035: Speller am Outliner setzen.

      Rev 1.36   23 Feb 1997 18:20:08   AMA
   Fix #36843#: GPF in der EditEngine durch nicht gesetzten SpellChecker

      Rev 1.35   22 Jan 1997 18:42:26   MH
   add: include

      Rev 1.34   16 Jan 1997 16:36:52   OS
   Metric vor Dialogaufruf an der App setzen

      Rev 1.33   14 Jan 1997 09:31:34   TRI
   includes

      Rev 1.32   16 Dec 1996 19:10:40   HJS
   includes

      Rev 1.31   13 Dec 1996 16:38:22   OS
   Autospell fuer aktives DrawTextObject

      Rev 1.30   22 Nov 1996 14:53:32   OS
   FN_SET_JUSTIFY_PARA -> SID_ATTR_PARA_ADJUST_BLOCK

      Rev 1.29   28 Aug 1996 15:55:10   OS
   includes

      Rev 1.28   22 Mar 1996 15:14:32   TRI
   sfxiiter.hxx included

      Rev 1.27   05 Feb 1996 17:28:42   OM
   Parent-Win an Par/Chardlg uebergeben

      Rev 1.26   12 Dec 1995 17:43:58   OM
   Text-Attribute richtig setzen

      Rev 1.25   11 Dec 1995 18:21:26   OM
   Neuer DrawText Dialog

      Rev 1.24   08 Dec 1995 18:10:28   OM
   CharAttr-Stati richtig updaten

      Rev 1.23   07 Dec 1995 18:25:36   OM
   Neu: GetDrawTxtCtrlState

      Rev 1.22   24 Nov 1995 16:59:34   OM
   PCH->PRECOMPILED

      Rev 1.21   10 Nov 1995 18:24:24   OM
   Init-Fkt optimiert/repariert

      Rev 1.20   09 Nov 1995 18:00:12   OS
   Id fuer FormatPage/CharDlg auf SID_ umgestellt

      Rev 1.19   31 Oct 1995 18:40:42   OM
   GetFrameWindow entfernt

      Rev 1.18   17 Oct 1995 19:27:14   OM
   Clipboard fuer Drawtext

      Rev 1.17   14 Oct 1995 17:58:10   OM
   Prophylaktische Absturzvorsorge...

      Rev 1.16   14 Oct 1995 17:33:44   OM
   Bug 20805: DrawTextShell komplettiert

      Rev 1.15   05 Oct 1995 18:40:44   OM
   Aufgeraeumt

      Rev 1.14   04 Oct 1995 18:43:10   OM
   Text-Reset angefangen

      Rev 1.13   13 Sep 1995 17:28:06   OM
   Modified fuer Drawtext-Objekte geaendert

      Rev 1.12   28 Aug 1995 19:03:34   MA
   Renovierung: IDL, Shells, Textshell-Doktrin aufgegeben

      Rev 1.11   21 Aug 1995 21:00:00   MA
   chg: svxitems-header entfernt

      Rev 1.10   16 Aug 1995 17:50:12   MA
   Riesenheader dialogs entfernt.

      Rev 1.9   09 Aug 1995 18:39:10   OM
   Statusmethode abgesichert

      Rev 1.8   07 Aug 1995 18:41:54   OM
   Zeichendialog richtig attributiert

      Rev 1.7   06 Aug 1995 18:27:32   OM
   DrawTextShell-Popup

      Rev 1.6   23 Jul 1995 17:04:24   OS
   Zeilenabstand kann nur 100/150/200 sein

      Rev 1.5   14 Jul 1995 18:16:40   OM
   Farbcontroller rausgeschmissen

      Rev 1.4   04 May 1995 10:10:04   JP
   Items Optimierung

      Rev 1.3   03 May 1995 23:32:52   ER
   add: editdata.hxx

      Rev 1.2   28 Mar 1995 20:07:58   ER
   header-adder

      Rev 1.1   05 Mar 1995 20:44:44   OM
   Linienabstand, drawing::Alignment, ...

      Rev 1.0   05 Mar 1995 16:36:00   OM
   Textfarbe setzen

      Rev 1.6   04 Mar 1995 19:20:44   OM
   Aenderungen fuer 241

      Rev 1.5   04 Mar 1995 19:03:18   OM
   Execute und State fuer Texthintergrund

      Rev 1.4   03 Mar 1995 18:16:06   OM
   virtual GetPool implementiert

      Rev 1.3   03 Mar 1995 02:07:32   OM
   State-Methode fuer Font-Controller entfernt

      Rev 1.2   02 Mar 1995 19:19:26   OM
   Font-Controller eingebunden

      Rev 1.1   01 Mar 1995 19:07:18   OM
   DrawTextShell 2.Runde

      Rev 1.0   28 Feb 1995 19:45:08   OM
   Initial revision.

*************************************************************************/




diff --git a/sw/source/ui/shells/drwtxtsh.cxx b/sw/source/ui/shells/drwtxtsh.cxx
new file mode 100644
index 0000000..bdddfa3
--- /dev/null
+++ b/sw/source/ui/shells/drwtxtsh.cxx
@@ -0,0 +1,815 @@
/*************************************************************************
 *
 *  $RCSfile: drwtxtsh.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:46 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "hintids.hxx"


#if defined( WIN ) || defined( WNT )
//#include <svwin.h>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _SVX_FONTITEM_HXX //autogen
#include <svx/fontitem.hxx>
#endif
#ifndef _SVX_LANGITEM_HXX //autogen
#include <svx/langitem.hxx>
#endif
#ifndef _SVDVIEW_HXX //autogen
#include <svx/svdview.hxx>
#endif
#ifndef _SV_MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SVX_CHARMAP_HXX //autogen
#include <svx/charmap.hxx>
#endif
#ifndef _SFXVIEWFRM_HXX //autogen
#include <sfx2/viewfrm.hxx>
#endif
#ifndef _SVDOTEXT_HXX //autogen
#include <svx/svdotext.hxx>
#endif
#ifndef _SVX_XFTSFIT_HXX //autogen
#include <svx/xftsfit.hxx>
#endif
#ifndef _EEITEM_HXX //autogen
#include <svx/eeitem.hxx>
#endif
#ifndef _SVDOBJ_HXX //autogen
#include <svx/svdobj.hxx>
#endif
#ifndef _SVX_TEXTANIM_HXX //autogen
#include <svx/textanim.hxx>
#endif
#ifndef _XDEF_HXX //autogen
#include <xdef.hxx>
#endif
#ifndef _SFX_BINDINGS_HXX //autogen
#include <sfx2/bindings.hxx>
#endif
#ifndef _SVX_XFTSFIT_HXX //autogen
#include <svx/xftsfit.hxx>
#endif
#ifndef _SVX_FONTWORK_HXX //autogen
#include <svx/fontwork.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SFX_WHITER_HXX //autogen
#include <svtools/whiter.hxx>
#endif
#ifndef _OUTLINER_HXX //autogen
#include <svx/outliner.hxx>
#endif
#ifndef _EDITSTAT_HXX //autogen
#include <svx/editstat.hxx>
#endif
#ifndef _SVDOUTL_HXX
#include <svx/svdoutl.hxx>
#endif


#include "swtypes.hxx"
#include "view.hxx"
#include "wrtsh.hxx"
#include "uiparam.hxx"
#include "viewopt.hxx"
#include "cmdid.h"
#include "globals.hrc"
#include "helpid.h"
#include "shells.hrc"
#include "initui.hxx"               // fuer SpellPointer
#include "drwtxtsh.hxx"
#include "swundo.hxx"

#ifndef _SFXOBJFACE_HXX //autogen
#include <sfx2/objface.hxx>
#endif
#define SwDrawTextShell
#include "itemdef.hxx"
#include "swslots.hxx"
#include "popup.hrc"

SFX_IMPL_INTERFACE(SwDrawTextShell, SfxShell, SW_RES(STR_SHELLNAME_DRAW_TEXT))
{
    SFX_POPUPMENU_REGISTRATION(SW_RES(MN_DRWTXT_POPUPMENU));
    SFX_OBJECTBAR_REGISTRATION(SFX_OBJECTBAR_OBJECT, SW_RES(RID_DRAW_TEXT_TOOLBOX));
    SFX_OBJECTMENU_REGISTRATION(SID_OBJECTMENU0, SW_RES(MN_OBJECTMENU_DRWTXT));
    SFX_CHILDWINDOW_REGISTRATION(SvxFontWorkChildWindow::GetChildWindowId());
}

TYPEINIT1(SwDrawTextShell,SfxShell)

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



void SwDrawTextShell::Init()
{
    SwWrtShell &rSh = GetShell();
    pSdrView = rSh.GetDrawView();
    pOutliner = pSdrView->GetTextEditOutliner();
    pOLV = pSdrView->GetTextEditOutlinerView();
    ULONG nCtrl = pOutliner->GetControlWord();
    nCtrl |= EE_CNTRL_AUTOCORRECT;

    SetUndoManager(&pOutliner->GetUndoManager());

    // jetzt versuchen wir mal ein AutoSpell

    const SwViewOption* pVOpt = rSh.GetViewOptions();
    if(pVOpt->IsOnlineSpell())
    {
        nCtrl |= EE_CNTRL_ONLINESPELLING|EE_CNTRL_ALLOWBIGOBJS;
        if(pVOpt->IsHideSpell())
            nCtrl |= EE_CNTRL_NOREDLINES;
    }
    else
        nCtrl &= ~(EE_CNTRL_ONLINESPELLING|EE_CNTRL_NOREDLINES);

    pOutliner->SetControlWord(nCtrl);
    pOLV->ShowCursor();
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


SwDrawTextShell::SwDrawTextShell(SwView &rV) :
    SfxShell(&rV),
    rView(rV)
{
    SwWrtShell &rSh = GetShell();
    SetPool(rSh.GetAttrPool().GetSecondaryPool());

    Init();

    rSh.NoEdit(TRUE);
    SetName(String::CreateFromAscii("ObjectText"));
    SetHelpId(SW_DRWTXTSHELL);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



__EXPORT SwDrawTextShell::~SwDrawTextShell()
{
    if ( GetView().GetCurShell() == this )
        rView.ResetSubShell();

    //MA 13. Nov. 96: Das kommt durchaus vor #33141#:
    //(doppel-)Klick von einem Texteditmode in ein anderes Objekt, zwischendurch
    //wird eine andere (Draw-)Shell gepusht, die alte aber noch nicht deletet.
    //Dann wird vor dem Flush wieder ein DrawTextShell gepusht und der Mode ist
    //eingeschaltet. In diesem Moment wird der Dispatcher geflusht und die alte
    //DrawTextShell zerstoert.
//  ASSERT( !pSdrView->IsTextEdit(), "TextEdit in DTor DrwTxtSh?" );
//    if (pSdrView->IsTextEdit())
//      GetShell().EndTextEdit();   // Danebengeklickt, Ende mit Edit

//    GetShell().Edit();
}

SwWrtShell& SwDrawTextShell::GetShell()
{
    return rView.GetWrtShell();
}


/*--------------------------------------------------------------------
    Beschreibung:   Slots mit dieser Statusmethode disablen
 --------------------------------------------------------------------*/

void SwDrawTextShell::StateDisableItems( SfxItemSet &rSet )
{
    SfxWhichIter aIter(rSet);
    USHORT nWhich = aIter.FirstWhich();

    while (nWhich)
    {
        rSet.DisableItem( nWhich );
        nWhich = aIter.NextWhich();
    }
}


/*************************************************************************
|*
|* Attribute setzen
|*
\************************************************************************/



void SwDrawTextShell::SetAttrToMarked(const SfxItemSet& rAttr)
{
    Rectangle aNullRect;
    Rectangle aOutRect = pOLV->GetOutputArea();

    if (aNullRect != aOutRect)
    {
        GetShell().GetDrawView()->SetAttributes(rAttr);
//      Init();
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



BOOL SwDrawTextShell::IsTextEdit()
{
    if (!pOutliner || !pOLV)
        Init();

    if (!pOutliner || !pOLV)
        return (FALSE);

    return (pSdrView->IsTextEdit());
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



void SwDrawTextShell::ExecFontWork(SfxRequest& rReq)
{
    SfxViewFrame* pVFrame = GetView().GetViewFrame();
    if ( rReq.GetArgs() )
    {
        pVFrame->SetChildWindow(SvxFontWorkChildWindow::GetChildWindowId(),
                                ((const SfxBoolItem&) (rReq.GetArgs()->
                                Get(SID_FONTWORK))).GetValue());
    }
    else
        pVFrame->ToggleChildWindow(SvxFontWorkChildWindow::GetChildWindowId());

    pVFrame->GetBindings().Invalidate(SID_FONTWORK);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



void SwDrawTextShell::StateFontWork(SfxItemSet& rSet)
{
    const USHORT nId = SvxFontWorkChildWindow::GetChildWindowId();
    rSet.Put(SfxBoolItem(SID_FONTWORK, GetView().GetViewFrame()->HasChildWindow(nId)));
}

/*************************************************************************
|*
|* SfxRequests fuer FontWork bearbeiten
|*
\************************************************************************/



void SwDrawTextShell::ExecFormText(SfxRequest& rReq)
{
    SwWrtShell &rSh = GetShell();
    SdrView* pDrView = rSh.GetDrawView();

    const SdrMarkList& rMarkList = pDrView->GetMarkList();

    if ( rMarkList.GetMarkCount() == 1 && rReq.GetArgs() )
    {
        const SfxItemSet& rSet = *rReq.GetArgs();
        const SfxPoolItem* pItem;

        if ( pDrView->IsTextEdit() )
        {
            pDrView->EndTextEdit( TRUE );
            GetView().AttrChangedNotify(&rSh);
        }

        if ( rSet.GetItemState(XATTR_FORMTXTSTDFORM, TRUE, &pItem) ==
             SFX_ITEM_SET &&
            ((const XFormTextStdFormItem*) pItem)->GetValue() != XFTFORM_NONE )
        {

            const USHORT nId = SvxFontWorkChildWindow::GetChildWindowId();

            SvxFontWorkDialog* pDlg = (SvxFontWorkDialog*)(GetView().GetViewFrame()->
                                        GetChildWindow(nId)->GetWindow());

            pDlg->CreateStdFormObj(*pDrView, *pDrView->GetPageViewPvNum(0),
                                    rSet, *rMarkList.GetMark(0)->GetObj(),
                                   ((const XFormTextStdFormItem*) pItem)->
                                   GetValue());
        }
        else
            pDrView->SetAttributes(rSet);
    }

}

/*************************************************************************
|*
|* Statuswerte fuer FontWork zurueckgeben
|*
\************************************************************************/



void SwDrawTextShell::GetFormTextState(SfxItemSet& rSet)
{
    SwWrtShell &rSh = GetShell();
    SdrView* pDrView = rSh.GetDrawView();
    const SdrMarkList& rMarkList = pDrView->GetMarkList();
    const SdrObject* pObj = NULL;
    SvxFontWorkDialog* pDlg = NULL;

    const USHORT nId = SvxFontWorkChildWindow::GetChildWindowId();

    SfxViewFrame* pVFrame = GetView().GetViewFrame();
    if ( pVFrame->HasChildWindow(nId) )
        pDlg = (SvxFontWorkDialog*)(pVFrame->GetChildWindow(nId)->GetWindow());

    if ( rMarkList.GetMarkCount() == 1 )
        pObj = rMarkList.GetMark(0)->GetObj();

    if ( pObj == NULL || !pObj->ISA(SdrTextObj) ||
        !((SdrTextObj*) pObj)->HasText() )
    {
#define XATTR_ANZ 12
        static const USHORT nXAttr[ XATTR_ANZ ] =
        {   XATTR_FORMTXTSTYLE, XATTR_FORMTXTADJUST, XATTR_FORMTXTDISTANCE,
            XATTR_FORMTXTSTART, XATTR_FORMTXTMIRROR, XATTR_FORMTXTSTDFORM,
            XATTR_FORMTXTHIDEFORM, XATTR_FORMTXTOUTLINE, XATTR_FORMTXTSHADOW,
            XATTR_FORMTXTSHDWCOLOR, XATTR_FORMTXTSHDWXVAL, XATTR_FORMTXTSHDWYVAL
        };
        for( USHORT i = 0; i < XATTR_ANZ; )
            rSet.DisableItem( nXAttr[ i++ ] );
    }
    else
    {
        if ( pDlg )
            pDlg->SetColorTable(OFF_APP()->GetStdColorTable());

        pDrView->GetAttributes( rSet );
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



void SwDrawTextShell::ExecDrawLingu(SfxRequest &rReq)
{
    SwWrtShell &rSh = GetShell();

    if( rSh.GetDrawView()->GetMarkList().GetMarkCount() )
    {
        LanguageType nLang = ((const SvxLanguageItem&)rSh.
                               GetDefault(RES_CHRATR_LANGUAGE)).GetLanguage();
        switch(rReq.GetSlot())
        {
            case FN_THESAURUS_DLG:
            {
                pOLV->StartThesaurus( nLang );
                break;
            }
            case FN_SPELLING_DLG:
            {
                pOLV->StartSpeller( nLang );
                break;
            }
            default:
                ASSERT(!this, "unexpected slot-id");
                return;
        }
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



void SwDrawTextShell::ExecDraw(SfxRequest &rReq)
{
    SwWrtShell &rSh = GetShell();
    pSdrView = rSh.GetDrawView();


    switch (rReq.GetSlot())
    {
        case FN_INSERT_SYMBOL:  // Sonderzeichen einfuegen
            InsertSymbol();
            break;

        case SID_SELECTALL:
        {
            ULONG nParaCount = pOutliner->GetParagraphCount();
            if (nParaCount > 0)
                pOLV->SelectRange(0L, USHORT(nParaCount) );
        }
        break;

        case FN_FORMAT_RESET:   // Harte Textattributierung l”schen
        {
            SfxItemSet aEmptyAttr(GetPool(), EE_ITEMS_START, EE_ITEMS_END);
            pSdrView->SetAttributes(aEmptyAttr, TRUE);
        }
        break;

        case FN_ESCAPE:
            if (pSdrView->IsTextEdit())
            {
                // Shellwechsel!
                rSh.EndTextEdit();
                rSh.GetView().AttrChangedNotify(&rSh);
                return;
            }
            break;

        case FN_DRAWTEXT_ATTR_DLG:
            {
                SfxItemSet aNewAttr( pSdrView->GetModel()->GetItemPool() );
                pSdrView->GetAttributes( aNewAttr );
                SvxTextTabDialog* pDlg = new SvxTextTabDialog(
                                &(GetView().GetViewFrame()->GetWindow()),
                                &aNewAttr, pSdrView );
                USHORT nResult = pDlg->Execute();

                if (nResult == RET_OK)
                {
                    if (pSdrView->HasMarkedObj())
                        pSdrView->SetAttributes(*pDlg->GetOutputItemSet());
                }
                delete( pDlg );
            }
            break;

        default:
            ASSERT(!this, "unexpected slot-id");
            return;
    }

    GetView().GetViewFrame()->GetBindings().InvalidateAll(FALSE);

    if (IsTextEdit() && pOLV->GetOutliner()->IsModified())
        rSh.SetModified();
}

/*--------------------------------------------------------------------
    Beschreibung:   Undo ausfuehren
 --------------------------------------------------------------------*/



void SwDrawTextShell::ExecUndo(SfxRequest &rReq)
{
    if ( !IsTextEdit() )
        return;

    SfxViewFrame *pSfxViewFrame = GetView().GetViewFrame();
    pSfxViewFrame->ExecuteSlot(rReq, pSfxViewFrame->GetInterface());
}

/*--------------------------------------------------------------------
    Beschreibung:   Zustand Undo
 --------------------------------------------------------------------*/



void SwDrawTextShell::StateUndo(SfxItemSet &rSet)
{
    if ( !IsTextEdit() )
        return;

    SfxViewFrame *pSfxViewFrame = GetView().GetViewFrame();
    SfxWhichIter aIter(rSet);
    USHORT nWhich = aIter.FirstWhich();
    while(nWhich)
    {
        pSfxViewFrame->GetSlotState(nWhich, pSfxViewFrame->GetInterface(), &rSet );
        nWhich = aIter.NextWhich();
    }
}

/*--------------------------------------------------------------------
    Beschreibung:   Sonderzeichen einfuegen (siehe SDraw: FUBULLET.CXX)
 --------------------------------------------------------------------*/



void SwDrawTextShell::InsertSymbol()
{
    SvxCharacterMap* pDlg = new SvxCharacterMap( NULL, FALSE );

    // Wenn Zeichen selektiert ist kann es angezeigt werden
    // pDLg->SetFont( );
    // pDlg->SetChar( );
    USHORT nResult = pDlg->Execute();

    //char c;
    String s;

    Font aFont;

    if( nResult == RET_OK )
    {
        aFont = pDlg->GetCharFont();
        s     = pDlg->GetCharacters();
    }
    delete( pDlg );

    if( nResult == RET_OK )
    {
        // Sonderzeichen einfuegen
        if (pOLV)
        {
            // nicht flackern
            pOLV->HideCursor();
            pOutliner->SetUpdateMode(FALSE);

            SfxItemSet aOldSet(pOLV->GetAttribs());
            SvxFontItem aOldFontItem((const SvxFontItem&)aOldSet.Get(EE_CHAR_FONTINFO));

            // String einfuegen
            pOLV->InsertText(s, TRUE);

            // attributieren (Font setzen)
            SfxItemSet aSet(pOutliner->GetEmptyItemSet());
            SvxFontItem aFontItem (aFont.GetFamily(),    aFont.GetName(),
                                   aFont.GetStyleName(), aFont.GetPitch(),
                                   aFont.GetCharSet(),
                                   EE_CHAR_FONTINFO);
            aSet.Put(aFontItem);
            pOLV->SetAttribs(aSet);

            // Selektion loeschen
            ESelection aSel(pOLV->GetSelection());
            aSel.nStartPara = aSel.nEndPara;
            aSel.nStartPos = aSel.nEndPos;
            pOLV->SetSelection(aSel);

            // Alten Font restaurieren
            aSet.Put(aOldFontItem);
            pOLV->SetAttribs(aSet);

            // ab jetzt wieder anzeigen
            pOutliner->SetUpdateMode(TRUE);
            pOLV->ShowCursor();
        }
    }
}

/*************************************************************************

      Source Code Control System - History

      $Log: not supported by cvs2svn $
      Revision 1.113  2000/09/18 16:06:03  willem.vandorp
      OpenOffice header added.

      Revision 1.112  2000/09/08 08:12:51  os
      Change: Set/Toggle/Has/Knows/Show/GetChildWindow

      Revision 1.111  2000/09/07 15:59:29  os
      change: SFX_DISPATCHER/SFX_BINDINGS removed

      Revision 1.110  2000/05/26 07:21:32  os
      old SW Basic API Slots removed

      Revision 1.109  2000/05/10 11:53:01  os
      Basic API removed

      Revision 1.108  2000/04/18 14:58:23  os
      UNICODE

      Revision 1.107  1999/08/04 09:09:52  JP
      have to change: Outliner -> SdrOutlines


      Rev 1.106   04 Aug 1999 11:09:52   JP
   have to change: Outliner -> SdrOutlines

      Rev 1.105   21 Jun 1999 15:20:24   JP
   Interface changes: SdrView::GetAttributes

      Rev 1.104   10 Jun 1999 13:16:36   JP
   have to change: no AppWin from SfxApp

      Rev 1.103   02 Feb 1999 13:17:36   JP
   Bug #61335#: Schnistelle zu SwView geaendert/aufgeraeumt

      Rev 1.102   12 Oct 1998 10:13:20   OM
   #57790# Dialog nicht mehr AppModal

      Rev 1.101   06 May 1998 16:20:42   OS
   AttrChangedNotify nach Shellwechsel nicht ueber this aufrufen

      Rev 1.100   29 Nov 1997 15:52:14   MA
   includes

      Rev 1.99   24 Nov 1997 09:47:00   MA
   includes

      Rev 1.98   03 Nov 1997 13:55:46   MA
   precomp entfernt

      Rev 1.97   30 Sep 1997 16:30:46   TJ
   include

      Rev 1.96   01 Sep 1997 13:23:56   OS
   DLL-Umstellung

      Rev 1.95   11 Aug 1997 08:34:16   OS
   paraitem/frmitems/textitem aufgeteilt

      Rev 1.94   06 Aug 1997 14:19:50   TRI
   VCL: GetpApp() statt pApp

      Rev 1.93   05 Aug 1997 13:29:54   MH
   chg: header

      Rev 1.92   25 Jun 1997 09:10:18   MA
   #40965#, SubShell abmelden

      Rev 1.91   19 Jun 1997 16:39:16   MA
   fix: reste vom DrawText-Umbau

      Rev 1.90   19 Jun 1997 16:05:42   HJS
   includes

      Rev 1.89   17 Jun 1997 15:54:12   MA
   DrawTxtShell nicht von BaseShell ableiten + Opts

      Rev 1.88   04 Jun 1997 11:30:26   TRI
   svwin.h nur unter WIN oder WNT includen

      Rev 1.87   04 Jun 1997 09:54:48   NF
   Includes...

      Rev 1.86   02 May 1997 20:15:40   NF
   includes...

      Rev 1.85   08 Apr 1997 10:52:22   OM
   Fehlende Includes

      Rev 1.84   02 Apr 1997 14:07:00   JP
   Bug #38398#: StateUndo - Itemset weitergeben

      Rev 1.83   19 Mar 1997 12:48:20   AMA
   Fix #37035: Speller am Outliner setzen.

      Rev 1.82   24 Feb 1997 16:53:08   OM
   Silbentrennung in Draw-Objekten

      Rev 1.81   16 Dec 1996 10:41:50   OM
   Cursor nach Initialisierung anzeigen

      Rev 1.80   11 Dec 1996 10:50:58   MA
   Warnings

      Rev 1.79   26 Nov 1996 16:53:06   OS
   Erste Schritte fuer OnlineSpelling in  DrawTextObjekten

      Rev 1.78   19 Nov 1996 16:02:30   NF
   defines...

      Rev 1.77   18 Nov 1996 16:05:50   OS
   Set/GetControlWord an der OutlinerView benutzen

      Rev 1.76   18 Nov 1996 15:46:40   OS
   AutoKorrektur auch im DrawText

      Rev 1.75   15 Nov 1996 13:34:02   OS
   SvxTextTabDialog angebunden

      Rev 1.74   13 Nov 1996 20:29:36   MA
   #33141# nicht den Mode verlassen

      Rev 1.73   07 Nov 1996 16:22:52   OM
   Font nach Einfuegen:Sonderzeichen restaurieren

      Rev 1.72   07 Nov 1996 15:28:18   OM
   RefDevice am Outliner setzen

      Rev 1.71   06 Nov 1996 16:41:26   OS
   SID_SW_START statt RID_APP_START

      Rev 1.70   26 Sep 1996 15:41:54   OM
   Neues Parent fuer Sonderzeichen-Dlg

      Rev 1.69   28 Aug 1996 15:55:00   OS
   includes

      Rev 1.68   15 Aug 1996 13:44:22   JP
   svdraw.hxx entfernt

      Rev 1.67   31 May 1996 11:09:30   NF
   CLOOKS

      Rev 1.66   28 May 1996 11:56:16   TRI
   CLOOKS

      Rev 1.65   21 May 1996 08:58:00   NF
   CLOOKS

      Rev 1.64   22 Mar 1996 15:17:00   TRI
   sfxiiter.hxx included

      Rev 1.63   29 Feb 1996 21:14:40   HJS
   clooks

      Rev 1.62   19 Feb 1996 18:30:58   MA
   chg: EndTextEdit ueber die fesh

      Rev 1.61   16 Feb 1996 09:14:48   SWG
   CLOOK's

      Rev 1.60   07 Feb 1996 08:07:22   OS
   SvxTextAttrDialog hat jetzt endgueltig 3 Parameter

      Rev 1.59   01 Feb 1996 08:07:18   SWG
   TextAttrDialog wieder mal als nicht-Emergency-Version

*************************************************************************/



diff --git a/sw/source/ui/shells/frmsh.cxx b/sw/source/ui/shells/frmsh.cxx
new file mode 100644
index 0000000..8c703cd
--- /dev/null
+++ b/sw/source/ui/shells/frmsh.cxx
@@ -0,0 +1,1082 @@
/*************************************************************************
 *
 *  $RCSfile: frmsh.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:46 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _UIPARAM_HXX
#include <uiparam.hxx>
#endif

#ifndef _SFX_WHITER_HXX //autogen
#include <svtools/whiter.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _GOODIES_IMAPOBJ_HXX
#include <svtools/imapobj.hxx>
#endif
#ifndef _SVX_SRCHITEM_HXX
#include <svx/srchitem.hxx>
#endif
#ifndef _SFX_SAVEOPT_HXX //autogen
#include <sfx2/saveopt.hxx>
#endif
#ifndef _IMAP_HXX //autogen
#include <svtools/imap.hxx>
#endif
#ifndef _SFXVIEWFRM_HXX //autogen
#include <sfx2/viewfrm.hxx>
#endif
#ifndef _SB_SBSTAR_HXX //autogen
#include <basic/sbstar.hxx>
#endif
#ifndef _SFXRECTITEM_HXX //autogen
#include <svtools/rectitem.hxx>
#endif
#ifndef _SFXPTITEM_HXX //autogen
#include <svtools/ptitem.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _SVX_COLRITEM_HXX //autogen
#include <svx/colritem.hxx>
#endif
#ifndef _SVX_BOLNITEM_HXX //autogen
#include <svx/bolnitem.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_PROTITEM_HXX //autogen
#include <svx/protitem.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SFXOBJFACE_HXX //autogen
#include <sfx2/objface.hxx>
#endif
#ifndef _SVX_HLNKITEM_HXX //autogen
#include <svx/hlnkitem.hxx>
#endif


#ifndef _FMTURL_HXX //autogen
#include <fmturl.hxx>
#endif
#ifndef _FMTCLDS_HXX //autogen
#include <fmtclds.hxx>
#endif
#ifndef _FMTCNCT_HXX //autogen
#include <fmtcnct.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _FRMATR_HXX
#include <frmatr.hxx>
#endif
#ifndef _UITOOL_HXX
#include <uitool.hxx>
#endif
#ifndef _FRMFMT_HXX
#include <frmfmt.hxx>
#endif
#ifndef _FRMSH_HXX
#include <frmsh.hxx>
#endif
#ifndef _FRMMGR_HXX
#include <frmmgr.hxx>
#endif
#ifndef _FRMDLG_HXX
#include <frmdlg.hxx>
#endif
#ifndef _SWEVENT_HXX
#include <swevent.hxx>
#endif
#ifndef _USRPREF_HXX
#include <usrpref.hxx>
#endif
#ifndef _EDTWIN_HXX
#include <edtwin.hxx>
#endif

#ifndef _HELPID_H
#include <helpid.h>
#endif
#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif
#ifndef _POPUP_HRC
#include <popup.hrc>
#endif
#ifndef _SHELLS_HRC
#include <shells.hrc>
#endif

// Prototypen ------------------------------------------------------------

void lcl_FrmGetMaxLineWidth(const SvxBorderLine* pBorderLine, SvxBorderLine& rBorderLine);

#define SwFrameShell
#include "itemdef.hxx"
#include "swslots.hxx"

SFX_IMPL_INTERFACE(SwFrameShell, SwBaseShell, SW_RES(STR_SHELLNAME_FRAME))
{
    SFX_POPUPMENU_REGISTRATION(SW_RES(MN_FRM_POPUPMENU));
    SFX_OBJECTBAR_REGISTRATION(SFX_OBJECTBAR_OBJECT, SW_RES(RID_FRAME_TOOLBOX));
    SFX_OBJECTMENU_REGISTRATION(SID_OBJECTMENU0, SW_RES(MN_OBJECTMENU_FRAME));
}



void SwFrameShell::Execute(SfxRequest &rReq)
{
    //Erstmal die, die keinen FrmMgr benoetigen.
    SwWrtShell &rSh = GetShell();
    BOOL bMore = FALSE;
    const SfxItemSet* pArgs = rReq.GetArgs();
    const SfxPoolItem* pItem;
    USHORT nSlot = rReq.GetSlot();

    switch ( nSlot )
    {
        case FN_FRAME_TO_ANCHOR:
            if ( rSh.IsFrmSelected() )
            {
                rSh.GotoFlyAnchor();
                rSh.EnterStdMode();
                rSh.CallChgLnk();
            }
            break;
        case SID_FRAME_TO_TOP:
            rSh.SelectionToTop();
            break;

        case SID_FRAME_TO_BOTTOM:
            rSh.SelectionToBottom();
            break;

        case FN_FRAME_UP:
            rSh.SelectionToTop( FALSE );
            break;

        case FN_FRAME_DOWN:
            rSh.SelectionToBottom( FALSE );
            break;
        case FN_INSERT_FRAME:
            if (!pArgs)
            {
                // Rahmen existiert bereits, Rahmendialog zur Bearbeitung oeffnen
                SfxUInt16Item aDefPage(FN_FORMAT_FRAME_DLG, TP_COLUMN);
                rSh.GetView().GetViewFrame()->GetDispatcher()->Execute( FN_FORMAT_FRAME_DLG,
                                SFX_CALLMODE_SYNCHRON|SFX_CALLMODE_RECORD,
                                &aDefPage, 0L );

            }
            else
            {
                // Rahmen existiert bereits, nur Spaltenanzahl wird geaendert
                USHORT nCols = 1;
                if(pArgs->GetItemState(SID_ATTR_COLUMNS, FALSE, &pItem) == SFX_ITEM_SET)
                    nCols = ((SfxUInt16Item *)pItem)->GetValue();

                SfxItemSet aSet(GetPool(),RES_COL,RES_COL);
                rSh.GetFlyFrmAttr( aSet );
                SwFmtCol aCol((const SwFmtCol&)aSet.Get(RES_COL));
                // GutterWidth wird nicht immer uebergeben, daher erst besorgen (siehe view2: Execute auf diesen Slot)
                USHORT nGutterWidth = aCol.GetGutterWidth();
                if(!nCols )
                    nCols++;
                aCol.Init(nCols, nGutterWidth, aCol.GetWishWidth());
                aSet.Put(aCol);
                // Vorlagen-AutoUpdate
                SwFrmFmt* pFmt = rSh.GetCurFrmFmt();
                if(pFmt && pFmt->IsAutoUpdateFmt())
                {
                    rSh.AutoUpdateFrame(pFmt, aSet);
                }
                else
                {
                    rSh.StartAllAction();
                    rSh.SetFlyFrmAttr( aSet );
                    rSh.SetModified();
                    rSh.EndAllAction();
                }

            }
            return;

        case SID_HYPERLINK_SETLINK:
        {
            if(pArgs && SFX_ITEM_SET == pArgs->GetItemState(SID_HYPERLINK_SETLINK, FALSE, &pItem))
            {
                const SvxHyperlinkItem& rHLinkItem = *(const SvxHyperlinkItem *)pItem;
                const String& rURL = rHLinkItem.GetURL();
                const String& rTarget = rHLinkItem.GetTargetFrame();

                SfxItemSet aSet( rSh.GetAttrPool(), RES_URL, RES_URL );
                rSh.GetFlyFrmAttr( aSet );
                SwFmtURL aURL( (SwFmtURL&)aSet.Get( RES_URL ) );

                String sOldName(rHLinkItem.GetName());
                String sFlyName(rSh.GetFlyName());
                if (sOldName.ToUpperAscii() != sFlyName.ToUpperAscii())
                {
                    String sName(sOldName);
                    USHORT i = 1;
                    while (rSh.FindFlyByName(sName))
                    {
                        sName = sOldName;
                        sName += '_';
                        sName += String::CreateFromInt32(i++);
                    }
                    rSh.SetFlyName(sName);
                }
                aURL.SetURL( rURL, FALSE );
                aURL.SetTargetFrameName(rTarget);

                aSet.Put( aURL );
                rSh.SetFlyFrmAttr( aSet );
            }
        }
        break;

        case FN_FRAME_CHAIN:
            rSh.GetView().GetEditWin().SetChainMode( !rSh.GetView().GetEditWin().IsChainMode() );
            break;

        case FN_FRAME_UNCHAIN:
            rSh.Unchain( (SwFrmFmt&)*rSh.GetFlyFrmFmt() );
            GetView().GetViewFrame()->GetBindings().Invalidate(FN_FRAME_CHAIN);
            break;

        default: bMore = TRUE;
    }

    if ( !bMore )
    {
        return;
    }

    SwFlyFrmAttrMgr aMgr( FALSE, &rSh, FRMMGR_TYPE_NONE );
    BOOL bUpdateMgr = TRUE;
    BOOL bCopyToFmt = FALSE;
    switch ( nSlot )
    {
        case FN_FRAME_ALIGN_VERT_CENTER:
            aMgr.SetVertOrientation( SVX_VERT_CENTER );
            break;

        case FN_FRAME_ALIGN_VERT_BOTTOM:
            aMgr.SetVertOrientation( SVX_VERT_BOTTOM );
            break;

        case FN_FRAME_ALIGN_VERT_TOP:
            aMgr.SetVertOrientation( SVX_VERT_TOP );
            break;

        case FN_FRAME_ALIGN_VERT_CHAR_CENTER:
            aMgr.SetVertOrientation( SVX_VERT_CHAR_CENTER );
            break;

        case FN_FRAME_ALIGN_VERT_CHAR_BOTTOM:
            aMgr.SetVertOrientation( SVX_VERT_CHAR_BOTTOM );
            break;

        case FN_FRAME_ALIGN_VERT_CHAR_TOP:
            aMgr.SetVertOrientation( SVX_VERT_CHAR_TOP );
            break;

        case FN_FRAME_ALIGN_VERT_ROW_CENTER:
            aMgr.SetVertOrientation( SVX_VERT_LINE_CENTER );
            break;

        case FN_FRAME_ALIGN_VERT_ROW_BOTTOM:
            aMgr.SetVertOrientation( SVX_VERT_LINE_BOTTOM );
            break;

        case FN_FRAME_ALIGN_VERT_ROW_TOP:
            aMgr.SetVertOrientation( SVX_VERT_LINE_TOP );
            break;

        case FN_FRAME_ALIGN_HORZ_CENTER:
            aMgr.SetHorzOrientation( HORI_CENTER );
            break;

        case FN_FRAME_ALIGN_HORZ_RIGHT:
            aMgr.SetHorzOrientation( HORI_RIGHT );
            break;

        case FN_FRAME_ALIGN_HORZ_LEFT:
            aMgr.SetHorzOrientation( HORI_LEFT );
            break;

        case FN_SET_FRM_POSITION:
        {
            aMgr.SetAbsPos(((SfxPointItem &)pArgs->Get
                                (FN_SET_FRM_POSITION)).GetValue());
        }
        break;
        case SID_ATTR_BRUSH:
        {
            if(pArgs)
            {
                aMgr.SetAttrSet( *pArgs );
                bCopyToFmt = TRUE;
            }
        }
        break;
        case SID_ATTR_ULSPACE:
        case SID_ATTR_LRSPACE:
        {
            if(pArgs && SFX_ITEM_SET == pArgs->GetItemState(GetPool().GetWhich(nSlot), FALSE, &pItem))
            {
                aMgr.SetAttrSet( *pArgs );
                if(SID_ATTR_ULSPACE == nSlot && SID_ATTR_ULSPACE == nSlot)
                    bCopyToFmt = TRUE;
            }
        }
        break;
        case FN_FORMAT_FRAME_DLG:
        {
            const int nSel = rSh.GetSelectionType();
            if (nSel & SwWrtShell::SEL_GRF)
            {
                rSh.GetView().GetViewFrame()->GetDispatcher()->Execute(FN_FORMAT_GRAFIC_DLG);
                bUpdateMgr = FALSE;
            }
            else
            {
                //SFX_APP()->GetOptions().SetMetric(::GetDfltMetric());
                SfxItemSet aSet(GetPool(),  RES_FRMATR_BEGIN,       RES_FRMATR_END-1,
                                            SID_ATTR_BORDER_INNER,  SID_ATTR_BORDER_INNER,
                                            FN_GET_PRINT_AREA,      FN_GET_PRINT_AREA,
                                            SID_ATTR_PAGE_SIZE,     SID_ATTR_PAGE_SIZE,
                                            SID_ATTR_BRUSH,         SID_ATTR_BRUSH,
                                            SID_ATTR_LRSPACE,       SID_ATTR_ULSPACE,
                                            FN_SURROUND,            FN_HORI_ORIENT,
                                            FN_SET_FRM_NAME,        FN_SET_FRM_NAME,
                                            FN_KEEP_ASPECT_RATIO,   FN_KEEP_ASPECT_RATIO,
                                            SID_DOCFRAME,           SID_DOCFRAME,
                                            SID_HTML_MODE,          SID_HTML_MODE,
                                            FN_SET_FRM_ALT_NAME,    FN_SET_FRM_ALT_NAME,
                                            0);

                const SwViewOption* pVOpt = rSh.GetViewOptions();
                if(nSel & SwWrtShell::SEL_OLE)
                {
                    aSet.Put(SfxBoolItem(FN_KEEP_ASPECT_RATIO,
                        pVOpt->IsKeepRatio()));
                }
                aSet.Put(SfxUInt16Item(SID_HTML_MODE, ::GetHtmlMode(GetView().GetDocShell())));
                aSet.Put(SfxStringItem(FN_SET_FRM_NAME, rSh.GetFlyName()));
                if(nSel & SwWrtShell::SEL_OLE)
                    aSet.Put(SfxStringItem(FN_SET_FRM_ALT_NAME, rSh.GetAlternateText()));

                const SwRect &rPg = rSh.GetAnyCurRect(RECT_PAGE);
                SwFmtFrmSize aFrmSize(ATT_VAR_SIZE, rPg.Width(), rPg.Height());
                aFrmSize.SetWhich(GetPool().GetWhich(SID_ATTR_PAGE_SIZE));
                aSet.Put(aFrmSize);

                const SwRect &rPr = rSh.GetAnyCurRect(RECT_PAGE_PRT);
                SwFmtFrmSize aPrtSize(ATT_VAR_SIZE, rPr.Width(), rPr.Height());
                aPrtSize.SetWhich(GetPool().GetWhich(FN_GET_PRINT_AREA));
                aSet.Put(aPrtSize);

                aSet.Put(aMgr.GetAttrSet());
                aSet.SetParent( aMgr.GetAttrSet().GetParent() );

                // Bei %-Werten Groesse initialisieren
                SwFmtFrmSize& rSize = (SwFmtFrmSize&)aSet.Get(RES_FRM_SIZE);
                if (rSize.GetWidthPercent() && rSize.GetWidthPercent() != 0xff)
                    rSize.SetWidth(rSh.GetAnyCurRect(RECT_FLY_EMBEDDED).Width());
                if (rSize.GetHeightPercent() && rSize.GetHeightPercent() != 0xff)
                    rSize.SetHeight(rSh.GetAnyCurRect(RECT_FLY_EMBEDDED).Height());

                UINT16 nDefPage = 0;
                if(pArgs && pArgs->GetItemState(FN_FORMAT_FRAME_DLG, FALSE, &pItem) == SFX_ITEM_SET)
                    nDefPage = ((SfxUInt16Item *)pItem)->GetValue();

                aSet.Put(SfxFrameItem( SID_DOCFRAME, GetView().GetViewFrame()->GetTopFrame()));


                SwFrmDlg *pDlg = new SwFrmDlg( GetView().GetViewFrame(),
                                               GetView().GetWindow(),
                                   aSet, FALSE,
                                   nSel & SwWrtShell::SEL_GRF ? DLG_FRM_GRF :
                                   nSel & SwWrtShell::SEL_OLE ? DLG_FRM_OLE :
                                                                DLG_FRM_STD,
                                   FALSE,
                                   nDefPage);

                if ( pDlg->Execute() )
                {
                    const SfxItemSet* pOutSet = pDlg->GetOutputItemSet();
                    if(pOutSet)
                    {
                        if(nSel & SwWrtShell::SEL_OLE &&
                        SFX_ITEM_SET == pOutSet->GetItemState(FN_KEEP_ASPECT_RATIO, TRUE, &pItem))
                        {
                            SwViewOption aUsrPref( *pVOpt );
                            aUsrPref.SetKeepRatio(((const SfxBoolItem*)pItem)->GetValue());
                            SW_MOD()->ApplyUsrPref(aUsrPref, &GetView());
                        }
                        if (SFX_ITEM_SET == pOutSet->GetItemState(FN_SET_FRM_ALT_NAME, TRUE, &pItem))
                        {
                            rSh.SetAlternateText(((const SfxStringItem*)pItem)->GetValue());
                        }
                        // Vorlagen-AutoUpdate
                        SwFrmFmt* pFmt = rSh.GetCurFrmFmt();
                        if(pFmt && pFmt->IsAutoUpdateFmt())
                        {
                            rSh.AutoUpdateFrame(pFmt, *pOutSet);
                            const SfxPoolItem* pItem;
                            // alles, dass das Format nicht kann, muss hart
                            // gesetzt werden
                            if(SFX_ITEM_SET == pOutSet->GetItemState(FN_SET_FRM_NAME, FALSE, &pItem))
                                rSh.SetFlyName(((SfxStringItem*)pItem)->GetValue());
                            SfxItemSet aShellSet(GetPool(), RES_FRM_SIZE,   RES_FRM_SIZE,
                                                            RES_SURROUND,   RES_SURROUND,
                                                            RES_ANCHOR,     RES_ANCHOR,
                                                            RES_VERT_ORIENT,RES_HORI_ORIENT,
                                                            0);
                            aShellSet.Put(*pOutSet);
                            aMgr.SetAttrSet(aShellSet);
                            if(SFX_ITEM_SET == pOutSet->GetItemState(FN_SET_FRM_NAME, FALSE, &pItem))
                                rSh.SetFlyName(((SfxStringItem*)pItem)->GetValue());
                        }
                        else
                            aMgr.SetAttrSet( *pOutSet );

                    }
                }
                else
                    bUpdateMgr = FALSE;
                delete pDlg;
            }
        }
        break;
        case FN_FRAME_MIRROR_ON_EVEN_PAGES:
        {
            SwFmtHoriOrient aHori(aMgr.GetHoriOrient());
            BOOL bMirror = !aHori.IsPosToggle();
            aHori.SetPosToggle(bMirror);
            SfxItemSet aSet(GetPool(), RES_HORI_ORIENT, RES_HORI_ORIENT);
            aSet.Put(aHori);
            aMgr.SetAttrSet(aSet);
            bCopyToFmt = TRUE;
            rReq.SetReturnValue(SfxBoolItem(nSlot, bMirror));
        }
        break;
        default:
            ASSERT( !this, "falscher Dispatcher" );
            return;
    }
    // Vorlagen-AutoUpdate
    SwFrmFmt* pFmt = rSh.GetCurFrmFmt();
    if ( bUpdateMgr )
    {
        if(bCopyToFmt && pFmt && pFmt->IsAutoUpdateFmt())
        {
            rSh.AutoUpdateFrame(pFmt, aMgr.GetAttrSet());
        }
        else
            aMgr.UpdateFlyFrm();
    }

}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwFrameShell::GetState(SfxItemSet& rSet)
{
    SwWrtShell &rSh = GetShell();
    BOOL bHtmlMode = 0 != ::GetHtmlMode(rSh.GetView().GetDocShell());
    if (rSh.IsFrmSelected())
    {
        SfxItemSet aSet( rSh.GetAttrPool(),
                            RES_LR_SPACE, RES_UL_SPACE,
                            RES_PROTECT, RES_HORI_ORIENT,
                            RES_OPAQUE, RES_OPAQUE,
                            RES_PRINT, RES_OPAQUE,
                            0 );
        rSh.GetFlyFrmAttr( aSet );

        BOOL bProtect = rSh.IsSelObjProtected(FLYPROTECT_POS);
        BOOL bParentCntProt = rSh.IsSelObjProtected( (FlyProtectType)(FLYPROTECT_CONTENT|FLYPROTECT_PARENT) ) != 0;

        bProtect |= bParentCntProt;

        const USHORT eFrmType = rSh.GetFrmType(0,TRUE);
        SwFlyFrmAttrMgr aMgr( FALSE, &rSh, FRMMGR_TYPE_NONE );

        SfxWhichIter aIter( rSet );
        USHORT nWhich = aIter.FirstWhich();
        while ( nWhich )
        {
            switch ( nWhich )
            {
                case RES_FRM_SIZE:
                {
                    SwFmtFrmSize aSz(aMgr.GetFrmSize());
                    rSet.Put(aSz);
                }
                break;
                case RES_VERT_ORIENT:
                case RES_HORI_ORIENT:
                case SID_ATTR_ULSPACE:
                case SID_ATTR_LRSPACE:
                case RES_LR_SPACE:
                case RES_UL_SPACE:
                case RES_PROTECT:
                case RES_OPAQUE:
                case RES_PRINT:
                case RES_SURROUND:
                {
                    rSet.Put(aSet.Get(GetPool().GetWhich(nWhich), TRUE ));
                }
                break;
                case FN_FRAME_ALIGN_HORZ_CENTER:
                case FN_FRAME_ALIGN_HORZ_RIGHT:
                case FN_FRAME_ALIGN_HORZ_LEFT:
                    if ( (eFrmType & FRMTYPE_FLY_INCNT) ||
                            bProtect ||
                            nWhich == FN_FRAME_ALIGN_HORZ_CENTER && bHtmlMode )
                        rSet.DisableItem( nWhich );
                break;
                case FN_FRAME_ALIGN_VERT_ROW_TOP:
                case FN_FRAME_ALIGN_VERT_ROW_CENTER:
                case FN_FRAME_ALIGN_VERT_ROW_BOTTOM:
                case FN_FRAME_ALIGN_VERT_CHAR_TOP:
                case FN_FRAME_ALIGN_VERT_CHAR_CENTER:
                case FN_FRAME_ALIGN_VERT_CHAR_BOTTOM:
                    if ( !(eFrmType & FRMTYPE_FLY_INCNT) || bProtect
                            || bHtmlMode && FN_FRAME_ALIGN_VERT_CHAR_BOTTOM == nWhich )
                        rSet.DisableItem( nWhich );
                break;
                case FN_FRAME_ALIGN_VERT_TOP:
                case FN_FRAME_ALIGN_VERT_CENTER:
                case FN_FRAME_ALIGN_VERT_BOTTOM:
                    if ( bProtect || bHtmlMode && eFrmType & FRMTYPE_FLY_ATCNT)
                        rSet.DisableItem( nWhich );
                    else
                    {
                        USHORT nId = 0;
                        if (eFrmType & FRMTYPE_FLY_INCNT)
                        {
                            switch (nWhich)
                            {
                                case FN_FRAME_ALIGN_VERT_TOP:
                                    nId = STR_TOP_BASE; break;
                                case FN_FRAME_ALIGN_VERT_CENTER:
                                    nId = STR_CENTER_BASE;  break;
                                case FN_FRAME_ALIGN_VERT_BOTTOM:
                                    if(!bHtmlMode)
                                        nId = STR_BOTTOM_BASE;
                                    else
                                        rSet.DisableItem( nWhich );
                                break;
                            }
                        }
                        else
                        {
                            if (nWhich == FN_FRAME_ALIGN_VERT_CENTER ||
                                nWhich == FN_FRAME_ALIGN_VERT_BOTTOM)
                            {
                                if (aMgr.GetAnchor() == FLY_AT_FLY)
                                {
                                    const SwFrmFmt* pFmt = rSh.IsFlyInFly();
                                    if (pFmt)
                                    {
                                        const SwFmtFrmSize& rFrmSz = pFmt->GetFrmSize();
                                        if (rFrmSz.GetSizeType() != ATT_FIX_SIZE)
                                        {
                                            rSet.DisableItem( nWhich );
                                            break;
                                        }
                                    }
                                }
                            }
                            switch (nWhich)
                            {
                                case FN_FRAME_ALIGN_VERT_TOP:
                                    nId = STR_TOP; break;
                                case FN_FRAME_ALIGN_VERT_CENTER:
                                    nId = STR_CENTER_VERT; break;
                                case FN_FRAME_ALIGN_VERT_BOTTOM:
                                    nId = STR_BOTTOM; break;
                            }
                        }
                        if ( nId )
                            rSet.Put( SfxStringItem( nWhich, SW_RES(nId) ));
                    }
                break;
                case SID_HYPERLINK_GETLINK:
                {
                    String sURL;
                    SvxHyperlinkItem aHLinkItem;
                    const SfxPoolItem* pItem;

                    SfxItemSet aSet(GetPool(), RES_URL, RES_URL);
                    rSh.GetFlyFrmAttr( aSet );

                    if(SFX_ITEM_SET == aSet.GetItemState(RES_URL, TRUE, &pItem))
                    {
                        const SwFmtURL* pFmtURL = (const SwFmtURL*)pItem;
                        aHLinkItem.SetURL(pFmtURL->GetURL());
                        aHLinkItem.SetTargetFrame(pFmtURL->GetTargetFrameName());
                        aHLinkItem.SetName(rSh.GetFlyName());
                    }

                    aHLinkItem.SetInsertMode((SvxLinkInsertMode)(aHLinkItem.GetInsertMode() |
                        (bHtmlMode ? HLINK_HTMLMODE : 0)));

                    rSet.Put(aHLinkItem);
                }
                break;

                case FN_FRAME_CHAIN:
                {
                    const SwFrmFmt *pFmt = rSh.GetFlyFrmFmt();
                    if ( bParentCntProt || rSh.GetView().GetEditWin().GetApplyTemplate() ||
                         !pFmt || pFmt->GetChain().GetNext() )
                    {
                        rSet.DisableItem( FN_FRAME_CHAIN );
                    }
                    else
                    {
                        BOOL bChainMode = rSh.GetView().GetEditWin().IsChainMode();
                        rSet.Put( SfxBoolItem( FN_FRAME_CHAIN, bChainMode ) );
                    }
                    break;
                }

                case FN_FRAME_UNCHAIN:
                {
                    const SwFrmFmt *pFmt = rSh.GetFlyFrmFmt();
                    if ( bParentCntProt || rSh.GetView().GetEditWin().GetApplyTemplate() ||
                         !pFmt || !pFmt->GetChain().GetNext() )
                    {
                        rSet.DisableItem( FN_FRAME_UNCHAIN );
                    }
                    break;
                }

                case SID_FRAME_TO_TOP:
                case SID_FRAME_TO_BOTTOM:
                case FN_FRAME_UP:
                case FN_FRAME_DOWN:
                case FN_FORMAT_FRAME_DLG:
                    if ( bParentCntProt )
                        rSet.DisableItem( nWhich );
                    break;

                default:
                    /* do nothing */;
                    break;
            }
            nWhich = aIter.NextWhich();
        }
    }
}

/*--------------------------------------------------------------------
    Beschreibung:   Ctor fuer FrameShell
 --------------------------------------------------------------------*/


SwFrameShell::SwFrameShell(SwView &rView) :
    SwBaseShell( rView )
{
    SetName(String::CreateFromAscii("Frame"));
    SetHelpId(SW_FRAMESHELL);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



void SwFrameShell::ExecFrameStyle(SfxRequest& rReq)
{
    SwWrtShell &rSh = GetShell();
    BOOL bDefault = FALSE;
    if (!rSh.IsFrmSelected())
        return;

    // Erst Default-BoxItem aus Pool holen. Wenn ungleich normalem Boxitem,
    // dann ist es bereits geaendert worden (neues ist kein Default).
    const SvxBoxItem* pPoolBoxItem = (const SvxBoxItem*)::GetDfltAttr(RES_BOX);

    const SfxItemSet *pArgs = rReq.GetArgs();
    SfxItemSet aFrameSet(rSh.GetAttrPool(), RES_BOX, RES_BOX);

    rSh.GetFlyFrmAttr( aFrameSet );
    const SvxBoxItem& rBoxItem = (const SvxBoxItem&)aFrameSet.Get(RES_BOX);

    if (pPoolBoxItem == &rBoxItem)
        bDefault = TRUE;

    SvxBoxItem aBoxItem(rBoxItem);

    SvxBorderLine aBorderLine;
    const SfxPoolItem *pItem = 0;

    if(pArgs)    //irgendein Controller kann auch mal nichts liefern #48169#
    {
        switch (rReq.GetSlot())
        {
            case SID_ATTR_BORDER:
            {
                if (pArgs->GetItemState(RES_BOX, TRUE, &pItem) == SFX_ITEM_SET)
                {
                    SvxBoxItem aNewBox(*((SvxBoxItem *)pItem));
                    const SvxBorderLine* pBorderLine;

                    if ((pBorderLine = aBoxItem.GetTop()) != NULL)
                        lcl_FrmGetMaxLineWidth(pBorderLine, aBorderLine);
                    if ((pBorderLine = aBoxItem.GetBottom()) != NULL)
                        lcl_FrmGetMaxLineWidth(pBorderLine, aBorderLine);
                    if ((pBorderLine = aBoxItem.GetLeft()) != NULL)
                        lcl_FrmGetMaxLineWidth(pBorderLine, aBorderLine);
                    if ((pBorderLine = aBoxItem.GetRight()) != NULL)
                        lcl_FrmGetMaxLineWidth(pBorderLine, aBorderLine);

                    if(aBorderLine.GetOutWidth() == 0)
                    {
                        aBorderLine.SetInWidth(0);
                        aBorderLine.SetOutWidth(DEF_LINE_WIDTH_0);
                        aBorderLine.SetDistance(0);
                    }
                    //Distance nur setzen, wenn der Request vom Controller kommt

                    if(!StarBASIC::IsRunning())
                    {
                        aNewBox.SetDistance( rBoxItem.GetDistance() );
                    }

                    aBoxItem = aNewBox;
                    SvxBorderLine aDestBorderLine;

                    if ((pBorderLine = aBoxItem.GetTop()) != NULL)
                        aBoxItem.SetLine(&aBorderLine, BOX_LINE_TOP);
                    if ((pBorderLine = aBoxItem.GetBottom()) != NULL)
                        aBoxItem.SetLine(&aBorderLine, BOX_LINE_BOTTOM);
                    if ((pBorderLine = aBoxItem.GetLeft()) != NULL)
                        aBoxItem.SetLine(&aBorderLine, BOX_LINE_LEFT);
                    if ((pBorderLine = aBoxItem.GetRight()) != NULL)
                        aBoxItem.SetLine(&aBorderLine, BOX_LINE_RIGHT);
                }
            }
            break;

            case SID_FRAME_LINESTYLE:
            {
                if (pArgs->GetItemState(SID_FRAME_LINESTYLE, FALSE, &pItem) == SFX_ITEM_SET)
                {
                    const SvxLineItem* pLineItem =
                            (const SvxLineItem*)pItem;

                    if ( pLineItem->GetLine() )
                    {
                        aBorderLine = *(pLineItem->GetLine());

                        if (!aBoxItem.GetTop() && !aBoxItem.GetBottom() &&
                            !aBoxItem.GetLeft() && !aBoxItem.GetRight())
                        {
                            aBoxItem.SetLine(&aBorderLine, BOX_LINE_TOP);
                            aBoxItem.SetLine(&aBorderLine, BOX_LINE_BOTTOM);
                            aBoxItem.SetLine(&aBorderLine, BOX_LINE_LEFT);
                            aBoxItem.SetLine(&aBorderLine, BOX_LINE_RIGHT);
                        }
                        else
                        {
                            if( aBoxItem.GetTop() )
                            {
                                aBorderLine.SetColor( aBoxItem.GetTop()->GetColor() );
                                aBoxItem.SetLine(&aBorderLine, BOX_LINE_TOP);
                            }
                            if( aBoxItem.GetBottom() )
                            {
                                aBorderLine.SetColor( aBoxItem.GetBottom()->GetColor());
                                aBoxItem.SetLine(&aBorderLine, BOX_LINE_BOTTOM);
                            }
                            if( aBoxItem.GetLeft() )
                            {
                                aBorderLine.SetColor( aBoxItem.GetLeft()->GetColor());
                                aBoxItem.SetLine(&aBorderLine, BOX_LINE_LEFT);
                            }
                            if( aBoxItem.GetRight() )
                            {
                                aBorderLine.SetColor(aBoxItem.GetRight()->GetColor());
                                aBoxItem.SetLine(&aBorderLine, BOX_LINE_RIGHT);
                            }
                        }
                    }
                    else
                    {
                        aBoxItem.SetLine(0, BOX_LINE_TOP);
                        aBoxItem.SetLine(0, BOX_LINE_BOTTOM);
                        aBoxItem.SetLine(0, BOX_LINE_LEFT);
                        aBoxItem.SetLine(0, BOX_LINE_RIGHT);
                    }
                }
            }
            break;

            case SID_FRAME_LINECOLOR:
            {
                if (pArgs->GetItemState(SID_FRAME_LINECOLOR, FALSE, &pItem) == SFX_ITEM_SET)
                {
                    const Color& rNewColor = ((const SvxColorItem*)pItem)->GetValue();

                    if (!aBoxItem.GetTop() && !aBoxItem.GetBottom() &&
                        !aBoxItem.GetLeft() && !aBoxItem.GetRight())
                    {
                        aBorderLine.SetColor( rNewColor );
                        aBoxItem.SetLine(&aBorderLine, BOX_LINE_TOP);
                        aBoxItem.SetLine(&aBorderLine, BOX_LINE_BOTTOM);
                        aBoxItem.SetLine(&aBorderLine, BOX_LINE_LEFT);
                        aBoxItem.SetLine(&aBorderLine, BOX_LINE_RIGHT);
                    }
                    else
                    {
                        if ( aBoxItem.GetTop() )
                            ((SvxBorderLine*)aBoxItem.GetTop())->SetColor( rNewColor );
                        if ( aBoxItem.GetBottom() )
                            ((SvxBorderLine*)aBoxItem.GetBottom())->SetColor( rNewColor );
                        if ( aBoxItem.GetLeft() )
                            ((SvxBorderLine*)aBoxItem.GetLeft())->SetColor( rNewColor );
                        if ( aBoxItem.GetRight() )
                            ((SvxBorderLine*)aBoxItem.GetRight())->SetColor( rNewColor );
                    }
                }
            }
            break;
        }
    }
    if (bDefault && (aBoxItem.GetTop() || aBoxItem.GetBottom() ||
        aBoxItem.GetLeft() || aBoxItem.GetRight()))
    {
        aBoxItem.SetDistance(MIN_BORDER_DIST);
    }
    aFrameSet.Put( aBoxItem );
    // Vorlagen-AutoUpdate
    SwFrmFmt* pFmt = rSh.GetCurFrmFmt();
    if(pFmt && pFmt->IsAutoUpdateFmt())
    {
        rSh.AutoUpdateFrame(pFmt, aFrameSet);
    }
    else
        rSh.SetFlyFrmAttr( aFrameSet );

}



void lcl_FrmGetMaxLineWidth(const SvxBorderLine* pBorderLine, SvxBorderLine& rBorderLine)
{
    if(pBorderLine->GetInWidth() > rBorderLine.GetInWidth())
        rBorderLine.SetInWidth(pBorderLine->GetInWidth());

    if(pBorderLine->GetOutWidth() > rBorderLine.GetOutWidth())
        rBorderLine.SetOutWidth(pBorderLine->GetOutWidth());

    if(pBorderLine->GetDistance() > rBorderLine.GetDistance())
        rBorderLine.SetDistance(pBorderLine->GetDistance());

    rBorderLine.SetColor(pBorderLine->GetColor());
}



void SwFrameShell::GetLineStyleState(SfxItemSet &rSet)
{
    SwWrtShell &rSh = GetShell();
    BOOL bParentCntProt = rSh.IsSelObjProtected( (FlyProtectType)(FLYPROTECT_CONTENT|FLYPROTECT_PARENT) ) != 0;

    if (bParentCntProt)
    {
        if (rSh.IsFrmSelected())
            rSet.DisableItem( SID_FRAME_LINECOLOR );

        rSet.DisableItem( SID_ATTR_BORDER );
        rSet.DisableItem( SID_FRAME_LINESTYLE );
    }
    else
    {
        if (rSh.IsFrmSelected())
        {
            SfxItemSet aFrameSet( rSh.GetAttrPool(), RES_BOX, RES_BOX );

            rSh.GetFlyFrmAttr(aFrameSet);

            const SvxBorderLine* pLine = ((const SvxBoxItem&)aFrameSet.Get(RES_BOX)).GetTop();
            rSet.Put(SvxColorItem(pLine ? pLine->GetColor() : Color(), SID_FRAME_LINECOLOR));
        }
        rSet.Put(SfxUInt16Item(SID_ATTR_BORDER, TRUE)); // Rahmencontroller: letzte Zeile einklappen
    }
}



void  SwFrameShell::GetBckColState(SfxItemSet &rSet)
{
    SwBaseShell::GetBckColState( rSet );
}



void  SwFrameShell::ExecBckCol(SfxRequest& rReq)
{
    SwBaseShell::ExecBckCol( rReq );
}



void  SwFrameShell::StateInsert(SfxItemSet &rSet)
{
    const int nSel = GetShell().GetSelectionType();

    if ((nSel & SwWrtShell::SEL_GRF) || (nSel & SwWrtShell::SEL_OLE))
        rSet.DisableItem(FN_INSERT_FRAME);
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.199  2000/09/18 16:06:04  willem.vandorp
    OpenOffice header added.

    Revision 1.198  2000/09/07 15:59:29  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.197  2000/08/17 11:42:59  jp
    remove the SW graphicmanager

    Revision 1.196  2000/05/26 07:21:32  os
    old SW Basic API Slots removed

    Revision 1.195  2000/05/10 11:53:01  os
    Basic API removed

    Revision 1.194  2000/04/20 12:51:52  os
    GetName() returns String&

    Revision 1.193  2000/04/18 14:58:23  os
    UNICODE

    Revision 1.192  2000/03/03 15:17:03  os
    StarView remainders removed

    Revision 1.191  1999/09/24 14:38:32  os
    hlnkitem.hxx now in SVX

    Revision 1.190  1999/07/30 15:39:08  HR
    #65293#: conflict with <goodies/grfmgr.hxx>


      Rev 1.189   30 Jul 1999 17:39:08   HR
   #65293#: conflict with <goodies/grfmgr.hxx>

      Rev 1.188   02 Feb 1999 13:35:28   JP
   Task #58423#: InsertDBCol - optional kann eine Rahmenvorlage mitgegeben werden

      Rev 1.187   29 Jan 1999 17:19:38   JP
   Task #58423#: Reports mit Bildern aus der Datenbank

      Rev 1.186   27 Nov 1998 15:50:18   AMA
   Fix #59951#59825#: Unterscheiden zwischen Rahmen-,Seiten- und Bereichsspalten

      Rev 1.185   08 Sep 1998 17:03:06   OS
   #56134# Metric fuer Text und HTML getrennt

------------------------------------------------------------------------*/



diff --git a/sw/source/ui/shells/grfsh.cxx b/sw/source/ui/shells/grfsh.cxx
new file mode 100644
index 0000000..619273c
--- /dev/null
+++ b/sw/source/ui/shells/grfsh.cxx
@@ -0,0 +1,1010 @@
/*************************************************************************
 *
 *  $RCSfile: grfsh.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:46 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop


#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _UIPARAM_HXX
#include <uiparam.hxx>
#endif

#ifndef _URLOBJ_HXX //autogen
#include <tools/urlobj.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _SFX_WHITER_HXX //autogen
#include <svtools/whiter.hxx>
#endif
#ifndef SVTOOLS_URIHELPER_HXX
#include <svtools/urihelper.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SVX_SIZEITEM_HXX //autogen
#include <svx/sizeitem.hxx>
#endif
#ifndef _SVX_PROTITEM_HXX //autogen
#include <svx/protitem.hxx>
#endif
#ifndef _SFX_SAVEOPT_HXX //autogen
#include <sfx2/saveopt.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SVX_SRCHITEM_HXX
#include <svx/srchitem.hxx>
#endif
#ifndef _SVX_IMPGRF_HXX //autogen
#include <svx/impgrf.hxx>
#endif
#ifndef _SVX_HTMLMODE_HXX //autogen
#include <svx/htmlmode.hxx>
#endif
#ifndef _SDGLUITM_HXX
#include <svx/sdgluitm.hxx>
#endif
#ifndef _SDGCOITM_HXX
#include <svx/sdgcoitm.hxx>
#endif
#ifndef _SDGGAITM_HXX
#include <svx/sdggaitm.hxx>
#endif
#ifndef _SDGTRITM_HXX
#include <svx/sdgtritm.hxx>
#endif
#ifndef _SDGINITM_HXX
#include <svx/sdginitm.hxx>
#endif
#ifndef _SDGMOITM_HXX
#include <svx/sdgmoitm.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif

#ifndef _FMTURL_HXX //autogen
#include <fmturl.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _VIEWOPT_HXX
#include <viewopt.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _FRMATR_HXX
#include <frmatr.hxx>
#endif
#ifndef _SWUNDO_HXX
#include <swundo.hxx>
#endif
#ifndef _UITOOL_HXX
#include <uitool.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _TEXTSH_HXX
#include <textsh.hxx>
#endif
#ifndef _GRFSH_HXX
#include <grfsh.hxx>
#endif
#ifndef _FRMMGR_HXX
#include <frmmgr.hxx>
#endif
#ifndef _FRMDLG_HXX
#include <frmdlg.hxx>
#endif
#ifndef _FRMFMT_HXX
#include <frmfmt.hxx>
#endif
#ifndef _GRFATR_HXX
#include <grfatr.hxx>
#endif
#ifndef _USRPREF_HXX
#include <usrpref.hxx>
#endif
#ifndef _EDTWIN_HXX
#include <edtwin.hxx>
#endif
#ifndef _CAPTION_HXX
#include <caption.hxx>
#endif
#ifndef _SWWAIT_HXX
#include <swwait.hxx>
#endif

#ifndef _SHELLS_HRC
#include <shells.hrc>
#endif
#ifndef _POPUP_HRC
#include <popup.hrc>
#endif

#define SwGrfShell
#include "itemdef.hxx"
#include "swslots.hxx"



SFX_IMPL_INTERFACE(SwGrfShell, SwBaseShell, SW_RES(STR_SHELLNAME_GRAPHIC))
{
    SFX_POPUPMENU_REGISTRATION(SW_RES(MN_GRF_POPUPMENU));
    SFX_OBJECTBAR_REGISTRATION(SFX_OBJECTBAR_OBJECT, SW_RES(RID_GRAFIK_TOOLBOX));
    SFX_OBJECTMENU_REGISTRATION(SID_OBJECTMENU0, SW_RES(MN_OBJECTMENU_GRAFIK));
}


void SwGrfShell::Execute(SfxRequest &rReq)
{
    const SfxItemSet* pArgs = rReq.GetArgs();
    SwWrtShell &rSh = GetShell();

    USHORT nSlot = rReq.GetSlot();
    switch(nSlot)
    {
        case SID_INSERT_GRAPHIC:
        case FN_FORMAT_GRAFIC_DLG:
        {
            SwFlyFrmAttrMgr aMgr( FALSE, &rSh, rSh.IsFrmSelected() ?
                                               FRMMGR_TYPE_NONE : FRMMGR_TYPE_GRF);
            const SwViewOption* pVOpt = rSh.GetViewOptions();
            SwViewOption aUsrPref( *pVOpt );

            SfxItemSet aSet(GetPool(), RES_FRMATR_BEGIN, RES_FRMATR_END-1,
                            RES_GRFATR_MIRRORGRF,   RES_GRFATR_CROPGRF,
                            SID_ATTR_BORDER_INNER,  SID_ATTR_BORDER_INNER,
                            SID_ATTR_GRAF_KEEP_ZOOM, SID_ATTR_GRAF_KEEP_ZOOM,
                            SID_ATTR_GRAF_FRMSIZE, SID_ATTR_GRAF_FRMSIZE,
                            SID_ATTR_GRAF_FRMSIZE_PERCENT, SID_ATTR_GRAF_FRMSIZE_PERCENT,
                            SID_ATTR_GRAF_GRAPHIC, SID_ATTR_GRAF_GRAPHIC,
                            FN_PARAM_GRF_CONNECT,   FN_PARAM_GRF_CONNECT,
                            SID_ATTR_PAGE_SIZE,     SID_ATTR_PAGE_SIZE,
                            FN_GET_PRINT_AREA,      FN_GET_PRINT_AREA,
                            FN_SET_FRM_NAME,        FN_KEEP_ASPECT_RATIO,
                            FN_PARAM_GRF_DIALOG,    FN_PARAM_GRF_DIALOG,
                            SID_DOCFRAME,           SID_DOCFRAME,
                            SID_HTML_MODE,          SID_HTML_MODE,
                            FN_SET_FRM_ALT_NAME,    FN_SET_FRM_ALT_NAME,
                            0);

            USHORT nHtmlMode = ::GetHtmlMode(GetView().GetDocShell());
            aSet.Put(SfxUInt16Item(SID_HTML_MODE, nHtmlMode));
            FieldUnit eMetric = ::GetDfltMetric((0 != (nHtmlMode&HTMLMODE_ON)));
            SW_MOD()->PutItem(SfxUInt16Item(SID_ATTR_METRIC, eMetric));

            const SwRect* pRect = &rSh.GetAnyCurRect(RECT_PAGE);
            SwFmtFrmSize aFrmSize( ATT_VAR_SIZE, pRect->Width(), pRect->Height());
            aFrmSize.SetWhich( GetPool().GetWhich( SID_ATTR_PAGE_SIZE ) );
            aSet.Put( aFrmSize );

            aSet.Put(SfxStringItem(FN_SET_FRM_NAME, rSh.GetFlyName()));
            if(nSlot == FN_FORMAT_GRAFIC_DLG)
                aSet.Put(SfxStringItem(FN_SET_FRM_ALT_NAME, rSh.GetAlternateText()));

            pRect = &rSh.GetAnyCurRect(RECT_PAGE_PRT);
            aFrmSize.SetWidth( pRect->Width() );
            aFrmSize.SetHeight( pRect->Height() );
            aFrmSize.SetWhich( GetPool().GetWhich(FN_GET_PRINT_AREA) );
            aSet.Put( aFrmSize );

            aSet.Put( aMgr.GetAttrSet() );
            aSet.SetParent( aMgr.GetAttrSet().GetParent() );

            // Bei %-Werten Groesse initialisieren
            SwFmtFrmSize& rSize = (SwFmtFrmSize&)aSet.Get(RES_FRM_SIZE);
            if (rSize.GetWidthPercent() && rSize.GetWidthPercent() != 0xff)
                rSize.SetWidth(rSh.GetAnyCurRect(RECT_FLY_EMBEDDED).Width());
            if (rSize.GetHeightPercent() && rSize.GetHeightPercent() != 0xff)
                rSize.SetHeight(rSh.GetAnyCurRect(RECT_FLY_EMBEDDED).Height());

            // and now set the size for "external" tabpages
            {
                SvxSizeItem aSzItm( SID_ATTR_GRAF_FRMSIZE, rSize.GetSize() );
                aSet.Put( aSzItm );

                Size aSz( rSize.GetWidthPercent(), rSize.GetHeightPercent() );
                if( 0xff == aSz.Width() )   aSz.Width() = 0;
                if( 0xff == aSz.Height() )  aSz.Height() = 0;

                aSzItm.SetSize( aSz );
                aSzItm.SetWhich( SID_ATTR_GRAF_FRMSIZE_PERCENT );
                aSet.Put( aSzItm );
            }

            String sGrfNm, sFilterNm;
            rSh.GetGrfNms( &sGrfNm, &sFilterNm );
            if( sGrfNm.Len() )
            {
                aSet.Put( SvxBrushItem( INetURLObject::decode( sGrfNm,
                                        INET_HEX_ESCAPE,
                                           INetURLObject::DECODE_WITH_CHARSET,
                                        RTL_TEXTENCODING_UTF8 ),
                                        sFilterNm, GPOS_LT,
                                        SID_ATTR_GRAF_GRAPHIC ));
            }
            else
            {
                aSet.Put( SvxBrushItem( rSh.GetGraphicObj(), GPOS_LT,
                                        SID_ATTR_GRAF_GRAPHIC ));
            }
            aSet.Put(SfxBoolItem( FN_PARAM_GRF_CONNECT, sGrfNm.Len() ));

            // get Mirror and Crop
            {
                SfxItemSet aTmpSet( rSh.GetAttrPool(),
                                RES_GRFATR_MIRRORGRF, RES_GRFATR_CROPGRF );

                rSh.GetAttr( aTmpSet );
                aSet.Put( aTmpSet );
            }

            aSet.Put(SfxBoolItem(FN_KEEP_ASPECT_RATIO, aUsrPref.IsKeepRatio()));
            aSet.Put(SfxBoolItem( SID_ATTR_GRAF_KEEP_ZOOM, aUsrPref.IsGrfKeepZoom()));

            aSet.Put(SfxFrameItem( SID_DOCFRAME, GetView().GetViewFrame()->GetTopFrame()));

            SwFrmDlg *pDlg = new SwFrmDlg( GetView().GetViewFrame(),
                                           GetView().GetWindow(),
                                           aSet, FALSE, DLG_FRM_GRF );
            if( pDlg->Execute() )
            {
                rSh.StartAllAction();
                rSh.StartUndo(UNDO_START);
                const SfxPoolItem* pItem;
                SfxItemSet* pSet = (SfxItemSet*)pDlg->GetOutputItemSet();

                // change the 2 frmsize SizeItems to the correct SwFrmSizeItem
                if( SFX_ITEM_SET == pSet->GetItemState(
                                SID_ATTR_GRAF_FRMSIZE, FALSE, &pItem ))
                {
                    SwFmtFrmSize aSize;
                    const Size& rSz = ((SvxSizeItem*)pItem)->GetSize();
                    aSize.SetWidth( rSz.Width() );
                    aSize.SetHeight( rSz.Height() );

                    if( SFX_ITEM_SET == pSet->GetItemState(
                            SID_ATTR_GRAF_FRMSIZE_PERCENT, FALSE, &pItem ))
                    {
                        const Size& rSz = ((SvxSizeItem*)pItem)->GetSize();
                        aSize.SetWidthPercent( rSz.Width() );
                        aSize.SetHeightPercent( rSz.Height() );
                    }
                    pSet->Put( aSize );
                }
                else
                    pSet->ClearItem( RES_FRM_SIZE );

                // Vorlagen-AutoUpdate
                SwFrmFmt* pFmt = rSh.GetCurFrmFmt();
                if(pFmt && pFmt->IsAutoUpdateFmt())
                {
                    pFmt->SetAttr(*pSet);
                    SfxItemSet aShellSet(GetPool(), RES_FRM_SIZE,   RES_FRM_SIZE,
                                                    RES_SURROUND,   RES_SURROUND,
                                                    RES_ANCHOR,     RES_ANCHOR,
                                                    RES_VERT_ORIENT,RES_HORI_ORIENT,
                                                    0);
                    aShellSet.Put(*pSet);
                    aMgr.SetAttrSet(aShellSet);
                }
                else
                {
                    aMgr.SetAttrSet(*pSet);
                }
                aMgr.UpdateFlyFrm();

                BOOL bApplyUsrPref = FALSE;
                if (SFX_ITEM_SET == pSet->GetItemState(
                    FN_KEEP_ASPECT_RATIO, TRUE, &pItem ))
                {
                    aUsrPref.SetKeepRatio(
                                    ((const SfxBoolItem*)pItem)->GetValue() );
                    bApplyUsrPref = TRUE;
                }
                if( SFX_ITEM_SET == pSet->GetItemState(
                    SID_ATTR_GRAF_KEEP_ZOOM, TRUE, &pItem ))
                {
                    aUsrPref.SetGrfKeepZoom(
                                    ((const SfxBoolItem*)pItem)->GetValue() );
                    bApplyUsrPref = TRUE;
                }

                if( bApplyUsrPref )
                    SW_MOD()->ApplyUsrPref(aUsrPref, &GetView());

                // and now set all the graphic attributes and other stuff
                if( SFX_ITEM_SET == pSet->GetItemState(
                                        SID_ATTR_GRAF_GRAPHIC, TRUE, &pItem ))
                {
                    if( ((SvxBrushItem*)pItem)->GetGraphicLink() )
                        sGrfNm = *((SvxBrushItem*)pItem)->GetGraphicLink();
                    else
                        sGrfNm.Erase();

                    if( ((SvxBrushItem*)pItem)->GetGraphicFilter() )
                        sFilterNm = *((SvxBrushItem*)pItem)->GetGraphicFilter();
                    else
                        sFilterNm.Erase();

                    if( sGrfNm.Len() )
                    {
                        SwWait aWait( *GetView().GetDocShell(), TRUE );
                        rSh.ReRead( URIHelper::SmartRelToAbs( sGrfNm ),
                                     sFilterNm, 0 );
                    }
                }
                if( SFX_ITEM_SET == pSet->GetItemState(
                                        FN_SET_FRM_ALT_NAME, TRUE, &pItem ))
                    rSh.SetAlternateText(
                                ((const SfxStringItem*)pItem)->GetValue() );

                SfxItemSet aGrfSet( rSh.GetAttrPool(), RES_GRFATR_BEGIN,
                                                       RES_GRFATR_END-1 );
                aGrfSet.Put( *pSet );
                if( aGrfSet.Count() )
                    rSh.SetAttr( aGrfSet );

                rSh.EndUndo(UNDO_END);
                rSh.EndAllAction();
            }
            delete pDlg;
        }
        break;

        case SID_SIM_START:
            if ( SFX_APP()->HasFeature( SFX_FEATURE_SIMAGE ))
            {
                String sGrfNm;
                rSh.GetGrfNms( &sGrfNm, 0  );

                if( sGrfNm.Len() )
                {
                    InfoBox aAsk( GetView().GetWindow(),
                                    SW_RES(MSG_REMOVE_LINK));
                    if( RET_NO == aAsk.Execute())
                        break;
                }

                GetView().GetEditWin().GrfToOle();
                if( rSh.IsOLEObj() )
                {
                    rSh.LaunchOLEObj();
                }
                else
                    rSh.GetView().GetViewFrame()->GetDispatcher()->Execute( FN_FORMAT_GRAFIC_DLG );
            }
            break;
        case FN_GRAPHIC_MIRROR_ON_EVEN_PAGES:
        {
            SfxItemSet aSet(rSh.GetAttrPool(), RES_GRFATR_MIRRORGRF, RES_GRFATR_MIRRORGRF);
            rSh.GetAttr( aSet );
            SwMirrorGrf aGrf((const SwMirrorGrf &)aSet.Get(RES_GRFATR_MIRRORGRF));
            aGrf.SetGrfToggle(!aGrf.IsGrfToggle());
            rSh.SetAttr(aGrf);
        }
        break;


        default:
            ASSERT(!this, falscher Dispatcher);
            return;
    }

}


void SwGrfShell::ExecAttr( SfxRequest &rReq )
{
    USHORT nGrfType;
    if( CNT_GRF == GetShell().GetCntType() &&
        ( GRAPHIC_BITMAP == ( nGrfType = GetShell().GetGraphicType()) ||
          GRAPHIC_GDIMETAFILE == nGrfType ))
    {
        SfxItemSet aGrfSet( GetShell().GetAttrPool(), RES_GRFATR_BEGIN,
                                                      RES_GRFATR_END -1 );
        const SfxItemSet *pArgs = rReq.GetArgs();
        const SfxPoolItem* pItem;
        USHORT nSlot = rReq.GetSlot();
        if( !pArgs || SFX_ITEM_SET != pArgs->GetItemState( nSlot, FALSE, &pItem ))
            pItem = 0;

        switch( nSlot )
        {
        case FN_FLIP_VERT_GRAFIC:
        case FN_FLIP_HORZ_GRAFIC:
            {
                GetShell().GetAttr( aGrfSet );
                SwMirrorGrf aMirror( (SwMirrorGrf&)aGrfSet.Get(
                                                    RES_GRFATR_MIRRORGRF ) );
                USHORT nMirror = aMirror.GetValue();
                if( FN_FLIP_VERT_GRAFIC == nSlot )
                    switch( nMirror )
                    {
                    case RES_DONT_MIRROR_GRF:   nMirror = RES_MIRROR_GRF_VERT;
                                                break;
                    case RES_MIRROR_GRF_HOR:    nMirror = RES_MIRROR_GRF_BOTH;
                                                break;
                    case RES_MIRROR_GRF_VERT:   nMirror = RES_DONT_MIRROR_GRF;
                                                break;
                    case RES_MIRROR_GRF_BOTH:   nMirror = RES_MIRROR_GRF_HOR;
                                                break;
                    }
                else
                    switch( nMirror )
                    {
                    case RES_DONT_MIRROR_GRF:   nMirror = RES_MIRROR_GRF_HOR;
                                                break;
                    case RES_MIRROR_GRF_VERT:   nMirror = RES_MIRROR_GRF_BOTH;
                                                break;
                    case RES_MIRROR_GRF_HOR:    nMirror = RES_DONT_MIRROR_GRF;
                                                break;
                    case RES_MIRROR_GRF_BOTH:   nMirror = RES_MIRROR_GRF_VERT;
                                                break;
                    }
                aMirror.SetValue( nMirror );
                aGrfSet.ClearItem();
                aGrfSet.Put( aMirror );
            }
            break;

        case SID_ATTR_GRAF_LUMINANCE:
            if( pItem )
                aGrfSet.Put( SwLuminanceGrf(
                            ((SfxInt16Item*)pItem)->GetValue() ));
            break;
        case SID_ATTR_GRAF_CONTRAST:
            if( pItem )
                aGrfSet.Put( SwContrastGrf(
                            ((SfxInt16Item*)pItem)->GetValue() ));
            break;
        case SID_ATTR_GRAF_RED:
            if( pItem )
                aGrfSet.Put( SwChannelRGrf(
                            ((SfxInt16Item*)pItem)->GetValue() ));
            break;
        case SID_ATTR_GRAF_GREEN:
            if( pItem )
                aGrfSet.Put( SwChannelGGrf(
                            ((SfxInt16Item*)pItem)->GetValue() ));
            break;
        case SID_ATTR_GRAF_BLUE:
            if( pItem )
                aGrfSet.Put( SwChannelBGrf(
                            ((SfxInt16Item*)pItem)->GetValue() ));
            break;
        case SID_ATTR_GRAF_GAMMA:
            if( pItem )
                aGrfSet.Put( SwGammaGrf(
                            ((SfxUInt32Item*)pItem)->GetValue() / 100 ));
            break;
        case SID_ATTR_GRAF_TRANSPARENCE:
            if( pItem )
                aGrfSet.Put( SwTransparencyGrf(
                            ((SfxUInt16Item*)pItem)->GetValue() ));
            break;
        case SID_ATTR_GRAF_INVERT:
            if( pItem )
                aGrfSet.Put( SwInvertGrf(
                            ((SfxBoolItem*)pItem)->GetValue() ));
            break;

        case SID_ATTR_GRAF_MODE:
            if( pItem )
                aGrfSet.Put( SwDrawModeGrf(
                            ((SfxUInt16Item*)pItem)->GetValue() ));
            break;

        default:
            ASSERT(!this, falscher Dispatcher);
        }
        if( aGrfSet.Count() )
            GetShell().SetAttr( aGrfSet );
    }
    GetView().GetViewFrame()->GetBindings().Invalidate(rReq.GetSlot());
}


void SwGrfShell::GetState(SfxItemSet &rSet)
{
    //  case SID_SIM_START:
    if ( GetShell().IsSelObjProtected(FLYPROTECT_CONTENT) ||
         !SFX_APP()->HasFeature( SFX_FEATURE_SIMAGE ) )
    {
        rSet.DisableItem(SID_SIM_START);
    }
    else
    {
        SwDocShell &rSh = *GetView().GetDocShell();
        if ( rSh.GetProtocol().IsInPlaceActive() ||
             rSh.GetCreateMode() == SFX_CREATE_MODE_EMBEDDED )
            rSet.DisableItem(SID_SIM_START);
    }
}


void SwGrfShell::GetAttrState(SfxItemSet &rSet)
{
    SwWrtShell &rSh = GetShell();
    SfxItemSet aCoreSet( GetPool(), aNoTxtNodeSetRange );
    rSh.GetAttr( aCoreSet );
    BOOL bParentCntProt = 0 != rSh.IsSelObjProtected(
                    (FlyProtectType)(FLYPROTECT_CONTENT|FLYPROTECT_PARENT) );

    SfxWhichIter aIter( rSet );
    USHORT nWhich = aIter.FirstWhich();
    while( nWhich )
    {
        BOOL bDisable = bParentCntProt;
        switch( nWhich )
        {
        case FN_FORMAT_GRAFIC_DLG:
            break;

        case FN_FLIP_VERT_GRAFIC:
            if( !bParentCntProt )
            {
                UINT16 nState = ((const SwMirrorGrf &) aCoreSet.Get(
                                        RES_GRFATR_MIRRORGRF )).GetValue();

                rSet.Put(SfxBoolItem( nWhich, nState == RES_MIRROR_GRF_VERT ||
                                              nState == RES_MIRROR_GRF_BOTH));
            }
            break;

        case FN_FLIP_HORZ_GRAFIC:
            if( !bParentCntProt )
            {
                UINT16 nState = ((const SwMirrorGrf &) aCoreSet.Get(
                                        RES_GRFATR_MIRRORGRF )).GetValue();

                rSet.Put(SfxBoolItem( nWhich, nState == RES_MIRROR_GRF_HOR ||
                                              nState == RES_MIRROR_GRF_BOTH));
            }
            break;


        case SID_ATTR_GRAF_LUMINANCE:
            if( !bParentCntProt )
                rSet.Put( SfxInt16Item( nWhich, ((SwLuminanceGrf&)
                        aCoreSet.Get(RES_GRFATR_LUMINANCE)).GetValue() ));
            break;
        case SID_ATTR_GRAF_CONTRAST:
            if( !bParentCntProt )
                rSet.Put( SfxInt16Item( nWhich, ((SwContrastGrf&)
                        aCoreSet.Get(RES_GRFATR_CONTRAST)).GetValue() ));
            break;
        case SID_ATTR_GRAF_RED:
            if( !bParentCntProt )
                rSet.Put( SfxInt16Item( nWhich, ((SwChannelRGrf&)
                        aCoreSet.Get(RES_GRFATR_CHANNELR)).GetValue() ));
            break;
        case SID_ATTR_GRAF_GREEN:
            if( !bParentCntProt )
                rSet.Put( SfxInt16Item( nWhich, ((SwChannelGGrf&)
                        aCoreSet.Get(RES_GRFATR_CHANNELG)).GetValue() ));
            break;
        case SID_ATTR_GRAF_BLUE:
            if( !bParentCntProt )
                rSet.Put( SfxInt16Item( nWhich, ((SwChannelBGrf&)
                        aCoreSet.Get(RES_GRFATR_CHANNELB)).GetValue() ));
            break;

        case SID_ATTR_GRAF_GAMMA:
            if( !bParentCntProt )
                rSet.Put( SfxUInt32Item( nWhich, ((SwGammaGrf&)
                        aCoreSet.Get(RES_GRFATR_GAMMA)).GetValue() * 100 ));
            break;
        case SID_ATTR_GRAF_TRANSPARENCE:
            if( !bParentCntProt )
            {
                const GraphicObject& rGrfObj = rSh.GetGraphicObj();
                if( rGrfObj.IsAnimated() ||
                    GRAPHIC_GDIMETAFILE == rGrfObj.GetType() )
                    bDisable = TRUE;
                else
                    rSet.Put( SfxUInt16Item( nWhich, ((SwTransparencyGrf&)
                        aCoreSet.Get(RES_GRFATR_TRANSPARENCY)).GetValue() ));
            }
            break;
        case SID_ATTR_GRAF_INVERT:
            if( !bParentCntProt )
                rSet.Put( SfxBoolItem( nWhich, ((SwInvertGrf&)
                        aCoreSet.Get(RES_GRFATR_INVERT)).GetValue() ));
            break;

        case SID_ATTR_GRAF_MODE:
            if( !bParentCntProt )
                rSet.Put( SfxUInt16Item( nWhich, (GraphicDrawMode)((SwDrawModeGrf&)
                        aCoreSet.Get(RES_GRFATR_DRAWMODE)).GetValue() ));
            break;

        default:
            bDisable = FALSE;
        }

        if( bDisable )
            rSet.DisableItem( nWhich );
        nWhich = aIter.NextWhich();
    }
}


SwGrfShell::SwGrfShell(SwView &rView) :
    SwBaseShell(rView)

{
    SetName(String::CreateFromAscii("Graphic"));
    SetHelpId(SW_GRFSHELL);
}


BOOL SwTextShell::InsertGraphicDlg()
{
#ifndef ENABLE_PROP_WITHOUTLINK
#define ENABLE_PROP_WITHOUTLINK 0x08
#endif

    BOOL bReturn = FALSE;
    SwView &rVw = GetView();
    USHORT nHtmlMode = ::GetHtmlMode(rVw.GetDocShell());
    // im HTML-Mode nur verknuepft einfuegen
    USHORT nEnable = ENABLE_ALL;
    if(nHtmlMode & HTMLMODE_ON)
    {
        nEnable &= ~ENABLE_LINK;
        nEnable |= ENABLE_PROP_WITHOUTLINK;
    }
    SvxImportGraphicDialog *pDlg =
        new SvxImportGraphicDialog( rVw.GetWindow(),
                            SW_RESSTR(STR_INSERT_GRAPHIC ), nEnable );

    pDlg->SetPropertyHdl(LINK(this, SwTextShell, InitGraphicFrame));

    ASSERT( !pInsGrfSetPtr, "who has not delete the GraphicSet pointer?" );
    pInsGrfSetPtr = 0;

    if( pDlg->Execute() == RET_OK )
    {
        GetShell().StartAction();
        GetShell().StartUndo(UNDO_INSERT);
        Graphic* pPreViewGrf = pDlg->GetGraphic();

        BOOL bAsLink =  nHtmlMode & HTMLMODE_ON ? TRUE : pDlg->AsLink();
        USHORT nError = InsertGraphic( pDlg->GetPath(), pDlg->GetCurFilter(),
                                bAsLink, &pDlg->GetFilter(), pPreViewGrf );

        // Format ist ungleich Current Filter, jetzt mit auto. detection
        if( nError == GRFILTER_FORMATERROR )
            nError = InsertGraphic( pDlg->GetPath(), aEmptyStr, bAsLink,
                                    &pDlg->GetFilter(), pPreViewGrf );

        RESOURCE_TYPE nResId = 0;
        switch( nError )
        {
            case GRFILTER_OPENERROR:
                nResId = STR_GRFILTER_OPENERROR;
                break;
            case GRFILTER_IOERROR:
                nResId = STR_GRFILTER_IOERROR;
                break;
            case GRFILTER_FORMATERROR:
                nResId = STR_GRFILTER_FORMATERROR;
                break;
            case GRFILTER_VERSIONERROR:
                nResId = STR_GRFILTER_VERSIONERROR;
                break;
            case GRFILTER_FILTERERROR:
                nResId = STR_GRFILTER_FILTERERROR;
                break;
            case GRFILTER_TOOBIG:
                nResId = STR_GRFILTER_TOOBIG;
                break;
        }

        if( nResId )
        {
            GetShell().EndAction();
            InfoBox aInfoBox( rVw.GetWindow(), SW_RESSTR( nResId ));
            aInfoBox.Execute();
        }
        else
        {
            // set the specific graphic attrbutes to the graphic
            if( pInsGrfSetPtr )
            {
                // set the normal graphic attributes
                SwWrtShell& rSh = GetShell();
                rSh.SetAttr( *pInsGrfSetPtr );
                const SfxPoolItem* pItem;
                if( SFX_ITEM_SET == pInsGrfSetPtr->GetItemState(
                                        FN_SET_FRM_ALT_NAME, TRUE, &pItem ))
                    rSh.SetAlternateText(
                                ((const SfxStringItem*)pItem)->GetValue() );
            }
            GetShell().EndAction();
            bReturn = TRUE;
            rVw.AutoCaption( GRAPHIC_CAP );
        }
        rVw.GetWrtShell().EndUndo(UNDO_INSERT); // wegen moegl. Shellwechsel
    }

    delete pInsGrfSetPtr, pInsGrfSetPtr = 0;

    DELETEZ( pFrmMgr );
    delete pDlg;

    return bReturn;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


IMPL_LINK( SwTextShell, InitGraphicFrame, Button *, pButton )
{
//OS: pButton ist eigentlich der Pointer auf den GrafikEinfuegen-Dialog
    SwWrtShell &rSh = GetShell();
    SwViewOption    aUsrPref( *rSh.GetViewOptions() );
    SvxImportGraphicDialog* pGrfDlg = (SvxImportGraphicDialog*) pButton;
    if (!pFrmMgr)
        pFrmMgr = new SwFlyFrmAttrMgr( TRUE, &rSh, FRMMGR_TYPE_GRF );

    static USHORT __READONLY_DATA aGrfAttrRange[] =
    {
        RES_FRMATR_BEGIN,       RES_FRMATR_END-1,
        SID_ATTR_BORDER_INNER,  SID_ATTR_BORDER_INNER,

        SID_ATTR_GRAF_KEEP_ZOOM, SID_ATTR_GRAF_KEEP_ZOOM,
        SID_ATTR_GRAF_FRMSIZE, SID_ATTR_GRAF_FRMSIZE,
        SID_ATTR_GRAF_FRMSIZE_PERCENT, SID_ATTR_GRAF_FRMSIZE_PERCENT,
        SID_ATTR_GRAF_GRAPHIC, SID_ATTR_GRAF_GRAPHIC,

        FN_PARAM_GRF_CONNECT,   FN_PARAM_GRF_CONNECT,
        FN_PARAM_FILTER,        FN_PARAM_FILTER,
        RES_GRFATR_MIRRORGRF,   RES_GRFATR_CROPGRF,
        SID_ATTR_PAGE_SIZE,     SID_ATTR_PAGE_SIZE,
        FN_GET_PRINT_AREA,      FN_GET_PRINT_AREA,
        FN_SET_FRM_NAME,        FN_SET_FRM_NAME,
        FN_KEEP_ASPECT_RATIO,   FN_KEEP_ASPECT_RATIO,
        FN_PARAM_GRF_REALSIZE,  FN_PARAM_GRF_DIALOG,
        SID_DOCFRAME,           SID_DOCFRAME,
        SID_HTML_MODE,          SID_HTML_MODE,
        FN_SET_FRM_ALT_NAME,    FN_SET_FRM_ALT_NAME,
        0
    };

    SfxItemSet aSet(GetPool(), aGrfAttrRange );

    const SwRect &rPg = GetShell().GetAnyCurRect(RECT_PAGE);
    SwFmtFrmSize aFrmSize(ATT_VAR_SIZE, rPg.Width(), rPg.Height());
    aFrmSize.SetWhich(GetPool().GetWhich(SID_ATTR_PAGE_SIZE));
    aSet.Put(aFrmSize);

    const SwRect &rPr = GetShell().GetAnyCurRect(RECT_PAGE_PRT);
    SwFmtFrmSize aPrtSize(ATT_VAR_SIZE, rPr.Width(), rPr.Height());
    aPrtSize.SetWhich(GetPool().GetWhich(FN_GET_PRINT_AREA));
    aSet.Put(aPrtSize);

    aSet.Put( pFrmMgr->GetAttrSet() );
    aSet.SetParent( pFrmMgr->GetAttrSet().GetParent() );

    aSet.Put(SfxFrameItem( SID_DOCFRAME, GetView().GetViewFrame()->GetTopFrame()));

    // niemals connected, sonst darf man den Grafikdialog doppelt aufrufen!
    aSet.Put(SfxBoolItem(FN_PARAM_GRF_CONNECT, FALSE));
    aSet.Put(SfxBoolItem(FN_KEEP_ASPECT_RATIO, aUsrPref.IsKeepRatio()));

    aSet.Put(SfxUInt16Item(SID_HTML_MODE, ::GetHtmlMode(GetView().GetDocShell())));

    const Graphic* pGrf = pGrfDlg->GetGraphic();
    if(pGrf)
    {
        Size aSize = ::GetGraphicSizeTwip(*pGrf, &GetView().GetEditWin());
        aSize.Width() += pFrmMgr->CalcWidthSpace();
        aSize.Height()+= pFrmMgr->CalcHeightSpace();
        aSet.Put(SwFmtFrmSize(ATT_VAR_SIZE, aSize.Width(), aSize.Height()));
        aSet.Put(SvxSizeItem( FN_PARAM_GRF_REALSIZE, aSize ));
        aSet.Put( SvxSizeItem( SID_ATTR_GRAF_FRMSIZE, aSize ));

        String sGrfNm( pGrfDlg->GetPath() );
        if( sGrfNm.Len() )
        {
            aSet.Put( SvxBrushItem( INetURLObject::decode( sGrfNm,
                                    INET_HEX_ESCAPE,
                                       INetURLObject::DECODE_WITH_CHARSET,
                                    RTL_TEXTENCODING_UTF8 ),
                                    aEmptyStr, GPOS_LT,
                                    SID_ATTR_GRAF_GRAPHIC ));
        }
        else
        {
            aSet.Put( SvxBrushItem( *pGrf, GPOS_LT, SID_ATTR_GRAF_GRAPHIC ));
        }
    }


    SwFrmDlg *pDlg = new SwFrmDlg( GetView().GetViewFrame(), pButton,
                                    aSet, pGrf == 0, DLG_FRM_GRF );
    if( pDlg->Execute() )
    {
        SfxItemSet* pSet = (SfxItemSet*)pDlg->GetOutputItemSet();

        // change the 2 frmsize SizeItems to the correct SwFrmSizeItem
        const SfxPoolItem* pItem;
        if( SFX_ITEM_SET == pSet->GetItemState(
                        SID_ATTR_GRAF_FRMSIZE, FALSE, &pItem ))
        {
            SwFmtFrmSize aSize;
            const Size& rSz = ((SvxSizeItem*)pItem)->GetSize();
            aSize.SetWidth( rSz.Width() );
            aSize.SetHeight( rSz.Height() );

            if( SFX_ITEM_SET == pSet->GetItemState(
                    SID_ATTR_GRAF_FRMSIZE_PERCENT, FALSE, &pItem ))
            {
                const Size& rSz = ((SvxSizeItem*)pItem)->GetSize();
                aSize.SetWidthPercent( rSz.Width() );
                aSize.SetHeightPercent( rSz.Height() );
            }
            pSet->Put( aSize );
        }
        else
            pSet->ClearItem( RES_FRM_SIZE );

        pFrmMgr->SetAttrSet( *pSet );

        if( SFX_ITEM_SET == pSet->GetItemState(FN_KEEP_ASPECT_RATIO, TRUE, &pItem))
        {
            aUsrPref.SetKeepRatio( ((const SfxBoolItem*)pItem)->GetValue() );
            SW_MOD()->ApplyUsrPref(aUsrPref, &GetView());
        }

        if( pInsGrfSetPtr )
            pInsGrfSetPtr->ClearItem();
        else
            pInsGrfSetPtr = new SfxItemSet( rSh.GetAttrPool(),
                                    RES_GRFATR_MIRRORGRF, RES_GRFATR_CROPGRF,
                                    FN_SET_FRM_ALT_NAME, FN_SET_FRM_ALT_NAME,
                                    0 );

        pInsGrfSetPtr->Put( *pSet );
        if( !pInsGrfSetPtr->Count() )
            delete pInsGrfSetPtr, pInsGrfSetPtr = 0;
    }

    delete pDlg;

    return 0;
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.134  2000/09/18 16:06:04  willem.vandorp
    OpenOffice header added.

    Revision 1.133  2000/09/07 15:59:29  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.132  2000/08/25 14:08:54  jp
    Graphic Crop-Attribut and TabPage exported to SVX

    Revision 1.131  2000/08/17 11:43:17  jp
    remove the SW graphicmanager and UI with decoded URLs

    Revision 1.130  2000/08/17 06:34:11  jp
    Bug #77713#: GetAttrState - Transparency not for animated graphics and metafiles

    Revision 1.129  2000/08/08 13:44:14  os
    #77423# separate graphic shell

    Revision 1.128  2000/08/02 08:04:26  jp
    changes for graphic attributes

    Revision 1.127  2000/07/31 19:25:36  jp
    new attributes for CJK/CTL and graphic

    Revision 1.126  2000/05/26 07:21:32  os
    old SW Basic API Slots removed

    Revision 1.125  2000/05/10 11:53:02  os
    Basic API removed

    Revision 1.124  2000/04/18 14:58:24  os
    UNICODE

    Revision 1.123  2000/02/11 14:57:17  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.122  1999/11/22 14:55:36  os
    operator precedence

    Revision 1.121  1999/03/18 13:40:50  OS
    #61169# #61489# Masseinheiten fuer Text u. HTML am Module setzen, nicht an der App

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/shells/listsh.cxx b/sw/source/ui/shells/listsh.cxx
new file mode 100644
index 0000000..a979042
--- /dev/null
+++ b/sw/source/ui/shells/listsh.cxx
@@ -0,0 +1,362 @@
/*************************************************************************
 *
 *  $RCSfile: listsh.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:47 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "cmdid.h"
#include "uiparam.hxx"
#include "hintids.hxx"

#ifndef _SVX_SIZEITEM_HXX //autogen
#include <svx/sizeitem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SFXOBJFACE_HXX //autogen
#include <sfx2/objface.hxx>
#endif
#ifndef _SFX_BINDINGS_HXX //autogen
#include <sfx2/bindings.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _URLOBJ_HXX //autogen
#include <tools/urlobj.hxx>
#endif
#ifndef _SFX_WHITER_HXX //autogen
#include <svtools/whiter.hxx>
#endif
#ifndef _SFXINTITEM_HXX //autogen
#include <svtools/intitem.hxx>
#endif
#ifndef _SHL_HXX //autogen
#include <tools/shl.hxx>
#endif
#ifndef _SVX_SRCHITEM_HXX //autogen
#include <svx/srchitem.hxx>
#endif
#ifndef _SFXVIEWFRM_HXX
#include <sfx2/viewfrm.hxx>
#endif


#ifndef _FMTORNT_HXX //autogen
#include <fmtornt.hxx>
#endif
#include "wrtsh.hxx"
#include "swmodule.hxx"
#include "frmatr.hxx"
#include "helpid.h"
#include "globals.hrc"
#include "shells.hrc"
#include "uinums.hxx"
#include "listsh.hxx"
#include "poolfmt.hxx"
#include "view.hxx"
#include "edtwin.hxx"

#define SwListShell
#include "itemdef.hxx"
#include "swslots.hxx"


SFX_IMPL_INTERFACE(SwListShell, SwBaseShell, SW_RES(STR_SHELLNAME_LIST))
{
    SFX_OBJECTBAR_REGISTRATION(SFX_OBJECTBAR_OBJECT, SW_RES(RID_NUM_TOOLBOX));
    SFX_OBJECTMENU_REGISTRATION(SID_OBJECTMENU0, SW_RES(MN_OBJECTMENU_LIST));
}


TYPEINIT1(SwListShell,SwBaseShell)


void SwListShell::Execute(SfxRequest &rReq)
{
    const SfxItemSet* pArgs = rReq.GetArgs();
    USHORT nSlot = rReq.GetSlot();
    SwWrtShell& rSh = GetShell();
    switch (nSlot)
    {
        case FN_NUM_BULLET_DOWN:
            rSh.NumUpDown();
            GetView().GetViewFrame()->GetBindings().Invalidate( SID_TABLE_CELL );   // StatusZeile updaten!
            break;

        case FN_NUM_BULLET_NEXT:
            rSh.GotoNextNum();
            break;

        case FN_NUM_BULLET_NONUM:
            rSh.NoNum();
            break;

        case FN_NUM_BULLET_OFF:
            rSh.DelNumRules();
            break;

        case FN_NUM_BULLET_OUTLINE_DOWN:
            rSh.MoveNumParas(FALSE, FALSE);
            break;

        case FN_NUM_BULLET_OUTLINE_MOVEDOWN:
            rSh.MoveNumParas(TRUE, FALSE);
            break;

        case FN_NUM_BULLET_OUTLINE_MOVEUP:
            rSh.MoveNumParas(TRUE, TRUE);
            break;

        case FN_NUM_BULLET_OUTLINE_UP:
            rSh.MoveNumParas(FALSE, TRUE);
            break;

        case FN_NUM_BULLET_PREV:
            rSh.GotoPrevNum();
            break;

        case FN_NUM_BULLET_UP:
            rSh.NumUpDown(FALSE);
            GetView().GetViewFrame()->GetBindings().Invalidate( SID_TABLE_CELL );   // StatusZeile updaten!
            break;


        case FN_NUM_OR_NONUM:
        {
            BOOL bApi = rReq.IsAPI();
            BOOL bDelete = !rSh.IsNoNum(!bApi);
            if(pArgs )
                bDelete = ((SfxBoolItem &)pArgs->Get(rReq.GetSlot())).GetValue();
            rSh.NumOrNoNum( bDelete, !bApi );
        }
        break;
        case FN_NUMBER_NEWSTART:
            rSh.SetNumRuleStart(!rSh.IsNumRuleStart());
        break;

        default:
            ASSERT(!this, falscher Dispatcher);
            return;
    }
}


void SwListShell::GetState(SfxItemSet &rSet)
{
    SfxWhichIter aIter( rSet );
    USHORT nWhich = aIter.FirstWhich();
    while ( nWhich )
    {
        switch( nWhich )
        {
            case FN_NUM_OR_NONUM:
                rSet.Put(SfxBoolItem(nWhich, GetShell().IsNoNum(FALSE)));
            break;
            case FN_NUMBER_NEWSTART:
                rSet.Put(SfxBoolItem(nWhich, GetShell().IsNumRuleStart()));
            break;
        }
        nWhich = aIter.NextWhich();
    }
}


SwListShell::SwListShell(SwView &rView) :
    SwBaseShell(rView)
{
    SetName(String::CreateFromAscii("List"));
    SetHelpId(SW_LISTSHELL);
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.68  2000/09/18 16:06:04  willem.vandorp
    OpenOffice header added.

    Revision 1.67  2000/09/07 15:59:30  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.66  2000/05/26 07:21:32  os
    old SW Basic API Slots removed

    Revision 1.65  2000/05/10 11:53:02  os
    Basic API removed

    Revision 1.64  2000/04/18 14:58:24  os
    UNICODE

    Revision 1.63  1999/03/12 14:13:38  OS
    #63141# BulletURL setzen-> Groesse ermitteln


      Rev 1.62   12 Mar 1999 15:13:38   OS
   #63141# BulletURL setzen-> Groesse ermitteln

      Rev 1.61   17 Nov 1998 10:58:32   OS
   #58263# NumType durch SvxExtNumType ersetzt

      Rev 1.60   06 Nov 1998 14:41:48   OS
   #57903# NumOff kann weg

      Rev 1.59   08 Dec 1997 11:50:04   OS
   benannte Numerierungen entfernt

      Rev 1.58   03 Dec 1997 17:07:08   OS
   FN_NUMBER_NEWSTART eingebaut

      Rev 1.57   24 Nov 1997 11:01:02   JP
   Execute: bei NumUp/-Down die Statusleiste invalidieren

      Rev 1.56   24 Nov 1997 09:47:04   MA
   includes

      Rev 1.55   17 Nov 1997 10:21:14   JP
   Umstellung Numerierung

      Rev 1.54   03 Nov 1997 13:55:48   MA
   precomp entfernt

      Rev 1.53   19 Aug 1997 10:54:50   OS
   Exchange wird per API mit String beliefert #42898#

      Rev 1.52   15 Aug 1997 11:48:38   OS
   chartar/frmatr/txtatr aufgeteilt

      Rev 1.51   11 Aug 1997 09:12:28   OS
   paraitem/frmitems/textitem aufgeteilt

      Rev 1.50   05 Aug 1997 16:29:14   TJ
   include svx/srchitem.hxx

      Rev 1.49   08 Jul 1997 14:11:46   OS
   ConfigItems von der App ans Module

      Rev 1.48   11 Mar 1997 16:27:00   AMA
   New: Absaetze verschieben durch Strg + CursorUp/Down (auch ausserhalb von Num.)

      Rev 1.47   20 Feb 1997 19:40:08   OS
   includes

      Rev 1.46   20 Feb 1997 17:18:26   OS
   kleiner Bug

      Rev 1.45   20 Feb 1997 11:58:54   OS
   NumLevel ans Basic rausgeben

      Rev 1.44   19 Feb 1997 16:57:22   OS
   Basic fuer die NumRules

      Rev 1.43   11 Dec 1996 10:50:56   MA
   Warnings

      Rev 1.42   11 Nov 1996 13:37:34   MA
   ResMgr

      Rev 1.41   28 Aug 1996 15:55:18   OS
   includes

      Rev 1.40   13 Aug 1996 12:38:40   OS
   neue Shellnamen im IDL-Interface

      Rev 1.39   22 Jul 1996 20:54:26   JP
   Anpassung an die neuen SwUiNumRules

      Rev 1.38   25 Jun 1996 19:50:52   HJS
   includes

      Rev 1.37   17 Apr 1996 09:32:52   OM
   Unbenutzte Fkt Disable entfernt

      Rev 1.36   28 Mar 1996 14:20:50   OS
   neu: NumberOrNoNumber

      Rev 1.35   03 Dec 1995 11:22:08   OS
   +include itemdef.hxx

      Rev 1.34   29 Nov 1995 13:48:42   OS
   -slotadd.hxx

      Rev 1.33   27 Nov 1995 19:39:40   OM
   swslots->303a

      Rev 1.32   24 Nov 1995 16:59:32   OM
   PCH->PRECOMPILED

      Rev 1.31   17 Nov 1995 13:02:00   MA
   Segmentierung

------------------------------------------------------------------------*/

diff --git a/sw/source/ui/shells/makefile.mk b/sw/source/ui/shells/makefile.mk
new file mode 100644
index 0000000..a07d291
--- /dev/null
+++ b/sw/source/ui/shells/makefile.mk
@@ -0,0 +1,120 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:47 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=..$/..$/..

PRJNAME=sw
TARGET=shells

AUTOSEG=true

PROJECTPCH=ui_pch
PDBTARGET=ui_pch
PROJECTPCHSOURCE=..\ui_1st\ui_pch

# --- Settings -----------------------------------------------------

.INCLUDE :  $(PRJ)$/inc$/swpre.mk
.INCLUDE :  settings.mk
.INCLUDE :  $(PRJ)$/inc$/sw.mk

# --- Files --------------------------------------------------------

SRCFILES =  \
        shells.src \
        pseudo.src

SLOFILES =  \
        $(SLO)$/basesh.obj \
        $(SLO)$/beziersh.obj \
        $(SLO)$/drawdlg.obj \
        $(SLO)$/drawsh.obj \
        $(SLO)$/drformsh.obj \
        $(SLO)$/drwbassh.obj \
        $(SLO)$/drwtxtex.obj \
        $(SLO)$/drwtxtsh.obj \
        $(SLO)$/frmsh.obj \
        $(SLO)$/grfsh.obj \
        $(SLO)$/listsh.obj \
        $(SLO)$/olesh.obj \
        $(SLO)$/slotadd.obj \
        $(SLO)$/tabsh.obj \
        $(SLO)$/textdrw.obj \
        $(SLO)$/textfld.obj \
        $(SLO)$/textglos.obj \
        $(SLO)$/textidx.obj \
        $(SLO)$/textsh.obj \
        $(SLO)$/textsh1.obj \
        $(SLO)$/textsh2.obj \
        $(SLO)$/txtattr.obj \
        $(SLO)$/txtcrsr.obj \
        $(SLO)$/txtnum.obj

EXCEPTIONSFILES =  \
        $(SLO)$/textsh2.obj \

# --- Tagets -------------------------------------------------------

.INCLUDE :  target.mk

$(SRS)$/shells.srs: $(SOLARINCDIR)$/svx$/globlmn.hrc

diff --git a/sw/source/ui/shells/olesh.cxx b/sw/source/ui/shells/olesh.cxx
new file mode 100644
index 0000000..664fee5
--- /dev/null
+++ b/sw/source/ui/shells/olesh.cxx
@@ -0,0 +1,224 @@
/*************************************************************************
 *
 *  $RCSfile: olesh.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:47 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _IPOBJ_HXX //autogen
#include <so3/ipobj.hxx>
#endif
#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SFXOBJFACE_HXX //autogen
#include <sfx2/objface.hxx>
#endif
#ifndef _SFX_OBJITEM_HXX //autogen
#include <sfx2/objitem.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _HELPID_H
#include <helpid.h>
#endif
#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif
#ifndef _FRMSH_HXX
#include <frmsh.hxx>
#endif
#ifndef _OLESH_HXX
#include <olesh.hxx>
#endif

#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _POPUP_HRC
#include <popup.hrc>
#endif
#ifndef _SHELLS_HRC
#include <shells.hrc>
#endif


#define SwOleShell
#ifndef _ITEMDEF_HXX
#include <itemdef.hxx>
#endif
#ifndef _SWSLOTS_HXX
#include <swslots.hxx>
#endif


SFX_IMPL_INTERFACE(SwOleShell, SwFrameShell, SW_RES(STR_SHELLNAME_OBJECT))
{
    SFX_POPUPMENU_REGISTRATION(SW_RES(MN_OLE_POPUPMENU));
    SFX_OBJECTBAR_REGISTRATION(SFX_OBJECTBAR_OBJECT, SW_RES(RID_OLE_TOOLBOX));
    SFX_OBJECTMENU_REGISTRATION(SID_OBJECTMENU0, SW_RES(MN_OBJECTMENU_OLE));
}


SwOleShell::SwOleShell(SwView &rView) :
    SwFrameShell(rView)

{
    SetName(String::CreateFromAscii("Object"));
    SetHelpId(SW_OLESHELL);
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.35  2000/09/18 16:06:04  willem.vandorp
    OpenOffice header added.

    Revision 1.34  2000/05/26 07:21:32  os
    old SW Basic API Slots removed

    Revision 1.33  2000/05/16 09:15:14  os
    project usr removed

    Revision 1.32  2000/05/10 11:53:02  os
    Basic API removed

    Revision 1.31  2000/05/09 14:41:35  os
    BASIC interface partially removed

    Revision 1.30  2000/04/18 14:58:24  os
    UNICODE

    Revision 1.29  2000/02/11 14:57:36  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.28  1998/11/03 10:53:02  JP
    Task #57916#: Vorbereitungen fuer den Selektionshandler vom Chart


      Rev 1.27   03 Nov 1998 11:53:02   JP
   Task #57916#: Vorbereitungen fuer den Selektionshandler vom Chart

      Rev 1.26   24 Nov 1997 09:46:52   MA
   includes

      Rev 1.25   03 Nov 1997 13:55:48   MA
   precomp entfernt

      Rev 1.24   26 Aug 1997 16:31:10   TRI
   VCL Anpassungen

      Rev 1.23   08 Aug 1997 17:29:08   OM
   Headerfile-Umstellung

      Rev 1.22   05 Aug 1997 16:29:12   TJ
   include svx/srchitem.hxx

      Rev 1.21   01 Aug 1997 11:45:44   MH
   chg: header

      Rev 1.20   11 Nov 1996 13:37:34   MA
   ResMgr

      Rev 1.19   28 Aug 1996 15:55:14   OS
   includes

      Rev 1.18   13 Aug 1996 12:38:40   OS
   neue Shellnamen im IDL-Interface

      Rev 1.17   25 Jun 1996 19:51:50   HJS
   includes

      Rev 1.16   20 Mar 1996 12:41:14   HJS
   funcdefs muessen unique sein!

      Rev 1.15   06 Feb 1996 15:16:22   OS
   neu: Activate/Deactivate fuer Objekte

      Rev 1.14   26 Jan 1996 10:54:12   OS
   neu: GetState - Ole-Objekt dem Basic herausreichen

      Rev 1.13   03 Dec 1995 11:22:08   OS
   +include itemdef.hxx

      Rev 1.12   29 Nov 1995 13:47:54   OS
   -slotadd.hxx

      Rev 1.11   27 Nov 1995 19:40:06   OM
   swslots->303a

      Rev 1.10   24 Nov 1995 16:59:36   OM
   PCH->PRECOMPILED

      Rev 1.9   17 Nov 1995 13:03:40   MA
   Segmentierung

------------------------------------------------------------------------*/

diff --git a/sw/source/ui/shells/shells.src b/sw/source/ui/shells/shells.src
new file mode 100644
index 0000000..cd95397
--- /dev/null
+++ b/sw/source/ui/shells/shells.src
@@ -0,0 +1,2392 @@
/*************************************************************************
 *
 *  $RCSfile: shells.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:47 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include <svx/svxids.hrc>
#include <svx/globlmn.hrc>
#include "toolbox.hrc"
#include "helpid.h"
InfoBox MSG_REMOVE_LINK
{
    Buttons = WB_YES_NO ;
    Defbutton = WB_DEF_YES ;
    Message = "Diese Grafik ist mit dem Dokument verknüpft. Möchten Sie die Verknüpfung aufheben, um die Grafik zu bearbeiten?" ;
    Message [ English ] = "This is a linked graphic. Do you want to unlink the graphic in order to edit the graphic?" ;
    Message [ norwegian ] = "Dette er +++linked grafikk. Ønsker du å +++unlink the graphic for å redigere?" ;
    Message [ italian ] = "Questra immagine è collegata con il documento. Desiderate scollegare l'immagine per poterla modificare?" ;
    Message [ portuguese_brazilian ] = "This is a linked graphic. Do you want to unlink the graphic in order to edit the graphic?" ;
    Message [ portuguese ] = "Esta imagem está  ligada a um documento. Deseja cancelar a ligação para poder editá-la?" ;
    Message [ english_us ] = "This graphic is linked to a document. Do you want to unlink the graphic in order to edit it?" ;
    Message [ finnish ] = "This is a linked graphic. Do you want to unlink the graphic in order to edit the graphic?" ;
    Message [ danish ] = "Denne grafik er kædet til dokumentet. Vil du ophæve kæden for at kunne redigere grafikken." ;
    Message [ french ] = "Cette image est liée à un document. Désirez-vous supprimer le lien pour l'édition ?" ;
    Message [ swedish ] = "Den här grafiken är länkad till dokumentet. Vill Du upphäva länken för att kunna redigera grafiken?" ;
    Message [ dutch ] = "Deze afbeelding is met het document gekoppeld. Wilt u de koppeling opheffen om de afbeelding te bewerken?" ;
    Message [ spanish ] = "Esta imagen está vinculada al documento. ¿Desea deshacer el vínculo para editar la imagen?" ;
    Message[ chinese_simplified ] = "Õâ¸öͼÐÎÊǺÍÒ»¸öÎĵµÏàÁ´½ÓµÄ¡£ÄúҪȡÏûÕâ¸öÁ´½Ó£¬±à¼­Õâ¸öͼÐÎÂð£¿";
    Message[ russian ] = "Ýòîò ðèñóíîê ññûëàåòñÿ íà äîêóìåíò. Âû õîòèòå ñíÿòü ññûëêó äëÿ âîçìîæíîñòè ïðàâêè ðèñóíêà?";
    Message[ polish ] = "Ta grafika jest po³¹czona z dokumentem. Czy chcesz usun¹æ to po³¹czenie, aby móc edytowaæ grafikê?";
    Message[ japanese ] = "‚±‚̐}‚ͤÄÞ·­ÒÝÄ‚ÆØÝ¸‚³‚ê‚Ä‚¢‚Ü‚·B}‚ð•ҏW‚·‚邽‚ß‚ÉØÝ¸‚ð‰ðœ‚µ‚Ü‚·‚©H";
    Message[ chinese_traditional ] = "³o­Ó¹Ï¤ù¬O©M¤@­ÓÀɮ׬۳sµ²ªº¡C±z­n¨ú®ø³o­Ó±¶®|¡A½s¿è³o­Ó¹Ï¤ù¡H";
    Message[ arabic ] = "åÐå ÇáÑÓãÉ ãÑÊÈØÉ ÈÇáãÓÊäÏ. åá ÊÑíÏ ÅÒÇáÉ ÇáÇÑÊÈÇØ áßí ÊÊãßä ãä ÊÍÑíÑ ÇáÑÓãÉ¿";
    Message[ dutch ] = "Deze afbeelding is met het document gekoppeld. Wilt u de koppeling opheffen om de afbeelding te bewerken?";
    Message[ chinese_simplified ] = "Õâ¸öͼÐÎÊǺÍÒ»¸öÎĵµÏàÁ´½ÓµÄ¡£ÄúҪȡÏûÕâ¸öÁ´½Ó£¬±à¼­Õâ¸öͼÐÎÂð£¿";
    Message[ greek ] = "Ôï ãñáöéêü áõôü åßíáé óõíäåäåìÝíï ìå ôï Ýããñáöï. ÈÝëåôå íá êáôáñãçèåß ç óýíäåóç ãéá íá åðåîåñãÜóåôå ôï ãñáöéêü;";
    Message[ korean ] = "ÀÌ ±×·¡ÇÈÀº ¹®¼­¿Í ¿¬°áµÇ¾î ÀÖ½À´Ï´Ù. ±×·¡ÇÈ ÆíÁýÀ» À§ÇØ ¿¬°áÀ» ÇØÁ¦ÇϽðڽÀ´Ï±î?";
    Message[ turkish ] = "Bu grafik belgeye baðlý. Grafigi düzenlemek için bu baðlantýyý kaldýrmak istiyor musunuz?";
    Message[ language_user1 ] = " ";
};
InfoBox MSG_NO_RULER
{
    BUTTONS = WB_OK ;
    DEFBUTTON = WB_DEF_OK ;
    MESSAGE = "Es sind keine Grafiken im Gallery-Thema 'Rulers' vorhanden." ;
    MESSAGE [ English ] = "Thera are no bitmaps in the Gallery theme 'Rulers'." ;
    Message [ portuguese ] = "Não existem imagens no tema 'Rulers' da Gallery." ;
    Message [ english_us ] = "There are no bitmaps in the Gallery theme 'Rulers'." ;
    Message [ portuguese_brazilian ] = "Es sind keine Grafiken im Gallery-Thema 'Rulers' vorhanden." ;
    Message [ swedish ] = "Det finns inga grafiker i Gallery-temat 'Rulers'." ;
    Message [ danish ] = "Der findes ingen billeder i Gallery-emnet 'Rulers'." ;
    Message [ italian ] = "Nella gallery con argomento 'Ruler' non ci sono immagini." ;
    Message [ spanish ] = "No hay imágenes en el tema de Gallery 'Rulers'." ;
    Message [ french ] = "Il n'existe pas d'image pour le thème 'Rulers' dans la Gallery." ;
    Message [ dutch ] = "Onder het gallery-onderwerp 'Rulers' komen geen afbeeldingen voor." ;
    Message[ chinese_simplified ] = "ÔÚ»­ÀÈÖ÷Ìâ'³¤ÌõÐÎ'ÄÚÎÞÈκÎͼÐΡ£";
    Message[ russian ] = "Â òåìå ãàëåðåè 'Ëèíåéêè' ðèñóíêîâ íå èìååòñÿ.";
    Message[ polish ] = "Nie ma ¿adnych grafik w temacie galerii \"Obramowania\"";
    Message[ japanese ] = "·Þ¬×ذðÏ'Ù°×°'‚ɸÞ×̨¯¸½‚Í‚ ‚è‚Ü‚¹‚ñB";
    Message[ chinese_traditional ] = "µe´Y¥DÃD'ªø±ø§Î'¤ºµL¥ô¦ó¹Ï¤ù¡C";
    Message[ arabic ] = "áÇ ÊæÌÏ ÃíÉ ÕæÑ Ýí ãæÖæÚ ÇáÌÇáíÑí 'Rulers'.";
    Message[ dutch ] = "Onder het gallery-onderwerp 'Rulers' komen geen afbeeldingen voor.";
    Message[ chinese_simplified ] = "ÔÚ»­ÀÈÖ÷Ìâ'³¤ÌõÐÎ'ÄÚÎÞÈκÎͼÐΡ£";
    Message[ greek ] = "Äåí õðÜñ÷ïõí ãñáöéêÜ óôç óõëëïãÞ ìå èÝìá 'Rulers'.";
    Message[ korean ] = "Gallery ÁÖÁ¦ 'Rulers'¿¡ ±×·¡ÇÈÀÌ ¾ø½À´Ï´Ù.";
    Message[ turkish ] = "'Rulers' galeri konusunda bit eþlem grafik mevcut deðil.";
    Message[ language_user1 ] = " ";
};
String STR_GRFILTER_OPENERROR
{
    Text = "Grafikdatei kann nicht geöffnet werden" ;
    Text [ English ] = "Can't open graphic file" ;
    Text [ norwegian ] = "Can't open graphic file" ;
    Text [ italian ] = "Impossibile aprire il file grafico" ;
    Text [ portuguese_brazilian ] = "NÆo consigo abrir arquivo gr fico" ;
    Text [ portuguese ] = "Impossível abrir ficheiro gráfico." ;
    Text [ finnish ] = "Grafiikkatiedostoa ei voi avata" ;
    Text [ danish ] = "Det er ikke muligt at åbne grafikfilen" ;
    Text [ french ] = "Ouverture du fichier graphique impossible" ;
    Text [ swedish ] = "Grafikfil kan inte öppnas" ;
    Text [ dutch ] = "Grafisch bestand kan niet worden geopend" ;
    Text [ spanish ] = "No es posible abrir el archivo gráfico" ;
    Text [ english_us ] = "Graphics file cannot be opened" ;
    Text[ chinese_simplified ] = "ÎÞ·¨´ò¿ªÍ¼ÐÎÎļþ";
    Text[ russian ] = "Îòêðûòü ãðàôè÷åñêèé ôàéë íåâîçìîæíî";
    Text[ polish ] = "Pliku graficznego nie mo¿na by³o otworzyæ";
    Text[ japanese ] = "¸Þ×̨¯¸Ì§²Ù‚ðŠJ‚­‚±‚Æ‚ª‚Å‚«‚Ü‚¹‚ñB";
    Text[ chinese_traditional ] = "µLªk¶}±Ò¹Ï¤ùÀÉ®×";
    Text[ arabic ] = "áÇ íãßä ÝÊÍ ãáÝ ÇáÑÓæãÇÊ";
    Text[ dutch ] = "Grafisch bestand kan niet worden geopend";
    Text[ chinese_simplified ] = "ÎÞ·¨´ò¿ªÍ¼ÐÎÎļþ";
    Text[ greek ] = "Äåí åßíáé äõíáôü ôï Üíïéãìá ôïõ áñ÷åßïõ ãñáöéêþí";
    Text[ korean ] = "±×·¡ÇÈ ÆÄÀÏÀÌ ¿­·ÁÁöÁö ¾Ê½À´Ï´Ù.";
    Text[ turkish ] = "Grafik dosyasý açýlamýyor";
    Text[ language_user1 ] = " ";
};
String STR_GRFILTER_IOERROR
{
    Text = "Grafikdatei kann nicht gelesen werden" ;
    Text [ English ] = "Can't read graphic file" ;
    Text [ norwegian ] = "Can't read graphic file" ;
    Text [ italian ] = "Impossibile leggere il file grafico" ;
    Text [ portuguese_brazilian ] = "NÆo consigo ler arquivo gr fico" ;
    Text [ portuguese ] = "Impossível ler o ficheiro gráfico." ;
    Text [ finnish ] = "Grafiikkatiedostoa ei voi lukea" ;
    Text [ danish ] = "Det er ikke muligt at læse grafikfilen" ;
    Text [ french ] = "Lecture du fichier graphique impossible" ;
    Text [ swedish ] = "Grafikfil kan inte läsas" ;
    Text [ dutch ] = "Grafisch bestand is onleesbaar" ;
    Text [ spanish ] = "No es posible leer el archivo gráfico" ;
    Text [ english_us ] = "Graphics file cannot be read" ;
    Text[ chinese_simplified ] = "ÎÞ·¨¶ÁȡͼÐÎÎļþ";
    Text[ russian ] = "Ïðî÷èòàòü ãðàôè÷åñêèé ôàéë íåâîçìîæíî";
    Text[ polish ] = "Pliku graficznego nie mo¿na by³o odczytaæ";
    Text[ japanese ] = "¸Þ×̨¯¸Ì§²Ù‚ª“ǂ߂܂¹‚ñB";
    Text[ chinese_traditional ] = "µLªkŪ¨ú¹Ï¤ùÀÉ®×";
    Text[ arabic ] = "áÇ íãßä ÞÑÇÁÉ ãáÝ ÇáÑÓæãÇÊ";
    Text[ dutch ] = "Grafisch bestand is onleesbaar";
    Text[ chinese_simplified ] = "ÎÞ·¨¶ÁȡͼÐÎÎļþ";
    Text[ greek ] = "Äåí åßíáé äõíáôÞ ç áíÜãíùóç ôïõ áñ÷åßïõ ãñáöéêþí";
    Text[ korean ] = "±×·¡ÇÈ ÆÄÀÏÀÌ ÀÐÇôÁöÁö ¾Ê½À´Ï´Ù.";
    Text[ turkish ] = "Grafik dosyasý okunamýyor";
    Text[ language_user1 ] = " ";
};
String STR_GRFILTER_FORMATERROR
{
    Text = "Unbekanntes Grafikformat" ;
    Text [ English ] = "Unknown graphic format" ;
    Text [ norwegian ] = "Unknown graphic format" ;
    Text [ italian ] = "Formato grafico sconosciuto" ;
    Text [ portuguese_brazilian ] = "Formato gr fico desconhecido" ;
    Text [ portuguese ] = "Formato de gráfico desconhecido." ;
    Text [ finnish ] = "Tuntematon grafiikkamuoto" ;
    Text [ danish ] = "Ukendt grafikformat" ;
    Text [ french ] = "Format d'image inconnu" ;
    Text [ swedish ] = "Okänt grafikformat" ;
    Text [ dutch ] = "Onbekend grafisch formaat" ;
    Text [ spanish ] = "Formato de imagen desconocido" ;
    Text [ english_us ] = "Unknown graphic format" ;
    Text[ chinese_simplified ] = "²»Ã÷µÄͼÐθñʽ";
    Text[ russian ] = "Íåèçâåñòíûé ãðàôè÷åñêèé ôîðìàò";
    Text[ polish ] = "Nieznany format graficzny";
    Text[ japanese ] = "•s–¾‚ȸÞ×̨¯¸‘Ž®";
    Text[ chinese_traditional ] = "¤£©úªº¹Ï¤ù®æ¦¡";
    Text[ arabic ] = "ÊäÓíÞ ÑÓæãÇÊ ÛíÑ ãÚÑæÝ";
    Text[ dutch ] = "Onbekend grafisch formaat";
    Text[ chinese_simplified ] = "²»Ã÷µÄͼÐθñʽ";
    Text[ greek ] = "¢ãíùóôç ìïñöÞ ãñáöéêþí";
    Text[ korean ] = "¾Ë·ÁÁöÁö ¾ÊÀº ±×·¡ÇÈ ¼­½Ä";
    Text[ turkish ] = "Bilinmeyen grafik formatý";
    Text[ language_user1 ] = " ";
};
String STR_GRFILTER_VERSIONERROR
{
    Text = "Die Version der Grafikdatei wird nicht unterstützt" ;
    Text [ English ] = "Version of graphic file not supported" ;
    Text [ norwegian ] = "Version of graphic file not supported" ;
    Text [ italian ] = "Versione del file grafico non supportata" ;
    Text [ portuguese_brazilian ] = "VersÆo de arquivo gr fico nÆo suportada" ;
    Text [ portuguese ] = "Versão do ficheiro gráfico não suportada." ;
    Text [ finnish ] = "Ei tukea grafiikkatiedoston versiolle" ;
    Text [ danish ] = "Grafikfilens version bliver ikke understøttet" ;
    Text [ french ] = "Version du fichier graphique non supportée" ;
    Text [ swedish ] = "Grafikfilens version stöds inte" ;
    Text [ dutch ] = "Deze versie van het grafisch bestand wordt niet ondersteund" ;
    Text [ spanish ] = "No se acepta la versión del archivo gráfico" ;
    Text [ english_us ] = "This graphic file version is not supported" ;
    Text[ chinese_simplified ] = "²»Ö§³ÖÕâ¸ö°æ±¾µÄͼÐÎÎļþ";
    Text[ russian ] = "Âåðñèÿ ãðàôè÷åñêîãî ôàéëà íå ïîääåðæèâàåòñÿ";
    Text[ polish ] = "Wersja pliku graficznego nie bêdzie obs³ugiwana";
    Text[ japanese ] = "¸Þ×̨¯¸Ì§²Ù‚ÌÊÞ°¼Þ®Ý‚́A»Î߰Ă³‚ê‚Ä‚¢‚Ü‚¹‚ñB";
    Text[ chinese_traditional ] = "¤£¤ä´©³o­Óª©¥»ªº¹Ï¤ù¤å¥ó";
    Text[ arabic ] = "áÇ íÊã ÏÚã ÅÕÏÇÑ ãáÝ ÇáÑÓæãÇÊ";
    Text[ dutch ] = "Deze versie van het grafisch bestand wordt niet ondersteund";
    Text[ chinese_simplified ] = "²»Ö§³ÖÕâ¸ö°æ±¾µÄͼÐÎÎļþ";
    Text[ greek ] = "Äåí õðïóôçñßæåôáé ç Ýêäïóç áõôïý ôïõ áñ÷åßïõ ãñáöéêþí";
    Text[ korean ] = "ÀÌ ±×·¡ÇÈ ÆÄÀÏÀÇ ¹öÁ¯Àº Áö¿øµÇÁö ¾Ê½À´Ï´Ù.";
    Text[ turkish ] = "Grafik dosyasýnýnýn versiyonu desteklenmiyor";
    Text[ language_user1 ] = " ";
};
String STR_GRFILTER_FILTERERROR
{
    Text = "Grafikfilter nicht gefunden" ;
    Text [ English ] = "Graphic filter not found" ;
    Text [ norwegian ] = "Graphic filter not found" ;
    Text [ italian ] = "Filtro grafico non trovato" ;
    Text [ portuguese_brazilian ] = "Filtro gr fico nÆo encontrado" ;
    Text [ portuguese ] = "Filtro de gráficos não encontrado." ;
    Text [ finnish ] = "Grafiikkasuodinta ei löydy" ;
    Text [ danish ] = "Grafikfilter blev ikke fundet" ;
    Text [ french ] = "Filtre graphique introuvable" ;
    Text [ swedish ] = "Grafikfilter hittades inte" ;
    Text [ dutch ] = "Grafische filter niet gevonden" ;
    Text [ spanish ] = "No se encontró el filtro de imagen" ;
    Text [ english_us ] = "Graphics filter not found" ;
    Text[ chinese_simplified ] = "ûÓÐÕÒµ½Í¼ÐιýÂËÆ÷";
    Text[ russian ] = "Ãðàôè÷åñêèé ôèëüåð íå íàéäåí";
    Text[ polish ] = "Nie znaleziono filtrów graficznych";
    Text[ japanese ] = "¸Þ×̨¯¸Ì¨ÙÀ‚ªŒ©‚‚©‚è‚Ü‚¹‚ñB";
    Text[ chinese_traditional ] = "¨S¦³§ä¨ì¹Ï¤ù¹LÂo¾¹";
    Text[ arabic ] = "ÊÚÐÑ ÇáÚ辄 Úáì ÝáÊÑ ÇáÑÓæãÇÊ";
    Text[ dutch ] = "Grafische filter niet gevonden";
    Text[ chinese_simplified ] = "ûÓÐÕÒµ½Í¼ÐιýÂËÆ÷";
    Text[ greek ] = "Äåí âñÝèçêå ôï ößëôñï ãñáöéêþí";
    Text[ korean ] = "±×·¡ÇÈ ÇÊÅͰ¡ ¹ß°ßµÇÁö ¾Ê½À´Ï´Ù.";
    Text[ turkish ] = "Grafik filtresi bulunamadý";
    Text[ language_user1 ] = " ";
};
String STR_GRFILTER_TOOBIG
{
    Text = "Nicht genug Speicher zum Einfügen der Grafik" ;
    Text [ English ] = "Not enough memory to insert graphic" ;
    Text [ norwegian ] = "Not enough memory to insert graphic" ;
    Text [ italian ] = "Memoria insufficiente per inserirei l'immagine" ;
    Text [ portuguese_brazilian ] = "Mem¢ria insuficiente para inserir o gr fico" ;
    Text [ portuguese ] = "Memória insuficiente para inserir gráfico." ;
    Text [ finnish ] = "Muisti ei riitä grafiikan lisäämiseen" ;
    Text [ danish ] = "Ikke nok hukommelse til at indsætte billedet" ;
    Text [ french ] = "Mémoire insuffisante pour l'insertion de l'image" ;
    Text [ swedish ] = "Inte tillräckligt med minne för att infoga grafiken" ;
    Text [ dutch ] = "Niet genoeg geheugen voor het invoegen van de afbeelding" ;
    Text [ spanish ] = "No hay suficiente memoria para insertar la imagen" ;
    Text [ english_us ] = "Not enough memory to insert the picture." ;
    Text[ chinese_simplified ] = "ÄÚ´æ²»¹»£¬ÎÞ·¨²åÈëͼÐÎ";
    Text[ russian ] = "Íåäîñòàòî÷íî ïàìÿòè äëÿ âñòàâêè ðèñóíêà";
    Text[ polish ] = "Za ma³o pamiêci do wstawienia grafiki";
    Text[ japanese ] = "}‚ð‘}“ü‚·‚é‚Ì‚ÉÒÓØ‚ª[•ª‚Å‚ ‚è‚Ü‚¹‚ñB";
    Text[ chinese_traditional ] = "°O¾ÐÅ餣¨¬¡AµLªk´¡¤J¹Ï¤ù";
    Text[ arabic ] = "áÇ íæÌÏ ÐÇßÑÉ ßÇÝíÉ áÅÏÑÇÌ ÇáÑÓã";
    Text[ dutch ] = "Niet genoeg geheugen voor het invoegen van de afbeelding";
    Text[ chinese_simplified ] = "ÄÚ´æ²»¹»£¬ÎÞ·¨²åÈëͼÐÎ";
    Text[ greek ] = "Ç ìíÞìç äåí åðáñêåß ãéá ôçí ðñïóèÞêç ôïõ ãñáöéêïý.";
    Text[ korean ] = "±×¸²À» »ðÀÔÇϴµ¥ ¸Þ¸ð¸®°¡ ºÎÁ· ÇÕ´Ï´Ù.";
    Text[ turkish ] = "Grafiðin eklenmesi için yeterli bellek yok";
    Text[ language_user1 ] = " ";
};
String STR_INSERT_GRAPHIC
{
    Text = "Grafik einfügen" ;
    Text [ English ] = "Insert graphic" ;
    Text [ norwegian ] = "Insert graphic" ;
    Text [ italian ] = "Inserisci immagine" ;
    Text [ portuguese_brazilian ] = "Inserir gr fico" ;
    Text [ portuguese ] = "Inserir imagem" ;
    Text [ finnish ] = "Lisää kuva" ;
    Text [ danish ] = "Indsæt billede" ;
    Text [ french ] = "Insérer une image" ;
    Text [ swedish ] = "Infoga grafik" ;
    Text [ dutch ] = "Afbeelding invoegen" ;
    Text [ spanish ] = "Insertar imagen" ;
    Text [ english_us ] = "Insert Graphics" ;
    Text[ chinese_simplified ] = "²åÈëͼÐÎ";
    Text[ russian ] = "Âñòàâèòü ðèñóíîê";
    Text[ polish ] = "Wstaw grafikê";
    Text[ japanese ] = "¸Þ×̨¯¸‚Ì‘}“ü";
    Text[ chinese_traditional ] = "´¡¤J¹Ï¤ù";
    Text[ arabic ] = "ÅÏÑÇÌ ÕæÑÉ";
    Text[ dutch ] = "Afbeelding invoegen";
    Text[ chinese_simplified ] = "²åÈëͼÐÎ";
    Text[ greek ] = "ÐñïóèÞêç ãñáöéêïý";
    Text[ korean ] = "±×·¡ÇÈ »ðÀÔ";
    Text[ turkish ] = "Grafik ekle";
    Text[ language_user1 ] = " ";
};
String STR_NO_ADDRESSBOOK
{
    Text = "Kein Adressbuch vorhanden" ;
    Text [ English ] = "No directory available" ;
    Text [ dutch ] = "Geen adresboek voorhanden" ;
    Text [ english_us ] = "An Address Book does not exist" ;
    Text [ italian ] = "Manca la rubrica" ;
    Text [ spanish ] = "No hay ninguna libreta de direcciones disponible" ;
    Text [ french ] = "Aucun carnet d'adresses disponible" ;
    Text [ swedish ] = "Ingen adressbok tillgänglig" ;
    Text [ danish ] = "Der finde intet adressekartotek" ;
    Text [ portuguese_brazilian ] = "Kein Adressbuch vorhanden" ;
    Text [ portuguese ] = "Não há livro de endereços disponível." ;
    Text[ chinese_simplified ] = "ͨѶ²¾²»´æÔÚ";
    Text[ russian ] = "Àäðåñíîé êíèãè íå èìååòñÿ";
    Text[ polish ] = "Brak ksi¹¿ki adresowej";
    Text[ japanese ] = "±ÄÞÚ½’ ‚ª‚ ‚è‚Ü‚¹‚ñ";
    Text[ chinese_traditional ] = "³q°T¿ý¤£¦s¦b";
    Text[ arabic ] = "áÇ íæÌÏ ÏÝÊÑ ÚäÇæíä";
    Text[ dutch ] = "Geen adresboek voorhanden";
    Text[ chinese_simplified ] = "ͨѶ²¾²»´æÔÚ";
    Text[ greek ] = "Äåí õðÜñ÷åé áôæÝíôá";
    Text[ korean ] = "»ç¿ë °¡´ÉÇÑ ÁÖ¼Ò·ÏÀÌ ¾ø½À´Ï´Ù.";
    Text[ turkish ] = "Adres defteri mevcut deðil";
    Text[ language_user1 ] = " ";
};
String STR_NOTIZ_INSERT
{
    TEXT = "Notiz einfügen" ;
    TEXT [ English ] = "Insert Note" ;
    TEXT [ norwegian ] = "Sett inn Merknad" ;
    TEXT [ italian ] = "Inserisci nota" ;
    TEXT [ portuguese_brazilian ] = "Inserir Observação" ;
    TEXT [ portuguese ] = "Inserir anotação" ;
    TEXT [ finnish ] = "Lisää huomautus" ;
    TEXT [ danish ] = "Indsæt note" ;
    TEXT [ french ] = "Insérer une note" ;
    TEXT [ swedish ] = "Infoga anteckning" ;
    TEXT [ dutch ] = "Aantekening invoegen" ;
    TEXT [ spanish ] = "Insertar nota" ;
    TEXT [ english_us ] = "Insert Note" ;
    TEXT[ chinese_simplified ] = "²åÈ뱸ע";
    TEXT[ russian ] = "Âñòàâèòü ïðèìå÷àíèå";
    TEXT[ polish ] = "Wstaw notatkê";
    TEXT[ japanese ] = "Òӂð‘}“ü";
    TEXT[ chinese_traditional ] = "´¡¤J³Æª`";
    TEXT[ arabic ] = "ÅÏÑÇÌ ãáÇÍÙÉ";
    TEXT[ dutch ] = "Aantekening invoegen";
    TEXT[ chinese_simplified ] = "²åÈ뱸ע";
    TEXT[ greek ] = "ÐñïóèÞêç óçìåßùóçò";
    TEXT[ korean ] = "¸Þ¸ð »ðÀÔ";
    TEXT[ turkish ] = "Not ekle";
    TEXT[ language_user1 ] = " ";
};
String STR_REDLINE_COMMENT
{
    TEXT = "Kommentieren: " ;
    TEXT [ English ] = "Comment: " ;
    Text [ english_us ] = "Comment: " ;
    Text [ portuguese_brazilian ] = "Kommentieren: " ;
    Text [ swedish ] = "Kommentera:  " ;
    Text [ danish ] = "Kommenter: " ;
    Text [ italian ] = "Commento: " ;
    Text [ spanish ] = "Comentario:  " ;
    Text [ french ] = "Commentaire : " ;
    Text [ dutch ] = "Commentaar:  " ;
    Text [ portuguese ] = "Comentário: " ;
    Text[ chinese_simplified ] = "ÆÀÓ ";
    Text[ russian ] = "Êîììåíòèðîâàòü:  ";
    Text[ polish ] = "Skomentuj:   ";
    Text[ japanese ] = "ºÒÝÄ: ";
    Text[ chinese_traditional ] = "µû»y¡G ";
    Text[ arabic ] = "ÊÚáíÞ: ";
    Text[ dutch ] = "Commentaar:  ";
    Text[ chinese_simplified ] = "ÆÀÓ ";
    Text[ greek ] = "Ó÷üëéï: ";
    Text[ korean ] = "¸Þ¸ð: ";
    Text[ turkish ] = "Açýklalama ekle: ";
    Text[ language_user1 ] = " ";
};
String STR_REDLINE_INSERTED
{
    TEXT = "Einfügung" ;
    TEXT [ English ] = "Inserted" ;
    Text [ english_us ] = "Insertions" ;
    Text [ portuguese_brazilian ] = "Einfügung" ;
    Text [ swedish ] = "Infogning" ;
    Text [ danish ] = "Indsat" ;
    Text [ italian ] = "Inserimento" ;
    Text [ spanish ] = "Inserción" ;
    Text [ french ] = "Insertion" ;
    Text [ dutch ] = "Invoeging" ;
    Text [ portuguese ] = "Inserido" ;
    Text[ chinese_simplified ] = "²åÈë";
    Text[ russian ] = "Âñòàâêà";
    Text[ polish ] = "Wstawienie";
    Text[ japanese ] = "‘}“ü";
    Text[ chinese_traditional ] = "´¡¤J";
    Text[ arabic ] = "ÅÏÑÇÌ";
    Text[ dutch ] = "Invoeging";
    Text[ chinese_simplified ] = "²åÈë";
    Text[ greek ] = "ÐñïóèÞêç";
    Text[ korean ] = "»ðÀÔ";
    Text[ turkish ] = "Ekle";
    Text[ language_user1 ] = " ";
};
String STR_REDLINE_DELETED
{
    TEXT = "Löschung" ;
    TEXT [ English ] = "Deleted" ;
    Text [ english_us ] = "Deletions" ;
    Text [ portuguese_brazilian ] = "Löschung" ;
    Text [ swedish ] = "Radering" ;
    Text [ danish ] = "Slettet" ;
    Text [ italian ] = "Elimina" ;
    Text [ spanish ] = "Eliminación" ;
    Text [ french ] = "Suppression" ;
    Text [ dutch ] = "Gewist" ;
    Text [ portuguese ] = "Eliminado" ;
    Text[ chinese_simplified ] = "ɾ³ý";
    Text[ russian ] = "Óäàëåíèå";
    Text[ polish ] = "Usuniêcie";
    Text[ japanese ] = "íœ";
    Text[ chinese_traditional ] = "§R°£";
    Text[ arabic ] = "ÍÐÝ";
    Text[ dutch ] = "Gewist";
    Text[ chinese_simplified ] = "ɾ³ý";
    Text[ greek ] = "ÄéáãñáöÞ";
    Text[ korean ] = "»èÁ¦";
    Text[ turkish ] = "Silindi";
    Text[ language_user1 ] = " ";
};
String STR_REDLINE_AUTOFMT
{
    TEXT = "AutoFormat" ;
    TEXT [ English ] = "AutoFormat" ;
    TEXT[ italian ] = "Formattazione automatica";
    TEXT[ portuguese_brazilian ] = "AutoFormat";
    TEXT[ portuguese ] = "AutoFormato";
    TEXT[ danish ] = "AutoFormat";
    TEXT[ french ] = "AutoFormat";
    TEXT[ swedish ] = "AutoFormat";
    TEXT[ dutch ] = "AutoOpmaak";
    TEXT[ spanish ] = "AutoFormato";
    TEXT[ english_us ] = "AutoFormat";
    TEXT[ chinese_simplified ] = "×Ô¶¯¸ñʽ";
    TEXT[ russian ] = "Àâòîôîðìàò";
    TEXT[ polish ] = "Autoformatowanie";
    TEXT[ japanese ] = "µ°ÄÌ«°Ï¯Ä";
    TEXT[ chinese_traditional ] = "¦Û°Ê®æ¦¡";
    TEXT[ arabic ] = "ÊäÓíÞ ÊáÞÇÆí";
    TEXT[ dutch ] = "AutoOpmaak";
    TEXT[ chinese_simplified ] = "×Ô¶¯¸ñʽ";
    TEXT[ greek ] = "ÁõôïÌïñöïðïßçóç";
    TEXT[ korean ] = "ÀÚµ¿ ¼­½Ä";
    TEXT[ turkish ] = "Otomatik formatlama";
    TEXT[ language_user1 ] = " ";
};
String STR_REDLINE_FORMATED
{
    Text = "Attributierung" ;
    Text [ english ] = "Formatted" ;
    Text [ english_us ] = "Formats" ;
    Text [ portuguese_brazilian ] = "Attributierung" ;
    Text [ swedish ] = "Attributering" ;
    Text [ danish ] = "Formateret" ;
    Text [ italian ] = "Attribuzione" ;
    Text [ spanish ] = "Formateado" ;
    Text [ french ] = "Mise en forme" ;
    Text [ dutch ] = "Opmaak" ;
    Text [ portuguese ] = "Formatado" ;
    Text[ chinese_simplified ] = "ÊôÐÔ";
    Text[ russian ] = "Îòôîðìàòèðîâàíî";
    Text[ polish ] = "Dodawanie atrybutów";
    Text[ japanese ] = "‘®«‚ðŽw’è‚·‚é";
    Text[ chinese_traditional ] = "ÄÝ©Ê";
    Text[ arabic ] = "ÊäÓíÞ";
    Text[ language_user1 ] = " ";
    Text[ dutch ] = "Opmaak";
    Text[ chinese_simplified ] = "ÊôÐÔ";
    Text[ greek ] = "Ìïñöïðïßçóç";
    Text[ korean ] = "¼­½ÄÀÖ´Â";
    Text[ turkish ] = "Öznitelikler";
};
String STR_REDLINE_TABLECHG
{
    Text = "Tabellenänderung" ;
    Text [ english ] = "Changed table" ;
    Text [ english_us ] = "Table Changes" ;
    Text [ portuguese_brazilian ] = "Tabellenänderung" ;
    Text [ swedish ] = "Tabelländring" ;
    Text [ danish ] = "Ændret tabel" ;
    Text [ italian ] = "Modifica tabella" ;
    Text [ spanish ] = "Modificación de tabla" ;
    Text [ french ] = "Modification de tableau" ;
    Text [ dutch ] = "Tabelwijziging" ;
    Text [ portuguese ] = "Tabela modificada" ;
    Text[ chinese_simplified ] = "Ð޸ıí¸ñ";
    Text[ russian ] = "Èçìåíåíèÿ òàáëèöû";
    Text[ polish ] = "Zmiany w tabelach";
    Text[ japanese ] = "ðÌÞق̕ύX";
    Text[ chinese_traditional ] = "­×§ïªí®æ";
    Text[ arabic ] = "ÊÚÏíá ÇáÌÏæá";
    Text[ dutch ] = "Tabelwijziging";
    Text[ chinese_simplified ] = "Ð޸ıí¸ñ";
    Text[ greek ] = "Ôñïðïðïßçóç ðßíáêá";
    Text[ korean ] = "Ç¥°¡ ¹Ù²î¾ú½À´Ï´Ù.";
    Text[ turkish ] = "Tablo deðiþikliði";
    Text[ language_user1 ] = " ";
};
String STR_REDLINE_FMTCOLLSET
{
    Text = "Absatzvorlage gesetzt" ;
    Text [ english ] = "Paragraph Styles set" ;
    Text[ italian ] = "Modello di paragrafo impostato";
    Text[ portuguese_brazilian ] = "Paragraph Styles set";
    Text[ portuguese ] = "Estilo de parágrafo definido";
    Text[ danish ] = "Afsnitstypografi defineret";
    Text[ french ] = "Le style de paragraphe a été défini";
    Text[ swedish ] = "Styckeformatmall definierad";
    Text[ dutch ] = "Alinea-opmaakprofiel gedefinieerd";
    Text[ spanish ] = "Aplicado estilo de párrafo";
    Text[ english_us ] = "Applied Paragraph Styles";
    Text[ chinese_simplified ] = "É趨Á˶ÎÂäÑùʽ";
    Text[ russian ] = "Ñòèëü àáçàöà óñòàíîâëåí";
    Text[ polish ] = "Ustaw styl akapitu";
    Text[ japanese ] = "’i—޽À²Ù‚̐ݒè";
    Text[ chinese_traditional ] = "³]©w¤F¬q¸¨¼Ë¦¡";
    Text[ arabic ] = "Êã ÊÚííä äãØ ÇáÝÞÑÉ";
    Text[ dutch ] = "Alinea-opmaakprofiel gedefinieerd";
    Text[ chinese_simplified ] = "É趨Á˶ÎÂäÑùʽ";
    Text[ greek ] = "Ïñéóìüò ðñïôýðïõ ðáñáãñÜöïõ";
    Text[ korean ] = "´Ü¶ô À¯Çü ¼³Á¤";
    Text[ turkish ] = "Paragraf biçimi seçildi";
    Text[ language_user1 ] = " ";
};
String STR_REDLINE_TITLE
{
    Text = "AutoFormat" ;
    Text [ English ] = "AutoFormat" ;
    Text[ italian ] = "Formattazione automatica";
    Text[ portuguese_brazilian ] = "AutoFormat";
    Text[ portuguese ] = "AutoFormato";
    Text[ danish ] = "AutoFormat";
    Text[ french ] = "AutoFormat";
    Text[ swedish ] = "AutoFormat";
    Text[ dutch ] = "AutoOpmaak";
    Text[ spanish ] = "AutoFormato";
    Text[ english_us ] = "AutoFormat";
    Text[ chinese_simplified ] = "×Ô¶¯¸ñʽ";
    Text[ russian ] = "Àâòîôîðìàò";
    Text[ polish ] = "Autoformatowanie";
    Text[ japanese ] = "µ°ÄÌ«°Ï¯Ä";
    Text[ chinese_traditional ] = "¦Û°Ê®æ¦¡";
    Text[ arabic ] = "ÊäÓíÞ ÊáÞÇÆí";
    Text[ dutch ] = "AutoOpmaak";
    Text[ chinese_simplified ] = "×Ô¶¯¸ñʽ";
    Text[ greek ] = "ÁõôïÌïñöïðïßçóç";
    Text[ korean ] = "ÀÚµ¿ ¼­½Ä";
    Text[ turkish ] = "Otomatik formatlama";
    Text[ language_user1 ] = " ";
};
String STR_REDLINE_MSG
{
    Text = "Das AutoFormat ist beendet.\nSie können jetzt alle Änderungen annehmen oder ablehnen,\noder sie einzeln annehmen oder ablehnen." ;
    Text [ English ] = "AutoFormat completed.\nYou can accept or reject all changes, or\naccept or reject individual changes." ;
    Text[ italian ] = "La formattazione automatica è terminata.\nPotete accettare o rifiutare tutte le modifiche oppure\naccettare o rifiutare singolarmente le modifiche.";
    Text[ portuguese_brazilian ] = "AutoFormat completed.\nYou can accept or reject all changes, or\naccept or reject individual changes.";
    Text[ portuguese ] = "Concluído AutoFormato.\nPoderá aceitar ou rejeitar todas as modificações de\numa só vez ou uma a uma.";
    Text[ danish ] = "AutoFormat er fuldført.\nDu kan nu acceptere eller forkaste alle ændringer,\neller acceptere eller forkaste dem enkeltvis.";
    Text[ french ] = "L'AutoFormat a terminé.\nVous pouvez choisir d'en accepter ou rejeter en une seule fois toutes les modifications, ou\n de vous faire afficher toutes les modifications pour les revoir.";
    Text[ swedish ] = "AutoFormat är färdigt.\nDu kan acceptera eller kasta bort alla ändringar eller\nacceptera eller kasta bort enstaka ändringar.";
    Text[ dutch ] = "AutoOpmaak voltooid.\nU kunt nu alle wijzigingen accepteren of verwerpen,\nof afzonderlijke wijzigingen accepteren of verwerpen.";
    Text[ spanish ] = "El AutoFormato ha concluido.\nAhora puede aceptar o rechazar todos los cambios\na la vez o uno por uno.";
    Text[ english_us ] = "AutoFormat completed.\nYou can accept or reject all changes,\nor accept or reject particular changes.";
    Text[ chinese_simplified ] = "ÒѾ­Íê³É×Ô¶¯¸ñʽ¡£\nÄúÏÖÔÚÄܹ»½ÓÊÜ»ò¾Ü¾øËùÓеĸü¸Ä£¬»òÕß\n½ÓÊÜ»ò¾Ü¾øµ¥¸ö¸ü¸Ä¡£";
    Text[ russian ] = "Àâòîôîðìàòèðîâàíèå çàêîí÷åíî.\nÑåé÷àñ Âû ìîæåòå ïðèíÿòü èëè îòêëîíèòü ñðàçó âñå èçìåíåíèÿ,\nèëè êàæäîå ïî îòäåëüíîñòè.";
    Text[ polish ] = "Autoformatowanie jest zakoñczone.\nMo¿esz zaaakceptowaæ lub odrzuciæ teraz wszystkie zmiany,\nlub akceptowaæ je oraz odrzucaæ pojedynczo.";
    Text[ japanese ] = "µ°ÄÌ«°Ï¯Ä‚ªI—¹‚µ‚Ü‚µ‚½B\n‚·‚ׂĂ̕ύX‚ðŽó‚¯“ü‚ê‚é‚©AŒ³‚É–ß‚·‚±‚Æ‚ª‚Å‚«‚Ü‚·B\n‚Ü‚½‚͂ЂƂ‚ЂƂ‚̕ύX‚ɂ‚¢‚ÄŒŸ“¢‚·‚邱‚Æ‚à‚Å‚«‚Ü‚·B";
    Text[ chinese_traditional ] = "¤w¸g§¹¦¨¦Û°Ê®æ¦¡¡C\n±z²{¦b¯à°÷±µ¨ü©Î©Úµ´©Ò¦³ªºÅܧó¡A±z¤]¯à°÷\n±µ¨ü©Î©Úµ´³æ­ÓªºÅܧó¡C";
    Text[ arabic ] = "ÊãøóÊ ÚãáíÉ ÇáÊäÓíÞ ÇáÊáÞÇÆí.\níãßäß ÇáÂä ÞÈæá Ãæ ÑÝÖ ÇáÊÛííÑÇÊ ßáåÇ¡\nÃæ ÞÈæá Ãæ ÑÝÖ ßá ÊÛííÑ Úáì ÍÏå.";
    Text[ dutch ] = "AutoOpmaak voltooid.\nU kunt nu alle wijzigingen accepteren of verwerpen,\nof afzonderlijke wijzigingen accepteren of verwerpen.";
    Text[ chinese_simplified ] = "ÒѾ­Íê³É×Ô¶¯¸ñʽ¡£\nÄúÏÖÔÚÄܹ»½ÓÊÜ»ò¾Ü¾øËùÓеĸü¸Ä£¬»òÕß\n½ÓÊÜ»ò¾Ü¾øµ¥¸ö¸ü¸Ä¡£";
    Text[ greek ] = "Ç ÁõôïÌïñöïðïßçóç ïëïêëçñþèçêå.\n¸÷åôå ôç äõíáôüôçôá íá áðïäå÷ôåßôå Þ íá áðïññßøåôå üëåò Þ ìåìïíùìÝíåò áëëáãÝò.";
    Text[ korean ] = "ÀÚµ¿ ¼­½ÄÀÌ Á¾·áµÇ¾ú½À´Ï´Ù.\nÁö±Ý º¯°æ»çÇ×À» ¸ðµÎ Àû¿ëÇϰųª Ãë¼ÒÇÒ ¼ö ÀÖÀ¸¸ç\nȤÀº °³º°ÀûÀ¸·Î Àû¿ëÇϰųª Ãë¼ÒÇÒ ¼ö ÀÖ½À´Ï´Ù.";
    Text[ turkish ] = "Otomatik formatlama tamamlandý.\nÞimdi deðiþiklikleri tümden veya tek tek\n kabul ya da redd edebilirsiniz.";
    Text[ language_user1 ] = " ";
};
String STR_REDLINE_ACCEPT_ALL
{
    Text = "Alles ~annehmen" ;
    Text [ English ] = "~Accept All" ;
    Text[ italian ] = "~Accetta tutto";
    Text[ portuguese_brazilian ] = "~Accept All";
    Text[ portuguese ] = "~Aceitar tudo";
    Text[ danish ] = "Accepter alle";
    Text[ french ] = "Tout ~accepter";
    Text[ swedish ] = "~Acceptera alla";
    Text[ dutch ] = "~Alles accepteren";
    Text[ spanish ] = "~Aceptar todo";
    Text[ english_us ] = "Accept All";
    Text[ chinese_simplified ] = "È«²¿½ÓÊÜ";
    Text[ russian ] = "Ïðèíÿòü âñå";
    Text[ polish ] = "Zaakceptuj wszystko";
    Text[ japanese ] = "‚·‚ׂĎ󂯓ü‚ê‚é";
    Text[ chinese_traditional ] = "¥þ³¡±µ¨ü";
    Text[ arabic ] = "ÞÈæá Çáßá";
    Text[ dutch ] = "~Alles accepteren";
    Text[ chinese_simplified ] = "È«²¿½ÓÊÜ";
    Text[ greek ] = "Áðïäï÷Þ üëùí";
    Text[ korean ] = "¸ðµÎ Àû¿ë";
    Text[ turkish ] = "Tümünü kabul et";
    Text[ language_user1 ] = " ";
};
String STR_REDLINE_REJECT_ALL
{
    Text = "Alles ableh~nen" ;
    Text [ English ] = "~Reject All" ;
    Text[ italian ] = "Rifiuta tutto";
    Text[ portuguese_brazilian ] = "~Reject All";
    Text[ portuguese ] = "~Rejeitar tudo";
    Text[ danish ] = "Forkast alle";
    Text[ french ] = "~Tout rejeter";
    Text[ swedish ] = "~Kasta bort alla";
    Text[ dutch ] = "~Alles verwerpen";
    Text[ spanish ] = "~Ocultar todo";
    Text[ english_us ] = "Reject All";
    Text[ chinese_simplified ] = "È«²¿¾Ü¾ø";
    Text[ russian ] = "Îòêëîíèòü âñå";
    Text[ polish ] = "Odrzuæ wszystko";
    Text[ japanese ] = "‚·‚ׂȳ‚É–ß‚·";
    Text[ chinese_traditional ] = "¥þ³¡©Úµ´";
    Text[ arabic ] = "ÑÝÖ Çáßá";
    Text[ dutch ] = "~Alles verwerpen";
    Text[ chinese_simplified ] = "È«²¿¾Ü¾ø";
    Text[ greek ] = "Áðüññéøç üëùí";
    Text[ korean ] = "¸ðµÎ Ãë¼Ò";
    Text[ turkish ] = "Tümünü reddet";
    Text[ language_user1 ] = " ";
};
String STR_REDLINE_EDIT
{
    Text = "Änderungen ~bearbeiten" ;
    Text [ English ] = "Review ~Changes" ;
    Text[ italian ] = "Modifica cambiamenti";
    Text[ portuguese_brazilian ] = "Review ~Changes";
    Text[ portuguese ] = "Editar ~modificações";
    Text[ danish ] = "Rediger ændringer";
    Text[ french ] = "~Revoir les modifications";
    Text[ swedish ] = "Redigera ~ändringar";
    Text[ dutch ] = "Wijzigingen ~bewerken";
    Text[ spanish ] = "Editar ~modificaciones";
    Text[ english_us ] = "Edit Changes";
    Text[ chinese_simplified ] = "±à¼­¸ü¸Ä";
    Text[ russian ] = "Àíàëèç èçìåíåíèé";
    Text[ polish ] = "Edytuj zmiany";
    Text[ japanese ] = "•ύX‚̕ҏW";
    Text[ chinese_traditional ] = "½s¿èÅܧó";
    Text[ arabic ] = "ÊÍÑíÑ ÇáÊÛííÑÇÊ";
    Text[ dutch ] = "Wijzigingen ~bewerken";
    Text[ chinese_simplified ] = "±à¼­¸ü¸Ä";
    Text[ greek ] = "Åðåîåñãáóßá áëëáãþí";
    Text[ korean ] = "º¯°æ ³»¿ë °ËÅä";
    Text[ turkish ] = "Deðiþiklikleri düzenle";
    Text[ language_user1 ] = " ";
};
QueryBox DLG_IMPORT_DBNAME
{
    BUTTONS = WB_YES_NO ;
    DEFBUTTON = WB_DEF_NO ;
    MESSAGE = "Soll der Datenbankname als Standarddatenbank für das Dokument übernommen werden?" ;
    MESSAGE [ English ] = "Should the database name be used as document default?" ;
    Message [ dutch ] = "Moet de database-naam als standaard database voor het document worden overgenomen?" ;
    Message [ english_us ] = "Use database name as default database for the document?" ;
    Message [ italian ] = "Si vuole che il nome del database venga usato come database standard per il documento?" ;
    Message [ spanish ] = "¿Desea adoptar el nombre de la base de datos como base de datos estándar para el documento?" ;
    Message [ french ] = "Le nom de la base de données doit-il être utilisé comme nom de base de données par défaut ?" ;
    Message [ swedish ] = "Ska databasnamnet övertas som standarddatabas för dokumentet?" ;
    Message [ danish ] = "Skal databasenavnet overtages som standarddatabase for dokumentet?" ;
    Message [ portuguese_brazilian ] = "Soll der Datenbankname als Standarddatenbank für das Dokument übernommen werden?" ;
    Message [ portuguese ] = "Deseja adoptar o nome da base de dados como base de dados padrão para o documento?" ;
    Message[ chinese_simplified ] = "ÒªÈÃÎļþÌ×ÓÃĬÈϵÄÊý¾Ý¿âÃû³Æ£¿";
    Message[ russian ] = "Èñïîëüçîâàòü èìÿ áàçû äàííûõ â êà÷åñòâå ñòàíäàðòíîé áàçû äàííûõ äëÿ ýòîãî äîêóìåíòà?";
    Message[ polish ] = "Czy nazwa bazy danych ma zostaæ zastosowana w dokumencie jako standardowa baza danych?";
    Message[ japanese ] = "‚±‚ÌÃÞ°ÀÍÞ°½‚Ì–¼‘O‚ð•W€ÃÞ°ÀÍÞ°½‚Æ‚µ‚Ä‚±‚Ì•¶‘‚ÉŽg—p‚µ‚Ü‚·‚©H";
    Message[ chinese_traditional ] = "Åý¤å¥ó±Ä¥ÎÀq»{ªº¸ê®Æ®w¦WºÙ¡H";
    Message[ arabic ] = "åá ÊÑíÏ ÇÓÊÎÏÇã ÇÓã ÞÇÚÏÉ ÇáÈíÇäÇÊ ßÞÇÚÏÉ ÈíÇäÇÊ ÇÝÊÑÇÖíÉ ááãÓÊäÏ¿";
    Message[ dutch ] = "Moet de database-naam als standaard database voor het document worden overgenomen?";
    Message[ chinese_simplified ] = "ÒªÈÃÎļþÌ×ÓÃĬÈϵÄÊý¾Ý¿âÃû³Æ£¿";
    Message[ greek ] = "ÈÝëåôå íá ÷ñçóéìïðïéçèåß ôï üíïìá ôçò âÜóçò äåäïìÝíùí ùò âÜóç äåäïìÝíùí ðñïåðéëïãÞò ãéá ôï Ýããñáöï;";
    Message[ korean ] = "µ¥ÀÌÅͺ£À̽º À̸§À» ¹®¼­ÀÇ ±âº» µ¥ÀÌÅͺ£À̽º·Î »ç¿ëÇϽðڽÀ´Ï±î?";
    Message[ turkish ] = "Veritabaný adý, belge için standart veritabaný olarak kullanýlsýn mý?";
    Message[ language_user1 ] = " ";
};
String STR_PAGE
{
    TEXT = "Seite " ;
    TEXT [ English ] = "Page " ;
    TEXT [ norwegian ] = "Side " ;
    TEXT [ italian ] = "Pagina " ;
    TEXT [ portuguese_brazilian ] = "Página " ;
    TEXT [ portuguese ] = "Página " ;
    TEXT [ finnish ] = "Sivu " ;
    TEXT [ danish ] = "Side " ;
    TEXT [ french ] = "Page " ;
    TEXT [ swedish ] = "Sida  " ;
    TEXT [ dutch ] = "Pagina  " ;
    TEXT [ spanish ] = "Página  " ;
    TEXT [ english_us ] = "Page " ;
    TEXT[ chinese_simplified ] = "Ò³Ãæ ";
    TEXT[ russian ] = "Ñòðàíèöà  ";
    TEXT[ polish ] = "Strona  ";
    TEXT[ japanese ] = "Íß°¼Þ ";
    TEXT[ chinese_traditional ] = "­¶­± ";
    TEXT[ arabic ] = "ÕÝÍÉ ";
    TEXT[ dutch ] = "Pagina  ";
    TEXT[ chinese_simplified ] = "Ò³Ãæ ";
    TEXT[ greek ] = "Óåëßäá ";
    TEXT[ korean ] = "ÆäÀÌÁö ";
    TEXT[ turkish ] = "Sayfa ";
    TEXT[ language_user1 ] = " ";
};
String RID_TEXT_TOOLBOX
{
    /* ### ACHTUNG: Neuer Text in Resource? Textobjektleiste : Textleiste */
    Text = "Textobjektleiste" ;
    Text [ English ] = "Text object bar" ;
    Text [ portuguese ] = "Barra de objectos de texto" ;
    Text [ english_us ] = "Text Object Bar" ;
    Text [ portuguese_brazilian ] = "Textobjektleiste" ;
    Text [ swedish ] = "Textobjektlist" ;
    Text [ danish ] = "Tekstobjektlinje" ;
    Text [ italian ] = "Barra degli oggetti di testo" ;
    Text [ spanish ] = "Barra de objetos de texto" ;
    Text [ french ] = "Barre d'objets de texte" ;
    Text [ dutch ] = "Tekstbalk" ;
    Text[ chinese_simplified ] = "ÎÄ×Ö¶ÔÏóÀ¸";
    Text[ russian ] = "Ïàíåëü îáúåêòîâ òåêñòà";
    Text[ polish ] = "Pasek obiektów tabeli";
    Text[ japanese ] = "÷½ÄµÌÞ¼Þª¸ÄÊÞ°";
    Text[ chinese_traditional ] = "¤å¦rª«¥ó¦C";
    Text[ arabic ] = "ÔÑíØ ßÇÆäÇÊ ÇáäÕ";
    Text[ dutch ] = "Tekstbalk";
    Text[ chinese_simplified ] = "ÎÄ×Ö¶ÔÏóÀ¸";
    Text[ greek ] = "ÃñáììÞ áíôéêåéìÝíùí êåéìÝíïõ";
    Text[ korean ] = "ÅØ½ºÆ® °³Ã¼ ¸ðÀ½";
    Text[ turkish ] = "Metin nesne çubuðu";
    Text[ language_user1 ] = " ";
};
ToolBox RID_TEXT_TOOLBOX
{
    HelpID = HID_TEXT_TOOLBOX ;
    Border = TRUE ;
    SVLook = TRUE ;
    Dockable = TRUE ;
    Moveable = TRUE ;
    Sizeable = TRUE ;
    Closeable = TRUE ;
    Zoomable = TRUE ;
    HideWhenDeactivate = TRUE ;
    LineSpacing = TRUE ;
    Customize = TRUE ;
    MenuStrings = TRUE ;
    Hide = TRUE ;
    ItemList =
    {
        MN_TEMPLATE
        MN_FONT
        MN_TEXT1(TRUE)
        MN_TEXT1_BLOCK
        MN_TEXT_LINESPACE
        MN_TEXT2
        MN_TEXT_BACKGROUND
        MN_TEXT_DIALOGS(TRUE)
    };
    Scroll = TRUE ;
};
String RID_TABLE_TOOLBOX
{
    Text = "Tabellenobjektleiste" ;
    Text [ English ] = "Table objectbar" ;
    Text [ norwegian ] = "Table" ;
    Text [ italian ] = "Barra degli oggetti per tabelle" ;
    Text [ portuguese_brazilian ] = "Tabela" ;
    Text [ portuguese ] = "Barra de objectos de tabela" ;
    Text [ finnish ] = "Taulukko" ;
    Text [ danish ] = "Tabelobjektlinje" ;
    Text [ french ] = "Barre d'objets de tableau" ;
    Text [ swedish ] = "Tabellobjektlist" ;
    Text [ dutch ] = "Tabelobjectbalk" ;
    Text [ spanish ] = "Barra de objetos para tablas" ;
    Text [ english_us ] = "Table Object Bar" ;
    Text[ chinese_simplified ] = "±í¸ñ¶ÔÏóÀ¸";
    Text[ russian ] = "Ïàíåëü îáúåêòà òàáëèöû";
    Text[ polish ] = "Pasek obiektów tabeli";
    Text[ japanese ] = "•\\µÌÞ¼Þª¸ÄÊÞ°";
    Text[ chinese_traditional ] = "ªí®æª«¥ó¦C";
    Text[ arabic ] = "ÔÑíØ ßÇÆäÇÊ ÌÏæá";
    Text[ dutch ] = "Tabelobjectbalk";
    Text[ chinese_simplified ] = "±í¸ñ¶ÔÏóÀ¸";
    Text[ greek ] = "ÃñáììÞ áíôéêåéìÝíùí ðßíáêá";
    Text[ korean ] = "Ç¥ °³Ã¼ ¸ðÀ½";
    Text[ turkish ] = "Tablo nesne çubuðu";
    Text[ language_user1 ] = " ";
};
ToolBox RID_TABLE_TOOLBOX
{
    HelpID = HID_TABLE_TOOLBOX ;
    Border = TRUE ;
    SVLook = TRUE ;
    Dockable = TRUE ;
    Moveable = TRUE ;
    Sizeable = TRUE ;
    Closeable = TRUE ;
    Zoomable = TRUE ;
    LineSpacing = TRUE ;
    HideWhenDeactivate = TRUE ;
    Customize = TRUE ;
    MenuStrings = TRUE ;
    Hide = TRUE ;
    Scroll = TRUE ;
    ItemList =
    {
        MN_TEMPLATE
        MN_FONT
        ToolBoxItem
        {
            Identifier = FN_TABLE_AUTOSUM ;
            HelpID = FN_TABLE_AUTOSUM ;
        };
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            Identifier = FN_TABLE_MODE_FIX ;
            HelpID = FN_TABLE_MODE_FIX ;
        };
        ToolBoxItem
        {
            Identifier = FN_TABLE_MODE_FIX_PROP ;
            HelpID = FN_TABLE_MODE_FIX_PROP ;
        };
        ToolBoxItem
        {
            Identifier = FN_TABLE_MODE_VARIABLE ;
            HelpID = FN_TABLE_MODE_VARIABLE ;
        };
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            Identifier = FN_TABLE_MERGE_CELLS ;
            HelpID = FN_TABLE_MERGE_CELLS ;
        };
        ToolBoxItem
        {
            Identifier = FN_TABLE_SPLIT_CELLS ;
            HelpID = FN_TABLE_SPLIT_CELLS ;
        };
        ToolBoxItem
        {
            DropDown = TRUE ;
            Identifier = FN_OPTIMIZE_TABLE ;
            HelpID = FN_OPTIMIZE_TABLE ;
        };
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            Identifier = FN_TABLE_INSERT_ROW ;
            HelpID = FN_TABLE_INSERT_ROW ;
        };
        ToolBoxItem
        {
            Identifier = FN_TABLE_INSERT_COL ;
            HelpID = FN_TABLE_INSERT_COL ;
        };
        ToolBoxItem
        {
            Identifier = FN_TABLE_DELETE_ROW ;
            HelpID = FN_TABLE_DELETE_ROW ;
        };
        ToolBoxItem
        {
            Identifier = FN_TABLE_DELETE_COL ;
            HelpID = FN_TABLE_DELETE_COL ;
        };
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            Identifier = FN_TABLE_SELECT_ALL;
            HelpID = FN_TABLE_SELECT_ALL;
            Hide = TRUE;
        };
        ToolBoxItem
        {
            Identifier = FN_TABLE_SELECT_COL;
            HelpID = FN_TABLE_SELECT_COL;
            Hide = TRUE;
        };
        ToolBoxItem
        {
            Identifier = FN_TABLE_SELECT_ROW;
            HelpID = FN_TABLE_SELECT_ROW;
            Hide = TRUE;
        };
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            Identifier = FN_TABLE_VERT_NONE;
            HelpID = FN_TABLE_VERT_NONE;
            RadioCheck = TRUE;
            Hide = TRUE;
        };
        ToolBoxItem
        {
            Identifier = FN_TABLE_VERT_CENTER;
            HelpID = FN_TABLE_VERT_CENTER;
            RadioCheck = TRUE;
            Hide = TRUE;
        };
        ToolBoxItem
        {
            Identifier = FN_TABLE_VERT_BOTTOM;
            HelpID = FN_TABLE_VERT_BOTTOM;
            RadioCheck = TRUE;
            Hide = TRUE;
        };
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            ITEM_TOOLBAR_ATTR_BORDER
        };
        ToolBoxItem
        {
            ITEM_TOOLBAR_FRAME_LINESTYLE
        };
        ToolBoxItem
        {
            ITEM_TOOLBAR_FRAME_LINECOLOR
            Hide = TRUE;
        };
        ToolBoxItem
        {
            ITEM_TOOLBAR_BACKGROUND_COLOR
        };
    };
};
String RID_FRAME_TOOLBOX
{
    Text = "Rahmenobjektleiste" ;
    Text [ English ] = "Frame objectbar" ;
    Text [ norwegian ] = "Ramme" ;
    Text [ italian ] = "Barra degli oggetti per cornice" ;
    Text [ portuguese_brazilian ] = "Moldura" ;
    Text [ portuguese ] = "Barra de molduras" ;
    Text [ finnish ] = "Kehys" ;
    Text [ danish ] = "Rammeobjektlinje" ;
    Text [ french ] = "Barre d'objets de cadre" ;
    Text [ swedish ] = "Ramobjektlist" ;
    Text [ dutch ] = "Kaderobjectbalk" ;
    Text [ spanish ] = "Barra de objetos de marco" ;
    Text [ english_us ] = "Frame Object Bar" ;
    Text[ chinese_simplified ] = "¿ò¶ÔÏóÀ¸";
    Text[ russian ] = "Ïàíåëü îáúåêòîâ êàäðîâ";
    Text[ polish ] = "Pasek obiektów ramki";
    Text[ japanese ] = "˜gµÌÞ¼Þª¸ÄÊÞ°";
    Text[ chinese_traditional ] = "®Øª«¥ó¦C";
    Text[ arabic ] = "ÔÑíØ ßÇÆäÇÊ ÇáÅØÇÑ";
    Text[ dutch ] = "Kaderobjectbalk";
    Text[ chinese_simplified ] = "¿ò¶ÔÏóÀ¸";
    Text[ greek ] = "ÃñáììÞ áíôéêåéìÝíùí ðëáéóßïõ";
    Text[ korean ] = "ÇÁ·¹ÀÓ °³Ã¼ ¸ðÀ½";
    Text[ turkish ] = "Çerçeve nesne çubuðu";
    Text[ language_user1 ] = " ";
};
ToolBox RID_FRAME_TOOLBOX
{
    HelpID = HID_FRAME_TOOLBOX ;
    Border = TRUE ;
    SVLook = TRUE ;
    Dockable = TRUE ;
    Moveable = TRUE ;
    Sizeable = TRUE ;
    Closeable = TRUE ;
    Zoomable = TRUE ;
    LineSpacing = TRUE ;
    MenuStrings = TRUE ;
    HideWhenDeactivate = TRUE ;
    Customize = TRUE ;
    Hide = TRUE ;
    ItemList =
    {
        MN_TEMPLATE
        MN_FRAME_WRAP
        MN_FRAME1
        MN_FRAME2
        MN_FRAME3
        MN_LINESTYLE
        MN_BACKGROUND_COLOR
        ToolBoxItem { Type = TOOLBOXITEM_SEPARATOR ; };
        MN_ATTRIBUTES_FRAME
        ToolBoxItem { Type = TOOLBOXITEM_SEPARATOR ; };
        MN_LAYER
        ToolBoxItem
        {
            Identifier = FN_TOOL_ANKER ;
            HelpID = FN_TOOL_ANKER ;
            DropDown = TRUE ;
        };
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            Identifier = FN_FRAME_CHAIN ;
            HelpID = FN_FRAME_CHAIN ;
        };
        ToolBoxItem
        {
            Identifier = FN_FRAME_UNCHAIN ;
            HelpID = FN_FRAME_UNCHAIN ;
        };
    };
    Scroll = TRUE ;
};
String RID_GRAFIK_TOOLBOX
{
    Text = "Grafikobjektleiste" ;
    Text [ English ] = "Graphic objectbar" ;
    Text [ norwegian ] = "Graphic" ;
    Text [ italian ] = "Barra degli oggetti grafici" ;
    Text [ portuguese_brazilian ] = "Gr fico" ;
    Text [ portuguese ] = "Barra de gráficos" ;
    Text [ finnish ] = "Kuva" ;
    Text [ danish ] = "Grafikobjektlinje" ;
    Text [ french ] = "Barre d'objets graphiques" ;
    Text [ swedish ] = "Grafikobjektlist" ;
    Text [ dutch ] = "Objectbalk afbeeldingen" ;
    Text [ spanish ] = "Barra de objetos gráficos" ;
    Text [ english_us ] = "Graphics Object Bar" ;
    Text[ chinese_simplified ] = "ͼÐζÔÏóÀ¸";
    Text[ russian ] = "Ïàíåëü ãðàôè÷åñêèõ îáúåêòîâ";
    Text[ polish ] = "Pasek obiektów graficznych";
    Text[ japanese ] = "}Œ`•`‰æµÌÞ¼Þª¸ÄÊÞ°";
    Text[ chinese_traditional ] = "¹Ï¤ùª«¥ó¦C";
    Text[ arabic ] = "ÔÑíØ ßÇÆäÇÊ ÕæÑÉ";
    Text[ dutch ] = "Objectbalk afbeeldingen";
    Text[ chinese_simplified ] = "ͼÐζÔÏóÀ¸";
    Text[ greek ] = "ÃñáììÞ ãñáöéêþí áíôéêåéìÝíùí";
    Text[ korean ] = "±×·¡ÇÈ °³Ã¼ ¸ðÀ½";
    Text[ turkish ] = "Grafik nesne çubuðu";
    Text[ language_user1 ] = " ";
};
ToolBox RID_GRAFIK_TOOLBOX
{
    HelpID = HID_GRAFIK_TOOLBOX ;
    Border = TRUE ;
    SVLook = TRUE ;
    Dockable = TRUE ;
    Moveable = TRUE ;
    Sizeable = TRUE ;
    Closeable = TRUE ;
    Zoomable = TRUE ;
    LineSpacing = TRUE ;
    HideWhenDeactivate = TRUE ;
    MenuStrings = TRUE ;
    Customize = TRUE ;
    Hide = TRUE ;
    ItemList =
    {
        ToolBoxItem
        {
            Identifier = SID_ATTR_GRAF_MODE;
            HelpID = SID_ATTR_GRAF_MODE;
        };
        ToolBoxItem { Type = TOOLBOXITEM_SEPARATOR ; };

        ToolBoxItem
        {
            Identifier = SID_ATTR_GRAF_RED;
            HelpID = SID_ATTR_GRAF_RED;
        };
        ToolBoxItem
        {
            Identifier = SID_ATTR_GRAF_GREEN;
            HelpID = SID_ATTR_GRAF_GREEN;
        };
        ToolBoxItem
        {
            Identifier = SID_ATTR_GRAF_BLUE;
            HelpID = SID_ATTR_GRAF_BLUE;
        };
        ToolBoxItem { Type = TOOLBOXITEM_SEPARATOR ; };

        ToolBoxItem
        {
            Identifier = SID_ATTR_GRAF_LUMINANCE;
            HelpID = SID_ATTR_GRAF_LUMINANCE;
        };
        ToolBoxItem { Type = TOOLBOXITEM_SEPARATOR ; };

        ToolBoxItem
        {
            Identifier = SID_ATTR_GRAF_CONTRAST;
            HelpID = SID_ATTR_GRAF_CONTRAST;
        };
        ToolBoxItem
        {
            Identifier = SID_ATTR_GRAF_GAMMA;
            HelpID = SID_ATTR_GRAF_GAMMA;
        };
        ToolBoxItem { Type = TOOLBOXITEM_SEPARATOR ; };
        ToolBoxItem
        {
            Identifier = SID_ATTR_GRAF_TRANSPARENCE;
            HelpID = SID_ATTR_GRAF_TRANSPARENCE;
        };
        ToolBoxItem { Type = TOOLBOXITEM_SEPARATOR ; };
        ToolBoxItem
        {
            Identifier = FN_FLIP_VERT_GRAFIC ;
            HelpID = FN_FLIP_VERT_GRAFIC ;
        };
        ToolBoxItem
        {
            Identifier = FN_FLIP_HORZ_GRAFIC ;
            HelpID = FN_FLIP_HORZ_GRAFIC ;
        };
        ToolBoxItem { Type = TOOLBOXITEM_SEPARATOR ; };
        ToolBoxItem
        {
            ITEM_TOOLBAR_SIM_START
        };
        MN_ATTRIBUTES_GRAFIK
    };
    Scroll = TRUE ;
};
String RID_OLE_TOOLBOX
{
    Text = "Objekt" ;
    Text [ English ] = "Object" ;
    Text [ norwegian ] = "Object" ;
    Text [ italian ] = "Oggetto" ;
    Text [ portuguese_brazilian ] = "Objeto" ;
    Text [ portuguese ] = "Objecto" ;
    Text [ finnish ] = "Objekti" ;
    Text [ danish ] = "Objekt" ;
    Text [ french ] = "Objet" ;
    Text [ swedish ] = "Objekt" ;
    Text [ dutch ] = "Object" ;
    Text [ spanish ] = "Objeto" ;
    Text [ english_us ] = "Object" ;
    Text[ chinese_simplified ] = "¶ÔÏó";
    Text[ russian ] = "Îáúåêò";
    Text[ polish ] = "Obiekt";
    Text[ japanese ] = "µÌÞ¼Þª¸Ä";
    Text[ chinese_traditional ] = "ª«¥ó";
    Text[ arabic ] = "ßÇÆä";
    Text[ dutch ] = "Object";
    Text[ chinese_simplified ] = "¶ÔÏó";
    Text[ greek ] = "Áíôéêåßìåíï";
    Text[ korean ] = "°³Ã¼";
    Text[ turkish ] = "Nesne";
    Text[ language_user1 ] = " ";
};
ToolBox RID_OLE_TOOLBOX
{
    HelpID = HID_OLE_TOOLBOX ;
    Border = TRUE ;
    SVLook = TRUE ;
    Dockable = TRUE ;
    Moveable = TRUE ;
    Sizeable = TRUE ;
    Closeable = TRUE ;
    Zoomable = TRUE ;
    LineSpacing = TRUE ;
    HideWhenDeactivate = TRUE ;
    Customize = TRUE ;
    MenuStrings = TRUE ;
    Hide = TRUE ;
    Scroll = TRUE ;
    ItemList =
    {
        MN_TEMPLATE
        MN_FRAME_WRAP
        MN_CONTOUR
        MN_FRAME1
        MN_FRAME2
        MN_FRAME3
        MN_LINESTYLE
        ToolBoxItem { Type = TOOLBOXITEM_SEPARATOR ; };
        MN_ATTRIBUTES_OLE
        ToolBoxItem { Type = TOOLBOXITEM_SEPARATOR ; };
        MN_LAYER
        ToolBoxItem
        {
            Identifier = FN_TOOL_ANKER ;
            HelpID = FN_TOOL_ANKER ;
            DropDown = TRUE ;
        };
    };
};
String RID_DRAW_TOOLBOX
{
    Text = "Zeichenobjektleiste" ;
    Text [ English ] = "Draw objectbar" ;
    Text [ norwegian ] = "Draw" ;
    Text [ italian ] = "Barra degli oggetti per disegno" ;
    Text [ portuguese_brazilian ] = "Desenhar" ;
    Text [ portuguese ] = "Barra de objectos de desenho" ;
    Text [ finnish ] = "Piirrä" ;
    Text [ danish ] = "Tegneobjektlinje" ;
    Text [ french ] = "Barre d'objets de dessin" ;
    Text [ swedish ] = "Ritobjektlist" ;
    Text [ dutch ] = "Tekenobjectbalk" ;
    Text [ spanish ] = "Barra de objetos de dibujo" ;
    Text [ english_us ] = "Draw Object Bar" ;
    Text[ chinese_simplified ] = "»æÍ¼¶ÔÏóÀ¸";
    Text[ russian ] = "Ïàíåëü ãðàôè÷åñêîãî îáúåêòà";
    Text[ polish ] = "Pasek obiektów rysunkowych";
    Text[ japanese ] = "}Œ`•`‰æµÌÞ¼Þª¸ÄÊÞ°";
    Text[ chinese_traditional ] = "ø¹Ïª«¥ó¦C";
    Text[ arabic ] = "ÔÑíØ ÇáßÇÆäÇÊ ÇáÑÓæãíÉ";
    Text[ dutch ] = "Tekenobjectbalk";
    Text[ chinese_simplified ] = "»æÍ¼¶ÔÏóÀ¸";
    Text[ greek ] = "ÃñáììÞ áíôéêåéìÝíùí ó÷åäßáóçò";
    Text[ korean ] = "±×¸®±â °³Ã¼ ¸ðÀ½";
    Text[ turkish ] = "Çizim nesne çubuðu";
    Text[ language_user1 ] = " ";
};
ToolBox RID_DRAW_TOOLBOX
{
    HelpID = HID_DRAW_TOOLBOX ;
    Border = TRUE ;
    SVLook = TRUE ;
    Dockable = TRUE ;
    Moveable = TRUE ;
    Sizeable = TRUE ;
    Closeable = TRUE ;
    Zoomable = TRUE ;
    LineSpacing = TRUE ;
    HideWhenDeactivate = TRUE ;
    Customize = TRUE ;
    MenuStrings = TRUE ;
    Hide = TRUE ;
    ItemList =
    {
        ToolBoxItem
        {
            Identifier = SID_BEZIER_EDIT ;
            HelpID = SID_BEZIER_EDIT ;
        };
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            Identifier = SID_ATTRIBUTES_LINE ;
            HelpID = SID_ATTRIBUTES_LINE ;
        };
        ToolBoxItem
        {
            ITEM_TOOLBAR_ATTR_LINEEND_STYLE
        };
        ToolBoxItem
        {
            ITEM_TOOLBAR_ATTR_LINE_STYLE
        };
        ToolBoxItem
        {
            ITEM_TOOLBAR_ATTR_LINE_WIDTH
        };
        ToolBoxItem
        {
            ITEM_TOOLBAR_ATTR_LINE_COLOR
        };
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            Identifier = SID_ATTRIBUTES_AREA ;
            HelpID = SID_ATTRIBUTES_AREA ;
        };
        ToolBoxItem
        {
            ITEM_TOOLBAR_ATTR_FILL_STYLE
        };
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            ITEM_TOOLBAR_OBJECT_ROTATE
        };
        ToolBoxItem
        {
            Identifier = FN_TOOL_ANKER ;
            HelpID = FN_TOOL_ANKER ;
            DropDown = TRUE ;
        };
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            Identifier = FN_FRAME_NOWRAP ;
            HelpID = FN_FRAME_NOWRAP ;
            RadioCheck = TRUE ;
            Hide = TRUE;
        };
        ToolBoxItem
        {
            Identifier = FN_FRAME_WRAP ;
            HelpID = FN_FRAME_WRAP ;
            RadioCheck = TRUE ;
            Hide = TRUE;
        };
        ToolBoxItem
        {
            Identifier = FN_FRAME_WRAP_IDEAL ;
            HelpID = FN_FRAME_WRAP_IDEAL ;
            RadioCheck = TRUE ;
            Hide = TRUE;
        };
        ToolBoxItem
        {
            Identifier = FN_FRAME_WRAP_LEFT ;
            HelpID = FN_FRAME_WRAP_LEFT ;
            RadioCheck = TRUE ;
            Hide = TRUE;
        };
        ToolBoxItem
        {
            Identifier = FN_FRAME_WRAP_RIGHT ;
            HelpID = FN_FRAME_WRAP_RIGHT ;
            RadioCheck = TRUE ;
            Hide = TRUE;
        };
        ToolBoxItem
        {
            Identifier = FN_FRAME_WRAPTHRU ;
            HelpID = FN_FRAME_WRAPTHRU ;
            RadioCheck = TRUE ;
            Hide = TRUE;
        };
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            Identifier = FN_FRAME_WRAP_CONTOUR ;
            HelpID = FN_FRAME_WRAP_CONTOUR ;
            Hide = TRUE ;
        };
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            Identifier = SID_OBJECT_HEAVEN ;
            HelpID = SID_OBJECT_HEAVEN ;
        };
        ToolBoxItem
        {
            Identifier = SID_OBJECT_HELL ;
            HelpID = SID_OBJECT_HELL ;
        };
        MN_LAYER
        MN_GRID( HIDE=TRUE )
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            Identifier = SID_OBJECT_ALIGN ;
            HelpID = SID_OBJECT_ALIGN ;
            DropDown = TRUE ;
        };
    };
    Scroll = TRUE ;
};
String RID_DRAWFORM_TOOLBOX
{
    Text = "Kontrollfeldleiste" ;
    Text [ English ] = "Control bar" ;
    Text [ portuguese ] = "Barra de controlos" ;
    Text [ english_us ] = "Control Bar" ;
    Text [ portuguese_brazilian ] = "Kontrollfeldleiste" ;
    Text [ swedish ] = "Kontrollfältlist" ;
    Text [ danish ] = "Kontrolelementlinje" ;
    Text [ italian ] = "Barra dei campi di controllo" ;
    Text [ spanish ] = "Barra de campos de control" ;
    Text [ french ] = "Barre de contrôles" ;
    Text [ dutch ] = "Controleveldbalk" ;
    Text[ chinese_simplified ] = "¿ØÖÆ×Ö¶ÎÀ¸";
    Text[ russian ] = "Ïàíåëü ýëåìåíòîâ óïðàâëåíèÿ";
    Text[ polish ] = "Pasek pól kontrolnych";
    Text[ japanese ] = "ºÝÄÛ°ÙÊÞ°";
    Text[ chinese_traditional ] = "±±¨î¶µ¦C";
    Text[ arabic ] = "ÔÑíØ ÚäÇÕÑ ÇáÊÍßã";
    Text[ dutch ] = "Controleveldbalk";
    Text[ chinese_simplified ] = "¿ØÖÆ×Ö¶ÎÀ¸";
    Text[ greek ] = "ÃñáììÞ åëÝã÷ïõ ðåäßùí";
    Text[ korean ] = "ÄÁÆ®·Ñ ¸ðÀ½";
    Text[ turkish ] = "Komut alaný çubuðu";
    Text[ language_user1 ] = " ";
};
ToolBox RID_DRAWFORM_TOOLBOX
{
    HelpID = HID_DRAWFORM_TOOLBOX ;
    Border = TRUE ;
    SVLook = TRUE ;
    Dockable = TRUE ;
    Moveable = TRUE ;
    Sizeable = TRUE ;
    Closeable = TRUE ;
    Zoomable = TRUE ;
    LineSpacing = TRUE ;
    HideWhenDeactivate = TRUE ;
    Customize = TRUE ;
    MenuStrings = TRUE ;
    Hide = TRUE ;
    Scroll = TRUE ;
    ItemList =
    {
        ToolBoxItem
        {
            Identifier = FN_TOOL_ANKER ;
            HelpID = FN_TOOL_ANKER ;
            DropDown = TRUE ;
        };
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            Identifier = SID_ATTR_TRANSFORM ;
            HelpID = SID_ATTR_TRANSFORM ;
        };
        ToolBoxItem
        {
            Identifier = SID_FM_CTL_PROPERTIES ;
            HelpID = SID_FM_CTL_PROPERTIES ;
        };
        ToolBoxItem
        {
            Identifier = SID_FM_PROPERTIES ;
            HelpID = SID_FM_PROPERTIES ;
        };
        ToolBoxItem
        {
            Identifier = SID_FM_SHOW_FMEXPLORER ;
            HelpID = SID_FM_SHOW_FMEXPLORER ;
        };
        ToolBoxItem
        {
            Identifier = SID_FM_TAB_DIALOG ;
            HelpID = SID_FM_TAB_DIALOG ;
        };
        ToolBoxItem
        {
            Identifier = SID_FM_ADD_FIELD ;
            HelpID = SID_FM_ADD_FIELD ;
        };
        ToolBoxItem
        {
            Identifier = SID_FM_DESIGN_MODE ;
            HelpID = SID_FM_DESIGN_MODE ;
        };
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        MN_LAYER
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            Identifier = SID_GROUP ;
            HelpID = SID_GROUP ;
        };
        ToolBoxItem
        {
            Identifier = SID_UNGROUP ;
            HelpID = SID_UNGROUP ;
        };
        ToolBoxItem
        {
            Identifier = SID_ENTER_GROUP ;
            HelpID = SID_ENTER_GROUP ;
        };
        ToolBoxItem
        {
            Identifier = SID_LEAVE_GROUP ;
            HelpID = SID_LEAVE_GROUP ;
        };
        MN_GRID( HIDE=FALSE )
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            Identifier = SID_OBJECT_ALIGN ;
            HelpID = SID_OBJECT_ALIGN ;
            DropDown = TRUE ;
        };
    };
};
String RID_BEZIER_TOOLBOX
{
    Text = "Bezierobjektleiste" ;
    Text [ English ] = "Bezier objectbar" ;
    Text [ english_us ] = "Bézier object bar" ;
    Text [ swedish ] = "Bézierobjektlist" ;
    Text [ danish ] = "Bezierobjektlinje" ;
    Text [ italian ] = "Barra degli oggetti di Bézier" ;
    Text [ spanish ] = "Barra de objetos Bézier" ;
    Text [ french ] = "Barre d'objets Bézier" ;
    Text [ dutch ] = "Bézierobjectbalk" ;
    Text [ portuguese ] = "Barra de objectos Bézier" ;
    Text [ portuguese_brazilian ] = "Bezierobjektleiste" ;
    Text[ chinese_simplified ] = "ÇúÏß¶ÔÏóÀ¸";
    Text[ russian ] = "Ïàíåëü îáúåêòîâ Áåçüå";
    Text[ polish ] = "Pasek obiektów Beziera";
    Text[ japanese ] = "ÍÞ¼Þª‹ÈüµÌÞ¼Þª¸ÄÊÞ°";
    Text[ chinese_traditional ] = "¦±½uª«¥ó¦C";
    Text[ arabic ] = "ÔÑíØ ßÇÆäÇÊ Bézier";
    Text[ dutch ] = "Bézierobjectbalk";
    Text[ chinese_simplified ] = "ÇúÏß¶ÔÏóÀ¸";
    Text[ greek ] = "ÃñáììÞ áíôéêåéìÝíùí Bezier";
    Text[ korean ] = "º£Áö¾î °³Ã¼ ¸ðÀ½";
    Text[ turkish ] = "Bezier nesne çubuðu";
    Text[ language_user1 ] = " ";
};
ToolBox RID_BEZIER_TOOLBOX
{
    HelpID = HID_BEZIER_TOOLBOX ;
    Border = TRUE ;
    SVLook = TRUE ;
    Dockable = TRUE ;
    Moveable = TRUE ;
    Sizeable = TRUE ;
    Closeable = TRUE ;
    Zoomable = TRUE ;
    LineSpacing = TRUE ;
    HideWhenDeactivate = TRUE ;
    Customize = TRUE ;
    MenuStrings = TRUE ;
    Hide = TRUE ;
    ItemList =
    {
        ToolBoxItem
        {
            Identifier = SID_BEZIER_EDIT ;
            HelpID = SID_BEZIER_EDIT ;
        };
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            Identifier = SID_BEZIER_MOVE ;
            HelpID = SID_BEZIER_MOVE ;
            RadioCheck = TRUE ;
        };
        ToolBoxItem
        {
            Identifier = SID_BEZIER_INSERT ;
            HelpID = SID_BEZIER_INSERT ;
            RadioCheck = TRUE ;
        };
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            Identifier = SID_BEZIER_DELETE ;
            HelpID = SID_BEZIER_DELETE ;
        };
        ToolBoxItem
        {
            Identifier = SID_BEZIER_CUTLINE ;
            HelpID = SID_BEZIER_CUTLINE ;
        };
        ToolBoxItem
        {
            Identifier = SID_BEZIER_CONVERT ;
            HelpID = SID_BEZIER_CONVERT ;
        };
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            Identifier = SID_BEZIER_EDGE ;
            HelpID = SID_BEZIER_EDGE ;
            RadioCheck = TRUE ;
        };
        ToolBoxItem
        {
            Identifier = SID_BEZIER_SMOOTH ;
            HelpID = SID_BEZIER_SMOOTH ;
            RadioCheck = TRUE ;
        };
        ToolBoxItem
        {
            Identifier = SID_BEZIER_SYMMTR ;
            HelpID = SID_BEZIER_SYMMTR ;
            RadioCheck = TRUE ;
        };
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            Identifier = SID_BEZIER_CLOSE ;
            HelpID = SID_BEZIER_CLOSE ;
        };
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            Identifier = SID_BEZIER_ELIMINATE_POINTS ;
            HelpID = SID_BEZIER_ELIMINATE_POINTS ;
        };
    };
    Scroll = TRUE ;
};
String RID_DRAW_TEXT_TOOLBOX
{
    Text = "Textobjektleiste" ;
    Text [ English ] = "Text objectbar" ;
    Text [ norwegian ] = "Tegne tekstmodus" ;
    Text [ italian ] = "Barra degli oggetti di testo" ;
    Text [ portuguese_brazilian ] = "Modo desenhar texto" ;
    Text [ portuguese ] = "Barra de objectos de texto" ;
    Text [ finnish ] = "Piirroksen tekstitila" ;
    Text [ danish ] = "Tekstobjektlinje" ;
    Text [ french ] = "Barre d'objets de texte" ;
    Text [ swedish ] = "Textobjektlist" ;
    Text [ dutch ] = "Tekstobjectbalk" ;
    Text [ spanish ] = "Barra de objetos de texto" ;
    Text [ english_us ] = "Text Object Bar" ;
    Text[ chinese_simplified ] = "ÎÄ×Ö¶ÔÏóÀ¸";
    Text[ russian ] = "Ïàíåëü îáúåêòîâ òåêñòà";
    Text[ polish ] = "Pasek obiektów tekstowych";
    Text[ japanese ] = "÷½ÄµÌÞ¼Þª¸ÄÊÞ°";
    Text[ chinese_traditional ] = "¤å¦rª«¥ó¦C";
    Text[ arabic ] = "ÔÑíØ ßÇÆäÇÊ ÇáäÕ";
    Text[ dutch ] = "Tekstobjectbalk";
    Text[ chinese_simplified ] = "ÎÄ×Ö¶ÔÏóÀ¸";
    Text[ greek ] = "ÃñáììÞ áíôéêåéìÝíùí êåéìÝíïõ";
    Text[ korean ] = "ÅØ½ºÆ® °³Ã¼ ¸ðÀ½";
    Text[ turkish ] = "Metin nesne çubuðu";
    Text[ language_user1 ] = " ";
};
ToolBox RID_DRAW_TEXT_TOOLBOX
{
    HelpID = HID_DRAW_TEXT_TOOLBOX ;
    Border = TRUE ;
    Customize = TRUE ;
    SVLook = TRUE ;
    Dockable = TRUE ;
    Moveable = TRUE ;
    Sizeable = TRUE ;
    Closeable = TRUE ;
    Zoomable = TRUE ;
    LineSpacing = TRUE ;
    HideWhenDeactivate = TRUE ;
    MenuStrings = TRUE ;
    Hide = TRUE ;
    ItemList =
    {
        MN_FONT
        MN_TEXT1(FALSE)
        MN_TEXT1_BLOCK
        MN_TEXT_LINESPACE
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            ITEM_TOOLBAR_ATTR_CHAR_COLOR
            Hide = TRUE;
        };
        MN_TEXT_DIALOGS(FALSE)
    };
    Scroll = TRUE ;
};
String RID_NUM_TOOLBOX
{
    Text = "Nummerierungsobjektleiste" ;
    Text [ English ] = "Outlining objectbar" ;
    Text [ norwegian ] = "+++Outlining" ;
    Text [ italian ] = "Barra degli oggetti per la numerazione" ;
    Text [ portuguese_brazilian ] = "Vazado" ;
    Text [ portuguese ] = "Barra de objectos de numeração" ;
    Text [ finnish ] = "Jäsennys" ;
    Text [ danish ] = "Nummereringsobjektlinje" ;
    Text [ french ] = "Barre d'objets de numérotation" ;
    Text [ swedish ] = "Numreringsobjektlist" ;
    Text [ dutch ] = "Nummeringsobjectbalk" ;
    Text [ spanish ] = "Barra de objetos de numeración" ;
    Text [ english_us ] = "Numbering Object Bar" ;
    Text[ chinese_simplified ] = "±àºÅ¶ÔÏóÀ¸";
    Text[ russian ] = "Ïàíåëü îáúåêòîâ íóìåðàöèè";
    Text[ polish ] = "Pasek obiektów numeracji";
    Text[ japanese ] = "”ԍ†•t‚¯µÌÞ¼Þª¸ÄÊÞ°";
    Text[ chinese_traditional ] = "½s¸¹ª«¥ó¦C";
    Text[ arabic ] = "ÔÑíØ ßÇÆäÇÊ ÇáÊÑÞíã";
    Text[ dutch ] = "Nummeringsobjectbalk";
    Text[ chinese_simplified ] = "±àºÅ¶ÔÏóÀ¸";
    Text[ greek ] = "ÃñáììÞ áíôéêåéìÝíùí áñßèìçóçò";
    Text[ korean ] = "¹øÈ£ °³Ã¼ ¸ðÀ½";
    Text[ turkish ] = "Numaralama nesne çubuðu";
    Text[ language_user1 ] = " ";
};
ToolBox RID_NUM_TOOLBOX
{
    HelpID = HID_NUM_TOOLBOX ;
    Border = TRUE ;
    SVLook = TRUE ;
    Dockable = TRUE ;
    Moveable = TRUE ;
    Sizeable = TRUE ;
    Closeable = TRUE ;
    Zoomable = TRUE ;
    LineSpacing = TRUE ;
    HideWhenDeactivate = TRUE ;
    Customize = TRUE ;
    MenuStrings = TRUE ;
    Hide = TRUE ;
    ItemList =
    {
        MN_TEMPLATE
        MN_FONT
        ToolBoxItem
        {
            Identifier = FN_NUM_BULLET_OFF ;
            HelpID = FN_NUM_BULLET_OFF ;
        };
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            Identifier = FN_NUM_BULLET_UP ;
            HelpID = FN_NUM_BULLET_UP ;
        };
        ToolBoxItem
        {
            Identifier = FN_NUM_BULLET_DOWN ;
            HelpID = FN_NUM_BULLET_DOWN ;
        };
        ToolBoxItem
        {
            Identifier = FN_NUM_BULLET_OUTLINE_UP ;
            HelpID = FN_NUM_BULLET_OUTLINE_UP ;
        };
        ToolBoxItem
        {
            Identifier = FN_NUM_BULLET_OUTLINE_DOWN ;
        };
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            Identifier = FN_NUM_BULLET_NONUM ;
            HelpID = FN_NUM_BULLET_NONUM ;
        };
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            Identifier = FN_NUM_BULLET_MOVEUP ;
            HelpID = FN_NUM_BULLET_MOVEUP ;
        };
        ToolBoxItem
        {
            Identifier = FN_NUM_BULLET_MOVEDOWN ;
            HelpID = FN_NUM_BULLET_MOVEDOWN ;
        };
        ToolBoxItem
        {
            Identifier = FN_NUM_BULLET_OUTLINE_MOVEUP ;
            HelpID = FN_NUM_BULLET_OUTLINE_MOVEUP ;
        };
        ToolBoxItem
        {
            Identifier = FN_NUM_BULLET_OUTLINE_MOVEDOWN ;
            HelpID = FN_NUM_BULLET_OUTLINE_MOVEDOWN ;
        };
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            Identifier = FN_NUMBER_NEWSTART ;
            HelpID = FN_NUMBER_NEWSTART ;
        };
        ToolBoxItem
        {
            Identifier = FN_NUMBER_BULLETS ;
            HelpID = FN_NUMBER_BULLETS ;
        };
    };
    Scroll = TRUE ;
};
String STR_SHELLNAME_TEXT
{
    Text = "Text" ;
    Text [ ENGLISH ] = "Text" ;
    Text [ dutch ] = "Tekst" ;
    Text [ english_us ] = "Text" ;
    Text [ italian ] = "Testo" ;
    Text [ spanish ] = "Texto" ;
    Text [ french ] = "Texte" ;
    Text [ swedish ] = "Text" ;
    Text [ danish ] = "Tekst" ;
    Text [ portuguese_brazilian ] = "Text" ;
    Text [ portuguese ] = "Texto" ;
    Text[ chinese_simplified ] = "ÎÄ×Ö";
    Text[ russian ] = "Òåêñò";
    Text[ polish ] = "Tekst";
    Text[ japanese ] = "÷½Ä";
    Text[ chinese_traditional ] = "¤å¦r";
    Text[ arabic ] = "äÕ";
    Text[ dutch ] = "Tekst";
    Text[ chinese_simplified ] = "ÎÄ×Ö";
    Text[ greek ] = "Êåßìåíï";
    Text[ korean ] = "ÅØ½ºÆ®";
    Text[ turkish ] = "Metin";
    Text[ language_user1 ] = " ";
};
String STR_SHELLNAME_TABLE
{
    Text = "Tabelle" ;
    Text [ ENGLISH ] = "Table" ;
    Text [ dutch ] = "Tabel" ;
    Text [ english_us ] = "Table" ;
    Text [ italian ] = "Tabella" ;
    Text [ spanish ] = "Tabla" ;
    Text [ french ] = "Tableau" ;
    Text [ swedish ] = "Tabell" ;
    Text [ danish ] = "Tabel" ;
    Text [ portuguese_brazilian ] = "Tabelle" ;
    Text [ portuguese ] = "Tabela" ;
    Text[ chinese_simplified ] = "±í¸ñ";
    Text[ russian ] = "Òàáëèöà";
    Text[ polish ] = "Tabela";
    Text[ japanese ] = "ðÌÞÙ";
    Text[ chinese_traditional ] = "ªí®æ";
    Text[ arabic ] = "ÌÏæá";
    Text[ dutch ] = "Tabel";
    Text[ chinese_simplified ] = "±í¸ñ";
    Text[ greek ] = "Ðßíáêáò";
    Text[ korean ] = "ǥ";
    Text[ turkish ] = "Tablo";
    Text[ language_user1 ] = " ";
};
String STR_SHELLNAME_FRAME
{
    Text = "Rahmen" ;
    Text [ ENGLISH ] = "Frame" ;
    Text [ dutch ] = "Kader" ;
    Text [ english_us ] = "Frame" ;
    Text [ italian ] = "Cornice" ;
    Text [ spanish ] = "Marco" ;
    Text [ french ] = "Cadre" ;
    Text [ swedish ] = "Ram" ;
    Text [ danish ] = "Ramme" ;
    Text [ portuguese_brazilian ] = "Rahmen" ;
    Text [ portuguese ] = "Moldura" ;
    Text[ chinese_simplified ] = "¿ò";
    Text[ russian ] = "Òåêñòîâîå ïîëå";
    Text[ polish ] = "Ramka";
    Text[ japanese ] = "˜g";
    Text[ chinese_traditional ] = "¤å¦r¤è¶ô";
    Text[ arabic ] = "ÅØÇÑ";
    Text[ dutch ] = "Kader";
    Text[ chinese_simplified ] = "¿ò";
    Text[ greek ] = "Ðåñßãñáììá";
    Text[ korean ] = "ÇÁ·¹ÀÓ";
    Text[ turkish ] = "Çerçeve";
    Text[ language_user1 ] = " ";
};
String STR_SHELLNAME_GRAPHIC
{
    Text = "Grafik" ;
    Text [ ENGLISH ] = "Graphic" ;
    Text [ english_us ] = "Graphics" ;
    Text [ italian ] = "Grafico" ;
    Text [ spanish ] = "Imagen" ;
    Text [ french ] = "Image" ;
    Text [ dutch ] = "Afbeelding" ;
    Text [ swedish ] = "Grafik" ;
    Text [ danish ] = "Billede" ;
    Text [ portuguese_brazilian ] = "Grafik" ;
    Text [ portuguese ] = "Imagem" ;
    Text[ chinese_simplified ] = "ͼÐÎ";
    Text[ russian ] = "Ðèñóíîê";
    Text[ polish ] = "Grafika";
    Text[ japanese ] = "}";
    Text[ chinese_traditional ] = "¹Ï¤ù";
    Text[ arabic ] = "ÕæÑÉ";
    Text[ dutch ] = "Afbeelding";
    Text[ chinese_simplified ] = "ͼÐÎ";
    Text[ greek ] = "Ãñáöéêü";
    Text[ korean ] = "±×·¡ÇÈ";
    Text[ turkish ] = "Grafik";
    Text[ language_user1 ] = " ";
};
String STR_SHELLNAME_OBJECT
{
    Text = "Objekt" ;
    Text [ ENGLISH ] = "Object" ;
    Text [ english_us ] = "Object" ;
    Text [ italian ] = "Oggetto" ;
    Text [ spanish ] = "Objeto" ;
    Text [ french ] = "Objet" ;
    Text [ dutch ] = "Object" ;
    Text [ swedish ] = "Objekt" ;
    Text [ danish ] = "Objekt" ;
    Text [ portuguese_brazilian ] = "Objekt" ;
    Text [ portuguese ] = "Objecto" ;
    Text[ chinese_simplified ] = "¶ÔÏó";
    Text[ russian ] = "Îáúåêò";
    Text[ polish ] = "Obiekt";
    Text[ japanese ] = "µÌÞ¼Þª¸Ä";
    Text[ chinese_traditional ] = "ª«¥ó";
    Text[ arabic ] = "ßÇÆä";
    Text[ dutch ] = "Object";
    Text[ chinese_simplified ] = "¶ÔÏó";
    Text[ greek ] = "Áíôéêåßìåíï";
    Text[ korean ] = "°³Ã¼";
    Text[ turkish ] = "Nesne";
    Text[ language_user1 ] = " ";
};
String STR_SHELLNAME_LIST
{
    Text = "Liste" ;
    Text [ ENGLISH ] = "List" ;
    Text [ dutch ] = "Lijst" ;
    Text [ english_us ] = "List" ;
    Text [ italian ] = "Elenco" ;
    Text [ spanish ] = "Lista" ;
    Text [ french ] = "Liste" ;
    Text [ swedish ] = "Lista" ;
    Text [ danish ] = "Liste" ;
    Text [ portuguese_brazilian ] = "Liste" ;
    Text [ portuguese ] = "Lista" ;
    Text[ chinese_simplified ] = "Áбí";
    Text[ russian ] = "Ñïèñîê";
    Text[ polish ] = "Lista";
    Text[ japanese ] = "ؽÄ";
    Text[ chinese_traditional ] = "²M³æ";
    Text[ arabic ] = "ÞÇÆãÉ";
    Text[ dutch ] = "Lijst";
    Text[ chinese_simplified ] = "Áбí";
    Text[ greek ] = "Ëßóôá";
    Text[ korean ] = "¸®½ºÆ®";
    Text[ turkish ] = "Liste";
    Text[ language_user1 ] = " ";
};
String STR_SHELLNAME_DRAW
{
    Text = "Zeichnung" ;
    Text [ ENGLISH ] = "Drawing" ;
    Text [ dutch ] = "Tekening" ;
    Text [ english_us ] = "Drawing" ;
    Text [ italian ] = "Disegno" ;
    Text [ spanish ] = "Dibujo" ;
    Text [ french ] = "Dessin" ;
    Text [ swedish ] = "Teckning" ;
    Text [ danish ] = "Tegning" ;
    Text [ portuguese_brazilian ] = "Zeichnung" ;
    Text [ portuguese ] = "Desenho" ;
    Text[ chinese_simplified ] = "»æÍ¼";
    Text[ russian ] = "Ðèñóíîê";
    Text[ polish ] = "Rysunek";
    Text[ japanese ] = "}Œ`•`‰æ";
    Text[ chinese_traditional ] = "ø¹Ï";
    Text[ arabic ] = "ÑÓã";
    Text[ dutch ] = "Tekening";
    Text[ chinese_simplified ] = "»æÍ¼";
    Text[ greek ] = "Ó÷Ýäéï";
    Text[ korean ] = "±×¸®±â";
    Text[ turkish ] = "Çizim";
    Text[ language_user1 ] = " ";
};
String STR_SHELLNAME_DRAWFORM
{
    Text = "Forms" ;
    Text [ ENGLISH ] = "Forms" ;
    Text [ english_us ] = "Forms" ;
    Text [ portuguese_brazilian ] = "Forms" ;
    Text [ swedish ] = "Forms" ;
    Text [ danish ] = "Formular" ;
    Text [ italian ] = "Forms" ;
    Text [ spanish ] = "Formularios" ;
    Text [ french ] = "Formulaires" ;
    Text [ dutch ] = "Forms" ;
    Text [ portuguese ] = "Formulários" ;
    Text[ chinese_simplified ] = "¹«Ê½";
    Text[ russian ] = "Ôîðìû";
    Text[ polish ] = "Kszta³ty";
    Text[ japanese ] = "Ì«°Ñ";
    Text[ chinese_traditional ] = "¤½¦¡";
    Text[ arabic ] = "äãÇÐÌ";
    Text[ dutch ] = "Forms";
    Text[ chinese_simplified ] = "¹«Ê½";
    Text[ greek ] = "Öüñìåò";
    Text[ korean ] = "¾ç½Ä";
    Text[ turkish ] = "Form";
    Text[ language_user1 ] = " ";
};
String STR_SHELLNAME_BEZIER
{
    Text = "Bezier" ;
    Text [ ENGLISH ] = "Bezier" ;
    Text [ english_us ] = "Bézier" ;
    Text [ portuguese_brazilian ] = "Bezier" ;
    Text [ swedish ] = "Bézier" ;
    Text [ danish ] = "Bezier" ;
    Text [ italian ] = "Bezier" ;
    Text [ spanish ] = "Bézier" ;
    Text [ french ] = "Bézier" ;
    Text [ dutch ] = "Bézier" ;
    Text [ portuguese ] = "Bézier" ;
    Text[ chinese_simplified ] = "ÇúÏß";
    Text[ russian ] = "Áåçüå";
    Text[ polish ] = "Bezier";
    Text[ japanese ] = "ÍÞ¼Þª‹Èü";
    Text[ chinese_traditional ] = "¦±½u";
    Text[ arabic ] = "Bézier";
    Text[ dutch ] = "Bézier";
    Text[ chinese_simplified ] = "ÇúÏß";
    Text[ greek ] = "Bezier";
    Text[ korean ] = "º£Áö¾î";
    Text[ turkish ] = "Bezier";
    Text[ language_user1 ] = " ";
};
String STR_SHELLNAME_DRAW_TEXT
{
    Text = "Zeichentext" ;
    Text [ ENGLISH ] = "Draw text" ;
    Text [ english_us ] = "Draw text" ;
    Text [ italian ] = "Testo di disegno" ;
    Text [ spanish ] = "Texto de diseño" ;
    Text [ french ] = "Texte dessiné" ;
    Text [ dutch ] = "Tekentekst" ;
    Text [ swedish ] = "Teckningstext" ;
    Text [ danish ] = "Tegnetekst" ;
    Text [ portuguese_brazilian ] = "Zeichentext" ;
    Text [ portuguese ] = "Texto de desenho" ;
    Text[ chinese_simplified ] = "»æÍ¼ÎÄ×Ö";
    Text[ russian ] = "Òåêñò ðèñóíêà";
    Text[ polish ] = "Tekst rysunku";
    Text[ japanese ] = "}Œ`•`‰æÃ·½Ä";
    Text[ chinese_traditional ] = "ø¹Ï¤å¦r";
    Text[ arabic ] = "äÕ ÑÓã";
    Text[ dutch ] = "Tekentekst";
    Text[ chinese_simplified ] = "»æÍ¼ÎÄ×Ö";
    Text[ greek ] = "Êåßìåíï ó÷åäßïõ";
    Text[ korean ] = "ÅØ½ºÆ® ±×¸®±â";
    Text[ turkish ] = "Çizim metni";
    Text[ language_user1 ] = " ";
};
 //Strings fuer Gallery/Hintergrund
String STR_SWBG_PARAGRAPH
{
    Text = "Absatz" ;
    Text [ ENGLISH ] = "Paragraph" ;
    Text [ english_us ] = "Paragraph" ;
    Text [ portuguese_brazilian ] = "Absatz" ;
    Text [ swedish ] = "Stycke" ;
    Text [ danish ] = "Afsnit" ;
    Text [ italian ] = "Paragrafo" ;
    Text [ spanish ] = "Párrafo" ;
    Text [ french ] = "Paragraphe" ;
    Text [ dutch ] = "Alinea" ;
    Text [ portuguese ] = "Parágrafo" ;
    Text[ chinese_simplified ] = "¶ÎÂä";
    Text[ russian ] = "Àáçàö";
    Text[ polish ] = "Akapit";
    Text[ japanese ] = "’i—Ž";
    Text[ chinese_traditional ] = "¬q¸¨";
    Text[ arabic ] = "ÝÞÑÉ";
    Text[ dutch ] = "Alinea";
    Text[ chinese_simplified ] = "¶ÎÂä";
    Text[ greek ] = "ÐáñÜãñáöïò";
    Text[ korean ] = "´Ü¶ô";
    Text[ turkish ] = "Paragraf";
    Text[ language_user1 ] = " ";
};
String STR_SWBG_GRAPHIC
{
    Text = "Grafik" ;
    Text [ ENGLISH ] = "Graphic" ;
    Text [ english_us ] = "Graphics" ;
    Text [ portuguese_brazilian ] = "Grafik" ;
    Text [ swedish ] = "Grafik" ;
    Text [ danish ] = "Billede" ;
    Text [ italian ] = "Immagine" ;
    Text [ spanish ] = "Imagen" ;
    Text [ french ] = "Image" ;
    Text [ dutch ] = "Afbeelding" ;
    Text [ portuguese ] = "Imagem" ;
    Text[ chinese_simplified ] = "ͼÐÎ";
    Text[ russian ] = "Ðèñóíîê";
    Text[ polish ] = "Grafika";
    Text[ japanese ] = "}";
    Text[ chinese_traditional ] = "¹Ï¤ù";
    Text[ arabic ] = "ÕæÑÉ";
    Text[ dutch ] = "Afbeelding";
    Text[ chinese_simplified ] = "ͼÐÎ";
    Text[ greek ] = "Ãñáöéêü";
    Text[ korean ] = "±×·¡ÇÈ";
    Text[ turkish ] = "Grafik";
    Text[ language_user1 ] = " ";
};
String STR_SWBG_OLE
{
    Text = "OLE Objekt" ;
    Text [ ENGLISH ] = "OLE Object" ;
    Text [ english_us ] = "OLE object" ;
    Text [ portuguese_brazilian ] = "OLE Objekt" ;
    Text [ swedish ] = "OLE-objekt" ;
    Text [ danish ] = "OLE-objekt" ;
    Text [ italian ] = "Oggetto OLE" ;
    Text [ spanish ] = "Objeto OLE" ;
    Text [ french ] = "Objet OLE" ;
    Text [ dutch ] = "OLE-object" ;
    Text [ portuguese ] = "Objecto OLE" ;
    Text[ chinese_simplified ] = "OLE ¶ÔÏó";
    Text[ russian ] = "Îáúåêò OLE";
    Text[ polish ] = "Obiekt OLE";
    Text[ japanese ] = "OLE µÌÞ¼Þª¸Ä";
    Text[ chinese_traditional ] = "OLE ª«¥ó";
    Text[ arabic ] = "ßÇÆä OLE";
    Text[ dutch ] = "OLE-object";
    Text[ chinese_simplified ] = "OLE ¶ÔÏó";
    Text[ greek ] = "Áíôéêåßìåíï OLE";
    Text[ korean ] = "OLE °³Ã¼";
    Text[ turkish ] = "OLE nesnesi";
    Text[ language_user1 ] = " ";
};
String STR_SWBG_FRAME
{
    Text = "Rahmen" ;
    Text [ ENGLISH ] = "Frame" ;
    Text [ english_us ] = "Frame" ;
    Text [ portuguese_brazilian ] = "Rahmen" ;
    Text [ swedish ] = "Ram" ;
    Text [ danish ] = "Ramme" ;
    Text [ italian ] = "Cornice" ;
    Text [ spanish ] = "Marco" ;
    Text [ french ] = "Cadre" ;
    Text [ dutch ] = "Kader" ;
    Text [ portuguese ] = "Moldura" ;
    Text[ chinese_simplified ] = "¿ò";
    Text[ russian ] = "Òåêñòîâîå ïîëå";
    Text[ polish ] = "Ramka";
    Text[ japanese ] = "˜g";
    Text[ chinese_traditional ] = "¤å¦r¤è¶ô";
    Text[ arabic ] = "ÅØÇÑ";
    Text[ dutch ] = "Kader";
    Text[ chinese_simplified ] = "¿ò";
    Text[ greek ] = "Ðåñßãñáììá";
    Text[ korean ] = "ÇÁ·¹ÀÓ";
    Text[ turkish ] = "Çerçeve";
    Text[ language_user1 ] = " ";
};
String STR_SWBG_TABLE
{
    Text = "Tabelle" ;
    Text [ ENGLISH ] = "Table" ;
    Text [ english_us ] = "Table" ;
    Text [ portuguese_brazilian ] = "Tabelle" ;
    Text [ swedish ] = "Tabell" ;
    Text [ danish ] = "Tabel" ;
    Text [ italian ] = "Tabella" ;
    Text [ spanish ] = "Tabla" ;
    Text [ french ] = "Tableau" ;
    Text [ dutch ] = "Tabel" ;
    Text [ portuguese ] = "Tabela" ;
    Text[ chinese_simplified ] = "±í¸ñ";
    Text[ russian ] = "Òàáëèöà";
    Text[ polish ] = "Tabela";
    Text[ japanese ] = "ðÌÞÙ";
    Text[ chinese_traditional ] = "ªí®æ";
    Text[ arabic ] = "ÌÏæá";
    Text[ dutch ] = "Tabel";
    Text[ chinese_simplified ] = "±í¸ñ";
    Text[ greek ] = "Ðßíáêáò";
    Text[ korean ] = "ǥ";
    Text[ turkish ] = "Tablo";
    Text[ language_user1 ] = " ";
};
String STR_SWBG_TABLE_ROW
{
    Text = "Tabellenzeile" ;
    Text [ ENGLISH ] = "Tablerow" ;
    Text [ english_us ] = "Table row" ;
    Text [ portuguese_brazilian ] = "Tabellenzeile" ;
    Text [ swedish ] = "Tabellrad" ;
    Text [ danish ] = "Tabelrække" ;
    Text [ italian ] = "Riga" ;
    Text [ spanish ] = "Fila de la tabla" ;
    Text [ french ] = "Ligne de table" ;
    Text [ dutch ] = "Tabelrij" ;
    Text [ portuguese ] = "Linha de tabela" ;
    Text[ chinese_simplified ] = "¹¤×÷±íµ¥Ôª¸ñ";
    Text[ russian ] = "Ñòðîêà òàáëèöû";
    Text[ polish ] = "Wiersz tabeli";
    Text[ japanese ] = "•\\‚̍s";
    Text[ chinese_traditional ] = "¤u§@ªíÀx¦s®æ";
    Text[ arabic ] = "ÕÝ ÌÏæá";
    Text[ dutch ] = "Tabelrij";
    Text[ chinese_simplified ] = "¹¤×÷±íµ¥Ôª¸ñ";
    Text[ greek ] = "ÃñáììÞ ðßíáêá";
    Text[ korean ] = "Ç¥ Çà";
    Text[ turkish ] = "Tablo satýrý";
    Text[ language_user1 ] = " ";
};
String STR_SWBG_TABLE_CELL
{
    Text = "Tabellenzelle" ;
    Text [ ENGLISH ] = "Tablecell" ;
    Text [ english_us ] = "Table cell" ;
    Text [ portuguese_brazilian ] = "Tabellenzelle" ;
    Text [ swedish ] = "Tabellcell" ;
    Text [ danish ] = "Tabelcelle" ;
    Text [ italian ] = "Cella" ;
    Text [ spanish ] = "Celda de la tabla" ;
    Text [ french ] = "Cellule de table" ;
    Text [ dutch ] = "Tabelcel" ;
    Text [ portuguese ] = "Célula de tabela" ;
    Text[ chinese_simplified ] = "¹¤×÷±íµ¥Ôª¸ñ";
    Text[ russian ] = "ß÷åéêà òàáëèöû";
    Text[ polish ] = "Komórka tabeli";
    Text[ japanese ] = "ðÌÞق̾Ù";
    Text[ chinese_traditional ] = "¤u§@ªíÀx¦s®æ";
    Text[ arabic ] = "ÎáíÉ ÌÏæá";
    Text[ dutch ] = "Tabelcel";
    Text[ chinese_simplified ] = "¹¤×÷±íµ¥Ôª¸ñ";
    Text[ greek ] = "Êåëß ðßíáêá";
    Text[ korean ] = "Ç¥ ¼¿";
    Text[ turkish ] = "Tablo hücresi";
    Text[ language_user1 ] = " ";
};
String STR_SWBG_PAGE
{
    Text = "Seite" ;
    Text [ ENGLISH ] = "Page" ;
    Text [ english_us ] = "Page" ;
    Text [ portuguese_brazilian ] = "Seite" ;
    Text [ swedish ] = "Sida" ;
    Text [ danish ] = "Side" ;
    Text [ italian ] = "Pagina" ;
    Text [ spanish ] = "Página" ;
    Text [ french ] = "Page" ;
    Text [ dutch ] = "Pagina" ;
    Text [ portuguese ] = "Página" ;
    Text[ chinese_simplified ] = "ҳ";
    Text[ russian ] = "Ñòðàíèöà";
    Text[ polish ] = "Strona";
    Text[ japanese ] = "Íß°¼Þ";
    Text[ chinese_traditional ] = "­¶";
    Text[ arabic ] = "ÕÝÍÉ";
    Text[ dutch ] = "Pagina";
    Text[ chinese_simplified ] = "ҳ";
    Text[ greek ] = "Óåëßäá";
    Text[ korean ] = "ÆäÀÌÁö";
    Text[ turkish ] = "Sayfa";
    Text[ language_user1 ] = " ";
};
String STR_SWBG_HEADER
{
    Text = "Kopfzeile" ;
    Text [ ENGLISH ] = "Header" ;
    Text [ english_us ] = "Header" ;
    Text [ portuguese_brazilian ] = "Kopfzeile" ;
    Text [ swedish ] = "Sidhuvud" ;
    Text [ danish ] = "Sidehoved" ;
    Text [ italian ] = "Riga d'intestazione" ;
    Text [ spanish ] = "Encabezamiento" ;
    Text [ french ] = "En-tête" ;
    Text [ dutch ] = "Koptekst" ;
    Text [ portuguese ] = "Cabeçalho" ;
    Text[ chinese_simplified ] = "ҳü";
    Text[ russian ] = "Âåðõíèé êîëîíòèòóë";
    Text[ polish ] = "Nag³ówek";
    Text[ japanese ] = "ͯÀÞ";
    Text[ chinese_traditional ] = "­¶­º";
    Text[ arabic ] = "ÑÃÓ ÇáÕÝÍÉ";
    Text[ dutch ] = "Koptekst";
    Text[ chinese_simplified ] = "ҳü";
    Text[ greek ] = "Êåöáëßäá";
    Text[ korean ] = "¸Ó¸®±Û";
    Text[ turkish ] = "Üstbilgi";
    Text[ language_user1 ] = " ";
};
String STR_SWBG_FOOTER
{
    Text = "Fußzeile" ;
    Text [ ENGLISH ] = "Footer" ;
    Text [ english_us ] = "Footer" ;
    Text [ portuguese_brazilian ] = "Fußzeile" ;
    Text [ swedish ] = "Sidfot" ;
    Text [ danish ] = "Sidefod" ;
    Text [ italian ] = "Piè di pagina" ;
    Text [ spanish ] = "Pie de página" ;
    Text [ french ] = "Pied de page" ;
    Text [ dutch ] = "Voettekst" ;
    Text [ portuguese ] = "Rodapé" ;
    Text[ chinese_simplified ] = "Ò³½Å";
    Text[ russian ] = "Íèæíèé êîëîíòèòóë";
    Text[ polish ] = "Stopka";
    Text[ japanese ] = "‹r’";
    Text[ chinese_traditional ] = "­¶§À";
    Text[ arabic ] = "ÊÐííá ÇáÕÝÍÉ";
    Text[ dutch ] = "Voettekst";
    Text[ chinese_simplified ] = "Ò³½Å";
    Text[ greek ] = "ÕðïóÝëéäï";
    Text[ korean ] = "¹Ù´Ú±Û";
    Text[ turkish ] = "Altbilgi";
    Text[ language_user1 ] = " ";
};
 //Ende: Strings fuer Gallery/Hintergrund

diff --git a/sw/source/ui/shells/slotadd.cxx b/sw/source/ui/shells/slotadd.cxx
new file mode 100644
index 0000000..196bf43
--- /dev/null
+++ b/sw/source/ui/shells/slotadd.cxx
@@ -0,0 +1,423 @@
/*************************************************************************
 *
 *  $RCSfile: slotadd.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:47 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif
#pragma hdrstop

#include "hintids.hxx"
#include "uiitems.hxx"
#include "uiparam.hxx"
#include "cmdid.h"

#ifndef _AEITEM_HXX //autogen
#include <svtools/aeitem.hxx>
#endif
#ifndef _SFXRECTITEM_HXX //autogen
#include <svtools/rectitem.hxx>
#endif
#ifndef _SFX_OBJITEM_HXX //autogen
#include <sfx2/objitem.hxx>
#endif
#ifndef _SFX_DBCOLL_HXX //autogen
#include <offmgr/dbcoll.hxx>
#endif
#ifndef _SVX_RULRITEM_HXX //autogen
#include <svx/rulritem.hxx>
#endif
#ifndef _IDETEMP_HXX //autogen
#include <basctl/idetemp.hxx>
#endif
#ifndef _SVX_ZOOMITEM_HXX //autogen
#include <svx/zoomitem.hxx>
#endif
#ifndef _SVX_HLNKITEM_HXX //autogen
#include <svx/hlnkitem.hxx>
#endif
#ifndef _SFXPTITEM_HXX //autogen
#include <svtools/ptitem.hxx>
#endif
#ifndef _SVX_PAGEITEM_HXX //autogen
#include <svx/pageitem.hxx>
#endif
#ifndef _SVX_SRCHITEM_HXX //autogen
#include <svx/srchitem.hxx>
#endif
#ifndef _SFX_TPLPITEM_HXX //autogen
#include <sfx2/tplpitem.hxx>
#endif
#ifndef _SVX_WRLMITEM_HXX //autogen
#include <svx/wrlmitem.hxx>
#endif
#ifndef _SVX_PROTITEM_HXX //autogen
#include <svx/protitem.hxx>
#endif
#ifndef _SVX_OPAQITEM_HXX //autogen
#include <svx/opaqitem.hxx>
#endif
#ifndef _SVX_TSTPITEM_HXX //autogen
#include <svx/tstpitem.hxx>
#endif
#ifndef _SVX_AKRNITEM_HXX //autogen
#include <svx/akrnitem.hxx>
#endif
#ifndef _SVX_KEEPITEM_HXX //autogen
#include <svx/keepitem.hxx>
#endif
#ifndef _SVX_KERNITEM_HXX //autogen
#include <svx/kernitem.hxx>
#endif
#ifndef _SVX_SPLTITEM_HXX //autogen
#include <svx/spltitem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _SVX_WGHTITEM_HXX //autogen
#include <svx/wghtitem.hxx>
#endif
#ifndef _SVX_SHADITEM_HXX //autogen
#include <svx/shaditem.hxx>
#endif
#ifndef _SVX_PBINITEM_HXX //autogen
#include <svx/pbinitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _SVX_PRNTITEM_HXX //autogen
#include <svx/prntitem.hxx>
#endif
#ifndef _SVX_ORPHITEM_HXX //autogen
#include <svx/orphitem.hxx>
#endif
#ifndef _SVX_WIDWITEM_HXX //autogen
#include <svx/widwitem.hxx>
#endif
#ifndef _SVX_BOLNITEM_HXX //autogen
#include <svx/bolnitem.hxx>
#endif
#ifndef _SVX_PMDLITEM_HXX //autogen
#include <svx/pmdlitem.hxx>
#endif
#ifndef _SVX_CMAPITEM_HXX //autogen
#include <svx/cmapitem.hxx>
#endif
#ifndef _SVX_LANGITEM_HXX //autogen
#include <svx/langitem.hxx>
#endif
#ifndef _SVX_BRKITEM_HXX //autogen
#include <svx/brkitem.hxx>
#endif
#ifndef _SVX_HYZNITEM_HXX //autogen
#include <svx/hyznitem.hxx>
#endif
#ifndef _SVX_ESCPITEM_HXX //autogen
#include <svx/escpitem.hxx>
#endif
#ifndef _SVX_LSPCITEM_HXX //autogen
#include <svx/lspcitem.hxx>
#endif
#ifndef _SVX_ADJITEM_HXX //autogen
#include <svx/adjitem.hxx>
#endif
#ifndef _SVX_CRSDITEM_HXX //autogen
#include <svx/crsditem.hxx>
#endif
#ifndef _SVX_FONTITEM_HXX //autogen
#include <svx/fontitem.hxx>
#endif
#ifndef _SVX_SHDDITEM_HXX //autogen
#include <svx/shdditem.hxx>
#endif
#ifndef _SVX_UDLNITEM_HXX //autogen
#include <svx/udlnitem.hxx>
#endif
#ifndef _SVX_POSTITEM_HXX //autogen
#include <svx/postitem.hxx>
#endif
#ifndef _SVX_FHGTITEM_HXX //autogen
#include <svx/fhgtitem.hxx>
#endif
#ifndef _SVX_CNTRITEM_HXX //autogen
#include <svx/cntritem.hxx>
#endif
#ifndef _SVX_COLRITEM_HXX //autogen
#include <svx/colritem.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_SIZEITEM_HXX //autogen
#include <svx/sizeitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX__XGRADIENT_HXX //autogen
#include <svx/xgrad.hxx>
#endif
#ifndef _SVX_XLNSTIT_HXX //autogen
#include <svx/xlnstit.hxx>
#endif
#ifndef _SVX_XLNEDIT_HXX //autogen
#include <svx/xlnedit.hxx>
#endif
#ifndef SVX_XFILLIT0_HXX //autogen
#include <svx/xfillit0.hxx>
#endif
#ifndef _SVX_XFLCLIT_HXX //autogen
#include <svx/xflclit.hxx>
#endif
#ifndef _SVX_XFLGRIT_HXX //autogen
#include <svx/xflgrit.hxx>
#endif
#ifndef _SVX_XFLHTIT_HXX //autogen
#include <svx/xflhtit.hxx>
#endif
#ifndef _SVX_XBTMPIT_HXX //autogen
#include <svx/xbtmpit.hxx>
#endif
#ifndef _SVX_XLINEIT0_HXX //autogen
#include <svx/xlineit0.hxx>
#endif
#ifndef _SVX_XLNWTIT_HXX //autogen
#include <svx/xlnwtit.hxx>
#endif
#ifndef _SVX_XLNDSIT_HXX //autogen
#include <svx/xlndsit.hxx>
#endif
#ifndef _SVX_XLNCLIT_HXX //autogen
#include <svx/xlnclit.hxx>
#endif
#ifndef _SVX_TEXTIT0_HXX //autogen
#include <svx/xtextit0.hxx>
#endif
#ifndef _SVX_XFTADIT_HXX //autogen
#include <svx/xftadit.hxx>
#endif
#ifndef _SVX_XFTDIIT_HXX //autogen
#include <svx/xftdiit.hxx>
#endif
#ifndef _SVX_XFTSTIT_HXX //autogen
#include <svx/xftstit.hxx>
#endif
#ifndef _SVX_XFTMRIT_HXX //autogen
#include <svx/xftmrit.hxx>
#endif
#ifndef _SVX_XFTOUIT_HXX //autogen
#include <svx/xftouit.hxx>
#endif
#ifndef _SVX_XFTSHIT_HXX //autogen
#include <svx/xftshit.hxx>
#endif
#ifndef _SVX_XFTSHCLIT_HXX //autogen
#include <svx/xftshcit.hxx>
#endif
#ifndef _SVX_XFTSHXY_HXX //autogen
#include <svx/xftshxy.hxx>
#endif
#ifndef _SVX_XFTSFIT_HXX //autogen
#include <svx/xftsfit.hxx>
#endif


#ifndef _FMTORNT_HXX //autogen
#include <fmtornt.hxx>
#endif
#ifndef _PARATR_HXX //autogen
#include <paratr.hxx>
#endif
#ifndef _FMTINFMT_HXX //autogen
#include <fmtinfmt.hxx>
#endif
#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _FMTSRND_HXX //autogen
#include <fmtsrnd.hxx>
#endif
#include "frmatr.hxx"
#include "cfgitems.hxx"
#include "grfatr.hxx"


#ifndef PROFILE
// Code zum Initialisieren von Statics im eigenen Code-Segment
#pragma code_seg( "SWSTATICS" )
#endif

#define SwShadowItem  SvxShadowItem
#define SwPageSizeItem  SvxSizeItem
#define SwGraphicSizeItem  SvxSizeItem
#define SvxDrawToolItem  SfxEnumItem
#define SvxDrawAlignItem SfxEnumItem
#define SvxDrawBezierItem SfxEnumItem
#define SwPageLRSpaceItem SvxLRSpaceItem
#define SwPageULSpaceItem SvxULSpaceItem

#define SFX_TYPEMAP
#include "itemdef.hxx"
#include "swslots.hxx"

#ifndef PROFILE
#pragma code_seg()
#endif

/*-------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.36  2000/09/18 16:06:05  willem.vandorp
    OpenOffice header added.

    Revision 1.35  2000/09/04 11:44:07  tbe
    basicide, isetbrw, si, vcdlged moved from svx to basctl

    Revision 1.34  2000/08/02 08:04:34  jp
    changes for graphic attributes

    Revision 1.33  2000/07/31 19:25:39  jp
    new attributes for CJK/CTL and graphic

    Revision 1.32  1999/09/24 14:38:32  os
    hlnkitem.hxx now in SVX

    Revision 1.31  1998/04/23 10:30:04  OS
    PageLeft/Right/Top/BottomMargin #49761#


      Rev 1.30   23 Apr 1998 12:30:04   OS
   PageLeft/Right/Top/BottomMargin #49761#

      Rev 1.29   29 Nov 1997 15:52:54   MA
   includes

      Rev 1.28   24 Nov 1997 09:47:06   MA
   includes

      Rev 1.27   03 Nov 1997 13:55:42   MA
   precomp entfernt

      Rev 1.26   15 Aug 1997 11:48:38   OS
   chartar/frmatr/txtatr aufgeteilt

      Rev 1.25   11 Aug 1997 10:06:46   OS
   paraitem/frmitems/textitem aufgeteilt

      Rev 1.24   05 Aug 1997 16:29:08   TJ
   include svx/srchitem.hxx

      Rev 1.23   11 Apr 1997 10:34:48   TRI
   includes

      Rev 1.22   07 Apr 1997 16:45:24   OM
   HyperlinkItem recorden

      Rev 1.21   28 Feb 1997 12:47:12   MH
   Segmentierug mit WorkingSetTuner nun moeglich

      Rev 1.20   18 Feb 1997 16:56:40   OM
   dbcoll.hxx eingetragen

      Rev 1.19   11 Dec 1996 20:12:26   NF
   SvxDrawBezierItem dazu...

      Rev 1.18   19 Sep 1996 14:07:24   JP
   eigenes Segment fuer statische Objecte

      Rev 1.17   28 Aug 1996 15:55:04   OS
   includes

      Rev 1.16   15 Aug 1996 18:17:16   OS
   URL als Attribut - auch fuer die API

      Rev 1.15   26 Mar 1996 10:07:22   OS
   neu: SvxGraphicSizeItem-dummy

      Rev 1.14   25 Mar 1996 13:35:36   OS
   dummy SwPageSizeItem definiert

      Rev 1.13   21 Mar 1996 11:41:56   MA
   Umstellung SV311

      Rev 1.12   07 Mar 1996 08:08:54   OS
   jetzt auch mit PCH

      Rev 1.11   26 Jan 1996 11:20:40   OS
   +include sfxshobj.hxx

      Rev 1.10   16 Jan 1996 16:26:56   OS
   neu: SwShadowItem(nur ueberdefiniertes SvxShadowItem)

      Rev 1.9   08 Jan 1996 15:14:08   OS
   +include frmatr.hxx

      Rev 1.8   22 Dec 1995 15:09:20   OS
   +include adritem.hxx

      Rev 1.7   07 Dec 1995 18:25:56   OM
   Define fuer Enum-Slot

      Rev 1.6   04 Dec 1995 16:09:40   OS
   includes geaendert

 -------------------------------------------------------------------------*/


diff --git a/sw/source/ui/shells/tabsh.cxx b/sw/source/ui/shells/tabsh.cxx
new file mode 100644
index 0000000..66b2eb5
--- /dev/null
+++ b/sw/source/ui/shells/tabsh.cxx
@@ -0,0 +1,1575 @@
/*************************************************************************
 *
 *  $RCSfile: tabsh.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:47 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _UIPARAM_HXX
#include <uiparam.hxx>
#endif
#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _ZFORLIST_HXX
#define _ZFORLIST_DECLARE_TABLE
#include <svtools/zforlist.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _SFX_WHITER_HXX //autogen
#include <svtools/whiter.hxx>
#endif
#ifndef _SVX_RULRITEM_HXX //autogen
#include <svx/rulritem.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _SVX_SRCHITEM_HXX
#include <svx/srchitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_SHADITEM_HXX //autogen
#include <svx/shaditem.hxx>
#endif
#ifndef _SVX_SPLTITEM_HXX //autogen
#include <svx/spltitem.hxx>
#endif
#ifndef _SVX_LANGITEM_HXX //autogen
#include <svx/langitem.hxx>
#endif
#ifndef _SVX_KEEPITEM_HXX //autogen
#include <svx/keepitem.hxx>
#endif
#ifndef _SVX_BOLNITEM_HXX //autogen
#include <svx/bolnitem.hxx>
#endif
#ifndef _SVX_COLRITEM_HXX //autogen
#include <svx/colritem.hxx>
#endif
#ifndef _SVX_NUMINF_HXX //autogen
#include <svx/numinf.hxx>
#endif
#ifndef _ZFORMAT_HXX //autogen
#include <svtools/zformat.hxx>
#endif
#ifndef _SFX_SAVEOPT_HXX //autogen
#include <sfx2/saveopt.hxx>
#endif
#ifndef _SFX_BINDINGS_HXX //autogen
#include <sfx2/bindings.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SFXOBJFACE_HXX //autogen
#include <sfx2/objface.hxx>
#endif


#ifndef _FMTORNT_HXX //autogen
#include <fmtornt.hxx>
#endif
#ifndef _FMTCLDS_HXX //autogen
#include <fmtclds.hxx>
#endif
#ifndef _FMTTSPLT_HXX //autogen
#include <fmtlsplt.hxx>
#endif
#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _WVIEW_HXX
#include <wview.hxx>
#endif
#ifndef _FRMATR_HXX
#include <frmatr.hxx>
#endif
#ifndef _UITOOL_HXX
#include <uitool.hxx>
#endif
#ifndef _INPUTWIN_HXX
#include <inputwin.hxx>
#endif
#ifndef _UIITEMS_HXX
#include <uiitems.hxx>
#endif
#ifndef _USRPREF_HXX
#include <usrpref.hxx>
#endif
#ifndef _TABSH_HXX
#include <tabsh.hxx>
#endif
#ifndef _TABLEDLG_HXX
#include <tabledlg.hxx>
#endif
#ifndef _TABLEMGR_HXX
#include <tablemgr.hxx>
#endif
#ifndef _TAUTOFMT_HXX
#include <tautofmt.hxx>
#endif
#ifndef _CELLATR_HXX
#include <cellatr.hxx>
#endif
#ifndef _FRMFMT_HXX
#include <frmfmt.hxx>
#endif
#ifndef _ROWHT_HXX
#include <rowht.hxx>
#endif
#ifndef _SPLIT_HXX
#include <split.hxx>
#endif
#ifndef _INSRC_HXX
#include <insrc.hxx>
#endif
#ifndef _SWUNDO_HXX
#include <swundo.hxx>
#endif
#ifndef _SWTABLE_HXX
#include <swtable.hxx>
#endif
#ifndef _TBLNUMFM_HXX
#include <tblnumfm.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _SPLITTBL_HXX
#include <splittbl.hxx>
#endif
#ifndef _MERGETBL_HXX
#include <mergetbl.hxx>
#endif
#ifndef _TBLSEL_HXX
#include <tblsel.hxx>
#endif

#ifndef _POPUP_HRC
#include <popup.hrc>
#endif
#ifndef _SHELLS_HRC
#include <shells.hrc>
#endif
#ifndef _TABLE_HRC
#include <table.hrc>
#endif
#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif
#ifndef _HELPID_H
#include <helpid.h>
#endif

#define SwTableShell
#ifndef _ITEMDEF_HXX
#include <itemdef.hxx>
#endif
#ifndef _SWSLOTS_HXX
#include <swslots.hxx>
#endif

//-----------------------------------------------------------------------------
BOOL lcl_IsNumeric(const String& rStr)
{
    for(xub_StrLen i = 0; i < rStr.Len(); i++)
    {
        sal_Unicode c = rStr.GetChar(i);
         if((c < '0') || (c > '9'))
             return FALSE;
    }
    return TRUE;

}

SFX_IMPL_INTERFACE(SwTableShell, SwBaseShell, SW_RES(STR_SHELLNAME_TABLE))
{
    SFX_POPUPMENU_REGISTRATION(SW_RES(MN_TAB_POPUPMENU));
    SFX_OBJECTBAR_REGISTRATION(SFX_OBJECTBAR_OBJECT, SW_RES(RID_TABLE_TOOLBOX));
    SFX_OBJECTMENU_REGISTRATION(SID_OBJECTMENU0, SW_RES(MN_OBJECTMENU_TABLE));
}


TYPEINIT1(SwTableShell,SwBaseShell)

/************************************************************************/


const USHORT __FAR_DATA aUITableAttrRange[] =
{
    FN_PARAM_TABLE_NAME,            FN_PARAM_TABLE_NAME,
    FN_PARAM_TABLE_HEADLINE,        FN_PARAM_TABLE_HEADLINE,
    FN_PARAM_TABLE_SPACE,           FN_PARAM_TABLE_SPACE,
    FN_TABLE_REP,                   FN_TABLE_REP,
    SID_RULER_BORDERS,              SID_RULER_BORDERS,
    RES_LR_SPACE,                   RES_UL_SPACE,
    SID_ATTR_BORDER_INNER,          SID_ATTR_BORDER_SHADOW,
    RES_BOX,                        RES_SHADOW,
    RES_BACKGROUND,                 RES_BACKGROUND,
    SID_BACKGRND_DESTINATION,       SID_BACKGRND_DESTINATION,
    SID_HTML_MODE,                  SID_HTML_MODE,
    SID_ATTR_BRUSH_ROW,             SID_ATTR_BRUSH_TABLE,
    RES_PAGEDESC,                   RES_BREAK,
    RES_KEEP,                       RES_KEEP,
    RES_LAYOUT_SPLIT,               RES_LAYOUT_SPLIT,
    FN_TABLE_SET_VERT_ALIGN,        FN_TABLE_SET_VERT_ALIGN,
    0
};




void lcl_SetAttr( SwWrtShell &rSh, const SfxPoolItem &rItem )
{
    SfxItemSet aSet( rSh.GetView().GetPool(), rItem.Which(), rItem.Which(), 0);
    aSet.Put( rItem );
    rSh.SetTblAttr( aSet );
}

/************************************************************************/


SwTableRep*  lcl_TableParamToItemSet( SfxItemSet& rSet, SwWrtShell &rSh )
{
    SwFrmFmt *pFmt = rSh.GetTableFmt();
    SwTabCols aCols;
    rSh.GetTabCols( aCols );

    //Ersteinmal die einfachen Attribute besorgen.
    rSet.Put( SfxStringItem( FN_PARAM_TABLE_NAME, pFmt->GetName()));
    rSet.Put( SfxBoolItem( FN_PARAM_TABLE_HEADLINE, rSh.IsHeadlineRepeat()) );
    rSet.Put( pFmt->GetShadow() );
    rSet.Put(SfxUInt16Item(FN_TABLE_SET_VERT_ALIGN, rSh.GetBoxAlign()));
    SvxULSpaceItem aULSpace( pFmt->GetULSpace() );
    rSet.Put( aULSpace );

    USHORT  nBackgroundDestination = rSh.GetViewOptions()->GetTblDest();
    rSet.Put(SwBackgroundDestinationItem(SID_BACKGRND_DESTINATION, nBackgroundDestination ));
    SvxBrushItem aBrush( RES_BACKGROUND );
//      rSh.GetBoxBackground(aBrush);
//  rSet.Put( aBrush );
            rSh.GetRowBackground(aBrush);
    rSet.Put( aBrush, SID_ATTR_BRUSH_ROW );
        rSh.GetTabBackground(aBrush);
    rSet.Put( aBrush, SID_ATTR_BRUSH_TABLE );
    FASTBOOL bTableSel = rSh.IsTableMode();
    if(!bTableSel)
    {
        rSh.StartAllAction();
        rSh.Push();
        rSh.GetView().GetViewFrame()->GetDispatcher()->Execute( FN_TABLE_SELECT_ALL, FALSE );
    }
    SvxBoxInfoItem aBoxInfo;

        // Tabellenvariante, wenn mehrere Tabellenzellen selektiert
    rSh.GetCrsr();                  //Damit GetCrsrCnt() auch das Richtige liefert
    aBoxInfo.SetTable          (rSh.IsTableMode() && rSh.GetCrsrCnt() > 1 ||
                                    !bTableSel);
        // Abstandsfeld immer anzeigen
    aBoxInfo.SetDist           ((BOOL) TRUE);
        // Minimalgroesse in Tabellen und Absaetzen setzen
    aBoxInfo.SetMinDist( !bTableSel || rSh.IsTableMode() ||
                            rSh.GetSelectionType() &
                            (SwWrtShell::SEL_TXT | SwWrtShell::SEL_TBL));
        // Default-Abstand immer setzen
    aBoxInfo.SetDefDist        (MIN_BORDER_DIST);
        // Einzelne Linien koennen nur in Tabellen DontCare-Status haben
    aBoxInfo.SetValid( VALID_DISABLE, !bTableSel || !rSh.IsTableMode() );

    rSet.Put(aBoxInfo);
    rSh.GetTabBorders( rSet );

    if(!bTableSel)
    {
        rSh.ClearMark();
        rSh.Pop(FALSE);
        rSh.EndAllAction();
    }

    SwTabCols aTabCols;
    rSh.GetTabCols( aTabCols );
    SvxColumnItem aColItem;


    // Pointer wird nach der Dialogausfuehrung geloescht
    SwTableRep* pRep = new SwTableRep( aTabCols, rSh.IsTblComplex());
    pRep->SetSpace(aCols.GetRightMax());

    USHORT nPercent = 0;
    long nWidth = ::GetTableWidth(pFmt, aCols, &nPercent, &rSh );
    // Die Tabellenbreite ist fuer relative Angaben nicht korrekt
    if(nPercent)
        nWidth = pRep->GetSpace() * nPercent / 100;
    USHORT nAlign = pFmt->GetHoriOrient().GetHoriOrient();
    pRep->SetAlign(nAlign);
    SvxLRSpaceItem aLRSpace( pFmt->GetLRSpace() );
    SwTwips nLeft = aLRSpace.GetLeft();
    SwTwips nRight = aLRSpace.GetRight();
    SwTwips nDiff = pRep->GetSpace() - nRight - nLeft - nWidth;
    if(nAlign != HORI_FULL && Abs(nDiff) > 2)
    {
        SwTwips nLR = pRep->GetSpace() - nWidth;
        switch ( nAlign )
        {
            case HORI_CENTER: nLeft = nRight = nLR / 2;
            break;
            case HORI_LEFT: nRight = nLR; nLeft = 0;
            break;
            case HORI_RIGHT: nLeft = nLR, nRight = 0;
            break;
            case HORI_LEFT_AND_WIDTH:
                nRight = nLR - nLeft;
            break;
            case HORI_NONE:
                if(!nPercent)
                    nWidth = pRep->GetSpace() - nLeft - nRight;
            break;
        }
    }
    pRep->SetLeftSpace(nLeft);
    pRep->SetRightSpace(nRight);

    pRep->SetWidth(nWidth);
    pRep->SetWidthPercent(nPercent);
    // sind einzelne Zeilen/Zellen selektiert, wird die Spaltenbearbeitung veraendert
    pRep->SetLineSelected(bTableSel && ! rSh.HasWholeTabSelection());
    rSet.Put(SwPtrItem(FN_TABLE_REP, pRep));
    return pRep;
}

/************************************************************************/


void lcl_ItemSetToTableParam( const SfxItemSet& rSet,
                                SwWrtShell &rSh )
{
    rSh.StartAllAction();
    rSh.StartUndo( UNDO_TABLE_ATTR );
    const SfxPoolItem* pItem = 0;

    SwViewOption aUsrPref( *rSh.GetViewOptions() );
    USHORT nBackgroundDestination = aUsrPref.GetTblDest();
    if(SFX_ITEM_SET == rSet.GetItemState(SID_BACKGRND_DESTINATION, FALSE, &pItem))
    {
        nBackgroundDestination = ((SfxUInt16Item*)pItem)->GetValue();
        aUsrPref.SetTblDest((BYTE)nBackgroundDestination);
        SW_MOD()->ApplyUsrPref(aUsrPref, &rSh.GetView());
    }
    FASTBOOL bBorder = ( SFX_ITEM_SET == rSet.GetItemState( RES_BOX ) ||
            SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_BORDER_INNER ) );
    pItem = 0;
    BOOL bBackground = SFX_ITEM_SET == rSet.GetItemState( RES_BACKGROUND, FALSE, &pItem );
    const SfxPoolItem* pRowItem = 0, *pTableItem = 0;
    bBackground |= SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_BRUSH_ROW, FALSE, &pRowItem );
    bBackground |= SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_BRUSH_TABLE, FALSE, &pTableItem );
    if( bBackground || bBorder)
    {
        /*
         Die Umrandung wird auf die vorliegende Selektion angewendet
         Liegt keine Selektion vor, wird die Tabelle vollstaendig selektiert.
         Der Hintergrund wird immer auf den aktuellen Zustand angewendet.
         */

        FASTBOOL bTableSel = rSh.IsTableMode();
        rSh.StartAllAction();

        if(bBackground)
        {
            if(pItem)
                rSh.SetBoxBackground( *(const SvxBrushItem*)pItem );
            if(pRowItem)
            {
                SvxBrushItem aBrush(*(const SvxBrushItem*)pRowItem);
                aBrush.SetWhich(RES_BACKGROUND);
                rSh.SetRowBackground(aBrush);
            }
            if(pTableItem)
            {
                SvxBrushItem aBrush(*(const SvxBrushItem*)pTableItem);
                aBrush.SetWhich(RES_BACKGROUND);
                rSh.SetTabBackground( aBrush );
            }
        }

        if(bBorder)
        {
            rSh.Push();
            if(!bTableSel)
            {
                rSh.GetView().GetViewFrame()->GetDispatcher()->Execute( FN_TABLE_SELECT_ALL );
            }
            rSh.SetTabBorders( rSet );

            if(!bTableSel)
            {
                rSh.ClearMark();
            }
            rSh.Pop(FALSE);
        }
        rSh.EndAllAction();
    }

    SwTabCols aTabCols;
    BOOL bTabCols = FALSE;
    BOOL bSingleLine = FALSE;
    SwTableRep* pRep = 0;
    SwFrmFmt *pFmt = rSh.GetTableFmt();
    SfxItemSet aSet( rSh.GetAttrPool(), RES_FRMATR_BEGIN, RES_FRMATR_END-1 );
    if(SFX_ITEM_SET == rSet.GetItemState( FN_TABLE_REP, FALSE, &pItem ))
    {
        pRep = (SwTableRep*)((const SwPtrItem*)pItem)->GetValue();

        const SwTwips nWidth = pRep->GetWidth();
        if ( HORI_FULL == (SwHoriOrient)pRep->GetAlign() )
        {
            SwFmtHoriOrient aAttr( pFmt->GetHoriOrient() );
            aAttr.SetHoriOrient( HORI_FULL );
            aSet.Put( aAttr );
        }
        else
        {
            SwFmtFrmSize aSz( ATT_VAR_SIZE, nWidth );
            if(pRep->GetWidthPercent())
            {
                aSz.SetWidthPercent( (BYTE)pRep->GetWidthPercent() );
            }
            aSet.Put(aSz);
        }

        SvxLRSpaceItem aLRSpace( RES_LR_SPACE );
        aLRSpace.SetLeft(pRep->GetLeftSpace());
        aLRSpace.SetRight(pRep->GetRightSpace());
        aSet.Put( aLRSpace );

        SwHoriOrient eOrient = (SwHoriOrient)pRep->GetAlign();
        SwFmtHoriOrient aAttr( 0, eOrient );
        aSet.Put( aAttr );
    // Damit beim recording die Ausrichtung nicht durch die Abstaende ueberschrieben
    // wird, darf das Item nur bei manueller Ausrichtung aufgez. werden
        if(eOrient != HORI_NONE)
            ((SfxItemSet&)rSet).ClearItem( SID_ATTR_LRSPACE );


        if(pRep->HasColsChanged())
        {
            bTabCols = TRUE;
        }
    }


    if( SFX_ITEM_SET == rSet.GetItemState( FN_PARAM_TABLE_HEADLINE, FALSE, &pItem))
        rSh.SetHeadlineRepeat( ((SfxBoolItem*)pItem)->GetValue() );

    if( SFX_ITEM_SET == rSet.GetItemState( FN_TABLE_SET_VERT_ALIGN, FALSE, &pItem))
        rSh.SetBoxAlign(((SfxUInt16Item*)(pItem))->GetValue());

    if( SFX_ITEM_SET == rSet.GetItemState( FN_PARAM_TABLE_NAME, FALSE, &pItem ))
        rSh.SetTableName( *pFmt, ((const SfxStringItem*)pItem)->GetValue() );

    // kopiere die ausgesuchten Attribute in den ItemSet
    static USHORT __READONLY_DATA aIds[] =
        {
            RES_PAGEDESC,       RES_BREAK,
            RES_KEEP,           RES_LAYOUT_SPLIT,
            RES_UL_SPACE,       RES_SHADOW,
            0
        };
    for( const USHORT* pIds = aIds; *pIds; ++pIds )
        if( SFX_ITEM_SET == rSet.GetItemState( *pIds, FALSE, &pItem))
            aSet.Put( *pItem );

    if( aSet.Count() )
        rSh.SetTblAttr( aSet );

    if(bTabCols)
    {
        rSh.GetTabCols( aTabCols );
        bSingleLine = pRep->FillTabCols( aTabCols );
        rSh.SetTabCols( aTabCols, bSingleLine );
    }

    rSh.EndUndo( UNDO_TABLE_ATTR );
    rSh.EndAllAction();
}

/************************************************************************/


void lcl_TabGetMaxLineWidth(const SvxBorderLine* pBorderLine, SvxBorderLine& rBorderLine)
{
    if(pBorderLine->GetInWidth() > rBorderLine.GetInWidth())
        rBorderLine.SetInWidth(pBorderLine->GetInWidth());

    if(pBorderLine->GetOutWidth() > rBorderLine.GetOutWidth())
        rBorderLine.SetOutWidth(pBorderLine->GetOutWidth());

    if(pBorderLine->GetDistance() > rBorderLine.GetDistance())
        rBorderLine.SetDistance(pBorderLine->GetDistance());

    rBorderLine.SetColor(pBorderLine->GetColor());
}


void SwTableShell::Execute(SfxRequest &rReq)
{

    const SfxItemSet* pArgs = rReq.GetArgs();
    SwWrtShell &rSh = GetShell();

    //Erstmal die Slots, die keinen FrmMgr benoetigen.
    BOOL bMore = FALSE;
    const SfxPoolItem* pItem = 0;
    USHORT nSlot = rReq.GetSlot();
    if(pArgs)
        pArgs->GetItemState(GetPool().GetWhich(nSlot), FALSE, &pItem);
    switch ( nSlot )
    {
        case SID_ATTR_BORDER:
        {
/*          BOOL bPopCrsr = FALSE;
            if ( !rReq.IsAPI() )
            {
                //Keine Tabellenselektion -> Aenderung wird auf die gesamte
                //Tabelle.
                if ( !rSh.IsTableMode() )
                {
                    rSh.StartAction();
                    bPopCrsr = TRUE;
                    rSh.Push();
                    rSh.EnterStdMode();
                    rSh.MoveTable( fnTableCurr, fnTableStart );
                    rSh.SttSelect();
                    rSh.MoveTable( fnTableCurr, fnTableEnd );
                    rSh.EndSelect();
                }
            }*/
            if(!pArgs)
                break;
            //Items erzeugen, weil wir sowieso nacharbeiten muessen
            SvxBoxItem     aBox;
            SfxItemSet aCoreSet( GetPool(),
                            RES_BOX, RES_BOX,
                            SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER, 0);
            SvxBoxInfoItem aCoreInfo;
            aCoreSet.Put(aCoreInfo);
            rSh.GetTabBorders( aCoreSet );
            const SvxBoxItem& rCoreBox = (const SvxBoxItem&)
                                                    aCoreSet.Get(RES_BOX);
            const SfxPoolItem *pItem = 0;
            if ( pArgs->GetItemState(RES_BOX, TRUE, &pItem) == SFX_ITEM_SET )
            {
                aBox = *(SvxBoxItem*)pItem;
                if ( !rReq.IsAPI() )
                    aBox.SetDistance( Max(rCoreBox.GetDistance(),USHORT(55)) );
                else if ( aBox.GetDistance() < MIN_BORDER_DIST )
                    aBox.SetDistance( Max(rCoreBox.GetDistance(),(USHORT)MIN_BORDER_DIST)  );
            }
            else
                {ASSERT( !this, "Wo ist das Box-Item?" )}

            SvxBoxInfoItem aInfo;
            if (pArgs->GetItemState(SID_ATTR_BORDER_INNER, TRUE, &pItem) == SFX_ITEM_SET)
                aInfo = *(SvxBoxInfoItem*)pItem;
            aInfo.SetTable( TRUE );
            aInfo.SetValid( VALID_DISABLE, FALSE );


// Die Attribute aller Linien werden gelesen und das staerkste gewinnt
            const SvxBorderLine* pBorderLine;
            SvxBorderLine aBorderLine;
            if ((pBorderLine = rCoreBox.GetTop()) != NULL)
                lcl_TabGetMaxLineWidth(pBorderLine, aBorderLine);
            if ((pBorderLine = rCoreBox.GetBottom()) != NULL)
                lcl_TabGetMaxLineWidth(pBorderLine, aBorderLine);
            if ((pBorderLine = rCoreBox.GetLeft()) != NULL)
                lcl_TabGetMaxLineWidth(pBorderLine, aBorderLine);
            if ((pBorderLine = rCoreBox.GetRight()) != NULL)
                lcl_TabGetMaxLineWidth(pBorderLine, aBorderLine);
            if ((pBorderLine = aCoreInfo.GetHori()) != NULL)
                lcl_TabGetMaxLineWidth(pBorderLine, aBorderLine);
            if ((pBorderLine = aCoreInfo.GetVert()) != NULL)
                lcl_TabGetMaxLineWidth(pBorderLine, aBorderLine);

            if(aBorderLine.GetOutWidth() == 0)
            {
                aBorderLine.SetInWidth(0);
                aBorderLine.SetOutWidth(DEF_LINE_WIDTH_0);
            }

            BOOL bLine = FALSE;
            if ( (pBorderLine = aBox.GetTop()) != NULL)
                aBox.SetLine(&aBorderLine, BOX_LINE_TOP), bLine |= TRUE;
            if ((pBorderLine = aBox.GetBottom()) != NULL)
                aBox.SetLine(&aBorderLine, BOX_LINE_BOTTOM), bLine |= TRUE;
            if ((pBorderLine = aBox.GetLeft()) != NULL)
                aBox.SetLine(&aBorderLine, BOX_LINE_LEFT), bLine |= TRUE;
            if ((pBorderLine = aBox.GetRight()) != NULL)
                aBox.SetLine(&aBorderLine, BOX_LINE_RIGHT), bLine |= TRUE;
            if ((pBorderLine = aInfo.GetHori()) != NULL)
                aInfo.SetLine(&aBorderLine, BOXINFO_LINE_HORI), bLine |= TRUE;
            if ((pBorderLine = aInfo.GetVert()) != NULL)
                aInfo.SetLine(&aBorderLine, BOXINFO_LINE_VERT), bLine |= TRUE;

//          if ( bPopCrsr && !bLine )
//              aBox.SetDistance( 0 );

            aCoreSet.Put( aBox  );
            aCoreSet.Put( aInfo );
            rSh.SetTabBorders( aCoreSet );

/*          if ( bPopCrsr )
            {
                rSh.KillPams();
                rSh.Pop(FALSE);
                rSh.EndAction();
            }*/
        }
        break;
        case SID_ATTR_BRUSH:
            if(pItem)
                rSh.SetBoxBackground( *(SvxBrushItem*)pItem );
        break;
        case FN_INSERT_TABLE:
        case FN_FORMAT_TABLE_DLG:
        {
            SfxItemSet aCoreSet( GetPool(), aUITableAttrRange);

            SwTableRep* pTblRep = ::lcl_TableParamToItemSet( aCoreSet, rSh );
            SwTableTabDlg* pDlg = new SwTableTabDlg( GetView().GetWindow(),
                                                     GetPool(), &aCoreSet, &rSh);
            aCoreSet.Put(SfxUInt16Item(SID_HTML_MODE, ::GetHtmlMode(GetView().GetDocShell())));
            rSh.GetTblAttr(aCoreSet);
            // GetTblAttr buegelt den Background ueber!
            SvxBrushItem aBrush( RES_BACKGROUND );
                rSh.GetBoxBackground(aBrush);
            aCoreSet.Put( aBrush );

            if ( pDlg->Execute() == RET_OK )
            {
                const SfxItemSet* pOutSet = pDlg->GetOutputItemSet();
                ::lcl_ItemSetToTableParam( *pOutSet, rSh );
            }
            delete pDlg;
            delete pTblRep;
            SfxBindings& rBindings = GetView().GetViewFrame()->GetBindings();
            rBindings.Update(SID_RULER_BORDERS);
            rBindings.Update(SID_ATTR_TABSTOP);
        }
        break;
        case FN_NUM_FORMAT_TABLE_DLG:
        {
            SwView* pView = GetActiveView();
            if(pView)
            {
                FieldUnit eMetric = ::GetDfltMetric(0 != PTR_CAST(SwWebView, pView));
                SW_MOD()->PutItem(SfxUInt16Item(SID_ATTR_METRIC, eMetric));
                SvNumberFormatter* pFormatter = rSh.GetNumberFormatter();
                SfxItemSet aCoreSet( GetPool(),
                                 SID_ATTR_NUMBERFORMAT_VALUE, SID_ATTR_NUMBERFORMAT_VALUE,
                                 SID_ATTR_NUMBERFORMAT_INFO, SID_ATTR_NUMBERFORMAT_INFO,
                                 0 );

                SfxItemSet aBoxSet( *aCoreSet.GetPool(),
                                    RES_BOXATR_FORMAT, RES_BOXATR_FORMAT,
                                    RES_BOXATR_VALUE, RES_BOXATR_VALUE,
                                    0 );
                rSh.GetTblBoxFormulaAttrs( aBoxSet );

                SfxItemState eState = aBoxSet.GetItemState(RES_BOXATR_FORMAT);
                if(eState == SFX_ITEM_DEFAULT)
                {
                    aCoreSet.Put( SfxUInt32Item( SID_ATTR_NUMBERFORMAT_VALUE,
                    pFormatter->GetFormatIndex(NF_TEXT, LANGUAGE_SYSTEM)));
                }
                else
                    aCoreSet.Put( SfxUInt32Item( SID_ATTR_NUMBERFORMAT_VALUE,
                                    ((SwTblBoxNumFormat&)aBoxSet.Get(
                                    RES_BOXATR_FORMAT )).GetValue() ));

                aCoreSet.Put( SvxNumberInfoItem( pFormatter,
                                    ((SwTblBoxValue&)aBoxSet.Get(
                                        RES_BOXATR_VALUE)).GetValue(),
                                    SID_ATTR_NUMBERFORMAT_INFO ));

                SwNumFmtDlg* pDlg = new SwNumFmtDlg(GetView().GetWindow(), aCoreSet);

                if (RET_OK == pDlg->Execute())
                {
                    const SfxPoolItem* pItem = GetView().GetDocShell()->
                                    GetItem( SID_ATTR_NUMBERFORMAT_INFO );

                    if( pItem && 0 != ((SvxNumberInfoItem*)pItem)->GetDelCount() )
                    {
                        const ULONG* pDelArr = ((SvxNumberInfoItem*)
                                                        pItem)->GetDelArray();

                        for ( USHORT i = 0; i < ((SvxNumberInfoItem*)pItem)->GetDelCount(); i++ )
                            ((SvxNumberInfoItem*)pItem)->
                            GetNumberFormatter()->DeleteEntry( pDelArr[i] );
                    }

                    if( SFX_ITEM_SET == pDlg->GetOutputItemSet()->GetItemState(
                        SID_ATTR_NUMBERFORMAT_VALUE, FALSE, &pItem ))
                    {
                        SfxItemSet aBoxSet( *aCoreSet.GetPool(),
                                    RES_BOXATR_FORMAT, RES_BOXATR_FORMAT );
                        aBoxSet.Put( SwTblBoxNumFormat(
                                ((SfxUInt32Item*)pItem)->GetValue() ));
                        rSh.SetTblBoxFormulaAttrs( aBoxSet );

                    }
                }
                delete pDlg;
            }
        }
        break;
        case FN_CALC_TABLE:
            rSh.UpdateTable();
        break;
        case FN_TABLE_OPTIMAL_HEIGHT:
        {
            const SwFmtFrmSize aSz;
            rSh.SetRowHeight( aSz );
        }
        break;
        case FN_TABLE_DELETE_COL:
            if ( rSh.DeleteCol() && rSh.HasSelection() )
                rSh.EnterStdMode();
        break;
        case FN_END_TABLE:
            rSh.MoveTable( fnTableCurr, fnTableEnd );
        break;
        case FN_START_TABLE:
            rSh.MoveTable( fnTableCurr, fnTableStart );
        break;

        case FN_TABLE_DELETE_ROW:
            if ( rSh.DeleteRow() && rSh.HasSelection() )
                rSh.EnterStdMode();
        break;
        case FN_TABLE_MERGE_CELLS:
            if ( rSh.IsTableMode() )
                switch ( rSh.MergeTab() )
                {
                    case TBLMERGE_OK:
                    case TBLMERGE_NOSELECTION:  break;
                    case TBLMERGE_TOOCOMPLEX:
                    {
                        InfoBox aInfoBox( GetView().GetWindow(),
                                    SW_RES( MSG_ERR_TABLE_MERGE ) );
                        aInfoBox.Execute();
                        break;
                    }
                    default: ASSERT( !this, "unbekannter Returnwert MergeTab.");
                }
        break;
        case FN_TABLE_ADJUST_CELLS:
            if ( rSh.IsAdjustCellWidthAllowed() )
                rSh.AdjustCellWidth();
        break;
        case FN_TABLE_BALANCE_CELLS:
            if ( rSh.IsAdjustCellWidthAllowed(TRUE) )
                rSh.AdjustCellWidth(TRUE);
        break;
        case FN_TABLE_BALANCE_ROWS:
            if ( rSh.BalanceRowHeight(TRUE) )
                rSh.BalanceRowHeight(FALSE);
        break;
        case FN_TABLE_SELECT_ALL:
            rSh.EnterStdMode();
            rSh.MoveTable( fnTableCurr, fnTableStart );
            rSh.SttSelect();
            rSh.MoveTable( fnTableCurr, fnTableEnd );
            rSh.EndSelect();
        break;
        case FN_TABLE_SELECT_COL:
            rSh.EnterStdMode();
            rSh.SelectTableCol();
        break;
        case FN_TABLE_SELECT_ROW:
            rSh.EnterStdMode();
            rSh.SelectTableRow();
        break;
        case FN_TABLE_SET_READ_ONLY_CELLS:
            rSh.ProtectCells();
            rSh.ResetSelect( 0, FALSE );
        break;
        case FN_TABLE_UNSET_READ_ONLY_CELLS:
            rSh.UnProtectCells();
        break;
        case SID_AUTOFORMAT:
        {
            SwAutoFormatDlg* pDlg = new SwAutoFormatDlg(
                            &GetView().GetViewFrame()->GetWindow(), &rSh );
            pDlg->Execute();
            delete pDlg;
        }
        break;
        case FN_TABLE_SET_ROW_HEIGHT:
        {
            SwTableHeightDlg *pDlg = new SwTableHeightDlg(
                                    GetView().GetWindow(), rSh );
            pDlg->Execute();
            delete pDlg;
        }
        break;
        case FN_NUMBER_BULLETS:
        case FN_NUM_BULLET_ON:
            ASSERT( !this, "Funktion darf zur Zeit nicht gerufen werden." );
        break;

        case FN_TABLE_INSERT_COL:
        case FN_TABLE_INSERT_ROW:
        {
            BOOL bColumn = rReq.GetSlot() == FN_TABLE_INSERT_COL;
            USHORT nCount = 0;
            BOOL bAfter = TRUE;
            if (pItem)
            {
                nCount = ((const SfxInt16Item* )pItem)->GetValue();
                if(SFX_ITEM_SET == pArgs->GetItemState(FN_PARAM_INSERT_AFTER, TRUE, &pItem))
                    bAfter = ((const SfxBoolItem* )pItem)->GetValue();
            }
            else if( !rReq.IsAPI() )
                ++nCount;

            if( nCount )
            {
                if( bColumn )
                    rSh.InsertCol( nCount, bAfter );
                else if ( !rSh.IsInRepeatedHeadline() )
                    rSh.InsertRow( nCount, bAfter );
                break;
            }

            nSlot = bColumn ? FN_TABLE_INSERT_COL_DLG : FN_TABLE_INSERT_ROW_DLG;
        }
        // kein break;  bei Count = 0 kommt der Dialog
        case FN_TABLE_INSERT_COL_DLG:
        case FN_TABLE_INSERT_ROW_DLG:
        {
            if ( FN_TABLE_INSERT_ROW_DLG != nSlot || !rSh.IsInRepeatedHeadline())
            {
                SwInsRowColDlg *pDlg = new SwInsRowColDlg( GetView(),
                                        FN_TABLE_INSERT_COL_DLG == nSlot );
                pDlg->Execute();
                delete pDlg;
            }
        }
        break;
        case FN_TABLE_SPLIT_CELLS:
        {
            SwSplitTableDlg *pDlg = new SwSplitTableDlg( GetView().GetWindow(), rSh );
            pDlg->Execute();
            delete pDlg;
        }
        break;

        case FN_TABLE_SPLIT_TABLE:
        {
            SwSplitTblDlg *pDlg = new SwSplitTblDlg( GetView().GetWindow(), rSh );
            pDlg->Execute();
            delete pDlg;
        }
        break;

        case FN_TABLE_MERGE_TABLE:
        {
            BOOL bPrev = rSh.CanMergeTable( TRUE );
            BOOL bNext = rSh.CanMergeTable( FALSE );

            if( bPrev && bNext )
            {
                // Dialog: welche denn?
                SwMergeTblDlg* pDlg = new SwMergeTblDlg(
                    GetView().GetWindow(), bPrev );
                if( RET_OK != pDlg->Execute() )
                    bPrev = bNext = FALSE;
                delete pDlg;
            }

            if( bPrev || bNext )
                rSh.MergeTable( bPrev );
        }
        break;

        case FN_TABLE_MODE_FIX       :
        case FN_TABLE_MODE_FIX_PROP  :
        case FN_TABLE_MODE_VARIABLE  :
        {
            rSh.SetTblChgMode( ( FN_TABLE_MODE_FIX == nSlot ? TBLFIX_CHGABS
                                    : FN_TABLE_MODE_FIX_PROP == nSlot
                                        ? TBLFIX_CHGPROP
                                        : TBLVAR_CHGABS ) );

            SfxBindings& rBind = GetView().GetViewFrame()->GetBindings();
            static USHORT __READONLY_DATA aInva[] =
                            {   FN_TABLE_MODE_FIX,
                                FN_TABLE_MODE_FIX_PROP,
                                FN_TABLE_MODE_VARIABLE,
                                0
                            };
            rBind.Invalidate( aInva );
        }
        break;
        case FN_TABLE_AUTOSUM:
        {
            SfxViewFrame* pVFrame = GetView().GetViewFrame();
            pVFrame->GetDispatcher()->Execute(FN_EDIT_FORMULA, SFX_CALLMODE_SYNCHRON);
            const USHORT nId = SwInputChild::GetChildWindowId();
            SwInputChild* pChildWin = (SwInputChild*)pVFrame->
                                                GetChildWindow( nId );
            String sSum;
            GetShell().GetAutoSum(sSum);
            if( pChildWin )
                pChildWin->SetFormula( sSum );

        }
        break;
        default:
            bMore = TRUE;
    }

    if ( !bMore )
    {
        return;
    }
    else
        bMore = FALSE;
    //Jetzt die Slots, die direkt auf dem TableFmt arbeiten.
    SwFrmFmt *pFmt = rSh.GetTableFmt();
    switch ( nSlot )
    {
        case SID_ATTR_ULSPACE:
        {
            if(pItem)
            {
                SvxULSpaceItem aULSpace( *(const SvxULSpaceItem*)pItem );
                aULSpace.SetWhich( RES_UL_SPACE );
                ::lcl_SetAttr( rSh, aULSpace );
            }
        }
            break;

        case SID_ATTR_LRSPACE:
        {
            if(pItem)
            {
                SfxItemSet aSet( GetPool(), RES_LR_SPACE, RES_LR_SPACE,
                                            RES_HORI_ORIENT, RES_HORI_ORIENT, 0 );
                SvxLRSpaceItem aLRSpace( *(const SvxLRSpaceItem*)pItem );
                aLRSpace.SetWhich( RES_LR_SPACE );
                aSet.Put( aLRSpace );
                SwFmtHoriOrient aHori( pFmt->GetHoriOrient() );
                aHori.SetHoriOrient( HORI_NONE );
                aSet.Put( aLRSpace );
                rSh.SetTblAttr( aSet );
            }
        }
        break;
// der letzte case-Zweig der noch einen TabellenManager braucht!!
        case FN_TABLE_SET_COL_WIDTH:
        {
            SwTableFUNC aMgr( &rSh, FALSE);
            aMgr.ColWidthDlg(GetView().GetWindow());
        }
        break;
        case FN_TABLE_VERT_NONE:
        case FN_TABLE_VERT_CENTER:
        case FN_TABLE_VERT_BOTTOM:
        {
            USHORT nAlign = nSlot == FN_TABLE_VERT_NONE ?
                                VERT_NONE :
                                    nSlot == FN_TABLE_VERT_CENTER ?
                                        VERT_CENTER : VERT_BOTTOM;
            rSh.SetBoxAlign(nAlign);
        }
        break;

        case SID_ATTR_PARA_SPLIT:
            if ( pItem )
            {
                SwFmtLayoutSplit aSplit( ((const SvxFmtSplitItem*)pItem)->GetValue());
                SfxItemSet aSet(GetPool(),  RES_LAYOUT_SPLIT, RES_LAYOUT_SPLIT, 0 );
                aSet.Put(aSplit);
                rSh.SetTblAttr(aSet);
            }
        break;

        case SID_ATTR_PARA_KEEP:
            if ( pItem )
            {
                SvxFmtKeepItem aKeep( *(const SvxFmtKeepItem*)pItem );
                aKeep.SetWhich( RES_KEEP );
                SfxItemSet aSet(GetPool(),  RES_KEEP, RES_KEEP, 0 );
                aSet.Put(aKeep);
                rSh.SetTblAttr(aSet);
            }
        break;

        default:
            ASSERT( !this, "falscher Dispatcher" );
            return;
    }
}
/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwTableShell::GetState(SfxItemSet &rSet)
{
    SfxWhichIter aIter( rSet );
    SwWrtShell &rSh = GetShell();
    SwFrmFmt *pFmt = rSh.GetTableFmt();
    USHORT nSlot = aIter.FirstWhich();
    while ( nSlot )
    {
        switch ( nSlot )
        {
            case FN_TABLE_MERGE_CELLS:
                if ( !rSh.IsTableMode() )
                    rSet.DisableItem(FN_TABLE_MERGE_CELLS);
            break;
            case FN_TABLE_ADJUST_CELLS:
                if ( !rSh.IsAdjustCellWidthAllowed() )
                    rSet.DisableItem(FN_TABLE_ADJUST_CELLS);
            break;

            case FN_TABLE_BALANCE_CELLS:
                if ( !rSh.IsAdjustCellWidthAllowed(TRUE) )
                    rSet.DisableItem(FN_TABLE_BALANCE_CELLS);
            break;

            case FN_TABLE_BALANCE_ROWS:
                if ( !rSh.BalanceRowHeight(TRUE) )
                    rSet.DisableItem(FN_TABLE_BALANCE_ROWS);
            break;

            case SID_INSERT_DIAGRAM:
                if ( !SFX_APP()->HasFeature( SFX_FEATURE_SMATH ) ||
                     rSh.IsTblComplexForChart() )
                    rSet.DisableItem(nSlot);
                break;

            case FN_INSERT_TABLE:
                // Irgendeinen Wert "putten", damit Controller enabled bleibt.
                // Statt "Insert:Table" erscheint dann "Format:Table".
                rSet.Put(SfxUInt16Item(nSlot, 1));
                break;

            case FN_TABLE_OPTIMAL_HEIGHT:
            {
                //Disablen wenn bereits auto-Hoehe eingestellt ist.
                SwFmtFrmSize *pSz;
                rSh.GetRowHeight( pSz );
                if ( pSz )
                {
                    if ( ATT_VAR_SIZE == pSz->GetSizeType() )
                        rSet.DisableItem( nSlot );
                    delete pSz;
                }
            }
            break;
            case FN_TABLE_INSERT_ROW:
            case FN_TABLE_INSERT_ROW_DLG:
            {
                if ( rSh.IsInRepeatedHeadline() )
                    rSet.DisableItem( nSlot );
            }
            break;
            case RES_LR_SPACE:
                rSet.Put(pFmt->GetLRSpace());
            break;
            case RES_UL_SPACE:
                rSet.Put(pFmt->GetULSpace());
            break;
            case FN_TABLE_VERT_NONE:
            case FN_TABLE_VERT_CENTER:
            case FN_TABLE_VERT_BOTTOM:
            {
                USHORT nAlign = rSh.GetBoxAlign();
                BOOL bSet = nSlot == FN_TABLE_VERT_NONE && nAlign == VERT_NONE||
                            nSlot == FN_TABLE_VERT_CENTER && nAlign == VERT_CENTER ||
                            nSlot == FN_TABLE_VERT_BOTTOM && nAlign == VERT_BOTTOM;
                rSet.Put(SfxBoolItem(nSlot, bSet));
            }
            break;

            case FN_TABLE_MODE_FIX       :
            case FN_TABLE_MODE_FIX_PROP  :
            case FN_TABLE_MODE_VARIABLE  :
                {
                    USHORT nMode = rSh.GetTblChgMode();
                    BOOL bSet = nSlot == FN_TABLE_MODE_FIX && nMode == TBLFIX_CHGABS ||
                            nSlot == FN_TABLE_MODE_FIX_PROP && nMode == TBLFIX_CHGPROP ||
                            nSlot == FN_TABLE_MODE_VARIABLE && nMode == TBLVAR_CHGABS;
                    rSet.Put(SfxBoolItem(nSlot, bSet));
                }
            break;

            case SID_ATTR_PARA_SPLIT:
                rSet.Put( pFmt->GetKeep() );
            break;

            case SID_ATTR_PARA_KEEP:
                rSet.Put( pFmt->GetLayoutSplit() );
            break;
            case FN_TABLE_SPLIT_TABLE:
            {
                if ( rSh.IsInHeadline() )
                    rSet.DisableItem( nSlot );
            }
            break;
            case FN_TABLE_MERGE_TABLE:
            {
                BOOL bAsk;
                if( !rSh.CanMergeTable( TRUE, &bAsk ))
                    rSet.DisableItem( nSlot );
            }
            break;

        case FN_TABLE_DELETE_ROW:
            {
                SwSelBoxes aBoxes;
                ::GetTblSel( rSh, aBoxes, TBLSEARCH_ROW );
                if( ::HasProtectedCells( aBoxes ))
                    rSet.DisableItem( nSlot );
            }
            break;
        case FN_TABLE_DELETE_COL:
            {
                SwSelBoxes aBoxes;
                ::GetTblSel( rSh, aBoxes, TBLSEARCH_COL );
                if( ::HasProtectedCells( aBoxes ))
                    rSet.DisableItem( nSlot );
            }
            break;
        }
    nSlot = aIter.NextWhich();
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SwTableShell::SwTableShell(SwView &rView) :
    SwBaseShell(rView)
{
    SetName(String::CreateFromAscii("Table"));
    SetHelpId(SW_TABSHELL);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwTableShell::GetFrmBorderState(SfxItemSet &rSet)
{
    SfxItemSet aCoreSet( GetPool(),
                         RES_BOX, RES_BOX,
                         SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER, 0 );
    SvxBoxInfoItem aBoxInfo;
    aCoreSet.Put( aBoxInfo );
    GetShell().GetTabBorders( aCoreSet );
    rSet.Put( aCoreSet );
    rSet.Put(SfxUInt16Item(SID_ATTR_BORDER, FALSE));    // Rahmencontroller: letzte Zeile ausklappen
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwTableShell::ExecTableStyle(SfxRequest& rReq)
{
    SwWrtShell &rSh = GetShell();
    const SfxItemSet *pArgs = rReq.GetArgs();
    if(pArgs)
        switch ( rReq.GetSlot() )
        {
            case SID_FRAME_LINESTYLE:
            case SID_FRAME_LINECOLOR:
            {
/*  Tabellenselektion ist abgeschafft
                BOOL bPopCrsr = FALSE;
                if ( !rReq.IsAPI() )
                {
                    //Keine Tabellenselektion -> Aenderung wird auf die gesamte
                    //Tabelle.
                    if ( !rSh.IsTableMode() )
                    {
                        bPopCrsr = TRUE;
                        rSh.Push();
                        rSh.StartAction();
                        rSh.EnterStdMode();
                        rSh.MoveTable( fnTableCurr, fnTableStart );
                        rSh.SttSelect();
                        rSh.MoveTable( fnTableCurr, fnTableEnd );
                        rSh.EndSelect();
                    }
                }*/
                if ( rReq.GetSlot() == SID_FRAME_LINESTYLE )
                {
                    const SvxLineItem &rLineItem = (const SvxLineItem&)pArgs->
                                                            Get( SID_FRAME_LINESTYLE );
                    const SvxBorderLine* pBorderLine = rLineItem.GetLine();
                    rSh.SetTabLineStyle( 0, TRUE, pBorderLine);
                }
                else
                {
                    const SvxColorItem &rNewColorItem = (const SvxColorItem&)pArgs->
                                                            Get( SID_FRAME_LINECOLOR );
                    rSh.SetTabLineStyle( &rNewColorItem.GetValue() );
                }
/*              if ( bPopCrsr )
                {
                    rSh.KillPams();
                    rSh.Pop(FALSE);
                    rSh.EndAction();
                }*/
                break;
            }
        }
}


void SwTableShell::GetLineStyleState(SfxItemSet &rSet)
{
    SfxItemSet aCoreSet( GetPool(),
                            RES_BOX, RES_BOX,
                            SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER, 0);
    SvxBoxInfoItem aCoreInfo;
    aCoreSet.Put(aCoreInfo);
    GetShell().GetTabBorders( aCoreSet );

    const SvxBoxItem& rBoxItem = (const SvxBoxItem&)aCoreSet.Get( RES_BOX );
    const SvxBorderLine* pLine = rBoxItem.GetTop();

    rSet.Put( SvxColorItem( pLine ? pLine->GetColor() : Color(), SID_FRAME_LINECOLOR ) );
    SvxLineItem aLine( SID_FRAME_LINESTYLE );
    aLine.SetLine(pLine);
    rSet.Put( aLine );
}

void SwTableShell::ExecNumberFormat(SfxRequest& rReq)
{
    const SfxItemSet* pArgs = rReq.GetArgs();
    SwWrtShell &rSh = GetShell();

    //Erstmal die Slots, die keinen FrmMgr benoetigen.
    const SfxPoolItem* pItem = 0;
    USHORT nSlot = rReq.GetSlot();
    if(pArgs)
        pArgs->GetItemState(GetPool().GetWhich(nSlot), FALSE, &pItem);

    //  Sprache immer von Cursorposition besorgen
    SfxItemSet aSet( rSh.GetAttrPool(), RES_CHRATR_LANGUAGE,
                                        RES_CHRATR_LANGUAGE );
    rSh.GetAttr( aSet );
    LanguageType eLang = ((const SvxLanguageItem&)aSet.Get(
                        RES_CHRATR_LANGUAGE )).GetLanguage();
    SvNumberFormatter* pFormatter = rSh.GetNumberFormatter();
    ULONG nNumberFormat = NUMBERFORMAT_ENTRY_NOT_FOUND;
    USHORT nFmtType = 0, nOffset = 0;

    switch ( nSlot )
    {
    case FN_NUMBER_FORMAT:
        if( pItem )
        {
            //  Index fuer String bestimmen
            String aCode( ((const SfxStringItem*)pItem)->GetValue() );
            nNumberFormat = pFormatter->GetEntryKey( aCode, eLang );
            if( NUMBERFORMAT_ENTRY_NOT_FOUND == nNumberFormat )
            {
                //  neu eintragen
                xub_StrLen nErrPos;
                short nType;
                if( !pFormatter->PutEntry( aCode, nErrPos, nType,
                                            nNumberFormat, eLang ))
                    nNumberFormat = NUMBERFORMAT_ENTRY_NOT_FOUND;
            }
        }
        break;
    case FN_NUMBER_STANDARD:        nFmtType = NUMBERFORMAT_NUMBER; break;
    case FN_NUMBER_SCIENTIFIC:      nFmtType = NUMBERFORMAT_SCIENTIFIC; break;
    case FN_NUMBER_DATE:            nFmtType = NUMBERFORMAT_DATE; break;
    case FN_NUMBER_TIME:            nFmtType = NUMBERFORMAT_TIME; break;
    case FN_NUMBER_CURRENCY:        nFmtType = NUMBERFORMAT_CURRENCY; break;
    case FN_NUMBER_PERCENT:         nFmtType = NUMBERFORMAT_PERCENT; break;

    case FN_NUMBER_TWODEC:          // #.##0,00
        nFmtType = NUMBERFORMAT_NUMBER;
        nOffset = NF_NUMBER_1000DEC2;
        break;

    default:
        ASSERT(FALSE, falscher Dispatcher);
        return;
    }

    if( nFmtType )
        nNumberFormat = pFormatter->GetStandardFormat( nFmtType, eLang ) + nOffset;

    if( NUMBERFORMAT_ENTRY_NOT_FOUND != nNumberFormat )
    {
        SfxItemSet aBoxSet( *aSet.GetPool(), RES_BOXATR_FORMAT, RES_BOXATR_FORMAT );
        aBoxSet.Put( SwTblBoxNumFormat( nNumberFormat ));
        rSh.SetTblBoxFormulaAttrs( aBoxSet );
    }

}
/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.246  2000/09/18 16:06:05  willem.vandorp
    OpenOffice header added.

    Revision 1.245  2000/09/08 08:12:52  os
    Change: Set/Toggle/Has/Knows/Show/GetChildWindow

    Revision 1.244  2000/09/07 15:59:30  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.243  2000/08/25 09:02:38  os
    negative margins enabled

    Revision 1.242  2000/07/03 20:02:16  jp
    Bug #70403#: dont delete protected cells

    Revision 1.241  2000/05/26 07:21:32  os
    old SW Basic API Slots removed

    Revision 1.240  2000/05/18 08:37:25  os
    lcl_IsNumeric

    Revision 1.239  2000/05/16 14:32:51  jp
    Changes for Unicode

    Revision 1.238  2000/05/10 11:53:02  os
    Basic API removed

    Revision 1.237  2000/04/20 12:51:52  os
    GetName() returns String&

    Revision 1.236  2000/04/18 14:58:24  os
    UNICODE

    Revision 1.235  2000/02/11 14:57:39  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.234  2000/02/03 15:10:42  os
    #72601# record deleting of rows or column prior to execution

    Revision 1.233  1999/08/23 07:49:02  OS
    #61218# correct handling of left_and_width oriented tables


      Rev 1.232   23 Aug 1999 09:49:02   OS
   #61218# correct handling of left_and_width oriented tables

      Rev 1.231   21 Jul 1999 13:29:58   JP
   WhichId-Ranges of SfxItemSets: EndId is inclusive

      Rev 1.230   09 Jun 1999 19:33:58   JP
   have to change: no cast from GetpApp to SfxApp/OffApp, SfxShell only subclass of SfxApp

      Rev 1.229   11 May 1999 21:51:40   JP
   Task #66127#: ueberfluessigen Code entfernt

      Rev 1.228   05 May 1999 11:23:18   OS
   #63790# Tabellen-Update nur bei Bedarf rufen

      Rev 1.227   28 Apr 1999 22:41:34   JP
   Bug #65545#: lcl_TableParamToItemSet - umgebene spaltige Bereiche beachten

      Rev 1.226   18 Mar 1999 14:40:48   OS
   #61169# #61489# Masseinheiten fuer Text u. HTML am Module setzen, nicht an der App

      Rev 1.225   22 Feb 1999 11:50:32   JP
   fuer Bug #61545#: Code optimiert

      Rev 1.224   17 Feb 1999 21:14:20   JP
   Task #61764#: neu: Tabellen zusammenfassen

      Rev 1.223   27 Nov 1998 14:52:54   AMA
   Fix #59951#59825#: Unterscheiden zwischen Rahmen-,Seiten- und Bereichsspalten

      Rev 1.222   05 Oct 1998 15:36:02   OM
   Vernuenftiges Standardformat verwenden

      Rev 1.221   15 Sep 1998 11:20:36   JP
   Bug #56201#: GoNextCell - per Flag das anhaengen von Lines steuern

      Rev 1.220   08 Sep 1998 17:03:00   OS
   #56134# Metric fuer Text und HTML getrennt

      Rev 1.219   30 Jul 1998 10:58:18   OS
   Tabellenbreit ergibt sich fuer HORI-NONE aus verfuegbarer Breite - Raender #54030#

      Rev 1.218   20 Jul 1998 10:44:52   MA
   #53013# Nach Anweisung abgeklemmt

      Rev 1.217   26 Jun 1998 17:36:06   OS
   SwBGDestItem mit Which #51751#

      Rev 1.216   18 Jun 1998 18:18:46   OS
   SwBackgroundDestinationItem

      Rev 1.215   02 Jun 1998 10:53:16   JP
   aUITableAttrRange sollte ein const Array sein

      Rev 1.214   29 May 1998 19:08:26   JP
   SS vom SwTableReq geaendert

      Rev 1.213   12 May 1998 23:44:08   JP
   neu: InserTable/TextToTable mit optionalen AutoFormat

      Rev 1.212   28 Apr 1998 09:16:18   OS
   GetTableWidth() verschoben

      Rev 1.211   18 Mar 1998 19:44:20   MA
   State fuer Split

      Rev 1.210   17 Mar 1998 16:20:42   OS
   Tabelle auftrennen

      Rev 1.209   17 Mar 1998 14:12:06   OS
   Border-Slot auch ohne Argumente ueberleben #48169#

      Rev 1.208   16 Mar 1998 23:21:04   JP
   SplitTable: zusaetzlich einen Modus angeben - Headline kopieren/Attr. Kopieren/Border korrigieren

      Rev 1.207   02 Mar 1998 14:19:34   OS
   Zahlenformat statt Default auf Text einstellen#46574#

      Rev 1.206   25 Feb 1998 12:53:52   MA
   new: SplitTable

      Rev 1.205   29 Nov 1997 15:53:00   MA
   includes

      Rev 1.204   24 Nov 1997 09:47:06   MA
   includes

      Rev 1.203   11 Nov 1997 10:49:08   OS
   Parameter fuer Split und ColumnWidth richtig pruefen

      Rev 1.202   03 Nov 1997 13:55:48   MA
   precomp entfernt

      Rev 1.201   01 Sep 1997 13:23:08   OS
   DLL-Umstellung

      Rev 1.200   15 Aug 1997 11:48:50   OS
   chartar/frmatr/txtatr aufgeteilt

      Rev 1.199   12 Aug 1997 14:43:10   MH
   chg: header

      Rev 1.198   11 Aug 1997 15:42:10   JP
   Bugfix #42478#: ueber die DocShell die geloeschten Formate besorgen

      Rev 1.198   11 Aug 1997 15:41:44   JP
   Bugfix #42478#: ueber die DocShell die geloeschten Formate besorgen

      Rev 1.197   11 Aug 1997 08:48:54   OS
   paraitem/frmitems/textitem aufgeteilt

      Rev 1.196   08 Aug 1997 17:28:52   OM
   Headerfile-Umstellung


------------------------------------------------------------------------*/


diff --git a/sw/source/ui/shells/textdrw.cxx b/sw/source/ui/shells/textdrw.cxx
new file mode 100644
index 0000000..7ad81a1
--- /dev/null
+++ b/sw/source/ui/shells/textdrw.cxx
@@ -0,0 +1,278 @@
/*************************************************************************
 *
 *  $RCSfile: textdrw.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:47 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SVDVIEW_HXX //autogen
#include <svx/svdview.hxx>
#endif
#ifndef _URLOBJ_HXX //autogen
#include <tools/urlobj.hxx>
#endif
#ifndef _SVX_FMGLOB_HXX
#include <svx/fmglob.hxx>
#endif
#ifndef _SVDOUNO_HXX //autogen
#include <svx/svdouno.hxx>
#endif
#ifndef _COM_SUN_STAR_FORM_FORMBUTTONTYPE_HPP_
#include <com/sun/star/form/FormButtonType.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
#include <com/sun/star/beans/XPropertySet.hpp>
#endif

#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _EDTWIN_HXX
#include <edtwin.hxx>
#endif
#ifndef _SWUNDO_HXX
#include <swundo.hxx>
#endif
#ifndef _TEXTSH_HXX
#include <textsh.hxx>
#endif

#ifndef _POOLFMT_HRC
#include <poolfmt.hrc>
#endif

#define C2U(cChar) rtl::OUString::createFromAscii(cChar)
using namespace ::com::sun::star;
using namespace ::rtl;
/*---------------------------------------------------------------------------
    Beschreibung:
 ----------------------------------------------------------------------------*/

void SwTextShell::InsertURLButton(const String& rURL, const String& rTarget, const String& rTxt)
{
    SwWrtShell& rSh = GetShell();

    if (!rSh.HasDrawView())
        rSh.MakeDrawView();
    SdrView *pSdrView = rSh.GetDrawView();

    // OBJ_FM_BUTTON
    pSdrView->SetCurrentObj(OBJ_FM_BUTTON);
    pSdrView->SetEditMode(sal_False);

    Point aStartPos(rSh.GetCharRect().Pos() + Point(0, 1));

    rSh.StartAction();
    rSh.StartUndo( UIUNDO_INSERT_URLBTN );
    if (rSh.BeginCreate(OBJ_FM_BUTTON, FmFormInventor, aStartPos))
    {
        pSdrView->SetOrtho(sal_False);
         Size aSz(GetView().GetEditWin().PixelToLogic(Size(140, 20)));
        Point aEndPos(aSz.Width(), aSz.Height());

        rSh.MoveCreate(aStartPos + aEndPos);
        rSh.EndCreate(SDRCREATE_FORCEEND);

        const SdrMarkList& rMarkList = pSdrView->GetMarkList();
        if (rMarkList.GetMark(0))
        {
            SdrUnoObj* pUnoCtrl = PTR_CAST(SdrUnoObj, rMarkList.GetMark(0)->GetObj());
            uno::Reference< awt::XControlModel >  xControlModel = pUnoCtrl->GetUnoControlModel();

            ASSERT( xControlModel.is(), "UNO-Control ohne Model" );
            if( !xControlModel.is() )
                return;

            uno::Reference< beans::XPropertySet >  xPropSet(xControlModel, uno::UNO_QUERY);


            uno::Any aTmp;

            aTmp <<= OUString(rTxt);
            xPropSet->setPropertyValue( C2U("Label"), aTmp );

            aTmp <<= OUString(INetURLObject::RelToAbs(rURL));
            xPropSet->setPropertyValue( C2U("TargetURL"), aTmp );

            if( rTarget.Len() )
            {
                aTmp <<= OUString(rTarget);
                xPropSet->setPropertyValue( C2U("TargetFrame"), aTmp );
            }


            form::FormButtonType eButtonType = form::FormButtonType_URL;
            aTmp.setValue( &eButtonType, ::getCppuType((const form::FormButtonType*)0));
            xPropSet->setPropertyValue( C2U("ButtonType"), aTmp );
        }

        if (rSh.IsObjSelected())
        {
//          rSh.ChgAnchor(FLY_AT_CNTNT);
            rSh.UnSelectFrm();
        }
    }
    rSh.EndUndo( UIUNDO_INSERT_URLBTN );
    rSh.EndAction();
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.36  2000/09/18 16:06:05  willem.vandorp
    OpenOffice header added.

    Revision 1.35  2000/05/16 09:15:14  os
    project usr removed

    Revision 1.34  2000/04/18 14:58:24  os
    UNICODE

    Revision 1.33  2000/03/23 07:49:14  os
    UNO III

    Revision 1.32  2000/02/11 14:57:44  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.31  1999/11/19 16:40:24  os
    modules renamed

    Revision 1.30  1999/01/26 13:48:26  OS
    #56371# TF_ONE51


      Rev 1.29   26 Jan 1999 14:48:26   OS
   #56371# TF_ONE51

      Rev 1.28   21 Jan 1999 23:59:00   JP
   Bug #61062#: InsertURL mit eigener UndoId

      Rev 1.27   07 Jul 1998 14:03:54   OM
   #51853# util::URL-Button wiederbelebt

      Rev 1.26   06 Jul 1998 14:18:46   OM
   #51853# util::URL-Button einfuegen

      Rev 1.25   09 Jun 1998 15:35:58   OM
   VC-Controls entfernt

      Rev 1.24   29 Nov 1997 15:52:54   MA
   includes

      Rev 1.23   24 Nov 1997 09:47:08   MA
   includes

      Rev 1.22   03 Nov 1997 13:55:46   MA
   precomp entfernt

      Rev 1.21   05 Sep 1997 12:08:16   MH
   chg: header

      Rev 1.20   29 Jul 1997 16:00:16   TJ
   include VCURLButton

      Rev 1.19   04 Apr 1997 16:41:46   HJS
   includes

      Rev 1.18   08 Nov 1996 11:59:22   HJS
   include w.g. positivdefine

      Rev 1.17   28 Aug 1996 15:55:04   OS
   includes

      Rev 1.16   15 Aug 1996 13:44:24   JP
   svdraw.hxx entfernt

      Rev 1.15   11 Jul 1996 12:15:44   OM
   #29283# Buttons zeichengebunden einfuegen

      Rev 1.14   26 Jun 1996 15:21:00   OS
   Aufruf von Dispatcher.Execute an 324 angepasst

      Rev 1.13   25 Jun 1996 22:07:12   JP
   SmartRelToAbs: Flag fuer CutMark hat jetzt inverse Bedeutung

      Rev 1.12   18 Jun 1996 12:29:36   JP
   SmartRelToAbs: text::Bookmark soll beibehalten werden

      Rev 1.11   13 Jun 1996 15:55:36   MA
   splitt si.hxx

      Rev 1.10   12 Jun 1996 15:09:18   OM
   Target am util::URL-Button setzen

      Rev 1.9   12 Jun 1996 14:56:48   OM
   Target aus Hyperlinkleiste uebernehmen

      Rev 1.8   31 May 1996 11:17:14   NF
   CLOOKS

      Rev 1.7   11 Apr 1996 17:22:40   JP
   Umstellung - RelToAbs/AbsToRel

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/shells/textfld.cxx b/sw/source/ui/shells/textfld.cxx
new file mode 100644
index 0000000..06e8e8c
--- /dev/null
+++ b/sw/source/ui/shells/textfld.cxx
@@ -0,0 +1,1175 @@
/*************************************************************************
 *
 *  $RCSfile: textfld.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:47 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "hintids.hxx"  //_immer_ vor den solar-Items
#include "uiparam.hxx"

#ifndef _SVX_POSTATTR_HXX //autogen
#include <svx/postattr.hxx>
#endif
#ifndef _SVX_HLNKITEM_HXX //autogen
#include <svx/hlnkitem.hxx>
#endif
#ifndef _SVXLINKMGR_HXX
#include <svx/linkmgr.hxx>
#endif
#ifndef _LINKDLG_HXX //autogen
#include <so3/linkdlg.hxx>
#endif
#ifndef _SVX_POSTDLG_HXX //autogen
#include <svx/postdlg.hxx>
#endif
#ifndef _SFXITEMPOOL_HXX //autogen
#include <svtools/itempool.hxx>
#endif
#ifndef _SFXINIMGR_HXX //autogen
#include <svtools/iniman.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _SFX_INIMGR_HXX //autogen
#include <sfx2/inimgr.hxx>
#endif
#ifndef _SFX_WHITER_HXX //autogen
#include <svtools/whiter.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _URLOBJ_HXX //autogen
#include <tools/urlobj.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SFXMACITEM_HXX //autogen
#include <svtools/macitem.hxx>
#endif
#ifndef _SVX_ADRITEM_HXX //autogen
#include <svx/adritem.hxx>
#endif
#ifndef _LINKDLG_HXX //autogen
#include <so3/linkdlg.hxx>
#endif
#ifndef _SFXVIEWFRM_HXX //autogen
#include <sfx2/viewfrm.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif


#ifndef _FMTINFMT_HXX //autogen
#include <fmtinfmt.hxx>
#endif
#ifndef _FLDWRAP_HXX //autogen
#include <fldwrap.hxx>
#endif
#include "redline.hxx"
#include "view.hxx"
#include "wrtsh.hxx"
#include "cmdid.h"
#include "basesh.hxx"
#include "wrtsh.hxx"
#include "finder.hxx"
#include "flddat.hxx"
#include "javaedit.hxx"
#include "numrule.hxx"
#include "textsh.hxx"
#include "docufld.hxx"
#include "usrfld.hxx"
#include "ddefld.hxx"
#include "expfld.hxx"
#include "fldmgr.hxx"
#include "fldedt.hxx"
//#include "addrdlg.hxx"
#include "shells.hrc"


extern BOOL bNoInterrupt;       // in mainwn.cxx

String& lcl_AppendRedlineStr( String& rStr, USHORT nRedlId )
{
    USHORT nResId = 0;
    switch( nRedlId )
    {
    case REDLINE_INSERT:    nResId = STR_REDLINE_INSERTED;      break;
    case REDLINE_DELETE:    nResId = STR_REDLINE_DELETED;       break;
    case REDLINE_FORMAT:    nResId = STR_REDLINE_FORMATED;      break;
    case REDLINE_TABLE:     nResId = STR_REDLINE_TABLECHG;      break;
    case REDLINE_FMTCOLL:   nResId = STR_REDLINE_FMTCOLLSET;    break;
    }
    if( nResId )
        rStr += SW_RESSTR( nResId );
    return rStr;
}

// STATIC DATA -----------------------------------------------------------

void SwTextShell::ExecField(SfxRequest &rReq)
{
    SwWrtShell& rSh = GetShell();
    OfficeApplication* pOffApp = OFF_APP();
    const SfxPoolItem* pItem = 0;

    USHORT nSlot = rReq.GetSlot();
    const SfxItemSet* pArgs = rReq.GetArgs();
    if(pArgs)
        pArgs->GetItemState(GetPool().GetWhich(nSlot), FALSE, &pItem);

    Window *pMDI = &GetView().GetViewFrame()->GetWindow();
    BOOL bMore = FALSE;
    USHORT nInsertType = 0;
    USHORT nInsertSubType = 0;
    USHORT nInsertFormat = 0;

    switch(nSlot)
    {
        case FN_EDIT_FIELD:
        {
            SwField* pFld = rSh.GetCurFld();
            if( pFld )
            {
                switch ( pFld->GetTypeId() )
                {
                    case TYP_DDEFLD:
                    {
#if !defined(DDE_AVAILABLE)
                        return;
#endif
                        SvBaseLinksDialog aDlg( pMDI,
                                        &rSh.GetLinkManager() );
                        aDlg.SetActLink( ((SwDDEFieldType*)pFld->GetTyp())->
                                                GetBaseLink() );
                        aDlg.Execute();
                        break;
                    }
                    default:
                    {
                        SwFldEditDlg *pDlg = new SwFldEditDlg(GetView());
                        // SetCareWin geht nicht, da Feld nicht selektiert wird
                        // rSh.SetCareWin(pDlg);
                        pDlg->Execute();
                        delete pDlg;
                        //rSh.SetCareWin(NULL);
                    }
                }
            }
            break;
        }
        case FN_EXECUTE_MACROFIELD:
        {
            SwField* pFld = rSh.GetCurFld();
            if(pFld && pFld->GetTyp()->Which() == RES_MACROFLD)
            {

                const String& rMacro = ((SwMacroField*)pFld)->GetMacro();
                USHORT nPos = rMacro.Search('.', 0);
                if(nPos != STRING_NOTFOUND)
                {
                    SvxMacro aMacro( rMacro.Copy(nPos + 1), rMacro.Copy(0,nPos), STARBASIC );
                    rSh.ExecMacro(aMacro);
                }
            }
        }
        break;

        case FN_GOTO_NEXT_INPUTFLD:
        case FN_GOTO_PREV_INPUTFLD:
            {
                BOOL bRet = FALSE;
                SwFieldType* pFld = rSh.GetFldType( 0, RES_INPUTFLD );
                if( pFld && rSh.MoveFldType( pFld,
                            FN_GOTO_NEXT_INPUTFLD == nSlot ))
                {
                    rSh.ClearMark();
                    rSh.StartInputFldDlg( rSh.GetCurFld(), FALSE );
                    bRet = TRUE;
                }

                rReq.SetReturnValue( SfxBoolItem( nSlot, bRet ));
            }
            break;

        default:
            bMore = TRUE;
    }
    if(bMore)
    {
        // hier kommen die Slots mit FldMgr
        SwFldMgr aFldMgr(GetShellPtr());
        switch(nSlot)
        {
            case FN_INSERT_FIELD_CTRL:
            case FN_INSERT_FIELD:
            {
                BOOL bRes = FALSE;
                SfxViewFrame* pVFrame = GetView().GetViewFrame();
                pVFrame->ToggleChildWindow(FN_INSERT_FIELD);
                bRes = pVFrame->GetChildWindow( nSlot ) != 0;
                Invalidate(rReq.GetSlot());
                Invalidate(FN_INSERT_FIELD_CTRL);
                rReq.SetReturnValue(SfxBoolItem( nSlot, bRes ));
            }
            break;

            case FN_INSERT_REF_FIELD:
            {
                SfxViewFrame* pVFrame = GetView().GetViewFrame();
                if (!pVFrame->HasChildWindow(FN_INSERT_FIELD))
                    pVFrame->ToggleChildWindow(FN_INSERT_FIELD);    // Dialog anzeigen

                // Flddlg auf neue TabPage umschalten
                USHORT nId = SwFldDlgWrapper::GetChildWindowId();
                SwFldDlgWrapper *pWrp = (SwFldDlgWrapper*)pVFrame->GetChildWindow(nId);
                if (pWrp)
                    pWrp->ShowPage();
            }
            break;


            case FN_POSTIT:
            {
                pPostItFldMgr = new SwFldMgr;
                SwPostItField* pPostIt = (SwPostItField*)pPostItFldMgr->GetCurFld();
                BOOL bNew = !(pPostIt && pPostIt->GetTyp()->Which() == RES_POSTITFLD);
                BOOL bTravel = FALSE;
                BOOL bNext, bPrev;

                SfxItemSet aSet(GetPool(), SvxPostItDialog::GetRanges());

                if(!bNew)
                {
                    aSet.Put(SvxPostItTextItem(pPostIt->GetPar2().ConvertLineEnd(), SID_ATTR_POSTIT_TEXT));
                    aSet.Put(SvxPostItAuthorItem(pPostIt->GetPar1(), SID_ATTR_POSTIT_AUTHOR));
                    aSet.Put(SvxPostItDateItem(
                        Application::GetAppInternational().
                        GetDate(pPostIt->GetDate()),
                        SID_ATTR_POSTIT_DATE));

                    // Traveling nur bei mehr als einem Feld
                    rSh.StartAction();

                    bNext = pPostItFldMgr->GoNext();
                    if( bNext )
                        pPostItFldMgr->GoPrev();

                    if( 0 != ( bPrev = pPostItFldMgr->GoPrev() ) )
                        pPostItFldMgr->GoNext();
                    bTravel |= bNext|bPrev;

                    rSh.EndAction();
                }
                else
                {
                    SvxAddressItem aAdr( pPathFinder->GetAddress() );
                    aSet.Put(SvxPostItTextItem(aEmptyStr, SID_ATTR_POSTIT_TEXT));
                    aSet.Put(SvxPostItAuthorItem(aAdr.GetShortName(), SID_ATTR_POSTIT_AUTHOR));
                    aSet.Put(SvxPostItDateItem(
                            Application::GetAppInternational().
                            GetDate(Date()), SID_ATTR_POSTIT_DATE));
                }

                SvxPostItDialog *pDlg = new SvxPostItDialog( pMDI, aSet, bTravel);
                pDlg->SetReadonlyPostIt(rSh.IsReadOnlyAvailable() && rSh.HasReadonlySel());

                if (bTravel)
                {
                    pDlg->EnableTravel(bNext, bPrev);
                    pDlg->SetPrevHdl(LINK(this, SwTextShell, PostItPrevHdl));
                    pDlg->SetNextHdl(LINK(this, SwTextShell, PostItNextHdl));
                }

                if (bNew)
                    pDlg->SetText(SW_RESSTR(STR_NOTIZ_INSERT));

                bNoInterrupt = TRUE;
                if ( pDlg->Execute() == RET_OK )
                {
                    const SfxItemSet* pOutSet = pDlg->GetOutputItemSet();
                    String sMsg(((const SvxPostItTextItem&)pOutSet->Get(SID_ATTR_POSTIT_TEXT)).GetValue());
                    String sAuthor(((const SvxPostItAuthorItem&)pOutSet->Get(SID_ATTR_POSTIT_AUTHOR)).GetValue());

                    if(bNew)
                        // neues PostIt anlegen
                        pPostItFldMgr->InsertFld(TYP_POSTITFLD, 0, sAuthor, sMsg, 0);
                    else
                        // altes PostIt updaten
                        pPostItFldMgr->UpdateCurFld(0, sAuthor, sMsg);
                }

                delete pDlg;
                delete pPostItFldMgr;
                bNoInterrupt = FALSE;
                GetView().AttrChangedNotify(GetShellPtr());
            }
            break;

            case FN_REDLINE_COMMENT:
            {
                BOOL bNew = TRUE;
                String sComment;
                const SwRedline *pRedline = rSh.GetCurrRedline();

                if (pRedline)
                {
                    sComment = pRedline->GetComment();


                    BOOL bTravel = FALSE;

                    SfxItemSet aSet(GetPool(), SvxPostItDialog::GetRanges());
                    const International& rIntl = Application::GetAppInternational();

                    aSet.Put(SvxPostItTextItem(sComment.ConvertLineEnd(), SID_ATTR_POSTIT_TEXT));
                    aSet.Put(SvxPostItAuthorItem(pRedline->GetAuthorString(), SID_ATTR_POSTIT_AUTHOR));

                    const DateTime &rDT = pRedline->GetRedlineData().GetTimeStamp();

                    String sDate(rIntl.GetDate( rDT ));
                    (sDate += ' ' ) += rIntl.GetTime( rDT, FALSE, FALSE );

                    aSet.Put(SvxPostItDateItem(sDate, SID_ATTR_POSTIT_DATE));

                    // Traveling nur bei mehr als einem Feld
                    rSh.StartAction();

                    rSh.Push();
                    const SwRedline *pActRed = rSh.SelPrevRedline();

                    if (pActRed == pRedline)
                    {   // Neuer Cursor steht am Anfang des Current Redlines
                        rSh.Pop();  // Alten Cursor wegwerfen
                        rSh.Push();
                        pActRed = rSh.SelPrevRedline();
                    }

                    BOOL bPrev = pActRed != 0;
                    rSh.Pop(FALSE);
                    rSh.EndAction();

                    rSh.ClearMark();
                    rSh.SelNextRedline();   // Aktueller Redline wird selektiert

                    rSh.StartAction();
                    rSh.Push();
                    pActRed = rSh.SelNextRedline();
                    BOOL bNext = pActRed != 0;
                    rSh.Pop(FALSE); // Cursorpos restaurieren

                    if( rSh.IsCrsrPtAtEnd() )
                        rSh.SwapPam();

                    rSh.EndAction();

                    bTravel |= bNext|bPrev;

                    SvxPostItDialog *pDlg = new SvxPostItDialog( pMDI, aSet, bTravel, TRUE);
                    pDlg->HideAuthor();

                    String sTitle(SW_RES(STR_REDLINE_COMMENT));
                    ::lcl_AppendRedlineStr( sTitle, pRedline->GetType() );

                    pDlg->SetText(sTitle);

                    if (bTravel)
                    {
                        pDlg->EnableTravel(bNext, bPrev);
                        pDlg->SetPrevHdl(LINK(this, SwTextShell, RedlinePrevHdl));
                        pDlg->SetNextHdl(LINK(this, SwTextShell, RedlineNextHdl));
                    }

                    rSh.SetCareWin(pDlg);
                    bNoInterrupt = TRUE;

                    if ( pDlg->Execute() == RET_OK )
                    {
                        const SfxItemSet* pOutSet = pDlg->GetOutputItemSet();
                        String sMsg(((const SvxPostItTextItem&)pOutSet->Get(SID_ATTR_POSTIT_TEXT)).GetValue());

                        // Kommentar einfuegen bzw aendern
                        rSh.SetRedlineComment(sMsg);
                    }

                    delete pDlg;
                    rSh.SetCareWin(NULL);
                    bNoInterrupt = FALSE;
                    rSh.ClearMark();
                    GetView().AttrChangedNotify(GetShellPtr());
                }
            }
            break;

            case FN_JAVAEDIT:
            {
                SwJavaEditDialog *pDlg = new SwJavaEditDialog( pMDI, &rSh);
                pDlg->Execute();
                delete pDlg;
            }
            break;

            case FN_INSERT_FLD_DATE    :
                nInsertType = TYP_DATEFLD;
                goto FIELD_INSERT;
            case FN_INSERT_FLD_TIME    :
                nInsertType = TYP_TIMEFLD;
                goto FIELD_INSERT;
            case FN_INSERT_FLD_PGNUMBER:
                nInsertType = TYP_PAGENUMBERFLD;
                nInsertFormat = SVX_NUM_PAGEDESC; // wie Seitenvorlage
                goto FIELD_INSERT;
            case FN_INSERT_FLD_PGCOUNT :
                nInsertType = TYP_DOCSTATFLD;
                nInsertSubType = 0;
                nInsertFormat = SVX_NUM_PAGEDESC;
                goto FIELD_INSERT;
            case FN_INSERT_FLD_TOPIC   :
                nInsertType = TYP_DOCINFOFLD;
                nInsertSubType = DI_THEMA;
                goto FIELD_INSERT;
            case FN_INSERT_FLD_TITLE   :
                nInsertType = TYP_DOCINFOFLD;
                nInsertSubType = DI_TITEL;
                goto FIELD_INSERT;
            case FN_INSERT_FLD_AUTHOR  :
                nInsertType = TYP_AUTHORFLD;

FIELD_INSERT:
                aFldMgr.InsertFld(nInsertType, nInsertSubType,
                                    aEmptyStr, aEmptyStr, nInsertFormat);
            break;
            default:
                ASSERT(FALSE, falscher Dispatcher);
                return;
        }
    }
}


void SwTextShell::StateField( SfxItemSet &rSet )
{
    SwWrtShell& rSh = GetShell();
    SfxWhichIter aIter( rSet );
    const SwField* pField = 0;
    int bGetField = FALSE;
    USHORT nWhich = aIter.FirstWhich();

    while (nWhich)
    {
        switch (nWhich)
        {
            case FN_EDIT_FIELD:
            {
                if( rSh.HasSelection() )
                    rSet.DisableItem(nWhich);
                else
                {
                    if( !bGetField )
                    {
                        pField = rSh.GetCurFld();
                        bGetField = TRUE;
                    }

                    USHORT nTempWhich = pField ? pField->GetTyp()->Which() : USHRT_MAX;
                    if( USHRT_MAX == nTempWhich ||
                        RES_POSTITFLD == nTempWhich ||
                        RES_SCRIPTFLD == nTempWhich ||
                        RES_AUTHORITY == nTempWhich )
                        rSet.DisableItem( nWhich );
                }
            }
            break;
            case FN_EXECUTE_MACROFIELD:
            {
                if(!bGetField)
                {
                    pField = rSh.GetCurFld();
                    bGetField = TRUE;
                }
                if(!pField || pField->GetTyp()->Which() != RES_MACROFLD)
                    rSet.DisableItem(nWhich);
            }
            break;

            case FN_INSERT_FIELD:
            {
                SfxViewFrame* pVFrame = GetView().GetViewFrame();
                if (pVFrame->KnowsChildWindow(FN_INSERT_FIELD))
                    rSet.Put(SfxBoolItem( FN_INSERT_FIELD, pVFrame->HasChildWindow(nWhich)));
                else
                    rSet.DisableItem(FN_INSERT_FIELD);
            }
            break;
            case FN_INSERT_REF_FIELD:
            {
                SfxViewFrame* pVFrame = GetView().GetViewFrame();
                if (!pVFrame->KnowsChildWindow(FN_INSERT_FIELD))
                    rSet.DisableItem(FN_INSERT_REF_FIELD);
            }
            break;
            case FN_INSERT_FIELD_CTRL:
                rSet.Put(SfxBoolItem( nWhich, GetView().GetViewFrame()->HasChildWindow(FN_INSERT_FIELD)));
            break;
            case FN_REDLINE_COMMENT:
                if (!rSh.GetCurrRedline())
                    rSet.DisableItem(nWhich);
                break;
            case FN_POSTIT :
            case FN_JAVAEDIT :
                BOOL bCurField = FALSE;
                SwField* pField = rSh.GetCurFld();
                if(nWhich == FN_POSTIT)
                    bCurField = pField && pField->GetTyp()->Which() == RES_POSTITFLD;
                else
                    bCurField = pField && pField->GetTyp()->Which() == RES_SCRIPTFLD;

                if(!bCurField && rSh.IsReadOnlyAvailable() && rSh.HasReadonlySel() )
                    rSet.DisableItem(nWhich);
            break;
        }
        nWhich = aIter.NextWhich();
    }
}

/*---------------------------------------------------------------------------
    Beschreibung:
 ----------------------------------------------------------------------------*/


void SwTextShell::InsertHyperlink(const SvxHyperlinkItem& rHlnkItem)
{
    const String& rName   = rHlnkItem.GetName();
    const String& rURL    = rHlnkItem.GetURL();
    const String& rTarget = rHlnkItem.GetTargetFrame();
    USHORT nType =  (USHORT)rHlnkItem.GetInsertMode();
    const SvxMacroTableDtor* pMacroTbl = rHlnkItem.GetMacroTbl();

    SwWrtShell& rSh = GetShell();

    if( rSh.GetSelectionType() & SwWrtShell::SEL_TXT )
    {
        switch (nType)
        {
        case HLINK_DEFAULT:
        case HLINK_FIELD:
            {
                rSh.StartAction();
                BOOL bSel = rSh.HasSelection();
                SfxItemSet aSet(GetPool(), RES_TXTATR_INETFMT, RES_TXTATR_INETFMT);
                rSh.GetAttr( aSet );

                const SfxPoolItem* pItem;
                if(SFX_ITEM_SET == aSet.GetItemState(RES_TXTATR_INETFMT, FALSE, &pItem))
                {
                    const SwFmtINetFmt* pINetFmt = (const SwFmtINetFmt*)pItem;

                    // Links selektieren
                    rSh.SwCrsrShell::SelectTxtAttr(RES_TXTATR_INETFMT);
                }
                SwFmtINetFmt aINetFmt( rURL, rTarget );
                aINetFmt.SetName(rHlnkItem.GetIntName());
                if(pMacroTbl)
                {
                    SvxMacro *pMacro = pMacroTbl->Get( SFX_EVENT_MOUSEOVER_OBJECT );
                    if( pMacro )
                        aINetFmt.SetMacro(SFX_EVENT_MOUSEOVER_OBJECT, *pMacro);
                    pMacro = pMacroTbl->Get( SFX_EVENT_MOUSECLICK_OBJECT );
                    if( pMacro )
                        aINetFmt.SetMacro(SFX_EVENT_MOUSECLICK_OBJECT, *pMacro);
                    pMacro = pMacroTbl->Get( SFX_EVENT_MOUSEOUT_OBJECT );
                    if( pMacro )
                        aINetFmt.SetMacro(SFX_EVENT_MOUSEOUT_OBJECT, *pMacro);
                }
                rSh.InsertURL( aINetFmt, rName, TRUE );
                rSh.EndAction();
            }
            break;

        case HLINK_BUTTON:
            InsertURLButton( rURL, rTarget, rName );
            rSh.EnterStdMode();
            break;
        }
    }
}

/*---------------------------------------------------------------------------
    Beschreibung:
 ----------------------------------------------------------------------------*/


void SwTextShell::InsertDBFld(const String& sFldName)
{
    SwFldMgr aFldMgr(GetShellPtr());

    aFldMgr.InsertFld(TYP_DBFLD, 0, sFldName, aEmptyStr, 0, FALSE, TRUE);
}

/*--------------------------------------------------------------------
    Beschreibung: Traveling zwishen PostIts
 --------------------------------------------------------------------*/


IMPL_LINK( SwTextShell, PostItNextHdl, Button *, pBtn )
{
    SvxPostItDialog *pDlg = (SvxPostItDialog*)pBtn;

    if( pDlg->IsOkEnabled() )
        pPostItFldMgr->UpdateCurFld( 0,
                                    SFX_INIMANAGER()->Get(SFX_KEY_USER_ID),
                                    pDlg->GetNote() );
    pPostItFldMgr->GoNext();
    SwPostItField* pPostIt = (SwPostItField*)pPostItFldMgr->GetCurFld();
    pDlg->SetNote(pPostIt->GetPar2().ConvertLineEnd());
    pDlg->ShowLastAuthor(pPostIt->GetPar1(), Application::GetAppInternational().GetDate(pPostIt->GetDate()));

    // Traveling nur bei mehr als einem Feld
    SwWrtShell* pSh = GetShellPtr();
    pDlg->SetReadonlyPostIt(pSh->IsReadOnlyAvailable() && pSh->HasReadonlySel());
    pSh->StartAction();

    BOOL bEnable = FALSE;
    if( pPostItFldMgr->GoNext() )
    {
        bEnable = TRUE;
        pPostItFldMgr->GoPrev();
    }
    pDlg->EnableTravel(bEnable, TRUE);

    pSh->EndAction();

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


IMPL_LINK( SwTextShell, PostItPrevHdl, Button *, pBtn )
{
    SvxPostItDialog *pDlg = (SvxPostItDialog*)pBtn;

    if( pDlg->IsOkEnabled() )
        pPostItFldMgr->UpdateCurFld( 0,
                                    SFX_INIMANAGER()->Get(SFX_KEY_USER_ID),
                                    pDlg->GetNote() );
    pPostItFldMgr->GoPrev();
    SwPostItField* pPostIt = (SwPostItField*)pPostItFldMgr->GetCurFld();
    pDlg->SetNote(pPostIt->GetPar2().ConvertLineEnd());
    pDlg->ShowLastAuthor(pPostIt->GetPar1(), Application::GetAppInternational().GetDate(pPostIt->GetDate()));

    // Traveling nur bei mehr als einem Feld
    SwWrtShell* pSh = GetShellPtr();
    pDlg->SetReadonlyPostIt(pSh->IsReadOnlyAvailable() && pSh->HasReadonlySel());
    pSh->StartAction();

    BOOL bEnable = FALSE;
    if( pPostItFldMgr->GoPrev() )
    {
        bEnable = TRUE;
        pPostItFldMgr->GoNext();
    }
    pDlg->EnableTravel(TRUE, bEnable);

    pSh->EndAction();

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung: Traveling zwischen Redlines
 --------------------------------------------------------------------*/


IMPL_LINK( SwTextShell, RedlineNextHdl, Button *, pBtn )
{
    SwWrtShell* pSh = GetShellPtr();
    SvxPostItDialog *pDlg = (SvxPostItDialog*)pBtn;

    // Kommentar einfuegen bzw aendern
    pSh->SetRedlineComment(pDlg->GetNote());

    const SwRedline *pRedline = pSh->GetCurrRedline();

    BOOL bNew = TRUE;
    String sComment;

    if (pRedline)
    {
        // Traveling nur bei mehr als einem Feld
        if( !pSh->IsCrsrPtAtEnd() )
            pSh->SwapPam(); // Cursor hinter den Redline stellen

        pSh->Push();
        const SwRedline *pActRed = pSh->SelNextRedline();
        pSh->Pop(pActRed != 0);

        BOOL bEnable = FALSE;

        if (pActRed)
        {
            pSh->StartAction();
            pSh->Push();
            bEnable = pSh->SelNextRedline() != 0;
            pSh->Pop(FALSE);
            pSh->EndAction();
        }

        pDlg->EnableTravel(bEnable, TRUE);

        if( pSh->IsCrsrPtAtEnd() )
            pSh->SwapPam();

        pRedline = pSh->GetCurrRedline();
        sComment = pRedline->GetComment();

        const International& rIntl = Application::GetAppInternational();

        const DateTime &rDT = pRedline->GetRedlineData().GetTimeStamp();

        String sDate(rIntl.GetDate( rDT ));
        (sDate += ' ' ) += rIntl.GetTime( rDT, FALSE, FALSE );

        pDlg->SetNote(sComment.ConvertLineEnd());
        pDlg->ShowLastAuthor(pRedline->GetAuthorString(), sDate);

        String sTitle(SW_RES(STR_REDLINE_COMMENT));
        ::lcl_AppendRedlineStr( sTitle, pRedline->GetType() );

        pDlg->SetText(sTitle);
    }

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


IMPL_LINK( SwTextShell, RedlinePrevHdl, Button *, pBtn )
{
    SwWrtShell* pSh = GetShellPtr();
    SvxPostItDialog *pDlg = (SvxPostItDialog*)pBtn;

    // Kommentar einfuegen bzw aendern
    pSh->SetRedlineComment(pDlg->GetNote());

    const SwRedline *pRedline = pSh->GetCurrRedline();

    BOOL bNew = TRUE;
    String sComment;

    if (pRedline)
    {
        // Traveling nur bei mehr als einem Feld
        pSh->Push();
        const SwRedline *pActRed = pSh->SelPrevRedline();
        pSh->Pop(pActRed != 0);

        BOOL bEnable = FALSE;

        if (pActRed)
        {
            pSh->StartAction();
            pSh->Push();
            bEnable = pSh->SelPrevRedline() != 0;
            pSh->Pop(FALSE);
            pSh->EndAction();
        }

        pDlg->EnableTravel(TRUE, bEnable);

        pRedline = pSh->GetCurrRedline();
        sComment = pRedline->GetComment();

        const International& rIntl = Application::GetAppInternational();

        const DateTime &rDT = pRedline->GetRedlineData().GetTimeStamp();

        String sDate(rIntl.GetDate( rDT ));
        (sDate += ' ' ) += rIntl.GetTime( rDT, FALSE, FALSE );

        pDlg->SetNote(sComment.ConvertLineEnd());
        pDlg->ShowLastAuthor(pRedline->GetAuthorString(), sDate);

        String sTitle(SW_RES(STR_REDLINE_COMMENT));
        ::lcl_AppendRedlineStr( sTitle, pRedline->GetType() );

        pDlg->SetText(sTitle);
    }

    return 0;
}

// -----------------------------------------------------------------------
/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.117  2000/09/18 16:06:05  willem.vandorp
    OpenOffice header added.

    Revision 1.116  2000/09/08 08:12:52  os
    Change: Set/Toggle/Has/Knows/Show/GetChildWindow

    Revision 1.115  2000/06/30 08:52:04  os
    #76541# string assertions removed

    Revision 1.114  2000/05/26 07:21:33  os
    old SW Basic API Slots removed

    Revision 1.113  2000/04/18 14:58:24  os
    UNICODE

    Revision 1.112  2000/04/11 11:32:34  os
    #74939# select inserted URLs

    Revision 1.111  2000/02/25 09:26:37  hr
    #73447#: removed temporary

    Revision 1.110  2000/02/11 14:58:18  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.109  2000/01/20 10:59:55  os
    #72115# set name of inserted hyperlink

    Revision 1.108  2000/01/18 12:10:40  pw
    #71932# Use SFX_EVENT_-constants to get a macro from a macrotable

    Revision 1.107  1999/10/27 06:37:49  os
    HyperLink dialog interface, events

    Revision 1.106  1999/10/20 16:33:19  jp
    Bug #69239#: return correct state of FN_EDIT_FIELD

    Revision 1.105  1999/09/24 14:38:32  os
    hlnkitem.hxx now in SVX

    Revision 1.104  1999/09/15 14:15:43  os
    AuthorityField(-Type), RES_AUTHORITY

    Revision 1.103  1999/07/16 14:04:08  JP
    Bug #67677#: PostIdNext-/-PrevHdl - if OkButton is enabled the field can changed


      Rev 1.102   16 Jul 1999 16:04:08   JP
   Bug #67677#: PostIdNext-/-PrevHdl - if OkButton is enabled the field can changed

      Rev 1.101   10 Jun 1999 13:16:36   JP
   have to change: no AppWin from SfxApp

      Rev 1.100   10 May 1999 13:50:12   OS
   #64780# Notizen in gesch. Bereichen

      Rev 1.99   19 Apr 1999 13:42:20   OS
   #63005# Notizen und Scripts in gesch. Bereichen

      Rev 1.98   17 Nov 1998 10:58:32   OS
   #58263# NumType durch SvxExtNumType ersetzt

      Rev 1.97   21 Oct 1998 16:19:32   OM
   #58157# Querverweise einfuegen

      Rev 1.96   09 Oct 1998 17:06:04   JP
   Bug #57741#: neue ResourceIds, optimiert

      Rev 1.95   17 Jul 1998 17:26:14   OM
   #52865# Neue HelpIDs fuer Redline-bearbeiten Dlg

      Rev 1.94   14 Jul 1998 14:19:10   OM
   #52859# Autor-Button nicht anzeigen

      Rev 1.93   09 Jul 1998 09:53:22   JP
   EmptyStr benutzen

      Rev 1.92   13 Jun 1998 16:08:48   OS
   FN_INSERT_FIELD_CONTROL ruft auch Feldbefehl-Dialog

      Rev 1.91   19 May 1998 12:45:50   OM
   SvxMacro-Umstellung

      Rev 1.90   24 Mar 1998 13:43:34   JP
   neu: Redline fuer harte Attributierung

      Rev 1.89   18 Mar 1998 18:20:10   OM
   Redlines schneller selektieren

      Rev 1.88   18 Mar 1998 18:06:26   OM
   Redlines schneller selektieren

      Rev 1.87   28 Feb 1998 15:13:54   OM
   Accept / reject changes

      Rev 1.86   26 Feb 1998 11:10:02   OM
   Redlining-Travelling anzeigen

      Rev 1.85   25 Feb 1998 16:49:46   OM
   Fixe Author- und ExtUser-Felder

      Rev 1.84   12 Feb 1998 13:22:48   OM
   Traveling zwischen Redline-Objekten

      Rev 1.83   10 Feb 1998 17:08:58   OM
   Redlining kommentieren

      Rev 1.82   27 Jan 1998 22:42:18   JP
   GetNumDepend durch GetDepends ersetzt

      Rev 1.81   23 Jan 1998 16:07:14   MA
   includes

      Rev 1.80   13 Jan 1998 16:57:54   OM
   #46549# Notiz einfuegen

      Rev 1.79   12 Jan 1998 17:09:32   OM
   Zu TYP_SETREFFLD per Basic springen

      Rev 1.78   19 Dec 1997 18:25:34   OM
   Feldbefehl-bearbeiten Dlg

      Rev 1.77   10 Dec 1997 10:08:28   OM
   Alten Feldbefehl-Dlg entfernt

      Rev 1.76   05 Dec 1997 13:16:56   OM
   #45750# DDE-Field Delimiter fuer Basic wandeln

      Rev 1.75   04 Dec 1997 08:31:50   OS
   NextFieldByType: SubType fuer SETFLD nicht setzen #45912#

      Rev 1.74   29 Nov 1997 15:52:12   MA
   includes

      Rev 1.73   24 Nov 1997 09:47:08   MA
   includes

      Rev 1.72   10 Nov 1997 15:40:04   OS
   MoveFldType mit SubType #45425#

      Rev 1.71   03 Nov 1997 13:55:48   MA
   precomp entfernt

      Rev 1.70   28 Oct 1997 15:07:16   OM
   Neuer Feldbefehl-Dialog angefangen

      Rev 1.69   20 Oct 1997 15:41:24   OS
   GotoNext/PrevInputField: Selektion aufheben #44846#

      Rev 1.68   24 Sep 1997 15:20:30   OM
   Feldumstellung

      Rev 1.67   03 Sep 1997 16:02:10   OS
   include

      Rev 1.66   01 Sep 1997 13:23:58   OS
   DLL-Umstellung

      Rev 1.65   15 Aug 1997 11:48:38   OS
   chartar/frmatr/txtatr aufgeteilt

      Rev 1.64   08 Aug 1997 17:28:48   OM
   Headerfile-Umstellung

      Rev 1.63   12 Jul 1997 12:11:02   OS
   FN_JAVAEDIT: Parameter fuer URL und ScriptType nachgetragen

      Rev 1.62   10 Jul 1997 16:07:22   OM
   Aufgeraeumt

      Rev 1.61   26 Jun 1997 09:43:40   OM
   Basic: Datenbank in Feldbefehlen ersetzen

      Rev 1.60   25 Jun 1997 15:42:26   OS
   CurField(Sub)Type: DATE und TIME mappen  #40967#

      Rev 1.59   21 Jun 1997 14:52:24   OS
   neu: FieldPrompt

      Rev 1.58   20 Jun 1997 15:17:38   OS
   GetShell()s reduziert

      Rev 1.57   18 Jun 1997 18:09:38   OM
   Adressfeld: Focus je nach Typ im Dialog setzen

      Rev 1.56   12 Jun 1997 15:34:08   JP
   Feld-Slots aus der TextShell in die BaseShell verschoben

      Rev 1.55   09 Jun 1997 11:39:46   JP
   fuer TYP_SETREFFLD gibt es keinen FeldTypen

      Rev 1.54   04 Jun 1997 14:08:06   OM
   #40431# Scriptfeld: Felbefehle bearbeiten disablen

      Rev 1.53   27 May 1997 13:36:24   OS
   neu: CurFieldType, CurFieldSubType

      Rev 1.52   12 May 1997 16:09:26   OM
   #39823# GPF bei blaettern zwischen Notizen behoben

      Rev 1.51   23 Apr 1997 15:15:44   OS
   FieldType anlegen

      Rev 1.50   08 Apr 1997 10:52:22   OM
   Fehlende Includes

      Rev 1.49   07 Apr 1997 16:45:24   OM
   HyperlinkItem recorden

      Rev 1.48   18 Mar 1997 15:31:16   OM
   Segmentiert

      Rev 1.47   18 Mar 1997 15:30:56   OM
   Datenbanktrenner wandeln

      Rev 1.46   23 Feb 1997 15:05:20   OS
   SetUserFieldValue liefert BOOL

      Rev 1.45   21 Feb 1997 16:08:38   OM
   Eingefuegten Hyperlink aufzeichnen

      Rev 1.44   13 Feb 1997 17:38:22   OM
   Script-Dlg

      Rev 1.43   11 Feb 1997 16:52:24   OM
   Eingabefeld ueber Basic ohne Dialog einfuegen

      Rev 1.42   05 Feb 1997 12:39:32   OM
   Feldbefehl Seitennummer auf Standardvorlage defaulten

      Rev 1.41   09 Dec 1996 14:43:16   OM
   SwPostItDlg durch SvxPostItDlg ersetzt

      Rev 1.40   06 Nov 1996 07:10:16   OS
   FN_GET_FIELD_VALUE optimiert

      Rev 1.39   01 Oct 1996 16:54:02   OM
   Hyperlinks editieren

      Rev 1.38   26 Sep 1996 14:40:28   OM
   Datenbankfelder ueber Basic einfuegen

      Rev 1.37   24 Sep 1996 16:42:32   OS
   neue Slots fuer FieldTypes

      Rev 1.36   24 Sep 1996 13:49:58   OM
   Neuer Datenbanktrenner

      Rev 1.35   20 Sep 1996 12:01:42   OS
   Formate fuer Seitennummer/Seitenzahl-Felder korrigiert

      Rev 1.34   19 Sep 1996 16:08:34   OS
   neue Slots zum direkten Feldeinfuegen

      Rev 1.33   19 Sep 1996 10:58:56   OM
   neue Parameter fuer GetDatabaseFieldValue

      Rev 1.32   02 Sep 1996 18:43:08   JP
   INetFeld entfernt

      Rev 1.31   30 Aug 1996 12:41:24   OS
   InputFldDlg mit Next-Button

      Rev 1.30   28 Aug 1996 15:54:56   OS
   includes

      Rev 1.29   23 Aug 1996 14:49:20   OM
   Neue Segs

      Rev 1.28   23 Aug 1996 14:48:00   OM
   Datenbank: Drag&Drop

      Rev 1.27   21 Aug 1996 13:09:24   OS
   FldMgr mit Shell anlegen -> richtige view benutzen

      Rev 1.26   20 Aug 1996 17:23:00   JP
   InsertURL: Shell wieder in StdMode schalten

      Rev 1.25   20 Aug 1996 15:39:10   JP
   InsertURL: statt FeldManager direkt an die Shell gehen

      Rev 1.24   24 Jun 1996 18:29:14   HJS
   includes

      Rev 1.23   12 Jun 1996 15:16:30   OM
   Optimiert

      Rev 1.22   12 Jun 1996 14:56:50   OM
   Target aus Hyperlinkleiste uebernehmen

      Rev 1.21   04 Jun 1996 18:43:46   JP
   neu: ab CursorPosition Next/Prev-InputField suchen und Dialog hochziehem

      Rev 1.20   31 May 1996 15:27:08   OM
   Ueberfluessigen Include entfernt

      Rev 1.19   28 May 1996 15:23:38   OM
   Neue Basic-Cmds fuer Datenbanken

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/shells/textglos.cxx b/sw/source/ui/shells/textglos.cxx
new file mode 100644
index 0000000..e85c9ef
--- /dev/null
+++ b/sw/source/ui/shells/textglos.cxx
@@ -0,0 +1,209 @@
/*************************************************************************
 *
 *  $RCSfile: textglos.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:47 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SFXITEMSET_HXX //autogen
#include <svtools/itemset.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif

#include "errhdl.hxx"
#include "view.hxx"
#include "initui.hxx"
#include "cmdid.h"
#include "textsh.hxx"
#include "initui.hxx"
#include "glossary.hxx"
#include "gloshdl.hxx"
#include "glosdoc.hxx"
#include "gloslst.hxx"

// STATIC DATA -----------------------------------------------------------

void SwTextShell::ExecGlossary(SfxRequest &rReq)
{
    USHORT nSlot = rReq.GetSlot();
    ::GetGlossaries()->UpdateGlosPath(!rReq.IsAPI() ||
                                        FN_GLOSSARY_DLG == nSlot );
    SwGlossaryHdl* pGlosHdl = GetView().GetGlosHdl();
    // SwGlossaryList updaten?
    BOOL bUpdateList = FALSE;

    switch( nSlot )
    {
        case FN_GLOSSARY_DLG:
            pGlosHdl->GlossaryDlg();
            bUpdateList = TRUE;
            break;
        case FN_EXPAND_GLOSSARY:
        {
            BOOL bReturn;
            bReturn = pGlosHdl->ExpandGlossary( TRUE );
            rReq.SetReturnValue( SfxBoolItem( nSlot, bReturn ) );
        }
        break;
        default:
            ASSERT(FALSE, falscher Dispatcher);
            return;
    }
    if(bUpdateList)
    {
        SwGlossaryList* pList = ::GetGlossaryList();
        if(pList->IsActive())
            pList->Update();
    }
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.24  2000/09/18 16:06:06  willem.vandorp
    OpenOffice header added.

    Revision 1.23  2000/05/26 07:21:33  os
    old SW Basic API Slots removed

    Revision 1.22  2000/04/18 14:58:24  os
    UNICODE

    Revision 1.21  2000/02/10 10:37:03  os
    #70359# titles added to AutoText groups

    Revision 1.20  1997/11/24 08:47:08  MA
    includes


      Rev 1.19   24 Nov 1997 09:47:08   MA
   includes

      Rev 1.18   03 Nov 1997 13:55:46   MA
   precomp entfernt

      Rev 1.17   20 Aug 1997 15:24:28   OS
   GetGlossaryGroupName: Pfad-Extension an Position Null nicht ausgeben #42968#

      Rev 1.16   19 Aug 1997 10:39:04   OS
   ExpandGlossary darf per API keine MessageBoxen erzeugen #42903#

      Rev 1.15   07 Apr 1997 17:42:26   MH
   chg: header

      Rev 1.14   14 Mar 1997 14:38:18   OS
   neu: CreateGlossaryGroup

      Rev 1.13   27 Sep 1996 12:51:52   OS
   Updates fuer die GlossaryList

      Rev 1.12   21 Sep 1996 15:57:32   OS
   InsertGlossary returnt BOOL

      Rev 1.11   30 Aug 1996 12:41:02   OS
   UpdateGlosPath kann Blockliste aktualisieren

      Rev 1.10   28 Aug 1996 15:54:48   OS
   includes

      Rev 1.9   29 Jul 1996 12:12:18   OS
   vor jeder Textblock-Operation den GlossaryPath updaten

      Rev 1.8   17 Jul 1996 07:48:52   OS
   neu: GetGlossaryShortName

      Rev 1.7   22 May 1996 15:33:06   OS
   InsertGlossary: akt. Gruppe auch am pGlosHdl setzen

      Rev 1.6   30 Apr 1996 08:04:00   OS
   auch im RenameGlossary darf die aktuelle Gruppe nicht am gloshdl eingestell werden, Bug#27350#

      Rev 1.5   13 Mar 1996 16:25:48   OS
   neu: RenameGlossary

      Rev 1.4   10 Mar 1996 15:46:34   OS
   neue Slots fuer Autotext: Gruppenanzahl und Elemente erfragen

      Rev 1.3   17 Feb 1996 12:36:00   OS
   neu: Textbausteine und -gruppen loeschen, Bug #25606#, NewGlossary legt jetzt auch Bereiche neu an, Bug #25576#

      Rev 1.2   26 Jan 1996 11:00:16   OS
   akt. Gruppe fuer Textbausteine nur am GlossaryDlg und nicht am GlossaryHdl setzen, Bug #24473#

      Rev 1.1   30 Nov 1995 15:26:28   OS
   +pragma

      Rev 1.0   30 Nov 1995 12:37:28   OM
   Initial revision.

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/shells/textidx.cxx b/sw/source/ui/shells/textidx.cxx
new file mode 100644
index 0000000..ddbb82a
--- /dev/null
+++ b/sw/source/ui/shells/textidx.cxx
@@ -0,0 +1,437 @@
/*************************************************************************
 *
 *  $RCSfile: textidx.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:47 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop
#include <hintids.hxx>
#include <uiparam.hxx>
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SFXITEMSET_HXX //autogen
#include <svtools/itemset.hxx>
#endif
#ifndef _SFXVIEWFRM_HXX //autogen
#include <sfx2/viewfrm.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif

#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SVX_SIZEITEM_HXX //autogen
#include <svx/sizeitem.hxx>
#endif
#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _FLDBAS_HXX
#include <fldbas.hxx>
#endif

#include "viewopt.hxx"
#include "cmdid.h"
#include "view.hxx"
#include "wrtsh.hxx"
#include "swundo.hxx"                   // fuer Undo-Ids
#include "textsh.hxx"
#include "idx.hxx"
#include "idxmrk.hxx"
#include "multmrk.hxx"
#include "usridx.hxx"
#include "cnttab.hxx"
#include "toxmgr.hxx"

// STATIC DATA -----------------------------------------------------------

void SwTextShell::ExecIdx(SfxRequest &rReq)
{
    const SfxItemSet *pArgs = rReq.GetArgs();
    const SfxPoolItem* pItem = 0;
    USHORT nSlot = rReq.GetSlot();
    if(pArgs)
       pArgs->GetItemState(nSlot, FALSE, &pItem );

    SfxViewFrame* pVFrame = GetView().GetViewFrame();
    Window *pMDI = &pVFrame->GetWindow();

    switch( nSlot )
    {
        case FN_EDIT_AUTH_ENTRY_DLG :
        {
            SwAuthMarkModalDlg* pDlg = new SwAuthMarkModalDlg(pMDI, GetShell());
            pDlg->Execute();
            delete pDlg;
        }
        break;
        case FN_INSERT_AUTH_ENTRY_DLG:
        {
            // no BASIC support
            pVFrame->ToggleChildWindow(FN_INSERT_AUTH_ENTRY_DLG);

            SwInsertAuthMarkWrapper *pAuthMrk = (SwInsertAuthMarkWrapper*)
                                pVFrame->GetChildWindow(FN_INSERT_AUTH_ENTRY_DLG);

            Invalidate(rReq.GetSlot());
        }
        break;
        case FN_INSERT_IDX_ENTRY_DLG:
        {
            pVFrame->ToggleChildWindow(FN_INSERT_IDX_ENTRY_DLG);
            Invalidate(rReq.GetSlot());
        }
        break;
        case FN_EDIT_IDX_ENTRY_DLG:
        {
            SwTOXMgr aMgr(GetShellPtr());
            USHORT nRet = RET_OK;
            if(aMgr.GetTOXMarkCount() > 1)
            {   // Mehrere Marken, welche solls denn sein ?
                //
                SwMultiTOXMarkDlg* pMultDlg = new SwMultiTOXMarkDlg(pMDI, aMgr);
                nRet = pMultDlg->Execute();
                delete pMultDlg;
            }
            if( nRet == RET_OK)
            {
                SwIndexMarkModalDlg* pDlg = new SwIndexMarkModalDlg(pMDI, GetShell());
                pDlg->Execute();
                delete pDlg;
            }
            break;
        }
        case FN_IDX_MARK_TO_IDX:
        {
            GetShell().GotoTOXMarkBase();
            break;
        }
        case FN_INSERT_MULTI_TOX:
        {
            SfxItemSet aSet(GetPool(),
                            RES_COL, RES_COL,
                            RES_BACKGROUND, RES_BACKGROUND,
                            RES_FRM_SIZE, RES_FRM_SIZE,
                            SID_ATTR_PAGE_SIZE, SID_ATTR_PAGE_SIZE,
                            RES_LR_SPACE, RES_LR_SPACE,
                            FN_PARAM_TOX_TYPE, FN_PARAM_TOX_TYPE,
                            0   );
            SwWrtShell& rSh = GetShell();
            SwRect aRect;
            rSh.CalcBoundRect(aRect, FLY_IN_CNTNT);

            long nWidth = aRect.Width();
            aSet.Put(SwFmtFrmSize(ATT_VAR_SIZE, nWidth));
            // Hoehe=Breite fuer konsistentere Vorschau (analog zu Bereich bearbeiten)
            aSet.Put(SvxSizeItem(SID_ATTR_PAGE_SIZE, Size(nWidth, nWidth)));
            const SwTOXBase* pCurTOX = rSh.GetCurTOX();
            if(pCurTOX)
            {
                const SfxItemSet* pSet = pCurTOX->GetAttrSet();
                if(pSet)
                    aSet.Put(*pSet);
            }

            SwMultiTOXTabDialog* pDlg = new SwMultiTOXTabDialog(pMDI, aSet, rSh, pCurTOX);
            pDlg->Execute();
            delete pDlg;
        }
        break;
        case FN_REMOVE_CUR_TOX:
        {
            SwWrtShell& rSh = GetShell();
            const SwTOXBase* pBase = rSh.GetCurTOX();
            DBG_ASSERT(pBase, "no TOXBase to remove")
            if( pBase )
                rSh.DeleteTOX(*pBase, TRUE);
        }
        break;
        default:
            ASSERT(!this, falscher Dispatcher);
            return;
    }
}


void SwTextShell::GetIdxState(SfxItemSet &rSet)
{
    SwWrtShell& rSh = GetShell();
    SfxViewFrame* pVFrame = GetView().GetViewFrame();
    SwInsertIdxMarkWrapper *pIdxMrk = (SwInsertIdxMarkWrapper*)
                        pVFrame->GetChildWindow(FN_INSERT_IDX_ENTRY_DLG);

    SfxChildWindow* pAuthMark = pVFrame->GetChildWindow(FN_INSERT_AUTH_ENTRY_DLG);

    const BOOL bHtmlMode = 0 != ::GetHtmlMode( GetView().GetDocShell() );
    const SwTOXBase* pBase = 0;
    if( bHtmlMode || 0 != ( pBase = rSh.GetCurTOX()) )
    {
        USHORT nBase = 0;
        if( pBase )
        {
            if(pBase->IsTOXBaseInReadonly())
            {
                rSet.DisableItem( FN_INSERT_MULTI_TOX );
            }
        }

        rSet.DisableItem( FN_EDIT_IDX_ENTRY_DLG );
        rSet.DisableItem( FN_EDIT_AUTH_ENTRY_DLG );

        if(!pIdxMrk)
            rSet.DisableItem( FN_INSERT_IDX_ENTRY_DLG );
        else
            rSet.Put(SfxBoolItem(FN_INSERT_IDX_ENTRY_DLG, TRUE));

        if(!pAuthMark)
            rSet.DisableItem( FN_INSERT_AUTH_ENTRY_DLG );
        else
            rSet.Put(SfxBoolItem(FN_INSERT_AUTH_ENTRY_DLG, TRUE));

    }
    else //if( SFX_ITEM_UNKNOWN != rSet.GetItemState( FN_EDIT_IDX_ENTRY_DLG ))
    {

        BOOL bEnableEdit = TRUE;
        BOOL bInReadonly = rSh.HasReadonlySel();
        if( rSh.HasSelection() || bInReadonly)
            bEnableEdit = FALSE;
        else
        {
            SwTOXMarks aArr;
            rSh.GetCurTOXMarks( aArr );
            if( !aArr.Count())
                bEnableEdit = FALSE;
        }

        if(!bEnableEdit)
            rSet.DisableItem( FN_EDIT_IDX_ENTRY_DLG );

        if(bInReadonly)
        {
            rSet.DisableItem(FN_INSERT_IDX_ENTRY_DLG);
            rSet.DisableItem( FN_INSERT_MULTI_TOX );
        }
        else
            rSet.Put(SfxBoolItem(FN_INSERT_IDX_ENTRY_DLG,
                                    0 != pIdxMrk));


        SwField* pField = rSh.GetCurFld();

        if(bInReadonly)
            rSet.DisableItem(FN_INSERT_AUTH_ENTRY_DLG);
        else
            rSet.Put(SfxBoolItem(FN_INSERT_AUTH_ENTRY_DLG, 0 != pAuthMark));

        if( bInReadonly || !pField ||
            pField->GetTyp()->Which() != RES_AUTHORITY)
            rSet.DisableItem(FN_EDIT_AUTH_ENTRY_DLG);
        rSet.DisableItem(FN_REMOVE_CUR_TOX);
    }
}

// -----------------------------------------------------------------------
/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.42  2000/09/18 16:06:06  willem.vandorp
    OpenOffice header added.

    Revision 1.41  2000/09/08 08:12:52  os
    Change: Set/Toggle/Has/Knows/Show/GetChildWindow

    Revision 1.40  2000/05/26 07:21:33  os
    old SW Basic API Slots removed

    Revision 1.39  2000/02/11 14:57:51  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.38  2000/01/17 13:33:00  os
    #70703# apply to all similar texts: search options case sensitive and word only

    Revision 1.37  1999/12/10 15:17:04  os
    #70711# readonly check for index entries now in GetIdxState

    Revision 1.36  1999/10/15 11:44:08  os
    new: FN_REMOVE_TOX

    Revision 1.35  1999/10/06 12:15:01  os
    edit tox entry dialogs now modal

    Revision 1.34  1999/09/15 13:57:53  os
    dialog for authorities

    Revision 1.33  1999/09/08 12:43:18  os
    GetIdxState corrected

    Revision 1.32  1999/09/07 13:55:52  os
    Insert/EditIndexEntry as FloatingWindow

    Revision 1.31  1999/08/25 13:27:20  OS
    extended indexes: remove old code


      Rev 1.30   25 Aug 1999 15:27:20   OS
   extended indexes: remove old code

      Rev 1.29   23 Aug 1999 09:51:52   OS
   extended indexes: InsertTOXMark simplified

      Rev 1.28   17 Aug 1999 13:59:02   OS
   extended indexes: get/set section attributes

      Rev 1.27   30 Jul 1999 13:14:36   OS
   indexes: check readonly in status method

      Rev 1.26   07 Jul 1999 08:13:46   OS
   extended indexes: SwTOXMgr interface changed

      Rev 1.25   02 Jul 1999 11:07:50   OS
   extended indexes: smaller interface SwTOXMgr

      Rev 1.24   21 Jun 1999 10:00:52   OS
   extended indexes

      Rev 1.23   29 Mar 1999 14:37:24   OS
   #63929# Range fuer ItemSet festlegen

      Rev 1.22   29 Mar 1999 12:19:30   OS
   #63929# neuer Verzeichnisdialog vollstaendig

      Rev 1.21   26 Mar 1999 11:38:26   OS
   #63929# Neuer Verzeichnisdialog

      Rev 1.20   20 Jan 1999 11:35:58   OS
   #60881# Verzeichniseintraege mehrfach einf?gen

      Rev 1.19   24 Nov 1997 09:47:10   MA
   includes

      Rev 1.18   03 Nov 1997 13:55:44   MA
   precomp entfernt

      Rev 1.17   05 Sep 1997 13:36:00   OS
   pBase initialisieren, Rahmenslektion schliesst TextShell aus

      Rev 1.16   28 Aug 1997 19:48:02   JP
   GetIdxState: optimiert, im Verzeichnis InsertEntry abklemmen

      Rev 1.15   23 Jul 1997 21:28:56   HJS
   includes

      Rev 1.14   07 Jul 1997 09:39:34   OS
   fuer Userverzeichnisse aus Vorlagen muss immer ein Strin uebergeben werden

      Rev 1.13   03 Jul 1997 09:16:42   JP
   FN_INSERT_CNTNTIDX_ENTRY: Level auf 1 defaulten

      Rev 1.12   16 Jun 1997 12:02:26   OS
   Verzeichnisfunktionen und -dialoge ohne Record-Flag

      Rev 1.11   07 Apr 1997 17:44:46   MH
   chg: header

      Rev 1.10   27 Jan 1997 16:30:36   OS
   HtmlMode entfernt

      Rev 1.9   11 Dec 1996 10:50:56   MA
   Warnings

      Rev 1.8   23 Nov 1996 13:24:46   OS
   im HtmlMode Verzeichnis einfuegen disabled

      Rev 1.7   24 Oct 1996 20:59:38   JP
   State: bei Selektion darf kein VerzeichnisEintrag bearbeitet werden

      Rev 1.6   09 Sep 1996 21:16:28   MH
   Umstellungen wg. internal Compiler Errors

      Rev 1.5   28 Aug 1996 15:54:52   OS
   includes

      Rev 1.4   07 Jun 1996 09:12:44   OS
   CreateForm fuer Inhaltsverzeichnis abgesichert Bug #28429#

      Rev 1.3   03 Jun 1996 10:18:06   OS
   vohandene Verzeichnisse beim Einfuegen updaten (Basic) Bug #28233#

      Rev 1.2   22 Mar 1996 15:29:32   TRI
   sfxiiter.hxx included

      Rev 1.1   30 Nov 1995 15:09:58   OM
   Segs

      Rev 1.0   30 Nov 1995 14:26:00   OM
   Initial revision.

------------------------------------------------------------------------*/

diff --git a/sw/source/ui/shells/textsh.cxx b/sw/source/ui/shells/textsh.cxx
new file mode 100644
index 0000000..1e06a14
--- /dev/null
+++ b/sw/source/ui/shells/textsh.cxx
@@ -0,0 +1,1043 @@
/*************************************************************************
 *
 *  $RCSfile: textsh.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:47 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#define _SW_FRMVALID_HXX
#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _UIPARAM_HXX
#include <uiparam.hxx>
#endif


#ifndef __RSC //autogen
#include <tools/errinf.hxx>
#endif
#ifndef _SVDVIEW_HXX //autogen
#include <svx/svdview.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _PLUGIN_HXX //autogen wg. SvPlugInObject
#include <so3/plugin.hxx>
#endif
#ifndef _SFXPTITEM_HXX //autogen
#include <svtools/ptitem.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _SFXMSG_HXX //autogen
#include <sfx2/msg.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SFX_FCONTNR_HXX //autogen
#include <sfx2/fcontnr.hxx>
#endif
#ifndef _SVX_HLNKITEM_HXX //autogen
#include <svx/hlnkitem.hxx>
#endif
#ifndef _SBASLTID_HRC //autogen
#include <offmgr/sbasltid.hrc>
#endif
#ifndef _SVX_SRCHITEM_HXX //autogen
#include <svx/srchitem.hxx>
#endif
#ifndef _SVX_CHARMAP_HXX //autogen
#include <svx/charmap.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SFX_DOCFILT_HACK_HXX //autogen
#include <sfx2/docfilt.hxx>
#endif
#ifndef _SFXDOCFILE_HXX //autogen
#include <sfx2/docfile.hxx>
#endif
#ifndef SVTOOLS_URIHELPER_HXX
#include <svtools/urihelper.hxx>
#endif
#ifndef __SBX_SBXVARIABLE_HXX //autogen
#include <svtools/sbxvar.hxx>
#endif
#ifndef _SFX_WHITER_HXX //autogen
#include <svtools/whiter.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SVX_OPAQITEM_HXX //autogen
#include <svx/opaqitem.hxx>
#endif
#ifndef _SVX_FONTITEM_HXX //autogen
#include <svx/fontitem.hxx>
#endif
#ifndef _SVX_ADJITEM_HXX //autogen
#include <svx/adjitem.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_SIZEITEM_HXX //autogen
#include <svx/sizeitem.hxx>
#endif
#ifndef _MySVXACORR_HXX
#include <svx/svxacorr.hxx>
#endif
#ifndef _FILTER_HXX //autogen
#include <svtools/filter.hxx>
#endif
#ifndef SMDLL_HXX
#include <starmath/smdll0.hxx>
#endif
#ifndef _SCHDLL0_HXX
#include <sch/schdll0.hxx>
#endif
#ifndef _SCH_DLL_HXX
#include <sch/schdll.hxx>
#endif
#ifndef _SCH_MEMCHRT_HXX
#include <sch/memchrt.hxx>
#endif
#ifndef _SIMDLL_HXX
#include <sim2/simdll0.hxx>
#endif
#ifndef _SVX_HTMLMODE_HXX
#include <svx/htmlmode.hxx>
#endif
#ifndef _SVX_PFILEDLG_HXX //autogen wg. SvxPluginFileDlg
#include <svx/pfiledlg.hxx>
#endif
#ifndef _OFA_HTMLCFG_HXX //autogen
#include <offmgr/htmlcfg.hxx>
#endif
#ifndef _OFAACCFG_HXX //autogen
#include <offmgr/ofaaccfg.hxx>
#endif

#ifndef _SWWDOCSH_HXX //autogen
#include <wdocsh.hxx>
#endif
#ifndef _FMTINFMT_HXX //autogen
#include <fmtinfmt.hxx>
#endif
#ifndef _FMTCLDS_HXX //autogen
#include <fmtclds.hxx>
#endif
#ifndef _FMTSRND_HXX //autogen
#include <fmtsrnd.hxx>
#endif
#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _UITOOL_HXX
#include <uitool.hxx>
#endif
#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif
#ifndef _FRMMGR_HXX
#include <frmmgr.hxx>
#endif
#ifndef _TEXTSH_HXX
#include <textsh.hxx>
#endif
#ifndef _INSTABLE_HXX
#include <instable.hxx>
#endif
#ifndef _FRMFMT_HXX
#include <frmfmt.hxx>
#endif
#ifndef _TABLEMGR_HXX
#include <tablemgr.hxx>
#endif
#ifndef _SWUNDO_HXX
#include <swundo.hxx>       // fuer Undo-IDs
#endif
#ifndef _SHELLIO_HXX
#include <shellio.hxx>
#endif
#ifndef _FRMDLG_HXX
#include <frmdlg.hxx>
#endif
#ifndef _USRPREF_HXX
#include <usrpref.hxx>
#endif
#ifndef _SWTABLE_HXX
#include <swtable.hxx>
#endif
#ifndef _TBLAFMT_HXX
#include <tblafmt.hxx>
#endif
#ifndef _INSRULE_HXX
#include <insrule.hxx>
#endif
#ifndef _CAPTION_HXX
#include <caption.hxx>
#endif
#ifndef _IDXMRK_HXX
#include <idxmrk.hxx>
#endif
#ifndef _POOLFMT_HXX
#include <poolfmt.hxx>
#endif

#ifndef _SHELLS_HRC
#include <shells.hrc>
#endif
#ifndef _POPUP_HRC
#include <popup.hrc>
#endif
#ifndef _SWERROR_H
#include <swerror.h>
#endif
#ifndef _MODOPT_HXX //autogen
#include <modcfg.hxx>
#endif
#ifndef _COLUMN_HXX
#include <column.hxx>
#endif

#define SwTextShell
#define Paragraph
#define HyphenZone
#define TextFont
#define DropCap
#ifndef _ITEMDEF_HXX
#include <itemdef.hxx>
#endif
#ifndef _SWSLOTS_HXX
#include <swslots.hxx>
#endif

#define C2S(cChar) UniString::CreateFromAscii(cChar)

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SFX_IMPL_INTERFACE(SwTextShell, SwBaseShell, SW_RES(STR_SHELLNAME_TEXT))
{
    SFX_POPUPMENU_REGISTRATION(SW_RES(MN_TEXT_POPUPMENU));
    SFX_OBJECTBAR_REGISTRATION(SFX_OBJECTBAR_OBJECT, SW_RES(RID_TEXT_TOOLBOX));
    SFX_OBJECTMENU_REGISTRATION(SID_OBJECTMENU0, SW_RES(MN_OBJECTMENU_TEXT));
    SFX_CHILDWINDOW_REGISTRATION(FN_EDIT_FORMULA);
    SFX_CHILDWINDOW_REGISTRATION(SID_INSERT_DIAGRAM);
    SFX_CHILDWINDOW_REGISTRATION(FN_INSERT_FIELD);
    SFX_CHILDWINDOW_REGISTRATION(FN_INSERT_IDX_ENTRY_DLG);
    SFX_CHILDWINDOW_REGISTRATION(FN_INSERT_AUTH_ENTRY_DLG);
}



TYPEINIT1(SwTextShell,SwBaseShell)



void SwTextShell::ExecInsert(SfxRequest &rReq)
{
    SwWrtShell &rSh = GetShell();

    ASSERT( !rSh.IsObjSelected() && !rSh.IsFrmSelected(),
            "Falsche Shell auf dem Dispatcher" );

    const SfxItemSet *pArgs = rReq.GetArgs();
    const SfxPoolItem* pItem = 0;
    USHORT nSlot = rReq.GetSlot();
    if(pArgs)
        pArgs->GetItemState(nSlot, FALSE, &pItem );

    switch( nSlot )
    {
    case FN_INSERT_SOFT_HYPHEN:
        if( CHAR_SOFTHYPHEN != rSh.SwCrsrShell::GetChar( TRUE, 0 ) &&
            CHAR_SOFTHYPHEN != rSh.SwCrsrShell::GetChar( TRUE, -1 ))
            rSh.Insert( String( CHAR_SOFTHYPHEN ) );
        break;

    case FN_INSERT_HARDHYPHEN:
    case FN_INSERT_HARD_SPACE:
        {
            sal_Unicode cIns = FN_INSERT_HARD_SPACE == nSlot ? CHAR_HARDBLANK
                                                             : CHAR_HARDHYPHEN;

            SvxAutoCorrect* pACorr = OFF_APP()->GetAutoCorrConfig()->GetAutoCorrect();
            if( pACorr && pACorr->IsAutoCorrFlag( CptlSttSntnc | CptlSttWrd |
                                ChgFractionSymbol | ChgOrdinalNumber |
                                ChgToEnEmDash | SetINetAttr | Autocorrect ))
                rSh.AutoCorrect( *pACorr, cIns );
            else
                rSh.Insert( String( cIns ) );
        }
        break;

    case FN_INSERT_BREAK:
        rSh.SplitNode();
    break;
    case FN_INSERT_PAGEBREAK:
        rSh.InsertPageBreak();
    break;
    case FN_INSERT_LINEBREAK:
        rSh.InsertLineBreak();
    break;
    case FN_INSERT_COLUMN_BREAK:
        rSh.InsertColumnBreak();
    break;
    case SID_HYPERLINK_SETLINK:
        if (pItem)
            InsertHyperlink(*((const SvxHyperlinkItem *)pItem));
        break;
    case  SID_INSERT_SOUND:
    case  SID_INSERT_VIDEO:
    {
        SvxPluginFileDlg aDlg( &GetView().GetViewFrame()->GetWindow(), nSlot );

        if ( RET_OK == aDlg.Execute() )
        {
            // URL ermitteln
            String aStrURL( aDlg.GetPath() );
            aStrURL = URIHelper::SmartRelToAbs( aStrURL );

            INetURLObject* pURL = new INetURLObject();
            pURL->SetSmartProtocol( INET_PROT_FILE );

            if ( pURL->SetURL( aStrURL, INetURLObject::WAS_ENCODED ) )
            {
                SvFactory * pFactory = SvFactory::GetDefaultPlugInFactory();
                SvStorageRef aStor = new SvStorage( aEmptyStr, STREAM_STD_READWRITE );
                SvPlugInObjectRef xObj = &pFactory->CreateAndInit( *pFactory, aStor );
                xObj->SetPlugInMode( (USHORT)PLUGIN_EMBEDED );
                xObj->SetURL( *pURL );
                SvPlugInObject* pObj = &xObj;
                SvInPlaceObjectRef *pxIns = new SvInPlaceObjectRef(pObj);
                rSh.Insert( pxIns, 0, TRUE, nSlot);
            }
        }
    }
    break;
    case SID_INSERT_OBJECT:
    case SID_INSERT_PLUGIN:
    case SID_INSERT_APPLET:
    case SID_INSERT_FLOATINGFRAME:
        rSh.Insert( (SvInPlaceObjectRef*)0, 0, TRUE, nSlot);
        break;

    case SID_INSERT_DIAGRAM:
        {
            if ( !SFX_APP()->HasFeature( SFX_FEATURE_SCHART ) )
                break;
            if(!rReq.IsAPI())
            {
                SfxViewFrame* pVFrame = GetView().GetViewFrame();
                pVFrame->ToggleChildWindow( SID_INSERT_DIAGRAM );
            }
            else
            {
                const SwFrmFmt* pTFmt = rSh.GetTableFmt();
                if( pTFmt && !rSh.IsTblComplexForChart() )
                {
                    SchMemChart* pData = 0;
                    rSh.UpdateChartData( pTFmt->GetName(), pData );

                    SwTableFUNC( &rSh, FALSE ).InsertChart( *pData );
                    rSh.LaunchOLEObj();

                    delete pData;
                }
                else
                {
                    rSh.Insert( 0, SCH_MOD()->pSchChartDocShellFactory );
                }
                SvInPlaceObjectRef xOLE = rSh.GetOLEObj();
                if(pItem && xOLE.Is())
                {
                    Size aSize(((SvxSizeItem*)pItem)->GetSize());
                    aSize = OutputDevice::LogicToLogic
                                    ( aSize, MapMode( MAP_TWIP ), MapMode( MAP_100TH_MM ) );

                    if(aSize.Width() > MINLAY&& aSize.Height()> MINLAY)
                    {
                        Rectangle aRect = xOLE->GetVisArea();
                        aRect.SetSize(aSize);
                        xOLE->SetVisArea( aRect );
                    }
                }
            }
        }
        break;

    case FN_INSERT_SIM:
        {
            rSh.Insert( 0, SIM_MOD()->pSimDrawDocShellFactory );
        }
        break;

    case FN_INSERT_SMA:
        {
            rSh.Insert( 0, SM_MOD()->pSmDocShellFactory );
        }
        break;

    case FN_INSERT_TABLE:
        if( !rSh.GetTableFmt() && !(rSh.GetFrmType(0,TRUE) & FRMTYPE_FOOTNOTE))
        {
            SwView &rView = GetView(); // Da GetView() nach Shellwechsel nicht mehr geht
            BOOL bHTMLMode = 0 != (::GetHtmlMode(rView.GetDocShell())&HTMLMODE_ON);
            BOOL bCallEndUndo = FALSE;

            if( !pArgs && rSh.IsSelection() && !rSh.IsInClickToEdit() )
            {
                const SwModuleOptions* pModOpt = SW_MOD()->GetModuleConfig();
                USHORT nInsTblFlags = pModOpt->GetInsTblFlags(bHTMLMode);

                rSh.StartUndo(UNDO_INSTABLE);
                bCallEndUndo = TRUE;

                BOOL bInserted = rSh.TextToTable('\t', HORI_FULL, nInsTblFlags);
                rSh.EnterStdMode();
                if (bInserted)
                    rView.AutoCaption(TABLE_CAP);
            }
            else
            {
                USHORT nCols = 0;
                USHORT nRows = 0;
                USHORT nInsTblFlags = ALL_TBL_INS_ATTR;
                String aTableName;
                SwTableAutoFmt* pTAFmt = 0;

                if( pArgs && pArgs->Count() >= 2 )
                {
                    nCols = ((SfxUInt16Item &)pArgs->Get(SID_ATTR_TABLE_COLUMN)).GetValue();
                    nRows = ((SfxUInt16Item &)pArgs->Get(SID_ATTR_TABLE_ROW)).GetValue();

                    const SwModuleOptions* pModOpt = SW_MOD()->GetModuleConfig();
                    nInsTblFlags = pModOpt->GetInsTblFlags(bHTMLMode);
                }

                if( !nCols || !nRows )
                {
                    SwInsTableDlg *pDlg = new SwInsTableDlg(rView);
                    if( RET_OK == pDlg->Execute() )
                    {
                        pDlg->GetValues( aTableName, nRows, nCols, nInsTblFlags, pTAFmt );
                    }
                    delete pDlg;
                }

                if( nCols && nRows )
                {
                    rSh.StartUndo(UNDO_INSTABLE);
                    bCallEndUndo = TRUE;

                    rSh.StartAllAction();
                    if( rSh.HasSelection() )
                        rSh.DelRight();

                    rSh.InsertTable( nRows, nCols, HORI_FULL, nInsTblFlags, pTAFmt );
                    rSh.MoveTable( fnTablePrev, fnTableStart );

                    if( aTableName.Len() && !rSh.GetTblStyle( aTableName ) )
                        rSh.GetTableFmt()->SetName( aTableName );

                    rSh.EndAllAction();
                    rView.AutoCaption(TABLE_CAP);
                }
                delete pTAFmt;
            }
            if( bCallEndUndo )
                rSh.EndUndo(UNDO_INSTABLE); // wegen moegl. Shellwechsel
        }
        break;

    case FN_INSERT_FRAME_INTERACT_NOCOL:
    case FN_INSERT_FRAME_INTERACT:
    {
        USHORT nCols = 1;
        if(FN_INSERT_FRAME_INTERACT_NOCOL != nSlot &&
            pArgs &&pArgs->GetItemState(SID_ATTR_COLUMNS, FALSE, &pItem) == SFX_ITEM_SET)
            nCols = ((SfxUInt16Item *)pItem)->GetValue();
        GetView().InsFrmMode(nCols);
    }
    break;
    case FN_INSERT_FRAME:
    {
        const int nSel = rSh.GetSelectionType();

        BOOL bSingleCol = FALSE;
        if( 0!= PTR_CAST(SwWebDocShell, GetView().GetDocShell()) )
        {
            OfaHtmlOptions* pHtmlOpt = OFF_APP()->GetHtmlOptions();
            USHORT nExport = pHtmlOpt->GetExportMode();
            if( HTML_CFG_MSIE == nExport ||
                HTML_CFG_HTML32 == nExport ||
                HTML_CFG_MSIE_40 == nExport ||
                HTML_CFG_HTML32 == nExport )
            {
                bSingleCol = TRUE;
            }

        }
        // Rahmen neu anlegen
        SwFlyFrmAttrMgr aMgr( TRUE, GetShellPtr(), FRMMGR_TYPE_TEXT );
        static USHORT __READONLY_DATA aFrmAttrRange[] =
        {
            RES_FRMATR_BEGIN,       RES_FRMATR_END-1,
            SID_ATTR_BORDER_INNER,  SID_ATTR_BORDER_INNER,
            FN_GET_PRINT_AREA,      FN_GET_PRINT_AREA,
            SID_ATTR_PAGE_SIZE,     SID_ATTR_PAGE_SIZE,
            FN_SET_FRM_NAME,        FN_SET_FRM_NAME,
            SID_HTML_MODE,          SID_HTML_MODE,
            0
        };

        SfxItemSet aSet(GetPool(), aFrmAttrRange );
        aSet.Put(SfxUInt16Item(SID_HTML_MODE, ::GetHtmlMode(GetView().GetDocShell())));
        const SwRect &rPg = GetShell().GetAnyCurRect(RECT_PAGE);
        SwFmtFrmSize aFrmSize(ATT_VAR_SIZE, rPg.Width(), rPg.Height());
        aFrmSize.SetWhich(GetPool().GetWhich(SID_ATTR_PAGE_SIZE));
        aSet.Put(aFrmSize);

        const SwRect &rPr = GetShell().GetAnyCurRect(RECT_PAGE_PRT);
        SwFmtFrmSize aPrtSize(ATT_VAR_SIZE, rPr.Width(), rPr.Height());
        aPrtSize.SetWhich(GetPool().GetWhich(FN_GET_PRINT_AREA));
        aSet.Put(aPrtSize);

        aSet.Put(aMgr.GetAttrSet());
        aSet.SetParent( aMgr.GetAttrSet().GetParent() );

        // Minimalgroesse in Spalten l”schen
        SvxBoxInfoItem aBoxInfo((SvxBoxInfoItem &)aSet.Get(SID_ATTR_BORDER_INNER));
        aBoxInfo.SetMinDist(FALSE);
        aSet.Put(aBoxInfo);

        SwFrmDlg* pDlg = new SwFrmDlg(GetView().GetViewFrame(), &GetView().GetViewFrame()->GetWindow(), aSet, TRUE);

        if(pDlg->Execute() && pDlg->GetOutputItemSet())
        {
            GetShell().StartAllAction();
            GetShell().StartUndo(UNDO_INSERT);

            const SfxItemSet* pOutSet = pDlg->GetOutputItemSet();
            aMgr.SetAttrSet(*pOutSet);

            // beim ClickToEditFeld erst die Selektion loeschen
            if( GetShell().IsInClickToEdit() )
                GetShell().DelRight();

            aMgr.InsertFlyFrm();


            GetView().AutoCaption(FRAME_CAP);
            GetShell().EndUndo(UNDO_INSERT);
            GetShell().EndAllAction();
        }

        DELETEZ(pDlg);
        break;
    }
    case FN_INSERT_HRULER:
    {
        String sPath;
        BOOL bSimpleLine = FALSE;
        BOOL bRet = FALSE;
        Window* pParent = GetView().GetWindow();
        SwInsertGrfRulerDlg* pDlg = new SwInsertGrfRulerDlg(
            pParent ,
            GetView().GetDocShell());
        // MessageBox fuer fehlende Grafiken
        if(!pDlg->HasImages())
            InfoBox( pParent, SW_RES(MSG_NO_RULER)).Execute();
        if(RET_OK == pDlg->Execute())
        {
            sPath = pDlg->GetGraphicName();
            bSimpleLine = pDlg->IsSimpleLine();
        }
        delete pDlg;
        rSh.StartAllAction();
        rSh.StartUndo(UIUNDO_INSERT_RULER);
        if(bSimpleLine)
        {
            if(!(rSh.IsSttOfPara() && rSh.IsEndOfPara())) // kein leerer Absatz?
                rSh.SplitNode( FALSE, FALSE ); // dann Platz schaffen
            rSh.SplitNode( FALSE, FALSE );
            rSh.Left();
            rSh.SetTxtFmtColl( rSh.GetTxtCollFromPool( RES_POOLCOLL_HTML_HR ));
            rSh.Right();
            bRet = TRUE;
        }
        else if(sPath.Len())
        {
            if (!pFrmMgr)
                pFrmMgr = new SwFlyFrmAttrMgr( TRUE, &rSh, FRMMGR_TYPE_GRF );
            // am FrmMgr muessen die richtigen Parameter eingestellt werden

            pFrmMgr->SetAnchor(FLY_IN_CNTNT);

            rSh.SplitNode( FALSE, FALSE );
            rSh.SplitNode( FALSE, FALSE );
            rSh.Left();
            rSh.SetAttr(SvxAdjustItem(SVX_ADJUST_CENTER,RES_PARATR_ADJUST ));
            if(GRFILTER_OK == InsertGraphic(sPath, aEmptyStr, TRUE, 0, 0 ))
                bRet = TRUE;
            rSh.EnterStdMode();
            rSh.Right();
            DELETEZ(pFrmMgr);
        }
        rSh.EndAllAction();
        rSh.EndUndo(UIUNDO_INSERT_RULER);
        rReq.SetReturnValue(SfxBoolItem(nSlot, bRet));
    }
    break;
    case FN_FORMAT_COLUMN :
    {
        SwColumnDlg* pColDlg = new SwColumnDlg(GetView().GetWindow(), rSh);
        pColDlg->Execute();
        delete pColDlg;
    }
    break;

    case FN_SECTION_APPENDNODE:
        rReq.SetReturnValue( SfxBoolItem( nSlot, rSh.AppendNodeInSection() ));
        break;

    default:
        ASSERT( !this, "falscher Dispatcher" );
        return;
    }
}



void SwTextShell::StateInsert( SfxItemSet &rSet )
{
    USHORT nHtmlMode = ::GetHtmlMode(GetView().GetDocShell());
    SfxWhichIter aIter( rSet );
    SwWrtShell &rSh = GetShell();
    USHORT nWhich = aIter.FirstWhich();
    while ( nWhich )
    {
        switch ( nWhich )
        {
            case SID_INSERT_SOUND:
            case SID_INSERT_VIDEO:
                if ( GetShell().IsSelFrmMode() ||
                     !SvxPluginFileDlg::IsAvailable( nWhich ) ||
                     SFX_CREATE_MODE_EMBEDDED == GetView().GetDocShell()->GetCreateMode() )
                {
                    rSet.DisableItem( nWhich );
                }
                break;

            case SID_INSERT_DIAGRAM:
                if( !SFX_APP()->HasFeature( SFX_FEATURE_SCHART ) )
                {
                    rSet.DisableItem( nWhich );
                    break;
                }

            case FN_INSERT_SIM:
                if(  FN_INSERT_SIM == nWhich &&
                     !SFX_APP()->HasFeature( SFX_FEATURE_SIMAGE ) )
                {
                    rSet.DisableItem( nWhich );
                    break;
                }

            case FN_INSERT_SMA:
                if( FN_INSERT_SMA == nWhich &&
                     !SFX_APP()->HasFeature( SFX_FEATURE_SMATH ) )
                {
                    rSet.DisableItem( nWhich );
                    break;
                }

            case SID_INSERT_FLOATINGFRAME:
            case SID_INSERT_OBJECT:
            case SID_INSERT_PLUGIN:
            case SID_INSERT_APPLET:
            {
                SfxObjectCreateMode eMode =
                                    GetView().GetDocShell()->GetCreateMode();

                if(
#ifndef SOLAR_JAVA
                    nWhich == SID_INSERT_APPLET ||
#endif
                    eMode == SFX_CREATE_MODE_EMBEDDED ||
                    (nWhich == SID_INSERT_DIAGRAM && rSh.IsCrsrInTbl() &&
                     rSh.IsTblComplexForChart() &&
                     !GetView().GetViewFrame()->GetChildWindow(
                            SID_INSERT_DIAGRAM)) )
                    rSet.DisableItem( nWhich );
                else if( GetShell().IsSelFrmMode())
                    rSet.DisableItem( nWhich );
                else if(SID_INSERT_FLOATINGFRAME == nWhich && nHtmlMode&HTMLMODE_ON)
                {
                    OfaHtmlOptions* pHtmlOpt = OFF_APP()->GetHtmlOptions();
                    USHORT nExport = pHtmlOpt->GetExportMode();
                    if(HTML_CFG_MSIE_40 != nExport && HTML_CFG_WRITER != nExport )
                        rSet.DisableItem(nWhich);
                }
            }
            break;
            case FN_INSERT_FRAME_INTERACT_NOCOL :
            case FN_INSERT_FRAME_INTERACT:
            {
                if ( GetShell().IsSelFrmMode() ||
                    (0 != (nHtmlMode & HTMLMODE_ON) && 0 == (nHtmlMode & HTMLMODE_SOME_ABS_POS)))
                    rSet.DisableItem(nWhich);
            }
            break;
            case SID_HYPERLINK_GETLINK:
                {
                    SfxItemSet aSet(GetPool(), RES_TXTATR_INETFMT, RES_TXTATR_INETFMT);
                    rSh.GetAttr( aSet );

                    SvxHyperlinkItem aHLinkItem;
                    const SfxPoolItem* pItem;
                    if(SFX_ITEM_SET == aSet.GetItemState(RES_TXTATR_INETFMT, FALSE, &pItem))
                    {
                        const SwFmtINetFmt* pINetFmt = (const SwFmtINetFmt*)pItem;
                        aHLinkItem.SetURL(pINetFmt->GetValue());
                        aHLinkItem.SetTargetFrame(pINetFmt->GetTargetFrame());
                        aHLinkItem.SetIntName(pINetFmt->GetName());
                        const SvxMacro *pMacro = pINetFmt->GetMacro( SFX_EVENT_MOUSEOVER_OBJECT );
                        if( pMacro )
                            aHLinkItem.SetMacro(HYPERDLG_EVENT_MOUSEOVER_OBJECT, *pMacro);

                        pMacro = pINetFmt->GetMacro( SFX_EVENT_MOUSECLICK_OBJECT );
                        if( pMacro )
                            aHLinkItem.SetMacro(HYPERDLG_EVENT_MOUSECLICK_OBJECT, *pMacro);

                        pMacro = pINetFmt->GetMacro( SFX_EVENT_MOUSEOUT_OBJECT );
                        if( pMacro )
                            aHLinkItem.SetMacro(HYPERDLG_EVENT_MOUSEOUT_OBJECT, *pMacro);

                        // Text des Links besorgen
                        rSh.StartAction();
                        rSh.CreateCrsr();
                        rSh.SwCrsrShell::SelectTxtAttr(RES_TXTATR_INETFMT,TRUE);
                        String sLinkName = rSh.GetSelTxt();
                        aHLinkItem.SetName(sLinkName);
                        aHLinkItem.SetInsertMode(HLINK_FIELD);
                        rSh.DestroyCrsr();
                        rSh.EndAction();
                    }
                    else
                    {
                        String sReturn = rSh.GetSelTxt();
                        sReturn.Erase(255);
                        sReturn.EraseTrailingChars();
                        aHLinkItem.SetName(sReturn);
                    }

                    aHLinkItem.SetInsertMode((SvxLinkInsertMode)(aHLinkItem.GetInsertMode() |
                        ((nHtmlMode & HTMLMODE_ON) != 0 ? HLINK_HTMLMODE : 0)));
                    aHLinkItem.SetMacroEvents ( HYPERDLG_EVENT_MOUSEOVER_OBJECT|
                                HYPERDLG_EVENT_MOUSECLICK_OBJECT | HYPERDLG_EVENT_MOUSEOUT_OBJECT );

                    rSet.Put(aHLinkItem);
                }
                break;

            case FN_INSERT_FRAME:
                if(rSh.IsSelFrmMode())
                {
                    const int nSel = rSh.GetSelectionType();
                    if( (SwWrtShell::SEL_GRF | SwWrtShell::SEL_OLE ) & nSel )
                        rSet.DisableItem(nWhich);
                }
            break;
            case FN_INSERT_HRULER :
                if(rSh.IsReadOnlyAvailable() && rSh.HasReadonlySel() )
                    rSet.DisableItem(nWhich);
            break;

            case FN_SECTION_APPENDNODE:
                if( !rSh.CanInsertNodeAtEndOfSection() )
                    rSet.DisableItem(nWhich);
            break;
        }
        nWhich = aIter.NextWhich();
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void  SwTextShell::ExecDelete(SfxRequest &rReq)
{
    SwWrtShell &rSh = GetShell();
    switch( rReq.GetSlot() )
    {
        case FN_DELETE_SENT:
            if( rSh.IsTableMode() )
            {
                rSh.DeleteRow();
                rSh.EnterStdMode();
            }
            else
                rSh.DelToEndOfSentence();
            break;
        case FN_DELETE_BACK_SENT:
            rSh.DelToStartOfSentence();
            break;
        case FN_DELETE_WORD:
            rSh.DelNxtWord();
            break;
        case FN_DELETE_BACK_WORD:
            rSh.DelPrvWord();
            break;
        case FN_DELETE_LINE:
            rSh.DelToEndOfLine();
            break;
        case FN_DELETE_BACK_LINE:
            rSh.DelToStartOfLine();
            break;
        case FN_DELETE_PARA:
            rSh.DelToEndOfPara();
            break;
        case FN_DELETE_BACK_PARA:
            rSh.DelToStartOfPara();
            break;
        case FN_DELETE_WHOLE_LINE:
            rSh.DelLine();
            break;
        default:
            ASSERT(!this, "falscher Dispatcher");
            return;
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



SwTextShell::SwTextShell(SwView &rView) :
    SwBaseShell(rView), pPostItFldMgr( 0 ), pInsGrfSetPtr( 0 )
{
    SetName(String::CreateFromAscii("Text"));
    SetHelpId(SW_TEXTSHELL);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SwTextShell::~SwTextShell()
{
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwTextShell::InsertSymbol(const String& rChars, const String& rFontName)
{
    SwWrtShell &rSh = GetShell();
    String aChars( rChars );

    SfxItemSet aSet( GetPool(), RES_CHRATR_FONT, RES_CHRATR_FONT );
    rSh.GetAttr( aSet );
    SvxFontItem aFont( (SvxFontItem &) aSet.Get( RES_CHRATR_FONT ));
    Font aNewFont(rFontName, Size(1,1)); // Size nur wg. CTOR

    if( !rChars.Len() )
    {
        // Eingestellten Font als Default
        SvxCharacterMap* pDlg = new SvxCharacterMap(&GetView().GetViewFrame()->GetWindow(), FALSE);

        Font aDlgFont( pDlg->GetCharFont() );
        SwViewOption aOpt(*GetShell().GetViewOptions());
        String sSymbolFont = aOpt.GetSymbolFont();
        if(!rFontName.Len() && sSymbolFont.Len())
            aDlgFont.SetName(sSymbolFont);
        else
            aDlgFont.SetName( aFont.GetFamilyName() );

        pDlg->SetCharFont( aDlgFont );

        if( RET_OK == pDlg->Execute() )
        {
            aChars = pDlg->GetCharacters();
            aNewFont = pDlg->GetCharFont();
            aOpt.SetSymbolFont(aNewFont.GetName());
            SW_MOD()->ApplyUsrPref(aOpt, &GetView());
        }
        delete pDlg;
    }

    if( aChars.Len() )
    {
        rSh.StartAllAction();

        // Selektierten Inhalt loeschen
        rSh.StartUndo( UNDO_INSERT );
        if ( rSh.HasSelection() )
        {
            rSh.DelRight();
            aSet.ClearItem();
            rSh.GetAttr( aSet );
            aFont = (SvxFontItem &) aSet.Get( RES_CHRATR_FONT );
        }

        // Zeichen einfuegen
        rSh.Insert( aChars );

        // Muss der Font geaendert werden
        if( aNewFont.GetName() != aFont.GetFamilyName() )
        {
            SvxFontItem aNewFontItem( aFont );
            aNewFontItem.GetFamilyName() = aNewFont.GetName();
            aNewFontItem.GetFamily()     = aNewFont.GetFamily();
            aNewFontItem.GetPitch()      = aNewFont.GetPitch();
            aNewFontItem.GetCharSet()    = aNewFont.GetCharSet();
            aSet.Put(aNewFontItem);

            rSh.SetMark();
            rSh.ExtendSelection( FALSE, aChars.Len() );
            rSh.SetAttr( aSet, SETATTR_DONTEXPAND | SETATTR_NOFORMATATTR );
            if( !rSh.IsCrsrPtAtEnd() )
                rSh.SwapPam();
            rSh.ClearMark();
            rSh.UpdateAttr();
        }

        rSh.EndAllAction();
        rSh.EndUndo( UNDO_INSERT );
    }
}


/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.356  2000/09/18 16:06:06  willem.vandorp
    OpenOffice header added.

    Revision 1.355  2000/09/08 08:12:52  os
    Change: Set/Toggle/Has/Knows/Show/GetChildWindow

    Revision 1.354  2000/08/17 11:40:16  jp
    remove the SW graphicmanager

    Revision 1.353  2000/08/07 20:40:21  jp
    ExectInsert: don't insert a softhyphen behind/befor another sofhyphen

    Revision 1.352  2000/08/04 10:54:23  jp
    Soft-/HardHyphens & HardBlanks changed from attribute to unicode character; remove unused methods

    Revision 1.351  2000/07/26 16:27:20  jp
    Bug #77158#: remove the unused code

    Revision 1.350  2000/07/07 13:24:57  jp
    must changes VCL

    Revision 1.349  2000/06/27 17:43:21  jp
    Bug #76332#: internal SplitNode don't insert a new node before a table

    Revision 1.348  2000/06/26 13:17:56  os
    INetURLObject::SmartRelToAbs removed

    Revision 1.347  2000/06/20 14:49:23  os
    #70060# less occurences of columns in HTML

    Revision 1.346  2000/05/26 07:21:33  os
    old SW Basic API Slots removed

    Revision 1.345  2000/05/10 11:53:02  os
    Basic API removed

    Revision 1.344  2000/05/09 14:41:35  os
    BASIC interface partially removed

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/shells/textsh1.cxx b/sw/source/ui/shells/textsh1.cxx
new file mode 100644
index 0000000..167dd4a
--- /dev/null
+++ b/sw/source/ui/shells/textsh1.cxx
@@ -0,0 +1,1154 @@
/*************************************************************************
 *
 *  $RCSfile: textsh1.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:47 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _HELPID_H
#include <helpid.h>
#endif

#ifndef _SFXSTRITEM_HXX
#include <svtools/stritem.hxx>
#endif
#ifndef _SVX_HTMLMODE_HXX //autogen
#include <svx/htmlmode.hxx>
#endif
#ifndef _SFX_WHITER_HXX //autogen
#include <svtools/whiter.hxx>
#endif
#ifndef _SFX_SAVEOPT_HXX //autogen
#include <sfx2/saveopt.hxx>
#endif
#ifndef _SFX_BINDINGS_HXX //autogen
#include <sfx2/bindings.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SFX_OBJITEM_HXX //autogen
#include <sfx2/objitem.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _OFAACCFG_HXX //autogen
#include <offmgr/ofaaccfg.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SFXMACITEM_HXX
#include <svtools/macitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _SVX_COLRITEM_HXX //autogen
#include <svx/colritem.hxx>
#endif
#ifndef _SVX_TSTPITEM_HXX //autogen
#include <svx/tstpitem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _MySVXACORR_HXX //autogen
#include <svx/svxacorr.hxx>
#endif


#ifndef _FMTINFMT_HXX //autogen
#include <fmtinfmt.hxx>
#endif
#ifndef _SWWAIT_HXX
#include <swwait.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _WVIEW_HXX
#include <wview.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _VIEWOPT_HXX
#include <viewopt.hxx>
#endif
#ifndef _UITOOL_HXX
#include <uitool.hxx>
#endif
#ifndef _UIPARAM_HXX
#include <uiparam.hxx>
#endif
#ifndef _SWEVENT_HXX
#include <swevent.hxx>
#endif
#ifndef _TEXTSH_HXX
#include <textsh.hxx>
#endif
#ifndef _BOOKMARK_HXX
#include <bookmark.hxx>
#endif
#ifndef _BOOKMRK_HXX
#include <bookmrk.hxx>
#endif
#ifndef _BREAK_HXX
#include <break.hxx>
#endif
#ifndef _DATAEX_HXX
#include <dataex.hxx>
#endif
#ifndef _DOCSTAT_HXX
#include <docstat.hxx>
#endif
#ifndef _INSFNOTE_HXX
#include <insfnote.hxx>
#endif
#ifndef _OUTLINE_HXX
#include <outline.hxx>
#endif
#ifndef _SRTDLG_HXX
#include <srtdlg.hxx>
#endif
#ifndef _TABLEMGR_HXX
#include <tablemgr.hxx>
#endif
#ifndef _SWUNDO_HXX
#include <swundo.hxx>       // fuer Undo-IDs
#endif
#ifndef _AUTOFDLG_HXX
#include <autofdlg.hxx>
#endif
#ifndef _REFFLD_HXX
#include <reffld.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _MDIEXP_HXX
#include <mdiexp.hxx>
#endif
#ifndef _INPUTWIN_HXX
#include <inputwin.hxx>
#endif
#ifndef _PARDLG_HXX
#include <pardlg.hxx>
#endif
#ifndef _CHRDLG_HXX
#include <chrdlg.hxx>
#endif
#ifndef _DOCFNOTE_HXX
#include <docfnote.hxx>
#endif
#ifndef _FRMATR_HXX
#include <frmatr.hxx>
#endif
#ifndef _FMTCOL_HXX
#include <fmtcol.hxx>
#endif
#ifndef _CELLATR_HXX
#include <cellatr.hxx>
#endif
#ifndef _EDTWIN_HXX
#include <edtwin.hxx>
#endif
#ifndef _REDLNDLG_HXX
#include <redlndlg.hxx>
#endif
#ifndef _REDLENUM_HXX
#include <redlenum.hxx>
#endif

#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif
#ifndef _SHELLS_HRC
#include <shells.hrc>
#endif
#ifndef _APP_HRC
#include <app.hrc>
#endif
#ifndef _WEB_HRC
#include <web.hrc>
#endif

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

short lcl_AskRedlineMode(Window *pWin)
{
    MessBox aQBox( pWin, 0,
                    String( SW_RES( STR_REDLINE_TITLE ) ),
                    String( SW_RES( STR_REDLINE_MSG ) ) );
    aQBox.SetImage( QueryBox::GetStandardImage() );
    USHORT nBtnFlags = BUTTONDIALOG_DEFBUTTON |
                        BUTTONDIALOG_OKBUTTON |
                        BUTTONDIALOG_FOCUSBUTTON;

    aQBox.AddButton(String(SW_RES(STR_REDLINE_ACCEPT_ALL)), RET_OK, nBtnFlags);
    aQBox.GetPushButton( RET_OK )->SetHelpId(HID_AUTOFORMAT_ACCEPT);
    aQBox.AddButton(String(SW_RES(STR_REDLINE_REJECT_ALL)), RET_CANCEL, BUTTONDIALOG_CANCELBUTTON);
    aQBox.GetPushButton( RET_CANCEL )->SetHelpId(HID_AUTOFORMAT_REJECT  );
    aQBox.AddButton(String(SW_RES(STR_REDLINE_EDIT)), 2, 0);
    aQBox.GetPushButton( 2 )->SetHelpId(HID_AUTOFORMAT_EDIT_CHG);
    aQBox.SetButtonHelpText( RET_OK, aEmptyStr );

    return aQBox.Execute();
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwTextShell::Execute(SfxRequest &rReq)
{
    const SfxItemSet *pArgs = rReq.GetArgs();
    SwWrtShell& rWrtSh = GetShell();
    const SfxPoolItem* pItem = 0;
    USHORT nSlot = rReq.GetSlot();
    if(pArgs)
        pArgs->GetItemState(GetPool().GetWhich(nSlot), FALSE, &pItem);
    switch( nSlot )
    {
        case FN_INSERT_SYMBOL:
            InsertSymbol(aEmptyStr,aEmptyStr);
        break;
        case FN_INSERT_FOOTNOTE:
        case FN_INSERT_ENDNOTE:
            rWrtSh.InsertFootnote(aEmptyStr, nSlot == FN_INSERT_ENDNOTE);
        break;
        case FN_INSERT_FOOTNOTE_DLG:
        {
            SwInsFootNoteDlg *pDlg = new SwInsFootNoteDlg(
                                GetView().GetWindow(), rWrtSh, FALSE);
            pDlg->SetHelpId(nSlot);
            pDlg->Execute();
            delete pDlg;
        }
        break;
        case FN_FORMAT_FOOTNOTE_DLG:
        {
            SwFootNoteOptionDlg *pDlg = new SwFootNoteOptionDlg(GetView().GetWindow(), rWrtSh);
            pDlg->Execute();
            delete pDlg;
            break;
        }
        case SID_INSERT_GRAPHIC:
            if (!pItem)
            {
                rReq.SetReturnValue(SfxBoolItem(nSlot, InsertGraphicDlg()));
            }
            else
            {
                String rName = aEmptyStr;
                BOOL bLink = FALSE;

                rName = ((const SfxStringItem *)pItem)->GetValue();

                String rFilter = aEmptyStr;
                if ( SFX_ITEM_SET ==
                        pArgs->GetItemState(FN_PARAM_FILTER, TRUE, &pItem) )
                    rFilter = ((const SfxStringItem *)pItem)->GetValue();

                if ( SFX_ITEM_SET ==
                        pArgs->GetItemState(FN_PARAM_1, TRUE, &pItem) )
                    bLink = ((const SfxBoolItem *)pItem)->GetValue();

                if ( !rName.Len() )
                    rReq.SetReturnValue(SfxBoolItem(nSlot, InsertGraphicDlg()));
                else
                    rReq.SetReturnValue(SfxBoolItem(nSlot, InsertGraphic( rName, rFilter, bLink )));
            }
            break;
        case SID_INSERTDOC:
            if (!pItem)
                rReq.SetReturnValue(SfxBoolItem(nSlot, GetView().InsertDoc(nSlot, aEmptyStr, aEmptyStr) != -1));
            else
            {
                String aFile    = aEmptyStr;
                String aFilter  = aEmptyStr;
                aFile = ((const SfxStringItem *)pItem)->GetValue();
                if(SFX_ITEM_SET == pArgs->GetItemState(FN_PARAM_1, TRUE, &pItem ))
                    aFilter = ((const SfxStringItem *)pItem)->GetValue();

                rReq.SetReturnValue(SfxBoolItem(nSlot, GetView().InsertDoc( nSlot, aFile, aFilter ) != -1));
            }
            break;
        case FN_FORMAT_RESET:
            rWrtSh.ResetAttr();
            break;
        case FN_INSERT_BREAK_DLG:
        {
            SwBreakDlg *pDlg = new SwBreakDlg(GetView().GetWindow(), rWrtSh);
            pDlg->Execute();
            delete pDlg;
        }
            break;
        case FN_INSERT_BOOKMARK:
        {
            SwInsertBookmarkDlg *pDlg = new SwInsertBookmarkDlg(
                                    GetView().GetWindow(), rWrtSh );
            pDlg->Execute();
            delete pDlg;
        }
        break;
        case FN_AUTOFORMAT_REDLINE_APPLY:
        {
            SvxSwAutoFmtFlags aFlags(OFF_APP()->GetAutoCorrect()->GetSwFlags());
            // das muss fuer die Nachbearbeitung immer FALSE sein
            aFlags.bAFmtByInput = FALSE;
            aFlags.bWithRedlining = TRUE;
            rWrtSh.AutoFormat( &aFlags );
            aFlags.bWithRedlining = FALSE;

            SfxViewFrame* pVFrame = GetView().GetViewFrame();
            if (pVFrame->HasChildWindow(FN_REDLINE_ACCEPT))
                pVFrame->ToggleChildWindow(FN_REDLINE_ACCEPT);

            SwModalRedlineAcceptDlg aDlg(&GetView().GetEditWin());

            switch (lcl_AskRedlineMode(&GetView().GetEditWin()))
            {
                case RET_OK:
                    aDlg.AcceptAll(TRUE);
                    break;

                case RET_CANCEL:
                    aDlg.AcceptAll(FALSE);
                    break;

                case 2:
                    aDlg.Execute();
                    break;
            }
        }
        break;

        case FN_AUTOFORMAT_APPLY:
        {
            SvxSwAutoFmtFlags aFlags(OFF_APP()->GetAutoCorrect()->GetSwFlags());
            // das muss fuer die Nachbearbeitung immer FALSE sein
            aFlags.bAFmtByInput = FALSE;
            rWrtSh.AutoFormat( &aFlags );
        }
        break;
        case FN_AUTOFORMAT_AUTO:
        {
            OfaAutoCorrCfg* pACfg = OFF_APP()->GetAutoCorrConfig();
            BOOL bSet = pItem ? ((const SfxBoolItem*)pItem)->GetValue()
                              : !pACfg->IsAutoFmtByInput();
            if( bSet != pACfg->IsAutoFmtByInput() )
                pACfg->SetAutoFmtByInput( bSet );
        }
        break;
        case FN_AUTO_CORRECT:
        {
            // erstmal auf Blank defaulten
            sal_Unicode cChar = ' ';
            rWrtSh.AutoCorrect( *OFF_APP()->GetAutoCorrect(), cChar );
        }
        break;

        case FN_SORTING_DLG:
        {
            SwSortDlg *pDlg = new SwSortDlg(GetView().GetWindow(), rWrtSh );
            pDlg->Execute();
            delete pDlg;
        }
        break;
        case FN_NUMBERING_OUTLINE_DLG:
        {
            SfxItemSet aTmp(GetPool(), FN_PARAM_1, FN_PARAM_1);
            SwOutlineTabDialog* pDlg = new SwOutlineTabDialog(GetView().GetWindow(), &aTmp, rWrtSh);
            pDlg->Execute();
            delete pDlg;
        }
            break;
        case FN_CALCULATE:
        {
            SwDataExchangeRef aRef( new SwDataExchange( rWrtSh ) );
            aRef->CalculateAndCopy();
        }
            break;
        case FN_GOTO_REFERENCE:
        {
            SwField *pFld = rWrtSh.GetCurFld();
            if(pFld && pFld->GetTypeId() == TYP_GETREFFLD)
            {
                rWrtSh.StartAllAction();
                rWrtSh.SwCrsrShell::GotoRefMark( ((SwGetRefField*)pFld)->GetSetRefName(),
                                    ((SwGetRefField*)pFld)->GetSubType(),
                                    ((SwGetRefField*)pFld)->GetSeqNo() );
                rWrtSh.EndAllAction();
            }
        }
            break;
        case FN_EDIT_FORMULA:
        {
            rWrtSh.EndAllTblBoxEdit();
            SfxViewFrame* pVFrame = GetView().GetViewFrame();
            const USHORT nId = SwInputChild::GetChildWindowId();
            pVFrame->ToggleChildWindow( nId );
            if( !pVFrame->HasChildWindow( nId ) )
                pVFrame->GetBindings().InvalidateAll( TRUE );
        }

        break;
        case FN_TABLE_UNSET_READ_ONLY:
        {
            rWrtSh.UnProtectTbls();
        }
        break;
        case FN_EDIT_HYPERLINK:
            GetView().GetViewFrame()->ToggleChildWindow(SID_HYPERLINK_DIALOG);
        break;
        case FN_INSERT_HYPERLINK:
        case SID_CHAR_DLG:
        {
            SwView* pView = GetActiveView();
            if(pView)
            {
                FieldUnit eMetric = ::GetDfltMetric(0 != PTR_CAST(SwWebView, pView));
                SW_MOD()->PutItem(SfxUInt16Item(SID_ATTR_METRIC, eMetric));
                SfxItemSet aCoreSet( GetPool(),
                                 RES_CHRATR_BEGIN,      RES_CHRATR_END-1,
                                 RES_TXTATR_INETFMT,    RES_TXTATR_INETFMT,
                                 RES_BACKGROUND,        RES_BACKGROUND,
                                 FN_PARAM_SELECTION,    FN_PARAM_SELECTION,
                                 SID_HTML_MODE,         SID_HTML_MODE,
                                 0 );
                rWrtSh.GetAttr( aCoreSet );
                BOOL bSel = rWrtSh.HasSelection();
                BOOL bSelectionPutted = FALSE;
                if(bSel || rWrtSh.IsInWord())
                {
                    if(!bSel)
                    {
                        rWrtSh.StartAction();
                        rWrtSh.Push();
                        if(!rWrtSh.SelectTxtAttr( RES_TXTATR_INETFMT ))
                            rWrtSh.SelWrd();
                    }
                    aCoreSet.Put(SfxStringItem(FN_PARAM_SELECTION, rWrtSh.GetSelTxt()));
                    bSelectionPutted = TRUE;
                    if(!bSel)
                    {
                        rWrtSh.Pop(FALSE);
                        rWrtSh.EndAction();
                    }
                }

                // Das CHRATR_BACKGROUND-Attribut wird fuer den Dialog in
                // ein RES_BACKGROUND verwandelt und wieder zurueck ...
                const SfxPoolItem *pTmpBrush;
                if( SFX_ITEM_SET == aCoreSet.GetItemState( RES_CHRATR_BACKGROUND,
                    TRUE, &pTmpBrush ) )
                {
                    SvxBrushItem aTmpBrush( *((SvxBrushItem*)pTmpBrush) );
                    aTmpBrush.SetWhich( RES_BACKGROUND );
                    aCoreSet.Put( aTmpBrush );
                }

                aCoreSet.Put(SfxUInt16Item(SID_HTML_MODE,
                                ::GetHtmlMode(GetView().GetDocShell())));
                SwCharDlg* pDlg = new SwCharDlg(GetView().GetWindow(), GetView(), aCoreSet);
                if(FN_INSERT_HYPERLINK == nSlot)
                    pDlg->SetCurPageId(TP_CHAR_URL);
                if (RET_OK == pDlg->Execute())
                {
                    SfxItemSet aTmpSet( *pDlg->GetOutputItemSet() );
                    if( SFX_ITEM_SET == aTmpSet.GetItemState( RES_BACKGROUND,
                        FALSE, &pTmpBrush ) )
                    {
                        SvxBrushItem aTmpBrush( *((SvxBrushItem*)pTmpBrush) );
                        aTmpBrush.SetWhich( RES_CHRATR_BACKGROUND );
                        aTmpSet.Put( aTmpBrush );
                    }
                    aTmpSet.ClearItem( RES_BACKGROUND );

                    const SfxPoolItem* pItem;
                    BOOL bInsert = FALSE;

                    // aus ungeklaerter Ursache ist das alte Item wieder im Set
                    if(!bSelectionPutted && SFX_ITEM_SET == aTmpSet.GetItemState(FN_PARAM_SELECTION, FALSE, &pItem))
                    {
                        String sInsert = ((const SfxStringItem*)pItem)->GetValue();
                        bInsert = sInsert.Len() != 0;
                        if(bInsert)
                        {
                            rWrtSh.StartAction();
                            rWrtSh.Insert( sInsert );
                            rWrtSh.SetMark();
                            rWrtSh.ExtendSelection(FALSE, sInsert.Len());
                        }
                    }
                    SwTxtFmtColl* pColl = rWrtSh.GetCurTxtFmtColl();
                    if(bSel &&
                            rWrtSh.IsSelFullPara() &&
                                pColl && pColl->IsAutoUpdateFmt())
                    {
                        rWrtSh.AutoUpdatePara(pColl, aTmpSet);
                    }
                    else
                        rWrtSh.SetAttr( aTmpSet );
                    if(bInsert)
                    {
                        rWrtSh.SwapPam();
                        rWrtSh.ClearMark();
                        rWrtSh.DontExpandFmt();
                        rWrtSh.EndAction();
                    }
                }
                delete pDlg;
            }
        }
        break;
        case SID_PARA_DLG:
        {
        //Damit aus dem Basic keine Dialoge fuer Hintergrund-Views aufgerufen werden:
            SwView* pView = GetActiveView();
            if(pView)
            {
                FieldUnit eMetric = ::GetDfltMetric(0 != PTR_CAST(SwWebView, pView));
                SW_MOD()->PutItem(SfxUInt16Item(SID_ATTR_METRIC, eMetric));
                SfxItemSet aCoreSet( GetPool(),
                                RES_PARATR_BEGIN,           RES_PARATR_END - 1,
                                RES_FRMATR_BEGIN,           RES_FRMATR_END - 1,
                                SID_ATTR_TABSTOP_POS,       SID_ATTR_TABSTOP_POS,
                                SID_ATTR_TABSTOP_DEFAULTS,  SID_ATTR_TABSTOP_DEFAULTS,
                                SID_ATTR_TABSTOP_OFFSET,    SID_ATTR_TABSTOP_OFFSET,
                                SID_ATTR_BORDER_INNER,      SID_ATTR_BORDER_INNER,
                                SID_ATTR_PARA_MODEL,        SID_ATTR_PARA_KEEP,
                                SID_ATTR_PARA_PAGENUM,      SID_ATTR_PARA_PAGENUM,
                                SID_HTML_MODE,              SID_HTML_MODE,
                                FN_PARAM_1,                 FN_PARAM_1,
                                FN_NUMBER_NEWSTART,         FN_NUMBER_NEWSTART_AT,
                                0);
                rWrtSh.GetAttr( aCoreSet );
                aCoreSet.Put(SfxUInt16Item(SID_HTML_MODE,
                                ::GetHtmlMode(GetView().GetDocShell())));

                // Tabulatoren, DefaultTabs ins ItemSet Stecken
                const SvxTabStopItem& rDefTabs = (const SvxTabStopItem&)
                                GetPool().GetDefaultItem(RES_PARATR_TABSTOP);

                USHORT nDefDist = ::GetTabDist( rDefTabs );
                SfxUInt16Item aDefDistItem( SID_ATTR_TABSTOP_DEFAULTS, nDefDist );
                aCoreSet.Put( aDefDistItem );

                // Aktueller Tab
                SfxUInt16Item aTabPos( SID_ATTR_TABSTOP_POS, 0 );
                aCoreSet.Put( aTabPos );

                // linker Rand als Offset
                const long nOff = ((SvxLRSpaceItem&)aCoreSet.Get( RES_LR_SPACE )).
                                                                    GetTxtLeft();
                SfxInt32Item aOff( SID_ATTR_TABSTOP_OFFSET, nOff );
                aCoreSet.Put( aOff );


                // BoxInfo setzen
                ::PrepareBoxInfo( aCoreSet, rWrtSh );

                //aktuelles Seitenformat
                ::SwToSfxPageDescAttr( aCoreSet );

                UINT16 nDefPage = 0;
                if( pItem )
                    nDefPage = ((SfxUInt16Item *)pItem)->GetValue();

                // Numerierungseigenschaften
                if(rWrtSh.GetCurNumRule())
                {
                    aCoreSet.Put(SfxBoolItem(FN_NUMBER_NEWSTART,
                                        USHRT_MAX != rWrtSh.IsNodeNumStart()));
                    aCoreSet.Put(SfxUInt16Item(FN_NUMBER_NEWSTART_AT,
                                                    rWrtSh.IsNodeNumStart()));
                }
                SwParaDlg *pDlg = new SwParaDlg( GetView().GetWindow(),
                                                 GetView(), aCoreSet, DLG_STD,
                                                 NULL, FALSE, nDefPage );

                if ( pDlg->Execute() == RET_OK )
                {
                    // Defaults evtl umsetzen
                    SfxItemSet* pSet = (SfxItemSet*)pDlg->GetOutputItemSet();
                    USHORT nNewDist;
                    if( SFX_ITEM_SET == pSet->GetItemState( SID_ATTR_TABSTOP_DEFAULTS,
                        FALSE, &pItem ) &&
                        nDefDist != (nNewDist = ((SfxUInt16Item*)pItem)->GetValue()) )
                    {
                        SvxTabStopItem aDefTabs( 0, 0 );
                        MakeDefTabs( nNewDist, aDefTabs );
                        rWrtSh.SetDefault( aDefTabs );
                        pSet->ClearItem( SID_ATTR_TABSTOP_DEFAULTS );
                    }

                    ::SfxToSwPageDescAttr( rWrtSh, *pSet );

                    if( pSet->Count() )
                    {
                        rWrtSh.StartAction();
                        rWrtSh.StartUndo( UNDO_START );
                        if ( SFX_ITEM_SET == pSet->GetItemState(FN_PARAM_1,FALSE,&pItem) )
                        {
                            if ( ((SfxStringItem*)pItem)->GetValue().Len() )
                                rWrtSh.ReplaceDropTxt(((SfxStringItem*)pItem)->GetValue());
                        }
                        rWrtSh.SetAttr( *pSet );
                        rWrtSh.EndUndo( UNDO_END );
                        rWrtSh.EndAction();
                        SwTxtFmtColl* pColl = rWrtSh.GetCurTxtFmtColl();
                        if(pColl && pColl->IsAutoUpdateFmt())
                        {
                            rWrtSh.AutoUpdatePara(pColl, *pSet);
                        }
                    }
                    if(SFX_ITEM_SET == pSet->GetItemState(FN_NUMBER_NEWSTART))
                    {
                        BOOL bStart = ((SfxBoolItem&)pSet->Get(FN_NUMBER_NEWSTART_AT)).GetValue();
                        // das zweite Item muss immer drin sein!
                        USHORT nNumStart = ((SfxUInt16Item&)pSet->Get(FN_NUMBER_NEWSTART_AT)).GetValue();
                        if(!bStart)
                            nNumStart = USHRT_MAX;
                        rWrtSh.SetNodeNumStart(nNumStart);
                    }
                }
                delete pDlg;
            }
        }
        break;
        case FN_SELECT_PARA:
        {
            if(!rWrtSh.IsSttOfPara())
                rWrtSh.SttPara(FALSE);
            else
                rWrtSh.EnterStdMode();
            rWrtSh.EndPara(TRUE);
        }
        break;

        case SID_DEC_INDENT:
        case SID_INC_INDENT:
            rWrtSh.MoveLeftMargin( SID_INC_INDENT == nSlot,
                                    rReq.GetModifier() != KEY_MOD1 );
            break;
        case FN_DEC_INDENT_OFFSET:
        case FN_INC_INDENT_OFFSET:
            rWrtSh.MoveLeftMargin( FN_INC_INDENT_OFFSET == nSlot,
                                    rReq.GetModifier() == KEY_MOD1 );
            break;

        case SID_ATTR_CHAR_COLOR2:
        {
            if(pItem)
            {
                Color aSet = ((const SvxColorItem*)pItem)->GetValue();
                SwView& rView = GetView();
                SwEditWin& rEditWin = rView.GetEditWin();
                rEditWin.SetTextColor(aSet);
                SwApplyTemplate* pApply = rEditWin.GetApplyTemplate();
                SvxColorItem aItem(aSet, RES_CHRATR_COLOR);

                // besteht eine Selektion, wird sie gleich gefaerbt
                if(!pApply && rWrtSh.HasSelection())
                {
                    SvxColorItem aItem(aSet, RES_CHRATR_COLOR);
                    rWrtSh.SetAttr(aItem);
                }
                else if(!pApply || pApply->nColor != SID_ATTR_CHAR_COLOR_EXT)
                {
                    rView.GetViewFrame()->GetDispatcher()->Execute(SID_ATTR_CHAR_COLOR_EXT);
                }

/*              OS 22.02.97 18:40 Das alte Verhalten ist unerwuenscht
                SwEditWin& rEdtWin = GetView().GetEditWin();

                SwApplyTemplate* pApply = rEdtWin.GetApplyTemplate();
                SvxColorItem aItem(aSet, RES_CHRATR_COLOR);

                if(!pApply || pApply->nColor != SID_ATTR_CHAR_COLOR_EXT)
                {
                    GetShell().SetAttr(aItem);
                }
*/
            }
        }
        break;
        case SID_ATTR_CHAR_COLOR_BACKGROUND:
        {
            SwView& rView = GetView();
            SwEditWin& rEdtWin = rView.GetEditWin();
            SwApplyTemplate* pApply = rEdtWin.GetApplyTemplate();
            rEdtWin.SetTextBackColorTransparent(0 == pItem);
            Color aSet;
            if(pItem)
            {
                aSet = ((const SvxColorItem*)pItem)->GetValue();
                rEdtWin.SetTextBackColor(aSet);
            }
            if(!pApply && (rWrtSh.HasSelection() || rReq.IsAPI()))
            {
                SvxBrushItem aBrushItem(RES_CHRATR_BACKGROUND);
                if(pItem)
                    aBrushItem.SetColor(aSet);
                else
                    aBrushItem.SetColor(Color(COL_TRANSPARENT));
                rWrtSh.SetAttr( aBrushItem );
            }
            else if(!pApply || pApply->nColor != SID_ATTR_CHAR_COLOR_BACKGROUND_EXT)
            {
                rView.GetViewFrame()->GetDispatcher()->Execute(SID_ATTR_CHAR_COLOR_BACKGROUND_EXT);
            }
/*          OS 22.02.97 18:40 Das alte Verhalten ist unerwuenscht
            if(!pApply || pApply->nColor != SID_ATTR_CHAR_COLOR_BACKGROUND_EXT)
            {
                Brush aBrush(pItem ? BRUSH_SOLID : BRUSH_NULL);
                if(pItem)
                    aBrush.SetColor( aSet );
                GetShell().SetAttr( SvxBrushItem(aBrush, RES_CHRATR_BACKGROUND) );
            }
*/
        }
        break;
        case SID_ATTR_CHAR_COLOR_BACKGROUND_EXT:
        case SID_ATTR_CHAR_COLOR_EXT:
        {
            SwEditWin& rEdtWin = GetView().GetEditWin();
            SwApplyTemplate* pApply = rEdtWin.GetApplyTemplate();
            SwApplyTemplate aTempl;
            BOOL bSelection = rWrtSh.HasSelection();
            if(bSelection)
            {

                if(nSlot == SID_ATTR_CHAR_COLOR_BACKGROUND_EXT)
                {
                    rWrtSh.SetAttr( SvxBrushItem(
                        rEdtWin.GetTextBackColor(), RES_CHRATR_BACKGROUND) );
                }
                else
                    rWrtSh.SetAttr( SvxColorItem( rEdtWin.GetTextColor(),
                                                                RES_CHRATR_COLOR) );
            }
            else
            {
                if(!pApply || pApply->nColor != nSlot)
                    aTempl.nColor = nSlot;
                rEdtWin.SetApplyTemplate(aTempl);
            }
        }
        break;

        case FN_NUM_BULLET_MOVEDOWN:
            if (!rWrtSh.IsAddMode())
                rWrtSh.MoveParagraph(1);
            break;

        case FN_NUM_BULLET_MOVEUP:
            if (!rWrtSh.IsAddMode())
                rWrtSh.MoveParagraph(-1);
            break;

        case SID_HYPERLINK_DIALOG:
        {
            SfxRequest aReq(SID_HYPERLINK_DIALOG, SFX_CALLMODE_SLOT, SFX_APP()->GetPool());
            GetView().GetViewFrame()->ExecuteSlot( aReq);
        }
        break;

    default:
        ASSERT(!this, falscher Dispatcher);
        return;
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwTextShell::GetState( SfxItemSet &rSet )
{
    SwWrtShell &rSh = GetShell();
    SfxWhichIter aIter( rSet );
    USHORT nWhich = aIter.FirstWhich();
    while ( nWhich )
    {
        switch ( nWhich )
        {
        case FN_NUM_NUMBERING_ON:
        case FN_NUM_BULLET_ON:
            if ( rSh.IsTableMode() )
                rSet.DisableItem( nWhich );
            break;

        case FN_NUMBER_BULLETS:
            if ( rSh.IsTableMode() )
                rSet.DisableItem(nWhich);
            break;

        case FN_EDIT_FORMULA:
        case FN_INSERT_SYMBOL:
            {
                const int nType = rSh.GetSelectionType();
                if (!(nType & SwWrtShell::SEL_TXT) &&
                    !(nType & SwWrtShell::SEL_TBL) &&
                    !(nType & SwWrtShell::SEL_NUM))
                    rSet.DisableItem(nWhich);
            }
            break;

        case FN_INSERT_ENDNOTE:
        case FN_INSERT_FOOTNOTE:
        case FN_INSERT_FOOTNOTE_DLG:
            {
                const USHORT nNoType = FRMTYPE_FLY_ANY | FRMTYPE_HEADER |
                                        FRMTYPE_FOOTER  | FRMTYPE_FOOTNOTE;
                if ( (rSh.GetFrmType(0,TRUE) & nNoType) )
                    rSet.DisableItem(nWhich);
            }
            break;
        case FN_INSERT_TABLE:
            if ( rSh.GetTableFmt() ||
                    (rSh.GetFrmType(0,TRUE) & FRMTYPE_FOOTNOTE) )
                rSet.DisableItem( nWhich );
            break;

        case FN_CALCULATE:
            if ( !rSh.IsSelection() )
                rSet.DisableItem(nWhich);
            break;
        case FN_GOTO_REFERENCE:
            {
                SwField *pFld = rSh.GetCurFld();
                if ( !pFld || (pFld &&  pFld->GetTypeId() != TYP_GETREFFLD) )
                    rSet.DisableItem(nWhich);
            }
            break;
        case FN_AUTOFORMAT_AUTO:
            {
                rSet.Put( SfxBoolItem( nWhich, OFF_APP()->
                                GetAutoCorrConfig()->IsAutoFmtByInput() ));
            }
            break;
        case FN_GLOSSARY_DLG:
            {
                rSet.Put(SfxBoolItem(nWhich), TRUE);
            }
            break;

        case SID_DEC_INDENT:
        case SID_INC_INDENT:
            {
                USHORT nHtmlMode = ::GetHtmlMode(GetView().GetDocShell());
                nHtmlMode &= HTMLMODE_ON|HTMLMODE_SOME_STYLES;
                if( (nHtmlMode == HTMLMODE_ON) || !rSh.IsMoveLeftMargin(
                                        SID_INC_INDENT == nWhich, TRUE ))
                    rSet.DisableItem( nWhich );
            }
            break;

        case FN_DEC_INDENT_OFFSET:
        case FN_INC_INDENT_OFFSET:
            {
                USHORT nHtmlMode = ::GetHtmlMode(GetView().GetDocShell());
                nHtmlMode &= HTMLMODE_ON|HTMLMODE_SOME_STYLES;
                if( (nHtmlMode == HTMLMODE_ON) ||
                    !rSh.IsMoveLeftMargin( FN_INC_INDENT_OFFSET == nWhich,
                                            FALSE ))
                    rSet.DisableItem( nWhich );
            }
            break;

        case SID_ATTR_CHAR_COLOR2:
            {
                rSet.Put(SvxColorItem(GetView().GetEditWin().GetTextColor(), SID_ATTR_CHAR_COLOR2));
            }
            break;
        case SID_ATTR_CHAR_COLOR_BACKGROUND:
            {
                if(GetView().GetEditWin().IsTextBackColorTransparent())
                    rSet.Put(SvxColorItem(Color(COL_LIGHTGRAY), SID_ATTR_CHAR_COLOR_BACKGROUND));
                else
                    rSet.Put(SvxColorItem(GetView().GetEditWin().GetTextBackColor(), SID_ATTR_CHAR_COLOR_BACKGROUND));
            }
            break;
        case SID_ATTR_CHAR_COLOR_BACKGROUND_EXT:
        case SID_ATTR_CHAR_COLOR_EXT:
            {
                SwEditWin& rEdtWin = GetView().GetEditWin();
                SwApplyTemplate* pApply = rEdtWin.GetApplyTemplate();
                rSet.Put(SfxBoolItem(nWhich, pApply && pApply->nColor == nWhich));
            }
            break;
        case FN_INSERT_BOOKMARK:
            if( rSh.IsTableMode() )
                rSet.DisableItem( nWhich );
            break;

        case FN_INSERT_PAGEHEADER:
        case FN_INSERT_PAGEFOOTER:
            {
#ifndef CHECK_MENU
                rSet.Put( SfxObjectItem( nWhich, GetView().GetDocShell() ));
#else
                // Seitenvorlagen besorgen
                BOOL bFound = FALSE;
                USHORT n, nCnt = rSh.GetPageDescCnt();
                for( n = 0; n < nCnt; ++n )
                {
                    const SwPageDesc& rDesc = rSh.GetPageDesc( n );
                    if( FN_INSERT_PAGEHEADER == nWhich
                        ? !rDesc.GetMaster().GetHeader().IsActive()
                        : !rDesc.GetMaster().GetFooter().IsActive() )
                    {
                        bFound = TRUE;
                        break;
                    }
                }

                if( bFound )
                    rSet.Put( SfxObjectItem( nWhich, GetView().GetDocShell() ));
                else
                    rSet.DisableItem( nWhich );
#endif
            }
            break;
            case FN_SORTING_DLG:
                if(!rSh.HasSelection())
                    rSet.DisableItem( nWhich );
            break;
            case SID_HYPERLINK_DIALOG:
                if(!GetView().GetViewFrame()->HasChildWindow(SID_HYPERLINK_DIALOG)  && rSh.HasReadonlySel())
                    rSet.DisableItem(SID_HYPERLINK_DIALOG);
            break;
            case FN_EDIT_HYPERLINK:
            {
                SfxItemSet aSet(GetPool(),
                                RES_TXTATR_INETFMT,
                                RES_TXTATR_INETFMT);
                rSh.GetAttr(aSet);
                if(SFX_ITEM_SET > aSet.GetItemState( RES_TXTATR_INETFMT, TRUE ) || rSh.HasReadonlySel())
                {
                    rSet.DisableItem(FN_EDIT_HYPERLINK);
                }
            }
            break;
        }
        nWhich = aIter.NextWhich();
    }
}


/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.171  2000/09/18 16:06:06  willem.vandorp
    OpenOffice header added.

    Revision 1.170  2000/09/12 14:11:19  os
    SfxApplication::ChildWindowExecute removed

    Revision 1.169  2000/09/11 06:52:45  os
    Get/Set/Has/ToggleChildWindow SfxApplication -> SfxViewFrame

    Revision 1.168  2000/09/08 08:12:52  os
    Change: Set/Toggle/Has/Knows/Show/GetChildWindow

    Revision 1.167  2000/09/07 15:59:30  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.166  2000/08/31 11:32:07  jp
    add missing include

    Revision 1.165  2000/05/26 07:21:33  os
    old SW Basic API Slots removed

    Revision 1.164  2000/05/10 11:53:02  os
    Basic API removed

    Revision 1.163  2000/04/18 14:58:24  os
    UNICODE

    Revision 1.162  2000/04/04 15:11:48  os
    #74685# hyperlink button only disabled in readonly sections

    Revision 1.161  2000/03/03 15:17:03  os
    StarView remainders removed

    Revision 1.160  2000/02/11 14:57:58  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.159  2000/01/12 16:43:04  os
    #71278# edit hyperlink: use the new dialog

    Revision 1.158  2000/01/03 08:38:28  os
    #71278# edit hyperlink slot

    Revision 1.157  1999/07/08 13:58:46  MA
    Use internal object to toggle wait cursor


      Rev 1.156   08 Jul 1999 15:58:46   MA
   Use internal object to toggle wait cursor

      Rev 1.155   15 Apr 1999 14:02:44   OS
   #64801# keine Endnoten in Rahmen

      Rev 1.154   23 Mar 1999 18:28:12   JP
   Bug #63449#: vorm Formeledit alle Zellveraenderungen pruefen

      Rev 1.153   18 Mar 1999 14:41:18   OS
   #61169# #61489# Masseinheiten fuer Text u. HTML am Module setzen, nicht an der App

      Rev 1.152   05 Feb 1999 17:05:48   OS
   #61547# InsertEndnoteDirect

      Rev 1.151   15 Jan 1999 15:45:30   JP
   Bug #60203#: MoveLeftMargin - optional um Betrag verschieben

      Rev 1.150   13 Jan 1999 14:54:02   TJ
   include

      Rev 1.149   13 Jan 1999 08:14:18   OS
   #60380# HelpIds fuer AutoFormat - QueryBox

      Rev 1.148   27 Nov 1998 14:55:38   AMA
   Fix #59951#59825#: Unterscheiden zwischen Rahmen-,Seiten- und Bereichsspalten

      Rev 1.147   06 Nov 1998 16:34:50   OS
   #58450# Fussnoten auch im HTML

      Rev 1.146   21 Oct 1998 10:56:54   OM
   #57586# Redlining nach Autoformat

      Rev 1.145   20 Oct 1998 17:52:46   OM
   #57586# Redlining nach Autoformat

      Rev 1.144   20 Oct 1998 11:39:34   OM
   #57586# Redlining nach Autoformat

      Rev 1.143   30 Sep 1998 14:05:26   OS
   #52654# C40_Insert

      Rev 1.142   30 Sep 1998 10:28:56   OS
   #52654# Sortable und SortDescriptor eingebaut, auf- und absteigend fuer jeden Schluessel

      Rev 1.141   08 Sep 1998 17:03:02   OS
   #56134# Metric fuer Text und HTML getrennt

      Rev 1.140   09 Jul 1998 14:04:12   OS
   Kapitelnumerierung jetzt TabDialog

      Rev 1.139   26 May 1998 15:34:00   JP
   neu: Kopf-/Fusszeilen per Menu ein-/ausschalten

      Rev 1.138   13 May 1998 14:58:10   OM
   Autokorrektur/Autoformat umgestaltet und zusammengefasst

      Rev 1.137   08 May 1998 17:02:48   OM
   AutoFormat-Optionen an Ofa und Svx verschoben

      Rev 1.136   07 May 1998 12:58:40   OM
   AutoFormat-Optionen Umstellung

      Rev 1.135   12 Mar 1998 13:08:00   OS
   Numerierungsbutton nicht mehr gecheckt und nicht disabled

      Rev 1.134   04 Mar 1998 14:16:26   OM
   Dokument Merge/Compare

      Rev 1.133   05 Feb 1998 14:46:26   OS
   Numerierungsstart nur bei gesetzer Numerierung putten

      Rev 1.132   02 Feb 1998 09:12:52   OS
   neue Num-Tabpage

      Rev 1.131   12 Dec 1997 13:57:36   OS
   neuer Bookmark-Typ

      Rev 1.130   03 Dec 1997 17:02:34   OS
   Numerierungsumbau

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/shells/textsh2.cxx b/sw/source/ui/shells/textsh2.cxx
new file mode 100644
index 0000000..8e869ff
--- /dev/null
+++ b/sw/source/ui/shells/textsh2.cxx
@@ -0,0 +1,777 @@
/*************************************************************************
 *
 *  $RCSfile: textsh2.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:47 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#if STLPORT_VERSION>=321
#include <cstdarg>
#endif

#include <svtools/svmedit.hxx>
#ifndef _SBASLTID_HRC //autogen
#include <offmgr/sbasltid.hrc>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SFX_WHITER_HXX //autogen
#include <svtools/whiter.hxx>
#endif
#ifndef _SFXEVENT_HXX //autogen
#include <sfx2/event.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SFXVIEWFRM_HXX //autogen
#include <sfx2/viewfrm.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifdef REPLACE_OFADBMGR
#ifndef _SFXITEMSET_HXX
#include <svtools/itemset.hxx>
#endif
#ifndef _SFXREQUEST_HXX
#include <sfx2/request.hxx>
#endif
#ifndef _COM_SUN_STAR_LANG_XMULTISERVICEFACTORY_HPP_
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XNAMEACCESS_HPP_
#include <com/sun/star/container/XNameAccess.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBC_XDATASOURCE_HPP_
#include <com/sun/star/sdbc/XDataSource.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBCX_XTABLESSUPPLIER_HPP_
#include <com/sun/star/sdbcx/XTablesSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBCX_XCOLUMNSSUPPLIER_HPP_
#include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_SDB_XQUERIESSUPPLIER_HPP_
#include <com/sun/star/sdb/XQueriesSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_SDB_XDATABASEACCESS_HPP_
#include <com/sun/star/sdb/XDatabaseAccess.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
#include <com/sun/star/beans/XPropertySet.hpp>
#endif
#ifndef _UNOTOOLS_PROCESSFACTORY_HXX_
#include <unotools/processfactory.hxx>
#endif

#else

#endif  //REPLACE_OFADBMGR

#include "dbmgr.hxx"


#include "view.hxx"
#include "wrtsh.hxx"
#include "swtypes.hxx"
#include "cmdid.h"
#include "swevent.hxx"
#include "shells.hrc"
#include "mailmrge.hxx"
#include "textsh.hxx"
#include "dbinsdlg.hxx"

#ifdef REPLACE_OFADBMGR
using namespace rtl;
using namespace com::sun::star;
using namespace com::sun::star::uno;
using namespace com::sun::star::container;
using namespace com::sun::star::lang;
using namespace com::sun::star::sdb;
using namespace com::sun::star::sdbc;
using namespace com::sun::star::sdbcx;
using namespace com::sun::star::beans;

#define C2U(cChar) rtl::OUString::createFromAscii(cChar)
#endif
#define C2S(cChar) UniString::CreateFromAscii(cChar)
#define DB_DD_DELIM 0x0b

#ifdef DEBUG
// the addressbook doesn't support the new api yet (593)
#ifdef REPLACE_OFADBMGR
void lcl_ReplaceDataSource(String& sDBName, String& sTblName, String& sStatmnt)
{
    Reference<XNameAccess> xDBContext;
    Reference< XMultiServiceFactory > xMgr( ::utl::getProcessServiceFactory() );
    if( xMgr.is() )
    {
        Reference<XInterface> xInstance = xMgr->createInstance( C2U( "com.sun.star.sdb.DatabaseContext" ));
        xDBContext = Reference<XNameAccess>(xInstance, UNO_QUERY) ;
    }
    DBG_ASSERT(xDBContext.is(), "com.sun.star.sdb.DataBaseContext: service not available")
    if(!xDBContext.is())
        return;
    Sequence<OUString> aDBNames = xDBContext->getElementNames();
    const OUString* pDBNames = aDBNames.getConstArray();
    long nCount = aDBNames.getLength();
    DBG_ASSERT(nCount, "no data source available")
    if(!nCount)
        return;
    sDBName = pDBNames[0];

    Any aDBSource = xDBContext->getByName(sDBName);
    Reference<XDataSource>* pxSource = (Reference<XDataSource>*)aDBSource.getValue();

    Reference<sdbc::XConnection> xConnection;
    try
    {
        OUString sDummy;
        xConnection = (*pxSource)->getConnection(sDummy, sDummy);
    }
    catch(...) {}
    DBG_ASSERT(xConnection.is(), "no connection found")
    if (xConnection.is())
    {
        Reference<XTablesSupplier> xTSupplier = Reference<XTablesSupplier>(xConnection, UNO_QUERY);
        DBG_ASSERT(xTSupplier.is(), "no tables found")
        if(xTSupplier.is())
        {
            Reference<XNameAccess> xTbls = xTSupplier->getTables();
            Sequence<OUString> aTblNames = xTbls->getElementNames();
            long nCount = aTblNames.getLength();
            DBG_ASSERT(nCount, "no table found")
            const OUString* pTblNames = aTblNames.getConstArray();
            sTblName = pTblNames[2];
            sStatmnt = String::CreateFromAscii("select * from ");
            String sQuote = xConnection->getMetaData()->getIdentifierQuoteString();
            sStatmnt += sQuote;
            sStatmnt += sTblName;
            sStatmnt += sQuote;
        }
    }
}
#endif // REPLACE_OFADBMGR
#endif // DEBUG

inline void AddSelList( List& rLst, long nRow )
{
    rLst.Insert( (void*)nRow , LIST_APPEND );
}

void lcl_QRY_UPDATE( const SfxItemSet *pArgs, SwNewDBMgr *pNewDBMgr,
                     SwWrtShell &rSh, USHORT nSlot )
{
    DBG_ASSERT( pArgs, "arguments expected" );
    if (pArgs)
    {
        SbaSelectionListRef pSelectionList;

        const SfxStringItem &rDBNameItem = (const SfxStringItem&) pArgs->Get(SID_ATTR_SBA_DATABASE);
        const SfxStringItem &rTableNameItem = (const SfxStringItem&) pArgs->Get(SID_ATTR_SBA_DBOBJ_NAME);
        const SfxStringItem &rStatementItem = (const SfxStringItem&) pArgs->Get(SID_ATTR_SBA_STATEMENT);
        DBG_ASSERT( rStatementItem.ISA(SfxStringItem), "invalid argument type" );

        const SbaSelectionItem &rSelectionItem = (const SbaSelectionItem&) pArgs->Get(SID_ATTR_SBA_SELECTION);
        pSelectionList = rSelectionItem.GetSelectionList();


        String sDBName(rDBNameItem.GetValue());
        String sTableName(rTableNameItem.GetValue());
        String sStatement(rStatementItem.GetValue());

#ifdef DEBUG
// the addressbook doesn't support the new api yet (593)
#ifdef REPLACE_OFADBMGR
        lcl_ReplaceDataSource(sDBName, sTableName, sStatement);
#endif
#endif // DEBUG

#ifdef REPLACE_OFADBMGR
#else
        if(sTableName.Len())
        {
            sDBName += DB_DELIM;
            sDBName += rTableNameItem.GetValue();
        }
#endif
        pNewDBMgr->SetMergeType( DBMGR_MERGE );
#ifdef REPLACE_OFADBMGR
        pNewDBMgr->Merge(DBMGR_MERGE, &rSh,
                        sStatement, pSelectionList, sDBName, sTableName);
#else
        pNewDBMgr->Merge(DBMGR_MERGE, &rSh,
                        sStatement, pSelectionList, sDBName);
#endif
    }
}

/* ---------------------------------------------------------------------------

 ---------------------------------------------------------------------------*/
void SwBaseShell::ExecDB(SfxRequest &rReq)
{
    const SfxItemSet *pArgs = rReq.GetArgs();
    SwNewDBMgr* pNewDBMgr = GetShell().GetNewDBMgr();
    USHORT nSlot = rReq.GetSlot();

    switch (nSlot)
    {
        case SID_SBA_BRW_MERGE:
        {
            String sDBName;
            String sTableName;
            String sStatement;
            SbaSelectionListRef xSelectionList;
            if (pArgs)
            {
                const SfxStringItem &rDBNameItem = (const SfxStringItem&) pArgs->Get(SID_ATTR_SBA_DATABASE);
                sDBName = rDBNameItem.GetValue();
                const SfxStringItem &rTableNameItem = (const SfxStringItem&) pArgs->Get(SID_ATTR_SBA_DBOBJ_NAME);
                sTableName = rTableNameItem.GetValue();
                sStatement = ((const SfxStringItem&) pArgs->Get(SID_ATTR_SBA_STATEMENT)).GetValue();
                const SbaSelectionItem &rSelectionItem = (const SbaSelectionItem&) pArgs->Get(SID_ATTR_SBA_SELECTION);
                xSelectionList = rSelectionItem.GetSelectionList();
            }
#ifdef REPLACE_OFADBMGR
#ifdef DEBUG
            {
                sDBName = C2S("Nordwind");
                sTableName = C2S("Artikel");
                sStatement = C2S("select * from Artikel");
            }
#endif //DEBUG
#endif //REPLACE_OFADBMGR
#ifdef REPLACE_OFADBMGR
#else
            else
                break;
#endif
            if ( !xSelectionList.Is() )
                xSelectionList = new SbaSelectionList;

#ifdef REPLACE_OFADBMGR
#else
            if (sTableName.Len())
            {
                sDBName += DB_DELIM;
                sDBName += sTableName;
            }
#endif

            SwMailMergeDlg* pDlg = new SwMailMergeDlg(
                    NULL, GetShellPtr(),
                    sDBName,
#ifdef REPLACE_OFADBMGR
                    sTableName,
#endif
                    sStatement, xSelectionList );

            if (pDlg->Execute() == RET_OK)
            {
                pNewDBMgr->SetMergeType(  pDlg->GetMergeType() );

                OFF_APP()->NotifyEvent(SfxEventHint(SW_EVENT_MAIL_MERGE, GetView().GetViewFrame()->GetObjectShell()));

#ifdef REPLACE_OFADBMGR
                pNewDBMgr->Merge(pNewDBMgr->GetMergeType(),
                                    GetShellPtr(), sStatement,
                                    xSelectionList,
                                    sDBName,
                                    sTableName);
#else
                pNewDBMgr->Merge(pNewDBMgr->GetMergeType(),
                                    GetShellPtr(), sStatement,
                                    xSelectionList, sDBName);
#endif
                delete(pDlg);
            }
        }
        break;

        case SID_SBA_BRW_UPDATE:
            lcl_QRY_UPDATE( pArgs, pNewDBMgr, GetShell(), nSlot );
            break;

        case SID_SBA_BRW_INSERT:
            DBG_ASSERT( pArgs, "arguments expected" );
            if( pArgs )
            {
                String sDBName = ((SfxStringItem&)pArgs->Get(
                                        SID_ATTR_SBA_DATABASE)).GetValue();
                String sTblName = ((SfxStringItem&)pArgs->Get(
                                        SID_ATTR_SBA_DBOBJ_NAME)).GetValue();
                String sStatmnt = ((SfxStringItem&)pArgs->Get(
                                        SID_ATTR_SBA_STATEMENT)).GetValue();
                SbaSelectionListRef xSelectionList( ((SbaSelectionItem&)
                    pArgs->Get(SID_ATTR_SBA_SELECTION)).GetSelectionList());

#ifdef DEBUG
// the addressbook doesn't support the new api yet (593)
#ifdef REPLACE_OFADBMGR
        lcl_ReplaceDataSource(sDBName, sTblName, sStatmnt);
#endif
#endif // DEBUG

                String* pDataStr = new String( sDBName );
                ((((((*pDataStr) += char(DB_DD_DELIM) )
                    += sTblName ) += char(DB_DD_DELIM) )
                    += '0' ) += char(DB_DD_DELIM) ) // Flag fuer Tabelle oder Query - unused!
                    += sStatmnt;

                if( xSelectionList.Is() )
                    for( ULONG n = 0, nEnd = xSelectionList->Count();
                                    n < nEnd; ++n )
                        ((*pDataStr) += char(DB_DD_DELIM) )
                            += String::CreateFromInt32(
                                    (long)xSelectionList->GetObject( n ));

                SwBaseShell::InsertDBTextHdl( this, pDataStr );
                // der String wird im InsertDBTextHdl geloescht !!
            }
        break;
        default:
            ASSERT(!this, falscher Dispatcher);
            return;
    }
}



void SwTextShell::ExecDB(SfxRequest &rReq)
{
    const SfxItemSet *pArgs = rReq.GetArgs();
    SwNewDBMgr* pNewDBMgr = GetShell().GetNewDBMgr();
    USHORT nSlot = rReq.GetSlot();

    switch (nSlot)
    {
        case FN_QRY_INSERT:
            {
                String* pNew = new String( ((const SfxStringItem&)pArgs->
                                            Get(nSlot)).GetValue() );
                Application::PostUserEvent( STATIC_LINK( this, SwBaseShell,
                                            InsertDBTextHdl ), pNew );
                // der String wird im InsertDBTextHdl geloescht !!
            }
            break;

        case FN_QRY_MERGE_FIELD:
            {
                String sSbaData = ((const SfxStringItem&)pArgs->Get(nSlot)).GetValue();
                String sDBName = sSbaData.GetToken(0, DB_DD_DELIM);
#ifdef REPLACE_OFADBMGR
                String sTableName(sSbaData.GetToken(1, DB_DD_DELIM));
#else
                sDBName += DB_DELIM;
                sDBName += sSbaData.GetToken(1, DB_DD_DELIM);
#endif
                BOOL bTable = sSbaData.GetToken(2, DB_DD_DELIM) == C2S("1");
                String sStatement = sSbaData.GetToken(3, DB_DD_DELIM);

                SbaSelectionListRef pSelectionList;
                pSelectionList.Clear();
                pSelectionList = new SbaSelectionList;
                USHORT nCount = sSbaData.GetTokenCount(DB_DD_DELIM);

                for( USHORT i = 4; i < nCount; i++ )
                    AddSelList( *pSelectionList,
                                sSbaData.GetToken( i, DB_DD_DELIM).ToInt32() );

                pNewDBMgr->SetMergeType( DBMGR_MERGE );
#ifdef REPLACE_OFADBMGR
                pNewDBMgr->Merge(DBMGR_MERGE,
                                    GetShellPtr(), sStatement,
                                    pSelectionList, sDBName, sTableName);
#else
                pNewDBMgr->Merge(DBMGR_MERGE,
                                    GetShellPtr(), sStatement,
                                    pSelectionList, sDBName);
#endif
            }
            break;

        case FN_QRY_INSERT_FIELD:
            {
                String sSbaData = ((const SfxStringItem&)pArgs->Get(FN_QRY_INSERT_FIELD)).GetValue();

                String sDBName = sSbaData.GetToken(0, DB_DD_DELIM);
                sDBName += DB_DELIM;
                sDBName += sSbaData.GetToken(1, DB_DD_DELIM);
                sDBName += DB_DELIM;
                BOOL bTable = sSbaData.GetToken(2, DB_DD_DELIM) == C2S("1");
                sDBName += sSbaData.GetToken(3, DB_DD_DELIM);   // Column name

                InsertDBFld(sDBName);
            }
            break;

        default:
            ASSERT(!this, falscher Dispatcher);
            return;
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



IMPL_STATIC_LINK( SwBaseShell, InsertDBTextHdl, String*, pString )
{
    if( pString )
    {

#ifdef REPLACE_OFADBMGR
        USHORT nTokenPos = 0;
        String sSourceName( pString->GetToken( 0, DB_DD_DELIM, nTokenPos ));
        String sTblQryName( pString->GetToken( 0, DB_DD_DELIM, nTokenPos ));
        String sStatmnt( pString->GetToken( 1, DB_DD_DELIM, nTokenPos ));

        Reference<XDataSource> xSource;
        Reference< sdbc::XConnection> xConnection = SwNewDBMgr::GetConnection(sSourceName, xSource);
        Reference< XColumnsSupplier> xColSupp;
        if(xConnection.is())
            xColSupp = SwNewDBMgr::GetColumnSupplier(xConnection,
                                    sTblQryName,
                                    SW_DB_SELECT_UNKNOWN);

        if( xColSupp.is() )
        {
            SwInsDBData aDBData;
            aDBData.sDataBaseName = sSourceName;
            aDBData.sDataTableName = sTblQryName;
            aDBData.sStatement = sStatmnt;
            SwInsertDBColAutoPilot *pDlg = new SwInsertDBColAutoPilot(
                    pThis->GetView(),
                    xSource,
                    xColSupp,
                    aDBData );
            if( RET_OK == pDlg->Execute() )
            {
                SbaSelectionList aSelectionList;
                while( nTokenPos < pString->Len() )
                    AddSelList( aSelectionList,
                                pString->GetToken( 0, DB_DD_DELIM, nTokenPos ).ToInt32() );
                pDlg->DataToDoc( &aSelectionList , xSource, xConnection);
            }
//          else
//              rSh.ChgDBName( sOldDBName );
            delete pDlg;
        }
//      else
//          rSh.ChgDBName( sOldDBName );
#else
        USHORT nTokenPos = 0;
        String sDBName( pString->GetToken( 0, DB_DD_DELIM, nTokenPos ));
        ( sDBName += DB_DELIM ) +=
                pString->GetToken( 0, DB_DD_DELIM, nTokenPos );
        String sStatmnt( pString->GetToken( 1, DB_DD_DELIM, nTokenPos ));

        SbaSelectionList aSelectionList;
        while( nTokenPos < pString->Len() )
            AddSelList( aSelectionList,
                        pString->GetToken( 0, DB_DD_DELIM, nTokenPos ).ToInt32() );

        SwWrtShell& rSh = pThis->GetShell();
        SwNewDBMgr* pNewDBMgr = rSh.GetNewDBMgr();
        String sOldDBName( rSh.GetDBName() );
        ( sDBName += ';' ) += sStatmnt;
        rSh.ChgDBName( sDBName );

        if( pNewDBMgr->OpenDB( DBMGR_STD, rSh.GetDBDesc() ) )
        {
            pNewDBMgr->ChangeStatement( DBMGR_STD, sStatmnt );

            SwInsertDBColAutoPilot *pDlg = new SwInsertDBColAutoPilot(
                                                        pThis->GetView() );
            if( pDlg->HasValidDB() && RET_OK == pDlg->Execute() )
            {
                // dann jetzt ueber den DBManager die Selektierten
                // Daten ins Dokument einfuegen.
                pDlg->DataToDoc( &aSelectionList );
            }
            else
                rSh.ChgDBName( sOldDBName );
            delete pDlg;
            pNewDBMgr->CloseAll();
        }
        else
            rSh.ChgDBName( sOldDBName );
#endif
    }

    delete pString;
    return 0;
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.115  2000/09/18 16:06:06  willem.vandorp
    OpenOffice header added.

    Revision 1.114  2000/07/18 12:50:09  os
    replace ofadbmgr

    Revision 1.113  2000/07/07 15:25:43  os
    replace ofadbmgr

    Revision 1.112  2000/07/06 07:59:11  os
    replace ofadbmgr

    Revision 1.111  2000/07/05 08:22:09  os
    Replace ofadbmgr

    Revision 1.110  2000/06/07 13:18:20  os
    using UCB

    Revision 1.109  2000/05/26 07:21:33  os
    old SW Basic API Slots removed

    Revision 1.108  2000/05/23 19:29:09  jp
    Bugfixes for Unicode

    Revision 1.107  2000/05/10 11:53:02  os
    Basic API removed

    Revision 1.106  2000/04/18 14:58:24  os
    UNICODE

    Revision 1.105  2000/02/11 14:58:04  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.104  2000/01/06 07:32:58  os
    #71436# mail merge dialog: execute via status method disposed

    Revision 1.103  1999/11/11 15:00:55  hr
    #65293#: STLPORT 3.2.1

    Revision 1.102  1999/09/29 07:00:54  mh
    chg: header

    Revision 1.101  1999/03/01 15:22:38  MA
    #62490# Altlast entfernt (Drucken und Briefumschlaege/Etiketten und Datenbank)


      Rev 1.100   01 Mar 1999 16:22:38   MA
   #62490# Altlast entfernt (Drucken und Briefumschlaege/Etiketten und Datenbank)

      Rev 1.99   26 Feb 1999 16:08:42   MA
   #62490# Rest vom Drucken Etiketten entfernt

      Rev 1.98   12 Oct 1998 10:16:12   OM
   #57790# Dialog nicht mehr AppModal

      Rev 1.97   28 May 1998 17:09:54   JP
   Auch beim Droppen von Datensaetzen als Text den neuen DBInsertDialog starten

      Rev 1.96   20 May 1998 21:32:32   JP
   InsertDBCols als Text: rufe den neuen Autopiloten

      Rev 1.95   09 Dec 1997 12:31:08   OM
   #45200# Serienbrief: Speichern-Monitor

      Rev 1.94   02 Dec 1997 19:38:24   MA
   #45900#, SelectionList muss fuer Dialog existieren

      Rev 1.93   24 Nov 1997 09:46:52   MA
   includes

      Rev 1.92   18 Nov 1997 14:45:22   OM
   Sba-Umstellung 372

      Rev 1.91   03 Nov 1997 13:55:42   MA
   precomp entfernt

      Rev 1.90   08 Sep 1997 11:12:38   OM
   #43152# SingleJob-Parameter fuer DataUpdatePrint

      Rev 1.89   02 Sep 1997 14:58:36   OM
   Neue Parameter fuer DataUpdatePrint

      Rev 1.88   02 Sep 1997 09:58:00   OM
   SDB-Headeranpassung

      Rev 1.87   01 Sep 1997 13:23:56   OS
   DLL-Umstellung

      Rev 1.86   06 Aug 1997 14:37:02   TRI
   VCL: includes

      Rev 1.85   11 Jul 1997 14:46:36   OM
   #41525# Nur durch SQL-Statement eingeschraenkte Datensaetze verwenden

      Rev 1.84   09 Jun 1997 17:23:16   OM
   Serienbriefe als Dateien speichern

      Rev 1.83   29 Apr 1997 16:19:48   OM
   Druckdialog bei Aufruf aus Basic unterdruecken

      Rev 1.82   07 Apr 1997 17:45:56   MH
   chg: header

      Rev 1.81   09 Mar 1997 15:51:36   OM
   Basic abgesichert

      Rev 1.80   24 Feb 1997 16:54:02   OS
   Item mit Tabellenname auswerten

      Rev 1.79   13 Feb 1997 22:59:16   MA
   Datenbankfunktionalitaet wieder hergestellt

      Rev 1.78   12 Feb 1997 16:57:48   OM
   Datenbankslots ueber Baseshell rufen

      Rev 1.77   12 Feb 1997 10:40:46   OM
   Endlosschleife behoben

      Rev 1.76   12 Feb 1997 09:22:44   OM
   DD-Trenner korrigiert

      Rev 1.75   09 Feb 1997 15:09:34   OM
   Anderer Trenner bei DB Drag u. Drop

      Rev 1.74   07 Feb 1997 17:20:36   OM
   Datenbankumstellung Drag u. Drop

      Rev 1.73   16 Dec 1996 10:59:02   OM
   Drucken aus DB-Browser angefangen

      Rev 1.72   11 Dec 1996 10:50:56   MA
   Warnings

      Rev 1.71   01 Dec 1996 19:30:28   sdo
   GCC-Parser

      Rev 1.70   12 Nov 1996 16:50:58   MA
   richtige Versionen gemerged

      Rev 1.68   08 Nov 1996 17:40:14   OM
   DB-Mode fuer Serienbriefe und Etiketten zum Teil wiederbelebt

      Rev 1.67   24 Oct 1996 13:36:40   JP
   String Umstellung: [] -> GetChar()

      Rev 1.66   25 Sep 1996 14:12:10   OM
   Neue Datenbanktrenner

      Rev 1.65   19 Sep 1996 14:32:52   OM
   Datenbank Basicanbindung

      Rev 1.64   18 Sep 1996 10:44:58   OM
   Serienbriefe wieder angebunden

      Rev 1.63   13 Sep 1996 15:47:16   OM
   Serienbrief

      Rev 1.62   06 Sep 1996 12:31:42   OM
   Statusmethode fuer DB-Slot

      Rev 1.61   28 Aug 1996 15:54:58   OS
   includes

      Rev 1.60   23 Aug 1996 15:51:56   OM
   Datenbank: Drag&Drop

      Rev 1.59   23 Aug 1996 14:48:00   OM
   Datenbank: Drag&Drop

      Rev 1.58   21 Aug 1996 14:51:52   OM
   Datenbank Drag&Drop

      Rev 1.57   07 Aug 1996 16:24:24   OM
   Datenbankumstellung

      Rev 1.56   19 Jul 1996 16:10:14   OM
   SBA-Umstellung

      Rev 1.55   17 Jul 1996 13:47:40   OM
   Datenbankumstellung 327

      Rev 1.54   02 Jul 1996 16:36:20   OM
   #28615# Makroausfuehrung auch bei Serienbriefdruck

      Rev 1.53   04 Jun 1996 14:11:22   OM
   Serienbrief Mailing

      Rev 1.52   06 May 1996 17:39:34   OM
   Mehrere Datenbanken pro Dokument

      Rev 1.51   30 Apr 1996 09:24:34   OM
   Mehrere Datenbanken pro Dok

------------------------------------------------------------------------*/




diff --git a/sw/source/ui/shells/txtattr.cxx b/sw/source/ui/shells/txtattr.cxx
new file mode 100644
index 0000000..827db97
--- /dev/null
+++ b/sw/source/ui/shells/txtattr.cxx
@@ -0,0 +1,875 @@
/*************************************************************************
 *
 *  $RCSfile: txtattr.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:47 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "hintids.hxx"

#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SFX_WHITER_HXX //autogen
#include <svtools/whiter.hxx>
#endif
#ifndef _SFXSTRITEM_HXX
#include <svtools/stritem.hxx>
#endif
#ifndef _SFX_BINDINGS_HXX //autogen
#include <sfx2/bindings.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SVX_FHGTITEM_HXX //autogen
#include <svx/fhgtitem.hxx>
#endif
#ifndef _SVX_ADJITEM_HXX //autogen
#include <svx/adjitem.hxx>
#endif
#ifndef _SVX_LSPCITEM_HXX //autogen
#include <svx/lspcitem.hxx>
#endif
#ifndef _SVX_UDLNITEM_HXX //autogen
#include <svx/udlnitem.hxx>
#endif
#ifndef _SVX_ESCPITEM_HXX //autogen
#include <svx/escpitem.hxx>
#endif
#ifndef _SVX_HTMLMODE_HXX //autogen
#include <svx/htmlmode.hxx>
#endif


#ifndef _FMTINFMT_HXX //autogen
#include <fmtinfmt.hxx>
#endif
#include "cmdid.h"
#include "docsh.hxx"
#include "wrtsh.hxx"
#include "view.hxx"
#include "viewopt.hxx"
#include "uitool.hxx"
#include "uiitems.hxx"
#include "textsh.hxx"
#include "drpcps.hxx"
#include "num.hxx"
#include "swundo.hxx"
#include "fmtcol.hxx"

#include "globals.h"
#include "shells.hrc"

const SwTwips lFontInc = 2 * 20;           // ==> PointToTwips(2)
const SwTwips lFontMaxSz = 72 * 20;        // ==> PointToTwips(72)





void SwTextShell::ExecCharAttr(SfxRequest &rReq)
{
    SwWrtShell &rSh = GetShell();
    const SfxItemSet  *pArgs   = rReq.GetArgs();
          int          eState = STATE_TOGGLE;
    USHORT nWhich = rReq.GetSlot();

    if(pArgs )
    {
        const SfxPoolItem* pItem;
        pArgs->GetItemState(nWhich, FALSE, &pItem);
        eState =  ((const SfxBoolItem &) pArgs->
                                Get( nWhich )).GetValue() ? STATE_ON : STATE_OFF;
    }


    SfxItemSet aSet( GetPool(), RES_CHRATR_BEGIN, RES_CHRATR_END-1 );
    if (STATE_TOGGLE == eState)
        rSh.GetAttr( aSet );

    switch ( nWhich )
    {
        case FN_SET_SUB_SCRIPT:
        case FN_SET_SUPER_SCRIPT:
        {
            SvxEscapement eEscape;
            switch (eState)
            {
            case STATE_TOGGLE:
            {
                short nTmpEsc = ((const SvxEscapementItem&)
                            aSet.Get( RES_CHRATR_ESCAPEMENT )).GetEsc();
                eEscape = nWhich == FN_SET_SUPER_SCRIPT ?
                                SVX_ESCAPEMENT_SUPERSCRIPT:
                                SVX_ESCAPEMENT_SUBSCRIPT;
                if( nWhich == FN_SET_SUB_SCRIPT && nTmpEsc < 0 ||
                            nWhich == FN_SET_SUPER_SCRIPT && nTmpEsc > 0 )
                    eEscape = SVX_ESCAPEMENT_OFF;

                SfxBindings& rBind = GetView().GetViewFrame()->GetBindings();
                if( nWhich == FN_SET_SUB_SCRIPT )
                    rBind.SetState( SfxBoolItem( FN_SET_SUPER_SCRIPT,
                                                                    FALSE ) );
                else
                    rBind.SetState( SfxBoolItem( FN_SET_SUB_SCRIPT,
                                                                    FALSE ) );

            }
            break;
            case STATE_ON:
                eEscape = nWhich == FN_SET_SUPER_SCRIPT ?
                                SVX_ESCAPEMENT_SUPERSCRIPT:
                                SVX_ESCAPEMENT_SUBSCRIPT;
                break;
            case STATE_OFF:
                eEscape = SVX_ESCAPEMENT_OFF;
                break;
            }
            SvxEscapementItem aEscape( eEscape );
            if(eEscape == SVX_ESCAPEMENT_SUPERSCRIPT)
                aEscape.GetEsc() = DFLT_ESC_AUTO_SUPER;
            else if(eEscape == SVX_ESCAPEMENT_SUBSCRIPT)
                aEscape.GetEsc() = DFLT_ESC_AUTO_SUB;
            if(eState != STATE_OFF )
            {
                if(eEscape == FN_SET_SUPER_SCRIPT)
                    aEscape.GetEsc() *= -1;
            }
            rSh.SetAttr( aEscape );
        }
        break;

        case FN_UPDATE_STYLE_BY_EXAMPLE:
            rSh.QuickUpdateStyle();
            break;
        case FN_UNDERLINE_DOUBLE:
        {
            FontUnderline eUnderline =  ((const SvxUnderlineItem&)
                            aSet.Get(RES_CHRATR_UNDERLINE)).GetUnderline();
            switch( eState )
            {
                case STATE_TOGGLE:
                    eUnderline = eUnderline == UNDERLINE_DOUBLE ?
                        UNDERLINE_NONE :
                            UNDERLINE_DOUBLE;
                break;
                case STATE_ON:
                    eUnderline = UNDERLINE_DOUBLE;
                break;
                case STATE_OFF:
                    eUnderline = UNDERLINE_NONE;
                break;
            }
            rSh.SetAttr(SvxUnderlineItem(eUnderline));
        }
        break;
        default:
            ASSERT(FALSE, falscher Dispatcher);
            return;
    }
}



void SwTextShell::ExecCharButtonAttr(SfxRequest &rReq)
{
    const SfxItemSet *pArgs = rReq.GetArgs();
    if (pArgs)
    {
        SwWrtShell& rWrtSh = GetShell();
        SwTxtFmtColl* pColl = rWrtSh.GetCurTxtFmtColl();
        if(rWrtSh.HasSelection() &&
                rWrtSh.IsSelFullPara() &&
                    pColl && pColl->IsAutoUpdateFmt())
        {
            rWrtSh.AutoUpdatePara(pColl, *pArgs);
        }
        else
            rWrtSh.SetAttr(*pArgs);

    }
}



void SwTextShell::ExecCharAttrArgs(SfxRequest &rReq)
{
    int nSlot = rReq.GetSlot();
    const SfxItemSet* pArgs = rReq.GetArgs();
    BOOL bArgs = pArgs != 0 && pArgs->Count() > 0;
    int bGrow = FALSE;
    SwWrtShell& rWrtSh = GetShell();
    SwTxtFmtColl* pColl = 0;
    // nur gesetzt, wenn gesamter Absatz selektiert ist und AutoUpdateFmt gesetzt ist
    if(rWrtSh.HasSelection() &&
            rWrtSh.IsSelFullPara())
    {
        pColl = rWrtSh.GetCurTxtFmtColl();
        if(pColl && !pColl->IsAutoUpdateFmt())
            pColl = 0;
    }
    USHORT nWhich = GetPool().GetWhich(nSlot);
    switch ( nSlot )
    {
        case FN_TXTATR_INET:
        // Sonderbehandlung der PoolId des SwFmtInetFmt
        if(bArgs)
        {
            const SfxPoolItem& rItem = pArgs->Get(nWhich );

            SwFmtINetFmt aINetFmt((const SwFmtINetFmt&)rItem);
            if( USHRT_MAX == aINetFmt.GetVisitedFmtId() )
            {
                aINetFmt.SetVisitedFmtId(
                        rWrtSh.GetPoolId( aINetFmt.GetVisitedFmt(), GET_POOLID_CHRFMT));
            }
            if( USHRT_MAX == aINetFmt.GetINetFmtId() )
            {
                aINetFmt.SetINetFmtId(
                        rWrtSh.GetPoolId( aINetFmt.GetINetFmt(), GET_POOLID_CHRFMT));
            }


            if ( pColl )
                pColl->SetAttr( aINetFmt );
            else rWrtSh.SetAttr( aINetFmt );
        }
        break;
        case SID_ATTR_CHAR_WORDLINEMODE:
        case SID_ATTR_CHAR_CASEMAP:
        case SID_ATTR_CHAR_LANGUAGE:
        case SID_ATTR_CHAR_KERNING:
            if( bArgs )
            {
                const SfxPoolItem& rItem = pArgs->Get(nWhich );
                if ( pColl ) pColl->SetAttr( rItem );
                else rWrtSh.SetAttr( rItem );
            }
        break;
        case FN_GROW_FONT_SIZE:
            bGrow = TRUE;
            // kein break !!
        case FN_SHRINK_FONT_SIZE:
        {
            SfxItemSet aSet( GetPool(), RES_CHRATR_FONTSIZE, RES_CHRATR_FONTSIZE);
            rWrtSh.GetAttr( aSet );
            SvxFontHeightItem aSize( (const SvxFontHeightItem&)
                                        aSet.Get(RES_CHRATR_FONTSIZE) );

            SwTwips lSize = (SwTwips) aSize.GetHeight();

            if (bGrow)
            {
                if( lSize == lFontMaxSz )
                    break;      // das wars, hoeher gehts nicht
                if( ( lSize += lFontInc ) > lFontMaxSz )
                    lSize = lFontMaxSz;
            }
            else
            {
                if( 4 == lSize )
                    break;
                if( ( lSize -= lFontInc ) < 4 )
                    lSize = 4;
            }
            aSize.SetHeight( lSize );
            aSet.Put( aSize );
            if (pColl) pColl->SetAttr(aSet);
            else rWrtSh.SetAttr( aSet );
        }
        break;
        default:
            ASSERT(FALSE, falscher Dispatcher);
            return;
    }
}



#ifdef CFRONT

void lcl_SetAdjust(SvxAdjust eAdjst, SfxItemSet& rSet)
{
    rSet.Put(SvxAdjustItem(eAdjst,RES_PARATR_ADJUST ));
}



void lcl_SetLineSpace(BYTE ePropL,SfxItemSet& rSet)
{
    SvxLineSpacingItem aLineSpacing(ePropL, RES_PARATR_LINESPACING );
    aLineSpacing.GetLineSpaceRule() = SVX_LINE_SPACE_AUTO;
    if( 100 == ePropL )
        aLineSpacing.GetInterLineSpaceRule() = SVX_INTER_LINE_SPACE_OFF;
    else
        aLineSpacing.SetPropLineSpace(ePropL);
    rSet.Put( aLineSpacing );
}



void SwTextShell::ExecParaAttr(SfxRequest &rReq)
{
    // gleiche beide Attribute holen, ist nicht teuerer !!
    SfxItemSet aSet( GetPool(), RES_PARATR_LINESPACING, RES_PARATR_ADJUST );

    switch (rReq.GetSlot())
    {
    case FN_SET_LEFT_PARA:          lcl_SetAdjust(ADJLEFT,aSet);    break;
    case FN_SET_RIGHT_PARA:         lcl_SetAdjust(ADJRIGHT,aSet);   break;
    case FN_SET_CENTER_PARA:        lcl_SetAdjust(ADJCENTER,aSet);  break;
    case SID_ATTR_PARA_ADJUST_BLOCK:lcl_SetAdjust(ADJBLOCK,aSet);   break;

    case FN_SET_LINE_SPACE_1:   lcl_SetLineSpace(100,aSet);     break;
    case FN_SET_LINE_SPACE_15:  lcl_SetLineSpace(150,aSet);     break;
    case FN_SET_LINE_SPACE_2:   lcl_SetLineSpace(200,aSet);     break;

    default:
        DBG_ERROR("SwTextShell::ExecParaAttr falscher Dispatcher");
        return;
    }
    SwWrtShell& rWrtSh = GetShell();
    SwTxtFmtColl* pColl = rWrtSh.GetCurTxtFmtColl();
    if(pColl && pColl->IsAutoUpdateFmt())
    {
        rWrtSh.AutoUpdatePara(pColl, *pSet);
    }
    else
        rWrtSh.SetAttr( aSet );
}

#else



void SwTextShell::ExecParaAttr(SfxRequest &rReq)
{
    SvxAdjust eAdjst;
    BYTE ePropL;
    const SfxItemSet* pArgs = rReq.GetArgs();

    // gleich beide Attribute holen, ist nicht teuerer !!
    SfxItemSet aSet( GetPool(), RES_PARATR_LINESPACING, RES_PARATR_ADJUST );

    USHORT nSlot = rReq.GetSlot();
    switch (nSlot)
    {
        case SID_ATTR_PARA_ADJUST:
            if(pArgs &&  SFX_ITEM_SET == pArgs->GetItemState( RES_PARATR_ADJUST) )
            {
                eAdjst = ((const SvxAdjustItem&)pArgs->Get(
                                RES_PARATR_ADJUST)).GetAdjust();
                goto SET_ADJUST;
            }
        break;
        case SID_ATTR_PARA_ADJUST_LEFT:     eAdjst =  SVX_ADJUST_LEFT;      goto SET_ADJUST;
        case SID_ATTR_PARA_ADJUST_RIGHT:    eAdjst =  SVX_ADJUST_RIGHT;     goto SET_ADJUST;
        case SID_ATTR_PARA_ADJUST_CENTER:   eAdjst =  SVX_ADJUST_CENTER;    goto SET_ADJUST;
        case SID_ATTR_PARA_ADJUST_BLOCK:    eAdjst =  SVX_ADJUST_BLOCK;     goto SET_ADJUST;
SET_ADJUST:
        {
            aSet.Put(SvxAdjustItem(eAdjst,RES_PARATR_ADJUST ));
        }
        break;

        case SID_ATTR_PARA_LINESPACE:
            if(pArgs && SFX_ITEM_SET == pArgs->GetItemState( GetPool().GetWhich(nSlot) ))
            {
                SvxLineSpacingItem aLineSpace = (const SvxLineSpacingItem&)pArgs->Get(
                                                            GetPool().GetWhich(nSlot));
                aSet.Put( aLineSpace );
            }
        break;
        case SID_ATTR_PARA_LINESPACE_10:    ePropL = 100;   goto SET_LINESPACE;
        case SID_ATTR_PARA_LINESPACE_15:    ePropL = 150;   goto SET_LINESPACE;
        case SID_ATTR_PARA_LINESPACE_20:    ePropL = 200;   goto SET_LINESPACE;

SET_LINESPACE:
        {

            SvxLineSpacingItem aLineSpacing(ePropL, RES_PARATR_LINESPACING );
            aLineSpacing.GetLineSpaceRule() = SVX_LINE_SPACE_AUTO;
            if( 100 == ePropL )
                aLineSpacing.GetInterLineSpaceRule() = SVX_INTER_LINE_SPACE_OFF;
            else
                aLineSpacing.SetPropLineSpace(ePropL);
            aSet.Put( aLineSpacing );
        }
        break;

        default:
            ASSERT(FALSE, falscher Dispatcher);
            return;
    }
    SwWrtShell& rWrtSh = GetShell();
    SwTxtFmtColl* pColl = rWrtSh.GetCurTxtFmtColl();
    if(pColl && pColl->IsAutoUpdateFmt())
    {
        rWrtSh.AutoUpdatePara(pColl, aSet);
    }
    else
        rWrtSh.SetAttr( aSet );
}

#endif



void SwTextShell::ExecParaAttrArgs(SfxRequest &rReq)
{
    SwWrtShell &rSh = GetShell();
    const SfxItemSet *pArgs = rReq.GetArgs();
    const SfxPoolItem *pItem = 0;

    USHORT nSlot = rReq.GetSlot();
    if(pArgs)
        pArgs->GetItemState(GetPool().GetWhich(nSlot), FALSE, &pItem);
    switch ( nSlot )
    {
        case FN_FORMAT_DROPCAPS:
        {
            if(pItem)
                rSh.SetAttr(*pItem);
            else
            {
                SfxItemSet aSet(GetPool(), RES_PARATR_DROP, RES_PARATR_DROP,
                                           HINT_END, HINT_END);
                rSh.GetAttr(aSet);
                SwDropCapsDlg *pDlg = new SwDropCapsDlg(GetView().GetWindow(), aSet);
                if (pDlg->Execute() == RET_OK)
                {
                    rSh.StartAction();
                    rSh.StartUndo( UNDO_START );
                    if ( SFX_ITEM_SET == aSet.GetItemState(HINT_END,FALSE,&pItem) )
                    {
                        if ( ((SfxStringItem*)pItem)->GetValue().Len() )
                            rSh.ReplaceDropTxt(((SfxStringItem*)pItem)->GetValue());
                    }
                    rSh.SetAttr(*pDlg->GetOutputItemSet());
                    rSh.StartUndo( UNDO_END );
                    rSh.EndAction();
                }
                delete pDlg;
            }
        }
         break;
        case SID_ATTR_PARA_PAGEBREAK:
            if(pItem)
            {
                rSh.SetAttr( *pItem );
            }
        break;
        case SID_ATTR_PARA_MODEL:
        {
            if(pItem)
            {
                SfxItemSet aCoreSet( GetPool(),
                    RES_PAGEDESC,   RES_PAGEDESC,
                    SID_ATTR_PARA_MODEL, SID_ATTR_PARA_MODEL, 0);
                aCoreSet.Put(*pItem);
                SfxToSwPageDescAttr( rSh, aCoreSet);
                rSh.SetAttr(aCoreSet);
            }
        }
        break;
        default:
            ASSERT(FALSE, falscher Dispatcher);
            return;
    }
}



void SwTextShell::GetAttrState(SfxItemSet &rSet)
{
    SwWrtShell &rSh = GetShell();
    SfxItemPool& rPool = GetPool();
    SfxItemSet aCoreSet(rPool, aTxtFmtCollSetRange);
    rSh.GetAttr(aCoreSet);  // *alle* Textattribute von der Core erfragen

    SfxWhichIter aIter(rSet);
    register USHORT nSlot = aIter.FirstWhich();
    register int bFlag;
    SfxBoolItem aFlagItem;
    const SfxPoolItem* pItem = 0;
    int eAdjust = -1;   // Illegaler Wert, um DONTCARE zu erkennen
    SfxItemState eState = aCoreSet.GetItemState(RES_PARATR_ADJUST, FALSE, &pItem);

    if( SFX_ITEM_DEFAULT == eState )
        pItem = &rPool.GetDefaultItem(RES_PARATR_ADJUST);
    if( SFX_ITEM_DEFAULT <= eState )
        eAdjust = (int)(( SvxAdjustItem* ) pItem)->GetAdjust();

    short nEsc = 0;
    eState =  aCoreSet.GetItemState(RES_CHRATR_ESCAPEMENT, FALSE, &pItem);
    if( SFX_ITEM_DEFAULT == eState )
        pItem = &rPool.GetDefaultItem(RES_CHRATR_ESCAPEMENT);
    if( eState >= SFX_ITEM_DEFAULT )
        nEsc = ((SvxEscapementItem* )pItem)->GetEsc();

    USHORT nLineSpace = 0;
    eState =  aCoreSet.GetItemState(RES_PARATR_LINESPACING, FALSE, &pItem);
    if( SFX_ITEM_DEFAULT == eState )
        pItem = &rPool.GetDefaultItem(RES_PARATR_LINESPACING);
    if( SFX_ITEM_DEFAULT <= eState &&
            ((SvxLineSpacingItem* )pItem)->GetLineSpaceRule() == SVX_LINE_SPACE_AUTO )
    {
        if(SVX_INTER_LINE_SPACE_OFF ==
                    ((SvxLineSpacingItem* )pItem)->GetInterLineSpaceRule())
            nLineSpace = 100;
        else
            nLineSpace = ((SvxLineSpacingItem* )pItem)->GetPropLineSpace();
    }

    while (nSlot)
    {
        switch(nSlot)
        {
            case FN_SET_SUPER_SCRIPT:
                    bFlag = 0 < nEsc;
                break;
            case FN_SET_SUB_SCRIPT:
                    bFlag = 0 > nEsc;
                break;
            case SID_ATTR_PARA_ADJUST_LEFT:
                if (eAdjust == -1)
                {
                    rSet.InvalidateItem( nSlot );
                    nSlot = 0;
                }
                else
                    bFlag = SVX_ADJUST_LEFT == eAdjust;
                break;
            case SID_ATTR_PARA_ADJUST_RIGHT:
                if (eAdjust == -1)
                {
                    rSet.InvalidateItem( nSlot );
                    nSlot = 0;
                }
                else
                    bFlag = SVX_ADJUST_RIGHT == eAdjust;
                break;
            case SID_ATTR_PARA_ADJUST_CENTER:
                if (eAdjust == -1)
                {
                    rSet.InvalidateItem( nSlot );
                    nSlot = 0;
                }
                else
                    bFlag = SVX_ADJUST_CENTER == eAdjust;
                break;
            case SID_ATTR_PARA_ADJUST_BLOCK:
            {
                if (eAdjust == -1)
                {
                    rSet.InvalidateItem( nSlot );
                    nSlot = 0;
                }
                else
                {
                    bFlag = SVX_ADJUST_BLOCK == eAdjust;
                    USHORT nHtmlMode = GetHtmlMode(rSh.GetView().GetDocShell());
                    if((nHtmlMode & HTMLMODE_ON) && !(nHtmlMode & (HTMLMODE_FULL_STYLES|HTMLMODE_FIRSTLINE) ))
                    {
                        rSet.DisableItem( nSlot );
                        nSlot = 0;
                    }
                }
            }
            break;
            case SID_ATTR_PARA_LINESPACE_10:
                bFlag = nLineSpace == 100;
            break;
            case SID_ATTR_PARA_LINESPACE_15:
                bFlag = nLineSpace == 150;
            break;
            case SID_ATTR_PARA_LINESPACE_20:
                bFlag = nLineSpace == 200;
            break;
            case FN_GROW_FONT_SIZE:
            case FN_SHRINK_FONT_SIZE:
            {
                SfxItemState eState = aCoreSet.GetItemState( RES_CHRATR_FONTSIZE );
                if( eState == SFX_ITEM_DONTCARE )
                    rSet.DisableItem( nSlot );
                nSlot = 0;
            }
            break;
            case FN_UNDERLINE_DOUBLE:
            {
                eState = aCoreSet.GetItemState(RES_CHRATR_UNDERLINE);
                if( eState >= SFX_ITEM_DEFAULT )
                {
                    FontUnderline eUnderline =  ((const SvxUnderlineItem&)
                            aCoreSet.Get(RES_CHRATR_UNDERLINE)).GetUnderline();
                    rSet.Put(SfxBoolItem(nSlot, eUnderline == UNDERLINE_DOUBLE));
                }
                else
                    rSet.InvalidateItem(nSlot);
                nSlot = 0;
            }
            break;
            case SID_ATTR_PARA_ADJUST:
                if (eAdjust == -1)
                    rSet.InvalidateItem( nSlot );
                else
                    rSet.Put(SvxAdjustItem((SvxAdjust)eAdjust, SID_ATTR_PARA_ADJUST ));
                nSlot = 0;
            break;
            case SID_ATTR_CHAR_CASEMAP:
            case SID_ATTR_CHAR_LANGUAGE:
            case SID_ATTR_CHAR_KERNING:
            case SID_ATTR_PARA_HYPHENZONE:
            case SID_ATTR_PARA_KEEP:
            case SID_ATTR_PARA_WIDOWS:
            case SID_ATTR_PARA_ORPHANS:
            case RES_PARATR_DROP:
            {
#ifdef DEBUG
                const SfxPoolItem& rItem = aCoreSet.Get(GetPool().GetWhich(nSlot), TRUE);
                rSet.Put(rItem);
#else
                rSet.Put(aCoreSet.Get( GetPool().GetWhich(nSlot), TRUE));
#endif
                nSlot = 0;
            }
            break;
            case SID_ATTR_PARA_MODEL:
            {
                SfxItemSet aTemp(GetPool(),
                        RES_PAGEDESC,RES_PAGEDESC,
                        SID_ATTR_PARA_MODEL,SID_ATTR_PARA_MODEL,
                        0L);
                aTemp.Put(aCoreSet);
                ::SwToSfxPageDescAttr(aTemp);
                rSet.Put(aTemp.Get(SID_ATTR_PARA_MODEL));
                nSlot = 0;
            }
            break;
            case RES_TXTATR_INETFMT:
            {
                SfxItemSet aSet(GetPool(), RES_TXTATR_INETFMT, RES_TXTATR_INETFMT);
                rSh.GetAttr(aSet);
#ifdef DEBUG
                const SfxPoolItem& rItem = aSet.Get(RES_TXTATR_INETFMT, TRUE);
                rSet.Put(rItem);
#else
                rSet.Put(aSet.Get( RES_TXTATR_INETFMT, TRUE));
#endif
                nSlot = 0;
            }
            break;
            default:
            // Nichts tun
            nSlot = 0;
            break;

        }
        if( nSlot )
        {
            aFlagItem.SetWhich( nSlot );
            aFlagItem.SetValue( bFlag );
            rSet.Put( aFlagItem );
        }
        nSlot = aIter.NextWhich();
    }

    rSet.Put(aCoreSet,FALSE);
}
/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.122  2000/09/18 16:06:07  willem.vandorp
    OpenOffice header added.

    Revision 1.121  2000/09/07 15:59:30  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.120  2000/08/31 11:32:12  jp
    add missing include

    Revision 1.119  2000/05/26 07:21:33  os
    old SW Basic API Slots removed

    Revision 1.118  2000/05/10 11:53:02  os
    Basic API removed

    Revision 1.117  2000/02/11 14:58:08  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.116  1999/01/04 13:29:16  OS
    #60575# Shrink/GrowFontSize: keinen falschen Status liefern


      Rev 1.115   04 Jan 1999 14:29:16   OS
   #60575# Shrink/GrowFontSize: keinen falschen Status liefern

      Rev 1.114   29 Nov 1997 15:54:02   MA
   includes

      Rev 1.113   24 Nov 1997 09:47:40   MA
   includes

      Rev 1.112   03 Nov 1997 13:55:52   MA
   precomp entfernt

      Rev 1.111   22 Oct 1997 12:31:56   OS
   StateMethod fuer SID_ATTR_PARA_MODEL #44910#

      Rev 1.110   04 Sep 1997 17:12:04   MA
   includes

      Rev 1.109   15 Aug 1997 11:48:40   OS
   chartar/frmatr/txtatr aufgeteilt

      Rev 1.108   11 Aug 1997 10:06:46   OS
   paraitem/frmitems/textitem aufgeteilt

      Rev 1.107   25 Jun 1997 13:49:50   OS
   Ids des SwFmtINetFmt korrigieren #40977#

      Rev 1.106   17 Jun 1997 16:11:58   MA
   DrawTxtShell nicht von BaseShell ableiten + Opts

      Rev 1.105   28 May 1997 15:06:32   OM
   #40067# DontCare-State fuer Absatzausrichtung beruecksichtigen

      Rev 1.104   24 Mar 1997 15:51:22   OS
   Blocksatzerweiterung fuer Html

      Rev 1.103   10 Mar 1997 12:01:20   NF
   OS2-Anpassung ...

      Rev 1.102   07 Mar 1997 08:09:38   OS
   AutoUpdate fuer Vorlagen: harte Attribute loeschen

      Rev 1.101   06 Mar 1997 16:46:30   OS
   AutoUpdate fuer Absatz- und Rahmenvorlagen

      Rev 1.100   05 Mar 1997 21:00:24   HJS
   muss 357

      Rev 1.99   19 Feb 1997 19:10:14   MA
   fix: DropCap, Text per Item

      Rev 1.98   27 Jan 1997 16:30:38   OS
   HtmlMode entfernt

      Rev 1.97   16 Dec 1996 19:10:38   HJS
   includes

      Rev 1.96   14 Dec 1996 14:48:46   OS
   kein Blocksatz im HTML-Mode

      Rev 1.95   22 Nov 1996 16:24:46   NF
   zwei identische case-bl”cke in einer switch-anweisung -> doppelten entfernt..

      Rev 1.94   22 Nov 1996 14:53:34   OS
   FN_SET_JUSTIFY_PARA -> SID_ATTR_PARA_ADJUST_BLOCK

      Rev 1.93   14 Nov 1996 19:17:56   OS
   Umstellung SlotIds

      Rev 1.92   24 Sep 1996 06:58:14   OS
   Hoch-/Tiefstellung auf automatisch

      Rev 1.91   09 Sep 1996 15:11:10   OS
   SID_APPLY_TEMPLATE mit WrtShell

      Rev 1.90   28 Aug 1996 15:55:16   OS
   includes

      Rev 1.89   15 Aug 1996 18:17:16   OS
   URL als Attribut - auch fuer die API

      Rev 1.88   26 Jun 1996 15:20:54   OS
   Aufruf von Dispatcher.Execute an 324 angepasst

      Rev 1.87   25 Jun 1996 19:52:10   HJS
   includes

      Rev 1.86   22 Mar 1996 15:34:38   TRI
   sfxiiter.hxx included

      Rev 1.85   21 Mar 1996 11:58:26   MA
   Umstellung SV311

      Rev 1.84   20 Feb 1996 17:02:56   JP
   Umbau SfxItemPool -> SwAttrPool

      Rev 1.83   15 Feb 1996 18:04:58   OS
   UnderlineDouble und Sub/Superscript arbeiten mit BoolItems

      Rev 1.82   19 Jan 1996 14:39:54   OS
   Cast fuer SvxLanguageItem nicht noetig

      Rev 1.81   20 Dec 1995 15:50:26   OS
   Status fuer Dropcaps gerichtet

      Rev 1.80   14 Dec 1995 17:25:52   OS
   Standard-Adjust auf LEFT

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/shells/txtcrsr.cxx b/sw/source/ui/shells/txtcrsr.cxx
new file mode 100644
index 0000000..3bf250f
--- /dev/null
+++ b/sw/source/ui/shells/txtcrsr.cxx
@@ -0,0 +1,412 @@
/*************************************************************************
 *
 *  $RCSfile: txtcrsr.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:47 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef __SBX_SBXVARIABLE_HXX //autogen
#include <svtools/sbxvar.hxx>
#endif
#ifndef _ARGS_HXX //autogen
#include <svtools/args.hxx>
#endif


#include "view.hxx"
#include "cmdid.h"
#include "wrtsh.hxx"
#include "globals.hrc"
#include "textsh.hxx"
#include "num.hxx"
#include "bookmrk.hxx"
#include "edtwin.hxx"
#include "globals.h"





void SwTextShell::ExecBasicMove(SfxRequest &rReq)
{
    SwWrtShell &rSh = GetShell();
    GetView().GetEditWin().FlushInBuffer( &rSh );

    USHORT nSlot = rReq.GetSlot();
    switch(nSlot)
    {
        case FN_CHAR_LEFT_SEL:
        case FN_CHAR_LEFT:  rSh.Left ( FN_CHAR_LEFT_SEL == nSlot, 1 ); break;
        case FN_CHAR_RIGHT_SEL:
        case FN_CHAR_RIGHT: rSh.Right( FN_CHAR_RIGHT_SEL == nSlot, 1 ); break;
        case FN_LINE_UP_SEL:
        case FN_LINE_UP:    rSh.Up   ( FN_LINE_UP_SEL == nSlot, 1 ); break;
        case FN_LINE_DOWN_SEL:
        case FN_LINE_DOWN:  rSh.Down ( FN_LINE_DOWN_SEL == nSlot, 1 ); break;
        default:            ASSERT(FALSE, falscher Dispatcher); return;
    }
}

void SwTextShell::ExecMove(SfxRequest &rReq)
{
    SwWrtShell &rSh = GetShell();
    GetView().GetEditWin().FlushInBuffer( &rSh );

    USHORT nSlot = rReq.GetSlot();
    BOOL bRet = FALSE;
    switch ( nSlot )
    {
        case FN_START_OF_LINE_SEL:
        case FN_START_OF_LINE:      bRet = rSh.LeftMargin ( FN_START_OF_LINE_SEL == nSlot );
        break;

        case FN_END_OF_LINE_SEL:
        case FN_END_OF_LINE:        bRet = rSh.RightMargin( FN_END_OF_LINE_SEL == nSlot );
        break;

        case FN_START_OF_DOCUMENT_SEL:
        case FN_START_OF_DOCUMENT:  bRet = rSh.SttDoc      ( FN_START_OF_DOCUMENT_SEL == nSlot);
        break;

        case FN_END_OF_DOCUMENT_SEL:
        case FN_END_OF_DOCUMENT:    bRet = rSh.EndDoc( FN_END_OF_DOCUMENT_SEL == nSlot );
        break;

        case FN_SELECT_WORD:            rSh.SelNearestWrd();    break;

        case SID_SELECTALL:             rSh.SelAll();           break;
        default:                    ASSERT(FALSE, falscher Dispatcher); return;
    }
}

void SwTextShell::ExecMovePage(SfxRequest &rReq)
{
    SwWrtShell &rSh = GetShell();
    GetView().GetEditWin().FlushInBuffer( &rSh );

    USHORT nSlot = rReq.GetSlot();
    switch( nSlot )
    {
        case FN_START_OF_NEXT_PAGE_SEL :
        case FN_START_OF_NEXT_PAGE: rSh.SttNxtPg( FN_START_OF_NEXT_PAGE_SEL == nSlot ); break;

        case FN_END_OF_NEXT_PAGE_SEL:
        case FN_END_OF_NEXT_PAGE:   rSh.EndNxtPg( FN_END_OF_NEXT_PAGE_SEL == nSlot ); break;

        case FN_START_OF_PREV_PAGE_SEL:
        case FN_START_OF_PREV_PAGE: rSh.SttPrvPg( FN_START_OF_PREV_PAGE_SEL == nSlot ); break;

        case FN_END_OF_PREV_PAGE_SEL:
        case FN_END_OF_PREV_PAGE:   rSh.EndPrvPg( FN_END_OF_PREV_PAGE_SEL == nSlot ); break;

        case FN_START_OF_PAGE_SEL:
        case FN_START_OF_PAGE:      rSh.SttPg   ( FN_START_OF_PAGE_SEL == nSlot ); break;

        case FN_END_OF_PAGE_SEL:
        case FN_END_OF_PAGE:        rSh.EndPg   ( FN_END_OF_PAGE_SEL == nSlot ); break;
        default:                    ASSERT(FALSE, falscher Dispatcher); return;
    }
}


void SwTextShell::ExecMoveCol(SfxRequest &rReq)
{
    SwWrtShell &rSh = GetShell();
    switch ( rReq.GetSlot() )
    {
        case FN_START_OF_COLUMN:      rSh.StartOfColumn    ( FALSE ); break;
        case FN_END_OF_COLUMN:        rSh.EndOfColumn      ( FALSE ); break;
        case FN_START_OF_NEXT_COLUMN: rSh.StartOfNextColumn( FALSE ) ; break;
        case FN_END_OF_NEXT_COLUMN:   rSh.EndOfNextColumn  ( FALSE ); break;
        case FN_START_OF_PREV_COLUMN: rSh.StartOfPrevColumn( FALSE ); break;
        case FN_END_OF_PREV_COLUMN:   rSh.EndOfPrevColumn  ( FALSE ); break;
        default:                      ASSERT(FALSE, falscher Dispatcher); return;
    }
}

void SwTextShell::ExecMoveLingu(SfxRequest &rReq)
{
    SwWrtShell &rSh = GetShell();
    GetView().GetEditWin().FlushInBuffer( GetShellPtr() );

    USHORT nSlot = rReq.GetSlot();
    BOOL bRet = FALSE;
    switch ( nSlot )
    {
        case FN_NEXT_WORD_SEL:
        case FN_NEXT_WORD:      bRet = rSh.NxtWrd( FN_NEXT_WORD_SEL == nSlot );
        break;

        case FN_START_OF_PARA_SEL:
        case FN_START_OF_PARA:  bRet = rSh.SttPara( FN_START_OF_PARA_SEL == nSlot );
        break;

        case FN_END_OF_PARA_SEL:
        case FN_END_OF_PARA:    bRet = rSh.EndPara( FN_END_OF_PARA_SEL == nSlot );
        break;

        case FN_PREV_WORD_SEL:
        case FN_PREV_WORD:      bRet = rSh.PrvWrd( FN_PREV_WORD_SEL == nSlot );
        break;

        case FN_NEXT_SENT_SEL:
        case FN_NEXT_SENT:      bRet = rSh.FwdSentence( FN_NEXT_SENT_SEL == nSlot );
        break;

        case FN_PREV_SENT_SEL:
        case FN_PREV_SENT:      bRet = rSh.BwdSentence( FN_PREV_SENT_SEL == nSlot );
        break;

        case FN_NEXT_PARA:      bRet = rSh.FwdPara    ( FALSE );
        break;

        case FN_PREV_PARA:      bRet = rSh.BwdPara    ( FALSE );
        break;
        default:                ASSERT(FALSE, falscher Dispatcher); return;
    }
}

void SwTextShell::ExecMoveMisc(SfxRequest &rReq)
{
    SwWrtShell &rSh = GetShell();
    USHORT nSlot = rReq.GetSlot();
    BOOL bSetRetVal = TRUE, bRet = TRUE;
    switch ( nSlot )
    {
        case FN_CNTNT_TO_NEXT_FRAME:
            bRet = rSh.GotoFlyTxt();
            break;
        case FN_NEXT_FOOTNOTE:
            rSh.MoveCrsr();
            bRet = rSh.GotoNextFtnAnchor();
            break;
        case FN_PREV_FOOTNOTE:
            rSh.MoveCrsr();
            bRet = rSh.GotoPrevFtnAnchor();
            break;
        case FN_TO_HEADER:
            rSh.MoveCrsr();
            if ( FRMTYPE_HEADER & rSh.GetFrmType(0,FALSE) )
                rSh.SttPg();
            else
                rSh.GotoHeaderTxt();
            bSetRetVal = FALSE;
            break;
        case FN_TO_FOOTER:
            rSh.MoveCrsr();
            if ( FRMTYPE_FOOTER & rSh.GetFrmType(0,FALSE) )
                rSh.EndPg();
            else
                rSh.GotoFooterTxt();
            bSetRetVal = FALSE;
            break;
        case FN_FOOTNOTE_TO_ANCHOR:
            rSh.MoveCrsr();
            if ( FRMTYPE_FOOTNOTE & rSh.GetFrmType(0,FALSE) )
                rSh.GotoFtnAnchor();
            else
                rSh.GotoFtnTxt();
            bSetRetVal = FALSE;
            break;
        case FN_PREV_TABLE:
            bRet = rSh.MoveTable( fnTablePrev, fnTableStart);
            break;
        case FN_NEXT_TABLE:
            bRet = rSh.MoveTable(fnTableNext, fnTableStart);
            break;
        case FN_GOTO_NEXT_REGION :
            bRet = rSh.MoveRegion(fnRegionNext, fnRegionStart);
        break;
        case FN_GOTO_PREV_REGION :
            bRet = rSh.MoveRegion(fnRegionPrev, fnRegionStart);
        break;

        case FN_NEXT_TOXMARK:
            bRet = rSh.GotoNxtPrvTOXMark( TRUE );
            break;
        case FN_PREV_TOXMARK:
            bRet = rSh.GotoNxtPrvTOXMark( FALSE );
            break;
        case FN_NEXT_TBLFML:
            bRet = rSh.GotoNxtPrvTblFormula( TRUE, FALSE );
            break;
        case FN_PREV_TBLFML:
            bRet = rSh.GotoNxtPrvTblFormula( FALSE, FALSE );
            break;
        case FN_NEXT_TBLFML_ERR:
            bRet = rSh.GotoNxtPrvTblFormula( TRUE, TRUE );
            break;
        case FN_PREV_TBLFML_ERR:
            bRet = rSh.GotoNxtPrvTblFormula( FALSE, TRUE );
            break;

        default:
            ASSERT(FALSE, falscher Dispatcher);
            return;
    }

    if( bSetRetVal )
        rReq.SetReturnValue(SfxBoolItem( nSlot, bRet ));

}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.47  2000/09/18 16:06:07  willem.vandorp
    OpenOffice header added.

    Revision 1.46  2000/05/26 07:21:33  os
    old SW Basic API Slots removed

    Revision 1.45  2000/05/09 14:41:35  os
    BASIC interface partially removed

    Revision 1.44  1999/04/26 11:06:12  KZ
    #include <svtools/args.hxx> eingefuegt


      Rev 1.43   26 Apr 1999 13:06:12   KZ
   #include <svtools/args.hxx> eingefuegt

      Rev 1.42   14 Jan 1999 15:50:26   JP
   Bug #60794#: Fehlererkennung beim Tabellenrechnen und anspringen von Formeln

      Rev 1.41   27 Nov 1998 14:56:08   AMA
   Fix #59951#59825#: Unterscheiden zwischen Rahmen-,Seiten- und Bereichsspalten

      Rev 1.40   17 Aug 1998 16:09:12   OS
   GPF nach Shellwechsel waehrend Recording #55041#

      Rev 1.39   12 Feb 1998 20:12:44   JP
   Left-/RightMargin: zus. Flag fuer BasicCall

      Rev 1.38   24 Nov 1997 09:47:54   MA
   includes

      Rev 1.37   03 Nov 1997 13:55:54   MA
   precomp entfernt

      Rev 1.36   04 Sep 1997 17:12:04   MA
   includes

      Rev 1.35   07 Apr 1997 17:48:12   MH
   chg: header

      Rev 1.34   06 Mar 1997 12:28:12   JP
   Left/Right/Up/Down: bei API-Calls in ReadOnly Docs normale verhalten

      Rev 1.33   23 Feb 1997 22:27:04   OS
   diverse Move-Slots mit BOOL - return

      Rev 1.32   20 Feb 1997 17:17:38   OS
   JumpToPrev/NextRegion

      Rev 1.31   07 Feb 1997 14:06:06   OS
   GoLeft/Right/Up/Down ueber for-Schleife aufrufen #35596#

      Rev 1.30   29 Aug 1996 11:40:04   OS
   Next/PrevFootnote liefern BOOL

      Rev 1.29   28 Aug 1996 15:54:56   OS
   includes

      Rev 1.28   13 Feb 1996 09:51:28   OS
   JumpToPrev/NextTable/Frame erhalten return type BOOL

      Rev 1.27   24 Jan 1996 15:18:36   OS
   Selection-Param ist Bool und nicht Int16, Bug #23549#

      Rev 1.26   24 Nov 1995 16:59:36   OM
   PCH->PRECOMPILED

      Rev 1.25   23 Nov 1995 19:52:02   OS
   +FN_SELECT_ALL fuer PM2, +Next/PrevPara

      Rev 1.24   10 Nov 1995 15:29:44   OS
   GotoVariable/Region an die Baseshell

      Rev 1.23   09 Nov 1995 17:59:54   OS
   neue Slots fuer Grosskunden

      Rev 1.22   23 Oct 1995 17:33:36   OS
   *_SEL auf * umgeappt

      Rev 1.21   22 Sep 1995 16:58:18   OS
   Schoenheitskorrektur: GetArgs() fuellt immer pArgs!

      Rev 1.20   18 Sep 1995 14:04:38   OS
   geht wieder mit PCH

      Rev 1.19   04 Sep 1995 14:13:08   HJS
   add: #include <sbx.hxx>

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/shells/txtnum.cxx b/sw/source/ui/shells/txtnum.cxx
new file mode 100644
index 0000000..7c22e28
--- /dev/null
+++ b/sw/source/ui/shells/txtnum.cxx
@@ -0,0 +1,439 @@
/*************************************************************************
 *
 *  $RCSfile: txtnum.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:47 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include <hintids.hxx>
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _SVX_NUMITEM_HXX //autogen
#include <svx/numitem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen wg. SvxBrushItem
#include <svx/brshitem.hxx>
#endif

#include "cmdid.h"
#include "wrtsh.hxx"
#include "view.hxx"
#include "viewopt.hxx"
#include "wdocsh.hxx"
#include "textsh.hxx"
#include "uiitems.hxx"
#include "num.hxx"

void SwTextShell::ExecEnterNum(SfxRequest &rReq)
{
    //wg. Aufzeichnung schon vor dem evtl. Shellwechsel
    switch(rReq.GetSlot())
    {
    case FN_NUM_NUMBERING_ON:
    {
        if(!GetShell().GetCurNumRule())
            GetShell().NumOn();
        else
            GetShell().DelNumRules();
    }
    break;
    case FN_NUMBER_BULLETS:
    {
        // per default TRUE, damit die Schleife im Dialog richtig arbeitet!
        BOOL bHasChild = TRUE;
        SfxItemSet aSet(GetPool(),
                SID_HTML_MODE, SID_HTML_MODE,
                SID_ATTR_NUMBERING_RULE, SID_PARAM_CUR_NUM_LEVEL,
                0 );
        SwDocShell* pDocSh = GetView().GetDocShell();
        BOOL bHtml = 0 != PTR_CAST(SwWebDocShell, pDocSh);
        const SwNumRule* pCurRule = GetShell().GetCurNumRule();
        if( pCurRule )
        {
            SvxNumRule aRule = pCurRule->MakeSvxNumRule();

            //convert type of linked bitmaps from SVX_NUM_BITMAP to (SVX_NUM_BITMAP|LINK_TOKEN)
            for(USHORT i = 0; i < aRule.GetLevelCount(); i++)
            {
                SvxNumberFormat aFmt(aRule.GetLevel(i));
                if(SVX_NUM_BITMAP == aFmt.GetNumType())
                {
                    const SvxBrushItem* pBrush = aFmt.GetBrush();
                    const String* pLinkStr;
                    if(pBrush &&
                        0 != (pLinkStr = pBrush->GetGraphicLink()) &&
                            pLinkStr->Len())
                        aFmt.SetNumType(SvxExtNumType(SVX_NUM_BITMAP|LINK_TOKEN));
                    aRule.SetLevel(i, aFmt, aRule.Get(i) != 0);
                }
            }
            if(bHtml)
                aRule.SetFeatureFlag(NUM_ENABLE_EMBEDDED_BMP, FALSE);

            aSet.Put(SvxNumBulletItem(aRule));
            USHORT nLevel = GetShell().GetNumLevel( &bHasChild ) & ~NO_NUMLEVEL;
            if( nLevel < MAXLEVEL )
            {
                nLevel = 1<<nLevel;
                aSet.Put( SfxUInt16Item( SID_PARAM_CUR_NUM_LEVEL, nLevel ));
            }
        }
        else
        {
            SwNumRule aRule( GetShell().GetUniqueNumRuleName() );
            SvxNumRule aSvxRule = aRule.MakeSvxNumRule();
            if(bHtml)
            {
                for( BYTE n = 1; n < MAXLEVEL; ++n )
                {
                    SvxNumberFormat aFmt( aSvxRule.GetLevel( n ) );
                    // 1/2" fuer HTML
                    aFmt.SetLSpace(720);
                    aFmt.SetAbsLSpace(n * 720);
                    aSvxRule.SetLevel( n, aFmt, FALSE );
                }
                aSvxRule.SetFeatureFlag(NUM_ENABLE_EMBEDDED_BMP, FALSE);
            }
            aSet.Put(SvxNumBulletItem(aSvxRule));
        }

        aSet.Put( SfxBoolItem( SID_PARAM_CHILD_LEVELS, bHasChild ));
        aSet.Put( SfxBoolItem( SID_PARAM_NUM_PRESET,FALSE ));

        // vor dem Dialog wird der HtmlMode an der DocShell versenkt
        pDocSh->PutItem(SfxUInt16Item(SID_HTML_MODE, ::GetHtmlMode(pDocSh)));

        SwSvxNumBulletTabDialog* pDlg = new SwSvxNumBulletTabDialog(
                            GetView().GetWindow(), &aSet, GetShell() );

        USHORT nRet = pDlg->Execute();
        if(RET_OK == nRet )
        {
            const SfxPoolItem* pItem;
            if( SFX_ITEM_SET == pDlg->GetOutputItemSet()->GetItemState(
                                    SID_ATTR_NUMBERING_RULE, FALSE, &pItem ))
            {
                SvxNumRule* pSetRule = ((SvxNumBulletItem*)pItem)->GetNumRule();
                pSetRule->UnLinkGraphics();
                SwNumRule aSetRule( pCurRule
                                        ? pCurRule->GetName()
                                        : GetShell().GetUniqueNumRuleName());
                aSetRule.SetSvxRule( *pSetRule, GetShell().GetDoc());
                aSetRule.SetAutoRule( TRUE );
                GetShell().SetCurNumRule( aSetRule );
            }
            // wenn der Dialog mit OK verlassen wurde, aber nichts ausgewaehlt
            // wurde dann muss die Numerierung zumindest eingeschaltet werden,
            // wenn sie das noch nicht ist
            else if( !pCurRule &&
                SFX_ITEM_SET == aSet.GetItemState(
                                    SID_ATTR_NUMBERING_RULE, FALSE, &pItem ))
            {
                SvxNumRule* pSetRule = ((SvxNumBulletItem*)pItem)->GetNumRule();
                SwNumRule aSetRule(GetShell().GetUniqueNumRuleName());
                aSetRule.SetSvxRule(*pSetRule, GetShell().GetDoc());
                aSetRule.SetAutoRule( TRUE );
                GetShell().SetCurNumRule( aSetRule );
            }
        }
        else if(RET_USER == nRet)
            GetShell().DelNumRules();

        delete pDlg;
/*
#else
        SfxItemSet aSet(GetPool(),
                SID_HTML_MODE, SID_HTML_MODE,
                FN_PARAM_ACT_NUMBER,    FN_PARAM_ACT_NUMBER,
                FN_PARAM_CHILD_LEVELS,  FN_PARAM_CHILD_LEVELS,
                FN_PARAM_NUM_PRESET,    FN_PARAM_NUM_PRESET,
                FN_PARAM_ACT_NUMLEVEL,  FN_PARAM_ACT_NUMLEVEL,
                0 );

        // per default TRUE, damit die Schleife im num.cxx richtig arbeitet!
        BOOL bHasChild = TRUE;
        const SwNumRule* pCurRule = GetShell().GetCurNumRule();
        if( pCurRule )
        {
            aSet.Put( SwUINumRuleItem( *pCurRule ));
            USHORT nLevel = GetShell().GetNumLevel( &bHasChild ) & ~NO_NUMLEVEL;
            if( nLevel < MAXLEVEL )
            {
                nLevel = 1<<nLevel;
                aSet.Put( SfxUInt16Item( FN_PARAM_ACT_NUMLEVEL, nLevel ));
            }
        }
        else
        {
            SwNumRule aRule( GetShell().GetUniqueNumRuleName() );
            SwDocShell* pDocSh = GetView().GetDocShell();
            BOOL bHtml = 0 != PTR_CAST(SwWebDocShell, pDocSh);
            for( BYTE n = 0; n < MAXLEVEL; ++n )
            {
                SwNumFmt aFmt( aRule.Get( n ) );
                if(bHtml && n)
                {
                    // 1/2" fuer HTML
                    aFmt.SetLSpace(720);
                    aFmt.SetAbsLSpace(n * 720);
                }
                aRule.Set( n, aFmt );
            }
            aSet.Put( SwUINumRuleItem( aRule ));
        }

        aSet.Put( SfxBoolItem( FN_PARAM_CHILD_LEVELS, bHasChild ));
        aSet.Put( SfxBoolItem( FN_PARAM_NUM_PRESET,FALSE ));

        SwNumBulletTabDialog* pDlg = new SwNumBulletTabDialog(
                            GetView().GetWindow(), &aSet, GetShell() );

        if(RET_OK == pDlg->Execute() )
        {
            const SfxPoolItem* pItem;
            if( SFX_ITEM_SET == pDlg->GetOutputItemSet()->GetItemState(
                                    FN_PARAM_ACT_NUMBER, FALSE, &pItem ))
            {
                SwNumRule* pSetRule = ((SwUINumRuleItem*)pItem)->GetNumRule();
                pSetRule->SetAutoRule( TRUE );
                GetShell().SetCurNumRule( *pSetRule );
            }
            else
                GetShell().DelNumRules();
        }

        delete pDlg;
#endif
*/
    }
    break;
    case FN_NUM_BULLET_ON:
    {
        if ( !GetShell().GetCurNumRule() )
            GetShell().BulletOn();
        else
            GetShell().DelNumRules();

    }
    break;
    default:
        ASSERT(FALSE,  falscher Dispatcher);
        return;
    }
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.45  2000/09/18 16:06:07  willem.vandorp
    OpenOffice header added.

    Revision 1.44  2000/05/30 12:35:15  os
    #74997# fill SvxNumRule with invalid levels

    Revision 1.43  2000/05/26 07:21:33  os
    old SW Basic API Slots removed

    Revision 1.42  2000/02/11 14:58:14  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.41  1999/08/19 14:25:46  OS
    #67374# embedded graphics in numberings


      Rev 1.40   19 Aug 1999 16:25:46   OS
   #67374# embedded graphics in numberings

      Rev 1.39   04 Jun 1999 13:50:58   OS
   #64956# keine vollst. Numerierungen im HTML

      Rev 1.38   15 Mar 1999 23:28:54   JP
   Task #63049#: Numerierung mit rel. Einzuegen

      Rev 1.37   06 Jan 1999 15:53:08   OS
   #58263# Numerierung bei OK ohne Aenderungen mindestens einschalten

      Rev 1.36   02 Dec 1998 09:38:54   OS
   #58263# Entfernen-Button fuer Numerierungen

      Rev 1.35   17 Nov 1998 10:59:00   OS
   #58263# Numerierungs-Tabseiten aus dem Svx

      Rev 1.34   10 Nov 1998 15:24:38   OS
   #59238# neue Defaults fuer HTML-Numerierung

      Rev 1.33   06 Nov 1998 14:42:12   OS
   #57903# NumOff kann weg

      Rev 1.32   03 Nov 1998 07:26:16   OS
   #58263# Numerierungsdialog in den Svx

      Rev 1.31   17 Aug 1998 16:09:10   OS
   GPF nach Shellwechsel waehrend Recording #55041#

      Rev 1.30   18 May 1998 12:13:46   OS
   Multiselektion im Numerierungsdialog

      Rev 1.29   24 Mar 1998 13:46:44   JP
   SwUINumRule: CTORen mit Name oder NumRule, nicht mehr mit NumRulePointer

      Rev 1.28   12 Mar 1998 13:08:08   OS
   Numerierungsbutton nicht mehr gecheckt und nicht disabled

      Rev 1.27   18 Feb 1998 19:58:44   JP
   wenn ueber den Dialog kommt, ist es immer eine AutoRule

      Rev 1.26   08 Dec 1997 16:08:06   OS
   benannte Numerierungen entfernt

      Rev 1.25   03 Dec 1997 17:31:38   OS
   Numerierung und Bullets ueber Button nur noch einschalten

      Rev 1.24   24 Nov 1997 09:47:56   MA
   includes

      Rev 1.23   17 Nov 1997 10:21:08   JP
   Umstellung Numerierung

      Rev 1.22   03 Nov 1997 13:55:44   MA
   precomp entfernt

      Rev 1.21   06 Aug 1997 11:07:54   MH
   chg: header

      Rev 1.20   26 Jun 1997 16:15:46   OS
   Numerierung per Controller anwenden

      Rev 1.19   05 Jun 1997 13:11:52   OS
   Num./Aufzaehlungsbuttons koennen Numerierung auch ausschalten

      Rev 1.18   30 May 1997 13:52:04   OS
   Preset fuer Numerierungsdialog

      Rev 1.17   07 Apr 1997 17:48:34   MH
   chg: header

      Rev 1.16   22 Feb 1997 20:52:26   OS
   ohne Numerierung muss bHasChild auf TRUE gesetzt werden, sonst kommt der Dialog durcheinander

      Rev 1.15   20 Feb 1997 17:19:04   OS
   Numerierung: Flag fuer benutzte Ebenen auswerten

      Rev 1.14   18 Feb 1997 08:54:12   OS
   Numerierungsdialog: auch den Return-Wert des ModalDialogs auswerten

      Rev 1.13   11 Feb 1997 11:53:32   OS
   ItemSet vor dem Dialog fuellen

      Rev 1.12   08 Feb 1997 18:00:34   OS
   NumRule loeschen, wenn kein Item kommt, aber RET_OK

      Rev 1.11   08 Feb 1997 16:01:54   OS
   Online-Layout->Print-Layout

      Rev 1.10   10 Oct 1996 13:18:26   OS
   ItemState immer pruefen

      Rev 1.9   28 Aug 1996 15:55:18   OS
   includes

      Rev 1.8   24 Nov 1995 16:59:32   OM
   PCH->PRECOMPILED

      Rev 1.7   28 Aug 1995 19:11:16   MA
   Renovierung: IDL, Shells, Textshell-Doktrin aufgegeben

      Rev 1.6   24 Aug 1995 14:33:38   MA
   swstddlg -> svxstandarddialog

      Rev 1.5   17 Feb 1995 14:20:56   MS
   Umstellung SwView

      Rev 1.4   18 Jan 1995 13:47:58   MS
   Precomp Hd

      Rev 1.3   18 Jan 1995 13:43:26   MS
   Precomp Hd

      Rev 1.2   25 Oct 1994 18:46:30   ER
   add: PCH

      Rev 1.1   06 Oct 1994 10:52:12   VB
   Segmentierung

      Rev 1.0   15 Sep 1994 15:54:16   VB
   Initial revision.

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/table/chartins.cxx b/sw/source/ui/table/chartins.cxx
new file mode 100644
index 0000000..b8ea2b0
--- /dev/null
+++ b/sw/source/ui/table/chartins.cxx
@@ -0,0 +1,609 @@
/*************************************************************************
 *
 *  $RCSfile: chartins.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:47 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#define _CHARTINS_CXX

#ifndef _SFXVIEWFRM_HXX //autogen
#include <sfx2/viewfrm.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SCHDLL0_HXX
#include <sch/schdll0.hxx>
#endif
#ifndef _SCH_DLL_HXX //autogen
#include <sch/schdll.hxx>
#endif
#ifndef _SCH_MEMCHRT_HXX
#include <sch/memchrt.hxx>
#endif

#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _CHARTINS_HXX
#include <chartins.hxx>
#endif
#ifndef _TABLEMGR_HXX
#include <tablemgr.hxx>
#endif
#ifndef _FRMFMT_HXX
#include <frmfmt.hxx>
#endif
#ifndef _SWTABLE_HXX
#include <swtable.hxx>
#endif
#ifndef _TBLSEL_HXX
#include <tblsel.hxx>
#endif

#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _CHARTINS_HRC
#include <chartins.hrc>
#endif




SFX_IMPL_MODELESSDIALOG( SwInsertChartChild, SID_INSERT_DIAGRAM )


/*------------------------------------------------------------------------
    Beschreibung: AutoPilot fuer StarChart
------------------------------------------------------------------------*/


SwInsertChartDlg::SwInsertChartDlg( SfxBindings* pBindings,
                                    SfxChildWindow* pChild,
                                    Window *pParent,
                                    SwWrtShell* pSh ) :
    SfxModelessDialog( pBindings, pChild, pParent, SW_RES(DLG_INSERT_CHART) ),
    aTextFt     (this, SW_RES(FT_TEXT    )),
    aRangeEd    (this, SW_RES(ED_RANGE   )),
    aRangeFt    (this, SW_RES(FT_RANGE    )),
    aFinish     (this, SW_RES(BT_FINISH   )),
    aHelp       (this, SW_RES(BT_HELP     )),
    aCancel     (this, SW_RES(BT_CANCEL   )),
    aHLine      (this, SW_RES(FT_HORZLINE )),
    aPrev       (this, SW_RES(BT_PREV    )),
    aNext       (this, SW_RES(BT_NEXT    )),
    aFirstRow   (this, SW_RES(CB_FIRST_ROW)),
    aFirstCol   (this, SW_RES(CB_FIRST_COL)),
    aGroup1     (this, SW_RES(GB_1       )),
    pChartDlg(0),
    pWrtShell(pSh),
    pInItemSet(0),
    pOutItemSet(0),
    pChartData(0),
    bUpdateChartData(TRUE),
    bChartInserted(FALSE)
{
    FreeResource();
    pSh->Push();

    aRangeEd.   SetModifyHdl(LINK(this, SwInsertChartDlg, ModifyHdl));
    aNext.      SetClickHdl(LINK(this,  SwInsertChartDlg, NextHdl));
    aFinish.    SetClickHdl(LINK(this,  SwInsertChartDlg, FinishHdl));
    aCancel.    SetClickHdl(LINK(this,  SwInsertChartDlg, CloseHdl));
    aFirstRow.  SetClickHdl(LINK(this,  SwInsertChartDlg, ClickHdl));
    aFirstCol.  SetClickHdl(LINK(this,  SwInsertChartDlg, ClickHdl));

    if( pWrtShell->IsCrsrInTbl() )
    {
        SwFrmFmt* pTblFmt = pWrtShell->GetTableFmt();
        aAktTableName = pTblFmt->GetName();
        if( !pWrtShell->IsTableMode() )
        {
            pWrtShell->GetView().GetViewFrame()->GetDispatcher()->
                    Execute(FN_TABLE_SELECT_ALL, SFX_CALLMODE_SYNCHRON);
        }

        pWrtShell->UpdateChartData( aAktTableName, pChartData );

        String sText( String::CreateFromAscii("<.>") );
        sText.Insert( pWrtShell->GetBoxNms(), 2);
        sText.Insert( aAktTableName, 1 );
        if(sText.GetTokenCount(':') == 2)
            aRangeEd.SetText(sText);

        ModifyHdl( &aRangeEd );
    }
    pInItemSet =  new SfxItemSet( pWrtShell->GetAttrPool(),
                                            CHATTR_START, CHATTR_END, 0 );
    pOutItemSet =  new SfxItemSet( pWrtShell->GetAttrPool(),
                                            CHATTR_START, CHATTR_END, 0 );
    SFX_APP()->LockDispatcher(TRUE);
    pWrtShell->SelTblCells( LINK( this, SwInsertChartDlg,
                                            SelTblCellsNotify) );
}

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/


__EXPORT SwInsertChartDlg::~SwInsertChartDlg()
{
    SfxApplication* pSfxApp = SFX_APP();
    if(pSfxApp->IsDispatcherLocked())
        pSfxApp->LockDispatcher(FALSE);
    pWrtShell->EndSelTblCells();
    pWrtShell->Pop(bChartInserted);
    delete pInItemSet;
    delete pOutItemSet;
    delete pChartDlg;
    delete pChartData;
}

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/


BOOL SwInsertChartDlg::Close()
{
    SFX_APP()->LockDispatcher(FALSE);
    return SfxModelessDialog::Close();
}

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

//OS: WNTMSCI4 optimiert sonst SetPosPixel und Hide weg!
#pragma optimize("",off)


IMPL_LINK( SwInsertChartDlg, NextHdl, Button *, pBtn )
{

    if ( bUpdateChartData )
        UpdateData();

    if(!pChartDlg)
    {
        pChartDlg = SchDLL::CreateAutoPilotDlg( this,   pChartData,
                                     *pInItemSet, *pOutItemSet, TRUE);
    }
    else if(bUpdateChartData)
    {
        SchDLL::ChangeChartData(pChartDlg,
                            pChartData);
    }
    bUpdateChartData = FALSE;
    pChartDlg->SetPosPixel(GetPosPixel());
    SfxViewFrame* pVFrame = pWrtShell->GetView().GetViewFrame();
    pVFrame->ShowChildWindow(SID_INSERT_DIAGRAM, FALSE);
    USHORT nResult = pChartDlg->Execute();
    switch( nResult )
    {
        case RET_OK:
            FinishHdl( &aFinish );
        break;
        case RET_CANCEL:
            SetPosPixel(pChartDlg->GetPosPixel());
            Close();
        break;
        default:
            SetPosPixel(pChartDlg->GetPosPixel());
            pVFrame->ShowChildWindow(SID_INSERT_DIAGRAM, TRUE);
        break;
    }
    return 0;
}

#pragma optimize("",on)

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/


IMPL_LINK( SwInsertChartDlg, FinishHdl, Button *, EMPTYARG )
{
    pWrtShell->GotoTable(aAktTableName);
    pWrtShell->GetView().GetViewFrame()->ToTop();
    SwWrtShell* pShell = pWrtShell; // Member auf den Stack wg. Close()
    SfxItemSet* pOutSet = pOutItemSet;
    pOutItemSet = 0;
    bChartInserted = TRUE;
    BOOL bCrsrInTbl = pShell->IsCrsrInTbl() != 0;
    BOOL bTblCplx = pShell->IsTblComplexForChart();
    if( bCrsrInTbl && !bTblCplx && bUpdateChartData )
        UpdateData();
    SchMemChart *pChData = pChartData; // Member auf den Stack wg. Close() -> aber erst nach UpdateData()
    pChartData = 0;

    Close();

    if( bCrsrInTbl && !bTblCplx )
    {
        SwTableFUNC( pShell, FALSE ).InsertChart( *pChData, pOutSet );
    }
    else
    {
        pShell->Insert( 0, SCH_MOD()->pSchChartDocShellFactory, FALSE );
    }
    delete pOutSet;
    delete pChData;
    return 0;
}

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/


IMPL_LINK( SwInsertChartDlg, ClickHdl, CheckBox *, EMPTYARG )
{
    bUpdateChartData = TRUE;
    return 0;
}

/*------------------------------------------------------------------------
    Beschreibung: Handler fuer die Tabellenselektion
------------------------------------------------------------------------*/

IMPL_LINK( SwInsertChartDlg, SelTblCellsNotify, SwWrtShell *, pCaller )
{
    SwFrmFmt* pTblFmt = pCaller->GetTableFmt();
    SwTable* pTbl = 0;
    if(pTblFmt)
    {
        SwClientIter aIter(*pTblFmt);
        pTbl = (SwTable*)aIter.First(TYPE(SwTable));
        DBG_ASSERT(pTbl, "keine Tabelle gefunden")
    }
    if( pTbl && !pCaller->IsTblComplexForChart() )
    {
        String sCommand = String::CreateFromAscii("<.>");
        sCommand.Insert(pCaller->GetBoxNms(),2);
        aAktTableName = pTblFmt->GetName();
        sCommand.Insert(pTblFmt->GetName(), 1);
        aRangeEd.SetText(sCommand);
    }
    else
    {
        aRangeEd.SetText(aEmptyStr);
    }
    ModifyHdl( &aRangeEd );
    return 0;
}

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

IMPL_LINK( SwInsertChartDlg, CloseHdl, Button*, EMPTYARG )
{
    Close();
    return 0;
}

/*------------------------------------------------------------------------
    Beschreibung: Handler fuer Edit
------------------------------------------------------------------------*/

IMPL_LINK( SwInsertChartDlg, ModifyHdl, Edit*, pEdit )
{
//  hier muss getestet werden, ob mit dem aktuellen Eintrag eine
//  gueltige Selektion einer Tabelle aufgebaut werden kann

    BOOL bCorrect = FALSE;
    BOOL bFinish = FALSE;
    BOOL bChkFirstRow = TRUE, bChkFirstCol = TRUE;

    String sContent = pEdit->GetText();
    if( !sContent.Len() )
    {
        bCorrect = pWrtShell->IsCrsrInTbl() != 0;
        aAktTableName = sContent;
        bFinish = TRUE;
    }
    else if( sContent.GetChar( 0 ) == '<'   &&
        sContent.GetTokenCount(':') == 2    &&
        sContent.GetChar( sContent.Len() - 1 ) == '>')
    {
        USHORT nFndPos = sContent.Search( '.' );
        String aTable( sContent.Copy( 1, nFndPos - 1 ));
        SwFrmFmt* pFmt = pWrtShell->GetTableFmt();
        if( ( pFmt && pFmt->GetName() == aTable ) ||
            pWrtShell->GotoTable( aTable ) )
        {
            aAktTableName = aTable;

            sContent.Erase( 0, nFndPos + 1 );
            sContent.Erase( sContent.Len() - 1 );

            SwTable* pTable = SwTable::FindTable( pWrtShell->GetTableFmt() );
            SwChartLines aLines;
            if( !pTable->IsTblComplexForChart( sContent, &aLines ))
            {
                bChkFirstCol = 1 < aLines[ 0 ]->Count();
                bChkFirstRow = 1 < aLines.Count();

                bFinish = bCorrect = TRUE;
            }
        }
    }

    aNext.Enable( bCorrect );
    aFinish.Enable( bFinish );

    if( bChkFirstRow != aFirstRow.IsEnabled() )
    {
        if( bChkFirstRow )
            aFirstRow.Check( aFirstRow.GetSavedValue() );
        else
        {
            aFirstRow.SaveValue();
            aFirstRow.Check( FALSE );
        }

        aFirstRow.Enable( bChkFirstRow );
    }

    if( bChkFirstCol != aFirstCol.IsEnabled() )
    {
        if( bChkFirstCol )
            aFirstCol.Check( aFirstCol.GetSavedValue() );
        else
        {
            aFirstCol.SaveValue();
            aFirstCol.Check( FALSE );
        }

        aFirstCol.Enable( bChkFirstCol );
    }

    bUpdateChartData = TRUE;
    return 0;
}


void SwInsertChartDlg::UpdateData()
{
    if( !pChartData )
        pWrtShell->UpdateChartData( aAktTableName, pChartData );

    if( pChartData )
    {
        String aData = aFirstRow.IsChecked() ? '1' : '0';
        aData += aFirstCol.IsChecked() ? '1': '0';
        pChartData->SomeData2() = aData;
        aData = aRangeEd.GetText();
        aData.Erase(1, aAktTableName.Len() +1 );
        pChartData->SomeData1() = aData;
        pWrtShell->UpdateChartData( aAktTableName, pChartData );
    }
}


/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/


SwInsertChartChild::SwInsertChartChild(Window* pParent,
                        USHORT nId,
                        SfxBindings* pBindings,
                        SfxChildWinInfo* pInfo ) :
                        SfxChildWindow( pParent, nId )
{

    SwView *pView = ::GetActiveView();
    SwWrtShell &rSh = pView->GetWrtShell();

    pWindow = new SwInsertChartDlg( pBindings, this, pParent, &rSh );
    pWindow->SetPosPixel(pInfo->aPos);
    pWindow->Show();

}


void __EXPORT AutoEdit::KeyInput( const KeyEvent& rEvt )
{
    USHORT nCode = rEvt.GetKeyCode().GetCode();
    if( nCode != KEY_SPACE )
        Edit::KeyInput( rEvt );
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.50  2000/09/18 16:06:07  willem.vandorp
    OpenOffice header added.

    Revision 1.49  2000/09/11 06:52:45  os
    Get/Set/Has/ToggleChildWindow SfxApplication -> SfxViewFrame

    Revision 1.48  2000/09/07 15:59:31  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.47  2000/04/26 14:59:03  os
    GetName() returns const String&

    Revision 1.46  2000/04/19 11:22:11  os
    UNICODE

    Revision 1.45  2000/03/09 21:54:45  jp
    Changes: SchMemChart in new headerfile

    Revision 1.44  2000/02/11 14:58:21  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.43  1999/02/09 13:31:16  JP
    Task #61632#: Charts auch in complexen Tabellen zulassen


      Rev 1.42   09 Feb 1999 14:31:16   JP
   Task #61632#: Charts auch in complexen Tabellen zulassen

      Rev 1.41   29 Oct 1998 11:35:34   JP
   Bug #58509#: im ModifyHdl die FirstRow/-Col Buttons ggfs. disablen

      Rev 1.40   28 Oct 1998 19:34:34   JP
   Bug #58509#: Button FirstRow/-Col ggfs. disablen

      Rev 1.39   16 Mar 1998 13:55:08   MA
   #48288# ohne Data leben

      Rev 1.38   29 Nov 1997 14:28:12   MA
   includes

      Rev 1.37   24 Nov 1997 15:52:20   MA
   includes

      Rev 1.36   09 Sep 1997 11:39:16   OS
   define fuer .hxx

      Rev 1.35   01 Sep 1997 13:17:26   OS
   DLL-Umstellung

      Rev 1.34   08 Aug 1997 17:37:36   OM
   Headerfile-Umstellung

      Rev 1.33   09 Jul 1997 17:39:18   HJS
   includes

      Rev 1.32   08 Apr 1997 10:32:30   MA
   includes

      Rev 1.31   07 Apr 1997 16:54:14   OS
   FinishHdl: pChartData erst nach UpdateData umkopieren

      Rev 1.30   24 Nov 1996 14:59:48   WP
   SvGlobalNames beseitigt

      Rev 1.29   11 Nov 1996 11:20:06   MA
   ResMgr

      Rev 1.28   05 Nov 1996 13:48:20   OS
   im FinishHdl wird der ViewFrame 'getoppt'

      Rev 1.27   24 Oct 1996 14:17:12   JP
   AutoEdit:KeyInput aus AutoCorr.cxx hierher verschoben

      Rev 1.26   24 Oct 1996 13:36:42   JP
   String Umstellung: [] -> GetChar()

      Rev 1.25   02 Oct 1996 19:06:08   MA
   Umstellung Enable/Disable

      Rev 1.24   28 Aug 1996 14:33:14   OS
   includes

      Rev 1.23   23 Aug 1996 14:37:14   OS
   FinishHdl: nach dem Close keine Member benutzen

      Rev 1.22   22 Aug 1996 12:40:44   OS
   Close im FinishHdl vor dem Einfuegen des Charts rufen

      Rev 1.21   20 Aug 1996 11:34:00   OS
   Dialog nicht mit Show/Hide, sondern mit ShowChildWindow anzeigen/verstecken

      Rev 1.20   29 Jul 1996 13:07:04   OS
   doch wieder mit Close()

      Rev 1.19   25 Jul 1996 15:36:12   OS
   kein Close()

      Rev 1.18   26 Jun 1996 15:25:20   OS
   Aufruf von Dispatcher.Execute an 324 angepasst

      Rev 1.17   11 Jun 1996 13:42:32   OS
   alten Cursor nur zurueckholen, wenn Chart nicht eingefuegt wurde

      Rev 1.16   10 Jun 1996 20:40:10   MA
   fix: IsTblComplexForChart

      Rev 1.15   06 Jun 1996 15:53:18   OS
   keine Tabellenselektion in komplexen Tabellen

      Rev 1.14   30 Apr 1996 16:29:44   MA
   fix: ggf. ein Update beim Fertigstellen

------------------------------------------------------------------------*/




diff --git a/sw/source/ui/table/chartins.hrc b/sw/source/ui/table/chartins.hrc
new file mode 100644
index 0000000..f83c07c
--- /dev/null
+++ b/sw/source/ui/table/chartins.hrc
@@ -0,0 +1,81 @@
/*************************************************************************
 *
 *  $RCSfile: chartins.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:47 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _CHARTINS_HRC
#define _CHARTINS_HRC

#include "rcid.hrc"
#include "table.hrc"

#define ED_RANGE        1
#define FT_RANGE                2
#define BT_NEXT         3
#define BT_FINISH               4
#define BT_HELP                 5
#define BT_CANCEL               6
#define CB_FIRST_ROW        7
#define CB_FIRST_COL            8
#define BT_PREV                 9
#define FT_HORZLINE     10
#define FT_TEXT                 11
#define GB_1            12

#endif
diff --git a/sw/source/ui/table/chartins.src b/sw/source/ui/table/chartins.src
new file mode 100644
index 0000000..da4ee97
--- /dev/null
+++ b/sw/source/ui/table/chartins.src
@@ -0,0 +1,349 @@
/*************************************************************************
 *
 *  $RCSfile: chartins.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:47 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
/* StarView ressource file */

#include "chartins.hrc"
#include "helpid.h"
ModelessDialog DLG_INSERT_CHART
{
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 297 , 169 ) ;
    Moveable = TRUE ;
    HelpID = HID_INSERT_CHART ;
    Hide = TRUE ;
    Text = "Autoformat Diagramm (1-4)" ;
    Text [ ENGLISH ] = "Autoformat Chart (1-4)" ;
    Text [ ENGLISH_US ] = "AutoFormat Chart (1-4)" ;
    FixedText FT_TEXT
    {
        Pos = MAP_APPFONT ( 6 , 6 ) ;
        Size = MAP_APPFONT ( 285 , 49 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? Falls die markierten Zellen nicht die gewünschten Daten enthalten, markieren Sie jetzt den Bereich.\n\nBeziehen Sie die Zellen mit Spalten- bzw. Zeilenbezeichnern mit ein, wenn Sie diese in Ihrer Grafik dargestellt haben möchten : Falls die markierten Zellen nicht die gew³nschten Daten enthalten, markieren Sie jetzt den Bereich.\n\nBeziehen Sie die Zellen mit Spalten- bzw. Zeilenbezeichnern mit ein, wenn Sie diese in Ihrer Grafik dargestellt haben m÷chten */
        Text = "Falls die markierten Zellen nicht die gewünschten Daten enthalten, markieren Sie jetzt den Bereich.\n\nBeziehen Sie die Zellen mit Spalten- bzw. Zeilenbezeichnern mit ein, wenn Sie diese in Ihrer Grafik dargestellt haben möchten" ;
        Text [ ENGLISH ] =
        "If the marked area does not represent the desired data, mark your data now.\nInclude the cells containing the column- and row identifier in case you want them to be included in your chart." ;
        Text [ ENGLISH_US ] = "If the marked cells do not represent the desired data, mark the area now.\nInclude the cells containing the column and row labels if you want them to be included in your chart." ;
        WordBreak = TRUE ;
        Text [ italian ] = "Se le celle evidenziate non contengono i dati voluti, selezionate l'area.\n\nIncludete le celle contenenti i titoli delle colonne e delle righe se volete che compaiano nel diagramma." ;
        Text [ spanish ] = "En caso de que las celdas marcadas no contengan los datos deseados, marque ahora el área.\n\nIncluya las celdas con  los nombres de las columnas y filas si desea que estas aparezcan en su gráfico." ;
        Text [ french ] = "Si les cellules marquées ne contiennent pas les données souhaitées, sélectionnez à présent la plage. \n\nIncluez les cellules avec les intitulés de colonnes et de lignes pour les faire figurer dans le diagramme." ;
        Text [ dutch ] = "Als de gemarkeerde cellen niet de gewenste gegevens bevatten markeert u nu het bereik.\n\nMarkeer eveneens de cellen met de kolom- resp. rijlabels als u deze in uw afbeelding wilt weergeven." ;
        Text [ swedish ] = "Om de markerade cellerna inte innehåller de önskade data, markera då området nu.\n\nTa med de celler som innehåller kolumn- och radöverskrifter om dessa skall visas i grafiken." ;
        Text [ danish ] = "Hvis de markerede celler ikke indeholder de ønskede data, marker det ønskede område nu.\n\nInkluder cellerne med kolonne- hhv.rækkeetiketter, hvis de skal vises i din grafik." ;
        Text [ portuguese_brazilian ] = "Falls die markierten Zellen nicht die gewünschten Daten enthalten, markieren Sie jetzt den Bereich.\n\nBeziehen Sie die Zellen mit Spalten- bzw. Zeilenbezeichnern mit ein, wenn Sie diese in Ihrer Grafik dargestellt haben möchten" ;
        Text [ portuguese ] = "Se as células marcadas não incluírem os dados desejados, marque-os agora.\n\nInclua as células contendo os títulos das colunas e linhas se desejar vê-las representadas no seu gráfico." ;
        Text[ chinese_simplified ] = "Èç¹ûÑ¡Öеĵ¥Ôª¸ñûÓÐÊý¾Ý£¬ÄÇôÇëÄúÑ¡ÔñÇøÓò¡£\n\nÄú¿ÉÒÔҲѡÖÐÁбêÌâºÍÐбêÌ⣬Èç´ËÕâЩ×ÊÁÏÒ²»á±»ÏÔʾÔÚͼ±íÄÚ¡£";
        Text[ russian ] = "Åñëè îòìå÷åííûå ÿ÷åéêè íå ñîäåðæàò æåëàåìûõ äàííûõ, âûäåëèòå ñåé÷àñ ýòó îáëàñòü.\n\nÂêëþ÷èòå òàêæå ÿ÷åéêè ñ ïîìåòêàìè ñòîëáöîâ èëè ñòðîê, åñëè Âû õîòèòå èõ ïðåäñòàâèòü íà Âàøåì ðèñóíêå.";
        Text[ polish ] = "Jeœli zaznaczone komórki nie zawieraj¹ potrzebnych danych, zaznacz teraz ten obszar ponownie.\n\nZaznacz równie¿ komórki z etykietami wierszy lub kolumn , jeœli maj¹ one zostaæ przedstawione w twojej grafice.";
        Text[ japanese ] = "•K—v‚ÈÃÞ°À‚ªŠÜ‚Ü‚ê‚Ä‚¢‚é¾Ù‚ª‚Ü‚¾‘I‘ð‚³‚ê‚Ä‚¢‚È‚¢ê‡‚́A¡‚»‚͈̔͂ð‘I‘ð‚µ‚Ä‰º‚³‚¢B\n\n¸Þ×̂ɍ€–Ú–¼‚ð•\\ަ‚·‚邽‚߂ɂ́As‚Æ—ñ‚̍€–Ú—“‚ðŠÜ‚ß‚½¾Ù”͈͂ð“ü—Í‚µ‚ĉº‚³‚¢B";
        Text[ chinese_traditional ] = "¦pªG¿ï¨úªºÀx¦s®æ¨S¦³¸ê®Æ¡M´N½Ð±z¿ï¾Ü°Ï°ì¡C\n\n±z¥i¥H¿ï¤¤¦C¼ÐÃD©M¦æ¼ÐÃD¡A³o¼Ë¡A¹Ïªí¤]·|Åã¥Ü¥X³o¨Ç¸ê®Æ¡C";
        Text[ arabic ] = "ÅÐÇ ßÇäÊ ÇáÎáÇíÇ ÇáãÍÏÏÉ áÇ ÊÍÊæí Úáì ÇáÈíÇäÇÊ ÇáãØáæÈÉ¡ Þã ÈÊÍÏíÏ ÇáäØÇÞ\n\nÈãÇ Ýí Ðáß ÇáÎáÇíÇ¡ ÇáÊí ÊÍÊæí Úáì ÚäÇæíä ÕÝæÝ Ãæ ÃÚãÏÉ¡ æÐáß ÅÐÇ ßäÊ ÊÑíÏ ÙåæÑåÇ Ýí ÑÓãÊß.";
        Text[ dutch ] = "Als de gemarkeerde cellen niet de gewenste gegevens bevatten markeert u nu het bereik.\n\nMarkeer eveneens de cellen met de kolom- resp. rijlabels als u deze in uw afbeelding wilt weergeven.";
        Text[ chinese_simplified ] = "Èç¹ûÑ¡Öеĵ¥Ôª¸ñûÓÐÊý¾Ý£¬ÄÇôÇëÄúÑ¡ÔñÇøÓò¡£\n\nÄú¿ÉÒÔҲѡÖÐÁбêÌâºÍÐбêÌ⣬Èç´ËÕâЩ×ÊÁÏÒ²»á±»ÏÔʾÔÚͼ±íÄÚ¡£";
        Text[ greek ] = "Áí ôá åðéëåãìÝíá êåëéÜ äåí ðåñéÝ÷ïõí ôá äåäïìÝíá ðïõ åðéèõìåßôå, åðéëÝîôå ôçí ðåñéï÷Þ ôþñá. Áí èÝëåôå\n\níá åìöáíéóôïýí óôï ãñáöéêü óáò êáé ïé åðéãñáöÝò óôçëþí êáé ãñáììþí, ôüôå åðéëÝîôå êáé áõôÜ ôá äåäïìÝíá.";
        Text[ korean ] = "¼±ÅÃÇ¥½ÃµÈ ¼¿ÀÌ ¿øÇÏ´Â µ¥ÀÌÅ͸¦ Æ÷ÇÔÇϰí ÀÖÁö ¾ÊÀ» °æ¿ì, Áö±Ý ¿µ¿ªÀ» Ç¥½ÃÇϽʽÿÀ. \n\n¿­ ³»Áö Çà ¶óº§À» Áö´Ñ ¼¿µéÀ» ±×·¡ÇÈ¿¡ ³ªÅ¸³»°í ½ÍÀ¸¸é ÀÌ ¼¿µéÀ» ÇÔ²² Æ÷ÇÔ½ÃŰ½Ê½Ã¿À.";
        Text[ turkish ] = "Seçilen hücreler, istenen verileri içermiyorsa aralýðý þimdi seçin.\n\nGrafikte görünmelerini istiyorsanýz, sütun ya da satýr baþlýklarýný içeren hücreleri de seçin";
    };
    FixedText FT_RANGE
    {
        Pos = MAP_APPFONT ( 12 , 69 ) ;
        Size = MAP_APPFONT ( 38 , 10 ) ;
        Text = "~Bereich" ;
        Text [ ENGLISH ] = "~Area" ;
        Text [ ENGLISH_US ] = "~Area" ;
        Text [ italian ] = "Area" ;
        Text [ spanish ] = "~Área" ;
        Text [ french ] = "C~atégorie" ;
        Text [ dutch ] = "~Bereik" ;
        Text [ swedish ] = "~Område" ;
        Text [ danish ] = "Område" ;
        Text [ portuguese_brazilian ] = "~Bereich" ;
        Text [ portuguese ] = "~Área" ;
        Text[ chinese_simplified ] = "ÇøÓò(~A)";
        Text[ russian ] = "Îáëàñòü";
        Text[ polish ] = "Obszar";
        Text[ japanese ] = "”͈Í(~A)";
        Text[ chinese_traditional ] = "°Ï°ì(~A)";
        Text[ arabic ] = "ÇáäØÇÞ";
        Text[ dutch ] = "~Bereik";
        Text[ chinese_simplified ] = "ÇøÓò(~A)";
        Text[ greek ] = "Ðåñéï÷Þ";
        Text[ korean ] = "¿µ¿ª(~A)";
        Text[ turkish ] = "~Aralýk";
    };
    Edit ED_RANGE
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 56 , 68 ) ;
        Size = MAP_APPFONT ( 229 , 12 ) ;
    };
    CheckBox CB_FIRST_ROW
    {
        Pos = MAP_APPFONT ( 12 , 86 ) ;
        Size = MAP_APPFONT ( 150 , 12 ) ;
        TabStop = TRUE ;
        Text = "Erste ~Zeile als Beschriftung" ;
        Text [ ENGLISH ] = "First ~row as label" ;
        Text [ ENGLISH_US ] = "~First row as caption" ;
        Check = TRUE ;
        Text [ italian ] = "Prima riga come dicitura" ;
        Text [ spanish ] = "Primera ~fila como etiqueta" ;
        Text [ french ] = "Première ~ligne comme étiquette" ;
        Text [ dutch ] = "Eerste ~rij als kop" ;
        Text [ swedish ] = "Första ~raden som etikett" ;
        Text [ danish ] = "Første række som etiket" ;
        Text [ portuguese_brazilian ] = "Erste ~Reihe als Beschriftung" ;
        Text [ portuguese ] = "Primeira ~linha como etiqueta" ;
        Text[ chinese_simplified ] = "µÚÒ»ÐÐ×÷Ϊ±êÌâ(~R)";
        Text[ russian ] = "Ïåðâàÿ ñòðîêà êàê íàçâàíèå";
        Text[ polish ] = "Pierwszy wiersz jako etykieta";
        Text[ japanese ] = "Œ©o‚µ‚Æ‚µ‚Ă̍ŏ‰‚̍s(~Rj";
        Text[ chinese_traditional ] = "²Ä¤@¦æ§@¬°¼ÐÃD(~R)";
        Text[ arabic ] = "ÇáÕÝ ÇáÃæá ßÚäæÇä";
        Text[ dutch ] = "Eerste ~rij als kop";
        Text[ chinese_simplified ] = "µÚÒ»ÐÐ×÷Ϊ±êÌâ(~R)";
        Text[ greek ] = "Ðñþôç ãñáììÞ ùò åðéãñáöÞ";
        Text[ korean ] = "ù¹øÂ° ÇàÀ» ĸ¼ÇÀ¸·Î(~F)";
        Text[ turkish ] = "Baþlýklar ~birinci satýrda";
    };
    CheckBox CB_FIRST_COL
    {
        Pos = MAP_APPFONT ( 12 , 102 ) ;
        Size = MAP_APPFONT ( 150 , 12 ) ;
        TabStop = TRUE ;
        Text = "Erste ~Spalte als Beschriftung" ;
        Text [ ENGLISH ] = "First ~column as label" ;
        Text [ ENGLISH_US ] = "First ~column as caption" ;
        Check = TRUE ;
        Text [ italian ] = "Prima colonna come dicitura" ;
        Text [ spanish ] = "Primera c~olumna como etiqueta" ;
        Text [ french ] = "Première ~colonne comme étiquette" ;
        Text [ dutch ] = "Eerste ~kolom als kop" ;
        Text [ swedish ] = "Första kolumnen ~som etikett" ;
        Text [ danish ] = "Første kolonne som etiket" ;
        Text [ portuguese_brazilian ] = "Erste ~Spalte als Beschriftung" ;
        Text [ portuguese ] = "Primeira ~coluna como etiqueta" ;
        Text[ chinese_simplified ] = "µÚÒ»ÁÐ×÷Ϊ±êÌâ(~C)";
        Text[ russian ] = "Ïåðâûé ñòîëáåö êàê íàçâàíèå";
        Text[ polish ] = "Pierwsza kolumna jako etykieta";
        Text[ japanese ] = "Œ©o‚µ‚Æ‚µ‚Ă̍ŏ‰‚Ì—ñ(~C)";
        Text[ chinese_traditional ] = "²Ä¤@Äæ·í§@¼ÐÃD(~C)";
        Text[ arabic ] = "ÇáÚãæÏ ÇáÃæá ßÚäæÇä";
        Text[ dutch ] = "Eerste ~kolom als kop";
        Text[ chinese_simplified ] = "µÚÒ»ÁÐ×÷Ϊ±êÌâ(~C)";
        Text[ greek ] = "Ðñþôç óôÞëç ùò åðéãñáöÞ";
        Text[ korean ] = "ù¹øÂ° ¿­À» ĸ¼ÇÀ¸·Î(~C)";
        Text[ turkish ] = "Baþlýklar ~birinci sütunda";
    };
    GroupBox GB_1
    {
        Pos = MAP_APPFONT ( 6 , 56 ) ;
        Size = MAP_APPFONT ( 285 , 65 ) ;
        Text = "Auswahl" ;
        Text [ English ] = "Selection" ;
        Text [ english_us ] = "Selection" ;
        Text [ italian ] = "Selezione" ;
        Text [ spanish ] = "Selección" ;
        Text [ french ] = "Sélection" ;
        Text [ dutch ] = "Selectie" ;
        Text [ swedish ] = "Urval" ;
        Text [ danish ] = "Udvalg" ;
        Text [ portuguese_brazilian ] = "Auswahl" ;
        Text [ portuguese ] = "Selecção" ;
        Text[ chinese_simplified ] = "Ñ¡Ôñ";
        Text[ russian ] = "Âûáîð";
        Text[ polish ] = "Wybór";
        Text[ japanese ] = "‘I‘ð";
        Text[ chinese_traditional ] = "¿ï¾Ü";
        Text[ arabic ] = "ÇáÊÍÏíÏ";
        Text[ dutch ] = "Selectie";
        Text[ chinese_simplified ] = "Ñ¡Ôñ";
        Text[ greek ] = "ÅðéëïãÞ";
        Text[ korean ] = "¼±ÅÃ";
        Text[ turkish ] = "Seçim";
    };
    FixedText FT_HORZLINE
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 6 , 137 ) ;
        Size = MAP_APPFONT ( 284 , 2 ) ;
    };
    HelpButton BT_HELP
    {
        Pos = MAP_APPFONT ( 6 , 151 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    CancelButton BT_CANCEL
    {
        Pos = MAP_APPFONT ( 60 , 151 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    PushButton BT_PREV
    {
        Pos = MAP_APPFONT ( 130 , 151 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
         // ### ACHTUNG: Neuer Text in Resource? << ~Zurück : << Zurück
        /* ### ACHTUNG: Neuer Text in Resource? << ~Zurück : << ~Zur³ck */
        Text = "<< Z~urück" ;
        Text [ ENGLISH ] = "<< Back" ;
        TabStop = TRUE ;
        Disable = TRUE ;
        Text [ dutch ] = "<< Vor~ige" ;
        Text [ english_us ] = "<< ~Back" ;
        Text [ italian ] = "Selezione" ;
        Text [ spanish ] = "<< ~Regresar" ;
        Text [ french ] = "<< ~Précédent" ;
        Text [ swedish ] = "<< ~Tillbaka" ;
        Text [ danish ] = "<< Tilbage" ;
        Text [ portuguese ] = "<< ~Anterior" ;
        Text [ portuguese_brazilian ] = "<< ~Zurück" ;
        Text[ chinese_simplified ] = "<< ·µ»Ø(~B)";
        Text[ russian ] = "<< Íàçàä";
        Text[ polish ] = "<< Wstecz";
        Text[ japanese ] = "<<–ß‚é(~B)";
        Text[ chinese_traditional ] = "<< ªð¦^(~B)";
        Text[ arabic ] = ">> ÇáÓÇÈÞ";
        Text[ dutch ] = "<< Vor~ige";
        Text[ chinese_simplified ] = "<< ·µ»Ø(~B)";
        Text[ greek ] = "<< Ðßóù";
        Text[ korean ] = "<<µÚ·Î(~B)";
        Text[ turkish ] = "<< G~eri";
    };
    PushButton BT_NEXT
    {
        Pos = MAP_APPFONT ( 185 , 151 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        Text = "~Weiter >>" ;
        Text [ ENGLISH ] = "Continue >>" ;
        Disable = TRUE ;
        TabStop = TRUE ;
        Text [ dutch ] = "~Volgende >>" ;
        Text [ english_us ] = "~Next >>" ;
        Text [ italian ] = "~Avanti >>" ;
        Text [ spanish ] = "~Siguiente >>" ;
        Text [ french ] = "~Suivant >>" ;
        Text [ swedish ] = "~Nästa >>" ;
        Text [ danish ] = "Næste >>" ;
        Text [ portuguese ] = "~Continuar >>" ;
        Text [ portuguese_brazilian ] = "~Weiter >>" ;
        Text[ chinese_simplified ] = "¼ÌÐø(~N)>>";
        Text[ russian ] = "Äàëåå >>";
        Text[ polish ] = "Dalej >>";
        Text[ japanese ] = "ŽŸ‚Ö >>(~N)";
        Text[ chinese_traditional ] = "Ä~Äò(~N)";
        Text[ arabic ] = "ÇáÊÇáí <<";
        Text[ dutch ] = "~Volgende >>";
        Text[ chinese_simplified ] = "¼ÌÐø(~N)>>";
        Text[ greek ] = "Åðüìåíï >>";
        Text[ korean ] = "´ÙÀ½ >>(~N)";
        Text[ turkish ] = "~Ýleri >>";
    };
    PushButton BT_FINISH
    {
        Pos = MAP_APPFONT ( 240 , 151 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        Text = "~Fertig stellen" ;
        Text [ ENGLISH ] = "Finish >>" ;
        Text [ dutch ] = "~Voltooien" ;
        Text [ english_us ] = "Cre~ate" ;
        Text [ italian ] = "~Crea" ;
        Text [ spanish ] = "~Crear" ;
        Text [ french ] = "~Créer" ;
        Text [ swedish ] = "~Färdigställ" ;
        Text [ danish ] = "Udfør" ;
        Text [ portuguese ] = "~Criar" ;
        Text [ portuguese_brazilian ] = "~Fertigstellen" ;
        Text[ chinese_simplified ] = "Íê³É(~A)";
        Text[ russian ] = "Ãîòîâî";
        Text[ polish ] = "Utwórz";
        Text[ japanese ] = "Š®—¹(~A)";
        Text[ chinese_traditional ] = "§¹¦¨(~A)";
        Text[ arabic ] = "ÅäÔÇÁ";
        Text[ dutch ] = "~Voltooien";
        Text[ chinese_simplified ] = "Íê³É(~A)";
        Text[ greek ] = "Äçìéïõñãßá";
        Text[ korean ] = "¸¸µé±â(~A)";
        Text[ turkish ] = "~Oluþtur";
    };
    Text [ italian ] = "Formattazione automatica diagramma (1-4)" ;
    Text [ spanish ] = "AutoFormato diagrama (1-4)" ;
    Text [ french ] = "AutoFormat de diagramme (1-4)" ;
    Text [ dutch ] = "AutoOpmaak diagram (1-4)" ;
    Text [ swedish ] = "AutoFormat Diagram (1-4)" ;
    Text [ danish ] = "AutoFormat diagram (1-4)" ;
    Text [ portuguese_brazilian ] = "Autoformat Diagramm (1-4)" ;
    Text [ portuguese ] = "AutoFormato gráfico (1-4)" ;
    Text[ chinese_simplified ] = "×Ô¶¯¸ñʽͼ±í(1-4)";
    Text[ russian ] = "Àâòîôîðìàò äèàãðàììû (1-4)";
    Text[ polish ] = "Autoformatowanie wykresu (1-4)";
    Text[ japanese ] = "µ°ÄÌ«°Ï¯Ä ¸Þ×Ì(1-4)";
    Text[ chinese_traditional ] = "¦Û°Ê®æ¦¡¹Ïªí(1-4)";
    Text[ arabic ] = "ÊäÓíÞ ÊáÞÇÆí áÑÓã ÈíÇäí (1Ü4)";
    Text[ dutch ] = "AutoOpmaak diagram (1-4)";
    Text[ chinese_simplified ] = "×Ô¶¯¸ñʽͼ±í(1-4)";
    Text[ greek ] = "ÁõôïÌïñöïðïßçóç äéáãñÜììáôïò (1-4)";
    Text[ korean ] = "ÀÚµ¿ ¼­½Ä Â÷Æ® (1-4)";
    Text[ turkish ] = "Otomatik þema formatlama (1-4)";
};
diff --git a/sw/source/ui/table/colwd.cxx b/sw/source/ui/table/colwd.cxx
new file mode 100644
index 0000000..ba5cb6c
--- /dev/null
+++ b/sw/source/ui/table/colwd.cxx
@@ -0,0 +1,209 @@
/*************************************************************************
 *
 *  $RCSfile: colwd.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:47 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _SFX_SAVEOPT_HXX //autogen
#include <sfx2/saveopt.hxx>
#endif
#ifndef _SVX_DLGUTIL_HXX //autogen
#include <svx/dlgutil.hxx>
#endif


#include "cmdid.h"
#include "colwd.hxx"
#include "tablemgr.hxx"

#include "colwd.hrc"
#include "table.hrc"


IMPL_LINK_INLINE_START( SwTableWidthDlg, LoseFocusHdl, Edit *, EMPTYARG )
{
    USHORT nId = (USHORT)aColEdit.GetValue()-1;
    const SwTwips lWidth = rFnc.GetColWidth(nId);
    aWidthEdit.SetValue(aWidthEdit.Normalize(lWidth), FUNIT_TWIP);
    aWidthEdit.SetMax(aWidthEdit.Normalize(rFnc.GetMaxColWidth(nId)), FUNIT_TWIP);
    return 0;
}
IMPL_LINK_INLINE_END( SwTableWidthDlg, LoseFocusHdl, Edit *, EMPTYARG )



SwTableWidthDlg::SwTableWidthDlg(Window *pParent, SwTableFUNC &rTableFnc ) :

    SvxStandardDialog( pParent, SW_RES(DLG_COL_WIDTH) ),

    aColFT(this,        SW_RES(FT_COL)),
    aColEdit(this,      SW_RES(ED_COL)),
    aWidthFT(this,      SW_RES(FT_WIDTH)),
    aWidthEdit(this,    SW_RES(ED_WIDTH)),
    aWidthFrm(this,     SW_RES(GB_WIDTH)),
    aOKBtn(this,        SW_RES(BT_OK)),
    aCancelBtn(this,    SW_RES(BT_CANCEL)),
    aHelpBtn(this,      SW_RES(BT_HELP)),
    rFnc(rTableFnc)
{
    FreeResource();
    ::SetFieldUnit(aWidthEdit, OFF_APP()->GetOptions().GetMetric());
    aColEdit.SetValue( rFnc.GetCurColNum() +1 );
    aWidthEdit.SetMin(aWidthEdit.Normalize(MINLAY), FUNIT_TWIP);
    if(!aWidthEdit.GetMin())
        aWidthEdit.SetMin(1);

    if(rFnc.GetColCount() == 0)
        aWidthEdit.SetMin(aWidthEdit.Normalize(rFnc.GetColWidth(0)), FUNIT_TWIP);
    aColEdit.SetMax(rFnc.GetColCount() +1 );
    aColEdit.SetModifyHdl(LINK(this,SwTableWidthDlg, LoseFocusHdl));
    LoseFocusHdl();
}



void SwTableWidthDlg::Apply()
{
    rFnc.InitTabCols();
    rFnc.SetColWidth( aColEdit.GetValue()-1,
            aWidthEdit.Denormalize(aWidthEdit.GetValue(FUNIT_TWIP)));
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.40  2000/09/18 16:06:07  willem.vandorp
    OpenOffice header added.

    Revision 1.39  2000/05/26 07:21:33  os
    old SW Basic API Slots removed

    Revision 1.38  1998/05/13 14:00:46  OS
    HelpButton


      Rev 1.37   13 May 1998 16:00:46   OS
   HelpButton

      Rev 1.36   24 Nov 1997 15:52:22   MA
   includes

      Rev 1.35   03 Nov 1997 13:56:50   MA
   precomp entfernt

      Rev 1.34   11 Dec 1996 20:58:14   MH
   includes

      Rev 1.33   11 Dec 1996 08:43:16   OS
   Minimalwert nie NULL, Einheit richtig einstellen

      Rev 1.32   11 Nov 1996 11:19:56   MA
   ResMgr

      Rev 1.31   05 Sep 1996 08:19:30   OS
   richtige Min/Max-Einstellungen fuer einspaltige Tabellen

      Rev 1.30   28 Aug 1996 14:33:16   OS
   includes

      Rev 1.29   26 Jun 1996 15:25:20   OS
   Aufruf von Dispatcher.Execute an 324 angepasst

      Rev 1.28   06 Jun 1996 14:55:42   OS
   MINLAY als Minimum fuer Breite setzen

      Rev 1.27   22 Mar 1996 14:16:30   HJS
   umstellung 311

      Rev 1.26   07 Feb 1996 08:11:40   OS
   INLINE-LoseFocusHdl muss vor erster Benutzung definiert werden

      Rev 1.25   06 Feb 1996 15:21:22   JP
   Link Umstellung 305

      Rev 1.24   24 Nov 1995 16:58:58   OM
   PCH->PRECOMPILED

      Rev 1.23   10 Nov 1995 15:26:44   OS
   Execute mit 0L abschliessen

      Rev 1.22   08 Nov 1995 13:34:38   OS
   Change => Set

      Rev 1.21   05 Nov 1995 16:49:08   OS
   Dtor ueberfluessig, -RecordFlag, Aktion ueber Dispatcher

      Rev 1.20   13 Sep 1995 17:09:44   OS
   Recording ausgeweitet

------------------------------------------------------------------------*/



diff --git a/sw/source/ui/table/colwd.hrc b/sw/source/ui/table/colwd.hrc
new file mode 100644
index 0000000..950e861
--- /dev/null
+++ b/sw/source/ui/table/colwd.hrc
@@ -0,0 +1,70 @@
/*************************************************************************
 *
 *  $RCSfile: colwd.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:47 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#define FT_COL      1
#define ED_COL      2
#define FT_WIDTH    3
#define ED_WIDTH    4
#define GB_WIDTH    5

#define BT_OK       100
#define BT_CANCEL   101
#define BT_HELP     102

diff --git a/sw/source/ui/table/colwd.src b/sw/source/ui/table/colwd.src
new file mode 100644
index 0000000..2cc9279
--- /dev/null
+++ b/sw/source/ui/table/colwd.src
@@ -0,0 +1,232 @@
/*************************************************************************
 *
 *  $RCSfile: colwd.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:47 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "table.hrc"
#include "colwd.hrc"
#include "cmdid.h"
#include "helpid.h"
 // #define DLG_COL_WIDTH 256
ModalDialog DLG_COL_WIDTH
{
    HelpID = FN_TABLE_SET_COL_WIDTH ;
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 149 , 60 ) ;
    Text = "Spaltenbreite" ;
    Text [ ENGLISH ] = "Column width" ;
    Text [ norwegian ] = "Bredde på kolonne " ;
    Text [ italian ] = "Larghezza colonna" ;
    Text [ portuguese_brazilian ] = "Largura da coluna" ;
    Text [ portuguese ] = "Largura da coluna" ;
    Text [ finnish ] = "Sarakeleveys" ;
    Text [ danish ] = "Kolonnebredde" ;
    Text [ french ] = "Largeur de colonne" ;
    Text [ swedish ] = "Kolumnbredd" ;
    Text [ dutch ] = "Kolombreedte" ;
    Text [ spanish ] = "Ancho de columna" ;
    Text [ english_us ] = "Column Width" ;
    Moveable = TRUE ;
    OKButton BT_OK
    {
        Pos = MAP_APPFONT ( 94 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        DefButton = TRUE ;
    };
    CancelButton BT_CANCEL
    {
        Pos = MAP_APPFONT ( 94 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    HelpButton BT_HELP
    {
        Pos = MAP_APPFONT ( 94 , 43 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    FixedText FT_WIDTH
    {
        Pos = MAP_APPFONT ( 12 , 31 ) ;
        Size = MAP_APPFONT ( 22 , 8 ) ;
        Text = "~Breite" ;
        Text [ ENGLISH ] = "~Width" ;
        Text [ norwegian ] = "~Bredde" ;
        Text [ italian ] = "~Largh." ;
        Text [ portuguese_brazilian ] = "~Largura" ;
        Text [ portuguese ] = "~Largura" ;
        Text [ finnish ] = "~Leveys" ;
        Text [ danish ] = "Bredde" ;
        Text [ french ] = "~Largeur" ;
        Text [ swedish ] = "~Bredd" ;
        Text [ dutch ] = "B~reedte" ;
        Text [ spanish ] = "A~ncho" ;
        Text [ english_us ] = "~Width" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "¿í(~W)";
        Text[ russian ] = "Øèðèíà";
        Text[ polish ] = "Szer.";
        Text[ japanese ] = "•(~W)";
        Text[ chinese_traditional ] = "¼e(~W)";
        Text[ arabic ] = "ÇáÚÑÖ";
        Text[ greek ] = "ÐëÜôïò";
        Text[ korean ] = "³Êºñ(~W)";
        Text[ turkish ] = "~Geniþlik";
        Text[ language_user1 ] = " ";
    };
    MetricField ED_WIDTH
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 41 , 30 ) ;
        Size = MAP_APPFONT ( 38 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 50 ;
        Maximum = 9999 ;
        DecimalDigits = 2 ;
        SpinSize = 10 ;
        Value = 10 ;
        Unit = FUNIT_CM ;
        First = 100 ;
        Last = 9999 ;
    };
    GroupBox GB_WIDTH
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 81 , 50 ) ;
        Text = "Breite" ;
        Text [ ENGLISH ] = "Width" ;
        Text [ norwegian ] = "Bredde " ;
        Text [ italian ] = "Larghezza" ;
        Text [ portuguese_brazilian ] = "Largura" ;
        Text [ portuguese ] = "Largura" ;
        Text [ finnish ] = "Leveys" ;
        Text [ danish ] = "Bredde" ;
        Text [ french ] = "Largeur" ;
        Text [ swedish ] = "Bredd" ;
        Text [ dutch ] = "Breedte" ;
        Text [ spanish ] = "Ancho" ;
        Text [ english_us ] = "Width" ;
        Text[ chinese_simplified ] = "¿í";
        Text[ russian ] = "Øèðèíà";
        Text[ polish ] = "Szer.";
        Text[ japanese ] = "•";
        Text[ chinese_traditional ] = "¼e";
        Text[ arabic ] = "ÇáÚÑÖ";
        Text[ greek ] = "ÐëÜôïò";
        Text[ korean ] = "³Êºñ";
        Text[ turkish ] = "Geniþlik";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_COL
    {
        Pos = MAP_APPFONT ( 12 , 16 ) ;
        Size = MAP_APPFONT ( 29 , 8 ) ;
        Text = "~Spalte" ;
        Text [ ENGLISH ] = "~Column" ;
        Text [ norwegian ] = "~Kolonne" ;
        Text [ italian ] = "Colonna" ;
        Text [ portuguese_brazilian ] = "~Coluna" ;
        Text [ portuguese ] = "~Coluna" ;
        Text [ finnish ] = "~Palsta" ;
        Text [ danish ] = "Kolonne" ;
        Text [ french ] = "~Colonne" ;
        Text [ swedish ] = "~Kolumn" ;
        Text [ dutch ] = "~Kolom" ;
        Text [ spanish ] = "Colu~mna" ;
        Text [ english_us ] = "~Column" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "À¸(~C)";
        Text[ russian ] = "Êîëîíêà";
        Text[ polish ] = "Kolumna";
        Text[ japanese ] = "—ñ(~C)";
        Text[ chinese_traditional ] = "Äæ(~C)";
        Text[ arabic ] = "ÇáÚãæÏ";
        Text[ greek ] = "ÓôÞëç";
        Text[ korean ] = "¿­(~C)";
        Text[ turkish ] = "~Sütun";
        Text[ language_user1 ] = " ";
    };
    NumericField ED_COL
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 41 , 14 ) ;
        Size = MAP_APPFONT ( 38 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Spin = TRUE ;
        Minimum = 1 ;
        Maximum = 99 ;
        Repeat = TRUE ;
    };
    Text[ chinese_simplified ] = "À¸¿í";
    Text[ russian ] = "Øèðèíà êîëîíêè";
    Text[ polish ] = "SzerokoϾ kolumny";
    Text[ japanese ] = "—ñ•";
    Text[ chinese_traditional ] = "Äæ¼e";
    Text[ arabic ] = "ÚÑÖ ÇáÃÚãÏÉ";
    Text[ greek ] = "ÐëÜôïò óôÞëçò";
    Text[ korean ] = "¿­ ³Êºñ";
    Text[ turkish ] = "Sütun geniþliði";
    Text[ language_user1 ] = " ";
};
diff --git a/sw/source/ui/table/convert.cxx b/sw/source/ui/table/convert.cxx
new file mode 100644
index 0000000..f0c2e79
--- /dev/null
+++ b/sw/source/ui/table/convert.cxx
@@ -0,0 +1,331 @@
/*************************************************************************
 *
 *  $RCSfile: convert.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:47 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SV_MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _SFXVIEWFRM_HXX //autogen
#include <sfx2/viewfrm.hxx>
#endif

#ifndef _MODOPT_HXX //autogen
#include <modcfg.hxx>
#endif
#ifndef _SVX_HTMLMODE_HXX //autogen
#include <svx/htmlmode.hxx>
#endif
#ifndef _VIEWOPT_HXX
#include <viewopt.hxx>
#endif
#include "swmodule.hxx"
#include "cmdid.h"
#include "convert.hxx"
#include "tablemgr.hxx"
#include "wrtsh.hxx"
#include "view.hxx"
#include "tautofmt.hxx"
#include "tblafmt.hxx"

#include "table.hrc"
#include "convert.hrc"


void SwConvertTableDlg::GetValues(  char& rDelim,
                                    USHORT& rInsTblFlags,
                                    SwTableAutoFmt *& prTAFmt )
{
    if( aTabBtn.IsChecked() )
        rDelim = aKeepColumn.IsChecked() ? 0x09 : 0x0b;
    else if( aSemiBtn.IsChecked() )
        rDelim = ';';
    else if( aOtherBtn.IsChecked() && aOtherEd.GetText().Len() )
        rDelim = aOtherEd.GetText().GetChar( 0 );
    else
        rDelim = cParaDelim;

    rInsTblFlags = 0;
    if (aBorderCB.IsChecked())
        rInsTblFlags |= DEFAULT_BORDER;
    if (aHeaderCB.IsChecked())
        rInsTblFlags |= HEADLINE;
    if (aRepeatHeaderCB.IsEnabled() && aRepeatHeaderCB.IsChecked())
        rInsTblFlags |= REPEAT;
    if (!aDontSplitCB.IsChecked())
        rInsTblFlags |= SPLIT_LAYOUT;

    if( pTAutoFmt )
        prTAFmt = new SwTableAutoFmt( *pTAutoFmt );
}


SwConvertTableDlg::SwConvertTableDlg( SwView& rView )

    : SfxModalDialog( &rView.GetViewFrame()->GetWindow(), SW_RES(DLG_CONV_TEXT_TABLE)),

    aTabBtn         (this, SW_RES(CB_TAB)),
    aSemiBtn        (this, SW_RES(CB_SEMI)),
    aParaBtn        (this, SW_RES(CB_PARA)),
    aDelimFrm       (this, SW_RES(GB_DELIM)),
    aOtherBtn       (this, SW_RES(RB_OTHER)),
    aOtherEd        (this, SW_RES(ED_OTHER)),
    aKeepColumn     (this, SW_RES(CB_KEEPCOLUMN)),
    aHeaderCB       (this, SW_RES(CB_HEADER)),
    aRepeatHeaderCB (this, SW_RES(CB_REPEAT_HEADER)),
    aDontSplitCB    (this, SW_RES(CB_DONT_SPLIT)),
    aBorderCB       (this, SW_RES(CB_BORDER)),
    aOptionsGB      (this, SW_RES(GB_OPTIONS)),

    aOkBtn(this,SW_RES(BT_OK)),
    aCancelBtn(this,SW_RES(BT_CANCEL)),
    aHelpBtn(this, SW_RES(BT_HELP)),
    aAutoFmtBtn(this,SW_RES(BT_AUTOFORMAT)),

    pTAutoFmt( 0 ),
    pShell( &rView.GetWrtShell() ),
    sConvertTextTable(SW_RES(STR_CONVERT_TEXT_TABLE))
{
    FreeResource();
    if( 0 == pShell->GetTableFmt() )
    {
        SetText( sConvertTextTable );
        aAutoFmtBtn.SetClickHdl(LINK(this, SwConvertTableDlg, AutoFmtHdl));
        aAutoFmtBtn.Show();
        aKeepColumn.Show();
        aKeepColumn.Enable( aTabBtn.IsChecked() );
        aKeepColumn.Check( !aTabBtn.IsChecked() );
    }
    else
    {
        aKeepColumn.Check( TRUE );
        //Einfuege-Optionen verstecken
        aHeaderCB          .Show(FALSE);
        aRepeatHeaderCB    .Show(FALSE);
        aDontSplitCB       .Show(FALSE);
        aBorderCB          .Show(FALSE);
        aOptionsGB         .Show(FALSE);

        //Groesse anpassen
        Size aSize(GetSizePixel());
        aSize.Height() = aDelimFrm.GetSizePixel().Height() + 2 * aDelimFrm.GetPosPixel().Y();
        SetOutputSizePixel(aSize);
    }
    aKeepColumn.SaveValue();

    Link aLk( LINK(this, SwConvertTableDlg, BtnHdl) );
    aTabBtn.SetClickHdl( aLk );
    aSemiBtn.SetClickHdl( aLk );
    aParaBtn.SetClickHdl( aLk );
    aOtherBtn.SetClickHdl(aLk );
    aOtherEd.Enable( aOtherBtn.IsChecked() );

    const SwModuleOptions* pModOpt = SW_MOD()->GetModuleConfig();

    BOOL bHTMLMode = 0 != (::GetHtmlMode(rView.GetDocShell())&HTMLMODE_ON);
    USHORT nInsTblFlags = pModOpt->GetInsTblFlags(bHTMLMode);

    aHeaderCB.Check(nInsTblFlags & HEADLINE);
    aRepeatHeaderCB.Check(nInsTblFlags & REPEAT);
    aDontSplitCB.Check(!(nInsTblFlags & SPLIT_LAYOUT));
    aBorderCB.Check(nInsTblFlags & DEFAULT_BORDER);

    aHeaderCB.SetClickHdl(LINK(this, SwConvertTableDlg, CheckBoxHdl));
    CheckBoxHdl();
}

SwConvertTableDlg:: ~SwConvertTableDlg()
{
    delete pTAutoFmt;
}

IMPL_LINK( SwConvertTableDlg, AutoFmtHdl, PushButton*, pButton )
{
    SwAutoFormatDlg aDlg( pButton, pShell, FALSE, pTAutoFmt );
    if( RET_OK == aDlg.Execute())
        aDlg.FillAutoFmtOfIndex( pTAutoFmt );
    return 0;
}

IMPL_LINK( SwConvertTableDlg, BtnHdl, Button*, pButton )
{
    if( pButton == &aTabBtn )
        aKeepColumn.SetState( aKeepColumn.GetSavedValue() );
    else
    {
        if( aKeepColumn.IsEnabled() )
            aKeepColumn.SaveValue();
        aKeepColumn.Check( TRUE );
    }
    aKeepColumn.Enable( aTabBtn.IsChecked() );
    aOtherEd.Enable( aOtherBtn.IsChecked() );
    return 0;
}

/*********************************************************************/
/*                                                                   */
/*********************************************************************/

IMPL_LINK(SwConvertTableDlg, CheckBoxHdl, CheckBox*, EMPTYARG)
{
    aRepeatHeaderCB.Enable(aHeaderCB.IsChecked());

    return 0;
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.39  2000/09/18 16:06:07  willem.vandorp
    OpenOffice header added.

    Revision 1.38  2000/02/11 14:58:29  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.37  1999/05/03 09:03:16  OS
    #65612# Einfuegeoptionen nur in einer Richtung anzeigen


      Rev 1.36   03 May 1999 11:03:16   OS
   #65612# Einfuegeoptionen nur in einer Richtung anzeigen

      Rev 1.35   17 Feb 1999 08:39:46   OS
   #58158# Einfuegen TabPage auch in HTML-Docs

      Rev 1.34   02 Dec 1998 15:29:58   OM
   #59770# Tabellenueberschrift nur auf erster Seite

      Rev 1.33   30 Nov 1998 17:33:40   OM
   #59770# Tabellenoptionen: Ueberschrift nur auf erster Seite

      Rev 1.32   11 Nov 1998 16:51:58   OM
   #58158# Einfuegeoptionen fuer Tabellen

      Rev 1.31   09 Jul 1998 22:44:00   JP
   Bug #52543#: SaveState am KeepButton im CTOR immer rufen

      Rev 1.30   22 Jun 1998 12:54:30   JP
   Bug #51412#: CTOR TabelleToText - KeepButton checken

      Rev 1.29   15 Jun 1998 20:33:16   JP
   TextToTable: KommaBtn gegen AndereBtn und -Edit ausgetauscht, OptionCheckBox fuer TabBtnt

      Rev 1.28   29 May 1998 18:55:32   JP
   SS vom TableAutoFormatDialog hat sich geaendert

      Rev 1.27   13 May 1998 16:00:50   OS
   HelpButton

      Rev 1.26   12 May 1998 23:42:42   JP
   neu: InserTable/TextToTable mit optionalen AutoFormat

      Rev 1.25   24 Nov 1997 15:52:22   MA
   includes

      Rev 1.24   03 Nov 1997 13:56:52   MA
   precomp entfernt

      Rev 1.23   11 Nov 1996 11:20:02   MA
   ResMgr

      Rev 1.22   28 Aug 1996 14:33:14   OS
   includes

      Rev 1.21   26 Jun 1996 15:25:34   OS
   Aufruf von Dispatcher.Execute an 324 angepasst

      Rev 1.20   22 Mar 1996 14:16:30   HJS
   umstellung 311

      Rev 1.19   24 Nov 1995 16:58:56   OM
   PCH->PRECOMPILED

      Rev 1.18   10 Nov 1995 15:26:44   OS
   Execute mit 0L abschliessen

      Rev 1.17   07 Nov 1995 07:27:04   OS
   include tablemgr muss bleiben

      Rev 1.16   06 Nov 1995 17:14:14   OS
   ConvertDlg ohne TableMgr und RecordFlag

      Rev 1.15   30 Aug 1995 14:02:32   MA
   fix: sexport'iert

      Rev 1.14   24 Aug 1995 14:33:32   MA
   swstddlg -> svxstandarddialog

      Rev 1.13   25 Oct 1994 18:52:30   ER
   add: PCH

      Rev 1.12   26 Feb 1994 02:37:52   ER
   virt. dtor mit export

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/table/convert.hrc b/sw/source/ui/table/convert.hrc
new file mode 100644
index 0000000..5bc4946
--- /dev/null
+++ b/sw/source/ui/table/convert.hrc
@@ -0,0 +1,79 @@
/*************************************************************************
 *
 *  $RCSfile: convert.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:47 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#define CB_TAB          1
#define CB_SEMI         3
#define CB_PARA         4
#define GB_DELIM        5
#define RB_OTHER        6
#define ED_OTHER        7
#define CB_KEEPCOLUMN   8
#define STR_CONVERT_TEXT_TABLE      9
#define CB_HEADER           13
#define CB_REPEAT_HEADER    14
#define CB_DONT_SPLIT       15
#define CB_BORDER           16
#define GB_OPTIONS          17

#define BT_OK           100
#define BT_CANCEL       101
#define BT_AUTOFORMAT   102
#define BT_HELP         103

diff --git a/sw/source/ui/table/convert.src b/sw/source/ui/table/convert.src
new file mode 100644
index 0000000..8f1dcaa
--- /dev/null
+++ b/sw/source/ui/table/convert.src
@@ -0,0 +1,485 @@
/*************************************************************************
 *
 *  $RCSfile: convert.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:47 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "table.hrc"
#include "convert.hrc"
#include "cmdid.h"
#include "helpid.h"
ModalDialog DLG_CONV_TEXT_TABLE
{
    HelpID = FN_CONVERT_TEXT_TABLE ;
    OUTPUTSIZE = TRUE ;
    Size = MAP_APPFONT ( 193 , 144 ) ;
    TEXT = "Tabelle in Text umwandeln" ;
    TEXT [ ENGLISH ] = "Convert table to text" ;
    TEXT [ norwegian ] = "Omdann tabell til tekst" ;
    TEXT [ italian ] = "Converti tabella in testo" ;
    TEXT [ portuguese_brazilian ] = "Converter tabela em texto" ;
    TEXT [ portuguese ] = "Converter tabela em texto" ;
    TEXT [ finnish ] = "Muunna taulukko tekstiksi" ;
    TEXT [ danish ] = "Konverter tabel til tekst" ;
    TEXT [ french ] = "Convertir tableau en texte" ;
    TEXT [ swedish ] = "Omvandla tabell till text" ;
    TEXT [ dutch ] = "Tabel naar tekst converteren" ;
    TEXT [ spanish ] = "Convertir tabla en texto" ;
    TEXT [ english_us ] = "Convert Table to Text" ;
    MOVEABLE = TRUE ;
    SVLOOK = TRUE ;
    RadioButton CB_TAB
    {
        Pos = MAP_APPFONT ( 12 , 17 ) ;
        Size = MAP_APPFONT ( 55 , 10 ) ;
        TEXT = "~Tabulator" ;
        TEXT [ ENGLISH ] = "~Tab" ;
        TEXT [ norwegian ] = "~Tab" ;
        TEXT [ italian ] = "~Tabulazione" ;
        TEXT [ portuguese_brazilian ] = "~Tabulação" ;
        TEXT [ portuguese ] = "~Tabulações" ;
        TEXT [ finnish ] = "~Sarkain" ;
        TEXT [ danish ] = "Tabulator" ;
        TEXT [ french ] = "~Tabulation" ;
        TEXT [ swedish ] = "~Tabulator" ;
        TEXT [ dutch ] = "~Tab" ;
        TEXT [ spanish ] = "Tabu~lación" ;
        TEXT [ english_us ] = "~Tabs" ;
        TABSTOP = TRUE ;
        Group = TRUE ;
        Check = TRUE ;
        TEXT[ chinese_simplified ] = "ÖÆ±í·û(~T)";
        TEXT[ russian ] = "Òàáóëÿòîð";
        TEXT[ polish ] = "Tabulator";
        TEXT[ japanese ] = "ÀÌÞ(~T)";
        TEXT[ chinese_traditional ] = "»sªí²Å(~T)";
        TEXT[ arabic ] = "ÚáÇãÉ ÌÏæáÉ";
        TEXT[ greek ] = "Ó~ôçëïèÝôçò";
        TEXT[ korean ] = "ÅÇ(~T)";
        TEXT[ turkish ] = "~Sekme";
        TEXT[ language_user1 ] = " ";
    };
    RadioButton CB_SEMI
    {
        Pos = MAP_APPFONT ( 70 , 17 ) ;
        Size = MAP_APPFONT ( 55 , 10 ) ;
        TEXT = "~Semikolon" ;
        TEXT [ ENGLISH ] = "~Semicolon" ;
        TEXT [ norwegian ] = "~Semikolon" ;
        TEXT [ italian ] = "~Punto e virgola" ;
        TEXT [ portuguese_brazilian ] = "~Ponto e vírgula" ;
        TEXT [ portuguese ] = "Ponto e vír~gula" ;
        TEXT [ finnish ] = "~Puolipiste" ;
        TEXT [ danish ] = "Semikolon" ;
        TEXT [ french ] = "~Point virgule" ;
        TEXT [ swedish ] = "~Semikolon" ;
        TEXT [ dutch ] = "~Puntkomma" ;
        TEXT [ spanish ] = "Punto y co~ma" ;
        TEXT [ english_us ] = "~Semicolons" ;
        TABSTOP = TRUE ;
        TEXT[ chinese_simplified ] = "·ÖºÅ(~S)";
        TEXT[ russian ] = "Òî÷êà ñ çàïÿòîé";
        TEXT[ polish ] = "Œrednik";
        TEXT[ japanese ] = "¾ÐºÛÝ(~S)";
        TEXT[ chinese_traditional ] = "¤À¸¹(~S)";
        TEXT[ arabic ] = "ÇáÝÇÕáÉ ÇáãäÞæØÉ";
        TEXT[ greek ] = "¢íù ôå~ëåßá";
        TEXT[ korean ] = "¼¼¹ÌÄÝ·Ð(~S)";
        TEXT[ turkish ] = "N~oktalý virgül";
        TEXT[ language_user1 ] = " ";
    };
    RadioButton CB_PARA
    {
        Pos = MAP_APPFONT ( 12 , 33 ) ;
        Size = MAP_APPFONT ( 55 , 10 ) ;
        TEXT = "~Absatz" ;
        TEXT [ ENGLISH ] = "~Paragraph" ;
        TEXT [ norwegian ] = "~Paragraf" ;
        TEXT [ italian ] = "~Paragrafo" ;
        TEXT [ portuguese_brazilian ] = "~Parágrafo" ;
        TEXT [ portuguese ] = "~Parágrafo" ;
        TEXT [ finnish ] = "~Kappale" ;
        TEXT [ danish ] = "Afsnit" ;
        TEXT [ french ] = "~Paragraphe" ;
        TEXT [ swedish ] = "Styc~ke" ;
        TEXT [ dutch ] = "~Alinea" ;
        TEXT [ spanish ] = "~Párrafo" ;
        TEXT [ english_us ] = "~Paragraph" ;
        TABSTOP = TRUE ;
        TEXT[ chinese_simplified ] = "¶ÎÂä(~P)";
        TEXT[ russian ] = "Àáçàö";
        TEXT[ polish ] = "Akapit";
        TEXT[ japanese ] = "’i—Ž(~P)";
        TEXT[ chinese_traditional ] = "¬q¸¨(~P)";
        TEXT[ arabic ] = "ÇáÝÞÑÉ";
        TEXT[ greek ] = "Ð~áñÜãñáöïò";
        TEXT[ korean ] = "´Ü¶ô(~P)";
        TEXT[ turkish ] = "~Paragraf";
        TEXT[ language_user1 ] = " ";
    };
    RadioButton RB_OTHER
    {
        Pos = MAP_APPFONT ( 70 , 33 ) ;
        Size = MAP_APPFONT ( 40 , 10 ) ;
        TEXT = "An~dere: " ;
        TEXT [ ENGLISH ] = "~Other: " ;
        Text [ portuguese ] = "~Outros: " ;
        Text [ english_us ] = "~Other: " ;
        Text [ portuguese_brazilian ] = "An~dere: " ;
        Text [ swedish ] = "An~dra:  " ;
        Text [ danish ] = "Andre: " ;
        Text [ italian ] = "~Altri: " ;
        Text [ spanish ] = "~Otros:  " ;
        Text [ french ] = "~Autre(s):[_]" ;
        Text [ dutch ] = "An~dere:  " ;
        Text[ chinese_simplified ] = "ÆäËû(~O)";
        Text[ russian ] = "Äðóãèå:  ";
        Text[ polish ] = "Inne:   ";
        Text[ japanese ] = "‚»‚Ì‘¼(~O)";
        Text[ chinese_traditional ] = "¨ä¥L(~O)";
        Text[ arabic ] = "ÛíÑ Ðáß: ";
        Text[ greek ] = "¢ëëá: ";
        Text[ korean ] = "±âŸ (~O)";
        Text[ turkish ] = "Di~ðer: ";
        Text[ language_user1 ] = " ";
    };
    Edit ED_OTHER
    {
        Border = TRUE ;
        Left = TRUE ;
        Pos = MAP_APPFONT ( 113 , 32 ) ;
        Size = MAP_APPFONT ( 9 , 12 ) ;
        Text = "," ;
        MaxTextLength = 1 ;
    };
    CheckBox CB_KEEPCOLUMN
    {
        Pos = MAP_APPFONT ( 12 , 49 ) ;
        Size = MAP_APPFONT ( 110 , 10 ) ;
        Text = "Gleiche ~Breite aller Spalten" ;
        TEXT [ ENGLISH ] = "Equal width for all columns" ;
        Hide = TRUE ;
        Text [ english_us ] = "Equal width for all columns" ;
        Text [ portuguese_brazilian ] = "gleiche Breite aller Spalten" ;
        Text [ swedish ] = "Samma bredd på alla kolumner" ;
        Text [ danish ] = "Alle kolonner samme bredde" ;
        Text [ italian ] = "~Larghezza uguale per tutte le colonne" ;
        Text [ spanish ] = "Mismo an~cho para todas las columnas" ;
        Text [ french ] = "~Largeur identique pour toutes les colonnes" ;
        Text [ dutch ] = "~Alle kolommen dezelfde breedte" ;
        Text [ portuguese ] = "~Largura igual para todas as colunas" ;
        Text[ chinese_simplified ] = "ËùÓÐÁеĿí¶ÈÏàͬ";
        Text[ russian ] = "Îäèíàêîâàÿ øèðèíà âñåõ êîëîíîê";
        Text[ polish ] = "~Jednakowa szerokoϾ wszystk. kolumn";
        Text[ japanese ] = "‚·‚ׂĂ̗ñ•‚𓯂¶‚É";
        Text[ chinese_traditional ] = "©Ò¦³Äæ¼e«×¬Û¦P";
        Text[ arabic ] = "äÝÓ ÇáÚÑÖ áßá ÇáÃÚãÏÉ";
        Text[ greek ] = "ºäéï ~ðëÜôïò ãéá üëåò ôéò óôÞëåò";
        Text[ korean ] = "¸ðµç ¿­ ³Êºñ °°°Ô";
        Text[ turkish ] = "Tüm sütunlar a~yný geniþlikte";
        Text[ language_user1 ] = " ";
    };
    GroupBox GB_DELIM
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 125 , 62 ) ;
        TEXT = "Trennzeichen im Text" ;
        TEXT [ ENGLISH ] = "Delimiter" ;
        TEXT [ norwegian ] = "Skilletegn" ;
        TEXT [ italian ] = "Separatore nel testo" ;
        TEXT [ portuguese_brazilian ] = "Delimitador" ;
        TEXT [ portuguese ] = "Separador" ;
        TEXT [ finnish ] = "Erotin" ;
        TEXT [ danish ] = "Separatorer i tekst" ;
        TEXT [ french ] = "Séparateur" ;
        TEXT [ swedish ] = "Skiljetecken i text" ;
        TEXT [ dutch ] = "Scheidingsteken in tekst" ;
        TEXT [ spanish ] = "Delimitador en texto" ;
        TEXT [ english_us ] = "Separate text at" ;
        Group = TRUE ;
        TEXT[ chinese_simplified ] = "ÕýÎÄÄڵķָô·û";
        TEXT[ russian ] = "Ðàçäåëèòåëü òåêñòà";
        TEXT[ polish ] = "Separator w tekœcie";
        TEXT[ japanese ] = "÷½Ä“à‚Ì‹æØ‚è‹L†";
        TEXT[ chinese_traditional ] = "¤º¤åªº¤À¹j²Å";
        TEXT[ arabic ] = "ÚáÇãÇÊ ÇáÝÕá Ýí ÇáäÕ";
        TEXT[ greek ] = "Åíùôéêü ìÝóá óôï êåßìåíï";
        TEXT[ korean ] = "ÅØ½ºÆ® ±¸ºÐ ±âÈ£";
        TEXT[ turkish ] = "Metin ayýrma iþareti";
        TEXT[ language_user1 ] = " ";
    };
    CheckBox CB_HEADER
    {
        Pos = MAP_APPFONT ( 12 , 84 ) ;
        Size = MAP_APPFONT ( 113 , 10 ) ;
        Text = "Übe~rschrift" ;
        Text [ ENGLISH ] = "Header" ;
        TabStop = TRUE ;
        Text[ italian ] = "Intestazione";
        Text[ portuguese_brazilian ] = "Header";
        Text[ portuguese ] = "~Título";
        Text[ danish ] = "Overskrift";
        Text[ french ] = "T~itre";
        Text[ swedish ] = "Öve~rskrift";
        Text[ dutch ] = "~Kop";
        Text[ spanish ] = "~Encabezado";
        Text[ english_us ] = "Header";
        Text[ chinese_simplified ] = "±êÌâ";
        Text[ russian ] = "Çàãîëîâîê";
        Text[ polish ] = "Tytu³";
        Text[ japanese ] = "Œ©o‚µ";
        Text[ chinese_traditional ] = "¼ÐÃD";
        Text[ arabic ] = "ÇáÚäæÇä";
        Text[ greek ] = "Åðéêå~öáëßäá";
        Text[ korean ] = "¸Ó¸®±Û";
        Text[ turkish ] = "Baþ~lýk";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_REPEAT_HEADER
    {
        Pos = MAP_APPFONT ( 22 , 97 ) ;
        Size = MAP_APPFONT ( 103 , 10 ) ;
        Text = "Auf jeder Seite ~wiederholen" ;
        Text [ ENGLISH ] = "Repeat on every page" ;
        TabStop = TRUE ;
        Text[ italian ] = "Ripeti su ogni pagina";
        Text[ portuguese_brazilian ] = "Repeat Header";
        Text[ portuguese ] = "~Repetir em todas as páginas";
        Text[ danish ] = "Gentag på hver side";
        Text[ french ] = "~Répéter sur chaque page";
        Text[ swedish ] = "~Upprepa på varje sida";
        Text[ dutch ] = "Op iedere pagina ~herhalen";
        Text[ spanish ] = "~Repetir en cada página";
        Text[ english_us ] = "~Repeat header";
        Text[ chinese_simplified ] = "ÔÚÿҳÉÏÖØ¸´ÏÔʾ";
        Text[ russian ] = "Ïîâòîð íà êàæäîé ñòðàíèöå";
        Text[ polish ] = "Powtórz na ~ka¿dej stronie";
        Text[ japanese ] = "ŠeÍß°¼Þ‚ÉŒJ‚è•Ô‚µ";
        Text[ chinese_traditional ] = "¦b¨C­¶¤W­«½ÆÅã¥Ü";
        Text[ arabic ] = "ÊßÑÇÑ Ýí ßá ÕÝÍÉ";
        Text[ greek ] = "Åì~öÜíéóç óå êÜèå óåëßäá";
        Text[ korean ] = "¸Ó¸®±Û ¹Ýº¹(~R)";
        Text[ turkish ] = "Ýlk satýrý her sayfada yi~nele";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_DONT_SPLIT
    {
        Pos = MAP_APPFONT ( 12 , 110 ) ;
        Size = MAP_APPFONT ( 113 , 10 ) ;
        Text = "Tabelle ~nicht trennen" ;
        Text [ ENGLISH ] = "Don't split table" ;
        TabStop = TRUE ;
        Text[ italian ] = "Non separare la tabella";
        Text[ portuguese_brazilian ] = "Don't split table";
        Text[ portuguese ] = "Não ~dividir tabela";
        Text[ danish ] = "Opdel tabel ikke";
        Text[ french ] = "Pas de c~oupure de tableau";
        Text[ swedish ] = "Dela i~nte tabell";
        Text[ dutch ] = "Tabel niet ~splitsen";
        Text[ spanish ] = "~No dividir tabla";
        Text[ english_us ] = "Don't split table";
        Text[ chinese_simplified ] = "²»·Ö¸ô±í¸ñ";
        Text[ russian ] = "Íå ðàçáèâàòü òàáëèöó";
        Text[ polish ] = "Nie dziel tabeli";
        Text[ japanese ] = "•\\‚𕪊„‚µ‚È‚¢";
        Text[ chinese_traditional ] = "¤£¤À¶}ªí®æ";
        Text[ arabic ] = "ÚÏã ÝÕá ÇáÌÏæá";
        Text[ greek ] = "¼÷é äéáßñåóç ôïõ ðß~íáêá";
        Text[ korean ] = "Ç¥¸¦ Âɰ³Áö ¸¶½Ê½Ã¿À.";
        Text[ turkish ] = "Tabloyu tek sayfaya  ~sýðdýr";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_BORDER
    {
        Pos = MAP_APPFONT ( 12 , 123 ) ;
        Size = MAP_APPFONT ( 93 , 10 ) ;
        Text = "~Umrandung" ;
        Text [ ENGLISH ] = "Border" ;
        TabStop = TRUE ;
        Text[ italian ] = "Bordo";
        Text[ portuguese_brazilian ] = "Border";
        Text[ portuguese ] = "~Contornos";
        Text[ danish ] = "Ramme";
        Text[ french ] = "~Bordure";
        Text[ swedish ] = "Inra~mning";
        Text[ dutch ] = "~Omranding";
        Text[ spanish ] = "~Borde";
        Text[ english_us ] = "Border";
        Text[ chinese_simplified ] = "±ß¿ò";
        Text[ russian ] = "Îáðàìëåíèå";
        Text[ polish ] = "Obramowanie";
        Text[ japanese ] = "ŠO˜g";
        Text[ chinese_traditional ] = "Ã䮨";
        Text[ arabic ] = "ÇáÍÏæÏ";
        Text[ greek ] = "Ðåñßãñá~ììá";
        Text[ korean ] = "¿Ü°û¼±";
        Text[ turkish ] = "~Kenarlýk";
        Text[ language_user1 ] = " ";
    };
    GroupBox GB_OPTIONS
    {
        Pos = MAP_APPFONT ( 6 , 71 ) ;
        Size = MAP_APPFONT ( 125 , 69 ) ;
        Text = "Optionen" ;
        Text [ English ] = "Options" ;
        Text[ italian ] = "Opzioni";
        Text[ portuguese_brazilian ] = "Options";
        Text[ portuguese ] = "Opções";
        Text[ danish ] = "Indstillinger";
        Text[ french ] = "Options";
        Text[ swedish ] = "Alternativ";
        Text[ dutch ] = "Opties";
        Text[ spanish ] = "Opciones";
        Text[ english_us ] = "Options";
        Text[ chinese_simplified ] = "Ñ¡Ïî";
        Text[ russian ] = "Ïàðàìåòðû";
        Text[ polish ] = "Opcje";
        Text[ japanese ] = "µÌß¼®Ý";
        Text[ chinese_traditional ] = "¿ï¶µ";
        Text[ arabic ] = "ÇáÎíÇÑÇÊ";
        Text[ greek ] = "ÅðéëïãÝò";
        Text[ korean ] = "¿É¼Ç";
        Text[ turkish ] = "Seçenekler";
        Text[ language_user1 ] = " ";
    };
    String STR_CONVERT_TEXT_TABLE
    {
        TEXT = "Text in Tabelle umwandeln" ;
        TEXT [ ENGLISH ] = "Convert text to table" ;
        TEXT [ norwegian ] = "Omdann tekst til tabell" ;
        TEXT [ italian ] = "Converti testo in tabella" ;
        TEXT [ portuguese_brazilian ] = "Converter texto em tabela" ;
        TEXT [ portuguese ] = "Converter texto em tabela" ;
        TEXT [ finnish ] = "Muunna teksti taulukoksi" ;
        TEXT [ danish ] = "Konverter tekst til tabel" ;
        TEXT [ french ] = "Convertir texte en tableau" ;
        TEXT [ swedish ] = "Omvandla text till tabell" ;
        TEXT [ dutch ] = "Tekst naar tabel converteren" ;
        TEXT [ spanish ] = "Convertir texto en tabla" ;
        TEXT [ english_us ] = "Convert Text to Table" ;
        TEXT[ chinese_simplified ] = "ÎÄ×Öת»»³É±í¸ñ";
        TEXT[ russian ] = "Ïðåîáðàçîâàòü òåêñò â òàáëèöó";
        TEXT[ polish ] = "Konwertuj tekst na tabelê";
        TEXT[ japanese ] = "•¶Žš—ñ‚ð•\\‚É‚·‚é";
        TEXT[ chinese_traditional ] = "¤å¦rÂà´«¦¨ªí®æ";
        TEXT[ arabic ] = "ÊÍæíá ÇáäÕ Åáì ÌÏæá";
        TEXT[ greek ] = "ÌåôáôñïðÞ êåéìÝíïõ óå ðßíáêá";
        TEXT[ korean ] = "ÅØ½ºÆ®¸¦ Ç¥·Î Àüȯ";
        TEXT[ turkish ] = "Metni tabloya dönüþtür";
        TEXT[ language_user1 ] = " ";
    };
    OkButton BT_OK
    {
        Pos = MAP_APPFONT ( 137 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TABSTOP = TRUE ;
        DefButton = TRUE ;
    };
    CancelButton BT_CANCEL
    {
        Pos = MAP_APPFONT ( 137 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TABSTOP = TRUE ;
    };
    HelpButton BT_HELP
    {
        Pos = MAP_APPFONT ( 137 , 43 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TABSTOP = TRUE ;
    };
    PushButton BT_AUTOFORMAT
    {
        Pos = MAP_APPFONT ( 137 , 60 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        Hide = TRUE ;
        Text = "Auto~format..." ;
        Text [ ENGLISH ] = "Autoformat..." ;
        Text [ norwegian ] = "Autoformat..." ;
        Text [ italian ] = "~Formattazione automatica..." ;
        Text [ portuguese_brazilian ] = "Formatação Automática..." ;
        Text [ portuguese ] = "Auto~Formato..." ;
        Text [ finnish ] = "Automaattimuoto..." ;
        Text [ danish ] = "AutoFormat..." ;
        Text [ french ] = "AutoFormat..." ;
        Text [ swedish ] = "AutoFormat..." ;
        Text [ dutch ] = "Auto~Opmaak..." ;
        Text [ spanish ] = "Auto~Formato..." ;
        Text [ english_us ] = "Auto~Format..." ;
        Text[ chinese_simplified ] = "×Ô¶¯¸ñʽ(~F)...";
        Text[ russian ] = "Àâòîôîðìàò...";
        Text[ polish ] = "Autoformat...";
        Text[ japanese ] = "µ°ÄÌ«°Ï¯Ä(~F)...";
        Text[ chinese_traditional ] = "¦Û°Ê®æ¦¡(~F)...";
        Text[ arabic ] = "ÊäÓíÞ ÊáÞÇÆí...";
        Text[ greek ] = "ÁõôïÌïñ~öÞ...";
        Text[ korean ] = "ÀÚµ¿ ¼­½Ä(~F)...";
        Text[ turkish ] = "Otomatik ~formatlama...";
        Text[ language_user1 ] = " ";
    };
    TEXT[ chinese_simplified ] = "ת»»±í¸ñ³ÉÎÄ×Ö";
    TEXT[ russian ] = "Ïðåîáðàçîâàòü òàáëèöó â òåêñò";
    TEXT[ polish ] = "Konwertuj tabelê na tekst";
    TEXT[ japanese ] = "•\\‚𕶏‘‚É‚·‚é";
    TEXT[ chinese_traditional ] = "Âà´«ªí®æ¦¨¤å¦r";
    TEXT[ arabic ] = "ÊÍæíá ÇáÌÏæá Åáì äÕ";
    TEXT[ greek ] = "ÌåôáôñïðÞ ðßíáêá óå êåßìåíï";
    TEXT[ korean ] = "Ç¥¸¦ ÅØ½ºÆ®·Î º¯È¯";
    TEXT[ turkish ] = "Tabloyu metne dönüþtür";
    TEXT[ language_user1 ] = " ";
};
diff --git a/sw/source/ui/table/insrc.cxx b/sw/source/ui/table/insrc.cxx
new file mode 100644
index 0000000..d661797
--- /dev/null
+++ b/sw/source/ui/table/insrc.cxx
@@ -0,0 +1,203 @@
/*************************************************************************
 *
 *  $RCSfile: insrc.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:47 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SFXINTITEM_HXX //autogen
#include <svtools/intitem.hxx>
#endif
#ifndef _SFXVIEWFRM_HXX
#include <sfx2/viewfrm.hxx>
#endif


#include "cmdid.h"
#include "swtypes.hxx"
#include "insrc.hxx"
#include "view.hxx"
#include "table.hrc"
#include "insrc.hrc"




void SwInsRowColDlg::Apply()
{
    USHORT nSlot = bColumn ? FN_TABLE_INSERT_COL : FN_TABLE_INSERT_ROW;
    SfxUInt16Item aCount( nSlot, aCountEdit.GetValue() );
    SfxBoolItem  aAfter( FN_PARAM_INSERT_AFTER, aAfterBtn.IsChecked() );
    rView.GetViewFrame()->GetDispatcher()->Execute( nSlot,
            SFX_CALLMODE_SYNCHRON|SFX_CALLMODE_RECORD,
            &aCount, &aAfter, 0L);
}



SwInsRowColDlg::SwInsRowColDlg(SwView& rVw, BOOL bCol )
    : SvxStandardDialog( rVw.GetWindow(), SW_RES(DLG_INS_ROW_COL) ),
    aCount( this, SW_RES( FT_COUNT ) ),
    aCountEdit( this, SW_RES( ED_COUNT ) ),
    aInsGrp( this, SW_RES( GB_INS ) ),
    aBeforeBtn( this, SW_RES( CB_POS_BEFORE ) ),
    aAfterBtn( this, SW_RES( CB_POS_AFTER ) ),
    aPosGrp( this, SW_RES( GB_POS ) ),
    aRow(SW_RES(STR_ROW)),
    aCol(SW_RES(STR_COL)),
    aOKBtn( this, SW_RES( BT_OK ) ),
    aCancelBtn( this, SW_RES( BT_CANCEL ) ),
    aHelpBtn( this, SW_RES( BT_HELP ) ),
    rView(rVw),
    bColumn( bCol )
{
    FreeResource();
    String aTmp( GetText() );
    if( bColumn )
    {
        aTmp += aCol;
        SetHelpId( FN_TABLE_INSERT_COL_DLG );
    }
    else
    {
        aTmp += aRow;
        SetHelpId( FN_TABLE_INSERT_ROW_DLG );
    }
    SetText( aTmp );
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.30  2000/09/18 16:06:08  willem.vandorp
    OpenOffice header added.

    Revision 1.29  2000/09/07 15:59:31  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.28  1998/05/13 14:00:48  OS
    HelpButton


      Rev 1.27   13 May 1998 16:00:48   OS
   HelpButton

      Rev 1.26   24 Nov 1997 15:52:22   MA
   includes

      Rev 1.25   03 Nov 1997 13:56:52   MA
   precomp entfernt

      Rev 1.24   14 Nov 1996 15:43:44   TRI
   includes

      Rev 1.23   11 Nov 1996 11:20:10   MA
   ResMgr

      Rev 1.22   04 Sep 1996 11:16:52   JP
   TableManager wird nicht mehr benoetigt

      Rev 1.21   28 Aug 1996 14:33:14   OS
   includes

      Rev 1.20   26 Jun 1996 15:25:20   OS
   Aufruf von Dispatcher.Execute an 324 angepasst

      Rev 1.19   22 Mar 1996 14:16:32   HJS
   umstellung 311

      Rev 1.18   24 Nov 1995 16:58:58   OM
   PCH->PRECOMPILED

      Rev 1.17   10 Nov 1995 15:26:16   OS
   Execute mit 0L abschliessen

      Rev 1.16   05 Nov 1995 16:49:32   OS
   Dtor ueberfluessig, -RecordFlag, Aktion ueber Dispatcher

      Rev 1.15   13 Sep 1995 17:10:04   OS
   Recording ausgeweitet

      Rev 1.14   30 Aug 1995 14:02:52   MA
   fix: sexport'iert

      Rev 1.13   21 Aug 1995 09:34:28   MA
   chg: swstddlg -> svxstandarddialog, Optimierungen

      Rev 1.12   25 Oct 1994 18:52:28   ER
   add: PCH

      Rev 1.11   20 Apr 1994 15:34:20   MA
   operator Optimierung.

------------------------------------------------------------------------*/




diff --git a/sw/source/ui/table/insrc.hrc b/sw/source/ui/table/insrc.hrc
new file mode 100644
index 0000000..a11b42d
--- /dev/null
+++ b/sw/source/ui/table/insrc.hrc
@@ -0,0 +1,74 @@
/*************************************************************************
 *
 *  $RCSfile: insrc.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:47 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#define FT_COUNT    1
#define ED_COUNT    2
#define GB_INS      3

#define CB_POS_BEFORE   10
#define CB_POS_AFTER    11
#define GB_POS          12

#define STR_ROW         20
#define STR_COL         21

#define BT_OK       100
#define BT_CANCEL   101
#define BT_HELP     102
diff --git a/sw/source/ui/table/insrc.src b/sw/source/ui/table/insrc.src
new file mode 100644
index 0000000..4bbb706
--- /dev/null
+++ b/sw/source/ui/table/insrc.src
@@ -0,0 +1,305 @@
/*************************************************************************
 *
 *  $RCSfile: insrc.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:47 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "table.hrc"
#include "insrc.hrc"
#include "helpid.h"
 // #define DLG_INS_ROW_COL 256
ModalDialog DLG_INS_ROW_COL
{
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 131 , 84 ) ;
    /* ### ACHTUNG: Neuer Text in Resource? Einfügen : Einf³gen */
    Text = "Einfügen" ;
    Text [ ENGLISH ] = "Insert" ;
    Text [ norwegian ] = "Sett inn" ;
    Text [ italian ] = "Inserisci" ;
    Text [ portuguese_brazilian ] = "Inserir" ;
    Text [ portuguese ] = "Inserir" ;
    Text [ finnish ] = "Lisää" ;
    Text [ danish ] = "Indsæt" ;
    Text [ french ] = "Insérer" ;
    Text [ swedish ] = "Infoga" ;
    Text [ dutch ] = "Invoegen" ;
    Text [ spanish ] = "Insertar" ;
    Text [ english_us ] = "Insert" ;
    Moveable = TRUE ;
    OKButton BT_OK
    {
        Pos = MAP_APPFONT ( 75 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        DefButton = TRUE ;
    };
    CancelButton BT_CANCEL
    {
        Pos = MAP_APPFONT ( 75 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    HelpButton BT_HELP
    {
        Pos = MAP_APPFONT ( 75 , 43 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    RadioButton CB_POS_BEFORE
    {
        Pos = MAP_APPFONT ( 12 , 49 ) ;
        Size = MAP_APPFONT ( 33 , 10 ) ;
        Text = "da~vor" ;
        Text [ ENGLISH ] = "~before" ;
        Text [ norwegian ] = "~før" ;
        Text [ italian ] = "Davanti" ;
        Text [ portuguese_brazilian ] = "~antes" ;
        Text [ portuguese ] = "à ~frente" ;
        Text [ finnish ] = "~edelle" ;
        Text [ danish ] = "foran" ;
        Text [ french ] = "A~vant" ;
        Text [ swedish ] = "~framför" ;
        Text [ dutch ] = "~ervoor" ;
        Text [ spanish ] = "De~lante" ;
        Text [ english_us ] = "~Before" ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "֮ǰ(~B)";
        Text[ russian ] = "ïåðåä";
        Text[ polish ] = "prze~d";
        Text[ japanese ] = "‘O‚Å(~B)";
        Text[ chinese_traditional ] = "¤§«e(~B)";
        Text[ arabic ] = "ÞÈá";
        Text[ greek ] = "Ðñéí áðü";
        Text[ korean ] = "ÀÌÀü(~B)";
        Text[ turkish ] = "ön~üne";
        Text[ language_user1 ] = " ";
    };
    RadioButton CB_POS_AFTER
    {
        Pos = MAP_APPFONT ( 12 , 62 ) ;
        Size = MAP_APPFONT ( 39 , 10 ) ;
        Text = "da~hinter" ;
        Text [ ENGLISH ] = "~behind" ;
        Text [ norwegian ] = "~bak" ;
        Text [ italian ] = "~Dietro" ;
        Text [ portuguese_brazilian ] = "~atrás" ;
        Text [ portuguese ] = "~atrás" ;
        Text [ finnish ] = "~jälkeen" ;
        Text [ danish ] = "efter" ;
        Text [ french ] = "~Après" ;
        Text [ swedish ] = "~bakom" ;
        Text [ dutch ] = "e~rachter" ;
        Text [ spanish ] = "de~trás" ;
        Text [ english_us ] = "A~fter" ;
        TabStop = TRUE ;
        Check = TRUE ;
        Text[ chinese_simplified ] = "Ö®ºó(~F)";
        Text[ russian ] = "ïîñëå";
        Text[ polish ] = "za";
        Text[ japanese ] = "Œã‚Å(~F)";
        Text[ chinese_traditional ] = "¤§«á(~F)";
        Text[ arabic ] = "ÈÚÏ";
        Text[ greek ] = "ìåôÜ áðü";
        Text[ korean ] = "ÀÌÈÄ(~F)";
        Text[ turkish ] = "ar~kasýna";
        Text[ language_user1 ] = " ";
    };
    NumericField ED_COUNT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 39 , 14 ) ;
        Size = MAP_APPFONT ( 24 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 1 ;
        Maximum = 99 ;
        Value = 1 ;
        First = 1 ;
        Last = 5 ;
    };
    GroupBox GB_INS
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 63 , 32 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? Einfügen : Einf³gen */
        Text = "Einfügen" ;
        Text [ ENGLISH ] = "Insert" ;
        Text [ norwegian ] = "Sett inn" ;
        Text [ italian ] = "Inserisci" ;
        Text [ portuguese_brazilian ] = "Inserir" ;
        Text [ portuguese ] = "Inserir" ;
        Text [ finnish ] = "Lisää" ;
        Text [ danish ] = "Indsæt" ;
        Text [ french ] = "Insérer" ;
        Text [ swedish ] = "Infoga" ;
        Text [ dutch ] = "Invoegen" ;
        Text [ spanish ] = "Insertar" ;
        Text [ english_us ] = "Insert" ;
        Text[ chinese_simplified ] = "²åÈë";
        Text[ russian ] = "Âñòàâèòü";
        Text[ polish ] = "Wstaw";
        Text[ japanese ] = "‘}“ü";
        Text[ chinese_traditional ] = "´¡¤J";
        Text[ arabic ] = "ÅÏÑÇÌ";
        Text[ greek ] = "ÅéóáãùãÞ";
        Text[ korean ] = "»ðÀÔ";
        Text[ turkish ] = "Ekle";
        Text[ language_user1 ] = " ";
    };
    GroupBox GB_POS
    {
        Pos = MAP_APPFONT ( 6 , 38 ) ;
        Size = MAP_APPFONT ( 63 , 40 ) ;
        Text = "Position" ;
    };
    FixedText FT_COUNT
    {
        Pos = MAP_APPFONT ( 12 , 16 ) ;
        Size = MAP_APPFONT ( 24 , 8 ) ;
        Text = "~Anzahl" ;
        Text [ ENGLISH ] = "~Amount" ;
        Text [ norwegian ] = "~Beløp" ;
        Text [ italian ] = "Numero" ;
        Text [ portuguese_brazilian ] = "~Quantidade" ;
        Text [ portuguese ] = "~Quantidade" ;
        Text [ finnish ] = "~Määrä" ;
        Text [ danish ] = "Antal" ;
        Text [ french ] = "~Nombre" ;
        Text [ swedish ] = "~Antal" ;
        Text [ dutch ] = "~Aantal" ;
        Text [ spanish ] = "~Cantidad" ;
        Text [ english_us ] = "~Amount" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "ÊýÄ¿(~A)";
        Text[ russian ] = "×èñëî";
        Text[ polish ] = "Liczba";
        Text[ japanese ] = "‘”(~A)";
        Text[ chinese_traditional ] = "¼Æ¥Ø(~A)";
        Text[ arabic ] = "ÇáÚÏÏ";
        Text[ greek ] = "~Áñéèìüò";
        Text[ korean ] = "¾ç(~A)";
        Text[ turkish ] = "~Adet";
        Text[ language_user1 ] = " ";
    };
    String STR_ROW
    {
        Text = " Zeilen" ;
        Text [ ENGLISH ] = " rows" ;
        Text [ norwegian ] = " rader" ;
        Text [ italian ] = "righe" ;
        Text [ portuguese_brazilian ] = "fileiras" ;
        Text [ portuguese ] = "Linhas" ;
        Text [ finnish ] = " rivejä" ;
        Text [ danish ] = "rækker" ;
        Text [ french ] = "~Lignes" ;
        Text [ swedish ] = "rader" ;
        Text [ dutch ] = "Rijen" ;
        Text [ spanish ] = "Filas" ;
        Text [ english_us ] = "Rows" ;
        Text[ chinese_simplified ] = "ÐÐ";
        Text[ russian ] = "Ñòðîêè";
        Text[ polish ] = "Wiersze";
        Text[ japanese ] = "s";
        Text[ chinese_traditional ] = "¦æ";
        Text[ arabic ] = "ÕÝæÝ";
        Text[ greek ] = "ÃñáììÝò";
        Text[ korean ] = "Çà";
        Text[ turkish ] = "Satýr";
        Text[ language_user1 ] = " ";
    };
    String STR_COL
    {
        Text = " Spalten" ;
        Text [ ENGLISH ] = " columns" ;
        Text [ norwegian ] = " kolonner" ;
        Text [ italian ] = "Colonne" ;
        Text [ portuguese_brazilian ] = "colunas" ;
        Text [ portuguese ] = "Colunas" ;
        Text [ finnish ] = " sarakkeita" ;
        Text [ danish ] = "kolonner" ;
        Text [ french ] = "Colonnes" ;
        Text [ swedish ] = "kolumner" ;
        Text [ dutch ] = "Kolommen" ;
        Text [ spanish ] = "Columnas" ;
        Text [ english_us ] = "Columns" ;
        Text[ chinese_simplified ] = "À¸";
        Text[ russian ] = "Êîëîíêè";
        Text[ polish ] = "Kolumny";
        Text[ japanese ] = "—ñ";
        Text[ chinese_traditional ] = "Äæ";
        Text[ arabic ] = "ÃÚãÏÉ";
        Text[ greek ] = "ÓôÞëåò";
        Text[ korean ] = "¿­";
        Text[ turkish ] = "Sütun";
        Text[ language_user1 ] = " ";
    };
    Text[ chinese_simplified ] = "²åÈë";
    Text[ russian ] = "Âñòàâèòü";
    Text[ polish ] = "Wstaw";
    Text[ japanese ] = "‘}“ü";
    Text[ chinese_traditional ] = "´¡¤J";
    Text[ arabic ] = "ÅÏÑÇÌ";
    Text[ greek ] = "ÅéóáãùãÞ";
    Text[ korean ] = "»ðÀÔ";
    Text[ turkish ] = "Ekle";
    Text[ language_user1 ] = " ";
};
diff --git a/sw/source/ui/table/instable.cxx b/sw/source/ui/table/instable.cxx
new file mode 100644
index 0000000..84c4cc3
--- /dev/null
+++ b/sw/source/ui/table/instable.cxx
@@ -0,0 +1,308 @@
/*************************************************************************
 *
 *  $RCSfile: instable.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:47 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SV_MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif

#include "wrtsh.hxx"
#include "view.hxx"
#include "itabenum.hxx"
#include "instable.hxx"
#include "tautofmt.hxx"
#include "tblafmt.hxx"
#include "modcfg.hxx"
#include "swmodule.hxx"
#ifndef _SVX_HTMLMODE_HXX //autogen
#include <svx/htmlmode.hxx>
#endif
#ifndef _VIEWOPT_HXX
#include <viewopt.hxx>
#endif

#include "table.hrc"
#include "instable.hrc"

#define ROW_COL_PROD 16384

void SwInsTableDlg::GetValues( String& rName, USHORT& rRow, USHORT& rCol,
                                USHORT& rInsTblFlags,
                                SwTableAutoFmt *& prTAFmt )
{
    rName = aNameEdit.GetText();
    rRow = (USHORT)aRowEdit.GetValue();
    rCol = (USHORT)aColEdit.GetValue();

    rInsTblFlags = 0;
    if (aBorderCB.IsChecked())
        rInsTblFlags |= DEFAULT_BORDER;
    if (aHeaderCB.IsChecked())
        rInsTblFlags |= HEADLINE;
    if (aRepeatHeaderCB.IsEnabled() && aRepeatHeaderCB.IsChecked())
        rInsTblFlags |= REPEAT;
    if (!aDontSplitCB.IsChecked())
        rInsTblFlags |= SPLIT_LAYOUT;
    if( pTAutoFmt )
        prTAFmt = new SwTableAutoFmt( *pTAutoFmt );
}

// CTOR / DTOR -----------------------------------------------------------


SwInsTableDlg::SwInsTableDlg( SwView& rView )
    : SfxModalDialog( rView.GetWindow(), SW_RES(DLG_INSERT_TABLE) ),
    aNameEdit       (this, SW_RES(ED_NAME)),
    aNameFrm        (this, SW_RES(GB_NAME)),
    aColLbl         (this, SW_RES(FT_COL)),
    aColEdit        (this, SW_RES(ED_COL)),
    aRowLbl         (this, SW_RES(FT_ROW)),
    aRowEdit        (this, SW_RES(ED_ROW)),
    aFrm            (this, SW_RES(GB_TABLE)),
    aHeaderCB       (this, SW_RES(CB_HEADER)),
    aRepeatHeaderCB (this, SW_RES(CB_REPEAT_HEADER)),
    aDontSplitCB    (this, SW_RES(CB_DONT_SPLIT)),
    aBorderCB       (this, SW_RES(CB_BORDER)),
    aOptionsGB      (this, SW_RES(GB_OPTIONS)),
    aOkBtn          (this, SW_RES(BT_OK)),
    aCancelBtn      (this, SW_RES(BT_CANCEL)),
    aHelpBtn        (this, SW_RES(BT_HELP)),
    aAutoFmtBtn     (this, SW_RES(BT_AUTOFORMAT)),
    pTAutoFmt( 0 ),
    pShell(&rView.GetWrtShell())
{
    FreeResource();
    aNameEdit.SetText(pShell->GetUniqueTblName());
    aNameEdit.SetModifyHdl(LINK(this, SwInsTableDlg, ModifyName));
    aColEdit.SetModifyHdl(LINK(this, SwInsTableDlg, ModifyRowCol));
    aRowEdit.SetModifyHdl(LINK(this, SwInsTableDlg, ModifyRowCol));

    aRowEdit.SetMax(ROW_COL_PROD/aColEdit.GetValue());
    aColEdit.SetMax(ROW_COL_PROD/aRowEdit.GetValue());
    aAutoFmtBtn.SetClickHdl(LINK(this, SwInsTableDlg, AutoFmtHdl));

    BOOL bHTMLMode = 0 != (::GetHtmlMode(rView.GetDocShell())&HTMLMODE_ON);
    const SwModuleOptions* pModOpt = SW_MOD()->GetModuleConfig();

    USHORT nInsTblFlags = pModOpt->GetInsTblFlags(bHTMLMode);

    aHeaderCB.Check(nInsTblFlags & HEADLINE);
    aRepeatHeaderCB.Check(nInsTblFlags & REPEAT);
    aDontSplitCB.Check(!(nInsTblFlags & SPLIT_LAYOUT));
    aBorderCB.Check(nInsTblFlags & DEFAULT_BORDER);

    aHeaderCB.SetClickHdl(LINK(this, SwInsTableDlg, CheckBoxHdl));
    CheckBoxHdl();
}

SwInsTableDlg::~SwInsTableDlg()
{
    delete pTAutoFmt;
}

IMPL_LINK_INLINE_START( SwInsTableDlg, ModifyName, Edit *, pEdit )
{
    String sTblName = pEdit->GetText();
    if(sTblName.Search(' ') != STRING_NOTFOUND)
    {
        sTblName.EraseAllChars( );
        pEdit->SetText(sTblName);
    }

    aOkBtn.Enable(pShell->GetTblStyle( sTblName ) == 0);
    return 0;
}
IMPL_LINK_INLINE_END( SwInsTableDlg, ModifyName, Edit *, EMPTYARG )

/*-----------------15.04.98 11:36-------------------

--------------------------------------------------*/
IMPL_LINK( SwInsTableDlg, ModifyRowCol, NumericField *, pField )
{
    if(pField == &aColEdit)
    {
        long nCol = aColEdit.GetValue();
        aRowEdit.SetMax(ROW_COL_PROD/nCol);
    }
    else
    {
        long nRow = aRowEdit.GetValue();
        aColEdit.SetMax(ROW_COL_PROD/nRow);
    }
    return 0;
}

IMPL_LINK( SwInsTableDlg, AutoFmtHdl, PushButton*, pButton )
{
    SwAutoFormatDlg aDlg( pButton, pShell, FALSE, pTAutoFmt );
    if( RET_OK == aDlg.Execute())
        aDlg.FillAutoFmtOfIndex( pTAutoFmt );
    return 0;
}

/*********************************************************************/
/*                                                                   */
/*********************************************************************/

IMPL_LINK(SwInsTableDlg, CheckBoxHdl, CheckBox*, EMPTYARG)
{
    aRepeatHeaderCB.Enable(aHeaderCB.IsChecked());

    return 0;
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.49  2000/09/18 16:06:08  willem.vandorp
    OpenOffice header added.

    Revision 1.48  2000/02/11 14:58:35  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.47  1999/02/17 07:39:44  OS
    #58158# Einfuegen TabPage auch in HTML-Docs


      Rev 1.46   17 Feb 1999 08:39:44   OS
   #58158# Einfuegen TabPage auch in HTML-Docs

      Rev 1.45   02 Dec 1998 15:29:26   OM
   #59770# Tabellenueberschrift nur auf erster Seite

      Rev 1.44   30 Nov 1998 17:33:40   OM
   #59770# Tabellenoptionen: Ueberschrift nur auf erster Seite

      Rev 1.43   11 Nov 1998 16:51:58   OM
   #58158# Einfuegeoptionen fuer Tabellen

      Rev 1.42   29 May 1998 18:55:32   JP
   SS vom TableAutoFormatDialog hat sich geaendert

      Rev 1.41   28 May 1998 11:48:08   OS
   Leerzeichen auch aus dem Clipboard abfangen #50497#

      Rev 1.40   12 May 1998 23:42:44   JP
   neu: InserTable/TextToTable mit optionalen AutoFormat

      Rev 1.39   24 Apr 1998 17:25:26   OS
   Min/Max schon initial setzen

      Rev 1.38   15 Apr 1998 14:30:44   OS
   Zeilen/Spaltenzahl nur noch durch max. Zellenzahl begrenzt #49479#

      Rev 1.37   24 Nov 1997 15:52:22   MA
   includes

      Rev 1.36   03 Nov 1997 13:56:50   MA
   precomp entfernt

      Rev 1.35   06 Aug 1997 14:43:50   TRI
   VCL: GetpApp() statt pApp

      Rev 1.34   11 Nov 1996 11:20:14   MA
   ResMgr

      Rev 1.33   02 Oct 1996 19:06:06   MA
   Umstellung Enable/Disable

      Rev 1.32   28 Aug 1996 14:33:16   OS
   includes

      Rev 1.31   26 Jun 1996 15:25:20   OS
   Aufruf von Dispatcher.Execute an 324 angepasst

      Rev 1.30   22 Mar 1996 14:16:32   HJS
   umstellung 311

      Rev 1.29   06 Feb 1996 15:21:22   JP
   Link Umstellung 305

      Rev 1.28   24 Nov 1995 16:58:58   OM
   PCH->PRECOMPILED

      Rev 1.27   10 Nov 1995 15:26:46   OS
   Execute mit 0L abschliessen

      Rev 1.26   08 Nov 1995 13:34:40   OS
   Change => Set

      Rev 1.25   08 Nov 1995 07:12:18   OS
   Klammern verschoben

      Rev 1.24   07 Nov 1995 18:08:40   OS
   InsertTable ohne Manager, ausf. ueber Slot

      Rev 1.23   18 Oct 1995 10:12:54   OM
   Helpbutton fuer >Tabelle einfuegen<

      Rev 1.22   13 Sep 1995 17:09:44   OS
   Recording ausgeweitet

------------------------------------------------------------------------*/



diff --git a/sw/source/ui/table/instable.hrc b/sw/source/ui/table/instable.hrc
new file mode 100644
index 0000000..ead7f91
--- /dev/null
+++ b/sw/source/ui/table/instable.hrc
@@ -0,0 +1,78 @@
/*************************************************************************
 *
 *  $RCSfile: instable.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:47 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#define FT_COL              1
#define FT_ROW              2
#define ED_COL              4
#define ED_ROW              5
#define GB_TABLE            10
#define ED_NAME             11
#define GB_NAME             12
#define CB_HEADER           13
#define CB_REPEAT_HEADER    14
#define CB_DONT_SPLIT       15
#define CB_BORDER           16
#define GB_OPTIONS          17

#define BT_OK               20
#define BT_CANCEL           21
#define BT_HELP             22
#define BT_AUTOFORMAT       23
diff --git a/sw/source/ui/table/instable.src b/sw/source/ui/table/instable.src
new file mode 100644
index 0000000..3730294
--- /dev/null
+++ b/sw/source/ui/table/instable.src
@@ -0,0 +1,430 @@
/*************************************************************************
 *
 *  $RCSfile: instable.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:48 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "table.hrc"
#include "instable.hrc"
#include "cmdid.h"
#include "helpid.h"
 // #define DLG_INSERT_TABLE 256
ModalDialog DLG_INSERT_TABLE
{
    HelpID = FN_INSERT_TABLE ;
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 260 , 110 ) ;
    /* ### ACHTUNG: Neuer Text in Resource? Tabelle einfügen : Tabelle einf³gen */
    Text = "Tabelle einfügen" ;
    Text [ ENGLISH ] = "Insert table" ;
    Text [ norwegian ] = "Insert table" ;
    Text [ italian ] = "Inserisci tabella" ;
    Text [ portuguese_brazilian ] = "Insere uma tabela" ;
    Text [ portuguese ] = "Inserir tabela" ;
    Text [ finnish ] = "Lisää taulukon" ;
    Text [ danish ] = "Indsæt tabel" ;
    Text [ french ] = "Insérer un tableau" ;
    Text [ swedish ] = "Infoga tabell" ;
    Text [ dutch ] = "Tabel invoegen" ;
    Text [ spanish ] = "Insertar tabla" ;
    Text [ english_us ] = "Insert Table" ;
    Moveable = TRUE ;
    Edit ED_NAME
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 12 , 14 ) ;
        Size = MAP_APPFONT ( 179, 12 ) ;
        TabStop = TRUE ;
    };
    GroupBox GB_NAME
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 191, 30 ) ;
        Text = "Name" ;
        Text[ENGLISH] = "Name" ;
            Text[ italian ] = "Nome";
        Text[ portuguese_brazilian ] = "Name";
        Text[ portuguese ] = "Nome";
        Text[ danish ] = "Navn";
        Text[ french ] = "Nom";
        Text[ swedish ] = "Namn";
        Text[ dutch ] = "Naam";
        Text[ spanish ] = "Nombre";
        Text[ english_us ] = "Name";
        Text[ chinese_simplified ] = "Ãû³Æ";
        Text[ russian ] = "Èìÿ";
        Text[ polish ] = "Nazwa";
        Text[ japanese ] = "–¼‘O";
        Text[ chinese_traditional ] = "¦WºÙ";
        Text[ arabic ] = "ÇáÇÓã";
        Text[ greek ] = "¼íïìá";
        Text[ korean ] = "À̸§";
        Text[ turkish ] = "Ad";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_COL
    {
        Pos = MAP_APPFONT ( 11 , 49 ) ;
        Size = MAP_APPFONT ( 39 , 10 ) ;
        Text = "~Spalten" ;
        Text [ ENGLISH ] = "~Columns" ;
        Text [ norwegian ] = "~Columns" ;
        Text [ italian ] = "~Colonne" ;
        Text [ portuguese_brazilian ] = "~Colunas" ;
        Text [ portuguese ] = "~Colunas" ;
        Text [ finnish ] = "~Sarakkeet" ;
        Text [ danish ] = "Kolonner" ;
        Text [ french ] = "~Colonnes" ;
        Text [ swedish ] = "Kolumner" ;
        Text [ dutch ] = "~Kolommen" ;
        Text [ spanish ] = "~Columnas" ;
        Text [ english_us ] = "~Columns" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "À¸(~C)";
        Text[ russian ] = "Êîëîíêè";
        Text[ polish ] = "Kolumny";
        Text[ japanese ] = "‰¡(~C)";
        Text[ chinese_traditional ] = "Äæ(~C)";
        Text[ arabic ] = "ÃÚãÏÉ";
        Text[ greek ] = "ÓôÞëåò";
        Text[ korean ] = "¿­(~C)";
        Text[ turkish ] = "~Sütun";
        Text[ language_user1 ] = " ";
    };
    NumericField ED_COL
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 53 , 47 ) ;
        Size = MAP_APPFONT ( 28 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 1 ;
        Maximum = 99 ;
        Value = 5 ;
        First = 1 ;
        Last = 99 ;
    };
    FixedText FT_ROW
    {
        Pos = MAP_APPFONT ( 11 , 69 ) ;
        Size = MAP_APPFONT ( 39 , 10 ) ;
        Text = "~Zeilen" ;
        Text [ ENGLISH ] = "~Rows" ;
        Text [ norwegian ] = "~Rows" ;
        Text [ italian ] = "~Righe" ;
        Text [ portuguese_brazilian ] = "Filei~ras" ;
        Text [ portuguese ] = "~Linhas" ;
        Text [ finnish ] = "~Rivit" ;
        Text [ danish ] = "Rækker" ;
        Text [ french ] = "~Lignes" ;
        Text [ swedish ] = "~Rader" ;
        Text [ dutch ] = "~Rijen" ;
        Text [ spanish ] = "~Filas" ;
        Text [ english_us ] = "~Rows" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "ÐÐ(~R)";
        Text[ russian ] = "Ñòðîêè";
        Text[ polish ] = "Wiersze";
        Text[ japanese ] = "c(~Rj";
        Text[ chinese_traditional ] = "¦æ(~R)";
        Text[ arabic ] = "ÕÝæÝ";
        Text[ greek ] = "ÃñáììÝò";
        Text[ korean ] = "Çà(~R)";
        Text[ turkish ] = "Sa~týr";
        Text[ language_user1 ] = " ";
    };
    NumericField ED_ROW
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 53 , 67 ) ;
        Size = MAP_APPFONT ( 28 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 1 ;
        Maximum = 99 ;
        Value = 2 ;
        First = 1 ;
        Last = 99 ;
    };
    GroupBox GB_TABLE
    {
        Pos = MAP_APPFONT ( 6 , 36 ) ;
        Size = MAP_APPFONT ( 81 , 68 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? Größe : Gr÷˜e */
        Text = "Größe" ;
        Text [ ENGLISH ] = "Size" ;
        Text [ norwegian ] = "Størrelse" ;
        Text [ italian ] = "Dimensione" ;
        Text [ portuguese_brazilian ] = "Tamanho" ;
        Text [ portuguese ] = "Tamanho" ;
        Text [ finnish ] = "Koko" ;
        Text [ danish ] = "Størrelse" ;
        Text [ french ] = "Taille" ;
        Text [ swedish ] = "Storlek" ;
        Text [ dutch ] = "Grootte" ;
        Text [ spanish ] = "Tamaño" ;
        Text [ english_us ] = "Size" ;
        Text[ chinese_simplified ] = "´óС";
        Text[ russian ] = "Ðàçìåð";
        Text[ polish ] = "Rozmiar";
        Text[ japanese ] = "»²½Þ";
        Text[ chinese_traditional ] = "¤j¤p";
        Text[ arabic ] = "ÇáÍÌã";
        Text[ greek ] = "ÌÝãåèïò";
        Text[ korean ] = "Å©±â";
        Text[ turkish ] = "Boyut";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_HEADER
    {
        Pos = MAP_APPFONT ( 99 , 49 ) ;
        Size = MAP_APPFONT ( 93 , 10 ) ;
        Text = "Übe~rschrift" ;
        Text [ ENGLISH ] = "Header" ;
        TabStop = TRUE ;
        Text[ italian ] = "Intestazione";
        Text[ portuguese_brazilian ] = "Header";
        Text[ portuguese ] = "~Título";
        Text[ danish ] = "Overskrift";
        Text[ french ] = "T~itre";
        Text[ swedish ] = "~Överskrift";
        Text[ dutch ] = "~Kop";
        Text[ spanish ] = "~Encabezado";
        Text[ english_us ] = "Header";
        Text[ chinese_simplified ] = "±êÌâ";
        Text[ russian ] = "Çàãîëîâîê";
        Text[ polish ] = "Tytu³";
        Text[ japanese ] = "Œ©o‚µ";
        Text[ chinese_traditional ] = "¼ÐÃD";
        Text[ arabic ] = "ÇáÚäæÇä";
        Text[ greek ] = "Åðéêåöáëßäá";
        Text[ korean ] = "¸Ó¸®±Û";
        Text[ turkish ] = "Baþlýk";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_REPEAT_HEADER
    {
        Pos = MAP_APPFONT ( 109 , 62 ) ;
        Size = MAP_APPFONT ( 83 , 10 ) ;
        Text = "Auf jeder Seite ~wiederholen" ;
        Text [ ENGLISH ] = "Repeat on every page" ;
        TabStop = TRUE ;
        Text[ italian ] = "Ripeti su ogni pagina";
        Text[ portuguese_brazilian ] = "Repeat Header";
        Text[ portuguese ] = "Repetir em to~das as páginas";
        Text[ danish ] = "Gentag på hver side";
        Text[ french ] = "R~épéter sur chaque page";
        Text[ swedish ] = "~Upprepa på varje sida";
        Text[ dutch ] = "Op iedere pagina ~herhalen";
        Text[ spanish ] = "~Repetir en cada página";
        Text[ english_us ] = "Re~peat header";
        Text[ chinese_simplified ] = "ÔÚÿҳÉÏÖØ¸´ÏÔʾ";
        Text[ russian ] = "Ïîâòîð íà êàæäîé ñòðàíèöå";
        Text[ polish ] = "Powtórz na ~ka¿dej stronie";
        Text[ japanese ] = "ŠeÍß°¼Þ‚ÉŒJ‚è•Ô‚µ";
        Text[ chinese_traditional ] = "¦b¨C­¶¤W­«½ÆÅã¥Ü";
        Text[ arabic ] = "ÊßÑÇÑ Ýí ßá ÕÝÍÉ";
        Text[ greek ] = "ÅðáíÜëç~øç óå êÜèå óåëßäá";
        Text[ korean ] = "¸Ó¸®±Û ¹Ýº¹(~P)";
        Text[ turkish ] = "Ýlk satýrý her sayfada yi~nele";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_DONT_SPLIT
    {
        Pos = MAP_APPFONT ( 99 , 75 ) ;
        Size = MAP_APPFONT ( 93 , 10 ) ;
        Text = "Tabelle ~nicht trennen" ;
        Text [ ENGLISH ] = "Don't split table" ;
        TabStop = TRUE ;
        Text[ italian ] = "Non separare la tabella";
        Text[ portuguese_brazilian ] = "Don't split table";
        Text[ portuguese ] = "Não ~dividir tabela";
        Text[ danish ] = "Opdel tabel ikke";
        Text[ french ] = "Pas de c~oupure de tableau";
        Text[ swedish ] = "Dela i~nte tabell";
        Text[ dutch ] = "Tabel niet ~splitsen";
        Text[ spanish ] = "~No dividir tabla";
        Text[ english_us ] = "Don't split table";
        Text[ chinese_simplified ] = "²»·Ö¸ô±í¸ñ";
        Text[ russian ] = "Íå ðàçáèâàòü òàáëèöó";
        Text[ polish ] = "Nie dziel tabeli";
        Text[ japanese ] = "•\\‚𕪊„‚µ‚È‚¢";
        Text[ chinese_traditional ] = "¤£¤À¶}ªí®æ";
        Text[ arabic ] = "ÚÏã ÝÕá ÇáÌÏæá";
        Text[ greek ] = "Íá ìç äéáéñåèåß ï ðßíáêáò";
        Text[ korean ] = "Ç¥¸¦ Âɰ³Áö ¸¶½Ê½Ã¿À.";
        Text[ turkish ] = "Tabloyu tek sayfaya  ~sýðdýr";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_BORDER
    {
        Pos = MAP_APPFONT ( 99 , 88 ) ;
        Size = MAP_APPFONT ( 93 , 10 ) ;
        Text = "~Umrandung" ;
        Text [ ENGLISH ] = "Border" ;
        TabStop = TRUE ;
        Text[ italian ] = "Bordo";
        Text[ portuguese_brazilian ] = "Border";
        Text[ portuguese ] = "~Contornos";
        Text[ danish ] = "Ramme";
        Text[ french ] = "~Bordure";
        Text[ swedish ] = "Inra~mning";
        Text[ dutch ] = "~Omranding";
        Text[ spanish ] = "~Borde";
        Text[ english_us ] = "Border";
        Text[ chinese_simplified ] = "±ß¿ò";
        Text[ russian ] = "Îáðàìëåíèå";
        Text[ polish ] = "Obramowanie";
        Text[ japanese ] = "ŠO˜g";
        Text[ chinese_traditional ] = "Ã䮨";
        Text[ arabic ] = "ÇáÍÏæÏ";
        Text[ greek ] = "Ðåñßãñáììá";
        Text[ korean ] = "¿Ü°û¼±";
        Text[ turkish ] = "~Kenarlýk";
        Text[ language_user1 ] = " ";
    };
    GroupBox GB_OPTIONS
    {
        Pos = MAP_APPFONT ( 93 , 36 ) ;
        Size = MAP_APPFONT ( 105 , 68 ) ;
        Text = "Optionen" ;
        Text [ English ] = "Options" ;
        Text[ italian ] = "Opzioni";
        Text[ portuguese_brazilian ] = "Options";
        Text[ portuguese ] = "Opções";
        Text[ danish ] = "Indstillinger";
        Text[ french ] = "Options";
        Text[ swedish ] = "Alternativ";
        Text[ dutch ] = "Opties";
        Text[ spanish ] = "Opciones";
        Text[ english_us ] = "Options";
        Text[ chinese_simplified ] = "Ñ¡Ïî";
        Text[ russian ] = "Ïàðàìåòðû";
        Text[ polish ] = "Opcje";
        Text[ japanese ] = "µÌß¼®Ý";
        Text[ chinese_traditional ] = "¿ï¶µ";
        Text[ arabic ] = "ÎíÇÑÇÊ";
        Text[ greek ] = "ÅðéëïãÝò";
        Text[ korean ] = "¿É¼Ç";
        Text[ turkish ] = "Seçenekler";
        Text[ language_user1 ] = " ";
    };
    OKButton BT_OK
    {
        Pos = MAP_APPFONT ( 204 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        DefButton = TRUE ;
    };
    CancelButton BT_CANCEL
    {
        Pos = MAP_APPFONT ( 204 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    HelpButton BT_HELP
    {
        Pos = MAP_APPFONT ( 204 , 43 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    PushButton BT_AUTOFORMAT
    {
        Pos = MAP_APPFONT ( 204 , 60 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        Text = "~Autoformat..." ;
        Text [ ENGLISH ] = "Autoformat..." ;
        Text [ norwegian ] = "Autoformat..." ;
        Text [ italian ] = "~Formatt. auto..." ;
        Text [ portuguese_brazilian ] = "Formatação Automática..." ;
        Text [ portuguese ] = "~AutoFormato..." ;
        Text [ finnish ] = "Automaattimuoto..." ;
        Text [ danish ] = "AutoFormat..." ;
        Text [ french ] = "~AutoFormat..." ;
        Text [ swedish ] = "AutoFormat..." ;
        Text [ dutch ] = "~AutoOpmaak..." ;
        Text [ spanish ] = "Auto~Formato..." ;
        Text [ english_us ] = "Auto~Format..." ;
        Text[ chinese_simplified ] = "×Ô¶¯¸ñʽ(~F)...";
        Text[ russian ] = "Àâòîôîðìàò...";
        Text[ polish ] = "Autoformat...";
        Text[ japanese ] = "µ°ÄÌ«°Ï¯Ä(~F)...";
        Text[ chinese_traditional ] = "¦Û°Ê®æ¦¡(~F)...";
        Text[ arabic ] = "ÊäÓíÞ ÊáÞÇÆí...";
        Text[ greek ] = "ÁõôïÌïñöïðïßçóç...";
        Text[ korean ] = "ÀÚµ¿ ¼­½Ä(~F)...";
        Text[ turkish ] = "~Otom. formatlama...";
        Text[ language_user1 ] = " ";
    };
    Text[ chinese_simplified ] = "²åÈë±í¸ñ";
    Text[ russian ] = "Âñòàâèòü òàáëèöó";
    Text[ polish ] = "Wstaw tabelê";
    Text[ japanese ] = "•\\‚Ì‘}“ü";
    Text[ chinese_traditional ] = "´¡¤Jªí®æ";
    Text[ arabic ] = "ÅÏÑÇÌ ÌÏæá";
    Text[ greek ] = "ÅéóáãùãÞ ðßíáêá";
    Text[ korean ] = "»ðÀÔ Ç¥";
    Text[ turkish ] = "Tablo ekle";
    Text[ language_user1 ] = " ";
};
diff --git a/sw/source/ui/table/makefile.mk b/sw/source/ui/table/makefile.mk
new file mode 100644
index 0000000..97e0500
--- /dev/null
+++ b/sw/source/ui/table/makefile.mk
@@ -0,0 +1,127 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:48 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=..$/..$/..

PRJNAME=sw
TARGET=table

AUTOSEG=true

PROJECTPCH=ui_pch
PDBTARGET=ui_pch
PROJECTPCHSOURCE=..\ui_1st\ui_pch

# --- Settings -----------------------------------------------------

.INCLUDE :  $(PRJ)$/inc$/swpre.mk
.INCLUDE :  settings.mk
.INCLUDE :  $(PRJ)$/inc$/sw.mk

# --- Files --------------------------------------------------------

CXXFILES = \
        colwd.cxx \
        convert.cxx \
        chartins.cxx \
        insrc.cxx \
        instable.cxx \
        mergetbl.cxx \
        rowht.cxx \
        split.cxx \
        splittbl.cxx \
        tabledlg.cxx \
        tablemgr.cxx \
        tautofmt.cxx

SRCFILES =  \
        colwd.src \
        convert.src \
        chartins.src \
        insrc.src \
        instable.src \
        mergetbl.src \
        rowht.src \
        split.src \
        splittbl.src \
        table.src \
        tabledlg.src \
        tautofmt.src

SLOFILES =  \
        $(SLO)$/colwd.obj \
        $(SLO)$/convert.obj \
        $(SLO)$/chartins.obj \
        $(SLO)$/insrc.obj \
        $(SLO)$/instable.obj \
        $(SLO)$/mergetbl.obj \
        $(SLO)$/rowht.obj \
        $(SLO)$/split.obj \
        $(SLO)$/splittbl.obj \
        $(SLO)$/tabledlg.obj \
        $(SLO)$/tablemgr.obj \
        $(SLO)$/tautofmt.obj

# --- Tagets -------------------------------------------------------

.INCLUDE :  target.mk

diff --git a/sw/source/ui/table/mergetbl.cxx b/sw/source/ui/table/mergetbl.cxx
new file mode 100644
index 0000000..b84a3a7
--- /dev/null
+++ b/sw/source/ui/table/mergetbl.cxx
@@ -0,0 +1,119 @@
/*************************************************************************
 *
 *  $RCSfile: mergetbl.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:48 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _MERGETBL_HXX
#include <mergetbl.hxx>
#endif
#ifndef _MERGETBL_HRC
#include <mergetbl.hrc>
#endif
#ifndef _TABLE_HRC
#include <table.hrc>
#endif


SwMergeTblDlg::SwMergeTblDlg( Window *pParent, BOOL& rWithPrev )
    : SvxStandardDialog(pParent, SW_RES(DLG_MERGE_TABLE)),
    aOKPB(                  this, ResId(PB_OK       )),
    aCancelPB(              this, ResId(PB_CANCEL   )),
    aHelpPB(                this, ResId(PB_HELP     )),
    aMergeGB(               this, ResId(GB_MERGE    )),
    aMergePrevRB(           this, ResId(RB_MERGE_PREV)),
    aMergeNextRB(           this, ResId(RB_MERGE_NEXT)),
    rMergePrev(             rWithPrev )
{
    FreeResource();
    aMergePrevRB.Check();
}

void SwMergeTblDlg::Apply()
{
    rMergePrev = aMergePrevRB.IsChecked();
}


/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.3  2000/09/18 16:06:08  willem.vandorp
    OpenOffice header added.

    Revision 1.2  1999/02/18 08:43:26  JP
    Task #61764#: neu: Tabellen zusammenfassen


      Rev 1.1   18 Feb 1999 09:43:26   JP
   Task #61764#: neu: Tabellen zusammenfassen

      Rev 1.0   17 Feb 1999 21:12:06   JP
   Task #61764#: neu: Tabellen zusammenfassen

------------------------------------------------------------------------*/

diff --git a/sw/source/ui/table/mergetbl.hrc b/sw/source/ui/table/mergetbl.hrc
new file mode 100644
index 0000000..34376e0
--- /dev/null
+++ b/sw/source/ui/table/mergetbl.hrc
@@ -0,0 +1,66 @@
/*************************************************************************
 *
 *  $RCSfile: mergetbl.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:48 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#define PB_OK           1
#define PB_CANCEL       2
#define PB_HELP         3
#define GB_MERGE        4
#define RB_MERGE_PREV   5
#define RB_MERGE_NEXT   6
diff --git a/sw/source/ui/table/mergetbl.src b/sw/source/ui/table/mergetbl.src
new file mode 100644
index 0000000..9c12d56
--- /dev/null
+++ b/sw/source/ui/table/mergetbl.src
@@ -0,0 +1,193 @@
/*************************************************************************
 *
 *  $RCSfile: mergetbl.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:48 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "table.hrc"
#include "mergetbl.hrc"
#include "cmdid.h"
#include "helpid.h"
ModalDialog DLG_MERGE_TABLE
{
    HelpID = FN_TABLE_MERGE_TABLE ;
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 207 , 57 ) ;
    Text = "Tabellen verbinden" ;
    Text [ ENGLISH ] = "Join tables" ;
    Moveable = TRUE ;
    OKButton PB_OK
    {
        Pos = MAP_APPFONT ( 151 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        DefButton = TRUE ;
    };
    CancelButton PB_CANCEL
    {
        Pos = MAP_APPFONT ( 151 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    HelpButton PB_HELP
    {
        Pos = MAP_APPFONT ( 151 , 40 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    GroupBox GB_MERGE
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 139 , 51 ) ;
        Text = "Modus" ;
        Text [ ENGLISH ] = "Mode" ;
        Text [ english_us ] = "Mode" ;
        Text [ portuguese_brazilian ] = "Modus" ;
        Text [ swedish ] = "Läge" ;
        Text [ danish ] = "Modus" ;
        Text [ italian ] = "Modo" ;
        Text [ spanish ] = "Modo" ;
        Text [ french ] = "Mode" ;
        Text [ dutch ] = "Modus" ;
        Text [ portuguese ] = "Modo" ;
        Text[ chinese_simplified ] = "ģʽ";
        Text[ russian ] = "Ðåæèì";
        Text[ polish ] = "Tryb";
        Text[ japanese ] = "Ó°ÄÞ";
        Text[ chinese_traditional ] = "¼Ò¦¡";
        Text[ arabic ] = "ÇáÃÓáæÈ";
        Text[ greek ] = "ÊáôÜóôáóç ëåéôïõñãßáò";
        Text[ korean ] = "¸ðµå";
        Text[ turkish ] = "Kip";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_MERGE_PREV
    {
        Pos = MAP_APPFONT ( 12 , 15 ) ;
        Size = MAP_APPFONT ( 130 , 10 ) ;
        Text = "mit der ~vorherigen Tabelle verbinden" ;
        Text [ ENGLISH ] = "Join with ~previous table" ;
        Check = TRUE ;
        TabStop = TRUE ;
        Text[ english_us ] = "Join with ~previous table";
        Text[ portuguese ] = "Unir à tabela ~anterior";
        Text[ russian ] = "Îáúåäèíèòü ñ ïðåäûäóùåé òàáëèöåé";
        Text[ dutch ] = "met de ~vorige tabel verbinden";
        Text[ french ] = "Fusionner avec le tableau ~précédent";
        Text[ spanish ] = "unir con la tabla ~anterior";
        Text[ italian ] = "Unisci alla tabella precedente";
        Text[ danish ] = "flet med forrige tabel";
        Text[ swedish ] = "förbind med den ~föregående tabellen";
        Text[ polish ] = "Sprzêgaj z poprzedni¹ tabel¹";
        Text[ portuguese_brazilian ] = "Join with ~previous table";
        Text[ japanese ] = "‘O‚Ì•\\‚ÆŒ‹‡(~P)";
        Text[ chinese_simplified ] = "ºÍÉÏÒ»¸ö±í¸ñºÏ²¢(~P)";
        Text[ chinese_traditional ] = "©M¤W¤@­Óªí®æ¦X¦}(~P)";
        Text[ arabic ] = "ÇáÑÈØ ãÚ ÇáÌÏæá ÇáÓÇÈÞ";
        Text[ greek ] = "Ýíùóç ìå ðñïçãïýìåíï ðßíáêá";
        Text[ korean ] = "ÀÌÀü Ç¥¿Í ÇÔ²²(~P)";
        Text[ turkish ] = "~Önceki tablo ile birleþtir";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_MERGE_NEXT
    {
        Pos = MAP_APPFONT ( 12 , 30 ) ;
        Size = MAP_APPFONT ( 130 , 10 ) ;
        Text = "mit der ~nachfolgenden Tabelle verbinden" ;
        Text [ ENGLISH ] = "Join with ~next table" ;
        Text[ english_us ] = "Join with ~next table";
        Text[ portuguese ] = "Unir à tabela ~seguinte";
        Text[ russian ] = "Îáúåäèíèòü ñî ñëåäóþùåé òàáëèöåé";
        Text[ dutch ] = "Met de v~olgende tabel verbinden";
        Text[ french ] = "Fusionner avec le tableau ~suivant";
        Text[ spanish ] = "unir con la tabla ~siguiente";
        Text[ italian ] = "Unisci alla tabella successiva";
        Text[ danish ] = "flet med efterfølgende tabel";
        Text[ swedish ] = "förbind med den ~efterföljande tabellen";
        Text[ polish ] = "Sprzêgaj z nastêpn¹ tabel¹";
        Text[ portuguese_brazilian ] = "Join with ~next table";
        Text[ japanese ] = "ŽŸ‚Ì•\\‚ÆŒ‹‡(~N)";
        Text[ chinese_simplified ] = "ºÍÏÂÒ»¸ö±í¸ñºÏ²¢(~N)";
        Text[ chinese_traditional ] = "©M¤U¤@­Óªí®æ¦X¦}(~N)";
        Text[ arabic ] = "ÇáÑÈØ ãÚ ÇáÌÏæá ÇáÊÇáí";
        Text[ greek ] = "Ýíùóç ìå åðüìåíï ðßíáêá";
        Text[ korean ] = "´ÙÀ½ Ç¥¿Í ÇÔ²²(~N)";
        Text[ turkish ] = "S~onraki tablo ile birleþtir";
        Text[ language_user1 ] = " ";
    };
    Text[ english_us ] = "Join tables";
    Text[ portuguese ] = "Unir tabelas";
    Text[ russian ] = "Îáúåäèíèòü òàáëèöû";
    Text[ dutch ] = "Tabellen verbinden";
    Text[ french ] = "Fusion de tableaux";
    Text[ spanish ] = "unir tablas";
    Text[ italian ] = "Unisci tabelle";
    Text[ danish ] = "Flet tabeller";
    Text[ swedish ] = "Förbind tabeller";
    Text[ polish ] = "Sprzêgaj tabele";
    Text[ portuguese_brazilian ] = "Join tables";
    Text[ japanese ] = "•\\‚ÌŒ‹‡";
    Text[ chinese_simplified ] = "Á¬½Ó±í¸ñ";
    Text[ chinese_traditional ] = "³sµ²ªí®æ";
    Text[ arabic ] = "æÕá ÇáÌÏÇæá";
    Text[ greek ] = "¸íùóç ðéíÜêùí";
    Text[ korean ] = "Ç¥ ¿¬°á";
    Text[ turkish ] = "Tablolarý birleþtir";
    Text[ language_user1 ] = " ";
};
diff --git a/sw/source/ui/table/rowht.cxx b/sw/source/ui/table/rowht.cxx
new file mode 100644
index 0000000..e447c11
--- /dev/null
+++ b/sw/source/ui/table/rowht.cxx
@@ -0,0 +1,228 @@
/*************************************************************************
 *
 *  $RCSfile: rowht.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:48 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SFXINTITEM_HXX //autogen
#include <svtools/intitem.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _SVX_DLGUTIL_HXX //autogen
#include <svx/dlgutil.hxx>
#endif
#ifndef _SFX_SAVEOPT_HXX //autogen
#include <sfx2/saveopt.hxx>
#endif


#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#include "cmdid.h"
#include "swtypes.hxx"
#include "rowht.hxx"
#include "wrtsh.hxx"
#include "frmatr.hxx"

#include "rowht.hrc"
#include "table.hrc"




void SwTableHeightDlg::Apply()
{
    SwTwips nHeight = aHeightEdit.Denormalize(aHeightEdit.GetValue(FUNIT_TWIP));
    SwFmtFrmSize aSz(ATT_FIX_SIZE, 0, nHeight);

    SwFrmSize eFrmSize = (SwFrmSize) aAutoHeightCB.IsChecked() ?
        ATT_MIN_SIZE : ATT_FIX_SIZE;
    if(eFrmSize != aSz.GetSizeType())
    {
        aSz.SetSizeType(eFrmSize);
    }
    rSh.SetRowHeight( aSz );
}

// CTOR / DTOR -----------------------------------------------------------


SwTableHeightDlg::SwTableHeightDlg( Window *pParent, SwWrtShell &rS ) :

    SvxStandardDialog(pParent, SW_RES(DLG_ROW_HEIGHT)),

    aHeightEdit(this, SW_RES(ED_HEIGHT)),
    aAutoHeightCB(this, SW_RES(CB_AUTOHEIGHT)),
    aHeightFrm(this, SW_RES(GB_HEIGHT)),
    aOKBtn(this, SW_RES(BT_OK)),
    aCancelBtn(this, SW_RES(BT_CANCEL)),
    aHelpBtn( this, SW_RES( BT_HELP ) ),
    rSh( rS )
{
    FreeResource();
    ::SetFieldUnit(aHeightEdit, OFF_APP()->GetOptions().GetMetric());
    aHeightEdit.SetMin(MINLAY, FUNIT_TWIP);
    if(!aHeightEdit.GetMin())
        aHeightEdit.SetMin(1);
    SwFmtFrmSize *pSz;
    rSh.GetRowHeight( pSz );
    if ( pSz )
    {
        long nHeight = pSz->GetHeight();
        aAutoHeightCB.Check(pSz->GetSizeType() != ATT_FIX_SIZE);
        aHeightEdit.SetValue(aHeightEdit.Normalize(nHeight), FUNIT_TWIP);

        delete pSz;
    }
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.38  2000/09/18 16:06:08  willem.vandorp
    OpenOffice header added.

    Revision 1.37  2000/05/26 07:21:33  os
    old SW Basic API Slots removed

    Revision 1.36  1998/05/15 05:27:00  OS
    HelpButton


      Rev 1.35   15 May 1998 07:27:00   OS
   HelpButton

      Rev 1.34   24 Nov 1997 15:52:22   MA
   includes

      Rev 1.33   03 Nov 1997 13:56:50   MA
   precomp entfernt

      Rev 1.32   15 Aug 1997 12:18:22   OS
   chartar/frmatr/txtatr aufgeteilt

      Rev 1.31   08 Jan 1997 10:34:48   OS
   falschen default entfernt

      Rev 1.30   17 Dec 1996 16:59:52   OS
   per Default MM50 als Normhoehe

      Rev 1.29   11 Dec 1996 20:58:14   MH
   includes

      Rev 1.28   11 Dec 1996 08:43:16   OS
   Minimalwert nie NULL, Einheit richtig einstellen

      Rev 1.27   26 Nov 1996 19:45:10   OS
   minimale Zellenhoehe jetzt MINLAY

      Rev 1.26   11 Nov 1996 11:20:18   MA
   ResMgr

      Rev 1.25   28 Aug 1996 14:33:12   OS
   includes

      Rev 1.24   26 Jun 1996 15:25:22   OS
   Aufruf von Dispatcher.Execute an 324 angepasst

      Rev 1.23   26 Jun 1996 10:59:48   OM
   Autohoehe fuer Tabellenzeile

      Rev 1.22   25 Jun 1996 18:13:34   OM
   Autohoehe fuer Tabellenzeile

      Rev 1.21   20 Jun 1996 13:57:38   MA
   chg: RowHeight jetzt mit minimalgroesse

      Rev 1.20   24 Nov 1995 16:58:58   OM
   PCH->PRECOMPILED

      Rev 1.19   10 Nov 1995 15:26:16   OS
   Execute mit 0L abschliessen

      Rev 1.18   05 Nov 1995 16:48:32   OS
   Dtor ueberfluessig, -RecordFlag, Aktion ueber Dispatcher

      Rev 1.17   13 Sep 1995 17:09:42   OS
   Recording ausgeweitet

      Rev 1.16   30 Aug 1995 14:04:24   MA
   fix: sexport'iert

      Rev 1.15   21 Aug 1995 09:34:04   MA
   chg: swstddlg -> svxstandarddialog, Optimierungen

------------------------------------------------------------------------*/



diff --git a/sw/source/ui/table/rowht.hrc b/sw/source/ui/table/rowht.hrc
new file mode 100644
index 0000000..77f5306
--- /dev/null
+++ b/sw/source/ui/table/rowht.hrc
@@ -0,0 +1,68 @@
/*************************************************************************
 *
 *  $RCSfile: rowht.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:48 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#define ED_HEIGHT       1
#define CB_AUTOHEIGHT   2
#define GB_HEIGHT       3

#define BT_OK           100
#define BT_CANCEL       101
#define BT_HELP     102

diff --git a/sw/source/ui/table/rowht.src b/sw/source/ui/table/rowht.src
new file mode 100644
index 0000000..dd9aacf
--- /dev/null
+++ b/sw/source/ui/table/rowht.src
@@ -0,0 +1,186 @@
/*************************************************************************
 *
 *  $RCSfile: rowht.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:48 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "table.hrc"
#include "rowht.hrc"
#include "cmdid.h"
#include "helpid.h"
ModalDialog DLG_ROW_HEIGHT
{
    HelpID = FN_TABLE_SET_ROW_HEIGHT ;
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 157 , 60 ) ;
    /* ### ACHTUNG: Neuer Text in Resource? Zeilenhöhe : Zellenhöhe */
    Text = "Zeilenhöhe" ;
    Text [ ENGLISH ] = "Row height" ;
    Text [ norwegian ] = "Cellehøyde" ;
    Text [ italian ] = "Altezza riga" ;
    Text [ portuguese_brazilian ] = "Altura da célula" ;
    Text [ portuguese ] = "Altura da linha" ;
    Text [ finnish ] = "Solun korkeus" ;
    Text [ danish ] = "Rækkehøjde" ;
    Text [ french ] = "Hauteur de ligne" ;
    Text [ swedish ] = "Radhöjd" ;
    Text [ dutch ] = "Rijlhoogte" ;
    Text [ spanish ] = "Altura de fila" ;
    Text [ english_us ] = "Row Height" ;
    Moveable = TRUE ;
    OKButton BT_OK
    {
        Pos = MAP_APPFONT ( 101 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        DefButton = TRUE ;
    };
    CancelButton BT_CANCEL
    {
        Pos = MAP_APPFONT ( 101 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    HelpButton BT_HELP
    {
        Pos = MAP_APPFONT ( 101 , 43 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    MetricField ED_HEIGHT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 12 , 16 ) ;
        Size = MAP_APPFONT ( 38 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 5 ;
        Maximum = 990 ;
        DecimalDigits = 1 ;
        Value = 10 ;
        Unit = FUNIT_CM ;
        First = 100 ;
        Last = 9999 ;
    };
    CheckBox CB_AUTOHEIGHT
    {
        Pos = MAP_APPFONT ( 12 , 31 ) ;
        Size = MAP_APPFONT ( 80 , 12 ) ;
        /* ### ACHTUNG: Neuer Text in Resource? ~dynamisch anpassen : auto. H~öhe */
        Text = "~dynamisch anpassen" ;
        Text [ ENGLISH ] = "~dynamic adjustment" ;
        TabStop = TRUE ;
        Text [ english_us ] = "~Fit to size" ;
        Text [ swedish ] = "anpassa ~dynamiskt" ;
        Text [ danish ] = "tilpas dynamisk" ;
        Text [ italian ] = "Altezza autom~atica" ;
        Text [ spanish ] = "~ajuste dinámico" ;
        Text [ french ] = "adaptation ~dynamique" ;
        Text [ dutch ] = "~dynamisch aanpassen" ;
        Text [ portuguese_brazilian ] = "~dynamisch anpassen" ;
        Text [ portuguese ] = "Ajuste ~dinâmico" ;
        Text[ chinese_simplified ] = "×Ô¶¯µ÷Õû(~F)";
        Text[ russian ] = "Ïîäáîð ðàçìåðà";
        Text[ polish ] = "Dostosuj dynamicznie";
        Text[ japanese ] = "Ž©“®’²®(~F)";
        Text[ chinese_traditional ] = "¦Û°Ê½Õ¾ã(~F)";
        Text[ arabic ] = "ÊÎÕíÕ ÏíäÇãíßí";
        Text[ greek ] = "ÄõíáìéêÞ ðñïóáñìïãÞ";
        Text[ korean ] = "Å©±â¿¡ ¸ÂÃã(~F)";
        Text[ turkish ] = "i~çerik boyuna uydur";
    };
    GroupBox GB_HEIGHT
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 89 , 51 ) ;
        Text = "Höhe" ;
        Text [ ENGLISH ] = "Height" ;
        Text [ norwegian ] = "Høyde " ;
        Text [ italian ] = "Altezza" ;
        Text [ portuguese_brazilian ] = "Altura" ;
        Text [ portuguese ] = "Altura" ;
        Text [ finnish ] = "Korkeus" ;
        Text [ danish ] = "Højde" ;
        Text [ french ] = "Hauteur" ;
        Text [ swedish ] = "Höjd" ;
        Text [ dutch ] = "Hoogte" ;
        Text [ spanish ] = "Altura" ;
        Text [ english_us ] = "Height" ;
        Text[ chinese_simplified ] = "¸ß";
        Text[ russian ] = "Âûñîòà";
        Text[ polish ] = "Wys.";
        Text[ japanese ] = "‚‚³";
        Text[ chinese_traditional ] = "°ª";
        Text[ arabic ] = "ÇáÇÑÊÝÇÚ";
        Text[ greek ] = "¾øïò";
        Text[ korean ] = "³ôÀÌ";
        Text[ turkish ] = "Yükseklik";
    };
    Text[ chinese_simplified ] = "Ðиß";
    Text[ russian ] = "Âûñîòà ñòðîêè";
    Text[ polish ] = "WysokoϾ wierszy";
    Text[ japanese ] = "s‚̍‚‚³";
    Text[ chinese_traditional ] = "¦æ°ª";
    Text[ arabic ] = "ÇÑÊÝÇÚ ÇáÕÝ";
    Text[ greek ] = "¾øïò ãñáììÞò";
    Text[ korean ] = "Çà ³ôÀÌ";
    Text[ turkish ] = "Satýr yüksekliði";
};
diff --git a/sw/source/ui/table/splittbl.cxx b/sw/source/ui/table/splittbl.cxx
new file mode 100644
index 0000000..276347e
--- /dev/null
+++ b/sw/source/ui/table/splittbl.cxx
@@ -0,0 +1,136 @@
/*************************************************************************
 *
 *  $RCSfile: splittbl.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:48 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _WRTSH_HXX //autogen
#include <wrtsh.hxx>
#endif
#ifndef _SPLITTBL_HXX
#include <splittbl.hxx>
#endif
#include <splittbl.hrc>
#include <table.hrc>
#ifndef _TBLENUM_HXX
#include <tblenum.hxx>
#endif
/*-----------------17.03.98 10:56-------------------

--------------------------------------------------*/
SwSplitTblDlg::SwSplitTblDlg( Window *pParent, SwWrtShell &rSh ) :
    SvxStandardDialog(pParent, SW_RES(DLG_SPLIT_TABLE)),
    aOKPB(                  this, ResId(PB_OK       )),
    aCancelPB(              this, ResId(PB_CANCEL   )),
    aHelpPB(                this, ResId(PB_HELP     )),
    aSplitGB(               this, ResId(GB_SPLIT    )),
    aCntntCopyRB(           this, ResId(RB_CNTNT    )),
    aBoxAttrCopyWithParaRB( this, ResId(RB_BOX_PARA )),
    aBoxAttrCopyNoParaRB(   this, ResId(RB_BOX_NOPARA)),
    aBorderCopyRB(          this, ResId(RB_BORDER   )),
    rShell(rSh)
{
    FreeResource();
    aCntntCopyRB.Check();
}

/*-----------------17.03.98 10:56-------------------

--------------------------------------------------*/
void SwSplitTblDlg::Apply()
{
    USHORT nSplit = HEADLINE_CNTNTCOPY;
    if(aBoxAttrCopyWithParaRB.IsChecked())
        nSplit = HEADLINE_BOXATRCOLLCOPY;
    if(aBoxAttrCopyNoParaRB.IsChecked())
        nSplit = HEADLINE_BOXATTRCOPY;
    else if(aBorderCopyRB.IsChecked())
        nSplit = HEADLINE_BORDERCOPY;

    rShell.SplitTable( nSplit );

}


/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.4  2000/09/18 16:06:09  willem.vandorp
    OpenOffice header added.

    Revision 1.3  1998/03/20 12:39:40  OS
    verdrehter enum


      Rev 1.2   20 Mar 1998 13:39:40   OS
   verdrehter enum

      Rev 1.1   19 Mar 1998 11:15:38   OS
   Neuer Parameter: mit Vorlage

      Rev 1.0   17 Mar 1998 16:16:52   OS
   Initial revision.

------------------------------------------------------------------------*/

diff --git a/sw/source/ui/table/splittbl.hrc b/sw/source/ui/table/splittbl.hrc
new file mode 100644
index 0000000..be5c9d2
--- /dev/null
+++ b/sw/source/ui/table/splittbl.hrc
@@ -0,0 +1,68 @@
/*************************************************************************
 *
 *  $RCSfile: splittbl.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:48 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#define PB_OK           1
#define PB_CANCEL       2
#define PB_HELP         3
#define GB_SPLIT        4
#define RB_CNTNT        5
#define RB_BOX_NOPARA   6
#define RB_BOX_PARA     7
#define RB_BORDER       8
diff --git a/sw/source/ui/table/splittbl.src b/sw/source/ui/table/splittbl.src
new file mode 100644
index 0000000..f8c4263
--- /dev/null
+++ b/sw/source/ui/table/splittbl.src
@@ -0,0 +1,245 @@
/*************************************************************************
 *
 *  $RCSfile: splittbl.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:48 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "table.hrc"
#include "splittbl.hrc"
#include "cmdid.h"
#include "helpid.h"
ModalDialog DLG_SPLIT_TABLE
{
    HelpID = FN_TABLE_SPLIT_TABLE ;
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 207 , 76 ) ;
    Text = "Tabelle auftrennen" ;
    Text [ ENGLISH ] = "Split table" ;
    Moveable = TRUE ;
    OKButton PB_OK
    {
        Pos = MAP_APPFONT ( 151 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        DefButton = TRUE ;
    };
    CancelButton PB_CANCEL
    {
        Pos = MAP_APPFONT ( 151 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    HelpButton PB_HELP
    {
        Pos = MAP_APPFONT ( 151 , 40 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    GroupBox GB_SPLIT
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 139 , 70 ) ;
        Text = "Modus" ;
        Text [ ENGLISH ] = "Mode" ;
        Text [ english_us ] = "Mode" ;
        Text [ portuguese_brazilian ] = "Modus" ;
        Text [ swedish ] = "Läge" ;
        Text [ danish ] = "Modus" ;
        Text [ italian ] = "Modo" ;
        Text [ spanish ] = "Modo" ;
        Text [ french ] = "Mode" ;
        Text [ dutch ] = "Modus" ;
        Text [ portuguese ] = "Modo" ;
        Text[ chinese_simplified ] = "ģʽ";
        Text[ russian ] = "Ðåæèì";
        Text[ polish ] = "Tryb";
        Text[ japanese ] = "Ó°ÄÞ";
        Text[ chinese_traditional ] = "¼Ò¦¡";
        Text[ arabic ] = "ÇáæÖÚ";
        Text[ greek ] = "ÊáôÜóôáóç ëåéôïõñãßáò";
        Text[ korean ] = "¸ðµå";
        Text[ turkish ] = "Kip";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_CNTNT
    {
        Pos = MAP_APPFONT ( 12 , 15 ) ;
        Size = MAP_APPFONT ( 130 , 10 ) ;
        Text = "~Überschrift kopieren" ;
        Text [ ENGLISH ] = "~Copy Heading" ;
        Check = TRUE ;
        TabStop = TRUE ;
        Text [ portuguese ] = "~Copiar título" ;
        Text [ english_us ] = "~Copy heading" ;
        Text [ portuguese_brazilian ] = "~Überschrift kopieren" ;
        Text [ swedish ] = "Kopiera ~överskrift" ;
        Text [ danish ] = "Kopier overskrift" ;
        Text [ italian ] = "~Copia intestazione" ;
        Text [ spanish ] = "~Copiar encabezado" ;
        Text [ french ] = "~Copier titre" ;
        Text [ dutch ] = "~Kop kopiëren" ;
        Text[ chinese_simplified ] = "¸´ÖƱêÌâ(~C)";
        Text[ russian ] = "Êîïèðîâàòü çàãîëîâîê";
        Text[ polish ] = "Kopiuj tytu³";
        Text[ japanese ] = "Œ©o‚µ‚̺Ëß°(~C)";
        Text[ chinese_traditional ] = "½Æ»s¼ÐÃD(~C)";
        Text[ arabic ] = "äÓÎ ÇáÚäæÇä";
        Text[ greek ] = "ÁíôéãñáöÞ åðéêåöáëßäáò";
        Text[ korean ] = "Á¦¸ñ º¹»ç(~C)";
        Text[ turkish ] = "B~aþlýðý kopyala";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_BOX_PARA
    {
        Pos = MAP_APPFONT ( 12 , 30 ) ;
        Size = MAP_APPFONT ( 130 , 10 ) ;
        Text = "~Eigene Überschrift, mit Vorlage" ;
        Text [ ENGLISH ] = "New heading ~with style" ;
        Text [ portuguese ] = "Título ~personalizado (com modelo)" ;
        Text [ english_us ] = "C~ustom heading (apply Style)" ;
        Text [ portuguese_brazilian ] = "~Eigene Überschrift, mit Vorlage" ;
        Text [ swedish ] = "~Egen överskrift, med mall" ;
        Text [ danish ] = "Egen overskrift, med typografi" ;
        Text [ italian ] = "~Propria intestazione con modello" ;
        Text [ spanish ] = "~Encabezado propio, con estilos" ;
        Text [ french ] = "Titre personnalisé, avec ~style" ;
        Text [ dutch ] = "~Eigen kop, met opmaakprofiel" ;
        Text[ chinese_simplified ] = "×Ô¶¨±êÌ⣬´øÑùʽ(~S)";
        Text[ russian ] = "Çàãîëîâîê ïîëüçîâàòåëÿ ñ øàáëîíîì";
        Text[ polish ] = "Tytu³ u¿ytkownika, z szablonem";
        Text[ japanese ] = "½À²Ù•t‚«Õ°»Þ°’è‹`‚ÌŒ©o‚µ(~S)";
        Text[ chinese_traditional ] = "¦Û­q¼ÐÃD¡A±a¼Ë¦¡(~S)";
        Text[ arabic ] = "ÚäæÇä ÎÇÕ (ÊØÈíÞ ÇáäãØ)";
        Text[ greek ] = "ÐñïóáñìïóìÝíç åðéêåöáëßäá (ìå óôõë)";
        Text[ korean ] = "»ç¿ëÀÚ Á¦¸ñ (À¯Çü Àû¿ë)(~U)";
        Text[ turkish ] = "~Özel baþlýk (biçim uygula)";
        Text[ language_user1 ] = "All \"Vorlagen\" /Styles are written with a capital S.10.5.00EM";
    };
    RadioButton RB_BOX_NOPARA
    {
        Pos = MAP_APPFONT ( 12 , 45 ) ;
        Size = MAP_APPFONT ( 130 , 10 ) ;
        Text = "E~igene Überschrift" ;
        Text [ ENGLISH ] = "~New heading" ;
        Text [ portuguese ] = "Título ~personalizado" ;
        Text [ english_us ] = "Cu~stom heading" ;
        Text [ portuguese_brazilian ] = "E~igene Überschrift" ;
        Text [ swedish ] = "E~gen överskrift" ;
        Text [ danish ] = "Egen overskrift" ;
        Text [ italian ] = "Propria ~intestazione" ;
        Text [ spanish ] = "Encabezado ~propio" ;
        Text [ french ] = "Titre ~personnalisé" ;
        Text [ dutch ] = "E~igen kop" ;
        Text[ chinese_simplified ] = "×Ô¶¨±êÌâ(~H)";
        Text[ russian ] = "Çàãîëîâîê ïîëüçîâàòåëÿ";
        Text[ polish ] = "Tytu³ u¿ytkownika";
        Text[ japanese ] = "Õ°»Þ°’è‹`‚ÌŒ©o‚µ(~H)";
        Text[ chinese_traditional ] = "¦Û­q¼ÐÃD(~H)";
        Text[ arabic ] = "ÚäæÇä ÎÇÕ";
        Text[ greek ] = "ÐñïóáñìïóìÝíç åðéêåöáëßäá";
        Text[ korean ] = "»ç¿ëÀÚ Á¦¸ñ(~S)";
        Text[ turkish ] = "Ö~zel baþlýk";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_BORDER
    {
        Pos = MAP_APPFONT ( 12 , 60 ) ;
        Size = MAP_APPFONT ( 130 , 10 ) ;
        Text = "~Keine Überschrift" ;
        Text [ ENGLISH ] = "N~o heading" ;
        Text [ portuguese ] = "~Sem título" ;
        Text [ english_us ] = "~No heading" ;
        Text [ portuguese_brazilian ] = "~Keine Überschrift" ;
        Text [ swedish ] = "~Ingen överskrift" ;
        Text [ danish ] = "Ingen overskrift" ;
        Text [ italian ] = "~Senza intestazione" ;
        Text [ spanish ] = "~Sin encabezado" ;
        Text [ french ] = "~Pas de titre" ;
        Text [ dutch ] = "~Geen kop" ;
        Text[ chinese_simplified ] = "ÎÞ±êÌâ(~N)";
        Text[ russian ] = "Áåç çàãîëîâêà";
        Text[ polish ] = "Bez tytu³u";
        Text[ japanese ] = "Œ©o‚µ‚È‚µ(~N)";
        Text[ chinese_traditional ] = "µL¼ÐÃD(~N)";
        Text[ arabic ] = "ÈÏæä ÚäæÇä";
        Text[ greek ] = "×ùñßò åðéêåöáëßäá";
        Text[ korean ] = "Á¦¸ñÀÌ ¾øÀ½(~N)";
        Text[ turkish ] = "~Baþlýk yok";
        Text[ language_user1 ] = " ";
    };
    Text [ english_us ] = "Split Table" ;
    Text [ portuguese_brazilian ] = "Tabelle auftrennen" ;
    Text [ swedish ] = "Dela tabell" ;
    Text [ danish ] = "Opdel tabel" ;
    Text [ italian ] = "Dividi tabella" ;
    Text [ spanish ] = "Dividir tabla" ;
    Text [ french ] = "Scinder le tableau" ;
    Text [ dutch ] = "Tabel splitsen" ;
    Text [ portuguese ] = "Dividir tabela" ;
    Text[ chinese_simplified ] = "·Ö¸ô±í¸ñ";
    Text[ russian ] = "Ðàçáèòü òàáëèöó";
    Text[ polish ] = "Rozdziel tabelê";
    Text[ japanese ] = "•\\‚Ì•ªŠ„";
    Text[ chinese_traditional ] = "¤À¶}Àx¦s®æ";
    Text[ arabic ] = "ÝÕá ÇáÌÏæá";
    Text[ greek ] = "Äéáßñåóç ðßíáêá";
    Text[ korean ] = "Ç¥ ³ª´©±â";
    Text[ turkish ] = "Tabloyu böl";
    Text[ language_user1 ] = " ";
};
diff --git a/sw/source/ui/table/table.src b/sw/source/ui/table/table.src
new file mode 100644
index 0000000..e9911f4
--- /dev/null
+++ b/sw/source/ui/table/table.src
@@ -0,0 +1,87 @@
/*************************************************************************
 *
 *  $RCSfile: table.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:48 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "table.hrc"
InfoBox MSG_ERR_TABLE_MERGE
{
    MESSAGE = "Selektierte Zellen der Tabelle sind zu komplex zum Verbinden." ;
    MESSAGE [ English ] = "Selected table cells are too complex to merge." ;
    MESSAGE [ norwegian ] = "Valgte tabellceller er for komplekse til å flette" ;
    MESSAGE [ italian ] = "Le celle della tabella selezionata sono troppo complesse per l'unione" ;
    MESSAGE [ portuguese_brazilian ] = "Células selecionadas da tabela sao muito complexas para a intercalação." ;
    MESSAGE [ portuguese ] = "As células seleccionadas da tabela são muito complexas para a intercalação." ;
    MESSAGE [ finnish ] = "Valitut taulukon solut ovat liian monimutkaiset yhdistettäviksi." ;
    MESSAGE [ danish ] = "De markerede tabelceller er for komplekse til fletning." ;
    MESSAGE [ french ] = "Cellules du tableau sélectionnées trop complexes pour être fusionnées." ;
    MESSAGE [ swedish ] = "Markerade tabellceller är för komplexa för sammanfogning." ;
    MESSAGE [ dutch ] = "De geselecteerde tabelcellen zijn te complex voor samenvoeging." ;
    MESSAGE [ spanish ] = "Las celdas seleccionadas de la tabla son demasiado complejas para enlazarlas." ;
    MESSAGE [ english_us ] = "Selected table cells are too complex to merge." ;
    MESSAGE[ chinese_simplified ] = "ËùÑ¡ÔñµÄ±í¸ñµ¥Ôª¸ñÌ«×ۺ϶øÎÞ·¨ºÏ²¢¡£";
    MESSAGE[ russian ] = "Âûäåëåííûå ÿ÷åéêè òàáëèöû ñëèøêîì ñëîæíûå äëÿ èõ îáúåäèíåíèÿ .";
    MESSAGE[ polish ] = "Zaznaczone komórki tabeli s¹ zbyt komplekowe, aby je sprzêgaæ.";
    MESSAGE[ japanese ] = "‘I‘ð‚³‚ê‚½•\\‚̾ق́AŒ‹‡‚·‚é‚ɂ͕¡ŽG‰ß‚¬‚Ü‚·B";
    MESSAGE[ chinese_traditional ] = "©Ò¿ï¾Üªºªí®æÀx¦s®æ¤Óºî¦X¦ÓµLªk¦X¨Ö¡C";
    MESSAGE[ arabic ] = "ÎáÇíÇ ÇáÌÏæá ÇáãÍÏÏÉ ãÚÞÏÉ áÏÑÌÉ íÓÊÍíá ãÚåÇ ÇáÑÈØ.";
    MESSAGE[ greek ] = "Ôá åðéëåãìÝíá êåëéÜ ôïõ ðßíáêá åßíáé  õðåñâïëéêÜ ðåñßðëïêá ãéá íá ãßíåé ç óýíäåóç.";
    MESSAGE[ korean ] = "¼±ÅÃµÈ Ç¥ ¼¿ÀÌ ÇÕº´Çϱ⿡ ³Ê¹« º¹ÀâÇÕ´Ï´Ù.";
    MESSAGE[ turkish ] = "Seçilen tablo hücreleri birleþtirilmek için fazla karmaþýk.";
};
diff --git a/sw/source/ui/table/tabledlg.cxx b/sw/source/ui/table/tabledlg.cxx
new file mode 100644
index 0000000..bf4d952
--- /dev/null
+++ b/sw/source/ui/table/tabledlg.cxx
@@ -0,0 +1,2321 @@
/*************************************************************************
 *
 *  $RCSfile: tabledlg.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:48 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _LIST_HXX //autogen
#include <tools/list.hxx>
#endif
#ifndef _SV_MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _SFXINTITEM_HXX //autogen
#include <svtools/intitem.hxx>
#endif
#ifndef _SVX_BORDER_HXX //autogen
#include <svx/border.hxx>
#endif
#ifndef _SVX_BACKGRND_HXX //autogen
#include <svx/backgrnd.hxx>
#endif
#ifndef _SVX_HTMLMODE_HXX
#include <svx/htmlmode.hxx>
#endif
#ifndef _SVX_KEEPITEM_HXX //autogen
#include <svx/keepitem.hxx>
#endif
#ifndef _SVX_BRKITEM_HXX //autogen
#include <svx/brkitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif


#ifndef _FMTORNT_HXX //autogen
#include <fmtornt.hxx>
#endif
#ifndef _FMTPDSC_HXX //autogen
#include <fmtpdsc.hxx>
#endif
#ifndef _FMTTSPLT_HXX //autogen
#include <fmtlsplt.hxx>
#endif
#ifndef _OFA_HTMLCFG_HXX //autogen
#include <offmgr/htmlcfg.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _SVX_HTMLMODE_HXX
#include <svx/htmlmode.hxx>
#endif

#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _VIEWOPT_HXX
#include <viewopt.hxx>
#endif
#ifndef _UITOOL_HXX
#include <uitool.hxx>
#endif
#ifndef _FRMATR_HXX
#include <frmatr.hxx>
#endif
#ifndef _TABLEDLG_HXX
#include <tabledlg.hxx>
#endif
#ifndef _TABLEPG_HXX
#include <tablepg.hxx>
#endif
#ifndef _TABLEMGR_HXX
#include <tablemgr.hxx>
#endif
#ifndef _PAGEDESC_HXX
#include <pagedesc.hxx>
#endif
#ifndef _UIITEMS_HXX
#include <uiitems.hxx>
#endif
#ifndef _POOLFMT_HXX
#include <poolfmt.hxx>
#endif

#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _TABLEDLG_HRC
#include <tabledlg.hrc>
#endif
#ifndef _TABLE_HRC
#include <table.hrc>
#endif


#ifdef DEBUG_TBLDLG
void DbgTblRep(SwTableRep* pRep)
{
    DBG_ERROR(String(pRep->GetColCount()))
    DBG_ERROR(String(pRep->GetAllColCount()))
    SwTwips nSum = 0;
    for(USHORT i = 0; i < pRep->GetAllColCount(); i++)
    {
        String sMsg(i);
        sMsg += pRep->GetColumns()[i].bVisible ? " v " : " h ";
        sMsg += pRep->GetColumns()[i].nWidth;
        nSum +=pRep->GetColumns()[i].nWidth;
        DBG_ERROR(sMsg)
    }
    String sMsg("Spaltensumme: ");
    sMsg += nSum;
    sMsg += " Tblbreite: ";
    sMsg += pRep->GetWidth();
    DBG_ERROR(sMsg)
    sMsg = "Gesamt/Links/Rechts: ";
    sMsg += pRep->GetSpace();
    sMsg += '/';
    sMsg += pRep->GetLeftSpace();
    sMsg += '/';
    sMsg += pRep->GetRightSpace();
    DBG_ERROR(sMsg)
    sMsg = "Align: ";
    sMsg += pRep->GetAlign();
    DBG_ERROR(sMsg)

};

void DbgTColumn(TColumn* pTColumn, USHORT nCount)
{
    for(USHORT i = 0; i < nCount; i++)
    {
        String sMsg(i);
        sMsg += pTColumn[i].bVisible ? " v " : " h ";
        sMsg += pTColumn[i].nWidth;
        DBG_ERROR(sMsg)
    }
}
#endif


#ifdef DEBUG_TBLDLG
#define DEBUG_TBLDLG_TABLEREP(pRep) DbgTblRep(pRep)
#define DEBUG_TBLDLG_TCOLUMN(pTColumn, nCount) DbgTColumn(pTColumn, nCount)
#else
#define DEBUG_TBLDLG_TABLEREP
#define DEBUG_TBLDLG_TCOLUMN
#endif

SwFormatTablePage::SwFormatTablePage( Window* pParent, const SfxItemSet& rSet ) :
    SfxTabPage(pParent, SW_RES( TP_FORMAT_TABLE ), rSet ),
    aNameFT(this,       SW_RES( FT_NAME )),
    aNameED(this,       SW_RES( ED_NAME )),
    aWidthFT(this,      SW_RES( FT_WIDTH )),
    aWidthMF(this,      SW_RES( ED_WIDTH )),
    aRelWidthCB(this,   SW_RES( CB_REL_WIDTH )),
    aLeftFT(this,       SW_RES( FT_LEFT_DIST )),
    aLeftMF(this,       SW_RES( ED_LEFT_DIST )),
    aRightFT(this,      SW_RES( FT_RIGHT_DIST )),
    aRightMF(this,      SW_RES( ED_RIGHT_DIST )),
    aTopFT (this,       SW_RES( FT_TOP_DIST )),
    aTopMF(this,        SW_RES( ED_TOP_DIST )),
    aBottomFT(this,     SW_RES( FT_BOTTOM_DIST )),
    aBottomMF(this,     SW_RES( ED_BOTTOM_DIST )),
    aDistGB(this,       SW_RES( GB_DIST )),
    aOptionsGB(this,    SW_RES( GB_OPTIONS )),
    aFullBtn(this,      SW_RES( RB_FULL )),
    aFreeBtn(this,      SW_RES( RB_FREE )),
    aLeftBtn(this,      SW_RES( RB_LEFT )),
    aFromLeftBtn(this,  SW_RES( RB_FROM_LEFT )),
    aRightBtn(this,     SW_RES( RB_RIGHT )),
    aCenterBtn(this,    SW_RES( RB_CENTER )),
    aPosFrm(this,       SW_RES( GB_POS )),
    pTblData(0),
    nSaveWidth(0),
    nMinTableWidth(MINLAY),
    bModified(FALSE),
    bFull(0)
{
    FreeResource();
    SetExchangeSupport();

    Init();
}

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
void  SwFormatTablePage::Init()
{
    aLeftMF.MetricField::SetMin(-999999);
    aRightMF.MetricField::SetMin(-999999);

    // handler
    Link aLk = LINK( this, SwFormatTablePage, AutoClickHdl );
    aFullBtn.SetClickHdl( aLk );
    aFreeBtn.SetClickHdl( aLk );
    aLeftBtn.SetClickHdl( aLk );
    aFromLeftBtn.SetClickHdl( aLk );
    aRightBtn.SetClickHdl( aLk );
    aCenterBtn.SetClickHdl( aLk );

    aLk = LINK( this, SwFormatTablePage, UpHdl );
    aTopMF.SetUpHdl( aLk );
    aBottomMF.SetUpHdl( aLk );
    aRightMF.SetUpHdl( aLk );
    aLeftMF.SetUpHdl( aLk );
    aWidthMF.SetUpHdl( aLk );

    aLk = LINK( this, SwFormatTablePage, DownHdl );
    aTopMF.SetDownHdl( aLk );
    aBottomMF.SetDownHdl( aLk );
    aRightMF.SetDownHdl( aLk );
    aLeftMF.SetDownHdl( aLk );
    aWidthMF.SetDownHdl( aLk );

    aLk = LINK( this, SwFormatTablePage, LoseFocusHdl );
    aTopMF.SetLoseFocusHdl( aLk );
    aBottomMF.SetLoseFocusHdl( aLk );
    aRightMF.SetLoseFocusHdl( aLk );
    aLeftMF.SetLoseFocusHdl( aLk );
    aWidthMF.SetLoseFocusHdl( aLk );

    aRightMF.SetModifyHdl(LINK(this, SwFormatTablePage, RightModifyHdl));
    aRelWidthCB.SetClickHdl(LINK( this, SwFormatTablePage, RelWidthClickHdl ));
}

/*------------------------------------------------------------------------*/

IMPL_LINK( SwFormatTablePage, RelWidthClickHdl, CheckBox *, pBtn )
{
    DBG_ASSERT(pTblData, "Tabellendaten nicht da?")
    BOOL bIsChecked = pBtn->IsChecked();
    long nLeft = aLeftMF.Denormalize(aLeftMF.GetValue(FUNIT_TWIP ));
    long nRight = aRightMF.Denormalize(aRightMF.GetValue(FUNIT_TWIP ));
    aWidthMF.ShowPercent(bIsChecked);
    aLeftMF.ShowPercent(bIsChecked);
    aRightMF.ShowPercent(bIsChecked);

    if (bIsChecked)
    {
        aWidthMF.SetRefValue(pTblData->GetSpace());
        aLeftMF.SetRefValue(pTblData->GetSpace());
        aRightMF.SetRefValue(pTblData->GetSpace());
        aLeftMF.MetricField::SetMin(0); // wird vom Percentfield ueberschrieben
        aRightMF.MetricField::SetMin(0);//                 -""-
        aLeftMF.SetValue(aLeftMF.Normalize( nLeft ), FUNIT_TWIP );
        aRightMF.SetValue(aRightMF.Normalize( nRight ), FUNIT_TWIP );
    }
    else
        ModifyHdl(&aLeftMF);    // Werte wieder korrigieren

    if(aFreeBtn.IsChecked())
    {
        BOOL bEnable = !pBtn->IsChecked();
        aRightMF.Enable(bEnable);
        aRightFT.Enable(bEnable);
    }
    bModified = TRUE;

    return 0;
}

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
IMPL_LINK( SwFormatTablePage, AutoClickHdl, CheckBox *, pBox )
{
    BOOL bRestore = TRUE,
         bLeftEnable = FALSE,
         bRightEnable= FALSE,
         bWidthEnable= FALSE,
         bOthers = TRUE;
    if( (RadioButton *) pBox == &aFullBtn )
    {
        aLeftMF.SetValue(0);
        aRightMF.SetValue(0);
        nSaveWidth = aWidthMF.Denormalize(aWidthMF.GetValue(FUNIT_TWIP ));
        aWidthMF.SetValue(aWidthMF.Normalize( pTblData->GetSpace() ), FUNIT_TWIP );
        aLeftMF.SetText( aEmptyStr );
        aRightMF.SetText( aEmptyStr );
        bFull = TRUE;
        bRestore = FALSE;
    }
    else if( (RadioButton *) pBox == &aLeftBtn )
    {
        bRightEnable = bWidthEnable = TRUE;
        aLeftMF.SetText( aEmptyStr );
        aLeftMF.SetValue(0);
    }
    else if( (RadioButton *) pBox == &aFromLeftBtn )
    {
        bLeftEnable = bWidthEnable = TRUE;
        aRightMF.SetText( aEmptyStr );
        aRightMF.SetValue(0);
    }
    else if( (RadioButton *) pBox == &aRightBtn )
    {
        bLeftEnable = bWidthEnable = TRUE;
        aRightMF.SetValue(0);
        aRightMF.SetText( aEmptyStr );
    }
    else if( ( RadioButton * ) pBox == &aCenterBtn )
    {
        bLeftEnable = bWidthEnable = TRUE;
        aRightMF.SetText( aEmptyStr );
    }
    else if( ( RadioButton * ) pBox == &aFreeBtn )
    {
        RightModifyHdl(&aRightMF);
        bLeftEnable = TRUE;
        bWidthEnable = TRUE;
        bOthers = FALSE;
    }
    aLeftMF.Enable(bLeftEnable);
    aLeftFT.Enable(bLeftEnable);
    aWidthMF.Enable(bWidthEnable);
    aWidthFT.Enable(bWidthEnable);
    if ( bOthers )
    {
        aRightMF.Enable(bRightEnable);
        aRightFT.Enable(bRightEnable);
        aRelWidthCB.Enable(bWidthEnable);
    }

    if(bFull && bRestore)
    {
        // nachdem auf autom. geschaltet wurde, wurde die Breite gemerkt,
        // um sie beim Zurueckschalten restaurieren zu koennen
        bFull = FALSE;
        aWidthMF.SetValue(aWidthMF.Normalize( nSaveWidth ), FUNIT_TWIP );
    }
    ModifyHdl(&aWidthMF);
    bModified = TRUE;
    return 0;
}

/*----------------------------------------------------------------------*/
IMPL_LINK( SwFormatTablePage, RightModifyHdl, MetricField *, pFld )
{
    if(aFreeBtn.IsChecked())
    {
        BOOL bEnable = aRightMF.GetValue() == 0;
//      aWidthMF.Enable(bEnable);
        aRelWidthCB.Enable(bEnable);
//      aWidthFT.Enable(bEnable);
        if ( !bEnable )
        {
            aRelWidthCB.Check(FALSE);
            RelWidthClickHdl(&aRelWidthCB);
        }
        bEnable = aRelWidthCB.IsChecked();
        aRightMF.Enable(!bEnable);
        aRightFT.Enable(!bEnable);
    }
    return 0;
}

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
IMPL_LINK_INLINE_START( SwFormatTablePage, UpHdl, MetricField *, pEdit )
{
    ModifyHdl( pEdit );
    return 0;
}
IMPL_LINK_INLINE_END( SwFormatTablePage, UpHdl, MetricField *, pEdit )

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
IMPL_LINK_INLINE_START( SwFormatTablePage, DownHdl, MetricField *, pEdit )
{
    ModifyHdl( pEdit );
    return 0;
}
IMPL_LINK_INLINE_END( SwFormatTablePage, DownHdl, MetricField *, pEdit )

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
IMPL_LINK_INLINE_START( SwFormatTablePage, LoseFocusHdl, MetricField *, pEdit )
{
    ModifyHdl( pEdit );
    return 0;
}
IMPL_LINK_INLINE_END( SwFormatTablePage, LoseFocusHdl, MetricField *, pEdit )

void  SwFormatTablePage::ModifyHdl( Edit* pEdit )
{

    SwTwips nCurWidth = aWidthMF.Denormalize( aWidthMF.GetValue( FUNIT_TWIP ));
    SwTwips nPrevWidth = nCurWidth;
    SwTwips nRight = aRightMF.Denormalize( aRightMF.GetValue( FUNIT_TWIP ));
    SwTwips nLeft = aLeftMF.Denormalize( aLeftMF.GetValue( FUNIT_TWIP ));
    SwTwips nDiff;

    if( pEdit == &aWidthMF )
    {
        if( nCurWidth < MINLAY )
            nCurWidth = MINLAY;
        nDiff = nRight + nLeft + nCurWidth - pTblData->GetSpace() ;
        //rechtsbuendig nur linken Rand veraendern
        if(aRightBtn.IsChecked())
            nLeft -= nDiff;
        //linksbuendig nur rechten Rand veraendern
        else if(aLeftBtn.IsChecked())
            nRight -= nDiff;
        //linker Rand und Breite erlaubt - erst rechts - dann links
        else if(aFromLeftBtn.IsChecked())
        {
            if( nRight >= nDiff )
                nRight -= nDiff;
            else
            {
                nDiff -= nRight;
                nRight = 0;
                if(nLeft >= nDiff)
                    nLeft -= nDiff;
                else
                {
                    nRight += nLeft - nDiff;
                    nLeft = 0;
                    nCurWidth = pTblData->GetSpace();
                }

            }
        }
        //zentriert beide Seiten gleichmaessig veraendern
        else if(aCenterBtn.IsChecked())
        {
            if((nLeft != nRight))
            {
                nDiff += nLeft + nRight;
                nLeft = nDiff/2;
                nRight = nDiff/2;
            }
            else
            {
                    nLeft -= nDiff/2;
                    nRight -= nDiff/2;
            }
        }
        //freie Ausrichtung: beide Raender verkleinern
        else if(aFreeBtn.IsChecked())
        {
            nLeft -= nDiff/2;
            nRight -= nDiff/2;
        }
    }
    if( pEdit == &aRightMF  )
    {

        if( nRight + nLeft > pTblData->GetSpace() - MINLAY )
            nRight = pTblData->GetSpace() -nLeft - MINLAY;

        nCurWidth = pTblData->GetSpace() - nLeft - nRight;
    }
    if( pEdit == &aLeftMF )
    {
        if(!aFromLeftBtn.IsChecked())
        {
            BOOL bCenter = aCenterBtn.IsChecked();
            if( bCenter )
                nRight = nLeft;
            if(nRight + nLeft > pTblData->GetSpace() - MINLAY )
            {
                nLeft  = bCenter ?  (pTblData->GetSpace() - MINLAY) /2 :
                                    (pTblData->GetSpace() - MINLAY) - nRight;
                nRight = bCenter ?  (pTblData->GetSpace() - MINLAY) /2 : nRight;
            }
            nCurWidth = pTblData->GetSpace() - nLeft - nRight;
        }
        else
        {
            //hier wird bei Aenderung an der linken Seite zuerst der
            //rechte Rand veraendert, dann die Breite
            nDiff = nRight + nLeft + nCurWidth - pTblData->GetSpace() ;

            nRight -= nDiff;
            nCurWidth = pTblData->GetSpace() - nLeft - nRight;
        }
    }
    if (nCurWidth != nPrevWidth )
        aWidthMF.SetValue( aWidthMF.Normalize( nCurWidth ), FUNIT_TWIP );
    aRightMF.SetValue( aRightMF.Normalize( nRight ), FUNIT_TWIP );
    aLeftMF.SetValue( aLeftMF.Normalize( nLeft ), FUNIT_TWIP );
    bModified = TRUE;
}

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
SfxTabPage*  SwFormatTablePage::Create( Window* pParent,
                                   const SfxItemSet& rAttrSet)
{
    return new SwFormatTablePage( pParent, rAttrSet );
}

/*------------------------------------------------------------------------
-------------------------------------------------------------------------*/
BOOL  SwFormatTablePage::FillItemSet( SfxItemSet& rCoreSet )
{
    // Testen, ob eins der Control noch den Focus hat
    if(aWidthMF.HasFocus())
        ModifyHdl(&aWidthMF);
    else if(aLeftMF.HasFocus())
        ModifyHdl(&aLeftMF);
    else if(aRightMF.HasFocus())
        ModifyHdl(&aRightMF);
    else if(aTopMF.HasFocus())
        ModifyHdl(&aTopMF);
    else if(aBottomMF.HasFocus())
        ModifyHdl(&aBottomMF);

    if(bModified)
    {
        if( aBottomMF.GetText() != aBottomMF.GetSavedValue() ||
                                    aTopMF.GetText() != aTopMF.GetSavedValue() )
        {
            SvxULSpaceItem aULSpace(RES_UL_SPACE);
            aULSpace.SetUpper( (USHORT) aTopMF.Denormalize(
                                        aTopMF.GetValue( FUNIT_TWIP )));
            aULSpace.SetLower( (USHORT) aBottomMF.Denormalize(
                                        aBottomMF.GetValue( FUNIT_TWIP )));
            rCoreSet.Put(aULSpace);
        }

    }
    if(aNameED.GetText() != aNameED.GetSavedValue())
    {
        rCoreSet.Put(SfxStringItem( FN_PARAM_TABLE_NAME, aNameED.GetText()));
        bModified = TRUE;
    }
    return bModified;
}

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
void  SwFormatTablePage::Reset( const SfxItemSet& )
{
    const SfxItemSet& rSet = GetItemSet();
    const SfxPoolItem*  pItem;

    BOOL bHtmlMode = FALSE;
    if(SFX_ITEM_SET == rSet.GetItemState( SID_HTML_MODE, FALSE,&pItem )
        && ((const SfxUInt16Item*)pItem)->GetValue() & HTMLMODE_ON)
    {
        aNameED .Disable();
        aTopFT  .Hide();
        aTopMF  .Hide();
        aBottomFT.Hide();
        aBottomMF.Hide();
        aFreeBtn.Enable(FALSE);
        bHtmlMode = TRUE;
    }
    FieldUnit aMetric = ::GetDfltMetric(bHtmlMode);
    SetMetric( aWidthMF, aMetric );
    SetMetric( aRightMF, aMetric );
    SetMetric( aLeftMF, aMetric );
    SetMetric( aTopMF, aMetric );
    SetMetric( aBottomMF, aMetric );

    //Name
    if(SFX_ITEM_SET == rSet.GetItemState( FN_PARAM_TABLE_NAME, FALSE, &pItem ))
    {
        aNameED.SetText(((const SfxStringItem*)pItem)->GetValue());
        aNameED.SaveValue();
    }

    if(SFX_ITEM_SET == rSet.GetItemState( FN_TABLE_REP, FALSE, &pItem ))
    {
        pTblData = (SwTableRep*)((const SwPtrItem*) pItem)->GetValue();
        nMinTableWidth = pTblData->GetColCount() * MINLAY;

        if(pTblData->GetWidthPercent())
        {
            aRelWidthCB.Check(TRUE);
            RelWidthClickHdl(&aRelWidthCB);
            aWidthMF.SetValue(pTblData->GetWidthPercent(), FUNIT_CUSTOM);

            aWidthMF.SaveValue();
            nSaveWidth = aWidthMF.GetValue(FUNIT_CUSTOM);
        }
        else
        {
            aWidthMF.SetValue(aWidthMF.Normalize(
                            pTblData->GetWidth()), FUNIT_TWIP);
            aWidthMF.SaveValue();
            nSaveWidth = pTblData->GetWidth();
            nMinTableWidth = min(nSaveWidth, nMinTableWidth);
        }

        aWidthMF.SetRefValue(pTblData->GetSpace());
        aWidthMF.SetLast(aWidthMF.Normalize( pTblData->GetSpace() ));
        aLeftMF.SetLast(aLeftMF.Normalize( pTblData->GetSpace() ));
        aRightMF.SetLast(aRightMF.Normalize( pTblData->GetSpace() ));

        aLeftMF.SetValue(aLeftMF.Normalize(
                                pTblData->GetLeftSpace()), FUNIT_TWIP);
        aRightMF.SetValue(aRightMF.Normalize(
                            pTblData->GetRightSpace()), FUNIT_TWIP);
        aLeftMF.SaveValue();
        aRightMF.SaveValue();

        nOldAlign = pTblData->GetAlign();

        BOOL bSetRight = FALSE, bRightEnable = FALSE,
             bSetLeft  = FALSE, bLeftEnable  = FALSE;
        switch( nOldAlign )
        {
            case HORI_NONE:
                aFreeBtn.Check();
                if(aRelWidthCB.IsChecked())
                    bSetRight = TRUE;
            break;
            case HORI_FULL:
            {
                bSetRight = bSetLeft = TRUE;
                aFullBtn.Check();
                aRightMF.SetText( aEmptyStr );
                aLeftMF.SetText( aEmptyStr );
                aWidthMF.Enable(FALSE);
                aRelWidthCB.Enable(FALSE);
                aWidthFT.Enable(FALSE);
            }
            break;
            case HORI_LEFT:
            {
                bSetLeft = TRUE;
                aLeftBtn.Check();
                aLeftMF.SetText( aEmptyStr );
            }
            break;
            case HORI_LEFT_AND_WIDTH :
            {
                bSetRight = TRUE;
                aFromLeftBtn.Check();
                aRightMF.SetText( aEmptyStr );
            }
            break;
            case HORI_RIGHT:
            {
                bSetRight = TRUE;
                aRightBtn.Check();
                aRightMF.SetText( aEmptyStr );
            }
            break;
            case HORI_CENTER:
            {
                bSetRight = TRUE;
                aCenterBtn.Check();
                aRightMF.SetText( aEmptyStr );
            }
            break;
        }
        if ( bSetRight )
        {
            aRightMF.Enable(bRightEnable);
            aRightFT.Enable(bRightEnable);
        }
        if ( bSetLeft )
        {
            aLeftMF.Enable(bLeftEnable);
            aLeftFT.Enable(bLeftEnable);
        }

    }

    //Raender
    if(SFX_ITEM_SET == rSet.GetItemState( RES_UL_SPACE, FALSE,&pItem ))
    {
        aTopMF.SetValue(aTopMF.Normalize(
                        ((const SvxULSpaceItem*)pItem)->GetUpper()), FUNIT_TWIP);
        aBottomMF.SetValue(aBottomMF.Normalize(
                        ((const SvxULSpaceItem*)pItem)->GetLower()), FUNIT_TWIP);
        aTopMF.SaveValue();
        aBottomMF.SaveValue();
    }

    aWidthMF.SetMax( 2*aWidthMF.Normalize( pTblData->GetSpace() ), FUNIT_TWIP );
    aRightMF.SetMax( aRightMF.Normalize( pTblData->GetSpace() ), FUNIT_TWIP );
    aLeftMF.SetMax( aLeftMF.Normalize( pTblData->GetSpace() ), FUNIT_TWIP );
    aWidthMF.SetMin( aWidthMF.Normalize( nMinTableWidth ), FUNIT_TWIP );

}

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
void    SwFormatTablePage::ActivatePage( const SfxItemSet& rSet )
{
    DBG_ASSERT(pTblData, "Tabellendaten nicht da?")
    if(SFX_ITEM_SET == rSet.GetItemState( FN_TABLE_REP ))
    {
        SwTwips nCurWidth = HORI_FULL != pTblData->GetAlign() ?
                                        pTblData->GetWidth() :
                                            pTblData->GetSpace();
        if(pTblData->GetWidthPercent() == 0 &&
                nCurWidth != aWidthMF.Denormalize(aWidthMF.GetValue(FUNIT_TWIP )))
        {
            aWidthMF.SetValue(aWidthMF.Normalize(
                            nCurWidth), FUNIT_TWIP);
            aWidthMF.SaveValue();
            nSaveWidth = nCurWidth;
            aLeftMF.SetValue(aLeftMF.Normalize(
                            pTblData->GetLeftSpace()), FUNIT_TWIP);
            aLeftMF.SaveValue();
            aRightMF.SetValue(aRightMF.Normalize(
                            pTblData->GetRightSpace()), FUNIT_TWIP);
            aRightMF.SaveValue();
        }
    }

}
/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
int  SwFormatTablePage::DeactivatePage( SfxItemSet* pSet )
{
    // os: VCL sorgt nicht dafuer, dass das aktive Control im
    // dialog bei OK den focus verliert
    aNameED.GrabFocus();
    // Test des Tabellennamens auf Leerzeichen
    String sTblName = aNameED.GetText();
    if(sTblName.Search(' ') != STRING_NOTFOUND)
    {
        InfoBox(this, SW_RES(MSG_WRONG_TABLENAME)).Execute();
        aNameED.GrabFocus();
        return KEEP_PAGE;
    }
    if(pSet)
    {
        FillItemSet(*pSet);
        if(bModified)
        {
            SwTwips lLeft = aLeftMF.Denormalize( aLeftMF.GetValue( FUNIT_TWIP ));
            SwTwips lRight = aRightMF.Denormalize( aRightMF.GetValue( FUNIT_TWIP ));


            if( aLeftMF.GetText() != aLeftMF.GetSavedValue() ||
                                    aRightMF.GetText() != aRightMF.GetSavedValue() )
            {
                pTblData->SetWidthChanged();
                pTblData->SetLeftSpace( lLeft);
                pTblData->SetRightSpace( lRight);
            }

            SwTwips lWidth;
            if (aRelWidthCB.IsChecked() && aRelWidthCB.IsEnabled())
            {
                lWidth = pTblData->GetSpace() - lRight - lLeft;
                USHORT nPercentWidth = (USHORT)aWidthMF.GetValue(FUNIT_CUSTOM);
                if(pTblData->GetWidthPercent() != nPercentWidth)
                {
                    pTblData->SetWidthPercent(nPercentWidth);
                    pTblData->SetWidthChanged();
                }
            }
            else
            {
                pTblData->SetWidthPercent(0);
                lWidth = aWidthMF.Denormalize(aWidthMF.GetValue( FUNIT_TWIP ));
            }
            pTblData->SetWidth(lWidth);

            SwTwips nColSum = 0;
            for(USHORT i = 0; i < pTblData->GetColCount(); i++)
            {
                nColSum += pTblData->GetColumns()[i].nWidth;
            }
            if(nColSum != pTblData->GetWidth())
            {
                SwTwips nMinWidth = min(MINLAY, pTblData->GetWidth() / pTblData->GetColCount() - 1);
                SwTwips nDiff = nColSum - pTblData->GetWidth();
                while ( Abs(nDiff) > pTblData->GetColCount() + 1 )
                {
                    SwTwips nSub = nDiff / pTblData->GetColCount();
                    for( i = 0; i < pTblData->GetColCount(); i++)
                    {
                        if(pTblData->GetColumns()[i].nWidth - nMinWidth > nSub)
                        {
                            pTblData->GetColumns()[i].nWidth -= nSub;
                            nDiff -= nSub;
                        }
                        else
                        {
                            nDiff -= pTblData->GetColumns()[i].nWidth - nMinWidth;
                            pTblData->GetColumns()[i].nWidth = nMinWidth;
                        }

                    }
                }
            }

            int nAlign = 0;
            if(aRightBtn.IsChecked())
                nAlign = HORI_RIGHT;
            else if(aLeftBtn.IsChecked())
                nAlign = HORI_LEFT;
            else if(aFromLeftBtn.IsChecked())
                nAlign = HORI_LEFT_AND_WIDTH;
            else if(aCenterBtn.IsChecked())
                nAlign = HORI_CENTER;
            else if(aFreeBtn.IsChecked())
                nAlign = HORI_NONE;
            else if(aFullBtn.IsChecked())
            {
                nAlign = HORI_FULL;
                lWidth = lAutoWidth;
            }
            if(nAlign != pTblData->GetAlign())
            {
                pTblData->SetWidthChanged();
                pTblData->SetAlign(nAlign);
            }


    //      if(  HORI_CENTER && lWidth != (SwTwips)aWidthMF.GetSavedValue())
            if(pTblData->GetWidth() != lWidth )
            {
                pTblData->SetWidthChanged();
                pTblData->SetWidth(
                    nAlign == HORI_FULL ? pTblData->GetSpace() : lWidth );
            }
            if(pTblData->HasWidthChanged())
                pSet->Put(SwPtrItem(FN_TABLE_REP, pTblData));
        }
DEBUG_TBLDLG_TABLEREP(pTblData);
    }
    return TRUE;
}
/*------------------------------------------------------------------------
    Beschreibung: Seite Spaltenkonfiguration
------------------------------------------------------------------------*/
SwTableColumnPage::SwTableColumnPage( Window* pParent,
            const SfxItemSet& rSet ) :
    SfxTabPage(pParent, SW_RES( TP_TABLE_COLUMN ), rSet ),
    aModifyTableCB(this,    SW_RES(CB_MOD_TBL)),
    aProportionalCB(this,   SW_RES(CB_PROP)),
    aInverseCB(this,        SW_RES(CB_INV)),
    aSpaceFT(this,          SW_RES(FT_SPACE)),
    aSpaceED(this,          SW_RES(ED_SPACE)),
    aFT1(this,              SW_RES(COL_FT_1)),
    aMF1(this,              SW_RES(COL_MF_1)),
    aFT2(this,              SW_RES(COL_FT_2)),
    aMF2(this,              SW_RES(COL_MF_2)),
    aFT3(this,              SW_RES(COL_FT_3)),
    aMF3(this,              SW_RES(COL_MF_3)),
    aFT4(this,              SW_RES(COL_FT_4)),
    aMF4(this,              SW_RES(COL_MF_4)),
    aFT5(this,              SW_RES(COL_FT_5)),
    aMF5(this,              SW_RES(COL_MF_5)),
    aFT6(this,              SW_RES(COL_FT_6)),
    aMF6(this,              SW_RES(COL_MF_6)),
    aColGB(this,            SW_RES(COL_GB_LAYOUT)),
    aUpBtn(this,            SW_RES(COL_BTN_UP)),
    aDownBtn(this,          SW_RES(COL_BTN_DOWN)),
    nNoOfCols( 0 ),
    nNoOfVisibleCols( 0 ),
    nMinWidth( MINLAY ),
    bModified(FALSE),
    bModifyTbl(FALSE),
    bPercentMode(FALSE),
    nTableWidth(0)
{
    FreeResource();
    SetExchangeSupport();

    pFieldArr[0] = &aMF1;
    pFieldArr[1] = &aMF2;
    pFieldArr[2] = &aMF3;
    pFieldArr[3] = &aMF4;
    pFieldArr[4] = &aMF5;
    pFieldArr[5] = &aMF6;

    pTextArr[0] = &aFT1;
    pTextArr[1] = &aFT2;
    pTextArr[2] = &aFT3;
    pTextArr[3] = &aFT4;
    pTextArr[4] = &aFT5;
    pTextArr[5] = &aFT6;

    aInverseCB.Hide();
    const SfxPoolItem* pItem;
    Init((SFX_ITEM_SET == rSet.GetItemState( SID_HTML_MODE, FALSE,&pItem )
        && ((const SfxUInt16Item*)pItem)->GetValue() & HTMLMODE_ON));

};
/*------------------------------------------------------------------------
    Beschreibung: Seite Spaltenkonfiguration
------------------------------------------------------------------------*/
 SwTableColumnPage::~SwTableColumnPage()
{
};

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
SfxTabPage*   SwTableColumnPage::Create( Window* pParent,
                                const SfxItemSet& rAttrSet)
{
    return new SwTableColumnPage( pParent, rAttrSet );
};

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
void  SwTableColumnPage::Reset( const SfxItemSet& )
{
    const SfxItemSet& rSet = GetItemSet();

    const SfxPoolItem* pItem;
    if(SFX_ITEM_SET == rSet.GetItemState( FN_TABLE_REP, FALSE, &pItem ))
    {
        pTblData = (SwTableRep*)((const SwPtrItem*) pItem)->GetValue();
        nNoOfVisibleCols = pTblData->GetColCount();
        nNoOfCols = pTblData->GetAllColCount();
        nTableWidth = pTblData->GetAlign() != HORI_FULL &&
                            pTblData->GetAlign() != HORI_LEFT_AND_WIDTH?
                        pTblData->GetWidth() : pTblData->GetSpace();

        for( USHORT i = 0; i < nNoOfCols; i++ )
        {
            if( pTblData->GetColumns()[i].nWidth  < nMinWidth )
                    nMinWidth = pTblData->GetColumns()[i].nWidth;
        }
        long nMinTwips = pFieldArr[0]->Normalize( nMinWidth );
        long nMaxTwips = pFieldArr[0]->Normalize( nTableWidth );
        for( i = 0; (i < MET_FIELDS) && (i < nNoOfVisibleCols); i++ )
        {
            pFieldArr[i]->SetValue( pFieldArr[i]->Normalize(
                                                GetVisibleWidth(i) ), FUNIT_TWIP );
            pFieldArr[i]->SetMin( nMinTwips , FUNIT_TWIP );
            pFieldArr[i]->SetMax( nMaxTwips , FUNIT_TWIP );
            pFieldArr[i]->Enable();
            pTextArr[i]->Enable();
        }

        if( nNoOfVisibleCols > MET_FIELDS )
            aUpBtn.Enable();
        i = nNoOfVisibleCols;
        while( i < MET_FIELDS )
        {
            pFieldArr[i]->SetText( aEmptyStr );
            pTextArr[i]->Hide();
            i++;
        }
    }
    ActivatePage(rSet);

};

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
void  SwTableColumnPage::Init(BOOL bWeb)
{
    FieldUnit aMetric = ::GetDfltMetric(bWeb);
    Link aLkUp = LINK( this, SwTableColumnPage, UpHdl );
    Link aLkDown = LINK( this, SwTableColumnPage, DownHdl );
    Link aLkLF = LINK( this, SwTableColumnPage, LoseFocusHdl );
    for( USHORT i = 0; i < MET_FIELDS; i++ )
    {
        aValueTbl[i] = i;
        SetMetric(*pFieldArr[i], aMetric);
        pFieldArr[i]->SetUpHdl( aLkUp );
        pFieldArr[i]->SetDownHdl( aLkDown );
        pFieldArr[i]->SetLoseFocusHdl( aLkLF );

    }
    SetMetric(aSpaceED, aMetric);

    Link aLk = LINK( this, SwTableColumnPage, AutoClickHdl );
    aUpBtn.SetClickHdl( aLk );
    aDownBtn.SetClickHdl( aLk );

    aLk = LINK( this, SwTableColumnPage, ModeHdl );
    aModifyTableCB .SetClickHdl( aLk );
    aProportionalCB.SetClickHdl( aLk );
    aInverseCB     .SetClickHdl( aLk );
};

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
IMPL_LINK( SwTableColumnPage, AutoClickHdl, CheckBox *, pBox )
{
    //Anzeigefenster verschieben
    if(pBox == (CheckBox *)&aDownBtn)
    {
        if(aValueTbl[0] > 0)
        {
            for( USHORT i=0; i < MET_FIELDS; i++ )
                aValueTbl[i] -= 1;
        }
    }
    if(pBox == (CheckBox *)&aUpBtn)
    {
        if( aValueTbl[ MET_FIELDS -1 ] < nNoOfVisibleCols -1  )
        {
            for(USHORT i=0;i < MET_FIELDS;i++)
                aValueTbl[i] += 1;
        }
    }
    for( USHORT i = 0; (i < nNoOfVisibleCols ) && ( i < MET_FIELDS); i++ )
    {
        String sEntry('~');
        sEntry += String::CreateFromInt32( aValueTbl[i] + 1 );
        pTextArr[i]->SetText( sEntry );
    }

    aDownBtn.Enable(aValueTbl[0] > 0);
    aUpBtn.Enable(aValueTbl[ MET_FIELDS -1 ] < nNoOfVisibleCols -1 );
    UpdateCols(0);
    return 0;
};

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
IMPL_LINK_INLINE_START( SwTableColumnPage, UpHdl, PercentField *, pEdit )
{
    bModified = TRUE;
    ModifyHdl( pEdit );
    return 0;
};
IMPL_LINK_INLINE_END( SwTableColumnPage, UpHdl, PercentField *, pEdit )

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
IMPL_LINK_INLINE_START( SwTableColumnPage, DownHdl, PercentField *, pEdit )
{
    bModified = TRUE;
    ModifyHdl( pEdit );
    return 0;
};
IMPL_LINK_INLINE_END( SwTableColumnPage, DownHdl, PercentField *, pEdit )

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
IMPL_LINK_INLINE_START( SwTableColumnPage, LoseFocusHdl, PercentField *, pEdit )
{
    if(pEdit->IsModified())
    {
        bModified = TRUE;
        ModifyHdl( pEdit );
    }
    return 0;
};
IMPL_LINK_INLINE_END( SwTableColumnPage, LoseFocusHdl, PercentField *, pEdit )

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
IMPL_LINK( SwTableColumnPage, ModeHdl, CheckBox*, pBox )
{
    BOOL bCheck = pBox->IsChecked();
    if(pBox == &aProportionalCB)
    {
        if(bCheck)
            aModifyTableCB.Check();
        aModifyTableCB.Enable(!bCheck && bModifyTbl);
        aInverseCB.Enable(!bCheck);
    }
    else if(pBox == &aInverseCB)
    {
        if(bCheck)
            aModifyTableCB.Check(FALSE);
        aModifyTableCB.Enable(!bCheck && bModifyTbl);
        aProportionalCB.Enable(!bCheck);
    }
    else
        aInverseCB.Enable(!bCheck);

    return 0;
};

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
BOOL  SwTableColumnPage::FillItemSet( SfxItemSet& rSet )
{
    for( USHORT i = 0; i < MET_FIELDS; i++ )
    {
        if(pFieldArr[i]->HasFocus())
        {
            LoseFocusHdl(pFieldArr[i]);
            break;
        }
    }

    if(bModified)
    {
        pTblData->SetColsChanged();
    }
    return bModified;
};

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
void   SwTableColumnPage::ModifyHdl( PercentField* pEdit )
{
        USHORT nAktPos;
        for( USHORT i = 0; i < MET_FIELDS; i++)
            if(pEdit == pFieldArr[i])
                break;

        SetVisibleWidth(aValueTbl[i], pEdit->Denormalize( pEdit->GetValue( FUNIT_TWIP ) ));
        nAktPos = aValueTbl[i];

        UpdateCols( nAktPos );
};

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
void   SwTableColumnPage::UpdateCols( USHORT nAktPos )
{
    SwTwips nSum = 0;

    for(USHORT i = 0; i < nNoOfCols; i++ )
    {
        nSum += (pTblData->GetColumns())[i].nWidth;
    }
    SwTwips nDiff = nSum - nTableWidth;

    BOOL bModifyTbl = aModifyTableCB.IsChecked();
    BOOL bProp =    aProportionalCB.IsChecked();
    BOOL bInverse = aInverseCB     .IsChecked();

    if(!bModifyTbl && !bProp &&!bInverse)
    {
//      Tabellenbreite bleibt, Differenz wird mit der/den
//      naechsten Zellen ausgeglichen
        while( nDiff )
        {
            if( ++nAktPos == nNoOfVisibleCols)
                nAktPos = 0;
            if( nDiff < 0 )
            {
                SetVisibleWidth(nAktPos, GetVisibleWidth(nAktPos) -nDiff);
                nDiff = 0;
            }
            else if( GetVisibleWidth(nAktPos) >= nDiff + nMinWidth )
            {
                SetVisibleWidth(nAktPos, GetVisibleWidth(nAktPos) -nDiff);
                nDiff = 0;
            }
            if( nDiff > 0 && GetVisibleWidth(nAktPos) > nMinWidth )
            {
                if( nDiff >= (GetVisibleWidth(nAktPos) - nMinWidth) )
                {
                    nDiff -= (GetVisibleWidth(nAktPos) - nMinWidth);
                    SetVisibleWidth(nAktPos, nMinWidth);
                }
                else
                {
                    nDiff = 0;
                    SetVisibleWidth(nAktPos, GetVisibleWidth(nAktPos) -nDiff);
                }
                DBG_ASSERT(nDiff >= 0, "nDiff < 0 kann hier nicht sein!")
            }
        }
    }
    else if(bModifyTbl && !bProp &&!bInverse)
    {
//      Differenz wird ueber die Tabellenbreite ausgeglichen,
//      andere Spalten bleiben unveraendert
        DBG_ASSERT(nDiff <= pTblData->GetSpace() - nTableWidth, "Maximum falsch eingestellt" )
        SwTwips nActSpace = pTblData->GetSpace() - nTableWidth;
        if(nDiff > nActSpace)
        {
            nTableWidth = pTblData->GetSpace();
            SetVisibleWidth(nAktPos, GetVisibleWidth(nAktPos) - nDiff + nActSpace );
        }
        else
        {
            nTableWidth += nDiff;
        }
    }
    else if(bModifyTbl & bProp)
    {
//      Alle Spalten werden proportional mitveraendert, die Tabellenbreite wird
//      entsprechend angepasst
        DBG_ASSERT(nDiff * nNoOfVisibleCols <= pTblData->GetSpace() - nTableWidth, "Maximum falsch eingestellt" )
        long nAdd = nDiff;
        if(nDiff * nNoOfVisibleCols > pTblData->GetSpace() - nTableWidth)
        {
            nAdd = (pTblData->GetSpace() - nTableWidth) / nNoOfVisibleCols;
            SetVisibleWidth(nAktPos, GetVisibleWidth(nAktPos) - nDiff + nAdd );
            nDiff = nAdd;
        }
        if(nAdd)
            for(USHORT i = 0; i < nNoOfVisibleCols; i++ )
            {
                if(i == nAktPos)
                    continue;
                SwTwips nVisWidth;
                if((nVisWidth = GetVisibleWidth(i)) + nDiff < MINLAY)
                {
                    nAdd += nVisWidth - MINLAY;
                    SetVisibleWidth(i, MINLAY);
                }
                else
                {
                    SetVisibleWidth(i, nVisWidth + nDiff);
                    nAdd += nDiff;
                }

            }
        nTableWidth += nAdd;

    }
    else
    {
//      Die Differenz wird gleichmaessig auf alle anderen Spalten aufgeteilt
//      die Tabellenbreite bleibt konstant
/*
        SwTwips nDiffn = nDiff/(nNoOfVisibleCols - 1);
        if(nDiff < 0 && (nNoOfVisibleCols - 1) * nDiffn != nDiff)
            nDiffn-- ;
        USHORT nStart = nAktPos++;
        if(nAktPos == nNoOfVisibleCols)
            nStart = 0;
        for(USHORT i = 0; i < nNoOfVisibleCols; i++ )
        {
            if((nVisWidth = GetVisibleWidth(i)) + nDiff < MINLAY)
            {
                nAdd += nVisWidth - MINLAY;
                SetVisibleWidth(i, MINLAY);
            }
        }
*/

    }

DEBUG_TBLDLG_TABLEREP(pTblData);

    if(!bPercentMode)
        aSpaceED.SetValue(aSpaceED.Normalize( pTblData->GetSpace() - nTableWidth) , FUNIT_TWIP);

    for( i = 0; ( i < nNoOfVisibleCols ) && ( i < MET_FIELDS ); i++)
    {
        pFieldArr[i]->SetValue(pFieldArr[i]->Normalize(
                        GetVisibleWidth(aValueTbl[i]) ), FUNIT_TWIP);
        pFieldArr[i]->ClearModifyFlag();
    }

}

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
void    SwTableColumnPage::ActivatePage( const SfxItemSet& rSet )
{
    bPercentMode = pTblData->GetWidthPercent() != 0;
    for( USHORT i = 0; (i < MET_FIELDS) && (i < nNoOfVisibleCols); i++ )
    {
        pFieldArr[i]->SetRefValue(pTblData->GetWidth());
        pFieldArr[i]->ShowPercent( bPercentMode );
    }

    USHORT nTblAlign = pTblData->GetAlign();
    if((HORI_FULL != nTblAlign && nTableWidth != pTblData->GetWidth()) ||
    (HORI_FULL == nTblAlign && nTableWidth != pTblData->GetSpace()))
    {
        nTableWidth = HORI_FULL == nTblAlign ?
                                    pTblData->GetSpace() :
                                        pTblData->GetWidth();
        UpdateCols(0);
    }
    bModifyTbl = TRUE;
    if(pTblData->GetWidthPercent() ||
                HORI_FULL == nTblAlign ||
                        pTblData->IsLineSelected()  )
        bModifyTbl = FALSE;
    if(bPercentMode)
    {
        aInverseCB      .Enable(FALSE);
        aModifyTableCB  .Check(FALSE);
        aProportionalCB .Check(FALSE);
        aInverseCB      .Check(FALSE);
    }
    else if( !bModifyTbl )
    {
        aProportionalCB.Check(FALSE);
        aModifyTableCB.Check(FALSE);
    }
    aSpaceFT.Enable(!bPercentMode);
    aSpaceED.Enable(!bPercentMode);
    aModifyTableCB.Enable( !bPercentMode && bModifyTbl );
    aProportionalCB.Enable(!bPercentMode && bModifyTbl );

/*  if(pTblData->IsLineSelected() && pTblData->IsComplex())
    {

    }*/
    aSpaceED.SetValue(aSpaceED.Normalize(
                pTblData->GetSpace() - nTableWidth) , FUNIT_TWIP);

}

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
int  SwTableColumnPage::DeactivatePage( SfxItemSet* pSet )
{
    if(pSet)
    {
        FillItemSet(*pSet);
        if(HORI_FULL != pTblData->GetAlign() && pTblData->GetWidth() != nTableWidth)
        {
            pTblData->SetWidth(nTableWidth);
            SwTwips nDiff = pTblData->GetSpace() - pTblData->GetWidth() -
                            pTblData->GetLeftSpace() - pTblData->GetRightSpace();
            switch( pTblData->GetAlign()  )
            {
                case HORI_RIGHT:
                    pTblData->SetLeftSpace(pTblData->GetLeftSpace() + nDiff);
                break;
                case HORI_LEFT:
                    pTblData->SetRightSpace(pTblData->GetRightSpace() + nDiff);
                break;
                case HORI_NONE:
                {
                    SwTwips nDiff2 = nDiff/2;
                    if( nDiff > 0 ||
                        (-nDiff2 < pTblData->GetRightSpace() && - nDiff2 < pTblData->GetLeftSpace()))
                    {
                        pTblData->SetRightSpace(pTblData->GetRightSpace() + nDiff2);
                        pTblData->SetLeftSpace(pTblData->GetLeftSpace() + nDiff2);
                    }
                    else
                    {
                        if(pTblData->GetRightSpace() > pTblData->GetLeftSpace())
                        {
                            pTblData->SetLeftSpace(0);
                            pTblData->SetRightSpace(pTblData->GetSpace() - pTblData->GetWidth());
                        }
                        else
                        {
                            pTblData->SetRightSpace(0);
                            pTblData->SetLeftSpace(pTblData->GetSpace() - pTblData->GetWidth());
                        }
                    }
                }
                break;
                case HORI_CENTER:
                    pTblData->SetRightSpace(pTblData->GetRightSpace() + nDiff/2);
                    pTblData->SetLeftSpace(pTblData->GetLeftSpace() + nDiff/2);
                break;
                case HORI_LEFT_AND_WIDTH :
                    if(nDiff > pTblData->GetRightSpace())
                    {
                        pTblData->SetLeftSpace(pTblData->GetSpace() - pTblData->GetWidth());
                    }
                    pTblData->SetRightSpace(
                        pTblData->GetSpace() - pTblData->GetWidth() - pTblData->GetLeftSpace());
                break;
            }
            pTblData->SetWidthChanged();
        }
DEBUG_TBLDLG_TABLEREP(pTblData);
        pSet->Put(SwPtrItem( FN_TABLE_REP, pTblData ));
    }
    return TRUE;
}

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
SwTwips  SwTableColumnPage::GetVisibleWidth(USHORT nPos)
{
    USHORT i=0;

    while( nPos )
    {
        if(pTblData->GetColumns()[i].bVisible && nPos)
            nPos--;
        i++;
    }
    SwTwips nReturn = pTblData->GetColumns()[i].nWidth;
    DBG_ASSERT(i < nNoOfCols, "Array index out of range")
    while(!pTblData->GetColumns()[i].bVisible && (i + 1) < nNoOfCols)
        nReturn += pTblData->GetColumns()[++i].nWidth;

//  return (*ppTableColumns)[i].nWidth;
    return nReturn;
}

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
void SwTableColumnPage::SetVisibleWidth(USHORT nPos, SwTwips nNewWidth)
{
    USHORT i=0;
    while( nPos )
    {
        if(pTblData->GetColumns()[i].bVisible && nPos)
            nPos--;
        i++;
    }
    DBG_ASSERT(i < nNoOfCols, "Array index out of range")
    pTblData->GetColumns()[i].nWidth = nNewWidth;
    while(!pTblData->GetColumns()[i].bVisible && (i + 1) < nNoOfCols)
        pTblData->GetColumns()[++i].nWidth = 0;

}

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
SwTableTabDlg::SwTableTabDlg(Window* pParent, SfxItemPool& ,
                    const SfxItemSet* pItemSet, SwWrtShell* pSh ) :
        SfxTabDialog(pParent, SW_RES(DLG_FORMAT_TABLE), pItemSet,0),
        pShell(pSh)
{
    FreeResource();
    nHtmlMode = ::GetHtmlMode(pSh->GetView().GetDocShell());
    AddTabPage(TP_FORMAT_TABLE, &SwFormatTablePage::Create, 0 );
    AddTabPage(TP_TABLE_TEXTFLOW, &SwTextFlowPage::Create, 0 );
    AddTabPage(TP_TABLE_COLUMN, &SwTableColumnPage::Create, 0 );
    AddTabPage(TP_BACKGROUND,   SvxBackgroundTabPage::Create,   0);
    AddTabPage(TP_BORDER,       SvxBorderTabPage::Create,       0);
}


/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
void  SwTableTabDlg::PageCreated(USHORT nId, SfxTabPage& rPage)
{
    if( TP_BACKGROUND == nId )
    {
        //ShowTblControl() zuerst rufen, wegen HTMLMode
        ((SvxBackgroundTabPage&)rPage).ShowTblControl();
        if(!( nHtmlMode & HTMLMODE_ON ) ||
            nHtmlMode & HTMLMODE_SOME_STYLES)
            ((SvxBackgroundTabPage&)rPage).ShowSelector();

    }
    else if(TP_BORDER == nId)
    {
        ((SvxBorderTabPage&)rPage).SetSWMode(SW_BORDER_MODE_TABLE);
    }
    else if(TP_TABLE_TEXTFLOW == nId)
    {
        ((SwTextFlowPage&)rPage).SetShell(pShell);
        const USHORT eType = pShell->GetFrmType(0,TRUE);
        if( !(FRMTYPE_BODY & eType) )
            ((SwTextFlowPage&)rPage).DisablePageBreak();
    }
}

/*-----------------20.08.96 09.43-------------------
--------------------------------------------------*/
SwTableRep::SwTableRep( const SwTabCols& rTabCol, BOOL bCplx )
    : nTblWidth(0),
    nSpace(0),
    nLeftSpace(0),
    nRightSpace(0),
    nAlign(0),
    nWidthPercent(0),
    bLineSelected(FALSE),
    bComplex(bCplx),
    bWidthChanged(FALSE),
    bColsChanged(FALSE)
{
    nAllCols = nColCount = rTabCol.Count();
    pTColumns = new TColumn[ nColCount + 1 ];
    SwTwips nStart = 0,
            nEnd;
    for( USHORT i = 0; i < nAllCols; ++i )
    {
        nEnd  = rTabCol[ i ] - rTabCol.GetLeft();
        pTColumns[ i ].nWidth = nEnd - nStart;
        pTColumns[ i ].bVisible = !rTabCol.IsHidden(i);
        if(!pTColumns[ i ].bVisible)
            nColCount --;
        nStart = nEnd;
    }
    pTColumns[ nAllCols ].nWidth = rTabCol.GetRight() - rTabCol.GetLeft() - nStart;
    pTColumns[ nAllCols ].bVisible = TRUE;
    nColCount++;
    nAllCols++;
}

/*-----------------20.08.96 09.43-------------------
--------------------------------------------------*/
SwTableRep::~SwTableRep()
{
    delete pTColumns;
}

/*-----------------20.08.96 13.33-------------------
--------------------------------------------------*/
BOOL SwTableRep::FillTabCols( SwTabCols& rTabCols ) const
{
    USHORT nOldLeft = rTabCols.GetLeft();
    USHORT nOldRight = rTabCols.GetRight();

    BOOL bSingleLine = FALSE;
    for ( USHORT i = 0; i < rTabCols.Count(); ++i )
        if(!pTColumns[i].bVisible)
        {
            bSingleLine = TRUE;
            break;
        }

DEBUG_TBLDLG_TCOLUMN(pTColumns, nAllCols);

    SwTwips nPos = 0;
    SwTwips nLeft = GetLeftSpace();
    rTabCols.SetLeft((USHORT)nLeft);
    if(bSingleLine)
    {
        // die unsichtbaren Trenner werden aus den alten TabCols genommen
        // die sichtbaren kommen aus pTColumns
        TColumn*    pOldTColumns = new TColumn[nAllCols + 1];
        SwTwips nStart = 0,
                nEnd;
        for(USHORT i = 0; i < nAllCols - 1; i++)
        {
            nEnd  = rTabCols[i] - rTabCols.GetLeft();
            pOldTColumns[i].nWidth = nEnd - nStart;
            pOldTColumns[i].bVisible = !rTabCols.IsHidden(i);
            nStart = nEnd;
        }
        pOldTColumns[nAllCols - 1].nWidth = rTabCols.GetRight() - rTabCols.GetLeft() - nStart;
        pOldTColumns[nAllCols - 1].bVisible = TRUE;

DEBUG_TBLDLG_TCOLUMN(pOldTColumns, nAllCols);

        USHORT nOldPos = 0;
        USHORT nNewPos = 0;
        SwTwips nOld = 0;
        SwTwips nNew = 0;
        BOOL bOld = FALSE;
        BOOL bFirst = TRUE;
        i = 0;

        while ( i < nAllCols -1 )
        {
            while((bFirst || bOld ) && nOldPos < nAllCols )
            {
                nOld += pOldTColumns[nOldPos].nWidth;
                nOldPos++;
                if(!pOldTColumns[nOldPos - 1].bVisible)
                    break;
            }
            while((bFirst || !bOld ) && nNewPos < nAllCols )
            {
                nNew += pTColumns[nNewPos].nWidth;
                nNewPos++;
                if(pOldTColumns[nNewPos - 1].bVisible)
                    break;
            }
            bFirst = FALSE;
            // sie muessen sortiert eingefuegt werden
            bOld = nOld < nNew;
            nPos = USHORT(bOld ? nOld : nNew);
            rTabCols[i] = nPos + nLeft;
            rTabCols.SetHidden( i, bOld );
            i++;
        }
        rTabCols.SetRight(nLeft + nTblWidth);

        delete pOldTColumns;
    }
    else
    {
        for ( i = 0; i < nAllCols - 1; ++i )
        {
            nPos += pTColumns[i].nWidth;
            rTabCols[i] = nPos + rTabCols.GetLeft();
            rTabCols.SetHidden( i, !pTColumns[i].bVisible );
            rTabCols.SetRight(nLeft + pTColumns[nAllCols - 1].nWidth + nPos);
        }
    }

// Rundungsfehler abfangen
    if(Abs((long)nOldLeft - (long)rTabCols.GetLeft()) < 3)
        rTabCols.SetLeft(nOldLeft);

    if(Abs((long)nOldRight - (long)rTabCols.GetRight()) < 3)
        rTabCols.SetRight(nOldRight);

    if(rTabCols.GetRight() > rTabCols.GetRightMax())
        rTabCols.SetRight(rTabCols.GetRightMax());
    return bSingleLine;
}




/*-----------------12.12.96 12.22-------------------
--------------------------------------------------*/
SwTextFlowPage::SwTextFlowPage( Window* pParent,
                                const SfxItemSet& rSet ) :
    SfxTabPage(pParent, SW_RES( TP_TABLE_TEXTFLOW ), rSet ),
    aFlowGB         (this, SW_RES(GB_FLOW            )),
    aPgBrkCB        (this, SW_RES(CB_PAGEBREAK      )),
    aPgBrkRB        (this, SW_RES(RB_BREAKPAGE      )),
    aColBrkRB       (this, SW_RES(RB_BREAKCOLUMN    )),
    aPgBrkBeforeRB  (this, SW_RES(RB_PAGEBREAKBEFORE)),
    aPgBrkAfterRB   (this, SW_RES(RB_PAGEBREAKAFTER )),
    aPageCollCB     (this, SW_RES(CB_PAGECOLL       )),
    aPageCollLB     (this, SW_RES(LB_PAGECOLL       )),
    aPageNoFT       (this, SW_RES(FT_PAGENUM        )),
    aPageNoNF       (this, SW_RES(NF_PAGENUM        )),
    aKeepCB         (this, SW_RES(CB_KEEP           )),
    aSplitCB        (this, SW_RES(CB_SPLIT          )),
    aHeadLineCB     (this, SW_RES(CB_HEADLINE       )),
    aVertOrientGB   (this, SW_RES(GB_VERT_ORIENT    )),
    aTopRB          (this, SW_RES(RB_VERT_TOP       )),
    aCenterRB       (this, SW_RES(RB_VERT_CENTER    )),
    aBottomRB       (this, SW_RES(RB_VERT_BOTTOM    )),
    pShell(0),
    bPageBreak(TRUE),
    bHtmlMode(FALSE)
{
    FreeResource();

    aPgBrkCB.SetClickHdl(LINK(this, SwTextFlowPage, PageBreakHdl_Impl));
    aPgBrkBeforeRB.SetClickHdl(
        LINK( this, SwTextFlowPage, PageBreakPosHdl_Impl ) );
    aPgBrkAfterRB.SetClickHdl(
        LINK( this, SwTextFlowPage, PageBreakPosHdl_Impl ) );
    aPageCollCB.SetClickHdl(
        LINK( this, SwTextFlowPage, ApplyCollClickHdl_Impl ) );
    aColBrkRB.SetClickHdl(
        LINK( this, SwTextFlowPage, PageBreakTypeHdl_Impl ) );
    aPgBrkRB.SetClickHdl(
        LINK( this, SwTextFlowPage, PageBreakTypeHdl_Impl ) );

#ifndef SW_FILEFORMAT_40
    const SfxPoolItem *pItem;
    if(SFX_ITEM_SET == rSet.GetItemState( SID_HTML_MODE, FALSE,&pItem )
        && ((const SfxUInt16Item*)pItem)->GetValue() & HTMLMODE_ON)
#endif
    {
        aKeepCB.Hide();
        aSplitCB.Hide();
    }
}

/*-----------------12.12.96 12.22-------------------
--------------------------------------------------*/
 SwTextFlowPage::~SwTextFlowPage()
{
}

/*-----------------12.12.96 12.22-------------------
--------------------------------------------------*/
SfxTabPage*   SwTextFlowPage::Create( Window* pParent,
                                const SfxItemSet& rAttrSet)
{
    return new SwTextFlowPage(pParent, rAttrSet);
}

/*-----------------12.12.96 12.22-------------------
--------------------------------------------------*/
BOOL  SwTextFlowPage::FillItemSet( SfxItemSet& rSet )
{
    BOOL bModified = FALSE;

    //Ueberschrift wiederholen
    if(aHeadLineCB.IsChecked() != aHeadLineCB.GetSavedValue())
    {
        bModified |= 0 != rSet.Put( SfxBoolItem(FN_PARAM_TABLE_HEADLINE,
                                    aHeadLineCB.IsChecked()));
    }
    if(aKeepCB.IsChecked() != aKeepCB.GetSavedValue())
        bModified |= 0 != rSet.Put( SvxFmtKeepItem( aKeepCB.IsChecked()));

    if(aSplitCB.IsChecked() != aSplitCB.GetSavedValue())
        bModified |= 0 != rSet.Put( SwFmtLayoutSplit( !aSplitCB.IsChecked()));

    const SvxFmtBreakItem* pBreak = (const SvxFmtBreakItem*)GetOldItem( rSet, RES_BREAK );
    const SwFmtPageDesc* pDesc = (const SwFmtPageDesc*) GetOldItem( rSet, RES_PAGEDESC );


    BOOL bState = aPageCollCB.IsChecked();

    //Wenn Seitenvorlage, dann kein Break
    BOOL bPageItemPut = FALSE;
    if ( bState != aPageCollCB.GetSavedValue() ||
         ( bState &&
           aPageCollLB.GetSelectEntryPos() != aPageCollLB.GetSavedValue() )
           || aPageNoNF.IsEnabled() && aPageNoNF.IsValueModified())
    {
        String sPage;

        if ( bState )
        {
            sPage = aPageCollLB.GetSelectEntry();
        }
        USHORT nPgNum = aPageNoNF.GetValue();
        if ( !pDesc || !pDesc->GetPageDesc() ||
            ( pDesc->GetPageDesc() && ((pDesc->GetPageDesc()->GetName() != sPage) ||
                    aPageNoNF.GetSavedValue() != (String)nPgNum)))
        {
            SwFmtPageDesc aFmt( pShell->FindPageDescByName( sPage, TRUE ) );
            aFmt.SetNumOffset(bState ? nPgNum : 0);
            bModified |= 0 != rSet.Put( aFmt );
            bPageItemPut = bState;
        }
    }
    BOOL bIsChecked = aPgBrkCB.IsChecked();
    if ( !bPageItemPut &&
        (   bState != aPageCollCB.GetSavedValue() ||
            bIsChecked != aPgBrkCB.GetSavedValue()              ||
            aPgBrkBeforeRB.IsChecked() != aPgBrkBeforeRB.GetSavedValue()    ||
            aPgBrkRB.IsChecked() != aPgBrkRB.GetSavedValue() ))
    {
        SvxFmtBreakItem aBreak(
            (const SvxFmtBreakItem&)GetItemSet().Get( RES_BREAK ) );

        if(bIsChecked)
        {
            BOOL bBefore = aPgBrkBeforeRB.IsChecked();

            if ( aPgBrkRB.IsChecked() )
            {
                if ( bBefore )
                    aBreak.SetValue( SVX_BREAK_PAGE_BEFORE );
                else
                    aBreak.SetValue( SVX_BREAK_PAGE_AFTER );
            }
            else
            {
                if ( bBefore )
                    aBreak.SetValue( SVX_BREAK_COLUMN_BEFORE );
                else
                    aBreak.SetValue( SVX_BREAK_COLUMN_AFTER );
            }
        }
        else
        {
                aBreak.SetValue( SVX_BREAK_NONE );
        }

        if ( !pBreak || !( *(const SvxFmtBreakItem*)pBreak == aBreak ) )
        {
            bModified |= 0 != rSet.Put( aBreak );
        }
    }

    USHORT nOrient = USHRT_MAX;
    if(aTopRB.IsChecked() &&  !aTopRB.GetSavedValue())
        nOrient = VERT_NONE;
    else if( aCenterRB.IsChecked() && !aCenterRB.GetSavedValue() )
        nOrient = VERT_CENTER;
    else if( aBottomRB.IsChecked() && !aBottomRB.GetSavedValue() )
        nOrient = VERT_BOTTOM;
    if(nOrient != USHRT_MAX)
        bModified |= 0 != rSet.Put(SfxUInt16Item(FN_TABLE_SET_VERT_ALIGN, nOrient));

    return bModified;

}

/*-----------------12.12.96 12.22-------------------
--------------------------------------------------*/
void   SwTextFlowPage::Reset( const SfxItemSet& rSet )
{
    const SfxPoolItem* pItem;
    OfaHtmlOptions* pHtmlOpt = OFF_APP()->GetHtmlOptions();
    BOOL bFlowAllowed = !bHtmlMode || pHtmlOpt->IsPrintLayoutExtension();
    if(bFlowAllowed)
    {
        // Einfuegen der vorhandenen Seitenvorlagen in die Listbox
        const USHORT nCount = pShell->GetPageDescCnt();
        for(USHORT i = 0; i < nCount; ++i)
        {
            const SwPageDesc &rPageDesc = pShell->GetPageDesc(i);
            aPageCollLB.InsertEntry(rPageDesc.GetName());
        }

        for(i = RES_POOLPAGE_BEGIN; i <= RES_POOLPAGE_REGISTER; ++i)
        {
            String aFmtName; GetDocPoolNm( i, aFmtName );
            if( LISTBOX_ENTRY_NOTFOUND == aPageCollLB.GetEntryPos( aFmtName ))
                aPageCollLB.InsertEntry( aFmtName );
        }

        if(SFX_ITEM_SET == rSet.GetItemState( RES_KEEP, FALSE, &pItem ))
        {
            aKeepCB.Check( ((const SvxFmtKeepItem*)pItem)->GetValue() );
            aKeepCB.SaveValue();
        }
        if(SFX_ITEM_SET == rSet.GetItemState( RES_LAYOUT_SPLIT, FALSE, &pItem ))
        {
            aSplitCB.Check( !((const SwFmtLayoutSplit*)pItem)->GetValue() );
            aSplitCB.SaveValue();
        }

        if(bPageBreak)
        {
            if(SFX_ITEM_SET == rSet.GetItemState( RES_PAGEDESC, FALSE, &pItem ))
            {
                String sPageDesc;
                const SwPageDesc* pDesc = ((const SwFmtPageDesc*)pItem)->GetPageDesc();
                aPageNoNF.SetValue(((const SwFmtPageDesc*)pItem)->GetNumOffset());
                if(pDesc)
                    sPageDesc = pDesc->GetName();
                if ( sPageDesc.Len() &&
                        aPageCollLB.GetEntryPos( sPageDesc ) != LISTBOX_ENTRY_NOTFOUND )
                {
                    aPageCollLB.SelectEntry( sPageDesc );
                    aPageCollCB.Check();

                    aPgBrkCB.Enable();
                    aPgBrkRB.Enable();
                    aColBrkRB.Enable();
                    aPgBrkBeforeRB.Enable();
                    aPgBrkAfterRB.Enable();
                    aPageCollCB.Enable();
                    aPgBrkCB.Check();

                    aPgBrkCB.Check( TRUE );
                    aColBrkRB.Check( FALSE );
                    aPgBrkBeforeRB.Check( TRUE );
                    aPgBrkAfterRB.Check( FALSE );
                }
                else
                {
                    aPageCollLB.SetNoSelection();
                    aPageCollCB.Check(FALSE);
                }
            }

            if(SFX_ITEM_SET == rSet.GetItemState( RES_BREAK, FALSE, &pItem ))
            {
                const SvxFmtBreakItem* pPageBreak = (const SvxFmtBreakItem*)pItem;
                SvxBreak eBreak = (SvxBreak)pPageBreak->GetValue();

                if ( eBreak != SVX_BREAK_NONE )
                {
                    aPgBrkCB.Check();
                    aPageCollCB.Enable(FALSE);
                    aPageCollLB.Enable(FALSE);
                    aPageNoNF.Enable(FALSE);
                }
                switch ( eBreak )
                {
                    case SVX_BREAK_PAGE_BEFORE:
                        aPgBrkRB.Check( TRUE );
                        aColBrkRB.Check( FALSE );
                        aPgBrkBeforeRB.Check( TRUE );
                        aPgBrkAfterRB.Check( FALSE );
                        break;
                    case SVX_BREAK_PAGE_AFTER:
                        aPgBrkRB.Check( TRUE );
                        aColBrkRB.Check( FALSE );
                        aPgBrkBeforeRB.Check( FALSE );
                        aPgBrkAfterRB.Check( TRUE );
                        break;
                    case SVX_BREAK_COLUMN_BEFORE:
                        aPgBrkRB.Check( FALSE );
                        aColBrkRB.Check( TRUE );
                        aPgBrkBeforeRB.Check( TRUE );
                        aPgBrkAfterRB.Check( FALSE );
                        break;
                    case SVX_BREAK_COLUMN_AFTER:
                        aPgBrkRB.Check( FALSE );
                        aColBrkRB.Check( TRUE );
                        aPgBrkBeforeRB.Check( FALSE );
                        aPgBrkAfterRB.Check( TRUE );
                        break;
                }

            }
            if ( aPgBrkBeforeRB.IsChecked() )
                PageBreakPosHdl_Impl( &aPgBrkBeforeRB );
            else if ( aPgBrkAfterRB.IsChecked() )
                PageBreakPosHdl_Impl( &aPgBrkAfterRB );
            PageBreakHdl_Impl( &aPgBrkCB );
        }
    }
    else
    {
        aPgBrkRB.Enable(FALSE);
        aColBrkRB.Enable(FALSE);
        aPgBrkBeforeRB.Enable(FALSE);
        aPgBrkAfterRB.Enable(FALSE);
        aKeepCB .Enable(FALSE);
        aSplitCB.Enable(FALSE);
        aPgBrkCB.Enable(FALSE);
        aPageCollCB.Enable(FALSE);
        aPageCollLB.Enable(FALSE);
    }

    if(SFX_ITEM_SET == rSet.GetItemState( FN_PARAM_TABLE_HEADLINE, FALSE, &pItem ))
    {
        aHeadLineCB.Check( ((const SfxBoolItem*)pItem)->GetValue() );
        aHeadLineCB.SaveValue();
    }
    if ( rSet.GetItemState(FN_TABLE_SET_VERT_ALIGN) > SFX_ITEM_AVAILABLE )
    {
        USHORT nVert = ((const SfxUInt16Item&)rSet.Get(FN_TABLE_SET_VERT_ALIGN)).GetValue();
        switch(nVert)
        {
            case VERT_NONE:     aTopRB.Check();     break;
            case VERT_CENTER:   aCenterRB.Check();  break;
            case VERT_BOTTOM:   aBottomRB.Check();  break;
        }
    }

    aPageCollCB.SaveValue();
    aPageCollLB.SaveValue();
    aPgBrkCB.SaveValue();
    aPgBrkRB.SaveValue();
    aColBrkRB.SaveValue();
    aPgBrkBeforeRB.SaveValue();
    aPgBrkAfterRB.SaveValue();
    aPageNoNF.SaveValue();
    aTopRB.SaveValue();
    aCenterRB.SaveValue();
    aBottomRB.SaveValue();
}
/*-----------------16.04.98 14:48-------------------

--------------------------------------------------*/

void SwTextFlowPage::SetShell(SwWrtShell* pSh)
{
    pShell = pSh;
    bHtmlMode = 0 != (::GetHtmlMode(pShell->GetView().GetDocShell()) & HTMLMODE_ON);
    if(bHtmlMode)
    {
        aPageNoNF.Enable(FALSE);
        aPageNoFT.Enable(FALSE);
    }
}

/*-----------------12.12.96 16.18-------------------
--------------------------------------------------*/
IMPL_LINK( SwTextFlowPage, PageBreakHdl_Impl, CheckBox*, EMPTYARG )
{
    if( aPgBrkCB.IsChecked() )
    {
            aPgBrkRB.       Enable();
            aColBrkRB.      Enable();
            aPgBrkBeforeRB. Enable();
            aPgBrkAfterRB.  Enable();

            if ( aPgBrkRB.IsChecked() && aPgBrkBeforeRB.IsChecked() )
            {
                aPageCollCB.Enable();

                BOOL bEnable = aPageCollCB.IsChecked() &&
                                            aPageCollLB.GetEntryCount();
                aPageCollLB.Enable(bEnable);
                if(!bHtmlMode)
                    aPageNoNF.Enable(bEnable);
            }
    }
    else
    {
            aPageCollCB.Check( FALSE );
            aPageCollCB.Enable(FALSE);
            aPageCollLB.Enable(FALSE);
            aPageNoNF.Enable(FALSE);
            aPgBrkRB.       Enable(FALSE);
            aColBrkRB.      Enable(FALSE);
            aPgBrkBeforeRB. Enable(FALSE);
            aPgBrkAfterRB.  Enable(FALSE);
    }
    return 0;
}

/*-----------------12.12.96 16.18-------------------
--------------------------------------------------*/
IMPL_LINK( SwTextFlowPage, ApplyCollClickHdl_Impl, CheckBox*, EMPTYARG )
{
    BOOL bEnable = FALSE;
    if ( aPageCollCB.IsChecked() &&
         aPageCollLB.GetEntryCount() )
    {
        bEnable = TRUE;
        aPageCollLB.SelectEntryPos( 0 );
    }
    else
    {
        aPageCollLB.SetNoSelection();
    }
    aPageCollLB.Enable(bEnable);
    if(!bHtmlMode)
        aPageNoNF.Enable(bEnable);
    return 0;
}

/*-----------------12.12.96 16.18-------------------
--------------------------------------------------*/
IMPL_LINK( SwTextFlowPage, PageBreakPosHdl_Impl, RadioButton*, pBtn )
{
    if ( aPgBrkCB.IsChecked() )
    {
        if ( pBtn == &aPgBrkBeforeRB )
        {
            aPageCollCB.Enable();

            BOOL bEnable = aPageCollCB.IsChecked()  &&
                                        aPageCollLB.GetEntryCount();

            aPageCollLB.Enable(bEnable);
            if(!bHtmlMode)
                aPageNoNF.Enable(bEnable);
        }
        else if ( pBtn == &aPgBrkAfterRB )
        {
            aPageCollCB .Check( FALSE );
            aPageCollCB .Enable(FALSE);
            aPageCollLB .Enable(FALSE);
            aPageNoNF   .Enable(FALSE);
        }
    }
    return 0;
}

/*-----------------12.12.96 16.18-------------------
--------------------------------------------------*/
IMPL_LINK( SwTextFlowPage, PageBreakTypeHdl_Impl, RadioButton*, pBtn )
{
    if ( pBtn == &aColBrkRB || aPgBrkAfterRB.IsChecked() )
    {
        aPageCollCB .Check(FALSE);
        aPageCollCB .Enable(FALSE);
        aPageCollLB .Enable(FALSE);
        aPageNoNF   .Enable(FALSE);
    }
    else if ( aPgBrkBeforeRB.IsChecked() )
        PageBreakPosHdl_Impl( &aPgBrkBeforeRB );
    return 0;
}

/*-----------------30.05.97 07:37-------------------

--------------------------------------------------*/
void SwTextFlowPage::DisablePageBreak()
{
    bPageBreak = FALSE;
    aPgBrkCB       .Disable();
    aPgBrkRB       .Disable();
    aColBrkRB      .Disable();
    aPgBrkBeforeRB .Disable();
    aPgBrkAfterRB  .Disable();
    aPageCollCB    .Disable();
    aPageCollLB    .Disable();
    aPageNoFT      .Disable();
    aPageNoNF      .Disable();
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.169  2000/09/18 16:06:09  willem.vandorp
    OpenOffice header added.

    Revision 1.168  2000/08/24 15:21:38  os
    tables with negative LRSpace

    Revision 1.167  2000/07/27 21:16:28  jp
    opt: get template names direct from the doc and don't load it from the resource

    Revision 1.166  2000/06/16 09:51:28  os
    #73123# disable manual table alignment in HTML

    Revision 1.165  2000/05/26 07:21:33  os
    old SW Basic API Slots removed

    Revision 1.164  2000/05/23 19:31:24  jp
    Bugfixes for Unicode

    Revision 1.163  2000/04/19 11:22:11  os
    UNICODE

    Revision 1.162  1999/08/23 07:48:32  OS
    #61218# correct handling of left_and_width oriented tables


      Rev 1.161   23 Aug 1999 09:48:32   OS
   #61218# correct handling of left_and_width oriented tables

      Rev 1.160   28 May 1999 10:28:32   OS
   #54824# HoriOrientation_LEFT_AND_WIDTH fuer von links ausgerichtete Tabellen

      Rev 1.159   08 Feb 1999 14:56:32   OS
   #61545# Break-Attribut nur noch bei fehlendem oder leeren PageDesc mitschicken

      Rev 1.158   08 Feb 1999 10:23:22   JP
   Task #61467#/#61014#: neu FindPageDescByName

      Rev 1.157   04 Jan 1999 14:15:00   OS
   #60366# Umbruch-Buttons in HTML-Docs ebenfalls disablen

      Rev 1.156   27 Nov 1998 14:56:48   AMA
   Fix #59951#59825#: Unterscheiden zwischen Rahmen-,Seiten- und Bereichsspalten

      Rev 1.155   27 Nov 1998 14:02:44   MH
   add: header

      Rev 1.154   08 Sep 1998 17:04:00   OS
   #56134# Metric fuer Text und HTML getrennt

      Rev 1.153   29 May 1998 19:08:00   JP
   SS vom SwTableReq geaendert

      Rev 1.152   28 Apr 1998 09:10:12   OS
   Background: ShowSelector mit HTML-Beruecksichtigung #49862#

      Rev 1.151   21 Apr 1998 08:44:36   OS
   TableNameEdit verschoben

      Rev 1.150   17 Apr 1998 16:30:50   OS
   Printing extensions fuer HTML

      Rev 1.149   16 Apr 1998 15:57:28   OS
   Printing extensions fuer HTML

      Rev 1.148   02 Mar 1998 09:15:52   OS
   Minimalbreite spaltenabhaengig, Fokushilfe fuer Edit#47641##47658#

      Rev 1.147   29 Nov 1997 14:28:10   MA
   includes

      Rev 1.146   24 Nov 1997 15:52:22   MA
   includes

      Rev 1.145   19 Nov 1997 16:54:54   OS
   Hintergrund: zuerst ShowTblCtrl rufen #45654#

      Rev 1.144   03 Nov 1997 13:56:50   MA
   precomp entfernt

      Rev 1.143   30 Oct 1997 11:19:20   AMA
   Chg: Kein AutoFlag mehr an Break bzw. PageDesc-Attributen

      Rev 1.142   30 Sep 1997 16:51:36   TJ
   include

      Rev 1.141   25 Aug 1997 14:26:28   OS
   Leerzeichen im Tabellennamen vor dem Verlassen der Page ueberpruefen #42643#

      Rev 1.140   15 Aug 1997 12:18:20   OS
   chartar/frmatr/txtatr aufgeteilt

      Rev 1.139   11 Aug 1997 10:12:42   OS
   paraitem/frmitems/textitem aufgeteilt

      Rev 1.138   03 Jul 1997 12:53:40   OS
   SwSwMode jetzt mit BYTE #41255#

      Rev 1.137   18 Jun 1997 17:27:42   OS
   Breite im TableRep nie auf IVALID_TWIP setzen #40808#

      Rev 1.136   11 Jun 1997 10:54:40   OS
   Behandlung relativer Tabellen berichtigt; restore nach automatisch funktioniert jetzt #40590#

      Rev 1.135   03 Jun 1997 16:39:58   MA
   chg: neue Tabellenfeatures hiden

      Rev 1.134   30 May 1997 08:44:50   OS
   kein Umbruch ausserbalb des Bodies #40306#

      Rev 1.133   14 Apr 1997 19:15:58   MA
   eigendes Headerfile fuer die Pages

      Rev 1.132   11 Apr 1997 15:55:26   MA
   chg: kein Keep und split fuer Web

      Rev 1.131   11 Apr 1997 13:36:26   MA
   split richtig

      Rev 1.130   11 Apr 1997 13:07:08   MA
   new: Layout-Split

      Rev 1.129   10 Apr 1997 18:26:48   MA
   Keep besser (?), Keep fuer Tables

      Rev 1.128   13 Mar 1997 11:37:52   OS
   enable/disble fuer manuell/zentriert berichtigt

      Rev 1.127   10 Mar 1997 16:20:48   OS
   Right an den TabCols darf niemals groesser als RightMax sein

      Rev 1.126   20 Feb 1997 17:49:36   OS
   Abstand oben/unten nicht im HTML

      Rev 1.125   13 Feb 1997 13:49:44   OS
   Tabellen im HTML auch manuell

      Rev 1.124   12 Feb 1997 14:28:38   OS
   wird der Umbruch abgeschaltet, muss auch der Offeset auf NULL gesetzt werden

      Rev 1.123   10 Feb 1997 16:36:02   OS
   autom. Ausrichtung: rechter Rand darf nicht eingestellt werden

      Rev 1.122   05 Feb 1997 10:04:22   OS
   keine Leerzeichen und Punkte im Tabellennamen; FillItemSet aus DeactivatePage aufrufen

      Rev 1.121   03 Feb 1997 12:12:44   OS
   Im HtmlMode kein Name und keine manuelle Ausrichtung

      Rev 1.120   30 Jan 1997 15:33:00   OS
   ...PARA_PAGENUM ueberfluessig

      Rev 1.119   22 Jan 1997 11:38:16   MA
   Umstellung Put

      Rev 1.118   08 Jan 1997 11:57:30   OS
   Umbruch-CheckBox nicht setzen fuer SVX_BREAK_NONE

      Rev 1.117   20 Dec 1996 12:13:48   OS
   vertikale Ausrichtung jetzt mit FN_TABLE_SET_VERT_ALIGN

      Rev 1.116   19 Dec 1996 12:00:42   OS
   V-Alignment auswerten

      Rev 1.115   18 Dec 1996 14:58:40   OS
   Vorbereitung BoxAlign

      Rev 1.114   16 Dec 1996 16:23:22   OS
   versteckte Trenner an der alten Position wieder einsortieren

      Rev 1.113   13 Dec 1996 15:48:38   HJS
   header name

      Rev 1.112   13 Dec 1996 08:34:14   OS
   vorlaeufig vollstaendig

      Rev 1.111   12 Dec 1996 16:58:12   OS
   Textfluss fuer Tabelle

      Rev 1.110   10 Dec 1996 18:23:32   OS
   FillTabCols: rechten Rand aus der Summe der Spalten und dem linken Rand ermitteln #34303#

      Rev 1.109   04 Dec 1996 16:04:44   OS
   rechter Rand darf auch wieder fuer die manuelle Einstellung benutzt werden

      Rev 1.108   02 Dec 1996 10:35:24   OS
   erst SetRefValue, dann ShowPercent

      Rev 1.107   30 Nov 1996 11:24:18   OS
   Rel. Breite: Raender werden mitgesetzt

      Rev 1.106   11 Nov 1996 11:20:32   MA
   ResMgr

      Rev 1.105   05 Nov 1996 07:01:28   OS
   bModified auf TRUE setzen

      Rev 1.104   04 Nov 1996 12:00:10   OS
   kein Handler fuer HeadlineRepeat

      Rev 1.103   16 Oct 1996 16:25:22   OS
   letzte Probleme mit autom. Breite behoben

      Rev 1.102   14 Oct 1996 14:01:40   OS
   keine Breitenaenderung in der Spalten-Page fuer automatische Ausrichtung

      Rev 1.101   14 Oct 1996 13:52:48   OS
   bei automatischer Ausrichtung muss TableSpace statt TableWidth benutzt werden

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/table/tabledlg.hrc b/sw/source/ui/table/tabledlg.hrc
new file mode 100644
index 0000000..c498c3a
--- /dev/null
+++ b/sw/source/ui/table/tabledlg.hrc
@@ -0,0 +1,137 @@
/*************************************************************************
 *
 *  $RCSfile: tabledlg.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:48 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#include "globals.hrc"

#define ED_WIDTH        1
#define GB_WIDTH        3
#define CB_REL_WIDTH    4
#define RB_LEFT         10
#define RB_RIGHT        11
#define RB_CENTER       12
#define RB_FREE         13
#define RB_FULL         14
#define GB_POS          15
#define ED_LEFT_DIST    51
#define ED_RIGHT_DIST   52
#define FT_RIGHT_DIST   53
#define FT_LEFT_DIST    54
#define FT_TOP_DIST     20
#define ED_TOP_DIST     21
#define FT_BOTTOM_DIST  22
#define ED_BOTTOM_DIST  23
#define GB_DIST         24
#define FT_WIDTH        25
#define FT_SCOL         30
#define DLB_SCOL        31
#define FT_POS          32
#define DLB_SPOS        33
#define FT_SSZ          34
#define ED_SSZ          36
#define GB_SHADE        37
#define CB_HEADLINE     40
#define GB_HEADLINE     41
#define BT_OK           100
#define BT_CANCEL       101
#define BT_MORE         102
#define ED_NAME         103
#define FT_NAME         104
#define GB_OPTIONS      105
#define GB_NAME         106
#define COL_FT_1        107
#define COL_MF_1        108
#define COL_FT_2        109
#define COL_MF_2        110
#define COL_FT_3        111
#define COL_MF_3        112
#define COL_FT_4        113
#define COL_MF_4        114
#define COL_FT_5        115
#define COL_MF_5        116
#define COL_FT_6        117
#define COL_MF_6        118
#define COL_GB_LAYOUT   119
#define COL_BTN_UP      120
#define COL_BTN_DOWN    121
#define CB_MOD_TBL      122
#define CB_PROP         123
#define CB_INV          124
#define FT_SPACE        125
#define ED_SPACE        126

#define GB_FLOW             130
#define CB_PAGEBREAK        131
#define RB_BREAKPAGE        132
#define RB_BREAKCOLUMN      133
#define RB_PAGEBREAKBEFORE  134
#define RB_PAGEBREAKAFTER   135
#define CB_PAGECOLL         136
#define LB_PAGECOLL         137
#define FT_PAGENUM          138
#define NF_PAGENUM          139
#define CB_KEEP             144
#define CB_SPLIT            145

#define GB_VERT_ORIENT      140
#define RB_VERT_TOP         141
#define RB_VERT_CENTER      142
#define RB_VERT_BOTTOM      143

#define RB_FROM_LEFT        144
diff --git a/sw/source/ui/table/tabledlg.src b/sw/source/ui/table/tabledlg.src
new file mode 100644
index 0000000..5f2d396
--- /dev/null
+++ b/sw/source/ui/table/tabledlg.src
@@ -0,0 +1,1600 @@
/*************************************************************************
 *
 *  $RCSfile: tabledlg.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:48 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "table.hrc"
#include "tabledlg.hrc"
#include "helpid.h"
#define TEXT_TEXTFLOW  \
    Text = "Textfluss" ; \
    Text [ English ] = "Text Flow" ; \
    Text [ norwegian ] = "Utvidelse av avsnitt" ; \
    Text [ italian ] = "Flusso di testo" ; \
    Text [ portuguese_brazilian ] = "Extens es de Parágrafo" ; \
    Text [ portuguese ] = "Fluxo de texto" ; \
    Text [ finnish ] = "Tekstin rivitys" ; \
    Text [ danish ] = "Tekstretning" ; \
    Text [ french ] = "Enchaînements" ; \
    Text [ swedish ] = "Textflöde" ; \
    Text [ dutch ] = "Tekstverloop" ; \
    Text [ spanish ] = "Flujo del texto" ; \
    Text [ english_us ] = "Text Flow" ; \
    Text[ chinese_simplified ] = "»»ÐкͷÖÒ³";  \
    Text[ russian ] = "Ïîëîæåíèå íà ñòðàíèöå";  \
    Text[ polish ] = "Tekst";   \
    Text[ japanese ] = "‘̍Ù";  \
    Text[ chinese_traditional ] = "´«¦æ©M¤À­¶"; \
    Text[ arabic ] = "ÇäÓíÇÈ ÇáäÕ"; \
    Text[ greek ] = "ÑïÞ êåéìÝíïõ"; \
    Text[ korean ] = "ÅØ½ºÆ® È帧"; \
    Text[ turkish ] = "Metin akýþý";    \
    Text[ language_user1 ] = " ";

/**************************************************************************/
/*                                                                        */
/*                                                                        */
/*                                                                        */
/**************************************************************************/
TabDialog DLG_FORMAT_TABLE
{
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Text = "Tabellenformat" ;
    Text [ ENGLISH ] = "Table format" ;
    Text [ norwegian ] = "Tabellformat" ;
    Text [ italian ] = "Formato tabella" ;
    Text [ portuguese_brazilian ] = "Formato de tabela" ;
    Text [ portuguese ] = "Formato da tabela" ;
    Text [ finnish ] = "Taulukon muoto" ;
    Text [ danish ] = "Tabelformat" ;
    Text [ french ] = "Format de tableau" ;
    Text [ swedish ] = "Tabellformat" ;
    Text [ dutch ] = "Tabelopmaak" ;
    Text [ spanish ] = "Formato de tabla" ;
    Text [ english_us ] = "Table Format" ;
    Moveable = TRUE ;
    TabControl 1
    {
        SVLook = TRUE ;
        PageList =
        {
            PageItem
            {
                Identifier = TP_FORMAT_TABLE ;
                Text = "Tabelle" ;
                Text [ ENGLISH ] = "Table" ;
                Text [ norwegian ] = "Table" ;
                Text [ italian ] = "Tabella" ;
                Text [ portuguese_brazilian ] = "Tabela" ;
                Text [ portuguese ] = "Tabela" ;
                Text [ finnish ] = "Taulukko" ;
                Text [ danish ] = "Tabel" ;
                Text [ french ] = "Tableau" ;
                Text [ swedish ] = "Tabell" ;
                Text [ dutch ] = "Tabel" ;
                Text [ spanish ] = "Tabla" ;
                Text [ english_us ] = "Table" ;
                PageResID = TP_FORMAT_TABLE ;
                Text[ chinese_simplified ] = "±í¸ñ";
                Text[ russian ] = "Òàáëèöà";
                Text[ polish ] = "Tabela";
                Text[ japanese ] = "•\\";
                Text[ chinese_traditional ] = "ªí®æ";
                Text[ arabic ] = "ÇáÌÏæá";
                Text[ greek ] = "Ðßíáêáò";
                Text[ korean ] = "ǥ";
                Text[ turkish ] = "Tablo";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_TABLE_TEXTFLOW ;
                TEXT_TEXTFLOW
            };
            PageItem
            {
                Identifier = TP_TABLE_COLUMN ;
                Text = "Spalten" ;
                Text [ ENGLISH ] = "Columns" ;
                Text [ norwegian ] = "Kolonner" ;
                Text [ italian ] = "Colonne" ;
                Text [ portuguese_brazilian ] = "Colunas" ;
                Text [ portuguese ] = "Colunas" ;
                Text [ finnish ] = "Sarakkeet" ;
                Text [ danish ] = "Kolonner" ;
                Text [ french ] = "Colonnes" ;
                Text [ swedish ] = "Kolumner" ;
                Text [ dutch ] = "Kolommen" ;
                Text [ spanish ] = "Columnas" ;
                Text [ english_us ] = "Columns" ;
                PageResID = TP_TABLE_COLUMN ;
                Text[ chinese_simplified ] = "À¸";
                Text[ russian ] = "Ñòîëáöû";
                Text[ polish ] = "Kolumny";
                Text[ japanese ] = "—ñ";
                Text[ chinese_traditional ] = "Äæ";
                Text[ arabic ] = "ÃÚãÏÉ";
                Text[ greek ] = "ÓôÞëåò";
                Text[ korean ] = "¿­";
                Text[ turkish ] = "Sütun";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_BORDER ;
                Text = "Umrandung" ;
                Text [ ENGLISH ] = "Border" ;
                Text [ norwegian ] = "Border" ;
                Text [ italian ] = "Bordo" ;
                Text [ portuguese_brazilian ] = "Borda" ;
                Text [ portuguese ] = "Contornos" ;
                Text [ finnish ] = "Reunaviiva" ;
                Text [ danish ] = "Ramme" ;
                Text [ french ] = "Bordure" ;
                Text [ swedish ] = "Inramning" ;
                Text [ dutch ] = "Omranding" ;
                Text [ spanish ] = "Borde" ;
                Text [ english_us ] = "Borders" ;
                PageResID = TP_BORDER ;
                Text[ chinese_simplified ] = "±ß¿ò";
                Text[ russian ] = "Îáðàìëåíèå";
                Text[ polish ] = "Obramowanie";
                Text[ japanese ] = "ŠO˜g";
                Text[ chinese_traditional ] = "Ã䮨";
                Text[ arabic ] = "ÇáÍÏæÏ";
                Text[ greek ] = "Ðåñßãñáììá";
                Text[ korean ] = "Å׵θ®";
                Text[ turkish ] = "Kenarlýk";
                Text[ language_user1 ] = " ";
            };
            PageItem
            {
                Identifier = TP_BACKGROUND ;
                Text = "Hintergrund" ;
                Text [ ENGLISH ] = "Background" ;
                Text [ norwegian ] = "Background" ;
                Text [ italian ] = "Sfondo" ;
                Text [ portuguese_brazilian ] = "Fundo" ;
                Text [ portuguese ] = "Plano de fundo" ;
                Text [ finnish ] = "Tausta" ;
                Text [ danish ] = "Baggrund" ;
                Text [ french ] = "Arrière-plan" ;
                Text [ swedish ] = "Bakgrund" ;
                Text [ dutch ] = "Achtergrond" ;
                Text [ spanish ] = "Fondo" ;
                Text [ english_us ] = "Background" ;
                PageResID = TP_BACKGROUND ;
                Text[ chinese_simplified ] = "±³¾°";
                Text[ russian ] = "Ôîí";
                Text[ polish ] = "T³o";
                Text[ japanese ] = "”wŒi";
                Text[ chinese_traditional ] = "­I´º";
                Text[ arabic ] = "ÇáÎáÝíÉ";
                Text[ greek ] = "Öüíôï";
                Text[ korean ] = "¹è°æ";
                Text[ turkish ] = "Artalan";
                Text[ language_user1 ] = " ";
            };
        };
    };
    Text[ chinese_simplified ] = "±í¸ñ¸ñʽ";
    Text[ russian ] = "Ôîðìàò òàáëèöû";
    Text[ polish ] = "Format tabeli";
    Text[ japanese ] = "•\\‚̏‘Ž®";
    Text[ chinese_traditional ] = "ªí®æ®æ¦¡";
    Text[ arabic ] = "ÊäÓíÞ ÇáÌÏæá";
    Text[ greek ] = "ÌïñöÞ ðßíáêá";
    Text[ korean ] = "Ç¥ ¼­½Ä";
    Text[ turkish ] = "Tablo formatý";
    Text[ language_user1 ] = " ";
};
/**************************************************************************/
/*                                                                        */
/*                                                                        */
/*                                                                        */
/**************************************************************************/
TabPage TP_FORMAT_TABLE
{
    HelpID = HID_FORMAT_TABLE ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Hide = TRUE;
    FixedText FT_NAME
    {
        Pos = MAP_APPFONT ( 12 , 15 ) ;
        Size = MAP_APPFONT ( 22 , 10 ) ;
        Text = "~Name" ;
        Text [ English ] = "~Name" ;
        Text [ italian ] = "~Nome" ;
        Text [ portuguese ] = "~Nome" ;
        Text [ danish ] = "Navn" ;
        Text [ french ] = "~Nom" ;
        Text [ swedish ] = "~Namn" ;
        Text [ dutch ] = "~Naam" ;
        Text [ spanish ] = "~Nombre" ;
        Text [ english_us ] = "~Name" ;
        Text [ portuguese_brazilian ] = "~Name" ;
        Text[ chinese_simplified ] = "Ãû³Æ(~N)";
        Text[ russian ] = "Èìÿ";
        Text[ polish ] = "Nazwa";
        Text[ japanese ] = "–¼‘O(~N)";
        Text[ chinese_traditional ] = "¦WºÙ(~N)";
        Text[ arabic ] = "ÇáÇÓã";
        Text[ greek ] = "¼íïìá";
        Text[ korean ] = "À̸§(~N)";
        Text[ turkish ] = "~Ad";
        Text[ language_user1 ] = " ";
    };
    Edit ED_NAME
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 58 , 14 ) ;
        Size = MAP_APPFONT ( 79 , 12 ) ;
        TabStop = TRUE ;
    };
    FixedText FT_WIDTH
    {
        Pos = MAP_APPFONT ( 12 , 33 ) ;
        Size = MAP_APPFONT ( 22 , 10 ) ;
        Text = "Br~eite" ;
        Text [ ENGLISH ] = "W~idth" ;
        Text [ norwegian ] = "B~redde" ;
        Text [ italian ] = "L~argh." ;
        Text [ portuguese_brazilian ] = "L~argura" ;
        Text [ portuguese ] = "L~argura" ;
        Text [ finnish ] = "~Leveys" ;
        Text [ danish ] = "Bredde" ;
        Text [ french ] = "~Largeur" ;
        Text [ swedish ] = "Br~edd" ;
        Text [ dutch ] = "~Breedte" ;
        Text [ spanish ] = "A~ncho" ;
        Text [ english_us ] = "W~idth" ;
        Text[ chinese_simplified ] = "¿í(~I)";
        Text[ russian ] = "Øèðèíà";
        Text[ polish ] = "Szer.";
        Text[ japanese ] = "•(~I)";
        Text[ chinese_traditional ] = "¼e(~I)";
        Text[ arabic ] = "ÇáÚÑÖ";
        Text[ greek ] = "ÐëÜôïò";
        Text[ korean ] = "³Êºñ(~I)";
        Text[ turkish ] = "G~eniþlik";
        Text[ language_user1 ] = " ";
    };
    MetricField ED_WIDTH
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 58 , 32 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 0 ;
        Maximum = 9999 ;
        DecimalDigits = 2 ;
        Value = 0 ;
        Unit = FUNIT_CM ;
        First = 0 ;
        Last = 9999 ;
        SpinSize = 5 ;
    };
    CheckBox CB_REL_WIDTH
    {
        Pos = MAP_APPFONT ( 101 , 34 ) ;
        Size = MAP_APPFONT ( 35 , 10 ) ;
        Text = "Relati~v" ;
        Text [ ENGLISH ] = "Relati~ve" ;
        TabStop = TRUE ;
        Text [ english_us ] = "Relati~ve" ;
        Text [ italian ] = "Relati~vo" ;
        Text [ spanish ] = "Relati~vo" ;
        Text [ french ] = "Relati~f" ;
        Text [ dutch ] = "Relatie~f" ;
        Text [ swedish ] = "Relati~v" ;
        Text [ danish ] = "Relativ" ;
        Text [ portuguese_brazilian ] = "Relati~v" ;
        Text [ portuguese ] = "Relat~ivo" ;
        Text[ chinese_simplified ] = "숦﵀(~V)";
        Text[ russian ] = "Îòíîñèò.";
        Text[ polish ] = "Wz~glêdny";
        Text[ japanese ] = "Êß°¾Ýĕ\\ަ(~V)";
        Text[ chinese_traditional ] = "¬Û¹ïªº(~V)";
        Text[ arabic ] = "äÓÈí";
        Text[ greek ] = "Ó÷åôéêÜ";
        Text[ korean ] = "ºñ·Ê(~V)";
        Text[ turkish ] = "Göreceli";
        Text[ language_user1 ] = " ";
    };
    GroupBox GB_OPTIONS
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 184 , 73 ) ;
        Text = "Eigenschaften" ;
        Text [ ENGLISH ] = "Options" ;
        Text [ norwegian ] = "Options" ;
        Text [ italian ] = "Opzioni" ;
        Text [ portuguese_brazilian ] = "Opções" ;
        Text [ portuguese ] = "Propriedades" ;
        Text [ finnish ] = "Määritykset" ;
        Text [ danish ] = "Egenskaber" ;
        Text [ french ] = "Options" ;
        Text [ swedish ] = "Egenskaper" ;
        Text [ dutch ] = "Eigenschappen" ;
        Text [ spanish ] = "Propiedades" ;
        Text [ english_us ] = "Properties" ;
        Text[ chinese_simplified ] = "ÊôÐÔ";
        Text[ russian ] = "Ñâîéñòâà";
        Text[ polish ] = "W³aœciwoœci";
        Text[ japanese ] = "ÌßÛÊßè";
        Text[ chinese_traditional ] = "ÄÝ©Ê";
        Text[ arabic ] = "ÎÕÇÆÕ";
        Text[ greek ] = "Éäéüôçôåò";
        Text[ korean ] = "Ư¼º";
        Text[ turkish ] = "Özellikler";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_FULL
    {
        Pos = MAP_APPFONT ( 199 , 15 ) ;
        Size = MAP_APPFONT ( 50 , 12 ) ;
        TabStop = TRUE ;
        Text = "~Automatisch" ;
        Text [ ENGLISH ] = "~Automatic" ;
        Text [ italian ] = "~Automatico" ;
        Text [ finnish ] = "~Automaattinen" ;
        Text [ swedish ] = "~Automatiskt" ;
        Text [ dutch ] = "~Automatisch" ;
        Text [ english_us ] = "A~utomatic" ;
        Text [ spanish ] = "Au~tomática" ;
        Text [ french ] = "~Automatique" ;
        Text [ danish ] = "Automatisk" ;
        Text [ portuguese_brazilian ] = "~Automatisch" ;
        Text [ portuguese ] = "~Automático" ;
        Text[ chinese_simplified ] = "×Ô¶¯(~A)";
        Text[ russian ] = "Àâòîìàòè÷åñêè";
        Text[ polish ] = "Automatycznie";
        Text[ japanese ] = "Ž©“®(~A)";
        Text[ chinese_traditional ] = "¦Û°Ê(~A)";
        Text[ arabic ] = "ÊáÞÇÆí";
        Text[ greek ] = "Áõôüìáôá";
        Text[ korean ] = "ÀÚµ¿(~U)";
        Text[ turkish ] = "Otomatik";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_LEFT
    {
        Pos = MAP_APPFONT ( 199 , 29 ) ;
        Size = MAP_APPFONT ( 50 , 12 ) ;
        Text = "~Links" ;
        Text [ ENGLISH ] = "~Left" ;
        Text [ norwegian ] = "~Left" ;
        Text [ italian ] = "~Sinistra" ;
        Text [ portuguese_brazilian ] = "~Esquerda" ;
        Text [ portuguese ] = "~Esquerda" ;
        Text [ finnish ] = "~Vasemmalle" ;
        Text [ danish ] = "Venstre" ;
        Text [ french ] = "~À gauche" ;
        Text [ swedish ] = "Vän~ster" ;
        Text [ dutch ] = "~Links" ;
        Text [ spanish ] = "~Izquierda" ;
        Text [ english_us ] = "~Left" ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "×ó(~L)";
        Text[ russian ] = "Ñëåâà";
        Text[ polish ] = "Z lew~ej";
        Text[ japanese ] = "¶(~L)";
        Text[ chinese_traditional ] = "¥ª(~L)";
        Text[ arabic ] = "íÓÇÑ";
        Text[ greek ] = "ÁñéóôåñÜ";
        Text[ korean ] = "¿ÞÂÊ(~L)";
        Text[ turkish ] = "S~ola";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_FROM_LEFT
    {
        Pos = MAP_APPFONT ( 199 , 43 ) ;
        Size = MAP_APPFONT ( 50 , 12 ) ;
        Text = "Von l~inks" ;
        Text [ ENGLISH ] = "~From left" ;
        TabStop = TRUE ;
        Text[ english_us ] = "~From left";
        Text[ portuguese ] = "~Esquerda";
        Text[ russian ] = "Ñëåâà";
        Text[ greek ] = "Aðü áñéóôåñÜ";
        Text[ dutch ] = "~Van links";
        Text[ french ] = "De ~gauche";
        Text[ spanish ] = "De iz~quierda";
        Text[ italian ] = "~Da sinistra";
        Text[ danish ] = "Fra venstre";
        Text[ swedish ] = "Från vänster";
        Text[ polish ] = "Od lewej";
        Text[ portuguese_brazilian ] = "~From left";
        Text[ japanese ] = "¶‚©‚ç(~F)";
        Text[ korean ] = "¿ÞÂÊÀ¸·ÎºÎÅÍ(~F)";
        Text[ chinese_simplified ] = "´Ó×ó(~F)";
        Text[ chinese_traditional ] = "±q¥ª(~F)";
        Text[ arabic ] = "ãä ÇáíÓÇÑ";
        Text[ turkish ] = "S~oldan";
    };
    RadioButton RB_RIGHT
    {
        Pos = MAP_APPFONT ( 199 , 57 ) ;
        Size = MAP_APPFONT ( 50 , 12 ) ;
        Text = "~Rechts" ;
        Text [ ENGLISH ] = "~Right" ;
        Text [ norwegian ] = "~Right" ;
        Text [ italian ] = "~Destra" ;
        Text [ portuguese_brazilian ] = "~Direita" ;
        Text [ portuguese ] = "~Direita" ;
        Text [ finnish ] = "~Oikealle" ;
        Text [ danish ] = "Højre" ;
        Text [ french ] = "~À droite" ;
        Text [ swedish ] = "Höge~r" ;
        Text [ dutch ] = "~Rechts" ;
        Text [ spanish ] = "~Derecha" ;
        Text [ english_us ] = "R~ight" ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "ÓÒ(~R)";
        Text[ russian ] = "Ñïðàâà";
        Text[ polish ] = "Z p~rawej";
        Text[ japanese ] = "‰E(~R)";
        Text[ chinese_traditional ] = "¥k(~R)";
        Text[ arabic ] = "íãíä";
        Text[ greek ] = "ÄåîéÜ";
        Text[ korean ] = "¿À¸¥ÂÊ(~I)";
        Text[ turkish ] = "Sa~ða";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_CENTER
    {
        Pos = MAP_APPFONT ( 199 , 71 ) ;
        Size = MAP_APPFONT ( 50 , 12 ) ;
        Text = "Zen~triert" ;
        Text [ ENGLISH ] = "~Centered" ;
        Text [ norwegian ] = "~Centered" ;
        Text [ italian ] = "~Centrato" ;
        Text [ portuguese_brazilian ] = "~Centralizado" ;
        Text [ portuguese ] = "~Centrado" ;
        Text [ finnish ] = "~Keski" ;
        Text [ danish ] = "Centreret" ;
        Text [ french ] = "~Centré" ;
        Text [ swedish ] = "Centrerat" ;
        Text [ dutch ] = "~Centreren" ;
        Text [ spanish ] = "~Centrado" ;
        Text [ english_us ] = "~Center" ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "¾ÓÖÐ(~C)";
        Text[ russian ] = "Ïî öåíòðó";
        Text[ polish ] = "Wyœrodkowany";
        Text[ japanese ] = "’†‰›‘µ‚¦(~C)";
        Text[ chinese_traditional ] = "¸m¤¤(~C)";
        Text[ arabic ] = "ÊæÓíØ";
        Text[ greek ] = "ÊåíôñáñéóìÝíá";
        Text[ korean ] = "°¡¿îµ¥(~C)";
        Text[ turkish ] = "~Ortala";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_FREE
    {
        Pos = MAP_APPFONT ( 199 , 85 ) ;
        Size = MAP_APPFONT ( 50 , 12 ) ;
        Text = "~Manuell" ;
        Text [ ENGLISH ] = "~Manual" ;
        TabStop = TRUE ;
        Text [ english_us ] = "~Manual" ;
        Text [ italian ] = "~Manuale" ;
        Text [ spanish ] = "~Manual" ;
        Text [ french ] = "~Manuel" ;
        Text [ dutch ] = "~Handmatig" ;
        Text [ swedish ] = "~Manuellt" ;
        Text [ danish ] = "Manuel" ;
        Text [ portuguese_brazilian ] = "~Manuell" ;
        Text [ portuguese ] = "~Manual" ;
        Text[ chinese_simplified ] = "ÊÖ¹¤(~M)";
        Text[ russian ] = "Âðó÷íóþ";
        Text[ polish ] = "Rê~cznie";
        Text[ japanese ] = "”CˆÓŽw’è(~M)";
        Text[ chinese_traditional ] = "¤â¤u(~M)";
        Text[ arabic ] = "íÏæí";
        Text[ greek ] = "×åéñïêßíçôá";
        Text[ korean ] = "¼öµ¿(~M)";
        Text[ turkish ] = "~Manüel";
        Text[ language_user1 ] = " ";
    };
    GroupBox GB_POS
    {
        Pos = MAP_APPFONT ( 193 , 3 ) ;
        Size = MAP_APPFONT ( 61 , 129 ) ;
        Text = "Ausrichtung" ;
        Text [ ENGLISH ] = "Position" ;
        Text [ norwegian ] = "Posisjon" ;
        Text [ italian ] = "Allineamento" ;
        Text [ portuguese_brazilian ] = "Posição" ;
        Text [ portuguese ] = "Alinhamento" ;
        Text [ finnish ] = "Sijainti" ;
        Text [ danish ] = "Justering" ;
        Text [ french ] = "Alignement" ;
        Text [ swedish ] = "Justering" ;
        Text [ dutch ] = "Uitlijning" ;
        Text [ spanish ] = "Alineación" ;
        Text [ english_us ] = "Alignment" ;
        Text[ chinese_simplified ] = "¶ÔÆë";
        Text[ russian ] = "Âûðàâíèâàíèå";
        Text[ polish ] = "Wyrównanie";
        Text[ japanese ] = "”z’u";
        Text[ language_user1 ] = " ";
        Text[ chinese_traditional ] = "¹ï»ô";
        Text[ arabic ] = "ãÍÇÐÇÉ";
        Text[ greek ] = "Óôïß÷éóç";
        Text[ korean ] = "¸ÂÃã";
        Text[ turkish ] = "Hizalama";
    };
    GroupBox GB_DIST
    {
        Pos = MAP_APPFONT ( 6 , 82 ) ;
        Size = MAP_APPFONT ( 184 , 50 ) ;
        Text = "Abstände" ;
        Text [ ENGLISH ] = "Distance" ;
        Text [ norwegian ] = "Avstand" ;
        Text [ italian ] = "Distanze" ;
        Text [ portuguese_brazilian ] = "Distância" ;
        Text [ portuguese ] = "Espaçamento" ;
        Text [ finnish ] = "Etäisyys" ;
        Text [ danish ] = "Afstand" ;
        Text [ french ] = "Écarts" ;
        Text [ swedish ] = "Avstånd" ;
        Text [ dutch ] = "Afstanden" ;
        Text [ spanish ] = "Espacios" ;
        Text [ english_us ] = "Spacing" ;
        Text[ chinese_simplified ] = "¼ä¸ô";
        Text[ russian ] = "Èíòåðâàëû";
        Text[ polish ] = "Odstêpy";
        Text[ japanese ] = "ŠÔŠu";
        Text[ chinese_traditional ] = "¶¡¹j";
        Text[ arabic ] = "ÇáÊÈÇÚÏ";
        Text[ greek ] = "AðïóôÜóåéò";
        Text[ korean ] = "°£°Ý";
        Text[ turkish ] = "Aralýk";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_TOP_DIST
    {
        Pos = MAP_APPFONT ( 102 , 94 ) ;
        Size = MAP_APPFONT ( 40 , 10 ) ;
        Text = "Nach ~oben" ;
        Text [ ENGLISH ] = "To t~op" ;
        Text [ norwegian ] = "Til t~oppen" ;
        Text [ italian ] = "Verso l'~alto" ;
        Text [ portuguese_brazilian ] = "Para o t~opo" ;
        Text [ portuguese ] = "Para ~cima" ;
        Text [ finnish ] = "~Ylös" ;
        Text [ danish ] = "Foroven" ;
        Text [ french ] = "Vers le ~haut" ;
        Text [ swedish ] = "Upp" ;
        Text [ dutch ] = "Naar bo~ven" ;
        Text [ spanish ] = "Hacia ~arriba" ;
        Text [ english_us ] = "~Above" ;
        Text[ chinese_simplified ] = "ÏòÉÏ(~A)";
        Text[ russian ] = "Ââåðõ";
        Text[ polish ] = "Do góry";
        Text[ japanese ] = "ã(~A)";
        Text[ chinese_traditional ] = "¦V¤W(~A)";
        Text[ arabic ] = "Åáì ÃÚáì";
        Text[ greek ] = "Ðñ~ïò ôá ðÜíù";
        Text[ korean ] = "À§¿¡(~A)";
        Text[ turkish ] = "Ön~ce";
        Text[ language_user1 ] = " ";
    };
    MetricField ED_TOP_DIST
    {
        Pos = MAP_APPFONT ( 145 , 93 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        Border = TRUE ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 0 ;
        Maximum = 9999 ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        First = 0 ;
        Last = 9999 ;
        SpinSize = 5 ;
    };
    FixedText FT_BOTTOM_DIST
    {
        Pos = MAP_APPFONT ( 102 , 112 ) ;
        Size = MAP_APPFONT ( 40 , 10 ) ;
        Text = "Nach ~unten" ;
        Text [ ENGLISH ] = "To ~bottom" ;
        Text [ norwegian ] = "Til ~bunn" ;
        Text [ italian ] = "In basso" ;
        Text [ portuguese_brazilian ] = "Para a ~base" ;
        Text [ portuguese ] = "Para ~baixo" ;
        Text [ finnish ] = "~Alhaalta" ;
        Text [ danish ] = "Forneden" ;
        Text [ french ] = "Vers le ~bas" ;
        Text [ swedish ] = "Ner" ;
        Text [ dutch ] = "Naar ~beneden" ;
        Text [ spanish ] = "Hacia a~bajo" ;
        Text [ english_us ] = "~Below" ;
        Text[ chinese_simplified ] = "ÏòÏÂ(~B)";
        Text[ russian ] = "Âíèç";
        Text[ polish ] = "Na dó³";
        Text[ japanese ] = "‰º(~B)";
        Text[ chinese_traditional ] = "¦V¤U(~B)";
        Text[ arabic ] = "Åáì ÃÓÝá";
        Text[ greek ] = "Ðñïò ôá êÜôù";
        Text[ korean ] = "¾Æ·¡(~B)";
        Text[ turkish ] = "So~nra";
        Text[ language_user1 ] = " ";
    };
    MetricField ED_BOTTOM_DIST
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 145 , 111 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 0 ;
        Maximum = 1000 ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        First = 0 ;
        Last = 9999 ;
        SpinSize = 5 ;
    };
    FixedText FT_LEFT_DIST
    {
        Pos = MAP_APPFONT ( 12 , 94 ) ;
        Size = MAP_APPFONT ( 40 , 10 ) ;
        Text = "Nach lin~ks" ;
        Text [ ENGLISH ] = "To lef~t" ;
        Text [ norwegian ] = "Til venstr~e" ;
        Text [ italian ] = "a sinis~tra" ;
        Text [ portuguese_brazilian ] = "Para a esqueda" ;
        Text [ portuguese ] = "À esqueda" ;
        Text [ finnish ] = "~Vasemmalle" ;
        Text [ danish ] = "Til venstre" ;
        Text [ french ] = "À ga~uche" ;
        Text [ swedish ] = "Till väns~ter" ;
        Text [ dutch ] = "~Naar links" ;
        Text [ spanish ] = "Hacia la i~zda." ;
        Text [ english_us ] = "Lef~t" ;
        Text[ chinese_simplified ] = "Ïò×ó(~T)";
        Text[ russian ] = "Âëåâî";
        Text[ polish ] = "Na lewo";
        Text[ japanese ] = "¶(~T)";
        Text[ chinese_traditional ] = "¦V¥ª(~T)";
        Text[ arabic ] = "Åáì ÇáíÓÇÑ";
        Text[ language_user1 ] = " ";
        Text[ greek ] = "Ðñïò ôá áñéóôåñÜ";
        Text[ korean ] = "¿ÞÂÊ(~T)";
        Text[ turkish ] = "S~ola";
    };
    MetricField ED_LEFT_DIST
    {
        Pos = MAP_APPFONT ( 58 , 93 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        Border = TRUE ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = -9999 ;
        Maximum = 9999 ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        First = 0 ;
        Last = 9999 ;
        SpinSize = 5 ;
    };
    FixedText FT_RIGHT_DIST
    {
        Pos = MAP_APPFONT ( 12 , 112 ) ;
        Size = MAP_APPFONT ( 40 , 10 ) ;
        Text = "Nach recht~s" ;
        Text [ ENGLISH ] = "To ri~ght" ;
        Text [ norwegian ] = "Til høy~re" ;
        Text [ italian ] = "a de~stra" ;
        Text [ portuguese_brazilian ] = "Para a direita" ;
        Text [ portuguese ] = "À direita" ;
        Text [ finnish ] = "~Oikealle" ;
        Text [ danish ] = "Til højre" ;
        Text [ french ] = "À dr~oite" ;
        Text [ swedish ] = "Till hö~ger" ;
        Text [ dutch ] = "Naar recht~s" ;
        Text [ spanish ] = "Hacia la d~cha." ;
        Text [ english_us ] = "Ri~ght" ;
        Text[ chinese_simplified ] = "ÏòÓÒ(~G)";
        Text[ russian ] = "Âïðàâî";
        Text[ polish ] = "Na prawo";
        Text[ japanese ] = "‰E(~G)";
        Text[ chinese_traditional ] = "¦V¥k(~G)";
        Text[ arabic ] = "Åáì Çáíãíä";
        Text[ greek ] = "Ðñïò ôá äåîéÜ";
        Text[ korean ] = "¿À¸¥ÂÊ(~G)";
        Text[ turkish ] = "Sa~ða";
        Text[ language_user1 ] = " ";
    };
    MetricField ED_RIGHT_DIST
    {
        Pos = MAP_APPFONT ( 58 , 111 ) ;
        Size = MAP_APPFONT ( 40 , 12 ) ;
        Border = TRUE ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = -9999 ;
        Maximum = 9999 ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        First = 0 ;
        Last = 9999 ;
        SpinSize = 5 ;
    };
};
/**************************************************************************/
/*                                                                        */
/*                                                                        */
/*                                                                        */
/**************************************************************************/
TabPage TP_TABLE_COLUMN
{
    HelpID = HID_TABLE_COLUMN ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    Hide = TRUE;
    FixedText FT_NAME
    {
        Pos = MAP_APPFONT ( 12 , 14 ) ;
        Size = MAP_APPFONT ( 40 , 10 ) ;
        Text = "~Name" ;
    };
    CheckBox CB_MOD_TBL
    {
        Pos = MAP_APPFONT ( 12 , 12 ) ;
        Size = MAP_APPFONT ( 180 , 12 ) ;
        Text = "Tabellenbreite anpassen" ;
        Text [ ENGLISH ] = "" ;
        TabStop = TRUE ;
        Text [ italian ] = "Adatta larghezza tabella" ;
        Text [ spanish ] = "Ajustar al ancho de la tabla" ;
        Text [ french ] = "Adapter largeur de tableau" ;
        Text [ dutch ] = "Tabelbreedte aanpassen" ;
        Text [ english_us ] = "Fit to table width" ;
        Text [ swedish ] = "~Anpassa tabelbredd" ;
        Text [ danish ] = "Tilpas tabelbredde" ;
        Text [ portuguese_brazilian ] = "Tabellenbreite anpassen" ;
        Text [ portuguese ] = "Ajustar largura da tabela" ;
        Text[ chinese_simplified ] = "µ÷Õû±í¸ñ¿í¶È";
        Text[ russian ] = "Âûðîâíÿòü øèðèíó òàáëèöû";
        Text[ polish ] = "Dostosuj szerokoϾ tabeli";
        Text[ japanese ] = "•\\‚Ì•‚ւ̍ì—p‚ð”F‚ß‚é";
        Text[ chinese_traditional ] = "½Õ¾ãªí®æ¼e«×";
        Text[ arabic ] = "ãáÇÁãÉ áÚÑÖ ÇáÌÏæá";
        Text[ greek ] = "ÐñïóáñìïãÞ ðëÜôïõò ðßíáêá";
        Text[ korean ] = "Ç¥ ³Êºñ¿¡ ¸ÂÃã";
        Text[ turkish ] = "Tablo geniþliðine göre ayarla";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_PROP
    {
        Pos = MAP_APPFONT ( 12 , 25 ) ;
        Size = MAP_APPFONT ( 180 , 12 ) ;
        Text = "Spalten gleichmäßig ändern" ;
        Text [ ENGLISH ] = "Adjust columns equally" ;
        TabStop = TRUE ;
        Text [ english_us ] = "Adjust columns proportionally" ;
        Text [ portuguese_brazilian ] = "Spalten proportional ändern" ;
        Text [ swedish ] = "Ändra kolumner proportionellt" ;
        Text [ danish ] = "Modificer kolonner jævnt" ;
        Text [ italian ] = "Modifica colonne proporzionalmente" ;
        Text [ spanish ] = "Modificar columnas proporcionalmente" ;
        Text [ french ] = "Modifier les colonnes de manière proport." ;
        Text [ dutch ] = "Kolommen gelijkmatig wijzigen" ;
        Text [ portuguese ] = "Ajustar colunas proporcionalmente" ;
        Text[ chinese_simplified ] = "¶Ô³ÆµØµ÷ÕûÁпí";
        Text[ russian ] = "Èçìåíèòü ðàâíîìåðíî ñòîëáöû";
        Text[ polish ] = "Z~modyfikuj równomiernie kolumny";
        Text[ japanese ] = "‹Ï“™—ñ•";
        Text[ chinese_traditional ] = "¹ïºÙ½Õ¾ãÄæ¼e";
        Text[ arabic ] = "ÊÛííÑ ÇáÃÚãÏÉ ÈÔßá ãÊßÇÝÆ";
        Text[ greek ] = "ÁëëáãÞ óôçëþí áíÜëïãá";
        Text[ korean ] = "±ÕÇüÀÖ°Ô ¿­ Á¶Àý";
        Text[ turkish ] = "Sütunlarý orantýlý deðiþtir";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_INV
    {
        Pos = MAP_APPFONT ( 12 , 38 ) ;
        Size = MAP_APPFONT ( 180 , 12 ) ;
        Text = "Spalten umgekehrt proportional ändern" ;
        Text [ ENGLISH ] = "" ;
        TabStop = TRUE ;
        Text [ dutch ] = "Kolommen omgekeerd proportioneel wijzigen" ;
        Text [ italian ] = "Modifica colonne in modo inversamente proporzionale" ;
        Text [ spanish ] = "Modificar columnas proporcionalmente inversas" ;
        Text [ french ] = "Modifier les colonnes de manière inversement proportionnelle" ;
        Text [ english_us ] = "Reverse columns proportionally" ;
        Text [ swedish ] = "Ändra kolumnerna omvänt proportionellt" ;
        Text [ danish ] = "Modificer kolonner omvendt proportional" ;
        Text [ portuguese ] = "Alterar colunas em proporção inversa" ;
        Text [ portuguese_brazilian ] = "Spalten umgekehrt proportional ändern" ;
        Text[ chinese_simplified ] = "·´Ïà¸ü¸ÄÁпí";
        Text[ russian ] = "Èçìåíèòü êîëîíêè îáðàòíî ïðîïîðöèîíàëüíî";
        Text[ polish ] = "Zmieñ kolumny odwrotnie proporcjonalnie";
        Text[ japanese ] = "—ñ‚𔽔ä—á‚ɕύX";
        Text[ chinese_traditional ] = "¤Ï¬ÛÅܧóÄæ¼e";
        Text[ arabic ] = "ÚßÓ ÇáÊÛííÑ ÇáÊäÇÓÈí ááÃÚãÏÉ";
        Text[ greek ] = "ÁëëáãÞ óôçëþí áíôéóôñüöùò áíÜëïãá";
        Text[ korean ] = "¿­¿¡ ¹Ýºñ·Ê·Î";
        Text[ turkish ] = "Sütunlarý ters orantýlý deðiþtir";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_SPACE
    {
        Pos = MAP_APPFONT ( 12 , 53 ) ;
        Size = MAP_APPFONT ( 80 , 8 ) ;
        Text = "Noch verfügbarer Platz" ;
        Text [ English ] = "Available space" ;
        Text [ english_us ] = "Remaining space" ;
        Text [ italian ] = "Spazio ancora disponibile" ;
        Text [ spanish ] = "Espacio disponible" ;
        Text [ french ] = "Espace disponible" ;
        Text [ dutch ] = "Nog beschikbare ruimte" ;
        Text [ swedish ] = "Återstående plats" ;
        Text [ danish ] = "Plads til rådighed" ;
        Text [ portuguese ] = "Espaço restante" ;
        Text [ portuguese_brazilian ] = "Noch verfügbarer Platz" ;
        Text[ chinese_simplified ] = "»¹ÓÐÏÖ´æ¿ÉÓÿռä";
        Text[ russian ] = "Îñòàòîê ìåñòà";
        Text[ polish ] = "Miejsce do dyspozycji";
        Text[ japanese ] = "Žc‚è‚̽Íß°½";
        Text[ chinese_traditional ] = "ÁÙ¦³²{¦s¥i¥ÎªÅ¶¡";
        Text[ arabic ] = "ÇáãÓÇÍÉ ÇáãÊÈÞíÉ";
        Text[ greek ] = "Õðïëåéðüìåíïò ÷þñïò";
        Text[ korean ] = "³ª¸ÓÁö °£°Ý";
        Text[ turkish ] = "Kalan boþluk";
        Text[ language_user1 ] = " ";
    };
    MetricField ED_SPACE
    {
        ReadOnly = TRUE ;
        Border = TRUE ;
        Pos = MAP_APPFONT ( 95 , 51 ) ;
        Size = MAP_APPFONT ( 30 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Minimum = 0 ;
        Maximum = 5600 ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        First = 10 ;
        Last = 5600 ;
        SpinSize = 10 ;
    };
    ImageButton COL_BTN_DOWN
    {
        Disable = TRUE ;
        Pos = MAP_APPFONT ( 12 , 95 ) ;
        Size = MAP_APPFONT ( 10 , 10 ) ;
        TabStop = TRUE ;
        SYMBOL = IMAGEBUTTON_ARROW_LEFT ;
    };
    ImageButton COL_BTN_UP
    {
        Disable = TRUE ;
        Pos = MAP_APPFONT ( 234 , 95 ) ;
        Size = MAP_APPFONT ( 10 , 10 ) ;
        TabStop = TRUE ;
        SYMBOL = IMAGEBUTTON_ARROW_RIGHT ;
    };
    FixedText COL_FT_1
    {
        Pos = MAP_APPFONT ( 30 , 95 ) ;
        Size = MAP_APPFONT ( 9 , 8 ) ;
        Text = "~1" ;
        Left = TRUE ;
        Center = TRUE ;
        Right = TRUE ;
    };
    MetricField COL_MF_1
    {
        Disable = TRUE ;
        Border = TRUE ;
        Pos = MAP_APPFONT ( 13 , 111 ) ;
        Size = MAP_APPFONT ( 36 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 1 ;
        Maximum = 5600 ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        First = 10 ;
        Last = 5600 ;
        SpinSize = 10 ;
    };
    FixedText COL_FT_2
    {
        Pos = MAP_APPFONT ( 68 , 95 ) ;
        Size = MAP_APPFONT ( 9 , 8 ) ;
        Text = "~2" ;
        Left = TRUE ;
        Right = TRUE ;
    };
    MetricField COL_MF_2
    {
        Disable = TRUE ;
        Border = TRUE ;
        Pos = MAP_APPFONT ( 52 , 111 ) ;
        Size = MAP_APPFONT ( 36 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 0 ;
        Maximum = 5600 ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        First = 10 ;
        Last = 5600 ;
        SpinSize = 10 ;
    };
    FixedText COL_FT_3
    {
        Pos = MAP_APPFONT ( 107 , 95 ) ;
        Size = MAP_APPFONT ( 9 , 8 ) ;
        Text = "~3" ;
        Left = TRUE ;
        Right = TRUE ;
    };
    MetricField COL_MF_3
    {
        Disable = TRUE ;
        Border = TRUE ;
        Pos = MAP_APPFONT ( 91 , 111 ) ;
        Size = MAP_APPFONT ( 36 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 0 ;
        Maximum = 5600 ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        First = 10 ;
        Last = 5600 ;
        SpinSize = 10 ;
    };
    FixedText COL_FT_4
    {
        Pos = MAP_APPFONT ( 146 , 95 ) ;
        Size = MAP_APPFONT ( 9 , 8 ) ;
        Text = "~4" ;
        Left = TRUE ;
        Right = TRUE ;
    };
    MetricField COL_MF_4
    {
        Disable = TRUE ;
        Border = TRUE ;
        Pos = MAP_APPFONT ( 130 , 111 ) ;
        Size = MAP_APPFONT ( 36 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 0 ;
        Maximum = 5600 ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        First = 10 ;
        Last = 5600 ;
        SpinSize = 10 ;
    };
    FixedText COL_FT_5
    {
        Pos = MAP_APPFONT ( 185 , 95 ) ;
        Size = MAP_APPFONT ( 9 , 8 ) ;
        Text = "~5" ;
        Left = TRUE ;
        Right = TRUE ;
    };
    MetricField COL_MF_5
    {
        Disable = TRUE ;
        Border = TRUE ;
        Pos = MAP_APPFONT ( 169 , 111 ) ;
        Size = MAP_APPFONT ( 36 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 0 ;
        Maximum = 5600 ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        First = 10 ;
        Last = 5600 ;
        SpinSize = 10 ;
    };
    FixedText COL_FT_6
    {
        Pos = MAP_APPFONT ( 224 , 95 ) ;
        Size = MAP_APPFONT ( 9 , 8 ) ;
        Text = "~6" ;
        Left = TRUE ;
        Right = TRUE ;
    };
    MetricField COL_MF_6
    {
        Disable = TRUE ;
        Border = TRUE ;
        Pos = MAP_APPFONT ( 208 , 111 ) ;
        Size = MAP_APPFONT ( 36 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 0 ;
        Maximum = 5600 ;
        DecimalDigits = 2 ;
        Unit = FUNIT_CM ;
        First = 10 ;
        Last = 5600 ;
        SpinSize = 10 ;
    };
    GroupBox COL_GB_LAYOUT
    {
        Pos = MAP_APPFONT ( 6 , 80 ) ;
        Size = MAP_APPFONT ( 240 , 49 ) ;
        Text = "Spaltenbreite" ;
        Text [ ENGLISH ] = "Column width" ;
        Text [ norwegian ] = "Bredde på kolonne " ;
        Text [ italian ] = "Larghezza colonna" ;
        Text [ portuguese_brazilian ] = "Largura da coluna" ;
        Text [ portuguese ] = "Largura da coluna" ;
        Text [ finnish ] = "Sarakeleveys" ;
        Text [ danish ] = "Kolonnebredde" ;
        Text [ french ] = "Largeur de colonne" ;
        Text [ swedish ] = "Kolumnbredd" ;
        Text [ dutch ] = "Kolombreedte" ;
        Text [ spanish ] = "Ancho de columna" ;
        Text [ english_us ] = "Column width" ;
        Text[ chinese_simplified ] = "À¸¿í";
        Text[ russian ] = "Øèðèíà ñòîëáöîâ";
        Text[ polish ] = "Szer. kolumny";
        Text[ japanese ] = "—ñ‚Ì•";
        Text[ chinese_traditional ] = "Äæ¼e";
        Text[ arabic ] = "ÚÑÖ ÇáÃÚãÏÉ";
        Text[ greek ] = "ÐëÜôïò óôÞëçò";
        Text[ korean ] = "¿­ ³Êºñ";
        Text[ turkish ] = "Sütun geniþliði";
        Text[ language_user1 ] = " ";
    };
};
/**************************************************************************/
/*                                                                        */
/*  Textfluss                                                                        */
/*                                                                        */
/**************************************************************************/
TabPage TP_TABLE_TEXTFLOW
{
    HelpId = HID_TABLE_TEXTFLOW ;
    Size = MAP_APPFONT ( 260 , 135 ) ;
    TEXT_TEXTFLOW
    Hide = TRUE;
    GroupBox GB_FLOW
    {
        Pos = MAP_APPFONT ( 3 , 6 ) ;
        Size = MAP_APPFONT ( 251 , 64 ) ;
        TEXT_TEXTFLOW
    };
    CheckBox CB_PAGEBREAK
    {
         //         Disable = TRUE;
        Pos = MAP_APPFONT ( 12 , 17 ) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "~Umbruch" ;
        Text [ ENGLISH ] = "~Break" ;
        Text [ norwegian ] = "~Skift" ;
        Text [ italian ] = "I~nterruzione" ;
        Text [ portuguese_brazilian ] = "~Interrupção" ;
        Text [ portuguese ] = "~Quebra" ;
        Text [ finnish ] = "~Vaihto" ;
        Text [ danish ] = "Skift" ;
        Text [ french ] = "~Saut" ;
        Text [ swedish ] = "~Brytning" ;
        Text [ dutch ] = "~Eindemarkering" ;
        Text [ spanish ] = "~Salto" ;
        Text [ english_us ] = "~Break" ;
        TabStop = TRUE ;
        Group = TRUE ;
        Text[ chinese_simplified ] = "»»Ò³(~B)";
        Text[ russian ] = "Ðàçðûâ";
        Text[ polish ] = "Po~dzia³";
        Text[ japanese ] = "‹æØ‚è(~B)";
        Text[ chinese_traditional ] = "´«­¶(~B)";
        Text[ arabic ] = "ÝÇÕá";
        Text[ greek ] = "ÁëëáãÞ";
        Text[ korean ] = "ÆäÀÌÁö ¹Ù²Ù±â(~B)";
        Text[ turkish ] = "Kesme";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_BREAKPAGE
    {
         //         Disable = TRUE;
        Pos = MAP_APPFONT ( 105 , 16 ) ;
        Size = MAP_APPFONT ( 33 , 10 ) ;
        Text = "~Seite" ;
        Text [ ENGLISH ] = "~Page" ;
        Text [ norwegian ] = "~Page" ;
        Text [ italian ] = "~Pagina" ;
        Text [ portuguese_brazilian ] = "~Página" ;
        Text [ portuguese ] = "~Página" ;
        Text [ finnish ] = "~Sivu" ;
        Text [ danish ] = "Side" ;
        Text [ french ] = "~Page" ;
        Text [ swedish ] = "~Sida" ;
        Text [ dutch ] = "~Pagina" ;
        Text [ spanish ] = "~Página" ;
        Text [ english_us ] = "~Page" ;
        Group = TRUE ;
        Check = TRUE ;
        Text[ chinese_simplified ] = "ҳ(~P)";
        Text[ russian ] = "Ñòðàíèöà";
        Text[ polish ] = "Strona";
        Text[ japanese ] = "Íß°¼Þ(~P)";
        Text[ chinese_traditional ] = "­¶(~P)";
        Text[ arabic ] = "ÕÝÍÉ";
        Text[ greek ] = "Óåëßäá";
        Text[ korean ] = "ÆäÀÌÁö(~P)";
        Text[ turkish ] = "Sayfa";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_BREAKCOLUMN
    {
         //         Disable = TRUE;
        Pos = MAP_APPFONT ( 141 , 16 ) ;
        Size = MAP_APPFONT ( 33 , 10 ) ;
         // ### ACHTUNG: Neuer Text in Resource? S~palte : ~Spalte
        Text = "S~palte" ;
        Text [ ENGLISH ] = "~Column" ;
        Text [ norwegian ] = "~Kolonne" ;
        Text [ italian ] = "~Colonna" ;
        Text [ portuguese_brazilian ] = "~Coluna" ;
        Text [ portuguese ] = "~Coluna" ;
        Text [ finnish ] = "~Palsta" ;
        Text [ danish ] = "Kolonne" ;
        Text [ french ] = "~Colonne" ;
        Text [ swedish ] = "~Kolumn" ;
        Text [ dutch ] = "~Kolom" ;
        Text [ spanish ] = "~Columna" ;
        Text [ english_us ] = "Col~umn" ;
        Text[ chinese_simplified ] = "À¸(~M)";
        Text[ russian ] = "Ñòîëáåö";
        Text[ polish ] = "Kolumna";
        Text[ japanese ] = "—ñ(~M)";
        Text[ chinese_traditional ] = "Äæ(~M)";
        Text[ arabic ] = "ÚãæÏ";
        Text[ greek ] = "ÓôÞëç";
        Text[ korean ] = "¿­(~U)";
        Text[ turkish ] = "Sütun";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_PAGEBREAKBEFORE
    {
         //         Disable = TRUE;
        Pos = MAP_APPFONT ( 176 , 16 ) ;
        Size = MAP_APPFONT ( 33 , 10 ) ;
        Text = "~davor" ;
        Text [ ENGLISH ] = "be~fore" ;
        Text [ norwegian ] = "f~ør" ;
        Text [ italian ] = "~Prima" ;
        Text [ portuguese_brazilian ] = "an~tes" ;
        Text [ portuguese ] = "an~tes" ;
        Text [ finnish ] = "~ennen" ;
        Text [ danish ] = "Før" ;
        Text [ french ] = "A~vant" ;
        Text [ swedish ] = "F~öre" ;
        Text [ dutch ] = "er~voor" ;
        Text [ spanish ] = "delan~te" ;
        Text [ english_us ] = "Be~fore" ;
        Group = TRUE ;
        Check = TRUE ;
        Text[ chinese_simplified ] = "֮ǰ(~F)";
        Text[ russian ] = "ïåðåä";
        Text[ polish ] = "przed";
        Text[ japanese ] = "‘O(~F)";
        Text[ chinese_traditional ] = "¤§«e(~F)";
        Text[ arabic ] = "ÞÈá";
        Text[ greek ] = "Ðñéí áðü";
        Text[ korean ] = "Àü¿¡(~F)";
        Text[ turkish ] = "Ön~ce";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_PAGEBREAKAFTER
    {
         //         Disable = TRUE;
        Pos = MAP_APPFONT ( 211 , 16 ) ;
        Size = MAP_APPFONT ( 37 , 10 ) ;
        Text = "da~nach" ;
        Text [ ENGLISH ] = "aft~er" ;
        Text [ norwegian ] = "ett~er" ;
        Text [ italian ] = "D~opo" ;
        Text [ portuguese_brazilian ] = "dep~ois" ;
        Text [ portuguese ] = "Dep~ois" ;
        Text [ finnish ] = "~jälkeen" ;
        Text [ danish ] = "Efter" ;
        Text [ french ] = "A~près" ;
        Text [ swedish ] = "Eft~er" ;
        Text [ dutch ] = "er~achter" ;
        Text [ spanish ] = "~detrás" ;
        Text [ english_us ] = "~After" ;
        Text[ chinese_simplified ] = "Ö®ºó(~E)";
        Text[ russian ] = "ïîñëå";
        Text[ polish ] = "p~otem";
        Text[ japanese ] = "΋(~E)";
        Text[ chinese_traditional ] = "¤§«á(~E)";
        Text[ arabic ] = "ÈÚÏ";
        Text[ greek ] = "ìåôÜ áðü";
        Text[ korean ] = "ÈÄ¿¡(~A)";
        Text[ turkish ] = "Son~ra";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_PAGECOLL
    {
         //         Disable = TRUE;
        Pos = MAP_APPFONT ( 12 , 30 ) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "mit Seitenvor~lage" ;
        Text [ ENGLISH ] = "With temp~late" ;
        Text [ norwegian ] = "Med m~al" ;
        Text [ italian ] = "Con mo~dello di pagina" ;
        Text [ portuguese_brazilian ] = "Com mode~lo" ;
        Text [ portuguese ] = "Com es~tilo de página" ;
        Text [ finnish ] = "Käytä ~mallia" ;
        Text [ danish ] = "Med sidetypografi" ;
        Text [ french ] = "Avec le style de page" ;
        Text [ swedish ] = "med sid~formatmall" ;
        Text [ dutch ] = "~Met pagina-opmaakprofiel" ;
        Text [ spanish ] = "C~on estilo de página" ;
        Text [ english_us ] = "With Page St~yle" ;
        TabStop = TRUE ;
        Group = TRUE ;
        Text[ chinese_simplified ] = "´øÒ³ÃæÑùʽ(~Y)";
        Text[ russian ] = "Ñî ñòèëåì ñòðàíèöû";
        Text[ polish ] = "Ze style~m strony";
        Text[ japanese ] = "Íß°¼Þ½À²Ù•t‚«(~Y)";
        Text[ chinese_traditional ] = "±a­¶­±¼Ë¦¡(~Y)";
        Text[ arabic ] = "ÈäãØ ÕÝÍÉ";
        Text[ greek ] = "ìå ðñüôõðï óåëßäáò";
        Text[ korean ] = "ÆäÀÌÁö À¯Çü°ú(~Y)";
        Text[ turkish ] = "Sayfa düzeni ile";
        Text[ language_user1 ] = "All \"Vorlagen\" /Styles are written with a capital S.10.5.00EM";
    };
    ListBox LB_PAGECOLL
    {
         //         Disable = TRUE;
        Pos = MAP_APPFONT ( 105 , 28 ) ;
        Size = MAP_APPFONT ( 61 , 50 ) ;
        TabStop = TRUE ;
        DropDown = TRUE ;
    };
    FixedText FT_PAGENUM
    {
        Pos = MAP_APPFONT ( 171 , 30 ) ;
        Size = MAP_APPFONT ( 47 , 10 ) ;
        Text = "Se~itennummer" ;
        Text [ ENGLISH ] = "Page number" ;
        Text [ english_us ] = "Page ~number" ;
        Text [ swedish ] = "S~idnummer" ;
        Text [ danish ] = "Sidetal" ;
        Text [ italian ] = "Numero di pag~ina" ;
        Text [ spanish ] = "Nú~mero de página" ;
        Text [ french ] = "Numér~o de page" ;
        Text [ dutch ] = "Pa~ginanummer" ;
        Text [ portuguese_brazilian ] = "Se~itennummer" ;
        Text [ portuguese ] = "~Número de página" ;
        Text[ chinese_simplified ] = "Ò³Âë(~N)";
        Text[ russian ] = "Íîìåð ñòðàíèöû";
        Text[ polish ] = "Numer strony";
        Text[ japanese ] = "Íß°¼Þ”ԍ†(~N)";
        Text[ chinese_traditional ] = "­¶¼Æ(~N)";
        Text[ arabic ] = "ÑÞã ÇáÕÝÍÉ";
        Text[ greek ] = "Áñéèìüò óåëßäáò";
        Text[ korean ] = "ÆäÀÌÁö ¹øÈ£(~N)";
        Text[ turkish ] = "Sayfa ~numaralarý";
        Text[ language_user1 ] = " ";
    };
    NumericField NF_PAGENUM
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 223 , 28 ) ;
        Size = MAP_APPFONT ( 26 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 0 ;
        Maximum = 9999 ;
        Value = 0 ;
        First = 0 ;
        Last = 9999 ;
    };
    CheckBox CB_SPLIT
    {
        Pos = MAP_APPFONT ( 12 , 43 ) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "Tabelle nicht ~trennen" ;
        Text [ ENGLISH ] = "dont split" ;
        TabStop = TRUE ;
        Text [ english_us ] = "~Do not split table" ;
        Text [ portuguese_brazilian ] = "Tabelle nicht ~trennen" ;
        Text [ swedish ] = "Dela inte ~tabell" ;
        Text [ danish ] = "Odel tabel ikke" ;
        Text [ italian ] = "Non separare la tabella" ;
        Text [ spanish ] = "~No dividir tabla" ;
        Text [ french ] = "Ne pas ~séparer tableau" ;
        Text [ dutch ] = "~Tabel niet splitsen" ;
        Text [ portuguese ] = "~Não separar tabela" ;
        Text[ chinese_simplified ] = "²»·Ö¸ô±í¸ñ";
        Text[ russian ] = "Íå ðàçáèâàòü òàáëèöó";
        Text[ polish ] = "Nie dziel ta~beli";
        Text[ japanese ] = "•\\‚𕪊„‚µ‚È‚¢";
        Text[ chinese_traditional ] = "¤£¤À¶}ªí®æ";
        Text[ arabic ] = "ÚÏã ÝÕá ÇáÌÏæá";
        Text[ greek ] = "Íá ìç äéáéñåèåß ï ðßíáêáò";
        Text[ korean ] = "Ç¥¸¦ ³ª´©Áö ¸¶½Ê½Ã¿À.";
        Text[ turkish ] = "Tabloyu ayýrma";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_KEEP
    {
        Pos = MAP_APPFONT ( 105 , 43 ) ;
        Size = MAP_APPFONT ( 140 , 10 ) ;
        Text = "Mit folgendem Absatz ~zusammenhalten" ;
        Text [ ENGLISH ] = "~keep with next" ;
        TabStop = TRUE ;
        Text [ english_us ] = "~keep with next paragraph" ;
        Text [ portuguese_brazilian ] = "Mit folgendem Absatz ~zusammenhalten" ;
        Text [ swedish ] = "Håll ~ihop med följande stycke" ;
        Text [ danish ] = "Hold sammen med næste afsnit" ;
        Text [ italian ] = "Non separare dal paragrafo seguente." ;
        Text [ spanish ] = "Mantener ~junto al párrafo siguiente" ;
        Text [ french ] = "~Ne pas séparer du paragraphe suivant" ;
        Text [ dutch ] = "~Met de volgende alinea samenvoegen" ;
        Text [ portuguese ] = "Jun~tar ao parágrafo seguinte" ;
        Text[ chinese_simplified ] = "ºÍÏÂÒ»¶ÎÂä±£³ÖÁ¬½Ó(~K)";
        Text[ russian ] = "Âìåñòå ñî ñëåäóþùèì àáçàöåì";
        Text[ polish ] = "Akapit razem z nastêpnym";
        Text[ japanese ] = "ŽŸ‚Ì’i—Ž‚ÆÚ‡(~K)";
        Text[ chinese_traditional ] = "©M¤U¤@¬q¸¨«O«ù³sµ²(~K)";
        Text[ arabic ] = "ÊÑÇÈØ ÇáÝÞÑÇÊ";
        Text[ greek ] = "ÄéáôÞñçóç ìå åðüìåíç ðáñÜãñáöï";
        Text[ korean ] = "´ÙÀ½ ´Ü¶ôÀ» °°Àº ÆäÀÌÁö¿¡(~K)";
        Text[ turkish ] = "Alttaki paragraf ile birlikte tut";
        Text[ language_user1 ] = " ";
    };
    CheckBox CB_HEADLINE
    {
        Pos = MAP_APPFONT ( 12 , 55 ) ;
        Size = MAP_APPFONT ( 106 , 10 ) ;
        Text = "Überschrift ~wiederholen" ;
        Text [ ENGLISH ] = "R~epeat Headline" ;
        Text [ norwegian ] = "G~jenta Overskrift" ;
        Text [ italian ] = "R~ipeti riga intestazione" ;
        Text [ portuguese_brazilian ] = "R~epetir Título" ;
        Text [ portuguese ] = "R~epetir título" ;
        Text [ finnish ] = "~Toista otsikko" ;
        Text [ danish ] = "Gentag overskrift" ;
        Text [ french ] = "R~épéter le titre" ;
        Text [ swedish ] = "U~pprepa överskrift" ;
        Text [ dutch ] = "Kop ~herhalen" ;
        Text [ spanish ] = "Repet~ir encabezado" ;
        Text [ english_us ] = "R~epeat heading" ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "ÖØ¸´±êÌâ(~E)";
        Text[ russian ] = "Ïîâòîðèòü çàãîëîâîê";
        Text[ polish ] = "Powtórz tytu³";
        Text[ japanese ] = "Œ©o‚µ‚ÌŒJ‚è•Ô‚µ(~E)";
        Text[ chinese_traditional ] = "­«½Æ¼ÐÃD(~E)";
        Text[ arabic ] = "ÊßÑÇÑ ÇáÚäæÇä";
        Text[ greek ] = "ÅðáíÜëçøç åðéêåöáëßäáò";
        Text[ korean ] = "¸Ó¸®±Û ¹Ýº¹(~E)";
        Text[ turkish ] = "Baþlýðý yinele";
        Text[ language_user1 ] = " ";
    };
    GroupBox GB_VERT_ORIENT
    {
        Pos = MAP_APPFONT ( 3 , 76 ) ;
        Size = MAP_APPFONT ( 251 , 52 ) ;
        Text = "Vertikale Ausrichtung" ;
        Text [ ENGLISH ] = "Vertical Alignment" ;
        Text [ english_us ] = "Vertical alignment" ;
        Text [ swedish ] = "Vertikal justering" ;
        Text [ danish ] = "Lodret justering" ;
        Text [ italian ] = "Allineamento verticale" ;
        Text [ spanish ] = "Alineación vertical" ;
        Text [ french ] = "Alignement vertical" ;
        Text [ dutch ] = "Verticale uitlijning" ;
        Text [ portuguese_brazilian ] = "Vertikale Ausrichtung" ;
        Text [ portuguese ] = "Alinhamento vertical" ;
        Text[ chinese_simplified ] = "´¹Ö±·½Ïò¶ÔÆë";
        Text[ russian ] = "Âûðàâíèâàíèå ïî âåðòèêàëè";
        Text[ polish ] = "Pionowe wyrównanie";
        Text[ japanese ] = "cˆÊ’u";
        Text[ chinese_traditional ] = "««ª½¹ï»ô";
        Text[ arabic ] = "ãÍÇÐÇÉ ÑÃÓíÉ";
        Text[ greek ] = "Êáôáêüñõöç óôïß÷éóç";
        Text[ korean ] = "¼öÁ÷ ¸ÂÃã";
        Text[ turkish ] = "Dikey hizalama";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_VERT_TOP
    {
        Pos = MAP_APPFONT ( 12 , 86 ) ;
        Size = MAP_APPFONT ( 60 , 10 ) ;
        Text = "Oben" ;
        Text [ ENGLISH ] = "Top" ;
        Text [ english_us ] = "Top" ;
        Text [ swedish ] = "Överst" ;
        Text [ danish ] = "Top" ;
        Text [ italian ] = "Alto" ;
        Text [ spanish ] = "Arriba" ;
        Text [ french ] = "En haut" ;
        Text [ dutch ] = "Boven" ;
        Text [ portuguese_brazilian ] = "Oben" ;
        Text [ portuguese ] = "Em cima" ;
        Text[ chinese_simplified ] = "ÉÏ";
        Text[ russian ] = "Ââåðõó";
        Text[ polish ] = "Na g~órze";
        Text[ japanese ] = "ã";
        Text[ chinese_traditional ] = "¤W";
        Text[ arabic ] = "ÃÚáì";
        Text[ greek ] = "ÐÜíù";
        Text[ korean ] = "¸ÇÀ§";
        Text[ turkish ] = "Orta";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_VERT_CENTER
    {
        Pos = MAP_APPFONT ( 12 , 98 ) ;
        Size = MAP_APPFONT ( 60 , 10 ) ;
        Text = "Mitte" ;
        Text [ ENGLISH ] = "Middle" ;
        Text [ english_us ] = "~Centered" ;
        Text [ swedish ] = "Mitten" ;
        Text [ danish ] = "Centreret" ;
        Text [ italian ] = "Centro" ;
        Text [ spanish ] = "Centro" ;
        Text [ french ] = "Milieu" ;
        Text [ dutch ] = "Midden" ;
        Text [ portuguese_brazilian ] = "Mitte" ;
        Text [ portuguese ] = "Centro" ;
        Text[ chinese_simplified ] = "ÖÐ";
        Text[ russian ] = "Â ñåðåäèíå";
        Text[ polish ] = "Œrodek";
        Text[ japanese ] = "’†S";
        Text[ chinese_traditional ] = "¤¤";
        Text[ arabic ] = "ÇáæÓØ";
        Text[ greek ] = "ÊÝíôñï";
        Text[ korean ] = "°¡¿îµ¥(~C)";
        Text[ turkish ] = "Aþaðý";
        Text[ language_user1 ] = " ";
    };
    RadioButton RB_VERT_BOTTOM
    {
        Pos = MAP_APPFONT ( 12 , 110 ) ;
        Size = MAP_APPFONT ( 60 , 10 ) ;
        Text = "Unten" ;
        Text [ ENGLISH ] = "Bottom" ;
        Text [ english_us ] = "Bottom" ;
        Text [ swedish ] = "Underst" ;
        Text [ danish ] = "Nederst" ;
        Text [ italian ] = "Basso" ;
        Text [ spanish ] = "Abajo" ;
        Text [ french ] = "En bas" ;
        Text [ dutch ] = "Beneden" ;
        Text [ portuguese_brazilian ] = "Unten" ;
        Text [ portuguese ] = "Em baixo" ;
        Text[ chinese_simplified ] = "ÏÂ";
        Text[ russian ] = "Âíèçó";
        Text[ polish ] = "W dole";
        Text[ japanese ] = "‰º";
        Text[ chinese_traditional ] = "¤U";
        Text[ arabic ] = "ÃÓÝá";
        Text[ greek ] = "ÊÜôù";
        Text[ korean ] = "¹Ù´Ú";
        Text[ turkish ] = "Yukarý";
        Text[ language_user1 ] = " ";
    };
};
InfoBox MSG_WRONG_TABLENAME
{
    MESSAGE = "Der Name der Tabelle darf keine Leerzeichen enthalten." ;
    MESSAGE [ English ] = "The name of the table must not contain spaces." ;
    Message [ english_us ] = "The name of the table must not contain spaces." ;
    Message [ portuguese_brazilian ] = "Der Name der Tabelle darf keine Leerzeichen enthalten." ;
    Message [ swedish ] = "Namnet på tabellen får inte innehålla några blanksteg." ;
    Message [ danish ] = "Et tabelnavn må ikke indeholde mellemrum." ;
    Message [ italian ] = "Il nome della tabella non può contenere spazi." ;
    Message [ spanish ] = "El nombre de la tabla no debe contener espacios." ;
    Message [ french ] = "Le nom du tableau ne peut pas contenir d'espaces." ;
    Message [ dutch ] = "In de naam van de tabel mogen geen spaties voorkomen." ;
    Message [ portuguese ] = "O nome da tabela não pode ter espaços vazios" ;
    Message[ chinese_simplified ] = "±í¸ñÃû³Æ²»Äܺ¬Óпոñ×Ö·û¡£";
    Message[ russian ] = "Èìÿ òàáëèöû íå äîëæíî ñîäåðæàòü ïðîáåëîâ.";
    Message[ polish ] = "Nazwa tabeli nie mo¿e zawieraæ spacji.";
    Message[ japanese ] = "•\\–¼‚ɽÍß°½‚Í“ü‚ê‚ç‚ê‚Ü‚¹‚ñ";
    Message[ chinese_traditional ] = "ªí®æ¦WºÙ¤£¯à§t¦³ªÅ®æ¦r¤¸¡C";
    Message[ arabic ] = "íÌÈ ÃáÇ íÍÊæí ÇÓã ÇáÌÏæá Úáì ÃÍÑÝ ãÓÇÝÉ.";
    Message[ greek ] = "Ôï üíïìá ôïõ ðßíáêá äåí åðéôñÝðåôáé íá ðåñéÝ÷åé êåíÜ";
    Message[ korean ] = "Ç¥ À̸§¿¡´Â °ø¹éÀÌ ÀÖÀ¸¸é ¾ÈµË´Ï´Ù.";
    Message[ turkish ] = "Tablo adýnda boþluk bulunmamalýdýr.";
    Message[ language_user1 ] = " ";
};
diff --git a/sw/source/ui/table/tablemgr.cxx b/sw/source/ui/table/tablemgr.cxx
new file mode 100644
index 0000000..7e27dee
--- /dev/null
+++ b/sw/source/ui/table/tablemgr.cxx
@@ -0,0 +1,441 @@
/*************************************************************************
 *
 *  $RCSfile: tablemgr.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:48 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SVSTOR_HXX //autogen
#include <so3/svstor.hxx>
#endif
#ifndef _IPOBJ_HXX //autogen
#include <so3/ipobj.hxx>
#endif
#ifndef _SCHDLL0_HXX
#include <sch/schdll0.hxx>
#endif
#ifndef _SCH_DLL_HXX
#include <sch/schdll.hxx>
#endif
#ifndef _SCH_MEMCHRT_HXX
#include <sch/memchrt.hxx>
#endif


#include "errhdl.hxx"
#include "wrtsh.hxx"
#include "cmdid.h"
#include "frmatr.hxx"
#include "view.hxx"
#include "basesh.hxx"
#include "swundo.hxx"
#include "tablemgr.hxx"
#include "frmfmt.hxx"
#include "instable.hxx"
#include "colwd.hxx"
#include "swerror.h"
#include "table.hrc"



/*------------------------------------------------------------------------
 Beschreibung:  Zeilenhoehe einstellen (Dialog)
------------------------------------------------------------------------*/


void SwTableFUNC::ColWidthDlg( Window *pParent )
{
    InitTabCols();
    SwTableWidthDlg *pDlg = new SwTableWidthDlg( pParent, *this );
    pDlg->Execute();
    delete pDlg;
}

/*--------------------------------------------------------------------
    Beschreibung: Breite ermitteln
 --------------------------------------------------------------------*/


SwTwips SwTableFUNC::GetColWidth(USHORT nNum) const
{
    SwTwips nWidth = 0;

    if( aCols.Count() > 0 )
    {
        if(aCols.Count() == GetColCount())
        {
            nWidth = (SwTwips)((nNum == aCols.Count()) ?
                    aCols.GetRight() - aCols[nNum-1] :
                    nNum == 0 ? aCols[nNum] - aCols.GetLeft() :
                                aCols[nNum] - aCols[nNum-1]);
        }
        else
        {
            SwTwips nRValid = nNum < GetColCount() ?
                            aCols[(USHORT)GetRightSeparator((int)nNum)]:
                                    aCols.GetRight();
            SwTwips nLValid = nNum ?
                            aCols[(USHORT)GetRightSeparator((int)nNum - 1)]:
                                    aCols.GetLeft();
            nWidth = nRValid - nLValid;
        }
    }
    else
        nWidth = aCols.GetRight();

    return nWidth;
}



SwTwips SwTableFUNC::GetMaxColWidth( USHORT nNum ) const
{
    ASSERT(nNum <= aCols.Count(), "Index out of Area");

    if ( GetColCount() > 0 )
    {
        // Die max. Breite ergibt sich aus der eigenen Breite und
        // der Breite der Nachbarzellen um je MINLAY verringert
        SwTwips nMax =  nNum == 0 ?
            GetColWidth(1) - MINLAY :
                nNum == GetColCount() ?
                    GetColWidth( nNum-1 ) - MINLAY :
                        GetColWidth(nNum - 1) + GetColWidth( nNum + 1 ) - 2 * MINLAY;

        return nMax + GetColWidth(nNum) ;
    }
    else
        return GetColWidth(nNum);
}



void SwTableFUNC::SetColWidth(USHORT nNum, SwTwips nNewWidth )
{
    // aktuelle Breite setzen
    // alle folgenden Verschieben
    BOOL bCurrentOnly = FALSE;
    SwTwips nWidth = 0;

    if ( aCols.Count() > 0 )
    {
        if(aCols.Count() != GetColCount())
            bCurrentOnly = TRUE;
        nWidth = GetColWidth(nNum);

        int nDiff = (int)(nNewWidth - nWidth);
        if( !nNum )
            aCols[GetRightSeparator(0)] += nDiff;
        else if( nNum < GetColCount()  )
        {
            if(nDiff < GetColWidth(nNum + 1) - MINLAY)
                aCols[GetRightSeparator(nNum)] += nDiff;
            else
            {
                int nDiffLeft = nDiff - (int)GetColWidth(nNum + 1) + (int)MINLAY;
                aCols[GetRightSeparator(nNum)] += (nDiff - nDiffLeft);
                aCols[GetRightSeparator(nNum - 1)] -= nDiffLeft;
            }
        }
        else
            aCols[GetRightSeparator(nNum-1)] -= nDiff;
    }
    else
        aCols.SetRight( Min( nNewWidth, aCols.GetRightMax()) );

    pSh->StartAllAction();
    pSh->SetTabCols( aCols, bCurrentOnly );
    pSh->EndAllAction();
}



void SwTableFUNC::InitTabCols()
{
    ASSERT(pSh, keine Shell);

    if( pFmt && pSh)
        pSh->GetTabCols( aCols );
}



SwTableFUNC::SwTableFUNC(SwWrtShell *pShell, BOOL bCopyFmt)
    : pFmt(pShell->GetTableFmt()),
      pSh(pShell),
      bCopy(bCopyFmt)
{
        // gfs. das Format fuer die Bearbeitung kopieren
    if( pFmt && bCopy )
        pFmt = new SwFrmFmt( *pFmt );
}



SwTableFUNC::~SwTableFUNC()
{
    if(bCopy)
        delete pFmt;
}

//Sonst GPF mit W95,MSVC40, non product
#pragma optimize("",off)



void SwTableFUNC::InsertChart( SchMemChart& rData, const SfxItemSet *pSet )
{
    pSh->StartAllAction();
    pSh->StartUndo( UIUNDO_INSERT_CHART );

    String aName( pSh->GetTableFmt()->GetName() );

    //Vor die Tabelle gehen und einen Node einfuegen.
    pSh->MoveTable( fnTableCurr, fnTableStart );
    pSh->Up();
    if ( pSh->IsCrsrInTbl() )
    {
        if ( aName != pSh->GetTableFmt()->GetName() )
            pSh->Down();    //Zwei Tabellen direkt uebereinander.
    }
    pSh->SplitNode();

    //Jetzt das CharObject einfuegen.
        //Wer das nicht versteht ist selber schuld ;-)
    SvStorageRef aStor = new SvStorage( aEmptyStr );
    SvInPlaceObjectRef aIPObj;
#ifndef SO3
    aIPObj = &SvInPlaceObject::ClassFactory()->CreateAndInit( *SCH_MOD()->pSchChartDocShellFactory, aStor );
#else
    aIPObj = &((SvFactory*)SvInPlaceObject::ClassFactory())->CreateAndInit( *SCH_MOD()->pSchChartDocShellFactory, aStor );
#endif
    if ( aIPObj.Is() )
    {
        pSh->InsertOle( aIPObj );

        //Den Namen der Table am OleNode setzen
        pSh->SetChartName( aName );

        //Und die Daten in's Objekt uebertragen.
        if( pSet )
            SchDLL::Update( aIPObj, &rData, *pSet );
        else
            SchDLL::Update( aIPObj, &rData );
    }
    pSh->EndUndo( UIUNDO_INSERT_CHART );
    pSh->EndAllAction();
}

#pragma optimize("",on)



void SwTableFUNC::UpdateChart()
{
    //Update der Felder in der Tabelle vom User ausgeloesst, alle
    //Charts zu der Tabelle werden auf den neuesten Stand gebracht.
    SwFrmFmt *pFmt = pSh->GetTableFmt();
    if ( pFmt && pSh->HasOLEObj( pFmt->GetName() ) )
    {
        pSh->StartAllAction();
        pSh->UpdateCharts( pFmt->GetName() );
        pSh->EndAllAction();
    }
}



USHORT  SwTableFUNC::GetCurColNum() const
{
    int nPos = pSh->GetCurTabColNum();
    int nCount = 0;
    for(int i = 0; i < nPos; i++ )
        if(aCols.IsHidden(i))
            nCount ++;
    return nPos - nCount;
}




USHORT  SwTableFUNC::GetColCount() const
{
    USHORT nCount = 0;
    for(int i=0; i < (int)aCols.Count(); i++ )
        if(aCols.IsHidden(i))
            nCount ++;
    return aCols.Count() - nCount;
}



int SwTableFUNC::GetRightSeparator(int nNum) const
{
    DBG_ASSERT( nNum < (int)GetColCount() ,"Index out of range")
    int i = 0;
    while( nNum >= 0 )
    {
        if( !aCols.IsHidden(i) )
            nNum--;
        i++;
    }
    return i - 1;
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.120  2000/09/18 16:06:09  willem.vandorp
    OpenOffice header added.

    Revision 1.119  2000/08/29 14:01:23  ama
    New: Negative margins

    Revision 1.118  2000/04/26 14:59:03  os
    GetName() returns const String&

    Revision 1.117  2000/03/09 21:54:38  jp
    Changes: SchMemChart in new headerfile

    Revision 1.116  2000/02/11 14:58:54  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.115  1999/02/09 13:31:14  JP
    Task #61632#: Charts auch in complexen Tabellen zulassen


      Rev 1.114   09 Feb 1999 14:31:14   JP
   Task #61632#: Charts auch in complexen Tabellen zulassen

      Rev 1.113   29 Nov 1997 14:28:10   MA
   includes

      Rev 1.112   24 Nov 1997 15:52:24   MA
   includes

      Rev 1.111   03 Nov 1997 13:56:50   MA
   precomp entfernt

      Rev 1.110   06 Aug 1997 14:48:50   TRI
   VCL: Anpassungen

      Rev 1.109   04 Apr 1997 08:38:36   MA
   include vergessen

      Rev 1.108   03 Apr 1997 09:14:08   MA
   undo fuer insertchart

      Rev 1.107   01 Apr 1997 18:00:58   MA
   #37054# Chart immer vor Tabelle

      Rev 1.106   04 Mar 1997 09:13:46   MA
   #37054# InsertChart, richtiger Anker bei zwei Tabellen uebereinander

      Rev 1.105   24 Nov 1996 14:59:48   WP
   SvGlobalNames beseitigt

      Rev 1.104   24 Oct 1996 13:33:04   TRI
   sostor.hxx included

      Rev 1.103   05 Sep 1996 08:19:22   OS
   richtige Min/Max-Einstellungen fuer einspaltige Tabellen

      Rev 1.102   04 Sep 1996 11:15:12   JP
   Split/InsertCol/Row-Dialoge und Methoden entfernt -> direkt an der Shell rufen

      Rev 1.101   28 Aug 1996 14:33:20   OS
   includes

      Rev 1.100   06 Jun 1996 14:54:54   OS
   MM50 ->MINLAY

      Rev 1.99   18 Apr 1996 11:38:54   OM
   Unbenutzte Fkt entfernt

      Rev 1.98   26 Mar 1996 15:10:20   MA
   fix: richtige Chart-SS, optimierung abgeschaltet

      Rev 1.97   07 Mar 1996 15:03:18   HJS
   del: memchart.hxx

      Rev 1.96   28 Feb 1996 16:47:06   MA
   chg: InsertChart mit ItemSet

      Rev 1.95   27 Feb 1996 19:19:52   MA
   chg: SS Chart geaendert

      Rev 1.94   27 Feb 1996 17:11:38   MA
   chg: Chart jetzt per Data-SS

      Rev 1.93   09 Jan 1996 19:55:24   JP
   InsertChart: TabellenName weitergeben; ueberfluessige Methoden entfernt

      Rev 1.92   14 Dec 1995 23:01:28   JP
   Filter Umstellung: ErrorHandling und Read/Write-Parameter

      Rev 1.91   24 Nov 1995 16:58:58   OM
   PCH->PRECOMPILED

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/table/tablepg.hxx b/sw/source/ui/table/tablepg.hxx
new file mode 100644
index 0000000..9274a9c
--- /dev/null
+++ b/sw/source/ui/table/tablepg.hxx
@@ -0,0 +1,263 @@
/*************************************************************************
 *
 *  $RCSfile: tablepg.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:48 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _SWTABLEPG_HXX
#define _SWTABLEPG_HXX

#ifndef _SFXTABDLG_HXX //autogen
#include <sfx2/tabdlg.hxx>
#endif
#ifndef _GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif
#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif
#ifndef _IMAGEBTN_HXX //autogen
#include <vcl/imagebtn.hxx>
#endif
#ifndef _LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif

#ifndef _ACTCTRL_HXX
#include <actctrl.hxx>
#endif
#include "prcntfld.hxx"
#include "swtypes.hxx"

class SwTabCols;
class SwWrtShell;
class SwTableRep;

struct TColumn
{
    SwTwips nWidth;
    BOOL    bVisible;
};

class SwFormatTablePage : public SfxTabPage
{
    GroupBox        aOptionsGB;
    FixedText       aNameFT;
    TableNameEdit   aNameED;
    FixedText       aWidthFT;
    PercentField    aWidthMF;
    CheckBox        aRelWidthCB;

    GroupBox        aPosFrm;
    RadioButton     aFullBtn;
    RadioButton     aLeftBtn;
    RadioButton     aFromLeftBtn;
    RadioButton     aRightBtn;
    RadioButton     aCenterBtn;
    RadioButton     aFreeBtn;

    GroupBox        aDistGB;
    FixedText       aLeftFT;
    PercentField    aLeftMF;
    FixedText       aRightFT;
    PercentField    aRightMF;
    FixedText       aTopFT;
    MetricField     aTopMF;
    FixedText       aBottomFT;
    MetricField     aBottomMF;

    SwTableRep*     pTblData;
    SwTwips         nSaveWidth;
    SwTwips         nMinTableWidth;
    USHORT          nOldAlign;
    BOOL            bModified;
    BOOL            bFull:1;

    void        Init();
    void        ModifyHdl( Edit* pEdit );

    DECL_LINK( AutoClickHdl, CheckBox * );
    DECL_LINK( RelWidthClickHdl, CheckBox * );
    DECL_LINK( RightModifyHdl, MetricField * );
    DECL_LINK( UpHdl, MetricField * );
    DECL_LINK( DownHdl, MetricField * );
    DECL_LINK( LoseFocusHdl, MetricField * );

public:
    SwFormatTablePage( Window* pParent, const SfxItemSet& rSet );

    static SfxTabPage*  Create( Window* pParent, const SfxItemSet& rAttrSet);
    virtual BOOL        FillItemSet( SfxItemSet& rSet );
    virtual void        Reset( const SfxItemSet& rSet );
    virtual void        ActivatePage( const SfxItemSet& rSet );
    virtual int         DeactivatePage( SfxItemSet* pSet = 0 );
};

/*-------------------------------------------------------
 TabPage Format/Tabelle/Spalten
--------------------------------------------------------- */
#define MET_FIELDS 6 //Anzahl der verwendeten MetricFields

class SwTableColumnPage : public SfxTabPage
{
    CheckBox        aModifyTableCB;
    CheckBox        aProportionalCB;
    CheckBox        aInverseCB;
    FixedText       aSpaceFT;
    MetricField     aSpaceED;

    ImageButton     aUpBtn;
    FixedText       aFT1;
    PercentField    aMF1;
    FixedText       aFT2;
    PercentField    aMF2;
    FixedText       aFT3;
    PercentField    aMF3;
    FixedText       aFT4;
    PercentField    aMF4;
    FixedText       aFT5;
    PercentField    aMF5;
    FixedText       aFT6;
    PercentField    aMF6;
    ImageButton     aDownBtn;
    GroupBox        aColGB;

    SwTableRep*     pTblData;
    PercentField*   pFieldArr[MET_FIELDS];
    FixedText*      pTextArr[MET_FIELDS];
    SwTwips         nTableWidth;
    SwTwips         nMinWidth;
    USHORT          nNoOfCols;
    USHORT          nNoOfVisibleCols;
    //Breite merken, wenn auf autom. Ausrichtung gestellt wird
    USHORT          aValueTbl[MET_FIELDS];//primaere Zuordnung der MetricFields
    BOOL            bModified:1;
    BOOL            bModifyTbl:1;
    BOOL            bPercentMode:1;

    void        Init(BOOL bWeb);
    DECL_LINK( AutoClickHdl, CheckBox * );
    void        ModifyHdl( PercentField* pEdit );
    DECL_LINK( UpHdl, PercentField * );
    DECL_LINK( DownHdl, PercentField * );
    DECL_LINK( LoseFocusHdl, PercentField * );
    DECL_LINK( ModeHdl, CheckBox * );
    void        UpdateCols( USHORT nAktPos );
    SwTwips     GetVisibleWidth(USHORT nPos);
    void        SetVisibleWidth(USHORT nPos, SwTwips nNewWidth);
public:
    SwTableColumnPage( Window* pParent, const SfxItemSet& rSet );
    ~SwTableColumnPage();

    static SfxTabPage*  Create( Window* pParent, const SfxItemSet& rAttrSet);
    virtual BOOL        FillItemSet( SfxItemSet& rSet );
    virtual void        Reset( const SfxItemSet& rSet );
    virtual void        ActivatePage( const SfxItemSet& rSet );
    virtual int         DeactivatePage( SfxItemSet* pSet = 0 );

};

/*-----------------12.12.96 11.48-------------------
        Textfluá
--------------------------------------------------*/
class SwTextFlowPage : public SfxTabPage
{
    GroupBox        aFlowGB;
    CheckBox        aPgBrkCB;
    RadioButton     aPgBrkRB;
    RadioButton     aColBrkRB;
    RadioButton     aPgBrkBeforeRB;
    RadioButton     aPgBrkAfterRB;
    CheckBox        aPageCollCB;
    ListBox         aPageCollLB;
    FixedText       aPageNoFT;
    NumericField    aPageNoNF;
    CheckBox        aKeepCB;
    CheckBox        aSplitCB;
    CheckBox        aHeadLineCB;

    GroupBox        aVertOrientGB;
    RadioButton     aTopRB;
    RadioButton     aCenterRB;
    RadioButton     aBottomRB;

    SwWrtShell*     pShell;

    BOOL            bPageBreak;
    BOOL            bHtmlMode;


    DECL_LINK( PageBreakHdl_Impl, CheckBox* );
    DECL_LINK( ApplyCollClickHdl_Impl, CheckBox* );
    DECL_LINK( PageBreakPosHdl_Impl, RadioButton* );
    DECL_LINK( PageBreakTypeHdl_Impl, RadioButton* );


    SwTextFlowPage( Window* pParent, const SfxItemSet& rSet );
    ~SwTextFlowPage();

public:
    static SfxTabPage*  Create( Window* pParent, const SfxItemSet& rAttrSet);
    virtual BOOL        FillItemSet( SfxItemSet& rSet );
    virtual void        Reset( const SfxItemSet& rSet );

    void                SetShell(SwWrtShell* pSh);

    void                DisablePageBreak();
};

#endif
diff --git a/sw/source/ui/table/tautofmt.cxx b/sw/source/ui/table/tautofmt.cxx
new file mode 100644
index 0000000..08814d4
--- /dev/null
+++ b/sw/source/ui/table/tautofmt.cxx
@@ -0,0 +1,1888 @@
/*************************************************************************
 *
 *  $RCSfile: tautofmt.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:48 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop


#ifndef _EDIT_HXX //autogen
#include <vcl/edit.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _ZFORLIST_HXX //autogen
#include <svtools/zforlist.hxx>
#endif
#ifndef _SV_SYSTEM_HXX //autogen
#include <vcl/system.hxx>
#endif


#ifndef _UIPARAM_HXX
#include <uiparam.hxx>
#endif
#include "swtypes.hxx"
#include "view.hxx"
#include "wrtsh.hxx"
#include "tblafmt.hxx"
#include "tautofmt.hxx"
#include "shellres.hxx"
#include "tautofmt.hrc"

#define FRAME_OFFSET 4

//========================================================================

class AutoFmtPreview : public Window
{
public:
            AutoFmtPreview( Window* pParent, const ResId& rRes );
            ~AutoFmtPreview();

    void NotifyChange( const SwTableAutoFmt& rNewData );

protected:
    virtual void Paint( const Rectangle& rRect );

private:
    SwTableAutoFmt      aCurData;
    VirtualDevice       aVD;
    BOOL                bFitWidth;
    static BYTE         aFmtMap[25];        // Zuordnung: Zelle->Format
    Rectangle           aCellArray[25];     // Position und Groesse der Zellen
    SvxBoxItem*         aLinePtrArray[49];  // LinienAttribute
    Size                aPrvSize;
    const USHORT        nLabelColWidth;
    const USHORT        nDataColWidth1;
    const USHORT        nDataColWidth2;
    const USHORT        nRowHeight;
    const String        aStrJan;
    const String        aStrFeb;
    const String        aStrMar;
    const String        aStrNorth;
    const String        aStrMid;
    const String        aStrSouth;
    const String        aStrSum;
    SvNumberFormatter*  pNumFmt;
    //-------------------------------------------
    void    Init            ();
    void    DoPaint         ( const Rectangle& rRect );
    void    CalcCellArray   ( BOOL bFitWidth );
    void    CalcLineMap     ();
    void    PaintCells      ();
    void    DrawBackground  ( BYTE nIndex );
    void    DrawFrame       ( BYTE nIndex );
    void    DrawString      ( BYTE nIndex );
    void    MakeFont        ( BYTE nIndex, Font& rFont );
    String  MakeNumberString( String cellString, BOOL bAddDec );
    void    DrawFrameLine   ( const SvxBorderLine&  rLineD,
                              Point                 from,
                              Point                 to,
                              BOOL                  bHorizontal,
                              const SvxBorderLine&  rLineLT,
                              const SvxBorderLine&  rLineL,
                              const SvxBorderLine&  rLineLB,
                              const SvxBorderLine&  rLineRT,
                              const SvxBorderLine&  rLineR,
                              const SvxBorderLine&  rLineRB );
    void    CheckPriority   ( USHORT            nCurLine,
                              AutoFmtLine       eLine,
                              SvxBorderLine&    rLine );
    void    GetLines        ( BYTE nIndex, AutoFmtLine eLine,
                              SvxBorderLine&    rLineD,
                              SvxBorderLine&    rLineLT,
                              SvxBorderLine&    rLineL,
                              SvxBorderLine&    rLineLB,
                              SvxBorderLine&    rLineRT,
                              SvxBorderLine&    rLineR,
                              SvxBorderLine&    rLineRB );
};

//========================================================================

struct SwLineStruct
{
    short nLeft;  //Breite der linken Linie
    short nMiddle;//Breite des Zwischenraums
    short nRight; //Breite der rechten Linie
};

void lcl_SwLinkLine( const SwLineStruct& dLine,
                        const SwLineStruct& ltLine,
                        const SwLineStruct& lLine,
                        const SwLineStruct& lbLine,
                        const SwLineStruct& rtLine,
                        const SwLineStruct& rLine,
                        const SwLineStruct& rbLine,
                        short* dxArr);

//SC-Produkt!
BOOL lcl_HasPriority(   const SvxBorderLine* pThis,
                        const SvxBorderLine* pOther );

//------------------------------------------------------------------------

class SwStringInputDlg : public ModalDialog
{
public:
            SwStringInputDlg(     Window* pParent,
                            const String& rTitle,
                            const String& rEditTitle,
                            const String& rDefault );
            ~SwStringInputDlg();

    void GetInputString( String& rString ) const;

private:
    Edit            aEdInput;   // Edit erhaelt so den Focus
    FixedText       aFtEditTitle;
    OKButton        aBtnOk;
    CancelButton    aBtnCancel;
};


BYTE AutoFmtPreview::aFmtMap[] = { 0,  1,  2,  1,  3, // Zuordnung:
                                   4,  5,  6,  5,  7, // Zelle->Format
                                   8,  9, 10,  9, 11,
                                   4,  5,  6,  5,  7,
                                  12, 13, 14, 13, 15  };




SwStringInputDlg::SwStringInputDlg( Window*         pParent,
                                    const String&   rTitle,
                                    const String&   rEditTitle,
                                    const String&   rDefault    ) :
    ModalDialog     ( pParent, SW_RES( DLG_SWDLG_STRINPUT ) ),
    //
    aEdInput        ( this, SW_RES( ED_INPUT ) ),
    aBtnOk          ( this, SW_RES( BTN_OK ) ),
    aBtnCancel      ( this, SW_RES( BTN_CANCEL ) ),
    aFtEditTitle    ( this, SW_RES( FT_LABEL ) )
{
    SetText( rTitle );
    aFtEditTitle.SetText( rEditTitle );
    aEdInput.SetText( rDefault );
    //-------------
    FreeResource();
}

//------------------------------------------------------------------------

void SwStringInputDlg::GetInputString( String& rString ) const
{
    rString = aEdInput.GetText();
}


__EXPORT SwStringInputDlg::~SwStringInputDlg()
{
}

//========================================================================
// AutoFormat-Dialog:


SwAutoFormatDlg::SwAutoFormatDlg( Window* pParent, SwWrtShell* pWrtShell,
                    BOOL bSetAutoFormat, const SwTableAutoFmt* pSelFmt )
    : SfxModalDialog( pParent, SW_RES( DLG_AUTOFMT_TABLE ) ),
    //
    aFtFormat       ( this, SW_RES( FT_FORMAT ) ),
    aLbFormat       ( this, SW_RES( LB_FORMAT ) ),
    aGbPreview      ( this, SW_RES( GB_PREVIEW ) ),
    pWndPreview     ( new AutoFmtPreview( this, SW_RES( WND_PREVIEW ) ) ),
    aBtnNumFormat   ( this, SW_RES( BTN_NUMFORMAT ) ),
    aBtnBorder      ( this, SW_RES( BTN_BORDER ) ),
    aBtnFont        ( this, SW_RES( BTN_FONT ) ),
    aBtnPattern     ( this, SW_RES( BTN_PATTERN ) ),
    aBtnAlignment   ( this, SW_RES( BTN_ALIGNMENT ) ),
    aGbFormat       ( this, SW_RES( GB_FORMAT ) ),
    aBtnOk          ( this, SW_RES( BTN_OK ) ),
    aBtnCancel      ( this, SW_RES( BTN_CANCEL ) ),
    aBtnHelp        ( this, SW_RES( BTN_HELP ) ),
    aBtnAdd         ( this, SW_RES( BTN_ADD ) ),
    aBtnRemove      ( this, SW_RES( BTN_REMOVE ) ),
    aBtnMore        ( this, SW_RES( BTN_MORE ) ),
    aBtnRename      ( this, SW_RES( BTN_RENAME ) ),
    aStrTitle       ( SW_RES( STR_ADD_TITLE ) ),
    aStrLabel       ( SW_RES( STR_ADD_LABEL ) ),
    aStrClose       ( SW_RES( STR_BTN_CLOSE ) ),
    aStrDelTitle    ( SW_RES( STR_DEL_TITLE ) ),
    aStrDelMsg      ( SW_RES( STR_DEL_MSG ) ),
    aStrRenameTitle ( SW_RES( STR_RENAME_TITLE ) ),
    aStrInvalidFmt  ( SW_RES( STR_INVALID_AFNAME )),
    //
    nIndex          ( 0 ),
    nDfltStylePos   ( 0 ),
    bCoreDataChanged( FALSE ),
    bSetAutoFmt     ( bSetAutoFormat ),
    pShell          ( pWrtShell )
{
    pTableTbl = new SwTableAutoFmtTbl;
    pTableTbl->Load();

    Init( pSelFmt );
    //------------- >
    FreeResource();
}

//------------------------------------------------------------------------


__EXPORT SwAutoFormatDlg::~SwAutoFormatDlg()
{
    delete pWndPreview;

    if( bCoreDataChanged )
        pTableTbl->Save();
    delete pTableTbl;
}

//------------------------------------------------------------------------


void SwAutoFormatDlg::Init( const SwTableAutoFmt* pSelFmt )
{
    Link aLk( LINK( this, SwAutoFormatDlg, CheckHdl ) );
    aBtnBorder.SetClickHdl( aLk );
    aBtnFont.SetClickHdl( aLk );
    aBtnPattern.SetClickHdl( aLk );
    aBtnAlignment.SetClickHdl( aLk );
    aBtnNumFormat.SetClickHdl( aLk );

    aBtnAdd.SetClickHdl ( LINK( this, SwAutoFormatDlg, AddHdl ) );
    aBtnRemove.SetClickHdl ( LINK( this, SwAutoFormatDlg, RemoveHdl ) );
    aBtnRename.SetClickHdl ( LINK( this, SwAutoFormatDlg, RenameHdl ) );
    aBtnOk.SetClickHdl ( LINK( this, SwAutoFormatDlg, OkHdl ) );
    aLbFormat.SetSelectHdl( LINK( this, SwAutoFormatDlg, SelFmtHdl ) );

    aBtnMore.AddWindow( &aBtnNumFormat );
    aBtnMore.AddWindow( &aBtnBorder );
    aBtnMore.AddWindow( &aBtnFont );
    aBtnMore.AddWindow( &aBtnPattern );
    aBtnMore.AddWindow( &aBtnAlignment );
    aBtnMore.AddWindow( &aGbFormat );
    aBtnMore.AddWindow( &aBtnRename );

    aBtnAdd.Enable( bSetAutoFmt );

    nIndex = 0;
    if( !bSetAutoFmt )
    {
        // dann muss die Liste um den Eintrag <Keins> erweitert werden.
        aLbFormat.InsertEntry( ViewShell::GetShellRes()->aStrNone );
        nDfltStylePos = 1;
        nIndex = 255;
    }

    for( BYTE i = 0, nCount = (BYTE)pTableTbl->Count(); i < nCount; i++ )
    {
        SwTableAutoFmt* pFmt = (*pTableTbl)[ i ];
        aLbFormat.InsertEntry( pFmt->GetName() );
        if( pSelFmt && pFmt->GetName() == pSelFmt->GetName() )
            nIndex = i;
    }

    aLbFormat.SelectEntryPos( 255 != nIndex ? (nDfltStylePos + nIndex) : 0 );
    SelFmtHdl( 0 );
}

//------------------------------------------------------------------------


void SwAutoFormatDlg::UpdateChecks( const SwTableAutoFmt& rFmt, BOOL bEnable )
{
    aBtnNumFormat.Enable( bEnable );
    aBtnNumFormat.Check( rFmt.IsValueFormat() );

    aBtnBorder.Enable( bEnable );
    aBtnBorder.Check( rFmt.IsFrame() );

    aBtnFont.Enable( bEnable );
    aBtnFont.Check( rFmt.IsFont() );

    aBtnPattern.Enable( bEnable );
    aBtnPattern.Check( rFmt.IsBackground() );

    aBtnAlignment.Enable( bEnable );
    aBtnAlignment.Check( rFmt.IsJustify() );
}

void SwAutoFormatDlg::FillAutoFmtOfIndex( SwTableAutoFmt*& rToFill ) const
{
    if( 255 != nIndex )
    {
        if( rToFill )
            *rToFill = *(*pTableTbl)[ nIndex ];
        else
            rToFill = new SwTableAutoFmt( *(*pTableTbl)[ nIndex ] );
    }
    else if( rToFill )
        delete rToFill, rToFill = 0;
}


/*------------------------------------------------------------------------
  Handler:
  ---------*/


IMPL_LINK( SwAutoFormatDlg, CheckHdl, Button *, pBtn )
{
    SwTableAutoFmtPtr pData  = (*pTableTbl)[nIndex];
    BOOL bCheck = ((CheckBox*)pBtn)->IsChecked(), bDataChgd = TRUE;

    if( pBtn == &aBtnNumFormat )
        pData->SetValueFormat( bCheck );
    else if ( pBtn == &aBtnBorder )
        pData->SetFrame( bCheck );
    else if ( pBtn == &aBtnFont )
        pData->SetFont( bCheck );
    else if ( pBtn == &aBtnPattern )
        pData->SetBackground( bCheck );
    else if ( pBtn == &aBtnAlignment )
        pData->SetJustify( bCheck );
//    else if ( pBtn == &aBtnAdjust )
//        pData->SetIncludeWidthHeight( bCheck );
    else
        bDataChgd = FALSE;

    if( bDataChgd )
    {
        if( !bCoreDataChanged )
        {
            aBtnCancel.SetText( aStrClose );
            bCoreDataChanged = TRUE;
        }

        pWndPreview->NotifyChange( *pData );
    }
    return 0;
}

/*------------------------------------------------------------------------*/


IMPL_LINK( SwAutoFormatDlg, AddHdl, void *, EMPTYARG )
{
    BOOL bOk = FALSE, bFmtInserted = FALSE;
    while( !bOk )
    {
        SwStringInputDlg*   pDlg = new SwStringInputDlg( this,
                                                            aStrTitle,
                                                            aStrLabel,
                                                            aEmptyStr );
        if( RET_OK == pDlg->Execute() )
        {
            String aFormatName;
            pDlg->GetInputString( aFormatName );

            if( aFormatName.Len() > 0 )
            {
                for( USHORT n = 0; n < pTableTbl->Count(); ++n )
                    if( (*pTableTbl)[n]->GetName() == aFormatName )
                        break;

                if( n >= pTableTbl->Count() )
                {
                    // Format mit dem Namen noch nicht vorhanden, also
                    // aufnehmen
                    SwTableAutoFmtPtr pNewData = new
                                        SwTableAutoFmt( aFormatName );
                    pShell->GetTableAutoFmt( *pNewData );

                    // Sortiert einfuegen!!
                    for( n = 1; n < pTableTbl->Count(); ++n )
                        if( (*pTableTbl)[ n ]->GetName() > aFormatName )
                            break;

                    pTableTbl->Insert( pNewData, n );
                    aLbFormat.InsertEntry( aFormatName, nDfltStylePos + n );
                    aLbFormat.SelectEntryPos( nDfltStylePos + n );
                    bFmtInserted = TRUE;
                    aBtnAdd.Enable( FALSE );
                    if ( !bCoreDataChanged )
                    {
                        aBtnCancel.SetText( aStrClose );
                        bCoreDataChanged = TRUE;
                    }

                    SelFmtHdl( 0 );
                    bOk = TRUE;
                }
            }

            if( !bFmtInserted )
            {
                bOk = RET_CANCEL == ErrorBox( this,
                                    WinBits( WB_OK_CANCEL | WB_DEF_OK),
                                    aStrInvalidFmt
                                    ).Execute();
            }
        }
        else
            bOk = TRUE;
        delete pDlg;
    }
    return 0;
}

//------------------------------------------------------------------------

IMPL_LINK( SwAutoFormatDlg, RemoveHdl, void *, EMPTYARG )
{
    String aMessage = aStrDelMsg ;
    aMessage.AppendAscii("\n\n");
    aMessage += aLbFormat.GetSelectEntry() ;
    aMessage += '\n';

    MessBox* pBox = new MessBox( this, WinBits( WB_OK_CANCEL ),
                                    aStrDelTitle, aMessage);

    if ( pBox->Execute() == RET_OK )
    {
        aLbFormat.RemoveEntry( nDfltStylePos + nIndex );
        aLbFormat.SelectEntryPos( nDfltStylePos + nIndex-1 );

        pTableTbl->DeleteAndDestroy( nIndex );
        nIndex--;

        if( !nIndex )
        {
            aBtnRemove.Enable(FALSE);
            aBtnRename.Enable(FALSE);
        }

        if( !bCoreDataChanged )
        {
            aBtnCancel.SetText( aStrClose );
            bCoreDataChanged = TRUE;
        }
    }
    delete pBox;

    SelFmtHdl( 0 );

    return 0;
}

IMPL_LINK( SwAutoFormatDlg, RenameHdl, void *, EMPTYARG )
{
    BOOL bOk = FALSE;
    while( !bOk )
    {
        SwStringInputDlg* pDlg = new SwStringInputDlg( this,
                        aStrRenameTitle, aLbFormat.GetSelectEntry(),
                                                        aEmptyStr );
        if( pDlg->Execute() == RET_OK )
        {
            BOOL bFmtRenamed = FALSE;
            String aFormatName;
            pDlg->GetInputString( aFormatName );

            if ( aFormatName.Len() > 0 )
            {
                for( USHORT n = 0; n < pTableTbl->Count(); ++n )
                    if ((*pTableTbl)[n]->GetName() == aFormatName)
                        break;

                if( n >= pTableTbl->Count() )
                {
                    // Format mit dem Namen noch nicht vorhanden, also
                    // umbenennen

                    aLbFormat.RemoveEntry( nDfltStylePos + nIndex );
                    SwTableAutoFmtPtr p = (*pTableTbl)[ nIndex ];
                    pTableTbl->Remove( nIndex );

                    p->SetName( aFormatName );

                    // Sortiert einfuegen!!
                    for( n = 1; n < pTableTbl->Count(); ++n )
                        if( (*pTableTbl)[ n ]->GetName() > aFormatName )
                            break;

                    pTableTbl->Insert( p, n );
                    aLbFormat.InsertEntry( aFormatName, nDfltStylePos + n );
                    aLbFormat.SelectEntryPos( nDfltStylePos + n );

                    if ( !bCoreDataChanged )
                    {
                        aBtnCancel.SetText( aStrClose );
                        bCoreDataChanged = TRUE;
                    }

                    SelFmtHdl( 0 );
                    bOk = TRUE;
                    bFmtRenamed = TRUE;
                }
            }

            if( !bFmtRenamed )
            {
                bOk = RET_CANCEL == ErrorBox( this,
                                    WinBits( WB_OK_CANCEL | WB_DEF_OK),
                                    aStrInvalidFmt
                                    ).Execute();
            }
        }
        else
            bOk = TRUE;
        delete pDlg;
    }
    return 0;
}

//------------------------------------------------------------------------

IMPL_LINK( SwAutoFormatDlg, SelFmtHdl, void *, EMPTYARG )
{
    BOOL bBtnEnable = FALSE;
    BYTE nSelPos = (BYTE) aLbFormat.GetSelectEntryPos(), nOldIdx = nIndex;
    if( nSelPos >= nDfltStylePos )
    {
        nIndex = nSelPos - nDfltStylePos;
        pWndPreview->NotifyChange( *(*pTableTbl)[nIndex] );
        bBtnEnable = 0 != nIndex;
        UpdateChecks( *(*pTableTbl)[nIndex], TRUE );
    }
    else
    {
        nIndex = 255;

        SwTableAutoFmt aTmp( ViewShell::GetShellRes()->aStrNone );
        aTmp.SetFont( FALSE );
        aTmp.SetJustify( FALSE );
        aTmp.SetFrame( FALSE );
        aTmp.SetBackground( FALSE );
        aTmp.SetValueFormat( FALSE );
        aTmp.SetWidthHeight( FALSE );

        if( nOldIdx != nIndex )
            pWndPreview->NotifyChange( aTmp );
        UpdateChecks( aTmp, FALSE );
    }

    aBtnRemove.Enable( bBtnEnable );
    aBtnRename.Enable( bBtnEnable );

    return 0;
}
//------------------------------------------------------------------------

IMPL_LINK_INLINE_START( SwAutoFormatDlg, OkHdl, Button *, EMPTYARG )
{
    if( bSetAutoFmt )
        pShell->SetTableAutoFmt( *(*pTableTbl)[ nIndex ] );
    EndDialog( RET_OK );
    return TRUE;
}
IMPL_LINK_INLINE_END( SwAutoFormatDlg, OkHdl, Button *, EMPTYARG )

//========================================================================
// AutoFmtPreview

//------------------------------------------------------------------------

AutoFmtPreview::AutoFmtPreview( Window* pParent, const ResId& rRes ) :
        Window          ( pParent, rRes ),
        aVD             ( *this ),
        aCurData        ( aEmptyStr ),
        bFitWidth       ( FALSE ),
        aStrJan         ( SW_RES( STR_JAN ) ),
        aStrFeb         ( SW_RES( STR_FEB ) ),
        aStrMar         ( SW_RES( STR_MAR ) ),
        aStrNorth       ( SW_RES( STR_NORTH ) ),
        aStrMid         ( SW_RES( STR_MID ) ),
        aStrSouth       ( SW_RES( STR_SOUTH ) ),
        aStrSum         ( SW_RES( STR_SUM ) ),
        aPrvSize        ( GetSizePixel().Width()  - 6,
                          GetSizePixel().Height() - 30 ),
        nLabelColWidth  ( (USHORT)(((aPrvSize.Width()-4)/4)-12) ),
        nDataColWidth1  ( (USHORT)(((aPrvSize.Width()-4)-(nLabelColWidth*2)) / 3) ),
        nDataColWidth2  ( (USHORT)(((aPrvSize.Width()-4)-(nLabelColWidth*2)) / 4) ),
        nRowHeight      ( (USHORT)((aPrvSize.Height()-4) / 5) ),
        pNumFmt         ( new SvNumberFormatter( LANGUAGE_SYSTEM ) )
{
    Init();
}

//------------------------------------------------------------------------

__EXPORT AutoFmtPreview::~AutoFmtPreview()
{
    for ( USHORT i=0; i<=35; i++ )
    {
        delete aLinePtrArray[i];
    }
    delete pNumFmt;
}

//------------------------------------------------------------------------

void lcl_AssignLine( SvxBorderLine&       dest,
                        const SvxBorderLine* src )
{
    if( src )
    {
        dest.SetColor( src->GetColor() );
        dest.SetOutWidth( src->GetOutWidth() );
        dest.SetInWidth( src->GetInWidth() );
        dest.SetDistance( src->GetDistance() );
    }
    else
    {
        dest.SetColor( Color( COL_WHITE ) );
        dest.SetOutWidth ( 0 );
        dest.SetInWidth  ( 0 );
        dest.SetDistance ( 0 );
    }
}

//------------------------------------------------------------------------

void lcl_GetLineStruct( SwLineStruct&        rLine,
                        const SvxBorderLine& rBoxLine )
{
    if ( rBoxLine.GetOutWidth() > 0 )
    {
        rLine.nLeft     = rBoxLine.GetOutWidth();
        rLine.nMiddle   = rBoxLine.GetDistance();
        rLine.nRight    = rBoxLine.GetInWidth();

        /* Linienstaerke auf dick/duenn abbilden:
         *
         * (in TWIPS, 1pt = 20 TWIPS = duenn)
         * alles was <=0  ist -> (0,0,0)
         * alles was <=20 ist -> (1,0,0)/(1,1,1)
         * alles andere       -> (3,0,0)/(2,1,2)
         */

        if ( rLine.nMiddle == 0 ) // einfache Linie?
        {
            rLine.nRight = 0; // sicher ist sicher

            if ( rLine.nLeft <= 20 )
            {
                rLine.nLeft = 1;
            }
            else if ( rLine.nLeft > 20 )
            {
                rLine.nLeft = 3;
            }
        }
        else // doppelte Linie
        {
            rLine.nMiddle = 1;
            if ( rLine.nLeft <= 20 )
            {
                rLine.nLeft = rLine.nRight = 1;
            }
            else if ( rLine.nLeft > 20 )
            {
                rLine.nLeft = rLine.nRight = 2;
            }
        }
    }
    else
    {
        rLine.nLeft     = 0;
        rLine.nMiddle   = 0;
        rLine.nRight    = 0;
    }
}

//------------------------------------------------------------------------

void AutoFmtPreview::CheckPriority( USHORT          nCurLine,
                                    AutoFmtLine     eLine,
                                    SvxBorderLine&  rLine )
{

     const SvxBorderLine*    pDrawLine;
    USHORT                  nOther = 0;

    switch ( eLine )
    {
        case TOP_LINE:
            {
                lcl_AssignLine( rLine, aLinePtrArray[nCurLine]->GetTop() );
                nOther = nCurLine-7;
                pDrawLine = aLinePtrArray[nOther]->GetBottom();

                if ( lcl_HasPriority( pDrawLine, &rLine ) )
                    lcl_AssignLine( rLine, pDrawLine );
            }
            break;

        case BOTTOM_LINE:
            {
                lcl_AssignLine( rLine, aLinePtrArray[nCurLine]->GetBottom() );
                nOther = nCurLine+7;
                pDrawLine = aLinePtrArray[nOther]->GetTop();

                if ( lcl_HasPriority( pDrawLine, &rLine ) )
                    lcl_AssignLine( rLine, pDrawLine );
            }
            break;

        case LEFT_LINE:
            {
                lcl_AssignLine( rLine, aLinePtrArray[nCurLine]->GetLeft() );
                nOther = nCurLine-1;
                pDrawLine = aLinePtrArray[nOther]->GetRight();

                if ( lcl_HasPriority( pDrawLine, &rLine ) )
                    lcl_AssignLine( rLine, pDrawLine );
            }
            break;

        case RIGHT_LINE:
            {
                lcl_AssignLine( rLine, aLinePtrArray[nCurLine]->GetRight() );
                nOther = nCurLine+1;
                pDrawLine = aLinePtrArray[nOther]->GetLeft();

                if ( lcl_HasPriority( pDrawLine, &rLine ) )
                    lcl_AssignLine( rLine, pDrawLine );
            }
            break;
    }

}

//------------------------------------------------------------------------

void AutoFmtPreview::GetLines( BYTE nIndex, AutoFmtLine eLine,
                               SvxBorderLine&   rLineD,
                               SvxBorderLine&   rLineLT,
                               SvxBorderLine&   rLineL,
                               SvxBorderLine&   rLineLB,
                               SvxBorderLine&   rLineRT,
                               SvxBorderLine&   rLineR,
                               SvxBorderLine&   rLineRB )
{
    {
        SvxBorderLine aNullLine;

        lcl_AssignLine( rLineD,  &aNullLine);
        lcl_AssignLine( rLineLT, &aNullLine);
        lcl_AssignLine( rLineL,  &aNullLine);
        lcl_AssignLine( rLineLB, &aNullLine);
        lcl_AssignLine( rLineRT, &aNullLine);
        lcl_AssignLine( rLineR,  &aNullLine);
        lcl_AssignLine( rLineRB, &aNullLine);
    }

    USHORT  nCurLine   = nIndex + 8 + ((nIndex/5)*2);
    USHORT  nOther     = 0;

    switch ( eLine )
    {
        case TOP_LINE:
            {
                // obere Linien werden nur in der
                // ersten Zeile gemalt:
                if ( (nIndex >= 0) && (nIndex <= 4) )
                {
                    // links
                    CheckPriority( nCurLine, eLine, rLineD );
                    nOther = nCurLine-7;
                    CheckPriority( nOther, LEFT_LINE, rLineLT );
                    nOther = nCurLine-1;
                    CheckPriority( nOther, TOP_LINE, rLineL );
                    CheckPriority( nCurLine, LEFT_LINE, rLineLB );
                    // rechts
                    nOther = nCurLine-7;
                    CheckPriority( nOther, RIGHT_LINE, rLineRT );
                    nOther = nCurLine+1;
                    CheckPriority( nOther, TOP_LINE, rLineR );
                    CheckPriority( nCurLine, RIGHT_LINE, rLineRB );
                }
            }
            break;

        case BOTTOM_LINE:
            {
                // links
                CheckPriority( nCurLine, eLine, rLineD );
                CheckPriority( nCurLine, LEFT_LINE, rLineLT );
                nOther = nCurLine-1;
                CheckPriority( nOther, BOTTOM_LINE, rLineL );
                nOther = nCurLine+7;
                CheckPriority( nOther, LEFT_LINE, rLineLB );
                // rechts
                CheckPriority( nCurLine, RIGHT_LINE, rLineRT );
                nOther = nCurLine+1;
                CheckPriority( nOther, BOTTOM_LINE, rLineR );
                nOther = nCurLine+7;
                CheckPriority( nOther, RIGHT_LINE, rLineRB );
            }
            break;

        case LEFT_LINE:
            {
                // linke Linien werden nur in der
                // ersten Spalte gemalt:
                if ( (nIndex%5) == 0 )
                {
                    // oben
                    CheckPriority( nCurLine, eLine, rLineD );
                    CheckPriority( nCurLine, TOP_LINE, rLineLT );
                    nOther = nCurLine-7;
                    CheckPriority( nOther, LEFT_LINE, rLineL );
                    nOther = nCurLine-1;
                    CheckPriority( nOther, TOP_LINE, rLineLB );
                    // unten
                    CheckPriority( nCurLine, BOTTOM_LINE, rLineRT );
                    nOther = nCurLine+7;
                    CheckPriority( nOther, LEFT_LINE, rLineR );
                    nOther = nCurLine-1;
                    CheckPriority( nOther, BOTTOM_LINE, rLineRB );
                }
            }
            break;

        case RIGHT_LINE:
            {
                // oben
                CheckPriority( nCurLine, eLine, rLineD );
                nOther = nCurLine+1;
                CheckPriority( nOther, TOP_LINE, rLineLT );
                nOther = nCurLine-7;
                CheckPriority( nOther, RIGHT_LINE, rLineL );
                CheckPriority( nCurLine, TOP_LINE, rLineLB );
                // unten
                nOther = nCurLine+1;
                CheckPriority( nOther, BOTTOM_LINE, rLineRT );
                nOther = nCurLine+7;
                CheckPriority( nOther, RIGHT_LINE, rLineR );
                CheckPriority( nCurLine, BOTTOM_LINE, rLineRB );
            }
            break;
    }
}

//------------------------------------------------------------------------

void AutoFmtPreview::DrawFrameLine( const SvxBorderLine&    rLineD,
                                    Point                   from,
                                    Point                   to,
                                    BOOL                    bHorizontal,
                                    const SvxBorderLine&    rLineLT,
                                    const SvxBorderLine&    rLineL,
                                    const SvxBorderLine&    rLineLB,
                                    const SvxBorderLine&    rLineRT,
                                    const SvxBorderLine&    rLineR,
                                    const SvxBorderLine&    rLineRB )
{
    SwLineStruct    dLine;
    SwLineStruct    ltLine;
    SwLineStruct    lLine;
    SwLineStruct    lbLine;
    SwLineStruct    rtLine;
    SwLineStruct    rLine;
    SwLineStruct    rbLine;
    short           dxArr[4];

    lcl_GetLineStruct( dLine,   rLineD  );
    lcl_GetLineStruct( ltLine,  rLineLT );
    lcl_GetLineStruct( lLine,   rLineL  );
    lcl_GetLineStruct( lbLine,  rLineLB );
    lcl_GetLineStruct( rtLine,  rLineRT );
    lcl_GetLineStruct( rLine,   rLineR  );
    lcl_GetLineStruct( rbLine,  rLineRB );

    if ( dLine.nLeft > 0 )
    {
        Color   oldColor     = aVD.GetLineColor();
        aVD.SetLineColor( Color(COL_TRANSPARENT) );
        Color oldFillColor = aVD.GetFillColor();
        aVD.SetFillColor( rLineD.GetColor() );
        USHORT  nHeight  = dLine.nLeft + dLine.nMiddle + dLine.nRight;
        Point   from2    = from;
        Point   to2      = to;

        lcl_SwLinkLine( dLine,
                    ltLine, lLine, lbLine,
                    rtLine, rLine, rbLine,
                    dxArr );

        if ( bHorizontal )
        {
            from.Y() -= nHeight/2;
            to.Y()   -= nHeight/2;
            to.Y()   += (dLine.nLeft-1);

            from.X() += dxArr[0];
            to.X()   += dxArr[2];

            aVD.DrawRect( Rectangle( from, to ) );

            // noch eine zweite Linie zu malen?
            if ( dLine.nRight != 0 )
            {
                from2.Y() -= nHeight/2;
                from2.Y() += dLine.nLeft+dLine.nMiddle;
                to2.Y()   -= nHeight/2;
                to2.Y()   += dLine.nMiddle+dLine.nLeft;
                to2.Y()   += (dLine.nRight-1);

                from2.X() += dxArr[1];
                to2.X()   += dxArr[3];

                aVD.DrawRect( Rectangle( from2, to2 ) );
            }
        }
        else
        {
            from.X() += nHeight/2;
            from.X() -= (dLine.nLeft-1);
            to.X()   += nHeight/2;

            from.Y() += dxArr[0];
            to.Y()   += dxArr[2];

            aVD.DrawRect( Rectangle( from, to ) );

            // noch eine zweite Linie zu malen?
            if ( dLine.nRight != 0 )
            {
                from2.X() -= nHeight/2;
                to2.X()   -= nHeight/2;
                to2.X()   += (dLine.nRight-1);

                from2.Y() += dxArr[1];
                to2.Y()   += dxArr[3];

                aVD.DrawRect( Rectangle( from2, to2 ) );
            }
        }
        aVD.SetFillColor( oldFillColor );
        aVD.SetLineColor( oldColor );
    }
}

//------------------------------------------------------------------------

void AutoFmtPreview::DrawFrame( BYTE nIndex )
{
    //----------------------
    // Malen des Zellrahmens
    //----------------------

    SvxBorderLine   aLineD;
    SvxBorderLine   aLineLT;
    SvxBorderLine   aLineL;
    SvxBorderLine   aLineLB;
    SvxBorderLine   aLineRT;
    SvxBorderLine   aLineR;
    SvxBorderLine   aLineRB;
    Rectangle&      cellRect = aCellArray[nIndex];

    //---------
    // TopLine ---------------------------------------------
    //---------
    GetLines( nIndex, TOP_LINE, aLineD,
                aLineLT, aLineL, aLineLB,
                aLineRT, aLineR, aLineRB );

    DrawFrameLine( aLineD,
                    cellRect.TopLeft(), cellRect.TopRight(), TRUE,
                    aLineLT,  aLineL, aLineLB,
                    aLineRT,  aLineR, aLineRB );

    //------------
    // BottomLine ------------------------------------------
    //------------
    GetLines( nIndex, BOTTOM_LINE, aLineD,
                aLineLT, aLineL, aLineLB,
                aLineRT, aLineR, aLineRB );

    DrawFrameLine( aLineD,
                    cellRect.BottomLeft(), cellRect.BottomRight(), TRUE,
                    aLineLT,  aLineL, aLineLB,
                    aLineRT,  aLineR, aLineRB );

    //----------
    // LeftLine --------------------------------------------
    //----------
    GetLines( nIndex, LEFT_LINE, aLineD,
                aLineLT, aLineL, aLineLB,
                aLineRT, aLineR, aLineRB );

    DrawFrameLine( aLineD,
                    cellRect.TopLeft(), cellRect.BottomLeft(), FALSE,
                    aLineLT,  aLineL, aLineLB,
                    aLineRT,  aLineR, aLineRB );

    //-----------
    // RightLine -------------------------------------------
    //-----------
    GetLines( nIndex, RIGHT_LINE, aLineD,
                aLineLT, aLineL, aLineLB,
                aLineRT, aLineR, aLineRB );

    DrawFrameLine( aLineD,
                    cellRect.TopRight(), cellRect.BottomRight(), FALSE,
                    aLineLT,  aLineL, aLineLB,
                    aLineRT,  aLineR, aLineRB );
}

//------------------------------------------------------------------------


void AutoFmtPreview::MakeFont( BYTE nIndex, Font& rFont )
{
    const SwBoxAutoFmt& rBoxFmt = aCurData.GetBoxFmt( nIndex );

    rFont = GetFont();

    const SvxFontItem& rFontItem = rBoxFmt.GetFont();
    rFont.SetFamily      ( rFontItem.GetFamily() );
    rFont.SetName        ( rFontItem.GetFamilyName() );
    rFont.SetStyleName   ( rFontItem.GetStyleName() );
    rFont.SetCharSet     ( rFontItem.GetCharSet() );
    rFont.SetPitch       ( rFontItem.GetPitch() );
    rFont.SetWeight      ( (FontWeight)rBoxFmt.GetWeight().GetValue() );
    rFont.SetUnderline   ( (FontUnderline)rBoxFmt.GetUnderline().GetValue() );
    rFont.SetStrikeout   ( (FontStrikeout)rBoxFmt.GetCrossedOut().GetValue() );
    rFont.SetItalic      ( (FontItalic)rBoxFmt.GetPosture().GetValue() );
    rFont.SetOutline     ( rBoxFmt.GetContour().GetValue() );
    rFont.SetShadow      ( rBoxFmt.GetShadowed().GetValue() );
    rFont.SetColor       ( rBoxFmt.GetColor().GetValue() );

    rFont.SetSize        ( Size( rFont.GetSize().Width(), 10 ) );
    rFont.SetTransparent ( TRUE );
}

//------------------------------------------------------------------------

void AutoFmtPreview::DrawString( BYTE nIndex )
{
    //------------------------
    // Ausgabe des Zelltextes:
    //------------------------
    ULONG   nNum;
    double  nVal;
    String cellString;
    switch( nIndex )
    {
        case  1: cellString = aStrJan;          break;
        case  2: cellString = aStrFeb;          break;
        case  3: cellString = aStrMar;          break;
        case  5: cellString = aStrNorth;        break;
        case 10: cellString = aStrMid;          break;
        case 15: cellString = aStrSouth;        break;
        case  4:
        case 20: cellString = aStrSum;          break;

        case  6:
        case  8:
        case 16:
        case 18:    nVal = nIndex;
                    nNum = 5;
                    goto MAKENUMSTR;
        case 17:
        case  7:    nVal = nIndex;
                    nNum = 6;
                    goto MAKENUMSTR;
        case 11:
        case 12:
        case 13:    nVal = nIndex;
                    nNum = 12 == nIndex ? 10 : 9;
                    goto MAKENUMSTR;

        case  9:    nVal = 21; nNum = 7;    goto MAKENUMSTR;
        case 14:    nVal = 36; nNum = 11;   goto MAKENUMSTR;
        case 19:    nVal = 51; nNum = 7;    goto MAKENUMSTR;
        case 21:    nVal = 33; nNum = 13;   goto MAKENUMSTR;
        case 22:    nVal = 36; nNum = 14;   goto MAKENUMSTR;
        case 23:    nVal = 39; nNum = 13;   goto MAKENUMSTR;
        case 24:    nVal = 108; nNum = 15;  goto MAKENUMSTR;
MAKENUMSTR:
            if( aCurData.IsValueFormat() )
            {
                String sFmt; LanguageType eLng, eSys;
                aCurData.GetBoxFmt( (BYTE)nNum ).GetValueFormat( sFmt, eLng, eSys );

                ULONG nKey = 0;
                if ( eLng == LANGUAGE_SYSTEM && eSys != ::GetSystemLanguage() )
                {
                    //  #53381# wenn System beim Speichern etwas anderes war,
                    //  muss konvertiert werden (geht nur mit eingebauten Formaten)
                    ULONG nOrig = pNumFmt->GetEntryKey( sFmt, eSys );
                    if ( nOrig != NUMBERFORMAT_ENTRY_NOT_FOUND )
                        nKey = pNumFmt->GetFormatForLanguageIfBuiltIn( nOrig, ::GetSystemLanguage() );
                }
                else    // sonst einfach suchen oder anlegen
                {
                    nKey = pNumFmt->GetEntryKey( sFmt, eLng );
                    if( NUMBERFORMAT_ENTRY_NOT_FOUND == nKey )
                    {
                        xub_StrLen nCheckPos;
                        short nType;
                        pNumFmt->PutEntry( sFmt, nCheckPos, nType, nKey, eLng );
                    }
                }
                Color* pDummy;
                pNumFmt->GetOutputString( nVal, nKey, cellString, &pDummy );
            }
            else
                cellString = (USHORT)nVal;
            break;

    }

    if( cellString.Len() )
    {
        Font                oldFont;
        Size                aStrSize;
        BYTE                nFmtIndex       = (BYTE) aFmtMap[nIndex];
        Rectangle&          cellRect        = aCellArray[nIndex];
        Point               aPos            = aCellArray[nIndex].TopLeft();
        USHORT              nRightX         = 0;
//            BOOL                bJustify        = aCurData.IsJustify();
//            ScHorJustifyAttr    aHorJustifyItem;
//          CellHorJustify    eJustification;

        Size theMaxStrSize( cellRect.GetWidth() - FRAME_OFFSET,
                            cellRect.GetHeight() - FRAME_OFFSET );
        if( aCurData.IsFont() )
        {
            Font aFont;
            MakeFont( nFmtIndex, aFont );
            oldFont = aVD.GetFont();
            aVD.SetFont( aFont );
        }
        aStrSize = Size(aVD.GetTextWidth( cellString ), aVD.GetTextHeight());

        if( aCurData.IsFont() &&
            theMaxStrSize.Height() < aStrSize.Height() )
        {
                // wenn der String in diesem Font nicht
                // in die Zelle passt, wird wieder der
                // Standard-Font genommen:
                aVD.SetFont( oldFont );
                aStrSize = Size(aVD.GetTextWidth( cellString ), aVD.GetTextHeight());
        }

        while( theMaxStrSize.Width() <= aStrSize.Width() &&
                cellString.Len() > 1 )
        {
//                  if( eJustification == SVX_HOR_JUSTIFY_RIGHT )
//                          cellString.Erase( 0, 1 );
//                  else
            cellString.Erase( cellString.Len() - 1 );
            aStrSize = Size(aVD.GetTextWidth( cellString ), aVD.GetTextHeight());
        }

        nRightX  = (USHORT)(  cellRect.GetWidth()
                                - aStrSize.Width()
                                - FRAME_OFFSET );
        //-------------
        // Ausrichtung:
        //-------------
        /*   if ( bJustify )
        {
            aCurData.GetHorJustify( nFmtIndex, aHorJustifyItem );
            eJustification = (CellHorJustify)aHorJustifyItem.GetValue();
        }
        else
        {
            eJustification = SC_HOR_JUSTIFY_STANDARD;
        }*/

        //-----------------------------
        // vertikal (immer zentrieren):
        //-----------------------------
        aPos.Y() += (nRowHeight - (USHORT)aStrSize.Height()) / 2;

        //-----------
        // horizontal
        //-----------
/*        if ( eJustification != SC_HOR_JUSTIFY_STANDARD )*/
        if (aCurData.IsJustify())
        {
            USHORT nHorPos = (USHORT)
                    ((cellRect.GetWidth()-aStrSize.Width())/2);
            const SvxAdjustItem& rAdj = aCurData.GetBoxFmt(nFmtIndex).GetAdjust();
            switch ( rAdj.GetAdjust() )
            {
                case SVX_ADJUST_LEFT:
                    aPos.X() += FRAME_OFFSET;
                    break;
                case SVX_ADJUST_RIGHT:
                    aPos.X() += nRightX;
                    break;
                default:
                    aPos.X() += nHorPos;
                    break;
            }
        }
        else
        {
            //---------------------
            // Standardausrichtung:
            //---------------------
            if ( ((nIndex%5) == 0) || (nIndex == 4) )
            {
                // Text-Label links oder Summe linksbuendig
                aPos.X() += FRAME_OFFSET;
            }
            else
            {
                    // Zahlen/Datum rechtsbuendig
                aPos.X() += nRightX;
            }
        }

        //-------------------------------
        aVD.DrawText( aPos, cellString );
        //-------------------------------

        if ( aCurData.IsFont() )
            aVD.SetFont( oldFont );
    }
}

#undef FRAME_OFFSET

//------------------------------------------------------------------------


void AutoFmtPreview::DrawBackground( BYTE nIndex )
{
    SvxBrushItem aBrushItem( aCurData.GetBoxFmt( aFmtMap[nIndex])
                                .GetBackground() );
    Color   oldColor     = aVD.GetLineColor();
    aVD.SetLineColor( Color(COL_TRANSPARENT) );
    Color oldFillColor = aVD.GetFillColor();
    aVD.SetFillColor( aBrushItem.GetColor() );
    //-----------------------
    aVD.DrawRect( aCellArray[nIndex] );
    //-----------------------
    aVD.SetLineColor( oldColor );
    aVD.SetFillColor( oldFillColor );
}

//------------------------------------------------------------------------


void AutoFmtPreview::PaintCells()
{
    BYTE i = 0;

    //---------------
    // 1. Hintergrund
    //---------------
    if ( aCurData.IsBackground() )
    {
        for ( i=0; i<=24; i++ )
        {
            DrawBackground( i );
        }
    }

    //----------
    // 2. Rahmen
    //----------
    if ( aCurData.IsFrame() )
    {
        for ( i=0; i<=24; i++ )
        {
            DrawFrame( i );
        }
    }

    //---------
    // 3. Werte
    //---------
    for ( i = 0; i<=24; i++ )
    {
        DrawString( i );
    }
}

//------------------------------------------------------------------------


void __EXPORT AutoFmtPreview::Init()
{
    SvxBoxItem aEmptyBoxItem;

    aEmptyBoxItem.SetLine    ( NULL, BOX_LINE_TOP );
    aEmptyBoxItem.SetLine    ( NULL, BOX_LINE_BOTTOM );
    aEmptyBoxItem.SetLine    ( NULL, BOX_LINE_LEFT );
    aEmptyBoxItem.SetLine    ( NULL, BOX_LINE_RIGHT );
    aEmptyBoxItem.SetDistance( 0 );

    //------------------------
    // Linienattribut-Feld mit
    // Null-BoxItems fuellen
    //------------------------
    for ( USHORT i=0; i<=48; i++ )
    {
        aLinePtrArray[i] = new SvxBoxItem( aEmptyBoxItem );
    }

    CalcCellArray( FALSE );
    CalcLineMap();

}

//------------------------------------------------------------------------


void AutoFmtPreview::CalcCellArray( BOOL bFitWidth )
{
    // Initialisieren des Zellfeldes (5x5 Zellen).
    // Rectangles enthalten Position und Groesse einer Zelle.
    // abhaengig, ob Zellbreite an Format angepasst werden soll (bFitWidth)
    USHORT  nRow;
    USHORT  nDataColWidth = (bFitWidth) ? nDataColWidth2 : nDataColWidth1;

    for ( nRow=0; nRow<=4; nRow++ )
    {
        Point   topLeftPos ( 2, (nRowHeight * nRow) + 2 );
        Size    rectSize   ( 0, nRowHeight );
        USHORT  nCell;
        USHORT  nFirst = nRow*5;
        USHORT  nLast  = nFirst+4;

        for ( nCell=nFirst; nCell<=nLast; nCell++ )
        {
            //--------------------
            // Position berechnen:
            //--------------------
            if ( nCell == 0 )
            {
                // erste Zelle benoetigt keine Sonderbehandlung
            }
            else if ( (nCell <= 4) && (nCell != 0) )
            {
                // Zelle aus der ersten Zeile
                topLeftPos = aCellArray[nCell-1].TopRight();
            }
            else
            {
                topLeftPos = aCellArray[nCell-5].BottomLeft();
            }

            //-------------------
            // Groesse berechnen:
            //-------------------
            if ( (nCell == nFirst) || (nCell == nLast) )
                rectSize.Width() = nLabelColWidth;
            else
                rectSize.Width() = nDataColWidth;

            aCellArray[nCell] = Rectangle( topLeftPos, rectSize );
        }
    }
    aPrvSize.Width()  = aCellArray[24].BottomRight().X() + 3;
    aPrvSize.Height() = aCellArray[24].BottomRight().Y() + 3;

}

//------------------------------------------------------------------------


void AutoFmtPreview::CalcLineMap()
{
    //----------------------------------------------------
    // Initialisieren des Linenattributfeldes (7x7 Zellen)
    // Ein Eintrag dieses Feldes enthaelt einen Verweis
    // auf die Linienattribute des zugehoerigen Feldes.
    // Dieses Feld "umschliesst" das Zellfeld mit einer
    // Reihe "leerer" Zellen.
    //----------------------------------------------------

    SvxBoxItem aFrameItem;
    BYTE nRow;

    for ( nRow=0; nRow<=4; nRow++ )
    {
        USHORT  nLine;
        BYTE  nCell;
        BYTE  nFirst = (nRow * 5);
        BYTE  nLast  = nFirst+4;

        for ( nCell=nFirst; nCell<=nLast; nCell++ )
        {
            nLine = nCell + 8 + ((nCell/5)*2);
                aFrameItem = aCurData.GetBoxFmt( aFmtMap[nCell]).GetBox();
            *(aLinePtrArray[nLine]) = aFrameItem;
        }
    }
}

//------------------------------------------------------------------------


void AutoFmtPreview::NotifyChange( const SwTableAutoFmt& rNewData )
{
    aCurData  = rNewData;
    bFitWidth = aCurData.IsJustify();//TRUE;  //???
    CalcCellArray( bFitWidth );
    CalcLineMap();
    DoPaint( Rectangle( Point(0,0), GetSizePixel() ) );
}

//------------------------------------------------------------------------


void AutoFmtPreview::DoPaint( const Rectangle& rRect )
{
    Bitmap  thePreview;
    Point   aCenterPos;
    Size    theWndSize = GetSizePixel();
    Size    thePrevSize;
    Color   oldColor;
    Font    aFont;

    aFont = aVD.GetFont();
    aFont.SetTransparent( TRUE );

    aVD.SetFont          ( aFont );
    aVD.SetLineColor     ( Color(COL_TRANSPARENT));
    aVD.SetFillColor     ( Color( COL_WHITE ) );
    aVD.SetOutputSizePixel  ( aPrvSize );

    //--------------------------------
    // Zellen auf virtual Device malen
    // und Ergebnis sichern
    //--------------------------------
    PaintCells();
    thePreview = aVD.GetBitmap( Point(0,0), aPrvSize );

    //--------------------------------------
    // Rahmen malen und Vorschau zentrieren:
    // (virtual Device fuer Fensterausgabe)
    //--------------------------------------
    aVD.SetOutputSizePixel( theWndSize );
    oldColor = aVD.GetLineColor();
    aVD.SetLineColor( Color( COL_BLACK ) );
    aVD.DrawRect( Rectangle( Point(0,0), theWndSize ) );
    SetLineColor( oldColor );
    aCenterPos  = Point( (theWndSize.Width()  - aPrvSize.Width() ) / 2,
                         (theWndSize.Height() - aPrvSize.Height()) / 2 );
    aVD.DrawBitmap( aCenterPos, thePreview );

    //----------------------------
    // Ausgabe im Vorschaufenster:
    //----------------------------
    DrawBitmap( Point(0,0), aVD.GetBitmap( Point(0,0), theWndSize ) );

}

//------------------------------------------------------------------------

void __EXPORT AutoFmtPreview::Paint( const Rectangle& rRect )
{
    DoPaint( rRect );
}
//------------------------------------------------------------------------


BOOL lcl_HasPriority(   const SvxBorderLine* pThis,
                        const SvxBorderLine* pOther )
{

    if (!pThis)
        return FALSE;
    if (!pOther)
        return TRUE;

    USHORT nThisSize = pThis->GetOutWidth() + pThis->GetDistance() + pThis->GetInWidth();
    USHORT nOtherSize = pOther->GetOutWidth() + pOther->GetDistance() + pOther->GetInWidth();

    if (nThisSize > nOtherSize)
        return TRUE;
    else if (nThisSize < nOtherSize)
        return FALSE;
    else
    {
        if ( pOther->GetInWidth() && !pThis->GetInWidth() )
            return TRUE;
        else if ( pThis->GetInWidth() && !pOther->GetInWidth() )
            return FALSE;
        else
        {
            return TRUE;            //! ???
        }
    }
}

void lcl_SwLinkLine(const SwLineStruct& dLine,
                    const SwLineStruct& ltLine,
                    const SwLineStruct& lLine,
                    const SwLineStruct& lbLine,
                    const SwLineStruct& rtLine,
                    const SwLineStruct& rLine,
                    const SwLineStruct& rbLine,
                    short* dxArr)
{
    short nDx;
    short nDxDx;
    short nltW = ltLine.nLeft + ltLine.nMiddle + ltLine.nRight;
    short nlbW = lbLine.nLeft + lbLine.nMiddle + lbLine.nRight;
    short nrtW = rtLine.nLeft + rtLine.nMiddle + rtLine.nRight;
    short nrbW = rbLine.nLeft + rbLine.nMiddle + rbLine.nRight;
    if (dLine.nRight == 0) // einfache Linie
    {
        dxArr[1] = 0;
        dxArr[3] = 0;

        // Linker Teil
        if ((lLine.nLeft != 0) && (lLine.nRight == 0)) // links einfache Linie
            dxArr[0] = 0;
        else
        {
            nDx = Max(nltW, nlbW) / 2;
            nDxDx = (Max(nltW, nlbW) + 1) % 2;
            if ((nDx == 0) || (ltLine.nRight == 0) || (lbLine.nRight == 0))
            {
                if (lLine.nLeft == 0)
                    dxArr[0] = nDxDx - nDx;
                else
                    dxArr[0] = nDxDx + nDx;
            }
            else
                dxArr[0] = nDxDx + nDx;
        }

        // Rechter Teil
        if ((rLine.nLeft != 0) && (rLine.nRight == 0)) // rechts keine Linie
            dxArr[2] = 0;
        else
        {
            nDx = Max(nrtW, nrbW) / 2;
            if ((nDx == 0) || (rtLine.nRight == 0) || (rbLine.nRight == 0))
            {
                if (rLine.nLeft == 0)
                    dxArr[2] = nDx;
                else
                    dxArr[2] = -nDx;
            }
            else
                dxArr[2] = -nDx;
        }
    }
    else
    {
        // Linker oberer Teil
        if ((nltW == 0) || (ltLine.nRight == 0)) // Links oben keine oder einfache Linie
        {
            nDx = (nlbW + 1) / 2;
            nDxDx = (nlbW + 1) % 2;
            if (nDx == 0)
                dxArr[0] = nDxDx + nDx;
            else
                dxArr[0] = nDxDx - (nlbW / 2) + ltLine.nLeft;
        }
        else
        {
            nDx = (nltW + 1) / 2;
            nDxDx = (nltW + 1) % 2;
            if (nDx == 0)
                dxArr[0] = nDxDx - nDx;
            else
                dxArr[0] = nDxDx + nDx - ltLine.nRight;
        }
        // Linker unterer Teil
        if ((nlbW == 0) || (lbLine.nRight == 0)) // Links unten keine oder einfache Linie
        {
            nDx = (nltW + 1) / 2;
            nDxDx = (nltW + 1) % 2;
            if (nDx == 0)
                dxArr[1] = nDxDx + nDx;
            else
                dxArr[1] = nDxDx - (nltW / 2) + lbLine.nLeft;
        }
        else
        {
            nDx = (nlbW + 1) / 2;
            nDxDx = (nlbW + 1) % 2;
            if (nDx == 0)
                dxArr[1] = nDxDx - nDx;
            else
                dxArr[1] = nDxDx + nDx - lbLine.nRight;
        }

        // Rechter oberer Teil
        if ((nrtW == 0) || (rtLine.nRight == 0)) // Rechts oben keine oder einfache Linie
        {
            nDx = (nrbW + 1) / 2;
            if (nDx == 0)
                dxArr[2] = -nDx;
            else
                dxArr[2] = (nrbW / 2) - rtLine.nLeft;
        }
        else
        {
            nDx = (nrtW + 1) / 2;
            if (nDx == 0)
                dxArr[2] = nDx;
            else
                dxArr[2] = -nDx + rtLine.nLeft;
        }
        // Rechter unterer Teil
        if ((nrbW == 0) || (rbLine.nRight == 0)) // Rechts unten keine oder einfache Linie
        {
            nDx = (nrtW + 1) / 2;
            if (nDx == 0)
                dxArr[3] = -nDx;
            else
                dxArr[3] = (nrtW / 2) - rbLine.nLeft;
        }
        else
        {
            nDx = (nrbW + 1) / 2;
            if (nDx == 0)
                dxArr[3] = nDx;
            else
                dxArr[3] = -nDx + rbLine.nLeft;
        }
    }
}


/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.46  2000/09/18 16:06:09  willem.vandorp
    OpenOffice header added.

    Revision 1.45  2000/06/08 09:48:50  os
    using UCB

    Revision 1.44  2000/05/16 17:31:14  jp
    Changes for Unicode

    Revision 1.43  2000/05/16 14:32:29  jp
    Changes for Unicode

    Revision 1.42  2000/04/19 11:22:12  os
    UNICODE

    Revision 1.41  2000/03/03 15:17:03  os
    StarView remainders removed

    Revision 1.40  2000/02/11 14:59:03  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.39  1998/09/29 08:15:38  NN
    #53381# wenn noetig, Zahlformat in Sprache konvertieren


      Rev 1.38   29 Sep 1998 10:15:38   NN
   #53381# wenn noetig, Zahlformat in Sprache konvertieren

      Rev 1.37   07 Jul 1998 13:20:36   JP
   Bug #52273#: Anzeige des Nummernformates berichtigt

      Rev 1.36   02 Jun 1998 10:37:40   JP
   TabellenAutoFormat: Load/Save ohne Stream - erzeugen diesen selbst

      Rev 1.35   29 May 1998 19:07:08   JP
   aufgeraeumnt

      Rev 1.34   14 May 1998 15:15:44   JP
   neu: Numberformat vom Boxen unterstuetzen

      Rev 1.33   12 May 1998 23:42:46   JP
   neu: InserTable/TextToTable mit optionalen AutoFormat

      Rev 1.32   29 Apr 1998 07:59:08   OS
   sAutoTblFmtName allg. verfuegbar

      Rev 1.31   24 Nov 1997 15:52:20   MA
   includes

      Rev 1.30   12 Sep 1997 10:40:16   OS
   ITEMID_* definiert

      Rev 1.29   05 Sep 1997 12:20:02   MH
   chg: header

      Rev 1.28   01 Sep 1997 13:17:26   OS
   DLL-Umstellung

      Rev 1.27   23 May 1997 10:10:02   OS
   Ableitung von SfxModalDialog

      Rev 1.26   02 May 1997 20:28:36   NF
   includes...

      Rev 1.25   23 Apr 1997 14:29:18   OS
   ResId const

      Rev 1.24   17 Apr 1997 23:22:06   JP
   Umbenennen von AutoFormaten

      Rev 1.23   14 Feb 1997 11:54:58   JP
   Bug #35729#: sortiert einfuegen

      Rev 1.22   09 Feb 1997 19:00:52   JP
   Bug #35729#, #35740#: Formate sortiert, Ueberschreibmeldung

      Rev 1.21   11 Nov 1996 11:20:40   MA
   ResMgr

      Rev 1.20   02 Oct 1996 19:06:06   MA
   Umstellung Enable/Disable

      Rev 1.19   23 Sep 1996 18:44:50   mk
   includes fuer Unix raus

      Rev 1.18   21 Mar 1996 14:08:18   OM
   Umstellung 311

      Rev 1.17   06 Feb 1996 15:21:28   JP
   Link Umstellung 305

      Rev 1.16   01 Dec 1995 12:30:02   sv
   SwTableAutoFmt* -> SwTableAutoFmtPtr

      Rev 1.15   24 Nov 1995 16:59:00   OM
   PCH->PRECOMPILED

      Rev 1.14   13 Nov 1995 10:59:22   OM
   static entfernt

      Rev 1.13   08 Nov 1995 13:34:36   OS
   Change => Set

      Rev 1.12   31 Oct 1995 18:41:20   OM
   GetActive... entfernt

      Rev 1.11   21 Aug 1995 08:56:16   mk
   hintids.hxx und svxitems.hxx fuer UNX wieder included (MDA)

      Rev 1.10   09 Aug 1995 21:57:10   ER
   ! static data _vor_ seg_eofglobals

      Rev 1.9   24 Jul 1995 11:21:00   JP
   aufgeraeumt, CTOR/DTOR: Autoformattabelle ist nicht mehr static, sondern wird geladen und ggfs. gespeichert

      Rev 1.8   20 Jul 1995 19:40:36   JP
   Autoformatdatei umbenannt und wird jetzt im Config-Verzeichnis erwartet

      Rev 1.7   27 Apr 1995 10:07:54   OS
   Reihenfolge im Ctor

      Rev 1.6   20 Apr 1995 17:02:22   OS
   Delete-Message

      Rev 1.5   19 Apr 1995 18:07:38   OS
   BugFix Delete-Box

      Rev 1.4   06 Mar 1995 06:05:28   JP
   neu: mit Laden und Speichern

      Rev 1.3   06 Mar 1995 05:00:18   JP
   jetzt auch mit Umrandung

      Rev 1.2   06 Mar 1995 04:08:30   JP
   Optimierung

      Rev 1.1   06 Mar 1995 00:54:48   OS
   funktioniert fast

      Rev 1.0   05 Mar 1995 19:34:02   OS
   Initial revision.

      Rev 1.2   04 Mar 1995 23:29:36   ER
   add: hintids, svxitems

      Rev 1.1   04 Mar 1995 20:52:58   OS
   ein wenig weniger Kommentar

      Rev 1.0   04 Mar 1995 15:00:08   OS
   Initial revision.

------------------------------------------------------------------------*/




















diff --git a/sw/source/ui/table/tautofmt.hrc b/sw/source/ui/table/tautofmt.hrc
new file mode 100644
index 0000000..5c1f7d5
--- /dev/null
+++ b/sw/source/ui/table/tautofmt.hrc
@@ -0,0 +1,113 @@
/*************************************************************************
 *
 *  $RCSfile: tautofmt.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:48 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef SW_TAUTOFMT_HRC
#define SW_TAUTOFMT_HRC

#include "table.hrc"
// allgemein
#define BTN_OK          100
#define BTN_CANCEL      102
#define BTN_HELP        103
#define BTN_MORE        104
#define BTN_ADD         105
#define BTN_REMOVE      106
#define BTN_RENAME      107
#define FT_LABEL        110
#define GB_FRAME        111
#define STR_BTN_CLOSE   200

// Autoformat
#define LB_FORMAT       1
#define FT_FORMAT       9
#define GB_PREVIEW      10
#define WND_PREVIEW     19
#define BTN_NUMFORMAT   20
#define BTN_BORDER      21
#define BTN_FONT        23
#define BTN_PATTERN     24
#define BTN_ALIGNMENT   25
//#define BTN_ADJUST        26
#define GB_FORMAT       29
#define STR_ADD_TITLE   100
#define STR_ADD_LABEL   101
#define STR_DEL_TITLE   102
#define STR_DEL_MSG     103
#define STR_INVALID_AFNAME 104
#define STR_RENAME_TITLE    105
    // Autoformat-Preview:
#define STR_JAN         121
#define STR_FEB         122
#define STR_MAR         123
#define STR_NORTH       124
#define STR_MID         125
#define STR_SOUTH       126
#define STR_SUM         127

// Gruppierung setzen/aufheben:
#define BTN_GROUP_COLS  1
#define BTN_GROUP_ROWS  3
#define STR_GROUP       1
#define STR_UNGROUP     2


#define ED_INPUT       1

#endif
diff --git a/sw/source/ui/table/tautofmt.src b/sw/source/ui/table/tautofmt.src
new file mode 100644
index 0000000..9fad459
--- /dev/null
+++ b/sw/source/ui/table/tautofmt.src
@@ -0,0 +1,875 @@
/*************************************************************************
 *
 *  $RCSfile: tautofmt.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:48 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "tautofmt.hrc"
#include "helpid.h"
ModalDialog DLG_AUTOFMT_TABLE
{
    OutputSize = TRUE ;
    SVLook = TRUE ;
    HelpID = HID_AUTOFMT_TABLE ;
    Size = MAP_APPFONT ( 312 , 120 ) ;
    Text = "Autoformat" ;
    Text [ ENGLISH ] = "Autoformat" ;
    Text [ norwegian ] = "Autoformat" ;
    Text [ italian ] = "Formattazione automatica" ;
    Text [ portuguese_brazilian ] = "Formatação Automática" ;
    Text [ portuguese ] = "AutoFormato" ;
    Text [ finnish ] = "Automaattimuoto" ;
    Text [ danish ] = "AutoFormat" ;
    Text [ french ] = "AutoFormat" ;
    Text [ swedish ] = "AutoFormat" ;
    Text [ dutch ] = "AutoOpmaak" ;
    Text [ spanish ] = "AutoFormato" ;
    Text [ english_us ] = "AutoFormat" ;
    Moveable = TRUE ;
    FixedText FT_FORMAT
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 60 , 10 ) ;
        Text = "~Format" ;
        Text [ ENGLISH ] = "~Format" ;
        Text [ norwegian ] = "~Format" ;
        Text [ italian ] = "Formato" ;
        Text [ portuguese_brazilian ] = "~Formato" ;
        Text [ portuguese ] = "Fo~rmatar" ;
        Text [ finnish ] = "~Muoto" ;
        Text [ danish ] = "~Format" ;
        Text [ french ] = "Forma~t" ;
        Text [ swedish ] = "Cell~format" ;
        Text [ dutch ] = "~Formaat" ;
        Text [ spanish ] = "~Formato" ;
        Text [ english_us ] = "F~ormat" ;
        Text[ chinese_simplified ] = "¸ñʽ(~O)";
        Text[ russian ] = "Ôîð~ìàò";
        Text[ polish ] = "Format";
        Text[ japanese ] = "‘Ž®(~O)";
        Text[ chinese_traditional ] = "®æ¦¡(~O)";
        Text[ arabic ] = "ÊäÓíÞ";
        Text[ greek ] = "Ìïñ~öÞ";
        Text[ korean ] = "¼­½Ä(~O)";
        Text[ turkish ] = "~Format";
        Text[ language_user1 ] = " ";
    };
    ListBox LB_FORMAT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 6 , 16 ) ;
        Size = MAP_APPFONT ( 65 , 98 ) ;
        TabStop = TRUE ;
    };
    Window WND_PREVIEW
    {
        Pos = MAP_APPFONT ( 83 , 23 ) ;
        Size = MAP_APPFONT ( 161 , 86 ) ;
    };
    GroupBox GB_PREVIEW
    {
        Pos = MAP_APPFONT ( 77 , 12 ) ;
        Size = MAP_APPFONT ( 172 , 102 ) ;
        Text = "Vorschau" ;
        Text [ ENGLISH ] = "Preview" ;
        Text [ norwegian ] = "Preview" ;
        Text [ italian ] = "Anteprima" ;
        Text [ portuguese_brazilian ] = "Examinar" ;
        Text [ portuguese ] = "Previsualizar" ;
        Text [ finnish ] = "Esikatselu" ;
        Text [ danish ] = "Eksempel" ;
        Text [ french ] = "Aperçu" ;
        Text [ swedish ] = "Förhandsvisning" ;
        Text [ dutch ] = "Voorbeeld" ;
        Text [ spanish ] = "Previsualización" ;
        Text [ english_us ] = "Preview" ;
        Text[ chinese_simplified ] = "Ô¤ÊÓ";
        Text[ russian ] = "Ïðîñìîòð";
        Text[ polish ] = "Podgl¹d";
        Text[ japanese ] = "ÌßÚËÞ­°";
        Text[ chinese_traditional ] = "¹wÄý";
        Text[ arabic ] = "ÇáãÚÇíäÉ";
        Text[ greek ] = "Ðñïåðéóêüðçóç";
        Text[ korean ] = "¹Ì¸®º¸±â";
        Text[ turkish ] = "Önizleme";
        Text[ language_user1 ] = " ";
    };
    CheckBox BTN_NUMFORMAT
    {
        Hide = TRUE ;
        Pos = MAP_APPFONT ( 12 , 131 ) ;
        Size = MAP_APPFONT ( 60 , 10 ) ;
        Text = "Zahlenf~ormat" ;
        Text [ ENGLISH ] = "~Numberformat" ;
        Text [ norwegian ] = "~Numberformat" ;
        Text [ italian ] = "Formato ~numero" ;
        Text [ portuguese_brazilian ] = "~Formatodonúmero" ;
        Text [ portuguese ] = "~Formato dos números" ;
        Text [ finnish ] = "~Numeromuoto" ;
        Text [ danish ] = "Talformat" ;
        Text [ french ] = "~Format numérique" ;
        Text [ swedish ] = "Talf~ormat" ;
        Text [ dutch ] = "~Getalnotatie" ;
        Text [ spanish ] = "Formato nu~mérico" ;
        Text [ english_us ] = "~Number format" ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "Êý×Ö¸ñʽ(~N)";
        Text[ russian ] = "×èñëîâîé ôîðìàò";
        Text[ polish ] = "Format liczb";
        Text[ japanese ] = "”‚̏‘Ž®(~N)";
        Text[ chinese_traditional ] = "¼Æ¦r®æ¦¡(~N)";
        Text[ arabic ] = "ÊäÓíÞ ÇáÃÑÞÇã";
        Text[ greek ] = "ÌïñöÞ áñéèìþí";
        Text[ korean ] = "¹øÈ£ ¼­½Ä(~N)";
        Text[ turkish ] = "Sayý f~ormatý";
        Text[ language_user1 ] = " ";
    };
    CheckBox BTN_BORDER
    {
        Hide = TRUE ;
        Pos = MAP_APPFONT ( 12 , 147 ) ;
        Size = MAP_APPFONT ( 60 , 10 ) ;
        Text = "~Umrandung" ;
        Text [ ENGLISH ] = "~Border" ;
        Text [ norwegian ] = "~Border" ;
        Text [ italian ] = "~Bordo" ;
        Text [ portuguese_brazilian ] = "~Borda" ;
        Text [ portuguese ] = "~Contornos" ;
        Text [ finnish ] = "~Reunaviiva" ;
        Text [ danish ] = "Ramme" ;
        Text [ french ] = "~Bordure" ;
        Text [ swedish ] = "~Inramning" ;
        Text [ dutch ] = "~Omranding" ;
        Text [ spanish ] = "~Borde" ;
        Text [ english_us ] = "~Borders" ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "±ß¿ò(~B)";
        Text[ russian ] = "Îáðàìëåíèå";
        Text[ polish ] = "Obramowanie";
        Text[ japanese ] = "ŠO˜g(~B)";
        Text[ chinese_traditional ] = "Ã䮨(~B)";
        Text[ arabic ] = "ÇáÍÏæÏ";
        Text[ greek ] = "Ðåñßãñáììá";
        Text[ korean ] = "¿Ü°û¼±(~B)";
        Text[ turkish ] = "~Kenarlýk";
        Text[ language_user1 ] = " ";
    };
    CheckBox BTN_FONT
    {
        Hide = TRUE ;
        Pos = MAP_APPFONT ( 85 , 131 ) ;
        Size = MAP_APPFONT ( 60 , 10 ) ;
        Text = "Schriftar~t" ;
        Text [ ENGLISH ] = "F~ont" ;
        Text [ norwegian ] = "F~ont" ;
        Text [ italian ] = "~Tipo di carattere" ;
        Text [ portuguese_brazilian ] = "F~onte" ;
        Text [ portuguese ] = "~Tipo de letra" ;
        Text [ finnish ] = "~Fontti" ;
        Text [ danish ] = "Skrifttype" ;
        Text [ french ] = "~Police" ;
        Text [ swedish ] = "~Teckensnitt" ;
        Text [ dutch ] = "~Lettertype" ;
        Text [ spanish ] = "Fuen~te" ;
        Text [ english_us ] = "F~ont" ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "×ÖÌå(~O)";
        Text[ russian ] = "Øðèôò";
        Text[ polish ] = "Czcionka";
        Text[ japanese ] = "Ì«ÝĂ̎í—Þ(~F)";
        Text[ chinese_traditional ] = "¦r«¬(~F)";
        Text[ arabic ] = "äæÚ ÇáÎØ";
        Text[ greek ] = "ÃñáììáôïóåéñÜ";
        Text[ korean ] = "±Û²Ã(~O)";
        Text[ turkish ] = "Yazýti~pi";
        Text[ language_user1 ] = " ";
    };
    CheckBox BTN_PATTERN
    {
        Hide = TRUE ;
        Pos = MAP_APPFONT ( 85 , 147 ) ;
        Size = MAP_APPFONT ( 60 , 10 ) ;
        Text = "~Muster" ;
        Text [ ENGLISH ] = "~Pattern" ;
        Text [ norwegian ] = "~Pattern" ;
        Text [ italian ] = "~Modello" ;
        Text [ portuguese_brazilian ] = "~Estampa" ;
        Text [ portuguese ] = "~Padrão" ;
        Text [ finnish ] = "~Kuvio" ;
        Text [ danish ] = "Mønster" ;
        Text [ french ] = "~Motif" ;
        Text [ swedish ] = "~Mönster" ;
        Text [ dutch ] = "~Patroon" ;
        Text [ spanish ] = "Mo~delo" ;
        Text [ english_us ] = "~Pattern" ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "ͼ°¸(~P)";
        Text[ russian ] = "Îáðàçåö";
        Text[ polish ] = "De~señ";
        Text[ japanese ] = "ÊßÀ°Ý(~P)";
        Text[ chinese_traditional ] = "¹Ï®×(~P)";
        Text[ arabic ] = "äãæÐÌ";
        Text[ greek ] = "Ìïôßâï";
        Text[ korean ] = "¹«´Ì(~P)";
        Text[ turkish ] = "~Desen";
        Text[ language_user1 ] = " ";
    };
    CheckBox BTN_ALIGNMENT
    {
        Hide = TRUE ;
        Pos = MAP_APPFONT ( 150 , 131 ) ;
        Size = MAP_APPFONT ( 60 , 10 ) ;
        Text = "~Ausrichtung" ;
        Text [ ENGLISH ] = "Orien~tation" ;
        Text [ norwegian ] = "Orien~tation" ;
        Text [ italian ] = "~Allineamento" ;
        Text [ portuguese_brazilian ] = "Orien~tação" ;
        Text [ portuguese ] = "~Alinhamento" ;
        Text [ finnish ] = "S~uunta" ;
        Text [ danish ] = "Justering" ;
        Text [ french ] = "~Alignement" ;
        Text [ swedish ] = "~Justering" ;
        Text [ dutch ] = "~Uitlijning" ;
        Text [ spanish ] = "Orienta~ción" ;
        Text [ english_us ] = "Alignmen~t" ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "¶ÔÆë(~A)";
        Text[ russian ] = "Âûðàâíèâàíèå";
        Text[ polish ] = "Wyrównanie";
        Text[ japanese ] = "”z’u(~A)";
        Text[ chinese_traditional ] = "¹ï»ô(~A)";
        Text[ arabic ] = "ÇáãÍÇÐÇÉ";
        Text[ greek ] = "~Óôïß÷éóç";
        Text[ korean ] = "¸ÂÃã(~T)";
        Text[ turkish ] = "~Hizalama";
        Text[ language_user1 ] = " ";
    };
    GroupBox GB_FORMAT
    {
        Hide = TRUE ;
        Pos = MAP_APPFONT ( 6 , 120 ) ;
        Size = MAP_APPFONT ( 243 , 43 ) ;
        Text = "Formatierung" ;
        Text [ ENGLISH ] = "For~mats" ;
        Text [ norwegian ] = "For~mats" ;
        Text [ italian ] = "Formattazione" ;
        Text [ portuguese_brazilian ] = "Formatos" ;
        Text [ portuguese ] = "Formatar" ;
        Text [ finnish ] = "Mu~odot" ;
        Text [ danish ] = "Formatering" ;
        Text [ french ] = "Mise en page" ;
        Text [ swedish ] = "Formatering" ;
        Text [ dutch ] = "Opmaak" ;
        Text [ spanish ] = "Formato" ;
        Text [ english_us ] = "Formatting" ;
        Text[ chinese_simplified ] = "¸ñʽ»¯";
        Text[ russian ] = "Ôîðìàòèðîâàíèå";
        Text[ polish ] = "Formatowanie";
        Text[ japanese ] = "‘Ž®Ý’è";
        Text[ chinese_traditional ] = "®æ¦¡¤Æ";
        Text[ arabic ] = "ÊäÓíÞ";
        Text[ greek ] = "Ìïñöïðïßçóç";
        Text[ korean ] = "¼­½Ä";
        Text[ turkish ] = "Formatlama";
        Text[ language_user1 ] = " ";
    };
    OKButton BTN_OK
    {
        Pos = MAP_APPFONT ( 255 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        DefButton = TRUE ;
    };
    CancelButton BTN_CANCEL
    {
        Pos = MAP_APPFONT ( 255 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    MoreButton BTN_MORE
    {
        Pos = MAP_APPFONT ( 255 , 101 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        Text = "~Zusätze" ;
        Text [ ENGLISH ] = "~More" ;
        Text [ norwegian ] = "~Mer" ;
        Text [ italian ] = "E~xtra" ;
        Text [ portuguese_brazilian ] = "~Mais" ;
        Text [ portuguese ] = "~Opções" ;
        Text [ finnish ] = "~Enemmän" ;
        Text [ danish ] = "Flere" ;
        Text [ french ] = "~Options" ;
        Text [ swedish ] = "~Fler" ;
        Text [ dutch ] = "~Overige" ;
        Text [ spanish ] = "~Opciones" ;
        Text [ english_us ] = "~More" ;
        TabStop = TRUE ;
        MapUnit = MAP_APPFONT ;
        Delta = 48 ;
        Text[ chinese_simplified ] = "ÆäËû(~M)";
        Text[ russian ] = "Áîëüøå";
        Text[ polish ] = "Dod~atki";
        Text[ japanese ] = "µÌß¼®Ý(~M)";
        Text[ chinese_traditional ] = "¨ä¥L(~M)";
        Text[ arabic ] = "ÅÖÇÝÇÊ";
        Text[ greek ] = "Ðñüóèåôá";
        Text[ korean ] = "µ¡ºÙÀÓ(~M)";
        Text[ turkish ] = "Ay~rýntýlar";
        Text[ language_user1 ] = " ";
    };
    PushButton BTN_ADD
    {
        Pos = MAP_APPFONT ( 255 , 64 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        Text = "Hi~nzufügen" ;
        Text [ ENGLISH ] = "~Add" ;
        Text [ norwegian ] = "Leg~g til" ;
        Text [ italian ] = "~Aggiungi" ;
        Text [ portuguese_brazilian ] = "~Acrescentar" ;
        Text [ portuguese ] = "~Adicionar" ;
        Text [ finnish ] = "~Lisää" ;
        Text [ danish ] = "Tilføj" ;
        Text [ french ] = "~Ajouter" ;
        Text [ swedish ] = "Lä~gg till" ;
        Text [ dutch ] = "~Toevoegen" ;
        Text [ spanish ] = "~Añadir" ;
        Text [ english_us ] = "~Add" ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "²åÈë(~A)";
        Text[ russian ] = "Äîáàâèòü";
        Text[ polish ] = "~Dodaj";
        Text[ japanese ] = "‘}“ü(~A)";
        Text[ chinese_traditional ] = "¥[¤J(~A)";
        Text[ arabic ] = "ÅÖÇÝÉ";
        Text[ greek ] = "ÐñïóèÞêç";
        Text[ korean ] = "Ãß°¡(~A)";
        Text[ turkish ] = "~Ekle";
        Text[ language_user1 ] = " ";
    };
    PushButton BTN_REMOVE
    {
        Pos = MAP_APPFONT ( 255 , 81 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        Text = "~Löschen" ;
        Text [ ENGLISH ] = "Remo~ve" ;
        Text [ norwegian ] = "Remo~ve" ;
        Text [ italian ] = "~Elimina" ;
        Text [ portuguese_brazilian ] = "Remo~ver" ;
        Text [ portuguese ] = "E~liminar" ;
        Text [ finnish ] = "~Poista" ;
        Text [ danish ] = "Slet" ;
        Text [ french ] = "~Supprimer" ;
        Text [ swedish ] = "~Radera" ;
        Text [ dutch ] = "~Wissen" ;
        Text [ spanish ] = "~Eliminar" ;
        Text [ english_us ] = "~Delete" ;
        TabStop = TRUE ;
        Text[ chinese_simplified ] = "ɾ³ý(~D)";
        Text[ russian ] = "Óäàëèòü";
        Text[ polish ] = "Usuñ";
        Text[ japanese ] = "íœ(~D)";
        Text[ chinese_traditional ] = "§R°£(~D)";
        Text[ arabic ] = "ÍÐÝ";
        Text[ greek ] = "ÄéáãñáöÞ";
        Text[ korean ] = "»èÁ¦(~D)";
        Text[ turkish ] = "~Sil";
        Text[ language_user1 ] = " ";
    };
    PushButton BTN_RENAME
    {
        Pos = MAP_APPFONT ( 255 , 123 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        Text = "Um~benennen" ;
        Text [ ENGLISH ] = "Ren~ame" ;
        TabStop = TRUE ;
        Text [ portuguese ] = "Mudar ~nome" ;
        Text [ english_us ] = "~Rename" ;
        Text [ portuguese_brazilian ] = "Um~benennen" ;
        Text [ swedish ] = "B~yt namn" ;
        Text [ danish ] = "Omdøb" ;
        Text [ italian ] = "~Rinomina" ;
        Text [ spanish ] = "Cambiar ~nombre" ;
        Text [ french ] = "Re~nommer" ;
        Text [ dutch ] = "~Naam wijzigen" ;
        Text[ chinese_simplified ] = "ÖØÃüÃû(~A)";
        Text[ russian ] = "Ïåðåèìåíîâàòü";
        Text[ polish ] = "Zmieñ nazwê";
        Text[ japanese ] = "–¼‘O‚̕ύX(~A)";
        Text[ chinese_traditional ] = "­«·s©R¦W(~A)";
        Text[ arabic ] = "ÅÚÇÏÉ ÊÓãíÉ";
        Text[ greek ] = "Ìåôïíïìáóßá";
        Text[ korean ] = "À̸§ ¹Ù²Ù±â(~R)";
        Text[ turkish ] = "Yeniden~adlandýr";
        Text[ language_user1 ] = " ";
    };
    HelpButton BTN_HELP
    {
        Pos = MAP_APPFONT ( 255 , 43 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    String STR_ADD_TITLE
    {
        Text = "Autoformat hinzufügen" ;
        Text [ ENGLISH ] = "Add Autoformat" ;
        Text [ norwegian ] = "Add Autoformat" ;
        Text [ italian ] = "Aggiungi formattazione automatica" ;
        Text [ portuguese_brazilian ] = "Acrescentar Formato automático" ;
        Text [ portuguese ] = "Adicionar AutoFormato" ;
        Text [ finnish ] = "Lisää automaattimuoto" ;
        Text [ danish ] = "Tilføj AutoFormat" ;
        Text [ french ] = "Ajouter AutoFormat" ;
        Text [ swedish ] = "Lägg till AutoFormat" ;
        Text [ dutch ] = "AutoOpmaak toepassen" ;
        Text [ spanish ] = "Añadir AutoFormato" ;
        Text [ english_us ] = "Add AutoFormat" ;
        Text[ chinese_simplified ] = "ÐÂÔö×Ô¶¯¸ñʽ";
        Text[ russian ] = "Âñòàâèòü àâòîôîðìàò";
        Text[ polish ] = "Dodaj autoformatowanie";
        Text[ japanese ] = "µ°ÄÌ«°Ï¯Ä‚̒ljÁ";
        Text[ chinese_traditional ] = "·s¼W¦Û°Ê®æ¦¡";
        Text[ arabic ] = "ÅÖÇÝÉ ÇáÊäÓíÞ ÇáÊáÞÇÆí";
        Text[ greek ] = "ÐñïóèÞêç ÁõôïÌïñöïðïßçóçò";
        Text[ korean ] = "ÀÚµ¿ ¼­½Ä Ãß°¡";
        Text[ turkish ] = "Otomatik formatý ekle";
        Text[ language_user1 ] = " ";
    };
    String STR_ADD_LABEL
    {
        Text = "Name" ;
        Text [ ENGLISH ] = "Name" ;
        Text [ norwegian ] = "Navn" ;
        Text [ italian ] = "Nome" ;
        Text [ portuguese_brazilian ] = "Nomear" ;
        Text [ portuguese ] = "Nome" ;
        Text [ finnish ] = "Nimi" ;
        Text [ danish ] = "Navn" ;
        Text [ french ] = "Nom" ;
        Text [ swedish ] = "Namn" ;
        Text [ dutch ] = "Naam" ;
        Text [ spanish ] = "Nombre" ;
        Text [ english_us ] = "Name" ;
        Text[ chinese_simplified ] = "Ãû³Æ";
        Text[ russian ] = "Èìÿ";
        Text[ polish ] = "Nazwa";
        Text[ japanese ] = "–¼‘O";
        Text[ chinese_traditional ] = "¦WºÙ";
        Text[ arabic ] = "ÇáÇÓã";
        Text[ greek ] = "¼íïìá";
        Text[ korean ] = "À̸§";
        Text[ turkish ] = "Ad";
        Text[ language_user1 ] = " ";
    };
    String STR_DEL_TITLE
    {
        Text = "Autoformat löschen" ;
        Text [ ENGLISH ] = "Delete Autoformat" ;
        Text [ norwegian ] = "Delete Autoformat" ;
        Text [ italian ] = "Cancella formattazione automatica" ;
        Text [ portuguese_brazilian ] = "Apagar Formato Automático" ;
        Text [ portuguese ] = "Eliminar AutoFormato" ;
        Text [ finnish ] = "Poista automaattimuoto" ;
        Text [ danish ] = "Slet AutoFormat" ;
        Text [ french ] = "Supprimer l'AutoFormat" ;
        Text [ swedish ] = "Radera AutoFormat" ;
        Text [ dutch ] = "AutoOpmaak wissen" ;
        Text [ spanish ] = "Eliminar AutoFormato" ;
        Text [ english_us ] = "Delete AutoFormat" ;
        Text[ chinese_simplified ] = "ɾ³ý×Ô¶¯¸ñʽ";
        Text[ russian ] = "Óäàëèòü àâòîôîðìàò";
        Text[ polish ] = "Usuñ autoformatowanie";
        Text[ japanese ] = "µ°ÄÌ«°Ï¯Ä‚̍폜";
        Text[ chinese_traditional ] = "§R°£¦Û°Ê®æ¦¡";
        Text[ arabic ] = "ÍÐÝ ÇáÊäÓíÞ ÇáÊáÞÇÆí";
        Text[ greek ] = "ÄéáãñáöÞ ÁõôïÌïñöïðïßçóçò";
        Text[ korean ] = "ÀÚµ¿ ¼­½Ä »èÁ¦";
        Text[ turkish ] = "Otomatik formatý sil";
        Text[ language_user1 ] = " ";
    };
    String STR_DEL_MSG
    {
        Text = "Folgendes Autoformat wird gelöscht:" ;
        Text [ ENGLISH ] = "This autoformat will be deleted:" ;
        Text [ norwegian ] = "Dette Autoformat vil bli slettet:" ;
        Text [ italian ] = "Questa formattazione automatica verrà cancellata:" ;
        Text [ portuguese_brazilian ] = "Esta formatação Automática ser  apagada:" ;
        Text [ portuguese ] = "Será eliminado o seguinte AutoFormato:" ;
        Text [ finnish ] = "Poistettava automaattimuoto:" ;
        Text [ danish ] = "Følgende AutoFormat slettes:" ;
        Text [ french ] = "L'AutoFormat suivant va être supprimé :" ;
        Text [ swedish ] = "Följande AutoFormat raderas:" ;
        Text [ dutch ] = "Het volgende AutoOpmaak-item wordt gewist." ;
        Text [ spanish ] = "El siguiente AutoFormato se eliminará:" ;
        Text [ english_us ] = "The following AutoFormat entry will be deleted:" ;
        Text[ chinese_simplified ] = "ɾ³ýÒÔϵÄ×Ô¶¯¸ñʽ£º";
        Text[ russian ] = "Ñëåäóþùèé àâòîôîðìàò áóäåò óäàëåí:";
        Text[ polish ] = "Nastêpuj¹ce autoformatowanie bêdzie usuniête:";
        Text[ japanese ] = "ˆÈ‰º‚̵°ÄÌ«°Ï¯Ä‚͍폜‚³‚ê‚Ü‚·:";
        Text[ chinese_traditional ] = "§R°£¥H¤Uªº¦Û°Ê®æ¦¡¡G";
        Text[ arabic ] = "ÓæÝ íÊã ÍÐÝ ÇáÊäÓíÞ ÇáÊáÞÇÆí ÇáÊÇáí:";
        Text[ greek ] = "Ç åîÞò Áõôïìïñöïðïßçóç èá äéáãñáöåß:";
        Text[ korean ] = "´ÙÀ½ÀÇ ÀÚµ¿ ¼­½Ä Ç׸ñÀº»èÁ¦µÉ °ÍÀÔ´Ï´Ù :";
        Text[ turkish ] = "Aþaðýdaki otomatik format silinecek:";
        Text[ language_user1 ] = " ";
    };
    String STR_RENAME_TITLE
    {
        Text = "Autoformat umbenennen" ;
        Text [ ENGLISH ] = "Rename Autoformat" ;
        Text [ english_us ] = "Rename AutoFormat" ;
        Text [ portuguese ] = "Mudar nome do AutoFormato" ;
        Text [ portuguese_brazilian ] = "Autoformat umbenennen" ;
        Text [ swedish ] = "Byt namn på AutoFormat" ;
        Text [ danish ] = "Omdøb AutoFormat" ;
        Text [ italian ] = "Rinomina formattazione automatica" ;
        Text [ spanish ] = "Cambiar nombre del AutoFormato" ;
        Text [ french ] = "Renommer l'AutoFormat" ;
        Text [ dutch ] = "AutoOpmaak nieuwe naam geven" ;
        Text[ chinese_simplified ] = "ÖØÃüÃû×Ô¶¯¸ñʽ";
        Text[ russian ] = "Ïåðåèìåíîâàòü àâòîôîðìàò";
        Text[ polish ] = "Zmieñ nazwê autoformatowania";
        Text[ japanese ] = "µ°ÄÌ«°Ï¯Ä‚Ì–¼‘O‚̕ύX";
        Text[ chinese_traditional ] = "­«·s©R¦W¦Û°Ê®æ¦¡";
        Text[ arabic ] = "ÅÚÇÏÉ ÊÓãíÉ ÇáÊäÓíÞ ÇáÊáÞÇÆí";
        Text[ greek ] = "Ìåôïíïìáóßá ÁõôïÌïñöïðïßçóç";
        Text[ korean ] = "ÀÚµ¿ ¼­½Ä À̸§ ¹Ù²Ù±â";
        Text[ turkish ] = "Otomatik formatý yeniden adlandýr";
        Text[ language_user1 ] = " ";
    };
    String STR_BTN_CLOSE
    {
        Text = "~Schließen" ;
        Text [ ENGLISH ] = "~Close" ;
        Text [ norwegian ] = "~Lukk" ;
        Text [ italian ] = "Chiudi" ;
        Text [ portuguese_brazilian ] = "~Fechar" ;
        Text [ portuguese ] = "~Fechar" ;
        Text [ finnish ] = "~Sulje" ;
        Text [ danish ] = "Luk" ;
        Text [ french ] = "~Fermer" ;
        Text [ swedish ] = "~Stäng" ;
        Text [ dutch ] = "~Sluiten" ;
        Text [ spanish ] = "~Cerrar" ;
        Text [ english_us ] = "~Close" ;
        Text[ chinese_simplified ] = "¹Ø±Õ(~C)";
        Text[ russian ] = "Çàêðûòü";
        Text[ polish ] = "Zamknij";
        Text[ japanese ] = "•‚¶‚é(~C)";
        Text[ chinese_traditional ] = "Ãö³¬(~C)";
        Text[ arabic ] = "ÅÛáÇÞ";
        Text[ greek ] = "Êëåßóéìï";
        Text[ korean ] = "´Ý±â(~C)";
        Text[ turkish ] = "~Kapat";
        Text[ language_user1 ] = " ";
    };
    String STR_JAN
    {
        Text = "Jan" ;
        Text [ ENGLISH ] = "Jan" ;
        Text [ norwegian ] = "Jan" ;
        Text [ italian ] = "gen" ;
        Text [ portuguese_brazilian ] = "Jan" ;
        Text [ portuguese ] = "Jan" ;
        Text [ finnish ] = "Tam" ;
        Text [ danish ] = "Jan" ;
        Text [ french ] = "Janv." ;
        Text [ swedish ] = "Jan" ;
        Text [ dutch ] = "Jan" ;
        Text [ spanish ] = "Ene" ;
        Text [ english_us ] = "Jan" ;
        Text[ chinese_simplified ] = "Ò»ÔÂ";
        Text[ russian ] = "ßíâ";
        Text[ polish ] = "Styczeñ";
        Text[ japanese ] = "1ŒŽ";
        Text[ chinese_traditional ] = "¤@¤ë";
        Text[ arabic ] = "íäÇíÑ";
        Text[ greek ] = "Éáí";
        Text[ korean ] = "1¿ù";
        Text[ turkish ] = "Ock";
        Text[ language_user1 ] = " ";
    };
    String STR_FEB
    {
        Text = "Feb" ;
        Text [ ENGLISH ] = "Feb" ;
        Text [ norwegian ] = "Feb" ;
        Text [ italian ] = "feb" ;
        Text [ portuguese_brazilian ] = "Fev" ;
        Text [ portuguese ] = "Fev" ;
        Text [ finnish ] = "Hel" ;
        Text [ danish ] = "Feb" ;
        Text [ french ] = "Févr." ;
        Text [ swedish ] = "Feb" ;
        Text [ dutch ] = "Feb" ;
        Text [ spanish ] = "Feb" ;
        Text [ english_us ] = "Feb" ;
        Text[ chinese_simplified ] = "¶þÔÂ";
        Text[ russian ] = "Ôåâ";
        Text[ polish ] = "Luty";
        Text[ japanese ] = "2ŒŽ";
        Text[ chinese_traditional ] = "¤G¤ë";
        Text[ arabic ] = "ÝÈÑÇíÑ";
        Text[ greek ] = "Öåâ";
        Text[ korean ] = "2¿ù";
        Text[ turkish ] = "Þub";
        Text[ language_user1 ] = " ";
    };
    String STR_MAR
    {
        Text = "Mär" ;
        Text [ ENGLISH ] = "Mar" ;
        Text [ norwegian ] = "Mar" ;
        Text [ italian ] = "mar" ;
        Text [ portuguese_brazilian ] = "Mar" ;
        Text [ portuguese ] = "Mar" ;
        Text [ finnish ] = "Maa" ;
        Text [ danish ] = "Mar" ;
        Text [ french ] = "Mars" ;
        Text [ swedish ] = "Mar" ;
        Text [ dutch ] = "Mrt" ;
        Text [ spanish ] = "Mar" ;
        Text [ english_us ] = "Mar" ;
        Text[ chinese_simplified ] = "ÈýÔÂ";
        Text[ russian ] = "Ìàð";
        Text[ polish ] = "Marzec";
        Text[ japanese ] = "3ŒŽ";
        Text[ chinese_traditional ] = "¤T¤ë";
        Text[ arabic ] = "ãÇÑÓ";
        Text[ greek ] = "Máñ";
        Text[ korean ] = "3¿ù";
        Text[ turkish ] = "Mar";
        Text[ language_user1 ] = " ";
    };
    String STR_NORTH
    {
        Text = "Nord" ;
        Text [ ENGLISH ] = "North" ;
        Text [ norwegian ] = "North" ;
        Text [ italian ] = "nord" ;
        Text [ portuguese_brazilian ] = "Norte" ;
        Text [ portuguese ] = "Norte" ;
        Text [ finnish ] = "Pohjoinen" ;
        Text [ danish ] = "Nord" ;
        Text [ french ] = "Nord" ;
        Text [ swedish ] = "Norr" ;
        Text [ dutch ] = "Noorden" ;
        Text [ spanish ] = "Norte" ;
        Text [ english_us ] = "North" ;
        Text[ chinese_simplified ] = "±±";
        Text[ russian ] = "Ñåâåð";
        Text[ polish ] = "Pó³noc";
        Text[ japanese ] = "–k";
        Text[ chinese_traditional ] = "¥_";
        Text[ arabic ] = "ÇáÔãÇá";
        Text[ greek ] = "ÂïññÜò";
        Text[ korean ] = "ºÏÂÊ";
        Text[ turkish ] = "Kuzey";
        Text[ language_user1 ] = " ";
    };
    String STR_MID
    {
        Text = "Mitte" ;
        Text [ ENGLISH ] = "Mid" ;
        Text [ norwegian ] = "Mid" ;
        Text [ italian ] = "centro" ;
        Text [ portuguese_brazilian ] = "Centro" ;
        Text [ portuguese ] = "Centro" ;
        Text [ finnish ] = "Keski" ;
        Text [ danish ] = "Midte" ;
        Text [ french ] = "Milieu" ;
        Text [ swedish ] = "Mitten" ;
        Text [ dutch ] = "Midden" ;
        Text [ spanish ] = "Centro" ;
        Text [ english_us ] = "Mid" ;
        Text[ chinese_simplified ] = "ÖÐ";
        Text[ russian ] = "Ñåðåäèíà";
        Text[ polish ] = "Œrodek";
        Text[ japanese ] = "’†‰›";
        Text[ chinese_traditional ] = "¤¤";
        Text[ arabic ] = "ÇáæÓØ";
        Text[ greek ] = "ÊÝíôñï";
        Text[ korean ] = "°¡¿îµ¥";
        Text[ turkish ] = "Orta";
        Text[ language_user1 ] = " ";
    };
    String STR_SOUTH
    {
        Text = "Süd" ;
        Text [ ENGLISH ] = "South" ;
        Text [ norwegian ] = "South" ;
        Text [ italian ] = "Sud" ;
        Text [ portuguese_brazilian ] = "Sul" ;
        Text [ portuguese ] = "Sul" ;
        Text [ finnish ] = "Etelä" ;
        Text [ danish ] = "Syd" ;
        Text [ french ] = "Sud" ;
        Text [ swedish ] = "Söder" ;
        Text [ dutch ] = "Zuiden" ;
        Text [ spanish ] = "Sur" ;
        Text [ english_us ] = "South" ;
        Text[ chinese_simplified ] = "ÄÏ";
        Text[ russian ] = "Þã";
        Text[ polish ] = "Po³udnie";
        Text[ japanese ] = "“ì";
        Text[ chinese_traditional ] = "«n";
        Text[ arabic ] = "ÇáÌäæÈ";
        Text[ greek ] = "Íüôïò";
        Text[ korean ] = "³²ÂÊ";
        Text[ turkish ] = "Güney";
        Text[ language_user1 ] = " ";
    };
    String STR_SUM
    {
        Text = "Summe" ;
        Text [ ENGLISH ] = "Sum" ;
        Text [ norwegian ] = "Sum" ;
        Text [ italian ] = "somma" ;
        Text [ portuguese_brazilian ] = "Soma" ;
        Text [ portuguese ] = "Soma" ;
        Text [ finnish ] = "Summa" ;
        Text [ danish ] = "Sum" ;
        Text [ french ] = "Somme" ;
        Text [ swedish ] = "Summa" ;
        Text [ dutch ] = "Totaal" ;
        Text [ spanish ] = "Suma" ;
        Text [ english_us ] = "Sum" ;
        Text[ chinese_simplified ] = "×ܼÆ";
        Text[ russian ] = "Ñóììà";
        Text[ polish ] = "Suma";
        Text[ japanese ] = "‡Œv";
        Text[ chinese_traditional ] = "¤p­p";
        Text[ arabic ] = "ÇáãÌãæÚ";
        Text[ greek ] = "¢èñïéóìá";
        Text[ korean ] = "ÇÕ°è";
        Text[ turkish ] = "Toplam";
        Text[ language_user1 ] = " ";
    };
    String STR_INVALID_AFNAME
    {
        /* ### ACHTUNG: Neuer Text in Resource? Sie haben einen ungültigen Namen angegeben.\nDas AutoFormat konnte nicht angelegt werden.\nWählen Sie einen anderen Namen. : Sie haben einen ungültigen Namen angegeben.\nDas Autoformat konnte nicht angelegt werden.\nWählen Sie einen anderen Namen. */
        /* ### ACHTUNG: Neuer Text in Resource? Sie haben einen ungültigen Namen angegeben.\nDas AutoFormat konnte nicht angelegt werden.\nWählen Sie einen anderen Namen. : Sie haben einen ungültigen Namen angegeben.\nDas Autoformat konnte nicht angelegt werden.\nWählen Sie einen anderen Namen. */
        Text = "Sie haben einen ungültigen Namen angegeben.\nDas AutoFormat konnte nicht angelegt werden.\nWählen Sie einen anderen Namen." ;
        Text [ ENGLISH ] = "You entered an invalid name.\nThe desired AutoFormat could not be createdTry again using a different name." ;
        Text [ norwegian ] = "You entered an invalid name.\nThe desired AutoFormat could not be createdTry again using a different name." ;
        Text [ italian ] = "Nome specificato non valido.\nImpossibile creare la Formattazione automatica desiderata.\nScegliete un altro nome." ;
        Text [ portuguese_brazilian ] = "You entered an invalid name.\nThe desired AutoFormat could not be createdTry again using a different name." ;
        Text [ portuguese ] = "Indicou um nome incorrecto.\nO AutoFormato desejado não pode ser criado.\nTente de novo usando um nome diferente." ;
        Text [ finnish ] = "You entered an invalid name.\nThe desired AutoFormat could not be createdTry again using a different name." ;
        Text [ danish ] = "Du har indtastet et ugyldigt navn.\nDet var ikke muligt at oprette AutoFormatet.\nVælg venligst et andet navn." ;
        Text [ french ] = "Vous avez saisi un nom incorrect.\nL'AutoFormat n'a pas ou être éffectué.\nVeuillez indiquer un nom correct." ;
        Text [ swedish ] = "Du har angett ett ogiltigt namn.\nAutoFormatet kunde inte skapas.\nVälj ett annat namn." ;
        Text [ dutch ] = "U heeft een ongeldige naam vermeld.\nDe gewenste AutoOpmaak kon niet worden uitgevoerd.\nKies een andere naam." ;
        Text [ spanish ] = "Ha indicado un nombre no válido, \npor lo que no se pudo crear el AutoFormato.\nSeleccione otro nombre." ;
        Text [ ENGLISH_US ] = "You have entered an invalid name.\nThe desired AutoFormat could not be created. \nTry again using a different name." ;
        Text[ chinese_simplified ] = "Äú¸ø¶¨ÁËÒ»¸öÎÞЧµÄÃû³Æ¡£\nÒò´ËÎÞ·¨½¨Á¢×Ô¶¯¸ñʽ¡£\nÇëÄúÊäÈëÒ»¸öÓÐЧÃû³Æ¡£";
        Text[ russian ] = "Âû ïðèñâîèëè íåïðàâèëüíîå èìÿ.\nÀâòîôîðìàò ñîçäàòü íåâîçìîæíî.\nÂûáåðèòå äðóãîå èìÿ.";
        Text[ polish ] = "Podana zosta³a nieprawid³owa nazwa.\nNie mo¿na by³o utworzyæ autoformatowania.\nWybierz inn¹ nazwê.";
        Text[ japanese ] = "•s“KØ‚È–¼‘O‚ª“ü—Í‚³‚ê‚Ü‚µ‚½B\n‚±‚̵°ÄÌ«°Ï¯Ä‚ł͍쐬o—ˆ‚Ü‚¹‚ñB\n•ʂ̖¼‘O‚ð‘I‘ð‚µ‚Ä‰º‚³‚¢B";
        Text[ chinese_traditional ] = "±z¿é¤J¤F¤@­ÓµL®Äªº¦WºÙ¡C\nµLªk«Ø¥ß¦Û°Ê®æ¦¡¡C\n½Ð¿é¤J¤@­Ó¦³®Ä¦WºÙ¡C";
        Text[ arabic ] = "áÞÏ ÞãÊ ÈÅÏÎÇá ÇÓã ÛíÑ ÕÇáÍ.\náåÐÇ ÊÚÐÑ ÅäÔÇÁ ÇáÊäÓíÞ ÇáÊáÞÇÆí.\nÇáÑÌÇÁ ÇÎÊíÇÑ ÇÓã ÃÎÑ.";
        Text[ greek ] = "¸÷åôå åéóÜãåé Ýíá ìç Ýãêõñï üíïìá.\nÇ ÁõôïÌïñöïðïßçóç äåí Þôáí äõíáôüí íá äçìéïõñãçèåß.\nÅðéëÝîôå Ýíá Üëëï üíïìá.";
        Text[ korean ] = "À¯È¿ÇÏÁö ¾ÊÀº À̸§À» ÀÔ·ÂÇß½À´Ï´Ù.\n¿ä±¸µÈ ÀÚµ¿ ¼­½ÄÀº¸¸µé¾î Áú ¼ö¾ø½À´Ï´Ù. \n´Ù¸¥ À̸§À¸·Î ´Ù½Ã ½ÃµµÇϽʽÿÀ..";
        Text[ turkish ] = "Geçersiz bir ad girdiniz.\nOtomatik format oluþturulamadý.\nBaþka bir ad seçiniz.";
        Text[ language_user1 ] = " ";
    };
    Text[ chinese_simplified ] = "×Ô¶¯¸ñʽ";
    Text[ russian ] = "Àâòîôîðìàò";
    Text[ polish ] = "Autoformatowanie";
    Text[ japanese ] = "µ°ÄÌ«°Ï¯Ä";
    Text[ chinese_traditional ] = "¦Û°Ê®æ¦¡";
    Text[ arabic ] = "ÇáÊäÓíÞ ÇáÊáÞÇÆí";
    Text[ greek ] = "ÁõôïÌïñöïðïßçóç";
    Text[ korean ] = "ÀÚµ¿ ¼­½Ä";
    Text[ turkish ] = "Otomatik format";
    Text[ language_user1 ] = " ";
};
ModalDialog DLG_SWDLG_STRINPUT
{
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 172 , 63 ) ;
    Moveable = TRUE ;
    Closeable = TRUE ;
    HelpID = HID_SWDLG_STRINPUT ;
    Edit ED_INPUT
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 6 , 24 ) ;
        Size = MAP_APPFONT ( 104 , 12 ) ;
        TabStop = TRUE ;
    };
    FixedText FT_LABEL
    {
        Pos = MAP_APPFONT ( 6 , 13 ) ;
        Size = MAP_APPFONT ( 90 , 10 ) ;
        Text = "Label" ;
    };
    OKButton BTN_OK
    {
        Pos = MAP_APPFONT ( 116 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        DefButton = TRUE ;
    };
    CancelButton BTN_CANCEL
    {
        Pos = MAP_APPFONT ( 116 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
};
diff --git a/sw/source/ui/uiview/makefile.mk b/sw/source/ui/uiview/makefile.mk
new file mode 100644
index 0000000..2884ba8
--- /dev/null
+++ b/sw/source/ui/uiview/makefile.mk
@@ -0,0 +1,117 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:48 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=..$/..$/..

PRJNAME=sw
TARGET=uiview

AUTOSEG=true

PROJECTPCH=ui_pch
PDBTARGET=ui_pch
PROJECTPCHSOURCE=..\ui_1st\ui_pch

# --- Settings -----------------------------------------------------

.INCLUDE :  $(PRJ)$/inc$/swpre.mk
.INCLUDE :  settings.mk
.INCLUDE :  $(PRJ)$/inc$/sw.mk

# --- Files --------------------------------------------------------

SRCFILES =  \
        view.src \
        pview.src

SLOFILES =  \
        $(SLO)$/view0.obj \
        $(SLO)$/view.obj \
        $(SLO)$/view1.obj \
        $(SLO)$/view2.obj \
        $(SLO)$/viewcoll.obj \
        $(SLO)$/viewdlg2.obj \
        $(SLO)$/viewdlg.obj \
        $(SLO)$/viewdraw.obj \
        $(SLO)$/viewling.obj \
        $(SLO)$/viewmdi.obj \
        $(SLO)$/pview.obj \
        $(SLO)$/viewport.obj \
        $(SLO)$/viewstat.obj \
        $(SLO)$/viewtab.obj \
        $(SLO)$/viewprt.obj \
        $(SLO)$/viewsrch.obj \
        $(SLO)$/scroll.obj \
        $(SLO)$/swcli.obj  \
        $(SLO)$/srcview.obj \
        $(SLO)$/uivwimp.obj

EXCEPTIONSFILES= \
        $(SLO)$/srcview.obj \
        $(SLO)$/uivwimp.obj

# --- Tagets -------------------------------------------------------

.INCLUDE :  target.mk

$(SRS)$/uiview.srs: $(SOLARINCDIR)$/svx$/globlmn.hrc

diff --git a/sw/source/ui/uiview/pview.cxx b/sw/source/ui/uiview/pview.cxx
new file mode 100644
index 0000000..a678728
--- /dev/null
+++ b/sw/source/ui/uiview/pview.cxx
@@ -0,0 +1,2322 @@
/*************************************************************************
 *
 *  $RCSfile: pview.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:48 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop


#ifndef _SV_TIMER_HXX //autogen
#include <vcl/timer.hxx>
#endif


#ifndef _SVX_SVXIDS_HRC //autogen
#include <svx/svxids.hrc>
#endif
#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif
#ifndef _SFX_TOPFRM_HXX
#include <sfx2/topfrm.hxx>
#endif
#ifndef _SFX_BINDINGS_HXX //autogen
#include <sfx2/bindings.hxx>
#endif
#ifndef _SVX_STDDLG_HXX //autogen
#include <svx/stddlg.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SFX_WHITER_HXX //autogen
#include <svtools/whiter.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _SV_BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SVX_PAPERINF_HXX //autogen
#include <svx/paperinf.hxx>
#endif
#ifndef _SFX_PRINTER_HXX //autogen
#include <sfx2/printer.hxx>
#endif
#ifndef _SV_FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif
#ifndef _SV_FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif
#ifndef _SV_GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif
#ifndef _SV_HELP_HXX //autogen
#include <vcl/help.hxx>
#endif
#ifndef _SV_PRINTDLG_HXX_ //autogen
#include <svtools/printdlg.hxx>
#endif
#ifndef _SVX_SRCHITEM_HXX //autogen
#include <svx/srchitem.hxx>
#endif
#ifndef _SVDVIEW_HXX //autogen
#include <svx/svdview.hxx>
#endif
#ifndef _VCL_CMDEVT_HXX //autogen
#include <vcl/cmdevt.hxx>
#endif


#ifndef _SWWAIT_HXX
#include <swwait.hxx>
#endif
#ifndef _SWGLOBDOCSH_HXX //autogen
#include <globdoc.hxx>
#endif
#ifndef _SWWDOCSH_HXX //autogen
#include <wdocsh.hxx>
#endif
#ifndef _PVPRTDAT_HXX
#include <pvprtdat.hxx>
#endif
#include "helpid.h"
#include "swmodule.hxx"
#ifndef _MODOPT_HXX //autogen
#include <modcfg.hxx>
#endif
#include "wrtsh.hxx"
#include "docsh.hxx"
#include "cmdid.h"
#include "viewopt.hxx"
#include "globals.hrc"
#include "doc.hxx"
#include "pview.hxx"
#include "view.hxx"
#include "textsh.hxx"
#include "scroll.hxx"
#include "swprtopt.hxx"
#include "docstat.hxx"
#include "usrpref.hxx"
#include "popup.hrc"
#include "pview.hrc"
#include "viewfunc.hxx"

#ifndef _SVX_DLGUTIL_HXX //autogen
#include <svx/dlgutil.hxx>
#endif

#define SwPagePreView
#include "itemdef.hxx"
#include "swslots.hxx"


SFX_IMPL_VIEWFACTORY(SwPagePreView, SW_RES(STR_NONAME))
{
    SFX_VIEW_REGISTRATION(SwDocShell);
    SFX_VIEW_REGISTRATION(SwWebDocShell);
    SFX_VIEW_REGISTRATION(SwGlobalDocShell);
}

SFX_IMPL_INTERFACE(SwPagePreView, SfxViewShell, SW_RES(RID_PVIEW_TOOLBOX))
{
    SFX_POPUPMENU_REGISTRATION(SW_RES(MN_PPREVIEW_POPUPMENU));
    SFX_OBJECTBAR_REGISTRATION( SFX_OBJECTBAR_OBJECT|SFX_VISIBILITY_STANDARD|
                                SFX_VISIBILITY_CLIENT|SFX_VISIBILITY_FULLSCREEN|
                                SFX_VISIBILITY_READONLYDOC,
                                SW_RES(RID_PVIEW_TOOLBOX));
}


TYPEINIT1(SwPagePreView,SfxViewShell)

#define SWVIEWFLAGS ( SFX_VIEW_MAXIMIZE_FIRST|SFX_VIEW_OPTIMIZE_EACH|  \
                      SFX_VIEW_CAN_PRINT|SFX_VIEW_HAS_PRINTOPTIONS )

/*  */
/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

// erstmal der Zoom-Dialog

class SwPreViewZoomDlg : public SvxStandardDialog
{
    FixedText       aRowLbl;
    NumericField    aRowEdit;
    FixedText       aColLbl;
    NumericField    aColEdit;

    GroupBox        aFrm;
    OKButton        aOkBtn;
    CancelButton    aCancelBtn;
    HelpButton      aHelpBtn;

    virtual void    Apply();

public:
    SwPreViewZoomDlg( SwPagePreViewWin& rParent );
    ~SwPreViewZoomDlg();
};

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


SwPreViewZoomDlg::SwPreViewZoomDlg( SwPagePreViewWin& rParent ) :
    SvxStandardDialog( &rParent, SW_RES(DLG_PAGEPREVIEW_ZOOM) ),
    aColLbl(this,SW_RES(FT_COL)),
    aColEdit(this,SW_RES(ED_COL)),
    aRowLbl(this,SW_RES(FT_ROW)),
    aRowEdit(this,SW_RES(ED_ROW)),
    aFrm(this,SW_RES(GB_PREVIEW)),
    aOkBtn(this,SW_RES(BT_OK)),
    aCancelBtn(this,SW_RES(BT_CANCEL)),
    aHelpBtn(this,SW_RES(BT_HELP))
{
    FreeResource();

    aRowEdit.SetValue( rParent.GetRow() );
    aColEdit.SetValue( rParent.GetCol() );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


 SwPreViewZoomDlg::~SwPreViewZoomDlg() {}


void  SwPreViewZoomDlg::Apply()
{
    ((SwPagePreViewWin*)GetParent())->CalcWish(
                BYTE(aRowEdit.GetValue()),
                BYTE(aColEdit.GetValue()) );
}

/*  */
/* -----------------20.08.98 15:25-------------------
 * Vorschau fuer den Seitendruck
 * --------------------------------------------------*/
struct PrintSettingsStruct;
class PrtPrvWindow : public Window
{
        const PrintSettingsStruct&  rSettings;

        virtual void    Paint(const Rectangle&);
public :
    PrtPrvWindow(Window* pParent, const ResId& rResId, const PrintSettingsStruct&   rSett) :
        Window(pParent, rResId), rSettings(rSett){}
};
/*--------------------------------------------------------------------
    Beschreibung: Optionen fuer das Drucken der Preview
 --------------------------------------------------------------------*/
struct PrintSettingsStruct
{
    Size                aPageMaxSize;   // groesste Seite
    Size                aPrtSize;       // Papiergroesse
    Size                aPrvPrtSize;    // Groesse innerhalb der LRTB-Raender
    Size                aGridSize;      // Groesse fuer jede Seite, enthaelt je
                                        // die Haelfte von H- und V-Distance

    long                nLeft;
    long                nRight;
    long                nTop;
    long                nBottom;
    long                nHori;
    long                nVert;

    USHORT              nRows;
    USHORT              nCols;

    BOOL                bPrinterLandscape;      // Ausrichtung
};

class SwPreviewPrintOptionsDialog : public SvxStandardDialog
{
    GroupBox            aRowColGB;
    FixedText           aRowsFT;
    NumericField        aRowsNF;
    FixedText           aColsFT;
    NumericField        aColsNF;

    GroupBox            aMarginGB;
    FixedText           aLSpaceFT;
    MetricField         aLSpaceMF;
    FixedText           aRSpaceFT;
    MetricField         aRSpaceMF;
    FixedText           aTSpaceFT;
    MetricField         aTSpaceMF;
    FixedText           aBSpaceFT;
    MetricField         aBSpaceMF;
    GroupBox            aDistanceGB;
    FixedText           aHSpaceFT;
    MetricField         aHSpaceMF;
    FixedText           aVSpaceFT;
    MetricField         aVSpaceMF;

    RadioButton         aLandscapeRB;
    RadioButton         aPortraitRB;
    GroupBox            aOrientationGB;

    GroupBox            aPreviewGB;
    PrtPrvWindow        aPreviewWin;

    OKButton            aOkBtn;
    CancelButton        aCancelBtn;
    HelpButton          aHelpBtn;

    PushButton          aStandardPB;

    SwPagePreView&      rPreView;
    PrintSettingsStruct aSettings;
/*  Size                aPageMaxSize;
    Size                aPrtSize;

    BOOL                bOrientation;
*/
    BOOL                bStandard;

    virtual void        Apply();
    void                FillControls(SwPagePreViewPrtData& rData);

            DECL_LINK( ModifyHdl, Edit* );
            DECL_LINK( StandardHdl, PushButton* );

public:
    SwPreviewPrintOptionsDialog(SwPagePreViewWin& rParent, SwPagePreView&   rView);
    ~SwPreviewPrintOptionsDialog();
};

/* -----------------19.08.98 13:35-------------------
 *
 * --------------------------------------------------*/
SwPreviewPrintOptionsDialog::SwPreviewPrintOptionsDialog( SwPagePreViewWin& rParent, SwPagePreView& rView ) :
    SvxStandardDialog( &rParent, SW_RES(DLG_PAGEPREVIEW_PRINTOPTIONS) ),
    aRowColGB(this,SW_RES(  GB_ROWCOL)),
    aRowsFT(this,SW_RES(    FT_ROWS)),
    aRowsNF(this,SW_RES(    NF_ROWS)),
    aColsFT(this,SW_RES(    FT_COLS)),
    aColsNF(this,SW_RES(    NF_COLS)),
    aMarginGB(this,SW_RES(  GB_MARGINS)),
    aLSpaceFT(this,SW_RES(  FT_LMARGIN)),
    aLSpaceMF(this,SW_RES(  MF_LMARGIN)),
    aRSpaceFT(this,SW_RES(  FT_RMARGIN)),
    aRSpaceMF(this,SW_RES(  MF_RMARGIN)),
    aTSpaceFT(this,SW_RES(  FT_TMARGIN)),
    aTSpaceMF(this,SW_RES(  MF_TMARGIN)),
    aBSpaceFT(this,SW_RES(  FT_BMARGIN)),
    aBSpaceMF(this,SW_RES(  MF_BMARGIN)),
    aDistanceGB(this,SW_RES(GB_DISTANCE)),
    aHSpaceFT(this,SW_RES(  FT_HMARGIN)),
    aHSpaceMF(this,SW_RES(  MF_HMARGIN)),
    aVSpaceFT(this,SW_RES(  FT_VMARGIN)),
    aVSpaceMF(this,SW_RES(  MF_VMARGIN)),
    aOrientationGB(this,SW_RES( GB_ORIENTATION)),
    aLandscapeRB(this,SW_RES(   RB_LANDSCAPE)),
    aPortraitRB(this,SW_RES(    RB_PORTRAIT)),
    aPreviewGB(this,SW_RES(     GB_PREVIEW)),
    aPreviewWin(this,SW_RES(    WIN_PREVIEW), aSettings),
    aOkBtn(this,SW_RES(BT_OK)),
    aCancelBtn(this,SW_RES(BT_CANCEL)),
    aHelpBtn(this,SW_RES(BT_HELP)),
    aStandardPB(this,SW_RES(PB_STANDARD)),
    rPreView(rView),
    bStandard(TRUE)
{
    FreeResource();
    ViewShell& rViewSh = rPreView.GetViewShell();
    aSettings.aPageMaxSize = rViewSh.GetPagePreViewPrtMaxSize();
    SfxPrinter*  pPrinter = rViewSh.GetPrt( TRUE );
    aSettings.aPrtSize = pPrinter->GetPaperSize();
    aSettings.bPrinterLandscape = pPrinter->GetOrientation() == ORIENTATION_LANDSCAPE;


    SwDocShell* pDocShell = rPreView.GetDocShell();
    const SwModuleOptions* pModOpt = SW_MOD()->GetModuleConfig();
    FieldUnit eFieldUnit = pModOpt->GetMetric(0 != PTR_CAST(SwWebDocShell, pDocShell));
    ::SetFieldUnit( aLSpaceMF, eFieldUnit );
    ::SetFieldUnit( aRSpaceMF, eFieldUnit );
    ::SetFieldUnit( aTSpaceMF, eFieldUnit );
    ::SetFieldUnit( aBSpaceMF, eFieldUnit );
    ::SetFieldUnit( aHSpaceMF, eFieldUnit );
    ::SetFieldUnit( aVSpaceMF, eFieldUnit );

    SwDoc* pDoc = pDocShell->GetDoc();
    SwPagePreViewPrtData aData;
    if(pDoc->GetPreViewPrtData())
    {
        aData = *pDoc->GetPreViewPrtData();
        bStandard = FALSE;
    }
    else
    {
        // Orientation der PreviewData an den Drucker anpassen
        aData.SetLandscape(aSettings.bPrinterLandscape);
    }
    FillControls(aData);

    aLSpaceMF.SaveValue();
    aRSpaceMF.SaveValue();
    aTSpaceMF.SaveValue();
    aBSpaceMF.SaveValue();
    aHSpaceMF.SaveValue();
    aVSpaceMF.SaveValue();
    aRowsNF.SaveValue();
    aColsNF.SaveValue();
    aLandscapeRB.SaveValue();
    aPortraitRB.SaveValue();

    aStandardPB.SetClickHdl(LINK(this, SwPreviewPrintOptionsDialog, StandardHdl));
    Link aLk = LINK(this, SwPreviewPrintOptionsDialog, ModifyHdl);
    aLSpaceMF.SetUpHdl(aLk);
    aRSpaceMF.SetUpHdl(aLk);
    aTSpaceMF.SetUpHdl(aLk);
    aBSpaceMF.SetUpHdl(aLk);
    aHSpaceMF.SetUpHdl(aLk);
    aVSpaceMF.SetUpHdl(aLk);
    aRowsNF.SetUpHdl(aLk);
    aColsNF.SetUpHdl(aLk);
    aLSpaceMF.SetDownHdl(aLk);
    aRSpaceMF.SetDownHdl(aLk);
    aTSpaceMF.SetDownHdl(aLk);
    aBSpaceMF.SetDownHdl(aLk);
    aHSpaceMF.SetDownHdl(aLk);
    aVSpaceMF.SetDownHdl(aLk);
    aRowsNF.SetDownHdl(aLk);
    aColsNF.SetDownHdl(aLk);
    aLSpaceMF.SetLoseFocusHdl(aLk);
    aRSpaceMF.SetLoseFocusHdl(aLk);
    aTSpaceMF.SetLoseFocusHdl(aLk);
    aBSpaceMF.SetLoseFocusHdl(aLk);
    aHSpaceMF.SetLoseFocusHdl(aLk);
    aVSpaceMF.SetLoseFocusHdl(aLk);
    aRowsNF.SetLoseFocusHdl(aLk);
    aColsNF.SetLoseFocusHdl(aLk);
    aLandscapeRB.SetClickHdl(aLk);
    aPortraitRB.SetClickHdl(aLk);

    ModifyHdl(0);
    if(bStandard)
        StandardHdl(&aStandardPB);
}


/* -----------------19.08.98 13:36-------------------
 *
 * --------------------------------------------------*/
SwPreviewPrintOptionsDialog::~SwPreviewPrintOptionsDialog()
{
}
/* -----------------12.11.98 11:32-------------------
 *
 * --------------------------------------------------*/
void    SwPreviewPrintOptionsDialog::FillControls(SwPagePreViewPrtData& rData)
{
    aLSpaceMF.SetValue(aLSpaceMF.Normalize(rData.GetLeftSpace()  ), FUNIT_TWIP);
    aRSpaceMF.SetValue(aRSpaceMF.Normalize(rData.GetRightSpace() ), FUNIT_TWIP);
    aTSpaceMF.SetValue(aTSpaceMF.Normalize(rData.GetTopSpace()   ), FUNIT_TWIP);
    aBSpaceMF.SetValue(aBSpaceMF.Normalize(rData.GetBottomSpace()), FUNIT_TWIP);
    aHSpaceMF.SetValue(aHSpaceMF.Normalize(rData.GetHorzSpace()  ), FUNIT_TWIP);
    aVSpaceMF.SetValue(aVSpaceMF.Normalize(rData.GetVertSpace()  ), FUNIT_TWIP);
    aRowsNF.SetValue(rData.GetRow());
    aColsNF.SetValue(rData.GetCol());
    aSettings.bPrinterLandscape ? aLandscapeRB.Check() : aPortraitRB.Check();
    // wenn Drucker und Einstellungen nicht uebereinstimmen, dann Seiten tauschen
    if( rData.GetLandscape() != aSettings.bPrinterLandscape )
    {
        Size aTmp(aSettings.aPrtSize.Height(), aSettings.aPrtSize.Width());
        aSettings.aPrtSize = aTmp;
        aSettings.bPrinterLandscape = !aSettings.bPrinterLandscape;
        // nochmal setzen, denn auch wenn nur die Default-Orientierung dem Drucker
        // angepasst wurde, sollen die Einstellungen gespeichert werden
        aSettings.bPrinterLandscape ? aLandscapeRB.Check() : aPortraitRB.Check();
    }
    aLandscapeRB.SaveValue();
    aPortraitRB.SaveValue();

    aSettings.nLeft     = rData.GetLeftSpace()  ;
    aSettings.nRight    = rData.GetRightSpace() ;
    aSettings.nTop      = rData.GetTopSpace()   ;
    aSettings.nBottom   = rData.GetBottomSpace();
    aSettings.nHori     = rData.GetHorzSpace()  ;
    aSettings.nVert     = rData.GetVertSpace()  ;
    aSettings.nRows     = rData.GetRow()        ;
    aSettings.nCols     = rData.GetCol()        ;
    aSettings.aPrvPrtSize = aSettings.aPrtSize  ;
}

/* -----------------19.08.98 14:31-------------------
 *
 * --------------------------------------------------*/
void SwPreviewPrintOptionsDialog::Apply()
{

    SwDoc* pDoc = rPreView.GetDocShell()->GetDoc();
    if(bStandard)
        pDoc->SetPreViewPrtData(0);
    else if(    aLSpaceMF.GetSavedValue() != aLSpaceMF.GetText() ||
        aRSpaceMF.GetSavedValue() != aRSpaceMF.GetText() ||
        aTSpaceMF.GetSavedValue() != aTSpaceMF.GetText() ||
        aBSpaceMF.GetSavedValue() != aBSpaceMF.GetText() ||
        aHSpaceMF.GetSavedValue() != aHSpaceMF.GetText() ||
        aVSpaceMF.GetSavedValue() != aVSpaceMF.GetText() ||
        aRowsNF.GetSavedValue() != aRowsNF.GetText() ||
        aColsNF.GetSavedValue() != aColsNF.GetText() ||
        aLandscapeRB.GetSavedValue() != aLandscapeRB.IsChecked() ||
        aPortraitRB.GetSavedValue() != aPortraitRB.IsChecked() )
    {
        SwPagePreViewPrtData aData;
        if(pDoc->GetPreViewPrtData())
            aData = *pDoc->GetPreViewPrtData();
        aData.SetLeftSpace(aLSpaceMF.Denormalize(aLSpaceMF.GetValue(FUNIT_TWIP)));
        aData.SetRightSpace(aRSpaceMF.Denormalize(aRSpaceMF.GetValue(FUNIT_TWIP)));
        aData.SetTopSpace(aTSpaceMF.Denormalize(aTSpaceMF.GetValue(FUNIT_TWIP)));
        aData.SetBottomSpace(aBSpaceMF.Denormalize(aBSpaceMF.GetValue(FUNIT_TWIP)));

        aData.SetHorzSpace(aHSpaceMF.Denormalize(aHSpaceMF.GetValue(FUNIT_TWIP)));
        aData.SetVertSpace(aVSpaceMF.Denormalize(aVSpaceMF.GetValue(FUNIT_TWIP)));
        aData.SetRow(aRowsNF.GetValue());
        aData.SetCol(aColsNF.GetValue());
        aData.SetLandscape(aLandscapeRB.IsChecked());

        ViewShell& rViewSh = rPreView.GetViewShell();
        SfxPrinter*  pPrinter = rViewSh.GetPrt( TRUE );
        if((pPrinter->GetOrientation() == ORIENTATION_LANDSCAPE)
                        != aData.GetLandscape())
                    pPrinter->SetOrientation(aData.GetLandscape() ? ORIENTATION_LANDSCAPE : ORIENTATION_PORTRAIT);


        pDoc->SetPreViewPrtData(&aData);

    }
}
/* -----------------20.08.98 08:48-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK( SwPreviewPrintOptionsDialog, ModifyHdl, Edit*, pEdit )
{
    if(bStandard && pEdit)
    {
        aLSpaceMF.SetUserValue(aLSpaceMF.GetValue());
        aRSpaceMF.SetUserValue(aRSpaceMF.GetValue());
        aTSpaceMF.SetUserValue(aTSpaceMF.GetValue());
        aBSpaceMF.SetUserValue(aBSpaceMF.GetValue());
        aHSpaceMF.SetUserValue(aHSpaceMF.GetValue());
        aVSpaceMF.SetUserValue(aVSpaceMF.GetValue());
        aRowsNF.  SetUserValue(aRowsNF  .GetValue());
        aColsNF.  SetUserValue(aColsNF  .GetValue());

        bStandard = FALSE;
    }
    BOOL bOrientChanged = aSettings.bPrinterLandscape != aLandscapeRB.IsChecked();;
    if(pEdit == &aLSpaceMF)
        aSettings.nLeft     = aLSpaceMF.Denormalize(aLSpaceMF.GetValue(FUNIT_TWIP));
    else if(pEdit == &aRSpaceMF)
        aSettings.nRight    = aRSpaceMF.Denormalize(aRSpaceMF.GetValue(FUNIT_TWIP));
    else if(pEdit == &aTSpaceMF)
        aSettings.nTop      = aTSpaceMF.Denormalize(aTSpaceMF.GetValue(FUNIT_TWIP));
    else if(pEdit == &aBSpaceMF)
        aSettings.nBottom   = aBSpaceMF.Denormalize(aBSpaceMF.GetValue(FUNIT_TWIP));
    else if(pEdit == &aHSpaceMF)
        aSettings.nHori     = aHSpaceMF.Denormalize(aHSpaceMF.GetValue(FUNIT_TWIP));
    else if(pEdit == &aVSpaceMF)
        aSettings.nVert     = aVSpaceMF.Denormalize(aVSpaceMF.GetValue(FUNIT_TWIP));
    else if(pEdit == &aRowsNF)
        aSettings.nRows     = aRowsNF.GetValue();
    else if(pEdit == &aColsNF)
        aSettings.nCols     = aColsNF.GetValue();
    else if(pEdit == (Edit*)&aLandscapeRB)
        aSettings.bPrinterLandscape = aLandscapeRB.IsChecked();
    else if(pEdit == (Edit*)&aPortraitRB)
        aSettings.bPrinterLandscape = aLandscapeRB.IsChecked();

    if(bOrientChanged)
    {
        Size aTmp(aSettings.aPrtSize.Height(), aSettings.aPrtSize.Width());
        aSettings.aPrtSize = aTmp;
    }


    aSettings.aPrvPrtSize = Size(aSettings.aPrtSize.Width()  - aSettings.nRight - aSettings.nLeft,
                            aSettings.aPrtSize.Height() - aSettings.nTop - aSettings.nBottom);
    aSettings.aGridSize = Size(aSettings.aPrvPrtSize.Width() / aSettings.nCols,
                                aSettings.aPrvPrtSize.Height() / aSettings.nRows    );
    // was fehlt noch: Orientation auswerten, minimalrand ausrechnen, Beispiel fuettern


    //am Ende Maximalwerte setzen
    long n20Percent = aSettings.aPrtSize.Width() / 5;
    aLSpaceMF.SetMax(aLSpaceMF.Normalize(aSettings.aPrtSize.Width() - aSettings.nRight - n20Percent), FUNIT_TWIP);
    aRSpaceMF.SetMax(aRSpaceMF.Normalize(aSettings.aPrtSize.Width() - aSettings.nLeft - n20Percent), FUNIT_TWIP);
    n20Percent = aSettings.aPrtSize.Height() / 5;
    aTSpaceMF.SetMax(aTSpaceMF.Normalize(aSettings.aPrtSize.Height() - aSettings.nBottom - n20Percent), FUNIT_TWIP);
    aBSpaceMF.SetMax(aBSpaceMF.Normalize(aSettings.aPrtSize.Height() - aSettings.nTop - n20Percent), FUNIT_TWIP);

    long n80Percent = aSettings.aPrvPrtSize.Width() * 4 / 5;
    aHSpaceMF.SetMax(aHSpaceMF.Normalize(n80Percent / aSettings.nRows), FUNIT_TWIP);
    n80Percent = aSettings.aPrvPrtSize.Height()* 4 / 5;
    aVSpaceMF.SetMax(aVSpaceMF.Normalize(n80Percent / aSettings.nCols), FUNIT_TWIP);
    aHSpaceMF.Enable(aSettings.nCols > 1);
    aVSpaceMF.Enable(aSettings.nRows > 1);
    aRowsNF.SetMin(1);// nur damit auch nach Standard wieder der Inhalt angezeigt wird
    aColsNF.SetMin(1);


    aPreviewWin.Invalidate();
    return 0;
}
/* -----------------28.08.98 14:59-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK( SwPreviewPrintOptionsDialog, StandardHdl, PushButton*, EMPTYARG )
{
    SetUpdateMode(TRUE);
    SwPagePreViewPrtData aData;
    FillControls(aData);
    bStandard = TRUE;
    aLSpaceMF.SetText(aEmptyStr);
    aRSpaceMF.SetText(aEmptyStr);
    aTSpaceMF.SetText(aEmptyStr);
    aBSpaceMF.SetText(aEmptyStr);
    aHSpaceMF.SetText(aEmptyStr);
    aVSpaceMF.SetText(aEmptyStr);
    aRowsNF.SetText(aEmptyStr);
    aColsNF.SetText(aEmptyStr);
    aPreviewWin.Invalidate();
    SetUpdateMode(FALSE);
    return 0;
}
/* -----------------20.08.98 15:28-------------------
 * Preview anzeigen
 * --------------------------------------------------*/
void    PrtPrvWindow::Paint(const Rectangle&)
{
/*
 struct PrintSettingsStruct
{
    Size                aPageMaxSize;   // groesste Seite
    Size                aPrtSize;       // Papiergroesse
    Size                aPrvPrtSize;    // Groesse innerhalb der LRTB-Raender
    Size                aGridSize;      // Groesse fuer jede Seite, enthaelt je
                                        // die Haelfte von H- und V-Distance

    long                nLeft;
    long                nRight;
    long                nTop;
    long                nBottom;
    long                nHori;
    long                nVert;

    USHORT              nRows;
    USHORT              nCols;

    BOOL                bOrientation;       // Ausrichtung
};

 * */
//  Size aWinSize(GetOutputSizePixel());
//  //MapMode aMode(GetMapMode());
//  MapMode aMode(MAP_TWIP, Point(0,0), Fraction(1,10 ), Fraction( 1,10 ));
//  SetMapMode(aMode);
//  Size aWinLogSize(GetOutputSize());

        Size aWinSize(GetOutputSizePixel());
        long nWidth = rSettings.aPrtSize.Width();
        long nHeight = rSettings.aPrtSize.Height();
        BOOL bHoriValid = (aWinSize.Width() * 100 / aWinSize.Height()) <
                    (rSettings.aPrtSize.Width() * 100/ rSettings.aPrtSize.Height());
        Fraction aXScale( aWinSize.Width(),
                            max( nWidth , 1 ) );
        Fraction aYScale( aWinSize.Height(), max( nHeight, 1 ) );
        MapMode aMapMode( GetMapMode() );
        aMapMode.SetScaleX( bHoriValid ? aXScale : aYScale);
        aMapMode.SetScaleY( bHoriValid ? aXScale : aYScale);
        SetMapMode( aMapMode );

        aWinSize = GetOutputSize();

        Point aOffset(0,0);
        if(bHoriValid)
            aOffset.Y() = (aWinSize.Height() - rSettings.aPrtSize.Height()) / 2;
        else
            aOffset.X() = (aWinSize.Width() - rSettings.aPrtSize.Width()) / 2;;

        //der weisse Seitenhintergrund
        Rectangle aRect(aOffset, rSettings.aPrtSize);
        SetFillColor( Color( COL_WHITE ) );
        SetLineColor(Color( COL_BLACK ) );
        DrawRect(aRect);

        Point aTL(aOffset);
        aTL.X() += rSettings.nLeft;
        aTL.Y() += rSettings.nTop;

        Size aPrvPageSize((rSettings.aPrvPrtSize.Width() - (rSettings.nCols - 1) * rSettings.nHori) / rSettings.nCols,
            (rSettings.aPrvPrtSize.Height() - (rSettings.nRows - 1) * rSettings.nVert) / rSettings.nRows);
        // jetzt muss noch das unterschiedliche Groessenverhaeltnis berechnet werden, um es an
        // der richtigen Seite abzuziehen.
        //...
        long nSourceScale = rSettings.aPageMaxSize.Width() * 100 / rSettings.aPageMaxSize.Height();
        long nDestScale = aPrvPageSize.Width() * 100  / aPrvPageSize.Height() ;
        if(nSourceScale > nDestScale) // die Seite ist relativ breiter als das vorhandene Rechteck
        {
            aPrvPageSize.Height() = aPrvPageSize.Width() * 100 / nSourceScale;
        }
        else
        {
            aPrvPageSize.Width() = aPrvPageSize.Height() * nSourceScale / 100;
        }

        SetFillColor( Color( COL_GRAY ) );
        aRect = Rectangle(aTL, aPrvPageSize);
        for(USHORT i = 0; i < rSettings.nRows; i++)
        {
            for(USHORT j = 0; j < rSettings.nCols; j++)
            {
                DrawRect(aRect);
                aRect.Move(aPrvPageSize.Width() + rSettings.nHori, 0);
            }

            aRect.Move( 0, aPrvPageSize.Height() + rSettings.nVert);
            aRect.SetPos(Point(aTL.X(), aRect.TopLeft().Y()));
        }
    //rSettings;
}

/*  */
/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

// alles fuers SwPagePreViewWin


SwPagePreViewWin::SwPagePreViewWin( Window *pParent, SwPagePreView& rPView )
    : Window( pParent, WinBits( WB_CLIPCHILDREN) ),
    pViewShell( 0 ),
    rView( rPView )
{
    SetHelpId(HID_PAGEPREVIEW);
    SetFillColor( GetBackground().GetColor() );
    SetLineColor( GetBackground().GetColor());
    SetMapMode( MapMode(MAP_TWIP) );

    const SwMasterUsrPref *pUsrPref = SW_MOD()->GetUsrPref(FALSE);
    nRow = pUsrPref->GetPagePrevRow();      // 1 Zeile
    nCol = pUsrPref->GetPagePrevCol();      // 1 Spalte
    nVirtPage = nSttPage = USHRT_MAX;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


SwPagePreViewWin::~SwPagePreViewWin()
{
    if( pViewShell )
        delete pViewShell;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void  SwPagePreViewWin::Paint( const Rectangle& rRect )
{
    if( !pViewShell || !pViewShell->GetLayout() )
        return;

    USHORT nRowCol = ( nRow << 8 ) + nCol;
    if( USHRT_MAX == nSttPage )     // wurde noch nie berechnet ? (Init-Phase!)
    {
        // das ist die Size, auf die ich mich immer beziehe
        if( !aWinSize.Height() || !aWinSize.Width() )
            aWinSize = GetOutputSizePixel();

        Rectangle aRect( LogicToPixel( rRect ));
        nSttPage = pViewShell->CalcPreViewPage( aWinSize, nRowCol,
                                                0, aPgSize, nVirtPage );
        pViewShell->PreViewPage( PixelToLogic( aRect ), nRowCol, nSttPage,
                                    aPgSize );
        nRow = BYTE( nRowCol >> 8 );
        nCol = BYTE( nRowCol & 0xff );
        SetPagePreview(nRow, nCol);
        aScale = GetMapMode().GetScaleX();
    }
    else
    {
        MapMode aMM( GetMapMode() );
        aMM.SetScaleX( aScale );
        aMM.SetScaleY( aScale );
        SetMapMode( aMM );
        pViewShell->PreViewPage( rRect, nRowCol, nSttPage, aPgSize );
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwPagePreViewWin::CalcWish( BYTE nNewRow, BYTE nNewCol )
{
    if( !pViewShell || !pViewShell->GetLayout() )
        return;

    USHORT nOldCol = nCol;
    USHORT nRowCol = ( nNewRow << 8 ) + nNewCol;    // Zeilen / Spalten
    USHORT nPages = nNewRow * nNewCol,
           nLastSttPg = rView.GetPageCount()+1 > nPages
                            ? rView.GetPageCount()+1 - nPages : 0;
    if( nSttPage > nLastSttPg )
        nSttPage = nLastSttPg;

    nSttPage = pViewShell->CalcPreViewPage( aWinSize, nRowCol, nSttPage,
                                            aPgSize, nVirtPage );
    nRow = BYTE( nRowCol >> 8 );
    nCol = BYTE( nRowCol & 0xff );
    SetPagePreview(nRow, nCol);
    aScale = GetMapMode().GetScaleX();

    // falls an der Spaltigkeit gedreht wurde, so muss der Sonderfall
    // Einspaltig beachtet und ggfs. der Scrollbar korrigiert werden
    if( (1 == nOldCol) ^ (1 == nCol) )
        rView.VScrollDocSzChg();

    // Sortierung muss eingehalten werden!!
    static USHORT __READONLY_DATA aInval[] =
    {
        SID_ATTR_ZOOM,
        FN_START_OF_DOCUMENT, FN_END_OF_DOCUMENT, FN_PAGEUP, FN_PAGEDOWN,
        FN_SHOW_TWO_PAGES, FN_SHOW_FOUR_PAGES,
        0
    };
#ifndef PRODUCT
    {
        const USHORT* pPtr = aInval + 1;
        do {
            ASSERT( *(pPtr - 1) < *pPtr, "falsche Sortierung!" );
        } while( *++pPtr );
    }
#endif
    SfxBindings& rBindings = rView.GetViewFrame()->GetBindings();
    rBindings.Invalidate( aInval );
    rBindings.Update( FN_SHOW_TWO_PAGES );
    rBindings.Update( FN_SHOW_FOUR_PAGES );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


int SwPagePreViewWin::MovePage( int eMoveMode )
{
    // soviele Seiten hoch
    USHORT nPages = nRow * nCol;
    USHORT nNewSttPage = nSttPage;
    USHORT nPageCount = rView.GetPageCount() + 1;
    USHORT nDefSttPg = GetDefSttPage();
    USHORT nLastSttPg = nPageCount > nPages ? nPageCount - nPages : nDefSttPg;

    switch( eMoveMode )
    {
    case MV_PAGE_UP:    nNewSttPage = nSttPage > nPages
                                            ? nSttPage - nPages : nDefSttPg;
                        break;
    case MV_PAGE_DOWN:  nNewSttPage = nSttPage + nPages;
                        if( nNewSttPage > nLastSttPg )
                            nNewSttPage = nLastSttPg;
                        break;
    case MV_DOC_STT:    nNewSttPage = nDefSttPg;
                        break;
    case MV_DOC_END:    nNewSttPage = nLastSttPg;
                        break;
    default:

        if( nNewSttPage > nLastSttPg )
            nNewSttPage = nLastSttPg;
        break;
    }

    Size aSave( aPgSize );
    USHORT nRowCol = ( nRow << 8 ) + nCol;  // Zeilen / DoppelSeiten
    nNewSttPage = pViewShell->CalcPreViewPage( aWinSize, nRowCol,
                                            nNewSttPage, aPgSize, nVirtPage );
    if( nNewSttPage == nSttPage && aPgSize == aSave )
        return FALSE;

    nRow = BYTE( nRowCol >> 8 );
    nCol = BYTE( nRowCol & 0xff );
    SetPagePreview(nRow, nCol);
    nSttPage = nNewSttPage;
    aScale = GetMapMode().GetScaleX();

    static USHORT __READONLY_DATA aInval[] =
    {
        FN_START_OF_DOCUMENT, FN_END_OF_DOCUMENT, FN_PAGEUP, FN_PAGEDOWN, 0
    };
#ifndef PRODUCT
    {
        const USHORT* pPtr = aInval + 1;
        do {
            ASSERT( *(pPtr - 1) < *pPtr, "falsche Sortierung!" );
        } while( *++pPtr );
    }
#endif

    SfxBindings& rBindings = rView.GetViewFrame()->GetBindings();
    rBindings.Invalidate( aInval );
//  rBindings.Update( FN_SHOW_TWO_PAGES );
//  rBindings.Update( FN_SHOW_FOUR_PAGES );

    return TRUE;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwPagePreViewWin::SetWinSize( const Size& rNewSize )
{
    // die Size wollen wir aber immer in Pixel-Einheiten haben
    aWinSize = LogicToPixel( rNewSize );
    USHORT nRowCol = ( nRow << 8 ) + nCol;  // Zeilen / DoppelSeiten

    if( USHRT_MAX == nSttPage )
        nSttPage = GetDefSttPage();
    nSttPage = pViewShell->CalcPreViewPage( aWinSize, nRowCol,
                                            nSttPage, aPgSize,
                                            nVirtPage );
    nRow = BYTE( nRowCol >> 8 );
    nCol = BYTE( nRowCol & 0xff );
    SetPagePreview(nRow, nCol);
    aScale = GetMapMode().GetScaleX();
}


/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwPagePreViewWin::GetStatusStr( String& rStr, USHORT nPageCnt ) const
{
    // Logische Seite gegebenenfalls davor haengen
    USHORT nStt = nSttPage > 1 ? nSttPage : 1;
    if( nVirtPage && nVirtPage != nStt )
    {
        rStr += String::CreateFromInt32( nVirtPage );
        rStr += ' ';
    }
    rStr += String::CreateFromInt32( nStt );
    rStr.AppendAscii( RTL_CONSTASCII_STRINGPARAM(" / "));
    rStr += String::CreateFromInt32( nPageCnt );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void  SwPagePreViewWin::KeyInput( const KeyEvent &rKEvt )
{
    //Defaultbehandlung Keyboard
    if( !rView.KeyInput( rKEvt ) )
        Window::KeyInput( rKEvt );
}

/******************************************************************************
 *  Beschreibung:
 ******************************************************************************/

void SwPagePreViewWin::Command( const CommandEvent& rCEvt )
{
    BOOL bCallBase = TRUE;
    switch( rCEvt.GetCommand() )
    {
    case COMMAND_CONTEXTMENU:
        rView.GetViewFrame()->GetDispatcher()->ExecutePopup();
        bCallBase = FALSE;
        break;

    case COMMAND_WHEEL:
    case COMMAND_STARTAUTOSCROLL:
    case COMMAND_AUTOSCROLL:
        bCallBase = !rView.HandleWheelCommands( rCEvt );
        break;

    default:    ASSERT( !this, "unknown command." );
    }

    if( bCallBase )
        Window::Command( rCEvt );
}

void SwPagePreViewWin::MouseButtonDown( const MouseEvent& rMEvt )
{
    if( MOUSE_LEFT == ( rMEvt.GetModifier() + rMEvt.GetButtons() ) &&
        2 == rMEvt.GetClicks() )
    {
        Point aDocPos( PixelToLogic( rMEvt.GetPosPixel() ) );

        // was habe wir denn hier getroffen??
        USHORT nRowCol = ( nRow << 8 ) + nCol;  // Zeilen / DoppelSeiten
        BOOL bDocPos = pViewShell->IsPreViewDocPos( aDocPos, nRowCol,
                                                    nSttPage, aPgSize );

        if( bDocPos )           // dann kann man ja umschalten
        {
            String sNewCrsrPos( String::CreateFromInt32( aDocPos.X() ));
            ((( sNewCrsrPos += ';' )
                            += String::CreateFromInt32( aDocPos.Y() )) )
                            += ';';
            rView.SetNewCrsrPos( sNewCrsrPos );

            SfxViewFrame *pTmpFrm = rView.GetViewFrame();
            pTmpFrm->GetBindings().Execute( SID_VIEWSHELL0, NULL, 0,
                                                    SFX_CALLMODE_ASYNCHRON );
        }
    }
}

/******************************************************************************
 *  Beschreibung: Userprefs bzw Viewoptions setzen
 ******************************************************************************/


void SwPagePreViewWin::SetPagePreview( BYTE nRow, BYTE nCol )
{
    SwMasterUsrPref *pOpt = (SwMasterUsrPref *)SW_MOD()->GetUsrPref(FALSE);

    if (nRow != pOpt->GetPagePrevRow() || nCol != pOpt->GetPagePrevCol())
    {
        pOpt->SetPagePrevRow( nRow );
        pOpt->SetPagePrevCol( nCol );
        pOpt->SetModified();
        pOpt->SetDefault( FALSE );

        //VScrollbar updaten!
        if( rView.StatVScrollbar() )
            rView.VScrollViewSzChg();
    }
}

void SwPagePreViewWin::DataChanged( const DataChangedEvent& )
{
    rView.InvalidateBorder();               //Scrollbarbreiten
    rView.GetDocShell()->UpdateFontList();  //Fontwechsel
    if ( pViewShell->GetWin() )
        pViewShell->GetWin()->Invalidate();
}


/*  */
/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


// dann mal alles fuer die SwPagePreView


void  SwPagePreView::Execute( SfxRequest &rReq )
{
    int eMvMode;
    BYTE nRow = 1;
    BOOL bRetVal = FALSE, bRefresh = TRUE;

    USHORT nSttPage = aViewWin.GetSttPage(),
            nPages = aViewWin.GetRow() * aViewWin.GetCol(),
            nLineSz = 1 < nPages ? nPages / 2 : 1,
            nLastSttPg = nPageCount+1 > nPages ? nPageCount+1 - nPages : 0,
            nDefSttPg = aViewWin.GetDefSttPage();

    switch(rReq.GetSlot())
    {
        case FN_REFRESH_VIEW:
        case FN_STAT_PAGE:
        case FN_STAT_ZOOM:
            break;

        case FN_SHOW_FOUR_PAGES:
            nRow = 2;
            // keine break;

        case FN_SHOW_TWO_PAGES:
            aViewWin.CalcWish( nRow, 2 );
            break;

        case FN_PREVIEW_ZOOM:
        case SID_ATTR_ZOOM:
        {
            const SfxItemSet *pArgs = rReq.GetArgs();
            if( pArgs && pArgs->Count() >= 2 )
            {

                USHORT nCols = ((SfxUInt16Item &)pArgs->Get(SID_ATTR_TABLE_COLUMN)).GetValue();
                USHORT nRows = ((SfxUInt16Item &)pArgs->Get(SID_ATTR_TABLE_ROW)).GetValue();
                aViewWin.CalcWish( nRows, nCols );
            }
            else
                SwPreViewZoomDlg( aViewWin ).Execute();
        }
        break;

        case FN_CHAR_LEFT:
            if( nDefSttPg == nSttPage-- )
            {
                bRefresh = FALSE;
                break;
            }
            aViewWin.SetSttPage( nSttPage );
            eMvMode = SwPagePreViewWin::MV_CALC;        goto MOVEPAGE;

        case FN_CHAR_RIGHT:
            if( //aViewWin.GetRow() * aViewWin.GetCol() >= nPageCount ||
                nLastSttPg == nSttPage++ )
            {
                bRefresh = FALSE;
                break;
            }
            aViewWin.SetSttPage( nSttPage );
            eMvMode = SwPagePreViewWin::MV_CALC;        goto MOVEPAGE;

        case FN_LINE_UP:
        case FN_LINE_DOWN:
//???       if( !nSttPage &&  1 < nLineSz )
//              --nLineSz;

            if( FN_LINE_UP == rReq.GetSlot() )
            {
                if( nSttPage > nLineSz )
                    nSttPage -= nLineSz;
                else
                    nSttPage = nDefSttPg;
            }
            else
            {
                if( nSttPage + nLineSz <= nLastSttPg )
                    nSttPage += nLineSz;
                else
                    nSttPage = nLastSttPg;
            }

            if( nSttPage == aViewWin.GetSttPage() )
            {
                // keine Aenderung
                bRefresh = FALSE;
                break;
            }

            aViewWin.SetSttPage( nSttPage );
            eMvMode = SwPagePreViewWin::MV_CALC;        goto MOVEPAGE;

        case FN_PAGEUP:
            eMvMode = SwPagePreViewWin::MV_PAGE_UP;     goto MOVEPAGE;
        case FN_PAGEDOWN:
            eMvMode = SwPagePreViewWin::MV_PAGE_DOWN;   goto MOVEPAGE;

        case FN_START_OF_DOCUMENT:
            eMvMode = SwPagePreViewWin::MV_DOC_STT; bRetVal = TRUE; goto MOVEPAGE;
        case FN_END_OF_DOCUMENT:
            eMvMode = SwPagePreViewWin::MV_DOC_END; bRetVal = TRUE; goto MOVEPAGE;
MOVEPAGE:
            {
                int nRet = ChgPage( eMvMode, TRUE );
                // return value fuer Basic
                if(bRetVal)
                    rReq.SetReturnValue(SfxBoolItem(rReq.GetSlot(), nRet == 0));

                bRefresh = 0 != nRet;
            }
            break;

        case FN_PRINT_PAGEPREVIEW:
        {
            const SwPagePreViewPrtData* pPPVPD = aViewWin.GetViewShell()->GetDoc()->GetPreViewPrtData();
            // die Sache mit der Orientation
            if(pPPVPD)
            {
                SfxPrinter* pPrinter = GetPrinter();
                if((pPrinter->GetOrientation() == ORIENTATION_LANDSCAPE)
                        != pPPVPD->GetLandscape())
                    pPrinter->SetOrientation(pPPVPD->GetLandscape() ? ORIENTATION_LANDSCAPE : ORIENTATION_PORTRAIT);
            }
            ::SetAppPrintOptions( aViewWin.GetViewShell(), FALSE );
            bNormalPrint = FALSE;
            USHORT nPrtSlot = SID_PRINTDOC;
            rReq.SetSlot( nPrtSlot );
            SfxViewShell::ExecuteSlot( rReq, SfxViewShell::GetInterface() );
            rReq.SetSlot( FN_PRINT_PAGEPREVIEW );
            return;
        }
        case FN_PREVIEW_PRINT_OPTIONS :
        {
            SwPreviewPrintOptionsDialog aDlg(aViewWin, *this);
            aDlg.Execute();
        }
        break;
        case SID_PRINTDOCDIRECT:
        case SID_PRINTDOC:
            ::SetAppPrintOptions( aViewWin.GetViewShell(), FALSE );
            bNormalPrint = TRUE;
            SfxViewShell::ExecuteSlot( rReq, SfxViewShell::GetInterface() );
            return;
        case SID_PRINTPREVIEW:
            //  print preview is now always in the same frame as the tab view
            //  -> always switch this frame back to normal view
            //  (ScTabViewShell ctor reads stored view data)
            GetViewFrame()->GetBindings().Execute( SID_VIEWSHELL0, NULL, 0,
                                                    SFX_CALLMODE_ASYNCHRON );
            break;
        default:
            ASSERT(!this, falscher Dispatcher);
            return;
    }

    if( bRefresh )
        aViewWin.Invalidate();
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void  SwPagePreView::GetState( SfxItemSet& rSet )
{
    SfxWhichIter aIter(rSet);
    BYTE nRow = 1;
    USHORT nWhich = aIter.FirstWhich();
    ASSERT(nWhich, leeres Set);

    while(nWhich)
    {
        switch(nWhich)
        {
        case FN_START_OF_DOCUMENT:
        case FN_PAGEUP:
            if( aViewWin.GetSttPage() == aViewWin.GetDefSttPage() )
                rSet.DisableItem(nWhich);
            break;

        case FN_PAGEDOWN:
        case FN_END_OF_DOCUMENT:
            {
                USHORT nNextPg = ( aViewWin.GetRow() * aViewWin.GetCol() ) +
                                aViewWin.GetSttPage() - 1;

                if( nNextPg >= nPageCount )
                    rSet.DisableItem( nWhich );
            }
            break;

        case FN_STAT_PAGE:
            {
                String aStr( sPageStr );
                aViewWin.GetStatusStr( aStr, nPageCount );
                rSet.Put( SfxStringItem( nWhich, aStr) );
            }
            break;

        case SID_ATTR_ZOOM:
        case FN_STAT_ZOOM:
            {
                String aStr( String::CreateFromInt32( aViewWin.GetRow() ) );
                (aStr += 'x') += String::CreateFromInt32( aViewWin.GetCol() );
                rSet.Put( SfxStringItem( nWhich, aStr) );
            }
            break;

        case FN_SHOW_FOUR_PAGES:
            nRow = 2;
            // kein break;

        case FN_SHOW_TWO_PAGES:
            if( 2 == aViewWin.GetCol() && nRow == aViewWin.GetRow() )
                rSet.DisableItem( nWhich );
            break;

        case FN_PRINT_PAGEPREVIEW:
            // hat den gleichen Status wie das normale Drucken
            {
                const SfxPoolItem* pItem;
                SfxItemSet aSet( *rSet.GetPool(), SID_PRINTDOC, SID_PRINTDOC );
                GetSlotState( SID_PRINTDOC, SfxViewShell::GetInterface(), &aSet );
                if( SFX_ITEM_SET == aSet.GetItemState( SID_PRINTDOC,
                        FALSE, &pItem ))
                {
                    ((SfxPoolItem*)pItem)->SetWhich( FN_PRINT_PAGEPREVIEW );
                    rSet.Put( *pItem );
                }
            }
            break;

        case SID_PRINTPREVIEW:
            rSet.Put( SfxBoolItem( nWhich, TRUE ) );
            break;

        case SID_PRINTDOC:
        case SID_PRINTDOCDIRECT:
            GetSlotState( nWhich, SfxViewShell::GetInterface(), &rSet );
            break;
        }
        nWhich = aIter.NextWhich();
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void  SwPagePreView::StateUndo(SfxItemSet& rSet)
{
    SfxWhichIter aIter(rSet);
    USHORT nWhich = aIter.FirstWhich();

    while (nWhich)
    {
        rSet.DisableItem(nWhich);
        nWhich = aIter.NextWhich();
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwPagePreView::Init(const SwViewOption * pPrefs)
{
    if ( GetViewShell().HasDrawView() )
        GetViewShell().GetDrawView()->SetAnimationEnabled( FALSE );

    bNormalPrint = TRUE;

    // Die DocSize erfragen und verarbeiten. Ueber die Handler konnte
    // die Shell nicht gefunden werden, weil die Shell innerhalb CTOR-Phase
    // nicht in der SFX-Verwaltung bekannt ist.

    if( !pPrefs )
        pPrefs = SW_MOD()->GetUsrPref(FALSE);

    // die Felder aktualisieren
    // ACHTUNG: hochcasten auf die EditShell, um die SS zu nutzen.
    //          In den Methoden wird auf die akt. Shell abgefragt!
    SwEditShell* pESh = (SwEditShell*)&GetViewShell();
    BOOL bIsModified = pESh->IsModified();


    SwViewOption aOpt( *pPrefs );
    aOpt.SetTab( FALSE );
    aOpt.SetBlank( FALSE );
    aOpt.SetHardBlank( FALSE );
    aOpt.SetParagraph( FALSE );
    aOpt.SetLineBreak( FALSE );
    aOpt.SetPageBreak( FALSE );
    aOpt.SetColumnBreak( FALSE );
    aOpt.SetSoftHyph( FALSE );
    aOpt.SetTox( FALSE );
    aOpt.SetRef( FALSE );
    aOpt.SetFldName( FALSE );
    aOpt.SetField( FALSE );
    aOpt.SetFootNote( FALSE );
    aOpt.SetPostIts( FALSE );
    aOpt.SetHidden( FALSE );
    aOpt.SetSubsLines( FALSE );
    aOpt.SetViewVLin( FALSE );
    aOpt.SetViewTabwin( FALSE );
    aOpt.SetGraphic( TRUE );
    aOpt.SetTable( TRUE );
    aOpt.SetSubsTable( FALSE );
    aOpt.SetSnap( FALSE );
    aOpt.SetGridVisible( FALSE );
    aOpt.SetHideSpell( TRUE );
    aOpt.SetIndexBackground( FALSE );
    aOpt.SetSectionBounds( FALSE );
    GetViewShell().ApplyViewOptions( aOpt );

    if( pESh->GetDoc()->IsBrowseMode() )
    {
        pESh->GetDoc()->SetBrowseMode( FALSE );
        pESh->CheckBrowseView( TRUE );
    }

    pESh->GetPrt( TRUE );

    GetViewShell().CalcLayout();
    DocSzChgd( GetViewShell().GetDocSize() );

    if( !bIsModified )
        pESh->ResetModified();

    if(pPrefs->IsViewVScrollBar())
        CreateVScrollbar();
    if(pPrefs->IsViewHScrollBar())
        CreateHScrollbar();
}


/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


SwPagePreView::SwPagePreView(SfxViewFrame *pFrame, SfxViewShell* pOldSh):
    SfxViewShell( pFrame, SWVIEWFLAGS ),
    aViewWin( &pFrame->GetWindow(), *this ),
    pHScrollbar(0),
    pVScrollbar(0),
    pPageUpBtn(0),
    pPageDownBtn(0),
    pScrollFill(0),
    sPageStr( SW_RES(STR_PAGE) ),
    nPageCount( 0 )
{
    SetName(String::CreateFromAscii("PageView" ));
    SetWindow( &aViewWin );
    SetHelpId(SW_PAGEPREVIEW);

    SfxObjectShell* pObjShell = pFrame->GetObjectShell();
    if ( !pOldSh )
    {
        //Gibt es schon eine Sicht auf das Dokument?
        SfxViewFrame *pF = SfxViewFrame::GetFirst( pObjShell );
        if ( pF == pFrame )
            pF = SfxViewFrame::GetNext( *pF, pObjShell );
        if ( pF )
            pOldSh = pF->GetViewShell();
    }

    ViewShell *pVS, *pNew;

    if( pOldSh && pOldSh->IsA( TYPE( SwPagePreView ) ) )
        pVS = &((SwPagePreView*)pOldSh)->GetViewShell();
    else
    {
        if( pOldSh && pOldSh->IsA( TYPE( SwView ) ) )
        {
            pVS = ((SwView*)pOldSh)->GetWrtShellPtr();
            // save the current ViewData of the previous SwView
            pOldSh->WriteUserData( sSwViewData, FALSE );
        }
        else
            pVS = GetDocShell()->GetWrtShell();
        if( pVS )
        {
            // setze die akt. Seite als die erste
            USHORT nPhysPg, nVirtPg;
            ((SwCrsrShell*)pVS)->GetPageNum( nPhysPg, nVirtPg, /*FALSE*/TRUE, FALSE );
            if( 1 != aViewWin.GetCol() && 1 == nPhysPg )
                --nPhysPg;
            aViewWin.SetSttPage( nPhysPg );
        }
    }

    if( pVS )
        pNew = new ViewShell( pVS, &aViewWin, 0, VSHELLFLAG_ISPREVIEW );
    else
    {
        SwDoc* pDoc = ((SwDocShell*)pFrame->GetObjectShell())->GetDoc();
        pNew = new ViewShell( pDoc, ::GetSpellChecker(), ::GetHyphenator(),
                              &aViewWin, 0, 0, VSHELLFLAG_ISPREVIEW );
    }

    aViewWin.SetViewShell( pNew );
    pNew->SetSfxViewShell( this );
    Init();
}


/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


 SwPagePreView::~SwPagePreView()
{
    SetWindow( 0 );

    delete pScrollFill;
    delete pHScrollbar;
    delete pVScrollbar;
    delete pPageUpBtn;
    delete pPageDownBtn;

/*    SfxObjectShell* pDocSh = GetDocShell();
    TypeId aType = TYPE( SfxTopViewFrame );

    for( SfxViewFrame *pFrame = SfxViewFrame::GetFirst( pDocSh, aType );
        pFrame; pFrame = SfxViewFrame::GetNext( *pFrame, pDocSh, aType ) )
        if( pFrame != GetViewFrame() )
        {
            // es gibt noch eine weitere Sicht auf unser Dokument, also
            // aktiviere dieses
            pFrame->GetFrame()->Appear();
            break;
        }
*/}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


SwDocShell* SwPagePreView::GetDocShell()
{
    return PTR_CAST(SwDocShell, GetViewFrame()->GetObjectShell());
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


int SwPagePreView::_CreateScrollbar( int bHori )
{
    Window *pMDI = &GetViewFrame()->GetWindow();
    SwScrollbar** ppScrollbar = bHori ? &pHScrollbar : &pVScrollbar;

    ASSERT( !*ppScrollbar, "vorher abpruefen!" )

    if( !bHori )
    {

        pPageUpBtn      = new ImageButton(pMDI, SW_RES( BTN_PAGEUP ) );
        pPageUpBtn->SetHelpId(FN_PAGEUP);
        pPageDownBtn    = new ImageButton(pMDI, SW_RES( BTN_PAGEDOWN ) );
        pPageDownBtn->SetHelpId(FN_PAGEDOWN);
        Link aLk( LINK( this, SwPagePreView, BtnPage ) );
        pPageUpBtn->SetClickHdl( aLk );
        pPageDownBtn->SetClickHdl( aLk );
        pPageUpBtn->Show();
        pPageDownBtn->Show();
    }

    // wenn beide Scrollbar eingeschaltet werden, dann auch die ScrollbarBox
    // anlegen
    if( !pScrollFill && (bHori ? pVScrollbar : pHScrollbar) )
    {
        pScrollFill = new ScrollBarBox( pMDI, GetDocShell()->IsInFrame()
                                                ? 0 : WB_SIZEABLE );
        pScrollFill->Show();
    }

    *ppScrollbar = new SwScrollbar( pMDI, bHori );

    if( !bHori )
    {
        VScrollDocSzChg();
        (*ppScrollbar)->EnableDrag( TRUE );
        (*ppScrollbar)->SetEndScrollHdl( LINK( this, SwPagePreView, EndScrollHdl ));
    }
    else
    {
        (*ppScrollbar)->SetRangeMax( 0 );
        (*ppScrollbar)->SetThumbPos( 0 );
        (*ppScrollbar)->SetLineSize( 0 );
        (*ppScrollbar)->SetPageSize( 0 );
    }


    (*ppScrollbar)->SetScrollHdl( LINK( this, SwPagePreView, ScrollHdl ));

    InvalidateBorder();
    (*ppScrollbar)->Show();
    return 1;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


int SwPagePreView::_KillScrollbar( int bHori )
{
    SwScrollbar** ppScrBar;
    if( bHori )
    {
        if( 0 == *( ppScrBar = &pHScrollbar ) )
            return 1;
    }
    else
    {
        if( 0 == *( ppScrBar = &pVScrollbar ) )
            return 1;
        DELETEZ(pPageUpBtn);
        DELETEZ(pPageDownBtn);
    }

    DELETEZ( *ppScrBar );

    // wird einer der Scrollbar ausgeschaltet, muss auch die ScrollbarBox
    // entfernt werden
    if( pScrollFill )
        DELETEZ( pScrollFill );

    InvalidateBorder();
    return 1;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


/*
 * Button-Handler
 */
IMPL_LINK_INLINE_START( SwPagePreView, BtnPage, Button *, pButton )
{
    int eMvMode = pButton == pPageUpBtn
                        ? SwPagePreViewWin::MV_PAGE_UP
                        : SwPagePreViewWin::MV_PAGE_DOWN;
    if( ChgPage( eMvMode ) )
        aViewWin.Invalidate();
    return 0;
}
IMPL_LINK_INLINE_END( SwPagePreView, BtnPage, Button *, pButton )

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


int SwPagePreView::ChgPage( int eMvMode, int bUpdateScrollbar )
{
    Rectangle aPixVisArea( aViewWin.LogicToPixel( aVisArea ) );
    int bChg = aViewWin.MovePage( eMvMode ) ||
                    eMvMode == SwPagePreViewWin::MV_CALC;
    aVisArea = aViewWin.PixelToLogic( aPixVisArea );

    if( bChg )
    {
        // Statusleiste updaten
        String aStr( sPageStr );
        aViewWin.GetStatusStr( aStr, nPageCount );
        SfxBindings& rBindings = GetViewFrame()->GetBindings();

        if( bUpdateScrollbar )
        {
            if( pVScrollbar )
                VScrollViewSzChg();

            static USHORT __READONLY_DATA aInval[] =
            {
                FN_START_OF_DOCUMENT, FN_END_OF_DOCUMENT,
                FN_PAGEUP, FN_PAGEDOWN, 0
            };
            rBindings.Invalidate( aInval );
        }
        rBindings.SetState( SfxStringItem( FN_STAT_PAGE, aStr ) );
    }
    return bChg;
}


/*  */
/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


// ab hier alles aus der SwView uebernommen


void SwPagePreView::CalcAndSetBorderPixel( SvBorder &rToFill, FASTBOOL bInner )
{
//  const long nAdd = bInner ? 0 : ScrollBar::GetWindowOverlapPixel();
    const StyleSettings &rSet = aViewWin.GetSettings().GetStyleSettings();
    const long nTmp = rSet.GetScrollBarSize();// - nAdd;
    if ( pVScrollbar )
        rToFill.Right()  = nTmp;
    if ( pHScrollbar )
        rToFill.Bottom() = nTmp;
    SetBorderPixel( rToFill );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void  SwPagePreView::InnerResizePixel( const Point &rOfst, const Size &rSize )
{
    SvBorder aBorder;
    CalcAndSetBorderPixel( aBorder, TRUE );
    Rectangle aRect( rOfst, rSize );
    aRect += aBorder;
    ViewResizePixel( aViewWin, aRect.TopLeft(), aRect.GetSize(),
                    aViewWin.GetOutputSizePixel(),
                    TRUE,
                    pVScrollbar, pHScrollbar, pPageUpBtn, pPageDownBtn, 0,
                    pScrollFill );

    //EditWin niemals einstellen!
    //VisArea niemals einstellen!
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void  SwPagePreView::OuterResizePixel( const Point &rOfst, const Size &rSize )
{
    SvBorder aBorder;
    CalcAndSetBorderPixel( aBorder, FALSE );
    ViewResizePixel( aViewWin, rOfst, rSize, aViewWin.GetOutputSizePixel(),
                        FALSE, pVScrollbar,
                        pHScrollbar, pPageUpBtn, pPageDownBtn, 0, pScrollFill );

    //EditWin niemals einstellen!

    Size aTmpSize( aViewWin.GetOutputSizePixel() );
    Point aBottomRight( aViewWin.PixelToLogic( Point( aTmpSize.Width(), aTmpSize.Height() ) ) );
    SetVisArea( Rectangle( Point(), aBottomRight ) );

    //Aufruf der DocSzChgd-Methode der Scrollbars ist noetig, da vom maximalen
    //Scrollrange immer die halbe Hoehe der VisArea abgezogen wird.
    if ( pVScrollbar )
        VScrollDocSzChg();
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwPagePreView::SetVisArea( const Rectangle &rRect, BOOL bUpdateScrollbar )
{
    const Point aTopLeft(AlignToPixel(rRect.TopLeft()));
    const Point aBottomRight(AlignToPixel(rRect.BottomRight()));
    Rectangle aLR(aTopLeft,aBottomRight);

    if(aLR == aVisArea)
        return;
        // keine negative Position, keine neg. Groesse

    if(aLR.Top() < 0)
    {
        aLR.Bottom() += Abs(aLR.Top());
        aLR.Top() = 0;
    }

    if(aLR.Left() < 0)
    {
        aLR.Right() += Abs(aLR.Left());
        aLR.Left() = 0;
    }
    if(aLR.Right() < 0) aLR.Right() = 0;
    if(aLR.Bottom() < 0) aLR.Bottom() = 0;
    if(aLR == aVisArea ||
        // JP 29.10.97: Bug 45173 - Leeres Rechteck nicht beachten
        ( 0 == aLR.Bottom() - aLR.Top() && 0 == aLR.Right() - aLR.Left() ) )
        return;

    if( aLR.Left() > aLR.Right() || aLR.Top() > aLR.Bottom() )
        return;

    //Bevor die Daten veraendert werden ggf. ein Update rufen. Dadurch wird
    //sichergestellt, daá anliegende Paints korrekt in Dokumentkoordinaten
    //umgerechnet werden.
    //Vorsichtshalber tun wir das nur wenn an der Shell eine Action laeuft,
    //denn dann wir nicht wirklich gepaintet sondern die Rechtecke werden
    //lediglich (in Dokumentkoordinaten) vorgemerkt.
    if( GetViewShell().ActionPend() )
        aViewWin.Update();

    // setze am View-Win die aktuelle Size
    aVisArea = aLR;
    aViewWin.SetWinSize( aLR.GetSize() );
    ChgPage( SwPagePreViewWin::MV_CALC, bUpdateScrollbar );

    aViewWin.Invalidate();
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


IMPL_LINK( SwPagePreView, ScrollHdl, SwScrollbar *, pScrollbar )
{
    if( !pScrollbar->IsHoriScroll() &&
        pScrollbar->GetType() == SCROLL_DRAG && Help::IsQuickHelpEnabled())
    {
        // wieviele Seiten scrollen ??
        String sStateStr(sPageStr);
        USHORT nThmbPos = (USHORT)pScrollbar->GetThumbPos();
        if( 1 == aViewWin.GetCol() || !nThmbPos )
            ++nThmbPos;
        sStateStr += String::CreateFromInt32( nThmbPos );
        Point aPos = pScrollbar->GetParent()->OutputToScreenPixel(
                                        pScrollbar->GetPosPixel());
        aPos.Y() = pScrollbar->OutputToScreenPixel(pScrollbar->GetPointerPosPixel()).Y();
        Size aSize = pScrollbar->GetSizePixel();
        Rectangle aRect;
        aRect.Left()    = aPos.X() -8;
        aRect.Right()   = aRect.Left();
        aRect.Top()     = aPos.Y();
        aRect.Bottom()  = aRect.Top();

        Help::ShowQuickHelp(pScrollbar, aRect, sStateStr,
                QUICKHELP_RIGHT|QUICKHELP_VCENTER);

    }
    else
        EndScrollHdl( pScrollbar );
    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


IMPL_LINK( SwPagePreView, EndScrollHdl, SwScrollbar *, pScrollbar )
{
    if( !pScrollbar->IsHoriScroll() )       // nur Vertikal auswerten
    {
        if(Help::IsQuickHelpEnabled())
            Help::ShowQuickHelp(pScrollbar, Rectangle(), aEmptyStr, 0);
        // wieviele Seiten scrollen ??
        USHORT nThmbPos = pScrollbar->GetThumbPos();
        if( 1 == aViewWin.GetCol() )
            ++nThmbPos;
        if( nThmbPos != aViewWin.GetSttPage() )
        {
            aViewWin.SetSttPage( nThmbPos );
            ChgPage( SwPagePreViewWin::MV_CALC, FALSE );

            static USHORT __READONLY_DATA aInval[] =
            {
                FN_START_OF_DOCUMENT, FN_END_OF_DOCUMENT, FN_PAGEUP, FN_PAGEDOWN, 0
            };
#ifndef PRODUCT
            {
                const USHORT* pPtr = aInval + 1;
                do {
                    ASSERT( *(pPtr - 1) < *pPtr, "falsche Sortierung!" );
                } while( *++pPtr );
            }
#endif

            SfxBindings& rBindings = GetViewFrame()->GetBindings();
            rBindings.Invalidate( aInval );
            aViewWin.Invalidate();
        }
    }
    return 0;
}
/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


Point SwPagePreView::AlignToPixel(const Point &rPt) const
{
    return aViewWin.PixelToLogic( aViewWin.LogicToPixel( rPt ) );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwPagePreView::DocSzChgd( const Size &rSz )
{
    if( aDocSz == rSz )
        return;

    aDocSz = rSz;

    // die neue Anzahl von Seiten bestimmen
    USHORT nNewCnt = GetViewShell().GetNumPages();
    if( nNewCnt == nPageCount )
        return;

    // dann eine neue Startseite berechnen
    nPageCount = nNewCnt;
    if( aVisArea.GetWidth() )
    {
        ChgPage( SwPagePreViewWin::MV_CALC, TRUE );

        if( pVScrollbar )
            VScrollDocSzChg();

        aViewWin.Invalidate();
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwPagePreView::VScrollViewSzChg()
{
    USHORT nVisPage = aViewWin.GetRow() * aViewWin.GetCol(),
           nLineSz = 1 < nVisPage ? nVisPage / 2 : 1,
           nSttPg = aViewWin.GetSttPage();

    if( nSttPg && 1 == aViewWin.GetCol() )
        --nSttPg;

    pVScrollbar->SetVisibleSize( nVisPage );
    pVScrollbar->SetThumbPos( nSttPg );

    pVScrollbar->SetLineSize( nLineSz );
    pVScrollbar->SetPageSize( nVisPage );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwPagePreView::VScrollDocSzChg()
{
    if( pVScrollbar )
    {
        USHORT nPgCnt = nPageCount;
        if( 1 < aViewWin.GetCol() )
            ++nPgCnt;   /* die 0. Seite! */
        pVScrollbar->SetRangeMax( nPgCnt );
        VScrollViewSzChg();
    }
}


/*  */
/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


// alles zum Thema Drucken

USHORT  SwPagePreView::Print( SfxProgress &rProgress, PrintDialog *pDlg )
{
    SwWait aWait( *GetDocShell(), TRUE );

    USHORT nRowCol = ( aViewWin.GetRow() << 8 ) +
                        aViewWin.GetCol();  // Zeilen / DoppelSeiten

    ViewShell* pSh = aViewWin.GetViewShell();

    {
        // die Felder aktualisieren
        // ACHTUNG: hochcasten auf die EditShell, um die SS zu nutzen.
        //          In den Methoden wird auf die akt. Shell abgefragt!
        SwEditShell* pESh = (SwEditShell*)pSh;
        SwDocStat aDocStat;
        BOOL bIsModified = pESh->IsModified();

        pESh->StartAllAction();
        pESh->UpdateDocStat( aDocStat );
        pSh->UpdateFlds();
        pESh->EndAllAction();

        if( !bIsModified )
            pESh->ResetModified();
    }

    // Druckauftrag starten
    SfxObjectShell *pObjShell = GetViewFrame()->GetObjectShell();
    SwPrtOptions aOpts( pObjShell->GetTitle(0) );

    BOOL bPrtPros;
    ::MakeOptions( pDlg, aOpts, &bPrtPros, FALSE, GetPrinter() );

    if( bNormalPrint )
    {
        if( bPrtPros )
            pSh->PrintProspect( aOpts, rProgress );
        else
            pSh->Prt( aOpts, rProgress );
    }
    else
    {
        const SwPagePreViewPrtData* pPPVPD = pSh->GetDoc()->GetPreViewPrtData();
        if( pPPVPD && pPPVPD->GetCol() && pPPVPD->GetRow() )
        {
            // Zeilen / Seiten
            nRowCol = ( pPPVPD->GetRow() << 8 ) + pPPVPD->GetCol();
        }
        else
            pPPVPD = 0;
        pSh->PrintPreViewPage( aOpts, nRowCol, rProgress, pPPVPD );
    }

    return 0; // OK
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


SfxPrinter*  SwPagePreView::GetPrinter( BOOL bCreate )
{
    return aViewWin.GetViewShell()->GetPrt( bCreate );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


USHORT  SwPagePreView::SetPrinter( SfxPrinter *pNew, USHORT nDiffFlags )
{
    ViewShell &rSh = GetViewShell();
    SwEditShell &rESh = (SwEditShell&)rSh;  //Buh...
    if( ( SFX_PRINTER_PRINTER | SFX_PRINTER_JOBSETUP ) & nDiffFlags )
    {
        rSh.SetPrt( pNew );
        if( nDiffFlags & SFX_PRINTER_PRINTER )
            rESh.SetModified();
    }
    if ( ( nDiffFlags & SFX_PRINTER_OPTIONS ) == SFX_PRINTER_OPTIONS )
        ::SetPrinter( pNew, FALSE );

    const BOOL bChgOri = nDiffFlags & SFX_PRINTER_CHG_ORIENTATION ? TRUE : FALSE;
    const BOOL bChgSize= nDiffFlags & SFX_PRINTER_CHG_SIZE ? TRUE : FALSE;
    if ( bChgOri || bChgSize )
    {
        rESh.StartAllAction();
        if ( bChgOri )
            rSh.ChgAllPageOrientation( USHORT(pNew->GetOrientation()) );
        if ( bChgSize )
        {
            Size aSz( SvxPaperInfo::GetPaperSize( pNew ) );
            rSh.ChgAllPageSize( aSz );
        }
        if( !bNormalPrint )
            aViewWin.CalcWish( aViewWin.GetRow(), aViewWin.GetCol() );
        rESh.SetModified();
        rESh.EndAllAction();

        static USHORT __READONLY_DATA aInval[] =
        {
            SID_ATTR_LONG_ULSPACE, SID_ATTR_LONG_LRSPACE,
            SID_RULER_BORDERS, SID_RULER_PAGE_POS, 0
        };
#ifndef PRODUCT
    {
        const USHORT* pPtr = aInval + 1;
        do {
            ASSERT( *(pPtr - 1) < *pPtr, "falsche Sortierung!" );
        } while( *++pPtr );
    }
#endif

        GetViewFrame()->GetBindings().Invalidate(aInval);
    }

    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


SfxTabPage*  SwPagePreView::CreatePrintOptionsPage( Window *pParent,
                                                const SfxItemSet &rOptions )
{
    return ::CreatePrintOptionsPage( pParent, rOptions, !bNormalPrint );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


PrintDialog*  SwPagePreView::CreatePrintDialog( Window *pParent )
{
    PrintDialog *pDlg = ::CreatePrintDialog( pParent, 1, 0 );
    pDlg->DisableRange( PRINTDIALOG_SELECTION );
    return pDlg;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


Size  SwPagePreView::GetOptimalSizePixel() const
{
    //JP 09.06.99: was wird hier errechnet ?????
/* ALT:
    SfxApplicationWindow* pWin = SFX_APPWINDOW ;
    Rectangle aRect = pWin->GetClientAreaPixel();
*/
    Window& rWin = GetViewFrame()->GetWindow();
    Rectangle aRect( Point(0, 0), rWin.GetOutputSizePixel() );
    Size aMaxSize( aRect.GetWidth(), aRect.GetHeight() );
    Size aInSize = rWin.GetOutputSizePixel();
    Size aOutSize = rWin.GetSizePixel();
    USHORT nXBorder = USHORT(aOutSize.Width() - aInSize.Width());
    USHORT nYBorder = USHORT(aOutSize.Height() - aInSize.Height());
    aMaxSize.Width() -= nXBorder;
    //'auf Verdacht' etwas vom Border abziehen (Menue)
    nYBorder -= (nYBorder - nXBorder) / 2;
    aMaxSize.Height() -= nYBorder;
    //mit der max. moeglichen Outputsize guenstigstes Verhaeltnis ausrechnen
    aViewWin.GetOptimalSize(aMaxSize);
    // Border wieder dazuzaehlen
    aMaxSize.Height() += nYBorder;
    aMaxSize.Width() += nXBorder;
    return aMaxSize;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void  SwPagePreViewWin::GetOptimalSize( Size& rSize ) const
{
    USHORT nRowCol = ( nRow << 8 ) + nCol;

    Size aPageSize;
    USHORT nVirtPage;
    pViewShell->CalcPreViewPage( rSize, nRowCol,
                                    nSttPage, aPageSize,
                                    nVirtPage );

    if(aPageSize.Width() && aPageSize.Height())
    {
        long nXRel = (long )aPageSize.Width() * nCol  + ((  nCol + 1) * 142);
        nXRel /= rSize.Width();
        long nYRel = aPageSize.Height() * nRow  + (( nRow + 1) * 142);
        nYRel /= rSize.Height();
        //n?Rel geben das Verhaeltnis von benoetigten Pixeln zu
        //vorhandenen Pixeln wieder
        //Danach wird in der Richtung abgeschnitten, in der mehr Platz ist
        if(nXRel < nYRel )
        {
            rSize.Width() *= nXRel;
            rSize.Width() /= nYRel;
        }
        else
        {
            rSize.Height() *= nYRel;
            rSize.Height() /= nXRel;
        }
    }
}


void SwPagePreViewWin::RepaintCoreRect( const SwRect& rRect )
{
    USHORT nRowCol = ( nRow << 8 ) + nCol;
    pViewShell->RepaintCoreRect( rRect, nRowCol, nSttPage, aPgSize );
}

BOOL SwPagePreView::HandleWheelCommands( const CommandEvent& rCEvt )
{
    BOOL bOk = FALSE;
    const CommandWheelData* pWData = rCEvt.GetWheelData();
    if( pWData && COMMAND_WHEEL_ZOOM == pWData->GetMode() )
    {
        BYTE nRow = aViewWin.GetRow(), nCol = aViewWin.GetCol();
        if( 0L > pWData->GetDelta() )
        {
            if( PVIEW_MIN_ROW < nRow )  --nRow;
            if( PVIEW_MIN_COL < nCol )  --nCol;
        }
        else
        {
            if( PVIEW_MAX_ROW > nRow )  ++nRow;
            if( PVIEW_MAX_COL > nCol )  ++nCol;
        }
        aViewWin.CalcWish( nRow, nCol );
        aViewWin.Invalidate();
        bOk = TRUE;
    }
    else
        bOk = aViewWin.HandleScrollCommand( rCEvt, 0,
                        pVScrollbar && pVScrollbar->IsVisible(TRUE) ? pVScrollbar : 0 );
    return bOk;
}

/*************************************************************************

      $Log: not supported by cvs2svn $
      Revision 1.201  2000/09/18 16:06:10  willem.vandorp
      OpenOffice header added.

      Revision 1.200  2000/09/07 15:59:32  os
      change: SFX_DISPATCHER/SFX_BINDINGS removed

      Revision 1.199  2000/08/14 17:25:29  jp
      Task #77422#: PrintPreView in the same window

      Revision 1.198  2000/08/07 11:48:15  jp
      PagePreView replace the current view

      Revision 1.197  2000/06/19 11:33:51  os
      #73648# display all values after <standard> has been reset

      Revision 1.196  2000/05/26 07:21:34  os
      old SW Basic API Slots removed

      Revision 1.195  2000/05/23 19:42:35  jp
      Bugfixes for Unicode

      Revision 1.194  2000/05/11 12:41:59  tl
      if[n]def ONE_LINGU entfernt

      Revision 1.193  2000/05/10 11:53:20  os
      Basic API removed

      Revision 1.192  2000/04/18 15:02:50  os
      UNICODE

      Revision 1.191  2000/03/23 16:17:01  os
      #74433# dont show section boundaries in print preview

      Revision 1.190  2000/03/03 15:17:04  os
      StarView remainders removed

      Revision 1.189  2000/02/11 14:59:07  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.188  2000/01/04 15:40:55  os
      #71433# no index background in preview

      Revision 1.187  1999/12/14 14:32:01  jp
      Bug #69595#: print can create single Jobs

      Revision 1.186  1999/10/25 19:42:26  tl
      ongoing ONE_LINGU implementation

      Revision 1.185  1999/09/10 13:19:10  os
      Chg: resource types removed

      Revision 1.184  1999/08/31 08:40:12  TL
      #if[n]def ONE_LINGU inserted (for transition of lingu to StarOne)


      Rev 1.183   31 Aug 1999 10:40:12   TL
   #if[n]def ONE_LINGU inserted (for transition of lingu to StarOne)

      Rev 1.182   08 Jul 1999 18:45:16   MA
   Use internal object to toggle wait cursor

      Rev 1.181   10 Jun 1999 10:52:32   JP
   have to change: no AppWin from SfxApp

      Rev 1.180   09 Jun 1999 19:33:28   JP
   have to change: no cast from GetpApp to SfxApp/OffApp, SfxShell only subclass of SfxApp

      Rev 1.179   11 May 1999 08:41:40   OS
   #65779# SaveValue nach hinten verschoben

      Rev 1.178   08 Apr 1999 10:59:12   OS
   #61864# Controls jetzt auch initial leer, wenn noch nichts gesetzt ist

      Rev 1.177   10 Mar 1999 12:02:54   MA
   #52642# Fontwechsel im DataChanged

      Rev 1.176   02 Mar 1999 16:03:28   AMA
   Fix #62568#: Invalidierungen so sparsam wie moeglich, so gruendlich wie noetig

      Rev 1.175   01 Mar 1999 13:54:40   JP
   #62496# VScrollbar IMMER pruefen

      Rev 1.174   26 Feb 1999 15:07:28   OS
   #62496# VScrollbar IMMER pruefen

      Rev 1.173   12 Nov 1998 12:24:26   OS
   #59297# Einstellungen bei Standard zuruecksetzen

      Rev 1.172   29 Oct 1998 11:52:40   OM
   #58593# Selektion nur anbieten, wenn auch vorhanden

      Rev 1.171   15 Oct 1998 13:39:20   OS
   #57602# printPages mit optionen

      Rev 1.170   29 Sep 1998 14:35:44   OS
   #57281#, #57264# Zoom der Preview mit Controller, Preview-Close ueber eigenen Slot

*************************************************************************/

diff --git a/sw/source/ui/uiview/pview.hrc b/sw/source/ui/uiview/pview.hrc
new file mode 100644
index 0000000..417177c0
--- /dev/null
+++ b/sw/source/ui/uiview/pview.hrc
@@ -0,0 +1,108 @@
/*************************************************************************
 *
 *  $RCSfile: pview.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:48 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#include "view.hrc"

#define FT_COL          1
#define FT_ROW          2
#define ED_COL          4
#define ED_ROW          5
#define GB_PREVIEW      10

#define BT_OK           20
#define BT_CANCEL       21
#define BT_HELP         22

// Grenzwerte fuers Zooming (werden auch im piew.cxx benutzt!)
#define PVIEW_MIN_ROW   1
#define PVIEW_MAX_ROW   10
#define PVIEW_MIN_COL   1
#define PVIEW_MAX_COL   20

//Dialog Druckoptionen
#define GB_ROWCOL       1
#define FT_ROWS         2
#define NF_ROWS         3
#define FT_COLS         4
#define NF_COLS         5
#define GB_MARGINS      6
#define GB_DISTANCE     7
#define GB_ORIENTATION  8

#define GB_PREVIEW      10
#define WIN_PREVIEW     11


#define FT_LMARGIN      12
#define MF_LMARGIN      13
#define FT_RMARGIN      14
#define MF_RMARGIN      15
#define FT_TMARGIN      16
#define MF_TMARGIN      17
#define FT_BMARGIN      18
#define MF_BMARGIN      19
#define FT_HMARGIN      20
#define MF_HMARGIN      21
#define FT_VMARGIN      22
#define MF_VMARGIN      23
#define PB_STANDARD     24

#define RB_LANDSCAPE    24
#define RB_PORTRAIT     25
diff --git a/sw/source/ui/uiview/pview.src b/sw/source/ui/uiview/pview.src
new file mode 100644
index 0000000..e7a1a81
--- /dev/null
+++ b/sw/source/ui/uiview/pview.src
@@ -0,0 +1,988 @@
/*************************************************************************
 *
 *  $RCSfile: pview.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:48 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include <svx/svxids.hrc>
#include "pview.hrc"
#include "helpid.h"
#include "cmdid.h"
ModalDialog DLG_PAGEPREVIEW_PRINTOPTIONS
{
    HelpID = HID_DLG_PRV_PRT_OPTIONS ;
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Moveable = TRUE ;
    Size = MAP_APPFONT ( 312 , 131 ) ;
    Text = "Druckoptionen" ;
    Text [ ENGLISH ] = "Print options" ;
    GroupBox GB_ROWCOL
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 150 , 26 ) ;
        Text = "Aufteilung" ;
        Text [ English ] = "Aufteilung" ;

            TEXT[ italian ] = "Distribuzione";
        TEXT[ portuguese_brazilian ] = "Aufteilung";
        TEXT[ portuguese ] = "Distribuição";
        TEXT[ danish ] = "Opdeling";
        TEXT[ french ] = "Répartition";
        TEXT[ swedish ] = "Uppdelning";
        TEXT[ dutch ] = "Verdeling";
        TEXT[ spanish ] = "Distribución";
        TEXT[ english_us ] = "Distribution";
    TEXT[ chinese_simplified ] = "·Ö²¼";
        TEXT[ russian ] = "Ðàñïðåäåëåíèå";
        TEXT[ polish ] = "Rozdzielanie";
        TEXT[ japanese ] = "•ªŠ„";
        TEXT[ chinese_traditional ] = "¤À¥¬";
        TEXT[ arabic ] = "ÇáÊÞÓíã";
        TEXT[ dutch ] = "Verdeling";
        TEXT[ chinese_simplified ] = "·Ö²¼";
        TEXT[ greek ] = "ÊáôáíïìÞ";
        TEXT[ korean ] = "¹èÆ÷";
        TEXT[ turkish ] = "Daðýlým";
        TEXT[ language_user1 ] = " ";
    };
    FixedText FT_ROWS
    {
        Pos = MAP_APPFONT ( 12 , 15 ) ;
        Size = MAP_APPFONT ( 30 , 10 ) ;
        Text = "~Zeilen" ;
        Text [ ENGLISH ] = "~Rows" ;
        Left = TRUE ;
            TEXT[ italian ] = "~Righe";
        TEXT[ portuguese_brazilian ] = "~Zeilen";
        TEXT[ portuguese ] = "~Linhas";
        TEXT[ danish ] = "Rækker";
        TEXT[ french ] = "~Lignes";
        TEXT[ swedish ] = "~Rader";
        TEXT[ dutch ] = "~Rijen";
        TEXT[ spanish ] = "~Filas";
        TEXT[ english_us ] = "~Rows";
    TEXT[ chinese_simplified ] = "ÐÐ(~R)";
        TEXT[ russian ] = "Ñòðîêè";
        TEXT[ polish ] = "Wiersze";
        TEXT[ japanese ] = "c(~R)";
        TEXT[ chinese_traditional ] = "¦æ(~R)";
        TEXT[ arabic ] = "ÕÝæÝ";
        TEXT[ dutch ] = "~Rijen";
        TEXT[ chinese_simplified ] = "ÐÐ(~R)";
        TEXT[ greek ] = "ÃñáììÝò";
        TEXT[ korean ] = "Çà(~R)";
        TEXT[ turkish ] = "Sa~týr";
        TEXT[ language_user1 ] = " ";
    };
    NumericField NF_ROWS
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 45 , 14 ) ;
        Size = MAP_APPFONT ( 36 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = PVIEW_MIN_ROW ;
        Maximum = PVIEW_MAX_ROW ;
        Value = 1 ;
        First = PVIEW_MIN_COL ;
        Last = PVIEW_MAX_COL ;
    };
    FixedText FT_COLS
    {
        Pos = MAP_APPFONT ( 84 , 15 ) ;
        Size = MAP_APPFONT ( 30 , 10 ) ;
        Text = "~Spalten" ;
        Text [ ENGLISH ] = "~Spalten" ;
        Left = TRUE ;
            TEXT[ italian ] = "~Colonne";
        TEXT[ portuguese_brazilian ] = "~Spalten";
        TEXT[ portuguese ] = "~Colunas";
        TEXT[ danish ] = "Kolonner";
        TEXT[ french ] = "C~olonnes";
        TEXT[ swedish ] = "Kolumner";
        TEXT[ dutch ] = "~Kolommen";
        TEXT[ spanish ] = "~Columnas";
        TEXT[ english_us ] = "~Columns";
    TEXT[ chinese_simplified ] = "À¸(~C)";
        TEXT[ russian ] = "Êîëîíêè";
        TEXT[ polish ] = "Kolumny";
        TEXT[ japanese ] = "‰¡(~C)";
        TEXT[ chinese_traditional ] = "Äæ(~C)";
        TEXT[ arabic ] = "ÃÚãÏÉ";
        TEXT[ dutch ] = "~Kolommen";
        TEXT[ chinese_simplified ] = "À¸(~C)";
        TEXT[ greek ] = "ÓôÞëåò";
        TEXT[ korean ] = "¿­(~C)";
        TEXT[ turkish ] = "~Sütun";
        TEXT[ language_user1 ] = " ";
    };
    NumericField NF_COLS
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 117 , 14 ) ;
        Size = MAP_APPFONT ( 36 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = PVIEW_MIN_COL ;
        Maximum = PVIEW_MAX_COL ;
        Value = 1 ;
        First = PVIEW_MIN_COL ;
        Last = PVIEW_MAX_COL ;
    };
    GroupBox GB_MARGINS
    {
        Pos = MAP_APPFONT ( 6 , 32 ) ;
        Size = MAP_APPFONT ( 150 , 41 ) ;
        Text = "Ränder" ;
        Text [ English ] = "Margins" ;

            TEXT[ italian ] = "Margini";
        TEXT[ portuguese_brazilian ] = "Ränder";
        TEXT[ portuguese ] = "Margens";
        TEXT[ danish ] = "Margener";
        TEXT[ french ] = "Marges";
        TEXT[ swedish ] = "Marginaler";
        TEXT[ dutch ] = "Marges";
        TEXT[ spanish ] = "Márgenes";
        TEXT[ english_us ] = "Borders";
    TEXT[ chinese_simplified ] = "±ß¾à";
        TEXT[ russian ] = "Ïîëÿ";
        TEXT[ polish ] = "Marginesy";
        TEXT[ japanese ] = "—]”’";
        TEXT[ chinese_traditional ] = "̊ƒ";
        TEXT[ arabic ] = "ÇáåæÇãÔ";
        TEXT[ dutch ] = "Marges";
        TEXT[ chinese_simplified ] = "±ß¾à";
        TEXT[ greek ] = "Ðåñéèþñéá";
        TEXT[ korean ] = "¿Ü°û¼±";
        TEXT[ turkish ] = "Kenarlar";
        TEXT[ language_user1 ] = " ";
    };
    FixedText FT_LMARGIN
    {
        Pos = MAP_APPFONT ( 12 , 44 ) ;
        Size = MAP_APPFONT ( 30 , 10 ) ;
        Text = "~Links" ;
        Text [ ENGLISH ] = "~Left" ;
        Left = TRUE ;
            TEXT[ italian ] = "A ~sinistra";
        TEXT[ portuguese_brazilian ] = "~Links";
        TEXT[ portuguese ] = "~Esquerda";
        TEXT[ danish ] = "Venstre";
        TEXT[ french ] = "~À gauche";
        TEXT[ swedish ] = "~Vänster";
        TEXT[ dutch ] = "~Links";
        TEXT[ spanish ] = "~Izquierda";
        TEXT[ english_us ] = "~Left";
    TEXT[ chinese_simplified ] = "×ó(~L)";
        TEXT[ russian ] = "Ñëåâà";
        TEXT[ polish ] = "Z lewej";
        TEXT[ japanese ] = "¶(~L)";
        TEXT[ chinese_traditional ] = "¥ª(~L)";
        TEXT[ arabic ] = "íÓÇÑ";
        TEXT[ dutch ] = "~Links";
        TEXT[ chinese_simplified ] = "×ó(~L)";
        TEXT[ greek ] = "ÁñéóôåñÜ";
        TEXT[ korean ] = "¿ÞÂÊ(~L)";
        TEXT[ turkish ] = "S~ol";
        TEXT[ language_user1 ] = " ";
    };
    MetricField MF_LMARGIN
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 45 , 43 ) ;
        Size = MAP_APPFONT ( 36 , 12 ) ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        DecimalDigits = 1 ;
        Unit = FUNIT_CM ;
        SpinSize = 10 ;
        Minimum = 0 ;
        Maximum = 9999 ;
        First = 0 ;
        Last = 2000 ;
    };
    FixedText FT_RMARGIN
    {
        Pos = MAP_APPFONT ( 84 , 44 ) ;
        Size = MAP_APPFONT ( 30 , 10 ) ;
        Text = "~Rechts" ;
        Text [ ENGLISH ] = "~Right" ;
        Left = TRUE ;
            TEXT[ italian ] = "A ~destra";
        TEXT[ portuguese_brazilian ] = "~Rechts";
        TEXT[ portuguese ] = "~Direita";
        TEXT[ danish ] = "Højre";
        TEXT[ french ] = "~À droite";
        TEXT[ swedish ] = "~Höger";
        TEXT[ dutch ] = "R~echts";
        TEXT[ spanish ] = "~Derecha";
        TEXT[ english_us ] = "~Right";
    TEXT[ chinese_simplified ] = "ÓÒ(~R)";
        TEXT[ russian ] = "Ñïðàâà";
        TEXT[ polish ] = "Z prawej";
        TEXT[ japanese ] = "‰E(~R)";
        TEXT[ chinese_traditional ] = "¥k(~R)";
        TEXT[ arabic ] = "íãíä";
        TEXT[ dutch ] = "R~echts";
        TEXT[ chinese_simplified ] = "ÓÒ(~R)";
        TEXT[ greek ] = "ÄåîéÜ";
        TEXT[ korean ] = "¿À¸¥ÂÊ(~R)";
        TEXT[ turkish ] = "Sa~ð";
        TEXT[ language_user1 ] = " ";
    };
    MetricField MF_RMARGIN
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 117 , 43 ) ;
        Size = MAP_APPFONT ( 36 , 12 ) ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        DecimalDigits = 1 ;
        Unit = FUNIT_CM ;
        SpinSize = 10 ;
        Minimum = 0 ;
        Maximum = 9999 ;
        First = 0 ;
        Last = 2000 ;
    };
    FixedText FT_TMARGIN
    {
        Pos = MAP_APPFONT ( 12 , 59 ) ;
        Size = MAP_APPFONT ( 30 , 10 ) ;
        Text = "~Oben" ;
        Text [ ENGLISH ] = "~Top" ;
        Left = TRUE ;
            TEXT[ italian ] = "~In alto";
        TEXT[ portuguese_brazilian ] = "~Oben";
        TEXT[ portuguese ] = "~Topo";
        TEXT[ danish ] = "Foroven";
        TEXT[ french ] = "~Sup.";
        TEXT[ swedish ] = "~Uppåt";
        TEXT[ dutch ] = "~Boven";
        TEXT[ spanish ] = "A~rriba";
        TEXT[ english_us ] = "~Top";
    TEXT[ chinese_simplified ] = "ÉÏ(~T)";
        TEXT[ russian ] = "Ñâåðõó";
        TEXT[ polish ] = "W górze";
        TEXT[ japanese ] = "ã(~T)";
        TEXT[ chinese_traditional ] = "¤W(~T)";
        TEXT[ arabic ] = "ÃÚáì";
        TEXT[ dutch ] = "~Boven";
        TEXT[ chinese_simplified ] = "ÉÏ(~T)";
        TEXT[ greek ] = "ÐÜíù";
        TEXT[ korean ] = "ˤ(~T)";
        TEXT[ turkish ] = "~Üst";
        TEXT[ language_user1 ] = " ";
    };
    MetricField MF_TMARGIN
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 45 , 58 ) ;
        Size = MAP_APPFONT ( 36 , 12 ) ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        DecimalDigits = 1 ;
        Unit = FUNIT_CM ;
        SpinSize = 10 ;
        Minimum = 0 ;
        Maximum = 9999 ;
        First = 0 ;
        Last = 2000 ;
    };
    FixedText FT_BMARGIN
    {
        Pos = MAP_APPFONT ( 84 , 59 ) ;
        Size = MAP_APPFONT ( 30 , 10 ) ;
        Text = "~Unten" ;
        Text [ ENGLISH ] = "~Bottom" ;
        Left = TRUE ;
            TEXT[ italian ] = "~In basso";
        TEXT[ portuguese_brazilian ] = "~Unten";
        TEXT[ portuguese ] = "~Inferior";
        TEXT[ danish ] = "Forneden";
        TEXT[ french ] = "~Inf.";
        TEXT[ swedish ] = "~Nedåt";
        TEXT[ dutch ] = "~Onder";
        TEXT[ spanish ] = "A~bajo";
        TEXT[ english_us ] = "~Bottom";
    TEXT[ chinese_simplified ] = "ÏÂ(~B)";
        TEXT[ russian ] = "Ñíèçó";
        TEXT[ polish ] = "W dole";
        TEXT[ japanese ] = "‰º(~B)";
        TEXT[ chinese_traditional ] = "¤U(~B)";
        TEXT[ arabic ] = "ÃÓÝá";
        TEXT[ dutch ] = "~Onder";
        TEXT[ chinese_simplified ] = "ÏÂ(~B)";
        TEXT[ greek ] = "ÊÜôù";
        TEXT[ korean ] = "¾Æ·¡(~B)";
        TEXT[ turkish ] = "~Alt";
        TEXT[ language_user1 ] = " ";
    };
    MetricField MF_BMARGIN
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 117 , 58 ) ;
        Size = MAP_APPFONT ( 36 , 12 ) ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        DecimalDigits = 1 ;
        Unit = FUNIT_CM ;
        SpinSize = 10 ;
        Minimum = 0 ;
        Maximum = 9999 ;
        First = 0 ;
        Last = 2000 ;
    };
    GroupBox GB_DISTANCE
    {
        Pos = MAP_APPFONT ( 6 , 76 ) ;
        Size = MAP_APPFONT ( 150 , 26 ) ;
        Text = "Abstand" ;
        Text [ English ] = "Distance" ;

            TEXT[ italian ] = "Distanza";
        TEXT[ portuguese_brazilian ] = "Abstand";
        TEXT[ portuguese ] = "Espaçamento";
        TEXT[ danish ] = "Afstand";
        TEXT[ french ] = "Écart";
        TEXT[ swedish ] = "Avstånd";
        TEXT[ dutch ] = "Afstand";
        TEXT[ spanish ] = "Espacio";
        TEXT[ english_us ] = "Spacing";
    TEXT[ chinese_simplified ] = "¼ä¸ô";
        TEXT[ russian ] = "Ðàññòîÿíèå";
        TEXT[ polish ] = "Odstêp";
        TEXT[ japanese ] = "ŠÔŠu";
        TEXT[ chinese_traditional ] = "¶¡¹j";
        TEXT[ arabic ] = "ÇáÊÈÇÚÏ";
        TEXT[ dutch ] = "Afstand";
        TEXT[ chinese_simplified ] = "¼ä¸ô";
        TEXT[ greek ] = "Áðüóôáóç";
        TEXT[ korean ] = "°£°Ý";
        TEXT[ turkish ] = "Aralýk";
        TEXT[ language_user1 ] = " ";
    };
    FixedText FT_HMARGIN
    {
        Pos = MAP_APPFONT ( 12 , 88 ) ;
        Size = MAP_APPFONT ( 30 , 10 ) ;
        Text = "H~orizontal" ;
        Text [ ENGLISH ] = "H~orizontal" ;
        Left = TRUE ;
            TEXT[ italian ] = "~Orizzontale";
        TEXT[ portuguese_brazilian ] = "H~orizontal";
        TEXT[ portuguese ] = "Espaçamento ~horizontal";
        TEXT[ danish ] = "Vandret";
        TEXT[ french ] = "~Horizontal";
        TEXT[ swedish ] = "H~orisontell";
        TEXT[ dutch ] = "~Horizontaal";
        TEXT[ spanish ] = "~Horizontal";
        TEXT[ english_us ] = "~Horizontal";
    TEXT[ chinese_simplified ] = "ºáÏò(~H)";
        TEXT[ russian ] = "Ãîðèçîíòàëüíî";
        TEXT[ polish ] = "Poziomo";
        TEXT[ japanese ] = "‰¡(~H)";
        TEXT[ chinese_traditional ] = "¾î¦V(~H)";
        TEXT[ arabic ] = "ÃÝÞí";
        TEXT[ dutch ] = "~Horizontaal";
        TEXT[ chinese_simplified ] = "ºáÏò(~H)";
        TEXT[ greek ] = "Ïñéæüíôéá";
        TEXT[ korean ] = "¼öÆò(~H)";
        TEXT[ turkish ] = "~Yatay";
        TEXT[ language_user1 ] = " ";
    };

    MetricField MF_HMARGIN
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 45 , 87 ) ;
        Size = MAP_APPFONT ( 36 , 12 ) ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        DecimalDigits = 1 ;
        Unit = FUNIT_CM ;
        SpinSize = 10 ;
        Minimum = 0 ;
        Maximum = 9999 ;
        First = 0 ;
        Last = 2000 ;
    };
    FixedText FT_VMARGIN
    {
        Pos = MAP_APPFONT ( 84 , 88 ) ;
        Size = MAP_APPFONT ( 36 , 10 ) ;
        Text = "~Vertikal" ;
        Text [ ENGLISH ] = "~Vertical" ;
        Left = TRUE ;
            TEXT[ italian ] = "~Verticale";
        TEXT[ portuguese_brazilian ] = "~Vertikal";
        TEXT[ portuguese ] = "~Vertical";
        TEXT[ danish ] = "Lodret";
        TEXT[ french ] = "~Vertical";
        TEXT[ swedish ] = "~Vertikalt";
        TEXT[ dutch ] = "~Verticaal";
        TEXT[ spanish ] = "~Vertical";
        TEXT[ english_us ] = "~Vertically";
    TEXT[ chinese_simplified ] = "×ÝÏò(~V)";
        TEXT[ russian ] = "Âåðòèêàëüíî";
        TEXT[ polish ] = "Pionowo";
        TEXT[ japanese ] = "c(~V)";
        TEXT[ chinese_traditional ] = "Áa¦V(~V)";
        TEXT[ arabic ] = "ÑÃÓí";
        TEXT[ dutch ] = "~Verticaal";
        TEXT[ chinese_simplified ] = "×ÝÏò(~V)";
        TEXT[ greek ] = "Êáôáêüñõöá";
        TEXT[ korean ] = "¼öÁ÷(~V)";
        TEXT[ turkish ] = "~Dikey";
        TEXT[ language_user1 ] = " ";
    };

    MetricField MF_VMARGIN
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 117 , 87 ) ;
        Size = MAP_APPFONT ( 36 , 12 ) ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        DecimalDigits = 1 ;
        Unit = FUNIT_CM ;
        SpinSize = 10 ;
        Minimum = 0 ;
        Maximum = 9999 ;
        First = 0 ;
        Last = 2000 ;
    };
    GroupBox GB_ORIENTATION
    {
        Pos = MAP_APPFONT ( 6 , 102 ) ;
        Size = MAP_APPFONT ( 150 , 26 ) ;
        Text = "Format" ;
        Text [ English ] = "Format" ;
            TEXT[ italian ] = "Formato";
        TEXT[ portuguese_brazilian ] = "Format";
        TEXT[ portuguese ] = "Formato";
        TEXT[ danish ] = "Format";
        TEXT[ french ] = "Format";
        TEXT[ swedish ] = "Format";
        TEXT[ dutch ] = "Notatie";
        TEXT[ spanish ] = "Formato";
        TEXT[ english_us ] = "Format";
    TEXT[ chinese_simplified ] = "¸ñʽ";
        TEXT[ russian ] = "Ôîðìàò";
        TEXT[ polish ] = "Format";
        TEXT[ japanese ] = "‘Ž®";
        TEXT[ chinese_traditional ] = "®æ¦¡";
        TEXT[ arabic ] = "ÇáÊäÓíÞ";
        TEXT[ dutch ] = "Notatie";
        TEXT[ chinese_simplified ] = "¸ñʽ";
        TEXT[ greek ] = "ÌïñöÞ";
        TEXT[ korean ] = "¼­½Ä";
        TEXT[ turkish ] = "Format";
        TEXT[ language_user1 ] = " ";
    };
    RadioButton RB_LANDSCAPE
    {
        Pos = MAP_APPFONT ( 12 , 113 ) ;
        Size = MAP_APPFONT ( 60 , 12 ) ;
        Text = "~Querformat" ;
        Text [ ENGLISH ] = "~Landscape" ;
        TabStop = TRUE ;
        Group = TRUE ;
            TEXT[ italian ] = "Orizzontale";
        TEXT[ portuguese_brazilian ] = "~Querformat";
        TEXT[ portuguese ] = "Formato ~horizontal";
        TEXT[ danish ] = "Liggende";
        TEXT[ french ] = "~Paysage";
        TEXT[ swedish ] = "~Liggande";
        TEXT[ dutch ] = "~Liggend";
        TEXT[ spanish ] = "~Horizontal";
        TEXT[ english_us ] = "~Landscape";
    TEXT[ chinese_simplified ] = "ºáÏò(~L)";
        TEXT[ russian ] = "Àëüáîìíûé ôîðìàò";
        TEXT[ polish ] = "Format poziomy";
        TEXT[ japanese ] = "‰¡(~L)";
        TEXT[ chinese_traditional ] = "¾î¦V(~L)";
        TEXT[ arabic ] = "ÈÇáÚÑÖ";
        TEXT[ dutch ] = "~Liggend";
        TEXT[ chinese_simplified ] = "ºáÏò(~L)";
        TEXT[ greek ] = "Ïñéæïíôßùò";
        TEXT[ korean ] = "°¡·Î(~L)";
        TEXT[ turkish ] = "Ya~tay";
        TEXT[ language_user1 ] = " ";
    };
    RadioButton RB_PORTRAIT
    {
        Pos = MAP_APPFONT ( 84 , 113 ) ;
        Size = MAP_APPFONT ( 60 , 12 ) ;
        Text = "Ho~chformat" ;
        Text [ ENGLISH ] = "~Portrait" ;
            TEXT[ italian ] = "Verticale";
        TEXT[ portuguese_brazilian ] = "Ho~chformat";
        TEXT[ portuguese ] = "Formato ~vertical";
        TEXT[ danish ] = "Stående";
        TEXT[ french ] = "P~ortrait";
        TEXT[ swedish ] = "S~tående";
        TEXT[ dutch ] = "~Staand";
        TEXT[ spanish ] = "~Vertical";
        TEXT[ english_us ] = "P~ortrait";
    TEXT[ chinese_simplified ] = "×ÝÏò(~O)";
        TEXT[ russian ] = "Êíèæíûé ôîðìàò";
        TEXT[ polish ] = "Format pionowy";
        TEXT[ japanese ] = "c(~O)";
        TEXT[ chinese_traditional ] = "Áa¦V(~O)";
        TEXT[ arabic ] = "ÈÇáØæá";
        TEXT[ dutch ] = "~Staand";
        TEXT[ chinese_simplified ] = "×ÝÏò(~O)";
        TEXT[ greek ] = "Êáôáêüñõöá";
        TEXT[ korean ] = "¼¼·Î(~O)";
        TEXT[ turkish ] = "Di~key";
        TEXT[ language_user1 ] = " ";
    };
    GroupBox GB_PREVIEW
    {
        Pos = MAP_APPFONT ( 159 , 3 ) ;
        Size = MAP_APPFONT ( 96 , 125 ) ;
        Text = "Vorschau" ;
        Text [ English ] = "Preview" ;
            TEXT[ italian ] = "Anteprima";
        TEXT[ portuguese_brazilian ] = "Vorschau";
        TEXT[ portuguese ] = "Previsualizar";
        TEXT[ danish ] = "Eksempel";
        TEXT[ french ] = "Aperçu";
        TEXT[ swedish ] = "Förhandsvisning";
        TEXT[ dutch ] = "Voorbeeld";
        TEXT[ spanish ] = "Previsualización";
        TEXT[ english_us ] = "Preview";
    TEXT[ chinese_simplified ] = "Ô¤ÊÓ";
        TEXT[ russian ] = "Ïðîñìîòð";
        TEXT[ polish ] = "Podgl¹d";
        TEXT[ japanese ] = "ÌßÚËÞ­°";
        TEXT[ chinese_traditional ] = "¹wÄý";
        TEXT[ arabic ] = "ãÚÇíäÉ";
        TEXT[ dutch ] = "Voorbeeld";
        TEXT[ chinese_simplified ] = "Ô¤ÊÓ";
        TEXT[ greek ] = "Ðñïåðéóêüðçóç";
        TEXT[ korean ] = "¹Ì¸®º¸±â";
        TEXT[ turkish ] = "Önizleme";
        TEXT[ language_user1 ] = " ";
    };
    Window WIN_PREVIEW
    {
        Pos = MAP_APPFONT ( 162 , 12 ) ;
        Size = MAP_APPFONT ( 90 , 113 ) ;
    };

    OKButton BT_OK
    {
        Pos = MAP_APPFONT ( 258 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        DefButton = TRUE ;
    };
    CancelButton BT_CANCEL
    {
        Pos = MAP_APPFONT ( 258 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    HelpButton BT_HELP
    {
        Pos = MAP_APPFONT ( 258 , 49 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    PushButton PB_STANDARD
    {
        Pos = MAP_APPFONT ( 258 , 66 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        Text = "Standar~d" ;
        Text [ English ] = "Standar~d" ;
            TEXT[ italian ] = "Standar~d";
        TEXT[ portuguese_brazilian ] = "Standar~d";
        TEXT[ portuguese ] = "~Padrão";
        TEXT[ danish ] = "Standar~d";
        TEXT[ french ] = "Par ~défaut";
        TEXT[ swedish ] = "Standar~d";
        TEXT[ dutch ] = "Standaar~d";
        TEXT[ spanish ] = "~Predeterminado";
        TEXT[ english_us ] = "~Default";
    TEXT[ chinese_simplified ] = "ĬÈÏ(~D)";
        TEXT[ russian ] = "Ñòàíäàðò";
        TEXT[ polish ] = "Domyœlnie";
        TEXT[ japanese ] = "•W€(~D)";
        TEXT[ language_user1 ] = " ";
        TEXT[ chinese_traditional ] = "Àq»{(~D)";
        TEXT[ arabic ] = "ÇÝÊÑÇÖí";
        TEXT[ dutch ] = "Standaar~d";
        TEXT[ chinese_simplified ] = "ĬÈÏ(~D)";
        TEXT[ greek ] = "ÐñïåðéëïãÞ";
        TEXT[ korean ] = "±âº»°ª(~D)";
        TEXT[ turkish ] = "Standar~t";
    };
    TEXT[ italian ] = "Opzioni di stampa";
    TEXT[ portuguese_brazilian ] = "Druckoptionen";
    TEXT[ portuguese ] = "Opções de impressão";
    TEXT[ danish ] = "Udskriftsindstillinger";
    TEXT[ french ] = "Options d'impression";
    TEXT[ swedish ] = "Utskriftsalternativ";
    TEXT[ dutch ] = "Afdrukopties";
    TEXT[ spanish ] = "Opciones de impresión";
    TEXT[ english_us ] = "Print Options";
    TEXT[ chinese_simplified ] = "´òÓ¡Ñ¡Ïî";
    TEXT[ russian ] = "Ïàðàìåòðû ïå÷àòè";
    TEXT[ polish ] = "Opcje wydruku";
    TEXT[ japanese ] = "ˆóüµÌß¼®Ý";
    TEXT[ chinese_traditional ] = "¦C¦L¿ï¶µ";
    TEXT[ arabic ] = "ÎíÇÑÇÊ ÇáØÈÇÚÉ";
    TEXT[ dutch ] = "Afdrukopties";
    TEXT[ chinese_simplified ] = "´òÓ¡Ñ¡Ïî";
    TEXT[ greek ] = "ÅðéëïãÝò åêôýðùóçò";
    TEXT[ korean ] = "Àμ⠿ɼÇ";
    TEXT[ turkish ] = "Yazdýrma seçenekleri";
    TEXT[ language_user1 ] = " ";
};
ModalDialog DLG_PAGEPREVIEW_ZOOM
{
    HelpID = HID_PPREV_ZOOM ;
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 141 , 69 ) ;
    /* ### ACHTUNG: Neuer Text in Resource? Maßstab : Ma˜stab */
    Text = "Maßstab" ;
    Text [ ENGLISH ] = "Zoom" ;
    Text [ norwegian ] = "Zoom" ;
    Text [ italian ] = "Zoom" ;
    Text [ portuguese_brazilian ] = "Zoom" ;
    Text [ portuguese ] = "Zoom" ;
    Text [ finnish ] = "Zoomaus" ;
    Text [ danish ] = "Målestok" ;
    Text [ french ] = "Zoom" ;
    Text [ swedish ] = "Skala" ;
    Text [ dutch ] = "Maatstaf" ;
    Text [ spanish ] = "Escala" ;
    Text [ english_us ] = "Zoom" ;
    Moveable = TRUE ;
    FixedText FT_COL
    {
        Pos = MAP_APPFONT ( 12 , 34 ) ;
        Size = MAP_APPFONT ( 27 , 10 ) ;
        Text = "~Spalten" ;
        Text [ ENGLISH ] = "~Columns" ;
        Text [ norwegian ] = "~Columns" ;
        Text [ italian ] = "~Colonne" ;
        Text [ portuguese_brazilian ] = "~Colunas" ;
        Text [ portuguese ] = "~Colunas" ;
        Text [ finnish ] = "~Sarakkeet" ;
        Text [ danish ] = "Kolonner" ;
        Text [ french ] = "~Colonnes" ;
        Text [ swedish ] = "Kolumner" ;
        Text [ dutch ] = "~Kolommen" ;
        Text [ spanish ] = "~Columnas" ;
        Text [ english_us ] = "~Columns" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "À¸(~C)";
        Text[ russian ] = "Êîëîíêè";
        Text[ polish ] = "Kolumny";
        Text[ japanese ] = "‰¡(~C)";
        Text[ chinese_traditional ] = "Äæ(~C)";
        Text[ arabic ] = "ÃÚãÏÉ";
        Text[ dutch ] = "~Kolommen";
        Text[ chinese_simplified ] = "À¸(~C)";
        Text[ greek ] = "ÓôÞëåò";
        Text[ korean ] = "¿­(~C)";
        Text[ turkish ] = "~Sütun";
        Text[ language_user1 ] = " ";
    };
    FixedText FT_ROW
    {
        Pos = MAP_APPFONT ( 12 , 14 ) ;
        Size = MAP_APPFONT ( 27 , 10 ) ;
        Text = "~Zeilen" ;
        Text [ ENGLISH ] = "~Rows" ;
        Text [ norwegian ] = "~Rows" ;
        Text [ italian ] = "~Righe" ;
        Text [ portuguese_brazilian ] = "Filei~ras" ;
        Text [ portuguese ] = "~Linhas" ;
        Text [ finnish ] = "~Rivit" ;
        Text [ danish ] = "Rækker" ;
        Text [ french ] = "~Lignes" ;
        Text [ swedish ] = "~Rader" ;
        Text [ dutch ] = "~Rijen" ;
        Text [ spanish ] = "~Filas" ;
        Text [ english_us ] = "~Rows" ;
        Left = TRUE ;
        Text[ chinese_simplified ] = "ÐÐ(~R)";
        Text[ russian ] = "Ñòðîêè";
        Text[ polish ] = "Wiersze";
        Text[ japanese ] = "c(~R)";
        Text[ chinese_traditional ] = "¦æ(~R)";
        Text[ arabic ] = "ÕÝæÝ";
        Text[ dutch ] = "~Rijen";
        Text[ chinese_simplified ] = "ÐÐ(~R)";
        Text[ greek ] = "ÃñáììÝò";
        Text[ korean ] = "Çà(~R)";
        Text[ turkish ] = "S~atýr";
        Text[ language_user1 ] = " ";
    };
    NumericField ED_COL
    {
        Border = TRUE ;
        Size = MAP_APPFONT ( 28 , 12 ) ;
        Pos = MAP_APPFONT ( 48 , 34 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = PVIEW_MIN_COL ;
        Maximum = PVIEW_MAX_COL ;
        Value = 1 ;
        First = PVIEW_MIN_COL ;
        Last = PVIEW_MAX_COL ;
    };
    NumericField ED_ROW
    {
        Border = TRUE ;
        Pos = MAP_APPFONT ( 48 , 13 ) ;
        Size = MAP_APPFONT ( 28 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = PVIEW_MIN_ROW ;
        Maximum = PVIEW_MAX_ROW ;
        Value = 1 ;
        First = PVIEW_MIN_ROW ;
        Last = PVIEW_MAX_ROW ;
    };
    OKButton BT_OK
    {
        Pos = MAP_APPFONT ( 88 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        DefButton = TRUE ;
    };
    CancelButton BT_CANCEL
    {
        Pos = MAP_APPFONT ( 88 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    HelpButton BT_HELP
    {
        Pos = MAP_APPFONT ( 88 , 49 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
    };
    GroupBox GB_PREVIEW
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 76 , 50 ) ;
        Text = "Ansicht" ;
        Text [ English ] = "View" ;
        Text [ norwegian ] = "View" ;
        Text [ italian ] = "Vista" ;
        Text [ portuguese_brazilian ] = "Ver" ;
        Text [ portuguese ] = "Ver" ;
        Text [ finnish ] = "Näytä" ;
        Text [ danish ] = "Vis" ;
        Text [ french ] = "Affichage" ;
        Text [ swedish ] = "Visa" ;
        Text [ dutch ] = "Beeld" ;
        Text [ spanish ] = "Ver" ;
        Text [ english_us ] = "View" ;
        Text[ chinese_simplified ] = "ÊÓͼ";
        Text[ russian ] = "Âèä";
        Text[ polish ] = "Widok";
        Text[ japanese ] = "•\\ަ";
        Text[ chinese_traditional ] = "À˵ø";
        Text[ arabic ] = "ØÑíÞÉ ÇáÚÑÖ";
        Text[ dutch ] = "Beeld";
        Text[ chinese_simplified ] = "ÊÓͼ";
        Text[ greek ] = "ÐñïâïëÞ";
        Text[ korean ] = "º¸±â";
        Text[ turkish ] = "Görünüm";
        Text[ language_user1 ] = " ";
    };
    Text[ chinese_simplified ] = "¿Ì¶È";
    Text[ russian ] = "Ìàñøòàá";
    Text[ polish ] = "Skala";
    Text[ japanese ] = "½Þ°Ñ";
    Text[ chinese_traditional ] = "Åã¥Ü¤ñ¨Ò";
    Text[ arabic ] = "ÊßÈíÑ æÊÕÛíÑ";
    Text[ dutch ] = "Maatstaf";
    Text[ chinese_simplified ] = "¿Ì¶È";
    Text[ greek ] = "Êëßìáêá";
    Text[ korean ] = "È®´ë/Ãà¼Ò";
    Text[ turkish ] = "Yakýnlaþtýr";
    Text[ language_user1 ] = " ";
};
String RID_PVIEW_TOOLBOX
{
    Text = "Seitenansicht" ;
    Text [ English ] = "Page preview" ;
    Text [ dutch ] = "Afdrukvoorbeeld" ;
    Text [ english_us ] = "Page Preview" ;
    Text [ italian ] = "Anteprima stampa" ;
    Text [ spanish ] = "Vista preliminar" ;
    Text [ french ] = "Aperçu" ;
    Text [ swedish ] = "Förhandsgranskning" ;
    Text [ danish ] = "Vis udskrift" ;
    Text [ portuguese ] = "Ver página" ;
    Text [ portuguese_brazilian ] = "Seitenansicht" ;
    Text[ chinese_simplified ] = "Ò³ÃæÊÓͼ";
    Text[ russian ] = "Ïðåäâàðèòåëüíûé ïðîñìîòð";
    Text[ polish ] = "Podgl¹d wydruku";
    Text[ japanese ] = "ˆóüÌßÚËÞ­°";
    Text[ chinese_traditional ] = "­¶­±À˵ø";
    Text[ arabic ] = "ãÚÇíäÉ ÇáÕÝÍÉ";
    Text[ dutch ] = "Afdrukvoorbeeld";
    Text[ chinese_simplified ] = "Ò³ÃæÊÓͼ";
    Text[ greek ] = "Ðñïåðéóêüðçóç åêôýðùóçò";
    Text[ korean ] = "Àμ⠹̸®º¸±â";
    Text[ turkish ] = "Sayfa önizleme";
    Text[ language_user1 ] = " ";
};
ToolBox RID_PVIEW_TOOLBOX
{
    Border = TRUE ;
    SVLook = TRUE ;
    Dockable = TRUE ;
    Moveable = TRUE ;
    Sizeable = TRUE ;
    Closeable = TRUE ;
    Zoomable = TRUE ;
    LineSpacing = TRUE ;
    HideWhenDeactivate = TRUE ;
    Customize = TRUE ;
    HelpID = HID_PVIEW_TOOLBOX ;
    ItemList =
    {
        ToolBoxItem
        {
            Identifier = FN_PAGEUP ;
            HelpID = FN_PAGEUP ;
        };
        ToolBoxItem
        {
            Identifier = FN_PAGEDOWN ;
            HelpID = FN_PAGEDOWN ;
        };
        ToolBoxItem
        {
            Identifier = FN_START_OF_DOCUMENT ;
            HelpID = FN_START_OF_DOCUMENT ;
        };
        ToolBoxItem
        {
            Identifier = FN_END_OF_DOCUMENT ;
            HelpID = FN_END_OF_DOCUMENT ;
        };
        ToolBoxItem { Type = TOOLBOXITEM_SEPARATOR ; };
        ToolBoxItem
        {
            Identifier = FN_SHOW_TWO_PAGES ;
            HelpID = FN_SHOW_TWO_PAGES ;
        };
        ToolBoxItem
        {
            Identifier = FN_SHOW_FOUR_PAGES ;
            HelpID = FN_SHOW_FOUR_PAGES ;
        };
        ToolBoxItem
        {
            Identifier = FN_PREVIEW_ZOOM;
            HelpID = HID_PREVIEW_ZOOM ;
        };
        ToolBoxItem { Type = TOOLBOXITEM_SEPARATOR ; };
        ToolBoxItem
        {
            Identifier = SID_WIN_FULLSCREEN ;
            HelpID = SID_WIN_FULLSCREEN ;
        };
        ToolBoxItem
        {
            Identifier = FN_PRINT_PAGEPREVIEW ;
            HelpID = FN_PRINT_PAGEPREVIEW ;
        };
        ToolBoxItem
        {
            Identifier = FN_PREVIEW_PRINT_OPTIONS ;
            HelpID = FN_PREVIEW_PRINT_OPTIONS ;
        };
        ToolBoxItem { Type = TOOLBOXITEM_SEPARATOR ; };
        ToolBoxItem
        {
            Identifier = SID_PRINTPREVIEW;
            HelpID = SID_PRINTPREVIEW;
        };
    };
    Scroll = TRUE ;
};
diff --git a/sw/source/ui/uiview/scroll.cxx b/sw/source/ui/uiview/scroll.cxx
new file mode 100644
index 0000000..864a191
--- /dev/null
+++ b/sw/source/ui/uiview/scroll.cxx
@@ -0,0 +1,287 @@
/*************************************************************************
 *
 *  $RCSfile: scroll.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:48 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "swtypes.hxx"
#include "swrect.hxx"
#include "scroll.hxx"


SwScrollbar::SwScrollbar( Window *pWin, int bHoriz ) :
    ScrollBar( pWin,
    WinBits( WB_3DLOOK | WB_HIDE | ( bHoriz ? WB_HSCROLL : WB_VSCROLL)  ) ),
    bHori( bHoriz ),
    bAuto( FALSE ),
    bThumbEnabled( TRUE ),
    bVisible(FALSE),
    bSizeSet(FALSE)
{
}


 SwScrollbar::~SwScrollbar() {}

/*------------------------------------------------------------------------
 Beschreibung:  wird nach einer Aenderung der Dokumentgroesse gerufen, um den
                Range des Scrollbars neu einzustellen.
------------------------------------------------------------------------*/


void SwScrollbar::DocSzChgd( const Size &rSize )
{
    aDocSz = rSize;
    SetRange( Range( 0, bHori ? rSize.Width() : rSize.Height()) );
    const ULONG nVisSize = GetVisibleSize();
    SetLineSize( nVisSize * 10 / 100 );
    SetPageSize( nVisSize * 77 / 100 );
}

/*------------------------------------------------------------------------
 Beschreibung:  wird nach einer Veraenderung des sichtbaren Ausschnittes
                gerufen.
------------------------------------------------------------------------*/


void SwScrollbar::ViewPortChgd( const Rectangle &rRect )
{
    long nThumb, nVisible;
    if( bHori )
    {
        nThumb = rRect.Left();
        nVisible = rRect.GetWidth();
    }
    else
    {
        nThumb = rRect.Top();
        nVisible = rRect.GetHeight();
    }

    SetVisibleSize( nVisible );
    DocSzChgd(aDocSz);
    if ( bThumbEnabled )
        SetThumbPos( nThumb );
    long nVis = GetVisibleSize();
    long nLen = GetRange().Len();
    if(bAuto)
        AutoShow();
}

void SwScrollbar::EnableThumbPos( BOOL bEnable, const SwRect &rVisArea )
{
    bThumbEnabled = bEnable;
    if ( bEnable )
    {
        long nThumb = bHori ? rVisArea.Left() : rVisArea.Top();
        SetThumbPos( nThumb );
    }
}

/*-----------------10/21/97 02:48pm-----------------

--------------------------------------------------*/
void SwScrollbar::Show( BOOL bSet )
{
    bVisible = bSet;
    if( (!bSet || bSizeSet) && IsUpdateMode() )
        ScrollBar::Show(bSet);
}

/*-----------------10/21/97 03:23pm-----------------

--------------------------------------------------*/
void SwScrollbar::SetPosSizePixel( const Point& rNewPos, const Size& rNewSize )
{
    ScrollBar::SetPosSizePixel(rNewPos, rNewSize);
    bSizeSet = TRUE;
    if(bVisible)
        Show();

}

/*-----------------10/21/97 04:47pm-----------------

--------------------------------------------------*/
void SwScrollbar::SetUpdateMode( BOOL bUpdate )
{
    ScrollBar::SetUpdateMode( bUpdate );
    if(bUpdate &&
        bVisible != ScrollBar::IsVisible())
        Show(bVisible);
}
/*-----------------14.04.98 11:38-------------------

--------------------------------------------------*/
void SwScrollbar::SetAuto(BOOL bSet)
{
    if(bAuto != bSet)
    {
        bAuto = bSet;

        // automatisch versteckt - dann anzeigen
        if(!bAuto && bVisible && !ScrollBar::IsVisible())
            Show(TRUE);
        else if(bAuto)
            AutoShow(); // oder automatisch verstecken
    }
}
/*-----------------14.04.98 11:43-------------------

--------------------------------------------------*/
void SwScrollbar::AutoShow()
{
    long nVis = GetVisibleSize();
    long nLen = GetRange().Len();
    {
        if( nVis >= nLen - 1)
        {
            if(bVisible)
                Hide();
        }
        else if ( !ScrollBar::IsVisible() &&
                  (!bHori || nVis) )        //Optimierung fuer Browser.
                                            //Horizontaler Scrollbar per
                                            //default aus.
        {
            Show();
        }
    }
}
/*************************************************************************

      $Log: not supported by cvs2svn $
      Revision 1.63  2000/09/18 16:06:11  willem.vandorp
      OpenOffice header added.

      Revision 1.62  2000/03/03 15:17:04  os
      StarView remainders removed

      Revision 1.61  1999/03/03 11:52:18  MA
      #62722# horizontaler Scrollbar bei Auto per default aus


      Rev 1.60   03 Mar 1999 12:52:18   MA
   #62722# horizontaler Scrollbar bei Auto per default aus

      Rev 1.59   14 Apr 1998 12:10:08   OS
   autom. Scrollbars: SetAuto() muss Sichtbarkeit ueberpruefen #49061#

      Rev 1.58   21 Nov 1997 15:00:12   MA
   includes

      Rev 1.57   12 Nov 1997 17:09:14   MBA
   SP3:

      Rev 1.56   03 Nov 1997 13:58:30   MA
   precomp entfernt

      Rev 1.55   22 Oct 1997 08:12:42   OS
   eigener UpdateMode zur Verhinderung des Flackerns #43684#

      Rev 1.54   10 Sep 1997 10:12:34   OS
   Scrollbars mit WB_HIDE erzeugen 43684

      Rev 1.53   17 Jul 1997 16:58:44   HJS
   includes

      Rev 1.52   16 Jul 1997 18:52:34   MA
   new: ThumbPos kann disabled werden

      Rev 1.51   29 Jul 1996 15:47:22   MA
   includes

      Rev 1.50   23 May 1996 17:18:20   OS
   automatische Scrollbars in Frame-Docs

      Rev 1.49   06 May 1996 17:01:16   MA
   chg: Scrollbars fuer browse und ole richtig

      Rev 1.48   14 Mar 1996 17:10:48   MA
   fix#26338#, richtige Reihenfolge der Einstellungen; Opts

      Rev 1.47   03 Mar 1996 18:16:04   MA
   opt: unuetzer Member vom Scrollbar

      Rev 1.46   29 Nov 1995 12:12:56   OM
   Scrollbars reaktiviert

      Rev 1.45   27 Nov 1995 21:21:04   JP
   ueberfluessige Methoden entfernt, optimiert

      Rev 1.44   24 Nov 1995 16:57:54   OM
   PCH->PRECOMPILED

      Rev 1.43   08 Nov 1995 13:07:40   OS
   Change => Set

      Rev 1.42   30 Oct 1995 12:06:04   MA
   chg: Get/Set Page/LineSize entfernt

      Rev 1.41   19 Feb 1995 15:35:58   JP
   CTOR: setze bHori richtig

*************************************************************************/


diff --git a/sw/source/ui/uiview/srcview.cxx b/sw/source/ui/uiview/srcview.cxx
new file mode 100644
index 0000000..2c50afb
--- /dev/null
+++ b/sw/source/ui/uiview/srcview.cxx
@@ -0,0 +1,1345 @@
/*************************************************************************
 *
 *  $RCSfile: srcview.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:48 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _UIPARAM_HXX
#include <uiparam.hxx>
#endif


#ifndef _TOOLS_TEMPFILE_HXX
#include <tools/tempfile.hxx>
#endif
#ifndef _URLOBJ_HXX //autogen
#include <tools/urlobj.hxx>
#endif
#ifndef _SV_PRINT_HXX //autogen
#include <vcl/print.hxx>
#endif
#ifndef _SV_CLIP_HXX //autogen
#include <vcl/clip.hxx>
#endif
#ifndef _SV_MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SV_WRKWIN_HXX //autogen
#include <vcl/wrkwin.hxx>
#endif
#ifndef _SV_METRIC_HXX //autogen
#include <vcl/metric.hxx>
#endif
#ifndef _CTRLTOOL_HXX //autogen
#include <svtools/ctrltool.hxx>
#endif
#ifndef _SFXINTITEM_HXX //autogen
#include <svtools/intitem.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _UNDO_HXX //autogen
#include <svtools/undo.hxx>
#endif
#ifndef _TXTCMP_HXX //autogen
#include <svtools/txtcmp.hxx>
#endif
#ifndef _EXTATTR_HXX //autogen
#include <svtools/extattr.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SFX_WHITER_HXX //autogen
#include <svtools/whiter.hxx>
#endif
#ifndef _IODLG_HXX //autogen
#include <sfx2/iodlg.hxx>
#endif
#ifndef _SFX_DOCFILT_HACK_HXX //autogen
#include <sfx2/docfilt.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SFX_PRNMON_HXX //autogen
#include <sfx2/prnmon.hxx>
#endif
#ifndef _SFX_PRINTER_HXX //autogen
#include <sfx2/printer.hxx>
#endif
#ifndef _SFXDOCINF_HXX //autogen
#include <sfx2/docinf.hxx>
#endif
#ifndef _SFXDOCFILE_HXX //autogen
#include <sfx2/docfile.hxx>
#endif
#ifndef _SFX_SAVEOPT_HXX //autogen
#include <sfx2/saveopt.hxx>
#endif
#ifndef _SVX_FHGTITEM_HXX //autogen
#include <svx/fhgtitem.hxx>
#endif
#ifndef _SVX_SRCHDLG_HXX //autogen
#include <svx/srchdlg.hxx>
#endif
#ifndef _SVX_SRCHITEM_HXX //autogen
#include <svx/srchitem.hxx>
#endif
#ifndef _SVX_FONTITEM_HXX //autogen
#include <svx/fontitem.hxx>
#endif
#ifndef _SVX_FLSTITEM_HXX //autogen
#include <svx/flstitem.hxx>
#endif
#ifndef _RTL_TENCINFO_H
#include <rtl/tencinfo.h>
#endif

#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _WDOCSH_HXX
#include <wdocsh.hxx>
#endif
#ifndef _SRCVIEW_HXX
#include <srcview.hxx>
#endif
#ifndef _SRCVCFG_HXX
#include <srcvcfg.hxx>
#endif
#ifndef _VIEWFUNC_HXX
#include <viewfunc.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _ITEMDEF_HXX
#include <itemdef.hxx>
#endif
#ifndef _SHELLIO_HXX
#include <shellio.hxx>
#endif
#ifndef _DATAEX_HXX
#include <dataex.hxx>
#endif

#ifndef _CMDID_H
#include <cmdid.h>          // FN_       ...
#endif
#ifndef _HELPID_H
#include <helpid.h>
#endif
#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif
#ifndef _SHELLS_HRC
#include <shells.hrc>
#endif
#ifndef _POPUP_HRC
#include <popup.hrc>
#endif
#ifndef _WEB_HRC
#include <web.hrc>
#endif
#ifndef _VIEW_HRC
#include <view.hrc>
#endif


#define SwSrcView
#define SearchSettings
#define _ExecSearch Execute
#define _StateSearch GetState
#include <svx/svxslots.hxx>
#include "swslots.hxx"

using namespace com::sun::star;
using namespace com::sun::star::uno;

#define C2S(cChar) UniString::CreateFromAscii(cChar)

#define SWSRCVIEWFLAGS ( SFX_VIEW_MAXIMIZE_FIRST|           \
                      SFX_VIEW_OBJECTSIZE_EMBEDDED|     \
                      SFX_VIEW_CAN_PRINT|\
                      SFX_VIEW_NO_NEWWINDOW )

#define SRC_SEARCHOPTIONS (0xFFFF & ~(SEARCH_OPTIONS_FORMAT|SEARCH_OPTIONS_FAMILIES|SEARCH_OPTIONS_SEARCH_ALL))

// Druckraender -> wie Basic - Ide
#define LMARGPRN        1700
#define RMARGPRN         900
#define TMARGPRN        2000
#define BMARGPRN        1000
#define BORDERPRN       300



SFX_IMPL_VIEWFACTORY(SwSrcView, SW_RES(STR_NONAME))
{
    SFX_VIEW_REGISTRATION(SwWebDocShell);
}


SFX_IMPL_INTERFACE( SwSrcView, SfxViewShell, SW_RES(0) )
{
    SFX_POPUPMENU_REGISTRATION(SW_RES(MN_SRCVIEW_POPUPMENU));
    SFX_OBJECTBAR_REGISTRATION(SFX_OBJECTBAR_OBJECT, SW_RES(RID_SRCVIEW_TOOLBOX));
    SFX_OBJECTBAR_REGISTRATION( SFX_OBJECTBAR_TOOLS|
                                SFX_VISIBILITY_STANDARD|SFX_VISIBILITY_SERVER,
                                SW_RES(RID_WEBTOOLS_TOOLBOX) );
    SFX_CHILDWINDOW_REGISTRATION(SvxSearchDialogWrapper::GetChildWindowId());
}

TYPEINIT1(SwSrcView, SfxViewShell)

/*-----------------18.11.96 08.05-------------------

--------------------------------------------------*/


void lcl_PrintHeader( Printer* pPrinter, USHORT nPages, USHORT nCurPage, const String& rTitle )
{
    short nLeftMargin   = LMARGPRN;
    Size aSz = pPrinter->GetOutputSize();
    short nBorder = BORDERPRN;

    Color aOldFillColor( pPrinter->GetFillColor() );
    Font aOldFont( pPrinter->GetFont() );

    pPrinter->SetFillColor( Color(COL_TRANSPARENT) );

    Font aFont( aOldFont );
    aFont.SetWeight( WEIGHT_BOLD );
    aFont.SetAlign( ALIGN_BOTTOM );
    pPrinter->SetFont( aFont );

    long nFontHeight = pPrinter->GetTextHeight();

    // 1.Border => Strich, 2+3 Border = Freiraum.
    long nYTop = TMARGPRN-3*nBorder-nFontHeight;

    long nXLeft = nLeftMargin-nBorder;
    long nXRight = aSz.Width()-RMARGPRN+nBorder;

    pPrinter->DrawRect( Rectangle(
        Point( nXLeft, nYTop ),
        Size( nXRight-nXLeft, aSz.Height() - nYTop - BMARGPRN + nBorder ) ) );


    long nY = TMARGPRN-2*nBorder;
    Point aPos( nLeftMargin, nY );
    pPrinter->DrawText( aPos, rTitle );
    if ( nPages != 1 )
    {
        aFont.SetWeight( WEIGHT_NORMAL );
        pPrinter->SetFont( aFont );
        String aPageStr( C2S(" [") );
        aPageStr += String( SW_RES( STR_PAGE ) );
        aPageStr += ' ';
        aPageStr += String::CreateFromInt32( nCurPage );
        aPageStr += ']';
        aPos.X() += pPrinter->GetTextWidth( rTitle );
        pPrinter->DrawText( aPos, aPageStr );
    }


    nY = TMARGPRN-nBorder;

    pPrinter->DrawLine( Point( nXLeft, nY ), Point( nXRight, nY ) );

    pPrinter->SetFont( aOldFont );
    pPrinter->SetFillColor( aOldFillColor );
}

/*-----------------18.11.96 08.21-------------------

--------------------------------------------------*/

void lcl_ConvertTabsToSpaces( String& rLine )
{
    if ( rLine.Len() )
    {
        USHORT nPos = 0;
        USHORT nMax = rLine.Len();
        while ( nPos < nMax )
        {
            if ( rLine.GetChar(nPos) == '\t' )
            {
                // Nicht 4 Blanks, sondern an 4er TabPos:
                String aBlanker;
                aBlanker.Fill( ( 4 - ( nPos % 4 ) ), ' ' );
                rLine.Erase( nPos, 1 );
                rLine.Insert( aBlanker, nPos );
                nMax = rLine.Len();
            }
            nPos++; // Nicht optimal, falls Tab, aber auch nicht verkehrt...
        }
    }
}

/*-----------------18.11.96 12.12-------------------

--------------------------------------------------*/

void lcl_SetFont(SwSrcView* pView, const String& rStyle)
{
    const SvxFontListItem* pFontListItem = (const SvxFontListItem* )pView->GetDocShell()->GetItem( SID_ATTR_CHAR_FONTLIST );
    const FontList*  pList = pFontListItem->GetFontList();

    FontInfo aInfo = pList->Get(rStyle,WEIGHT_NORMAL, ITALIC_NONE);

    SwSrcEditWindow& rEditWin = pView->GetEditWin();
    const Font& rFont = rEditWin.GetTextEngine()->GetFont();
    Font aFont(aInfo);
    aFont.SetSize(rFont.GetSize());
    rEditWin.GetTextEngine()->SetFont( aFont );
    rEditWin.GetOutWin()->SetFont(aFont);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


SwSrcView::SwSrcView(SfxViewFrame* pFrame, const SwSrcView&) :
    SfxViewShell( pFrame, SWSRCVIEWFLAGS ),
    aEditWin( &pFrame->GetWindow(), this ),
    pSearchItem(0),
    pSrcViewConfig(0),
    bSourceSaved(FALSE)
{
    Init();
}


/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


SwSrcView::SwSrcView(SfxViewFrame* pFrame, SfxViewShell*) :
    SfxViewShell( pFrame, SWSRCVIEWFLAGS ),
    aEditWin( &pFrame->GetWindow(), this ),
    pSearchItem(0),
    bSourceSaved(FALSE)
{
    Init();
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


SwSrcView::~SwSrcView()
{
    SwDocShell* pDocShell = GetDocShell();
    DBG_ASSERT(PTR_CAST(SwWebDocShell, pDocShell), "Wieso keine WebDocShell?")
    TextEngine* pTextEngine = aEditWin.GetTextEngine();
    const TextSelection&  rSel = aEditWin.GetTextView()->GetSelection();
    ((SwWebDocShell*)pDocShell)->SetSourcePara(rSel.GetStart().GetPara());


    SfxDocumentInfo& rDocInfo = pDocShell->GetDocInfo();
    pDocShell->SetAutoLoad(rDocInfo.GetReloadURL(),
                                rDocInfo.GetReloadDelay(),
                                rDocInfo.IsReloadEnabled() );
//  EndListening(*GetViewFrame());
    EndListening(*pDocShell);
    delete pSearchItem;
}

/*-----------------24.04.97 10:37-------------------

--------------------------------------------------*/
void SwSrcView::SaveContentTo(SfxMedium& rMed)
{
    aEditWin.Write( *rMed.GetInStream());//, EE_FORMAT_TEXT);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwSrcView::Init()
{
    SetHelpId(SW_SRC_VIEWSHELL);
    SetName(C2S("Source"));
    SetWindow( &aEditWin );
    pSrcViewConfig = SW_MOD()->GetSourceViewConfig();
    if(!pSrcViewConfig->IsDefault())
    {
        lcl_SetFont( this, pSrcViewConfig->GetFontName());

        TextViewOutWin* pOutWin = aEditWin.GetOutWin();
        Font aFont(aEditWin.GetTextEngine()->GetFont());
        Size aSize(aFont.GetSize());
        aSize.Height() = pSrcViewConfig->GetFontHeight();
        aFont.SetSize(pOutWin->LogicToPixel(aSize, MAP_TWIP));
        aEditWin.GetTextEngine()->SetFont(aFont);
        pOutWin->SetFont(aFont);
    }
    SwDocShell* pDocShell = GetDocShell();
    // wird das Doc noch geladen, dann muss die DocShell das Load
    // anwerfen, wenn das Laden abgeschlossen ist
    if(!pDocShell->IsLoading())
        Load(pDocShell);
    else
    {
        aEditWin.SetReadonly(TRUE);
    }

//  StartListening(*GetViewFrame());
    StartListening(*pDocShell);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SwDocShell*     SwSrcView::GetDocShell()
{
    SfxObjectShell* pObjShell = GetViewFrame()->GetObjectShell();
    return PTR_CAST(SwDocShell, pObjShell);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwSrcView::SaveContent(const String& rTmpFile)
{
    SfxMedium aMedium( rTmpFile,    STREAM_WRITE, TRUE);
    const sal_Char *pCharSet =
        rtl_getBestMimeCharsetFromTextEncoding( gsl_getSystemTextEncoding() );
    rtl_TextEncoding eDestEnc = rtl_getTextEncodingFromMimeCharset( pCharSet );
    SvStream* pOutStream = aMedium.GetOutStream();
    pOutStream->SetStreamCharSet( eDestEnc );
    aEditWin.Write(*pOutStream);//, EE_FORMAT_TEXT);
    aMedium.Commit();
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void __EXPORT SwSrcView::Execute(SfxRequest& rReq)
{
    USHORT nSlot = rReq.GetSlot();
    const SfxItemSet* pArgs = rReq.GetArgs();
    TextView* pTextView = aEditWin.GetTextView();
    switch( nSlot )
    {
        case SID_ATTR_CHAR_FONT:
        {
            const SvxFontItem& rFontItem = (const SvxFontItem&)pArgs->Get(RES_CHRATR_FONT);
            String sStyle = rFontItem.GetFamilyName();
            lcl_SetFont( this, sStyle );
            pSrcViewConfig->SetFontName(sStyle);
        }
        break;
        case SID_ATTR_CHAR_FONTHEIGHT:
        {
            TextViewOutWin* pOutWin = aEditWin.GetOutWin();

            const SvxFontHeightItem& rFontHeight = (const SvxFontHeightItem&)pArgs->Get(RES_CHRATR_FONTSIZE);
            Font aFont(aEditWin.GetTextEngine()->GetFont());
            Size aSize(aFont.GetSize());
            aSize.Height() = rFontHeight.GetHeight();
            aFont.SetSize(pOutWin->LogicToPixel(aSize, MAP_TWIP));
            aEditWin.GetTextEngine()->SetFont(aFont);
            pSrcViewConfig->SetFontHeight(USHORT(rFontHeight.GetHeight()));
        }
        break;
        case SID_SAVEASDOC:
        {
            Window* pParent = &GetViewFrame()->GetWindow();
            SfxFileDialog* pFileDlg = new SfxFileDialog(pParent, WB_SAVEAS|WB_3DLOOK);
            pFileDlg->DisableSaveLastDirectory();
            pFileDlg->SetHelpId(HID_FILEDLG_SRCVIEW);
            String sHtml(C2S("HTML"));
            pFileDlg->AddFilter( sHtml, C2S("*.html;*.htm") );
            pFileDlg->SetCurFilter( sHtml );
            pFileDlg->SetPath( SFX_INIMANAGER()->Get( SFX_KEY_WORK_PATH ) );
            if( RET_OK == pFileDlg->Execute())
            {
                String aFileName = pFileDlg->GetPath();

                INetURLObject aURL( aFileName );
                if ( INET_PROT_FILE == aURL.GetProtocol() )
                {
                    SvFileStream aCpy( aURL.PathToFileName(), STREAM_WRITE| STREAM_TRUNC );
                    aEditWin.Write(aCpy);//, EE_FORMAT_TEXT);

                    SvEaMgr *pMgr = new SvEaMgr(aCpy);
                    SwDocShell* pDocSh = GetDocShell();
                    SfxObjectFactory& rFac = pDocSh->GetFactory();
                    const SfxFilter* pFilter = 0;
                    for( USHORT i = 0; i < rFac.GetFilterCount(); i++ )
                    {
                        const SfxFilter* pFlt = rFac.GetFilter( i );
                        if( pFlt && pFlt->GetFilterName() == sHtml )
                        {
                            pFilter = pFlt;
                            break;
                        }
                    }
                    if(pFilter)
                    {
                        String aBuffer;

                        pMgr->SetComment(pDocSh->GetDocInfo().GetComment());
#ifdef OS2
                        if ( pFilter->GetDocIconId() )
                        {
                            ResId aResId(pFilter->GetDocIconId(),
                                        rFac.GetMenuBarId()->GetResMgr());
                            pMgr->SetIcon(aResId);
                        }
#endif
                        pMgr->SetFileType(pFilter->GetTypeName().GetToken( 0, ';' ));
                        if ( SvEaMgr::GetAppCreator(aBuffer) )
                            pMgr->SetCreator(aBuffer);

                        delete pMgr;

                    }
                    aCpy.Close();
                }
                else
                {
                    SfxMedium aMedium( aFileName, STREAM_WRITE | STREAM_SHARE_DENYNONE,
                                       FALSE, FALSE );
                    {
                        SvFileStream aCpy( aMedium.GetPhysicalName(), STREAM_WRITE| STREAM_TRUNC );
                        aEditWin.Write(aCpy);//, EE_FORMAT_TEXT);
                    }
                    aMedium.Close();
                    aMedium.Commit();
                }
            }
            delete pFileDlg;
        }
        break;
        case SID_SAVEDOC:
        {
            SwDocShell* pDocShell = GetDocShell();
            SfxMedium* pMed = 0;
            if(pDocShell->HasName())
                pMed = pDocShell->GetMedium();
            else
            {
                SfxBoolItem* pItem = (SfxBoolItem*)pDocShell->ExecuteSlot(rReq, pDocShell->GetInterface());
                if(pItem && pItem->GetValue())
                    pMed = pDocShell->GetMedium();
            }
            if(pMed)
            {
                SvStream* pInStream = pMed->GetInStream();
                pInStream->Seek(0);
                pInStream->SetStreamSize(0);
                aEditWin.Write( *pInStream );
                pMed->Commit();
                pDocShell->GetDoc()->ResetModified();
                SourceSaved();
                aEditWin.ClearModifyFlag();
            }
        }
        break;
        case FID_SEARCH_NOW:
        {
            const SfxItemSet* pArgs = rReq.GetArgs();

            USHORT nWhich = pArgs->GetWhichByPos( 0 );
            DBG_ASSERT( nWhich, "Wich fuer SearchItem ?" );
            const SfxPoolItem& rItem = pArgs->Get( nWhich );
            SetSearchItem( (const SvxSearchItem&)rItem);
            StartSearchAndReplace( (const SvxSearchItem&)rItem, FALSE, rReq.IsAPI() );
            if(aEditWin.IsModified())
                GetDocShell()->GetDoc()->SetModified();
        }
        break;
        case SID_PRINTDOC:
        case SID_PRINTDOCDIRECT:
        {
            SfxViewShell::ExecuteSlot( rReq, SfxViewShell::GetInterface() );
        }
        break;
        case SID_UNDO:
            pTextView->Undo();
        break;
        case SID_REDO:
            pTextView->Redo();
        break;
        case SID_REPEAT:
        break;
        case SID_CUT:
            pTextView->Cut();
        break;
        case SID_COPY:
            pTextView->Copy();
        break;
        case SID_PASTE:
            pTextView->Paste();
        break;
        case SID_SELECTALL:
            pTextView->SetSelection( TextSelection( TextPaM( 0, 0 ), TextPaM( 0xFFFFFFFF, 0xFFFF ) ) );
        break;
    }
    aEditWin.Invalidate();
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void __EXPORT SwSrcView::GetState(SfxItemSet& rSet)
{
    SfxWhichIter aIter(rSet);
    USHORT nWhich = aIter.FirstWhich();
    TextView* pTextView = aEditWin.GetTextView();

    while(nWhich)
    {
        switch(nWhich)
        {
            case SID_SAVEASDOC:
                rSet.Put(SfxStringItem(nWhich, String(SW_RES(STR_SAVEAS_SRC))));
            break;
            case SID_SAVEDOC:
            {
                SwDocShell* pDocShell = GetDocShell();
                if(!pDocShell->IsModified())
                    rSet.DisableItem(nWhich);
            }
            break;
            case SID_PRINTDOC:
            case SID_PRINTDOCDIRECT:
            break;
            case SID_TABLE_CELL:
            {
                String aPos( SW_RES(STR_SRCVIEW_ROW) );
                TextSelection aSel = pTextView->GetSelection();
                aPos += String::CreateFromInt32( aSel.GetEnd().GetPara()+1 );
                aPos +=C2S(" : ");
                aPos += String(SW_RES(STR_SRCVIEW_COL));
                aPos += String::CreateFromInt32( aSel.GetEnd().GetIndex()+1 );
                SfxStringItem aItem( nWhich, aPos );
                rSet.Put( aItem );
            }
            break;
            case RES_CHRATR_FONT:
            {
                Font aFont = aEditWin.GetTextEngine()->GetFont();
                rSet.Put(SvxFontItem(
                            aFont.GetFamily(),
                            aFont.GetName(),
                            aFont.GetStyleName()));
            }
            break;
            case RES_CHRATR_FONTSIZE:
            {
                TextViewOutWin* pOutWin = aEditWin.GetOutWin();
                SvxFontHeightItem aFontHeight;
                Size aTemp(aEditWin.GetTextEngine()->GetFont().GetSize());
                aTemp = pOutWin->PixelToLogic(aTemp, MAP_TWIP);
                aFontHeight.SetHeight(aTemp.Height());
                aFontHeight.SetWhich(RES_CHRATR_FONTSIZE);
                rSet.Put(aFontHeight);
            }
            break;
            case SID_SEARCH_OPTIONS:
            {
                USHORT nOpt = SRC_SEARCHOPTIONS;
                if(GetDocShell()->IsReadOnly())
                    nOpt &= ~(SEARCH_OPTIONS_REPLACE|SEARCH_OPTIONS_REPLACE_ALL);

                rSet.Put( SfxUInt16Item( SID_SEARCH_OPTIONS,  nOpt) );
            }
            break;
            case SID_SEARCH_ITEM:
            {
                String sSelected;
                if ( !pTextView->HasSelection() )
                {
                    const TextSelection& rSel = pTextView->GetSelection();
                    sSelected = aEditWin.GetTextEngine()->GetWord( rSel.GetStart());
                }
                else
                {
                    sSelected = pTextView->GetSelected();
                }
                SvxSearchItem * pSrchItem = GetSearchItem();
                pSrchItem->SetSearchString( sSelected );
                rSet.Put( *pSrchItem );
            }
            break;
            case SID_UNDO:
            case SID_REDO:
            {
                SfxUndoManager& rMgr = pTextView->GetTextEngine()->GetUndoManager();
                USHORT nCount = 0;
                if(nWhich == SID_UNDO)
                {
                    nCount = rMgr.GetUndoActionCount();
                    if(nCount)
                    {
                        String aStr(ResId( STR_UNDO, SFX_APP()->GetSfxResManager() ));;
                        aStr += rMgr.GetUndoActionComment(--nCount);
                        rSet.Put(SfxStringItem(nWhich, aStr));
                    }
                    else
                        rSet.DisableItem(nWhich);
                }
                else
                {
                    nCount = rMgr.GetRedoActionCount();
                    if(nCount)
                    {
                        String aStr(ResId( STR_REDO, SFX_APP()->GetSfxResManager() ));;
                        aStr += rMgr.GetRedoActionComment(--nCount);
                        rSet.Put(SfxStringItem(nWhich,aStr));
                    }
                    else
                        rSet.DisableItem(nWhich);
                }
            }
            break;
            case SID_REPEAT:
                rSet.DisableItem(nWhich);
            break;
            case SID_CUT:
            case SID_COPY:
                if(!pTextView->HasSelection())
                    rSet.DisableItem(nWhich);
            break;
            case SID_PASTE:
            {
                SvDataObjectRef xObj;
                if ( Clipboard::GetFormatCount() )
                {
                    SwModule* pMod = SW_MOD();
                    if ( pMod->pClipboard )
                        xObj = pMod->pClipboard ;
                    else
                        xObj = SvDataObject::PasteClipboard();
                }
                if(!xObj.Is())
                    rSet.DisableItem(nWhich);
            }
            break;

        }
        nWhich = aIter.NextWhich();
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


SvxSearchItem* SwSrcView::GetSearchItem()
{
    if(!pSearchItem)
    {
        pSearchItem = new SvxSearchItem(SID_SEARCH_ITEM);
    }
    return pSearchItem;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwSrcView::SetSearchItem( const SvxSearchItem& rItem )
{
    delete pSearchItem;
    pSearchItem = (SvxSearchItem*)rItem.Clone();
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


USHORT SwSrcView::StartSearchAndReplace(const SvxSearchItem& rSearchItem,
                                                    BOOL bFromStart,
                                                    BOOL bApi,
                                                    BOOL bRecursive)
{
    ExtTextView* pTextView = aEditWin.GetTextView();
    TextSelection aSel;
    BOOL bForward = !rSearchItem.GetBackward();
    BOOL bAtStart = pTextView->GetSelection() == TextSelection( TextPaM( 0x0, 0x0 ), TextPaM( 0x0, 0x0 ) );
    if ( bFromStart )
    {
        aSel = pTextView->GetSelection();
        if ( !rSearchItem.GetBackward() )
            pTextView->SetSelection( TextSelection( TextPaM( 0x0, 0x0 ), TextPaM( 0x0, 0x0 ) ) );
        else
            pTextView->SetSelection( TextSelection( TextPaM( 0xFFFFFFFF, 0xFFFF ), TextPaM( 0xFFFFFFFF, 0xFFFF ) ) );
    }

    SearchParam aSearchParam( rSearchItem.GetSearchString(),
                        SearchParam::SRCH_NORMAL, rSearchItem.GetExact(),
                        rSearchItem.GetWordOnly(), rSearchItem.GetSelection() );
    if ( rSearchItem.GetRegExp() )
        aSearchParam.SetSrchType( SearchParam::SRCH_REGEXP );
    else if ( rSearchItem.IsLevenshtein() )
    {
        aSearchParam.SetSrchType( SearchParam::SRCH_LEVDIST );
        aSearchParam.SetSrchRelaxed( rSearchItem.IsLEVRelaxed() ? TRUE : FALSE );
        aSearchParam.SetLEVOther( rSearchItem.GetLEVOther() );
        aSearchParam.SetLEVShorter( rSearchItem.GetLEVShorter() );
        aSearchParam.SetLEVLonger( rSearchItem.GetLEVLonger() );
    }
    USHORT nFound = 0;
    if ( ( rSearchItem.GetCommand() == SVX_SEARCHCMD_FIND ) ||
         ( rSearchItem.GetCommand() == SVX_SEARCHCMD_FIND_ALL ) )
    {
        nFound = pTextView->Search( aSearchParam, bForward );
    }
    else if ( ( rSearchItem.GetCommand() == SVX_SEARCHCMD_REPLACE ) ||
              ( rSearchItem.GetCommand() == SVX_SEARCHCMD_REPLACE_ALL ) )
    {
        aSearchParam.SetReplaceStr( rSearchItem.GetReplaceString() );
        BOOL bAll = rSearchItem.GetCommand() == SVX_SEARCHCMD_REPLACE_ALL;
        nFound = pTextView->Replace( aSearchParam, bAll, bForward );
    }
    if(!nFound)
    {
        BOOL bNotFoundMessage = FALSE;
        if(!bRecursive)
        {
            if(!bFromStart)
            {
                bNotFoundMessage = bAtStart;
            }
            else
            {
                bNotFoundMessage = TRUE;
                pTextView->SetSelection( aSel );
            }
        }
        else if(bAtStart)
        {
            bNotFoundMessage = TRUE;
        }


        if(!bApi)
            if(bNotFoundMessage)
            {
                InfoBox( 0, SW_RES(MSG_NOT_FOUND)).Execute();
            }
            else if(!bRecursive && RET_YES ==
                QueryBox(0, SW_RES( bForward ? MSG_SEARCH_END
                                             : MSG_SEARCH_START)).Execute())
            {
                if ( bForward )
                    pTextView->SetSelection( TextSelection( TextPaM( 0x0, 0x0 ), TextPaM( 0x0, 0x0 ) ) );
                else
                    pTextView->SetSelection( TextSelection( TextPaM( 0xFFFFFFFF, 0xFFFF ), TextPaM( 0xFFFFFFFF, 0xFFFF ) ) );
                StartSearchAndReplace(rSearchItem, FALSE, FALSE, TRUE);
            }
    }
    return nFound;
}

/*-----------------02.07.97 09:29-------------------

--------------------------------------------------*/
USHORT __EXPORT SwSrcView::SetPrinter(SfxPrinter* pNew, USHORT nDiffFlags )
{
    SwDocShell* pDocSh = GetDocShell();
    if ( (SFX_PRINTER_JOBSETUP | SFX_PRINTER_PRINTER) & nDiffFlags )
    {
        pDocSh->GetDoc()->SetPrt( pNew );
        if ( nDiffFlags & SFX_PRINTER_PRINTER )
            pDocSh->SetModified();
    }
    if ( nDiffFlags & SFX_PRINTER_OPTIONS )
        ::SetPrinter( pNew, TRUE );

    const BOOL bChgOri = nDiffFlags & SFX_PRINTER_CHG_ORIENTATION ? TRUE : FALSE;
    const BOOL bChgSize= nDiffFlags & SFX_PRINTER_CHG_SIZE ? TRUE : FALSE;
    if ( bChgOri || bChgSize )
    {
        pDocSh->SetModified();
    }
    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

ErrCode SwSrcView::DoPrint( SfxPrinter *pPrinter, PrintDialog *pDlg,
                            BOOL bSilent )
{
    SfxPrintProgress *pProgress = new SfxPrintProgress( this, !bSilent );
    SfxPrinter *pDocPrinter = GetPrinter(TRUE);
    if ( !pPrinter )
        pPrinter = pDocPrinter;
    else if ( pDocPrinter != pPrinter )
    {
        pProgress->RestoreOnEndPrint( pDocPrinter->Clone() );
        SetPrinter( pPrinter, SFX_PRINTER_PRINTER );
    }
    pProgress->SetWaitMode(FALSE);

    // Drucker starten
    PreparePrint( pDlg );
    SfxObjectShell *pObjShell = GetViewFrame()->GetObjectShell();

    SfxViewShell::Print(*pProgress, pDlg); //???

    MapMode eOldMapMode( pPrinter->GetMapMode() );
    Font aOldFont( pPrinter->Printer::GetFont() );

    TextEngine* pTextEngine = aEditWin.GetTextEngine();
    pPrinter->SetMapMode(MAP_100TH_MM);
    Font aFont(aEditWin.GetOutWin()->GetFont());
    Size aSize(aFont.GetSize());
    aSize = aEditWin.GetOutWin()->PixelToLogic(aSize, MAP_100TH_MM);
    aFont.SetSize(aSize);
    aFont.SetColor(COL_BLACK);
    pPrinter->SetFont( aFont );

    String aTitle( GetViewFrame()->GetWindow().GetText() );

    USHORT nLineHeight = (USHORT) pPrinter->GetTextHeight(); // etwas mehr.
    USHORT nParaSpace = 10;

    Size aPaperSz = pPrinter->GetOutputSize();
    aPaperSz.Width() -= (LMARGPRN+RMARGPRN);
    aPaperSz.Height() -= (TMARGPRN+BMARGPRN);

    // nLinepPage stimmt nicht, wenn Zeilen umgebrochen werden muessen...
    USHORT nLinespPage = (USHORT) (aPaperSz.Height()/nLineHeight);
    USHORT nCharspLine = (USHORT) (aPaperSz.Width() / pPrinter->GetTextWidth( 'X' ));
    USHORT nParas = pTextEngine->GetParagraphCount();

    USHORT nPages = (USHORT) (nParas/nLinespPage+1 );
    USHORT nCurPage = 1;

    BOOL bStartJob = pPrinter->StartJob( aTitle );
    if( bStartJob )
    {
        pPrinter->StartPage();
        // Header drucken...
        lcl_PrintHeader( pPrinter, nPages, nCurPage, aTitle );
        Point aPos( LMARGPRN, TMARGPRN );
        for ( USHORT nPara = 0; nPara < nParas; nPara++ )
        {
            String aLine( pTextEngine->GetText( nPara ) );
            lcl_ConvertTabsToSpaces( aLine );
            USHORT nLines = aLine.Len()/nCharspLine+1;
            for ( USHORT nLine = 0; nLine < nLines; nLine++ )
            {
                String aTmpLine( aLine, nLine*nCharspLine, nCharspLine );
                aPos.Y() += nLineHeight;
                if ( aPos.Y() > ( aPaperSz.Height()+TMARGPRN ) )
                {
                    nCurPage++;
                    pPrinter->EndPage();
                    pPrinter->StartPage();
                    lcl_PrintHeader( pPrinter, nPages, nCurPage, aTitle );
                    aPos = Point( LMARGPRN, TMARGPRN+nLineHeight );
                }
                pPrinter->DrawText( aPos, aTmpLine );
            }
            aPos.Y() += nParaSpace;
        }
        pPrinter->EndPage();
    }

    pPrinter->SetFont( aOldFont );
    pPrinter->SetMapMode( eOldMapMode );

    if ( !bStartJob )
    {
        // Printer konnte nicht gestartet werden
        delete pProgress;
        return ERRCODE_IO_ABORT;
    }

    pProgress->Stop();
    pProgress->DeleteOnEndPrint();
    pPrinter->EndJob();
    return pPrinter->GetError();
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


SfxPrinter* __EXPORT SwSrcView::GetPrinter( BOOL bCreate )
{
    return  GetDocShell()->GetDoc()->GetPrt( bCreate );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void __EXPORT SwSrcView::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
{
    if ( rHint.ISA(SfxSimpleHint) &&
            (((SfxSimpleHint&) rHint).GetId() == SFX_HINT_MODECHANGED) ||
            (((SfxSimpleHint&) rHint).GetId() == SFX_HINT_TITLECHANGED &&
               !GetDocShell()->IsReadOnly() && aEditWin.IsReadonly()))
    {
        // Broadcast kommt nur einmal!
        const SwDocShell* pDocSh = GetDocShell();
        const BOOL bReadonly = pDocSh->IsReadOnly();
        aEditWin.SetReadonly(bReadonly);
    }
    SfxViewShell::Notify(rBC, rHint);
}

/*-----------------19.04.97 10:19-------------------

--------------------------------------------------*/
void SwSrcView::Load(SwDocShell* pDocShell)
{
    const sal_Char *pCharSet =
        rtl_getBestMimeCharsetFromTextEncoding( gsl_getSystemTextEncoding() );
    rtl_TextEncoding eDestEnc = rtl_getTextEncodingFromMimeCharset( pCharSet );
    aEditWin.SetReadonly(pDocShell->IsReadOnly());
    SfxMedium* pMedium = pDocShell->GetMedium();

    const SfxFilter* pFilter = pMedium->GetFilter();
    BOOL bHtml = pFilter && C2S("HTML") == pFilter->GetFilterName();
    BOOL bDocModified = pDocShell->IsModified();
    if(bHtml && !bDocModified && pDocShell->HasName())
    {
        SvStream* pStream = pMedium->GetInStream();
        if(pStream && 0 == pStream->GetError() )
        {
            pStream->SetStreamCharSet( eDestEnc );
            pStream->Seek(0);

            aEditWin.Read(*pStream);//, EE_FORMAT_TEXT);
        }
        else
        {
            Window *pWindow = &GetViewFrame()->GetWindow();
            InfoBox(pWindow, SW_RES(MSG_ERR_SRCSTREAM)).Execute();
        }
    }
    else
    {
        TempFile aTempFile;
        aTempFile.EnableKillingFile();
        String sFileURL = aTempFile.GetName();
        BOOL bIsRemote = pMedium->IsRemote();
        SfxOptions& rOpt = SFX_APP()->GetOptions();
        String sBaseURL = INetURLObject::GetBaseURL();

        if( rOpt.IsSaveRelINet() && bIsRemote ||
                rOpt.IsSaveRelFSys() && !bIsRemote)
            INetURLObject::SetBaseURL( pMedium->GetName() );
        else
            INetURLObject::SetBaseURL( aEmptyStr );

        {
            SfxMedium aMedium( sFileURL,STREAM_READWRITE, TRUE );
            SwWriter aWriter( aMedium, *pDocShell->GetDoc() );
            WriterRef xWriter;
            ::GetHTMLWriter(aEmptyStr, xWriter);
            String sWriteName = pDocShell->HasName() ?
                                    pMedium->GetName() :
                                        (const String&) sFileURL;
            ULONG nRes = aWriter.Write(xWriter, &sWriteName);
            if(nRes)
            {
                ErrorHandler::HandleError(ErrCode(nRes));
                aEditWin.SetReadonly(TRUE);
            }
            SvStream* pInStream = aMedium.GetInStream();
            pInStream->Seek(0);
            pInStream->SetStreamCharSet( eDestEnc );

            INetURLObject::SetBaseURL(sBaseURL);

            aEditWin.Read(*pInStream);//, EE_FORMAT_TEXT);
        }
    }
    aEditWin.ClearModifyFlag();

    if(bDocModified)
        pDocShell->SetModified();// das Flag wird zwischendurch zurueckgesetzt
    // AutoLoad abschalten
    pDocShell->SetAutoLoad(INetURLObject(), 0, FALSE);
    DBG_ASSERT(PTR_CAST(SwWebDocShell, pDocShell), "Wieso keine WebDocShell?")
    USHORT nLine = ((SwWebDocShell*)pDocShell)->GetSourcePara();
    aEditWin.SetStartLine(nLine);
    aEditWin.GetTextEngine()->ResetUndo();
    aEditWin.GetOutWin()->GrabFocus();
}


/*------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.109  2000/09/18 16:06:11  willem.vandorp
    OpenOffice header added.

    Revision 1.108  2000/09/14 10:37:04  os
    SfxMedium::CloseIn/OutStream removed

    Revision 1.107  2000/08/30 16:13:02  os
    #78341# save document before switching to source view

    Revision 1.106  2000/06/22 11:20:25  os
    use TempFile instead of GetTmpFileName()

    Revision 1.105  2000/06/09 08:10:41  os
    using tools/tempfile

    Revision 1.104  2000/06/08 09:44:58  os
    ContentBroker not in SwModule

    Revision 1.103  2000/06/07 13:28:12  os
    using UCB

    Revision 1.102  2000/05/26 07:21:34  os
    old SW Basic API Slots removed

    Revision 1.101  2000/05/23 19:42:42  jp
    Bugfixes for Unicode

    Revision 1.100  2000/05/10 11:53:20  os
    Basic API removed

    Revision 1.99  2000/05/09 14:43:13  os
    BASIC interface partially removed

    Revision 1.98  2000/05/04 11:11:26  os
    #75552# set correct charset in source view

    Revision 1.97  2000/04/18 15:02:50  os
    UNICODE

    Revision 1.96  2000/03/14 13:43:43  jp
    GetAppWindow() - misuse as parent window eliminated

    Revision 1.95  2000/03/03 15:48:01  pl
    #73771# workaround for c50 intel compiler

    Revision 1.94  2000/03/03 15:17:04  os
    StarView remainders removed

    Revision 1.93  2000/02/11 14:59:12  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.92  2000/01/24 12:43:16  os
    #72153# call SfxFileDialog::DisableSaveLastDirectory

    Revision 1.91  1999/10/21 17:49:09  jp
    have to change - SearchFile with SfxIniManager, dont use SwFinder for this

    Revision 1.90  1999/08/17 07:17:54  OS
    #67248# DocShell::SetModified after replace


      Rev 1.89   17 Aug 1999 09:17:54   OS
   #67248# DocShell::SetModified after replace

      Rev 1.88   20 May 1999 08:15:22   OS
   #62641# Fehlermeldung auch beim Umschalten in die SourceView

      Rev 1.87   04 May 1999 14:59:06   JP
   FilterExportklasse Writer von SvRef abgeleitet, damit sie immer zerstoert wird

      Rev 1.86   31 Mar 1999 06:42:58   OS
   #64111# Font fuers drucken auf schwarz setzen

      Rev 1.85   18 Mar 1999 14:55:02   OS
   #57911# Listener am Doc statt am ViewFrame

      Rev 1.84   25 Nov 1998 12:42:06   OS
   #59826# temp. Datei in der DocShell loeschen

      Rev 1.83   24 Nov 1998 08:55:58   OS
   #58996# bSourceSaved-Flag initialisieren

      Rev 1.82   05 Nov 1998 10:07:56   OS
   #58996# Stream nach dem Speichern zuruecksetzen, Flag fuers speichern

      Rev 1.81   03 Nov 1998 11:28:00   OS
   #58680# nach SID_SAVEDOC ClearModifyFlag an der TextView rufen

      Rev 1.80   08 Sep 1998 17:57:30   OS
   #56083# .html fuer sourceview default

      Rev 1.79   08 Sep 1998 16:55:42   MI
   #55602# DocInfo vor Ausdruck setzen und ggf. hinterher resetten (ErrorCode bei Abort)

      Rev 1.78   02 Sep 1998 14:12:18   OM
   #45378# HelpIDs fuer Dateidialoge

      Rev 1.77   12 Aug 1998 18:47:20   HR
   #54781#: GCC braucht Temporary

      Rev 1.76   17 Jul 1998 09:53:42   OS
   Stream vor dem Schreiben auf Null setzen #53143#

      Rev 1.75   11 Jul 1998 15:28:04   OS
   HTML-Quelltext ins Medium der DocShell speichern #52379#

      Rev 1.74   07 Jul 1998 14:26:38   AMA
   Chg: DoPrint uebernimmt das Drucken

      Rev 1.73   03 Jul 1998 15:04:20   AMA
   Chg: DoPrint uebernimmt das Drucken

      Rev 1.72   29 Jun 1998 12:56:06   OS
   SW_MOD statt GetActiveModule

      Rev 1.71   29 Jun 1998 09:40:08   OS
   htm/html-Extension fuer SaveAs #48933#

      Rev 1.70   29 May 1998 08:28:46   OS
   Undo/Redo-Texte, Repeat disabled #50652##50653#

      Rev 1.69   15 May 1998 18:40:46   HJS
   syntax os2

      Rev 1.68   24 Apr 1998 16:53:04   OS
   Fonts aus der Docshell-Fontlist holen #49431#

      Rev 1.67   01 Apr 1998 11:58:04   OS
   Font mit aktueller Groesse setzen #49122#

      Rev 1.66   12 Mar 1998 13:01:08   OS
   SID_NEWWINDOW nicht mehr ueberladen

      Rev 1.65   17 Dec 1997 16:52:36   ER
   cast fuer IRIX

      Rev 1.64   29 Nov 1997 16:48:36   MA
   includes

      Rev 1.63   27 Nov 1997 09:02:48   OS
   jetzt auch mit SID_PRINTDOC #45786#

      Rev 1.62   21 Nov 1997 15:00:28   MA
   includes

      Rev 1.61   03 Nov 1997 13:58:28   MA
   precomp entfernt

      Rev 1.60   31 Oct 1997 10:45:54   OS
   Undo stimmt jetzt #44501#

      Rev 1.59   24 Oct 1997 15:21:36   OS
   ReloadFromHtml nur noch rufen, wenn das Doc im SourceMode veraendert wurde #44971#

      Rev 1.58   09 Oct 1997 12:16:06   OS
   Undo/Redo richtig enablen, beim Start zuruecksetzen #44501#

      Rev 1.57   06 Sep 1997 10:59:04   OS
   Suchen liefert Meldungen #43197#

      Rev 1.56   01 Sep 1997 13:13:52   OS
   DLL-Umstellung

      Rev 1.55   11 Aug 1997 10:27:24   OS
   paraitem/frmitems/textitem aufgeteilt

      Rev 1.54   08 Aug 1997 17:26:08   OM
   Headerfile-Umstellung

      Rev 1.53   07 Aug 1997 19:59:54   HJS
   includes

      Rev 1.52   05 Aug 1997 16:36:38   TJ
   include svx/srchitem.hxx

      Rev 1.51   31 Jul 1997 14:59:42   MH
   chg: header

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/uiview/swcli.cxx b/sw/source/ui/uiview/swcli.cxx
new file mode 100644
index 0000000..5d029c2
--- /dev/null
+++ b/sw/source/ui/uiview/swcli.cxx
@@ -0,0 +1,308 @@
/*************************************************************************
 *
 *  $RCSfile: swcli.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:48 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _IPENV_HXX //autogen
#include <so3/ipenv.hxx>
#endif
#ifndef _EMBOBJ_HXX //autogen
#include <so3/embobj.hxx>
#endif
#ifndef _IPOBJ_HXX //autogen
#include <so3/ipobj.hxx>
#endif

#include "wrtsh.hxx"
#include "swtypes.hxx"
#include "view.hxx"
#include "edtwin.hxx"
#include "swcli.hxx"


SwOleClient::SwOleClient( SwView *pView, SwEditWin *pWin ) :
    SfxInPlaceClient( pView, pWin ), bInDoVerb( FALSE )
{
}


void SwOleClient::RequestObjAreaPixel( const Rectangle & rObjRect )
{
    if ( !GetEnv() )
        return;

    //Der Server moechte die Clientgrosse verandern.
    //Wir stecken die Wunschgroesse in die Core. Die Attribute des Rahmens
    //werden auf den Wunschwert eingestellt. Dieser Wert wird also auch an
    //den InPlaceClient weitergegeben.
    //Die Core aktzeptiert bzw. formatiert die eingestellten Werte nicht
    //zwangslaeufig. Wenn der Ole-Frm formatiert wurde wird das CalcAndSetScale()
    //der WrtShell gerufen. Dort wird ggf. die Scalierung des SwOleClient
    //eingestellt.

    SwWrtShell &rSh  = ((SwView*)GetViewShell())->GetWrtShell();
    Window     *pWin = rSh.GetWin();

    SvContainerEnvironment *pEnv  = GetEnv();
    SvInPlaceEnvironment * pIPEnv = pEnv->GetIPEnv();
    ASSERT( pIPEnv, "RequestObjAreaPixel, Environment not found" );

    SvInPlaceObject * pIPObj = pIPEnv->GetIPObj();
    // Falls der Server nicht mit dem Maástab des Containers syncronisiert
    // ist, wird durch das Setzen und Abfragen der VisArea die Server
    // Einstellung ermittelt.
    // Niemals Koordinatentransformationen mit dem Rectangle vornehmen!!!
    Rectangle aLogRect( pEnv->PixelObjVisAreaToLogic( rObjRect ) );
    if ( pEnv->GetObjAreaPixel().GetSize() != rObjRect.GetSize() )
        // sichtbaren Ausschnitt setzen und abfragen
        aLogRect = pIPObj->SetGetVisArea( aLogRect );

    Size aBla( aLogRect.GetSize() );
    aBla.Width() = Fraction( aBla.Width()  ) * GetEnv()->GetScaleWidth();
    aBla.Height()= Fraction( aBla.Height() ) * GetEnv()->GetScaleHeight();
    aLogRect.SetSize( aBla );

    const MapMode aTmp( pIPObj->GetMapUnit() );
    aLogRect.SetSize( pWin->LogicToLogic( aLogRect.GetSize(), aTmp, MAP_TWIP ) );

    //#52207# Hat sich die Position wirklich geaendert (Umrechnungsfehler vermeiden)?
    if ( GetClientData()->GetObjAreaPixel().TopLeft() != rObjRect.TopLeft() )
        aLogRect.SetPos ( pWin->PixelToLogic( rObjRect.TopLeft()));
    else
        aLogRect.SetPos( Point( LONG_MIN, LONG_MIN ) );

    rSh.StartAllAction();
    rSh.RequestObjectResize( SwRect( aLogRect ), GetIPObj());
    rSh.EndAllAction();


    SwRect aFrm( rSh.GetAnyCurRect( RECT_FLY_EMBEDDED,     0, GetIPObj() )),
           aPrt( rSh.GetAnyCurRect( RECT_FLY_PRT_EMBEDDED, 0, GetIPObj() ));
    Size  aSz ( aPrt.SSize() );
    Point aPos( aPrt.Pos() + aFrm.Pos() );
    aSz  = pWin->LogicToPixel( aSz );
    aPos = pWin->LogicToPixel( aPos);

    Rectangle aPixRect( aPos, aSz );
    SfxInPlaceClient::RequestObjAreaPixel( aPixRect );

    if ( !aFrm.IsOver( rSh.VisArea() ) )
        rSh.MakeVisible( aFrm );
}


void SwOleClient::ViewChanged( USHORT nAspect )
{
    SfxInPlaceClient::ViewChanged( nAspect );
    if ( !GetEnv() || bInDoVerb )
        return;

    const Rectangle aOldArea( GetEnv()->GetObjArea() );
    SwWrtShell &rSh  = ((SwView*)GetViewShell())->GetWrtShell();
    Window     *pWin = rSh.GetWin();

    //Einstellen der Groesse des Objektes in der Core. Die Scalierung muss
    //beruecksichtigt werden. Rueckwirkung auf das Objekt werden von
    //CalcAndSetScale() der WrtShell beruecksichtig, wenn die Groesse/Pos des
    //Rahmens in der Core sich veraendert.
    SvEmbeddedObject *pObj = GetEmbedObj();
    Size aVisSize( pObj->GetVisArea().GetSize() );

    // Bug 24833: solange keine vernuenftige Size vom Object kommt,
    //              kann nichts skaliert werden
    if( !aVisSize.Width() || !aVisSize.Height() )
        return;

    aVisSize.Width() = Fraction( aVisSize.Width()  ) * GetEnv()->GetScaleWidth();
    aVisSize.Height()= Fraction( aVisSize.Height() ) * GetEnv()->GetScaleHeight();
    const MapMode aMyMap ( MAP_TWIP );
    const MapMode aObjMap( pObj->GetMapUnit() );
    aVisSize = OutputDevice::LogicToLogic( aVisSize, aObjMap, aMyMap );

    SwRect aRect( Point( LONG_MIN, LONG_MIN ), aVisSize );
    rSh.LockView( TRUE );   //Scrollen im EndAction verhindern
    rSh.StartAllAction();
    rSh.RequestObjectResize( aRect, GetIPObj() );
    rSh.EndAllAction();
    rSh.LockView( FALSE );
}


void SwOleClient::MakeVisible()
{
    SfxInPlaceClient::MakeVisible();

    const SwWrtShell &rSh  = ((SwView*)GetViewShell())->GetWrtShell();
    SvEmbeddedObject *pObj = GetEmbedObj();
    rSh.MakeObjVisible( pObj );
}


void SwOleClient::MakeViewData()
{
    SfxInPlaceClient::MakeViewData();

    SvClientData *pCD = GetClientData();
    if ( pCD )
    {
        SwWrtShell &rSh  = ((SwView*)GetViewShell())->GetWrtShell();
        SvEmbeddedObjectRef xObj = GetEmbedObj();
        rSh.CalcAndSetScale( xObj );
    }
}

/*------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.28  2000/09/18 16:06:11  willem.vandorp
    OpenOffice header added.

    Revision 1.27  2000/02/11 14:59:15  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.26  1999/05/11 19:50:16  JP
    Task #66127#: Methoden rund ums Lineal verbessert und Schnittstellen veraendert/erweitert


      Rev 1.25   11 May 1999 21:50:16   JP
   Task #66127#: Methoden rund ums Lineal verbessert und Schnittstellen veraendert/erweitert

      Rev 1.24   18 Dec 1998 17:56:52   JP
   Bug #60270#: im SwOleClient Flag fuers abklemmen der ViewChgMsg beim Aktivieren

      Rev 1.23   06 Jul 1998 15:19:08   MA
   #52207# Pixelfehler vermeiden

      Rev 1.22   21 Nov 1997 15:00:28   MA
   includes

      Rev 1.21   12 Nov 1997 12:31:08   TJ
   includes vertauscht wegen internal compiler error!

      Rev 1.20   03 Nov 1997 13:58:30   MA
   precomp entfernt

      Rev 1.19   04 Sep 1997 17:14:42   MA
   includes

      Rev 1.18   26 Nov 1996 17:35:02   MA
   Entschlackt

      Rev 1.17   29 Jul 1996 15:47:14   MA
   includes

      Rev 1.16   19 Apr 1996 14:04:10   HJS
   const entfernt

      Rev 1.15   18 Apr 1996 12:58:18   MA
   Umstellung 313

      Rev 1.14   18 Apr 1996 12:05:08   MA
   Umstellung 313

      Rev 1.13   18 Apr 1996 11:53:28   MA
   new: MakeVisible

      Rev 1.12   27 Mar 1996 12:27:30   MA
   fix: Request..(), ggf. MakeVisible rufen

      Rev 1.11   05 Mar 1996 15:51:04   MA
   chg: ein paar SS mit IPObj

      Rev 1.10   01 Feb 1996 19:11:30   JP
   Bug #24833#: Ohne VisSize den Rahmen nicht anzeigen

      Rev 1.9   19 Jan 1996 08:17:02   MA
   chg: EqualSize entfernt

      Rev 1.8   18 Jan 1996 13:20:30   MA
   Umstellung OLE

      Rev 1.7   09 Jan 1996 12:42:02   MA
   fix: ViewChanged, View locken damit nicht gescrollt wird.

      Rev 1.6   24 Nov 1995 16:58:02   OM
   PCH->PRECOMPILED

      Rev 1.5   13 Nov 1995 10:59:48   OM
   static entfernt

      Rev 1.4   20 Sep 1995 13:20:26   JP
   RequestObjectAreaPixel: teil auskommentiert

      Rev 1.3   14 Sep 1995 16:28:04   ER
   add: soipenv.hxx

      Rev 1.2   01 Sep 1995 16:11:14   SWG
   Umstellung 255

      Rev 1.1   14 Jul 1995 15:27:24   MA
   fix: SEXPORT's nachgeruestet.

      Rev 1.0   14 Jul 1995 11:57:52   MA
   new: auf eigenen OleClient umgestellt

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/uiview/uivwimp.cxx b/sw/source/ui/uiview/uivwimp.cxx
new file mode 100644
index 0000000..7d76a6f
--- /dev/null
+++ b/sw/source/ui/uiview/uivwimp.cxx
@@ -0,0 +1,310 @@
/*************************************************************************
 *
 *  $RCSfile: uivwimp.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:49 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop
#include <cmdid.h>
#include "globals.hrc"

#ifndef _UIVWIMP_HXX
#include <uivwimp.hxx>
#endif
#ifndef _SWWVIEW_HXX //autogen
#include <wview.hxx>
#endif

#ifndef _UNOTXVW_HXX
#include <unotxvw.hxx>
#endif

#ifndef _SV_SVAPP_HXX
#include <vcl/svapp.hxx>
#endif
#ifndef _SV_WRKWIN_HXX
#include <vcl/wrkwin.hxx>
#endif
#ifndef _SV_MSGBOX_HXX
#include <vcl/msgbox.hxx>
#endif
#ifndef _SWMODULE_HXX
#include "swmodule.hxx"
#endif
#include <view.hrc>
#ifndef _SFXVIEWFRM_HXX
#include <sfx2/viewfrm.hxx>
#endif

#ifndef _COM_SUN_STAR_SCANNER_XSCANNERMANAGER_HPP_
#include <com/sun/star/scanner/XScannerManager.hpp>
#endif
#ifndef _SFX_BINDINGS_HXX
#include <sfx2/bindings.hxx>
#endif

using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::scanner;
using namespace ::com::sun::star::lang;
/* -----------------02.06.98 15:31-------------------
 *
 * --------------------------------------------------*/
SwView_Impl::SwView_Impl(SwView* pShell) :
        pView(pShell),
        pxXTextView(new uno::Reference<view::XSelectionSupplier>),
        eShellMode(SEL_TEXT)
{
    *pxXTextView = new SwXTextView(pView);
}

/*-----------------13.12.97 09:51-------------------

--------------------------------------------------*/
SwView_Impl::~SwView_Impl()
{
    view::XSelectionSupplier* pTextView = pxXTextView->get();
    ((SwXTextView*)pTextView)->Invalidate();
    delete pxXTextView;
    if(xScanEvtLstnr.is())
           pScanEvtLstnr->ParentDestroyed();
}
/* -----------------------------29.05.00 08:29--------------------------------

 ---------------------------------------------------------------------------*/
SwScannerEventListener::~SwScannerEventListener()
{
}
/* -----------------------------29.05.00 08:29--------------------------------

 ---------------------------------------------------------------------------*/
void SAL_CALL   SwScannerEventListener::disposing( const EventObject& rEventObject )
{
    if( m_pParent )
        m_pParent->ScannerEventHdl( rEventObject );
}

/*-----------------13.12.97 09:54-------------------

--------------------------------------------------*/
void    SwView_Impl::SetShellMode(ShellModes eSet)
{
    eShellMode = eSet;
}
/*-----------------13.12.97 09:59-------------------

--------------------------------------------------*/
view::XSelectionSupplier*   SwView_Impl::GetUNOObject()
{
    return pxXTextView->get();
}
/* -----------------02.06.98 15:29-------------------
 *
 * --------------------------------------------------*/
SwXTextView*    SwView_Impl::GetUNOObject_Impl()
{
        view::XSelectionSupplier* pTextView = pxXTextView->get();
        return ((SwXTextView*)pTextView);
}
/* -----------------------------29.05.00 09:04--------------------------------

 ---------------------------------------------------------------------------*/
void SwView_Impl::ExcuteScan(USHORT nSlot)
{
    switch(nSlot)
    {
        case SID_TWAIN_SELECT:
        {
            BOOL bDone = FALSE;
            Reference< XScannerManager > xScanMgr = SW_MOD()->GetScannerManager();

            if( xScanMgr.is() )
            {
//JP 26.06.00: the appwindow doen't exist
//              Application::GetAppWindow()->EnableInput( FALSE );

                try
                {
                    const Sequence< ScannerContext >
                        aContexts( xScanMgr->getAvailableScanners() );

                    if( aContexts.getLength() )
                    {
                        ScannerContext aContext( aContexts.getConstArray()[ 0 ] );
                        bDone = xScanMgr->configureScanner( aContext );
                    }
                }
                catch(...)
                {
                }

//JP 26.06.00: the appwindow doen't exist
//              Application::GetAppWindow()->EnableInput( TRUE );
            }
            if( !bDone )
                InfoBox( 0, SW_RES(MSG_SCAN_NOSOURCE) ).Execute();
        }
        break;

        case SID_TWAIN_TRANSFER:
        {
            BOOL bDone = FALSE;

            Reference< XScannerManager > xScanMgr = SW_MOD()->GetScannerManager();
            if( xScanMgr.is() )
            {
                SwScannerEventListener& rListener = GetScannerEventListener();
//JP 26.06.00: the appwindow doen't exist
//              Application::GetAppWindow()->EnableInput( FALSE );
                try
                {
                    const Sequence< scanner::ScannerContext >aContexts( xScanMgr->getAvailableScanners() );
                    if( aContexts.getLength() )
                    {
                        Reference< XEventListener > xLstner = &rListener;
                        xScanMgr->startScan( aContexts.getConstArray()[ 0 ], xLstner );
                        bDone = TRUE;
                    }
                }
                catch(...)
                {
                }
            }

            if( !bDone )
            {
//JP 26.06.00: the appwindow doen't exist
//              Application::GetAppWindow()->EnableInput( TRUE );
                InfoBox( 0, SW_RES(MSG_SCAN_NOSOURCE) ).Execute();
            }
            else
            {
                SfxBindings& rBind = pView->GetViewFrame()->GetBindings();
                rBind.Invalidate( SID_TWAIN_SELECT );
                rBind.Invalidate( SID_TWAIN_TRANSFER );
            }
        }
        break;
    }
}

/* -----------------------------29.05.00 08:26--------------------------------

 ---------------------------------------------------------------------------*/
SwScannerEventListener& SwView_Impl::GetScannerEventListener()
{
    if(!xScanEvtLstnr.is())
        xScanEvtLstnr = pScanEvtLstnr = new SwScannerEventListener(pView);
    return *pScanEvtLstnr;
}
/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.14  2000/09/18 16:06:11  willem.vandorp
    OpenOffice header added.

    Revision 1.13  2000/09/07 15:59:32  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.12  2000/06/26 10:44:13  jp
    must change: GetAppWindow->GetDefaultDevice

    Revision 1.11  2000/05/29 08:03:23  os
    new scanner interface

    Revision 1.10  2000/05/09 14:43:13  os
    BASIC interface partially removed

    Revision 1.9  2000/03/23 07:50:24  os
    UNO III

    Revision 1.8  1999/01/27 08:58:26  OS
    #56371# TF_ONE51


      Rev 1.7   27 Jan 1999 09:58:26   OS
   #56371# TF_ONE51

      Rev 1.6   30 Sep 1998 11:37:50   OS
   #52654# ueberfluessigen Aufruf entfernt

      Rev 1.5   02 Jun 1998 15:51:16   OS
   TF_STARONE raus; Ctor nicht mehr inline

      Rev 1.4   03 Apr 1998 14:38:28   OS
   UnoObject fuer die View reaktiviert

      Rev 1.3   04 Feb 1998 17:28:44   OS
   Starone raus

      Rev 1.2   29 Jan 1998 09:21:06   OS
   TF_STARONE

      Rev 1.1   19 Jan 1998 14:59:14   OS
   UNO-Aenderungen

      Rev 1.0   16 Dec 1997 11:58:48   OS
   Impl-Pointer fuer UNO

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/uiview/view.cxx b/sw/source/ui/uiview/view.cxx
new file mode 100644
index 0000000..3271fc0
--- /dev/null
+++ b/sw/source/ui/uiview/view.cxx
@@ -0,0 +1,1743 @@
/*************************************************************************
 *
 *  $RCSfile: view.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:49 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include <string> // HACK: prevent conflict between STLPORT and Workshop headers

#include <stdlib.h>
#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _SV_GRAPH_HXX //autogen
#include <vcl/graph.hxx>
#endif
#ifndef _VCL_INPUTCTX_HXX //autogen
#include <vcl/inputctx.hxx>
#endif
#ifndef _SBX_SBXOBJECT_HXX //autogen
#include <svtools/sbxobj.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SFXVIEWFRM_HXX //autogen
#include <sfx2/viewfrm.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SFX_SAVEOPT_HXX //autogen
#include <sfx2/saveopt.hxx>
#endif
#ifndef _SFXDOCFILE_HXX //autogen
#include <sfx2/docfile.hxx>
#endif
#ifndef _SVX_RULER_HXX //autogen
#include <svx/ruler.hxx>
#endif
#ifndef _SVX_PROTITEM_HXX //autogen
#include <svx/protitem.hxx>
#endif
#ifndef _SBASLTID_HRC //autogen
#include <offmgr/sbasltid.hrc>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _OFA_OSPLCFG_HXX
#include <offmgr/osplcfg.hxx>
#endif

#ifndef _SVX_FMSHELL_HXX //autogen
#include <svx/fmshell.hxx>
#endif
#ifndef _UNOTXVW_HXX
#include <unotxvw.hxx>
#endif

#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _SWHINTS_HXX
#include <swhints.hxx>
#endif

#ifndef _SWMODULE_HXX //autogen
#include <swmodule.hxx>
#endif
#ifndef SW_INPUTWIN_HXX //autogen
#include <inputwin.hxx>
#endif
#ifndef _CHARTINS_HXX //autogen
#include <chartins.hxx>
#endif
#ifndef _UIVWIMP_HXX
#include <uivwimp.hxx>
#endif
#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _UITOOL_HXX
#include <uitool.hxx>
#endif
#ifndef _EDTWIN_HXX
#include <edtwin.hxx>
#endif
#ifndef _TEXTSH_HXX
#include <textsh.hxx>
#endif
#ifndef _LISTSH_HXX
#include <listsh.hxx>
#endif
#ifndef _TABSH_HXX
#include <tabsh.hxx>
#endif
#ifndef _GRFSH_HXX
#include <grfsh.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _FRMSH_HXX
#include <frmsh.hxx>
#endif
#ifndef _OLESH_HXX
#include <olesh.hxx>
#endif
#ifndef _DRAWSH_HXX
#include <drawsh.hxx>
#endif
#ifndef _DRAWBASE_HXX
#include <drawbase.hxx>
#endif
#ifndef _DRFORMSH_HXX
#include <drformsh.hxx>
#endif
#ifndef _DRWTXTSH_HXX
#include <drwtxtsh.hxx>
#endif
#ifndef _BEZIERSH_HXX
#include <beziersh.hxx>
#endif
#ifndef _GLOBDOC_HXX
#include <globdoc.hxx>
#endif
#ifndef _SCROLL_HXX
#include <scroll.hxx>
#endif
#ifndef _GLOBDOC_HXX
#include <globdoc.hxx>
#endif
#ifndef _NAVIPI_HXX
#include <navipi.hxx>
#endif
#ifndef _GLOSHDL_HXX
#include <gloshdl.hxx>
#endif
#ifndef _USRPREF_HXX
#include <usrpref.hxx>
#endif
#ifndef _SRCVIEW_HXX
#include <srcview.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _WDOCSH_HXX
#include <wdocsh.hxx>
#endif
#ifndef _WVIEW_HXX
#include <wview.hxx>
#endif
#ifndef _WORKCTRL_HXX
#include <workctrl.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _BARCFG_HXX
#include <barcfg.hxx>
#endif
#ifndef _DOC_HXX //autogen
#include <doc.hxx>
#endif
#ifndef _PVIEW_HXX
#include <pview.hxx>
#endif

#ifndef _VIEW_HRC
#include <view.hrc>
#endif
#ifndef _GLOBDOC_HRC
#include <globdoc.hrc>
#endif
#ifndef _FRMUI_HRC
#include <frmui.hrc>
#endif


#ifndef _LINGU_LNGPROPS_HHX_
#include <lingu/lngprops.hxx>
#endif
#ifndef _UNO_LINGU_HXX
#include <svx/unolingu.hxx>
#endif

#ifndef _COM_SUN_STAR_SCANNER_SCANNERCONTEXT_HPP_
#include <com/sun/star/scanner/ScannerContext.hpp>
#endif
#ifndef _COM_SUN_STAR_SCANNER_XSCANNERMANAGER_HPP_
#include <com/sun/star/scanner/XScannerManager.hpp>
#endif
#ifndef _TOOLKIT_HELPER_VCLUNOHELPER_HXX_
#include <toolkit/unohlp.hxx>
#endif

using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::scanner;
using namespace ::rtl;
#define C2U(cChar) OUString::createFromAscii(cChar)
#define C2S(cChar) String::CreateFromAscii(cChar)

extern sal_Bool bNoInterrupt;       // in mainwn.cxx

#define SWVIEWFLAGS ( SFX_VIEW_MAXIMIZE_FIRST|          \
                      SFX_VIEW_OBJECTSIZE_EMBEDDED|     \
                      SFX_VIEW_CAN_PRINT|               \
                      SFX_VIEW_HAS_PRINTOPTIONS)

//MA 06. Nov. 95: Each raus in Absprache mit MI wg. Bug 21523
//                    SFX_VIEW_OPTIMIZE_EACH|

/*--------------------------------------------------------------------
    Beschreibung:   Statics
 --------------------------------------------------------------------*/

int bDocSzUpdated = 1;

SvxSearchItem*  SwView::pSrchItem   = 0;

sal_uInt16          SwView::nInsertCtrlState        = FN_INSERT_TABLE;
sal_uInt16          SwView::nWebInsertCtrlState     = FN_INSERT_TABLE;
sal_uInt16          SwView::nInsertObjectCtrlState  = SID_INSERT_DIAGRAM;

sal_Bool            SwView::bExtra      = sal_False;
sal_Bool            SwView::bFound      = sal_False;
sal_Bool            SwView::bJustOpened = sal_False;


SvxSearchDialog*    SwView::pSrchDlg    = 0;
SearchAttrItemList* SwView::pSrchList   = 0;
SearchAttrItemList* SwView::pReplList   = 0;

DBG_NAME(viewhdl);

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

inline SfxDispatcher &SwView::GetDispatcher()
{
    return *GetViewFrame()->GetDispatcher();
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwView::ImpSetVerb( int nSelType )
{
    sal_Bool bResetVerbs = bVerbsActive;
    if ( !GetDocShell()->GetProtocol().IsInPlaceActive() &&
         (SwWrtShell::SEL_OLE|SwWrtShell::SEL_GRF) & nSelType )
    {
        if ( !pWrtShell->IsSelObjProtected(FLYPROTECT_CONTENT) )
        {
            if ( nSelType & SwWrtShell::SEL_OLE )
            {
                SvInPlaceObjectRef xRef = GetWrtShell().GetOLEObj();
                SetVerbs( &xRef->GetVerbList() );
                bVerbsActive = sal_True;
                bResetVerbs = sal_False;
            }
            if ( nSelType & SwWrtShell::SEL_GRF &&

                 SFX_APP()->HasFeature( SFX_FEATURE_SIMAGE ) )
            {
                SvVerb aVerb( 0, SW_RESSTR( STR_VERB_FOR_GRF ));
                SvVerbList aLst;
                aLst.Append( aVerb );
                SetVerbs( &aLst );
                bVerbsActive = sal_True;
                bResetVerbs = sal_False;
            }
        }
    }
    if ( bResetVerbs )
    {
        SetVerbs( 0 );
        bVerbsActive = sal_False;
    }
}


void SwView::SelectShell()
{
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//
//      Achtung: SelectShell fuer die WebView mitpflegen
//
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


    // Entscheidung, ob UpdateTable gerufen werden muss
    sal_Bool bUpdateTable = sal_False;
    const SwFrmFmt* pCurTableFmt = pWrtShell->GetTableFmt();
    if(pCurTableFmt && pCurTableFmt != pLastTableFormat)
    {
        bUpdateTable = sal_True; // kann erst spaeter ausgefuehrt werden
    }
    pLastTableFormat = pCurTableFmt;

    //SEL_TBL und SEL_TBL_CELLS koennen verodert sein!
    int nNewSelectionType = (pWrtShell->GetSelectionType()
                                & ~SwWrtShell::SEL_TBL_CELLS);

    if ( nNewSelectionType == nSelectionType )
    {
        GetViewFrame()->GetBindings().InvalidateAll( sal_False );
        if ( nSelectionType & SwWrtShell::SEL_OLE ||
             nSelectionType & SwWrtShell::SEL_GRF )
            //Fuer Grafiken und OLE kann sich natuerlich das Verb aendern!
            ImpSetVerb( nNewSelectionType );
    }
    else
    {

        SfxDispatcher &rDispatcher = GetDispatcher();
        SwToolbarConfigItem *pBarCfg = SW_MOD()->GetToolbarConfig();

    //  DELETEZ(pxSelectionObj); //Selektionsobjekt loeschen
        if ( pShell )
        {
            rDispatcher.Flush();        // alle gecachten Shells wirklich loeschen

            //Zur alten Selektion merken welche Toolbar sichtbar war
            sal_uInt16 nId = rDispatcher.GetObjectBarId( SFX_OBJECTBAR_OBJECT );
            if ( nId )
                pBarCfg->SetTopToolbar( nSelectionType, nId );

            SfxShell *pSfxShell;
            sal_uInt16 i;
            for ( i = 0; sal_True; ++i )
            {
                pSfxShell = rDispatcher.GetShell( i );
                if ( !(pSfxShell->ISA( SwBaseShell ) ||
                    pSfxShell->ISA( SwDrawTextShell )) )
                    break;
            }
            pSfxShell = rDispatcher.GetShell( --i );
            ASSERT( pSfxShell, "My Shell ist lost in space" );
            rDispatcher.Pop( *pSfxShell, SFX_SHELL_POP_UNTIL | SFX_SHELL_POP_DELETE);
        }

        FASTBOOL bInitFormShell = sal_False;
        if (!pFormShell)
        {
            bInitFormShell = sal_True;
            pFormShell = new FmFormShell( this );
            rDispatcher.Push( *pFormShell );

            StartListening(*pFormShell);
        }

        FASTBOOL bSetExtInpCntxt = sal_False;
        nSelectionType = nNewSelectionType;
        ShellModes eShellMode;

        if ( nSelectionType & SwWrtShell::SEL_OLE )
        {
            eShellMode = SEL_OBJECT;
            pShell = new SwOleShell( *this );
            rDispatcher.Push( *pShell );
        }
        else if ( nSelectionType & SwWrtShell::SEL_FRM
            || nSelectionType & SwWrtShell::SEL_GRF)
        {
            eShellMode = SEL_FRAME;
            pShell = new SwFrameShell( *this );
            rDispatcher.Push( *pShell );
            if(nSelectionType & SwWrtShell::SEL_GRF )
            {
                eShellMode = SEL_GRAPHIC;
                pShell = new SwGrfShell( *this );
                rDispatcher.Push( *pShell );
            }
        }
        else if ( nSelectionType & SwWrtShell::SEL_DRW )
        {
            eShellMode = SEL_DRAW;
            pShell = new SwDrawShell( *this );

            rDispatcher.Push( *pShell );
            if ( nSelectionType & SwWrtShell::SEL_BEZ )
            {
                eShellMode = SEL_BEZIER;
                pShell = new SwBezierShell( *this );
                rDispatcher.Push( *pShell );
            }
        }
        else if ( nSelectionType & SwWrtShell::SEL_DRW_FORM )
        {
            eShellMode = SEL_DRAW_FORM;
            pShell = new SwDrawFormShell( *this );

            rDispatcher.Push( *pShell );
        }
        else if ( nSelectionType & SwWrtShell::SEL_DRW_TXT )
        {
            eShellMode = SEL_DRAWTEXT;
            rDispatcher.Push( *(new SwBaseShell( *this )) );
            pShell = new SwDrawTextShell( *this );
            rDispatcher.Push( *pShell );
        }
        else
        {
            bSetExtInpCntxt = sal_True;
            eShellMode = SEL_TEXT;
            sal_uInt32 nHelpId = 0;
            if ( nSelectionType & SwWrtShell::SEL_NUM )
            {
                eShellMode = SEL_LIST_TEXT;
                pShell = new SwListShell( *this );
                nHelpId = pShell->GetHelpId();
                rDispatcher.Push( *pShell );
            }
            pShell = new SwTextShell(*this);
            if(nHelpId)
                pShell->SetHelpId(nHelpId);
            rDispatcher.Push( *pShell );
            if ( nSelectionType & SwWrtShell::SEL_TBL )
            {
                eShellMode = eShellMode == SEL_LIST_TEXT ? SEL_TABLE_LIST_TEXT
                                                        : SEL_TABLE_TEXT;
                pShell = new SwTableShell( *this );
                rDispatcher.Push( *pShell );
            }
        }
        pViewImpl->SetShellMode(eShellMode);
        ImpSetVerb( nSelectionType );

        if( !GetDocShell()->IsReadOnly() )
        {
            if( bSetExtInpCntxt && GetWrtShell().HasReadonlySel() )
                bSetExtInpCntxt = sal_False;

            InputContext aCntxt( GetEditWin().GetInputContext() );
            aCntxt.SetOptions( bSetExtInpCntxt
                                ? (aCntxt.GetOptions() |
                                        ( INPUTCONTEXT_TEXT |
                                            INPUTCONTEXT_EXTTEXTINPUT ))
                                : (aCntxt.GetOptions() & ~
                                        ( INPUTCONTEXT_TEXT |
                                            INPUTCONTEXT_EXTTEXTINPUT )) );
            GetEditWin().SetInputContext( aCntxt );
        }

        //Zur neuen Selektion die Toolbar aktivieren, die auch beim letzten Mal
        //aktiviert war
        //Vorher muss ein Flush() sein, betrifft aber lt. MBA nicht das UI und ist
        //kein Performance-Problem
        rDispatcher.Flush();
        sal_uInt16 nId = pBarCfg->GetTopToolbar( nSelectionType );
        if ( USHRT_MAX != nId )
            rDispatcher.ShowObjectBar( nId );

        Point aPnt = GetEditWin().OutputToScreenPixel(GetEditWin().GetPointerPosPixel());
        aPnt = GetEditWin().PixelToLogic(aPnt);
        GetEditWin().UpdatePointer(aPnt);

        if ( bInitFormShell && GetWrtShell().GetDrawView() )
            pFormShell->SetView(PTR_CAST(FmFormView, GetWrtShell().GetDrawView()));

    }
    //Guenstiger Zeitpunkt fuer die Kommunikation mit OLE-Objekten?
    if ( GetDocShell()->GetDoc()->IsOLEPrtNotifyPending() )
        GetDocShell()->GetDoc()->PrtOLENotify( sal_False );

    //jetzt das Tabellen-Update
    if(bUpdateTable)
        pWrtShell->UpdateTable();
}

//Zusammenspiel: AttrChangedNotify() und TimeoutHdl.
//Falls noch Actions offen sind keine Aktualisierung, da der
//Cursor auf der Core-Seite im Wald stehen kann.
//Da wir aber keine Stati mehr liefern koennen und wollen locken wir
//stattdessen den Dispatcher.



int
#if defined( WNT )
 __cdecl
#endif
#if defined( ICC )
 _Optlink
#endif
    lcl_CmpIds( const void *pFirst, const void *pSecond)
{
    return (*(sal_uInt16*)pFirst) - (*(sal_uInt16*)pSecond);
}



IMPL_LINK( SwView, AttrChangedNotify, SwWrtShell *, EMPTYARG )
{
    if ( GetEditWin().IsChainMode() )
        GetEditWin().SetChainMode( sal_False );

    //Opt: Nicht wenn PaintLocked. Beim Unlock wird dafuer nocheinmal ein
    //Notify ausgeloest.
    if( !pWrtShell->IsPaintLocked() && !bNoInterrupt &&
        GetDocShell()->IsReadOnly() )
        _CheckReadonlyState();

    // JP 19.01.99: Cursor in Readonly Bereichen
    if( !pWrtShell->IsPaintLocked() && !bNoInterrupt )
        _CheckReadonlySelection();

    if( !bAttrChgNotified )
    {
        if ( pWrtShell->BasicActionPend() || bNoInterrupt ||
             GetDispatcher().IsLocked() ||               //do not confuse the SFX
             GetViewFrame()->GetBindings().IsInUpdate() )//do not confuse the SFX
        {
            bAttrChgNotified = sal_True;
            aTimer.Start();

            const SfxPoolItem *pItem;
            if ( SFX_ITEM_SET != GetObjectShell()->GetMedium()->GetItemSet()->
                                    GetItemState( SID_HIDDEN, sal_False, &pItem ) ||
                 !((SfxBoolItem*)pItem)->GetValue() )
            {
                GetViewFrame()->GetBindings().ENTERREGISTRATIONS();
                bAttrChgNotifiedWithRegistrations = sal_True;
            }
        }
        else
            SelectShell();
    }
    GetViewImpl()->GetUNOObject_Impl()->NotifySelChanged();
    return 0;
}



IMPL_LINK( SwView, TimeoutHdl, Timer *, EMPTYARG )
{
    DBG_PROFSTART(viewhdl);

    if( pWrtShell->BasicActionPend() || bNoInterrupt )
    {
        aTimer.Start();
        DBG_PROFSTOP(viewhdl);
        return 0;
    }

    if ( bAttrChgNotifiedWithRegistrations )
    {
        GetViewFrame()->GetBindings().LEAVEREGISTRATIONS();
        bAttrChgNotifiedWithRegistrations = sal_False;
    }

    _CheckReadonlyState();
    _CheckReadonlySelection();

    SelectShell();
    bAttrChgNotified = sal_False;

    DBG_PROFSTOP(viewhdl);
    return 0;
}

void SwView::_CheckReadonlyState()
{
    SfxDispatcher &rDis = GetDispatcher();
    //Um erkennen zu koennen ob bereits disabled ist!
    SfxItemState eStateRO, eStateProtAll;
    const SfxPoolItem *pItem;
    // JP 29.04.97: von einem nur uns bekannten Slot den Status abfragen.
    //              Ansonsten kennen andere den Slot; wie z.B. die BasidIde
    eStateRO = rDis.QueryState( FN_INSERT_BOOKMARK, pItem );
    eStateProtAll = rDis.QueryState( FN_EDIT_REGION, pItem );
    sal_Bool bChgd = sal_False;

    if ( !pWrtShell->IsCrsrReadonly() )
    {
        static sal_uInt16 aROIds[] =
        {
            SID_DELETE,                 FN_BACKSPACE,               FN_SHIFT_BACKSPACE,
            SID_UNDO,
            SID_REDO,                   SID_REPEAT,                 SID_PASTE,
            FN_PASTESPECIAL,            SID_SBA_BRW_INSERT,
            SID_BACKGROUND_COLOR,       FN_INSERT_BOOKMARK,
            FN_INSERT_SYMBOL,           FN_INSERT_SOFT_HYPHEN,
            FN_INSERT_HARDHYPHEN,       FN_INSERT_HARD_SPACE,       FN_INSERT_BREAK,
            FN_INSERT_LINEBREAK,        FN_INSERT_COLUMN_BREAK,     FN_INSERT_BREAK_DLG,
            FN_DELETE_SENT,             FN_DELETE_BACK_SENT,        FN_DELETE_WORD,
            FN_DELETE_BACK_WORD,        FN_DELETE_LINE,             FN_DELETE_BACK_LINE,
            FN_DELETE_PARA,             FN_DELETE_BACK_PARA,        FN_DELETE_WHOLE_LINE,
            FN_CALCULATE,               FN_FORMAT_RESET,
            FN_POSTIT,                  FN_JAVAEDIT,                SID_ATTR_PARA_ADJUST_LEFT,
            SID_ATTR_PARA_ADJUST_RIGHT, SID_ATTR_PARA_ADJUST_CENTER,SID_ATTR_PARA_ADJUST_BLOCK,
            SID_ATTR_PARA_LINESPACE_10, SID_ATTR_PARA_LINESPACE_15, SID_ATTR_PARA_LINESPACE_20,
            SID_ATTR_CHAR_FONT,         SID_ATTR_CHAR_FONTHEIGHT,   SID_ATTR_CHAR_COLOR_BACKGROUND,
            SID_ATTR_CHAR_COLOR_BACKGROUND_EXT,                     SID_ATTR_CHAR_COLOR_EXT,
            SID_ATTR_CHAR_COLOR,        SID_ATTR_CHAR_WEIGHT,       SID_ATTR_CHAR_POSTURE,
            SID_ATTR_CHAR_UNDERLINE,    SID_ATTR_FLASH,             SID_ATTR_CHAR_STRIKEOUT,
            FN_UNDERLINE_DOUBLE,        SID_ATTR_CHAR_CONTOUR,      SID_ATTR_CHAR_SHADOWED,
            SID_ATTR_CHAR_AUTOKERN,     SID_ATTR_CHAR_ESCAPEMENT,   FN_SET_SUPER_SCRIPT,
            FN_SET_SUB_SCRIPT,          SID_ATTR_CHAR_CASEMAP,      SID_ATTR_CHAR_LANGUAGE,
            SID_ATTR_CHAR_KERNING,      SID_CHAR_DLG,               SID_ATTR_CHAR_WORDLINEMODE,
            FN_GROW_FONT_SIZE,          FN_SHRINK_FONT_SIZE,        FN_TXTATR_INET,
            FN_FORMAT_DROPCAPS,         SID_ATTR_PARA_ADJUST,       SID_ATTR_PARA_LINESPACE,
            SID_ATTR_PARA_SPLIT,        SID_ATTR_PARA_KEEP,         SID_ATTR_PARA_WIDOWS,
            SID_ATTR_PARA_ORPHANS,
            SID_ATTR_PARA_MODEL,        SID_PARA_DLG,
            FN_SELECT_PARA,             SID_DEC_INDENT,
            SID_INC_INDENT
        };
        static sal_Bool bFirst = sal_True;
        if ( bFirst )
        {
            qsort( (void*)aROIds, sizeof(aROIds)/sizeof(sal_uInt16), sizeof(sal_uInt16), lcl_CmpIds );
            bFirst = sal_False;
        }
        if ( SFX_ITEM_DISABLED == eStateRO )
        {
            rDis.SetSlotFilter( sal_Bool(2), sizeof(aROIds)/sizeof(sal_uInt16), aROIds );
            bChgd = sal_True;
        }
    }
    else if( pWrtShell->IsAllProtect() )
    {
        if ( SFX_ITEM_DISABLED == eStateProtAll )
        {
            static sal_uInt16 aAllProtIds[] = { SID_SAVEDOC, FN_EDIT_REGION };
            static sal_Bool bAllProtFirst = sal_True;
            if ( bAllProtFirst )
            {
                qsort( (void*)aAllProtIds, sizeof(aAllProtIds)/sizeof(sal_uInt16), sizeof(sal_uInt16), lcl_CmpIds );
                bAllProtFirst = sal_False;
            }
            rDis.SetSlotFilter( sal_Bool(2),
                                sizeof(aAllProtIds)/sizeof(sal_uInt16),
                                aAllProtIds );
            bChgd = sal_True;
        }
    }
    else if ( SFX_ITEM_DISABLED != eStateRO ||
                SFX_ITEM_DISABLED != eStateProtAll )
    {
        bChgd = sal_True;
        rDis.SetSlotFilter();
    }
    if ( bChgd )
        GetViewFrame()->GetBindings().InvalidateAll(sal_True);
}

void SwView::_CheckReadonlySelection()
{
    sal_uInt32 nDisableFlags = 0;
    SfxDispatcher &rDis = GetDispatcher();

    if( pWrtShell->HasReadonlySel() &&
        ( !pWrtShell->GetDrawView() ||
            !pWrtShell->GetDrawView()->GetMarkList().GetMarkCount() ))
        nDisableFlags |= SW_DISABLE_ON_PROTECTED_CURSOR;

    if( (SW_DISABLE_ON_PROTECTED_CURSOR & nDisableFlags ) !=
        (SW_DISABLE_ON_PROTECTED_CURSOR & rDis.GetDisableFlags() ) )
    {
        // zusaetzlich am Window den InputContext umsetzen, damit in
        // japanischen / chinesischen Versionen die externe Eingabe
        // ab-/angeschaltet wird. Das aber nur wenn auch die richtige
        // Shell auf dem Stack steht.
        switch( pViewImpl->GetShellMode() )
        {
        case SEL_TEXT:
        case SEL_LIST_TEXT:
        case SEL_TABLE_TEXT:
        case SEL_TABLE_LIST_TEXT:
            {
//JP 22.01.99: temporaere Loesung!!! Sollte bei jeder Cursorbewegung
//          den Font von der akt. Einfuegeposition setzen, also ausserhalb
//          dieses if's. Aber TH wertet den Font zur Zeit nicht aus und
//          das besorgen erscheint mir hier zu teuer zu sein.
//          Ausserdem haben wir keinen Font, sondern nur Attribute aus denen
//          die Textformatierung dann den richtigen Font zusammen baut.

                InputContext aCntxt( GetEditWin().GetInputContext() );
                aCntxt.SetOptions( SW_DISABLE_ON_PROTECTED_CURSOR & nDisableFlags
                                    ? (aCntxt.GetOptions() & ~
                                            ( INPUTCONTEXT_TEXT |
                                                INPUTCONTEXT_EXTTEXTINPUT ))
                                    : (aCntxt.GetOptions() |
                                            ( INPUTCONTEXT_TEXT |
                                                INPUTCONTEXT_EXTTEXTINPUT )) );
                GetEditWin().SetInputContext( aCntxt );
            }
            break;
        }

    }

    if( nDisableFlags != rDis.GetDisableFlags() )
    {
        rDis.SetDisableFlags( nDisableFlags );
        GetViewFrame()->GetBindings().InvalidateAll( sal_True );
    }
}


SwView::SwView( SfxViewFrame *pFrame, SfxViewShell* pOldSh )
    : SfxViewShell( pFrame, SWVIEWFLAGS ),
    aPageStr( SW_RES( STR_PAGE )),
    pEditWin( new SwEditWin( &pFrame->GetWindow(), *this ) ),
    pShell(0),
    pWrtShell(0),
    pFormShell(0),
    pHScrollbar(0),
    pVScrollbar(0),
    pScrollFill(0),
    pHLineal( new SvxRuler(&GetViewFrame()->GetWindow(), pEditWin,
                    SVXRULER_SUPPORT_TABS |
                    SVXRULER_SUPPORT_PARAGRAPH_MARGINS |
                    SVXRULER_SUPPORT_BORDERS |
                    SVXRULER_SUPPORT_NEGATIVE_MARGINS,
                    GetViewFrame()->GetBindings(),
                    WB_STDRULER | WB_EXTRAFIELD | WB_3DLOOK | WB_BORDER)),
    pVLineal(0),
    pTogglePageBtn(0),
    pPageUpBtn(0),
    pPageDownBtn(0),
    pNaviBtn(0),
    pGlosHdl(0),
    pDrawActual(0),
    pLastTableFormat(0),
    nDrawSfxId( USHRT_MAX ),
    nFormSfxId( USHRT_MAX ),
    nSelectionType( INT_MAX )
{
    bCenterCrsr = bTopCrsr = bAllwaysShowSel = bTabColFromDoc =
    bSetTabColFromDoc = bAttrChgNotified = bAttrChgNotifiedWithRegistrations =
    bVerbsActive = bIsApi = bDrawRotate = bInOuterResizePixel = sal_False;

    bShowAtResize = bDrawSelMode = bDocSzUpdated = sal_True;

    pViewImpl = new SwView_Impl(this);
    SetName(C2S("View"));
    SetWindow( pEditWin );

    aTimer.SetTimeout( 120 );

    SwDocShell* pDocSh = PTR_CAST( SwDocShell, pFrame->GetObjectShell() );
    ASSERT( pDocSh, "View ohne DocShell." );
    SwWebDocShell* pWebDShell = PTR_CAST( SwWebDocShell, pDocSh );

    SwViewOption aUsrPref( *SW_MOD()->GetUsrPref( 0 != pWebDShell ));
    uno::Reference< beans::XPropertySet >  xProp( ::GetLinguPropertySet() );
    sal_Bool bVal;

    bVal = xProp.is() ?
            *(sal_Bool*)xProp->getPropertyValue( C2U(UPN_IS_SPELL_AUTO)).getValue() : sal_False;
    aUsrPref.SetOnlineSpell( bVal );
    bVal = xProp.is() ?
            *(sal_Bool*)xProp->getPropertyValue( C2U(UPN_IS_SPELL_HIDE)).getValue() : sal_False;
    aUsrPref.SetHideSpell( bVal );

    if( !pOldSh )
    {
        //Gibt es schon eine Sicht auf das Dokument?
        SfxViewFrame *pF = SfxViewFrame::GetFirst( pDocSh );
        if( pF == pFrame )
            pF = SfxViewFrame::GetNext( *pF, pDocSh );
        if( pF )
            pOldSh = pF->GetViewShell();
    }
    else if( pOldSh->IsA( TYPE( SwPagePreView ) ) )
    {
        sSwViewData = ((SwPagePreView*)pOldSh)->GetPrevSwViewData();
        sNewCrsrPos = ((SwPagePreView*)pOldSh)->GetNewCrsrPos();
    }

    if(PTR_CAST( SwView, pOldSh))
    {
        pWrtShell = new SwWrtShell(((SwView*)pOldSh)->pWrtShell, pEditWin, *this);
//MA: Das kann doch nur zu einem GPF fuehren!
//      nSelectionType = ((SwView*)pOldSh)->nSelectionType;
    }
    else
    {
        SwDoc *pDoc = ((SwDocShell*)pDocSh)->GetDoc();

        if( PTR_CAST(SwSrcView, pOldSh) || pWebDShell )
            pDoc->SetBrowseMode( sal_True );

        //Fuer den BrowseMode wollen wir keinen Factor uebernehmen.
        if( pDoc->IsBrowseMode() && aUsrPref.GetZoomType() != SVX_ZOOM_PERCENT )
        {
            aUsrPref.SetZoomType( SVX_ZOOM_PERCENT );
            aUsrPref.SetZoom( 100 );
        }
        pWrtShell = new SwWrtShell( pDoc, ::GetSpellChecker(), ::GetHyphenator(),
                                    pEditWin, *this,
                                    0, &aUsrPref);
    }

    // JP 05.02.99: Bug 61495 - damit unter anderem das HLineal im
    //              ReadonlyFall nicht angezeigt wird
    aUsrPref.SetReadonly( pWrtShell->GetViewOptions()->IsReadonly() );

    //Kein Margin fuer OLE!
    Size aBrwsBorder;
    if( SFX_CREATE_MODE_EMBEDDED != pDocSh->GetCreateMode() )
        aBrwsBorder = GetMargin();

    if( pFrame->GetFrameType() & SFXFRAME_INTERNAL )
        pWrtShell->SetFrameView( aBrwsBorder );
    else
        pWrtShell->SetBrowseBorder( aBrwsBorder );

    // Im CTOR duerfen keine Shell wechsel erfolgen, die muessen ueber
    // den Timer "zwischen gespeichert" werden. Sonst raeumt der SFX
    // sie wieder vom Stack!
    sal_Bool bOld = bNoInterrupt;
    bNoInterrupt = sal_True;

    pHLineal->SetActive( sal_True );

    SfxViewFrame* pViewFrame = GetViewFrame();
    if( pViewFrame->GetFrame()->GetParentFrame())
    {
        aUsrPref.SetViewTabwin(sal_False);
        aUsrPref.SetViewVLin(sal_False);
    }

    StartListening( *pViewFrame );
    StartListening( *pDocSh );

    // Vom HLineal den ZOOM-Faktor einstellen
    pHLineal->SetZoom( Fraction( aUsrPref.GetZoom(), 100 ) );
    pHLineal->SetDoubleClickHdl(LINK( this, SwView, ExecRulerClick ));
    FieldUnit eMetric = ::GetDfltMetric( 0 != pWebDShell );
    if( FUNIT_MM == eMetric )
        eMetric = FUNIT_CM;
    pHLineal->SetUnit( eMetric );

    // DocShell setzen
    pDocSh->SetView( this );
    SW_MOD()->SetView( this );

    // Die DocSize erfragen und verarbeiten. Ueber die Handler konnte
    // die Shell nicht gefunden werden, weil die Shell innerhalb CTOR-Phase
    // nicht in der SFX-Verwaltung bekannt ist.
    DocSzChgd( pWrtShell->GetDocSize() );

        // AttrChangedNotify Link setzen
    pWrtShell->SetChgLnk(LINK(this, SwView, AttrChangedNotify));

    if( pDocSh->GetCreateMode() == SFX_CREATE_MODE_EMBEDDED &&
        !((SvEmbeddedObject *)pDocSh)->GetVisArea().IsEmpty() )
        SetVisArea( ((SvEmbeddedObject *)pDocSh)->GetVisArea(),sal_False);

    SwEditShell::SetUndoActionCount( SFX_APP()->GetOptions().GetUndoCount() );
    pWrtShell->DoUndo( 0 != SwEditShell::GetUndoActionCount() );

    const FASTBOOL bBrowse = pWrtShell->GetDoc()->IsBrowseMode();
    SetNewWindowAllowed(!bBrowse);

    if( aUsrPref.IsViewVScrollBar() )
        CreateVScrollbar();
    if( aUsrPref.IsViewHScrollBar() || bBrowse )
        CreateHScrollbar();
    if( aUsrPref.IsViewTabwin() )
        CreateTab();
    if( aUsrPref.IsViewVLin() )
        CreateVLineal();

    pWrtShell->SetUIOptions( aUsrPref );
    pWrtShell->SetReadOnlyAvailable( aUsrPref.IsCursorInProtectedArea() );

    if( UseObjectSize() )
    {
        //Damit der Sfx _rechtzeitig weiss_, wie gross die ::com::sun::star::sheet::Border sind.
        SvBorder aTmp;
        CalcAndSetBorderPixel( aTmp, sal_True );
    }

    if( pWrtShell->GetDoc()->IsUpdateExpFld() )
    {
        SET_CURR_SHELL( pWrtShell );
        pWrtShell->StartAction();
        pWrtShell->CalcLayout();
        pWrtShell->GetDoc()->UpdateFlds();
        pWrtShell->EndAction();
        pWrtShell->GetDoc()->SetUpdateExpFldStat( sal_False );
    }

    // ggfs. alle Verzeichnisse updaten:
    if( pWrtShell->GetDoc()->IsUpdateTOX() )
    {
        SfxRequest aSfxRequest( FN_UPDATE_TOX, SFX_CALLMODE_SLOT, GetPool() );
        Execute( aSfxRequest );
        pWrtShell->GetDoc()->SetUpdateTOX( sal_False );     // wieder zurueck setzen
        pWrtShell->SwCrsrShell::SttDoc();
    }

    // kein ResetModified, wenn es schone eine View auf dieses Doc gibt
    SfxViewFrame* pVFrame = GetViewFrame();
    SfxViewFrame* pFirst = SfxViewFrame::GetFirst(pDocSh);
    // zur Zeit(360) wird die View erst nach dem Ctor eingetragen
    // der folgende Ausdruck funktioniert auch, wenn sich das aendert
    //JP 27.07.98: wenn per Undo nicht mehr die Modifizierung aufhebar ist,
    //              so setze das Modified NICHT zurueck.
    if( !pWrtShell->GetDoc()->IsUndoNoResetModified() &&
        (!pFirst || pFirst == pVFrame ) )
        pWrtShell->ResetModified();

    bNoInterrupt = bOld;

    // wird ein GlobalDoc neu angelegt, soll auch der Navigator erzeugt werden
    if( pDocSh->IsA(SwGlobalDocShell::StaticType()) &&
        !pVFrame->GetChildWindow( SID_NAVIGATOR ))
    {
        SfxBoolItem aNavi(SID_NAVIGATOR, sal_True);
        GetDispatcher().Execute(SID_NAVIGATOR, SFX_CALLMODE_ASYNCHRON, &aNavi, 0L);
    }


    uno::Reference< awt::XWindow >  aTmpRef;
    pFrame->GetFrame()->GetFrameInterface()->setComponent( aTmpRef,
                                            pViewImpl->GetUNOObject_Impl());

    aTimer.Stop();
    aTimer.SetTimeoutHdl(LINK(this, SwView, TimeoutHdl));
    bAttrChgNotified = bAttrChgNotifiedWithRegistrations = sal_False;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


SwView::~SwView()
{
    pEditWin->Hide(); // damit kein Paint Aerger machen kann!
    // An der SwDocShell den Pointer auf die View ruecksetzen
    SwDocShell* pDocSh = GetDocShell();
    if( pDocSh && pDocSh->GetView() == this )
        pDocSh->SetView( 0 );
    if ( SW_MOD()->GetView() == this )
        SW_MOD()->SetView( 0 );

    if( aTimer.IsActive() && bAttrChgNotifiedWithRegistrations )
        GetViewFrame()->GetBindings().LEAVEREGISTRATIONS();

    SetWindow( 0 );

    EndListening(*GetViewFrame());
    EndListening(*GetDocShell());
    delete pScrollFill;
    delete pWrtShell;
    pWrtShell = 0;      // Auf 0 setzen, damit folgende DToren nicht drauf zugreifen
    pShell = 0;
    delete pHScrollbar;
    delete pVScrollbar;
    delete pHLineal;
    delete pVLineal;
    delete pTogglePageBtn;
    delete pPageUpBtn;
    delete pNaviBtn;
    delete pPageDownBtn;
    delete pGlosHdl;
    delete pViewImpl;
    delete pEditWin;
}

/*--------------------------------------------------------------------
    Beschreibung:   DocShell rausgrabbeln ueber das FrameWindow
 --------------------------------------------------------------------*/


SwDocShell* SwView::GetDocShell()
{
    return PTR_CAST(SwDocShell, GetViewFrame()->GetObjectShell());
}

/*--------------------------------------------------------------------
    Beschreibung:   CursorPos merken
 --------------------------------------------------------------------*/


void SwView::WriteUserData( String &rUserData, sal_Bool bBrowse )
{
    //Das Browse-Flag wird vom Sfx durchgereicht, wenn Dokumente gebrowsed
    //werden (nicht zu verwechseln mit dem BrowseMode).
    //Die dann gespeicherten Daten sind nicht persistent!!

    const SwRect& rRect = pWrtShell->GetCharRect();
    const Rectangle& rVis = GetVisArea();

    rUserData = String::CreateFromInt32( rRect.Left() );
    rUserData += ';';
    rUserData += String::CreateFromInt32( rRect.Top() );
    rUserData += ';';
    rUserData += String::CreateFromInt32( pWrtShell->GetViewOptions()->GetZoom() );
    rUserData += ';';
    rUserData += String::CreateFromInt32( rVis.Left() );
    rUserData += ';';
    rUserData += String::CreateFromInt32( rVis.Top() );
    rUserData += ';';
    rUserData += String::CreateFromInt32( bBrowse ? LONG_MIN : rVis.Right());
    rUserData += ';';
    rUserData += String::CreateFromInt32( bBrowse ? LONG_MIN : rVis.Bottom());
    rUserData += ';';
    rUserData += String::CreateFromInt32(
            (sal_uInt16)pWrtShell->GetViewOptions()->GetZoomType());//eZoom;
    rUserData += ';';
    rUserData += FRMTYPE_NONE == pWrtShell->GetSelFrmType() ? '0' : '1';
}

/*--------------------------------------------------------------------
    Beschreibung: CursorPos setzen
 --------------------------------------------------------------------*/


void SwView::ReadUserData( const String &rUserData, sal_Bool bBrowse )
{
    if ( rUserData.GetTokenCount() > 1 &&
        //Fuer Dokumente ohne Layout nur im OnlineLayout oder beim
        //Forward/Backward
         (!pWrtShell->IsNewLayout() || pWrtShell->IsBrowseMode() || bBrowse) )
    {
        SET_CURR_SHELL(pWrtShell);

        sal_uInt16 nPos = 0;

        // Nein, es ist *keine* gute Idee GetToken gleich im Point-Konstr.
        // aufzurufen, denn welcher Parameter wird zuerst ausgewertet?
        long nX = rUserData.GetToken( 0, ';', nPos ).ToInt32(),
             nY = rUserData.GetToken( 0, ';', nPos ).ToInt32();
        Point aCrsrPos( nX, nY );

        sal_uInt16 nZoomFactor  = rUserData.GetToken(0, ';', nPos ).ToInt32();

        long nLeft  = rUserData.GetToken(0, ';', nPos ).ToInt32(),
             nTop   = rUserData.GetToken(0, ';', nPos ).ToInt32(),
             nRight = rUserData.GetToken(0, ';', nPos ).ToInt32(),
             nBottom= rUserData.GetToken(0, ';', nPos ).ToInt32();

        const long nAdd = pWrtShell->IsBrowseMode() ? DOCUMENTBORDER : DOCUMENTBORDER*2;
        if ( nBottom <= (pWrtShell->GetDocSize().Height()+nAdd) )
        {
            pWrtShell->EnableSmooth( sal_False );

            const Rectangle aVis( nLeft, nTop, nRight, nBottom );

            sal_uInt16 nOff = 0;
            SvxZoomType eZoom;
            if( !pWrtShell->GetDoc()->IsBrowseMode() )
                eZoom = (SvxZoomType) (sal_uInt16)rUserData.GetToken(nOff, ';', nPos ).ToInt32();
            else
            {
                eZoom = SVX_ZOOM_PERCENT;
                ++nOff;
            }

            sal_Bool bSelectObj = (0 != rUserData.GetToken( nOff, ';', nPos ).ToInt32())
                                && pWrtShell->IsObjSelectable( aCrsrPos );

            pWrtShell->SwCrsrShell::SetCrsr( aCrsrPos, !bSelectObj );
            if( bSelectObj )
            {
                pWrtShell->SelectObj( aCrsrPos );
                pWrtShell->EnterSelFrmMode( &aCrsrPos );
            }

            SelectShell();

            pWrtShell->StartAction();
            const SwViewOption* pVOpt = pWrtShell->GetViewOptions();
            if( pVOpt->GetZoom() != nZoomFactor || pVOpt->GetZoomType() != eZoom )
                SetZoom( eZoom, nZoomFactor);
            if ( bBrowse )
                SetVisArea( aVis.TopLeft() );
            else
                SetVisArea( aVis );

            pWrtShell->LockView( sal_True );
            pWrtShell->EndAction();
            pWrtShell->LockView( sal_False );
            pWrtShell->EnableSmooth( sal_True );
        }
    }
}

void SwView::UIDeactivate( SvInPlaceObject* )
{
    GetEditWin().OleToGrf();
}



void SwView::ShowCursor( FASTBOOL bOn )
{
    if ( bOn )
        pWrtShell->ShowCrsrs( sal_True );
    else
        pWrtShell->HideCrsrs();
}



ErrCode SwView::DoVerb( long nVerb )
{
    if ( !GetDocShell()->GetProtocol().IsInPlaceActive() )
    {
        SwWrtShell &rSh = GetWrtShell();
        const int nSel = rSh.GetSelectionType();
        if ( nSel & SwWrtShell::SEL_OLE )
            rSh.LaunchOLEObj( nVerb );
        else if ( nSel & SwWrtShell::SEL_GRF && nVerb == 0 )
            GetDispatcher().Execute( SID_SIM_START );
    }
    return ERRCODE_NONE;
}

/*-----------------17.02.98 13:33-------------------
    nur sal_True fuer eine Textselektion zurueck geben
--------------------------------------------------*/
sal_Bool SwView::HasSelection( sal_Bool  bText ) const
{
    return bText ? GetWrtShell().SwCrsrShell::HasSelection()
                 : GetWrtShell().HasSelection();
}

/*-----------------09/16/97 09:50am-----------------

--------------------------------------------------*/

String SwView::GetSelectionText( sal_Bool bComplete )
{
    return GetSelectionTextParam( bComplete, sal_True );
}

/*-----------------09/16/97 09:50am-----------------

--------------------------------------------------*/
String  SwView::GetSelectionTextParam(  sal_Bool bComplete,
                                            sal_Bool bEraseTrail,
                                            sal_Bool bExtendedDelimiter )
{
    String sReturn;

    if (bComplete && !GetWrtShell().HasSelection())
    {
        const char sDelimiter[] = " \t\n\r";
        const char sExtDelimiter[] = " \t\n\r.,:;()<>{}";
        WordSelection::SetWordDelimiter(bExtendedDelimiter ?
                                            sExtDelimiter : sDelimiter);
        GetWrtShell().SelWrd();
        WordSelection::ResetWordDelimiter();
    }

    GetWrtShell().GetSelectedText(sReturn);
    if(bEraseTrail)
        sReturn.EraseTrailingChars();
    return sReturn;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



SwGlossaryHdl* SwView::GetGlosHdl()
{
    if(!pGlosHdl)
        pGlosHdl = new SwGlossaryHdl(GetViewFrame(), pWrtShell);
    return pGlosHdl;
}

/*-----------------05.09.96 15.50-------------------

--------------------------------------------------*/



void SwView::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
{
    FASTBOOL bCallBase = sal_True;
    if ( rHint.ISA(SfxSimpleHint) )
    {
        sal_uInt32 nId = ((SfxSimpleHint&)rHint).GetId();
        switch ( nId )
        {
            case SFX_HINT_MODECHANGED:
                {
                    // Modalmodus-Umschaltung?
                    sal_Bool bModal = GetDocShell()->IsInModalMode();
                    if(pHLineal)
                        pHLineal->SetActive( !bModal );
                    if(pVLineal)
                        pVLineal->SetActive( !bModal );
                }

                /* kein break hier */

            case SFX_HINT_TITLECHANGED:
                if ( GetDocShell()->IsReadOnly() != GetWrtShell().GetViewOptions()->IsReadonly() )
                {
                    SwWrtShell &rSh = GetWrtShell();
                    rSh.SetReadonlyOption( GetDocShell()->IsReadOnly() );

                    if ( rSh.GetViewOptions()->IsViewVLin() )
                        CreateVLineal();
                    else
                        KillVLineal();
                    if ( rSh.GetViewOptions()->IsViewTabwin() )
                        CreateTab();
                    else
                        KillTab();
                    SfxBoolItem aItem( SID_FM_DESIGN_MODE, !GetDocShell()->IsReadOnly());
                    GetDispatcher().Execute( SID_FM_DESIGN_MODE, SFX_CALLMODE_ASYNCHRON,
                                                &aItem, 0L );
                }
                break;

            case SW_BROADCAST_DRAWVIEWS_CREATED:
                {
                    bCallBase = sal_False;
                    if ( GetFormShell() )
                    {
                        GetFormShell()->SetView(
                            PTR_CAST(FmFormView, GetWrtShell().GetDrawView()) );
                        SfxBoolItem aItem( SID_FM_DESIGN_MODE, !GetDocShell()->IsReadOnly());
                        GetDispatcher().Execute( SID_FM_DESIGN_MODE, SFX_CALLMODE_ASYNCHRON,
                                                  &aItem, 0L );
                    }
                }
                break;
        }
    }
    else if(rHint.ISA(FmDesignModeChangedHint))
    {
        sal_Bool bDesignMode = ((FmDesignModeChangedHint&)rHint).GetDesignMode();
        if (!bDesignMode && GetDrawFuncPtr())
        {
            GetDrawFuncPtr()->Deactivate();
            SetDrawFuncPtr(NULL);
            LeaveDrawCreate();
            AttrChangedNotify(pWrtShell);
        }
    }

    if ( bCallBase )
        SfxViewShell::Notify(rBC, rHint);
}

/*-----------------02.12.96 12:36-------------------

--------------------------------------------------*/
#if defined WIN || defined WNT || defined UNX

void SwView::ScannerEventHdl( const EventObject& rEventObject )
{
    Reference< XScannerManager > xScanMgr = SW_MOD()->GetScannerManager();
    if( xScanMgr.is() )
    {
        const ScannerContext    aContext( xScanMgr->getAvailableScanners().getConstArray()[ 0 ] );
        const ScanError         eError = xScanMgr->getError( aContext );

        if( ScanError_ScanErrorNone == eError )
        {
            const uno::Reference< awt::XBitmap > xBitmap( xScanMgr->getBitmap( aContext ) );

            if( xBitmap.is() )
            {
                const BitmapEx aScanBmp( VCLUnoHelper::GetBitmap( xBitmap ) );

                if( !!aScanBmp )
                {
                    Graphic aGrf(aScanBmp);
                    pWrtShell->Insert( aEmptyStr, aEmptyStr, aGrf );
                }
            }
        }
    }
    SfxBindings& rBind = GetViewFrame()->GetBindings();
    rBind.Invalidate( SID_TWAIN_SELECT );
    rBind.Invalidate( SID_TWAIN_TRANSFER );
//JP 26.06.00: the appwindow doen't exist
//  Application::GetAppWindow()->EnableInput( TRUE );
}
#endif

/*-----------------04.03.97 15:07-------------------

--------------------------------------------------*/


void    SwView::StopShellTimer()
{
    if(aTimer.IsActive())
    {
        aTimer.Stop();
        if ( bAttrChgNotifiedWithRegistrations )
        {
            GetViewFrame()->GetBindings().LEAVEREGISTRATIONS();
            bAttrChgNotifiedWithRegistrations = sal_False;
        }
        SelectShell();
        bAttrChgNotified = sal_False;
    }
}

/*-----------------15.12.97 10:15-------------------

--------------------------------------------------*/
void SwView::PrepareGetSelection()
{
    if(!pShell)
        SelectShell();
}

/*-----------------09/03/97 04:12pm-----------------

--------------------------------------------------*/
sal_uInt16  SwView::PrepareClose( sal_Bool bUI, sal_Bool bForBrowsing )
{
    SfxViewFrame* pVFrame = GetViewFrame();
    SfxApplication* pSfxApp = SFX_APP();
    pVFrame->SetChildWindow( SwInputChild::GetChildWindowId(), sal_False );
    if(pSfxApp->IsDispatcherLocked())
        pSfxApp->LockDispatcher(sal_False);
    pVFrame->SetChildWindow( SwInsertChartChild::GetChildWindowId(), sal_False );

    sal_uInt16 nRet;
    if ( pFormShell &&
         sal_True != (nRet = pFormShell->PrepareClose( bUI, bForBrowsing )) )

    {
        return nRet;
    }
    return SfxViewShell::PrepareClose( bUI, bForBrowsing );
}

/*------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.448  2000/09/18 16:06:12  willem.vandorp
    OpenOffice header added.

    Revision 1.447  2000/09/08 08:12:53  os
    Change: Set/Toggle/Has/Knows/Show/GetChildWindow

    Revision 1.446  2000/09/07 15:59:32  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.445  2000/09/07 08:23:47  os
    #77494# use dispatcher from the ViewFrame

    Revision 1.444  2000/08/29 14:00:43  ama
    New: Negative margins

    Revision 1.443  2000/08/15 14:09:39  jp
    Task #77422#: PrintPreView in the same window

    Revision 1.442  2000/08/15 14:08:15  jp
    Task #77422#: PrintPreView in the same window

    Revision 1.441  2000/08/14 17:25:37  jp
    Task #77422#: PrintPreView in the same window

    Revision 1.440  2000/08/08 13:48:14  os
    #77423# separate graphic shell

    Revision 1.439  2000/07/24 10:10:28  jp
    Bug #76909#: AttrChg-Timer can only be started after leaving the SwView CTOR

    Revision 1.438  2000/06/26 10:44:09  jp
    must change: GetAppWindow->GetDefaultDevice

    Revision 1.437  2000/05/30 10:42:17  os
    unused slots removed

    Revision 1.436  2000/05/29 08:03:23  os
    new scanner interface

    Revision 1.435  2000/05/26 07:21:34  os
    old SW Basic API Slots removed

    Revision 1.434  2000/05/24 13:13:57  hr
    conflict between STLPORT and Workshop header

    Revision 1.433  2000/05/23 19:42:30  jp
    Bugfixes for Unicode

    Revision 1.432  2000/05/10 11:53:20  os
    Basic API removed

    Revision 1.431  2000/04/18 15:02:50  os
    UNICODE

    Revision 1.430  2000/03/23 07:50:25  os
    UNO III

    Revision 1.429  2000/03/03 15:17:04  os
    StarView remainders removed

    Revision 1.428  2000/02/11 14:59:19  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.427  1999/12/10 13:09:42  tl
    #70383# SvxGetLinguPropertySet => ::GetLinguPropertySet

    Revision 1.426  1999/11/30 10:04:42  jp
    Bug #69906#: CTOR - update fields before any TOX

    Revision 1.425  1999/11/24 18:35:58  tl
    check for Service availability

    Revision 1.424  1999/11/19 16:40:24  os
    modules renamed

    Revision 1.423  1999/11/17 14:28:15  jp
    HasSelection: if text-flag set, then returns only true when the textcursor has an selection

    Revision 1.422  1999/10/25 19:43:19  tl
    ongoing ONE_LINGU implementation

    Revision 1.421  1999/10/20 10:56:16  jp
    Bug #67821#: CTOR - SynChildWindow handeld by HasUIFeature

    Revision 1.420  1999/10/06 12:21:13  os
    #68902# correct detection of FrameSet

    Revision 1.419  1999/09/10 13:19:10  os
    Chg: resource types removed

    Revision 1.418  1999/09/10 09:36:31  jp
    Bug #68559#: AttrChangeNotify - if have to start the timer, then check in TimeoutHdl the readony state

    Revision 1.417  1999/08/31 08:40:20  TL
    #if[n]def ONE_LINGU inserted (for transition of lingu to StarOne)


      Rev 1.416   31 Aug 1999 10:40:20   TL
   #if[n]def ONE_LINGU inserted (for transition of lingu to StarOne)

      Rev 1.415   04 Aug 1999 10:19:38   JP
   have to change: FmFormShell becomes the SfxViewShell

      Rev 1.414   15 Jul 1999 13:04:42   MA
   #67402# no invalidation while the dispatcher IsInUpdate()

      Rev 1.413   08 Jul 1999 17:36:44   JP
   Bug #67527#: AttrChangedNotify - if interrupt flag is set, then dont check readonly selection

      Rev 1.412   07 Jul 1999 15:09:28   MA
   use bindings from own view frame

      Rev 1.411   07 Jul 1999 12:30:58   MA
   #67331# restart Timer if dispatcher is locked

      Rev 1.410   07 Jul 1999 08:52:42   OS
   #67471# NotifySelChanged in AttrChangedNotify

      Rev 1.409   22 Jun 1999 17:37:32   JP
   Bug #43028#: disableflag for edit in mailbody

      Rev 1.408   21 Jun 1999 15:24:58   JP
   Interface changes: Twain

      Rev 1.407   10 Jun 1999 12:06:26   JP
   have to change: no AppWin from SfxApp

      Rev 1.406   05 May 1999 11:23:24   OS
   #63790# Tabellen-Update nur bei Bedarf rufen

      Rev 1.405   21 Apr 1999 09:32:26   MA
   #63638# API-Change prepareclose

      Rev 1.404   22 Mar 1999 09:10:14   OS
   #63704# PrepareClose: Auf FormShell achten

      Rev 1.403   16 Mar 1999 08:58:26   MA
   #59840# ReadUserData, NewLayout nicht fuer forward/backward auswerten

      Rev 1.402   08 Mar 1999 13:38:36   MA
   #62792# OLE-Printer-Benachrichtigung vervollstaendigt

      Rev 1.401   05 Feb 1999 17:33:00   JP
    Bug #61491#: AttrChgNotify: pruefen, ob ueberhaupt eine DrawView existiert

      Rev 1.400   05 Feb 1999 13:33:34   JP
   Bug #61495#: CTOR: an den UserPref das ReadonlyFlag setzen
   Bug #61491#: AttrChgNotify: kein Readonly bei Rahmen-/Object-Selektion

      Rev 1.399   02 Feb 1999 13:18:56   JP
   Bug #61335#: Schnistelle zu SwView geaendert/aufgeraeumt

      Rev 1.398   27 Jan 1999 09:58:26   OS
   #56371# TF_ONE51

      Rev 1.397   26 Jan 1999 15:33:42   OS
   #58677# Cursor in Readonly-Bereichen

      Rev 1.396   22 Jan 1999 16:55:40   JP
   Bug Task #58677#: Crsr in Readonly Bereichen zulassen

      Rev 1.395   19 Jan 1999 22:56:56   JP
   Task #58677#: Crsr in Readonly Bereichen zulassen

      Rev 1.394   17 Dec 1998 19:18:28   JP
   Task #59490# ExtTextInput fuer japan./chine. Version

      Rev 1.393   02 Dec 1998 14:13:06   MA
   #59988# ReadUserData, OnlineLayout auch ohne Layout

      Rev 1.392   09 Nov 1998 14:06:54   JP
   #58860# warum alles immer nur halb

      Rev 1.391   03 Nov 1998 19:53:00   MA
   #58860# nicht immer enterregistrations rufen

      Rev 1.390   02 Nov 1998 15:49:32   JP
   Task #57724#: ggfs. PrepareClose an der FormShell rufen.

      Rev 1.389   21 Oct 1998 10:56:14   OM
   #57586# Redlining nach Autoformat

      Rev 1.388   20 Oct 1998 11:40:24   OM
   #57586# Redlining nach Autoformat

      Rev 1.387   01 Oct 1998 17:48:56   MA
   #57380# Kein Layout, keine Userdaten

      Rev 1.386   01 Oct 1998 15:59:50   OM
   #52654# SelectionChangeListener

      Rev 1.385   08 Sep 1998 17:05:10   OS
   #56134# Metric fuer Text und HTML getrennt

      Rev 1.384   04 Sep 1998 17:06:38   MA
   #55396# Auch bei browse ignorieren weil bei jedem Laden gesetzt

      Rev 1.383   03 Sep 1998 11:44:44   MA
   #55396# scheinbar unsinnige VisArea im ReadUserData ignorieren

      Rev 1.382   31 Aug 1998 17:48:34   OM
   #55613# Selektion drucken

      Rev 1.381   31 Aug 1998 11:19:40   OS
   #55750# OnlineSpelling immer aus der OFA uebernehmen

      Rev 1.380   20 Aug 1998 17:25:16   MH
   chg: twain.hxx

      Rev 1.379   27 Jul 1998 16:55:42   JP
   Bug #45529#: LoadStyles muss ggfs. das Zuruecksetzen des ModifiedFlags verhindern

      Rev 1.378   20 Jul 1998 10:45:14   MA
   #53013# Nach Anweisung abgeklemmt

      Rev 1.377   17 Jul 1998 16:19:30   OM
   #51862# Im AktivenMode keine ::com::sun::star::form::Forms einfuegen

      Rev 1.376   14 Jul 1998 10:43:36   OM
   #52748# Twain-Menueeintrag

      Rev 1.375   06 Jul 1998 13:32:10   MH
   chg: setComponent

      Rev 1.374   30 Jun 1998 13:00:08   MA
   das war wohl grad etwas zu gruendlich

      Rev 1.372   09 Jun 1998 15:32:22   OM
   VC-Controls entfernt

      Rev 1.371   02 Jun 1998 15:49:32   OS
   setController() am FrameInterface rufen

      Rev 1.370   02 Apr 1998 17:30:58   OM
   FrameProtect: Abfrage umgestellt

      Rev 1.369   02 Apr 1998 10:07:00   MA
   new: ToolbarCfg

      Rev 1.368   20 Mar 1998 13:23:56   MA
   OleVis2Page durch BrowseMode ersetzt

      Rev 1.367   18 Mar 1998 12:28:50   MA
   #Wichtig fuer ::com::sun::star::form::Forms# FormShell nach dem Push initialisieren

      Rev 1.366   16 Mar 1998 12:03:18   MA
   Verbindung FormShell->DrawView immer herstellen

      Rev 1.365   15 Mar 1998 15:14:06   OM
   Synchron-Button

      Rev 1.364   13 Mar 1998 15:20:54   OS
   Lineale nach dem Umschalten in den Readonly-Mode #48190#

      Rev 1.363   12 Mar 1998 12:59:04   OS
   SID_NEWWINDOW nicht mehr ueberladen

      Rev 1.362   11 Mar 1998 17:01:52   OM
   DB-FormShell

      Rev 1.361   10 Mar 1998 14:17:46   OM
   Konstruktionsmodul fuer ::com::sun::star::form::Forms

      Rev 1.360   26 Feb 1998 09:53:56   OS
   HasSelection : const

      Rev 1.359   19 Feb 1998 17:21:48   OS
   HasSelection

      Rev 1.358   11 Feb 1998 10:33:46   MA
   #47035# und CopyCtor entfernt

      Rev 1.357   22 Jan 1998 17:48:54   OS
   SID_BACKGROUND_PATTERN entsorgt

      Rev 1.356   07 Jan 1998 13:36:24   OS
   Lineale nach MODECHANGED-Hint aktivieren/deaktivieren #46023#, EditWin im Dtor zuerst hiden#46436#

      Rev 1.355   06 Jan 1998 17:56:38   OS
   _Impl immer anlegen #46360#

      Rev 1.354   06 Jan 1998 07:28:38   OS
   getrennter Status fuer Insert-Controller #46322#

      Rev 1.353   16 Dec 1997 12:00:24   OS
   Impl-Pointer fuer UNO

      Rev 1.352   29 Nov 1997 16:49:54   MA
   includes

      Rev 1.351   28 Nov 1997 11:27:12   TJ
   include

      Rev 1.350   21 Nov 1997 15:00:12   MA
   includes

      Rev 1.349   05 Nov 1997 11:52:10   MA
   chain

      Rev 1.348   31 Oct 1997 11:36:10   OS
   GetSelectionTextParam auch mit erweiterten Delimitern #45212#

      Rev 1.347   22 Sep 1997 13:11:10   MA
   #44052# bInOuterResizePixel ist jetzt Member

      Rev 1.346   18 Sep 1997 14:01:12   OS
   Pointer::GetPosPixel fuer VCL ersetzt

      Rev 1.345   16 Sep 1997 10:25:04   OS
   neu: GetSelectionTextParam #43766#

      Rev 1.344   09 Sep 1997 13:34:04   OS
   include

      Rev 1.343   09 Sep 1997 11:35:32   OS
   header

      Rev 1.342   04 Sep 1997 17:14:38   MA
   includes

      Rev 1.341   03 Sep 1997 16:28:20   OS
   im PrepareClose die Rechenleiste und den ChartDialog schliessen

      Rev 1.340   02 Sep 1997 15:04:02   JP
   AttChgdNotify: SID_SaveDoc bei ReadOnlyUI freigeschaltet

      Rev 1.339   02 Sep 1997 11:18:28   JP
   temp. Erweiterung fuers Speichern bei ReadOnlyUI

------------------------------------------------------------------------*/



diff --git a/sw/source/ui/uiview/view.hrc b/sw/source/ui/uiview/view.hrc
new file mode 100644
index 0000000..d15d387
--- /dev/null
+++ b/sw/source/ui/uiview/view.hrc
@@ -0,0 +1,125 @@
/*************************************************************************
 *
 *  $RCSfile: view.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:49 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _VIEW_HRC
#define _VIEW_HRC

#include "rcid.hrc"

// BTN -------------------------------------------------------------------

#define BTN_PAGEDOWN        (RC_VIEW_BEGIN)
#define BTN_PAGEUP          (RC_VIEW_BEGIN + 1)

// STR -------------------------------------------------------------------

#define STR_NOGLOS1                 (RC_VIEW_BEGIN + 1)
#define STR_NOGLOS2                 (RC_VIEW_BEGIN + 2)
#define STR_NUM_LEVEL               (RC_VIEW_BEGIN + 3)

#define STR_ERROR_NOLANG            (RC_VIEW_BEGIN + 6)
#define STR_VERB_FOR_GRF            (RC_VIEW_BEGIN + 7)

#define STR_EDIT_FOOTNOTE           (RC_VIEW_BEGIN + 14)

//#define RID_PVIEW_TOOLBOX         (RC_VIEW_BEGIN + 15)
#define MSG_NOT_FOUND               (RC_VIEW_BEGIN + 16)
#define MSG_SEARCH_START            (RC_VIEW_BEGIN + 17)
#define MSG_SEARCH_END              (RC_VIEW_BEGIN + 18)
#define MSG_INDEX_OVERFLOW          (RC_VIEW_BEGIN + 19)
#define STR_NB_REPLACED             (RC_VIEW_BEGIN + 20)
#define MSG_SCAN_NOSOURCE           (RC_VIEW_BEGIN + 21)

#define STR_SRCVIEW_ROW             (RC_VIEW_BEGIN + 22)
#define STR_SRCVIEW_COL             (RC_VIEW_BEGIN + 23)
#define STR_SAVEAS_SRC              (RC_VIEW_BEGIN + 24)

#define MSG_NO_MERGE_ENTRY          (RC_VIEW_BEGIN + 25)

#define STR_PRINT_TITLE             (RC_VIEW_BEGIN + 26)
#define STR_PRINT_MSG               (RC_VIEW_BEGIN + 27)
#define STR_PRINT_ALL               (RC_VIEW_BEGIN + 28)
#define STR_PRINT_SELECTION         (RC_VIEW_BEGIN + 29)
#define STR_READONLY_SEL            (RC_VIEW_BEGIN + 30)

#define RID_PVIEW_TOOLBOX           (RC_VIEW_BEGIN + 31)
// MSG -------------------------------------------------------------------

#define MSG_ERR_INSERT_GLOS (RC_VIEW_BEGIN)

#define MSG_ERR_NO_FAX      (RC_VIEW_BEGIN + 5)
#define MSG_ERR_SRCSTREAM   (RC_VIEW_BEGIN + 6)

// DLG -------------------------------------------------------------------

#define DLG_SPECIAL_FORCED              (RC_VIEW_BEGIN)
#define DLG_PAGEPREVIEW_ZOOM            (RC_VIEW_BEGIN + 1)
#define DLG_PAGEPREVIEW_PRINTOPTIONS    (RC_VIEW_BEGIN + 2)

// Ueberlaufpruefung -----------------------------------------------------

#define VIEW_ACT_END        STR_EDIT_FOOTNOTE

#if VIEW_ACT_END > RC_VIEW_END
#error Resource-Id Ueberlauf in #file, #line
#endif

#endif

diff --git a/sw/source/ui/uiview/view.src b/sw/source/ui/uiview/view.src
new file mode 100644
index 0000000..f06e50f1
--- /dev/null
+++ b/sw/source/ui/uiview/view.src
@@ -0,0 +1,1166 @@
/*************************************************************************
 *
 *  $RCSfile: view.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:49 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include <svx/svxids.hrc>
#include <svx/globlmn.hrc>
#include "view.hrc"
#include "shells.hrc"
#include "globals.hrc"
#include "popup.hrc"
#include "helpid.h"
#include "cmdid.h"
ImageButton BTN_PAGEUP
{
    SVLOOK = TRUE ;
    HIDE = TRUE ;
    RectStyle = TRUE ;
    SmallStyle = TRUE ;
    SYMBOL = IMAGEBUTTON_PAGEUP ;
};
ImageButton BTN_PAGEDOWN
{
    SVLOOK = TRUE ;
    HIDE = TRUE ;
    RectStyle = TRUE ;
    SmallStyle = TRUE ;
    SYMBOL = IMAGEBUTTON_PAGEDOWN ;
};
QueryBox DLG_WRAP
{
    BUTTONS = WB_YES_NO ;
    DEFBUTTON = WB_DEF_YES ;
    MESSAGE = "Überprüfung am Anfang des Dokumentes fortsetzen?" ;
    MESSAGE [ English ] = "Do you want to continue checking at the start of the document?" ;
    MESSAGE [ norwegian ] = "Do you want to continue checking at the start of the document?" ;
    MESSAGE [ italian ] = "Continuare a controllare dall'inizio del documento?" ;
    MESSAGE [ portuguese_brazilian ] = "Deseja continuar a verificação no início do documento?" ;
    MESSAGE [ portuguese ] = "Deseja continuar com a verificação no início do documento?" ;
    MESSAGE [ finnish ] = "Jatketaanko tarkistamista asiakirjan alusta?" ;
    MESSAGE [ danish ] = "Vil du fortsætte kontrollen fra dokumentets start?" ;
    MESSAGE [ french ] = "Voulez-vous continuer la vérification depuis le début du document?" ;
    MESSAGE [ swedish ] = "Vill Du fortsätta kontrollen i början på dokumentetet?" ;
    MESSAGE [ dutch ] = "Wilt u dat de spellingcontrole wordt voortgezet bij het begin van het document?" ;
    MESSAGE [ spanish ] = "¿Desea continuar la revisión desde el comienzo del documento?" ;
    MESSAGE [ english_us ] = "Do you want to continue checking at the beginning of the document?" ;
    MESSAGE[ chinese_simplified ] = "´ÓÎļþ¿ª¶Ë¼ÌÐø¼ì²é£¿";
    MESSAGE[ russian ] = "Ïðîäîëæèòü ïðîâåðêó äîêóìåíòà ñ íà÷àëà?";
    MESSAGE[ polish ] = "Kontynuowaæ sprawdzanie na pocz¹tku dokumentu?";
    MESSAGE[ japanese ] = "•¶‘‚ÌŽn‚ß‚ÌÁª¯¸‚𑱂¯‚Ü‚·‚©H";
    MESSAGE[ chinese_traditional ] = "±qÀÉ®×¶}ºÝÄ~Äò·j´M¡S";
    MESSAGE[ arabic ] = "ýýåá ÊÑíÏ ãÊÇÈÚÉ ÇáÊÏÞíÞ ÚäÏ ÈÏÇíÉ ÇáãÓÊäÏ¿";
    MESSAGE[ greek ] = "ÈÝëåôå íá óõíå÷éóôåß ï Ýëåã÷ïò áðü ôçí áñ÷Þ ôïõ åããñÜöïõ;";
    MESSAGE[ korean ] = "¹®¼­ÀÇ ½ÃÀۺκп¡¼­ °Ë»ç¸¦ °è¼ÓÇϽðڽÀ´Ï±î?";
    MESSAGE[ turkish ] = "Belgenin baþýndan denetime devam etmek istiyor musunuz?";
    MESSAGE[ language_user1 ] = " ";
};
QueryBox DLG_BODY
{
    BUTTONS = WB_YES_NO ;
    DEFBUTTON = WB_DEF_NO ;
    MESSAGE = "Wollen Sie den Haupttext prüfen?" ;
    MESSAGE [ English ] = "Do you want to check the Bodytext?" ;
    MESSAGE [ norwegian ] = "Do you want to check the Bodytext?" ;
    MESSAGE [ italian ] = "Controllare il testo principale?" ;
    MESSAGE [ portuguese_brazilian ] = "Deseja verificar o corpo do documento?" ;
    MESSAGE [ portuguese ] = "Deseja verificar o texto principal?" ;
    MESSAGE [ finnish ] = "Haluatko tarkistaa runkotekstin?" ;
    MESSAGE [ danish ] = "Vil du kontrollere brødteksten?" ;
    MESSAGE [ french ] = "Voulez-vous vérifier le texte principal?" ;
    MESSAGE [ swedish ] = "Vill Du kontrollera huvudtexten?" ;
    MESSAGE [ dutch ] = "Wilt u de hoofdtekst controleren?" ;
    MESSAGE [ spanish ] = "¿Desea verificar el texto principal?" ;
    MESSAGE [ english_us ] = "Do you want to check the main text?" ;
    MESSAGE[ chinese_simplified ] = "ÄúÒª¼ì²éÕýÎÄÂð£¿";
    MESSAGE[ russian ] = "Âû õîòèòå ïðîâåðèòü ãëàâíûé òåêñò?";
    MESSAGE[ polish ] = "Czy chcesz sprawdzaæ tekst g³ówny?";
    MESSAGE[ japanese ] = "Ò²Ý Ã·½Ä‚ðÁª¯¸‚µ‚Ü‚·‚©?";
    MESSAGE[ chinese_traditional ] = "±z­nÀˬd¤º¤å¡S";
    MESSAGE[ arabic ] = "åá ÊÑíÏ ÇáÊÏÞíÞ Ýí ÇáäÕ ÇáÑÆíÓí¿";
    MESSAGE[ greek ] = "ÈÝëåôå íá ãßíåé Ýëåã÷ïò ôïõ êýñéïõ êåéìÝíïõ;";
    MESSAGE[ korean ] = "ÁÖ ÅØ½ºÆ®¸¦ °Ë»çÇϽðڽÀ´Ï±î?";
    MESSAGE[ turkish ] = "Ana metni denetlemek istiyor musunuz?";
    MESSAGE[ language_user1 ] = " ";
};
QueryBox DLG_PRT_FIELDNAME
{
    BUTTONS = WB_YES_NO_CANCEL ;
    DEFBUTTON = WB_DEF_CANCEL ;
    MESSAGE = "Option Feldname anzeigen ist aktiviert.\nWollen Sie das Dokument mit Feldnamen drucken?" ;
    MESSAGE [ English ] = "Option Show fieldname is checked.\nDo you want to print the document with fieldnames?" ;
    MESSAGE [ norwegian ] = "Option Show fieldname is checked.\nDo you want to print the document with fieldnames?" ;
    MESSAGE [ italian ] = "L'opzione Mostra nome campo è attivata.\nDesiderate stampare il documento con i nomi dei campi?" ;
    MESSAGE [ portuguese_brazilian ] = "Option Show fieldname is checked.\nDo you want to print the document with fieldnames?" ;
    MESSAGE [ portuguese ] = "A opção 'Mostrar nome do campo' está activada.\nImprimir o documento com os nomes do campo?" ;
    MESSAGE [ french ] = "L'option Afficher le nom de champ est activée.\nVoulez-vous imprimer le document avec le nom de champ ?" ;
    MESSAGE [ dutch ] = "Optie Veldnaam weergeven is actief.\nWilt u het document met de veldnaam afdrukken?" ;
    MESSAGE [ spanish ] = "La opción nombre de campo está activada. \n¿Desea imprimir el archivo con nombres de campo?" ;
    MESSAGE [ danish ] = "Vis feltnavn er aktiveret\nVil du udskrive dokumentet med feltnavn?" ;
    MESSAGE [ swedish ] = "Alternativet Visa fältnamn är aktiverat.\nVill Du skriva ut dokumentet med fältnamnet?" ;
    MESSAGE [ finnish ] = "Option Show fieldname is checked.\nDo you want to print the document with fieldnames?" ;
    MESSAGE [ english_us ] = "Show field commands option is checked.\nDo you want to print the document with field names?" ;
    MESSAGE[ chinese_simplified ] = "×Ö¶ÎÃû³ÆÑ¡Ï´¦ÓÚ¼¤»î״̬¡£\nÄúÒªÁ¬Í¬×Ö¶ÎÃû³ÆÒ»Æð´òÓ¡Õâ¸öÎļþÂð£¿";
    MESSAGE[ russian ] = "Ïàðàìåòð 'Ïîêàçàòü èìÿ ïîëÿ' îòìå÷åí.\nÂû õîòèòå íàïå÷àòàòü äîêóìåíò ñ èìåíàìè ïîëÿ?";
    MESSAGE[ polish ] = "Opcja Poka¿ nazwê pola jest uaktywiona.\nCzy chcesz wydrukowaæ ten dokument z nazw¹ pola?";
    MESSAGE[ japanese ] = "̨°ÙÄޖ¼‚̵Ìß¼®Ý‚ª•\\ަ‚³‚ê‚Ä‚¢‚Ü‚·B\n̨°ÙÄޖ¼•t‚«‚Ì•¶‘‚ðˆóü‚µ‚Ü‚·‚©H";
    MESSAGE[ chinese_traditional ] = "Äæ¦ì¦WºÙ¿ï¶µÁÙ³B©ó¿E¬¡ª¬ºA¡C\n±z­n³s¦PÄæ¦ì¦WºÙ¤@°_¦C¦L³o­ÓÀɮסS";
    MESSAGE[ arabic ] = "ÇáÎíÇÑ \"ÅÙåÇÑ ÇÓã ÇáÍÞá\" äÔØ.\nåá ÊÑíÏ ØÈÇÚÉ ÇáãÓÊäÏ ÈÃÓãÇÁ ÇáÍÞæá¿";
    MESSAGE[ greek ] = "Ç åðéëïãÞ üíïìá ðåäßïõ åßíáé åíåñãïðïéçìÝíç.\nÈÝëåôå íá åêôõðùèåß ôï Ýããñáöï ìáæß ìå ôá ïíüìáôá ôùí ðåäßùí;";
    MESSAGE[ korean ] = "ÇÊµå º¸±â ¸í·É ¿É¼ÇÀÌ Ã¼Å©µÇ¾î ÀÖ½À´Ï´Ù.\nÇʵå À̸§°ú ÇÔ²² ¹®¼­¸¦ ÀμâÇϽðڽÀ´Ï±î?";
    MESSAGE[ turkish ] = "\"Alan adýný görüntüle\" seçeneði etkin.\nBelgeyi alan adlarýyla yazdýrmak istiyor musunuz?";
    MESSAGE[ language_user1 ] = " ";
};
QueryBox DLG_SPECIAL
{
    BUTTONS = WB_YES_NO ;
    DEFBUTTON = WB_DEF_NO ;
    MESSAGE = "Sonderbereiche prüfen?" ;
    MESSAGE [ English ] = "Do you want check the special regions?" ;
    MESSAGE [ norwegian ] = "Do you want check the special regions?" ;
    MESSAGE [ italian ] = "Controllare le aree speciali?" ;
    MESSAGE [ portuguese_brazilian ] = "Deseja verificar Regiões especiais?" ;
    MESSAGE [ portuguese ] = "Deseja verificar as regiões especiais?" ;
    MESSAGE [ finnish ] = "Haluatko tarkistaa erikoisalueet?" ;
    MESSAGE [ danish ] = "Vil du kontrollere særområderne?" ;
    MESSAGE [ french ] = "Voulez-vous vérifier les zones spéciales?" ;
    MESSAGE [ swedish ] = "Vill Du kontrollera specialområdena?" ;
    MESSAGE [ dutch ] = "Wilt u de speciale bereiken controleren?" ;
    MESSAGE [ spanish ] = "¿Desea verificar las áreas especiales?" ;
    MESSAGE [ english_us ] = "Do you want check the special regions?" ;
    MESSAGE[ chinese_simplified ] = "ÄúÒª¼ì²éÌØÊâÇøÓòÂð£¿";
    MESSAGE[ russian ] = "Ïðîâåðèòü ñïåöèàëüíûå îáëàñòè?";
    MESSAGE[ polish ] = "Sprawdzaæ obszary specjalne?";
    MESSAGE[ japanese ] = "“Á•Ê’nˆæ‚ðÁª¯¸‚µ‚Ü‚·‚©?";
    MESSAGE[ chinese_traditional ] = "±z­nÀˬd¯S®í°Ï°ì¡S";
    MESSAGE[ arabic ] = "åá ÊÑíÏ ÇáÊÏÞíÞ Ýí ÇáãäÇØÞ ÇáÎÇÕÉ¿";
    MESSAGE[ greek ] = "Íá ãßíåé Ýëåã÷ïò ôùí åéäéêþí ðåñéï÷þí;";
    MESSAGE[ korean ] = "ƯÁ¤ÇÑ ¿µ¿ªÀ» °Ë»çÇϽðڽÀ´Ï±î?";
    MESSAGE[ turkish ] = "Özel bölümler denetlensin mi?";
    MESSAGE[ language_user1 ] = " ";
};
QueryBox DLG_THESAURUS
{
    BUTTONS = WB_YES_NO ;
    DEFBUTTON = WB_DEF_NO ;
    MESSAGE = "Dieses Wort sollten Sie vermeiden! Thesaurus starten?" ;
    MESSAGE [ English ] = "Please avoid this word! Start thesaurus?" ;
    MESSAGE [ norwegian ] = "Please avoid this word! Start thesaurus?" ;
    MESSAGE [ italian ] = "Tale temine andrebbe evitato. Avviare il dizionario dei sinonimi?" ;
    MESSAGE [ portuguese_brazilian ] = "Por favor evite esta palavra!Iniciar thesaurus?" ;
    MESSAGE [ portuguese ] = "Evite esta palavra! Iniciar o dicionário de sinónimos?" ;
    MESSAGE [ finnish ] = "Vältä tätä sanaa! Käytetäänkö synonyymisanastoa?" ;
    MESSAGE [ danish ] = "Undgå venligst dette ord! Vil du bruge synonymordbogen?" ;
    MESSAGE [ french ] = "Il vaudrait mieux éviter d'employer ce mot ! Souhaitez-vous consulter le dictionnaire des synonymes ?" ;
    MESSAGE [ swedish ] = "Undvik detta ord! Starta synonymordlista?" ;
    MESSAGE [ dutch ] = "Dit woord niet gebruiken! Thesaurus starten?" ;
    MESSAGE [ spanish ] = "¡Debería evitar esta palabra! ¿Iniciar búsqueda de sinónimos?" ;
    MESSAGE [ english_us ] = "This word appears in the list of words you want to avoid! Start thesaurus?" ;
    MESSAGE[ chinese_simplified ] = "ÄúÓ¦¸Ã±ÜÃâʹÓÃÕâ¸ö×Ö£¡ÄúÒªÆô¶¯´ÊµäÂð£¿";
    MESSAGE[ russian ] = "Óïîòðåáëåíèå ýòîãî ñëîâà âû äîëæíû èçáåãàòü! Çàïóñòèòü òåçàóðóñ?";
    MESSAGE[ polish ] = "Unikaj tego s³owa! W³¹czyæ Tezaurus?";
    MESSAGE[ japanese ] = "‚±‚ê‚Í”ð‚¯‚é‚ׂ«Œ¾—t‚Å‚·B—Þ‹`ŒêŽ«“T‚ð‹N“®‚µ‚Ü‚·‚©H";
    MESSAGE[ chinese_traditional ] = "±zÀ³¸ÓÁ×§K¨Ï¥Î³o­Ó¦r¡T±z­n±Ò°Êµü¨å¶Ü¡S";
    MESSAGE[ arabic ] = "íÌÈ Úáíß ÊÌäÈ åÐå ÇáßáãÉ! åá ÊÑíÏ ÈÏÁ ÊÔÛíá ÞÇãæÓ ÇáãÑÇÏÝÇÊ¿";
    MESSAGE[ greek ] = "Áðïöýãåôå áõôÞ ôç ëÝîç! Íá áíïßîåé ï èçóáõñüò ëÝîåùí;";
    MESSAGE[ korean ] = "À̴ܾî´Â »ç¿ëÇÏÁö ¾ÊÀ» ´Ü¾î Ç׸ñ¿¡ ÀÖ´Â ´Ü¾î ÀÔ´Ï´Ù ! µ¿ÀÇ¾î »çÀüÀ» ½ÃÀÛÇϽðڽÀ´Ï±î?";
    MESSAGE[ turkish ] = "Bu sözcük kullanmak istemediðiniz söcükler arasýnda! Eþ anlamlýlar sözlüðüne baþvurmak ister misiniz?";
    MESSAGE[ language_user1 ] = " ";
};
QueryBox DLG_SPECIAL_FORCED
{
    BUTTONS = WB_YES_NO ;
    DEFBUTTON = WB_DEF_NO ;
    MESSAGE = "Sonderbereichprüfung ist ausgeschaltet, Trotzdem prüfen?" ;
    MESSAGE [ English ] = "Check in Special regions is turned off, Proof anyway?" ;
    MESSAGE [ norwegian ] = "Check in Special regions is turned off, Proof anyway?" ;
    MESSAGE [ italian ] = "Il controllo delle aree speciali non è attivo, controllare lo stesso?" ;
    MESSAGE [ portuguese_brazilian ] = "Verificação de Regiões especiais está desativada, Verificar assim mesmo?" ;
    MESSAGE [ portuguese ] = "A verificação de zonas especiais está desactivada, mesmo assim prosseguir?" ;
    MESSAGE [ finnish ] = "Erikoisalueiden tarkistus ei ole käytössä. Korjausluetaanko silti?" ;
    MESSAGE [ danish ] = "Stavekontrol af særområder er slået fra, skal der kontrolleres alligevel?" ;
    MESSAGE [ french ] = "La vérification dans les zones spéciales est désactivée. Vérifier tout de même ?" ;
    MESSAGE [ swedish ] = "Kontroll av specialområden är avstängd. Korrekturläs ändå?" ;
    MESSAGE [ dutch ] = "De functie 'Speciale bereiken controleren' is uitgeschakeld. Controle toch uitvoeren?" ;
    MESSAGE [ spanish ] = "La verificación de las áreas especiales está desactivada, ¿Desea de todas maneras verificar?" ;
    MESSAGE [ english_us ] = "Check special regions is deactivated. Check anyway?" ;
    MESSAGE[ chinese_simplified ] = "ÌØÊâÇøÓòµÄ¼ì²éÒѾ­±»Ê§»î£¬Äú»¹ÊÇÒªÖ´ÐÐÕâÏî¼ì²é£¿";
    MESSAGE[ russian ] = "Ïðîâåðêà ñïåöèàëüíûõ îáëàñòåé îòêëþ÷åíà, Âñå ðàâíî ïðîâåðèòü?";
    MESSAGE[ polish ] = "Sprawdzanie obszarów specjalnych jest wy³¹czone, mimo to sprawdzaæ?";
    MESSAGE[ japanese ] = "“Á•Ê’nˆæ‚ÍÁª¯¸o—ˆ‚Ü‚¹‚ñ‚Å‚µ‚½B‚»‚ê‚Å‚àÁª¯¸‚µ‚Ü‚·‚©HS";
    MESSAGE[ chinese_traditional ] = "¯S®í°Ï°ìªºÀˬd¤w¸g³Q¥¢¬¡¡M±zÁÙ¬O­n°õ¦æ³o­Ó©R¥O¡S";
    MESSAGE[ arabic ] = "ÊÏÞíÞ ÇáãäÇØÞ ÇáÎÇÕÉ ÛíÑ äÔØ. åá ÊÑíÏ ÇáÊÏÞíÞ ÈÇáÑÛã ãä Ðáß¿";
    MESSAGE[ greek ] = "Ç åðéëïãÞ \"¸ëåã÷ïò åéäéêþí ðåñéï÷þí\" åßíáé áðåíåñãïðïéçìÝíç.ÈÝëåôå íá åëåã÷èïýí êáé áõôÝò;";
    MESSAGE[ korean ] = "ƯÁ¤ÇÑ ¿µ¿ªÀÇ °Ë»ç°¡ ÁßÁöµÇ¾ú½À´Ï´Ù. °Ë»ç¸¦ ÇϽðڽÀ´Ï±î?";
    MESSAGE[ turkish ] = "Özel bölüm denetimi etkin deðil. Yine de denetlensin mi?";
    MESSAGE[ language_user1 ] = " ";
};
QueryBox MSG_SEARCH_END
{
    Buttons = WB_YES_NO ;
    DefButton = WB_DEF_YES ;
    Message = "StarOffice Writer hat bis zum Ende des Dokumentes gesucht. Möchten Sie die Suche am Dokumentanfang fortsetzen?" ;
    Message [ ENGLISH ] = "StarOffice Writer has searched to the end of the document. Do you want to continue at the beginning?" ;
    Message [ norwegian ] = "StarOffice Writer har søkt til slutten av  dokumentet. Vil du fortsette fra begynnelsen?" ;
    Message [ italian ] = "StarOffice Writer ha cercato fino alla fine del documento. Volete continuare dall'inizio del documento?" ;
    Message [ portuguese_brazilian ] = "O StarOffice Writer buscou até o final do documento. Deseja continuar do início?" ;
    Message [ portuguese ] = "O StarOffice Writer procurou até ao fim do documento. Deseja continuar a procura no início do documento?" ;
    Message [ finnish ] = "StarOffice Writer on etsinyt asiakirjan loppuun asti.Jatketaanko alusta?" ;
    Message [ danish ] = "StarOffice Writer har søgt til slutningen af dokumentet. Vil du fortsætte søgningen fra dokumentets begyndelse?" ;
    Message [ french ] = "StarOffice Writer a atteint la fin du document. Souhaitez-vous reprendre la recherche au début du document ?" ;
    Message [ swedish ] = "StarOffice Writer har sökt till slutet av dokument. Vill Du fortsätta sökningen i början av dokumentet?" ;
    Message [ dutch ] = "StarOffice Writer heeft tot aan het einde van het document gezocht. Wilt u doorgaan met zoeken vanaf het begin?" ;
    Message [ spanish ] = "StarOffice Writer ha buscado hasta el final del documento. ¿Desea continuar la búsqueda desde el principio?" ;
    Message [ english_us ] = "StarOffice Writer has searched to the end of the document. Do you want to continue at the beginning?" ;
    Message[ chinese_simplified ] = "StarOffice Writer ÒѾ­ËÑѰÖÁÎĵµµÄβ¶Ë¡£Òª¼ÌÐø´ÓÎĵµÊ×¶Ë¿ªÊ¼ËÑѰ£¿";
    Message[ russian ] = "StarOffice Writer îñóùåñòâèë ïîèñê äî êîíöà äîêóìåíòà. Âû õîòèòå ïðîäîëæèòü ïîèñê ñ íà÷àëà äîêóìåíòà?";
    Message[ polish ] = "StarOffice Writer szuka³ do koñca dokumentu. Czy chcesz kontynuowaæ wyszukiwanie na pocz¹tku dokumentu?";
    Message[ japanese ] = "StarOffice Writer ‚Í•¶‘––‚܂ŌŸõ‚µ‚Ü‚µ‚½B•¶‘‚ÌŽn‚߂ɖ߂Á‚Ä‘±s‚µ‚Ü‚·‚©H";
    Message[ chinese_traditional ] = "StarOffice Writer ¤w¸g·j´M¦Ü¤å¥óªº§ÀºÝ¡C­nÄ~Äò·j´M¦Ü¤å¥ó­ººÝ¡H";
    Message[ arabic ] = "ÞÇã StarOffice Writer ÈÇáÈÍË ÍÊì äåÇíÉ ÇáãÓÊäÏ. åá ÊÑíÏ ãÊÇÈÚÉ ÇáÈÍË ÚäÏ ÈÏÇíÉ ÇáãÓÊäÏ¿";
    Message[ greek ] = "Ôï StarOffice Writer ïëïêëÞñùóå ôçí áíáæÞôçóç ùò ôï ôÝëïò ôïõ åããñÜöïõ. ÈÝëåôå íá óõíå÷éóôåß ç áíáæÞôçóç áðü ôçí áñ÷Þ ôïõ åããñÜöïõ;";
    Message[ korean ] = "StarOffice Writer°¡ ¹®¼­ÀÇ ³¡±îÁö °Ë»öÇß½À´Ï´Ù. ¹®¼­ÀÇ Ã³À½ ºÎÅÍ °è¼ÓÇϽðڽÀ´Ï±î?";
    Message[ turkish ] = "StarOffice Writer belgenin sonuna kadar aramayý tamamladý. Belgenin baþýndan aramaya devam etmek istiyor musunuz?";
    Message[ language_user1 ] = " ";
};
QueryBox MSG_SEARCH_START
{
    Buttons = WB_YES_NO ;
    DefButton = WB_DEF_YES ;
    Message = "StarOffice Writer hat bis zum Anfang des Dokumentes gesucht. Möchten Sie die Suche am Dokumentende fortsetzen?" ;
    Message [ ENGLISH ] = "StarOffice Writer has searched to the beginning of the document. Do you want to continue at the end?" ;
    Message [ norwegian ] = "StarOffice Writer har søkt til begynnelsen av dokumentet. Vil du fortsette fra slutten?" ;
    Message [ italian ] = "StarOffice Writer ha cercato fino all'inizio del documento. Volete continuare dalla fine del documento?" ;
    Message [ portuguese_brazilian ] = "O StarOffice Writer buscou até o início do documento. Deseja continuar no final?" ;
    Message [ portuguese ] = "O StarOffice Writer procurou até ao início do documento. Deseja continuar a procura no fim do documento?" ;
    Message [ finnish ] = "StarOffice Writer on etsinyt asiakirjan alkuun asti.Jatketaanko lopusta?" ;
    Message [ danish ] = "StarOffice Writer har søgt til begyndelsen af dokumentet. Vil du fortsætte søgningen fra dokumentets slutning?" ;
    Message [ french ] = "StarOffice Writer a atteint le début du document. Souhaitez-vous reprendre la recherche à la fin du document ?" ;
    Message [ swedish ] = "StarOffice Writer har sökt till början av dokumentet. Vill Du fortsätta sökningen i slutet av dokumentet?" ;
    Message [ dutch ] = "StarOffice Writer heeft tot aan het begin van het document gezocht. Wilt u doorgaan met zoeken vanaf het einde?" ;
    Message [ spanish ] = "StarOffice Writer ha buscado hasta el principio del documento. ¿Desea continuar desde el final?" ;
    Message [ english_us ] = "StarOffice Writer has searched to the beginning of the document. Do you want to continue at the end?" ;
    Message[ chinese_simplified ] = "StarOffice Writer ÒѾ­ËÑѰÖÁÎĵµµÄÊ×¶Ë¡£Òª¼ÌÐø´ÓÎļþβ¶Ë¿ªÊ¼ËÑѰ£¿";
    Message[ russian ] = "StarOffice Writer îñóùåñòâèë ïîèñê äî íà÷àëà äîêóìåíòà. Âû õîòèòå ïðîäîëæèòü ïîèñê â êîíöå äîêóìåíòà?";
    Message[ polish ] = "StarOffice Writer szuka³ do pocz¹tku dokumentu. Czy chcesz kontynuowaæ wyszukiwanie na koñcu dokumentu?";
    Message[ japanese ] = "StarOffice Writer ‚Í•¶‘‚ÌŽn‚߂܂ŌŸõ‚µ‚Ü‚µ‚½B•¶‘––‚É–ß‚Á‚ÄŒŸõ‚𑱂¯‚Ü‚·‚©H";
    Message[ chinese_traditional ] = "StarOffice Writer ¤w¸g·j´M¦Ü¤å¥óªº­ººÝ¡C­nÄ~Äò·j´M¤å¥ó¦Ü§ÀºÝ¡S";
    Message[ arabic ] = "ÞÇã StarOffice Writer ÈÇáÈÍË ÍÊì ÈÏÇíÉ ÇáãÓÊäÏ. åá ÊÑíÏ ãÊÇÈÚÉ ÇáÈÍË ÚäÏ äåÇíÉ ÇáãÓÊäÏ¿";
    Message[ greek ] = "Ôï StarOffice Writer ïëïêëÞñùóå ôçí áíáæÞôçóç ùò ôçí áñ÷Þ ôïõ åããñÜöïõ. ÈÝëåôå íá óõíå÷éóôåß ç áíáæÞôçóç áðü ôï ôÝëïò ôïõ åããñÜöïõ;";
    Message[ korean ] = "StarOffice Writer°¡ ¹®¼­ÀǽÃÀۺκÐÀ» °Ë»öÇß½À´Ï´Ù. ¹®¼­ÀÇ ³¡±îÁö °è¼ÓÇϽðڽÀ´Ï±î?";
    Message[ turkish ] = "StarOffice Writer belgenin baþýna kadar aramayý tamamladý. Belgenin sonundan aramaya devam etmek istiyor musunuz?";
    Message[ language_user1 ] = " ";
};
InfoBox MSG_NO_MERGE_ENTRY
{
    MESSAGE = "Es konnte nichts zusammengeführt werden." ;
    MESSAGE [ English ] = "Could not merge document." ;
    Message [ english_us ] = "Could not merge documents." ;
    Message [ portuguese_brazilian ] = "Es konnte nichts zusammengeführt werden." ;
    Message [ swedish ] = "Inget kunde sammanföras." ;
    Message [ danish ] = "Fletning kunne ikke gennemføres." ;
    Message [ italian ] = "Non è stato possibile unire alcunché." ;
    Message [ spanish ] = "No se pudieron fusionar los documentos." ;
    Message [ french ] = "Impossible de fusionner les documents." ;
    Message [ dutch ] = "Er was geen merge van documenten mogelijk." ;
    Message [ portuguese ] = "Foi impossível intercalar os documentos." ;
    Message[ chinese_simplified ] = "ÎÞ·¨ºÏ²¢Îĵµ¡£";
    Message[ russian ] = "Îáúåäèíèòü ÷òî-ëèáî íå óäàåòñÿ.";
    Message[ polish ] = "Nie mo¿na by³o scaliæ dokumentów.";
    Message[ japanese ] = "‚È‚É‚àŒ‹‡‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½B";
    Message[ chinese_traditional ] = "µLªk¦X¨Ö¤å¥ó¡C";
    Message[ arabic ] = ".áã íãßä ÏãÌ ÃíÉ ãÓÊäÏÇÊ";
    Message[ greek ] = "Ç óõã÷þíåõóç äåí Þôáí äõíáôÞ.";
    Message[ korean ] = "¹®¼­ º´ÇÕÀÌ ¾È¾ú½À´Ï´Ù.";
    Message[ turkish ] = "Belgeler birleþtirilemedi.";
    Message[ language_user1 ] = " ";
};
InfoBox MSG_ERR_INSERT_GLOS
{
    MESSAGE = "AutoText konnte nicht angelegt werden." ;
    MESSAGE [ English ] = "Could not insert AutoText." ;
    MESSAGE [ norwegian ] = "Could not insert AutoText." ;
    MESSAGE [ italian ] = "Impossibile creare voce di glossario." ;
    MESSAGE [ portuguese_brazilian ] = "Não pude inserir Texto Automático." ;
    MESSAGE [ portuguese ] = "Impossível inserir o AutoTexto." ;
    MESSAGE [ finnish ] = "Automaattitekstiä ei voi lisätä." ;
    MESSAGE [ danish ] = "AutoTekst kunne ikke indsættes." ;
    MESSAGE [ french ] = "Impossible de créer l'AutoTexte." ;
    MESSAGE [ swedish ] = "AutoText kunde inte skapas." ;
    MESSAGE [ dutch ] = "AutoTekst kon niet worden toegepast." ;
    MESSAGE [ spanish ] = "No se pudo crear el AutoTexto." ;
    MESSAGE [ english_us ] = "AutoText could not be created." ;
    MESSAGE[ chinese_simplified ] = "ÎÞ·¨½¨Á¢×Ô¶¯Í¼Î£";
    MESSAGE[ russian ] = "Ñîçäàòü àâòîòåêñò íåâîçìîæíî.";
    MESSAGE[ polish ] = "Autotekst nie móg³ zostaæ utworzony.";
    MESSAGE[ japanese ] = "“ü—ÍŽx‰‡‚̍쐬‚ªo—ˆ‚Ü‚¹‚ñ‚Å‚µ‚½B";
    MESSAGE[ chinese_traditional ] = "µLªk«Ø¥ß¦Û°Ê¹Ï¤å¶°¡C";
    MESSAGE[ arabic ] = ".ÊÚÐÑ ÅÖÇÝÉ ÇáäÕ ÇáÊáÞÇÆí";
    MESSAGE[ greek ] = "Äåí Þôáí äõíáôüí íá ðñïóôåèåß ôï ÁõôïÊåßìåíï.";
    MESSAGE[ korean ] = "ÀÚµ¿ ÅØ½ºÆ®¸¦ »ðÀÔÇÒ ¼ö ¾ø½À´Ï´Ù.";
    MESSAGE[ turkish ] = "Otomatik metin yaratýlamadý.";
    MESSAGE[ language_user1 ] = " ";
};
InfoBox MSG_ERR_SRCSTREAM
{
    MESSAGE = "Der Quelltext kann nicht geladen werden." ;
    MESSAGE [ English ] = "The source cannot be loaded." ;
    Message [ english_us ] = "The source cannot be loaded." ;
    Message [ portuguese_brazilian ] = "Der Quelltext kann nicht geladen werden." ;
    Message [ swedish ] = "Källtexten kan inte laddas." ;
    Message [ danish ] = "Kildeteksten kan ikke indlæses." ;
    Message [ italian ] = "Non è possibile caricare il testo sorgente." ;
    Message [ spanish ] = "No es posible cargar el texto fuente." ;
    Message [ french ] = "Le texte source ne peut pas être chargé." ;
    Message [ dutch ] = "De brontekst kan niet worden geladen." ;
    Message [ portuguese ] = "É impossível carregar o texto-fonte." ;
    Message[ chinese_simplified ] = "ÎÞ·¨×°ÔØÔ´Îı¾¡£";
    Message[ russian ] = "Çàãðóçêà èñõîäíîãî òåêñòà íåâîçìîæíà.";
    Message[ polish ] = "Nie mo¿na by³o za³adowaæ tekstu Ÿród³owego.";
    Message[ japanese ] = "¿°½‚ðÛ°Äޏo—ˆ‚Ü‚¹‚ñB";
    Message[ chinese_traditional ] = "µLªk¸Ë¸ü­ì©lÀÉ¡C";
    Message[ arabic ] = ".áÇ íãßä ÊÍãíá äÕ ÇáãÕÏÑ";
    Message[ greek ] = "Äåí åßíáé äõíáôüí íá öïñôùèåß ôï êÝéìåíï ðñïÝëåõóçò.";
    Message[ korean ] = "¼Ò½º°¡ ·ÎµåµÉ ¼ö ¾ø½À´Ï´Ù.";
    Message[ turkish ] = "Kaynak kod yüklenemiyor.";
    Message[ language_user1 ] = " ";
};
InfoBox MSG_ERR_NO_FAX
{
    MESSAGE = "Kein Fax-Drucker unter Extras/Optionen/Drucken eingestellt." ;
    MESSAGE [ English ] = "No fax printer at Settings/Options/Printer configured." ;
    Message [ dutch ] = "Geen faxprinter geconfigureerd onder: Extra/Opties/Afdrukken." ;
    Message [ english_us ] = "No fax printer has been set under Tools/Options/Printing." ;
    Message [ italian ] = "Nessuna stampante-fax installata in Strumenti/Opzioni/Stampa." ;
    Message [ spanish ] = "En Herramientas/Opciones/Imprimir no se ha configurado ninguna impresora fax." ;
    Message [ french ] = "Aucune imprimante (fax) n'a été paramétrée sous Outils/Options/Imprimer" ;
    Message [ swedish ] = "Ingen faxskrivare inställd under Verktyg/Alternativ/Skriva ut." ;
    Message [ danish ] = "Der er ingen faxprinter indstillet under Funktioner/Indstillinger/Udskriv." ;
    Message [ portuguese_brazilian ] = "Kein Fax-Drucker unter Extras/Optionen/Drucken eingestellt." ;
    Message [ portuguese ] = "Não foi configurada nenhuma impressora para fax em Ferramentas/Opções/Imprimir." ;
    Message[ chinese_simplified ] = "ÔÚ¹¤¾ß/Ñ¡Ïî/´òÓ¡»ú´¦Ã»ÓÐÉ趨´«Õæ´òÓ¡»ú¡£";
    Message[ russian ] = " Ñåðâèñ/Ïàðàìåòðû/Ïå÷àòü ôàêñ-ïðèíòåð íå óñòàíîâëåí.";
    Message[ polish ] = "Brak ustawienia dla faksu i drukarki pod has³em Narzêdzia/Opcje/Drukuj.";
    Message[ japanese ] = "̧¯¸½—pÌߨÝÀ‚ͰÙ/µÌß¼®Ý/ˆóü‚ɐݒ肳‚ê‚Ä‚¢‚Ü‚¹‚ñB";
    Message[ chinese_traditional ] = "¦b¤u¨ã/¿ï¶µ/¾÷¦Lªí¾÷³B¨S¦³³]©w¦C¦L¶Ç¯uªºÅX°Ê³n¥ó¡C";
    Message[ arabic ] = "áíÓÊ åäÇß ÅÚÏÇÏÇÊ ØÇÈÚÉ ÝÇßÓ ÊÍÊ \"ÃÏæÇÊ/ÎíÇÑÇÊ/ØÈÇÚÉ\".";
    Message[ greek ] = "Äåí Ý÷åé ïñéóôåß åêôõðùôÞò ãéá fax óôï êáôÜëïãï Åñãáëåßá/ÅðéëïãÝò/Åêôýðùóç.";
    Message[ korean ] = "µµ±¸/¿É¼Ç/Àμ⠿¡ ÆÑ½º ÇÁ¸°ÅͰ¡ ±¸¼ºµÇÁö ¾Ê¾Ò½À´Ï´Ù.";
    Message[ turkish ] = "Araçlar/Seçenekler/Yazdýrma altýnda faks konfigürasyonu yapýlmadý.";
    Message[ language_user1 ] = " ";
};
InfoBox MSG_NOT_FOUND
{
    Message = "Suchbegriff nicht gefunden." ;
    Message [ ENGLISH ] = "Search pattern not found." ;
    Message [ norwegian ] = "Søkekriterier ikke funnet." ;
    Message [ italian ] = "Termine non trovato" ;
    Message [ portuguese_brazilian ] = "Padrao de busca não encontrado." ;
    Message [ portuguese ] = "Impossível encontrar expressão procurada." ;
    Message [ finnish ] = "Hakumallia ei löydy." ;
    Message [ danish ] = "Søgningen gav intet resultat." ;
    Message [ french ] = "Élément recherché introuvable." ;
    Message [ swedish ] = "Sökord hittades inte." ;
    Message [ dutch ] = "Zoekbegrip niet gevonden." ;
    Message [ spanish ] = "No se encontró la expresión buscada." ;
    Message [ english_us ] = "Search key not found." ;
    Message[ chinese_simplified ] = "ûÓÐÕÒµ½ËùÒªËÑѰµÄ¶ÔÏó¡£";
    Message[ russian ] = "Ñëîâî íå íàéäåíî.";
    Message[ polish ] = "Szukane has³o nie zosta³o znalezione.";
    Message[ japanese ] = "ŒŸõ€–Ú‚ªŒ©‚‚©‚è‚Ü‚¹‚ñ";
    Message[ chinese_traditional ] = "¨S¦³§ä¨ì©Ò­n·j´Mªºª«¥ó¡C";
    Message[ arabic ] = "ÊÚÐÑ ÇáÚ辄 Úáì ÇáÈíÇäÇÊ ÇáÊí ÊÈÍË ÚäåÇ.";
    Message[ greek ] = "Äåí âñÝèçêáí ôá äåäïìÝíá ðïõ áíáæçôÜôå.";
    Message[ korean ] = "°Ë»ö۰¡ ¹ß°ßµÇÁö ¾Ê½À´Ï´Ù.";
    Message[ turkish ] = "Arama terimi bulunamadý.";
    Message[ language_user1 ] = " ";
};
InfoBox MSG_INDEX_OVERFLOW
{
    Message = " gefunden." ;
    Message [ ENGLISH ] = "Search pattern not found." ;
    Message [ norwegian ] = "Søkekriterier ikke funnet." ;
    Message [ italian ] = "Termine non trovato" ;
    Message [ portuguese_brazilian ] = "Padrao de busca não encontrado." ;
    Message [ portuguese ] = "localizado." ;
    Message [ finnish ] = "Hakumallia ei löydy." ;
    Message [ danish ] = "fundet." ;
    Message [ french ] = "trouvé(e/s)." ;
    Message [ swedish ] = "funnet." ;
    Message [ dutch ] = "gevonden." ;
    Message [ spanish ] = "encontrado." ;
    Message [ english_us ] = "found." ;
    Message[ chinese_simplified ] = "ÕÒµ½¡£";
    Message[ russian ] = "íàéäåí.";
    Message[ polish ] = "znaleziono.";
    Message[ japanese ] = "Œ©‚‚©‚è‚Ü‚µ‚½B";
    Message[ chinese_traditional ] = "§ä¨ì¡C";
    Message[ arabic ] = ".æÌöÏ ";
    Message[ greek ] = "âñÝèçêå.";
    Message[ korean ] = "¹ß°ß.";
    Message[ turkish ] = "bulundu.";
    Message[ language_user1 ] = " ";
};
InfoBox MSG_SCAN_NOSOURCE
{
    Message = "Quelle nicht gesetzt." ;
    Message [ ENGLISH ] = "Source not set." ;
    Message [ english_us ] = "Source not specified." ;
    Message [ swedish ] = "Källa ej specificerad." ;
    Message [ danish ] = "Kilden er ikke specifiseret." ;
    Message [ italian ] = "Sorgente non specificata." ;
    Message [ spanish ] = "No se especificó la fuente." ;
    Message [ french ] = "Source non configurée." ;
    Message [ dutch ] = "Bron niet aangegeven." ;
    Message [ portuguese_brazilian ] = "Quelle nicht gesetzt." ;
    Message [ portuguese ] = "Fonte não especificada." ;
    Message[ chinese_simplified ] = "ûÓÐÖ¸¶¨Ô´¡£";
    Message[ russian ] = "Èñòî÷íèê íå óêàçàí";
    Message[ polish ] = "Nie okreœlono Ÿród³a.";
    Message[ japanese ] = "¿°½‚ª’è‹`‚³‚ê‚Ä‚¢‚Ü‚¹‚ñB";
    Message[ chinese_traditional ] = "¨S¦³©w¸q¨Ó·½¡C";
    Message[ arabic ] = ".áã íÊã ÊÍÏíÏ ÇáãÕÏÑ";
    Message[ greek ] = "Äåí ïñßóôçêå ç ðñïÝëåõóç.";
    Message[ korean ] = "¼Ò¼ö°¡ ÁöÁ¤µÇÁö ¾Ê¾Ò½À´Ï´Ù.";
    Message[ turkish ] = "Kaynak belirlenmedi.";
    Message[ language_user1 ] = " ";
};
String STR_NOGLOS1
{
    /* ### ACHTUNG: Neuer Text in Resource? AutoText zum Kürzel ' : AutoText zum Kürzel '' */
    /* ### ACHTUNG: Neuer Text in Resource? AutoText zum Kürzel ' : AutoText zum Kürzel '' */
    TEXT = "AutoText zum Kürzel '" ;
    TEXT [ English ] = "AutoText for Short Name '" ;
    TEXT [ norwegian ] = "AutoText for Short Name '" ;
    TEXT [ italian ] = "Testo automatico per la sigla '" ;
    TEXT [ portuguese_brazilian ] = "Texto Automático para Abreviação" ;
    TEXT [ portuguese ] = "AutoTexto para abreviatura '" ;
    TEXT [ finnish ] = "Automaattitekstiä lyhenteelle '" ;
    TEXT [ danish ] = "AutoTekst til genvej '" ;
    TEXT [ french ] = "AutoTexte pour raccourci ' " ;
    TEXT [ swedish ] = "Genväg AutoText '" ;
    TEXT [ dutch ] = "AutoTekst voor afkortingen '" ;
    TEXT [ spanish ] = "AutoTexto para la abreviatura '" ;
    TEXT [ english_us ] = "AutoText for Shortcut '" ;
    TEXT[ chinese_simplified ] = "×Ô¶¯Í¼Îļ¯Ëõд '";
    TEXT[ russian ] = "Àâòîòåêñò ê ñîêðàùåíèþ '";
    TEXT[ polish ] = "Autotekst do skrótu '";
    TEXT[ japanese ] = "“ü—ÍŽx‰‡€–ڂ̼®°Ä¶¯Ä";
    TEXT[ chinese_traditional ] = "¦Û°Ê¹Ï¤å¶°ÁY¼g '";
    TEXT[ arabic ] = "äÕ ÇáÊáÞÇÆí ááÇÎÊÕÇÑ '";
    TEXT[ greek ] = "Ôï ÁõôïÊåßìåíï ãéá ôç óõíôüìåõóç '";
    TEXT[ korean ] = "ÀÚµ¿ ÅØ½ºÆ® ¹Ù·Î°¡±â '";
    TEXT[ turkish ] = "Otomatik metin kýsaltmasý '";
    TEXT[ language_user1 ] = " ";
};
String STR_NOGLOS2
{
    /* ### ACHTUNG: Neuer Text in Resource? ' nicht gefunden. : '' nicht gefunden. */
    /* ### ACHTUNG: Neuer Text in Resource? ' nicht gefunden. : '' nicht gefunden. */
    /* ### ACHTUNG: Neuer Text in Resource? ' nicht gefunden. : '' nicht gefunden. */
    /* ### ACHTUNG: Neuer Text in Resource? ' nicht gefunden. : '' nicht gefunden. */
    TEXT = "' nicht gefunden." ;
    TEXT [ English ] = "' not found." ;
    TEXT [ norwegian ] = "' not found." ;
    TEXT [ italian ] = "' non trovato." ;
    TEXT [ portuguese_brazilian ] = "' não encontrado." ;
    TEXT [ portuguese ] = "' não encontrado." ;
    TEXT [ finnish ] = "' ei löydy." ;
    TEXT [ danish ] = "'blev ikke fundet." ;
    TEXT [ french ] = "' est introuvable." ;
    TEXT [ swedish ] = "' hittades inte." ;
    TEXT [ dutch ] = "' niet gevonden." ;
    TEXT [ spanish ] = "' no se encontró." ;
    TEXT [ english_us ] = "' not found." ;
    TEXT[ chinese_simplified ] = "' ûÓб»ÕÒµ½¡£";
    TEXT[ russian ] = "' íåíàéäåí.";
    TEXT[ polish ] = "' nie znaleziono.";
    TEXT[ japanese ] = "Œ©‚‚©‚è‚Ü‚¹‚ñ‚Å‚µ‚½B";
    TEXT[ chinese_traditional ] = "' ¨S¦³³Q§ä¨ì¡C";
    TEXT[ arabic ] = "áã íõÚËÑ Úáíå '";
    TEXT[ greek ] = "' äåí âñÝèçêå.";
    TEXT[ korean ] = "' ¹ß°ßµÇÁö ¾Ê½À´Ï´Ù.";
    TEXT[ turkish ] = "' bulunamadý.";
    TEXT[ language_user1 ] = " ";
};
String STR_NUM_LEVEL
{
    TEXT = "Ebene " ;
    TEXT [ English ] = "Level " ;
    Text [ dutch ] = "Niveau  " ;
    Text [ english_us ] = "Level " ;
    Text [ italian ] = "Livello " ;
    Text [ spanish ] = "Nivel  " ;
    Text [ french ] = "Niveau " ;
    Text [ swedish ] = "Nivå " ;
    Text [ danish ] = "Niveau " ;
    Text [ portuguese_brazilian ] = "Ebene " ;
    Text [ portuguese ] = "Nível " ;
    Text[ chinese_simplified ] = "¼¶ ";
    Text[ russian ] = "Óðîâåíü  ";
    Text[ polish ] = "Poziom  ";
    Text[ japanese ] = "ÚÍÞÙ ";
    Text[ chinese_traditional ] = "¯Å ";
    Text[ arabic ] = "ÇáãÓÊæì";
    Text[ greek ] = "Åðßðåäï ";
    Text[ korean ] = "¼öÁØ ";
    Text[ turkish ] = "Düzey ";
    Text[ language_user1 ] = " ";
};
String STR_ERROR_NOLANG
{
    TEXT = "Im geprüften Bereich ist keine Sprache eingestellt." ;
    TEXT [ English ] = "No language choosed in checked region." ;
    TEXT [ norwegian ] = "Språk ikke valgt i kontrollert område." ;
    TEXT [ italian ] = "Nell'area verificata non è stata impostata nessuna lingua." ;
    TEXT [ portuguese_brazilian ] = "No language choosed in checked region." ;
    TEXT [ portuguese ] = "Na secção verificada não existe nenhuma língua definida." ;
    TEXT [ finnish ] = "No language choosed in checked region." ;
    TEXT [ danish ] = "Der er ikke angivet et sprog i det kontrollerede område." ;
    TEXT [ french ] = "Aucune langue choisie pour région définie." ;
    TEXT [ swedish ] = "Inget språk inställt i det stavningskontrollerade området." ;
    TEXT [ dutch ] = "In gecontroleerd bereik geen taal vastgelegd." ;
    TEXT [ spanish ] = "No se ha seleccionado ningún idioma en el área revisada." ;
    TEXT [ english_us ] = "No language is selected in the proofed section." ;
    TEXT[ chinese_simplified ] = "ÔÚ¼ì²éµÄÇøÓòÄÚûÓÐÑ¡¶¨ÈκÎÓïÑÔ¡£";
    TEXT[ russian ] = "Â ïðîâåðåííîé ñåêöèè ÿçûê íå óñòàíîâëåí.";
    TEXT[ polish ] = "W sprawdzanym obszarze nie ustawiono jêzyka.";
    TEXT[ japanese ] = "Áª¯¸‚µ‚½—̈æ‚ɂ͌¾Œê‚ªÝ’肳‚ê‚Ä‚¢‚Ü‚¹‚ñB";
    TEXT[ chinese_traditional ] = "¦bÀˬdªº°Ï°ì¤º¨S¦³¿ï©w¥ô¦ó»y¨¥¡C";
    TEXT[ arabic ] = ".áã íÊã ÊÍÏíÏ ÃíÉ áÛÉ Ýí ÇáäØÇÞ ÇáãÏÞÞ Ýíå";
    TEXT[ greek ] = "Äåí ïñßóôçêå ãëþóóá ãéá ôçí åëåã÷üìåíç ðåñéï÷Þ.";
    TEXT[ korean ] = "°ËÁõµÈ ±¸¿ª¿¡¼­ ¼±ÅÃµÈ ¾ð¾î°¡ ¾ø½À´Ï´Ù.";
    TEXT[ turkish ] = "Denetlenen bölümde dil seçilmedi.";
    TEXT[ language_user1 ] = " ";
};
String STR_EDIT_FOOTNOTE
{
    TEXT = "Fußnote bearbeiten" ;
    TEXT [ ENGLISH ] = "Edit footnote" ;
    TEXT [ norwegian ] = "Redigerer fotnote" ;
    TEXT [ italian ] = "Modifica nota a piè pagina" ;
    TEXT [ portuguese_brazilian ] = "Editar nota de rodapé" ;
    TEXT [ portuguese ] = "Editar nota de rodapé" ;
    TEXT [ finnish ] = "Muokkaa alaviitettä" ;
    TEXT [ danish ] = "Rediger fodnote" ;
    TEXT [ french ] = "Modifier note de bas de page" ;
    TEXT [ swedish ] = "Redigera fotnot" ;
    TEXT [ dutch ] = "Voetnoot bewerken" ;
    TEXT [ spanish ] = "Editar nota al pie" ;
    TEXT [ english_us ] = "Edit Footnote" ;
    TEXT[ chinese_simplified ] = "±à¼­×¢½Å";
    TEXT[ russian ] = "Ïðàâêà ñíîñîê";
    TEXT[ polish ] = "Edytuj przypis dolny";
    TEXT[ japanese ] = "‹r’‚̕ҏW";
    TEXT[ chinese_traditional ] = "½s¿èµù¸}";
    TEXT[ arabic ] = "ÊÍÑíÑ ÍÇÔíÉ ÓÝáíÉ";
    TEXT[ greek ] = "Åðåîåñãáóßá õðïóçìåßùóçò";
    TEXT[ korean ] = "°¢ÁÖ ÆíÁý";
    TEXT[ turkish ] = "Dipnotu düzenle";
    TEXT[ language_user1 ] = " ";
};
String STR_VERB_FOR_GRF
{
    TEXT = "Bearbeiten" ;
    TEXT [ ENGLISH ] = "Edit" ;
    Text [ dutch ] = "Bewerken" ;
    Text [ english_us ] = "Edit" ;
    Text [ italian ] = "Modifica" ;
    Text [ spanish ] = "Editar" ;
    Text [ french ] = "Modifier" ;
    Text [ swedish ] = "Redigera" ;
    Text [ danish ] = "Rediger" ;
    Text [ portuguese_brazilian ] = "Bearbeiten" ;
    Text [ portuguese ] = "Editar" ;
    Text[ chinese_simplified ] = "±à¼­";
    Text[ russian ] = "Ïðàâêà";
    Text[ polish ] = "Edytuj";
    Text[ japanese ] = "•ҏW";
    Text[ chinese_traditional ] = "½s¿è";
    Text[ arabic ] = "ÊÍÑíÑ";
    Text[ greek ] = "Åðåîåñãáóßá";
    Text[ korean ] = "ÆíÁý";
    Text[ turkish ] = "Düzenle";
    Text[ language_user1 ] = " ";
};
String STR_NB_REPLACED
{
    Text = "Suchbegriff XXmal ersetzt." ;
    Text [ ENGLISH ] = "Search pattern replaced XX times." ;
    Text [ norwegian ] = "Søkekriterier erstattet XX ganger." ;
    Text [ italian ] = "Testo sostituito XX volte" ;
    Text [ portuguese_brazilian ] = "Padrao de busca substituído XX vezes." ;
    Text [ portuguese ] = "Expressão procurada substituída XX vezes." ;
    Text [ finnish ] = "Hakumalli on korvattu XX kertaa." ;
    Text [ danish ] = "Søgeord erstattet XX gange." ;
    Text [ french ] = "L'élément recherché a été remplacé XX fois." ;
    Text [ swedish ] = "Sökord ersatt XX gånger." ;
    Text [ dutch ] = "Het gezochte item is XX keer vervangen." ;
    Text [ spanish ] = "La expresión buscada ha sido reemplazada XX veces." ;
    Text [ english_us ] = "Search key replaced XX times." ;
    Text[ chinese_simplified ] = "ËÑѰÄÚÈݱ» XX ´Î¸üÌæ¡£";
    Text[ russian ] = "Èñêîìîå ñëîâî çàìåíåíî XXðàç.";
    Text[ polish ] = "Szukane has³o zosta³o XX razy zast¹pione.";
    Text[ japanese ] = "ŒŸõ€–Ú‚ðXX“x’u‚«Š·‚¦‚Ü‚µ‚½";
    Text[ chinese_traditional ] = "·j´M¤º®e³Q XX ¦¸¥N´À¡C";
    Text[ arabic ] = "Êã ÇÓÊÈÏÇá ÈíÇäÇÊ ÇáÈÍË ××× ãÑÉ.";
    Text[ greek ] = "Æçôïýìåíï óôïé÷åßï áíôéêáôáóôÜèçêå XX öïñÝò.";
    Text[ korean ] = "°Ë»ö ´Ü¾î°¡  XX¹è·Î ´ëüµÊ.";
    Text[ turkish ] = "Arama terimi XX kez deðiþtirildi.";
    Text[ language_user1 ] = " ";
};
String RID_TOOLS_TOOLBOX
{
    Text = "Werkzeugleiste" ;
    Text [ English ] = "Toolbar" ;
    Text [ english_us ] = "Main Toolbar" ;
    Text [ italian ] = "Barra degli strumenti" ;
    Text [ spanish ] = "Barra de herramientas" ;
    Text [ french ] = "Barre d'instruments" ;
    Text [ dutch ] = "Werktuigbalk" ;
    Text [ swedish ] = "Verktygslist" ;
    Text [ danish ] = "Værktøjslinje" ;
    Text [ portuguese ] = "Barra de ferramentas" ;
    Text [ portuguese_brazilian ] = "Werkzeugleiste" ;
    Text[ chinese_simplified ] = "Ö÷¹¤¾ßÀ¸";
    Text[ russian ] = "Ïàíåëü èíñòðóìåíòîâ";
    Text[ polish ] = "Pasek narzêdziowy";
    Text[ japanese ] = "•W€Â°ÙÊÞ°";
    Text[ chinese_traditional ] = "¥D¤u¨ã¦C";
    Text[ arabic ] = "ÔÑíØ ÇáÃÏæÇÊ";
    Text[ greek ] = "ÃñáììÞ åñãáëåßùí";
    Text[ korean ] = "ÁÖ µµ±¸ ¸ðÀ½";
    Text[ turkish ] = "Ana araç çubuðu";
    Text[ language_user1 ] = " ";
};
String RID_SRCVIEW_TOOLBOX
{
    Text = "Quelltext" ;
    Text [ English ] = "Source" ;
    Text [ dutch ] = "Brontekst" ;
    Text [ english_us ] = "Source" ;
    Text [ italian ] = "Testo sorgente" ;
    Text [ spanish ] = "Texto fuente" ;
    Text [ french ] = "Texte source" ;
    Text [ swedish ] = "Källtext" ;
    Text [ danish ] = "Kildetekst" ;
    Text [ portuguese ] = "Texto-fonte" ;
    Text [ portuguese_brazilian ] = "Quelltext" ;
    Text[ chinese_simplified ] = "Ô´Îı¾";
    Text[ russian ] = "Èñõîäíûé òåêñò";
    Text[ polish ] = "Tekst Ÿród³owy";
    Text[ japanese ] = "¿°½";
    Text[ chinese_traditional ] = "­ì©lÀÉ";
    Text[ arabic ] = "äÕ ÇáãÕÏÑ";
    Text[ greek ] = "Êåßìåíï ðñïÝëåõóçò";
    Text[ korean ] = "¼Ò½º";
    Text[ turkish ] = "Kaynak kod";
    Text[ language_user1 ] = " ";
};
String STR_SRCVIEW_ROW
{
    Text = "Zeile " ;
    Text [ English ] = "Row " ;
    Text [ norwegian ] = "Rad " ;
    Text [ italian ] = "Riga " ;
    Text [ portuguese_brazilian ] = "Fileira " ;
    Text [ portuguese ] = "Linha " ;
    Text [ finnish ] = "Rivi " ;
    Text [ danish ] = "Række " ;
    Text [ french ] = "Ligne " ;
    Text [ swedish ] = "Rad  " ;
    Text [ dutch ] = "Rij  " ;
    Text [ spanish ] = "Fila  " ;
    Text [ english_us ] = "Row " ;
    Text[ chinese_simplified ] = "ÐÐ ";
    Text[ russian ] = "Ñòðîêà  ";
    Text[ polish ] = "Wiersz  ";
    Text[ japanese ] = "s ";
    Text[ chinese_traditional ] = "¦æ ";
    Text[ arabic ] = "ÕÝ";
    Text[ greek ] = "ÃñáììÞ ";
    Text[ korean ] = "Çà ";
    Text[ turkish ] = "Satýr ";
    Text[ language_user1 ] = " ";
};
String STR_SRCVIEW_COL
{
    Text = "Spalte " ;
    Text [ English ] = "Column " ;
    Text [ norwegian ] = "Kolonne " ;
    Text [ italian ] = "Colonna " ;
    Text [ portuguese_brazilian ] = "Coluna " ;
    Text [ portuguese ] = "Coluna " ;
    Text [ finnish ] = "Palsta " ;
    Text [ danish ] = "Kolonne " ;
    Text [ french ] = "Colonne " ;
    Text [ swedish ] = "Kolumn  " ;
    Text [ dutch ] = "Kolom  " ;
    Text [ spanish ] = "Columna  " ;
    Text [ english_us ] = "Column " ;
    Text[ chinese_simplified ] = "ÁÐ ";
    Text[ russian ] = "Êîëîíêà ";
    Text[ polish ] = "Kolumna  ";
    Text[ japanese ] = "—ñ ";
    Text[ chinese_traditional ] = "Äæ ";
    Text[ arabic ] = "ÚãæÏ";
    Text[ greek ] = "ÓôÞëç ";
    Text[ korean ] = "¿­ ";
    Text[ turkish ] = "Sütun ";
    Text[ language_user1 ] = " ";
};
String STR_PRINT_TITLE
{
    Text = "Drucken der Selektion" ;
    Text [ English ] = "Printing of selection" ;
    Text[ italian ] = "Stampa la selezione";
    Text[ portuguese_brazilian ] = "Drucken der Selektion";
    Text[ portuguese ] = "A imprimir selecção";
    Text[ danish ] = "Udskriv det markerede";
    Text[ french ] = "Imprimer la sélection";
    Text[ swedish ] = "Skriv ut markeringen";
    Text[ dutch ] = "Afdrukken van de selectie";
    Text[ spanish ] = "Imprimir la selección";
    Text[ english_us ] = "Printing selection";
    Text[ chinese_simplified ] = "´òÓ¡Ñ¡ÖеIJ¿·Ö";
    Text[ russian ] = "Ïå÷àòü âûäåëåííîãî ôðàãìåíòà";
    Text[ polish ] = "Drukowanie wybranych elementów";
    Text[ japanese ] = "‘I‘ð”͈͂̈óü";
    Text[ chinese_traditional ] = "¦C¦L¿ï¨ú³¡¥÷";
    Text[ arabic ] = "ØÈÇÚÉ ÇáÊÍÏíÏ";
    Text[ greek ] = "Åêôýðùóç åðéëïãÞò";
    Text[ korean ] = "¼±Åà Àμâ";
    Text[ turkish ] = "Seçimi yazdýr";
    Text[ language_user1 ] = " ";
};
String STR_PRINT_MSG
{
    Text = "Wollen Sie die Selektion oder das gesamte Dokument drucken?" ;
    Text [ English ] = "Print selection or whole document?" ;
    Text[ italian ] = "Volete stampare la selezione o l'intero documento?";
    Text[ portuguese_brazilian ] = "Wollen Sie die Selektion oder das gesamte Dokument drucken?";
    Text[ portuguese ] = "Deseja imprimir a selecção ou o documento inteiro?";
    Text[ danish ] = "Vil du udskrive det markerede eller hele dokumentet?";
    Text[ french ] = "Souhaitez vous imprimer uniquement la sélection ou bien le document entier ?";
    Text[ swedish ] = "Vill Du skriva ut det markerade eller hela dokumentet?";
    Text[ dutch ] = "Wilt u de selectie of het hele document afdrukken?";
    Text[ spanish ] = "¿Desea imprimir solo la selección o todo el documento?";
    Text[ english_us ] = "Do you wish to print the selection or the entire document?";
    Text[ chinese_simplified ] = "ÄúÒª´òÓ¡Ñ¡ÔñµÄ²¿·Ö»¹ÊÇÒª´òÓ¡Õû¸öÎĵµ£¿";
    Text[ russian ] = "Âû õîòèòå íàïå÷àòàòü âåñü äîêóìåíò èëè òîëüêî âûäåëåíèå?";
    Text[ polish ] = "Czy chcesz wydrukowaæ selekcjê czy te¿ ca³y dokument?";
    Text[ japanese ] = "‘I‘ð”͈͂©•¶‘‘S‘̂̂ǂ¿‚ç‚ðˆóü‚µ‚Ü‚·‚©H";
    Text[ chinese_traditional ] = "±z­n¦C¦L¿ï¨úªº³¡¥÷ÁÙ¬O­n¦C¦L¾ã­Ó¤å¥ó¡S";
    Text[ arabic ] = "åá ÊÑíÏ ØÈÇÚÉ ÇáÊÍÏíÏ Ãã ÇáãÓÊäÏ ÈÃßãáå¿";
    Text[ greek ] = "ÈÝëåôå íá åêôõðþóåôå ôçí åðéëåãìÝíç ðåñéï÷Þ Þ ïëüêëçñï ôï Ýããñáöï;";
    Text[ korean ] = "¼±ÅÃµÈ ¹®¼­³ª Àüü ¹®¼­¸¦ ÀμâÇϽðڽÀ´Ï±î?";
    Text[ turkish ] = "Seçimi ya da tüm belgeyi yazdýrmak istiyor musunuz?";
    Text[ language_user1 ] = " ";
};
String STR_PRINT_ALL
{
    Text = "~Alles" ;
    Text [ English ] = "All" ;
    Text[ italian ] = "~Tutto";
    Text[ portuguese_brazilian ] = "Alles";
    Text[ portuguese ] = "~Tudo";
    Text[ danish ] = "Alt";
    Text[ french ] = "~Tout";
    Text[ swedish ] = "Allt";
    Text[ dutch ] = "~Alles";
    Text[ spanish ] = "~Todo";
    Text[ english_us ] = "All";
    Text[ chinese_simplified ] = "È«²¿";
    Text[ russian ] = "Âñå";
    Text[ polish ] = "Wszystko";
    Text[ japanese ] = "‚·‚ׂÄ";
    Text[ chinese_traditional ] = "¥þ³¡";
    Text[ arabic ] = "Çáßá";
    Text[ greek ] = "¼ëá";
    Text[ korean ] = "Àüü";
    Text[ turkish ] = "Tümü";
    Text[ language_user1 ] = " ";
};
String STR_PRINT_SELECTION
{
    Text = "~Selektion" ;
    Text [ English ] = "Selection" ;
    Text[ italian ] = "~Selezione";
    Text[ portuguese_brazilian ] = "Selektion";
    Text[ portuguese ] = "~Selecção";
    Text[ danish ] = "Markering";
    Text[ french ] = "~Sélection";
    Text[ swedish ] = "Markering";
    Text[ dutch ] = "~Selectie";
    Text[ spanish ] = "Sele~cción";
    Text[ english_us ] = "Selection";
    Text[ chinese_simplified ] = "Ñ¡ÖÐ";
    Text[ russian ] = "Âûäåëåíèå";
    Text[ polish ] = "Selekcja";
    Text[ japanese ] = "‘I‘ð”͈Í";
    Text[ chinese_traditional ] = "¿ï¨ú";
    Text[ arabic ] = "ÇáÊÍÏíÏ";
    Text[ greek ] = "ÅðéëïãÞ";
    Text[ korean ] = "¼±ÅÃ";
    Text[ turkish ] = "Seçim";
    Text[ language_user1 ] = " ";
};
String STR_READONLY_SEL
{
    TEXT = "schreibgeschützt" ;
    TEXT [ English ] = "readonly" ;
    TEXT[ english_us ] = "read only";
    TEXT[ portuguese ] = "só leitura";
    TEXT[ russian ] = "òîëüêî äëÿ ÷òåíèÿ";
    TEXT[ dutch ] = "schrijfbeveiligd";
    TEXT[ french ] = "en lecture seule";
    TEXT[ spanish ] = "solo lectura";
    TEXT[ italian ] = "a sola lettura";
    TEXT[ danish ] = "skrivebeskyttet";
    TEXT[ swedish ] = "skrivskyddad";
    TEXT[ polish ] = "Tylko do odczytu";
    TEXT[ portuguese_brazilian ] = "readonly";
    TEXT[ japanese ] = "“ǂݎæ‚èê—p";
    TEXT[ chinese_simplified ] = "·À¸²Ð´";
    TEXT[ chinese_traditional ] = "°ßŪ";
    TEXT[ arabic ] = "ááÞÑÇÁÉ ÝÞØ";
    TEXT[ greek ] = "ìüíï ãéá áíÜãíùóç";
    TEXT[ korean ] = "Àбâ Àü¿ë";
    TEXT[ turkish ] = "Salt okunur";
    TEXT[ language_user1 ] = " ";
};
String STR_SAVEAS_SRC
{
    Text = "Q~uelltext exportieren..." ;
    Text [ English ] = "Export source as..." ;
    Text [ portuguese_brazilian ] = "Q~uelltext exportieren..." ;
    Text [ swedish ] = "Exportera källtext..." ;
    Text [ danish ] = "Eksporter kildetekst..." ;
    Text [ italian ] = "~Esporta testo sorgente..." ;
    Text [ spanish ] = "~Exportar texto fuente..." ;
    Text [ french ] = "E~xport du texte source..." ;
    Text [ dutch ] = "~Brontekst exporteren..." ;
    Text [ portuguese ] = "Exportar texto-~fonte..." ;
    Text [ english_us ] = "~Export source..." ;
    Text[ chinese_simplified ] = "Êä³öÔ´Îı¾(~E)...";
    Text[ russian ] = "Ýêñïîðò èñõîäíîãî òåêñòà...";
    Text[ polish ] = "Eksportuj tekst Ÿród³owy...";
    Text[ japanese ] = "¿°½Ã·½Ä‚𴸽Î߰Ă·‚é(~E)...";
    Text[ chinese_traditional ] = "¿é¥X­ì©lÀÉ(~E)...";
    Text[ arabic ] = "ÊÕÏíÑ äÕ ÇáãÕÏÑ...";
    Text[ greek ] = "ÅîáãùãÞ êåéìÝíïõ ðñïÝëåõóçò...";
    Text[ korean ] = "¼Ò½º º¸³»±â(~E)...";
    Text[ turkish ] = "Kaynak kodu dýþa aktar...";
    Text[ language_user1 ] = " ";
};
String MN_SRCVIEW_POPUPMENU
{
    Text = "HTML - Quelltext" ;
    Text [ English ] = "HTML source" ;
    Text [ portuguese ] = "Texto-fonte HTML" ;
    Text [ english_us ] = "HTML source" ;
    Text [ portuguese_brazilian ] = "HTML - Quelltext" ;
    Text [ swedish ] = "HTML - Källtext" ;
    Text [ danish ] = "HTML-kildetekst" ;
    Text [ italian ] = "Testo sorgente HTML" ;
    Text [ spanish ] = "Texto fuente HTML" ;
    Text [ french ] = "Texte source HTML" ;
    Text [ dutch ] = "HTML - brontekst" ;
    Text[ chinese_simplified ] = "HTML Ô´Îı¾";
    Text[ russian ] = "Èñõîäíûé òåêñò â ôîðìàòå HTML";
    Text[ polish ] = "Tekst Ÿród³owy HTML";
    Text[ japanese ] = "HTML¿°½";
    Text[ chinese_traditional ] = "HTML ­ì©lÀÉ";
    Text[ arabic ] = "äÕ ãÕÏÑ HTML";
    Text[ greek ] = "Áñ÷åßï ðñïÝëåõóçò HTML";
    Text[ korean ] = "HTML ¼Ò½º";
    Text[ turkish ] = "HTML kaynak kodu";
    Text[ language_user1 ] = " ";
};

ToolBox RID_TOOLS_TOOLBOX
{
    HelpID = HID_TOOLS_TOOLBOX ;
    Border = TRUE ;
    SVLook = TRUE ;
    Dockable = TRUE ;
    Moveable = TRUE ;
    Sizeable = TRUE ;
    Closeable = TRUE ;
    Zoomable = TRUE ;
    LineSpacing = TRUE ;
    HideWhenDeactivate = TRUE ;
    Customize = TRUE ;
    MenuStrings = TRUE ;
    Scroll = TRUE ;
    Align = BOXALIGN_LEFT ;
    Hide = TRUE ;
    ItemList =
    {
        ToolBoxItem
        {
            Identifier = FN_INSERT_CTRL ;
            HelpID = HID_INSERT_CTRL ;
            DropDown = TRUE ;
        };
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            Identifier = FN_INSERT_FIELD_CTRL ;
            HelpID = HID_INSERT_FIELD_CTRL ;
            DropDown = TRUE ;
        };
        ToolBoxItem
        {
            Identifier = FN_INSERT_OBJ_CTRL ;
            HelpID = HID_INSERT_OBJ_CTRL ;
            DropDown = TRUE ;
        };
        ToolBoxItem
        {
            ITEM_TOOLBAR_INSERT_DRAW
        };
        ToolBoxItem
        {
            ITEM_FORM_CONFIG
        };
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            Identifier = FN_GLOSSARY_DLG ;
            HelpID = FN_GLOSSARY_DLG ;
            DropDown = TRUE ;
        };
        ToolBoxItem
        {
            Identifier = FN_INSERT_CAPTION;
            HelpID = FN_INSERT_CAPTION ;
            Hide = TRUE ;
        };
        ToolBoxItem
        {
            Identifier = FN_INSERT_IDX_ENTRY_DLG;
            HelpId = FN_INSERT_IDX_ENTRY_DLG;
            Hide = TRUE;
        };
        ToolBoxItem
        {
            Identifier = FN_INSERT_REF_FIELD;
            HelpID = FN_INSERT_REF_FIELD ;
            Hide = TRUE ;
        };
        ToolBoxItem
        {
            Identifier = FN_SHADOWCURSOR ;
            HelpID = FN_SHADOWCURSOR ;
        };
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            Identifier = FN_SPELLING_DLG ;
            HelpID = FN_SPELLING_DLG ;
        };
        ToolBoxItem
        {
            ITEM_TOOLBAR_AUTOSPELL_CHECK
        };
        ToolBoxItem
        {
            Identifier = FN_HYPHENATE_OPT_DLG;
            HelpID = FN_HYPHENATE_OPT_DLG;
            Hide = TRUE;
        };
        ToolBoxItem
        {
            Identifier = FN_THESAURUS_DLG;
            HelpID = FN_THESAURUS_DLG;
            Hide = TRUE;
        };
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            Identifier = SID_SEARCH_DLG ;
            HelpID = SID_SEARCH_DLG ;
        };
        ToolBoxItem
        {
            Identifier = SID_HYPERLINK_INSERT ;
            HelpID = SID_HYPERLINK_INSERT ;
        };
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            Identifier = SID_ATTR_ZOOM;
            HelpID = SID_ATTR_ZOOM ;
            Hide = TRUE;
        };
        ToolBoxItem
        {
            Identifier = FN_VIEW_META_CHARS ;
            HelpID = FN_VIEW_META_CHARS ;
        };
        ToolBoxItem
        {
            Identifier = FN_VIEW_FIELDNAME ;
            HelpID = FN_VIEW_FIELDNAME ;
            Hide = TRUE;
        };
        ToolBoxItem
        {
            Identifier = FN_VIEW_GRAPHIC ;
            HelpID = FN_VIEW_GRAPHIC ;
        };
        ToolBoxItem
        {
            Identifier = SID_BROWSER_MODE ;
            HelpID = SID_BROWSER_MODE ;
        };
    };
};
Toolbox RID_SRCVIEW_TOOLBOX
{
    HelpID = HID_SRCVIEW_TOOLBOX ;
    Border = TRUE ;
    SVLook = TRUE ;
    Dockable = TRUE ;
    Moveable = TRUE ;
    Sizeable = TRUE ;
    Closeable = TRUE ;
    Zoomable = TRUE ;
    LineSpacing = TRUE ;
    HideWhenDeactivate = TRUE ;
    Customize = TRUE ;
    MenuStrings = TRUE ;
    Scroll = TRUE ;
    Align = BOXALIGN_TOP ;
    Hide = TRUE ;
    ItemList =
    {
        ToolBoxItem
        {
            Identifier = SID_ATTR_CHAR_FONT ;
            HelpID = SID_ATTR_CHAR_FONT ;
        };
        ToolBoxItem
        {
            Identifier = SID_ATTR_CHAR_FONTHEIGHT ;
            HelpID = SID_ATTR_CHAR_FONTHEIGHT ;
        };
    };
};
Menu MN_SRCVIEW_POPUPMENU
{
    ItemList =
    {
        MenuItem
        {
            ITEM_FORMAT_ATTR_CHAR_FONT
        };
        MenuItem
        {
            ITEM_FORMAT_ATTR_CHAR_FONTHEIGHT
        };
        MenuItem
        {
            Separator = TRUE ;
        };
        MenuItem
        {
            Identifier = SID_SOURCEVIEW ;
            HelpID = HID_SOURCEVIEW ;
            Text = "HTML-Quelltext" ;
            Text [ ENGLISH ] = "HTML source" ;
            Text [ dutch ] = "HTML-brontekst" ;
            Text [ english_us ] = "HTML Source" ;
            Text [ italian ] = "Testo sorgente HTML" ;
            Text [ spanish ] = "Texto fuente HTML" ;
            Text [ french ] = "Texte source HTML" ;
            Text [ swedish ] = "HTML-källtext" ;
            Text [ danish ] = "HTML-kildetekst" ;
            Text [ portuguese ] = "Fonte HTML" ;
            Text [ portuguese_brazilian ] = "HTML-Quelltext" ;
            Text[ chinese_simplified ] = "HTML Ô´Îı¾";
            Text[ russian ] = "Èñõîäíûé òåêñò â ôîðìàòå HTML";
            Text[ polish ] = "Tekst Ÿród³owy HTML";
            Text[ japanese ] = "HTML¿°½";
            Text[ chinese_traditional ] = "HTML ­ì©lÀÉ";
            Text[ arabic ] = "äÕ ãÕÏÑ HTML";
            Text[ greek ] = "Êåßìåíï ðñïÝëåõóçò HTML";
            Text[ korean ] = "HTML ¼Ò½º";
            Text[ turkish ] = "HTML kaynak kodu";
            Text[ language_user1 ] = " ";
        };
    };
};

diff --git a/sw/source/ui/uiview/view0.cxx b/sw/source/ui/uiview/view0.cxx
new file mode 100644
index 0000000..3796826
--- /dev/null
+++ b/sw/source/ui/uiview/view0.cxx
@@ -0,0 +1,270 @@
/*************************************************************************
 *
 *  $RCSfile: view0.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:49 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "hintids.hxx"

#ifndef _SVX_SRCHITEM_HXX
#include <svx/srchitem.hxx>
#endif
#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif
#ifndef _SVX_SRCHDLG_HXX //autogen
#include <svx/srchdlg.hxx>
#endif
#ifndef _IDETEMP_HXX
#include <basctl/idetemp.hxx>
#endif
#ifndef _SFX_TEMPLDLG_HXX //autogen
#include <sfx2/templdlg.hxx>
#endif
#ifndef _UIVWIMP_HXX
#include <uivwimp.hxx>
#endif

#ifndef _NAVIPI_HXX //autogen
#include <navipi.hxx>
#endif
#include "view.hxx"
#include "basesh.hxx"
#include "docsh.hxx"
#include "globals.hrc"
#include "cmdid.h"          // FN_       ...
#include "globdoc.hxx"
#include "wview.hxx"
#include "shells.hrc"

#define OLEObjects
#define SwView
#define SearchAttributes
#define ReplaceAttributes
#define SearchSettings
#define _ExecSearch ExecSearch
#define _StateSearch StateSearch
#define Frames
#define Graphics
#define Tables
#define Controls
#define GlobalContents
#define Text
#define Frame
#define Graphic
#define Object
#define Draw
#define TextDrawText
#define TextInTable
#define ListInText
#define ListInTable
#define WebTextInTable
#define WebListInText
#define WebListInTable
#define TextPage
#include "itemdef.hxx"
#include <svx/svxslots.hxx>
#include "swslots.hxx"

using namespace ::com::sun::star;
using namespace ::rtl;

#define C2S(cChar) UniString::CreateFromAscii(cChar)

SFX_IMPL_VIEWFACTORY(SwView, SW_RES(STR_NONAME))
{
    SFX_VIEW_REGISTRATION(SwDocShell);
    SFX_VIEW_REGISTRATION(SwGlobalDocShell);
}

SFX_IMPL_INTERFACE( SwView, SfxViewShell, SW_RES(RID_TOOLS_TOOLBOX) )
{
    SFX_CHILDWINDOW_CONTEXT_REGISTRATION(SID_NAVIGATOR);
    SFX_CHILDWINDOW_REGISTRATION(SfxTemplateDialogWrapper::GetChildWindowId());
    SFX_CHILDWINDOW_REGISTRATION(SvxSearchDialogWrapper::GetChildWindowId());
    SFX_CHILDWINDOW_REGISTRATION(FN_REDLINE_ACCEPT);
    SFX_CHILDWINDOW_REGISTRATION(SID_HYPERLINK_DIALOG);
    SFX_FEATURED_CHILDWINDOW_REGISTRATION(FN_SYNC_LABELS, 1);
    SFX_OBJECTBAR_REGISTRATION( SFX_OBJECTBAR_TOOLS|
                                SFX_VISIBILITY_STANDARD|SFX_VISIBILITY_SERVER,
                                SW_RES(RID_TOOLS_TOOLBOX) );
}

TYPEINIT1(SwView,SfxViewShell)

/*-----------------13.12.97 11:06-------------------

--------------------------------------------------*/
ShellModes  SwView::GetShellMode()
{
    return pViewImpl->GetShellMode();
}

/*-----------------13.12.97 11:28-------------------

--------------------------------------------------*/
view::XSelectionSupplier* SwView::GetUNOObject()
{
    return pViewImpl->GetUNOObject();
}


/*------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.72  2000/09/18 16:06:12  willem.vandorp
    OpenOffice header added.

    Revision 1.71  2000/09/04 11:44:56  tbe
    basicide, isetbrw, si, vcdlged moved from svx to basctl

    Revision 1.70  2000/05/10 11:53:20  os
    Basic API removed

    Revision 1.69  2000/05/09 14:43:13  os
    BASIC interface partially removed

    Revision 1.68  2000/04/18 15:02:50  os
    UNICODE

    Revision 1.67  2000/03/23 07:50:25  os
    UNO III

    Revision 1.66  2000/02/09 08:07:01  os
    #72165# hyperlink dialog moved again

    Revision 1.65  1999/09/07 13:56:53  os
    Insert/EditIndexEntry as FloatingWindow

    Revision 1.64  1999/01/27 08:58:32  OS
    #56371# TF_ONE51


      Rev 1.63   27 Jan 1999 09:58:32   OS
   #56371# TF_ONE51

      Rev 1.62   15 Jul 1998 12:52:42   OS
   Navigator an der SwView registrieren #34794#

      Rev 1.61   09 Jun 1998 15:32:20   OM
   VC-Controls entfernt

      Rev 1.60   02 Jun 1998 15:49:54   OS
   TF_STARONE raus; GetUNOSelectionObject gestrichen

      Rev 1.59   03 Apr 1998 14:38:18   OS
   UnoObject fuer die View reaktiviert

      Rev 1.58   16 Mar 1998 16:18:04   OM
   Aktualisieren-Button kontextsensitiv

      Rev 1.57   15 Mar 1998 15:14:08   OM
   Synchron-Button

      Rev 1.56   27 Feb 1998 18:25:14   OM
   Redline-Browser

      Rev 1.55   29 Jan 1998 09:21:06   OS
   TF_STARONE

      Rev 1.54   16 Dec 1997 12:00:24   OS
   Impl-Pointer fuer UNO

      Rev 1.53   29 Nov 1997 16:49:14   MA
   includes

      Rev 1.52   21 Nov 1997 15:00:12   MA
   includes

      Rev 1.51   03 Nov 1997 13:58:28   MA
   precomp entfernt

      Rev 1.50   09 Sep 1997 11:33:08   OS
   TextPage heisst nur Page #43650#

      Rev 1.49   08 Sep 1997 10:52:36   OS
   DBG_ERROR -> DBG_ASSERT

      Rev 1.48   08 Sep 1997 07:43:38   OS
   TextTables nur ClassName

      Rev 1.47   04 Sep 1997 18:10:56   MBA
   GetSelectionObject erzeugt richtiges Objekt auch bei WebView

      Rev 1.46   04 Sep 1997 08:25:24   OS
   Tables heisst jetzt TextTables, kein GPF wg. fehlender TLB-Angaben

      Rev 1.45   03 Sep 1997 10:52:26   MBA
   OLEObjects in SVX

      Rev 1.44   29 Aug 1997 12:21:34   MH
   chg: SfxTypeLib_Impl

      Rev 1.43   05 Aug 1997 16:36:38   TJ
   include svx/srchitem.hxx

      Rev 1.42   07 Jul 1997 09:35:10   OS
   Collection fuer GlobalDoc

------------------------------------------------------------------------*/

diff --git a/sw/source/ui/uiview/view1.cxx b/sw/source/ui/uiview/view1.cxx
new file mode 100644
index 0000000..db15ba1
--- /dev/null
+++ b/sw/source/ui/uiview/view1.cxx
@@ -0,0 +1,272 @@
/*************************************************************************
 *
 *  $RCSfile: view1.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:49 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SVDPAGV_HXX //autogen
#include <svx/svdpagv.hxx>
#endif
#ifndef _SVDVIEW_HXX //autogen
#include <svx/svdview.hxx>
#endif
#ifndef _SVX_RULER_HXX //autogen
#include <svx/ruler.hxx>
#endif
#ifndef _IDXMRK_HXX
#include <idxmrk.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _VIEWOPT_HXX
#include <viewopt.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _GLOBDOC_HXX
#include <globdoc.hxx>
#endif
#ifndef _NAVIPI_HXX
#include <navipi.hxx>
#endif
#ifndef _FLDWRAP_HXX
#include <fldwrap.hxx>
#endif
#ifndef _REDLNDLG_HXX
#include <redlndlg.hxx>
#endif
#ifndef _DPAGE_HXX
#include <dpage.hxx>
#endif
#ifndef _EDTWIN_HXX
#include <edtwin.hxx>
#endif

#ifndef _CMDID_H
#include <cmdid.h>
#endif

extern int bDocSzUpdated;


/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwView::Activate(BOOL bMDIActivate)
{
    // aktuelle View anmelden an der DocShell
    // die View bleibt solange an der DocShell
    // aktiv bis Sie zerstoert wird oder durch Activate eine
    // neue gesetzt wird
    SwDocShell* pDocSh = GetDocShell();
    if(pDocSh)
        pDocSh->SetView(this);
    SwModule* pSwMod = SW_MOD();
    pSwMod->SetView(this);

    // Dokumentgroesse hat sich geaendert
    if(!bDocSzUpdated)
        DocSzChgd(aDocSz);

    pHLineal->SetActive( TRUE );
    if(pVLineal)
        pVLineal->SetActive( TRUE );

    if ( bMDIActivate )
    {
        pWrtShell->ShGetFcs(FALSE);     // Selektionen sichtbar

        if( sSwViewData.Len() )
        {
            ReadUserData( sSwViewData, FALSE );
            if( sNewCrsrPos.Len() )
            {
                long nX = sNewCrsrPos.GetToken( 0, ';' ).ToInt32(),
                      nY = sNewCrsrPos.GetToken( 1, ';' ).ToInt32();
                pWrtShell->SwCrsrShell::SetCrsr( Point( nX, nY ), FALSE );
                sNewCrsrPos.Erase();
            }
            sSwViewData.Erase();
        }

        AttrChangedNotify(pWrtShell);

        // Flddlg ggf neu initialisieren (z.B. fuer TYP_SETVAR)
        USHORT nId = SwFldDlgWrapper::GetChildWindowId();
        SfxViewFrame* pVFrame = GetViewFrame();
        SwFldDlgWrapper *pWrp = (SwFldDlgWrapper*)pVFrame->GetChildWindow(nId);
        if (pWrp)
            pWrp->ReInitDlg(GetDocShell());

        // RedlineDlg ggf neu initialisieren
        nId = SwRedlineAcceptChild::GetChildWindowId();
        SwRedlineAcceptChild *pRed = (SwRedlineAcceptChild*)pVFrame->GetChildWindow(nId);
        if (pRed)
            pRed->ReInitDlg(GetDocShell());

        // reinit IdxMarkDlg
        nId = SwInsertIdxMarkWrapper::GetChildWindowId();
        SwInsertIdxMarkWrapper *pIdxMrk = (SwInsertIdxMarkWrapper*)pVFrame->GetChildWindow(nId);
        if (pIdxMrk)
            pIdxMrk->ReInitDlg(*pWrtShell);

        // reinit AuthMarkDlg
        nId = SwInsertAuthMarkWrapper::GetChildWindowId();
        SwInsertAuthMarkWrapper *pAuthMrk = (SwInsertAuthMarkWrapper*)pVFrame->
                                                                GetChildWindow(nId);
        if (pAuthMrk)
            pAuthMrk->ReInitDlg(*pWrtShell);
    }
    else
        //Wenigstens das Notify rufen (vorsichtshalber wegen der SlotFilter
        AttrChangedNotify(pWrtShell);

    SfxViewShell::Activate(bMDIActivate);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void SwView::Deactivate(BOOL bMDIActivate)
{
    extern BOOL bFlushCharBuffer ;
        // Befinden sich noch Zeichen im Input Buffer?
    if( bFlushCharBuffer )
        GetEditWin().FlushInBuffer( pWrtShell );

    if( bMDIActivate )
    {
        pWrtShell->ShLooseFcs();    // Selektionen unsichtbar

        pHLineal->SetActive( FALSE );
        if(pVLineal)
            pVLineal->SetActive( FALSE );
    }
    SfxViewShell::Deactivate(bMDIActivate);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwView::MarginChanged()
{
    GetWrtShell().SetBrowseBorder( GetMargin() );
}


/*------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.79  2000/09/18 16:06:12  willem.vandorp
    OpenOffice header added.

    Revision 1.78  2000/09/08 08:12:53  os
    Change: Set/Toggle/Has/Knows/Show/GetChildWindow

    Revision 1.77  2000/08/15 14:08:20  jp
    Task #77422#: PrintPreView in the same window

    Revision 1.76  1999/09/15 14:13:05  os
    dialog for authorities

    Revision 1.75  1999/09/07 13:56:53  os
    Insert/EditIndexEntry as FloatingWindow

    Revision 1.74  1999/01/25 12:49:14  JP
    Task #58677#: Crsr in Readonly Bereichen zulassen


      Rev 1.73   25 Jan 1999 13:49:14   JP
   Task #58677#: Crsr in Readonly Bereichen zulassen

      Rev 1.72   19 Jun 1998 08:54:14   OS
   VC-Sbx-Reste auch noch raus

      Rev 1.71   19 Jun 1998 07:58:34   MH
   GetSBxForm entfallen (OS)

      Rev 1.70   09 Jun 1998 15:32:52   OM
   VC-Controls entfernt

      Rev 1.69   31 Mar 1998 15:31:52   OS
   SetReadonlyUI von IsAllProtect abhaengig #49077#

      Rev 1.68   27 Mar 1998 14:15:16   OM
   ChildWindows im Modified-Hdl updaten

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/uiview/view2.cxx b/sw/source/ui/uiview/view2.cxx
new file mode 100644
index 0000000..8942eb6
--- /dev/null
+++ b/sw/source/ui/uiview/view2.cxx
@@ -0,0 +1,1587 @@
/*************************************************************************
 *
 *  $RCSfile: view2.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:49 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _UIPARAM_HXX
#include <uiparam.hxx>
#endif

#ifndef _SVX_LANGITEM_HXX //autogen
#include <svx/langitem.hxx>
#endif
#ifndef _APP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _WRKWIN_HXX //autogen
#include <vcl/wrkwin.hxx>
#endif
#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SFX_BINDINGS_HXX //autogen
#include <sfx2/bindings.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _LINKDLG_HXX //autogen
#include <so3/linkdlg.hxx>
#endif
#ifndef _TXTCMP_HXX //autogen
#include <svtools/txtcmp.hxx>
#endif
#ifndef _SVX_ZOOM_HXX //autogen
#include <svx/zoom.hxx>
#endif
#ifndef _SV_MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SVX_TSPTITEM_HXX //autogen
#include <svx/tstpitem.hxx>
#endif
#ifndef _SFXEVENT_HXX //autogen
#include <sfx2/event.hxx>
#endif
#ifndef _SFXDOCFILE_HXX //autogen
#include <sfx2/docfile.hxx>
#endif
#ifndef _SFX_DOCFILT_HACK_HXX //autogen
#include <sfx2/docfilt.hxx>
#endif
#ifndef _SFX_FCONTNR_HXX //autogen
#include <sfx2/fcontnr.hxx>
#endif
#ifndef _SVX_SIZEITEM_HXX //autogen
#include <svx/sizeitem.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SFX_TOPFRM_HXX
#include <sfx2/topfrm.hxx>
#endif
#ifndef _SFX_WHITER_HXX //autogen
#include <svtools/whiter.hxx>
#endif
#ifndef _SFXPTITEM_HXX //autogen
#include <svtools/ptitem.hxx>
#endif
#ifndef _SVXLINKMGR_HXX
#include <svx/linkmgr.hxx>
#endif
#ifndef __RSC //autogen
#include <tools/errinf.hxx>
#endif
#ifndef _URLOBJ_HXX //autogen
#include <tools/urlobj.hxx>
#endif
#ifndef _SVDVIEW_HXX //autogen
#include <svx/svdview.hxx>
#endif

#ifndef _SWWAIT_HXX
#include <swwait.hxx>
#endif
#ifndef _REDLNDLG_HXX
#include <redlndlg.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _UIVWIMP_HXX
#include <uivwimp.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _VIEWOPT_HXX
#include <viewopt.hxx>
#endif
#ifndef _BASESH_HXX
#include <basesh.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _UITOOL_HXX
#include <uitool.hxx>
#endif
#ifndef _SHELLIO_HXX
#include <shellio.hxx>
#endif
#ifndef _FMTINFMT_HXX
#include <fmtinfmt.hxx>
#endif
#ifndef _REDLENUM_HXX
#include <redlenum.hxx>
#endif
#ifndef _MDIEXP_HXX
#include <mdiexp.hxx>
#endif
#ifndef _DRAWBASE_HXX
#include <drawbase.hxx>
#endif
#ifndef _FRMMGR_HXX
#include <frmmgr.hxx>
#endif
#ifndef _PAGEDESC_HXX
#include <pagedesc.hxx>
#endif
#ifndef _LINENUM_HXX
#include <linenum.hxx>
#endif
#ifndef _SECTION_HXX
#include <section.hxx>
#endif
#ifndef _USRPREF_HXX
#include <usrpref.hxx>
#endif
#ifndef _BOOKMRK_HXX
#include <bookmrk.hxx>
#endif
#ifndef _NAVIPI_HXX
#include <navipi.hxx>
#endif
#ifndef _TOX_HXX
#include <tox.hxx>
#endif
#ifndef _WORKCTRL_HXX
#include <workctrl.hxx>
#endif
#ifndef _SCROLL_HXX
#include <scroll.hxx>
#endif
#ifndef _EDTWIN_HXX
#include <edtwin.hxx>
#endif
#ifndef _WVIEW_HXX
#include <wview.hxx>
#endif
#ifndef _TEXTSH_HXX
#include <textsh.hxx>
#endif
#ifndef _TABSH_HXX
#include <tabsh.hxx>
#endif
#ifndef _LISTSH_HXX
#include <listsh.hxx>
#endif

#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _SWSWERROR_H
#include <swerror.h>
#endif
#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif
#ifndef _SHELLS_HRC
#include <shells.hrc>
#endif
#ifndef _WEB_HRC
#include <web.hrc>
#endif
#ifndef _VIEW_HRC
#include <view.hrc>
#endif
#ifndef _FMTCLDS_HXX //autogen
#include <fmtclds.hxx>
#endif

//Damit die Seitenanzeige in der Statusleiste nicht unnoetig erfolgt.
static String sLstPg;
static USHORT nPageCnt = 0;
const char __FAR_DATA sStatusDelim[] = " : ";

using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::scanner;

/*---------------------------------------------------------------------------
    Beschreibung:   String fuer die Seitenanzeige in der Statusbar basteln.
 ----------------------------------------------------------------------------*/

String SwView::GetPageStr( USHORT nPg, USHORT nLogPg,
                            const String& rDisplay )
{
    String aStr( aPageStr );
    if( rDisplay.Len() )
        aStr += rDisplay;
    else
        aStr += String::CreateFromInt32(nLogPg);

    if( nLogPg && nLogPg != nPg )
    {
        aStr.AppendAscii( RTL_CONSTASCII_STRINGPARAM("   "));
        aStr += String::CreateFromInt32(nPg);
    }
    aStr.AppendAscii( RTL_CONSTASCII_STRINGPARAM(" / "));
    aStr += String::CreateFromInt32( GetWrtShell().GetPageCnt() );

    return aStr;
}

void __EXPORT SwView::Execute(SfxRequest &rReq)
{
    USHORT nSlot = rReq.GetSlot();
    const SfxItemSet* pArgs = rReq.GetArgs();
    const SfxPoolItem* pItem;
    switch( nSlot )
    {
        case SID_CREATE_SW_DRAWVIEW:
            pWrtShell->GetDoc()->MakeDrawModel();
            break;

        case FN_LINE_NUMBERING_DLG:
        {
            SwLineNumberingDlg *pDlg = new SwLineNumberingDlg(this);
            pDlg->Execute();
            delete pDlg;
            break;
        }
        case FN_EDIT_LINK_DLG:
            EditLinkDlg();
            break;
        case FN_REFRESH_VIEW:
            GetEditWin().Invalidate();
            break;
        case FN_PAGEUP:
        case FN_PAGEUP_SEL:
        {
            Rectangle aVis( GetVisArea() );
            PageUpCrsr(FN_PAGEUP_SEL == nSlot);
            rReq.SetReturnValue(SfxBoolItem(nSlot,
                                                aVis != GetVisArea()));
        }
        break;
        case FN_PAGEDOWN_SEL:
        case FN_PAGEDOWN:
        {
            Rectangle aVis( GetVisArea() );
            PageDownCrsr(FN_PAGEDOWN_SEL == nSlot);
            rReq.SetReturnValue(SfxBoolItem(nSlot,
                                                aVis != GetVisArea()));
        }
        break;
        case FN_REDLINE_ON:
        {
            if (SFX_ITEM_SET == pArgs->GetItemState(nSlot, FALSE, &pItem))
            {
                USHORT nOn = ((const SfxBoolItem*)pItem)->GetValue() ? REDLINE_ON : 0;
                USHORT nMode = pWrtShell->GetRedlineMode();
                pWrtShell->SetRedlineMode( (nMode & ~REDLINE_ON) | nOn);
            }
        }
        break;
        case FN_REDLINE_SHOW:

            if (SFX_ITEM_SET == pArgs->GetItemState(nSlot, FALSE, &pItem))
            {
                USHORT nMode = ( ~(REDLINE_SHOW_INSERT | REDLINE_SHOW_DELETE)
                        & pWrtShell->GetRedlineMode() ) | REDLINE_SHOW_INSERT;
                if( ((const SfxBoolItem*)pItem)->GetValue() )
                    nMode |= REDLINE_SHOW_DELETE;

                pWrtShell->SetRedlineMode( nMode );
            }
            break;
        case FN_REDLINE_ACCEPT:
            GetViewFrame()->ToggleChildWindow(FN_REDLINE_ACCEPT);
            break;

        case SID_DOCUMENT_COMPARE:
        case SID_DOCUMENT_MERGE:
            {
                String sFileName, sFilterName;
                INT16 nVersion = 0;

                if( pArgs )
                {
                    if( SFX_ITEM_SET == pArgs->GetItemState( SID_FILE_NAME, FALSE, &pItem ))
                        sFileName = ((const SfxStringItem*)pItem)->GetValue();

                    if( SFX_ITEM_SET == pArgs->GetItemState( SID_FILTER_NAME, FALSE, &pItem ))
                        sFilterName = ((const SfxStringItem*)pItem)->GetValue();

                    if( SFX_ITEM_SET == pArgs->GetItemState( SID_VERSION, FALSE, &pItem ))
                        nVersion = ((const SfxInt16Item *)pItem)->GetValue();
                }

                long nFound = InsertDoc( nSlot, sFileName, sFilterName, nVersion );
                rReq.SetReturnValue( SfxInt32Item( nSlot, nFound ));

                if (nFound > 0) // Redline-Browser anzeigen
                {
                    SfxViewFrame* pVFrame = GetViewFrame();
                    pVFrame->ShowChildWindow(FN_REDLINE_ACCEPT);

                    // RedlineDlg neu initialisieren
                    USHORT nId = SwRedlineAcceptChild::GetChildWindowId();
                    SwRedlineAcceptChild *pRed = (SwRedlineAcceptChild*)
                                            pVFrame->GetChildWindow(nId);
                    if (pRed)
                        pRed->ReInitDlg(GetDocShell());
                }
        }
        break;
        case FN_SYNC_LABELS:
            GetViewFrame()->ShowChildWindow(FN_SYNC_LABELS, TRUE);
            break;
        case FN_ESCAPE:
            if ( pWrtShell->HasDrawView() && pWrtShell->GetDrawView()->IsDragObj() )
            {
                pWrtShell->BreakDrag();
                pWrtShell->EnterSelFrmMode();
            }
            else if ( pWrtShell->IsDrawCreate() )
            {
                GetDrawFuncPtr()->BreakCreate();
                AttrChangedNotify(pWrtShell); // ggf Shellwechsel...
            }
            else if ( pWrtShell->HasSelection() || IsDrawMode() )
            {
                LeaveDrawCreate();
                pWrtShell->EnterStdMode();
                AttrChangedNotify(pWrtShell); // ggf Shellwechsel...
            }
            else if ( GetEditWin().GetApplyTemplate() )
                GetEditWin().SetApplyTemplate(SwApplyTemplate());
            else if( ((SfxObjectShell*)GetDocShell())->GetInPlaceObject() &&
                        ((SfxObjectShell*)GetDocShell())->GetInPlaceObject()->GetIPClient() )
            {
                ErrCode nErr = GetDocShell()->DoInPlaceActivate( FALSE );
                if ( nErr )
                    ErrorHandler::HandleError( nErr );
            }
            else if ( GetEditWin().IsChainMode() )
                GetEditWin().SetChainMode( FALSE );
//JP 10.06.99: warten auf SLOT von MBA
//          else if(Application::GetAppWindow()->IsFullScreenView())
//              GetViewFrame()->GetDispatcher()->Execute(SID_WIN_FULLSCREEN);
            break;
        case SID_ATTR_BORDER_INNER:
        case SID_ATTR_BORDER_OUTER:
        case SID_ATTR_BORDER_SHADOW:
            if(pArgs)
                pWrtShell->SetAttr(*pArgs);
            break;

        case SID_ATTR_PAGE:
        case SID_ATTR_PAGE_SIZE:
        case SID_ATTR_PAGE_MAXSIZE:
        case SID_ATTR_PAGE_PAPERBIN:
        case SID_ATTR_PAGE_EXT1:
        case FN_PARAM_FTN_INFO:
        {
            if(pArgs)
            {
                const USHORT nCurIdx = pWrtShell->GetCurPageDesc();
                SwPageDesc aPageDesc( pWrtShell->GetPageDesc( nCurIdx ) );
                ::ItemSetToPageDesc( *pArgs, aPageDesc,
                                    pWrtShell );
                // Den Descriptor der Core veraendern.
                pWrtShell->ChgPageDesc( nCurIdx, aPageDesc );
            }
        }
        break;
        case FN_NAVIGATION_PI_GOTO_PAGE:
        {
            SfxViewFrame* pVFrame = GetViewFrame();
            SfxChildWindow* pCh = pVFrame->GetChildWindow( SID_NAVIGATOR );
            if(!pCh)
            {
                pVFrame->ToggleChildWindow( SID_NAVIGATOR );
                pCh = pVFrame->GetChildWindow( SID_NAVIGATOR );

            }
                ((SwNavigationPI*) pCh->GetContextWindow(SW_MOD()))->GotoPage();
        }
        break;
        case  FN_EDIT_CURRENT_TOX:
        {
            GetViewFrame()->GetDispatcher()->Execute(
                                FN_INSERT_MULTI_TOX, SFX_CALLMODE_ASYNCHRON);
        }
        break;
        case FN_UPDATE_CUR_TOX:
        {
            const SwTOXBase* pBase = pWrtShell->GetCurTOX();
            if(pBase)
            {
                pWrtShell->StartAction();
                if(TOX_INDEX == pBase->GetType())
                    pWrtShell->ApplyAutoMark();
                pWrtShell->UpdateTableOf( *pBase );
                pWrtShell->EndAction();
            }
        }
        break;
        case FN_UPDATE_TOX:
        {
            pWrtShell->StartAction();
            pWrtShell->EnterStdMode();
            FASTBOOL bOldCrsrInReadOnly = pWrtShell->IsReadOnlyAvailable();
            pWrtShell->SetReadOnlyAvailable( TRUE );

            for( USHORT i = 0; i < 2; ++i )
            {
                USHORT nCount = pWrtShell->GetTOXCount();
                if( 1 == nCount )
                    ++i;

                while( pWrtShell->GotoPrevTOXBase() )
                    ;   // aufs erste Verzeichnis springen

                // falls wir nicht mehr in einem stehen, dann zum naechsten
                // springen.
                const SwTOXBase* pBase = pWrtShell->GetCurTOX();
                if( !pBase )
                {
                    pWrtShell->GotoNextTOXBase();
                    pBase = pWrtShell->GetCurTOX();
                }

                BOOL bAutoMarkApplied = FALSE;
                while( pBase )
                {
                    if(TOX_INDEX == pBase->GetType() && !bAutoMarkApplied)
                    {
                        pWrtShell->ApplyAutoMark();
                        bAutoMarkApplied = TRUE;
                    }
                    // JP 15.07.96: das pBase wird nur fuer die Schnittstelle
                    //              benoetigt. Muss mal umgetstellt werden!!!
                    pWrtShell->UpdateTableOf( *pBase );

                    if( pWrtShell->GotoNextTOXBase() )
                        pBase = pWrtShell->GetCurTOX();
                    else
                        pBase = 0;
                }
            }
            pWrtShell->SetReadOnlyAvailable( bOldCrsrInReadOnly );
            pWrtShell->EndAction();
        }
        break;
        case SID_ATTR_BRUSH:
        {
            if(pArgs && SFX_ITEM_SET == pArgs->GetItemState(RES_BACKGROUND, FALSE, &pItem))
            {
                const USHORT nCurIdx = pWrtShell->GetCurPageDesc();
                SwPageDesc aDesc( pWrtShell->GetPageDesc( nCurIdx ));
                SwFrmFmt& rMaster = aDesc.GetMaster();
                rMaster.SetAttr(*pItem);
                pWrtShell->ChgPageDesc( nCurIdx, aDesc);
            }
        }
        break;
        case SID_CLEARHISTORY:
        {
            pWrtShell->DelAllUndoObj();
        }
        break;
        case SID_UNDO:
        {
            pShell->ExecuteSlot(rReq);
        }
        break;
        case FN_INSERT_CTRL:
        case FN_INSERT_OBJ_CTRL:
        {
            if(pArgs && SFX_ITEM_SET == pArgs->GetItemState(nSlot, FALSE, &pItem))
            {
                USHORT nValue = ((SfxUInt16Item*)pItem)->GetValue();
                switch ( nSlot )
                {
                    case FN_INSERT_CTRL:
                    {
                        BOOL bWeb = 0 != PTR_CAST(SwWebView, this);
                        if(bWeb)
                            SwView::nWebInsertCtrlState = nValue;
                        else
                            SwView::nInsertCtrlState = nValue;
                    }
                    break;
                    case FN_INSERT_OBJ_CTRL:    SwView::nInsertObjectCtrlState = nValue  ;break;
                }

            }
            GetViewFrame()->GetBindings().Invalidate( nSlot );
        }
        break;
#if defined WIN || defined WNT || defined UNX
        case SID_TWAIN_SELECT:
        case SID_TWAIN_TRANSFER:
            GetViewImpl()->ExcuteScan(nSlot);
        break;
#endif

        case SID_ATTR_DEFTABSTOP:
        {
            if(pArgs && SFX_ITEM_SET == pArgs->GetItemState(SID_ATTR_DEFTABSTOP, FALSE, &pItem))
            {
                SvxTabStopItem aDefTabs( 0, 0 );
                USHORT nTab = ((const SfxUInt16Item*)pItem)->GetValue();
                MakeDefTabs( nTab, aDefTabs );
                pWrtShell->SetDefault( aDefTabs );
            }
        }
        break;
        case SID_ATTR_LANGUAGE:
        {
            if(pArgs && SFX_ITEM_SET == pArgs->GetItemState(SID_ATTR_LANGUAGE, FALSE, &pItem))
            {
                SvxLanguageItem aLang(((SvxLanguageItem*)pItem)->GetLanguage(), RES_CHRATR_LANGUAGE);
                pWrtShell->SetDefault( aLang );
            }
        }
        break;
        case FN_INSERT_HEADER:
            pWrtShell->SetHeadInBrowse(!pWrtShell->IsHeadInBrowse());
            break;
        case FN_INSERT_FOOTER:
            pWrtShell->SetFootInBrowse(!pWrtShell->IsFootInBrowse());
            break;
        case FN_SCROLL_NEXT_PREV:
            if(pArgs && pArgs->GetItemState(FN_SCROLL_NEXT_PREV, FALSE, &pItem))
            {
                // hier sollen nur die Handler der PageUp/DownButtons gerufen werden
                BOOL bNext = ((const SfxBoolItem*)pItem)->GetValue();
                MoveNavigation(bNext);
            }
            break;
        case SID_JUMPTOMARK:
            if( pArgs && SFX_ITEM_SET == pArgs->GetItemState(SID_JUMPTOMARK, FALSE, &pItem))
                JumpToSwMark( (( const SfxStringItem*)pItem)->GetValue() );
            break;
        default:
            ASSERT(!this, falscher Dispatcher);
            return;
    }
}

/*--------------------------------------------------------------------
    Beschreibung:   SeitenNr-Feld invalidieren
 --------------------------------------------------------------------*/

void SwView::UpdatePageNums(USHORT nPhyNum, USHORT nVirtNum, const String& rPgStr)
{
    String sTemp(GetPageStr( nPhyNum, nVirtNum, rPgStr ));
    if ( sLstPg != sTemp )
    {
        sLstPg = sTemp;
        const SfxStringItem aTmp( FN_STAT_PAGE,
                                 sLstPg);
        SfxBindings &rBnd = GetViewFrame()->GetBindings();
        rBnd.SetState( aTmp );
        rBnd.Update( FN_STAT_PAGE );
    }
}

/*--------------------------------------------------------------------
    Beschreibung:   Status der Stauszeile
 --------------------------------------------------------------------*/


void SwView::StateStatusLine(SfxItemSet &rSet)
{
    SwWrtShell& rShell = GetWrtShell();

    SfxWhichIter aIter( rSet );
    USHORT nWhich = aIter.FirstWhich();
    ASSERT( nWhich, "leeres Set");

    while( nWhich )
    {
        switch( nWhich )
        {
            case FN_STAT_PAGE:
/*
//JP 07.01.00: is a nice feature - show the selektion of DrawObjects
            if( rShell.IsObjSelected()
//???               || rShell.IsFrmSelected()
                )
            {
                String sDisplay( rShell.GetDrawView()->GetMarkList().
                                    GetMarkDescription() );
                rSet.Put( SfxStringItem( FN_STAT_PAGE, sDisplay ));
            }
            else
*/          {
                // Anzahl der Seiten, log. SeitenNr. SeitenNr ermitteln
                USHORT nPage, nLogPage;
                String sDisplay;
                rShell.GetPageNumber( -1, rShell.IsCrsrVisible(), nPage, nLogPage, sDisplay );
                rSet.Put( SfxStringItem( FN_STAT_PAGE,
                            GetPageStr( nPage, nLogPage, sDisplay) ));

                USHORT nCnt = GetWrtShell().GetPageCnt();
                if (nPageCnt != nCnt)   // Basic benachrichtigen
                {
                    nPageCnt = nCnt;
                    SFX_APP()->NotifyEvent(SfxEventHint(SW_EVENT_PAGE_COUNT, GetViewFrame()->GetObjectShell()), FALSE);
                }
            }
            break;
            case FN_STAT_TEMPLATE:
            {
                rSet.Put(SfxStringItem( FN_STAT_TEMPLATE,
                                        rShell.GetCurPageStyle(FALSE)));

            }
            break;
            case SID_ATTR_ZOOM:
            {
                if ( GetDocShell()->GetCreateMode() != SFX_CREATE_MODE_EMBEDDED )
                {
                    const SwViewOption* pVOpt = rShell.GetViewOptions();
                    SvxZoomType eZoom = (SvxZoomType) pVOpt->GetZoomType();
                    SvxZoomItem aZoom(eZoom,
                                        pVOpt->GetZoom());
                    if(pWrtShell->IsBrowseMode())
                    {
                        aZoom.SetValueSet(
                                SVX_ZOOM_ENABLE_50|
                                SVX_ZOOM_ENABLE_75|
                                SVX_ZOOM_ENABLE_100|
                                SVX_ZOOM_ENABLE_150|
                                SVX_ZOOM_ENABLE_200);
                    }
                    rSet.Put( aZoom );
                }
                else
                    rSet.DisableItem( SID_ATTR_ZOOM );
            }
            break;
            case SID_ATTR_POSITION:
            case SID_ATTR_SIZE:
            {
                if( !rShell.IsFrmSelected() && !rShell.IsObjSelected() )
                    SwBaseShell::_SetFrmMode( FLY_DRAG_END );
                else
                {
                    USHORT nFrameMode = SwBaseShell::GetFrmMode();
                    if ( nFrameMode == FLY_DRAG_START || nFrameMode == FLY_DRAG )
                    {
                        if ( nWhich == SID_ATTR_POSITION )
                            rSet.Put( SfxPointItem( SID_ATTR_POSITION,
                                                    rShell.GetAnchorObjDiff()));
                        else
                            rSet.Put( SvxSizeItem( SID_ATTR_SIZE,
                                                   rShell.GetObjSize()));
                    }
                }
            }
            break;
            case SID_TABLE_CELL:

            if( rShell.IsFrmSelected() || rShell.IsObjSelected() )
            {
                rSet.Put( SvxSizeItem( SID_TABLE_CELL, rShell.GetObjSize()));
            }
            else
            {
                String sStr;
                if( rShell.IsCrsrInTbl() )
                    sStr = rShell.GetBoxNms();
                else
                {
                    const SwSection* pCurrSect = rShell.GetCurrSection();
                    if( pCurrSect )
                    {
                        switch( pCurrSect->GetType() )
                        {
                        case TOX_HEADER_SECTION:
                        case TOX_CONTENT_SECTION:
                            {
                                const SwTOXBase* pTOX = pWrtShell->GetCurTOX();
                                if( pTOX )
                                    sStr = pTOX->GetTOXName();
                                else
                                {
                                    ASSERT( !this,
                                        "was ist das fuer ein Verzeichnis?" );
                                    sStr = pCurrSect->GetName();
                                }
                            }
                            break;
                        default:
                            sStr = pCurrSect->GetName();
                            break;
                        }
                    }
                }
                const SwNumRule* pNumRule = rShell.GetCurNumRule();
                if (pNumRule)   // Cursor in Numerierung
                {
                    BYTE nNumLevel = rShell.GetNumLevel();
                    if( NO_NUM > nNumLevel && MAXLEVEL >
                        ( nNumLevel = GetRealLevel( nNumLevel )) )
                    {
                        if( sStr.Len() )
                            sStr.AppendAscii(sStatusDelim);
                        sStr += SW_RESSTR(STR_NUM_LEVEL);
                        sStr += String::CreateFromInt32( nNumLevel + 1 );
                        if(!pNumRule->IsAutoRule())
                        {
                            SfxItemSet aSet(GetPool(),
                                    RES_PARATR_NUMRULE, RES_PARATR_NUMRULE);
                            rShell.GetAttr(aSet);
                            const SfxPoolItem* pItem;
                            if(SFX_ITEM_AVAILABLE <=
                                aSet.GetItemState(RES_PARATR_NUMRULE, TRUE, &pItem))
                            {
                                const String& rNumStyle =
                                    ((const SfxStringItem*)pItem)->GetValue();
                                if(rNumStyle.Len())
                                {
                                    sStr.AppendAscii(sStatusDelim);
                                    sStr += rNumStyle;
                                }
                            }
                        }
                    }
                }

                if( rShell.HasReadonlySel() )
                {
                    if( sStr.Len() )
                        sStr.InsertAscii( sStatusDelim, 0 );
                    sStr.Insert( SW_RESSTR( STR_READONLY_SEL ), 0 );
                }
                if( sStr.Len() )
                    rSet.Put( SfxStringItem( SID_TABLE_CELL, sStr ));
            }
            break;
            case FN_STAT_SELMODE:
            {
                if(rShell.IsStdMode())
                    rSet.Put(SfxUInt16Item(FN_STAT_SELMODE, 0));
                else if(rShell.IsAddMode())
                    rSet.Put(SfxUInt16Item(FN_STAT_SELMODE, 2));
                else
                    rSet.Put(SfxUInt16Item(FN_STAT_SELMODE, 1));
                break;
            }
            case SID_ATTR_INSERT:
                if( rShell.IsRedlineOn() )
                    rSet.DisableItem( nWhich );
                else
                {
                    rSet.Put(SfxBoolItem(SID_ATTR_INSERT,rShell.IsInsMode()));
                }
                break;
            case FN_STAT_HYPERLINKS:
            {
                rSet.Put(SfxBoolItem(FN_STAT_HYPERLINKS,
                            pWrtShell->GetViewOptions()->IsExecHyperlinks()));
            }
            break;
        }
        nWhich = aIter.NextWhich();
    }
}

/*--------------------------------------------------------------------
    Beschreibung:   Execute fuer die Stauszeile
 --------------------------------------------------------------------*/


void SwView::ExecuteStatusLine(SfxRequest &rReq)
{
    SwWrtShell &rSh = GetWrtShell();
    const SfxItemSet* pArgs = rReq.GetArgs();
    const SfxPoolItem* pItem;
    BOOL bUp = FALSE;
    USHORT nWhich = rReq.GetSlot();
    switch( nWhich )
    {
        case FN_STAT_PAGE:
        {
            GetViewFrame()->GetDispatcher()->Execute( SID_NAVIGATOR,
                                      SFX_CALLMODE_SYNCHRON|SFX_CALLMODE_RECORD );
        }
        break;

        case FN_STAT_BOOKMARK:
        if ( pArgs )
        {
            if (SFX_ITEM_SET == pArgs->GetItemState( nWhich, TRUE, &pItem))
            {
                USHORT nDest;
                nDest = ((const SfxUInt16Item *)pItem)->GetValue();
                rSh.EnterStdMode();
                rSh.GotoBookmark( nDest );
            }
        }
        break;

        case FN_STAT_TEMPLATE:
        {
            GetViewFrame()->GetDispatcher()->Execute(FN_FORMAT_PAGE_DLG,
                                        SFX_CALLMODE_SYNCHRON|SFX_CALLMODE_RECORD );
        }
        break;
        case SID_ATTR_ZOOM:
        {
            if ( GetDocShell()->GetCreateMode() != SFX_CREATE_MODE_EMBEDDED )
            {
                const SfxItemSet *pSet = 0;
                SvxZoomDialog *pDlg = 0;
                if ( pArgs )
                    pSet = pArgs;
                else if ( GetDocShell()->GetCreateMode() != SFX_CREATE_MODE_EMBEDDED )
                {
                    SfxItemSet aCoreSet(pShell->GetPool(), SID_ATTR_ZOOM, SID_ATTR_ZOOM);
                    SvxZoomItem aZoom( (SvxZoomType)rSh.GetViewOptions()->GetZoomType(),
                                                rSh.GetViewOptions()->GetZoom() );

                    if(rSh.IsBrowseMode())
                    {
                        aZoom.SetValueSet(
                                SVX_ZOOM_ENABLE_50|
                                SVX_ZOOM_ENABLE_75|
                                SVX_ZOOM_ENABLE_100|
                                SVX_ZOOM_ENABLE_150|
                                SVX_ZOOM_ENABLE_200);
                    }
                    aCoreSet.Put( aZoom );

                    pDlg = new SvxZoomDialog( &GetViewFrame()->GetWindow(), aCoreSet );
                    pDlg->SetLimits( MINZOOM, MAXZOOM );

                    if( pDlg->Execute() != RET_CANCEL )
                        pSet = pDlg->GetOutputItemSet();
                }

                if ( pSet && SFX_ITEM_SET == pSet->GetItemState(SID_ATTR_ZOOM, TRUE, &pItem))
                {
                    enum SvxZoomType eType = ((const SvxZoomItem *)pItem)->GetType();
                    SetZoom( eType, ((const SvxZoomItem *)pItem)->GetValue() );
                }
                delete pDlg;
                bUp = TRUE;
            }
        }
        break;

        case SID_ATTR_SIZE:
        {
            ULONG nId = FN_INSERT_FIELD;
            if( rSh.IsCrsrInTbl() )
                nId = FN_FORMAT_TABLE_DLG;
            else if( rSh.GetCurTOX() )
                nId = FN_INSERT_MULTI_TOX;
            else if( rSh.GetCurrSection() )
                nId = FN_EDIT_REGION;
            else
            {
                const SwNumRule* pNumRule = rSh.GetCurNumRule();
                if( pNumRule )  // Cursor in Numerierung
                {
                    if( pNumRule->IsAutoRule() )
                        nId = FN_NUMBER_BULLETS;
                    else
                    {
                        // Dialog vom Gestalter starten ;-)
                        nId = 0;
                    }
                }
                else if( rSh.IsFrmSelected() )
                    nId = FN_FORMAT_FRAME_DLG;
                else if( rSh.IsObjSelected() )
                    nId = SID_ATTR_TRANSFORM;
            }
            if( nId )
                GetViewFrame()->GetDispatcher()->Execute( nId, SFX_CALLMODE_SYNCHRON |
                                               SFX_CALLMODE_RECORD );
        }
        break;

        case FN_STAT_SELMODE:
        {
            if ( pArgs )
            {
                if (SFX_ITEM_SET == pArgs->GetItemState( nWhich, TRUE, &pItem))
                {
                    switch ( ((const SfxUInt16Item *)pItem)->GetValue() )
                    {
                        case 0: rSh.EnterStdMode(); break;
                        case 1: rSh.EnterExtMode(); break;
                        case 2: rSh.EnterAddMode(); break;
                    }
                }
            }
            else
            {

                if( !rSh.IsAddMode() && !rSh.IsExtMode() )
                    rSh.ToggleExtMode();
                else if ( rSh.IsExtMode() )
                {
                    rSh.ToggleExtMode();
                    rSh.ToggleAddMode();
                }
                else if ( rSh.IsAddMode() )
                    rSh.ToggleAddMode();
            }
            bUp = TRUE;
            break;
        }
        case FN_SET_ADD_MODE:
            rSh.ToggleAddMode();
            nWhich = FN_STAT_SELMODE;
            bUp = TRUE;
        break;
        case FN_SET_EXT_MODE:
            rSh.ToggleExtMode();
            nWhich = FN_STAT_SELMODE;
            bUp = TRUE;
        break;
        case SID_ATTR_INSERT:
            rSh.ToggleInsMode();
            bUp = TRUE;
        break;

        case FN_STAT_HYPERLINKS:
        {
            SwViewOption aOpt( *rSh.GetViewOptions() );
            BOOL bIs = aOpt.IsExecHyperlinks();
            BOOL bSet;
            if(pArgs && SFX_ITEM_SET == pArgs->GetItemState(nWhich, FALSE, &pItem))
                bSet = ((const SfxBoolItem*)pItem)->GetValue();
            else
                bSet = !bIs;
            if(bIs != bSet)
            {
                aOpt.SetExecHyperlinks(bSet);
                SW_MOD()->ApplyUsrPref(aOpt, this);
                bUp = TRUE;
            }
        }
        break;
    }
    if ( bUp )
    {
        SfxBindings &rBnd = GetViewFrame()->GetBindings();
        rBnd.Invalidate(nWhich);
        rBnd.Update(nWhich);
    }
}




void SwView::InsFrmMode(USHORT nCols)
{
    if ( pWrtShell->HasWholeTabSelection() )
    {
        SwFlyFrmAttrMgr aMgr( TRUE, pWrtShell, FRMMGR_TYPE_TEXT );

        const SwFrmFmt &rPageFmt =
                pWrtShell->GetPageDesc(pWrtShell->GetCurPageDesc()).GetMaster();
        SwTwips lWidth = rPageFmt.GetFrmSize().GetWidth();
        const SvxLRSpaceItem &rLR = rPageFmt.GetLRSpace();
        lWidth -= rLR.GetLeft() + rLR.GetRight();
        aMgr.SetSize(Size(lWidth, aMgr.GetSize().Height()));
        if(nCols > 1)
        {
            SwFmtCol aCol;
            aCol.Init( nCols, aCol.GetGutterWidth(), aCol.GetWishWidth() );
            aMgr.SetCol( aCol );
        }
        aMgr.InsertFlyFrm();
    }
    else
        GetEditWin().InsFrm(nCols);
}

/*--------------------------------------------------------------------
    Beschreibung:   Links bearbeiten
 --------------------------------------------------------------------*/

void SwView::EditLinkDlg()
{
    BOOL bWeb = 0 != PTR_CAST(SwWebView, this);
    SvBaseLinksDialog aSvBaseLinksDialog( &GetViewFrame()->GetWindow(), &GetWrtShell().GetLinkManager()
#if SUPD>355
,bWeb
#endif
     );
    aSvBaseLinksDialog.Execute();
/*
    SwLinkDlg* pDlg = new SwLinkDlg(GetFrameWindow());
    pDlg->SetShell(&GetWrtShell());
    pDlg->Execute();

    DELETEZ(pDlg);
*/
}

BOOL SwView::JumpToSwMark( const String& rMark )
{
    BOOL bRet = FALSE;
    if( rMark.Len() )
    {
        // wir wollen den Bookmark aber am oberen Rand haben
        BOOL bSaveCC = IsCrsrAtCenter();
        BOOL bSaveCT = IsCrsrAtTop();
        SetCrsrAtTop( TRUE );

        //JP 27.04.98: Bug 49786
        // Damit in FrameSet auch gescrollt werden kann, muss die
        // entsprechende Shell auch das Focus-Flag gesetzt haben!
        BOOL bHasShFocus = pWrtShell->HasShFcs();
        if( !bHasShFocus )
            pWrtShell->ShGetFcs( FALSE );

        const SwFmtINetFmt* pINet;
        String sCmp, sMark( INetURLObject::decode( rMark, INET_HEX_ESCAPE,
                                           INetURLObject::DECODE_WITH_CHARSET,
                                        RTL_TEXTENCODING_UTF8 ));

        xub_StrLen nLastPos, nPos = sMark.Search( cMarkSeperator );
        if( STRING_NOTFOUND != nPos )
            while( STRING_NOTFOUND != ( nLastPos =
                sMark.Search( cMarkSeperator, nPos + 1 )) )
                nPos = nLastPos;

        if( STRING_NOTFOUND != nPos &&
            ( sCmp = sMark.Copy( nPos + 1 ) ).EraseAllChars().Len() )
        {
            String sName( sMark.Copy( 0, nPos ) );
            sCmp.ToLowerAscii();
            FlyCntType eFlyType = FLYCNTTYPE_ALL;

            if( COMPARE_EQUAL == sCmp.CompareToAscii( pMarkToRegion ) )
            {
                pWrtShell->EnterStdMode();
                bRet = pWrtShell->GotoRegion( sName );
            }
            else if( COMPARE_EQUAL == sCmp.CompareToAscii( pMarkToOutline ) )
            {
                pWrtShell->EnterStdMode();
                bRet = pWrtShell->GotoOutline( sName );
            }
            else if( COMPARE_EQUAL == sCmp.CompareToAscii( pMarkToFrame ) )
                eFlyType = FLYCNTTYPE_FRM;
            else if( COMPARE_EQUAL == sCmp.CompareToAscii( pMarkToGraphic ) )
                eFlyType = FLYCNTTYPE_GRF;
            else if( COMPARE_EQUAL == sCmp.CompareToAscii( pMarkToOLE ) )
                eFlyType = FLYCNTTYPE_OLE;
            else if( COMPARE_EQUAL == sCmp.CompareToAscii( pMarkToTable ) )
            {
                pWrtShell->EnterStdMode();
                bRet = pWrtShell->GotoTable( sName );
            }
            else if( COMPARE_EQUAL == sCmp.CompareToAscii( pMarkToText ) )
            {
                // Normale Textsuche
                pWrtShell->EnterStdMode();
                SearchParam aParam( sName, SearchParam::SRCH_NORMAL,
                                    TRUE, FALSE, FALSE );

                if( pWrtShell->SearchPattern( aParam, DOCPOS_START, DOCPOS_END ))
                {
                    pWrtShell->EnterStdMode();      // Selektion wieder aufheben
                    bRet = TRUE;
                }
            }
            else if( USHRT_MAX != ( nPos = pWrtShell->FindBookmark( sMark ) ))
                pWrtShell->GotoBookmark( nPos, FALSE, TRUE ), bRet = TRUE;
            else if( 0 != ( pINet = pWrtShell->FindINetAttr( sMark ) ))
                bRet = pWrtShell->GotoINetAttr( *pINet->GetTxtINetFmt() );

            // fuer alle Arten von Flys
            if( FLYCNTTYPE_ALL != eFlyType && pWrtShell->GotoFly( sName, eFlyType ))
            {
                bRet = TRUE;
                if( FLYCNTTYPE_FRM == eFlyType )
                {
                    // TextFrames: Cursor in den Frame setzen
                    pWrtShell->UnSelectFrm();
                    pWrtShell->LeaveSelFrmMode();
                }
                else
                {
                    pWrtShell->HideCrsr();
                    pWrtShell->EnterSelFrmMode();
                }
            }
        }
        else if( USHRT_MAX != ( nPos = pWrtShell->FindBookmark( sMark ) ))
            pWrtShell->GotoBookmark( nPos, FALSE, TRUE ), bRet = TRUE;
        else if( 0 != ( pINet = pWrtShell->FindINetAttr( sMark ) ))
            bRet = pWrtShell->GotoINetAttr( *pINet->GetTxtINetFmt() );

        // ViewStatus wieder zurueck setzen
        SetCrsrAtTop( bSaveCT, bSaveCC );

        if( !bHasShFocus )
            pWrtShell->ShLooseFcs();
    }
    return bRet;
}

/*--------------------------------------------------------------------
    Beschreibung:   Links bearbeiten
 --------------------------------------------------------------------*/

long SwView::InsertDoc( USHORT nSlotId, const String& rFileName,
                        const String& rFilterName, INT16 nVersion )
{
    BOOL bInsert = FALSE, bCompare = FALSE, bMerge = FALSE;
    long nFound = 0;

    switch( nSlotId )
    {
        case SID_DOCUMENT_MERGE:        bMerge = TRUE;      break;
        case SID_DOCUMENT_COMPARE:      bCompare = TRUE;    break;
        case SID_INSERTDOC:             bInsert = TRUE;     break;

        default:
            ASSERT( !this, "Unbekannte SlotId!" );
            bInsert = TRUE;
            nSlotId = SID_INSERTDOC;
            break;
    }

    SfxMedium* pMed = 0;
    SwDocShell* pDocSh = GetDocShell();
    if( rFileName.Len() )
    {
        const SfxFilter* pFilter = 0;

        SfxObjectFactory& rFact = pDocSh->GetFactory();
        const USHORT nCount = rFact.GetFilterCount();
        for( USHORT i = 0; i < nCount; i++ )
        {
            const SfxFilter* pFlt = rFact.GetFilter( i );
            if( pFlt->GetName() == rFilterName ||
                pFlt->GetFilterName() == rFilterName )
            {
                pFilter = pFlt;
                break;
            }
        }
        if ( !pFilter )
        {
            pMed = new SfxMedium(rFileName, STREAM_READ, TRUE, TRUE, 0, 0 );
            SfxFilterMatcher aMatcher( rFact.GetFilterContainer() );
            ErrCode nErr = aMatcher.GuessFilter( *pMed, &pFilter, FALSE );
            if ( nErr )
                DELETEZ(pMed);
            else
                pMed->SetFilter( pFilter );
        }
        else
            pMed = new SfxMedium(rFileName, STREAM_READ, TRUE, TRUE, pFilter, 0);
    }
    else
    {
        pMed = SFX_APP()->InsertDocumentDialog(0, pDocSh->GetFactory());
    }
    if( !pMed )
        return -1;

    if( bInsert )
    {
        SfxObjectShellRef aRef( pDocSh );

        pDocSh->RegisterTransfer( *pMed );
        pMed->DownLoad();   // ggfs. den DownLoad anstossen
        if( aRef.Is() && 1 < aRef->GetRefCount() )  // noch gueltige Ref?
        {
            SwReader* pRdr;
            Reader *pRead = pDocSh->StartConvertFrom( *pMed, &pRdr, pWrtShell );
            if( pRead )
            {
                String sTmpBaseURL( INetURLObject::GetBaseURL() );
                INetURLObject::SetBaseURL( pMed->GetName() );

                ULONG nErrno;
                {   //Scope for SwWait-Object, to be able to execute slots
                    //outside this scope.
                    SwWait aWait( *GetDocShell(), TRUE );
                    pWrtShell->StartAllAction();
                    if ( pWrtShell->HasSelection() )
                        pWrtShell->DelRight();      // Selektionen loeschen
                    nErrno = pRdr->Read( *pRead );  // und Dokument einfuegen
                    delete pRdr;

                    INetURLObject::SetBaseURL( sTmpBaseURL );
                }

                // ggfs. alle Verzeichnisse updaten:
                if( pWrtShell->IsUpdateTOX() )
                {
                    SfxRequest aReq( FN_UPDATE_TOX, SFX_CALLMODE_SLOT, GetPool() );
                    Execute( aReq );
                    pWrtShell->SetUpdateTOX( FALSE );       // wieder zurueck setzen
                }

                pWrtShell->EndAllAction();
                if( nErrno )
                {
                    ErrorHandler::HandleError( nErrno );
                    nFound = IsError( nErrno ) ? -1 : 0;
                }
                else
                    nFound = 0;
            }
        }
    }
    else
    {
        SfxObjectShellRef xDocSh;

extern int lcl_FindDocShell( SfxObjectShellRef& xDocSh,
                            const String& rFileName, const String& rPasswd,
                            String& rFilter, INT16 nVersion,
                            SwDocShell* pDestSh );

        String sFltNm;
        int nRet = lcl_FindDocShell( xDocSh, pMed->GetName(), aEmptyStr,
                                    sFltNm, nVersion, pDocSh );
        if( nRet )
        {
            SwWait aWait( *GetDocShell(), TRUE );
            pWrtShell->StartAllAction();

            pWrtShell->EnterStdMode();          // Selektionen loeschen

            if( bCompare )
                nFound = pWrtShell->CompareDoc( *((SwDocShell*)&xDocSh)->GetDoc() );
            else
                nFound = pWrtShell->MergeDoc( *((SwDocShell*)&xDocSh)->GetDoc() );

            pWrtShell->EndAllAction();

            if (!bCompare && !nFound)
            {
                Window* pWindow = &GetEditWin();
                InfoBox(pWindow, SW_RES(MSG_NO_MERGE_ENTRY)).Execute();
            }
        }
        if( 2 == nRet && xDocSh.Is() )
            xDocSh->DoClose();
    }

    delete pMed;
    return nFound;
}


/*------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.197  2000/09/18 16:06:13  willem.vandorp
    OpenOffice header added.

    Revision 1.196  2000/09/08 08:12:54  os
    Change: Set/Toggle/Has/Knows/Show/GetChildWindow

    Revision 1.195  2000/09/07 15:59:32  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.194  2000/08/17 13:47:26  jp
    JumpToMark: handle decoded URLs

    Revision 1.193  2000/07/07 13:25:05  jp
    must changes VCL

    Revision 1.192  2000/05/29 08:03:23  os
    new scanner interface

    Revision 1.191  2000/05/26 07:21:34  os
    old SW Basic API Slots removed

    Revision 1.190  2000/05/19 11:01:38  jp
    Changes for Unicode

    Revision 1.189  2000/05/10 11:53:20  os
    Basic API removed

    Revision 1.188  2000/04/18 15:02:51  os
    UNICODE

    Revision 1.187  2000/03/30 13:20:30  jp
    Bug #74614#: StateStatusline - take the real numLevel

    Revision 1.186  2000/03/14 13:45:51  jp
    GetAppWindow() - misuse as parent window eliminated

    Revision 1.185  2000/02/21 12:11:45  os
    #73248# Recording of FN_EDIT_CUR_INDEX corrected

    Revision 1.184  2000/02/11 14:59:23  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.183  2000/02/02 17:00:58  jp
    Task #72579#: interface of SwReader is changed

    Revision 1.182  2000/01/07 18:15:50  jp
    Bug #71654#: StateStatusLine - set at frame- or object selection the pos and size

    Revision 1.181  1999/12/23 14:18:06  jp
    Bug #71286#: UpdateAllTOX - cursor must jump into readonly sections

    Revision 1.180  1999/10/18 11:15:56  jp
    SID_TABLE_CELL: if Frame or SdrObject selected, then dont return a string

    Revision 1.179  1999/10/18 09:41:51  jp
    ExecuteStatusLine: SID_ATTR_POS is dependent on content

    Revision 1.178  1999/10/15 15:58:00  jp
    StateStatusLine: if in tox then show the name

    Revision 1.177  1999/09/29 07:07:50  mh
    chg: header

    Revision 1.176  1999/08/26 13:48:46  OS
    apply AutoMark file at TOX update


      Rev 1.175   26 Aug 1999 15:48:46   OS
   apply AutoMark file at TOX update

      Rev 1.174   25 Aug 1999 15:26:22   OS
   extended indexes: remove old code

      Rev 1.173   08 Jul 1999 18:45:22   MA
   Use internal object to toggle wait cursor

      Rev 1.172   10 Jun 1999 10:52:32   JP
   have to change: no AppWin from SfxApp

      Rev 1.171   09 Jun 1999 13:19:38   OS
   #66578# new slot: FN_EDIT_CURENT_TOX

      Rev 1.170   27 May 1999 13:05:52   OS
   Einf?gen/Bearbeiten von Spalten ueberarbeitet

      Rev 1.169   23 Apr 1999 13:50:10   MA
   include fuer Update

      Rev 1.168   21 Apr 1999 16:12:44   MA
   #65085# irgendwann sollte auch das verschieben mal abgebrochen werden.

      Rev 1.167   16 Mar 1999 15:25:26   JP
   Bug #59840#: JumpToMark - bei Bookmarks keine Selection

      Rev 1.166   22 Jan 1999 16:55:50   JP
   Bug Task #58677#: Crsr in Readonly Bereichen zulassen

      Rev 1.165   18 Nov 1998 12:57:52   OM
   #58385# DrawView ueber Slot anziehen

      Rev 1.164   26 Oct 1998 17:29:10   JP
   Bug #54342#: Section merkt sich das Passwort der Datei

      Rev 1.163   18 Sep 1998 11:39:58   OS
   #52654# PageUp/Down return ueber VisArea ermitteln

      Rev 1.162   18 Sep 1998 09:40:40   OS
   52654# XScreenCursor - FN_PAGEUP/DOWN mit Bool-return

      Rev 1.161   12 Aug 1998 18:22:16   HR
   #54781#: GCC braucht Temporary

      Rev 1.160   25 Jul 1998 11:57:02   OS
   Status der Abreisscontroller sofort invalidieren #51812#

      Rev 1.159   14 Jul 1998 10:43:42   OM
   #52748# Twain-Menueeintrag

      Rev 1.158   01 Jul 1998 12:54:52   JP
   InsertDoc: Flag bQuiet mit int nVersion ersetzt, FN_DOCUMENT-Ids entfernt, werden vom SFX geliefert

      Rev 1.157   28 Jun 1998 12:48:48   MA
   Mail_Scrollbody

      Rev 1.156   09 Jun 1998 15:32:20   OM
   VC-Controls entfernt

      Rev 1.155   27 Apr 1998 10:59:46   JP
   Bug #49786#: FocusFlag hinausreichen

      Rev 1.154   07 Apr 1998 15:58:50   OM
   #49333# Page-Event asynchron callen

      Rev 1.153   27 Mar 1998 14:15:18   OM
   ChildWindows im Modified-Hdl updaten

      Rev 1.152   15 Mar 1998 15:14:10   OM
   Synchron-Button

      Rev 1.151   12 Mar 1998 13:00:38   OS
   SID_NEWWINDOW nicht mehr ueberladen

      Rev 1.150   04 Mar 1998 14:14:02   OM
   Dokument Merge/Compare

      Rev 1.149   27 Feb 1998 18:25:16   OM
   Redline-Browser

      Rev 1.148   26 Feb 1998 11:52:56   OM
   Redline accept/reject

      Rev 1.147   24 Feb 1998 15:29:10   JP
   Search..: SWPOSDOC entfernt, auf enums umgestellt

      Rev 1.146   19 Feb 1998 17:37:50   JP
   compiler error

      Rev 1.145   19 Feb 1998 09:35:06   JP
   RedlineMode darf nur im InsertMode einschaltbar sein

      Rev 1.144   18 Feb 1998 18:57:26   OM
   Zeilennumerierung

      Rev 1.143   18 Feb 1998 15:02:44   JP
   Status erfragen/setzen fuer Redlines anzeigen korrigiert

      Rev 1.142   12 Feb 1998 16:47:22   OM
   Basic-Event fuer Seitenzahlaenderung

      Rev 1.141   11 Feb 1998 10:45:58   OS
   IsFullScreenMode gegen IsFullScreeView getsauscht, ChainMode vor Fullscreen #47232#

      Rev 1.140   03 Feb 1998 15:28:22   OM
   Redlining

      Rev 1.139   23 Jan 1998 16:04:16   MA
   includes

      Rev 1.138   23 Jan 1998 15:23:38   MA
   include

      Rev 1.137   19 Jan 1998 11:48:34   MBA
   MDIFrame durch TopViewFrame ersetzt

      Rev 1.136   06 Jan 1998 07:28:40   OS
   getrennter Status fuer Insert-Controller #46322#

      Rev 1.135   04 Dec 1997 17:01:18   OS
   Numerierungsvorlage in der Statuszeile anzeigen

      Rev 1.134   29 Nov 1997 16:48:08   MA
   includes

      Rev 1.133   28 Nov 1997 11:32:12   TJ
   include

      Rev 1.132   21 Nov 1997 15:00:16   MA
   includes

      Rev 1.131   17 Nov 1997 10:21:24   JP
   Umstellung Numerierung

      Rev 1.130   05 Nov 1997 11:52:08   MA
   chain

      Rev 1.129   03 Nov 1997 13:58:32   MA
   precomp entfernt

      Rev 1.128   07 Oct 1997 15:16:12   AMA
   Fix #44419#: Neuformatierung wird in ViewShell::ApplyViewOptions ausgeloest

      Rev 1.127   25 Sep 1997 15:20:34   OS
   nicht BtnPage, sondern MoveNavigation aufrufen! #44223#

      Rev 1.126   17 Sep 1997 12:35:08   JP
   neu: JumpToSwMark - ist der Code aus dem JUMPTOMARK

      Rev 1.125   04 Sep 1997 17:14:46   MA
   includes

      Rev 1.124   01 Sep 1997 13:25:54   OS
   DLL-Umstellung

      Rev 1.123   15 Aug 1997 11:47:58   OS
   chartar/frmatr/txtatr aufgeteilt

      Rev 1.122   11 Aug 1997 10:21:16   OS
   paraitem/frmitems/textitem aufgeteilt

      Rev 1.121   31 Jul 1997 14:59:48   MH
   chg: header

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/uiview/viewcoll.cxx b/sw/source/ui/uiview/viewcoll.cxx
new file mode 100644
index 0000000..cff8ff7
--- /dev/null
+++ b/sw/source/ui/uiview/viewcoll.cxx
@@ -0,0 +1,249 @@
/*************************************************************************
 *
 *  $RCSfile: viewcoll.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:49 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "cmdid.h"
#include "uiitems.hxx"

#ifndef _LIST_HXX //autogen
#include <tools/list.hxx>
#endif

#ifndef _SV_WINDOW_HXX //autogen
#include <vcl/window.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SFXVIEWFRM_HXX //autogen
#include <sfx2/viewfrm.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _RSCSFX_HXX //autogen
#include <rsc/rscsfx.hxx>
#endif


#include "errhdl.hxx"
#include "view.hxx"
#include "wrtsh.hxx"
#include "basesh.hxx"


void SwView::ExecColl(SfxRequest &rReq)
{
    Window *pMDI = &GetViewFrame()->GetWindow();
    const SfxItemSet* pArgs = rReq.GetArgs();
    const SfxPoolItem* pItem = 0;
    USHORT nWhich = rReq.GetSlot();
    switch( nWhich )
    {
        case FN_SET_PAGE:
        {
            DBG_ASSERT(!this, "Not implemented")
        }
        break;
        case FN_SET_PAGE_STYLE:
        {
            if( pArgs )
            {
                if (pArgs &&
                    SFX_ITEM_SET == pArgs->GetItemState( nWhich , TRUE, &pItem ))
                {
                    if( ((SfxStringItem*)pItem)->GetValue() !=
                                            GetWrtShell().GetCurPageStyle(FALSE) )
                    {
                        SfxStringItem aName(SID_STYLE_APPLY,
                                   ((SfxStringItem*)pItem)->GetValue());
                        SfxUInt16Item aFamItem( SID_STYLE_FAMILY,
                                            SFX_STYLE_FAMILY_PAGE);
                        SwPtrItem aShell(FN_PARAM_WRTSHELL, GetWrtShellPtr());
                        SfxRequest aReq(SID_STYLE_APPLY, 0, GetPool());
                        aReq.AppendItem(aName);
                        aReq.AppendItem(aFamItem);
                        aReq.AppendItem(aShell);
                        GetCurShell()->ExecuteSlot(aReq);
                    }
                }
            }
            else
            {
                SfxRequest aReq(FN_FORMAT_PAGE_DLG, 0, GetPool());
                GetCurShell()->ExecuteSlot(aReq);
            }
        }
        break;
        default:
            ASSERT(FALSE, falscher CommandProcessor fuer Dispatch);
            return;
    }
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.31  2000/09/18 16:06:13  willem.vandorp
    OpenOffice header added.

    Revision 1.30  2000/05/26 07:21:34  os
    old SW Basic API Slots removed

    Revision 1.29  2000/02/11 14:59:31  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.28  1998/09/21 11:59:34  MH
    chg: header wg. internal comp.error


      Rev 1.27   21 Sep 1998 13:59:34   MH
   chg: header wg. internal comp.error

      Rev 1.26   29 Nov 1997 16:49:26   MA
   includes

      Rev 1.25   21 Nov 1997 15:00:16   MA
   includes

      Rev 1.24   03 Nov 1997 13:58:30   MA
   precomp entfernt

      Rev 1.23   07 Apr 1997 18:59:58   MH
   chg: header

      Rev 1.22   05 Mar 1997 20:36:16   NF
   Neuer Constructor f?r SfxRequest

      Rev 1.21   04 Dec 1996 23:07:10   MH
   del: stdchr.hxx

      Rev 1.20   14 Nov 1996 19:19:08   OS
   Umstellung SlotIds

      Rev 1.19   09 Sep 1996 18:57:22   MH
   add: include basesh.hxx

      Rev 1.18   09 Sep 1996 15:11:26   OS
   SID_APPLY_TEMPLATE mit WrtShell

      Rev 1.17   04 Sep 1996 08:02:24   OS
   Format/Grundschriften entfernt

      Rev 1.16   29 Jul 1996 15:47:22   MA
   includes

      Rev 1.15   26 Jun 1996 15:01:58   OS
   Aufruf von Dispatcher.Execute an 324 angepasst

      Rev 1.14   30 Nov 1995 15:16:06   OS
   div. Slots verschoben

      Rev 1.13   24 Nov 1995 16:58:00   OM
   PCH->PRECOMPILED

      Rev 1.12   09 Nov 1995 17:57:38   OS
   Id fuer FormatPage/CharDlg auf SID_ umgestellt

      Rev 1.11   31 Oct 1995 18:42:44   OM
   GetFrameWindow entfernt

      Rev 1.10   22 Aug 1995 08:07:34   MA
   svxitems-header entfernt

      Rev 1.9   14 Jul 1995 17:49:02   OS
   neue Seitenvorlage auf Differenz testen

      Rev 1.8   30 Jun 1995 07:58:34   OS
   const und nicht const

      Rev 1.7   29 Jun 1995 11:12:16   OS
   Page/Para/Char-Style aus Macro setzen

      Rev 1.6   19 Jun 1995 16:34:52   OS
   -FN_STYLE_SHEET_FRAME_DLG

      Rev 1.5   14 Feb 1995 16:51:24   PK
   fn_set_standard_fonts

      Rev 1.4   18 Jan 1995 13:23:00   MS
   Precompiled hd

      Rev 1.3   05 Dec 1994 16:57:40   MS
   Anpassung Tabdlg

      Rev 1.2   25 Oct 1994 19:07:26   ER
   add: PCH

      Rev 1.1   25 Oct 1994 12:15:12   MS
   SwStdCharDlg entfernt

      Rev 1.0   22 Sep 1994 18:37:52   VB
   Weiteres

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/uiview/viewdlg.cxx b/sw/source/ui/uiview/viewdlg.cxx
new file mode 100644
index 0000000..610c14c
--- /dev/null
+++ b/sw/source/ui/uiview/viewdlg.cxx
@@ -0,0 +1,198 @@
/*************************************************************************
 *
 *  $RCSfile: viewdlg.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:49 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "hintids.hxx"

#ifndef _SFXVIEWFRM_HXX //autogen
#include <sfx2/viewfrm.hxx>
#endif
#ifndef _SVX_TSPTITEM_HXX //autogen
#include <svx/tstpitem.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif


#include "view.hxx"
#include "wrtsh.hxx"
#include "basesh.hxx"
#include "viewopt.hxx"
#include "uitool.hxx"
#include "cmdid.h"
#include "docstdlg.hxx"
#include "pagedesc.hxx"


void SwView::ExecDlg(SfxRequest &rReq)
{
    Window *pMDI = &GetViewFrame()->GetWindow();
    ModalDialog *pDialog = 0;
    //Damit aus dem Basic keine Dialoge fuer Hintergrund-Views aufgerufen werden:
    const SfxPoolItem* pItem = 0;
    const SfxItemSet* pArgs = rReq.GetArgs();

    USHORT nSlot = rReq.GetSlot();
    if(pArgs)
        pArgs->GetItemState( GetPool().GetWhich(nSlot), FALSE, &pItem );

    switch ( nSlot )
    {
        case FN_CHANGE_PAGENUM:
        {
            if ( pItem )
            {
                USHORT nValue = ((SfxUInt16Item *)pItem)->GetValue();
                USHORT nOldValue = pWrtShell->GetPageOffset();
                USHORT nPage, nLogPage;
                pWrtShell->GetPageNum( nPage, nLogPage,
                   pWrtShell->IsCrsrVisible(), FALSE);

                if(nValue != nOldValue || nValue != nLogPage)
                {
                    if(!nOldValue)
                        pWrtShell->SetNewPageOffset( nValue );
                    else
                        pWrtShell->SetPageOffset( nValue );
                }
            }
        }
        break;

        default:
            ASSERT(!this, falscher Dispatcher);
            return;
    }

    if( pDialog )
    {
        pDialog->Execute();
        delete pDialog;
    }
}


/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.123  2000/09/18 16:06:13  willem.vandorp
    OpenOffice header added.

    Revision 1.122  2000/05/26 07:21:34  os
    old SW Basic API Slots removed

    Revision 1.121  2000/04/18 15:02:51  os
    UNICODE

    Revision 1.120  1998/01/28 15:02:52  OM
    #45138# Seitennummern-Dlg entfernt


      Rev 1.119   28 Jan 1998 16:02:52   OM
   #45138# Seitennummern-Dlg entfernt

      Rev 1.118   21 Nov 1997 15:00:18   MA
   includes

      Rev 1.117   03 Nov 1997 13:58:30   MA
   precomp entfernt

      Rev 1.116   01 Sep 1997 13:14:12   OS
   DLL-Umstellung

      Rev 1.115   15 Aug 1997 11:48:02   OS
   chartar/frmatr/txtatr aufgeteilt

      Rev 1.114   11 Aug 1997 10:20:24   OS
   paraitem/frmitems/textitem aufgeteilt

      Rev 1.113   08 Aug 1997 17:26:16   OM
   Headerfile-Umstellung

      Rev 1.112   08 Aug 1997 14:48:30   HJS
   includes

      Rev 1.111   10 Apr 1997 15:30:20   OS
   CHANGE_PAGENUM: nicht nur Offset vergleichen, sondern auch log. Seitennummer

      Rev 1.110   07 Apr 1997 18:57:40   MH
   chg: header

      Rev 1.109   11 Dec 1996 10:58:18   MA
   Warnings

      Rev 1.108   29 Jul 1996 15:47:20   MA
   includes

      Rev 1.107   14 Dec 1995 17:25:04   OS
   -ExecDocStatDlg

------------------------------------------------------------------------*/

diff --git a/sw/source/ui/uiview/viewdlg2.cxx b/sw/source/ui/uiview/viewdlg2.cxx
new file mode 100644
index 0000000..b986e89
--- /dev/null
+++ b/sw/source/ui/uiview/viewdlg2.cxx
@@ -0,0 +1,403 @@
/*************************************************************************
 *
 *  $RCSfile: viewdlg2.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:49 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SFXVIEWFRM_HXX //autogen
#include <sfx2/viewfrm.hxx>
#endif


#ifndef _FLDMGR_HXX //autogen
#include <fldmgr.hxx>
#endif
#ifndef _EXPFLD_HXX //autogen
#include <expfld.hxx>
#endif

#ifndef _MODOPT_HXX //autogen
#include <modcfg.hxx>
#endif

#include "swmodule.hxx"
#include "view.hxx"
#include "wview.hxx"
#include "wrtsh.hxx"
#include "cmdid.h"
#include "cption.hxx"
#include "caption.hxx"
#include "insfnote.hxx"
#include "poolfmt.hxx"
#include "edtwin.hxx"

#include "view.hrc"

extern String* pOldGrfCat;
extern String* pOldTabCat;
extern String* pOldFrmCat;
extern String* pOldDrwCat;

/* -----------------06.11.98 13:45-------------------
 *
 * --------------------------------------------------*/

void SwView::ExecDlgExt(SfxRequest &rReq)
{
    Window *pMDI = &GetViewFrame()->GetWindow();
    ModalDialog *pDialog = 0;
    const SfxItemSet* pOutSet = 0;

    switch ( rReq.GetSlot() )
    {
        case FN_INSERT_CAPTION:
        {
            pDialog = new SwCaptionDialog( pMDI, *this );
            break;
        }
        case  FN_EDIT_FOOTNOTE:
        {
            pDialog = new SwInsFootNoteDlg( pMDI, *pWrtShell, TRUE );
            pDialog->SetHelpId(FN_EDIT_FOOTNOTE);
            pDialog->SetText( SW_RESSTR(STR_EDIT_FOOTNOTE) );
            break;
        }
    }
    if ( pDialog )
    {
        pDialog->Execute();
        delete pDialog;
    }
}

/* -----------------06.11.98 14:53-------------------
 *
 * --------------------------------------------------*/

void SwView::AutoCaption(const USHORT nType, const SvGlobalName *pOleId)
{
    SwModuleOptions* pModOpt = SW_MOD()->GetModuleConfig();

    BOOL bWeb = 0 != PTR_CAST(SwWebView, this);
    if (pModOpt->IsInsWithCaption(bWeb))
    {
        const InsCaptionOpt *pOpt = pModOpt->GetCapOption(bWeb, (SwCapObjType)nType, pOleId);
        if (pOpt && pOpt->UseCaption() == TRUE)
            InsertCaption(pOpt);
    }
}

/* -----------------06.11.98 12:58-------------------
 *
 * --------------------------------------------------*/

void SwView::InsertCaption(const InsCaptionOpt *pOpt)
{
    if (!pOpt)
        return;

    const String &rName = pOpt->GetCategory();

    // Existiert Pool-Vorlage gleichen Namens?
    SwWrtShell &rSh = GetWrtShell();
    USHORT nPoolId = rSh.GetPoolId(rName, GET_POOLID_TXTCOLL);
    if( USHRT_MAX != nPoolId )
        rSh.GetTxtCollFromPool(nPoolId);
        // Pool-Vorlage existiert nicht: Existiert sie am Dokument?
    else if( !rSh.GetParaStyle(rName) )
    {
        // Sie existiert auch nicht am Dokument: erzeugen
        SwTxtFmtColl* pDerivedFrom = rSh.GetTxtCollFromPool(RES_POOLCOLL_LABEL);
        rSh.MakeTxtFmtColl(rName, pDerivedFrom);
    }

    USHORT eType = (SwWrtShell::SelectionType)rSh.GetSelectionType();
    if (eType & SwWrtShell::SEL_OLE)
        eType = SwWrtShell::SEL_GRF;

    // SwLabelType
    const USHORT eT = eType & SwWrtShell::SEL_TBL ? LTYPE_TABLE :
                      eType & SwWrtShell::SEL_FRM ? LTYPE_FLY :
                      eType == SwWrtShell::SEL_TXT ? LTYPE_FLY :
                      eType & SwWrtShell::SEL_DRW ? LTYPE_DRAW :
                                                    LTYPE_OBJECT;

    SwFldMgr aMgr(&rSh);
    SwSetExpFieldType* pFldType =
            (SwSetExpFieldType*)aMgr.GetFldType(RES_SETEXPFLD, rName);
    if (!pFldType)
    {
        // Neuen Feldtypen erzeugen
        SwSetExpFieldType aSwSetExpFieldType(rSh.GetDoc(), rName, GSE_SEQ);
        aMgr.InsertFldType(aSwSetExpFieldType);
        pFldType = (SwSetExpFieldType*)aMgr.GetFldType(RES_SETEXPFLD, rName);
    }

    if (!pOpt->IgnoreSeqOpts())
    {
        if (pFldType)
        {
            pFldType->SetDelimiter(pOpt->GetSeparator());
            pFldType->SetOutlineLvl(pOpt->GetLevel());
        }
    }

    USHORT       nID    = 0;
    SwFieldType* pType  = 0;
    const USHORT nCount = aMgr.GetFldTypeCount();
    for (USHORT i = 0; i < nCount; ++i)
    {
        pType = aMgr.GetFldType(USHRT_MAX, i);
        String aTmpName( pType->GetName() );
        if (aTmpName == rName && pType->Which() == RES_SETEXPFLD)
        {
            nID = i;
            break;
        }
    }
    rSh.StartAllAction();

    GetWrtShell().InsertLabel( (SwLabelType)eT,
                                pOpt->GetCaption(),
                                !pOpt->GetPos(),
                                nID,
                                pOpt->CopyAttributes() );
    // Nummernformat setzen
    ((SwSetExpFieldType*)pType)->SetSeqFormat(pOpt->GetNumType());

    rSh.UpdateExpFlds( TRUE );

    rSh.EndAllAction();

    if ( rSh.IsFrmSelected() )
    {
        GetEditWin().StopInsFrm();
        rSh.EnterSelFrmMode();
    }

    // Kategorie merken
    String** ppStr = 0;
    if (eType & SwWrtShell::SEL_GRF)
        ppStr = &pOldGrfCat;
    else if( eType & SwWrtShell::SEL_TBL)
        ppStr = &pOldTabCat;
    else if( eType & SwWrtShell::SEL_FRM)
        ppStr = &pOldFrmCat;
    else if( eType == SwWrtShell::SEL_TXT)
        ppStr = &pOldFrmCat;
    else if( eType & SwWrtShell::SEL_DRW)
        ppStr = &pOldDrwCat;

    if( ppStr )
    {
        if( !*ppStr )
            *ppStr = new String( rName );
        else
            **ppStr = rName;
    }
}

/*------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.56  2000/09/18 16:06:13  willem.vandorp
    OpenOffice header added.

    Revision 1.55  2000/05/26 07:21:35  os
    old SW Basic API Slots removed

    Revision 1.54  1999/06/09 08:44:54  OS
    #66732# Insert caption: copy border and shadow optionally


      Rev 1.53   09 Jun 1999 10:44:54   OS
   #66732# Insert caption: copy border and shadow optionally

      Rev 1.52   17 Feb 1999 08:40:28   OS
   #58158# Einfuegen TabPage auch in HTML-Docs

      Rev 1.51   25 Jan 1999 14:10:32   HR
   include editwin.hxx

      Rev 1.50   21 Jan 1999 18:53:36   MA
   #60697# die bloeden Stati pflegen

      Rev 1.49   10 Dec 1998 09:47:16   MIB
   #60060#: Beschriftungen fuer Zeichen-Objekte

      Rev 1.48   06 Nov 1998 17:05:58   OM
   #58158# Automatische Beschriftung

      Rev 1.47   21 Nov 1997 15:00:18   MA
   includes

      Rev 1.46   03 Nov 1997 13:58:28   MA
   precomp entfernt

      Rev 1.45   07 Apr 1997 19:00:26   MH
   chg: header

      Rev 1.44   11 Nov 1996 11:10:50   MA
   ResMgr

      Rev 1.43   29 Jul 1996 15:47:16   MA
   includes

      Rev 1.42   23 Feb 1996 17:04:58   OM
   OpenINetDlg entfernt

      Rev 1.41   20 Feb 1996 10:08:20   OM
   Methode fuer Internet-Open-Dlg

      Rev 1.40   30 Nov 1995 15:16:04   OS
   div. Slots verschoben

      Rev 1.39   24 Nov 1995 16:58:00   OM
   PCH->PRECOMPILED

      Rev 1.38   08 Nov 1995 13:07:44   OS
   Change => Set

      Rev 1.37   06 Nov 1995 17:20:04   OS
   kleinere Optimierung

      Rev 1.36   31 Oct 1995 18:42:46   OM
   GetFrameWindow entfernt

      Rev 1.35   30 Oct 1995 18:51:18   OS
   FN_POSTIT ueber Slot einfuegen

      Rev 1.34   18 Sep 1995 18:30:08   OM
   HelpIDs

      Rev 1.33   24 Aug 1995 14:31:54   MA
   swstddlg -> svxstandarddialog

      Rev 1.32   21 Aug 1995 09:26:36   MA
   chg: swstddlg -> svxstandarddialog, Optimierungen

      Rev 1.31   23 Jun 1995 07:26:34   OS
   FALSe gibt's nicht

      Rev 1.30   22 Jun 1995 20:03:46   MA
   fix/opt: FrmMgr mit Shell erzeugen.

      Rev 1.29   09 Jun 1995 14:25:34   OM
   Alten DB-Manager entfernt

      Rev 1.28   05 Apr 1995 19:06:34   OS
   Fix fuer Tabellen-und Rahmenhintergrund Bug 10891

      Rev 1.27   04 Apr 1995 14:09:56   MA
   Optimiert, includes gespart.

      Rev 1.26   03 Apr 1995 19:41:52   OS
   Titel fuer Edit-Footnote Fix 11252

      Rev 1.25   28 Mar 1995 19:39:54   OM
   Aufgeteilt auf viewdlg2 und 4

      Rev 1.24   24 Mar 1995 20:17:22   PK
   pkbla ist out

      Rev 1.23   04 Mar 1995 14:08:04   MA
   fix: GPF Umrandung fuer Tabelle.

      Rev 1.22   02 Mar 1995 18:49:34   PK
   pkbla-geraffel wieder uebersetzbar

      Rev 1.21   01 Mar 1995 11:08:48   MA
   weg: Sw-BoxItem, neu: KeepItem.

      Rev 1.20   16 Feb 1995 19:33:58   PK
   swborderdlg: einsatz von swflyfrmattrmgr

      Rev 1.19   08 Feb 1995 18:39:38   PK
   bla-geraffel mit #ifdef pkbla

      Rev 1.18   08 Feb 1995 10:21:44   SWG
   blaout kommentiert.

      Rev 1.17   08 Feb 1995 10:18:18   SWG
   blaout kommentiert.

      Rev 1.16   07 Feb 1995 19:34:38   PK
   umrandungen, bla-geraffel

      Rev 1.14   26 Jan 1995 16:58:44   PK
   gebrauch von get- und settabborders

      Rev 1.13   24 Jan 1995 13:29:06   PK
   Map entfernt

      Rev 1.12   18 Jan 1995 13:22:58   MS
   Precompiled hd

      Rev 1.11   13 Jan 1995 12:17:06   MS
   Aufteilung DBMgr

------------------------------------------------------------------------*/

diff --git a/sw/source/ui/uiview/viewdraw.cxx b/sw/source/ui/uiview/viewdraw.cxx
new file mode 100644
index 0000000..71dc4cb
--- /dev/null
+++ b/sw/source/ui/uiview/viewdraw.cxx
@@ -0,0 +1,809 @@
/*************************************************************************
 *
 *  $RCSfile: viewdraw.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:49 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "hintids.hxx"

#ifndef _AEITEM_HXX //autogen
#include <svtools/aeitem.hxx>
#endif
#ifndef _SFXITEMPOOL_HXX //autogen
#include <svtools/itempool.hxx>
#endif
#ifndef _SVDOBJ_HXX //autogen
#include <svx/svdobj.hxx>
#endif
#ifndef _SVDVIEW_HXX //autogen
#include <svx/svdview.hxx>
#endif
#ifndef _SVDPAGE_HXX //autogen
#include <svx/svdpage.hxx>
#endif
#ifndef _OUTLINER_HXX //autogen
#include <svx/outliner.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SFXVIEWFRM_HXX
#include <sfx2/viewfrm.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif

#ifndef _SVX_LANGITEM_HXX
#include <svx/langitem.hxx>
#endif

#ifndef _LINGU_LNGPROPS_HHX_
#include <lingu/lngprops.hxx>
#endif
#ifndef _UNO_LINGU_HXX
#include <svx/unolingu.hxx>
#endif


#ifndef _EEITEM_HXX //autogen
#include <svx/eeitem.hxx>
#endif
#ifndef _SVDOTEXT_HXX //autogen
#include <svx/svdotext.hxx>
#endif
#ifndef _SVDETC_HXX
#include <svx/svdetc.hxx>
#endif
#ifndef _EDITSTAT_HXX //autogen
#include <svx/editstat.hxx>
#endif
#ifndef _IDETEMP_HXX
#include <basctl/idetemp.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SFX_BINDINGS_HXX //autogen
#include <sfx2/bindings.hxx>
#endif
#ifndef _SFX_PRINTER_HXX //autogen
#include <sfx2/printer.hxx>
#endif
#ifndef _SVX_FMGLOB_HXX //autogen
#include <svx/fmglob.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SVDOUTL_HXX
#include <svx/svdoutl.hxx>
#endif

#include "view.hxx"
#include "wrtsh.hxx"
#include "viewopt.hxx"
#include "cmdid.h"
#include "drawsh.hxx"
#include "drwbassh.hxx"
#include "beziersh.hxx"
#include "conrect.hxx"
#include "conctrl.hxx"
#include "conpoly.hxx"
#include "conarc.hxx"
#include "conform.hxx"
#include "dselect.hxx"
#include "edtwin.hxx"

using namespace ::com::sun::star;
/*--------------------------------------------------------------------
    Beschreibung:   Drawing-Ids ausfuehren
 --------------------------------------------------------------------*/



void SwView::ExecDraw(SfxRequest& rReq)
{
    const SfxItemSet *pArgs = rReq.GetArgs();
    const SfxPoolItem* pItem;
    const SfxAllEnumItem* pEItem = 0;
    SdrView *pSdrView = pWrtShell->GetDrawView();
    sal_Bool bDeselect = sal_False;

    sal_uInt16 nSlotId = rReq.GetSlot();
    if(pArgs && SFX_ITEM_SET == pArgs->GetItemState(GetPool().GetWhich(nSlotId), sal_False, &pItem))
    {
        pEItem = (const SfxAllEnumItem*)pItem;
    }

    if (nSlotId == SID_INSERT_DRAW && pEItem)
    {
        static sal_uInt16 __READONLY_DATA aSlotTable[] =
        {
            SID_OBJECT_SELECT,
            SID_DRAW_LINE,
            SID_DRAW_RECT,
            SID_DRAW_ELLIPSE,
            SID_DRAW_POLYGON_NOFILL,
            SID_DRAW_BEZIER_NOFILL,
            SID_DRAW_FREELINE_NOFILL,
            SID_DRAW_ARC,
            SID_DRAW_PIE,
            SID_DRAW_CIRCLECUT,
            SID_DRAW_TEXT,
            SID_DRAW_TEXT_MARQUEE,
            SID_DRAW_CAPTION
        };

        nSlotId = aSlotTable[pEItem->GetValue()];
    }

    if (nSlotId == SID_OBJECT_SELECT && nFormSfxId == nSlotId)
    {
        bDeselect = sal_True;
    }
    else if (nSlotId == SID_FM_CREATE_CONTROL)
    {
        SFX_REQUEST_ARG( rReq, pIdentifierItem, SfxUInt16Item, SID_FM_CONTROL_IDENTIFIER, sal_False );
        if( pIdentifierItem )
        {
            sal_uInt16 nNewId = pIdentifierItem->GetValue();
            if (nNewId == nFormSfxId)
            {
                bDeselect = sal_True;
                GetViewFrame()->GetDispatcher()->Execute(SID_FM_LEAVE_CREATE);  // Button soll rauspoppen
            }
        }
    }

    if (nSlotId == nDrawSfxId || bDeselect)
    {
        if (GetDrawFuncPtr())
        {
            GetDrawFuncPtr()->Deactivate();
            SetDrawFuncPtr(NULL);
        }

        if (pWrtShell->IsObjSelected() && !pWrtShell->IsSelFrmMode())
            pWrtShell->EnterSelFrmMode(NULL);
        LeaveDrawCreate();

        GetViewFrame()->GetBindings().Invalidate(SID_INSERT_DRAW);

        AttrChangedNotify(pWrtShell);
        return;
    }

    LeaveDrawCreate();

    if (pWrtShell->IsFrmSelected())
        pWrtShell->EnterStdMode();  // wegen Bug #45639

    SwDrawBase* pFuncPtr = NULL;

    switch (nSlotId)
    {
        case SID_OBJECT_SELECT:
        case SID_DRAW_SELECT:
            pFuncPtr = new DrawSelection(pWrtShell, pEditWin, this);
            nDrawSfxId = nFormSfxId = SID_OBJECT_SELECT;
            break;

        case SID_DRAW_LINE:
        case SID_DRAW_RECT:
        case SID_DRAW_ELLIPSE:
        case SID_DRAW_TEXT:
        case SID_DRAW_TEXT_MARQUEE:
        case SID_DRAW_CAPTION:
            pFuncPtr = new ConstRectangle(pWrtShell, pEditWin, this);
            nDrawSfxId = nSlotId;
            break;

        case SID_DRAW_POLYGON_NOFILL:
        case SID_DRAW_BEZIER_NOFILL:
        case SID_DRAW_FREELINE_NOFILL:
            pFuncPtr = new ConstPolygon(pWrtShell, pEditWin, this);
            nDrawSfxId = nSlotId;
            break;

        case SID_DRAW_ARC:
        case SID_DRAW_PIE:
        case SID_DRAW_CIRCLECUT:
            pFuncPtr = new ConstArc(pWrtShell, pEditWin, this);
            nDrawSfxId = nSlotId;
            break;

        case SID_FM_CREATE_CONTROL:
        {
            SFX_REQUEST_ARG( rReq, pIdentifierItem, SfxUInt16Item, SID_FM_CONTROL_IDENTIFIER, sal_False );
            if( pIdentifierItem )
                nSlotId = pIdentifierItem->GetValue();
            pFuncPtr = new ConstFormControl(pWrtShell, pEditWin, this);
            nFormSfxId = nSlotId;
        }
        break;

        default:
            break;
    }

    static sal_uInt16 __READONLY_DATA aInval[] =
    {
        // Slot-Ids muessen beim Aufruf von Invalidate sortiert sein!
        SID_ATTRIBUTES_AREA,
        SID_INSERT_DRAW,
        0
    };
    GetViewFrame()->GetBindings().Invalidate(aInval);

    if (pFuncPtr)
    {
        if (GetDrawFuncPtr())
        {
            GetDrawFuncPtr()->Deactivate();
            SetDrawFuncPtr(NULL);
        }

        SetDrawFuncPtr(pFuncPtr);
        AttrChangedNotify(pWrtShell);

        pFuncPtr->Activate(nSlotId);
        NoRotate();
    }
    else
    {
        if (pWrtShell->IsObjSelected() && !pWrtShell->IsSelFrmMode())
            pWrtShell->EnterSelFrmMode(NULL);
    }

    if (pSdrView && pSdrView->IsTextEdit())
        pSdrView->EndTextEdit( sal_True );

    AttrChangedNotify(pWrtShell);
}

/*--------------------------------------------------------------------
    Beschreibung:   Drawing beenden
 --------------------------------------------------------------------*/



void SwView::ExitDraw()
{
    NoRotate();

    if (pShell && !pShell->ISA(SwDrawBaseShell) && !pShell->ISA(SwBezierShell))
    {
        SdrView *pSdrView = pWrtShell->GetDrawView();

        if (pSdrView && pSdrView->IsGroupEntered())
        {
            pSdrView->LeaveOneGroup();
            pSdrView->UnmarkAll();
            GetViewFrame()->GetBindings().Invalidate(SID_ENTER_GROUP);
        }

        if (GetDrawFuncPtr())
        {
            if (pWrtShell->IsSelFrmMode())
                pWrtShell->LeaveSelFrmMode();
            GetDrawFuncPtr()->Deactivate();

            SetDrawFuncPtr(NULL);
            LeaveDrawCreate();

            GetViewFrame()->GetBindings().Invalidate(SID_INSERT_DRAW);
        }
        GetEditWin().SetPointer(Pointer(POINTER_TEXT));
    }
}

/*--------------------------------------------------------------------
    Beschreibung:   Rotate-Mode abschalten
 --------------------------------------------------------------------*/



void SwView::NoRotate()
{
    if (IsDrawRotate())
    {
        pWrtShell->SetDragMode(SDRDRAG_MOVE);
        FlipDrawRotate();

        const SfxBoolItem aTmp( SID_OBJECT_ROTATE, sal_False );
        GetViewFrame()->GetBindings().SetState( aTmp );
    }
}

/******************************************************************************
 *  Beschreibung: DrawTextEditMode einschalten
 ******************************************************************************/



sal_Bool SwView::EnterDrawTextMode(const Point& aDocPos)
{
    SdrObject* pObj;
    SdrPageView* pPV;
    SwWrtShell *pSh = &GetWrtShell();
    SdrView *pSdrView = pSh->GetDrawView();
    ASSERT( pSdrView, "EnterDrawTextMode without DrawView?" );

    sal_Bool bReturn = sal_False;

    sal_uInt16 nOld = pSdrView->GetHitTolerancePixel();
    pSdrView->SetHitTolerancePixel( 2 );

    if( pSdrView->IsMarkedHit( aDocPos ) &&
        !pSdrView->HitHandle( aDocPos, *pSh->GetOut() ) && IsTextTool() &&
        pSdrView->PickObj( aDocPos, pObj, pPV, SDRSEARCH_PICKTEXTEDIT ) &&
        pObj->ISA( SdrTextObj ) &&
        !pWrtShell->IsSelObjProtected(FLYPROTECT_CONTENT))
        bReturn = BeginTextEdit(pObj, pPV, pEditWin, sal_True);

    pSdrView->SetHitTolerancePixel( nOld );

    return bReturn;
}

/******************************************************************************
 *  Beschreibung: DrawTextEditMode einschalten
 ******************************************************************************/



sal_Bool SwView::BeginTextEdit(SdrObject* pObj, SdrPageView* pPV, Window* pWin, sal_Bool bIsNewObj)
{
    SwWrtShell *pSh = &GetWrtShell();
    SdrView *pSdrView = pSh->GetDrawView();
    SdrOutliner* pOutliner = ::SdrMakeOutliner(0, pSdrView->GetModel());
    uno::Reference< linguistic::XSpellChecker1 >  xSpell( ::GetSpellChecker() );
    if (pOutliner)
    {
        SwWrtShell *pSh = &GetWrtShell();
        pOutliner->SetRefDevice(pSh->GetPrt());
        pOutliner->SetSpeller(xSpell);
        pOutliner->SetHyphenator( ::GetHyphenator() );
        pSh->SetCalcFieldValueHdl(pOutliner);

        sal_uInt32 nCntrl = pOutliner->GetControlWord();
        nCntrl |= EE_CNTRL_ALLOWBIGOBJS;
        nCntrl |= EE_CNTRL_URLSFXEXECUTE;

        const SwViewOption *pOpt = pSh->GetViewOptions();

        if (pOpt->IsField())
            nCntrl |= EE_CNTRL_MARKFIELDS;
        else
            nCntrl &= ~EE_CNTRL_MARKFIELDS;

        if (pOpt->IsHideSpell())
            nCntrl |= EE_CNTRL_NOREDLINES;
        else
            nCntrl &= ~EE_CNTRL_NOREDLINES;

        if (pOpt->IsOnlineSpell())
            nCntrl |= EE_CNTRL_ONLINESPELLING;
        else
            nCntrl &= ~EE_CNTRL_ONLINESPELLING;

        pOutliner->SetControlWord(nCntrl);
        const SfxPoolItem& rItem = pSh->GetDoc()->GetDefault(RES_CHRATR_LANGUAGE);
        pOutliner->SetDefaultLanguage(((const SvxLanguageItem&)rItem).GetLanguage());
    }
    sal_Bool bRet = pSdrView->BegTextEdit( pObj, pPV, pWin, bIsNewObj, pOutliner);

    return bRet;
}

/******************************************************************************
 *  Beschreibung: Ist ein DrawTextObjekt selektiert?
 ******************************************************************************/



sal_Bool SwView::IsTextTool() const
{
    sal_uInt16 nId;
    sal_uInt32 nInvent;
    SdrView *pSdrView = GetWrtShell().GetDrawView();
    ASSERT( pSdrView, "IsTextTool without DrawView?" );

    if (pSdrView->IsCreateMode())
        pSdrView->SetCreateMode(sal_False);

    pSdrView->TakeCurrentObj(nId,nInvent);
    return (nInvent==SdrInventor);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



SdrView* SwView::GetDrawView() const
{
    return GetWrtShell().GetDrawView();
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



sal_Bool SwView::IsBezierEditMode()
{
    return (!IsDrawSelMode() && GetWrtShell().GetDrawView()->HasMarkablePoints());
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

sal_Bool SwView::IsFormMode() const
{
    if (GetDrawFuncPtr() && GetDrawFuncPtr()->IsCreateObj())
    {
        if (GetDrawFuncPtr()->IsInsertForm())
            return sal_True;
        else
            return sal_False;
    }

    return AreOnlyFormsSelected();
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



void SwView::SetDrawFuncPtr(SwDrawBase* pFuncPtr)
{
    if (pDrawActual)
        delete pDrawActual;
    pDrawActual = pFuncPtr;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwView::SetSelDrawSlot()
{
    nDrawSfxId = SID_OBJECT_SELECT;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

sal_Bool SwView::AreOnlyFormsSelected() const
{
    if ( GetWrtShell().IsFrmSelected() )
        return sal_False;

    sal_Bool bForm = sal_True;

    SdrView* pSdrView = GetWrtShell().GetDrawView();

    const SdrMarkList& rMarkList = pSdrView->GetMarkList();
    sal_uInt32 nCount = rMarkList.GetMarkCount();

    if (nCount)
    {
        for (sal_uInt32 i = 0; i < nCount; i++)
        {
            // Sind ausser Controls noch normale Draw-Objekte selektiert?
            SdrObject *pSdrObj = rMarkList.GetMark(i)->GetObj();

            if (!HasOnlyObj(pSdrObj, FmFormInventor))
            {
                bForm = sal_False;
                break;
            }
        }
    }
    else
        bForm = sal_False;

    return bForm;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

sal_Bool SwView::HasDrwObj(SdrObject *pSdrObj) const
{
    sal_Bool bRet = sal_False;

    if (pSdrObj->IsGroupObject())
    {
        SdrObjList* pList = pSdrObj->GetSubList();
        sal_uInt32 nCnt = pList->GetObjCount();

        for (sal_uInt32 i = 0; i < nCnt; i++)
            if ((bRet = HasDrwObj(pList->GetObj(i))) == sal_True)
                break;
    }
    else if (SdrInventor == pSdrObj->GetObjInventor() || pSdrObj->Is3DObj())
        return sal_True;

    return bRet;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

sal_Bool SwView::HasOnlyObj(SdrObject *pSdrObj, sal_uInt32 eObjInventor) const
{
    sal_Bool bRet = sal_False;

    if (pSdrObj->IsGroupObject())
    {
        SdrObjList* pList = pSdrObj->GetSubList();
        sal_uInt32 nCnt = pList->GetObjCount();

        for (sal_uInt32 i = 0; i < nCnt; i++)
            if ((bRet = HasOnlyObj(pList->GetObj(i), eObjInventor)) == sal_False)
                break;
    }
    else if (eObjInventor == pSdrObj->GetObjInventor())
        return sal_True;

    return bRet;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



sal_Bool SwView::ExecDrwTxtSpellPopup(const Point& rPt)
{
    sal_Bool bRet = sal_False;
    SdrView *pSdrView = pWrtShell->GetDrawView();
    OutlinerView* pOLV = pSdrView->GetTextEditOutlinerView();
    Point aPos( GetEditWin().LogicToPixel( rPt ) );

    if (pOLV->IsWrongSpelledWordAtPos( aPos ))
    {
        bRet = sal_True;
        pOLV->ExecuteSpellPopup( aPos );
    }
    return bRet;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



sal_Bool SwView::IsDrawTextHyphenate()
{
    SdrView *pSdrView = pWrtShell->GetDrawView();
    sal_Bool bHyphenate = sal_False;

    SfxItemSet aNewAttr( pSdrView->GetModel()->GetItemPool(),
                            EE_PARA_HYPHENATE, EE_PARA_HYPHENATE );
    if( pSdrView->GetAttributes( aNewAttr ) &&
        aNewAttr.GetItemState( EE_PARA_HYPHENATE ) >= SFX_ITEM_AVAILABLE )
        bHyphenate = ((const SfxBoolItem&)aNewAttr.Get( EE_PARA_HYPHENATE )).
                        GetValue();

    return bHyphenate;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



void SwView::HyphenateDrawText()
{
    SdrView *pSdrView = pWrtShell->GetDrawView();
    sal_Bool bHyphenate = IsDrawTextHyphenate();

    SfxItemSet aSet( GetPool(), EE_PARA_HYPHENATE, EE_PARA_HYPHENATE );
    aSet.Put( SfxBoolItem( EE_PARA_HYPHENATE, !bHyphenate ) );
    pSdrView->SetAttributes( aSet );
    GetViewFrame()->GetBindings().Invalidate(FN_HYPHENATE_OPT_DLG);
}

/*------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.111  2000/09/18 16:06:13  willem.vandorp
    OpenOffice header added.

    Revision 1.110  2000/09/07 15:59:33  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.109  2000/09/04 11:45:19  tbe
    basicide, isetbrw, si, vcdlged moved from svx to basctl

    Revision 1.108  2000/05/26 07:21:35  os
    old SW Basic API Slots removed

    Revision 1.107  2000/05/11 12:44:32  tl
    if[n]def ONE_LINGU entfernt

    Revision 1.106  2000/03/23 08:43:33  os
    UNO III

    Revision 1.105  2000/03/03 15:17:04  os
    StarView remainders removed

    Revision 1.104  2000/02/16 21:00:40  tl
    #72219# Locale Umstellung

    Revision 1.103  2000/02/09 13:36:38  os
    #72716# Set Outliner language earlier

    Revision 1.102  2000/01/18 16:54:02  os
    #71416# #71428# online spelling and hyphenation in drawing objects

    Revision 1.101  2000/01/18 11:19:15  os
    #72016# LeaveOneGroup selects the group after leaving - call UnmarkAll

    Revision 1.100  1999/11/19 16:40:24  os
    modules renamed

    Revision 1.99  1999/10/25 19:13:57  tl
    ongoing ONE_LINGU implementation

    Revision 1.98  1999/08/31 08:40:04  TL
    #if[n]def ONE_LINGU inserted (for transition of lingu to StarOne)


      Rev 1.97   31 Aug 1999 10:40:04   TL
   #if[n]def ONE_LINGU inserted (for transition of lingu to StarOne)

      Rev 1.96   04 Aug 1999 11:03:04   JP
   have to change: Outliner -> SdrOutlines

      Rev 1.95   21 Jun 1999 15:47:54   JP
   Interface changes: SdrView::GetAttributes

      Rev 1.94   18 Nov 1998 15:06:44   OM
   #59280# FormController Create Modes verlassen

      Rev 1.93   06 Jul 1998 16:09:26   OM
   #52065# Gruppe verlassen bei Beendigung der DrawShell

      Rev 1.92   12 Jun 1998 13:34:46   OM
   Wieder SID_OBJECT_SELECT statt SID_DRAW_SELECT

      Rev 1.91   09 Jun 1998 15:32:26   OM
   VC-Controls entfernt

      Rev 1.90   15 Apr 1998 15:33:20   OM
   #49467 Objekte innerhalb von geschuetzten Rahmen duerfen nicht veraendert werden

      Rev 1.89   08 Apr 1998 12:25:50   OM
   #45639 Bei selektiertem Rahmen keine Drawshell melden

      Rev 1.88   12 Mar 1998 10:04:16   OM
   Forms korrekt erkennen

      Rev 1.87   11 Mar 1998 17:38:32   OM
   DB-FormShell

      Rev 1.86   11 Mar 1998 17:01:54   OM
   DB-FormShell

      Rev 1.85   10 Mar 1998 14:17:58   OM
   Konstruktionsmodul fuer Forms

      Rev 1.84   29 Nov 1997 16:48:32   MA
   includes

      Rev 1.83   21 Nov 1997 15:00:18   MA
   includes

      Rev 1.82   03 Nov 1997 13:58:32   MA
   precomp entfernt

      Rev 1.81   04 Sep 1997 17:14:42   MA
   includes

      Rev 1.80   15 Aug 1997 15:27:32   OM
   Draw- und Controlslots Bereichsumstellung

      Rev 1.79   15 Aug 1997 14:45:36   OM
   Draw- und Controlslots Bereichsumstellung

      Rev 1.78   13 Aug 1997 12:18:36   OM
   #42383# Selektion von Punkten im Konstruktionsmode

      Rev 1.77   12 Aug 1997 13:32:40   OM
   GPF beim Beenden gefixt

      Rev 1.76   23 Jul 1997 21:42:32   HJS
   includes

      Rev 1.75   09 Jul 1997 18:31:56   MA
   ein paar SS const

      Rev 1.74   08 Jul 1997 12:07:42   OM
   Draw-Selektionsmodi aufgeraeumt

      Rev 1.73   25 Jun 1997 13:35:28   OM
   #40966# DrawBaseShell-Ptr wieder eingefuehrt

      Rev 1.72   17 Jun 1997 15:45:28   MA
   DrawTxtShell nicht von BaseShell ableiten + Opts

------------------------------------------------------------------------*/



diff --git a/sw/source/ui/uiview/viewfunc.hxx b/sw/source/ui/uiview/viewfunc.hxx
new file mode 100644
index 0000000..e706fbb
--- /dev/null
+++ b/sw/source/ui/uiview/viewfunc.hxx
@@ -0,0 +1,107 @@
/*************************************************************************
 *
 *  $RCSfile: viewfunc.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:49 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _VIEWFUNC_HXX
#define _VIEWFUNC_HXX

#ifndef _SOLAR_H
#include <tools/solar.h>
#endif

class ImageButton;
class Point;
class PrintDialog;
class SfxItemSet;
class SfxPrinter;
class SfxTabPage;
class Size;
class SvxRuler;
class SwPrtOptions;
class SwScrollbar;
class ViewShell;
class Window;
class SwWrtShell;

// folgende Funktionen stehen im viewprt.cxx
void MakeOptions( PrintDialog*, SwPrtOptions&, BOOL* pFlag, BOOL bWeb, SfxPrinter* pPrt = 0 );
PrintDialog* CreatePrintDialog( Window* , USHORT, SwWrtShell* );
void SetPrinter( SfxPrinter*, BOOL bWeb );
SfxTabPage* CreatePrintOptionsPage( Window*, const SfxItemSet& );
void SetAppPrintOptions( ViewShell* pSh, BOOL bWeb );

// folgende Funktionen stehen im viewport.cxx
void ViewResizePixel( const Window &rRef,
                    const Point &rOfst,
                    const Size &rSize,
                    const Size &rEditSz,
                    const BOOL bInner,
                    SwScrollbar* pVScrollbar,
                    SwScrollbar* pHScrollbar,
                    ImageButton* pPageUpBtn,
                    ImageButton* pPageDownBtn,
                    ImageButton* pNaviBtn,
                    Window* pScrollBarBox,
                    SvxRuler* pVLineal = 0,
                    SvxRuler* pHLineal = 0,
                    BOOL bIgnoreVisibility = FALSE,
                    BOOL bWebView = FALSE );


#endif
diff --git a/sw/source/ui/uiview/viewling.cxx b/sw/source/ui/uiview/viewling.cxx
new file mode 100644
index 0000000..caf2a45
--- /dev/null
+++ b/sw/source/ui/uiview/viewling.cxx
@@ -0,0 +1,841 @@
/*************************************************************************
 *
 *  $RCSfile: viewling.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:49 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "hintids.hxx"
#include "uiparam.hxx"      // fuer ITEMID_SPELLCHECK (muss _vor_ sfxdlg.hxx!)


#ifndef _SVSTDARR_HXX
#define _SVSTDARR_STRINGSDTOR
#include <svtools/svstdarr.hxx>
#endif

#ifndef _COM_SUN_STAR_LINGUISTIC_XTHESAURUS_HPP_
#include <com/sun/star/linguistic/XThesaurus.hpp>
#endif
#ifndef _LINGU_LNGPROPS_HHX_
#include <lingu/lngprops.hxx>
#endif
#ifndef _OFF_APP_HXX
#include <offmgr/app.hxx>
#endif
#ifndef _UNO_LINGU_HXX
#include <svx/unolingu.hxx>
#endif


#ifndef _SVX_THESDLG_HXX //autogen
#include <svx/thesdlg.hxx>
#endif
#ifndef _INTN_HXX //autogen
#include <tools/intn.hxx>
#endif
#ifndef _SV_SVAPP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef NOOLDSV //autogen
#include <vcl/system.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _EHDL_HXX //autogen
#include <svtools/ehdl.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _SV_MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SVX_DLGUTIL_HXX
#include <svx/dlgutil.hxx>
#endif
#ifndef _SVX_DIALMGR_HXX //autogen
#include <svx/dialmgr.hxx>
#endif
#ifndef _SVX_LANGITEM_HXX
#include <svx/langitem.hxx>
#endif
#ifndef _SVXERR_HXX
#include <svx/svxerr.hxx>
#endif

#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _SWWAIT_HXX
#include <swwait.hxx>
#endif
#include "initui.hxx"               // fuer SpellPointer
#include "finder.hxx"               // Pathes fuer Lingu
#include "view.hxx"
#include "wrtsh.hxx"
#include "basesh.hxx"
#include "docsh.hxx"                // CheckSpellChanges
#include "viewopt.hxx"              // Viewoptions
#include "swundo.hxx"               // fuer Undo-Ids
#include "cmdid.h"
#include "globals.hrc"
#include "comcore.hrc"              // STR_MULT_INTERACT_SPELL_WARN
#include "splwrp.hxx"               //    "
#include "hyp.hxx"                  // Trennung
#include "olmenu.hxx"               // PopupMenu fuer OnlineSpelling
#include "pam.hxx"                  // Spelling: Multiselektion
#include "edtwin.hxx"

#include "view.hrc"

using namespace ::com::sun::star;
#define C2U(cChar) rtl::OUString::createFromAscii(cChar)
/*--------------------------------------------------------------------
    Beschreibung:   Lingu-Dispatcher
 --------------------------------------------------------------------*/


void SwView::ExecLingu(SfxRequest &rReq)
{
    switch(rReq.GetSlot())
    {
        case FN_THESAURUS_DLG:
            StartThesaurus();
            break;
        case FN_SPELLING_DLG:
            SpellDocument( NULL, sal_False );
            break;
        case FN_ADD_UNKNOWN:
            {
                SpellDocument( NULL, sal_True );
            }
            break;
        case FN_HYPHENATE_OPT_DLG:
            HyphenateDocument();
            break;
        default:
            ASSERT(!this, falscher Dispatcher);
            return;
    }
}

/*--------------------------------------------------------------------
     Beschreibung: SpellCheck starten
 --------------------------------------------------------------------*/


void SwView::SpellDocument( const String* pStr, sal_Bool bAllRight )
{
    // do not spell if interactive spelling is active elsewhere
    if (GetWrtShell().HasSpellIter())
    {
        MessBox( 0, WB_OK, String( SW_RES( STR_SPELL_TITLE ) ),
                String( SW_RES( STR_MULT_INTERACT_SPELL_WARN ) ) ).Execute();
        return;
    }

    SfxErrorContext aContext( ERRCTX_SVX_LINGU_SPELLING, aEmptyStr, pEditWin,
         RID_SVXERRCTX, DIALOG_MGR() );

    uno::Reference< linguistic::XSpellChecker1 >  xSpell = ::GetSpellChecker();
    if(!xSpell.is())
    {   // keine Arme keine Kekse
        ErrorHandler::HandleError( ERRCODE_SVX_LINGU_LINGUNOTEXISTS );
        return;
    }
    SpellKontext(sal_True);

    SwViewOption* pVOpt = (SwViewOption*)pWrtShell->GetViewOptions();
    sal_Bool bOldIdle = pVOpt->IsIdle();
    pVOpt->SetIdle( sal_False );

    sal_Bool bOldIns = pWrtShell->IsInsMode();
    pWrtShell->SetInsMode( sal_True );

    // den eigentlichen Inhalt pruefen
    _SpellDocument( pStr, bAllRight );

    pWrtShell->SetInsMode( bOldIns );

    SpellKontext(sal_False);

    // Ignorieren und ersetzen nur fuer einen Durchgang
    // im Zuge des OnlineSpellings wollen wir die IgnoreList beibehalten
    if (SvxGetChangeAllList().is())
        SvxGetChangeAllList()->clear();
    SvxSaveDictionaries( SvxGetDictionaryList() );

    pVOpt->SetIdle( bOldIdle );
    //SW_MOD()->CheckSpellChanges( sal_False, );

    // SpellCache loeschen, Speicher freigeben.
    // wg. Absturz in W95 verzichten wir auf die Freigabe...
//  pSpell->FlushAllLanguages();
}

/*--------------------------------------------------------------------
    Beschreibung:   Interne SpellFunktion
 --------------------------------------------------------------------*/


void SwView::_SpellDocument( const String* pStr, sal_Bool bAllRight )
{
    sal_Bool bSelection = ((SwCrsrShell*)pWrtShell)->HasSelection() ||
        pWrtShell->GetCrsr() != pWrtShell->GetCrsr()->GetNext();

    uno::Reference< linguistic::XSpellChecker1 >  xSpell = ::GetSpellChecker();
    uno::Reference< beans::XPropertySet >  xProp( ::GetLinguPropertySet() );
    sal_Bool bIsWrapReverse  = xProp.is() ?
            *(sal_Bool*)xProp->getPropertyValue( C2U(UPN_IS_WRAP_REVERSE) ).getValue() : sal_False;
    sal_Bool bIsSpellSpecial = xProp.is() ?
            *(sal_Bool*)xProp->getPropertyValue( C2U(UPN_IS_SPELL_SPECIAL) ).getValue() : sal_True;

    sal_Bool    bStart = bSelection || ( bIsWrapReverse ?
                        pWrtShell->IsEndOfDoc() : pWrtShell->IsStartOfDoc() );
    sal_Bool    bOther = !bSelection && !(pWrtShell->GetFrmType(0,sal_True) & FRMTYPE_BODY);

    if( bOther && !bIsSpellSpecial )
    // kein Sonderbereich eingeschaltet
    {
        // Ich will auch in Sonderbereichen trennen
        QueryBox aBox( &GetEditWin(), SW_RES( DLG_SPECIAL_FORCED ) );
        if( aBox.Execute() == RET_YES  &&  xProp.is())
        {
            sal_Bool bTrue = sal_True;
            uno::Any aTmp(&bTrue, ::getBooleanCppuType());
            xProp->setPropertyValue( C2U(UPN_IS_SPELL_SPECIAL), aTmp );
        }
        else
            return; // Nein Es wird nicht gespellt
    }
    if( bAllRight )
    {
// nothing to be
//      pSpell->SetAllRight( bAllRight );
//      pSpell->NewDic( pStr ? *pStr : (const String&) aEmptyStr, LANGUAGE_NOLANGUAGE, sal_False );
    }
    {
        SvxDicListChgClamp aClamp( SvxGetDictionaryList() );
        SwSpellWrapper aWrap( this, xSpell, bStart, bAllRight,
                              bOther, bSelection );
        aWrap.SpellDocument();
    }
//  pSpell->SetAllRight( sal_False );

}


void SwView::SpellStart( SvxSpellArea eWhich, sal_Bool bStartDone, sal_Bool bEndDone )
{
    uno::Reference< beans::XPropertySet >  xProp( ::GetLinguPropertySet() );
    sal_Bool bIsWrapReverse = xProp.is() ?
            *(sal_Bool*)xProp->getPropertyValue( C2U(UPN_IS_WRAP_REVERSE) ).getValue() : sal_False;

    SwDocPositions eStart = DOCPOS_START;
    SwDocPositions eEnde  = DOCPOS_END;
    SwDocPositions eCurr  = DOCPOS_CURR;
    switch ( eWhich )
    {
        case SVX_SPELL_BODY:
            if( bIsWrapReverse )
                eCurr = DOCPOS_END;
            else
                eCurr = DOCPOS_START;
            break;
        case SVX_SPELL_BODY_END:
            if( bIsWrapReverse )
            {
                if( bStartDone )
                    eStart = DOCPOS_CURR;
                eCurr = DOCPOS_END;
            }
            else if( bStartDone )
                eCurr = DOCPOS_START;
            break;
        case SVX_SPELL_BODY_START:
            if( !bIsWrapReverse )
            {
                if( bEndDone )
                    eEnde = DOCPOS_CURR;
                eCurr = DOCPOS_START;
            }
            else if( bEndDone )
                eCurr = DOCPOS_END;
            break;
        case SVX_SPELL_OTHER:
            if( bIsWrapReverse )
            {
                eStart = DOCPOS_OTHERSTART;
                eEnde  = DOCPOS_OTHEREND;
                eCurr = DOCPOS_OTHEREND;
            }
            else
            {
                eStart = DOCPOS_OTHERSTART;
                eEnde  = DOCPOS_OTHEREND;
                eCurr = DOCPOS_OTHERSTART;
            }
            break;
        default:
            ASSERT( !this, "SpellStart with unknown Area" );
    }
    pWrtShell->SpellStart( eStart, eEnde, eCurr );
}

/*--------------------------------------------------------------------
    Beschreibung: Fehlermeldung beim Spelling
 --------------------------------------------------------------------*/


// Der uebergebene Pointer nLang ist selbst der Wert
IMPL_LINK( SwView, SpellError, void *, nLang )
{
#ifdef DEBUG
    sal_Bool bFocus = GetEditWin().HasFocus();
#endif
    sal_uInt16 nPend = 0;

    if ( pWrtShell->ActionPend() )
    {
        pWrtShell->Push();
        pWrtShell->ClearMark();
        do
        {
            pWrtShell->EndAction();
            ++nPend;
        }
        while( pWrtShell->ActionPend() );
    }
    LanguageType eLang = (LanguageType)(sal_uInt32)nLang;
    String aErr(::GetLanguageString( eLang ) );

    SwEditWin &rEditWin = GetEditWin();
#ifdef DEBUG
    bFocus = rEditWin.HasFocus();
#endif
    sal_uInt16 nWaitCnt = 0;
    while( rEditWin.IsWait() )
    {
        rEditWin.LeaveWait();
        ++nWaitCnt;
    }
    if ( LANGUAGE_NONE == eLang )
        ErrorHandler::HandleError( ERRCODE_SVX_LINGU_NOLANGUAGE );
    else
        ErrorHandler::HandleError( *new StringErrorInfo( ERRCODE_SVX_LINGU_LANGUAGENOTEXISTS, aErr ) );

    while( nWaitCnt )
    {
        rEditWin.EnterWait();
        --nWaitCnt;
    }
#ifdef DEBUG
    bFocus = GetEditWin().HasFocus();
#endif

    if ( nPend )
    {
        while( nPend-- )
            pWrtShell->StartAction();
        pWrtShell->Combine();
    }
#ifdef DEBUG
    if( !bFocus )
        GetEditWin().GrabFocus();
#endif

    return 0;
}

/*--------------------------------------------------------------------
     Beschreibung: Spelling beenden und Cursor wiederherstellen
 --------------------------------------------------------------------*/


void SwView::SpellEnd()
{
    pWrtShell->SpellEnd();
    if( pWrtShell->IsExtMode() )
        pWrtShell->SetMark();
}


void SwView::HyphStart( SvxSpellArea eWhich )
{
    switch ( eWhich )
    {
        case SVX_SPELL_BODY:
            pWrtShell->HyphStart( DOCPOS_START, DOCPOS_END );
            break;
        case SVX_SPELL_BODY_END:
            pWrtShell->HyphStart( DOCPOS_CURR, DOCPOS_END );
            break;
        case SVX_SPELL_BODY_START:
            pWrtShell->HyphStart( DOCPOS_START, DOCPOS_CURR );
            break;
        case SVX_SPELL_OTHER:
            pWrtShell->HyphStart( DOCPOS_OTHERSTART, DOCPOS_OTHEREND );
            break;
        default:
            ASSERT( !this, "HyphStart with unknown Area" );
    }
}

/*--------------------------------------------------------------------
     Beschreibung: Interaktive Trennung
 --------------------------------------------------------------------*/


void SwView::HyphenateDocument()
{
    // do not hyphenate if interactive hyphenationg is active elsewhere
    if (GetWrtShell().HasHyphIter())
    {
        MessBox( 0, WB_OK, String( SW_RES( STR_HYPH_TITLE ) ),
                String( SW_RES( STR_MULT_INTERACT_HYPH_WARN ) ) ).Execute();
        return;
    }

    SfxErrorContext aContext( ERRCTX_SVX_LINGU_HYPHENATION, aEmptyStr, pEditWin,
         RID_SVXERRCTX, DIALOG_MGR() );

    uno::Reference< linguistic::XHyphenator >  xHyph( ::GetHyphenator() );
    if (!xHyph.is())
    {
        ErrorHandler::HandleError( ERRCODE_SVX_LINGU_LINGUNOTEXISTS );
        return;
    }

    if (pWrtShell->GetSelectionType() & (SwWrtShell::SEL_DRW_TXT|SwWrtShell::SEL_DRW))
    {
        // Silbentrennung in einem Draw-Objekt
        HyphenateDrawText();
    }
    else
    {
        SwViewOption* pVOpt = (SwViewOption*)pWrtShell->GetViewOptions();
        sal_Bool bOldIdle = pVOpt->IsIdle();
        pVOpt->SetIdle( sal_False );

        uno::Reference< beans::XPropertySet >  xProp( ::GetLinguPropertySet() );


        pWrtShell->StartUndo(UNDO_INSATTR);         // spaeter gueltig

        sal_Bool bHyphSpecial = xProp.is() ?
                *(sal_Bool*)xProp->getPropertyValue( C2U(UPN_IS_HYPH_SPECIAL) ).getValue() : sal_False;
        sal_Bool bSelection = ((SwCrsrShell*)pWrtShell)->HasSelection() ||
            pWrtShell->GetCrsr() != pWrtShell->GetCrsr()->GetNext();
        sal_Bool bOther = pWrtShell->HasOtherCnt() && bHyphSpecial && !bSelection;
        sal_Bool bStart = bSelection || ( !bOther && pWrtShell->IsStartOfDoc() );
        sal_Bool bStop = sal_False;
        if( !bOther && !(pWrtShell->GetFrmType(0,sal_True) & FRMTYPE_BODY) && !bSelection )
        // kein Sonderbereich eingeschaltet
        {
            // Ich will auch in Sonderbereichen trennen
            QueryBox aBox( &GetEditWin(), SW_RES( DLG_SPECIAL_FORCED ) );
            if( aBox.Execute() == RET_YES )
            {
                bOther = sal_True;
                if (xProp.is())
                {
                    sal_Bool bTrue = sal_True;
                    uno::Any aTmp(&bTrue, ::getBooleanCppuType());
                    xProp->setPropertyValue( C2U(UPN_IS_HYPH_SPECIAL), aTmp );
                }
            }
            else
                bStop = sal_True; // Nein Es wird nicht getrennt
        }

        if( !bStop )
        {
            SwHyphWrapper aWrap( this, xHyph, bStart, bOther, bSelection );
            aWrap.SpellDocument();
            pWrtShell->EndUndo(UNDO_INSATTR);
        }
        pVOpt->SetIdle( bOldIdle );
    }
}

/*--------------------------------------------------------------------
    Beschreibung:   Thesaurus starten
 --------------------------------------------------------------------*/


void SwView::StartThesaurus()
{
    if( pWrtShell->GetCrsr() != pWrtShell->GetCrsr()->GetNext() )
        return;
    sal_Bool bSelection = ((SwCrsrShell*)pWrtShell)->HasSelection();
    if( bSelection && !pWrtShell->IsSelOnePara() )
        return;

    SfxErrorContext aContext( ERRCTX_SVX_LINGU_THESAURUS, aEmptyStr, pEditWin,
         RID_SVXERRCTX, DIALOG_MGR() );

    // Sprache rausholen
    //
    SfxItemSet aSet(pShell->GetPool(), RES_CHRATR_LANGUAGE, RES_CHRATR_LANGUAGE);
    pWrtShell->GetAttr(aSet);

    const SvxLanguageItem& rLang = (const SvxLanguageItem&)aSet.Get(
                                            RES_CHRATR_LANGUAGE );
    LanguageType eLang = rLang.GetLanguage();
    if ( ( eLang == LANGUAGE_SYSTEM ) &&
         ( ((eLang=GetpApp()->GetAppInternational().GetLanguage())==LANGUAGE_SYSTEM )
         && ( ( eLang=::GetSystemLanguage() ) == LANGUAGE_SYSTEM ) ) )
        eLang = LANGUAGE_DONTKNOW;

    if ( eLang == LANGUAGE_DONTKNOW || eLang == LANGUAGE_NONE )
    {
        SpellError( (void *) LANGUAGE_NONE );
        return;
    }

    SwViewOption* pVOpt = (SwViewOption*)pWrtShell->GetViewOptions();
    sal_Bool bOldIdle = pVOpt->IsIdle();
    pVOpt->SetIdle( sal_False );

#ifdef TL_NEVER
//!!! hier muß noch was getan werden... (Umsetzung der Funktionalitaet)
    // ErrorLink setzen, alten merken
    Link aOldLnk = pSpell->ChgErrorLink(LINK(this, SwView, SpellError));
#endif


    // get initial LookUp text
    String aTmp = bSelection ?
        pWrtShell->GetSelTxt() : pWrtShell->GetCurWord();

    uno::Reference< linguistic::XThesaurus >  xThes( OFF_APP()->GetThesaurus() );
    SvxThesaurusDialog *pDlg = NULL;

    if ( !xThes.is() || !xThes->hasLocale( SvxCreateLocale( eLang ) ) )
    {
        SpellError( (void *) eLang );
    }
    else
    {
        // create dialog
        {   //Scope for SwWait-Object
            SwWait aWait( *GetDocShell(), sal_True );
            pDlg = new SvxThesaurusDialog( &GetEditWin(),
                                           xThes, aTmp, eLang );
        }

        {
            // Hier wird der Thesaurus-Dialog im Applikationsfenster zentriert,
            // und zwar oberhalb oder unterhalb der Cursorposition, je nachdem,
            // wo mehr Platz ist.

            // Current Word:
            SwRect aRect( pWrtShell->GetCharRect() );
            Point aTopPos = aRect.Pos();
            Point aBtmPos( aTopPos.X(), aRect.Bottom() );
            aTopPos = GetEditWin().LogicToPixel( aTopPos );
            aTopPos = GetEditWin().OutputToScreenPixel( aTopPos );
            aBtmPos = GetEditWin().LogicToPixel( aBtmPos );
            aBtmPos = GetEditWin().OutputToScreenPixel( aBtmPos );
            // ::frame::Desktop:
            Rectangle aRct = GetEditWin().GetDesktopRectPixel();
            Point aWinTop( aRct.TopLeft() );
            Point aWinBtm( aRct.BottomRight() );
            if ( aTopPos.Y() - aWinTop.Y() > aWinBtm.Y() - aBtmPos.Y() )
                aWinBtm.Y() = aTopPos.Y();
            else
                aWinTop.Y() = aBtmPos.Y();

            Size aSz = pDlg->GetSizePixel();
            if ( aWinBtm.Y() - aWinTop.Y() > aSz.Height() )
            {
                aWinTop.X() = ( aWinTop.X() + aWinBtm.X() - aSz.Width() ) / 2;
                aWinTop.Y() = ( aWinTop.Y() + aWinBtm.Y() - aSz.Height() ) / 2;
                pDlg->SetPosPixel( aWinTop );
            }
        }

        if ( pDlg->Execute()== RET_OK )
        {
            sal_Bool bOldIns = pWrtShell->IsInsMode();
            pWrtShell->SetInsMode( sal_True );

            pWrtShell->StartAllAction();
            pWrtShell->StartUndo(UNDO_DELETE);

            if( !bSelection )
            {
                if(!pWrtShell->IsInWrd() && !pWrtShell->IsEndWrd() &&
                    !pWrtShell->IsSttWrd())
                    pWrtShell->PrvWrd();

                if(pWrtShell->IsEndWrd())
                    pWrtShell->Left();

                pWrtShell->SelWrd();
            }
#ifdef TL_NEVER
            String aTmp(pThes->GetPreStripped());
            aTmp += pDlg->GetWord();
            aTmp += pThes->GetPostStripped();

            pWrtShell->Insert(aTmp);
#endif
            pWrtShell->Insert( pDlg->GetWord() );

            pWrtShell->EndUndo(UNDO_DELETE);
            pWrtShell->EndAllAction();

            pWrtShell->SetInsMode( bOldIns );

        }
    }

    delete pDlg;

#ifdef TL_NEVER
    pSpell->ChgErrorLink( aOldLnk );
#endif
    pVOpt->SetIdle( bOldIdle );

}

/*--------------------------------------------------------------------
    Beschreibung:   Online-Vorschlaege anbieten
 *--------------------------------------------------------------------*/


sal_Bool SwView::ExecSpellPopup(const Point& rPt)
{
    sal_Bool bRet = sal_False;
    const SwViewOption* pVOpt = pWrtShell->GetViewOptions();
    if( pVOpt->IsOnlineSpell() &&
        !pVOpt->IsHideSpell() &&
        !pWrtShell->IsSelection())
    {
        if (pWrtShell->GetSelectionType() & SwWrtShell::SEL_DRW_TXT)
            bRet = ExecDrwTxtSpellPopup(rPt);
        else if (!pWrtShell->IsSelFrmMode())
        {
            const sal_Bool bOldViewLock = pWrtShell->IsViewLocked();
            pWrtShell->LockView( sal_True );
            pWrtShell->Push();
            uno::Reference< linguistic::XSpellAlternatives >  xAlt( pWrtShell->GetCorrection(&rPt) );
            if ( xAlt.is() )
            {
                bRet = sal_True;
                pWrtShell->SttSelect();
                SwSpellPopup aPopup( pWrtShell, xAlt );
                aPopup.Execute(
                pEditWin,
                rPt);
            }

            pWrtShell->Pop( sal_False );
            pWrtShell->LockView( bOldViewLock );
        }
    }
    return bRet;
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.135  2000/09/18 16:06:13  willem.vandorp
    OpenOffice header added.

    Revision 1.134  2000/08/11 12:41:54  tl
    #73640# no double interactive spelling/hyphenation, just show warning message

    Revision 1.133  2000/07/04 15:19:51  tl
    XHyphenator1 => XHyphenator

    Revision 1.132  2000/05/26 07:21:35  os
    old SW Basic API Slots removed

    Revision 1.131  2000/03/30 13:02:17  os
    include

    Revision 1.130  2000/03/23 07:50:25  os
    UNO III

    Revision 1.129  2000/03/03 15:17:04  os
    StarView remainders removed

    Revision 1.128  2000/02/16 21:01:05  tl
    #72219# Locale Umstellung

    Revision 1.127  2000/02/11 14:59:35  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.126  2000/02/07 13:28:12  tl
    #72445# bAllRight passed as argument to spell-wrapper

    Revision 1.125  2000/01/11 10:37:42  tl
    #70735# CheckSpellChanges called from SW_MOD for ONE_LINGU; used SvxDicListChgClamp

    Revision 1.124  1999/12/10 13:09:48  tl
    #70383# SvxGetLinguPropertySet => ::GetLinguPropertySet

    Revision 1.123  1999/11/24 18:37:41  tl
    check for Service availability

    Revision 1.122  1999/11/19 16:40:24  os
    modules renamed

    Revision 1.121  1999/11/16 14:40:58  hr
    #65293#: syntax

    Revision 1.120  1999/11/10 11:10:56  tl
    Ongoing ONE_LINGU implementation

    Revision 1.119  1999/10/25 19:44:24  tl
    ongoing ONE_LINGU implementation

    Revision 1.118  1999/10/12 16:05:24  mh
    chg: include

    Revision 1.117  1999/08/31 08:40:00  TL
    #if[n]def ONE_LINGU inserted (for transition of lingu to StarOne)


      Rev 1.116   31 Aug 1999 10:40:00   TL
   #if[n]def ONE_LINGU inserted (for transition of lingu to StarOne)

      Rev 1.115   24 Aug 1999 14:55:20   TL
   Lingu StarOne interface selectable with define ONE_LINGU

      Rev 1.114   20 Aug 1999 16:08:42   TL
   Switched to StarOne Thesaurus interface

      Rev 1.113   08 Jul 1999 18:45:24   MA
   Use internal object to toggle wait cursor

      Rev 1.112   26 May 1999 14:45:24   HJS
   fuer os2 umgebaut

      Rev 1.111   11 May 1999 14:14:14   AMA
   Fix #65174#: Thesaurus-Fehlermeldung, wenn keine Sprache eingstellt ist.

      Rev 1.110   10 May 1999 14:16:32   AMA
   Fix #65176#: Bei der Lingu-Fehlermeldung keine Sanduhr anzeigen

      Rev 1.109   27 Nov 1998 14:58:04   AMA
   Fix #59951#59825#: Unterscheiden zwischen Rahmen-,Seiten- und Bereichsspalten

      Rev 1.108   25 Aug 1998 14:01:42   OM
   #55404# Linguistik-Popup auf bei DrawText-Objekten aufrufen

      Rev 1.107   24 Feb 1998 15:29:08   JP
   Search..: SWPOSDOC entfernt, auf enums umgestellt

      Rev 1.106   17 Dec 1997 16:28:42   ER
   cast fuer IRIX

      Rev 1.105   03 Dec 1997 17:10:34   AMA
   Fix: Paintprobleme durch Actionklammerung bei automatischer Trennung

      Rev 1.104   29 Nov 1997 16:48:38   MA
   includes

      Rev 1.103   21 Nov 1997 15:00:20   MA
   includes

      Rev 1.102   27 Oct 1997 12:01:14   AMA
   Fix #44941#: Thesaurus bei prueft und ersetzt Selektionen genau.

      Rev 1.101   13 Oct 1997 19:10:08   JP
   pNext vom Ring wurde privat; zugriff ueber GetNext()

      Rev 1.100   30 Sep 1997 16:53:50   TJ
   include

      Rev 1.99   12 Sep 1997 10:36:10   OS
   ITEMID_* definiert

      Rev 1.98   11 Sep 1997 12:18:18   AMA
   Fix #43379# hier unnoetig, denn SpellArgs werden jetzt richtig initialisiert

      Rev 1.97   04 Sep 1997 17:14:46   MA
   includes

      Rev 1.96   02 Sep 1997 14:38:06   AMA
   Fix #43379#: Spezialbereiche nur pruefen, wenn sie angezeigt werden.

      Rev 1.95   29 Aug 1997 16:00:36   OS
   PopupMenu::Execute mit Window* fuer VCL

      Rev 1.94   15 Aug 1997 11:48:00   OS
   chartar/frmatr/txtatr aufgeteilt

      Rev 1.93   11 Aug 1997 10:17:52   OS
   paraitem/frmitems/textitem aufgeteilt

      Rev 1.92   08 Aug 1997 17:26:14   OM
   Headerfile-Umstellung

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/uiview/viewmdi.cxx b/sw/source/ui/uiview/viewmdi.cxx
new file mode 100644
index 0000000..bc8a946
--- /dev/null
+++ b/sw/source/ui/uiview/viewmdi.cxx
@@ -0,0 +1,890 @@
/*************************************************************************
 *
 *  $RCSfile: viewmdi.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:49 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include <string> // HACK: prevent conflict between STLPORT and Workshop headers

#include "hintids.hxx"
#include "uiparam.hxx"

#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SVX_RULER_HXX //autogen
#include <svx/ruler.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_SRCHITEM_HXX //autogen
#include <svx/srchitem.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif


#include "swmodule.hxx"
#include "view.hxx"
#include "wrtsh.hxx"
#include "viewopt.hxx"
#include "frmatr.hxx"
#include "globals.hrc"
#include "docsh.hxx"
#include "uitool.hxx"
#include "cmdid.h"
#include "edtwin.hxx"
#include "pagedesc.hxx"
#include "bookmrk.hxx"
#include "fldbas.hxx"
#include "workctrl.hxx"
#include "usrpref.hxx"
#include "scroll.hxx"
#include "wview.hxx"
#include "view.hrc"
#include "ribbar.hrc"
#include "helpid.h"

USHORT          SwView::nMoveType = NID_PGE;
BYTE            SwView::nActMark = 0;

#define VIEW_IMAGECOLOR COL_LIGHTBLUE

void SwView::SetZoom( SvxZoomType eZoomType, short nFactor, BOOL bViewOnly )
{
    _SetZoom( GetEditWin().GetOutputSizePixel(), eZoomType, nFactor, bViewOnly );
}

void SwView::_SetZoom( const Size &rEditSize, SvxZoomType eZoomType,
                            short nFactor, BOOL bViewOnly )
{
    pWrtShell->LockPaint();
    {
    ACT_KONTEXT(pWrtShell);

    long nFac = nFactor;

    BOOL bWeb = 0 != PTR_CAST(SwWebView, this);
    SwMasterUsrPref *pUsrPref = (SwMasterUsrPref*)SW_MOD()->GetUsrPref(bWeb);

    const SwPageDesc &rDesc = pWrtShell->GetPageDesc(
                                                pWrtShell->GetCurPageDesc() );
    const SvxLRSpaceItem &rLRSpace = rDesc.GetMaster().GetLRSpace();
    const SwViewOption *pOpt = pWrtShell->GetViewOptions();
    long lLeftMargin;

    if( eZoomType != SVX_ZOOM_PERCENT )
    {
        const long nOf = DOCUMENTBORDER * 2L;
        Size aPageSize( pWrtShell->GetAnyCurRect(RECT_PAGE_CALC).SSize() );

        if( PD_MIRROR == rDesc.GetUseOn() ) // gespiegelte Seiten
        {
            const SvxLRSpaceItem &rLeftLRSpace = rDesc.GetLeft().GetLRSpace();
            aPageSize.Width() +=
                Abs( long(rLeftLRSpace.GetLeft()) - long(rLRSpace.GetLeft()) );
        }
        if( SVX_ZOOM_OPTIMAL == eZoomType )
        {
            aPageSize.Width() -=
                ( rLRSpace.GetLeft() + rLRSpace.GetRight() + nLeftOfst * 2 );
        }
        else
        {
            aPageSize.Width() += nOf;
            aPageSize.Height() += nOf;
        }
        lLeftMargin = SVX_ZOOM_PAGEWIDTH != eZoomType ?
            long(rLRSpace.GetLeft()) + DOCUMENTBORDER + nLeftOfst : 0L;

        const MapMode aTmpMap( MAP_TWIP );
        const Size aWindowSize( GetEditWin().PixelToLogic( rEditSize, aTmpMap ) );
        nFac = aWindowSize.Width() * 100 / aPageSize.Width();
        if( SVX_ZOOM_WHOLEPAGE == eZoomType )
        {
            long nVisPercent = aWindowSize.Height() * 100 / aPageSize.Height();
            nFac = Min( nFac, nVisPercent );
        }
    }
    else
        lLeftMargin = long(rLRSpace.GetLeft()) + DOCUMENTBORDER;

    nFac = Max( long( MINZOOM ), nFac );

    SwViewOption aOpt( *pOpt );
    SwDocShell* pDocShell = GetDocShell();
    if ( pDocShell->GetProtocol().IsEmbed() ||
         pDocShell->GetCreateMode() == SFX_CREATE_MODE_STANDARD  )
    {
        //MasterUsrPrefs updaten UND DANACH die ViewOptions der aktuellen
        //View updaten.
        if ( !bViewOnly &&
                (USHORT(nFac)      != pUsrPref->GetZoom() ||
                BYTE  (eZoomType) != pUsrPref->GetZoomType()) )
        {
            pUsrPref->SetZoom    ( USHORT(nFac) );
            pUsrPref->SetZoomType( BYTE( eZoomType ) );
            SW_MOD()->ApplyUsrPref( *pUsrPref, 0 );
            pUsrPref->SetDefault ( FALSE );
        }
        if ( pOpt->GetZoom() != (USHORT) nFac )
        {
            aOpt.SetZoom    ( USHORT(nFac) );
            aOpt.SetReadonly(pOpt->IsReadonly());
            pWrtShell->ApplyViewOptions( aOpt );
        }
        if ( eZoomType != SVX_ZOOM_PERCENT )
        {
            Point aPos;
            if ( eZoomType == SVX_ZOOM_WHOLEPAGE )
                aPos.Y() = pWrtShell->GetAnyCurRect(RECT_PAGE).Top() - DOCUMENTBORDER;
            else
            {
                //sicherstellen, dass sich der Cursor im sichtbaren
                //Bereich befindet, damit nur 1x gescrollt wird
                aPos.X() = lLeftMargin;
                const SwRect &rCharRect = pWrtShell->GetCharRect();
                if ( rCharRect.Top() > GetVisArea().Bottom() ||
                     rCharRect.Bottom() < aPos.Y() )
                    aPos.Y() = rCharRect.Top() - rCharRect.Height();
                else
                    aPos.Y() = GetVisArea().Top();
            }
            SetVisArea( aPos );
        }
        // OS: Notloesung - in CalcVisArea wird u.U. wieder SetZoom gerufen und
        // dann werden falsche Werte eingestellt
        ((SwViewOption*)pWrtShell->GetViewOptions())->SetZoomType((BYTE)eZoomType);
        CalcVisArea( rEditSize );   //fuer das Neuberechnen des sichtbaren Bereiches
    }
    else if ( USHORT(nFac) != pOpt->GetZoom() )
    {
        aOpt.SetZoom    ( USHORT(nFac) );
        pWrtShell->ApplyViewOptions( aOpt );
    }

    const Fraction aFrac( nFac, 100 );
    if ( pVLineal )
    {
        pVLineal->SetZoom( aFrac );
        pVLineal->ForceUpdate();
    }
    if ( pHLineal )
    {
        pHLineal->SetZoom( aFrac );
        pHLineal->ForceUpdate();
    }
    ((SwViewOption*)pWrtShell->GetViewOptions())->SetZoomType((BYTE)eZoomType);
    }
    pWrtShell->UnlockPaint();
//  eZoom = eZoomType;
}

/*
 * Scrollbar - Handler
 */

int SwView::_CreateScrollbar( int bHori )
{
    Window *pMDI = &GetViewFrame()->GetWindow();
    SwScrollbar** ppScrollbar = bHori ? &pHScrollbar : &pVScrollbar;

    ASSERT( !*ppScrollbar, "vorher abpruefen!" )

    if( !bHori )
        CreatePageButtons( !bShowAtResize );

    // wenn beide Scrollbar eingeschaltet werden, dann auch die ScrollbarBox
    // anlegen
    if( !pScrollFill && (bHori ? pVScrollbar : pHScrollbar) )
    {
        pScrollFill = new ScrollBarBox( pMDI, GetDocShell()->IsInFrame()
                                                ? 0 : WB_SIZEABLE );
        if ( !bShowAtResize )
            pScrollFill->Show();
    }

    *ppScrollbar = new SwScrollbar( pMDI, bHori );
    UpdateScrollbars();
    if(bHori)
        (*ppScrollbar)->SetScrollHdl( LINK( this, SwView, EndScrollHdl ));
    else
        (*ppScrollbar)->SetScrollHdl( LINK( this, SwView, ScrollHdl ));
    (*ppScrollbar)->SetEndScrollHdl( LINK( this, SwView, EndScrollHdl ));

    (*ppScrollbar)->EnableDrag( TRUE );
    (*ppScrollbar)->SetAuto( pWrtShell->IsBrowseMode() &&
                             !GetDocShell()->GetProtocol().IsInPlaceActive() );

    InvalidateBorder();

    // Scrollbar muss nochmals getestet werden, da im InvalidateBorder u.U. der
    // Scrollbar wieder geloescht wurde
    if ( !bShowAtResize && (*ppScrollbar))
        (*ppScrollbar)->Show();

    return 1;
}

void SwView::CreatePageButtons(BOOL bShow)
{
    Window *pMDI = &GetViewFrame()->GetWindow();
    pPageUpBtn      = new SwHlpImageButton(pMDI, SW_RES( BTN_PAGEUP ), TRUE );
    pPageUpBtn->SetHelpId(HID_SCRL_PAGEUP);
    pPageDownBtn    = new SwHlpImageButton(pMDI, SW_RES( BTN_PAGEDOWN ), FALSE );
    pPageDownBtn->SetHelpId(HID_SCRL_PAGEDOWN);
    pNaviBtn = new SwNaviImageButton(pMDI);
    pNaviBtn->SetHelpId(HID_SCRL_NAVI);
    Link aLk( LINK( this, SwView, BtnPage ) );
    pPageUpBtn->SetClickHdl( aLk );
    pPageDownBtn->SetClickHdl( aLk );
    if(nMoveType != NID_PGE)
    {
        Color aColor(VIEW_IMAGECOLOR);
        SetImageButtonColor(aColor);
    }

    if(bShow)
    {
        pPageUpBtn->Show();
        pPageDownBtn->Show();
        pNaviBtn->Show();
    }
};

int SwView::_KillScrollbar( int bHori )
{
    SwScrollbar** ppScrBar;
    if( bHori )
    {
        if( 0 == *( ppScrBar = &pHScrollbar ) )
            return 1;
    }
    else
    {
        if( 0 == *( ppScrBar = &pVScrollbar ) )
            return 1;
        DELETEZ(pNaviBtn);
        DELETEZ(pPageUpBtn);
        DELETEZ(pPageDownBtn);
    }
    DELETEZ( *ppScrBar );

    // wird einer der Scrollbar ausgeschaltet, muss auch die ScrollbarBox
    // entfernt werden
    if( pScrollFill )
        DELETEZ( pScrollFill );

    InvalidateBorder();
    return 1;
}

/*
 * Button-Handler
 */
IMPL_LINK( SwView, BtnPage, Button *, pButton )
{
    MoveNavigation(pButton == pPageDownBtn);
    return 0;
}
/*-----------------20.06.97 10:46-------------------

--------------------------------------------------*/
void SwView::MoveNavigation(BOOL bNext)
{
    SwWrtShell& rSh = GetWrtShell();
    switch( nMoveType )
    {
        case NID_PGE:
            bNext ? PhyPageDown() : PhyPageUp();
        break;
        case NID_TBL :
            rSh.EnterStdMode();
            if(bNext)
                rSh.MoveTable(fnTableNext, fnTableStart);
            else
                rSh.MoveTable(fnTablePrev, fnTableStart);
        break;
        case NID_FRM :
        case NID_GRF:
        case NID_OLE:
        {
            FlyCntType eType = FLYCNTTYPE_FRM;
            if(nMoveType == NID_GRF)
                eType = FLYCNTTYPE_GRF;
            else if(nMoveType == NID_OLE)
                eType = FLYCNTTYPE_OLE;
            BOOL bSuccess = bNext ?
                    rSh.GotoNextFly(eType) :
                        rSh.GotoPrevFly(eType);
            if(bSuccess)
            {
                rSh.HideCrsr();
                rSh.EnterSelFrmMode();
            }
        }
        break;
        case NID_DRW :
        case NID_CTRL:
            rSh.GotoObj(bNext,
                    nMoveType == NID_DRW ?
                        DRAW_SIMPLE :
                            DRAW_CONTROL);
        break;
        case NID_REG :
            rSh.EnterStdMode();
            if(bNext)
                rSh.MoveRegion(fnRegionNext, fnRegionStart);
            else
                rSh.MoveRegion(fnRegionPrev, fnRegionStart);

        break;
        case NID_BKM :
            rSh.EnterStdMode();
            GetViewFrame()->GetDispatcher()->Execute(bNext ?
                                        FN_NEXT_BOOKMARK :
                                            FN_PREV_BOOKMARK);
        break;
        case NID_OUTL:
            rSh.EnterStdMode();
            bNext ? rSh.GotoNextOutline() : rSh.GotoPrevOutline();
        break;
        case NID_SEL :
            bNext ? rSh.GoNextCrsr() : rSh.GoPrevCrsr();
        break;
        case NID_FTN:
            rSh.EnterStdMode();
            bNext ?
                rSh.GotoNextFtnAnchor() :
                    rSh.GotoPrevFtnAnchor();
        break;
        case NID_MARK:
        {
            // Selektionen aufheben
            rSh.MoveCrsr();
            rSh.EnterStdMode();
            const USHORT nBookCnt = rSh.GetBookmarkCnt();
            USHORT nMarkCount = 0;
            USHORT nRealIdx[MAX_MARKS];
            for( USHORT nCount = 0; nCount < nBookCnt; ++nCount )
            {
                if( rSh.GetBookmark( nCount ).IsMark() )
                {
                    nRealIdx[nMarkCount] = nCount;
                    ++nMarkCount;
                }
            }
            if (nMarkCount)
            {
                if(!bNext)
                {
                    if (nActMark > 1)
                        --nActMark;
                    else
                        nActMark = nMarkCount;
                }
                else
                {
                    ++nActMark;
                    if (nActMark > MAX_MARKS || nActMark > nMarkCount)
                        nActMark = 1;
                }

                rSh.GotoBookmark( nRealIdx[nActMark - 1] );
            }
        }
        break;
        case NID_POSTIT:
        {

            SwFieldType* pFldType = rSh.GetFldType(0, RES_POSTITFLD);
            rSh.MoveFldType( pFldType, bNext );
        }
        break;
        case NID_SRCH_REP:
        if(pSrchItem)
        {
            BOOL bBackward = pSrchItem->GetBackward();
            if(rSh.HasSelection() && !bNext == rSh.IsCrsrPtAtEnd())
                rSh.SwapPam();
            pSrchItem->SetBackward(!bNext);
            SfxRequest aReq(FN_REPEAT_SEARCH, SFX_CALLMODE_SLOT, GetPool());
            ExecSearch(aReq);
            pSrchItem->SetBackward(bBackward);
        }
        break;
        case NID_INDEX_ENTRY:
            rSh.GotoNxtPrvTOXMark(bNext);
        break;

        case NID_TABLE_FORMULA:
            rSh.GotoNxtPrvTblFormula( bNext );
            break;

        case NID_TABLE_FORMULA_ERROR:
            rSh.GotoNxtPrvTblFormula( bNext, TRUE );
            break;
    }
    pEditWin->GrabFocus();
}

/*************************************************************************
|*
|*  SwView::CreateTab()
|*
|*  Beschreibung
|*  Ersterstellung      VB 29.05.91
|*  Letzte Aenderung    OS 09.05.96
|*
*************************************************************************/

int SwView::_CreateTab()
{
    ASSERT( !StatTab(), "vorher abpruefen!" )

    pHLineal->SetActive(GetFrame() && IsActive());

    pHLineal->Show();
    InvalidateBorder();
    return 1;
}

/*************************************************************************
|*
|*  SwView::KillTab()
|*
|*  Beschreibung
|*  Ersterstellung      VB 29.05.91
|*  Letzte Aenderung    OS 09.05.96
|*
*************************************************************************/

int SwView::_KillTab()
{
    ASSERT( StatTab(), "vorher abpruefen!" )

    pHLineal->Hide();
//  DELETEZ(pHLineal);
    InvalidateBorder();
    return 1;
}

void SwView::ChangeTabMetric( FieldUnit eUnit )
{
    if ( pHLineal )
    {
        if(eUnit == FUNIT_MM)
            eUnit = FUNIT_CM;
        if(pHLineal->GetUnit() != eUnit )
        {
            pHLineal->SetUnit( eUnit );
            pHLineal->Invalidate();
        }
    }
}

void SwView::ChangeVLinealMetric( FieldUnit eUnit )
{
    if ( pVLineal )
    {
        if(eUnit == FUNIT_MM)
            eUnit = FUNIT_CM;
        if(pVLineal->GetUnit() != eUnit)
        {
            pVLineal->SetUnit( eUnit );
            pVLineal->Invalidate();
        }
    }
}

/*************************************************************************
|*
|*  SwView::CreateVLineal()
|*
|*  Beschreibung
|*  Ersterstellung  VB 29.05.91
|*  Letzte Aenderung  VB 19.05.92
|*
*************************************************************************/

int SwView::_CreateVLineal()
{
    ASSERT( !StatVLineal(), "vorher abpruefen!" )

    Window *pMDI = &GetViewFrame()->GetWindow();

    pVLineal = new SvxRuler(pMDI, pEditWin,
                            0,
                            GetViewFrame()->GetBindings(),
                            WB_VSCROLL |  WB_3DLOOK | WB_BORDER );
    if( pVLineal && pHLineal )
        pHLineal->SetBorderPos( pVLineal->GetSizePixel().Width()-1 );

    pVLineal->SetActive(GetFrame() && IsActive());
    const SwViewOption* pOpt = pWrtShell->GetViewOptions();
    pVLineal->SetZoom(Fraction(pOpt->GetZoom(), 100));
    BOOL bWeb = 0 != PTR_CAST(SwWebView, this);
    FieldUnit eMetric = ::GetDfltMetric(bWeb);
    if(eMetric == FUNIT_MM)
        eMetric = FUNIT_CM;
    pVLineal->SetUnit(eMetric);

    InvalidateBorder();
    if ( !bShowAtResize )
        pVLineal->Show();
    return 1;
}

/*************************************************************************
|*
|*  SwView::KillVLineal()
|*
|*  Beschreibung
|*  Ersterstellung  VB 29.05.91
|*  Letzte Aenderung  VB 29.05.91
|*
*************************************************************************/

int SwView::_KillVLineal()
{
    ASSERT( StatVLineal(), "vorher abpruefen!" )

    pVLineal->Hide();

    if ( pHLineal )
        pHLineal->SetBorderPos( 0 );

    DELETEZ(pVLineal);
    InvalidateBorder();
    return 1;
}
/*************************************************************************
|*
|*  SwView::ExecRulerClick()
|*
|*  Beschreibung
|*  Ersterstellung  OS 15.06.95
|*  Letzte Aenderung
|*
*************************************************************************/

IMPL_LINK( SwView, ExecRulerClick, Ruler *, pRuler )
{
    USHORT nDefPage = 0;
    switch( pRuler->GetClickType() )
    {
        case RULER_TYPE_DONTKNOW:
        case RULER_TYPE_OUTSIDE:
        case RULER_TYPE_INDENT:
        case RULER_TYPE_MARGIN1:
        case RULER_TYPE_MARGIN2:
            nDefPage = TP_PARA_STD;
        break;
        default:
            nDefPage = TP_TABULATOR;

    }

    SfxUInt16Item aDefPage(SID_PARA_DLG, nDefPage);
    GetViewFrame()->GetDispatcher()->Execute( SID_PARA_DLG,
                                SFX_CALLMODE_SYNCHRON|SFX_CALLMODE_RECORD,
                                &aDefPage, 0L );
    return 0;
}


/*-----------------20.02.97 09:11-------------------

--------------------------------------------------*/

USHORT SwView::GetMoveType()
{
    return nMoveType;
}
/*-----------------20.02.97 09:11-------------------

--------------------------------------------------*/

void SwView::SetMoveType(USHORT nSet)
{
    BOOL bLastPage = nMoveType == NID_PGE;
    nMoveType = nSet;
    BOOL bNewPage = nMoveType == NID_PGE;
    if(bNewPage != bLastPage)
    {
        Color aColor(bNewPage ? COL_BLACK : VIEW_IMAGECOLOR);
        const TypeId aTypeId = TYPE(SwView);
        SwView* pView = (SwView*)SfxViewShell::GetFirst(&aTypeId);
        while( pView )
        {
            pView->SetImageButtonColor(aColor);
            pView = (SwView*)SfxViewShell::GetNext(*pView, &aTypeId);
        }
    }
}

/*-----------------20.06.97 11:18-------------------

--------------------------------------------------*/
void SwView::SetActMark(BYTE nSet)
{
    nActMark = nSet;
}

/*-----------------15.03.97 10:53-------------------

--------------------------------------------------*/

void SwView::SetImageButtonColor(Color& rColor)
{
    if(pPageUpBtn)
    {
        pPageUpBtn->SetControlForeground(rColor);
        pPageDownBtn->SetControlForeground(rColor);
    }
}


/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.126  2000/09/18 16:06:13  willem.vandorp
    OpenOffice header added.

    Revision 1.125  2000/09/07 15:59:33  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.124  2000/05/24 13:13:57  hr
    conflict between STLPORT and Workshop header

    Revision 1.123  2000/05/10 11:53:20  os
    Basic API removed

    Revision 1.122  2000/03/03 15:17:04  os
    StarView remainders removed

    Revision 1.121  1999/07/20 07:44:28  OS
    #67585# ZoomValue/ZoomType :SetZoom changed


      Rev 1.120   20 Jul 1999 09:44:28   OS
   #67585# ZoomValue/ZoomType :SetZoom changed

      Rev 1.119   14 Jan 1999 14:19:54   JP
   Bug #60794#: Fehlererkennung beim Tabellenrechnen und anspringen von Formeln

      Rev 1.118   03 Dec 1998 10:26:18   OS
   #59441# Verzeichniseintrag in der Navigation

      Rev 1.117   22 Sep 1998 11:36:28   MA
   #56856# Kontext besser

      Rev 1.116   22 Sep 1998 11:28:16   MA
   #56856# Paint locken fuer Anderung vom Zoom

      Rev 1.115   08 Sep 1998 17:05:12   OS
   #56134# Metric fuer Text und HTML getrennt

      Rev 1.114   14 Jun 1998 16:13:52   MA
   chg: Navi-Tool auch fuer Browse-View

      Rev 1.113   20 Mar 1998 13:23:54   MA
   OleVis2Page durch BrowseMode ersetzt

      Rev 1.112   24 Feb 1998 18:06:38   OS
   includes, SwapPam

      Rev 1.111   24 Feb 1998 12:02:02   OS
   Navigationstool erweitert

      Rev 1.110   07 Feb 1998 10:39:36   OS
   GrabFocus nach Navigations-Move #47160#

      Rev 1.109   21 Nov 1997 15:00:20   MA
   includes

      Rev 1.108   03 Nov 1997 13:58:30   MA
   precomp entfernt

      Rev 1.107   04 Sep 1997 17:14:42   MA
   includes

      Rev 1.106   01 Sep 1997 13:13:50   OS
   DLL-Umstellung

      Rev 1.105   23 Aug 1997 10:12:02   OS
   Zoom ganze Seite: Factor nicht zusaetzlich mit den ViewOpt-Einstellungen multiplizieren #43052#

      Rev 1.104   12 Aug 1997 15:57:26   OS
   frmitems/textitem/paraitem aufgeteilt

      Rev 1.103   08 Aug 1997 17:25:56   OM
   Headerfile-Umstellung

      Rev 1.102   07 Aug 1997 14:58:56   OM
   Headerfile-Umstellung

      Rev 1.101   16 Jul 1997 17:25:54   AMA
   Fix: Rundungsfehler minimieren durch PixelToLogic mit 100%-MapMode

      Rev 1.100   20 Jun 1997 13:55:36   OS
   neu: MoveNavigation

      Rev 1.99   09 Jun 1997 14:28:06   MA
   chg: Browse-Flag nur noch am Doc

      Rev 1.98   08 Apr 1997 10:22:46   MA
   includes

      Rev 1.97   24 Mar 1997 15:57:54   OS
   SetZoomType vor CalcVisArea

      Rev 1.96   15 Mar 1997 11:27:24   OS
   PageUp/Down-Buttons faerben

      Rev 1.95   04 Mar 1997 19:11:42   OS
   Spruenge im Text: zunaechst EnterStdMode

      Rev 1.94   22 Feb 1997 20:15:48   OS
   eigenes Image fuer Button

      Rev 1.93   21 Feb 1997 17:03:00   OS
   ImageButtons veraendert; Handler erweitert

      Rev 1.92   20 Feb 1997 16:46:16   OS
   Navigation funktioniert

      Rev 1.91   19 Feb 1997 16:55:54   OS
   dritter Button/Navigation

      Rev 1.90   05 Feb 1997 08:29:14   MA
   chg: unn?tzes label entfernt

      Rev 1.89   30 Jan 1997 11:03:10   OS
   UsrPrefs verdoppelt

      Rev 1.88   11 Dec 1996 08:42:18   OS
   ClickType am Ruler auswerten -> gfs. Einzuege-TabPage statt Tabulator

      Rev 1.87   10 Dec 1996 19:07:06   MA
   VertScrollbar

      Rev 1.86   11 Nov 1996 11:10:52   MA
   ResMgr

      Rev 1.85   14 Oct 1996 09:02:02   OS
   Readonly an den ViewOptions vor ApplyViewOptions einstellen

      Rev 1.84   07 Oct 1996 09:58:08   OS
   Aktivierung der Lineale im _Create abhaengig von der Aktivierung der View

      Rev 1.83   23 Sep 1996 15:37:34   MA
   fix: Zoomtype und Browser

      Rev 1.82   12 Sep 1996 17:00:32   OS
   GetAnyCurRect() ersetzt GetCur*Rect

      Rev 1.81   28 Aug 1996 14:19:18   JP
   ScrollBarBox: im FrameSet-Doc nicht das Sizeable-Flag setzen

      Rev 1.80   14 Aug 1996 15:15:30   OS
   SetAuto fuer BrowseMode nicht nur fuer HScrollbar

      Rev 1.79   29 Jul 1996 15:47:14   MA
   includes

      Rev 1.78   12 Jul 1996 14:44:22   OS
   vert. Scrollbar geht auch im BrowseMode zum ScrollHdl

      Rev 1.77   05 Jul 1996 14:55:38   OS
   Anzeige der akt. Seitennummer w„hrend des Scrollens in der nicht-Browse-View

      Rev 1.76   26 Jun 1996 15:02:04   OS
   Aufruf von Dispatcher.Execute an 324 angepasst

      Rev 1.75   19 Jun 1996 12:30:04   OM
   Umstellung auf 323

      Rev 1.74   10 Jun 1996 17:55:50   MA
   Breite+HScroll fuer Browser

      Rev 1.73   31 May 1996 07:52:04   OS
   _CreateScrollbar: nach InvalidateBorder Pointer nochmal testen

      Rev 1.72   24 May 1996 09:20:20   OS
   neu: CreatePageButtons

      Rev 1.71   09 May 1996 15:18:58   OS
   HLineal ist immer existent und wird nur noch versteckt

      Rev 1.70   06 May 1996 17:00:36   MA
   chg: Scrollbars fuer browse und ole richtig

      Rev 1.69   24 Apr 1996 15:02:12   OS
   Umstellung UsrPref/ViewOption

------------------------------------------------------------------------*/

diff --git a/sw/source/ui/uiview/viewport.cxx b/sw/source/ui/uiview/viewport.cxx
new file mode 100644
index 0000000..6a09161
--- /dev/null
+++ b/sw/source/ui/uiview/viewport.cxx
@@ -0,0 +1,1508 @@
/*************************************************************************
 *
 *  $RCSfile: viewport.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:49 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "hintids.hxx"

#ifndef _SV_HELP_HXX //autogen
#include <vcl/help.hxx>
#endif

#ifndef _SVX_RULER_HXX //autogen
#include <svx/ruler.hxx>
#endif
#ifndef _SVX_PAPERINF_HXX //autogen
#include <svx/paperinf.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SFX_BINDINGS_HXX //autogen
#include <sfx2/bindings.hxx>
#endif
#ifndef _SFXSTBMGR_HXX //autogen
#include <sfx2/stbmgr.hxx>
#endif
#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif


#include "view.hxx"
#include "wrtsh.hxx"
#include "swmodule.hxx"
#include "viewopt.hxx"
#include "frmatr.hxx"
#include "docsh.hxx"
#include "cmdid.h"
#include "edtwin.hxx"
#include "scroll.hxx"
#include "wview.hxx"
#include "usrpref.hxx"
#include "pagedesc.hxx"
#include "workctrl.hxx"

//Das SetVisArea der DocShell darf nicht vom InnerResizePixel gerufen werden.
//Unsere Einstellungen muessen aber stattfinden.
static BOOL bProtectDocShellVisArea = FALSE;

static USHORT nPgNum = 0;

inline BOOL SwView::IsDocumentBorder()
{
    return GetDocShell()->GetProtocol().IsInPlaceActive() ||
           GetDocShell()->GetCreateMode() == SFX_CREATE_MODE_EMBEDDED ||
           pWrtShell->IsBrowseMode();
}

inline long GetLeftMargin( SwView &rView )
{
    BOOL bWeb = 0 != PTR_CAST(SwWebView, &rView);
    SvxZoomType eType = (SvxZoomType)SW_MOD()->GetUsrPref(bWeb)->GetZoomType();
    long lRet = rView.GetWrtShell().GetAnyCurRect(RECT_PAGE_PRT).Left();
    return eType == SVX_ZOOM_PERCENT   ? lRet + DOCUMENTBORDER :
           eType == SVX_ZOOM_PAGEWIDTH ? 0 :
                                         lRet + DOCUMENTBORDER + nLeftOfst;
}

//-------------------------------------------------------------------------

void lcl_GetPos(SwView* pView,
                Point& rPos,
                SwScrollbar* pScrollbar,
                FASTBOOL bBorder)
{
    SwWrtShell &rSh = pView->GetWrtShell();
    const Size aDocSz( rSh.GetDocSize() );

    const long lBorder = bBorder ? DOCUMENTBORDER : DOCUMENTBORDER * 2;
    BOOL bHori = pScrollbar->IsHoriScroll();

    const long lPos = pScrollbar->GetThumbPos() + (bBorder ? DOCUMENTBORDER : 0);
    long Point:: *pPt = bHori ? &Point::nA : &Point::nB;
    long Size::  *pSz = bHori ? &Size::nA  : &Size::nB;

    long lDelta = lPos - rSh.VisArea().Pos().*pPt;
    const long lSize = aDocSz.*pSz + lBorder;
    // Bug 11693: sollte rechts oder unten zuviel Wiese sein, dann muss
    //            diese von der VisArea herausgerechnet werden!
    long nTmp = pView->GetVisArea().Right()+lDelta;
    if ( bHori && nTmp > lSize )
        lDelta -= nTmp - lSize;
    nTmp = pView->GetVisArea().Bottom()+lDelta;
    if ( !bHori && nTmp > lSize )
        lDelta -= nTmp - lSize;

    rPos.*pPt += lDelta;
    if ( bBorder && rPos.*pPt < DOCUMENTBORDER )
        rPos.*pPt = DOCUMENTBORDER;
}

/*--------------------------------------------------------------------
    Beschreibung:   Nullpunkt Lineal setzen
 --------------------------------------------------------------------*/

void SwView::InvalidateRulerPos()
{
    static USHORT __READONLY_DATA aInval[] =
    {
        SID_ATTR_PARA_LRSPACE, SID_RULER_BORDERS, SID_RULER_PAGE_POS,
        SID_RULER_LR_MIN_MAX, SID_ATTR_LONG_ULSPACE, SID_ATTR_LONG_LRSPACE,
        FN_STAT_PAGE, 0
    };

    GetViewFrame()->GetBindings().Invalidate(aInval);

    DBG_ASSERT(pHLineal, "warum ist das Lineal nicht da?")
    pHLineal->ForceUpdate();
    if( pVLineal )
        pVLineal->ForceUpdate();
}

/*--------------------------------------------------------------------
    Beschreibung:   begrenzt das Scrollen soweit, dass jeweils nur einen
                    viertel Bildschirm bis vor das Ende des Dokumentes
                    gescrollt werden kann.
 --------------------------------------------------------------------*/

long SwView::SetHScrollMax( long lMax )
{
    const long lBorder = IsDocumentBorder() ? DOCUMENTBORDER : DOCUMENTBORDER * 2;
    const long lSize = GetDocSz().Width() + lBorder - aVisArea.GetWidth();

    // bei negativen Werten ist das Dokument vollstaendig sichtbar;
    // in diesem Fall kein Scrollen
    return Max( Min( lMax, lSize ), 0L );
}


long SwView::SetVScrollMax( long lMax )
{
    const long lBorder = IsDocumentBorder() ? DOCUMENTBORDER : DOCUMENTBORDER * 2;
    long lSize = GetDocSz().Height() + lBorder - aVisArea.GetHeight();
    return Max( Min( lMax, lSize), 0L );        // siehe horz.
}


Point SwView::AlignToPixel(const Point &rPt) const
{
    return GetEditWin().PixelToLogic( GetEditWin().LogicToPixel( rPt ) );
}

/*--------------------------------------------------------------------
    Beschreibung:   Dokumentgroesse hat sich geaendert
 --------------------------------------------------------------------*/

void SwView::DocSzChgd(const Size &rSz)
{

extern int bDocSzUpdated;

    aDocSz = rSz;

    if( !pWrtShell || aVisArea.IsEmpty() )      // keine Shell -> keine Aenderung
    {
        bDocSzUpdated = FALSE;
        return;
    }

    //Wenn Text geloescht worden ist, kann es sein, dass die VisArea hinter
    //den sichtbaren Bereich verweist
    Rectangle aNewVisArea( aVisArea );
    BOOL bModified = FALSE;
    const SwTwips lGreenOffset = IsDocumentBorder() ? DOCUMENTBORDER : DOCUMENTBORDER * 2;
    SwTwips lTmp = aDocSz.Width() + lGreenOffset;
    if ( aNewVisArea.Right() >= lTmp  )
    {
        lTmp = aNewVisArea.Right() - lTmp;
        aNewVisArea.Right() -= lTmp;
        aNewVisArea.Left() -= lTmp;
        bModified = TRUE;
    }
    lTmp = aDocSz.Height() + lGreenOffset;
    if ( aNewVisArea.Bottom() >= lTmp )
    {
        lTmp = aNewVisArea.Bottom() - lTmp;
        aNewVisArea.Bottom() -= lTmp;
        aNewVisArea.Top() -= lTmp;
        bModified = TRUE;
    }

    if ( bModified )
        SetVisArea( aNewVisArea, FALSE );

//  FASTBOOL bHResize = pHScrollbar && pHScrollbar->IsAuto() && pHScrollbar->IsVisible();
//  FASTBOOL bVResize = pVScrollbar && pVScrollbar->IsAuto() && pVScrollbar->IsVisible();
    if ( UpdateScrollbars() && !bInOuterResizePixel )//&&
//       ((bHResize != (pHScrollbar && pHScrollbar->IsAuto() && pHScrollbar->IsVisible())) ||
//        (bVResize != (pVScrollbar && pVScrollbar->IsAuto() && pVScrollbar->IsVisible()))) )
    {
        OuterResizePixel( Point(),
                          GetViewFrame()->GetWindow().GetOutputSizePixel() );
    }
}

/*--------------------------------------------------------------------
    Beschreibung:   Visarea neu setzen
 --------------------------------------------------------------------*/

void SwView::SetVisArea( const Rectangle &rRect, BOOL bUpdateScrollbar )
{
    const Size aOldSz( aVisArea.GetSize() );

    const Point aTopLeft(     AlignToPixel( rRect.TopLeft() ));
    const Point aBottomRight( AlignToPixel( rRect.BottomRight() ));
    Rectangle aLR( aTopLeft, aBottomRight );

    if( aLR == aVisArea )
        return;

    const SwTwips lMin = IsDocumentBorder() ? DOCUMENTBORDER : 0;

    // keine negative Position, keine neg. Groesse
    if( aLR.Top() < lMin )
    {
        aLR.Bottom() += lMin - aLR.Top();
        aLR.Top() = lMin;
    }
    if( aLR.Left() < lMin )
    {
        aLR.Right() += lMin - aLR.Left();
        aLR.Left() = lMin;
    }
    if( aLR.Right() < 0 )
        aLR.Right() = 0;
    if( aLR.Bottom() < 0 )
        aLR.Bottom() = 0;

    if( aLR == aVisArea )
        return;

    const Size aSize( aLR.GetSize() );
    if( aSize.Width() < 0 || aSize.Height() < 0 )
        return;

    //Bevor die Daten veraendert werden ggf. ein Update rufen. Dadurch wird
    //sichergestellt, daá anliegende Paints korrekt in Dokumentkoordinaten
    //umgerechnet werden.
    //Vorsichtshalber tun wir das nur wenn an der Shell eine Action laeuft,
    //denn dann wir nicht wirklich gepaintet sondern die Rechtecke werden
    //lediglich (in Dokumentkoordinaten) vorgemerkt.
    if ( pWrtShell && pWrtShell->ActionPend() )
        pWrtShell->GetWin()->Update();

    aVisArea = aLR;

    const FASTBOOL bOuterResize = bUpdateScrollbar && UpdateScrollbars() && !bInOuterResizePixel;

    if ( pWrtShell )
    {
        pWrtShell->VisPortChgd( aVisArea );
        if ( aOldSz != pWrtShell->VisArea().SSize() &&
             ( Abs(aOldSz.Width() - pWrtShell->VisArea().Width()) > 2 ||
                Abs(aOldSz.Height() - pWrtShell->VisArea().Height()) > 2 ) )
            pWrtShell->CheckBrowseView( FALSE );
    }

    if ( !bProtectDocShellVisArea )
    {
        //Wenn die Groesse der VisArea unveraendert ist, reichen wir die
        //Groesse der VisArea vom InternalObject weiter. Damit soll der
        //Transport von Fehlern vermieden werden.
        Rectangle aVis( aVisArea );
        if ( aVis.GetSize() == aOldSz )
            aVis.SetSize(
                    GetDocShell()->SfxInPlaceObject::GetVisArea().GetSize() );

        //Bei embedded immer mit Modify...
        if ( GetDocShell()->GetCreateMode() == SFX_CREATE_MODE_EMBEDDED )
            GetDocShell()->SfxInPlaceObject::SetVisArea( aVis );
        else
            GetDocShell()->SvEmbeddedObject::SetVisArea( aVis );
    }

    SfxViewShell::VisAreaChanged( aVisArea );

    InvalidateRulerPos();

    SwEditWin::ClearTip();

    if ( bOuterResize )
        OuterResizePixel( Point(),
                          GetViewFrame()->GetWindow().GetOutputSizePixel() );
}

/*--------------------------------------------------------------------
    Beschreibung:   Pos VisArea setzen
 --------------------------------------------------------------------*/

void SwView::SetVisArea( const Point &rPt, BOOL bUpdateScrollbar )
{
    //einmal alignen, damit Brushes korrekt angesetzt werden.
    //MA 31. May. 96: Das geht in der BrowseView schief, weil evlt.
    //nicht das ganze Dokument sichtbar wird. Da der Inhalt in Frames
    //passgenau ist, kann nicht aligned werden (bessere Idee?!?!)
    //MA 29. Oct. 96 (fix: Bild.de, 200%) ganz ohne Alignment geht es nicht
    //mal sehen wie weit wir mit der halben BrushSize kommen.
    //TODO: why BRUSH_SIZE?
    Point aPt( rPt );
//  const long nTmp = GetWrtShell().IsFrameView() ? BRUSH_SIZE/2 : BRUSH_SIZE;
    const long nTmp = GetWrtShell().IsFrameView() ? 4 : 8;
    aPt = GetEditWin().LogicToPixel( aPt );
    aPt.X() -= aPt.X() % nTmp;
    aPt.Y() -= aPt.Y() % nTmp;
    aPt = GetEditWin().PixelToLogic( aPt );

    if ( aPt == aVisArea.TopLeft() )
        return;

    const long lXDiff = aVisArea.Left() - aPt.X();
    const long lYDiff = aVisArea.Top()  - aPt.Y();
    SetVisArea( Rectangle( aPt,
            Point( aVisArea.Right() - lXDiff, aVisArea.Bottom() - lYDiff ) ),
            bUpdateScrollbar);
}


void SwView::CheckVisArea()
{
    if ( pHScrollbar )
        pHScrollbar->SetAuto( pWrtShell->IsBrowseMode() &&
                              !GetDocShell()->GetProtocol().IsInPlaceActive() );
    if ( IsDocumentBorder() )
    {
        if ( aVisArea.Left() != DOCUMENTBORDER ||
             aVisArea.Top()  != DOCUMENTBORDER )
        {
            Rectangle aNewVisArea( aVisArea );
            aNewVisArea.Move( DOCUMENTBORDER - aVisArea.Left(),
                              DOCUMENTBORDER - aVisArea.Top() );
            SetVisArea( aNewVisArea, TRUE );
        }
    }
}

/*--------------------------------------------------------------------
    Beschreibung:   Sichtbaren Bereich berechnen

    OUT Point *pPt:             neue Position des sichtbaren
                                Bereiches
    IN  Rectangle &rRect:       Rechteck, das sich innerhalb des neuen
                                sichtbaren Bereiches befinden soll
        USHORT nRange           optional exakte Angabe des Bereiches,
                                um den ggfs. gescrollt werden soll
 --------------------------------------------------------------------*/

void SwView::CalcPt( Point *pPt, const Rectangle &rRect,
                     USHORT nRangeX, USHORT nRangeY)
{

    const SwTwips lMin = IsDocumentBorder() ? DOCUMENTBORDER : 0;

    long nYScroll = GetYScroll();
    long nDesHeight = rRect.GetHeight();
    long nCurHeight = aVisArea.GetHeight();
    nYScroll = Min(nYScroll, nCurHeight - nDesHeight); // wird es knapp, dann nicht zuviel scrollen
    if(nDesHeight > nCurHeight) // die Hoehe reicht nicht aus, dann interessiert nYScroll nicht mehr
    {
        pPt->Y() = rRect.Top();
        pPt->Y() = Max( lMin, pPt->Y() );
    }
    else if ( rRect.Top() < aVisArea.Top() )                //Verschiebung nach oben
    {
        pPt->Y() = rRect.Top() - (nRangeY != USHRT_MAX ? nRangeY : nYScroll);
        pPt->Y() = Max( lMin, pPt->Y() );
    }
    else if( rRect.Bottom() > aVisArea.Bottom() )   //Verschiebung nach unten
    {
        pPt->Y() = rRect.Bottom() -
                    (aVisArea.GetHeight()) + ( nRangeY != USHRT_MAX ?
            nRangeY : nYScroll );
        pPt->Y() = SetVScrollMax( pPt->Y() );
    }
    long nXScroll = GetXScroll();
    if ( rRect.Right() > aVisArea.Right() )         //Verschiebung nach rechts
    {
        pPt->X() = rRect.Right()  -
                    (aVisArea.GetWidth()) +
                    (nRangeX != USHRT_MAX ? nRangeX : nXScroll);
        pPt->X() = SetHScrollMax( pPt->X() );
    }
    else if ( rRect.Left() < aVisArea.Left() )      //Verschiebung nach links
    {
        pPt->X() = rRect.Left() -
                    (nRangeX != USHRT_MAX ? nRangeX : nXScroll);
        pPt->X() = Max( ::GetLeftMargin( *this ) + nLeftOfst, pPt->X() );
        pPt->X() = Min( rRect.Left() - nScrollX, pPt->X() );
        pPt->X() = Max( 0L, pPt->X() );
    }
}

/*--------------------------------------------------------------------
    Beschreibung:   Scrolling
 --------------------------------------------------------------------*/

BOOL SwView::IsScroll( const Rectangle &rRect ) const
{
    return bCenterCrsr || bTopCrsr || !aVisArea.IsInside(rRect);
}


void SwView::Scroll( const Rectangle &rRect, USHORT nRangeX, USHORT nRangeY )
{
    if ( aVisArea.IsEmpty() )
        return;

    Rectangle aOldVisArea( aVisArea );
    long nDiffY = 0;

    Window* pCareWn = GetWrtShell().GetCareWin();
    if ( pCareWn )
    {
        Rectangle aDlgRect( GetEditWin().PixelToLogic(
                    GetEditWin().ScreenToOutputPixel( pCareWn->GetPosPixel() ) ),
                    GetEditWin().PixelToLogic( pCareWn->GetSizePixel() ) );
        // Nur, wenn der Dialog nicht rechts oder links der VisArea liegt:
        if ( aDlgRect.Left() < aVisArea.Right() &&
             aDlgRect.Right() > aVisArea.Left() )
        {
            // Falls wir nicht zentriert werden sollen, in der VisArea liegen
            // und nicht vom Dialog ueberdeckt werden ...
            if ( !bCenterCrsr && aOldVisArea.IsInside( rRect )
                 && ( rRect.Left() > aDlgRect.Right()
                      || rRect.Right() < aDlgRect.Left()
                      || rRect.Top() > aDlgRect.Bottom()
                      || rRect.Bottom() < aDlgRect.Top() ) )
                return;

            // Ist oberhalb oder unterhalb der Dialogs mehr Platz?
            long nTopDiff = aDlgRect.Top() - aVisArea.Top();
            long nBottomDiff = aVisArea.Bottom() - aDlgRect.Bottom();
            if ( nTopDiff < nBottomDiff )
            {
                if ( nBottomDiff > 0 ) // Ist unterhalb ueberhaupt Platz?
                {   // dann verschieben wir die Oberkante und merken uns dies
                    nDiffY = aDlgRect.Bottom() - aVisArea.Top();
                    aVisArea.Top() += nDiffY;
                }
            }
            else
            {
                if ( nTopDiff > 0 ) // Ist oberhalb ueberhaupt Platz?
                    aVisArea.Bottom() = aDlgRect.Top(); // Unterkante aendern
            }
        }
    }

    //s.o. !IsScroll()
    if( !(bCenterCrsr || bTopCrsr) && aVisArea.IsInside( rRect ) )
    {
        aVisArea = aOldVisArea;
        return;
    }
    //falls das Rechteck groesser als der sichtbare Bereich -->
    //obere linke Ecke
    Size aSize( rRect.GetSize() );
    const Size aVisSize( aVisArea.GetSize() );
    if( !aVisArea.IsEmpty() && (
        aSize.Width() + GetXScroll() > aVisSize.Width() ||
        aSize.Height()+ GetYScroll() > aVisSize.Height() ))
    {
        Point aPt( aVisArea.TopLeft() );
        aSize.Width() = Min( aSize.Width(), aVisSize.Width() );
        aSize.Height()= Min( aSize.Height(),aVisSize.Height());

        CalcPt( &aPt, Rectangle( rRect.TopLeft(), aSize ),
                (aVisSize.Width() - aSize.Width()) / 2,
                (aVisSize.Height()- aSize.Height())/ 2 );

        if( bTopCrsr )
        {
            long nBorder = IsDocumentBorder() ? DOCUMENTBORDER : 0;
            aPt.Y() = Min( Max( nBorder, rRect.Top() ),
                                aDocSz.Height() + nBorder -
                                    aVisArea.GetHeight() );
        }
        aPt.Y() -= nDiffY;
        aVisArea = aOldVisArea;
        SetVisArea( aPt );
        return;
    }
    if( !bCenterCrsr )
    {
        Point aPt( aVisArea.TopLeft() );
        CalcPt( &aPt, rRect, nRangeX, nRangeY );

        if( bTopCrsr )
        {
            long nBorder = IsDocumentBorder() ? DOCUMENTBORDER : 0;
            aPt.Y() = Min( Max( nBorder, rRect.Top() ),
                                aDocSz.Height() + nBorder -
                                    aVisArea.GetHeight() );
        }

        aPt.Y() -= nDiffY;
        aVisArea = aOldVisArea;
        SetVisArea( aPt );
        return;
    }

    //Cursor zentrieren
    Point aPnt( aVisArea.TopLeft() );
    // ... in Y-Richtung auf jeden Fall
    aPnt.Y() += ( rRect.Top() + rRect.Bottom()
                  - aVisArea.Top() - aVisArea.Bottom() ) / 2 - nDiffY;
    // ... in X-Richtung nur, wenn das Rechteck rechts oder links aus der
    //     VisArea hinausragt.
    if ( rRect.Right() > aVisArea.Right() || rRect.Left() < aVisArea.Left() )
    {
        aPnt.X() += ( rRect.Left() + rRect.Right()
                  - aVisArea.Left() - aVisArea.Right() ) / 2;
        aPnt.X() = SetHScrollMax( aPnt.X() );
        const SwTwips lMin = IsDocumentBorder() ? DOCUMENTBORDER : 0;
        aPnt.X() = Max( (GetLeftMargin( *this ) - lMin) + nLeftOfst, aPnt.X() );
    }
    aVisArea = aOldVisArea;
    if( pCareWn )
    {   // Wenn wir nur einem Dialog ausweichen wollen, wollen wir nicht ueber
        // das Ende des Dokument hinausgehen.
        aPnt.Y() = SetVScrollMax( aPnt.Y() );
    }
    SetVisArea( aPnt );
}

/*--------------------------------------------------------------------
    Beschreibung:   Seitenweises Scrollen
    Liefern den Wert, um den bei PageUp / -Down gescrollt werden soll
 --------------------------------------------------------------------*/

BOOL SwView::GetPageScrollUpOffset( SwTwips &rOff ) const
{
    if ( !aVisArea.Top() || !aVisArea.GetHeight() )
        return FALSE;
    rOff = -(aVisArea.GetHeight() - (GetYScroll() / 2));
    //nicht vor den Dokumentanfang scrollen
    rOff = aVisArea.Top() - rOff < 0 ? rOff - aVisArea.Top() : rOff;
    return TRUE;
}


BOOL SwView::GetPageScrollDownOffset( SwTwips &rOff ) const
{
    if ( !aVisArea.GetHeight() ||
         (aVisArea.GetHeight() > aDocSz.Height()) )
        return FALSE;
    rOff = aVisArea.GetHeight() - (GetYScroll() / 2);
    //nicht hinter das Dokumentende scrollen
    if ( aVisArea.Top() + rOff > aDocSz.Height() )
        rOff = aDocSz.Height() - aVisArea.Bottom();
    return rOff > 0;
}

// Seitenweises Blaettern

long SwView::PageUp()
{
    if (!aVisArea.GetHeight())
        return 0;

    Point aPos(aVisArea.TopLeft());
    aPos.Y() -= aVisArea.GetHeight() - (GetYScroll() / 2);
    aPos.Y() = Max(0L, aPos.Y());
    SetVisArea( aPos );
    return 1;
}


long SwView::PageDown()
{
    if ( !aVisArea.GetHeight() )
        return 0;
    Point aPos( aVisArea.TopLeft() );
    aPos.Y() += aVisArea.GetHeight() - (GetYScroll() / 2);
    aPos.Y() = SetVScrollMax( aPos.Y() );
    SetVisArea( aPos );
    return 1;
}


long SwView::PhyPageUp()
{
    //aktuell sichtbare Seite erfragen, nicht formatieren
    USHORT nActPage = pWrtShell->GetNextPrevPageNum( FALSE );

    if( USHRT_MAX != nActPage )
    {
        const Point aPt( aVisArea.Left(),
                         pWrtShell->GetPagePos( nActPage ).Y() );
        Point aAlPt( AlignToPixel( aPt ) );
        // falls ein Unterschied besteht, wurde abgeschnitten --> dann
        // einen Pixel addieren, damit kein Rest der Vorgaengerseite
        // sichtbar ist
        if( aPt.Y() != aAlPt.Y() )
            aAlPt.Y() += GetEditWin().PixelToLogic( Size( 0, 1 ) ).Height();
        SetVisArea( aAlPt );
    }
    return 1;
}


long SwView::PhyPageDown()
{
    //aktuell sichtbare Seite erfragen, nicht formatieren
    USHORT nActPage = pWrtShell->GetNextPrevPageNum( TRUE );
    // falls die letzte Dokumentseite sichtbar ist, nichts tun
    if( USHRT_MAX != nActPage )
    {
        const Point aPt( aVisArea.Left(),
                         pWrtShell->GetPagePos( nActPage ).Y() );
        Point aAlPt( AlignToPixel( aPt ) );
        // falls ein Unterschied besteht, wurde abgeschnitten --> dann
        // einen Pixel addieren, damit kein Rest der Vorgaengerseite sichtbar ist
        if( aPt.Y() != aAlPt.Y() )
            aAlPt.Y() += GetEditWin().PixelToLogic( Size( 0, 1 ) ).Height();
        SetVisArea( aAlPt );
    }
    return 1;
}


long SwView::PageUpCrsr( BOOL bSelect )
{
    if ( !bSelect )
    {
        const USHORT eType = pWrtShell->GetFrmType(0,TRUE);
        if ( eType & FRMTYPE_FOOTNOTE )
        {
            pWrtShell->MoveCrsr();
            pWrtShell->GotoFtnAnchor();
            pWrtShell->Right();
            return 1;
        }
    }

    SwTwips lOff = 0;
    if ( GetPageScrollUpOffset( lOff ) &&
         (pWrtShell->IsCrsrReadonly() ||
          !pWrtShell->PageCrsr( lOff, bSelect )) &&
         PageUp() )
    {
        pWrtShell->ResetCursorStack();
        return TRUE;
    }
    return FALSE;
}


long SwView::PageDownCrsr(BOOL bSelect)
{
    SwTwips lOff = 0;
    if ( GetPageScrollDownOffset( lOff ) &&
         (pWrtShell->IsCrsrReadonly() ||
          !pWrtShell->PageCrsr( lOff, bSelect )) &&
         PageDown() )
    {
        pWrtShell->ResetCursorStack();
        return TRUE;
    }
    return FALSE;
}

/*------------------------------------------------------------------------
 Beschreibung:  Handler der Scrollbars
------------------------------------------------------------------------*/

IMPL_LINK( SwView, ScrollHdl, SwScrollbar *, pScrollbar )
{
    if ( GetWrtShell().ActionPend() )
        return 0;

    if ( pScrollbar->GetType() == SCROLL_DRAG )
        pWrtShell->EnableSmooth( FALSE );

    if(!pWrtShell->IsBrowseMode() &&
        pScrollbar->GetType() == SCROLL_DRAG)
    {
        //Hier wieder auskommentieren wenn das mitscrollen nicht gewuenscht ist.
        // JP 21.07.00: the end scrollhandler invalidate the FN_STAT_PAGE,
        //              so we dont must do it agin.
        EndScrollHdl(pScrollbar);

        Point aPos( aVisArea.TopLeft() );
        lcl_GetPos(this, aPos, pScrollbar, IsDocumentBorder());

        USHORT nPhNum = 1;
        USHORT nVirtNum = 1;

        String sDisplay;
        if(pWrtShell->GetPageNumber( aPos.Y(), FALSE, nPhNum, nVirtNum, sDisplay ))
        {
            // JP 21.07.00: the end scrollhandler invalidate the FN_STAT_PAGE,
            //              so we dont must do it agin.
//          if(!GetDocShell()->GetProtocol().IsInPlaceActive())
//              S F X_BINDINGS().Update(FN_STAT_PAGE);

            //QuickHelp:
            USHORT nPageCnt = pWrtShell->GetPageCnt();
            if( nPageCnt > 1 && Help::IsQuickHelpEnabled() )
            {
                if( !nPgNum || nPgNum != nPhNum )
                {
                    Rectangle aRect;
                    aRect.Left() = pScrollbar->GetParent()->OutputToScreenPixel(
                                        pScrollbar->GetPosPixel() ).X() -8;
                    aRect.Top() = pScrollbar->OutputToScreenPixel(
                                    pScrollbar->GetPointerPosPixel() ).Y();
                    aRect.Right()   = aRect.Left();
                    aRect.Bottom()  = aRect.Top();

                    String sPageStr( GetPageStr( nPhNum, nVirtNum, sDisplay ));
                    SwContentAtPos aCnt( SwContentAtPos::SW_OUTLINE );
                    pWrtShell->GetContentAtPos( aPos, aCnt );
                    if( aCnt.sStr.Len() )
                    {
                        sPageStr += String::CreateFromAscii(
                                        RTL_CONSTASCII_STRINGPARAM( "  - " ));
                        sPageStr.Insert( aCnt.sStr, 0, 80 );
                        sPageStr.SearchAndReplaceAll( '\t', ' ' );
                    }

                    Help::ShowQuickHelp( pScrollbar, aRect, sPageStr,
                                    QUICKHELP_RIGHT|QUICKHELP_VCENTER);
                }
                nPgNum = nPhNum;
            }
        }
    }
    else
        EndScrollHdl(pScrollbar);

    if ( pScrollbar->GetType() == SCROLL_DRAG )
        pWrtShell->EnableSmooth( TRUE );

    return 0;
}
/*------------------------------------------------------------------------
 Beschreibung:  Handler der Scrollbars
------------------------------------------------------------------------*/

IMPL_LINK( SwView, EndScrollHdl, SwScrollbar *, pScrollbar )
{
    if ( !GetWrtShell().ActionPend() )
    {
        if(nPgNum)
        {
            nPgNum = 0;
            Help::ShowQuickHelp(pScrollbar, Rectangle(), aEmptyStr, 0);
        }
        Point aPos( aVisArea.TopLeft() );
        FASTBOOL bBorder = IsDocumentBorder();
        lcl_GetPos(this, aPos, pScrollbar, bBorder);
        if ( bBorder && aPos == aVisArea.TopLeft() )
            UpdateScrollbars();
        else
            SetVisArea( aPos, FALSE );

        GetViewFrame()->GetBindings().Update(FN_STAT_PAGE);
    }
    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:

        berechnet die Groesse von aVisArea abhaengig von der Groesse
        des EditWin auf dem Schirm.

 --------------------------------------------------------------------*/

void SwView::CalcVisArea( const Size &rOutPixel )
{
    Point aTopLeft;
    Rectangle aRect( aTopLeft, rOutPixel );
    aTopLeft = GetEditWin().PixelToLogic( aTopLeft );
    Point aBottomRight( GetEditWin().PixelToLogic( aRect.BottomRight() ) );

    aRect.Left() = aTopLeft.X();
    aRect.Top() = aTopLeft.Y();
    aRect.Right() = aBottomRight.X();
    aRect.Bottom() = aBottomRight.Y();

    //Die Verschiebungen nach rechts und/oder unten koennen jetzt falsch
    //sein (z.B. Zoom aendern, Viewgroesse aendern.
    const long lBorder = IsDocumentBorder() ? DOCUMENTBORDER : DOCUMENTBORDER*2;
    if ( aRect.Left() )
    {
        const long lWidth = GetWrtShell().GetDocSize().Width() + lBorder;
        if ( aRect.Right() > lWidth )
        {
            long lDelta    = aRect.Right() - lWidth;
            aRect.Left()  -= lDelta;
            aRect.Right() -= lDelta;
        }
    }
    if ( aRect.Top() )
    {
        const long lHeight = GetWrtShell().GetDocSize().Height() + lBorder;
        if ( aRect.Bottom() > lHeight )
        {
            long lDelta     = aRect.Bottom() - lHeight;
            aRect.Top()    -= lDelta;
            aRect.Bottom() -= lDelta;
        }
    }
    SetVisArea( aRect );
    GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOM );
}

/*--------------------------------------------------------------------
    Beschreibung:   Bedienelemente neu anordnen
 --------------------------------------------------------------------*/


void SwView::CalcAndSetBorderPixel( SvBorder &rToFill, FASTBOOL bInner )
{
    if ( pVLineal )
        rToFill.Left() = pVLineal->GetSizePixel().Width();

    DBG_ASSERT(pHLineal, "warum ist das Lineal nicht da?")
    if ( pHLineal->IsVisible() )
        rToFill.Top() = pHLineal->GetSizePixel().Height();

    const StyleSettings &rSet = GetEditWin().GetSettings().GetStyleSettings();
    const long nTmp = rSet.GetScrollBarSize();
    if ( pVScrollbar && (pVScrollbar->IsVisible() || !pVScrollbar->IsAuto()) )
        rToFill.Right()  = nTmp;

    if ( pHScrollbar && (pHScrollbar->IsVisible() || !pHScrollbar->IsAuto()) )
        rToFill.Bottom() = nTmp;

    SetBorderPixel( rToFill );
}


void ViewResizePixel( const Window &rRef,
                    const Point &rOfst,
                    const Size &rSize,
                    const Size &rEditSz,
                    const BOOL bInner,
                    SwScrollbar* pVScrollbar,
                    SwScrollbar* pHScrollbar,
                    ImageButton* pPageUpBtn,
                    ImageButton* pPageDownBtn,
                    ImageButton* pNaviBtn,
                    Window* pScrollBarBox,
                    SvxRuler* pVLineal,
                    SvxRuler* pHLineal,
                    BOOL bIgnoreVisibility,
                    BOOL bWebView )
{
// ViewResizePixel wird auch von der PreView benutzt!!!

    const BOOL bHLineal = pHLineal && pHLineal->IsVisible();
    const long nHLinSzHeight = bHLineal ?
                        pHLineal->GetSizePixel().Height() : 0;
    const long nVLinSzWidth = pVLineal ?
                        pVLineal->GetSizePixel().Width() : 0;
    long nHBSzHeight2= pHScrollbar && (pHScrollbar->IsVisible() || !pHScrollbar->IsAuto()) ?
                       rRef.GetSettings().GetStyleSettings().GetScrollBarSize() : 0;
    long nHBSzHeight = pHScrollbar && (bIgnoreVisibility || pHScrollbar->IsVisible()) ?
                                nHBSzHeight2:0;
    long nVBSzWidth = pVScrollbar && (pVScrollbar->IsVisible() || !pVScrollbar->IsAuto()) ? rRef.GetSettings().GetStyleSettings().GetScrollBarSize() : 0;

    // Lineale anordnen
    if ( pVLineal )
    {
        Point aPos( rOfst.X(), rOfst.Y()+nHLinSzHeight );
        Size  aSize( nVLinSzWidth, rEditSz.Height() );
        pVLineal->SetPosSizePixel( aPos, aSize );
    }
//  Lineal braucht ein Resize, sonst funktioniert es nicht im unischtbaren Zustand
//  if ( bHLineal )
    if ( pHLineal )     //MA: In der Seitenansicht gibt es das Lineal nicht!
    {
        Size aSize( rSize.Width(), nHLinSzHeight );
        if ( nVBSzWidth )
            aSize.Width() -= nVBSzWidth;
        if(!aSize.Height())
            aSize.Height() = pHLineal->GetSizePixel().Height();
        pHLineal->SetPosSizePixel( rOfst, aSize );
//      #46802 VCL ruft an unsichtbaren Fenstern kein Resize
//      fuer das Lineal ist das aber keine gute Idee
        if(!pHLineal->IsVisible())
            pHLineal->Resize();
    }

    // Scrollbars und SizeBox anordnen
    Point aScrollFillPos;
    if ( pHScrollbar && (pHScrollbar->IsVisible() || !pHScrollbar->IsAuto()) )
    {
        Point aPos( rOfst.X(),
                    rOfst.Y()+rSize.Height()-nHBSzHeight );
        Size  aSize( rSize.Width(), nHBSzHeight2 );
        if ( nVBSzWidth )
            aSize.Width() -= nVBSzWidth;
        pHScrollbar->SetPosSizePixel( aPos, aSize );
        aScrollFillPos.Y() = aPos.Y();
    }
    if ( pVScrollbar && (pVScrollbar->IsVisible()|| !pVScrollbar->IsAuto()))
    {
        Point aPos( rOfst.X()+rSize.Width()-nVBSzWidth,
                    rOfst.Y() );
        Size  aSize( nVBSzWidth, rSize.Height() );
        Size  aImgSz( nVBSzWidth, nVBSzWidth );

        //#55949#  wenn der Platz fuer Scrollbar und Page-Buttons zu klein wird, dann
        // werden die Buttons versteckt
        USHORT nCnt = pNaviBtn ? 3 : 2;
        long nSubSize = (aImgSz.Width() * nCnt );
        //
        BOOL bHidePageButtons = aSize.Height() < ((bWebView ? 3 : 2) * nSubSize);
        if(!bHidePageButtons)
            aSize.Height() -= nSubSize;
        else
            aImgSz.Width() = 0; // kein Hide, weil das im Update Scrollbar missverstanden wird

        if ( nHBSzHeight )
            aSize.Height() -= nHBSzHeight;
        pVScrollbar->SetPosSizePixel( aPos, aSize );

        aPos.Y() += aSize.Height();
        pPageUpBtn->SetPosSizePixel( aPos, aImgSz );
        if(pNaviBtn)
        {
            aPos.Y() += aImgSz.Height();
            pNaviBtn->SetPosSizePixel(aPos, aImgSz);
        }

        aPos.Y() += aImgSz.Height();
        pPageDownBtn->SetPosSizePixel( aPos, aImgSz );


        if( pHScrollbar )
        {
            aScrollFillPos.X() = aPos.X();
            pScrollBarBox->SetPosSizePixel( aScrollFillPos,
                                         Size( nHBSzHeight, nVBSzWidth) );
        }
    }
}


void SwView::ShowAtResize()
{
    const FASTBOOL bBrowse = pWrtShell->IsBrowseMode();
    bShowAtResize = FALSE;
    if ( pVLineal )
        pVLineal->Show();
    DBG_ASSERT(pHLineal, "warum ist das Lineal nicht da?")
    if ( pWrtShell->GetViewOptions()->IsViewTabwin() )
        pHLineal->Show();
    if ( pHScrollbar && (!bBrowse ||
                         GetDocShell()->GetProtocol().IsInPlaceActive()) )
        pHScrollbar->Show();
    if ( pVScrollbar )
    {
        pVScrollbar->Show();
        if(pPageUpBtn)
        {
            pPageUpBtn->Show();
            pPageDownBtn->Show();
        }
        if(pNaviBtn)
            pNaviBtn->Show();
        if ( !bBrowse && pScrollFill )
            pScrollFill->Show();
    }
}


void __EXPORT SwView::InnerResizePixel( const Point &rOfst, const Size &rSize )
{
    SvBorder aBorder;
    CalcAndSetBorderPixel( aBorder, TRUE );
    Size aSz( rSize );
    aSz.Height() += aBorder.Top()  + aBorder.Bottom();
    aSz.Width()  += aBorder.Left() + aBorder.Right();
    Size aEditSz( GetEditWin().GetOutputSizePixel() );
    const BOOL bBrowse = pWrtShell->IsBrowseMode();
    ViewResizePixel( GetEditWin(), rOfst, aSz, aEditSz, TRUE, pVScrollbar,
                            pHScrollbar, pPageUpBtn, pPageDownBtn,
                            pNaviBtn,
                            pScrollFill, pVLineal, pHLineal,
                            (!bBrowse || GetDocShell()->GetProtocol().IsInPlaceActive()),
                            0 != PTR_CAST(SwWebView, this));
    if ( bShowAtResize )
        ShowAtResize();

    if( pHLineal->IsVisible() || pVLineal )
    {
        const Fraction& rFrac = GetEditWin().GetMapMode().GetScaleX();
        USHORT nZoom = USHORT(rFrac.GetNumerator() * 100L / rFrac.GetDenominator());

        const Fraction aFrac( nZoom, 100 );
        if ( pVLineal )
            pVLineal->SetZoom( aFrac );
        DBG_ASSERT(pHLineal, "warum ist das Lineal nicht da?")
        if ( pHLineal->IsVisible() )
            pHLineal->SetZoom( aFrac );
        InvalidateRulerPos();   //Inhalt invalidieren.
    }
    //CursorStack zuruecksetzen, da die Cursorpositionen fuer PageUp/-Down
    //nicht mehr zum aktuell sichtbaren Bereich passen
    pWrtShell->ResetCursorStack();

    //EditWin niemals einstellen!

    //VisArea einstellen, aber dort nicht das SetVisArea der DocShell rufen!
    bProtectDocShellVisArea = TRUE;
    CalcVisArea( aEditSz );
    bProtectDocShellVisArea = FALSE;
}


void __EXPORT SwView::OuterResizePixel( const Point &rOfst, const Size &rSize )
{
    if ( bInOuterResizePixel )
        return;
    bInOuterResizePixel = TRUE;

// feststellen, ob Scrollbars angezeigt werden duerfen
    FASTBOOL bBrowse = pWrtShell->IsBrowseMode();
    FASTBOOL bShowH,
             bShowV,
             bAuto = FALSE,
             bHAuto= bBrowse;
    switch ( GetScrollingMode() )
    {
        case SCROLLING_DEFAULT:
        {
            const SwViewOption *pVOpt = pWrtShell->GetViewOptions();
            if ( !pVOpt->IsReadonly() || pVOpt->IsStarOneSetting() )
            {
                bShowH = pVOpt->IsViewHScrollBar();
                bShowV = pVOpt->IsViewVScrollBar();
                break;
            }
        }
            /* kein break hier */
        case SCROLLING_AUTO:
            bAuto = bHAuto = TRUE;
            bShowH = bShowV = TRUE;
        break;
        case SCROLLING_YES:
            bShowH = bShowV = TRUE;
        break;
        case SCROLLING_NO:
            bShowH = bShowV = bHAuto = FALSE;
        break;
    }

    if ( bShowH != StatHScrollbar() )
        bShowH ? CreateHScrollbar() : KillHScrollbar();
    if ( pHScrollbar )
    {
        pHScrollbar->SetUpdateMode(FALSE);
        pHScrollbar->SetAuto( bHAuto );
    }
    if(bShowV != StatVScrollbar())
        bShowV ? CreateVScrollbar() : KillVScrollbar();
    if(pVScrollbar)
    {
        pVScrollbar->SetUpdateMode(FALSE);
        pVScrollbar->SetAuto(bAuto);
    }

    SET_CURR_SHELL( pWrtShell );
    FASTBOOL bRepeat = FALSE;
    long nCnt = 0;
    pWrtShell->LockPaint();
    do
    {   ++nCnt;
        const FASTBOOL bScroll1 = pVScrollbar ? pVScrollbar->IsVisible() : FALSE;
        const FASTBOOL bScroll2 = pHScrollbar ? pHScrollbar->IsVisible() : FALSE;
        SvBorder aBorder;
        CalcAndSetBorderPixel( aBorder, FALSE );
        const Size aEditSz( GetEditWin().GetOutputSizePixel() );
        ViewResizePixel( GetEditWin(), rOfst, rSize, aEditSz, FALSE, pVScrollbar,
                                pHScrollbar, pPageUpBtn, pPageDownBtn,
                                pNaviBtn,
                                pScrollFill, pVLineal, pHLineal, !bBrowse,
                                0 != PTR_CAST(SwWebView, this) );
        if ( bShowAtResize )
            ShowAtResize();

        if( pHLineal->IsVisible() || pVLineal )
            InvalidateRulerPos();   //Inhalt invalidieren.

        //CursorStack zuruecksetzen, da die Cursorpositionen fuer PageUp/-Down
        //nicht mehr zum aktuell sichtbaren Bereich passen
        pWrtShell->ResetCursorStack();

        //EditWin niemals einstellen!

        //Die VisArea muss aber natuerlich eingestellt werden.
        //jetzt ist auch der richtige Zeitpunkt den Zoom neu zu berechnen wenn
        //es kein einfacher Faktor ist.
        if ( aEditSz.Width() > 0 && aEditSz.Height() > 0 )
        {
            pWrtShell->StartAction();
            CalcVisArea( aEditSz );

            //Damit auch beim outplace editing die Seitenbreite sofort
            //angepasst wird.
            if ( GetDocShell()->GetCreateMode() == SFX_CREATE_MODE_EMBEDDED )
                GetDocShell()->SetVisArea(
                                GetDocShell()->SfxInPlaceObject::GetVisArea() );
            if ( pWrtShell->GetViewOptions()->GetZoomType() != SVX_ZOOM_PERCENT &&
                 !pWrtShell->IsBrowseMode() )
                _SetZoom( aEditSz, (SvxZoomType)pWrtShell->GetViewOptions()->GetZoomType() );
            pWrtShell->EndAction();

            bRepeat = bScroll1 != (pVScrollbar ? pVScrollbar->IsVisible() : FALSE);
            if ( !bRepeat )
                bRepeat = bScroll2 != (pHScrollbar ? pHScrollbar->IsVisible() : FALSE);
        }
        else
            bRepeat = FALSE;

        //Nicht endlosschleifen. Moeglichst dann stoppen wenn die
        //(Auto-)Scrollbars sichtbar sind.
        if ( bRepeat && nCnt > 10 ||
             (nCnt > 3 && bHAuto && bAuto &&
              (pVScrollbar ? pVScrollbar->IsVisible() == bAuto  : TRUE) &&
              (pHScrollbar ? pHScrollbar->IsVisible() == bHAuto : TRUE)) )
        {
            bRepeat = FALSE;
        }

    }while ( bRepeat );

    if ( pHScrollbar )
        pHScrollbar->SetUpdateMode(TRUE);

    if(pVScrollbar)
    {
        pVScrollbar->SetUpdateMode(TRUE);
        BOOL bShowButtons = pVScrollbar->IsVisible(TRUE);
        if(pPageUpBtn && pPageUpBtn->IsVisible() != bShowButtons)
        {
            pPageUpBtn->Show(bShowButtons);
            if(pPageDownBtn)
                pPageDownBtn->Show(bShowButtons);
            if(pNaviBtn)
                pNaviBtn->Show(bShowButtons);
        }
    }

    pWrtShell->UnlockPaint();
    bInOuterResizePixel = FALSE;
}


void __EXPORT SwView::SetZoomFactor( const Fraction &rX, const Fraction &rY )
{
    const Fraction &rFrac = rX < rY ? rX : rY;
    SetZoom( SVX_ZOOM_PERCENT, (short) long(rFrac * Fraction( 100, 1 )) );

    //Um Rundungsfehler zu minimieren lassen wir von der Basisklasse ggf.
    //auch die krummen Werte einstellen
    SfxViewShell::SetZoomFactor( rX, rY );
}


Size __EXPORT SwView::GetOptimalSizePixel() const
{
    Size aPgSize;
    if ( pWrtShell->IsBrowseMode() )
    {
        aPgSize.Height() = lA4Height;
        aPgSize.Width()  = lA4Width;
    }
    else
    {
        const SwPageDesc &rDesc = pWrtShell->GetPageDesc(
                                                    pWrtShell->GetCurPageDesc() );
        const SvxLRSpaceItem &rLRSpace = rDesc.GetMaster().GetLRSpace();
        aPgSize = GetWrtShell().GetAnyCurRect(RECT_PAGE).SSize();
        if( PD_MIRROR == rDesc.GetUseOn() )
        {
            const SvxLRSpaceItem &rLeftLRSpace = rDesc.GetLeft().GetLRSpace();
            aPgSize.Width() +=
                Abs( long(rLeftLRSpace.GetLeft()) - long(rLRSpace.GetLeft()) );
        }
        aPgSize.Width() += DOCUMENTBORDER * 2;
    }
    return GetEditWin().LogicToPixel( aPgSize );
}


BOOL SwView::UpdateScrollbars()
{
    BOOL bRet = FALSE;
    if ( !aVisArea.IsEmpty() && (pHScrollbar || pVScrollbar) )
    {
        const FASTBOOL bBorder = IsDocumentBorder();
        Rectangle aTmpRect( aVisArea );
        if ( bBorder )
        {
            Point aPt( DOCUMENTBORDER, DOCUMENTBORDER );
            aPt = AlignToPixel( aPt );
            aTmpRect.Move( -aPt.X(), -aPt.Y() );
        }

        Size aTmpSz( aDocSz );
        const long lOfst = bBorder ? 0 : DOCUMENTBORDER * 2L;
        aTmpSz.Width() += lOfst; aTmpSz.Height() += lOfst;

        if ( pVScrollbar )
        {
            const BOOL bVis = pVScrollbar->IsVisible();
            pVScrollbar->DocSzChgd( aTmpSz );
            pVScrollbar->ViewPortChgd( aTmpRect );

            BOOL bShowButtons = pVScrollbar->IsVisible(TRUE);
            if(pPageUpBtn && pPageUpBtn->IsVisible() != bShowButtons)
            {
                pPageUpBtn->Show(bShowButtons);
                if(pPageDownBtn)
                    pPageDownBtn->Show(bShowButtons);
                if(pNaviBtn)
                    pNaviBtn->Show(bShowButtons);
            }

            if ( !bVis && !bShowAtResize && !pVScrollbar->IsAuto() )
                pVScrollbar->Show();
            if ( bVis != pVScrollbar->IsVisible() )
                bRet = TRUE;
        }
        if ( pHScrollbar )
        {
            const BOOL bVis = pHScrollbar->IsVisible();
            pHScrollbar->DocSzChgd( aTmpSz );
            pHScrollbar->ViewPortChgd( aTmpRect );
            if ( !bVis && !bShowAtResize && !pHScrollbar->IsAuto() )
                pHScrollbar->Show();
            if ( bVis != pHScrollbar->IsVisible() )
                bRet = TRUE;
        }
        if ( pScrollFill )
        {
            if ( pHScrollbar && pVScrollbar &&
                 pHScrollbar->IsVisible() && pVScrollbar->IsVisible() )
            {
                pScrollFill->Show();
            }
            else
                pScrollFill->Hide();
        }
    }
    return bRet;
}


void __EXPORT SwView::Move()
{
    if ( GetWrtShell().IsInSelect() )
        GetWrtShell().EndSelect();  //#32427#
    SfxViewShell::Move();
}

BOOL SwView::HandleWheelCommands( const CommandEvent& rCEvt )
{
    BOOL bOk = FALSE;
    const CommandWheelData* pWData = rCEvt.GetWheelData();
    if( pWData && COMMAND_WHEEL_ZOOM == pWData->GetMode() )
    {
        USHORT nFact = pWrtShell->GetViewOptions()->GetZoom();
        if( 0L > pWData->GetDelta() )
            nFact = Max( 20, nFact - 10 );
        else
            nFact = Min( 600, nFact + 10 );

        SetZoom( SVX_ZOOM_PERCENT, nFact );
        bOk = TRUE;
    }
    else
        bOk = pEditWin->HandleScrollCommand( rCEvt,
                    pHScrollbar && pHScrollbar->IsVisible(TRUE) ? pHScrollbar : 0,
                    pVScrollbar && pVScrollbar->IsVisible(TRUE) ? pVScrollbar : 0 );
    return bOk;
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.254  2000/09/18 16:06:14  willem.vandorp
    OpenOffice header added.

    Revision 1.253  2000/09/07 15:59:33  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.252  2000/07/21 10:15:43  jp
    Must changes for SFX

    Revision 1.251  2000/04/18 15:02:51  os
    UNICODE

    Revision 1.250  2000/03/03 15:17:04  os
    StarView remainders removed

    Revision 1.249  2000/02/11 14:59:40  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.248  1999/07/13 06:48:04  OS
    #67584# Scrollbar settings via StarOne


      Rev 1.247   13 Jul 1999 08:48:04   OS
   #67584# Scrollbar settings via StarOne

      Rev 1.246   27 May 1999 11:26:20   AMA
   Fix #64863#: Nicht ueber das Dokumentende hinausscrollen, nu aber wirklich

      Rev 1.245   11 May 1999 09:26:22   AMA
   Fix #64863#: Nicht ueber das Dokumentende hinausscrollen

      Rev 1.244   03 Mar 1999 12:52:56   MA
   #62722# UpdateScrollbars macht ohne VisArea keinen Sinn

      Rev 1.243   02 Mar 1999 16:04:20   AMA
   Fix #62568#: Invalidierungen so sparsam wie moeglich, so gruendlich wie noetig

      Rev 1.242   27 Nov 1998 14:58:36   AMA
   Fix #59951#59825#: Unterscheiden zwischen Rahmen-,Seiten- und Bereichsspalten

      Rev 1.241   04 Sep 1998 12:31:12   OS
   #55949# Verstecken der PageButtons noch veredelt

      Rev 1.240   03 Sep 1998 13:17:00   OS
   #55949# Buttons unter dem VScrollbar verstecken, wenn nicht genug Platz ist

      Rev 1.239   20 Aug 1998 13:39:50   MA
   #55307# Scrollbars muessen nicht existieren

      Rev 1.238   27 Jul 1998 16:52:00   JP
   Bug #54031#: WheelData richtig auswerten

      Rev 1.237   19 Jul 1998 17:57:10   JP
   Task #49835#: Radmausunterstuetzung

      Rev 1.236   13 Jul 1998 17:16:06   OS
   Scrollbar-Buttons muessen an zwei Positionen auf Sichtbarkeit geprueft werden #52527#

      Rev 1.235   03 Jul 1998 16:57:16   OS
   PageButtons an das AutoHide des VScrollbars anpassen

      Rev 1.234   24 Jun 1998 18:43:54   MA
   DataChanged fuer ScrollBar und Retouche, Retouche ganz umgestellt

      Rev 1.233   24 Jun 1998 07:29:54   OS
   CreatePageButtons nicht mehrfach rufen #51535#

      Rev 1.232   14 Jun 1998 16:13:52   MA
   chg: Navi-Tool auch fuer Browse-View

      Rev 1.231   06 May 1998 17:09:54   MA
   #50098# Scrolloffset beruecksichtigen

      Rev 1.230   27 Apr 1998 17:17:18   JP
   statt GetSize().GetHeight/-Width direkt GetHeight/Width am Rectangle rufen

      Rev 1.229   17 Apr 1998 17:22:28   OS
   keine Tabulatoren in der QuickHelp #49563#

      Rev 1.228   14 Apr 1998 12:08:46   OS
   autom. Scrollbars: Scrollbar immer erzeugen #49061#

      Rev 1.227   09 Apr 1998 08:08:02   OS
   CalcPt: Scroll bei Bedarf verkleinern 49364#

      Rev 1.226   20 Mar 1998 13:23:54   MA
   OleVis2Page durch BrowseMode ersetzt

      Rev 1.225   06 Mar 1998 18:57:54   JP
   Bug #47878#: den richtigen Point heruntergeben

      Rev 1.224   27 Feb 1998 17:04:50   MA
   Outline in Tiphilfe

      Rev 1.223   27 Feb 1998 17:01:46   MA
   Outline in Tiphilfe

      Rev 1.222   29 Jan 1998 10:25:12   OS
   das VCL-Lineal braucht ein eigenes Resize wenn es nicht sichtbar ist. #46802#

      Rev 1.221   05 Dec 1997 14:14:32   OS
   Scrollbar nicht mehr MAC-abhaengig

      Rev 1.220   04 Dec 1997 15:27:38   MA
   #45726# Rect auch im Seitenrand sichtbar machen

      Rev 1.219   29 Nov 1997 16:49:56   MA
   includes

      Rev 1.218   28 Nov 1997 11:33:54   TJ
   include

      Rev 1.217   21 Nov 1997 15:00:22   MA
   includes

      Rev 1.216   03 Nov 1997 13:58:32   MA
   precomp entfernt

      Rev 1.215   22 Oct 1997 08:24:08   OS
   eigener UpdateMode zur Verhinderung des Flackerns #43684#

      Rev 1.214   09 Oct 1997 16:16:38   MA
   alte Methoden aufgeraeumt

      Rev 1.213   22 Sep 1997 13:11:12   MA
   #44052# bInOuterResizePixel ist jetzt Member

      Rev 1.212   18 Sep 1997 14:01:10   OS
   Pointer::GetPosPixel fuer VCL ersetzt

      Rev 1.211   09 Sep 1997 11:35:00   OS
   bStarting gibt's nicht mehr

      Rev 1.210   04 Sep 1997 17:14:40   MA
   includes

      Rev 1.209   01 Sep 1997 13:13:48   OS
   DLL-Umstellung

      Rev 1.208   12 Aug 1997 15:57:22   OS
   frmitems/textitem/paraitem aufgeteilt

      Rev 1.207   08 Aug 1997 17:25:52   OM
   Headerfile-Umstellung

      Rev 1.206   07 Aug 1997 14:58:26   OM
   Headerfile-Umstellung

------------------------------------------------------------------------*/

diff --git a/sw/source/ui/uiview/viewprt.cxx b/sw/source/ui/uiview/viewprt.cxx
new file mode 100644
index 0000000..a18929f
--- /dev/null
+++ b/sw/source/ui/uiview/viewprt.cxx
@@ -0,0 +1,770 @@
/*************************************************************************
 *
 *  $RCSfile: viewprt.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:49 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#if STLPORT_VERSION>=321
#include <cstdarg>
#endif

#ifndef _CMDID_H
#include <cmdid.h>
#endif

#ifndef _SVSTDARR_HXX
#define _SVSTDARR_STRINGSDTOR
#include <svtools/svstdarr.hxx>
#endif
#ifndef _SFXREQUEST_HXX
#include <sfx2/request.hxx>
#endif


#ifndef _SFXFLAGITEM_HXX //autogen
#include <svtools/flagitem.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef NOOLDSV //autogen
#include <vcl/system.hxx>
#endif
#ifndef _SV_MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SV_PRINTDLG_HXX_ //autogen
#include <svtools/printdlg.hxx>
#endif
#ifndef _SFX_PRINTER_HXX //autogen
#include <sfx2/printer.hxx>
#endif
#ifndef _SFX_PRNMON_HXX //autogen
#include <sfx2/prnmon.hxx>
#endif
#ifndef _SVX_PAPERINF_HXX //autogen
#include <svx/paperinf.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _OFA_MISCCFG_HXX //autogen
#include <sfx2/misccfg.hxx>
#endif
#ifndef _SVX_PRTQRY_HXX
#include <svx/prtqry.hxx>
#endif

#ifndef _EDTWIN_HXX
#include <edtwin.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _FINDER_HXX
#include <finder.hxx>
#endif
#ifndef _VIEWOPT_HXX
#include <viewopt.hxx>
#endif
#ifndef _PRTOPT_HXX
#include <prtopt.hxx>
#endif
#ifndef _SWPRTOPT_HXX
#include <swprtopt.hxx>
#endif
#ifndef _OPTPAGE_HXX
#include <optpage.hxx>
#endif
#ifndef _CFGITEMS_HXX
#include <cfgitems.hxx>
#endif
#ifndef _DBMGR_HXX
#include <dbmgr.hxx>
#endif
#ifndef _DOCSTAT_HXX
#include <docstat.hxx>
#endif
#ifndef _VIEWFUNC_HXX
#include <viewfunc.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _WVIEW_HXX
#include <wview.hxx>
#endif

#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif
#ifndef _VIEW_HRC
#include <view.hrc>
#endif


/*--------------------------------------------------------------------
    Beschreibung:   Drucker an Sfx uebergeben
 --------------------------------------------------------------------*/


SfxPrinter* __EXPORT SwView::GetPrinter( BOOL bCreate )
{
    SfxPrinter *pOld = GetWrtShell().GetPrt( FALSE );
    SfxPrinter *pPrt = GetWrtShell().GetPrt( bCreate );
    if ( pOld != pPrt )
    {
        BOOL bWeb = 0 != PTR_CAST(SwWebView, this);
        ::SetAppPrintOptions( &GetWrtShell(), bWeb );
    }
    return pPrt;
}

/*--------------------------------------------------------------------
    Beschreibung:   Druckerwechsel weitermelden
 --------------------------------------------------------------------*/

void SetPrinter( SfxPrinter* pNew, BOOL bWeb )
{
    SwPrintOptions* pOpt = SW_MOD()->GetPrtOptions(bWeb);
    if( !pOpt)
        return;

    // Applikationseigene Druckoptionen aus SfxPrinter auslesen
    const SfxItemSet& rSet = pNew->GetOptions();

    const SwAddPrinterItem* pAddPrinterAttr;
    if( SFX_ITEM_SET == rSet.GetItemState( FN_PARAM_ADDPRINTER, FALSE,
        (const SfxPoolItem**)&pAddPrinterAttr ) )
    {
//      Wir lassen die Druckoptionen so, wie sie sind.
//      pAddPrinterAttr->SetPrintOptions( pOpt );
        if( pAddPrinterAttr->GetFax().Len() )
            pOpt->SetFaxName(pAddPrinterAttr->GetFax());
    }
}


USHORT __EXPORT SwView::SetPrinter(SfxPrinter* pNew, USHORT nDiffFlags )
{
    SwWrtShell &rSh = GetWrtShell();
    if ( (SFX_PRINTER_JOBSETUP | SFX_PRINTER_PRINTER) & nDiffFlags )
    {
        rSh.SetPrt( pNew );
        if ( nDiffFlags & SFX_PRINTER_PRINTER )
            rSh.SetModified();
    }
    BOOL bWeb = 0 != PTR_CAST(SwWebView, this);
    if ( nDiffFlags & SFX_PRINTER_OPTIONS )
        ::SetPrinter( pNew, bWeb );

    const BOOL bChgOri = nDiffFlags & SFX_PRINTER_CHG_ORIENTATION ? TRUE : FALSE;
    const BOOL bChgSize= nDiffFlags & SFX_PRINTER_CHG_SIZE ? TRUE : FALSE;
    if ( bChgOri || bChgSize )
    {
        rSh.StartAllAction();
        if ( bChgOri )
            rSh.ChgAllPageOrientation( USHORT(pNew->GetOrientation()) );
        if ( bChgSize )
        {
            Size aSz( SvxPaperInfo::GetPaperSize( pNew ) );
            rSh.ChgAllPageSize( aSz );
        }
        rSh.SetModified();
        rSh.EndAllAction();
        InvalidateRulerPos();
    }
    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:   Drucken
 --------------------------------------------------------------------*/

void MakeOptions( PrintDialog* pDlg, SwPrtOptions& rOpts, BOOL* pPrtProspect,
                  BOOL bWeb, SfxPrinter* pPrt )
{
    const SwAddPrinterItem* pAddPrinterAttr;
    if( pPrt && SFX_ITEM_SET == pPrt->GetOptions().GetItemState(
        FN_PARAM_ADDPRINTER, FALSE, (const SfxPoolItem**)&pAddPrinterAttr ))
    {
        rOpts.bPrintGraph       = pAddPrinterAttr->IsPrintGraphic  ();
        rOpts.bPrintTable       = pAddPrinterAttr->IsPrintTable    ();
        rOpts.bPrintDraw        = pAddPrinterAttr->IsPrintDraw     ();
        rOpts.bPrintControl     = pAddPrinterAttr->IsPrintControl  ();
        rOpts.bPrintLeftPage    = pAddPrinterAttr->IsPrintLeftPage ();
        rOpts.bPrintRightPage   = pAddPrinterAttr->IsPrintRightPage();
        rOpts.bPrintReverse     = pAddPrinterAttr->IsPrintReverse  ();
        rOpts.bPaperFromSetup   = pAddPrinterAttr->IsPaperFromSetup();
        rOpts.bPrintPageBackground = pAddPrinterAttr->IsPrintPageBackground();
        rOpts.bPrintBlackFont   = pAddPrinterAttr->IsPrintBlackFont();
        rOpts.bSinglePrtJobs    = pAddPrinterAttr->IsPrintSingleJobs();
        rOpts.nPrintPostIts     = pAddPrinterAttr->GetPrintPostIts ();

        if( pPrtProspect )
            *pPrtProspect = pAddPrinterAttr->IsPrintProspect();
    }
    else
    {
        SwPrintOptions* pOpts = SW_MOD()->GetPrtOptions(bWeb);

        rOpts.bPrintGraph     = pOpts->IsPrintGraphic  ();
        rOpts.bPrintTable     = pOpts->IsPrintTable    ();
        rOpts.bPrintDraw      = pOpts->IsPrintDraw     ();
        rOpts.bPrintControl   = pOpts->IsPrintControl  ();
        rOpts.bPrintLeftPage  = pOpts->IsPrintLeftPage ();
        rOpts.bPrintRightPage = pOpts->IsPrintRightPage();
        rOpts.bPrintReverse   = pOpts->IsPrintReverse  ();
        rOpts.bPaperFromSetup = pOpts->IsPaperFromSetup();
        rOpts.bPrintPageBackground = pOpts->IsPrintPageBackground();
        rOpts.bPrintBlackFont   = pOpts->IsPrintBlackFont();
        rOpts.bSinglePrtJobs    = pOpts->IsPrintSingleJobs();
        rOpts.nPrintPostIts     = pOpts->GetPrintPostIts ();

        if( pPrtProspect )
            *pPrtProspect = pOpts->IsPrintProspect();
    }
    rOpts.aMulti.SetTotalRange( Range( 0, RANGE_MAX ) );
    rOpts.aMulti.SelectAll( FALSE );
    rOpts.nCopyCount = 1;
    rOpts.bCollate = FALSE;
    rOpts.bPrintSelection = FALSE;
    rOpts.bJobStartet = FALSE;

    if ( pDlg )
    {
        rOpts.nCopyCount = pDlg->GetCopyCount();
        rOpts.bCollate = pDlg->IsCollateChecked();
        if ( pDlg->GetCheckedRange() == PRINTDIALOG_SELECTION )
        {
            rOpts.aMulti.SelectAll();
            rOpts.bPrintSelection = TRUE;
        }
        else if ( PRINTDIALOG_ALL == pDlg->GetCheckedRange() )
            rOpts.aMulti.SelectAll();
        else
        {
            rOpts.aMulti = MultiSelection( pDlg->GetRangeText() );
            rOpts.aMulti.SetTotalRange( Range( 0, RANGE_MAX ) );
        }
    }
    else
        rOpts.aMulti.SelectAll();
    rOpts.aMulti.Select( 0, FALSE );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

ErrCode SwView::DoPrint( SfxPrinter *pPrinter, PrintDialog *pDlg,
                                     BOOL bSilent )
{
    // First test
    SwWrtShell* pSh = &GetWrtShell();
    SwNewDBMgr* pMgr = pSh->GetNewDBMgr();

    int bPrintSelection = -1;
    if( DBMGR_MERGE_MAILMERGE != pMgr->GetMergeType() && !pDlg && !bSilent
        && !bIsApi && ( pSh->IsSelection() || pSh->IsFrmSelected() ||
        pSh->IsObjSelected() ) )
    {
        short nBtn = SvxPrtQryBox(&GetEditWin()).Execute();
        if( RET_CANCEL == nBtn )
            return ERRCODE_IO_ABORT;

        if( RET_OK == nBtn )
            bPrintSelection = 1;
        else
            bPrintSelection = 0;
    }


//  Der PrintProgress stellt Handler am Printer der ViewShell ein.
//  Das kann natuerlich erste nach dem evtl. Umschalten des Druckers korrekt
//  funktionieren. #55210#
//  SfxPrintProgress *pProgress = new SfxPrintProgress( this, !bSilent );
    SfxPrintProgress *pProgress = 0;
    SfxPrinter *pDocPrinter = GetPrinter(TRUE);
    if ( !pPrinter )
        pPrinter = pDocPrinter;
    else if ( pDocPrinter != pPrinter )
    {
        //Da der Doc-Drucker beim SetPrinter geloescht wird,
        // muss man ihn vorher clonen
        SfxPrinter* pClone = pDocPrinter->Clone();
        SetPrinter( pPrinter, SFX_PRINTER_PRINTER );
        pProgress = new SfxPrintProgress( this, !bSilent );
        pProgress->RestoreOnEndPrint( pClone );
    }
    if(!pProgress)
        pProgress = new SfxPrintProgress( this, !bSilent );
    pProgress->SetWaitMode(FALSE);

    // Drucker starten
    PreparePrint( pDlg );
    SfxObjectShell *pObjShell = GetViewFrame()->GetObjectShell();
    SwPrtOptions aOpts( pObjShell->GetTitle(0) );
    BOOL bStartJob;
    BOOL bWeb = 0 != PTR_CAST(SwWebView, this);
    if( pMgr->GetMergeType() == DBMGR_MERGE_MAILMERGE )
    {
        ::MakeOptions( pDlg, aOpts, 0, bWeb, GetPrinter() );
#ifdef REPLACE_OFADBMGR
        bStartJob = pMgr->MergePrint( *this, aOpts, *pProgress );
#else
        bStartJob = pMgr->MergePrint( *this, aOpts, *pProgress );
#endif
    }
    else
    {
        //BrowseView abschalten und die View gegen alle Paints locken.
        FASTBOOL bBrowse = pSh->IsBrowseMode();
        SfxAllItemSet aSet( SFX_APP()->GetPool() );
        SfxBoolItem aBrowse( SID_BROWSER_MODE, FALSE );
        if ( bBrowse )
        {
            if ( pSh->GetWin() )
                pSh->GetWin()->Update();
            pSh->LockPaint();
            pSh->LockView( TRUE );
            aSet.Put( aBrowse, aBrowse.Which() );
            SfxRequest aReq( SID_BROWSER_MODE, 0, aSet );
            GetDocShell()->Execute( aReq );
        }

        // die Felder aktualisieren
        BOOL bIsModified = pSh->IsModified();
        pSh->StartAllAction();
        SwDocStat aDocStat;
        pSh->UpdateDocStat( aDocStat );
        pSh->EndAllTblBoxEdit();
        pSh->ViewShell::UpdateFlds(TRUE);
        if( pSh->IsCrsrInTbl() )
        {
            pSh->ClearTblBoxCntnt();
            pSh->SaveTblBoxCntnt();
        }
        pSh->EndAllAction();

        if( !bIsModified )
            pSh->ResetModified();

        BOOL bPrtPros;
        ::MakeOptions( pDlg, aOpts, &bPrtPros, bWeb, GetPrinter() );
        if( -1 != bPrintSelection )
            aOpts.bPrintSelection = 0 != bPrintSelection;

        SfxViewShell::Print(*pProgress);
        if( bPrtPros )
        {
            bStartJob = pPrinter->StartJob( aOpts.GetJobName() );
            if( bStartJob )
                pSh->PrintProspect( aOpts, *pProgress );
        }
        else
            bStartJob = pSh->Prt( aOpts, *pProgress );

        if ( bBrowse )
        {
            aBrowse.SetValue( TRUE );
            aSet.Put( aBrowse, aBrowse.Which() );
            SfxRequest aReq( SID_BROWSER_MODE, 0, aSet );
            GetDocShell()->Execute( aReq );
            pSh->LockView( FALSE );
            pSh->UnlockPaint();
        }
    }

    bIsApi = FALSE;
    if ( !bStartJob )
    {
        // Printer konnte nicht gestartet werden
        delete pProgress;
        return ERRCODE_IO_ABORT;
    }

    pProgress->Stop();
    pProgress->DeleteOnEndPrint();
    pPrinter->EndJob();
    return pPrinter->GetError();
}



/*--------------------------------------------------------------------
    Beschreibung:   TabPage fuer applikationsspezifische Druckoptionen
 --------------------------------------------------------------------*/

SfxTabPage* __EXPORT SwView::CreatePrintOptionsPage(Window* pParent,
                                                    const SfxItemSet& rSet)
{
    return ::CreatePrintOptionsPage( pParent, rSet, FALSE );
}

/*--------------------------------------------------------------------
    Beschreibung:   Druckerdialog
 --------------------------------------------------------------------*/

PrintDialog* CreatePrintDialog( Window* pParent, USHORT nPg, SwWrtShell* pSh )
{
    PrintDialog *pDlg =
        new PrintDialog( pParent );
//  pDlg->ChangeFirstPage( 1 );

    if ( !nPg )
        nPg = 1;
//  pDlg->ChangeLastPage( nPg );
//  pDlg->ChangeMaxPage( 9999 );
    pDlg->EnableRange( PRINTDIALOG_FROMTO );

    if (pSh && (pSh->IsSelection() || pSh->IsFrmSelected() || pSh->IsObjSelected()))
        pDlg->EnableRange( PRINTDIALOG_SELECTION );

    pDlg->SetRangeText( String::CreateFromInt32(nPg) );
    pDlg->EnableRange( PRINTDIALOG_RANGE );
    pDlg->EnableCollate();
    return pDlg;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

PrintDialog* __EXPORT SwView::CreatePrintDialog( Window* pParent )
{
    // AMA: Hier sollte vielleicht die virtuelle Seitennummer angezeigt werden,
    //      aber nur, wenn das Drucken virtuelle Seitennummern und nicht wie
    //      bisher (auch beim SWG 2.0) physikalische beachtet werden.
    return ::CreatePrintDialog( pParent, GetWrtShell().GetPhyPageNum(), &GetWrtShell() );
}

/*--------------------------------------------------------------------
    Beschreibung:   Print-Dispatcher
 --------------------------------------------------------------------*/

void __EXPORT SwView::ExecutePrint(SfxRequest& rReq)
{
    BOOL bWeb = 0 != PTR_CAST(SwWebView, this);
    ::SetAppPrintOptions( &GetWrtShell(), bWeb );
    switch (rReq.GetSlot())
    {
        case FN_FAX:
        {
            SwPrintOptions* pOpt = SW_MOD()->GetPrtOptions(bWeb);
            String sFaxName(pOpt->GetFaxName());
            if (sFaxName.Len())
            {
                SfxStringItem aPrinterName(SID_PRINTER_NAME, sFaxName);
                SfxBoolItem aSilent( SID_SILENT, TRUE );
                GetViewFrame()->GetDispatcher()->Execute( SID_PRINTDOC,
                            SFX_CALLMODE_SYNCHRON|SFX_CALLMODE_RECORD,
                            &aPrinterName, &aSilent, 0L );
            }
            else
            {
                InfoBox aInfoBox(&GetEditWin(), SW_RES(MSG_ERR_NO_FAX));
                aInfoBox.Execute();
                SfxUInt16Item aDefPage(SID_SW_EDITOPTIONS, TP_OPTPRINT_PAGE);
                GetViewFrame()->GetDispatcher()->Execute(SID_SW_EDITOPTIONS,
                            SFX_CALLMODE_SYNCHRON|SFX_CALLMODE_RECORD,
                            &aDefPage, 0L );
            }
        }
        break;
        case SID_PRINTDOC:
        case SID_PRINTDOCDIRECT:
        {
            SwWrtShell* pSh = &GetWrtShell();
            SwViewOption* pOrgViewOption = 0;
            if (pSh->GetViewOptions()->IsFldName() && pSh->IsAnyFieldInDoc())
            {
                QueryBox aBox( &GetEditWin(), SW_RES( DLG_PRT_FIELDNAME ) );
                USHORT nRet = aBox.Execute();
                if( RET_CANCEL == nRet)
                    return;
                // disable field commands
                if( RET_NO == nRet )
                {
                    pOrgViewOption = new SwViewOption(*pSh->GetViewOptions());
                    pOrgViewOption->SetFldName(FALSE);
                    SW_MOD()->ApplyUsrPref(*pOrgViewOption, this, VIEWOPT_DEST_VIEW_ONLY );
                }
            }
            bIsApi = rReq.IsAPI();
            SfxViewShell::ExecuteSlot( rReq, SfxViewShell::GetInterface() );
            if(pOrgViewOption)
            {
                pOrgViewOption->SetFldName(TRUE);
                SW_MOD()->ApplyUsrPref(*pOrgViewOption, this, VIEWOPT_DEST_VIEW_ONLY );
                delete pOrgViewOption;
            }
            return;
        }
        default:
            ASSERT(!this, falscher Dispatcher);
            return;
    }
}

/*--------------------------------------------------------------------
    Beschreibung:   Page Drucker/Zusaetze erzeugen fuer SwView und
                    SwPagePreview
 --------------------------------------------------------------------*/

SfxTabPage* CreatePrintOptionsPage( Window *pParent,
                                const SfxItemSet &rOptions, BOOL bPreview )
{
    SwAddPrinterTabPage* pPage = ( SwAddPrinterTabPage* )
                            SwAddPrinterTabPage::Create(pParent, rOptions);
    pPage->SetPreview(bPreview);

    SvStringsDtor aFaxList;
    const USHORT nCount = Printer::GetQueueCount();
    pPage->Reset(rOptions);
    for (USHORT i = 0; i < nCount; ++i)
    {
        String* pString = new String( Printer::GetQueueInfo( i ).GetPrinterName() );
        aFaxList.Insert(pString, 0);
    }
    pPage->SetFax( aFaxList );
    return pPage;
}


void SetAppPrintOptions( ViewShell* pSh, BOOL bWeb )
{
    SwPrintOptions* pOpt = SW_MOD()->GetPrtOptions(bWeb);
    if( pSh && pSh->GetPrt() && pOpt)
    {
        // Applikationseigene Druckoptionen in SfxPrinter schiessen
        SwAddPrinterItem aAddPrinterItem (FN_PARAM_ADDPRINTER, pOpt);
        SfxItemSet aSet( pSh->GetAttrPool(),
                    FN_PARAM_ADDPRINTER,        FN_PARAM_ADDPRINTER,
                    SID_HTML_MODE,              SID_HTML_MODE,
                    SID_PRINTER_NOTFOUND_WARN,  SID_PRINTER_NOTFOUND_WARN,
                    SID_PRINTER_CHANGESTODOC,   SID_PRINTER_CHANGESTODOC,
                    0 );

            OfaMiscCfg* pMisc = SFX_APP()->GetMiscConfig();

        if(bWeb)
            aSet.Put(SfxUInt16Item(SID_HTML_MODE,
                    ::GetHtmlMode(((SwWrtShell*)pSh)->GetView().GetDocShell())));
        aSet.Put(SfxBoolItem(SID_PRINTER_NOTFOUND_WARN,
                        pMisc->IsNotFoundWarning() ));
        aSet.Put(aAddPrinterItem);
        aSet.Put( SfxFlagItem( SID_PRINTER_CHANGESTODOC,
            (pMisc->IsPaperSizeWarning() ? SFX_PRINTER_CHG_SIZE : 0)   |
            (pMisc->IsPaperBinWarning()  ? SFX_PRINTER_CHG_ORIENTATION : 0 )));

        pSh->GetPrt()->SetOptions( aSet );
    }

}

/*--------------------------------------------------------------------

$Log: not supported by cvs2svn $
Revision 1.143  2000/09/18 16:06:14  willem.vandorp
OpenOffice header added.

Revision 1.142  2000/09/07 15:59:33  os
change: SFX_DISPATCHER/SFX_BINDINGS removed

Revision 1.141  2000/09/07 08:24:35  os
FaxName now in SwPrintOptions

Revision 1.140  2000/08/10 07:36:58  os
#77466# CreateFromInt32

Revision 1.139  2000/07/18 12:50:09  os
replace ofadbmgr

Revision 1.138  2000/07/10 07:02:56  os
replace ofadbmgr

Revision 1.137  2000/07/07 15:25:44  os
replace ofadbmgr

Revision 1.136  2000/05/26 07:21:35  os
old SW Basic API Slots removed

Revision 1.135  2000/03/03 15:17:04  os
StarView remainders removed

Revision 1.134  2000/02/11 14:59:27  hr
#70473# changes for unicode ( patched by automated patchtool )

Revision 1.133  2000/02/01 14:11:31  os
#72527# print selection query box

Revision 1.132  1999/12/14 14:32:05  jp
Bug #69595#: print can create single Jobs

Revision 1.131  1999/11/11 15:09:57  hr
#65293#: STLPORT 3.2.1

Revision 1.130  1999/09/10 08:35:03  os
restore ViewOption after printing

Revision 1.129  1999/09/09 07:13:27  os
Query changed: printing documents with field commands

Revision 1.128  1999/08/11 14:12:24  JP
Bug #68171#: DoPrint - donst change selektionflag if not execute the Sel.Dlg


      Rev 1.127   11 Aug 1999 16:12:24   JP
   Bug #68171#: DoPrint - donst change selektionflag if not execute the Sel.Dlg

      Rev 1.126   09 Jul 1999 13:54:30   JP
   Bug #67535#: DoPrint - PrintSelection Dialog before any action started

      Rev 1.125   01 Mar 1999 16:22:16   MA
   #62490# Altlast entfernt (Drucken und Briefumschlaege/Etiketten und Datenbank)

      Rev 1.124   04 Feb 1999 11:22:16   ER
   #61415# OfaMiscCfg nach SFX verschoben

      Rev 1.123   13 Jan 1999 11:53:12   JP
   Bug #60794#: Fehlererkennung beim Tabellenrechnen

      Rev 1.122   29 Oct 1998 11:52:44   OM
   #58593# Selektion nur anbieten, wenn auch vorhanden

      Rev 1.121   19 Oct 1998 11:34:48   OM
   #58017# Falschen Hilfetext entfernt

      Rev 1.120   29 Sep 1998 16:58:30   OM
   #57214# Fokus von Controls nicht als Selektion interpretieren

      Rev 1.119   08 Sep 1998 09:59:24   MI
   #55602# DocInfo vor Ausdruck setzen und ggf. hinterher resetten (ErrorCode bei Abort)

      Rev 1.118   31 Aug 1998 17:48:56   OM
   #55613# Selektion drucken

      Rev 1.117   25 Aug 1998 08:25:28   OS
   SfxPrintProgress ermittelt den aktuellen Drucker der ViewShell -> fuer Fax spaeter erzeugen #55210#

      Rev 1.116   13 Jul 1998 14:42:30   TJ
   include

      Rev 1.115   13 Jul 1998 08:48:42   OS
   Dialog-Parent richtig setzen #51814#

      Rev 1.114   07 Jul 1998 14:25:54   AMA
   Chg: DoPrint uebernimmt das Drucken

      Rev 1.113   03 Jul 1998 15:04:32   AMA
   Chg: DoPrint uebernimmt das Drucken

      Rev 1.112   24 Jun 1998 16:17:42   OM
   #51575# Printoptionen auch in Seitenvorschau beachten

      Rev 1.111   21 Nov 1997 15:00:26   MA
   includes

      Rev 1.110   02 Oct 1997 16:29:14   TJ
   include

      Rev 1.109   30 Sep 1997 16:57:50   TJ
   include

      Rev 1.108   03 Sep 1997 15:55:34   OS
   DLL-Umbau

      Rev 1.107   02 Sep 1997 09:56:28   OM
   SDB-Headeranpassung

      Rev 1.106   08 Aug 1997 17:26:22   OM
   Headerfile-Umstellung

      Rev 1.105   21 Jul 1997 17:16:20   AMA
   Fix #38434#: Das FontListen-Update wird jetzt von SetPrt angestossen

      Rev 1.104   11 Jul 1997 14:47:00   OM
   #41525# Nur durch SQL-Statement eingeschraenkte Datensaetze verwenden

      Rev 1.103   08 Jul 1997 14:06:12   OS
   ConfigItems von der App ans Module

      Rev 1.102   13 Jun 1997 12:11:30   MA
   #40665# sid_broiwse ist an der DocShell

      Rev 1.101   11 Jun 1997 09:18:22   OS
   FN_CONFIG_DLG ->SID_SW_EDITOPTIONS fuer Fax #40584#

      Rev 1.100   09 Jun 1997 14:27:58   MA
   chg: Browse-Flag nur noch am Doc

*/

diff --git a/sw/source/ui/uiview/viewsrch.cxx b/sw/source/ui/uiview/viewsrch.cxx
new file mode 100644
index 0000000..c8bab2b4
--- /dev/null
+++ b/sw/source/ui/uiview/viewsrch.cxx
@@ -0,0 +1,940 @@
/*************************************************************************
 *
 *  $RCSfile: viewsrch.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:49 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include <string> // HACK: prevent conflict between STLPORT and Workshop headers

#include "hintids.hxx"
#include "uiparam.hxx"


#ifndef _SVX_PAGEITEM_HXX //autogen
#include <svx/pageitem.hxx>
#endif
#ifndef _SFX_WHITER_HXX //autogen
#include <svtools/whiter.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _TXTCMP_HXX //autogen
#include <svtools/txtcmp.hxx>
#endif
#ifndef _SFX_BINDINGS_HXX //autogen
#include <sfx2/bindings.hxx>
#endif
#ifndef _SFXITEMPOOL_HXX //autogen
#include <svtools/itempool.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SVX_SRCHITEM_HXX //autogen
#include <svx/srchitem.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SVX_SRCHDLG_HXX //autogen
#include <svx/srchdlg.hxx>
#endif
#ifndef _SV_MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SV_WRKWIN_HXX //autogen
#include <vcl/wrkwin.hxx>
#endif

#ifndef _SWWAIT_HXX
#include <swwait.hxx>
#endif
#include "workctrl.hxx"
#include "view.hxx"
#include "wrtsh.hxx"
#include "swundo.hxx"                   // fuer Undo-Ids
#include "uitool.hxx"
#include "cmdid.h"
#include "docsh.hxx"

#include "view.hrc"

#define SRCH_ATTR_OFF   0
#define SRCH_ATTR_ON    1
#define SRCH_ATTR_SET   2

/*--------------------------------------------------------------------
    Beschreibung:   Search Parameter
 --------------------------------------------------------------------*/

struct SwSearchOptions
{
    SwDocPositions eStart, eEnd;
    BOOL bDontWrap;

    SwSearchOptions( SwWrtShell* pSh, BOOL bBackward );
};


inline Window* GetParentWindow( SvxSearchDialog* pSrchDlg )
{
    Window* pWin;
    if( pSrchDlg && pSrchDlg->IsVisible() )
        pWin = pSrchDlg;
    else
        pWin = 0;
    return pWin;
}


/*-----------------12.04.97 13:04-------------------

--------------------------------------------------*/


void __EXPORT SwView::ExecSearch(SfxRequest& rReq, BOOL bNoMessage)
{
    const SfxItemSet* pArgs = rReq.GetArgs();
    const SfxPoolItem* pItem = 0;
    BOOL bApi = rReq.IsAPI()|bNoMessage;
    BOOL bSrchList = TRUE;

    USHORT nSlot = rReq.GetSlot();
    if (nSlot == FN_REPEAT_SEARCH && !pSrchItem)
    {
        if(bApi)
        {
            rReq.SetReturnValue(SfxBoolItem(nSlot, FALSE));
            nSlot = 0;
        }
    }
    switch (nSlot)
    {
    // erstmal Nichts tun
    case SID_SEARCH_ITEM:
    {
        delete pSrchItem;
        pSrchItem = (SvxSearchItem*) pArgs->Get(SID_SEARCH_ITEM).Clone();
    }
    break;

    case FID_SEARCH_ON:
        bJustOpened = TRUE;
        GetViewFrame()->GetBindings().Invalidate(SID_SEARCH_ITEM);
        break;

    case FID_SEARCH_OFF:
        if(pArgs)
        {
            // Dialog abmelden
            delete pSrchItem;
            pSrchItem = (SvxSearchItem*) pArgs->Get(SID_SEARCH_ITEM).Clone();

            const USHORT nId = SvxSearchDialogWrapper::GetChildWindowId();
            SvxSearchDialogWrapper *pWrp = (SvxSearchDialogWrapper*)GetViewFrame()->GetChildWindow(nId);

            DELETEZ( pSrchList );
            DELETEZ( pReplList );

            if ( pWrp )
            {
                pSrchDlg = (SvxSearchDialog*)(pWrp->GetWindow());
                // die Search / Replace -Items merken wir uns
                const SearchAttrItemList* pList = pSrchDlg->GetSearchItemList();
                if( pList && pList->Count() )
                    pSrchList = new SearchAttrItemList( *pList );

                if( 0 != (pList = pSrchDlg->GetReplaceItemList() ) &&
                    pList->Count() )
                    pReplList = new SearchAttrItemList( *pList );
            }
        }
        break;

        case FN_REPEAT_SEARCH:
        case FID_SEARCH_NOW:
            {
                if(FID_SEARCH_NOW == nSlot && !rReq.IsAPI())
                    SwView::SetMoveType(NID_SRCH_REP);
                const USHORT nId = SvxSearchDialogWrapper::GetChildWindowId();
                SvxSearchDialogWrapper *pWrp = (SvxSearchDialogWrapper*)GetViewFrame()->GetChildWindow(nId);
                if ( pWrp )
                {
                    pSrchDlg = (SvxSearchDialog*)(pWrp->GetWindow());
                }
                else
                    pSrchDlg = 0;
            }

            if (pSrchDlg)
            {
                DELETEZ( pSrchList );
                DELETEZ( pReplList );

                const SearchAttrItemList* pList = pSrchDlg->GetSearchItemList();
                if( pList && pList->Count() )
                    pSrchList = new SearchAttrItemList( *pList );

                if( 0 != (pList = pSrchDlg->GetReplaceItemList() ) &&
                    pList->Count() )
                    pReplList = new SearchAttrItemList( *pList );
            }

            if (nSlot == FN_REPEAT_SEARCH)
            {
                ASSERT(pSrchItem, "Search-Item fehlt");
            }
            else
            {
                // SearchItem aus Request besorgen
                ASSERT(pArgs, "Args fehlen");
                delete pSrchItem;
                pSrchItem = (SvxSearchItem*) pArgs->Get(SID_SEARCH_ITEM).Clone();
            }

            switch (pSrchItem->GetCommand())
            {
            case SVX_SEARCHCMD_FIND:
            {
                BOOL bRet = SearchAndWrap(bApi);
                if( bRet )
                    Scroll(pWrtShell->GetCharRect().SVRect());
                rReq.SetReturnValue(SfxBoolItem(nSlot, bRet));
            }
            break;
            case SVX_SEARCHCMD_FIND_ALL:
            {
                BOOL bRet = SearchAll();
                if( !bRet )
                {
                    if( !bApi )
                    {
                        Window* pParentWindow = GetParentWindow( pSrchDlg );
                        InfoBox( pParentWindow, SW_RES(MSG_NOT_FOUND)).Execute();
                    }
                    bFound = FALSE;
                }
                rReq.SetReturnValue(SfxBoolItem(nSlot, bRet));
            }
            break;
            case SVX_SEARCHCMD_REPLACE:
                pWrtShell->StartAllAction();
                {

                    // 1) Selektion ersetzen (nicht. wenn nur Attribute ersetzt
                    //    werden sollen)
//JP 27.04.95: warum ?
//      was ist, wenn man das gefundene nur attributieren will??

                    USHORT nCmd = SVX_SEARCHCMD_FIND;
                    if( pSrchItem->GetReplaceString().Len() ||
                        !pReplList )
                    {
                        // Verhindern, dass - falls der Suchstring im
                        // Ersetzungsstring enthalten ist - der ersetzte String
                        // noch einmal gefunden wird.

                        BOOL bBack = pSrchItem->GetBackward();
                        if (bBack)
                            pWrtShell->Push();
                        Replace();
                        if (bBack)
                        {
                            pWrtShell->Pop();
                            pWrtShell->SwapPam();
                        }
                    }
                    else if( pReplList )
                        nCmd = SVX_SEARCHCMD_REPLACE;

                    // 2) Weiter suchen (ohne zu ersetzen!)

                    USHORT nOldCmd = pSrchItem->GetCommand();
                    pSrchItem->SetCommand( nCmd );
                    BOOL bRet = SearchAndWrap(bApi);
                    if( bRet )
                        Scroll( pWrtShell->GetCharRect().SVRect());
                    pSrchItem->SetCommand( nOldCmd );
                    rReq.SetReturnValue(SfxBoolItem(nSlot, bRet));
                }
                pWrtShell->EndAllAction();
                break;

            case SVX_SEARCHCMD_REPLACE_ALL:
                {
                    SwSearchOptions aOpts( pWrtShell, pSrchItem->GetBackward() );


                    if( !pSrchItem->GetSelection() )
                    {
                        // bestehende Selektionen aufheben,
                        // wenn nicht in selektierten Bereichen gesucht werden soll
                        (pWrtShell->*pWrtShell->fnKillSel)(0, FALSE);
                        if( DOCPOS_START == aOpts.eEnd )
                            pWrtShell->EndDoc();
                        else
                            pWrtShell->SttDoc();
                    }

                    bExtra = FALSE;
                    ULONG nFound;

                    {   //Scope for SwWait-Object
                        SwWait aWait( *GetDocShell(), TRUE );
                        pWrtShell->StartAllAction();
                        nFound = FUNC_Search( aOpts );
                        pWrtShell->EndAllAction();
                    }
                    rReq.SetReturnValue(SfxBoolItem(nSlot, nFound != 0));
                    if( !nFound )
                    {
                        if( !bApi )
                        {
                            Window* pParentWindow = GetParentWindow( pSrchDlg );
                            InfoBox( pParentWindow, SW_RES(MSG_NOT_FOUND)).Execute();
                        }
                        bFound = FALSE;
                        return;
                    }

                    if( !bApi )
                    {
                        String aText( SW_RES( STR_NB_REPLACED ) );
                        const xub_StrLen nPos = aText.Search( String::CreateFromAscii("XX") );
                        aText.Erase( nPos, 2 );
                        aText.Insert( String::CreateFromInt32( nFound ), nPos );
                        Window* pParentWindow = GetParentWindow( pSrchDlg );
                        InfoBox( pParentWindow, aText ).Execute();
                    }
                }
                break;
            }
        break;
        case FID_SEARCH_SEARCHSET:
        case FID_SEARCH_REPLACESET:
        {
            static USHORT __READONLY_DATA aSearchAttrRange[] =
            {
                    RES_CHRATR_CASEMAP,     RES_CHRATR_CASEMAP,
                    RES_CHRATR_COLOR,       RES_CHRATR_POSTURE,
                    RES_CHRATR_SHADOWED,    RES_CHRATR_WORDLINEMODE,
                    RES_CHRATR_BACKGROUND,  RES_CHRATR_BACKGROUND,
                    RES_PARATR_LINESPACING, RES_PARATR_HYPHENZONE,
                    RES_LR_SPACE,           RES_UL_SPACE,
                    SID_ATTR_PARA_MODEL,    SID_ATTR_PARA_KEEP,
                    0
            };

            SfxItemSet aSet( pWrtShell->GetAttrPool(), aSearchAttrRange );
            USHORT nWhich = SID_SEARCH_SEARCHSET;

            if ( FID_SEARCH_REPLACESET == nSlot )
            {
                nWhich = SID_SEARCH_REPLACESET;

                if ( pReplList )
                {
                    pReplList->Get( aSet );
                    DELETEZ( pReplList );
                }
            }
            else if ( pSrchList )
            {
                pSrchList->Get( aSet );
                DELETEZ( pSrchList );
            }
            rReq.SetReturnValue( SvxSetItem( nWhich, aSet ) );
        }
        break;
        default:
#ifndef PRODUCT
            if(nSlot)
            {
                ByteString sStr( "nSlot: " );
                sStr += ByteString::CreateFromInt32( nSlot );
                sStr += " falscher Dispatcher (viewsrch.cxx)";
                DBG_ERROR( sStr.GetBuffer() );
            }
#endif
            return;
    }
}


BOOL SwView::SearchAndWrap(BOOL bApi)
{
    SwSearchOptions aOpts( pWrtShell, pSrchItem->GetBackward() );

        // Startposition der Suche fuer WrapAround merken
        // Start- / EndAction wegen vielleicht bestehender Selektionen
        // aus 'Suche alle'
    pWrtShell->StartAllAction();
    pWrtShell->Push();
        // falls in selektierten Bereichen gesucht werden soll, duerfen sie
        // nicht aufgehoben werden
    if (!pSrchItem->GetSelection())
        (pWrtShell->*pWrtShell->fnKillSel)(0, FALSE);

    SwWait *pWait = new SwWait( *GetDocShell(), TRUE );
    if( FUNC_Search( aOpts ) )
    {
        bFound = TRUE;
        if(pWrtShell->IsSelFrmMode())
        {
            pWrtShell->UnSelectFrm();
            pWrtShell->LeaveSelFrmMode();
        }
        pWrtShell->Pop();
        pWrtShell->EndAllAction();
        delete pWait;
        return TRUE;
    }
    delete pWait, pWait = 0;

        // Suchen in den Sonderbereichen, wenn keine
        // Suche in Selektionen vorliegt. Bei Suche in Selektionen
        // wird ohnehin in diesen Sonderbereichen gesucht
    BOOL bHasSrchInOther = bExtra;
    if (!pSrchItem->GetSelection() && !bExtra )
    {
        bExtra = TRUE;
        if( FUNC_Search( aOpts ) )
        {
            bFound = TRUE;
            pWrtShell->Pop();
            pWrtShell->EndAllAction();
            return TRUE;
        }
        bExtra = FALSE;
    }
    else
        bExtra = !bExtra;

    const USHORT nId = SvxSearchDialogWrapper::GetChildWindowId();
    SvxSearchDialogWrapper *pWrp = (SvxSearchDialogWrapper*)GetViewFrame()->GetChildWindow(nId);
    pSrchDlg = pWrp ? (SvxSearchDialog*)(pWrp->GetWindow()) : 0;

        // falls Startposition am Dokumentende / -anfang
    if (aOpts.bDontWrap)
    {
        pWrtShell->EndAllAction();
        if( !bApi )
        {
            Window* pParentWindow = GetParentWindow( pSrchDlg );
            InfoBox( pParentWindow, SW_RES(MSG_NOT_FOUND)).Execute();
        }
        bFound = FALSE;
        pWrtShell->Pop();
        return FALSE;
    }
    pWrtShell->EndAllAction();
        // noch mal mit WrapAround versuchen?

    if( bApi || RET_NO == QueryBox( GetParentWindow( pSrchDlg ),
                                        SW_RES( DOCPOS_START == aOpts.eEnd
                                            ? MSG_SEARCH_START
                                            : MSG_SEARCH_END )
                                    ).Execute() )
    {
        bFound = FALSE;
        pWrtShell->Pop();
        return FALSE;
    }
    pWrtShell->StartAllAction();
    pWrtShell->Pop(FALSE);
    pWait = new SwWait( *GetDocShell(), TRUE );

    BOOL bSrchBkwrd = DOCPOS_START == aOpts.eEnd;

    aOpts.eEnd =  bSrchBkwrd ? DOCPOS_START : DOCPOS_END;
    aOpts.eStart = bSrchBkwrd ? DOCPOS_END : DOCPOS_START;

    if (bHasSrchInOther)
    {
        pWrtShell->ClearMark();
        if (bSrchBkwrd)
            pWrtShell->EndDoc();
        else
            pWrtShell->SttDoc();
    }

    bFound = 0 != FUNC_Search( aOpts );
    pWrtShell->EndAllAction();
    delete pWait;
    if ( bFound )
        return bFound;
    if(!bApi)
    {
        Window* pParentWindow = GetParentWindow( pSrchDlg );
        InfoBox( pParentWindow, SW_RES(MSG_NOT_FOUND)).Execute();
    }
    return bFound = FALSE;
}


BOOL SwView::SearchAll(USHORT* pFound)
{
    SwWait aWait( *GetDocShell(), TRUE );
    pWrtShell->StartAllAction();

    SwSearchOptions aOpts( pWrtShell, pSrchItem->GetBackward() );

    if (!pSrchItem->GetSelection())
    {
        // bestehende Selektionen aufheben,
        // wenn nicht in selektierten Bereichen gesucht werden soll
        (pWrtShell->*pWrtShell->fnKillSel)(0, FALSE);

        if( DOCPOS_START == aOpts.eEnd )
            pWrtShell->EndDoc();
        else
            pWrtShell->SttDoc();
    }
    bExtra = FALSE;
    USHORT nFound = FUNC_Search( aOpts );
    if(pFound)
        *pFound = nFound;
    bFound = 0 != nFound;

    pWrtShell->EndAllAction();
    return bFound;
}


void SwView::Replace()
{
    SwWait aWait( *GetDocShell(), TRUE );

    pWrtShell->StartAllAction();
    pWrtShell->StartUndo(UIUNDO_REPLACE);

    if( pSrchItem->GetPattern() ) // Vorlagen?
        pWrtShell->SetTxtFmtColl( pWrtShell->GetParaStyle(
                            pSrchItem->GetReplaceString(),
                            SwWrtShell::GETSTYLE_CREATESOME ));
    else
    {
        pWrtShell->SwEditShell::Replace( pSrchItem->GetReplaceString(),
                                            pSrchItem->GetRegExp());

        if( pReplList && pReplList->Count() && pWrtShell->HasSelection() )
        {
            SfxItemSet aReplSet( pWrtShell->GetAttrPool(),
                                    aTxtFmtCollSetRange );
            if( pReplList->Get( aReplSet ).Count() )
            {
                ::SfxToSwPageDescAttr( *pWrtShell, aReplSet );
                pWrtShell->SwEditShell::SetAttr( aReplSet );
            }
        }
    }
    pWrtShell->EndUndo(UIUNDO_REPLACE);
    pWrtShell->EndAllAction();
}



SwSearchOptions::SwSearchOptions( SwWrtShell* pSh, BOOL bBackward )
{
    eStart = DOCPOS_CURR;
    if( bBackward )
    {
        eEnd = DOCPOS_START;
        bDontWrap = pSh->IsEndOfDoc();
    }
    else
    {
        eEnd = DOCPOS_END;
        bDontWrap = pSh->IsStartOfDoc();
    }
}


ULONG SwView::FUNC_Search( const SwSearchOptions& rOptions )
{
    BOOL bDoReplace = pSrchItem->GetCommand() == SVX_SEARCHCMD_REPLACE ||
                      pSrchItem->GetCommand() == SVX_SEARCHCMD_REPLACE_ALL;

    int eRanges = pSrchItem->GetSelection() ?
        FND_IN_SEL : bExtra ? FND_IN_OTHER : FND_IN_BODY;
    if (pSrchItem->GetCommand() == SVX_SEARCHCMD_FIND_ALL    ||
        pSrchItem->GetCommand() == SVX_SEARCHCMD_REPLACE_ALL)
        eRanges |= FND_IN_SELALL;

    pWrtShell->SttSelect();

    static USHORT __READONLY_DATA aSearchAttrRange[] = {
        RES_FRMATR_BEGIN, RES_FRMATR_END-1,
        RES_CHRATR_BEGIN, RES_CHRATR_END-1,
        RES_PARATR_BEGIN, RES_PARATR_END-1,
        SID_ATTR_PARA_MODEL, SID_ATTR_PARA_KEEP,
        0 };

    SfxItemSet aSrchSet( pWrtShell->GetAttrPool(), aSearchAttrRange);
    if( pSrchList && pSrchList->Count() )
    {
        pSrchList->Get( aSrchSet );

        /*  -- Seitenumbruch mit Seitenvorlage */
        ::SfxToSwPageDescAttr( *pWrtShell, aSrchSet );
    }

    SfxItemSet* pReplSet = 0;
    if( bDoReplace && pReplList && pReplList->Count() )
    {
        pReplSet = new SfxItemSet( pWrtShell->GetAttrPool(),
                                        aSearchAttrRange );
        pReplList->Get( *pReplSet );

        /*  -- Seitenumbruch mit Seitenvorlage */
        ::SfxToSwPageDescAttr( *pWrtShell, *pReplSet );

        if( !pReplSet->Count() )        // schade, die Attribute
            DELETEZ( pReplSet );        // kennen wir nicht
    }

    ULONG nFound;
    if( aSrchSet.Count() || ( pReplSet && pReplSet->Count() ))
    {
        // Suche nach Attributen
        SearchParam aPar( pSrchItem->GetSearchString() );
        if( aPar.GetSrchStr().Len() )
        {
            if( bDoReplace )
                aPar.SetReplaceStr( pSrchItem->GetReplaceString() );
            aPar.SetSrchType( pSrchItem->GetRegExp()
                                ? SearchParam::SRCH_REGEXP :
                                pSrchItem->IsLevenshtein() ?
                                    SearchParam::SRCH_LEVDIST :
                                    SearchParam::SRCH_NORMAL );
            aPar.SetCaseSensitive( pSrchItem->GetExact() );
            aPar.SetSrchInSelection( pSrchItem->GetSelection() );
            aPar.SetSrchWordOnly( pSrchItem->GetWordOnly() );

            aPar.SetSrchRelaxed(    pSrchItem->IsLEVRelaxed() );
            aPar.SetLEVOther(       pSrchItem->GetLEVOther());
            aPar.SetLEVShorter(     pSrchItem->GetLEVShorter());
            aPar.SetLEVLonger(      pSrchItem->GetLEVLonger());
        }

        nFound = pWrtShell->SearchAttr(
            aSrchSet,
            !pSrchItem->GetPattern(),
            rOptions.eStart,
            rOptions.eEnd,
            FindRanges(eRanges),
            pSrchItem->GetSearchString().Len() ? &aPar : 0,
            pReplSet );
    }
    else if( pSrchItem->GetPattern() )
    {
        // Suchen (und ersetzen) von Vorlagen
        nFound = pWrtShell->SearchTempl( pSrchItem->GetSearchString(),
            rOptions.eStart,
            rOptions.eEnd,
            FindRanges(eRanges),
            bDoReplace ? &pSrchItem->GetReplaceString() : 0 );
    }
    else
    {
        // Normale Suche

        SearchParam aParam( pSrchItem->GetSearchString(),
                            pSrchItem->GetRegExp()
                                ? SearchParam::SRCH_REGEXP :
                                pSrchItem->IsLevenshtein() ?
                                    SearchParam::SRCH_LEVDIST :
                                        SearchParam::SRCH_NORMAL,
                            pSrchItem->GetExact(),
                            pSrchItem->GetWordOnly(),
                            pSrchItem->GetSelection() );
        aParam.SetSrchRelaxed(  pSrchItem->IsLEVRelaxed() );
        aParam.SetLEVOther(       pSrchItem->GetLEVOther());
        aParam.SetLEVShorter(     pSrchItem->GetLEVShorter());
        aParam.SetLEVLonger(      pSrchItem->GetLEVLonger());

        if (bDoReplace)
            aParam.SetReplaceStr(pSrchItem->GetReplaceString());

        nFound = pWrtShell->SearchPattern(aParam,
                                          rOptions.eStart,
                                          rOptions.eEnd,
                                          FindRanges(eRanges),
                                          bDoReplace );
    }
    pWrtShell->EndSelect();
    return nFound;
}


Dialog* SwView::GetSearchDialog()
{
    const USHORT nId = SvxSearchDialogWrapper::GetChildWindowId();
    SvxSearchDialogWrapper *pWrp = (SvxSearchDialogWrapper*)SfxViewFrame::Current()->GetChildWindow(nId);
    if ( pWrp )
        pSrchDlg = (SvxSearchDialog*)(pWrp->GetWindow());
    else
        pSrchDlg = 0;
    return pSrchDlg;
}


void SwView::StateSearch(SfxItemSet &rSet)
{
    SfxWhichIter aIter(rSet);
    USHORT nWhich = aIter.FirstWhich();
    SearchAttrItemList* pSrchRepList = pSrchList;

    while(nWhich)
    {
        switch(nWhich)
        {
            case SID_SEARCH_OPTIONS:
            {
                UINT16 nOpt = 0xFFFF;
                if( GetDocShell()->IsReadOnly() )
                    nOpt &= ~( SEARCH_OPTIONS_REPLACE |
                               SEARCH_OPTIONS_REPLACE_ALL );
                rSet.Put( SfxUInt16Item( SID_SEARCH_OPTIONS, nOpt));
            }
            break;
            case SID_SEARCH_ITEM:
            {
                if ( !pSrchItem )
                {
                    pSrchItem = new SvxSearchItem( SID_SEARCH_ITEM );
                    pSrchItem->SetFamily(SFX_STYLE_FAMILY_PARA);
                    pSrchItem->SetSearchString( pWrtShell->GetSelTxt() );
                }

                if( bJustOpened && pWrtShell->IsSelection() )
                {
                    String aTxt;
                    if( 1 == pWrtShell->GetCrsrCnt() &&
                        ( aTxt = pWrtShell->SwCrsrShell::GetSelTxt() ).Len() )
                    {
                        pSrchItem->SetSearchString( aTxt );
                        pSrchItem->SetSelection( FALSE );
                    }
                    else
                        pSrchItem->SetSelection( TRUE );
                }

                bJustOpened = FALSE;
                rSet.Put( *pSrchItem );
            }
            break;

/*          case SID_SEARCH_REPLACESET:
            case SID_SEARCH_SEARCHSET:
            {
                static USHORT __READONLY_DATA aSearchAttrRange[] =
                {
                        RES_CHRATR_CASEMAP,     RES_CHRATR_POSTURE,
                        RES_CHRATR_SHADOWED,    RES_CHRATR_WORDLINEMODE,
                        RES_PARATR_LINESPACING, RES_PARATR_HYPHENZONE,
                        RES_LR_SPACE,           RES_UL_SPACE,
                        SID_ATTR_PARA_MODEL,    SID_ATTR_PARA_KEEP,
                        0
                };

                SfxItemSet aSet(pWrtShell->GetAttrPool(), aSearchAttrRange );
                if( SID_SEARCH_REPLACESET==nWhich )
                {
                    if( pReplList )
                    {
                        pReplList->Get( aSet );
                        DELETEZ( pReplList );
                    }
                }
                else if( pSrchList )
                {
                    pSrchList->Get( aSet );
                    DELETEZ( pSrchList );
                }
                rSet.Put( SvxSetItem( nWhich, aSet ));
            }
            break;
*/
        }
        nWhich = aIter.NextWhich();
    }
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.57  2000/09/18 16:06:14  willem.vandorp
    OpenOffice header added.

    Revision 1.56  2000/09/08 08:12:54  os
    Change: Set/Toggle/Has/Knows/Show/GetChildWindow

    Revision 1.55  2000/09/07 16:05:57  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.54  2000/05/26 07:21:35  os
    old SW Basic API Slots removed

    Revision 1.53  2000/05/24 13:13:59  hr
    conflict between STLPORT and Workshop header

    Revision 1.52  2000/05/23 19:42:38  jp
    Bugfixes for Unicode

    Revision 1.51  2000/05/23 07:59:19  jp
    Changes for Unicode

    Revision 1.50  2000/05/10 11:53:20  os
    Basic API removed

    Revision 1.49  2000/04/18 15:02:51  os
    UNICODE

    Revision 1.48  2000/03/08 17:23:27  os
    GetAppWindow() - misuse as parent window eliminated

    Revision 1.47  2000/02/15 18:44:18  jp
    Bug #73058#: dont search charsetcolor-item

    Revision 1.46  2000/02/11 14:59:44  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.45  1999/07/08 16:45:18  MA
    Use internal object to toggle wait cursor


      Rev 1.44   08 Jul 1999 18:45:18   MA
   Use internal object to toggle wait cursor

      Rev 1.43   25 Jan 1999 13:49:16   JP
   Task #58677#: Crsr in Readonly Bereichen zulassen

      Rev 1.42   20 Oct 1998 11:58:54   OS
   #58161# Zeichenhintergrund suchen

      Rev 1.41   20 Aug 1998 07:41:54   OS
   Rahmenselektion aufheben, wenn Text gefunden wurde #55310#

      Rev 1.40   12 Aug 1998 18:46:10   HR
   #54781#: GCC braucht Temporary

      Rev 1.39   25 Jun 1998 10:19:28   OS
   SearchAll liefert Count zurueck #51651#

      Rev 1.38   24 Feb 1998 18:06:02   OS
   Navigationstype bei FID_SEARCH_NOW setzen

      Rev 1.37   24 Feb 1998 15:29:08   JP
   Search..: SWPOSDOC entfernt, auf enums umgestellt

      Rev 1.36   29 Nov 1997 16:48:34   MA
   includes

      Rev 1.35   21 Nov 1997 15:00:26   MA
   includes

      Rev 1.34   30 Sep 1997 16:58:52   TJ
   include

      Rev 1.33   29 Aug 1997 16:40:28   OS
   Suchmethoden fuer Basic returnen immer etwas #43261#, DLL-Umstellung

      Rev 1.32   07 Aug 1997 16:53:12   OS
   auch ReplaceAll returnt BOOL  #42418#

      Rev 1.31   05 Aug 1997 16:36:36   TJ
   include svx/srchitem.hxx

      Rev 1.30   31 Jul 1997 14:59:44   MH
   chg: header

      Rev 1.29   30 Jul 1997 19:05:48   HJS
   includes

      Rev 1.28   23 Jul 1997 21:42:34   HJS
   includes

      Rev 1.27   12 Jul 1997 09:49:46   OS
   keine Dialog fuer RepeatSearch aus der API mit nichtgesetzten SearchItem

      Rev 1.26   11 Jul 1997 13:51:48   OS
   Search, Replace und SearchAll returnen BOOL

      Rev 1.25   30 Jun 1997 18:55:06   JP
   Attributiert suchen: Attrset - Bereich erweitert

      Rev 1.24   24 Jun 1997 10:15:02   OS
   LR und ULSpace ohne _PARA_ #40922#

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/uiview/viewstat.cxx b/sw/source/ui/uiview/viewstat.cxx
new file mode 100644
index 0000000..8b53bf8
--- /dev/null
+++ b/sw/source/ui/uiview/viewstat.cxx
@@ -0,0 +1,606 @@
/*************************************************************************
 *
 *  $RCSfile: viewstat.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:49 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _COM_SUN_STAR_LINGUISTIC_XTHESAURUS_HPP_
#include <com/sun/star/linguistic/XThesaurus.hpp>
#endif

#ifndef _AEITEM_HXX //autogen
#include <svtools/aeitem.hxx>
#endif
#ifndef _SFX_WHITER_HXX //autogen
#include <svtools/whiter.hxx>
#endif
//#ifndef _TWAIN_HXX //autogen
//#include <svtools/twain.hxx>
//#endif
#ifndef _SFX_OBJITEM_HXX //autogen
#include <sfx2/objitem.hxx>
#endif
#ifndef _SVX_PROTITEM_HXX //autogen
#include <svx/protitem.hxx>
#endif
#ifndef _SVXLINKMGR_HXX
#include <svx/linkmgr.hxx>
#endif
#ifndef _SVX_LANGITEM_HXX
#include <svx/langitem.hxx>
#endif
#ifndef _SVX_BRSHITEM_HXX //autogen
#include <svx/brshitem.hxx>
#endif
#ifndef _SVX_HTMLMODE_HXX //autogen
#include <svx/htmlmode.hxx>
#endif
#ifndef _UNO_LINGU_HXX
#include <svx/unolingu.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _SWMODULE_HXX
#include "swmodule.hxx"
#endif


#ifndef _REDLENUM_HXX
#include <redlenum.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _BASESH_HXX
#include <basesh.hxx>
#endif
#ifndef _UITOOL_HXX
#include <uitool.hxx>
#endif
#ifndef _VIEWOPT_HXX
#include <viewopt.hxx>
#endif
#ifndef _TABLEMGR_HXX
#include <tablemgr.hxx>
#endif
#ifndef _PAGEDESC_HXX
#include <pagedesc.hxx>
#endif
#ifndef _WVIEW_HXX
#include <wview.hxx>
#endif
#ifndef _SWGLOBDOCSH_HXX //autogen
#include <globdoc.hxx>
#endif

#ifndef _CMDID_H
#include <cmdid.h>
#endif

using namespace ::com::sun::star;
/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwView::GetState(SfxItemSet &rSet)
{
    SfxWhichIter aIter(rSet);
    sal_uInt16 nWhich = aIter.FirstWhich();
    sal_uInt16 eFrmType = FRMTYPE_NONE;
    int bGetFrmType = sal_False;
    sal_Bool bWeb = 0 != PTR_CAST(SwWebView, this);

    while(nWhich)
    {
        switch(nWhich)
        {
            case FN_EDIT_LINK_DLG:
                if( !pWrtShell->GetLinkManager().GetLinks().Count() )
                    rSet.DisableItem(nWhich);
                else if( pWrtShell->IsSelFrmMode() &&
                            pWrtShell->IsSelObjProtected(FLYPROTECT_CONTENT))
                        rSet.DisableItem(nWhich);
                break;

            case FN_INSERT_CAPTION:
            {
                // Captions gibt's fuer Grafiken, OLE-Objekte, Rahmen und Tabellen
                if( !bGetFrmType )
                    eFrmType = pWrtShell->GetFrmType(0,sal_True), bGetFrmType = sal_True;
                if (! ( ((eFrmType & FRMTYPE_FLY_ANY) && nSelectionType != SwWrtShell::SEL_DRW_TXT)||
                        nSelectionType & SwWrtShell::SEL_TBL ||
                        nSelectionType & SwWrtShell::SEL_DRW) )
                    rSet.DisableItem(nWhich);
                else if( pWrtShell->IsTableMode() )
                    rSet.DisableItem(nWhich);
            }
            break;

            case FN_EDIT_FOOTNOTE:
            {
                if( !pWrtShell->GetCurFtn() )
                    rSet.DisableItem(nWhich);
            }
            break;

            case FN_CHANGE_PAGENUM:
            {
                sal_uInt16 nType = pWrtShell->GetFrmType(0,sal_True);
                if( ( FRMTYPE_FLY_ANY | FRMTYPE_HEADER | FRMTYPE_FOOTER |
                      FRMTYPE_FOOTNOTE | FRMTYPE_DRAWOBJ ) & nType )
                    rSet.DisableItem(nWhich);
                else
                    rSet.Put(SfxUInt16Item(nWhich, pWrtShell->GetPageOffset()));
            }
            break;
            case SID_PRINTDOC:
            case SID_PRINTDOCDIRECT:
                GetSlotState( nWhich, SfxViewShell::GetInterface(), &rSet );
            break;
            case SID_ATTR_PAGE:
            case SID_ATTR_PAGE_SIZE:
            case SID_ATTR_PAGE_PAPERBIN:
            case RES_PAPER_BIN:
            case FN_PARAM_FTN_INFO:
            {
                const sal_uInt16 nCurIdx = pWrtShell->GetCurPageDesc();
                const SwPageDesc& rDesc = pWrtShell->GetPageDesc( nCurIdx );
                ::PageDescToItemSet( rDesc, rSet);
            }
            break;
            case RES_BACKGROUND:
            case SID_ATTR_BRUSH:
            {
                const sal_uInt16 nCurIdx = pWrtShell->GetCurPageDesc();
                const SwPageDesc& rDesc = pWrtShell->GetPageDesc( nCurIdx );
                const SwFrmFmt& rMaster = rDesc.GetMaster();
                const SvxBrushItem& rBrush = (const SvxBrushItem&)
                                    rMaster.GetAttr(RES_BACKGROUND, sal_True);
                rSet.Put(rBrush);
            }
            break;
            case SID_CLEARHISTORY:
            {
                rSet.Put(SfxBoolItem(nWhich, pWrtShell->GetUndoIds() != 0));
            }
            break;
            case SID_UNDO:
            {
                //JP 21.07.98: Bug 53429 - die muss noch nicht vorhanden sein
                //              also lasse sie mal anlegen:
                if( !pShell )
                    SelectShell();

                const SfxPoolItem* pState = pShell->GetSlotState(SID_UNDO);
                if(pState)
                    rSet.Put(*pState);
                else
                    rSet.DisableItem(nWhich);
            }
            break;
            case FN_INSERT_CTRL:
                rSet.Put(SfxUInt16Item(nWhich,
                    bWeb ? SwView::nWebInsertCtrlState : SwView::nInsertCtrlState));
            break;
            case FN_INSERT_OBJ_CTRL:
            if(bWeb)
                rSet.DisableItem(nWhich);
            else
                rSet.Put(SfxUInt16Item(nWhich, SwView::nInsertObjectCtrlState));
            break;
            case FN_UPDATE_TOX:
                if(!pWrtShell->GetTOXCount())
                    rSet.DisableItem(nWhich);
            break;
            case FN_EDIT_CURRENT_TOX:
            case FN_UPDATE_CUR_TOX:
                if(!pWrtShell->GetCurTOX())
                    rSet.DisableItem(nWhich);
            break;
            case SID_TWAIN_SELECT:
            case SID_TWAIN_TRANSFER:
#if defined WIN || defined WNT || defined UNX
            {
                if(!SW_MOD()->GetScannerManager().is())
                    rSet.DisableItem(nWhich);
            }
#endif
            break;
            case RES_PARATR_TABSTOP:
            case SID_ATTR_DEFTABSTOP:
            {
                const SvxTabStopItem& rDefTabs =
                    (const SvxTabStopItem&)pWrtShell->
                                        GetDefault(RES_PARATR_TABSTOP);
                rSet.Put( SfxUInt16Item( nWhich,
                                                (sal_uInt16)::GetTabDist(rDefTabs)));
            }
            break;
            case SID_ATTR_LANGUAGE:
            {
                rSet.Put((const SvxLanguageItem&)
                    pWrtShell->GetDefault(RES_CHRATR_LANGUAGE), SID_ATTR_LANGUAGE);
            }
            break;
            case FN_INSERT_FOOTER:
            case FN_INSERT_HEADER:
                if(!pWrtShell->IsBrowseMode())
                    rSet.DisableItem(nWhich);
                else
                    rSet.Put(SfxBoolItem(nWhich,
                        nWhich == FN_INSERT_HEADER ?
                            pWrtShell->IsHeadInBrowse() :
                                pWrtShell->IsFootInBrowse()));
            break;
            case FN_HYPHENATE_OPT_DLG:
            {
                sal_Bool bCheck = sal_False;

                if (pWrtShell->GetSelectionType() & (SwWrtShell::SEL_DRW_TXT|SwWrtShell::SEL_DRW))
                    bCheck = IsDrawTextHyphenate();
                rSet.Put(SfxBoolItem(nWhich, bCheck));
            }
            break;
        case FN_REDLINE_ON:
            if( pWrtShell->IsInsMode() )
            {
                rSet.Put( SfxBoolItem( nWhich,
                    (pWrtShell->GetRedlineMode() & REDLINE_ON) != 0));
            }
            else
                rSet.DisableItem( nWhich );
            break;
        case FN_REDLINE_SHOW:
            {
                sal_uInt16 nMask = REDLINE_SHOW_INSERT | REDLINE_SHOW_DELETE;
                rSet.Put( SfxBoolItem( nWhich,
                    (pWrtShell->GetRedlineMode() & nMask) == nMask ));
            }
            break;
        case FN_REDLINE_ACCEPT:
            {
                SfxViewFrame* pVFrame = GetViewFrame();
                if (pVFrame->KnowsChildWindow(nWhich))
                    rSet.Put(SfxBoolItem( nWhich, pVFrame->HasChildWindow(nWhich)));
                else
                    rSet.DisableItem(nWhich);
            }
            break;
        case FN_THESAURUS_DLG:
            {
                SwWrtShell  &rSh = GetWrtShell();
                if (2 <= rSh.GetCrsrCnt())  // multi selection?
                    rSet.DisableItem(nWhich);
                else
                {
                    SfxItemPool &rPool = GetPool();
                    SfxItemSet aCoreSet(rPool, RES_CHRATR_LANGUAGE,
                                               RES_CHRATR_LANGUAGE);
                    rSh.GetAttr(aCoreSet);

                    const SfxPoolItem* pItem = 0;
                    SfxItemState eState = aCoreSet.GetItemState(
                            RES_CHRATR_LANGUAGE, sal_False, &pItem);

                    LanguageType nLang = LANGUAGE_NONE;
                    if( SFX_ITEM_DEFAULT == eState )  // provide default if not found
                        pItem = &rPool.GetDefaultItem(RES_CHRATR_LANGUAGE);
                    if( eState >= SFX_ITEM_DEFAULT )
                        nLang = ((SvxLanguageItem* )pItem)->GetLanguage();

                    // disable "Thesaurus" (menu entry and key shortcut) if the
                    // language is not supported (by default it is enabled)
                    uno::Reference< linguistic::XThesaurus >  xThes( ::GetThesaurus() );
                    if (!xThes.is() || nLang == LANGUAGE_NONE ||
                        !xThes->hasLocale( SvxCreateLocale( nLang ) ))
                        rSet.DisableItem(nWhich);
                }
            }
            break;
        case SID_MAIL_SCROLLBODY_PAGEDOWN:
            {
                long nBottom = pWrtShell->GetDocSize().Height() + DOCUMENTBORDER;
                long nAct = GetVisArea().Bottom();
                rSet.Put(SfxBoolItem(SID_MAIL_SCROLLBODY_PAGEDOWN, nAct < nBottom ));
            }
            break;

        case SID_DOCUMENT_COMPARE:
        case SID_DOCUMENT_MERGE:
            if( GetDocShell()->IsA( SwGlobalDocShell::StaticType() ) ||
                pWrtShell->IsAnySectionInDoc( sal_True, sal_True, sal_True ))
                rSet.DisableItem(nWhich);
            break;
        }
        nWhich = aIter.NextWhich();
    }
}


/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwView::GetDrawState(SfxItemSet &rSet)
{
    SfxWhichIter aIter(rSet);
    sal_Bool bWeb = 0 != PTR_CAST(SwWebView, this);

    sal_uInt16 nWhich = aIter.FirstWhich();
    while(nWhich)
    {
        switch(nWhich)
        {
            case SID_INSERT_DRAW:
            {
                if(bWeb)
                    rSet.DisableItem(nWhich);
                else
                {
                    SfxAllEnumItem aEnum(SID_INSERT_DRAW, nDrawSfxId);
                    rSet.Put(aEnum);
                }
            }
            break;

            case SID_SHOW_HIDDEN:
            case SID_SHOW_FORMS:
                rSet.DisableItem( nWhich );
                // rSet.Put( SfxBoolItem(nWhich,sal_True ));
                break;

            case SID_DRAW_TEXT_MARQUEE:
                if (::GetHtmlMode(GetDocShell()) & HTMLMODE_SOME_STYLES)
                    rSet.Put( SfxBoolItem(nWhich, nDrawSfxId == nWhich));
                else
                    rSet.DisableItem(nWhich);
                break;
            case SID_OBJECT_SELECT:
                rSet.Put( SfxBoolItem(nWhich, nDrawSfxId == nWhich || nFormSfxId == nWhich));
                break;
        }
        nWhich = aIter.NextWhich();
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

sal_Bool SwView::HasUIFeature( sal_uInt32 nFeature )
{
    return pWrtShell->IsLabelDoc();
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.147  2000/09/18 16:06:14  willem.vandorp
    OpenOffice header added.

    Revision 1.146  2000/09/08 08:12:54  os
    Change: Set/Toggle/Has/Knows/Show/GetChildWindow

    Revision 1.145  2000/08/18 14:46:23  tl
    #74855# disable Thesaurus for multiselections

    Revision 1.144  2000/05/29 08:03:23  os
    new scanner interface

    Revision 1.143  2000/05/26 07:21:35  os
    old SW Basic API Slots removed

    Revision 1.142  2000/05/15 16:47:34  jp
    Changes for Unicode

    Revision 1.141  2000/05/09 14:43:13  os
    BASIC interface partially removed

    Revision 1.140  2000/04/18 15:02:51  os
    UNICODE

    Revision 1.139  2000/03/23 07:50:25  os
    UNO III

    Revision 1.138  2000/02/16 21:01:21  tl
    #72219# Locale Umstellung

    Revision 1.137  2000/02/15 14:17:26  os
    #72904# INSERT_CAPTION: not allowed in draw text edit

    Revision 1.136  2000/02/11 14:59:48  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.135  2000/01/21 13:29:46  tl
    #70503# disbale Thesaurus slot if language is not support

    Revision 1.134  2000/01/17 14:40:36  os
    #71979# IsAnySectionInDoc: check indexes

    Revision 1.133  1999/06/09 11:19:40  OS
    #66578# new slot: FN_EDIT_CURENT_TOX


      Rev 1.132   09 Jun 1999 13:19:40   OS
   #66578# new slot: FN_EDIT_CURENT_TOX

      Rev 1.131   09 Mar 1999 12:55:50   OS
   #61809# Kein Scanning im RemoteServer

      Rev 1.130   28 Jan 1999 18:16:32   JP
   Bug #59688#: kein vergleichen/zusammenfassen wenn das Doc geschuetzte/versteckte Breiche enthaelt

      Rev 1.129   27 Jan 1999 13:39:54   JP
   Bug #59688#: bei GlobalDokumenten gibts kein vergeleichen oder zusammenfuehren

      Rev 1.128   10 Dec 1998 09:47:16   MIB
   #60060#: Beschriftungen fuer Zeichen-Objekte

      Rev 1.127   27 Nov 1998 15:01:10   AMA
   Fix #59951#59825#: Unterscheiden zwischen Rahmen-,Seiten- und Bereichsspalten

      Rev 1.126   18 Nov 1998 15:06:42   OM
   #59280# FormController Create Modes verlassen

      Rev 1.125   21 Jul 1998 20:48:44   JP
   Bug #53429# GetState mit SID_UNDO - die Shell kann auch noch 0 sein, also anlegen

      Rev 1.124   14 Jul 1998 10:43:46   OM
   #52748# Twain-Menueeintrag

      Rev 1.123   11 Jul 1998 12:28:16   MA
   chg: State fuer scrollbody

      Rev 1.122   09 Jun 1998 15:32:20   OM
   VC-Controls entfernt

      Rev 1.121   01 Apr 1998 17:31:48   OM
   #31111 Rahmen in protecteten Rahmen sind auch geschuetzt

      Rev 1.120   16 Mar 1998 16:18:04   OM
   Aktualisieren-Button kontextsensitiv

      Rev 1.119   15 Mar 1998 15:14:14   OM
   Synchron-Button

      Rev 1.118   12 Mar 1998 12:55:22   OS
   SID_NEWWINDOW nicht mehr ueberladen

      Rev 1.117   03 Mar 1998 16:39:02   OM
   ofa includen

      Rev 1.116   03 Mar 1998 10:43:12   OM
   Redline-Browser

      Rev 1.115   19 Feb 1998 09:35:08   JP
   RedlineMode darf nur im InsertMode einschaltbar sein

      Rev 1.114   18 Feb 1998 15:02:44   JP
   Status erfragen/setzen fuer Redlines anzeigen korrigiert

      Rev 1.113   03 Feb 1998 15:28:22   OM
   Redlining

      Rev 1.112   23 Jan 1998 16:04:16   MA
   includes

      Rev 1.111   06 Jan 1998 07:28:40   OS
   getrennter Status fuer Insert-Controller #46322#

      Rev 1.110   16 Dec 1997 12:00:26   OS
   Impl-Pointer fuer UNO

      Rev 1.109   29 Nov 1997 16:49:26   MA
   includes

      Rev 1.108   28 Nov 1997 11:35:50   TJ
   include

      Rev 1.107   21 Nov 1997 15:00:24   MA
   includes

      Rev 1.106   03 Nov 1997 13:58:28   MA
   precomp entfernt

      Rev 1.105   01 Sep 1997 13:13:56   OS
   DLL-Umstellung

      Rev 1.104   15 Aug 1997 11:48:02   OS
   chartar/frmatr/txtatr aufgeteilt

      Rev 1.103   11 Aug 1997 10:29:42   OS
   paraitem/frmitems/textitem aufgeteilt

      Rev 1.102   31 Jul 1997 14:59:46   MH
   chg: header

      Rev 1.101   09 Jun 1997 14:27:56   MA
   chg: Browse-Flag nur noch am Doc

      Rev 1.100   05 Jun 1997 09:33:40   OS
   FN_INSERT_HEADER/FOOTER im Druck-Layout disablen #40441#

      Rev 1.99   20 Mar 1997 19:15:20   OS
   Objekt einfuegen und Draw einfuegen im Web disabled

      Rev 1.98   11 Mar 1997 16:11:38   OS
   FN_TOOLBOX_SWITCH weg

      Rev 1.97   24 Feb 1997 16:53:56   OM
   Silbentrennung in Draw-Objekten

      Rev 1.96   23 Feb 1997 22:17:56   OM
   Feld-Controller an Textshell verschoben

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/uiview/viewtab.cxx b/sw/source/ui/uiview/viewtab.cxx
new file mode 100644
index 0000000..fb84d56
--- /dev/null
+++ b/sw/source/ui/uiview/viewtab.cxx
@@ -0,0 +1,1974 @@
/*************************************************************************
 *
 *  $RCSfile: viewtab.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:49 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif


#pragma hdrstop

#ifndef _LIST_HXX //autogen
#include <tools/list.hxx>
#endif

#include <hintids.hxx>
#include "uiparam.hxx"
#include "uitool.hxx"

#ifndef _SVX_RULRITEM_HXX //autogen
#include <svx/rulritem.hxx>
#endif
#ifndef _SVX_TSPTITEM_HXX //autogen
#include <svx/tstpitem.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#include <svx/boxitem.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SFX_WHITER_HXX //autogen
#include <svtools/whiter.hxx>
#endif
#ifndef _SVX_RULER_HXX //autogen
#include <svx/ruler.hxx>
#endif
#ifndef _SVX_PROTITEM_HXX //autogen
#include <svx/protitem.hxx>
#endif
#ifndef _SFXRECTITEM_HXX //autogen
#include <svtools/rectitem.hxx>
#endif
#ifndef _SFX_BINDINGS_HXX
#include <sfx2/bindings.hxx>
#endif

#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _FMTHDFT_HXX //autogen
#include <fmthdft.hxx>
#endif
#ifndef _FMTCLDS_HXX //autogen
#include <fmtclds.hxx>
#endif
#ifndef _FMTORNT_HXX //autogen
#include <fmtornt.hxx>
#endif
#ifndef _FRMATR_HXX
#include <frmatr.hxx>
#endif
#include "view.hxx"
#include "wrtsh.hxx"
#include "basesh.hxx"
#include "cmdid.h"
#include "viewopt.hxx"
#include "tabcol.hxx"
#include "frmfmt.hxx"       // FrameFormat
#include "pagedesc.hxx"     // Aktuelles Seitenformat
#include "wview.hxx"
#include "fmtcol.hxx"
#include "section.hxx"

/*--------------------------------------------------------------------
    Beschreibung:   Debug-Methode
 --------------------------------------------------------------------*/
#ifdef DEBUGLIN


static void DebugTabCols(const SwTabCols &rCols)
{
    String aTmp("TabCols LeftMin ");
    aTmp += rCols.GetLeftMin() / 56;
    aTmp += "Left: ";
    aTmp += rCols.GetLeft() / 56;
    aTmp += "Right: ";
    aTmp += rCols.GetRight() / 56;
    aTmp += "RightMax: ";
    aTmp += rCols.GetRightMax() / 56;
    aTmp += ": ";
    const USHORT nCount = rCols.Count();
    for(USHORT i = 0; i < nCount; ++i) {
        aTmp += rCols[i] / 56;
        aTmp += ' ';
    }
    InfoBox(0, aTmp).Execute();
}



static void DebugColItems(SvxColumnItem& rColItem)
{
    String aTmp("Aktuell: ");
    aTmp += rColItem.GetActColumn();
    aTmp += " ColLeft: ";
    aTmp +=  String(rColItem.GetLeft() / 56);
    aTmp += "   ColRight: ";
    aTmp +=  String(rColItem.GetRight() / 56);
    for(USHORT i = 0; i < rColItem.Count(); ++i) {
        aTmp += " Start: ";
        aTmp += String(rColItem[i].nStart/56);
        aTmp += " End: ";
        aTmp += String(rColItem[i].nEnd/56);
    }

    InfoBox(0, aTmp).Execute();
}


static void DebugLRSpace(const SvxLongLRSpaceItem& rLRSpace)
{
    String aTmp("Left: ");
    aTmp += rLRSpace.GetLeft() / 56;
    aTmp += "   Right: ";
    aTmp += rLRSpace.GetRight() / 56;
    InfoBox(0, aTmp).Execute();
}



static void DebugULSpace(const SvxLongULSpaceItem& rULSpace)
{
    String aTmp("Upper: ");
    aTmp += rULSpace.GetUpper() / 56;
    aTmp += "   Lower: ";
    aTmp += rULSpace.GetLower() / 56;

    InfoBox(0, aTmp).Execute();
}



static void DebugTabStops(const SvxTabStopItem& rTabs)
{
    String aTmp("Tabs: ");

    // Def Tabs loeschen
    for(USHORT i = 0; i < rTabs.Count(); ++i)
    {
        aTmp += String(rTabs[i].GetTabPos() / 56);
        aTmp += " : ";
    }
    InfoBox(0, aTmp).Execute();
}



static void DebugParaMargin(const SvxLRSpaceItem& rLRSpace)
{
    String aTmp("ParaLeft: ");
    aTmp += rLRSpace.GetTxtLeft() / 56;
    aTmp += "   ParaRight: ";
    aTmp += rLRSpace.GetRight() / 56;
    aTmp += "   FLI: ";
    aTmp += rLRSpace.GetTxtFirstLineOfst() / 56;
    InfoBox(0, aTmp).Execute();
}
#define DEBUGTABCOLS( bla )     DebugTabCols( bla )
#define DEBUGCOLITEMS( bla )    DebugColItems   ( bla )
#define DEBUGLRSPACE( bla )     DebugLRSpace    ( bla )
#define DEBUGULSPACE( bla )     DebugULSpace    ( bla )
#define DEBUGTABSTOPS( bla )    DebugTabStops   ( bla )
#define DEBUGPARAMARGIN( bla )  DebugParaMargin ( bla )
#else
#define DEBUGTABCOLS
#define DEBUGCOLITEMS
#define DEBUGLRSPACE
#define DEBUGULSPACE
#define DEBUGTABSTOPS
#define DEBUGPARAMARGIN
#endif


/*--------------------------------------------------------------------
    Beschreibung:   Columns eintueten
 --------------------------------------------------------------------*/


void lcl_FillSvxColumn(const SwFmtCol& rCol,
                          USHORT nTotalWidth,
                          SvxColumnItem& rColItem,
                          long nDistance)
{
    const SwColumns& rCols = rCol.GetColumns();

    USHORT nWidth = 0;

    for ( USHORT i = 0; i < rCols.Count(); ++i )
    {
        SwColumn* pCol = rCols[i];
        const USHORT nStart = USHORT(pCol->GetLeft() + nWidth + nDistance);
        nWidth += rCol.CalcColWidth(i, nTotalWidth);
        const USHORT nEnd = USHORT(nWidth - pCol->GetRight() + nDistance);

        SvxColumnDescription aColDesc(nStart, nEnd, TRUE);
        rColItem.Append(aColDesc);
    }

    // ?? gleichverteilte Spalten
}

/*--------------------------------------------------------------------
    Beschreibung:   ColumnItem in ColumnInfo ueberfuehren
 --------------------------------------------------------------------*/


void lcl_ConvertToCols(const SvxColumnItem& rColItem,
                          USHORT nTotalWidth,
                          SwFmtCol& rCols)
{
    ASSERT( rCols.GetNumCols() == rColItem.Count(), "Column count mismatch" );

    USHORT nLeft    = 0;
    SwTwips nSumAll= 0;  // Summiere alle Spalten und Raender auf

    SwColumns& rArr = rCols.GetColumns();

    // Tabcols der Reihe nach
    for( USHORT i=0; i < rColItem.Count()-1; ++i )
    {
        DBG_ASSERT(rColItem[i+1].nStart >= rColItem[i].nEnd,"\201berlappende Spalten" );
        USHORT nStart = rColItem[i+1].nStart;
        USHORT nEnd = rColItem[i].nEnd;
        if(nStart < nEnd)
            nStart = nEnd;
        const USHORT nDiff  = nStart - nEnd;
        const USHORT nRight = nDiff / 2;

        USHORT nWidth = rColItem[i].nEnd - rColItem[i].nStart;
        nWidth += nLeft + nRight;

        SwColumn* pCol = rArr[i];
        pCol->SetWishWidth( USHORT(long(rCols.GetWishWidth()) * long(nWidth) /
                                                            long(nTotalWidth) ));
        pCol->SetLeft( nLeft );
        pCol->SetRight( nRight );
        nSumAll += pCol->GetWishWidth();

        nLeft = nRight;
    }
    rArr[rColItem.Count()-1]->SetLeft( nLeft );

    //Die Differenz aus der Gesamtwunschbreite und der Summe der bisher berechneten
    // Spalten und Raender sollte die Breite der letzten Spalte ergeben.
    rArr[rColItem.Count()-1]->SetWishWidth( rCols.GetWishWidth() - (USHORT)nSumAll );

    rCols.SetOrtho(FALSE, 0, 0 );
}

/*--------------------------------------------------------------------
    Beschreibung:   Tabs loeschen
 --------------------------------------------------------------------*/


void lcl_EraseDefTabs(SvxTabStopItem& rTabStops)
{
    // Def Tabs loeschen
    for ( USHORT i = 0; i < rTabStops.Count(); )
    {
        // Hier auch den DefTab auf Null rausschmeissen
        if ( SVX_TAB_ADJUST_DEFAULT == rTabStops[i].GetAdjustment() ||
            rTabStops[i].GetTabPos() == 0 )
        {
            rTabStops.Remove(i);
            continue;
        }
        ++i;
    }
}

/*--------------------------------------------------------------------
    Beschreibung:   Seitenrand umdrehen
 --------------------------------------------------------------------*/


void SwView::SwapPageMargin(const SwPageDesc& rDesc, SvxLRSpaceItem& rLRSpace)
{
    USHORT nPhyPage, nVirPage;
    GetWrtShell().GetPageNum( nPhyPage, nVirPage );

    if ( rDesc.GetUseOn() == PD_MIRROR && (nPhyPage % 2) == 0 )
    {
        USHORT nTmp = rLRSpace.GetRight();
        rLRSpace.SetRight( rLRSpace.GetLeft() );
        rLRSpace.SetLeft( nTmp );
    }
}

/*--------------------------------------------------------------------
    Beschreibung:   Wenn der Rahmenrand verschoben wird, sollen die
                    Spaltentrenner an der gleichen absoluten Position bleiben
 --------------------------------------------------------------------*/


void lcl_Scale(long& nVal, long nScale)
{
    nVal *= nScale;
    nVal >>= 8;
}

void ResizeFrameCols(SwFmtCol& rCol,
                    long nOldWidth,
                    long nNewWidth,
                    long nLeftDelta )
{
    SwColumns& rArr = rCol.GetColumns();
    long nWishSum = (long)rCol.GetWishWidth();
    long nWishDiff = (nWishSum * 100/nOldWidth * nNewWidth) / 100 - nWishSum;
    long nNewWishWidth = nWishSum + nWishDiff;
    if(nNewWishWidth > 0xffffl)
    {
        // wenn die Wunschbreite zu gross wird, dann muessen alle Werte passend skaliert werden
        long nScale = (0xffffl << 8)/ nNewWishWidth;
        for(USHORT i = 0; i < rArr.Count(); i++)
        {
            SwColumn* pCol = rArr.GetObject(i);
            long nVal = pCol->GetWishWidth();
            lcl_Scale(nVal, nScale);
            pCol->SetWishWidth((USHORT) nVal);
            nVal = pCol->GetLeft();
            lcl_Scale(nVal, nScale);
            pCol->SetLeft((USHORT) nVal);
            nVal = pCol->GetRight();
            lcl_Scale(nVal, nScale);
            pCol->SetRight((USHORT) nVal);
        }
        lcl_Scale(nNewWishWidth, nScale);
        lcl_Scale(nWishDiff, nScale);
    }
    rCol.SetWishWidth( (USHORT) (nNewWishWidth) );

    if( nLeftDelta >= 2 || nLeftDelta <= -2)
        rArr[0]->SetWishWidth(rArr[0]->GetWishWidth() + (USHORT)nWishDiff);
    else
        rArr[rArr.Count()-1]->SetWishWidth(rArr[rArr.Count()-1]->GetWishWidth() + (USHORT)nWishDiff);

}
/*--------------------------------------------------------------------
    Beschreibung:   Hier werden alle Aenderungen der Tableiste
                    wieder in das Modell geschossen
 --------------------------------------------------------------------*/


void SwView::ExecTabWin( SfxRequest& rReq )
{
    SwWrtShell &rSh         = GetWrtShell();
    const USHORT nFrmType   = rSh.IsObjSelected() ?
                                    FRMTYPE_DRAWOBJ :
                                        rSh.GetFrmType(0,TRUE);
    const BOOL  bFrmSelection = rSh.IsFrmSelected();
    BOOL bBrowse = rSh.IsBrowseMode();


    const USHORT nSlot      = rReq.GetSlot();
    const USHORT nDescId    = rSh.GetCurPageDesc();
    const SwPageDesc& rDesc = rSh.GetPageDesc( nDescId );

    const SwFmtHeader& rHeaderFmt = rDesc.GetMaster().GetHeader();
    SwFrmFmt *pHeaderFmt = (SwFrmFmt*)rHeaderFmt.GetHeaderFmt();

    const SwFmtFooter& rFooterFmt = rDesc.GetMaster().GetFooter();
    SwFrmFmt *pFooterFmt = (SwFrmFmt*)rFooterFmt.GetFooterFmt();

    const SwFmtFrmSize &rFrmSize = rDesc.GetMaster().GetFrmSize();
    const SwRect& rPrtRect = rSh.GetAnyCurRect(RECT_PAGE);
    const long nPageWidth  = bBrowse ?
                                rPrtRect.Width() :
                                    rFrmSize.GetWidth();
    const long nPageHeight = bBrowse ?
                                rPrtRect.Height() :
                                    rFrmSize.GetHeight();
    const SfxItemSet* pArgs = rReq.GetArgs();
    // RULER_BORDERS wird sicherheitshalber nicht recorded
    // da gibt es Aerger im Sfx
    const SfxPoolItem* pItem;

    BOOL bUnlockView = FALSE;
    rSh.StartAllAction();

    switch  ( nSlot )
    {
    case RES_LR_SPACE:
    case SID_ATTR_LRSPACE:
    {
        if(SFX_ITEM_SET == pArgs->GetItemState(RES_LR_SPACE, FALSE, &pItem))
        {
            const  SvxLRSpaceItem* pLR = (const SvxLRSpaceItem*)pItem;

            SvxLongLRSpaceItem aLongLR((long)pLR->GetLeft(),
                                        (long)pLR->GetRight(),
                                        SID_ATTR_LONG_LRSPACE);
            SfxRequest aReq(SID_ATTR_LONG_LRSPACE, SFX_CALLMODE_SLOT, GetPool());
            aReq.AppendItem(aLongLR);
            ExecTabWin( aReq );
        }
    }
    break;
    case SID_ATTR_LONG_LRSPACE:
    {
        SvxLongLRSpaceItem aLongLR( (const SvxLongLRSpaceItem&)rReq.GetArgs()->
                                                    Get( SID_ATTR_LONG_LRSPACE ) );
        SvxLRSpaceItem aLR;
        DEBUGLRSPACE(aLongLR);
        BOOL bSect = 0 != (nFrmType & FRMTYPE_COLSECT);
        BOOL bTableColumns = 0 != rSh.GetTableFmt();
        if(bSect && (bTableColumns || nFrmType & FRMTYPE_COLUMN))
        {
            SwRect aLastRect = rSh.GetAnyCurRect(RECT_SECTION);
            long nOldLeft = (long)(aLastRect.Left() - DOCUMENTBORDER);
            long nOldRight = (long)(nPageWidth + DOCUMENTBORDER - aLastRect.Right());
            //welche Seite wurde veraendert? Rundungsfehler vermeiden
            BOOL bLeftChanged = Abs(nOldLeft - aLongLR.GetLeft()) > Abs(nOldRight - aLongLR.GetRight());
            const SwFrmFmt* pFmt = 0;
            if(bTableColumns)
            {
                SwTabCols aTabCols;
                rSh.GetTabCols(aTabCols);
                //fuer die erste bzw. letzte Spalte wird der Tabellenrand veraendert, sonst
                //die Spaltentrenner
                USHORT nCurColNo = rSh.GetCurTabColNum();
                USHORT nColCount = aTabCols.Count() + 1;

                if(0 == nCurColNo && bLeftChanged)
                {
                    //die erste
                    long nNewColPos = aLongLR.GetLeft();
                    if(nNewColPos >= aTabCols.GetLeftMin())
                        aTabCols.SetLeft((USHORT)nNewColPos - aTabCols.GetLeftMin()+ DOCUMENTBORDER);

                }
                else if(nColCount - 1 == nCurColNo && !bLeftChanged)
                {
                    //die letzte
                    long nNewColPos = aLongLR.GetRight();
                    nNewColPos = nPageWidth - nNewColPos + DOCUMENTBORDER - aTabCols.GetLeftMin();
                    if(nNewColPos <= aTabCols.GetRightMax())
                        aTabCols.SetRight((USHORT)nNewColPos);
                }
                else
                {
                    //mittendrin
                    long nLeftBorder;
                    long nRightBorder;
                    if(bLeftChanged)
                    {
                        nLeftBorder = nCurColNo - 1 ? aTabCols[nCurColNo - 2] : aTabCols.GetLeft();
                        nRightBorder =  nCurColNo < nColCount - 1 ? aTabCols[nCurColNo] : aTabCols.GetRight();
                    }
                    else
                    {
                        nLeftBorder = nCurColNo ? aTabCols[nCurColNo - 1] : aTabCols.GetLeft();
                        nRightBorder =  nCurColNo + 1 < nColCount ? aTabCols[nCurColNo + 1] : aTabCols.GetRight();
                    }

                    long nNewColPos = bLeftChanged ? aLongLR.GetLeft() : aLongLR.GetRight();
                    //hier muss noch die Border-Distance der Zelle eingerechnet werden
                    if(bLeftChanged)
                        nNewColPos = nNewColPos + DOCUMENTBORDER - aTabCols.GetLeftMin();
                    else
                        nNewColPos = nPageWidth - nNewColPos + DOCUMENTBORDER - aTabCols.GetLeftMin();


                    if(nNewColPos < nLeftBorder + MINLAY)
                        nNewColPos  = nLeftBorder + MINLAY;
                    else if(nNewColPos > nRightBorder - MINLAY)
                        nNewColPos = nRightBorder - MINLAY;
                    aTabCols[nCurColNo - (bLeftChanged ? 1 : 0)] = (USHORT)nNewColPos;
                }
                rSh.SetTabCols(aTabCols, FALSE);
            }
            else if(0 != (pFmt = rSh.GetFlyFrmFmt()))
            {
                SwFmtCol aCol = pFmt->GetCol();
                SwColumns& aCols = aCol.GetColumns();
//              const SwRect &rSizeRect = rSh.GetAnyCurRect(RECT_FLY_PRT_EMBEDDED);
                const SwRect aFlyRect = rSh.GetAnyCurRect(RECT_FLY_EMBEDDED);
                const long lWidth = aFlyRect.Width();
                USHORT nCurFrameCol = rSh.GetCurOutColNum() - 1;
                USHORT nColCount = aCols.Count();
                SfxItemSet aSet( GetPool(), RES_FRM_SIZE, RES_FRM_SIZE,
                                            RES_HORI_ORIENT, RES_HORI_ORIENT,
                                            RES_COL, RES_COL, 0 );

                if((0 == nCurFrameCol && bLeftChanged) ||
                        (nColCount - 1 == nCurFrameCol && !bLeftChanged))
                {
                    //in LRSpace umsetzen
                    long nDeltaX = bLeftChanged ?
                                    DOCUMENTBORDER + aLongLR.GetLeft() - aFlyRect.Left()
                                    : 0 ;
                    SwFmtHoriOrient aHoriOrient( pFmt->GetHoriOrient() );
                    aHoriOrient.SetHoriOrient( HORI_NONE );
                    aHoriOrient.SetPos( aHoriOrient.GetPos() + nDeltaX );

                    SwFmtFrmSize aSize( pFmt->GetFrmSize() );
                    long nOldWidth = (long) aSize.GetWidth();

                    long nWidthDiff = nOldLeft - aLongLR.GetLeft() +
                                            nOldRight - aLongLR.GetRight();
                    long nNewWidth = nOldWidth + nWidthDiff;
                    if(aSize.GetWidthPercent())
                    {
                        SwRect aRect;
                        rSh.CalcBoundRect(aRect, FLY_IN_CNTNT);
                        long nPrtWidth = aRect.Width();
                        aSize.SetWidthPercent(BYTE((
                            nNewWidth) * 100 /nPrtWidth));
                    }
                    else
                        aSize.SetWidth( nNewWidth );

                    ::ResizeFrameCols(aCol, nOldWidth, (long)aSize.GetWidth(), nDeltaX );
                    aSet.Put( aSize );
                    aSet.Put( aHoriOrient );

                }
                else //Spalten veraendert
                {
                    long nLeftBorder = 0;
                    long nRightBorder = lWidth;
                    long nOldColPos = 0;
                    long nNewColPos = bLeftChanged ? aLongLR.GetLeft() : aLongLR.GetRight();
                    if(!bLeftChanged)
                        nNewColPos = nPageWidth - nNewColPos;

                    //mittendrin
                    long nWidth = 0;
                    for ( USHORT i = 0; i < aCols.Count(); ++i )
                    {
                        SwColumn* pCol = aCols[i];
                        nWidth += aCol.CalcColWidth(i, lWidth);
                        if( i == (bLeftChanged ? nCurFrameCol - 1 : nCurFrameCol))
                            nOldColPos = nWidth;
                        if( i == (bLeftChanged ? nCurFrameCol - 2 : nCurFrameCol - 1))
                            nLeftBorder = nWidth;
                        if(i == (bLeftChanged ? nCurFrameCol : nCurFrameCol + 1))
                            nRightBorder = nWidth;
                    }
                    nNewColPos -= aFlyRect.Left();
                    nNewColPos += DOCUMENTBORDER;
                    if(nNewColPos < nLeftBorder + MINLAY)
                        nNewColPos  = nLeftBorder + MINLAY;
                    else if(nNewColPos > nRightBorder - MINLAY)
                        nNewColPos = nRightBorder - MINLAY;


                    // in WishWidth umrechnen:
                    nNewColPos = nNewColPos * long(aCol.GetWishWidth()) / lWidth;
                    nOldColPos = nOldColPos * long(aCol.GetWishWidth()) / lWidth;
                    long nDiff = nNewColPos - nOldColPos;

                    SwColumn* pCol = aCols[bLeftChanged ? nCurFrameCol : nCurFrameCol + 1];
                    pCol->SetWishWidth(long(pCol->GetWishWidth()) - nDiff );
                    //den Nachbarn in umgekehrter Weise veraendern
                    pCol = aCols[bLeftChanged ? nCurFrameCol - 1 : nCurFrameCol ];
                    pCol->SetWishWidth(long(pCol->GetWishWidth()) + nDiff );
                }
                aSet.Put( aCol );
                rSh.StartAction();
                rSh.Push();
                rSh.SetFlyFrmAttr( aSet );
                //die Rahmenselektion wieder aufheben
                if(!bFrmSelection && rSh.IsFrmSelected())
                {
                    rSh.UnSelectFrm();
                    rSh.LeaveSelFrmMode();
                }
                rSh.Pop();
                rSh.EndAction();

            }
            else
            {
                //Seitenspalten
                USHORT nCurCol = rSh.GetCurOutColNum();
                nCurCol--;
                const SwFrmFmt& rMaster = rDesc.GetMaster();
                SwFmtCol aCol(rMaster.GetCol());
                SwColumns& aCols = aCol.GetColumns();
                //SvxColumnItem aColItem(nCurCol);
                const SwRect aPageRect = rSh.GetAnyCurRect(RECT_PAGE_PRT);
                const long lWidth = aPageRect.Width();
                USHORT nColCount = aCols.Count();
                SfxItemSet aSet( GetPool(), RES_FRM_SIZE, RES_FRM_SIZE,
                                            RES_HORI_ORIENT, RES_HORI_ORIENT,
                                            RES_COL, RES_COL, 0 );

                if((0 == nCurCol && bLeftChanged) ||
                        (nColCount - 1 == nCurCol && !bLeftChanged))
                {
                    // Seitenraender einstellen
                    SvxLRSpaceItem aLR;
                    aLR.SetLeft ((aPageRect.Left()/* - DOCUMENTBORDER*/));
                    aLR.SetRight((nPageWidth + /*DOCUMENTBORDER*/ - aPageRect.Right()));
                    if(bLeftChanged)
                        aLR.SetLeft((USHORT)aLongLR.GetLeft());
                    else
                        aLR.SetRight((USHORT)aLongLR.GetRight());
                    SwapPageMargin( rDesc, aLR );
                    SwPageDesc aDesc( rDesc );
                    aDesc.GetMaster().SetAttr( aLR );
                    rSh.ChgPageDesc( nDescId, aDesc );
                }
                else //Spalten veraendert ?
                {
                    long nLeftBorder = 0;
                    long nRightBorder = nPageWidth;
                    long nOldColPos = 0;
                    long nNewColPos = bLeftChanged ? aLongLR.GetLeft() : aLongLR.GetRight();
                    if(!bLeftChanged)
                        nNewColPos = nPageWidth - nNewColPos;

                    //mittendrin
                    long nWidth = 0;
                    for ( USHORT i = 0; i < aCols.Count(); ++i )
                    {
                        SwColumn* pCol = aCols[i];
                        nWidth += aCol.CalcColWidth(i, lWidth);
                        if( i == (bLeftChanged ? nCurCol - 1 : nCurCol))
                            nOldColPos = nWidth;
                        if( i == (bLeftChanged ? nCurCol - 2 : nCurCol - 1))
                            nLeftBorder = nWidth;
                        if(i == (bLeftChanged ? nCurCol : nCurCol + 1))
                            nRightBorder = nWidth;
                    }
                    nNewColPos -= aPageRect.Left();
//                  nNewColPos += DOCUMENTBORDER;
                    if(nNewColPos < nLeftBorder + MINLAY)
                        nNewColPos  = nLeftBorder + MINLAY;
                    else if(nNewColPos > nRightBorder - MINLAY)
                        nNewColPos = nRightBorder - MINLAY;


                    // in WishWidth umrechnen:
                    nNewColPos = nNewColPos * long(aCol.GetWishWidth()) / lWidth;
                    nOldColPos = nOldColPos * long(aCol.GetWishWidth()) / lWidth;
                    long nDiff = nNewColPos - nOldColPos;

                    SwColumn* pCol = aCols[bLeftChanged ? nCurCol : nCurCol + 1];
                    pCol->SetWishWidth(long(pCol->GetWishWidth()) - nDiff );
                    //den Nachbarn in umgekehrter Weise veraendern
                    pCol = aCols[bLeftChanged ? nCurCol - 1 : nCurCol ];
                    pCol->SetWishWidth(long(pCol->GetWishWidth()) + nDiff );
                }
                SwPageDesc aDesc( rDesc );
                aDesc.GetMaster().SetAttr( aCol );
                rSh.ChgPageDesc( rSh.GetCurPageDesc(), aDesc );


/*              aSet.Put( aCol );
//              rSh.StartAction();
//              rSh.Push();
//              rSh.SetFlyFrmAttr( aSet );*/
            }
        }
        else if ( bFrmSelection || nFrmType & FRMTYPE_FLY_ANY )
        {
            SwFrmFmt* pFmt = ((SwFrmFmt*)rSh.GetFlyFrmFmt());
            const SwRect &rRect = rSh.GetAnyCurRect(RECT_FLY_EMBEDDED);
            long nDeltaX = DOCUMENTBORDER + aLongLR.GetLeft() -
                        rRect.Left();
            SwFmtHoriOrient aHoriOrient( pFmt->GetHoriOrient() );
            aHoriOrient.SetHoriOrient( HORI_NONE );
            aHoriOrient.SetPos( aHoriOrient.GetPos() + nDeltaX );

            SwFmtFrmSize aSize( pFmt->GetFrmSize() );
            long nOldWidth = (long) aSize.GetWidth();

            if(aSize.GetWidthPercent())
            {
                SwRect aRect;
                rSh.CalcBoundRect(aRect, FLY_IN_CNTNT);
                long nPrtWidth = aRect.Width();
                aSize.SetWidthPercent(BYTE((nPageWidth - aLongLR.GetLeft() - aLongLR.GetRight()) * 100 /nPrtWidth));
            }
            else
                aSize.SetWidth( nPageWidth -
                        (aLongLR.GetLeft() + aLongLR.GetRight()));

            SfxItemSet aSet( GetPool(), RES_FRM_SIZE, RES_FRM_SIZE,
                                        RES_HORI_ORIENT, RES_HORI_ORIENT,
                                        RES_COL, RES_COL, 0 );

            if( nFrmType & FRMTYPE_COLUMN )
            {
                SwFmtCol aCol(pFmt->GetCol());

                ::ResizeFrameCols(aCol, nOldWidth, (long)aSize.GetWidth(), nDeltaX );
                aSet.Put(aCol);
            }

            aSet.Put( aSize );
            aSet.Put( aHoriOrient );

            rSh.StartAction();
            rSh.Push();
            rSh.SetFlyFrmAttr( aSet );
            //die Rahmenselektion wieder aufheben
            if(!bFrmSelection && rSh.IsFrmSelected())
            {
                rSh.UnSelectFrm();
                rSh.LeaveSelFrmMode();
            }
            rSh.Pop();
            rSh.EndAction();
        }
        else if ( nFrmType & ( FRMTYPE_HEADER | FRMTYPE_FOOTER ))
        {
            // Seitenraender rausrechnen
            USHORT nOld = rDesc.GetMaster().GetLRSpace().GetLeft();
            aLongLR.SetLeft( nOld > (USHORT)aLongLR.GetLeft() ? 0 : aLongLR.GetLeft() - nOld );

            nOld = rDesc.GetMaster().GetLRSpace().GetRight();
            aLongLR.SetRight( nOld > (USHORT)aLongLR.GetRight() ? 0 : aLongLR.GetRight() - nOld );
            aLR.SetLeft((USHORT)aLongLR.GetLeft());
            aLR.SetRight((USHORT)aLongLR.GetRight());

            if ( nFrmType & FRMTYPE_HEADER )
                pHeaderFmt->SetAttr( aLR );
            else
                pFooterFmt->SetAttr( aLR );
        }
        else if( nFrmType == FRMTYPE_DRAWOBJ)
        {
            SwRect aRect( rSh.GetObjRect() );
            aRect.Left( aLongLR.GetLeft() + DOCUMENTBORDER );
            aRect.Right( nPageWidth + DOCUMENTBORDER - aLongLR.GetRight());
            rSh.SetObjRect( aRect );
        }
        else
        {   // Seitenraender einstellen
            aLR.SetLeft((USHORT)aLongLR.GetLeft());
            aLR.SetRight((USHORT)aLongLR.GetRight());
            SwapPageMargin( rDesc, aLR );
            SwPageDesc aDesc( rDesc );
            aDesc.GetMaster().SetAttr( aLR );
            rSh.ChgPageDesc( nDescId, aDesc );
        }
    }
    break;
    case RES_UL_SPACE:
    case SID_ATTR_ULSPACE:
    {
        if(SFX_ITEM_SET == pArgs->GetItemState(RES_UL_SPACE, FALSE, &pItem))
        {
            const  SvxULSpaceItem* pUL = (const SvxULSpaceItem*)pItem;

            SvxLongULSpaceItem aLongUL((long)pUL->GetUpper(), (long)pUL->GetLower(),
                                        SID_ATTR_LONG_ULSPACE);
            SfxRequest aReq(SID_ATTR_LONG_ULSPACE, SFX_CALLMODE_SLOT, GetPool());
            aReq.AppendItem(aLongUL);
            ExecTabWin( aReq );
        }
    }
    break;
    case SID_ATTR_LONG_ULSPACE:
    {
        SvxLongULSpaceItem aLongULSpace( (const SvxLongULSpaceItem&)rReq.GetArgs()->
                                                        Get( SID_ATTR_LONG_ULSPACE ));
        DEBUGULSPACE(aLongULSpace);

        if( bFrmSelection || nFrmType & FRMTYPE_FLY_ANY )
        {
            SwFrmFmt* pFmt = ((SwFrmFmt*)rSh.GetFlyFrmFmt());

            const SwRect &rRect = rSh.GetAnyCurRect(RECT_FLY_EMBEDDED);
            const long nDeltaY = DOCUMENTBORDER + aLongULSpace.GetUpper() -
                                    rRect.Top();
            const long nHeight = nPageHeight -
                            (aLongULSpace.GetUpper() + aLongULSpace.GetLower());

            SwFmtVertOrient aVertOrient(pFmt->GetVertOrient());
            aVertOrient.SetVertOrient(VERT_NONE);
            aVertOrient.SetPos(aVertOrient.GetPos() + nDeltaY );

            SwFmtFrmSize aSize(pFmt->GetFrmSize());
            if(aSize.GetHeightPercent())
            {
                SwRect aRect;
                rSh.CalcBoundRect(aRect, FLY_IN_CNTNT);
                long nPrtHeight = aRect.Height();
                aSize.SetHeightPercent(BYTE(nHeight * 100 /nPrtHeight));
            }
            else
                aSize.SetHeight(nHeight );

            SfxItemSet aSet( GetPool(), RES_FRM_SIZE, RES_FRM_SIZE,
                                        RES_VERT_ORIENT, RES_VERT_ORIENT, 0 );
            aSet.Put( aSize );
            aSet.Put( aVertOrient );
            rSh.SetFlyFrmAttr( aSet );
        }
        else if( nFrmType == FRMTYPE_DRAWOBJ )
        {
            SwRect aRect( rSh.GetObjRect() );
            const SwRect &rPageRect = rSh.GetAnyCurRect(RECT_PAGE);
            aRect.Top( aLongULSpace.GetUpper() + rPageRect.Top() );
            aRect.Bottom( rPageRect.Bottom() - aLongULSpace.GetLower() );
            rSh.SetObjRect( aRect ) ;
        }
        else
        {   SwPageDesc aDesc( rDesc );

            if ( nFrmType & ( FRMTYPE_HEADER | FRMTYPE_FOOTER ))
            {

                const BOOL bHead = nFrmType & FRMTYPE_HEADER ? TRUE : FALSE;
                SvxULSpaceItem aUL( rDesc.GetMaster().GetULSpace() );
                if ( bHead )
                    aUL.SetUpper( (USHORT)aLongULSpace.GetUpper() );
                else
                    aUL.SetLower( (USHORT)aLongULSpace.GetLower() );
                aDesc.GetMaster().SetAttr( aUL );

                SwFmtFrmSize aSz( bHead ? pHeaderFmt->GetFrmSize() :
                                          pFooterFmt->GetFrmSize() );
                aSz.SetSizeType( ATT_FIX_SIZE );
                aSz.SetHeight(nPageHeight - aLongULSpace.GetLower() -
                                            aLongULSpace.GetUpper() );
                if ( bHead )
                    pHeaderFmt->SetAttr( aSz );
                else
                    pFooterFmt->SetAttr( aSz );
            }
            else
            {
                SvxULSpaceItem aUL;
                aUL.SetUpper((USHORT)aLongULSpace.GetUpper());
                aUL.SetLower((USHORT)aLongULSpace.GetLower());
                aDesc.GetMaster().SetAttr(aUL);
            }

            rSh.ChgPageDesc( nDescId, aDesc );
        }
    }
    break;
    case SID_ATTR_TABSTOP:
    {
        SvxTabStopItem aTabStops( (const SvxTabStopItem&)rReq.GetArgs()->
                                                    Get( RES_PARATR_TABSTOP ));
        DEBUGTABSTOPS(aTabStops);
        const SvxTabStopItem& rDefTabs =
                    (const SvxTabStopItem&)rSh.GetDefault(RES_PARATR_TABSTOP);

        // Default-Tab an Pos 0
        SfxItemSet aSet( GetPool(), RES_LR_SPACE, RES_LR_SPACE );
        rSh.GetAttr( aSet );
        const SvxLRSpaceItem& rLR = (const SvxLRSpaceItem&)aSet.Get(RES_LR_SPACE);

        if ( rLR.GetTxtFirstLineOfst() < 0 )
        {
            SvxTabStop aSwTabStop( 0, SVX_TAB_ADJUST_DEFAULT );
            aTabStops.Insert( aSwTabStop );
        }

        // auffuellen mit Default-Tabs
        USHORT nDef = ::GetTabDist( rDefTabs );
        ::MakeDefTabs( nDef, aTabStops );

        SwTxtFmtColl* pColl = rSh.GetCurTxtFmtColl();
        if( pColl && pColl->IsAutoUpdateFmt() )
        {
            SfxItemSet aSet(GetPool(), RES_PARATR_TABSTOP, RES_PARATR_TABSTOP);
            aSet.Put(aTabStops);
            rSh.AutoUpdatePara( pColl, aSet);
        }
        else
            rSh.SetAttr( aTabStops );
        break;
    }
    case SID_ATTR_PARA_LRSPACE:
    {
        SvxLRSpaceItem aParaMargin((const SvxLRSpaceItem&)rReq.
                                        GetArgs()->Get(SID_ATTR_PARA_LRSPACE));

        if(nFrmType & FRMTYPE_FLY_ANY)
        {
// os: Wegen #42444# wird hier der Umrandungsabstand eingefuegt
            SfxItemSet aCoreSet( GetPool(),
                                    RES_BOX, RES_BOX,
                                    SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER, 0 );
            SvxBoxInfoItem aBoxInfo;
            aCoreSet.Put( aBoxInfo );
            rSh.GetFlyFrmAttr( aCoreSet );
            const SvxBoxItem& rBox = (const SvxBoxItem&)aCoreSet.Get(RES_BOX);
            USHORT nDist = (USHORT)rBox.GetDistance();
            aParaMargin.SetRight(Max((long)(aParaMargin.GetRight() - nDist), (long)0));
            if(aParaMargin.GetLeft() < nDist)
                nDist = aParaMargin.GetLeft();
            aParaMargin.SetTxtLeft(aParaMargin.GetTxtLeft() - nDist);
        }
        DEBUGPARAMARGIN(aParaMargin);

        aParaMargin.SetWhich( RES_LR_SPACE );
        SwTxtFmtColl* pColl = rSh.GetCurTxtFmtColl();
        if( pColl && pColl->IsAutoUpdateFmt() )
        {
            SfxItemSet aSet(GetPool(), RES_LR_SPACE, RES_LR_SPACE);
            aSet.Put(aParaMargin);
            rSh.AutoUpdatePara( pColl, aSet);
        }
        else
            rSh.SetAttr( aParaMargin );

        if ( aParaMargin.GetTxtFirstLineOfst() < 0 )
        {
            SfxItemSet aSet( GetPool(), RES_PARATR_TABSTOP, RES_PARATR_TABSTOP );

            rSh.GetAttr( aSet );
            const SvxTabStopItem&  rTabStops = (const SvxTabStopItem&)aSet.Get(RES_PARATR_TABSTOP);

            // Haben wir einen Tab an Stelle Null
            for ( USHORT i = 0; i < rTabStops.Count(); ++i )
                if ( rTabStops[i].GetTabPos() == 0 )
                    break;

            if ( i >= rTabStops.Count() )
            {
                // Kein DefTab
                SvxTabStopItem aTabStops;
                aTabStops = rTabStops;

                ::lcl_EraseDefTabs(aTabStops);

                SvxTabStop aSwTabStop( 0, SVX_TAB_ADJUST_DEFAULT );
                aTabStops.Insert(aSwTabStop);

                const SvxTabStopItem& rDefTabs =
                    (const SvxTabStopItem&)rSh.GetDefault(RES_PARATR_TABSTOP);
                USHORT nDef = ::GetTabDist(rDefTabs);
                ::MakeDefTabs( nDef, aTabStops );

                if( pColl && pColl->IsAutoUpdateFmt())
                {
                    SfxItemSet aSet(GetPool(), RES_PARATR_TABSTOP, RES_PARATR_TABSTOP);
                    aSet.Put(aTabStops);
                    rSh.AutoUpdatePara( pColl, aSet);
                }
                else
                    rSh.SetAttr( aTabStops );
            }
        }
    }
    break;
    case SID_RULER_BORDERS:
    {
        SvxColumnItem aColItem((const SvxColumnItem&)rReq.
                                            GetArgs()->Get(SID_RULER_BORDERS));

        BOOL bSect = 0 != (nFrmType & FRMTYPE_COLSECT);
        if( bSetTabColFromDoc || !bSect && rSh.GetTableFmt() )
        {
            ASSERT(aColItem.Count(), "ColDesc ist leer!!");

            const BOOL bSingleLine = ((const SfxBoolItem&)rReq.
                            GetArgs()->Get(SID_RULER_ACT_LINE_ONLY)).GetValue();

            DEBUGCOLITEMS(aColItem);
            SwTabCols aTabCols;
            if ( bSetTabColFromDoc )
                rSh.GetMouseTabCols( aTabCols, aTabColFromDocPos );
            else
                rSh.GetTabCols(aTabCols);
            DEBUGTABCOLS(aTabCols);

            // linker Tabellenrand
            long nBorder = long(aColItem.GetLeft()) -
                             (long(aTabCols.GetLeftMin()) - DOCUMENTBORDER);
            aTabCols.SetLeft( nBorder );

            nBorder = nPageWidth - aTabCols.GetLeftMin() +
                              DOCUMENTBORDER - aColItem.GetRight();

            aTabCols.SetRight( nBorder );

            // Tabcols der Reihe nach
            // Die letzte Col wird durch den Rand definiert
            for ( USHORT i = 0; i < aColItem.Count()-1; ++i )
            {
                const SvxColumnDescription& rCol = aColItem[i];
                aTabCols[i] = rCol.nEnd + aTabCols.GetLeft();
                aTabCols.SetHidden( i, !rCol.bVisible );
            }
            DEBUGTABCOLS(aTabCols);

            if ( bSetTabColFromDoc )
            {
                if( !rSh.IsViewLocked() )
                {
                    bUnlockView = TRUE;
                    rSh.LockView( TRUE );
                }
                rSh.SetMouseTabCols( aTabCols, bSingleLine,
                                               aTabColFromDocPos );
            }
            else
                rSh.SetTabCols(aTabCols, bSingleLine);

        }
        else
        {
            if ( bFrmSelection || nFrmType & FRMTYPE_FLY_ANY || bSect)
            {
                SwSectionFmt *pSectFmt = 0;
                SfxItemSet aSet( GetPool(), RES_COL, RES_COL );
                if(bSect)
                {
                    const SwSection *pSect = rSh.GetAnySection();
                    ASSERT( pSect, "Welcher Bereich?");
                    pSectFmt = pSect->GetFmt();
                }
                else
                {
                    rSh.GetFlyFrmAttr( aSet );
                }
                SwFmtCol aCols(
                    bSect ?
                        pSectFmt->GetCol() :
                            (const SwFmtCol&)aSet.Get( RES_COL, FALSE ));

                const long lWidth = rSh.GetAnyCurRect(bSect ? RECT_SECTION : RECT_FLY_PRT_EMBEDDED).Width();
                ::lcl_ConvertToCols( aColItem, USHORT(lWidth), aCols );
                DEBUGCOLITEMS(aColItem);
                aSet.Put( aCols );
                if(bSect)
                    rSh.SetSectionAttr( aSet, pSectFmt );
                else
                {
                    rSh.StartAction();
                    rSh.Push();
                    rSh.SetFlyFrmAttr( aSet );
                    //die Rahmenselektion wieder aufheben
                    if(!bFrmSelection && rSh.IsFrmSelected())
                    {
                        rSh.UnSelectFrm();
                        rSh.LeaveSelFrmMode();
                    }
                    rSh.Pop();
                    rSh.EndAction();
                }
            }
            else
            {
                SwFmtCol aCols( rDesc.GetMaster().GetCol() );
                ::lcl_ConvertToCols( aColItem,
                                USHORT(rSh.GetAnyCurRect(RECT_PAGE_PRT).Width()),
                                aCols );
                DEBUGCOLITEMS(aColItem);
                SwPageDesc aDesc( rDesc );
                aDesc.GetMaster().SetAttr( aCols );
                rSh.ChgPageDesc( rSh.GetCurPageDesc(), aDesc );
            }
        }
        break;
    }
    default:
        ASSERT( !this, "Falsche SlotId");
    }
    rSh.EndAllAction();

    if( bUnlockView )
        rSh.LockView( FALSE );

    bSetTabColFromDoc = bTabColFromDoc = FALSE;
}

/*--------------------------------------------------------------------
    Beschreibung:   Hier wird der Status der Tableiste ermittelt
                    sprich alle relevanten Attribute an der CursorPos
                    werden der Tableiste uebermittelt
 --------------------------------------------------------------------*/


void SwView::StateTabWin(SfxItemSet& rSet)
{
    SwWrtShell &rSh         = GetWrtShell();

    const Point* pPt = IsTabColFromDoc() ? &aTabColFromDocPos : 0;
    const USHORT nFrmType   = rSh.IsObjSelected()
                ? FRMTYPE_DRAWOBJ
                : rSh.GetFrmType( pPt, TRUE );

    const BOOL  bFrmSelection = rSh.IsFrmSelected();

    BOOL bBrowse = rSh.IsBrowseMode();
    WinBits nStyle = pHLineal->GetStyle();
    if(!(nStyle&WB_EXTRAFIELD) != bBrowse)
    {
        if(bBrowse)
            nStyle &= ~WB_EXTRAFIELD;
        else
            nStyle |= WB_EXTRAFIELD;
        pHLineal->SetStyle(nStyle);
    }

    // PageOffset/Begrenzer
    const SwRect& rPageRect = rSh.GetAnyCurRect( RECT_PAGE, pPt );
    const SwRect& rPagePrtRect = rSh.GetAnyCurRect( RECT_PAGE_PRT, pPt );
    const long nPageWidth  = rPageRect.Width();
    const long nPageHeight = rPageRect.Height();

    const SwPageDesc& rDesc = rSh.GetPageDesc( rSh.GetCurPageDesc() );
    SvxLRSpaceItem aPageLRSpace( rDesc.GetMaster().GetLRSpace() );
    SwapPageMargin( rDesc, aPageLRSpace );

    SfxItemSet aCoreSet( GetPool(), RES_PARATR_TABSTOP, RES_PARATR_TABSTOP,
                                    RES_LR_SPACE,        RES_UL_SPACE, 0 );
    rSh.GetAttr( aCoreSet );
    USHORT nSelectionType = rSh.GetSelectionType();

    SfxWhichIter aIter( rSet );
    USHORT nWhich = aIter.FirstWhich();

    while ( nWhich )
    {
        switch ( nWhich )
        {
        case RES_LR_SPACE:
        case SID_ATTR_LRSPACE:
        case SID_ATTR_LONG_LRSPACE:
        {
            SvxLongLRSpaceItem aLongLR( (long)aPageLRSpace.GetLeft(),
                                        (long)aPageLRSpace.GetRight(),
                                        SID_ATTR_LONG_LRSPACE);
            if(bBrowse)
            {
                aLongLR.SetLeft(rPagePrtRect.Left());
                aLongLR.SetRight(nPageWidth - rPagePrtRect.Right());
            }
            if ( ( nFrmType & FRMTYPE_HEADER || nFrmType & FRMTYPE_FOOTER ) &&
                 !(nFrmType & FRMTYPE_COLSECT) )
            {
                SwFrmFmt *pFmt = (SwFrmFmt*) (nFrmType & FRMTYPE_HEADER ?
                                rDesc.GetMaster().GetHeader().GetHeaderFmt() :
                                rDesc.GetMaster().GetFooter().GetFooterFmt());
                SwRect aRect( rSh.GetAnyCurRect( RECT_HEADERFOOTER, pPt));
                aRect.Pos() -= rSh.GetAnyCurRect( RECT_PAGE, pPt ).Pos();
                const SvxLRSpaceItem& aLR = pFmt->GetLRSpace();
                aLongLR.SetLeft ( (long)aLR.GetLeft() + (long)aRect.Left() );
                aLongLR.SetRight( (nPageWidth -
                                    (long)aRect.Right() + (long)aLR.GetRight()));
            }
            else
            {
                SwRect aRect;
                if( !bFrmSelection && (nFrmType & FRMTYPE_COLSECT) )
                    aRect = rSh.GetAnyCurRect(RECT_SECTION, pPt);
                else if ( bFrmSelection || nFrmType & FRMTYPE_FLY_ANY )
                    aRect = rSh.GetAnyCurRect(RECT_FLY_EMBEDDED, pPt);
                else if( nFrmType & FRMTYPE_DRAWOBJ)
                    aRect = rSh.GetObjRect();
                if( aRect.Width() )
                {
                    aLongLR.SetLeft ((long)(aRect.Left() - DOCUMENTBORDER));
                    aLongLR.SetRight((long)(nPageWidth + DOCUMENTBORDER - aRect.Right()));
                }
            }
            if( nWhich == SID_ATTR_LONG_LRSPACE )
                rSet.Put( aLongLR );
            else
            {
                SvxLRSpaceItem aLR((USHORT)aLongLR.GetLeft(),
                                    (USHORT)aLongLR.GetRight(),
                                    nWhich);
                rSet.Put(aLR);
            }
            DEBUGLRSPACE(aLongLR);
            break;
        }
        case SID_ATTR_LONG_ULSPACE:
        case SID_ATTR_ULSPACE:
        case RES_UL_SPACE:
        {
            // Rand Seite Oben Unten
            SvxULSpaceItem aUL( rDesc.GetMaster().GetULSpace() );
            SvxLongULSpaceItem aLongUL( (long)aUL.GetUpper(),
                                        (long)aUL.GetLower(),
                                        SID_ATTR_LONG_ULSPACE);

            if ( bFrmSelection || nFrmType & FRMTYPE_FLY_ANY )
            {
                // Dokumentkoordinaten Frame auf Seitenkoordinaten umbrechen
                const SwRect &rRect = rSh.GetAnyCurRect(RECT_FLY_EMBEDDED, pPt);
                aLongUL.SetUpper((USHORT)(rRect.Top() - rPageRect.Top() ));
                aLongUL.SetLower((USHORT)(rPageRect.Bottom() - rRect.Bottom() ));
            }
            else if ( nFrmType & FRMTYPE_HEADER || nFrmType & FRMTYPE_FOOTER )
            {
                SwRect aRect( rSh.GetAnyCurRect( RECT_HEADERFOOTER, pPt));
                aRect.Pos() -= rSh.GetAnyCurRect( RECT_PAGE, pPt ).Pos();
                aLongUL.SetUpper( (USHORT)aRect.Top() );
                aLongUL.SetLower( (USHORT)(nPageHeight - aRect.Bottom()) );
            }
            else if( nFrmType & FRMTYPE_DRAWOBJ)
            {
                const SwRect &rRect = rSh.GetObjRect();
                aLongUL.SetUpper((rRect.Top() - rPageRect.Top()));
                aLongUL.SetLower((rPageRect.Bottom() - rRect.Bottom()));
            }
            else if(bBrowse)
            {
                aLongUL.SetUpper(rPagePrtRect.Top());
                aLongUL.SetLower(nPageHeight - rPagePrtRect.Bottom());
            }
            if( nWhich == SID_ATTR_LONG_ULSPACE )
                rSet.Put( aLongUL );
            else
            {
                SvxULSpaceItem aUL((USHORT)aLongUL.GetUpper(),
                                    (USHORT)aLongUL.GetLower(),
                                    nWhich);
                rSet.Put(aUL);
            }
            DEBUGULSPACE(aLongUL);
            break;
        }
        case RES_PARATR_TABSTOP:
        {
            if ( ISA( SwWebView ) ||
                 IsTabColFromDoc() ||
                 ( nSelectionType & SwWrtShell::SEL_GRF) ||
                    (nSelectionType & SwWrtShell::SEL_FRM) ||
                    (nSelectionType & SwWrtShell::SEL_OLE) ||
                    SFX_ITEM_AVAILABLE > aCoreSet.GetItemState(RES_LR_SPACE)
                 )
                rSet.DisableItem( RES_PARATR_TABSTOP );
            else
            {   SvxTabStopItem aTabStops((const SvxTabStopItem&)
                                            aCoreSet.Get( RES_PARATR_TABSTOP ));

                const SvxTabStopItem& rDefTabs = (const SvxTabStopItem&)
                                            rSh.GetDefault(RES_PARATR_TABSTOP);

                DBG_ASSERT(pHLineal, "warum ist das Lineal nicht da?")
                pHLineal->SetDefTabDist( ::GetTabDist(rDefTabs) );
                ::lcl_EraseDefTabs(aTabStops);
                DEBUGTABSTOPS(aTabStops);
                rSet.Put(aTabStops);
            }
            break;
        }
        case SID_ATTR_PARA_LRSPACE:
        {
            if ( nSelectionType & SwWrtShell::SEL_GRF ||
                    nSelectionType & SwWrtShell::SEL_FRM ||
                    nSelectionType & SwWrtShell::SEL_OLE ||
                    nFrmType == FRMTYPE_DRAWOBJ )
                rSet.DisableItem(SID_ATTR_PARA_LRSPACE);
            else
            {
                SvxLRSpaceItem aLR;
                if ( !IsTabColFromDoc() )
                    aLR = (const SvxLRSpaceItem&)aCoreSet.Get(RES_LR_SPACE);
                DEBUGPARAMARGIN(aLR);
                aLR.SetWhich(SID_ATTR_PARA_LRSPACE);
                if(nFrmType & FRMTYPE_FLY_ANY)
                {
// os: Wegen #42444# wird hier der Umrandungsabstand eingefuegt
                    USHORT nDist;
                    if( IsTabColFromDoc() )
                    {
                        const SwRect& rPrtRect = rSh.GetAnyCurRect(
                                        RECT_FLY_PRT_EMBEDDED, pPt );
                        nDist = rPrtRect.Left();
                    }
                    else
                    {
                        SfxItemSet aCoreSet( GetPool(),
                                                RES_BOX, RES_BOX,
                                                SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER, 0 );
                        SvxBoxInfoItem aBoxInfo;
                        aCoreSet.Put( aBoxInfo );
                        rSh.GetFlyFrmAttr( aCoreSet );
                        const SvxBoxItem& rBox = (const SvxBoxItem&)aCoreSet.Get(RES_BOX);
                        nDist = (USHORT)rBox.GetDistance();
                    }
                    aLR.SetRight(aLR.GetRight() + nDist);
                    aLR.SetTxtLeft(aLR.GetTxtLeft() + nDist);
                }
                rSet.Put(aLR);
            }
            break;
        }
        case SID_RULER_BORDERS:
        {
            if ( IsTabColFromDoc() ||
                    ( rSh.GetTableFmt() && !bFrmSelection &&
                    !(nFrmType & FRMTYPE_COLSECT ) ) )
            {
                SwTabCols aTabCols;
                USHORT    nNum;
                if ( 0 != ( bSetTabColFromDoc = IsTabColFromDoc() ) )
                {
                    rSh.GetMouseTabCols( aTabCols, aTabColFromDocPos );
                    nNum = rSh.GetCurMouseTabColNum( aTabColFromDocPos );
                }
                else
                {
                    rSh.GetTabCols( aTabCols );
                    nNum = rSh.GetCurTabColNum();
                }

                ASSERT(nNum <= aTabCols.Count(), "TabCol not found");
                int nLft = aTabCols.GetLeftMin() -
                                  USHORT(DOCUMENTBORDER) +
                                  aTabCols.GetLeft();

                int nRgt = (USHORT)nPageWidth -
                                  (aTabCols.GetLeftMin() +
                                  aTabCols.GetRight() -
                                  USHORT(DOCUMENTBORDER) );

                const USHORT nL = nLft > 0 ? nLft : 0;
                const USHORT nR = nRgt > 0 ? nRgt : 0;

                SvxColumnItem aColItem(nNum, nL, nR);

                USHORT nStart = 0,
                       nEnd;

                for ( USHORT i = 0; i < aTabCols.Count(); ++i )
                {
                    nEnd  = aTabCols[i] - aTabCols.GetLeft();
                    SvxColumnDescription aColDesc( nStart, nEnd,
                                                   !aTabCols.IsHidden(i) );
                    aColItem.Append(aColDesc);
                    nStart = nEnd;
                }
                SvxColumnDescription aColDesc(nStart,
                                aTabCols.GetRight() - aTabCols.GetLeft(), TRUE);
                aColItem.Append(aColDesc);
                rSet.Put(aColItem);
                DEBUGCOLITEMS(aColItem);
            }
            else if ( bFrmSelection || nFrmType & ( FRMTYPE_COLUMN | FRMTYPE_COLSECT ) )
            {
                // Aus Rahmen oder Seite ?
                USHORT nNum = 0;
                if(bFrmSelection)
                {
                    const SwFrmFmt* pFmt = rSh.GetFlyFrmFmt();
                    if(pFmt)
                        nNum = pFmt->GetCol().GetNumCols();
                }
                else
                    nNum = rSh.GetCurColNum();

                if(
                    //eigentlich sollte FRMTYPE_COLSECT nicht enthalten sein, wenn der Rahmen selektiert ist!
                    !bFrmSelection &&
                    nFrmType & FRMTYPE_COLSECT )
                {
                    const SwSection *pSect = rSh.GetAnySection();
                    ASSERT( pSect, "Welcher Bereich?");
                    if( pSect )
                    {
                        SwSectionFmt *pFmt = pSect->GetFmt();
                        const SwFmtCol& rCol = pFmt->GetCol();
                        SvxColumnItem aColItem(--nNum);
                        const SwRect &rRect = rSh.GetAnyCurRect(RECT_SECTION, pPt);

                        ::lcl_FillSvxColumn(rCol, USHORT(rRect.Width()), aColItem, 0);

                        aColItem.SetLeft ((USHORT)(rRect.Left() - DOCUMENTBORDER ));
                        aColItem.SetRight((USHORT)(nPageWidth   - rRect.Right() -
                                                                    DOCUMENTBORDER ));

                        aColItem.SetOrtho(aColItem.CalcOrtho());

                        rSet.Put(aColItem);
                        DEBUGCOLITEMS(aColItem);
                    }
                }
                else if( bFrmSelection || nFrmType & FRMTYPE_FLY_ANY )
                {
                    // Spalten in Rahmen
                    if ( nNum  )
                    {
                        nNum--;
                        const SwFrmFmt* pFmt = rSh.GetFlyFrmFmt() ;

                        const SwFmtCol& rCol = pFmt->GetCol();
                        SvxColumnItem aColItem(nNum);
                        const SwRect &rSizeRect = rSh.GetAnyCurRect(RECT_FLY_PRT_EMBEDDED, pPt);

                        const long lWidth = rSizeRect.Width();
                        const SwRect &rRect = rSh.GetAnyCurRect(RECT_FLY_EMBEDDED, pPt);
                        long nDist2 = (rRect.Width() - lWidth) /2;
                        ::lcl_FillSvxColumn(rCol, USHORT(lWidth), aColItem, nDist2);

                        SfxItemSet aFrameSet(GetPool(), RES_LR_SPACE, RES_LR_SPACE);
                        rSh.GetFlyFrmAttr( aFrameSet );

                        aColItem.SetLeft ((USHORT)(rRect.Left() - DOCUMENTBORDER ));
                        aColItem.SetRight((USHORT)(nPageWidth   - rRect.Right() -
                                                                    DOCUMENTBORDER ));

                        aColItem.SetOrtho(aColItem.CalcOrtho());

                        rSet.Put(aColItem);
                        DEBUGCOLITEMS(aColItem);
                    }
                    else
                        rSet.DisableItem(SID_RULER_BORDERS);
                }
                else
                {   // Spalten auf der Seite
                    nNum--;
                    const SwFrmFmt& rMaster = rDesc.GetMaster();
                    SwFmtCol aCol(rMaster.GetCol());
                    SvxColumnItem aColItem(nNum);
                    const long lWidth = rSh.GetAnyCurRect(RECT_PAGE_PRT, pPt).Width();
                    const SvxBoxItem& rBox = (const SvxBoxItem&)rMaster.GetAttr(RES_BOX);
                    long nDist = rBox.GetDistance();
                    ::lcl_FillSvxColumn(aCol, USHORT(lWidth), aColItem, nDist);

                    if(bBrowse)
                    {
                        aColItem.SetLeft((USHORT)rPagePrtRect.Left());
                        aColItem.SetRight(USHORT(nPageWidth - rPagePrtRect.Right()));
                    }
                    else
                    {
                        aColItem.SetLeft (aPageLRSpace.GetLeft());
                        aColItem.SetRight(aPageLRSpace.GetRight());
                    }
                    aColItem.SetOrtho(aColItem.CalcOrtho());

                    rSet.Put(aColItem);
                    DEBUGCOLITEMS(aColItem);
                }
            }
            else
                rSet.DisableItem(SID_RULER_BORDERS);
            break;
        }
        case SID_RULER_PAGE_POS:
        {
            SvxPagePosSizeItem aPagePosSize(
                    Point( DOCUMENTBORDER , rPageRect.Top()) ,
                    nPageWidth, nPageHeight);
            rSet.Put(aPagePosSize);
            break;
        }
        case SID_RULER_LR_MIN_MAX:
        {
            Rectangle aRectangle;
            if( ( nFrmType & FRMTYPE_COLSECT ) && !IsTabColFromDoc() &&
                ( nFrmType & ( FRMTYPE_TABLE|FRMTYPE_COLUMN ) ) )
            {
                if( nFrmType & FRMTYPE_TABLE )
                {
                    const USHORT nNum = rSh.GetCurTabColNum();
                    SwTabCols aTabCols;
                    rSh.GetTabCols( aTabCols );

                    int nLft = aTabCols.GetLeftMin() -
                                    USHORT(DOCUMENTBORDER) +
                                    aTabCols.GetLeft();

                    int nRgt = (USHORT)nPageWidth -
                                    (aTabCols.GetLeftMin() +
                                    aTabCols.GetRight() -
                                    USHORT(DOCUMENTBORDER) );

                    const USHORT nL = nLft > 0 ? nLft : 0;
                    const USHORT nR = nRgt > 0 ? nRgt : 0;

                    aRectangle.Left() = nL;
                    if(nNum > 1)
                        aRectangle.Left() += aTabCols[nNum - 2];
                    if(nNum)
                        aRectangle.Left() += MINLAY;
                    if(aTabCols.Count() <= nNum + 1 )
                        aRectangle.Right() = nR;
                    else
                        aRectangle.Right() = nPageWidth - (nL + aTabCols[nNum + 1]);

                    if(nNum < aTabCols.Count())
                        aRectangle.Right() += MINLAY;
                }
                else
                {
                    const SwFrmFmt* pFmt =  rSh.GetFlyFrmFmt();
                    const SwFmtCol* pCols = pFmt ? &pFmt->GetCol():
                                                   &rDesc.GetMaster().GetCol();
                    const SwColumns& rCols = pCols->GetColumns();
                    USHORT nNum = rSh.GetCurOutColNum();
                    USHORT nCount = Min(USHORT(nNum + 1), rCols.Count());
                    const SwRect aRect( rSh.GetAnyCurRect( pFmt
                                                    ? RECT_FLY_PRT_EMBEDDED
                                                    : RECT_PAGE_PRT, pPt ));
                    const SwRect aAbsRect( rSh.GetAnyCurRect( pFmt
                                                    ? RECT_FLY_EMBEDDED
                                                    : RECT_PAGE, pPt ));

                    //die Breite im Rahmen bzw. innerhalbe der Seitenraender
                    const USHORT nTotalWidth = (USHORT)aRect.Width();
                    //die gesamte Rahmenbreite - die Differenz ist der doppelte Abstand zum Rand
                    const USHORT nOuterWidth = (USHORT)aAbsRect.Width();
                    int nWidth = 0,
                        nStart = 0,
                        nEnd = 0;
                    aRectangle.Left() = 0;
                    for ( int i = 0; i < nCount; ++i )
                    {
                        SwColumn* pCol = rCols[i];
                        nStart = pCol->GetLeft() + nWidth;
                        if(i == nNum - 2)
                            aRectangle.Left() = nStart;
                        nWidth += pCols->CalcColWidth( i, nTotalWidth );
                        nEnd = nWidth - pCol->GetRight();
                    }
                    aRectangle.Right() = nPageWidth - nEnd;
                    aRectangle.Left() -= DOCUMENTBORDER;
                    aRectangle.Right() += DOCUMENTBORDER;
                    if(nNum > 1)
                    {
                        aRectangle.Left() += MINLAY;
                        aRectangle.Left() += aRect.Left();
                    }
                    if(pFmt) //Bereich in Rahmen - hier darf man bis zum Rand
                        aRectangle.Left()  = aRectangle.Right() = 0;
                    else
                    {
                        // das Rechteck an die richtige absolute Position verschieben
                        aRectangle.Left() += aAbsRect.Left();
                        aRectangle.Right() -= aAbsRect.Left();
                        // Abstand zur Umrandung mit einbeziehen
                        aRectangle.Right() -= (nOuterWidth - nTotalWidth) / 2;
                    }

                    if(nNum < rCols.Count())
                    {
                        aRectangle.Right() += MINLAY;
                    }
                    else
                        // rechts ist jetzt nur noch der Seitenrand
                        aRectangle.Right() = 0;


                }
            }
            else if ( ((nFrmType & FRMTYPE_TABLE) || IsTabColFromDoc()) &&
                 !bFrmSelection )
            {
                BOOL bColumn;
                if ( IsTabColFromDoc() )
                    bColumn = rSh.GetCurMouseColNum( aTabColFromDocPos ) != 0;
                else
                    bColumn = (nFrmType & (FRMTYPE_COLUMN|FRMTYPE_FLY_ANY|
                                            FRMTYPE_COLSECTOUTTAB)) ?
                                            TRUE : FALSE;
                if ( !bColumn )
                {
                    if( nFrmType & FRMTYPE_FLY_ANY && IsTabColFromDoc() )
                    {
                        SwRect aRect( rSh.GetAnyCurRect(
                                            RECT_FLY_PRT_EMBEDDED, pPt ) );
                        aRect.Pos() += rSh.GetAnyCurRect( RECT_FLY_EMBEDDED,
                                                                pPt ).Pos();

                        aRectangle.Left()  = aRect.Left() - DOCUMENTBORDER;
                        aRectangle.Right() = nPageWidth - ( aRect.Right()
                                                         - DOCUMENTBORDER );
                    }
                    else if( bBrowse )
                    {
                        aRectangle.Left()  = rPagePrtRect.Left();
                        aRectangle.Right() = nPageWidth - rPagePrtRect.Right();
                    }
                    else
                    {
                        aRectangle.Left()  = aPageLRSpace.GetLeft();
                        aRectangle.Right() = aPageLRSpace.GetRight();
                    }
                }
                else
                {   //hier nur fuer Tabelle in mehrspaltigen Seiten und Rahmen
                    BOOL bSectOutTbl = (nFrmType & FRMTYPE_TABLE) ? TRUE : FALSE;
                    BOOL bFrame = (nFrmType & FRMTYPE_FLY_ANY) ? TRUE : FALSE;
                    BOOL bColSct =  (nFrmType & ( bSectOutTbl
                                                    ? FRMTYPE_COLSECTOUTTAB
                                                    : FRMTYPE_COLSECT )
                                                ) ? TRUE : FALSE;
                    //Damit man auch mit der Mouse ziehen kann,
                    //ohne in der Tabelle zu stehen
                    CurRectType eRecType = RECT_PAGE_PRT;
                    int nNum = IsTabColFromDoc() ?
                                rSh.GetCurMouseColNum( aTabColFromDocPos ):
                                rSh.GetCurOutColNum();
                    const SwFrmFmt* pFmt = NULL;
                    if( bColSct )
                    {
                        eRecType = bSectOutTbl ? RECT_OUTTABSECTION
                                               : RECT_SECTION;
                        const SwSection *pSect = rSh.GetAnySection( bSectOutTbl );
                        ASSERT( pSect, "Welcher Bereich?");
                        pFmt = pSect->GetFmt();
                    }
                    else if( bFrame )
                    {
                        pFmt = rSh.GetFlyFrmFmt();
                        eRecType = RECT_FLY_PRT_EMBEDDED;
                    }

                    const SwFmtCol* pCols = pFmt ? &pFmt->GetCol():
                                                   &rDesc.GetMaster().GetCol();
                    const SwColumns& rCols = pCols->GetColumns();
                    const USHORT nBorder = pFmt ? pFmt->GetBox().GetDistance() :
                                                  rDesc.GetMaster().GetBox().GetDistance();

                    /* RECT_FLY_PRT_EMBEDDED returns the relative position to
                        RECT_FLY_EMBEDDED
                        the absolute position must be added here
                    */
                    SwRect aRect( rSh.GetAnyCurRect( eRecType, pPt ) );
                    if(RECT_FLY_PRT_EMBEDDED == eRecType)
                        aRect.Pos() += rSh.GetAnyCurRect( RECT_FLY_EMBEDDED,
                                                                pPt ).Pos();

                    const USHORT nTotalWidth = (USHORT)aRect.Width();
                    //nStart und nEnd initialisieren fuer nNum == 0
                    int nWidth = 0,
                        nStart = 0,
                        nEnd = nTotalWidth;

                    if( nNum > rCols.Count() )
                    {
                        ASSERT( !this, "es wird auf dem falschen FmtCol gearbeitet!" );
                        nNum = rCols.Count();
                    }

                    for( int i = 0; i < nNum; ++i )
                    {
                        SwColumn* pCol = rCols[i];
                        nStart = pCol->GetLeft() + nWidth;
                        nWidth += pCols->CalcColWidth( i, nTotalWidth );
                        nEnd = nWidth - pCol->GetRight();
                    }
                    if( bFrame | bColSct )
                    {
                        aRectangle.Left()  = aRect.Left()
                                                - DOCUMENTBORDER + nStart;
                        aRectangle.Right() = nPageWidth
                                                - aRectangle.Left()
                                                    - nEnd + nStart;
                    }
                    else if(!bBrowse)
                    {
                        aRectangle.Left()  = aPageLRSpace.GetLeft() + nStart;
                        aRectangle.Right() = nPageWidth - nEnd - aPageLRSpace.GetLeft();
                    }
                    else
                    {
                        long nLeft = rPagePrtRect.Left();
                        aRectangle.Left()  = nStart + nLeft;
                        aRectangle.Right() = nPageWidth - nEnd - nLeft;
                    }
                    if(!bFrame)
                    {
                        aRectangle.Left() += nBorder;
                        aRectangle.Right() -= nBorder;
                    }
                }
            }
            else if ( nFrmType & ( FRMTYPE_HEADER  | FRMTYPE_FOOTER ))
            {
                aRectangle.Left()  = aPageLRSpace.GetLeft();
                aRectangle.Right() = aPageLRSpace.GetRight();
            }
            else
                aRectangle.Left()  = aRectangle.Right() = 0;

            SfxRectangleItem aLR( SID_RULER_LR_MIN_MAX , aRectangle);
            rSet.Put(aLR);
        }
        break;
        case SID_RULER_PROTECT:
        {
            if(bFrmSelection)
            {
                BYTE nProtect = pWrtShell->IsSelObjProtected((FlyProtectType)(FLYPROTECT_SIZE|FLYPROTECT_POS|FLYPROTECT_CONTENT));

                SvxProtectItem aProt(SID_RULER_PROTECT);
                aProt.SetCntntProtect((nProtect & FLYPROTECT_CONTENT)   != 0);
                aProt.SetSizeProtect ((nProtect & FLYPROTECT_SIZE)      != 0);
                aProt.SetPosProtect  ((nProtect & FLYPROTECT_POS)       != 0);
                rSet.Put(aProt);
            }
            else
            {
                SvxProtectItem aProtect(SID_RULER_PROTECT);
                if(bBrowse && !(nFrmType & (FRMTYPE_DRAWOBJ|FRMTYPE_COLUMN)) && !rSh.GetTableFmt())
                {
                    aProtect.SetSizeProtect(TRUE);
                    aProtect.SetPosProtect(TRUE);
                }
                rSet.Put(aProtect);
            }
        }
        break;
        }
        nWhich = aIter.NextWhich();
    }
}


/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.130  2000/09/18 16:06:14  willem.vandorp
    OpenOffice header added.

    Revision 1.129  2000/09/07 15:59:33  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.128  2000/08/29 13:59:32  ama
    New: Negative margins

    Revision 1.127  2000/08/23 12:49:45  kz
    function Max (long, long)

    Revision 1.126  2000/05/26 07:21:35  os
    old SW Basic API Slots removed

    Revision 1.125  2000/05/10 11:53:20  os
    Basic API removed

    Revision 1.124  2000/04/18 15:02:51  os
    UNICODE

    Revision 1.123  2000/01/17 13:32:55  jp
    Bug #70616#: StateTabWin - if IsTabColFromDoc-Flag set then get/set info only over layoutpos

    Revision 1.122  1999/11/23 14:56:37  os
    #69106# LR_MIN_MAX in frames corrected

    Revision 1.121  1999/06/21 07:20:54  OS
    #66284##66928# correct display of frames with columns


      Rev 1.120   21 Jun 1999 09:20:54   OS
   #66284##66928# correct display of frames with columns

      Rev 1.119   04 Jun 1999 09:29:22   OS
   #66284# Rahmen nach Attributanwendung deselektieren

      Rev 1.118   04 Jun 1999 09:00:04   OS
   #66436# spaltige Bereiche auf spaltigen Seiten funktionieren jetzt auch

      Rev 1.117   17 May 1999 13:06:14   OS
   auch einspaltige Rahmen zeigen keine Spalten an

      Rev 1.116   11 May 1999 21:51:06   JP
   Task #66127#: Methoden rund ums Lineal verbessert und Schnittstellen veraendert/erweitert

      Rev 1.115   28 Apr 1999 22:38:36   JP
   Bug #65544#: StateTabWin: bei Tabellen in Bereichen mit den richtigen Werten arbeiten

      Rev 1.114   23 Apr 1999 15:15:36   AMA
   Fix #65252#: Nichtspaltige Bereiche in Tabellen in spaltigen Bereichen

      Rev 1.113   20 Apr 1999 14:08:26   OS
   #64974# Probleme mit spaltigen Bereichen beoben

      Rev 1.112   06 Apr 1999 16:29:32   OS
   #60062# spaltige Bereiche auch in Tabellen und spaltigen Rahmen fast richtig

      Rev 1.111   10 Dec 1998 15:17:06   AMA
   Fix #57749#: Fussnoten innerhalb von spaltigen Bereichen

      Rev 1.110   03 Dec 1998 09:19:20   OS
   #60062# LR_MIN_MAX fuer spaltige Bereiche sollte jetzt richtig sein

      Rev 1.109   27 Nov 1998 14:57:32   AMA
   Fix #59951#59825#: Unterscheiden zwischen Rahmen-,Seiten- und Bereichsspalten

      Rev 1.108   18 Sep 1998 16:55:54   OS
   #56584# WishWidth ueber USHRT_MAX verhindern

      Rev 1.107   20 Aug 1998 13:30:46   OS
   GetFrmType reicht fuer verkettete Rahmen nicht aus -> IsFrmSelected benutzen
   Keine Absatzattribute fuer sel. Rahmen anzeigen #55277#,#55257#

      Rev 1.106   01 Apr 1998 17:31:48   OM
   #31111 Rahmen in protecteten Rahmen sind auch geschuetzt

      Rev 1.105   04 Mar 1998 10:01:14   MH
   chg: wg. internal Compilererrror

      Rev 1.104   07 Feb 1998 10:38:12   OS
   Set/GetStyle am Lineal fuer BrowseMode-Umschaltung #41371#

      Rev 1.103   21 Nov 1997 15:00:24   MA
   includes

      Rev 1.102   15 Sep 1997 11:49:12   OS
   zusaetzlicher Kommentar

      Rev 1.101   15 Sep 1997 11:29:30   OS
   Slotumleitung nicht ueber Dispatcher #43754#

      Rev 1.100   12 Sep 1997 10:36:08   OS
   ITEMID_* definiert

      Rev 1.99   10 Sep 1997 16:55:32   OS
   Rahmen: Absatzeinzuege innerhalb der Umrandung #42444#

      Rev 1.98   15 Aug 1997 11:47:58   OS
   chartar/frmatr/txtatr aufgeteilt

      Rev 1.97   11 Aug 1997 10:28:32   OS
   paraitem/frmitems/textitem aufgeteilt

      Rev 1.96   07 Aug 1997 14:58:58   OM
   Headerfile-Umstellung

      Rev 1.95   06 Aug 1997 10:27:54   OS
   Seitenraender richtig tauschen #42452#

      Rev 1.94   30 Jul 1997 19:05:50   HJS
   includes

      Rev 1.93   29 Jul 1997 14:22:40   AMA
   Fix #42203#: GPF durch nicht zurueckgesetztes bSetTabCol...

      Rev 1.92   09 Jul 1997 12:54:30   OS
   MinMaxItem im BrowseMode mit richtigen Raendern fuellen #41484#

      Rev 1.91   17 Jun 1997 15:44:30   MA
   DrawTxtShell nicht von BaseShell ableiten + Opts

      Rev 1.90   09 Jun 1997 14:28:10   MA
   chg: Browse-Flag nur noch am Doc

      Rev 1.89   07 Apr 1997 19:06:32   MH
   chg: header

      Rev 1.88   12 Mar 1997 16:42:38   OS
   AutoUpdate von Vorlagen: Absatzeinzuege, Tabulatoren

      Rev 1.87   14 Feb 1997 09:13:42   JP
   Bug #36135#: ExceTabWin - bei SetMouseTabCols die View locken

      Rev 1.86   13 Feb 1997 12:06:14   MA
   chg: Keine Tabulatoren im Lineal fuer Web

      Rev 1.85   04 Feb 1997 08:14:32   OS
   relative Rahmen richtig setzen

      Rev 1.84   08 Jan 1997 10:55:00   OS
   include fuer DEBUGLIN

      Rev 1.83   28 Nov 1996 14:58:18   OS
   keine Tabulatoren bei uneindeutigen Absatzeinzuegen

      Rev 1.82   26 Nov 1996 16:55:20   OS
   MinMax fuer Tabellen im BrowseMode korrigiert

      Rev 1.81   21 Nov 1996 11:52:52   OS
   Abstaende beruecksichtigen

      Rev 1.80   04 Nov 1996 13:30:36   OS
   UL-Spaces an Rahmen fuer das VLineal beruecksichtigen

      Rev 1.79   24 Oct 1996 09:32:46   OS
   Klammern vergessen...

      Rev 1.78   21 Oct 1996 19:06:48   OS
   ProtectItem vollstaendig senden; Exec-Methoden in der BrowseView stimmen jetzt

      Rev 1.77   18 Oct 1996 08:57:42   OS
   spaltige Rahmen und seiten wieder richtig anzeigen, ProtectItem fuer die Seitenraender mitschicken

      Rev 1.76   25 Sep 1996 10:56:52   PL
   Falsches Makro

      Rev 1.75   24 Sep 1996 16:44:04   OS
   letzter Bug in BrowseView

      Rev 1.74   23 Sep 1996 19:38:32   HJS
   add: viewopt.hxx

      Rev 1.73   23 Sep 1996 15:36:32   MA
   ViewWin vernichtet

      Rev 1.72   23 Sep 1996 12:13:32   OS
   richtige Raender in der BrowseView

      Rev 1.71   12 Sep 1996 17:00:34   OS
   GetAnyCurRect() ersetzt GetCur*Rect

------------------------------------------------------------------------*/



diff --git a/sw/source/ui/uno/dlelstnr.cxx b/sw/source/ui/uno/dlelstnr.cxx
new file mode 100644
index 0000000..9d5c952
--- /dev/null
+++ b/sw/source/ui/uno/dlelstnr.cxx
@@ -0,0 +1,164 @@
/*************************************************************************
 *
 *  $RCSfile: dlelstnr.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:49 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop


#ifndef _COM_SUN_STAR_LINGUISTIC_DICTIONARYLISTEVENTFLAGS_HPP_
#include <com/sun/star/linguistic/DictionaryListEventFlags.hpp>
#endif

#ifndef _VOS_MUTEX_HXX_
#include <vos/mutex.hxx>
#endif
#ifndef _SV_SVAPP_HXX
#include <vcl/svapp.hxx>
#endif
#ifndef _SHL_HXX
#include <tools/shl.hxx>
#endif

#ifndef _DLELSTNR_HXX_
#include "dlelstnr.hxx"
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif

using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::linguistic;

/* -----------------------------17.03.00 09:07--------------------------------

 ---------------------------------------------------------------------------*/
SwDicListEvtListener::SwDicListEvtListener(
            const Reference< XDictionaryList >  &rxDicList )
{
    xDicList = rxDicList;
    if (xDicList.is())
    {
        xDicList->addDictionaryListEventListener( this, sal_False );
    }
}
/* -----------------------------17.03.00 09:07--------------------------------

 ---------------------------------------------------------------------------*/
SwDicListEvtListener::~SwDicListEvtListener()
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());

    if (xDicList.is())
    {
        xDicList->removeDictionaryListEventListener( this );
    }
}

/* -----------------------------17.03.00 09:06--------------------------------

 ---------------------------------------------------------------------------*/
void SwDicListEvtListener::processDictionaryListEvent(
            const DictionaryListEvent& aDicListEvent)
        throw( ::com::sun::star::uno::RuntimeException )
{
    vos::OGuard aGuard(Application::GetSolarMutex());

    sal_Int16 nEvt = aDicListEvent.nCondensedEvent;

    sal_Bool bIsSpellWrong  =  ( nEvt & DictionaryListEventFlags::ADD_POS_ENTRY )
                            || ( nEvt & DictionaryListEventFlags::DEL_NEG_ENTRY )
                            || ( nEvt & DictionaryListEventFlags::ACTIVATE_POS_DIC )
                            || ( nEvt & DictionaryListEventFlags::DEACTIVATE_NEG_DIC );
    sal_Bool bIsSpellAll    =  ( nEvt & DictionaryListEventFlags::ADD_NEG_ENTRY )
                            || ( nEvt & DictionaryListEventFlags::DEL_POS_ENTRY )
                            || ( nEvt & DictionaryListEventFlags::ACTIVATE_NEG_DIC )
                            || ( nEvt & DictionaryListEventFlags::DEACTIVATE_POS_DIC );
    SW_MOD()->CheckSpellChanges( sal_False, bIsSpellWrong, bIsSpellAll );
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.6  2000/09/18 16:06:15  willem.vandorp
    OpenOffice header added.

    Revision 1.5  2000/05/11 12:51:32  tl
    if[n]def ONE_LINGU entfernt, namespace's verwendet

    Revision 1.4  2000/03/21 15:39:43  os
    UNOIII

    Revision 1.3  2000/02/11 15:00:05  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.2  2000/01/11 19:38:42  tl
    #70735# evaluate DictionaryListEvents

    Revision 1.1  2000/01/11 10:49:11  tl
    #70735# initial revision


------------------------------------------------------------------------*/

diff --git a/sw/source/ui/uno/makefile.mk b/sw/source/ui/uno/makefile.mk
new file mode 100644
index 0000000..e4fce75
--- /dev/null
+++ b/sw/source/ui/uno/makefile.mk
@@ -0,0 +1,109 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:49 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=..$/..$/..

PRJNAME=sw
TARGET=unoidl

AUTOSEG=true

PROJECTPCH=ui_pch
PDBTARGET=ui_pch
PROJECTPCHSOURCE=..$/ui_1st$/ui_pch

# --- Settings -----------------------------------------------------

.INCLUDE :  $(PRJ)$/inc$/swpre.mk
.INCLUDE :  settings.mk
.INCLUDE :  $(PRJ)$/inc$/sw.mk

# --- Files --------------------------------------------------------


CXXFILES = \
        unotxdoc.cxx  \
        unoatxt.cxx  \
        unomod.cxx  \
        unotxvw.cxx \
        dlelstnr.cxx


SLOFILES =  \
        $(SLO)$/unotxdoc.obj\
        $(SLO)$/unoatxt.obj \
        $(SLO)$/unomod.obj \
        $(SLO)$/unotxvw.obj \
        $(SLO)$/dlelstnr.obj

EXCEPTIONSFILES= \
        $(SLO)$/dlelstnr.obj \
        $(SLO)$/unotxdoc.obj \
        $(SLO)$/unoatxt.obj \
        $(SLO)$/unomod.obj \
        $(SLO)$/unotxvw.obj


# --- Tagets -------------------------------------------------------

.INCLUDE :  target.mk

diff --git a/sw/source/ui/uno/unoatxt.cxx b/sw/source/ui/uno/unoatxt.cxx
new file mode 100644
index 0000000..7b81694
--- /dev/null
+++ b/sw/source/ui/uno/unoatxt.cxx
@@ -0,0 +1,1292 @@
/*************************************************************************
 *
 *  $RCSfile: unoatxt.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:49 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop
#include <swtypes.hxx>
#ifndef _GLOSDOC_HXX //autogen
#include <glosdoc.hxx>
#endif

#ifndef _SHELLIO_HXX //autogen
#include <shellio.hxx>
#endif
#ifndef _INITUI_HXX
#include "initui.hxx"
#endif
#ifndef _GLOSLST_HXX
#include <gloslst.hxx>
#endif
#ifndef _UNOATXT_HXX
#include <unoatxt.hxx>
#endif
#ifndef _UNOMAP_HXX
#include <unomap.hxx>
#endif
#ifndef _UNOOBJ_HXX
#include <unoobj.hxx>
#endif
#ifndef _VOS_MUTEX_HXX_ //autogen
#include <vos/mutex.hxx>
#endif
#ifndef _SV_SVAPP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _DOC_HXX //autogen
#include <doc.hxx>
#endif
#ifndef _TOOLS_DEBUG_HXX
#include <tools/debug.hxx>
#endif

#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _OFAACCFG_HXX //autogen
#include <offmgr/ofaaccfg.hxx>
#endif
#ifndef SVTOOLS_URIHELPER_HXX
#include <svtools/urihelper.hxx>
#endif
#ifndef _UNOCRSR_HXX //autogen
#include <unocrsr.hxx>
#endif
#ifndef _BOOKMRK_HXX //autogen
#include <bookmrk.hxx>
#endif
#ifndef _UNOPRNMS_HXX
#include <unoprnms.hxx>
#endif
#ifndef _COM_SUN_STAR_BEANS_PropertyAttribute_HPP_
#include <com/sun/star/beans/PropertyAttribute.hpp>
#endif

using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::rtl;


#define PROPERTY_NONE   0


/* -----------------16.06.98 09:15-------------------
 *
 * --------------------------------------------------*/
String lcl_FindGroupName(SwGlossaries* pGlossaries, const OUString& GroupName)
{
    sal_uInt16 nCount = pGlossaries->GetGroupCnt();
    //wenn der Gruppenname intern erzeugt wurde, dann steht auch hier der Pfad drin
    String sGroup(GroupName);
    String sGroupName(sGroup.GetToken(0, GLOS_DELIM));
    String sPath = sGroup.GetToken(1, GLOS_DELIM);
    sal_Bool bPathLen = sPath.Len() > 0;
    for ( sal_uInt16 i = 0; i < nCount; i++ )
    {
        String sGrpName = pGlossaries->GetGroupName(i);
        if(bPathLen ? sGroup == sGrpName : sGroupName == sGrpName.GetToken(0, GLOS_DELIM))
        {
            return sGrpName;
        }
    }
    return aEmptyStr;
}

/******************************************************************
 *
 ******************************************************************/
/* -----------------30.03.99 14:31-------------------
 *
 * --------------------------------------------------*/
Reference< uno::XInterface> SAL_CALL SwXAutoTextContainer_CreateInstance(const Reference< lang::XMultiServiceFactory>& )
{
    static Reference< uno::XInterface > xAText = (cppu::OWeakObject*)new SwXAutoTextContainer();;
    return xAText;
}

/*-- 21.12.98 12:42:16---------------------------------------------------

  -----------------------------------------------------------------------*/
SwXAutoTextContainer::SwXAutoTextContainer()
{
    pGlossaries = ::GetGlossaries();

}
/*-- 21.12.98 12:42:17---------------------------------------------------

  -----------------------------------------------------------------------*/
SwXAutoTextContainer::~SwXAutoTextContainer()
{

}
/*-- 21.12.98 12:42:17---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Int32 SwXAutoTextContainer::getCount(void) throw( uno::RuntimeException )
{
    return pGlossaries->GetGroupCnt();
}
/*-- 21.12.98 12:42:18---------------------------------------------------

  -----------------------------------------------------------------------*/
uno::Any SwXAutoTextContainer::getByIndex(sal_Int32 nIndex)
    throw( lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    uno::Any aRet;
    sal_uInt16 nCount = pGlossaries->GetGroupCnt();
    if ( nIndex >= 0 && nIndex <= nCount )
        aRet = getByName(pGlossaries->GetGroupName(nIndex));
    else
        throw lang::IndexOutOfBoundsException();
    return aRet;
}
/*-- 21.12.98 12:42:18---------------------------------------------------

  -----------------------------------------------------------------------*/
uno::Type SwXAutoTextContainer::getElementType(void) throw( uno::RuntimeException )
{
    return ::getCppuType((const Reference<text::XAutoTextGroup>*)0);

}
/*-- 21.12.98 12:42:18---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Bool SwXAutoTextContainer::hasElements(void) throw( uno::RuntimeException )
{
    //zumindest Standard sollte es immer geben!
    return sal_True;
}
/*-- 21.12.98 12:42:18---------------------------------------------------

  -----------------------------------------------------------------------*/
uno::Any SwXAutoTextContainer::getByName(const OUString& GroupName)
    throw( container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    uno::Any aRet;
    XAutoTextGroupPtrArr &rGlosGroupArr = pGlossaries->GetUnoGroupArray();
    //zunaechst den Namen mit Pfad-Extension finden
    String sGroupName = lcl_FindGroupName(pGlossaries, GroupName);

    if(sGroupName.Len())
    {
        Reference< text::XAutoTextGroup >  aRef;
        for ( sal_uInt16 i = 0; i < rGlosGroupArr.Count(); i++ )
        {
            Reference< text::XAutoTextGroup > * pxGroup = rGlosGroupArr.GetObject(i);
            Reference< lang::XUnoTunnel > xGroupTunnel(*pxGroup, uno::UNO_QUERY);

            SwXAutoTextGroup* pSwGroup = 0;
            if(xGroupTunnel.is())
            {
                pSwGroup = (SwXAutoTextGroup*)xGroupTunnel->getSomething(SwXAutoTextGroup::getUnoTunnelId());
            }
            if(pSwGroup && GroupName == pSwGroup->getName())
            {                               // Die Gruppe gibt es schon
                aRef = *pxGroup;
                break;
            }
        }
        if ( !aRef.is() )
        {
            Reference< text::XAutoTextGroup > * pxGroup = new Reference< text::XAutoTextGroup > ;
            *pxGroup = new SwXAutoTextGroup(sGroupName, pGlossaries/*pGlosGroup*/);
            aRef = *pxGroup;
            rGlosGroupArr.Insert(pxGroup, rGlosGroupArr.Count());
        }
        aRet.setValue(&aRef, ::getCppuType((const Reference< text::XAutoTextGroup >*)0));
    }
    else
        throw container::NoSuchElementException();
    return aRet;
}
/*-- 21.12.98 12:42:19---------------------------------------------------

  -----------------------------------------------------------------------*/
uno::Sequence< OUString > SwXAutoTextContainer::getElementNames(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    sal_uInt16 nCount = pGlossaries->GetGroupCnt();

    uno::Sequence< OUString > aGroupNames(nCount);
    OUString *pArr = aGroupNames.getArray();

    for ( sal_uInt16 i = 0; i < nCount; i++ )
    {
        // Die Namen werden ohne Pfad-Extension weitergegeben
        String sGroupName(pGlossaries->GetGroupName(i));
        pArr[i] = sGroupName.GetToken(0, GLOS_DELIM);
    }
    return aGroupNames;
}
/*-- 21.12.98 12:42:19---------------------------------------------------
    findet Gruppennamen mit und ohne Pfadindex
  -----------------------------------------------------------------------*/
sal_Bool SwXAutoTextContainer::hasByName(const OUString& Name)
    throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    String sGroupName = lcl_FindGroupName(pGlossaries, Name);
    if(sGroupName.Len())
        return sal_True;
    return sal_False;
}
/*-- 21.12.98 12:42:19---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< text::XAutoTextGroup >  SwXAutoTextContainer::insertNewByName(const OUString& aGroupName)
    throw( lang::IllegalArgumentException, container::ElementExistException, uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(hasByName(aGroupName))
        throw container::ElementExistException();
    String sGroup(aGroupName);
    if(STRING_NOTFOUND == sGroup.Search(GLOS_DELIM))
    {
        sGroup += GLOS_DELIM;
        sGroup += UniString::CreateFromInt32(0);
    }
    pGlossaries->NewGroupDoc(sGroup, sGroup.GetToken(0, GLOS_DELIM));
    Reference< text::XAutoTextGroup >  aRet = new SwXAutoTextGroup(sGroup, pGlossaries);
    return aRet;
}
/*-- 21.12.98 12:42:19---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXAutoTextContainer::removeByName(const OUString& aGroupName)
    throw( container::NoSuchElementException, uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    //zunaechst den Namen mit Pfad-Extension finden
    String sGroupName = lcl_FindGroupName(pGlossaries, aGroupName);
    if(!sGroupName.Len())
        throw container::NoSuchElementException();
    pGlossaries->DelGroupDoc(sGroupName);
}
/* -----------------------------06.04.00 11:11--------------------------------

 ---------------------------------------------------------------------------*/
OUString SwXAutoTextContainer::getImplementationName(void) throw( RuntimeException )
{
    return C2U("SwXAutoTextContainer");
}
/* -----------------------------06.04.00 11:11--------------------------------

 ---------------------------------------------------------------------------*/
BOOL SwXAutoTextContainer::supportsService(const OUString& rServiceName) throw( RuntimeException )
{
    return C2U("com.sun.star.text.AutoTextContainer") == rServiceName;
}
/* -----------------------------06.04.00 11:11--------------------------------

 ---------------------------------------------------------------------------*/
Sequence< OUString > SwXAutoTextContainer::getSupportedServiceNames(void) throw( RuntimeException )
{
    Sequence< OUString > aRet(1);
    OUString* pArray = aRet.getArray();
    pArray[0] = C2U("com.sun.star.text.AutoTextContainer");
    return aRet;
}
/******************************************************************
 *
 ******************************************************************/
/* -----------------------------10.03.00 18:02--------------------------------

 ---------------------------------------------------------------------------*/
const uno::Sequence< sal_Int8 > & SwXAutoTextGroup::getUnoTunnelId()
{
    static uno::Sequence< sal_Int8 > aSeq = ::CreateUnoTunnelId();
    return aSeq;
}
/* -----------------------------10.03.00 18:04--------------------------------

 ---------------------------------------------------------------------------*/
sal_Int64 SAL_CALL SwXAutoTextGroup::getSomething( const uno::Sequence< sal_Int8 >& rId )
    throw(uno::RuntimeException)
{
    if( rId.getLength() == 16
        && 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
                                        rId.getConstArray(), 16 ) )
    {
            return (sal_Int64)this;
    }
    return 0;
}

/*-- 21.12.98 12:42:24---------------------------------------------------

  -----------------------------------------------------------------------*/
SwXAutoTextGroup::SwXAutoTextGroup(const OUString& rName,
            SwGlossaries*   pGlos) :
    aPropSet(aSwMapProvider.GetPropertyMap(PROPERTY_MAP_AUTO_TEXT_GROUP)),
    sName(rName),
    sGroupName(rName),
    pGlossaries(pGlos)
{
}
/*-- 21.12.98 12:42:24---------------------------------------------------

  -----------------------------------------------------------------------*/
SwXAutoTextGroup::~SwXAutoTextGroup()
{
}
/*-- 21.12.98 12:42:24---------------------------------------------------

  -----------------------------------------------------------------------*/
/*-- 21.12.98 12:42:25---------------------------------------------------

  -----------------------------------------------------------------------*/
uno::Sequence< OUString > SwXAutoTextGroup::getTitles(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    sal_uInt16 nCount = 0;
    SwTextBlocks* pGlosGroup = pGlossaries ? pGlossaries->GetGroupDoc(sGroupName, sal_False) : 0;
    if(pGlosGroup)
        nCount = pGlosGroup->GetCount();
    else
        throw uno::RuntimeException();

    uno::Sequence< OUString > aEntryTitles(nCount);
    OUString *pArr = aEntryTitles.getArray();

    for ( sal_uInt16 i = 0; i < nCount; i++ )
        pArr[i] = pGlosGroup->GetLongName(i);
    delete pGlosGroup;
    return aEntryTitles;
}
/*-- 21.12.98 12:42:25---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXAutoTextGroup::renameByName(const OUString& aElementName,
    const OUString& aNewElementName, const OUString& aNewElementTitle)
    throw( lang::IllegalArgumentException, container::ElementExistException, io::IOException,
                                                     uno::RuntimeException)
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    // throw exception only if the programmatic name is to be changed into an existing name
    if(aNewElementName != aElementName && hasByName(aNewElementName))
        throw container::ElementExistException();
    SwTextBlocks* pGlosGroup = pGlossaries ? pGlossaries->GetGroupDoc(sGroupName, sal_False) : 0;
    if(pGlosGroup)
    {
        sal_uInt16 nIdx = pGlosGroup->GetIndex( aElementName);
        if(USHRT_MAX == nIdx)
            throw lang::IllegalArgumentException();
        String aNewShort( aNewElementName);
        String aNewName( aNewElementTitle);
        sal_uInt16 nOldLongIdx = pGlosGroup->GetLongIndex( aNewShort );
        sal_uInt16 nOldIdx = pGlosGroup->GetIndex( aNewName );

        if( nIdx != USHRT_MAX &&
                (nOldLongIdx == USHRT_MAX || nOldLongIdx == nIdx )&&
                    (nOldIdx == USHRT_MAX || nOldIdx == nIdx ))
        {
            pGlosGroup->Rename( nIdx, &aNewShort, &aNewName );
            if(pGlosGroup->GetError() != 0)
                throw io::IOException();
        }
        delete pGlosGroup;
    }
    else
        throw uno::RuntimeException();
}
/* -----------------04.05.99 11:57-------------------
 *
 * --------------------------------------------------*/
sal_Bool lcl_CopySelToDoc( SwDoc* pInsDoc, SwXTextCursor* pxCursor, SwXTextRange* pxRange )
{
    ASSERT( pInsDoc, "kein Ins.Dokument"  );

    SwNodes& rNds = pInsDoc->GetNodes();

    SwNodeIndex aIdx( rNds.GetEndOfContent(), -1 );
    SwCntntNode * pNd = aIdx.GetNode().GetCntntNode();
    SwPosition aPos( aIdx, SwIndex( pNd, pNd->Len() ));

    sal_Bool bRet = sal_False;
    pInsDoc->LockExpFlds();
    {
        if(pxCursor)
        {
            SwUnoCrsr* pUnoCrsr = pxCursor->GetCrsr();
            bRet |= pUnoCrsr->GetDoc()->Copy( *pUnoCrsr, aPos );
        }
        else
        {
            SwBookmark* pBkm = pxRange->GetBookmark();
            if(pBkm->GetOtherPos())
            {
                SwPaM aTmp(*pBkm->GetOtherPos(), pBkm->GetPos());
                bRet |= pxRange->GetDoc()->Copy(aTmp, aPos);
            }
        }
    }

    pInsDoc->UnlockExpFlds();
    if( !pInsDoc->IsExpFldsLocked() )
        pInsDoc->UpdateExpFlds();

    return bRet;
}
/*-- 21.12.98 12:42:25---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< text::XAutoTextEntry >  SwXAutoTextGroup::insertNewByName(const OUString& aName,
        const OUString& aTitle, const Reference< text::XTextRange > & xTextRange)
        throw( container::ElementExistException, uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(hasByName(aName))
        throw container::ElementExistException();
    if(!xTextRange.is())
        throw uno::RuntimeException();

    SwTextBlocks* pGlosGroup = pGlossaries ? pGlossaries->GetGroupDoc(sGroupName, sal_False) : 0;
    String sShortName(aName);
    String sLongName(aTitle);
    if(pGlosGroup)
    {
        if( pGlosGroup->IsOld() )
        {
            if( pGlosGroup->ConvertToNew() )
            {
                throw uno::RuntimeException();
                return Reference< text::XAutoTextEntry > ();
            }
        }
        Reference<lang::XUnoTunnel> xRangeTunnel( xTextRange, uno::UNO_QUERY);
        SwXTextRange* pxRange = 0;
        SwXTextCursor* pxCursor = 0;
        if(xRangeTunnel.is())
        {
            pxRange = (SwXTextRange*)xRangeTunnel->getSomething(
                                    SwXTextRange::getUnoTunnelId());
            pxCursor = (SwXTextCursor*)xRangeTunnel->getSomething(
                                    SwXTextCursor::getUnoTunnelId());
        }

        String sOnlyTxt;
        String* pOnlyTxt = 0;
        sal_Bool bNoAttr = !pxCursor && !pxRange;
        if(bNoAttr)
        {
            sOnlyTxt = UniString(xTextRange->getString());
            pOnlyTxt = &sOnlyTxt;
        }

        const OfaAutoCorrCfg* pCfg = OFF_APP()->GetAutoCorrConfig();

        SwDoc* pGDoc = pGlosGroup->GetDoc();

        // Bis es eine Option dafuer gibt, base util::URL loeschen
        const String aOldURL( INetURLObject::GetBaseURL() );
        if(pCfg->IsSaveRelFile())
        {
            INetURLObject::SetBaseURL( URIHelper::SmartRelToAbs(pGlosGroup->GetFileName()));
        }
        else
            INetURLObject::SetBaseURL( aEmptyStr );

        sal_uInt16 nRet;
        if( pOnlyTxt )
            nRet = pGlosGroup->PutText( sShortName, sLongName, *pOnlyTxt );
        else
        {
            pGlosGroup->ClearDoc();
            if( pGlosGroup->BeginPutDoc( sShortName, sLongName ) )
            {
                pGDoc->SetRedlineMode_intern( REDLINE_DELETE_REDLINES );
                lcl_CopySelToDoc( pGDoc, pxCursor, pxRange );
                pGDoc->SetRedlineMode_intern( 0 );
                nRet = pGlosGroup->PutDoc();
            }
            else
                nRet = (sal_uInt16) -1;
        }

        INetURLObject::SetBaseURL( aOldURL );

        if(nRet == (sal_uInt16) -1 )
        {
            throw uno::RuntimeException();
        }
        pGlossaries->PutGroupDoc( pGlosGroup );
    }
    Reference< text::XAutoTextEntry >  xRet = new SwXAutoTextEntry(pGlossaries, sGroupName, sShortName);
    return xRet;
}
/*-- 21.12.98 12:42:25---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXAutoTextGroup::removeByName(const OUString& aEntryName) throw( container::NoSuchElementException, uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    SwTextBlocks* pGlosGroup = pGlossaries ? pGlossaries->GetGroupDoc(sGroupName, sal_False) : 0;
    if(pGlosGroup)
    {
        sal_uInt16 nIdx = pGlosGroup->GetIndex(aEntryName);
        if ( nIdx != USHRT_MAX )
            pGlosGroup->Delete(nIdx);
        delete pGlosGroup;
    }
    else
        throw container::NoSuchElementException();
}
/*-- 21.12.98 12:42:25---------------------------------------------------

  -----------------------------------------------------------------------*/
OUString SwXAutoTextGroup::getName(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    return sName;
}
/*-- 21.12.98 12:42:25---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXAutoTextGroup::setName(const OUString& rName) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    String sNewGroup(rName);
    if(!pGlossaries || sName == rName)
        throw uno::RuntimeException();
    if(STRING_NOTFOUND == sNewGroup.Search(GLOS_DELIM))
    {
        sNewGroup += GLOS_DELIM;
        sNewGroup += UniString::CreateFromInt32(0);
    }
    //the name must be saved, the group may be invalidated while in RenameGroupDoc()
    SwGlossaries* pTempGlossaries = pGlossaries;

    String sGroupName(sName);
    String sTitle(pGlossaries->GetGroupTitle(sGroupName));
    if(!pGlossaries->RenameGroupDoc(sGroupName, sNewGroup, sTitle))
        throw uno::RuntimeException();
    else
    {
        sName = rName;
        sGroupName = sNewGroup;
        pGlossaries = pTempGlossaries;
    }
}
/*-- 21.12.98 12:42:26---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Int32 SwXAutoTextGroup::getCount(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    int nCount = 0;
    SwTextBlocks* pGlosGroup = pGlossaries ? pGlossaries->GetGroupDoc(sGroupName, sal_False) : 0;
    if(pGlosGroup)
        nCount = pGlosGroup->GetCount();
    else
        throw uno::RuntimeException();
    delete pGlosGroup;
    return nCount;
}
/*-- 21.12.98 12:42:26---------------------------------------------------

  -----------------------------------------------------------------------*/
uno::Any SwXAutoTextGroup::getByIndex(sal_Int32 nIndex)
    throw( lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    uno::Any aRet;
    sal_uInt16 nCount = 0;
    SwTextBlocks* pGlosGroup = pGlossaries ? pGlossaries->GetGroupDoc(sGroupName, sal_False) : 0;
    if(pGlosGroup)
        nCount = pGlosGroup->GetCount();
    else
        throw uno::RuntimeException();
    if(nCount > nIndex)
        aRet = getByName(pGlosGroup->GetShortName((sal_uInt16) nIndex));
    else
        throw lang::IndexOutOfBoundsException();
    delete pGlosGroup;
    return aRet;
}
/*-- 21.12.98 12:42:26---------------------------------------------------

  -----------------------------------------------------------------------*/
uno::Type SwXAutoTextGroup::getElementType(void) throw( uno::RuntimeException )
{
    return ::getCppuType((Reference<text::XAutoTextEntry>*)0);

}
/*-- 21.12.98 12:42:26---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Bool SwXAutoTextGroup::hasElements(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    SwTextBlocks* pGlosGroup = pGlossaries ? pGlossaries->GetGroupDoc(sGroupName, sal_False) : 0;
    sal_uInt16 nCount = 0;
    if(pGlosGroup)
        nCount = pGlosGroup->GetCount();
    else
        throw uno::RuntimeException();
    return nCount > 0;

}
/*-- 21.12.98 12:42:27---------------------------------------------------

  -----------------------------------------------------------------------*/
uno::Any SwXAutoTextGroup::getByName(const OUString& Name)
    throw( container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    uno::Any aRet;
    //standard must be created
    sal_Bool bCreate = sGroupName == SwGlossaries::GetDefName();
    SwTextBlocks* pGlosGroup = pGlossaries ?
        pGlossaries->GetGroupDoc(sGroupName, bCreate) : 0;
    if(pGlosGroup)
    {
        sal_uInt16 nIdx = pGlosGroup->GetIndex(Name);
        if( nIdx != USHRT_MAX )
        {
            Reference< text::XAutoTextEntry >  xRef;
            SwGlossaries* pGlossaries = ::GetGlossaries();
            XAutoTextEntryPtrArr& rArr = pGlossaries->GetUnoEntryArray();
            for(sal_uInt16 i = 0; i < rArr.Count(); i++)
            {
                Reference< uno::XInterface > * pxEntry = rArr.GetObject(i);
                Reference< lang::XUnoTunnel > xEntryTunnel(*pxEntry, uno::UNO_QUERY);
                SwXAutoTextEntry* pEntry = 0;
                if(xEntryTunnel.is())
                {
                    pEntry = (SwXAutoTextEntry*)xEntryTunnel->getSomething(SwXAutoTextEntry::getUnoTunnelId());
                }
                if(pEntry &&
                    COMPARE_EQUAL == pEntry->GetGroupName().CompareTo(String(sName)) &&
                        COMPARE_EQUAL == pEntry->GetEntryName().CompareTo(String(Name)))
                {
                    xRef = pEntry;
                    break;
                }
            }
            if(!xRef.is())
                xRef = new SwXAutoTextEntry(pGlossaries, sName, Name);
            aRet.setValue(&xRef, ::getCppuType((Reference< text::XAutoTextEntry>*)0));
        }
        delete pGlosGroup;
    }
    else
        throw uno::RuntimeException();
    return aRet;
}
/*-- 21.12.98 12:42:27---------------------------------------------------

  -----------------------------------------------------------------------*/
uno::Sequence< OUString > SwXAutoTextGroup::getElementNames(void)
    throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    sal_uInt16 nCount = 0;
    SwTextBlocks* pGlosGroup = pGlossaries ? pGlossaries->GetGroupDoc(sGroupName, sal_False) : 0;
    if(pGlosGroup)
        nCount = pGlosGroup->GetCount();
    else
        throw uno::RuntimeException();

    uno::Sequence< OUString > aEntryNames(nCount);
    OUString *pArr = aEntryNames.getArray();

    for ( sal_uInt16 i = 0; i < nCount; i++ )
        pArr[i] = pGlosGroup->GetShortName(i);
    delete pGlosGroup;
    return aEntryNames;
}
/*-- 21.12.98 12:42:27---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Bool SwXAutoTextGroup::hasByName(const OUString& rName)
    throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    sal_Bool bRet = sal_False;
    sal_uInt16 nCount = 0;
    SwTextBlocks* pGlosGroup = pGlossaries ? pGlossaries->GetGroupDoc(sGroupName, sal_False) : 0;
    if(pGlosGroup)
        nCount = pGlosGroup->GetCount();
    else
        throw uno::RuntimeException();

    for( sal_uInt16 i = 0; i < nCount; i++ )
    {
        String sCompare(pGlosGroup->GetShortName(i));
        if(COMPARE_EQUAL == sCompare.CompareIgnoreCaseToAscii(String(rName)))
        {
            bRet = sal_True;
            break;
        }
    }
    delete pGlosGroup;
    return bRet;
}

/*-- 09.02.00 15:33:30---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< beans::XPropertySetInfo >  SwXAutoTextGroup::getPropertySetInfo(void)
    throw( uno::RuntimeException )
{
    static Reference< beans::XPropertySetInfo >  xRet = aPropSet.getPropertySetInfo();
    return xRet;
}
/*-- 09.02.00 15:33:31---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXAutoTextGroup::setPropertyValue(
    const OUString& rPropertyName, const uno::Any& aValue)
    throw( beans::UnknownPropertyException, beans::PropertyVetoException,
         lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException)
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    const SfxItemPropertyMap*   pMap = SfxItemPropertyMap::GetByName(
                                    aPropSet.getPropertyMap(), rPropertyName);

    if(!pMap)
        throw beans::UnknownPropertyException();

    SwTextBlocks* pGlosGroup = pGlossaries ? pGlossaries->GetGroupDoc(sGroupName, sal_False) : 0;
    if(!pGlosGroup)
        throw uno::RuntimeException();
    switch(pMap->nWID)
    {
        case  WID_GROUP_TITLE:
        {
            if(aValue.getValueType() != ::getCppuType((OUString*)0))
                throw lang::IllegalArgumentException();
            String sNewTitle = *(OUString*)aValue.getValue();
            sal_Bool bChanged = sNewTitle != pGlosGroup->GetName();
            pGlosGroup->SetName(sNewTitle);
            if(bChanged && HasGlossaryList())
                GetGlossaryList()->ClearGroups();
        }
        break;
    }
    delete pGlosGroup;
}
/*-- 09.02.00 15:33:31---------------------------------------------------

  -----------------------------------------------------------------------*/
uno::Any SwXAutoTextGroup::getPropertyValue(const OUString& rPropertyName)
    throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    const SfxItemPropertyMap*   pMap = SfxItemPropertyMap::GetByName(
                                    aPropSet.getPropertyMap(), rPropertyName);

    if(!pMap)
        throw beans::UnknownPropertyException();
    SwTextBlocks* pGlosGroup = pGlossaries ? pGlossaries->GetGroupDoc(sGroupName, sal_False) : 0;
    if(!pGlosGroup)
        throw uno::RuntimeException();

    uno::Any aAny;
    switch(pMap->nWID)
    {
        case  WID_GROUP_PATH:
            aAny <<= OUString(pGlosGroup->GetFileName());
        break;
        case  WID_GROUP_TITLE:
            aAny <<= OUString(pGlosGroup->GetName());
        break;
    }
    delete pGlosGroup;
    return aAny;
}
/*-- 09.02.00 15:33:31---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXAutoTextGroup::addPropertyChangeListener(
    const OUString& PropertyName, const Reference< beans::XPropertyChangeListener > & aListener)
    throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
{
}
/*-- 09.02.00 15:33:31---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXAutoTextGroup::removePropertyChangeListener(
    const OUString& PropertyName, const Reference< beans::XPropertyChangeListener > & aListener)
    throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
{
}
/*-- 09.02.00 15:33:32---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXAutoTextGroup::addVetoableChangeListener(
    const OUString& PropertyName, const Reference< beans::XVetoableChangeListener > & aListener)
    throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
{
}
/*-- 09.02.00 15:33:32---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXAutoTextGroup::removeVetoableChangeListener(
    const OUString& PropertyName, const Reference< beans::XVetoableChangeListener > & aListener)
    throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
{
}
/*-- 21.12.98 12:42:27---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXAutoTextGroup::Invalidate()
{
    pGlossaries = 0;
    sName = aEmptyStr;
    sGroupName = aEmptyStr;
}
/* -----------------------------06.04.00 11:11--------------------------------

 ---------------------------------------------------------------------------*/
OUString SwXAutoTextGroup::getImplementationName(void) throw( RuntimeException )
{
    return C2U("SwXAutoTextGroup");
}
/* -----------------------------06.04.00 11:11--------------------------------

 ---------------------------------------------------------------------------*/
BOOL SwXAutoTextGroup::supportsService(const OUString& rServiceName) throw( RuntimeException )
{
    return C2U("com.sun.star.text.AutoTextGroup") == rServiceName;
}
/* -----------------------------06.04.00 11:11--------------------------------

 ---------------------------------------------------------------------------*/
Sequence< OUString > SwXAutoTextGroup::getSupportedServiceNames(void) throw( RuntimeException )
{
    Sequence< OUString > aRet(1);
    OUString* pArray = aRet.getArray();
    pArray[0] = C2U("com.sun.star.text.AutoTextGroup");
    return aRet;
}
/******************************************************************
 *
 ******************************************************************/
/* -----------------------------10.03.00 18:02--------------------------------

 ---------------------------------------------------------------------------*/
const uno::Sequence< sal_Int8 > & SwXAutoTextEntry::getUnoTunnelId()
{
    static uno::Sequence< sal_Int8 > aSeq = ::CreateUnoTunnelId();
    return aSeq;
}
/* -----------------------------10.03.00 18:04--------------------------------

 ---------------------------------------------------------------------------*/
sal_Int64 SAL_CALL SwXAutoTextEntry::getSomething( const uno::Sequence< sal_Int8 >& rId )
    throw(uno::RuntimeException)
{
    if( rId.getLength() == 16
        && 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
                                        rId.getConstArray(), 16 ) )
    {
            return (sal_Int64)this;
    }
    return 0;
}
/*-- 21.12.98 12:42:33---------------------------------------------------

  -----------------------------------------------------------------------*/
SwXAutoTextEntry::SwXAutoTextEntry(SwGlossaries* pGlss, const String& rGroupName,
                                            const String& rEntryName) :
    pGlossaries(pGlss),
    sGroupName(rGroupName),
    sEntryName(rEntryName)
{

}
/*-- 21.12.98 12:42:33---------------------------------------------------

  -----------------------------------------------------------------------*/
SwXAutoTextEntry::~SwXAutoTextEntry()
{

}
/*-- 21.12.98 12:42:33---------------------------------------------------

  -----------------------------------------------------------------------*/
/*-- 21.12.98 12:42:34---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< text::XTextCursor >  SwXAutoTextEntry::createTextCursor(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    DBG_WARNING("not implemented")
    return Reference< text::XTextCursor > ();
}
/*-- 21.12.98 12:42:34---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< text::XTextCursor >  SwXAutoTextEntry::createTextCursorByRange(
    const Reference< text::XTextRange > & aTextPosition) throw( uno::RuntimeException )
{
    DBG_WARNING("not implemented")
    return Reference< text::XTextCursor > ();
}
/*-- 21.12.98 12:42:34---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXAutoTextEntry::insertString(const Reference< text::XTextRange > & xRange, const OUString& aString, sal_Bool bAbsorb) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    DBG_WARNING("not implemented")
}
/*-- 21.12.98 12:42:34---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXAutoTextEntry::insertControlCharacter(const Reference< text::XTextRange > & xRange,
    sal_Int16 nControlCharacter, sal_Bool bAbsorb)
        throw( lang::IllegalArgumentException, uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    DBG_WARNING("not implemented")
}
/*-- 21.12.98 12:42:34---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXAutoTextEntry::insertTextContent(
    const Reference< text::XTextRange > & xRange,
    const Reference< text::XTextContent > & xContent, sal_Bool bAbsorb)
        throw( lang::IllegalArgumentException, uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    DBG_WARNING("not implemented")
}
/*-- 21.12.98 12:42:34---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXAutoTextEntry::removeTextContent(
    const Reference< text::XTextContent > & xContent)
        throw( container::NoSuchElementException, uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    DBG_WARNING("not implemented")
}
/*-- 21.12.98 12:42:35---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< text::XText >  SwXAutoTextEntry::getText(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    Reference< text::XText >  xRet =  (text::XText*)this;
    return xRet;
}
/*-- 21.12.98 12:42:35---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< text::XTextRange >  SwXAutoTextEntry::getStart(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    DBG_WARNING("not implemented")
    return Reference< text::XTextRange > ();
}
/*-- 21.12.98 12:42:36---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< text::XTextRange >  SwXAutoTextEntry::getEnd(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    DBG_WARNING("not implemented")
    return Reference< text::XTextRange > ();
}
/*-- 21.12.98 12:42:36---------------------------------------------------

  -----------------------------------------------------------------------*/
OUString SwXAutoTextEntry::getString(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    DBG_WARNING("not implemented")
    return OUString();
}
/*-- 21.12.98 12:42:36---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXAutoTextEntry::setString(const OUString& aString) throw( uno::RuntimeException )
{
    DBG_WARNING("not implemented")
}
/* -----------------15.07.99 10:11-------------------

 --------------------------------------------------*/
void SwXAutoTextEntry::applyTo(const Reference< text::XTextRange > & xTextRange)throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    sal_Bool bRet = sal_False;

    Reference<lang::XUnoTunnel> xRangeTunnel( xTextRange, uno::UNO_QUERY);
    SwXTextRange* pRange = 0;
    SwXTextCursor* pCursor = 0;
    if(xRangeTunnel.is())
    {
        pRange = (SwXTextRange*)xRangeTunnel->getSomething(
                                SwXTextRange::getUnoTunnelId());
        pCursor = (SwXTextCursor*)xRangeTunnel->getSomething(
                                SwXTextCursor::getUnoTunnelId());
    }

    SwDoc* pDoc = 0;
    if(pRange && pRange->GetBookmark())
        pDoc = pRange->GetDoc();
    else if(pCursor && pCursor->GetCrsr())
            pDoc = pCursor->GetDoc();
    if(!pDoc)
        throw uno::RuntimeException();
    SwPaM* pInsertPaM = 0;
    if(pRange)
    {
        SwBookmark* pBkm = pRange->GetBookmark();
        if(pBkm->GetOtherPos())
            pInsertPaM = new SwPaM(*pBkm->GetOtherPos(), pBkm->GetPos());
        else
            pInsertPaM = new SwPaM(pBkm->GetPos());
    }
    else
    {
        SwUnoCrsr* pCrsr = pCursor->GetCrsr();
        if(pCrsr->HasMark())
            pInsertPaM = new SwPaM(*pCrsr->GetPoint(), *pCrsr->GetMark());
        else
            pInsertPaM = new SwPaM(*pCrsr->GetPoint());
    }

    SwTextBlocks* pBlock = pGlossaries->GetGroupDoc(sGroupName);
    sal_Bool bResult = pBlock &&
                pDoc->InsertGlossary( *pBlock, sEntryName, *pInsertPaM);
    delete pInsertPaM;

    if(!bResult)
        throw uno::RuntimeException();
}
/* -----------------------------06.04.00 11:11--------------------------------

 ---------------------------------------------------------------------------*/
OUString SwXAutoTextEntry::getImplementationName(void) throw( RuntimeException )
{
    return C2U("SwXAutoTextEntry");
}
/* -----------------------------06.04.00 11:11--------------------------------

 ---------------------------------------------------------------------------*/
BOOL SwXAutoTextEntry::supportsService(const OUString& rServiceName) throw( RuntimeException )
{
    return C2U("com.sun.star.text.AutoTextEntry") == rServiceName;
}
/* -----------------------------06.04.00 11:11--------------------------------

 ---------------------------------------------------------------------------*/
Sequence< OUString > SwXAutoTextEntry::getSupportedServiceNames(void) throw( RuntimeException )
{
    Sequence< OUString > aRet(1);
    OUString* pArray = aRet.getArray();
    pArray[0] = C2U("com.sun.star.text.AutoTextEntry");
    return aRet;
}



/*------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.45  2000/09/18 16:06:15  willem.vandorp
    OpenOffice header added.

    Revision 1.44  2000/08/18 08:00:55  os
    #77770# missing mutex

    Revision 1.43  2000/08/09 12:58:48  os
    #76891# short names are always upper case

    Revision 1.42  2000/06/26 13:05:51  os
    INetURLObject::SmartRelToAbs removed

    Revision 1.41  2000/05/31 12:02:10  os
    SAL_CALL

    Revision 1.40  2000/05/16 09:15:14  os
    project usr removed

    Revision 1.39  2000/04/11 08:04:59  os
    UNICODE

    Revision 1.38  2000/03/27 10:36:31  os
    UNO III

    Revision 1.37  2000/03/21 15:39:44  os
    UNOIII

    Revision 1.36  2000/02/14 14:31:34  os
    #70473# Unicode

    Revision 1.35  2000/02/10 10:35:22  os
    #70359# titles added to AutoText groups

    Revision 1.34  2000/01/28 15:24:05  os
    #72213# Chg: text::XSimpleText;

    Revision 1.33  1999/11/19 16:38:02  os
    modules renamed

    Revision 1.32  1999/10/18 08:16:13  os
    #67409# save glossaries ptr while renaming the group

    Revision 1.31  1999/10/05 09:45:09  os
    #67454# last forgotten path indicators added

    Revision 1.30  1999/09/10 13:19:05  os
    Chg: resource types removed

    Revision 1.29  1999/07/28 14:21:14  OS
    #67828# applyTo changed


      Rev 1.28   28 Jul 1999 16:21:14   OS
   #67828# applyTo changed

      Rev 1.27   23 Jul 1999 13:21:18   OS
   #67828# applyTo implemented ;unused methods removed

      Rev 1.26   23 Jul 1999 10:19:06   OS
   #67828# applyTo implemented ;unused methods removed

      Rev 1.25   20 Jul 1999 08:58:24   OS
   #67409# SwXAutoTextGroup::setName; #67115# SwXAutoTextGroup::renameByName

      Rev 1.24   19 Jul 1999 09:01:06   OS
   new method: aplyTo()

      Rev 1.23   04 May 1999 13:41:46   OS
   #65330# insertNewByName funktioniert

      Rev 1.22   04 May 1999 10:18:16   OS
   #65328# container::XElementAccess fuer text::XAutoTextGroup

      Rev 1.21   22 Apr 1999 16:09:04   OS
   #65194# throw -> throw

      Rev 1.20   22 Apr 1999 15:28:52   OS
   #65124# not implemented - nur noch DBG_WARNING

      Rev 1.19   30 Mar 1999 15:28:12   OS
   #63930# Services am ProcessServiceManager anmelden

      Rev 1.18   15 Mar 1999 14:38:24   OS
   #62845# Makro fuer ServiceInfo jetzt auch fuer OS/2

      Rev 1.17   12 Mar 1999 09:57:04   OS
   #62845# lang::XServiceInfo impl.

      Rev 1.16   09 Mar 1999 12:38:38   OS
   #62008# Solar-Mutex

      Rev 1.15   08 Mar 1999 07:43:00   MH
   update 515

      Rev 1.14   23 Feb 1999 16:14:20   OS
   #62281# Pfadangabe muss in die text::AutoTextGroup uebernommen werden

      Rev 1.13   08 Feb 1999 15:02:06   OS
   #56371# richtiger Gruppenzugriff

      Rev 1.12   28 Jan 1999 16:27:48   OS
   #56371# keine Objekte fuer DEBUG anlegen

      Rev 1.11   27 Jan 1999 12:06:08   OS
   #56371# TF_ONE51

      Rev 1.10   21 Dec 1998 16:20:04   OS
   #56371# TF_ONE51 Zwischenstand

      Rev 1.9   10 Dec 1998 15:54:04   OS
   #56371# TF_ONE51 Zwischenstand

      Rev 1.8   01 Sep 1998 08:24:08   OS
   #55849# Signaturen per UNO ermitteln - SwTextBlocks immer neu anlegen

      Rev 1.7   23 Jul 1998 17:18:08   OS
   text::AutoTextGroup liefert jetzt text::XAutoTextEntry #52654#

      Rev 1.6   10 Jul 1998 18:09:38   OS
   PropertySetInfo und IdlClass static

      Rev 1.5   21 Jun 1998 16:24:30   MH
   Syntax OS/2

      Rev 1.4   18 Jun 1998 08:13:22   OS
   SwXAutoTextEntry

      Rev 1.3   17 Jun 1998 09:55:56   OS
   removeXXXByName

      Rev 1.2   16 Jun 1998 16:48:28   OS
   interface verbessert

      Rev 1.1   04 Jun 1998 09:40:44   OS
   getIdlClasses


      Rev 1.0   27 May 1998 17:07:36   OM
   Initial revision.
------------------------------------------------------------------------*/

diff --git a/sw/source/ui/uno/unomod.cxx b/sw/source/ui/uno/unomod.cxx
new file mode 100644
index 0000000..930087a
--- /dev/null
+++ b/sw/source/ui/uno/unomod.cxx
@@ -0,0 +1,781 @@
/*************************************************************************
 *
 *  $RCSfile: unomod.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:49 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include <swtypes.hxx>
#ifndef _TOOLS_DEBUG_HXX //autogen
#include <tools/debug.hxx>
#endif
#ifndef _UNOMOD_HXX
#include <unomod.hxx>
#endif
#ifndef _UNOOBJ_HXX
#include <unoobj.hxx>
#endif
#ifndef _UNOPRNMS_HXX
#include <unoprnms.hxx>
#endif
#ifndef _UNOMAP_HXX
#include <unomap.hxx>
#endif
#ifndef _SFX_ITEMPROP_HXX //autogen
#include <svtools/itemprop.hxx>
#endif
#ifndef _PRTOPT_HXX //autogen
#include <prtopt.hxx>
#endif
#ifndef _SHL_HXX
#include <tools/shl.hxx>
#endif
#ifndef _SWMODULE_HXX //autogen
#include <swmodule.hxx>
#endif
#ifndef _SWVIEW_HXX //autogen
#include <view.hxx>
#endif
#ifndef _SWDOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _WRTSH_HXX //autogen
#include <wrtsh.hxx>
#endif
#ifndef _VIEWOPT_HXX //autogen
#include <viewopt.hxx>
#endif
#ifndef _VOS_MUTEX_HXX_ //autogen
#include <vos/mutex.hxx>
#endif
#ifndef _SV_SVAPP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _COM_SUN_STAR_TEXT_NOTEPRINTMODE_HPP_
#include <com/sun/star/text/NotePrintMode.hpp>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif

using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::rtl;

/******************************************************************
 * SwXModule
 ******************************************************************/
/* -----------------30.03.99 15:10-------------------
 *
 * --------------------------------------------------*/
Reference< uno::XInterface >  SAL_CALL SwXModule_CreateInstance(const Reference< lang::XMultiServiceFactory > & )
{
    static Reference< uno::XInterface >  xModule = (cppu::OWeakObject*)new SwXModule();;
    return xModule;
}
/*-- 17.12.98 12:19:01---------------------------------------------------

  -----------------------------------------------------------------------*/
SwXModule::SwXModule() :
    pxViewSettings(0),
    pxPrintSettings(0)
{
}
/*-- 17.12.98 12:19:02---------------------------------------------------

  -----------------------------------------------------------------------*/
SwXModule::~SwXModule()
{
    delete pxViewSettings;
    delete pxPrintSettings;
}
/*-- 17.12.98 12:19:03---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< beans::XPropertySet >  SwXModule::getViewSettings(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(!pxViewSettings)
    {
        ((SwXModule*)this)->pxViewSettings = new Reference< beans::XPropertySet > ;
        DBG_ERROR("Web oder Text?")
        *pxViewSettings = new SwXViewSettings(sal_False, 0);
    }
    return *pxViewSettings;
}
/*-- 17.12.98 12:19:03---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< beans::XPropertySet >  SwXModule::getPrintSettings(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(!pxPrintSettings)
    {
        ((SwXModule*)this)->pxPrintSettings = new Reference< beans::XPropertySet > ;
        DBG_ERROR("Web oder Text?")
        *pxPrintSettings = new SwXPrintSettings(sal_False);
    }
    return *pxPrintSettings;
}
/* -----------------------------06.04.00 10:59--------------------------------

 ---------------------------------------------------------------------------*/
OUString SwXModule::getImplementationName(void) throw( RuntimeException )
{
    return C2U("SwXModule");
}
/* -----------------------------06.04.00 10:59--------------------------------

 ---------------------------------------------------------------------------*/
BOOL SwXModule::supportsService(const OUString& rServiceName) throw( RuntimeException )
{
    return C2U("com.sun.star.text.Module") == rServiceName;
}
/* -----------------------------06.04.00 10:59--------------------------------

 ---------------------------------------------------------------------------*/
Sequence< OUString > SwXModule::getSupportedServiceNames(void) throw( RuntimeException )
{
    Sequence< OUString > aRet(1);
    OUString* pArray = aRet.getArray();
    pArray[0] = C2U("com.sun.star.text.Module");
    return aRet;
}

/******************************************************************
 * SwXPrintSettings
 ******************************************************************/

/*-- 17.12.98 12:54:04---------------------------------------------------

  -----------------------------------------------------------------------*/
SwXPrintSettings::SwXPrintSettings(sal_Bool bWebView) :
    _pMap(aSwMapProvider.GetPropertyMap(PROPERTY_MAP_PRINT_SETTINGS)),
    bWeb(bWebView)
{

}
/*-- 17.12.98 12:54:05---------------------------------------------------

  -----------------------------------------------------------------------*/
SwXPrintSettings::~SwXPrintSettings()
{

}
/*-- 17.12.98 12:54:06---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< beans::XPropertySetInfo >  SwXPrintSettings::getPropertySetInfo(void)
    throw( uno::RuntimeException )
{
    static Reference< beans::XPropertySetInfo >  aRef = new SfxItemPropertySetInfo(_pMap);
    return aRef;
}
/*-- 17.12.98 12:54:06---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXPrintSettings::setPropertyValue(const OUString& rPropertyName,
                    const uno::Any& aValue)
    throw( beans::UnknownPropertyException, beans::PropertyVetoException,
                lang::IllegalArgumentException, lang::WrappedTargetException,
                uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    sal_Bool bVal = sal_False;

    if(COMPARE_EQUAL != rPropertyName.compareToAscii(UNO_NAME_PRINT_ANNOTATION_MODE))
        bVal = *(sal_Bool*)aValue.getValue();

    SwPrintOptions* pPrtOpt = SW_MOD()->GetPrtOptions(bWeb);
    const SfxItemPropertyMap* pCur = SfxItemPropertyMap::GetByName(_pMap, rPropertyName);
    if(pCur)
        switch( pCur->nWID )
        {
            case WID_PRTSET_LEFT_PAGES     : pPrtOpt->SetPrintLeftPage(bVal);       break;
            case WID_PRTSET_RIGHT_PAGES    : pPrtOpt->SetPrintRightPage(bVal);  break;
            case WID_PRTSET_REVERSED       : pPrtOpt->SetPrintReverse(bVal);        break;
            case WID_PRTSET_PROSPECT       : pPrtOpt->SetPrintProspect(bVal);  break;
            case WID_PRTSET_GRAPHICS       : pPrtOpt->SetPrintGraphic(bVal);  break;
            case WID_PRTSET_TABLES         : pPrtOpt->SetPrintTable(bVal);  break;
            case WID_PRTSET_DRAWINGS       : pPrtOpt->SetPrintDraw(bVal);  break;
            case WID_PRTSET_CONTROLS       : pPrtOpt->SetPrintControl(bVal);  break;
            case WID_PRTSET_PAGE_BACKGROUND: pPrtOpt->SetPrintPageBackground(bVal);  break;
            case WID_PRTSET_BLACK_FONTS    : pPrtOpt->SetPrintBlackFont(bVal);  break;
            case WID_PRTSET_ANNOTATION_MODE:
            {
                sal_Int16 nVal;
                    aValue >>= nVal;
                if(nVal <= text::NotePrintMode_PAGE_END)
                    pPrtOpt->SetPrintPostIts(nVal);
                else
                    throw lang::IllegalArgumentException();
            }
            break;
            default: DBG_ERROR("Diese Id gibt's nicht!");
        }
    else
        throw beans::UnknownPropertyException();
}
/*-- 17.12.98 12:54:06---------------------------------------------------

  -----------------------------------------------------------------------*/
uno::Any SwXPrintSettings::getPropertyValue(const OUString& rPropertyName)
    throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    uno::Any aRet;
    SwPrintOptions* pPrtOpt = SW_MOD()->GetPrtOptions(bWeb);
    const SfxItemPropertyMap* pCur = SfxItemPropertyMap::GetByName(_pMap, rPropertyName);
    if(pCur)
    {
        sal_Bool bBool = TRUE;
        sal_Bool bBoolVal;
        switch( pCur->nWID )
        {
            case WID_PRTSET_LEFT_PAGES      : bBoolVal = pPrtOpt->IsPrintLeftPage();        break;
            case WID_PRTSET_RIGHT_PAGES     : bBoolVal = pPrtOpt->IsPrintRightPage();   break;
            case WID_PRTSET_REVERSED        : bBoolVal = pPrtOpt->IsPrintReverse();     break;
            case WID_PRTSET_PROSPECT       : bBoolVal = bBoolVal = pPrtOpt->IsPrintProspect();  break;
            case WID_PRTSET_GRAPHICS       : bBoolVal = pPrtOpt->IsPrintGraphic();  break;
            case WID_PRTSET_TABLES         : bBoolVal = pPrtOpt->IsPrintTable();  break;
            case WID_PRTSET_DRAWINGS       : bBoolVal = pPrtOpt->IsPrintDraw();  break;
            case WID_PRTSET_CONTROLS       : bBoolVal = pPrtOpt->IsPrintControl();  break;
            case WID_PRTSET_PAGE_BACKGROUND: bBoolVal = pPrtOpt->IsPrintPageBackground();  break;
            case WID_PRTSET_BLACK_FONTS    : bBoolVal = pPrtOpt->IsPrintBlackFont();  break;
            case WID_PRTSET_ANNOTATION_MODE: bBool = FALSE; aRet <<= (sal_Int16)pPrtOpt->GetPrintPostIts();  break;
            default: DBG_ERROR("Diese Id gibt's nicht!");
        }
        if(bBool)
            aRet.setValue(&bBoolVal, ::getBooleanCppuType());
    }
    else
        throw beans::UnknownPropertyException();
    return aRet;
}
/*-- 17.12.98 12:54:07---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXPrintSettings::addPropertyChangeListener(const OUString& PropertyName, const Reference< beans::XPropertyChangeListener > & aListener) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
{
    DBG_WARNING("not implemented")
}
/*-- 17.12.98 12:54:07---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXPrintSettings::removePropertyChangeListener(const OUString& PropertyName, const Reference< beans::XPropertyChangeListener > & aListener) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
{
    DBG_WARNING("not implemented")
}
/*-- 17.12.98 12:54:07---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXPrintSettings::addVetoableChangeListener(const OUString& PropertyName, const Reference< beans::XVetoableChangeListener > & aListener) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
{
    DBG_WARNING("not implemented")
}
/*-- 17.12.98 12:54:07---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXPrintSettings::removeVetoableChangeListener(const OUString& PropertyName, const Reference< beans::XVetoableChangeListener > & aListener) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
{
    DBG_WARNING("not implemented")
}
/* -----------------------------06.04.00 11:02--------------------------------

 ---------------------------------------------------------------------------*/
OUString SwXPrintSettings::getImplementationName(void) throw( RuntimeException )
{
    return C2U("SwXPrintSettings");
}
/* -----------------------------06.04.00 11:02--------------------------------

 ---------------------------------------------------------------------------*/
BOOL SwXPrintSettings::supportsService(const OUString& rServiceName) throw( RuntimeException )
{
    return C2U("com.sun.star.text.PrintSettings") == rServiceName;
}
/* -----------------------------06.04.00 11:02--------------------------------

 ---------------------------------------------------------------------------*/
Sequence< OUString > SwXPrintSettings::getSupportedServiceNames(void) throw( RuntimeException )
{
    Sequence< OUString > aRet(1);
    OUString* pArray = aRet.getArray();
    pArray[0] = C2U("com.sun.star.text.PrintSettings");
    return aRet;
}


/******************************************************************
 *
 ******************************************************************/
/*-- 18.12.98 11:01:10---------------------------------------------------

  -----------------------------------------------------------------------*/
SwXViewSettings::SwXViewSettings(sal_Bool bWebView, SwView* pVw) :
    _pMap(aSwMapProvider.GetPropertyMap(PROPERTY_MAP_VIEW_SETTINGS)),
    pView(pVw),
    bWeb(bWebView),
    bObjectValid(sal_True)
{

}
/*-- 18.12.98 11:01:10---------------------------------------------------

  -----------------------------------------------------------------------*/
SwXViewSettings::~SwXViewSettings()
{

}
/*-- 18.12.98 11:01:11---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< beans::XPropertySetInfo >  SwXViewSettings::getPropertySetInfo(void) throw( uno::RuntimeException )
{
    static Reference< beans::XPropertySetInfo >  aRef = new SfxItemPropertySetInfo(_pMap);
    return aRef;
}
/*-- 18.12.98 11:01:12---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXViewSettings::setPropertyValue(const OUString& rPropertyName,
    const uno::Any& aValue)
    throw( beans::UnknownPropertyException, beans::PropertyVetoException,
            lang::IllegalArgumentException, lang::WrappedTargetException,
            uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    sal_Bool bApply = sal_True;
    sal_Bool bApplyZoom = sal_False;

    const SwViewOption* pVOpt = 0;
    if(pView)
    {
        if(!IsValid())
            return;
        pVOpt = pView->GetWrtShell().GetViewOptions();
    }
    else
    {
        pVOpt = SW_MOD()->GetViewOption(bWeb);
    }
    SwViewOption aVOpt(*pVOpt);
    const SfxItemPropertyMap* pCur = SfxItemPropertyMap::GetByName(
                                            _pMap, rPropertyName);
    if(pCur)
    {
        sal_Bool bVal = WID_VIEWSET_ZOOM != pCur->nWID ?
            *(sal_Bool*)aValue.getValue() : sal_False;
        // the API flag should not be set to the application's view settings
        if(pView)
            aVOpt.SetStarOneSetting(sal_True);
        switch( pCur->nWID )
        {
            case  WID_VIEWSET_HRULER :                  aVOpt.SetViewTabwin(bVal);  break;
            case  WID_VIEWSET_VRULER :                  aVOpt.SetViewVLin(bVal);break;
            case  WID_VIEWSET_HSCROLL:                  aVOpt.SetViewHScrollBar(bVal);break;
            case  WID_VIEWSET_VSCROLL:                  aVOpt.SetViewVScrollBar(bVal);break;
            case  WID_VIEWSET_GRAPHICS              :   aVOpt.SetGraphic(bVal);break;
            case  WID_VIEWSET_TABLES                :   aVOpt.SetTable(bVal);   break;
            case  WID_VIEWSET_DRAWINGS              :   aVOpt.SetDraw(bVal);    break;
            case  WID_VIEWSET_FIELD_COMMANDS        :   aVOpt.SetFldName(bVal); break;
            case  WID_VIEWSET_ANNOTATIONS           :   aVOpt.SetPostIts(bVal); break;
            case  WID_VIEWSET_INDEX_MARK_BACKGROUND :   aVOpt.SetTox(bVal); break;
            case  WID_VIEWSET_FOOTNOTE_BACKGROUND   :   aVOpt.SetFootNote(bVal);    break;
            case  WID_VIEWSET_TEXT_FIELD_BACKGROUND :   aVOpt.SetField(bVal);   break;
            case  WID_VIEWSET_PARA_BREAKS           :   aVOpt.SetParagraph(bVal);   break;
            case  WID_VIEWSET_SOFT_HYPHENS          :   aVOpt.SetSoftHyph(bVal);    break;
            case  WID_VIEWSET_SPACES                :   aVOpt.SetBlank(bVal);   break;
            case  WID_VIEWSET_PROTECTED_SPACES      :   aVOpt.SetHardBlank(bVal);   break;
            case  WID_VIEWSET_TABSTOPS              :   aVOpt.SetTab(bVal); break;
            case  WID_VIEWSET_BREAKS                :   aVOpt.SetLineBreak(bVal); break;
            case  WID_VIEWSET_HIDDEN_TEXT           :   aVOpt.SetHidden(bVal);  break;
            case  WID_VIEWSET_HIDDEN_PARAGRAPHS     :   aVOpt.SetShowHiddenPara(bVal);  break;
            case  WID_VIEWSET_TABLE_BOUNDARIES      :   aVOpt.SetSubsTable(bVal);   break;
            case  WID_VIEWSET_TEXT_BOUNDARIES       :   aVOpt.SetSubsLines(bVal);   break;
            case  WID_VIEWSET_SMOOTH_SCROLLING      :   aVOpt.SetSmoothScroll(bVal);    break;
            case  WID_VIEWSET_SOLID_MARK_HANDLES    :   aVOpt.SetSolidMarkHdl(bVal);    break;
            case  WID_VIEWSET_ZOOM                  :
            {
                sal_Int16 nZoom = *(sal_Int16*)aValue.getValue();
                if(nZoom > 1000 || nZoom < 5)
                    throw lang::IllegalArgumentException();
                aVOpt.SetZoom((sal_uInt16)nZoom);
                bApplyZoom = sal_True;
            }
            break;
            case WID_VIEWSET_ZOOM_TYPE:
            {
                sal_Int16 nZoom = *(sal_Int16*)aValue.getValue();
                SvxZoomType eZoom = (SvxZoomType)USHRT_MAX;
                switch(nZoom)
                {
                    case /*DocumentZoomType_OPTIMAL       */0:
                        eZoom = SVX_ZOOM_OPTIMAL;
                    break;
                    case /*DocumentZoomType_PAGE_WIDTH  */  1:
                        eZoom = SVX_ZOOM_PAGEWIDTH;
                    break;
                    case /*DocumentZoomType_ENTIRE_PAGE */  2:
                        eZoom = SVX_ZOOM_WHOLEPAGE;
                    break;
                    case /*DocumentZoomType_BY_VALUE    */  3:
                        eZoom = SVX_ZOOM_PERCENT;
                    break;
                }
                if(eZoom < USHRT_MAX)
                {
                    aVOpt.SetZoomType( eZoom );
                    bApplyZoom = sal_True;
                }
            }
            break;
            case WID_VIEWSET_ONLINE_LAYOUT :
            {
                bApply = sal_False;
                if(pView)
                    pView->GetDocShell()->ToggleBrowserMode(bVal, pView );
            }
            break;
            default:
                bApply = sal_False;
                DBG_ERROR("Diese Id gibt's nicht!")
        }
    }
    else
        throw beans::UnknownPropertyException();
    if(bApplyZoom && pView)
    {
        pView->SetZoom( (SvxZoomType)aVOpt.GetZoomType(), aVOpt.GetZoom(), sal_True );
    }
    else if(bApply)
        SW_MOD()->ApplyUsrPref(aVOpt, pView, pView ? VIEWOPT_DEST_VIEW_ONLY : bWeb ? VIEWOPT_DEST_WEB : VIEWOPT_DEST_TEXT );

}
/*-- 18.12.98 11:01:12---------------------------------------------------

  -----------------------------------------------------------------------*/
uno::Any SwXViewSettings::getPropertyValue(const OUString& rPropertyName)
    throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    uno::Any aRet;
    const SwViewOption* pVOpt = 0;
    if(pView)
    {
        if(!IsValid())
            return uno::Any();
        pVOpt = pView->GetWrtShell().GetViewOptions();
    }
    else
        pVOpt = SW_MOD()->GetViewOption(bWeb);
    const SfxItemPropertyMap* pCur = SfxItemPropertyMap::GetByName(_pMap, rPropertyName);
    if(pCur)
    {
        sal_Bool bBool = TRUE;
        sal_Bool bBoolVal;
        switch( pCur->nWID )
        {
            case  WID_VIEWSET_HRULER :                  bBoolVal = pVOpt->IsViewTabwin();   break;
            case  WID_VIEWSET_VRULER :                  bBoolVal = pVOpt->IsViewVLin();break;
            case  WID_VIEWSET_HSCROLL:                  bBoolVal = pVOpt->IsViewHScrollBar();break;
            case  WID_VIEWSET_VSCROLL:                  bBoolVal = pVOpt->IsViewVScrollBar();break;
            case  WID_VIEWSET_GRAPHICS              :   bBoolVal = pVOpt->IsGraphic();break;
            case  WID_VIEWSET_TABLES                :   bBoolVal = pVOpt->IsTable();    break;
            case  WID_VIEWSET_DRAWINGS              :   bBoolVal = pVOpt->IsDraw(); break;
            case  WID_VIEWSET_FIELD_COMMANDS        :   bBoolVal = pVOpt->IsFldName();  break;
            case  WID_VIEWSET_ANNOTATIONS           :   bBoolVal = pVOpt->IsPostIts();  break;
            case  WID_VIEWSET_INDEX_MARK_BACKGROUND :   bBoolVal = pVOpt->IsTox();  break;
            case  WID_VIEWSET_FOOTNOTE_BACKGROUND   :   bBoolVal = pVOpt->IsFootNote(); break;
            case  WID_VIEWSET_TEXT_FIELD_BACKGROUND :   bBoolVal = pVOpt->IsField();    break;
            case  WID_VIEWSET_PARA_BREAKS           :   bBoolVal = pVOpt->IsParagraph(sal_True);    break;
            case  WID_VIEWSET_SOFT_HYPHENS          :   bBoolVal = pVOpt->IsSoftHyph(); break;
            case  WID_VIEWSET_SPACES                :   bBoolVal = pVOpt->IsBlank(sal_True);    break;
            case  WID_VIEWSET_PROTECTED_SPACES      :   bBoolVal = pVOpt->IsHardBlank();    break;
            case  WID_VIEWSET_TABSTOPS              :   bBoolVal = pVOpt->IsTab(sal_True);  break;
            case  WID_VIEWSET_BREAKS                :   bBoolVal = pVOpt->IsLineBreak(sal_True); break;
            case  WID_VIEWSET_HIDDEN_TEXT           :   bBoolVal = pVOpt->IsHidden();   break;
            case  WID_VIEWSET_HIDDEN_PARAGRAPHS     :   bBoolVal = pVOpt->IsShowHiddenPara();   break;
            case  WID_VIEWSET_TABLE_BOUNDARIES      :   bBoolVal = pVOpt->IsSubsTable();    break;
            case  WID_VIEWSET_TEXT_BOUNDARIES       :   bBoolVal = pVOpt->IsSubsLines();    break;
            case  WID_VIEWSET_SMOOTH_SCROLLING      :   bBoolVal = pVOpt->IsSmoothScroll(); break;
            case  WID_VIEWSET_SOLID_MARK_HANDLES    :   bBoolVal = pVOpt->IsSolidMarkHdl(); break;
            case  WID_VIEWSET_ZOOM                  :
                    bBool = FALSE;
                    aRet <<= (sal_Int16)pVOpt->GetZoom();
            break;
            case WID_VIEWSET_ZOOM_TYPE:
            {
                bBool = FALSE;
                sal_Int16 nRet;
                switch(pVOpt->GetZoomType())
                {
                    case SVX_ZOOM_OPTIMAL:
                        nRet = /*DocumentZoomType_OPTIMAL*/ 0;
                    break;
                    case SVX_ZOOM_PAGEWIDTH:
                        nRet = /*DocumentZoomType_PAGE_WIDTH    */1;
                    break;
                    case SVX_ZOOM_WHOLEPAGE:
                        nRet = /*DocumentZoomType_ENTIRE_PAGE */  2;
                    break;
                    case SVX_ZOOM_PERCENT:
                        nRet = /*DocumentZoomType_BY_VALUE  */  3;
                    break;
                }
                aRet <<= nRet;
            }
            break;
            case WID_VIEWSET_ONLINE_LAYOUT:
                if(pView)
                    bBoolVal = pView->GetWrtShell().GetDoc()->IsBrowseMode();
            break;
            default: DBG_ERROR("Diese Id gibt's nicht!");
        }
        if(bBool)
            aRet.setValue(&bBoolVal, ::getBooleanCppuType());
    }
    else
        throw beans::UnknownPropertyException();

    return aRet;
}
/*-- 18.12.98 11:01:12---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXViewSettings::addPropertyChangeListener(const OUString& PropertyName, const Reference< beans::XPropertyChangeListener > & aListener) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
{
    DBG_WARNING("not implemented")
}
/*-- 18.12.98 11:01:13---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXViewSettings::removePropertyChangeListener(const OUString& PropertyName, const Reference< beans::XPropertyChangeListener > & aListener) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
{
    DBG_WARNING("not implemented")
}
/*-- 18.12.98 11:01:13---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXViewSettings::addVetoableChangeListener(const OUString& PropertyName, const Reference< beans::XVetoableChangeListener > & aListener) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
{
    DBG_WARNING("not implemented")
}
/*-- 18.12.98 11:01:14---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXViewSettings::removeVetoableChangeListener(const OUString& PropertyName, const Reference< beans::XVetoableChangeListener > & aListener) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
{
    DBG_WARNING("not implemented")
}
OUString SwXViewSettings::getImplementationName(void) throw( RuntimeException )
{
    return C2U("SwXViewSettings");
}
BOOL SwXViewSettings::supportsService(const OUString& rServiceName) throw( RuntimeException )
{
    return C2U("com.sun.star.text.ViewSettings") == rServiceName;
}
Sequence< OUString > SwXViewSettings::getSupportedServiceNames(void) throw( RuntimeException )
{
    Sequence< OUString > aRet(1);
    OUString* pArray = aRet.getArray();
    pArray[0] = C2U("com.sun.star.text.ViewSettings");
    return aRet;
}

/******************************************************************
 *
 ******************************************************************/

/*------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.40  2000/09/18 16:06:15  willem.vandorp
    OpenOffice header added.

    Revision 1.39  2000/05/31 12:02:13  os
    SAL_CALL

    Revision 1.38  2000/04/11 08:05:00  os
    UNICODE

    Revision 1.37  2000/04/05 10:03:10  os
    #67584# scroll bar settings in read-only documents corrected

    Revision 1.36  2000/03/27 10:36:31  os
    UNO III

    Revision 1.35  2000/03/21 15:39:44  os
    UNOIII

    Revision 1.34  2000/02/11 14:59:53  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.33  1999/12/16 14:18:17  hjs
    includes

    Revision 1.32  1999/12/14 16:11:33  os
    #70234# Set Browser Mode via API

    Revision 1.31  1999/11/22 10:37:38  os
    missing headers added

    Revision 1.30  1999/11/19 16:38:03  os
    modules renamed

    Revision 1.29  1999/07/20 07:48:06  OS
    #67585# ZoomValue/ZoomType :SetZoom changed


      Rev 1.28   20 Jul 1999 09:48:06   OS
   #67585# ZoomValue/ZoomType :SetZoom changed

      Rev 1.27   20 Jul 1999 09:04:56   OS
   #67585# ZoomType/ZoomValue

      Rev 1.26   13 Jul 1999 08:50:56   OS
   #67584# Scrollbar settings via StarOne; #67585# Zoom-Property

      Rev 1.25   22 Apr 1999 16:09:04   OS
   #65194# throw -> throw

      Rev 1.24   22 Apr 1999 15:28:52   OS
   #65124# not implemented - nur noch DBG_WARNING

      Rev 1.23   30 Mar 1999 15:28:12   OS
   #63930# Services am ProcessServiceManager anmelden

      Rev 1.22   15 Mar 1999 14:38:24   OS
   #62845# Makro fuer ServiceInfo jetzt auch fuer OS/2

      Rev 1.21   12 Mar 1999 09:57:04   OS
   #62845# lang::XServiceInfo impl.

      Rev 1.20   09 Mar 1999 12:38:34   OS
   #62008# Solar-Mutex

      Rev 1.19   05 Mar 1999 14:27:26   OS
   #62874# Schreibfehler

      Rev 1.18   04 Mar 1999 15:04:12   OS
   #62191# UINT nicht mehr verwenden

      Rev 1.17   23 Feb 1999 16:19:56   OS
   #62281# UsrPrefs per UNO nur auf aktuelle sdbcx::View anwenden

      Rev 1.16   28 Jan 1999 16:27:50   OS
   #56371# keine Objekte fuer DEBUG anlegen

      Rev 1.15   27 Jan 1999 12:06:06   OS
   #56371# TF_ONE51

      Rev 1.14   18 Dec 1998 11:40:32   OS
   #56371# TF_ONE51 Zwischenstand

      Rev 1.13   10 Dec 1998 15:54:04   OS
   #56371# TF_ONE51 Zwischenstand

      Rev 1.12   23 Nov 1998 17:37:22   JP
   Bug #59754#: TerminateHdl wird nicht mehr fuers Clipboard benoetigt

      Rev 1.11   04 Nov 1998 10:24:56   OS
   #58315# im disposing beim frame::XDesktop abmelden

      Rev 1.10   01 Oct 1998 11:40:24   HR
   Typo beseitigt

      Rev 1.9   24 Sep 1998 13:33:14   OS
   #52654# #56685# frame::XTerminateListener fuer die Anmeldung an der Application

      Rev 1.8   10 Jul 1998 18:10:04   OS
   PropertySetInfo und IdlClass static

      Rev 1.7   17 Jun 1998 11:40:12   MH
   tmp fuer ICC

      Rev 1.6   04 Jun 1998 09:40:30   OS
// automatisch auskommentiert - [getIdlClass(es) or queryInterface] - Bitte XTypeProvider benutzen!
//   getIdlClasses


      Rev 1.5   14 May 1998 17:49:52   OS
   div. Namensaenderungen

      Rev 1.4   09 Apr 1998 15:10:34   OS
   Uno-Umstellung

      Rev 1.3   08 Apr 1998 12:51:08   OS
   text::ViewSettings auch fuer die TextView

      Rev 1.2   16 Mar 1998 12:38:54   OS
   ; im default

      Rev 1.1   16 Mar 1998 10:31:08   OS
   sdbcx::View- und PrintSettings vervollstaendigt

      Rev 1.0   15 Mar 1998 15:22:24   OS
   Initial revision.


------------------------------------------------------------------------*/

diff --git a/sw/source/ui/uno/unotxdoc.cxx b/sw/source/ui/uno/unotxdoc.cxx
new file mode 100644
index 0000000..2069a0a
--- /dev/null
+++ b/sw/source/ui/uno/unotxdoc.cxx
@@ -0,0 +1,2818 @@
/*************************************************************************
 *
 *  $RCSfile: unotxdoc.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:49 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include <cmdid.h>
#include <swtypes.hxx>

#ifndef _SV_IMAGE_HXX
#include <vcl/image.hxx>
#endif
#ifndef _SV_VIRDEV_HXX
#include <vcl/virdev.hxx>
#endif
#ifndef _TOOLKIT_UNOHLP_HXX
#include <toolkit/helper/vclunohelper.hxx>
#endif
#ifndef _DOC_HXX //autogen
#include <doc.hxx>
#endif
#ifndef _SWWDOCSH_HXX //autogen
#include <wdocsh.hxx>
#endif
#ifndef _WRTSH_HXX //autogen
#include <wrtsh.hxx>
#endif
#ifndef _SWVIEW_HXX //autogen
#include <view.hxx>
#endif
#ifndef _VIEWSH_HXX //autogen
#include <viewsh.hxx>
#endif
#ifndef _PVPRTDAT_HXX
#include <pvprtdat.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _UNOTXDOC_HXX //autogen
#include <unotxdoc.hxx>
#endif
#ifndef _NUMUNO_HXX
#include <svtools/numuno.hxx>
#endif
#ifndef _UNOOBJ_HXX
#include <unoobj.hxx>
#endif
#ifndef _UNOSETT_HXX
#include <unosett.hxx>
#endif
#ifndef _UNOCOLL_HXX
#include <unocoll.hxx>
#endif
#ifndef _UNOSRCH_HXX
#include <unosrch.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _UNOPRNMS_HXX
#include <unoprnms.hxx>
#endif
#ifndef _UNOSTYLE_HXX
#include <unostyle.hxx>
#endif
#ifndef _UNODRAW_HXX
#include <unodraw.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _PAGEDESC_HXX //autogen
#include <pagedesc.hxx>
#endif
#ifndef _UNOPRNMS_HXX //autogen
#include <unoprnms.hxx>
#endif
#ifndef _UNOOBJ_HXX //autogen
#include <unoobj.hxx>
#endif
#ifndef _TXTCMP_HXX //autogen
#include <svtools/txtcmp.hxx>
#endif
#ifndef _UNOCRSR_HXX //autogen
#include <unocrsr.hxx>
#endif
#ifndef _UNOFIELD_HXX
#include <unofield.hxx>
#endif
#ifndef _UNOIDX_HXX
#include <unoidx.hxx>
#endif
#ifndef _POOLFMT_HXX
#include <poolfmt.hxx>
#endif
#ifndef _COM_SUN_STAR_LANG_SERVICENOTREGISTEREDEXCEPTION_HPP_
#include <com/sun/star/lang/ServiceNotRegisteredException.hpp>
#endif
#ifndef _COM_SUN_STAR_UTIL_XNUMBERFORMATSSUPPLIER_HPP_
#include <com/sun/star/util/XNumberFormatsSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_PropertyAttribute_HPP_
#include <com/sun/star/beans/PropertyAttribute.hpp>
#endif
#ifndef _COM_SUN_STAR_VIEW_XSELECTIONSUPPLIER_HPP_
#include <com/sun/star/view/XSelectionSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_LANG_LOCALE_HPP_
#include <com/sun/star/lang/Locale.hpp>
#endif

#ifndef _SVX_UNOMID_HXX
#include <svx/unomid.hxx>
#endif
#ifndef _VOS_MUTEX_HXX_ //autogen
#include <vos/mutex.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _DOCSTAT_HXX //autogen wg. SwDocStat
#include <docstat.hxx>
#endif
#ifndef _MODOPT_HXX //
#include <modcfg.hxx>
 #endif
#ifndef _NDTXT_HXX
#include <ndtxt.hxx>
#endif
#include <utlui.hrc>
#include "swcont.hxx"

using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::lang;
using namespace ::rtl;

/******************************************************************************
 *
 ******************************************************************************/
SwTxtFmtColl *lcl_GetParaStyle(const String& rCollName, SwDoc* pDoc)
{
    SwTxtFmtColl* pColl = pDoc->FindTxtFmtCollByName( rCollName );
    if( !pColl )
    {
        sal_uInt16 nId = pDoc->GetPoolId( rCollName, GET_POOLID_TXTCOLL );
        if( USHRT_MAX != nId )
            pColl = pDoc->GetTxtCollFromPool( nId );
    }
    return pColl;
}
/* -----------------------------10.03.00 18:02--------------------------------

 ---------------------------------------------------------------------------*/
const Sequence< sal_Int8 > & SwXTextDocument::getUnoTunnelId()
{
    static Sequence< sal_Int8 > aSeq = ::CreateUnoTunnelId();
    return aSeq;
}
/* -----------------------------10.03.00 18:04--------------------------------

 ---------------------------------------------------------------------------*/
sal_Int64 SAL_CALL SwXTextDocument::getSomething( const Sequence< sal_Int8 >& rId )
    throw(RuntimeException)
{
    if( rId.getLength() == 16
        && 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
                                        rId.getConstArray(), 16 ) )
    {
            return (sal_Int64)this;
    }
    return 0;
}
/* -----------------------------16.03.00 14:12--------------------------------

 ---------------------------------------------------------------------------*/
Any SAL_CALL SwXTextDocument::queryInterface( const uno::Type& rType ) throw(RuntimeException)
{
    Any aRet = SwXTextDocumentBaseClass::queryInterface(rType);
    if(aRet.getValueType() == getVoidCppuType())
        aRet = SfxBaseModel::queryInterface(rType);
    if(aRet.getValueType() == getVoidCppuType() &&
        rType == ::getCppuType((Reference<lang::XMultiServiceFactory>*)0))
    {
        Reference<lang::XMultiServiceFactory> xTmp = this;
        aRet <<= xTmp;
    }
    if(aRet.getValueType() == getVoidCppuType())
    {
        if(!xNumFmtAgg.is())
            GetNumberFormatter();
        if(xNumFmtAgg.is())
            aRet = xNumFmtAgg->queryAggregation(rType);
    }
    return aRet;
}
/* -----------------------------16.03.00 14:12--------------------------------

 ---------------------------------------------------------------------------*/
void SAL_CALL SwXTextDocument::acquire()throw()
{
    SfxBaseModel::acquire();
}
/* -----------------------------16.03.00 14:12--------------------------------

 ---------------------------------------------------------------------------*/
void SAL_CALL SwXTextDocument::release()throw()
{
    SfxBaseModel::release();
}
/* -----------------------------16.03.00 14:12--------------------------------

 ---------------------------------------------------------------------------*/
Sequence< uno::Type > SAL_CALL SwXTextDocument::getTypes() throw(RuntimeException)
{
    Sequence< uno::Type > aBaseTypes = SfxBaseModel::getTypes();
    Sequence< uno::Type > aTextTypes = SwXTextDocumentBaseClass::getTypes();

    Sequence< uno::Type > aNumTypes;
    if(!xNumFmtAgg.is())
        GetNumberFormatter();
    if(xNumFmtAgg.is())
    {
        const uno::Type& rProvType = ::getCppuType((Reference<XTypeProvider>*) 0);
        Any aNumProv = xNumFmtAgg->queryAggregation(rProvType);
        if(aNumProv.getValueType() == rProvType)
        {
            Reference<XTypeProvider> xNumProv =
                *(Reference<XTypeProvider>*)aNumProv.getValue();
            aNumTypes = xNumProv->getTypes();
        }
    }
    long nIndex = aBaseTypes.getLength();
    // don't forget the ::com::sun::star::lang::XMultiServiceFactory
    aBaseTypes.realloc(aBaseTypes.getLength() + aTextTypes.getLength() + aNumTypes.getLength() + 1);
    uno::Type* pBaseTypes = aBaseTypes.getArray();
    const uno::Type* pTextTypes = aTextTypes.getConstArray();
    long nPos;
    for(nPos = 0; nPos < aTextTypes.getLength(); nPos++)
    {
        pBaseTypes[nIndex++] = pTextTypes[nPos];
    }
    const uno::Type* pNumTypes = aNumTypes.getConstArray();
    for(nPos = 0; nPos < aNumTypes.getLength(); nPos++)
    {
        pBaseTypes[nIndex++] = pNumTypes[nPos];
    }
    pBaseTypes[nIndex++] = ::getCppuType((Reference<lang::XMultiServiceFactory>*)0);
    return aBaseTypes;
}
/*-- 18.12.98 11:52:59---------------------------------------------------

  -----------------------------------------------------------------------*/
SwXTextDocument::SwXTextDocument(SwDocShell* pShell) :
    SfxBaseModel(pShell),
    aPropSet(aSwMapProvider.GetPropertyMap(PROPERTY_MAP_TEXT_DOCUMENT)),
    pDocShell(pShell),
    bObjectValid(pShell != 0),
    pxXTextTables(0),
    pxXTextFrames(0),
    pxXGraphicObjects(0),
    pxXEmbeddedObjects(0),
    pxXTextSections(0),
    pxXBookmarks(0),
    pxXTextFieldTypes(0),
    pxXTextFieldMasters(0),
    pxXFootnotes(0),
    pxXEndnotes(0),
    pxXFootnoteSettings(0),
    pxXEndnoteSettings(0),
    pxXDocumentIndexes(0),
    pxXStyleFamilies(0),
    pxXChapterNumbering(0),
    pxXLineNumberingProperties(0),
    pDrawPage(0),
    pxXDrawPage(0),
    pxXReferenceMarks(0),
    pxLinkTargetSupplier(0)
//  pxXRedlines(0)
{
}
/*-- 18.12.98 11:53:00---------------------------------------------------

  -----------------------------------------------------------------------*/
SwXTextDocument::~SwXTextDocument()
{
    InitNewDoc();
    if(xNumFmtAgg.is())
    {
        Reference< XInterface >  x0;
        xNumFmtAgg->setDelegator(x0);
        xNumFmtAgg = 0;
    }
    if(pxLinkTargetSupplier)
    {
         container::XNameAccess* pAccess = (*pxLinkTargetSupplier).get();
        ((SwXLinkTargetSupplier*)pAccess)->Invalidate();
        delete pAccess;
    }
}
/*-- 18.12.98 11:55:08---------------------------------------------------

  -----------------------------------------------------------------------*/
/* -----------------18.12.98 12:49-------------------
 *
 * --------------------------------------------------*/
void SwXTextDocument::GetNumberFormatter()
{
    if(IsValid())
    {
        if(!xNumFmtAgg.is())
        {
            {
                SvNumberFormatsSupplierObj* pNumFmt = new SvNumberFormatsSupplierObj(
                                    pDocShell->GetDoc()->GetNumberFormatter( sal_True ));
                Reference< util::XNumberFormatsSupplier >  xTmp = pNumFmt;
                xNumFmtAgg = Reference< XAggregation >(xTmp, UNO_QUERY);
            }
            if(xNumFmtAgg.is())
                xNumFmtAgg->setDelegator((cppu::OWeakObject*)(SwXTextDocumentBaseClass*)this);
        }
        else
        {
            const uno::Type& rTunnelType = ::getCppuType((Reference< XUnoTunnel > *)0);
            Any aNumTunnel = xNumFmtAgg->queryAggregation(rTunnelType);
            SvNumberFormatsSupplierObj* pNumFmt = 0;
            if(aNumTunnel.getValueType() == rTunnelType)
            {
                Reference< XUnoTunnel > xNumTunnel = *(Reference< XUnoTunnel >*)
                    aNumTunnel.getValue();
                pNumFmt = (SvNumberFormatsSupplierObj*)
                        xNumTunnel->getSomething(SvNumberFormatsSupplierObj::getUnoTunnelId());

            }
            DBG_ASSERT(pNumFmt, "No number formatter available");
            if(!pNumFmt->GetNumberFormatter())
                pNumFmt->SetNumberFormatter(pDocShell->GetDoc()->GetNumberFormatter( sal_True ));
        }
    }
}
/*-- 18.12.98 11:55:11---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< text::XText >  SwXTextDocument::getText(void) throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(!IsValid())
        throw RuntimeException();
    if(!xBodyText.is())
    {
        pBodyText = new SwXBodyText(pDocShell->GetDoc());
        xBodyText = pBodyText;
    }
    return xBodyText;
}
/*-- 18.12.98 11:55:11---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXTextDocument::reformat(void) throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(!IsValid())
        throw RuntimeException();
}
/*-- 18.12.98 11:55:16---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXTextDocument::lockControllers(void) throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(IsValid())
    {
        UnoActionContext* pContext = new UnoActionContext(pDocShell->GetDoc());
        aActionArr.Insert(pContext, 0);
    }
    else
        throw RuntimeException();
}
/*-- 18.12.98 11:55:16---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXTextDocument::unlockControllers(void) throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(aActionArr.Count())
    {
        UnoActionContext* pContext = aActionArr.GetObject(0);
        aActionArr.Remove(0);
        delete pContext;
    }
    else
        throw RuntimeException();
}
/*-- 18.12.98 11:55:17---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Bool SwXTextDocument::hasControllersLocked(void) throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    return aActionArr.Count() > 0;
}
/*-- 18.12.98 13:12:23---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< frame::XController >  SwXTextDocument::getCurrentController(void) throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    return SfxBaseModel::getCurrentController();
}
/*-- 18.12.98 13:12:24---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXTextDocument::setCurrentController(const Reference< frame::XController > & xController)
    throw( container::NoSuchElementException, RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    SfxBaseModel::setCurrentController(xController);
}
/* -----------------27.01.99 11:48-------------------
 *
 * --------------------------------------------------*/
Reference< XInterface >  SwXTextDocument::getCurrentSelection() throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    Reference< XInterface >  xRef;
    if(IsValid())
    {

        const TypeId aTypeId = TYPE(SwView);
        SwView* pView = (SwView*)SfxViewShell::GetFirst(&aTypeId);
        while(pView && pView->GetObjectShell() != pDocShell)
        {
            pView = (SwView*)SfxViewShell::GetNext(*pView, &aTypeId);
        }
        if(pView)
        {
            Any aRef = pView->GetUNOObject()->getSelection();
            xRef = *(Reference< XInterface > *)aRef.getValue();
        }
    }
    return xRef;
}

/*-- 18.12.98 13:12:24---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Bool SwXTextDocument::attachResource(const OUString& aURL, const Sequence< beans::PropertyValue >& aArgs)
        throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    return SfxBaseModel::attachResource(aURL, aArgs);
}
/*-- 18.12.98 13:12:24---------------------------------------------------

  -----------------------------------------------------------------------*/
OUString SwXTextDocument::getURL(void) throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    return SfxBaseModel::getURL();
}
/*-- 18.12.98 13:12:24---------------------------------------------------

  -----------------------------------------------------------------------*/
Sequence< beans::PropertyValue > SwXTextDocument::getArgs(void) throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    return SfxBaseModel::getArgs();
}
/*-- 18.12.98 13:12:24---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXTextDocument::connectController(const Reference< frame::XController > & xController) throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    SfxBaseModel::connectController(xController);
}
/*-- 18.12.98 13:12:25---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXTextDocument::disconnectController(const Reference< frame::XController > & xController) throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    SfxBaseModel::disconnectController(xController);
}
/*-- 18.12.98 13:12:25---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXTextDocument::dispose(void) throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    SfxBaseModel::dispose();
}
/*-- 18.12.98 13:12:25---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXTextDocument::addEventListener(const Reference< XEventListener > & aListener) throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    SfxBaseModel::addEventListener(aListener);
}
/*-- 18.12.98 13:12:26---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXTextDocument::removeEventListener(const Reference< XEventListener > & aListener) throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    SfxBaseModel::removeEventListener(aListener);
}

/*-- 18.12.98 11:55:19---------------------------------------------------

  -----------------------------------------------------------------------*/
Sequence< PropertyValues > SwXTextDocument::getLineNumberingRules(void)
    throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    DBG_WARNING("not implemented")
    return Sequence< PropertyValues >();
    /* eigenartiges interface, muesste ein PropertySet returnen und get...Settings heissen
    if(IsValid())
    {
        if(!pxXLineNumberingProperties)
        {
            ((SwXTextDocument*)this)->pxXLineNumberingProperties =
                new Reference< XLineNumberingProperties > ;
            (*pxXLineNumberingProperties) = new SwXLineNumberingProperties(pDocShell->GetDoc());
        }
    }
    else
        throw RuntimeException();
    return *pxXLineNumberingProperties;*/

}
/*-- 18.12.98 11:55:20---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXTextDocument::setLineNumberingRules(
    const Sequence< PropertyValues >& aRules)
    throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    DBG_WARNING("not implemented")
}
/*-- 18.12.98 11:55:20---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< container::XIndexReplace >  SwXTextDocument::getChapterNumberingRules(void)
                                    throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(!IsValid())
        throw RuntimeException();
    if(!pxXChapterNumbering)
    {
        pxXChapterNumbering = new Reference< container::XIndexReplace > ;
        *pxXChapterNumbering = new SwXChapterNumbering(*pDocShell);
    }
    return *pxXChapterNumbering;
}
/*-- 18.12.98 11:55:21---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< container::XIndexAccess >  SwXTextDocument::getFootnotes(void) throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(!IsValid())
        throw RuntimeException();
    if(!pxXFootnotes)
    {
        ((SwXTextDocument*)this)->pxXFootnotes = new Reference< container::XIndexAccess > ;
        *pxXFootnotes = new SwXFootnotes(sal_False, pDocShell->GetDoc());
    }
    return *pxXFootnotes;
}
/*-- 18.12.98 11:55:21---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< XPropertySet >  SAL_CALL
        SwXTextDocument::getFootnoteSettings(void) throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(!IsValid())
        throw RuntimeException();
    if(!pxXFootnoteSettings)
    {
        ((SwXTextDocument*)this)->pxXFootnoteSettings = new Reference< XPropertySet > ;
        *pxXFootnoteSettings = new SwXFootnoteProperties(pDocShell->GetDoc());
    }
    return *pxXFootnoteSettings;
}
/*-- 18.12.98 11:55:21---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< container::XIndexAccess >  SwXTextDocument::getEndnotes(void) throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(!IsValid())
        throw RuntimeException();
    if(!pxXEndnotes)
    {
        ((SwXTextDocument*)this)->pxXEndnotes = new Reference< container::XIndexAccess > ;
        *pxXEndnotes = new SwXFootnotes(sal_True, pDocShell->GetDoc());
    }
    return *pxXEndnotes;
}
/*-- 18.12.98 11:55:22---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< XPropertySet >  SwXTextDocument::getEndnoteSettings(void) throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(!IsValid())
        throw RuntimeException();
    if(!pxXEndnoteSettings)
    {
        ((SwXTextDocument*)this)->pxXEndnoteSettings = new Reference< XPropertySet > ;
        *pxXEndnoteSettings = new SwXEndnoteProperties(pDocShell->GetDoc());
    }
    return *pxXEndnoteSettings;
}
/*-- 18.12.98 11:55:22---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< util::XReplaceDescriptor >  SwXTextDocument::createReplaceDescriptor(void)
    throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    Reference< util::XReplaceDescriptor >  xRet = new SwXTextSearch;
    return xRet;
}
/* -----------------26.02.99 15:52-------------------
 *
 * --------------------------------------------------*/
SwUnoCrsr*  SwXTextDocument::CreateCursorForSearch(Reference< text::XTextCursor > & xCrsr)
{
    getText();
     text::XText* pText = xBodyText.get();
    SwXBodyText* pBText = (SwXBodyText*)pText;
    xCrsr = pBText->CreateTextCursor(sal_True);

    Reference<XUnoTunnel> xRangeTunnel( xCrsr, UNO_QUERY);
    SwXTextCursor* pxUnoCrsr = 0;
    if(xRangeTunnel.is())
    {
        pxUnoCrsr = (SwXTextCursor*)xRangeTunnel->getSomething(
                                SwXTextCursor::getUnoTunnelId());
    }

    sal_uInt32 nResult = 0;
    SwUnoCrsr*  pUnoCrsr = pxUnoCrsr->GetCrsr();
    pUnoCrsr->SetRemainInSection(sal_False);
    return pUnoCrsr;
}

/*-- 18.12.98 11:55:22---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Int32 SwXTextDocument::replaceAll(const Reference< util::XSearchDescriptor > & xDesc)
                                        throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    Reference< XUnoTunnel > xDescTunnel(xDesc, UNO_QUERY);
    if(!IsValid() || !xDescTunnel.is() || !xDescTunnel->getSomething(SwXTextSearch::getUnoTunnelId()))
        throw RuntimeException();

    Reference< text::XTextCursor >  xCrsr;
    SwUnoCrsr*  pUnoCrsr = CreateCursorForSearch(xCrsr);

    const SwXTextSearch* pSearch = (const SwXTextSearch*)
            xDescTunnel->getSomething(SwXTextSearch::getUnoTunnelId());

    SearchParam aSrchParam(pSearch->sSearchText);
    aSrchParam.SetReplaceStr(pSearch->sReplaceText);
    sal_Bool bBackward = sal_False;
    int eRanges(FND_IN_BODY|FND_IN_SELALL);
//bInSel: 1;  // wie geht   das?
    //TODO: pSearch->bStyles!
    aSrchParam.SetCaseSensitive(pSearch->bCase);

//      inSelection??
//      aSrchParam.SetSrchInSelection(TypeConversion::toBOOL(aVal));
    aSrchParam.SetSrchWordOnly(pSearch->bWord);
    aSrchParam.SetSrchRelaxed(pSearch->bLevRelax);
    aSrchParam.SetLEVOther(pSearch->nLevExchange);
    aSrchParam.SetLEVShorter(pSearch->nLevRemove);
    aSrchParam.SetLEVLonger(pSearch->nLevAdd);
    if(pSearch->bExpr)
        aSrchParam.SetSrchType(SearchParam::SRCH_REGEXP);
    // similarity setzt sich gegen RegExp durch!
    if(pSearch->bSimilarity)
        aSrchParam.SetSrchType(SearchParam::SRCH_LEVDIST);
    SwDocPositions eStart = pSearch->bBack ? DOCPOS_END : DOCPOS_START;
    SwDocPositions eEnd = pSearch->bBack ? DOCPOS_START : DOCPOS_END;

    // Suche soll ueberall stattfinden
    pUnoCrsr->SetRemainInSection(sal_False);
    sal_uInt32 nResult;
    //try attribute search first
    if(pSearch->HasSearchAttributes()||pSearch->HasReplaceAttributes())
    {
        SfxItemSet aSearch(pDocShell->GetDoc()->GetAttrPool(),
                            RES_CHRATR_BEGIN, RES_CHRATR_END-1,
                            RES_PARATR_BEGIN, RES_PARATR_END-1,
                            RES_FRMATR_BEGIN, RES_FRMATR_END-1,
                            0);
        SfxItemSet aReplace(pDocShell->GetDoc()->GetAttrPool(),
                            RES_CHRATR_BEGIN, RES_CHRATR_END-1,
                            RES_PARATR_BEGIN, RES_PARATR_END-1,
                            RES_FRMATR_BEGIN, RES_FRMATR_END-1,
                            0);
        pSearch->FillSearchItemSet(aSearch);
        pSearch->FillReplaceItemSet(aReplace);
        nResult = (sal_Int32)pUnoCrsr->Find( aSearch, !pSearch->bStyles,
                    eStart, eEnd,
                    (FindRanges)eRanges,
                    pSearch->sSearchText.Len() ? &aSrchParam : 0,
                    &aReplace );
    }
    else if(pSearch->bStyles)
    {
        SwTxtFmtColl *pSearchColl = lcl_GetParaStyle(pSearch->sSearchText, pUnoCrsr->GetDoc());
        SwTxtFmtColl *pReplaceColl = lcl_GetParaStyle(pSearch->sReplaceText, pUnoCrsr->GetDoc());;

        nResult = pUnoCrsr->Find( *pSearchColl,
                    eStart, eEnd,
                    (FindRanges)eRanges, pReplaceColl );

    }
    else
    {
        nResult = pUnoCrsr->Find( aSrchParam,
            eStart, eEnd,
            (FindRanges)eRanges,
//int bReplace =
            sal_True );
    }
    return (sal_Int32)nResult;

}
/*-- 18.12.98 11:55:22---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< util::XSearchDescriptor >  SwXTextDocument::createSearchDescriptor(void)
                                                    throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    Reference< util::XSearchDescriptor >  xRet = new SwXTextSearch;
    return xRet;

}
/* -----------------26.02.99 16:08-------------------
 * wird fuer findAll/First/Next verwendet
 * --------------------------------------------------*/
SwUnoCrsr*  SwXTextDocument::FindAny(const Reference< util::XSearchDescriptor > & xDesc,
                                        Reference< text::XTextCursor > & xCrsr, sal_Bool bAll,
                                                sal_Int32& nResult,
                                                Reference< XInterface >  xLastResult)
{
    Reference< XUnoTunnel > xDescTunnel(xDesc, UNO_QUERY);
    if(!IsValid() || !xDescTunnel.is() || !xDescTunnel->getSomething(SwXTextSearch::getUnoTunnelId()))
        return 0;

    SwUnoCrsr*  pUnoCrsr = CreateCursorForSearch(xCrsr);
    const SwXTextSearch* pSearch = (const SwXTextSearch*)
        xDescTunnel->getSomething(SwXTextSearch::getUnoTunnelId());

    sal_Bool bParentInExtra = sal_False;
    if(xLastResult.is())
    {
        Reference<XUnoTunnel> xCursorTunnel( xLastResult, UNO_QUERY);
        SwXTextCursor* pPosCrsr = 0;
        if(xCursorTunnel.is())
        {
            pPosCrsr = (SwXTextCursor*)xCursorTunnel->getSomething(
                                    SwXTextCursor::getUnoTunnelId());
        }
        SwUnoCrsr* pCrsr = pPosCrsr ? pPosCrsr->GetCrsr() : 0;
        if(pCrsr)
        {
            *pUnoCrsr->GetPoint() = *pCrsr->End();
            pUnoCrsr->DeleteMark();
        }
        else
        {
            SwXTextRange* pRange = 0;
            if(xCursorTunnel.is())
            {
                pRange = (SwXTextRange*)xCursorTunnel->getSomething(
                                        SwXTextRange::getUnoTunnelId());
            }
            if(!pRange)
                return 0;
            pRange->GetPositions(*pUnoCrsr);
            if(pUnoCrsr->HasMark())
            {
                if(*pUnoCrsr->GetPoint() < *pUnoCrsr->GetMark())
                    pUnoCrsr->Exchange();
                pUnoCrsr->DeleteMark();
            }
        }
        const SwNode* pRangeNode = pUnoCrsr->GetNode();
        const SwStartNode* pTmp = pRangeNode->FindStartNode();

        while(pTmp->IsSectionNode())
        {
            pTmp = pTmp->FindStartNode();
        }
        bParentInExtra = SwNormalStartNode != pTmp->GetStartNodeType();
    }

    SearchParam aSrchParam(pSearch->sSearchText);
    sal_Bool bBackward = sal_False;
/*
 * folgende Kombinationen sind erlaubt:
 *  - suche einen im Body:                  -> FND_IN_BODY
 *  - suche alle im Body:                   -> FND_IN_BODYONLY | FND_IN_SELALL
 *  - suche in Selectionen: einen / alle    -> FND_IN_SEL  [ | FND_IN_SELALL ]
 *  - suche im nicht Body: einen / alle     -> FND_IN_OTHER [ | FND_IN_SELALL ]
 *  - suche ueberall alle:                  -> FND_IN_SELALL
 */
    int eRanges(FND_IN_BODY);
    if(bParentInExtra)
        eRanges = FND_IN_OTHER;
//bInSel: 1;  // wie geht   das?
    aSrchParam.SetCaseSensitive(pSearch->bCase);

    if(bAll) //immer - ueberall?
        eRanges = FND_IN_SELALL;
//      inSelection??
//      aSrchParam.SetSrchInSelection(TypeConversion::toBOOL(aVal));
    aSrchParam.SetSrchWordOnly(pSearch->bWord);
    aSrchParam.SetSrchRelaxed(pSearch->bLevRelax);
    aSrchParam.SetLEVOther(pSearch->nLevExchange);
    aSrchParam.SetLEVShorter(pSearch->nLevRemove);
    aSrchParam.SetLEVLonger(pSearch->nLevAdd);
    if(pSearch->bExpr)
        aSrchParam.SetSrchType(SearchParam::SRCH_REGEXP);
    // similarity setzt sich gegen RegExp durch!
    if(pSearch->bSimilarity)
        aSrchParam.SetSrchType(SearchParam::SRCH_LEVDIST);
    SwDocPositions eStart = !bAll ? DOCPOS_CURR : pSearch->bBack ? DOCPOS_END : DOCPOS_START;
    SwDocPositions eEnd = pSearch->bBack ? DOCPOS_START : DOCPOS_END;

    nResult = 0;
    sal_uInt16 nSearchProc = 0;
    while(nSearchProc < 2)
    {
        //try attribute search first
        if(pSearch->HasSearchAttributes())
        {
            SfxItemSet aSearch(pDocShell->GetDoc()->GetAttrPool(),
                                RES_CHRATR_BEGIN, RES_CHRATR_END-1,
                                RES_PARATR_BEGIN, RES_PARATR_END-1,
                                RES_FRMATR_BEGIN, RES_FRMATR_END-1,
                                RES_TXTATR_INETFMT, RES_TXTATR_INETFMT,
                                0);
            pSearch->FillSearchItemSet(aSearch);
            nResult = (sal_Int32)pUnoCrsr->Find( aSearch, !pSearch->bStyles,
                        eStart, eEnd,
                        (FindRanges)eRanges,
                        pSearch->sSearchText.Len() ? &aSrchParam : 0,
                        0 );
        }
        else if(pSearch->bStyles)
        {
            SwTxtFmtColl *pSearchColl = lcl_GetParaStyle(pSearch->sSearchText, pUnoCrsr->GetDoc());
            //pSearch->sReplaceText
            SwTxtFmtColl *pReplaceColl = 0;

            nResult = (sal_Int32)pUnoCrsr->Find( *pSearchColl,
                        eStart, eEnd,
                        (FindRanges)eRanges, pReplaceColl );
        }
        else
        {
            nResult = (sal_Int32)pUnoCrsr->Find( aSrchParam,
                    eStart, eEnd,
                    (FindRanges)eRanges,
                    /*int bReplace =*/sal_False );
        }
        nSearchProc++;
        if(nResult || (eRanges&(FND_IN_SELALL|FND_IN_OTHER)))
            break;
        //second step - find in other
        eRanges = FND_IN_OTHER;
    }
    return pUnoCrsr;
}
/*-- 18.12.98 11:55:23---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< container::XIndexAccess >
    SwXTextDocument::findAll(const Reference< util::XSearchDescriptor > & xDesc)
                                                throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    Reference< XInterface >  xTmp;
    sal_Int32 nResult = 0;
    Reference< text::XTextCursor >  xCrsr;
    SwUnoCrsr* pResultCrsr = FindAny(xDesc, xCrsr, sal_True, nResult, xTmp);
    if(!pResultCrsr)
        throw RuntimeException();
    Reference< container::XIndexAccess >  xRet;
    if(nResult)
        xRet = new SwXTextRanges(pResultCrsr);
    else
        xRet = new SwXTextRanges();
    return xRet;
}
/*-- 18.12.98 11:55:23---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< XInterface >  SwXTextDocument::findFirst(const Reference< util::XSearchDescriptor > & xDesc)
                                            throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    Reference< XInterface >  xTmp;
    sal_Int32 nResult = 0;
    Reference< text::XTextCursor >  xCrsr;
    SwUnoCrsr* pResultCrsr = FindAny(xDesc, xCrsr, sal_False, nResult, xTmp);
    if(!pResultCrsr)
        throw RuntimeException();
    Reference< XInterface >  xRet;
    if(nResult)
    {
        Reference< text::XTextRange >  xTempRange = CreateTextRangeFromPosition(
                        pDocShell->GetDoc(),
                        *pResultCrsr->GetPoint(),
                        pResultCrsr->GetMark());
        xRet = *new SwXTextCursor(xTempRange->getText(), pResultCrsr);
    }
    return xRet;
}
/*-- 18.12.98 11:55:24---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< XInterface >  SwXTextDocument::findNext(const Reference< XInterface > & xStartAt,
            const Reference< util::XSearchDescriptor > & xDesc)
            throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    Reference< XInterface >  xTmp;
    sal_Int32 nResult = 0;
    Reference< text::XTextCursor >  xCrsr;
    if(!xStartAt.is())
        throw RuntimeException();
    SwUnoCrsr* pResultCrsr = FindAny(xDesc, xCrsr, sal_False, nResult, xStartAt);
    if(!pResultCrsr)
        throw RuntimeException();
    Reference< XInterface >  xRet;
    if(nResult)
    {
        Reference< text::XTextRange >  xTempRange = CreateTextRangeFromPosition(
                        pDocShell->GetDoc(),
                        *pResultCrsr->GetPoint(),
                        pResultCrsr->GetMark());

        xRet = *new SwXTextCursor(xTempRange->getText(), pResultCrsr);
    }
    return xRet;
}
/*-- 18.12.98 11:55:24---------------------------------------------------

  -----------------------------------------------------------------------*/
Sequence< beans::PropertyValue > SwXTextDocument::getPagePrintSettings(void)
    throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    Sequence< beans::PropertyValue > aSeq(9);
    if(IsValid())
    {
        beans::PropertyValue* pArray = aSeq.getArray();
        SwPagePreViewPrtData aData;
        const SwPagePreViewPrtData* pData = pDocShell->GetDoc()->GetPreViewPrtData();
        if(pData)
            aData = *pData;
        Any aVal;
        aVal <<= (sal_Int16)aData.GetRow();
        pArray[0] = beans::PropertyValue(C2U("PageRows"), -1, aVal, PropertyState_DIRECT_VALUE);
        aVal <<= (sal_Int16)aData.GetCol();
        pArray[1] = beans::PropertyValue(C2U("PageColumns"), -1, aVal, PropertyState_DIRECT_VALUE);
        aVal <<= (sal_Int32)TWIP_TO_MM100(aData.GetLeftSpace());
        pArray[2] = beans::PropertyValue(C2U("LeftMargin"), -1, aVal, PropertyState_DIRECT_VALUE);
        aVal <<= (sal_Int32)TWIP_TO_MM100(aData.GetRightSpace());
        pArray[3] = beans::PropertyValue(C2U("RightMargin"), -1, aVal, PropertyState_DIRECT_VALUE);
        aVal <<= (sal_Int32)TWIP_TO_MM100(aData.GetTopSpace());
        pArray[4] = beans::PropertyValue(C2U("TopMargin"), -1, aVal, PropertyState_DIRECT_VALUE);
        aVal <<= (sal_Int32)TWIP_TO_MM100(aData.GetBottomSpace());
        pArray[5] = beans::PropertyValue(C2U("BottomMargin"), -1, aVal, PropertyState_DIRECT_VALUE);
        aVal <<= (sal_Int32)TWIP_TO_MM100(aData.GetHorzSpace());
        pArray[6] = beans::PropertyValue(C2U("HoriMargin"), -1, aVal, PropertyState_DIRECT_VALUE);
        aVal <<= (sal_Int32)TWIP_TO_MM100(aData.GetVertSpace());
        pArray[7] = beans::PropertyValue(C2U("VertMargin"), -1, aVal, PropertyState_DIRECT_VALUE);
        BOOL bTemp = aData.GetLandscape();
        aVal.setValue(&bTemp, ::getCppuBooleanType());
        pArray[8] = beans::PropertyValue(C2U("IsLandscape"), -1, aVal, PropertyState_DIRECT_VALUE);
    }
    else
        throw RuntimeException();
    return aSeq;
}
/* -----------------24.02.99 10:57-------------------
 *
 * --------------------------------------------------*/
sal_uInt32 lcl_Any_To_ULONG(const Any& rValue, sal_Bool& bException)
{
    bException = sal_False;
    TypeClass eType = rValue.getValueType().getTypeClass();

    sal_uInt32 nRet = 0;
    if( eType == TypeClass_LONG )
    {
         sal_Int32 nVal;
         rValue >>= nVal;
         if(nVal >=0 )
            nRet = (sal_uInt32)nVal;
    }
    else if( eType == TypeClass_UNSIGNED_SHORT )
    {
        sal_uInt16 nVal;
        rValue >>= nVal;
        nRet = nVal;
    }
    else if( eType == TypeClass_SHORT )
    {
        sal_Int16 nVal;
        rValue >>= nVal;
        if(nVal >=0)
            nRet = (sal_uInt32)nVal;
    }
    else if( eType == TypeClass_BYTE )
    {
        BYTE nVal;
        rValue >>= nVal;
        nRet = nVal;
    }
    else if( eType == TypeClass_UNSIGNED_LONG )
        rValue >>= nRet;
    else
        bException = sal_True;

    return nRet;
}
/*-- 18.12.98 11:55:25---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXTextDocument::setPagePrintSettings(const Sequence< beans::PropertyValue >& aSettings)
    throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(IsValid())
    {
        SwPagePreViewPrtData aData;
        //falls nur einige Properties kommen, dann die akt. Einstellungen benutzen
        const SwPagePreViewPrtData* pData = pDocShell->GetDoc()->GetPreViewPrtData();
        if(pData)
            aData = *pData;
        const beans::PropertyValue* pProperties = aSettings.getConstArray();
        int nCount = aSettings.getLength();
        for(int i = 0; i < nCount; i++)
        {
            String sName = pProperties[i].Name;
            const Any& rVal = pProperties[i].Value;
            sal_Bool bException;
            sal_uInt32 nVal = lcl_Any_To_ULONG(rVal, bException);
            if( COMPARE_EQUAL == sName.CompareToAscii("PageRows" ) )
            {
                if(!nVal)
                    throw RuntimeException();
                aData.SetRow(nVal);
            }
            else if(COMPARE_EQUAL == sName.CompareToAscii("PageColumns"))
            {
                if(!nVal)
                    throw RuntimeException();
                aData.SetCol(nVal);
            }
            else if(COMPARE_EQUAL == sName.CompareToAscii("LeftMargin"))
            {
                aData.SetLeftSpace(MM100_TO_TWIP(nVal));
            }
            else if(COMPARE_EQUAL == sName.CompareToAscii("RightMargin"))
            {
                aData.SetRightSpace(MM100_TO_TWIP(nVal));
            }
            else if(COMPARE_EQUAL == sName.CompareToAscii("TopMargin"))
            {
                aData.SetTopSpace(MM100_TO_TWIP(nVal));
            }
            else if(COMPARE_EQUAL == sName.CompareToAscii("BottomMargin"))
            {
                aData.SetBottomSpace(MM100_TO_TWIP(nVal));
            }
            else if(COMPARE_EQUAL == sName.CompareToAscii("HoriMargin"))
            {
                aData.SetHorzSpace(MM100_TO_TWIP(nVal));
            }
            else if(COMPARE_EQUAL == sName.CompareToAscii("VertMargin"))
            {
                aData.SetVertSpace(MM100_TO_TWIP(nVal));
            }
            else if(COMPARE_EQUAL == sName.CompareToAscii("IsLandscape"))
            {
                bException =  (::getBooleanCppuType() != rVal.getValueType());
                aData.SetLandscape(*(sal_Bool*)rVal.getValue());
            }
            else
                bException = sal_True;
            if(bException)
                throw RuntimeException();
        }
        pDocShell->GetDoc()->SetPreViewPrtData(&aData);
    }
    else
        throw RuntimeException();
}
/*-- 18.12.98 11:55:25---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXTextDocument::printPages(const Sequence< beans::PropertyValue >& xOptions)
    throw( IllegalArgumentException, RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(IsValid())
    {
        SfxViewFrame* pFrame = SFX_APP()->CreateViewFrame( *pDocShell, 7, sal_True );
        SfxRequest aReq(FN_PRINT_PAGEPREVIEW, SFX_CALLMODE_SYNCHRON,
                                    pDocShell->GetDoc()->GetAttrPool());
            aReq.AppendItem(SfxBoolItem(FN_PRINT_PAGEPREVIEW, sal_True));

        OUString sFileName(C2U( UNO_NAME_FILE_NAME  ));
        OUString sCopyCount(C2U(UNO_NAME_COPY_COUNT ));
        OUString sCollate(C2U(  UNO_NAME_COLLATE    ));
        OUString sSort(C2U(     UNO_NAME_SORT       ));
        OUString sPages(C2U(    UNO_NAME_PAGES      ));

        for ( int n = 0; n < xOptions.getLength(); ++n )
        {
            // get Property-Value from options
            const beans::PropertyValue &rProp = xOptions.getConstArray()[n];
            Any aValue( rProp.Value );

            // FileName-Property?
            if ( rProp.Name == sFileName )
            {
                if ( rProp.Value.getValueType() == ::getCppuType((const OUString*)0))
                    aReq.AppendItem(SfxStringItem( SID_FILE_NAME, *(const OUString*)rProp.Value.getValue()));
                else if ( rProp.Value.getValueType() != ::getVoidCppuType() )
                    throw IllegalArgumentException();
            }

            // CopyCount-Property
            else if ( rProp.Name == sCopyCount )
            {
                sal_Int32 nCopies;
                aValue >>= nCopies;
                aReq.AppendItem(SfxInt16Item( SID_PRINT_COPIES, nCopies ) );
            }

            // Collate-Property
            else if ( rProp.Name == sCollate )
            {
                if ( rProp.Value.getValueType() == ::getBooleanCppuType())

                    aReq.AppendItem(SfxBoolItem( SID_PRINT_COLLATE, *(sal_Bool*)rProp.Value.getValue() ) );
                else
                    throw IllegalArgumentException();
            }

            // Sort-Property
            else if ( rProp.Name == sSort )
            {
                if ( rProp.Value.getValueType() == ::getBooleanCppuType() )
                    aReq.AppendItem(SfxBoolItem( SID_PRINT_SORT, *(sal_Bool*)rProp.Value.getValue() ) );
                else
                    throw IllegalArgumentException();
            }

            // Pages-Property
            else if ( rProp.Name == sPages )
            {
                if ( rProp.Value.getValueType() == ::getCppuType((const OUString*)0) )
                    aReq.AppendItem( SfxStringItem( SID_PRINT_PAGES, *(OUString*)rProp.Value.getValue() ) );
                else
                    throw IllegalArgumentException();
            }
        }


        pFrame->GetViewShell()->ExecuteSlot(aReq);
        // Frame schliessen
        pFrame->DoClose();

    }
    else
        throw RuntimeException();
}
/*-- 18.12.98 11:55:25---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< container::XNameAccess >  SwXTextDocument::getReferenceMarks(void)
                                        throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(!IsValid())
        throw RuntimeException();
    if(!pxXReferenceMarks)
    {
        ((SwXTextDocument*)this)->pxXReferenceMarks = new Reference< container::XNameAccess > ;
        *pxXReferenceMarks = new SwXReferenceMarks(pDocShell->GetDoc());
    }
    return *pxXReferenceMarks;
}
/* -----------------21.12.98 10:20-------------------
 *
 * --------------------------------------------------*/
Reference< container::XEnumerationAccess >  SwXTextDocument::getTextFields(void) throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(!IsValid())
        throw RuntimeException();
    if(!pxXTextFieldTypes)
    {
        ((SwXTextDocument*)this)->pxXTextFieldTypes = new Reference< container::XEnumerationAccess > ;
        *pxXTextFieldTypes = new SwXTextFieldTypes(pDocShell->GetDoc());
    }
    return *pxXTextFieldTypes;
}
/*-- 21.12.98 10:21:12---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< container::XNameAccess >  SwXTextDocument::getTextFieldMasters(void)
    throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(!IsValid())
        throw RuntimeException();
    if(!pxXTextFieldMasters)
    {
        ((SwXTextDocument*)this)->pxXTextFieldMasters = new Reference< container::XNameAccess > ;
        *pxXTextFieldMasters = new SwXTextFieldMasters(pDocShell->GetDoc());
    }
    return *pxXTextFieldMasters;
}
/*-- 21.12.98 10:21:12---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< container::XNameAccess >  SwXTextDocument::getEmbeddedObjects(void) throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(!IsValid())
        throw RuntimeException();
    if(!pxXEmbeddedObjects)
    {
        ((SwXTextDocument*)this)->pxXEmbeddedObjects = new Reference< container::XNameAccess > ;
        *pxXEmbeddedObjects = new SwXTextEmbeddedObjects(pDocShell->GetDoc());
    }
    return *pxXEmbeddedObjects;
}
/*-- 21.12.98 10:21:13---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< container::XNameAccess >  SwXTextDocument::getBookmarks(void) throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(!IsValid())
        throw RuntimeException();
    if(!pxXBookmarks)
    {
        ((SwXTextDocument*)this)->pxXBookmarks = new Reference< container::XNameAccess > ;
        *pxXBookmarks = new SwXBookmarks(pDocShell->GetDoc());
    }
    return *pxXBookmarks;
}
/*-- 21.12.98 10:21:13---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< container::XNameAccess >  SwXTextDocument::getTextSections(void) throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(!IsValid())
        throw RuntimeException();
    if(!pxXTextSections)
    {
        ((SwXTextDocument*)this)->pxXTextSections = new Reference< container::XNameAccess > ;
        *pxXTextSections = new SwXTextSections(pDocShell->GetDoc());
    }
    return *pxXTextSections;
}
/*-- 21.12.98 10:21:13---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< container::XNameAccess >  SwXTextDocument::getTextTables(void) throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(!IsValid())
        throw RuntimeException();
    if(!pxXTextTables)
    {
        ((SwXTextDocument*)this)->pxXTextTables = new Reference< container::XNameAccess > ;
        *pxXTextTables = new SwXTextTables(pDocShell->GetDoc());
    }
    return *pxXTextTables;
}
/*-- 21.12.98 10:21:13---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< container::XNameAccess >  SwXTextDocument::getGraphicObjects(void) throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(!IsValid())
        throw RuntimeException();
    if(!pxXGraphicObjects)
    {
        ((SwXTextDocument*)this)->pxXGraphicObjects = new Reference< container::XNameAccess > ;
        *pxXGraphicObjects = new SwXTextGraphicObjects(pDocShell->GetDoc());
    }
    return *pxXGraphicObjects;
}
/*-- 21.12.98 10:21:14---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< container::XNameAccess >  SwXTextDocument::getTextFrames(void) throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(!IsValid())
        throw RuntimeException();
    if(!pxXTextFrames)
    {
        ((SwXTextDocument*)this)->pxXTextFrames = new Reference< container::XNameAccess > ;
        *pxXTextFrames = new SwXTextFrames(pDocShell->GetDoc());
    }
    return *pxXTextFrames;
}
/* -----------------21.12.98 10:56-------------------
 *
 * --------------------------------------------------*/
Reference< container::XNameAccess >  SwXTextDocument::getStyleFamilies(void) throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(!IsValid())
        throw RuntimeException();
    if(!pxXStyleFamilies)
    {
        ((SwXTextDocument*)this)->pxXStyleFamilies = new Reference< container::XNameAccess > ;
        *pxXStyleFamilies = new SwXStyleFamilies(*pDocShell);
    }
    return *pxXStyleFamilies;
}
/*-- 22.01.99 10:18:03---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< drawing::XDrawPage >  SwXTextDocument::getDrawPage(void) throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(!IsValid())
        throw RuntimeException();
    if(!pxXDrawPage)
    {
        ((SwXTextDocument*)this)->pxXDrawPage = new Reference< drawing::XDrawPage > ;
        ((SwXTextDocument*)this)->pDrawPage = new SwXDrawPage(pDocShell->GetDoc());
        Reference< drawing::XShapes >  xTmp = pDrawPage;
        *pxXDrawPage = Reference< drawing::XDrawPage>(xTmp, UNO_QUERY);
    }
    return *pxXDrawPage;
}
/* -----------------07.04.99 10:11-------------------
 *
 * --------------------------------------------------*/
SwXDrawPage* SwXTextDocument::GetDrawPage()
{
    if(!IsValid())
        return 0;
    if(!pDrawPage)
        getDrawPage();
    return pDrawPage;
}
/*-- 18.12.98 11:55:26---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXTextDocument::Invalidate()
{
    bObjectValid = sal_False;
    if(xNumFmtAgg.is())
    {
        const uno::Type& rTunnelType = ::getCppuType((Reference< XUnoTunnel > *)0);
        Any aNumTunnel = xNumFmtAgg->queryAggregation(rTunnelType);
        SvNumberFormatsSupplierObj* pNumFmt = 0;
        if(aNumTunnel.getValueType() == rTunnelType)
        {
            Reference< XUnoTunnel > xNumTunnel = *(Reference< XUnoTunnel >*)
                aNumTunnel.getValue();
            pNumFmt = (SvNumberFormatsSupplierObj*)
                    xNumTunnel->getSomething(SvNumberFormatsSupplierObj::getUnoTunnelId());

        }
        DBG_ASSERT(pNumFmt, "No number formatter available");
        pNumFmt->SetNumberFormatter(0);
    }
    InitNewDoc();
    pDocShell = 0;
}
/* -----------------------------13.07.00 15:59--------------------------------

 ---------------------------------------------------------------------------*/
void SwXTextDocument::Reactivate(SwDocShell* pNewDocShell)
{
    if(pDocShell && pDocShell != pNewDocShell)
        Invalidate();
    pDocShell = pNewDocShell;
    bObjectValid = TRUE;
}
/*-- 18.12.98 11:55:26---------------------------------------------------

  -----------------------------------------------------------------------*/
void    SwXTextDocument::InitNewDoc()
{
    // zunaechst alle Collections invalidieren, dann Referenzen loeschen und Null setzen
    if(pxXTextTables)
    {
         container::XNameAccess* pTbls = pxXTextTables->get();
        ((SwXTextTables*)pTbls)->Invalidate();
        delete pxXTextTables;
        pxXTextTables = 0;
    }

    if(pxXTextFrames)
    {
         container::XNameAccess* pFrms = pxXTextFrames->get();
        ((SwXTextFrames*)pFrms)->Invalidate();
        delete pxXTextFrames;
        pxXTextFrames = 0;
    }

    if(pxXGraphicObjects)
    {
         container::XNameAccess* pFrms = pxXGraphicObjects->get();
        ((SwXTextGraphicObjects*)pFrms)->Invalidate();
        delete pxXGraphicObjects;
        pxXGraphicObjects = 0;
    }

    if(pxXEmbeddedObjects)
    {
     container::XNameAccess* pOLE = pxXEmbeddedObjects->get();
        ((SwXTextEmbeddedObjects*)pOLE)->Invalidate();
        delete pxXEmbeddedObjects;
        pxXEmbeddedObjects = 0;
    }

    if(xBodyText.is())
    {
        xBodyText = 0;
        pBodyText = 0;
    }

    if(xNumFmtAgg.is())
    {
        const uno::Type& rTunnelType = ::getCppuType((Reference< XUnoTunnel > *)0);
        Any aNumTunnel = xNumFmtAgg->queryAggregation(rTunnelType);
        SvNumberFormatsSupplierObj* pNumFmt = 0;
        if(aNumTunnel.getValueType() == rTunnelType)
        {
            Reference< XUnoTunnel > xNumTunnel = *(Reference< XUnoTunnel >*)
                aNumTunnel.getValue();
            pNumFmt = (SvNumberFormatsSupplierObj*)
                    xNumTunnel->getSomething(SvNumberFormatsSupplierObj::getUnoTunnelId());

        }
        DBG_ASSERT(pNumFmt, "No number formatter available");
        pNumFmt->SetNumberFormatter(0);
    }

    if(pxXTextFieldTypes)
    {
         container::XEnumerationAccess* pT = pxXTextFieldTypes->get();
        ((SwXTextFieldTypes*)pT)->Invalidate();
        delete pxXTextFieldTypes;
        pxXTextFieldTypes = 0;
    }

    if(pxXTextFieldMasters)
    {
         container::XNameAccess* pT = pxXTextFieldMasters->get();
        ((SwXTextFieldMasters*)pT)->Invalidate();
        delete pxXTextFieldMasters;
        pxXTextFieldMasters = 0;
    }

    if(pxXTextSections)
    {
         container::XNameAccess* pSect = pxXTextSections->get();
        ((SwXTextSections*)pSect)->Invalidate();
        delete pxXTextSections;
        pxXTextSections = 0;
    }

    if(pxXDrawPage)
    {
         drawing::XDrawPage* pxPage = pxXDrawPage->get();
        pDrawPage->Invalidate();
        delete pxXDrawPage;
        pxXDrawPage = 0;
    }

    if(pxXFootnotes)
    {
         container::XIndexAccess* pFtn = pxXFootnotes->get();
        ((SwXFootnotes*)pFtn)->Invalidate();
        delete pxXFootnotes;
        pxXFootnotes = 0;
    }

    if(pxXEndnotes)
    {
         container::XIndexAccess* pFtn = pxXEndnotes->get();
        ((SwXFootnotes*)pFtn)->Invalidate();
        delete pxXEndnotes;
        pxXEndnotes = 0;
    }

    if(pxXDocumentIndexes)
    {
         container::XIndexAccess* pIdxs = pxXDocumentIndexes->get();
        ((SwXDocumentIndexes*)pIdxs)->Invalidate();
        delete pxXDocumentIndexes;
        pxXDocumentIndexes = 0;
    }

    if(pxXStyleFamilies)
    {
         container::XNameAccess* pStyles = pxXStyleFamilies->get();
        ((SwXStyleFamilies*)pStyles)->Invalidate();
        delete pxXStyleFamilies;
        pxXStyleFamilies = 0;
    }

    if(pxXBookmarks)
    {
         container::XNameAccess* pBm = pxXBookmarks->get();
        ((SwXBookmarks*)pBm)->Invalidate();
        delete pxXBookmarks;
        pxXBookmarks = 0;
    }

    if(pxXChapterNumbering)
    {
         container::XIndexReplace* pCh = pxXChapterNumbering->get();
        ((SwXChapterNumbering*)pCh)->Invalidate();
        delete pxXChapterNumbering;
        pxXChapterNumbering = 0;
    }

    if(pxXFootnoteSettings)
    {
         XPropertySet* pFntSet = pxXFootnoteSettings->get();
        ((SwXFootnoteProperties*)pFntSet)->Invalidate();
        delete pxXFootnoteSettings;
        pxXFootnoteSettings = 0;
    }

    if(pxXEndnoteSettings)
    {
         XPropertySet* pEndSet = pxXEndnoteSettings->get();
        ((SwXEndnoteProperties*)pEndSet)->Invalidate();
        delete pxXEndnoteSettings;
        pxXEndnoteSettings = 0;
    }

    if(pxXLineNumberingProperties)
    {
         XPropertySet* pLine = pxXLineNumberingProperties->get();
        ((SwXLineNumberingProperties*)pLine)->Invalidate();
        delete pxXLineNumberingProperties;
        pxXLineNumberingProperties = 0;
    }
/*
    delete pxXTextOutlines;
    pxXTextOutlines = 0;
    sal_uInt16 nArrCount = aActionArr.Count();
    while( nArrCount )
    {
        UnoActionContext* pContext = aActionArr.GetObject(--nArrCount);
        pContext->InvalidateDocument();
        aActionArr.Remove(nArrCount);
        delete pContext;
    }
*/
    if(pxXReferenceMarks)
    {
         container::XNameAccess* pMarks = pxXReferenceMarks->get();
        ((SwXReferenceMarks*)pMarks)->Invalidate();
        delete pxXReferenceMarks;
        pxXReferenceMarks = 0;
    }
/*
    if(pxXRedlines)
    {
        XRedlines* pMarks = *pxXRedlines;
        ((SwXRedlines*)pMarks)->Invalidate();
        delete pxXRedlines;
        pxXRedlines = 0;
    }


*/
}

/*-- 11.03.99 11:51:40---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< XInterface >  SwXTextDocument::createInstance(const OUString& rServiceName)
                                        throw( Exception, RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(!IsValid())
        throw RuntimeException();
    Reference< XInterface >  xRet;
    sal_uInt16 nType = SwXServiceProvider::GetProviderType(rServiceName);
    if(nType != SW_SERVICE_INVALID)
    {
        xRet = SwXServiceProvider::MakeInstance(nType, pDocShell->GetDoc());
    }
    else
    {
        sal_uInt16 nTokenCount = rServiceName.getTokenCount('.');
        if(nTokenCount >= 4 &&
            rServiceName.getToken( 0, '.' ) == C2U("com") &&
            rServiceName.getToken( 1, '.' ) == C2U("sun") &&
            rServiceName.getToken( 2, '.' ) == C2U("star"))
        {
            OUString sCategory = rServiceName.getToken( 3, '.' );
            sal_Bool bShape = sCategory == C2U("drawing");
            if( bShape || sCategory == C2U("form"))
            {
                //hier den Draw - Service suchen
                Reference< XInterface >  xTmp = SvxFmMSFactory::createInstance(rServiceName);
                if(bShape)
                    xRet = *new SwXShape( xTmp );
                else
                    xRet = xTmp;
            }
        }
        else
            throw ServiceNotRegisteredException();
    }
    return xRet;
}
/*-- 11.03.99 11:51:40---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< XInterface >  SwXTextDocument::createInstanceWithArguments(
        const OUString& ServiceSpecifier,
        const Sequence< Any >& Arguments)
        throw( Exception, RuntimeException )
{
    Reference< XInterface >  xInt = createInstance(ServiceSpecifier);
    //die Any-Sequence dient zur Initialisierung von Objekten, die auf
    //Parameter zwingend angewiesen sind - bis jetzt haben wir das nicht
    return xInt;
}
/*-- 11.03.99 11:51:41---------------------------------------------------

  -----------------------------------------------------------------------*/
Sequence< OUString > SwXTextDocument::getAvailableServiceNames(void)
                                        throw( RuntimeException )
{
    Sequence< OUString > aRet =  SvxFmMSFactory::getAvailableServiceNames();
    Sequence< OUString > aOwn = SwXServiceProvider::GetAllServiceNames();
    return SvxFmMSFactory::concatServiceNames(aRet, aOwn);

}
/* -----------------18.03.99 11:36-------------------
 *
 * --------------------------------------------------*/
OUString SwXTextDocument::getImplementationName(void) throw( RuntimeException )
{
    return C2U("SwXTextDocument");
}
/* -----------------18.03.99 11:32-------------------
 *
 * --------------------------------------------------*/
sal_Bool SwXTextDocument::supportsService(const OUString& rServiceName) throw( RuntimeException )
{
    sal_Bool bRet = sal_False;
    if(rServiceName.equals(C2U("com.sun.star.text.TextDocument")))
        bRet = sal_True;
    else
    {
        Sequence< OUString > aNames =  SvxFmMSFactory::getAvailableServiceNames();
        OUString* pArray = aNames.getArray();
        for(int i = 0; i < aNames.getLength(); i++)
            if(pArray[i] == rServiceName)
            {
                bRet = sal_True;
                break;
            }
    }
    return bRet;
}
/* -----------------18.03.99 11:32-------------------
 *
 * --------------------------------------------------*/
Sequence< OUString > SwXTextDocument::getSupportedServiceNames(void) throw( RuntimeException )
{
    Sequence< OUString > aRet =  SvxFmMSFactory::getAvailableServiceNames();
    aRet.realloc(aRet.getLength() + 1);
    OUString* pArray = aRet.getArray();
    pArray[aRet.getLength() - 1] = C2U("com.sun.star.text.TextDocument");
    return aRet;
}
/* -----------------05.05.99 12:10-------------------
 *
 * --------------------------------------------------*/
Reference< container::XIndexAccess >  SwXTextDocument::getDocumentIndexes(void) throw( RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(!IsValid())
        throw RuntimeException();
    if(!pxXDocumentIndexes)
    {
        ((SwXTextDocument*)this)->pxXDocumentIndexes = new Reference< container::XIndexAccess > ;
        *pxXDocumentIndexes = new SwXDocumentIndexes(pDocShell->GetDoc());
    }
    return *pxXDocumentIndexes;
}

/*-- 10.05.99 13:58:58---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< XPropertySetInfo >  SwXTextDocument::getPropertySetInfo(void) throw( RuntimeException )
{
    static Reference< XPropertySetInfo >  xRet = aPropSet.getPropertySetInfo();
    return xRet;
}
/*-- 10.05.99 13:58:58---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXTextDocument::setPropertyValue(const OUString& rPropertyName,
    const Any& aValue)
    throw( UnknownPropertyException, PropertyVetoException, IllegalArgumentException,
                                         WrappedTargetException, RuntimeException)
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(!IsValid())
        throw RuntimeException();
    const SfxItemPropertyMap*   pMap = SfxItemPropertyMap::GetByName(
                                    aPropSet.getPropertyMap(), rPropertyName);

    if(!pMap)
        throw UnknownPropertyException();
    switch(pMap->nWID)
    {
        case  WID_DOC_CHAR_COUNT     :
        case  WID_DOC_PARA_COUNT     :
        case  WID_DOC_WORD_COUNT     :
            throw RuntimeException();
        break;
        case  WID_DOC_WORD_SEPARATOR :
        {
            OUString sDelim;
            aValue >>= sDelim;
            SW_MOD()->GetModuleConfig()->SetWordDelimiter(sDelim);
        }
        break;
        case WID_DOC_CHANGES_RECORD:
        case WID_DOC_CHANGES_SHOW:
        {
            sal_Bool bSet = *(sal_Bool*)aValue.getValue();
            sal_uInt16 eMode = pDocShell->GetDoc()->GetRedlineMode();
            if(WID_DOC_CHANGES_SHOW == pMap->nWID)
            {
                eMode &= ~(REDLINE_SHOW_INSERT | REDLINE_SHOW_DELETE);
                eMode |= REDLINE_SHOW_INSERT;
                if( bSet )
                    eMode |= REDLINE_SHOW_DELETE;
            }
            else if(WID_DOC_CHANGES_RECORD == pMap->nWID)
            {
                eMode = bSet ? eMode|REDLINE_ON : eMode&~REDLINE_ON;
            }
            pDocShell->GetDoc()->SetRedlineMode( eMode );
        }
        break;
        case WID_DOC_AUTO_MARK_URL :
        {
            OUString sURL;
            aValue >>= sURL;
            pDocShell->GetDoc()->SetTOIAutoMarkURL(sURL);
        }
        break;
        default:
        {
            const SfxPoolItem& rItem = pDocShell->GetDoc()->GetDefault(pMap->nWID);
            SfxPoolItem* pNewItem = rItem.Clone();
            pNewItem->PutValue(aValue, pMap->nMemberId);
            pDocShell->GetDoc()->SetDefault(*pNewItem);
            delete pNewItem;
        }
    }
}
/*-- 10.05.99 13:58:59---------------------------------------------------

  -----------------------------------------------------------------------*/
Any SwXTextDocument::getPropertyValue(const OUString& rPropertyName)
    throw( UnknownPropertyException, WrappedTargetException, RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(!IsValid())
        throw RuntimeException();
    const SfxItemPropertyMap*   pMap = SfxItemPropertyMap::GetByName(
                                    aPropSet.getPropertyMap(), rPropertyName);

    if(!pMap)
        throw UnknownPropertyException();
    Any aAny;
    switch(pMap->nWID)
    {
        case  WID_DOC_CHAR_COUNT     :
        case  WID_DOC_PARA_COUNT     :
        case  WID_DOC_WORD_COUNT     :
        {
            SwDocStat aStat(pDocShell->GetDoc()->GetDocStat());
            if(aStat.bModified)
                pDocShell->GetDoc()->UpdateDocStat( aStat, 1 );
            sal_Int32 nValue;
            switch(pMap->nWID)
            {
                case  WID_DOC_CHAR_COUNT     :nValue = aStat.nChar;break;
                case  WID_DOC_PARA_COUNT     :nValue = aStat.nPara;break;
                case  WID_DOC_WORD_COUNT     :nValue = aStat.nWord;break;
            }
            aAny <<= nValue;
        }
        break;
        case  WID_DOC_WORD_SEPARATOR :
        {
            aAny <<= OUString(SW_MOD()->GetDocStatWordDelim());
        }
        break;
        case WID_DOC_CHANGES_RECORD:
        case WID_DOC_CHANGES_SHOW:
        {
            sal_uInt16 eMode = pDocShell->GetDoc()->GetRedlineMode();
            sal_Bool bSet = sal_False;
            if(WID_DOC_CHANGES_SHOW == pMap->nWID)
            {
                sal_uInt16 nMask = REDLINE_SHOW_INSERT | REDLINE_SHOW_DELETE;
                bSet = (eMode & nMask) == nMask;
            }
            else if(WID_DOC_CHANGES_RECORD == pMap->nWID)
            {
                bSet = (eMode& REDLINE_ON)  != 0;
            }
            aAny.setValue(&bSet, ::getBooleanCppuType());
        }
        break;
        case WID_DOC_AUTO_MARK_URL :
            aAny <<= OUString(pDocShell->GetDoc()->GetTOIAutoMarkURL());
        break;
        default:
        {
            const SfxPoolItem& rItem = pDocShell->GetDoc()->GetDefault(pMap->nWID);
            rItem.QueryValue(aAny, pMap->nMemberId);
        }

    }
    return aAny;
}
/*-- 10.05.99 13:58:59---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXTextDocument::addPropertyChangeListener(const OUString& PropertyName,
    const Reference< XPropertyChangeListener > & aListener)
    throw( UnknownPropertyException, WrappedTargetException, RuntimeException )
{
    DBG_WARNING("not implemented")
}
/*-- 10.05.99 13:58:59---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXTextDocument::removePropertyChangeListener(const OUString& PropertyName,
    const Reference< XPropertyChangeListener > & aListener)
    throw( UnknownPropertyException, WrappedTargetException, RuntimeException )
{
    DBG_WARNING("not implemented")
}
/*-- 10.05.99 13:59:00---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXTextDocument::addVetoableChangeListener(const OUString& PropertyName,
    const Reference< XVetoableChangeListener > & aListener)
    throw( UnknownPropertyException, WrappedTargetException, RuntimeException )
{
    DBG_WARNING("not implemented")
}
/*-- 10.05.99 13:59:00---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXTextDocument::removeVetoableChangeListener(const OUString& PropertyName,
                        const Reference< XVetoableChangeListener > & aListener)
    throw( UnknownPropertyException, WrappedTargetException, RuntimeException )
{
    DBG_WARNING("not implemented")
}
/* -----------------25.10.99 10:42-------------------

 --------------------------------------------------*/
Reference< container::XNameAccess >  SwXTextDocument::getLinks(void) throw( RuntimeException )
{
    if(!pxLinkTargetSupplier)
    {
        ((SwXTextDocument*)this)->pxLinkTargetSupplier = new Reference< container::XNameAccess > ;
        (*pxLinkTargetSupplier) = new SwXLinkTargetSupplier(*(SwXTextDocument*)this);
    }
    return (*pxLinkTargetSupplier);
}

/*-- 21.02.00 08:41:06---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXTextDocument::refresh(void) throw( RuntimeException )
{
    if(!IsValid())
        throw RuntimeException();
    SwWrtShell *pWrtShell = pDocShell->GetWrtShell();
    if(pWrtShell)
        pWrtShell->CalcLayout();
}
/*-- 21.02.00 08:41:06---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXTextDocument::addRefreshListener(const Reference< util::XRefreshListener > & l)
    throw( RuntimeException )
{
    DBG_WARNING("not implemented")
}
/*-- 21.02.00 08:41:07---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXTextDocument::removeRefreshListener(const Reference< util::XRefreshListener > & l)
    throw( RuntimeException )
{
    DBG_WARNING("not implemented")
}
/* -----------------------------20.06.00 09:54--------------------------------

 ---------------------------------------------------------------------------*/
void * SAL_CALL SwXTextDocument::operator new( size_t t) throw()
{
    return SwXTextDocumentBaseClass::operator new(t);
}
/* -----------------------------20.06.00 09:54--------------------------------

 ---------------------------------------------------------------------------*/
void SAL_CALL SwXTextDocument::operator delete( void * p) throw()
{
    SwXTextDocumentBaseClass::operator delete(p);
}
/* -----------------25.10.99 11:06-------------------

 --------------------------------------------------*/
SwXLinkTargetSupplier::SwXLinkTargetSupplier(SwXTextDocument& rxDoc) :
    pxDoc(&rxDoc)
{
    sTables     = String(SW_RES(STR_CONTENT_TYPE_TABLE));
    sFrames     = String(SW_RES(STR_CONTENT_TYPE_FRAME));
    sGraphics   = String(SW_RES(STR_CONTENT_TYPE_GRAPHIC));
    sOLEs       = String(SW_RES(STR_CONTENT_TYPE_OLE));
    sSections   = String(SW_RES(STR_CONTENT_TYPE_REGION));
    sOutlines   = String(SW_RES(STR_CONTENT_TYPE_OUTLINE));
    sBookmarks  = String(SW_RES(STR_CONTENT_TYPE_BOOKMARK));
}
/* -----------------25.10.99 11:11-------------------

 --------------------------------------------------*/
SwXLinkTargetSupplier::~SwXLinkTargetSupplier()
{
}

/*-- 25.10.99 11:12:45---------------------------------------------------

  -----------------------------------------------------------------------*/
Any SwXLinkTargetSupplier::getByName(const OUString& rName)
    throw( container::NoSuchElementException, WrappedTargetException, RuntimeException )
{
    Any aRet;
    if(!pxDoc)
        throw RuntimeException();
    String sToCompare(rName);
    String sSuffix('|');
    if(sToCompare == sTables)
    {
        sSuffix += UniString::CreateFromAscii(pMarkToTable);

        Reference< container::XNameAccess >  xTbls = new SwXLinkNameAccessWrapper(
                                        pxDoc->getTextTables(), sToCompare, sSuffix );
        Reference< XPropertySet >  xRet(xTbls, UNO_QUERY);
        aRet.setValue(&xRet, ::getCppuType((Reference<XPropertySet>*)0));
    }
    else if(sToCompare == sFrames)
    {
        sSuffix += UniString::CreateFromAscii(pMarkToFrame);
        Reference< container::XNameAccess >  xTbls = new SwXLinkNameAccessWrapper(
                                        pxDoc->getTextFrames(), sToCompare, sSuffix );
        Reference< XPropertySet >  xRet(xTbls, UNO_QUERY);
        aRet.setValue(&xRet, ::getCppuType((Reference< XPropertySet>*)0));
    }
    else if(sToCompare == sSections)
    {
        sSuffix += UniString::CreateFromAscii(pMarkToRegion);
        Reference< container::XNameAccess >  xTbls = new SwXLinkNameAccessWrapper(
                                        pxDoc->getTextSections(), sToCompare, sSuffix );
        Reference< XPropertySet >  xRet(xTbls, UNO_QUERY);
        aRet.setValue(&xRet, ::getCppuType((Reference< XPropertySet>*)0));
    }
/*  else if(sToCompare == )
    {
        sSuffix += UniString::CreateFromAscii(pMarkToText);
        Reference< container::XNameAccess >  xTbls = new SwXLinkNameAccessWrapper(
                                        pxDoc->, sSuffix );
        Reference< XPropertySet >  xRet(xTbls, UNO_QUERY);
        aRet.setValue(&xRet, ::getCppuType((const XPropertySet*)0));
    }*/
    else if(sToCompare == sGraphics)
    {
        sSuffix += UniString::CreateFromAscii(pMarkToGraphic);
        Reference< container::XNameAccess >  xTbls = new SwXLinkNameAccessWrapper(
                                        pxDoc->getGraphicObjects(), sToCompare, sSuffix );
        Reference< XPropertySet >  xRet(xTbls, UNO_QUERY);
        aRet.setValue(&xRet, ::getCppuType((Reference< XPropertySet>*)0));
    }
    else if(sToCompare == sOLEs)
    {
        sSuffix += UniString::CreateFromAscii(pMarkToOLE);
        Reference< container::XNameAccess >  xTbls = new SwXLinkNameAccessWrapper(
                                        pxDoc->getEmbeddedObjects(), sToCompare, sSuffix );
        Reference< XPropertySet >  xRet(xTbls, UNO_QUERY);
        aRet.setValue(&xRet, ::getCppuType((Reference< XPropertySet>*)0));
    }
    else if(sToCompare == sOutlines)
    {
        sSuffix += UniString::CreateFromAscii(pMarkToOutline);
        Reference< container::XNameAccess >  xTbls = new SwXLinkNameAccessWrapper(
                                        *pxDoc, sToCompare, sSuffix );
        Reference< XPropertySet >  xRet(xTbls, UNO_QUERY);
        aRet.setValue(&xRet, ::getCppuType((Reference< XPropertySet>*)0));
    }
    else if(sToCompare == sBookmarks)
    {
        sSuffix.Erase();
        Reference< container::XNameAccess >  xBkms = new SwXLinkNameAccessWrapper(
                                        pxDoc->getBookmarks(), sToCompare, sSuffix );
        Reference< XPropertySet >  xRet(xBkms, UNO_QUERY);
        aRet.setValue(&xRet, ::getCppuType((Reference< XPropertySet>*)0));
    }
    else
        throw container::NoSuchElementException();
    return aRet;
}
/*-- 25.10.99 11:12:46---------------------------------------------------

  -----------------------------------------------------------------------*/
Sequence< OUString > SwXLinkTargetSupplier::getElementNames(void)
                                        throw( RuntimeException )
{
    Sequence< OUString > aRet(7);
    OUString* pNames = aRet.getArray();
    pNames[0] = sTables;
    pNames[1] = sFrames  ;
    pNames[2] = sGraphics;
    pNames[3] = sOLEs   ;
    pNames[4] = sSections;
    pNames[5] = sOutlines;
    pNames[6] = sBookmarks;
    return aRet;
}
/*-- 25.10.99 11:12:46---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Bool SwXLinkTargetSupplier::hasByName(const OUString& rName)
                                    throw( RuntimeException )
{
    String sToCompare(rName);
    if( sToCompare == sTables  ||
        sToCompare == sFrames  ||
        sToCompare == sGraphics||
        sToCompare == sOLEs   ||
        sToCompare == sSections ||
        sToCompare == sOutlines ||
        sToCompare == sBookmarks    )
        return sal_True;
    return sal_False;
}
/*-- 25.10.99 11:12:47---------------------------------------------------

  -----------------------------------------------------------------------*/
uno::Type  SwXLinkTargetSupplier::getElementType(void)
                                    throw( RuntimeException )
{
    return ::getCppuType((Reference< XPropertySet>*)0);

}
/*-- 25.10.99 11:12:47---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Bool SwXLinkTargetSupplier::hasElements(void) throw( RuntimeException )
{
    return 0 != pxDoc;
}
/*-- 25.10.99 11:12:47---------------------------------------------------

  -----------------------------------------------------------------------*/
OUString SwXLinkTargetSupplier::getImplementationName(void) throw( RuntimeException )
{
    return C2U("SwXLinkTargetSupplier");
}
/*-- 25.10.99 11:12:48---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Bool SwXLinkTargetSupplier::supportsService(const OUString& rServiceName)
                                                throw( RuntimeException )
{
    return (rServiceName == C2U("com.sun.star.document.LinkTargets"));
}
/*-- 25.10.99 11:12:48---------------------------------------------------

  -----------------------------------------------------------------------*/
Sequence< OUString > SwXLinkTargetSupplier::getSupportedServiceNames(void)
                                                throw( RuntimeException )
{
    Sequence< OUString > aRet(1);
    OUString* pNames = aRet.getArray();
    pNames[0] = C2U("com.sun.star.document.LinkTargets");
    return aRet;
}

/*-- 26.10.99 09:16:23---------------------------------------------------

  -----------------------------------------------------------------------*/
SwXLinkNameAccessWrapper::SwXLinkNameAccessWrapper(
            Reference< container::XNameAccess >  xAccess, const String& rLinkDisplayName, String sSuffix ) :
    aPropSet(aSwMapProvider.GetPropertyMap(PROPERTY_MAP_LINK_TARGET)),
    sLinkDisplayName(rLinkDisplayName),
    xRealAccess(xAccess),
    sLinkSuffix(sSuffix),
    pxDoc(0)
{
}
/* -----------------26.10.99 14:17-------------------

 --------------------------------------------------*/
SwXLinkNameAccessWrapper::SwXLinkNameAccessWrapper(SwXTextDocument& rxDoc,
            const String& rLinkDisplayName, String sSuffix) :
    sLinkSuffix(sSuffix),
    sLinkDisplayName(rLinkDisplayName),
    aPropSet(aSwMapProvider.GetPropertyMap(PROPERTY_MAP_LINK_TARGET)),
    pxDoc(&rxDoc),
    xDoc(&rxDoc)
{
}
/*-- 26.10.99 09:16:23---------------------------------------------------

  -----------------------------------------------------------------------*/
SwXLinkNameAccessWrapper::~SwXLinkNameAccessWrapper()
{
}
/*-- 26.10.99 09:16:24---------------------------------------------------

  -----------------------------------------------------------------------*/
Any SwXLinkNameAccessWrapper::getByName(const OUString& rName)
    throw( container::NoSuchElementException, WrappedTargetException, RuntimeException )
{
    Any aRet;
    sal_Bool bFound = sal_False;
    //cut link extension and call the real NameAccess
    String sParam = rName;
    String sSuffix(sLinkSuffix);
    if(sParam.Len() > sSuffix.Len() )
    {
        String sCmp = sParam.Copy(sParam.Len() - sSuffix.Len(),
                                                    sSuffix.Len());
        if(sCmp == sSuffix)
        {
            if(pxDoc)
            {
                sParam = sParam.Copy(0, sParam.Len() - sSuffix.Len());
                if(!pxDoc->GetDocShell())
                    throw RuntimeException();
                SwDoc* pDoc = pxDoc->GetDocShell()->GetDoc();
                sal_uInt16 nOutlineCount = pDoc->GetNodes().GetOutLineNds().Count();

                for (sal_uInt16 i = 0; i < nOutlineCount && !bFound; ++i)
                {
                    const SwNodes& rNds = pDoc->GetNodes();
                    if(sParam ==
                        rNds.GetOutLineNds()[ i ]->GetTxtNode()->GetExpandTxt( 0, STRING_LEN, sal_True ))
                    {
                        Reference< XPropertySet >  xOutline = new SwXOutlineTarget(sParam);
                        aRet.setValue(&xOutline, ::getCppuType((Reference<XPropertySet>*)0));
                        bFound = sal_True;
                    }
                }
            }
            else
            {
                aRet = xRealAccess->getByName(sParam.Copy(0, sParam.Len() - sSuffix.Len()));
                Reference< XInterface > * pxInt = (Reference< XInterface > *)aRet.getValue();
                if(!pxInt)
                    throw RuntimeException();
                Reference< XPropertySet >  xProp((*pxInt), UNO_QUERY);
                aRet.setValue(&xProp, ::getCppuType((Reference<XPropertySet>*)0));
                bFound = sal_True;
            }
        }
    }
    if(!bFound)
        throw container::NoSuchElementException();
    return aRet;
}
/*-- 26.10.99 09:16:24---------------------------------------------------

  -----------------------------------------------------------------------*/
Sequence< OUString > SwXLinkNameAccessWrapper::getElementNames(void)
                                    throw( RuntimeException )
{
    Sequence< OUString > aRet;
    if(pxDoc)
    {
        if(!pxDoc->GetDocShell())
            throw RuntimeException();

        SwDoc* pDoc = pxDoc->GetDocShell()->GetDoc();
        sal_uInt16 nOutlineCount = pDoc->GetNodes().GetOutLineNds().Count();
        aRet.realloc(nOutlineCount);
        OUString* pResArr = aRet.getArray();
        String sSuffix('|');
        sSuffix += UniString::CreateFromAscii(pMarkToOutline);
        for (sal_uInt16 i = 0; i < nOutlineCount; ++i)
        {
            const SwNodes& rNds = pDoc->GetNodes();
            String sEntry(
                rNds.GetOutLineNds()[ i ]->GetTxtNode()->GetExpandTxt( 0, STRING_LEN, sal_True ));
            sEntry += sSuffix;
            pResArr[i] = sEntry;
        }
    }
    else
    {
        Sequence< OUString > aOrg = xRealAccess->getElementNames();
        const OUString* pOrgArr = aOrg.getConstArray();
        aRet.realloc(aOrg.getLength());
        OUString* pResArr = aRet.getArray();
        for(long i = 0; i < aOrg.getLength(); i++)
        {
            pResArr[i] = pOrgArr[i] + sLinkSuffix;
        }
    }
    return aRet;
}
/*-- 26.10.99 09:16:25---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Bool SwXLinkNameAccessWrapper::hasByName(const OUString& rName)
    throw( RuntimeException )
{
    sal_Bool bRet = sal_False;
    String sParam(rName);
    if(sParam.Len() > sLinkSuffix.Len() )
    {
        String sCmp = sParam.Copy(sParam.Len() - sLinkSuffix.Len(),
                                                    sLinkSuffix.Len());
        if(sCmp == sLinkSuffix)
        {
                sParam = sParam.Copy(0, sParam.Len() - sLinkSuffix.Len());
            if(pxDoc)
            {
                if(!pxDoc->GetDocShell())
                    throw RuntimeException();
                SwDoc* pDoc = pxDoc->GetDocShell()->GetDoc();
                sal_uInt16 nOutlineCount = pDoc->GetNodes().GetOutLineNds().Count();

                for (sal_uInt16 i = 0; i < nOutlineCount && !bRet; ++i)
                {
                    const SwNodes& rNds = pDoc->GetNodes();
                    if(sParam ==
                        rNds.GetOutLineNds()[ i ]->GetTxtNode()->GetExpandTxt( 0, STRING_LEN, sal_True ))
                    {
                        bRet = sal_True;
                    }
                }
            }
            else
            {
                bRet = xRealAccess->hasByName(sParam);
            }
        }
    }
    return bRet;
}
/*-- 26.10.99 09:16:25---------------------------------------------------

  -----------------------------------------------------------------------*/
uno::Type  SwXLinkNameAccessWrapper::getElementType(void)
                                throw( RuntimeException )
{
    return ::getCppuType((Reference<XPropertySet>*)0);
}
/*-- 26.10.99 09:16:25---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Bool SwXLinkNameAccessWrapper::hasElements(void) throw( RuntimeException )
{
    sal_Bool bRet = sal_False;
    if(pxDoc)
    {
        DBG_ERROR("not implemented")
    }
    else
    {
        bRet = xRealAccess->hasElements();
    }
    return bRet;
}
/*-- 26.10.99 09:16:26---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< XPropertySetInfo >  SwXLinkNameAccessWrapper::getPropertySetInfo(void)
                                        throw( RuntimeException )
{
    static Reference< XPropertySetInfo >  xRet = aPropSet.getPropertySetInfo();
    return xRet;
}
/*-- 26.10.99 09:16:26---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXLinkNameAccessWrapper::setPropertyValue(
    const OUString& PropertyName, const Any& aValue)
    throw( UnknownPropertyException,
            PropertyVetoException,
            IllegalArgumentException,
             WrappedTargetException,
            RuntimeException)
{
    throw UnknownPropertyException();
}
/* -----------------------------08.12.99 11:10--------------------------------

 ---------------------------------------------------------------------------*/
Any lcl_GetDisplayBitmap(String sLinkSuffix)
{
    Any aRet;
    if(sLinkSuffix.Len())
        sLinkSuffix.Erase(0, 1);
    sal_uInt16 nImgId = USHRT_MAX;

    if(COMPARE_EQUAL == sLinkSuffix.CompareToAscii(pMarkToOutline))
        nImgId = CONTENT_TYPE_OUTLINE;
    else if(COMPARE_EQUAL  == sLinkSuffix.CompareToAscii(pMarkToTable))
        nImgId = CONTENT_TYPE_TABLE;
    else if(COMPARE_EQUAL  == sLinkSuffix.CompareToAscii(pMarkToFrame))
        nImgId = CONTENT_TYPE_FRAME;
    else if(COMPARE_EQUAL  == sLinkSuffix.CompareToAscii(pMarkToGraphic))
        nImgId = CONTENT_TYPE_GRAPHIC;
//  else if(== sLinkSuffix)
//      nImgId = CONTENT_TYPE_BOOKMARK;
    else if(COMPARE_EQUAL  == sLinkSuffix.CompareToAscii(pMarkToRegion))
        nImgId = CONTENT_TYPE_REGION;
    else if(COMPARE_EQUAL == sLinkSuffix.CompareToAscii(pMarkToOLE))
        nImgId = CONTENT_TYPE_OLE;
    else if(!sLinkSuffix.Len())
        nImgId = CONTENT_TYPE_BOOKMARK;
    if(USHRT_MAX != nImgId)
    {
        nImgId += 20000;
        ImageList aEntryImages( SW_RES(IMG_NAVI_ENTRYBMP) );
        const Image& rImage = aEntryImages.GetImage( nImgId );
         Size aSize = rImage.GetSizePixel();

        VirtualDevice aVDev;
        aVDev.SetOutputSizePixel( aSize );
        aVDev.DrawImage( Point(0,0), rImage );
        Bitmap aBitmap = aVDev.GetBitmap( Point(0,0), aSize );

        Reference<awt::XBitmap> xBmp = VCLUnoHelper::CreateBitmap( aBitmap );
        aRet.setValue( &xBmp, ::getCppuType((Reference<awt::XBitmap>*)0) );
    }
    return aRet;
}
/*-- 26.10.99 09:16:27---------------------------------------------------

  -----------------------------------------------------------------------*/
Any SwXLinkNameAccessWrapper::getPropertyValue(const OUString& rPropertyName)
    throw( UnknownPropertyException, WrappedTargetException, RuntimeException )
{
    Any aRet;
    if(rPropertyName == C2U(UNO_LINK_DISPLAY_NAME))
    {
        aRet <<= OUString(sLinkDisplayName);
    }
    else if(C2U(UNO_LINK_DISPLAY_BITMAP) == rPropertyName)
    {
        aRet = lcl_GetDisplayBitmap(sLinkSuffix);
    }
    else
        throw UnknownPropertyException();
    return aRet;
}
/*-- 26.10.99 09:16:27---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXLinkNameAccessWrapper::addPropertyChangeListener(
    const OUString& PropertyName, const Reference< XPropertyChangeListener > & aListener)
    throw( UnknownPropertyException, WrappedTargetException, RuntimeException )
{}
/*-- 26.10.99 09:16:28---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXLinkNameAccessWrapper::removePropertyChangeListener(
    const OUString& PropertyName, const Reference< XPropertyChangeListener > & aListener)
    throw( UnknownPropertyException, WrappedTargetException, RuntimeException )
{}
/*-- 26.10.99 09:16:28---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXLinkNameAccessWrapper::addVetoableChangeListener(
    const OUString& PropertyName, const Reference< XVetoableChangeListener > & aListener)
    throw( UnknownPropertyException, WrappedTargetException, RuntimeException )
{}
/*-- 26.10.99 09:16:29---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXLinkNameAccessWrapper::removeVetoableChangeListener(
    const OUString& PropertyName, const Reference< XVetoableChangeListener > & aListener)
    throw( UnknownPropertyException, WrappedTargetException, RuntimeException )
{}
/*-- 26.10.99 09:16:32---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< container::XNameAccess >  SwXLinkNameAccessWrapper::getLinks(void)
                                    throw( RuntimeException )
{
    return (SwXLinkNameAccessWrapper*)this;
}

/*-- 26.10.99 09:21:48---------------------------------------------------

  -----------------------------------------------------------------------*/
OUString SwXLinkNameAccessWrapper::getImplementationName(void) throw( RuntimeException )
{
    return C2U("SwXLinkNameAccessWrapper");
}
/*-- 26.10.99 09:21:48---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Bool SwXLinkNameAccessWrapper::supportsService(const OUString& rServiceName)
                                                    throw( RuntimeException )
{
    return (rServiceName == C2U("com.sun.star.document.LinkTargets"));
}
/*-- 26.10.99 09:21:48---------------------------------------------------

  -----------------------------------------------------------------------*/
Sequence< OUString > SwXLinkNameAccessWrapper::getSupportedServiceNames(void)
                                                    throw( RuntimeException )
{
    Sequence< OUString > aRet(1);
    OUString* pNames = aRet.getArray();
    pNames[0] = C2U("com.sun.star.document.LinkTargets");
    return aRet;
}
/* -----------------26.10.99 15:50-------------------

 --------------------------------------------------*/
SwXOutlineTarget::SwXOutlineTarget(const String& rOutlineText) :
    aPropSet(aSwMapProvider.GetPropertyMap(PROPERTY_MAP_LINK_TARGET)),
    sOutlineText(rOutlineText)
{
}
/*-- 26.10.99 15:51:45---------------------------------------------------

  -----------------------------------------------------------------------*/
SwXOutlineTarget::~SwXOutlineTarget()
{
}
/*-- 26.10.99 15:51:46---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< XPropertySetInfo >  SwXOutlineTarget::getPropertySetInfo(void) throw( RuntimeException )
{
    static Reference< XPropertySetInfo >  xRet = aPropSet.getPropertySetInfo();
    return xRet;
}
/*-- 26.10.99 15:51:46---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXOutlineTarget::setPropertyValue(
    const OUString& PropertyName, const Any& aValue)
    throw( UnknownPropertyException, PropertyVetoException,
         IllegalArgumentException, WrappedTargetException, RuntimeException)
{
    throw UnknownPropertyException();
}
/*-- 26.10.99 15:51:46---------------------------------------------------

  -----------------------------------------------------------------------*/
Any SwXOutlineTarget::getPropertyValue(const OUString& rPropertyName)
    throw( UnknownPropertyException, WrappedTargetException, RuntimeException )
{
    Any aRet;
    if(COMPARE_EQUAL == rPropertyName.compareToAscii(UNO_LINK_DISPLAY_NAME))
        aRet <<= OUString(sOutlineText);
    else
        throw UnknownPropertyException();
    return aRet;
}
/*-- 26.10.99 15:51:46---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXOutlineTarget::addPropertyChangeListener(
    const OUString& PropertyName, const Reference< XPropertyChangeListener > & aListener)
    throw( UnknownPropertyException, WrappedTargetException, RuntimeException )
{
}
/*-- 26.10.99 15:51:47---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXOutlineTarget::removePropertyChangeListener(
    const OUString& PropertyName, const Reference< XPropertyChangeListener > & aListener)
    throw( UnknownPropertyException, WrappedTargetException, RuntimeException )
{
}
/*-- 26.10.99 15:51:47---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXOutlineTarget::addVetoableChangeListener(
    const OUString& PropertyName, const Reference< XVetoableChangeListener > & aListener)
    throw( UnknownPropertyException, WrappedTargetException, RuntimeException )
{
}
/*-- 26.10.99 15:51:47---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXOutlineTarget::removeVetoableChangeListener(
    const OUString& PropertyName, const Reference< XVetoableChangeListener > & aListener)
    throw( UnknownPropertyException, WrappedTargetException, RuntimeException )
{
}
/* -----------------03.05.99 12:28-------------------
 *
 * --------------------------------------------------*/
OUString SwXOutlineTarget::getImplementationName(void) throw( RuntimeException )
{
    return C2U("SwXOutlineTarget");
}
/* -----------------03.05.99 12:28-------------------
 *
 * --------------------------------------------------*/
sal_Bool SwXOutlineTarget::supportsService(const OUString& ServiceName) throw( RuntimeException )
{
    return C2U("com.sun.star.document.LinkTarget") == ServiceName;
}
/* -----------------03.05.99 12:28-------------------
 *
 * --------------------------------------------------*/
Sequence< OUString > SwXOutlineTarget::getSupportedServiceNames(void) throw( RuntimeException )
{
    Sequence < OUString > aRet(1);
    OUString* pArray = aRet.getArray();
    pArray[0] = C2U("com.sun.star.document.LinkTarget");

    return aRet;
}


/*------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.147  2000/09/18 16:06:16  willem.vandorp
    OpenOffice header added.

    Revision 1.146  2000/07/13 14:01:14  os
    set flag in reactivate

    Revision 1.145  2000/07/13 12:37:08  os
    new: SwXTextDocument::reactivate()

    Revision 1.144  2000/07/10 12:32:18  os
    chg: acquire/release don't throw exceptions

    Revision 1.143  2000/06/29 13:44:35  os
    getTypes: add XMultiServiceFactory

    Revision 1.142  2000/06/22 16:22:13  os
    #76361# getTypes corrected

    Revision 1.141  2000/06/20 08:06:00  os
    operator new/delete

    Revision 1.140  2000/06/16 13:48:13  os
    UNO3 errors removed

    Revision 1.139  2000/05/18 11:09:17  os
    UpdateDocStat: call optimized

    Revision 1.138  2000/05/16 09:15:14  os
    project usr removed

    Revision 1.137  2000/04/11 08:05:00  os
    UNICODE

    Revision 1.136  2000/03/31 06:05:50  os
    UNO III: toolkit includes

    Revision 1.135  2000/03/27 10:36:31  os
    UNO III

    Revision 1.134  2000/03/21 15:39:44  os
    UNOIII

    Revision 1.133  2000/03/13 14:31:57  os
    #73853# #73852# CharLocale instead of CharLanguage

    Revision 1.132  2000/02/21 07:54:39  os
    #73237# util::XRefreshable implemented

    Revision 1.131  2000/02/14 14:25:35  os
    #70473# Unicode

    Revision 1.130  2000/02/11 13:46:39  os
    #72210# SvxLanguageItem supports Locale

    Revision 1.129  2000/02/02 13:43:10  os
    #69861# Chg: XPropertyState; #72424# Chg: beans::PropertyValue

    Revision 1.128  2000/01/05 10:28:49  os
    #71466# Search: set cursor to the real start of document body

    Revision 1.127  1999/12/08 12:01:45  os
    #70284# show Bitmaps in hyperlink insert dialog

    Revision 1.126  1999/12/01 15:33:44  os
    #70173# enable search for hyperlink attribute

    Revision 1.125  1999/12/01 14:22:40  os
    #70174# search corrected

    Revision 1.124  1999/11/25 15:37:50  os
    headers corrected

    Revision 1.123  1999/11/22 10:37:38  os
    missing headers added

    Revision 1.122  1999/11/19 16:38:03  os
    modules renamed

    Revision 1.121  1999/11/03 10:25:32  os
    U2S!

    Revision 1.120  1999/11/02 11:05:18  os
    hyperlink interface completed

    Revision 1.119  1999/10/29 11:34:18  os
    support util::XModifiable

    Revision 1.118  1999/10/26 14:33:34  os
    LinkTargetSupplier

    Revision 1.117  1999/10/15 10:58:40  os
    Chg: XCntent- container::XChild

    Revision 1.116  1999/09/14 13:45:34  os
    Redlining properties

    Revision 1.115  1999/09/14 13:35:06  os
    Redlining properties; AutoMarkURL;

    Revision 1.114  1999/08/26 09:44:30  HR
    select/getSelection corrected


      Rev 1.113   26 Aug 1999 11:44:30   HR
   select/getSelection corrected

      Rev 1.112   26 Aug 1999 11:29:54   OS
   getSelection/select with Any

      Rev 1.111   18 Aug 1999 10:52:22   OS
   #67026# util::XModifiable now supported

      Rev 1.110   21 Jul 1999 13:30:24   JP
   WhichId-Ranges of SfxItemSets: EndId is inclusive

      Rev 1.109   20 Jul 1999 09:00:50   OS
   #67613# findNext: accept SwXTextRange

      Rev 1.108   07 Jul 1999 08:14:10   OS
   property map sorted

      Rev 1.107   24 Jun 1999 12:01:48   OS
   #66843# document statistic properties

      Rev 1.106   24 Jun 1999 09:20:06   OS
   #67048# util::XPropertyReplace implemented

      Rev 1.105   26 May 1999 08:01:54   OS
   #66180# Suche nach Styles

      Rev 1.104   10 May 1999 15:12:28   OS
   #66000# XPropertySet am Doc fuer util::Language

      Rev 1.103   07 May 1999 14:25:20   KZ
   numfrm -> numbform geaendert

      Rev 1.102   05 May 1999 14:07:06   OS
   #64655# DocumentIndexes wiederbelebt

      Rev 1.101   04 May 1999 10:54:40   OS
   #65415# getCurrentSelection

      Rev 1.100   22 Apr 1999 16:09:04   OS
   #65194# throw -> throw

      Rev 1.99   22 Apr 1999 15:28:52   OS
   #65124# not implemented - nur noch DBG_WARNING

      Rev 1.98   07 Apr 1999 12:36:10   OS
   #62304# NumberFormatter erst im Dtor deaggregieren

      Rev 1.97   07 Apr 1999 11:27:28   OS
   #62304# neues NumberFormatter - Object

      Rev 1.96   07 Apr 1999 10:26:30   OS
   #60348# richtiges Shape liefern

      Rev 1.95   25 Mar 1999 14:55:22   OS
   #62541# Exceptions fuer falsche Parameter bei setPagePrintSettings

      Rev 1.94   18 Mar 1999 12:35:50   OS
   #62984# neue Ableitung vom Svx

      Rev 1.93   15 Mar 1999 14:38:24   OS
   #62845# Makro fuer ServiceInfo jetzt auch fuer OS/2

      Rev 1.92   15 Mar 1999 11:35:40   OS
   #63370# Direktzugriff statt cast

      Rev 1.91   12 Mar 1999 09:57:04   OS
   #62845# XServiceInfo impl.


------------------------------------------------------------------------*/

diff --git a/sw/source/ui/uno/unotxvw.cxx b/sw/source/ui/uno/unotxvw.cxx
new file mode 100644
index 0000000..510512d
--- /dev/null
+++ b/sw/source/ui/uno/unotxvw.cxx
@@ -0,0 +1,1925 @@
/*************************************************************************
 *
 *  $RCSfile: unotxvw.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:49 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "viscrs.hxx"
#include <sfx2/frame.hxx>
#include <cmdid.h>
#include <hintids.hxx>
#ifndef _SWDOCSH_HXX //autogen
#include <docsh.hxx>
#endif
#ifndef _SWDOC_HXX //autogen
#include <doc.hxx>
#endif
#ifndef _UNOTXVW_HXX
#include <unotxvw.hxx>
#endif
#ifndef _UNOMAP_HXX
#include <unomap.hxx>
#endif
#ifndef _SWVIEW_HXX
#include <view.hxx>
#endif
#ifndef _UNOMOD_HXX
#include <unomod.hxx>
#endif
#ifndef _UNOFRAME_HXX
#include <unoframe.hxx>
#endif
#ifndef _UNOOBJ_HXX
#include <unoobj.hxx>
#endif
#ifndef _UNOCRSR_HXX
#include <unocrsr.hxx>
#endif
#ifndef _WRTSH_HXX //autogen
#include <wrtsh.hxx>
#endif
#ifndef _UNOTBL_HXX
#include <unotbl.hxx>
#endif
#ifndef _SVDVIEW_HXX //autogen
#include <svx/svdview.hxx>
#endif
#ifndef _SVDPAGE_HXX //autogen
#include <svx/svdpage.hxx>
#endif
#ifndef _SVDOUNO_HXX //autogen
#include <svx/svdouno.hxx>
#endif
#ifndef _SVDOGRP_HXX //autogen
#include <svx/svdogrp.hxx>
#endif
#ifndef _PAGEDESC_HXX //autogen
#include <pagedesc.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SVX_ULSPITEM_HXX //autogen
#include <svx/ulspitem.hxx>
#endif
#ifndef _SFX_BINDINGS_HXX //autogen
#include <sfx2/bindings.hxx>
#endif
#ifndef _SFXREQUEST_HXX //autogen
#include <sfx2/request.hxx>
#endif
#ifndef _FRMATR_HXX
#include <frmatr.hxx>
#endif
#ifndef _VOS_MUTEX_HXX_ //autogen
#include <vos/mutex.hxx>
#endif
#ifndef _BOOKMRK_HXX //autogen
#include <bookmrk.hxx>
#endif
#ifndef _UNOTXDOC_HXX //autogen
#include <unotxdoc.hxx>
#endif
#ifndef _UNODRAW_HXX //autogen
#include <unodraw.hxx>
#endif
#ifndef _SVX_UNOSHGRP_HXX //autogen
#include <svx/unoshcol.hxx>
#endif
#ifndef _SVX_UNOSHAPE_HXX //autogen wg. SvxShape
#include <svx/unoshape.hxx>
#endif
#ifndef _SVDPAGV_HXX //autogen wg. SdrPageView
#include <svx/svdpagv.hxx>
#endif
#include <swerror.h>
#ifndef _CACHESTR_HXX
#include <tools/cachestr.hxx>
#endif
#ifndef _SHELLIO_HXX
#include <shellio.hxx>
#endif
#ifndef _NDTXT_HXX
#include <ndtxt.hxx>
#endif

using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::text;
using namespace rtl;

SV_IMPL_PTRARR( SelectionChangeListenerArr, XSelectionChangeListenerPtr );

/* -----------------22.05.98 12:20-------------------
 *
 * --------------------------------------------------*/
SwPaM* lcl_createPamCopy(const SwPaM& rPam)
{
    SwPaM* pRet = new SwPaM(*rPam.GetPoint());
    if(rPam.HasMark())
    {
        pRet->SetMark();
        *pRet->GetMark() = *rPam.GetMark();
    }
    if(rPam.GetNext() != (const Ring*)&rPam)
    {
        SwPaM *_pStartCrsr = (SwPaM *)rPam.GetNext();
        do
        {
            //neuen PaM erzeugen
            SwPaM* pPaM = new SwPaM(*_pStartCrsr);
            //und in den Ring einfuegen
            pPaM->MoveTo(pRet);

        } while( (_pStartCrsr=(SwPaM *)_pStartCrsr->GetNext()) != rPam.GetNext() );
    }
    return pRet;
}
/* -----------------04.11.98 15:32-------------------
 *
 * --------------------------------------------------*/
sal_Bool lcl_FindObjInGroup(uno::Reference< awt::XControl > & xRet, SdrObjGroup* pGroup, const Reference< awt::XControlModel > & xModel, Window* pWin)
{
    SdrObjList* pList = pGroup->GetSubList();
    sal_uInt32 nCount = pList->GetObjCount();
    for( sal_uInt32 i=0; i< nCount; i++ )
    {
        SdrObject* pObj = pList->GetObj(i);
        SdrUnoObj *pFormObj = PTR_CAST( SdrUnoObj, pObj );
        SdrObjGroup* pGroup;
        if( pFormObj )
        {
            Reference< awt::XControlModel >  xCM = pFormObj->GetUnoControlModel();
            if( xCM.is() && xModel == xCM )
            {
                xRet = pFormObj->GetUnoControl( pWin );
                break;
            }
        }
        else if(0 != (pGroup = PTR_CAST( SdrObjGroup, pObj )))
        {
            if(lcl_FindObjInGroup(xRet, pGroup, xModel, pWin))
                break;
        }
    }
    return xRet.is();
}

/******************************************************************
 * SwXTextView
 ******************************************************************/
/*-- 17.12.98 09:34:25---------------------------------------------------

  -----------------------------------------------------------------------*/
SwXTextView::SwXTextView(SwView* pSwView) :
    SfxBaseController(pSwView),
    pView(pSwView),
    pxViewSettings(0),
    pxTextViewCursor(0)
{

}
/*-- 17.12.98 09:34:25---------------------------------------------------

  -----------------------------------------------------------------------*/
SwXTextView::~SwXTextView()
{
    if(pxViewSettings)
    {
         beans::XPropertySet* pSettings = pxViewSettings->get();
        ((SwXViewSettings*)pSettings)->Invalidate();
        delete pxViewSettings;
    }
    if(pxTextViewCursor)
    {
     text::XTextViewCursor* pCrsr = pxTextViewCursor->get();
        ((SwXTextViewCursor*)pCrsr)->Invalidate();
        delete pxTextViewCursor;
    }
}
/* -----------------------------18.05.00 10:18--------------------------------

 ---------------------------------------------------------------------------*/
Sequence< uno::Type > SAL_CALL SwXTextView::getTypes(  ) throw(::com::sun::star::uno::RuntimeException)
{
//  uno::Sequence< uno::Type > aViewTypes = SwXTextViewBaseClass::getTypes();
    uno::Sequence< uno::Type > aBaseTypes = SfxBaseController::getTypes();

    long nIndex = aBaseTypes.getLength();
    aBaseTypes.realloc(
        aBaseTypes.getLength() + 5 );

    uno::Type* pBaseTypes = aBaseTypes.getArray();
    pBaseTypes[nIndex++] = ::getCppuType((Reference<view::XSelectionSupplier    >*)0);
    pBaseTypes[nIndex++] = ::getCppuType((Reference<lang::XServiceInfo          >*)0);
    pBaseTypes[nIndex++] = ::getCppuType((Reference<view::XControlAccess        >*)0);
    pBaseTypes[nIndex++] = ::getCppuType((Reference<text::XTextViewCursorSupplier>*)0);
    pBaseTypes[nIndex++] = ::getCppuType((Reference<view::XViewSettingsSupplier >*)0);
    return aBaseTypes;
}
/* -----------------------------18.05.00 10:18--------------------------------

 ---------------------------------------------------------------------------*/
Sequence< sal_Int8 > SAL_CALL SwXTextView::getImplementationId(  ) throw(::com::sun::star::uno::RuntimeException)
{
    static uno::Sequence< sal_Int8 > aId( 16 );
    static BOOL bInit = FALSE;
    if(!bInit)
        rtl_createUuid( (sal_uInt8 *)aId.getArray(), 0, sal_True );
    return aId;
}
/* -----------------------------18.05.00 10:18--------------------------------

 ---------------------------------------------------------------------------*/
void SAL_CALL SwXTextView::acquire(  )throw()
{
    SfxBaseController::acquire();
}
/* -----------------------------18.05.00 10:18--------------------------------

 ---------------------------------------------------------------------------*/
void SAL_CALL SwXTextView::release(  )throw()
{
    SfxBaseController::release();
}
/* -----------------------------18.05.00 10:23--------------------------------

 ---------------------------------------------------------------------------*/
uno::Any SAL_CALL SwXTextView::queryInterface( const uno::Type& aType )
    throw (RuntimeException)
{
    uno::Any aRet;
    if(aType == ::getCppuType((Reference<view::XSelectionSupplier   >*)0))
    {
        Reference<view::XSelectionSupplier> xRet = this;
        aRet.setValue(&xRet, aType);
    }
    else if(aType == ::getCppuType((Reference<lang::XServiceInfo            >*)0))
    {
        Reference<lang::XServiceInfo> xRet = this;
        aRet.setValue(&xRet, aType);
    }
    else if(aType == ::getCppuType((Reference<view::XControlAccess      >*)0))
    {
        Reference<view::XControlAccess> xRet = this;
        aRet.setValue(&xRet, aType);
    }
    else if(aType == ::getCppuType((Reference<text::XTextViewCursorSupplier>*)0))
    {
        Reference<text::XTextViewCursorSupplier> xRet = this;
        aRet.setValue(&xRet, aType);
    }
    else if(aType == ::getCppuType((Reference<view::XViewSettingsSupplier   >*)0))
    {
        Reference<view::XViewSettingsSupplier> xRet = this;
        aRet.setValue(&xRet, aType);
    }
    else
        aRet = SfxBaseController::queryInterface(aType);
    return aRet;
}
/*-- 17.12.98 09:34:26---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Bool SwXTextView::select(const uno::Any& aInterface) throw( lang::IllegalArgumentException, uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(GetView() && aInterface.getValueType().getTypeClass() == uno::TypeClass_INTERFACE)
    {
        Reference< uno::XInterface >  xInterface = *(Reference< uno::XInterface > *)aInterface.getValue();
        SwWrtShell& rSh = GetView()->GetWrtShell();
        SwDoc* pDoc = GetView()->GetDocShell()->GetDoc();
        Reference< lang::XUnoTunnel >  xIfcTunnel(xInterface, uno::UNO_QUERY);
        Reference< text::XTextCursor >  xCrsr(xInterface, uno::UNO_QUERY);
        Reference< container::XIndexAccess >    xPosN(xInterface, uno::UNO_QUERY);
        Reference< text::XTextRange >   xPos(xInterface, uno::UNO_QUERY);

        SwPaM * pPam = 0;
        SwXTextRanges* pPosN = 0;
        if(xCrsr.is())
        {
            //
            SwXTextCursor* pCursor =
                xIfcTunnel.is() ?
                    (SwXTextCursor*)xIfcTunnel->getSomething(SwXTextCursor::getUnoTunnelId())
                    : 0;

            if(pCursor && pCursor->GetDoc() == GetView()->GetDocShell()->GetDoc())
                pPam = lcl_createPamCopy(*((SwXTextCursor*)pCursor)->GetPaM());

        }
        else if(xPosN.is() &&
            xIfcTunnel.is() &&
                0 != (pPosN = (SwXTextRanges*)xIfcTunnel->getSomething(SwXTextRanges::getUnoTunnelId())))
        {
            const SwUnoCrsr* pUnoCrsr = pPosN->GetCursor();
            if(pUnoCrsr)
            {
                pPam = lcl_createPamCopy(*pUnoCrsr);
            }
        }
        else if(xPos.is())
        {
            SwUnoInternalPaM aPam(*pDoc);
            if(SwXTextRange::XTextRangeToSwPaM(aPam, xPos))
            {
                pPam = lcl_createPamCopy(aPam);
            }
        }
        if(pPam)
        {
            rSh.EnterStdMode();
            rSh.SetSelection(*pPam);
            delete pPam;
            return sal_True;
        }
        Reference< uno::XInterface >  xFrm(xInterface, uno::UNO_QUERY);;

        if(xFrm.is())
        {
            //
            SwXFrame* pFrame = (SwXFrame*)
                xIfcTunnel->getSomething(SwXFrame::getUnoTunnelId());

            SwFrmFmt* pFrmFmt = pFrame ? pFrame->GetFrmFmt() : 0;
            if(pFrmFmt && pFrmFmt->GetDoc() == pDoc)
            {
                sal_Bool bSuccess = rSh.GotoFly( pFrmFmt->GetName(), pFrame->GetFlyCntType());
                if (bSuccess)
                {
                    rSh.HideCrsr();
                    rSh.EnterSelFrmMode();
                }
            }
            return sal_True;
        }

        Reference< text::XTextTable >  xTbl(xInterface, uno::UNO_QUERY);;

        if(xTbl.is())
        {
            SwXTextTable* pTable = (SwXTextTable*)
                xIfcTunnel->getSomething(SwXTextTable::getUnoTunnelId());

            SwFrmFmt* pTblFrmFmt = pTable ? ((SwXTextTable*)pTable)->GetFrmFmt() : 0;
            if(pTblFrmFmt &&pTblFrmFmt->GetDoc() == pDoc)
            {
                rSh.EnterStdMode();
                rSh.GotoTable(pTblFrmFmt->GetName());
            }
            return sal_True;
        }

        Reference< text::XTextContent >  xBkm(xInterface, uno::UNO_QUERY);;

        if(xBkm.is())
        {
            SwXBookmark* pBkm = (SwXBookmark*)
                    xIfcTunnel->getSomething(SwXBookmark::getUnoTunnelId());
            if(pBkm && pBkm->GetDoc() == pDoc)
            {

                sal_uInt16 nFndPos = rSh.FindBookmark(pBkm->getName());

                if( USHRT_MAX != nFndPos )
                {
                    rSh.EnterStdMode();
                    rSh.GotoBookmark( nFndPos );
                }
                return sal_True;
            }
        }
        // IndexMark, sdbcx::Index, TextField, Draw, Section, text::Footnote, text::Paragraph
        //

        Reference< drawing::XShapes >  xShapeColl( xInterface, uno::UNO_QUERY );
        Reference< beans::XPropertySet >  xTmpProp(xInterface, uno::UNO_QUERY);
        SwXShape* pSwXShape = (SwXShape*)
            xIfcTunnel->getSomething(SwXShape::getUnoTunnelId());
        SvxShape* pSvxShape = 0;
        if(pSwXShape)
        {
            Reference< uno::XAggregation >  xAgg = pSwXShape->GetAggregationInterface();
            if(xAgg.is())
            {
                pSvxShape = (SvxShape*)xIfcTunnel->getSomething(SvxShape::getUnoTunnelId());
            }
        }

        if ( pSvxShape || xShapeColl.is() )         // Drawing drawing::Layer
        {
            SdrView* pDrawView = rSh.GetDrawView();
            if (pDrawView)
            {
                pDrawView->EndTextEdit();
                pDrawView->UnmarkAll();

                if (pSvxShape)      // einzelnes Shape
                {
                    SdrObject *pObj = pSvxShape->GetSdrObject();
                    if (pObj)
                    {
//                      lcl_ShowObject( *pViewSh, *pDrawView, pObj );
                        SdrPageView* pPV = pDrawView->GetPageViewPvNum(0);
                        if ( pPV && pObj->GetPage() == pPV->GetPage() )
                        {
                            pDrawView->MarkObj( pObj, pPV );
                        }
                    }
                }
                else    // Shape Collection
                {
                    SdrPageView* pPV = NULL;
                    long nCount = xShapeColl->getCount();
                    for ( long i = 0; i < nCount; i++ )
                    {
                        Reference< drawing::XShape >  xShapeInt;
                        uno::Any aAny = xShapeColl->getByIndex(i);
                        if ( aAny.getValueType() == ::getCppuType((Reference<drawing::XShape>*)0))
                            xShapeInt = *((Reference< drawing::XShape > *) aAny.getValue());
                        if (xShapeInt.is())
                        {
                            Reference< lang::XUnoTunnel> xShapeTunnel(xShapeInt, uno::UNO_QUERY);

                            SvxShape* pShape = xShapeTunnel.is() ?
                                (SvxShape*)xShapeTunnel->getSomething(SvxShape::getUnoTunnelId()) : 0;

                            if (pShape)
                            {
                                SdrObject *pObj = pShape->GetSdrObject();
                                if (pObj)
                                {
                                    if (!pPV)               // erstes Objekt
                                    {
//                                      lcl_ShowObject( *pViewSh, *pDrawView, pObj );
                                        pPV = pDrawView->GetPageViewPvNum(0);
                                    }
                                    if ( pPV && pObj->GetPage() == pPV->GetPage() )
                                    {
                                        pDrawView->MarkObj( pObj, pPV );
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    return sal_False;

}
/*-- 17.12.98 09:34:26---------------------------------------------------

  -----------------------------------------------------------------------*/
uno::Any SwXTextView::getSelection(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    Reference< uno::XInterface >  aRef;
    SwView* pView = ((SwXTextView*)this)->GetView();
    if(pView)
    {
        // ein interface aus der aktuellen Selektion erzeugen
        SwWrtShell& rSh = pView->GetWrtShell();
        ShellModes  eSelMode = pView->GetShellMode();
        switch(eSelMode)
        {
            case SEL_TABLE_TEXT      :
            {
                if(rSh.GetTableCrsr())
                {
                    DBG_ASSERT(rSh.GetTableFmt(), "kein Tabellenformat?");
                    Reference< text::XTextTableCursor >  xCrsr = new SwXTextTableCursor(*rSh.GetTableFmt(),
                                                    rSh.GetTableCrsr());
                    aRef = Reference< uno::XInterface >  (xCrsr, uno::UNO_QUERY);;
                    break;
                }

            }
            // ohne Tabellenselektion wird der Text geliefert
            //break;
            case SEL_LIST_TEXT       :
            case SEL_TABLE_LIST_TEXT:
            case SEL_TEXT            :
            {
                Reference< container::XIndexAccess >  xPos = new SwXTextRanges(rSh.GetCrsr());
                aRef = Reference< uno::XInterface >(xPos, uno::UNO_QUERY);
            }
            break;
            case SEL_FRAME           :
            case SEL_GRAPHIC         :
            case SEL_OBJECT          :
            {
                //Get FlyFrameFormat; fuer UI Macro Anbindung an Flys
                const SwFrmFmt* pFmt = rSh.GetFlyFrmFmt();
                SwXFrame* pxFrame = (SwXFrame*)SwClientIter((SwFrmFmt&)*pFmt).
                                                First(TYPE(SwXFrame));

                if(pxFrame)                //das einzige gemeinsame interface fuer alle Frames
                {
                    aRef = Reference< uno::XInterface >((cppu::OWeakObject*)pxFrame, uno::UNO_QUERY);
                }
                else
                {
                    if(SEL_FRAME == eSelMode)
                    {
                        Reference< text::XTextFrame >  xFrm =  new SwXTextFrame((SwFrmFmt&)*pFmt);
                        aRef = Reference< uno::XInterface >(xFrm, uno::UNO_QUERY);
                    }
                    else if(SEL_GRAPHIC == eSelMode)
                    {
                        Reference< text::XTextContent >  xFrm = new SwXTextGraphicObject((SwFrmFmt&)*pFmt);
                        aRef = xFrm;
                    }
                    else
                    {
                        Reference< text::XTextContent >  xFrm =  new SwXTextEmbeddedObject((SwFrmFmt&)*pFmt);
                        aRef = xFrm;
                    }
                }
            }
            break;
            case SEL_DRAW            :
            case SEL_DRAW_CTRL       :
            case SEL_DRAW_FORM       :
            case SEL_DRAWTEXT        :
            case SEL_BEZIER          :
            {
                Reference< drawing::XDrawPageSupplier >  xPageSupp;
                Reference< frame::XModel > xModel = pView->GetDocShell()->GetBaseModel();
                Reference< lang::XUnoTunnel > xModelTunnel(xModel, uno::UNO_QUERY);
                SwXTextDocument* pTextDoc = (SwXTextDocument*)xModelTunnel->
                                getSomething(SwXTextDocument::getUnoTunnelId());

                SwFmDrawPage* pSvxDrawPage =    pTextDoc->GetDrawPage()->GetSvxPage();
                Reference< drawing::XShapes >  xShCol = new SvxShapeCollection();

                const SdrMarkList& rMarkList = rSh.GetDrawView()->GetMarkList();
                for(sal_uInt16 i = 0; i < rMarkList.GetMarkCount(); i++)
                {
                    SdrObject* pObj = rMarkList.GetMark(i)->GetObj();
                    Reference< uno::XInterface >  xInt = pSvxDrawPage->GetInterface( pObj );
                    Reference< drawing::XShape >  xShape(xInt, uno::UNO_QUERY);;
                    xShCol->add(xShape);
                }
                aRef = Reference< uno::XInterface >(xShCol, uno::UNO_QUERY);
            }
            break;
        }
    }
    uno::Any aRet(&aRef, ::getCppuType((Reference<uno::XInterface>*)0));
    return aRet;
}
/*-- 17.12.98 09:34:27---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXTextView::addSelectionChangeListener(
                                    const Reference< view::XSelectionChangeListener > & rxListener)
                                    throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    DBG_WARNING("not implemented")

    Reference< view::XSelectionChangeListener > * pInsert = new Reference< view::XSelectionChangeListener > ;
    *pInsert = rxListener;
    aSelChangedListeners.Insert(pInsert, aSelChangedListeners.Count());
}
/*-- 17.12.98 09:34:27---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXTextView::removeSelectionChangeListener(
                                        const Reference< view::XSelectionChangeListener > & rxListener)
                                        throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    sal_Bool bRemoved = sal_False;
    view::XSelectionChangeListener* pLeft = rxListener.get();
    for(sal_uInt16 i = 0; i < aSelChangedListeners.Count(); i++)
    {
        Reference< view::XSelectionChangeListener > * pElem = aSelChangedListeners.GetObject(i);
         view::XSelectionChangeListener* pRight = pElem->get();
        if(pLeft == pRight)
        {
            aSelChangedListeners.Remove(i);
            bRemoved = sal_True;
            delete pElem;
        }
    }
    if(!bRemoved)
        throw uno::RuntimeException();
}
/*-- 17.12.98 09:34:27---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< awt::XControl >  SwXTextView::getControl(const Reference< awt::XControlModel > & xModel)
        throw( container::NoSuchElementException, uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    Reference< awt::XControl >  xRet;

    ViewShell *pVSh = 0;
    SwView* pView = ((SwXTextView*)this)->GetView();
    if(pView)
    {
        SdrModel* pModel = pView->GetDocShell()->GetDoc()->GetDrawModel();
        if(pModel)
        {
            SdrPage* pPage = pModel->GetPage( 0 );
            Window *pWin = pView->GetWrtShell().GetWin();
            sal_uInt32 nCount = pPage->GetObjCount();
            for( sal_uInt32 i=0; i< nCount; i++ )
            {
                SdrObject* pObj = pPage->GetObj(i);
                SdrUnoObj *pFormObj = PTR_CAST( SdrUnoObj, pObj );
                SdrObjGroup* pGroup;
                if( pFormObj )
                {
                    Reference< awt::XControlModel >  xCM = pFormObj->GetUnoControlModel();
                    if( xCM.is() && xModel == xCM )
                    {
                        xRet = pFormObj->GetUnoControl( pWin );
                        break;
                    }
                }
                else if(0 != (pGroup = PTR_CAST( SdrObjGroup, pObj )))
                {
                    if(lcl_FindObjInGroup(xRet, pGroup, xModel, pWin))
                        break;
                }
            }
        }
    }
    return xRet;
}
/*-- 17.12.98 09:34:28---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< text::XTextViewCursor >  SwXTextView::getViewCursor(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    SwView* pView = ((SwXTextView*)this)->GetView();
    if(pView)
    {
        if(!pxTextViewCursor)
        {
            ((SwXTextView*)this)->pxTextViewCursor = new Reference< text::XTextViewCursor > ;
            *pxTextViewCursor = new  SwXTextViewCursor(pView);
        }
        return *pxTextViewCursor;
    }
    else
        throw uno::RuntimeException();
    return Reference< text::XTextViewCursor > ();
}
/*-- 17.12.98 09:34:28---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< beans::XPropertySet >  SwXTextView::getViewSettings(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(pView)
    {
        if(!pxViewSettings)
        {
            ((SwXTextView*)this)->pxViewSettings = new Reference< beans::XPropertySet > ;
            *pxViewSettings = new SwXViewSettings(sal_False, pView);
        }
    }
    else
        throw uno::RuntimeException();
    return *pxViewSettings;
}

/*-- 17.12.98 09:34:29---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXTextView::NotifySelChanged()
{
    Reference< uno::XInterface >  xInt = (cppu::OWeakObject*)(SfxBaseController*)this;

     lang::EventObject aEvent(xInt);

    sal_uInt16 nCount = aSelChangedListeners.Count();
    for ( sal_uInt16 i = nCount; i--; )
    {
        Reference< view::XSelectionChangeListener >  *pObj = aSelChangedListeners[i];
        (*pObj)->selectionChanged(aEvent);
    }
}
/* -----------------------------06.04.00 11:07--------------------------------

 ---------------------------------------------------------------------------*/
OUString SwXTextView::getImplementationName(void) throw( RuntimeException )
{
    return C2U("SwXTextView");
}
/* -----------------------------06.04.00 11:07--------------------------------

 ---------------------------------------------------------------------------*/
BOOL SwXTextView::supportsService(const OUString& rServiceName) throw( RuntimeException )
{
    return C2U("com.sun.star.text.TextView") == rServiceName;
}
/* -----------------------------06.04.00 11:07--------------------------------

 ---------------------------------------------------------------------------*/
Sequence< OUString > SwXTextView::getSupportedServiceNames(void) throw( RuntimeException )
{
    Sequence< OUString > aRet(1);
    OUString* pArray = aRet.getArray();
    pArray[0] = C2U("com.sun.star.text.TextView");
    return aRet;
}

/******************************************************************
 * SwXTextViewCursor
 ******************************************************************/
/*-- 17.12.98 09:36:23---------------------------------------------------

  -----------------------------------------------------------------------*/
SwXTextViewCursor::SwXTextViewCursor(SwView* pVw) :
    pView(pVw),
    aPropSet(aSwMapProvider.GetPropertyMap(PROPERTY_MAP_TEXT_CURSOR))
{

}
/*-- 17.12.98 09:36:24---------------------------------------------------

  -----------------------------------------------------------------------*/
SwXTextViewCursor::~SwXTextViewCursor()
{
}
/*-- 17.12.98 09:36:25---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Bool SwXTextViewCursor::isVisible(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    DBG_WARNING("not implemented")
    return sal_True;
}
/*-- 17.12.98 09:36:25---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXTextViewCursor::setVisible(sal_Bool bVisible) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    DBG_WARNING("not implemented")
}
/*-- 17.12.98 09:36:26---------------------------------------------------

  -----------------------------------------------------------------------*/
awt::Point SwXTextViewCursor::getPosition(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    awt::Point aRet;
    if(pView)
    {
        const SwWrtShell& rSh = pView->GetWrtShell();
        const SvxULSpaceItem& rUL = rSh.GetPageDesc( rSh.GetCurPageDesc()
                                                    ).GetMaster().GetULSpace();
        SwRect aCharRect(rSh.GetCharRect());
        long nY = aCharRect.Top() -
                                (rUL.GetUpper() + DOCUMENTBORDER);
        aRet.Y = TWIP_TO_MM100(nY);
        const SvxLRSpaceItem& rLR = rSh.GetPageDesc( rSh.GetCurPageDesc()
                                                    ).GetMaster().GetLRSpace();
        long nX = aCharRect.Left() -
                                (rLR.GetLeft() + DOCUMENTBORDER);
        aRet.X = TWIP_TO_MM100(nX);
    }
    else
        throw uno::RuntimeException();
    return aRet;
}
/*-- 17.12.98 09:36:26---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXTextViewCursor::collapseToStart(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(pView)
    {
        SwWrtShell& rSh = pView->GetWrtShell();
        if(rSh.HasSelection())
        {
            SwPaM* pShellCrsr = rSh.GetCrsr();
            if(*pShellCrsr->GetPoint() > *pShellCrsr->GetMark())
                pShellCrsr->Exchange();
            pShellCrsr->DeleteMark();
            rSh.EnterStdMode();
            rSh.SetSelection(*pShellCrsr);
        }
    }
    else
        throw uno::RuntimeException();
}
/*-- 17.12.98 09:36:26---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXTextViewCursor::collapseToEnd(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(pView)
    {
        SwWrtShell& rSh = pView->GetWrtShell();
        if(rSh.HasSelection())
        {
            SwPaM* pShellCrsr = rSh.GetCrsr();
            if(*pShellCrsr->GetPoint() < *pShellCrsr->GetMark())
                pShellCrsr->Exchange();
            pShellCrsr->DeleteMark();
            rSh.EnterStdMode();
            rSh.SetSelection(*pShellCrsr);
        }
    }
    else
        throw uno::RuntimeException();
}
/*-- 17.12.98 09:36:27---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Bool SwXTextViewCursor::isCollapsed(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    sal_Bool bRet = sal_False;
    if(pView)
    {
        const SwWrtShell& rSh = pView->GetWrtShell();
        bRet = rSh.HasSelection();
    }
    else
        throw uno::RuntimeException();
    return bRet;

}
/*-- 17.12.98 09:36:27---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Bool SwXTextViewCursor::goLeft(sal_Int16 nCount, sal_Bool bExpand) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    sal_Bool bRet = sal_False;
    if(pView)
    {
        for( sal_uInt16 i = 0; i < nCount; i++ )
            bRet = pView->GetWrtShell().Left( bExpand, 1, sal_True );
    }
    else
        throw uno::RuntimeException();
    return bRet;
}
/*-- 17.12.98 09:36:27---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Bool SwXTextViewCursor::goRight(sal_Int16 nCount, sal_Bool bExpand) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    sal_Bool bRet = sal_False;
    if(pView)
    {
        for( sal_uInt16 i = 0; i < nCount; i++ )
            bRet = pView->GetWrtShell().Right( bExpand, 1, sal_True );
    }
    else
        throw uno::RuntimeException();
    return bRet;

}
/* -----------------08.03.99 11:18-------------------
 *
 * --------------------------------------------------*/
void SwXTextViewCursor::gotoRange(const Reference< text::XTextRange > & xRange, sal_Bool bExpand) throw(::com::sun::star::uno::RuntimeException)
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(pView && xRange.is())
    {
        ShellModes  eSelMode = pView->GetShellMode();
        // ein interface aus der aktuellen Selektion erzeugen
        SwWrtShell& rSh = pView->GetWrtShell();
        rSh.EnterStdMode();
        SwPaM* pShellCrsr = rSh.GetCrsr();
        SwPaM aOwnPaM(*pShellCrsr->GetPoint());
        if(pShellCrsr->HasMark())
        {
            aOwnPaM.SetMark();
            *aOwnPaM.GetMark() = *pShellCrsr->GetMark();
        }

        Reference<lang::XUnoTunnel> xRangeTunnel( xRange, uno::UNO_QUERY);
        SwXTextRange* pRange = 0;
        SwXTextCursor* pCursor = 0;
        if(xRangeTunnel.is())
        {
            pRange = (SwXTextRange*)xRangeTunnel->getSomething(
                                    SwXTextRange::getUnoTunnelId());
            pCursor = (SwXTextCursor*)xRangeTunnel->getSomething(
                                    SwXTextCursor::getUnoTunnelId());
        }

        const sal_uInt16 nFrmType = rSh.GetFrmType(0,sal_True);

        SwStartNodeType eSearchNodeType = SwNormalStartNode;
        if(nFrmType & FRMTYPE_FLY_ANY)
            eSearchNodeType = SwFlyStartNode;
        else if(nFrmType &FRMTYPE_HEADER)
            eSearchNodeType = SwHeaderStartNode;
        else if(nFrmType & FRMTYPE_FOOTER)
            eSearchNodeType = SwFooterStartNode;
        else if(nFrmType & FRMTYPE_TABLE)
            eSearchNodeType = SwTableBoxStartNode;
        else if(nFrmType & FRMTYPE_FOOTNOTE)
            eSearchNodeType = SwFootnoteStartNode;

        const SwStartNode* pOwnStartNode = aOwnPaM.GetNode()->
                                                FindSttNodeByType(eSearchNodeType);

        const SwNode* pSrcNode = 0;
        if(pCursor && pCursor->GetCrsr())
        {
            pSrcNode = pCursor->GetCrsr()->GetNode();
        }
        else if(pRange && pRange->GetBookmark())
        {
            SwBookmark* pBkm = pRange->GetBookmark();
            pSrcNode = &pBkm->GetPos().nNode.GetNode();
        }
        const SwStartNode* pTmp = pSrcNode ? pSrcNode->FindSttNodeByType(eSearchNodeType) : 0;

        //SectionNodes ueberspringen
        while(pTmp && pTmp->IsSectionNode())
        {
            pTmp = pTmp->FindStartNode();
        }
        //ohne Expand darf mit dem ViewCursor ueberall hingesprungen werden
        //mit Expand nur in der gleichen Umgebung
        if(bExpand &&
            (pOwnStartNode != pTmp ||
            (eSelMode != SEL_LIST_TEXT &&
                eSelMode != SEL_TABLE_LIST_TEXT &&
                    eSelMode != SEL_TEXT)))
            throw uno::RuntimeException();

        //jetzt muss die Selektion erweitert werden
        if(bExpand)
        {
            // der Cursor soll alles einschliessen, was bisher von ihm und dem uebergebenen
            // Range eingeschlossen wurde
            SwPosition aOwnLeft(*aOwnPaM.GetPoint());
            SwPosition aOwnRight(aOwnPaM.HasMark() ? *aOwnPaM.GetMark() : aOwnLeft);
            if(aOwnRight < aOwnLeft)
            {
                SwPosition aTmp = aOwnLeft;
                aOwnLeft = aOwnRight;
                aOwnRight = aTmp;
            }
            SwPosition* pParamLeft;
            SwPosition* pParamRight;
            if(pCursor)
            {
                const SwUnoCrsr* pTmp = pCursor->GetCrsr();
                pParamLeft = new SwPosition(*pTmp->GetPoint());
                pParamRight = new SwPosition(pTmp->HasMark() ? *pTmp->GetMark() : *pParamLeft);
            }
            else
            {
                SwBookmark* pBkm = pRange->GetBookmark();
                pParamLeft = new SwPosition(pBkm->GetPos());
                pParamRight = new SwPosition(pBkm->GetOtherPos() ? *pBkm->GetOtherPos() : *pParamLeft);
            }
            if(*pParamRight < *pParamLeft)
            {
                SwPosition* pTmp = pParamLeft;
                pParamLeft = pParamRight;
                pParamRight = pTmp;
            }
            // jetzt sind vier SwPositions da, zwei davon werden gebraucht, also welche?
            if(aOwnRight < *pParamRight)
                *aOwnPaM.GetPoint() = aOwnRight;
            else
                *aOwnPaM.GetPoint() = *pParamRight;
            aOwnPaM.SetMark();
            if(aOwnLeft < *pParamLeft)
                *aOwnPaM.GetMark() = *pParamLeft;
            else
                *aOwnPaM.GetMark() = aOwnLeft;

            delete pParamLeft;
            delete pParamRight;
        }
        else
        {
            //der Cursor soll dem uebergebenen Range entsprechen
            if(pCursor)
            {
                const SwUnoCrsr* pTmp = pCursor->GetCrsr();
                *aOwnPaM.GetPoint() = *pTmp->GetPoint();
                if(pTmp->HasMark())
                {
                    aOwnPaM.SetMark();
                    *aOwnPaM.GetMark() = *pTmp->GetMark();
                }
                else
                    aOwnPaM.DeleteMark();
            }
            else
            {
                SwBookmark* pBkm = pRange->GetBookmark();
                *aOwnPaM.GetPoint() = pBkm->GetPos();
                if(pBkm->GetOtherPos())
                {
                    aOwnPaM.SetMark();
                    *aOwnPaM.GetMark() = *pBkm->GetOtherPos();
                }
                else
                    aOwnPaM.DeleteMark();
            }
        }
        rSh.SetSelection(aOwnPaM);
    }
    else
        throw uno::RuntimeException();

}
/*-- 17.12.98 09:36:28---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXTextViewCursor::gotoStart(sal_Bool bExpand) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(pView)
        pView->GetWrtShell().SttDoc( bExpand );
    else
        throw uno::RuntimeException();
}
/*-- 17.12.98 09:36:28---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXTextViewCursor::gotoEnd(sal_Bool bExpand) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(pView)
        pView->GetWrtShell().EndDoc( bExpand );
    else
        throw uno::RuntimeException();
}
/*-- 17.12.98 09:36:28---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Bool SwXTextViewCursor::jumpToFirstPage(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    sal_Bool bRet = sal_False;
    if(pView)
        bRet = pView->GetWrtShell().SttDoc();
    else
        throw uno::RuntimeException();
    return bRet;
}
/*-- 17.12.98 09:36:29---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Bool SwXTextViewCursor::jumpToLastPage(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    sal_Bool bRet = sal_False;
    if(pView)
    {
        SwWrtShell& rSh = pView->GetWrtShell();
        bRet = rSh.EndDoc();
        rSh.SttPg();
    }
    else
        throw uno::RuntimeException();
    return bRet;
}
/*-- 17.12.98 09:36:30---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Bool SwXTextViewCursor::jumpToPage(sal_Int16 nPage) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    sal_Bool bRet = sal_False;
    if(pView)
        bRet = pView->GetWrtShell().GotoPage(nPage);
    else
        throw uno::RuntimeException();
    return bRet;
}
/*-- 17.12.98 09:36:30---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Bool SwXTextViewCursor::jumpToNextPage(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    sal_Bool bRet = sal_False;
    if(pView)
        pView->GetWrtShell().SttNxtPg();
    else
        throw uno::RuntimeException();
    return bRet;
}
/*-- 17.12.98 09:36:31---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Bool SwXTextViewCursor::jumpToPreviousPage(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    sal_Bool bRet = sal_False;
    if(pView)
        bRet = pView->GetWrtShell().EndPrvPg();
    else
        throw uno::RuntimeException();
    return bRet;
}
/*-- 17.12.98 09:36:32---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Bool SwXTextViewCursor::jumpToEndOfPage(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    sal_Bool bRet = sal_False;
    if(pView)
        bRet = pView->GetWrtShell().EndPg();
    else
        throw uno::RuntimeException();
    return bRet;
}
/*-- 17.12.98 09:36:32---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Bool SwXTextViewCursor::jumpToStartOfPage(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    sal_Bool bRet = sal_False;
    if(pView)
        bRet = pView->GetWrtShell().SttPg();
    else
        throw uno::RuntimeException();
    return bRet;
}
/* -----------------04.10.99 14:21-------------------

 --------------------------------------------------*/
sal_Int16 SwXTextViewCursor::getPage(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    short nRet = 0;
    if(pView)
    {
        SwWrtShell& rSh = pView->GetWrtShell();
        sal_uInt16 nPage, nLogPage;
        rSh.GetPageNum( nPage, nLogPage,
                           rSh.IsCrsrVisible(), sal_False);
        nRet = (short)nPage;
    }
    else
        throw uno::RuntimeException();
    return nRet;
}
/*-- 17.12.98 09:36:33---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Bool SwXTextViewCursor::screenDown(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    sal_Bool bRet = sal_False;
    if(pView)
    {
        SfxRequest aReq(FN_PAGEDOWN, SFX_CALLMODE_SLOT, pView->GetPool());
        pView->Execute(aReq);
        const SfxPoolItem* pRet = aReq.GetReturnValue();
        bRet = pRet && ((const SfxBoolItem*)pRet)->GetValue();
    }
    else
        throw uno::RuntimeException();
    return bRet;
}
/*-- 17.12.98 09:36:33---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Bool SwXTextViewCursor::screenUp(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    sal_Bool bRet = sal_False;
    if(pView)
    {
        SfxRequest aReq(FN_PAGEUP, SFX_CALLMODE_SLOT, pView->GetPool());
        pView->Execute(aReq);
        const SfxPoolItem* pRet = aReq.GetReturnValue();
        bRet = pRet && ((const SfxBoolItem*)pRet)->GetValue();
    }
    else
        throw uno::RuntimeException();
    return bRet;
}
/*-- 17.12.98 11:59:05---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< text::XText >  SwXTextViewCursor::getText(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    Reference< text::XText >  xRet;
    if(pView)
    {
        SwWrtShell& rSh = pView->GetWrtShell();
        SwPaM* pShellCrsr = rSh.GetCrsr();
        SwDoc* pDoc = pView->GetDocShell()->GetDoc();
        Reference< text::XTextRange >  xRg = ::CreateTextRangeFromPosition(pDoc,
                                    *pShellCrsr->Start(), 0);
        xRet = xRg->getText();
    }
    else
        throw uno::RuntimeException();
    return xRet;
}
/*-- 17.12.98 11:59:05---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< text::XTextRange >  SwXTextViewCursor::getStart(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    Reference< text::XTextRange >  xRet;
    if(pView)
    {
        SwWrtShell& rSh = pView->GetWrtShell();
        SwPaM* pShellCrsr = rSh.GetCrsr();
        SwDoc* pDoc = pView->GetDocShell()->GetDoc();
        xRet = ::CreateTextRangeFromPosition(pDoc,
                                    *pShellCrsr->Start(), 0);
    }
    else
        throw uno::RuntimeException();
    return xRet;
}
/*-- 17.12.98 11:59:06---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< text::XTextRange >  SwXTextViewCursor::getEnd(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    Reference< text::XTextRange >  xRet;
    if(pView)
    {
        SwWrtShell& rSh = pView->GetWrtShell();
        SwPaM* pShellCrsr = rSh.GetCrsr();
        SwDoc* pDoc = pView->GetDocShell()->GetDoc();
        xRet = ::CreateTextRangeFromPosition(pDoc,
                                        *pShellCrsr->End(), 0);
    }
    else
        throw uno::RuntimeException();
    return xRet;
}
/* -----------------12.10.99 09:03-------------------

 --------------------------------------------------*/
OUString SwXTextViewCursor::getString(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    OUString uRet;
    if(pView)
    {
        ShellModes  eSelMode = pView->GetShellMode();
        switch(eSelMode)

            case SEL_LIST_TEXT       :
            case SEL_TABLE_LIST_TEXT:
            case SEL_TEXT            :
            {
                SwWrtShell& rSh = pView->GetWrtShell();
                SwPaM* pShellCrsr = rSh.GetCrsr();
                SwXTextCursor::getTextFromPam(*pShellCrsr, uRet);
            }
    }
    return uRet;
}
/*-- 17.12.98 11:59:06---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXTextViewCursor::setString(const OUString& aString) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    DBG_WARNING("not implemented")
}

/*-- 29.06.00 17:33:38---------------------------------------------------

  -----------------------------------------------------------------------*/
Reference< XPropertySetInfo >  SwXTextViewCursor::getPropertySetInfo(  ) throw(RuntimeException)
{
    static Reference< XPropertySetInfo >  xRef = aPropSet.getPropertySetInfo();
    return xRef;
}
/*-- 29.06.00 17:33:39---------------------------------------------------

  -----------------------------------------------------------------------*/
void  SwXTextViewCursor::setPropertyValue( const OUString& rPropertyName, const Any& aValue )
                            throw(UnknownPropertyException, PropertyVetoException,
                                IllegalArgumentException, WrappedTargetException, RuntimeException)
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(pView)
    {
        SwWrtShell& rSh = pView->GetWrtShell();
        SwPaM* pShellCrsr = rSh.GetCrsr();
        SwXTextCursor::SetPropertyValue(*pShellCrsr, aPropSet, rPropertyName, aValue );
    }
    else
        throw RuntimeException();
}
/*-- 29.06.00 17:33:39---------------------------------------------------

  -----------------------------------------------------------------------*/
Any  SwXTextViewCursor::getPropertyValue( const OUString& rPropertyName )
                throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    Any aRet;
    if(pView)
    {
        SwWrtShell& rSh = pView->GetWrtShell();
        SwPaM* pShellCrsr = rSh.GetCrsr();
        aRet = SwXTextCursor::GetPropertyValue(  *pShellCrsr, aPropSet, rPropertyName);
    }
    else
        throw RuntimeException();
    return aRet;
}
/*-- 29.06.00 17:33:40---------------------------------------------------

  -----------------------------------------------------------------------*/
void  SwXTextViewCursor::addPropertyChangeListener(
    const OUString& aPropertyName, const Reference< XPropertyChangeListener >& xListener )
        throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
{
}
/*-- 29.06.00 17:33:40---------------------------------------------------

  -----------------------------------------------------------------------*/
void  SwXTextViewCursor::removePropertyChangeListener(
    const OUString& aPropertyName, const Reference< XPropertyChangeListener >& aListener )
        throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
{
}
/*-- 29.06.00 17:33:41---------------------------------------------------

  -----------------------------------------------------------------------*/
void  SwXTextViewCursor::addVetoableChangeListener(
    const OUString& PropertyName, const Reference< XVetoableChangeListener >& aListener )
        throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
{
}
/*-- 29.06.00 17:33:41---------------------------------------------------

  -----------------------------------------------------------------------*/
void  SwXTextViewCursor::removeVetoableChangeListener( const OUString& PropertyName, const Reference< XVetoableChangeListener >& aListener ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
{
}
/*-- 29.06.00 17:33:41---------------------------------------------------

  -----------------------------------------------------------------------*/
PropertyState  SwXTextViewCursor::getPropertyState( const OUString& rPropertyName ) throw(UnknownPropertyException, RuntimeException)
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    PropertyState eState;
    if(pView)
    {
        SwWrtShell& rSh = pView->GetWrtShell();
        SwPaM* pShellCrsr = rSh.GetCrsr();
        eState = SwXTextCursor::GetPropertyState( *pShellCrsr, aPropSet, rPropertyName);
    }
    else
        throw RuntimeException();
    return eState;
}
/*-- 29.06.00 17:33:42---------------------------------------------------

  -----------------------------------------------------------------------*/
Sequence< PropertyState >  SwXTextViewCursor::getPropertyStates(
    const Sequence< OUString >& rPropertyNames ) throw(UnknownPropertyException, RuntimeException)
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    Sequence< PropertyState >  aRet;
    if(pView)
    {
        SwWrtShell& rSh = pView->GetWrtShell();
        SwPaM* pShellCrsr = rSh.GetCrsr();
        aRet = SwXTextCursor::GetPropertyStates(*pShellCrsr, aPropSet,  rPropertyNames);
    }
    return aRet;
}
/*-- 29.06.00 17:33:42---------------------------------------------------

  -----------------------------------------------------------------------*/
void  SwXTextViewCursor::setPropertyToDefault( const OUString& rPropertyName )
                                        throw(UnknownPropertyException, RuntimeException)
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(pView)
    {
        SwWrtShell& rSh = pView->GetWrtShell();
        SwPaM* pShellCrsr = rSh.GetCrsr();
        SwXTextCursor::SetPropertyToDefault( *pShellCrsr, aPropSet, rPropertyName);
    }
}
/*-- 29.06.00 17:33:43---------------------------------------------------

  -----------------------------------------------------------------------*/
Any  SwXTextViewCursor::getPropertyDefault( const OUString& rPropertyName )
                        throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
{
    Any aRet;
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(pView)
    {
        SwWrtShell& rSh = pView->GetWrtShell();
        SwPaM* pShellCrsr = rSh.GetCrsr();
        aRet = SwXTextCursor::GetPropertyDefault( *pShellCrsr, aPropSet, rPropertyName);
    }
    return aRet;
}

/*------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.76  2000/09/18 16:06:16  willem.vandorp
    OpenOffice header added.

    Revision 1.75  2000/09/07 15:59:34  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.74  2000/07/10 12:32:19  os
    chg: acquire/release don't throw exceptions

    Revision 1.73  2000/06/29 16:45:50  os
    #75928# XTextViewCursor implements XPropertySet/XPropertyState

    Revision 1.72  2000/06/27 07:57:29  obo
    #65293#

    Revision 1.71  2000/05/24 13:36:13  hr
    exception specifications

    Revision 1.70  2000/05/23 07:39:15  os
    SwXTextView : inheritance changed

    Revision 1.69  2000/05/18 08:35:56  os
    XInterface - mothods

    Revision 1.68  2000/05/16 09:15:14  os
    project usr removed

    Revision 1.67  2000/05/10 11:55:31  os
    Basic API removed

    Revision 1.66  2000/04/26 15:00:45  os
    GetName() returns const String&

    Revision 1.65  2000/04/11 08:05:00  os
    UNICODE

    Revision 1.64  2000/03/27 10:36:31  os
    UNO III

    Revision 1.63  2000/03/21 15:39:44  os
    UNOIII

    Revision 1.62  2000/02/11 14:59:57  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.61  2000/01/03 12:16:26  os
    #71284# ::select: query for SwXShape-base class before calling getImplementation()


    Revision 1.60  1999/11/25 15:37:50  os
    headers corrected

    Revision 1.59  1999/11/19 16:38:03  os
    modules renamed

    Revision 1.58  1999/11/03 14:39:20  os
    getString:: convert to UNICODE

    Revision 1.57  1999/10/12 07:24:19  os
    #69115# API parameter in GotoLeftRight/LRMargin; getText/getStart+End/collapse

    Revision 1.56  1999/10/05 10:22:04  os
    new method: getPage

    Revision 1.55  1999/09/28 09:12:43  os
    #67167# view::XLineCursor, view::XViewCursor inherited

    Revision 1.54  1999/09/07 05:59:43  os
    #67887# frame::XDispatchProvider

    Revision 1.53  1999/08/31 09:32:00  OS
    #68459# ::select: correct conversion from uno::Any


      Rev 1.52   31 Aug 1999 11:32:00   OS
   #68459# ::select: correct conversion from uno::Any

      Rev 1.51   26 Aug 1999 11:44:10   HR
   select/getSelection corrected

      Rev 1.50   25 Aug 1999 16:47:32   OS
   getSelection/select with uno::Any

      Rev 1.49   16 Aug 1999 17:21:14   OS
   #65953# select(): shapes implemented
=======
/*-- 28.09.99 08:31:19---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Bool SwXTextViewCursor::goDown(sal_Int16 nCount, sal_Bool bExpand) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    sal_Bool bRet = sal_False;
    if(pView)
    {
        for( sal_uInt16 i = 0; i < nCount; i++ )
            bRet = pView->GetWrtShell().Down( bExpand, 1, sal_True );
    }
    else
        throw uno::RuntimeException();
    return bRet;
}
/*-- 28.09.99 08:31:20---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Bool SwXTextViewCursor::goUp(sal_Int16 nCount, sal_Bool bExpand) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    sal_Bool bRet = sal_False;
    if(pView)
    {
        for( sal_uInt16 i = 0; i < nCount; i++ )
            bRet = pView->GetWrtShell().Up( bExpand, 1, sal_True );
    }
    else
        throw uno::RuntimeException();
    return bRet;
}
/*-- 28.09.99 08:31:20---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Bool SwXTextViewCursor::isAtStartOfLine(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    sal_Bool bRet = sal_False;
    if(pView)
    {
        bRet = pView->GetWrtShell().IsAtLeftMargin();
    }
    else
        throw uno::RuntimeException();
    return bRet;
}
/*-- 28.09.99 08:31:21---------------------------------------------------

  -----------------------------------------------------------------------*/
sal_Bool SwXTextViewCursor::isAtEndOfLine(void) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    sal_Bool bRet = sal_False;
    if(pView)
    {
        bRet = pView->GetWrtShell().IsAtRightMargin(sal_True);
    }
    else
        throw uno::RuntimeException();
    return bRet;
}
/*-- 28.09.99 08:31:21---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXTextViewCursor::gotoEndOfLine(sal_Bool bExpand) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(pView)
        pView->GetWrtShell().RightMargin(bExpand, sal_True);
    else
        throw uno::RuntimeException();
}
/*-- 28.09.99 08:31:22---------------------------------------------------

  -----------------------------------------------------------------------*/
void SwXTextViewCursor::gotoStartOfLine(sal_Bool bExpand) throw( uno::RuntimeException )
{
    ::vos::OGuard aGuard(Application::GetSolarMutex());
    if(pView)
        pView->GetWrtShell().LeftMargin(bExpand, sal_True);
    else
        throw uno::RuntimeException();
}
/* -----------------------------06.04.00 11:07--------------------------------

 ---------------------------------------------------------------------------*/
OUString SwXTextViewCursor::getImplementationName(void) throw( RuntimeException )
{
    return C2U("SwXTextViewCursor");
}
/* -----------------------------06.04.00 11:07--------------------------------

 ---------------------------------------------------------------------------*/
BOOL SwXTextViewCursor::supportsService(const OUString& rServiceName) throw( RuntimeException )
{
    return C2U("com.sun.star.text.TextViewCursor") == rServiceName;
}
/* -----------------------------06.04.00 11:07--------------------------------

 ---------------------------------------------------------------------------*/
Sequence< OUString > SwXTextViewCursor::getSupportedServiceNames(void) throw( RuntimeException )
{
    Sequence< OUString > aRet(1);
    OUString* pArray = aRet.getArray();
    pArray[0] = C2U("com.sun.star.text.TextViewCursor");
    return aRet;
}

/*------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.76  2000/09/18 16:06:16  willem.vandorp
    OpenOffice header added.

    Revision 1.75  2000/09/07 15:59:34  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.74  2000/07/10 12:32:19  os
    chg: acquire/release don't throw exceptions

    Revision 1.73  2000/06/29 16:45:50  os
    #75928# XTextViewCursor implements XPropertySet/XPropertyState

    Revision 1.72  2000/06/27 07:57:29  obo
    #65293#

    Revision 1.71  2000/05/24 13:36:13  hr
    exception specifications

    Revision 1.70  2000/05/23 07:39:15  os
    SwXTextView : inheritance changed

    Revision 1.69  2000/05/18 08:35:56  os
    XInterface - mothods

    Revision 1.68  2000/05/16 09:15:14  os
    project usr removed

    Revision 1.67  2000/05/10 11:55:31  os
    Basic API removed

    Revision 1.66  2000/04/26 15:00:45  os
    GetName() returns const String&

    Revision 1.65  2000/04/11 08:05:00  os
    UNICODE

    Revision 1.64  2000/03/27 10:36:31  os
    UNO III

    Revision 1.63  2000/03/21 15:39:44  os
    UNOIII

    Revision 1.62  2000/02/11 14:59:57  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.61  2000/01/03 12:16:26  os
    #71284# ::select: query for SwXShape-base class before calling getImplementation()


    Revision 1.60  1999/11/25 15:37:50  os
    headers corrected

    Revision 1.59  1999/11/19 16:38:03  os
    modules renamed

    Revision 1.58  1999/11/03 14:39:20  os
    getString:: convert to UNICODE

    Revision 1.57  1999/10/12 07:24:19  os
    #69115# API parameter in GotoLeftRight/LRMargin; getText/getStart+End/collapse

    Revision 1.56  1999/10/05 10:22:04  os
    new method: getPage

    Revision 1.55  1999/09/28 09:12:43  os
    #67167# view::XLineCursor, view::XViewCursor inherited


      Rev 1.48   13 Jul 1999 09:34:00   OS
   getPosition etwas optimiert

      Rev 1.47   07 Jul 1999 08:52:10   OS
   #67471# view::XSelectionChangeListener now supported

      Rev 1.46   22 Apr 1999 16:09:06   OS
   #65194# throw -> throw

      Rev 1.45   22 Apr 1999 15:28:52   OS
   #65124# not implemented - nur noch DBG_WARNING

      Rev 1.44   07 Apr 1999 10:26:32   OS
   #60348# richtiges Shape liefern

      Rev 1.43   15 Mar 1999 14:38:26   OS
   #62845# Makro fuer ServiceInfo jetzt auch fuer OS/2

      Rev 1.42   12 Mar 1999 09:57:24   OS
   #62845# lang::XServiceInfo impl.

      Rev 1.41   10 Mar 1999 16:19:38   OS
   #63127# Controller-Methoden von der Basisklasse

      Rev 1.40   09 Mar 1999 12:38:08   OS
   #62393# gotoRange verbessert, #62008# Solar-Mutex

      Rev 1.39   08 Mar 1999 07:43:02   MH
   update 515

      Rev 1.38   05 Mar 1999 08:51:46   OS
   #62191# INT statt UINT

      Rev 1.37   10 Feb 1999 16:15:26   OS
// automatisch auskommentiert - [getIdlClass(es) or queryInterface] - Bitte XTypeProvider benutzen!
//   #52654# lang::XComponent im queryInterface


      Rev 1.36   28 Jan 1999 16:27:50   OS
   #56371# keine Objekte fuer DEBUG anlegen

      Rev 1.35   27 Jan 1999 12:06:08   OS
   #56371# TF_ONE51

      Rev 1.34   27 Jan 1999 09:59:16   OS
   #56371# TF_ONE51

      Rev 1.33   17 Dec 1998 12:09:10   OS
   #56371# TF_ONE51 Zwischenstand

      Rev 1.32   10 Dec 1998 15:54:04   OS
   #56371# TF_ONE51 Zwischenstand

      Rev 1.31   11 Nov 1998 10:58:06   AWO
   Include fehlte

      Rev 1.30   09 Nov 1998 14:44:10   OS
   #58785# getSelection an der XTextView vollstaendig

      Rev 1.29   04 Nov 1998 15:55:26   OS
   #58289# getControl geht auch in Gruppen

      Rev 1.28   05 Oct 1998 17:32:22   HR
   UIK() Makro

      Rev 1.27   01 Oct 1998 15:58:14   OM
   #52654# SelectionChangeListener

      Rev 1.26   01 Oct 1998 11:40:54   HR
   Typo beseitigt

      Rev 1.25   18 Sep 1998 11:40:56   OS
   #56651# GotoBookmark optimiert

      Rev 1.24   18 Sep 1998 09:31:34   OS
   52654# view::XScreenCursor

      Rev 1.23   17 Sep 1998 15:53:38   OS
   #52654# text::TextViewCursor(-Supplier)

      Rev 1.22   07 Sep 1998 09:07:06   OS
   #54862# add/removeSelectionChangeListener

      Rev 1.21   10 Jul 1998 18:09:40   OS
   PropertySetInfo und IdlClass static

      Rev 1.20   08 Jul 1998 10:00:00   TJ
   include

      Rev 1.19   03 Jul 1998 07:22:40   OS
   Ableitung von view::XControlAccess

      Rev 1.18   18 Jun 1998 13:23:34   OS
   include-Umstellung 396c

      Rev 1.17   18 Jun 1998 09:23:14   OS
   Ableitung von SfxOfficeDocController

      Rev 1.16   11 Jun 1998 11:06:40   TJ
   getActualViewData -> getViewData

      Rev 1.15   11 Jun 1998 08:15:48   OS
   Code-Kopie war nix#

      Rev 1.14   04 Jun 1998 09:40:28   OS
// automatisch auskommentiert - [getIdlClass(es) or queryInterface] - Bitte XTypeProvider benutzen!
//   getIdlClasses


      Rev 1.13   02 Jun 1998 16:18:10   OS
   391-Anpassung

      Rev 1.12   02 Jun 1998 15:50:34   OS
   SwXTextView von frame::XController abgeleitet

      Rev 1.11   26 May 1998 12:33:12   OS
   SetSelection fuer Cursor

      Rev 1.10   22 May 1998 15:15:24   OS
   get/setSelection erweitert

      Rev 1.9   14 May 1998 17:50:08   OS
   div. Namensaenderungen

      Rev 1.8   09 Apr 1998 15:10:34   OS
   Uno-Umstellung

      Rev 1.7   08 Apr 1998 12:52:24   OS
   text::ViewSettings auch fuer die TextView; select fuer Frames u. text::Bookmarks

      Rev 1.6   03 Apr 1998 14:37:52   OS
   wieder aktiviert

      Rev 1.5   30 Jan 1998 15:10:46   OS
   wieder uebersetzbar

      Rev 1.4   19 Jan 1998 14:58:04   OS
   wieder uebersetzbar

      Rev 1.3   08 Jan 1998 12:56:48   OS
   UsrUik -> uno::Uik

      Rev 1.2   19 Dec 1997 18:04:56   OS
   Jahressicherung

      Rev 1.1   17 Dec 1997 16:19:48   OS
   Tabellenanfang

      Rev 1.0   16 Dec 1997 11:52:34   OS
   Initial revision.

------------------------------------------------------------------------*/

diff --git a/sw/source/ui/utlui/attrdesc.cxx b/sw/source/ui/utlui/attrdesc.cxx
new file mode 100644
index 0000000..730857f
--- /dev/null
+++ b/sw/source/ui/utlui/attrdesc.cxx
@@ -0,0 +1,1367 @@
/*************************************************************************
 *
 *  $RCSfile: attrdesc.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:49 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SFXITEMITER_HXX //autogen
#include <svtools/itemiter.hxx>
#endif
#ifndef _SV_SVAPP_HXX //autogen wg. Application
#include <vcl/svapp.hxx>
#endif
#ifndef _SVX_ITEMTYPE_HXX
#include <svx/itemtype.hxx>
#endif

#ifndef _GRFMGR_HXX
#include <goodies/grfmgr.hxx>
#endif

#ifndef _FMTANCHR_HXX //autogen
#include <fmtanchr.hxx>
#endif
#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _FMTINFMT_HXX //autogen
#include <fmtinfmt.hxx>
#endif
#ifndef _FCHRFMT_HXX //autogen
#include <fchrfmt.hxx>
#endif
#ifndef _FMTSRND_HXX //autogen
#include <fmtsrnd.hxx>
#endif
#ifndef _FMTORNT_HXX //autogen
#include <fmtornt.hxx>
#endif
#ifndef _FMTTSPLT_HXX //autogen
#include <fmtlsplt.hxx>
#endif
#ifndef _FMTPDSC_HXX //autogen
#include <fmtpdsc.hxx>
#endif
#ifndef _FMTCLDS_HXX //autogen
#include <fmtclds.hxx>
#endif
#ifndef _FMTEIRO_HXX //autogen
#include <fmteiro.hxx>
#endif
#ifndef _FMTURL_HXX //autogen
#include <fmturl.hxx>
#endif
#ifndef _FMTHDFT_HXX //autogen
#include <fmthdft.hxx>
#endif
#ifndef _FMTCNCT_HXX //autogen
#include <fmtcnct.hxx>
#endif
#ifndef _FMTLINE_HXX
#include <fmtline.hxx>
#endif
#ifndef _SWATRSET_HXX
#include <swatrset.hxx>
#endif
#ifndef _PARATR_HXX
#include <paratr.hxx>
#endif
#ifndef _GRFATR_HXX
#include <grfatr.hxx>
#endif
#ifndef _PAGEDESC_HXX
#include <pagedesc.hxx>
#endif
#ifndef _CHARFMT_HXX
#include <charfmt.hxx>
#endif
#ifndef _FMTCOL_HXX
#include <fmtcol.hxx>
#endif
#ifndef _TOX_HXX
#include <tox.hxx>
#endif
#ifndef _ATTRDESC_HRC
#include <attrdesc.hrc>
#endif
#ifndef _FMTFTNTX_HXX //autogen
#include <fmtftntx.hxx>
#endif


TYPEINIT2(SwFmtCharFmt,SfxPoolItem,SwClient);

// erfrage die Attribut-Beschreibung
void SwAttrSet::GetPresentation(
        SfxItemPresentation ePres,
        SfxMapUnit eCoreMetric,
        SfxMapUnit ePresMetric,
        String &rText ) const
{
static sal_Char __READONLY_DATA sKomma[] = ", ";

    rText.Erase();
    String aStr;
    if( Count() )
    {
        SfxItemIter aIter( *this );
        const International& rInt = Application::GetAppInternational();
        while( TRUE )
        {
#if SUPD>546
            aIter.GetCurItem()->GetPresentation( ePres, eCoreMetric,
                                                 ePresMetric, aStr,
                                                 &rInt );
#else
            aIter.GetCurItem()->GetPresentation( ePres, eCoreMetric,
                                                 ePresMetric, aStr );
#endif
            if( rText.Len() && aStr.Len() )
                rText += String::CreateFromAscii(sKomma);
            rText += aStr;
            if( aIter.IsAtEnd() )
                break;
            aIter.NextItem();
        }
    }
}


void SwPageDesc::GetPresentation(
        SfxItemPresentation ePres,
        SfxMapUnit eCoreMetric,
        SfxMapUnit ePresMetric,
        String &rText ) const
{
    rText = GetName();
}


// ATT_CHARFMT *********************************************


SfxItemPresentation SwFmtCharFmt::GetPresentation
(
    SfxItemPresentation ePres,
    SfxMapUnit          eCoreUnit,
    SfxMapUnit          ePresUnit,
    String&             rText,
    const International*        pIntl
)   const
{
    switch ( ePres )
    {
        case SFX_ITEM_PRESENTATION_NONE:
            rText.Erase();
            break;
        case SFX_ITEM_PRESENTATION_NAMELESS:
        case SFX_ITEM_PRESENTATION_COMPLETE:
        {
            const SwCharFmt *pCharFmt = GetCharFmt();
            if ( pCharFmt )
            {
                String aStr;
                rText = SW_RESSTR(STR_CHARFMT );
                pCharFmt->GetPresentation( ePres, eCoreUnit, ePresUnit, aStr );
                rText += '(';
                rText += aStr;
                rText += ')';
            }
            else
                rText = SW_RESSTR( STR_NO_CHARFMT );
            return ePres;
        }
    }
    return SFX_ITEM_PRESENTATION_NONE;
}

// ATT_INETFMT *********************************************


SfxItemPresentation SwFmtINetFmt::GetPresentation
(
    SfxItemPresentation ePres,
    SfxMapUnit          eCoreUnit,
    SfxMapUnit          ePresUnit,
    String&             rText,
    const International*        pIntl
)   const
{
    switch ( ePres )
    {
        case SFX_ITEM_PRESENTATION_NONE:
            rText.Erase();
            break;
        case SFX_ITEM_PRESENTATION_NAMELESS:
        case SFX_ITEM_PRESENTATION_COMPLETE:
        {
            rText = GetValue();
            return ePres;
        }
    }
    return SFX_ITEM_PRESENTATION_NONE;
}

/*************************************************************************
|*    class     SwFmtDrop
*************************************************************************/


SfxItemPresentation SwFmtDrop::GetPresentation
(
    SfxItemPresentation ePres,
    SfxMapUnit          eCoreUnit,
    SfxMapUnit          ePresUnit,
    String&             rText,
    const International*        pIntl
)   const
{
    rText.Erase();
    switch ( ePres )
    {
        case SFX_ITEM_PRESENTATION_NONE:
            break;
        case SFX_ITEM_PRESENTATION_NAMELESS:
        case SFX_ITEM_PRESENTATION_COMPLETE:
        {
            if ( GetLines() > 1 )
            {
                if ( GetChars() > 1 )
                {
                    rText = String::CreateFromInt32( GetChars() );
                    rText += ' ';
                }
                rText += SW_RESSTR( STR_DROP_OVER );
                rText += ' ';
                rText += String::CreateFromInt32( GetLines() );
                rText += ' ';
                rText += SW_RESSTR( STR_DROP_LINES );
            }
            else
                rText = SW_RESSTR( STR_NO_DROP_LINES );
            return ePres;
        }
    }
    return SFX_ITEM_PRESENTATION_NONE;
}

/*************************************************************************
|*    class     SwRegisterItem
*************************************************************************/


SfxItemPresentation SwRegisterItem::GetPresentation
(
    SfxItemPresentation ePres,
    SfxMapUnit          eCoreUnit,
    SfxMapUnit          ePresUnit,
    XubString&          rText,
    const International*        pIntl
)   const
{
    switch ( ePres )
    {
        case SFX_ITEM_PRESENTATION_NONE:
            rText.Erase();
            return SFX_ITEM_PRESENTATION_NONE;
        case SFX_ITEM_PRESENTATION_NAMELESS:
        case SFX_ITEM_PRESENTATION_COMPLETE:
        {
            USHORT nId = GetValue() ? STR_REGISTER_ON : STR_REGISTER_OFF;
            rText = SW_RESSTR( nId );
            return ePres;
        }
    }
    return SFX_ITEM_PRESENTATION_NONE;
}

/*************************************************************************
|*    class     SwNumRuleItem
*************************************************************************/


SfxItemPresentation SwNumRuleItem::GetPresentation
(
    SfxItemPresentation ePres,
    SfxMapUnit          eCoreUnit,
    SfxMapUnit          ePresUnit,
    XubString&          rText,
    const International*        pIntl
)   const
{
    switch ( ePres )
    {
        case SFX_ITEM_PRESENTATION_NONE:
            rText.Erase();
            return SFX_ITEM_PRESENTATION_NONE;
        case SFX_ITEM_PRESENTATION_NAMELESS:
        case SFX_ITEM_PRESENTATION_COMPLETE:
        {
            if( GetValue().Len() )
                (((rText = SW_RESSTR( STR_NUMRULE_ON )) +=
                    '(' ) += GetValue() ) += ')';
            else
                rText = SW_RESSTR( STR_NUMRULE_OFF );
            return ePres;
        }
    }
    return SFX_ITEM_PRESENTATION_NONE;
}


/******************************************************************************
 *  Frame-Attribute:
 ******************************************************************************/


SfxItemPresentation SwFmtFrmSize::GetPresentation
(
    SfxItemPresentation ePres,
    SfxMapUnit          eCoreUnit,
    SfxMapUnit          ePresUnit,
    String&             rText,
    const International*        pIntl
)   const
{
    switch ( ePres )
    {
        case SFX_ITEM_PRESENTATION_NONE:
        {
            rText.Erase();
            break;
        }
        case SFX_ITEM_PRESENTATION_NAMELESS:
        case SFX_ITEM_PRESENTATION_COMPLETE:
        {
            rText = SW_RESSTR( STR_FRM_WIDTH );
            rText += ' ';
            if ( GetWidthPercent() )
            {
                rText += String::CreateFromInt32(GetWidthPercent());
                rText += '%';
            }
            else
            {
                rText += ::GetMetricText( GetWidth(), eCoreUnit, ePresUnit );
                rText += ::GetSvxString( ::GetMetricId( ePresUnit ) );
            }
            if ( ATT_VAR_SIZE != GetSizeType() )
            {
                rText += ',';
                rText += ' ';
                const USHORT nId = ATT_FIX_SIZE == eFrmSize ?
                                        STR_FRM_FIXEDHEIGHT : STR_FRM_MINHEIGHT;
                rText += SW_RESSTR( nId );
                rText += ' ';
                if ( GetHeightPercent() )
                {
                    rText += String::CreateFromInt32(GetHeightPercent());
                    rText += '%';
                }
                else
                {
                    rText += ::GetMetricText( GetHeight(), eCoreUnit, ePresUnit );
                    rText += ::GetSvxString( ::GetMetricId( ePresUnit ) );
                }
            }
            return ePres;
        }
    }
    return SFX_ITEM_PRESENTATION_NONE;
}

//Kopfzeile, fuer Seitenformate
//Client von FrmFmt das den Header beschreibt.


SfxItemPresentation SwFmtHeader::GetPresentation
(
    SfxItemPresentation ePres,
    SfxMapUnit          eCoreUnit,
    SfxMapUnit          ePresUnit,
    String&             rText,
    const International*        pIntl
)   const
{
    switch ( ePres )
    {
        case SFX_ITEM_PRESENTATION_NONE:
            rText.Erase();
            break;
        case SFX_ITEM_PRESENTATION_NAMELESS:
        case SFX_ITEM_PRESENTATION_COMPLETE:
        {
            const USHORT nId = GetHeaderFmt() ? STR_HEADER : STR_NO_HEADER;
            rText = SW_RESSTR( nId );
            return ePres;
        }
    }
    return SFX_ITEM_PRESENTATION_NONE;
}

//Fusszeile, fuer Seitenformate
//Client von FrmFmt das den Footer beschreibt.


SfxItemPresentation SwFmtFooter::GetPresentation
(
    SfxItemPresentation ePres,
    SfxMapUnit          eCoreUnit,
    SfxMapUnit          ePresUnit,
    String&             rText,
    const International*        pIntl
)   const
{
    switch ( ePres )
    {
        case SFX_ITEM_PRESENTATION_NONE:
            rText.Erase();
            break;
        case SFX_ITEM_PRESENTATION_NAMELESS:
        case SFX_ITEM_PRESENTATION_COMPLETE:
        {
            const USHORT nId = GetFooterFmt() ? STR_FOOTER : STR_NO_FOOTER;
            rText = SW_RESSTR( nId );
            return ePres;
        }
    }
    return SFX_ITEM_PRESENTATION_NONE;
}


SfxItemPresentation SwFmtSurround::GetPresentation
(
    SfxItemPresentation ePres,
    SfxMapUnit          eCoreUnit,
    SfxMapUnit          ePresUnit,
    String&             rText,
    const International*        pIntl
)   const
{
    switch ( ePres )
    {
        case SFX_ITEM_PRESENTATION_NONE:
            rText.Erase();
            break;
        case SFX_ITEM_PRESENTATION_NAMELESS:
        case SFX_ITEM_PRESENTATION_COMPLETE:
        {
            USHORT nId = 0;
            switch ( (SwSurround)GetValue() )
            {
                case SURROUND_NONE:
                    nId = STR_SURROUND_NONE;
                break;
                case SURROUND_THROUGHT:
                    nId = STR_SURROUND_THROUGHT;
                break;
                case SURROUND_PARALLEL:
                    nId = STR_SURROUND_PARALLEL;
                break;
                case SURROUND_IDEAL:
                    nId = STR_SURROUND_IDEAL;
                break;
                case SURROUND_LEFT:
                    nId = STR_SURROUND_LEFT;
                break;
                case SURROUND_RIGHT:
                    nId = STR_SURROUND_RIGHT;
                break;
            }
            if ( nId )
                rText = SW_RESSTR( nId );

            if ( IsAnchorOnly() )
            {
                rText += ' ';
                rText += SW_RESSTR( STR_SURROUND_ANCHORONLY );
            }
            return ePres;
        }
    }
    return SFX_ITEM_PRESENTATION_NONE;
}


//VertOrientation, wie und woran orientiert --
//  sich der FlyFrm in der Vertikalen -----------


SfxItemPresentation SwFmtVertOrient::GetPresentation
(
    SfxItemPresentation ePres,
    SfxMapUnit          eCoreUnit,
    SfxMapUnit          ePresUnit,
    String&             rText,
    const International*        pIntl
)   const
{
    switch ( ePres )
    {
        case SFX_ITEM_PRESENTATION_NONE:
            rText.Erase();
            break;
        case SFX_ITEM_PRESENTATION_NAMELESS:
        case SFX_ITEM_PRESENTATION_COMPLETE:
        {
            USHORT nId = 0;
            switch ( GetVertOrient() )
            {
                case VERT_NONE:
                {
                    rText += SW_RESSTR( STR_POS_Y );
                    rText += ' ';
                    rText += ::GetMetricText( GetPos(), eCoreUnit, ePresUnit );
                    rText += ::GetSvxString( ::GetMetricId( ePresUnit ) );
                }
                break;
                case VERT_TOP:
                    nId = STR_VERT_TOP;
                    break;
                case VERT_CENTER:
                    nId = STR_VERT_CENTER;
                    break;
                case VERT_BOTTOM:
                    nId = STR_VERT_BOTTOM;
                    break;
                case VERT_LINE_TOP:
                    nId = STR_LINE_TOP;
                    break;
                case VERT_LINE_CENTER:
                    nId = STR_LINE_CENTER;
                    break;
                case VERT_LINE_BOTTOM:
                    nId = STR_LINE_BOTTOM;
                    break;
            }
            if ( nId )
                rText += SW_RESSTR( nId );
            return ePres;
        }
    }
    return SFX_ITEM_PRESENTATION_NONE;
}

//HoriOrientation, wie und woran orientiert --
//  sich der FlyFrm in der Hoizontalen ----------


SfxItemPresentation SwFmtHoriOrient::GetPresentation
(
    SfxItemPresentation ePres,
    SfxMapUnit          eCoreUnit,
    SfxMapUnit          ePresUnit,
    String&             rText,
    const International*        pIntl
)   const
{
    switch ( ePres )
    {
        case SFX_ITEM_PRESENTATION_NONE:
            rText.Erase();
            break;
        case SFX_ITEM_PRESENTATION_NAMELESS:
        case SFX_ITEM_PRESENTATION_COMPLETE:
        {
            USHORT nId = 0;
            switch ( GetHoriOrient() )
            {
                case HORI_NONE:
                {
                    rText += SW_RESSTR( STR_POS_X );
                    rText += ' ';
                    rText += ::GetMetricText( GetPos(), eCoreUnit, ePresUnit );
                    rText += ::GetSvxString( ::GetMetricId( ePresUnit ) );
                }
                break;
                case HORI_RIGHT:
                    nId = STR_HORI_RIGHT;
                break;
                case HORI_CENTER:
                    nId = STR_HORI_CENTER;
                break;
                case HORI_LEFT:
                    nId = STR_HORI_LEFT;
                break;
                case HORI_INSIDE:
                    nId = STR_HORI_INSIDE;
                break;
                case HORI_OUTSIDE:
                    nId = STR_HORI_OUTSIDE;
                break;
                case HORI_FULL:
                    nId = STR_HORI_FULL;
                break;
            }
            if ( nId )
                rText += SW_RESSTR( nId );
            return ePres;
        }
    }
    return SFX_ITEM_PRESENTATION_NONE;
}

//FlyAnchor, Anker des Freifliegenden Rahmen ----


SfxItemPresentation SwFmtAnchor::GetPresentation
(
    SfxItemPresentation ePres,
    SfxMapUnit          eCoreUnit,
    SfxMapUnit          ePresUnit,
    String&             rText,
    const International*        pIntl
)   const
{
    switch ( ePres )
    {
        case SFX_ITEM_PRESENTATION_NONE:
            rText.Erase();
            break;
        case SFX_ITEM_PRESENTATION_NAMELESS:
        case SFX_ITEM_PRESENTATION_COMPLETE:
        {
            USHORT nId = 0;
            switch ( GetAnchorId() )
            {
                case FLY_AT_CNTNT:      //Absatzgebundener Rahmen
                    nId = STR_FLY_AT_CNTNT;
                    break;
                case FLY_IN_CNTNT:      //Zeichengebundener Rahmen
                    nId = STR_FLY_IN_CNTNT;
                    break;
                case FLY_PAGE:          //Seitengebundener Rahmen
                    nId = STR_FLY_PAGE;
                    break;
            }
            if ( nId )
                rText += SW_RESSTR( nId );
            return ePres;
        }
    }
    return SFX_ITEM_PRESENTATION_NONE;
}


SfxItemPresentation SwFmtPageDesc::GetPresentation
(
    SfxItemPresentation ePres,
    SfxMapUnit          eCoreUnit,
    SfxMapUnit          ePresUnit,
    String&             rText,
    const International*        pIntl
)   const
{
    switch ( ePres )
    {
        case SFX_ITEM_PRESENTATION_NONE:
            rText.Erase();
            break;
        case SFX_ITEM_PRESENTATION_NAMELESS:
        case SFX_ITEM_PRESENTATION_COMPLETE:
        {
            const SwPageDesc *pPageDesc = GetPageDesc();
            if ( pPageDesc )
                rText = pPageDesc->GetName();
            else
                rText = SW_RESSTR( STR_NO_PAGEDESC );
            return ePres;
        }
    }
    return SFX_ITEM_PRESENTATION_NONE;
}

//Der ColumnDescriptor --------------------------


SfxItemPresentation SwFmtCol::GetPresentation
(
    SfxItemPresentation ePres,
    SfxMapUnit          eCoreUnit,
    SfxMapUnit          ePresUnit,
    String&             rText,
    const International*        pIntl
)   const
{
    switch ( ePres )
    {
        case SFX_ITEM_PRESENTATION_NONE:
            rText.Erase();
            break;
        case SFX_ITEM_PRESENTATION_NAMELESS:
        case SFX_ITEM_PRESENTATION_COMPLETE:
        {
            USHORT nCnt = GetNumCols();
            if ( nCnt > 1 )
            {
                rText = String::CreateFromInt32(nCnt);
                rText += ' ';
                rText += SW_RESSTR( STR_COLUMNS );
                if ( COLADJ_NONE != GetLineAdj() )
                {
                    USHORT nWdth = USHORT(GetLineWidth());
                    rText += ' ';
                    rText += SW_RESSTR( STR_LINE_WIDTH );
                    rText += ' ';
                    rText += ::GetMetricText( nWdth, eCoreUnit,
                                              SFX_MAPUNIT_POINT );
                }
            }
            else
                rText.Erase();
            return ePres;
        }
    }
    return SFX_ITEM_PRESENTATION_NONE;
}

//URL's und Maps


SfxItemPresentation SwFmtURL::GetPresentation
(
    SfxItemPresentation ePres,
    SfxMapUnit          eCoreUnit,
    SfxMapUnit          ePresUnit,
    String&             rText,
    const International*        pIntl
)   const
{
    rText.Erase();
    switch ( ePres )
    {
        case SFX_ITEM_PRESENTATION_NONE:
            break;
        case SFX_ITEM_PRESENTATION_NAMELESS:
        case SFX_ITEM_PRESENTATION_COMPLETE:
        {
            if ( pMap )
                rText.AppendAscii( RTL_CONSTASCII_STRINGPARAM("Client-Map"));
            if ( sURL.Len() )
            {
                if ( pMap )
                    rText.AppendAscii( RTL_CONSTASCII_STRINGPARAM(" - "));
                rText.AppendAscii( RTL_CONSTASCII_STRINGPARAM("URL: "));
                rText += sURL;
                if ( bIsServerMap )
                    rText.AppendAscii( RTL_CONSTASCII_STRINGPARAM(" (Server-Map)"));
            }
            if ( sTargetFrameName.Len() )
            {
                rText.AppendAscii( RTL_CONSTASCII_STRINGPARAM(", Target: "));
                rText += sTargetFrameName;
            }
            return ePres;
        }
    }
    return SFX_ITEM_PRESENTATION_NONE;
}


//SwFmtEditInReadonly


SfxItemPresentation SwFmtEditInReadonly::GetPresentation
(
    SfxItemPresentation ePres,
    SfxMapUnit          eCoreUnit,
    SfxMapUnit          ePresUnit,
    String&             rText,
    const International*        pIntl
)   const
{
    rText.Erase();
    switch ( ePres )
    {
        case SFX_ITEM_PRESENTATION_NONE:
            rText.Erase();
            break;
        case SFX_ITEM_PRESENTATION_NAMELESS:
        case SFX_ITEM_PRESENTATION_COMPLETE:
        {
            if ( GetValue() )
                rText = SW_RESSTR(STR_EDIT_IN_READONLY);
            return ePres;
        }
    }
    return SFX_ITEM_PRESENTATION_NONE;
}


SfxItemPresentation SwFmtLayoutSplit::GetPresentation
(
    SfxItemPresentation ePres,
    SfxMapUnit          eCoreUnit,
    SfxMapUnit          ePresUnit,
    String&             rText,
    const International*        pIntl
)   const
{
    switch ( ePres )
    {
        case SFX_ITEM_PRESENTATION_NONE:
            rText.Erase();
            return SFX_ITEM_PRESENTATION_NONE;
        case SFX_ITEM_PRESENTATION_NAMELESS:
        case SFX_ITEM_PRESENTATION_COMPLETE:
        {
            if ( GetValue() )
                rText = SW_RESSTR(STR_LAYOUT_SPLIT);
            return ePres;
        }
    }
    return SFX_ITEM_PRESENTATION_NONE;
}

SfxItemPresentation SwFmtFtnEndAtTxtEnd::GetPresentation
(
    SfxItemPresentation ePres,
    SfxMapUnit          eCoreUnit,
    SfxMapUnit          ePresUnit,
    String&             rText,
    const International*        pIntl
)   const
{
    switch ( ePres )
    {
        case SFX_ITEM_PRESENTATION_NONE:
            rText.Erase();
            break;

        case SFX_ITEM_PRESENTATION_NAMELESS:
        case SFX_ITEM_PRESENTATION_COMPLETE:
            {
                switch( GetValue() )
                {
                case FTNEND_ATPGORDOCEND:
//                  rText = SW_RESSTR( STR_LAYOUT_FTN );
                    break;

                case FTNEND_ATTXTEND:
                    break;

                case FTNEND_ATTXTEND_OWNNUMSEQ:
                    {
//  String      sPrefix;
//  String      sSuffix;
//  SwNumType   aFmt;
//  USHORT      nOffset;
//                      rText +=
                    }
                    break;
                }
            }
            break;

        default:
            ePres = SFX_ITEM_PRESENTATION_NONE;
            break;
    }
    return ePres;
}

SfxItemPresentation SwFmtChain::GetPresentation
(
    SfxItemPresentation ePres,
    SfxMapUnit          eCoreUnit,
    SfxMapUnit          ePresUnit,
    String&             rText,
    const International*        pIntl
)   const
{
    switch ( ePres )
    {
        case SFX_ITEM_PRESENTATION_NONE:
            rText.Erase();
            return SFX_ITEM_PRESENTATION_NONE;
        case SFX_ITEM_PRESENTATION_NAMELESS:
        case SFX_ITEM_PRESENTATION_COMPLETE:
        {
            if ( GetPrev() || GetNext() )
            {
                rText = SW_RESSTR(STR_CONNECT1);
                if ( GetPrev() )
                {
                    rText += GetPrev()->GetName();
                    if ( GetNext() )
                        rText += SW_RESSTR(STR_CONNECT2);
                }
                if ( GetNext() )
                    rText += GetNext()->GetName();
            }
            return ePres;
        }
    }
    return SFX_ITEM_PRESENTATION_NONE;
}


SfxItemPresentation SwFmtLineNumber::GetPresentation
(
    SfxItemPresentation ePres,
    SfxMapUnit          eCoreUnit,
    SfxMapUnit          ePresUnit,
    String&             rText,
    const International*    pIntl
)   const
{
    switch ( ePres )
    {
        case SFX_ITEM_PRESENTATION_NONE:
            rText.Erase();
            return SFX_ITEM_PRESENTATION_NONE;
        case SFX_ITEM_PRESENTATION_NAMELESS:
        case SFX_ITEM_PRESENTATION_COMPLETE:
        {
            if ( IsCount() )
                rText += SW_RESSTR(STR_LINECOUNT);
            else
                rText += SW_RESSTR(STR_DONTLINECOUNT);
            if ( GetStartValue() )
            {
                rText += ' ';
                rText += SW_RESSTR(STR_LINCOUNT_START);
                rText += String::CreateFromInt32(GetStartValue());
            }
            return ePres;
        }
    }
    return SFX_ITEM_PRESENTATION_NONE;
}

// ---------------------- Grafik-Attribute --------------------------

SfxItemPresentation SwMirrorGrf::GetPresentation(
    SfxItemPresentation ePres, SfxMapUnit eCoreUnit, SfxMapUnit ePresUnit,
    String& rText, const International* pIntl ) const
{
    switch ( ePres )
    {
    case SFX_ITEM_PRESENTATION_NAMELESS:
    case SFX_ITEM_PRESENTATION_COMPLETE:
        {
            USHORT nId;
            switch( GetValue() )
            {
            case RES_DONT_MIRROR_GRF:   nId = STR_NO_MIRROR;    break;
            case RES_MIRROR_GRF_VERT:   nId = STR_VERT_MIRROR;  break;
            case RES_MIRROR_GRF_HOR:    nId = STR_HORI_MIRROR;  break;
            case RES_MIRROR_GRF_BOTH:   nId = STR_BOTH_MIRROR;  break;
            default:                    nId = 0;    break;
            }
            if ( nId )
            {
                rText = SW_RESSTR( nId );
                if (bGrfToggle)
                    rText += SW_RESSTR( STR_MIRROR_TOGGLE );
            }
        }
        break;
    default:
        ePres = SFX_ITEM_PRESENTATION_NONE;
        rText.Erase();
        break;
    }
    return ePres;
}


SfxItemPresentation SwRotationGrf::GetPresentation(
    SfxItemPresentation ePres, SfxMapUnit eCoreUnit, SfxMapUnit ePresUnit,
    String &rText, const International* pIntl) const
{
    switch( ePres )
    {
    case SFX_ITEM_PRESENTATION_NAMELESS:
    case SFX_ITEM_PRESENTATION_COMPLETE:
        if( SFX_ITEM_PRESENTATION_COMPLETE == ePres )
            rText = SW_RESSTR( STR_ROTATION );
        else if( rText.Len() )
            rText.Erase();
        ( rText += UniString::CreateFromInt32( GetValue() )) += '°';
        break;

    default:
        ePres = SFX_ITEM_PRESENTATION_NONE;
        rText.Erase();
        break;
    }
    return ePres;
}

SfxItemPresentation SwLuminanceGrf::GetPresentation(
    SfxItemPresentation ePres, SfxMapUnit eCoreUnit, SfxMapUnit ePresUnit,
    String &rText, const International* pIntl) const
{
    switch( ePres )
    {
    case SFX_ITEM_PRESENTATION_NAMELESS:
    case SFX_ITEM_PRESENTATION_COMPLETE:
        if( SFX_ITEM_PRESENTATION_COMPLETE == ePres )
            rText = SW_RESSTR( STR_LUMINANCE );
        else if( rText.Len() )
            rText.Erase();
        ( rText += UniString::CreateFromInt32( GetValue() )) += '%';
        break;

    default:
        ePres = SFX_ITEM_PRESENTATION_NONE;
        rText.Erase();
        break;
    }
    return ePres;
}

SfxItemPresentation SwContrastGrf::GetPresentation(
    SfxItemPresentation ePres, SfxMapUnit eCoreUnit, SfxMapUnit ePresUnit,
    String &rText, const International* pIntl) const
{
    switch( ePres )
    {
    case SFX_ITEM_PRESENTATION_NAMELESS:
    case SFX_ITEM_PRESENTATION_COMPLETE:
        if( SFX_ITEM_PRESENTATION_COMPLETE == ePres )
            rText = SW_RESSTR( STR_CONTRAST );
        else if( rText.Len() )
            rText.Erase();
        ( rText += UniString::CreateFromInt32( GetValue() )) += '%';
        break;

    default:
        ePres = SFX_ITEM_PRESENTATION_NONE;
        rText.Erase();
        break;
    }
    return ePres;
}

SfxItemPresentation SwChannelGrf::GetPresentation(
    SfxItemPresentation ePres, SfxMapUnit eCoreUnit, SfxMapUnit ePresUnit,
    String &rText, const International* pIntl) const
{
    switch( ePres )
    {
    case SFX_ITEM_PRESENTATION_NAMELESS:
    case SFX_ITEM_PRESENTATION_COMPLETE:
        if( SFX_ITEM_PRESENTATION_COMPLETE == ePres )
        {
            USHORT nId;
            switch ( Which() )
            {
            case RES_GRFATR_CHANNELR:   nId = STR_CHANNELR; break;
            case RES_GRFATR_CHANNELG:   nId = STR_CHANNELG; break;
            case RES_GRFATR_CHANNELB:   nId = STR_CHANNELB; break;
            default:                    nId = 0; break;
            }
            if( nId )
                rText = SW_RESSTR( nId );
            else if( rText.Len() )
                rText.Erase();
        }
        else if( rText.Len() )
            rText.Erase();
        ( rText += UniString::CreateFromInt32( GetValue() )) += '%';
        break;

    default:
        ePres = SFX_ITEM_PRESENTATION_NONE;
        rText.Erase();
        break;
    }
    return ePres;
}

SfxItemPresentation SwGammaGrf::GetPresentation(
    SfxItemPresentation ePres, SfxMapUnit eCoreUnit, SfxMapUnit ePresUnit,
    String &rText, const International* pIntl) const
{
    switch( ePres )
    {
    case SFX_ITEM_PRESENTATION_NAMELESS:
    case SFX_ITEM_PRESENTATION_COMPLETE:
        if( SFX_ITEM_PRESENTATION_COMPLETE == ePres )
            rText = SW_RESSTR( STR_GAMMA );
        else if( rText.Len() )
            rText.Erase();
        ( rText += UniString::CreateFromDouble( GetValue() )) += '%';
        break;

    default:
        ePres = SFX_ITEM_PRESENTATION_NONE;
        rText.Erase();
        break;
    }
    return ePres;
}

SfxItemPresentation SwInvertGrf::GetPresentation(
    SfxItemPresentation ePres, SfxMapUnit eCoreUnit, SfxMapUnit ePresUnit,
    String &rText, const International* pIntl) const
{
    rText.Erase();
    switch( ePres )
    {
    case SFX_ITEM_PRESENTATION_NAMELESS:
    case SFX_ITEM_PRESENTATION_COMPLETE:
        if( SFX_ITEM_PRESENTATION_COMPLETE == ePres )
        {
            USHORT nId = 0 != GetValue() ? STR_INVERT : STR_INVERT_NOT;
            rText = SW_RESSTR( nId );
        }
        break;

    default:
        ePres = SFX_ITEM_PRESENTATION_NONE;
        break;
    }
    return ePres;
}

SfxItemPresentation SwTransparencyGrf::GetPresentation(
    SfxItemPresentation ePres, SfxMapUnit eCoreUnit, SfxMapUnit ePresUnit,
    String &rText, const International* pIntl) const
{
    switch( ePres )
    {
    case SFX_ITEM_PRESENTATION_NAMELESS:
    case SFX_ITEM_PRESENTATION_COMPLETE:
        if( SFX_ITEM_PRESENTATION_COMPLETE == ePres )
            rText = SW_RESSTR( STR_TRANSPARENCY );
        else if( rText.Len() )
            rText.Erase();
        ( rText += UniString::CreateFromInt32( GetValue() )) += '%';
        break;

    default:
        ePres = SFX_ITEM_PRESENTATION_NONE;
        rText.Erase();
        break;
    }
    return ePres;
}

SfxItemPresentation SwDrawModeGrf::GetPresentation(
    SfxItemPresentation ePres, SfxMapUnit eCoreUnit, SfxMapUnit ePresUnit,
    String &rText, const International* pIntl) const
{
    rText.Erase();
    switch( ePres )
    {
    case SFX_ITEM_PRESENTATION_NAMELESS:
    case SFX_ITEM_PRESENTATION_COMPLETE:
        if( SFX_ITEM_PRESENTATION_COMPLETE == ePres )
        {
            USHORT nId;
            switch ( GetValue() )
            {

            case GRAPHICDRAWMODE_GREYS:     nId = STR_DRAWMODE_GREY; break;
            case GRAPHICDRAWMODE_MONO:      nId = STR_DRAWMODE_BLACKWHITE; break;
            case GRAPHICDRAWMODE_WATERMARK: nId = STR_DRAWMODE_WATERMARK; break;
            default:                        nId = STR_DRAWMODE_STD; break;
            }
            (rText = SW_RESSTR( STR_DRAWMODE ) ) += SW_RESSTR( nId );
        }
        break;

    default:
        ePres = SFX_ITEM_PRESENTATION_NONE;
        break;
    }
    return ePres;
}

/*************************************************************************

      $Log: not supported by cvs2svn $
      Revision 1.48  2000/09/18 16:06:16  willem.vandorp
      OpenOffice header added.

      Revision 1.47  2000/08/25 12:31:48  jp
      Graphic Crop-Attribut exported to SVX

      Revision 1.46  2000/08/02 09:23:10  jp
      GetPresentation for the graphic attributes

      Revision 1.45  2000/07/31 19:25:51  jp
      new attributes for CJK/CTL and graphic

      Revision 1.44  2000/05/23 19:54:12  jp
      Bugfixes for Unicode

      Revision 1.43  2000/05/23 15:34:11  jp
      Bugfixes for Unicode

      Revision 1.42  2000/04/26 15:03:20  os
      GetName() returns const String&

      Revision 1.41  2000/04/18 15:14:08  os
      UNICODE

      Revision 1.40  2000/03/03 15:17:05  os
      StarView remainders removed

      Revision 1.39  2000/02/11 15:00:14  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.38  1999/11/08 17:48:15  jp
      new attribut: Foot-/Endnote at section end

      Revision 1.37  1999/09/01 08:41:58  OS
      #66082# GetPresentation: new Parameter


      Rev 1.36   01 Sep 1999 10:41:58   OS
   #66082# GetPresentation: new Parameter

      Rev 1.35   19 Mar 1999 13:40:00   OS
   #63701# unbenutztes Break-Attribut aus den Sections entfernt

      Rev 1.34   04 Feb 1998 14:09:44   MA
   new: SwFmtLineNumber

      Rev 1.33   20 Jan 1998 15:14:16   OM
   Grafiken auf geraden Seiten spiegeln

      Rev 1.32   15 Dec 1997 16:26:06   AMA
   New: SwSectItem: Soll der uebergeordnete Bereich aufgebrochen werden?

      Rev 1.31   29 Nov 1997 15:08:58   MA
   includes

      Rev 1.30   21 Nov 1997 12:08:58   MA
   includes

      Rev 1.29   20 Nov 1997 12:13:36   AMA
   Opt. SwSurround: GoldCut jetzt als Enum; nicht implementierte Enums entfernt

      Rev 1.28   03 Nov 1997 13:59:28   MA
   precomp entfernt

      Rev 1.27   31 Oct 1997 14:41:20   MA
   Chain

      Rev 1.26   28 Oct 1997 13:56:58   MA
   Connect-Attribut

      Rev 1.25   23 Oct 1997 12:00:30   JP
   Numerierung aufs Attribut/Format-Konzept umstellen

      Rev 1.24   15 Aug 1997 12:16:06   OS
   chartar/frmatr/txtatr aufgeteilt

      Rev 1.23   11 Apr 1997 13:06:34   MA
   new: Layout-Split

      Rev 1.22   18 Feb 1997 13:36:16   MA
   new: Rahmen in Readonly editierbar

      Rev 1.21   11 Nov 1996 10:54:16   MA
   ResMgr

      Rev 1.20   29 Oct 1996 18:33:12   HJS
   includes

      Rev 1.19   01 Oct 1996 16:51:28   MA
   chg: Map und URL gleichzeitig

      Rev 1.18   11 Sep 1996 16:51:36   MA
   new: Umlauf nur Anker

      Rev 1.17   28 Aug 1996 15:42:34   OS
   includes

      Rev 1.16   02 Aug 1996 14:57:28   AMA
   New: INet-Felder werden zu attributiertem Text.

      Rev 1.15   23 Jul 1996 11:02:50   AMA
   Opt: SwRegisterItem statt Svx..Item

      Rev 1.14   23 Jul 1996 10:49:58   AMA
   Opt: SwRegisterItem statt Svx..Item

      Rev 1.13   22 Jul 1996 12:53:50   MA
   new: SwFmtURL

      Rev 1.12   18 Jun 1996 16:59:30   OS
   ui_pch includen

      Rev 1.11   14 Jun 1996 14:31:04   MA
   chg: neue Version Prozentangaben

      Rev 1.10   12 Jun 1996 16:05:12   MA
   new: percent fuer framesize

      Rev 1.9   13 Apr 1996 15:34:12   MA
   chg: Neue Ausrichtung fuer Zeichengebunde Rahmen

      Rev 1.8   22 Mar 1996 15:18:36   HJS
   umstellung 311

      Rev 1.7   24 Nov 1995 16:57:24   OM
   PCH->PRECOMPILED

*************************************************************************/


diff --git a/sw/source/ui/utlui/attrdesc.hrc b/sw/source/ui/utlui/attrdesc.hrc
new file mode 100644
index 0000000..0434b22
--- /dev/null
+++ b/sw/source/ui/utlui/attrdesc.hrc
@@ -0,0 +1,149 @@
/*************************************************************************
 *
 *  $RCSfile: attrdesc.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:49 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _ATTRDESC_HRC
#define _ATTRDESC_HRC

#include "rcid.hrc"

#define STR_DROP_OVER                   (RC_ATTR_BEGIN + 1)
#define STR_DROP_LINES                  (RC_ATTR_BEGIN + 2)
#define STR_NO_DROP_LINES               (RC_ATTR_BEGIN + 3)
#define STR_NO_PAGEDESC                 (RC_ATTR_BEGIN + 4)
#define STR_NO_MIRROR                   (RC_ATTR_BEGIN + 5)
#define STR_VERT_MIRROR                 (RC_ATTR_BEGIN + 6)
#define STR_HORI_MIRROR                 (RC_ATTR_BEGIN + 7)
#define STR_BOTH_MIRROR                 (RC_ATTR_BEGIN + 8)
#define STR_CHARFMT                     (RC_ATTR_BEGIN + 9)
#define STR_NO_CHARFMT                  (RC_ATTR_BEGIN + 10)
#define STR_FOOTER                      (RC_ATTR_BEGIN + 11)
#define STR_NO_FOOTER                   (RC_ATTR_BEGIN + 12)
#define STR_HEADER                      (RC_ATTR_BEGIN + 13)
#define STR_NO_HEADER                   (RC_ATTR_BEGIN + 14)
#define STR_SURROUND_NONE               (RC_ATTR_BEGIN + 15)
#define STR_SURROUND_THROUGHT           (RC_ATTR_BEGIN + 16)
#define STR_SURROUND_PARALLEL           (RC_ATTR_BEGIN + 17)
#define STR_SURROUND_COLUMN             (RC_ATTR_BEGIN + 18)
#define STR_SURROUND_LEFT               (RC_ATTR_BEGIN + 19)
#define STR_SURROUND_RIGHT              (RC_ATTR_BEGIN + 20)
#define STR_SURROUND_INSIDE             (RC_ATTR_BEGIN + 21)
#define STR_SURROUND_OUTSIDE            (RC_ATTR_BEGIN + 22)
#define STR_FRM_WIDTH                   (RC_ATTR_BEGIN + 23)
#define STR_FRM_FIXEDHEIGHT             (RC_ATTR_BEGIN + 24)
#define STR_FRM_MINHEIGHT               (RC_ATTR_BEGIN + 25)
#define STR_FLY_AT_CNTNT                (RC_ATTR_BEGIN + 26)
#define STR_FLY_IN_CNTNT                (RC_ATTR_BEGIN + 27)
#define STR_FLY_PAGE                    (RC_ATTR_BEGIN + 28)
#define STR_POS_X                       (RC_ATTR_BEGIN + 29)
#define STR_POS_Y                       (RC_ATTR_BEGIN + 30)
#define STR_VERT_TOP                    (RC_ATTR_BEGIN + 31)
#define STR_VERT_CENTER                 (RC_ATTR_BEGIN + 32)
#define STR_VERT_BOTTOM                 (RC_ATTR_BEGIN + 33)
#define STR_HORI_RIGHT                  (RC_ATTR_BEGIN + 34)
#define STR_HORI_CENTER                 (RC_ATTR_BEGIN + 35)
#define STR_HORI_LEFT                   (RC_ATTR_BEGIN + 36)
#define STR_HORI_INSIDE                 (RC_ATTR_BEGIN + 37)
#define STR_HORI_OUTSIDE                (RC_ATTR_BEGIN + 38)
#define STR_HORI_FULL                   (RC_ATTR_BEGIN + 39)
#define STR_COLUMNS                     (RC_ATTR_BEGIN + 40)
#define STR_LINE_WIDTH                  (RC_ATTR_BEGIN + 41)
#define STR_MAX_FTN_HEIGHT              (RC_ATTR_BEGIN + 42)
#define STR_SURROUND_IDEAL              (RC_ATTR_BEGIN + 43)
#define STR_LINE_TOP                    (RC_ATTR_BEGIN + 44)
#define STR_LINE_CENTER                 (RC_ATTR_BEGIN + 45)
#define STR_LINE_BOTTOM                 (RC_ATTR_BEGIN + 46)
#define STR_REGISTER_ON                 (RC_ATTR_BEGIN + 47)
#define STR_REGISTER_OFF                (RC_ATTR_BEGIN + 48)
#define STR_SURROUND_ANCHORONLY         (RC_ATTR_BEGIN + 49)
#define STR_EDIT_IN_READONLY            (RC_ATTR_BEGIN + 50)
#define STR_LAYOUT_SPLIT                (RC_ATTR_BEGIN + 51)
#define STR_NUMRULE_ON                  (RC_ATTR_BEGIN + 52)
#define STR_NUMRULE_OFF                 (RC_ATTR_BEGIN + 53)
#define STR_CONNECT1                    (RC_ATTR_BEGIN + 54)
#define STR_CONNECT2                    (RC_ATTR_BEGIN + 55)
#define STR_MIRROR_TOGGLE               (RC_ATTR_BEGIN + 56)
#define STR_LINECOUNT                   (RC_ATTR_BEGIN + 57)
#define STR_DONTLINECOUNT               (RC_ATTR_BEGIN + 58)
#define STR_LINCOUNT_START              (RC_ATTR_BEGIN + 59)

#define STR_LUMINANCE                   (RC_ATTR_BEGIN + 60)
#define STR_CHANNELR                    (RC_ATTR_BEGIN + 61)
#define STR_CHANNELG                    (RC_ATTR_BEGIN + 62)
#define STR_CHANNELB                    (RC_ATTR_BEGIN + 63)
#define STR_CONTRAST                    (RC_ATTR_BEGIN + 64)
#define STR_GAMMA                       (RC_ATTR_BEGIN + 65)
#define STR_TRANSPARENCY                (RC_ATTR_BEGIN + 66)
#define STR_INVERT                      (RC_ATTR_BEGIN + 67)
#define STR_INVERT_NOT                  (RC_ATTR_BEGIN + 68)
#define STR_DRAWMODE                    (RC_ATTR_BEGIN + 69)
#define STR_DRAWMODE_STD                (RC_ATTR_BEGIN + 70)
#define STR_DRAWMODE_GREY               (RC_ATTR_BEGIN + 71)
#define STR_DRAWMODE_BLACKWHITE         (RC_ATTR_BEGIN + 72)
#define STR_DRAWMODE_WATERMARK          (RC_ATTR_BEGIN + 73)
#define STR_ROTATION                    (RC_ATTR_BEGIN + 74)

#define ATTR_ACT_END                    STR_DRAWMODE_WATERMARK

#if ATTR_ACT_END > RC_ATTR_END
#error Resource-Id Ueberlauf in #file, #line
#endif

#endif
diff --git a/sw/source/ui/utlui/attrdesc.src b/sw/source/ui/utlui/attrdesc.src
new file mode 100644
index 0000000..20d3078
--- /dev/null
+++ b/sw/source/ui/utlui/attrdesc.src
@@ -0,0 +1,1953 @@
/*************************************************************************
 *
 *  $RCSfile: attrdesc.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:49 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "globals.hrc"
#include "attrdesc.hrc"
/*---------------------------------------------------------------------
    Strings fuer textuelle Attribute
 ---------------------------------------------------------------------*/
String STR_DROP_OVER
{
    /* ### ACHTUNG: Neuer Text in Resource? Initialen über : Initialen ³ber */
    TEXT = "Initialen über" ;
    TEXT [ English ] = "dropcaps about" ;
    Text [ english_us ] = "Drop Caps over" ;
    Text [ italian ] = "Capolettera su" ;
    Text [ spanish ] = "Líneas para iniciales" ;
    Text [ french ] = "Lettrines sur" ;
    Text [ dutch ] = "Initialen over" ;
    Text [ swedish ] = "Anfangsbokstäver över" ;
    Text [ danish ] = "initialer på" ;
    Text [ portuguese ] = "Iniciais sobre" ;
    Text [ portuguese_brazilian ] = "Initialen über" ;
    Text[ chinese_simplified ] = "´óд×Öĸ£¬¸ß¶ÈµÈÓÚ";
    Text[ russian ] = "Èíèöèàëû íàä";
    Text[ polish ] = "Inicja³y nad";
    Text[ japanese ] = "ÄÞÛ¯Ìß·¬¯Ìß";
    Text[ chinese_traditional ] = "¤j¼g¦r¥À¡A°ª«×µ¥©ó";
    Text[ arabic ] = "ÃÍÑÝ ÇÓÊåáÇáíÉ ÝæÞ";
    Text[ dutch ] = "Initialen over";
    Text[ chinese_simplified ] = "´óд×Öĸ£¬¸ß¶ÈµÈÓÚ";
    Text[ greek ] = "Êåöáëáßá ðÜíù";
    Text[ korean ] = "´Ü¶ôÀÇ Ã¹¹®ÀÚ Àå½Ä À§Ä¡";
    Text[ turkish ] = "Baþharfi/leri büyüt";
    Text[ language_user1 ] = " ";
};
String STR_DROP_LINES
{
    TEXT = "Zeilen" ;
    TEXT [ English ] = "lines" ;
    Text [ english_us ] = "rows" ;
    Text [ italian ] = "Righe" ;
    Text [ spanish ] = "Filas" ;
    Text [ french ] = "lignes" ;
    Text [ dutch ] = "Regels" ;
    Text [ swedish ] = "Rader" ;
    Text [ danish ] = "rækker" ;
    Text [ portuguese ] = "Linhas" ;
    Text [ portuguese_brazilian ] = "Zeilen" ;
    Text[ chinese_simplified ] = "ÐÐ";
    Text[ russian ] = "Ñòðîêè";
    Text[ polish ] = "Wiersze";
    Text[ japanese ] = "s";
    Text[ chinese_traditional ] = "¦æ";
    Text[ arabic ] = "ÇáÕÝæÝ";
    Text[ dutch ] = "Regels";
    Text[ chinese_simplified ] = "ÐÐ";
    Text[ greek ] = "ÃñáììÝò";
    Text[ korean ] = "Çà";
    Text[ turkish ] = "Satýr";
    Text[ language_user1 ] = " ";
};
String STR_NO_DROP_LINES
{
    TEXT = "keine Initialen" ;
    TEXT [ English ] = "no dropcaps" ;
    Text [ dutch ] = "geen initialen" ;
    Text [ english_us ] = "No Drop Caps" ;
    Text [ italian ] = "senza capolettera" ;
    Text [ spanish ] = "Sin iniciales" ;
    Text [ french ] = "Pas de lettrine" ;
    Text [ swedish ] = "inga anfangsbokstäver" ;
    Text [ danish ] = "ingen initialer" ;
    Text [ portuguese ] = "Sem iniciais" ;
    Text [ portuguese_brazilian ] = "keine Initialen" ;
    Text[ chinese_simplified ] = "×ÖÊײ»´óд";
    Text[ russian ] = "Áåç èíèöèàëîâ";
    Text[ polish ] = "Bez inicja³ów";
    Text[ japanese ] = "ÄÞÛ¯Ìß·¬¯Ì߂Ȃµ";
    Text[ chinese_traditional ] = "¦r­º¤£¤j¼g";
    Text[ arabic ] = "ÈÏæä ÃÍÑÝ ÇÓÊåáÇáíÉ";
    Text[ dutch ] = "geen initialen";
    Text[ chinese_simplified ] = "×ÖÊײ»´óд";
    Text[ greek ] = "÷ùñßò êåöáëáßá";
    Text[ korean ] = "´Ü¶ô ù¹®ÀÚ Àå½Ä ¾øÀ½";
    Text[ turkish ] = "Baþharf yok";
    Text[ language_user1 ] = " ";
};
String STR_NO_PAGEDESC
{
    TEXT = "kein Seitenumbruch" ;
    TEXT [ English ] = "no page break" ;
    Text [ dutch ] = "geen pagina-einde" ;
    Text [ english_us ] = "No page break" ;
    Text [ italian ] = "Senza interruzione di pagina" ;
    Text [ spanish ] = "sin salto de página" ;
    Text [ french ] = "Aucun saut de page" ;
    Text [ swedish ] = "ingen sidbrytning" ;
    Text [ danish ] = "ingen sideskift" ;
    Text [ portuguese ] = "Sem quebra de página" ;
    Text [ portuguese_brazilian ] = "kein Seitenumbruch" ;
    Text[ chinese_simplified ] = "²»»»Ò³";
    Text[ russian ] = "áåç ðàçðûâà ñòðàíèö";
    Text[ polish ] = "Bez ³amania strony";
    Text[ japanese ] = "‰üÍß°¼Þ‚È‚µ";
    Text[ chinese_traditional ] = "¤£´«­¶";
    Text[ arabic ] = "ÈÏæä ÝæÇÕá ÕÝÍÇÊ";
    Text[ dutch ] = "geen pagina-einde";
    Text[ chinese_simplified ] = "²»»»Ò³";
    Text[ greek ] = "íá ìçí ãßíåé áëëáãÞ óåëßäáò";
    Text[ korean ] = "ÆäÀÌÁö ³ª´©±â°¡ ¾ø½À´Ï´Ù.";
    Text[ turkish ] = "Sayfa sonu yok";
    Text[ language_user1 ] = " ";
};
String STR_NO_MIRROR
{
    TEXT = "nicht Spiegeln" ;
    TEXT [ English ] = "no mirror" ;
    Text [ dutch ] = "niet spiegelen" ;
    Text [ english_us ] = "Don't mirror" ;
    Text [ italian ] = "Non rispecchiare" ;
    Text [ spanish ] = "No reflejar" ;
    Text [ french ] = "Ne pas refléter" ;
    Text [ swedish ] = "inte spegla" ;
    Text [ danish ] = "spejlvend ikke" ;
    Text [ portuguese ] = "Não reflectir" ;
    Text [ portuguese_brazilian ] = "nicht Spiegeln" ;
    Text[ chinese_simplified ] = "²»·´Ó³";
    Text[ russian ] = "íå îòîáðàæàòü";
    Text[ polish ] = "Nie przerzucaj";
    Text[ japanese ] = "”½“]‚µ‚È‚¢";
    Text[ chinese_traditional ] = "¤£¤Ï¬M";
    Text[ arabic ] = "ÚÏã ÇáÇäÚßÇÓ";
    Text[ dutch ] = "niet spiegelen";
    Text[ chinese_simplified ] = "²»·´Ó³";
    Text[ greek ] = "Íá ìçí ãßíåé áíôáíÜêëáóç";
    Text[ korean ] = "´ëĪ ¾ÈÇÔ";
    Text[ turkish ] = "Yansýtma";
    Text[ language_user1 ] = " ";
};
String STR_VERT_MIRROR
{
    TEXT = "vertikal Spiegeln" ;
    TEXT [ English ] = "mirror vertically" ;
    Text [ dutch ] = "verticaal spiegelen" ;
    Text [ english_us ] = "Flip vertical" ;
    Text [ italian ] = "Rispecchia verticalmente" ;
    Text [ spanish ] = "Reflejar vertical" ;
    Text [ french ] = "Refléter verticalement" ;
    Text [ swedish ] = "spegla vertikalt" ;
    Text [ danish ] = "spejlvend lodret" ;
    Text [ portuguese ] = "Reflectir na vertical" ;
    Text [ portuguese_brazilian ] = "vertikal Spiegeln" ;
    Text[ chinese_simplified ] = "´¹Ö±·½Ïò·´Ó³";
    Text[ russian ] = "Îòîáðàçèòü ïî âåðòèêàëè";
    Text[ polish ] = "Przerzuæ w pionie";
    Text[ japanese ] = "¶‰E”½“]";
    Text[ chinese_traditional ] = "««ª½¤Ï¬M";
    Text[ arabic ] = "ÇäÚßÇÓ ÑÃÓí";
    Text[ dutch ] = "verticaal spiegelen";
    Text[ chinese_simplified ] = "´¹Ö±·½Ïò·´Ó³";
    Text[ greek ] = "ïñéæüíôéá áíáóôñïöÞ";
    Text[ korean ] = "¼öÁ÷ ´ëĪ";
    Text[ turkish ] = "Dikey yansýt";
    Text[ language_user1 ] = " ";
};
String STR_HORI_MIRROR
{
    TEXT = "horizontal Spiegeln" ;
    TEXT [ English ] = "mirror horizontally" ;
    Text [ dutch ] = "horizontaal spiegelen" ;
    Text [ english_us ] = "Flip horizontal" ;
    Text [ italian ] = "Rispecchia orizzontalmente" ;
    Text [ spanish ] = "Reflejar horizontal" ;
    Text [ french ] = "Refléter horizontalement" ;
    Text [ swedish ] = "Spegla horisontellt" ;
    Text [ danish ] = "spejlvend vandret" ;
    Text [ portuguese ] = "Reflectir na horizontal" ;
    Text [ portuguese_brazilian ] = "horizontal Spiegeln" ;
    Text[ chinese_simplified ] = "ˮƽ·½Ïò·´Ó³";
    Text[ russian ] = "Îòîáðàçèòü ïî âåðòèêàëè";
    Text[ polish ] = "Przerzuæ w poziomie";
    Text[ japanese ] = "ã‰º”½“]";
    Text[ chinese_traditional ] = "¤ô¥­¤Ï¬M";
    Text[ arabic ] = "ÇäÚßÇÓ ÃÝÞí";
    Text[ dutch ] = "horizontaal spiegelen";
    Text[ chinese_simplified ] = "ˮƽ·½Ïò·´Ó³";
    Text[ greek ] = "ïñéæüíôéá áíáóôñïöÞ";
    Text[ korean ] = "¼öÆò ´ëĪ";
    Text[ turkish ] = "Yatay yansýt";
    Text[ language_user1 ] = " ";
};
String STR_BOTH_MIRROR
{
    TEXT = "vert. und horizontal Spiegeln" ;
    TEXT [ English ] = "mirror vert. and horizontally" ;
    Text [ english_us ] = "Horizontal and Vertical Flip" ;
    Text [ italian ] = "Rispecchiare orizzontalmente e verticalmente" ;
    Text [ spanish ] = "Reflejar vertical y horizontalmente" ;
    Text [ french ] = "Refléter verticalement et horizontalement" ;
    Text [ dutch ] = "Hoizontaal en verticaal spiegelen" ;
    Text [ swedish ] = "spegla vert. och hori." ;
    Text [ danish ] = "spejlvend lodret og vandret" ;
    Text [ portuguese_brazilian ] = "vert. und horizontal Spiegeln" ;
    Text [ portuguese ] = "Reflectir na vertical e na horizontal" ;
    Text[ chinese_simplified ] = "´¹Ö±ºÍˮƽ·½Ïò·´Ó³";
    Text[ russian ] = "Îòîáðàçèòü ïî âåðòèêàëè è ãîðèçîíòàëè";
    Text[ polish ] = "Przerzuæ w pionie i w poziomie";
    Text[ japanese ] = "ã‰º‚ƍ¶‰E‚É”½“]";
    Text[ chinese_traditional ] = "««ª½©M¤ô¥­¤Ï¬M";
    Text[ arabic ] = "ÇäÚßÇÓ ÑÃÓí æÃÝÞí";
    Text[ dutch ] = "Hoizontaal en verticaal spiegelen";
    Text[ chinese_simplified ] = "´¹Ö±ºÍˮƽ·½Ïò·´Ó³";
    Text[ greek ] = "ïñéæüíôéá êáé êáôáêüñõöç áíáóôñïöÞ";
    Text[ korean ] = "¼öÆò°ú ¼öÁ÷ ´ëĪ";
    Text[ turkish ] = "Dikey ve yatay yansýt";
    Text[ language_user1 ] = " ";
};
String STR_MIRROR_TOGGLE
{
    TEXT = " + auf geraden Seiten horizontal Spiegeln" ;
    TEXT [ English ] = " + mirror horizontal on even page numbers" ;
    Text [ portuguese ] = "  + reflectir horizontalmente nas páginas pares" ;
    Text [ english_us ] = "+ mirror horizontal on even pages" ;
    Text [ portuguese_brazilian ] = "+ auf geraden Seiten horizontal Spiegeln" ;
    Text [ swedish ] = "+ spegelvänd horisontellt på jämna sidor" ;
    Text [ danish ] = "+ spejlvend på lige sider" ;
    Text [ italian ] = "+ rispecchia orizzontalmente sulle pagine pari" ;
    Text [ spanish ] = "+ reflejar horizontalmente en las páginas pares" ;
    Text [ french ] = "+ refléter horizontalement sur les pages paires" ;
    Text [ dutch ] = "+ op even pagina's horizontaal spiegelen" ;
    Text[ chinese_simplified ] = "+ ˮƽ·½Ïò·´Ó³µ½Å¼ÊýÒ³Ãæ";
    Text[ russian ] = "+Îòîáðàçèòü ïî ãîðèçîíòàëè íà ÷åòíûõ ñòðàíèöàõ";
    Text[ polish ] = "+ przerzuæ w poziomie na stronach parzystych";
    Text[ japanese ] = "+ ‹ô”Íß°¼Þ‚ɏ㉺”½“]";
    Text[ chinese_traditional ] = "+ ¤ô¥­¤Ï¬M¨ì°¸¼Æ­¶­±";
    Text[ arabic ] = "+ ÇäÚßÇÓ ÃÝÞí Úáì ÇáÕÝÍÇÊ ÇáÒæÌíÉ";
    Text[ dutch ] = "+ op even pagina's horizontaal spiegelen";
    Text[ chinese_simplified ] = "+ ˮƽ·½Ïò·´Ó³µ½Å¼ÊýÒ³Ãæ";
    Text[ greek ] = "+ ïñéæüíôéá áíôáíÜêëáóç óå ìïíÝò óåëßäåò";
    Text[ korean ] = "+ Á÷¸é¿¡¼­ ¼öÆòÀ¸·Î ´ëĪ";
    Text[ turkish ] = "+ çift numaralý sayfalarda yatay yansýt";
    Text[ language_user1 ] = " ";
};
String STR_CHARFMT
{
    TEXT = "Zeichenvorlage" ;
    TEXT [ English ] = "Character Style" ;
    Text [ english_us ] = "Character Style" ;
    Text [ italian ] = "Modello di carattere" ;
    Text [ spanish ] = "Estilo de caracteres" ;
    Text [ french ] = "Style de caractères" ;
    Text [ dutch ] = "Tekenopmaakprofiel" ;
    Text [ swedish ] = "Teckenformatmall" ;
    Text [ danish ] = "tegntypografi" ;
    Text [ portuguese ] = "Estilos de caracteres" ;
    Text [ portuguese_brazilian ] = "Zeichenvorlage" ;
    Text[ chinese_simplified ] = "×Ö·ûÑùʽ";
    Text[ russian ] = "Ñòèëü çíàêîâ";
    Text[ polish ] = "Styl znaku";
    Text[ japanese ] = "•¶Žš½À²Ù";
    Text[ chinese_traditional ] = "¤å¦r¼Ë¦¡";
    Text[ arabic ] = "äãØ ÇáÃÍÑÝ";
    Text[ dutch ] = "Tekenopmaakprofiel";
    Text[ chinese_simplified ] = "×Ö·ûÑùʽ";
    Text[ greek ] = "Óôõë ÷áñáêôÞñùí";
    Text[ korean ] = "¹®ÀÚ À¯Çü";
    Text[ turkish ] = "Karakter biçimi";
    Text[ language_user1 ] = " ";
};
String STR_NO_CHARFMT
{
    TEXT = "keine Zeichenvorlage" ;
    TEXT [ English ] = "no Character Style" ;
    Text [ english_us ] = "No Character Style" ;
    Text [ italian ] = "Senza modello di carattere" ;
    Text [ spanish ] = "El estilo de carácter no existe" ;
    Text [ french ] = "Pas de style de caractère" ;
    Text [ dutch ] = "geen opmaakprofiel" ;
    Text [ swedish ] = "ingen teckenformatmall" ;
    Text [ danish ] = "ingen tegntypografi" ;
    Text [ portuguese ] = "Estilo de caracteres inexistente" ;
    Text [ portuguese_brazilian ] = "keine Zeichenvorlage" ;
    Text[ chinese_simplified ] = "ÎÞÎÄ×ÖÑùʽ";
    Text[ russian ] = "Áåç ñòèëÿ çíàêîâ";
    Text[ polish ] = "Brak stylu znaków";
    Text[ japanese ] = "•¶Žš½À²Ù‚È‚µ";
    Text[ chinese_traditional ] = "µL¤å¦r¼Ë¦¡";
    Text[ arabic ] = "ÈÏæä äãØ ÃÍÑÝ";
    Text[ dutch ] = "geen opmaakprofiel";
    Text[ chinese_simplified ] = "ÎÞÎÄ×ÖÑùʽ";
    Text[ greek ] = "÷ùñßò óôõë ÷áñáêôÞñùí";
    Text[ korean ] = "¹®ÀÚ À¯ÇüÀÌ ¾ø½À´Ï´Ù.";
    Text[ turkish ] = "Karakter biçimi yok";
    Text[ language_user1 ] = " ";
};
String STR_FOOTER
{
    /* ### ACHTUNG: Neuer Text in Resource? Fußzeile : Fu˜zeile */
    TEXT = "Fußzeile" ;
    TEXT [ English ] = "footer" ;
    Text [ dutch ] = "voettekst" ;
    Text [ english_us ] = "Footer" ;
    Text [ italian ] = "Piè di pagina" ;
    Text [ spanish ] = "Pie de página" ;
    Text [ french ] = "Pied de page" ;
    Text [ swedish ] = "Sidfot" ;
    Text [ danish ] = "sidefod" ;
    Text [ portuguese ] = "Rodapé" ;
    Text [ portuguese_brazilian ] = "Fußzeile" ;
    Text[ chinese_simplified ] = "Ò³½Å";
    Text[ russian ] = "Íèæíèé êîëîíòèòóë";
    Text[ polish ] = "Stopka";
    Text[ japanese ] = "̯À";
    Text[ chinese_traditional ] = "­¶§À";
    Text[ arabic ] = "ÊÐííá ÇáÕÝÍÉ";
    Text[ dutch ] = "voettekst";
    Text[ chinese_simplified ] = "Ò³½Å";
    Text[ greek ] = "ÕðïóÝëéäï";
    Text[ korean ] = "¹Ù´Ú±Û";
    Text[ turkish ] = "Altbilgi";
    Text[ language_user1 ] = " ";
};
String STR_NO_FOOTER
{
    /* ### ACHTUNG: Neuer Text in Resource? keine Fußzeile : keine Fu˜zeile */
    TEXT = "keine Fußzeile" ;
    TEXT [ English ] = "no footer" ;
    Text [ english_us ] = "No footer" ;
    Text [ italian ] = "Senza piè di pagina" ;
    Text [ spanish ] = "Sin pie de página" ;
    Text [ french ] = "Pas de pied de page" ;
    Text [ dutch ] = "geen voettekst" ;
    Text [ swedish ] = "ingen sidfot" ;
    Text [ danish ] = "ingen sidefod" ;
    Text [ portuguese ] = "Sem rodapé" ;
    Text [ portuguese_brazilian ] = "keine Fußzeile" ;
    Text[ chinese_simplified ] = "ÎÞÒ³½Å";
    Text[ russian ] = "áåç íèæíåãî êîëîíòèòóëà";
    Text[ polish ] = "Bez stopki";
    Text[ japanese ] = "̯À‚È‚µ";
    Text[ chinese_traditional ] = "µL­¶§À";
    Text[ arabic ] = "ÈÏæä ÊÐííá ÇáÕÝÍÉ";
    Text[ dutch ] = "geen voettekst";
    Text[ chinese_simplified ] = "ÎÞÒ³½Å";
    Text[ greek ] = "÷ùñßò õðïóÝëéäï";
    Text[ korean ] = "¹Ù´Ú±ÛÀÌ ¾ø½À´Ï´Ù.";
    Text[ turkish ] = "Altbilgi yok";
    Text[ language_user1 ] = " ";
};
String STR_HEADER
{
    TEXT = "Kopfzeile" ;
    TEXT [ English ] = "header" ;
    Text [ dutch ] = "koptekst" ;
    Text [ english_us ] = "Header" ;
    Text [ italian ] = "Riga d'intestazione" ;
    Text [ spanish ] = "Encabezamiento" ;
    Text [ french ] = "En-tête" ;
    Text [ swedish ] = "Sidhuvud" ;
    Text [ danish ] = "sidehoved" ;
    Text [ portuguese ] = "Cabeçalho" ;
    Text [ portuguese_brazilian ] = "Kopfzeile" ;
    Text[ chinese_simplified ] = "ҳü";
    Text[ russian ] = "Âåðõíèé êîëîíòèòóë";
    Text[ polish ] = "Nag³ówek";
    Text[ japanese ] = "ͯÀÞ";
    Text[ chinese_traditional ] = "­¶­º";
    Text[ arabic ] = "ÑÃÓ ÇáÕÝÍÉ";
    Text[ dutch ] = "koptekst";
    Text[ chinese_simplified ] = "ҳü";
    Text[ greek ] = "Êåöáëßäá";
    Text[ korean ] = "¸Ó¸®±Û";
    Text[ turkish ] = "Üstbilgi";
    Text[ language_user1 ] = " ";
};
String STR_NO_HEADER
{
    TEXT = "keine Kopfzeile" ;
    TEXT [ English ] = "no header" ;
    Text [ english_us ] = "No header" ;
    Text [ italian ] = "Senza intestazione" ;
    Text [ spanish ] = "Sin encabezamiento" ;
    Text [ french ] = "Aucun en-tête" ;
    Text [ dutch ] = "geen koptekst" ;
    Text [ swedish ] = "inget sidhuvud" ;
    Text [ danish ] = "intet sidehoved" ;
    Text [ portuguese ] = "Sem cabeçalho" ;
    Text [ portuguese_brazilian ] = "keine Kopfzeile" ;
    Text[ chinese_simplified ] = "ÎÞҳü";
    Text[ russian ] = "áåç âåðõíåãî êîëîíòèòóëà";
    Text[ polish ] = "Bez nag³ówka";
    Text[ japanese ] = "ͯÀނȂµ";
    Text[ chinese_traditional ] = "µL­¶­º";
    Text[ arabic ] = "ÈÏæä ÑÃÓ ÇáÕÝÍÉ";
    Text[ dutch ] = "geen koptekst";
    Text[ chinese_simplified ] = "ÎÞҳü";
    Text[ greek ] = "÷ùñßò êåöáëßäá";
    Text[ korean ] = "¸Ó¸®±ÛÀÌ ¾ø½À´Ï´Ù.";
    Text[ turkish ] = "Üstbilgi yok";
    Text[ language_user1 ] = " ";
};
String STR_SURROUND_IDEAL
{
    TEXT = "idealer Umlauf" ;
    TEXT [ English ] = "ideal surround" ;
    Text [ english_us ] = "Optimal wrap" ;
    Text [ italian ] = "Scorrimento ideale" ;
    Text [ spanish ] = "Ajuste ideal" ;
    Text [ french ] = "Adaptation idéale" ;
    Text [ dutch ] = "ideale omloop" ;
    Text [ swedish ] = "Optimal textanpassning" ;
    Text [ danish ] = "optimal ombrydning" ;
    Text [ portuguese ] = "Ajuste ideal" ;
    Text [ portuguese_brazilian ] = "idealer Umlauf" ;
    Text[ chinese_simplified ] = "×î¼ÑÎÄ×Ö»·ÈÆ";
    Text[ russian ] = "îïòèìàëüíîå îáòåêàíèå";
    Text[ polish ] = "Obieg idealny";
    Text[ japanese ] = "Å“K‚Ȑ܂è•Ô‚µ";
    Text[ chinese_traditional ] = "³ÌÓì¤å¦rÀô¶";
    Text[ arabic ] = "ÇáÇáÊÝÇÝ ÇáÃãËá";
    Text[ dutch ] = "ideale omloop";
    Text[ chinese_simplified ] = "×î¼ÑÎÄ×Ö»·ÈÆ";
    Text[ greek ] = "âÝëôéóôç áíáäßðëùóç";
    Text[ korean ] = "ÃÖÀû ¼øÈ¯";
    Text[ turkish ] = "Optimum metin daðýlýmý";
    Text[ language_user1 ] = " ";
};
String STR_SURROUND_NONE
{
    TEXT = "kein Umlauf" ;
    TEXT [ English ] = "no surround" ;
    Text [ english_us ] = "No wrap" ;
    Text [ italian ] = "Separato" ;
    Text [ spanish ] = "Sin ajuste" ;
    Text [ french ] = "Pas d'adaptation" ;
    Text [ dutch ] = "geen omloop" ;
    Text [ swedish ] = "Ingen textanpassning" ;
    Text [ danish ] = "ingen ombrydning" ;
    Text [ portuguese ] = "Sem ajuste" ;
    Text [ portuguese_brazilian ] = "kein Umlauf" ;
    Text[ chinese_simplified ] = "²»»·ÈÆ";
    Text[ russian ] = "áåç îáòåêàíèÿ";
    Text[ polish ] = "Brak obiegu";
    Text[ japanese ] = "ã‰ºÜ‚è•Ô‚µ";
    Text[ chinese_traditional ] = "¤£Àô¶";
    Text[ arabic ] = "ÈÏæä ÇáÊÝÇÝ";
    Text[ dutch ] = "geen omloop";
    Text[ chinese_simplified ] = "²»»·ÈÆ";
    Text[ greek ] = "×ùñßò áíáäßðëùóç";
    Text[ korean ] = "¼øÈ¯ ¾øÀ½";
    Text[ turkish ] = "Metin daðýlýmý yok";
    Text[ language_user1 ] = " ";
};
String STR_SURROUND_THROUGHT
{
    TEXT = "Durchlauf" ;
    TEXT [ English ] = "wrap through" ;
    Text [ english_us ] = "Through" ;
    Text [ italian ] = "Attraverso" ;
    Text [ spanish ] = "Continuo" ;
    Text [ french ] = "À travers" ;
    Text [ dutch ] = "doorloop" ;
    Text [ swedish ] = "Textgenomflöde" ;
    Text [ danish ] = "gennemgående" ;
    Text [ portuguese ] = "Através do objecto" ;
    Text [ portuguese_brazilian ] = "Durchlauf" ;
    Text[ chinese_simplified ] = "¹á´©";
    Text[ russian ] = "Ñêâîçíîå îáòåêàíèå";
    Text[ polish ] = "Przep³yw tekstu";
    Text[ japanese ] = "Ü‚è•Ô‚µ‚È‚µ";
    Text[ chinese_traditional ] = "¤£Àô¶";
    Text[ arabic ] = "ÚÈÑ";
    Text[ dutch ] = "doorloop";
    Text[ chinese_simplified ] = "¹á´©";
    Text[ greek ] = "Äéá ìÝóïõ";
    Text[ korean ] = "Àüü µ¹¸²";
    Text[ turkish ] = "Metin arkasýna gönder";
    Text[ language_user1 ] = " ";
};
String STR_SURROUND_PARALLEL
{
    TEXT = "paralleler Umlauf" ;
    TEXT [ English ] = "surround parallel" ;
    Text [ dutch ] = "omloop parallel" ;
    Text [ english_us ] = "Parallel wrap" ;
    Text [ italian ] = "Scorrimento parallelo" ;
    Text [ spanish ] = "Ajuste paralelo" ;
    Text [ french ] = "Adaptation parallèle" ;
    Text [ swedish ] = "Parallell textanpassning" ;
    Text [ danish ] = "parallel ombrydning" ;
    Text [ portuguese ] = "Ajuste paralelo" ;
    Text [ portuguese_brazilian ] = "paralleler Umlauf" ;
    Text[ chinese_simplified ] = "ƽÐл·ÈÆ";
    Text[ russian ] = "ïàðàëëåëüíîå îáòåêàíèå";
    Text[ polish ] = "Obieg równoleg³y";
    Text[ japanese ] = "ã‰ºÜ‚è•Ô‚µ";
    Text[ chinese_traditional ] = "¥­¦æÀô¶";
    Text[ arabic ] = "ÇáÊÝÇÝ ãÊæÇÒí";
    Text[ dutch ] = "omloop parallel";
    Text[ chinese_simplified ] = "ƽÐл·ÈÆ";
    Text[ greek ] = "ðáñÜëëçëç áíáäßðëùóç";
    Text[ korean ] = "ÆòÇà ¼øÈ¯";
    Text[ turkish ] = "Paralel metin daðýlýmý";
    Text[ language_user1 ] = " ";
};
String STR_SURROUND_COLUMN
{
    TEXT = "spaltiger Umlauf" ;
    TEXT [ English ] = "surround" ;
    Text [ dutch ] = "omloop kolom" ;
    Text [ english_us ] = "Column Wrap" ;
    Text [ italian ] = "Scorrimento a colonne" ;
    Text [ spanish ] = "Ajuste en columnas" ;
    Text [ french ] = "Adaptation en colonnes" ;
    Text [ swedish ] = "Kolumnanpassning" ;
    Text [ danish ] = "ombryd kolonne" ;
    Text [ portuguese ] = "Ajustar colunas" ;
    Text [ portuguese_brazilian ] = "spaltiger Umlauf" ;
    Text[ chinese_simplified ] = "ÁÐÄÚÎÄ×Ö»·ÈÆ";
    Text[ russian ] = "Îáòåêàíèå ââèäå êîëîíîê";
    Text[ polish ] = "Obieg kolumnowy";
    Text[ japanese ] = "—ñ‚̐܂è•Ô‚µ";
    Text[ chinese_traditional ] = "¦C¤º¤å¦rÀô¶";
    Text[ arabic ] = "ÇáÊÝÇÝ ÇáÃÚãÏÉ";
    Text[ dutch ] = "omloop kolom";
    Text[ chinese_simplified ] = "ÁÐÄÚÎÄ×Ö»·ÈÆ";
    Text[ greek ] = "Áíáäßðëùóç óôÞëçò";
    Text[ korean ] = "¿­ ¼øÈ¯";
    Text[ turkish ] = "-";
    Text[ language_user1 ] = " ";
};
String STR_SURROUND_LEFT
{
    TEXT = "linker Umlauf" ;
    TEXT [ English ] = "surround left" ;
    Text [ english_us ] = "Left wrap" ;
    Text [ italian ] = "Scorrimento a sinistra" ;
    Text [ spanish ] = "Ajuste a la izquierda" ;
    Text [ french ] = "Adaptation à gauche" ;
    Text [ dutch ] = "omloop linkerkant" ;
    Text [ swedish ] = "Textanpassning vänster" ;
    Text [ danish ] = "venstre ombrydning" ;
    Text [ portuguese ] = "Ajuste esquerdo" ;
    Text [ portuguese_brazilian ] = "linker Umlauf" ;
    Text[ chinese_simplified ] = "×ó»·ÈÆ";
    Text[ russian ] = "Îáòåêàíèå ñëåâà";
    Text[ polish ] = "Obieg z lewej";
    Text[ japanese ] = "¶‚̐܂è•Ô‚µ";
    Text[ chinese_traditional ] = "¥ªÀô¶";
    Text[ arabic ] = "ÇáÊÝÇÝ ÃíÓÑ";
    Text[ dutch ] = "omloop linkerkant";
    Text[ chinese_simplified ] = "×ó»·ÈÆ";
    Text[ greek ] = "áíáäßðëùóç áñéóôåñÜ";
    Text[ korean ] = "¿ÞÂÊÀ¸·Î ¼øÈ¯";
    Text[ turkish ] = "Sol metin daðýlýmý";
    Text[ language_user1 ] = " ";
};
String STR_SURROUND_RIGHT
{
    TEXT = "rechter Umlauf" ;
    TEXT [ English ] = "surround right" ;
    Text [ english_us ] = "Right wrap" ;
    Text [ italian ] = "Scorrimento a destra" ;
    Text [ spanish ] = "Ajuste a la derecha" ;
    Text [ french ] = "Adaptation à droite" ;
    Text [ dutch ] = "omloop rechterkant" ;
    Text [ swedish ] = "Textanpassning höger" ;
    Text [ danish ] = "højre ombrydning" ;
    Text [ portuguese ] = "Ajuste direito" ;
    Text [ portuguese_brazilian ] = "rechter Umlauf" ;
    Text[ chinese_simplified ] = "ÓÒ»·ÈÆ";
    Text[ russian ] = "Îáòåêàíèå ñïðàâà";
    Text[ polish ] = "Obieg z prawej";
    Text[ japanese ] = "‰E‚̐܂è•Ô‚µ";
    Text[ chinese_traditional ] = "¥kÀô¶";
    Text[ arabic ] = "ÇáÊÝÇÝ Ãíãä";
    Text[ dutch ] = "omloop rechterkant";
    Text[ chinese_simplified ] = "ÓÒ»·ÈÆ";
    Text[ greek ] = "áíáäßðëùóç äåîéÜ";
    Text[ korean ] = "¿À¸¥ÂÊÀ¸·Î ¼øÈ¯";
    Text[ turkish ] = "Sað metin daðýlýmý";
    Text[ language_user1 ] = " ";
};
String STR_SURROUND_INSIDE
{
    TEXT = "Umlauf innen" ;
    TEXT [ English ] = "surround inside" ;
    Text [ dutch ] = "omloop binnenkant" ;
    Text [ english_us ] = "Inner wrap" ;
    Text [ italian ] = "Scorrimento interno" ;
    Text [ spanish ] = "Ajuste interno" ;
    Text [ french ] = "Adaptation intérieure" ;
    Text [ swedish ] = "Anpassning innanför" ;
    Text [ danish ] = "indre ombrydning" ;
    Text [ portuguese ] = "Ajuste interior" ;
    Text [ portuguese_brazilian ] = "Umlauf innen" ;
    Text[ chinese_simplified ] = "ÄÚ²¿»·ÈÆ";
    Text[ russian ] = "Îáòåêàíèå âíóòðè";
    Text[ polish ] = "Obieg wewnêtrzny";
    Text[ japanese ] = "Ü‚è•Ô‚µ “à";
    Text[ chinese_traditional ] = "¤º³¡Àô¶";
    Text[ arabic ] = "ÇáÊÝÇÝ ÏÇÎáí";
    Text[ dutch ] = "omloop binnenkant";
    Text[ chinese_simplified ] = "ÄÚ²¿»·ÈÆ";
    Text[ greek ] = "Áíáäßðëùóç - åóùôåñéêÜ";
    Text[ korean ] = "³»ºÎ ¼øÈ¯";
    Text[ turkish ] = "Ýç metin daðýlýmý";
    Text[ language_user1 ] = " ";
};
String STR_SURROUND_OUTSIDE
{
    /* ### ACHTUNG: Neuer Text in Resource? Umlauf außen : Umlauf au˜en */
    TEXT = "Umlauf außen" ;
    TEXT [ English ] = "surround outside" ;
    Text [ english_us ] = "Outer wrap" ;
    Text [ italian ] = "Scorrimento esterno" ;
    Text [ spanish ] = "Ajuste externo" ;
    Text [ french ] = "Adaptation extérieure" ;
    Text [ dutch ] = "omloop buitenkant" ;
    Text [ swedish ] = "Anpassning utanför" ;
    Text [ danish ] = "ydre ombrydning" ;
    Text [ portuguese ] = "Ajuste exterior" ;
    Text [ portuguese_brazilian ] = "Umlauf außen" ;
    Text[ chinese_simplified ] = "Íâ»·ÈÆ";
    Text[ russian ] = "Îáòåêàíèå ñíàðóæè";
    Text[ polish ] = "Obieg zewnêtrzny";
    Text[ japanese ] = "Ü‚è•Ô‚µ ŠO";
    Text[ chinese_traditional ] = "¥~Àô¶";
    Text[ arabic ] = "ÇáÊÝÇÝ ÎÇÑÌí";
    Text[ dutch ] = "omloop buitenkant";
    Text[ chinese_simplified ] = "Íâ»·ÈÆ";
    Text[ greek ] = "Áíáäßðëùóç - åîùôåñéêÜ";
    Text[ korean ] = "¿ÜºÎ ¼øÈ¯";
    Text[ turkish ] = "Dýþ metin daðýlýmý";
    Text[ language_user1 ] = " ";
};
String STR_SURROUND_ANCHORONLY
{
    TEXT = "(nur Anker)" ;
    TEXT [ English ] = "(Anchor only)" ;
    Text [ dutch ] = "(alleen anker)" ;
    Text [ english_us ] = "(Anchor only)" ;
    Text [ italian ] = "(solo ancoraggio)" ;
    Text [ spanish ] = "(solo ancla)" ;
    Text [ french ] = "(ancre seule)" ;
    Text [ swedish ] = "(endast ankare)" ;
    Text [ danish ] = "(kun anker)" ;
    Text [ portuguese ] = "(só âncora)" ;
    Text [ portuguese_brazilian ] = "(nur Anker)" ;
    Text[ chinese_simplified ] = "(Ö»ÊDZê¼Ç)";
    Text[ russian ] = "(òîëüêî ïðèâÿçêà)";
    Text[ polish ] = "(tylko kotwica)";
    Text[ japanese ] = "(±Ý¶°‚Ì‚Ý)";
    Text[ chinese_traditional ] = "(¥u¬O¼Ð¸¹)";
    Text[ arabic ] = "(ÇáãÑÓÇÉ ÝÞØ)";
    Text[ dutch ] = "(alleen anker)";
    Text[ chinese_simplified ] = "(Ö»ÊDZê¼Ç)";
    Text[ greek ] = "(ìüíï áãêýñùóç)";
    Text[ korean ] = "(°íÁ¤ ±âÁØ ¸¸)";
    Text[ turkish ] = "(yalnýzca sabitleyici)";
    Text[ language_user1 ] = " ";
};
String STR_FRM_WIDTH
{
    TEXT = "Breite:" ;
    TEXT [ English ] = "width:" ;
    Text [ dutch ] = "breedte:" ;
    Text [ english_us ] = "Width:" ;
    Text [ italian ] = "Larghezza:" ;
    Text [ spanish ] = "Ancho:" ;
    Text [ french ] = "Largeur :" ;
    Text [ swedish ] = "Bredd:" ;
    Text [ danish ] = "bredde:" ;
    Text [ portuguese ] = "Largura:" ;
    Text [ portuguese_brazilian ] = "Breite:" ;
    Text[ chinese_simplified ] = "¿í£º";
    Text[ russian ] = "Øèðèíà:";
    Text[ polish ] = "SzerokoϾ:";
    Text[ japanese ] = "•:";
    Text[ chinese_traditional ] = "¼e¡G";
    Text[ arabic ] = "ÇáÚÑÖ:";
    Text[ dutch ] = "breedte:";
    Text[ chinese_simplified ] = "¿í£º";
    Text[ greek ] = "ÐëÜôïò:";
    Text[ korean ] = "³Êºñ:";
    Text[ turkish ] = "Geniþlik:";
    Text[ language_user1 ] = " ";
};
String STR_FRM_FIXEDHEIGHT
{
    /* ### ACHTUNG: Neuer Text in Resource? feste Höhe: : feste H÷he: */
    TEXT = "feste Höhe:" ;
    TEXT [ English ] = "fixed height:" ;
    Text [ dutch ] = "vaste hoogte:" ;
    Text [ english_us ] = "Fixed height:" ;
    Text [ italian ] = "altezza fissa:" ;
    Text [ spanish ] = "Altura fija:" ;
    Text [ french ] = "Hauteur fixe :" ;
    Text [ swedish ] = "fast höjd:" ;
    Text [ danish ] = "fast højde:" ;
    Text [ portuguese ] = "Altura fixa:" ;
    Text [ portuguese_brazilian ] = "feste Höhe:" ;
    Text[ chinese_simplified ] = "¹Ì¶¨¸ß¶È£º";
    Text[ russian ] = "ôèêñèðîâàííàÿ âûñîòà:";
    Text[ polish ] = "Sta³a wysokoœæ:";
    Text[ japanese ] = "‹K’è‚̍‚‚³:";
    Text[ chinese_traditional ] = "©T©w°ª«×¡G";
    Text[ arabic ] = "ÇÑÊÝÇÚ ËÇÈÊ:";
    Text[ dutch ] = "vaste hoogte:";
    Text[ chinese_simplified ] = "¹Ì¶¨¸ß¶È£º";
    Text[ greek ] = "Óôáèåñü ýøïò:";
    Text[ korean ] = "°íÁ¤µÈ ³ôÀÌ:";
    Text[ turkish ] = "Sabit yükseklik:";
    Text[ language_user1 ] = " ";
};
String STR_FRM_MINHEIGHT
{
    /* ### ACHTUNG: Neuer Text in Resource? min. Höhe: : min. H÷he: */
    TEXT = "min. Höhe:" ;
    TEXT [ English ] = "min. height:" ;
    Text [ english_us ] = "Min. height:" ;
    Text [ italian ] = "altezza min:" ;
    Text [ spanish ] = "Altura mínima:" ;
    Text [ french ] = "Hauteur min. :" ;
    Text [ dutch ] = "min. hoogte:" ;
    Text [ swedish ] = "min. höjd:" ;
    Text [ danish ] = "min. højde:" ;
    Text [ portuguese ] = "Altura min.:" ;
    Text [ portuguese_brazilian ] = "min. Höhe:" ;
    Text[ chinese_simplified ] = "×îС¸ß¶È£º";
    Text[ russian ] = "ìèí. âûñîòà:";
    Text[ polish ] = "Min. wysokoϾ:";
    Text[ japanese ] = "Å’á‚̍‚‚³:";
    Text[ chinese_traditional ] = "³Ì¤p°ª«×¡G";
    Text[ arabic ] = "ÇáÇÑÊÝÇÚ ÇáÃÏäì:";
    Text[ dutch ] = "min. hoogte:";
    Text[ chinese_simplified ] = "×îС¸ß¶È£º";
    Text[ greek ] = "Åëá÷. ýøïò:";
    Text[ korean ] = "ÃÖ¼Ò ³ôÀÌ:";
    Text[ turkish ] = "Asg.yükseklik:";
    Text[ language_user1 ] = " ";
};
String STR_FLY_AT_CNTNT
{
    TEXT = "absatzgebunden" ;
    TEXT [ English ] = "at paragraph" ;
    Text [ dutch ] = "alinea-gebonden" ;
    Text [ english_us ] = "to paragraph" ;
    Text [ italian ] = "al paragrafo" ;
    Text [ spanish ] = "según párrafo" ;
    Text [ french ] = "lié au paragraphe" ;
    Text [ swedish ] = "bunden till stycke" ;
    Text [ danish ] = "bundet til afsnit" ;
    Text [ portuguese ] = "ligado ao parágrafo" ;
    Text [ portuguese_brazilian ] = "absatzgebunden" ;
    Text[ chinese_simplified ] = "ºÍ¶ÎÂäÁ¬ÔÚÒ»Æð";
    Text[ russian ] = "ïðèâÿçêà ê àáçàöó";
    Text[ polish ] = "zwi¹zany z akapitem";
    Text[ japanese ] = "’i—Ž‚ÉŒ‹‡";
    Text[ chinese_traditional ] = "©M¬q¸¨³s¦b¤@°_";
    Text[ arabic ] = "ãÑÊÈØ ÈÇáÝÞÑÉ";
    Text[ dutch ] = "alinea-gebonden";
    Text[ chinese_simplified ] = "ºÍ¶ÎÂäÁ¬ÔÚÒ»Æð";
    Text[ greek ] = "ðñïò ðáñÜãñáöï";
    Text[ korean ] = "´Ü¶ô¿¡";
    Text[ turkish ] = "Paragrafa baðlý";
    Text[ language_user1 ] = " ";
};
String STR_FLY_IN_CNTNT
{
    TEXT = "zeichengebunden" ;
    TEXT [ English ] = "at character" ;
    Text [ english_us ] = "to character" ;
    Text [ italian ] = "al carattere" ;
    Text [ spanish ] = "según carácter" ;
    Text [ french ] = "au caractère" ;
    Text [ dutch ] = "schriftteken-gebonden" ;
    Text [ swedish ] = "bunden till tecken" ;
    Text [ danish ] = "bundet til tegn" ;
    Text [ portuguese ] = "conforme carácter" ;
    Text [ portuguese_brazilian ] = "zeichengebunden" ;
    Text[ chinese_simplified ] = "ºÍÎÄ×ÖÁ¬ÔÚÒ»Æð";
    Text[ russian ] = "ïðèâÿçêà ê çíàêó";
    Text[ polish ] = "zwi¹zany ze znakiem";
    Text[ japanese ] = "•¶Žš‚ÉŒ‹‡";
    Text[ chinese_traditional ] = "©M¤å¦r³s¦b¤@°_";
    Text[ arabic ] = "ãÑÊÈØ ÈÇáÃÍÑÝ";
    Text[ dutch ] = "schriftteken-gebonden";
    Text[ chinese_simplified ] = "ºÍÎÄ×ÖÁ¬ÔÚÒ»Æð";
    Text[ greek ] = "ðñïò ÷áñáêôÞñá";
    Text[ korean ] = "¹®ÀÚ¿¡";
    Text[ turkish ] = "Karaktere baðlý";
    Text[ language_user1 ] = " ";
};
String STR_FLY_PAGE
{
    TEXT = "seitengebunden" ;
    TEXT [ English ] = "at page" ;
    Text [ english_us ] = "to page" ;
    Text [ italian ] = "alla pagina" ;
    Text [ spanish ] = "a la página" ;
    Text [ french ] = "à la page" ;
    Text [ dutch ] = "pagina-gebonden" ;
    Text [ swedish ] = "bunden till sida" ;
    Text [ danish ] = "bundet til side" ;
    Text [ portuguese ] = "conforme página" ;
    Text [ portuguese_brazilian ] = "seitengebunden" ;
    Text[ chinese_simplified ] = "ºÍÒ³Á¬ÔÚÒ»Æð";
    Text[ russian ] = "ïðèâÿçêà ê ñòðàíèöå";
    Text[ polish ] = "zwi¹zany ze stron¹";
    Text[ japanese ] = "Íß°¼Þ‚ÉŒ‹‡";
    Text[ chinese_traditional ] = "©M­¶³s¦b¤@°_";
    Text[ arabic ] = "ãÑÊÈØ ÈÇáÕÝÍÉ";
    Text[ dutch ] = "pagina-gebonden";
    Text[ chinese_simplified ] = "ºÍÒ³Á¬ÔÚÒ»Æð";
    Text[ greek ] = "ðñïò óåëßäá";
    Text[ korean ] = "ÆäÀÌÁö¿¡";
    Text[ turkish ] = "Sayfaya baðlý";
    Text[ language_user1 ] = " ";
};
String STR_POS_X
{
    TEXT = "X-Koord.:" ;
    TEXT [ English ] = "X-Pos.:" ;
    Text [ english_us ] = "X Coordinate:" ;
    Text [ italian ] = "Coord. X:" ;
    Text [ spanish ] = "Coord. X:" ;
    Text [ french ] = "Coord. X :" ;
    Text [ dutch ] = "X-coörd.:" ;
    Text [ swedish ] = "X-Koord.:" ;
    Text [ danish ] = "X-koord.:" ;
    Text [ portuguese ] = "Coordenada X:" ;
    Text [ portuguese_brazilian ] = "X-Koord.:" ;
    Text[ chinese_simplified ] = "X-×ø±ê£º";
    Text[ russian ] = "X-Êîîðäèíàòà.:";
    Text[ polish ] = "Oœ X.:";
    Text[ japanese ] = "XÀ•W:";
    Text[ chinese_traditional ] = "X-§¤¼Ð¡G";
    Text[ arabic ] = "ÇáÅÍÏÇËí ÇáÓíäí:";
    Text[ dutch ] = "X-coörd.:";
    Text[ chinese_simplified ] = "X-×ø±ê£º";
    Text[ greek ] = "ÓõíôåôáãìÝíç X:";
    Text[ korean ] = "X ÁÂÇ¥:";
    Text[ turkish ] = "X koord.:";
    Text[ language_user1 ] = " ";
};
String STR_POS_Y
{
    TEXT = "Y-Koord.:" ;
    TEXT [ English ] = "Y-Pos.:" ;
    Text [ english_us ] = "Y Coordinate:" ;
    Text [ italian ] = "Coord. Y:" ;
    Text [ spanish ] = "Coord. Y:" ;
    Text [ french ] = "Coord. Y :" ;
    Text [ dutch ] = "Y-coörd.:" ;
    Text [ swedish ] = "Y-Koord.:" ;
    Text [ danish ] = "Y-koord.:" ;
    Text [ portuguese ] = "Coordenada Y:" ;
    Text [ portuguese_brazilian ] = "Y-Koord.:" ;
    Text[ chinese_simplified ] = "Y-×ø±ê£º";
    Text[ russian ] = "Y-Êîîðäèíàòà.:";
    Text[ polish ] = "Oœ Y.:";
    Text[ japanese ] = "YÀ•W:";
    Text[ chinese_traditional ] = "Y-§¤¼Ð¡G";
    Text[ arabic ] = "ÇáÅÍÏÇËí ÇáÕÇÏí:";
    Text[ dutch ] = "Y-coörd.:";
    Text[ chinese_simplified ] = "Y-×ø±ê£º";
    Text[ greek ] = "ÓõíôåôáãìÝíç Y:";
    Text[ korean ] = "Y ÁÂÇ¥:";
    Text[ turkish ] = "Y koord.:";
    Text[ language_user1 ] = " ";
};
String STR_VERT_TOP
{
    TEXT = "oben" ;
    TEXT [ English ] = "at top" ;
    Text [ dutch ] = "boven" ;
    Text [ english_us ] = "at top" ;
    Text [ italian ] = "in alto" ;
    Text [ spanish ] = "arriba" ;
    Text [ french ] = "en haut" ;
    Text [ swedish ] = "överst" ;
    Text [ danish ] = "foroven" ;
    Text [ portuguese ] = "em cima" ;
    Text [ portuguese_brazilian ] = "oben" ;
    Text[ chinese_simplified ] = "ÉÏ";
    Text[ russian ] = "ñâåðõó";
    Text[ polish ] = "na górze";
    Text[ japanese ] = "ã";
    Text[ chinese_traditional ] = "¤W";
    Text[ arabic ] = "ÃÚáì";
    Text[ dutch ] = "boven";
    Text[ chinese_simplified ] = "ÉÏ";
    Text[ greek ] = "ðÜíù";
    Text[ korean ] = "À§¿¡";
    Text[ turkish ] = "üstte";
    Text[ language_user1 ] = " ";
};
String STR_VERT_CENTER
{
    TEXT = "vertikal zentriert" ;
    TEXT [ English ] = "centered vertically" ;
    Text [ dutch ] = "verticaal gecentreerd" ;
    Text [ english_us ] = "Centered vertically" ;
    Text [ italian ] = "centrato verticalmente" ;
    Text [ spanish ] = "centrado vertical" ;
    Text [ french ] = "Centré verticalement" ;
    Text [ swedish ] = "vertikalt centrerad" ;
    Text [ danish ] = "lodret centreret" ;
    Text [ portuguese ] = "centrado na vertical" ;
    Text [ portuguese_brazilian ] = "vertikal zentriert" ;
    Text[ chinese_simplified ] = "´¹Ö±¾ÓÖÐ";
    Text[ russian ] = "âåðòèêàëüíî ïî öåíòðó";
    Text[ polish ] = "Wyœrodkuj pionowo";
    Text[ japanese ] = "‚’¼‚É’†‰›‘µ‚¦";
    Text[ chinese_traditional ] = "««ª½¸m¤¤";
    Text[ arabic ] = "ÊæÓíØ ÚãæÏí";
    Text[ dutch ] = "verticaal gecentreerd";
    Text[ chinese_simplified ] = "´¹Ö±¾ÓÖÐ";
    Text[ greek ] = "êáôáêüñõöá êåíôñáñéóìÝíá";
    Text[ korean ] = "¼öÁ÷À¸·Î °¡¿îµ¥";
    Text[ turkish ] = "Dikey ortala";
    Text[ language_user1 ] = " ";
};
String STR_VERT_BOTTOM
{
    TEXT = "unten" ;
    TEXT [ English ] = "at bottom" ;
    Text [ dutch ] = "onder" ;
    Text [ english_us ] = "at bottom" ;
    Text [ italian ] = "in basso" ;
    Text [ spanish ] = "abajo" ;
    Text [ french ] = "en bas" ;
    Text [ swedish ] = "nederst" ;
    Text [ danish ] = "forneden" ;
    Text [ portuguese ] = "em baixo" ;
    Text [ portuguese_brazilian ] = "unten" ;
    Text[ chinese_simplified ] = "ÏÂ";
    Text[ russian ] = "ñíèçó";
    Text[ polish ] = "na dole";
    Text[ japanese ] = "‰º";
    Text[ chinese_traditional ] = "¤U";
    Text[ arabic ] = "ÃÓÝá";
    Text[ dutch ] = "onder";
    Text[ chinese_simplified ] = "ÏÂ";
    Text[ greek ] = "êÜôù";
    Text[ korean ] = "¾Æ·¡¿¡";
    Text[ turkish ] = "altta";
    Text[ language_user1 ] = " ";
};
String STR_LINE_TOP
{
    TEXT = "Zeile oben" ;
    TEXT [ English ] = "line at top" ;
    Text [ dutch ] = "bovenste regel" ;
    Text [ english_us ] = "Top of line" ;
    Text [ italian ] = "Riga in alto" ;
    Text [ spanish ] = "Línea superior" ;
    Text [ french ] = "Ligne supérieure" ;
    Text [ swedish ] = "Översta raden" ;
    Text [ danish ] = "række øverst" ;
    Text [ portuguese ] = "Linha superior" ;
    Text [ portuguese_brazilian ] = "Zeile oben" ;
    Text[ chinese_simplified ] = "ÐÐÏòÉÏ";
    Text[ russian ] = "Ñòðîêà ñâåðõó";
    Text[ polish ] = "Wiersz na górze";
    Text[ japanese ] = "ü‚̏ã";
    Text[ chinese_traditional ] = "¦æ¦V¤W";
    Text[ arabic ] = "ÃÚáì ÇáÓØÑ";
    Text[ dutch ] = "bovenste regel";
    Text[ chinese_simplified ] = "ÐÐÏòÉÏ";
    Text[ greek ] = "ÃñáììÞ ðÜíù";
    Text[ korean ] = "¼± À§";
    Text[ turkish ] = "Satýr üstü";
    Text[ language_user1 ] = " ";
};
String STR_LINE_CENTER
{
    TEXT = "vertikal zur Zeile zentriert" ;
    TEXT [ English ] = "line centered vertically" ;
    Text [ dutch ] = "verticaal op de regel gecentreerd" ;
    Text [ english_us ] = "Line centered" ;
    Text [ italian ] = "centrato verticalmente alla riga" ;
    Text [ spanish ] = "Centrado verticalmente a la línea" ;
    Text [ french ] = "Centré sur la ligne à la verticale" ;
    Text [ swedish ] = "centrerad vertikalt till rad" ;
    Text [ danish ] = "lodret til række centreret" ;
    Text [ portuguese ] = "Centrado sobre a linha na vertical" ;
    Text [ portuguese_brazilian ] = "vertikal zur Zeile zentriert" ;
    Text[ chinese_simplified ] = "ºÍÐд¹Ö±¾ÓÖÐ";
    Text[ russian ] = "Âåðòèêàëüíîå öåíòðèðîâàíèå ïî îòíîøåíèþ ê ñòðîêå";
    Text[ polish ] = "Wyœrodkowany pionowo do wiersza";
    Text[ japanese ] = "¾Ù‚ɐ‚’¼‚É’†‰›‘µ‚¦";
    Text[ chinese_traditional ] = "©M¦æ««ª½¸m¤¤";
    Text[ arabic ] = "ãäÊÕÝ ÇáÓØÑ";
    Text[ dutch ] = "verticaal op de regel gecentreerd";
    Text[ chinese_simplified ] = "ºÍÐд¹Ö±¾ÓÖÐ";
    Text[ greek ] = "êáôáêüñõöá êåíôñáñéóìÝíá ùò ðñïò ôç ãñáììÞ";
    Text[ korean ] = "ÁÙ°ú ¼öÁ÷¹æÇâ °¡¿îµ¥";
    Text[ turkish ] = "Satýra göre dikey ortala";
    Text[ language_user1 ] = " ";
};
String STR_LINE_BOTTOM
{
    TEXT = "Zeile unten" ;
    TEXT [ English ] = "line at bottom" ;
    Text [ dutch ] = "onderste regel" ;
    Text [ english_us ] = "Bottom of line" ;
    Text [ italian ] = "Riga in basso" ;
    Text [ spanish ] = "Línea inferior" ;
    Text [ french ] = "Ligne inférieure" ;
    Text [ swedish ] = "Nedersta raden" ;
    Text [ danish ] = "række nederst" ;
    Text [ portuguese ] = "Linha inferior" ;
    Text [ portuguese_brazilian ] = "Zeile unten" ;
    Text[ chinese_simplified ] = "ÐÐÏòÏÂ";
    Text[ russian ] = "Ñòðîêà ñíèçó";
    Text[ polish ] = "Wiersz na dole";
    Text[ japanese ] = "ü‚̉º";
    Text[ chinese_traditional ] = "¦æ¦V¤U";
    Text[ arabic ] = "ÃÓÝá ÇáÓØÑ";
    Text[ dutch ] = "onderste regel";
    Text[ chinese_simplified ] = "ÐÐÏòÏÂ";
    Text[ greek ] = "ÃñáììÞ êÜôù";
    Text[ korean ] = "¼± ¾Æ·¡";
    Text[ turkish ] = "Satýr altý";
    Text[ language_user1 ] = " ";
};
String STR_REGISTER_ON
{
    TEXT = "Registerhaltigkeit" ;
    TEXT [ English ] = "register" ;
    Text [ english_us ] = "Register-true" ;
    Text [ italian ] = "Conformità registro" ;
    Text [ spanish ] = "Conformidad registro" ;
    Text [ french ] = "Contrôle de repérage" ;
    Text [ dutch ] = "registeren" ;
    Text [ swedish ] = "Register" ;
    Text [ danish ] = "hold register" ;
    Text [ portuguese ] = "Registo" ;
    Text [ portuguese_brazilian ] = "Registerhaltigkeit" ;
    Text[ chinese_simplified ] = "Õý·´Ò³µÄÐоàÏàµÈ";
    Text[ russian ] = "Ïðèâîäêà";
    Text[ polish ] = "Jedn. wys. wierszy";
    Text[ japanese ] = "ˆóüŒ©“–‚ð‡‚í‚¹‚é";
    Text[ chinese_traditional ] = "¥¿¤Ï­¶ªº¦æ¶Z¬Ûµ¥";
    Text[ arabic ] = "ÇáÇäÊÙÇã";
    Text[ dutch ] = "registeren";
    Text[ chinese_simplified ] = "Õý·´Ò³µÄÐоàÏàµÈ";
    Text[ greek ] = "Åðéâåâáßùóç åããñáöÞò";
    Text[ korean ] = "µî·Ï À¯È¿¼º";
    Text[ turkish ] = "Eþit satýr yüksekliði";
    Text[ language_user1 ] = " ";
};
String STR_REGISTER_OFF
{
    TEXT = "keine Registerhaltigkeit" ;
    TEXT [ English ] = "no register" ;
    Text [ dutch ] = "niet registeren" ;
    Text [ english_us ] = "Not register-true" ;
    Text [ italian ] = "Senza conformità registro" ;
    Text [ spanish ] = "Sin conformidad registro" ;
    Text [ french ] = "Pas de contrôle de repérage" ;
    Text [ swedish ] = "inget register" ;
    Text [ danish ] = "hold ikke register" ;
    Text [ portuguese ] = "Sem correspondência registo" ;
    Text [ portuguese_brazilian ] = "keine Registerhaltigkeit" ;
    Text[ chinese_simplified ] = "Õý·´Ò³µÄÐо಻ÏàµÈ";
    Text[ russian ] = "Áåç ïðèâîäêè";
    Text[ polish ] = "Bez jednakowej wysokoœci wierszy przy wydruku na przedniej i odwrotnej stronie";
    Text[ japanese ] = "ˆóüŒ©“–‚ð‡‚í‚¹‚È‚¢";
    Text[ chinese_traditional ] = "¥¿¤Ï­¶ªº¦æ¶Z¤£¬Ûµ¥";
    Text[ arabic ] = "ÈÏæä ÇäÊÙÇã";
    Text[ dutch ] = "niet registeren";
    Text[ chinese_simplified ] = "Õý·´Ò³µÄÐо಻ÏàµÈ";
    Text[ greek ] = "×ùñßò åðéâåâáßùóç åããñáöÞò";
    Text[ korean ] = "µî·ÏµÇ¾î ÀÖÁö ¾ÊÀ½";
    Text[ turkish ] = "Eþit satýr yüksekliði mevcut deðil";
    Text[ language_user1 ] = " ";
};
String STR_HORI_RIGHT
{
    TEXT = "rechts" ;
    TEXT [ English ] = "at the right" ;
    Text [ dutch ] = "rechts" ;
    Text [ english_us ] = "at the right" ;
    Text [ italian ] = "Destra" ;
    Text [ spanish ] = "derecha" ;
    Text [ french ] = "À droite" ;
    Text [ swedish ] = "höger" ;
    Text [ danish ] = "højre" ;
    Text [ portuguese ] = "à direita" ;
    Text [ portuguese_brazilian ] = "rechts" ;
    Text[ chinese_simplified ] = "ÓÒ";
    Text[ russian ] = "ñïðàâà";
    Text[ polish ] = "Z prawej";
    Text[ japanese ] = "‰E";
    Text[ chinese_traditional ] = "¥k";
    Text[ arabic ] = "Úáì Çáíãíä";
    Text[ dutch ] = "rechts";
    Text[ chinese_simplified ] = "ÓÒ";
    Text[ greek ] = "äåîéÜ";
    Text[ korean ] = "¿À¸¥ÂÊ¿¡";
    Text[ turkish ] = "sað";
    Text[ language_user1 ] = " ";
};
String STR_HORI_CENTER
{
    TEXT = "horizontal zentriert" ;
    TEXT [ English ] = "centered horizontally" ;
    Text [ dutch ] = "horizontaal gecentreerd" ;
    Text [ english_us ] = "Centered horizontally" ;
    Text [ italian ] = "Centrato orizzontalmente" ;
    Text [ spanish ] = "Centrado horizontal" ;
    Text [ french ] = "Centré horizontalement" ;
    Text [ swedish ] = "Horisontellt centrerad" ;
    Text [ danish ] = "vandret centreret" ;
    Text [ portuguese ] = "Centrado na horizontal" ;
    Text [ portuguese_brazilian ] = "horizontal zentriert" ;
    Text[ chinese_simplified ] = "ˮƽ¾ÓÖÐ";
    Text[ russian ] = "ãîðèçîíòàëüíî ïî öåíòðó";
    Text[ polish ] = "Wyœrodkuj poziomo";
    Text[ japanese ] = "…•½‚É’†‰›‘µ‚¦";
    Text[ chinese_traditional ] = "¤ô¥­¸m¤¤";
    Text[ arabic ] = "ÊæÓíØ ÃÝÞí";
    Text[ dutch ] = "horizontaal gecentreerd";
    Text[ chinese_simplified ] = "ˮƽ¾ÓÖÐ";
    Text[ greek ] = "ïñéæïíôßùò êåíôñáñéóìÝíá";
    Text[ korean ] = "¼öÆòÀ¸·Î °¡¿îµ¥";
    Text[ turkish ] = "Yatay ortala";
    Text[ language_user1 ] = " ";
};
String STR_HORI_LEFT
{
    TEXT = "links" ;
    TEXT [ English ] = "at the left" ;
    Text [ english_us ] = "at the left" ;
    Text [ italian ] = "sinistra" ;
    Text [ spanish ] = "Izquierda" ;
    Text [ french ] = "À gauche" ;
    Text [ dutch ] = "links" ;
    Text [ swedish ] = "vänster" ;
    Text [ danish ] = "venstre" ;
    Text [ portuguese ] = "à esquerda" ;
    Text [ portuguese_brazilian ] = "links" ;
    Text[ chinese_simplified ] = "×ó";
    Text[ russian ] = "ñëåâà";
    Text[ polish ] = "Z lewej";
    Text[ japanese ] = "¶";
    Text[ chinese_traditional ] = "¥ª";
    Text[ arabic ] = "Úáì ÇáíÓÇÑ";
    Text[ dutch ] = "links";
    Text[ chinese_simplified ] = "×ó";
    Text[ greek ] = "áñéóôåñÜ";
    Text[ korean ] = "¿ÞÂÊ¿¡";
    Text[ turkish ] = "sol";
    Text[ language_user1 ] = " ";
};
String STR_HORI_INSIDE
{
    TEXT = "innen" ;
    TEXT [ English ] = "inside" ;
    Text [ dutch ] = "binnen" ;
    Text [ english_us ] = "inside" ;
    Text [ italian ] = "all'interno" ;
    Text [ spanish ] = "interior" ;
    Text [ french ] = "à l'intérieur" ;
    Text [ swedish ] = "innanför" ;
    Text [ danish ] = "inderside" ;
    Text [ portuguese ] = "dentro" ;
    Text [ portuguese_brazilian ] = "innen" ;
    Text[ chinese_simplified ] = "ÄÚ";
    Text[ russian ] = "âíóòðè";
    Text[ polish ] = "Wewn¹trz";
    Text[ japanese ] = "“à‘¤";
    Text[ chinese_traditional ] = "¤º";
    Text[ arabic ] = "ÏÇÎá";
    Text[ dutch ] = "binnen";
    Text[ chinese_simplified ] = "ÄÚ";
    Text[ greek ] = "åóùôåñéêÜ";
    Text[ korean ] = "³»ºÎ";
    Text[ turkish ] = "iç";
    Text[ language_user1 ] = " ";
};
String STR_HORI_OUTSIDE
{
    /* ### ACHTUNG: Neuer Text in Resource? außen : au˜en */
    TEXT = "außen" ;
    TEXT [ English ] = "outside" ;
    Text [ english_us ] = "outside" ;
    Text [ italian ] = "fuori" ;
    Text [ spanish ] = "exterior" ;
    Text [ french ] = "à l'extérieur" ;
    Text [ dutch ] = "buiten" ;
    Text [ swedish ] = "utanför" ;
    Text [ danish ] = "yderside" ;
    Text [ portuguese ] = "fora" ;
    Text [ portuguese_brazilian ] = "außen" ;
    Text[ chinese_simplified ] = "Íâ";
    Text[ russian ] = "ñíàðóæè";
    Text[ polish ] = "Na zewn¹trz";
    Text[ japanese ] = "ŠO‘¤";
    Text[ chinese_traditional ] = "¥~";
    Text[ arabic ] = "ÎÇÑÌ";
    Text[ dutch ] = "buiten";
    Text[ chinese_simplified ] = "Íâ";
    Text[ greek ] = "åîùôåñéêÜ";
    Text[ korean ] = "¿ÜºÎ";
    Text[ turkish ] = "dýþ";
    Text[ language_user1 ] = " ";
};
String STR_HORI_FULL
{
    TEXT = "volle Breite" ;
    TEXT [ English ] = "full width" ;
    Text [ dutch ] = "volle breedte" ;
    Text [ english_us ] = "Full width" ;
    Text [ italian ] = "a tutta larghezza" ;
    Text [ spanish ] = "Ancho total" ;
    Text [ french ] = "Sur toute la largeur" ;
    Text [ swedish ] = "full bredd" ;
    Text [ danish ] = "hele bredden" ;
    Text [ portuguese ] = "Largura completa" ;
    Text [ portuguese_brazilian ] = "volle Breite" ;
    Text[ chinese_simplified ] = "Õû¸ö¿í¶È";
    Text[ russian ] = "ïîëíàÿ øèðèíà";
    Text[ polish ] = "Ca³a szerokoœæ";
    Text[ japanese ] = "Å‘啝";
    Text[ chinese_traditional ] = "¾ã­Ó¼e«×";
    Text[ arabic ] = "ÇáÚÑÖ ßáå";
    Text[ dutch ] = "volle breedte";
    Text[ chinese_simplified ] = "Õû¸ö¿í¶È";
    Text[ greek ] = "ïëüêëçñï ðëÜôïò";
    Text[ korean ] = "ÀüÀÚ";
    Text[ turkish ] = "Tam geniþlik";
    Text[ language_user1 ] = " ";
};
String STR_COLUMNS
{
    TEXT = "Spalten" ;
    TEXT [ English ] = "columns" ;
    Text [ dutch ] = "Kolommen" ;
    Text [ english_us ] = "Columns" ;
    Text [ italian ] = "Colonne" ;
    Text [ spanish ] = "Columnas" ;
    Text [ french ] = "Colonnes" ;
    Text [ swedish ] = "Kolumner" ;
    Text [ danish ] = "kolonner" ;
    Text [ portuguese ] = "Colunas" ;
    Text [ portuguese_brazilian ] = "Spalten" ;
    Text[ chinese_simplified ] = "ÁÐ";
    Text[ russian ] = "Êîëîíêè";
    Text[ polish ] = "Kolumny";
    Text[ japanese ] = "’i‘g‚Ý";
    Text[ chinese_traditional ] = "Äæ";
    Text[ arabic ] = "ÇáÃÚãÏÉ";
    Text[ dutch ] = "Kolommen";
    Text[ chinese_simplified ] = "ÁÐ";
    Text[ greek ] = "ÓôÞëåò";
    Text[ korean ] = "¿­";
    Text[ turkish ] = "Sütun";
    Text[ language_user1 ] = " ";
};
String STR_LINE_WIDTH
{
    TEXT = "Trennlinienbreite:" ;
    TEXT [ English ] = "limiter width:" ;
    Text [ english_us ] = "Separator Width:" ;
    Text [ italian ] = "Spessore linea di sepazione" ;
    Text [ spanish ] = "Ancho de la línea de separación:" ;
    Text [ french ] = "Largeur du trait de séparation :" ;
    Text [ dutch ] = "breedte scheidingslijn:" ;
    Text [ swedish ] = "Skiljelinjens bredd:" ;
    Text [ danish ] = "Separatorbredde:" ;
    Text [ portuguese ] = "Largura do separador:" ;
    Text [ portuguese_brazilian ] = "Trennlinienbreite:" ;
    Text[ chinese_simplified ] = "·Ö¸ôÏß´Ö£º";
    Text[ russian ] = "Øèðèíà ðàçäåëèòåëüíîé ëèíèè:";
    Text[ polish ] = "SzerokoϾ separatora:";
    Text[ japanese ] = "‹æØ‚èü‚Ì•:";
    Text[ chinese_traditional ] = "¤À¹j½u²Ê¡G";
    Text[ arabic ] = "ÚÑÖ ÇáÎØ ÇáÝÇÕá:";
    Text[ dutch ] = "breedte scheidingslijn:";
    Text[ chinese_simplified ] = "·Ö¸ôÏß´Ö£º";
    Text[ greek ] = "ÐëÜôïò äéá÷ùñéóôéêÞò ãñáììÞò:";
    Text[ korean ] = "±¸ºÐÀÚ ³Êºñ:";
    Text[ turkish ] = "Ayýrma çizgisi geniþliði:";
    Text[ language_user1 ] = " ";
};
String STR_MAX_FTN_HEIGHT
{
    /* ### ACHTUNG: Neuer Text in Resource? max. Fußnotenbereich: : max. Fu˜notenbereich: */
    TEXT = "max. Fußnotenbereich:" ;
    TEXT [ English ] = "max. footnotes area:" ;
    Text [ english_us ] = "Max. footnote area:" ;
    Text [ italian ] = "Area massima piè pagina:" ;
    Text [ spanish ] = "Área máx. de la nota al pie:" ;
    Text [ french ] = "Pied de page max. :" ;
    Text [ dutch ] = "max. voetnotenbereik:" ;
    Text [ swedish ] = "max. fotnotsområde:" ;
    Text [ danish ] = "maks. fodnoteområde:" ;
    Text [ portuguese ] = "Área máx. de rodapé:" ;
    Text [ portuguese_brazilian ] = "max. Fußnotenbereich:" ;
    Text[ chinese_simplified ] = "×î´óµÄ×¢½Å·¶Î§£º";
    Text[ russian ] = "Ìàêñ. îáëàñòü ñíîñîê:";
    Text[ polish ] = "Maksymalny obszar przypisów dolnych:";
    Text[ japanese ] = "Å‘å‚Ì‹r’”͈Í";
    Text[ chinese_traditional ] = "³Ì¤jªºµù¸}­S³ò¡G";
    Text[ arabic ] = "ÇáÍÏ ÇáÃÞÕì áäØÇÞ ÇáÍÇÔíÉ ÇáÓÝáíÉ:";
    Text[ dutch ] = "max. voetnotenbereik:";
    Text[ chinese_simplified ] = "×î´óµÄ×¢½Å·¶Î§£º";
    Text[ greek ] = "ÌÝãéóôç ðåñéï÷Þ õðïóçìåßùóçò:";
    Text[ korean ] = "ÃÖ´ë °¢ÁÖ ¿µ¿ª:";
    Text[ turkish ] = "azm. dipnot alaný:";
    Text[ language_user1 ] = " ";
};
String STR_EDIT_IN_READONLY
{
    /* ### ACHTUNG: Neuer Text in Resource? editierbar im schreibgeschütztem Dokument : editierbar im Schreibeschütztem Dokument */
    /* ### ACHTUNG: Neuer Text in Resource? editierbar im schreibgeschütztem Dokument : editierbar im Schreibeschütztem Dokument */
    /* ### ACHTUNG: Neuer Text in Resource? editierbar im schreibgeschütztem Dokument : editierbar im Schreibeschütztem Dokument */
    /* ### ACHTUNG: Neuer Text in Resource? editierbar im schreibgeschütztem Dokument : editierbar im Schreibeschütztem Dokument */
    /* ### ACHTUNG: Neuer Text in Resource? editierbar im schreibgeschütztem Dokument : editierbar im Schreibeschütztem Dokument */
    /* ### ACHTUNG: Neuer Text in Resource? editierbar im schreibgeschütztem Dokument : editierbar im schreibgesch³tztem Dokument */
    TEXT = "editierbar im schreibgeschütztem Dokument" ;
    TEXT [ English ] = "edit in readonly Document" ;
    Text [ portuguese ] = "Editável em documento só de leitura." ;
    Text [ english_us ] = "Editable in read only document" ;
    Text [ portuguese_brazilian ] = "editierbar im Schreibeschütztem Dokument" ;
    Text [ swedish ] = "Redigerbar i skrivskyddat dokument" ;
    Text [ danish ] = "redigerbar i skrivebeskyttet dokument" ;
    Text [ italian ] = "modificabile nel documento a sola lettura" ;
    Text [ spanish ] = "Se puede editar en documentos de solo lectura" ;
    Text [ french ] = "À éditer dans le document en mode Lecture seule" ;
    Text [ dutch ] = "editeerbaar in schrijfbeveiligd document" ;
    Text[ chinese_simplified ] = "Äܹ»±à¼­Êܱ£»¤µÄÎĵµ";
    Text[ russian ] = "Âîçìîæíîñòü ïðàâêè òîëüêî â çàùèùåííîì îò çàïèñè äîêóìåíòå";
    Text[ polish ] = "Mo¿liwy do edycji tylko w dokumencie do odczytu";
    Text[ japanese ] = "‘‚«ž‚ݕی앶‘‚ɕҏW‰Â”\\";
    Text[ chinese_traditional ] = "¯à°÷½s¿è¨ü«OÅ@ªº¤å¥ó";
    Text[ arabic ] = "ÞÇÈá ááÊÍÑíÑ Ýí ãÓÊäÏ ááÞÑÇÁÉ ÝÞØ";
    Text[ dutch ] = "editeerbaar in schrijfbeveiligd document";
    Text[ chinese_simplified ] = "Äܹ»±à¼­Êܱ£»¤µÄÎĵµ";
    Text[ greek ] = "äõíáôüôçôá åðåîåñãáóßáò óå Ýããñáöï 'ìüíï ãéá áíÜãíùóç'";
    Text[ korean ] = "¾²±â º¸È£µÈ ¹®¼­¿¡ ÆíÁý °¡´É";
    Text[ turkish ] = "Salt okunur belgede düzenlenebilir";
    Text[ language_user1 ] = " ";
};
String STR_LAYOUT_SPLIT
{
    TEXT = "Trennen" ;
    TEXT [ English ] = "splitable" ;
    Text [ portuguese ] = "Separar" ;
    Text [ english_us ] = "Split" ;
    Text [ portuguese_brazilian ] = "Trennen" ;
    Text [ swedish ] = "Dela" ;
    Text [ danish ] = "opdel" ;
    Text [ italian ] = "Separa" ;
    Text [ spanish ] = "Dividir" ;
    Text [ french ] = "Scinder" ;
    Text [ dutch ] = "splitsen" ;
    Text[ chinese_simplified ] = "·Ö¸ô";
    Text[ russian ] = "Ðàçäåëèòü";
    Text[ polish ] = "Podziel";
    Text[ japanese ] = "•ªŠ„";
    Text[ chinese_traditional ] = "¤À¶}";
    Text[ arabic ] = "ÊÞÓíã";
    Text[ dutch ] = "splitsen";
    Text[ chinese_simplified ] = "·Ö¸ô";
    Text[ greek ] = "ÄéÜóðáóç";
    Text[ korean ] = "³ª´©±â";
    Text[ turkish ] = "Böl";
    Text[ language_user1 ] = " ";
};
String STR_NUMRULE_ON
{
    Text = "Nummerierung" ;
    Text [ English ] = "Numbering" ;
    Text [ portuguese ] = "Numeração" ;
    Text [ english_us ] = "Numbering" ;
    Text [ portuguese_brazilian ] = "Numerierung" ;
    Text [ swedish ] = "Numrering" ;
    Text [ danish ] = "nummerering" ;
    Text [ italian ] = "Numerazione" ;
    Text [ spanish ] = "Numeración" ;
    Text [ french ] = "Numérotation" ;
    Text [ dutch ] = "Nummering" ;
    Text[ chinese_simplified ] = "񅧏";
    Text[ russian ] = "Íóìåðàöèÿ";
    Text[ polish ] = "Numeracja";
    Text[ japanese ] = "”ԍ†•t‚¯";
    Text[ chinese_traditional ] = "½s¸¹";
    Text[ arabic ] = "ÇáÊÑÞíã";
    Text[ dutch ] = "Nummering";
    Text[ chinese_simplified ] = "񅧏";
    Text[ greek ] = "Áñßèìçóç";
    Text[ korean ] = "¹øÈ£ ¸Å±â±â";
    Text[ turkish ] = "Numaralama";
    Text[ language_user1 ] = " ";
};
String STR_NUMRULE_OFF
{
    Text = "keine Nummerierung" ;
    Text [ English ] = "no numbering" ;
    Text [ portuguese ] = "sem numeração" ;
    Text [ english_us ] = "no numbering" ;
    Text [ portuguese_brazilian ] = "keine Numerierung" ;
    Text [ swedish ] = "ingen numrering" ;
    Text [ danish ] = "ingen nummerering" ;
    Text [ italian ] = "Nessuna numerazione" ;
    Text [ spanish ] = "Sin numeración" ;
    Text [ french ] = "pas de numérotation" ;
    Text [ dutch ] = "geen nummering" ;
    Text[ chinese_simplified ] = "ÎÞ±àºÅ";
    Text[ russian ] = "áåç íóìåðàöèè";
    Text[ polish ] = "Bez numeracji";
    Text[ japanese ] = "”ԍ†•t‚¯‚È‚µ";
    Text[ chinese_traditional ] = "¤£½s¸¹";
    Text[ arabic ] = "ÈÏæä ÊÑÞíã";
    Text[ dutch ] = "geen nummering";
    Text[ chinese_simplified ] = "ÎÞ±àºÅ";
    Text[ greek ] = "÷ùñßò áñßèìçóç";
    Text[ korean ] = "¹øÈ£¸Å±â±â ¾øÀ½";
    Text[ turkish ] = "Numaralama yok";
    Text[ language_user1 ] = " ";
};
String STR_CONNECT1
{
    TEXT = "Verbunden mit " ;
    TEXT [ English ] = "connected to " ;
    Text [ portuguese ] = "ligado com " ;
    Text [ english_us ] = "linked to " ;
    Text [ portuguese_brazilian ] = "Verbunden mit " ;
    Text [ swedish ] = "Förbunden med " ;
    Text [ danish ] = "forbundet med " ;
    Text [ italian ] = "Collegato con " ;
    Text [ spanish ] = "Vinculado a  " ;
    Text [ french ] = "Lié à[_] " ;
    Text [ dutch ] = "Verbonden met  " ;
    Text[ chinese_simplified ] = "Á¬½Óµ½ ";
    Text[ russian ] = "Ñâÿçàòü ñ ";
    Text[ polish ] = "Po³¹czony z   ";
    Text[ japanese ] = "Œ‹‡æ ";
    Text[ chinese_traditional ] = "³sµ²¨ì ";
    Text[ arabic ] = "ãÑÊÈØ ãÚ ";
    Text[ dutch ] = "Verbonden met  ";
    Text[ chinese_simplified ] = "Á¬½Óµ½ ";
    Text[ greek ] = "ÓõíäåäåìÝíï ìå ";
    Text[ korean ] = "¿¬°á ";
    Text[ turkish ] = "Baðlanýlan ";
    Text[ language_user1 ] = " ";
};
String STR_CONNECT2
{
    TEXT = " und " ;
    TEXT [ English ] = " and " ;
    Text [ portuguese ] = "e " ;
    Text [ english_us ] = "and " ;
    Text [ portuguese_brazilian ] = "und " ;
    Text [ swedish ] = "och " ;
    Text [ danish ] = "og " ;
    Text [ italian ] = "e " ;
    Text [ spanish ] = "y  " ;
    Text [ french ] = "et " ;
    Text [ dutch ] = "en  " ;
    Text[ chinese_simplified ] = "ºÍ ";
    Text[ russian ] = "è  ";
    Text[ polish ] = "i ";
    Text[ japanese ] = "‚¨‚æ‚Ñ ";
    Text[ chinese_traditional ] = "©M ";
    Text[ arabic ] = "æ ";
    Text[ dutch ] = "en  ";
    Text[ chinese_simplified ] = "ºÍ ";
    Text[ greek ] = "êáé ";
    Text[ korean ] = "¿Í ";
    Text[ turkish ] = "ve ";
    Text[ language_user1 ] = " ";
};
String STR_LINECOUNT
{
    TEXT = "Zeilen zählen" ;
    TEXT [ English ] = "count lines" ;
    Text [ portuguese ] = "Contar linhas" ;
    Text [ english_us ] = "Count lines" ;
    Text [ portuguese_brazilian ] = "Zeilen zählen" ;
    Text [ swedish ] = "räkna rader" ;
    Text [ danish ] = "tæl linjer" ;
    Text [ italian ] = "Conta le righe" ;
    Text [ spanish ] = "Contar líneas" ;
    Text [ french ] = "Compter les lignes" ;
    Text [ dutch ] = "regels tellen" ;
    Text[ chinese_simplified ] = "ÐмÆÊý";
    Text[ russian ] = "Ïîäñ÷åò ñòðîê";
    Text[ polish ] = "Policz wiersze";
    Text[ japanese ] = "s‚𐔂¦‚é";
    Text[ chinese_traditional ] = "¦æ­p¼Æ";
    Text[ arabic ] = "ÚÏ ÇáÃÓØÑ";
    Text[ dutch ] = "regels tellen";
    Text[ chinese_simplified ] = "ÐмÆÊý";
    Text[ greek ] = "ÊáôáìÝôñçóç ãñáììþí";
    Text[ korean ] = "¼± Ä«¿îÆ®";
    Text[ turkish ] = "Satýr say";
    Text[ language_user1 ] = " ";
};
String STR_DONTLINECOUNT
{
    TEXT = "Zeilen nicht zählen" ;
    TEXT [ English ] = "dont count lines" ;
    Text [ portuguese ] = "não contar linhas" ;
    Text [ english_us ] = "don't count lines" ;
    Text [ portuguese_brazilian ] = "Zeilen nicht zählen" ;
    Text [ swedish ] = "räkna inte rader" ;
    Text [ danish ] = "tæl linjer ikke" ;
    Text [ italian ] = "Non contare le righe" ;
    Text [ spanish ] = "No contar las líneas" ;
    Text [ french ] = "Ne pas compter les lignes" ;
    Text [ dutch ] = "Regels niet tellen" ;
    Text[ chinese_simplified ] = "²»¼ÆÊýÐÐ";
    Text[ russian ] = "Ñòðîêè íå ñ÷èòàòü";
    Text[ polish ] = "Nie liczyæ wierszy";
    Text[ japanese ] = "s‚𐔂¦‚È‚¢";
    Text[ chinese_traditional ] = "¤£­p¼Æ¦æ";
    Text[ arabic ] = "ÚÏã ÚÏ ÇáÃÓØÑ";
    Text[ dutch ] = "Regels niet tellen";
    Text[ chinese_simplified ] = "²»¼ÆÊýÐÐ";
    Text[ greek ] = "¼÷é êáôáìÝôñçóç ãñáììþí";
    Text[ korean ] = "¼± Ä«¿îÆ®¸¦ ÇÏÁö ¾ÊÀ½";
    Text[ turkish ] = "Satýrlarý sayma";
    Text[ language_user1 ] = " ";
};
String STR_LINCOUNT_START
{
    TEXT = "Zeilenzähler starten mit: " ;
    TEXT [ English ] = "restart linecount with: " ;
    Text [ portuguese ] = "Iniciar contagem de linhas com: " ;
    Text [ english_us ] = "restart line count with: " ;
    Text [ portuguese_brazilian ] = "Zeilenzähler starten mit: " ;
    Text [ swedish ] = "Starta radräknaren med " ;
    Text [ danish ] = "begynd linjeoptælling med " ;
    Text [ italian ] = "Iniziare a contare le righe con: " ;
    Text [ spanish ] = "Iniciar recuento de líneas con:  " ;
    Text [ french ] = "Commencer le compte des lignes à :[_]" ;
    Text [ dutch ] = "regels telllen starten bij:  " ;
    Text[ chinese_simplified ] = "¼ÆÊýÐдӣº ";
    Text[ russian ] = "Íà÷àòü ïîäñ÷åò ñòðîê ñ:  ";
    Text[ polish ] = "Rozpocznij liczenie wierszy od:  ";
    Text[ japanese ] = "s”‚¦‚ÌŠJŽn: ";
    Text[ chinese_traditional ] = "­p¼Æ¦æ±q¡G ";
    Text[ arabic ] = "ÈÏÁ ÊÑÞíã ÇáÃÓØÑ ÈÜ: ";
    Text[ dutch ] = "regels telllen starten bij:  ";
    Text[ chinese_simplified ] = "¼ÆÊýÐдӣº ";
    Text[ greek ] = "Åêêßíçóç êáôáìÝôñçóçò ãñáììþí áðü: ";
    Text[ korean ] = "ÁÙ¼¼±â ½ÃÀÛ À§Ä¡: ";
    Text[ turkish ] = "Satýr sayma baþlangýcý: ";
    Text[ language_user1 ] = " ";
};

String STR_LUMINANCE
{
    Text = "Helligkeit: ";
    Text[ english ] = "Luminance: ";
    Text[ english_us ] = "Brightness: ";
    Text[ portuguese ] = "Luminance: ";
    Text[ russian ] = "Luminance: ";
    Text[ greek ] = "Luminance: ";
    Text[ dutch ] = "Luminance: ";
    Text[ french ] = "Luminosité : ";
    Text[ spanish ] = "Luminance: ";
    Text[ italian ] = "Luminance: ";
    Text[ danish ] = "Lysstyrke: ";
    Text[ swedish ] = "Luminance: ";
    Text[ polish ] = "Luminance: ";
    Text[ portuguese_brazilian ] = "Luminance: ";
    Text[ japanese ] = "–¾“x: ";
    Text[ korean ] = "Luminance: ";
    Text[ chinese_simplified ] = "ÁÁ¶È£º ";
    Text[ chinese_traditional ] = "«G«×¡G ";
    Text[ turkish ] = "Luminance: ";
    Text[ arabic ] = "Luminance: ";
};

String STR_CHANNELR
{
    Text = "Rotanteil: ";
    Text[ english ] = "Red portion: ";
    Text[ english_us ] = "Red: ";
    Text[ portuguese ] = "Red portion: ";
    Text[ russian ] = "Red portion: ";
    Text[ greek ] = "Red portion: ";
    Text[ dutch ] = "Red portion: ";
    Text[ french ] = "Proportion de rouge : ";
    Text[ spanish ] = "Red portion: ";
    Text[ italian ] = "Red portion: ";
    Text[ danish ] = "Rød-andel: ";
    Text[ swedish ] = "Red portion: ";
    Text[ polish ] = "Red portion: ";
    Text[ portuguese_brazilian ] = "Red portion: ";
    Text[ japanese ] = "ÔF‚ÌŠ„‡: ";
    Text[ korean ] = "Red portion: ";
    Text[ chinese_simplified ] = "ºìÉ«±ÈÀý£º ";
    Text[ chinese_traditional ] = "¬õ¦â¤ñ¨Ò¡G ";
    Text[ turkish ] = "Red portion: ";
    Text[ arabic ] = "Red portion: ";
};

String STR_CHANNELG
{
    Text = "Grünanteil: ";
    Text[ english ] = "Green portion: ";
    Text[ english_us ] = "Green: ";
    Text[ portuguese ] = "Green portion: ";
    Text[ russian ] = "Green portion: ";
    Text[ greek ] = "Green portion: ";
    Text[ dutch ] = "Green portion: ";
    Text[ french ] = "Proportion de vert : ";
    Text[ spanish ] = "Green portion: ";
    Text[ italian ] = "Green portion: ";
    Text[ danish ] = "Grøn-andel: ";
    Text[ swedish ] = "Green portion: ";
    Text[ polish ] = "Green portion: ";
    Text[ portuguese_brazilian ] = "Green portion: ";
    Text[ japanese ] = "—ΐF‚ÌŠ„‡: ";
    Text[ korean ] = "Green portion: ";
    Text[ chinese_simplified ] = "ÂÌÉ«±ÈÀý£º ";
    Text[ chinese_traditional ] = "ºñ¦â¤ñ¨Ò¡G ";
    Text[ turkish ] = "Green portion: ";
    Text[ arabic ] = "Green portion: ";
};

String STR_CHANNELB
{
    Text = "Blauanteil: ";
    Text[ english ] = "Blue portion: ";
    Text[ english_us ] = "Blue: ";
    Text[ portuguese ] = "Blue portion: ";
    Text[ russian ] = "Blue portion: ";
    Text[ greek ] = "Blue portion: ";
    Text[ dutch ] = "Blue portion: ";
    Text[ french ] = "Proportion de bleu : ";
    Text[ spanish ] = "Blue portion: ";
    Text[ italian ] = "Blue portion: ";
    Text[ danish ] = "Blå-andel: ";
    Text[ swedish ] = "Blue portion: ";
    Text[ polish ] = "Blue portion: ";
    Text[ portuguese_brazilian ] = "Blue portion: ";
    Text[ japanese ] = "ÂF‚ÌŠ„‡: ";
    Text[ korean ] = "Blue portion: ";
    Text[ chinese_simplified ] = "À¶É«±ÈÀý£º ";
    Text[ chinese_traditional ] = "ÂŦâ¤ñ¨Ò¡G ";
    Text[ turkish ] = "Blue portion: ";
    Text[ arabic ] = "Blue portion: ";
};

String STR_CONTRAST
{
    Text = "Kontrast: ";
    Text[ english ] = "Contrast: ";
    Text[ english_us ] = "Contrast: ";
    Text[ portuguese ] = "Contrast: ";
    Text[ russian ] = "Contrast: ";
    Text[ greek ] = "Contrast: ";
    Text[ dutch ] = "Contrast: ";
    Text[ french ] = "Contraste : ";
    Text[ spanish ] = "Contrast: ";
    Text[ italian ] = "Contrast: ";
    Text[ danish ] = "Kontrast: ";
    Text[ swedish ] = "Contrast: ";
    Text[ polish ] = "Contrast: ";
    Text[ portuguese_brazilian ] = "Contrast: ";
    Text[ japanese ] = "ºÝÄ×½Ä: ";
    Text[ korean ] = "Contrast: ";
    Text[ chinese_simplified ] = "¶Ô±È¶È£º ";
    Text[ chinese_traditional ] = "¹ï¤ñ«×¡G ";
    Text[ turkish ] = "Contrast: ";
    Text[ arabic ] = "Contrast: ";
};

String STR_GAMMA
{
    Text = "Gamma: ";
    Text[ english ] = "Gamma: ";
    Text[ english_us ] = "Gamma: ";
    Text[ portuguese ] = "Gamma: ";
    Text[ russian ] = "Gamma: ";
    Text[ greek ] = "Gamma: ";
    Text[ dutch ] = "Gamma: ";
    Text[ french ] = "Gamma : ";
    Text[ spanish ] = "Gamma: ";
    Text[ italian ] = "Gamma: ";
    Text[ danish ] = "Gamma: ";
    Text[ swedish ] = "Gamma: ";
    Text[ polish ] = "Gamma: ";
    Text[ portuguese_brazilian ] = "Gamma: ";
    Text[ japanese ] = "¶ÞÝÏ: ";
    Text[ korean ] = "Gamma: ";
    Text[ chinese_simplified ] = "»ÒɫϵÊý£º ";
    Text[ chinese_traditional ] = "¦Ç¦â¨t¼Æ¡G ";
    Text[ turkish ] = "Gamma: ";
    Text[ arabic ] = "Gamma: ";
};

String STR_TRANSPARENCY
{
    Text = "Transparenz: ";
    Text[ english ] = "Transparency: ";
    Text[ english_us ] = "Transparency: ";
    Text[ portuguese ] = "Transparency: ";
    Text[ russian ] = "Transparency: ";
    Text[ greek ] = "Transparency: ";
    Text[ dutch ] = "Transparency: ";
    Text[ french ] = "Transparence: ";
    Text[ spanish ] = "Transparency: ";
    Text[ italian ] = "Transparency: ";
    Text[ danish ] = "Transparens: ";
    Text[ swedish ] = "Transparency: ";
    Text[ polish ] = "Transparency: ";
    Text[ portuguese_brazilian ] = "Transparency: ";
    Text[ japanese ] = "“§‰ß«: ";
    Text[ korean ] = "Transparency: ";
    Text[ chinese_simplified ] = "͸Ã÷¶È£º ";
    Text[ chinese_traditional ] = "³z©ú«×¡G ";
    Text[ turkish ] = "Transparency: ";
    Text[ arabic ] = "Transparency: ";
};

String STR_INVERT
{
    Text = "Invertieren";
    Text[ english ] = "Invert";
};
String STR_INVERT_NOT
{
    Text = "nicht invertieren";
    Text[ english ] = "not invert";
    Text[ english_us ] = "do not invert";
    Text[ portuguese ] = "not invert";
    Text[ russian ] = "not invert";
    Text[ greek ] = "not invert";
    Text[ dutch ] = "not invert";
    Text[ french ] = "ne pas invertir";
    Text[ spanish ] = "not invert";
    Text[ italian ] = "not invert";
    Text[ danish ] = "ikke invertere";
    Text[ swedish ] = "not invert";
    Text[ polish ] = "not invert";
    Text[ portuguese_brazilian ] = "not invert";
    Text[ japanese ] = "‹t“]‚È‚µ";
    Text[ korean ] = "not invert";
    Text[ chinese_simplified ] = "²»×ª»»»¥²¹É«";
    Text[ chinese_traditional ] = "¤£Âà´«¤¬¸É¦â";
    Text[ turkish ] = "not invert";
    Text[ arabic ] = "not invert";
};

String STR_DRAWMODE
{
    Text = "Grafikmodus: ";
    Text[ english ] = "Graphics mode: ";
    Text[ english_us ] = "Graphics mode: ";
    Text[ portuguese ] = "Graphics mode: ";
    Text[ russian ] = "Graphics mode: ";
    Text[ greek ] = "Graphics mode: ";
    Text[ dutch ] = "Graphics mode: ";
    Text[ french ] = "Mode Graphique : ";
    Text[ spanish ] = "Graphics mode: ";
    Text[ italian ] = "Graphics mode: ";
    Text[ danish ] = "Billedmodus: ";
    Text[ swedish ] = "Graphics mode: ";
    Text[ polish ] = "Graphics mode: ";
    Text[ portuguese_brazilian ] = "Graphics mode: ";
    Text[ japanese ] = "¸Þ×̨¯¸Ó°ÄÞ: ";
    Text[ korean ] = "Graphics mode: ";
    Text[ chinese_simplified ] = "ͼÐÎģʽ£º ";
    Text[ chinese_traditional ] = "¹Ï§Î¼Ò¦¡¡G ";
    Text[ turkish ] = "Graphics mode: ";
    Text[ arabic ] = "Graphics mode: ";
};

String STR_DRAWMODE_STD
{
    Text = "Standard";
    Text[ english ] = "Standard";
    Text[ english_us ] = "Standard";
    Text[ portuguese ] = "Standard";
    Text[ russian ] = "Standard";
    Text[ greek ] = "Standard";
    Text[ dutch ] = "Standard";
    Text[ french ] = "Standard";
    Text[ spanish ] = "Standard";
    Text[ italian ] = "Standard";
    Text[ danish ] = "Standard";
    Text[ swedish ] = "Standard";
    Text[ polish ] = "Standard";
    Text[ portuguese_brazilian ] = "Standard";
    Text[ japanese ] = "•W€";
    Text[ korean ] = "Standard";
    Text[ chinese_simplified ] = "±ê×¼";
    Text[ chinese_traditional ] = "¼Ð­ã";
    Text[ turkish ] = "Standard";
    Text[ arabic ] = "Standard";
};
String STR_DRAWMODE_GREY
{
    Text = "Graustufen";
    Text[ english ] = "Greys";
    Text[ english_us ] = "Grayscales";
    Text[ portuguese ] = "Greys";
    Text[ russian ] = "Greys";
    Text[ greek ] = "Greys";
    Text[ dutch ] = "Greys";
    Text[ french ] = "Niveaux de gris";
    Text[ spanish ] = "Greys";
    Text[ italian ] = "Greys";
    Text[ danish ] = "Gråtoner";
    Text[ swedish ] = "Greys";
    Text[ polish ] = "Greys";
    Text[ portuguese_brazilian ] = "Greys";
    Text[ japanese ] = "¸ÞÚ°½¹°Ù";
    Text[ korean ] = "Greys";
    Text[ chinese_simplified ] = "»Ò¶È";
    Text[ chinese_traditional ] = "¦Ç¶¥";
    Text[ turkish ] = "Greys";
    Text[ arabic ] = "Greys";
};
String STR_DRAWMODE_BLACKWHITE
{
    Text = "Schwarz/Weiß";
    Text[ english ] = "Black/White";
    Text[ english_us ] = "Black & White";
    Text[ portuguese ] = "Black/White";
    Text[ russian ] = "Black/White";
    Text[ greek ] = "Black/White";
    Text[ dutch ] = "Black/White";
    Text[ french ] = "Noir/Blanc";
    Text[ spanish ] = "Black/White";
    Text[ italian ] = "Black/White";
    Text[ danish ] = "Sort-hvid";
    Text[ swedish ] = "Black/White";
    Text[ polish ] = "Black/White";
    Text[ portuguese_brazilian ] = "Black/White";
    Text[ japanese ] = "”’•";
    Text[ korean ] = "Black/White";
    Text[ chinese_simplified ] = "ºÚ°×";
    Text[ chinese_traditional ] = "¶Â¥Õ";
    Text[ turkish ] = "Black/White";
    Text[ arabic ] = "Black/White";
};
String STR_DRAWMODE_WATERMARK
{
    Text = "Wasserzeichen";
    Text[ english ] = "Watermark";
    Text[ english_us ] = "Watermark";
    Text[ portuguese ] = "Watermark";
    Text[ russian ] = "Watermark";
    Text[ greek ] = "Watermark";
    Text[ dutch ] = "Watermark";
    Text[ french ] = "Filigrane";
    Text[ spanish ] = "Watermark";
    Text[ italian ] = "Watermark";
    Text[ danish ] = "Vandmærke";
    Text[ swedish ] = "Watermark";
    Text[ polish ] = "Watermark";
    Text[ portuguese_brazilian ] = "Watermark";
    Text[ japanese ] = "“§‚©‚µ";
    Text[ korean ] = "Watermark";
    Text[ chinese_simplified ] = "ˮӡ";
    Text[ chinese_traditional ] = "¤ô¦L";
    Text[ turkish ] = "Watermark";
    Text[ arabic ] = "Watermark";
};
String STR_ROTATION
{
    Text = "Drehung";
    Text[ english ] = "Rotation";
    Text[ english_us ] = "Rotation";
    Text[ portuguese ] = "Rotation";
    Text[ russian ] = "Rotation";
    Text[ greek ] = "Rotation";
    Text[ dutch ] = "Rotation";
    Text[ french ] = "Rotation";
    Text[ spanish ] = "Rotation";
    Text[ italian ] = "Rotation";
    Text[ danish ] = "Rotation";
    Text[ swedish ] = "Rotation";
    Text[ polish ] = "Rotation";
    Text[ portuguese_brazilian ] = "Rotation";
    Text[ japanese ] = "‰ñ“]";
    Text[ korean ] = "Rotation";
    Text[ chinese_simplified ] = "Ðýת";
    Text[ chinese_traditional ] = "±ÛÂà";
    Text[ turkish ] = "Rotation";
    Text[ arabic ] = "Rotation";
};


diff --git a/sw/source/ui/utlui/bookctrl.cxx b/sw/source/ui/utlui/bookctrl.cxx
new file mode 100644
index 0000000..ad2d1da
--- /dev/null
+++ b/sw/source/ui/utlui/bookctrl.cxx
@@ -0,0 +1,291 @@
/*************************************************************************
 *
 *  $RCSfile: bookctrl.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:49 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "hintids.hxx"

#ifndef _SVSTDARR_HXX
#define _SVSTDARR_USHORTS
#include <svtools/svstdarr.hxx>
#endif
#ifndef _SFXINTITEM_HXX //autogen
#include <svtools/intitem.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _EVENT_HXX //autogen
#include <vcl/event.hxx>
#endif
#ifndef _STATUS_HXX //autogen
#include <vcl/status.hxx>
#endif
#ifndef _MENU_HXX //autogen
#include <vcl/menu.hxx>
#endif
#ifndef _SFXVIEWFRM_HXX
#include <sfx2/viewfrm.hxx>
#endif


#include "cmdid.h"
#include "errhdl.hxx"
#include "swmodule.hxx"
#include "wrtsh.hxx"
#include "bookmrk.hxx"
#include "bookctrl.hxx"


SFX_IMPL_STATUSBAR_CONTROL( SwBookmarkControl, SfxStringItem );

// class BookmarkPopup_Impl --------------------------------------------------

class BookmarkPopup_Impl : public PopupMenu
{
public:
    BookmarkPopup_Impl();

    USHORT          GetCurId() const { return nCurId; }

private:
    USHORT          nCurId;

    virtual void    Select();
};

// -----------------------------------------------------------------------

BookmarkPopup_Impl::BookmarkPopup_Impl() :
    PopupMenu(),
    nCurId(USHRT_MAX)
{
}

// -----------------------------------------------------------------------

void BookmarkPopup_Impl::Select()
{
    nCurId = GetCurItemId();
}

// class SvxZoomStatusBarControl ------------------------------------------

SwBookmarkControl::SwBookmarkControl( USHORT nId,
                                                  StatusBar& rStb,
                                                  SfxBindings& rBind ) :
    SfxStatusBarControl( nId, rStb, rBind )
{
}

// -----------------------------------------------------------------------

SwBookmarkControl::~SwBookmarkControl()
{
}

// -----------------------------------------------------------------------

void SwBookmarkControl::StateChanged( const SfxPoolItem* pState )
{
    SfxItemState eState = GetItemState(pState);

    if( eState != SFX_ITEM_AVAILABLE || pState->ISA( SfxVoidItem ) )
        GetStatusBar().SetItemText( GetId(), String() );
    else if ( pState->ISA( SfxStringItem ) )
    {
        sPageNumber = ((SfxStringItem*)pState)->GetValue();
        GetStatusBar().SetItemText( GetId(), sPageNumber );
    }
}

// -----------------------------------------------------------------------

void SwBookmarkControl::Paint( const UserDrawEvent&  )
{
    GetStatusBar().SetItemText( GetId(), sPageNumber );
}

// -----------------------------------------------------------------------

void SwBookmarkControl::Command( const CommandEvent& rCEvt )
{
    if ( rCEvt.GetCommand() == COMMAND_CONTEXTMENU &&
            GetStatusBar().GetItemText( GetId() ).Len() )
    {
        CaptureMouse();
        BookmarkPopup_Impl aPop;
        SwWrtShell* pWrtShell = ::GetActiveWrtShell();
        USHORT nBookCnt;
        if( pWrtShell && 0 != ( nBookCnt = pWrtShell->GetBookmarkCnt() ) )
        {
            SvUShorts aBookArr;
            for( USHORT nCount = 0; nCount < nBookCnt; ++nCount )
            {
                SwBookmark& rBkmk = pWrtShell->GetBookmark( nCount );
                if( rBkmk.IsBookMark() )
                {
                    aBookArr.Insert( nCount, aBookArr.Count() );
                    aPop.InsertItem( aBookArr.Count(), rBkmk.GetName() );
                }
            }
            aPop.Execute( &GetStatusBar(), rCEvt.GetMousePosPixel());
            USHORT nId = aPop.GetCurId();
            if( nId != USHRT_MAX)
            {
                SfxUInt16Item aBookmark( FN_STAT_BOOKMARK, aBookArr[nId-1] );
                SfxViewFrame::Current()->GetDispatcher()->Execute(  FN_STAT_BOOKMARK,
                    SFX_CALLMODE_ASYNCHRON|SFX_CALLMODE_RECORD,
                                        &aBookmark, 0L );
            }
        }
        ReleaseMouse();
    }
}

/*************************************************************************

      $Log: not supported by cvs2svn $
      Revision 1.30  2000/09/18 16:06:17  willem.vandorp
      OpenOffice header added.

      Revision 1.29  2000/09/07 15:59:34  os
      change: SFX_DISPATCHER/SFX_BINDINGS removed

      Revision 1.28  2000/02/11 15:00:22  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.27  1998/03/10 14:35:06  OS
      Textmarkenindex wieder selbst feststellen #47718#


      Rev 1.26   10 Mar 1998 15:35:06   OS
   Textmarkenindex wieder selbst feststellen #47718#

      Rev 1.25   23 Feb 1998 07:20:24   OS
   GetBookmark/ Cnt mit Bookmark-Flag

      Rev 1.24   21 Nov 1997 12:10:14   MA
   includes

      Rev 1.23   03 Nov 1997 13:59:22   MA
   precomp entfernt

      Rev 1.22   29 Aug 1997 15:57:30   OS
   PopupMenu::Execute mit Window* fuer VCL

      Rev 1.21   29 Aug 1997 13:36:12   OS
   DLL-Umbau

      Rev 1.20   08 Aug 1997 17:25:24   OM
   Headerfile-Umstellung

      Rev 1.19   09 Jul 1997 17:45:30   HJS
   includes

      Rev 1.18   14 Jan 1997 09:37:30   TRI
   includes

      Rev 1.17   23 Oct 1996 13:49:32   JP
   SVMEM -> SVSTDARR Umstellung

      Rev 1.16   28 Aug 1996 15:42:46   OS
   includes

      Rev 1.15   24 Jul 1996 13:49:56   OS
   PCH nachgeruestet

      Rev 1.14   26 Jun 1996 15:04:02   OS
   Aufruf von Dispatcher.Execute an 324 angepasst

      Rev 1.13   01 Feb 1996 19:07:02   JP
   BookmarkControl::Command: ans PopUp die Pos im Bookmark-Array uebergeben, nicht die laufende!

      Rev 1.12   17 Nov 1995 12:47:52   MA
   Segmentierung

      Rev 1.11   13 Nov 1995 20:46:10   JP
   Ptrarr gegen SvUShortArr ausgetauscht

      Rev 1.10   07 Nov 1995 18:04:16   MA
   opt/fix/chg: statics und segs

      Rev 1.9   17 Oct 1995 20:54:14   JP
   IsMark oder IsBookmark am Bookmark benutzen

      Rev 1.8   06 Oct 1995 00:20:14   HJS
   pState => eState

      Rev 1.7   05 Oct 1995 18:41:12   OM
   StateChanged umgestellt

      Rev 1.6   09 Aug 1995 19:15:18   OS
   Umstellung auf CommandHdl

*************************************************************************/


diff --git a/sw/source/ui/utlui/condedit.cxx b/sw/source/ui/utlui/condedit.cxx
new file mode 100644
index 0000000..e050dbc6a
--- /dev/null
+++ b/sw/source/ui/utlui/condedit.cxx
@@ -0,0 +1,179 @@
/*************************************************************************
 *
 *  $RCSfile: condedit.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:49 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

// include ---------------------------------------------------------------

#pragma hdrstop

#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _SV_EVENT_HXX //autogen
#include <vcl/event.hxx>
#endif
#ifndef _SV_DRAG_HXX //autogen
#include <vcl/drag.hxx>
#endif
#ifndef _SOT_FORMATS_HXX //autogen
#include <sot/formats.hxx>
#endif

#ifndef _CONDEDIT_HXX
#include <condedit.hxx>
#endif

#define DB_DD_DELIM 0x0b

// STATIC DATA -----------------------------------------------------------

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

ConditionEdit::ConditionEdit( Window* pParent, const ResId& rResId ) :
        Edit( pParent, rResId ),
        bBrackets(TRUE)
{
    EnableDrop();
}

/*--------------------------------------------------------------------
    Beschreibung: Drop moeglich, bzw Format bekannt?
 --------------------------------------------------------------------*/

BOOL ConditionEdit::QueryDrop( DropEvent& rDEvt )
{
    rDEvt.SetAction(DROP_COPY);

    if (DragServer::HasFormat(0, SOT_FORMATSTR_ID_SBA_FIELDDATAEXCHANGE ))
    {
        BOOL bString = FALSE;

        for (USHORT nItem = 0; nItem < DragServer::GetItemCount(); nItem++)
        {
            if (DragServer::HasFormat(nItem, FORMAT_STRING))
            {
                bString = TRUE;
                break;
            }
        }
        if (!bString)   // String reinpacken, um DD-Cursor zu erhalten
        {
            if (DragServer::HasFormat(0, SOT_FORMATSTR_ID_SBA_FIELDDATAEXCHANGE))
            {
                USHORT nLen = (USHORT)DragServer::GetDataLen(0, SOT_FORMATSTR_ID_SBA_FIELDDATAEXCHANGE) - 1;
                DBG_ASSERT(!(nLen%2), "not a UniString")
                String sTxt;
                sal_Unicode *pTxt = sTxt.AllocBuffer(nLen / 2);

                DragServer::PasteData(0, pTxt, nLen, SOT_FORMATSTR_ID_SBA_FIELDDATAEXCHANGE);

                String sDBName;
                if (bBrackets)
                    sDBName += '[';
                sDBName += sTxt.GetToken(0, DB_DD_DELIM);
                sDBName += '.';
                sDBName += sTxt.GetToken(1, DB_DD_DELIM);
                sDBName += '.';
                sDBName += sTxt.GetToken(3, DB_DD_DELIM);   // ColumnName
                if (bBrackets)
                    sDBName += ']';
                DragServer::CopyString(sDBName);
            }
        }
    }

    return Edit::QueryDrop( rDEvt );
}

/*************************************************************************

      Source Code Control System - History

      $Log: not supported by cvs2svn $
      Revision 1.7  2000/09/18 16:06:17  willem.vandorp
      OpenOffice header added.

      Revision 1.6  2000/04/18 15:14:08  os
      UNICODE

      Revision 1.5  2000/02/11 15:00:29  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.4  1998/11/17 21:18:48  JP
      Task #59398#: ClipboardFormatId Umstellungen


      Rev 1.3   17 Nov 1998 22:18:48   JP
   Task #59398#: ClipboardFormatId Umstellungen

      Rev 1.2   18 May 1998 14:53:24   OM
   #50001 Keine eckigen Klammern in DB-Condition-Fields

      Rev 1.1   12 Mar 1998 16:32:42   OM
   Datenbanknamen in eckigen Klammern bei Drop

      Rev 1.0   19 Nov 1997 16:21:42   OM
   Initial revision.

*************************************************************************/


diff --git a/sw/source/ui/utlui/content.cxx b/sw/source/ui/utlui/content.cxx
new file mode 100644
index 0000000..aad5df0
--- /dev/null
+++ b/sw/source/ui/utlui/content.cxx
@@ -0,0 +1,3223 @@
/*************************************************************************
 *
 *  $RCSfile: content.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:50 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SVSTDARR_HXX
#define _SVSTDARR_STRINGSDTOR
#include <svtools/svstdarr.hxx>
#endif
#ifndef _DRAG_HXX //autogen
#include <vcl/drag.hxx>
#endif
#ifndef _URLBMK_HXX //autogen
#include <svtools/urlbmk.hxx>
#endif
#ifndef _URLOBJ_HXX //autogen
#include <tools/urlobj.hxx>
#endif
#ifndef _SFXDOCFILE_HXX //autogen
#include <sfx2/docfile.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _CLIP_HXX //autogen
#include <vcl/clip.hxx>
#endif
#ifndef _HELP_HXX //autogen
#include <vcl/help.hxx>
#endif
#ifndef _SOT_FORMATS_HXX //autogen
#include <sot/formats.hxx>
#endif
#ifndef _SV_SOUND_HXX //autogen
#include <vcl/sound.hxx>
#endif

#ifndef _FMTINFMT_HXX //autogen
#include <fmtinfmt.hxx>
#endif
#ifndef _TXTINET_HXX //autogen
#include <txtinet.hxx>
#endif
#ifndef _FMTFLD_HXX //autogen
#include <fmtfld.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _ERRHDL_HXX
#include <errhdl.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _CONTENT_HXX
#include <content.hxx>
#endif
#ifndef _FRMFMT_HXX
#include <frmfmt.hxx>
#endif
#ifndef _FLDBAS_HXX
#include <fldbas.hxx>
#endif
#ifndef _TXTATR_HXX
#include <txtatr.hxx>
#endif
#ifndef _BOOKMRK_HXX
#include <bookmrk.hxx>
#endif
#ifndef _SECTION_HXX
#include <section.hxx>
#endif
#ifndef _NUMRULE_HXX
#include <numrule.hxx>
#endif
#ifndef _TOX_HXX
#include <tox.hxx>
#endif
#define NAVIPI_CXX
#ifndef _NAVIPI_HXX
#include <navipi.hxx>
#endif
#ifndef _NAVICONT_HXX
#include <navicont.hxx>
#endif
#ifndef _NAVICFG_HXX
#include <navicfg.hxx>
#endif
#ifndef _SWCONT_HXX
#include <swcont.hxx>
#endif
#ifndef _EDTWIN_HXX
#include <edtwin.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _UNOTOOLS_HXX
#include <unotools.hxx>
#endif
#ifndef _HINTS_HXX
#include <hints.hxx>
#endif

#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _HELPID_H
#include <helpid.h>
#endif
#ifndef _NAVIPI_HRC
#include <navipi.hrc>
#endif
#ifndef _UTLUI_HRC
#include <utlui.hrc>
#endif
#ifndef _MISC_HRC
#include <misc.hrc>
#endif
#ifndef _COMCORE_HRC
#include <comcore.hrc>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXTSECTIONSSUPPLIER_HPP_
#include <com/sun/star/text/XTextSectionsSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXTGRAPHICOBJECTSSUPPLIER_HPP_
#include <com/sun/star/text/XTextGraphicObjectsSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXTTABLESSUPPLIER_HPP_
#include <com/sun/star/text/XTextTablesSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XDOCUMENTINDEXESSUPPLIER_HPP_
#include <com/sun/star/text/XDocumentIndexesSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XBOOKMARKSSUPPLIER_HPP_
#include <com/sun/star/text/XBookmarksSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXTEMBEDDEDOBJECTSSUPPLIER_HPP_
#include <com/sun/star/text/XTextEmbeddedObjectsSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXTFRAMESSUPPLIER_HPP_
#include <com/sun/star/text/XTextFramesSupplier.hpp>
#endif


#define CTYPE_CNT   0
#define CTYPE_CTT   1

using namespace ::com::sun::star;

#define CP2S(cChar) UniString::CreateFromAscii(cChar)
#define C2S(cChar)  UniString::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM(cChar))

#define NAVI_BOOKMARK_DELIM     (sal_Unicode)1


/***************************************************************************

***************************************************************************/

typedef SwContent* SwContentPtr;
SV_DECL_PTRARR_SORT_DEL( SwContentArr, SwContentPtr, 0,4)
SV_IMPL_OP_PTRARR_SORT(SwContentArr, SwContentPtr)

sal_Bool SwContentTree::bIsInDrag = sal_False;


/***************************************************************************
    Beschreibung: Hilfsmethoden
***************************************************************************/


sal_Bool lcl_IsContent(SvLBoxEntry* pEntry)
{
    return ((SwTypeNumber*)pEntry->GetUserData())->GetTypeId() == CTYPE_CNT;
}


sal_Bool lcl_IsContentType(SvLBoxEntry* pEntry)
{
    return ((SwTypeNumber*)pEntry->GetUserData())->GetTypeId() == CTYPE_CTT;
}


sal_Bool lcl_FindShell(SwWrtShell* pShell)
{
    sal_Bool bFound = sal_False;
    SwView *pView = SwModule::GetFirstView();
    while (pView)
    {
        if(pShell == &pView->GetWrtShell())
        {
            bFound = sal_True;
            break;
        }
        pView = SwModule::GetNextView(pView);
    }
    return bFound;
}

/***************************************************************************
    Beschreibung: Inhalt, enthaelt Namen und Verweis auf den Inhalstyp
***************************************************************************/


SwContent::SwContent(const SwContentType* pCnt, const String& rName, long nYPos) :
    pParent(pCnt),
    sContentName(rName),
    SwTypeNumber(CTYPE_CNT),
    nYPosition(nYPos),
    bInvisible(sal_False)
{
}


sal_uInt8   SwTypeNumber::GetTypeId()
{
    return nTypeId;
}

SwTypeNumber::~SwTypeNumber()
{
}

sal_Bool SwContent::IsProtect() const
{
    return sal_False;
}

sal_Bool SwPostItContent::IsProtect() const
{
    return pFld->IsProtect();
}

sal_Bool SwURLFieldContent::IsProtect() const
{
    return pINetAttr->IsProtect();
}

SwGraphicContent::~SwGraphicContent()
{
}
SwTOXBaseContent::~SwTOXBaseContent()
{
}

/***************************************************************************
    Beschreibung:   Inhaltstyp, kennt seine Inhalte und die WrtShell
***************************************************************************/


SwContentType::SwContentType(SwWrtShell* pShell, sal_uInt16 nType, sal_uInt8 nLevel) :
    SwTypeNumber(CTYPE_CTT),
    pWrtShell(pShell),
    nContentType(nType),
    nOutlineLevel(nLevel),
    bDataValid(sal_False),
    bMemberFilled(sal_False),
    sContentTypeName(SW_RES(STR_CONTENT_TYPE_FIRST + nType)),
    sSingleContentTypeName(SW_RES(STR_CONTENT_TYPE_SINGLE_FIRST + nType)),
    pMember(0),
    bEdit(sal_False),
    bDelete(sal_True),
    nMemberCount(0)
{
    Init();
}

/***************************************************************************
    Beschreibung:   Initialisierung
***************************************************************************/


void SwContentType::Init(sal_Bool* pbInvalidateWindow)
{
    // wenn sich der MemberCount aendert ...
    sal_uInt16 nOldMemberCount = nMemberCount;
    nMemberCount = 0;
    switch(nContentType)
    {
        case CONTENT_TYPE_OUTLINE   :
        {
            sTypeToken = CP2S(pMarkToOutline);
            sal_uInt16 nOutlineCount = nMemberCount = pWrtShell->GetOutlineCnt();
            if(nOutlineLevel < MAXLEVEL)
            {
                for(sal_uInt16 j = 0; j < nOutlineCount; j++)
                {
                    if(pWrtShell->GetOutlineLevel(j) > nOutlineLevel )
                        nMemberCount --;
                }
            }
            bDelete = sal_False;
        }
        break;

        case CONTENT_TYPE_TABLE     :
            sTypeToken = CP2S(pMarkToTable);
            nMemberCount = pWrtShell->GetTblFrmFmtCount(sal_True);
            bEdit = sal_True;
        break;

        case CONTENT_TYPE_FRAME     :
        case CONTENT_TYPE_GRAPHIC   :
        case CONTENT_TYPE_OLE       :
        {
            FlyCntType eType = FLYCNTTYPE_FRM;
            sTypeToken = CP2S(pMarkToFrame);
            if(nContentType == CONTENT_TYPE_OLE)
            {
                eType = FLYCNTTYPE_OLE;
                sTypeToken = CP2S(pMarkToOLE);
            }
            else if(nContentType == CONTENT_TYPE_GRAPHIC)
            {
                eType = FLYCNTTYPE_GRF;
                sTypeToken = CP2S(pMarkToGraphic);
            }
            nMemberCount = pWrtShell->GetFlyCount(eType);
            bEdit = sal_True;
        }
        break;
        case CONTENT_TYPE_BOOKMARK  :
        {
            sal_uInt16 nCount = nMemberCount = pWrtShell->GetBookmarkCnt(sal_True);
            sTypeToken = aEmptyStr;
            bEdit = sal_True;
        }
        break;
        case CONTENT_TYPE_REGION :
        {
            SwContentArr*   pOldMember = 0;
            sal_uInt16 nOldRegionCount = 0;
            sal_Bool bInvalidate = sal_False;
            if(!pMember)
                pMember = new SwContentArr;
            else if(pMember->Count())
            {
                pOldMember = pMember;
                nOldRegionCount = pOldMember->Count();
                pMember = new SwContentArr;
            }
            const Point aNullPt;
            nMemberCount = pWrtShell->GetSectionFmtCount();
            for(sal_uInt16 i = 0; i < nMemberCount; i++)
            {
                const SwSectionFmt* pFmt;
                SectionType eTmpType;
                if( (pFmt = &pWrtShell->GetSectionFmt(i))->IsInNodesArr() &&
                (eTmpType = pFmt->GetSection()->GetType()) != TOX_CONTENT_SECTION
                && TOX_HEADER_SECTION != eTmpType )
                {
                    const String& rSectionName = pFmt->GetSection()->GetName();
                    sal_uInt16 nLevel = 0;
                    SwSectionFmt* pParentFmt = pFmt->GetParent();
                    while(pParentFmt)
                    {
                        nLevel++;
                        pParentFmt = pParentFmt->GetParent();
                    }

                    SwContent* pCnt = new SwRegionContent(this, rSectionName,
                            nLevel,
                            pFmt->FindLayoutRect( sal_False, &aNullPt ).Top());

                    SwPtrMsgPoolItem aAskItem( RES_CONTENT_VISIBLE, 0 );
                    if( !pFmt->GetInfo( aAskItem ) &&
                        !aAskItem.pObject )     // not visible
                        pCnt->SetInvisible();
                    pMember->Insert(pCnt);//, pMember->Count());

                    sal_uInt16 nPos = pMember->Count() - 1;
                    if(nOldRegionCount > nPos &&
                        (pOldMember->GetObject(nPos))->IsInvisible()
                                != pCnt->IsInvisible())
                            bInvalidate = sal_True;
                }
            }
            nMemberCount = pMember->Count();
            sTypeToken = CP2S(pMarkToRegion);
            bEdit = sal_True;
            bDelete = sal_False;
            if(pOldMember)
            {
                pOldMember->DeleteAndDestroy(0, pOldMember->Count());
                delete pOldMember;
                if(pbInvalidateWindow && bInvalidate)
                    *pbInvalidateWindow = sal_True;
            }
        }
        break;
        case CONTENT_TYPE_INDEX:
        {
            nMemberCount = pWrtShell->GetTOXCount();
            bEdit = sal_True;
            bDelete = sal_False;
        }
        break;
        case CONTENT_TYPE_REFERENCE:
        {
            nMemberCount = pWrtShell->GetRefMarks( 0 );
            bDelete = sal_False;
        }
        break;
        case CONTENT_TYPE_URLFIELD:
        {
            nMemberCount = 0;
            if(!pMember)
                pMember = new SwContentArr;
            else if(pMember->Count())
                pMember->DeleteAndDestroy(0, pMember->Count());

            SwGetINetAttrs aArr;
            nMemberCount = pWrtShell->GetINetAttrs( aArr );
            for( sal_uInt16 n = 0; n < nMemberCount; ++n )
            {
                SwGetINetAttr* p = aArr[ n ];
                SwURLFieldContent* pCnt = new SwURLFieldContent(
                                    this,
                                    p->sText,
                                    INetURLObject::decode(
                                        p->rINetAttr.GetINetFmt().GetValue(),
                                        INET_HEX_ESCAPE,
                                           INetURLObject::DECODE_WITH_CHARSET,
                                        RTL_TEXTENCODING_UTF8 ),
                                    &p->rINetAttr,
                                    n );
                pMember->Insert( pCnt );//, n );
            }
            bEdit = sal_True;
            nOldMemberCount = nMemberCount;
            bDelete = sal_False;
        }
        break;
        case CONTENT_TYPE_POSTIT:
        {
            nMemberCount = 0;
            if(!pMember)
                pMember = new SwContentArr;
            else if(pMember->Count())
                pMember->DeleteAndDestroy(0, pMember->Count());
            SwFieldType* pType = pWrtShell->GetFldType(
                                    RES_POSTITFLD, aEmptyStr);
            SwClientIter aIter( *pType );
            SwClient * pFirst = aIter.GoStart();
            while(pFirst)
            {
                if(((SwFmtFld*)pFirst)->GetTxtFld() &&
                        ((SwFmtFld*)pFirst)->IsFldInDoc())
                {
                    SwField* pField = (SwField*)((SwFmtFld*)pFirst)
                                                                    ->GetFld();

                    String sEntry = pField->GetPar2();
                    RemoveNewline(sEntry);
                    SwPostItContent* pCnt = new SwPostItContent(
                                        this,
                                        sEntry, // hier steht der Text
                                        (const SwFmtFld*)pFirst,
                                        nMemberCount);
                    pMember->Insert(pCnt);//, nMemberCount);
                    nMemberCount++;
                }
                pFirst = aIter++;
            }
            sTypeToken = aEmptyStr;
            bEdit = sal_True;
            nOldMemberCount = nMemberCount;
        }
        break;
        case CONTENT_TYPE_DRAWOBJECT:
            sTypeToken = aEmptyStr;
        break;
    }
    // ... dann koennen die Daten auch nicht mehr gueltig sein
    // abgesehen von denen, die schon korrigiert wurden, dann ist
    // nOldMemberCount doch nicht so old
    if( nOldMemberCount != nMemberCount )
        bDataValid = sal_False;
}

/***************************************************************************
    Beschreibung:
***************************************************************************/


SwContentType::~SwContentType()
{
    delete pMember;
}

/***************************************************************************
    Beschreibung:    Inhalt liefern, dazu gfs. die Liste fuellen
***************************************************************************/


const SwContent* SwContentType::GetMember(sal_uInt16 nIndex)
{
    if(!bDataValid || !pMember)
    {
        FillMemberList();
    }
    if(nIndex < pMember->Count())
        return pMember->GetObject(nIndex);
    else
        return 0;

}


/***************************************************************************
    Beschreibung:
***************************************************************************/


void    SwContentType::Invalidate()
{
    bDataValid = sal_False;
}

/***************************************************************************
    Beschreibung: Liste der Inhalte fuellen
***************************************************************************/


void    SwContentType::FillMemberList(sal_Bool* pbLevelOrVisibiblityChanged)
{
    SwContentArr*   pOldMember = 0;
    int nOldMemberCount = -1;
    SwPtrMsgPoolItem aAskItem( RES_CONTENT_VISIBLE, 0 );
    if(pMember && pbLevelOrVisibiblityChanged)
    {
        pOldMember = pMember;
        nOldMemberCount = pOldMember->Count();
        pMember = new SwContentArr;
        *pbLevelOrVisibiblityChanged = sal_False;
    }
    else if(!pMember)
        pMember = new SwContentArr;
    else if(pMember->Count())
        pMember->DeleteAndDestroy(0, pMember->Count());
    switch(nContentType)
    {
        case CONTENT_TYPE_OUTLINE   :
        {
            sal_uInt16 nOutlineCount = nMemberCount = pWrtShell->GetOutlineCnt();

            sal_uInt16 nPos = 0;
            for (sal_uInt16 i = 0; i < nOutlineCount; ++i)
            {
                const sal_Int8 nLevel = (sal_Int8)pWrtShell->GetOutlineLevel(i);
                if(nLevel >= nOutlineLevel )
                    nMemberCount--;
                else
                {
                    String aEntry(pWrtShell->GetOutlineText(i));
                    aEntry.EraseLeadingChars();
                    SwNavigationPI::CleanEntry( aEntry );
                    SwOutlineContent* pCnt = new SwOutlineContent(this, aEntry, i, nLevel,
                                                        pWrtShell->IsOutlineMovable( i ), nPos );
                    pMember->Insert(pCnt);//, nPos);
                    // bei gleicher Anzahl und vorhandenem pOldMember wird die
                    // alte mit der neuen OutlinePos verglichen
                    // cast fuer Win16
                    if(nOldMemberCount > (int)nPos &&
                        ((SwOutlineContent*)pOldMember->GetObject(nPos))->GetOutlineLevel() != nLevel)
                        *pbLevelOrVisibiblityChanged = sal_True;

                    nPos++;
                }
            }

        }
        break;

        case CONTENT_TYPE_TABLE     :
        {
            DBG_ASSERT(nMemberCount ==
                    pWrtShell->GetTblFrmFmtCount(sal_True),
                    "MemberCount differiert")
            Point aNullPt;
            nMemberCount =  pWrtShell->GetTblFrmFmtCount(sal_True);
            for(sal_uInt16 i = 0; i < nMemberCount; i++)
            {
                const SwFrmFmt& rTblFmt = pWrtShell->GetTblFrmFmt(i, sal_True);
                String sTblName( rTblFmt.GetName() );

                SwContent* pCnt = new SwContent(this, sTblName,
                        rTblFmt.FindLayoutRect(sal_False, &aNullPt).Top() );
                if( !rTblFmt.GetInfo( aAskItem ) &&
                    !aAskItem.pObject )     // not visible
                    pCnt->SetInvisible();

                pMember->Insert(pCnt);//, i);

                if(nOldMemberCount > (int)i &&
                    (pOldMember->GetObject(i))->IsInvisible() != pCnt->IsInvisible())
                        *pbLevelOrVisibiblityChanged = sal_True;
            }
        }
        break;
        case CONTENT_TYPE_OLE       :
        case CONTENT_TYPE_FRAME     :
        case CONTENT_TYPE_GRAPHIC   :
        {
            FlyCntType eType = FLYCNTTYPE_FRM;
            if(nContentType == CONTENT_TYPE_OLE)
                eType = FLYCNTTYPE_OLE;
            else if(nContentType == CONTENT_TYPE_GRAPHIC)
                eType = FLYCNTTYPE_GRF;
            DBG_ASSERT(nMemberCount ==  pWrtShell->GetFlyCount(eType),
                    "MemberCount differiert");
            Point aNullPt;
            nMemberCount = pWrtShell->GetFlyCount(eType);
            for(sal_uInt16 i = 0; i < nMemberCount; i++)
            {
                const SwFrmFmt* pFrmFmt = pWrtShell->GetFlyNum(i,eType);
                String sFrmName = pFrmFmt->GetName();

                SwContent* pCnt;
                if(CONTENT_TYPE_GRAPHIC == nContentType)
                {
                    String sLink;
                    pWrtShell->GetGrfNms( &sLink, 0, (SwFlyFrmFmt*) pFrmFmt);
                    pCnt = new SwGraphicContent(this, sFrmName,
                                INetURLObject::decode( sLink, INET_HEX_ESCAPE,
                                           INetURLObject::DECODE_WITH_CHARSET,
                                        RTL_TEXTENCODING_UTF8 ),
                                pFrmFmt->FindLayoutRect(sal_False, &aNullPt).Top());
                }
                else
                {
                    pCnt = new SwContent(this, sFrmName,
                            pFrmFmt->FindLayoutRect(sal_False, &aNullPt).Top() );
                }
                if( !pFrmFmt->GetInfo( aAskItem ) &&
                    !aAskItem.pObject )     // not visible
                    pCnt->SetInvisible();
                pMember->Insert(pCnt);//, i);
                if(nOldMemberCount > (int)i &&
                    (pOldMember->GetObject(i))->IsInvisible() != pCnt->IsInvisible())
                        *pbLevelOrVisibiblityChanged = sal_True;
            }
        }
        break;
        case CONTENT_TYPE_BOOKMARK  :
        {
            nMemberCount = pWrtShell->GetBookmarkCnt(sal_True);
            for(sal_uInt16 i = 0; i < nMemberCount; i++)
            {
                SwBookmark& rBkmk = pWrtShell->GetBookmark( i, sal_True );
                    const String& rBkmName = rBkmk.GetName();
                    //nYPos von 0 -> ::com::sun::star::text::Bookmarks werden nach Alphabet sortiert
                    SwContent* pCnt = new SwContent(this, rBkmName, 0);
                    pMember->Insert(pCnt);//, pMember->Count());
            }
        }
        break;
        case CONTENT_TYPE_REGION    :
        {
            const Point aNullPt;
            nMemberCount = pWrtShell->GetSectionFmtCount();
            for(sal_uInt16 i = 0; i < nMemberCount; i++)
            {
                const SwSectionFmt* pFmt;
                SectionType eTmpType;
                if( (pFmt = &pWrtShell->GetSectionFmt(i))->IsInNodesArr() &&
                (eTmpType = pFmt->GetSection()->GetType()) != TOX_CONTENT_SECTION
                && TOX_HEADER_SECTION != eTmpType )
                {
                    String sSectionName = pFmt->GetSection()->GetName();

                    sal_uInt16 nLevel = 0;
                    SwSectionFmt* pParentFmt = pFmt->GetParent();
                    while(pParentFmt)
                    {
                        nLevel++;
                        pParentFmt = pParentFmt->GetParent();
                    }

                    SwContent* pCnt = new SwRegionContent(this, sSectionName,
                            nLevel,
                            pFmt->FindLayoutRect( sal_False, &aNullPt ).Top());
                    if( !pFmt->GetInfo( aAskItem ) &&
                        !aAskItem.pObject )     // not visible
                        pCnt->SetInvisible();
                    pMember->Insert(pCnt);//, pMember->Count());

                    sal_uInt16 nPos = pMember->Count() - 1;
                    if(nOldMemberCount > nPos &&
                        (pOldMember->GetObject(nPos))->IsInvisible()
                                != pCnt->IsInvisible())
                            *pbLevelOrVisibiblityChanged = sal_True;
                }
            }
            nMemberCount = pMember->Count();
        }
        break;
        case CONTENT_TYPE_REFERENCE:
        {
            SvStringsDtor aRefMarks;
            nMemberCount = pWrtShell->GetRefMarks( &aRefMarks );

            for(sal_uInt16 i=0; i<nMemberCount; i++)
            {
                //Referenzen nach Alphabet sortiert
                SwContent* pCnt = new SwContent(
                            this, *aRefMarks.GetObject(i), 0);
                pMember->Insert(pCnt);//, i);
            }
        }
        break;
        case CONTENT_TYPE_URLFIELD:
        {
            SwGetINetAttrs aArr;
            nMemberCount = pWrtShell->GetINetAttrs( aArr );
            for( sal_uInt16 n = 0; n < nMemberCount; ++n )
            {
                SwGetINetAttr* p = aArr[ n ];
                SwURLFieldContent* pCnt = new SwURLFieldContent(
                                    this,
                                    p->sText,
                                    INetURLObject::decode(
                                        p->rINetAttr.GetINetFmt().GetValue(),
                                        INET_HEX_ESCAPE,
                                           INetURLObject::DECODE_WITH_CHARSET,
                                        RTL_TEXTENCODING_UTF8 ),
                                    &p->rINetAttr,
                                    n );
                pMember->Insert( pCnt );//, n );
            }
        }
        break;
        case CONTENT_TYPE_INDEX:
        {

            sal_uInt16 nCount = nMemberCount = pWrtShell->GetTOXCount();
            for ( sal_uInt16 nTox = 0; nTox < nCount; nTox++ )
            {
                const SwTOXBase* pBase = pWrtShell->GetTOX( nTox );
                String sTOXNm( pBase->GetTOXName() );

                SwContent* pCnt = new SwTOXBaseContent(
                        this, sTOXNm, nTox, *pBase);

                if( !pBase->GetInfo( aAskItem ) &&
                    !aAskItem.pObject )     // not visible
                    pCnt->SetInvisible();

                pMember->Insert( pCnt );//, nTox );
                sal_uInt16 nPos = pMember->Count() - 1;
                if(nOldMemberCount > nPos &&
                    (pOldMember->GetObject(nPos))->IsInvisible()
                            != pCnt->IsInvisible())
                        *pbLevelOrVisibiblityChanged = sal_True;
            }
        }
        break;
        case CONTENT_TYPE_POSTIT:
        {
            nMemberCount = 0;
            if(!pMember)
                pMember = new SwContentArr;
            else if(pMember->Count())
                pMember->DeleteAndDestroy(0, pMember->Count());
            SwFieldType* pType = pWrtShell->GetFldType(
                                    RES_POSTITFLD, aEmptyStr);
            SwClientIter aIter( *pType );
            SwClient * pFirst = aIter.GoStart();
            while(pFirst)
            {
                if(((SwFmtFld*)pFirst)->GetTxtFld() &&
                        ((SwFmtFld*)pFirst)->IsFldInDoc())
                {
                    SwField* pField = (SwField*)((SwFmtFld*)pFirst)
                                                                    ->GetFld();
                    String sEntry = pField->GetPar2();
                    RemoveNewline(sEntry);
                    SwPostItContent* pCnt = new SwPostItContent(
                                        this,
                                        sEntry, // hier steht der Text
                                        (const SwFmtFld*)pFirst,
                                        nMemberCount);
                    pMember->Insert(pCnt);//, nMemberCount);
                    nMemberCount++;
                }
                pFirst = aIter++;
            }
        }
        break;
        case CONTENT_TYPE_DRAWOBJECT:
        break;
    }
    bDataValid = sal_True;
    if(pOldMember)
        pOldMember->DeleteAndDestroy(0, pOldMember->Count());

}

/***************************************************************************
    Beschreibung: TreeListBox fuer Inhaltsanzeige
***************************************************************************/


SwContentTree::SwContentTree(Window* pParent, const ResId& rResId) :
        SvTreeListBox( pParent, rResId ),
        pHiddenShell(0),
        pActiveShell(0),
        pConfig(SW_MOD()->GetNavigationConfig()),
        sSpace(C2S("                    ")),
        sRemoveIdx(SW_RES(ST_REMOVE_INDEX)),
        sUpdateIdx(SW_RES(ST_UPDATE)),
        sRename(SW_RES(ST_RENAME)),
        sReadonlyIdx(SW_RES(ST_READONLY_IDX)),
        sUnprotTbl(SW_RES(ST_REMOVE_TBL_PROTECTION)),
        sInvisible(SW_RES(ST_INVISIBLE)),
        nActiveBlock(0),
        nHiddenBlock(0),
        nOutlineLevel(MAXLEVEL),
        nRootType(USHRT_MAX),
        nLastSelType(USHRT_MAX),
        bIsActive(sal_True),
        bIsConstant(sal_False),
        bIsHidden(sal_False),
        bIsInternalDrag(sal_False),
        bDocChgdInDragging(sal_False),
        bIsRoot(sal_False),
        bIsIdleClear(sal_False),
        bIsLastReadOnly(sal_False),
        bIsOutlineMoveable(sal_True),
        bViewHasChanged(sal_False),
        bIsImageListInitialized(sal_False)
{
    SetHelpId(HID_NAVIGATOR_TREELIST);

    Bitmap aRootClosed      (SW_RES(BMP_ROOT_CLOSED));
    Bitmap aRootOpened      (SW_RES(BMP_ROOT_OPENED));
    SetNodeBitmaps( aRootClosed, aRootOpened );
    SetDoubleClickHdl(LINK(this, SwContentTree, ContentDoubleClickHdl));
    SetDragDropMode(SV_DRAGDROP_APP_COPY);
    for(sal_uInt16 i=0; i < CONTENT_TYPE_MAX; i++)
    {
        aActiveContentArr[i]    = 0;
        aHiddenContentArr[i]    = 0;
    }
    for( i = 0; i < CONTEXT_COUNT; i++  )
    {
        aContextStrings[i] = SW_RESSTR(i+ST_CONTEXT_FIRST);
    }
    nActiveBlock = pConfig->GetActiveBlock();
    aUpdTimer.SetTimeoutHdl(LINK(this, SwContentTree, TimerUpdate));
    aUpdTimer.SetTimeout(1000);
    Clear();
}

/***************************************************************************
    Beschreibung:
***************************************************************************/


SwContentTree::~SwContentTree()
{
    Clear(); // vorher gfs. Inhaltstypen loeschen
    bIsInDrag = sal_False;
}

/***************************************************************************
    Beschreibung:   Drop wird im Navigator ausgefuehrt
***************************************************************************/


sal_Bool     SwContentTree::Drop( const DropEvent& rEvt)
{
    if(bIsRoot)
    {
        return SvTreeListBox::Drop(rEvt);
    }
    else
        return bIsInDrag ? sal_False : GetParentWindow()->Drop(rEvt);
}

/***************************************************************************
    Beschreibung:   QueryDrop wird im Navigator ausgefuehrt
***************************************************************************/


sal_Bool     SwContentTree::QueryDrop( DropEvent& rEvt)
{
    if(bIsRoot)
    {
        return bIsOutlineMoveable && SvTreeListBox::QueryDrop(rEvt);
    }
    else
        return bIsInDrag ? sal_False : GetParentWindow()->QueryDrop(rEvt);
}

/***************************************************************************
    Beschreibung:   Handler fuer Dragging und ContextMenu
***************************************************************************/


void  SwContentTree::Command( const CommandEvent& rCEvt )
{
    sal_Bool bParent = sal_False;
    switch( rCEvt.GetCommand() )
    {
        case COMMAND_STARTDRAG:
        {
            if(!bIsRoot || nRootType != CONTENT_TYPE_OUTLINE)
            {
                ReleaseMouse();
                StartExecuteDrag();
            }
            else
                bParent = sal_True;
        }
        break;
        case COMMAND_CONTEXTMENU:
        {
            PopupMenu aPop;
            PopupMenu aSubPop1;
            PopupMenu aSubPop2;
            PopupMenu aSubPop3;
            PopupMenu aSubPop4; // Bearbeiten

            for(sal_uInt16 i = 1; i <= MAXLEVEL; i++ )
            {
                aSubPop1.InsertItem( i + 100, String::CreateFromInt32(i));
            }
            aSubPop1.CheckItem(100 + nOutlineLevel);
            for(i=0; i < 3; i++ )
            {
                aSubPop2.InsertItem( i + 201, aContextStrings[
                        ST_HYPERLINK - ST_CONTEXT_FIRST + i]);
            }
            aSubPop2.CheckItem( 201 +
                            GetParentWindow()->GetRegionDropMode());
            //Liste der offenen Dateien einfuegen
            sal_uInt16 nId = 301;
            const SwView* pActiveView = ::GetActiveView();
            SwView *pView = SwModule::GetFirstView();
            while (pView)
            {
                String sInsert = pView->GetDocShell()->GetTitle();
                if(pView == pActiveView)
                {
                    sInsert += '(';
                    sInsert += aContextStrings[ ST_ACTIVE - ST_CONTEXT_FIRST];
                    sInsert += ')';
                }
                aSubPop3.InsertItem(nId, sInsert);
                if(bIsConstant && pActiveShell == &pView->GetWrtShell())
                    aSubPop3.CheckItem(nId);
                pView = SwModule::GetNextView(pView);
                nId++;
            }
            aSubPop3.InsertItem(nId++, aContextStrings[ST_ACTIVE_VIEW - ST_CONTEXT_FIRST]);
            if(pHiddenShell)
            {
                String sHiddenEntry = pHiddenShell->GetView().GetDocShell()->GetTitle();
                sHiddenEntry += C2S(" ( ");
                sHiddenEntry += aContextStrings[ ST_HIDDEN - ST_CONTEXT_FIRST];
                sHiddenEntry += C2S(" )");
                aSubPop3.InsertItem(nId, sHiddenEntry);
            }

            if(bIsActive)
                aSubPop3.CheckItem( --nId );
            else if(bIsHidden)
                aSubPop3.CheckItem( nId );

            aPop.InsertItem( 1, aContextStrings[
                                        ST_OUTLINE_LEVEL - ST_CONTEXT_FIRST]);
            aPop.InsertItem(2, aContextStrings[ST_DRAGMODE - ST_CONTEXT_FIRST]);
            aPop.InsertItem(3, aContextStrings[ST_DISPLAY - ST_CONTEXT_FIRST]);
            Link aSelLk = LINK(this, SwContentTree, PopupHdl );
            //jetzt noch bearbeiten
            SvLBoxEntry* pEntry;
            //Bearbeiten nur, wenn die angezeigten Inhalte aus der aktiven View kommen
            if((bIsActive || pActiveShell == pActiveView->GetWrtShellPtr())
                    && 0 != (pEntry = FirstSelected()) && lcl_IsContent(pEntry))
            {
                const SwContentType* pContType = ((SwContent*)pEntry->GetUserData())->GetParent();
                const sal_uInt16 nContentType = pContType->GetType();
                sal_Bool bReadonly = pActiveShell->GetView().GetDocShell()->IsReadOnly();
                sal_Bool bEditable = pContType->IsEditable();
                sal_Bool bDeletable = pContType->IsDeletable();
                sal_Bool bRenamable = bEditable && !bReadonly &&
                    (CONTENT_TYPE_TABLE == nContentType ||
                        CONTENT_TYPE_FRAME == nContentType ||
                        CONTENT_TYPE_GRAPHIC == nContentType ||
                        CONTENT_TYPE_OLE == nContentType ||
                        CONTENT_TYPE_BOOKMARK == nContentType ||
                        CONTENT_TYPE_REGION == nContentType||
                        CONTENT_TYPE_INDEX == nContentType);

                if(!bReadonly && (bEditable || bDeletable))
                {
                    sal_Bool bSubPop4 = sal_False;
                    if(CONTENT_TYPE_INDEX == nContentType)
                    {
                        bSubPop4 = sal_True;
                        aSubPop4.InsertItem(401, sRemoveIdx);
                        aSubPop4.InsertItem(402, sUpdateIdx);
                        aSubPop4.InsertItem(403, aContextStrings[ST_EDIT_ENTRY - ST_CONTEXT_FIRST]);
                        aSubPop4.InsertItem(405, sReadonlyIdx);

                        const SwTOXBase* pBase = ((SwTOXBaseContent*)pEntry->GetUserData())->GetTOXBase();
                        aSubPop4.CheckItem( 405, pActiveShell->IsTOXBaseReadonly(*pBase));
                        aSubPop4.InsertItem(501, aContextStrings[ST_DELETE_ENTRY - ST_CONTEXT_FIRST]);
                    }
                    else if(CONTENT_TYPE_TABLE == nContentType && !bReadonly)
                    {
                        bSubPop4 = sal_True;
                        aSubPop4.InsertItem(403, aContextStrings[ST_EDIT_ENTRY - ST_CONTEXT_FIRST]);
                        aSubPop4.InsertItem(404, sUnprotTbl);
                        sal_Bool bFull = sal_False;
                        String sTblName = ((SwContent*)pEntry->GetUserData())->GetName();
                        sal_Bool bProt =pActiveShell->HasTblAnyProtection( &sTblName, &bFull );
                        aSubPop4.EnableItem(403, !bFull );
                        aSubPop4.EnableItem(404, bProt );
                        aSubPop4.InsertItem(501, aContextStrings[ST_DELETE_ENTRY - ST_CONTEXT_FIRST]);
                    }
                    else if(!((SwContent*)pEntry->GetUserData())->IsProtect())
                    {
                        if(bEditable && bDeletable)
                        {
                            aSubPop4.InsertItem(403, aContextStrings[ST_EDIT_ENTRY - ST_CONTEXT_FIRST]);
                            aSubPop4.InsertItem(501, aContextStrings[ST_DELETE_ENTRY - ST_CONTEXT_FIRST]);
                            bSubPop4 = sal_True;
                        }
                        else if(bEditable)
                            aPop.InsertItem(403, aContextStrings[ST_EDIT_ENTRY - ST_CONTEXT_FIRST]);
                        else if(bDeletable)
                            aPop.InsertItem(501, aContextStrings[ST_DELETE_ENTRY - ST_CONTEXT_FIRST]);
                    }
                    //Rename object
                    if(bRenamable)
                    {
                        if(bSubPop4)
                            aSubPop4.InsertItem(502, sRename);
                        else
                            aPop.InsertItem(502, sRename);
                    }

                    if(bSubPop4)
                    {
                        aPop.InsertItem(4, pContType->GetSingleName());
                        aPop.SetPopupMenu(4, &aSubPop4);
                        aSubPop4.SetSelectHdl(aSelLk);
                    }
                }
            }


            aPop.SetPopupMenu( 1, &aSubPop1 );
            aPop.SetPopupMenu( 2, &aSubPop2 );
            aPop.SetPopupMenu( 3, &aSubPop3 );
            aPop.SetSelectHdl(aSelLk);
            aSubPop1.SetSelectHdl(aSelLk);
            aSubPop2.SetSelectHdl(aSelLk);
            aSubPop3.SetSelectHdl(aSelLk);

            aPop.Execute( this, rCEvt.GetMousePosPixel() );
        }
        break;
        default: bParent = sal_True;
    }
    if(bParent)
        SvTreeListBox::Command(rCEvt);
}

/***************************************************************************
    Beschreibung:   Einrueckung fuer outlines (und sections)
***************************************************************************/


long    SwContentTree::GetTabPos( SvLBoxEntry* pEntry, SvLBoxTab* pTab)
{
    sal_uInt16 nLevel = 0;
    if(lcl_IsContent(pEntry))
    {
        nLevel++;
        SwContent* pCnt = (SwContent *) pEntry->GetUserData();
        const SwContentType*    pParent;
        if(pCnt &&  0 != (pParent = pCnt->GetParent()))
        {
            if(pParent->GetType() == CONTENT_TYPE_OUTLINE)
                nLevel += ((SwOutlineContent*)pCnt)->GetOutlineLevel();
            else if(pParent->GetType() == CONTENT_TYPE_REGION)
                nLevel += ((SwRegionContent*)pCnt)->GetRegionLevel();
        }
    }
    sal_uInt16 nBasis = bIsRoot ? 0 : 5;
    return nLevel * 10 + nBasis + pTab->GetPos();  //empirisch ermittelt
}

/***************************************************************************
    Beschreibung:   Inhalte werden erst auf Anforderung in die Box eingefuegt
***************************************************************************/


void  SwContentTree::RequestingChilds( SvLBoxEntry* pParent )
{
    // ist es ein Inhaltstyp?
    if(lcl_IsContentType(pParent))
    {
        if(!pParent->HasChilds())
        {
            DBG_ASSERT(pParent->GetUserData(), "keine UserData?")
            SwContentType* pCntType = (SwContentType*)pParent->GetUserData();

            sal_uInt16 nCount = pCntType->GetMemberCount();
            for(sal_uInt16 i = 0; i < nCount; i++)
            {
                const SwContent* pCnt = pCntType->GetMember(i);
                if(pCnt)
                {
                    String sEntry = pCnt->GetName();
                    if(!sEntry.Len())
                        sEntry = sSpace;
                    SvLBoxEntry* pChild = InsertEntry(sEntry, pParent,
                            sal_False, LIST_APPEND, (void*)pCnt);
                }

            }
        }
    }
}
/***************************************************************************
    Beschreibung:   Expand - Zustand fuer Inhaltstypen merken
***************************************************************************/


sal_Bool  SwContentTree::Expand( SvLBoxEntry* pParent )
{
    if(!bIsRoot)
    {
        if(lcl_IsContentType(pParent))
        {
            SwContentType* pCntType = (SwContentType*)pParent->GetUserData();
            sal_uInt16 nOr = 1 << pCntType->GetType(); //linear -> Bitposition
            if(bIsActive || bIsConstant)
            {
                nActiveBlock |= nOr;
                pConfig->SetActiveBlock(nActiveBlock);
            }
            else
                nHiddenBlock |= nOr;
        }
    }
    return SvTreeListBox::Expand(pParent);
}
/***************************************************************************
    Beschreibung:   Collapse - Zustand fuer Inhaltstypen merken
***************************************************************************/


sal_Bool  SwContentTree::Collapse( SvLBoxEntry* pParent )
{
    sal_Bool bRet;
    if(!bIsRoot)
    {
        if(lcl_IsContentType(pParent))
        {
            SwContentType* pCntType = (SwContentType*)pParent->GetUserData();
            sal_uInt16 nAnd = 1 << pCntType->GetType();
            nAnd = ~nAnd;
            if(bIsActive || bIsConstant)
            {
                nActiveBlock &= nAnd;
                pConfig->SetActiveBlock(nActiveBlock);
            }
            else
                nHiddenBlock &= nAnd;
        }
            bRet = SvTreeListBox::Collapse(pParent);
    }
    else
        bRet = sal_False;
    return bRet;
}


/***************************************************************************
    Beschreibung:   Auch auf Doppelclick wird zunaechst nur aufgeklappt
***************************************************************************/


IMPL_LINK( SwContentTree, ContentDoubleClickHdl, SwContentTree *, EMPTYARG )
{
    SvLBoxEntry* pEntry = GetCurEntry();
    // ist es ein Inhaltstyp?
    DBG_ASSERT(pEntry, "kein aktueller Eintrag!")
    if(pEntry)
    {
        if(lcl_IsContentType(pEntry))
            RequestingChilds(pEntry);
        else if(bIsActive || bIsConstant)
        {
            if(bIsConstant)
            {
                pActiveShell->GetView().GetViewFrame()->GetWindow().ToTop();
            }
            //Inhaltstyp anspringen:
            SwContent* pCnt = (SwContent*)pEntry->GetUserData();
            DBG_ASSERT( pCnt, "keine UserData")
            GotoContent(pCnt);
            if(pCnt->GetParent()->GetType() == CONTENT_TYPE_FRAME)
                pActiveShell->EnterStdMode();
        }
    }
    return 0;
}

/***************************************************************************
    Beschreibung:   Anzeigen der Datei
***************************************************************************/


void SwContentTree::Display( sal_Bool bActive )
{
    if(!bIsImageListInitialized)
    {
        aEntryImages = ImageList(SW_RES(IMG_NAVI_ENTRYBMP));
        bIsImageListInitialized = sal_True;
    }
    // erst den selektierten Eintrag auslesen, um ihn spaeter evtl. wieder
    // zu selektieren -> die UserDaten sind hier nicht mehr gueltig!
    SvLBoxEntry* pOldSelEntry = FirstSelected();
    String sEntryName;  // Name des Eintrags
    sal_uInt16 nEntryRelPos = 0; // rel. Pos zu seinem Parent
    if(pOldSelEntry)
    {
        sEntryName = GetEntryText(pOldSelEntry);
        if(GetParent(pOldSelEntry))
        {
            nEntryRelPos = (sal_uInt16)(GetModel()->GetAbsPos(pOldSelEntry) - GetModel()->GetAbsPos(GetParent(pOldSelEntry)));
        }
    }
    Clear();
    SetUpdateMode( sal_False );
    if(bActive && !bIsConstant && !bIsActive)
        bIsActive = bActive;
    bIsHidden = !bActive;
    SwWrtShell* pShell = GetWrtShell();
    sal_Bool bReadOnly = pShell ? pShell->GetView().GetDocShell()->IsReadOnly() : sal_True;
    if(bReadOnly != bIsLastReadOnly)
    {
        bIsLastReadOnly = bReadOnly;
        sal_Bool bDisable =  pShell == 0 || bReadOnly;
        SwNavigationPI* pNavi = GetParentWindow();
        pNavi->aContentToolBox.EnableItem(FN_ITEM_UP , !bDisable);
        pNavi->aContentToolBox.EnableItem(FN_ITEM_DOWN, !bDisable);
        pNavi->aContentToolBox.EnableItem(FN_ITEM_LEFT, !bDisable);
        pNavi->aContentToolBox.EnableItem(FN_ITEM_RIGHT, !bDisable);
        pNavi->aContentToolBox.EnableItem(FN_SELECT_SET_AUTO_BOOKMARK, !bDisable);
    }
    if(pShell)
    {
        SvLBoxEntry* pSelEntry = 0;
        if(nRootType == USHRT_MAX)
        {
            for(sal_uInt16 nCntType = CONTENT_TYPE_OUTLINE;
                        nCntType <= CONTENT_TYPE_POSTIT; nCntType++ )
            {
                SwContentType** ppContentT = bActive ?
                                &aActiveContentArr[nCntType] :
                                    &aHiddenContentArr[nCntType];
                if(!*ppContentT)
                    (*ppContentT) = new SwContentType(pShell, nCntType, nOutlineLevel );


                String sEntry = (*ppContentT)->GetName();
                SvLBoxEntry* pEntry;
                const Image& rImage = aEntryImages.GetImage(SID_SW_START + nCntType);
                sal_Bool bChOnDemand = 0 != (*ppContentT)->GetMemberCount();
                pEntry = InsertEntry(sEntry, rImage, rImage,
                                0, bChOnDemand, LIST_APPEND, (*ppContentT));
                if(nCntType == nLastSelType)
                    pSelEntry = pEntry;
                sal_uInt16 nExpandOptions = bIsActive || bIsConstant ?
                                            nActiveBlock :
                                                nHiddenBlock;
                if(nExpandOptions & (1 << nCntType))
                {
                    Expand(pEntry);
                    if(nEntryRelPos && nCntType == nLastSelType)
                    {
                        // jetzt vielleicht noch ein Child selektieren
                        SvLBoxEntry* pChild = pEntry;
                        SvLBoxEntry* pTemp = 0;
                        sal_uInt16 nPos = 1;
                        while(0 != (pChild = Next(pChild)))
                        {
                            // der alte Text wird leicht bevorzugt
                            if(sEntryName == GetEntryText(pChild) ||
                                nPos == nEntryRelPos )
                            {
                                pSelEntry = pChild;
                                break;
                            }
                            pTemp = pChild;
                            nPos++;
                        }
                        if(!pSelEntry || lcl_IsContentType(pSelEntry))
                            pSelEntry = pTemp;
                    }

                }
            }
            if(pSelEntry)
            {
                MakeVisible(pSelEntry);
                Select(pSelEntry);
            }
        }
        else
        {
            SwContentType** ppRootContentT = bActive ?
                                &aActiveContentArr[nRootType] :
                                    &aHiddenContentArr[nRootType];
            if(!(*ppRootContentT))
                (*ppRootContentT) = new SwContentType(pShell, nRootType, nOutlineLevel );
            const Image& rImage = aEntryImages.GetImage(20000 + nRootType);
            SvLBoxEntry* pParent = InsertEntry(
                    (*ppRootContentT)->GetName(), rImage, rImage,
                        0, sal_False, LIST_APPEND, *ppRootContentT);
            SvLBoxEntry* pEntry;
            for(sal_uInt16 i = 0; i < (*ppRootContentT)->GetMemberCount(); i++ )
            {
                const SwContent* pCnt = (*ppRootContentT)->GetMember(i);
                if(pCnt)
                {
                    String sEntry = pCnt->GetName();
                    if(!sEntry.Len())
                        sEntry = sSpace;
                    pEntry = InsertEntry( sEntry, pParent,
                                sal_False, LIST_APPEND, (void*)pCnt);
                }
            }
            Expand(pParent);
            if( nRootType == CONTENT_TYPE_OUTLINE && bIsActive )
            {
                //feststellen, wo der Cursor steht
                const sal_uInt16 nActPos = pShell->GetOutlinePos(MAXLEVEL);
                SvLBoxEntry* pEntry = First();

                while( 0 != (pEntry = Next(pEntry)) )
                {
                    if(((SwOutlineContent*)pEntry->GetUserData())->GetPos() == nActPos)
                    {
                        MakeVisible(pEntry);
                        Select(pEntry);
                    }
                }

            }
            else
            {
                // jetzt vielleicht noch ein Child selektieren
                SvLBoxEntry* pChild = pParent;
                SvLBoxEntry* pTemp = 0;
                sal_uInt16 nPos = 1;
                while(0 != (pChild = Next(pChild)))
                {
                    // der alte Text wird leicht bevorzugt
                    if(sEntryName == GetEntryText(pChild) ||
                        nPos == nEntryRelPos )
                    {
                        pSelEntry = pChild;
                        break;
                    }
                    pTemp = pChild;
                    nPos++;
                }
                if(!pSelEntry)
                    pSelEntry = pTemp;
                if(pSelEntry)
                {
                    MakeVisible(pSelEntry);
                    Select(pSelEntry);
                }
            }
        }
    }
    SetUpdateMode( sal_True );

}

/***************************************************************************
    Beschreibung:   Im Clear muessen auch die ContentTypes geloescht werden
***************************************************************************/


void SwContentTree::Clear()
{
    SetUpdateMode(sal_False);
    SvTreeListBox::Clear();
    SetUpdateMode(sal_True);
}

/***************************************************************************
    Beschreibung:   Inhalt eintueten und abschicken
***************************************************************************/


void SwContentTree::StartExecuteDrag()
{
    DragServer::Clear();
    nDragMode = DRAG_MOVEABLE|DRAG_COPYABLE|DRAG_LINKABLE;
    if(!FillDragServer(nDragMode))
        return;

    Application::PostUserEvent( STATIC_LINK( this, SwContentTree, ExecDragHdl ) );

}

/***************************************************************************
    Beschreibung:
***************************************************************************/


sal_Bool SwContentTree::FillDragServer(sal_uInt16& nDragMode)
{
    SwWrtShell* pWrtShell = GetWrtShell();
    DBG_ASSERT(pWrtShell, "keine Shell!")
    SvLBoxEntry* pEntry = GetCurEntry();
    if(!pEntry || lcl_IsContentType(pEntry) || !pWrtShell)
        return sal_False;
    String sEntry;
    SwContent* pCnt = ((SwContent*)pEntry->GetUserData());

    sal_uInt16 nActType = pCnt->GetParent()->GetType();
    String sUrl;
    sal_Bool bOutline = sal_False;
    String sOutlineText;
    switch( nActType )
    {
        case CONTENT_TYPE_OUTLINE:
        {
            sal_uInt16 nPos = ((SwOutlineContent*)pCnt)->GetPos();
            DBG_ASSERT(nPos < pWrtShell->GetOutlineCnt(),
            "outlinecnt veraendert")
            const SwNumRule* pOutlRule = pWrtShell->GetOutlineNumRule();
            const SwNodeNum* pNum = pWrtShell->GetOutlineNum(nPos);
            if( pNum && pOutlRule && MAXLEVEL >= pNum->GetLevel())
                for(sal_Int8 nLevel = 0; nLevel <= pNum->GetLevel(); nLevel++)
                {
                    sal_uInt16 nVal = pNum->GetLevelVal()[nLevel];
                    nVal ++;
                    nVal -= pOutlRule->Get(nLevel).GetStartValue();
                    sEntry += String::CreateFromInt32( nVal );
                    sEntry += '.';
                }
            sEntry += pWrtShell->GetOutlineText(nPos, sal_False);
            sOutlineText = pWrtShell->GetOutlineText(nPos, sal_True);
            bIsOutlineMoveable = ((SwOutlineContent*)pCnt)->IsMoveable();
            bOutline = sal_True;
        }
        break;
        case CONTENT_TYPE_POSTIT:
        case CONTENT_TYPE_INDEX:
        case CONTENT_TYPE_REFERENCE :
            // koennen weder als URL noch als Bereich eingefuegt werden
        break;
        case CONTENT_TYPE_URLFIELD:
            sUrl = ((SwURLFieldContent*)pCnt)->GetURL();
        // kein break;
        case CONTENT_TYPE_OLE:
        case CONTENT_TYPE_GRAPHIC:
            if(GetParentWindow()->GetRegionDropMode() != REGION_MODE_NONE)
                break;
            else
                nDragMode &= ~(DRAG_LINKABLE|DRAG_MOVEABLE);
        default:
            sEntry = GetEntryText(pEntry);
    }

    sal_Bool bRet = sal_False;
    if(sEntry.Len())
    {
        const SwDocShell* pDocShell = pWrtShell->GetView().GetDocShell();
        if(!sUrl.Len())
        {
            if(pDocShell->HasName())
            {
                SfxMedium* pMedium = pDocShell->GetMedium();
                sUrl = pMedium->GetURLObject().GetURLNoMark();
                // nur, wenn primaer ein Link eingefuegt werden soll
                bRet = sal_True;
            }
            else if(    nActType == CONTENT_TYPE_REGION ||
                        nActType == CONTENT_TYPE_BOOKMARK )
            {
                // fuer Bereich und Textmarken ist ein Link auch ohne
                // Dateiname ins eigene Dokument erlaubt
                bRet = sal_True;
            }
            else if(bIsConstant &&
                    ( !::GetActiveView() ||
                        pActiveShell != ::GetActiveView()->GetWrtShellPtr()))
            {
                // Urls von inaktiven Views ohne Dateinamen koennen auch nicht
                // gedraggt werden
                bRet = sal_False;
            }
            else
            {
                bRet = GetParentWindow()->GetRegionDropMode() == REGION_MODE_NONE;
                nDragMode = DRAG_MOVEABLE;
            }

            const String& rToken = pCnt->GetParent()->GetTypeToken();
            sUrl += '#';
            sUrl += sEntry;
            if(rToken.Len())
            {
                sUrl += cMarkSeperator;
                sUrl += rToken;
            }
        }
        else
            bRet = sal_True;
        if(bRet)
        {
            DragServer::NewItem();
            //fuer Outlines muss in die Description der Ueberschrifttext mit der echten Nummer
            if(bOutline)
                sEntry = sOutlineText;
            {
                NaviContentBookmark aBmk( sUrl, sEntry,
                                    GetParentWindow()->GetRegionDropMode(),
                                    pDocShell);
                aBmk.CopyDragServer();
            }

            // fuer fremde DocShells muss eine INetBookmark
            // dazugeliefert werden
            if(pDocShell->HasName())
            {
                INetBookmark aBmk( sUrl, sEntry );
                aBmk.CopyDragServer();
            }
        }
    }
    return bRet;
}
/***************************************************************************
    Beschreibung:   Umschalten der Anzeige auf Root
***************************************************************************/


sal_Bool SwContentTree::ToggleToRoot()
{
    if(!bIsRoot)
    {
        SvLBoxEntry* pEntry = GetCurEntry();
        const SwContentType* pCntType;
        if(pEntry)
        {
            if(lcl_IsContentType(pEntry))
                pCntType = (SwContentType*)pEntry->GetUserData();
            else
                pCntType = ((SwContent*)pEntry->GetUserData())->GetParent();
            nRootType = pCntType->GetType();
            bIsRoot = sal_True;
            Display(bIsActive || bIsConstant);
        }
    }
    else
    {
        nRootType = USHRT_MAX;
        bIsRoot = sal_False;
        FindActiveTypeAndRemoveUserData();
        Display(bIsActive || bIsConstant);
    }
    pConfig->SetRootType( nRootType );
    GetParentWindow()->aContentToolBox.CheckItem(FN_SHOW_ROOT, bIsRoot);
    return bIsRoot;
}

/***************************************************************************
    Beschreibung:   Angezeigten Inhalt auf Gueltigkeit pruefen
***************************************************************************/


sal_Bool SwContentTree::HasContentChanged()
{
/*
    -Parallel durch das lokale Array und die Treelistbox laufen.
    -Sind die Eintraege nicht expandiert, werden sie nur im Array verworfen
    und der Contenttype wird als UserData neu gesetzt.
    - ist der Root-Modus aktiv, wird nur dieser aktualisiert,
    fuer die nicht angezeigten Inhaltstypen gilt:
        die Memberliste wird geloescht und der Membercount aktualisiert
    Wenn Inhalte ueberprueft werden, werden gleichzeitig die vorhanden
    Memberlisten aufgefuellt. Sobald ein Unterschied auftritt wird nur noch
    gefuellt und nicht mehr ueberprueft. Abschliessend wird die Box neu gefuellt.

*/

    sal_Bool bRepaint = sal_False;
    sal_Bool bInvalidate = sal_False;

    if(!bIsActive && ! bIsConstant)
    {
        for(sal_uInt16 i=0; i < CONTENT_TYPE_MAX; i++)
        {
            if(aActiveContentArr[i])
                aActiveContentArr[i]->Invalidate();
        }
    }
    else if(bIsRoot)
    {
        sal_Bool bOutline = sal_False;
        SvLBoxEntry* pEntry = First();
        if(!pEntry)
            bRepaint = sal_True;
        else
        {
            sal_uInt16 nType = ((SwContentType*)pEntry->GetUserData())->GetType();
            bOutline = nRootType == CONTENT_TYPE_OUTLINE;
            SwContentType* pArrType = aActiveContentArr[nType];
            if(!pArrType)
                bRepaint = sal_True;
            else
            {
                sal_uInt16 nSelLevel = USHRT_MAX;

                SvLBoxEntry* pFirstSel;
                if(bOutline &&
                        0 != ( pFirstSel = FirstSelected()) &&
                            lcl_IsContent(pFirstSel))
                {
                    nSelLevel = ((SwOutlineContent*)pFirstSel->GetUserData())->GetOutlineLevel();
                    SwWrtShell* pSh = GetWrtShell();
                    sal_uInt16 nOutlinePos = pSh->GetOutlinePos(MAXLEVEL);
                    bRepaint |= nOutlinePos != USHRT_MAX && pSh->GetOutlineLevel(nOutlinePos) != nSelLevel;
                }

                pArrType->Init(&bInvalidate);
                pArrType->FillMemberList();
                pEntry->SetUserData((void*)pArrType);
                if(!bRepaint)
                {
                    if(GetChildCount(pEntry) != pArrType->GetMemberCount())
                            bRepaint = sal_True;
                    else
                    {
                        sal_uInt16 nChildCount = (sal_uInt16)GetChildCount(pEntry);
                        for(sal_uInt16 j = 0; j < nChildCount; j++)
                        {
                            pEntry = Next(pEntry);
                            const SwContent* pCnt = pArrType->GetMember(j);
                            pEntry->SetUserData((void*)pCnt);
                            String sEntryText = GetEntryText(pEntry);
                            if( sEntryText != pCnt->GetName() &&
                                !(sEntryText == sSpace && !pCnt->GetName().Len()))
                                bRepaint = sal_True;
                        }
                    }
                }
            }
        }
        if( !bRepaint && bOutline )
        {
            //feststellen, wo der Cursor steht
            const sal_uInt16 nActPos = GetWrtShell()->GetOutlinePos(MAXLEVEL);
            SvLBoxEntry* pEntry = First();

            while( 0 != (pEntry = Next(pEntry)) )
            {
                if(((SwOutlineContent*)pEntry->GetUserData())->GetPos() == nActPos)
                {
                    if(FirstSelected() != pEntry)
                    {
                        Select(pEntry);
                        MakeVisible(pEntry);
                    }
                }
            }

        }

    }
    else
    {
        SvLBoxEntry* pEntry = First();
        while ( pEntry )
        {
            sal_Bool bNext = sal_True; // mindestens ein Next muss sein
            SwContentType* pTreeType = (SwContentType*)pEntry->GetUserData();
            sal_uInt16 nType = pTreeType->GetType();
            sal_uInt16 nTreeCount = pTreeType->GetMemberCount();
            SwContentType* pArrType = aActiveContentArr[nType];
            if(!pArrType)
                bRepaint = sal_True;
            else
            {
                pArrType->Init(&bInvalidate);
                pEntry->SetUserData((void*)pArrType);
                if(IsExpanded(pEntry))
                {
                    sal_Bool bLevelOrVisibiblityChanged = sal_False;
                    // bLevelOrVisibiblityChanged is set if outlines have changed their level
                    // or if the visibility of objects (frames, sections, tables) has changed
                    // i.e. in header/footer
                    pArrType->FillMemberList(&bLevelOrVisibiblityChanged);
                    if(bLevelOrVisibiblityChanged)
                        bInvalidate = sal_True;
                    sal_uInt16 nChildCount = (sal_uInt16)GetChildCount(pEntry);
                    if(bLevelOrVisibiblityChanged)
                        bInvalidate = sal_True;

                    if(nChildCount != pArrType->GetMemberCount())
                        bRepaint = sal_True;
                    else
                    {
                        for(sal_uInt16 j = 0; j < nChildCount; j++)
                        {
                            pEntry = Next(pEntry);
                            bNext = sal_False;
                            const SwContent* pCnt = pArrType->GetMember(j);
                            pEntry->SetUserData((void*)pCnt);
                            String sEntryText = GetEntryText(pEntry);
                            if( sEntryText != pCnt->GetName() &&
                                !(sEntryText == sSpace && !pCnt->GetName().Len()))
                                bRepaint = sal_True;
                        }
                    }

                }
                else if(pEntry->HasChilds())
                {
                    //war der Eintrag einmal aufgeklappt, dann muessen auch
                    // die unsichtbaren Eintraege geprueft werden.
                    // zumindest muessen die Userdaten aktualisiert werden
                    sal_Bool bLevelOrVisibiblityChanged = sal_False;
                    // bLevelOrVisibiblityChanged is set if outlines have changed their level
                    // or if the visibility of objects (frames, sections, tables) has changed
                    // i.e. in header/footer
                    pArrType->FillMemberList(&bLevelOrVisibiblityChanged);
                    sal_Bool bRemoveChildren = sal_False;
                    sal_uInt16 nChildCount = (sal_uInt16)GetChildCount(pEntry);
                    if( nChildCount != pArrType->GetMemberCount() )
                    {
                        bRemoveChildren = sal_True;
                    }
                    else
                    {
                        SvLBoxEntry* pChild = FirstChild(pEntry);
                        for(sal_uInt16 j = 0; j < nChildCount; j++)
                        {
                            const SwContent* pCnt = pArrType->GetMember(j);
                            pChild->SetUserData((void*)pCnt);
                            String sEntryText = GetEntryText(pChild);
                            if( sEntryText != pCnt->GetName() &&
                                !(sEntryText == sSpace && !pCnt->GetName().Len()))
                                bRemoveChildren = sal_True;
                            pChild = Next(pChild);
                        }
                    }
                    if(bRemoveChildren)
                    {
                        SvLBoxEntry* pChild = FirstChild(pEntry);
                        SvLBoxEntry* pRemove = pChild;
                        for(sal_uInt16 j = 0; j < nChildCount; j++)
                        {
                            pChild = Next(pRemove);
                            GetModel()->Remove(pRemove);
                            pRemove = pChild;
                        }
                    }
                    if(!nChildCount)
                    {
                        pEntry->EnableChildsOnDemand(sal_False);
                        InvalidateEntry(pEntry);
                    }

                }
                else if((nTreeCount != 0)
                            != (pArrType->GetMemberCount()!=0))
                {
                    bRepaint = sal_True;
                }
            }
            //hier muss noch der naechste Root-Entry gefunden werden
            while( pEntry && (bNext || GetParent(pEntry ) ))
            {
                pEntry = Next(pEntry);
                bNext = sal_False;
            }
        }
    }
    if(!bRepaint && bInvalidate)
        Invalidate();
    return bRepaint;
}

/***************************************************************************
    Beschreibung:   Bevor alle Daten geloescht werden, soll noch der letzte
 *                  aktive Eintrag festgestellt werden. Dann werden die
 *                  UserData geloescht
***************************************************************************/
void SwContentTree::FindActiveTypeAndRemoveUserData()
{
    SvLBoxEntry* pEntry = FirstSelected();
    if(pEntry)
    {
        // wird Clear ueber TimerUpdate gerufen, kann nur fuer die Root
        // die Gueltigkeit der UserData garantiert werden
        SvLBoxEntry* pParent;
        while(0 != (pParent = GetParent(pEntry)))
            pEntry = pParent;
        if(pEntry->GetUserData() && lcl_IsContentType(pEntry))
            nLastSelType = ((SwContentType*)pEntry->GetUserData())->GetType();
    }
//  else
//      nLastSelType = USHRT_MAX;
    pEntry = First();
    while(pEntry)
    {
        pEntry->SetUserData(0);
        pEntry = Next(pEntry);
    }
}

/***************************************************************************
    Beschreibung:   Nachdem ein File auf den Navigator gedroppt wurde,
                    wird die neue Shell gesetzt
***************************************************************************/


void SwContentTree::SetHiddenShell(SwWrtShell* pSh)
{
    pHiddenShell = pSh;
    bIsHidden = sal_True;
    bIsActive = bIsConstant = sal_False;
    FindActiveTypeAndRemoveUserData();
    for(sal_uInt16 i=0; i < CONTENT_TYPE_MAX; i++)
    {
        DELETEZ(aHiddenContentArr[i]);
    }
    Display(bIsActive);

    GetParentWindow()->UpdateListBox();
}
/***************************************************************************
    Beschreibung:   Dokumentwechsel - neue Shell setzen
***************************************************************************/


void SwContentTree::SetActiveShell(SwWrtShell* pSh)
{
    if(bIsInternalDrag)
        bDocChgdInDragging = sal_True;
    sal_Bool bClear = pActiveShell != pSh;
    if(bIsActive && bClear)
    {
        pActiveShell = pSh;
        FindActiveTypeAndRemoveUserData();
        Clear();
    }
    else if(bIsConstant)
    {
        if(!lcl_FindShell(pActiveShell))
        {
            pActiveShell = pSh;
            bIsActive = sal_True;
            bIsConstant = sal_False;
            bClear = sal_True;
        }
    }
    // nur wenn es die aktive View ist, wird das Array geloescht und
    // die Anzeige neu gefuellt
    if(bIsActive && bClear)
    {
        FindActiveTypeAndRemoveUserData();
        for(sal_uInt16 i=0; i < CONTENT_TYPE_MAX; i++)
        {
            DELETEZ(aActiveContentArr[i]);
        }
        Display(sal_True);
    }
}

/***************************************************************************
    Beschreibung:   Eine offene View als aktiv festlegen
***************************************************************************/


void SwContentTree::SetConstantShell(SwWrtShell* pSh)
{
    pActiveShell = pSh;
    bIsActive       = sal_False;
    bIsConstant     = sal_True;
    FindActiveTypeAndRemoveUserData();
    for(sal_uInt16 i=0; i < CONTENT_TYPE_MAX; i++)
    {
        DELETEZ(aActiveContentArr[i]);
    }
    Display(sal_True);
}
/***************************************************************************
    Beschreibung:   Kommandos des Navigators ausfuehren
***************************************************************************/


void SwContentTree::ExecCommand(sal_uInt16 nCmd, sal_Bool bModifier)
{
    sal_Bool nMove = sal_False;
    switch( nCmd )
    {
        case FN_ITEM_DOWN:
        case FN_ITEM_UP:   nMove = sal_True;
        case FN_ITEM_LEFT:
        case FN_ITEM_RIGHT:
        if( !GetWrtShell()->GetView().GetDocShell()->IsReadOnly() &&
                (bIsActive ||
                    (bIsConstant && pActiveShell == ::GetActiveView()->GetWrtShellPtr())))
        {
            SwWrtShell* pShell = GetWrtShell();
            sal_Int8 nActOutlineLevel = nOutlineLevel;
            sal_uInt16 nActPos = pShell->GetOutlinePos(nActOutlineLevel);
            SvLBoxEntry* pFirstEntry = FirstSelected();
            if (pFirstEntry && lcl_IsContent(pFirstEntry))
            {
                if(bIsRoot && nRootType == CONTENT_TYPE_OUTLINE ||
                    ((SwContent*)pFirstEntry->GetUserData())->GetParent()->GetType()
                                                ==  CONTENT_TYPE_OUTLINE)
                    nActPos = ((SwOutlineContent*)pFirstEntry->GetUserData())->GetPos();
            }
            if ( nActPos < USHRT_MAX &&
                    ( !nMove || pShell->IsOutlineMovable( nActPos )) )
            {
                pShell->StartAllAction();
                pShell->GotoOutline( nActPos); // Falls Textselektion != BoxSelektion
                pShell->Push();
                pShell->MakeOutlineSel( nActPos, nActPos,
                                    bModifier);
                if( nMove )
                {
                    short nDir = nCmd == FN_ITEM_UP ? -1 : 1;
                    if( !bModifier && (nDir == -1 && nActPos > 0 ||
                        nDir == 1 && nActPos < GetEntryCount() - 2 ) )
                    {
                        pShell->MoveOutlinePara( nDir );
                        //Cursor wieder an die aktuelle Position setzen
                        pShell->GotoOutline( nActPos + nDir);
                    }
                    else if(bModifier)
                    {
                        sal_uInt16 nActEndPos = nActPos;
                        SvLBoxEntry* pEntry = pFirstEntry;
                        sal_uInt16 nActLevel = ((SwOutlineContent*)
                                pFirstEntry->GetUserData())->GetOutlineLevel();
                        pEntry = Next(pEntry);
                        while( pEntry && CONTENT_TYPE_OUTLINE ==
                            ((SwTypeNumber*)pEntry->GetUserData())->GetTypeId() )
                        {
                            if(nActLevel >= ((SwOutlineContent*)
                                pEntry->GetUserData())->GetOutlineLevel())
                                break;
                            pEntry = Next(pEntry);
                            nActEndPos++;
                        }
                        sal_uInt16 nDest;
                        if(nDir == 1)
                        {
                            //Wenn der letzte Eintrag bewegt werden soll
                            //ist Schluss
                            if(pEntry && CONTENT_TYPE_OUTLINE ==
                                ((SwTypeNumber*)pEntry->GetUserData())->GetTypeId())
                            {
                                // pEntry zeigt jetzt auf den
                                // dem letzten sel. Eintrag folgenden E.
                                nDest = nActEndPos;
                                nDest++;
                                //hier muss der uebernaechste Eintrag
                                //gefunden werden. Die Selektion muss davor eingefuegt
                                //werden
                                while(pEntry )
                                {
                                    pEntry = Next(pEntry);
                                    // nDest++ darf nur ausgefuehrt werden,
                                    // wenn pEntry != 0
                                    if(pEntry && nDest++ &&
                                    ( nActLevel >= ((SwOutlineContent*)pEntry->GetUserData())->GetOutlineLevel()||
                                     CONTENT_TYPE_OUTLINE != ((SwTypeNumber*)pEntry->GetUserData())->GetTypeId()))
                                    {
                                        nDest--;
                                        break;
                                    }
                                }
                                nDir = nDest - nActEndPos;
                                //wenn kein Eintrag gefunden wurde, der der Bedingung
                                //fuer das zuvor Einfuegen entspricht, muss etwas weniger
                                //geschoben werden
                            }
                            else
                                nDir = 0;
                        }
                        else
                        {
                            nDest = nActPos;
                            pEntry = pFirstEntry;
                            while(pEntry && nDest )
                            {
                                nDest--;
                                pEntry = Prev(pEntry);
                                if(pEntry &&
                                    (nActLevel >= ((SwOutlineContent*)pEntry->GetUserData())->GetOutlineLevel()||
                                    CONTENT_TYPE_OUTLINE !=
                                ((SwTypeNumber*)pEntry->GetUserData())->GetTypeId()))
                                {
                                    break;
                                }
                            }
                            nDir = nDest - nActPos;
                        }
                        if(nDir)
                        {
                            pShell->MoveOutlinePara( nDir );
                            //Cursor wieder an die aktuelle Position setzen
                            pShell->GotoOutline( nActPos + nDir);
                        }
                    }
                }
                else
                {
                    if( pShell->IsProtectedOutlinePara() )
                        Sound::Beep(); //konnte nicht umgestuft werden
                    else
                        pShell->OutlineUpDown( nCmd == FN_ITEM_LEFT ? -1 : 1 );
                }

                pShell->ClearMark();
                pShell->Pop(sal_False); //Cursor steht jetzt wieder an der akt. Ueberschrift
                pShell->EndAllAction();
                if(aActiveContentArr[CONTENT_TYPE_OUTLINE])
                    aActiveContentArr[CONTENT_TYPE_OUTLINE]->Invalidate();
                Display(sal_True);
                if(!bIsRoot)
                {
                    const sal_uInt16 nActPos = pShell->GetOutlinePos(MAXLEVEL);
                    SvLBoxEntry* pEntry = First();

                    while( 0 != (pEntry = Next(pEntry)) && lcl_IsContent(pEntry))
                    {
                        if(((SwOutlineContent*)pEntry->GetUserData())->GetPos() == nActPos)
                        {
                            Select(pEntry);
                            MakeVisible(pEntry);
                        }
                    }
                }
            }
            else
                Sound::Beep(); //konnte nicht verschoben werden
        }
    }
}
/***************************************************************************
    Beschreibung:
***************************************************************************/


void    SwContentTree::Show()
{
    aUpdTimer.Start();
    SvTreeListBox::Show();
}

/***************************************************************************
    Beschreibung:   zusammengefaltet wird nicht geidlet
***************************************************************************/


void    SwContentTree::Hide()
{
    aUpdTimer.Stop();
    SvTreeListBox::Hide();
}

/***************************************************************************
    Beschreibung:   Kein Idle mit Focus oder waehrend des Dragging
***************************************************************************/


IMPL_LINK( SwContentTree, TimerUpdate, Timer*, EMPTYARG)
{
    // kein Update waehrend D&D
    // Viewabfrage, da der Navigator zu spaet abgeraeumt wird
    SwView* pView = ::GetActiveView();
    if( (!HasFocus() || bViewHasChanged) &&
         !bIsInDrag && !bIsInternalDrag && pView &&
         pView->GetWrtShellPtr() && !pView->GetWrtShellPtr()->ActionPend() )
    {
        bViewHasChanged = sal_False;
        bIsIdleClear = sal_False;
        SwWrtShell* pActShell = pView->GetWrtShellPtr();
        if( bIsConstant && !lcl_FindShell( pActiveShell ) )
        {
            SetActiveShell(pActShell);
            GetParentWindow()->UpdateListBox();
        }

        if(bIsActive && pActShell != GetWrtShell())
            SetActiveShell(pActShell);
        else if( (bIsActive || (bIsConstant && pActShell == GetWrtShell())) &&
                    HasContentChanged())
        {
            FindActiveTypeAndRemoveUserData();
            Display(sal_True);
        }
    }
    else if(!pView && bIsActive && !bIsIdleClear)
    {
        if(pActiveShell)
            SetActiveShell(0);
        Clear();
        bIsIdleClear = sal_True;
    }
    return 0;
}

/***************************************************************************
    Beschreibung:
***************************************************************************/


DragDropMode  SwContentTree::NotifyBeginDrag( SvLBoxEntry* pEntry )
{
    DragDropMode eMode = (DragDropMode)0;
    if(bIsActive && nRootType == CONTENT_TYPE_OUTLINE &&
        GetModel()->GetAbsPos( pEntry ) > 0
        && !GetWrtShell()->GetView().GetDocShell()->IsReadOnly())
        eMode =  GetDragDropMode();
    else if(!bIsActive && GetWrtShell()->GetView().GetDocShell()->HasName())
        eMode = SV_DRAGDROP_APP_COPY;

    sal_uInt16 nDrgMode;
    FillDragServer(nDrgMode);
    bDocChgdInDragging = sal_False;
    return eMode;
}


/***************************************************************************
    Beschreibung :  Nach dem Drag wird der aktuelle Absatz m i t
                    Childs verschoben
***************************************************************************/


sal_Bool  SwContentTree::NotifyMoving( SvLBoxEntry*  pTarget,
        SvLBoxEntry*  pEntry, SvLBoxEntry*& , sal_uInt32& )
{
    if(!bDocChgdInDragging)
    {
        sal_uInt16 nTargetPos = 0;
        sal_uInt16 nSourcePos = (( SwOutlineContent* )pEntry->GetUserData())->GetPos();
        if(!lcl_IsContent(pTarget))
            nTargetPos = USHRT_MAX;
        else
            nTargetPos = (( SwOutlineContent* )pTarget->GetUserData())->GetPos();
        if( MAXLEVEL > nOutlineLevel && // werden nicht alle Ebenen angezeigt
                        nTargetPos != USHRT_MAX)
        {
            SvLBoxEntry* pNext = Next(pTarget);
            if(pNext)
                nTargetPos = (( SwOutlineContent* )pNext->GetUserData())->GetPos() -1;
            else
                nTargetPos = GetWrtShell()->GetOutlineCnt() - 1;

        }

        DBG_ASSERT( pEntry &&
            lcl_IsContent(pEntry),"Source == 0 oder Source hat keinen Content" )
        GetParentWindow()->MoveOutline( nSourcePos,
                                    nTargetPos,
                                    sal_True);

        aActiveContentArr[CONTENT_TYPE_OUTLINE]->Invalidate();
        Display(sal_True);
    }
    //TreeListBox wird aus dem Dokument neu geladen
    return sal_False;
}
/***************************************************************************
    Beschreibung :  Nach dem Drag wird der aktuelle Absatz o h n e
                    Childs verschoben
***************************************************************************/


sal_Bool  SwContentTree::NotifyCopying( SvLBoxEntry*  pTarget,
        SvLBoxEntry*  pEntry, SvLBoxEntry*& , sal_uInt32& )
{
    if(!bDocChgdInDragging)
    {
        sal_uInt16 nTargetPos = 0;
        sal_uInt16 nSourcePos = (( SwOutlineContent* )pEntry->GetUserData())->GetPos();
        if(!lcl_IsContent(pTarget))
            nTargetPos = USHRT_MAX;
        else
            nTargetPos = (( SwOutlineContent* )pTarget->GetUserData())->GetPos();

        if( MAXLEVEL > nOutlineLevel && // werden nicht alle Ebenen angezeigt
                        nTargetPos != USHRT_MAX)
        {
            SvLBoxEntry* pNext = Next(pTarget);
            if(pNext)
                nTargetPos = (( SwOutlineContent* )pNext->GetUserData())->GetPos() - 1;
            else
                nTargetPos = GetWrtShell()->GetOutlineCnt() - 1;

        }


        DBG_ASSERT( pEntry &&
            lcl_IsContent(pEntry),"Source == 0 oder Source hat keinen Content" )
        GetParentWindow()->MoveOutline( nSourcePos, nTargetPos, sal_False);

        //TreeListBox wird aus dem Dokument neu geladen
        aActiveContentArr[CONTENT_TYPE_OUTLINE]->Invalidate();
        Display(sal_True);
    }
    return sal_False;
}
/***************************************************************************
    Beschreibung:   Kein Drop vor den ersten Eintrag - es ist ein SwContentType
***************************************************************************/


sal_Bool  SwContentTree::NotifyQueryDrop( SvLBoxEntry* pEntry)
{
    return pEntry != 0;
}

/***************************************************************************
    Beschreibung:
***************************************************************************/


void  SwContentTree::BeginDrag( const Point& rPt)
{
    bIsInternalDrag = sal_True;
    SvTreeListBox::BeginDrag(rPt);
}
/***************************************************************************
    Beschreibung:
***************************************************************************/


void  SwContentTree::EndDrag()
{
    bIsInternalDrag = sal_False;
    SvTreeListBox::EndDrag();
}
/***************************************************************************
    Beschreibung:   Wird ein Ctrl+DoubleClick in einen freien Bereich ausgefuehrt,
 *                  dann soll die Basisfunktion des Controls gerufen werden
***************************************************************************/
void  SwContentTree::MouseButtonDown( const MouseEvent& rMEvt )
{
    Point aPos( rMEvt.GetPosPixel());
    SvLBoxEntry* pEntry = GetEntry( aPos, sal_True );
    if( !pEntry && rMEvt.IsLeft() && rMEvt.IsMod1() && (rMEvt.GetClicks() % 2) == 0)
        Control::MouseButtonDown( rMEvt );
    else
        SvTreeListBox::MouseButtonDown( rMEvt );
}

/***************************************************************************
    Beschreibung:   sofort aktualisieren
***************************************************************************/


void  SwContentTree::GetFocus()
{
    SwView* pActView = ::GetActiveView();
    if(pActView)
    {
        SwWrtShell* pActShell = pActView->GetWrtShellPtr();
        if(bIsConstant && !lcl_FindShell(pActiveShell))
        {
            SetActiveShell(pActShell);
        }

        if(bIsActive && pActShell != GetWrtShell())
            SetActiveShell(pActShell);
        else if( (bIsActive || (bIsConstant && pActShell == GetWrtShell())) &&
                    HasContentChanged())
        {
            Display(sal_True);
        }
    }
    else if(bIsActive)
        Clear();
    SvTreeListBox::GetFocus();
}

/***************************************************************************
    Beschreibung:
***************************************************************************/


void  SwContentTree::KeyInput(const KeyEvent& rEvent)
{
    const KeyCode aCode = rEvent.GetKeyCode();
    if(aCode.GetCode() == KEY_RETURN)
    {
        SvLBoxEntry* pEntry = FirstSelected();
        if ( pEntry )
        {
            switch(aCode.GetModifier())
            {
                case KEY_MOD2:
                    // Boxen umschalten
                    GetParentWindow()->ToggleTree();
                break;
                case KEY_MOD1:
                    // RootModus umschalten
                    ToggleToRoot();
                break;
                case 0:
                    if(lcl_IsContentType(pEntry))
                    {
                        IsExpanded(pEntry) ?
                            Collapse(pEntry) :
                                Expand(pEntry);
                    }
                    else
                        ContentDoubleClickHdl(0);
                break;
            }
        }
    }
    else if(aCode.GetCode() == KEY_DELETE && 0 == aCode.GetModifier())
    {
        SvLBoxEntry* pEntry = FirstSelected();
        if(pEntry &&
            lcl_IsContent(pEntry) &&
                ((SwContent*)pEntry->GetUserData())->GetParent()->IsDeletable() &&
                    !pActiveShell->GetView().GetDocShell()->IsReadOnly())
        {
            EditEntry(pEntry, EDIT_MODE_DELETE);
            GrabFocus();
        }
    }
    else
        SvTreeListBox::KeyInput(rEvent);

}

/***************************************************************************
    Beschreibung:
***************************************************************************/


void  SwContentTree::RequestHelp( const HelpEvent& rHEvt )
{
    if( rHEvt.GetMode() & HELPMODE_QUICK )
    {
        Point aPos( ScreenToOutputPixel( rHEvt.GetMousePosPixel() ));
        SvLBoxEntry* pEntry = GetEntry( aPos );
        if( pEntry )
        {
            sal_uInt16 nType;
            sal_Bool bBalloon = sal_False;
            sal_Bool bContent = sal_False;
            void* pUserData = pEntry->GetUserData();
            if(lcl_IsContentType(pEntry))
                nType = ((SwContentType*)pUserData)->GetType();
            else
            {
                nType = ((SwContent*)pUserData)->GetParent()->GetType();
                bContent = sal_True;
            }
            String sEntry;
            sal_Bool bRet = sal_False;
            if(bContent)
            {
                switch( nType )
                {
                    case CONTENT_TYPE_URLFIELD:
                        sEntry = ((SwURLFieldContent*)pUserData)->GetURL();
                        bRet = sal_True;
                    break;

                    case CONTENT_TYPE_POSTIT:
                        sEntry = ((SwPostItContent*)pUserData)->GetName();
                        bRet = sal_True;
                        if(Help::IsBalloonHelpEnabled())
                            bBalloon = sal_True;
                    break;
                    case CONTENT_TYPE_OUTLINE:
                        sEntry = ((SwOutlineContent*)pUserData)->GetName();
                        bRet = sal_True;
                    break;
                    case CONTENT_TYPE_GRAPHIC:
                        sEntry = ((SwGraphicContent*)pUserData)->GetLink();
#ifdef DEBUG
                        sEntry += ' ';
                        sEntry += String::CreateFromInt32(
                                    ((SwGraphicContent*)pUserData)->GetYPos());
#endif
                        bRet = sal_True;
                    break;
#ifdef DEBUG
                    case CONTENT_TYPE_TABLE:
                    case CONTENT_TYPE_FRAME:
                        sEntry = String::CreateFromInt32(
                                        ((SwContent*)pUserData)->GetYPos() );
                        bRet = sal_True;
                    break;
#endif
                }
                if(((SwContent*)pUserData)->IsInvisible())
                {
                    if(sEntry.Len())
                        sEntry += C2S(", ");
                    sEntry += sInvisible;
                    bRet = sal_True;
                }
            }
            else
            {
                sal_uInt16 nMemberCount = ((SwContentType*)pUserData)->GetMemberCount();
                sEntry = String::CreateFromInt32(nMemberCount);
                sEntry += ' ';
                sEntry += nMemberCount == 1
                            ? ((SwContentType*)pUserData)->GetSingleName()
                            : ((SwContentType*)pUserData)->GetName();
                bRet = sal_True;
            }
            if(bRet)
            {
                SvLBoxTab* pTab;
                SvLBoxItem* pItem = GetItem( pEntry, aPos.X(), &pTab );
                if( pItem && SV_ITEM_ID_LBOXSTRING == pItem->IsA())
                {
                    aPos = GetEntryPos( pEntry );

                    aPos.X() = GetTabPos( pEntry, pTab );
                    Size aSize( pItem->GetSize( this, pEntry ) );

                    if((aPos.X() + aSize.Width()) > GetSizePixel().Width())
                        aSize.Width() = GetSizePixel().Width() - aPos.X();

                    aPos = OutputToScreenPixel(aPos);
                    Rectangle aItemRect( aPos, aSize );
                    if(bBalloon)
                    {
                        aPos.X() += aSize.Width();
                        Help::ShowBalloon( this, aPos, aItemRect, sEntry );
                    }
                    else
                        Help::ShowQuickHelp( this, aItemRect, sEntry,
                            QUICKHELP_LEFT|QUICKHELP_VCENTER );
                }
            }
            else
                Help::ShowQuickHelp( this, Rectangle(), aEmptyStr, 0 );
        }
    }
}

/***************************************************************************
    Beschreibung:
***************************************************************************/


IMPL_LINK(SwContentTree, PopupHdl, Menu*, pMenu)
{
    sal_uInt16 nId = pMenu->GetCurItemId();
    SvLBoxEntry* pFirst = FirstSelected();
    switch( nId )
    {
        //Outlinelevel
        case 101:
        case 102:
        case 103:
        case 104:
        case 105:
        case 106:
        case 107:
        case 108:
        case 109:
        case 110:
            nId -= 100;
            if(nOutlineLevel != nId )
                SetOutlineLevel((sal_Int8)nId);
        break;
        case 201:
        case 202:
        case 203:
            GetParentWindow()->SetRegionDropMode(nId - 201);
        break;
        case 401:
        case 402:
            EditEntry(pFirst, nId == 401 ? EDIT_MODE_RMV_IDX : EDIT_MODE_UPD_IDX);
        break;
        // Eintrag bearbeiten
        case 403:
            EditEntry(pFirst);
        break;
        case 404:
            EditEntry(pFirst, EDIT_UNPROTECT_TABLE);
        break;
        case 405 :
        {
            const SwTOXBase* pBase = ((SwTOXBaseContent*)pFirst->GetUserData())
                                                                ->GetTOXBase();
            pActiveShell->SetTOXBaseReadonly(*pBase, !pMenu->IsItemChecked(nId));
        }
        break;
        case 4:
        break;
        case 501:
            EditEntry(pFirst, EDIT_MODE_DELETE);
        break;
        case 502 :
            EditEntry(pFirst, EDIT_MODE_RENAME);
        break;
        //Anzeige
        default: // nId > 300
        if(nId > 300 && nId < 400)
        {
            nId -= 300;
            SwView *pView = SwModule::GetFirstView();
            while (pView)
            {
                nId --;
                if(nId == 0)
                {
                    SetConstantShell(&pView->GetWrtShell());
                    break;
                }
                pView = SwModule::GetNextView(pView);
            }
            if(nId)
            {
                bViewHasChanged = bIsActive = nId==1;
                bIsConstant = sal_False;
                Display(nId == 1);
            }
        }
    }
    GetParentWindow()->UpdateListBox();
    return sal_True;
}

/***************************************************************************
    Beschreibung:
***************************************************************************/


void SwContentTree::SetOutlineLevel(sal_uInt8 nSet)
{
    nOutlineLevel = nSet;
    pConfig->SetOutlineLevel( nOutlineLevel );
    SwContentType** ppContentT = bIsActive ?
                    &aActiveContentArr[CONTENT_TYPE_OUTLINE] :
                        &aHiddenContentArr[CONTENT_TYPE_OUTLINE];
    if(*ppContentT)
    {
        (*ppContentT)->SetOutlineLevel(nOutlineLevel);
        (*ppContentT)->Init();
    }
    Display(bIsActive);
}

/***************************************************************************
    Beschreibung:   Moduswechsel: gedropptes Doc anzeigen
***************************************************************************/


void SwContentTree::ShowHiddenShell()
{
    if(pHiddenShell)
    {
        bIsConstant = sal_False;
        bIsActive = sal_False;
        Display(sal_False);
    }
}

/***************************************************************************
    Beschreibung:   Moduswechsel: aktive Sicht anzeigen
***************************************************************************/


void SwContentTree::ShowActualView()
{
    bIsActive = sal_True;
    bIsConstant = sal_False;
    Display(sal_True);
    GetParentWindow()->UpdateListBox();
}

/*-----------------20.11.96 13.34-------------------
    Beschreibung: Hier sollen die Buttons zum Verschieben von
                  Outlines en-/disabled werden
--------------------------------------------------*/

sal_Bool  SwContentTree::Select( SvLBoxEntry* pEntry, sal_Bool bSelect )
{
    if(!pEntry)
        return sal_False;
    sal_Bool bEnable = sal_False;
    SvLBoxEntry* pParentEntry = GetParent(pEntry);
    if(!bIsLastReadOnly && (!IsVisible() ||
        (bIsRoot && nRootType == CONTENT_TYPE_OUTLINE && pParentEntry ||
            lcl_IsContent(pEntry) && ((SwContentType*)pParentEntry->GetUserData())->GetType() == CONTENT_TYPE_OUTLINE)))
        bEnable = sal_True;
    SwNavigationPI* pNavi = GetParentWindow();
    pNavi->aContentToolBox.EnableItem(FN_ITEM_UP ,  bEnable);
    pNavi->aContentToolBox.EnableItem(FN_ITEM_DOWN, bEnable);
    pNavi->aContentToolBox.EnableItem(FN_ITEM_LEFT, bEnable);
    pNavi->aContentToolBox.EnableItem(FN_ITEM_RIGHT,bEnable);

    return SvTreeListBox::Select(pEntry, bSelect);
}

/*-----------------27.11.96 12.56-------------------

--------------------------------------------------*/

void SwContentTree::SetRootType(sal_uInt16 nType)
{
    nRootType = nType;
    bIsRoot = sal_True;
    pConfig->SetRootType( nRootType );
}

/*-----------------10.01.97 12.19-------------------

--------------------------------------------------*/

void SwContentType::RemoveNewline(String& rEntry)
{
    sal_Unicode* pStr = rEntry.GetBufferAccess();
    for(xub_StrLen i = rEntry.Len(); i; --i, ++pStr )
    {
        if( *pStr == 10 || *pStr == 13 )
            *pStr = 0x20;
    }
}

/*-----------------14.01.97 16.38-------------------

--------------------------------------------------*/

void SwContentTree::EditEntry(SvLBoxEntry* pEntry, sal_uInt8 nMode)
{
    SwContent* pCnt = (SwContent*)pEntry->GetUserData();
    GotoContent(pCnt);
    sal_uInt16 nType = pCnt->GetParent()->GetType();
    sal_uInt16 nSlot = 0;

    uno::Reference< container::XNameAccess >  xNameAccess, xSecond, xThird;
    switch(nType)
    {
        case CONTENT_TYPE_TABLE     :
            if(nMode == EDIT_UNPROTECT_TABLE)
            {
                pActiveShell->GetView().GetDocShell()->
                        GetDoc()->UnProtectCells( pCnt->GetName());
            }
            else if(nMode == EDIT_MODE_DELETE)
            {
                pActiveShell->StartAction();
                pActiveShell->StartUndo();
                pActiveShell->GetView().GetViewFrame()->GetDispatcher()->Execute(FN_TABLE_SELECT_ALL);
                pActiveShell->DeleteRow();
                pActiveShell->EndUndo();
                pActiveShell->EndAction();
            }
            else if(nMode == EDIT_MODE_RENAME)
            {
                uno::Reference< frame::XModel >  xModel = pActiveShell->GetView().GetDocShell()->GetBaseModel();
                uno::Reference< text::XTextTablesSupplier >  xTables(xModel, uno::UNO_QUERY);
                xNameAccess = xTables->getTextTables();
            }
            else
                nSlot = FN_FORMAT_TABLE_DLG;
        break;

        case CONTENT_TYPE_GRAPHIC   :
            if(nMode == EDIT_MODE_DELETE)
            {
                pActiveShell->DelRight();
            }
            else if(nMode == EDIT_MODE_RENAME)
            {
                uno::Reference< frame::XModel >  xModel = pActiveShell->GetView().GetDocShell()->GetBaseModel();
                uno::Reference< text::XTextGraphicObjectsSupplier >  xGraphics(xModel, uno::UNO_QUERY);
                xNameAccess = xGraphics->getGraphicObjects();
                uno::Reference< text::XTextFramesSupplier >  xFrms(xModel, uno::UNO_QUERY);
                xSecond = xFrms->getTextFrames();
                uno::Reference< text::XTextEmbeddedObjectsSupplier >  xObjs(xModel, uno::UNO_QUERY);
                xThird = xObjs->getEmbeddedObjects();
            }
            else
                nSlot = FN_FORMAT_GRAFIC_DLG;
        break;

        case CONTENT_TYPE_FRAME     :
        case CONTENT_TYPE_OLE       :
            if(nMode == EDIT_MODE_DELETE)
            {
                pActiveShell->DelRight();
            }
            else if(nMode == EDIT_MODE_RENAME)
            {
                uno::Reference< frame::XModel >  xModel = pActiveShell->GetView().GetDocShell()->GetBaseModel();
                uno::Reference< text::XTextFramesSupplier >  xFrms(xModel, uno::UNO_QUERY);
                uno::Reference< text::XTextEmbeddedObjectsSupplier >  xObjs(xModel, uno::UNO_QUERY);
                if(CONTENT_TYPE_FRAME == nType)
                {
                    xNameAccess = xFrms->getTextFrames();
                    xSecond = xObjs->getEmbeddedObjects();
                }
                else
                {
                    xNameAccess = xObjs->getEmbeddedObjects();
                    xSecond = xFrms->getTextFrames();
                }
                uno::Reference< text::XTextGraphicObjectsSupplier >  xGraphics(xModel, uno::UNO_QUERY);
                xThird = xGraphics->getGraphicObjects();
            }
            else
                nSlot = FN_FORMAT_FRAME_DLG;
        break;
        case CONTENT_TYPE_BOOKMARK  :
            if(nMode == EDIT_MODE_DELETE)
            {
                pActiveShell->DelBookmark( pCnt->GetName() );
            }
            else if(nMode == EDIT_MODE_RENAME)
            {
                uno::Reference< frame::XModel >  xModel = pActiveShell->GetView().GetDocShell()->GetBaseModel();
                uno::Reference< text::XBookmarksSupplier >  xBkms(xModel, uno::UNO_QUERY);
                xNameAccess = xBkms->getBookmarks();
            }
            else
                nSlot = FN_INSERT_BOOKMARK;
        break;

        case CONTENT_TYPE_REGION    :
            if(nMode == EDIT_MODE_RENAME)
            {
                uno::Reference< frame::XModel >  xModel = pActiveShell->GetView().GetDocShell()->GetBaseModel();
                uno::Reference< text::XTextSectionsSupplier >  xSects(xModel, uno::UNO_QUERY);
                xNameAccess = xSects->getTextSections();
            }
            else
                nSlot = FN_EDIT_REGION;
        break;

        case CONTENT_TYPE_URLFIELD:
            nSlot = FN_EDIT_HYPERLINK;
        break;
        case CONTENT_TYPE_REFERENCE:
            nSlot = FN_EDIT_FIELD;
        break;

        case CONTENT_TYPE_POSTIT:
            if(nMode == EDIT_MODE_DELETE)
            {
                pActiveShell->DelRight();
            }
            else
                nSlot = FN_POSTIT;
        break;
        case CONTENT_TYPE_INDEX:
        {
            const SwTOXBase* pBase = ((SwTOXBaseContent*)pCnt)->GetTOXBase();
            switch(nMode)
            {
                case EDIT_MODE_EDIT:
                    if(pBase)
                        nSlot = FN_INSERT_MULTI_TOX;
                break;
                case EDIT_MODE_UPD_IDX:
                    nSlot = FN_UPDATE_CUR_TOX;
                break;
                case EDIT_MODE_RMV_IDX:
                case EDIT_MODE_DELETE:
                {
                    if( pBase )
                        pActiveShell->DeleteTOX(*pBase, EDIT_MODE_DELETE == nMode);
                }
                break;
                case EDIT_MODE_RENAME:
                {
                    uno::Reference< frame::XModel >  xModel = pActiveShell->GetView().GetDocShell()->GetBaseModel();
                    uno::Reference< text::XDocumentIndexesSupplier >  xIndexes(xModel, uno::UNO_QUERY);
                    xNameAccess = uno::Reference< container::XNameAccess >(xIndexes, uno::UNO_QUERY);
                }
                break;
            }
        }
        break;

    }
    if(nSlot)
        pActiveShell->GetView().GetViewFrame()->
                    GetDispatcher()->Execute(nSlot, SFX_CALLMODE_ASYNCHRON);
    else if(xNameAccess.is())
    {
        uno::Any aObj = xNameAccess->getByName(pCnt->GetName());
        uno::Reference< uno::XInterface >  xTmp = *(uno::Reference< uno::XInterface > *)aObj.getValue();
        uno::Reference< container::XNamed >  xNamed(xTmp, uno::UNO_QUERY);
        SwRenameXNamedDlg aDlg(this, xNamed, xNameAccess);
        if(xSecond.is())
            aDlg.SetAlternativeAccess( xSecond, xThird);

        String sForbiddenChars;
        if(CONTENT_TYPE_BOOKMARK == nType)
        {
            sForbiddenChars = C2S("/\\@:*?\";,.# ");
        }
        else if(CONTENT_TYPE_TABLE == nType)
        {
            sForbiddenChars = C2S(" .<>");
        }
        aDlg.SetForbiddenChars(sForbiddenChars);
        aDlg.Execute();
    }
}

/*-----------------14.01.97 16.53-------------------

--------------------------------------------------*/

void SwContentTree::GotoContent(SwContent* pCnt)
{
    pActiveShell->EnterStdMode();

    sal_Bool bSel = sal_False;
    sal_uInt16 nJumpType = pCnt->GetParent()->GetType();
    switch(nJumpType)
    {
        case CONTENT_TYPE_OUTLINE   :
        {
            pActiveShell->GotoOutline(((SwOutlineContent*)pCnt)->GetPos());
        }
        break;
        case CONTENT_TYPE_TABLE     :
        {
            pActiveShell->GotoTable(pCnt->GetName());
        }
        break;
        case CONTENT_TYPE_FRAME     :
        case CONTENT_TYPE_GRAPHIC   :
        case CONTENT_TYPE_OLE       :
        {
            if(pActiveShell->GotoFly(pCnt->GetName()))
                bSel = sal_True;
        }
        break;
        case CONTENT_TYPE_BOOKMARK  :
        {
            pActiveShell->GotoBookmark(pCnt->GetName());
        }
        break;
        case CONTENT_TYPE_REGION    :
        {
            pActiveShell->GotoRegion(pCnt->GetName());
        }
        break;
        case CONTENT_TYPE_URLFIELD:
        {
            if(pActiveShell->GotoINetAttr(
                            *((SwURLFieldContent*)pCnt)->GetINetAttr() ))
            {
                pActiveShell->Right(sal_True, 1, sal_False);
                pActiveShell->SwCrsrShell::SelectTxtAttr( RES_TXTATR_INETFMT, sal_True );
            }

        }
        break;
        case CONTENT_TYPE_REFERENCE:
        {
            pActiveShell->GotoRefMark(pCnt->GetName());
        }
        break;
        case CONTENT_TYPE_INDEX:
        {
            if (!pActiveShell->GotoNextTOXBase(&pCnt->GetName()))
                pActiveShell->GotoPrevTOXBase(&pCnt->GetName());
        }
        break;
        case CONTENT_TYPE_POSTIT:
            pActiveShell->GotoFld(*((SwPostItContent*)pCnt)->GetPostIt());
        break;
        case CONTENT_TYPE_DRAWOBJECT:
            DBG_ERROR("unsupported format")
        break;
    }
    if(bSel)
    {
        pActiveShell->HideCrsr();
        pActiveShell->EnterSelFrmMode();
    }
    SwView& rView = pActiveShell->GetView();
    rView.StopShellTimer();
    rView.GetEditWin().GrabFocus();
}
/*-----------------06.02.97 19.14-------------------
    Jetzt nochtdie passende ::com::sun::star::text::Bookmark
--------------------------------------------------*/

NaviContentBookmark::NaviContentBookmark()
        :   nDefDrag( REGION_MODE_NONE ), nDocSh(0)
{
}

/*-----------------06.02.97 20.12-------------------

--------------------------------------------------*/

NaviContentBookmark::NaviContentBookmark( const String &rUrl,
                    const String& rDesc,
                    sal_uInt16 nDragType,
                    const SwDocShell* pDocSh ) :
    aUrl( rUrl ),
    aDescr(rDesc),
    nDefDrag( nDragType ),
    nDocSh((long)pDocSh)
{
}

/*-----------------06.02.97 19.17-------------------

--------------------------------------------------*/


sal_Bool    NaviContentBookmark::DragServerHasFormat( sal_uInt16 nItem,
                                                    const SwDocShell* pDocSh )
{
    sal_Bool bRet = sal_False;
    if(DragServer::HasFormat( nItem, SOT_FORMATSTR_ID_SONLK ))
    {
        long nDocSh = (long) pDocSh;
        NaviContentBookmark aTemp;
        aTemp.PasteDragServer(nItem);
        // steht vor dem # ein Dateiname?
        sal_uInt16 nFound = aTemp.GetURL().Search('#');
        // entweder die Quelle hatte einen Namen oder Quelle und Ziel sind gleich
        if(nFound != STRING_NOTFOUND &&
            (nFound > 0  ||
                nDocSh == aTemp.GetDocShell() ))
                bRet = sal_True;
    }
    return bRet;
}

/*-----------------06.02.97 19.17-------------------

--------------------------------------------------*/

sal_Bool NaviContentBookmark::CopyDragServer() const
{
     String aString( aUrl );
     aString += NAVI_BOOKMARK_DELIM;
     aString += aDescr;
     aString += NAVI_BOOKMARK_DELIM;
     aString += String::CreateFromInt32( nDefDrag );
     aString += NAVI_BOOKMARK_DELIM;
     aString += String::CreateFromInt32( nDocSh );

     return DragServer::CopyData( aString.GetBuffer(), (aString.Len() + 1) *2,
                                  SOT_FORMATSTR_ID_SONLK );
}
/*-----------------06.02.97 19.16-------------------

--------------------------------------------------*/

sal_Bool NaviContentBookmark::PasteDragServer( sal_uInt16 nItem )
{
    sal_Bool bRet = sal_False;
    if( DragServer::HasFormat( nItem, SOT_FORMATSTR_ID_SONLK ) )
    {
        sal_uInt32 nLen = DragServer::GetDataLen( nItem, SOT_FORMATSTR_ID_SONLK );
        String aString;
        DragServer::PasteData( nItem, aString.AllocBuffer(
                            nLen / 2 ), nLen, SOT_FORMATSTR_ID_SONLK );

        xub_StrLen nStrFndPos = 0;
        aUrl        = aString.GetToken(0, NAVI_BOOKMARK_DELIM, nStrFndPos );
        aDescr      = aString.GetToken(0, NAVI_BOOKMARK_DELIM, nStrFndPos );
        nDefDrag    = aString.GetToken(0, NAVI_BOOKMARK_DELIM,
                                        nStrFndPos ).ToInt32();
        nDocSh      = aString.GetToken(0, NAVI_BOOKMARK_DELIM,
                                        nStrFndPos ).ToInt32();
        bRet = sal_True;
    }
    return bRet;
}

/*-----------------06.02.97 20.43-------------------

--------------------------------------------------*/

sal_Bool NaviContentBookmark::Paste( SotDataObject& rObj, sal_uInt32 nFormat )
{
    sal_Bool bRet = sal_False;

    SvData aData( nFormat, MEDIUM_ALL );
    if( rObj.GetData( &aData ) )
    {
        void *pData;
        aData.GetData( &pData, TRANSFER_REFERENCE );

        if( nFormat == SOT_FORMATSTR_ID_SONLK )
        {
            String aString((sal_Unicode*)pData);
            xub_StrLen nStrFndPos = 0;
            aUrl        = aString.GetToken(0, NAVI_BOOKMARK_DELIM, nStrFndPos );
            aDescr      = aString.GetToken(0, NAVI_BOOKMARK_DELIM, nStrFndPos );
            nDefDrag    = aString.GetToken(0, NAVI_BOOKMARK_DELIM,
                                            nStrFndPos ).ToInt32();
            nDocSh      = aString.GetToken(0, NAVI_BOOKMARK_DELIM,
                                            nStrFndPos ).ToInt32();
            bRet = sal_True;
        }
    }
    return bRet;

}

/*-----------------07.02.97 08.23-------------------

--------------------------------------------------*/

sal_uInt32  NaviContentBookmark::HasFormat( SotDataObject& rObj )
{
    return rObj.GetTypeList().Get( SOT_FORMATSTR_ID_SONLK )
                ? SOT_FORMATSTR_ID_SONLK : 0;
}

/*-----------------20.02.97 15.37-------------------

--------------------------------------------------*/
IMPL_STATIC_LINK(SwContentTree, ExecDragHdl, SwContentTree*, EMPTYARG)
{
    SwContentTree::SetInDrag(sal_True);
    DropAction eDropAction = pThis->ExecuteDrag(Pointer(POINTER_MOVEDATA), Pointer(POINTER_COPYDATA), POINTER_LINKDATA, pThis->nDragMode );
    SwContentTree::SetInDrag(sal_False);
    return 0;
}
/* -----------------------------09.12.99 13:50--------------------------------

 ---------------------------------------------------------------------------*/
class SwContentLBoxString : public SvLBoxString
{
public:
    SwContentLBoxString( SvLBoxEntry* pEntry, sal_uInt16 nFlags,
        const String& rStr ) : SvLBoxString(pEntry,nFlags,rStr) {}

    virtual void Paint( const Point& rPos, SvLBox& rDev, sal_uInt16 nFlags,
        SvLBoxEntry* pEntry);
};

/* -----------------------------09.12.99 13:49--------------------------------

 ---------------------------------------------------------------------------*/
void SwContentTree::InitEntry(SvLBoxEntry* pEntry,
        const XubString& rStr ,const Image& rImg1,const Image& rImg2)
{
    sal_uInt16 nColToHilite = 1; //0==Bitmap;1=="Spalte1";2=="Spalte2"
    SvTreeListBox::InitEntry( pEntry, rStr, rImg1, rImg2 );
    SvLBoxString* pCol = (SvLBoxString*)pEntry->GetItem( nColToHilite );
    SwContentLBoxString* pStr = new SwContentLBoxString( pEntry, 0, pCol->GetText() );
    pEntry->ReplaceItem( pStr, nColToHilite );
}
/* -----------------------------09.12.99 13:49--------------------------------

 ---------------------------------------------------------------------------*/
void SwContentLBoxString::Paint( const Point& rPos, SvLBox& rDev, sal_uInt16 nFlags,
    SvLBoxEntry* pEntry )
{
    if(lcl_IsContent(pEntry) &&
            ((SwContent *)pEntry->GetUserData())->IsInvisible())
    {
        //* pCont = (SwContent*)pEntry->GetUserData();
        Font aOldFont( rDev.GetFont());
        Font aFont(aOldFont);
        Color aCol( COL_LIGHTGRAY );
        aFont.SetColor( aCol );
        rDev.SetFont( aFont );
        rDev.DrawText( rPos, GetText() );
        rDev.SetFont( aOldFont );
    }
    else
        SvLBoxString::Paint( rPos, rDev, nFlags, pEntry);
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.161  2000/09/18 16:06:17  willem.vandorp
    OpenOffice header added.

    Revision 1.160  2000/09/08 15:11:58  os
    use configuration service

    Revision 1.159  2000/09/07 15:59:34  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.158  2000/08/17 13:46:34  jp
    UI with decode URL; integer -> string bugs fixed

    Revision 1.157  2000/07/20 13:17:38  jp
    change old txtatr-character to the two new characters

    Revision 1.156  2000/07/03 08:54:55  jp
    must changes for VCL

    Revision 1.155  2000/06/30 10:25:49  os
    #63367# keep selected position in root mode, too

    Revision 1.154  2000/06/06 09:11:51  os
    76056# CreateFromInt32

    Revision 1.153  2000/05/23 19:54:16  jp
    Bugfixes for Unicode

    Revision 1.152  2000/04/26 15:03:20  os
    GetName() returns const String&

    Revision 1.151  2000/04/18 15:14:08  os
    UNICODE

    Revision 1.150  2000/03/23 07:51:10  os
    UNO III

    Revision 1.149  2000/03/03 15:17:05  os
    StarView remainders removed

    Revision 1.148  2000/02/22 16:56:35  jp
    Bug #73303#: new IsProtectedOutlinePara

    Revision 1.147  2000/02/11 15:00:33  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.146  2000/02/01 12:41:04  os
    #72443# visibility of section must be checked in SwContentType::Init

------------------------------------------------------------------------*/

diff --git a/sw/source/ui/utlui/glbltree.cxx b/sw/source/ui/utlui/glbltree.cxx
new file mode 100644
index 0000000..fa2bb61
--- /dev/null
+++ b/sw/source/ui/utlui/glbltree.cxx
@@ -0,0 +1,1678 @@
/*************************************************************************
 *
 *  $RCSfile: glbltree.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:50 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop
#include <so3/iface.hxx>
#ifndef _SVSTDARR_HXX
#define _SVSTDARR_STRINGSDTOR
#include <svtools/svstdarr.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _SFX_FCONTNR_HXX //autogen
#include <sfx2/fcontnr.hxx>
#endif
#ifndef _SVXLINKMGR_HXX
#include <svx/linkmgr.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef SVTOOLS_URIHELPER_HXX
#include <svtools/urihelper.hxx>
#endif
#ifndef _SFXDOCFILE_HXX //autogen
#include <sfx2/docfile.hxx>
#endif
#ifndef _HELP_HXX //autogen
#include <vcl/help.hxx>
#endif
#ifndef _FILELIST_HXX //autogen
#include <so3/filelist.hxx>
#endif
#ifndef _DRAG_HXX //autogen
#include <vcl/drag.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _URLBMK_HXX //autogen
#include <svtools/urlbmk.hxx>
#endif
#ifndef _FILTER_HXX //autogen
#include <svtools/filter.hxx>
#endif


#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _ERRHDL_HXX
#include <errhdl.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _CONTENT_HXX
#include <content.hxx>
#endif
#ifndef _EDGLBLDC_HXX
#include <edglbldc.hxx>
#endif
#ifndef _SECTION_HXX
#include <section.hxx>
#endif
#ifndef _TOX_HXX
#include <tox.hxx>
#endif
#ifndef _CNTTAB_HXX
#include <cnttab.hxx>
#endif
#define NAVIPI_CXX
#ifndef _NAVIPI_HXX
#include <navipi.hxx>
#endif
#ifndef _NAVICONT_HXX
#include <navicont.hxx>
#endif
#ifndef _EDTWIN_HXX
#include <edtwin.hxx>
#endif
#ifndef _UITOOL_HXX
#include <uitool.hxx>
#endif

#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _HELPID_H
#include <helpid.h>
#endif
#ifndef _NAVIPI_HRC
#include <navipi.hrc>
#endif
#ifndef _UTLUI_HRC
#include <utlui.hrc>
#endif
#ifndef _COMCORE_HRC
#include <comcore.hrc>
#endif


// Kontextmenue fuer GlobalTree
#define CTX_INSERT_ANY_INDEX 10
//#define CTX_INSERT_CNTIDX   11
//#define CTX_INSERT_USRIDX   12
#define CTX_INSERT_FILE     11
#define CTX_INSERT_NEW_FILE 12
#define CTX_INSERT_TEXT     13

#define CTX_UPDATE_SEL      20
#define CTX_UPDATE_INDEX    21
#define CTX_UPDATE_LINK     22
#define CTX_UPDATE_ALL      23

#define CTX_UPDATE          1
#define CTX_INSERT          2
#define CTX_EDIT            3
#define CTX_DELETE          4

#define GLOBAL_UPDATE_TIMEOUT 2000

// Flags fuer PopupMenu-enable/disable
#define ENABLE_INSERT_IDX   0x0001
#define ENABLE_INSERT_FILE  0x0002
#define ENABLE_INSERT_TEXT  0x0004
#define ENABLE_EDIT         0x0008
#define ENABLE_DELETE       0x0010
#define ENABLE_UPDATE       0x0020
#define ENABLE_UPDATE_SEL   0x0040

// TabPos nach links schieben
#define  GLBL_TABPOS_SUB 5

const SfxObjectShell* SwGlobalTree::pShowShell = 0;
static const USHORT __FAR_DATA aHelpForMenu[] =
{
    0,                          //
    HID_GLBLTREE_UPDATE,        //CTX_UPDATE
    HID_GLBLTREE_INSERT,        //CTX_INSERT
    HID_GLBLTREE_EDIT,          //CTX_EDIT
    HID_GLBLTREE_DEL,           //CTX_DELETE
    0,                        //
    0,                        //
    0,                        //
    0,                        //
    0,                        //
    HID_GLBLTREE_INS_IDX,       //CTX_INSERT_ANY_INDEX
    HID_GLBLTREE_INS_FILE,      //CTX_INSERT_FILE
    HID_GLBLTREE_INS_NEW_FILE,  //CTX_INSERT_NEW_FILE
    HID_GLBLTREE_INS_TEXT,      //CTX_INSERT_TEXT
    0,                          //
    0,                          //
    0,                          //
    0,                          //
    0,                          //
    0,                          //
    HID_GLBLTREE_UPD_SEL,       //CTX_UPDATE_SEL
    HID_GLBLTREE_UPD_IDX,       //CTX_UPDATE_INDEX
    HID_GLBLTREE_UPD_LINK,      //CTX_UPDATE_LINK
    HID_GLBLTREEUPD_ALL         //CTX_UPDATE_ALL
};

/************************************************************************/
/*                                                                      */
/************************************************************************/
/* -----------------------------24.08.00 12:04--------------------------------

 ---------------------------------------------------------------------------*/
class SwGlobalFrameListener_Impl : public SfxListener
{
    BOOL bValid;
public:
    SwGlobalFrameListener_Impl(SfxViewFrame& rFrame) :
        bValid(TRUE)
        {
            StartListening(rFrame);
        }

    virtual void        Notify( SfxBroadcaster& rBC, const SfxHint& rHint );

    BOOL                IsValid() const {return bValid;}
};
/* -----------------------------24.08.00 12:05--------------------------------

 ---------------------------------------------------------------------------*/
void    SwGlobalFrameListener_Impl::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
{
    if( rHint.ISA(SfxSimpleHint) &&
            (((SfxSimpleHint&) rHint).GetId() == SFX_HINT_DYING))
        bValid = FALSE;
}

/*-----------------12.06.97 09:38-------------------

--------------------------------------------------*/
SwGlobalTree::SwGlobalTree(Window* pParent, const ResId& rResId) :
    SvTreeListBox(pParent, rResId),
    pSwGlblDocContents(0),
    pEmphasisEntry(0),
    pDDSource(0),
    pActiveShell(0),
    bIsInternalDrag(FALSE),
    bLastEntryEmphasis(FALSE),
    bIsImageListInitialized(FALSE)
{
    SetDragDropMode(SV_DRAGDROP_APP_COPY  |
                    SV_DRAGDROP_CTRL_MOVE |
                    SV_DRAGDROP_ENABLE_TOP );

    aUpdateTimer.SetTimeout(GLOBAL_UPDATE_TIMEOUT);
    aUpdateTimer.SetTimeoutHdl(LINK(this, SwGlobalTree, Timeout));
    aUpdateTimer.Start();
    for(USHORT i = 0; i < GLOBAL_CONTEXT_COUNT; i++)
    {
        aContextStrings[i] = SW_RESSTR(i+ ST_GLOBAL_CONTEXT_FIRST);
    }
    SetHelpId(HID_NAVIGATOR_GLOB_TREELIST);
    SelectHdl();
    SetDoubleClickHdl(LINK(this, SwGlobalTree, DoubleClickHdl));
}

/*-----------------12.06.97 09:38-------------------

--------------------------------------------------*/
SwGlobalTree::~SwGlobalTree()
{
    delete pSwGlblDocContents;
}

/*-----------------12.06.97 09:38-------------------

--------------------------------------------------*/
BOOL     SwGlobalTree::Drop( const DropEvent& rEvt)
{
    BOOL bRet = FALSE;
    SvLBoxEntry* pLast = (SvLBoxEntry*)LastVisible();
    if(pEmphasisEntry)
    {
        ImplShowTargetEmphasis( Prev(pEmphasisEntry), FALSE );
        pEmphasisEntry = 0;
    }
    else if(bLastEntryEmphasis && pLast)
    {
        ImplShowTargetEmphasis( pLast, FALSE);
    }


    SvLBoxEntry* pDropEntry = bLastEntryEmphasis ? 0 : GetEntry(rEvt.GetPosPixel());
    if(bIsInternalDrag)
    {
        SvLBoxEntry* pDummy = 0;
        ULONG nInsertionPos = LIST_APPEND;
        NotifyMoving(pDropEntry, pDDSource, pDummy, nInsertionPos);
    }
    else
    {
        const USHORT nCount = DragServer::GetItemCount();
        for ( USHORT i = 0; i < nCount; ++i )
        {
            String sFileName;
            const SwGlblDocContent* pCnt = pDropEntry ?
                        (const SwGlblDocContent*)pDropEntry->GetUserData() :
                                0;
            if(DragServer::HasFormat(i, FORMAT_FILE_LIST))
            {
                bRet = TRUE;
                SwGlblDocContents* pTempContents = new SwGlblDocContents;
                int nAbsContPos = pDropEntry ?
                                    (int) GetModel()->GetAbsPos(pDropEntry):
                                        - 1;
                USHORT nEntryCount = (USHORT)GetEntryCount();

                // SvData basteln
                SvData aData( FORMAT_FILE_LIST );
                SvDataObjectRef xDataObj = SvDataObject::PasteDragServer( rEvt );
                xDataObj->GetData( &aData );

                // Daten holen
                FileList aFileList;
                FileList* pFileList = &aFileList;
                aData.GetData( (SvDataCopyStream**)&pFileList, pFileList->Type() );
                for ( USHORT n = (USHORT)aFileList.Count(); n--; )
                {
                    sFileName = aFileList.GetFile(n);
                    InsertRegion(pCnt, &sFileName);
                    // nach dem Einfuegen muss die Liste der Contents neu
                    // geholt werden, um nicht auf einem alten Content zu
                    // arbeiten
                    if(n)
                    {
                        pActiveShell->GetGlobalDocContent(*pTempContents);
                        // wenn das file erfolgreich eingefuegt wurde,
                        // dann muss auch der naechste Content geholt werden
                        if(nEntryCount < pTempContents->Count())
                        {
                            nEntryCount++;
                            nAbsContPos++;
                            pCnt = pTempContents->GetObject(nAbsContPos);
                        }
                    }
                }
                delete pTempContents;
                break;
           }
           else
           {
                String sFileName(SwNavigationPI::CreateDropFileName(i));
                if(sFileName.Len())
                {
                    InsertRegion(pCnt, &sFileName);
                    bRet = TRUE;
                }
            }
        }
    }
    bLastEntryEmphasis = FALSE;
    return bRet;

}
/*-----------------12.06.97 09:38-------------------

--------------------------------------------------*/
BOOL     SwGlobalTree::QueryDrop( DropEvent& rEvt)
{
    BOOL bRet = TRUE;
    //initiate scrolling
    GetDropTarget(rEvt.GetPosPixel());
    SvLBoxEntry* pLast = (SvLBoxEntry*)LastVisible();
    if(rEvt.IsLeaveWindow())
    {
        if(pEmphasisEntry)
        {
            ImplShowTargetEmphasis( Prev(pEmphasisEntry), FALSE );
            pEmphasisEntry = 0;
        }
        else if(bLastEntryEmphasis && pLast)
        {
            ImplShowTargetEmphasis( pLast, FALSE);
        }
        bLastEntryEmphasis = FALSE;
    }
    else
    {
        SvLBoxEntry* pDropEntry = GetEntry(rEvt.GetPosPixel());
        if(bIsInternalDrag)
        {
            bRet = pDDSource != pDropEntry;
        }
        else
        {
            if (DragServer::HasFormat(0, FORMAT_FILE))
            {
                String aFileName = DragServer::PasteFile(0);
                GraphicDescriptor aDesc(aFileName);
                if (aDesc.Detect()) // keine Grafiken annehmen
                    bRet = FALSE;
                else
                    bRet = TRUE;
            }
            else if ( DragServer::HasFormat(0, FORMAT_FILE_LIST) ||
                 INetBookmark::DragServerHasFormat( 0 ) )
            {
                 bRet = TRUE;
            }
            else
                bRet = FALSE;
            rEvt.SetAction(DROP_LINK);
        }
        if(pEmphasisEntry && pEmphasisEntry != pDropEntry)
            ImplShowTargetEmphasis( Prev(pEmphasisEntry), FALSE );
        else if(pLast && bLastEntryEmphasis  && pDropEntry)
        {
            ImplShowTargetEmphasis( pLast, FALSE);
            bLastEntryEmphasis = FALSE;
        }
        if(pDropEntry)
            ImplShowTargetEmphasis( Prev(pDropEntry), bRet );
        else if(pLast)
        {
            ImplShowTargetEmphasis( pLast, bRet );
            bLastEntryEmphasis = TRUE;
        }
        pEmphasisEntry = pDropEntry;
    }
    return bRet;
}
/*-----------------12.06.97 09:38-------------------

--------------------------------------------------*/
void     SwGlobalTree::Command( const CommandEvent& rCEvt )
{
    BOOL bParent = FALSE;
    switch( rCEvt.GetCommand() )
    {
        case COMMAND_CONTEXTMENU:
        {
            if(!pActiveShell ||
                !pActiveShell->GetView().GetDocShell()->IsReadOnly())
            {
                USHORT nEnableFlags = GetEnableFlags();
                PopupMenu aPop;
                PopupMenu aSubPop1;
                PopupMenu aSubPop2;

                for (USHORT i = CTX_UPDATE_SEL; i <= CTX_UPDATE_ALL; i++)
                {
                    aSubPop2.InsertItem( i, aContextStrings[ST_UPDATE_SEL - ST_GLOBAL_CONTEXT_FIRST - CTX_UPDATE_SEL+ i] );
                    aSubPop2.SetHelpId(i, aHelpForMenu[i]);
                }
                aSubPop2.EnableItem(CTX_UPDATE_SEL, nEnableFlags&ENABLE_UPDATE_SEL);
                aSubPop2.SetSelectHdl(LINK(this, SwGlobalTree, PopupHdl));

                aSubPop1.InsertItem(CTX_INSERT_ANY_INDEX, aContextStrings[ST_INDEX  - ST_GLOBAL_CONTEXT_FIRST]);
                aSubPop1.SetHelpId(CTX_INSERT_ANY_INDEX, aHelpForMenu[CTX_INSERT_ANY_INDEX]);
                aSubPop1.InsertItem(CTX_INSERT_FILE, aContextStrings[ST_FILE   - ST_GLOBAL_CONTEXT_FIRST]);
                aSubPop1.SetHelpId(CTX_INSERT_FILE, aHelpForMenu[CTX_INSERT_FILE]);
                aSubPop1.InsertItem(CTX_INSERT_NEW_FILE, aContextStrings[ST_NEW_FILE   - ST_GLOBAL_CONTEXT_FIRST]);
                aSubPop1.SetHelpId(CTX_INSERT_NEW_FILE, aHelpForMenu[CTX_INSERT_NEW_FILE]);
                aSubPop1.InsertItem(CTX_INSERT_TEXT, aContextStrings[ST_TEXT   - ST_GLOBAL_CONTEXT_FIRST]);
                aSubPop1.SetHelpId(CTX_INSERT_TEXT, aHelpForMenu[CTX_INSERT_TEXT]);


                aPop.InsertItem(CTX_UPDATE, aContextStrings[ST_UPDATE - ST_GLOBAL_CONTEXT_FIRST]);
                aPop.SetHelpId(CTX_UPDATE, aHelpForMenu[CTX_UPDATE]);
                aPop.InsertItem(CTX_EDIT, aContextStrings[ST_EDIT_CONTENT - ST_GLOBAL_CONTEXT_FIRST]);
                aPop.SetHelpId(CTX_EDIT, aHelpForMenu[CTX_EDIT]);
                aPop.InsertItem(CTX_INSERT, aContextStrings[ST_INSERT - ST_GLOBAL_CONTEXT_FIRST]);
                aPop.SetHelpId(CTX_INSERT, aHelpForMenu[CTX_INSERT]);
                aPop.InsertSeparator() ;
                aPop.InsertItem(CTX_DELETE, aContextStrings[ST_DELETE - ST_GLOBAL_CONTEXT_FIRST]);
                aPop.SetHelpId(CTX_DELETE, aHelpForMenu[CTX_DELETE]);

                //evtl. disablen
                aSubPop1.EnableItem(CTX_INSERT_ANY_INDEX,   nEnableFlags&ENABLE_INSERT_IDX );
                aSubPop1.EnableItem(CTX_INSERT_TEXT,    nEnableFlags&ENABLE_INSERT_TEXT);
                aSubPop1.EnableItem(CTX_INSERT_FILE,    nEnableFlags&ENABLE_INSERT_FILE);
                aSubPop1.EnableItem(CTX_INSERT_NEW_FILE, nEnableFlags&ENABLE_INSERT_FILE);

                aPop.EnableItem(CTX_UPDATE,             nEnableFlags&ENABLE_UPDATE);
                aPop.EnableItem(CTX_INSERT,             nEnableFlags&ENABLE_INSERT_IDX);
                aPop.EnableItem(CTX_EDIT,               nEnableFlags&ENABLE_EDIT);
                aPop.EnableItem(CTX_DELETE,             nEnableFlags&ENABLE_DELETE);


                aPop.SetPopupMenu( CTX_INSERT, &aSubPop1 );
                aPop.SetPopupMenu( CTX_UPDATE, &aSubPop2 );
                Link aLk = LINK(this, SwGlobalTree, PopupHdl );
                aPop.SetSelectHdl(aLk);
                aSubPop1.SetSelectHdl(aLk);
                aSubPop2.SetSelectHdl(aLk);

                aPop.Execute( this, rCEvt.GetMousePosPixel());
            }
        }
        break;
        default: bParent = TRUE;
    }
    if(bParent)
        SvTreeListBox::Command(rCEvt);
}
/*-----------------16.06.97 10:41-------------------

--------------------------------------------------*/
void SwGlobalTree::TbxMenuHdl(USHORT nTbxId, ToolBox* pBox)
{
    USHORT nEnableFlags = GetEnableFlags();
    if(FN_GLOBAL_OPEN == nTbxId)
    {
        PopupMenu *pMenu = new PopupMenu;
        for (USHORT i = CTX_INSERT_ANY_INDEX; i <= CTX_INSERT_TEXT; i++)
        {
            pMenu->InsertItem( i, aContextStrings[ST_INDEX  - ST_GLOBAL_CONTEXT_FIRST - CTX_INSERT_ANY_INDEX + i] );
            pMenu->SetHelpId(i, aHelpForMenu[i] );
        }
        pMenu->EnableItem(CTX_INSERT_ANY_INDEX, nEnableFlags&ENABLE_INSERT_IDX );
//      pMenu->EnableItem(CTX_INSERT_CNTIDX,    nEnableFlags&ENABLE_INSERT_IDX );
//      pMenu->EnableItem(CTX_INSERT_USRIDX,    nEnableFlags&ENABLE_INSERT_IDX );
        pMenu->EnableItem(CTX_INSERT_TEXT,      nEnableFlags&ENABLE_INSERT_TEXT);
        pMenu->EnableItem(CTX_INSERT_FILE,      nEnableFlags&ENABLE_INSERT_FILE);
        pMenu->EnableItem(CTX_INSERT_NEW_FILE,  nEnableFlags&ENABLE_INSERT_FILE);
        pMenu->SetSelectHdl(LINK(this, SwGlobalTree, PopupHdl));
        pMenu->Execute( pBox, pBox->GetItemRect(nTbxId).BottomLeft());
        delete pMenu;
        pBox->EndSelection();
        pBox->Invalidate();
    }
    else if(FN_GLOBAL_UPDATE == nTbxId)
    {
        PopupMenu *pMenu = new PopupMenu;
        for (USHORT i = CTX_UPDATE_SEL; i <= CTX_UPDATE_ALL; i++)
        {
            pMenu->InsertItem( i, aContextStrings[ST_UPDATE_SEL - ST_GLOBAL_CONTEXT_FIRST - CTX_UPDATE_SEL+ i] );
            pMenu->SetHelpId(i, aHelpForMenu[i] );
        }
        pMenu->EnableItem(CTX_UPDATE_SEL,   nEnableFlags&ENABLE_UPDATE_SEL);
        pMenu->SetSelectHdl(LINK(this, SwGlobalTree, PopupHdl));
        pMenu->Execute( pBox, pBox->GetItemRect(nTbxId).BottomLeft());
        delete pMenu;
        pBox->EndSelection();
        pBox->Invalidate();
    }
}
/*-----------------16.06.97 11:02-------------------

--------------------------------------------------*/
USHORT  SwGlobalTree::GetEnableFlags() const
{
    SvLBoxEntry* pEntry = FirstSelected();
    USHORT nSelCount = (USHORT)GetSelectionCount();
    USHORT nEntryCount = (USHORT)GetEntryCount();
    SvLBoxEntry* pPrevEntry = pEntry ? Prev(pEntry) : 0;

    USHORT nRet = 0;
    if(nSelCount == 1 || !nEntryCount)
        nRet |= ENABLE_INSERT_IDX|ENABLE_INSERT_FILE;
    if(nSelCount == 1)
    {
        nRet |= ENABLE_EDIT;
        if( ((SwGlblDocContent*)pEntry->GetUserData())->GetType() != GLBLDOC_UNKNOWN &&
                    (!pPrevEntry || ((SwGlblDocContent*)pPrevEntry->GetUserData())->GetType() != GLBLDOC_UNKNOWN))
            nRet |= ENABLE_INSERT_TEXT;
    }
    else if(!nEntryCount)
    {
        nRet |= ENABLE_INSERT_TEXT;
    }
    if(nEntryCount)
        nRet |= ENABLE_UPDATE|ENABLE_DELETE;
    if(nSelCount)
        nRet |= ENABLE_UPDATE_SEL;
    return nRet;
}

/*-----------------12.06.97 09:38-------------------

--------------------------------------------------*/
void     SwGlobalTree::RequestHelp( const HelpEvent& rHEvt )
{
    BOOL bParent = TRUE;
    Update(TRUE);
    Display(TRUE);
    if( rHEvt.GetMode() & HELPMODE_QUICK )
    {
        Point aPos( ScreenToOutputPixel( rHEvt.GetMousePosPixel() ));
        SvLBoxEntry* pEntry = GetEntry( aPos );
        const SwGlblDocContent* pCont = pEntry ?
                            (const SwGlblDocContent*)pEntry->GetUserData() : 0;
        if( pCont &&  GLBLDOC_SECTION == pCont->GetType())
        {
            bParent = FALSE;
            SvLBoxTab* pTab;
            SvLBoxItem* pItem = GetItem( pEntry, aPos.X(), &pTab );
            if(pItem && SV_ITEM_ID_LBOXSTRING == pItem->IsA())
            {
                const SwSection* pSect = pCont->GetSection();
                String sEntry = pSect->GetLinkFileName().GetToken(0, cTokenSeperator);
                if(!pSect->IsConnectFlag())
                    sEntry.Insert(aContextStrings[ST_BROKEN_LINK - ST_GLOBAL_CONTEXT_FIRST], 0 );
                Point aPos = GetEntryPos( pEntry );

                aPos.X() = GetTabPos( pEntry, pTab );
                Size aSize( pItem->GetSize( this, pEntry ) );

                if((aPos.X() + aSize.Width()) > GetSizePixel().Width())
                    aSize.Width() = GetSizePixel().Width() - aPos.X();

                aPos = OutputToScreenPixel(aPos);
                Rectangle aItemRect( aPos, aSize );
                if(Help::IsBalloonHelpEnabled())
                {
                    aPos.X() += aSize.Width();
                    Help::ShowBalloon( this, aPos, aItemRect, sEntry );
                }
                else
                    Help::ShowQuickHelp( this, aItemRect, sEntry,
                        QUICKHELP_LEFT|QUICKHELP_VCENTER );
            }
        }
    }

    if(bParent)
        SvTreeListBox::RequestHelp(rHEvt);
}
/*-----------------16.06.97 16:15-------------------

--------------------------------------------------*/
void     SwGlobalTree::SelectHdl()
{

    USHORT nSelCount = (USHORT)GetSelectionCount();
    SvLBoxEntry* pSel = FirstSelected();
    USHORT nAbsPos = pSel ? (USHORT)GetModel()->GetAbsPos(pSel) : 0;
    SwNavigationPI* pNavi = GetParentWindow();
    BOOL bReadonly = !pActiveShell ||
                pActiveShell->GetView().GetDocShell()->IsReadOnly();
    pNavi->aGlobalToolBox.EnableItem(FN_GLOBAL_EDIT,  nSelCount == 1 && !bReadonly);
    pNavi->aGlobalToolBox.EnableItem(FN_GLOBAL_OPEN,  nSelCount <= 1 && !bReadonly);
    pNavi->aGlobalToolBox.EnableItem(FN_GLOBAL_UPDATE,  GetEntryCount() > 0 && !bReadonly);
    pNavi->aGlobalToolBox.EnableItem(FN_ITEM_UP,
                    nSelCount == 1 && nAbsPos && !bReadonly);
    pNavi->aGlobalToolBox.EnableItem(FN_ITEM_DOWN,
                    nSelCount == 1 && nAbsPos < ((USHORT)GetEntryCount()) - 1 && !bReadonly);

}
/*-----------------16.06.97 16:15-------------------

--------------------------------------------------*/
void     SwGlobalTree::DeselectHdl()
{
    SelectHdl();
}

/*-----------------17.06.97 13:11-------------------

--------------------------------------------------*/
DragDropMode     SwGlobalTree::NotifyBeginDrag( SvLBoxEntry* pEntry)
{
    pDDSource = pEntry;
    return SV_DRAGDROP_CTRL_MOVE;
}

/*-----------------21.06.97 12:44-------------------

--------------------------------------------------*/
long     SwGlobalTree::GetTabPos( SvLBoxEntry*, SvLBoxTab* pTab)
{
    return pTab->GetPos() - GLBL_TABPOS_SUB;
}

/*-----------------12.06.97 09:38-------------------

--------------------------------------------------*/
BOOL     SwGlobalTree::NotifyMoving(   SvLBoxEntry*  pTarget,
                                        SvLBoxEntry*  pSource,
                                        SvLBoxEntry*&,
                                        ULONG&
                                    )
{
    SvTreeList* pModel = GetModel();
    USHORT nSource = (USHORT) pModel->GetAbsPos(pSource);
    USHORT nDest   = pTarget ? (USHORT) pModel->GetAbsPos(pTarget) : pSwGlblDocContents->Count();

    if( pActiveShell->MoveGlobalDocContent(
            *pSwGlblDocContents, nSource, nSource + 1, nDest ) &&
            Update())
        Display();
    return FALSE;
}
/*-----------------12.06.97 09:39-------------------

--------------------------------------------------*/
BOOL     SwGlobalTree::NotifyCopying(  SvLBoxEntry*  pTarget,
                                        SvLBoxEntry*  pEntry,
                                        SvLBoxEntry*& rpNewParent,
                                        ULONG&        rNewChildPos
                                    )
{
    return FALSE;
}
/*-----------------12.06.97 09:39-------------------

--------------------------------------------------*/
BOOL     SwGlobalTree::NotifyQueryDrop( SvLBoxEntry* pEntry)
{
    return pEntry != 0;
}
/*-----------------12.06.97 09:39-------------------

--------------------------------------------------*/
void     SwGlobalTree::BeginDrag( const Point& rPt)
{
    bIsInternalDrag = TRUE;
    if(GetSelectionCount() == 1)
        SvTreeListBox::BeginDrag(rPt);
}
/*-----------------12.06.97 09:39-------------------

--------------------------------------------------*/
void     SwGlobalTree::EndDrag()
{
    bIsInternalDrag = FALSE;
}

/***************************************************************************
    Beschreibung:   Wird ein Ctrl+DoubleClick in einen freien Bereich ausgefuehrt,
 *                  dann soll die Basisfunktion des Controls gerufen werden
***************************************************************************/
void  SwGlobalTree::MouseButtonDown( const MouseEvent& rMEvt )
{
    Point aPos( rMEvt.GetPosPixel());
    SvLBoxEntry* pEntry = GetEntry( aPos, TRUE );
    if( !pEntry && rMEvt.IsLeft() && rMEvt.IsMod1() && (rMEvt.GetClicks() % 2) == 0)
        Control::MouseButtonDown( rMEvt );
    else
        SvTreeListBox::MouseButtonDown( rMEvt );
}

/*-----------------12.06.97 13:08-------------------

--------------------------------------------------*/
void     SwGlobalTree::GetFocus()
{
    if(Update())
        Display();
    SvTreeListBox::GetFocus();
}

/*-----------------12.06.97 12:34-------------------

--------------------------------------------------*/
void     SwGlobalTree::KeyInput(const KeyEvent& rKEvt)
{
    const KeyCode aCode = rKEvt.GetKeyCode();
    if(aCode.GetCode() == KEY_RETURN)
    {
        switch(aCode.GetModifier())
        {
            case KEY_MOD2:
                // Boxen umschalten
                GetParentWindow()->ToggleTree();
            break;
        }
    }
    else
        SvTreeListBox::KeyInput(rKEvt);
}

/*-----------------17.06.97 11:59-------------------

--------------------------------------------------*/
void SwGlobalTree::Clear()
{
    pEmphasisEntry = 0;
    SvTreeListBox::Clear();
}
/*-----------------12.06.97 12:38-------------------

--------------------------------------------------*/
void    SwGlobalTree::Display(BOOL bOnlyUpdateUserData)
{
    if(!bIsImageListInitialized)
    {
        aEntryImages = ImageList(SW_RES(IMG_NAVI_ENTRYBMP));
        bIsImageListInitialized = TRUE;
    }
    USHORT nCount = pSwGlblDocContents->Count();
    if(bOnlyUpdateUserData && GetEntryCount() == pSwGlblDocContents->Count())
    {
        SvLBoxEntry* pEntry = First();
        for( USHORT i = 0; i < nCount; i++)
        {
            SwGlblDocContentPtr pCont = pSwGlblDocContents->GetObject(i);
            pEntry->SetUserData(pCont);
            pEntry = Next(pEntry);
        }
    }
    else
    {
        SetUpdateMode( FALSE );
        SvLBoxEntry* pOldSelEntry = FirstSelected();
        String sEntryName;  // Name des Eintrags
        USHORT nSelPos = USHRT_MAX;
        if(pOldSelEntry)
        {
            sEntryName = GetEntryText(pOldSelEntry);
            nSelPos = (USHORT)GetModel()->GetAbsPos(pOldSelEntry);
        }
        Clear();
        if(!pSwGlblDocContents)
            Update();

        SvLBoxEntry* pSelEntry = 0;
        for( USHORT i = 0; i < nCount; i++)
        {
            SwGlblDocContentPtr pCont = pSwGlblDocContents->GetObject(i);
            String sEntry;
            Image aImage;
            switch( pCont->GetType()  )
            {
                case GLBLDOC_UNKNOWN:
                {
                    sEntry = aContextStrings[ST_TEXT   - ST_GLOBAL_CONTEXT_FIRST];
                    aImage = aEntryImages.GetImage(SID_SW_START + GLOBAL_CONTENT_TEXT);
                }
                break;
                case GLBLDOC_TOXBASE:
                {
                    const SwTOXBase* pBase = pCont->GetTOX();
                    sEntry = pBase->GetTitle();
                    aImage = aEntryImages.GetImage(SID_SW_START + CONTENT_TYPE_INDEX);
                }
                break;
                case GLBLDOC_SECTION:
                {
                    const SwSection* pSect = pCont->GetSection();
                    sEntry = pSect->GetName();
                    aImage = aEntryImages.GetImage(SID_SW_START + CONTENT_TYPE_REGION);
                }
                break;
            }
            SvLBoxEntry* pEntry = InsertEntry(sEntry, aImage, aImage,
                        0, FALSE, LIST_APPEND, pCont);
            if(sEntry == sEntryName)
            {
                pSelEntry = pEntry;
            }
        }
        if(pSelEntry)
        {
            Select(pSelEntry);
        }
        else if(nSelPos != USHRT_MAX && nSelPos < nCount)
        {
            Select(GetEntry(nSelPos));
        }
        else if(nCount)
            Select(First());
        else
            SelectHdl();
        SetUpdateMode( TRUE );
    }
}

/*-----------------13.06.97 10:32-------------------

--------------------------------------------------*/
void SwGlobalTree::InsertRegion( const SwGlblDocContent* pCont,
                                const String* pFileName )
{
    String sFileName;
    SwView *pView = ::GetActiveView();
    SwWrtShell &rSh = pView->GetWrtShell();
    String sFilePassword;
    if(!pFileName)
    {
        String sFilterName;
        if( GetFileFilterNameDlg( *this, sFileName, &sFilePassword, &sFilterName ))
        {
            sFileName += cTokenSeperator;
            sFileName += sFilterName;
            sFileName += cTokenSeperator;
        }
    }
    else if(pFileName->Len())
    {
        sFileName = URIHelper::SmartRelToAbs( *pFileName );
    }

    if(sFileName.Len())
    {
        INetURLObject aFileUrl(sFileName);
        String sSectionName(aFileUrl.GetLastName().GetToken(0, cTokenSeperator));
        USHORT nSectCount = rSh.GetSectionFmtCount();
        String sTempSectionName(sSectionName);
        USHORT nAddNumber = 0;
        USHORT nCount = 0;
        // evtl : und Index anhaengen, wenn der Bereichsname schon vergeben ist
        while(nCount < nSectCount)
        {
            const SwSectionFmt& rFmt = rSh.GetSectionFmt(nCount);
            if( rFmt.GetSection()->GetName() == sTempSectionName &&
                    rFmt.IsInNodesArr())
            {
                nCount = 0;
                nAddNumber++;
                sTempSectionName = sSectionName;
                sTempSectionName += ':';
                sTempSectionName += String::CreateFromInt32( nAddNumber );
            }
            else
                nCount++;
        }
        if(nAddNumber)
                sSectionName = sTempSectionName;

        SwSection   aSection(CONTENT_SECTION, sSectionName);
        aSection.SetProtect(TRUE);
        aSection.SetHidden(FALSE);

        aSection.SetLinkFileName(sFileName);
        aSection.SetType( FILE_LINK_SECTION);
        aSection.SetLinkFilePassWd( sFilePassword );

        if(pCont)
            rSh.InsertGlobalDocContent( *pCont, aSection );
        else
        {
            SvLBoxEntry* pLast = (SvLBoxEntry*)LastVisible();
            rSh.StartAction();
            rSh.InsertGlobalDocContent( *(SwGlblDocContent*)pLast->GetUserData(),
                                        aSection );
            Update();
            USHORT nEntryCount = (USHORT)GetEntryCount();
            if( rSh.MoveGlobalDocContent(
                *pSwGlblDocContents, nEntryCount, nEntryCount + 1, nEntryCount - 1) &&
                Update())
            rSh.EndAction();
            Display();

        }
    }
}

/*-----------------18.06.97 12:42-------------------

--------------------------------------------------*/
void    SwGlobalTree::EditContent(const SwGlblDocContent* pCont )
{
    USHORT nSlot = 0;
    switch( pCont->GetType() )
    {
        case GLBLDOC_UNKNOWN:
            pActiveShell->GetView().GetEditWin().GrabFocus();
        break;
        case GLBLDOC_TOXBASE:
        {
            const SwTOXBase* pBase = pCont->GetTOX();
            if(pBase)
                nSlot = FN_INSERT_MULTI_TOX;
        }
        break;
        case GLBLDOC_SECTION:
        {
            OpenDoc(pCont);

            nSlot = 0;
            pCont = 0;
        }
        break;
    }
    if(pCont)
        GotoContent(pCont);
    if(nSlot)
    {
        pActiveShell->GetView().GetViewFrame()->GetDispatcher()->Execute(nSlot);
        if(Update())
            Display();
    }
}

/*-----------------13.06.97 14:22-------------------

--------------------------------------------------*/
IMPL_LINK( SwGlobalTree, PopupHdl, Menu* , pMenu)
{
    USHORT nId = pMenu->GetCurItemId();
    SvLBoxEntry* pEntry = FirstSelected();
    SwGlblDocContent* pCont = pEntry ? (SwGlblDocContent*)pEntry->GetUserData() : 0;
    // wird waehrend des Dialogs ein RequestHelp gerufen,
    // dann geht der Content verloren. Deshalb wird hier eine
    // Kopie angelegt, in der nur die DocPos richtig gesetzt ist.
    SwGlblDocContent* pContCopy = 0;
    if(pCont)
        pContCopy = new SwGlblDocContent(pCont->GetDocPos());
    SfxDispatcher& rDispatch = *pActiveShell->GetView().GetViewFrame()->GetDispatcher();
    USHORT nSlot = 0;;
    switch( nId )
    {
        case CTX_UPDATE_SEL:
        {
            // zwei Durchlaeufe: zuerst die Bereiche, dann die Verzeichnisse
            // aktualisieren
            SvLBoxEntry* pEntry = FirstSelected();
            while( pEntry )
            {
                SwGlblDocContent* pCont = (SwGlblDocContent*)pEntry->GetUserData();
                if(GLBLDOC_SECTION == pCont->GetType() &&
                    pCont->GetSection()->IsConnected())
                {
                    ((SwSection*)pCont->GetSection())->UpdateNow();
                }

                pEntry = NextSelected(pEntry);
            }
            pEntry = FirstSelected();
            while( pEntry )
            {
                SwGlblDocContent* pCont = (SwGlblDocContent*)pEntry->GetUserData();
                if(GLBLDOC_TOXBASE == pCont->GetType())
                    pActiveShell->UpdateTableOf(*pCont->GetTOX());
                pEntry = NextSelected(pEntry);
            }

        }
        break;
        case CTX_UPDATE_INDEX:
        {
            nSlot = FN_UPDATE_TOX;
        }
        break;
        case CTX_UPDATE_LINK:
        case CTX_UPDATE_ALL:
        {
            pActiveShell->GetLinkManager().UpdateAllLinks(TRUE);
            if(CTX_UPDATE_ALL == nId)
                nSlot = FN_UPDATE_TOX;
            pCont = 0;
        }
        break;
        case CTX_EDIT:
        {
            DBG_ASSERT(pCont, "Edit ohne Entry ? " )
            EditContent(pCont);
        }
        break;
        case CTX_DELETE:
        {
            // sind mehrere Eintraege selektiert, dann muss nach jedem delete
            // das Array neu gefuellt werden. Damit man sich nichts merken muss,
            // beginnt das Loeschen am Ende
            SvLBoxEntry* pEntry = LastSelected();
            SwGlblDocContents* pTempContents  = 0;
            pActiveShell->StartAction();
            while(pEntry)
            {
                pActiveShell->DeleteGlobalDocContent(
                    pTempContents ? *pTempContents : *pSwGlblDocContents,
                                     (USHORT)GetModel()->GetAbsPos(pEntry));
                pEntry = PrevSelected(pEntry);
                if(pEntry)
                {
                    pTempContents = new SwGlblDocContents;
                    pActiveShell->GetGlobalDocContent(*pTempContents);
                }
            }
            delete pTempContents;
            pActiveShell->EndAction();
            pCont = 0;
        }
        break;
        case CTX_INSERT_ANY_INDEX:
//      case CTX_INSERT_CNTIDX:
//      case CTX_INSERT_USRIDX:
        {
            if(pContCopy)
            {
                SfxItemSet aSet(pActiveShell->GetView().GetPool(),
                            RES_COL, RES_COL,
                            RES_BACKGROUND, RES_BACKGROUND,
                            RES_FRM_SIZE, RES_FRM_SIZE,
                            SID_ATTR_PAGE_SIZE, SID_ATTR_PAGE_SIZE,
                            RES_LR_SPACE, RES_LR_SPACE,
                            FN_PARAM_TOX_TYPE, FN_PARAM_TOX_TYPE,
                            0);

                SwMultiTOXTabDialog* pDlg = new SwMultiTOXTabDialog(this, aSet,
                        *pActiveShell,
                        0,
                        USHRT_MAX,
                        TRUE);

                if(RET_OK == pDlg->Execute())
                {
                    SwTOXDescription&  rDesc = pDlg->GetTOXDescription(
                                                pDlg->GetCurrentTOXType());
                    SwForm* pForm = pDlg->GetForm(pDlg->GetCurrentTOXType());
                    SwTOXMgr aMgr(pActiveShell);
                    SwTOXBase* pToInsert = 0;
                    if(aMgr.UpdateOrInsertTOX(rDesc, &pToInsert, pDlg->GetOutputItemSet()))
                        pActiveShell->InsertGlobalDocContent( *pContCopy, *pToInsert );
                }
                pCont = 0;
                delete pDlg;
            }
        }
        break;
        case CTX_INSERT_FILE:
        {
            InsertRegion(pContCopy);
            pCont = 0;
        }
        break;
        case CTX_INSERT_NEW_FILE:
        {
            SfxViewFrame* pGlobFrm = pActiveShell->GetView().GetViewFrame();
            SwGlobalFrameListener_Impl aFrmListener(*pGlobFrm);

            USHORT nEntryPos = pEntry ? GetModel()->GetAbsPos(pEntry) : USHRT_MAX;
            // neues Dok anlegen
            SfxStringItem aFactory(SID_NEWDOCDIRECT,
                            SwDocShell::Factory().GetFilterContainer()->GetName());

             const SfxFrameItem* pItem = (SfxFrameItem*)
                            rDispatch.Execute(SID_NEWDOCDIRECT,
                                SFX_CALLMODE_SYNCHRON, &aFactory, 0L);

            // sichern unter
            SfxFrame* pFrm = pItem ? pItem->GetFrame() : 0;
            SfxViewFrame* pFrame = pFrm ? pFrm->GetCurrentViewFrame() : 0;
            if( pFrame )
            {
                const SfxBoolItem* pBool = (const SfxBoolItem*)
                        pFrame->GetDispatcher()->Execute(
                                SID_SAVEASDOC, SFX_CALLMODE_SYNCHRON );
                SfxObjectShell& rObj = *pFrame->GetObjectShell();
                const SfxMedium* pMedium = rObj.GetMedium();
                String sNewFile(pMedium->GetURLObject().GetMainURL());
                // Bereich mit dem Dok-Namen einfgen
                // eigenes Dok in den Vordergrund

                if(aFrmListener.IsValid())
                {
                    pGlobFrm->ToTop();
                    // durch das Update sind die Eintraege invalid
                    if(nEntryPos != USHRT_MAX)
                    {
                        Update();
                        Display();
                        Select(GetModel()->GetEntryAtAbsPos(nEntryPos));
                        pEntry = FirstSelected();
                        pCont = pEntry ? (SwGlblDocContent*)pEntry->GetUserData() : 0;
                    }
                    else
                    {
                        pEntry = 0;
                        pCont = 0;
                    }
                    if(pBool->GetValue())
                    {
                        InsertRegion(pCont, &sNewFile);
                        pFrame->ToTop();
                    }
                    else
                        pFrame->GetDispatcher()->Execute(SID_CLOSEWIN,
                                                SFX_CALLMODE_SYNCHRON);
                }
                else
                {
                    pFrame->ToTop();
                    return TRUE;
                }
            }
        }
        break;
        case CTX_INSERT_TEXT:
        {
            if(pCont)
                pActiveShell->InsertGlobalDocContent(*pCont);
            else
            {
                pActiveShell->SplitNode(); // leeres Dokument
                pActiveShell->Up();
            }
            pActiveShell->GetView().GetEditWin().GrabFocus();
        }
        break;
        case CTX_UPDATE:
            pCont = 0;
        break;
        default:;
        // hier passiert nichts
    }
    if(pCont)
        GotoContent(pCont);
    if(nSlot)
        rDispatch.Execute(nSlot);
    if(Update())
        Display();
    delete pContCopy;
    return TRUE;
}

/*-----------------16.06.97 07:57-------------------

--------------------------------------------------*/
IMPL_LINK( SwGlobalTree, Timeout, Timer*, EMPTYARG )
{
    if(!HasFocus()&&Update())
        Display();
    return 0;
}

/*-----------------13.06.97 16:56-------------------

--------------------------------------------------*/
void SwGlobalTree::GotoContent(const SwGlblDocContent* pCont)
{
    pActiveShell->EnterStdMode();

    switch( pCont->GetType()  )
    {
        case GLBLDOC_UNKNOWN:
            pActiveShell->GotoGlobalDocContent(*pCont);
        break;
        case GLBLDOC_TOXBASE:
        {
            String sName = pCont->GetTOX()->GetTOXName();
            if (!pActiveShell->GotoNextTOXBase(&sName))
                pActiveShell->GotoPrevTOXBase(&sName);
        }
        break;
        case GLBLDOC_SECTION:
        break;
    }

}
/*-----------------16.06.97 07:42-------------------

--------------------------------------------------*/
void    SwGlobalTree::Show()
{
    aUpdateTimer.Start();
    SvTreeListBox::Show();
}
/*-----------------16.06.97 07:42-------------------

--------------------------------------------------*/
void    SwGlobalTree::Hide()
{
    aUpdateTimer.Stop();
    SvTreeListBox::Hide();
}
/*-----------------18.06.97 10:02-------------------

--------------------------------------------------*/
void    SwGlobalTree::ExecCommand(USHORT nCmd)
{
    SvLBoxEntry* pEntry = FirstSelected();
    DBG_ASSERT(pEntry, "gleich knalltïs")
    if(FN_GLOBAL_EDIT == nCmd)
    {
        const SwGlblDocContent* pCont = (const SwGlblDocContent*)
                                                pEntry->GetUserData();
        EditContent(pCont);
    }
    else
    {
        if(GetSelectionCount() == 1)
        {
            BOOL bMove = FALSE;
            USHORT nSource = (USHORT)GetModel()->GetAbsPos(pEntry);
            USHORT nDest = nSource;
            switch(nCmd)
            {
                case FN_ITEM_DOWN:
                {
                    USHORT nEntryCount = (USHORT)GetEntryCount();
                    bMove = nEntryCount > nSource + 1;
                    nDest+= 2;
                }
                break;
                case FN_ITEM_UP:
                {
                    if(nSource)
                        bMove = 0 != nSource;
                    nDest--;
                }
                break;
            }
            if( bMove && pActiveShell->MoveGlobalDocContent(
                *pSwGlblDocContents, nSource, nSource + 1, nDest ) &&
                    Update())
                Display();
        }
    }
}

/*-----------------16.06.97 07:43-------------------

--------------------------------------------------*/
BOOL    SwGlobalTree::Update(BOOL bHard)
{
    SwView* pActView = ::GetActiveView();
    BOOL bRet = FALSE;
    if(pActView)
    {
        const SwWrtShell* pOldShell = pActiveShell;
        pActiveShell = pActView->GetWrtShellPtr();
        if(pActiveShell != pOldShell)
            bRet = TRUE;
        if(!pSwGlblDocContents)
        {
            pSwGlblDocContents = new SwGlblDocContents;
            bRet = TRUE;
            pActiveShell->GetGlobalDocContent(*pSwGlblDocContents);
        }
        else
        {
            BOOL bCopy = FALSE;
            SwGlblDocContents* pTempContents  = new SwGlblDocContents;
            pActiveShell->GetGlobalDocContent(*pTempContents);
            if(pTempContents->Count() != pSwGlblDocContents->Count() ||
                    pTempContents->Count() != GetEntryCount())
            {
                bRet = TRUE;
                bCopy = TRUE;
            }
            else
            {
                for(USHORT i = 0; i < pTempContents->Count() && !bCopy; i++)
                {
                    SwGlblDocContent* pLeft = pTempContents->GetObject(i);
                    SwGlblDocContent* pRight = pSwGlblDocContents->GetObject(i);
                    GlobalDocContentType eType = pLeft->GetType();
                    SvLBoxEntry* pEntry = GetEntry(i);
                    String sTemp = GetEntryText(pEntry);
                    if(eType != pRight->GetType() ||
                        eType == GLBLDOC_SECTION &&
                            pLeft->GetSection()->GetName() != sTemp ||
                        eType == GLBLDOC_TOXBASE && pLeft->GetTOX()->GetTitle() != sTemp)
                            bCopy = bRet = TRUE;
                }
            }
            if(bCopy || bHard)
            {
                pSwGlblDocContents->DeleteAndDestroy(0, pSwGlblDocContents->Count());
                for(USHORT i = 0; i < pTempContents->Count(); i++)
                {
                    pSwGlblDocContents->Insert(pTempContents->GetObject(i));
                }
                for(i = pTempContents->Count(); i; i--)
                    pTempContents->Remove(i - 1);

            }
            delete pTempContents;
        }

    }
    else
    {
        Clear();
        if(pSwGlblDocContents)
            pSwGlblDocContents->DeleteAndDestroy(0, pSwGlblDocContents->Count());
    }
    // hier muss noch eine Veraenderungspruefung rein!
    return bRet;
}

/*-----------------25.06.97 16:20-------------------

--------------------------------------------------*/
void SwGlobalTree::OpenDoc(const SwGlblDocContent* pCont)
{
    String sFileName(pCont->GetSection()->GetLinkFileName().GetToken(0, cTokenSeperator));
    BOOL bFound = FALSE;
    const SfxObjectShell* pCurr = SfxObjectShell::GetFirst();
    while( !bFound && pCurr )
    {
        if(pCurr->GetMedium() &&
            pCurr->GetMedium()->GetURLObject().GetMainURL() == sFileName)
        {
            bFound = TRUE;
            SwGlobalTree::SetShowShell(pCurr);
            Application::PostUserEvent( STATIC_LINK(
                        this, SwGlobalTree, ShowFrameHdl ) );
            pCurr = 0;
        }
        else
            pCurr = SfxObjectShell::GetNext(*pCurr);
    }
    if(!bFound)
    {
        SfxStringItem aURL(SID_FILE_NAME,
            sFileName);
        SfxBoolItem aReadOnly(SID_DOC_READONLY, FALSE);
        SfxStringItem aReferer(SID_REFERER, pActiveShell->GetView().GetDocShell()->GetTitle());
        pActiveShell->GetView().GetViewFrame()->GetDispatcher()->
                Execute(SID_OPENDOC, SFX_CALLMODE_ASYNCHRON,
                            &aURL, &aReadOnly, &aReferer, 0);
    }
}

/*-----------------25.06.97 16:08-------------------

--------------------------------------------------*/
IMPL_LINK(  SwGlobalTree, DoubleClickHdl, SwGlobalTree *, EMPTYARG )
{
    SvLBoxEntry* pEntry = GetCurEntry();
    SwGlblDocContent* pCont = (SwGlblDocContent*)pEntry->GetUserData();
    if(pCont->GetType() == GLBLDOC_SECTION)
        OpenDoc(pCont);
    else
    {
        GotoContent(pCont);
        pActiveShell->GetView().GetEditWin().GrabFocus();
    }
    return 0;
}

/*-----------------07.10.97 08:09-------------------

--------------------------------------------------*/
IMPL_STATIC_LINK(SwGlobalTree, ShowFrameHdl, SwGlobalTree*, EMPTYARG)
{
    if(SwGlobalTree::GetShowShell())
        SfxViewFrame::GetFirst(SwGlobalTree::GetShowShell())->ToTop();
    SwGlobalTree::SetShowShell(0);
    return 0;
}
/* -----------------04.11.98 10:43-------------------
 *
 * --------------------------------------------------*/
void SwGlobalTree::InitEntry(SvLBoxEntry* pEntry,
        const XubString& rStr ,const Image& rImg1,const Image& rImg2)
{
    USHORT nColToHilite = 1; //0==Bitmap;1=="Spalte1";2=="Spalte2"
    SvTreeListBox::InitEntry( pEntry, rStr, rImg1, rImg2 );
    SvLBoxString* pCol = (SvLBoxString*)pEntry->GetItem( nColToHilite );
    SwLBoxString* pStr = new SwLBoxString( pEntry, 0, pCol->GetText() );
    pEntry->ReplaceItem( pStr, nColToHilite );
}
/* -----------------04.11.98 10:39-------------------
 *
 * --------------------------------------------------*/

void SwLBoxString::Paint( const Point& rPos, SvLBox& rDev, USHORT nFlags,
    SvLBoxEntry* pEntry )
{
    SwGlblDocContent* pCont = (SwGlblDocContent*)pEntry->GetUserData();
    const SwSection* pSect;
    if(pCont->GetType() == GLBLDOC_SECTION &&
        !(pSect = pCont->GetSection())->IsConnectFlag() )
    {
        Font aOldFont( rDev.GetFont());
        Font aFont(aOldFont);
        Color aCol( COL_LIGHTRED );
        aFont.SetColor( aCol );
        rDev.SetFont( aFont );
        rDev.DrawText( rPos, GetText() );
        rDev.SetFont( aOldFont );
    }
    else
        SvLBoxString::Paint( rPos, rDev, nFlags, pEntry);
}
/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.57  2000/09/18 16:06:17  willem.vandorp
    OpenOffice header added.

    Revision 1.56  2000/09/07 15:59:35  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.55  2000/09/06 09:57:09  os
    #78501# force scrolling in QueryDrop

    Revision 1.54  2000/08/24 10:42:23  os
    #78054# survive closing of master document while SaveAs dialog is active

    Revision 1.53  2000/07/03 08:54:59  jp
    must changes for VCL

    Revision 1.52  2000/06/26 13:12:59  os
    INetURLObject::SmartRelToAbs removed

    Revision 1.51  2000/05/23 19:54:20  jp
    Bugfixes for Unicode

    Revision 1.50  2000/03/23 14:59:30  os
    #74356# goto index: use name - not title

    Revision 1.49  2000/03/03 15:17:05  os
    StarView remainders removed

    Revision 1.48  2000/02/29 11:05:46  os
    #73599# PullDownMenu: Ids/HelpIds corrected

    Revision 1.47  2000/02/15 10:33:10  os
    #72902# diable navigator in readonly documents

    Revision 1.46  2000/02/11 15:00:36  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.45  2000/02/07 14:39:11  os
    #72747# insert index into global documents

    Revision 1.44  1999/12/09 12:29:12  os
    #70284# show Bitmaps in hyperlink insert dialog# content.cxx glbltree.cxx navipi.hrc navipi.src

    Revision 1.43  1999/09/10 08:36:15  os
    GetTOXDescription with TOXTypes param

    Revision 1.42  1999/08/25 13:24:42  OS
    use SwMultiTOXTabDialog


      Rev 1.41   25 Aug 1999 15:24:42   OS
   use SwMultiTOXTabDialog

      Rev 1.40   20 May 1999 11:02:24   OS
   Ctrl-DoubleClick an Control weiterleiten - Docking

      Rev 1.39   21 Apr 1999 09:42:58   OS
   #65050# GPF im Update ohne View behoben

      Rev 1.38   29 Mar 1999 12:23:38   OS
   #63929# neuer Verzeichnisdialog vollstaendig

      Rev 1.37   12 Nov 1998 15:07:26   JP
   Bug #54342#: auch bei GlobalDocs das Filepasswort an die Section uebertragen

      Rev 1.36   12 Nov 1998 14:27:20   OS
   #59271# Referer mitschicken

      Rev 1.35   04 Nov 1998 13:22:18   OS
   #58673# Existenzanzeige der Teildokumente farbig

      Rev 1.34   03 Nov 1998 14:39:22   OS
   #58673# Existenzanzeige fuer Global-Teildokumente

      Rev 1.33   02 Jul 1998 16:57:08   OM
   #46638# Keine Grafiken auf Navigator droppen

      Rev 1.32   29 Jun 1998 17:52:42   TJ
   include

      Rev 1.31   31 Mar 1998 15:30:44   OS
   SetReadonlyUI von IsAllProtect abhaengig #49077#

      Rev 1.30   13 Feb 1998 14:16:36   JP
   statt selbst den InserDocDialog zu rufen, die neue Funktion GetFileFilterNameDlg rufen

      Rev 1.29   23 Jan 1998 16:05:48   MA
   includes

      Rev 1.28   16 Jan 1998 14:18:46   OS
   #46660# Text im QueryDrop ablehnen; #46636# nach Doppelclick Focus ins Doc

      Rev 1.27   16 Jan 1998 11:03:06   OS
    #46637# per DnD auch am Ende einfuegen
   #46631# HTML nicht-readonly oeffnen

      Rev 1.26   19 Dec 1997 09:06:50   OS
   Change: UsrData im InsertEntry uebergben

      Rev 1.25   21 Nov 1997 12:10:14   MA
   includes

      Rev 1.24   03 Nov 1997 13:59:24   MA
   precomp entfernt

      Rev 1.23   07 Oct 1997 08:36:32   OS
   asynchrones Anzeigen der Dokumente, damit auch nicht-SW-Docs 'verknuepft' werden koennen #44346#

      Rev 1.22   04 Sep 1997 17:15:56   MA
   includes

      Rev 1.21   29 Aug 1997 15:57:32   OS
   PopupMenu::Execute mit Window* fuer VCL

      Rev 1.20   29 Aug 1997 14:00:26   OS
   DLL-Umbau

      Rev 1.19   15 Aug 1997 12:16:06   OS
   chartar/frmatr/txtatr aufgeteilt

      Rev 1.18   08 Aug 1997 17:25:30   OM
   Headerfile-Umstellung

      Rev 1.17   23 Jul 1997 21:44:58   HJS
   includes

      Rev 1.16   18 Jul 1997 17:28:26   OS
   Display fuer Update der UserData

      Rev 1.15   18 Jul 1997 16:33:40   OS
   hartes Update im RequestHelp #41845#

      Rev 1.14   16 Jul 1997 14:12:34   OS
   neues Dok: da kommt ein FrameItem, kein ViewFrameItem #41726#

      Rev 1.13   15 Jul 1997 16:47:06   OS
   HeplIds fuer PopUps

      Rev 1.12   09 Jul 1997 17:45:30   HJS
   includes

      Rev 1.11   03 Jul 1997 16:25:20   OS
   Update: nicht mit alten Sections, sondern mit ListBox-Inhalten vergleichen

      Rev 1.10   02 Jul 1997 14:11:54   OS
   InsertRegion: Token fuer Bereichsnamen herausfiltern

      Rev 1.9   01 Jul 1997 09:43:44   OS
   mind. den ersten Eintrag selektieren

      Rev 1.8   27 Jun 1997 08:15:50   OS
   SV-Defizit umpopoelt: nur die erste FileList ist echt

      Rev 1.7   25 Jun 1997 20:35:38   HJS
   includes

      Rev 1.6   25 Jun 1997 16:37:18   OS
   per Doppelclick Textposition anspringen bzw. gelinktes Doc laden

      Rev 1.5   25 Jun 1997 08:59:38   OS
   Neue Datei fuer Globaldokument

      Rev 1.4   22 Jun 1997 15:36:32   OS
   Drop von File-Listen

      Rev 1.3   21 Jun 1997 14:12:22   OS
   Bereiche mit Dateinamen versehen, RequsestHelp entsprechend impl.

      Rev 1.2   19 Jun 1997 17:35:58   OS
   Reste Globaldokumente

      Rev 1.1   19 Jun 1997 11:04:58   OS
   Update impl.

      Rev 1.0   18 Jun 1997 13:07:18   OS
   Initial revision.

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/utlui/gloslst.cxx b/sw/source/ui/utlui/gloslst.cxx
new file mode 100644
index 0000000..6cc3200
--- /dev/null
+++ b/sw/source/ui/utlui/gloslst.cxx
@@ -0,0 +1,758 @@
/*************************************************************************
 *
 *  $RCSfile: gloslst.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:50 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#define _SVSTDARR_STRINGSDTOR
#define _SVSTDARR_STRINGSISORTDTOR
#define _SVSTDARR_STRINGS
#include <svtools/svstdarr.hxx>

#ifndef _SV_DIALOG_HXX //autogen
#include <vcl/dialog.hxx>
#endif
#ifndef _SV_GROUP_HXX //autogen
#include <vcl/group.hxx>
#endif
#ifndef _SV_MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SV_BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif
#ifndef _SV_LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif
#ifndef _SFX_INIMGR_HXX
#include <sfx2/inimgr.hxx>
#endif

#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _SHELLIO_HXX
#include <shellio.hxx>
#endif
#ifndef _INITUI_HXX
#include <initui.hxx>
#endif
#ifndef _GLOSDOC_HXX
#include <glosdoc.hxx>
#endif
#ifndef _GLOSLST_HXX
#include <gloslst.hxx>
#endif

#ifndef _UTLUI_HRC
#include <utlui.hrc>
#endif
#ifndef _GLOSLST_HRC
#include <gloslst.hrc>
#endif

#ifndef _URLOBJ_HXX
#include <tools/urlobj.hxx>
#endif
#ifndef _COM_SUN_STAR_UCB_XCOMMANDENVIRONMENT_HPP_
#include <com/sun/star/ucb/XCommandEnvironment.hpp>
#endif
#ifndef _COM_SUN_STAR_UTIL_DATETIME_HPP_
#include <com/sun/star/util/DateTime.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBC_XRESULTSET_HPP_
#include <com/sun/star/sdbc/XResultSet.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBC_XROW_HPP_
#include <com/sun/star/sdbc/XRow.hpp>
#endif

#ifdef DEBUG
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSETINFO_HPP_
#include <com/sun/star/beans/XPropertySetInfo.hpp>
#endif
#endif

#ifndef _UCBHELPER_CONTENT_HXX
#include <ucbhelper/content.hxx>
#endif

#ifndef _SHL_HXX
#include <tools/shl.hxx>
#endif

using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::util;
using namespace ::com::sun::star::ucb;
using namespace ::rtl;

#define STRING_DELIM (char)0x0A
#define GLOS_TIMEOUT 30000   // alle 30 s updaten
#define FIND_MAX_GLOS 20


struct TripleString
{
    String sGroup;
    String sBlock;
    String sShort;
};

typedef TripleString* TripleStringPtr;
SV_DECL_PTRARR_DEL( TripleStrings, TripleStringPtr, 0, 4 )
SV_IMPL_PTRARR( TripleStrings, TripleStringPtr )

class SwGlossDecideDlg : public ModalDialog
{
    OKButton        aOk;
    CancelButton    aCancel;
    HelpButton      aHelp;
    ListBox         aListLB;
    GroupBox        aGroup;

    DECL_LINK(DoubleClickHdl, ListBox*);
    DECL_LINK(SelectHdl, ListBox*);

    public:
        SwGlossDecideDlg(Window* pParent);
    ListBox&    GetListBox() {return aListLB;}
};

/*-----------------21.01.97 13.25-------------------

--------------------------------------------------*/

SwGlossDecideDlg::SwGlossDecideDlg(Window* pParent) :
    ModalDialog(pParent, SW_RES(DLG_GLOSSARY_DECIDE_DLG)),
    aOk(this,       ResId(PB_OK)),
    aCancel(this,   ResId(PB_CANCEL)),
    aHelp(this,     ResId(PB_HELP)),
    aListLB(this,   ResId(LB_LIST)),
    aGroup(this,    ResId(GB_GLOSS))
{
    FreeResource();
    aListLB.SetDoubleClickHdl(LINK(this, SwGlossDecideDlg, DoubleClickHdl));
    aListLB.SetSelectHdl(LINK(this, SwGlossDecideDlg, SelectHdl));
}

/*-----------------21.01.97 13.25-------------------

--------------------------------------------------*/

IMPL_LINK(SwGlossDecideDlg, DoubleClickHdl, ListBox*, EMPTYARG)
{
    EndDialog(RET_OK);
    return 0;
}
/*-----------------21.01.97 13.29-------------------

--------------------------------------------------*/

IMPL_LINK(SwGlossDecideDlg, SelectHdl, ListBox*, EMPTYARG)
{
    aOk.Enable(LISTBOX_ENTRY_NOTFOUND != aListLB.GetSelectEntryPos());
    return 0;
}

/********************************************************************

********************************************************************/


SwGlossaryList::SwGlossaryList() :
    bFilled(FALSE),
    sPath( SFX_INIMANAGER()->Get( SFX_KEY_GLOSSARY_PATH ) )
{
    SetTimeout(GLOS_TIMEOUT);
}

/********************************************************************

********************************************************************/


SwGlossaryList::~SwGlossaryList()
{
    ClearGroups();
}

/********************************************************************
 * Wenn der GroupName bereits bekannt ist, dann wird nur
 * rShortName gefuellt, sonst wird rGroupName ebenfals gesetzt und
 * bei Bedarf nach der richtigen Gruppe gefragt
********************************************************************/


BOOL SwGlossaryList::GetShortName(const String& rLongName,
                                String& rShortName, String& rGroupName )
{
    if(!bFilled)
        Update();

    TripleStrings aTripleStrings;

    USHORT nCount = aGroupArr.Count();
    USHORT nFound = 0;
    for(USHORT i = 0; i < nCount; i++ )
    {
        AutoTextGroup* pGroup = aGroupArr.GetObject(i);
        if(!rGroupName.Len() || rGroupName == pGroup->sName)
            for(USHORT j = 0; j < pGroup->nCount; j++)
            {
                String sLong = pGroup->sLongNames.GetToken(j, STRING_DELIM);
                if((rLongName == sLong))
                {
                    TripleString* pTriple = new TripleString;
                    pTriple->sGroup = pGroup->sName;
                    pTriple->sBlock = sLong;
                    pTriple->sShort = pGroup->sShortNames.GetToken(j, STRING_DELIM);
                    aTripleStrings.Insert(pTriple, nFound++);
                }
            }
    }

    BOOL bRet = FALSE;
    nCount = aTripleStrings.Count();
    if(1 == nCount )
    {
        TripleString* pTriple = aTripleStrings[0];
        rShortName = pTriple->sShort;
        rGroupName = pTriple->sGroup;
        bRet = TRUE;
    }
    else if(1 < nCount)
    {
        SwGlossDecideDlg aDlg(0);
        String sTitle = aDlg.GetText();
        sTitle += aTripleStrings[0]->sBlock;
        aDlg.SetText(sTitle);

        ListBox& rLB = aDlg.GetListBox();
        for(USHORT i = 0; i < nCount; i++ )
            rLB.InsertEntry(aTripleStrings[i]->sGroup.GetToken(0, GLOS_DELIM));

        rLB.SelectEntryPos(0);
        if(RET_OK == aDlg.Execute() &&
            LISTBOX_ENTRY_NOTFOUND != rLB.GetSelectEntryPos())
        {
            TripleString* pTriple = aTripleStrings[rLB.GetSelectEntryPos()];
            rShortName = pTriple->sShort;
            rGroupName = pTriple->sGroup;
            bRet = TRUE;
        }
        else
            bRet = FALSE;
    }
    return bRet;
}

/********************************************************************

********************************************************************/


USHORT  SwGlossaryList::GetGroupCount()
{
    if(!bFilled)
        Update();
    return aGroupArr.Count();
}

/********************************************************************

********************************************************************/


String SwGlossaryList::GetGroupName(USHORT nPos, BOOL bNoPath, String* pTitle)
{
    DBG_ASSERT(aGroupArr.Count() > nPos, "Gruppe nicht vorhanden")
    String sRet(aEmptyStr);
    if(nPos < aGroupArr.Count())
    {
        AutoTextGroup* pGroup = aGroupArr.GetObject(nPos);
        sRet = pGroup->sName;
        if(bNoPath)
            sRet = sRet.GetToken(0, GLOS_DELIM);
        if(pTitle)
            *pTitle = pGroup->sTitle;
    }
    return sRet;

}

/********************************************************************

********************************************************************/


USHORT  SwGlossaryList::GetBlockCount(USHORT nGroup)
{
    DBG_ASSERT(aGroupArr.Count() > nGroup, "Gruppe nicht vorhanden")
    if(nGroup < aGroupArr.Count())
    {
        AutoTextGroup* pGroup = aGroupArr.GetObject(nGroup);
        return pGroup->nCount;
    }
    return 0;
}

/********************************************************************

********************************************************************/


String  SwGlossaryList::GetBlockName(USHORT nGroup, USHORT nBlock, String& rShortName)
{
    DBG_ASSERT(aGroupArr.Count() > nGroup, "Gruppe nicht vorhanden")
    if(nGroup < aGroupArr.Count())
    {
        AutoTextGroup* pGroup = aGroupArr.GetObject(nGroup);
        rShortName = pGroup->sShortNames.GetToken(nBlock, STRING_DELIM);
        return pGroup->sLongNames.GetToken(nBlock, STRING_DELIM);
    }
    return aEmptyStr;
}

/********************************************************************

********************************************************************/


void SwGlossaryList::Update()
{
    if(!IsActive())
        Start();
    String sTemp( SFX_INIMANAGER()->Get( SFX_KEY_GLOSSARY_PATH ) );
    if(sTemp != sPath)
    {
        sPath = sTemp;
        bFilled = FALSE;
        ClearGroups();
    }
    SwGlossaries* pGlossaries = ::GetGlossaries();
    const SvStrings* pPathArr = pGlossaries->GetPathArray();
    if(!bFilled)
    {
        USHORT nGroupCount = pGlossaries->GetGroupCnt();
        for(USHORT i = 0; i < nGroupCount; i++)
        {
            String sGrpName = pGlossaries->GetGroupName(i);
            USHORT nPath = sGrpName.GetToken(1, GLOS_DELIM).ToInt32();
            if(nPath < pPathArr->Count())
            {
                AutoTextGroup* pGroup = new AutoTextGroup;
                pGroup->sName = sGrpName;

                FillGroup(pGroup, pGlossaries);
                String sName = *(*pPathArr)[nPath];
                sName += INET_PATH_TOKEN;
                sName += pGroup->sName.GetToken(0, GLOS_DELIM);
                sName += String::CreateFromAscii(pGlosExt);

                uno::Reference< XCommandEnvironment > xCmdEnv;
                ::ucb::Content aTestContent(
#if SUPD<591
                    SW_MOD()->GetContentBroker(),
#endif
                sName,
                xCmdEnv);

#ifdef DEBUG
                Reference< beans::XPropertySetInfo > xInfo = aTestContent.  getProperties();
                Sequence< beans::Property > aSeq = xInfo->getProperties(  );
                const beans::Property* pProps = aSeq.getConstArray();
                OUString sMsg;
                for(int nProp = 0; nProp < aSeq.getLength(); nProp++)
                {
                    sMsg += pProps[nProp].Name;
                    sMsg += OUString::createFromAscii("  ");
                }

#endif

                try
                {
                    uno::Any aAny = aTestContent.getPropertyValue( OUString::createFromAscii("DateModified") );
                    if(aAny.hasValue())
                    {
                         const util::DateTime* pDT = (util::DateTime*)aAny.getValue();
                        pGroup->aDateModified = ::DateTime(
                                    ::Date(pDT->Day, pDT->Month, pDT->Year),
                                    ::Time(pDT->Hours, pDT->Minutes, pDT->Seconds, pDT->HundredthSeconds));
                    }
                }
                catch(...)
                {
                }

                aGroupArr.Insert(pGroup, i);
            }
        }
        bFilled = TRUE;
    }
    else
    {
        for(USHORT nPath = 0; nPath < pPathArr->Count(); nPath++)
        {
              try
            {
                ::ucb::Content aCnt(
    #if SUPD<591
                SW_MOD()->GetContentBroker(),
    #endif
                        *(*pPathArr)[nPath], uno::Reference< XCommandEnvironment >());
                   Reference< sdbc::XResultSet > xResultSet;
                  Sequence< OUString > aProps(2);
                OUString* pProps = aProps.getArray();
                pProps[ 0 ] = OUString::createFromAscii( "Title" );
                pProps[ 1 ] = OUString::createFromAscii( "DateModified" );
                try
                {
                       xResultSet = aCnt.createCursor( aProps, ::ucb::INCLUDE_DOCUMENTS_ONLY );
                }
                catch ( Exception )
                {
                    DBG_ERRORFILE( "create cursor failed!" );
                }

                if ( xResultSet.is() )
                {
                    SvStringsDtor aFoundGroupNames;
                    Reference< sdbc::XRow > xRow( xResultSet, UNO_QUERY );
                    try
                    {
                        if ( xResultSet->first() )
                        {
                            do
                            {
                                String sTitle = xRow->getString( 1 );
                                xub_StrLen nFound = sTitle.SearchAscii( pGlosExt );
                                if( sTitle.Len() - 4 == nFound )
                                {
                                    util::DateTime aStamp = xRow->getTimestamp(2);
                                    ::DateTime aDateTime = ::DateTime(
                                        ::Date(aStamp.Day, aStamp.Month, aStamp.Year ),
                                        ::Time(aStamp.Hours, aStamp.Minutes, aStamp.Seconds, aStamp.HundredthSeconds )  );
                                    String sName = sTitle.Erase(sTitle.Len() - 4, 4);
                                    aFoundGroupNames.Insert(new String(sName), aFoundGroupNames.Count());
                                    sName += GLOS_DELIM;
                                    sName += String::CreateFromInt32( nPath );
                                    AutoTextGroup* pFound = FindGroup(sName);
                                    if(!pFound)
                                    {
                                        pFound = new AutoTextGroup;
                                        pFound->sName = sName;
                                        FillGroup(pFound, pGlossaries);
                                        pFound->aDateModified = aDateTime;

                                        aGroupArr.Insert(pFound, aGroupArr.Count());
                                    }
                                    else if(pFound->aDateModified < aDateTime)
                                    {
                                        FillGroup(pFound, pGlossaries);
                                        pFound->aDateModified = aDateTime;
                                    }
                                }
                            }
                            while ( xResultSet->next() );
                        }
                    }
                    catch ( ... )
                    {
                        DBG_ERRORFILE( "Exception caught!" );
                    }
                    USHORT nArrCount = aGroupArr.Count();
                    for( USHORT i = nArrCount; i; --i)
                    {
                        // evtl. geloeschte Gruppen entfernen
                        AutoTextGroup* pGroup = aGroupArr.GetObject(i - 1);
                        USHORT nGroupPath = pGroup->sName.GetToken(1, GLOS_DELIM).ToInt32();
                        // nur die Gruppen werden geprueft, die fuer den
                        // aktuellen Teilpfad registriert sind
                        if(nGroupPath == nPath)
                        {
                            BOOL bFound = FALSE;
                            String sCompareGroup = pGroup->sName.GetToken(0, GLOS_DELIM);
                            for( USHORT j = 0; j < aFoundGroupNames.Count() && !bFound; ++j)
                            {
                                bFound = sCompareGroup == *aFoundGroupNames[j];
                            }
                            if(!bFound)
                            {
                                aGroupArr.Remove(i - 1);
                                delete pGroup;
                            }
                        }
                    }
                }
            }
            catch(...){}
        }
    }
}

/********************************************************************

********************************************************************/


void __EXPORT SwGlossaryList::Timeout()
{
    // nur, wenn eine SwView den Fokus hat, wird automatisch upgedated
    if(::GetActiveView())
        Update();
}

/********************************************************************

********************************************************************/


AutoTextGroup*  SwGlossaryList::FindGroup(const String& rGroupName)
{
    for(USHORT i = 0; i < aGroupArr.Count(); i++)
    {
        AutoTextGroup* pRet = aGroupArr.GetObject(i);
        if(pRet->sName == rGroupName)
            return pRet;
    }
    return 0;
}

/********************************************************************

********************************************************************/


void SwGlossaryList::FillGroup(AutoTextGroup* pGroup, SwGlossaries* pGlossaries)
{
    SwTextBlocks*   pBlock = pGlossaries->GetGroupDoc(pGroup->sName);
    pGroup->nCount = pBlock ? pBlock->GetCount() : 0;
    pGroup->sLongNames = pGroup->sShortNames = aEmptyStr;
    if(pBlock)
        pGroup->sTitle = pBlock->GetName();

    for(USHORT j = 0; j < pGroup->nCount; j++)
    {
        pGroup->sLongNames  += pBlock->GetLongName(j);
        pGroup->sLongNames  += STRING_DELIM;
        pGroup->sShortNames += pBlock->GetShortName(j);
        pGroup->sShortNames += STRING_DELIM;
    }
    pGlossaries->PutGroupDoc(pBlock);
}

/********************************************************************
    Alle (nicht mehr als FIND_MAX_GLOS) gefunden Bausteine mit
    passendem Anfang zurueckgeben
********************************************************************/

BOOL SwGlossaryList::HasLongName(const String& rBegin, SvStringsISortDtor* pLongNames )
{
    if(!bFilled)
        Update();
    USHORT nFound = 0;
    USHORT nCount = aGroupArr.Count();
    USHORT nBeginLen = rBegin.Len();
    const International& rInt = Application::GetAppInternational();
    for(USHORT i = 0; i < nCount; i++ )
    {
        AutoTextGroup* pGroup = aGroupArr.GetObject(i);
        for(USHORT j = 0; j < pGroup->nCount; j++)
        {
            String sBlock = pGroup->sLongNames.GetToken(j, STRING_DELIM);
            if(rInt.CompareEqual(sBlock.Copy(0, nBeginLen), rBegin, INTN_COMPARE_IGNORECASE) &&
                nBeginLen + 1 < sBlock.Len())
            {
                String* pBlock = new String(sBlock);
                pLongNames->Insert(pBlock);
                nFound++;
                if(FIND_MAX_GLOS == nFound)
                    break;
            }
        }
    }
    return nFound > 0;
}

/********************************************************************

********************************************************************/
void    SwGlossaryList::ClearGroups()
{
    USHORT nCount = aGroupArr.Count();
    for( USHORT i = 0; i < nCount; ++i )
        delete aGroupArr.GetObject( i );

    aGroupArr.Remove( 0, nCount );
    bFilled = FALSE;
}

/*************************************************************************

    Source Code Control System - Header

    $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/ui/utlui/gloslst.cxx,v 1.1.1.1 2000-09-18 17:14:50 hr Exp $

    Source Code Control System - Update

    $Log: not supported by cvs2svn $
    Revision 1.29  2000/09/18 16:06:17  willem.vandorp
    OpenOffice header added.

    Revision 1.28  2000/06/13 09:57:49  os
    using UCB

    Revision 1.27  2000/06/08 09:45:45  os
    ContentBroker not in SwModule

    Revision 1.26  2000/06/07 13:29:51  os
    using UCB

    Revision 1.25  2000/05/23 19:54:24  jp
    Bugfixes for Unicode

    Revision 1.24  2000/04/18 15:14:08  os
    UNICODE

    Revision 1.23  2000/02/14 14:24:35  os
    #70473# Unicode

    Revision 1.22  2000/02/10 10:35:23  os
    #70359# titles added to AutoText groups

    Revision 1.21  1999/10/21 17:45:07  jp
    have to change - SearchFile with SfxIniManager, dont use SwFinder for this

    Revision 1.20  1999/09/20 09:59:08  os
    local resources separated

    Revision 1.19  1999/02/09 09:48:02  OS
    #61205# AutoText-Gruppen koennen beliebige Namen erhalten


      Rev 1.18   09 Feb 1999 10:48:02   OS
   #61205# AutoText-Gruppen koennen beliebige Namen erhalten

      Rev 1.17   18 Aug 1998 17:28:04   OS
   GetShortName sollte auf bekannte Gruppe richtig reagieren #55219#

      Rev 1.16   18 Mar 1998 17:47:40   OS
   kein GPF, wenn alle Glossary-Pfade ungueltig sind

      Rev 1.15   21 Nov 1997 12:10:14   MA
   includes

      Rev 1.14   03 Nov 1997 13:59:24   MA
   precomp entfernt

      Rev 1.13   01 Sep 1997 13:11:44   OS
   DLL-Umstellung

      Rev 1.12   30 Jul 1997 14:49:30   OM
   #41989# Autotextbereiche korrekt anzeigen

      Rev 1.11   09 Jul 1997 17:45:30   HJS
   includes

      Rev 1.10   17 Jun 1997 10:15:22   OS
   Update fuer mehrere AutoText-Pfade angepasst

      Rev 1.9   10 Jun 1997 14:26:12   OS
   AutoText aus mehreren Verzeichnissen

      Rev 1.8   30 Jan 1997 09:15:08   MA
   unbenutztes entfernt

      Rev 1.7   21 Jan 1997 15:00:30   OS
   Autotext-Auswahl-Dialog verfeinert

      Rev 1.6   21 Jan 1997 09:39:26   OS
   Gruppenname zurueckgeben

      Rev 1.5   20 Jan 1997 16:58:50   OS
   Entscheidungsdialog fuer AutoComplete

      Rev 1.4   01 Nov 1996 04:44:36   MH
   add: includes

      Rev 1.3   01 Oct 1996 09:00:16   JP
   DTOR korrigiert

      Rev 1.2   27 Sep 1996 16:33:22   HJS
   include

      Rev 1.1   27 Sep 1996 12:55:20   OS
   nach Kuerzeln suchen

      Rev 1.0   26 Sep 1996 16:55:54   OS
   Initial revision.

*************************************************************************/


diff --git a/sw/source/ui/utlui/gloslst.hrc b/sw/source/ui/utlui/gloslst.hrc
new file mode 100644
index 0000000..fdc65b7
--- /dev/null
+++ b/sw/source/ui/utlui/gloslst.hrc
@@ -0,0 +1,72 @@
/*************************************************************************
 *
 *  $RCSfile: gloslst.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:50 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _INITUI_HRC
#define _INITUI_HRC

#define GB_GLOSS                                1
#define PB_OK                                   2
#define PB_HELP                                 3
#define PB_CANCEL                               4
#define LB_LIST                                 5

#endif

diff --git a/sw/source/ui/utlui/gloslst.src b/sw/source/ui/utlui/gloslst.src
new file mode 100644
index 0000000..0c8d269
--- /dev/null
+++ b/sw/source/ui/utlui/gloslst.src
@@ -0,0 +1,153 @@
/*************************************************************************
 *
 *  $RCSfile: gloslst.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:50 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "globals.hrc"
#include "utlui.hrc"
#include "helpid.h"
#include "gloslst.hrc"

ModalDialog DLG_GLOSSARY_DECIDE_DLG
{
    HelpID = HID_DLG_GLOSS_DECIDE ;
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 161 , 67 ) ;
    /* ### ACHTUNG: Neuer Text in Resource? Textbaustein auswählen:  : Textbaustein auswõhlen:  */
    Text = "Textbaustein auswählen: " ;
    Text [ ENGLISH ] = "Select glossary: " ;
    Moveable = TRUE ;
    GroupBox GB_GLOSS
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 93 , 58 ) ;
        Text = "AutoText - Gruppe" ;
        Text [ ENGLISH ] = "Glossary group" ;
        Text [ english_us ] = "AutoText - Group" ;
        Text [ portuguese_brazilian ] = "AutoText - Gruppe" ;
        Text [ swedish ] = "AutoText - grupp" ;
        Text [ danish ] = "AutoTekst - gruppe" ;
        Text [ italian ] = "Testo automatico - Gruppo" ;
        Text [ spanish ] = "Grupo AutoTexto" ;
        Text [ french ] = "AutoTexte - Groupe" ;
        Text [ dutch ] = "AutoTekst-groep" ;
        Text [ portuguese ] = "AutoTexto - Grupo" ;
        Text[ chinese_simplified ] = "×Ô¶¯Í¼Îļ¯Ð¡×é";
        Text[ russian ] = "Àâòîòåêñò - Ãðóïïà";
        Text[ polish ] = "Autotekst - Grupa";
        Text[ japanese ] = "“ü—ÍŽx‰‡  ¸ÞÙ°Ìß";
        Text[ chinese_traditional ] = "¦Û°Ê¹Ï¤å¶°¤p²Õ";
        Text[ arabic ] = "ãÌãæÚÉ äÕ ÊáÞÇÆí";
        Text[ greek ] = "ÏìÜäá ÁõôïÊåéìÝíïõ";
        Text[ korean ] = "ÀÚµ¿ ÅØ½ºÆ® ±×·ì";
        Text[ turkish ] = "Otomatik metin - Grup";
        Text[ language_user1 ] = " ";
    };
    OKButton PB_OK
    {
        Pos = MAP_APPFONT ( 105 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        Group = TRUE ;
        DefButton = TRUE ;
    };
    CancelButton PB_CANCEL
    {
        Pos = MAP_APPFONT ( 105 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        Group = TRUE ;
    };
    HelpButton PB_HELP
    {
        Pos = MAP_APPFONT ( 105 , 43 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        Group = TRUE ;
    };
    ListBox LB_LIST
    {
        Pos = MAP_APPFONT ( 12 , 15 ) ;
        Size = MAP_APPFONT ( 81 , 40 ) ;
        TabStop = TRUE ;
        Border = TRUE ;
    };
    Text [ english_us ] = "Select AutoText: " ;
    Text [ portuguese_brazilian ] = "Textbaustein auswählen: " ;
    Text [ swedish ] = "Välj ut textblock:  " ;
    Text [ danish ] = "Vælg tekstelementer: " ;
    Text [ italian ] = "Seleziona modulo di testo:  " ;
    Text [ spanish ] = "Seleccionar módulo de texto:  " ;
    Text [ french ] = "Sélection du module de texte : " ;
    Text [ dutch ] = "Tekstbouwsteen selecteren:  " ;
    Text [ portuguese ] = "Seleccionar módulo de texto:  " ;
    Text[ chinese_simplified ] = "Ñ¡Ôñ´ÊÌõ£º ";
    Text[ russian ] = "Âûáðàòü àâòîòåêñò: ";
    Text[ polish ] = "Zaznacz blok tekstu:  ";
    Text[ japanese ] = "÷½ÄÌÞÛ¯¸‚Ì‘I‘ð: ";
    Text[ chinese_traditional ] = "¿ï¾Ü¦Û°Ê¹Ï¤å¶°¡G ";
    Text[ arabic ] = "ÇÎÊíÇÑ ÚäÕÑ ÇáäÕ: ";
    Text[ greek ] = "ÅðéëïãÞ ôìÞìáôïò êåéìÝíïõ: ";
    Text[ korean ] = "ÀÚµ¿ ÅØ½ºÆ® ¼±ÅÃ: ";
    Text[ turkish ] = "Metin bileþeni seç: ";
    Text[ language_user1 ] = " ";
};


diff --git a/sw/source/ui/utlui/initui.cxx b/sw/source/ui/utlui/initui.cxx
new file mode 100644
index 0000000..5357961
--- /dev/null
+++ b/sw/source/ui/utlui/initui.cxx
@@ -0,0 +1,440 @@
/*************************************************************************
 *
 *  $RCSfile: initui.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:50 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SV_SVAPP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _VIEWSH_HXX
#include <viewsh.hxx>
#endif
#ifndef _FINDER_HXX
#include <finder.hxx>
#endif
#ifndef _INITUI_HXX
#include <initui.hxx>
#endif
#ifndef _EDTWIN_HXX
#include <edtwin.hxx>
#endif
#ifndef _SHELLRES_HXX
#include <shellres.hxx>
#endif
#ifndef _FLDBAS_HXX
#include <fldbas.hxx>
#endif
#ifndef _GLOSDOC_HXX
#include <glosdoc.hxx>
#endif
#ifndef _GLOSLST_HXX
#include <gloslst.hxx>
#endif

#ifndef _UTLUI_HRC
#include <utlui.hrc>
#endif
#ifndef _INITUI_HRC
#include <initui.hrc>
#endif
#ifndef _COMCORE_HRC
#include <comcore.hrc>
#endif
#ifndef _AUTHFLD_HXX
#include <authfld.hxx>
#endif

#define C2S(cChar) UniString::CreateFromAscii(cChar)
/*--------------------------------------------------------------------
    Beschreibung:   globale Pointer
 --------------------------------------------------------------------*/

SwGlossaries*       pGlossaries = 0;

// Liefert alle benoetigten Pfade. Wird durch UI initialisiert
SwPathFinder*       pPathFinder = 0;
SwGlossaryList*     pGlossaryList = 0;

String* pOldGrfCat = 0;
String* pOldTabCat = 0;
String* pOldFrmCat = 0;
String* pOldDrwCat = 0;
String* pCurrGlosGroup = 0;

SvStringsDtor* pDBNameList = 0;

SvStringsDtor*  pAuthFieldNameList = 0;
SvStringsDtor*  pAuthFieldTypeList = 0;

/*--------------------------------------------------------------------
    Beschreibung:   UI beenden
 --------------------------------------------------------------------*/

void _FinitUI()
{
    delete ViewShell::GetShellRes();
    ViewShell::SetShellRes( 0 );

    SwEditWin::_FinitStaticData();

    DELETEZ(pPathFinder);
    DELETEZ(pGlossaries);

    delete SwFieldType::pFldNames;

    delete pOldGrfCat;
    delete pOldTabCat;
    delete pOldFrmCat;
    delete pOldDrwCat;
    delete pCurrGlosGroup;
    delete pDBNameList;
    delete pGlossaryList;
    delete pAuthFieldNameList;
    delete pAuthFieldTypeList;


}
/*--------------------------------------------------------------------
    Beschreibung:   Initialisierung
 --------------------------------------------------------------------*/


void _InitUI()
{
    pPathFinder = new SwPathFinder;
    // ShellResource gibt der CORE die Moeglichkeit mit Resourcen zu arbeiten
    ViewShell::SetShellRes( new ShellResource );
    pDBNameList = new SvStringsDtor( 5, 5 );
    SwEditWin::_InitStaticData();
}


ShellResource::ShellResource()
    : Resource( SW_RES(RID_SW_SHELLRES) ),
    aPostItPage( SW_RES( STR_POSTIT_PAGE ) ),
    aPostItAuthor( SW_RES( STR_POSTIT_AUTHOR ) ),
    aPostItLine( SW_RES( STR_POSTIT_LINE ) ),
    aCalc_Syntax( SW_RES( STR_CALC_SYNTAX ) ),
    aCalc_ZeroDiv( SW_RES( STR_CALC_ZERODIV ) ),
    aCalc_Brack( SW_RES( STR_CALC_BRACK ) ),
    aCalc_Pow( SW_RES( STR_CALC_POW ) ),
    aCalc_VarNFnd( SW_RES( STR_CALC_VARNFND ) ),
    aCalc_Overflow( SW_RES( STR_CALC_OVERFLOW ) ),
    aCalc_WrongTime( SW_RES( STR_CALC_WRONGTIME ) ),
    aCalc_Default( SW_RES( STR_CALC_DEFAULT ) ),
    aCalc_Error( SW_RES( STR_CALC_ERROR ) ),
    aGetRefFld_Up( SW_RES( STR_GETREFFLD_UP ) ),
    aGetRefFld_Down( SW_RES( STR_GETREFFLD_DOWN ) ),
    aStrAllPageHeadFoot( SW_RES( STR_ALLPAGE_HEADFOOT ) ),
    aStrNone( SW_RES( STR_TEMPLATE_NONE )),
    aFixedStr( SW_RES( STR_FIELD_FIXED )),
    aTOXIndexName(          SW_RES(STR_TOI)),
    aTOXUserName(           SW_RES(STR_TOU)),
    aTOXContentName(        SW_RES(STR_TOC)),
    aTOXIllustrationsName(  SW_RES(STR_TOX_ILL)),
    aTOXObjectsName(        SW_RES(STR_TOX_OBJ)),
    aTOXTablesName(         SW_RES(STR_TOX_TBL)),
    aTOXAuthoritiesName(    SW_RES(STR_TOX_AUTH)),
    pAutoFmtNameLst( 0 )
{
    const USHORT nCount = FLD_DOCINFO_END - FLD_DOCINFO_BEGIN;

    for(USHORT i = 0; i < nCount; ++i)
    {
        String* pNew = new SW_RESSTR(FLD_DOCINFO_BEGIN + i);
        aDocInfoLst.Insert(pNew, aDocInfoLst.Count());
    }

    FreeResource();
}

ShellResource::~ShellResource()
{
    if( pAutoFmtNameLst )
        delete pAutoFmtNameLst, pAutoFmtNameLst = 0;
}

SwGlossaries* GetGlossaries()
{
    if (!pGlossaries)
        pGlossaries = new SwGlossaries;
    return (pGlossaries);
}

BOOL HasGlossaryList()
{
    return pGlossaryList != 0;
}

SwGlossaryList* GetGlossaryList()
{
    if(!pGlossaryList)
        pGlossaryList = new SwGlossaryList();

    return pGlossaryList;
}

struct ImpAutoFmtNameListLoader : public Resource
{
    ImpAutoFmtNameListLoader( SvStringsDtor& rLst );
};

void ShellResource::_GetAutoFmtNameLst() const
{
    SvStringsDtor** ppLst = (SvStringsDtor**)&pAutoFmtNameLst;
    *ppLst = new SvStringsDtor( STR_AUTOFMTREDL_END );
    ImpAutoFmtNameListLoader aTmp( **ppLst );
}

ImpAutoFmtNameListLoader::ImpAutoFmtNameListLoader( SvStringsDtor& rLst )
    : Resource( ResId(RID_SHELLRES_AUTOFMTSTRS, pSwResMgr) )
{
    for( USHORT n = 0; n < STR_AUTOFMTREDL_END; ++n )
    {
        String* p = new String( ResId( n + 1, pSwResMgr) );
        if(STR_AUTOFMTREDL_TYPO == n)
        {
            const International& rInt = Application::GetAppInternational();
#ifdef WNT
            //fuer Windows Sonderbehandlung, da MS hier ein paar Zeichen im Dialogfont vergessen hat
            p->SearchAndReplace(C2S("%1"), C2S(",,"));
            p->SearchAndReplace(C2S("%2"), C2S("''"));
#else
            //unter richtigen Betriebssystemen funktioniert es auch so
            p->SearchAndReplace(C2S("%1"), rInt.GetDoubleQuotationMarkStartChar());
            p->SearchAndReplace(C2S("%2"), rInt.GetDoubleQuotationMarkEndChar());
#endif
        }
        rLst.Insert( p, n );
    }
    FreeResource();
}
/* -----------------16.09.99 12:28-------------------

 --------------------------------------------------*/
const String&   SwAuthorityFieldType::GetAuthFieldName(ToxAuthorityField eType)
{
    if(!pAuthFieldNameList)
    {
        pAuthFieldNameList = new SvStringsDtor(AUTH_FIELD_END, 1);
        for(USHORT i = 0; i < AUTH_FIELD_END; i++)
        {
            String*  pTmp = new String(SW_RES(STR_AUTH_FIELD_START + i));
            //remove short cuts
            pTmp->EraseAllChars('~');
            pAuthFieldNameList->Insert(pTmp, pAuthFieldNameList->Count());
        }
    }
    return *pAuthFieldNameList->GetObject(eType);
}
/* -----------------16.09.99 12:29-------------------

 --------------------------------------------------*/
const String&   SwAuthorityFieldType::GetAuthTypeName(ToxAuthorityType eType)
{
    if(!pAuthFieldTypeList)
    {
        pAuthFieldTypeList = new SvStringsDtor(AUTH_TYPE_END, 1);
        for(USHORT i = 0; i < AUTH_TYPE_END; i++)
            pAuthFieldTypeList->Insert(
                new String(SW_RES(STR_AUTH_TYPE_START + i)),
                                    pAuthFieldTypeList->Count());
    }
    return *pAuthFieldTypeList->GetObject(eType);
}

/*************************************************************************

    $Log: not supported by cvs2svn $
    Revision 1.112  2000/09/18 16:06:17  willem.vandorp
    OpenOffice header added.

    Revision 1.111  2000/04/18 15:14:08  os
    UNICODE

    Revision 1.110  2000/02/14 14:23:29  os
    #70473# Unicode

    Revision 1.109  2000/02/10 10:35:22  os
    #70359# titles added to AutoText groups

    Revision 1.108  1999/10/06 12:24:13  os
    index corrected

    Revision 1.107  1999/10/05 10:40:03  os
    index corrected

    Revision 1.106  1999/09/22 12:48:10  aw
    changes for IAO-Handle handling in SW (AW)

    Revision 1.105  1999/09/20 09:58:34  os
    local resources separated; Authority defines

    Revision 1.104  1999/09/15 14:10:32  os
    language improvements

    Revision 1.103  1999/07/07 06:15:48  OS
    extended indexes: Index names in ShellRes


      Rev 1.102   07 Jul 1999 08:15:48   OS
   extended indexes: Index names in ShellRes

      Rev 1.101   10 Jun 1999 13:14:52   JP
   have to change: no AppWin from SfxApp

      Rev 1.100   28 May 1999 14:09:04   OS
   #54839# Plattformstrings raus

      Rev 1.99   09 Mar 1999 18:27:42   JP
   Task #61405#: AutoCompletion von Woertern

      Rev 1.98   05 Mar 1999 14:33:02   JP
   Bug #62868#: beim Anzeigen der Feldnamen opt. das Fix mit ausgeben

      Rev 1.97   12 Jan 1999 21:14:32   JP
   Bug #60794#: Fehlererkennung beim Tabellenrechnen

      Rev 1.96   10 Dec 1998 09:47:56   MIB
   #60060#: Beschriftungen fuer Zeichen-Objekte

      Rev 1.95   06 Oct 1998 09:47:22   JP
   Task #57586#: ShellRes um die AutoFmt-RedlineNameListe erweitert

      Rev 1.94   16 Jul 1998 16:40:46   JP
   STR_NONE ->STR_TEMPLATE_NONE fuer den MacCompiler

      Rev 1.93   26 Jun 1998 17:12:52   AMA
   Chg: Notizen werden mit Zeilenangabe gedruckt

      Rev 1.92   29 May 1998 18:56:32   JP
   neuer String in den ShellResourcen

      Rev 1.91   26 May 1998 15:31:36   JP
   neuen String aufgenommen: Alle

      Rev 1.90   21 Nov 1997 12:10:12   MA
   includes

      Rev 1.89   03 Nov 1997 13:59:24   MA
   precomp entfernt

      Rev 1.88   20 Jan 1997 17:04:30   JP
   ShowTip Umbau

      Rev 1.87   11 Nov 1996 10:54:12   MA
   ResMgr

      Rev 1.86   06 Nov 1996 16:55:10   OS
   include

      Rev 1.85   06 Nov 1996 16:39:06   OS
   SpellCheck in der OFA

      Rev 1.84   31 Oct 1996 14:51:50   JP
   neue Resource fuer GetRefFelder

      Rev 1.83   26 Sep 1996 16:57:24   OS
   neu: SwGlossaryList

      Rev 1.82   19 Sep 1996 10:34:56   JP
   neu: pDBNameList fuers Basic

      Rev 1.81   28 Aug 1996 15:42:32   OS
   includes

      Rev 1.80   16 Aug 1996 11:28:26   OM
   Dokinfo aufgegliedert

      Rev 1.79   12 Aug 1996 16:33:34   OM
   Namen der Def Datenbank in SwTypes verschoben

      Rev 1.78   25 Jul 1996 16:42:52   OM
   Datenbankname am Dok auch mit Tabelle initialisieren

      Rev 1.77   20 Dec 1995 17:21:22   OM
   Address->FAR_DATA

      Rev 1.76   05 Dec 1995 19:02:00   JP
   static aActGroup nur noch ein Pointer (wird von InitUi gepflegt!)

      Rev 1.75   28 Nov 1995 21:18:20   JP
   UiSystem-Klasse aufgehoben, in initui/swtype aufgeteilt

      Rev 1.74   28 Nov 1995 13:39:54   JP
   Aufgeraeumt - alte externs entfernt, SwShellRes ueber Resource laden

      Rev 1.73   27 Nov 1995 21:16:56   JP
   static Strings aus caption.cxx hierher als Pointer verschoben

      Rev 1.72   24 Nov 1995 16:57:22   OM
   PCH->PRECOMPILED

      Rev 1.71   13 Nov 1995 12:21:32   JP
   static Namen von Grafik/OLE/Tabelle setzen fuer Verzeichnisse entfernt

*************************************************************************/


diff --git a/sw/source/ui/utlui/initui.hrc b/sw/source/ui/utlui/initui.hrc
new file mode 100644
index 0000000..eda73a8
--- /dev/null
+++ b/sw/source/ui/utlui/initui.hrc
@@ -0,0 +1,94 @@
/*************************************************************************
 *
 *  $RCSfile: initui.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:50 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _INITUI_HRC
#define _INITUI_HRC

#define BMP_FRAME_ANCHOR             1
#define BMP_FRAME_DRAG_ANCHOR        2

// lokale Resourcen fuer die Shells:
#define STR_POSTIT_PAGE              1
#define STR_POSTIT_AUTHOR            2
#define STR_CALC_SYNTAX              3
#define STR_CALC_ZERODIV             4
#define STR_CALC_BRACK               5
#define STR_CALC_POW                 6
#define STR_CALC_VARNFND             7
#define STR_CALC_OVERFLOW            8
#define STR_CALC_WRONGTIME           9
#define STR_CALC_DEFAULT            10
#define STR_CALC_ERROR              11
#define STR_GETREFFLD_UP            12
#define STR_GETREFFLD_DOWN          13
#define STR_ALLPAGE_HEADFOOT        14
#define STR_TEMPLATE_NONE           15
#define STR_POSTIT_LINE             16
#define STR_FIELD_FIXED             17
#define STR_TOI                     18
#define STR_TOU                     19
#define STR_TOC                     20
#define STR_TOX_ILL                 21
#define STR_TOX_OBJ                 22
#define STR_TOX_TBL                 23
#define STR_TOX_AUTH                24
#endif

diff --git a/sw/source/ui/utlui/initui.src b/sw/source/ui/utlui/initui.src
new file mode 100644
index 0000000..bfc9e65
--- /dev/null
+++ b/sw/source/ui/utlui/initui.src
@@ -0,0 +1,2303 @@
/*************************************************************************
 *
 *  $RCSfile: initui.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:50 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "globals.hrc"
#include "utlui.hrc"
#include "helpid.h"
#include "initui.hrc"

/*---------------------------------------------------------------------
    Fehler Calculator
 ---------------------------------------------------------------------*/
Resource RID_SW_SHELLRES
{
    String STR_POSTIT_PAGE
    {
        TEXT = "Seite" ;
        TEXT [ ENGLISH ] = "Page" ;
        TEXT [ norwegian ] = "Page" ;
        TEXT [ italian ] = "Pagina" ;
        TEXT [ portuguese_brazilian ] = "Página" ;
        TEXT [ portuguese ] = "Página" ;
        TEXT [ finnish ] = "Sivu" ;
        TEXT [ danish ] = "Side" ;
        TEXT [ french ] = "Page" ;
        TEXT [ swedish ] = "Sida" ;
        TEXT [ dutch ] = "Pagina" ;
        TEXT [ spanish ] = "Página" ;
        TEXT [ english_us ] = "Page" ;
        TEXT[ chinese_simplified ] = "ҳ";
        TEXT[ russian ] = "Ñòðàíèöà";
        TEXT[ polish ] = "Strona";
        TEXT[ japanese ] = "Íß°¼Þ";
        TEXT[ chinese_traditional ] = "­¶";
        TEXT[ arabic ] = "ÇáÕÝÍÉ";
        TEXT[ greek ] = "Óåëßäá";
        TEXT[ korean ] = "ÆäÀÌÁö";
        TEXT[ turkish ] = "Sayfa";
        TEXT[ language_user1 ] = " ";
    };
    String STR_POSTIT_LINE
    {
        TEXT = "Zeile" ;
        TEXT [ ENGLISH ] = "Line" ;
        Text [ portuguese ] = "Linha" ;
        Text [ english_us ] = "Line" ;
        Text [ portuguese_brazilian ] = "Zeile" ;
        Text [ swedish ] = "Rad" ;
        Text [ danish ] = "Række" ;
        Text [ italian ] = "Riga" ;
        Text [ spanish ] = "Línea" ;
        Text [ french ] = "Ligne" ;
        Text [ dutch ] = "Regel" ;
        Text[ chinese_simplified ] = "ÐÐ";
        Text[ russian ] = "Ñòðîêà";
        Text[ polish ] = "Wiersz";
        Text[ japanese ] = "s";
        Text[ chinese_traditional ] = "¦æ";
        Text[ arabic ] = "ÇáÓØÑ";
        Text[ greek ] = "ÃñáììÞ";
        Text[ korean ] = "¼±";
        Text[ turkish ] = "Satýr";
        Text[ language_user1 ] = " ";
    };
    String STR_POSTIT_AUTHOR
    {
        TEXT = "Autor" ;
        TEXT [ ENGLISH ] = "Author" ;
        TEXT [ norwegian ] = "Forfatter" ;
        TEXT [ italian ] = "Autore" ;
        TEXT [ portuguese_brazilian ] = "Autor" ;
        TEXT [ portuguese ] = "Autor" ;
        TEXT [ finnish ] = "Tekijä" ;
        TEXT [ danish ] = "Forfatter" ;
        TEXT [ french ] = "Auteur" ;
        TEXT [ swedish ] = "Författare" ;
        TEXT [ dutch ] = "Auteur" ;
        TEXT [ spanish ] = "Autor" ;
        TEXT [ english_us ] = "Author" ;
        TEXT[ chinese_simplified ] = "×÷Õß";
        TEXT[ russian ] = "Àâòîð";
        TEXT[ polish ] = "Autor";
        TEXT[ japanese ] = "ì¬ŽÒ";
        TEXT[ chinese_traditional ] = "§@ªÌ";
        TEXT[ arabic ] = "ÇáãÄáÝ";
        TEXT[ greek ] = "ÓõíôÜêôçò";
        TEXT[ korean ] = "ÀÛ¼ºÀÎ";
        TEXT[ turkish ] = "Yazan";
        TEXT[ language_user1 ] = " ";
    };
    String STR_CALC_SYNTAX
    {
        TEXT [ English ] = "** Syntax error **" ;
        TEXT [ norwegian ] = "** Syntaksfeil **" ;
        TEXT [ italian ] = "** Errore di sintassi **" ;
        TEXT [ portuguese_brazilian ] = "** Erro de sintaxe **" ;
        TEXT [ portuguese ] = "** Erro de sintaxe **" ;
        TEXT [ finnish ] = "** Muotovirhe **" ;
        TEXT [ danish ] = "** Syntaksfejl **" ;
        TEXT [ french ] = "** Erreur de syntaxe **" ;
        TEXT [ swedish ] = "** Syntaxfel **" ;
        TEXT [ dutch ] = "** Syntactische fout **" ;
        TEXT [ spanish ] = "** Error de sintaxis **" ;
        TEXT [ english_us ] = "** Syntax Error **" ;
        TEXT = "** Syntax Fehler **" ;
        TEXT[ chinese_simplified ] = "** Óï·¨´íÎó **";
        TEXT[ russian ] = "** Ñèíòàêñè÷åñêàÿ îøèáêà **";
        TEXT[ polish ] = "** B³¹d w sk³adni **";
        TEXT[ japanese ] = "**¼ÝÀ¯¸½´×°**";
        TEXT[ chinese_traditional ] = "** »yªk¿ù»~ **";
        TEXT[ arabic ] = "** ÎØÃ Ýí ÈäÇÁ ÇáÌãáÉ **";
        TEXT[ greek ] = "** Óõíôáêôéêü ëÜèïò **";
        TEXT[ korean ] = "** ±¸¹® ¿À·ù **";
        TEXT[ turkish ] = "** Söz dizimi hatasý **";
        TEXT[ language_user1 ] = " ";
    };
    String STR_CALC_ZERODIV
    {
        TEXT [ English ] = "** Divide by zero **" ;
        TEXT [ norwegian ] = "** Del på null **" ;
        TEXT [ italian ] = "** Divisione per zero **" ;
        TEXT [ portuguese_brazilian ] = "** Dividir por zero **" ;
        TEXT [ portuguese ] = "** Dividir por zero **" ;
        TEXT [ finnish ] = "** Jako nollalla **" ;
        TEXT [ danish ] = "** Division med nul **" ;
        TEXT [ french ] = "** Division par zéro **" ;
        TEXT [ swedish ] = "** Division med noll **" ;
        TEXT [ dutch ] = "Divideren door nul" ;
        TEXT [ spanish ] = "** Dividir por cero **" ;
        TEXT [ english_us ] = "** Division by zero **" ;
        TEXT = "** Division durch Null **" ;
        TEXT[ chinese_simplified ] = "** ³ýÓÚÁã **";
        TEXT[ russian ] = "** Äåëåíèå íà íóëü **";
        TEXT[ polish ] = "** Dzielenie przez zero **";
        TEXT[ japanese ] = "**¾ÞۂŊ„‚é**";
        TEXT[ chinese_traditional ] = "** °£¤_¹s **";
        TEXT[ arabic ] = "** ÞÓãÉ Úáì ÕÝÑ **";
        TEXT[ greek ] = "** Äéáßñåóç ìå ôï 0  **";
        TEXT[ korean ] = "** 0À¸·Î ³ª´¸ **";
        TEXT[ turkish ] = "** Sýfýr ile bölme **";
        TEXT[ language_user1 ] = " ";
    };
    String STR_CALC_BRACK
    {
        TEXT [ English ] = "** Mistakable brackets **" ;
        TEXT [ norwegian ] = "+++** Mistakable brackets **" ;
        TEXT [ italian ] = "** Parentesi errate **" ;
        TEXT [ portuguese_brazilian ] = "** Colchetes errôneos **" ;
        TEXT [ portuguese ] = "** Parênteses errados **" ;
        TEXT [ finnish ] = "** Virheelliset sulkeet **" ;
        TEXT [ danish ] = "** Forkert brug af parenteser **" ;
        TEXT [ french ] = "** Erreur de parenthèses **" ;
        TEXT [ swedish ] = "** Felaktig användning av parenteser **" ;
        TEXT [ dutch ] = "** Foutief gebruik van haakjes **" ;
        TEXT [ spanish ] = "** Error de paréntesis **" ;
        TEXT [ english_us ] = "** Wrong use of brackets **" ;
        TEXT = "** Fehlerhafte Klammerung **" ;
        TEXT[ chinese_simplified ] = "** ´íÎóµÄÀ¨ºÅ **";
        TEXT[ russian ] = "** Íåïðàâèëüíîå ïðèìåíåíèå ñêîáîê **";
        TEXT[ polish ] = "** Nieprawid³owo u¿yte nawiasy **";
        TEXT[ japanese ] = "**ŒëŽg—p‚Ì‚©‚Á‚±**";
        TEXT[ chinese_traditional ] = "** ¿ù»~ªº¬A¸¹ **";
        TEXT[ arabic ] = "** ÇÓÊÎÏÇã ÇáÃÞæÇÓ ÈÔßá ÎÇØÆ **";
        TEXT[ greek ] = "** ËÜèïò ÷ñÞóç ðáñåíèÝóåùí **";
        TEXT[ korean ] = "**À߸øµÈ °ýÈ£ÀÇ »ç¿ë **";
        TEXT[ turkish ] = "** Hatalý ayraç kullanýmý **";
        TEXT[ language_user1 ] = " ";
    };
    String STR_CALC_POW
    {
        TEXT [ English ] = "** Square function overflow **" ;
        TEXT [ norwegian ] = "+++** Square function overflow **" ;
        TEXT [ italian ] = "** Overflow nella funzione quadrato **" ;
        TEXT [ portuguese_brazilian ] = "** Transbordo de função quadrática **" ;
        TEXT [ portuguese ] = "** Transbordo da função quadrática **" ;
        TEXT [ finnish ] = "** Neliöjuurifunktion ylivuoto **" ;
        TEXT [ danish ] = "** Overløb i kvadratfunktion **" ;
        TEXT [ french ] = "** Dépassement de capacité de la fonction carré**" ;
        TEXT [ swedish ] = "** Spill i kvadratfunktion **" ;
        TEXT [ dutch ] = "** Overflow in kwadraatfunctie **" ;
        TEXT [ spanish ] = "** Desbordamiento en función al cuadrado **" ;
        TEXT [ english_us ] = "** Square function overflow **" ;
        /* ### ACHTUNG: Neuer Text in Resource? ** Überlauf in Quadratfunktion ** : ** šberlauf in Quadratfunktion ** */
        TEXT = "** Überlauf in Quadratfunktion **" ;
        TEXT[ chinese_simplified ] = "** ƽ·½º¯ÊýµÄÒçÖµ **";
        TEXT[ russian ] = "** Ïåðåïîëíåíèå â ôóíêöèè êâàäðàòà **";
        TEXT[ polish ] = "** Przepe³nienie w funkcji kwadratowej **";
        TEXT[ japanese ] = "**ŽlŠpŒ`‹@”\\‚̵°ÊÞ°ÌÛ°**";
        TEXT[ chinese_traditional ] = "** ®Ú¨ç¼Æ·¸­È **";
        TEXT[ arabic ] = "** ÝÇÆÖ Ýí ÇáÏÇáÉ ÇáÊÑÈíÚíÉ **";
        TEXT[ greek ] = "** Õðåñ÷åßëéóç óôç ëåéôïõñãßá ôåôñáãþíïõ **";
        TEXT[ korean ] = "**Á¦°ö ÇÔ¼ö ¿À¹öÇ÷οì **";
        TEXT[ turkish ] = "** Kare fonksiyonu taþmasý **";
        TEXT[ language_user1 ] = " ";
    };
    String STR_CALC_VARNFND
    {
        TEXT [ English ] = "** Variable not found **" ;
        TEXT [ norwegian ] = "** Variabel ikke funnet **" ;
        TEXT [ italian ] = "** Variabile non trovata **" ;
        TEXT [ portuguese_brazilian ] = "** Variável não encontrada **" ;
        TEXT [ portuguese ] = "** Variável não encontrada **" ;
        TEXT [ finnish ] = "** Muuttujaa ei löydy **" ;
        TEXT [ danish ] = "** Variabel blev ikke fundet **" ;
        TEXT [ french ] = "** Variable introuvable **" ;
        TEXT [ swedish ] = "** Variabel hittades inte **" ;
        TEXT [ dutch ] = "** Variabele niet gevonden **" ;
        TEXT [ spanish ] = "** No se ha encontrado la variable **" ;
        TEXT [ english_us ] = "** Variable not found **" ;
        TEXT = "** Variable wurde nicht gefunden **" ;
        TEXT[ chinese_simplified ] = "** ûÓÐÕÒµ½±äÁ¿ **";
        TEXT[ russian ] = "** Ïåðåìåííàÿ íå íàéäåíà **";
        TEXT[ polish ] = "** Zmiennej nie znaleziono **";
        TEXT[ japanese ] = "**•ϐ”‚ªŒ©‚‚©‚è‚Ü‚¹‚ñ**";
        TEXT[ chinese_traditional ] = "** ¨S¦³§ä¨ìÅÜ¼Æ **";
        TEXT[ arabic ] = "** ÊÚÐÑ ÇáÚ辄 Úáì ÇáãÊÛíÑÉ **";
        TEXT[ greek ] = "** Äåí âñÝèçêå ç ìåôáâëçôÞ **";
        TEXT[ korean ] = "**º¯¼ö°¡ ¹ß°ßµÇÁö ¾Ê½À´Ï´Ù. **";
        TEXT[ turkish ] = "** Deðiþken bulunamadý **";
        TEXT[ language_user1 ] = " ";
    };
    String STR_CALC_OVERFLOW
    {
        TEXT [ English ] = "** Overflow **" ;
        TEXT [ norwegian ] = "** Overflow **" ;
        TEXT [ italian ] = "** Overflow **" ;
        TEXT [ portuguese_brazilian ] = "** Transbordo **" ;
        TEXT [ portuguese ] = "** Transbordo **" ;
        TEXT [ finnish ] = "** Ylivuoto **" ;
        TEXT [ danish ] = "** Overløb **" ;
        TEXT [ french ] = "** Dépassement de capacité **" ;
        TEXT [ swedish ] = "** Spill **" ;
        TEXT [ dutch ] = "** Overflow **" ;
        TEXT [ spanish ] = "** Desbordamiento **" ;
        TEXT [ english_us ] = "** Overflow **" ;
        /* ### ACHTUNG: Neuer Text in Resource? ** Überlauf ** : ** šberlauf ** */
        TEXT = "** Überlauf **" ;
        TEXT[ chinese_simplified ] = "** ÒçÖµ **";
        TEXT[ russian ] = "** Ïåðåïîëíåíèå **";
        TEXT[ polish ] = "** Przepe³nienie **";
        TEXT[ japanese ] = "**µ°ÊÞ°ÌÛ°**";
        TEXT[ language_user1 ] = " ";
        TEXT[ chinese_traditional ] = "** ·¸­È **";
        TEXT[ arabic ] = "** ÝÇÆÖ **";
        TEXT[ greek ] = "** Õðåñ÷åßëéóç **";
        TEXT[ korean ] = "** ¿À¹ö Ç÷οì **";
        TEXT[ turkish ] = "** Taþma **";
    };
    String STR_CALC_WRONGTIME
    {
        TEXT [ English ] = "** Wrong timeformat **" ;
        TEXT [ norwegian ] = "** Feil tidsformat **" ;
        TEXT [ italian ] = "** Formato orario errato **" ;
        TEXT [ portuguese_brazilian ] = "** Formato de tempo errado**" ;
        TEXT [ portuguese ] = "** Formato de tempo errado**" ;
        TEXT [ finnish ] = "** Väärä aikamuoto **" ;
        TEXT [ danish ] = "** Forkert tidsformat **" ;
        TEXT [ french ] = "** Format d'heure erroné **" ;
        TEXT [ swedish ] = "** Fel tidsformat **" ;
        TEXT [ dutch ] = "** Foutief tijdformaat **" ;
        TEXT [ spanish ] = "** Formato de hora erróneo **" ;
        TEXT [ english_us ] = "** Wrong time format **" ;
        TEXT = "** Falsches Zeitformat **" ;
        TEXT[ chinese_simplified ] = "** ´íÎóµÄʱ¼ä¸ñʽ **";
        TEXT[ russian ] = "** Íåïðàâèëüíûé ôîðìàò âðåìåíè **";
        TEXT[ polish ] = "** Nieprawid³owy format czasu **";
        TEXT[ japanese ] = "**³‚µ‚­‚È‚¢ŽžŠÔ‚̏‘Ž®**";
        TEXT[ chinese_traditional ] = "** ¿ù»~®É¶¡®æ¦¡ **";
        TEXT[ arabic ] = "** ÊäÓíÞ æÞÊ ÎÇØÆ **";
        TEXT[ greek ] = "** ËÜèïò ìïñöÞ ÷ñüíïõ  **";
        TEXT[ korean ] = "**À߸øµÈ ½Ã°£ ¼­½Ä **";
        TEXT[ turkish ] = "** Yanlýþ zaman formatý **";
        TEXT[ language_user1 ] = " ";
    };
    String STR_CALC_DEFAULT
    {
        TEXT [ English ] = "** Error **" ;
        TEXT [ norwegian ] = "** Feil **" ;
        TEXT [ italian ] = "** Errore **" ;
        TEXT [ portuguese_brazilian ] = "** Erro **" ;
        TEXT [ portuguese ] = "** Erro **" ;
        TEXT [ finnish ] = "** Virhe **" ;
        TEXT [ danish ] = "** Fejl **" ;
        TEXT [ french ] = "** Erreur **" ;
        TEXT [ swedish ] = "** Fel **" ;
        TEXT [ dutch ] = "** Fout **" ;
        TEXT [ spanish ] = "** Error **" ;
        TEXT [ english_us ] = "** Error **" ;
        TEXT = "** Fehler **" ;
        TEXT[ chinese_simplified ] = "**´íÎó **";
        TEXT[ russian ] = "** Îøèáêà **";
        TEXT[ polish ] = "** B³¹d **";
        TEXT[ japanese ] = "**´×°**";
        TEXT[ chinese_traditional ] = "**¿ù»~ **";
        TEXT[ arabic ] = "** ÎØÃ **";
        TEXT[ greek ] = "** ÓöÜëìá **";
        TEXT[ korean ] = "**¿À·ù **";
        TEXT[ turkish ] = "** Hata **";
        TEXT[ language_user1 ] = " ";
    };
    String STR_CALC_ERROR
    {
        TEXT = "** Fehlerhafter Ausdruck **" ;
        TEXT [ English ] = "** Error in expression **" ;
        TEXT [ norwegian ] = "** Error in expression **" ;
        TEXT [ italian ] = "** Errore nell'espressione **" ;
        TEXT [ portuguese_brazilian ] = "** Erro na expressão **" ;
        TEXT [ portuguese ] = "** Expressão errada **" ;
        TEXT [ finnish ] = "** Virhe lausekkeessa **" ;
        TEXT [ danish ] = "** Fejlagtigt udtryk **" ;
        TEXT [ french ] = "** Expression erronée **" ;
        TEXT [ swedish ] = "** Felaktigt uttryck **" ;
        TEXT [ dutch ] = "** Foutieve uitdrukking **" ;
        TEXT [ spanish ] = "** Expresión errónea **" ;
        TEXT [ english_us ] = "** Expression is faulty **" ;
        TEXT[ chinese_simplified ] = "** ´íÎóµÄ±í´ïʽ **";
        TEXT[ russian ] = "** Îøèáêè â âûðàæåíèè **";
        TEXT[ polish ] = "** Nieprawid³owe wyra¿enie **";
        TEXT[ japanese ] = "**ŠÔˆá‚Á‚½•\\Œ»**";
        TEXT[ chinese_traditional ] = "** ¿ù»~ªºªí¹F¦¡ **";
        TEXT[ arabic ] = "** ÊÚÈíÑ ÎÇØÆ **";
        TEXT[ greek ] = "** ÅóöáëìÝíç Ýêöñáóç **";
        TEXT[ korean ] = "**½ÄÀÌ À߸øµÇ¾ú½À´Ï´Ù **";
        TEXT[ turkish ] = "** Yanlýþ ifade **";
        TEXT[ language_user1 ] = " ";
    };
    String STR_GETREFFLD_UP
    {
        TEXT = "oben" ;
        TEXT [ English ] = "above" ;
        Text [ dutch ] = "boven" ;
        Text [ english_us ] = "above" ;
        Text [ italian ] = "Sopra" ;
        Text [ spanish ] = "arriba" ;
        Text [ french ] = "en haut" ;
        Text [ swedish ] = "över" ;
        Text [ danish ] = "foroven" ;
        Text [ portuguese ] = "acima" ;
        Text [ portuguese_brazilian ] = "oben" ;
        Text[ chinese_simplified ] = "ÉÏ";
        Text[ russian ] = "ââåðõó";
        Text[ polish ] = "w górze";
        Text[ japanese ] = "ã";
        Text[ chinese_traditional ] = "¤W";
        Text[ arabic ] = "ÃÚáì";
        Text[ greek ] = "ðÜíù";
        Text[ korean ] = "À§¿¡";
        Text[ turkish ] = "üst";
        Text[ language_user1 ] = " ";
    };
    String STR_GETREFFLD_DOWN
    {
        TEXT = "unten" ;
        TEXT [ English ] = "below" ;
        Text [ dutch ] = "beneden" ;
        Text [ english_us ] = "below" ;
        Text [ italian ] = "Sotto" ;
        Text [ spanish ] = "abajo" ;
        Text [ french ] = "en bas" ;
        Text [ swedish ] = "under" ;
        Text [ danish ] = "forneden" ;
        Text [ portuguese ] = "abaixo" ;
        Text [ portuguese_brazilian ] = "unten" ;
        Text[ chinese_simplified ] = "ÏÂ";
        Text[ russian ] = "âíèçó";
        Text[ polish ] = "w dole";
        Text[ japanese ] = "‰º";
        Text[ chinese_traditional ] = "¤U";
        Text[ arabic ] = "ÃÓÝá";
        Text[ greek ] = "êÜôù";
        Text[ korean ] = "¾Æ·¡";
        Text[ turkish ] = "alt";
        Text[ language_user1 ] = " ";
    };
    String STR_ALLPAGE_HEADFOOT
    {
        TEXT = "Alle" ;
        TEXT [ English ] = "All" ;
        Text [ english_us ] = "All" ;
        Text [ italian ] = "Tutti" ;
        Text [ spanish ] = "Todos" ;
        Text [ french ] = "Tous" ;
        Text [ dutch ] = "alle" ;
        Text [ swedish ] = "Alla" ;
        Text [ danish ] = "Alle" ;
        Text [ portuguese ] = "Todos" ;
        Text [ portuguese_brazilian ] = "Alle" ;
        Text[ chinese_simplified ] = "È«²¿";
        Text[ russian ] = "Âñå";
        Text[ polish ] = "Wszystkie";
        Text[ japanese ] = "‚·‚ׂÄ";
        Text[ chinese_traditional ] = "¥þ³¡";
        Text[ arabic ] = "Çáßá";
        Text[ greek ] = "¼ëá";
        Text[ korean ] = "Àüü";
        Text[ turkish ] = "Tümü";
        Text[ language_user1 ] = " ";
    };
    String STR_TEMPLATE_NONE
    {
        Text = "keine" ;
        Text [ ENGLISH ] = "none" ;
        Text [ dutch ] = "geen" ;
        Text [ english_us ] = "None" ;
        Text [ swedish ] = "ingen" ;
        Text [ danish ] = "Ingen" ;
        Text [ italian ] = "Senza" ;
        Text [ spanish ] = "Ninguno" ;
        Text [ french ] = "Aucun(e)" ;
        Text [ portuguese_brazilian ] = "keine" ;
        Text [ portuguese ] = "Nenhum" ;
        Text[ chinese_simplified ] = "ÎÞ";
        Text[ russian ] = "áåç";
        Text[ polish ] = "brak";
        Text[ japanese ] = "‚È‚µ";
        Text[ chinese_traditional ] = "µL";
        Text[ arabic ] = "ÈÏæä";
        Text[ greek ] = "êáíÝíá";
        Text[ korean ] = "¾øÀ½";
        Text[ turkish ] = "yok";
        Text[ language_user1 ] = " ";
    };
    String STR_FIELD_FIXED
    {
        TEXT = "(fix)" ;
        TEXT [ English ] = "(fix)" ;
        TEXT [ norwegian ] = "(fix)" ;
        TEXT [ italian ] = "(fissa)" ;
        TEXT [ portuguese_brazilian ] = "(fix)" ;
        TEXT [ portuguese ] = "(fixa)" ;
        TEXT [ finnish ] = "(vakio)" ;
        TEXT [ danish ] = "(fast)" ;
        TEXT [ french ] = "(fixe)" ;
        TEXT [ swedish ] = "(fix)" ;
        TEXT [ dutch ] = "(vast)" ;
        TEXT [ spanish ] = "(fija)" ;
        TEXT [ english_us ] = "(fixed)" ;
        TEXT[ chinese_simplified ] = "(¹Ì¶¨)";
        TEXT[ russian ] = "(ôèêñ.)";
        TEXT[ polish ] = "(sta³y)";
        TEXT[ japanese ] = "(•ύX•s‰Â)";
        TEXT[ chinese_traditional ] = "(©T©w)";
        TEXT[ arabic ] = "(ËÇÈÊ)";
        TEXT[ greek ] = "(óôáèåñÜ)";
        TEXT[ korean ] = "(°íÁ¤µÊ)";
        TEXT[ turkish ] = "(sabit)";
        TEXT[ language_user1 ] = " ";
    };
    String STR_TOI
    {
        TEXT = "Stichwortverzeichnis" ;
        TEXT [ English ] = "Index" ;
        TEXT [ norwegian ] = "Stikkordregister" ;
        TEXT [ italian ] = "Indice analitico" ;
        TEXT [ portuguese_brazilian ] = "Índice" ;
        TEXT [ portuguese ] = "Índice remissivo" ;
        TEXT [ finnish ] = "Hakemisto" ;
        TEXT [ danish ] = "Stikordsregister" ;
        TEXT [ french ] = "Index lexical" ;
        TEXT [ swedish ] = "Sakregister" ;
        TEXT [ dutch ] = "Index" ;
        TEXT [ spanish ] = "Índice alfabético" ;
        TEXT [ english_us ] = "Alphabetical Index" ;
        TEXT[ chinese_simplified ] = "Ë÷Òý";
        TEXT[ russian ] = "Ïðåäìåòíûé óêàçàòåëü";
        TEXT[ polish ] = "Zestaw hase³";
        TEXT[ japanese ] = "õˆø";
        TEXT[ chinese_traditional ] = "¯Á¤Þ¥Ø¿ý";
        TEXT[ arabic ] = "ÝåÑÓ ÃÈÌÏí";
        TEXT[ greek ] = "ÅõñåôÞñéï ëÝîåùí";
        TEXT[ korean ] = "¾ËÆÄºª¼øÀÇ »öÀÎ";
        TEXT[ turkish ] = "Alfabetik dizin";
        TEXT[ language_user1 ] = " ";
    };

    String STR_TOU
    {
        TEXT = "Benutzerdefiniert" ;
        TEXT [ English ] = "User-defined" ;
        TEXT [ norwegian ] = "Brukerdefinert tabell for" ;
        TEXT [ italian ] = "Indice personalizzato" ;
        TEXT [ portuguese_brazilian ] = "Tabela definida pelo usuário de" ;
        TEXT [ portuguese ] = "Personalizado" ;
        TEXT [ finnish ] = "Käyttäjän määrittämä taulukko: " ;
        TEXT [ danish ] = "Brugerdefineret" ;
        TEXT [ french ] = "Index personnalisé" ;
        TEXT [ swedish ] = "Användardefinierad" ;
        TEXT [ dutch ] = "Gebruikersindex" ;
        TEXT [ spanish ] = "Índice del usuario" ;
        TEXT [ english_us ] = "User-Defined" ;
        TEXT[ chinese_simplified ] = "ʹÓÃÕß×Ô¶¨";
        TEXT[ russian ] = "Çàäàíî ïîëüçîâàòåëåì";
        TEXT[ polish ] = "Zdefiniowany przez u¿ytkownika";
        TEXT[ japanese ] = "Õ°»Þ°’è‹`";
        TEXT[ chinese_traditional ] = "¦Û­q";
        TEXT[ arabic ] = "ãõÚÑøóÝ ãä ÞÈá ÇáãÓÊÎÏã";
        TEXT[ greek ] = "ÏñéóìÝíï áðü ÷ñÞóôç";
        TEXT[ korean ] = "»ç¿ëÀÚ Á¤ÀÇ »öÀÎ";
        TEXT[ turkish ] = "Kullanýcý tanýmlý";
        TEXT[ language_user1 ] = " ";
    };

    String STR_TOC
    {
        TEXT = "Inhaltsverzeichnis" ;
        TEXT [ English ] = "Table of contents" ;
        TEXT [ norwegian ] = "Innholdsfortegnelse" ;
        TEXT [ italian ] = "Indice generale" ;
        TEXT [ portuguese_brazilian ] = "Tabela de conteúdos" ;
        TEXT [ portuguese ] = "Índice geral" ;
        TEXT [ finnish ] = "Sisällysluettelo" ;
        TEXT [ danish ] = "Indholdsfortegnelse" ;
        TEXT [ french ] = "Table des matières" ;
        TEXT [ swedish ] = "Innehållsförteckning" ;
        TEXT [ dutch ] = "Inhoudsopgave" ;
        TEXT [ spanish ] = "Índice de contenido" ;
        TEXT [ english_us ] = "Table of Contents" ;
        TEXT[ chinese_simplified ] = "ÄÚÈÝĿ¼";
        TEXT[ language_user1 ] = " ";
        TEXT[ russian ] = "Îãëàâëåíèå";
        TEXT[ polish ] = "Spis treœci";
        TEXT[ japanese ] = "–ÚŽŸ";
        TEXT[ chinese_traditional ] = "¤º®e¥Ø¿ý";
        TEXT[ arabic ] = "ÝåÑÓ ÇáãÍÊæíÇÊ";
        TEXT[ greek ] = "ÊáôÜëïãïò ðåñéå÷ïìÝíùí";
        TEXT[ korean ] = "³»¿ë Ç¥";
        TEXT[ turkish ] = "Ýçindekiler dizini";
    };

    String STR_TOX_AUTH
    {
        TEXT = "Literaturverzeichnis" ;
        TEXT [ English ] = "Table of authorities" ;
        TEXT[ english_us ] = "Bibliography";
        TEXT[ portuguese ] = "Bibliografia";
        TEXT[ russian ] = "Ñïèñîê ëèòåðàòóðû";
        TEXT[ greek ] = "Âéâëéïãñáößá";
        TEXT[ dutch ] = "Literatuurlijst";
        TEXT[ french ] = "Bibliographie";
        TEXT[ spanish ] = "Bibliografía";
        TEXT[ italian ] = "Bibliografia";
        TEXT[ danish ] = "Litteraturliste";
        TEXT[ swedish ] = "Litteraturförteckning";
        TEXT[ polish ] = "Spis literatury";
        TEXT[ portuguese_brazilian ] = "Table of authorities";
        TEXT[ japanese ] = "ŽQl•¶Œ£•\\";
        TEXT[ korean ] = "Âü°í¹®Çå";
        TEXT[ chinese_simplified ] = "ÎÄÏ×Ŀ¼";
        TEXT[ chinese_traditional ] = "¤åÄm¥Ø¿ý";
        TEXT[ arabic ] = "ÝåÑÓ ÇáãÑÇÌÚ";
        TEXT[ turkish ] = "Kaynakça dizini";
        TEXT[ language_user1 ] = " ";
    };
    String STR_TOX_TBL
    {
        TEXT = "Tabellenverzeichnis" ;
        TEXT [ English ] = "Table of tables" ;
        TEXT[ english_us ] = "Index of Tables";
        TEXT[ portuguese ] = "Índice de tabelas";
        TEXT[ russian ] = "Ñïèñîê òàáëèö";
        TEXT[ greek ] = "ÅõñåôÞñéï ðéíÜêùí";
        TEXT[ dutch ] = "Tabellenregister";
        TEXT[ french ] = "Index des tables";
        TEXT[ spanish ] = "Índice de tablas";
        TEXT[ italian ] = "Indice delle tabelle";
        TEXT[ danish ] = "Tabeloversigt";
        TEXT[ swedish ] = "Tabellförteckning";
        TEXT[ polish ] = "Spis tabel";
        TEXT[ portuguese_brazilian ] = "Table of tables";
        TEXT[ japanese ] = "•\\‚̍õˆø";
        TEXT[ korean ] = "Ç¥ »öÀÎ";
        TEXT[ chinese_simplified ] = "±í¸ñĿ¼";
        TEXT[ chinese_traditional ] = "ªí®æ¥Ø¿ý";
        TEXT[ arabic ] = "ÝåÑÓ ÇáÌÏÇæá";
        TEXT[ turkish ] = "Tablo dizini";
        TEXT[ language_user1 ] = " ";
    };
    String STR_TOX_OBJ
    {
        TEXT = "Objektverzeichnis" ;
        TEXT [ English ] = "Table of objects" ;
        TEXT[ english_us ] = "Table of Objects";
        TEXT[ portuguese ] = "Índice de objectos";
        TEXT[ russian ] = "Ñïèñîê îáúåêòîâ";
        TEXT[ greek ] = "ÊáôÜëïãïò áíôéêåéìÝíùí";
        TEXT[ dutch ] = "Objectenregister";
        TEXT[ french ] = "Index des objets";
        TEXT[ spanish ] = "Índice de objetos";
        TEXT[ italian ] = "Indice degli oggetti";
        TEXT[ danish ] = "Objektindeks";
        TEXT[ swedish ] = "Objektförteckning";
        TEXT[ polish ] = "Spis obiektów";
        TEXT[ portuguese_brazilian ] = "Table of objects";
        TEXT[ japanese ] = "µÌÞ¼Þª¸Ä‚̍õˆø";
        TEXT[ korean ] = "°³Ã¼ »öÀÎ";
        TEXT[ chinese_simplified ] = "¶ÔÏóĿ¼";
        TEXT[ chinese_traditional ] = "ª«¥ó¥Ø¿ý";
        TEXT[ arabic ] = "ÝåÑÓ ÇáßÇÆäÇÊ";
        TEXT[ turkish ] = "Nesne dizini";
        TEXT[ language_user1 ] = " ";
    };
    String STR_TOX_ILL
    {
        TEXT = "Abbildungsverzeichnis" ;
        TEXT [ English ] = "Table of illustrations" ;
        TEXT[ english_us ] = "Illustration Index";
        TEXT[ portuguese ] = "Índice de ilustrações";
        TEXT[ russian ] = "Ñïèñîê ðèñóíêîâ";
        TEXT[ greek ] = "ÊáôÜëïãïò åéêüíùí";
        TEXT[ dutch ] = "Afbeeldingenregister";
        TEXT[ french ] = "Index des illustrations";
        TEXT[ spanish ] = "Índice de ilustraciones";
        TEXT[ italian ] = "Indice delle illustrazioni";
        TEXT[ danish ] = "Figuroversigt";
        TEXT[ swedish ] = "Illustrationsförteckning";
        TEXT[ polish ] = "Spis ilustracji";
        TEXT[ portuguese_brazilian ] = "Table of illustrations";
        TEXT[ japanese ] = "}‚̍õˆø";
        TEXT[ korean ] = "»ðÈ­ »öÀÎ";
        TEXT[ chinese_simplified ] = "²åͼĿ¼";
        TEXT[ chinese_traditional ] = "´¡¹Ï¥Ø¿ý";
        TEXT[ arabic ] = "ÝåÑÓ ÇáÕæÑ ÇáÅíÖÇÍíÉ";
        TEXT[ turkish ] = "Resim dizini";
        TEXT[ language_user1 ] = " ";
    };


     // SubType DocInfo
     //
    String FLD_DOCINFO_TITEL
    {
        TEXT = "Titel" ;
        TEXT [ English ] = "Title" ;
        TEXT [ norwegian ] = "Tittel" ;
        TEXT [ italian ] = "Titolo" ;
        TEXT [ portuguese_brazilian ] = "Título" ;
        TEXT [ portuguese ] = "Capitulo" ;
        TEXT [ finnish ] = "Otsikko" ;
        TEXT [ danish ] = "Titel" ;
        TEXT [ french ] = "Titre" ;
        TEXT [ swedish ] = "Rubrik" ;
        TEXT [ dutch ] = "Titel" ;
        TEXT [ spanish ] = "Título" ;
        TEXT [ english_us ] = "Title" ;
        TEXT[ chinese_simplified ] = "±êÌâ";
        TEXT[ russian ] = "Çàãëàâèå";
        TEXT[ polish ] = "Tytu³";
        TEXT[ japanese ] = "À²ÄÙ";
        TEXT[ chinese_traditional ] = "¼ÐÃD";
        TEXT[ arabic ] = "ÇáÚäæÇä";
        TEXT[ greek ] = "Ôßôëïò";
        TEXT[ korean ] = "Á¦¸ñ";
        TEXT[ turkish ] = "Baþlýk";
        TEXT[ language_user1 ] = " ";
    };
    String FLD_DOCINFO_THEMA
    {
        TEXT = "Thema" ;
        TEXT [ English ] = "Subject" ;
        TEXT [ norwegian ] = "Emne" ;
        TEXT [ italian ] = "Argomento" ;
        TEXT [ portuguese_brazilian ] = "Assunto" ;
        TEXT [ portuguese ] = "Assunto" ;
        TEXT [ finnish ] = "Aihe" ;
        TEXT [ danish ] = "Emne" ;
        TEXT [ french ] = "Sujet" ;
        TEXT [ swedish ] = "Tema" ;
        TEXT [ dutch ] = "Onderwerp" ;
        TEXT [ spanish ] = "Tema" ;
        TEXT [ english_us ] = "Subject" ;
        TEXT[ chinese_simplified ] = "Ö÷Ìâ";
        TEXT[ russian ] = "Òåìà";
        TEXT[ polish ] = "Temat";
        TEXT[ japanese ] = "ðÏ";
        TEXT[ chinese_traditional ] = "¥DÃD";
        TEXT[ arabic ] = "ÇáãæÖæÚ";
        TEXT[ greek ] = "ÈÝìá";
        TEXT[ korean ] = "ÁÖÁ¦";
        TEXT[ turkish ] = "Konu";
        TEXT[ language_user1 ] = " ";
    };
    String FLD_DOCINFO_KEYS
    {
        /* ### ACHTUNG: Neuer Text in Resource? Schlüsselwörter : Schl³sselw÷rter */
        TEXT = "Schlüsselwörter" ;
        TEXT [ English ] = "Keywords" ;
        TEXT [ norwegian ] = "Nøkkelord" ;
        TEXT [ italian ] = "Parole chiave" ;
        TEXT [ portuguese_brazilian ] = "Palavras-chave" ;
        TEXT [ portuguese ] = "Palavras-chave" ;
        TEXT [ finnish ] = "Avainsanat" ;
        TEXT [ danish ] = "Nøgleord" ;
        TEXT [ french ] = "Mots-clés" ;
        TEXT [ swedish ] = "Nyckelord" ;
        TEXT [ dutch ] = "Sleutelwoorden" ;
        TEXT [ spanish ] = "Palabras clave" ;
        TEXT [ english_us ] = "Keywords" ;
        TEXT[ chinese_simplified ] = "¹Ø¼ü×Ö";
        TEXT[ russian ] = "Êëþ÷åâûå ñëîâà";
        TEXT[ polish ] = "S³owa kluczowe";
        TEXT[ japanese ] = "·°Ü°ÄÞ";
        TEXT[ chinese_traditional ] = "ÃöÁä¦r";
        TEXT[ arabic ] = "ÇáßáãÇÊ ÇáÃÓÇÓíÉ";
        TEXT[ greek ] = "ËÝîåéò êëåéäéÜ";
        TEXT[ korean ] = "Ű ¿öµå";
        TEXT[ turkish ] = "Anahtar sözcük";
        TEXT[ language_user1 ] = " ";
    };
    String FLD_DOCINFO_COMMENT
    {
        TEXT = "Beschreibung" ;
        TEXT [ English ] = "Description" ;
        TEXT [ norwegian ] = "Beskrivelse" ;
        TEXT [ italian ] = "Descrizione" ;
        TEXT [ portuguese_brazilian ] = "Descrição" ;
        TEXT [ portuguese ] = "Descrição" ;
        TEXT [ finnish ] = "Kuvaus" ;
        TEXT [ danish ] = "Beskrivelse" ;
        TEXT [ french ] = "Description" ;
        TEXT [ swedish ] = "Beskrivning" ;
        TEXT [ dutch ] = "Beschrijving" ;
        TEXT [ spanish ] = "Descripción" ;
        TEXT [ english_us ] = "Description" ;
        TEXT[ chinese_simplified ] = "˵Ã÷";
        TEXT[ russian ] = "Îïèñàíèå";
        TEXT[ polish ] = "Opis";
        TEXT[ japanese ] = "ºÒÝÄ";
        TEXT[ chinese_traditional ] = "´y­z";
        TEXT[ arabic ] = "ÇáæÕÝ";
        TEXT[ greek ] = "ÐåñéãñáöÞ";
        TEXT[ korean ] = "¼³¸í";
        TEXT[ turkish ] = "Taným";
        TEXT[ language_user1 ] = " ";
    };
    String FLD_DOCINFO_INFO1
    {
        TEXT = "Info 0" ;
        TEXT [ English ] = "Info 0" ;
        TEXT [ norwegian ] = "Info 0" ;
        TEXT [ italian ] = "Info 0" ;
        TEXT [ portuguese_brazilian ] = "Informação 0" ;
        TEXT [ portuguese ] = "Informação 0" ;
        TEXT [ finnish ] = "Tieto 0" ;
        TEXT [ danish ] = "Info 0" ;
        TEXT [ french ] = "Info 0" ;
        TEXT [ swedish ] = "Info 0" ;
        TEXT [ dutch ] = "Info 0" ;
        TEXT [ spanish ] = "Info 0" ;
        TEXT [ english_us ] = "Info 0" ;
        TEXT[ chinese_simplified ] = "ÐÅÏ¢ 0";
        TEXT[ russian ] = "Èíôî 0";
        TEXT[ polish ] = "Informacja 0";
        TEXT[ japanese ] = "î•ñ 0";
        TEXT[ chinese_traditional ] = "¸ê°T 0";
        TEXT[ arabic ] = "ãÚáæãÉ 0";
        TEXT[ greek ] = "Ðëçñïöïñßåò 0";
        TEXT[ korean ] = "Á¤º¸ 0";
        TEXT[ turkish ] = "Bilgi 0";
        TEXT[ language_user1 ] = " ";
    };
    String FLD_DOCINFO_INFO2
    {
        TEXT = "Info 1" ;
        TEXT [ English ] = "Info 1" ;
        TEXT [ norwegian ] = "Info 1" ;
        TEXT [ italian ] = "Info 1" ;
        TEXT [ portuguese_brazilian ] = "Informação 1" ;
        TEXT [ portuguese ] = "Informação 1" ;
        TEXT [ finnish ] = "Tieto 1" ;
        TEXT [ danish ] = "Info 1" ;
        TEXT [ french ] = "Info 1" ;
        TEXT [ swedish ] = "Info 1" ;
        TEXT [ dutch ] = "Info 1" ;
        TEXT [ spanish ] = "Info 1" ;
        TEXT [ english_us ] = "Info 1" ;
        TEXT[ chinese_simplified ] = "ÐÅÏ¢ 1";
        TEXT[ russian ] = "Èíôî 1";
        TEXT[ polish ] = "Informacja 1";
        TEXT[ japanese ] = "î•ñ 1";
        TEXT[ chinese_traditional ] = "¸ê°T 1";
        TEXT[ arabic ] = "ãÚáæãÉ 1";
        TEXT[ greek ] = "Ðëçñïöïñßåò 1";
        TEXT[ korean ] = "Á¤º¸ 1";
        TEXT[ turkish ] = "Bilgi 1";
        TEXT[ language_user1 ] = " ";
    };
    String FLD_DOCINFO_INFO3
    {
        TEXT = "Info 2" ;
        TEXT [ English ] = "Info 2" ;
        TEXT [ norwegian ] = "Info 2" ;
        TEXT [ italian ] = "Info 2" ;
        TEXT [ portuguese_brazilian ] = "Informação 2" ;
        TEXT [ portuguese ] = "Informação 2" ;
        TEXT [ finnish ] = "Tieto 2" ;
        TEXT [ danish ] = "Info 2" ;
        TEXT [ french ] = "Info 2" ;
        TEXT [ swedish ] = "Info 2" ;
        TEXT [ dutch ] = "Info 2" ;
        TEXT [ spanish ] = "Info 2" ;
        TEXT [ english_us ] = "Info 2" ;
        TEXT[ chinese_simplified ] = "ÐÅÏ¢ 2";
        TEXT[ russian ] = "Èíôî 2";
        TEXT[ polish ] = "Informacja 2";
        TEXT[ japanese ] = "î•ñ 2";
        TEXT[ chinese_traditional ] = "¸ê°T 2";
        TEXT[ arabic ] = "ãÚáæãÉ 2";
        TEXT[ greek ] = "Ðëçñïöïñßåò 2";
        TEXT[ korean ] = "Á¤º¸ 2";
        TEXT[ turkish ] = "Bilgi 2";
        TEXT[ language_user1 ] = " ";
    };
    String FLD_DOCINFO_INFO4
    {
        TEXT = "Info 3" ;
        TEXT [ English ] = "Info 3" ;
        TEXT [ norwegian ] = "Info 3" ;
        TEXT [ italian ] = "Info 3" ;
        TEXT [ portuguese_brazilian ] = "Informação 3" ;
        TEXT [ portuguese ] = "Informação 3" ;
        TEXT [ finnish ] = "Tieto 3" ;
        TEXT [ danish ] = "Info 3" ;
        TEXT [ french ] = "Info 3" ;
        TEXT [ swedish ] = "Info 3" ;
        TEXT [ dutch ] = "Info 3" ;
        TEXT [ spanish ] = "Info 3" ;
        TEXT [ english_us ] = "Info 3" ;
        TEXT[ chinese_simplified ] = "ÐÅÏ¢ 3";
        TEXT[ russian ] = "Èíôî 3";
        TEXT[ polish ] = "Informacja 3";
        TEXT[ japanese ] = "î•ñ 3";
        TEXT[ chinese_traditional ] = "¸ê°T 3";
        TEXT[ arabic ] = "ãÚáæãÉ 3";
        TEXT[ greek ] = "Ðëçñïöïñßåò 3";
        TEXT[ korean ] = "Á¤º¸ 3";
        TEXT[ turkish ] = "Bilgi 3";
        TEXT[ language_user1 ] = " ";
    };
    String FLD_DOCINFO_CREATE
    {
        TEXT = "Erzeugung" ;
        TEXT [ English ] = "Created" ;
        TEXT [ norwegian ] = "Laget" ;
        TEXT [ italian ] = "Creato" ;
        TEXT [ portuguese_brazilian ] = "Criado" ;
        TEXT [ portuguese ] = "Criado" ;
        TEXT [ finnish ] = "Luotu" ;
        TEXT [ danish ] = "Oprettet" ;
        TEXT [ french ] = "Création" ;
        TEXT [ swedish ] = "Skapad" ;
        TEXT [ dutch ] = "Gemaakt" ;
        TEXT [ spanish ] = "Creación" ;
        TEXT [ english_us ] = "Created" ;
        TEXT[ chinese_simplified ] = "½¨Á¢";
        TEXT[ russian ] = "Ñîçäàíèå";
        TEXT[ polish ] = "Utworzenie";
        TEXT[ japanese ] = "ì¬";
        TEXT[ chinese_traditional ] = "¥Í¦¨";
        TEXT[ arabic ] = "ÅäÔÇÁ";
        TEXT[ greek ] = "Äçìéïõñãßá";
        TEXT[ korean ] = "¸¸µé¾îÁ³½À´Ï´Ù.";
        TEXT[ turkish ] = "Oluþturma";
        TEXT[ language_user1 ] = " ";
    };
    String FLD_DOCINFO_CHANGE
    {
        /* ### ACHTUNG: Neuer Text in Resource? Änderung : Žnderung */
        TEXT = "Änderung" ;
        TEXT [ English ] = "Changed" ;
        TEXT [ norwegian ] = "Endret" ;
        TEXT [ italian ] = "Modifica" ;
        TEXT [ portuguese_brazilian ] = "Modificado" ;
        TEXT [ portuguese ] = "Alteração" ;
        TEXT [ finnish ] = "Muokattu" ;
        TEXT [ danish ] = "Ændring" ;
        TEXT [ french ] = "Modification" ;
        TEXT [ swedish ] = "Ändring" ;
        TEXT [ dutch ] = "Wijziging" ;
        TEXT [ spanish ] = "Modificación" ;
        TEXT [ english_us ] = "Modified" ;
        TEXT[ chinese_simplified ] = "¸ü¸Ä";
        TEXT[ russian ] = "Èçìåíåíèå";
        TEXT[ polish ] = "Modyfikacja";
        TEXT[ japanese ] = "•ύX";
        TEXT[ chinese_traditional ] = "Åܧó";
        TEXT[ arabic ] = "ÊÚÏíá";
        TEXT[ greek ] = "ÁëëáãÞ";
        TEXT[ korean ] = "¼öÁ¤µÊ";
        TEXT[ turkish ] = "Deðiþtirme";
        TEXT[ language_user1 ] = " ";
    };
    String FLD_DOCINFO_PRINT
    {
        TEXT = "Letzter Druck" ;
        TEXT [ English ] = "Printed" ;
        TEXT [ norwegian ] = "Skrevet ut" ;
        TEXT [ italian ] = "Ultima stampa" ;
        TEXT [ portuguese_brazilian ] = "Impresso" ;
        TEXT [ portuguese ] = "Última impressão" ;
        TEXT [ finnish ] = "Tulostettu" ;
        TEXT [ danish ] = "Sidste udskrift" ;
        TEXT [ french ] = "Dernière impression" ;
        TEXT [ swedish ] = "Senaste utskrift" ;
        TEXT [ dutch ] = "Laatste afdruk" ;
        TEXT [ spanish ] = "Última impresión" ;
        TEXT [ english_us ] = "Last printed" ;
        TEXT[ chinese_simplified ] = "ÉÏÒ»´Î´òÓ¡";
        TEXT[ russian ] = "Ïîñëåäíÿÿ ðàñïå÷àòêà";
        TEXT[ polish ] = "Ostatni wydruk";
        TEXT[ japanese ] = "ÅŒã‚É‚µ‚½ˆóü";
        TEXT[ chinese_traditional ] = "¤W¤@¦¸¦C¦L";
        TEXT[ arabic ] = "ÇáØÈÇÚÉ ÇáÃÎíÑÉ";
        TEXT[ greek ] = "Ôåëåõôáßá åêôýðùóç";
        TEXT[ korean ] = "¸¶Áö¸· Àμâ";
        TEXT[ turkish ] = "Son yazdýrma";
        TEXT[ language_user1 ] = " ";
    };
    String FLD_DOCINFO_DOCNO
    {
        TEXT = "Dokumentnummer" ;
        TEXT [ English ] = "Document number" ;
        Text [ dutch ] = "Documentnummer" ;
        Text [ english_us ] = "Document number" ;
        Text [ italian ] = "Numero di documento" ;
        Text [ spanish ] = "Número del documento" ;
        Text [ french ] = "Numéro du document" ;
        Text [ swedish ] = "Dokumentnummer" ;
        Text [ danish ] = "Dokumentnummer" ;
        Text [ portuguese ] = "Número do documento" ;
        Text [ portuguese_brazilian ] = "Dokumentnummer" ;
        Text[ chinese_simplified ] = "ÎĵµºÅÂë";
        Text[ russian ] = "Íîìåð äîêóìåíòà";
        Text[ polish ] = "Numer dokumentu";
        Text[ japanese ] = "ÄÞ·­ÒÝĔԍ†";
        Text[ chinese_traditional ] = "¤å¥ó¸¹½X";
        Text[ arabic ] = "ÑÞã ÇáãÓÊäÏ";
        Text[ greek ] = "Áñéèìüò åããñÜöïõ";
        Text[ korean ] = "¹®¼­ ¹øÈ£";
        Text[ turkish ] = "Belge numarasý";
        Text[ language_user1 ] = " ";
    };
    String FLD_DOCINFO_EDIT
    {
        TEXT = "Bearbeitungszeit" ;
        TEXT [ English ] = "Edit time" ;
        Text [ english_us ] = "Editing time" ;
        Text [ italian ] = "Tempo di modifica" ;
        Text [ spanish ] = "Tiempo de edición" ;
        Text [ french ] = "Durée d'édition" ;
        Text [ dutch ] = "Bewerkingstijd" ;
        Text [ swedish ] = "Redigeringstid" ;
        Text [ danish ] = "Redigeringstid" ;
        Text [ portuguese ] = "Tempo de edição" ;
        Text [ portuguese_brazilian ] = "Bearbeitungszeit" ;
        Text[ chinese_simplified ] = "±à¼­Ê±¼ä";
        Text[ russian ] = "Âðåìÿ îáðàáîòêè";
        Text[ polish ] = "Czas edycji";
        Text[ japanese ] = "•ҏWŽžŠÔ";
        Text[ chinese_traditional ] = "½s¿è®É¶¡";
        Text[ arabic ] = "æÞÊ ÇáÊÍÑíÑ";
        Text[ greek ] = "×ñüíïò åðåîåñãáóßáò";
        Text[ korean ] = "ÆíÁý ½Ã°£";
        Text[ turkish ] = "Düzenleme süresi";
        Text[ language_user1 ] = " ";
    };
    BITMAP BMP_FRAME_ANCHOR { FILE = "anchor.bmp" ; };
    BITMAP BMP_FRAME_DRAG_ANCHOR { FILE = "danchor.bmp" ; };
};

String STR_AUTH_TYPE_ARTICLE
{
    Text = "Zeitschriftenartikel" ;
    Text [ ENGLISH ] = "Article" ;
    Text[ english_us ] = "Magazine Article";
    Text[ portuguese ] = "Artigo de revista";
    Text[ russian ] = "Ñòàòüÿ èç ãàçåòû/æóðíàëà";
    Text[ greek ] = "¢ñèñï ðåñéïäéêïý";
    Text[ dutch ] = "Krantenartikel";
    Text[ french ] = "Article (revue)";
    Text[ spanish ] = "Artículo de revista";
    Text[ italian ] = "Articolo di rivista";
    Text[ danish ] = "Tidsskriftsartikel";
    Text[ swedish ] = "Tidskriftsartikel";
    Text[ polish ] = "Artyku³ czasopisma";
    Text[ portuguese_brazilian ] = "Article";
    Text[ japanese ] = "ŽGŽ‹LŽ–";
    Text[ korean ] = "ÀâÁö ±â»ç";
    Text[ chinese_simplified ] = "ÔÓÖ¾ÎÄÕÂ";
    Text[ chinese_traditional ] = "Âø§Ó¤å³¹";
    Text[ arabic ] = "ãÞÇáÉ ãÌáÉ";
    Text[ turkish ] = "Dergi makalesi";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_TYPE_BOOK
{
    Text = "Buch" ;
    Text [ ENGLISH ] = "Book" ;
    Text[ english_us ] = "Book";
    Text[ portuguese ] = "Livro";
    Text[ russian ] = "Êíèãà";
    Text[ greek ] = "Âéâëßï";
    Text[ dutch ] = "Boek";
    Text[ french ] = "Livre";
    Text[ spanish ] = "Libro";
    Text[ italian ] = "Libro";
    Text[ danish ] = "Bog";
    Text[ swedish ] = "Bok";
    Text[ polish ] = "Ksi¹¿ka";
    Text[ portuguese_brazilian ] = "Book";
    Text[ japanese ] = "–{";
    Text[ korean ] = "å";
    Text[ chinese_simplified ] = "Êé¼®";
    Text[ chinese_traditional ] = "®ÑÄy";
    Text[ arabic ] = "ßÊÇÈ";
    Text[ turkish ] = "Kitap";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_TYPE_BOOKLET
{
    Text = "Broschüre" ;
    Text [ ENGLISH ] = "Booklet" ;
    Text[ english_us ] = "Brochures";
    Text[ portuguese ] = "Brochura";
    Text[ russian ] = "Áðîøþðà";
    Text[ greek ] = "Ìðñïóïýñá";
    Text[ dutch ] = "Brochure";
    Text[ french ] = "Brochure";
    Text[ spanish ] = "Folleto";
    Text[ italian ] = "Dépliant";
    Text[ danish ] = "Brochure";
    Text[ swedish ] = "Broschyr";
    Text[ polish ] = "Broszura";
    Text[ portuguese_brazilian ] = "Booklet";
    Text[ japanese ] = "ÊßÝÌÚ¯Ä";
    Text[ korean ] = "ÆÊÇ÷¿";
    Text[ chinese_simplified ] = "С²á×Ó";
    Text[ chinese_traditional ] = "¤p¤â¥U";
    Text[ arabic ] = "ßõÊíÈ";
    Text[ turkish ] = "Broþür";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_TYPE_CONFERENCE
{
    Text = "Konferenzbericht" ;
    Text [ ENGLISH ] = "Conference report" ;
    Text[ english_us ] = "Conference proceedings";
    Text[ portuguese ] = "Relatório de conferência";
    Text[ russian ] = "Ïðîòîêîë ñîâåùàíèÿ";
    Text[ greek ] = "ÁíáöïñÜ óýóêåøçò";
    Text[ dutch ] = "Conferentierapport";
    Text[ french ] = "Rapport de conférence";
    Text[ spanish ] = "Informe de conferencia";
    Text[ italian ] = "Rapporto sulla conferenza";
    Text[ danish ] = "Konferencerapport";
    Text[ swedish ] = "Konferensrapport";
    Text[ polish ] = "Sprawozdanie z konferencji";
    Text[ portuguese_brazilian ] = "Conference report";
    Text[ japanese ] = "‰ï‹c•ñ";
    Text[ korean ] = "ȸÀÇ ÀýÂ÷";
    Text[ chinese_simplified ] = "ÌÖÂۻᱨ¸æ";
    Text[ chinese_traditional ] = "·|½Í³ø§i";
    Text[ arabic ] = "ÊÞÑíÑ Úä ãÄÊãÑ";
    Text[ turkish ] = "Toplantý raporu";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_TYPE_INBOOK
{
    Text = "Buchauszug" ;
    Text [ ENGLISH ] = "Book extract" ;
    Text[ english_us ] = "Book excerpt";
    Text[ portuguese ] = "Extracto de livro";
    Text[ russian ] = "Âûïèñêà èç êíèãè";
    Text[ greek ] = "Áðüóðáóìá âéâëßïõ";
    Text[ dutch ] = "Boekuittreksel";
    Text[ french ] = "Extrait de livre";
    Text[ spanish ] = "Extracto de libro";
    Text[ italian ] = "Brano";
    Text[ danish ] = "Boguddrag";
    Text[ swedish ] = "Bokutdrag";
    Text[ polish ] = "Wyci¹g z ksi¹¿ki";
    Text[ portuguese_brazilian ] = "Book extract";
    Text[ japanese ] = "´–{";
    Text[ korean ] = "¹ßÃé";
    Text[ chinese_simplified ] = "Ê鼮ժ¼ÎÄ";
    Text[ chinese_traditional ] = "®ÑÄyªº¤Þ¥Î¤å";
    Text[ arabic ] = "ãÞÊÈÓÇÊ ãä ßÊÇÈ";
    Text[ turkish ] = "Kitap bölümü";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_TYPE_INCOLLECTION
{
    Text = "Buchauszug mit Titel" ;
    Text [ ENGLISH ] = "Book extract with title" ;
    Text[ english_us ] = "Book excerpt with title";
    Text[ portuguese ] = "Extracto do livro com título";
    Text[ russian ] = "Âûïèñêà èç êíèãè ñ íàçâàíèåì";
    Text[ greek ] = "Áðüóðáóìá âéâëßïõ ìå ôßôëï";
    Text[ dutch ] = "Boekuittreksel met titel";
    Text[ french ] = "Extrait de livre avec titre";
    Text[ spanish ] = "Extracto de libro con título";
    Text[ italian ] = "Brano con titolo";
    Text[ danish ] = "Boguddrag med titel";
    Text[ swedish ] = "Bokutdrag med titel";
    Text[ polish ] = "Wyci¹g z ksi¹¿ki z tytu³em";
    Text[ portuguese_brazilian ] = "Book extract with title";
    Text[ japanese ] = "À²Äٕt‚«‚̏´–{";
    Text[ korean ] = "Á¦¸ñÀÌ Àִ å¹ßÃé";
    Text[ chinese_simplified ] = "×¢Ã÷±êÌâµÄÊ鼮ժ¼ÎÄ";
    Text[ chinese_traditional ] = "ª`©ú¼ÐÃDªº®ÑÄy¤Þ¥Î¤å";
    Text[ arabic ] = "ãÞÊÈÓÇÊ ãä ßÊÇÈ ÐÇÊ ÚäæÇä";
    Text[ turkish ] = "Baþlýklý kitap bölümü";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_TYPE_INPROCEEDINGS
{
    Text = "Tagungsbericht" ;
    Text [ ENGLISH ] = "Proceedings report" ;
    Text[ english_us ] = "Conference proceedings";
    Text[ portuguese ] = "Relatório sobre reunião";
    Text[ russian ] = "Îò÷åò çàñåäàíèÿ";
    Text[ greek ] = "Ðñùôüêïëëï óõíåäñßáóçò";
    Text[ dutch ] = "Notulen van vergadering";
    Text[ french ] = "Rapport de congrès";
    Text[ spanish ] = "Informe de reunión";
    Text[ italian ] = "Rapporto sulla conferenza";
    Text[ danish ] = "Kongresberetning";
    Text[ swedish ] = "Konferensrapport";
    Text[ polish ] = "Sprawozdanie z obrady";
    Text[ portuguese_brazilian ] = "Proceedings report";
    Text[ japanese ] = "‰ï•ñ";
    Text[ korean ] = "ȸÀÇ ÀýÂ÷";
    Text[ chinese_simplified ] = "»áÒ鱨¸æ";
    Text[ chinese_traditional ] = "·|ij³ø§i";
    Text[ arabic ] = "ÈÑæÊæßæá ÇÌÊãÇÚ";
    Text[ turkish ] = "Konferans raporu";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_TYPE_JOURNAL
{
    Text = "Zeitschrift" ;
    Text [ ENGLISH ] = "Journal" ;
    Text[ english_us ] = "Magazine";
    Text[ portuguese ] = "Revista";
    Text[ russian ] = "Æóðíàë";
    Text[ greek ] = "Ðåñéïäéêü";
    Text[ dutch ] = "Tijdschrift";
    Text[ french ] = "Revue";
    Text[ spanish ] = "Revista";
    Text[ italian ] = "Rivista";
    Text[ danish ] = "Tidsskrift";
    Text[ swedish ] = "Tidskrift";
    Text[ polish ] = "Czasopismo";
    Text[ portuguese_brazilian ] = "Journal";
    Text[ japanese ] = "ŽGŽ";
    Text[ korean ] = "ÀâÁö";
    Text[ chinese_simplified ] = "ÔÓÖ¾";
    Text[ chinese_traditional ] = "Âø§Ó";
    Text[ arabic ] = "ãÌáÉ";
    Text[ turkish ] = "Dergi";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_TYPE_MANUAL
{
    Text = "Techn. Dokumentation" ;
    Text [ ENGLISH ] = "Manual" ;
    Text[ english_us ] = "Techn. documentation";
    Text[ portuguese ] = "Documentação técn.";
    Text[ russian ] = "Òåõíè÷åñêàÿ äîêóìåíòàöèÿ";
    Text[ greek ] = "Ôå÷íéêü åã÷åéñßäéï";
    Text[ dutch ] = "Technische documentatie";
    Text[ french ] = "Documentation technique";
    Text[ spanish ] = "Manual";
    Text[ italian ] = "Documentazione tecnica";
    Text[ danish ] = "Teknisk dokumentation";
    Text[ swedish ] = "Teknisk dokumentation";
    Text[ polish ] = "Dokumentacja techn.";
    Text[ portuguese_brazilian ] = "Manual";
    Text[ japanese ] = "ÏÆ­±Ù";
    Text[ korean ] = "±â¼ú ¹®¼­";
    Text[ chinese_simplified ] = "¼¼ÊõÎÄÏ×";
    Text[ chinese_traditional ] = "§Þ³N¤åÄm";
    Text[ arabic ] = "Ïáíá ÇÓÊÎÏÇã";
    Text[ turkish ] = "Teknik dokümantasyon";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_TYPE_MASTERSTHESIS
{
    Text = "Diplomarbeit" ;
    Text [ ENGLISH ] = "Masters thesis" ;
    Text[ english_us ] = "Thesis";
    Text[ portuguese ] = "Tese de licenciatura";
    Text[ russian ] = "Äèïëîìíàÿ ðàáîòà";
    Text[ greek ] = "ÄéðëùìáôéêÞ åñãáóßá";
    Text[ dutch ] = "Scriptie";
    Text[ french ] = "Mémoire";
    Text[ spanish ] = "Diplomatura";
    Text[ italian ] = "Tesi di laurea";
    Text[ danish ] = "Eksamensopgave";
    Text[ swedish ] = "Examensarbete";
    Text[ polish ] = "Praca dyplomowa";
    Text[ portuguese_brazilian ] = "Masters thesis";
    Text[ japanese ] = "‘²‹Æ˜_•¶";
    Text[ korean ] = "ÇÐÀ§³í¹®";
    Text[ chinese_simplified ] = "´óѧ±ÏÒµÂÛÎÄ";
    Text[ chinese_traditional ] = "²z¤u¬ì¤j¾Ç²¦·~½×¤å";
    Text[ arabic ] = "ÑÓÇáÉ ãÇÌÓÊíÑ";
    Text[ turkish ] = "Tez";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_TYPE_MISC
{
    Text = "Verschiedenes" ;
    Text [ ENGLISH ] = "Miscellaneous" ;
    Text[ english_us ] = "Miscellaneous";
    Text[ portuguese ] = "Miscelânea";
    Text[ russian ] = "Ïðî÷åå";
    Text[ greek ] = "ÄéÜöïñá";
    Text[ dutch ] = "Diverse";
    Text[ french ] = "Divers";
    Text[ spanish ] = "Diversos";
    Text[ italian ] = "Varie";
    Text[ danish ] = "Forskelligt";
    Text[ swedish ] = "Diverse";
    Text[ polish ] = "Ró¿ne";
    Text[ portuguese_brazilian ] = "Miscellaneous";
    Text[ japanese ] = "”õl";
    Text[ korean ] = "¿©·¯°¡Áö";
    Text[ chinese_simplified ] = "ÆäËü";
    Text[ chinese_traditional ] = "¨ä¥L";
    Text[ arabic ] = "ãäæÚÇÊ";
    Text[ turkish ] = "Muhtelif";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_TYPE_PHDTHESIS
{
    Text = "Dissertation" ;
    Text [ ENGLISH ] = "PhD thesis" ;
    Text[ english_us ] = "Dissertation";
    Text[ portuguese ] = "Tese de doutoramento";
    Text[ russian ] = "Äèññåðòàöèÿ";
    Text[ greek ] = "ÄéáôñéâÞ";
    Text[ dutch ] = "Dissertatie";
    Text[ french ] = "Thèse de doctorat";
    Text[ spanish ] = "Tesis doctoral";
    Text[ italian ] = "Dottorato di ricerca";
    Text[ danish ] = "Doktorafhandling";
    Text[ swedish ] = "Doktorsavhandling";
    Text[ polish ] = "Praca doktorska";
    Text[ portuguese_brazilian ] = "PhD thesis";
    Text[ japanese ] = "”ŽŽm˜_•¶";
    Text[ korean ] = "¹Ú»ç ÇÐÀ§ ³í¹®";
    Text[ chinese_simplified ] = "²©Ê¿ÂÛÎÄ";
    Text[ chinese_traditional ] = "³Õ¤h½×¤å";
    Text[ arabic ] = "ÑÓÇáÉ ÏßÊæÑÇå";
    Text[ turkish ] = "Doktora çalýþmasý";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_TYPE_PROCEEDINGS
{
    Text = "Tagungsbericht" ;
    Text [ ENGLISH ] = "Proceedings" ;
    Text[ english_us ] = "Conference proceedings";
    Text[ portuguese ] = "Relatório sobre reunião";
    Text[ russian ] = "Ïðîòîêîë ñîâåùàíèÿ";
    Text[ greek ] = "Ðñùôüêïëëï óõíåäñßáóçò";
    Text[ dutch ] = "Notulen";
    Text[ french ] = "Rapport de congrès";
    Text[ spanish ] = "Informe de reunión";
    Text[ italian ] = "Rapporto sulla conferenza";
    Text[ danish ] = "Kongresberetning";
    Text[ swedish ] = "Konferensrapport";
    Text[ polish ] = "Sprawozdanie z obrady";
    Text[ portuguese_brazilian ] = "Proceedings";
    Text[ japanese ] = "‰ï•ñ";
    Text[ korean ] = "ȸÀÇ ÀýÂ÷";
    Text[ chinese_simplified ] = "»áÒ鱨¸æ";
    Text[ chinese_traditional ] = "·|ij³ø§i";
    Text[ arabic ] = "ÈÑæÊæßæá ÇÌÊãÇÚ";
    Text[ turkish ] = "Konferans raporu";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_TYPE_TECHREPORT
{
    Text = "Forschungsbericht" ;
    Text [ ENGLISH ] = "Technical report" ;
    Text[ english_us ] = "Research report";
    Text[ portuguese ] = "Relatório de investigação";
    Text[ russian ] = "Íàó÷íûé îò÷åò";
    Text[ greek ] = "ÅðéóôçìïíéêÞ Ýñåõíá";
    Text[ dutch ] = "Onderzoeksrapport";
    Text[ french ] = "Rapport de recherche";
    Text[ spanish ] = "Informe de investigación";
    Text[ italian ] = "Rapporto di ricerca";
    Text[ danish ] = "Forskningsrapport";
    Text[ swedish ] = "Forskningsrapport";
    Text[ polish ] = "Sprawozdanie naukowe";
    Text[ portuguese_brazilian ] = "Technical report";
    Text[ japanese ] = "Œ¤‹†•ñ";
    Text[ korean ] = "¿¬±¸ º¸°í¼­";
    Text[ chinese_simplified ] = "¿ÆÑб¨¸æ";
    Text[ chinese_traditional ] = "¬ì¬ã³ø§i";
    Text[ arabic ] = "ÊÞÑíÑ Úä ÚãáíÉ ÇáÈÍË";
    Text[ turkish ] = "Araþtýrma raporu";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_TYPE_UNPUBLISHED
{
    Text = "Unveröffentlicht" ;
    Text [ ENGLISH ] = "Unpublished" ;
    Text[ english_us ] = "Unpublished";
    Text[ portuguese ] = "Inédito";
    Text[ russian ] = "Íåîïóáëèêîâàíî";
    Text[ greek ] = "Áäçìïóßåõôá";
    Text[ dutch ] = "Niet gepubliceerd";
    Text[ french ] = "Non publié";
    Text[ spanish ] = "Inédito";
    Text[ italian ] = "Non pubblicato";
    Text[ danish ] = "Ikke offentliggjort";
    Text[ swedish ] = "Opublicerad";
    Text[ polish ] = "Nieopublikowany";
    Text[ portuguese_brazilian ] = "Unpublished";
    Text[ japanese ] = "–¢”­•\\";
    Text[ korean ] = "ÃâÆÇµÇÁö ¾ÊÀº";
    Text[ chinese_simplified ] = "δ·¢±íµÄ";
    Text[ chinese_traditional ] = "©|¥¼µoªí";
    Text[ arabic ] = "áã íõäÔÑ ÈÚÏ";
    Text[ turkish ] = "Yayýmlanmamýþ";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_TYPE_EMAIL
{
    Text = "e-Mail" ;
    Text [ ENGLISH ] = "eMail" ;
    Text[ english_us ] = "e-mail";
    Text[ portuguese ] = "e-mail";
    Text[ russian ] = "Ýë.ïî÷òà";
    Text[ greek ] = "e-Mail";
    Text[ dutch ] = "e-mail";
    Text[ french ] = "E-mail";
    Text[ spanish ] = "E-mail";
    Text[ italian ] = "eMail";
    Text[ danish ] = "E-mail";
    Text[ swedish ] = "e-post";
    Text[ polish ] = "e-mail";
    Text[ portuguese_brazilian ] = "eMail";
    Text[ japanese ] = "EÒ°Ù";
    Text[ korean ] = "ÀüÀÚ¿ìÆí";
    Text[ chinese_simplified ] = "µç×ÓÓʼþ";
    Text[ chinese_traditional ] = "¹q¤l¶l¥ó";
    Text[ arabic ] = "ÈÑíÏ ÅáßÊÑæäí";
    Text[ turkish ] = "e-posta";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_TYPE_WWW
{
    Text = "WWW-Dokument" ;
    Text [ ENGLISH ] = "WWW document" ;
    Text[ english_us ] = "WWW document";
    Text[ portuguese ] = "Documento WWW";
    Text[ russian ] = "Äîêóìåíò WWW";
    Text[ greek ] = "¸ããñáöï WWW";
    Text[ dutch ] = "WWW document";
    Text[ french ] = "Document WWW";
    Text[ spanish ] = "Documento WWW";
    Text[ italian ] = "Documento Web";
    Text[ danish ] = "WWW-dokument";
    Text[ swedish ] = "WWW-dokument";
    Text[ polish ] = "Dokument WWW";
    Text[ portuguese_brazilian ] = "WWW document";
    Text[ japanese ] = "WWWÄÞ·­ÒÝÄ";
    Text[ korean ] = "WWW ¹®¼­";
    Text[ chinese_simplified ] = "WWW Îĵµ";
    Text[ chinese_traditional ] = "WWW ¤å¥ó";
    Text[ arabic ] = "ãÓÊäÏ æíÈ";
    Text[ turkish ] = "WWW belgesi";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_TYPE_CUSTOM1
{
    Text = "Benutzertyp1" ;
    Text [ ENGLISH ] = "Custom1" ;
    Text[ english_us ] = "User-defined1";
    Text[ portuguese ] = "Utilizador1";
    Text[ russian ] = "Òèï ïîëüçîâàòàëÿ1";
    Text[ greek ] = "Ôýðïò ÷ñÞóôç1";
    Text[ dutch ] = "Gebruikerstype1";
    Text[ french ] = "Type d'utilisateur1";
    Text[ spanish ] = "Usuario1";
    Text[ italian ] = "Tipo1";
    Text[ danish ] = "Brugerdefineret type1";
    Text[ swedish ] = "Användartyp1";
    Text[ polish ] = "U¿ytkownik1";
    Text[ portuguese_brazilian ] = "Custom1";
    Text[ japanese ] = "Õ°»Þ°À²Ìß 1";
    Text[ korean ] = "»ç¿ëÀÚ Á¤ÀÇ1";
    Text[ chinese_simplified ] = "Óû§1";
    Text[ chinese_traditional ] = "¦Û­qÃþ«¬ 1";
    Text[ arabic ] = "ãõÚÑøóÝ ãä ÞÈá ÇáãÓÊÎÏã1";
    Text[ turkish ] = "Kullanýcý tipi1";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_TYPE_CUSTOM2
{
    Text = "Benutzertyp2" ;
    Text [ ENGLISH ] = "Custom2" ;
    Text[ english_us ] = "User-defined2";
    Text[ portuguese ] = "Utilizador2";
    Text[ russian ] = "Òèï ïîëüçîâàòåëÿ2";
    Text[ greek ] = "Ôýðïò ÷ñÞóôç2";
    Text[ dutch ] = "Gebruikerstype2";
    Text[ french ] = "Type d'utilisateur2";
    Text[ spanish ] = "Usuario2";
    Text[ italian ] = "Tipo2";
    Text[ danish ] = "Brugerdefineret type2";
    Text[ swedish ] = "Användartyp2";
    Text[ polish ] = "U¿ytkownik2";
    Text[ portuguese_brazilian ] = "Custom2";
    Text[ japanese ] = "Õ°»Þ°À²Ìß2";
    Text[ korean ] = "»ç¿ëÀÚ Á¤ÀÇ2";
    Text[ chinese_simplified ] = "Óû§2";
    Text[ chinese_traditional ] = "¦Û­qÃþ«¬ 2";
    Text[ arabic ] = "ãõÚÑøóÝ ãä ÞÈá ÇáãÓÊÎÏã2";
    Text[ turkish ] = "Kullanýcý tipi2";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_TYPE_CUSTOM3
{
    Text = "Benutzertyp3" ;
    Text [ ENGLISH ] = "Custom3" ;
    Text[ english_us ] = "User-defined3";
    Text[ portuguese ] = "Utilizador3";
    Text[ russian ] = "Òèï ïîëüçîâàòåëÿ3";
    Text[ greek ] = "Ôýðïò ÷ñÞóôç3";
    Text[ dutch ] = "Gebruikerstype3";
    Text[ french ] = "Type d'utilisateur3";
    Text[ spanish ] = "Usuario3";
    Text[ italian ] = "Tipo3";
    Text[ danish ] = "Brugerdefineret type3";
    Text[ swedish ] = "Användartyp3";
    Text[ polish ] = "U¿ytkownik3";
    Text[ portuguese_brazilian ] = "Custom3";
    Text[ japanese ] = "Õ°»Þ°À²Ìß3";
    Text[ korean ] = "»ç¿ëÀÚ Á¤ÀÇ3";
    Text[ chinese_simplified ] = "Óû§3";
    Text[ chinese_traditional ] = "¦Û­qÃþ«¬ 3";
    Text[ arabic ] = "ãõÚÑøóÝ ãä ÞÈá ÇáãÓÊÎÏã3";
    Text[ turkish ] = "Kullanýcý tipi3";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_TYPE_CUSTOM4
{
    Text = "Benutzertyp4" ;
    Text [ ENGLISH ] = "Custom4" ;
    Text[ english_us ] = "User-defined4";
    Text[ portuguese ] = "Utilizador4";
    Text[ russian ] = "Òèï ïîëüçîâàòåëÿ4";
    Text[ greek ] = "Ôýðïò ÷ñÞóôç4";
    Text[ dutch ] = "Gebruikerstype4";
    Text[ french ] = "Type d'utilisateur4";
    Text[ spanish ] = "Usuario4";
    Text[ italian ] = "Tipo4";
    Text[ danish ] = "Brugerdefineret type4";
    Text[ swedish ] = "Användartyp4";
    Text[ polish ] = "U¿ytkownik4";
    Text[ portuguese_brazilian ] = "Custom4";
    Text[ japanese ] = "Õ°»Þ°À²Ìß4";
    Text[ korean ] = "»ç¿ëÀÚ Á¤ÀÇ4";
    Text[ chinese_simplified ] = "Óû§4";
    Text[ chinese_traditional ] = "¦Û­qÃþ«¬ 4";
    Text[ arabic ] = "ãõÚÑøóÝ ãä ÞÈá ÇáãÓÊÎÏã4";
    Text[ turkish ] = "Kullanýcý tipi4";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_TYPE_CUSTOM5
{
    Text = "Benutzertyp5" ;
    Text [ ENGLISH ] = "Custom5" ;
    Text[ english_us ] = "User-defined5";
    Text[ portuguese ] = "Utilizador5";
    Text[ russian ] = "Òèï ïîëüçîâàòåëÿ5";
    Text[ greek ] = "Ôýðïò ÷ñÞóôç5";
    Text[ dutch ] = "Gebruikerstype5";
    Text[ french ] = "Type d'utilisateur5";
    Text[ spanish ] = "Usuario5";
    Text[ italian ] = "Tipo5";
    Text[ danish ] = "Brugerdefineret type5";
    Text[ swedish ] = "Användartyp5";
    Text[ polish ] = "U¿ytkownik5";
    Text[ portuguese_brazilian ] = "Custom5";
    Text[ japanese ] = "Õ°»Þ°À²Ìß5";
    Text[ korean ] = "»ç¿ëÀÚ Á¤ÀÇ5";
    Text[ chinese_simplified ] = "Óû§5";
    Text[ chinese_traditional ] = "¦Û­qÃþ«¬ 5";
    Text[ arabic ] = "ãõÚÑøóÝ ãä ÞÈá ÇáãÓÊÎÏã5";
    Text[ turkish ] = "Kullanýcý tipi5";
    Text[ language_user1 ] = " ";
};

String STR_AUTH_FIELD_IDENTIFIER
{
    Text = "~Kurzbezeichnung" ;
    Text [ ENGLISH ] = "Identifier" ;
    Text[ english_us ] = "Short name";
    Text[ portuguese ] = "~Abreviatura";
    Text[ russian ] = "Ñîêðàùåíèå";
    Text[ greek ] = "~Óõíôïìïãñáößá";
    Text[ dutch ] = "~Beknopte aanduiding";
    Text[ french ] = "~Abrégé";
    Text[ spanish ] = "~Abreviatura";
    Text[ italian ] = "Abbreviazione";
    Text[ danish ] = "Kort betegnelse";
    Text[ swedish ] = "~Kort beteckning";
    Text[ polish ] = "Skrót";
    Text[ portuguese_brazilian ] = "Identifier";
    Text[ japanese ] = "—ªÌ";
    Text[ korean ] = "ªÀº À̸§";
    Text[ chinese_simplified ] = "¼ò³Æ";
    Text[ chinese_traditional ] = "²µu´y­z¤å";
    Text[ arabic ] = "ÇÓã ãÎÊÕÑ";
    Text[ turkish ] = "~Kýsa ad";
};
String STR_AUTH_FIELD_AUTHORITY_TYPE
{
    Text = "~Typ" ;
    Text [ ENGLISH ] = "Type" ;
    Text[ english_us ] = "Type";
    Text[ portuguese ] = "~Tipo";
    Text[ russian ] = "Òèï";
    Text[ greek ] = "~Ôýðïò";
    Text[ dutch ] = "~Type";
    Text[ french ] = "~Type";
    Text[ spanish ] = "~Tipo";
    Text[ italian ] = "~Tipo";
    Text[ danish ] = "Type";
    Text[ swedish ] = "Typ";
    Text[ polish ] = "Typ";
    Text[ portuguese_brazilian ] = "Type";
    Text[ japanese ] = "À²Ìß";
    Text[ korean ] = "ÇüÅÂ";
    Text[ chinese_simplified ] = "ÀàÐÍ";
    Text[ chinese_traditional ] = "Ãþ«¬";
    Text[ arabic ] = "ÇáäæÚ";
    Text[ turkish ] = "~Tip";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_FIELD_ADDRESS
{
    Text = "~Verlagsadresse" ;
    Text [ ENGLISH ] = "Publisher address" ;
    Text[ english_us ] = "Publisher address";
    Text[ portuguese ] = "~Endereço da editora";
    Text[ russian ] = "Àäðåñ èçäàòåëüñòâà";
    Text[ greek ] = "Äéåýèõíóç åêäüôç";
    Text[ dutch ] = "~Adres uitgeverij";
    Text[ french ] = "Adresse de l'édition";
    Text[ spanish ] = "~Dirección editorial";
    Text[ italian ] = "Indirizzo editore";
    Text[ danish ] = "Forlagsadresse";
    Text[ swedish ] = "Förlagsadress";
    Text[ polish ] = "Adres wydawnictwa";
    Text[ portuguese_brazilian ] = "Publisher address";
    Text[ japanese ] = "o”ŎЂ̏ZŠ";
    Text[ korean ] = "ÃâÆÇ»ç ÁÖ¼Ò";
    Text[ chinese_simplified ] = "³ö°æÉçµØÖ·";
    Text[ chinese_traditional ] = "¥Xª©ªÀ¦a§}";
    Text[ arabic ] = "ÚäæÇä ÏÇÑ ÇáäÔÑ";
    Text[ turkish ] = "~Yayýnevi adresi";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_FIELD_ANNOTE
{
    Text = "~Anmerkung" ;
    Text [ ENGLISH ] = "Annotation" ;
    Text[ english_us ] = "Notes";
    Text[ portuguese ] = "A~notações";
    Text[ russian ] = "Êîììåíòàðèé";
    Text[ greek ] = "ÐáñáôÞñçóç";
    Text[ dutch ] = "~Commentaar";
    Text[ french ] = "~Commentaire";
    Text[ spanish ] = "~Notas";
    Text[ italian ] = "~Annotazione";
    Text[ danish ] = "Anmærkning";
    Text[ swedish ] = "Anmärkning";
    Text[ polish ] = "Adnotacja";
    Text[ portuguese_brazilian ] = "Annotation";
    Text[ japanese ] = "ºÒÝÄ(~M)";
    Text[ korean ] = "¸Þ¸ð(~M)";
    Text[ chinese_simplified ] = "˵Ã÷(~M)";
    Text[ chinese_traditional ] = "µû»y(~M)";
    Text[ arabic ] = "ãáÇÍÙÉ";
    Text[ turkish ] = "~Not";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_FIELD_AUTHOR
{
    Text = "A~utor(en)" ;
    Text [ ENGLISH ] = "Author(s)" ;
    Text[ english_us ] = "Author(s)";
    Text[ portuguese ] = "~Autor(es)";
    Text[ russian ] = "Àâòîð(û)";
    Text[ greek ] = "ÓõããñáöÝáò(-åéò)";
    Text[ dutch ] = "A~uteur(s)";
    Text[ french ] = "A~uteur(s)";
    Text[ spanish ] = "A~utor(es)";
    Text[ italian ] = "A~utore/i";
    Text[ danish ] = "Forfatter(e)";
    Text[ swedish ] = "Författare";
    Text[ polish ] = "Autor(zy)";
    Text[ portuguese_brazilian ] = "Author(s)";
    Text[ japanese ] = "’˜ŽÒ";
    Text[ korean ] = "ÀÛ¼ºÀÎ(µé)";
    Text[ chinese_simplified ] = "×÷Õß";
    Text[ chinese_traditional ] = "§@ªÌ";
    Text[ arabic ] = "ÇáãÄáÝ (ÇáãÄáÝæä)";
    Text[ turkish ] = "Ya~zan(lar)";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_FIELD_BOOKTITLE
{
    Text = "Bu~chtitel" ;
    Text [ ENGLISH ] = "Book title" ;
    Text[ english_us ] = "Book title";
    Text[ portuguese ] = "Títu~lo do livro";
    Text[ russian ] = "Íàçâàíèå êíèãè";
    Text[ greek ] = "Ôßôëïò âéâëßïõ";
    Text[ dutch ] = "Boe~ktitel";
    Text[ french ] = "Titre de ~livre";
    Text[ spanish ] = "Título del li~bro";
    Text[ italian ] = "Titolo del libro";
    Text[ danish ] = "Bogtitel";
    Text[ swedish ] = "Boktitel";
    Text[ polish ] = "Tytu³ ksi¹¿ki";
    Text[ portuguese_brazilian ] = "Book title";
    Text[ japanese ] = "‘–¼";
    Text[ korean ] = "Ã¥ Á¦¸ñ";
    Text[ chinese_simplified ] = "Êé¼®Ãû³Æ";
    Text[ chinese_traditional ] = "®Ñ¦W";
    Text[ arabic ] = "ÚäæÇä ÇáßÊÇÈ";
    Text[ turkish ] = "Kitap ~adý";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_FIELD_CHAPTER
{
    Text = "Ka~pitel" ;
    Text [ ENGLISH ] = "Chapter" ;
    Text[ english_us ] = "Chapter";
    Text[ portuguese ] = "Ca~pítulo";
    Text[ russian ] = "Ãëàâà";
    Text[ greek ] = "ÊåöÜëáéï";
    Text[ dutch ] = "Hoo~fdstuk";
    Text[ french ] = "~Chapitre";
    Text[ spanish ] = "Capít~ulo";
    Text[ italian ] = "Ca~pitolo";
    Text[ danish ] = "Kapitel";
    Text[ swedish ] = "Kapitel";
    Text[ polish ] = "Rozdzia³";
    Text[ portuguese_brazilian ] = "Chapter";
    Text[ japanese ] = "Í";
    Text[ korean ] = "Àå";
    Text[ chinese_simplified ] = "ÕÂ";
    Text[ chinese_traditional ] = "³¹¸`";
    Text[ arabic ] = "ÇáÝÕá";
    Text[ turkish ] = "B~ölüm";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_FIELD_EDITION
{
    Text = "Aus~gabe" ;
    Text [ ENGLISH ] = "Edition" ;
    Text[ english_us ] = "Edition";
    Text[ portuguese ] = "Ed~ição";
    Text[ russian ] = "Èçäàíèå";
    Text[ greek ] = "Åîá~ãùãÞ";
    Text[ dutch ] = "~Editie";
    Text[ french ] = "É~dition";
    Text[ spanish ] = "Edi~ción";
    Text[ italian ] = "Edizione";
    Text[ danish ] = "Udgave";
    Text[ swedish ] = "Utgåva";
    Text[ polish ] = "Wydanie";
    Text[ portuguese_brazilian ] = "Edition";
    Text[ japanese ] = "Ӂ";
    Text[ korean ] = "ÆÇ";
    Text[ chinese_simplified ] = "°æ±¾";
    Text[ chinese_traditional ] = "¥Xª©";
    Text[ arabic ] = "ÇáØÈÚÉ";
    Text[ turkish ] = "Basý~m";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_FIELD_EDITOR
{
    Text = "Herausge~ber" ;
    Text [ ENGLISH ] = "Editor" ;
    Text[ english_us ] = "Editor";
    Text[ portuguese ] = "~Editor";
    Text[ russian ] = "Ðåäàêòîð";
    Text[ greek ] = "Åê~äüôçò";
    Text[ dutch ] = "~Uitgever";
    Text[ french ] = "Éditeur";
    Text[ spanish ] = "~Editor";
    Text[ italian ] = "Editore";
    Text[ danish ] = "Udgiver";
    Text[ swedish ] = "Utgivare";
    Text[ polish ] = "Wydawca";
    Text[ portuguese_brazilian ] = "Editor";
    Text[ japanese ] = "”­sŽÒ";
    Text[ korean ] = "ÆíÁýÀÚ";
    Text[ chinese_simplified ] = "³ö°æÕß";
    Text[ chinese_traditional ] = "¥Xª©ªÌ";
    Text[ arabic ] = "ÇáäÇÔÑ";
    Text[ turkish ] = "Yayým~cý";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_FIELD_HOWPUBLISHED
{
    Text = "Au~sgabeart" ;
    Text [ ENGLISH ] = "How published" ;
    Text[ english_us ] = "Publication type";
    Text[ portuguese ] = "~Tipo de edição";
    Text[ russian ] = "Òèï èçäàíèÿ";
    Text[ greek ] = "Ôýðï~ò Ýêäïóçò";
    Text[ dutch ] = "Wijze van ~publiceren";
    Text[ french ] = "~Type de publication";
    Text[ spanish ] = "Tip~o de edición";
    Text[ italian ] = "Tipo di edizione";
    Text[ danish ] = "Udgivelsestype";
    Text[ swedish ] = "Utgivningstyp";
    Text[ polish ] = "Rodzaj edycji";
    Text[ portuguese_brazilian ] = "How published";
    Text[ japanese ] = "¶ÊÞ°À²Ìß";
    Text[ korean ] = "ÃâÆÇ ÇüÅÂ";
    Text[ chinese_simplified ] = "³ö°æ·½Ê½";
    Text[ chinese_traditional ] = "¥Xª©Ãþ«¬";
    Text[ arabic ] = "ØÑíÞÉ ÇáØÈÇÚÉ";
    Text[ turkish ] = "Yayým ~türü";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_FIELD_INSTITUTION
{
    Text = "~Institution" ;
    Text [ ENGLISH ] = "Institution" ;
    Text[ english_us ] = "Institution";
    Text[ portuguese ] = "~Instituição";
    Text[ russian ] = "Ðåäàêöèÿ";
    Text[ greek ] = "ºäñõìá";
    Text[ dutch ] = "~Instelling";
    Text[ french ] = "~Institution";
    Text[ spanish ] = "Institu~ción";
    Text[ italian ] = "~Istituzione";
    Text[ danish ] = "Institution";
    Text[ swedish ] = "Institution";
    Text[ polish ] = "Instytucja";
    Text[ portuguese_brazilian ] = "Institution";
    Text[ japanese ] = "‹@ŠÖ";
    Text[ korean ] = "±³À°±â°ü";
    Text[ chinese_simplified ] = "»ú¹¹";
    Text[ chinese_traditional ] = "µ²ÌÛ";
    Text[ arabic ] = "ÇáåíÆÉ";
    Text[ turkish ] = "K~urum";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_FIELD_JOURNAL
{
    Text = "~Zeitschrift" ;
    Text [ ENGLISH ] = "Journal" ;
    Text[ english_us ] = "Magazine";
    Text[ portuguese ] = "~Revista";
    Text[ russian ] = "Æóðíàë";
    Text[ greek ] = "Ðåñéïäéêü";
    Text[ dutch ] = "~Tijdschrift";
    Text[ french ] = "~Revue";
    Text[ spanish ] = "~Revista";
    Text[ italian ] = "Rivista";
    Text[ danish ] = "Tidsskrift";
    Text[ swedish ] = "Tidskrift";
    Text[ polish ] = "Czasopismo";
    Text[ portuguese_brazilian ] = "Journal";
    Text[ japanese ] = "ŽGŽ";
    Text[ korean ] = "ÀâÁö";
    Text[ chinese_simplified ] = "ÔÓÖ¾";
    Text[ chinese_traditional ] = "Âø§Ó";
    Text[ arabic ] = "ãÌáÉ";
    Text[ turkish ] = "De~rgi";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_FIELD_MONTH
{
    Text = "~Monat" ;
    Text [ ENGLISH ] = "Month" ;
    Text[ english_us ] = "Month";
    Text[ portuguese ] = "~Mês";
    Text[ russian ] = "Ìåñÿö";
    Text[ greek ] = "ÌÞíáò";
    Text[ dutch ] = "~Maand";
    Text[ french ] = "~Mois";
    Text[ spanish ] = "~Mes";
    Text[ italian ] = "~Mese";
    Text[ danish ] = "Måned";
    Text[ swedish ] = "Månad";
    Text[ polish ] = "Miesi¹c";
    Text[ portuguese_brazilian ] = "Month";
    Text[ japanese ] = "ŒŽ";
    Text[ korean ] = "¿ù";
    Text[ chinese_simplified ] = "ÔÂ";
    Text[ chinese_traditional ] = "¤ë";
    Text[ arabic ] = "";
    Text[ turkish ] = "~Ay";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_FIELD_NOTE
{
    Text = "~Notiz" ;
    Text [ ENGLISH ] = "Note" ;
    Text[ english_us ] = "Not~e";
    Text[ portuguese ] = "~Anotação";
    Text[ russian ] = "Ïðèìå÷àíèå";
    Text[ greek ] = "Óçìåßùóç";
    Text[ dutch ] = "~Notitie";
    Text[ french ] = "~Note";
    Text[ spanish ] = "~Nota";
    Text[ italian ] = "~Nota";
    Text[ danish ] = "Note";
    Text[ swedish ] = "Not";
    Text[ polish ] = "Notatka";
    Text[ portuguese_brazilian ] = "Note";
    Text[ japanese ] = "ÒÓ(~E)";
    Text[ korean ] = "¸Þ¸ð(~E)";
    Text[ chinese_simplified ] = "±¸×¢(~E)";
    Text[ chinese_traditional ] = "³Æª`(~E)";
    Text[ arabic ] = "ãáÇÍÙÉ";
    Text[ turkish ] = "~Not";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_FIELD_NUMBER
{
    Text = "Numme~r" ;
    Text [ ENGLISH ] = "Number" ;
    Text[ english_us ] = "Number";
    Text[ portuguese ] = "~Número";
    Text[ russian ] = "Íîìåð";
    Text[ greek ] = "Áñéèìüò";
    Text[ dutch ] = "Numme~r";
    Text[ french ] = "N~uméro";
    Text[ spanish ] = "Nú~mero";
    Text[ italian ] = "Nume~ro";
    Text[ danish ] = "Nummer";
    Text[ swedish ] = "Nummer";
    Text[ polish ] = "Numer";
    Text[ portuguese_brazilian ] = "Number";
    Text[ japanese ] = "”ԍ†";
    Text[ korean ] = "¹øÈ£";
    Text[ chinese_simplified ] = "񅧏";
    Text[ chinese_traditional ] = "½s¸¹";
    Text[ arabic ] = "ÇáÑÞã";
    Text[ turkish ] = "Numa~ra";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_FIELD_ORGANIZATIONS
{
    Text = "~Organisation" ;
    Text [ ENGLISH ] = "Organization" ;
    Text[ english_us ] = "Organization";
    Text[ portuguese ] = "~Organização";
    Text[ russian ] = "Îðãàíèçàöèÿ";
    Text[ greek ] = "~Ïñãáíéóìüò";
    Text[ dutch ] = "~Organisatie";
    Text[ french ] = "~Organisation";
    Text[ spanish ] = "~Organización";
    Text[ italian ] = "~Organizzazione";
    Text[ danish ] = "Organisation";
    Text[ swedish ] = "Organisation";
    Text[ polish ] = "Organizacja";
    Text[ portuguese_brazilian ] = "Organization";
    Text[ japanese ] = "‘gD’c‘Ì";
    Text[ korean ] = "±â±¸";
    Text[ chinese_simplified ] = "×éÖ¯";
    Text[ chinese_traditional ] = "ÉóÌÛ";
    Text[ arabic ] = "ãäÙãÉ";
    Text[ turkish ] = "~Organizasyon";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_FIELD_PAGES
{
    Text = "Seiten" ;
    Text [ ENGLISH ] = "Pages" ;
    Text[ english_us ] = "Pages";
    Text[ portuguese ] = "Páginas";
    Text[ russian ] = "Êîëè÷åñòâî ñòðàíèö";
    Text[ greek ] = "Óåëßäåò";
    Text[ dutch ] = "Pagina's";
    Text[ french ] = "Pages";
    Text[ spanish ] = "Páginas";
    Text[ italian ] = "Pagine";
    Text[ danish ] = "Sider";
    Text[ swedish ] = "Sidor";
    Text[ polish ] = "Strony";
    Text[ portuguese_brazilian ] = "Pages";
    Text[ japanese ] = "Íß°¼Þ";
    Text[ korean ] = "ÆäÀÌÁö";
    Text[ chinese_simplified ] = "ҳ";
    Text[ chinese_traditional ] = "­¶­±";
    Text[ arabic ] = "ÕÝÍÇÊ";
    Text[ turkish ] = "Sayfa";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_FIELD_PUBLISHER
{
    Text = "Ver~lag" ;
    Text [ ENGLISH ] = "Publisher" ;
    Text[ english_us ] = "Publishers";
    Text[ portuguese ] = "E~ditora";
    Text[ russian ] = "Èçäàòåëüñòâî";
    Text[ greek ] = "Åêäïôéêüò ïßêïò";
    Text[ dutch ] = "~Uitgeverij";
    Text[ french ] = "É~dition";
    Text[ spanish ] = "~Editorial";
    Text[ italian ] = "Casa editrice";
    Text[ danish ] = "Forlag";
    Text[ swedish ] = "Förlag";
    Text[ polish ] = "Wydawnictwo";
    Text[ portuguese_brazilian ] = "Publisher";
    Text[ japanese ] = "o”ÅŽÐ";
    Text[ korean ] = "ÃâÆÇ»ç";
    Text[ chinese_simplified ] = "³ö°æÉç";
    Text[ chinese_traditional ] = "¥Xª©ªÀ";
    Text[ arabic ] = "ÏÇÑ ÇáäÔÑ";
    Text[ turkish ] = "Yayýnev~i";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_FIELD_SCHOOL
{
    Text = "Hochschule/Universit~ät" ;
    Text [ ENGLISH ] = "University" ;
    Text[ english_us ] = "University";
    Text[ portuguese ] = "Escola superior/Uni~versidade";
    Text[ russian ] = "ÂÓÇ";
    Text[ greek ] = "Ô.Å.É/Á.Å.É.";
    Text[ dutch ] = "Hogeschool/~Universiteit";
    Text[ french ] = "École supérieure/Université";
    Text[ spanish ] = "Colegio/~Universidad";
    Text[ italian ] = "Università";
    Text[ danish ] = "Universitet/læreanstalt";
    Text[ swedish ] = "Högskola/universitet";
    Text[ polish ] = "Szko³a wy¿sza/Uniwersytet";
    Text[ portuguese_brazilian ] = "University";
    Text[ japanese ] = "‘åŠw";
    Text[ korean ] = "´ëÇÐ";
    Text[ chinese_simplified ] = "´óѧ";
    Text[ chinese_traditional ] = "°ª±M°|®Õ";
    Text[ arabic ] = "ÌÇãÚÉ";
    Text[ turkish ] = "Üniversite";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_FIELD_SERIES
{
    Text = "Name ~der Serie" ;
    Text [ ENGLISH ] = "Series name" ;
    Text[ english_us ] = "Series name";
    Text[ portuguese ] = "Nome da ~série";
    Text[ russian ] = "Íàçâàíèå ñåðèè";
    Text[ greek ] = "¼íïìá óåéñÜò";
    Text[ dutch ] = "Naam van de ~serie";
    Text[ french ] = "Nom de la série";
    Text[ spanish ] = "No~mbre de la serie";
    Text[ italian ] = "Nome ~della serie";
    Text[ danish ] = "Seriens navn";
    Text[ swedish ] = "Namn på serie";
    Text[ polish ] = "Nazwa serii";
    Text[ portuguese_brazilian ] = "Series name";
    Text[ japanese ] = "¼Ø°½Þ–¼";
    Text[ korean ] = "½Ã¸®Áî À̸§";
    Text[ chinese_simplified ] = "ϵÁÐÃû³Æ";
    Text[ chinese_traditional ] = "¨t¦C¦W";
    Text[ arabic ] = "ÇÓã ÇáÓáÓáÉ";
    Text[ turkish ] = "Seri ~adý";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_FIELD_TITLE
{
    Text = "Tit~el" ;
    Text [ ENGLISH ] = "Title" ;
    Text[ english_us ] = "Title";
    Text[ portuguese ] = "Títu~lo";
    Text[ russian ] = "Çàãîëîâîê";
    Text[ greek ] = "Ôßôëïò";
    Text[ dutch ] = "Tit~el";
    Text[ french ] = "Titre";
    Text[ spanish ] = "Tít~ulo";
    Text[ italian ] = "Titolo";
    Text[ danish ] = "Titel";
    Text[ swedish ] = "Titel";
    Text[ polish ] = "Tytu³";
    Text[ portuguese_brazilian ] = "Title";
    Text[ japanese ] = "À²ÄÙ";
    Text[ korean ] = "Á¦¸ñ";
    Text[ chinese_simplified ] = "±êÌâ";
    Text[ chinese_traditional ] = "¼ÐÃD";
    Text[ arabic ] = "ÇáÚäæÇä";
    Text[ turkish ] = "A~d";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_FIELD_TYPE
{
    Text = "Art des Berichts" ;
    Text [ ENGLISH ] = "Type of proceedings" ;
    Text[ english_us ] = "Report type";
    Text[ portuguese ] = "Tipo de relatório";
    Text[ russian ] = "Òèï îò÷åòà";
    Text[ greek ] = "Ôýðïò Ýêèåóçò";
    Text[ dutch ] = "Soort bericht";
    Text[ french ] = "Type de rapport";
    Text[ spanish ] = "Tipo de informe";
    Text[ italian ] = "Tipo di relazione";
    Text[ danish ] = "Rapporttype";
    Text[ swedish ] = "Typ av rapport";
    Text[ polish ] = "Rodzaj raportu";
    Text[ portuguese_brazilian ] = "Type of proceedings";
    Text[ japanese ] = "•ñ‚ÌŽí—Þ";
    Text[ korean ] = "º¸°í¼­ ÇüÅÂ";
    Text[ chinese_simplified ] = "±¨¸æÀàÐÍ";
    Text[ chinese_traditional ] = "³ø§iÃþ«¬";
    Text[ arabic ] = "äæÚ ÇáÊÞÑíÑ";
    Text[ turkish ] = "Rapor türü";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_FIELD_VOLUME
{
    Text = "Nummer des Bandes" ;
    Text [ ENGLISH ] = "Volume" ;
    Text[ english_us ] = "Volume number";
    Text[ portuguese ] = "Volume";
    Text[ russian ] = "Íîìåð òîìà";
    Text[ greek ] = "Áñéèìüò ôüìïõ";
    Text[ dutch ] = "Deel nummer";
    Text[ french ] = "No. de volume";
    Text[ spanish ] = "Número de tomo";
    Text[ italian ] = "Numero del volume";
    Text[ danish ] = "Bind";
    Text[ swedish ] = "Nummer på band";
    Text[ polish ] = "Numer tomu";
    Text[ portuguese_brazilian ] = "Volume";
    Text[ japanese ] = "Šª”";
    Text[ korean ] = "±Ç ¹øÈ£";
    Text[ chinese_simplified ] = "²áµÄ±àºÅ";
    Text[ chinese_traditional ] = "¥U¼Æ";
    Text[ arabic ] = "ÑÞã ÇáãÌáÏ";
    Text[ turkish ] = "Cilt sayýsý";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_FIELD_YEAR
{
    Text = "Erscheinungs~jahr" ;
    Text [ ENGLISH ] = "Year" ;
    Text[ english_us ] = "Year of publication";
    Text[ portuguese ] = "~Ano de publicação";
    Text[ russian ] = "Ãîä èçäàíèÿ";
    Text[ greek ] = "¸ôïò Ýêäïóçò";
    Text[ dutch ] = "Verschijnings~jaar";
    Text[ french ] = "Année de parution";
    Text[ spanish ] = "Año de publi~cación";
    Text[ italian ] = "Anno di pubblicazione";
    Text[ danish ] = "Udgivelsesår";
    Text[ swedish ] = "Utgivningsår";
    Text[ polish ] = "Rok wydania";
    Text[ portuguese_brazilian ] = "Year";
    Text[ japanese ] = "o”Å”N";
    Text[ korean ] = "ÃâÆÇ³âµµ";
    Text[ chinese_simplified ] = "³ö°æÄê·Ý";
    Text[ chinese_traditional ] = "¥Xª©¦~¥÷";
    Text[ arabic ] = "ÓäÉ ÇáÅÕÏÇÑ";
    Text[ turkish ] = "Yayým yýlý";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_FIELD_URL
{
    Text = "URL" ;
    Text [ ENGLISH ] = "URL" ;
    Text[ english_us ] = "URL";
    Text[ portuguese ] = "URL";
    Text[ russian ] = "URL";
    Text[ greek ] = "URL";
    Text[ dutch ] = "URL";
    Text[ french ] = "URL";
    Text[ spanish ] = "URL";
    Text[ italian ] = "URL";
    Text[ danish ] = "URL";
    Text[ swedish ] = "URL";
    Text[ polish ] = "URL";
    Text[ portuguese_brazilian ] = "URL";
    Text[ japanese ] = "URL";
    Text[ korean ] = "URL";
    Text[ chinese_simplified ] = "URL";
    Text[ chinese_traditional ] = "URL";
    Text[ arabic ] = "URL";
    Text[ turkish ] = "URL";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_FIELD_CUSTOM1
{
    Text = "Benutzerfeld~1" ;
    Text [ ENGLISH ] = "Custom1" ;
    Text[ english_us ] = "User-defined~1";
    Text[ portuguese ] = "Campo de utilizador~1";
    Text[ russian ] = "Ïîëå ïîëüçîâàòåëÿ1";
    Text[ greek ] = "Ðåäßï ÷ñÞóôç~1";
    Text[ dutch ] = "Gebruikersveld~1";
    Text[ french ] = "Champ d'utilisateur~1";
    Text[ spanish ] = "Campo de usuario~1";
    Text[ italian ] = "Campo1";
    Text[ danish ] = "Brugerdefineret ~1";
    Text[ swedish ] = "Användarfält1";
    Text[ polish ] = "Pole u¿ytkownika~1";
    Text[ portuguese_brazilian ] = "Custom1";
    Text[ japanese ] = "Õ°»Þ°Ì¨°ÙÄÞ1";
    Text[ korean ] = "»ç¿ëÀÚ Á¤ÀÇ1";
    Text[ chinese_simplified ] = "Óû§À¸1";
    Text[ chinese_traditional ] = "¦Û­qÄæ¦ì 1";
    Text[ arabic ] = "ÍÞá ÇáãÓÊÎÏã 1";
    Text[ turkish ] = "Kullanýcý alaný~1";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_FIELD_CUSTOM2
{
    Text = "Benutzerfeld~2" ;
    Text [ ENGLISH ] = "Custom2" ;
    Text[ english_us ] = "User-defined~2";
    Text[ portuguese ] = "Campo de utilizador~2";
    Text[ russian ] = "Ïîëå ïîëüçîâàòåëÿ2";
    Text[ greek ] = "Ðåäßï ÷ñÞóôç~2";
    Text[ dutch ] = "Gebruikersveld~2";
    Text[ french ] = "Champ d'utilisateur~2";
    Text[ spanish ] = "Campo de usuario~2";
    Text[ italian ] = "Campo2";
    Text[ danish ] = "Brugerdefineret ~2";
    Text[ swedish ] = "Användarfält2";
    Text[ polish ] = "Pole u¿ytkownika~2";
    Text[ portuguese_brazilian ] = "Custom2";
    Text[ japanese ] = "Õ°»Þ°Ì¨°ÙÄÞ2";
    Text[ korean ] = "»ç¿ëÀÚ Á¤ÀÇ2";
    Text[ chinese_simplified ] = "Óû§À¸2";
    Text[ chinese_traditional ] = "¦Û­qÄæ¦ì 2";
    Text[ arabic ] = "ÍÞá ÇáãÓÊÎÏã2";
    Text[ turkish ] = "Kullanýcý alaný~2";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_FIELD_CUSTOM3
{
    Text = "Benutzerfeld~3" ;
    Text [ ENGLISH ] = "Custom3" ;
    Text[ english_us ] = "User-defined~3";
    Text[ portuguese ] = "Campo de utilizador~3";
    Text[ russian ] = "Ïîëå ïîëüçîâàòåëÿ3";
    Text[ greek ] = "Ðåäßï ÷ñÞóôç~3";
    Text[ dutch ] = "Gebruikersveld~3";
    Text[ french ] = "Champ d'utilisateur~3";
    Text[ spanish ] = "Campo de usuario~3";
    Text[ italian ] = "Campo3";
    Text[ danish ] = "Brugerdefineret ~3";
    Text[ swedish ] = "Användarfält3";
    Text[ polish ] = "Pole u¿ytkownika~3";
    Text[ portuguese_brazilian ] = "Custom3";
    Text[ japanese ] = "Õ°»Þ°Ì¨°ÙÄÞ3";
    Text[ korean ] = "»ç¿ëÀÚ Á¤ÀÇ3";
    Text[ chinese_simplified ] = "Óû§À¸3";
    Text[ chinese_traditional ] = "¦Û­qÄæ¦ì 3";
    Text[ arabic ] = "ÍÞá ÇáãÓÊÎÏã3";
    Text[ turkish ] = "Kullanýcý alaný~3";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_FIELD_CUSTOM4
{
    Text = "Benutzerfeld~4" ;
    Text [ ENGLISH ] = "Custom4" ;
    Text[ english_us ] = "User-defined~4";
    Text[ portuguese ] = "Campo de utilizador~4";
    Text[ russian ] = "Ïîëå ïîëüçîâàòåëÿ4";
    Text[ greek ] = "Ðåäßï ÷ñÞóôç~4";
    Text[ dutch ] = "Gebruikersveld~4";
    Text[ french ] = "Champ d'utilisateur~4";
    Text[ spanish ] = "Campo de usuario~4";
    Text[ italian ] = "Campo4";
    Text[ danish ] = "Brugerdefineret ~4";
    Text[ swedish ] = "Användarfält4";
    Text[ polish ] = "Pole u¿ytkownika~4";
    Text[ portuguese_brazilian ] = "Custom4";
    Text[ japanese ] = "Õ°»Þ°Ì¨°ÙÄÞ4";
    Text[ korean ] = "»ç¿ëÀÚ Á¤ÀÇ4";
    Text[ chinese_simplified ] = "Óû§À¸4";
    Text[ chinese_traditional ] = "¦Û­qÄæ¦ì 4";
    Text[ arabic ] = "ÍÞá ÇáãÓÊÎÏã4";
    Text[ turkish ] = "Kullanýcý alaný~4";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_FIELD_CUSTOM5
{
    Text = "Benutzerfeld~5" ;
    Text [ ENGLISH ] = "Custom5" ;
    Text[ english_us ] = "User-defined~5";
    Text[ portuguese ] = "Campo de utilizador~5";
    Text[ russian ] = "Ïîëå ïîëüçîâàòåëÿ5";
    Text[ greek ] = "Ðåäßï ÷ñÞóôç~5";
    Text[ dutch ] = "Gebruikersveld~5";
    Text[ french ] = "Champ d'utilisateur~5";
    Text[ spanish ] = "Campo de usuario~5";
    Text[ italian ] = "Campo5";
    Text[ danish ] = "Brugerdefineret ~5";
    Text[ swedish ] = "Användarfält5";
    Text[ polish ] = "Pole u¿ytkownika~5";
    Text[ portuguese_brazilian ] = "Custom5";
    Text[ japanese ] = "Õ°»Þ°Ì¨°ÙÄÞ5";
    Text[ korean ] = "»ç¿ëÀÚ Á¤ÀÇ5";
    Text[ chinese_simplified ] = "Óû§À¸5";
    Text[ chinese_traditional ] = "¦Û­qÄæ¦ì 5";
    Text[ arabic ] = "ÍÞá ÇáãÓÊÎÏã5";
    Text[ turkish ] = "Kullanýcý alaný~5";
    Text[ language_user1 ] = " ";
};
String STR_AUTH_FIELD_ISBN
{
    Text = "ISBN" ;
    Text [ ENGLISH ] = "ISBN" ;
    Text[ english_us ] = "ISBN";
    Text[ portuguese ] = "ISBN";
    Text[ russian ] = "ISBN";
    Text[ greek ] = "ISBN";
    Text[ dutch ] = "ISBN";
    Text[ french ] = "ISBN";
    Text[ spanish ] = "ISBN";
    Text[ italian ] = "ISBN";
    Text[ danish ] = "ISBN";
    Text[ swedish ] = "ISBN";
    Text[ polish ] = "ISBN";
    Text[ portuguese_brazilian ] = "ISBN";
    Text[ japanese ] = "ISBN";
    Text[ korean ] = "ISBN";
    Text[ chinese_simplified ] = "ISBN";
    Text[ chinese_traditional ] = "ISBN";
    Text[ arabic ] = "ISBN";
    Text[ turkish ] = "ISBN";
    Text[ language_user1 ] = " ";
};





diff --git a/sw/source/ui/utlui/makefile.mk b/sw/source/ui/utlui/makefile.mk
new file mode 100644
index 0000000..2017055
--- /dev/null
+++ b/sw/source/ui/utlui/makefile.mk
@@ -0,0 +1,146 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:50 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=..$/..$/..

PRJNAME=sw
TARGET=utlui

AUTOSEG=true

PROJECTPCH=ui_pch
PDBTARGET=ui_pch
PROJECTPCHSOURCE=..\ui_1st\ui_pch

# future: DEMO\finder.obj

# --- Settings -----------------------------------------------------

.INCLUDE :  $(PRJ)$/inc$/swpre.mk
.INCLUDE :  settings.mk
.INCLUDE :  $(PRJ)$/inc$/sw.mk

IMGLST_SRS=$(SRS)$/utlui.srs
BMP_IN=$(PRJ)$/win/imglst


# --- Files --------------------------------------------------------

CXXFILES = \
        bookctrl.cxx \
        condedit.cxx \
        content.cxx \
        finder.cxx \
        gloslst.cxx \
        glbltree.cxx \
        initui.cxx \
        navipi.cxx \
        navicfg.cxx \
        numfmtlb.cxx \
        prcntfld.cxx \
        tmplctrl.cxx \
        uitool.cxx \
        uiitems.cxx \
        attrdesc.cxx \
        swstbctl.cxx \
        shdwcrsr.cxx \
        unotools.cxx \
        zoomctrl.cxx

SRCFILES =  \
        initui.src \
        gloslst.src \
        navipi.src \
        poolfmt.src \
        attrdesc.src \
        unotools.src \
        utlui.src

SLOFILES =  \
        $(SLO)$/bookctrl.obj \
        $(SLO)$/condedit.obj \
        $(SLO)$/content.obj \
        $(SLO)$/finder.obj \
        $(SLO)$/gloslst.obj \
        $(SLO)$/glbltree.obj \
        $(SLO)$/initui.obj \
        $(SLO)$/navipi.obj \
        $(SLO)$/navicfg.obj \
        $(SLO)$/numfmtlb.obj \
        $(SLO)$/prcntfld.obj \
        $(SLO)$/tmplctrl.obj \
        $(SLO)$/uitool.obj \
        $(SLO)$/uiitems.obj \
        $(SLO)$/attrdesc.obj \
        $(SLO)$/swstbctl.obj \
        $(SLO)$/shdwcrsr.obj \
        $(SLO)$/unotools.obj \
        $(SLO)$/zoomctrl.obj

EXCEPTIONSFILES= \
        $(SLO)$/unotools.obj\
        $(SLO)$/gloslst.obj \

# --- Tagets -------------------------------------------------------

.INCLUDE :  target.mk

diff --git a/sw/source/ui/utlui/navicfg.cxx b/sw/source/ui/utlui/navicfg.cxx
new file mode 100644
index 0000000..fdc9a0ee
--- /dev/null
+++ b/sw/source/ui/utlui/navicfg.cxx
@@ -0,0 +1,189 @@
/*************************************************************************
 *
 *  $RCSfile: navicfg.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:50 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SWTYPES_HXX
#include <swtypes.hxx>  // fuer Pathfinder
#endif
#ifndef _NAVICFG_HXX
#include <navicfg.hxx>
#endif
#ifndef _SWCONT_HXX
#include <swcont.hxx>
#endif

#ifndef _TOOLS_DEBUG_HXX
#include <tools/debug.hxx>
#endif
#ifndef _COM_SUN_STAR_UNO_ANY_HXX_
#include <com/sun/star/uno/Any.hxx>
#endif
#ifndef _COM_SUN_STAR_UNO_SEQUENCE_HXX_
#include <com/sun/star/uno/Sequence.hxx>
#endif

using namespace utl;
using namespace rtl;
using namespace com::sun::star::uno;

#define C2U(cChar) OUString::createFromAscii(cChar)

/* -----------------------------08.09.00 16:30--------------------------------

 ---------------------------------------------------------------------------*/
Sequence<OUString> SwNavigationConfig::GetPropertyNames()
{
    static const char* aPropNames[] =
    {
        "RootType",             //0
        "SelectedPosition",     //1
        "OutlineLevel",         //2
        "InsertMode",           //3
        "ActiveBlock",          //4
        "ShowListBox",          //5
        "GlobalDocMode"         //6
    };
    const int nCount = 7;
    Sequence<OUString> aNames(nCount);
    OUString* pNames = aNames.getArray();
    for(int i = 0; i < nCount; i++)
    {
        pNames[i] = OUString::createFromAscii(aPropNames[i]);
    }
    return aNames;
}
/*-----------------13.11.96 11.03-------------------

--------------------------------------------------*/

SwNavigationConfig::SwNavigationConfig() :
    utl::ConfigItem(C2U("Office.Writer/Navigator")),
    bIsGlobalActive(TRUE),
    bIsSmall(FALSE),
    nRootType(0xffff),
    nSelectedPos(0),
    nOutlineLevel(MAXLEVEL),
    nRegionMode(REGION_MODE_NONE),
    nActiveBlock(0)
{
    Sequence<OUString> aNames = GetPropertyNames();
    Sequence<Any> aValues = GetProperties(aNames);
//  EnableNotification(aNames);
    const Any* pValues = aValues.getConstArray();
    DBG_ASSERT(aValues.getLength() == aNames.getLength(), "GetProperties failed")
    if(aValues.getLength() == aNames.getLength())
    {
        for(int nProp = 0; nProp < aNames.getLength(); nProp++)
        {
            DBG_ASSERT(pValues[nProp].hasValue(), "property value missing")
            if(pValues[nProp].hasValue())
            {
                switch(nProp)
                {
                    case 0: pValues[nProp] >>= nRootType;      break;
                    case 1: pValues[nProp] >>= nSelectedPos;   break;
                    case 2: pValues[nProp] >>= nOutlineLevel;  break;
                    case 3: pValues[nProp] >>= nRegionMode;    break;
                    case 4: pValues[nProp] >>= nActiveBlock;    break;
                    case 5: bIsSmall        = *(sal_Bool*)pValues[nProp].getValue();  break;
                    case 6: bIsGlobalActive = *(sal_Bool*)pValues[nProp].getValue();  break;
                }
            }
        }
    }
}
/* -----------------------------08.09.00 16:35--------------------------------

 ---------------------------------------------------------------------------*/
SwNavigationConfig::~SwNavigationConfig()
{}
/* -----------------------------08.09.00 16:35--------------------------------

 ---------------------------------------------------------------------------*/
void SwNavigationConfig::Commit()
{
    Sequence<OUString> aNames = GetPropertyNames();
    OUString* pNames = aNames.getArray();
    Sequence<Any> aValues(aNames.getLength());
    Any* pValues = aValues.getArray();
    const Type& rType = ::getBooleanCppuType();

    for(int nProp = 0; nProp < aNames.getLength(); nProp++)
    {
        switch(nProp)
        {
            case 0: pValues[nProp] <<= nRootType;     break;
            case 1: pValues[nProp] <<= nSelectedPos;  break;
            case 2: pValues[nProp] <<= nOutlineLevel; break;
            case 3: pValues[nProp] <<= nRegionMode;   break;
            case 4: pValues[nProp] <<= nActiveBlock;    break;
            case 5: pValues[nProp].setValue(&bIsSmall, rType);          break;
            case 6: pValues[nProp].setValue(&bIsGlobalActive, rType);   break;
        }
    }
    PutProperties(aNames, aValues);
}

diff --git a/sw/source/ui/utlui/navipi.cxx b/sw/source/ui/utlui/navipi.cxx
new file mode 100644
index 0000000..f8dd376
--- /dev/null
+++ b/sw/source/ui/utlui/navipi.cxx
@@ -0,0 +1,1814 @@
/*************************************************************************
 *
 *  $RCSfile: navipi.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:50 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif


#pragma hdrstop

#define NAVIPI_CXX

#include <string> // HACK: prevent conflict between STLPORT and Workshop headers

#ifndef _LIST_HXX //autogen
#include <tools/list.hxx>
#endif
#ifndef _SV_DRAG_HXX //autogen
#include <vcl/drag.hxx>
#endif
#ifndef _SV_SYSTEM_HXX
#include <vcl/system.hxx>
#endif
#ifndef _URLBMK_HXX //autogen
#include <svtools/urlbmk.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _FILTER_HXX //autogen
#include <svtools/filter.hxx>
#endif
#ifndef _SOT_FORMATS_HXX
#include <sot/formats.hxx>
#endif
#ifndef _SFXEVENT_HXX //autogen
#include <sfx2/event.hxx>
#endif
#ifndef _SFXIMGMGR_HXX //autogen
#include <sfx2/imgmgr.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SFXDOCKWIN_HXX //autogen
#include <sfx2/dockwin.hxx>
#endif
#ifndef _SFXVIEWFRM_HXX
#include <sfx2/viewfrm.hxx>
#endif

#ifndef _SWTYPES_HXX
#include <swtypes.hxx>  // fuer Pathfinder
#endif
#ifndef _ERRHDL_HXX
#include <errhdl.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _NAVICFG_HXX
#include <navicfg.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _ACTCTRL_HXX
#include <actctrl.hxx>
#endif
#ifndef _BOOKMRK_HXX
#include <bookmrk.hxx>
#endif
#ifndef _NAVIPI_HXX
#include <navipi.hxx>
#endif
#ifndef _CONTENT_HXX
#include <content.hxx>
#endif
#ifndef _WORKCTRL_HXX
#include <workctrl.hxx>
#endif
#ifndef _SECTION_HXX
#include <section.hxx>
#endif
#ifndef _EDTWIN_HXX
#include <edtwin.hxx>
#endif

#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _CFGID_H
#include <cfgid.h>
#endif
#ifndef _HELPID_H
#include <helpid.h>
#endif
#ifndef _RIBBAR_HRC
#include <ribbar.hrc>
#endif
#ifndef _NAVIPI_HRC
#include <navipi.hrc>
#endif
#ifndef _UTLUI_HRC
#include <utlui.hrc>
#endif
#ifndef _CFGSTR_HRC
#include <cfgstr.hrc>
#endif


#define C2S(cChar) UniString::CreateFromAscii(cChar)

static const sal_Unicode cPrefix = '_';

#define PAGE_CHANGE_TIMEOUT 1000 //Timeout fuer Seitenwechsel

#define JUMP_TYPE_TBL 0
#define JUMP_TYPE_FRM 1
#define JUMP_TYPE_GRF 2
#define JUMP_TYPE_REG 3
#define JUMP_TYPE_BKM 4

// Version fuer Konfiguration

#define NAVI_VERSION0   0
#define NAVI_VERSION1   1
#define NAVI_VERSION2   2 // bIsGlobalActive

#define NAVI_CONFIG_VERSION NAVI_VERSION2

SFX_IMPL_CHILDWINDOW_CONTEXT( SwNavigationChild, SID_NAVIGATOR, SwView )

/*------------------------------------------------------------------------
    Bechreibung: Steuerzeichen aus dem Outline-Entry filtern
------------------------------------------------------------------------*/

void SwNavigationPI::CleanEntry( String& rEntry )
{
    USHORT i = rEntry.Len();
    if( i )
        for( sal_Unicode* pStr = rEntry.GetBufferAccess(); i; --i, ++pStr )
            if( *pStr == 10 || *pStr == 9 )
                *pStr = 0x20;
}
/*------------------------------------------------------------------------
 Beschreibung:  Ausfuehrung der Drag-Operation
                mit und ohne Childs
------------------------------------------------------------------------*/

void SwNavigationPI::MoveOutline(USHORT nSource, USHORT nTarget,
                                                    BOOL bWithChilds)
{
    SwView *pView = ::GetActiveView();
    SwWrtShell &rSh = pView->GetWrtShell();
    if(nTarget < nSource || nTarget == USHRT_MAX)
        nTarget ++;
    if ( rSh.IsOutlineMovable( nSource ))
    {

        short nMove = nTarget-nSource; //( nDir<0 ) ? 1 : 0 ;
        rSh.GotoOutline(nSource);
        if (bWithChilds)
            rSh.MakeOutlineSel(nSource, nSource, TRUE);
        // Die selektierten Children zaehlen bei der Bewegung vorwaerts nicht mit
        USHORT nLastOutlinePos = rSh.GetOutlinePos(MAXLEVEL);
        if(bWithChilds && nMove > 1 &&
                nLastOutlinePos < nTarget)
        {
            if(!rSh.IsCrsrPtAtEnd())
                rSh.SwapPam();
            nMove -= nLastOutlinePos - nSource;
        }
        if(!bWithChilds || nMove < 1 || nLastOutlinePos < nTarget )
            rSh.MoveOutlinePara( nMove );
        rSh.ClearMark();
        rSh.GotoOutline( nSource + nMove);
        FillBox();
    }

}
/*------------------------------------------------------------------------
 Beschreibung:  Erzeugen des automatischen Namens des unbenannten Merkers
------------------------------------------------------------------------*/

inline String &MakeAutoName(String &rToChange, USHORT i)
{
    rToChange = cPrefix;
    rToChange += String::CreateFromInt32( i );
    return rToChange;
}


/*------------------------------------------------------------------------
 Beschreibung:  Nach Goto einen Status Rahmenselektion aufheben
------------------------------------------------------------------------*/


void lcl_UnSelectFrm(SwWrtShell *pSh)
{
    if (pSh->IsFrmSelected())
    {
        pSh->UnSelectFrm();
        pSh->LeaveSelFrmMode();
    }
}

/*------------------------------------------------------------------------
 Beschreibung:  Select der Documentanzeige
------------------------------------------------------------------------*/


IMPL_LINK( SwNavigationPI, DocListBoxSelectHdl, ListBox *, pBox )
{
    int nEntryIdx = pBox->GetSelectEntryPos();
    SwView *pView ;
    pView = SwModule::GetFirstView();
    while (nEntryIdx-- && pView)
    {
        pView = SwModule::GetNextView(pView);
    }
    if(!pView)
    {
        nEntryIdx == 0 ?
            aContentTree.ShowHiddenShell():
                aContentTree.ShowActualView();


    }
    else
    {
        aContentTree.SetConstantShell(pView->GetWrtShellPtr());
    }
    return 0;
}
/*------------------------------------------------------------------------
 Beschreibung:  Select der Typenlistbox
------------------------------------------------------------------------*/
/*

IMPL_LINK( SwNavigationPI, TypeListBoxSelectHdl, ListBox *, pBox )
{
    USHORT nEntryIdx = pBox->GetSelectEntryPos();
    USHORT nCount =  pBox->GetEntryCount();
    if(nEntryIdx == nCount - 1)
    {
        if(!bPageCtrlsVisible)
        {
            bPageCtrlsVisible = TRUE;
            aContentToolBox.ShowItem( FN_PAGENUMBER );
            aContentToolBox.HideItem( FN_UP );
            aContentToolBox.HideItem( FN_DOWN );
        }
    }
    else
    {
        if(bPageCtrlsVisible)
        {
            aContentToolBox.HideItem( FN_PAGENUMBER );
            aContentToolBox.ShowItem( FN_UP );
            aContentToolBox.ShowItem( FN_DOWN );
            bPageCtrlsVisible = FALSE;
        }
    }

    pConfig->SetSelectedPos( nEntryIdx );
    return 0;
}

/*------------------------------------------------------------------------
 Beschreibung:  Fuellen der ListBox fuer Outline Sicht oder Dokumente
                Der PI wird auf volle Groesse gesetzt
------------------------------------------------------------------------*/


void SwNavigationPI::FillBox()
{
    if(pContentWrtShell)
    {
        aContentTree.SetHiddenShell( pContentWrtShell );
        aContentTree.Display(  FALSE );
    }
    else
    {
        SwView *pView = ::GetActiveView();
        if(!pView)
        {
            aContentTree.SetActiveShell(0);
        }
        else if( pView != pActContView)
        {
            SwWrtShell* pWrtShell = pView->GetWrtShellPtr();
            aContentTree.SetActiveShell(pWrtShell);
        }
        else
            aContentTree.Display( TRUE );
        pActContView = pView;
    }
}


void SwNavigationPI::UsePage(SwWrtShell *pSh)
{
    if (!pSh)
    {
        SwView *pView = ::GetActiveView();
        pSh = pView ? &pView->GetWrtShell() : 0;
        GetPageEdit().SetValue(1);
    }
    if (pSh)
    {
        const USHORT nPageCnt = pSh->GetPageCnt();
        USHORT nPhyPage, nVirPage;
        pSh->GetPageNum(nPhyPage, nVirPage);

        GetPageEdit().SetMax(nPageCnt);
        GetPageEdit().SetLast(nPageCnt);
        GetPageEdit().SetValue(nPhyPage);
    }
}

/*------------------------------------------------------------------------
 Beschreibung:  SelectHandler der Toolboxen
------------------------------------------------------------------------*/


IMPL_LINK( SwNavigationPI, ToolBoxSelectHdl, ToolBox *, pBox )
{
    const USHORT nId = pBox->GetCurItemId();
    SwView *pView = ::GetActiveView();
    if (!pView)
        return 1;
    SwWrtShell &rSh = pView->GetWrtShell();
    //MouseModifier fuer Outline-Move besorgen

    //Standard: Unterebenen werden mitgenommen
    // mit Ctrl Unterebenen nicht mitnehmen
    BOOL bOutlineWithChilds  = ( KEY_MOD1 != pBox->GetModifier());
    int nFuncId = 0;
    switch (nId)
    {
        case FN_UP:
        case FN_DOWN:
            pView->MoveNavigation(FN_DOWN == nId);
        break;
        case FN_SHOW_ROOT:
        {
            aContentTree.ToggleToRoot();
        }
        break;
        case FN_SHOW_CONTENT_BOX:
        case FN_SELECT_CONTENT:
        if(pContextWin->GetFloatingWindow())
        {
            if(_IsZoomedIn() )
            {
                _ZoomOut();
            }
            else
            {
                _ZoomIn();
            }
        }
        return TRUE;
        //break;
        // Funktionen, die eine direkte Aktion ausloesen

        case FN_SELECT_FOOTER:
        {
            rSh.MoveCrsr();
            const USHORT eType = rSh.GetFrmType(0,FALSE);
            if (eType & FRMTYPE_FOOTER)
            {
                if (rSh.EndPg())
                    nFuncId = FN_END_OF_PAGE;
            }
            else if (rSh.GotoFooterTxt())
                nFuncId = FN_TO_FOOTER;
        }
        break;
        case FN_SELECT_HEADER:
        {
            rSh.MoveCrsr();
            const USHORT eType = rSh.GetFrmType(0,FALSE);
            if (eType & FRMTYPE_HEADER)
            {
                if (rSh.SttPg())
                    nFuncId = FN_START_OF_PAGE;
            }
            else if (rSh.GotoHeaderTxt())
                nFuncId = FN_TO_HEADER;
        }
        break;
        case FN_SELECT_FOOTNOTE:
        {
            rSh.MoveCrsr();
            const USHORT eFrmType = rSh.GetFrmType(0,FALSE);
                // aus Fussnote zum Anker springen
            if (eFrmType & FRMTYPE_FOOTNOTE)
            {
                if (rSh.GotoFtnAnchor())
                    nFuncId = FN_FOOTNOTE_TO_ANCHOR;
            }
                // andernfalls zuerst zum Fussnotentext springen; geht
                // dies nicht, zur naechten Fussnote; geht auch dies
                // nicht, zur vorhergehenden Fussnote
            else
            {
                if (rSh.GotoFtnTxt())
                    nFuncId = FN_FOOTNOTE_TO_ANCHOR;
                else if (rSh.GotoNextFtnAnchor())
                    nFuncId = FN_NEXT_FOOTNOTE;
                else if (rSh.GotoPrevFtnAnchor())
                    nFuncId = FN_PREV_FOOTNOTE;
            }
        }
        break;

        case FN_SELECT_SET_AUTO_BOOKMARK:
            MakeMark();
        break;
        case FN_ITEM_DOWN:
        case FN_ITEM_UP:
        case FN_ITEM_LEFT:
        case FN_ITEM_RIGHT:
        case FN_GLOBAL_EDIT:
        {
            if(IsGlobalMode())
                aGlobalTree.ExecCommand(nId);
            else
                aContentTree.ExecCommand(nId, bOutlineWithChilds);
        }
        break;
        case FN_GLOBAL_SWITCH:
        {
            ToggleTree();
            pConfig->SetGlobalActive(IsGlobalMode());
        }
        break;
        case FN_GLOBAL_SAVE_CONTENT:
        {
            BOOL bSave = rSh.IsGlblDocSaveLinks();
            rSh.SetGlblDocSaveLinks( !bSave );
            pBox->CheckItem(FN_GLOBAL_SAVE_CONTENT, !bSave );
        }
        break;
        case FN_CREATE_NAVIGATION:
        {
        }
        break;
    }

    if (nFuncId)
    {
        lcl_UnSelectFrm(&rSh);
    }
    pView->GetEditWin().GrabFocus();
    return TRUE;
}
/*------------------------------------------------------------------------
 Beschreibung:  ClickHandler der Toolboxen
------------------------------------------------------------------------*/


IMPL_LINK( SwNavigationPI, ToolBoxClickHdl, ToolBox *, pBox )
{
    const USHORT nId = pBox->GetCurItemId();
    switch (nId)
    {
        case FN_DROP_REGION:
        {
            PopupMenu *pMenu = new PopupMenu;
            for (USHORT i = 0; i <= REGION_MODE_EMBEDDED; i++)
            {
                pMenu->InsertItem( i + 1, aContextArr[i] );
                pMenu->SetHelpId(i + 1, HID_NAVI_DRAG_HYP + i);
                    /*HID_NAVI_DRAG_HYP
                    HID_NAVI_DRAG_LINK
                    HID_NAVI_DRAG_COPY  */
            }
            pMenu->CheckItem( nRegionMode + 1 );
            pMenu->SetSelectHdl(LINK(this, SwNavigationPI, MenuSelectHdl));
            pMenu->Execute( pBox,
                    pBox->GetItemRect(FN_DROP_REGION).BottomLeft());
            pBox->EndSelection();
            delete pMenu;
            pBox->Invalidate();
        }
        break;
        case FN_OUTLINE_LEVEL:
        {
            PopupMenu *pMenu = new PopupMenu;
            for (USHORT i = 101; i <= 100 + MAXLEVEL; i++)
            {
                pMenu->InsertItem( i, String::CreateFromInt32(i - 100) );
                pMenu->SetHelpId( i, HID_NAVI_OUTLINES );
            }
            pMenu->CheckItem( aContentTree.GetOutlineLevel() + 100 );
            pMenu->SetSelectHdl(LINK(this, SwNavigationPI, MenuSelectHdl));
            pMenu->Execute( pBox,
                    pBox->GetItemRect(FN_OUTLINE_LEVEL).BottomLeft());
            delete pMenu;
            pBox->EndSelection();
            pBox->Invalidate();
        }
        break;
        case FN_GLOBAL_UPDATE:
        case FN_GLOBAL_OPEN:
        {
            aGlobalTree.TbxMenuHdl(nId, pBox);
        }
        break;
    }

    return TRUE;
}
/*-----------------19.06.97 09:09-------------------

--------------------------------------------------*/
void __EXPORT SwNavHelpToolBox::MouseButtonDown(const MouseEvent &rEvt)
{
    if(rEvt.GetButtons() == MOUSE_LEFT &&
            FN_CREATE_NAVIGATION == GetItemId(rEvt.GetPosPixel()))
    {
        SfxBindings& rBind = SfxViewFrame::Current()->GetBindings();
        rBind.ENTERREGISTRATIONS();
        SwScrollNaviPopup* pPopup = new
            SwScrollNaviPopup(FN_SCROLL_NAVIGATION,
                            SW_RES(RID_SCROLL_NAVIGATION_WIN),
                            rBind);
        rBind.LEAVEREGISTRATIONS();

        Rectangle aRect = GetItemRect(FN_CREATE_NAVIGATION);
        aRect.SetPos(OutputToScreenPixel(aRect.TopLeft()));
        pPopup->StartPopupMode(aRect, FLOATWIN_POPUPMODE_RIGHT|FLOATWIN_POPUPMODE_ALLOWTEAROFF);
    }
    else
        SwHelpToolBox::MouseButtonDown(rEvt);
}

/*-----------------19.06.97 10:12-------------------

--------------------------------------------------*/
void  __EXPORT  SwNavHelpToolBox::RequestHelp( const HelpEvent& rHEvt )
{
    USHORT nItemId = GetItemId(ScreenToOutputPixel(rHEvt.GetMousePosPixel()));
    if( FN_UP == nItemId || FN_DOWN == nItemId )
    {
        SetItemText(nItemId, SwScrollNaviPopup::GetQuickHelpText((FN_DOWN == nItemId)));
    }
    SwHelpToolBox::RequestHelp(rHEvt);
}

/*------------------------------------------------------------------------
 Beschreibung:  Action-Handler Edit; wechselt auf die Seite, wenn
                nicht Gliederungssicht angeschaltet ist.
------------------------------------------------------------------------*/


IMPL_LINK( SwNavigationPI, EditAction, NumEditAction *, pEdit )
{
    SwView *pView = ::GetActiveView();
    if (pView)
    {
        if(aPageChgTimer.IsActive())
            aPageChgTimer.Stop();
        pView->GetWrtShell().GotoPage((USHORT)pEdit->GetValue());
        pView->GetEditWin().GrabFocus();
        pView->GetViewFrame()->GetBindings().Invalidate(FN_STAT_PAGE);
    }
    return 0;
}

/*------------------------------------------------------------------------
 Beschreibung:  Falls die Seite eingestellt werden kann, wird hier
                das Maximum gesetzt.
------------------------------------------------------------------------*/


IMPL_LINK( SwNavigationPI, EditGetFocus, NumEditAction *, pEdit )
{
    SwView *pView = ::GetActiveView();
    if (!pView)
        return 0;
    SwWrtShell &rSh = pView->GetWrtShell();

    const USHORT nPageCnt = rSh.GetPageCnt();
    pEdit->SetMax(nPageCnt);
    pEdit->SetLast(nPageCnt);
    return 0;
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

BOOL __EXPORT SwNavigationPI::Close()
{
    SFX_APP()->GetBindings().Invalidate(SID_NAVIGATOR);
    GetActiveView()->GetViewFrame()->GetDispatcher()->Execute(SID_NAVIGATOR);
    return TRUE;
}

/*------------------------------------------------------------------------
 Beschreibung:  Setzen einer automatischen Marke
------------------------------------------------------------------------*/


void SwNavigationPI::MakeMark()
{
    SwView *pView = ::GetActiveView();
    if (!pView)
        return;
    SwWrtShell &rSh = pView->GetWrtShell();

    const USHORT nBookCnt = rSh.GetBookmarkCnt();
    USHORT nMarkCount = 0;
    USHORT nFirstFound = MAX_MARKS;
    for (USHORT nCount = 0; nCount < nBookCnt; ++nCount)
    {
        SwBookmark& rBkmk = rSh.GetBookmark( nCount );
        if( rBkmk.IsMark() )
        {
            String aBookmark( rBkmk.GetName() );
            aBookmark.Erase(0, 1);
            nFirstFound = Min(nFirstFound, (USHORT)aBookmark.ToInt32());
            ++nMarkCount;
        }
    }
        // maximale Anzahl Bookmarks vergeben
    if (nAutoMarkIdx == MAX_MARKS)
        nAutoMarkIdx = 1;
        // erster freier neu vergeben
    else if (nFirstFound != MAX_MARKS)
        nAutoMarkIdx = Max(USHORT(1), USHORT(nFirstFound - 1));
    else
        ++nAutoMarkIdx;

    String aMark;
    MakeAutoName(aMark,nAutoMarkIdx);
    if (nMarkCount >= MAX_MARKS)
        rSh.DelBookmark( aMark );
    rSh.SetBookmark(KeyCode(), aMark, aEmptyStr, MARK);
    SwView::SetActMark( nAutoMarkIdx );
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

void SwNavigationPI::GotoPage()
{
    if ( pContextWin->GetFloatingWindow() && pContextWin->GetFloatingWindow()->IsRollUp())
        _ZoomIn();
    if(IsGlobalMode())
        ToggleTree();
    UsePage(0);
    GetPageEdit().GrabFocus();
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

void SwNavigationPI::_ZoomOut()
{
    if (_IsZoomedIn())
    {
        FloatingWindow* pFloat = pContextWin->GetFloatingWindow();
        bIsZoomedIn = FALSE;
        Size aSz(GetOutputSizePixel());
        aSz.Height() = nZoomOut;
        Size aMinOutSizePixel = ((SfxDockingWindow*)GetParent())->GetMinOutputSizePixel();
        ((SfxDockingWindow*)GetParent())->SetMinOutputSizePixel(Size(
                            aMinOutSizePixel.Width(),nZoomOutInit));
        pFloat->SetOutputSizePixel(aSz);
        FillBox();
        if(IsGlobalMode())
        {
            aGlobalTree.Show();
        }
        else
        {
            aContentTree.Show();
            aDocListBox.Show();
        }
        SvLBoxEntry* pFirst = aContentTree.FirstSelected();
        if(pFirst)
            aContentTree.Select(pFirst, TRUE); // toolbox enablen
        pConfig->SetSmall( FALSE );
        aContentToolBox.CheckItem(FN_SHOW_CONTENT_BOX);
    }
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

void SwNavigationPI::_ZoomIn()
{
    FloatingWindow* pFloat = pContextWin->GetFloatingWindow();
    if (pFloat &&
        (!_IsZoomedIn() || ( pContextWin->GetFloatingWindow()->IsRollUp())))
    {
        aContentTree.Hide();
        aDocListBox.Hide();
        aGlobalTree.Hide();
        bIsZoomedIn = TRUE;
        Size aSz(GetOutputSizePixel());
        if( aSz.Height() > nZoomIn )
            nZoomOut = ( short ) aSz.Height();

        aSz.Height() = nZoomIn;
        Size aMinOutSizePixel = ((SfxDockingWindow*)GetParent())->GetMinOutputSizePixel();
        ((SfxDockingWindow*)GetParent())->SetMinOutputSizePixel(Size(
                            aMinOutSizePixel.Width(), aSz.Height()));
        pFloat->SetOutputSizePixel(aSz);
        SvLBoxEntry* pFirst = aContentTree.FirstSelected();
        if(pFirst)
            aContentTree.Select(pFirst, TRUE); // toolbox enablen
        pConfig->SetSmall( TRUE );
        aContentToolBox.CheckItem(FN_SHOW_CONTENT_BOX, FALSE);
    }
}
/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

void __EXPORT SwNavigationPI::Resize()
{
    Window* pParent = GetParent();
    FloatingWindow* pFloat =  ((DockingWindow*)pParent)->GetFloatingWindow();
    Size aNewSize;
    if( !_IsZoomedIn() )
    {
        if( pFloat)
        {
            aNewSize = pFloat->GetOutputSizePixel();
        }
        else
        {
            aNewSize = pParent->GetOutputSizePixel();
        }
        const Point aPos = aContentTree.GetPosPixel();
        Point aLBPos = aDocListBox.GetPosPixel();
        long nDist = aPos.X();
        aNewSize.Height() -= (aPos.Y() + aPos.X() + nDocLBIniHeight + nDist);
        aNewSize.Width() -= 2 * nDist;
        aLBPos.Y() = aPos.Y() + aNewSize.Height() + nDist;
        aDocListBox.Show(!aGlobalTree.IsVisible() && aLBPos.Y() > aPos.Y() );

        Size aDocLBSz = aDocListBox.GetSizePixel();
        aDocLBSz.Width() = aNewSize.Width();
        if(aNewSize.Height() < 0)
            aDocLBSz.Height() = 0;
        else
            aDocLBSz.Height() = nDocLBIniHeight;
        aContentTree.SetSizePixel(aNewSize);
        // GlobalTree faengt weiter oben an und reicht bis ganz unten
        aNewSize.Height() += (nDist + nDocLBIniHeight + aPos.Y() - aGlobalTree.GetPosPixel().Y());
        aGlobalTree.SetSizePixel(aNewSize);
        aDocListBox.SetPosSizePixel( aLBPos.X(), aLBPos.Y(),
                                     aDocLBSz.Width(), aDocLBSz.Height(),
                                      WINDOW_POSSIZE_X|WINDOW_POSSIZE_Y|WINDOW_POSSIZE_WIDTH);

    }
}


/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

SwNavigationPI::SwNavigationPI( SfxBindings* pBindings,
                                SfxChildWindowContext* pCw,
                                Window* pParent) :

    Window( pParent, SW_RES(DLG_NAVIGATION_PI)),
    SfxControllerItem( SID_DOCFULLNAME, *pBindings ),
    aContentTree(this, SW_RES(TL_CONTENT)),
    aGlobalTree(this, SW_RES(TL_GLOBAL)),
    aContentToolBox(this, SW_RES(TB_CONTENT)),
    aGlobalToolBox(this, SW_RES(TB_GLOBAL)),
    aContentImageList(SW_RES(IL_CONTENT)),
    aDocListBox(this, SW_RES(LB_DOCS)),
    nActMark(0),
    nAutoMarkIdx(0),
    rBindings(*pBindings),
    bSmallMode(FALSE),
    bIsZoomedIn(FALSE),
    bPageCtrlsVisible(FALSE),
    bGlobalMode(FALSE),
    nRegionMode(REGION_MODE_NONE),
    pxObjectShell(0),
    pContentView(0),
    pContentWrtShell(0),
    pActContView(0),
    pContextWin(pCw),
    nWishWidth(0),
    pConfig(SW_MOD()->GetNavigationConfig())
{
    for(USHORT k = 0; k < aContentToolBox.GetItemCount(); k++)
            aContentToolBox.SetItemImage(aContentToolBox.GetItemId(k),
                    aContentImageList.GetImage(aContentToolBox.GetItemId(k)));

    for( k = 0; k < aGlobalToolBox.GetItemCount(); k++)
            aGlobalToolBox.SetItemImage(aGlobalToolBox.GetItemId(k),
                    aContentImageList.GetImage(aGlobalToolBox.GetItemId(k)));

    aContentToolBox.SetHelpId(HID_NAVIGATOR_TOOLBOX );
    aGlobalToolBox.SetHelpId(HID_NAVIGATOR_GLOBAL_TOOLBOX);
    aDocListBox.SetHelpId(HID_NAVIGATOR_LISTBOX );

    nDocLBIniHeight = aDocListBox.GetSizePixel().Height();
    nZoomOutInit = nZoomOut = Resource::ReadShortRes();

    //NumericField in die Toolbox einfuegen
    NumEditAction* pEdit = new NumEditAction(
                    &aContentToolBox, SW_RES(NF_PAGE ));
    pEdit->SetActionHdl(LINK(this, SwNavigationPI, EditAction));
    pEdit->SetGetFocusHdl(LINK(this, SwNavigationPI, EditGetFocus));
    pEdit->SetModifyHdl(LINK(this, SwNavigationPI, PageEditModifyHdl));

    bPageCtrlsVisible = TRUE;

//  Rectangle aFirstRect = aContentToolBox.GetItemRect(FN_SHOW_ROOT);
//  USHORT nWidth = 2 * (USHORT)aFirstRect.Left();
    //doppelte Separatoren sind nicht erlaubt, also muss
    //die passende Groesse anders ermittelt werden
    Rectangle aFirstRect = aContentToolBox.GetItemRect(FN_DROP_REGION);
    Rectangle aSecondRect = aContentToolBox.GetItemRect(FN_ITEM_DOWN);
    USHORT nWidth = USHORT(aSecondRect.Left() - aFirstRect.Left());

    Size aItemWinSize( nWidth, aFirstRect.Bottom() - aFirstRect.Top() );
    pEdit->SetSizePixel(aItemWinSize);
    aContentToolBox.InsertWindow( FN_PAGENUMBER, pEdit, 0, 5);
    //aContentToolBox.InsertSeparator(4);
    aContentToolBox.SetHelpId(FN_PAGENUMBER, HID_NAVI_TBX16);
    aContentToolBox.ShowItem( FN_PAGENUMBER );

    for( USHORT i = 0; i <= REGION_MODE_EMBEDDED; i++  )
    {
        aContextArr[i] = SW_RESSTR(ST_HYPERLINK + i);
        aStatusArr[i] = SW_RESSTR(ST_STATUS_FIRST + i);
    }
    aStatusArr[3] = SW_RESSTR(ST_ACTIVE_VIEW);
    FreeResource();


    const Size& rOutSize =  GetOutputSizePixel();

    nZoomIn = (short)rOutSize.Height();
    Point aBoxPos = aContentTree.GetPosPixel();

    //Der linke und rechte Rand um die Toolboxen soll gleich sein
    nWishWidth = aContentToolBox.CalcWindowSizePixel().Width();
    nWishWidth += 2 * aContentToolBox.GetPosPixel().X();

//  Navi um Border vergroessern
//  FloatingWindow* pFloat =  ((DockingWindow*)pParent)->GetFloatingWindow();
//  if(pFloat)
    ((SfxDockingWindow*)pParent)->SetMinOutputSizePixel(Size(nWishWidth, nZoomOutInit));
    SetOutputSizePixel( Size( nWishWidth, nZoomOutInit));

    aContentTree.SetWindowBits( WB_HASBUTTONS|WB_HASBUTTONSATROOT|
                            WB_CLIPCHILDREN|WB_HSCROLL|WB_FORCE_MAKEVISIBLE );

    aContentTree.SetSpaceBetweenEntries(0);
    aContentTree.SetSelectionMode( SINGLE_SELECTION );
    aContentTree.SetDragDropMode(   SV_DRAGDROP_CTRL_MOVE |
                                    SV_DRAGDROP_CTRL_COPY |
                                    SV_DRAGDROP_ENABLE_TOP );
    aContentTree.EnableAsyncDrag(TRUE);
    aContentTree.Show();
    aContentToolBox.CheckItem(FN_SHOW_CONTENT_BOX, TRUE);

//  TreeListBox fuer Globaldokument
    aGlobalTree.SetSelectionMode( MULTIPLE_SELECTION );
    aGlobalTree.SetWindowBits( WB_HASBUTTONS|WB_HASBUTTONSATROOT|
                                WB_CLIPCHILDREN|WB_HSCROLL );
    Size aGlblSize(aGlobalToolBox.CalcWindowSizePixel());
    aGlobalToolBox.SetSizePixel(aGlblSize);

//  Handler

    Link aLk = LINK(this, SwNavigationPI, ToolBoxSelectHdl);
    aContentToolBox.SetSelectHdl( aLk );
    aGlobalToolBox.SetSelectHdl( aLk );
    aDocListBox.SetSelectHdl(LINK(this, SwNavigationPI,
                                                    DocListBoxSelectHdl));
    aContentToolBox.SetClickHdl( LINK(this, SwNavigationPI, ToolBoxClickHdl) );
    aGlobalToolBox.SetClickHdl( LINK(this, SwNavigationPI, ToolBoxClickHdl) );
    aGlobalToolBox.CheckItem(FN_GLOBAL_SWITCH, TRUE);

#ifndef MAC
    Font aFont(aContentTree.GetFont());
    aFont.SetWeight(WEIGHT_NORMAL);
    aContentTree.SetFont(aFont);
    aGlobalTree.SetFont(aFont);
    GetPageEdit().SetFont(aFont);

#endif
#if defined( WIN ) || defined( WNT )
    Font aSwiss = System::GetStandardFont( STDFONT_SWISS );
    aContentTree.SetFont(aSwiss);
    aGlobalTree.SetFont(aSwiss);
#endif
    StartListening(*SFX_APP());
    SfxImageManager* pImgMan = SFX_APP()->GetImageManager();
    pImgMan->RegisterToolBox(&aContentToolBox, SFX_TOOLBOX_CHANGEOUTSTYLE);
    pImgMan->RegisterToolBox(&aGlobalToolBox, SFX_TOOLBOX_CHANGEOUTSTYLE);
    if(IsGlobalDoc())
    {
        SwView *pActView = ::GetActiveView();
        aGlobalToolBox.CheckItem(FN_GLOBAL_SAVE_CONTENT,
                    pActView->GetWrtShellPtr()->IsGlblDocSaveLinks());
        if(pConfig->IsGlobalActive())
            ToggleTree();
        else
            Application::PostUserEvent( LINK( this, SwNavigationPI, ReadOnlyHdl ) );
    }
    UsePage(0);
    aPageChgTimer.SetTimeoutHdl(LINK(this, SwNavigationPI, ChangePageHdl));
    aPageChgTimer.SetTimeout(PAGE_CHANGE_TIMEOUT);
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

__EXPORT SwNavigationPI::~SwNavigationPI()
{
    if(IsGlobalDoc() && !IsGlobalMode())
    {
        SwView *pView = ::GetActiveView();
        SwWrtShell &rSh = pView->GetWrtShell();
        if( !rSh.IsAllProtect() )
            pView->GetDocShell()->SetReadOnlyUI(FALSE);
    }

    EndListening(*SFX_APP());
    SfxImageManager* pImgMan = SFX_APP()->GetImageManager();
    pImgMan->ReleaseToolBox(&aContentToolBox);
    pImgMan->ReleaseToolBox(&aGlobalToolBox);
    delete aContentToolBox.GetItemWindow(FN_PAGENUMBER);
    delete aContentToolBox.GetItemWindow(FN_CONTENT_LB);
    if(pxObjectShell)
    {
        if(pxObjectShell->Is())
            (*pxObjectShell)->DoClose();
        delete pxObjectShell;
    }

}
/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

void __EXPORT SwNavigationPI::StateChanged( USHORT nSID, SfxItemState eState,
                                            const SfxPoolItem* pState )
{
    if(nSID == SID_DOCFULLNAME)
    {
        SwView *pActView = ::GetActiveView();
        if(pActView)
        {
            SwWrtShell* pWrtShell = pActView->GetWrtShellPtr();
            aContentTree.SetActiveShell(pWrtShell);
            BOOL bGlobal = IsGlobalDoc();
            aContentToolBox.EnableItem(FN_GLOBAL_SWITCH, bGlobal);
            if(!bGlobal && IsGlobalMode() ||
                    !IsGlobalMode() && pConfig->IsGlobalActive())
            {
                ToggleTree();
            }
            if(bGlobal)
            {
                aGlobalToolBox.CheckItem(FN_GLOBAL_SAVE_CONTENT, pWrtShell->IsGlblDocSaveLinks());
            }
        }
        else
        {
            aContentTree.SetActiveShell(0);
        }
        UpdateListBox();
    }
}

/*------------------------------------------------------------------------
    Bechreibung: NumericField aus der Toolbox holen
------------------------------------------------------------------------*/

NumEditAction& SwNavigationPI::GetPageEdit()
{
    return *(NumEditAction*)aContentToolBox.GetItemWindow(FN_PAGENUMBER);
}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/
/*

ListBox& SwNavigationPI::GetTypeSelBox()
{
    DBG_ASSERT(aContentToolBox.GetItemWindow(FN_CONTENT_LB),
                                "ItemWindow nicht vorhanden")
    return *(ListBox*)aContentToolBox.GetItemWindow(FN_CONTENT_LB);

}*/
/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

SfxChildAlignment __EXPORT SwNavigationPI::CheckAlignment
    (
        SfxChildAlignment eActAlign,
        SfxChildAlignment eAlign
    )
{
SfxChildAlignment eRetAlign;

    if(_IsZoomedIn())
        eRetAlign = SFX_ALIGN_NOALIGNMENT;
    else
        switch (eAlign)
        {
            case SFX_ALIGN_BOTTOM:
            case SFX_ALIGN_LOWESTBOTTOM:
            case SFX_ALIGN_HIGHESTBOTTOM:
                eRetAlign = eActAlign;
                break;

            case SFX_ALIGN_TOP:
            case SFX_ALIGN_HIGHESTTOP:
            case SFX_ALIGN_LOWESTTOP:
            case SFX_ALIGN_LEFT:
            case SFX_ALIGN_RIGHT:
            case SFX_ALIGN_FIRSTLEFT:
            case SFX_ALIGN_LASTLEFT:
            case SFX_ALIGN_FIRSTRIGHT:
            case SFX_ALIGN_LASTRIGHT:
                eRetAlign = eAlign;
                break;

            default:
                eRetAlign = eAlign;
                break;
        }
    return eRetAlign;

}

/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

BOOL SwNavigationPI::IsInDrag() const
{
    return aContentTree.IsInternalDrag() || aContentTree.IsInDrag();
}

/*--------------------------------------------------------------------
    Beschreibung:   Benachrichtigung bei geaenderter DocInfo
 --------------------------------------------------------------------*/

void __EXPORT SwNavigationPI::Notify( SfxBroadcaster&, const SfxHint& rHint )
{
    if(rHint.ISA(SfxEventHint))
    {
        if( pxObjectShell &&
                    ((SfxEventHint&) rHint).GetEventId() == SFX_EVENT_CLOSEAPP)
        {
            DELETEZ(pxObjectShell);
        }
        else if(((SfxEventHint&) rHint).GetEventId() == SFX_EVENT_OPENDOC)
        {

            SwView *pActView = ::GetActiveView();
            if(pActView)
            {
                SwWrtShell* pWrtShell = pActView->GetWrtShellPtr();
                aContentTree.SetActiveShell(pWrtShell);
                if(aGlobalTree.IsVisible())
                {
                    if(aGlobalTree.Update())
                        aGlobalTree.Display();
                    else
                    // wenn kein Update notwendig, dann zumindest painten
                    // wg. der roten Eintraege fuer broken links
                        aGlobalTree.Invalidate();
                }
            }
        }
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( SwNavigationPI, MenuSelectHdl, Menu *, pMenu )
{
    USHORT nMenuId = pMenu->GetCurItemId();
    if(nMenuId != USHRT_MAX)
    {
        if(nMenuId < 100)
            SetRegionDropMode( --nMenuId);
        else
            aContentTree.SetOutlineLevel(nMenuId - 100);
    }
    return 0;
}


/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void SwNavigationPI::UpdateListBox()
{
    aDocListBox.SetUpdateMode(FALSE);
    aDocListBox.Clear();
    SwView *pActView = ::GetActiveView();
    BOOL bDisable = pActView == 0;
    SwView *pView = SwModule::GetFirstView();
    USHORT nCount = 0;
    USHORT nAct = 0;
    USHORT nConstPos = 0;
    const SwView* pConstView = aContentTree.IsConstantView() &&
                                aContentTree.GetActiveWrtShell() ?
                                    &aContentTree.GetActiveWrtShell()->GetView():
                                        0;
    while (pView)
    {
        String sEntry = pView->GetDocShell()->GetTitle();
        sEntry += C2S(" (");
        if (pView == pActView)
        {
            nAct = nCount;
            sEntry += aStatusArr[ST_ACTIVE - ST_STATUS_FIRST];
        }
        else
            sEntry += aStatusArr[ST_INACTIVE - ST_STATUS_FIRST];
        sEntry += ')';
        aDocListBox.InsertEntry(sEntry);


        if (pConstView && pView == pConstView)
            nConstPos = nCount;

        pView = SwModule::GetNextView(pView);
        nCount++;
    }
    aDocListBox.InsertEntry(aStatusArr[3]); //"Aktives Fenster"
    nCount++;

    if(aContentTree.GetHiddenWrtShell())
    {
        String sEntry = aContentTree.GetHiddenWrtShell()->GetView().
                                        GetDocShell()->GetTitle();
        sEntry += C2S(" (");
        sEntry += aStatusArr[ST_HIDDEN - ST_STATUS_FIRST];
        sEntry += ')';
        aDocListBox.InsertEntry(sEntry);
        bDisable = FALSE;
    }
    if(aContentTree.IsActiveView())
    {
        //entweder den Namen des akt. Docs oder "Aktives Dokument"
        USHORT nTmp = pActView ? nAct : --nCount;
        aDocListBox.SelectEntryPos( nTmp );
    }
    else if(aContentTree.IsHiddenView())
    {
        aDocListBox.SelectEntryPos(nCount);
    }
    else
        aDocListBox.SelectEntryPos(nConstPos);

    aDocListBox.Enable( !bDisable );
    aDocListBox.SetUpdateMode(TRUE);
}
/*------------------------------------------------------------------------
 Beschreibung:
------------------------------------------------------------------------*/

SwNavigationChild::SwNavigationChild( Window* pParent,
                        USHORT nId,
                        SfxBindings* pBindings,
                        SfxChildWinInfo* pInfo ) :
                        SfxChildWindowContext( nId )
{
    SwNavigationPI* pNavi  = new SwNavigationPI( pBindings, this, pParent );
    SetWindow( pNavi );
    SfxViewFrame::Current()->GetBindings().Invalidate(SID_NAVIGATOR);
    String sExtra = pInfo->aExtraString;

    SwNavigationConfig* pNaviConfig = SW_MOD()->GetNavigationConfig();

    USHORT nRootType = pNaviConfig->GetRootType();
    if( nRootType < CONTENT_TYPE_MAX )
    {
        pNavi->aContentTree.SetRootType(nRootType);
        pNavi->aContentToolBox.CheckItem(FN_SHOW_ROOT, TRUE);
    }
    pNavi->aContentTree.SetOutlineLevel(pNaviConfig->GetOutlineLevel());
    pNavi->SetRegionDropMode(pNaviConfig->GetRegionMode());


    if(GetFloatingWindow() && pNaviConfig->IsSmall())
    {
        pNavi->_ZoomIn();
    }

}

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

BOOL    __EXPORT SwNavigationPI::Drop( const DropEvent& )
{
    if(!aContentTree.IsInDrag())
    {
        String aFileName;

        const USHORT nCount = DragServer::GetItemCount();

        for ( USHORT i = 0; i < nCount; ++i )
        {
            aFileName = SwNavigationPI::CreateDropFileName(i);

            if(aFileName.Len() &&
                STRING_NOTFOUND == aFileName.Search('#')
                    && (!sContentFileName.Len() || sContentFileName != aFileName ))
            {
                aFileName.EraseTrailingChars(char(0));
                sContentFileName = aFileName;
                if(pxObjectShell)
                {
                    aContentTree.SetHiddenShell( 0 );
                    (*pxObjectShell)->DoClose();
                    DELETEZ( pxObjectShell);
                }
                SfxStringItem aFileItem(SID_FILE_NAME, aFileName);
                String sOptions = C2S("HRC");
                SfxStringItem aOptionsItem(SID_OPTIONS,sOptions);
                SfxLinkItem aLink(SID_DONELINK, LINK(this, SwNavigationPI, DoneLink));
                GetActiveView()->GetViewFrame()->GetDispatcher()->Execute(
                    SID_OPENDOC, SFX_CALLMODE_ASYNCHRON,
                    &aFileItem, &aOptionsItem, &aLink, 0L);
            }
        }
    }
    return TRUE;
}

/*-----------------16.06.97 15:05-------------------

--------------------------------------------------*/
String  SwNavigationPI::CreateDropFileName( USHORT nItem )
{
    INetBookmark aBkmk( aEmptyStr, aEmptyStr );
    String aFileName;

    if( aBkmk.PasteDragServer( nItem ) )
        aFileName = aBkmk.GetURL();
    else if(DragServer::HasFormat( nItem, FORMAT_FILE))
        aFileName = DragServer::PasteFile( nItem );
    else if( DragServer::HasFormat( nItem, SOT_FORMATSTR_ID_FILENAME ))
    {
        ULONG nLen = DragServer::GetDataLen( nItem, SOT_FORMATSTR_ID_FILENAME );
        DragServer::PasteData( nItem, aFileName.AllocBuffer( nLen/2 ),
                                nLen, SOT_FORMATSTR_ID_FILENAME );

    }
    return aFileName;
}

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

IMPL_LINK(SwNavigationPI, DoneLink, SfxPoolItem *, pItem)
{
    const SfxViewFrameItem* pFrameItem = PTR_CAST(SfxViewFrameItem, pItem );
    if( pFrameItem )
    {
        SfxViewFrame* pFrame =  pFrameItem->GetFrame();
        if(pFrame)
        {
            aContentTree.Clear();
            pContentView = PTR_CAST(SwView, pFrame->GetViewShell());
            DBG_ASSERT(pContentView, "keine SwView")
            if(pContentView)
                pContentWrtShell = pContentView->GetWrtShellPtr();
            else
                pContentWrtShell = 0;
            pxObjectShell = new SfxObjectShellLock(pFrame->GetObjectShell());
            FillBox();
            aContentTree.Update();
        }
    }
    return 0;
}
/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

BOOL    __EXPORT SwNavigationPI::QueryDrop( DropEvent& rEvt )
{
    rEvt.SetAction(DROP_COPY);
    if (!aContentTree.IsInDrag())
    {
        const SotDataObject& rData = *rEvt.GetData();
        const SvDataTypeList& rTypeLst = rData.GetTypeList();

        if( rTypeLst.Get( FORMAT_FILE ) )
        {
            String aFileName;
            SvData aData( FORMAT_FILE, MEDIUM_ALL );
            if( aData.GetData( aFileName ) )
            {
                GraphicDescriptor aDesc( aFileName );
                if( aDesc.Detect() )    // keine Grafiken annehmen
                    return FALSE;
                return TRUE;
            }
            return FALSE;
        }

        if( rTypeLst.Get( FORMAT_STRING ) || INetBookmark::HasFormat( rData ))
            return TRUE;
    }

    return FALSE;
}
/*-----------------27.11.96 13.00-------------------

--------------------------------------------------*/

void SwNavigationPI::SetRegionDropMode(USHORT nNewMode)
{
    nRegionMode = nNewMode;
    pConfig->SetRegionMode( nRegionMode );

    USHORT nId = FN_DROP_REGION;
    if(nRegionMode == REGION_MODE_LINK)
        nId = FN_DROP_REGION_LINK;
    else if(nRegionMode == REGION_MODE_EMBEDDED)
        nId = FN_DROP_REGION_COPY;

    aContentToolBox.SetItemImage(FN_DROP_REGION,
                aContentImageList.GetImage(nId));
}

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

BOOL    __EXPORT SwNavigationChild::Drop( const DropEvent& rEvt)
{
    return GetWindow()->Drop(rEvt);
}

/*------------------------------------------------------------------------
    Beschreibung:
------------------------------------------------------------------------*/

BOOL    __EXPORT SwNavigationChild::QueryDrop( DropEvent& rEvt)
{
    return GetWindow()->QueryDrop(rEvt);
}


/*-----------------12.06.97 09:47-------------------

--------------------------------------------------*/

BOOL    SwNavigationPI::ToggleTree()
{
    BOOL bRet = TRUE;
    BOOL bGlobalDoc = IsGlobalDoc();
    if(!IsGlobalMode() && bGlobalDoc)
    {
        SetUpdateMode(FALSE);
        if(_IsZoomedIn())
            _ZoomOut();
        aGlobalTree.Show();
        aGlobalToolBox.Show();
        aContentTree.Hide();
        aContentToolBox.Hide();
        aDocListBox.Hide();
        SetGlobalMode(TRUE);
        SetUpdateMode(TRUE);
    }
    else
    {
        aGlobalTree.Hide();
        aGlobalToolBox.Hide();
        if(!_IsZoomedIn())
        {
            aContentTree.Show();
            aContentToolBox.Show();
            aDocListBox.Show();
        }
        bRet = FALSE;
        SetGlobalMode(FALSE);
    }
    if(bGlobalDoc)
    {
        Application::PostUserEvent( LINK( this, SwNavigationPI, ReadOnlyHdl ) );
    }
    return bRet;
}

/*-----------------13.06.97 09:42-------------------

--------------------------------------------------*/
BOOL    SwNavigationPI::IsGlobalDoc() const
{
    BOOL bRet = FALSE;
    SwView *pView = ::GetActiveView();
    if(pView)
    {
        SwWrtShell &rSh = pView->GetWrtShell();
        bRet = rSh.IsGlobalDoc();
    }
    return bRet;
}
/*-----------------19.06.97 08:21-------------------

--------------------------------------------------*/
IMPL_LINK( SwNavigationPI, ReadOnlyHdl, void *, EMPTYARG )
{
/*
JP 25.01.99: die Umschaltung auf UI-Readonly wird nicht mehr benoetigt, weil
            der Cursor jetzt in Readonly-Inhalt gesetzt werden kann.

    if(IsGlobalMode())
    {
        SwView *pView = ::GetActiveView();
        SwWrtShell &rSh = pView->GetWrtShell();
        if( !rSh.IsAllProtect() )
            pView->GetDocShell()->SetReadOnlyUI(FALSE);
    }
    else
    {
        SwView *pView = ::GetActiveView();
        SwWrtShell &rSh = pView->GetWrtShell();
        if( !rSh.IsReadOnlyAvailable() )
        {
//          SfxObjectShell* pObjShell = SfxObjectShell::Current();
//          pObjShell->SetReadOnlyUI();
            pView->GetDocShell()->SetReadOnlyUI( TRUE );
        }
    }
*/
    return 0;
}
/* -----------------26.10.98 08:10-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK( SwNavigationPI, ChangePageHdl, Timer*, EMPTYARG )
{
    EditAction(&GetPageEdit());
    GetPageEdit().GrabFocus();
    return 0;
}
/* -----------------26.10.98 08:14-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK( SwNavigationPI, PageEditModifyHdl, Edit*, EMPTYARG )
{
    if(aPageChgTimer.IsActive())
        aPageChgTimer.Stop();
    aPageChgTimer.Start();
    return 0;
}
/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.231  2000/09/18 16:06:18  willem.vandorp
    OpenOffice header added.

    Revision 1.230  2000/09/08 15:11:58  os
    use configuration service

    Revision 1.229  2000/09/07 15:03:22  os
    SFX_BINDINGS removed
    #78618# CreateFromInt32

    Revision 1.228  2000/07/03 08:55:03  jp
    must changes for VCL

    Revision 1.227  2000/05/24 13:48:35  hr
    conflict between STLPORT and Workshop header

    Revision 1.226  2000/05/23 19:54:27  jp
    Bugfixes for Unicode

    Revision 1.225  2000/04/18 15:14:08  os
    UNICODE

    Revision 1.224  2000/03/03 15:17:05  os
    StarView remainders removed

    Revision 1.223  2000/02/11 15:00:45  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.222  1999/10/25 07:26:56  os
    #69021# prevent showing of controls if ZoomedIn

    Revision 1.221  1999/09/10 08:36:52  os
    Chg: ExtraData in resources

    Revision 1.220  1999/06/09 11:29:42  JP
    have to change: SvxINetBookmark -> INetBookmark


      Rev 1.219   09 Jun 1999 13:29:42   JP
   have to change: SvxINetBookmark -> INetBookmark

      Rev 1.218   19 Apr 1999 17:14:48   JP
   Bug #64992#: ClearEntry mit Leerstring verhindern

      Rev 1.217   01 Apr 1999 11:14:08   OS
   #64267# breiteres NumericField statt doppelter Separatoren

      Rev 1.216   25 Jan 1999 13:50:10   JP
   Task #58677#: Crsr in Readonly Bereichen zulassen

      Rev 1.215   20 Jan 1999 17:09:18   AWO
   #59398# FormatIds

      Rev 1.214   11 Jan 1999 14:37:54   OS
   #58637# nach Reload im Global-Dok mind. neu painten

      Rev 1.213   05 Jan 1999 07:56:20   OS
   #60618# Global-Toolbox auch am ImageManager registrieren

      Rev 1.212   27 Nov 1998 14:59:04   AMA
   Fix #59951#59825#: Unterscheiden zwischen Rahmen-,Seiten- und Bereichsspalten

      Rev 1.211   03 Nov 1998 12:24:34   OS
   58830# Enter/LeaveRegistrations

      Rev 1.210   26 Oct 1998 10:00:00   OS
   #58390# Seitenfeld springt Seite mit Zeitverzoegerung an

      Rev 1.209   17 Aug 1998 16:11:22   OS
   fuer die Doc-ListBox docshell-Title benutzen #54551#

      Rev 1.208   29 Jul 1998 12:18:58   OS
   FORCE_MAKE_VISIBLE benutzen -  #53787#

      Rev 1.207   15 Jul 1998 12:53:06   OS
   Navigator an der SwView registrieren #34794#

      Rev 1.206   10 Jul 1998 14:03:10   MH
   internal comp.err

      Rev 1.205   02 Jul 1998 16:57:06   OM
   #46638# Keine Grafiken auf Navigator droppen

      Rev 1.204   24 Apr 1998 17:21:30   OS
   ListBox-Hoehe nicht setzen #49766#

      Rev 1.203   31 Mar 1998 15:31:10   OS
   SetReadonlyUI von IsAllProtect abhaengig #49077#

      Rev 1.202   17 Mar 1998 17:32:02   OS
   Separator neben dem NumericField #47922#

      Rev 1.201   12 Mar 1998 07:51:24   OS
   Toolbox umsortiert #47922#

      Rev 1.200   05 Feb 1998 07:47:40   OS
   DocListBox im Globaldoc immer hiden #46777#

      Rev 1.199   04 Feb 1998 14:28:04   OS
   DocListbox verstecken, wenn sie zu weit oben liegt #46777#

      Rev 1.198   12 Dec 1997 13:58:04   OS
   neuer Bookmark-Typ

      Rev 1.197   05 Dec 1997 16:51:44   OS
   Numerierungsumbau

      Rev 1.196   28 Nov 1997 14:00:22   OS
   Status fuer SHOW_CONTENT_BOX im _ZoomIn/_ZoomOut setzen #45580#

      Rev 1.195   21 Nov 1997 12:10:16   MA
   includes

      Rev 1.194   03 Nov 1997 13:59:28   MA
   precomp entfernt

      Rev 1.193   04 Sep 1997 17:15:58   MA
   includes

      Rev 1.192   29 Aug 1997 15:39:00   OS
   PopupMenu::Execute mit Window* fuer VCL

      Rev 1.191   17 Jul 1997 15:23:54   OS
   nach Reload durch Notfy die TreeListBoxen aktualisieren #41775#

      Rev 1.190   15 Jul 1997 11:31:00   OS
   Ids fuer Navigator PullDown-Menues

      Rev 1.189   08 Jul 1997 14:13:32   OS
   ConfigItems von der App ans Module

      Rev 1.188   03 Jul 1997 16:26:10   OS
   ToggleTree: _ZoomOut gfs. zuerst rufen

      Rev 1.187   23 Jun 1997 18:46:26   HJS
   includes

      Rev 1.186   21 Jun 1997 14:15:36   OS
   typ. Anf.zeichen werden nicht mehr gebraucht, Font an den TreeListBoxen auf STDFONT_SWISS

      Rev 1.185   20 Jun 1997 13:54:58   OS
   Move ueber View-Methode

      Rev 1.184   19 Jun 1997 17:36:40   OS
   Reste Globaldokumente

      Rev 1.183   19 Jun 1997 11:02:50   OS
   ReadOnly-Handling, Toolbox: RequestHelp und MousebuttonDown

      Rev 1.182   18 Jun 1997 13:20:52   OS
   Segmentierung raus

      Rev 1.181   18 Jun 1997 13:08:38   OS
   Globaldokument: Eintraege verschieben, _ZoomIn/Out angepasst

      Rev 1.180   17 Jun 1997 10:17:22   OS
   Globaldokument Teil 4 - Drag and Drop

      Rev 1.179   16 Jun 1997 12:01:22   OS
   Globaldokument Teil 3

      Rev 1.178   14 Jun 1997 08:50:00   OS
   Globaldokument Teil 2

      Rev 1.177   13 Jun 1997 07:36:06   OS
   Erweiterung fuer Globaldokument

      Rev 1.176   28 May 1997 11:58:14   OS
   Expand/Collapse-Zustand merken

      Rev 1.175   13 May 1997 11:48:38   OS
   Vorwaertsbew. mit Children per Drag and Drop: selektierte Eintreage abziehen #39885#

      Rev 1.174   16 Apr 1997 11:50:58   OS
   EnableAsyncDrag() an der TreeListBox

      Rev 1.173   14 Apr 1997 16:28:16   OS
   HelpId fuer InhaltstypenListBox

      Rev 1.172   08 Apr 1997 10:28:34   MA
   includes

      Rev 1.171   27 Mar 1997 11:59:52   OS
   Get7SetMinOutputSizePixel am SfxDockingWindow

      Rev 1.170   20 Feb 1997 17:02:08   OS
   GotoRegion impl., Frame und Grafik getrennt

      Rev 1.169   11 Feb 1997 14:21:48   OS
   DropMode mit variablen Images

      Rev 1.168   31 Jan 1997 13:35:44   OS
   HelpIds fuer Navigator-Toolbox und -Listbox

      Rev 1.167   10 Jan 1997 14:18:54   OS
   ConfigItem jetzt richtig

      Rev 1.166   27 Nov 1996 16:32:46   OS
   ConfigItem mitpflegen

      Rev 1.165   20 Nov 1996 16:20:58   OS
   Verschieben von Ueberschriften nur, wenn sie selektiert sind

      Rev 1.164   14 Nov 1996 19:01:38   OS
   jetzt auch wieder als PCH

      Rev 1.163   13 Nov 1996 14:30:52   OS
   neues ConfigItem: SwNavigationConfig

      Rev 1.162   12 Nov 1996 18:17:16   OS
   Resizing: Wunschbreite merken

      Rev 1.161   12 Nov 1996 17:10:18   OS
   Resizing, _ZoomIn/Out funktionieren wieder

      Rev 1.160   11 Nov 1996 10:54:12   MA
   ResMgr

      Rev 1.159   05 Nov 1996 16:55:34   OS
   Resize auch wieder im gedockten Zustand

      Rev 1.158   05 Nov 1996 15:27:16   OS
   Umstellung auf ChildWindowContext

      Rev 1.157   24 Oct 1996 13:36:44   JP
   String Umstellung: [] -> GetChar()

      Rev 1.156   02 Oct 1996 08:08:00   MA
   Umstellung Enable/Disable

      Rev 1.155   28 Aug 1996 15:42:34   OS
   includes

      Rev 1.154   27 Jul 1996 15:33:34   OS
   UpdateListBox auch ohne akt. View aufrufen

      Rev 1.153   22 Jul 1996 15:06:56   OS
   zusammengefaltete Groesse...

      Rev 1.152   12 Jul 1996 13:23:30   OS
   Konfiguration sichern

      Rev 1.151   09 Jul 1996 17:40:18   OS
   Resize: Listbox auf Null verkleinern, wenn sie nicht unter die Toolbox passt

      Rev 1.150   04 Jul 1996 16:15:02   OS
   richtige Anzeige der Listbox auch ohne aktive SwView

      Rev 1.149   03 Jul 1996 14:24:42   OS
   Listboxanzeige umgebaut, feste Viewanzeige moeglich

      Rev 1.148   01 Jul 1996 16:00:26   OS
   komplette Kontextmenues, Outlinetiefe einstellbar

      Rev 1.147   28 Jun 1996 15:20:38   OS
   drei Modi fuer D&D, Kontextmenue

      Rev 1.146   26 Jun 1996 16:08:44   OS
   Dispatcher::Execute angepasst, ::GotoPage aktiviert wieder das Seitenzahlfeld

      Rev 1.145   26 Jun 1996 14:29:10   OS
   Sprungfunktionen vervollstaendigt, Tastatursteuerung

------------------------------------------------------------------------*/

diff --git a/sw/source/ui/utlui/navipi.hrc b/sw/source/ui/utlui/navipi.hrc
new file mode 100644
index 0000000..9f68682
--- /dev/null
+++ b/sw/source/ui/utlui/navipi.hrc
@@ -0,0 +1,128 @@
/*************************************************************************
 *
 *  $RCSfile: navipi.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:50 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#define TB_1                1
#define TB_2                2
#define TB_3                3
#define TB_4                4
#define BT_UP               5
#define BT_DOWN             6
#define IL_CONTENT          7

#define FT_PAGE             10
#define ED_PAGE             11

#define LB_SELECT           22
#define TL_SELECT           23

#define TB_PAGE_TEXT                    41
#define TB_PAGE_COUNT                   42

#define TB_CONTENT          50
#define TL_CONTENT          51

#define LB_DOCS             53
#define NF_PAGE             54
#define TL_GLOBAL           55
#define TB_GLOBAL           56

//-------------------------------------------------------------------
// Strings fuer Kontextmenue des ContentTree
#define ST_CONTEXT_FIRST        60
#define ST_OUTLINE_LEVEL        ST_CONTEXT_FIRST
#define ST_DRAGMODE                     (ST_CONTEXT_FIRST + 1)
#define ST_HYPERLINK                    (ST_CONTEXT_FIRST + 2)
#define ST_LINK_REGION                  (ST_CONTEXT_FIRST + 3)
#define ST_COPY_REGION                  (ST_CONTEXT_FIRST + 4)
#define ST_DISPLAY                      (ST_CONTEXT_FIRST + 5)
#define ST_ACTIVE_VIEW                  (ST_CONTEXT_FIRST + 6)

#define ST_STATUS_FIRST         67
#define ST_HIDDEN                       (ST_STATUS_FIRST    )
#define ST_ACTIVE                       (ST_STATUS_FIRST + 1)
#define ST_INACTIVE                     (ST_STATUS_FIRST + 2)
#define ST_MISC                         70
#define ST_EDIT_ENTRY                   ST_MISC
#define ST_DELETE_ENTRY                 (ST_MISC + 1)

#define ST_GLOBAL_CONTEXT_FIRST         (ST_DELETE_ENTRY + 1)
#define ST_UPDATE                       (ST_GLOBAL_CONTEXT_FIRST    )
#define ST_EDIT_CONTENT                 (ST_GLOBAL_CONTEXT_FIRST + 1)
#define ST_INSERT                       (ST_GLOBAL_CONTEXT_FIRST + 2)
#define ST_INDEX                        (ST_GLOBAL_CONTEXT_FIRST + 3)
//#define ST_CNTIDX                       (ST_GLOBAL_CONTEXT_FIRST + 4)
//#define ST_USRIDX                       (ST_GLOBAL_CONTEXT_FIRST + 5)
#define ST_FILE                         (ST_GLOBAL_CONTEXT_FIRST + 4)
#define ST_NEW_FILE                     (ST_GLOBAL_CONTEXT_FIRST + 5)
#define ST_TEXT                         (ST_GLOBAL_CONTEXT_FIRST + 6)
#define ST_DELETE                       (ST_GLOBAL_CONTEXT_FIRST + 7)
#define ST_UPDATE_SEL                   (ST_GLOBAL_CONTEXT_FIRST + 8)
#define ST_UPDATE_INDEX                 (ST_GLOBAL_CONTEXT_FIRST + 9)
#define ST_UPDATE_LINK                  (ST_GLOBAL_CONTEXT_FIRST +10)
#define ST_UPDATE_ALL                   (ST_GLOBAL_CONTEXT_FIRST +11)
#define ST_BROKEN_LINK                  (ST_GLOBAL_CONTEXT_FIRST +12)

#define ST_REMOVE_INDEX                 (ST_GLOBAL_CONTEXT_FIRST +30)
#define ST_REMOVE_TBL_PROTECTION        (ST_GLOBAL_CONTEXT_FIRST +31)
#define ST_RENAME                       (ST_GLOBAL_CONTEXT_FIRST +32)
#define ST_READONLY_IDX                 (ST_GLOBAL_CONTEXT_FIRST +33)
#define ST_INVISIBLE                    (ST_GLOBAL_CONTEXT_FIRST +34)


diff --git a/sw/source/ui/utlui/navipi.src b/sw/source/ui/utlui/navipi.src
new file mode 100644
index 0000000..26f755c
--- /dev/null
+++ b/sw/source/ui/utlui/navipi.src
@@ -0,0 +1,1615 @@
/*************************************************************************
 *
 *  $RCSfile: navipi.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:50 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "cmdid.h"
#include "utlui.hrc"
#include "navipi.hrc"
#include "helpid.h"
#define IMAGE_STDBTN_COLOR Color { Red = 0xC000; Green = 0xC000; Blue = 0xC000; }
Window DLG_NAVIGATION_PI
{
    HelpID = HID_NAVIGATION_PI ;
    OutputSize = TRUE ;
    DialogControl = TRUE ;
    SVLook = TRUE ;
     // Size = MAP_PIXEL( 235, 195 );
     // ZoomInOutputSize = MAP_PIXEL(235, 56);
    Size = MAP_PIXEL ( 282 , 59 ) ;
     //    Closeable = TRUE ;
     //    Zoomable = TRUE ;
     //    Moveable = TRUE ;
     // ZoomIn = FALSE;
    Hide = TRUE ;
     //    HideWhenDeactivate = TRUE ;
     //    Sizeable = TRUE ;
     //    EnableResizing = TRUE ;
     //    Dockable = TRUE ;
     //    Sizeable = TRUE ;
    Text = "Navigator" ;
    Text [ English ] = "Navigator" ;
    Text [ norwegian ] = "Navigator" ;
    Text [ italian ] = "Navigatore" ;
    Text [ portuguese_brazilian ] = "Navegador" ;
    Text [ portuguese ] = "Navegador" ;
    Text [ finnish ] = "Navigaattori" ;
    Text [ danish ] = "Navigator" ;
    Text [ french ] = "Navigateur" ;
    Text [ swedish ] = "Navigator" ;
    Text [ dutch ] = "Navigator" ;
    Text [ spanish ] = "Navegador" ;
    Text [ english_us ] = "Navigator" ;
    ExtraData =
    {
        198;
    };
    /************************************************************************************
    Toolbox ab 323 x
************************************************************************************/
    ImageList IL_CONTENT
    {
        ImageBitmap = Bitmap { File = "scnacon.bmp" ; };
        MaskColor = IMAGE_STDBTN_COLOR ;
        IdList =
        {
            FN_UP ;  // sc20186.bmp
            FN_DOWN ;  // sc20175.bmp
            FN_SELECT_HEADER ;  // sc20179.bmp
            FN_SELECT_FOOTER ;  // sc20177.bmp
            FN_SELECT_FOOTNOTE ;  // sc20182.bmp
            FN_SHOW_CONTENT_BOX ;  // 20233.bmp
            FN_SHOW_ROOT ;  // 20234.bmp
            FN_ITEM_UP ;  // sc20174.bmp
            FN_ITEM_DOWN ;  // sc20171.bmp
            FN_ITEM_LEFT ;  // sc20172.bmp
            FN_ITEM_RIGHT ;  // sc20173.bmp
            FN_DROP_REGION ;  // sc20235.bmp
            FN_OUTLINE_LEVEL ;  // sc20236.bmp
            FN_SELECT_SET_AUTO_BOOKMARK ;  // sc20183.bmp
            FN_DROP_REGION_LINK ;  // 20238
            FN_DROP_REGION_COPY ;  // 20239
            FN_GLOBAL_SWITCH ;  //20244
            FN_GLOBAL_EDIT ;  //20245
            FN_GLOBAL_UPDATE ;  //20246
            FN_GLOBAL_OPEN ;  //20247
            FN_GLOBAL_SAVE_CONTENT ;  //20248
            FN_CREATE_NAVIGATION ;  //20249
        };
        IdCount = { 21 ; };
    };
    Toolbox TB_CONTENT
    {
        Pos = MAP_PIXEL ( 5 , 5 ) ;
        Size = MAP_PIXEL ( 300 , 47 ) ;
        LineCount = 2 ;
        ItemList =
        {
            ToolBoxItem
            {
                Identifier = FN_GLOBAL_SWITCH ;
                HelpID = HID_NAVI_TBX17 ;
                Text = "Umschalten" ;
                Text [ English ] = "Switch" ;
                Text [ english_us ] = "Toggle" ;
                Text [ portuguese_brazilian ] = "Umschalten" ;
                Text [ swedish ] = "Växla" ;
                Text [ danish ] = "Skift" ;
                Text [ italian ] = "Commuta" ;
                Text [ spanish ] = "Conmutar" ;
                Text [ french ] = "Basculer" ;
                Text [ dutch ] = "Omschakelen" ;
                Text [ portuguese ] = "Comutar" ;
                Text[ chinese_simplified ] = "Çл»";
                Text[ russian ] = "Ïåðåêëþ÷èòü";
                Text[ polish ] = "Prze³¹cz";
                Text[ japanese ] = "Ø‚è‘Ö‚¦";
                Text[ chinese_traditional ] = "Âà´«";
                Text[ arabic ] = "ÇáÊÈÏíá";
                Text[ greek ] = "ÅíáëëáãÞ";
                Text[ korean ] = "Åä±Û";
                Text[ turkish ] = "Deðiþtir";
            };
            ToolBoxItem
            {
                Identifier = FN_CREATE_NAVIGATION ;
                HelpID = HID_NAVI_TBX24 ;
                Text = "Navigation" ;
                Text [ English ] = "Navigation" ;
                Text [ english_us ] = "Navigation" ;
                Text [ portuguese_brazilian ] = "Navigation" ;
                Text [ swedish ] = "Navigation" ;
                Text [ danish ] = "Navigation" ;
                Text [ italian ] = "Navigazione" ;
                Text [ spanish ] = "Navegación" ;
                Text [ french ] = "Navigation" ;
                Text [ dutch ] = "Navigatie" ;
                Text [ portuguese ] = "Navegação" ;
                Text[ chinese_simplified ] = "ä¯ÀÀ";
                Text[ russian ] = "Íàâèãàöèÿ";
                Text[ polish ] = "Nawigacja";
                Text[ japanese ] = "ÅËÞ¹Þ°¼®Ý";
                Text[ chinese_traditional ] = "ÂsÄý";
                Text[ arabic ] = "ÇáãáÇÍÉ";
                Text[ greek ] = "Ìåôáêßíçóç";
                Text[ korean ] = "³×ºñ°ÔÀ̼Ç";
                Text[ turkish ] = "Dolaþma";
            };
            /*            ToolBoxItem
            {
                Identifier = FN_CONTENT_LB ;
                HelpID = HID_NAVI_TBX1 ;
                Text = "Inhaltstyp" ;
                Text [ English ] = "Content type" ;
                 // Listbox mit Inhaltsauswahl
                Text [ dutch ] = "Inhoudstype" ;
                Text [ english_us ] = "Content Type" ;
                Text [ italian ] = "Tipo di contenuto" ;
                Text [ spanish ] = "Tipo de contenido" ;
                Text [ french ] = "Type de contenu" ;
                Text [ swedish ] = "Innehållstyp" ;
                Text [ danish ] = "Indholdstype" ;
                Text [ portuguese_brazilian ] = "Inhaltstyp" ;
                Text [ portuguese ] = "Tipo de conteúdo" ;
            };*/
            ToolBoxItem
            {
                Identifier = FN_UP ;
                 //                 ItemBitmap = Bitmap { File = "navup.bmp"; };
                HelpID = HID_NAVI_TBX2 ;
                /* ### ACHTUNG: Neuer Text in Resource? Rückwärts : R³ckwõrts */
                Text = "Rückwärts" ;
                Text [ English ] = "Backward" ;
                Text [ norwegian ] = "Bakover" ;
                Text [ italian ] = "Indietro" ;
                Text [ portuguese_brazilian ] = "Para trás" ;
                Text [ portuguese ] = "Anterior" ;
                Text [ finnish ] = "Taaaksepäin" ;
                Text [ danish ] = "Tilbage" ;
                Text [ french ] = "Précédent" ;
                Text [ swedish ] = "Bakåt" ;
                Text [ dutch ] = "Achteruit" ;
                Text [ spanish ] = "Retroceder" ;
                Text [ english_us ] = "Back" ;
                Text[ chinese_simplified ] = "·µ»Ø";
                Text[ russian ] = "Íàçàä";
                Text[ polish ] = "Wstecz";
                Text[ japanese ] = "–ß‚é";
                Text[ chinese_traditional ] = "ªð¦^";
                Text[ arabic ] = "Åáì ÇáÎáÝ";
                Text[ greek ] = "Ðßóù";
                Text[ korean ] = "µÚ·Î";
                Text[ turkish ] = "Geri";
            };
            ToolBoxItem
            {
                Identifier = FN_DOWN ;
                 //                 ItemBitmap = Bitmap { File = "navdn.bmp"; };
                HelpID = HID_NAVI_TBX3 ;
                /* ### ACHTUNG: Neuer Text in Resource? Vorwärts : Vorwõrts */
                Text = "Vorwärts" ;
                Text [ English ] = "Forward" ;
                Text [ norwegian ] = "Fram" ;
                Text [ italian ] = "Avanti" ;
                Text [ portuguese_brazilian ] = "Para Frente" ;
                Text [ portuguese ] = "Seguinte" ;
                Text [ finnish ] = "Seuraava" ;
                Text [ danish ] = "Fremad" ;
                Text [ french ] = "Suivant" ;
                Text [ swedish ] = "Framåt" ;
                Text [ dutch ] = "Voorwaarts" ;
                Text [ spanish ] = "Avanzar" ;
                Text [ english_us ] = "Forward" ;
                Text[ chinese_simplified ] = "Ïòǰ";
                Text[ russian ] = "Âïåðåä";
                Text[ polish ] = "Do przodu";
                Text[ japanese ] = "i‚Þ";
                Text[ chinese_traditional ] = "¦V«e";
                Text[ arabic ] = "Åáì ÇáÃãÇã";
                Text[ greek ] = "Åìðñüò";
                Text[ korean ] = "¾ÕÀ¸·Î";
                Text[ turkish ] = "Ýleri";
            };
            ToolBoxItem
            {
                Type = TOOLBOXITEM_SEPARATOR ;
            };
            ToolBoxItem
            {
                Type = TOOLBOXITEM_SEPARATOR ;
            };
            ToolBoxItem
            {
                Identifier = FN_DROP_REGION ;
                HelpID = HID_NAVI_TBX4 ;
                Text = "Dragmodus" ;
                Text [ English ] = "Drag Mode" ;
                /* ### ACHTUNG: Neuer Text in Resource? Modus für Drag & Drop auswählen : Modus f³r Drag & Drop auswõhlen */
                DropDown = TRUE ;
                Text [ english_us ] = "Drag Mode" ;
                Text [ italian ] = "Modo drag" ;
                Text [ spanish ] = "Modo Arrastrar" ;
                Text [ french ] = "Mode Glisser" ;
                Text [ dutch ] = "Modus Slepen" ;
                Text [ swedish ] = "Draläge" ;
                Text [ danish ] = "Trækmodus" ;
                Text [ portuguese_brazilian ] = "Dragmodus" ;
                Text [ portuguese ] = "Modo Arrastar" ;
                Text[ chinese_simplified ] = "Í϶¯Ä£Ê½";
                Text[ russian ] = "Ðåæèì ïåðåòàñêèâàíèÿ";
                Text[ polish ] = "Tryb przeci¹gania";
                Text[ japanese ] = "ÄÞׯ¸ÞÓ°ÄÞ";
                Text[ chinese_traditional ] = "©ì¦²¼Ò¦¡";
                Text[ arabic ] = "ØÑíÞÉ ÇáÓÍÈ";
                Text[ greek ] = "ÊáôÜóôáóç óõñìïý";
                Text[ korean ] = "µå·¡±× ¸ðµå";
                Text[ turkish ] = "Sürükleme kipi";
            };
            ToolBoxItem
            {
                Type = TOOLBOXITEM_SEPARATOR ;
            };
            ToolBoxItem
            {
                Identifier = FN_ITEM_UP ;
                 //                 ItemBitmap = Bitmap { File = "navchup.bmp"; };
                HelpID = HID_NAVI_TBX5 ;
                Text = "Kapitel hoch" ;
                Text [ English ] = "Chapter up" ;
                Text [ norwegian ] = "Kapittel opp" ;
                Text [ italian ] = "Capitolo superiore" ;
                Text [ portuguese_brazilian ] = "Capítulo acima" ;
                Text [ portuguese ] = "Subir um capítulo" ;
                Text [ finnish ] = "Edellinen luku" ;
                Text [ danish ] = "Kapitel op" ;
                Text [ french ] = "Chapitre vers le haut" ;
                Text [ swedish ] = "Kapitel uppåt" ;
                Text [ dutch ] = "Hoofdstuk hoger" ;
                Text [ spanish ] = "Un capítulo hacia arriba" ;
                Text [ english_us ] = "Promote Chapter" ;
                 //HelpText[english_us-wrong] = "Move chapter down";//"Move chapter up"
                Text[ chinese_simplified ] = "ÕÂÉý¼¶";
                Text[ russian ] = "Ãëàâà ñâåðõó";
                Text[ polish ] = "Rozdzia³ do góry";
                Text[ japanese ] = "Í‚ÌÚÍÞقðã‚°‚é";
                Text[ chinese_traditional ] = "³¹¤É¯Å";
                Text[ arabic ] = "ÝÕá áÃÚáì";
                Text[ greek ] = "Ðñïâéâáóìüò êåöáëáßïõ";
                Text[ korean ] = "Àå ½Â°Ý";
                Text[ turkish ] = "Bölümü yukarý al";
            };
            ToolBoxItem
            {
                Identifier = FN_ITEM_DOWN ;
                 //                 ItemBitmap = Bitmap { File = "navchdn.bmp"; };
                HelpID = HID_NAVI_TBX6 ;
                Text = "Kapitel hinunter" ;
                Text [ English ] = "Chapter down" ;
                Text [ norwegian ] = "Kapittel ned" ;
                Text [ italian ] = "Capitolo inferiore" ;
                Text [ portuguese_brazilian ] = "Capítulo abaixo" ;
                Text [ portuguese ] = "Descer um capítulo" ;
                Text [ finnish ] = "Seuraava luku" ;
                Text [ danish ] = "Kapitel ned" ;
                Text [ french ] = "Chapitre vers le bas" ;
                Text [ swedish ] = "Kapitel nedåt" ;
                Text [ dutch ] = "Hoofdstuk lager" ;
                Text [ spanish ] = "Un capítulo hacia abajo" ;
                Text [ english_us ] = "Demote Chapter" ;
                Text[ chinese_simplified ] = "Õ½µ¼¶";
                Text[ russian ] = "Ãëàâà ñíèçó";
                Text[ polish ] = "Rozdzia³ w dó³";
                Text[ japanese ] = "Í‚ÌÚÍÞÙ‚ð‰º‚°‚é";
                Text[ chinese_traditional ] = "³¹­°¯Å";
                Text[ arabic ] = "ÝÕá áÃÓÝá";
                Text[ greek ] = "Õðïâéâáóìüò êåöáëáßïõ";
                Text[ korean ] = "Àå ³·Ãß±â";
                Text[ turkish ] = "Bölümü aþaðý çek";
            };
            ToolBoxItem
            {
                Type = TOOLBOXITEM_BREAK ;
            };
            ToolBoxItem
            {
                Identifier = FN_SHOW_CONTENT_BOX ;
                HelpID = HID_NAVI_TBX7 ;
                Text = "Auswahlbox an-/ausschalten" ;
                Text [ English ] = "Toggle Listbox" ;
                Text [ english_us ] = "List Box On/Off" ;
                Text [ italian ] = "Mostra/nascondi la casella di selezione" ;
                Text [ spanish ] = "Mostrar/ocultar cuadro de selección" ;
                Text [ french ] = "Afficher/masquer la boîte de sélection" ;
                Text [ dutch ] = "Keuzebox in-/uitschakelen" ;
                Text [ swedish ] = "Urvalsbox på/av" ;
                Text [ danish ] = "Vis/skjul liste" ;
                Text [ portuguese_brazilian ] = "Auswahlbox an-/ausschalten" ;
                Text [ portuguese ] = "Act./Desactivar caixa de selecção" ;
                Text[ chinese_simplified ] = "ÏÔʾ/ÒþÈëÁбí¿ò";
                Text[ russian ] = "Âêë./âûêë. îêíî ñïèñêà";
                Text[ polish ] = "W³¹cz/Wy³¹cz pole listy";
                Text[ japanese ] = "ؽÄÎÞ¯¸½ µÝ/µÌ";
                Text[ chinese_traditional ] = "Åã¥Ü/Áô¤J²M³æ¤è¶ô";
                Text[ arabic ] = "ÅÙåÇÑ/ÅÎÝÇÁ ÕäÏæÞ ÇáÇÎÊíÇÑ";
                Text[ greek ] = "Ðëáßóéï åðéëïãÞò Íáé/¼÷é";
                Text[ korean ] = "¸®½ºÆ® ¹Ú½º ½ÃÀÛ/Á¾·á";
                Text[ turkish ] = "Liste kutusu açýk/kapalý";
            };
            ToolBoxItem
            {
                Identifier = FN_SHOW_ROOT ;
                HelpID = HID_NAVI_TBX8 ;
                Text = "Inhaltsansicht umschalten" ;
                Text [ English ] = "Toggle content view" ;
                Text [ english_us ] = "Content View" ;
                Text [ italian ] = "Commuta la vista del contenuto" ;
                Text [ spanish ] = "Conmutar visualización del contenido" ;
                Text [ french ] = "Basculer l'affichage du contenu" ;
                Text [ dutch ] = "Inhoudsopgave in-/uitschakelen" ;
                Text [ swedish ] = "Växla innehållsvisning" ;
                Text [ danish ] = "Skift til/fra indholdsvisning" ;
                Text [ portuguese_brazilian ] = "Inhaltsansicht umschalten" ;
                Text [ portuguese ] = "Comutar vista do conteúdo" ;
                Text[ chinese_simplified ] = "Çл»ÄÚÈÝÊÓͼ";
                Text[ russian ] = "Ïåðåêëþ÷èòü âèä ñîäåðæàíèÿ";
                Text[ polish ] = "Prze³¹cz widok treœci";
                Text[ japanese ] = "“à—e‚ÌËÞ­°‚ðØ‚èŠ·‚¦";
                Text[ chinese_traditional ] = "¤Á´«¤º®eÀ˵ø";
                Text[ arabic ] = "ÊÈÏíá ØÑíÞÉ ÚÑÖ ÇáãÍÊæíÇÊ";
                Text[ greek ] = "ÐñïâïëÞ ðåñéå÷ïìÝíùí Íáé/¼÷é";
                Text[ korean ] = "³»¿ë º¸±â";
                Text[ turkish ] = "Ýçerik görünümü";
            };
            ToolBoxItem
            {
                Type = TOOLBOXITEM_SEPARATOR ;
            };
            ToolBoxItem
            {
                Identifier = FN_SELECT_SET_AUTO_BOOKMARK ;
                HelpID = HID_NAVI_TBX9 ;
                 //                 ItemBitmap = Bitmap { File = "navstmp.bmp"; };
                Text = "Merker setzen" ;
                Text [ English ] = "Set Bookmarks" ;
                Text [ norwegian ] = "Sett inn Bokmerker" ;
                Text [ italian ] = "Imposta contrassegno" ;
                Text [ portuguese_brazilian ] = "Definir Marcas" ;
                Text [ portuguese ] = "Definir marca" ;
                Text [ finnish ] = "Aseta kirjanmerkit" ;
                Text [ danish ] = "Sæt påmindelse" ;
                Text [ french ] = "Définir un pense-bête" ;
                Text [ swedish ] = "Sätt temporärt bokmärke" ;
                Text [ dutch ] = "Merktekens plaatsen" ;
                Text [ spanish ] = "Insertar marca" ;
                Text [ english_us ] = "Set Reminder" ;
                Text[ chinese_simplified ] = "ÉèÖñê¼Ç";
                Text[ russian ] = "Óñòàíîâèòü ïîìåòêó";
                Text[ polish ] = "OsadŸ znaczniki";
                Text[ japanese ] = "Šo‚¦Ž~‚ß‚ð•t‚¯‚é";
                Text[ chinese_traditional ] = "³]©w´£¿ô";
                Text[ arabic ] = "æÖÚ ÚáÇãÉ ÊÐßíÑ";
                Text[ greek ] = "Ïñéóìüò õðåíèýìéóçò";
                Text[ korean ] = "¹Ì¸®¾Ë¸² ¼³Á¤";
                Text[ turkish ] = "Anýmsatýcý yerleþtir";
            };
            ToolBoxItem
            {
                Type = TOOLBOXITEM_SEPARATOR ;
            };
            ToolBoxItem
            {
                Identifier = FN_SELECT_HEADER ;
                 //                 ItemBitmap = Bitmap { File = "navhead.bmp"; };
                HelpID = HID_NAVI_TBX10 ;
                Text = "Kopfzeile" ;
                Text [ English ] = "Header" ;
                Text [ norwegian ] = "Header" ;
                Text [ italian ] = "Intestazione" ;
                Text [ portuguese_brazilian ] = "Cabeçalho" ;
                Text [ portuguese ] = "Cabeçalho" ;
                Text [ finnish ] = "Yläteksti" ;
                Text [ danish ] = "Sidehoved" ;
                Text [ french ] = "En-tête " ;
                Text [ swedish ] = "Sidhuvud" ;
                Text [ dutch ] = "Koptekst" ;
                Text [ spanish ] = "Encabezamiento" ;
                Text [ english_us ] = "Header" ;
                Text[ chinese_simplified ] = "ҳü";
                Text[ russian ] = "Âåðõíèé êîëîíòèòóë";
                Text[ polish ] = "Nag³ówek";
                Text[ japanese ] = "ͯÀÞ";
                Text[ chinese_traditional ] = "­¶­º";
                Text[ arabic ] = "ÑÃÓ ÇáÕÝÍÉ";
                Text[ greek ] = "Êåöáëßäá";
                Text[ korean ] = "¸Ó¸®±Û";
                Text[ turkish ] = "Üstbilgi";
            };
            ToolBoxItem
            {
                Identifier = FN_SELECT_FOOTER ;
                 //                 ItemBitmap = Bitmap { File = "navfoot.bmp"; };
                HelpID = HID_NAVI_TBX11 ;
                /* ### ACHTUNG: Neuer Text in Resource? Fußzeile : Fu˜zeile */
                Text = "Fußzeile" ;
                Text [ English ] = "Footer" ;
                Text [ norwegian ] = "Footer" ;
                Text [ italian ] = "Piè di pagina" ;
                Text [ portuguese_brazilian ] = "Rodapé" ;
                Text [ portuguese ] = "Rodapé" ;
                Text [ finnish ] = "Alateksti" ;
                Text [ danish ] = "Sidefod" ;
                Text [ french ] = "Pied de page" ;
                Text [ swedish ] = "Sidfot" ;
                Text [ dutch ] = "Voettekst" ;
                Text [ spanish ] = "Pie de página" ;
                Text [ english_us ] = "Footer" ;
                /* ### ACHTUNG: Neuer Text in Resource? Springen zur Fußzeile : Springen zur Fu˜zeile */
                Text[ chinese_simplified ] = "Ò³½Å";
                Text[ russian ] = "Íèæíèé êîëîíòèòóë";
                Text[ polish ] = "Stopka";
                Text[ japanese ] = "̯À";
                Text[ chinese_traditional ] = "­¶§À";
                Text[ arabic ] = "ÊÐííá ÇáÕÝÍÉ";
                Text[ greek ] = "ÕðïóÝëéäï";
                Text[ korean ] = "¹Ù´Ú±Û";
                Text[ turkish ] = "Altbilgi";
            };
            ToolBoxItem
            {
                Identifier = FN_SELECT_FOOTNOTE ;
                 //                 ItemBitmap = Bitmap { File = "navnote.bmp"; };
                HelpID = HID_NAVI_TBX12 ;
                Text = "Anker<->Text" ;
                Text [ English ] = "Anchor<->Text" ;
                Text [ norwegian ] = "Anker<->Tekst" ;
                Text [ italian ] = "Ancoraggio<->Testo" ;
                Text [ portuguese_brazilian ] = "Âncora<->Texto" ;
                Text [ portuguese ] = "Âncora<->Texto" ;
                Text [ finnish ] = "Ankkuri<->Teksti" ;
                Text [ danish ] = "Anker<->Tekst" ;
                Text [ french ] = "Ancre <-> texte" ;
                Text [ swedish ] = "Ankare<->Text" ;
                Text [ dutch ] = "Anker<->Tekst" ;
                Text [ spanish ] = "Ancla <->Texto" ;
                Text [ english_us ] = "Anchor<->Text" ;
                /* ### ACHTUNG: Neuer Text in Resource? Springen zwischen Fußnotenankern und dem Fußnotentext : Springen zwischen Fu˜notenankern und dem Fu˜notentext */
                Text[ chinese_simplified ] = "±ê¼Ç<->ÕýÎÄ";
                Text[ russian ] = "Ïðèâÿçêà<->Òåêñò";
                Text[ polish ] = "Kotwica<->Tekst";
                Text[ japanese ] = "‹r’";
                Text[ chinese_traditional ] = "¼Ð¸¹<->¤º¤å";
                Text[ arabic ] = "ãÑÓÇÉ<->äÕ";
                Text[ greek ] = "Áãêýñùóç<->Êåßìåíï";
                Text[ korean ] = "°íÁ¤<->ÅØ½ºÆ®";
                Text[ turkish ] = "Sabitleyici<->Metin";
            };
            ToolBoxItem
            {
                Type = TOOLBOXITEM_SEPARATOR ;
            };
            ToolBoxItem
            {
                Identifier = FN_OUTLINE_LEVEL ;
                HelpID = HID_NAVI_TBX13 ;
                /* ### ACHTUNG: Neuer Text in Resource? Angezeigte Überschriftenebenen : Angezeigte šberschriftenebenen */
                Text = "Angezeigte Überschriftenebenen" ;
                Text [ English ] = "Number of outline level" ;
                DropDown = TRUE ;
                Text [ dutch ] = "Weergegeven kopregelniveaus" ;
                Text [ english_us ] = "Heading Levels Shown" ;
                Text [ italian ] = "Livelli di intestazioni visualizzati" ;
                Text [ spanish ] = "Niveles de encabezados mostrados" ;
                Text [ french ] = "Niveaux de titres affichés" ;
                Text [ swedish ] = "Visade överskriftsnivåer" ;
                Text [ danish ] = "Viste overskriftsniveauer" ;
                Text [ portuguese_brazilian ] = "Angezeigte Überschriftenebenen" ;
                Text [ portuguese ] = "Níveis de títulos mostrados" ;
                Text[ chinese_simplified ] = "ÏÔʾµÄ´ó¸Ù¼¶";
                Text[ russian ] = "Ïîêàçàííûå óðîâíè ñòðóêòóðû";
                Text[ polish ] = "Wyœwietlone poziomy konspektu";
                Text[ japanese ] = "±³Ä×²Ý ÚÍÞÙ";
                Text[ chinese_traditional ] = "Åã¥Üªº¤jºõ¯Å";
                Text[ arabic ] = "ãÓÊæíÇÊ ÇáÚäÇæíä ÇáÙÇåÑÉ";
                Text[ greek ] = "Åìöáíéæüìåíá åðßðåäá åðéêåöáëßäùí";
                Text[ korean ] = "¿Ü°û¼± ¼öÁØ";
                Text[ turkish ] = "Görüntülenen baþlýk düzeyleri";
            };
            ToolBoxItem
            {
                Type = TOOLBOXITEM_SEPARATOR ;
            };
            ToolBoxItem
            {
                Identifier = FN_ITEM_LEFT ;
                HelpID = HID_NAVI_TBX14 ;
                 //                 ItemBitmap = Bitmap { File = "navchlf.bmp"; };
                Text = "Ebene hoch" ;
                Text [ English ] = "Increase Level" ;
                Text [ norwegian ] = "+++Increase Level" ;
                Text [ italian ] = "Livello superiore" ;
                Text [ portuguese_brazilian ] = "Aumentar Nível" ;
                Text [ portuguese ] = "Subir um nível" ;
                Text [ finnish ] = "Korota tasoa" ;
                Text [ danish ] = "Niveau op" ;
                Text [ french ] = "Hausser d'un niveau" ;
                Text [ swedish ] = "Höj nivån" ;
                Text [ dutch ] = "Hoger niveau" ;
                Text [ spanish ] = "Subir un nivel" ;
                Text [ english_us ] = "Promote Level" ;
                Text[ chinese_simplified ] = "Éý¼¶";
                Text[ russian ] = "Íà îäèí óðîâåíü ââåðõ";
                Text[ polish ] = "Podnieœ poziom";
                Text[ japanese ] = "ÚÍÞقðã‚°‚é";
                Text[ chinese_traditional ] = "¤É¯Å";
                Text[ arabic ] = "ãÓÊæì áÃÚáì";
                Text[ greek ] = "Ðñïâéâáóìüò åðéðÝäïõ";
                Text[ korean ] = "¼öÁØ ¿Ã¸®±â";
                Text[ turkish ] = "Düzeyi yukarý al";
            };
            ToolBoxItem
            {
                Identifier = FN_ITEM_RIGHT ;
                 //                 ItemBitmap = Bitmap { File = "navchrg.bmp"; };
                HelpID = HID_NAVI_TBX15 ;
                Text = "Ebene senken" ;
                Text [ English ] = "Decrease Level" ;
                Text [ norwegian ] = "+++Decrease Level" ;
                Text [ italian ] = "Livello inferiore" ;
                Text [ portuguese_brazilian ] = "Diminuir Nível" ;
                Text [ portuguese ] = "Descer um nível" ;
                Text [ finnish ] = "Laske tasoa" ;
                Text [ danish ] = "Niveau ned" ;
                Text [ french ] = "Abaisser d'un niveau" ;
                Text [ swedish ] = "Sänk nivån" ;
                Text [ dutch ] = "Lager niveau" ;
                Text [ spanish ] = "Bajar un nivel" ;
                Text [ english_us ] = "Demote Level" ;
                Text[ chinese_simplified ] = "½µ¼¶";
                Text[ russian ] = "Íà îäèí óðîâåíü âíèç";
                Text[ polish ] = "Obni¿ poziom";
                Text[ japanese ] = "ÚÍÞÙ‚ð‰º‚°‚é";
                Text[ chinese_traditional ] = "­°¯Å";
                Text[ arabic ] = "ãÓÊæì áÃÓÝá";
                Text[ greek ] = "Õðïâéâáóìüò åðéðÝäïõ";
                Text[ korean ] = "¼öÁØ ³·Ãß±â";
                Text[ turkish ] = "Düzeyi aþaðý çek";
            };
        };
    };
    ToolBox TB_GLOBAL
    {
        Pos = MAP_PIXEL ( 5 , 5 ) ;
        Size = MAP_PIXEL ( 300 , 47 ) ;
        LineCount = 1 ;
        Hide = TRUE ;
        ItemList =
        {
            ToolBoxItem
            {
                Identifier = FN_GLOBAL_SWITCH ;
                HelpID = HID_NAVI_TBX17 ;
                Text = "Umschalten" ;
                Text [ English ] = "Switch" ;
                Text [ english_us ] = "Toggle" ;
                Text [ portuguese_brazilian ] = "Umschalten" ;
                Text [ swedish ] = "Växla" ;
                Text [ danish ] = "Skift" ;
                Text [ italian ] = "Commuta" ;
                Text [ spanish ] = "Conmutar" ;
                Text [ french ] = "Basculer" ;
                Text [ dutch ] = "Omschakelen" ;
                Text [ portuguese ] = "Comutar" ;
                Text[ chinese_simplified ] = "Çл»";
                Text[ russian ] = "Ïåðåêëþ÷èòü";
                Text[ polish ] = "Prze³¹cz";
                Text[ japanese ] = "Ø‚è‘Ö‚¦";
                Text[ chinese_traditional ] = "Âà´«";
                Text[ arabic ] = "ÇáÊÈÏíá";
                Text[ greek ] = "ÅíáëëáãÞ";
                Text[ korean ] = "Åä±Û";
                Text[ turkish ] = "Toggle";
            };
            ToolBoxItem
            {
                Type = TOOLBOXITEM_SEPARATOR ;
            };
            ToolBoxItem
            {
                Identifier = FN_GLOBAL_EDIT ;
                HelpID = HID_NAVI_TBX18 ;
                Text = "Bearbeiten" ;
                Text [ English ] = "Edit" ;
                Text [ english_us ] = "Edit" ;
                Text [ portuguese_brazilian ] = "Bearbeiten" ;
                Text [ swedish ] = "Redigera" ;
                Text [ danish ] = "Rediger" ;
                Text [ italian ] = "Modifica" ;
                Text [ spanish ] = "Editar" ;
                Text [ french ] = "Éditer" ;
                Text [ dutch ] = "Bewerken" ;
                Text [ portuguese ] = "Editar" ;
                Text[ chinese_simplified ] = "±à¼­";
                Text[ russian ] = "Ïðàâêà";
                Text[ polish ] = "Edytuj";
                Text[ japanese ] = "•ҏW";
                Text[ chinese_traditional ] = "½s¿è";
                Text[ arabic ] = "ÊÍÑíÑ";
                Text[ greek ] = "Åðåîåñãáóßá";
                Text[ korean ] = "ÆíÁý";
                Text[ turkish ] = "Düzenle";
            };
            ToolBoxItem
            {
                Identifier = FN_GLOBAL_UPDATE ;
                HelpID = HID_NAVI_TBX19 ;
                Text = "Aktualisieren" ;
                Text [ English ] = "Update" ;
                Text [ english_us ] = "Update" ;
                Text [ portuguese_brazilian ] = "Aktualisieren" ;
                Text [ swedish ] = "Uppdatera" ;
                Text [ danish ] = "Opdater" ;
                Text [ italian ] = "Aggiorna" ;
                Text [ spanish ] = "Actualizar" ;
                Text [ french ] = "Actualiser" ;
                Text [ dutch ] = "Actualiseren" ;
                Text [ portuguese ] = "Actualizar" ;
                Text[ chinese_simplified ] = "¸üÐÂ";
                Text[ russian ] = "Îáíîâèòü";
                Text[ polish ] = "Aktualizuj";
                Text[ japanese ] = "XV‚·‚é";
                Text[ chinese_traditional ] = "§ó·s";
                Text[ arabic ] = "ÊÍÏíË";
                Text[ greek ] = "ÅíçìÝñùóç";
                Text[ korean ] = "¾÷ µ¥ÀÌÆ®";
                Text[ turkish ] = "Güncelle";
            };
            ToolBoxItem
            {
                Identifier = FN_GLOBAL_OPEN ;
                HelpID = HID_NAVI_TBX20 ;
                /* ### ACHTUNG: Neuer Text in Resource? Einfügen : Einf³gen */
                Text = "Einfügen" ;
                Text [ English ] = "Insert" ;
                Text [ english_us ] = "Insert" ;
                Text [ portuguese_brazilian ] = "Einfügen" ;
                Text [ swedish ] = "Infoga" ;
                Text [ danish ] = "Sæt ind" ;
                Text [ italian ] = "Inserisci" ;
                Text [ spanish ] = "Insertar" ;
                Text [ french ] = "Insertion" ;
                Text [ dutch ] = "Invoegen" ;
                Text [ portuguese ] = "Inserir" ;
                Text[ chinese_simplified ] = "²åÈë";
                Text[ russian ] = "Âñòàâêà";
                Text[ polish ] = "Wstaw";
                Text[ japanese ] = "‘}“ü";
                Text[ chinese_traditional ] = "´¡¤J";
                Text[ arabic ] = "ÅÏÑÇÌ";
                Text[ greek ] = "ÅéóáãùãÞ";
                Text[ korean ] = "»ðÀÔ";
                Text[ turkish ] = "Ekle";
            };
            ToolBoxItem
            {
                Type = TOOLBOXITEM_SEPARATOR ;
            };
            ToolBoxItem
            {
                Identifier = FN_GLOBAL_SAVE_CONTENT ;
                HelpID = HID_NAVI_TBX21 ;
                Text = "Inhalte mitspeichern" ;
                Text [ English ] = "Save content" ;
                Text [ english_us ] = "Save Contents as well" ;
                Text [ portuguese_brazilian ] = "Inhalte mitspeichern" ;
                Text [ swedish ] = "Spara med innehåll" ;
                Text [ danish ] = "Gem med indhold" ;
                Text [ italian ] = "Salva anche i contenuti" ;
                Text [ spanish ] = "Guardar contenidos" ;
                Text [ french ] = "Enregistrer le contenu" ;
                Text [ dutch ] = "Inhoud opslaan" ;
                Text [ portuguese ] = "Guardar também conteúdos" ;
                Text[ russian ] = "Ñîõðàíèòü ñîäåðæèìîå";
                Text[ polish ] = "Zapisz zawartoϾ";
                Text[ japanese ] = "“à—e‚ð•Û‘¶‚·‚é";
                Text[ chinese_simplified ] = "´æÅÌÄÚÈÝ";
                Text[ chinese_traditional ] = "Àx¦s¤º®e";
                Text[ arabic ] = "ÍÝÙ ÇáãÍÊæíÇÊ";
                Text[ greek ] = "ÁðïèÞêåõóç êáé ôùí ðåñéå÷ïìÝíùí";
                Text[ korean ] = "³»¿ë ÀúÀå";
                Text[ turkish ] = "Ýçeriði de kaydet";
            };
            ToolBoxItem
            {
                Type = TOOLBOXITEM_SEPARATOR ;
            };
            ToolBoxItem
            {
                Identifier = FN_ITEM_UP ;
                HelpID = HID_NAVI_TBX22 ;
                /* ### ACHTUNG: Neuer Text in Resource? Nach oben verschieben : Nach unten verschieben */
                Text = "Nach oben verschieben" ;
                Text [ English ] = "Move up" ;
                Text [ english_us ] = "Move Up" ;
                Text [ portuguese_brazilian ] = "Nach unten verschieben" ;
                Text [ swedish ] = "Flytta uppåt" ;
                Text [ danish ] = "Flyt opad" ;
                Text [ italian ] = "Sposta verso l'alto" ;
                Text [ spanish ] = "Desplazar hacia arriba" ;
                Text [ french ] = "Déplacer vers le haut" ;
                Text [ dutch ] = "Naar boven verplaatsen" ;
                Text [ portuguese ] = "Mover para cima" ;
                Text[ chinese_simplified ] = "ÏòÉÏÒÆ¶¯";
                Text[ russian ] = "Ïåðåìåñòèòü ââåðõ";
                Text[ polish ] = "Przenieœ w górê";
                Text[ japanese ] = "ã•û‚ÖˆÚ“®";
                Text[ chinese_traditional ] = "¦V¤W²¾°Ê";
                Text[ arabic ] = "ÅÒÇÍÉ Åáì ÃÚáì";
                Text[ greek ] = "ÌåôáöïñÜ ðñïò ôá ðÜíù";
                Text[ korean ] = "À§·Î À̵¿";
                Text[ turkish ] = "Yukarý taþý";
            };
            ToolBoxItem
            {
                Identifier = FN_ITEM_DOWN ;
                HelpID = HID_NAVI_TBX23 ;
                /* ### ACHTUNG: Neuer Text in Resource? Nach unten verschieben : Nach oben verschieben */
                Text = "Nach unten verschieben" ;
                Text [ English ] = "Move down" ;
                Text [ english_us ] = "Move Down" ;
                Text [ portuguese_brazilian ] = "Nach oben verschieben" ;
                Text [ swedish ] = "Flytta nedåt" ;
                Text [ danish ] = "Flyt nedad" ;
                Text [ italian ] = "Sposta verso il basso" ;
                Text [ spanish ] = "Desplazar hacia abajo" ;
                Text [ french ] = "Déplacer vers le bas" ;
                Text [ dutch ] = "Naar beneden verplaatsen" ;
                Text [ portuguese ] = "Mover para baixo" ;
                Text[ chinese_simplified ] = "ÏòÏÂÒÆ¶¯";
                Text[ russian ] = "Ïåðåìåñòèòü âíèç";
                Text[ polish ] = "Przenieœ w dó³";
                Text[ japanese ] = "‰º•û‚ÖˆÚ“®";
                Text[ chinese_traditional ] = "¦V¤U²¾°Ê";
                Text[ arabic ] = "ÅÒÇÍÉ Åáì ÃÓÝá";
                Text[ greek ] = "ÌåôáöïñÜ ðñïò ôá êÜôù";
                Text[ korean ] = "¾Æ·¡·Î À̵¿";
                Text[ turkish ] = "Aþaðý taþý";
            };
        };
    };
    /* TreeListBox */
    Control TL_CONTENT
    {
        HelpID = HID_NAVI_CONTENT ;
        Border = TRUE ;
        Pos = MAP_PIXEL ( 5 , 62 ) ;
        Size = MAP_PIXEL ( 274 , 112 ) ;
        TabStop = TRUE ;
        ClipChildren = TRUE ;
        Hide = TRUE ;
    };
    Control TL_GLOBAL
    {
        HelpID = HID_NAVI_GLOBAL ;
        Border = TRUE ;
        Pos = MAP_PIXEL ( 5 , 34 ) ;
        Size = MAP_PIXEL ( 274 , 112 ) ;
        TabStop = TRUE ;
        ClipChildren = TRUE ;
        Hide = TRUE ;
    };
    ListBox LB_DOCS
    {
        Border = TRUE ;
        Pos = MAP_PIXEL ( 5 , 115 ) ;
        Size = MAP_APPFONT ( 150 , 50 ) ;
        DropDown = TRUE ;
    };
    NumericField NF_PAGE
    {
        Border = TRUE ;
        Pos = MAP_PIXEL ( 50 , 29 ) ;
        Size = MAP_PIXEL ( 44 , 20 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Repeat = TRUE ;
        Spin = TRUE ;
        Minimum = 1 ;
        First = 1 ;
         // Outline als Default
        Maximum = 5 ;
        Last = 5 ;
        Value = 5 ;
    };
    String ST_OUTLINE_LEVEL
    {
        Text = "Gliederungsebenen" ;
        Text [ English ] = "Outline level" ;
        Text [ dutch ] = "Overzichtsniveaus" ;
        Text [ english_us ] = "Outline Level" ;
        Text [ italian ] = "Livelli di struttura" ;
        Text [ spanish ] = "Niveles del esquema" ;
        Text [ french ] = "Niveaux de plan" ;
        Text [ swedish ] = "Dispositionsnivåer" ;
        Text [ danish ] = "Dispositionsniveauer" ;
        Text [ portuguese_brazilian ] = "Gliederungsebenen" ;
        Text [ portuguese ] = "Níveis de esquema" ;
        Text[ chinese_simplified ] = "´ó¸Ù¼¶";
        Text[ russian ] = "Óðîâíè ñòðóêòóðû";
        Text[ polish ] = "Poziomy konspektu";
        Text[ japanese ] = "±³Ä×²Ý ÚÍÞÙ";
        Text[ chinese_traditional ] = "¤jºõ¯Å";
        Text[ arabic ] = "ãÓÊæíÇÊ ÇáÊÞÓíã";
        Text[ greek ] = "Åðßðåäá äéÜñèñùóçò";
        Text[ korean ] = "¿Ü°û¼± ¼öÁØ";
        Text[ turkish ] = "Anahat düzeyleri";
    };
    String ST_DRAGMODE
    {
        Text = "Dragmodus" ;
        Text [ English ] = "Drag mode" ;
        Text [ dutch ] = "Dragmodus" ;
        Text [ english_us ] = "Drag Mode" ;
        Text [ italian ] = "Modo trascina" ;
        Text [ spanish ] = "Modo Arrastrar" ;
        Text [ french ] = "Mode Glisser" ;
        Text [ swedish ] = "Draläge" ;
        Text [ danish ] = "Trækmodus" ;
        Text [ portuguese_brazilian ] = "Dragmodus" ;
        Text [ portuguese ] = "Modo Arrastar" ;
        Text[ chinese_simplified ] = "Í϶¯Ä£Ê½";
        Text[ russian ] = "Ðåæèì ïåðåòàñêèâàíèÿ";
        Text[ polish ] = "Tryb przeci¹gania";
        Text[ japanese ] = "ÄÞׯ¸Þ Ó°ÄÞ";
        Text[ chinese_traditional ] = "©ì¦²¼Ò¦¡";
        Text[ arabic ] = "ØÑíÞÉ ÇáÓÍÈ";
        Text[ greek ] = "ÊáôÜóôáóç óõñìïý";
        Text[ korean ] = "µå·¡±× ¸ðµå";
        Text[ turkish ] = "Sürükleme kipi";
    };
    String ST_HYPERLINK
    {
        /* ### ACHTUNG: Neuer Text in Resource? Als Hyperlink einfügen : Als Hyperlink einf³gen */
        Text = "Als Hyperlink einfügen" ;
        Text [ English ] = "Insert as hyperlink" ;
        Text [ english_us ] = "Insert as Hyperlink" ;
        Text [ portuguese_brazilian ] = "Hyperlink" ;
        Text [ swedish ] = "Infoga som hyperlänk" ;
        Text [ danish ] = "Indsæt som hyperlink" ;
        Text [ italian ] = "Inserisci come hyperlink" ;
        Text [ spanish ] = "Insertar como hiperenlace" ;
        Text [ french ] = "Insérer comme hyperlien" ;
        Text [ dutch ] = "Als Hyperlink invoegen" ;
        Text [ portuguese ] = "Inserir como hiperligação" ;
        Text[ chinese_simplified ] = "µ±×÷³¬Á´½Ó²åÈë";
        Text[ russian ] = "Âñòàâèòü êàê ãèïåðññûëêó";
        Text[ polish ] = "Wstaw jako hiper³¹cze";
        Text[ japanese ] = "ʲÊß°ØÝ¸‚Æ‚µ‚Ä‘}“ü";
        Text[ chinese_traditional ] = "·í§@¶W³sµ²´¡¤J";
        Text[ arabic ] = "ÅÏÑÇÌ ßÇÑÊÈÇØ ÊÔÚÈí";
        Text[ greek ] = "ÐñïóèÞêç ùò õðåñ-óýíäåóç";
        Text[ korean ] = "ÇÏÀÌÆÛ¸µÅ©·Î »ðÀÔ";
        Text[ turkish ] = "Hyperlink olarak ekle";
    };
    String ST_LINK_REGION
    {
        /* ### ACHTUNG: Neuer Text in Resource? Als Verknüpfung einfügen : Als Verkn³pfung einf³gen */
        Text = "Als Verknüpfung einfügen" ;
        Text [ English ] = "Insert as link" ;
        Text [ english_us ] = "Insert as Link" ;
        Text [ portuguese_brazilian ] = "Verknüpfung" ;
        Text [ swedish ] = "Infoga som länk" ;
        Text [ danish ] = "Indsæt som kæde" ;
        Text [ italian ] = "Inserisci come collegamento" ;
        Text [ spanish ] = "Insertar como vínculo" ;
        Text [ french ] = "Insérer comme lien" ;
        Text [ dutch ] = "Als koppeling invoegen" ;
        Text [ portuguese ] = "Inserir como ligação" ;
        Text[ chinese_simplified ] = "µ±×÷Á´½Ó²åÈë";
        Text[ russian ] = "Âñòàâèòü êàê ññûëêó";
        Text[ polish ] = "Wstaw jako ³¹cze";
        Text[ japanese ] = "ØÝ¸‚Æ‚µ‚Ä‘}“ü";
        Text[ chinese_traditional ] = "·í§@³sµ²´¡¤J";
        Text[ arabic ] = "ÅÏÑÇÌ ßÇÑÊÈÇØ";
        Text[ greek ] = "ÐñïóèÞêç ùò óýíäåóç";
        Text[ korean ] = "¿¬°á·Î »ðÀÔ";
        Text[ turkish ] = "Baðlantý olarak ekle";
    };
    String ST_COPY_REGION
    {
        /* ### ACHTUNG: Neuer Text in Resource? Als Kopie einfügen : Als Kopie einf³gen */
        Text = "Als Kopie einfügen" ;
        Text [ English ] = "Insert as copy" ;
        Text [ english_us ] = "Insert as Copy" ;
        Text [ portuguese_brazilian ] = "Kopie" ;
        Text [ swedish ] = "Infoga som kopia" ;
        Text [ danish ] = "Indsæt som kopi" ;
        Text [ italian ] = "Inserisci come copia" ;
        Text [ spanish ] = "Insertar como copia" ;
        Text [ french ] = "Insérer comme copie" ;
        Text [ dutch ] = "Als kopie invoegen" ;
        Text [ portuguese ] = "Inserir com cópia" ;
        Text[ chinese_simplified ] = "µ±×÷¸´¼þ²åÈë";
        Text[ russian ] = "Âñòàâèòü êàê êîïèþ";
        Text[ polish ] = "Wstaw jako kopiê";
        Text[ japanese ] = "ºËß°‚Æ‚µ‚Ä‘}“ü";
        Text[ chinese_traditional ] = "·í§@´_¥ó´¡¤J";
        Text[ arabic ] = "ÅÏÑÇÌ ßäÓÎÉ";
        Text[ greek ] = "ÐñïóèÞêç ùò áíôßãñáöï";
        Text[ korean ] = "º¹»ç·Î »ðÀÔ";
        Text[ turkish ] = "Kopya olarak ekle";
    };
    String ST_DISPLAY
    {
        Text = "Anzeige" ;
        Text [ English ] = "Display" ;
        Text [ english_us ] = "Display" ;
        Text [ italian ] = "Visualizzazione" ;
        Text [ spanish ] = "Visualización" ;
        Text [ french ] = "Affichage" ;
        Text [ dutch ] = "Weergave" ;
        Text [ swedish ] = "Visa" ;
        Text [ danish ] = "Visning" ;
        Text [ portuguese_brazilian ] = "Anzeige" ;
        Text [ portuguese ] = "Mostrar" ;
        Text[ chinese_simplified ] = "ÏÔʾ";
        Text[ russian ] = "Ïîêàçàòü";
        Text[ polish ] = "Wyœwietlenie";
        Text[ japanese ] = "•\\ަ";
        Text[ chinese_traditional ] = "Åã¥Ü";
        Text[ arabic ] = "ÇáÚÑÖ";
        Text[ greek ] = "ÅìöÜíéóç";
        Text[ korean ] = "Ç¥½Ã";
        Text[ turkish ] = "Görüntü";
    };
    String ST_ACTIVE_VIEW
    {
        Text = "Aktives Fenster" ;
        Text [ English ] = "Active Window" ;
        Text [ dutch ] = "Actief venster" ;
        Text [ english_us ] = "Active Window" ;
        Text [ italian ] = "Finestra attiva" ;
        Text [ spanish ] = "Ventana activa" ;
        Text [ french ] = "Fenêtre active" ;
        Text [ swedish ] = "Aktivt fönster" ;
        Text [ danish ] = "Aktivt vindue" ;
        Text [ portuguese_brazilian ] = "Aktives Fenster" ;
        Text [ portuguese ] = "Janela activa" ;
        Text[ chinese_simplified ] = "µ±Ç°µÄÊÓ´°";
        Text[ russian ] = "Àêòèâíîå îêíî";
        Text[ polish ] = "Aktywne okno";
        Text[ japanese ] = "±¸Ã¨Ìނȳ¨ÝÄÞ³";
        Text[ language_user1 ] = "èë? Îòêðûòîå - - - èëè: Îòêðûòîå - èëè: Îòêðûòîå";
        Text[ chinese_traditional ] = "·í«eªºµøµ¡";
        Text[ arabic ] = "ÇáäÇÝÐÉ ÇáäÔØÉ";
        Text[ greek ] = "Åíåñãü ðáñÜèõñï";
        Text[ korean ] = "Ȱ¼º â";
        Text[ turkish ] = "Etkin pencere";
    };
    String ST_HIDDEN
    {
        Text = "versteckt" ;
        Text [ English ] = "hidden" ;
        Text [ english_us ] = "hidden" ;
        Text [ italian ] = "nascosto" ;
        Text [ spanish ] = "oculto" ;
        Text [ french ] = "caché" ;
        Text [ dutch ] = "verborgen" ;
        Text [ swedish ] = "gömd" ;
        Text [ danish ] = "skjult" ;
        Text [ portuguese_brazilian ] = "versteckt" ;
        Text [ portuguese ] = "oculto" ;
        Text[ chinese_simplified ] = "ÒþÈë";
        Text[ russian ] = "ñêðûòûé";
        Text[ polish ] = "ukryty";
        Text[ japanese ] = "‰B‚µ";
        Text[ chinese_traditional ] = "Áô¤J";
        Text[ arabic ] = "ãÎÝí";
        Text[ greek ] = "êñõöü";
        Text[ korean ] = "¼û±â±â";
        Text[ turkish ] = "gizli";
    };
    String ST_ACTIVE
    {
        Text = "aktiv" ;
        Text [ English ] = "active" ;
        Text [ dutch ] = "actief" ;
        Text [ english_us ] = "active" ;
        Text [ italian ] = "attivo" ;
        Text [ spanish ] = "activo" ;
        Text [ french ] = "actif" ;
        Text [ swedish ] = "aktiv" ;
        Text [ danish ] = "aktiv" ;
        Text [ portuguese_brazilian ] = "aktiv" ;
        Text [ portuguese ] = "activo" ;
        Text[ chinese_simplified ] = "¼¤»îµÄ";
        Text[ russian ] = "àêòèâíûé";
        Text[ polish ] = "aktywny";
        Text[ japanese ] = "±¸Ã¨ÌÞ";
        Text[ chinese_traditional ] = "¿E¬¡ªº";
        Text[ arabic ] = "äÔØ";
        Text[ greek ] = "åíåñãü";
        Text[ korean ] = "Ȱ¼º";
        Text[ turkish ] = "etkin";
    };
    String ST_INACTIVE
    {
        Text = "inaktiv" ;
        Text [ English ] = "inactive" ;
        Text [ english_us ] = "inactive" ;
        Text [ italian ] = "inattivo" ;
        Text [ spanish ] = "inactivo" ;
        Text [ french ] = "inactif" ;
        Text [ dutch ] = "inactief" ;
        Text [ swedish ] = "inaktiv" ;
        Text [ danish ] = "inaktiv" ;
        Text [ portuguese_brazilian ] = "inaktiv" ;
        Text [ portuguese ] = "inactivo" ;
        Text[ chinese_simplified ] = "ʧ»îµÄ";
        Text[ russian ] = "íåàêòèâíûé";
        Text[ polish ] = "nieaktywny";
        Text[ japanese ] = "±¸Ã¨ÌނłȂ¢";
        Text[ chinese_traditional ] = "¥¢¬¡ªº";
        Text[ arabic ] = "ÛíÑ äÔØ";
        Text[ greek ] = "ìç åíåñãü";
        Text[ korean ] = "ºñ Ȱ¼º";
        Text[ turkish ] = "etkin deðil";
    };
    String ST_EDIT_ENTRY
    {
        Text = "~Bearbeiten..." ;
        Text [ English ] = "~Edit..." ;
        Text [ english_us ] = "Edit..." ;
        Text [ swedish ] = "Redigera..." ;
        Text [ danish ] = "Rediger..." ;
        Text [ italian ] = "~Modifica..." ;
        Text [ spanish ] = "Edi~tar..." ;
        Text [ french ] = "~Modifier..." ;
        Text [ dutch ] = "~Bewerken..." ;
        Text [ portuguese_brazilian ] = "Bearbeiten..." ;
        Text [ portuguese ] = "~Editar..." ;
        Text[ chinese_simplified ] = "±à¼­...";
        Text[ russian ] = "Ïðàâêà...";
        Text[ polish ] = "Edytuj...";
        Text[ japanese ] = "•ҏW...";
        Text[ chinese_traditional ] = "½s¿è...";
        Text[ arabic ] = "ÊÍÑíÑ...";
        Text[ greek ] = "Åðåîåñãáóßá...";
        Text[ korean ] = "ÆíÁý...";
        Text[ turkish ] = "~Düzenle...";
    };
    String ST_UPDATE
    {
        Text = "~Aktualisieren" ;
        Text [ English ] = "Update" ;
        Text [ dutch ] = "~Actualiseren" ;
        Text [ english_us ] = "~Update" ;
        Text [ italian ] = "~Aggiorna" ;
        Text [ spanish ] = "Actuali~zar" ;
        Text [ french ] = "~Actualiser" ;
        Text [ swedish ] = "Uppd~atera" ;
        Text [ danish ] = "Opdater" ;
        Text [ portuguese ] = "~Actualizar" ;
        Text [ portuguese_brazilian ] = "Aktualisieren" ;
        Text[ chinese_simplified ] = "¸üÐÂ(~U)";
        Text[ russian ] = "Îáíîâèòü";
        Text[ polish ] = "Aktualizuj";
        Text[ japanese ] = "XV(~U)";
        Text[ chinese_traditional ] = "§ó·s(~U)";
        Text[ arabic ] = "ÊÍÏíË";
        Text[ greek ] = "~ÅíçìÝñùóç";
        Text[ korean ] = "¾÷ µ¥ÀÌÆ®(~U)";
        Text[ turkish ] = "~Güncelle";
    };
    String ST_EDIT_CONTENT
    {
        Text = "Bearbeiten" ;
        Text [ English ] = "Edit" ;
        Text [ english_us ] = "Edit" ;
        Text [ swedish ] = "Redigera" ;
        Text [ danish ] = "Rediger" ;
        Text [ italian ] = "Modifica" ;
        Text [ spanish ] = "Editar" ;
        Text [ french ] = "Edition" ;
        Text [ dutch ] = "Bewerken" ;
        Text [ portuguese_brazilian ] = "Bearbeiten" ;
        Text [ portuguese ] = "Editar" ;
        Text[ chinese_simplified ] = "±à¼­";
        Text[ russian ] = "Ïðàâêà";
        Text[ polish ] = "Edytuj";
        Text[ japanese ] = "•ҏW";
        Text[ chinese_traditional ] = "½s¿è";
        Text[ arabic ] = "ÊÍÑíÑ";
        Text[ greek ] = "Åðåîåñãáóßá";
        Text[ korean ] = "ÆíÁý";
        Text[ turkish ] = "Düzenle";
    };
    String ST_INSERT
    {
        /* ### ACHTUNG: Neuer Text in Resource? Einfügen : Einf³gen */
        Text = "Einfügen" ;
        Text [ English ] = "Insert" ;
        Text [ norwegian ] = "Sette inn" ;
        Text [ italian ] = "Inserisci" ;
        Text [ portuguese_brazilian ] = "Inserir" ;
        Text [ portuguese ] = "Inserir" ;
        Text [ finnish ] = "Lisää" ;
        Text [ danish ] = "Indsæt" ;
        Text [ french ] = "Insérer" ;
        Text [ swedish ] = "Infoga" ;
        Text [ dutch ] = "Invoegen" ;
        Text [ spanish ] = "Insertar" ;
        Text [ english_us ] = "Insert" ;
        Text[ chinese_simplified ] = "²åÈë";
        Text[ russian ] = "Âñòàâêà";
        Text[ polish ] = "Wstaw";
        Text[ japanese ] = "‘}“ü";
        Text[ chinese_traditional ] = "´¡¤J";
        Text[ arabic ] = "ÅÏÑÇÌ";
        Text[ greek ] = "ÅéóáãùãÞ";
        Text[ korean ] = "»ðÀÔ";
        Text[ turkish ] = "Ekle";
    };
    String ST_INDEX
    {
        Text = "~Verzeichnis" ;
        Text [ English ] = "Inde~x" ;
        Text[ english_us ] = "~Index";
        Text[ portuguese ] = "~Índice";
        Text[ russian ] = "Óêàçàòåëü";
        Text[ greek ] = "Å~õñåôÞñéï";
        Text[ dutch ] = "~Index";
        Text[ french ] = "~Index";
        Text[ spanish ] = "Í~ndice";
        Text[ italian ] = "Indice";
        Text[ danish ] = "Indeks";
        Text[ swedish ] = "~Förteckning";
        Text[ polish ] = "Indeks";
        Text[ portuguese_brazilian ] = "Ín~ice";
        Text[ japanese ] = "õˆø(~I)";
        Text[ korean ] = "»öÀÎ(~I)";
        Text[ chinese_simplified ] = "Ŀ¼(~I)";
        Text[ chinese_traditional ] = "¯Á¤Þ(~I)";
        Text[ arabic ] = "ÝåÑÓ";
        Text[ turkish ] = "~Dizin";
    };
    String ST_FILE
    {
        Text = "Datei" ;
        Text [ English ] = "File" ;
        Text [ english_us ] = "File" ;
        Text [ portuguese_brazilian ] = "Datei" ;
        Text [ swedish ] = "Fil" ;
        Text [ danish ] = "Fil" ;
        Text [ italian ] = "File" ;
        Text [ spanish ] = "Archivo" ;
        Text [ french ] = "Fichier" ;
        Text [ dutch ] = "Bestand" ;
        Text [ portuguese ] = "Ficheiro" ;
        Text[ chinese_simplified ] = "Îļþ";
        Text[ russian ] = "Ôàéë";
        Text[ polish ] = "Plik";
        Text[ japanese ] = "̧²Ù";
        Text[ chinese_traditional ] = "ÀÉ®×";
        Text[ arabic ] = "ÇáãáÝ";
        Text[ greek ] = "Áñ÷åßï";
        Text[ korean ] = "ÆÄÀÏ";
        Text[ turkish ] = "Dosya";
    };
    String ST_NEW_FILE
    {
        Text = "Neues Dokument" ;
        Text [ English ] = "New document" ;
        Text [ english_us ] = "New Document" ;
        Text [ portuguese_brazilian ] = "Neues Dokument" ;
        Text [ swedish ] = "Nytt dokument" ;
        Text [ danish ] = "Nyt dokument" ;
        Text [ italian ] = "Nuovo documento" ;
        Text [ spanish ] = "Nuevo documento" ;
        Text [ french ] = "Nouveau document" ;
        Text [ dutch ] = "Nieuw document" ;
        Text [ portuguese ] = "Novo documento" ;
        Text[ chinese_simplified ] = "н¨Îĵµ";
        Text[ russian ] = "Íîâûé äîêóìåíò";
        Text[ polish ] = "Nowy dokument";
        Text[ japanese ] = "V‚µ‚¢ÄÞ·­ÒÝÄ";
        Text[ chinese_traditional ] = "¶}±Ò·sÀÉ";
        Text[ arabic ] = "ãÓÊäÏ ÌÏíÏ";
        Text[ greek ] = "Äçìéïõñãßá åããñÜöïõ";
        Text[ korean ] = "»õ ¹®¼­";
        Text[ turkish ] = "Yeni belge";
    };
    String ST_TEXT
    {
        Text = "Text" ;
        Text [ English ] = "Text" ;
        Text [ english_us ] = "Text" ;
        Text [ portuguese_brazilian ] = "Text" ;
        Text [ swedish ] = "Text" ;
        Text [ danish ] = "Tekst" ;
        Text [ italian ] = "Testo" ;
        Text [ spanish ] = "Texto" ;
        Text [ french ] = "Texte" ;
        Text [ dutch ] = "Tekst" ;
        Text [ portuguese ] = "Texto" ;
        Text[ chinese_simplified ] = "Îı¾";
        Text[ russian ] = "Òåêñò";
        Text[ polish ] = "Tekst";
        Text[ japanese ] = "÷½Ä";
        Text[ chinese_traditional ] = "¤å¦r";
        Text[ arabic ] = "ÇáäÕ";
        Text[ greek ] = "Êåßìåíï";
        Text[ korean ] = "ÅØ½ºÆ®";
        Text[ turkish ] = "Metin";
    };
    String ST_DELETE
    {
        /* ### ACHTUNG: Neuer Text in Resource? Löschen : L÷schen */
        Text = "Löschen" ;
        Text [ English ] = "Delete" ;
        Text [ norwegian ] = "Slett" ;
        Text [ italian ] = "Elimina" ;
        Text [ portuguese_brazilian ] = "Apagar" ;
        Text [ portuguese ] = "Eliminar" ;
        Text [ finnish ] = "Poista" ;
        Text [ danish ] = "Slet" ;
        Text [ french ] = "Supprimer" ;
        Text [ swedish ] = "Radera" ;
        Text [ dutch ] = "Wissen" ;
        Text [ spanish ] = "Eliminar" ;
        Text [ english_us ] = "Delete" ;
        Text[ chinese_simplified ] = "ɾ³ý";
        Text[ russian ] = "Óäàëèòü";
        Text[ polish ] = "Usuñ";
        Text[ japanese ] = "íœ";
        Text[ chinese_traditional ] = "§R°£";
        Text[ arabic ] = "ÍÐÝ";
        Text[ greek ] = "ÄéáãñáöÞ";
        Text[ korean ] = "»èÁ¦";
        Text[ turkish ] = "Sil";
    };
    String ST_DELETE_ENTRY
    {
        Text = "~Löschen" ;
        Text [ English ] = "~Delete" ;
        Text [ norwegian ] = "Slett" ;
        Text [ italian ] = "Elimina" ;
        Text [ portuguese_brazilian ] = "Apagar" ;
        Text [ portuguese ] = "E~liminar" ;
        Text [ finnish ] = "Poista" ;
        Text [ danish ] = "Slet" ;
        Text [ french ] = "~Supprimer" ;
        Text [ swedish ] = "~Radera" ;
        Text [ dutch ] = "Wis~sen" ;
        Text [ spanish ] = "~Eliminar" ;
        Text [ english_us ] = "~Delete" ;
        Text[ chinese_simplified ] = "ɾ³ý(~D)";
        Text[ russian ] = "Óäàëèòü";
        Text[ polish ] = "Usuñ";
        Text[ japanese ] = "íœ(~D)";
        Text[ chinese_traditional ] = "§R°£(~D)";
        Text[ arabic ] = "ÍÐÝ";
        Text[ greek ] = "ÄéáãñáöÞ";
        Text[ korean ] = "»èÁ¦(~D)";
        Text[ turkish ] = "~Sil";
    };
    String ST_UPDATE_SEL
    {
        Text = "Selektion" ;
        Text [ English ] = "Selection" ;
        Text [ english_us ] = "Selection" ;
        Text [ portuguese_brazilian ] = "Selektion" ;
        Text [ swedish ] = "Markering" ;
        Text [ danish ] = "Udvalg" ;
        Text [ italian ] = "Selezione" ;
        Text [ spanish ] = "Selección" ;
        Text [ french ] = "Sélection" ;
        Text [ dutch ] = "Selectie" ;
        Text [ portuguese ] = "Selecção" ;
        Text[ chinese_simplified ] = "Ñ¡ÖÐ";
        Text[ russian ] = "Âûäåëåíèå";
        Text[ polish ] = "Selekcja";
        Text[ japanese ] = "‘I‘ð”͈Í";
        Text[ chinese_traditional ] = "¿ï¤¤";
        Text[ arabic ] = "ÇáÊÍÏíÏ";
        Text[ greek ] = "ÅðéëïãÞ";
        Text[ korean ] = "¼±ÅÃ";
        Text[ turkish ] = "Seçim";
    };
    String ST_UPDATE_INDEX
    {
        Text = "Verzeichnisse" ;
        Text [ English ] = "Indexes" ;
        Text [ english_us ] = "Indexes" ;
        Text [ portuguese_brazilian ] = "Verzeichnisse" ;
        Text [ swedish ] = "Förteckningar" ;
        Text [ danish ] = "Indeks" ;
        Text [ italian ] = "Indici" ;
        Text [ spanish ] = "Índices" ;
        Text [ french ] = "Index" ;
        Text [ dutch ] = "Indices" ;
        Text [ portuguese ] = "Índices" ;
        Text[ chinese_simplified ] = "Ë÷Òý";
        Text[ russian ] = "Óêàçàòåëè";
        Text[ polish ] = "Indeksy";
        Text[ japanese ] = "–ÚŽŸ‚ƍõˆø";
        Text[ chinese_traditional ] = "¥Ø¿ý";
        Text[ arabic ] = "ÝåÇÑÓ";
        Text[ greek ] = "ÅõñåôÞñéá";
        Text[ korean ] = "»öÀÎ";
        Text[ turkish ] = "Dizin";
    };
    String ST_UPDATE_LINK
    {
        /* ### ACHTUNG: Neuer Text in Resource? Verknüpfungen : Verkn³pfungen */
        Text = "Verknüpfungen" ;
        Text [ English ] = "Links" ;
        Text [ english_us ] = "Links" ;
        Text [ portuguese_brazilian ] = "Verknüpfungen" ;
        Text [ swedish ] = "Länkar" ;
        Text [ danish ] = "Kæder" ;
        Text [ italian ] = "Collegamenti" ;
        Text [ spanish ] = "Vínculos" ;
        Text [ french ] = "Liens" ;
        Text [ dutch ] = "Koppelingen" ;
        Text [ portuguese ] = "Ligações" ;
        Text[ chinese_simplified ] = "Á´½Ó";
        Text[ russian ] = "Ññûëêè";
        Text[ polish ] = "£¹cza";
        Text[ japanese ] = "ØÝ¸";
        Text[ chinese_traditional ] = "±¶®|";
        Text[ arabic ] = "ÇÑÊÈÇØÇÊ";
        Text[ greek ] = "ÓõíäÝóåéò";
        Text[ korean ] = "¿¬°á";
        Text[ turkish ] = "Baðlantý";
    };
    String ST_UPDATE_ALL
    {
        Text = "Alles" ;
        Text [ English ] = "All" ;
        Text [ english_us ] = "All" ;
        Text [ portuguese_brazilian ] = "Alles" ;
        Text [ swedish ] = "Allt" ;
        Text [ danish ] = "Alt" ;
        Text [ italian ] = "Tutto" ;
        Text [ spanish ] = "Todo" ;
        Text [ french ] = "Tout" ;
        Text [ dutch ] = "Alles" ;
        Text [ portuguese ] = "Tudo" ;
        Text[ chinese_simplified ] = "È«²¿";
        Text[ russian ] = "Âñå";
        Text[ polish ] = "Wszystko";
        Text[ japanese ] = "‚·‚ׂÄ";
        Text[ chinese_traditional ] = "¥þ³¡";
        Text[ arabic ] = "Çáßá";
        Text[ greek ] = "¼ëá";
        Text[ korean ] = "Àüü";
        Text[ turkish ] = "Tümü";
    };
    String ST_REMOVE_INDEX
    {
        Text = "~Verzeichnis aufheben" ;
        Text [ English ] = "Dismiss index" ;
        Text [ english_us ] = "~Remove Index" ;
        Text [ portuguese_brazilian ] = "Verzeichnis aufheben" ;
        Text [ swedish ] = "Upphä~v förteckning" ;
        Text [ danish ] = "Ophæv indeks" ;
        Text [ italian ] = "Rimuovi indice" ;
        Text [ spanish ] = "Eliminar dire~ctorio" ;
        Text [ french ] = "~Supprimer l'index" ;
        Text [ dutch ] = "~Index opheffen" ;
        Text [ portuguese ] = "~Remover índice" ;
        Text[ chinese_simplified ] = "ɾ³ýĿ¼(~R)";
        Text[ russian ] = "Óáðàòü óêàçàòåëü";
        Text[ polish ] = "Usuñ indeks";
        Text[ japanese ] = "õˆø‚̉ðœ(~R)";
        Text[ chinese_traditional ] = "¨ú®ø¥Ø¿ý(~R)";
        Text[ arabic ] = "ÅÒÇáÉ ÇáÝåÑÓ";
        Text[ greek ] = "ÊáôÜñãçóç åõñåôçñßïõ";
        Text[ korean ] = "»öÀÎ »èÁ¦(~R)";
        Text[ turkish ] = "D~izini kaldýr";
    };
    String ST_REMOVE_TBL_PROTECTION
    {
        Text = "Schutz ~aufheben" ;
        Text [ English ] = "~Unprotect" ;
        Text [ norwegian ] = "~Ubeskytte" ;
        Text [ italian ] = "Disattiva~ protezione" ;
        Text [ portuguese_brazilian ] = "~Desproteger" ;
        Text [ portuguese ] = "D~esproteger" ;
        Text [ finnish ] = "~Unprotect" ;
        Text [ danish ] = "Ophæv beskyttelse" ;
        Text [ french ] = "Enlever la protection" ;
        Text [ swedish ] = "~Upphäv skydd" ;
        Text [ dutch ] = "Beveiliging ~opheffen" ;
        Text [ spanish ] = "~Desproteger" ;
        Text [ english_us ] = "~Unprotect" ;
        Text[ chinese_simplified ] = "È¡Ïû±£»¤(~U)";
        Text[ russian ] = "Ñíÿòü çàùèòó";
        Text[ polish ] = "Usuñ ochronê";
        Text[ japanese ] = "•ÛŒì‚̉ðœ(~U)";
        Text[ chinese_traditional ] = "¨ú®ø«OÅ@(~U)";
        Text[ arabic ] = "ÅáÛÇÁ ÇáÍãÇíÉ";
        Text[ greek ] = "¢ñóç ðñïóôáóßáò";
        Text[ korean ] = "º¸È£ ÇØÁ¦(~U)";
        Text[ turkish ] = "Korumayý ~kaldýr";
    };
    String ST_INVISIBLE
    {
        Text = "versteckt";
        Text[English] = "hidden";
        Text[ english_us ] = "hidden";
        Text[ portuguese ] = "oculto";
        Text[ russian ] = "ñïðÿòàí";
        Text[ greek ] = "êñõöÜ";
        Text[ dutch ] = "verborgen";
        Text[ french ] = "caché";
        Text[ spanish ] = "oculto";
        Text[ italian ] = "Nascosto";
        Text[ danish ] = "skjult";
        Text[ swedish ] = "gömd";
        Text[ polish ] = "schowany";
        Text[ portuguese_brazilian ] = "hidden";
        Text[ japanese ] = "‰B‚µ";
        Text[ korean ] = "¼û±â±â";
        Text[ chinese_simplified ] = "ÒþÈëµÄ";
        Text[ chinese_traditional ] = "Áô¤J";
        Text[ arabic ] = "ãÎÝí";
        Text[ turkish ] = "gizli";
    };
    String ST_BROKEN_LINK
    {
        Text = "Datei nicht gefunden: ";
        Text[English] = "File not found: ";
        Text[ italian ] = "File non trovato: ";
        Text[ portuguese_brazilian ] = "File not found: ";
        Text[ portuguese ] = "Ficheiro não encontrado: ";
        Text[ danish ] = "Fil blev ikke fundet: ";
        Text[ french ] = "Fichier introuvable : ";
        Text[ swedish ] = "Filen har ej hittats: ";
        Text[ dutch ] = "Bestand niet gevonden: ";
        Text[ spanish ] = "Archivo no encontrado: ";
        Text[ english_us ] = "File not found: ";
        Text[ chinese_simplified ] = "ûÓÐÕÒµ½Îļþ£º ";
        Text[ russian ] = "Ôàéë íå íàéäåí:  ";
        Text[ polish ] = "Pliku nie znaleziono:  ";
        Text[ japanese ] = "̧²Ù‚ªŒ©‚‚©‚è‚Ü‚¹‚ñ: ";
        Text[ chinese_traditional ] = "¨S¦³§ä¨ìÀɮסG ";
        Text[ arabic ] = "ÊÚÐÑ ÇáÚ辄 Úáì ÇáãáÝ: ";
        Text[ greek ] = "Äåí âñÝèçêå ôï áñ÷åßï: ";
        Text[ korean ] = "ÆÄÀÏÀÌ ¹ß°ßµÇÁö ¾Ê½À´Ï´Ù: ";
        Text[ turkish ] = "Dosya bulunamadý: ";
    };
    String ST_RENAME
    {
        Text = "~Umbenennen";
        Text[English] = "Rename";
        Text[ english_us ] = "~Rename";
        Text[ portuguese ] = "~Mudar nome";
        Text[ russian ] = "Ïåðåèìåíîâàòü";
        Text[ greek ] = "Ìåôïíïìáóßá";
        Text[ dutch ] = "~Naam wijzigen";
        Text[ french ] = "~Renommer";
        Text[ spanish ] = "Ca~mbiar nombre";
        Text[ italian ] = "Rinomina";
        Text[ danish ] = "Omdøb";
        Text[ swedish ] = "~Byt namn";
        Text[ polish ] = "Zmieñ nazwê";
        Text[ portuguese_brazilian ] = "Rename";
        Text[ japanese ] = "–¼‘O‚̕ύX(~R)";
        Text[ korean ] = "À̸§ ¹Ù²Ù±â(~R)";
        Text[ chinese_simplified ] = "ÖØÃüÃû(~R)";
        Text[ chinese_traditional ] = "­«·s©R¦W(~R)";
        Text[ arabic ] = "ÅÚÇÏÉ ÊÓãíÉ";
        Text[ turkish ] = "~Yeniden adlandýr";
    };
    String ST_READONLY_IDX
    {
        Text = "~Schreibgeschützt";
        Text[English] = "Readonly";
        Text[ english_us ] = "Read ~only";
        Text[ portuguese ] = "Só ~leitura";
        Text[ russian ] = "Òîëüêî äëÿ ÷òåíèÿ";
        Text[ greek ] = "Müíï ãéá áíÜãíùóç";
        Text[ dutch ] = "~Schrijfbeveiligd";
        Text[ french ] = "en ~lecture seule";
        Text[ spanish ] = "Solo le~ctura";
        Text[ italian ] = "A sola lettura";
        Text[ danish ] = "Skrivebeskyttet";
        Text[ swedish ] = "~Skrivskyddad";
        Text[ polish ] = "Tylko do odczytu";
        Text[ portuguese_brazilian ] = "Readonly";
        Text[ japanese ] = "“ǂݎæ‚èê—p(~O)";
        Text[ korean ] = "ÀбâÀü¿ë(~O)";
        Text[ chinese_simplified ] = "·À¸²Ð´(~O)";
        Text[ chinese_traditional ] = "¨¾Âмg(~O)";
        Text[ arabic ] = "ááÞÑÇÁÉ ÝÞØ";
        Text[ turkish ] = "Sa~lt okunur";
    };
    Text[ chinese_simplified ] = "ÖúÊÖ";
    Text[ russian ] = "Íàâèãàòîð";
    Text[ polish ] = "Nawigator";
    Text[ japanese ] = "ÅËÞ¹Þ°À";
    Text[ chinese_traditional ] = "§U¤â";
    Text[ arabic ] = "ÇáäÇÝíÌíÊæÑ";
    Text[ greek ] = "Navigator";
    Text[ korean ] = "³×ºñ°ÔÀÌÅÍ";
    Text[ turkish ] = "Navigatör";
};
ImageList IMG_NAVI_ENTRYBMP
{
    ImageBitmap = Bitmap { File = "nccntnt.bmp" ; };
    MaskColor = IMAGE_STDBTN_COLOR ;
    IdList =
    {
        20000 ;
        20001 ;
        20002 ;
        20003 ;
        20004 ;
        20005 ;
        20006 ;
        20007 ;
        20008 ;
        20009 ;
        20010 ;
        20102 ;
    };
    IdCount = { 12 ; };
};

diff --git a/sw/source/ui/utlui/numfmtlb.cxx b/sw/source/ui/utlui/numfmtlb.cxx
new file mode 100644
index 0000000..1184dd2
--- /dev/null
+++ b/sw/source/ui/utlui/numfmtlb.cxx
@@ -0,0 +1,688 @@
/*************************************************************************
 *
 *  $RCSfile: numfmtlb.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:50 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "hintids.hxx"

#ifndef _SV_SVAPP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _LANG_HXX //autogen
#include <tools/lang.hxx>
#endif
#ifndef _ZFORMAT_HXX //autogen
#define _ZFORLIST_DECLARE_TABLE
#include <svtools/zformat.hxx>
#endif
#ifndef _SFXITEMSET_HXX //autogen
#include <svtools/itemset.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SVX_SVXIDS_HRC //autogen
#include <svx/svxids.hrc>
#endif
#ifndef _SVX_NUMINF_HXX //autogen
#define ITEMID_NUMBERINFO SID_ATTR_NUMBERFORMAT_INFO
#include <svx/numinf.hxx>
#endif
#ifndef _SV_MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SVX_LANGITEM_HXX //autogen
#include <svx/langitem.hxx>
#endif
#ifndef _SVX_NUMFMT_HXX //autogen
#include <svx/numfmt.hxx>
#endif
#ifndef _SV_SYSTEM_HXX //autogen
#include <vcl/system.hxx>
#endif

#include "tblnumfm.hxx"
#include "docsh.hxx"
#include "swtypes.hxx"
#include "swmodule.hxx"
#include "view.hxx"
#include "wrtsh.hxx"

#include "utlui.hrc"
#include "numfmtlb.hxx"

#define C2S(cChar) UniString::CreateFromAscii(cChar)

// STATIC DATA -----------------------------------------------------------

/*--------------------------------------------------------------------
    Beschreibung:
                    nFormatType: Formate dieses Typs anzeigen
                    nDefFmt:     Dieses Format selektieren und ggf vorher
                                 einfuegen
 --------------------------------------------------------------------*/

NumFormatListBox::NumFormatListBox( Window* pWin, const ResId& rResId,
                                    short nFormatType, ULONG nDefFmt,
                                    BOOL bUsrFmts ) :
    ListBox             ( pWin, rResId ),
    nCurrFormatType     (-1),
    nStdEntry           (0),
    bOneArea            (FALSE),
    nDefFormat          (nDefFmt),
    pVw                 (0),
    pOwnFormatter       (0)
{
    Init(nFormatType, bUsrFmts);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

NumFormatListBox::NumFormatListBox( Window* pWin, SwView* pView,
                                    const ResId& rResId, short nFormatType,
                                    ULONG nDefFmt, BOOL bUsrFmts ) :
    ListBox             ( pWin, rResId ),
    nCurrFormatType     (-1),
    nStdEntry           (0),
    bOneArea            (FALSE),
    nDefFormat          (nDefFmt),
    pVw                 (pView),
    pOwnFormatter       (0)
{
    Init(nFormatType, bUsrFmts);
}

/* -----------------15.06.98 11:29-------------------
 *
 * --------------------------------------------------*/

void NumFormatListBox::Init(short nFormatType, BOOL bUsrFmts)
{
    SwView *pView = GetView();

    if (pView)
    {
        SwWrtShell &rSh = pView->GetWrtShell();
        SfxItemSet aSet( rSh.GetAttrPool(), RES_CHRATR_LANGUAGE, RES_CHRATR_LANGUAGE);
        rSh.GetAttr(aSet);
        eCurLanguage = ((const SvxLanguageItem&)aSet.Get( RES_CHRATR_LANGUAGE ) ).GetLanguage();
    }
    else
        eCurLanguage = Application::GetAppInternational().GetLanguage();

    if (bUsrFmts == FALSE)
        pOwnFormatter = new SvNumberFormatter(eCurLanguage);

    SetFormatType(nFormatType);
    SetDefFormat(nDefFormat);

    SetSelectHdl(LINK(this, NumFormatListBox, SelectHdl));
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

NumFormatListBox::~NumFormatListBox()
{
    if (pOwnFormatter)
        delete pOwnFormatter;
}
/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SwView* NumFormatListBox::GetView()
{
    if( pVw )
        return pVw;
    return ::GetActiveView();
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void NumFormatListBox::SetFormatType(const short nFormatType)
{
    if (nCurrFormatType == -1 ||
        (nCurrFormatType & nFormatType) == 0)   // Es gibt Mischformate, wie z.B. DateTime
    {
        SvNumberFormatter* pFormatter;

        if( pOwnFormatter )
            pFormatter = pOwnFormatter;
        else
        {
            SwView *pView = GetView();
            SwWrtShell &rSh = pView->GetWrtShell();
            pFormatter = rSh.GetNumberFormatter();
        }

        Clear();    // Alle Eintraege in der Listbox entfernen

        NfIndexTableOffset eOffsetStart = NF_NUMBER_START;
        NfIndexTableOffset eOffsetEnd = NF_NUMBER_START;

        switch( nFormatType )
        {
        case NUMBERFORMAT_NUMBER:
            eOffsetStart=NF_NUMBER_START;
            eOffsetEnd=NF_NUMBER_END;
            break;

        case NUMBERFORMAT_PERCENT:
            eOffsetStart=NF_PERCENT_START;
            eOffsetEnd=NF_PERCENT_END;
            break;

        case NUMBERFORMAT_CURRENCY:
            eOffsetStart=NF_CURRENCY_START;
            eOffsetEnd=NF_CURRENCY_END;
            break;

        case NUMBERFORMAT_DATETIME:
            eOffsetStart=NF_DATE_START;
            eOffsetEnd=NF_TIME_END;
            break;

        case NUMBERFORMAT_DATE:
            eOffsetStart=NF_DATE_START;
            eOffsetEnd=NF_DATE_END;
            break;

        case NUMBERFORMAT_TIME:
            eOffsetStart=NF_TIME_START;
            eOffsetEnd=NF_TIME_END;
            break;

        case NUMBERFORMAT_SCIENTIFIC:
            eOffsetStart=NF_SCIENTIFIC_START;
            eOffsetEnd=NF_SCIENTIFIC_END;
            break;

        case NUMBERFORMAT_FRACTION:
            eOffsetStart=NF_FRACTION_START;
            eOffsetEnd=NF_FRACTION_END;
            break;

        case NUMBERFORMAT_LOGICAL:
            eOffsetStart=NF_BOOLEAN;
            eOffsetEnd=NF_BOOLEAN;
            break;

        case NUMBERFORMAT_TEXT:
            eOffsetStart=NF_TEXT;
            eOffsetEnd=NF_TEXT;
            break;

        case NUMBERFORMAT_ALL:
            eOffsetStart=NF_NUMERIC_START;
            eOffsetEnd = NfIndexTableOffset( NF_INDEX_TABLE_ENTRIES - 1 );
            break;

        default:
            DBG_ERROR("what a format?");
            break;
        }

        const SvNumberformat* pFmt;
        USHORT nPos, i = 0;
        ULONG  nFormat;
        Color* pCol;
        double fVal = GetDefValue( pFormatter, nFormatType );
        String sValue;

        ULONG nSysNumFmt = pFormatter->GetFormatIndex(
                                        NF_NUMBER_SYSTEM, eCurLanguage );
        ULONG nSysShortDateFmt = pFormatter->GetFormatIndex(
                                        NF_DATE_SYSTEM_SHORT, eCurLanguage );
        ULONG nSysLongDateFmt = pFormatter->GetFormatIndex(
                                        NF_DATE_SYSTEM_LONG, eCurLanguage );

        for( long nIndex = eOffsetStart; nIndex <= eOffsetEnd; ++nIndex )
        {
            nFormat = pFormatter->GetFormatIndex(
                            (NfIndexTableOffset)nIndex, eCurLanguage );
            pFmt = pFormatter->GetEntry( nFormat );

            if( nFormat == pFormatter->GetFormatIndex( NF_NUMBER_STANDARD,
                                                        eCurLanguage )
                || ((SvNumberformat*)pFmt)->GetOutputString( fVal, sValue, &pCol )
                || nFormatType == NUMBERFORMAT_UNDEFINED )
                    sValue = pFmt->GetFormatstring();
            else if( nFormatType == NUMBERFORMAT_TEXT )
            {
                String sTxt(C2S("\"ABC\""));
                pFormatter->GetOutputString( sTxt, nFormat, sValue, &pCol);
            }

            if (nFormat != nSysNumFmt       &&
                nFormat != nSysShortDateFmt &&
                nFormat != nSysLongDateFmt)
            {
                nPos = InsertEntry( sValue );
                SetEntryData( nPos, (void*)nFormat );

                if( nFormat == pFormatter->GetStandardFormat(
                                        nFormatType, eCurLanguage ) )
                    nStdEntry = i;
                ++i;
            }
        }

        if (!pOwnFormatter)
        {
            nPos = InsertEntry(SW_RESSTR( STR_DEFINE_NUMBERFORMAT ));
            SetEntryData( nPos, NULL );
        }

        SelectEntryPos( nStdEntry );

        nCurrFormatType = nFormatType;
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void NumFormatListBox::SetDefFormat(const ULONG nDefFmt)
{
    if (nDefFmt == ULONG_MAX)
    {
        nDefFormat = nDefFmt;
        return;
    }

    if (!nDefFmt)
        SelectEntryPos(nStdEntry);
    else
    {
        SvNumberFormatter* pFormatter;

        if (pOwnFormatter)
            pFormatter = pOwnFormatter;
        else
        {
            SwView *pView = GetView();
            SwWrtShell &rSh = pView->GetWrtShell();
            pFormatter = rSh.GetNumberFormatter();
        }

        short nType = pFormatter->GetType(nDefFmt);

        SetFormatType(nType);

        ULONG nFormat = pFormatter->GetFormatForLanguageIfBuiltIn(nDefFmt, eCurLanguage);

        for (USHORT i = 0; i < GetEntryCount(); i++)
        {
            if (nFormat == (ULONG)GetEntryData(i))
            {
                SelectEntryPos(i);
                nStdEntry = i;
                nDefFormat = GetFormat();
                return;
            }
        }

        // Kein Eintrag gefunden:
        double fValue = GetDefValue(pFormatter, nType);
        String sValue;
        Color* pCol = 0;

        if (nType == NUMBERFORMAT_TEXT)
        {
            String sTxt(C2S("\"ABC\""));
            pFormatter->GetOutputString(sTxt, nDefFmt, sValue, &pCol);
        }
        else
            pFormatter->GetOutputString(fValue, nDefFmt, sValue, &pCol);

        USHORT nPos = 0;
        while ((ULONG)GetEntryData(nPos) == ULONG_MAX)
            nPos++;

//
        ULONG nSysNumFmt = pFormatter->GetFormatIndex( NF_NUMBER_SYSTEM, eCurLanguage);
        ULONG nSysShortDateFmt = pFormatter->GetFormatIndex( NF_DATE_SYSTEM_SHORT, eCurLanguage);
        ULONG nSysLongDateFmt = pFormatter->GetFormatIndex( NF_DATE_SYSTEM_LONG, eCurLanguage);
        BOOL bSysLang = FALSE;
        if(::GetSystemLanguage() == eCurLanguage)
            bSysLang = TRUE;
        ULONG nNumFormatForLanguage = pFormatter->GetFormatForLanguageIfBuiltIn(nSysNumFmt, LANGUAGE_SYSTEM );
        ULONG nShortDateFormatForLanguage = pFormatter->GetFormatForLanguageIfBuiltIn(nSysShortDateFmt, LANGUAGE_SYSTEM );
        ULONG nLongDateFormatForLanguage = pFormatter->GetFormatForLanguageIfBuiltIn(nSysLongDateFmt, LANGUAGE_SYSTEM );

        if(nDefFmt == nSysNumFmt||
            nDefFmt == nSysShortDateFmt||
            nDefFmt == nSysLongDateFmt||
            bSysLang && (nDefFmt == nNumFormatForLanguage ||
            nDefFmt == nShortDateFormatForLanguage ||
            nDefFmt == nLongDateFormatForLanguage ))
            sValue += String(SW_RES(RID_STR_SYSTEM));

        nPos = InsertEntry(sValue, nPos);   // Als ersten numerischen Eintrag einfuegen
        SetEntryData(nPos, (void*)nDefFmt);
        SelectEntryPos(nPos);
    }
    nDefFormat = GetFormat();
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

ULONG NumFormatListBox::GetFormat() const
{
    USHORT nPos = GetSelectEntryPos();

    return (ULONG)GetEntryData(nPos);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

const String& NumFormatListBox::GetFormatStr() const
{
    return aEmptyStr;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

IMPL_LINK( NumFormatListBox, SelectHdl, ListBox *, pBox )
{
    USHORT nPos = pBox->GetSelectEntryPos();
    String sDefine(SW_RES( STR_DEFINE_NUMBERFORMAT ));
    SwView *pView = GetView();

    if (pView && nPos == pBox->GetEntryCount() - 1 && pBox->GetEntry(nPos) == sDefine)
    {
        SvNumberFormatter* pFormatter;

        SwWrtShell &rSh = pView->GetWrtShell();
        pFormatter = rSh.GetNumberFormatter();

        SfxItemSet aCoreSet( rSh.GetAttrPool(),
                            SID_ATTR_NUMBERFORMAT_VALUE, SID_ATTR_NUMBERFORMAT_VALUE,
                            SID_ATTR_NUMBERFORMAT_INFO, SID_ATTR_NUMBERFORMAT_INFO,
                            SID_ATTR_NUMBERFORMAT_ONE_AREA, SID_ATTR_NUMBERFORMAT_ONE_AREA,
                            SID_ATTR_NUMBERFORMAT_NOLANGUAGE, SID_ATTR_NUMBERFORMAT_NOLANGUAGE,
                            0 );


        double fValue = GetDefValue(pFormatter, nCurrFormatType);

        ULONG nFormat = pFormatter->GetStandardFormat(nCurrFormatType, eCurLanguage);
        SfxUInt32Item aVal(SID_ATTR_NUMBERFORMAT_VALUE, nFormat);
        aCoreSet.Put(aVal);

        SvxNumberInfoItem aNumInf(pFormatter, fValue, SID_ATTR_NUMBERFORMAT_INFO);
        aCoreSet.Put(aNumInf);

        if ((nCurrFormatType & NUMBERFORMAT_DATE) || (nCurrFormatType & NUMBERFORMAT_TIME))
            aCoreSet.Put(SfxBoolItem(SID_ATTR_NUMBERFORMAT_ONE_AREA, bOneArea));

        // Keine Sprachauswahl im Dialog, da Sprache im Textattribut enthalten ist
        aCoreSet.Put(SfxBoolItem(SID_ATTR_NUMBERFORMAT_NOLANGUAGE, TRUE));

        SwNumFmtDlg* pDlg = new SwNumFmtDlg(this, aCoreSet);

        if (RET_OK == pDlg->Execute())
        {
            const SfxPoolItem* pItem = pView->GetDocShell()->
                            GetItem( SID_ATTR_NUMBERFORMAT_INFO );

            if( pItem && 0 != ((SvxNumberInfoItem*)pItem)->GetDelCount() )
            {
                const ULONG* pDelArr = ((SvxNumberInfoItem*)pItem)->GetDelArray();

                for ( USHORT i = 0; i < ((SvxNumberInfoItem*)pItem)->GetDelCount(); i++ )
                    pFormatter->DeleteEntry( pDelArr[i] );
            }

            if( SFX_ITEM_SET == pDlg->GetOutputItemSet()->GetItemState(
                SID_ATTR_NUMBERFORMAT_VALUE, FALSE, &pItem ))
            {
                SetDefFormat(((SfxUInt32Item*)pItem)->GetValue());
            }
        }
        else
            SetDefFormat(nFormat);

        delete pDlg;
    }
    return 0;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

double NumFormatListBox::GetDefValue(SvNumberFormatter* pFormatter, const short nFormatType) const
{
    double fDefValue = 0.0;

    switch (nFormatType)
    {
        case NUMBERFORMAT_DATE:
        case NUMBERFORMAT_DATE|NUMBERFORMAT_TIME:
            fDefValue = SVX_NUMVAL_DATE;
            break;

        case NUMBERFORMAT_TIME:
            fDefValue = SVX_NUMVAL_TIME;
            break;
/*      {
            String sValue("31.8.1997 16:57:34");
            ULONG nFormat = pFormatter->GetStandardFormat(nFormatType, LANGUAGE_GERMAN);
            pFormatter->IsNumberFormat( sValue, nFormat, fDefValue );
        }
        break;*/

        case NUMBERFORMAT_TEXT:
        case NUMBERFORMAT_UNDEFINED:
        case NUMBERFORMAT_ENTRY_NOT_FOUND:
            fDefValue = 0;
            break;

        case NUMBERFORMAT_CURRENCY:
            fDefValue = SVX_NUMVAL_CURRENCY;
            break;

        case NUMBERFORMAT_PERCENT:
            fDefValue = SVX_NUMVAL_PERCENT;
            break;

        case NUMBERFORMAT_LOGICAL:
            fDefValue = SVX_NUMVAL_BOOLEAN;
            break;

        default:
            fDefValue = SVX_NUMVAL_STANDARD;
            break;
    }

    return fDefValue;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void NumFormatListBox::Clear()
{
    ListBox::Clear();
    nCurrFormatType = -1;
}

/*************************************************************************

      Source Code Control System - History

      $Log: not supported by cvs2svn $
      Revision 1.31  2000/09/18 16:06:18  willem.vandorp
      OpenOffice header added.

      Revision 1.30  2000/04/18 15:14:08  os
      UNICODE

      Revision 1.29  2000/03/03 15:17:05  os
      StarView remainders removed

      Revision 1.28  2000/02/25 09:53:39  hr
      #73447#: removed temporary

      Revision 1.27  2000/02/11 15:00:49  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.26  1999/06/28 12:54:58  JP
      Bug #67242#: SetFormatType - use eCurLanguage


      Rev 1.25   28 Jun 1999 14:54:58   JP
   Bug #67242#: SetFormatType - use eCurLanguage

      Rev 1.24   28 Jun 1999 13:57:44   JP
   Bug #67247#: SetFormatType - support of FormatTypeAll

      Rev 1.23   18 Jun 1999 15:28:02   OS
   #60657# Manual sorted number formats

      Rev 1.22   10 Jun 1999 13:14:52   JP
   have to change: no AppWin from SfxApp

      Rev 1.21   10 Feb 1999 14:13:02   OS
   #52055# Systemformate koennen auch unter 0x5000 liegen

      Rev 1.20   21 Jan 1999 11:07:18   OS
   #52055# [System] an Systemformat anhaengen

      Rev 1.19   15 Jun 1998 12:27:56   OM
   #51009# Numberformatter-Listbox ViewPtr reinreichen

      Rev 1.18   20 May 1998 14:24:02   OM
   Kombinierte DateTime-Formate verarbeiten

      Rev 1.17   19 May 1998 14:24:30   OM
   #47310 Definierte Standardwerte und keine Sprachauswahl

      Rev 1.16   11 Feb 1998 16:30:32   OM
   Textdarstellung fuer Felder

      Rev 1.15   13 Jan 1998 15:03:10   OM
   Formula-Field wieder unterstuetzt

      Rev 1.14   12 Jan 1998 12:57:12   OM
   Alle Sprachen anzeigen

      Rev 1.13   12 Jan 1998 12:42:16   OM
   Alle Sprachen anzeigen

      Rev 1.12   09 Jan 1998 10:07:26   OM
   Sprache organisieren

      Rev 1.11   08 Jan 1998 17:49:00   OM
   Neue Datumsfelder einfuegen

      Rev 1.10   06 Jan 1998 18:14:12   OM
   Felbefehl-Dlg

      Rev 1.9   19 Dec 1997 18:23:54   OM
   Feldbefehl-bearbeiten Dlg

      Rev 1.8   16 Dec 1997 17:04:50   OM
   Feldbefehle bearbeiten

      Rev 1.7   11 Dec 1997 17:01:26   OM
   Feldumstellung

      Rev 1.6   29 Nov 1997 15:08:58   MA
   includes

      Rev 1.5   21 Nov 1997 17:19:04   OM
   Feldbefehl-Umstellung: DocInfo

      Rev 1.4   21 Nov 1997 12:10:16   MA
   includes

      Rev 1.3   20 Nov 1997 17:02:34   OM
   Neuer Felddialog

      Rev 1.2   10 Nov 1997 15:29:04   OM
   Zahlenformat-Listbox

      Rev 1.1   07 Nov 1997 16:56:08   OM
   NumberFormat-Listbox

      Rev 1.0   07 Nov 1997 16:37:08   OM
   Initial revision.

*************************************************************************/
diff --git a/sw/source/ui/utlui/poolfmt.src b/sw/source/ui/utlui/poolfmt.src
new file mode 100644
index 0000000..b1be4e1
--- /dev/null
+++ b/sw/source/ui/utlui/poolfmt.src
@@ -0,0 +1,4956 @@
/*************************************************************************
 *
 *  $RCSfile: poolfmt.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:50 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#include "poolfmt.hrc"

 // -----------------
 // Format-Namen
 // -----------------
String STR_POOLCHR_FOOTNOTE
{
    /* ### ACHTUNG: Neuer Text in Resource? Fußnotenzeichen : Fu˜notenzeichen */
    Text = "Fußnotenzeichen" ;
    Text [ English ] = "Footnote" ;
    Text [ english_us ] = "Footnote Symbol" ;
    Text [ italian ] = "Carattere note a piè pagina" ;
    Text [ spanish ] = "Símbolo de nota al pie" ;
    Text [ french ] = "Symbole de note de bas de page" ;
    Text [ dutch ] = "Voetnootteken" ;
    Text [ swedish ] = "Fotnotstecken" ;
    Text [ danish ] = "Fodnotetegn" ;
    Text [ portuguese ] = "Símbolo de nota de rodapé" ;
    Text [ portuguese_brazilian ] = "Fußnotenzeichen" ;
    Text[ chinese_simplified ] = "×¢½Å·û";
    Text[ russian ] = "Çíàê ñíîñêè";
    Text[ polish ] = "Symbol przypisów doln.";
    Text[ japanese ] = "‹r’‹L†";
    Text[ chinese_traditional ] = "µù¸}²Å";
    Text[ arabic ] = "ÑãÒ ÇáÍÇÔíÉ ÇáÓÝáíÉ";
    Text[ greek ] = "Óýìâïëï õðïóçìåßùóçò";
    Text[ korean ] = "°¢ÁÖ ±âÈ£";
    Text[ turkish ] = "Dipnot karakterleri";
    Text[ language_user1 ] = " ";
};
String STR_POOLCHR_PAGENO
{
    Text = "Seitenzahl" ;
    Text [ English ] = "Page number" ;
    Text [ dutch ] = "Paginanummer" ;
    Text [ english_us ] = "Page Number" ;
    Text [ italian ] = "Numero di pagina" ;
    Text [ spanish ] = "Número de página" ;
    Text [ french ] = "Numéro de page" ;
    Text [ swedish ] = "Sidnummer" ;
    Text [ danish ] = "Sidetal" ;
    Text [ portuguese ] = "Número de páginas" ;
    Text [ portuguese_brazilian ] = "Seitenzahl" ;
    Text[ chinese_simplified ] = "Ò³Âë";
    Text[ russian ] = "Íîìåð ñòðàíèöû";
    Text[ polish ] = "IloϾ stron";
    Text[ japanese ] = "Íß°¼Þ”ԍ†";
    Text[ chinese_traditional ] = "­¶­±¸¹½X";
    Text[ arabic ] = "ÑÞã ÇáÕÝÍÉ";
    Text[ greek ] = "Áñéèìüò óåëßäáò";
    Text[ korean ] = "ÆäÀÌÁö ¹øÈ£";
    Text[ turkish ] = "Sayfa sayýsý";
    Text[ language_user1 ] = " ";
};
String STR_POOLCHR_LABEL
{
    Text = "Beschriftungszeichen" ;
    Text [ English ] = "Label" ;
    Text [ dutch ] = "Bijschrifttekens" ;
    Text [ english_us ] = "Caption characters" ;
    Text [ italian ] = "Carattere per dicitura" ;
    Text [ spanish ] = "Caracteres de etiqueta" ;
    Text [ french ] = "Caractères de la légende" ;
    Text [ swedish ] = "Bildtexttecken" ;
    Text [ danish ] = "Billedteksttegn" ;
    Text [ portuguese ] = "Caracteres para etiqueta" ;
    Text [ portuguese_brazilian ] = "Beschriftungszeichen" ;
    Text[ chinese_simplified ] = "±êÇ©ÎÄ";
    Text[ russian ] = "Òåêñò íàçâàíèÿ";
    Text[ polish ] = "Tekst etykiety";
    Text[ japanese ] = "Œ©o‚µ•¶Žš";
    Text[ chinese_traditional ] = "¼ÐÅÒ¤å";
    Text[ arabic ] = "ÃÍÑÝ ÇáÊÓãíÉ ÇáÊæÖíÍíÉ";
    Text[ greek ] = "×áñáêôÞñåò åðéãñáöÞò";
    Text[ korean ] = "ĸ¼Ç ¹®ÀÚ";
    Text[ turkish ] = "Etiket karakterleri";
    Text[ language_user1 ] = " ";
};
String STR_POOLCHR_DROPCAPS
{
    Text = "Initialenzeichen" ;
    Text [ English ] = "Drop caps" ;
    Text [ english_us ] = "Drop Caps" ;
    Text [ italian ] = "Carattere capolettera" ;
    Text [ spanish ] = "Iniciales" ;
    Text [ french ] = "Autre caractère" ;
    Text [ dutch ] = "Initialen" ;
    Text [ swedish ] = "Anfangstecken" ;
    Text [ danish ] = "Initialtegn" ;
    Text [ portuguese ] = "Iniciais" ;
    Text [ portuguese_brazilian ] = "Initialenzeichen" ;
    Text[ chinese_simplified ] = "×ÖÊ×´óд";
    Text[ russian ] = "Èíèöèàëû";
    Text[ polish ] = "Inicja³y";
    Text[ japanese ] = "ÄÞÛ¯Ìß·¬¯Ìß";
    Text[ chinese_traditional ] = "¦r­º¤j¼g";
    Text[ arabic ] = "ÇáÃÍÑÝ ÇáÇÓÊåáÇáíÉ";
    Text[ greek ] = "Êåöáëáßá ãñÜììáôá";
    Text[ korean ] = "´Ü¶ôÀÇ Ã¹¹®ÀÚ Àå½Ä";
    Text[ turkish ] = "Baþharfler";
    Text[ language_user1 ] = " ";
};
String STR_POOLCHR_NUM_LEVEL
{
    Text = "Nummerierungszeichen" ;
    Text [ English ] = "Numbering" ;
    Text [ english_us ] = "Numbering Symbols" ;
    Text [ italian ] = "Carattere di numerazione" ;
    Text [ spanish ] = "Carácter de numeración" ;
    Text [ french ] = "Caractères de numérotation" ;
    Text [ dutch ] = "Nummeringsteken" ;
    Text [ swedish ] = "Numreringstecken" ;
    Text [ danish ] = "Nummereringstegn" ;
    Text [ portuguese ] = "Caracteres de numeração" ;
    Text [ portuguese_brazilian ] = "Numerierungszeichen" ;
    Text[ chinese_simplified ] = "±àºÅ·ûºÅ";
    Text[ russian ] = "Çíàê íóìåðàöèè";
    Text[ polish ] = "Znaki numeracji";
    Text[ japanese ] = "”ԍ†•t‚¯‹L†";
    Text[ chinese_traditional ] = "½s¸¹²Å¸¹";
    Text[ arabic ] = "ÚáÇãÇÊ ÊÑÞíã";
    Text[ greek ] = "×áñáêôÞñåò áñßèìçóçò";
    Text[ korean ] = "¹øÈ£ ±âÈ£";
    Text[ turkish ] = "Numaralama karakterleri";
    Text[ language_user1 ] = " ";
};
String STR_POOLCHR_BUL_LEVEL
{
    /* ### ACHTUNG: Neuer Text in Resource? Aufzählungszeichen : Aufzõhlungszeichen */
    Text = "Aufzählungszeichen" ;
    Text [ English ] = "Bullet" ;
    Text [ english_us ] = "Bullet Symbols" ;
    Text [ italian ] = "Carattere per numerazione" ;
    Text [ spanish ] = "Viñetas" ;
    Text [ french ] = "Puces" ;
    Text [ dutch ] = "Opsommingstekens" ;
    Text [ swedish ] = "Uppräkningstecken" ;
    Text [ danish ] = "Punkttegn" ;
    Text [ portuguese_brazilian ] = "Aufzählungszeichen" ;
    Text [ portuguese ] = "Marcas e números" ;
    Text[ chinese_simplified ] = "ÏîÄ¿·ûºÅ";
    Text[ russian ] = "Ñèìâîëû ìàðêåðà";
    Text[ polish ] = "Symbol wypunktowania";
    Text[ japanese ] = "‰Óð‘‚«‹L†‚Æ’i—Ž”Ô†";
    Text[ chinese_traditional ] = "¶µ¥Ø²Å¸¹";
    Text[ arabic ] = "ÚáÇãÇÊ ÇáÊÚÏÇÏ";
    Text[ greek ] = "Óýìâïëá áñßèìçóçò";
    Text[ korean ] = "±Û¸Ó¸® ±âÈ£";
    Text[ turkish ] = "Madde iþaretleri";
    Text[ language_user1 ] = " ";
};
String STR_POOLCHR_INET_NORMAL
{
    Text = "Internet Link" ;
    Text [ English ] = "Internet link" ;
    Text [ english_us ] = "Internet link" ;
    Text [ italian ] = "Link Internet" ;
    Text [ spanish ] = "Vínculo Internet" ;
    Text [ french ] = "Lien Internet" ;
    Text [ dutch ] = "Internet Link" ;
    Text [ swedish ] = "Internetlänk" ;
    Text [ danish ] = "Hyperlink" ;
    Text [ portuguese ] = "Link Internet" ;
    Text [ portuguese_brazilian ] = "Internet Link" ;
    Text[ chinese_simplified ] = "¹ú¼Ê»¥ÁªÍøÁ´½Ó";
    Text[ russian ] = "Ññûëêà Èíòåðíåòà";
    Text[ polish ] = "£¹cze internetowe";
    Text[ japanese ] = "²ÝÀ°È¯Ä ØÝ¸";
    Text[ chinese_traditional ] = "Internet ±¶®|";
    Text[ arabic ] = "ÇÑÊÈÇØ ÅäÊÑäÊ";
    Text[ greek ] = "Óýíäåóç ôïõ Internet";
    Text[ korean ] = "ÀÎÅÍ³Ý ¿¬°á";
    Text[ turkish ] = "Internet baðlantýsý";
    Text[ language_user1 ] = " ";
};
String STR_POOLCHR_INET_VISIT
{
    /* ### ACHTUNG: Neuer Text in Resource? Besuchter Internet Link : besuchter Internet Link */
    /* ### ACHTUNG: Neuer Text in Resource? Besuchter Internet Link : besuchter Internet Link */
    Text = "Besuchter Internet Link" ;
    Text [ English ] = "Visit internet link" ;
    Text [ english_us ] = "Visited Internet Link" ;
    Text [ italian ] = "Link Internet visitato" ;
    Text [ spanish ] = "Página Internet visitada" ;
    Text [ french ] = "Lien Internet visité" ;
    Text [ dutch ] = "Bezochte Internet Link" ;
    Text [ swedish ] = "Använd Internetlänk" ;
    Text [ danish ] = "Besøgt hyperlink" ;
    Text [ portuguese ] = "Link Internet visitado" ;
    Text [ portuguese_brazilian ] = "Besuchter Internet Link" ;
    Text[ chinese_simplified ] = "·ÃÎʹýµÄ¹ú¼Ê»¥ÁªÍøÁ´½Ó";
    Text[ russian ] = "Ïîñåùåííàÿ ññûëêà Èíòåðíåòà";
    Text[ polish ] = "Odwiedzone ³¹cze internetowe";
    Text[ japanese ] = "–K‚ꂽ²ÝÀ°È¯Ä ØÝ¸";
    Text[ chinese_traditional ] = "³X°Ý¹Lªº Internet ±¶®|";
    Text[ arabic ] = "ÇÑÊÈÇØ ÇáÅäÊÑäÊ ÇáÐí Êã ÒíÇÑÊå";
    Text[ greek ] = "Óýíäåóç Internet ðïõ åðéóêåöèÞêáôå";
    Text[ korean ] = "¹æ¹®ÇÑ ÀÎÅÍ³Ý ¸µÅ©";
    Text[ turkish ] = "Kullanýlmýþ Internet baðlantýsý";
    Text[ language_user1 ] = " ";
};
String STR_POOLCHR_JUMPEDIT
{
    Text = "Platzhalter" ;
    Text [ English ] = "Place marker" ;
    Text [ english_us ] = "Placeholder" ;
    Text [ italian ] = "Segnaposto" ;
    Text [ spanish ] = "Comodín" ;
    Text [ french ] = "Substituant" ;
    Text [ dutch ] = "Plaatsvervanger" ;
    Text [ swedish ] = "Platshållare" ;
    Text [ danish ] = "Pladsholdere" ;
    Text [ portuguese ] = "Marcador de posição" ;
    Text [ portuguese_brazilian ] = "Platzhalter" ;
    Text[ chinese_simplified ] = "ͨÅä·û";
    Text[ russian ] = "Ìåòêà-çàïîëíèòåëü";
    Text[ polish ] = "Znak-wype³niacz";
    Text[ japanese ] = "ܲÙÄÞ¶°ÄÞ";
    Text[ chinese_traditional ] = "³q°t²Å";
    Text[ arabic ] = "ÚäÕÑ äÇÆÈ";
    Text[ greek ] = "Óýìâïëï êñÜôçóçò èÝóçò";
    Text[ korean ] = "°³Ã¼Æ²";
    Text[ turkish ] = "Genel arama karakteri";
    Text[ language_user1 ] = " ";
};
String STR_POOLCHR_TOXJUMP
{
    Text = "Verzeichnissprung" ;
    Text [ English ] = "Register jump" ;
    Text [ dutch ] = "Indexsprong" ;
    Text [ english_us ] = "Index Link" ;
    Text [ swedish ] = "Förteckningslänk" ;
    Text [ danish ] = "Indeksspring" ;
    Text [ italian ] = "Salto a indice" ;
    Text [ spanish ] = "Salto de índice" ;
    Text [ french ] = "Saut d'index" ;
    Text [ portuguese ] = "Salto ao índice" ;
    Text [ portuguese_brazilian ] = "Verzeichnissprung" ;
    Text[ chinese_simplified ] = "Ë÷ÒýÁ´½Ó";
    Text[ russian ] = "Ññûëêà óêàçàòåëÿ";
    Text[ polish ] = "Skok w indeksie";
    Text[ japanese ] = "õˆø¼Þ¬ÝÌß";
    Text[ chinese_traditional ] = "¥Ø¿ý±¶®|";
    Text[ arabic ] = "ÇÑÊÈÇØ ÝåÑÓ";
    Text[ greek ] = "Óýíäåóç åõñåôçñßïõ";
    Text[ korean ] = "»öÀÎ ¿¬°á";
    Text[ turkish ] = "Dizin baðlantýsý";
    Text[ language_user1 ] = " ";
};
String STR_POOLCHR_ENDNOTE
{
    Text = "Endnotenzeichen" ;
    Text [ English ] = "Endnote Symbol" ;
    Text [ english_us ] = "Endnote Symbol" ;
    Text [ portuguese ] = "Símbolo de nota final" ;
    Text [ portuguese_brazilian ] = "Endnotenzeichen" ;
    Text [ swedish ] = "Slutnotstecken" ;
    Text [ danish ] = "Slutnotetegn" ;
    Text [ italian ] = "Carattere nota di chiusura" ;
    Text [ spanish ] = "Símbolo de nota final" ;
    Text [ french ] = "Caractère de note de fin" ;
    Text [ dutch ] = "Eindnootteken" ;
    Text[ chinese_simplified ] = "β±ê·û";
    Text[ russian ] = "Çíàê êîíöåâîé ñíîñêè";
    Text[ polish ] = "Symbol przypisów koñc.";
    Text[ japanese ] = "•¶––‹r’‹L†";
    Text[ chinese_traditional ] = "§À¼Ð²Å";
    Text[ arabic ] = "ÑãÒ ÇáÊÚáíÞ ÇáÎÊÇãí";
    Text[ greek ] = "Óýìâïëï óçìåßùóçò ôÝëïõò";
    Text[ korean ] = "¹ÌÁÖ ±âÈ£";
    Text[ turkish ] = "Sonnot karakterleri";
    Text[ language_user1 ] = " ";
};
String STR_POOLCHR_LINENUM
{
    Text = "Zeilennummerierung" ;
    Text [ English ] = "Line numbering" ;
    Text [ portuguese ] = "Numeração de linhas" ;
    Text [ english_us ] = "Line numbering" ;
    Text [ portuguese_brazilian ] = "Zeilennumerierung" ;
    Text [ swedish ] = "Radnumrering" ;
    Text [ danish ] = "Linjenummerering" ;
    Text [ italian ] = "Numerazione righe" ;
    Text [ spanish ] = "Numeración de líneas" ;
    Text [ french ] = "Numérotation de lignes" ;
    Text [ dutch ] = "Regelnummering" ;
    Text[ chinese_simplified ] = "ÐбàºÅ";
    Text[ russian ] = "Íóìåðàöèÿ ñòðîê";
    Text[ polish ] = "Numeracja wierszy";
    Text[ japanese ] = "s‚̔ԍ†•t‚¯";
    Text[ chinese_traditional ] = "¦æ½s¸¹";
    Text[ arabic ] = "ÊÑÞíã ÇáÃÓØÑ";
    Text[ greek ] = "Áñßèìçóç ãñáììþí";
    Text[ korean ] = "¼± ¹øÈ£";
    Text[ turkish ] = "Satýr numaralamasý";
    Text[ language_user1 ] = " ";
};
String STR_POOLCHR_IDX_MAIN_ENTRY
{
    Text = "Stichwortverzeichnis Haupteintrag" ;
    Text [ English ] = "Main index entry" ;
    Text[ english_us ] = "Main index entry";
    Text[ portuguese ] = "Entrada principal de índice remissivo";
    Text[ russian ] = "Ïðåäìåòíûé óêàçàòåëü: îñíîâíîé ýëåìåíò";
    Text[ greek ] = "Êýñéá åããñáöÞ åõñåôçñßïõ ëÝîåùí";
    Text[ dutch ] = "Index hoofditem";
    Text[ french ] = "Index lexical : entrée principale";
    Text[ spanish ] = "Entrada principal índice alfabético";
    Text[ italian ] = "Voce principale per indice analitico";
    Text[ danish ] = "Stikordsregister hovedelement";
    Text[ swedish ] = "Sakregister huvudpost";
    Text[ polish ] = "Zestaw hase³ Wpis g³ówny";
    Text[ portuguese_brazilian ] = "Main index entry";
    Text[ japanese ] = "õˆø‚ÌŽå“ü—Í";
    Text[ korean ] = "ÁÖ »öÀÎ Ç׸ñ";
    Text[ chinese_simplified ] = "Ë÷ÒýÖ÷ÌõÄ¿";
    Text[ chinese_traditional ] = "¯Á¤Þ¥D±ø¥Ø";
    Text[ arabic ] = "ÅÏÎÇá ÑÆíÓí Ýí ÇáÝåÑÓ ÇáÃÈÌÏí";
    Text[ turkish ] = "Alfabetik dizin ana giriþi";
    Text[ language_user1 ] = " ";
};
String STR_POOLCHR_FOOTNOTE_ANCHOR
{
    Text = "Fußnotenanker" ;
    Text [ English ] = "Footnote anchor" ;
    Text[ english_us ] = "Footnote anchor";
    Text[ portuguese ] = "Âncora para nota de rodapé";
    Text[ russian ] = "Ïðèâÿçêà ñíîñêè";
    Text[ greek ] = "Áãêýñùóç õðïóçìåßùóçò";
    Text[ dutch ] = "Voetnootanker";
    Text[ french ] = "Appel de note de bas de page";
    Text[ spanish ] = "Ancla de nota al pie";
    Text[ italian ] = "Ancoraggio note a piè pagina";
    Text[ danish ] = "Fodnoteanker";
    Text[ swedish ] = "Fotnotsankare";
    Text[ polish ] = "Zakotwiczenie przypisów doln.";
    Text[ portuguese_brazilian ] = "Footnote anchor";
    Text[ japanese ] = "‹r’±Ý¶°";
    Text[ korean ] = "°¢ÁÖ °íÁ¤ ±âÁØ";
    Text[ chinese_simplified ] = "×¢½Å±ê¼Ç";
    Text[ chinese_traditional ] = "ª`¸}¼Ð¸¹";
    Text[ arabic ] = "ãÑÓÇÉ ÇáÍÇÔíÉ ÇáÓÝáíÉ";
    Text[ turkish ] = "Dipnot sabitleyicisi";
};
String STR_POOLCHR_ENDNOTE_ANCHOR
{
    Text = "Endnotenanker" ;
    Text [ English ] = "Endnote anchor" ;
    Text[ english_us ] = "Endnote anchor";
    Text[ portuguese ] = "Âncora de nota final";
    Text[ russian ] = "Ïðèâÿçêà êîíöåâîé ñíîñêè";
    Text[ greek ] = "Áãêýñùóç óçìåéþóåùí ôÝëïõò";
    Text[ dutch ] = "Eindnootanker";
    Text[ french ] = "Appel de note de fin";
    Text[ spanish ] = "Ancla de nota al final";
    Text[ italian ] = "Ancoraggio note di chiusura";
    Text[ danish ] = "Slutnoteanker";
    Text[ swedish ] = "Slutnotsankare";
    Text[ polish ] = "Zakotwiczenie przypisów koñc.";
    Text[ portuguese_brazilian ] = "Endnote anchor";
    Text[ japanese ] = "•¶––‹r’±Ý¶°";
    Text[ korean ] = "¹ÌÁÖ °íÁ¤ ±âÁØ";
    Text[ chinese_simplified ] = "βע±ê¼Ç";
    Text[ chinese_traditional ] = "§Àª`¼Ð¸¹";
    Text[ arabic ] = "ãÑÓÇÉ ÇáÊÚáíÞ ÇáÎÊÇãí";
    Text[ turkish ] = "Sonnot sabitleyicisi";
};

 // Zeichenvorlagen fuer HTML
String STR_POOLCHR_HTML_EMPHASIS
{
    Text = "Betont" ;
    Text [ English ] = "Emphasis" ;
    Text [ dutch ] = "Geaccentueerd" ;
    Text [ english_us ] = "Emphasis" ;
    Text [ swedish ] = "Betonad" ;
    Text [ danish ] = "Fremhævet" ;
    Text [ italian ] = "Enfasi" ;
    Text [ spanish ] = "Destacado" ;
    Text [ french ] = "Accentuation" ;
    Text [ portuguese ] = "Destaque" ;
    Text [ portuguese_brazilian ] = "Betont" ;
    Text[ chinese_simplified ] = "Ç¿µ÷";
    Text[ russian ] = "Âûäåëåíèå";
    Text[ polish ] = "Wyró¿niony";
    Text[ japanese ] = "‹­’²";
    Text[ chinese_traditional ] = "±j½Õ";
    Text[ arabic ] = "ÅÈÑÇÒ";
    Text[ greek ] = "Ôïíéóìüò";
    Text[ korean ] = "°­Á¶";
    Text[ turkish ] = "Vurgu";
    Text[ language_user1 ] = " ";
};
String STR_POOLCHR_HTML_CITIATION
{
    Text = "Zitat" ;
    Text [ English ] = "Citation" ;
    Text [ dutch ] = "Citaat" ;
    Text [ english_us ] = "Citation" ;
    Text [ swedish ] = "Citat" ;
    Text [ danish ] = "Citat" ;
    Text [ italian ] = "Citazione" ;
    Text [ spanish ] = "Cita" ;
    Text [ french ] = "Citation" ;
    Text [ portuguese ] = "Citação" ;
    Text [ portuguese_brazilian ] = "Zitat" ;
    Text[ chinese_simplified ] = "ÒýÓÃÎÄ";
    Text[ russian ] = "Öèòàòà";
    Text[ polish ] = "Cytat";
    Text[ japanese ] = "ˆø—p";
    Text[ chinese_traditional ] = "¤Þ¤å";
    Text[ arabic ] = "ÇÓÊÔåÇÏ ÈÞæá";
    Text[ greek ] = "Míçìüíåõóç";
    Text[ korean ] = "Àοë";
    Text[ turkish ] = "Alýntý";
    Text[ language_user1 ] = " ";
};
String STR_POOLCHR_HTML_STRONG
{
    Text = "Stark betont" ;
    Text [ English ] = "Strong Emphasis" ;
    Text [ dutch ] = "Sterk accent" ;
    Text [ english_us ] = "Strong Emphasis" ;
    Text [ swedish ] = "Starkt betonad" ;
    Text [ danish ] = "Stærk fremhævet" ;
    Text [ italian ] = "Enfasi forte" ;
    Text [ spanish ] = "Muy destacado" ;
    Text [ french ] = "Accentuation forte" ;
    Text [ portuguese ] = "Destaque acentuado" ;
    Text [ portuguese_brazilian ] = "Stark betont" ;
    Text[ chinese_simplified ] = "Ç¿µ÷";
    Text[ russian ] = "Âûäåëåíèå æèðíûì";
    Text[ polish ] = "Mocno wyró¿niony";
    Text[ japanese ] = "‹­‚¢‹­’²";
    Text[ chinese_traditional ] = "±j½Õ";
    Text[ arabic ] = "ÅÈÑÇÒ ÈæÖæÍ";
    Text[ greek ] = "¸íôïíïò ôïíéóìüò";
    Text[ korean ] = "°­ÇÑ °­Á¶";
    Text[ turkish ] = "Kuvvetli vurgu";
    Text[ language_user1 ] = " ";
};
String STR_POOLCHR_HTML_CODE
{
    Text = "Quelltext" ;
    Text [ English ] = "Listing" ;
    Text [ dutch ] = "Brontekst" ;
    Text [ english_us ] = "Source Text" ;
    Text [ swedish ] = "Källtext" ;
    Text [ danish ] = "Kildetekst" ;
    Text [ italian ] = "Testo sorgente" ;
    Text [ spanish ] = "Texto fuente" ;
    Text [ french ] = "Texte source" ;
    Text [ portuguese ] = "Texto-fonte" ;
    Text [ portuguese_brazilian ] = "Quelltext" ;
    Text[ chinese_simplified ] = "Ô´Îı¾";
    Text[ russian ] = "Èñõîäíûé òåêñò";
    Text[ polish ] = "Tekst Ÿród³owy";
    Text[ japanese ] = "¿°½";
    Text[ chinese_traditional ] = "­ì©lÀÉ";
    Text[ arabic ] = "äÕ ÇáãÕÏÑ";
    Text[ greek ] = "Êåßìåíï ðñïÝëåõóçò";
    Text[ korean ] = "¼Ò½º ÅØ½ºÆ®";
    Text[ turkish ] = "Kaynak kodu";
    Text[ language_user1 ] = " ";
};
String STR_POOLCHR_HTML_SAMPLE
{
    Text = "Beispiel" ;
    Text [ English ] = "Example" ;
    Text [ dutch ] = "Voorbeeld" ;
    Text [ english_us ] = "Example" ;
    Text [ swedish ] = "Exempel" ;
    Text [ danish ] = "Eksempel" ;
    Text [ italian ] = "Esempio" ;
    Text [ spanish ] = "Ejemplo" ;
    Text [ french ] = "Exemple" ;
    Text [ portuguese ] = "Exemplo" ;
    Text [ portuguese_brazilian ] = "Beispiel" ;
    Text[ chinese_simplified ] = "Àý×Ó";
    Text[ russian ] = "Ïðèìåð";
    Text[ polish ] = "Przyk³ad";
    Text[ japanese ] = "—á";
    Text[ chinese_traditional ] = "¨Ò¤l";
    Text[ arabic ] = "ãËÇá";
    Text[ greek ] = "ÐáñÜäåéãìá";
    Text[ korean ] = "¿¹";
    Text[ turkish ] = "Örnek";
    Text[ language_user1 ] = " ";
};
String STR_POOLCHR_HTML_KEYBOARD
{
    Text = "Benutzereingabe" ;
    Text [ English ] = "User typed text" ;
    Text [ dutch ] = "Gebruikergegevens" ;
    Text [ english_us ] = "User Entry" ;
    Text [ swedish ] = "Användarinmatning" ;
    Text [ danish ] = "Brugerinput" ;
    Text [ italian ] = "Digitazione dell'utente" ;
    Text [ spanish ] = "Entrada del usuario" ;
    Text [ french ] = "Saisie de l'utilisateur" ;
    Text [ portuguese ] = "Entrada do utilizador" ;
    Text [ portuguese_brazilian ] = "Benutzereingabe" ;
    Text[ chinese_simplified ] = "Óû§ÊäÈë";
    Text[ russian ] = "Ââîä ïîëüçîâàòåëÿ";
    Text[ polish ] = "Wpis u¿ytkownika";
    Text[ japanese ] = "Õ°»Þ°“ü—Í";
    Text[ chinese_traditional ] = "¨Ï¥ÎªÌ¿é¤J";
    Text[ arabic ] = "ÅÏÎÇá ÇáãÓÊÎÏã";
    Text[ greek ] = "ÅéóáãùãÞ ÷ñÞóôç";
    Text[ korean ] = "»ç¿ëÀÚ Ç׸ñ";
    Text[ turkish ] = "Kullanýcý giriþi";
    Text[ language_user1 ] = " ";
};
String STR_POOLCHR_HTML_VARIABLE
{
    Text = "Variable" ;
    Text [ English ] = "Variable" ;
    Text [ dutch ] = "Variabele" ;
    Text [ english_us ] = "Variable" ;
    Text [ swedish ] = "Variabel" ;
    Text [ danish ] = "Variabel" ;
    Text [ italian ] = "Variabile" ;
    Text [ spanish ] = "Variable" ;
    Text [ french ] = "Variable" ;
    Text [ portuguese ] = "Variável" ;
    Text [ portuguese_brazilian ] = "Variable" ;
    Text[ chinese_simplified ] = "¿É±ä";
    Text[ russian ] = "Ïåðåìåííàÿ";
    Text[ polish ] = "Zmienna";
    Text[ japanese ] = "•ϐ”";
    Text[ chinese_traditional ] = "¥iÅÜ";
    Text[ arabic ] = "ãÊÛíÑÉ";
    Text[ greek ] = "ÌåôáâëçôÞ";
    Text[ korean ] = "º¯¼ö";
    Text[ turkish ] = "Deðiþken";
    Text[ language_user1 ] = " ";
};
String STR_POOLCHR_HTML_DEFINSTANCE
{
    Text = "Definition" ;
    Text [ English ] = "Definition" ;
    Text [ dutch ] = "Definitie" ;
    Text [ english_us ] = "Definition" ;
    Text [ swedish ] = "Definition" ;
    Text [ danish ] = "Definition" ;
    Text [ italian ] = "Definizione" ;
    Text [ spanish ] = "Definición" ;
    Text [ french ] = "Définition" ;
    Text [ portuguese ] = "Definição" ;
    Text [ portuguese_brazilian ] = "Definition" ;
    Text[ chinese_simplified ] = "¶¨Òå";
    Text[ russian ] = "Îïðåäåëåíèå";
    Text[ polish ] = "Definicja";
    Text[ japanese ] = "’è‹`";
    Text[ chinese_traditional ] = "©w¸q";
    Text[ arabic ] = "ÊÚÑíÝ";
    Text[ greek ] = "Ïñéóìüò";
    Text[ korean ] = "Á¤ÀÇ";
    Text[ turkish ] = "Taným";
    Text[ language_user1 ] = " ";
};
String STR_POOLCHR_HTML_TELETYPE
{
    Text = "Nicht-proportionaler Text" ;
    Text [ English ] = "Teletype" ;
    Text [ dutch ] = "Niet-proportionele tekst" ;
    Text [ english_us ] = "Teletype" ;
    Text [ swedish ] = "Icke-proportionell text" ;
    Text [ danish ] = "Ikke-proportional tekst" ;
    Text [ italian ] = "Testo non proporzionale" ;
    Text [ spanish ] = "Texto no proporcional" ;
    Text [ french ] = "Texte non proportionnel" ;
    Text [ portuguese ] = "Texto não-proporcional" ;
    Text [ portuguese_brazilian ] = "Nicht-proportionaler Text" ;
    Text[ chinese_simplified ] = "·Ç³É±ÈÀýÎÄ×Ö";
    Text[ russian ] = "Íåïðîïîðöèîíàëüíûé òåêñò";
    Text[ polish ] = "Tekst nie proporcjonalny";
    Text[ japanese ] = "•s‹Ï®‚È÷½Ä";
    Text[ chinese_traditional ] = "«D¦¨¤ñ¨Ò¤å¦r";
    Text[ arabic ] = "äÕ ÛíÑ ÊäÇÓÈí";
    Text[ greek ] = "Ìç áñìïíéêü êåßìåíï";
    Text[ korean ] = "ÅÚ·¹Å¸ÀÌÇÁ";
    Text[ turkish ] = "Orantýsýz yazýtipi";
    Text[ language_user1 ] = " ";
};

String STR_POOLCHR_PRGM_FOOTNOTE
{
    Text  = "Footnote Symbol" ;
};
String STR_POOLCHR_PRGM_PAGENO
{
    Text  = "Page Number" ;
};
String STR_POOLCHR_PRGM_LABEL
{
    Text  = "Caption characters" ;
};
String STR_POOLCHR_PRGM_DROPCAPS
{
    Text  = "Drop Caps" ;
};
String STR_POOLCHR_PRGM_NUM_LEVEL
{
    Text  = "Numbering Symbols" ;
};
String STR_POOLCHR_PRGM_BUL_LEVEL
{
    Text  = "Bullet Symbols" ;
};
String STR_POOLCHR_PRGM_INET_NORMAL
{
    Text  = "Internet link" ;
};
String STR_POOLCHR_PRGM_INET_VISIT
{
    Text  = "Visited Internet Link" ;
};
String STR_POOLCHR_PRGM_JUMPEDIT
{
    Text  = "Placeholder" ;
};
String STR_POOLCHR_PRGM_TOXJUMP
{
    Text  = "Index Link" ;
};
String STR_POOLCHR_PRGM_ENDNOTE
{
    Text  = "Endnote Symbol" ;
};
String STR_POOLCHR_PRGM_LINENUM
{
    Text  = "Line numbering" ;
};
String STR_POOLCHR_PRGM_IDX_MAIN_ENTRY
{
    Text = "Main index entry";
};
String STR_POOLCHR_PRGM_FOOTNOTE_ANCHOR
{
    Text = "Footnote anchor";
};
String STR_POOLCHR_PRGM_ENDNOTE_ANCHOR
{
    Text = "Endnote anchor";
};

 // Zeichenvorlagen fuer HTML
String STR_POOLCHR_PRGM_HTML_EMPHASIS
{
    Text  = "Emphasis" ;
};
String STR_POOLCHR_PRGM_HTML_CITIATION
{
    Text  = "Citation" ;
};
String STR_POOLCHR_PRGM_HTML_STRONG
{
    Text = "Strong Emphasis" ;
};
String STR_POOLCHR_PRGM_HTML_CODE
{
    Text  = "Source Text" ;
};
String STR_POOLCHR_PRGM_HTML_SAMPLE
{
    Text  = "Example" ;
};
String STR_POOLCHR_PRGM_HTML_KEYBOARD
{
    Text  = "User Entry" ;
};
String STR_POOLCHR_PRGM_HTML_VARIABLE
{
    Text  = "Variable" ;
};
String STR_POOLCHR_PRGM_HTML_DEFINSTANCE
{
    Text  = "Definition" ;
};
String STR_POOLCHR_PRGM_HTML_TELETYPE
{
    Text  = "Teletype" ;
};
// Rahmenvorlagen
String STR_POOLFRM_FRAME
{
    Text = "Rahmen" ;
    Text [ English ] = "Frame" ;
    Text [ dutch ] = "Kader" ;
    Text [ english_us ] = "Frame" ;
    Text [ italian ] = "Cornice" ;
    Text [ spanish ] = "Marco" ;
    Text [ french ] = "Cadre" ;
    Text [ swedish ] = "Ram" ;
    Text [ danish ] = "Ramme" ;
    Text [ portuguese ] = "Moldura" ;
    Text [ portuguese_brazilian ] = "Rahmen" ;
    Text[ chinese_simplified ] = "¿ò";
    Text[ russian ] = "Ðàìêà";
    Text[ polish ] = "Ramka";
    Text[ japanese ] = "˜g";
    Text[ language_user1 ] = " ";
    Text[ chinese_traditional ] = "¤å¦r¤è¶ô";
    Text[ arabic ] = "ÅØÇÑ";
    Text[ greek ] = "Ðåñßãñáììá";
    Text[ korean ] = "ÅØ½ºÆ® »óÀÚ";
    Text[ turkish ] = "Çerçeve";
};
String STR_POOLFRM_GRAPHIC
{
    Text = "Grafik" ;
    Text [ English ] = "Graphic" ;
    Text [ dutch ] = "Afbeelding" ;
    Text [ english_us ] = "Graphics" ;
    Text [ italian ] = "Immagine" ;
    Text [ spanish ] = "Imagen" ;
    Text [ french ] = "Image" ;
    Text [ swedish ] = "Grafik" ;
    Text [ danish ] = "Grafik" ;
    Text [ portuguese ] = "Gráfico" ;
    Text [ portuguese_brazilian ] = "Grafik" ;
    Text[ chinese_simplified ] = "ͼÐÎ";
    Text[ russian ] = "Ãðàôèêà";
    Text[ polish ] = "Grafika";
    Text[ japanese ] = "¸Þ×̨¯¸";
    Text[ chinese_traditional ] = "¹Ï¤ù";
    Text[ arabic ] = "ÕæÑÉ";
    Text[ greek ] = "Ãñáöéêü";
    Text[ korean ] = "±×·¡ÇÈ";
    Text[ turkish ] = "Grafik";
    Text[ language_user1 ] = " ";
};
String STR_POOLFRM_OLE
{
    Text = "OLE" ;
    Text [ English ] = "OLE" ;
    Text [ dutch ] = "OLE" ;
    Text [ english_us ] = "OLE" ;
    Text [ italian ] = "OLE" ;
    Text [ spanish ] = "OLE" ;
    Text [ french ] = "OLE" ;
    Text [ swedish ] = "OLE" ;
    Text [ danish ] = "OLE" ;
    Text [ portuguese ] = "OLE" ;
    Text [ portuguese_brazilian ] = "OLE" ;
    Text[ chinese_simplified ] = "OLE";
    Text[ russian ] = "OLE";
    Text[ polish ] = "OLE";
    Text[ japanese ] = "OLE";
    Text[ chinese_traditional ] = "OLE";
    Text[ arabic ] = "OLE";
    Text[ greek ] = "OLE";
    Text[ korean ] = "OLE";
    Text[ turkish ] = "OLE";
    Text[ language_user1 ] = " ";
};
String STR_POOLFRM_FORMEL
{
    Text = "Formel" ;
    Text [ English ] = "Expression" ;
    Text [ dutch ] = "Formules" ;
    Text [ english_us ] = "Formula" ;
    Text [ italian ] = "Formula" ;
    Text [ spanish ] = "Fórmula" ;
    Text [ french ] = "Formule" ;
    Text [ swedish ] = "Formel" ;
    Text [ danish ] = "Formel" ;
    Text [ portuguese ] = "Fórmula" ;
    Text [ portuguese_brazilian ] = "Formel" ;
    Text[ chinese_simplified ] = "¹«Ê½";
    Text[ russian ] = "Ôîðìóëà";
    Text[ polish ] = "Formu³a";
    Text[ japanese ] = "”Ž®";
    Text[ chinese_traditional ] = "¤½¦¡";
    Text[ arabic ] = "ÕíÛÉ";
    Text[ greek ] = "Ôýðïò";
    Text[ korean ] = "¼ö½Ä";
    Text[ turkish ] = "Formül";
    Text[ language_user1 ] = " ";
};
String STR_POOLFRM_MARGINAL
{
    Text = "Marginalie" ;
    Text [ English ] = "Marginalia" ;
    Text [ english_us ] = "Marginalia" ;
    Text [ italian ] = "Nota in margine" ;
    Text [ spanish ] = "Nota al margen" ;
    Text [ french ] = "Note en marge" ;
    Text [ dutch ] = "Kanttekening" ;
    Text [ swedish ] = "Marginalanteckning" ;
    Text [ danish ] = "Randbemærkning" ;
    Text [ portuguese ] = "Notas à margem" ;
    Text [ portuguese_brazilian ] = "Marginalie" ;
    Text[ chinese_simplified ] = "±ßÔµ";
    Text[ russian ] = "Ìàðãèíàëèè";
    Text[ polish ] = "Marginesy";
    Text[ japanese ] = "–T’";
    Text[ chinese_traditional ] = "Ãä½t";
    Text[ arabic ] = "ãáÇÍÙÇÊ åÇãÔíÉ";
    Text[ greek ] = "Óçìåéþóåéò óôï ðåñéèþñéï";
    Text[ korean ] = "¿©¹é";
    Text[ turkish ] = "Derkenar";
    Text[ language_user1 ] = " ";
};
String STR_POOLFRM_WATERSIGN
{
    Text = "Wasserzeichen" ;
    Text [ English ] = "Watermark" ;
    Text [ dutch ] = "Watermerk" ;
    Text [ english_us ] = "Watermark" ;
    Text [ italian ] = "Filigrana" ;
    Text [ spanish ] = "Marca de agua" ;
    Text [ french ] = "Filigrane" ;
    Text [ swedish ] = "Vattenmärke" ;
    Text [ danish ] = "Vandmærke" ;
    Text [ portuguese ] = "Marca de água" ;
    Text [ portuguese_brazilian ] = "Wasserzeichen" ;
    Text[ chinese_simplified ] = "ˮӡ";
    Text[ russian ] = "Âîäÿíûå çíàêè";
    Text[ polish ] = "Znaki wodne";
    Text[ japanese ] = "“§‚©‚µ";
    Text[ chinese_traditional ] = "¤ô¦L";
    Text[ arabic ] = "ÚáÇãÉ ãÇÆíÉ";
    Text[ greek ] = "Õäáôüóçìï";
    Text[ korean ] = "¿öÅ͸¶Å©";
    Text[ turkish ] = "Filigran";
    Text[ language_user1 ] = " ";
};
String STR_POOLFRM_LABEL
{
    Text = "Etiketten" ;
    Text [ English ] = "Labels" ;
    Text [ norwegian ] = "Etiketter" ;
    Text [ italian ] = "Etichette" ;
    Text [ portuguese_brazilian ] = "Etiquetas" ;
    Text [ portuguese ] = "Etiquetas" ;
    Text [ finnish ] = "Tarrat" ;
    Text [ danish ] = "Etiketter" ;
    Text [ french ] = "Étiquettes" ;
    Text [ swedish ] = "Etiketter" ;
    Text [ dutch ] = "Etiketten" ;
    Text [ spanish ] = "Etiquetas" ;
    Text [ english_us ] = "Labels" ;
    Text[ chinese_simplified ] = "±êÇ©";
    Text[ russian ] = "Íàêëåéêè";
    Text[ polish ] = "Etykiety";
    Text[ japanese ] = "×ÍÞÙ";
    Text[ chinese_traditional ] = "¶K¼Ð";
    Text[ arabic ] = "ÈØÇÞÇÊ ÚäæäÉ";
    Text[ greek ] = "ÅôéêÝôåò";
    Text[ korean ] = "¶óº§";
    Text[ turkish ] = "Etiket";
    Text[ language_user1 ] = " ";
};
 String STR_POOLFRM_PRGM_FRAME
{
    Text  = "Frame" ;
};
String STR_POOLFRM_PRGM_GRAPHIC
{
    Text  = "Graphics" ;
};
String STR_POOLFRM_PRGM_OLE
{
    Text  = "OLE" ;
};
String STR_POOLFRM_PRGM_FORMEL
{
    Text  = "Formula" ;
};
String STR_POOLFRM_PRGM_MARGINAL
{
    Text  = "Marginalia" ;
};
String STR_POOLFRM_PRGM_WATERSIGN
{
    Text  = "Watermark" ;
};
String STR_POOLFRM_PRGM_LABEL
{
    Text  = "Labels" ;
};

 // -----------------
 // Vorlagen-Namen
 // -----------------
String STR_POOLCOLL_STANDARD
{
    Text = "Standard" ;
    Text [ English ] = "Standard" ;
    Text [ dutch ] = "Standaard" ;
    Text [ english_us ] = "Standard" ;
    Text [ italian ] = "Standard" ;
    Text [ spanish ] = "Predeterminado" ;
    Text [ french ] = "Standard" ;
    Text [ swedish ] = "Standard" ;
    Text [ danish ] = "Standard" ;
    Text [ portuguese ] = "Padrão" ;
    Text [ portuguese_brazilian ] = "Standard" ;
    Text[ chinese_simplified ] = "±ê×¼";
    Text[ russian ] = "Ñòàíäàðò";
    Text[ polish ] = "Standard";
    Text[ japanese ] = "•W€";
    Text[ chinese_traditional ] = "¼Ð·Ç";
    Text[ arabic ] = "ÞíÇÓí";
    Text[ greek ] = "ÐñïåðéëïãÞ";
    Text[ korean ] = "Ç¥ÁØ";
    Text[ turkish ] = "Standart";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TEXT
{
    /* ### ACHTUNG: Neuer Text in Resource? Textkörper : Textk÷rper */
    Text = "Textkörper" ;
    Text [ English ] = "Text body" ;
    Text [ english_us ] = "Text body" ;
    Text [ italian ] = "Corpo testo" ;
    Text [ spanish ] = "Cuerpo de texto" ;
    Text [ french ] = "Corps de texte" ;
    Text [ dutch ] = "Tekstblok" ;
    Text [ swedish ] = "Brödtext" ;
    Text [ danish ] = "Brødtekst" ;
    Text [ portuguese ] = "Corpo do texto" ;
    Text [ portuguese_brazilian ] = "Textkörper" ;
    Text[ chinese_simplified ] = "ÕýÎÄ";
    Text[ russian ] = "Îñíîâíîé òåêñò";
    Text[ polish ] = "Obszar tekstu";
    Text[ japanese ] = "–{•¶";
    Text[ chinese_traditional ] = "¤º¤å";
    Text[ arabic ] = "ÌÓã ÇáäÕ";
    Text[ greek ] = "Óþìá êåéìÝíïõ";
    Text[ korean ] = "ÅØ½ºÆ® º»¹®";
    Text[ turkish ] = "Metin gövdesi";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TEXT_IDENT
{
    /* ### ACHTUNG: Neuer Text in Resource? Textkörper Einzug : Textk÷rper Einzug */
    Text = "Textkörper Einzug" ;
    Text [ English ] = "Text body indent" ;
    Text [ english_us ] = "First line indent" ;
    Text [ italian ] = "Rientro del corpo testo" ;
    Text [ spanish ] = "Sangría de primera línea" ;
    Text [ french ] = "Alinéa" ;
    Text [ dutch ] = "1e regel inspringen" ;
    Text [ swedish ] = "Dra in första raden" ;
    Text [ danish ] = "Første linjes indrykning" ;
    Text [ portuguese ] = "Abrir parágrafo" ;
    Text [ portuguese_brazilian ] = "Textkörper Einzug" ;
    Text[ chinese_simplified ] = "ÕýÎÄËõ½ø";
    Text[ russian ] = "Ïåðâàÿ ñòðîêà ñ îòñòóïîì";
    Text[ polish ] = "Wciêcie obszaru tekstu";
    Text[ japanese ] = "–{•¶²ÝÃÞÝÄ";
    Text[ chinese_traditional ] = "¤º¤åÁY±Æ";
    Text[ arabic ] = "ÅÒÇÍÉ ÌÓã ÇáäÕ";
    Text[ greek ] = "Åóï÷Þ ðñþôçò ãñáììÞò";
    Text[ korean ] = "ù¹øÂ° ÁÙ µé¿©¾²±â";
    Text[ turkish ] = "Ýlk satýr girintisi";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TEXT_NEGIDENT
{
    /* ### ACHTUNG: Neuer Text in Resource? Textkörper Einzug negativ : Textk÷rper Einzug negativ */
    Text = "Textkörper Einzug negativ" ;
    Text [ English ] = "Text body neg. indent" ;
    Text [ english_us ] = "Hanging indent" ;
    Text [ italian ] = "Rientro corpo del testo negativo" ;
    Text [ spanish ] = "Sangría negativa de primera línea" ;
    Text [ french ] = "Alinéa négatif" ;
    Text [ dutch ] = "1e regel uitspringen" ;
    Text [ swedish ] = "Negativt indrag av första raden" ;
    Text [ danish ] = "Hængende indrykning" ;
    Text [ portuguese ] = "Abrir parágrafo negativo" ;
    Text [ portuguese_brazilian ] = "Textkörper Einzug negativ" ;
    Text[ chinese_simplified ] = "ÕýÎÄ·´ÏòËõ½ø";
    Text[ russian ] = "Îáðàòíûé îòñòóï";
    Text[ polish ] = "Neg.wciêcie obszaru tekstu";
    Text[ japanese ] = "–{•¶Ï²Å½²ÝÃÞÝÄ";
    Text[ chinese_traditional ] = "¤º¤å¤Ï¦VÁY±Æ";
    Text[ arabic ] = "ÅÒÇÍÉ ÌÓã äÕ ÓáÈíÉ";
    Text[ greek ] = "ÁñíçôéêÞ åóï÷Þ óþìáôïò êåéìÝíïõ";
    Text[ korean ] = "³»¾î¾²±â";
    Text[ turkish ] = "Asýlý girinti";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TEXT_MOVE
{
    /* ### ACHTUNG: Neuer Text in Resource? Textkörper Einrückung : Textk÷rper Einr³ckung */
    Text = "Textkörper Einrückung" ;
    Text [ English ] = "Text body move in" ;
    Text [ dutch ] = "Tekstblok inspringen" ;
    Text [ english_us ] = "Text body indent" ;
    Text [ italian ] = "Rientro corpo del testo" ;
    Text [ spanish ] = "Cuerpo de texto con sangría" ;
    Text [ french ] = "Retrait du corps de texte " ;
    Text [ swedish ] = "Dra in hela stycket" ;
    Text [ danish ] = "Brødtekst indrykning" ;
    Text [ portuguese ] = "Avanço corpo do texto" ;
    Text [ portuguese_brazilian ] = "Textkörper Einrückung" ;
    Text[ chinese_simplified ] = "ÕýÎÄËõ½ø";
    Text[ russian ] = "Îñíîâíîé òåêñò ñ îòñòóïîì";
    Text[ polish ] = "Wysuniêcie obszaru tekstu";
    Text[ japanese ] = "²ÝÃÞÝÄ";
    Text[ language_user1 ] = " ";
    Text[ chinese_traditional ] = "¤º¤åÁY±Æ";
    Text[ arabic ] = "ÅÒÇÍÉ ÌÓã ÇáäÕ (ÇáÓØÑ ÇáÃæá)";
    Text[ greek ] = "Åóï÷Þ óþìáôïò êåéìÝíïõ";
    Text[ korean ] = "ÅØ½ºÆ® º»¹® µé¿©¾²±â";
    Text[ turkish ] = "Metin gövdesi girintisi";
};
String STR_POOLCOLL_GREETING
{
    /* ### ACHTUNG: Neuer Text in Resource? Grußformel : Gru˜formel */
    Text = "Grußformel" ;
    Text [ English ] = "Greetings" ;
    Text [ dutch ] = "Aanhef" ;
    Text [ english_us ] = "Salutation" ;
    Text [ italian ] = "Formula di saluto" ;
    Text [ spanish ] = "Fórmula de saludo" ;
    Text [ french ] = "Formule finale" ;
    Text [ swedish ] = "Hälsningsfras" ;
    Text [ danish ] = "Sluthilsen" ;
    Text [ portuguese ] = "Saudação" ;
    Text [ portuguese_brazilian ] = "Grußformel" ;
    Text[ chinese_simplified ] = "ÎʺòÓï";
    Text[ russian ] = "Ïðèâåòñòâèå";
    Text[ polish ] = "Pozdrowienie";
    Text[ japanese ] = "ˆ¥ŽA•¶";
    Text[ chinese_traditional ] = "°Ý­Ô»y";
    Text[ arabic ] = "ÇáÊÍíÉ";
    Text[ greek ] = "Ðñïóöþíçóç";
    Text[ korean ] = "Àλ縻";
    Text[ turkish ] = "Selamlama";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_SIGNATURE
{
    Text = "Unterschrift" ;
    Text [ English ] = "Signature" ;
    Text [ english_us ] = "Signature" ;
    Text [ italian ] = "Firma" ;
    Text [ spanish ] = "Firma" ;
    Text [ french ] = "Signature" ;
    Text [ dutch ] = "Ondergetekende" ;
    Text [ swedish ] = "Signatur" ;
    Text [ danish ] = "Underskrift" ;
    Text [ portuguese ] = "Assinatura" ;
    Text [ portuguese_brazilian ] = "Unterschrift" ;
    Text[ chinese_simplified ] = "Ç©Ãû";
    Text[ russian ] = "Ïîäïèñü";
    Text[ polish ] = "Podpis";
    Text[ japanese ] = "–¼";
    Text[ chinese_traditional ] = "ñ¦W";
    Text[ arabic ] = "ÇáÊæÞíÚ";
    Text[ greek ] = "ÕðïãñáöÞ";
    Text[ korean ] = "¼­¸í";
    Text[ turkish ] = "Ýmza";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_HEADLINE_BASE
{
    /* ### ACHTUNG: Neuer Text in Resource? Überschrift : šberschrift */
    Text = "Überschrift" ;
    Text [ English ] = "Headline" ;
    Text [ dutch ] = "Kop" ;
    Text [ english_us ] = "Heading" ;
    Text [ italian ] = "Intestazione" ;
    Text [ spanish ] = "Encabezado" ;
    Text [ french ] = "Titre" ;
    Text [ swedish ] = "Överskrift" ;
    Text [ danish ] = "Overskrift" ;
    Text [ portuguese ] = "Título" ;
    Text [ portuguese_brazilian ] = "Überschrift" ;
    Text[ chinese_simplified ] = "±êÌâ";
    Text[ russian ] = "Çàãîëîâîê";
    Text[ polish ] = "Tytu³";
    Text[ japanese ] = "Œ©o‚µ";
    Text[ chinese_traditional ] = "¼ÐÃD";
    Text[ arabic ] = "ÇáÚäæÇä";
    Text[ greek ] = "Åðéêåöáëßäá";
    Text[ korean ] = "Á¦¸ñ";
    Text[ turkish ] = "Baþlýk";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_NUMBUL_BASE
{
    Text = "Liste" ;
    Text [ English ] = "List" ;
    Text [ english_us ] = "List" ;
    Text [ italian ] = "Elenco" ;
    Text [ spanish ] = "Lista" ;
    Text [ french ] = "Liste" ;
    Text [ dutch ] = "Lijst" ;
    Text [ swedish ] = "Lista" ;
    Text [ danish ] = "Liste" ;
    Text [ portuguese ] = "Lista" ;
    Text [ portuguese_brazilian ] = "Liste" ;
    Text[ chinese_simplified ] = "Áе¥";
    Text[ russian ] = "Ñïèñîê";
    Text[ polish ] = "Lista";
    Text[ japanese ] = "ؽÄ";
    Text[ chinese_traditional ] = "²M³æ";
    Text[ arabic ] = "ÞÇÆãÉ";
    Text[ greek ] = "Ëßóôá";
    Text[ korean ] = "¸®½ºÆ®";
    Text[ turkish ] = "Liste";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_REGISTER_BASE
{
    Text = "Verzeichnis" ;
    Text [ English ] = "Register" ;
    Text [ english_us ] = "Index" ;
    Text [ italian ] = "Indice" ;
    Text [ spanish ] = "Índice" ;
    Text [ french ] = "Répertoire" ;
    Text [ dutch ] = "Index" ;
    Text [ swedish ] = "Förteckning" ;
    Text [ danish ] = "Indeks" ;
    Text [ portuguese ] = "Índice" ;
    Text [ portuguese_brazilian ] = "Verzeichnis" ;
    Text[ chinese_simplified ] = "Ŀ¼";
    Text[ russian ] = "Îãëàâëåíèå";
    Text[ polish ] = "Indeks";
    Text[ japanese ] = "õˆø";
    Text[ chinese_traditional ] = "¥Ø¿ý";
    Text[ arabic ] = "ÝåÑÓ";
    Text[ greek ] = "ÅõñåôÞñéï";
    Text[ korean ] = "»öÀÎ";
    Text[ turkish ] = "Dizin";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_CONFRONTATION
{
    /* ### ACHTUNG: Neuer Text in Resource? Gegenüberstellung : Gegen³berstellung */
    Text = "Gegenüberstellung" ;
    Text [ English ] = "Confrontation" ;
    Text [ dutch ] = "Tegenoverstelling" ;
    Text [ english_us ] = "List Indent" ;
    Text [ italian ] = "Confronto" ;
    Text [ spanish ] = "Confrontación" ;
    Text [ french ] = "Confrontation" ;
    Text [ swedish ] = "Indrag lista" ;
    Text [ danish ] = "Opstillingsindrykning" ;
    Text [ portuguese ] = "Confrontar" ;
    Text [ portuguese_brazilian ] = "Gegenüberstellung" ;
    Text[ chinese_simplified ] = "Ëõ½ø";
    Text[ russian ] = "Îòñòóïû";
    Text[ polish ] = "Konfrontacja";
    Text[ japanese ] = "²ÝÃÞÝÄ";
    Text[ chinese_traditional ] = "ÁY±Æ";
    Text[ arabic ] = "ãæÇÌåÉ";
    Text[ language_user1 ] = " ";
    Text[ greek ] = "ÁíôéðáñáâïëÞ";
    Text[ korean ] = "¸®½ºÆ® µé¿©½º±â";
    Text[ turkish ] = "Karþýlaþtýrma";
};
String STR_POOLCOLL_MARGINAL
{
    Text = "Marginalie" ;
    Text [ English ] = "Marginalia" ;
    Text [ english_us ] = "Marginalia" ;
    Text [ italian ] = "Nota in margine" ;
    Text [ spanish ] = "Nota al margen" ;
    Text [ french ] = "Note en marge" ;
    Text [ dutch ] = "Kanttekening" ;
    Text [ swedish ] = "Marginalanteckning" ;
    Text [ danish ] = "Randbemærkning" ;
    Text [ portuguese ] = "Notas à margem" ;
    Text [ portuguese_brazilian ] = "Marginalie" ;
    Text[ chinese_simplified ] = "ÅÔ×¢";
    Text[ russian ] = "Ìàðãèíàëèè";
    Text[ polish ] = "Marginesy";
    Text[ japanese ] = "–T’";
    Text[ language_user1 ] = " ";
    Text[ chinese_traditional ] = "®Çª`";
    Text[ arabic ] = "ãáÇÍÙÇÊ åÇãÔíÉ";
    Text[ greek ] = "Óçìåéþóåéò óôï ðåñéèþñéï";
    Text[ korean ] = "¿©¹é";
    Text[ turkish ] = "Derkenar";
};
String STR_POOLCOLL_HEADLINE1
{
    /* ### ACHTUNG: Neuer Text in Resource? Überschrift 1 : šberschrift 1 */
    Text = "Überschrift 1" ;
    Text [ English ] = "Headline 1" ;
    Text [ dutch ] = "Kop 1" ;
    Text [ english_us ] = "Heading 1" ;
    Text [ italian ] = "Intestazione 1" ;
    Text [ spanish ] = "Encabezado 1" ;
    Text [ french ] = "Titre 1" ;
    Text [ swedish ] = "Överskrift 1" ;
    Text [ danish ] = "Overskrift 1" ;
    Text [ portuguese ] = "Título 1" ;
    Text [ portuguese_brazilian ] = "Überschrift 1" ;
    Text[ chinese_simplified ] = "±êÌâ 1";
    Text[ russian ] = "Çàãîëîâîê 1";
    Text[ polish ] = "Tytu³ 1";
    Text[ japanese ] = "Œ©o‚µ 1";
    Text[ chinese_traditional ] = "¼ÐÃD 1";
    Text[ arabic ] = "ÇáÚäæÇä 1";
    Text[ greek ] = "Åðéêåöáëßäá 1";
    Text[ korean ] = "Á¦¸ñ 1";
    Text[ turkish ] = "Baþlýk 1";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_HEADLINE2
{
    /* ### ACHTUNG: Neuer Text in Resource? Überschrift 2 : šberschrift 2 */
    Text = "Überschrift 2" ;
    Text [ English ] = "Headline 2" ;
    Text [ english_us ] = "Heading 2" ;
    Text [ italian ] = "Intestazione 2" ;
    Text [ spanish ] = "Encabezado 2" ;
    Text [ french ] = "Titre 2" ;
    Text [ dutch ] = "Kop 2" ;
    Text [ swedish ] = "Överskrift 2" ;
    Text [ danish ] = "Overskrift 2" ;
    Text [ portuguese_brazilian ] = "Überschrift 2" ;
    Text [ portuguese ] = "Título 2" ;
    Text[ chinese_simplified ] = "±êÌâ 2";
    Text[ russian ] = "Çàãîëîâîê 2";
    Text[ polish ] = "Tytu³ 2";
    Text[ japanese ] = "Œ©o‚µ 2";
    Text[ chinese_traditional ] = "¼ÐÃD 2";
    Text[ arabic ] = "ÇáÚäæÇä 2";
    Text[ greek ] = "Åðéêåöáëßäá 2";
    Text[ korean ] = "Á¦¸ñ 2";
    Text[ turkish ] = "Baþlýk 2";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_HEADLINE3
{
    /* ### ACHTUNG: Neuer Text in Resource? Überschrift 3 : šberschrift 3 */
    Text = "Überschrift 3" ;
    Text [ English ] = "Headline 3" ;
    Text [ english_us ] = "Heading 3" ;
    Text [ italian ] = "Intestazione 3" ;
    Text [ spanish ] = "Encabezado 3" ;
    Text [ french ] = "Titre 3" ;
    Text [ dutch ] = "Kop 3" ;
    Text [ swedish ] = "Överskrift 3" ;
    Text [ danish ] = "Overskrift 3" ;
    Text [ portuguese_brazilian ] = "Überschrift 3" ;
    Text [ portuguese ] = "Título 3" ;
    Text[ chinese_simplified ] = "±êÌâ 3";
    Text[ russian ] = "Çàãîëîâîê 3";
    Text[ polish ] = "Tytu³ 3";
    Text[ japanese ] = "Œ©o‚µ 3";
    Text[ chinese_traditional ] = "¼ÐÃD 3";
    Text[ arabic ] = "ÇáÚäæÇä 3";
    Text[ greek ] = "Åðéêåöáëßäá 3";
    Text[ korean ] = "Á¦¸ñ 3";
    Text[ turkish ] = "Baþlýk 3";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_HEADLINE4
{
    /* ### ACHTUNG: Neuer Text in Resource? Überschrift 4 : šberschrift 4 */
    Text = "Überschrift 4" ;
    Text [ English ] = "Headline 4" ;
    Text [ english_us ] = "Heading 4" ;
    Text [ italian ] = "Intestazione 4" ;
    Text [ spanish ] = "Encabezado 4" ;
    Text [ french ] = "Titre 4" ;
    Text [ dutch ] = "Kop 4" ;
    Text [ swedish ] = "Överskrift 4" ;
    Text [ danish ] = "Overskrift 4" ;
    Text [ portuguese_brazilian ] = "Überschrift 4" ;
    Text [ portuguese ] = "Título 4" ;
    Text[ chinese_simplified ] = "±êÌâ 4";
    Text[ russian ] = "Çàãîëîâîê 4";
    Text[ polish ] = "Tytu³ 4";
    Text[ japanese ] = "Œ©o‚µ 4";
    Text[ chinese_traditional ] = "¼ÐÃD 4";
    Text[ arabic ] = "ÇáÚäæÇä 4";
    Text[ greek ] = "Åðéêåöáëßäá 4";
    Text[ korean ] = "Á¦¸ñ 4";
    Text[ turkish ] = "Baþlýk 4";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_HEADLINE5
{
    /* ### ACHTUNG: Neuer Text in Resource? Überschrift 5 : šberschrift 5 */
    Text = "Überschrift 5" ;
    Text [ English ] = "Headline 5" ;
    Text [ english_us ] = "Heading 5" ;
    Text [ italian ] = "Intestazione 5" ;
    Text [ spanish ] = "Encabezado 5" ;
    Text [ french ] = "Titre 5" ;
    Text [ dutch ] = "Kop 5" ;
    Text [ swedish ] = "Överskrift 5" ;
    Text [ danish ] = "Overskrift 5" ;
    Text [ portuguese_brazilian ] = "Überschrift 5" ;
    Text [ portuguese ] = "Título 5" ;
    Text[ chinese_simplified ] = "±êÌâ 5";
    Text[ russian ] = "Çàãîëîâîê 5";
    Text[ polish ] = "Tytu³ 5";
    Text[ japanese ] = "Œ©o‚µ 5";
    Text[ chinese_traditional ] = "¼ÐÃD 5";
    Text[ arabic ] = "ÇáÚäæÇä 5";
    Text[ greek ] = "Åðéêåöáëßäá 5";
    Text[ korean ] = "Á¦¸ñ 5";
    Text[ turkish ] = "Baþlýk 5";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_HEADLINE6
{
    /* ### ACHTUNG: Neuer Text in Resource? Überschrift 5 : šberschrift 5 */
    Text = "Überschrift 6" ;
    Text [ English ] = "Headline 6" ;
    Text [ english_us ] = "Heading 6" ;
    Text [ italian ] = "Intestazione 6" ;
    Text [ spanish ] = "Encabezado 6" ;
    Text [ french ] = "Titre 6" ;
    Text [ dutch ] = "Kop 6" ;
    Text [ swedish ] = "Överskrift 6" ;
    Text [ danish ] = "Overskrift 6" ;
    Text [ portuguese_brazilian ] = "Überschrift 6" ;
    Text [ portuguese ] = "Título 6" ;
    Text[ chinese_simplified ] = "±êÌâ 6";
    Text[ russian ] = "Çàãîëîâîê 6";
    Text[ polish ] = "Tytu³ 6";
    Text[ japanese ] = "Œ©o‚µ 6";
    Text[ chinese_traditional ] = "¼ÐÃD 6";
    Text[ arabic ] = "ÇáÚäæÇä 6";
    Text[ greek ] = "Åðéêåöáëßäá 6";
    Text[ korean ] = "Á¦¸ñ 6";
    Text[ turkish ] = "Baþlýk 6";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_HEADLINE7
{
    /* ### ACHTUNG: Neuer Text in Resource? Überschrift 7 : šberschrift 7 */
    Text = "Überschrift 7" ;
    Text [ English ] = "Headline 7" ;
    Text [ english_us ] = "Heading 7" ;
    Text [ italian ] = "Intestazione 7" ;
    Text [ spanish ] = "Encabezado 7" ;
    Text [ french ] = "Titre 7" ;
    Text [ dutch ] = "Kop 7" ;
    Text [ swedish ] = "Överskrift 7" ;
    Text [ danish ] = "Overskrift 7" ;
    Text [ portuguese_brazilian ] = "Überschrift 7" ;
    Text [ portuguese ] = "Título 7" ;
    Text[ chinese_simplified ] = "±êÌâ 7";
    Text[ russian ] = "Çàãîëîâîê 7";
    Text[ polish ] = "Tytu³ 7";
    Text[ japanese ] = "Œ©o‚µ 7";
    Text[ chinese_traditional ] = "¼ÐÃD 7";
    Text[ arabic ] = "ÇáÚäæÇä 7";
    Text[ greek ] = "Åðéêåöáëßäá 7";
    Text[ korean ] = "Á¦¸ñ 7";
    Text[ turkish ] = "Baþlýk 7";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_HEADLINE8
{
    /* ### ACHTUNG: Neuer Text in Resource? Überschrift 8 : šberschrift 8 */
    Text = "Überschrift 8" ;
    Text [ English ] = "Headline 8" ;
    Text [ english_us ] = "Heading 8" ;
    Text [ italian ] = "Intestazione 8" ;
    Text [ spanish ] = "Encabezado 8" ;
    Text [ french ] = "Titre 8" ;
    Text [ dutch ] = "Kop 8" ;
    Text [ swedish ] = "Överskrift 8" ;
    Text [ danish ] = "Overskrift 8" ;
    Text [ portuguese_brazilian ] = "Überschrift 8" ;
    Text [ portuguese ] = "Título 8" ;
    Text[ chinese_simplified ] = "±êÌâ 8";
    Text[ russian ] = "Çàãîëîâîê 8";
    Text[ polish ] = "Tytu³ 8";
    Text[ japanese ] = "Œ©o‚µ 8";
    Text[ chinese_traditional ] = "¼ÐÃD 8";
    Text[ arabic ] = "ÇáÚäæÇä 8";
    Text[ greek ] = "Åðéêåöáëßäá 8";
    Text[ korean ] = "Á¦¸ñ 8";
    Text[ turkish ] = "Baþlýk 8";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_HEADLINE9
{
    /* ### ACHTUNG: Neuer Text in Resource? Überschrift 9 : šberschrift 9 */
    Text = "Überschrift 9" ;
    Text [ English ] = "Headline 9" ;
    Text [ english_us ] = "Heading 9" ;
    Text [ italian ] = "Intestazione 9" ;
    Text [ spanish ] = "Encabezado 9" ;
    Text [ french ] = "Titre 9" ;
    Text [ dutch ] = "Kop 9" ;
    Text [ swedish ] = "Överskrift 9" ;
    Text [ danish ] = "Overskrift 9" ;
    Text [ portuguese_brazilian ] = "Überschrift 9" ;
    Text [ portuguese ] = "Título 9" ;
    Text[ chinese_simplified ] = "±êÌâ 9";
    Text[ russian ] = "Çàãîëîâîê 9";
    Text[ polish ] = "Tytu³ 9";
    Text[ japanese ] = "Œ©o‚µ 9";
    Text[ chinese_traditional ] = "¼ÐÃD 9";
    Text[ arabic ] = "ÇáÚäæÇä 9";
    Text[ greek ] = "Åðéêåöáëßäá 9";
    Text[ korean ] = "Á¦¸ñ9";
    Text[ turkish ] = "Baþlýk 9";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_HEADLINE10
{
    /* ### ACHTUNG: Neuer Text in Resource? Überschrift 10 : šberschrift 10 */
    Text = "Überschrift 10" ;
    Text [ English ] = "Headline 10" ;
    Text [ english_us ] = "Heading 10" ;
    Text [ italian ] = "Intestazione 10" ;
    Text [ spanish ] = "Encabezado 10" ;
    Text [ french ] = "Titre 10" ;
    Text [ dutch ] = "Kop 10" ;
    Text [ swedish ] = "Överskrift 10" ;
    Text [ danish ] = "Overskrift 10" ;
    Text [ portuguese_brazilian ] = "Überschrift 10" ;
    Text [ portuguese ] = "Título 10" ;
    Text[ chinese_simplified ] = "±êÌâ 10";
    Text[ russian ] = "Çàãîëîâîê 10";
    Text[ polish ] = "Tytu³ 10";
    Text[ japanese ] = "Œ©o‚µ 10";
    Text[ chinese_traditional ] = "¼ÐÃD 10";
    Text[ arabic ] = "ÇáÚäæÇä 10";
    Text[ greek ] = "Åðéêåöáëßäá 10";
    Text[ korean ] = "Á¦¸ñ 10";
    Text[ turkish ] = "Baþlýk 10";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_NUM_LEVEL1S
{
    Text = "Nummerierung 1 Anfang" ;
    Text [ English ] = "Numbering 1 start" ;
    Text [ english_us ] = "Numbering 1 Start" ;
    Text [ italian ] = "Numerazione 1 inizio" ;
    Text [ spanish ] = "Numeración 1 inicio" ;
    Text [ french ] = "Numérotation 1 début" ;
    Text [ dutch ] = "Nummering 1 begin" ;
    Text [ swedish ] = "Numrering 1 start" ;
    Text [ danish ] = "Nummerering 1 start" ;
    Text [ portuguese ] = "Numeração 1 Início" ;
    Text [ portuguese_brazilian ] = "Numerierung 1 Anfang" ;
    Text[ chinese_simplified ] = "±àºÅ 1 ¿ª¶Ë";
    Text[ russian ] = "Íà÷àëî íóìåðàöèè 1";
    Text[ polish ] = "Pocz¹tek numeracji 1";
    Text[ japanese ] = "”ԍ†•t‚¯ 1 Žn‚ß";
    Text[ chinese_traditional ] = "½s¸¹ 1 ¶}ºÝ";
    Text[ arabic ] = "ÇáÊÑÞíã 1 ÈÏÇíÉ";
    Text[ greek ] = "Áñßèìçóç 1 Áñ÷Þ";
    Text[ korean ] = "¹øÈ£ 1 ½ÃÀÛ";
    Text[ turkish ] = "Numaralama 1 Baþlangýç";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_NUM_LEVEL1
{
    Text = "Nummerierung 1" ;
    Text [ English ] = "Numbering 1" ;
    Text [ dutch ] = "Nummering 1" ;
    Text [ english_us ] = "Numbering 1" ;
    Text [ italian ] = "Numerazione 1" ;
    Text [ spanish ] = "Numeración 1" ;
    Text [ french ] = "Numérotation 1" ;
    Text [ swedish ] = "Numrering 1" ;
    Text [ danish ] = "Nummerering 1" ;
    Text [ portuguese ] = "Numeração 1" ;
    Text [ portuguese_brazilian ] = "Numerierung 1" ;
    Text[ chinese_simplified ] = "񅧏 1";
    Text[ russian ] = "Íóìåðàöèÿ 1";
    Text[ polish ] = "Numeracja 1";
    Text[ japanese ] = "”ԍ†•t‚¯ 1";
    Text[ language_user1 ] = " ";
    Text[ chinese_traditional ] = "½s¸¹ 1";
    Text[ arabic ] = "ÇáÊÑÞíã 1";
    Text[ greek ] = "Áñßèìçóç 1";
    Text[ korean ] = "¹øÈ£1";
    Text[ turkish ] = "Numaralama 1";
};
String STR_POOLCOLL_NUM_LEVEL1E
{
    Text = "Nummerierung 1 Ende" ;
    Text [ English ] = "Numbering 1 end" ;
    Text [ english_us ] = "Numbering 1 End" ;
    Text [ italian ] = "Numerazione 1 fine" ;
    Text [ spanish ] = "Numeración 1 fin" ;
    Text [ french ] = "Numérotation 1 fin" ;
    Text [ dutch ] = "Nummering 1 einde" ;
    Text [ swedish ] = "Numrering 1 slut" ;
    Text [ danish ] = "Nummerering 1 slut" ;
    Text [ portuguese ] = "Numeração 1 Fim" ;
    Text [ portuguese_brazilian ] = "Numerierung 1 Ende" ;
    Text[ chinese_simplified ] = "±àºÅ 1 ½áβ";
    Text[ russian ] = "Êîíåö íóìåðàöèè 1";
    Text[ polish ] = "Koniec numeracji 1";
    Text[ japanese ] = "”ԍ†•t‚¯ 1 I‚è";
    Text[ chinese_traditional ] = "½s¸¹ 1 µ²§À";
    Text[ arabic ] = "ÇáÊÑÞíã 1 äåÇíÉ";
    Text[ greek ] = "Áñßèìçóç 1 ÔÝëïò";
    Text[ korean ] = "¹øÈ£ 1 Á¾·á";
    Text[ turkish ] = "Numaralama 1 Son";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_NUM_NONUM1
{
    Text = "Nummerierung 1 Fortsetzung" ;
    Text [ English ] = "Numbering 1 next" ;
    Text [ english_us ] = "Numbering 1 Cont." ;
    Text [ italian ] = "Numerazione 1 succ." ;
    Text [ spanish ] = "Numeración 1 continuación" ;
    Text [ french ] = "Numérotation 1 suite" ;
    Text [ dutch ] = "Nummering 1 voortzetting" ;
    Text [ swedish ] = "Numrering 1 fortsättning" ;
    Text [ danish ] = "Nummerering 1 fortsættelse" ;
    Text [ portuguese ] = "Numeração 1 Continuação" ;
    Text [ portuguese_brazilian ] = "Numerierung 1 Fortsetzung" ;
    Text[ chinese_simplified ] = "±àºÅ 1 ¼ÌÐø";
    Text[ russian ] = "Ïðîäîëæåíèå íóìåðàöèè 1";
    Text[ polish ] = "Kontynuacja numeracji 1";
    Text[ japanese ] = "”ԍ†•t‚¯ 1 ‘±‚«";
    Text[ chinese_traditional ] = "½s¸¹ 1 Ä~Äò";
    Text[ arabic ] = "ÇáÊÑÞíã 1 ãÊÇÈÚÉ";
    Text[ greek ] = "Áñßèìçóç 1 ÓõíÝ÷åéá";
    Text[ korean ] = "¹øÈ£ 1 °è¼Ó";
    Text[ turkish ] = "Numaralama 1 Devam";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_NUM_LEVEL2S
{
    Text = "Nummerierung 2 Anfang" ;
    Text [ English ] = "Numbering 2 start" ;
    Text [ dutch ] = "Nummering 2 begin" ;
    Text [ english_us ] = "Numbering 2 Start" ;
    Text [ italian ] = "Numerazione 2 inizio" ;
    Text [ spanish ] = "Numeración 2 inicio" ;
    Text [ french ] = "Numérotation 2 début" ;
    Text [ swedish ] = "Numrering 2 start" ;
    Text [ danish ] = "Nummerering 2 start" ;
    Text [ portuguese ] = "Numeração 2 Início" ;
    Text [ portuguese_brazilian ] = "Numerierung 2 Anfang" ;
    Text[ chinese_simplified ] = "±àºÅ 2 ¿ª¶Ë";
    Text[ russian ] = "Íà÷àëî íóìåðàöèè 2";
    Text[ polish ] = "Pocz¹tek numeracji 2 ";
    Text[ japanese ] = "”ԍ†•t‚¯ 2 Žn‚ß";
    Text[ chinese_traditional ] = "½s¸¹ 2 ¶}ºÝ";
    Text[ arabic ] = "ÇáÊÑÞíã 2 ÈÏÇíÉ";
    Text[ greek ] = "Áñßèìçóç 2 Áñ÷Þ";
    Text[ korean ] = "¹øÈ£ 2 ½ÃÀÛ";
    Text[ turkish ] = "Numaralama 2 Baþlangýç";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_NUM_LEVEL2
{
    Text = "Nummerierung 2" ;
    Text [ English ] = "Numbering 2" ;
    Text [ dutch ] = "Nummering 2" ;
    Text [ english_us ] = "Numbering 2" ;
    Text [ italian ] = "Numerazione 2" ;
    Text [ spanish ] = "Numeración 2" ;
    Text [ french ] = "Numérotation 2" ;
    Text [ swedish ] = "Numrering 2" ;
    Text [ danish ] = "Nummerering 2" ;
    Text [ portuguese ] = "Numeração 2" ;
    Text [ portuguese_brazilian ] = "Numerierung 2" ;
    Text[ chinese_simplified ] = "񅧏 2";
    Text[ russian ] = "Íóìåðàöèÿ 2";
    Text[ polish ] = "Numeracja 2";
    Text[ japanese ] = "”ԍ†•t‚¯ 2";
    Text[ chinese_traditional ] = "½s¸¹ 2";
    Text[ arabic ] = "ÇáÊÑÞíã 2";
    Text[ greek ] = "Áñßèìçóç 2";
    Text[ korean ] = "¹øÈ£2";
    Text[ turkish ] = "Numaralama 2";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_NUM_LEVEL2E
{
    Text = "Nummerierung 2 Ende" ;
    Text [ English ] = "Numbering 2 end" ;
    Text [ english_us ] = "Numbering 2 End" ;
    Text [ italian ] = "Numerazione 2 fine" ;
    Text [ spanish ] = "Numeración 2 fin" ;
    Text [ french ] = "Numérotation 2 fin" ;
    Text [ dutch ] = "Nummering 2 einde" ;
    Text [ swedish ] = "Numrering 2 slut" ;
    Text [ danish ] = "Nummerering 2 slut" ;
    Text [ portuguese ] = "Numeração 2 Fim" ;
    Text [ portuguese_brazilian ] = "Numerierung 2 Ende" ;
    Text[ chinese_simplified ] = "±àºÅ 2 ½áβ";
    Text[ russian ] = "Êîíåö íóìåðàöèè 2";
    Text[ polish ] = "Koniec numeracji 2 ";
    Text[ japanese ] = "”ԍ†•t‚¯ 2 I‚è";
    Text[ chinese_traditional ] = "½s¸¹ 2 µ²§À";
    Text[ arabic ] = "ÇáÊÑÞíã 2 äåÇíÉ";
    Text[ greek ] = "Áñßèìçóç 2 ÔÝëïò";
    Text[ korean ] = "¹øÈ£ 2 Á¾·á";
    Text[ turkish ] = "Numaralama 2 Son";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_NUM_NONUM2
{
    Text = "Nummerierung 2 Fortsetzung" ;
    Text [ English ] = "Numbering 2 next" ;
    Text [ english_us ] = "Numbering 2 Cont." ;
    Text [ italian ] = "Numerazione 2 succ." ;
    Text [ spanish ] = "Numeración 2 continuación" ;
    Text [ french ] = "Numérotation 2 suite" ;
    Text [ dutch ] = "Nummering 2 voortzetting" ;
    Text [ swedish ] = "Numrering 2 fortsättning" ;
    Text [ danish ] = "Nummerering 2 fortsættelse" ;
    Text [ portuguese ] = "Numeração 2 Continuação" ;
    Text [ portuguese_brazilian ] = "Numerierung 2 Fortsetzung" ;
    Text[ chinese_simplified ] = "±àºÅ 2 ¼ÌÐø";
    Text[ russian ] = "Ïðîäîëæåíèå íóìåðàöèè 2";
    Text[ polish ] = "Kontynuacja numeracji 2";
    Text[ japanese ] = "”ԍ†•t‚¯ 2 ‘±‚«";
    Text[ chinese_traditional ] = "½s¸¹ 2 Ä~Äò";
    Text[ arabic ] = "ÇáÊÑÞíã 2 ãÊÇÈÚÉ";
    Text[ greek ] = "Áñßèìçóç 2 ÓõíÝ÷åéá";
    Text[ korean ] = "¹øÈ£ 2 °è¼Ó";
    Text[ turkish ] = "Numaralama 2 Devam";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_NUM_LEVEL3S
{
    Text = "Nummerierung 3 Anfang" ;
    Text [ English ] = "Numbering 3 start" ;
    Text [ dutch ] = "Nummering 3 begin" ;
    Text [ english_us ] = "Numbering 3 Start" ;
    Text [ italian ] = "Numerazione 3 inizio" ;
    Text [ spanish ] = "Numeración 3 inicio" ;
    Text [ french ] = "Numérotation 3 début" ;
    Text [ swedish ] = "Numrering 3 start" ;
    Text [ danish ] = "Nummerering 3 start" ;
    Text [ portuguese ] = "Numeração 3 Início" ;
    Text [ portuguese_brazilian ] = "Numerierung 3 Anfang" ;
    Text[ chinese_simplified ] = "±àºÅ 3 ¿ª¶Ë";
    Text[ russian ] = "Íà÷àëî íóìåðàöèè 3";
    Text[ polish ] = "Pocz¹tek numeracji 3 ";
    Text[ japanese ] = "”ԍ†•t‚¯ 3 Žn‚ß";
    Text[ chinese_traditional ] = "½s¸¹ 3 ¶}ºÝ";
    Text[ arabic ] = "ÇáÊÑÞíã 3 ÈÏÇíÉ";
    Text[ greek ] = "Áñßèìçóç 3 Áñ÷Þ";
    Text[ korean ] = "¹øÈ£ 3 ½ÃÀÛ";
    Text[ turkish ] = "Numaralama 3 Baþlangýç";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_NUM_LEVEL3
{
    Text = "Nummerierung 3" ;
    Text [ English ] = "Numbering 3" ;
    Text [ dutch ] = "Nummering 3" ;
    Text [ english_us ] = "Numbering 3" ;
    Text [ italian ] = "Numerazione 3" ;
    Text [ spanish ] = "Numeración 3" ;
    Text [ french ] = "Numérotation 3" ;
    Text [ swedish ] = "Numrering 3" ;
    Text [ danish ] = "Nummerering 3" ;
    Text [ portuguese ] = "Numeração 3" ;
    Text [ portuguese_brazilian ] = "Numerierung 3" ;
    Text[ chinese_simplified ] = "񅧏 3";
    Text[ russian ] = "Íóìåðàöèÿ 3";
    Text[ polish ] = "Numeracja 3";
    Text[ japanese ] = "”ԍ†•t‚¯ 3";
    Text[ chinese_traditional ] = "½s¸¹ 3";
    Text[ arabic ] = "ÇáÊÑÞíã 3";
    Text[ greek ] = "Áñßèìçóç 3";
    Text[ korean ] = "¹øÈ£ 3";
    Text[ turkish ] = "Numaralama 3";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_NUM_LEVEL3E
{
    Text = "Nummerierung 3 Ende" ;
    Text [ English ] = "Numbering 3 end" ;
    Text [ english_us ] = "Numbering 3 End" ;
    Text [ italian ] = "Numerazione 3 fine" ;
    Text [ spanish ] = "Numeración 3 fin" ;
    Text [ french ] = "Numérotation 3 fin" ;
    Text [ dutch ] = "Nummering 3 einde" ;
    Text [ swedish ] = "Numrering 3 slut" ;
    Text [ danish ] = "Nummerering 3 slut" ;
    Text [ portuguese ] = "Numeração 3 Fim" ;
    Text [ portuguese_brazilian ] = "Numerierung 3 Ende" ;
    Text[ chinese_simplified ] = "±àºÅ 3 ½áβ";
    Text[ russian ] = "Êîíåö íóìåðàöèè 3";
    Text[ polish ] = "Koniec numeracji 3 ";
    Text[ japanese ] = "”ԍ†•t‚¯ 3 I‚è";
    Text[ chinese_traditional ] = "½s¸¹ 3 µ²§À";
    Text[ arabic ] = "ÇáÊÑÞíã 3 äåÇíÉ";
    Text[ greek ] = "Áñßèìçóç 3 ÔÝëïò";
    Text[ korean ] = "¹øÈ£ 3 Á¾·á";
    Text[ turkish ] = "Numaralama 3 Son";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_NUM_NONUM3
{
    Text = "Nummerierung 3 Fortsetzung" ;
    Text [ English ] = "Numbering 3 next" ;
    Text [ english_us ] = "Numbering 3 Cont." ;
    Text [ italian ] = "Numerazione 3 succ." ;
    Text [ spanish ] = "Numeración 3 continuación" ;
    Text [ french ] = "Numérotation 3 suite" ;
    Text [ dutch ] = "Nummering 3 voortzetting" ;
    Text [ swedish ] = "Numrering 3 fortsättning" ;
    Text [ danish ] = "Nummerering 3 fortsættelse" ;
    Text [ portuguese ] = "Numeração 3 Continuação" ;
    Text [ portuguese_brazilian ] = "Numerierung 3 Fortsetzung" ;
    Text[ chinese_simplified ] = "±àºÅ 3 ¼ÌÐø";
    Text[ russian ] = "Ïðîäîëæåíèå íóìåðàöèè 3";
    Text[ polish ] = "Kontynuacja numeracji 3";
    Text[ japanese ] = "”ԍ†•t‚¯ 3 ‘±‚«";
    Text[ chinese_traditional ] = "½s¸¹ 3 Ä~Äò";
    Text[ arabic ] = "ÇáÊÑÞíã 3 ãÊÇÈÚÉ";
    Text[ greek ] = "Áñßèìçóç 3 ÓõíÝ÷åéá";
    Text[ korean ] = "¹øÈ£ 3 °è¼Ó";
    Text[ turkish ] = "Numaralama 3 Devam";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_NUM_LEVEL4S
{
    Text = "Nummerierung 4 Anfang" ;
    Text [ English ] = "Numbering 4 start" ;
    Text [ dutch ] = "Nummering 4 begin" ;
    Text [ english_us ] = "Numbering 4 Start" ;
    Text [ italian ] = "Numerazione 4 inizio" ;
    Text [ spanish ] = "Numeración 4 inicio" ;
    Text [ french ] = "Numérotation 4 début" ;
    Text [ swedish ] = "Numrering 4 start" ;
    Text [ danish ] = "Nummerering 4 start" ;
    Text [ portuguese ] = "Numeração 4 Início" ;
    Text [ portuguese_brazilian ] = "Numerierung 4 Anfang" ;
    Text[ chinese_simplified ] = "±àºÅ 4 ¿ª¶Ë";
    Text[ russian ] = "Íà÷àëî íóìåðàöèè 4";
    Text[ polish ] = "Pocz¹tek numeracji 4";
    Text[ japanese ] = "”ԍ†•t‚¯ 4 Žn‚ß";
    Text[ chinese_traditional ] = "½s¸¹ 4 ¶}ºÝ";
    Text[ arabic ] = "ÇáÊÑÞíã 4 ÈÏÇíÉ";
    Text[ greek ] = "Áñßèìçóç 4 Áñ÷Þ";
    Text[ korean ] = "¹øÈ£ 4 ½ÃÀÛ";
    Text[ turkish ] = "Numaralama 4 Baþlangýç";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_NUM_LEVEL4
{
    Text = "Nummerierung 4" ;
    Text [ English ] = "Numbering 4" ;
    Text [ dutch ] = "Nummering 4" ;
    Text [ english_us ] = "Numbering 4" ;
    Text [ italian ] = "Numerazione 4" ;
    Text [ spanish ] = "Numeración 4" ;
    Text [ french ] = "Numérotation 4" ;
    Text [ swedish ] = "Numrering 4" ;
    Text [ danish ] = "Nummerering 4" ;
    Text [ portuguese ] = "Numeração 4" ;
    Text [ portuguese_brazilian ] = "Numerierung 4" ;
    Text[ chinese_simplified ] = "񅧏 4";
    Text[ russian ] = "Íóìåðàöèÿ 4";
    Text[ polish ] = "Numeracja 4";
    Text[ japanese ] = "”ԍ†•t‚¯ 4";
    Text[ chinese_traditional ] = "½s¸¹ 4";
    Text[ arabic ] = "ÇáÊÑÞíã 4";
    Text[ greek ] = "Áñßèìçóç 4";
    Text[ korean ] = "¹øÈ£ 4";
    Text[ turkish ] = "Numaralama 4";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_NUM_LEVEL4E
{
    Text = "Nummerierung 4 Ende" ;
    Text [ English ] = "Numbering 4 end" ;
    Text [ english_us ] = "Numbering 4 End" ;
    Text [ italian ] = "Numerazione 4 fine" ;
    Text [ spanish ] = "Numeración 4 fin" ;
    Text [ french ] = "Numérotation 4 fin" ;
    Text [ dutch ] = "Nummering 4 einde" ;
    Text [ swedish ] = "Numrering 4 slut" ;
    Text [ danish ] = "Nummerering 4 slut" ;
    Text [ portuguese ] = "Numeração 4 Fim" ;
    Text [ portuguese_brazilian ] = "Numerierung 4 Ende" ;
    Text[ chinese_simplified ] = "±àºÅ 4 ½áβ";
    Text[ russian ] = "Êîíåö íóìåðàöèè 4";
    Text[ polish ] = "Koniec numeracji 4";
    Text[ japanese ] = "”ԍ†•t‚¯ 4 I‚è";
    Text[ chinese_traditional ] = "½s¸¹ 4 µ²§À";
    Text[ arabic ] = "ÇáÊÑÞíã 4 äåÇíÉ";
    Text[ greek ] = "Áñßèìçóç 4 ÔÝëïò";
    Text[ korean ] = "¹øÈ£ 4 Á¾·á";
    Text[ turkish ] = "Numaralama 4 Son";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_NUM_NONUM4
{
    Text = "Nummerierung 4 Fortsetzung" ;
    Text [ English ] = "Numbering 4 next" ;
    Text [ english_us ] = "Numbering 4 Cont." ;
    Text [ italian ] = "Numerazione 4 succ." ;
    Text [ spanish ] = "Numeración 4 continuación" ;
    Text [ french ] = "Numérotation 4 suite" ;
    Text [ dutch ] = "Nummering 4 voortzetting" ;
    Text [ swedish ] = "Numrering 4 fortsättning" ;
    Text [ danish ] = "Nummerering 4 fortsættelse" ;
    Text [ portuguese ] = "Numeração 4 Continuação" ;
    Text [ portuguese_brazilian ] = "Numerierung 4 Fortsetzung" ;
    Text[ chinese_simplified ] = "±àºÅ 4 ¼ÌÐø";
    Text[ russian ] = "Ïðîäîëæåíèå íóìåðàöèè 4";
    Text[ polish ] = "Kontynuacja numeracji 4";
    Text[ japanese ] = "”ԍ†•t‚¯ 4 ‘±‚«";
    Text[ chinese_traditional ] = "½s¸¹ 4 Ä~Äò";
    Text[ arabic ] = "ÇáÊÑÞíã 4 ãÊÇÈÚÉ";
    Text[ greek ] = "Áñßèìçóç 4 ÓõíÝ÷åéá";
    Text[ korean ] = "¹øÈ£ 4 °è¼Ó";
    Text[ turkish ] = "Numaralama 4 Devam";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_NUM_LEVEL5S
{
    Text = "Nummerierung 5 Anfang" ;
    Text [ English ] = "Numbering 5 start" ;
    Text [ dutch ] = "Nummering 5 begin" ;
    Text [ english_us ] = "Numbering 5 Start" ;
    Text [ italian ] = "Numerazione 5 inizio" ;
    Text [ spanish ] = "Numeración 5 inicio" ;
    Text [ french ] = "Numérotation 5 début" ;
    Text [ swedish ] = "Numrering 5 start" ;
    Text [ danish ] = "Nummerering 5 start" ;
    Text [ portuguese ] = "Numeração 5 Início" ;
    Text [ portuguese_brazilian ] = "Numerierung 5 Anfang" ;
    Text[ chinese_simplified ] = "±àºÅ 5 ¿ª¶Ë";
    Text[ russian ] = "Íà÷àëî íóìåðàöèè 5";
    Text[ polish ] = "Pocz¹tek numeracji 5";
    Text[ japanese ] = "”ԍ†•t‚¯ 5 Žn‚ß";
    Text[ chinese_traditional ] = "½s¸¹ 5 ¶}ºÝ";
    Text[ arabic ] = "ÇáÊÑÞíã 5 ÈÏÇíÉ";
    Text[ greek ] = "Áñßèìçóç 5 Áñ÷Þ";
    Text[ korean ] = "¹øÈ£ 5 ½ÃÀÛ";
    Text[ turkish ] = "Numaralama 5 Baþlangýç";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_NUM_LEVEL5
{
    Text = "Nummerierung 5" ;
    Text [ English ] = "Numbering 5" ;
    Text [ dutch ] = "Nummering 5" ;
    Text [ english_us ] = "Numbering 5" ;
    Text [ italian ] = "Numerazione 5" ;
    Text [ spanish ] = "Numeración 5" ;
    Text [ french ] = "Numérotation 5" ;
    Text [ swedish ] = "Numrering 5" ;
    Text [ danish ] = "Nummerering 5" ;
    Text [ portuguese ] = "Numeração 5" ;
    Text [ portuguese_brazilian ] = "Numerierung 5" ;
    Text[ chinese_simplified ] = "񅧏 5";
    Text[ russian ] = "Íóìåðàöèÿ 5";
    Text[ polish ] = "Numeracja 5";
    Text[ japanese ] = "”ԍ†•t‚¯ 5";
    Text[ chinese_traditional ] = "½s¸¹ 5";
    Text[ arabic ] = "ÇáÊÑÞíã 5";
    Text[ greek ] = "Áñßèìçóç 5";
    Text[ korean ] = "¹øÈ£ 5";
    Text[ turkish ] = "Numaralama 5";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_NUM_LEVEL5E
{
    Text = "Nummerierung 5 Ende" ;
    Text [ English ] = "Numbering 5 end" ;
    Text [ english_us ] = "Numbering 5 End" ;
    Text [ italian ] = "Numerazione 5 fine" ;
    Text [ spanish ] = "Numeración 5 fin" ;
    Text [ french ] = "Numérotation 5 fin" ;
    Text [ dutch ] = "Nummering 5 einde" ;
    Text [ swedish ] = "Numrering 5 slut" ;
    Text [ danish ] = "Nummerering 5 slut" ;
    Text [ portuguese ] = "Numeração 5 Fim" ;
    Text [ portuguese_brazilian ] = "Numerierung 5 Ende" ;
    Text[ chinese_simplified ] = "±àºÅ 5 ½áβ";
    Text[ russian ] = "Êîíåö íóìåðàöèè 5";
    Text[ polish ] = "Koniec numeracji 5";
    Text[ japanese ] = "”ԍ†•t‚¯ 5 I‚è";
    Text[ chinese_traditional ] = "½s¸¹ 5 µ²§À";
    Text[ arabic ] = "ÇáÊÑÞíã 5 äåÇíÉ";
    Text[ greek ] = "Áñßèìçóç 5 ÔÝëïò";
    Text[ korean ] = "¹øÈ£ 5 Á¾·á";
    Text[ turkish ] = "Numaralama 5 Son";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_NUM_NONUM5
{
    Text = "Nummerierung 5 Fortsetzung" ;
    Text [ English ] = "Numbering 5 next" ;
    Text [ english_us ] = "Numbering 5 Cont." ;
    Text [ italian ] = "Numerazione 5 succ." ;
    Text [ spanish ] = "Numeración 5 continuación" ;
    Text [ french ] = "Numérotation 5 suite" ;
    Text [ dutch ] = "Nummering 5 voortzetting" ;
    Text [ swedish ] = "Numrering 5 fortsättning" ;
    Text [ danish ] = "Nummerering 5 fortsættelse" ;
    Text [ portuguese ] = "Numeração 5 Continuação" ;
    Text [ portuguese_brazilian ] = "Numerierung 5 Fortsetzung" ;
    Text[ chinese_simplified ] = "±àºÅ 5 ¼ÌÐø";
    Text[ russian ] = "Ïðîäîëæåíèå íóìåðàöèè 5";
    Text[ polish ] = "Kontynuacja numeracji 5";
    Text[ japanese ] = "”ԍ†•t‚¯ 5 ‘±‚«";
    Text[ chinese_traditional ] = "½s¸¹ 5 Ä~Äò";
    Text[ arabic ] = "ÇáÊÑÞíã 5 ãÊÇÈÚÉ";
    Text[ greek ] = "Áñßèìçóç 5 ÓõíÝ÷åéá";
    Text[ korean ] = "¹øÈ£ 5 °è¼Ó";
    Text[ turkish ] = "Numaralama 5 Devam";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_BUL_LEVEL1S
{
    /* ### ACHTUNG: Neuer Text in Resource? Aufzählung 1 Anfang : Aufzõhlung 1 Anfang */
    Text = "Aufzählung 1 Anfang" ;
    Text [ English ] = "Bullet 1 start" ;
    Text [ dutch ] = "Opsomming 1 begin" ;
    Text [ english_us ] = "List 1 Start" ;
    Text [ italian ] = "Elenco 1 inizio" ;
    Text [ spanish ] = "Enumeración 1 inicio" ;
    Text [ french ] = "Puce 1 début" ;
    Text [ swedish ] = "Uppräkning 1 start" ;
    Text [ danish ] = "Punktopstilling 1 start" ;
    Text [ portuguese ] = "Marca 1 Início" ;
    Text [ portuguese_brazilian ] = "Aufzählung 1 Anfang" ;
    Text[ chinese_simplified ] = "ÏîÄ¿·ûºÅ 1 ¿ª¶Ë";
    Text[ russian ] = "Íà÷àëî ñïèñêà 1";
    Text[ polish ] = "Pocz¹tek listy 1";
    Text[ japanese ] = "‰Óð‘‚« 1 Žn‚ß";
    Text[ chinese_traditional ] = "¶µ¥Ø²Å¸¹ 1 ¶}ºÝ";
    Text[ arabic ] = "ÊÚÏÇÏ 1 ÈÏÇíÉ";
    Text[ greek ] = "ÊáôÜëïãïò 1 Áñ÷Þ";
    Text[ korean ] = "¸®½ºÆ® 1 ½ÃÀÛ";
    Text[ turkish ] = "Liste 1 Baþlangýç";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_BUL_LEVEL1
{
    /* ### ACHTUNG: Neuer Text in Resource? Aufzählung 1 : Aufzõhlung 1 */
    Text = "Aufzählung 1" ;
    Text [ English ] = "Bullet 1" ;
    Text [ dutch ] = "Opsomming 1" ;
    Text [ english_us ] = "List 1" ;
    Text [ italian ] = "Elenco 1" ;
    Text [ spanish ] = "Enumeración 1" ;
    Text [ french ] = "Puce 1" ;
    Text [ swedish ] = "Uppräkning 1" ;
    Text [ danish ] = "Punktopstilling 1" ;
    Text [ portuguese ] = "Marca 1" ;
    Text [ portuguese_brazilian ] = "Aufzählung 1" ;
    Text[ chinese_simplified ] = "ÏîÄ¿·ûºÅ 1";
    Text[ russian ] = "Ñïèñîê 1";
    Text[ polish ] = "Lista 1";
    Text[ japanese ] = "‰Óð‘‚« 1";
    Text[ chinese_traditional ] = "¶µ¥Ø²Å¸¹ 1";
    Text[ arabic ] = "ÊÚÏÇÏ 1";
    Text[ greek ] = "ÊáôÜëïãïò 1";
    Text[ korean ] = "¸®½ºÆ® 1";
    Text[ turkish ] = "Liste 1";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_BUL_LEVEL1E
{
    /* ### ACHTUNG: Neuer Text in Resource? Aufzählung 1 Ende : Aufzõhlung 1 Ende */
    Text = "Aufzählung 1 Ende" ;
    Text [ English ] = "Bullet 1 end" ;
    Text [ english_us ] = "List 1 End" ;
    Text [ italian ] = "Elenco 1 fine" ;
    Text [ spanish ] = "Enumeración 1 fin" ;
    Text [ french ] = "Puce 1 fin" ;
    Text [ dutch ] = "Opsomming 1 einde" ;
    Text [ swedish ] = "Uppräkning 1 slut" ;
    Text [ danish ] = "Punktopstilling 1 slut" ;
    Text [ portuguese ] = "Marca 1 Fim" ;
    Text [ portuguese_brazilian ] = "Aufzählung 1 Ende" ;
    Text[ chinese_simplified ] = "ÏîÄ¿·ûºÅ 1 ½áβ";
    Text[ russian ] = "Êîíåö ñïèñêà 1";
    Text[ polish ] = "Koniec listy 1";
    Text[ japanese ] = "‰Óð‘‚« 1 I‚è";
    Text[ chinese_traditional ] = "¶µ¥Ø²Å¸¹ 1 µ²§À";
    Text[ arabic ] = "ÊÚÏÇÏ 1 äåÇíÉ";
    Text[ greek ] = "ÊáôÜëïãïò 1 ÔÝëïò";
    Text[ korean ] = "¸®½ºÆ® 1Á¾·á";
    Text[ turkish ] = "Liste 1 Son";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_BUL_NONUM1
{
    /* ### ACHTUNG: Neuer Text in Resource? Aufzählung 1 Fortsetzung : Aufzõhlung 1 Fortsetzung */
    Text = "Aufzählung 1 Fortsetzung" ;
    Text [ English ] = "Bullet 1 next" ;
    Text [ english_us ] = "List 1 Cont." ;
    Text [ italian ] = "Elenco 1 succ." ;
    Text [ spanish ] = "Enumeración 1 continuación" ;
    Text [ french ] = "Puce 1 suivante" ;
    Text [ dutch ] = "Opsomming 1 voortzetting" ;
    Text [ swedish ] = "Uppräkning 1 fortsättning" ;
    Text [ danish ] = "Punktopstilling 1 fortsættelse" ;
    Text [ portuguese ] = "Marca 1 Continuação" ;
    Text [ portuguese_brazilian ] = "Aufzählung 1 Fortsetzung" ;
    Text[ chinese_simplified ] = "ÏîÄ¿·ûºÅ 1 ¼ÌÐø";
    Text[ russian ] = "Ïðîäîëæåíèå ñïèñêà 1";
    Text[ polish ] = "Kontynuacja listy1";
    Text[ japanese ] = "‰Óð‘‚« 1 ‘±‚«";
    Text[ chinese_traditional ] = "¶µ¥Ø²Å¸¹ 1 Ä~Äò";
    Text[ arabic ] = "ÊÚÏÇÏ 1 ãæÇÕáÉ";
    Text[ greek ] = "ÊáôÜëïãïò 1 ÓõíÝ÷åéá";
    Text[ korean ] = "¸®½ºÆ® 1 °è¼Ó";
    Text[ turkish ] = "Liste 1 Devam";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_BUL_LEVEL2S
{
    /* ### ACHTUNG: Neuer Text in Resource? Aufzählung 2 Anfang : Aufzõhlung 2 Anfang */
    Text = "Aufzählung 2 Anfang" ;
    Text [ English ] = "Bullet 2 start" ;
    Text [ dutch ] = "Opsomming 2 begin" ;
    Text [ english_us ] = "List 2 Start" ;
    Text [ italian ] = "Elenco 2 inizio" ;
    Text [ spanish ] = "Enumeración 2 inicio" ;
    Text [ french ] = "Puce 2 début" ;
    Text [ swedish ] = "Uppräkning 2 start" ;
    Text [ danish ] = "Punktopstilling 2 start" ;
    Text [ portuguese ] = "Marca 2 Início" ;
    Text [ portuguese_brazilian ] = "Aufzählung 2 Anfang" ;
    Text[ chinese_simplified ] = "ÏîÄ¿·ûºÅ 2 ¿ª¶Ë";
    Text[ russian ] = "Íà÷àëî ñïèñêà 2";
    Text[ polish ] = "Pocz¹tek listy 2 ";
    Text[ japanese ] = "‰Óð‘‚« 2 Žn‚ß";
    Text[ chinese_traditional ] = "¶µ¥Ø²Å¸¹ 2 ¶}ºÝ";
    Text[ arabic ] = "ÊÚÏÇÏ 2 ÈÏÇíÉ";
    Text[ greek ] = "ÊáôÜëïãïò 2 Áñ÷Þ";
    Text[ korean ] = "¸®½ºÆ® 2 ½ÃÀÛ";
    Text[ turkish ] = "Liste 2 Baþlangýç";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_BUL_LEVEL2
{
    /* ### ACHTUNG: Neuer Text in Resource? Aufzählung 2 : Aufzõhlung 2 */
    Text = "Aufzählung 2" ;
    Text [ English ] = "Bullet 2" ;
    Text [ dutch ] = "Opsomming 2" ;
    Text [ english_us ] = "List 2" ;
    Text [ italian ] = "Elenco 2" ;
    Text [ spanish ] = "Enumeración 2" ;
    Text [ french ] = "Puce 2" ;
    Text [ swedish ] = "Uppräkning 2" ;
    Text [ danish ] = "Punktopstilling 2" ;
    Text [ portuguese ] = "Marca 2" ;
    Text [ portuguese_brazilian ] = "Aufzählung 2" ;
    Text[ chinese_simplified ] = "ÏîÄ¿·ûºÅ 2";
    Text[ russian ] = "Ñïèñîê 2";
    Text[ polish ] = "Lista 2";
    Text[ japanese ] = "‰Óð‘‚« 2";
    Text[ chinese_traditional ] = "¶µ¥Ø²Å¸¹ 2";
    Text[ arabic ] = "ÊÚÏÇÏ 2";
    Text[ greek ] = "ÊáôÜëïãïò 2";
    Text[ korean ] = "¸®½ºÆ® 2";
    Text[ turkish ] = "Liste 2";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_BUL_LEVEL2E
{
    /* ### ACHTUNG: Neuer Text in Resource? Aufzählung 2 Ende : Aufzõhlung 2 Ende */
    Text = "Aufzählung 2 Ende" ;
    Text [ English ] = "Bullet 2 end" ;
    Text [ english_us ] = "List 2 End" ;
    Text [ italian ] = "Elenco 2 fine" ;
    Text [ spanish ] = "Enumeración 2 fin" ;
    Text [ french ] = "Puce 2 fin" ;
    Text [ dutch ] = "Opsomming 2 einde" ;
    Text [ swedish ] = "Uppräkning 2 slut" ;
    Text [ danish ] = "Punktopstilling 2 slut" ;
    Text [ portuguese ] = "Marca 2 Fim" ;
    Text [ portuguese_brazilian ] = "Aufzählung 2 Ende" ;
    Text[ chinese_simplified ] = "ÏîÄ¿·ûºÅ 2 ½áβ";
    Text[ russian ] = "êîíåö ñïèñêà 2";
    Text[ polish ] = "Koniec listy 2 ";
    Text[ japanese ] = "‰Óð‘‚« 2 I‚è";
    Text[ language_user1 ] = " ";
    Text[ chinese_traditional ] = "¶µ¥Ø²Å¸¹ 2 µ²§À";
    Text[ arabic ] = "ÊÚÏÇÏ 2 äåÇíÉ";
    Text[ greek ] = "ÊáôÜëïãïò 2 ÔÝëïò";
    Text[ korean ] = "¸®½ºÆ® 2 Á¾·á";
    Text[ turkish ] = "Liste 2 Son";
};
String STR_POOLCOLL_BUL_NONUM2
{
    /* ### ACHTUNG: Neuer Text in Resource? Aufzählung 2 Fortsetzung : Aufzõhlung 2 Fortsetzung */
    Text = "Aufzählung 2 Fortsetzung" ;
    Text [ English ] = "Bullet 2 next" ;
    Text [ english_us ] = "List 2 Cont." ;
    Text [ italian ] = "Elenco 2 succ." ;
    Text [ spanish ] = "Enumeración 2 continuación" ;
    Text [ french ] = "Puce 2 suivante" ;
    Text [ dutch ] = "Opsomming 2 voortzetting" ;
    Text [ swedish ] = "Uppräkning 2 fortsättning" ;
    Text [ danish ] = "Punktopstilling 2 fortsættelse" ;
    Text [ portuguese ] = "Marca 2 Continuação" ;
    Text [ portuguese_brazilian ] = "Aufzählung 2 Fortsetzung" ;
    Text[ chinese_simplified ] = "ÏîÄ¿·ûºÅ 2 ¼ÌÐø";
    Text[ russian ] = "Ïðîäîëæåíèå ñïèñêà 2";
    Text[ polish ] = "Kontynuacja listy 2";
    Text[ japanese ] = "‰Óð‘‚« 2 ‘±‚«";
    Text[ chinese_traditional ] = "¶µ¥Ø²Å¸¹ 2 Ä~Äò";
    Text[ arabic ] = "ÊÚÏÇÏ 2 ãæÇÕáÉ";
    Text[ greek ] = "ÊáôÜëïãïò 2 ÓõíÝ÷åéá";
    Text[ korean ] = "¸®½ºÆ® 2 °è¼Ó";
    Text[ turkish ] = "Liste 2 Devam";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_BUL_LEVEL3S
{
    /* ### ACHTUNG: Neuer Text in Resource? Aufzählung 3 Anfang : Aufzõhlung 3 Anfang */
    Text = "Aufzählung 3 Anfang" ;
    Text [ English ] = "Bullet 3 start" ;
    Text [ dutch ] = "Opsomming 3 begin" ;
    Text [ english_us ] = "List 3 Start" ;
    Text [ italian ] = "Elenco 3 inizio" ;
    Text [ spanish ] = "Enumeración 3 inicio" ;
    Text [ french ] = "Puce 3 début" ;
    Text [ swedish ] = "Uppräkning 3 start" ;
    Text [ danish ] = "Punktopstilling 3 start" ;
    Text [ portuguese ] = "Marca 3 Início" ;
    Text [ portuguese_brazilian ] = "Aufzählung 3 Anfang" ;
    Text[ chinese_simplified ] = "ÏîÄ¿·ûºÅ 3 ¿ª¶Ë";
    Text[ russian ] = "Íà÷àëî ñïèñêà 3";
    Text[ polish ] = "Pocz¹tek listy 3";
    Text[ japanese ] = "‰Óð‘‚« 3 Žn‚ß";
    Text[ chinese_traditional ] = "¶µ¥Ø²Å¸¹ 3 ¶}ºÝ";
    Text[ arabic ] = "ÊÚÏÇÏ 3 ÈÏÇíÉ";
    Text[ greek ] = "ÊáôÜëïãïò 3 Áñ÷Þ";
    Text[ korean ] = "¸®½ºÆ® 3 ½ÃÀÛ";
    Text[ turkish ] = "Liste 3 Baþlangýç";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_BUL_LEVEL3
{
    /* ### ACHTUNG: Neuer Text in Resource? Aufzählung 3 : Aufzõhlung 3 */
    Text = "Aufzählung 3" ;
    Text [ English ] = "Bullet 3" ;
    Text [ dutch ] = "Opsomming 3" ;
    Text [ english_us ] = "List 3" ;
    Text [ italian ] = "Elenco 3" ;
    Text [ spanish ] = "Enumeración 3" ;
    Text [ french ] = "Puce 3" ;
    Text [ swedish ] = "Uppräkning 3" ;
    Text [ danish ] = "Punktopstilling 3" ;
    Text [ portuguese ] = "Marca 3" ;
    Text [ portuguese_brazilian ] = "Aufzählung 3" ;
    Text[ chinese_simplified ] = "ÏîÄ¿·ûºÅ 3";
    Text[ russian ] = "Ñïèñîê 3";
    Text[ polish ] = "Lista 3";
    Text[ japanese ] = "‰Óð‘‚« 3";
    Text[ chinese_traditional ] = "¶µ¥Ø²Å¸¹ 3";
    Text[ arabic ] = "ÊÚÏÇÏ 3";
    Text[ greek ] = "ÊáôÜëïãïò 3";
    Text[ korean ] = "¸®½ºÆ® 3";
    Text[ turkish ] = "Liste 3";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_BUL_LEVEL3E
{
    /* ### ACHTUNG: Neuer Text in Resource? Aufzählung 3 Ende : Aufzõhlung 3 Ende */
    Text = "Aufzählung 3 Ende" ;
    Text [ English ] = "Bullet 3 end" ;
    Text [ english_us ] = "List 3 End" ;
    Text [ italian ] = "Elenco 3 fine" ;
    Text [ spanish ] = "Enumeración 3 fin" ;
    Text [ french ] = "Puce 3 fin" ;
    Text [ dutch ] = "Opsomming 3 einde" ;
    Text [ swedish ] = "Uppräkning 3 slut" ;
    Text [ danish ] = "Punktopstilling 3 slut" ;
    Text [ portuguese ] = "Marca 3 Fim" ;
    Text [ portuguese_brazilian ] = "Aufzählung 3 Ende" ;
    Text[ chinese_simplified ] = "ÏîÄ¿·ûºÅ 3 ½áβ";
    Text[ russian ] = "Êîíåö ñïèñêà 3";
    Text[ polish ] = "Koniec listy 3";
    Text[ japanese ] = "‰Óð‘‚« 3 I‚è";
    Text[ chinese_traditional ] = "¶µ¥Ø²Å¸¹ 3 µ²§À";
    Text[ arabic ] = "ÊÚÏÇÏ 3 äåÇíÉ";
    Text[ greek ] = "ÊáôÜëïãïò 3 ÔÝëïò";
    Text[ korean ] = "¸®½ºÆ® 3 Á¾·á";
    Text[ turkish ] = "Liste 3 Son";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_BUL_NONUM3
{
    /* ### ACHTUNG: Neuer Text in Resource? Aufzählung 3 Fortsetzung : Aufzõhlung 3 Fortsetzung */
    Text = "Aufzählung 3 Fortsetzung" ;
    Text [ English ] = "Bullet 3 next" ;
    Text [ english_us ] = "List 3 Cont." ;
    Text [ italian ] = "Elenco 3 succ." ;
    Text [ spanish ] = "Enumeración 3 continuación" ;
    Text [ french ] = "Puce 3 suivante" ;
    Text [ dutch ] = "Opsomming 3 voortzetting" ;
    Text [ swedish ] = "Uppräkning 3 fortsättning" ;
    Text [ danish ] = "Punktopstilling 3 fortsættelse" ;
    Text [ portuguese ] = "Marca 3 Continuação" ;
    Text [ portuguese_brazilian ] = "Aufzählung 3 Fortsetzung" ;
    Text[ chinese_simplified ] = "ÏîÄ¿±àºÅ 3 ¼ÌÐø";
    Text[ russian ] = "Ïðîäîëæåíèå ñïèñêà 3";
    Text[ polish ] = "Kontynuacja listy 3";
    Text[ japanese ] = "‰Óð‘‚« 3 ‘±‚«";
    Text[ chinese_traditional ] = "¶µ¥Ø½s¸¹ 3 Ä~Äò";
    Text[ arabic ] = "ÊÚÏÇÏ 3 ãæÇÕáÉ";
    Text[ greek ] = "ÊáôÜëïãïò 3 ÓõíÝ÷åéá";
    Text[ korean ] = "¸®½ºÆ® 3 °è¼Ó";
    Text[ turkish ] = "Liste 3 Devam";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_BUL_LEVEL4S
{
    /* ### ACHTUNG: Neuer Text in Resource? Aufzählung 4 Anfang : Aufzõhlung 4 Anfang */
    Text = "Aufzählung 4 Anfang" ;
    Text [ English ] = "Bullet 4 start" ;
    Text [ dutch ] = "Opsomming 4 begin" ;
    Text [ english_us ] = "List 4 Start" ;
    Text [ italian ] = "Elenco 4 inizio" ;
    Text [ spanish ] = "Enumeración 4 inicio" ;
    Text [ french ] = "Puce 4 début" ;
    Text [ swedish ] = "Uppräkning 4 start" ;
    Text [ danish ] = "Punktopstilling 4 start" ;
    Text [ portuguese ] = "Marca 4 Início" ;
    Text [ portuguese_brazilian ] = "Aufzählung 4 Anfang" ;
    Text[ chinese_simplified ] = "ÏîÄ¿·ûºÅ 4 ¿ª¶Ë";
    Text[ russian ] = "Íà÷àëî ñïèñêà 4";
    Text[ polish ] = "Pocz¹tek listy 4";
    Text[ japanese ] = "‰Óð‘‚« 4 Žn‚ß";
    Text[ chinese_traditional ] = "¶µ¥Ø²Å¸¹ 4 ¶}ºÝ";
    Text[ arabic ] = "ÊÚÏÇÏ 4 ÈÏÇíÉ";
    Text[ greek ] = "ÊáôÜëïãïò 4 Áñ÷Þ";
    Text[ korean ] = "¸®½ºÆ® 4 ½ÃÀÛ";
    Text[ turkish ] = "Liste 4 Baþlangýç";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_BUL_LEVEL4
{
    /* ### ACHTUNG: Neuer Text in Resource? Aufzählung 4 : Aufzõhlung 4 */
    Text = "Aufzählung 4" ;
    Text [ English ] = "Bullet 4" ;
    Text [ dutch ] = "Opsomming 4" ;
    Text [ english_us ] = "List 4" ;
    Text [ italian ] = "Elenco 4" ;
    Text [ spanish ] = "Enumeración 4" ;
    Text [ french ] = "Puce 4" ;
    Text [ swedish ] = "Uppräkning 4" ;
    Text [ danish ] = "Punktopstilling 4" ;
    Text [ portuguese ] = "Marca 4" ;
    Text [ portuguese_brazilian ] = "Aufzählung 4" ;
    Text[ chinese_simplified ] = "ÏîÄ¿·ûºÅ 4";
    Text[ russian ] = "Ñïèñîê 4";
    Text[ polish ] = "Lista 4";
    Text[ japanese ] = "‰Óð‘‚« 4";
    Text[ chinese_traditional ] = "¶µ¥Ø²Å¸¹ 4";
    Text[ arabic ] = "ÊÚÏÇÏ 4";
    Text[ greek ] = "ÊáôÜëïãïò 4";
    Text[ korean ] = "¸®½ºÆ® 4";
    Text[ turkish ] = "Liste 4";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_BUL_LEVEL4E
{
    /* ### ACHTUNG: Neuer Text in Resource? Aufzählung 4 Ende : Aufzõhlung 4 Ende */
    Text = "Aufzählung 4 Ende" ;
    Text [ English ] = "Bullet 4 end" ;
    Text [ english_us ] = "List 4 End" ;
    Text [ italian ] = "Elenco 4 fine" ;
    Text [ spanish ] = "Enumeración 4 fin" ;
    Text [ french ] = "Puce 4 fin" ;
    Text [ dutch ] = "Opsomming 4 einde" ;
    Text [ swedish ] = "Uppräkning 4 slut" ;
    Text [ danish ] = "Punktopstilling 4 slut" ;
    Text [ portuguese ] = "Marca 4 Fim" ;
    Text [ portuguese_brazilian ] = "Aufzählung 4 Ende" ;
    Text[ chinese_simplified ] = "ÏîÄ¿·ûºÅ 4 ½áβ";
    Text[ russian ] = "Êîíåö ñïèñêà 4";
    Text[ polish ] = "Koniec listy 4";
    Text[ japanese ] = "‰Óð‘‚« 4 I‚è";
    Text[ chinese_traditional ] = "¶µ¥Ø²Å¸¹ 4 µ²§À";
    Text[ arabic ] = "ÊÚÏÇÏ 4 äåÇíÉ";
    Text[ greek ] = "ÊáôÜëïãïò 4 ÔÝëïò";
    Text[ korean ] = "¸®½ºÆ® 4 Á¾·á";
    Text[ turkish ] = "Liste 4 Son";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_BUL_NONUM4
{
    /* ### ACHTUNG: Neuer Text in Resource? Aufzählung 4 Fortsetzung : Aufzõhlung 4 Fortsetzung */
    Text = "Aufzählung 4 Fortsetzung" ;
    Text [ English ] = "Bullet 4 next" ;
    Text [ english_us ] = "List 4 Cont." ;
    Text [ italian ] = "Elenco 4 succ." ;
    Text [ spanish ] = "Enumeración 4 continuación" ;
    Text [ french ] = "Puce 4 suivante" ;
    Text [ dutch ] = "Opsomming 4 voortzetting" ;
    Text [ swedish ] = "Uppräkning 4 fortsättning" ;
    Text [ danish ] = "Punktopstilling 4 fortsættelse" ;
    Text [ portuguese ] = "Marca 4 Continuação" ;
    Text [ portuguese_brazilian ] = "Aufzählung 4 Fortsetzung" ;
    Text[ chinese_simplified ] = "ÏîÄ¿±àºÅ 4 ¼ÌÐø";
    Text[ russian ] = "Ïðîäîëæåíèå ñïèñêà 4";
    Text[ polish ] = "Kontynuacja listy 4";
    Text[ japanese ] = "‰Óð‘‚« 4 ‘±‚«";
    Text[ chinese_traditional ] = "¶µ¥Ø½s¸¹ 4 Ä~Äò";
    Text[ arabic ] = "ÊÚÏÇÏ 4 ãæÇÕáÉ";
    Text[ greek ] = "ÊáôÜëïãïò 4 ÓõíÝ÷åéá";
    Text[ korean ] = "¸®½ºÆ® 4 °è¼Ó";
    Text[ turkish ] = "Liste 4 Devam";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_BUL_LEVEL5S
{
    /* ### ACHTUNG: Neuer Text in Resource? Aufzählung 5 Anfang : Aufzõhlung 5 Anfang */
    Text = "Aufzählung 5 Anfang" ;
    Text [ English ] = "Bullet 5 start" ;
    Text [ dutch ] = "Opsomming 5 begin" ;
    Text [ english_us ] = "List 5 Start" ;
    Text [ italian ] = "Elenco 5 inizio" ;
    Text [ spanish ] = "Enumeración 5 inicio" ;
    Text [ french ] = "Puce 5 début" ;
    Text [ swedish ] = "Uppräkning 5 start" ;
    Text [ danish ] = "Punktopstilling 5 start" ;
    Text [ portuguese ] = "Marca 5 Início" ;
    Text [ portuguese_brazilian ] = "Aufzählung 5 Anfang" ;
    Text[ chinese_simplified ] = "ÏîÄ¿·ûºÅ 5 ¿ª¶Ë";
    Text[ russian ] = "Íà÷àëî ñïèñêà 5";
    Text[ polish ] = "Pocz¹tek listy 5";
    Text[ japanese ] = "‰Óð‘‚« 5 Žn‚ß";
    Text[ chinese_traditional ] = "¶µ¥Ø²Å¸¹ 5 ¶}ºÝ";
    Text[ arabic ] = "ÊÚÏÇÏ 5 ÈÏÇíÉ";
    Text[ greek ] = "ÊáôÜëïãïò 5 Áñ÷Þ";
    Text[ korean ] = "¸®½ºÆ® 5 ½ÃÀÛ";
    Text[ turkish ] = "Liste 5 Baþlangýç";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_BUL_LEVEL5
{
    /* ### ACHTUNG: Neuer Text in Resource? Aufzählung 5 : Aufzõhlung 5 */
    Text = "Aufzählung 5" ;
    Text [ English ] = "Bullet 5" ;
    Text [ dutch ] = "Opsomming 5" ;
    Text [ english_us ] = "List 5" ;
    Text [ italian ] = "Elenco 5" ;
    Text [ spanish ] = "Enumeración 5" ;
    Text [ french ] = "Puce 5" ;
    Text [ swedish ] = "Uppräkning 5" ;
    Text [ danish ] = "Punktopstilling 5" ;
    Text [ portuguese ] = "Marca 5" ;
    Text [ portuguese_brazilian ] = "Aufzählung 5" ;
    Text[ chinese_simplified ] = "ÏîÄ¿·ûºÅ 5";
    Text[ russian ] = "Ñïèñîê 5";
    Text[ polish ] = "Lista 5";
    Text[ japanese ] = "‰Óð‘‚« 5";
    Text[ chinese_traditional ] = "¶µ¥Ø²Å¸¹ 5";
    Text[ arabic ] = "ÊÚÏÇÏ 5";
    Text[ greek ] = "ÊáôÜëïãïò 5";
    Text[ korean ] = "¸®½ºÆ® 5";
    Text[ turkish ] = "Liste 5";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_BUL_LEVEL5E
{
    /* ### ACHTUNG: Neuer Text in Resource? Aufzählung 5 Ende : Aufzõhlung 5 Ende */
    Text = "Aufzählung 5 Ende" ;
    Text [ English ] = "Bullet 5 end" ;
    Text [ english_us ] = "List 5 End" ;
    Text [ italian ] = "Elenco 5 fine" ;
    Text [ spanish ] = "Enumeración 5 fin" ;
    Text [ french ] = "Puce 5 fin" ;
    Text [ dutch ] = "Opsomming 5 einde" ;
    Text [ swedish ] = "Uppräkning 5 slut" ;
    Text [ danish ] = "Punktopstilling 5 slut" ;
    Text [ portuguese ] = "Marca 5 Fim" ;
    Text [ portuguese_brazilian ] = "Aufzählung 5 Ende" ;
    Text[ chinese_simplified ] = "ÏîÄ¿·ûºÅ 5 ½áβ";
    Text[ russian ] = "Êîíåö ñïèñêà 5";
    Text[ polish ] = "Koniec listy 5";
    Text[ japanese ] = "‰Óð‘‚« 5 I‚è";
    Text[ chinese_traditional ] = "¶µ¥Ø²Å¸¹ 5 µ²§À";
    Text[ arabic ] = "ÊÚÏÇÏ 5 äåÇíÉ";
    Text[ greek ] = "ÊáôÜëïãïò 5 ÔÝëïò";
    Text[ korean ] = "¸®½ºÆ® 5 Á¾·á";
    Text[ turkish ] = "Liste 5 Son";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_BUL_NONUM5
{
    /* ### ACHTUNG: Neuer Text in Resource? Aufzählung 5 Fortsetzung : Aufzõhlung 5 Fortsetzung */
    Text = "Aufzählung 5 Fortsetzung" ;
    Text [ English ] = "Bullet 5 next" ;
    Text [ english_us ] = "List 5 Cont." ;
    Text [ italian ] = "Elenco 5 succ." ;
    Text [ spanish ] = "Enumeración 5 continuación" ;
    Text [ french ] = "Puce 5 suivante" ;
    Text [ dutch ] = "Opsomming 5 voortzetting" ;
    Text [ swedish ] = "Uppräkning 5 fortsättning" ;
    Text [ danish ] = "Punktopstilling 5 fortsættelse" ;
    Text [ portuguese ] = "Marca 5 Continuação" ;
    Text [ portuguese_brazilian ] = "Aufzählung 5 Fortsetzung" ;
    Text[ chinese_simplified ] = "ÏîÄ¿±àºÅ 5 ¼ÌÐø";
    Text[ russian ] = "Ïðîäîëæåíèå ñïèñêà 5";
    Text[ polish ] = "Kontynuacja listy 5";
    Text[ japanese ] = "‰Óð‘‚« 5 ‘±‚«";
    Text[ chinese_traditional ] = "¶µ¥Ø½s¸¹ 5 Ä~Äò";
    Text[ arabic ] = "ÊÚÏÇÏ 5 ãæÇÕáÉ";
    Text[ greek ] = "ÊáôÜëïãïò 5 ÓõíÝ÷åéá";
    Text[ korean ] = "¸®½ºÆ® 5 °è¼Ó";
    Text[ turkish ] = "Liste 5 Devam";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_HEADER
{
    Text = "Kopfzeile" ;
    Text [ English ] = "Header" ;
    Text [ english_us ] = "Header" ;
    Text [ italian ] = "Riga d'intestazione" ;
    Text [ spanish ] = "Encabezamiento" ;
    Text [ french ] = "En-tête" ;
    Text [ dutch ] = "Koptekst" ;
    Text [ swedish ] = "Sidhuvud" ;
    Text [ danish ] = "Sidehoved" ;
    Text [ portuguese ] = "Cabeçalho" ;
    Text [ portuguese_brazilian ] = "Kopfzeile" ;
    Text[ chinese_simplified ] = "ҳü";
    Text[ russian ] = "Âåðõíèé êîëîíòèòóë";
    Text[ polish ] = "Nag³ówek";
    Text[ japanese ] = "ͯÀÞ";
    Text[ chinese_traditional ] = "­¶­º";
    Text[ arabic ] = "ÑÃÓ ÇáÕÝÍÉ";
    Text[ greek ] = "Êåöáëßäá";
    Text[ korean ] = "¸Ó¸®±Û";
    Text[ turkish ] = "Üstbilgi";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_HEADERL
{
    Text = "Kopfzeile links" ;
    Text [ English ] = "Header left" ;
    Text [ english_us ] = "Header left" ;
    Text [ italian ] = "Riga d'intestazione sinistra" ;
    Text [ spanish ] = "Encabezamiento izquierdo" ;
    Text [ french ] = "En-tête gauche" ;
    Text [ dutch ] = "Koptekst links" ;
    Text [ swedish ] = "Sidhuvud till vänster" ;
    Text [ danish ] = "Sidehoved til venstre" ;
    Text [ portuguese ] = "Cabeçalho à esquerda" ;
    Text [ portuguese_brazilian ] = "Kopfzeile links" ;
    Text[ chinese_simplified ] = "×óҳü";
    Text[ russian ] = "Âåðõíèé êîëîíòèòóë ñëåâà";
    Text[ polish ] = "Nag³ówek z lewej strony";
    Text[ japanese ] = "ͯÀލ¶";
    Text[ chinese_traditional ] = "¥ª­¶­º";
    Text[ arabic ] = "ÑÃÓ ÇáÕÝÍÉ Åáì ÇáíÓÇÑ";
    Text[ greek ] = "Êåöáëßäåò áñéóôåñÜ";
    Text[ korean ] = "¸Ó¸®±Û ¿ÞÂÊ";
    Text[ turkish ] = "Sol üstbilgi";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_HEADERR
{
    Text = "Kopfzeile rechts" ;
    Text [ English ] = "Header right" ;
    Text [ english_us ] = "Header right" ;
    Text [ italian ] = "Riga d'intestazione destra" ;
    Text [ spanish ] = "Encabezamiento derecho" ;
    Text [ french ] = "En-tête droit" ;
    Text [ dutch ] = "Koptekst rechts" ;
    Text [ swedish ] = "Sidhuvud till höger" ;
    Text [ danish ] = "Sidehoved til højre" ;
    Text [ portuguese ] = "Cabeçalho à direita" ;
    Text [ portuguese_brazilian ] = "Kopfzeile rechts" ;
    Text[ chinese_simplified ] = "ÓÒҳü";
    Text[ russian ] = "Âåðõíèé êîëîíòèòóë ñïðàâà";
    Text[ polish ] = "Nag³ówek z prawej strony";
    Text[ japanese ] = "ͯÀމE";
    Text[ chinese_traditional ] = "¥k­¶­º";
    Text[ arabic ] = "ÑÃÓ ÇáÕÝÍÉ Åáì Çáíãíä";
    Text[ greek ] = "Êåöáëßäåò äåîéÜ";
    Text[ korean ] = "¸Ó¸®±Û ¿À¸¥ÂÊ";
    Text[ turkish ] = "Sað üstbilgi";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_FOOTER
{
    /* ### ACHTUNG: Neuer Text in Resource? Fußzeile : Fu˜zeile */
    Text = "Fußzeile" ;
    Text [ English ] = "Footer" ;
    Text [ dutch ] = "Voettekst" ;
    Text [ english_us ] = "Footer" ;
    Text [ italian ] = "Piè di pagina" ;
    Text [ spanish ] = "Pie de página" ;
    Text [ french ] = "Pied de page" ;
    Text [ swedish ] = "Sidfot" ;
    Text [ danish ] = "Sidefod" ;
    Text [ portuguese ] = "Rodapé" ;
    Text [ portuguese_brazilian ] = "Fußzeile" ;
    Text[ chinese_simplified ] = "Ò³½Å";
    Text[ russian ] = "Íèæíèé êîëîíòèòóë";
    Text[ polish ] = "Stopka";
    Text[ japanese ] = "̯À";
    Text[ chinese_traditional ] = "­¶§À";
    Text[ arabic ] = "ÊÐííá ÇáÕÝÍÉ";
    Text[ greek ] = "ÕðïóÝëéäï";
    Text[ korean ] = "¹Ù´Ú±Û";
    Text[ turkish ] = "Altbilgi";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_FOOTERL
{
    /* ### ACHTUNG: Neuer Text in Resource? Fußzeile links : Fu˜zeile links */
    Text = "Fußzeile links" ;
    Text [ English ] = "Footer left" ;
    Text [ english_us ] = "Footer left" ;
    Text [ italian ] = "Piè di pagina a sinistra" ;
    Text [ spanish ] = "Pie de página izquierdo" ;
    Text [ french ] = "Pied de page gauche" ;
    Text [ dutch ] = "Voettekst links" ;
    Text [ swedish ] = "Sidfot till vänster" ;
    Text [ danish ] = "Sidefod til venstre" ;
    Text [ portuguese ] = "Rodapé à esquerda" ;
    Text [ portuguese_brazilian ] = "Fußzeile links" ;
    Text[ chinese_simplified ] = "×óÒ³½Å";
    Text[ russian ] = "Íèæíèé êîëîíòèòóë ñëåâà";
    Text[ polish ] = "Stopka z lewej strony";
    Text[ japanese ] = "̯À ¶";
    Text[ chinese_traditional ] = "¥ª­¶§À";
    Text[ arabic ] = "ÊÐííá ÇáÕÝÍÉ Åáì ÇáíÓÇÑ";
    Text[ greek ] = "ÕðïóÝëéäï áñéóôåñÜ";
    Text[ korean ] = "¹Ù´Ú±Û ¿ÞÂÊ";
    Text[ turkish ] = "Sol altbilgi";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_FOOTERR
{
    /* ### ACHTUNG: Neuer Text in Resource? Fußzeile rechts : Fu˜zeile rechts */
    Text = "Fußzeile rechts" ;
    Text [ English ] = "Footer right" ;
    Text [ english_us ] = "Footer right" ;
    Text [ italian ] = "Piè di pagina a destra" ;
    Text [ spanish ] = "Pie de página derecho" ;
    Text [ french ] = "Pied de page droit" ;
    Text [ dutch ] = "Voettekst rechts" ;
    Text [ swedish ] = "Sidfot till höger" ;
    Text [ danish ] = "Sidefod til højre" ;
    Text [ portuguese ] = "Rodapé à direita" ;
    Text [ portuguese_brazilian ] = "Fußzeile rechts" ;
    Text[ chinese_simplified ] = "ÓÒÒ³½Å";
    Text[ russian ] = "Íèæíèé êîëîíòèòóë ñïðàâà";
    Text[ polish ] = "Stopka z prawej strony";
    Text[ japanese ] = "̯À ‰E";
    Text[ chinese_traditional ] = "¥k­¶§À";
    Text[ arabic ] = "ÊÐííá ÇáÕÝÍÉ Åáì Çáíãíä";
    Text[ greek ] = "ÕðïóÝëéäï äåîéÜ";
    Text[ korean ] = "¹Ù´Ú±Û ¿À¸¥ÂÊ";
    Text[ turkish ] = "Sað altbilgi";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TABLE
{
    Text = "Tabellen Inhalt" ;
    Text [ English ] = "Table body" ;
    Text [ english_us ] = "Table Contents" ;
    Text [ italian ] = "Contenuto tabella" ;
    Text [ spanish ] = "Contenido de la tabla" ;
    Text [ french ] = "Contenu de tableau" ;
    Text [ dutch ] = "Inhoud tabel" ;
    Text [ swedish ] = "Tabellinnehåll" ;
    Text [ danish ] = "Tabelindhold" ;
    Text [ portuguese ] = "Conteúdo de tabela" ;
    Text [ portuguese_brazilian ] = "Tabellen Inhalt" ;
    Text[ chinese_simplified ] = "±í¸ñÄÚÈÝ";
    Text[ russian ] = "Ñîäåðæèìîå òàáëèöû";
    Text[ polish ] = "ZawartoϾ tabeli";
    Text[ japanese ] = "•\\‚Ì“à—e";
    Text[ chinese_traditional ] = "ªí®æ¤º®e";
    Text[ arabic ] = "ãÍÊæíÇÊ ÇáÌÏæá";
    Text[ greek ] = "Ðåñéå÷üìåíá ðßíáêá";
    Text[ korean ] = "Ç¥ ³»¿ë";
    Text[ turkish ] = "Tablo içeriði";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TABLE_HDLN
{
    /* ### ACHTUNG: Neuer Text in Resource? Tabellen Überschrift : Tabellen šberschrift */
    Text = "Tabellen Überschrift" ;
    Text [ English ] = "Table headline" ;
    Text [ english_us ] = "Table Heading" ;
    Text [ italian ] = "Intestazione tabella" ;
    Text [ spanish ] = "Encabezado de la tabla" ;
    Text [ french ] = "Titre de tableau" ;
    Text [ dutch ] = "Tabelkop" ;
    Text [ swedish ] = "Tabellöverskrift" ;
    Text [ danish ] = "Tabeloverskrift" ;
    Text [ portuguese ] = "Título de tabela" ;
    Text [ portuguese_brazilian ] = "Tabellen Überschrift" ;
    Text[ chinese_simplified ] = "±í¸ñ±êÌâ";
    Text[ russian ] = "Çàãîëîâîê òàáëèöû";
    Text[ polish ] = "Tytu³ tabeli";
    Text[ japanese ] = "•\\‚ÌŒ©o‚µ";
    Text[ chinese_traditional ] = "ªí®æ¼ÐÃD";
    Text[ arabic ] = "ÚäæÇä ÇáÌÏæá";
    Text[ greek ] = "Åðéêåöáëßäá ðßíáêá";
    Text[ korean ] = "Ç¥Á¦¸ñ";
    Text[ turkish ] = "Tablo baþlýðý";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_FRAME
{
    Text = "Rahmeninhalt" ;
    Text [ English ] = "Frame body" ;
    Text [ dutch ] = "Inhoud kader" ;
    Text [ english_us ] = "Frame contents" ;
    Text [ italian ] = "Contenuto cornice" ;
    Text [ spanish ] = "Contenido del marco" ;
    Text [ french ] = "Contenu du cadre" ;
    Text [ swedish ] = "Raminnehåll" ;
    Text [ danish ] = "Rammeindhold" ;
    Text [ portuguese ] = "Conteúdo da moldura" ;
    Text [ portuguese_brazilian ] = "Rahmeninhalt" ;
    Text[ chinese_simplified ] = "¿òÄÚÈÝ";
    Text[ russian ] = "Ñîäåðæèìîå ðàìêè";
    Text[ polish ] = "ZawartoϾ ramki";
    Text[ japanese ] = "˜g‚Ì“à—e";
    Text[ chinese_traditional ] = "°T®Ø¤º®e";
    Text[ arabic ] = "ãÍÊæíÇÊ ÇáÅØÇÑ";
    Text[ greek ] = "Ðåñéå÷üìåíá ðëáéóßïõ";
    Text[ korean ] = "ÇÁ·¹ÀÓ ³»¿ë";
    Text[ turkish ] = "Çerçeve içeriði";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_FOOTNOTE
{
    /* ### ACHTUNG: Neuer Text in Resource? Fußnote : Fu˜note */
    Text = "Fußnote" ;
    Text [ English ] = "Footnote" ;
    Text [ dutch ] = "Voetnoot" ;
    Text [ english_us ] = "Footnote" ;
    Text [ italian ] = "Nota a piè pagina" ;
    Text [ spanish ] = "Nota al pie" ;
    Text [ french ] = "Note de bas de page" ;
    Text [ swedish ] = "Fotnot" ;
    Text [ danish ] = "Fodnote" ;
    Text [ portuguese ] = "Nota de rodapé" ;
    Text [ portuguese_brazilian ] = "Fußnote" ;
    Text[ chinese_simplified ] = "×¢½Å";
    Text[ russian ] = "Ñíîñêà";
    Text[ polish ] = "Stopka";
    Text[ japanese ] = "‹r’";
    Text[ chinese_traditional ] = "µù¸}";
    Text[ arabic ] = "ÍÇÔíÉ ÓÝáíÉ";
    Text[ greek ] = "Õðïóçìåßùóç";
    Text[ korean ] = "°¢ÁÖ";
    Text[ turkish ] = "Dipnot";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_ENDNOTE
{
    Text = "Endnote" ;
    Text [ English ] = "Endnote" ;
    Text [ portuguese ] = "Nota final" ;
    Text [ english_us ] = "Endnote" ;
    Text [ portuguese_brazilian ] = "Endnote" ;
    Text [ swedish ] = "Slutnot" ;
    Text [ danish ] = "Slutnote" ;
    Text [ italian ] = "Nota di chiusura" ;
    Text [ spanish ] = "Nota al final" ;
    Text [ french ] = "Note de fin" ;
    Text [ dutch ] = "Eindnoot" ;
    Text[ chinese_simplified ] = "βע";
    Text[ russian ] = "Êîíöåâàÿ ñíîñêà";
    Text[ polish ] = "Przypis koñcowy";
    Text[ japanese ] = "•¶––‹r’";
    Text[ chinese_traditional ] = "§Àª`";
    Text[ arabic ] = "ÊÚáíÞ ÎÊÇãí";
    Text[ greek ] = "Óçìåßùóç ôÝëïõò";
    Text[ korean ] = "¹ÌÁÖ";
    Text[ turkish ] = "Sonnot";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_LABEL
{
    Text = "Beschriftung" ;
    Text [ English ] = "Label" ;
    Text [ english_us ] = "Caption" ;
    Text [ italian ] = "Dicitura" ;
    Text [ spanish ] = "Etiqueta" ;
    Text [ french ] = "Légende" ;
    Text [ dutch ] = "Titel" ;
    Text [ swedish ] = "Bildtext" ;
    Text [ danish ] = "Billedtekst" ;
    Text [ portuguese ] = "Legenda" ;
    Text [ portuguese_brazilian ] = "Beschriftung" ;
    Text[ chinese_simplified ] = "±êÇ©";
    Text[ russian ] = "Íàäïèñü";
    Text[ polish ] = "Opis";
    Text[ japanese ] = "×ÍÞÙ";
    Text[ chinese_traditional ] = "¼ÐÅÒ";
    Text[ arabic ] = "ÊÓãíÉ ÊæÖíÍíÉ";
    Text[ greek ] = "ÅðéãñáöÞ";
    Text[ korean ] = "ĸ¼Ç";
    Text[ turkish ] = "Etiket";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_LABEL_ABB
{
    Text = "Abbildung" ;
    Text [ English ] = "Figure" ;
    Text [ english_us ] = "Illustration" ;
    Text [ italian ] = "Illustrazione" ;
    Text [ spanish ] = "Ilustración" ;
    Text [ french ] = "Illustration" ;
    Text [ dutch ] = "Afbeelding" ;
    Text [ swedish ] = "Illustration" ;
    Text [ danish ] = "Illustration" ;
    Text [ portuguese ] = "Ilustração" ;
    Text [ portuguese_brazilian ] = "Abbildung" ;
    Text[ chinese_simplified ] = "²åͼ";
    Text[ russian ] = "Èëëþñòðàöèÿ";
    Text[ polish ] = "Ilustracja";
    Text[ japanese ] = "²×½Ä";
    Text[ chinese_traditional ] = "´¡¹Ï";
    Text[ arabic ] = "ÕæÑÉ ÅíÖÇÍíÉ";
    Text[ greek ] = "Åéêüíá";
    Text[ korean ] = "»ðÈ­";
    Text[ turkish ] = "Resim";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_LABEL_TABLE
{
    Text = "Tabelle" ;
    Text [ English ] = "Table" ;
    Text [ english_us ] = "Table" ;
    Text [ italian ] = "Tabella" ;
    Text [ spanish ] = "Tabla" ;
    Text [ french ] = "Tableau" ;
    Text [ dutch ] = "Tabel" ;
    Text [ swedish ] = "Tabell" ;
    Text [ danish ] = "Tabel" ;
    Text [ portuguese ] = "Tabela" ;
    Text [ portuguese_brazilian ] = "Tabelle" ;
    Text[ chinese_simplified ] = "±í¸ñ";
    Text[ russian ] = "Òàáëèöà";
    Text[ polish ] = "Tabela";
    Text[ japanese ] = "•\\";
    Text[ chinese_traditional ] = "ªí®æ";
    Text[ arabic ] = "ÇáÌÏæá";
    Text[ greek ] = "Ðßíáêáò";
    Text[ korean ] = "ǥ";
    Text[ turkish ] = "Tablo";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_LABEL_FRAME
{
    Text = "Text" ;
    Text [ English ] = "Text" ;
    Text [ dutch ] = "Tekst" ;
    Text [ english_us ] = "Text" ;
    Text [ italian ] = "Testo" ;
    Text [ spanish ] = "Texto" ;
    Text [ french ] = "Texte" ;
    Text [ swedish ] = "Text" ;
    Text [ danish ] = "Tekst" ;
    Text [ portuguese ] = "Texto" ;
    Text [ portuguese_brazilian ] = "Text" ;
    Text[ chinese_simplified ] = "ÎÄ×Ö";
    Text[ russian ] = "Òåêñò";
    Text[ polish ] = "Tekst";
    Text[ japanese ] = "÷½Ä";
    Text[ chinese_traditional ] = "¤º¤å";
    Text[ arabic ] = "ÇáäÕ";
    Text[ greek ] = "Êåßìåíï";
    Text[ korean ] = "ÅØ½ºÆ®";
    Text[ turkish ] = "Metin";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_LABEL_DRAWING
{
    Text = "Zeichnung" ;
    Text [ English ] = "Drawing" ;
    Text[ italian ] = "Disegno";
    Text[ portuguese_brazilian ] = "Drawing";
    Text[ portuguese ] = "Desenho";
    Text[ danish ] = "Tegning";
    Text[ french ] = "Dessin";
    Text[ swedish ] = "Teckning";
    Text[ dutch ] = "Tekening";
    Text[ spanish ] = "Dibujo";
    Text[ english_us ] = "Drawing";
    Text[ chinese_simplified ] = "»æÍ¼";
    Text[ russian ] = "Ðèñóíîê";
    Text[ polish ] = "Rysunek";
    Text[ japanese ] = "}Œ`•`‰æ";
    Text[ chinese_traditional ] = "ø¹Ï";
    Text[ arabic ] = "ÑÓãÉ";
    Text[ greek ] = "Ó÷Ýäéï";
    Text[ korean ] = "±×¸®±â";
    Text[ turkish ] = "Çizim";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_JAKETADRESS
{
    /* ### ACHTUNG: Neuer Text in Resource? Empfänger : Empfõnger */
    Text = "Empfänger" ;
    Text [ English ] = "Address" ;
    Text [ dutch ] = "Geadresseerde" ;
    Text [ english_us ] = "Addressee" ;
    Text [ italian ] = "Destinatario" ;
    Text [ spanish ] = "Destinatario" ;
    Text [ french ] = "Destinataire" ;
    Text [ swedish ] = "Mottagare" ;
    Text [ danish ] = "Modtager" ;
    Text [ portuguese ] = "Destinatário" ;
    Text [ portuguese_brazilian ] = "Empfänger" ;
    Text[ chinese_simplified ] = "ÊÕ¼þÈË";
    Text[ russian ] = "Ïîëó÷àòåëü";
    Text[ polish ] = "Odbiorca";
    Text[ japanese ] = "ŽóMŽÒ";
    Text[ chinese_traditional ] = "¦¬¥óªÌ";
    Text[ arabic ] = "ÇáãÓÊáã";
    Text[ greek ] = "ÐáñáëÞðôçò";
    Text[ korean ] = "¹Þ´Â »ç¶÷";
    Text[ turkish ] = "Alýcý";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_SENDADRESS
{
    Text = "Absender" ;
    Text [ English ] = "Sender" ;
    Text [ english_us ] = "Sender" ;
    Text [ italian ] = "Mittente" ;
    Text [ spanish ] = "Remitente" ;
    Text [ french ] = "Expéditeur" ;
    Text [ dutch ] = "Afzender" ;
    Text [ swedish ] = "Avsändare" ;
    Text [ danish ] = "Afsender" ;
    Text [ portuguese ] = "Remetente" ;
    Text [ portuguese_brazilian ] = "Absender" ;
    Text[ chinese_simplified ] = "·¢¼þÈË";
    Text[ russian ] = "Îòïðàâèòåëü";
    Text[ polish ] = "Nadawca";
    Text[ japanese ] = "·ol";
    Text[ chinese_traditional ] = "±H¥óªÌ";
    Text[ arabic ] = "ÇáãÑÓá";
    Text[ greek ] = "ÁðïóôïëÝáò";
    Text[ korean ] = "º¸³½ »ç¶÷";
    Text[ turkish ] = "Gönderen";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_IDXH
{
    /* ### ACHTUNG: Neuer Text in Resource? Stichwortverzeichnis Überschrift : Stichwortverzeichnis šberschrift */
    Text = "Stichwortverzeichnis Überschrift" ;
    Text [ English ] = "Headline TOX" ;
    Text [ english_us ] = "Index Heading" ;
    Text [ italian ] = "Intestazione indice analitico" ;
    Text [ spanish ] = "Encabezado del índice alfabético" ;
    Text [ french ] = "Index lexical : titre" ;
    Text [ dutch ] = "Indexkop" ;
    Text [ swedish ] = "Sakregisteröverskrift" ;
    Text [ danish ] = "Stikordsregisteroverskrift" ;
    Text [ portuguese ] = "Título do índice remissivo" ;
    Text [ portuguese_brazilian ] = "Stichwortverzeichnis Überschrift" ;
    Text[ chinese_simplified ] = "Ë÷Òý±êÌâ";
    Text[ russian ] = "Çàãîëîâîê óêàçàòåëÿ";
    Text[ polish ] = "Tytu³ zestawu hase³";
    Text[ japanese ] = "õˆø Œ©o‚µ";
    Text[ chinese_traditional ] = "¯Á¤Þ¼ÐÃD";
    Text[ arabic ] = "ÚäæÇä ÇáÝåÑÓ ÇáÃÈÌÏí";
    Text[ greek ] = "Åðéêåöáëßäá åõñåôçñßïõ ëÝîåùí";
    Text[ korean ] = "»öÀÎ Á¦¸ñ";
    Text[ turkish ] = "Alfabetik dizin baþlýðý";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_IDX1
{
    Text = "Stichwortverzeichnis 1" ;
    Text [ English ] = "Level 1 TOX" ;
    Text [ dutch ] = "Trefwoordenlijst 1" ;
    Text [ english_us ] = "Index 1" ;
    Text [ italian ] = "Indice analitico 1" ;
    Text [ spanish ] = "Índice afabético 1" ;
    Text [ french ] = "Index lexical 1" ;
    Text [ swedish ] = "Sakregister 1" ;
    Text [ danish ] = "Stikordsregister 1" ;
    Text [ portuguese ] = "Índice remissivo 1" ;
    Text [ portuguese_brazilian ] = "Stichwortverzeichnis 1" ;
    Text[ chinese_simplified ] = "Ë÷Òý 1";
    Text[ russian ] = "Óêàçàòåëü 1";
    Text[ polish ] = "Zestaw hase³ 1";
    Text[ japanese ] = "õˆø 1";
    Text[ chinese_traditional ] = "¯Á¤Þ 1";
    Text[ arabic ] = "ÝåÑÓ ÃÈÍÏí 1";
    Text[ greek ] = "ÅõñåôÞñéï ëÝîåùí 1";
    Text[ korean ] = "»öÀÎ 1";
    Text[ turkish ] = "Alfabetik dizin 1";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_IDX2
{
    Text = "Stichwortverzeichnis 2" ;
    Text [ English ] = "Level 2 TOX" ;
    Text [ english_us ] = "Index 2" ;
    Text [ italian ] = "Indice analitico 2" ;
    Text [ spanish ] = "Índice alfabético 2" ;
    Text [ french ] = "Index lexical 2" ;
    Text [ dutch ] = "Trefwoordenlijst 2" ;
    Text [ swedish ] = "Sakregister 2" ;
    Text [ danish ] = "Stikordsregister 2" ;
    Text [ portuguese ] = "Índice remissivo 2" ;
    Text [ portuguese_brazilian ] = "Stichwortverzeichnis 2" ;
    Text[ chinese_simplified ] = "Ë÷Òý 2";
    Text[ russian ] = "Óêàçàòåëü 2";
    Text[ polish ] = "Zestaw hase³ 2";
    Text[ japanese ] = "õˆø 2";
    Text[ chinese_traditional ] = "¯Á¤Þ 2";
    Text[ arabic ] = "ÝåÑÓ ÃÈÌÏí 2";
    Text[ greek ] = "ÅõñåôÞñéï ëÝîåùí 2";
    Text[ korean ] = "»öÀÎ 2";
    Text[ turkish ] = "Alfabetik dizin 2";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_IDX3
{
    Text = "Stichwortverzeichnis 3" ;
    Text [ English ] = "Level 3 TOX" ;
    Text [ english_us ] = "Index 3" ;
    Text [ italian ] = "Indice analitico 3" ;
    Text [ spanish ] = "Índice alfabético 3" ;
    Text [ french ] = "Index lexical 3" ;
    Text [ dutch ] = "Trefwoordenlijst 3" ;
    Text [ swedish ] = "Sakregister 3" ;
    Text [ danish ] = "Stikordsregister 3" ;
    Text [ portuguese ] = "Índice remissivo 3" ;
    Text [ portuguese_brazilian ] = "Stichwortverzeichnis 3" ;
    Text[ chinese_simplified ] = "Ë÷Òý 3";
    Text[ russian ] = "Óêàçàòåëü 3";
    Text[ polish ] = "Zestaw hase³ 3";
    Text[ japanese ] = "õˆø 3";
    Text[ chinese_traditional ] = "¯Á¤Þ 3";
    Text[ arabic ] = "ÝåÑÓ ÃÈÌÏí 3";
    Text[ greek ] = "ÅõñåôÞñéï ëÝîåùí 3";
    Text[ korean ] = "»öÀÎ 3";
    Text[ turkish ] = "Alfabetik dizin 3";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_IDXBREAK
{
    Text = "Stichwortverzeichnis Trenner" ;
    Text [ English ] = "Break TOX" ;
    Text [ english_us ] = "Index Separator" ;
    Text [ italian ] = "Separatore indice analitico" ;
    Text [ spanish ] = "Separador del índice alfabético" ;
    Text [ french ] = "Index lexical : séparateur" ;
    Text [ dutch ] = "Indexseparator" ;
    Text [ swedish ] = "Sakregisteravskiljare" ;
    Text [ danish ] = "Stikordsregister separator" ;
    Text [ portuguese ] = "Separador de índice remissivo" ;
    Text [ portuguese_brazilian ] = "Stichwortverzeichnis Trenner" ;
    Text[ chinese_simplified ] = "Ë÷Òý·Ö¸ô·û";
    Text[ russian ] = "Ðàçäåëèòåëü ïðåäìåòíîãî óêàçàòåëÿ";
    Text[ polish ] = "Separator zestawu hase³";
    Text[ japanese ] = "õˆø ¾ÊßÚ°À";
    Text[ chinese_traditional ] = "¯Á¤Þ¤À¹j²Å";
    Text[ arabic ] = "ÝÇÕá ÇáÝåÑÓ ÇáÃÈÌÏí";
    Text[ greek ] = "Äéá÷ùñéóôéêü åõñåôçñßïõ ëÝîåùí";
    Text[ korean ] = "»öÀÎ ±¸ºÐÀÚ";
    Text[ turkish ] = "Alfabetik dizin ayýrma iþareti";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_CNTNTH
{
    /* ### ACHTUNG: Neuer Text in Resource? Inhaltsverzeichnis Überschrift : Inhaltsverzeichnis šberschrift */
    Text = "Inhaltsverzeichnis Überschrift" ;
    Text [ English ] = "Headline TOC" ;
    Text [ dutch ] = "Kop inhoudsopgave" ;
    Text [ english_us ] = "Contents Heading" ;
    Text [ italian ] = "Intestazione indice" ;
    Text [ spanish ] = "Encabezado del índice" ;
    Text [ french ] = "Titre de table des matières" ;
    Text [ swedish ] = "Innehållsförteckning överskrift" ;
    Text [ danish ] = "Indholdsfortegnelse overskrift" ;
    Text [ portuguese ] = "Título do índice" ;
    Text [ portuguese_brazilian ] = "Inhaltsverzeichnis Überschrift" ;
    Text[ chinese_simplified ] = "ÄÚÈÝĿ¼±êÌâ";
    Text[ russian ] = "Çàãîëîâîê îãëàâëåíèÿ";
    Text[ polish ] = "Tytu³ spisu treœci";
    Text[ japanese ] = "–ÚŽŸ Œ©o‚µ";
    Text[ chinese_traditional ] = "¤º®e¥Ø¿ý¼ÐÃD";
    Text[ arabic ] = "ÚäæÇä ÝåÑÓ ÇáãÍÊæíÇÊ";
    Text[ greek ] = "Åðéêåöáëßäá êáôáëüãïõ ðåñéå÷ïìÝíùí";
    Text[ korean ] = "³»¿ë Á¦¸ñ";
    Text[ turkish ] = "Ýçindekiler dizini baþlýðý";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_CNTNT1
{
    Text = "Inhaltsverzeichnis 1" ;
    Text [ English ] = "Level 1 TOC" ;
    Text [ dutch ] = "Inhoudsopgave 1" ;
    Text [ english_us ] = "Contents 1" ;
    Text [ italian ] = "Indice 1" ;
    Text [ spanish ] = "Índice 1" ;
    Text [ french ] = "Table des matières niveau 1" ;
    Text [ swedish ] = "Innehållsförteckning 1" ;
    Text [ danish ] = "Indholdsfortegnelse 1" ;
    Text [ portuguese ] = "Índice 1" ;
    Text [ portuguese_brazilian ] = "Inhaltsverzeichnis 1" ;
    Text[ chinese_simplified ] = "ÄÚÈÝĿ¼ 1";
    Text[ russian ] = "Îãëàâëåíèå 1";
    Text[ polish ] = "Spis treœci 1";
    Text[ japanese ] = "–ÚŽŸ 1";
    Text[ chinese_traditional ] = "¤º®e¥Ø¿ý 1";
    Text[ arabic ] = "ÝåÑÓ ÇáãÍÊæíÇÊ 1";
    Text[ greek ] = "ÊáôÜëïãïò ðåñéå÷ïìÝíùí 1";
    Text[ korean ] = "³»¿ë 1";
    Text[ turkish ] = "Ýçindekiler dizini 1";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_CNTNT2
{
    Text = "Inhaltsverzeichnis 2" ;
    Text [ English ] = "Level 2 TOC" ;
    Text [ english_us ] = "Contents 2" ;
    Text [ italian ] = "Indice 2" ;
    Text [ spanish ] = "Índice 2" ;
    Text [ french ] = "Table des matières niveau 2" ;
    Text [ dutch ] = "Inhoudsopgave 2" ;
    Text [ swedish ] = "Innehållsförteckning 2" ;
    Text [ danish ] = "Indholdsfortegnelse 2" ;
    Text [ portuguese ] = "Índice 2" ;
    Text [ portuguese_brazilian ] = "Inhaltsverzeichnis 2" ;
    Text[ chinese_simplified ] = "ÄÚÈÝĿ¼ 2";
    Text[ russian ] = "Îãëàâëåíèå 2";
    Text[ polish ] = "Spis treœci 2";
    Text[ japanese ] = "–ÚŽŸ 2";
    Text[ chinese_traditional ] = "¤º®e¥Ø¿ý 2";
    Text[ arabic ] = "ÝåÑÓ ÇáãÍÊæíÇÊ 2";
    Text[ greek ] = "ÊáôÜëïãïò ðåñéå÷ïìÝíùí 2";
    Text[ korean ] = "³»¿ë 2";
    Text[ turkish ] = "Ýçindekiler dizini 2";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_CNTNT3
{
    Text = "Inhaltsverzeichnis 3" ;
    Text [ English ] = "Level 3 TOC" ;
    Text [ english_us ] = "Contents 3" ;
    Text [ italian ] = "Indice 3" ;
    Text [ spanish ] = "Índice 3" ;
    Text [ french ] = "Table des matières niveau 3" ;
    Text [ dutch ] = "Inhoudsopgave 3" ;
    Text [ swedish ] = "Innehållsförteckning 3" ;
    Text [ danish ] = "Indholdsfortegnelse 3" ;
    Text [ portuguese ] = "Índice 3" ;
    Text [ portuguese_brazilian ] = "Inhaltsverzeichnis 3" ;
    Text[ chinese_simplified ] = "ÄÚÈÝĿ¼ 3";
    Text[ russian ] = "Îãëàâëåíèå 3";
    Text[ polish ] = "Spis treœci 3";
    Text[ japanese ] = "–ÚŽŸ 3";
    Text[ chinese_traditional ] = "¤º®e¥Ø¿ý 3";
    Text[ arabic ] = "ÝåÑÓ ÇáãÍÊæíÇÊ 3";
    Text[ greek ] = "ÊáôÜëïãïò ðåñéå÷ïìÝíùí 3";
    Text[ korean ] = "³»¿ë 3";
    Text[ turkish ] = "Ýçindekiler dizini 3";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_CNTNT4
{
    Text = "Inhaltsverzeichnis 4" ;
    Text [ English ] = "Level 4 TOC" ;
    Text [ english_us ] = "Contents 4" ;
    Text [ italian ] = "Indice 4" ;
    Text [ spanish ] = "Índice 4" ;
    Text [ french ] = "Table des matières niveau 4" ;
    Text [ dutch ] = "Inhoudsopgave 4" ;
    Text [ swedish ] = "Innehållsförteckning 4" ;
    Text [ danish ] = "Indholdsfortegnelse 4" ;
    Text [ portuguese ] = "Índice 4" ;
    Text [ portuguese_brazilian ] = "Inhaltsverzeichnis 4" ;
    Text[ chinese_simplified ] = "ÄÚÈÝĿ¼ 4";
    Text[ russian ] = "Îãëàâëåíèå 4";
    Text[ polish ] = "Spis treœci 4";
    Text[ japanese ] = "–ÚŽŸ 4";
    Text[ chinese_traditional ] = "¤º®e¥Ø¿ý 4";
    Text[ arabic ] = "ÝåÑÓ ÇáãÍÊæíÇÊ 4";
    Text[ greek ] = "ÊáôÜëïãïò ðåñéå÷ïìÝíùí 4";
    Text[ korean ] = "³»¿ë 4";
    Text[ turkish ] = "Ýçindekiler dizini 4";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_CNTNT5
{
    Text = "Inhaltsverzeichnis 5" ;
    Text [ English ] = "Level 5 TOC" ;
    Text [ english_us ] = "Contents 5" ;
    Text [ italian ] = "Indice 5" ;
    Text [ spanish ] = "Índice 5" ;
    Text [ french ] = "Table des matières niveau 5" ;
    Text [ dutch ] = "Inhoudsopgave 5" ;
    Text [ swedish ] = "Innehållsförteckning 5" ;
    Text [ danish ] = "Indholdsfortegnelse 5" ;
    Text [ portuguese ] = "Índice 5" ;
    Text [ portuguese_brazilian ] = "Inhaltsverzeichnis 5" ;
    Text[ chinese_simplified ] = "ÄÚÈÝĿ¼ 5";
    Text[ russian ] = "Îãëàâëåíèå 5";
    Text[ polish ] = "Spis treœci 5";
    Text[ japanese ] = "–ÚŽŸ 5";
    Text[ chinese_traditional ] = "¤º®e¥Ø¿ý 5";
    Text[ arabic ] = "ÝåÑÓ ÇáãÍÊæíÇÊ 5";
    Text[ greek ] = "ÊáôÜëïãïò ðåñéå÷ïìÝíùí 5";
    Text[ korean ] = "³»¿ë 5";
    Text[ turkish ] = "Ýçindekiler dizini 5";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_CNTNT6
{
    Text = "Inhaltsverzeichnis 6" ;
    Text [ English ] = "Level 6 TOC" ;
    Text [ english_us ] = "Contents 6" ;
    Text [ italian ] = "Indice 6" ;
    Text [ spanish ] = "Índice 6" ;
    Text [ french ] = "Table des matières niveau 6" ;
    Text [ dutch ] = "Inhoudsopgave 6" ;
    Text [ swedish ] = "Innehållsförteckning 6" ;
    Text [ danish ] = "Indholdsfortegnelse 6" ;
    Text [ portuguese ] = "Índice geral 6" ;
    Text [ portuguese_brazilian ] = "Inhaltsverzeichnis 6" ;
    Text[ chinese_simplified ] = "ÄÚÈÝĿ¼ 6";
    Text[ russian ] = "Îãëàâëåíèå 6";
    Text[ polish ] = "Spis treœci 6";
    Text[ japanese ] = "–ÚŽŸ 6";
    Text[ chinese_traditional ] = "¤º®e¥Ø¿ý 6";
    Text[ arabic ] = "ÝåÑÓ ÇáãÍÊæíÇÊ 6";
    Text[ greek ] = "ÊáôÜëïãïò ðåñéå÷ïìÝíùí 6";
    Text[ korean ] = "³»¿ë 6";
    Text[ turkish ] = "Ýçindekiler dizini 6";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_CNTNT7
{
    Text = "Inhaltsverzeichnis 7" ;
    Text [ English ] = "Level 7 TOC" ;
    Text [ english_us ] = "Contents 7" ;
    Text [ italian ] = "Indice 7" ;
    Text [ spanish ] = "Índice 7" ;
    Text [ french ] = "Table des matières niveau 7" ;
    Text [ dutch ] = "Inhoudsopgave 7" ;
    Text [ swedish ] = "Innehållsförteckning 7" ;
    Text [ danish ] = "Indholdsfortegnelse 7" ;
    Text [ portuguese ] = "Índice geral 7" ;
    Text [ portuguese_brazilian ] = "Inhaltsverzeichnis 7" ;
    Text[ chinese_simplified ] = "ÄÚÈÝĿ¼ 7";
    Text[ russian ] = "Îãëàâëåíèå 7";
    Text[ polish ] = "Spis treœci 7";
    Text[ japanese ] = "–ÚŽŸ 7";
    Text[ chinese_traditional ] = "¤º®e¥Ø¿ý 7";
    Text[ arabic ] = "ÝåÑÓ ÇáãÍÊæíÇÊ 7";
    Text[ greek ] = "ÊáôÜëïãïò ðåñéå÷ïìÝíùí 7";
    Text[ korean ] = "³»¿ë 7";
    Text[ turkish ] = "Ýçindekiler dizini 7";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_CNTNT8
{
    Text = "Inhaltsverzeichnis 8" ;
    Text [ English ] = "Level 8 TOC" ;
    Text [ english_us ] = "Contents 8" ;
    Text [ italian ] = "Indice 8" ;
    Text [ spanish ] = "Índice 8" ;
    Text [ french ] = "Table des matières niveau 8" ;
    Text [ dutch ] = "Inhoudsopgave 8" ;
    Text [ swedish ] = "Innehållsförteckning 8" ;
    Text [ danish ] = "Indholdsfortegnelse 8" ;
    Text [ portuguese ] = "Índice geral 8" ;
    Text [ portuguese_brazilian ] = "Inhaltsverzeichnis 8" ;
    Text[ chinese_simplified ] = "ÄÚÈÝĿ¼ 8";
    Text[ russian ] = "Îãëàâëåíèå 8";
    Text[ polish ] = "Spis treœci 8";
    Text[ japanese ] = "–ÚŽŸ 8";
    Text[ chinese_traditional ] = "¤º®e¥Ø¿ý 8";
    Text[ arabic ] = "ÝåÑÓ ÇáãÍÊæíÇÊ 8";
    Text[ greek ] = "ÊáôÜëïãïò ðåñéå÷ïìÝíùí 8";
    Text[ korean ] = "³»¿ë 8";
    Text[ turkish ] = "Ýçindekiler dizini 8";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_CNTNT9
{
    Text = "Inhaltsverzeichnis 9" ;
    Text [ English ] = "Level 9 TOC" ;
    Text [ english_us ] = "Contents 9" ;
    Text [ italian ] = "Indice 9" ;
    Text [ spanish ] = "Índice 9" ;
    Text [ french ] = "Table des matières niveau 9" ;
    Text [ dutch ] = "Inhoudsopgave 9" ;
    Text [ swedish ] = "Innehållsförteckning 9" ;
    Text [ danish ] = "Indholdsfortegnelse 9" ;
    Text [ portuguese ] = "Índice geral 9" ;
    Text [ portuguese_brazilian ] = "Inhaltsverzeichnis 9" ;
    Text[ chinese_simplified ] = "ÄÚÈÝĿ¼ 9";
    Text[ russian ] = "Îãëàâëåíèå 9";
    Text[ polish ] = "Spis treœci 9";
    Text[ japanese ] = "–ÚŽŸ 9";
    Text[ chinese_traditional ] = "¤º®e¥Ø¿ý 9";
    Text[ arabic ] = "ÝåÑÓ ÇáãÍÊæíÇÊ 9";
    Text[ greek ] = "ÊáôÜëïãïò ðåñéå÷ïìÝíùí 9";
    Text[ korean ] = "³»¿ë 9";
    Text[ turkish ] = "Ýçindekiler dizini 9";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_CNTNT10
{
    Text = "Inhaltsverzeichnis 10" ;
    Text [ English ] = "Level 10 TOC" ;
    Text [ english_us ] = "Contents 10" ;
    Text [ italian ] = "Indice 10" ;
    Text [ spanish ] = "Índicel 10" ;
    Text [ french ] = "Table des matières niveau 10" ;
    Text [ dutch ] = "Inhoudsopgave 10" ;
    Text [ swedish ] = "Innehållsförteckning 10" ;
    Text [ danish ] = "Indholdsfortegnelse 10" ;
    Text [ portuguese ] = "Índice geral 10" ;
    Text [ portuguese_brazilian ] = "Inhaltsverzeichnis 10" ;
    Text[ chinese_simplified ] = "ÄÚÈÝĿ¼ 10";
    Text[ russian ] = "Îãëàâëåíèå 10";
    Text[ polish ] = "Spis treœci 10";
    Text[ japanese ] = "–ÚŽŸ 10";
    Text[ chinese_traditional ] = "¤º®e¥Ø¿ý 10";
    Text[ arabic ] = "ÝåÑÓ ÇáãÍÊæíÇÊ 10";
    Text[ greek ] = "ÊáôÜëïãïò ðåñéå÷ïìÝíùí 10";
    Text[ korean ] = "³»¿ë  10";
    Text[ turkish ] = "Ýçindekiler dizini 10";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_USERH
{
    /* ### ACHTUNG: Neuer Text in Resource? Benutzerverzeichnis Überschrift : Benutzerverzeichnis šberschrift */
    Text = "Benutzerverzeichnis Überschrift" ;
    Text [ English ] = "Headline user TOX" ;
    Text [ english_us ] = "User Index Heading" ;
    Text [ italian ] = "Intestazione indice personalizzato" ;
    Text [ spanish ] = "Encabezado del índice del usuario" ;
    Text [ french ] = "Titre d'index personnalisé" ;
    Text [ dutch ] = "Kopregel gebruikersindex" ;
    Text [ swedish ] = "Användarförteckning överskrift" ;
    Text [ danish ] = "Brugerindeks overskrift" ;
    Text [ portuguese ] = "Título do índice do utilizador" ;
    Text [ portuguese_brazilian ] = "Benutzerverzeichnis Überschrift" ;
    Text[ chinese_simplified ] = "Óû§Ë÷Òý±êÌâ";
    Text[ russian ] = "Çàãîëîâîê ïîëüçîâàòåëüñêîãî óêàçàòåëÿ";
    Text[ polish ] = "Tytu³ indeksu u¿ytkownika";
    Text[ japanese ] = "Õ°»Þ°’è‹`‚̍õˆø Œ©o‚µ";
    Text[ chinese_traditional ] = "¦Û­q¥Ø¿ý¼ÐÃD";
    Text[ arabic ] = "ÚäæÇä ÝåÑÓ ÇáãÓÊÎÏã";
    Text[ greek ] = "Åðéêåöáëßäá åõñåôçñßïõ ÷ñçóôþí";
    Text[ korean ] = "»ç¿ëÀÚ »öÀÎ Á¦¸ñ";
    Text[ turkish ] = "Kullanýcý dizini baþlýðý";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_USER1
{
    Text = "Benutzerverzeichnis 1" ;
    Text [ English ] = "Level 1 user TOX" ;
    Text [ dutch ] = "Gebruikersindex 1" ;
    Text [ english_us ] = "User Index 1" ;
    Text [ italian ] = "Indice personalizzato 1" ;
    Text [ spanish ] = "Índice del usuario 1" ;
    Text [ french ] = "Index personnalisé 1" ;
    Text [ swedish ] = "Användarförteckning 1" ;
    Text [ danish ] = "Brugerindeks 1" ;
    Text [ portuguese ] = "Índice do utilizador 1" ;
    Text [ portuguese_brazilian ] = "Benutzerverzeichnis 1" ;
    Text[ chinese_simplified ] = "Óû§Ë÷Òý 1";
    Text[ russian ] = "Ïîëüçîâàòåëüñêèé óêàçàòåëü 1";
    Text[ polish ] = "Indeks u¿ytkownika 1";
    Text[ japanese ] = "Õ°»Þ°’è‹`‚̍õˆø 1";
    Text[ chinese_traditional ] = "¦Û­q¥Ø¿ý 1";
    Text[ arabic ] = "ÝåÑÓ ÇáãÓÊÎÏã 1";
    Text[ greek ] = "ÅõñåôÞñéï ÷ñçóôþí 1";
    Text[ korean ] = "»ç¿ëÀÚ »öÀÎ 1";
    Text[ turkish ] = "Kullanýcý dizini 1";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_USER2
{
    Text = "Benutzerverzeichnis 2" ;
    Text [ English ] = "Level 2 user TOX" ;
    Text [ english_us ] = "User Index 2" ;
    Text [ italian ] = "Indice personalizzato 2" ;
    Text [ spanish ] = "Índice del usuario 2" ;
    Text [ french ] = "Index personnalisé 2" ;
    Text [ dutch ] = "Gebruikersindex 2" ;
    Text [ swedish ] = "Användarförteckning 2" ;
    Text [ danish ] = "Brugerindeks 2" ;
    Text [ portuguese ] = "Índice do utilizador 2" ;
    Text [ portuguese_brazilian ] = "Benutzerverzeichnis 2" ;
    Text[ chinese_simplified ] = "Óû§Ë÷Òý 2";
    Text[ russian ] = "Ïîëüçîâàòåëüñêèé óêàçàòåëü 2";
    Text[ polish ] = "Indeks u¿ytkownika 2";
    Text[ japanese ] = "Õ°»Þ°’è‹`‚̍õˆø 2";
    Text[ chinese_traditional ] = "¦Û­q¥Ø¿ý 2";
    Text[ arabic ] = "ÝåÑÓ ÇáãÓÊÎÏã 2";
    Text[ greek ] = "ÅõñåôÞñéï ÷ñçóôþí 2";
    Text[ korean ] = "»ç¿ëÀÚ »öÀÎ 2";
    Text[ turkish ] = "Kullanýcý dizini 2";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_USER3
{
    Text = "Benutzerverzeichnis 3" ;
    Text [ English ] = "Level 3 user TOX" ;
    Text [ english_us ] = "User Index 3" ;
    Text [ italian ] = "Indice personalizzato 3" ;
    Text [ spanish ] = "Índice del usuario 3" ;
    Text [ french ] = "Index personnalisé 3" ;
    Text [ dutch ] = "Gebruikersindex 3" ;
    Text [ swedish ] = "Användarförteckning 3" ;
    Text [ danish ] = "Brugerindeks 3" ;
    Text [ portuguese ] = "Índice do utilizador 3" ;
    Text [ portuguese_brazilian ] = "Benutzerverzeichnis 3" ;
    Text[ chinese_simplified ] = "Óû§Ë÷Òý 3";
    Text[ russian ] = "Ïîëüçîâàòåëüñêèé óêàçàòåëü 3";
    Text[ polish ] = "Indeks u¿ytkownika 3";
    Text[ japanese ] = "Õ°»Þ°’è‹`‚̍õˆø 3";
    Text[ chinese_traditional ] = "¦Û­q¥Ø¿ý 3";
    Text[ arabic ] = "ÝåÑÓ ÇáãÓÊÎÏã 3";
    Text[ greek ] = "ÅõñåôÞñéï ÷ñçóôþí 3";
    Text[ korean ] = "»ç¿ëÀÚ »öÀÎ 3";
    Text[ turkish ] = "Kullanýcý dizini 3";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_USER4
{
    Text = "Benutzerverzeichnis 4" ;
    Text [ English ] = "Level 4 user TOX" ;
    Text [ english_us ] = "User Index 4" ;
    Text [ italian ] = "Indice personalizzato 4" ;
    Text [ spanish ] = "Índice del usuario 4" ;
    Text [ french ] = "Index personnalisé 4" ;
    Text [ dutch ] = "Gebruikersindex 4" ;
    Text [ swedish ] = "Användarförteckning 4" ;
    Text [ danish ] = "Brugerindeks 4" ;
    Text [ portuguese ] = "Índice do utilizador 4" ;
    Text [ portuguese_brazilian ] = "Benutzerverzeichnis 4" ;
    Text[ chinese_simplified ] = "Óû§Ë÷Òý 4";
    Text[ russian ] = "Ïîëüçîâàòåëüñêèé óêàçàòåëü 4";
    Text[ polish ] = "Indeks u¿ytkownika 4";
    Text[ japanese ] = "Õ°»Þ°’è‹`‚̍õˆø 4";
    Text[ chinese_traditional ] = "¦Û­q¥Ø¿ý 4";
    Text[ arabic ] = "ÝåÑÓ ÇáãÓÊÎÏã 4";
    Text[ greek ] = "ÅõñåôÞñéï ÷ñçóôþí 4";
    Text[ korean ] = "»ç¿ëÀÚ »öÀÎ 4";
    Text[ turkish ] = "Kullanýcý dizini 4";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_USER5
{
    Text = "Benutzerverzeichnis 5" ;
    Text [ English ] = "Level 5 user TOX" ;
    Text [ english_us ] = "User Index 5" ;
    Text [ italian ] = "Indice personalizzato 5" ;
    Text [ spanish ] = "Índice del usuario 5" ;
    Text [ french ] = "Index personnalisé 5" ;
    Text [ dutch ] = "Gebruikersindex 5" ;
    Text [ swedish ] = "Användarförteckning 5" ;
    Text [ danish ] = "Brugerindeks 5" ;
    Text [ portuguese ] = "Índice do utilizador 5" ;
    Text [ portuguese_brazilian ] = "Benutzerverzeichnis 5" ;
    Text[ chinese_simplified ] = "Óû§Ë÷Òý 5";
    Text[ russian ] = "Ïîëüçîâàòåëüñêèé óêàçàòåëü 5";
    Text[ polish ] = "Indeks u¿ytkownika 5";
    Text[ japanese ] = "Õ°»Þ°’è‹`‚̍õˆø 5";
    Text[ chinese_traditional ] = "¦Û­q¥Ø¿ý 5";
    Text[ arabic ] = "ÝåÑÓ ÇáãÓÊÎÏã 5";
    Text[ greek ] = "ÅõñåôÞñéï ÷ñçóôþí 5";
    Text[ korean ] = "»ç¿ëÀÚ »öÀÎ 5";
    Text[ turkish ] = "Kullanýcý dizini 5";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_USER6
{
    Text = "Benutzerverzeichnis 6" ;
    Text [ English ] = "Level 6 user TOX" ;
    Text [ dutch ] = "Gebruikersindex 6" ;
    Text [ english_us ] = "User Index 6" ;
    Text [ italian ] = "Indice personalizzato 6" ;
    Text [ spanish ] = "Índice del usuario 6" ;
    Text [ french ] = "Index personnalisé 6" ;
    Text [ swedish ] = "Användarförteckning 6" ;
    Text [ danish ] = "Brugerindeks 6" ;
    Text [ portuguese ] = "Índice personalizado 6" ;
    Text [ portuguese_brazilian ] = "Benutzerverzeichnis 6" ;
    Text[ russian ] = "Ïîëüçîâàòåëüñêèé óêàçàòåëü 6";
    Text[ polish ] = "Indeks u¿ytkownika 6";
    Text[ japanese ] = "Õ°»Þ°’è‹`‚̍õˆø 6";
    Text[ arabic ] = "ÝåÑÓ ÇáãÓÊÎÏã 6";
    Text[ greek ] = "ÅõñåôÞñéï ÷ñçóôþí 6";
    Text[ korean ] = "»ç¿ëÀÚ »öÀÎ 6";
    Text[ chinese_simplified ] = "Óû§Ä¿Â¼ 6";
    Text[ chinese_traditional ] = "¦Û­q¥Ø¿ý 6";
    Text[ turkish ] = "Kullanýcý dizini 6";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_USER7
{
    Text = "Benutzerverzeichnis 7" ;
    Text [ English ] = "Level 7 user TOX" ;
    Text [ english_us ] = "User Index 7" ;
    Text [ italian ] = "Indice personalizzato 7" ;
    Text [ spanish ] = "Índice del usuario 7" ;
    Text [ french ] = "Index personnalisé 7" ;
    Text [ dutch ] = "Gebruikersindex 7" ;
    Text [ swedish ] = "Användarförteckning 7" ;
    Text [ danish ] = "Brugerindeks 7" ;
    Text [ portuguese ] = "Índice personalizado 7" ;
    Text [ portuguese_brazilian ] = "Benutzerverzeichnis 7" ;
    Text[ russian ] = "Ïîëüçîâàòåëüñêèé óêàçàòåëü 7";
    Text[ polish ] = "Indeks u¿ytkownika 7";
    Text[ japanese ] = "Õ°»Þ°’è‹`‚̍õˆø 7";
    Text[ arabic ] = "ÝåÑÓ ÇáãÓÊÎÏã 7";
    Text[ greek ] = "ÅõñåôÞñéï ÷ñçóôþí 7";
    Text[ korean ] = "»ç¿ëÀÚ »öÀÎ 7";
    Text[ chinese_simplified ] = "Óû§Ä¿Â¼ 7";
    Text[ chinese_traditional ] = "¦Û­q¥Ø¿ý 7";
    Text[ turkish ] = "Kullanýcý dizini 7";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_USER8
{
    Text = "Benutzerverzeichnis 8" ;
    Text [ English ] = "Level 8 user TOX" ;
    Text [ english_us ] = "User Index 8" ;
    Text [ italian ] = "Indice personalizzato 8" ;
    Text [ spanish ] = "Índice del usuario 8" ;
    Text [ french ] = "Index personnalisé 8" ;
    Text [ dutch ] = "Gebruikersindex 8" ;
    Text [ swedish ] = "Användarförteckning 8" ;
    Text [ danish ] = "Brugerindeks 8" ;
    Text [ portuguese ] = "Índice personalizado 8" ;
    Text [ portuguese_brazilian ] = "Benutzerverzeichnis 8" ;
    Text[ russian ] = "Ïîëüçîâàòåëüñêèé óêàçàòåëü 8";
    Text[ polish ] = "Indeks u¿ytkownika 8";
    Text[ japanese ] = "Õ°»Þ°’è‹`‚̍õˆø 8";
    Text[ arabic ] = "ÝåÑÓ ÇáãÓÊÎÏã 8";
    Text[ greek ] = "ÅõñåôÞñéï ÷ñçóôþí 8";
    Text[ korean ] = "»ç¿ëÀÚ »öÀÎ 8";
    Text[ chinese_simplified ] = "Óû§Ä¿Â¼ 8";
    Text[ chinese_traditional ] = "¦Û­q¥Ø¿ý 8";
    Text[ turkish ] = "Kullanýcý dizini 8";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_USER9
{
    Text = "Benutzerverzeichnis 9" ;
    Text [ English ] = "Level 9 user TOX" ;
    Text [ english_us ] = "User Index 9" ;
    Text [ italian ] = "Indice personalizzato 9" ;
    Text [ spanish ] = "Índice del usuario 9" ;
    Text [ french ] = "Index personnalisé 9" ;
    Text [ dutch ] = "Gebruikersindex 9" ;
    Text [ swedish ] = "Användarförteckning 9" ;
    Text [ danish ] = "Brugerindeks 9" ;
    Text [ portuguese ] = "Índice personalizado 9" ;
    Text [ portuguese_brazilian ] = "Benutzerverzeichnis 9" ;
    Text[ russian ] = "Ïîëüçîâàòåëüñêèé óêàçàòåëü 9";
    Text[ polish ] = "Indeks u¿ytkownika 9";
    Text[ japanese ] = "Õ°»Þ°’è‹`‚̍õˆø 9";
    Text[ arabic ] = "ÝåÑÓ ÇáãÓÊÎÏã 9";
    Text[ greek ] = "ÅõñåôÞñéï ÷ñçóôþí 9";
    Text[ korean ] = "»ç¿ëÀÚ »öÀÎ 9";
    Text[ chinese_simplified ] = "Óû§Ä¿Â¼ 9";
    Text[ chinese_traditional ] = "¦Û­q¥Ø¿ý 9";
    Text[ turkish ] = "Kullanýcý dizini 9";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_USER10
{
    Text = "Benutzerverzeichnis 10" ;
    Text [ English ] = "Level 10 user TOX" ;
    Text [ english_us ] = "User Index 10" ;
    Text [ italian ] = "Indice personalizzato 10" ;
    Text [ spanish ] = "Índice del usuario 10" ;
    Text [ french ] = "Index personnalisé 10" ;
    Text [ dutch ] = "Gebruikersindex 10" ;
    Text [ swedish ] = "Användarförteckning 10" ;
    Text [ danish ] = "Brugerindeks 10" ;
    Text [ portuguese ] = "Índice personalizado 10" ;
    Text [ portuguese_brazilian ] = "Benutzerverzeichnis 10" ;
    Text[ russian ] = "Ïîëüçîâàòåëüñêèé óêàçàòåëü 10";
    Text[ polish ] = "Indeks u¿ytkownika 10";
    Text[ japanese ] = "Õ°»Þ°’è‹`‚̍õˆø 10";
    Text[ arabic ] = "ÝåÑÓ ÇáãÓÊÎÏã 10";
    Text[ greek ] = "ÅõñåôÞñéï ÷ñçóôþí 10";
    Text[ korean ] = "»ç¿ëÀÚ »öÀÎ 10";
    Text[ chinese_simplified ] = "Óû§Ä¿Â¼ 10";
    Text[ chinese_traditional ] = "¦Û­q¥Ø¿ý 10";
    Text[ turkish ] = "Kullanýcý dizini 10";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_ILLUSH
{
    Text = "Abbildungsverzeichnis Überschrift" ;
    Text [ English ] = "Illustration index heading" ;
    Text[ english_us ] = "Illustration Index Heading";
    Text[ portuguese ] = "Título - Índice de ilustrações";
    Text[ russian ] = "Ñïèñîê ðèñóíêîâ: çàãîëîâîê";
    Text[ greek ] = "Åðéêåöáëßäá êáôáëüãïõ åéêüíùí";
    Text[ dutch ] = "Opschrift afbeeldingenregister";
    Text[ french ] = "Titre de l'index des illustrations";
    Text[ spanish ] = "Encabezado Índice de ilustraciones";
    Text[ italian ] = "Intestazione indice illustrazioni";
    Text[ danish ] = "Figuroversigt overskrift";
    Text[ swedish ] = "Illustrationsförteckning överskrift";
    Text[ polish ] = "Indeks ilustracji Tytu³";
    Text[ portuguese_brazilian ] = "Illustration index heading";
    Text[ japanese ] = "²×½ÄõˆøŒ©o‚µ";
    Text[ korean ] = "»ðÈ­ »öÀÎ Á¦¸ñ";
    Text[ chinese_simplified ] = "²åͼĿ¼±êÌâ";
    Text[ chinese_traditional ] = "´¡¹Ï¥Ø¿ý¼ÐÃD";
    Text[ arabic ] = "ÚäæÇä ÝåÑÓ ÇáÕæÑ ÇáÅíÖÇÍíÉ";
    Text[ turkish ] = "Resim dizini baþlýðý";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_ILLUS1
{
    Text = "Abbildungsverzeichnis 1" ;
    Text [ English ] = "Illustration index 1" ;
    Text[ english_us ] = "Illustration Index 1";
    Text[ portuguese ] = "Índice de ilustrações 1";
    Text[ russian ] = "Ñïèñîê ðèñóíêîâ 1";
    Text[ greek ] = "ÊáôÜëïãïò åéêüíùí 1";
    Text[ dutch ] = "Afbeeldingenregister 1";
    Text[ french ] = "Index des illustrations 1";
    Text[ spanish ] = "Índice de ilustraciones 1";
    Text[ italian ] = "Indice delle illustrazioni 1";
    Text[ danish ] = "Figuroversigt 1";
    Text[ swedish ] = "Illustrationsförteckning 1";
    Text[ polish ] = "Indeks ilustracji 1";
    Text[ portuguese_brazilian ] = "Illustration index 1";
    Text[ japanese ] = "²×½Äõˆø 1";
    Text[ korean ] = "»ðÈ­ »öÀÎ 1";
    Text[ chinese_simplified ] = "²åͼĿ¼ 1";
    Text[ chinese_traditional ] = "´¡¹Ï¥Ø¿ý 1";
    Text[ arabic ] = "ÝåÑÓ ÇáÕæÑ ÇáÅíÖÇÍíÉ 1";
    Text[ turkish ] = "Resim dizini 1";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_OBJECTH
{
    Text = "Objektverzeichnis Überschrift";
    Text [ English ] = "Object index heading" ;
    Text[ english_us ] = "Object index heading";
    Text[ portuguese ] = "Título - Índice de objectos";
    Text[ russian ] = "Ñïèñîê îáúåêòîâ: çàãîëîâîê";
    Text[ greek ] = "Åðéêåöáëßäá êáôáëüãïõ áíôéêåéìÝíùí";
    Text[ dutch ] = "Opschrift objectenregister";
    Text[ french ] = "Titre d'index d'objets";
    Text[ spanish ] = "Encabezado índice de objetos";
    Text[ italian ] = "Intestazione indice degli oggetti";
    Text[ danish ] = "Objektindeks overskrift";
    Text[ swedish ] = "Objektförteckning överskrift";
    Text[ polish ] = "Indeks obiektów Tytu³";
    Text[ portuguese_brazilian ] = "Object index heading";
    Text[ japanese ] = "µÌÞ¼Þª¸ÄõˆøŒ©o‚µ";
    Text[ korean ] = "°³Ã¼ »öÀÎ Á¦¸ñ";
    Text[ chinese_simplified ] = "¶ÔÏóĿ¼±êÌâ";
    Text[ chinese_traditional ] = "ª«¥ó¥Ø¿ý¼ÐÃD";
    Text[ arabic ] = "ÚäæÇä ÝåÑÓ ÇáßÇÆäÇÊ";
    Text[ turkish ] = "Nesne dizini baþlýðý";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_OBJECT1
{
    Text = "Objektverzeichnis 1" ;
    Text [ English ] = "Object index 1" ;
    Text[ english_us ] = "Object index 1";
    Text[ portuguese ] = "Índice de objectos 1";
    Text[ russian ] = "Ñïèñîê îáúåêòîâ 1";
    Text[ greek ] = "ÊáôÜëïãïò áíôéêåéìÝíùí 1";
    Text[ dutch ] = "Objectenregister 1";
    Text[ french ] = "Index d'objet 1";
    Text[ spanish ] = "Índice de objetos 1";
    Text[ italian ] = "Indice degli oggetti 1";
    Text[ danish ] = "Objektindeks 1";
    Text[ swedish ] = "Objektförteckning 1";
    Text[ polish ] = "Indeks obiektów 1";
    Text[ portuguese_brazilian ] = "Object index 1";
    Text[ japanese ] = "µÌÞ¼Þª¸Äõˆø 1";
    Text[ korean ] = "°³Ã¼ »öÀÎ 1";
    Text[ chinese_simplified ] = "¶ÔÏóĿ¼ 1";
    Text[ chinese_traditional ] = "ª«¥ó¥Ø¿ý 1";
    Text[ arabic ] = "ÝåÑÓ ÇáßÇÆäÇÊ 1";
    Text[ turkish ] = "Nesne dizini 1";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_TABLESH
{
    Text = "Tabellenverzeichnis Überschrift" ;
    Text [ English ] = "Table index heading" ;
    Text[ english_us ] = "Table index heading";
    Text[ portuguese ] = "Título - Índice de tabelas";
    Text[ russian ] = "Ñïèñîê òàáëèö: çàãîëîâîê";
    Text[ greek ] = "Åðéêåöáëßäá åõñåôÞñéï ðßíáêá";
    Text[ dutch ] = "Opschrift tabellenregister";
    Text[ french ] = "Titre d'index de tables";
    Text[ spanish ] = "Encabezado índice de tablas";
    Text[ italian ] = "Intestazione indice tabella";
    Text[ danish ] = "Tabeloversigt overskrift";
    Text[ swedish ] = "Tabellförteckning överskrift";
    Text[ polish ] = "Indeks tabeli Tytu³";
    Text[ portuguese_brazilian ] = "Table index heading";
    Text[ japanese ] = "•\\õˆøŒ©o‚µ";
    Text[ korean ] = "Ç¥»öÀÎ Á¦¸ñ";
    Text[ chinese_simplified ] = "±í¸ñĿ¼±êÌâ";
    Text[ chinese_traditional ] = "ªí®æ¥Ø¿ý¼ÐÃD";
    Text[ arabic ] = "ÚäæÇä ÝåÑÓ ÇáÌÏæá";
    Text[ turkish ] = "Tablo dizini baþlýðý";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_TABLES1
{
    Text = "Tabellenverzeichnis 1" ;
    Text [ English ] = "Table index 1" ;
    Text[ english_us ] = "Table index 1";
    Text[ portuguese ] = "Índice de tabelas 1";
    Text[ russian ] = "Ñïèñîê òàáëèö 1";
    Text[ greek ] = "Ðåñéå÷üìåíá ðßíáêá 1";
    Text[ dutch ] = "Tabellenregister 1";
    Text[ french ] = "Index de tables 1";
    Text[ spanish ] = "Índice de tablas 1";
    Text[ italian ] = "Indice tabella 1";
    Text[ danish ] = "Tabeloversigt 1";
    Text[ swedish ] = "Tabellförteckning 1";
    Text[ polish ] = "Indeks tabeli 1";
    Text[ portuguese_brazilian ] = "Table index 1";
    Text[ japanese ] = "•\\õˆø 1";
    Text[ korean ] = "Ç¥ »öÀÎ 1";
    Text[ chinese_simplified ] = "±í¸ñĿ¼ 1";
    Text[ chinese_traditional ] = "ªí®æ¥Ø¿ý 1";
    Text[ arabic ] = "ÝåÑÓ ÌÏæá 1";
    Text[ turkish ] = "Tablo dizini 1";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_AUTHORITIESH
{
    Text = "Literaturverzeichnis Überschrift" ;
    Text [ English ] = "Index of authorities heading" ;
    Text[ english_us ] = "Bibliography Heading";
    Text[ portuguese ] = "Título - Bibliografia";
    Text[ russian ] = "Ñïèñîê ëèòåðàòóðû: çàãîëîâîê";
    Text[ greek ] = "Åðéêåöáëßäá âéâëéïãñáößáò";
    Text[ dutch ] = "Opschrift literatuurlijst";
    Text[ french ] = "Titre de bibliographie";
    Text[ spanish ] = "Encabezado Bibliografía";
    Text[ italian ] = "Intestazione bibliografia";
    Text[ danish ] = "Litteraturliste overskrift";
    Text[ swedish ] = "Litteraturförteckning överskrift";
    Text[ polish ] = "Spis literatury Tytu³";
    Text[ portuguese_brazilian ] = "Index of authorities heading";
    Text[ japanese ] = "ŽQl•¶Œ£•\\Œ©o‚µ";
    Text[ korean ] = "Âü°í¹®Çå ¸Ó¸®±Û";
    Text[ chinese_simplified ] = "ÎÄÏ×Ŀ¼±êÌâ";
    Text[ chinese_traditional ] = "¤åÄm¥Ø¿ý¼ÐÃD";
    Text[ arabic ] = "ÚäæÇä ÝåÑÓ ÇáãÑÇÌÚ";
    Text[ turkish ] = "Kaynakça dizini baþlýðý";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_TOX_AUTHORITIES1
{
    Text = "Literaturverzeichnis 1" ;
    Text [ English ] = "Index of authorities 1" ;
    Text[ english_us ] = "Bibliography 1";
    Text[ portuguese ] = "Bibliografia 1";
    Text[ russian ] = "Ñïèñîê ëèòåðàòóðû 1";
    Text[ greek ] = "Âéâëéïãñáößá 1";
    Text[ dutch ] = "Literatuurlijst 1";
    Text[ french ] = "Bibliographie 1";
    Text[ spanish ] = "Bibliografía 1";
    Text[ italian ] = "Bibliografia 1";
    Text[ danish ] = "Litteraturliste 1";
    Text[ swedish ] = "Litteraturförteckning 1";
    Text[ polish ] = "Spis literatury 1";
    Text[ portuguese_brazilian ] = "Index of authorities 1";
    Text[ japanese ] = "ŽQl•¶Œ£•\\ 1";
    Text[ korean ] = "Âü°í¹®Çå 1";
    Text[ chinese_simplified ] = "ÎÄÏ×Ŀ¼ 1";
    Text[ chinese_traditional ] = "¤åÄm¥Ø¿ý 1";
    Text[ arabic ] = "ÝåÑÓ ÇáãÑÇÌÚ 1";
    Text[ turkish ] = "Kaynakça dizini 1";
    Text[ language_user1 ] = " ";
};

String STR_POOLCOLL_DOC_TITEL
{
    Text = "Titel" ;
    Text [ English ] = "Title" ;
    Text [ dutch ] = "Titel" ;
    Text [ english_us ] = "Title" ;
    Text [ italian ] = "Titolo" ;
    Text [ spanish ] = "Título" ;
    Text [ french ] = "Titre principal" ;
    Text [ swedish ] = "Rubrik" ;
    Text [ danish ] = "Titel" ;
    Text [ portuguese ] = "Título principal" ;
    Text [ portuguese_brazilian ] = "Titel" ;
    Text[ chinese_simplified ] = "±êÌâ";
    Text[ russian ] = "Çàãîëîâîê";
    Text[ polish ] = "Tytu³";
    Text[ japanese ] = "•\\‘è";
    Text[ chinese_traditional ] = "¼ÐÃD";
    Text[ arabic ] = "ÇáÚäæÇä";
    Text[ greek ] = "Ôßôëïò";
    Text[ korean ] = "Á¦¸ñ";
    Text[ turkish ] = "Baþlýk";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_DOC_SUBTITEL
{
    Text = "Untertitel" ;
    Text [ English ] = "Subtitle" ;
    Text [ dutch ] = "Subtitel" ;
    Text [ english_us ] = "Subtitle" ;
    Text [ italian ] = "Sottotitolo" ;
    Text [ spanish ] = "Subtítulo" ;
    Text [ french ] = "Sous-titre" ;
    Text [ swedish ] = "Underrubrik" ;
    Text [ danish ] = "Undertitel" ;
    Text [ portuguese ] = "Subtítulo" ;
    Text [ portuguese_brazilian ] = "Untertitel" ;
    Text[ chinese_simplified ] = "·Ö±êÌâ";
    Text[ russian ] = "Ïîäçàãîëîâîê";
    Text[ polish ] = "Podtytu³";
    Text[ japanese ] = "•›‘è";
    Text[ chinese_traditional ] = "¤À¼ÐÃD";
    Text[ arabic ] = "ÇáÚäæÇä ÇáÝÑÚí";
    Text[ greek ] = "Õðüôéôëïò";
    Text[ korean ] = "ºÎÁ¦";
    Text[ turkish ] = "Alt baþlýk";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_HTML_BLOCKQUOTE
{
    Text = "Zitat" ;
    Text [ English ] = "Citation" ;
    Text [ dutch ] = "Citaat" ;
    Text [ english_us ] = "Quotations" ;
    Text [ swedish ] = "Citat" ;
    Text [ danish ] = "Citat" ;
    Text [ italian ] = "Citazione" ;
    Text [ spanish ] = "Cita" ;
    Text [ french ] = "Citation" ;
    Text [ portuguese ] = "Citação" ;
    Text [ portuguese_brazilian ] = "Zitat" ;
    Text[ chinese_simplified ] = "ÒýÓÃÎÄ";
    Text[ russian ] = "Öèòàòà";
    Text[ polish ] = "Cytat";
    Text[ japanese ] = "ˆø—p";
    Text[ chinese_traditional ] = "¤Þ¤å";
    Text[ arabic ] = "ÇÓÊÔåÇÏ ÈÞæá";
    Text[ greek ] = "Míçìüíåõóç";
    Text[ korean ] = "Àοë";
    Text[ turkish ] = "Alýntý";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_HTML_PRE
{
    Text = "Vorformatierter Text" ;
    Text [ English ] = "Preformated Text" ;
    Text [ dutch ] = "Reeds opgemaakte tekst" ;
    Text [ english_us ] = "Preformatted Text" ;
    Text [ swedish ] = "Förformaterad text" ;
    Text [ danish ] = "Forudformateret tekst" ;
    Text [ italian ] = "Testo preformattato" ;
    Text [ spanish ] = "Texto preformateado" ;
    Text [ french ] = "Texte préformaté" ;
    Text [ portuguese ] = "Texto preformatado" ;
    Text [ portuguese_brazilian ] = "Vorformatierter Text" ;
    Text[ chinese_simplified ] = "Ô¤¸ñʽ»¯µÄÕýÎÄ";
    Text[ russian ] = "Òåêñò â çàäàííîì ôîðìàòå";
    Text[ polish ] = "Tekst niesformatowany";
    Text[ japanese ] = "‘Ž®Ý’è‘O‚Ì÷½Ä";
    Text[ chinese_traditional ] = "¹w®æ¦¡¤Æªº¤º¤å";
    Text[ arabic ] = "äÕ ãäÓÞ ãÓÈÞÇð";
    Text[ greek ] = "ÐñïìïñöïðïéçìÝíï êåßìåíï";
    Text[ korean ] = "¼­½ÄÈ­µÈ ÅØ½ºÆ®";
    Text[ turkish ] = "Önceden formatlanmýþ metin";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_HTML_HR
{
    Text = "Horizontale Linie" ;
    Text [ English ] = "Horizontal Line" ;
    Text [ dutch ] = "Horizontale lijn" ;
    Text [ english_us ] = "Horizontal Line" ;
    Text [ swedish ] = "Horisontell linje" ;
    Text [ danish ] = "Vandret linje" ;
    Text [ italian ] = "Linea orizzontale" ;
    Text [ spanish ] = "Línea horizontal" ;
    Text [ french ] = "Ligne horizontale" ;
    Text [ portuguese ] = "Linha horizontal" ;
    Text [ portuguese_brazilian ] = "Horizontale Linie" ;
    Text[ chinese_simplified ] = "ˮƽÏßÌõ";
    Text[ russian ] = "Ãîðèçîíòàëüíàÿ ëèíèÿ";
    Text[ polish ] = "Linia pozioma";
    Text[ japanese ] = "‰¡ü";
    Text[ chinese_traditional ] = "¤ô¥­½u±ø";
    Text[ arabic ] = "ÎØ ÃÝÞí";
    Text[ greek ] = "Ïñéæüíôéá ãñáììÞ";
    Text[ korean ] = "¼öÆò ÁÙ";
    Text[ turkish ] = "Yatay çizgi";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_HTML_DD
{
    Text = "Listeninhalt" ;
    Text [ English ] = "Definition Data" ;
    Text [ dutch ] = "Lijstinhoud" ;
    Text [ english_us ] = "List Contents" ;
    Text [ swedish ] = "Listinnehåll" ;
    Text [ danish ] = "Listeindhold" ;
    Text [ italian ] = "Contenuto elenco" ;
    Text [ spanish ] = "Contenido de lista" ;
    Text [ french ] = "Contenu de liste" ;
    Text [ portuguese ] = "Conteúdo da lista" ;
    Text [ portuguese_brazilian ] = "Listeninhalt" ;
    Text[ chinese_simplified ] = "ÁбíÄÚÈÝ";
    Text[ russian ] = "Ñïèñîê ñîäåðæàíèÿ";
    Text[ polish ] = "TreϾ listy";
    Text[ japanese ] = "ؽĂ̓à—e";
    Text[ chinese_traditional ] = "²M³æ¤º®e";
    Text[ arabic ] = "ãÍÊæíÇÊ ÇáÞÇÆãÉ";
    Text[ greek ] = "Ðåñéå÷üìåíï ëßóôáò";
    Text[ korean ] = "¸®½ºÆ® ³»¿ë";
    Text[ turkish ] = "Liste içeriði";
    Text[ language_user1 ] = " ";
};
String STR_POOLCOLL_HTML_DT
{
    Text = "Listenkopf" ;
    Text [ English ] = "Definition Term" ;
    Text [ dutch ] = "Lijsttitel" ;
    Text [ english_us ] = "List Heading" ;
    Text [ swedish ] = "Listhuvud" ;
    Text [ danish ] = "Listehoved" ;
    Text [ italian ] = "Intestazione elenco" ;
    Text [ spanish ] = "Encabezamiento de lista" ;
    Text [ french ] = "En-tête de liste" ;
    Text [ portuguese ] = "Cabeçalho da lista" ;
    Text [ portuguese_brazilian ] = "Listenkopf" ;
    Text[ chinese_simplified ] = "Áбí±êÌâ";
    Text[ russian ] = "Çàãîëîâîê ñïèñêà";
    Text[ polish ] = "Nag³ówek listy";
    Text[ japanese ] = "ؽĂ̌©o‚µ";
    Text[ language_user1 ] = " ";
    Text[ chinese_traditional ] = "²M³æ¼ÐÃD";
    Text[ arabic ] = "ÚäæÇä ÇáÞÇÆãÉ";
    Text[ greek ] = "Êåöáëßäá êáôáëüãïõ";
    Text[ korean ] = "¸®½ºÆ® Á¦¸ñ";
    Text[ turkish ] = "Liste baþlýðý";
};
//programmatic para style names
String STR_POCO_PRGM_STANDARD
{
    Text  = "Standard" ;
};
String STR_POCO_PRGM_TEXT
{
    Text  = "Text body" ;
};
String STR_POCO_PRGM_TEXT_IDENT
{
    Text  = "First line indent" ;
};
String STR_POCO_PRGM_TEXT_NEGIDENT
{
    Text  = "Hanging indent" ;
};
String STR_POCO_PRGM_TEXT_MOVE
{
    Text  = "Text body indent" ;
};
String STR_POCO_PRGM_GREETING
{
    Text  = "Salutation" ;
};
String STR_POCO_PRGM_SIGNATURE
{
    Text  = "Signature" ;
};
String STR_POCO_PRGM_HEADLINE_BASE
{
    Text  = "Heading" ;
};
String STR_POCO_PRGM_NUMBUL_BASE
{
    Text  = "List" ;
};
String STR_POCO_PRGM_REGISTER_BASE
{
    Text  = "Index" ;
};
String STR_POCO_PRGM_CONFRONTATION
{
    Text  = "List Indent" ;
};
String STR_POCO_PRGM_MARGINAL
{
    Text  = "Marginalia" ;
};
String STR_POCO_PRGM_HEADLINE1
{
    Text  = "Heading 1" ;
};
String STR_POCO_PRGM_HEADLINE2
{
    Text  = "Heading 2" ;
};
String STR_POCO_PRGM_HEADLINE3
{
    Text  = "Heading 3" ;
};
String STR_POCO_PRGM_HEADLINE4
{
    Text  = "Heading 4" ;
};
String STR_POCO_PRGM_HEADLINE5
{
    Text  = "Heading 5" ;
};
String STR_POCO_PRGM_HEADLINE6
{
    Text  = "Heading 6" ;
};
String STR_POCO_PRGM_HEADLINE7
{
    Text  = "Heading 7" ;
};
String STR_POCO_PRGM_HEADLINE8
{
    Text  = "Heading 8" ;
};
String STR_POCO_PRGM_HEADLINE9
{
    Text  = "Heading 9" ;
};
String STR_POCO_PRGM_HEADLINE10
{
    Text  = "Heading 10" ;
};
String STR_POCO_PRGM_NUM_LEVEL1S
{
    Text  = "Numbering 1 Start" ;
};
String STR_POCO_PRGM_NUM_LEVEL1
{
    Text  = "Numbering 1" ;
};
String STR_POCO_PRGM_NUM_LEVEL1E
{
    Text  = "Numbering 1 End" ;
};
String STR_POCO_PRGM_NUM_NONUM1
{
    Text  = "Numbering 1 Cont." ;
};
String STR_POCO_PRGM_NUM_LEVEL2S
{
    Text  = "Numbering 2 Start" ;
};
String STR_POCO_PRGM_NUM_LEVEL2
{
    Text  = "Numbering 2" ;
};
String STR_POCO_PRGM_NUM_LEVEL2E
{
    Text  = "Numbering 2 End" ;
};
String STR_POCO_PRGM_NUM_NONUM2
{
    Text  = "Numbering 2 Cont." ;
};
String STR_POCO_PRGM_NUM_LEVEL3S
{
    Text  = "Numbering 3 Start" ;
};
String STR_POCO_PRGM_NUM_LEVEL3
{
    Text  = "Numbering 3" ;
};
String STR_POCO_PRGM_NUM_LEVEL3E
{
    Text  = "Numbering 3 End" ;
};
String STR_POCO_PRGM_NUM_NONUM3
{
    Text  = "Numbering 3 Cont." ;
};
String STR_POCO_PRGM_NUM_LEVEL4S
{
    Text  = "Numbering 4 Start" ;
};
String STR_POCO_PRGM_NUM_LEVEL4
{
    Text  = "Numbering 4" ;
};
String STR_POCO_PRGM_NUM_LEVEL4E
{
    Text  = "Numbering 4 End" ;
};
String STR_POCO_PRGM_NUM_NONUM4
{
    Text  = "Numbering 4 Cont." ;
};
String STR_POCO_PRGM_NUM_LEVEL5S
{
    Text  = "Numbering 5 Start" ;
};
String STR_POCO_PRGM_NUM_LEVEL5
{
    Text  = "Numbering 5" ;
};
String STR_POCO_PRGM_NUM_LEVEL5E
{
    Text  = "Numbering 5 End" ;
};
String STR_POCO_PRGM_NUM_NONUM5
{
    Text  = "Numbering 5 Cont." ;
};
String STR_POCO_PRGM_BUL_LEVEL1S
{
    Text  = "List 1 Start" ;
};
String STR_POCO_PRGM_BUL_LEVEL1
{
    Text  = "List 1" ;
};
String STR_POCO_PRGM_BUL_LEVEL1E
{
    Text  = "List 1 End" ;
};
String STR_POCO_PRGM_BUL_NONUM1
{
    Text  = "List 1 Cont." ;
};
String STR_POCO_PRGM_BUL_LEVEL2S
{
    Text  = "List 2 Start" ;
};
String STR_POCO_PRGM_BUL_LEVEL2
{
    Text  = "List 2" ;
};
String STR_POCO_PRGM_BUL_LEVEL2E
{
    Text  = "List 2 End" ;
};
String STR_POCO_PRGM_BUL_NONUM2
{
    Text  = "List 2 Cont." ;
};
String STR_POCO_PRGM_BUL_LEVEL3S
{
    Text  = "List 3 Start" ;
};
String STR_POCO_PRGM_BUL_LEVEL3
{
    Text  = "List 3" ;
};
String STR_POCO_PRGM_BUL_LEVEL3E
{
    Text  = "List 3 End" ;
};
String STR_POCO_PRGM_BUL_NONUM3
{
    Text  = "List 3 Cont." ;
};
String STR_POCO_PRGM_BUL_LEVEL4S
{
    Text  = "List 4 Start" ;
};
String STR_POCO_PRGM_BUL_LEVEL4
{
    Text  = "List 4" ;
};
String STR_POCO_PRGM_BUL_LEVEL4E
{
    Text  = "List 4 End" ;
};
String STR_POCO_PRGM_BUL_NONUM4
{
    Text  = "List 4 Cont." ;
};
String STR_POCO_PRGM_BUL_LEVEL5S
{
    Text  = "List 5 Start" ;
};
String STR_POCO_PRGM_BUL_LEVEL5
{
    Text  = "List 5" ;
};
String STR_POCO_PRGM_BUL_LEVEL5E
{
    Text  = "List 5 End" ;
};
String STR_POCO_PRGM_BUL_NONUM5
{
    Text  = "List 5 Cont." ;
};
String STR_POCO_PRGM_HEADER
{
    Text  = "Header" ;
};
String STR_POCO_PRGM_HEADERL
{
    Text  = "Header left" ;
};
String STR_POCO_PRGM_HEADERR
{
    Text  = "Header right" ;
};
String STR_POCO_PRGM_FOOTER
{
    Text  = "Footer" ;
};
String STR_POCO_PRGM_FOOTERL
{
    Text  = "Footer left" ;
};
String STR_POCO_PRGM_FOOTERR
{
    Text  = "Footer right" ;
};
String STR_POCO_PRGM_TABLE
{
    Text  = "Table Contents" ;
};
String STR_POCO_PRGM_TABLE_HDLN
{
    Text  = "Table Heading" ;
};
String STR_POCO_PRGM_FRAME
{
    Text  = "Frame contents" ;
};
String STR_POCO_PRGM_FOOTNOTE
{
    Text  = "Footnote" ;
};
String STR_POCO_PRGM_ENDNOTE
{
    Text  = "Endnote" ;
};
String STR_POCO_PRGM_LABEL
{
    Text  = "Caption" ;
};
String STR_POCO_PRGM_LABEL_ABB
{
    Text  = "Illustration" ;
};
String STR_POCO_PRGM_LABEL_TABLE
{
    Text  = "Table" ;
};
String STR_POCO_PRGM_LABEL_FRAME
{
    Text  = "Text" ;
};
String STR_POCO_PRGM_LABEL_DRAWING
{
    Text = "Drawing";
};
String STR_POCO_PRGM_JAKETADRESS
{
    Text  = "Addressee" ;
};
String STR_POCO_PRGM_SENDADRESS
{
    Text  = "Sender" ;
};
String STR_POCO_PRGM_TOX_IDXH
{
    Text  = "Index Heading" ;
};
String STR_POCO_PRGM_TOX_IDX1
{
    Text  = "Index 1" ;
};
String STR_POCO_PRGM_TOX_IDX2
{
    Text  = "Index 2" ;
};
String STR_POCO_PRGM_TOX_IDX3
{
    Text  = "Index 3" ;
};
String STR_POCO_PRGM_TOX_IDXBREAK
{
    Text  = "Index Separator" ;
};
String STR_POCO_PRGM_TOX_CNTNTH
{
    Text  = "Contents Heading" ;
};
String STR_POCO_PRGM_TOX_CNTNT1
{
    Text  = "Contents 1" ;
};
String STR_POCO_PRGM_TOX_CNTNT2
{
    Text  = "Contents 2" ;
};
String STR_POCO_PRGM_TOX_CNTNT3
{
    Text  = "Contents 3" ;
};
String STR_POCO_PRGM_TOX_CNTNT4
{
    Text  = "Contents 4" ;
};
String STR_POCO_PRGM_TOX_CNTNT5
{
    Text  = "Contents 5" ;
};
String STR_POCO_PRGM_TOX_CNTNT6
{
    Text  = "Contents 6" ;
};
String STR_POCO_PRGM_TOX_CNTNT7
{
    Text  = "Contents 7" ;
};
String STR_POCO_PRGM_TOX_CNTNT8
{
    Text  = "Contents 8" ;
};
String STR_POCO_PRGM_TOX_CNTNT9
{
    Text  = "Contents 9" ;
};
String STR_POCO_PRGM_TOX_CNTNT10
{
    Text  = "Contents 10" ;
};
String STR_POCO_PRGM_TOX_USERH
{
    Text  = "User Index Heading" ;
};
String STR_POCO_PRGM_TOX_USER1
{
    Text  = "User Index 1" ;
};
String STR_POCO_PRGM_TOX_USER2
{
    Text  = "User Index 2" ;
};
String STR_POCO_PRGM_TOX_USER3
{
    Text  = "User Index 3" ;
};
String STR_POCO_PRGM_TOX_USER4
{
    Text  = "User Index 4" ;
};
String STR_POCO_PRGM_TOX_USER5
{
    Text  = "User Index 5" ;
};
String STR_POCO_PRGM_TOX_USER6
{
    Text  = "User Index 6" ;
};
String STR_POCO_PRGM_TOX_USER7
{
    Text  = "User Index 7" ;
};
String STR_POCO_PRGM_TOX_USER8
{
    Text  = "User Index 8" ;
};
String STR_POCO_PRGM_TOX_USER9
{
    Text  = "User Index 9" ;
};
String STR_POCO_PRGM_TOX_USER10
{
    Text  = "User Index 10" ;
};
String STR_POCO_PRGM_TOX_ILLUSH
{
    Text = "Illustration Index Heading";
};
String STR_POCO_PRGM_TOX_ILLUS1
{
    Text = "Illustration Index 1";
};
String STR_POCO_PRGM_TOX_OBJECTH
{
    Text = "Object index heading";
};
String STR_POCO_PRGM_TOX_OBJECT1
{
    Text = "Object index 1";
};
String STR_POCO_PRGM_TOX_TABLESH
{
    Text = "Table index heading";
};
String STR_POCO_PRGM_TOX_TABLES1
{
    Text = "Table index 1";
};
String STR_POCO_PRGM_TOX_AUTHORITIESH
{
    Text = "Bibliography Heading";
};
String STR_POCO_PRGM_TOX_AUTHORITIES1
{
    Text = "Bibliography 1";
};

String STR_POCO_PRGM_DOC_TITEL
{
    Text  = "Title" ;
};
String STR_POCO_PRGM_DOC_SUBTITEL
{
    Text  = "Subtitle" ;
};
String STR_POCO_PRGM_HTML_BLOCKQUOTE
{
    Text  = "Quotations" ;
};
String STR_POCO_PRGM_HTML_PRE
{
    Text  = "Preformatted Text" ;
};
String STR_POCO_PRGM_HTML_HR
{
    Text  = "Horizontal Line" ;
};
String STR_POCO_PRGM_HTML_DD
{
    Text  = "List Contents" ;
};
String STR_POCO_PRGM_HTML_DT
{
    Text  = "List Heading" ;
};

//page style names
String STR_POOLPAGE_STANDARD
{
    Text = "Standard" ;
    Text [ English ] = "Standard" ;
    Text [ dutch ] = "Standaard" ;
    Text [ english_us ] = "Standard" ;
    Text [ italian ] = "Standard" ;
    Text [ spanish ] = "Predeterminado" ;
    Text [ french ] = "Standard" ;
    Text [ swedish ] = "Standard" ;
    Text [ danish ] = "Standard" ;
    Text [ portuguese ] = "Padrão" ;
    Text [ portuguese_brazilian ] = "Standard" ;
    Text[ chinese_simplified ] = "±ê×¼";
    Text[ russian ] = "Ñòàíäàðò";
    Text[ polish ] = "Standard";
    Text[ japanese ] = "•W€";
    Text[ chinese_traditional ] = "¼Ð·Ç";
    Text[ arabic ] = "ÞíÇÓí";
    Text[ greek ] = "ÐñïåðéëïãÞ";
    Text[ korean ] = "Ç¥ÁØ";
    Text[ turkish ] = "Standart";
    Text[ language_user1 ] = " ";
};
String STR_POOLPAGE_FIRST
{
    Text = "Erste Seite" ;
    Text [ English ] = "First page" ;
    Text [ dutch ] = "Eerste pagina" ;
    Text [ english_us ] = "First Page" ;
    Text [ italian ] = "Prima pagina" ;
    Text [ spanish ] = "Primera página" ;
    Text [ french ] = "Première page" ;
    Text [ swedish ] = "Första sidan" ;
    Text [ danish ] = "Første side" ;
    Text [ portuguese ] = "Primeira página" ;
    Text [ portuguese_brazilian ] = "Erste Seite" ;
    Text[ chinese_simplified ] = "Ê×Ò³";
    Text[ russian ] = "Ïåðâàÿ ñòðàíèöà";
    Text[ polish ] = "Pierwsza strona";
    Text[ japanese ] = "Å‰‚ÌÍß°¼Þ";
    Text[ chinese_traditional ] = "­º­¶";
    Text[ arabic ] = "ÇáÕÝÍÉ ÇáÃæáì";
    Text[ greek ] = "Ðñþôç óåëßäá";
    Text[ korean ] = "ù¹øÂ° ÆäÀÌÁö";
    Text[ turkish ] = "Ýlk sayfa";
    Text[ language_user1 ] = " ";
};
String STR_POOLPAGE_LEFT
{
    Text = "Linke Seite" ;
    Text [ English ] = "Left page" ;
    Text [ english_us ] = "Left Page" ;
    Text [ italian ] = "Pagina sinistra" ;
    Text [ spanish ] = "Página izquierda" ;
    Text [ french ] = "Page gauche" ;
    Text [ dutch ] = "Linkerpagina" ;
    Text [ swedish ] = "Vänster sida" ;
    Text [ danish ] = "Venstre side" ;
    Text [ portuguese ] = "Página esquerda" ;
    Text [ portuguese_brazilian ] = "Linke Seite" ;
    Text[ chinese_simplified ] = "×óÒ³";
    Text[ russian ] = "Ëåâàÿ ñòðàíèöà";
    Text[ polish ] = "Strona nieparzysta";
    Text[ japanese ] = "¶Íß°¼Þ";
    Text[ chinese_traditional ] = "¥ª­¶";
    Text[ arabic ] = "ÇáÕÝÍÉ ÇáíÓÑì";
    Text[ greek ] = "ÁñéóôåñÞ óåëßäá";
    Text[ korean ] = "¿ÞÂÊ ÆäÀÌÁö";
    Text[ turkish ] = "Sol sayfa";
    Text[ language_user1 ] = " ";
};
String STR_POOLPAGE_RIGHT
{
    Text = "Rechte Seite" ;
    Text [ English ] = "Right page" ;
    Text [ english_us ] = "Right Page" ;
    Text [ italian ] = "Pagina destra" ;
    Text [ spanish ] = "Página derecha" ;
    Text [ french ] = "Page droite" ;
    Text [ dutch ] = "Rechterpagina" ;
    Text [ swedish ] = "Höger sida" ;
    Text [ danish ] = "Højre side" ;
    Text [ portuguese ] = "Página direita" ;
    Text [ portuguese_brazilian ] = "Rechte Seite" ;
    Text[ chinese_simplified ] = "ÓÒÒ³";
    Text[ russian ] = "Ïðàâàÿ ñòðàíèöà";
    Text[ polish ] = "Strona parzysta";
    Text[ japanese ] = "‰EÍß°¼Þ";
    Text[ chinese_traditional ] = "¥k­¶";
    Text[ arabic ] = "ÇáÕÝÍÉ Çáíãäì";
    Text[ greek ] = "ÄåîéÜ óåëßäá";
    Text[ korean ] = "¿À¸¥ÂÊ ÆäÀÌÁö";
    Text[ turkish ] = "Sað sayfa";
    Text[ language_user1 ] = " ";
};
String STR_POOLPAGE_JAKET
{
    Text = "Umschlag" ;
    Text [ English ] = "Envelope" ;
    Text [ dutch ] = "Envelop" ;
    Text [ english_us ] = "Envelope" ;
    Text [ italian ] = "Busta" ;
    Text [ spanish ] = "Sobre" ;
    Text [ french ] = "Enveloppe" ;
    Text [ swedish ] = "Kuvert" ;
    Text [ danish ] = "Konvolut" ;
    Text [ portuguese ] = "Envelope" ;
    Text [ portuguese_brazilian ] = "Umschlag" ;
    Text[ chinese_simplified ] = "ÐÅ·â";
    Text[ russian ] = "Êîíâåðò";
    Text[ polish ] = "Koperta";
    Text[ japanese ] = "••“›";
    Text[ chinese_traditional ] = "«H«Ê";
    Text[ arabic ] = "ÙÑÝ";
    Text[ greek ] = "ÖÜêåëïò";
    Text[ korean ] = "ºÀÅõ";
    Text[ turkish ] = "Zarf";
    Text[ language_user1 ] = " ";
};
String STR_POOLPAGE_REGISTER
{
    Text = "Verzeichnis" ;
    Text [ English ] = "Register" ;
    Text [ english_us ] = "Index" ;
    Text [ italian ] = "Indice" ;
    Text [ spanish ] = "Índice" ;
    Text [ french ] = "Index" ;
    Text [ dutch ] = "Index" ;
    Text [ swedish ] = "Förteckning" ;
    Text [ danish ] = "Indeks" ;
    Text [ portuguese ] = "Índice" ;
    Text [ portuguese_brazilian ] = "Verzeichnis" ;
    Text[ chinese_simplified ] = "Ŀ¼";
    Text[ russian ] = "Îãëàâëåíèå";
    Text[ polish ] = "Indeks";
    Text[ japanese ] = "õˆø";
    Text[ chinese_traditional ] = "¥Ø¿ý";
    Text[ arabic ] = "ÝåÑÓ";
    Text[ greek ] = "ÅõñåôÞñéï";
    Text[ korean ] = "»öÀÎ";
    Text[ turkish ] = "Dizin";
    Text[ language_user1 ] = " ";
};
String STR_POOLPAGE_HTML
{
    Text = "HTML" ;
    Text [ English ] = "HTML" ;
    Text [ dutch ] = "HTML" ;
    Text [ english_us ] = "HTML" ;
    Text [ italian ] = "HTML" ;
    Text [ spanish ] = "HTML" ;
    Text [ french ] = "HTML" ;
    Text [ swedish ] = "HTML" ;
    Text [ danish ] = "HTML" ;
    Text [ portuguese ] = "HTML" ;
    Text [ portuguese_brazilian ] = "HTML" ;
    Text[ chinese_simplified ] = "HTML";
    Text[ russian ] = "HTML";
    Text[ polish ] = "HTML";
    Text[ japanese ] = "HTML";
    Text[ chinese_traditional ] = "HTML";
    Text[ arabic ] = "HTML";
    Text[ greek ] = "HTML";
    Text[ korean ] = "HTML";
    Text[ turkish ] = "HTML";
    Text[ language_user1 ] = " ";
};
String STR_POOLPAGE_FOOTNOTE
{
    Text = "Fußnote" ;
    Text [ English ] = "Footnote" ;
    Text [ portuguese ] = "Nota de rodapé" ;
    Text [ english_us ] = "Footnote" ;
    Text [ portuguese_brazilian ] = "Fußnote" ;
    Text [ swedish ] = "Fotnot" ;
    Text [ danish ] = "Fodnote" ;
    Text [ italian ] = "Nota a piè pagina" ;
    Text [ spanish ] = "Nota al pie" ;
    Text [ french ] = "Note de bas de page" ;
    Text [ dutch ] = "Voetnoot" ;
    Text[ chinese_simplified ] = "×¢½Å";
    Text[ russian ] = "Ñíîñêà";
    Text[ polish ] = "Przypis dolny";
    Text[ japanese ] = "‹r’";
    Text[ chinese_traditional ] = "µù¸}";
    Text[ arabic ] = "ÍÇÔíÉ ÓÝáíÉ";
    Text[ greek ] = "Õðïóçìåßùóç";
    Text[ korean ] = "°¢ÁÖ";
    Text[ turkish ] = "Dipnot";
    Text[ language_user1 ] = " ";
};
String STR_POOLPAGE_ENDNOTE
{
    Text = "Endnote" ;
    Text [ English ] = "Endnote" ;
    Text [ portuguese ] = "Nota final" ;
    Text [ english_us ] = "Endnote" ;
    Text [ portuguese_brazilian ] = "Endnote" ;
    Text [ swedish ] = "Slutnot" ;
    Text [ danish ] = "Slutnote" ;
    Text [ italian ] = "Nota di chiusura" ;
    Text [ spanish ] = "Nota al final" ;
    Text [ french ] = "Note de fin" ;
    Text [ dutch ] = "Eindnoot" ;
    Text[ chinese_simplified ] = "βע";
    Text[ russian ] = "Êîíöåâàÿ ñíîñêà";
    Text[ polish ] = "Przypis koñcowy";
    Text[ japanese ] = "•¶––‹r’";
    Text[ chinese_traditional ] = "§Àª`";
    Text[ arabic ] = "ÊÚáíÞ ÎÊÇãí";
    Text[ greek ] = "Óçìåßùóç ôÝëïõò";
    Text[ korean ] = "¹ÌÁÖ";
    Text[ turkish ] = "Sonnot";
    Text[ language_user1 ] = " ";
};
String STR_POOLPAGE_PRGM_STANDARD
{
    Text  = "Standard" ;
};
String STR_POOLPAGE_PRGM_FIRST
{
    Text  = "First Page" ;
};
String STR_POOLPAGE_PRGM_LEFT
{
    Text  = "Left Page" ;
};
String STR_POOLPAGE_PRGM_RIGHT
{
    Text  = "Right Page" ;
};
String STR_POOLPAGE_PRGM_JAKET
{
    Text  = "Envelope" ;
};
String STR_POOLPAGE_PRGM_REGISTER
{
    Text  = "Index" ;
};
String STR_POOLPAGE_PRGM_HTML
{
    Text  = "HTML" ;
};
String STR_POOLPAGE_PRGM_FOOTNOTE
{
    Text  = "Footnote" ;
};
String STR_POOLPAGE_PRGM_ENDNOTE
{
    Text  = "Endnote" ;
};
/*
 Numerierungs Regeln
*/
String STR_POOLNUMRULE_NUM1
{
    Text = "Nummerierung 1" ;
    Text [ English ] = "Numbering 1" ;
    Text [ dutch ] = "Nummering 1" ;
    Text [ english_us ] = "Numbering 1" ;
    Text [ italian ] = "Numerazione 1" ;
    Text [ spanish ] = "Numeración 1" ;
    Text [ french ] = "Numérotation 1" ;
    Text [ swedish ] = "Numrering 1" ;
    Text [ danish ] = "Nummerering 1" ;
    Text [ portuguese ] = "Numeração 1" ;
    Text [ portuguese_brazilian ] = "Numerierung 1" ;
    Text[ chinese_simplified ] = "񅧏 1";
    Text[ russian ] = "Íóìåðàöèÿ 1";
    Text[ polish ] = "Numeracja 1";
    Text[ japanese ] = "”ԍ†•t‚¯ 1";
    Text[ chinese_traditional ] = "½s¸¹ 1";
    Text[ arabic ] = "ÇáÊÑÞíã 1";
    Text[ greek ] = "Áñßèìçóç 1";
    Text[ korean ] = "¹øÈ£ 1";
    Text[ turkish ] = "Numaralama 1";
    Text[ language_user1 ] = " ";
};
String STR_POOLNUMRULE_NUM2
{
    Text = "Nummerierung 2" ;
    Text [ English ] = "Numbering 2" ;
    Text [ dutch ] = "Nummering 2" ;
    Text [ english_us ] = "Numbering 2" ;
    Text [ italian ] = "Numerazione 2" ;
    Text [ spanish ] = "Numeración 2" ;
    Text [ french ] = "Numérotation 2" ;
    Text [ swedish ] = "Numrering 2" ;
    Text [ danish ] = "Nummerering 2" ;
    Text [ portuguese ] = "Numeração 2" ;
    Text [ portuguese_brazilian ] = "Numerierung 2" ;
    Text[ chinese_simplified ] = "񅧏 2";
    Text[ russian ] = "Íóìåðàöèÿ 2";
    Text[ polish ] = "Numeracja 2";
    Text[ japanese ] = "”ԍ†•t‚¯ 2";
    Text[ chinese_traditional ] = "½s¸¹ 2";
    Text[ arabic ] = "ÇáÊÑÞíã 2";
    Text[ greek ] = "Áñßèìçóç 2";
    Text[ korean ] = "¹øÈ£ 2";
    Text[ turkish ] = "Numaralama 2";
    Text[ language_user1 ] = " ";
};
String STR_POOLNUMRULE_NUM3
{
    Text = "Nummerierung 3" ;
    Text [ English ] = "Numbering 3" ;
    Text [ dutch ] = "Nummering 3" ;
    Text [ english_us ] = "Numbering 3" ;
    Text [ italian ] = "Numerazione 3" ;
    Text [ spanish ] = "Numeración 3" ;
    Text [ french ] = "Numérotation 3" ;
    Text [ swedish ] = "Numrering 3" ;
    Text [ danish ] = "Nummerering 3" ;
    Text [ portuguese ] = "Numeração 3" ;
    Text [ portuguese_brazilian ] = "Numerierung 3" ;
    Text[ chinese_simplified ] = "񅧏 3";
    Text[ russian ] = "Íóìåðàöèÿ 3";
    Text[ polish ] = "Numeracja 3";
    Text[ japanese ] = "”ԍ†•t‚¯ 3";
    Text[ chinese_traditional ] = "½s¸¹ 3";
    Text[ arabic ] = "ÇáÊÑÞíã 3";
    Text[ greek ] = "Áñßèìçóç 3";
    Text[ korean ] = "¹øÈ£ 3";
    Text[ turkish ] = "Numaralama 3";
    Text[ language_user1 ] = " ";
};
String STR_POOLNUMRULE_NUM4
{
    Text = "Nummerierung 4" ;
    Text [ English ] = "Numbering 4" ;
    Text [ dutch ] = "Nummering 4" ;
    Text [ english_us ] = "Numbering 4" ;
    Text [ italian ] = "Numerazione 4" ;
    Text [ spanish ] = "Numeración 4" ;
    Text [ french ] = "Numérotation 4" ;
    Text [ swedish ] = "Numrering 4" ;
    Text [ danish ] = "Nummerering 4" ;
    Text [ portuguese ] = "Numeração 4" ;
    Text [ portuguese_brazilian ] = "Numerierung 4" ;
    Text[ chinese_simplified ] = "񅧏 4";
    Text[ russian ] = "Íóìåðàöèÿ 4";
    Text[ polish ] = "Numeracja 4";
    Text[ japanese ] = "”ԍ†•t‚¯ 4";
    Text[ chinese_traditional ] = "½s¸¹ 4";
    Text[ arabic ] = "ÇáÊÑÞíã 4";
    Text[ greek ] = "Áñßèìçóç 4";
    Text[ korean ] = "¹øÈ£ 4";
    Text[ turkish ] = "Numaralama 4";
    Text[ language_user1 ] = " ";
};
String STR_POOLNUMRULE_NUM5
{
    Text = "Nummerierung 5" ;
    Text [ English ] = "Numbering 5" ;
    Text [ dutch ] = "Nummering 5" ;
    Text [ english_us ] = "Numbering 5" ;
    Text [ italian ] = "Numerazione 5" ;
    Text [ spanish ] = "Numeración 5" ;
    Text [ french ] = "Numérotation 5" ;
    Text [ swedish ] = "Numrering 5" ;
    Text [ danish ] = "Nummerering 5" ;
    Text [ portuguese ] = "Numeração 5" ;
    Text [ portuguese_brazilian ] = "Numerierung 5" ;
    Text[ chinese_simplified ] = "񅧏 5";
    Text[ russian ] = "Íóìåðàöèÿ 5";
    Text[ polish ] = "Numeracja 5";
    Text[ japanese ] = "”ԍ†•t‚¯ 5";
    Text[ chinese_traditional ] = "½s¸¹ 5";
    Text[ arabic ] = "ÇáÊÑÞíã 5";
    Text[ greek ] = "Áñßèìçóç 5";
    Text[ korean ] = "¹øÈ£ 5";
    Text[ turkish ] = "Numaralama 5";
    Text[ language_user1 ] = " ";
};
String STR_POOLNUMRULE_BUL1
{
    /* ### ACHTUNG: Neuer Text in Resource? Aufzählung 1 : Aufzõhlung 1 */
    Text = "Aufzählung 1" ;
    Text [ English ] = "Bullet 1" ;
    Text [ dutch ] = "Opsomming 1" ;
    Text [ english_us ] = "List 1" ;
    Text [ italian ] = "Elenco 1" ;
    Text [ spanish ] = "Enumeración 1" ;
    Text [ french ] = "Puce 1" ;
    Text [ swedish ] = "Uppräkning 1" ;
    Text [ danish ] = "Punktopstilling 1" ;
    Text [ portuguese ] = "Lista 1" ;
    Text [ portuguese_brazilian ] = "Aufzählung 1" ;
    Text[ chinese_simplified ] = "ÏîÄ¿±àºÅ 1";
    Text[ russian ] = "Ñïèñîê 1";
    Text[ polish ] = "Lista 1";
    Text[ japanese ] = "‰Óð‘‚« 1";
    Text[ chinese_traditional ] = "¶µ¥Ø½s¸¹ 1";
    Text[ arabic ] = "ÊÚÏÇÏ 1";
    Text[ greek ] = "ÊáôÜëïãïò 1";
    Text[ korean ] = "¸®½ºÆ® 1";
    Text[ turkish ] = "Liste 1";
    Text[ language_user1 ] = " ";
};
String STR_POOLNUMRULE_BUL2
{
    /* ### ACHTUNG: Neuer Text in Resource? Aufzählung 1 : Aufzõhlung 1 */
    Text = "Aufzählung 2" ;
    Text [ English ] = "Bullet 2" ;
    Text [ dutch ] = "Opsomming 2" ;
    Text [ english_us ] = "List 2" ;
    Text [ italian ] = "Elenco 2" ;
    Text [ spanish ] = "Enumeración 2" ;
    Text [ french ] = "Puce 2" ;
    Text [ swedish ] = "Uppräkning 2" ;
    Text [ danish ] = "Punktopstilling 2" ;
    Text [ portuguese ] = "Lista 2" ;
    Text [ portuguese_brazilian ] = "Aufzählung 2" ;
    Text[ chinese_simplified ] = "ÏîÄ¿±àºÅ 2";
    Text[ russian ] = "Ñïèñîê 2";
    Text[ polish ] = "Lista 2";
    Text[ japanese ] = "‰Óð‘‚« 2";
    Text[ chinese_traditional ] = "¶µ¥Ø½s¸¹ 2";
    Text[ arabic ] = "ÊÚÏÇÏ 2";
    Text[ greek ] = "ÊáôÜëïãïò 2";
    Text[ korean ] = "¸®½ºÆ® 2";
    Text[ turkish ] = "Liste 2";
    Text[ language_user1 ] = " ";
};
String STR_POOLNUMRULE_BUL3
{
    /* ### ACHTUNG: Neuer Text in Resource? Aufzählung 1 : Aufzõhlung 1 */
    Text = "Aufzählung 3" ;
    Text [ English ] = "Bullet 3" ;
    Text [ dutch ] = "Opsomming 3" ;
    Text [ english_us ] = "List 3" ;
    Text [ italian ] = "Elenco 3" ;
    Text [ spanish ] = "Enumeración 3" ;
    Text [ french ] = "Puce 3" ;
    Text [ swedish ] = "Uppräkning 3" ;
    Text [ danish ] = "Punktopstilling 3" ;
    Text [ portuguese ] = "Lista 3" ;
    Text [ portuguese_brazilian ] = "Aufzählung 3" ;
    Text[ chinese_simplified ] = "ÏîÄ¿±àºÅ 3";
    Text[ russian ] = "Ñïèñîê 3";
    Text[ polish ] = "Lista 3";
    Text[ japanese ] = "‰Óð‘‚« 3";
    Text[ chinese_traditional ] = "¶µ¥Ø½s¸¹ 3";
    Text[ arabic ] = "ÊÚÏÇÏ 3";
    Text[ greek ] = "ÊáôÜëïãïò 3";
    Text[ korean ] = "¸®½ºÆ® 3";
    Text[ turkish ] = "Liste 3";
    Text[ language_user1 ] = " ";
};
String STR_POOLNUMRULE_BUL4
{
    /* ### ACHTUNG: Neuer Text in Resource? Aufzählung 1 : Aufzõhlung 4 */
    Text = "Aufzählung 4" ;
    Text [ English ] = "Bullet 4" ;
    Text [ dutch ] = "Opsomming 4" ;
    Text [ english_us ] = "List 4" ;
    Text [ italian ] = "Elenco 4" ;
    Text [ spanish ] = "Enumeración 4" ;
    Text [ french ] = "Puce 4" ;
    Text [ swedish ] = "Uppräkning 4" ;
    Text [ danish ] = "Punktopstilling 4" ;
    Text [ portuguese ] = "Lista 4" ;
    Text [ portuguese_brazilian ] = "Aufzählung 4" ;
    Text[ chinese_simplified ] = "ÏîÄ¿±àºÅ 4";
    Text[ russian ] = "Ñïèñîê 4";
    Text[ polish ] = "Lista 4";
    Text[ japanese ] = "‰Óð‘‚« 4";
    Text[ chinese_traditional ] = "¶µ¥Ø½s¸¹ 4";
    Text[ arabic ] = "ÊÚÏÇÏ 4";
    Text[ greek ] = "ÊáôÜëïãïò 4";
    Text[ korean ] = "¸®½ºÆ® 4";
    Text[ turkish ] = "Liste 4";
    Text[ language_user1 ] = " ";
};
String STR_POOLNUMRULE_BUL5
{
    /* ### ACHTUNG: Neuer Text in Resource? Aufzählung 5 : Aufzõhlung 5 */
    Text = "Aufzählung 5" ;
    Text [ English ] = "Bullet 5" ;
    Text [ dutch ] = "Opsomming 5" ;
    Text [ english_us ] = "List 5" ;
    Text [ italian ] = "Elenco 5" ;
    Text [ spanish ] = "Enumeración 5" ;
    Text [ french ] = "Puce 5" ;
    Text [ swedish ] = "Uppräkning 5" ;
    Text [ danish ] = "Punktopstilling 5" ;
    Text [ portuguese ] = "Lista 5" ;
    Text [ portuguese_brazilian ] = "Aufzählung 51" ;
    Text[ chinese_simplified ] = "ÏîÄ¿±àºÅ 5";
    Text[ russian ] = "Ñïèñîê 5";
    Text[ polish ] = "Lista 5";
    Text[ japanese ] = "‰Óð‘‚« 5";
    Text[ chinese_traditional ] = "¶µ¥Ø½s¸¹ 5";
    Text[ arabic ] = "ÊÚÏÇÏ 5";
    Text[ greek ] = "ÊáôÜëïãïò 5";
    Text[ korean ] = "¸®½ºÆ® 5";
    Text[ turkish ] = "Liste 5";
    Text[ language_user1 ] = " ";
};

String STR_POOLNUMRULE_PRGM_NUM1
{
    Text  = "Numbering 1" ;
};
String STR_POOLNUMRULE_PRGM_NUM2
{
    Text  = "Numbering 2" ;
};
String STR_POOLNUMRULE_PRGM_NUM3
{
    Text  = "Numbering 3" ;
};
String STR_POOLNUMRULE_PRGM_NUM4
{
    Text  = "Numbering 4" ;
};
String STR_POOLNUMRULE_PRGM_NUM5
{
    Text  = "Numbering 5" ;
};
String STR_POOLNUMRULE_PRGM_BUL1
{
    Text  = "List 1" ;
};
String STR_POOLNUMRULE_PRGM_BUL2
{
    Text  = "List 2" ;
};
String STR_POOLNUMRULE_PRGM_BUL3
{
    Text  = "List 3" ;
};
String STR_POOLNUMRULE_PRGM_BUL4
{
    Text  = "List 4" ;
};
String STR_POOLNUMRULE_PRGM_BUL5
{
    Text  = "List 5" ;
};

diff --git a/sw/source/ui/utlui/prcntfld.cxx b/sw/source/ui/utlui/prcntfld.cxx
new file mode 100644
index 0000000..9805bd3
--- /dev/null
+++ b/sw/source/ui/utlui/prcntfld.cxx
@@ -0,0 +1,486 @@
/*************************************************************************
 *
 *  $RCSfile: prcntfld.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:50 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

// include ---------------------------------------------------------------

#pragma hdrstop

#include "prcntfld.hxx"

// STATIC DATA -----------------------------------------------------------

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

PercentField::PercentField( Window* pWin, const ResId& rResId ) :
        MetricField ( pWin, rResId ),

        eOldUnit    (FUNIT_NONE),
        nOldMin     (0),
        nOldMax     (0),
        nLastPercent(-1L),
        nLastValue  (-1L)
{

    nOldSpinSize = GetSpinSize();
    nRefValue = Denormalize(MetricField::GetMax(FUNIT_TWIP));
    nOldDigits = GetDecimalDigits();
    SetCustomUnitText('%');
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void PercentField::SetRefValue(long nValue)
{
    long nRealValue = GetRealValue(eOldUnit);

    nRefValue = nValue;

    if (GetUnit() == FUNIT_CUSTOM)
        SetValue(nRealValue, eOldUnit);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void PercentField::ShowPercent(BOOL bPercent)
{
    if ((bPercent && GetUnit() == FUNIT_CUSTOM) ||
        (!bPercent && GetUnit() != FUNIT_CUSTOM))
        return;

    long nOldValue;

    if (bPercent)
    {
        long nAktWidth, nPercent;

        nOldValue = GetValue();

        eOldUnit = GetUnit();
        nOldDigits = GetDecimalDigits();
        nOldMin = GetMin();
        nOldMax = GetMax();
        nOldSpinSize = GetSpinSize();
#ifndef VCL
        nOldBaseValue = nBaseValue;
#else
        nOldBaseValue = GetBaseValue();
#endif
        SetUnit(FUNIT_CUSTOM);
        SetDecimalDigits( 0 );

        nAktWidth = ConvertValue(nOldMin, 0, nOldDigits, eOldUnit, FUNIT_TWIP);
        // Um 0.5 Prozent aufrunden
        nPercent = ((nAktWidth * 10) / nRefValue + 5) / 10;

        MetricField::SetMin(Max(1L, nPercent));
        MetricField::SetMax(100);
        SetSpinSize(5);
#ifndef VCL
        nBaseValue = 0;
#else
        MetricField::SetBaseValue(0);
#endif
        if (nOldValue != nLastValue)
        {
            nAktWidth = ConvertValue(nOldValue, 0, nOldDigits, eOldUnit, FUNIT_TWIP);
            nPercent = ((nAktWidth * 10) / nRefValue + 5) / 10;
            MetricField::SetValue(nPercent);
            nLastPercent = nPercent;
            nLastValue = nOldValue;
        }
        else
            MetricField::SetValue(nLastPercent);
//      SetValue(100, FUNIT_CUSTOM);
    }
    else
    {
        long nOldPercent = GetValue(FUNIT_CUSTOM);

        nOldValue = Convert(GetValue(), GetUnit(), eOldUnit);

        SetUnit(eOldUnit);
        SetDecimalDigits(nOldDigits);
        MetricField::SetMin(nOldMin);
        MetricField::SetMax(nOldMax);
        SetSpinSize(nOldSpinSize);
#ifndef VCL
        nBaseValue = nOldBaseValue;
#else
        MetricField::SetBaseValue(nOldBaseValue);
#endif

        if (nOldPercent != nLastPercent)
        {
            SetValue(nOldValue, eOldUnit);
            nLastPercent = nOldPercent;
            nLastValue = nOldValue;
        }
        else
            SetValue(nLastValue, eOldUnit);
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void PercentField::SetValue(long nNewValue, FieldUnit eInUnit)
{
    if (GetUnit() != FUNIT_CUSTOM || eInUnit == FUNIT_CUSTOM)
        MetricField::SetValue(Convert(nNewValue, eInUnit, GetUnit()));

    else
    {
        // Ausgangswert ueberschreiben, nicht spaeter restaurieren
        long nPercent, nAktWidth;
        if(eInUnit == FUNIT_TWIP)
        {
            nAktWidth = ConvertValue(nNewValue, 0, nOldDigits, FUNIT_TWIP, FUNIT_TWIP);
        }
        else
        {
            long nValue = Convert(nNewValue, eInUnit, eOldUnit);
            nAktWidth = ConvertValue(nValue, 0, nOldDigits, eOldUnit, FUNIT_TWIP);
        }
        nPercent = ((nAktWidth * 10) / nRefValue + 5) / 10;
        MetricField::SetValue(nPercent);
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void PercentField::SetUserValue( long nNewValue, FieldUnit eInUnit )
{
    if (GetUnit() != FUNIT_CUSTOM || eInUnit == FUNIT_CUSTOM)
        MetricField::SetUserValue(Convert(nNewValue, eInUnit, GetUnit()),FUNIT_NONE);

    else
    {
        // Ausgangswert ueberschreiben, nicht spaeter restaurieren
        long nPercent, nAktWidth;
        if(eInUnit == FUNIT_TWIP)
        {
            nAktWidth = ConvertValue(nNewValue, 0, nOldDigits, FUNIT_TWIP, FUNIT_TWIP);
        }
        else
        {
            long nValue = Convert(nNewValue, eInUnit, eOldUnit);
            nAktWidth = ConvertValue(nValue, 0, nOldDigits, eOldUnit, FUNIT_TWIP);
        }
        nPercent = ((nAktWidth * 10) / nRefValue + 5) / 10;
        MetricField::SetUserValue(nPercent,FUNIT_NONE);
    }

}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void PercentField::SetBaseValue(long nNewValue, FieldUnit eInUnit)
{
    if (GetUnit() == FUNIT_CUSTOM)
        nOldBaseValue = ConvertValue(nNewValue, 0, nOldDigits, eInUnit, eOldUnit);
    else
        MetricField::SetBaseValue(nNewValue, eInUnit);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

long PercentField::GetValue( FieldUnit eOutUnit )
{
    return Convert(MetricField::GetValue(), GetUnit(), eOutUnit);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void PercentField::SetMin(long nNewMin, FieldUnit eInUnit)
{
    if (GetUnit() != FUNIT_CUSTOM)
        MetricField::SetMin(nNewMin, eInUnit);
    else
    {
        if (eInUnit == FUNIT_NONE)
            eInUnit = eOldUnit;
        nOldMin = Convert(nNewMin, eInUnit, eOldUnit);

        long nPercent = Convert(nNewMin, eInUnit, FUNIT_CUSTOM);
        MetricField::SetMin(Max(1L, nPercent));
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

void PercentField::SetMax(long nNewMax, FieldUnit eInUnit)
{
    if (GetUnit() != FUNIT_CUSTOM)
        MetricField::SetMax(nNewMax, eInUnit);
    else
    {
        if (eInUnit == FUNIT_NONE)
            eInUnit = eOldUnit;
//      SetRefValue(Convert(nNewMax, eInUnit, FUNIT_TWIP));
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

long PercentField::Normalize(long nValue)
{
    if (GetUnit() != FUNIT_CUSTOM)
        nValue = MetricField::Normalize(nValue);
    else
        nValue = nValue * ImpPower10(nOldDigits);

    return nValue;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

long PercentField::Denormalize(long nValue)
{
    if (GetUnit() != FUNIT_CUSTOM)
        nValue = MetricField::Denormalize(nValue);
    else
    {
        long nFactor = ImpPower10(nOldDigits);
        nValue = ((nValue+(nFactor/2)) / nFactor);
    }

    return nValue;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

BOOL PercentField::IsValueModified()
{
    if (GetUnit() == FUNIT_CUSTOM)
        return TRUE;
    else
        return MetricField::IsValueModified();
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

long PercentField::ImpPower10( USHORT n )
{
    USHORT i;
    long   nValue = 1;

    for ( i=0; i < n; i++ )
        nValue *= 10;

    return nValue;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

long PercentField::GetRealValue(FieldUnit eOutUnit)
{
    if (GetUnit() != FUNIT_CUSTOM)
        return GetValue(eOutUnit);
    else
        return Convert(GetValue(), GetUnit(), eOutUnit);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

long PercentField::Convert(long nValue, FieldUnit eInUnit, FieldUnit eOutUnit)
{
    if (eInUnit == eOutUnit ||
        (eInUnit == FUNIT_NONE && eOutUnit == GetUnit()) ||
        (eOutUnit == FUNIT_NONE && eInUnit == GetUnit()))
        return nValue;

    if (eInUnit == FUNIT_CUSTOM)
    {
        // Umrechnen in Metrik
        long nTwipValue = (nRefValue * nValue + 50) / 100;

        if (eOutUnit == FUNIT_TWIP) // Nur wandeln, wenn unbedingt notwendig
            return Normalize(nTwipValue);
        else
            return ConvertValue(Normalize(nTwipValue), 0, nOldDigits, FUNIT_TWIP, eOutUnit);
    }

    if (eOutUnit == FUNIT_CUSTOM)
    {
        // Umrechnen in Prozent
        long nAktWidth;
        nValue = Denormalize(nValue);

        if (eInUnit == FUNIT_TWIP)  // Nur wandeln, wenn unbedingt notwendig
            nAktWidth = nValue;
        else
            nAktWidth = ConvertValue(nValue, 0, nOldDigits, eInUnit, FUNIT_TWIP);
        // Um 0.5 Prozent runden
        return ((nAktWidth * 1000) / nRefValue + 5) / 10;
    }

    return ConvertValue(nValue, 0, nOldDigits, eInUnit, eOutUnit);
}

/*************************************************************************

      Source Code Control System - History

      $Log: not supported by cvs2svn $
      Revision 1.21  2000/09/18 16:06:19  willem.vandorp
      OpenOffice header added.

      Revision 1.20  1997/11/07 15:38:34  OM
      Aufgeraeumt


      Rev 1.19   07 Nov 1997 16:38:34   OM
   Aufgeraeumt

      Rev 1.18   19 Sep 1997 11:06:54   OM
   VCL: SetBaseValue an Basisklasse rufen!

      Rev 1.17   06 Aug 1997 15:00:48   TRI
   VCL: Anpassungen

      Rev 1.16   04 Dec 1996 15:56:46   OS
   SetValue stimmt wieder

      Rev 1.15   02 Dec 1996 10:33:50   OS
   im SetValue immer runden

      Rev 1.14   28 Nov 1996 15:24:54   OM
   #32021# Bei zu spaetem RefValue setzen: MetricField neu berechnen und anzeigen

      Rev 1.13   07 Nov 1996 11:48:18   OM
   Rundung verbessert

      Rev 1.12   29 Oct 1996 17:21:02   OM
   Rundung verbessert

      Rev 1.11   11 Sep 1996 15:10:10   OM
   SetMin korrigiert

      Rev 1.10   10 Sep 1996 17:03:00   OM
   Prozentfelder

      Rev 1.9   09 Sep 1996 16:57:26   OM
   Prozentuale Spalten

      Rev 1.8   07 Sep 1996 13:47:38   OS
   HACK fuer SetValue

      Rev 1.7   17 Jul 1996 15:32:40   OM
   Aufgeraeumt

      Rev 1.6   17 Jul 1996 15:22:58   OM
   Anfangswert in Prozent konvertieren

      Rev 1.5   25 Jun 1996 17:11:50   OM
   Relative Grafiken

      Rev 1.4   20 Jun 1996 18:07:00   OM
   Relative Rahmen

      Rev 1.3   19 Jun 1996 17:46:02   OM
   Relative Tabellenbreite

      Rev 1.2   18 Jun 1996 16:27:54   OM
   Neue Segs

      Rev 1.1   18 Jun 1996 16:27:10   OM
   Relative Tabellenbreite

      Rev 1.0   17 Jun 1996 15:07:32   OM
   Initial revision.

      Rev 1.1   17 Jun 1996 15:03:54   OM
   Neue Segs

      Rev 1.0   17 Jun 1996 15:02:10   OM
   Initial revision.

*************************************************************************/

diff --git a/sw/source/ui/utlui/shdwcrsr.cxx b/sw/source/ui/utlui/shdwcrsr.cxx
new file mode 100644
index 0000000..cb6104f
--- /dev/null
+++ b/sw/source/ui/utlui/shdwcrsr.cxx
@@ -0,0 +1,196 @@
/*************************************************************************
 *
 *  $RCSfile: shdwcrsr.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:50 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SV_WINDOW_HXX //autogen
#include <vcl/window.hxx>
#endif

#include "swtypes.hxx"
#include "shdwcrsr.hxx"


SwShadowCursor::~SwShadowCursor()
{
    if( USHRT_MAX != nOldMode )
        DrawCrsr( aOldPt, nOldHeight, nOldMode );
}

void SwShadowCursor::SetPos( const Point& rPt, long nHeight, USHORT nMode )
{
    Point aPt( pWin->LogicToPixel( rPt ));
    nHeight = pWin->LogicToPixel( Size( 0, nHeight )).Height();
    if( aOldPt != aPt || nOldHeight != nHeight || nOldMode != nMode )
    {
        if( USHRT_MAX != nOldMode )
            DrawCrsr( aOldPt, nOldHeight, nOldMode );

        DrawCrsr( aPt, nHeight, nMode );
        nOldMode = nMode;
        nOldHeight = nHeight;
        aOldPt = aPt;
    }
}

void SwShadowCursor::DrawTri( const Point& rPt, long nHeight, BOOL bLeft )
{
    USHORT nLineDiff = ( nHeight / 2 );
    USHORT nLineDiffHalf = nLineDiff / 2;

    // Punkt oben
    Point aPt1( (bLeft ? rPt.X() - 3 : rPt.X() + 3),
                rPt.Y() + nLineDiffHalf );
    // Punkt unten
    Point aPt2( aPt1.X(), aPt1.Y() + nHeight - nLineDiff - 1 );
    short nDiff = bLeft ? -1 : 1;
    while( aPt1.Y() <= aPt2.Y() )
    {
        pWin->DrawLine( aPt1, aPt2 );
        aPt1.Y()++, aPt2.Y()--;
        aPt2.X() = aPt1.X() += nDiff;
    }
}

void SwShadowCursor::DrawCrsr( const Point& rPt, long nHeight, USHORT nMode )
{
    nHeight = (((nHeight / 4)+1) * 4) + 1;

    pWin->Push();

    pWin->SetMapMode( MAP_PIXEL );
    pWin->SetRasterOp( ROP_XOR );

    pWin->SetLineColor( Color( aCol.GetColor() ^ COL_WHITE ) );

    // 1. der Strich:
    pWin->DrawLine( Point( rPt.X(), rPt.Y() + 1),
              Point( rPt.X(), rPt.Y() - 2 + nHeight ));

    // 2. das Dreieck
    if( HORI_LEFT == nMode || HORI_CENTER == nMode )    // Pfeil nach rechts
        DrawTri( rPt, nHeight, FALSE );
    if( HORI_RIGHT == nMode || HORI_CENTER == nMode )   // Pfeil nach links
        DrawTri( rPt, nHeight, TRUE );

    pWin->Pop();
}

void SwShadowCursor::Paint()
{
    if( USHRT_MAX != nOldMode )
        DrawCrsr( aOldPt, nOldHeight, nOldMode );
}

Rectangle SwShadowCursor::GetRect() const
{
    long nH = nOldHeight;
    Point aPt( aOldPt );

    nH = (((nH / 4)+1) * 4) + 1;
    USHORT nWidth = nH / 4 + 3 + 1;

    Size aSz( nWidth, nH );

    if( HORI_RIGHT == nOldMode )
        aPt.X() -= aSz.Width();
    else if( HORI_CENTER == nOldMode )
    {
        aPt.X() -= aSz.Width();
        aSz.Width() *= 2;
    }

    return pWin->PixelToLogic( Rectangle( aPt, aSz ) );
}

/*************************************************************************

      Source Code Control System - Update

      $Log: not supported by cvs2svn $
      Revision 1.5  2000/09/18 16:06:19  willem.vandorp
      OpenOffice header added.

      Revision 1.4  2000/02/11 15:00:59  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.3  1999/09/20 10:45:53  os
      Color changes

      Revision 1.2  1997/11/03 15:10:26  JP
      neu: Optionen/-Page/Basic-Schnittst. fuer ShadowCursor


      Rev 1.1   03 Nov 1997 16:10:26   JP
   neu: Optionen/-Page/Basic-Schnittst. fuer ShadowCursor

      Rev 1.0   24 Oct 1997 18:31:58   JP
   Cursor fuers Einfuegen an beliebiger Position


*************************************************************************/



diff --git a/sw/source/ui/utlui/tmplctrl.cxx b/sw/source/ui/utlui/tmplctrl.cxx
new file mode 100644
index 0000000..7b1570b
--- /dev/null
+++ b/sw/source/ui/utlui/tmplctrl.cxx
@@ -0,0 +1,306 @@
/*************************************************************************
 *
 *  $RCSfile: tmplctrl.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:50 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

// include ---------------------------------------------------------------
#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SFXSTYLE_HXX //autogen
#include <svtools/style.hxx>
#endif
#ifndef _MENU_HXX //autogen
#include <vcl/menu.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _STATUS_HXX //autogen
#include <vcl/status.hxx>
#endif

#include "wrtsh.hxx"
#include "view.hxx"
#include "swmodule.hxx"
#include "cmdid.h"
#include "docsh.hxx"
#include "tmplctrl.hxx"


// STATIC DATA -----------------------------------------------------------


SFX_IMPL_STATUSBAR_CONTROL( SwTemplateControl, SfxStringItem );

// class TemplatePopup_Impl --------------------------------------------------

class TemplatePopup_Impl : public PopupMenu
{
public:
    TemplatePopup_Impl();

    USHORT          GetCurId() const { return nCurId; }

private:
    USHORT          nCurId;

    virtual void    Select();
};

// -----------------------------------------------------------------------

TemplatePopup_Impl::TemplatePopup_Impl() :
    PopupMenu(),
    nCurId(USHRT_MAX)
{
}

// -----------------------------------------------------------------------

void TemplatePopup_Impl::Select()
{
    nCurId = GetCurItemId();
}

// class SvxZoomStatusBarControl ------------------------------------------

SwTemplateControl::SwTemplateControl( USHORT nId,
                                                  StatusBar& rStb,
                                                  SfxBindings& rBind ) :
    SfxStatusBarControl( nId, rStb, rBind )
{
}

// -----------------------------------------------------------------------

SwTemplateControl::~SwTemplateControl()
{
}

// -----------------------------------------------------------------------

void SwTemplateControl::StateChanged( const SfxPoolItem* pState )
{
    SfxItemState eState = GetItemState(pState);

    if( eState != SFX_ITEM_AVAILABLE || pState->ISA( SfxVoidItem ) )
        GetStatusBar().SetItemText( GetId(), String() );
    else if ( pState->ISA( SfxStringItem ) )
    {
        sTemplate = ((SfxStringItem*)pState)->GetValue();
        GetStatusBar().SetItemText( GetId(), sTemplate );
    }
}

// -----------------------------------------------------------------------

void SwTemplateControl::Paint( const UserDrawEvent&  )
{
    GetStatusBar().SetItemText( GetId(), sTemplate );
}

// -----------------------------------------------------------------------

void SwTemplateControl::Command( const CommandEvent& rCEvt )
{
    if ( rCEvt.GetCommand() == COMMAND_CONTEXTMENU &&
            GetStatusBar().GetItemText( GetId() ).Len() )
    {
        CaptureMouse();
        TemplatePopup_Impl aPop;
        {
            SwView* pView = ::GetActiveView();
            SwWrtShell* pWrtShell;
            if( pView && 0 != (pWrtShell = pView->GetWrtShellPtr()) &&
                !pWrtShell->SwCrsrShell::HasSelection()&&
                !pWrtShell->IsSelFrmMode() &&
                !pWrtShell->IsObjSelected())
            {
                SfxStyleSheetBasePool* pPool = pView->GetDocShell()->
                                                            GetStyleSheetPool();
                pPool->SetSearchMask(SFX_STYLE_FAMILY_PAGE, SFXSTYLEBIT_ALL);
                if( pPool->Count() > 1 )
                {
                    USHORT nCount = 0;
                    SfxStyleSheetBase* pStyle = pPool->First();
                    while( pStyle )
                    {
                        nCount++;
                        aPop.InsertItem( nCount, pStyle->GetName() );
                        pStyle = pPool->Next();
                    }

                    aPop.Execute( &GetStatusBar(), rCEvt.GetMousePosPixel());
                    USHORT nId = aPop.GetCurId();
                    if( nId != USHRT_MAX)
                    {
                        // sieht etwas umstaendlich aus, anders geht's aber nicht
                        pStyle = pPool->operator[]( nId - 1 );
                        SfxStringItem aStyle( FN_SET_PAGE_STYLE, pStyle->GetName() );
                        pWrtShell->GetView().GetViewFrame()->GetDispatcher()->Execute(
                                    FN_SET_PAGE_STYLE,
                                    SFX_CALLMODE_SLOT|SFX_CALLMODE_RECORD,
                                    &aStyle, 0L );
                    }
                }
            }
        }
        ReleaseMouse();
    }
}

/*************************************************************************


      $Log: not supported by cvs2svn $
      Revision 1.27  2000/09/18 16:06:19  willem.vandorp
      OpenOffice header added.

      Revision 1.26  2000/09/07 15:59:35  os
      change: SFX_DISPATCHER/SFX_BINDINGS removed

      Revision 1.25  2000/02/11 15:01:09  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.24  1998/11/11 15:16:02  OS
      #59267# include


      Rev 1.23   11 Nov 1998 16:16:02   OS
   #59267# include

      Rev 1.22   10 Nov 1998 15:14:20   OS
   #59267# Vorlagenmenue nur ohne Selektion

      Rev 1.21   03 Sep 1998 12:30:32   OS
   #56005# Alle Seitenvorlagen in der Statuszeile anbieten

      Rev 1.20   21 Nov 1997 12:10:14   MA
   includes

      Rev 1.19   03 Nov 1997 13:59:22   MA
   precomp entfernt

      Rev 1.18   29 Aug 1997 15:57:30   OS
   PopupMenu::Execute mit Window* fuer VCL

      Rev 1.17   29 Aug 1997 13:58:50   OS
   DLL-Umbau

      Rev 1.16   08 Aug 1997 17:25:18   OM
   Headerfile-Umstellung

      Rev 1.15   09 Jul 1997 17:45:32   HJS
   includes

      Rev 1.14   14 Jan 1997 09:39:00   TRI
   includes wegen Internal Compiler Error

      Rev 1.13   28 Aug 1996 15:42:38   OS
   includes

      Rev 1.12   26 Jun 1996 15:04:04   OS
   Aufruf von Dispatcher.Execute an 324 angepasst

      Rev 1.11   22 Mar 1996 15:18:38   HJS
   umstellung 311

      Rev 1.10   24 Nov 1995 16:57:24   OM
   PCH->PRECOMPILED

      Rev 1.9   17 Nov 1995 15:16:22   MA
   Segmentierung

      Rev 1.8   07 Nov 1995 18:04:04   MA
   opt/fix/chg: statics und segs

      Rev 1.7   30 Oct 1995 18:46:50   OM
   GetActiveView entfernt

      Rev 1.6   06 Oct 1995 00:20:14   HJS
   pState => eState

      Rev 1.5   05 Oct 1995 18:41:14   OM
   StateChanged umgestellt

      Rev 1.4   09 Aug 1995 19:15:18   OS
   Umstellung auf CommandHdl

      Rev 1.3   20 Jul 1995 19:00:20   OS
   kein Absturz ohne View

      Rev 1.2   17 Jul 1995 15:19:58   ER
   wie waer's mit exports?

      Rev 1.1   17 Jul 1995 14:51:48   ER
   wie waer's mit exports?

      Rev 1.0   14 Jul 1995 18:17:30   OS
   Initial revision.

*************************************************************************/


diff --git a/sw/source/ui/utlui/uiitems.cxx b/sw/source/ui/utlui/uiitems.cxx
new file mode 100644
index 0000000..1c132c1
--- /dev/null
+++ b/sw/source/ui/utlui/uiitems.cxx
@@ -0,0 +1,370 @@
/*************************************************************************
 *
 *  $RCSfile: uiitems.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:50 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SVX_ITEMTYPE_HXX
#include <svx/itemtype.hxx>
#endif
#ifndef _UNOSETT_HXX
#include <unosett.hxx>
#endif

#include "uiparam.hxx"
#include "swtypes.hxx"
#include "cmdid.h"
#include "pagedesc.hxx"
#include "uiitems.hxx"

#include "utlui.hrc"
#include "attrdesc.hrc"

using namespace ::com::sun::star;

// Breitenangaben der Fussnotenlinien, mit TabPage abstimmen
static const USHORT __FAR_DATA nFtnLines[] = {
    0,
    10,
    50,
    80,
    100,
    150
};

#define FTN_LINE_STYLE_COUNT 5


SwPageFtnInfoItem::SwPageFtnInfoItem( const USHORT nId, SwPageFtnInfo& rInfo) :
    SfxPoolItem( nId ),
    aFtnInfo(rInfo)
{
}


SwPageFtnInfoItem::SwPageFtnInfoItem( const SwPageFtnInfoItem& rItem ) :
    SfxPoolItem( rItem ),
    aFtnInfo(rItem.GetPageFtnInfo())
{
}


 SwPageFtnInfoItem::~SwPageFtnInfoItem()
{
}


SfxPoolItem*  SwPageFtnInfoItem::Clone( SfxItemPool *pPool ) const
{
    return new SwPageFtnInfoItem( *this );
}


int  SwPageFtnInfoItem::operator==( const SfxPoolItem& rAttr ) const
{
    DBG_ASSERT( Which() == rAttr.Which(), "keine gleichen Attribute" );
    return ( aFtnInfo == ((SwPageFtnInfoItem&)rAttr).GetPageFtnInfo());
}


SfxItemPresentation  SwPageFtnInfoItem::GetPresentation
(
    SfxItemPresentation ePres,
    SfxMapUnit          eCoreUnit,
    SfxMapUnit          ePresUnit,
    String&             rText,
    const International*    pIntl
)   const
{
    switch ( ePres )
    {
        case SFX_ITEM_PRESENTATION_NONE:
            rText.Erase();
            return SFX_ITEM_PRESENTATION_NONE;
        case SFX_ITEM_PRESENTATION_NAMELESS:
        case SFX_ITEM_PRESENTATION_COMPLETE:
        {
            USHORT nHght = (USHORT) GetPageFtnInfo().GetHeight();
            if ( nHght )
            {
                rText = SW_RESSTR( STR_MAX_FTN_HEIGHT );
                rText += ' ';
                rText += ::GetMetricText( nHght, eCoreUnit, ePresUnit );
                rText += ::GetSvxString( ::GetMetricId( ePresUnit ) );
            }
            return ePres;
        }
    }
    return SFX_ITEM_PRESENTATION_NONE;
}



SwPtrItem::SwPtrItem( const USHORT nId, void* pPtr ) :
    SfxPoolItem( nId ),
    pMisc(pPtr)
{
}

/*--------------------------------------------------------------------
    Beschreibung: Copy-Konstruktor
 --------------------------------------------------------------------*/


SwPtrItem::SwPtrItem( const SwPtrItem& rItem ) : SfxPoolItem( rItem )
{
    pMisc = rItem.pMisc;
}

/*--------------------------------------------------------------------
    Beschreibung: Clonen
 --------------------------------------------------------------------*/


SfxPoolItem* SwPtrItem::Clone( SfxItemPool *pPool ) const
{
    return new SwPtrItem( *this );
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


int SwPtrItem::operator==( const SfxPoolItem& rAttr ) const
{
    DBG_ASSERT( SfxPoolItem::operator==(rAttr), "unequal types" );
    const SwPtrItem& rItem = (SwPtrItem&)rAttr;
    return ( pMisc == rItem.pMisc );
}


/*-----------------12.11.97 12:55-------------------------------
 SwUINumRuleItem fuer die NumTabPages der FormatNumRule/Stylisten
---------------------------------------------------------------*/
SwUINumRuleItem::SwUINumRuleItem( const SwNumRule& rRul, const USHORT nId )
    : SfxPoolItem( nId ), pRule( new SwNumRule( rRul ) )
{
}

SwUINumRuleItem::SwUINumRuleItem( const String& rName, const USHORT nId )
    : SfxPoolItem( nId ), pRule( new SwNumRule( rName ) )
{
}

SwUINumRuleItem::SwUINumRuleItem( const SwUINumRuleItem& rItem )
    : SfxPoolItem( rItem ),
    pRule( new SwNumRule( *rItem.pRule ))
{
}

 SwUINumRuleItem::~SwUINumRuleItem()
{
    delete pRule;
}


SfxPoolItem*  SwUINumRuleItem::Clone( SfxItemPool *pPool ) const
{
    return new SwUINumRuleItem( *this );
}

int  SwUINumRuleItem::operator==( const SfxPoolItem& rAttr ) const
{
    DBG_ASSERT( SfxPoolItem::operator==(rAttr), "unequal types" );
    return *pRule == *((SwUINumRuleItem&)rAttr).pRule;
}

BOOL SwUINumRuleItem::QueryValue( uno::Any& rVal, BYTE nMemberId ) const
{
    uno::Reference< container::XIndexReplace >xRules = new SwXNumberingRules(*pRule);
    rVal.setValue(&xRules, ::getCppuType((uno::Reference< container::XIndexReplace>*)0));
    return TRUE;
}
BOOL SwUINumRuleItem::PutValue( const uno::Any& rVal, BYTE nMemberId )
{
    if(rVal.getValueType() == ::getCppuType((uno::Reference< container::XIndexReplace >*)0) )
    {
        uno::Reference< container::XIndexReplace>* pxRulesRef = (uno::Reference< container::XIndexReplace>*)rVal.getValue();
        uno::Reference< lang::XUnoTunnel > xTunnel(*pxRulesRef, uno::UNO_QUERY);
        SwXNumberingRules* pSwXRules = xTunnel.is() ? (SwXNumberingRules*)
                    xTunnel->getSomething(SwXNumberingRules::getUnoTunnelId()) : 0;
        if(pSwXRules)
        {
            *pRule = *pSwXRules->GetNumRule();
        }
    }
    return TRUE;
}
/* -----------------17.06.98 17:43-------------------
 *
 * --------------------------------------------------*/
SwBackgroundDestinationItem::SwBackgroundDestinationItem(USHORT  nWhich, USHORT nValue) :
    SfxUInt16Item(nWhich, nValue)
{
}
/* -----------------17.06.98 17:44-------------------
 *
 * --------------------------------------------------*/
SfxPoolItem*     SwBackgroundDestinationItem::Clone( SfxItemPool *pPool ) const
{
    return new SwBackgroundDestinationItem(Which(), GetValue());
}

/*------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.37  2000/09/18 16:06:19  willem.vandorp
    OpenOffice header added.

    Revision 1.36  2000/05/26 16:55:03  os
    includes removed

    Revision 1.35  2000/05/26 07:21:35  os
    old SW Basic API Slots removed

    Revision 1.34  2000/03/23 07:55:38  os
    UNO III

    Revision 1.33  2000/03/03 15:17:05  os
    StarView remainders removed

    Revision 1.32  1999/09/01 08:41:58  OS
    #66082# GetPresentation: new Parameter


      Rev 1.31   01 Sep 1999 10:41:58   OS
   #66082# GetPresentation: new Parameter

      Rev 1.30   23 Feb 1999 10:22:36   OS
   #61767# Kapitelnumerierung funktioniert wieder

      Rev 1.29   27 Jan 1999 10:00:32   OS
   #56371# TF_ONE51

      Rev 1.28   26 Jun 1998 17:35:36   OS
   SwBGDestItem mit Which #51751#

      Rev 1.27   17 Jun 1998 18:19:06   OS
   SwBackgroundDestinationItem

      Rev 1.26   27 May 1998 13:40:12   OS
   Put/QueryValue fuer SwUINumRuleItem

      Rev 1.25   24 Mar 1998 13:46:28   JP
   SwUINumRule: CTORen mit Name oder NumRule, nicht mehr mit NumRulePointer

      Rev 1.24   29 Nov 1997 15:08:58   MA
   includes

      Rev 1.23   21 Nov 1997 12:10:18   MA
   includes

      Rev 1.22   17 Nov 1997 10:21:32   JP
   Umstellung Numerierung

      Rev 1.21   03 Nov 1997 13:59:22   MA
   precomp entfernt

      Rev 1.20   06 Sep 1997 10:58:32   OS
   PenStyle der Fussnoten per Basic funktioniert #43272#

      Rev 1.19   11 Nov 1996 10:54:14   MA
   ResMgr

      Rev 1.18   28 Aug 1996 15:42:40   OS
   includes

      Rev 1.17   20 Aug 1996 16:24:56   OS
   SwPtrItem jetzt hier

      Rev 1.16   25 Mar 1996 13:31:50   OS
   Bugs im SwPageFtnInfoItem behoben

      Rev 1.15   31 Jan 1996 09:43:46   OS
   Masseinheit fuer SwPageFtnInfoItem

      Rev 1.14   04 Dec 1995 16:05:52   OS
   Set/FillVariable impl.

      Rev 1.13   27 Nov 1995 18:55:14   OS
   Umstellung 303a

      Rev 1.12   24 Nov 1995 16:57:24   OM
   PCH->PRECOMPILED

      Rev 1.11   16 Nov 1995 18:30:36   OS
   neu: Get/SetVariable, nicht impl.

      Rev 1.10   08 Nov 1995 12:17:22   OS
   Change => Set

      Rev 1.9   11 Oct 1995 17:50:54   MA
   fix: __EXPORT'iert

      Rev 1.8   28 Sep 1995 08:05:46   OS
   Typen fuer MSC richtig gecastet

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/utlui/uitool.cxx b/sw/source/ui/utlui/uitool.cxx
new file mode 100644
index 0000000..5037662
--- /dev/null
+++ b/sw/source/ui/utlui/uitool.cxx
@@ -0,0 +1,1045 @@
/*************************************************************************
 *
 *  $RCSfile: uitool.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:50 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif
#ifndef _UIPARAM_HXX
#include <uiparam.hxx>
#endif


#ifndef _SV_SVAPP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef SVTOOLS_URIHELPER_HXX
#include <svtools/urihelper.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif
#ifndef _SFXDOCFILE_HXX //autogen
#include <sfx2/docfile.hxx>
#endif
#ifndef _SFX_DOCFILT_HACK_HXX //autogen
#include <sfx2/docfilt.hxx>
#endif
#ifndef _SVX_PMDLITEM_HXX //autogen
#include <svx/pmdlitem.hxx>
#endif
#ifndef _SVX_TSTPITEM_HXX //autogen
#include <svx/tstpitem.hxx>
#endif
#ifndef _SVX_BOXITEM_HXX //autogen
#include <svx/boxitem.hxx>
#endif
#ifndef _SVX_SIZEITEM_HXX //autogen
#include <svx/sizeitem.hxx>
#endif
#ifndef _SVX_PAGEITEM_HXX //autogen
#include <svx/pageitem.hxx>
#endif
#ifndef _SVX_LRSPITEM_HXX //autogen
#include <svx/lrspitem.hxx>
#endif
#ifndef _SFXSTYLE_HXX //autogen
#include <svtools/style.hxx>
#endif
#ifndef _VCL_LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif

#ifndef _FMTORNT_HXX //autogen
#include <fmtornt.hxx>
#endif
#ifndef _TABCOL_HXX //autogen
#include <tabcol.hxx>
#endif

#ifndef _FMTFSIZE_HXX //autogen
#include <fmtfsize.hxx>
#endif
#ifndef _FMTHDFT_HXX //autogen
#include <fmthdft.hxx>
#endif
#ifndef _FMTPDSC_HXX //autogen
#include <fmtpdsc.hxx>
#endif
#ifndef _SWWVIEW_HXX //autogen
#include <wview.hxx>
#endif
#ifndef _UIITEMS_HXX
#include <uiitems.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _SWTYPES_HXX
#include <swtypes.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _UITOOL_HXX
#include <uitool.hxx>
#endif
#ifndef _PAGEDESC_HXX
#include <pagedesc.hxx>
#endif
#ifndef _FRMATR_HXX
#include <frmatr.hxx>
#endif
#ifndef _PARATR_HXX
#include <paratr.hxx>
#endif
#ifndef _FMTCOL_HXX
#include <fmtcol.hxx>
#endif
#ifndef _MODCFG_HXX
#include <modcfg.hxx>
#endif
#ifndef _POOLFMT_HXX
#include <poolfmt.hxx>
#endif

#ifndef _ERROR_H
#include <error.h>
#endif
#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif
#ifndef _UTLUI_HRC
#include <utlui.hrc>
#endif
#ifndef _DOC_HXX //autogen wg. SwDoc
#include <doc.hxx>
#endif
#ifndef _DOCARY_HXX
#include <docary.hxx>
#endif
#ifndef _CHARFMT_HXX //autogen wg. SwCharFmt
#include <charfmt.hxx>
#endif

// 50 cm 28350
//
#define MAXHEIGHT 28350
#define MAXWIDTH  28350

/*--------------------------------------------------------------------
    Beschreibung: Allgemeine List von StringPointern
 --------------------------------------------------------------------*/


/*--------------------------------------------------------------------
    Beschreibung: Metric umschalten
 --------------------------------------------------------------------*/


void SetMetric(MetricFormatter& rCtrl, FieldUnit eUnit)
{
    SwTwips nMin = rCtrl.GetMin(FUNIT_TWIP);
    SwTwips nMax = rCtrl.GetMax(FUNIT_TWIP);

    rCtrl.SetUnit(eUnit);

    rCtrl.SetMin(nMin, FUNIT_TWIP);
    rCtrl.SetMax(nMax, FUNIT_TWIP);
}

/*--------------------------------------------------------------------
    Beschreibung:   Boxinfo-Attribut setzen
 --------------------------------------------------------------------*/


void PrepareBoxInfo(SfxItemSet& rSet, const SwWrtShell& rSh)
{
    SvxBoxInfoItem aBoxInfo;
    const SfxPoolItem *pBoxInfo;
    if ( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_BORDER_INNER,
                                        TRUE, &pBoxInfo))
        aBoxInfo = *(SvxBoxInfoItem*)pBoxInfo;

        // Tabellenvariante, wenn mehrere Tabellenzellen selektiert
    rSh.GetCrsr();                  //Damit GetCrsrCnt() auch das Richtige liefert
    aBoxInfo.SetTable          (rSh.IsTableMode() && rSh.GetCrsrCnt() > 1);
        // Abstandsfeld immer anzeigen
    aBoxInfo.SetDist           ((BOOL) TRUE);
        // Minimalgroesse in Tabellen und Absaetzen setzen
    aBoxInfo.SetMinDist        (rSh.IsTableMode() || rSh.GetSelectionType() & (SwWrtShell::SEL_TXT | SwWrtShell::SEL_TBL));
        // Default-Abstand immer setzen
    aBoxInfo.SetDefDist        (MIN_BORDER_DIST);
        // Einzelne Linien koennen nur in Tabellen DontCare-Status haben
    aBoxInfo.SetValid(VALID_DISABLE, !rSh.IsTableMode());

    rSet.Put(aBoxInfo);
}

/*--------------------------------------------------------------------
    Beschreibung:   Header Footer fuellen
 --------------------------------------------------------------------*/


void FillHdFt(SwFrmFmt* pFmt, const  SfxItemSet& rSet)
{
    SwAttrSet aSet(pFmt->GetAttrSet());
    aSet.Put(rSet);

    const SvxSizeItem& rSize = (const SvxSizeItem&)rSet.Get(SID_ATTR_PAGE_SIZE);
    const SfxBoolItem& rDynamic = (const SfxBoolItem&)rSet.Get(SID_ATTR_PAGE_DYNAMIC);

    // Groesse umsetzen
    //
    SwFmtFrmSize aFrmSize(rDynamic.GetValue() ? ATT_MIN_SIZE : ATT_FIX_SIZE,
                            rSize.GetSize().Width(),
                            rSize.GetSize().Height());
    aSet.Put(aFrmSize);
    pFmt->SetAttr(aSet);
}

/*--------------------------------------------------------------------
    Beschreibung:   PageDesc <-> in Sets wandeln und zurueck
 --------------------------------------------------------------------*/


void ItemSetToPageDesc(const SfxItemSet& rSet, SwPageDesc& rPageDesc,
                        SwWrtShell* pShell)
{
    SwFrmFmt& rMaster = rPageDesc.GetMaster();

    // alle allgemeinen Rahmen-Attribute uebertragen
    //
    rMaster.SetAttr(rSet);

    // PageData
    //
    if(rSet.GetItemState(SID_ATTR_PAGE) == SFX_ITEM_SET)
    {
        const SvxPageItem& rPageItem = (const SvxPageItem&)rSet.Get(SID_ATTR_PAGE);

        USHORT nUse = (USHORT)rPageItem.GetPageUsage();
        if(nUse & 0x04)
            nUse |= 0x03;
        if(nUse)
            rPageDesc.SetUseOn( (UseOnPage) nUse );
        rPageDesc.SetLandscape(rPageItem.IsLandscape());
        SwNumType aNumType;
        aNumType.eType = (SvxExtNumType)rPageItem.GetNumType();
        rPageDesc.SetNumType(aNumType);
    }
    // Groesse
    //
    if(rSet.GetItemState(SID_ATTR_PAGE_SIZE) == SFX_ITEM_SET)
    {
        const SvxSizeItem& rSizeItem = (const SvxSizeItem&)rSet.Get(SID_ATTR_PAGE_SIZE);
        SwFmtFrmSize aSize(ATT_FIX_SIZE);
        aSize.SetSize(rSizeItem.GetSize());
        rMaster.SetAttr(aSize);
    }
    // Kopzeilen-Attribute auswerten
    //
    const SfxPoolItem* pItem;
    if( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_PAGE_HEADERSET,
            FALSE, &pItem ) )
    {
        const SfxItemSet& rHeaderSet = ((SvxSetItem*)pItem)->GetItemSet();
        const SfxBoolItem& rHeaderOn = (const SfxBoolItem&)rHeaderSet.Get(SID_ATTR_PAGE_ON);

        if(rHeaderOn.GetValue())
        {
            // Werte uebernehmen
            if(!rMaster.GetHeader().IsActive())
                rMaster.SetAttr(SwFmtHeader(TRUE));

            // Das Headerformat rausholen und anpassen
            //
            SwFmtHeader aHeaderFmt(rMaster.GetHeader());
            SwFrmFmt *pHeaderFmt = aHeaderFmt.GetHeaderFmt();
            ASSERT(pHeaderFmt != 0, "kein HeaderFormat");

            ::FillHdFt(pHeaderFmt, rHeaderSet);

            rPageDesc.ChgHeaderShare(((const SfxBoolItem&)
                        rHeaderSet.Get(SID_ATTR_PAGE_SHARED)).GetValue());
        }
        else
        {   // Header ausschalten
            //
            if(rMaster.GetHeader().IsActive())
            {
                rMaster.SetAttr(SwFmtHeader(BOOL(FALSE)));
                rPageDesc.ChgHeaderShare(FALSE);
            }
        }
    }

    // Fusszeilen-Attribute auswerten
    //
    if( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_PAGE_FOOTERSET,
            FALSE, &pItem ) )
    {
        const SfxItemSet& rFooterSet = ((SvxSetItem*)pItem)->GetItemSet();
        const SfxBoolItem& rFooterOn = (const SfxBoolItem&)rFooterSet.Get(SID_ATTR_PAGE_ON);

        if(rFooterOn.GetValue())
        {
            // Werte uebernehmen
            if(!rMaster.GetFooter().IsActive())
                rMaster.SetAttr(SwFmtFooter(TRUE));

            // Das Footerformat rausholen und anpassen
            //
            SwFmtFooter aFooterFmt(rMaster.GetFooter());
            SwFrmFmt *pFooterFmt = aFooterFmt.GetFooterFmt();
            ASSERT(pFooterFmt != 0, "kein FooterFormat");

            ::FillHdFt(pFooterFmt, rFooterSet);

            rPageDesc.ChgFooterShare(((const SfxBoolItem&)
                        rFooterSet.Get(SID_ATTR_PAGE_SHARED)).GetValue());
        }
        else
        {   // Footer ausschalten
            //
            if(rMaster.GetFooter().IsActive())
            {
                rMaster.SetAttr(SwFmtFooter(BOOL(FALSE)));
                rPageDesc.ChgFooterShare(FALSE);
            }
        }
    }

    // Fussnoten
    //
    if( SFX_ITEM_SET == rSet.GetItemState( FN_PARAM_FTN_INFO,
            FALSE, &pItem ) )
        rPageDesc.SetFtnInfo( ((SwPageFtnInfoItem*)pItem)->GetPageFtnInfo() );


    //
    // Columns
    //

    // Registerhaltigkeit

    if(SFX_ITEM_SET == rSet.GetItemState(
                            SID_SWREGISTER_MODE, FALSE, &pItem))
    {
        BOOL bSet = ((const SfxBoolItem*)pItem)->GetValue();
        if(!bSet)
            rPageDesc.SetRegisterFmtColl(0);
        else if(SFX_ITEM_SET == rSet.GetItemState(
                                SID_SWREGISTER_COLLECTION, FALSE, &pItem))
        {
            String sColl = ((const SfxStringItem*)pItem)->GetValue();
            SwTxtFmtColl* pColl = pShell->GetParaStyle( sColl,
                                SwWrtShell::GETSTYLE_CREATEANY );
            if(!rPageDesc.GetRegisterFmtColl())
            {
                SwRegisterItem aSet(TRUE);
                pColl->SetAttr( aSet );
            }
            rPageDesc.SetRegisterFmtColl(pColl);
        }
    }
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


void PageDescToItemSet( const SwPageDesc& rPageDesc, SfxItemSet& rSet)
{
    const SwFrmFmt& rMaster = rPageDesc.GetMaster();

    // Seitendaten
    //
    SvxPageItem aPageItem(SID_ATTR_PAGE);
    aPageItem.SetDescName(rPageDesc.GetName());
    aPageItem.SetPageUsage((SvxPageUsage)rPageDesc.GetUseOn());
    aPageItem.SetLandscape(rPageDesc.GetLandscape());
    aPageItem.SetNumType((SvxNumType)rPageDesc.GetNumType().eType);
    rSet.Put(aPageItem);

    // Groesse
    SvxSizeItem aSizeItem(SID_ATTR_PAGE_SIZE, rMaster.GetFrmSize().GetSize());
    rSet.Put(aSizeItem);

    // Maximale Groesse
    SvxSizeItem aMaxSizeItem(SID_ATTR_PAGE_MAXSIZE, Size(MAXWIDTH, MAXHEIGHT));
    rSet.Put(aMaxSizeItem);

    // Raender, Umrandung und das andere Zeug
    //
    rSet.Put(rMaster.GetAttrSet());

    SvxBoxInfoItem aBoxInfo;
    const SfxPoolItem *pBoxInfo;
    if ( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_BORDER_INNER,
                                            TRUE, &pBoxInfo) )
        aBoxInfo = *(SvxBoxInfoItem*)pBoxInfo;

    aBoxInfo.SetTable( FALSE );
        // Abstandsfeld immer anzeigen
    aBoxInfo.SetDist( TRUE);
        // Minimalgroesse in Tabellen und Absaetzen setzen
    aBoxInfo.SetMinDist( FALSE );
    // Default-Abstand immer setzen
    aBoxInfo.SetDefDist( MIN_BORDER_DIST );
        // Einzelne Linien koennen nur in Tabellen DontCare-Status haben
    aBoxInfo.SetValid( VALID_DISABLE );
    rSet.Put( aBoxInfo );


    SfxStringItem aFollow(SID_ATTR_PAGE_EXT1, aEmptyStr);
    if(rPageDesc.GetFollow())
        aFollow.SetValue(rPageDesc.GetFollow()->GetName());
    rSet.Put(aFollow);

    // Header
    //
    if(rMaster.GetHeader().IsActive())
    {
        const SwFmtHeader &rHeaderFmt = rMaster.GetHeader();
        const SwFrmFmt *pHeaderFmt = rHeaderFmt.GetHeaderFmt();
        ASSERT(pHeaderFmt != 0, kein HeaderFormat.);

        // HeaderInfo, Raender, Hintergrund, Umrandung
        //
        SfxItemSet aHeaderSet( *rSet.GetPool(),
                    SID_ATTR_PAGE_ON,       SID_ATTR_PAGE_SHARED,
                    SID_ATTR_PAGE_SIZE,     SID_ATTR_PAGE_SIZE,
                    SID_ATTR_BORDER_INNER,  SID_ATTR_BORDER_INNER,
                    RES_FRMATR_BEGIN,       RES_FRMATR_END-1,
                    0);

        // dynamische oder feste Hoehe
        //
        SfxBoolItem aOn(SID_ATTR_PAGE_ON, TRUE);
        aHeaderSet.Put(aOn);

        const SwFmtFrmSize &rFrmSize = pHeaderFmt->GetFrmSize();
        const SwFrmSize eSizeType = rFrmSize.GetSizeType();
        SfxBoolItem aDynamic(SID_ATTR_PAGE_DYNAMIC, eSizeType != ATT_FIX_SIZE);
        aHeaderSet.Put(aDynamic);

        // Links gleich rechts
        //
        SfxBoolItem aShared(SID_ATTR_PAGE_SHARED, rPageDesc.IsHeaderShared());
        aHeaderSet.Put(aShared);

        // Groesse
        SvxSizeItem aSize(SID_ATTR_PAGE_SIZE, Size(rFrmSize.GetSize()));
        aHeaderSet.Put(aSize);

        // Rahmen-Attribute umschaufeln
        //
        aHeaderSet.Put(pHeaderFmt->GetAttrSet());
        aHeaderSet.Put( aBoxInfo );

        // SetItem erzeugen
        //
        SvxSetItem aSetItem(SID_ATTR_PAGE_HEADERSET, aHeaderSet);
        rSet.Put(aSetItem);
    }

    // Footer
    if(rMaster.GetFooter().IsActive())
    {
        const SwFmtFooter &rFooterFmt = rMaster.GetFooter();
        const SwFrmFmt *pFooterFmt = rFooterFmt.GetFooterFmt();
        ASSERT(pFooterFmt != 0, kein FooterFormat.);

        // FooterInfo, Raender, Hintergrund, Umrandung
        //
        SfxItemSet aFooterSet( *rSet.GetPool(),
                    SID_ATTR_PAGE_ON,       SID_ATTR_PAGE_SHARED,
                    SID_ATTR_PAGE_SIZE,     SID_ATTR_PAGE_SIZE,
                    SID_ATTR_BORDER_INNER,  SID_ATTR_BORDER_INNER,
                    RES_FRMATR_BEGIN,       RES_FRMATR_END-1,
                    0);

        // dynamische oder feste Hoehe
        //
        SfxBoolItem aOn(SID_ATTR_PAGE_ON, TRUE);
        aFooterSet.Put(aOn);

        const SwFmtFrmSize &rFrmSize = pFooterFmt->GetFrmSize();
        const SwFrmSize eSizeType = rFrmSize.GetSizeType();
        SfxBoolItem aDynamic(SID_ATTR_PAGE_DYNAMIC, eSizeType != ATT_FIX_SIZE);
        aFooterSet.Put(aDynamic);

        // Links gleich rechts
        //
        SfxBoolItem aShared(SID_ATTR_PAGE_SHARED, rPageDesc.IsFooterShared());
        aFooterSet.Put(aShared);

        // Groesse
        SvxSizeItem aSize(SID_ATTR_PAGE_SIZE, Size(rFrmSize.GetSize()));
        aFooterSet.Put(aSize);

        // Rahmen-Attribute umschaufeln
        //
        aFooterSet.Put(pFooterFmt->GetAttrSet());
        aFooterSet.Put( aBoxInfo );

        // SetItem erzeugen
        //
        SvxSetItem aSetItem(SID_ATTR_PAGE_FOOTERSET, aFooterSet);
        rSet.Put(aSetItem);
    }

    // Fussnoten einbauen
    //
    SwPageFtnInfo& rInfo = (SwPageFtnInfo&)rPageDesc.GetFtnInfo();
    SwPageFtnInfoItem aFtnItem(FN_PARAM_FTN_INFO, rInfo);
    rSet.Put(aFtnItem);

    // Registerhaltigkeit

    const SwTxtFmtColl* pCol = rPageDesc.GetRegisterFmtColl();
    SwRegisterItem aReg(pCol != 0);
    aReg.SetWhich(SID_SWREGISTER_MODE);
    rSet.Put(aReg);
    if(pCol)
        rSet.Put(SfxStringItem(SID_SWREGISTER_COLLECTION, pCol->GetName()));

}


/*--------------------------------------------------------------------
    Beschreibung:   DefaultTabs setzen
 --------------------------------------------------------------------*/


void MakeDefTabs(SwTwips nDefDist, SvxTabStopItem& rTabs)
{
    if( rTabs.Count() )
        return;
    {
        SvxTabStop aSwTabStop( nDefDist, SVX_TAB_ADJUST_DEFAULT );
        rTabs.Insert( aSwTabStop );
    }
}

/*--------------------------------------------------------------------
    Beschreibung:   Abstand zwischen zwei Tabs
 --------------------------------------------------------------------*/


USHORT GetTabDist(const SvxTabStopItem& rTabs)
{
    USHORT nDefDist;
    if( rTabs.Count() )
        nDefDist = (USHORT)( rTabs[0].GetTabPos() );
    else
        nDefDist = 1134;     // 2cm
    return nDefDist;
}


// erfrage ob im Set eine Sfx-PageDesc-Kombination vorliegt und returne diese
void SfxToSwPageDescAttr( const SwWrtShell& rShell, SfxItemSet& rSet )
{
    const SfxPoolItem* pItem;
    SwFmtPageDesc aPgDesc;

    BOOL bChanged = FALSE;
    // Seitennummer
    if(SFX_ITEM_SET == rSet.GetItemState(SID_ATTR_PARA_PAGENUM, FALSE, &pItem))
    {
        aPgDesc.SetNumOffset(((SfxUInt16Item*)pItem)->GetValue());
        bChanged = TRUE;
    }
    if( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_PARA_MODEL, FALSE, &pItem ))
    {
        const String& rDescName = ((SvxPageModelItem*)pItem)->GetValue();
        if( rDescName.Len() )   // kein Name -> PageDesc ausschalten!
        {
            // nur loeschen, wenn PageDesc eingschaltet wird!
            rSet.ClearItem( RES_BREAK );
            SwPageDesc* pDesc = ((SwWrtShell&)rShell).FindPageDescByName(
                                                    rDescName, TRUE );
            if( pDesc )
                pDesc->Add( &aPgDesc );
        }
        rSet.ClearItem( SID_ATTR_PARA_MODEL );
        bChanged = TRUE;
    }
    else
    {
        SfxItemSet aCoreSet(rShell.GetView().GetPool(), RES_PAGEDESC, RES_PAGEDESC );
        rShell.GetAttr( aCoreSet );
        if(SFX_ITEM_SET == aCoreSet.GetItemState( RES_PAGEDESC, TRUE, &pItem ) )
        {
            if( ((SwFmtPageDesc*)pItem)->GetPageDesc() )
            {
                ((SwFmtPageDesc*)pItem)->GetPageDesc()->Add(&aPgDesc);
            }
        }
    }


    if(bChanged)
        rSet.Put( aPgDesc );
}


// erfrage ob im Set eine Sfx-PageDesc-Kombination vorliegt und returne diese
void SwToSfxPageDescAttr( SfxItemSet& rCoreSet )
{
    const SfxPoolItem* pItem = 0;
    String aName;
    USHORT nPageNum = 0;
    BOOL bPut = TRUE;
    switch( rCoreSet.GetItemState( RES_PAGEDESC, TRUE, &pItem ) )
    {
    case SFX_ITEM_SET:
        {
            if( ((SwFmtPageDesc*)pItem)->GetPageDesc() )
            {
                aName = ((SwFmtPageDesc*)pItem)->GetPageDesc()->GetName();
                nPageNum = ((SwFmtPageDesc*)pItem)->GetNumOffset();
            }
            rCoreSet.ClearItem( RES_PAGEDESC );
            // Seitennummer
        }
        break;

    case SFX_ITEM_AVAILABLE:
        break;

    default:
        bPut = FALSE;
    }
    SfxUInt16Item aPageNum( SID_ATTR_PARA_PAGENUM, nPageNum );
    rCoreSet.Put( aPageNum );

    if(bPut)
        rCoreSet.Put( SvxPageModelItem( aName, TRUE, SID_ATTR_PARA_MODEL ) );
}

/*--------------------------------------------------------------------
    Beschreibung:   Metric ermitteln
 --------------------------------------------------------------------*/


FieldUnit   GetDfltMetric(BOOL bWeb)
{
    return SW_MOD()->GetModuleConfig()->GetMetric(bWeb);
}

/*--------------------------------------------------------------------
    Beschreibung:   Metric ermitteln
 --------------------------------------------------------------------*/


void    SetDfltMetric( FieldUnit eMetric, BOOL bWeb )
{
        SwModuleOptions* pCfg = SW_MOD()->GetModuleConfig();
        FieldUnit eOldMetric = pCfg->GetMetric(bWeb);
        if(eOldMetric != eMetric)
            pCfg->SetMetric(eMetric, bWeb);

        SwView* pTmpView = SwModule::GetFirstView();

        // fuer alle MDI-Fenster das Lineal umschalten
        while(pTmpView)
        {
            if(bWeb == (0 != PTR_CAST(SwWebView, pTmpView)))
            {
                pTmpView->ChangeVLinealMetric(eMetric);
                pTmpView->ChangeTabMetric(eMetric);
            }

            pTmpView = SwModule::GetNextView(pTmpView);
        }
}

/*-----------------15.07.97 10:49-------------------

--------------------------------------------------*/
// Umwandlung:  Sub(LibName.ModulName) -> LibName.ModulName.Sub
String ConvertMacroFormat(const String& rInput )
{
    String sTemp(rInput);
    USHORT nFound = sTemp.Search('(');
    USHORT nTokenCount = sTemp.GetTokenCount('.');
    String sMac(rInput);
    if( STRING_NOTFOUND != nFound || nTokenCount < 2)
    {
        if(nTokenCount < 2)
            nFound = sTemp.Len();
        // anderes Format: "Macro(Bibliothek.Modul)"
        sMac = sTemp.Copy(0, nFound);
        sTemp.Erase(0, nFound);
        if(sTemp.Len() > 2)
        {
            sMac.Insert('.', 0);
            sMac.Insert(sTemp.Copy(1, sTemp.Len() - 2), 0);
        }
    }
    return sMac;
}


BOOL GetFileFilterNameDlg( Window& rParent, String& rFileName,
                            String* pPassword, String* pFilterName,
                            SfxMedium** ppMedium )
{
    Window* pDefDlgParent = Application::GetDefDialogParent();
    Application::SetDefDialogParent( &rParent );
    SfxMedium* pMed = SFX_APP()->InsertDocumentDialog( 0, SwDocShell::Factory() );
    if( pMed )
    {
        if( pFilterName )
            *pFilterName = pMed->GetFilter()->GetFilterName();

        rFileName = URIHelper::SmartRelToAbs( pMed->GetName() );
        if( pPassword )
        {
            const SfxPoolItem* pItem;
            if( SFX_ITEM_SET == pMed->GetItemSet()->GetItemState(
                                    SID_PASSWORD, FALSE, &pItem ) )
                *pPassword = ((SfxStringItem*)pItem)->GetValue();
        }

        if( ppMedium )
            *ppMedium = pMed;
        else
            delete pMed;        // das brauchen wir nicht mehr !
    }
    Application::SetDefDialogParent( pDefDlgParent );
    return 0 != pMed;
}

/*-----------------09.04.98 16:58-------------------

--------------------------------------------------*/
USHORT InsertStringSorted(const String& rEntry, ListBox& rToFill, BOOL bHasOffset, const International& rInt)
{
    USHORT i = bHasOffset ? 1 : 0;
    for(; i < rToFill.GetEntryCount(); i++)
    {
        String sTemp(rToFill.GetEntry(i));
        if(COMPARE_GREATER == rInt.Compare(sTemp, rEntry))
            break;
    }
    return rToFill.InsertEntry(rEntry, i);
}
void FillCharStyleListBox(ListBox& rToFill, SwDocShell* pDocSh, BOOL bSorted)
{
    BOOL bHasOffset = rToFill.GetEntryCount() > 0;
    SfxStyleSheetBasePool* pPool = pDocSh->GetStyleSheetPool();
    pPool->SetSearchMask(SFX_STYLE_FAMILY_CHAR, SFXSTYLEBIT_ALL);
    SwDoc* pDoc = pDocSh->GetDoc();
    const International& rInt = Application::GetAppInternational();
    const SfxStyleSheetBase* pBase = pPool->First();
    String sStandard; GetDocPoolNm( RES_POOLCOLL_STANDARD, sStandard );
    while(pBase)
    {
        if(pBase->GetName() !=  sStandard)
        {
            USHORT nPos;
            if(bSorted)
                nPos = InsertStringSorted(pBase->GetName(), rToFill, bHasOffset, rInt);
            else
                nPos = rToFill.InsertEntry(pBase->GetName());
            long nPoolId = pDoc->GetPoolId( pBase->GetName(), GET_POOLID_CHRFMT );
            rToFill.SetEntryData( nPos, (void*) (nPoolId));
        }
        pBase = pPool->Next();
    }
    // non-pool styles
    const SwCharFmts* pFmts = pDoc->GetCharFmts();
    for(USHORT i = 0; i < pFmts->Count(); i++)
    {
        const SwCharFmt* pFmt = (*pFmts)[i];
        if(pFmt->IsDefault())
            continue;
        const String& rName = pFmt->GetName();
        if(rToFill.GetEntryPos(rName) == LISTBOX_ENTRY_NOTFOUND)
        {
            USHORT nPos;
            if(bSorted)
                nPos = InsertStringSorted(rName, rToFill, bHasOffset, rInt);
            else
                nPos = rToFill.InsertEntry(rName);
            long nPoolId = USHRT_MAX;
            rToFill.SetEntryData( nPos, (void*) (nPoolId));
        }
    }
};

/* -----------------27.04.98 08:26-------------------
 *
 * --------------------------------------------------*/
SwTwips GetTableWidth( SwFrmFmt* pFmt, SwTabCols& rCols, USHORT *pPercent,
            SwWrtShell* pSh )
{
    //Die Breite zu besorgen ist etwas komplizierter.
    SwTwips nWidth;
    const SwHoriOrient eOri = pFmt->GetHoriOrient().GetHoriOrient();
    switch(eOri)
    {
        case HORI_FULL: nWidth = rCols.GetRight(); break;
        case HORI_LEFT_AND_WIDTH:
        case HORI_LEFT:
        case HORI_RIGHT:
        case HORI_CENTER:
            nWidth = pFmt->GetFrmSize().GetWidth();
        break;
        default:
        {
            if(pSh)
            {
                const SwFrmFmt *pFlyFmt;
                if ( 0 == (pFlyFmt = pSh->GetFlyFrmFmt()) )
                {
                    nWidth = pSh->GetAnyCurRect(RECT_PAGE_PRT).Width();
                }
                else
                {
                    nWidth = pSh->GetAnyCurRect(RECT_FLY_PRT_EMBEDDED).Width();
                }
            }
            else
            {
                DBG_ERROR("wo soll die Breite denn herkommen?")
            }
            const SvxLRSpaceItem& rLRSpace = pFmt->GetLRSpace();
            nWidth -= (rLRSpace.GetRight() + rLRSpace.GetLeft());
        }
    }
    if (pPercent)
        *pPercent = pFmt->GetFrmSize().GetWidthPercent();
    return nWidth;
}

/*------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.124  2000/09/18 16:06:19  willem.vandorp
    OpenOffice header added.

    Revision 1.123  2000/08/25 10:13:03  os
    #77214# sorted insert into a ListBox

    Revision 1.122  2000/07/26 16:33:54  jp
    use the new function GetDocPoolNm to get the collectionames

    Revision 1.121  2000/06/26 13:05:24  os
    INetURLObject::SmartRelToAbs removed

    Revision 1.120  2000/06/19 12:10:36  os
    #71623# FillCharStyleListBox: optional sorted insertion

    Revision 1.119  2000/06/07 13:28:53  os
    CutPath removed

    Revision 1.118  2000/04/26 15:03:20  os
    GetName() returns const String&

    Revision 1.117  2000/04/18 15:14:09  os
    UNICODE

    Revision 1.116  2000/03/03 15:17:05  os
    StarView remainders removed

    Revision 1.115  2000/02/11 15:00:54  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.114  1999/12/17 12:35:29  os
    #70529# dont't insert default char format

    Revision 1.113  1999/08/23 07:48:54  OS
    #61218# correct handling of left_and_width oriented tables


      Rev 1.112   23 Aug 1999 09:48:54   OS
   #61218# correct handling of left_and_width oriented tables

      Rev 1.111   02 Jul 1999 16:23:18   OS
   FillCharStyleListBox: SetPoolId as UserData

      Rev 1.110   05 Feb 1999 17:45:48   JP
   Task #61467#/#61014#: neu FindPageDescByName

      Rev 1.109   17 Nov 1998 10:59:12   OS
   #58263# NumType durch SvxExtNumType ersetzt

      Rev 1.108   12 Nov 1998 15:07:28   JP
   Bug #54342#: auch bei GlobalDocs das Filepasswort an die Section uebertragen

      Rev 1.107   08 Sep 1998 17:05:48   OS
   #56134# Metric fuer Text und HTML getrennt

      Rev 1.106   28 Apr 1998 09:14:52   OS
   GetTableWidth() verschoben

      Rev 1.105   15 Apr 1998 14:32:12   OS
   ::FillCharStyleListBox

      Rev 1.104   17 Feb 1998 09:03:56   TJ
   include

      Rev 1.103   13 Feb 1998 14:17:12   JP
   neu: globale Funktion zum rufen des InserDocDialog

      Rev 1.102   29 Nov 1997 15:08:58   MA
   includes

      Rev 1.101   21 Nov 1997 12:10:16   MA
   includes

      Rev 1.100   03 Nov 1997 13:59:22   MA
   precomp entfernt

      Rev 1.99   30 Oct 1997 11:19:50   AMA
   Chg: Kein AutoFlag mehr an Break bzw. PageDesc-Attributen

      Rev 1.98   15 Aug 1997 12:16:08   OS
   chartar/frmatr/txtatr aufgeteilt

      Rev 1.97   11 Aug 1997 10:34:16   OS
   paraitem/frmitems/textitem aufgeteilt

      Rev 1.96   15 Jul 1997 11:33:04   OS
   Konvertierung von Basic-Namen: Sub(Lib.Modul) ->Lib.Modul.Sub

      Rev 1.95   08 Jul 1997 14:13:36   OS
   ConfigItems von der App ans Module

      Rev 1.94   03 Feb 1997 15:23:22   OS
   wird der PageDesc-Name nicht mitgeliefert, muss er von der Shell kommen

      Rev 1.93   30 Jan 1997 15:30:18   OS
   PageOffset des PageDesc an der richtigen Stelle setzen

      Rev 1.92   16 Jan 1997 10:28:56   OS
   GetDfltMetric: Modulmetric besorgen

      Rev 1.91   13 Jan 1997 16:53:02   OS
   TabStop am Module; Dynamische Kopf-/Fusszeilenhoehe

      Rev 1.90   03 Dec 1996 12:39:32   AMA
   Opt: Parameter aufgeraeumt, denn PageDescToItem benutzt keinen Drucker mehr

      Rev 1.89   24 Oct 1996 18:00:56   OS
   svxid fuer Registerhaltigkeit

      Rev 1.88   24 Oct 1996 16:55:22   JP
   Optimierung: Find...ByName

      Rev 1.87   28 Aug 1996 15:42:36   OS
   includes

      Rev 1.86   27 Jul 1996 10:54:00   OS
   RegisterItem benutzen

      Rev 1.85   24 Jul 1996 15:13:50   OS
   gfs. Register an der Absatzvorlage einschalten

      Rev 1.84   23 Jul 1996 16:07:48   OS
   ItemSetToPageDesc mit SwWrtsh*, Registerhaltigkeit

      Rev 1.83   25 Jun 1996 20:17:26   HJS
   includes

      Rev 1.82   06 Jun 1996 14:52:26   OS
   ClearItem erst aufrufen, wenn die Referenz nicht mehr gebraucht wird bug#28346#

      Rev 1.81   25 Mar 1996 16:22:36   AMA
   Opt: Auffuellen mit DefTabStops nur noch beim Abspeichern notwendig.

      Rev 1.80   21 Mar 1996 14:08:32   OM
   Umstellung 311

      Rev 1.79   18 Mar 1996 14:27:22   OS
   GetNextView an der App arbeitet nicht mehr mit static

      Rev 1.78   27 Feb 1996 12:13:04   OS
   neu: Get/SetDfltMetric

      Rev 1.77   04 Dec 1995 12:40:42   JP
   PageDescToItemSet: const PageDesc uebergeben

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/utlui/unotools.cxx b/sw/source/ui/utlui/unotools.cxx
new file mode 100644
index 0000000..20e172a
--- /dev/null
+++ b/sw/source/ui/utlui/unotools.cxx
@@ -0,0 +1,700 @@
/*************************************************************************
 *
 *  $RCSfile: unotools.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:50 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include <swtypes.hxx>
#include <globals.hrc>
#include <misc.hrc>

#include <utlui.hrc>
#include <unotools.hrc>
#ifndef _UNOTOOLS_HXX
#include <unotools.hxx>
#endif
#ifndef _UNOPRNMS_HXX
#include <unoprnms.hxx>
#endif

#ifndef _TOOLS_DEBUG_HXX //autogen
#include <tools/debug.hxx>
#endif

#ifndef _SV_MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif

#ifndef _COM_SUN_STAR_TEXT_XTEXTVIEWCURSORSUPPLIER_HPP_
#include <com/sun/star/text/XTextViewCursorSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_VIEW_XSCREENCURSOR_HPP_
#include <com/sun/star/view/XScreenCursor.hpp>
#endif
#ifndef _COM_SUN_STAR_VIEW_DOCUMENTZOOMTYPE_HPP_
#include <com/sun/star/view/DocumentZoomType.hpp>
#endif
#ifndef _COM_SUN_STAR_STYLE_XSTYLEFAMILIESSUPPLIER_HPP_
#include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_STYLE_XSTYLE_HPP_
#include <com/sun/star/style/XStyle.hpp>
#endif
#ifndef _COM_SUN_STAR_FRAME_XFRAME_HPP_
#include <com/sun/star/frame/XFrame.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXT_HPP_
#include <com/sun/star/text/XText.hpp>
#endif
#ifndef _COM_SUN_STAR_TEXT_XTEXTDOCUMENT_HPP_
#include <com/sun/star/text/XTextDocument.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_POSSIZE_HPP_
#include <com/sun/star/awt/PosSize.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_XWINDOW_HPP_
#include <com/sun/star/awt/XWindow.hpp>
#endif
#ifndef _COM_SUN_STAR_VIEW_XVIEWSETTINGSSUPPLIER_HPP_
#include <com/sun/star/view/XViewSettingsSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XNAMECONTAINER_HPP_
#include <com/sun/star/container/XNameContainer.hpp>
#endif
#ifndef _UNOTOOLS_PROCESSFACTORY_HXX_
#include <unotools/processfactory.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen wg. SfxDispatcher
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen wg. SfxStringItem
#include <svtools/stritem.hxx>
#endif
#ifndef _SFXAPP_HXX //autogen wg. SFX_APP
#include <sfx2/app.hxx>
#endif
#include <shellio.hxx>
#ifndef _SWDOCSH_HXX //autogen wg. SwDocShell
#include <docsh.hxx>
#endif
#ifndef _SWVIEW_HXX //autogen wg. SwView
#include <view.hxx>
#endif
#ifndef _WRTSH_HXX //autogen wg. SwWrtShell
#include <wrtsh.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _UNOOBJ_HXX
#include <unoobj.hxx>
#endif
#ifndef _UNOCRSR_HXX
#include <unocrsr.hxx>
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif


#define C2U(cChar) rtl::OUString::createFromAscii(cChar)
using namespace ::com::sun::star;
using namespace ::rtl;

/* -----------------09.06.99 14:39-------------------
 *
 * --------------------------------------------------*/
SwRenameXNamedDlg::SwRenameXNamedDlg(Window* pWin, uno::Reference< container::XNamed > & xN, uno::Reference< container::XNameAccess > & xNA) :
    ModalDialog(pWin, SW_RES(DLG_RENAME_XNAMED)),
   xNamed(xN),
   xNameAccess(xNA),
   aNewNameFT(this, ResId(FT_NEW_NAME)),
   aNewNameED(this, ResId(ED_NEW_NAME)),
   aNameGB(this, ResId(GB_NAME)),
   aOk(this, ResId(PB_OK)),
   aCancel(this, ResId(PB_CANCEL)),
   aHelp(this, ResId(PB_HELP))
{
    FreeResource();
    sRemoveWarning = String(SW_RES(STR_REMOVE_WARNING));

    String sTmp(GetText());
    sTmp += String(xNamed->getName());
    SetText(sTmp);

    aOk.SetClickHdl(LINK(this, SwRenameXNamedDlg, OkHdl));
    aNewNameED.SetModifyHdl(LINK(this, SwRenameXNamedDlg, ModifyHdl));
    aOk.Enable(sal_False);
}
/* -----------------09.06.99 15:34-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK(SwRenameXNamedDlg, OkHdl, OKButton*, pOk)
{
    try
    {
        xNamed->setName(aNewNameED.GetText());
    }
    catch(uno::RuntimeException&)
    {
        DBG_ERROR("Name wurde nicht geaendert")
    }
    EndDialog(RET_OK);
    return 0;
}
/* -----------------09.06.99 15:48-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK(SwRenameXNamedDlg, ModifyHdl, NoSpaceEdit*, pEdit)
{
    String sTmp(pEdit->GetText());

    // prevent from pasting illegal characters
    sal_uInt16 nLen = sTmp.Len();
    String sMsg;
    for(sal_uInt16 i = 0; i < pEdit->GetForbiddenChars().Len(); i++)
    {
        sal_uInt16 nTmpLen = sTmp.Len();
        sTmp.EraseAllChars(pEdit->GetForbiddenChars().GetChar(i));
        if(sTmp.Len() != nTmpLen)
            sMsg += pEdit->GetForbiddenChars().GetChar(i);
    }
    if(sTmp.Len() != nLen)
    {
        pEdit->SetText(sTmp);
        String sWarning(sRemoveWarning);
        sWarning += sMsg;
        InfoBox(this, sWarning).Execute();
    }

    aOk.Enable(sTmp.Len() && !xNameAccess->hasByName(sTmp)
    && (!xSecondAccess.is() || !xSecondAccess->hasByName(sTmp))
    && (!xThirdAccess.is() || !xThirdAccess->hasByName(sTmp))
    );
    return 0;
}
/************************************************************************

************************************************************************/
sal_Bool SwOneExampleFrame::bShowServiceNotAvailableMessage = sal_True;
/* -----------------27.07.99 15:26-------------------

 --------------------------------------------------*/
SwOneExampleFrame::SwOneExampleFrame(Window& rWin,
            sal_uInt32 nFlags,
            const Link* pInitializedLink,
            String* pURL) :
    aTopWindow(rWin.GetParent(), 0, this),
    pModuleView(SW_MOD()->GetView()),
    rWindow(rWin),
    aMenuRes(SW_RES(RES_FRMEX_MENU)),
    nStyleFlags(nFlags),
    bIsInitialized(sal_False),
    bServiceAvailable(sal_False)
{
    aTopWindow.SetPaintTransparent(sal_True);
    aTopWindow.SetPosSizePixel(rWin.GetPosPixel(), rWin.GetSizePixel());
    aTopWindow.SetZOrder( &rWin, WINDOW_ZORDER_FIRST );
    aTopWindow.Show();
    if(pInitializedLink)
        aInitializedLink = *pInitializedLink;

    rWin.Enable(sal_False);
    uno::Reference< lang::XMultiServiceFactory >
                                    xMgr = utl::getProcessServiceFactory();
    uno::Reference< uno::XInterface >  xInst = xMgr->createInstance( C2U("com.sun.star.frame.FrameControl") );
    _xControl = uno::Reference< awt::XControl >(xInst, uno::UNO_QUERY);
    if(_xControl.is())
    {
        uno::Reference< awt::XWindowPeer >  xParent( rWindow.GetComponentInterface() );

        uno::Reference< awt::XToolkit >  xToolkit( xMgr->createInstance( C2U("com.sun.star.awt.Toolkit") ), uno::UNO_QUERY );
        if(xToolkit.is())
        {
            _xControl->createPeer( xToolkit, xParent );
            uno::Reference< beans::XPropertySet >  xPrSet(xInst, uno::UNO_QUERY);
            uno::Any aURL;
            //
            // create new doc
            String sTempURL = String::CreateFromAscii("private:factory/swriter");
            if(pURL && pURL->Len())
                sTempURL = *pURL;
            aURL <<= OUString(sTempURL);

            uno::Sequence<beans::PropertyValue> aSeq(3);
            beans::PropertyValue* pValues = aSeq.getArray();
            pValues[0].Name = C2U("ReadOnly");
            BOOL bTrue = sal_True;
            pValues[0].Value.setValue(&bTrue, ::getBooleanCppuType());
            pValues[1].Name = C2U("OpenFlags");
            pValues[1].Value <<= C2U("-RB");
            pValues[2].Name = C2U("Referer");
            pValues[2].Value <<= C2U("private:user");
            uno::Any aArgs;
            aArgs.setValue(&aSeq, ::getCppuType((uno::Sequence<beans::PropertyValue>*)0));

            xPrSet->setPropertyValue( C2U("LoaderArguments"), aArgs );
            //save and set readonly???

            xPrSet->setPropertyValue(C2U("ComponentURL"), aURL);


            uno::Reference< awt::XWindow >  xWin( _xControl, uno::UNO_QUERY );
            Size aWinSize(rWindow.GetOutputSizePixel());
            xWin->setPosSize( 0, 0, aWinSize.Width(), aWinSize.Height(), awt::PosSize::SIZE );
            xWin->setVisible( sal_True );

            // the controller is asynchronously set
            aLoadedTimer.SetTimeoutHdl(LINK(this, SwOneExampleFrame, TimeoutHdl));
            aLoadedTimer.SetTimeout(500);
            aLoadedTimer.Start();
            bServiceAvailable = sal_True;
        }
    }
}
/* -----------------------------08.12.99 13:44--------------------------------

 ---------------------------------------------------------------------------*/
void SwOneExampleFrame::CreateErrorMessage(Window* pParent)
{
    if(SwOneExampleFrame::bShowServiceNotAvailableMessage)
    {
        String sInfo(SW_RES(STR_SERVICE_UNAVAILABLE));
        sInfo += String::CreateFromAscii("com.sun.star.frame.FrameControl");
        InfoBox(pParent, sInfo).Execute();
        SwOneExampleFrame::bShowServiceNotAvailableMessage = sal_False;
    }
}
/* -----------------27.07.99 15:26-------------------

 --------------------------------------------------*/
SwOneExampleFrame::~SwOneExampleFrame()
{
    _xCursor = 0;
    if(_xControl.is())
        _xControl->dispose();
    _xControl = 0;
    _xModel = 0;
    _xController = 0;
}
/* -----------------27.07.99 15:26-------------------

 --------------------------------------------------*/
IMPL_LINK( SwOneExampleFrame, TimeoutHdl, Timer*, pTimer )
{
    if(!_xControl.is())
        return 0;
    // now get the model
    uno::Reference< beans::XPropertySet >  xPrSet(_xControl, uno::UNO_QUERY);
    uno::Any aFrame = xPrSet->getPropertyValue(C2U("Frame"));
    uno::Reference< frame::XFrame >  xFrm = *(uno::Reference< frame::XFrame > *)aFrame.getValue();
    _xController = xFrm->getController();
    if(_xController.is())
    {
        _xModel = _xController->getModel();
        //now the ViewOptions should be set properly
        uno::Reference< view::XViewSettingsSupplier >  xSettings(_xController, uno::UNO_QUERY);
        uno::Reference< beans::XPropertySet >  xViewProps = xSettings->getViewSettings();
        uno::Any aSet;
        sal_Bool bTrue = sal_True;
        sal_Bool bFalse = sal_False;
        aSet.setValue(&bFalse, ::getBooleanCppuType()); xViewProps->setPropertyValue(C2U(UNO_NAME_SHOW_BREAKS              ), aSet);
        aSet.setValue(&bTrue, ::getBooleanCppuType());  xViewProps->setPropertyValue(C2U(UNO_NAME_SHOW_DRAWINGS             ), aSet);
        aSet.setValue(&bFalse, ::getBooleanCppuType()); xViewProps->setPropertyValue(C2U(UNO_NAME_SHOW_FIELD_COMMANDS       ), aSet);
        aSet.setValue(&bFalse, ::getBooleanCppuType()); xViewProps->setPropertyValue(C2U(UNO_NAME_SHOW_FOOTNOTE_BACKGROUND  ), aSet);
        aSet.setValue(&bTrue, ::getBooleanCppuType());  xViewProps->setPropertyValue(C2U(UNO_NAME_SHOW_GRAPHICS             ), aSet);
        aSet.setValue(&bFalse, ::getBooleanCppuType()); xViewProps->setPropertyValue(C2U(UNO_NAME_SHOW_HIDDEN_PARAGRAPHS    ), aSet);
        aSet.setValue(&bFalse, ::getBooleanCppuType()); xViewProps->setPropertyValue(C2U(UNO_NAME_SHOW_HIDDEN_TEXT          ), aSet);
        aSet.setValue(&bFalse, ::getBooleanCppuType()); xViewProps->setPropertyValue(C2U(UNO_NAME_SHOW_HORI_RULER              ), aSet);
        aSet.setValue(&bFalse, ::getBooleanCppuType()); xViewProps->setPropertyValue(C2U(UNO_NAME_SHOW_INDEX_MARK_BACKGROUND), aSet);
        aSet.setValue(&bFalse, ::getBooleanCppuType()); xViewProps->setPropertyValue(C2U(UNO_NAME_SHOW_PARA_BREAKS          ), aSet);
        aSet.setValue(&bFalse, ::getBooleanCppuType()); xViewProps->setPropertyValue(C2U(UNO_NAME_SHOW_PROTECTED_SPACES     ), aSet);
        aSet.setValue(&bFalse, ::getBooleanCppuType()); xViewProps->setPropertyValue(C2U(UNO_NAME_SHOW_SOFT_HYPHENS         ), aSet);
        aSet.setValue(&bFalse, ::getBooleanCppuType()); xViewProps->setPropertyValue(C2U(UNO_NAME_SHOW_SPACES               ), aSet);
        aSet.setValue(&bFalse, ::getBooleanCppuType()); xViewProps->setPropertyValue(C2U(UNO_NAME_SHOW_TABLE_BOUNDARIES     ), aSet);
        aSet.setValue(&bTrue, ::getBooleanCppuType());  xViewProps->setPropertyValue(C2U(UNO_NAME_SHOW_TABLES               ), aSet);
        aSet.setValue(&bFalse, ::getBooleanCppuType()); xViewProps->setPropertyValue(C2U(UNO_NAME_SHOW_TABSTOPS             ), aSet);
        aSet.setValue(&bFalse, ::getBooleanCppuType()); xViewProps->setPropertyValue(C2U(UNO_NAME_SHOW_TEXT_BOUNDARIES      ), aSet);
        aSet.setValue(&bTrue, ::getBooleanCppuType());  xViewProps->setPropertyValue(C2U(UNO_NAME_SHOW_TEXT_FIELD_BACKGROUND), aSet);
        aSet.setValue(&bFalse, ::getBooleanCppuType()); xViewProps->setPropertyValue(C2U(UNO_NAME_SHOW_VERT_RULER              ), aSet);
        sal_Bool bTemp = 0 !=(nStyleFlags&EX_SHOW_ONLINE_LAYOUT);
        aSet.setValue(&bTemp, ::getBooleanCppuType());
                xViewProps->setPropertyValue(C2U(UNO_NAME_SHOW_ONLINE_LAYOUT), aSet);

        if(0 ==(nStyleFlags&EX_SHOW_ONLINE_LAYOUT))
        {
            uno::Any aZoom; aZoom <<= (sal_Int16)view::DocumentZoomType::PAGE_WIDTH;
            xViewProps->setPropertyValue(C2U(UNO_NAME_ZOOM_TYPE), aZoom);
        }
        else
        {
            uno::Any aZoom;
            aZoom <<= (sal_Int16)view::DocumentZoomType::BY_VALUE;
            xViewProps->setPropertyValue(C2U(UNO_NAME_ZOOM_TYPE), aZoom);

            sal_Int16 nZoomValue = 50;
            if(EX_SHOW_BUSINESS_CARDS == nStyleFlags)
            {
                nZoomValue = 80;
            }
            aZoom <<= nZoomValue;
            xViewProps->setPropertyValue(C2U(UNO_NAME_ZOOM_VALUE), aZoom);
        }

        uno::Reference< text::XTextDocument >  xDoc(_xModel, uno::UNO_QUERY);
        uno::Reference< text::XText >  xText = xDoc->getText();
        _xCursor = xText->createTextCursor();
        uno::Reference< beans::XPropertySet >  xCrsrProp(_xCursor, uno::UNO_QUERY);
        uno::Any aPageStyle = xCrsrProp->getPropertyValue(C2U(UNO_NAME_PAGE_STYLE_NAME));
        OUString sPageStyle;
        aPageStyle >>= sPageStyle;
        uno::Reference< style::XStyleFamiliesSupplier >  xSSupp(xDoc, uno::UNO_QUERY);
        uno::Reference< container::XNameAccess >  xStyles = xSSupp->getStyleFamilies();
        uno::Any aPFamily = xStyles->getByName(C2U("PageStyles"));
        uno::Reference< container::XNameContainer >  xPFamily = *(uno::Reference< container::XNameContainer > *)aPFamily.getValue();
        if(sPageStyle.getLength())
        {
            uno::Any aPStyle = xPFamily->getByName(sPageStyle);
            uno::Reference< style::XStyle >  xPStyle = *(uno::Reference< style::XStyle > *)aPStyle.getValue();
            uno::Reference< beans::XPropertySet >  xPProp(xPStyle, uno::UNO_QUERY);
            uno::Any aSize = xPProp->getPropertyValue(C2U(UNO_NAME_SIZE));
            awt::Size aPSize = *(awt::Size*)aSize.getValue();
            //TODO: set page width to card width
            aPSize.Width = 10000;
            aSize.setValue(&aPSize, ::getCppuType((awt::Size*)0));
            xPProp->setPropertyValue(C2U(UNO_NAME_SIZE), aSize);
        }
        rWindow.Show();
        // can only be done here - the SFX changes the ScrollBar values
        aSet.setValue(&bFalse, ::getBooleanCppuType());     xViewProps->setPropertyValue(C2U(UNO_NAME_SHOW_HORI_SCROLL_BAR ), aSet);
        aSet.setValue(&bFalse, ::getBooleanCppuType());     xViewProps->setPropertyValue(C2U(UNO_NAME_SHOW_VERT_SCROLL_BAR ), aSet);

        bIsInitialized = sal_True;
        if(aInitializedLink.IsSet())
        {
                rWindow.Enable(sal_False, sal_True);
                //rWindow.Enable(sal_True, sal_False);
                   aInitializedLink.Call(this);
        }
        SW_MOD()->SetView(pModuleView);
    }
    else
        pTimer->Start();
    return 0;
}
/* -----------------------------27.12.99 09:59--------------------------------

 ---------------------------------------------------------------------------*/
void SwOneExampleFrame::ExecUndo()
{
    if(_xCursor.is())
    {
        uno::Reference< lang::XUnoTunnel > xTunnel(_xCursor, uno::UNO_QUERY);
        SwXTextCursor* pCrsr = xTunnel.is() ?
            (SwXTextCursor*)xTunnel->getSomething(SwXTextCursor::getUnoTunnelId()) : 0;

        if(pCrsr)
        {
            SwDoc* pDoc = pCrsr->GetCrsr()->GetDoc();
            SwEditShell* pSh = pDoc->GetEditShell();
            pSh->Undo();
            pDoc->ResetAttr(*pCrsr->GetCrsr());
        }
        else
        {
            _xCursor->gotoStart(sal_False);
            _xCursor->gotoEnd(sal_True);
            _xCursor->setString(OUString());
        }
    }
}
/* -----------------------------15.12.99 11:09--------------------------------

 ---------------------------------------------------------------------------*/
static const sal_Int16 nZoomValues[] =
{
    20,
    40,
    50,
    75,
    100
};
//---------------------------------------------------------------------------
#define ITEM_UP     100
#define ITEM_DOWN   200
#define ITEM_ZOOM   300

void SwOneExampleFrame::CreatePopup(const Point& rPt)
{
    PopupMenu aPop;
    PopupMenu aSubPop1;
    ResStringArray& rArr = aMenuRes.GetMenuArray();

    aPop.InsertItem(ITEM_UP,   rArr.GetString(rArr.FindIndex(ST_MENU_UP )));
    aPop.InsertItem(ITEM_DOWN, rArr.GetString(rArr.FindIndex(ST_MENU_DOWN )));

    Link aSelLk = LINK(this, SwOneExampleFrame, PopupHdl );
    aPop.SetSelectHdl(aSelLk);
    if(EX_SHOW_ONLINE_LAYOUT == nStyleFlags)
    {
        aPop.InsertItem(ITEM_ZOOM, rArr.GetString(rArr.FindIndex(ST_MENU_ZOOM   )));

        uno::Reference< view::XViewSettingsSupplier >  xSettings(_xController, uno::UNO_QUERY);
        uno::Reference< beans::XPropertySet >  xViewProps = xSettings->getViewSettings();

        uno::Any aZoom = xViewProps->getPropertyValue(C2U(UNO_NAME_ZOOM_VALUE));
        sal_Int16 nZoom;
        aZoom >>= nZoom;

        for(sal_uInt16 i = 0; i < 5; i++ )
        {
            String sTemp;
            sTemp = String::CreateFromInt32(nZoomValues[i]);
            sTemp += String::CreateFromAscii(" %");
            aSubPop1.InsertItem( ITEM_ZOOM + i + 1, sTemp);
            if(nZoom == nZoomValues[i])
                aSubPop1.CheckItem(ITEM_ZOOM + i + 1);
        }
        aPop.SetPopupMenu( ITEM_ZOOM, &aSubPop1 );
        aSubPop1.SetSelectHdl(aSelLk);
    }
    aPop.Execute( &aTopWindow, rPt );

}
/* -----------------------------15.12.99 11:09--------------------------------

 ---------------------------------------------------------------------------*/
IMPL_LINK(SwOneExampleFrame, PopupHdl, Menu*, pMenu )
{
    sal_uInt16 nId = pMenu->GetCurItemId();
    if( nId > ITEM_ZOOM && nId < ITEM_ZOOM + 100 )
    {
        sal_Int16 nZoom = nZoomValues[nId - ITEM_ZOOM - 1];
        uno::Reference< view::XViewSettingsSupplier >  xSettings(_xController, uno::UNO_QUERY);
        uno::Reference< beans::XPropertySet >  xViewProps = xSettings->getViewSettings();

        uno::Any aZoom;
        aZoom <<= nZoom;
        xViewProps->setPropertyValue(C2U(UNO_NAME_ZOOM_VALUE), aZoom);
        aZoom <<= (sal_Int16)view::DocumentZoomType::BY_VALUE;
        xViewProps->setPropertyValue(C2U(UNO_NAME_ZOOM_TYPE), aZoom);
    }
    else if(ITEM_UP == nId || ITEM_DOWN == nId)
    {
        uno::Reference< text::XTextViewCursorSupplier >  xCrsrSupp(_xController, uno::UNO_QUERY);
        uno::Reference< view::XScreenCursor >  xScrCrsr(xCrsrSupp->getViewCursor(), uno::UNO_QUERY);
        if(ITEM_UP == nId)
            xScrCrsr->screenUp();
        else
            xScrCrsr->screenDown();
    }
    return 0;
};
/* -----------------------------15.12.99 10:37--------------------------------

 ---------------------------------------------------------------------------*/
SwFrmCtrlWindow::SwFrmCtrlWindow(Window* pParent, WinBits nBits,
                                SwOneExampleFrame*  pFrame) :
    Window(pParent, nBits),
    pExampleFrame(pFrame)
{
}
/* -----------------------------15.12.99 09:57--------------------------------

 ---------------------------------------------------------------------------*/
void SwFrmCtrlWindow::Command( const CommandEvent& rCEvt )
{
    switch ( rCEvt.GetCommand() )
    {
        case COMMAND_CONTEXTMENU:
        {
            pExampleFrame->CreatePopup(rCEvt.GetMousePosPixel());
        }
        break;
        case COMMAND_WHEEL:
        case COMMAND_STARTAUTOSCROLL:
        case COMMAND_AUTOSCROLL:
        break;
        default:;
    }
}
/* -----------------------------15.12.99 12:57--------------------------------

 ---------------------------------------------------------------------------*/
MenuResource::MenuResource(const ResId& rResId) :
    Resource(rResId),
    aMenuArray(ResId(1))
{
    FreeResource();
}
/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.34  2000/09/18 16:06:19  willem.vandorp
    OpenOffice header added.

    Revision 1.33  2000/09/14 14:47:48  os
    #78770# CreateFromInt32

    Revision 1.32  2000/08/28 08:12:24  os
    #78015# Referer

    Revision 1.31  2000/07/20 15:05:48  kz
    properties renamed

    Revision 1.30  2000/07/03 08:55:07  jp
    must changes for VCL

    Revision 1.29  2000/06/07 13:19:19  os
    using UCB

    Revision 1.28  2000/05/19 13:03:45  os
    check interface in dtor

    Revision 1.27  2000/05/16 09:15:14  os
    project usr removed

    Revision 1.26  2000/04/18 15:14:09  os
    UNICODE

    Revision 1.25  2000/03/23 13:25:02  os
    #74334# create sub-popup within the same block as the main popup

    Revision 1.24  2000/03/23 07:51:11  os
    UNO III

    Revision 1.23  2000/03/06 15:47:51  os
    #73802# preview improved

    Revision 1.22  2000/03/03 15:17:05  os
    StarView remainders removed

    Revision 1.21  2000/02/11 15:01:13  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.20  2000/02/04 14:59:53  os
    #72599# mark current zoom level

    Revision 1.19  1999/12/29 07:52:04  os
    #71262# set zoom type first

    Revision 1.18  1999/12/27 10:46:07  os
    #71262# Undo in SwOneExampleFrame

    Revision 1.17  1999/12/17 14:50:57  os
    #70986# SwView of Example resets Module's view pointer

    Revision 1.16  1999/12/15 15:32:45  os
    #70234# ExampleFrame: OnlineLayout, ContextMenu, disabled

    Revision 1.15  1999/12/09 12:29:12  os
    #70284# show Bitmaps in hyperlink insert dialog# content.cxx glbltree.cxx navipi.hrc navipi.src

    Revision 1.14  1999/12/07 15:41:50  os
    #70574# old service names removed

    Revision 1.13  1999/11/29 15:53:21  os
    #70181# call dispose in dtor

    Revision 1.12  1999/11/25 15:47:10  os
    headers corrected

    Revision 1.11  1999/11/25 08:58:07  os
    hori scrollbar enabled

    Revision 1.10  1999/11/23 10:18:09  os
    header corrected

    Revision 1.9  1999/11/19 16:40:25  os
    modules renamed

    Revision 1.8  1999/11/10 14:58:55  os
    vertical scrollbar on

    Revision 1.7  1999/10/22 15:06:25  os
    user factory URL

    Revision 1.6  1999/10/01 12:02:27  os
    set bIsInitialized before calling the link

    Revision 1.5  1999/09/20 09:58:54  os
    local resources separated

    Revision 1.4  1999/07/28 11:07:38  OS
    new: SwOneExampleFrame


      Rev 1.3   28 Jul 1999 13:07:38   OS
   new: SwOneExampleFrame

      Rev 1.2   02 Jul 1999 11:10:08   OS
   #63003# NameWarning also in StarOne rename dialog

      Rev 1.1   25 Jun 1999 10:22:40   OS
   #67190# Names must be unique forall frames

      Rev 1.0   10 Jun 1999 09:51:46   OS
   SwRenameXNamedDialog

------------------------------------------------------------------------*/

diff --git a/sw/source/ui/utlui/unotools.hrc b/sw/source/ui/utlui/unotools.hrc
new file mode 100644
index 0000000..d3a4a38
--- /dev/null
+++ b/sw/source/ui/utlui/unotools.hrc
@@ -0,0 +1,75 @@
/*************************************************************************
 *
 *  $RCSfile: unotools.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:50 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _UNOTOOLS_HRC
#define _UNOTOOLS_HRC

#define FT_NEW_NAME         1
#define ED_NEW_NAME         2
#define GB_NAME             3
#define PB_OK               4
#define PB_HELP             5
#define PB_CANCEL           6

#define ST_MENU_ZOOM        1
#define ST_MENU_UP          2
#define ST_MENU_DOWN        3

#endif
diff --git a/sw/source/ui/utlui/unotools.src b/sw/source/ui/utlui/unotools.src
new file mode 100644
index 0000000..6cf8bbc
--- /dev/null
+++ b/sw/source/ui/utlui/unotools.src
@@ -0,0 +1,330 @@
/*************************************************************************
 *
 *  $RCSfile: unotools.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:50 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#include <unotools.hrc>
#include <utlui.hrc>
#include <globals.hrc>
#include <helpid.h>

ModalDialog DLG_RENAME_XNAMED
{
    HelpID = HID_RENAME_XNAMED ;
    OutputSize = TRUE ;
    SVLook = TRUE ;
    Size = MAP_APPFONT ( 180 , 60 ) ;
    Text = "Objekt umbenennen: " ;
    Text [ ENGLISH ] = "Rename object: " ;
    Moveable = TRUE ;
    FixedText FT_NEW_NAME
    {
        Pos = MAP_APPFONT ( 12 , 15 ) ;
        Size = MAP_APPFONT ( 50 , 10 ) ;
        Text = "Neuer Name" ;
        Text [ ENGLISH ] = "New name" ;
        Text[ english_us ] = "New name";
        Text[ portuguese ] = "Novo nome";
        Text[ russian ] = "Ïðèñâîèòü èìÿ";
        Text[ greek ] = "ÍÝï üíïìá";
        Text[ dutch ] = "Nieuwe naam";
        Text[ french ] = "Nouveau nom";
        Text[ spanish ] = "Nuevo nombre";
        Text[ italian ] = "Nome nuovo";
        Text[ danish ] = "Nyt navn";
        Text[ swedish ] = "Nytt namn";
        Text[ polish ] = "Nowa nazwa";
        Text[ portuguese_brazilian ] = "New name";
        Text[ japanese ] = "V‚µ‚¢–¼‘O";
        Text[ korean ] = "»õ À̸§";
        Text[ chinese_simplified ] = "ÐÂÃû³Æ";
        Text[ chinese_traditional ] = "·s¦WºÙ";
        Text[ arabic ] = "ÇáÇÓã ÇáÌÏíÏ";
        Text[ turkish ] = "Yeni ad";
        Text[ language_user1 ] = " ";
    };
    Edit ED_NEW_NAME
    {
        Pos = MAP_APPFONT ( 65 , 13 ) ;
        Size = MAP_APPFONT ( 50 , 12 ) ;
        Border = TRUE;
    };
    GroupBox GB_NAME
    {
        Pos = MAP_APPFONT ( 6 , 3 ) ;
        Size = MAP_APPFONT ( 115 , 54 ) ;
        Text = "Name ändern";
        Text [ ENGLISH ] = "Change name" ;
        Text[ english_us ] = "Change name";
        Text[ portuguese ] = "Mudar nome";
        Text[ russian ] = "Èçìåíèòü èìÿ";
        Text[ greek ] = "ÁëëáãÞ ïíüìáôïò";
        Text[ dutch ] = "Naam wijzigen";
        Text[ french ] = "Modifier le nom";
        Text[ spanish ] = "Cambiar nombre";
        Text[ italian ] = "Cambia nome";
        Text[ danish ] = "Modificer navn";
        Text[ swedish ] = "Ändra namn";
        Text[ polish ] = "Zmieñ nazwê";
        Text[ portuguese_brazilian ] = "Change name";
        Text[ japanese ] = "–¼‘O‚̕ύX";
        Text[ korean ] = "À̸§ º¯°æ";
        Text[ chinese_simplified ] = "¸ü¸ÄÃû³Æ";
        Text[ chinese_traditional ] = "Åܧó¦WºÙ";
        Text[ arabic ] = "ÊÚÏíá ÇáÇÓã";
        Text[ turkish ] = "Adý deðiþtir";
        Text[ language_user1 ] = " ";
    };
    OKButton PB_OK
    {
        Pos = MAP_APPFONT ( 124 , 6 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        Group = TRUE ;
        DefButton = TRUE ;
    };
    CancelButton PB_CANCEL
    {
        Pos = MAP_APPFONT ( 124 , 23 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        Group = TRUE ;
    };
    HelpButton PB_HELP
    {
        Pos = MAP_APPFONT ( 124 , 43 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        TabStop = TRUE ;
        Group = TRUE ;
    };
    Text[ english_us ] = "Rename object: ";
    Text[ portuguese ] = "Mudar nome do objecto: ";
    Text[ russian ] = "Ïåðåèìåíîâàòü îáúåêò:  ";
    Text[ greek ] = "Ìåôïíïìáóßá áíôéêåéìÝíïõ: ";
    Text[ dutch ] = "Objectnaam wijzigen: ";
    Text[ french ] = "Renommer l'objet :  ";
    Text[ spanish ] = "Cambiar nombre de objeto: ";
    Text[ italian ] = "Rinomina oggetto: ";
    Text[ danish ] = "Omdøb objekt: ";
    Text[ swedish ] = "Byt namn på objekt:  ";
    Text[ polish ] = "Zmieñ nazwê obiektu: ";
    Text[ portuguese_brazilian ] = "Rename object: ";
    Text[ japanese ] = "µÌÞ¼Þª¸Ä–¼‚̕ύX: ";
    Text[ korean ] = "°³Ã¼ À̸§ ¹Ù²Ù±â: ";
    Text[ chinese_simplified ] = "ÖØÃüÃû¶ÔÏó£º ";
    Text[ chinese_traditional ] = "­«·s©R¦Wª«¥ó¡G ";
    Text[ arabic ] = "ÅÚÇÏÉ ÊÓãíÉ ÇáßÇÆä: ";
    Text[ turkish ] = "Nesneyi yeniden adlandýr: ";
    Text[ language_user1 ] = " ";
};
String STR_SERVICE_UNAVAILABLE
{
    Text = "Der folgende Service ist nicht verfügbar: " ;
    Text [ English ] = "The following service is not available: " ;
    Text[ english_us ] = "The following service is not available: ";
    Text[ portuguese ] = "O seguinte serviço não está disponível: ";
    Text[ russian ] = "Ñëåäóþùàÿ ñëóæáà íå äîñòóïíà:  ";
    Text[ greek ] = "Ç áêüëïõèç õðçñåóßá äåí åßíáé äéáèÝóéìç: ";
    Text[ dutch ] = "De volgende service is niet beschikbaar:  ";
    Text[ french ] = "Le service suivant n'est pas disponible :  ";
    Text[ spanish ] = "El siguiente servicio no está disponible: ";
    Text[ italian ] = "Il seguente servizio non è disponibile. ";
    Text[ danish ] = "Følgende service er ikke tilgængelig: ";
    Text[ swedish ] = "Följande service är inte tillgänglig:  ";
    Text[ polish ] = "Nastêpuj¹cy serwis jest niedostêpny: ";
    Text[ portuguese_brazilian ] = "The following service is not available: ";
    Text[ japanese ] = "ŽŸ‚Ì»°ËÞ½‚ÍŽg—p‚Å‚«‚Ü‚¹‚ñ: ";
    Text[ korean ] = "´ÙÀ½ÀÇ ¼­ºñ½º´Â °¡´ÉÇÏÁö ¾Ê½À´Ï´Ù.: ";
    Text[ chinese_simplified ] = "²»´æÔÚÏÂÁзþÎñ¹¦ÄÜ£º ";
    Text[ chinese_traditional ] = "³o­ÓªA°È¥\\¯à¤£¦s¦b¡G ";
    Text[ arabic ] = "ÇáÎÏãÉ ÇáÊÇáíÉ ÛíÑ ãÊæÝÑÉ: ";
    Text[ turkish ] = "Aþaðýdaki hizmet kullanýlamýyor: ";
    Text[ language_user1 ] = " ";
};
Resource RES_FRMEX_MENU
{
    StringArray 1
    {
        ItemList =
        {
            < "~Maßstab" ;      ST_MENU_ZOOM; > ;
            < "Nach ~oben" ;    ST_MENU_UP;     > ;
            < "Nach ~unten" ;   ST_MENU_DOWN; > ;
        };
        ItemList [English]=
        {
            < "~Zoom" ; ST_MENU_ZOOM; > ;
            < "Go up" ; ST_MENU_UP; > ;
            < "Go down" ; ST_MENU_DOWN; > ;
        };
    ItemList [ language_user1 ] =
    {
            < " " ;         ST_MENU_ZOOM; > ;
        < "Nach ~oben" ;    ST_MENU_UP;     > ;
        < "Nach ~unten" ;   ST_MENU_DOWN; > ;
    };
    ItemList [ english_us ] =
    {
            < "~Zoom" ;         ST_MENU_ZOOM; > ;
        < "~Upwards" ;  ST_MENU_UP;     > ;
        < "Do~wnwards" ;    ST_MENU_DOWN; > ;
    };
    ItemList [ portuguese ] =
    {
            < "~Escala" ;       ST_MENU_ZOOM; > ;
        < "Para ~cima" ;    ST_MENU_UP;     > ;
        < "Para ~baixo" ;   ST_MENU_DOWN; > ;
    };
    ItemList [ russian ] =
    {
            < "~Ìàñøòàá" ;      ST_MENU_ZOOM; > ;
        < "Ââåðõ" ;     ST_MENU_UP;     > ;
        < "Âíèç" ;  ST_MENU_DOWN; > ;
    };
    ItemList [ greek ] =
    {
            < "Êëß~ìáêá" ;      ST_MENU_ZOOM; > ;
        < "Ðñ~ïò ôá ðÜíù" ;     ST_MENU_UP;     > ;
        < "Ðñïò ôá êÜôù" ;  ST_MENU_DOWN; > ;
    };
    ItemList [ dutch ] =
    {
            < "~Maatstaf" ;         ST_MENU_ZOOM; > ;
        < "Naar b~oven" ;   ST_MENU_UP;     > ;
        < "Naar be~neden" ;     ST_MENU_DOWN; > ;
    };
    ItemList [ french ] =
    {
            < "~Échelle" ;      ST_MENU_ZOOM; > ;
        < "Vers le ~haut" ;     ST_MENU_UP;     > ;
        < "Vers le ~bas" ;  ST_MENU_DOWN; > ;
    };
    ItemList [ spanish ] =
    {
            < "~Escala" ;       ST_MENU_ZOOM; > ;
        < "Hacia ~arriba" ;     ST_MENU_UP;     > ;
        < "Hacia a~bajo" ;  ST_MENU_DOWN; > ;
    };
    ItemList [ italian ] =
    {
            < "~Zoom" ;         ST_MENU_ZOOM; > ;
        < "In alt~o" ;  ST_MENU_UP;     > ;
        < "In basso" ;  ST_MENU_DOWN; > ;
    };
    ItemList [ danish ] =
    {
            < "~Målestok" ;         ST_MENU_ZOOM; > ;
        < "Opad" ;  ST_MENU_UP;     > ;
        < "Nedad" ;     ST_MENU_DOWN; > ;
    };
    ItemList [ swedish ] =
    {
            < "Skala" ;         ST_MENU_ZOOM; > ;
        < "Uppåt" ;     ST_MENU_UP;     > ;
        < "Nedåt" ;     ST_MENU_DOWN; > ;
    };
    ItemList [ polish ] =
    {
            < "~Skala" ;        ST_MENU_ZOOM; > ;
        < "Do góry" ;   ST_MENU_UP;     > ;
        < "Na dó³" ;    ST_MENU_DOWN; > ;
    };
    ItemList [ portuguese_brazilian ] =
    {
            < "~Maßstab" ;      ST_MENU_ZOOM; > ;
        < "Nach ~oben" ;    ST_MENU_UP;     > ;
        < "Nach ~unten" ;   ST_MENU_DOWN; > ;
    };
    ItemList [ japanese ] =
    {
            < "½Þ°Ñi~Zj" ;        ST_MENU_ZOOM; > ;
        < "ã‚Ö(~U)" ;  ST_MENU_UP;     > ;
        < "‰º‚Ö(~W)" ;  ST_MENU_DOWN; > ;
    };
    ItemList [ korean ] =
    {
            < "Ãà¼Ò/È®´ë(~Z)" ;         ST_MENU_ZOOM; > ;
        < "À§·Î(~U)" ;  ST_MENU_UP;     > ;
        < "¾Æ·¡·Î(~W)" ;    ST_MENU_DOWN; > ;
    };
    ItemList [ chinese_simplified ] =
    {
            < "±ÈÀý" ;      ST_MENU_ZOOM; > ;
        < "ÏòÉÏ" ;  ST_MENU_UP;     > ;
        < "ÏòÏÂ" ;  ST_MENU_DOWN; > ;
    };
    ItemList [ chinese_traditional ] =
    {
            < "Åã¥Ü¤ñ¨Ò" ;      ST_MENU_ZOOM; > ;
        < "¦V¤W" ;  ST_MENU_UP;     > ;
        < "¦V¤U" ;  ST_MENU_DOWN; > ;
    };
    ItemList [ arabic ] =
    {
            < "ÊßÈíÑ/ÊÕÛíÑ" ;       ST_MENU_ZOOM; > ;
        < "Åáì ÃÚáì" ;  ST_MENU_UP;     > ;
        < "Åáì ÃÓÝá" ;  ST_MENU_DOWN; > ;
    };
    ItemList [ turkish ] =
    {
            < "~Yakýnlaþtýr" ;      ST_MENU_ZOOM; > ;
        < "Y~ukarý" ;   ST_MENU_UP;     > ;
        < "A~þaðý" ;    ST_MENU_DOWN; > ;
    };
    };
};
diff --git a/sw/source/ui/utlui/utlui.src b/sw/source/ui/utlui/utlui.src
new file mode 100644
index 0000000..de8f233
--- /dev/null
+++ b/sw/source/ui/utlui/utlui.src
@@ -0,0 +1,1624 @@
/*************************************************************************
 *
 *  $RCSfile: utlui.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:50 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#include "globals.hrc"
#include "utlui.hrc"
#include "helpid.h"
#include "comcore.hrc"


Resource RID_SHELLRES_AUTOFMTSTRS
{
    String STR_AUTOFMTREDL_DEL_EMPTY_PARA+1
    {
        Text = "Leere Absätze entfernen" ;
        Text [ English ] = "Remove empty paragraphs" ;
        Text [ english_us ] = "Remove empty paragraphs" ;
        Text [ swedish ] = "Ta bort tomma stycken" ;
        Text [ danish ] = "Fjern tomme afsnit" ;
        Text [ italian ] = "Elimina paragrafi vuoti" ;
        Text [ spanish ] = "Eliminar párrafos vacíos" ;
        Text [ french ] = "Supprimer les paragraphes vides" ;
        Text [ dutch ] = "Lege alinea´s verwijderen" ;
        Text [ portuguese_brazilian ] = "Leere Absätze entfernen" ;
        Text [ portuguese ] = "Remover parágrafos vazios" ;
        Text[ chinese_simplified ] = "ɾ³ý¿Õ°×¶ÎÂä";
        Text[ russian ] = "Óäàëèòü ïóñòûå àáçàöû";
        Text[ polish ] = "Usuñ puste akapity";
        Text[ japanese ] = "‹ó‚Ì’i—Ž‚ðíœ";
        Text[ chinese_traditional ] = "§R°£ªÅ¥Õ¬q¸¨";
        Text[ arabic ] = "ÅÒÇáÉ ÇáÝÞÑÇÊ ÇáÝÇÑÛÉ";
        Text[ greek ] = "ÄéáãñáöÞ êåíþí ðáñáãñÜöùí";
        Text[ korean ] = "ºó ´Ü¶ô Á¦°Å";
        Text[ turkish ] = "Boþ paragraflarý kaldýr";
        Text[ language_user1 ] = " ";
    };
    String STR_AUTOFMTREDL_USE_REPLACE+1
    {
        Text = "Ersetzungstabelle anwenden" ;
        Text [ English ] = "Apply replacement table" ;
        Text [ english_us ] = "Use replacement table" ;
        Text [ swedish ] = "Använd ersättningstabell" ;
        Text [ danish ] = "Anvend erstatningstabel" ;
        Text [ italian ] = "Applica tabella delle sostituzioni" ;
        Text [ spanish ] = "Usar tabla de sustitución" ;
        Text [ french ] = "Utiliser la table de remplacement" ;
        Text [ dutch ] = "Vervangingstabel gebruiken" ;
        Text [ portuguese_brazilian ] = "Ersetzungstabelle anwenden" ;
        Text [ portuguese ] = "Aplicar tabela de substituição" ;
        Text[ chinese_simplified ] = "ʹÓøüÌæ±í¸ñ";
        Text[ russian ] = "Ïðèìåíèòü òàáëèöó çàìåí";
        Text[ polish ] = "U¿yj tabeli zamian";
        Text[ japanese ] = "’uŠ·Ã°ÌÞق̎g—p";
        Text[ chinese_traditional ] = "¨Ï¥Î¥N´Àªí";
        Text[ arabic ] = "ÇÓÊÎÏÇã ÞÇÆãÉ ÇáÇÓÊÈÏÇá";
        Text[ greek ] = "ÅöáñìïãÞ ðßíáêá áíôéêáôÜóôáóçò";
        Text[ korean ] = "´ëü Ç¥ Àû¿ë";
        Text[ turkish ] = "Deðiþtirme tablosunu kullan";
        Text[ language_user1 ] = " ";
    };
    String STR_AUTOFMTREDL_CPTL_STT_WORD+1
    {
        /* ### ACHTUNG: Neuer Text in Resource? ZWei Großbuchstaben am WOrtanfang korrigieren : ZWei Gro˜buchstaben am WOrtanfang korrigieren */
        Text = "ZWei Großbuchstaben am WOrtanfang korrigieren" ;
        Text [ ENGLISH ] = "REplace two Capital Letters at the WOrd beginning" ;
        Text [ norwegian ] = "ERstatt to Store Bokstaver i begynnelsen av ORd" ;
        Text [ italian ] = "COrreggi la doppia MAiuscola ad inizio PArola" ;
        Text [ portuguese_brazilian ] = "SUbstituir duas Letras Maiosculas no in¡cio da Palavra" ;
        Text [ portuguese ] = "COrrigir duas maiúsculas no INício da palavra" ;
        Text [ finnish ] = "Korvaa kaksi ISoa kirjainta sanan alussa" ;
        Text [ danish ] = "REt andet bogstav i ORd til lille" ;
        Text [ french ] = "COrriger la 2e majuscule en DÉbut de mot" ;
        Text [ swedish ] = "KOrrigera två versaler i BÖrjan av ordet" ;
        Text [ dutch ] = "TWee hoofdletters aan WOordbegin corrigeren" ;
        Text [ spanish ] = "Corregir DOs MAyúsculas a principio de PAlabra" ;
        Text [ english_us ] = "Correct TWo INitial CApitals" ;
        Text[ chinese_simplified ] = "¸üÕý×ÖÊ×Ë«ÖØ´óд×Öĸ";
        Text[ russian ] = "Èñïðàâëÿòü ÄÂå ÏÐîïèñíûå áóêâû â íà÷àëå ñëîâà";
        Text[ polish ] = "Poprawiaj DWa POcz¹tkowe WErsaliki";
        Text[ japanese ] = "2•¶Žš–Ú‚ð¬•¶Žš‚É‚·‚é";
        Text[ chinese_traditional ] = "®Õ¥¿¦r­ºÂù¤j¼g¦r¥À";
        Text[ arabic ] = "ÊÕÍíÍ ÍÑÝíä ÇÓÊåáÇáííä Ýí ÈÏÇíÉ ÇáßáãÉ";
        Text[ greek ] = "Äéüñèùóç ÄÕï êåöáëáßùí ãñáììÜôùí óôçí ÁÑ÷Þ ôçò ëÝîçò";
        Text[ korean ] = "´Ü¾î óÀ½ÀÇ µÎ ´ë¹®ÀÚ ¼öÁ¤";
        Text[ turkish ] = "SÖzcük baþýndaki ÝKi büyük harfi düzelt";
        Text[ language_user1 ] = " ";
    };
    String STR_AUTOFMTREDL_CPTL_STT_SENT+1
    {
        /* ### ACHTUNG: Neuer Text in Resource? Jeden Satz mit einem Großbuchstaben beginnen : Jeden Satz mit einem Gro˜buchstaben beginnen */
        Text = "Jeden Satz mit einem Großbuchstaben beginnen" ;
        Text [ ENGLISH ] = "Start each Sentence with a Capital Letter" ;
        Text [ norwegian ] = "Begynn hver Setning med Stor Bokstav" ;
        Text [ italian ] = "Inizia ogni frase con la maiuscola" ;
        Text [ portuguese_brazilian ] = "Iniciar cada Sentença com uma Letra Maioscula" ;
        Text [ portuguese ] = "Iniciar todas as frases com uma letra maiúscula" ;
        Text [ finnish ] = "Aloita jokainen virke isolla kirjaimella" ;
        Text [ danish ] = "Første bogstav i sætninger med stort" ;
        Text [ french ] = "Majuscule en début de phrase" ;
        Text [ swedish ] = "Börja varje mening med en versal" ;
        Text [ dutch ] = "Elke zin met een hoofdletter beginnen" ;
        Text [ spanish ] = "Iniciar cada frase con una letra mayúscula" ;
        Text [ english_us ] = "Capitalize first letter of sentences" ;
        Text[ chinese_simplified ] = "ÿ¸ö¾äÊײÉÓôóд×Öĸ";
        Text[ russian ] = "Íà÷èíàòü êàæäîå ïðåäëîæåíèå ñ ïðîïèñíîé áóêâû";
        Text[ polish ] = "Pocz¹tek zdania z du¿ej litery";
        Text[ japanese ] = "‚·‚ׂĂ̕¶‚ð‘å•¶Žš‚ÅŽn‚ß‚é";
        Text[ chinese_traditional ] = "¨C­Ó¥y­º±Ä¥Î¤j¼g¦r¥À";
        Text[ arabic ] = "ÈÏÁ ßá ÌãáÉ ÈÍÑÝ ÇÓÊåáÇáí";
        Text[ greek ] = "Åêêßíçóç êÜèå ðñüôáóçò ìå êåöáëáßï ãñÜììá";
        Text[ korean ] = "¸ðµç ¹®ÀåÀ» ´ë¹®ÀÚ·Î ½ÃÀÛ";
        Text[ turkish ] = "Cümleleri büyük harf ile baþlat.";
        Text[ language_user1 ] = " ";
    };
    String STR_AUTOFMTREDL_TYPO+1
    {
        Text = "\"Gerade\" Anführungszeichen durch %1typografische%2 ersetzen" ;
        Text [ ENGLISH ] = "Replace \"Standard\" Quotes by %1typographical%2 Quotes" ;
        Text [ norwegian ] = "Erstatt \"Standard\" +++Quotes med %1typografiske%2 +++Quotes" ;
        Text [ italian ] = "Sostituisci virgolette \"Standard\" con virgolette %1tipografiche%2" ;
        Text [ portuguese_brazilian ] = "Substituir Citaçäes\"Padrao\" por Citaçäes \\%1typogr ficoal\\%2" ;
        Text [ portuguese ] = "Substituir aspas \"padrão\" por aspas %1tipográficas%2" ;
        Text [ finnish ] = "Korvaa \"vakio\"lainausmerkit %1typografisilla%2" ;
        Text [ danish ] = "Erstat \"lige\" anførselstegn med %1typografiske%2" ;
        Text [ french ] = "Remplacer les guillemets \"standard\" par des guillemets %1typographiques%2" ;
        Text [ swedish ] = "Ersätt \"raka\" citationstecken med %1typografiska%2 citationstecken" ;
        Text [ dutch ] = "\"Rechte\" aanhalingstekens vervangen door %1 typografische%2" ;
        Text [ spanish ] = "Reemplazar comillas \"rectas\" con comillas %1tipográficas%2" ;
        Text [ english_us ] = "Replace \"standard\" quotes with %1custom%2 quotes" ;
        Text[ chinese_simplified ] = "\"Ö±ÐÍ\"ÒýºÅÓÉ%1¸öÈËÒýºÅ%2 ´úÌæ";
        Text[ russian ] = "Çàìåíÿòü \"ïðÿìûå\" êàâû÷êè %1òèïîãðàôñêèìè %2";
        Text[ polish ] = "Zamieniaj cudzys³owy \"proste\" na %1 \"drukarskie\" %2";
        Text[ japanese ] = "\"ºÝËß­°À—p\"¸«°Ã°¼®Ýϰ¸‚ð%1ˆóü—p%2‚É’uŠ·";
        Text[ chinese_traditional ] = "\"ª½«¬¤Þ¸¹\"¥Ñ%1­Ó¤H¤Þ¸¹%2 ´À¥N";
        Text[ arabic ] = "ÇÓÊÈÏÇá ÚáÇãÇÊ ÊäÕíÕ \"ÚÇÏíÉ\" ÈÜÚáÇãÇÊ ÊäÕíÕ%1ØÈæÛÑÇÝíøÉ%2";
        Text[ greek ] = "ÁíôéêáôÜóôáóç \"ßóùí\" åéóáãùãéêþí ìå %1ôõðïãñáöéêÜ%2";
        Text[ korean ] = "\"Á÷¼±\" ÀοëºÎÈ£¸¦ %1Àμâü%2 ÀοëºÎÈ£·Î ¹Ù²Þ";
        Text[ turkish ] = "\"Düz\" týrnak iþaretlerini %1tipografik iþaretler ile%2 deðiþtir";
    };
    String STR_AUTOFMTREDL_USER_STYLE+1
    {
        Text = "Benutzervorlagen ersetzen" ;
        Text [ English ] = "Replace user styles" ;
        Text [ dutch ] = "Eigen opmaakprofielen vervangen" ;
        Text [ english_us ] = "Replace Custom Styles" ;
        Text [ swedish ] = "Ersätt användardefinierade formatmallar" ;
        Text [ danish ] = "Erstat brugertypografier" ;
        Text [ italian ] = "Sostituisci modelli utente" ;
        Text [ spanish ] = "Reemplazar estilos del usuario" ;
        Text [ french ] = "Remplacer les styles personnalisés" ;
        Text [ portuguese ] = "Substituir estilos personalizados" ;
        Text [ portuguese_brazilian ] = "Benutzervorlagen ersetzen" ;
        Text[ chinese_simplified ] = "¸üÌæÓû§Ñùʽ";
        Text[ russian ] = "Çàìåíèòü ñòèëè ïîëüçîâàòåëÿ";
        Text[ polish ] = "Zamieñ szablony u¿ytkownika";
        Text[ japanese ] = "Õ°»Þ°Ý’è‚̽À²Ù‚É’u‚«Š·‚¦‚é";
        Text[ language_user1 ] = " ";
        Text[ chinese_traditional ] = "¥N´À¦Û­q¼Ë¦¡";
        Text[ arabic ] = "ÇÓÊÈÏÇá ÇáÃäãÇØ ÇáãÎÕÕÉ";
        Text[ greek ] = "ÁíôéêáôÜóôáóç ðñïóáñìïóìÝíùí ðñïôýðùí";
        Text[ korean ] = "»ç¿ëÀÚ ¼­½ÄÆÄÀÏ ´ëü";
        Text[ turkish ] = "Kullanýcý biçimini deðiþtir";
    };
    String STR_AUTOFMTREDL_BULLET+1
    {
        Text = "Bulletzeichen ersetzt" ;
        Text [ ENGLISH ] = "Replace Bullets" ;
        Text[ italian ] = "Punti sostituiti";
        Text[ portuguese_brazilian ] = "Replace Bullets";
        Text[ portuguese ] = "Marca substituída";
        Text[ danish ] = "Erstat punkttegn";
        Text[ french ] = "Remplacer les puces";
        Text[ swedish ] = "Ersätt uppräkningstecken";
        Text[ dutch ] = "Opsommingstekens vervangen";
        Text[ spanish ] = "Viñeta reemplazada";
        Text[ english_us ] = "Bullets replaced";
        Text[ chinese_simplified ] = "¸üÌæÏîÄ¿±àºÅ";
        Text[ language_user1 ] = " ";
        Text[ russian ] = "Ìàðêåðû çàìåíåíû";
        Text[ polish ] = "Zamienione znaki wypunktowania";
        Text[ japanese ] = "‰Óð‘‚«‹L†‚É’uŠ·";
        Text[ chinese_traditional ] = "¥N´À¶µ¥Ø½s¸¹";
        Text[ arabic ] = "ÇÓÊÈÏÇá ÚáÇãÇÊ ÇáÊÚÏÇÏ";
        Text[ greek ] = "Ç áíôéêáôÜóôáóç êïõêßäùí ïëïêëçñþèçêå";
        Text[ korean ] = "±Û¸Ó¸®Ç¥ ´ëü";
        Text[ turkish ] = "Sýralama iþareti deðiþtirildi";
    };
    String STR_AUTOFMTREDL_UNDER+1
    {
        Text = "Automatisch _unterstrichen_" ;
        Text [ English ] = "Automatic _underline_" ;
        Text[ italian ] = "_Sottolineato_ automatico";
        Text[ portuguese_brazilian ] = "Automatic _underline_";
        Text[ portuguese ] = "_sublinhado_automático";
        Text[ danish ] = "Automatisk _understreget_";
        Text[ french ] = "_Soulignage_ automatique";
        Text[ swedish ] = "Automatiskt _understruket_";
        Text[ dutch ] = "Automatisch _onderstrepen_";
        Text[ spanish ] = "Subrayado_automático_";
        Text[ english_us ] = "Automatic _underline_";
        Text[ chinese_simplified ] = "×Ô¶¯_Ï»®Ïß_";
        Text[ russian ] = "Àâòîìàòè÷åñêîå _ïîä÷åðêèâàíèå_";
        Text[ polish ] = "Automatyczne _podkreœlenie_";
        Text[ japanese ] = "Ž©“®_‰ºü_";
        Text[ chinese_traditional ] = "¦Û°Ê_¤U¹º½u_";
        Text[ arabic ] = "_ÎØ ÊÍÊí_ ÊáÞÇÆíÇð";
        Text[ greek ] = "Áõôüìáôç _õðïãñÜììéóç_";
        Text[ korean ] = "ÀÚµ¿ _¹ØÁÙ_";
        Text[ turkish ] = "Altýný_otomatik_çiz_";
        Text[ language_user1 ] = " ";
    };
    String STR_AUTOFMTREDL_BOLD+1
    {
        Text = "Automatisch *fett*" ;
        Text [ English ] = "Automatic *bold*" ;
        Text[ italian ] = "*Grassetto* automatico";
        Text[ portuguese_brazilian ] = "Automatic *bold*";
        Text[ portuguese ] = "*negrito* automático";
        Text[ danish ] = "Automatisk *fed*";
        Text[ french ] = "*Gras* automatique";
        Text[ swedish ] = "Automatiskt *fet*";
        Text[ dutch ] = "Automatisch *vet*";
        Text[ spanish ] = "*Negrita* automático";
        Text[ english_us ] = "Automatic *bold*";
        Text[ chinese_simplified ] = "×Ô¶¯ *´ÖÌå*";
        Text[ russian ] = "Àâòîìàòè÷åñêè *æèðíûé*";
        Text[ polish ] = "Automatyczne *pogrubienie*";
        Text[ japanese ] = "Ž©“® *‘¾Žš*";
        Text[ chinese_traditional ] = "¦Û°Ê *²ÊÅé*";
        Text[ arabic ] = "*ÚÑíÖ* ÊáÞÇÆíÇð";
        Text[ greek ] = "ÁõôïìÜôùò *Ýíôïíá*";
        Text[ korean ] = "ÀÚµ¿À¸·Î *ÁøÇϰÔ*";
        Text[ turkish ] = "Otomatik *kalýn*";
        Text[ language_user1 ] = " ";
    };
    String STR_AUTOFMTREDL_FRACTION+1
    {
        Text = "1/2 ... durch ½ ... ersetzen" ;
        Text [ English ] = "Replace 1/2 ... with ½ ..." ;
        Text [ english_us ] = "Replace 1/2 ... with ½ ..." ;
        Text [ swedish ] = "Ersätt 1/2 ... med  ½ ..." ;
        Text [ danish ] = "Erstat 1/2 ...med ½ ..." ;
        Text [ italian ] = "Sostituisci 1/2 ... con ½" ;
        Text [ spanish ] = "Reemplazar 1/2 ... por ½ ..." ;
        Text [ dutch ] = "1/2 ... vervangen door ½ ..." ;
        Text [ portuguese_brazilian ] = "1/2 ... gegen ½ ... ersetzen" ;
        Text [ french ] = "Remplacer 1/2 ... par ½ ..." ;
        Text [ portuguese ] = "Substituir 1/2 ... por ½ ..." ;
        Text[ chinese_simplified ] = "Óà ?... ¸üÌæ 1/2 ...";
        Text[ russian ] = "Çàìåíÿòü 1/2 ... íà ñèìâîëû";
        Text[ polish ] = "Zamieñ 1/2 ... na \" ... ";
        Text[ japanese ] = "1/2 ... ‚ð  ½  ... ‚É’u‚«Š·‚¦‚é";
        Text[ chinese_traditional ] = "¥Î ?... ¥N´À 1/2 ...";
        Text[ arabic ] = "ÇÓÊÈÏÇá 1/2 ... ÈÜ ½...";
        Text[ greek ] = "ÁíôéêáôÜóôáóç 1/2 ... ìå ½ ...";
        Text[ korean ] = "1/2 ...À» ?...·Î ´ëü";
        Text[ turkish ] = "1/2 ... yazýldýðýnda ½ ... ile deðiþtir";
        Text[ language_user1 ] = " ";
    };
    String STR_AUTOFMTREDL_DETECT_URL+1
    {
        Text = "URL erkennen" ;
        Text [ English ] = "Detect URL" ;
        Text [ english_us ] = "URL recognition" ;
        Text [ italian ] = "Riconosci URL" ;
        Text [ spanish ] = "Reconocer URL" ;
        Text [ french ] = "Détecter les URLs" ;
        Text [ dutch ] = "URL herkennen" ;
        Text [ swedish ] = "Känn igen URL" ;
        Text [ danish ] = "Identificer URL" ;
        Text [ portuguese_brazilian ] = "URL erkennen" ;
        Text [ portuguese ] = "Reconhecer URL" ;
        Text[ chinese_simplified ] = "ʶ±ð URL";
        Text[ russian ] = "Ðàñïîçíàâàòü URL";
        Text[ polish ] = "Rozpoznanie URL";
        Text[ japanese ] = "URL ”Fޝ";
        Text[ chinese_traditional ] = "ÃѧO URL";
        Text[ arabic ] = "ÇáÊÚÑÝ Úáì URL";
        Text[ greek ] = "Áíáãíþñéóç URL";
        Text[ korean ] = "URL ÀνÄ";
        Text[ turkish ] = "URL taný";
        Text[ language_user1 ] = " ";
    };
    String STR_AUTOFMTREDL_DASH+1
    {
        Text = "Gedankenstriche ersetzen" ;
        Text [ English ] = "Replace dashes" ;
        Text [ english_us ] = "Replace dashes" ;
        Text [ swedish ] = "Ersätt tankstreck" ;
        Text [ danish ] = "Erstat tankestreger" ;
        Text [ italian ] = "Sostituisci trattini" ;
        Text [ spanish ] = "Reemplazar comillas" ;
        Text [ french ] = "Remplacer les tirets" ;
        Text [ dutch ] = "Streepjes vervangen" ;
        Text [ portuguese_brazilian ] = "Gedankenstriche ersetzen" ;
        Text [ portuguese ] = "Substituir hífens" ;
        Text[ chinese_simplified ] = "¸üÌæÆÆÕÛºÅ";
        Text[ russian ] = "Çàìåíèòü òèðå";
        Text[ polish ] = "Zamieniaj myœlniki";
        Text[ japanese ] = "ÀÞ¯¼­‚É’uŠ·";
        Text[ chinese_traditional ] = "¥N´À¯}§é¸¹";
        Text[ arabic ] = "ÇÓÊÈÏÇá ÇáÔõÑóØ";
        Text[ greek ] = "ÁíôéêáôÜóôáóç ðáõëþí";
        Text[ korean ] = "´ë½Ã ´ëü";
        Text[ turkish ] = "Tireleri deðiþtir";
        Text[ language_user1 ] = " ";
    };
    String STR_AUTOFMTREDL_ORDINAL+1
    {
        Text = "1st ... durch 1^st ... ersetzen" ;
        Text [ English ] = "Replace 1st with 1^st" ;
        Text [ english_us ] = "Replace 1st... with 1^st..." ;
        Text [ italian ] = "Sostituisci 1o ... con 1° ..." ;
        Text [ spanish ] = "Reemplazar 1st ... con 1^st ..." ;
        Text [ french ] = "Remplacer 1er ... par 1^er ..." ;
        Text [ dutch ] = "1st ... vervangen door 1^st ..." ;
        Text [ swedish ] = "Ersätt engelska ordningstal (1st)... med 1^st..." ;
        Text [ danish ] = "Erstat 1st ... med 1^st ..." ;
        Text [ portuguese_brazilian ] = "1st ... gegen 1^st ... ersetzen" ;
        Text [ portuguese ] = "Substituir 1o... por 1º..." ;
        Text[ chinese_simplified ] = "Óà 1^st... ¸üÌæ 1st...";
        Text[ russian ] = "Çàìåíèòü 1st ... íà 1^st ...";
        Text[ polish ] = "Zamieñ 1st ... na 1^st ... ";
        Text[ japanese ] = "1st ...‚ð 1^st ... ‚É’u‚«Š·‚¦‚é";
        Text[ chinese_traditional ] = "¥Î 1^st... ¥N´À 1st...";
        Text[ arabic ] = "ÇÓÊÈÏÇá 1st ... ÈÜ 1^st ...";
        Text[ greek ] = "ÁíôéêáôÜóôáóç 1ï... ìå 1^ï...";
        Text[ korean ] = "1st...À» 1^st...·Î ´ëü";
        Text[ turkish ] = "1st ... yazýldýðýnda 1^st ... ile deðiþtir";
        Text[ language_user1 ] = " ";
    };
    String STR_AUTOFMTREDL_RIGHT_MARGIN+1
    {
        Text = "Zusammenfassen von einzeiligen Absätzen" ;
        Text [ ENGLISH ] = "Combine single line paragraphs" ;
        Text[ italian ] = "Mantieni assieme i paragrafi ad una riga";
        Text[ portuguese_brazilian ] = "Combine single line paragraphs";
        Text[ portuguese ] = "Unir parágrafos de uma linha";
        Text[ danish ] = "Kombiner enkeltlinjede afsnit";
        Text[ french ] = "Fusionner les paragraphes à une seule ligne";
        Text[ swedish ] = "Sammanfoga enradiga stycken";
        Text[ dutch ] = "Eenregelige alinea's samenvoegen";
        Text[ spanish ] = "Unir párrafos de una línea";
        Text[ english_us ] = "Combine single line paragraphs";
        Text[ chinese_simplified ] = "ºÏ²¢µ¥ÐжÎÂä";
        Text[ russian ] = "Îáúåäèíåíèå îäíîñòðî÷íûõ àáçàöåâ";
        Text[ polish ] = "Po³¹czenie akapitów jednowierszowych";
        Text[ japanese ] = "1s’i—Ž‚ÌŒ‹‡";
        Text[ chinese_traditional ] = "¦X¨Ö³æ¦æ¬q¸¨";
        Text[ arabic ] = "ÏãÌ ÇáÝÞÑÇÊ ÃÍÇÏíÉ ÇáÃÓØÑ";
        Text[ greek ] = "¸íùóç ìïíüãñáììùí ðáñáãñÜöùí";
        Text[ korean ] = "ÇÑÁÙ ´Ü¶ô ÇÕÄ¡±â";
        Text[ turkish ] = "Tek satýrlý paragraflarý birleþtir";
        Text[ language_user1 ] = " ";
    };

    String STR_AUTOFMTREDL_SET_TMPL_TEXT +1
    {
        Text = "Setze Vorlage \"Textkörper\"" ;
        Text [ English ] = "Set template \"Text body\"" ;
        Text[ italian ] = "Imposta modello \"corpo del testo\"";
        Text[ portuguese_brazilian ] = "Set template \"Text body\"";
        Text[ portuguese ] = "Aplicar estilo \"Corpo do texto\"";
        Text[ danish ] = "Anvend typografi \"Brødtekst\"";
        Text[ french ] = "Appliquer le style \"Corps de texte\"";
        Text[ swedish ] = "Använd formatmallen \"Brödtext\"";
        Text[ dutch ] = "Sjabloon \"Tekstblok\" toepassen";
        Text[ spanish ] = "Aplicar estilo \"Cuerpo de texto\"";
        Text[ english_us ] = "Set \"Text body\" Style";
        Text[ chinese_simplified ] = "É趨¡°ÕýÎÄ¡±Ñùʽ";
        Text[ russian ] = "Óñòàíîâèòü ñòèëü \"Îñíîâíîé òåêñò\"";
        Text[ polish ] = "U?yj szablonu \"Obszar tekstowy\"";
        Text[ japanese ] = "\"–{•¶\"‚̽À²ÙÝ’è";
        Text[ chinese_traditional ] = "³]©w¼Ë¦¡¡§¤º¤å¡¨";
        Text[ arabic ] = "ÊÚííä ÇáäãØ \"ÌÓã ÇáäÕ\"";
        Text[ greek ] = "Ïñéóìüò ðñïôýðïõ \"Óþìá êåéìÝíïõ\"";
        Text[ korean ] = "\"º»¹®\" À¯Çü ¼³Á¤";
        Text[ turkish ] = "\"Metin gövdesi\" biçimini uygula";
        Text[ language_user1 ] = " ";
    };
    String STR_AUTOFMTREDL_SET_TMPL_INDENT  +1
    {
        Text = "Setze Vorlage \"Textkörper Einzug\"" ;
        Text [ English ] = "Set template \"Text body indent\"" ;
        Text[ italian ] = "Imposta modello \"rientro corpo del testo\"";
        Text[ portuguese_brazilian ] = "Set template \"Text body indent\"";
        Text[ portuguese ] = "Aplicar estilo \"Abrir parágrafo\"";
        Text[ danish ] = "Anvend typografi \"Første linjes indrykning\"";
        Text[ french ] = "Appliquer le style \"Alinéa\"";
        Text[ swedish ] = "Använd formatmallen \"Dra in första raden\"";
        Text[ dutch ] = "Sjabloon \"1e regel inspringen\" toepassen";
        Text[ spanish ] = "Aplicar estilo \"Sangría de primera línea\"";
        Text[ english_us ] = "Set \"Text body indent\" Style";
        Text[ chinese_simplified ] = "É趨¡°ÕýÎÄËõ½ø¡±Ñùʽ";
        Text[ russian ] = "Óñòàíîâèòü ñòèëü \"Ïåðâàÿ ñòðîêà ñ îòñòóïîì\"";
        Text[ polish ] = "U¿yj szablonu \"Wciêcie obszaru tekstowego\"";
        Text[ japanese ] = "\"–{•¶²ÝÃÞÝÄ\"‚̽À²ÙÝ’è";
        Text[ chinese_traditional ] = "³]©w¼Ë¦¡¡§¤º¤åÁY±Æ¡¨";
        Text[ arabic ] = "ÊÚííä ÇáäãØ \"ÅÒÇÍÉ ÌÓã ÇáäÕ\"";
        Text[ greek ] = "Ïñéóìüò ðñïôýðïõ \"Åóï÷Þ ðñþôçò ãñáììÞò\"";
        Text[ korean ] = "\"º»¹® µé¿©¾²±â\" À¯Çü ¼³Á¤";
        Text[ turkish ] = "\"Metin gövdesi - girinti\" biçimini uygula";
        Text[ language_user1 ] = " ";
    };
    String STR_AUTOFMTREDL_SET_TMPL_NEG_INDENT  +1
    {
        Text = "Setze Vorlage \"Textkörper Einzug negativ\"" ;
        Text [ English ] = "Set template \"Text body neg. indent\"" ;
        Text[ italian ] = "Imposta modello \"rientro corpo del testo negativo\"";
        Text[ portuguese_brazilian ] = "Set template \"Text body neg. indent\"";
        Text[ portuguese ] = "Aplicar estilo \"Abrir parágrafo negativo\"";
        Text[ danish ] = "Anvend typografi \"Hængende indrykning\"";
        Text[ french ] = "Appliquer le style \"Alinéa négatif\"";
        Text[ swedish ] = "Använd formatmallen \"Negativt indrag av första raden\"";
        Text[ dutch ] = "Sjabloon \"1e regel uitspringen\" toepassen";
        Text[ spanish ] = "Aplicar estilo \"Sangría negativa de primera línea\"";
        Text[ english_us ] = "Set \"Hanging indent\" Style";
        Text[ chinese_simplified ] = "É趨¡°ÕýÎĸºÏòËõ½ø¡±Ñùʽ";
        Text[ russian ] = "Óñòàíîâèòü ñòèëü \"Îáðàòíûé îòñòóï\"";
        Text[ polish ] = "U¿yj szablonu \"Neg. wciêcie obszaru tekstu\"";
        Text[ japanese ] = "\"–{•¶Ï²Å½²ÝÃÞÝÄ\"‚̽À²ÙÝ’è";
        Text[ chinese_traditional ] = "³]©w¼Ë¦¡¡§¤º¤å­tÁY±Æ¡¨";
        Text[ arabic ] = "ÊÚííä ÇáäãØ \"ÅÒÇÍÉ ÌÓã äÕ ÓáÈíÉ\"";
        Text[ greek ] = "Ïñéóìüò ðñïôýðïõ \"ÁñíçôéêÞ åóï÷Þ óþìáôïò êåéìÝíïõ\"";
        Text[ korean ] = "\"º»¹® ³»¾î¾²±â\" À¯Çü ¼³Á¤";
        Text[ turkish ] = "\"Asýlý girinti\" biçimini uygula";
        Text[ language_user1 ] = " ";
    };
    String STR_AUTOFMTREDL_SET_TMPL_TEXT_INDENT +1
    {
        Text = "Setze Vorlage \"Textkörper Einrückung\"" ;
        Text [ English ] = "Set template \"Text body move in\"" ;
        Text[ italian ] = "Imposta modello \"rientro corpo del testo\"";
        Text[ portuguese_brazilian ] = "Set template \"Text body move in\"";
        Text[ portuguese ] = "Aplicar estilo \"Avanço corpo do texto\"";
        Text[ danish ] = "Anvend typografi \"Brødtekst indrykning\"";
        Text[ french ] = "Appliquer le style \"Retrait de corps de texte\"";
        Text[ swedish ] = "Använd formatmallen \"Dra in hela stycket\"";
        Text[ dutch ] = "Sjabloon \"Tekstblok inspringen\" toepassen";
        Text[ spanish ] = "Aplicar estilo \"Cuerpo de texto con sangría\"";
        Text[ english_us ] = "Set \"Text body indent\" Style";
        Text[ chinese_simplified ] = "É趨¡°ÕýÎÄËõ½ø¡±Ñùʽ";
        Text[ russian ] = "Óñòàíîâèòü ñòèëü \"Îñíîâíîé òåêñò ñ îòñòóïîì\"";
        Text[ polish ] = "U?yj szablonu \"Wysuniecie obszaru tekst.\"";
        Text[ japanese ] = "\"–{•¶²ÝÃÞÝÄ\"‚̽À²ÙÝ’è";
        Text[ chinese_traditional ] = "³]©w¼Ë¦¡¡§¤º¤åÁY±Æ¡¨";
        Text[ arabic ] = "ÊÚííä ÇáäãØ \"ÅÒÇÍÉ ÌÓã ÇáäÕ (ÇáÓØÑ ÇáÃæá)\"";
        Text[ greek ] = "Ïñéóìüò ðñïôýðïõ \"Åóï÷Þ óþìáôïò êåéìÝíïõ\"";
        Text[ korean ] = "À¯Çü \"º»¹® µé¿©¾²±â\" ¼³Á¤";
        Text[ turkish ] = "\"Metin gövdesi - satýrbaþý\" biçimini uygula";
        Text[ language_user1 ] = " ";
    };
    String STR_AUTOFMTREDL_SET_TMPL_HEADLINE +1
    {
        Text = "Setze Vorlage \"Überschrift $(ARG1)\"" ;
        Text [ English ] = "Set template \"Headline $(ARG1)\"" ;
        Text[ italian ] = "Imposta modello \"intestazione $(ARG1)\"";
        Text[ portuguese_brazilian ] = "Set template \"Headline $(ARG1)\"";
        Text[ portuguese ] = "Aplicar estilo \"Título $(ARG1)\"";
        Text[ danish ] = "Anvend typografi \"Overskrift $(ARG1)\"";
        Text[ french ] = "Appliquer le style \"Titre $(ARG1)\"";
        Text[ swedish ] = "Använd formatmallen \"Överskrift $(ARG1)\"";
        Text[ dutch ] = "Sjabloon \"Kop $(ARG1)\" toepassen";
        Text[ spanish ] = "Aplicar estilo \"Encabezado $(ARG1)\"";
        Text[ english_us ] = "Set \"Heading $(ARG1)\" Style";
        Text[ chinese_simplified ] = "É趨¡°±êÌâ $(ARG1)¡±Ñùʽ";
        Text[ russian ] = "Óñòàíîâèòü ñòèëü \"Çàãîëîâîê $(ARG1)\"";
        Text[ polish ] = "U¿yj szablonu \"Tytu³ $(ARG1)\"";
        Text[ japanese ] = "\"Œ©o‚µ$(ARG1)\" ‚̽À²ÙÝ’è";
        Text[ chinese_traditional ] = "³]©w¼Ë¦¡¡§¼ÐÃD $(ARG1)¡¨";
        Text[ arabic ] = "ÊÚííä ÇáäãØ \"ÚäæÇä $(ARG1)\"";
        Text[ greek ] = "Ïñéóìüò ðñïôýðïõ \"Åðéêåöáëßäá $(ARG1)\"";
        Text[ korean ] = "À¯Çü \"¸Ó¸®±Û $(ARG1)\" ¼³Á¤";
        Text[ turkish ] = "\"Baþlýk $(ARG1)\" biçimini uygula";
        Text[ language_user1 ] = " ";
    };
    String STR_AUTOFMTREDL_SET_NUMBULET +1
    {
        Text = "Setze Vorlage \"Aufzählung\" oder \"Nummerierung\"" ;
        Text [ English ] = "Set template \"Bullet\" or \"Numbering\"" ;
        Text[ italian ] = "Imposta modello elenchi \"puntati\" o \"numerati\"";
        Text[ portuguese_brazilian ] = "Set template \"Bullet\" or \"Numbering\"";
        Text[ portuguese ] = "Aplicar estilo \"Marcas\" ou \"Numeração\"";
        Text[ danish ] = "Anvend typografi \"Punktopstilling\" eller \"Nummerering\"";
        Text[ french ] = "Appliquer le style \"Puces\" ou \"Numérotation\"";
        Text[ swedish ] = "Använd formatmallen \"Uppräkning\" eller \"Numrering\"";
        Text[ dutch ] = "Sjabloon \"Opsomming\" of \"Nummering\" toepassen";
        Text[ spanish ] = "Aplicar estilo \"Viñetas\" o \"Numeración\"";
        Text[ english_us ] = "Set \"Bullet\" or \"Numbering\" Style";
        Text[ chinese_simplified ] = "É趨¡°ÏîÄ¿·ûºÅ¡±»ò¡°±àºÅ¡±Ñùʽ";
        Text[ russian ] = "Óñòàíîâèòü ñòèëü \"Ñïèñîê\" èëè \"Íóìåðàöèÿ\"";
        Text[ polish ] = "U¿yj szablonu \"Wypunktowanie\" lub \"Numerowanie\"";
        Text[ japanese ] = "\"‰Óð‘‚«\" ‚Ü‚½‚Í \"”ԍ†•t‚¯\"‚̽À²ÙÝ’è";
        Text[ chinese_traditional ] = "³]©w¼Ë¦¡¡§¶µ¥Ø²Å¸¹¡¨©M¡§½s¸¹¡¨";
        Text[ arabic ] = "ÊÚííä ÇáäãØ \"ÊÚÏÇÏ\" Ãæ \"ÊÑÞíã\"";
        Text[ greek ] = "Ïñéóìüò óôõë \"Êïõêßäá\" Þ \"Áñßèìçóç\"";
        Text[ korean ] = "À¯Çü \"±Û¸Ó¸®Ç¥\"³ª \"¹øÈ£ ¸Å±â±â\" ¼³Á¤";
        Text[ turkish ] = "\"Madde\" ya da \"numaralama\" biçimini uygula";
        Text[ language_user1 ] = " ";
    };

    String STR_AUTOFMTREDL_DEL_MORELINES +1
    {
        Text = "Zusammenfassen von Absätzen" ;
        Text [ English ] = "Combine paragraphs" ;
        Text[ italian ] = "Mantieni assieme i paragrafi";
        Text[ portuguese_brazilian ] = "Combine paragraphs";
        Text[ portuguese ] = "Unir parágrafos";
        Text[ danish ] = "Kombiner afsnit";
        Text[ french ] = "Fusionner des paragraphes";
        Text[ swedish ] = "Sammanfoga stycken";
        Text[ dutch ] = "Alinea's samenvoegen";
        Text[ spanish ] = "Unir párrafos";
        Text[ english_us ] = "Combine paragraphs";
        Text[ chinese_simplified ] = "ºÏ²¢¶ÎÂä";
        Text[ russian ] = "Îáúåäèíåíèå àáçàöåâ";
        Text[ polish ] = "Po³¹czenie akapitów";
        Text[ japanese ] = "’i—Ž‚ÌŒ‹‡";
        Text[ chinese_traditional ] = "¦X¨Ö¬q¸¨";
        Text[ arabic ] = "Öã ÇáÝÞÑÇÊ";
        Text[ greek ] = "¸íùóç ðáñáãñÜöùí";
        Text[ korean ] = "´Ü¶ô ÇÕÄ¡±â";
        Text[ turkish ] = "Paragraflarý birleþtir";
        Text[ language_user1 ] = " ";
    };

};

/*---------------------------------------------------------------------
    Diverses
 ---------------------------------------------------------------------*/
String STR_EVENT_OBJECT_SELECT
{
    TEXT = "Objekt anklicken" ;
    TEXT [ English ] = "Object on click" ;
    Text [ dutch ] = "Object selecteren" ;
    Text [ english_us ] = "Click object" ;
    Text [ italian ] = "Cliccate l'oggetto" ;
    Text [ spanish ] = "Pulsar el objeto" ;
    Text [ french ] = "Clic sur l'objet" ;
    Text [ swedish ] = "Klicka på objekt" ;
    Text [ danish ] = "Klik på objekt" ;
    Text [ portuguese ] = "Seleccionar objecto" ;
    Text [ portuguese_brazilian ] = "Objekt anklicken" ;
    Text[ chinese_simplified ] = "°´»÷¶ÔÏó";
    Text[ russian ] = "Âûáîð îáúåêòà";
    Text[ polish ] = "Kliknij obiekt";
    Text[ japanese ] = "µÌÞ¼Þª¸Ä‚ð¸Ø¯¸‚·‚é";
    Text[ chinese_traditional ] = "¥Î·Æ¹««öÀ»ª«¥ó";
    Text[ arabic ] = "ÇáäÞÑ ÝæÞ ÇáßÇÆä";
    Text[ greek ] = "ÅðéëïãÞ áíôéêåéìÝíïõ";
    Text[ korean ] = "°³Ã¼ ¼±ÅÃ";
    Text[ turkish ] = "Nesneye týkla";
    Text[ language_user1 ] = " ";
};
String STR_EVENT_START_INS_GLOSSARY
{
    /* ### ACHTUNG: Neuer Text in Resource? Vor AutoText einfügen : Vor AutoText einf³gen */
    TEXT = "Vor Einfügen des AutoTextes" ;
    TEXT [ English ] = "Before insert AutoText" ;
    TEXT[ english_us ] = "Before inserting AutoText";
    TEXT[ portuguese ] = "Inserir antes de AutoTexto";
    TEXT[ russian ] = "Ïåðåä âñòàâêîé àâòîòåêñòà";
    TEXT[ greek ] = "Ðñéí áðü ôçí ðñïóèÞêç ôïõ ÁõôïÊåßìåíï";
    TEXT[ dutch ] = "Voor het invoegen van AutoTekst";
    TEXT[ french ] = "Avant insertion de l'AutoTexte";
    TEXT[ spanish ] = "Antes de insertar el AutoTexto";
    TEXT[ italian ] = "Prima d'inserire il testo automatico";
    TEXT[ danish ] = "Inden input af AutoTekst";
    TEXT[ swedish ] = "Innan AutoText infogas";
    TEXT[ polish ] = "Wstaw przed autotekstem";
    TEXT[ portuguese_brazilian ] = "Vor AutoText einfügen";
    TEXT[ japanese ] = "“ü—ÍŽx‰‡‚ð‘}“ü‚·‚é‘O";
    TEXT[ korean ] = "ÀÚµ¿ ÅØ½ºÆ® »ðÀÔ Àü¿¡";
    TEXT[ chinese_simplified ] = "ÔÚ²åÈë×Ô¶¯Í¼Îļ¯Ö®Ç°";
    TEXT[ chinese_traditional ] = "¦b´¡¤J¦Û°Ê¹Ï¤å¶°¤§«e";
    TEXT[ arabic ] = "ÞÈá ÅÏÑÇÌ ÇáäÕ ÇáÊáÞÇÆí";
    TEXT[ turkish ] = "Otomatik metin eklemeden önce";
    TEXT[ language_user1 ] = " ";
};
String STR_EVENT_END_INS_GLOSSARY
{
    /* ### ACHTUNG: Neuer Text in Resource? Nach AutoText einfügen : Nach AutoText einf³gen */
    TEXT = "Nach Einfügen des AutoTextes" ;
    TEXT [ English ] = "After insert AutoText" ;
    TEXT[ english_us ] = "After inserting AutoText";
    TEXT[ portuguese ] = "Inserir após AutoTexto";
    TEXT[ russian ] = "Ïîñëå âñòàâêè àâòîòåêñòà";
    TEXT[ greek ] = "ÌåôÜ ôçí ðñïóèÞêç ôïõ ÁõôïÊåßìåíï";
    TEXT[ dutch ] = "Na invoegen van AutoTekst";
    TEXT[ french ] = "Après insertion de l'AutoTexte";
    TEXT[ spanish ] = "Tras insertar el AutoTexto";
    TEXT[ italian ] = "Dopo aver inserito il testo automatico";
    TEXT[ danish ] = "Efter input af AutoTekst";
    TEXT[ swedish ] = "Efter att AutoText infogats";
    TEXT[ polish ] = "Wstaw za autotekstem";
    TEXT[ portuguese_brazilian ] = "Nach AutoText einfügen";
    TEXT[ japanese ] = "“ü—ÍŽx‰‡‚ð‘}“ü‚µ‚½Œã";
    TEXT[ korean ] = "ÀÚµ¿ ÅØ½ºÆ® »ðÀÔ ÈÄ¿¡";
    TEXT[ chinese_simplified ] = "ÔÚ²åÈë×Ô¶¯Í¼Îļ¯Ö®ºó";
    TEXT[ chinese_traditional ] = "¦b¦Û°Ê¹Ï¤å¶°´¡¤J¤§«á";
    TEXT[ arabic ] = "ÈÚÏ ÅÏÑÇÌ ÇáäÕ ÇáÊáÞÇÆí";
    TEXT[ turkish ] = "Otomatik metin ekledikten sonra";
    TEXT[ language_user1 ] = " ";
};
String STR_EVENT_MOUSEOVER_OBJECT
{
    /* ### ACHTUNG: Neuer Text in Resource? Maus über Objekt : Maus ³ber Objekt */
    TEXT = "Maus über Objekt" ;
    TEXT [ English ] = "Mouse over Object" ;
    Text [ english_us ] = "Mouse over object" ;
    Text [ italian ] = "Mouse sull'oggetto" ;
    Text [ spanish ] = "Ratón sobre objeto" ;
    Text [ french ] = "Souris sur l'objet" ;
    Text [ dutch ] = "Muis boven object" ;
    Text [ swedish ] = "Mus över objekt" ;
    Text [ danish ] = "Mus over objekt" ;
    Text [ portuguese ] = "Rato sobre objecto" ;
    Text [ portuguese_brazilian ] = "Maus über Objekt" ;
    Text[ chinese_simplified ] = "ÖÃÊó±êÓÚ¶ÔÏóÖ®ÉÏ";
    Text[ russian ] = "Ìûøü íàä îáúåêòîì";
    Text[ polish ] = "Mysz nad obiektem";
    Text[ japanese ] = "ϳ½‚ðµÌÞ¼Þª¸Äã‚Ɉړ®";
    Text[ chinese_traditional ] = "¹«¼Ð¦bª«¥ó¤§¤W";
    Text[ arabic ] = "ÇáãÇæÓ ÝæÞ ÇáßÇÆä";
    Text[ greek ] = "Ðïíôßêé ðÜíù áðü áíôéêåßìåíï";
    Text[ korean ] = "°³Ã¼ À§¿¡ ¸¶¿ì½º";
    Text[ turkish ] = "Fare oku nesne üzerinde";
    Text[ language_user1 ] = " ";
};
String STR_EVENT_MOUSECLICK_OBJECT
{
    /* ### ACHTUNG: Neuer Text in Resource? Hyperlink auslösen : Hyperlink ausl÷sen */
    TEXT = "Hyperlink auslösen" ;
    TEXT [ English ] = "Trigger Hyperlink" ;
    Text [ dutch ] = "Hyperlink uitvoeren" ;
    Text [ english_us ] = "Trigger hyperlink" ;
    Text [ italian ] = "Esegui hyperlink" ;
    Text [ spanish ] = "Ejecutar hiperenlace" ;
    Text [ french ] = "Déclencher l'hyperlien" ;
    Text [ swedish ] = "Utför hyperlänk" ;
    Text [ danish ] = "Udfør hyperlink" ;
    Text [ portuguese ] = "Activar hiperligação" ;
    Text [ portuguese_brazilian ] = "Hyperlink auslösen" ;
    Text[ chinese_simplified ] = "Æô¶¯³¬Á´½Ó";
    Text[ russian ] = "Âûïîëíèòü ãèïåðññûëêó";
    Text[ polish ] = "Wykonaj hiper³¹cze";
    Text[ japanese ] = "ʲÊß°ØÝ¸‚ÌŽÀs";
    Text[ chinese_traditional ] = "°õ¦æ¶W³sµ²";
    Text[ arabic ] = "ÊäÝíÐ ÇÑÊÈÇØ ÊÔÚÈí";
    Text[ greek ] = "ÅöáñìïãÞ õðåñ-óýíäåóçò";
    Text[ korean ] = "ÇÏÀÌÆÛ¸µÅ© ¼öÇà";
    Text[ turkish ] = "Hyperlink'i etkinleþtir";
    Text[ language_user1 ] = " ";
};
String STR_EVENT_MOUSEOUT_OBJECT
{
    /* ### ACHTUNG: Neuer Text in Resource? Maus verläßt Objekt : Maus verlõ˜t Objekt */
    TEXT = "Maus verlässt Objekt" ;
    TEXT [ English ] = "Mouse leave Object" ;
    Text [ dutch ] = "Muis verlaat object" ;
    Text [ english_us ] = "Mouse leaves object" ;
    Text [ swedish ] = "Mus lämnar objekt" ;
    Text [ danish ] = "Mus forlader objekt" ;
    Text [ italian ] = "Mouse abbandona l'oggetto" ;
    Text [ spanish ] = "El ratón abandona el objeto" ;
    Text [ french ] = "Souris quitte l'objet" ;
    Text [ portuguese ] = "Rato abandona objecto" ;
    Text [ portuguese_brazilian ] = "Maus verläßt Objekt" ;
    Text[ chinese_simplified ] = "Êó±êÀ뿪¶ÔÏó";
    Text[ russian ] = "Ìûøü ïîêèäàåò îáúåêò";
    Text[ polish ] = "Mysz opuszcza obiekt";
    Text[ japanese ] = "ϳ½‚ðµÌÞ¼Þª¸ÄŠO‚Ɉړ®";
    Text[ chinese_traditional ] = "¹«¼ÐÂ÷¶}ª«¥ó";
    Text[ arabic ] = "ÇÈÊÚÇÏ ÇáãÇæÓ Úä ÇáßÇÆä";
    Text[ greek ] = "Ðïíôßêé áðïìáêñýíåôáé áðü áíôéêåßìåíï";
    Text[ korean ] = "¸¶¿ì½º°¡ °³Ã¼¸¦ ¶°³²";
    Text[ turkish ] = "Ýmleç nesneden ayrýlýyor";
    Text[ language_user1 ] = " ";
};
String STR_EVENT_IMAGE_LOAD
{
    TEXT = "Grafik laden erfolgreich" ;
    TEXT [ English ] = "Graphic load" ;
    Text [ dutch ] = "Laden van afbeelding oké" ;
    Text [ english_us ] = "Graphics load successful" ;
    Text [ swedish ] = "Laddning av grafik lyckades" ;
    Text [ danish ] = "Indlæsning af grafik fuldført" ;
    Text [ italian ] = "Caricamento immagine riuscito" ;
    Text [ spanish ] = "La carga de la imagen ha finalizado con éxito" ;
    Text [ french ] = "Chargement de l'image terminé" ;
    Text [ portuguese ] = "Carregar imagem concluído" ;
    Text [ portuguese_brazilian ] = "Grafik laden erfolgreich" ;
    Text[ chinese_simplified ] = "×°ÔØÍ¼Ðγɹ¦";
    Text[ russian ] = "Çàãðóçêà ãðàôèêè óñïåøíà";
    Text[ polish ] = "Pomyœlne za³adowanie grafiki";
    Text[ japanese ] = "¸Þ×̨¯¸‚̓ǂݍž‚ÝŠ®—¹";
    Text[ chinese_traditional ] = "¸Ë¸ü¹Ï¤ù¦¨¥\\";
    Text[ arabic ] = "ÊÍãíá ÇáÕæÑÉ ÈäÌÇÍ";
    Text[ greek ] = "Ç öüñôùóç ôùí ãñáöéêþí ðÝôõ÷å";
    Text[ korean ] = "±×·¡ÇÈÀ» ¼º°øÀûÀ¸·Î ·ÎµåÇÔ";
    Text[ turkish ] = "Grafik baþarýyla yüklendi";
    Text[ language_user1 ] = " ";
};
String STR_EVENT_IMAGE_ABORT
{
    TEXT = "Grafik laden abgebrochen" ;
    TEXT [ English ] = "Graphic load abord" ;
    Text [ dutch ] = "Afbeelding laden afgebroken" ;
    Text [ english_us ] = "Graphics load terminated" ;
    Text [ swedish ] = "Laddning av grafik avbröts" ;
    Text [ danish ] = "Indlæsning af grafik afbrudt" ;
    Text [ italian ] = "Caricamento immagine interrotto" ;
    Text [ spanish ] = "Interrumpida la carga de la imagen" ;
    Text [ french ] = "Chargement de l'image interrompu" ;
    Text [ portuguese ] = "Carregar imagem cancelado" ;
    Text [ portuguese_brazilian ] = "Grafik laden abgebrochen" ;
    Text[ chinese_simplified ] = "ÖжÏ×°ÔØÍ¼ÐÎ";
    Text[ russian ] = "Çàãðóçêà ãðàôèêè ïðåðâàíà";
    Text[ polish ] = "Przerwane ³adowanie grafiki";
    Text[ japanese ] = "¸Þ×̨¯¸‚̓ǂݍž‚Ý’†Ž~";
    Text[ chinese_traditional ] = "¤¤Â_¸Ë¸ü¹Ï¤ù";
    Text[ arabic ] = "ÇäÞØÇÚ ÚãáíÉ ÊÍãíá ÇáÕæÑÉ";
    Text[ greek ] = "ÄéáêïðÞ öüñôùóçò ãñáöéêïý";
    Text[ korean ] = "±×·¡ÇÈ ·Îµå ÁߴܵÊ";
    Text[ turkish ] = "Grafik yüklemesi kesildi";
    Text[ language_user1 ] = " ";
};
String STR_EVENT_IMAGE_ERROR
{
    TEXT = "Grafik laden fehlerhaft" ;
    TEXT [ English ] = "Graphic load error" ;
    Text [ dutch ] = "Fout bij laden van afbeelding" ;
    Text [ english_us ] = "Graphics load faulty" ;
    Text [ swedish ] = "Fel vid laddning av grafik" ;
    Text [ danish ] = "Indlæsning af grafik fejlagtig" ;
    Text [ italian ] = "Caricamento immagine errato" ;
    Text [ spanish ] = "Error al cargar la imagen" ;
    Text [ french ] = "Erreur lors du chargement de l'image" ;
    Text [ portuguese ] = "Erro ao carregar imagem" ;
    Text [ portuguese_brazilian ] = "Grafik laden fehlerhaft" ;
    Text[ chinese_simplified ] = "×°ÔØµÄͼÐβ»ÍêÕû";
    Text[ russian ] = "Íåïðàâèëüíàÿ çàãðóçêà ãðàôèêè";
    Text[ polish ] = "B³¹d w ³adowaniu grafiki";
    Text[ japanese ] = "¸Þ×̨¯¸‚̓ǂݍž‚Ý´×°";
    Text[ chinese_traditional ] = "¸Ë¸ü¹Ï¤ù¤£§¹¾ã";
    Text[ arabic ] = "ÎØÃ Ýí ÚãáíÉ ÊÍãíá ÇáÕæÑÉ";
    Text[ greek ] = "ÓöÜëìá êáôÜ ôç öüñôùóç ãñáöéêïý";
    Text[ korean ] = "±×·¡ÇÈ ·Îµå ¿À·ù";
    Text[ turkish ] = "Grafik yüklemede hata";
    Text[ language_user1 ] = " ";
};
String STR_EVENT_FRM_KEYINPUT_A
{
    TEXT = "Eingabe von Alphazeichen" ;
    TEXT [ English ] = "Input of alpha chars" ;
    Text [ portuguese ] = "Entrada de caracteres alfa" ;
    Text [ english_us ] = "Input of alpha characters" ;
    Text [ portuguese_brazilian ] = "Eingabe von Alphazeichen" ;
    Text [ swedish ] = "Inmatning av alfatecken" ;
    Text [ danish ] = "Input af alfategn" ;
    Text [ italian ] = "Digitazione di caratteri alfa" ;
    Text [ spanish ] = "Entrada de caracteres alfa" ;
    Text [ french ] = "Saisie de caractères alphanumériques" ;
    Text [ dutch ] = "Invoer van alfanumerieke tekens" ;
    Text[ chinese_simplified ] = "ÊäÈëÏ£À°Óï×Öĸ°¢¶û·¨";
    Text[ russian ] = "Ââîä çíàêîâ àëüôà";
    Text[ polish ] = "Wprowadzenie znaku alfa";
    Text[ japanese ] = "±Ù̧Íޯĕ¶Žš‚Ì“ü—Í";
    Text[ chinese_traditional ] = "¿é¤J§ÆÃ¾»y²Ä¤@­Ó¦r¥À";
    Text[ arabic ] = "ÅÏÎÇá ÃÍÑÝ ÃáÝÇ";
    Text[ greek ] = "ÅéóáãùãÞ ÷áñáêôÞñùí áëöáâÞôïõ";
    Text[ korean ] = "¾ËÆÄºª ¹®ÀÚ ÀÔ·Â";
    Text[ turkish ] = "Alfa karakter giriþi";
    Text[ language_user1 ] = " ";
};
String STR_EVENT_FRM_KEYINPUT_NOA
{
    TEXT = "Eingabe von Nicht-Alphazeichen" ;
    TEXT [ English ] = "Input of non alpha chars" ;
    Text [ portuguese ] = "Entrada de caracteres não-alfa." ;
    Text [ english_us ] = "Input of non-alpha characters" ;
    Text [ swedish ] = "Inmatning av icke-alfatecken" ;
    Text [ italian ] = "Digitazione di caratteri non alfanumerici" ;
    Text [ spanish ] = "Entrada de caracteres no-alfa" ;
    Text [ french ] = "Saisie de caractères non alphanumériques" ;
    Text [ dutch ] = "Invoer van niet-alfanumerieke tekens" ;
    Text [ portuguese_brazilian ] = "Eingabe von nicht Alphazeichen" ;
    Text [ danish ] = "Input af ikke-alfategn" ;
    Text[ chinese_simplified ] = "ÊäÈëµÄ²»ÊÇÏ£À°Óï×Öĸ°¢¶û·¨";
    Text[ russian ] = "Ââîä çíàêîâ íåàëüôà";
    Text[ polish ] = "Wprow. innych znaków (nie alfa)";
    Text[ japanese ] = "±Ù̧ÍޯĂłȂ¢•¶Žš‚Ì“ü—Í";
    Text[ chinese_traditional ] = "¿é¤Jªº¤£¬O§ÆÃ¾»y²Ä¤@­Ó¦r¥À";
    Text[ arabic ] = "ÅÏÎÇá ÃÍÑÝ ÛíÑ ÃáÝÇ";
    Text[ greek ] = "ÅéóáãùãÞ ìç-áëöáâçôéêþí ÷áñáêôÞñùí";
    Text[ korean ] = "¾ËÆÄºªÀÌ ¾Æ´Ñ ¹®ÀÚ ÀÔ·Â";
    Text[ turkish ] = "Alfa olmayan karakter giriþi";
    Text[ language_user1 ] = " ";
};
String STR_EVENT_FRM_RESIZE
{
    /* ### ACHTUNG: Neuer Text in Resource? Rahmengröße verändern : Rahmengr÷˜e verõndern */
    TEXT = "Rahmengröße verändern" ;
    TEXT [ English ] = "Resize Frane" ;
    Text [ portuguese ] = "Redimensionar moldura" ;
    Text [ english_us ] = "Resize frame" ;
    Text [ portuguese_brazilian ] = "Rahmengröße verändern" ;
    Text [ swedish ] = "Ändra ramstorlek" ;
    Text [ danish ] = "Modificer rammestørrelse" ;
    Text [ italian ] = "Cambia dimensione cornice" ;
    Text [ spanish ] = "Modificar el tamaño del marco" ;
    Text [ french ] = "Modifier la taille du cadre" ;
    Text [ dutch ] = "Kadergrootte wijzigen" ;
    Text[ chinese_simplified ] = "¸ü¸Ä¿òµÄ´óС";
    Text[ russian ] = "Èçìåíèòü ðàçìåð ðàìêè";
    Text[ polish ] = "Zmieñ rozmiar ramki";
    Text[ japanese ] = "˜g‚Ì»²½Þ•ύX";
    Text[ chinese_traditional ] = "Åܧ󮨤j¤p";
    Text[ arabic ] = "ÊÚÏíá ÍÌã ÇáÅØÇÑ";
    Text[ greek ] = "ÁëëáãÞ ìåãÝèïõò ðëáéóßïõ";
    Text[ korean ] = "ÇÁ·¹ÀÓ Å©±â º¯°æ";
    Text[ turkish ] = "Çerçeve boyutunu deðiþtir";
    Text[ language_user1 ] = " ";
};
String STR_EVENT_FRM_MOVE
{
    TEXT = "Rahmen verschieben" ;
    TEXT [ English ] = "Move Frame" ;
    Text [ portuguese ] = "Mover moldura" ;
    Text [ english_us ] = "Move frame" ;
    Text [ portuguese_brazilian ] = "Rahmen verschieben" ;
    Text [ swedish ] = "Flytta ram" ;
    Text [ danish ] = "Flyt ramme" ;
    Text [ italian ] = "Sposta cornice" ;
    Text [ spanish ] = "Desplazar marco" ;
    Text [ french ] = "Déplacer le cadre" ;
    Text [ dutch ] = "Kader verplaatsen" ;
    Text[ chinese_simplified ] = "ÒÆ¶¯¿ò";
    Text[ russian ] = "Ïåðåìåñòèòü ðàìêó";
    Text[ polish ] = "Przenieœ ramkê";
    Text[ japanese ] = "˜g‚̈ړ®";
    Text[ chinese_traditional ] = "²¾°Ê®Ø";
    Text[ arabic ] = "ÅÒÇÍÉ ÇáÅØÇÑ";
    Text[ greek ] = "Ìåôáêßíçóç ðëáéóßïõ";
    Text[ korean ] = "ÇÁ·¹ÀÓ À̵¿";
    Text[ turkish ] = "Çerçeveyi taþý";
    Text[ language_user1 ] = " ";
};
String STR_CONTENT_TYPE_OUTLINE
{
    /* ### ACHTUNG: Neuer Text in Resource? Überschriften : šberschriften */
    TEXT = "Überschriften" ;
    TEXT [ English ] = "Outlines" ;
    Text [ dutch ] = "Koppen" ;
    Text [ english_us ] = "Headings" ;
    Text [ italian ] = "Intestazioni" ;
    Text [ spanish ] = "Encabezados" ;
    Text [ french ] = "Titres" ;
    Text [ swedish ] = "Överskrifter" ;
    Text [ danish ] = "Overskrifter" ;
    Text [ portuguese ] = "Títulos" ;
    Text [ portuguese_brazilian ] = "Überschriften" ;
    Text[ chinese_simplified ] = "±êÌâ";
    Text[ russian ] = "Çàãîëîâêè";
    Text[ polish ] = "Tytu³y";
    Text[ japanese ] = "Œ©o‚µ";
    Text[ chinese_traditional ] = "¼ÐÃD";
    Text[ arabic ] = "ÚäÇæíä";
    Text[ greek ] = "Åðéêåöáëßäåò";
    Text[ korean ] = "¸Ó¸®±Û";
    Text[ turkish ] = "Baþlýk";
    Text[ language_user1 ] = " ";
};
String STR_CONTENT_TYPE_TABLE
{
    TEXT = "Tabellen" ;
    TEXT [ English ] = "Tables" ;
    Text [ english_us ] = "Tables" ;
    Text [ italian ] = "Tabelle" ;
    Text [ spanish ] = "Tablas" ;
    Text [ french ] = "Tableaux" ;
    Text [ dutch ] = "Tabellen" ;
    Text [ swedish ] = "Tabeller" ;
    Text [ danish ] = "Tabeller" ;
    Text [ portuguese ] = "Tabelas" ;
    Text [ portuguese_brazilian ] = "Tabellen" ;
    Text[ chinese_simplified ] = "±í¸ñ";
    Text[ russian ] = "Òàáëèöû";
    Text[ polish ] = "Tabele";
    Text[ japanese ] = "•\\";
    Text[ chinese_traditional ] = "ªí®æ";
    Text[ arabic ] = "ÌÏÇæá";
    Text[ greek ] = "Ðßíáêåò";
    Text[ korean ] = "ǥ";
    Text[ turkish ] = "Tablo";
    Text[ language_user1 ] = " ";
};
String STR_CONTENT_TYPE_FRAME
{
    TEXT = "Textrahmen" ;
    TEXT [ English ] = "Frames" ;
    Text [ dutch ] = "Tekstkader" ;
    Text [ english_us ] = "Text frame" ;
    Text [ italian ] = "Cornice" ;
    Text [ spanish ] = "Marco de texto" ;
    Text [ french ] = "Cadres texte" ;
    Text [ swedish ] = "Textram" ;
    Text [ danish ] = "Tekstbokse" ;
    Text [ portuguese ] = "Molduras de texto" ;
    Text [ portuguese_brazilian ] = "Textrahmen" ;
    Text[ chinese_simplified ] = "Îı¾¿ò";
    Text[ russian ] = "Òåêñòîâàÿ ðàìêà";
    Text[ polish ] = "Ramka tekstu";
    Text[ japanese ] = "÷½Ä˜g";
    Text[ chinese_traditional ] = "¤å¦r¤è¶ô";
    Text[ arabic ] = "ÅØÇÑÇÊ äÕ";
    Text[ greek ] = "Ðëáßóéï êåéìÝíïõ";
    Text[ korean ] = "ÅØ½ºÆ® ÇÁ·¹ÀÓ";
    Text[ turkish ] = "Metin kutusu";
    Text[ language_user1 ] = " ";
};
String STR_CONTENT_TYPE_GRAPHIC
{
    TEXT = "Grafiken" ;
    TEXT [ English ] = "Graphics" ;
    Text [ english_us ] = "Graphics" ;
    Text [ italian ] = "Immagini" ;
    Text [ spanish ] = "Imágenes" ;
    Text [ french ] = "Images" ;
    Text [ dutch ] = "Afbeeldingen" ;
    Text [ swedish ] = "Grafiker" ;
    Text [ danish ] = "Billeder" ;
    Text [ portuguese ] = "Imagens" ;
    Text [ portuguese_brazilian ] = "Grafiken" ;
    Text[ chinese_simplified ] = "ͼÐÎ";
    Text[ russian ] = "Ðèñóíêè";
    Text[ polish ] = "Grafiki";
    Text[ japanese ] = "¸Þ×̨¯¸";
    Text[ chinese_traditional ] = "¹Ï¤ù";
    Text[ arabic ] = "ÕæÑ";
    Text[ greek ] = "ÃñáöéêÜ";
    Text[ korean ] = "±×·¡ÇÈ";
    Text[ turkish ] = "Grafik";
    Text[ language_user1 ] = " ";
};
String STR_CONTENT_TYPE_OLE
{
    TEXT = "OLE-Objekte" ;
    TEXT [ English ] = "OLE-Objects" ;
    Text [ english_us ] = "OLE objects" ;
    Text [ italian ] = "Oggetti OLE" ;
    Text [ spanish ] = "Objetos OLE" ;
    Text [ french ] = "Objets OLE" ;
    Text [ dutch ] = "OLE-objecten" ;
    Text [ swedish ] = "OLE-objekt" ;
    Text [ danish ] = "OLE-objekter" ;
    Text [ portuguese ] = "Objectos OLE" ;
    Text [ portuguese_brazilian ] = "OLE-Objekte" ;
    Text[ chinese_simplified ] = "OLE-¶ÔÏó";
    Text[ russian ] = "Îáúåêòû OLE";
    Text[ polish ] = "Obiekty OLE";
    Text[ japanese ] = "OLE µÌÞ¼Þª¸Ä";
    Text[ chinese_traditional ] = "OLE ª«¥ó";
    Text[ arabic ] = "ßÇÆäÇÊ OLE";
    Text[ greek ] = "Áíôéêåßìåíá OLE";
    Text[ korean ] = "OLE °³Ã¼";
    Text[ turkish ] = "OLE nesnesi";
    Text[ language_user1 ] = " ";
};
String STR_CONTENT_TYPE_BOOKMARK
{
    TEXT = "Textmarken" ;
    TEXT [ English ] = "Bookmarks" ;
    Text [ dutch ] = "Tekstmarkeringen" ;
    Text [ english_us ] = "Bookmarks" ;
    Text [ italian ] = "Segnalibri di testo" ;
    Text [ spanish ] = "Marcas de texto" ;
    Text [ french ] = "Repères de texte" ;
    Text [ swedish ] = "Bokmärken" ;
    Text [ danish ] = "Tekstmarkeringer" ;
    Text [ portuguese ] = "Marcadores de texto" ;
    Text [ portuguese_brazilian ] = "Textmarken" ;
    Text[ chinese_simplified ] = "ÊéÇ©";
    Text[ russian ] = "Çàêëàäêè";
    Text[ polish ] = "Zak³adki";
    Text[ japanese ] = "÷½Äϰ¸";
    Text[ chinese_traditional ] = "¤º¤å¼ÐÅÒ";
    Text[ arabic ] = "ÅÔÇÑÇÊ ãÑÌÚíÉ";
    Text[ greek ] = "ÓçìÜíóåéò êåéìÝíïõ";
    Text[ korean ] = "Ã¥°¥ÇÇ";
    Text[ turkish ] = "Metin iþareti";
    Text[ language_user1 ] = " ";
};
String STR_CONTENT_TYPE_REGION
{
    TEXT = "Bereiche" ;
    TEXT [ English ] = "Regions" ;
    Text [ english_us ] = "Sections" ;
    Text [ italian ] = "Sezioni" ;
    Text [ spanish ] = "Categorías" ;
    Text [ french ] = "Sections" ;
    Text [ dutch ] = "Bereiken" ;
    Text [ swedish ] = "Kategorier" ;
    Text [ danish ] = "Områder" ;
    Text [ portuguese ] = "Categorias" ;
    Text [ portuguese_brazilian ] = "Bereiche" ;
    Text[ chinese_simplified ] = "ÇøÓò";
    Text[ russian ] = "Îáëàñòè";
    Text[ polish ] = "Obszary";
    Text[ japanese ] = "”͈Í";
    Text[ chinese_traditional ] = "°Ï°ì";
    Text[ arabic ] = "äØÇÞÇÊ";
    Text[ greek ] = "Êáôçãïñßåò";
    Text[ korean ] = "±¸¿ª";
    Text[ turkish ] = "Bölüm";
    Text[ language_user1 ] = " ";
};
String STR_CONTENT_TYPE_URLFIELD
{
    TEXT = "Hyperlinks" ;
    TEXT [ English ] = "Hyperlinks" ;
    Text [ dutch ] = "Hyperlinks" ;
    Text [ english_us ] = "Hyperlinks" ;
    Text [ italian ] = "Hyperlink" ;
    Text [ spanish ] = "Hiperenlaces" ;
    Text [ french ] = "Hyperliens" ;
    Text [ swedish ] = "Hyperlänkar" ;
    Text [ danish ] = "Hyperlinks" ;
    Text [ portuguese ] = "Hiperligações" ;
    Text [ portuguese_brazilian ] = "Hyperlinks" ;
    Text[ chinese_simplified ] = "³¬Á´½Ó";
    Text[ russian ] = "Ãèïåðññûëêè";
    Text[ polish ] = "Hiper³¹cza";
    Text[ japanese ] = "ʲÊß°ØÝ¸";
    Text[ chinese_traditional ] = "¶W³sµ²";
    Text[ arabic ] = "ÇÑÊÈÇØÇÊ ÊÔÚÈíÉ";
    Text[ greek ] = "Õðåñ-óõíäÝóåéò";
    Text[ korean ] = "ÇÏÀÌÆÛ¸µÅ©";
    Text[ turkish ] = "Hyperlink";
    Text[ language_user1 ] = " ";
};
String STR_CONTENT_TYPE_REFERENCE
{
    TEXT = "Referenzen" ;
    TEXT [ English ] = "References" ;
    Text [ dutch ] = "Verwijzingen" ;
    Text [ english_us ] = "References" ;
    Text [ italian ] = "Riferimenti" ;
    Text [ spanish ] = "Referencias" ;
    Text [ french ] = "Références" ;
    Text [ swedish ] = "Referenser" ;
    Text [ danish ] = "Referencer" ;
    Text [ portuguese ] = "Referências" ;
    Text [ portuguese_brazilian ] = "Referenzen" ;
    Text[ chinese_simplified ] = "ÒýÓÃ";
    Text[ russian ] = "Ññûëêè";
    Text[ polish ] = "Odwo³ania";
    Text[ japanese ] = "ŽQÆ";
    Text[ chinese_traditional ] = "°Ñ·Ó";
    Text[ arabic ] = "ãÑÇÌÚ";
    Text[ greek ] = "ÁíáöïñÝò";
    Text[ korean ] = "ÂüÁ¶";
    Text[ turkish ] = "Referans";
    Text[ language_user1 ] = " ";
};
String STR_CONTENT_TYPE_INDEX
{
    TEXT = "Verzeichnisse" ;
    TEXT [ English ] = "Indexes" ;
    Text [ dutch ] = "Indices" ;
    Text [ english_us ] = "Indexes" ;
    Text [ italian ] = "Indici" ;
    Text [ spanish ] = "Índices" ;
    Text [ french ] = "Index" ;
    Text [ swedish ] = "Förteckningar" ;
    Text [ danish ] = "Indeks" ;
    Text [ portuguese ] = "Indices" ;
    Text [ portuguese_brazilian ] = "Verzeichnisse" ;
    Text[ chinese_simplified ] = "Ŀ¼";
    Text[ russian ] = "Óêàçàòåëè";
    Text[ polish ] = "Indeksy";
    Text[ japanese ] = "–ÚŽŸ‚ƍõˆø";
    Text[ chinese_traditional ] = "¥Ø¿ý";
    Text[ arabic ] = "ÝåÇÑÓ";
    Text[ greek ] = "ÅõñåôÞñéá";
    Text[ korean ] = "»öÀÎ";
    Text[ turkish ] = "Dizin";
    Text[ language_user1 ] = " ";
};
String STR_CONTENT_TYPE_DRAWOBJECT
{
    TEXT = "Zeichenobjekte" ;
    TEXT [ English ] = "Draw objects" ;
    Text [ dutch ] = "Tekenobjecten" ;
    Text [ english_us ] = "Draw objects" ;
    Text [ italian ] = "Oggetti di disegno" ;
    Text [ spanish ] = "Objetos de dibujo" ;
    Text [ french ] = "Objets de dessin" ;
    Text [ swedish ] = "Ritobjekt" ;
    Text [ danish ] = "Tegneobjekter" ;
    Text [ portuguese ] = "Objectos de desenho" ;
    Text [ portuguese_brazilian ] = "Zeichenobjekte" ;
    Text[ chinese_simplified ] = "»æÍ¼¶ÔÏó";
    Text[ russian ] = "Ãðàôè÷åñêèå îáúåêòû";
    Text[ polish ] = "Obiekty rysunkowe";
    Text[ japanese ] = "}Œ`•`‰æµÌÞ¼Þª¸Ä";
    Text[ chinese_traditional ] = "ø¹Ïª«¥ó";
    Text[ arabic ] = "ßÇÆäÇÊ ÑÓæãíÉ";
    Text[ greek ] = "Áíôéêåßìåíá ó÷åäßáóçò";
    Text[ korean ] = "±×¸®±â °³Ã¼";
    Text[ turkish ] = "Çizim nesnesi";
    Text[ language_user1 ] = " ";
};
String STR_CONTENT_TYPE_POSTIT
{
    TEXT = "Notizen" ;
    TEXT [ English ] = "Annotations" ;
    Text [ dutch ] = "Aantekeningen" ;
    Text [ english_us ] = "Notes" ;
    Text [ swedish ] = "Anteckningar" ;
    Text [ danish ] = "Noter" ;
    Text [ italian ] = "Note" ;
    Text [ spanish ] = "Notas" ;
    Text [ french ] = "Notes" ;
    Text [ portuguese ] = "Anotações" ;
    Text [ portuguese_brazilian ] = "Notizen" ;
    Text[ chinese_simplified ] = "±¸×¢";
    Text[ russian ] = "Ïðèìå÷àíèÿ";
    Text[ polish ] = "Notatki";
    Text[ japanese ] = "ÒӒ ";
    Text[ chinese_traditional ] = "³Æª`";
    Text[ arabic ] = "ãáÇÍÙÇÊ";
    Text[ greek ] = "Óçìåéþóåéò";
    Text[ korean ] = "¸Þ¸ð";
    Text[ turkish ] = "Not";
    Text[ language_user1 ] = " ";
};
String STR_CONTENT_TYPE_SINGLE_OUTLINE
{
    /* ### ACHTUNG: Neuer Text in Resource? Überschrift : šberschrift */
    TEXT = "Überschrift" ;
    TEXT [ English ] = "Outline" ;
    Text [ english_us ] = "Heading" ;
    Text [ italian ] = "Intestazione" ;
    Text [ spanish ] = "Encabezado" ;
    Text [ french ] = "Titre" ;
    Text [ dutch ] = "Kop" ;
    Text [ swedish ] = "Överskrift" ;
    Text [ danish ] = "Overskrift" ;
    Text [ portuguese ] = "Título" ;
    Text [ portuguese_brazilian ] = "Überschrift" ;
    Text[ chinese_simplified ] = "±êÌâ";
    Text[ russian ] = "Çàãîëîâîê";
    Text[ polish ] = "Tytu³";
    Text[ japanese ] = "Œ©o‚µ";
    Text[ chinese_traditional ] = "¼ÐÃD";
    Text[ arabic ] = "ÚäæÇä";
    Text[ greek ] = "Åðéêåöáëßäá";
    Text[ korean ] = "¸Ó¸®±Û";
    Text[ turkish ] = "Baþlýk";
    Text[ language_user1 ] = " ";
};
String STR_CONTENT_TYPE_SINGLE_TABLE
{
    TEXT = "Tabelle" ;
    TEXT [ English ] = "Table" ;
    Text [ english_us ] = "Table" ;
    Text [ italian ] = "Tabella" ;
    Text [ spanish ] = "Tabla" ;
    Text [ french ] = "Tableau" ;
    Text [ dutch ] = "Tabel" ;
    Text [ swedish ] = "Tabell" ;
    Text [ danish ] = "Tabel" ;
    Text [ portuguese ] = "Tabela" ;
    Text [ portuguese_brazilian ] = "Tabelle" ;
    Text[ chinese_simplified ] = "±í¸ñ";
    Text[ russian ] = "Òàáëèöà";
    Text[ polish ] = "Tabela";
    Text[ japanese ] = "•\\";
    Text[ chinese_traditional ] = "ªí®æ";
    Text[ arabic ] = "ÌÏæá";
    Text[ greek ] = "Ðßíáêáò";
    Text[ korean ] = "ǥ";
    Text[ turkish ] = "Tablo";
    Text[ language_user1 ] = " ";
};
String STR_CONTENT_TYPE_SINGLE_FRAME
{
    TEXT = "Textrahmen" ;
    TEXT [ English ] = "Frame" ;
    Text [ dutch ] = "Tekstkader" ;
    Text [ english_us ] = "Text frame" ;
    Text [ italian ] = "Cornice" ;
    Text [ spanish ] = "Marco de texto" ;
    Text [ french ] = "Cadre texte" ;
    Text [ swedish ] = "Textram" ;
    Text [ danish ] = "Tekstboks" ;
    Text [ portuguese ] = "Moldura de texto" ;
    Text [ portuguese_brazilian ] = "Textrahmen" ;
    Text[ chinese_simplified ] = "Îı¾¿ò";
    Text[ russian ] = "Òåêñòîâàÿ ðàìêà";
    Text[ polish ] = "Ramka tekstu";
    Text[ japanese ] = "÷½Ä˜g";
    Text[ chinese_traditional ] = "¤å¦r¤è¶ô";
    Text[ arabic ] = "ÅØÇÑ äÕ";
    Text[ greek ] = "Ðëáßóéï êåéìÝíïõ";
    Text[ korean ] = "ÅØ½ºÆ® ÇÁ·¹ÀÓ";
    Text[ turkish ] = "Metin kutusu";
    Text[ language_user1 ] = " ";
};
String STR_CONTENT_TYPE_SINGLE_GRAPHIC
{
    TEXT = "Grafik" ;
    TEXT [ English ] = "Graphic" ;
    Text [ english_us ] = "Graphics" ;
    Text [ italian ] = "Immagine" ;
    Text [ spanish ] = "Imagen" ;
    Text [ french ] = "Image" ;
    Text [ dutch ] = "Afbeelding" ;
    Text [ swedish ] = "Grafik" ;
    Text [ danish ] = "Billede" ;
    Text [ portuguese ] = "Imagem" ;
    Text [ portuguese_brazilian ] = "Grafik" ;
    Text[ chinese_simplified ] = "ͼÐÎ";
    Text[ russian ] = "Ðèñóíîê";
    Text[ polish ] = "Grafika";
    Text[ japanese ] = "¸Þ×̨¯¸";
    Text[ chinese_traditional ] = "¹Ï¤ù";
    Text[ arabic ] = "ÕæÑÉ";
    Text[ greek ] = "Ãñáöéêü";
    Text[ korean ] = "±×·¡ÇÈ";
    Text[ turkish ] = "Grafik";
    Text[ language_user1 ] = " ";
};
String STR_CONTENT_TYPE_SINGLE_OLE
{
    TEXT = "OLE-Objekt" ;
    TEXT [ English ] = "OLE-Object" ;
    Text [ english_us ] = "OLE object" ;
    Text [ italian ] = "Oggetto OLE" ;
    Text [ spanish ] = "Objeto OLE" ;
    Text [ french ] = "Objet OLE" ;
    Text [ dutch ] = "OLE-object" ;
    Text [ swedish ] = "OLE-objekt" ;
    Text [ danish ] = "OLE-objekt" ;
    Text [ portuguese ] = "Objecto OLE" ;
    Text [ portuguese_brazilian ] = "OLE-Objekt" ;
    Text[ chinese_simplified ] = "OLE-¶ÔÏó";
    Text[ russian ] = "Îáúåêò OLE";
    Text[ polish ] = "Obiekt OLE";
    Text[ japanese ] = "OLE µÌÞ¼Þª¸Ä";
    Text[ chinese_traditional ] = "OLE ª«¥ó";
    Text[ arabic ] = "ßÇÆä OLE";
    Text[ greek ] = "Áíôéêåßìåíï OLE";
    Text[ korean ] = "OLE °³Ã¼";
    Text[ turkish ] = "OLE nesnesi";
    Text[ language_user1 ] = " ";
};
String STR_CONTENT_TYPE_SINGLE_BOOKMARK
{
    TEXT = "Textmarke" ;
    TEXT [ English ] = "Bookmark" ;
    Text [ dutch ] = "Tekstmarkering" ;
    Text [ english_us ] = "Bookmark" ;
    Text [ italian ] = "Segnalibro" ;
    Text [ spanish ] = "Marca de texto" ;
    Text [ french ] = "Repère de texte" ;
    Text [ swedish ] = "Bokmärke" ;
    Text [ danish ] = "Tekstmarkering" ;
    Text [ portuguese ] = "Marcador de texto" ;
    Text [ portuguese_brazilian ] = "Textmarke" ;
    Text[ chinese_simplified ] = "ÊéÇ©";
    Text[ russian ] = "Çàêëàäêà";
    Text[ polish ] = "Zak³adka";
    Text[ japanese ] = "÷½Äϰ¸";
    Text[ chinese_traditional ] = "¤º¤å¼ÐÅÒ";
    Text[ arabic ] = "ÅÔÇÑÉ ãÑÌÚíÉ";
    Text[ greek ] = "ÓÞìáíóç êåéìÝíïõ";
    Text[ korean ] = "Ã¥°¥ÇÇ";
    Text[ turkish ] = "Metin iþareti";
    Text[ language_user1 ] = " ";
};
String STR_CONTENT_TYPE_SINGLE_REGION
{
    TEXT = "Bereich" ;
    TEXT [ English ] = "Region" ;
    Text [ english_us ] = "Section" ;
    Text [ italian ] = "Area" ;
    Text [ spanish ] = "Area" ;
    Text [ french ] = "Section" ;
    Text [ dutch ] = "Bereik" ;
    Text [ swedish ] = "Kategori" ;
    Text [ danish ] = "Område" ;
    Text [ portuguese ] = "Categoria" ;
    Text [ portuguese_brazilian ] = "Bereich" ;
    Text[ chinese_simplified ] = "ÇøÓò";
    Text[ russian ] = "Îáëàñòü";
    Text[ polish ] = "Obszar";
    Text[ japanese ] = "”͈Í";
    Text[ chinese_traditional ] = "°Ï°ì";
    Text[ arabic ] = "äØÇÞ";
    Text[ greek ] = "Åíüôçôá";
    Text[ korean ] = "±¸¿ª";
    Text[ turkish ] = "Bölüm";
    Text[ language_user1 ] = " ";
};
String STR_CONTENT_TYPE_SINGLE_URLFIELD
{
    TEXT = "Hyperlink" ;
    TEXT [ English ] = "Hyperlink" ;
    Text [ dutch ] = "Hyperlink" ;
    Text [ english_us ] = "Hyperlink" ;
    Text [ italian ] = "Hyperlink" ;
    Text [ spanish ] = "Hiperenlace" ;
    Text [ french ] = "Hyperlien" ;
    Text [ swedish ] = "Hyperlänk" ;
    Text [ danish ] = "Hyperlink" ;
    Text [ portuguese ] = "Hiperligação" ;
    Text [ portuguese_brazilian ] = "Hyperlink" ;
    Text[ chinese_simplified ] = "³¬Á´½Ó";
    Text[ russian ] = "Ãèïåðññûëêà";
    Text[ polish ] = "Hiper³¹cze";
    Text[ japanese ] = "ʲÊß°ØÝ¸";
    Text[ chinese_traditional ] = "¶W³sµ²";
    Text[ arabic ] = "ÇÑÊÈÇØ ÊÔÚÈí";
    Text[ greek ] = "Õðåñ-óýíäåóç";
    Text[ korean ] = "ÇÏÀÌÆÛ¸µÅ©";
    Text[ turkish ] = "Hyperlink";
    Text[ language_user1 ] = " ";
};
String STR_CONTENT_TYPE_SINGLE_REFERENCE
{
    TEXT = "Referenz" ;
    TEXT [ English ] = "Reference" ;
    Text [ dutch ] = "Verwijzing" ;
    Text [ english_us ] = "Reference" ;
    Text [ italian ] = "Riferimento" ;
    Text [ spanish ] = "Referencia" ;
    Text [ french ] = "Référence" ;
    Text [ swedish ] = "Referens" ;
    Text [ danish ] = "Reference" ;
    Text [ portuguese ] = "Referência" ;
    Text [ portuguese_brazilian ] = "Referenz" ;
    Text[ chinese_simplified ] = "ÒýÓÃ";
    Text[ russian ] = "Ññûëêà";
    Text[ polish ] = "Odwo³anie";
    Text[ japanese ] = "ŽQÆ";
    Text[ chinese_traditional ] = "°Ñ·Ó";
    Text[ arabic ] = "ãÑÌÚ";
    Text[ greek ] = "ÁíáöïñÜ";
    Text[ korean ] = "ÂüÁ¶";
    Text[ turkish ] = "Referans";
    Text[ language_user1 ] = " ";
};
String STR_CONTENT_TYPE_SINGLE_INDEX
{
    TEXT = "Verzeichnis" ;
    TEXT [ English ] = "Index" ;
    Text [ dutch ] = "Index" ;
    Text [ english_us ] = "Index" ;
    Text [ italian ] = "Indice" ;
    Text [ spanish ] = "Índice" ;
    Text [ french ] = "Index" ;
    Text [ swedish ] = "Förteckning" ;
    Text [ danish ] = "Indeks" ;
    Text [ portuguese ] = "Índice" ;
    Text [ portuguese_brazilian ] = "Verzeichniß" ;
    Text[ chinese_simplified ] = "Ŀ¼";
    Text[ russian ] = "Óêàçàòåëü";
    Text[ polish ] = "Indeks";
    Text[ japanese ] = "õˆø";
    Text[ chinese_traditional ] = "¥Ø¿ý";
    Text[ arabic ] = "ÝåÑÓ";
    Text[ greek ] = "ÅõñåôÞñéï";
    Text[ korean ] = "»öÀÎ";
    Text[ turkish ] = "Dizin";
    Text[ language_user1 ] = " ";
};
String STR_CONTENT_TYPE_SINGLE_POSTIT
{
    TEXT = "Notiz" ;
    TEXT [ English ] = "Annotation" ;
    Text [ dutch ] = "Aantekening" ;
    Text [ english_us ] = "Note" ;
    Text [ swedish ] = "Anteckning" ;
    Text [ danish ] = "Note" ;
    Text [ italian ] = "Nota" ;
    Text [ spanish ] = "Nota" ;
    Text [ french ] = "Note" ;
    Text [ portuguese ] = "Anotação" ;
    Text [ portuguese_brazilian ] = "Notiz" ;
    Text[ chinese_simplified ] = "±¸×¢";
    Text[ russian ] = "Ïðèìå÷àíèå";
    Text[ polish ] = "Notatka";
    Text[ japanese ] = "ÒÓ";
    Text[ chinese_traditional ] = "³Æª`";
    Text[ arabic ] = "ãáÇÍÙÉ";
    Text[ greek ] = "Óçìåßùóç";
    Text[ korean ] = "¸Þ¸ð";
    Text[ turkish ] = "Not";
    Text[ language_user1 ] = " ";
};
String STR_CONTENT_TYPE_SINGLE_DRAWOBJECT
{
    TEXT = "Zeichenobjekt" ;
    TEXT [ English ] = "Draw object" ;
    Text [ dutch ] = "Tekenobject" ;
    Text [ english_us ] = "Draw object" ;
    Text [ italian ] = "Oggetto di disegno" ;
    Text [ spanish ] = "Objeto de dibujo" ;
    Text [ french ] = "Objet de dessin" ;
    Text [ swedish ] = "Ritobjekt" ;
    Text [ danish ] = "Tegneobjekt" ;
    Text [ portuguese ] = "Objecto de desenho" ;
    Text [ portuguese_brazilian ] = "Zeichenobjekt" ;
    Text[ chinese_simplified ] = "»æÍ¼¶ÔÏó";
    Text[ russian ] = "Ãðàôè÷åñêèé îáúåêò";
    Text[ polish ] = "Obiekt rysunkowy";
    Text[ japanese ] = "}Œ`•`‰æµÌÞ¼Þª¸Ä";
    Text[ chinese_traditional ] = "ø¹Ïª«¥ó";
    Text[ arabic ] = "ßÇÆä ÑÓæãí";
    Text[ greek ] = "Aíôéêåßìåíï ó÷åäßáóçò";
    Text[ korean ] = "±×¸®±â °³Ã¼";
    Text[ turkish ] = "Çizim nesnesi";
    Text[ language_user1 ] = " ";
};
String STR_DEFINE_NUMBERFORMAT
{
    TEXT = "Weitere Formate..." ;
    TEXT [ English ] = "Additional formats..." ;
    Text [ portuguese ] = "Outros formatos..." ;
    Text [ english_us ] = "Additional formats..." ;
    Text [ portuguese_brazilian ] = "Weitere Formate..." ;
    Text [ swedish ] = "Ytterligare format..." ;
    Text [ danish ] = "Yderligere formater..." ;
    Text [ italian ] = "Ulteriori formati..." ;
    Text [ spanish ] = "Otros formatos..." ;
    Text [ french ] = "Autres formats..." ;
    Text [ dutch ] = "Andere formaten..." ;
    Text[ chinese_simplified ] = "ÆäËüµÄ¸ñʽ...";
    Text[ russian ] = "Äîïîëíèòåëüíûå ôîðìàòû...";
    Text[ polish ] = "Dodatkowe formaty...";
    Text[ japanese ] = "‚»‚Ì‘¼‚̏‘Ž®...";
    Text[ chinese_traditional ] = "¨ä¥¦®æ¦¡...";
    Text[ arabic ] = "...ÊäÓíÞÇÊ ÅÖÇÝíÉ";
    Text[ greek ] = "Åðéðñüóèåôåò ìïñöÝò...";
    Text[ korean ] = "ºÎ°¡ÀûÀÎ ¼­½Ä...";
    Text[ turkish ] = "Diðer formatlar...";
    Text[ language_user1 ] = " ";
};
String RID_STR_SYSTEM
{
    Text = "[System]" ;
    Text [ ENGLISH ] = " [System]" ;
    Text[ english_us ] = "[System]";
    Text[ portuguese ] = "[Sistema]";
    Text[ russian ] = "[Èç ñèñòåìû]";
    Text[ greek ] = "[Óýóôçìá]";
    Text[ dutch ] = "[Systeem]";
    Text[ french ] = "[Système]";
    Text[ spanish ] = "[Sistema]";
    Text[ italian ] = "[Sistema]";
    Text[ danish ] = "[System]";
    Text[ swedish ] = "[System]";
    Text[ polish ] = "[System]";
    Text[ portuguese_brazilian ] = "[System]";
    Text[ japanese ] = "[¼½ÃÑ]";
    Text[ korean ] = "[½Ã½ºÅÛ]";
    Text[ chinese_simplified ] = "[ϵͳ]";
    Text[ chinese_traditional ] = "[¨t²Î]";
    Text[ arabic ] = "[äÙÇã]";
    Text[ turkish ] = "[Sistem]";
};
String STR_MULT_INTERACT_SPELL_WARN
{
    Text = "Die Interaktive Rechschreibprüfung ist\nbereits in anderem Dokument aktiv" ;
    Text [ ENGLISH ] = "The interactive spelling already active\in a different document" ;
    Text[ english_us ] = "The interactive spellcheck is already active\\in a different document";
    Text[ portuguese ] = "A verificação ortográfica interactiva já está\nactiva noutro documento";
    Text[ russian ] = "Èíòåðàêòèâíàÿ ïðîâåðêà ïðàâîïèñàíèÿ\nóæå âêëþ÷åíà â äðóãîì äîêóìåíòå";
    Text[ greek ] = "Ôï äéáëïãéêü ðñüãñáììá åëÝã÷ïõ ïñèïãñáößáò\n÷ñçóéìïðïéåßôáé áðü êÜðïéï Üëëï Ýããñáöï";
    Text[ dutch ] = "De interactieve spellingcontrole is\nreeds actief in een ander document.";
    Text[ french ] = "La vérification orthographique interactive est\nen cours d'utilisation dans un autre document.";
    Text[ spanish ] = "La corrección ortográfica interactiva\nya está activada en otro documento";
    Text[ italian ] = "Il controllo ortografico interattivo è\ngià stato attivato in un altro documento.";
    Text[ danish ] = "Den interaktive stavekontrol er\nallerede aktiv i et andet dokument";
    Text[ swedish ] = "Den interaktiva rättstavningskontrollen\när redan aktiv i ett annat dokument";
    Text[ polish ] = "Interaktywne sprawdzanie pisowni\naktywne jest ju¿ w innym dokumencie.";
    Text[ portuguese_brazilian ] = "The interactive spelling already active\\in a different document";
    Text[ japanese ] = "²ÝÀ׸èÌÞ½ÍßÙÁª¯¸‚Í‚·‚Å‚É\n‚Ù‚©‚ÌÄÞ·­ÒÝĂű¸Ã¨ÌނɂȂÁ‚Ä‚¢‚Ü‚·";
    Text[ korean ] = "´ëÈ­Çü ¸ÂÃã¹ýÀº \nÀÌ¹Ì ´Ù¸¥ ¹®¼­¿¡¼­ Ȱ¼º»óÅÂÀÔ´Ï´Ù.";
    Text[ chinese_simplified ] = "½»»¥Ê½Õý×Ö·¨¼ì²é\nÒѾ­Ê¹ÓÃÔÚÒ»¸öÆäËüÎĵµÖÐ";
    Text[ chinese_traditional ] = "¥t¤@­Ó¤å¥ó¤w¸g¨Ï¥Î¤¬°Ê¦¡¥¿¦rªk¥\\¯à";
    Text[ arabic ] = "ÇáÊÏÞíÞ ÇáÅãáÇÆí ÇáÊÈÇÏáí\näÔØ ÈÇáÝÚá Ýí ãÓÊäÏ ÂÎÑ";
    Text[ turkish ] = "Etkileþimli yazým denetimi\nþu an baþka bir belgede etkin";
};
String STR_MULT_INTERACT_HYPH_WARN
{
    Text = "Die Interaktive Silbentrennung ist\nbereits in anderem Dokument aktiv" ;
    Text [ ENGLISH ] = "The interactive hyphenation already active\in a different document" ;
    Text[ english_us ] = "The interactive hyphenation is already active\\in a different document";
    Text[ portuguese ] = "A divisão silábica interactiva já está\nactiva noutro documento";
    Text[ russian ] = "Èíòåðàêòèâíàÿ ðàññòàíîâêà ïåðåíîñîâ\nóæå âêëþ÷åíà â äðóãîì äîêóìåíòå";
    Text[ greek ] = "Ôï äéáëïãéêü ðñüãñáììá óõëëáâéóìïý\n÷ñçóéìïðïéåßôáé áðü êÜðïéï Üëëï Ýããñáöï";
    Text[ dutch ] = "De interactieve woordafbreking is\nreeds actief in een ander document";
    Text[ french ] = "La coupure de mots interactive est\nen cours d'utilisation dans un autre document.";
    Text[ spanish ] = "La separación silábica interactiva\nya está activa en otro documento";
    Text[ italian ] = "La sillabazione  interattiva è\ngià stata attivata in un altro documento.";
    Text[ danish ] = "Den interaktive orddeling er\nallerede aktiv i et andet dokument";
    Text[ swedish ] = "Den interaktiva avstavningen är\nredan aktiv i ett annat dokument";
    Text[ polish ] = "Interaktywne dzielenie wyrazów na sylaby\naktywne jest ju¿ w innym dokumencie.";
    Text[ portuguese_brazilian ] = "The interactive hyphenation already active\\in a different document";
    Text[ japanese ] = "²ÝÀ׸èÌÞʲÌȰ¼®Ý‚Í‚·‚Å‚É\n‚Ù‚©‚ÌÄÞ·­ÒÝĂű¸Ã¨ÌނɂȂÁ‚Ä‚¢‚Ü‚·";
    Text[ korean ] = "´ëÈ­Çü ÇÏÀÌÇ ³Ö±â´Â \nÀÌ¹Ì ´Ù¸¥ ¹®¼­¿¡¼­ Ȱ¼º»óÅÂÀÔ´Ï´Ù.";
    Text[ chinese_simplified ] = "½»»¥Ê½Á¬×Ö·û\nÒѾ­Ê¹ÓÃÔÚÒ»¸öÆäËüÎĵµÖÐ";
    Text[ chinese_traditional ] = "¥t¤@­Ó¤å¥ó¤w¸g¨Ï¥Î¤¬°Ê¦¡³s¦r¸¹¥\\¯à";
    Text[ arabic ] = "ÝÕá ÇáãÞÇØÚ ÇáÊÈÇÏáí\näÔØ ÈÇáÝÚá Ýí ãÓÊäÏ ÂÎÑ";
    Text[ turkish ] = "Etkileþimli heceleme\nþu an baþka bir belgede etkin";
};
String STR_SPELL_TITLE
{
    Text = "Rechtschreibprüfung" ;
    Text [ ENGLISH ] = "Spelling" ;
    Text[ english_us ] = "Spellcheck";
    Text[ portuguese ] = "Ortografia";
    Text[ russian ] = "Ïðîâåðêà ïðàâîïèñàíèÿ";
    Text[ greek ] = "¸ëåã÷ïò ïñèïãñáößáò";
    Text[ dutch ] = "Spellingcontrole";
    Text[ french ] = "Vérification orthographique";
    Text[ spanish ] = "Corrección ortográfica";
    Text[ italian ] = "Controllo ortografico";
    Text[ danish ] = "Stavekontrol";
    Text[ swedish ] = "Rättstavningskontroll";
    Text[ polish ] = "Sprawdzanie pisowni";
    Text[ portuguese_brazilian ] = "Spelling";
    Text[ japanese ] = "½ÍßÙÁª¯¸";
    Text[ korean ] = "¸ÂÃã¹ý °Ë»ç";
    Text[ chinese_simplified ] = "Õý×Ö·¨¼ì²é";
    Text[ chinese_traditional ] = "¥¿¦rªk";
    Text[ arabic ] = "ÇáÊÏÞíÞ ÇáÅãáÇÆí";
    Text[ turkish ] = "Yazým denetimi";
};
String STR_HYPH_TITLE
{
    Text = "Silbentrennung" ;
    Text [ ENGLISH ] = "Hyphenation" ;
    Text[ english_us ] = "Hyphenation";
    Text[ portuguese ] = "Divisão silábica";
    Text[ russian ] = "Ðàññòàíîâêà ïåðåíîñîâ";
    Text[ greek ] = "Óõëëáâéóìüò";
    Text[ dutch ] = "Woordafbreking";
    Text[ french ] = "Coupure de mots";
    Text[ spanish ] = "Separación silábica";
    Text[ italian ] = "Sillabazione";
    Text[ danish ] = "Orddeling";
    Text[ swedish ] = "Avstavning";
    Text[ polish ] = "Dzielenie wyrazów na sylaby";
    Text[ portuguese_brazilian ] = "Hyphenation";
    Text[ japanese ] = "ʲÌȰ¼®Ý";
    Text[ korean ] = "ÇÏÀÌÇ ³Ö±â";
    Text[ chinese_simplified ] = "Á¬×Ö·û";
    Text[ chinese_traditional ] = "³s¦r¸¹";
    Text[ arabic ] = "ÝÕá ÇáãÞÇØÚ";
    Text[ turkish ] = "Heceleme";
};

diff --git a/sw/source/ui/utlui/zoomctrl.cxx b/sw/source/ui/utlui/zoomctrl.cxx
new file mode 100644
index 0000000..de4022b
--- /dev/null
+++ b/sw/source/ui/utlui/zoomctrl.cxx
@@ -0,0 +1,175 @@
/*************************************************************************
 *
 *  $RCSfile: zoomctrl.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:50 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "hintids.hxx"

#ifndef _STATUS_HXX //autogen
#include <vcl/status.hxx>
#endif
#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif
#ifndef _SFXSTRITEM_HXX //autogen
#include <svtools/stritem.hxx>
#endif
#ifndef _SVX_ZOOMITEM_HXX //autogen
#include <svx/zoomitem.hxx>
#endif

#include "swtypes.hxx"
#include "zoomctrl.hxx"


SFX_IMPL_STATUSBAR_CONTROL( SwZoomControl, SvxZoomItem );


SwZoomControl::SwZoomControl( USHORT nId,
                                  StatusBar& rStb,
                                  SfxBindings& rBind ) :
    SvxZoomStatusBarControl( nId, rStb, rBind )
{
}

// -----------------------------------------------------------------------

SwZoomControl::~SwZoomControl()
{
}

// -----------------------------------------------------------------------

void SwZoomControl::StateChanged( USHORT nSID, SfxItemState eState,
                                  const SfxPoolItem* pState )
{
    if(SFX_ITEM_AVAILABLE == eState && pState->ISA( SfxStringItem ))
    {
        sPreviewZoom = ((const SfxStringItem*)pState)->GetValue();
        GetStatusBar().SetItemText( GetId(), sPreviewZoom );
    }
    else
    {
        sPreviewZoom = aEmptyStr;
        SvxZoomStatusBarControl::StateChanged(nSID, eState, pState);
    }
}

// -----------------------------------------------------------------------

void SwZoomControl::Paint( const UserDrawEvent& rUsrEvt )
{
    if(!sPreviewZoom.Len())
        SvxZoomStatusBarControl::Paint(rUsrEvt);
    else
        GetStatusBar().SetItemText( GetId(), sPreviewZoom );
}

// -----------------------------------------------------------------------

void SwZoomControl::Command( const CommandEvent& rCEvt )
{
    if(!sPreviewZoom.Len())
        SvxZoomStatusBarControl::Command(rCEvt);
}

/*************************************************************************

      $Log: not supported by cvs2svn $
      Revision 1.9  2000/09/18 16:06:19  willem.vandorp
      OpenOffice header added.

      Revision 1.8  2000/02/11 15:01:17  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.7  1997/11/21 11:10:18  MA
      includes


      Rev 1.6   21 Nov 1997 12:10:18   MA
   includes

      Rev 1.5   03 Nov 1997 13:59:24   MA
   precomp entfernt

      Rev 1.4   05 Sep 1997 12:23:06   MH
   chg: header

      Rev 1.3   06 Aug 1997 11:13:02   MH
   chg: header

      Rev 1.2   18 Jun 1996 16:59:44   OS
   ui_pch includen

      Rev 1.1   20 Mar 1996 13:42:54   HJS
   einmal segmentc.hxx reicht

      Rev 1.0   14 Jan 1996 15:30:32   OS
   Initial revision.

*************************************************************************/



diff --git a/sw/source/ui/web/makefile.mk b/sw/source/ui/web/makefile.mk
new file mode 100644
index 0000000..6d9c51d
--- /dev/null
+++ b/sw/source/ui/web/makefile.mk
@@ -0,0 +1,113 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:50 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=..$/..$/..

PRJNAME=sw
TARGET=web

AUTOSEG=true

PROJECTPCH=ui_pch
PDBTARGET=ui_pch
PROJECTPCHSOURCE=..\ui_1st\ui_pch

# --- Settings -----------------------------------------------------

.INCLUDE :  $(PRJ)$/inc$/swpre.mk
.INCLUDE :  settings.mk
.INCLUDE :  $(PRJ)$/inc$/sw.mk

# --- Files --------------------------------------------------------

CXXFILES = \
        wdrwbase.cxx	\
        wformsh.cxx	\
        wgrfsh.cxx	\
        wlistsh.cxx	\
        wolesh.cxx	\
        wtabsh.cxx	\
        wfrmsh.cxx	\
        wtextsh.cxx	\
        wdocsh.cxx	\
        wview.cxx

SRCFILES =  \
        web.src	\
        webport.src

SLOFILES =  \
        $(SLO)$/wdrwbase.obj	\
        $(SLO)$/wformsh.obj	\
        $(SLO)$/wgrfsh.obj	\
        $(SLO)$/wlistsh.obj	\
        $(SLO)$/wolesh.obj	\
        $(SLO)$/wtabsh.obj	\
        $(SLO)$/wfrmsh.obj \
        $(SLO)$/wtextsh.obj \
        $(SLO)$/wdocsh.obj \
        $(SLO)$/wview.obj

# --- Tagets -------------------------------------------------------

.INCLUDE :  target.mk

diff --git a/sw/source/ui/web/wdocsh.cxx b/sw/source/ui/web/wdocsh.cxx
new file mode 100644
index 0000000..5131747
--- /dev/null
+++ b/sw/source/ui/web/wdocsh.cxx
@@ -0,0 +1,264 @@
/*************************************************************************
 *
 *  $RCSfile: wdocsh.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:51 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop


#ifndef _SVX_SRCHITEM_HXX
#include <svx/srchitem.hxx>
#endif
#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif
#ifndef _SVX_SVXIDS_HRC //autogen
#include <svx/svxids.hrc>
#endif

#ifndef _SV_EXCHANGE_HXX //autogen
#include <vcl/exchange.hxx>
#endif

#ifndef _SO_CLSIDS_HXX
#include <so3/clsids.hxx>
#endif

#include "itemdef.hxx"

#include "cmdid.h"
#include "swtypes.hxx"

#include "shellio.hxx"
// nur wegen des Itemtypes
#include "wdocsh.hxx"
#include "web.hrc"

#define SwWebDocShell
#include "swslots.hxx"

#define C2S(cChar) UniString::CreateFromAscii(cChar)

SFX_IMPL_INTERFACE( SwWebDocShell, SfxObjectShell, SW_RES(0) )
{
    SwWebDocShell::Factory().RegisterHelpFile(C2S("swriter.svh"));
    SwWebDocShell::Factory().RegisterHelpPIFile(C2S("swriter.svh"));
}

/*--------------------------------------------------------------------
    Beschreibung:   Alle Filter registrieren
 --------------------------------------------------------------------*/

// 4.0: 0xf0caa840, 0x7821, 0x11d0, 0xa4, 0xa7, 0x0, 0xa0, 0x24, 0x9d, 0x57, 0xb1, Sw)
// 5.0: 0xc20cf9d2, 0x85ae, 0x11d1, 0xaa, 0xb4, 0x0, 0x60, 0x97, 0xda, 0x56, 0x1a

SFX_IMPL_OBJECTFACTORY_LOD(SwWebDocShell, SFXOBJECTSHELL_STD_NORMAL|SFXOBJECTSHELL_HASMENU, /*swriter4/web,*/ \
            SvGlobalName(SO3_SWWEB_CLASSID), Sw)
/*{
    ::RegisterWebFilterInSfxFactory( (SfxObjectFactory&)Factory(), RC_WEB_ICON );
} */


TYPEINIT1(SwWebDocShell, SwDocShell);

/*-----------------22.01.97 09.29-------------------

--------------------------------------------------*/

SwWebDocShell::SwWebDocShell(SfxObjectCreateMode eMode ) :
        SwDocShell(eMode),
        nSourcePara(0)
{
}

/*-----------------22.01.97 09.29-------------------

--------------------------------------------------*/

__EXPORT SwWebDocShell::~SwWebDocShell()
{
}


// Anforderung der pIo-Struktur fuer den Zugriff auf Substorages
// und Streams
/*-----------------22.01.97 09.29-------------------

--------------------------------------------------*/

void __EXPORT SwWebDocShell::FillRegInfo( SvEmbeddedRegistryInfo * pInfo)
{
    SfxInPlaceObject::FillRegInfo( pInfo );
    pInfo->aObjName = C2S("StarWriterWebDocument");
    pInfo->nMajorVers = 5;
    pInfo->nMinorVers = 0;
    pInfo->aHumanShortTypeName = SW_RESSTR(STR_HUMAN_SWWEBDOC_NAME);
    pInfo->nIconResId =
#ifdef REG_ICON_RESID_WWWW
    REG_ICON_RESID_WWWW;
#else
    7;
#endif
}


void __EXPORT SwWebDocShell::FillClass( SvGlobalName * pClassName,
                                   ULONG * pClipFormat,
                                   String * pAppName,
                                   String * pLongUserName,
                                   String * pUserName,
                                   long nVersion ) const
{
    SfxInPlaceObject::FillClass(pClassName, pClipFormat, pAppName, pLongUserName,
                                pUserName, nVersion);

    if (nVersion == SOFFICE_FILEFORMAT_40)
    {
        *pClassName = SvGlobalName( SO3_SWWEB_CLASSID_40 );
        *pClipFormat = SOT_FORMATSTR_ID_STARWRITERWEB_40;
        *pAppName = C2S("StarWriter/Web 4.0");

        *pLongUserName = SW_RESSTR(STR_WRITER_WEBDOC_FULLTYPE_40);
    }
    else if (nVersion == SOFFICE_FILEFORMAT_NOW)
    {
        *pLongUserName = SW_RESSTR(STR_WRITER_WEBDOC_FULLTYPE);
    }
    *pUserName = SW_RESSTR(STR_HUMAN_SWWEBDOC_NAME);
}


/*------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.22  2000/09/18 16:06:20  willem.vandorp
    OpenOffice header added.

    Revision 1.21  2000/05/10 11:54:44  os
    Basic API removed

    Revision 1.20  2000/04/19 11:21:44  os
    UNICODE

    Revision 1.19  2000/02/11 15:01:21  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.18  1998/11/18 14:18:18  JP
    Task #59398#: ClipboardFormatId Umstellungen


      Rev 1.17   18 Nov 1998 15:18:18   JP
   Task #59398#: ClipboardFormatId Umstellungen

      Rev 1.16   21 Apr 1998 11:56:28   TJ
   include

      Rev 1.15   17 Feb 1998 11:40:38   OS
   HelpFile: Name gesetzt #47036#

      Rev 1.14   14 Jan 1998 09:05:22   MIB
   neu: GetSw4/5WebClipId

      Rev 1.13   07 Jan 1998 18:39:38   MIB
   5.0 Fileformat

      Rev 1.12   21 Nov 1997 11:33:20   MA
   includes

      Rev 1.11   03 Sep 1997 10:50:06   MBA
   swslots.hxx statt wswslots.hxx

      Rev 1.10   01 Sep 1997 13:10:58   OS
   DLL-Umstellung

      Rev 1.9   05 Aug 1997 16:47:22   TJ
   include svx/srchitem.hxx

      Rev 1.8   05 Aug 1997 16:41:48   TJ
   include svx/srchitem.hxx

      Rev 1.7   02 Jul 1997 08:04:44   OS
   Zeile in der SourceView merken

      Rev 1.6   10 Feb 1997 15:02:30   MA
   ueberfluessigen CTor entfernt

      Rev 1.5   31 Jan 1997 08:53:32   MA
   Parent fuer Interface ist nicht die SwDocShell

      Rev 1.4   28 Jan 1997 08:45:34   MA
   Syntax

      Rev 1.3   27 Jan 1997 16:12:04   MA
   Icon

      Rev 1.2   27 Jan 1997 12:46:02   MA
   Filter fuer web

      Rev 1.1   24 Jan 1997 10:32:30   OS
   FillRegInfo sollte sich nicht selbst aufrufen

      Rev 1.0   23 Jan 1997 16:19:32   OS
   Initial revision.

------------------------------------------------------------------------*/

diff --git a/sw/source/ui/web/web.src b/sw/source/ui/web/web.src
new file mode 100644
index 0000000..b356ce6
--- /dev/null
+++ b/sw/source/ui/web/web.src
@@ -0,0 +1,623 @@
/*************************************************************************
 *
 *  $RCSfile: web.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:51 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#define MN_SW_WEB
#ifndef _SVX_SVXIDS_HRC
#include <svx/svxids.hrc>
#endif
#include "globals.hrc"
#include "cmdid.h"
#include "web.hrc"
#include "swmn.hrc"
#define ACC_SW_WEB
#include "swacc.hrc"
#include "toolbox.hrc"
#include "helpid.h"
ACC CFG_SWWEB_ACCEL
{
    ItemList =
    {
        ALL_ACCELS
        FUNCTIONKEYS
    };
};
String STR_HUMAN_SWWEBDOC_NAME
{
    Text = "HTML" ;
    Text [ English ] = "HTML" ;
    Text [ portuguese ] = "HTML" ;
    Text [ english_us ] = "HTML" ;
    Text [ portuguese_brazilian ] = "HTML" ;
    Text [ swedish ] = "HTML" ;
    Text [ danish ] = "HTML" ;
    Text [ italian ] = "HTML" ;
    Text [ spanish ] = "HTML" ;
    Text [ french ] = "HTML" ;
    Text [ dutch ] = "HTML" ;
    Text[ chinese_simplified ] = "HTML";
    Text[ russian ] = "HTML";
    Text[ polish ] = "HTML";
    Text[ japanese ] = "HTML";
    Text[ chinese_traditional ] = "HTML";
    Text[ arabic ] = "HTML";
    Text[ dutch ] = "HTML";
    Text[ chinese_simplified ] = "HTML";
    Text[ greek ] = "HTML";
    Text[ korean ] = "HTML";
    Text[ turkish ] = "HTML";
    Text[ language_user1 ] = " ";
};
String STR_WRITER_WEBDOC_FULLTYPE_40
{
    Text = "StarOffice 4.0 HTML" ;
    Text [ English ] = "StarOffice 4.0 HTML" ;
    Text [ english_us ] = "StarOffice 4.0 HTML" ;
    Text [ portuguese_brazilian ] = "StarOffice 4.0 HTML" ;
    Text [ swedish ] = "StarOffice 4.0 HTML" ;
    Text [ danish ] = "StarOffice 4.0 HTML" ;
    Text [ italian ] = "HTML StarOffice 4.0" ;
    Text [ spanish ] = "HTML de StarOffice 4.0" ;
    Text [ french ] = "HTML StarOffice 4.0" ;
    Text [ dutch ] = "StarOffice 4.0 HTML" ;
    Text [ portuguese ] = "HTML (StarOffice 4.0)" ;
    Text[ chinese_simplified ] = "StarOffice 4.0 HTML";
    Text[ russian ] = "StarOffice 4.0 HTML";
    Text[ polish ] = "StarOffice 4.0 HTML";
    Text[ japanese ] = "StarOffice 4.0 HTML";
    Text[ chinese_traditional ] = "StarOffice 4.0 HTML";
    Text[ arabic ] = "StarOffice 4.0 HTML";
    Text[ dutch ] = "StarOffice 4.0 HTML";
    Text[ chinese_simplified ] = "StarOffice 4.0 HTML";
    Text[ greek ] = "StarOffice 4.0 HTML";
    Text[ korean ] = "HTML (StarOffice 4.0)";
    Text[ turkish ] = "StarOffice 4.0 HTML";
    Text[ language_user1 ] = " ";
};
String STR_WRITER_WEBDOC_FULLTYPE
{
    Text = "StarOffice 5.0 HTML" ;
    Text [ English ] = "StarOffice 5.0 HTML" ;
    Text [ english_us ] = "StarOffice 5.0 HTML" ;
    Text [ portuguese_brazilian ] = "StarOffice 5.0 HTML" ;
    Text [ swedish ] = "StarOffice 5.0 HTML" ;
    Text [ danish ] = "StarOffice 5.0 HTML" ;
    Text [ italian ] = "HTML StarOffice 5.0" ;
    Text [ spanish ] = "HTML de StarOffice 5.0" ;
    Text [ french ] = "HTML StarOffice 5.0" ;
    Text [ dutch ] = "StarOffice 5.0 HTML" ;
    Text [ portuguese ] = "HTML (StarOffice 5.0)" ;
    Text[ chinese_simplified ] = "StarOffice 5.0 HTML";
    Text[ russian ] = "StarOffice 5.0 HTML";
    Text[ polish ] = "StarOffice 5.0 HTML";
    Text[ japanese ] = "StarOffice 5.0 HTML";
    Text[ chinese_traditional ] = "StarOffice 5.0 HTML";
    Text[ arabic ] = "StarOffice 5.0 HTML";
    Text[ dutch ] = "StarOffice 5.0 HTML";
    Text[ chinese_simplified ] = "StarOffice 5.0 HTML";
    Text[ greek ] = "StarOffice 5.0 HTML";
    Text[ korean ] = "HTML (StarOffice 5.0)";
    Text[ turkish ] = "StarOffice 5.0 HTML";
    Text[ language_user1 ] = " ";
};
String STR_SHELLNAME_WEBTEXT
{
    Text = "Text/Web" ;
    Text [ ENGLISH ] = "Text/Web" ;
    Text [ dutch ] = "Tekst/Web" ;
    Text [ english_us ] = "Text/Web" ;
    Text [ italian ] = "Testo/Web" ;
    Text [ spanish ] = "Texto/Web" ;
    Text [ french ] = "Texte/Web" ;
    Text [ swedish ] = "Text/Webb" ;
    Text [ danish ] = "Tekst/Web" ;
    Text [ portuguese_brazilian ] = "Text/Web" ;
    Text [ portuguese ] = "Texto/Web" ;
    Text[ chinese_simplified ] = "ÎÄ×Ö/ÍòÎ¬Íø";
    Text[ russian ] = "Òåêñò/Web";
    Text[ polish ] = "Tekst/Web";
    Text[ japanese ] = "÷½Ä/Web";
    Text[ chinese_traditional ] = "¤å¦r/Web";
    Text[ arabic ] = "äÕ/æíÈ";
    Text[ dutch ] = "Tekst/Web";
    Text[ chinese_simplified ] = "ÎÄ×Ö/ÍòÎ¬Íø";
    Text[ greek ] = "Êåßìåíï/Web";
    Text[ korean ] = "ÅØ½ºÆ®/À¥";
    Text[ turkish ] = "Metin/Web";
    Text[ language_user1 ] = " ";
};
String STR_SHELLNAME_WEBFRAME
{
    Text = "Rahmen/Web" ;
    Text [ ENGLISH ] = "Frame/Web" ;
    Text [ dutch ] = "Kader/Web" ;
    Text [ english_us ] = "Frame/Web" ;
    Text [ italian ] = "Cornice/Web" ;
    Text [ spanish ] = "Marco/Web" ;
    Text [ french ] = "Cadre/Web" ;
    Text [ swedish ] = "Ram/Webb" ;
    Text [ danish ] = "Ramme/Web" ;
    Text [ portuguese_brazilian ] = "Rahmen/Web" ;
    Text [ portuguese ] = "Moldura/Web" ;
    Text[ chinese_simplified ] = "¿ò/ÍòÎ¬Íø";
    Text[ russian ] = "Êàäð/Web";
    Text[ polish ] = "Ramka/Web";
    Text[ japanese ] = "˜g/Web";
    Text[ chinese_traditional ] = "°T®Ø/Web";
    Text[ arabic ] = "ÅØÇÑ/æíÈ";
    Text[ dutch ] = "Kader/Web";
    Text[ chinese_simplified ] = "¿ò/ÍòÎ¬Íø";
    Text[ greek ] = "Ðëáßóéï/Web";
    Text[ korean ] = "ÇÁ·¹ÀÓ/À¥";
    Text[ turkish ] = "Çerçeve/Web";
    Text[ language_user1 ] = " ";
};
String RID_WEBTOOLS_TOOLBOX
{
    Text = "Werkzeugleiste/Web" ;
    Text [ English ] = "Toolbar/Web" ;
    Text [ english_us ] = "Main Toolbar/Web" ;
    Text [ italian ] = "Barra degli strumenti/Web" ;
    Text [ spanish ] = "Barra de herramientas/Web" ;
    Text [ french ] = "Barre d'instruments/Web" ;
    Text [ dutch ] = "Werktuigbalk/Web" ;
    Text [ swedish ] = "Verktygslist/Webb" ;
    Text [ danish ] = "Værktøjslinje/Web" ;
    Text [ portuguese_brazilian ] = "Werkzeugleiste/Web" ;
    Text [ portuguese ] = "Barra de ferramentas/Web" ;
    Text[ chinese_simplified ] = "Ö÷¹¤¾ßÀ¸/ÍòÎ¬Íø";
    Text[ russian ] = "Ïàíåëü èíñòðóìåíòîâ/Web";
    Text[ polish ] = "Pasek narzêdziowy/Web";
    Text[ japanese ] = "•W€Â°ÙÊÞ°/Web";
    Text[ chinese_traditional ] = "¥D¤u¨ã¦C/Web";
    Text[ arabic ] = "ÔÑíØ ÇáÃÏæÇÊ/æíÈ";
    Text[ dutch ] = "Werktuigbalk/Web";
    Text[ chinese_simplified ] = "Ö÷¹¤¾ßÀ¸/ÍòÎ¬Íø";
    Text[ greek ] = "ÃñáììÞ åñãáëåéþí/Web";
    Text[ korean ] = "ÁÖ µµ±¸ ¸ðÀ½/À¥";
    Text[ turkish ] = "Ana araç çubuðu/Web";
    Text[ language_user1 ] = " ";
};
ToolBox RID_WEBTOOLS_TOOLBOX
{
    HelpID = HID_WEBTOOLS_TOOLBOX ;
    Border = TRUE ;
    SVLook = TRUE ;
    Dockable = TRUE ;
    Moveable = TRUE ;
    Sizeable = TRUE ;
    Closeable = TRUE ;
    Zoomable = TRUE ;
    LineSpacing = TRUE ;
    HideWhenDeactivate = TRUE ;
    Customize = TRUE ;
    MenuStrings = TRUE ;
    Scroll = TRUE ;
    Hide = TRUE ;
    Align = BOXALIGN_LEFT ;
    ItemList =
    {
        ToolBoxItem
        {
            Identifier = FN_INSERT_CTRL ;
            HelpID = HID_INSERT_CTRL ;
            DropDown = TRUE ;
        };
        ToolBoxItem
        {
            Identifier = FN_INSERT_FIELD_CTRL ;
            HelpID = HID_INSERT_FIELD_CTRL ;
            DropDown = TRUE ;
        };
        ToolBoxItem
        {
            Identifier = FN_INSERT_HEADER ;
            HelpID = FN_INSERT_HEADER ;
        };
        ToolBoxItem
        {
            Identifier = FN_INSERT_FOOTER ;
            HelpID = FN_INSERT_FOOTER ;
        };
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            Identifier = SID_DRAW_TEXT_MARQUEE ;
            HelpID = SID_DRAW_TEXT_MARQUEE ;
        };
        ToolBoxItem
        {
            Identifier = SID_FM_CONFIG ;
            HelpID = SID_FM_CONFIG;
            DropDown = TRUE ;
        };
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            Identifier = FN_GLOSSARY_DLG ;
            HelpID = FN_GLOSSARY_DLG ;
            DropDown = TRUE ;
        };
        ToolBoxItem
        {
            Identifier = FN_SPELLING_DLG ;
            HelpID = FN_SPELLING_DLG ;
        };
        ToolBoxItem
        {
            ITEM_TOOLBAR_AUTOSPELL_CHECK
        };
        ToolBoxItem
        {
            Identifier = FN_HYPHENATE_OPT_DLG;
            HelpID = FN_HYPHENATE_OPT_DLG;
            Hide = TRUE;
        };
        ToolBoxItem
        {
            Identifier = FN_THESAURUS_DLG;
            HelpID = FN_THESAURUS_DLG;
            Hide = TRUE;
        };
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            Identifier = SID_SEARCH_DLG ;
            HelpID = SID_SEARCH_DLG ;
        };
        ToolBoxItem
        {
            Identifier = SID_HYPERLINK_INSERT ;
            HelpID = SID_HYPERLINK_INSERT ;
        };
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        ToolBoxItem
        {
            Identifier = SID_ATTR_ZOOM;
            HelpID = SID_ATTR_ZOOM ;
            Hide = TRUE;
        };
        ToolBoxItem
        {
            Identifier = FN_VIEW_META_CHARS ;
            HelpID = FN_VIEW_META_CHARS ;
        };
        ToolBoxItem
        {
            Identifier = FN_VIEW_GRAPHIC ;
            HelpID = FN_VIEW_GRAPHIC ;
        };
        ToolBoxItem
        {
            Identifier = FN_PRINT_LAYOUT ;
            HelpID = FN_PRINT_LAYOUT ;
        };
        ToolBoxItem
        {
            Identifier = SID_SOURCEVIEW ;
            HelpID = HID_SOURCEVIEW ;
        };
    };
};
/*************************************************************************
    Textleiste
*************************************************************************/
String RID_WEBTEXT_TOOLBOX
{
    Text = "Textobjektleiste/Web" ;
    Text [ English ] = "Text objectbar/Web" ;
    Text [ dutch ] = "Tekstobjectbalk/Web" ;
    Text [ english_us ] = "Text Object Bar/Web" ;
    Text [ italian ] = "Barra degli oggetti di testo/Web" ;
    Text [ spanish ] = "Barra de objetos de texto/Web" ;
    Text [ french ] = "Barre d'objets de texte/web" ;
    Text [ swedish ] = "Textobjektlist/Webb" ;
    Text [ danish ] = "Tekstobjektlinje/Web" ;
    Text [ portuguese ] = "Barra de objectos de texto/Web" ;
    Text [ portuguese_brazilian ] = "Textobjektleiste/Web" ;
    Text[ chinese_simplified ] = "ÎÄ×Ö¶ÔÏóÀ¸/ÍòÎ¬Íø";
    Text[ russian ] = "Ïàíåëü îáúåêòîâ òåêñòà/Web";
    Text[ polish ] = "Pasek obiektów tekstu/Web";
    Text[ japanese ] = "÷½ÄµÌÞ¼Þª¸ÄÊÞ°/Web";
    Text[ chinese_traditional ] = "¤å¦rª«¥ó¦C/Web";
    Text[ arabic ] = "ÔÑíØ ßÇÆäÇÊ ÇáäÕ/æíÈ";
    Text[ dutch ] = "Tekstobjectbalk/Web";
    Text[ chinese_simplified ] = "ÎÄ×Ö¶ÔÏóÀ¸/ÍòÎ¬Íø";
    Text[ greek ] = "ÃñáììÞ áíôéêåéìÝíùí êåéìÝíïõ/Web";
    Text[ korean ] = "ÅØ½ºÆ® °³Ã¼ ¸ðÀ½/À¥";
    Text[ turkish ] = "Metin nesne çubuðu/Web";
    Text[ language_user1 ] = " ";
};
ToolBox RID_WEBTEXT_TOOLBOX
{
    HelpID = HID_WEBTEXT_TOOLBOX ;
    Border = TRUE ;
    SVLook = TRUE ;
    Dockable = TRUE ;
    Moveable = TRUE ;
    Sizeable = TRUE ;
    Closeable = TRUE ;
    Zoomable = TRUE ;
    Hide = TRUE ;
    HideWhenDeactivate = TRUE ;
    LineSpacing = TRUE ;
    Customize = TRUE ;
    MenuStrings = TRUE ;
    ItemList =
    {
        MN_TEMPLATE
        MN_FONT
        MN_TEXT1(TRUE)
        MN_TEXT_LINESPACE
        MN_TEXT2
        MN_TEXT_BACKGROUND
        MN_TEXT_DIALOGS(TRUE)
    };
    Scroll = TRUE ;
};
String RID_WEBFRAME_TOOLBOX
{
    Text = "Rahmenobjektleiste/Web" ;
    Text [ English ] = "Frame objectbar/Web" ;
    Text [ norwegian ] = "Ramme/Web" ;
    Text [ italian ] = "Barra degli oggetti per cornice/Web" ;
    Text [ portuguese_brazilian ] = "Moldura/Web" ;
    Text [ portuguese ] = "Barra de objectos de moldura/Web" ;
    Text [ finnish ] = "Kehys/Web" ;
    Text [ danish ] = "Rammeobjektlinje/Web" ;
    Text [ french ] = "Barre d'objets de cadre/Web" ;
    Text [ swedish ] = "Ramobjektlist/Webb" ;
    Text [ dutch ] = "Kaderobjectbalk/Web" ;
    Text [ spanish ] = "Barra de objetos de marco/Web" ;
    Text [ english_us ] = "Frame Object Bar/Web" ;
    Text[ chinese_simplified ] = "¿ò¶ÔÏóÀ¸/ÍòÎ¬Íø";
    Text[ russian ] = "Ïàíåëü îáúåêòà êàäðà/Web";
    Text[ polish ] = "Pasek obiektów ramki/Web";
    Text[ japanese ] = "˜gµÌÞ¼Þª¸ÄÊÞ°/Web";
    Text[ chinese_traditional ] = "°T®Øª«¥ó¦C/Web";
    Text[ arabic ] = "ÔÑíØ ßÇÆä ÅØÇÑ/æíÈ";
    Text[ dutch ] = "Kaderobjectbalk/Web";
    Text[ chinese_simplified ] = "¿ò¶ÔÏóÀ¸/ÍòÎ¬Íø";
    Text[ greek ] = "ÃñáììÞ áíôéêåéìÝíùí ðëáéóßïõ/Web";
    Text[ korean ] = "ÇÁ·¹ÀÓ °³Ã¼ ¸ðÀ½/À¥";
    Text[ turkish ] = "Çerçeve nesne çubuðu/Web";
    Text[ language_user1 ] = " ";
};
ToolBox RID_WEBFRAME_TOOLBOX
{
    HelpID = HID_WEBFRAME_TOOLBOX ;
    Border = TRUE ;
    SVLook = TRUE ;
    Dockable = TRUE ;
    Moveable = TRUE ;
    Sizeable = TRUE ;
    Closeable = TRUE ;
    Zoomable = TRUE ;
    Hide = TRUE ;
    LineSpacing = TRUE ;
    MenuStrings = TRUE ;
    HideWhenDeactivate = TRUE ;
    Customize = TRUE ;
    ItemList =
    {
        MN_FRAME_WRAP_WEB
        MN_FRAME1
        MN_FRAME3
        MN_LINESTYLE
        ToolBoxItem
        {
            Type = TOOLBOXITEM_SEPARATOR ;
        };
        MN_BACKGROUND_COLOR
        ToolBoxItem { Type = TOOLBOXITEM_SEPARATOR ; };
        MN_ATTRIBUTES_FRAME
        ToolBoxItem { Type = TOOLBOXITEM_SEPARATOR ; };
        MN_LAYER
        ToolBoxItem
        {
            Identifier = FN_TOOL_ANKER ;
            HelpID = FN_TOOL_ANKER ;
        };
    };
    Scroll = TRUE ;
};
String RID_WEBGRAPHIC_TOOLBOX
{
    Text = "Grafikobjektleiste/Web" ;
    Text [ English ] = "Graphic objectbar/Web" ;
    Text [ norwegian ] = "Graphic/Web" ;
    Text [ italian ] = "Barra degli oggetti grafici/Web" ;
    Text [ portuguese_brazilian ] = "Gr fico/Web" ;
    Text [ portuguese ] = "Barra de objectos gráficos/Web" ;
    Text [ finnish ] = "Kuva/Web" ;
    Text [ danish ] = "Grafikobjektlinje/Web" ;
    Text [ french ] = "Barre d'objets graphiques/Web" ;
    Text [ swedish ] = "Grafikobjektlist/Webb" ;
    Text [ dutch ] = "Objectbalk afbeeldingen/Web" ;
    Text [ spanish ] = "Barra de objetos gráficos/Web" ;
    Text [ english_us ] = "Graphics Object Bar/Web" ;
    Text[ chinese_simplified ] = "ͼÐζÔÏóÀ¸/Web";
    Text[ russian ] = "Ïàíåëü ãðàôè÷åñêèõ îáúåêòîâ/Web";
    Text[ polish ] = "Pasek obiektów graficznych/Web";
    Text[ japanese ] = "}Œ`•`‰æµÌÞ¼Þª¸ÄÊÞ°/Web";
    Text[ chinese_traditional ] = "¹Ï¤ùª«¥ó¦C/Web";
    Text[ arabic ] = "ÔÑíØ ßÇÆä ÕæÑÉ/ æíÈ";
    Text[ dutch ] = "Objectbalk afbeeldingen/Web";
    Text[ chinese_simplified ] = "ͼÐζÔÏóÀ¸/Web";
    Text[ greek ] = "ÃñáììÞ áíôéêåéìÝíùí ó÷åäéáóìïý/Web";
    Text[ korean ] = "±×·¡ÇÈ °³Ã¼ ¸ðÀ½/À¥";
    Text[ turkish ] = "Grafik nesne çubuðu/Web";
    Text[ language_user1 ] = " ";
};
ToolBox RID_WEBGRAPHIC_TOOLBOX
{
    HelpID = HID_WEBGRAPHIC_TOOLBOX ;
    Border = TRUE ;
    SVLook = TRUE ;
    Dockable = TRUE ;
    Moveable = TRUE ;
    Sizeable = TRUE ;
    Closeable = TRUE ;
    Zoomable = TRUE ;
    LineSpacing = TRUE ;
    HideWhenDeactivate = TRUE ;
    MenuStrings = TRUE ;
    Customize = TRUE ;
    Hide = TRUE ;
    ItemList =
    {
        MN_FRAME_WRAP_WEB
        MN_FRAME1
        MN_FRAME3
        MN_LINESTYLE
        ToolBoxItem { Type = TOOLBOXITEM_SEPARATOR ; };
        ToolBoxItem
        {
            ITEM_TOOLBAR_SIM_START
        };
        MN_ATTRIBUTES_GRAFIK
        ToolBoxItem { Type = TOOLBOXITEM_SEPARATOR ; };
        MN_LAYER
        ToolBoxItem
        {
            Identifier = FN_TOOL_ANKER ;
            HelpID = FN_TOOL_ANKER ;
            DropDown = TRUE ;
        };
    };
    Scroll = TRUE ;
};
String RID_WEBOLE_TOOLBOX
{
    Text = "Objekt" ;
    Text [ English ] = "Object" ;
    Text [ norwegian ] = "Object" ;
    Text [ italian ] = "Oggetto" ;
    Text [ portuguese_brazilian ] = "Objeto" ;
    Text [ portuguese ] = "Objecto" ;
    Text [ finnish ] = "Objekti" ;
    Text [ danish ] = "Objekt" ;
    Text [ french ] = "Objet" ;
    Text [ swedish ] = "Objekt" ;
    Text [ dutch ] = "Object" ;
    Text [ spanish ] = "Objeto" ;
    Text [ english_us ] = "Object" ;
    Text[ chinese_simplified ] = "¶ÔÏó";
    Text[ russian ] = "Îáúåêò";
    Text[ polish ] = "Obiekt";
    Text[ japanese ] = "µÌÞ¼Þª¸Ä";
    Text[ chinese_traditional ] = "ª«¥ó";
    Text[ arabic ] = "ßÇÆä";
    Text[ dutch ] = "Object";
    Text[ chinese_simplified ] = "¶ÔÏó";
    Text[ greek ] = "Áíôéêåßìåíï";
    Text[ korean ] = "°³Ã¼";
    Text[ turkish ] = "Nesne";
    Text[ language_user1 ] = " ";
};
ToolBox RID_WEBOLE_TOOLBOX
{
    HelpID = HID_OLE_TOOLBOX ;
    Border = TRUE ;
    SVLook = TRUE ;
    Dockable = TRUE ;
    Moveable = TRUE ;
    Sizeable = TRUE ;
    Closeable = TRUE ;
    Zoomable = TRUE ;
    LineSpacing = TRUE ;
    HideWhenDeactivate = TRUE ;
    Customize = TRUE ;
    MenuStrings = TRUE ;
    Hide = TRUE ;
    Scroll = TRUE ;
    ItemList =
    {
        MN_FRAME_WRAP_WEB
        MN_FRAME1
        MN_FRAME3
        MN_LINESTYLE
        ToolBoxItem { Type = TOOLBOXITEM_SEPARATOR ; };
        MN_ATTRIBUTES_OLE
        ToolBoxItem { Type = TOOLBOXITEM_SEPARATOR ; };
        MN_LAYER
        ToolBoxItem
        {
            Identifier = FN_TOOL_ANKER ;
            HelpID = FN_TOOL_ANKER ;
            DropDown = TRUE ;
        };
    };
};
/*************************************************************************

*************************************************************************/
diff --git a/sw/source/ui/web/wformsh.cxx b/sw/source/ui/web/wformsh.cxx
new file mode 100644
index 0000000..93c0ec4
--- /dev/null
+++ b/sw/source/ui/web/wformsh.cxx
@@ -0,0 +1,146 @@
/*************************************************************************
 *
 *  $RCSfile: wformsh.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:51 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "itemdef.hxx"

#ifndef _SVX_SVXIDS_HRC
#include <svx/svxids.hrc>
#endif

#ifndef _SVX_SRCHITEM_HXX //autogen
#include <svx/srchitem.hxx>
#endif

#ifndef _SFXOBJFACE_HXX //autogen
#include <sfx2/objface.hxx>
#endif
#ifndef _GLOBNAME_HXX //autogen
#include <tools/globname.hxx>
#endif
#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif

#include "swtypes.hxx"
#include "cmdid.h"
#include "wformsh.hxx"
#include "globals.hrc"
#include "web.hrc"
#include "popup.hrc"
#include "shells.hrc"

#define SwWebDrawFormShell
#include "swslots.hxx"

SFX_IMPL_INTERFACE(SwWebDrawFormShell, SwDrawFormShell, SW_RES(0))
{
    SFX_POPUPMENU_REGISTRATION(SW_RES(MN_DRAWFORM_POPUPMENU));
    SFX_OBJECTBAR_REGISTRATION(SFX_OBJECTBAR_OBJECT, SW_RES(RID_DRAWFORM_TOOLBOX));
    SFX_OBJECTMENU_REGISTRATION(SID_OBJECTMENU0, SW_RES(MN_OBJECTMENU_DRAWFORM));
}

TYPEINIT1(SwWebDrawFormShell, SwDrawFormShell)

SwWebDrawFormShell::SwWebDrawFormShell(SwView& rVw) :
    SwDrawFormShell(rVw)
{
}

__EXPORT SwWebDrawFormShell::~SwWebDrawFormShell()
{
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.4  2000/09/18 16:06:20  willem.vandorp
    OpenOffice header added.

    Revision 1.3  2000/05/10 11:54:44  os
    Basic API removed

    Revision 1.2  1998/11/02 14:25:34  AWO
    svxids.hrc wg. unbek. Defines includet


      Rev 1.1   02 Nov 1998 15:25:34   AWO
   svxids.hrc wg. unbek. Defines includet

      Rev 1.0   08 Jun 1998 18:07:52   OM
   Initial revision.

      Rev 1.2   21 Nov 1997 11:33:20   MA
   includes

      Rev 1.1   03 Nov 1997 14:00:14   MA
   precomp entfernt

      Rev 1.0   03 Sep 1997 14:50:16   MBA
   Initial revision.

------------------------------------------------------------------------*/

diff --git a/sw/source/ui/web/wfrmsh.cxx b/sw/source/ui/web/wfrmsh.cxx
new file mode 100644
index 0000000..f7926ae
--- /dev/null
+++ b/sw/source/ui/web/wfrmsh.cxx
@@ -0,0 +1,170 @@
/*************************************************************************
 *
 *  $RCSfile: wfrmsh.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:51 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "hintids.hxx"

#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif
#ifndef _SFXOBJFACE_HXX //autogen
#include <sfx2/objface.hxx>
#endif
#ifndef _SVX_SRCHITEM_HXX
#include <svx/srchitem.hxx> //***
#endif

#include "swtypes.hxx"
#include "cmdid.h"
#include "view.hxx"
#include "wfrmsh.hxx"
#include "globals.hrc"
#include "popup.hrc"
#include "shells.hrc"
#include "web.hrc"


// STATIC DATA -----------------------------------------------------------
#define SwWebFrameShell
#include "itemdef.hxx"
#include "swslots.hxx"


/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SFX_IMPL_INTERFACE(SwWebFrameShell, SwFrameShell, SW_RES(STR_SHELLNAME_WEBFRAME))
{
    SFX_POPUPMENU_REGISTRATION(SW_RES(MN_FRM_POPUPMENU));
    SFX_OBJECTBAR_REGISTRATION(SFX_OBJECTBAR_OBJECT, SW_RES(RID_WEBFRAME_TOOLBOX));
    SFX_OBJECTMENU_REGISTRATION(SID_OBJECTMENU0, SW_RES(MN_OBJECTMENU_FRAME));
}



TYPEINIT1(SwWebFrameShell, SwFrameShell)

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



SwWebFrameShell::SwWebFrameShell(SwView &rView) :
    SwFrameShell(rView)
{
    SetHelpId(SW_WEBFRAMESHELL);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



SwWebFrameShell::~SwWebFrameShell()
{
}



/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.8  2000/09/18 16:06:20  willem.vandorp
    OpenOffice header added.

    Revision 1.7  2000/05/10 11:54:44  os
    Basic API removed

    Revision 1.6  1997/11/21 10:00:48  MA
    includes


      Rev 1.5   21 Nov 1997 11:00:48   MA
   includes

      Rev 1.4   03 Nov 1997 14:00:14   MA
   precomp entfernt

      Rev 1.3   03 Sep 1997 10:51:06   MBA
   swslots.hxx statt wswslots.hxx

      Rev 1.2   05 Aug 1997 16:41:48   TJ
   include svx/srchitem.hxx

      Rev 1.1   31 Jul 1997 14:19:22   MH
   chg: header

      Rev 1.0   31 Jan 1997 13:31:56   OS
   Initial revision.

------------------------------------------------------------------------*/




diff --git a/sw/source/ui/web/wgrfsh.cxx b/sw/source/ui/web/wgrfsh.cxx
new file mode 100644
index 0000000..f72e438
--- /dev/null
+++ b/sw/source/ui/web/wgrfsh.cxx
@@ -0,0 +1,147 @@
/*************************************************************************
 *
 *  $RCSfile: wgrfsh.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:51 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "itemdef.hxx"

#ifndef _SVX_SRCHITEM_HXX //autogen
#include <svx/srchitem.hxx>
#endif
#ifndef _SFXAPP_HXX
#include <sfx2/app.hxx>
#endif

#include "cmdid.h"
#include "view.hxx"
#include "wrtsh.hxx"
#include "swmodule.hxx"
#include "uitool.hxx"
#include "docsh.hxx"
#include "shells.hrc"
#include "popup.hrc"
#include "globals.hrc"
#include "web.hrc"
#include "wgrfsh.hxx"

#define SwWebGrfShell
#include "swslots.hxx"

SFX_IMPL_INTERFACE(SwWebGrfShell, SwGrfShell, SW_RES(STR_SHELLNAME_GRAPHIC))
{
    SFX_POPUPMENU_REGISTRATION(SW_RES(MN_GRF_POPUPMENU));
    SFX_OBJECTBAR_REGISTRATION(SFX_OBJECTBAR_OBJECT, SW_RES(RID_WEBGRAPHIC_TOOLBOX));
    SFX_OBJECTMENU_REGISTRATION(SID_OBJECTMENU0, SW_RES(MN_OBJECTMENU_GRAFIK));
}

TYPEINIT1(SwWebGrfShell,SwGrfShell)

SwWebGrfShell::SwWebGrfShell(SwView &rView) :
    SwGrfShell(rView)

{
    SetName(String::CreateFromAscii("Graphic"));
    SetHelpId(SW_GRFSHELL);
}

SwWebGrfShell::~SwWebGrfShell()
{
}


/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.8  2000/09/18 16:06:20  willem.vandorp
    OpenOffice header added.

    Revision 1.7  2000/05/10 11:54:44  os
    Basic API removed

    Revision 1.6  2000/04/26 15:06:50  os
    include

    Revision 1.5  2000/04/19 11:21:44  os
    UNICODE

    Revision 1.4  1998/11/05 12:10:36  OS
    #59004# Kein Vorlagencontroller fuer Rahmen+Grafiken im HTML


      Rev 1.3   05 Nov 1998 13:10:36   OS
   #59004# Kein Vorlagencontroller fuer Rahmen+Grafiken im HTML

      Rev 1.2   21 Nov 1997 10:55:12   MA
   includes

      Rev 1.1   03 Nov 1997 14:00:14   MA
   precomp entfernt

      Rev 1.0   03 Sep 1997 14:50:40   MBA
   Initial revision.

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/web/wlistsh.cxx b/sw/source/ui/web/wlistsh.cxx
new file mode 100644
index 0000000..cc77cdb
--- /dev/null
+++ b/sw/source/ui/web/wlistsh.cxx
@@ -0,0 +1,146 @@
/*************************************************************************
 *
 *  $RCSfile: wlistsh.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:51 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop
#include "itemdef.hxx"


#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif
#ifndef _SFXOBJFACE_HXX //autogen
#include <sfx2/objface.hxx>
#endif
#ifndef _SVX_SRCHITEM_HXX //autogen
#include <svx/srchitem.hxx>
#endif
#ifndef _IMAPDLG_HXX_ //autogen
#include <svx/imapdlg.hxx>
#endif
#ifndef _SBASLTID_HRC //autogen
#include <offmgr/sbasltid.hrc>
#endif

#include "cmdid.h"
#include "uiparam.hxx"
#include "wrtsh.hxx"
#include "swmodule.hxx"
#include "globals.hrc"
#include "shells.hrc"
#include "uinums.hxx"
#include "wlistsh.hxx"

#define SwWebListShell
#include "swslots.hxx"

SFX_IMPL_INTERFACE(SwWebListShell, SwListShell, SW_RES(STR_SHELLNAME_LIST))
{
    SFX_OBJECTBAR_REGISTRATION(SFX_OBJECTBAR_OBJECT, SW_RES(RID_NUM_TOOLBOX));
    SFX_OBJECTMENU_REGISTRATION(SID_OBJECTMENU0, SW_RES(MN_OBJECTMENU_LIST));
}

TYPEINIT1(SwWebListShell,SwListShell)

SwWebListShell::SwWebListShell(SwView &rView) :
    SwListShell(rView)
{
    SetName(String::CreateFromAscii("List"));
    SetHelpId(SW_LISTSHELL);
}

__EXPORT SwWebListShell::~SwWebListShell()
{
}
/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.7  2000/09/18 16:06:20  willem.vandorp
    OpenOffice header added.

    Revision 1.6  2000/05/26 07:21:35  os
    old SW Basic API Slots removed

    Revision 1.5  2000/05/10 11:54:44  os
    Basic API removed

    Revision 1.4  2000/04/19 11:21:44  os
    UNICODE

    Revision 1.3  1997/11/21 10:33:20  MA
    includes


      Rev 1.2   21 Nov 1997 11:33:20   MA
   includes

      Rev 1.1   03 Nov 1997 14:00:16   MA
   precomp entfernt

      Rev 1.0   03 Sep 1997 14:50:56   MBA
   Initial revision.

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/web/wolesh.cxx b/sw/source/ui/web/wolesh.cxx
new file mode 100644
index 0000000..6df88fe
--- /dev/null
+++ b/sw/source/ui/web/wolesh.cxx
@@ -0,0 +1,183 @@
/*************************************************************************
 *
 *  $RCSfile: wolesh.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:51 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "itemdef.hxx"

#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif
#ifndef _SFXOBJFACE_HXX //autogen
#include <sfx2/objface.hxx>
#endif
#ifndef _SVX_SRCHITEM_HXX //autogen
#include <svx/srchitem.hxx>
#endif

#include "wrtsh.hxx"
#include "view.hxx"
#include "helpid.h"
#include "globals.hrc"
#include "web.hrc"
#include "popup.hrc"
#include "shells.hrc"
#include "wolesh.hxx"
#include "cmdid.h"

#define SwWebOleShell
#include "swslots.hxx"

SFX_IMPL_INTERFACE(SwWebOleShell, SwOleShell, SW_RES(STR_SHELLNAME_OBJECT))
{
    SFX_POPUPMENU_REGISTRATION(SW_RES(MN_OLE_POPUPMENU));
    SFX_OBJECTBAR_REGISTRATION(SFX_OBJECTBAR_OBJECT, SW_RES(RID_WEBOLE_TOOLBOX));
    SFX_OBJECTMENU_REGISTRATION(SID_OBJECTMENU0, SW_RES(MN_OBJECTMENU_OLE));
}

SwWebOleShell::SwWebOleShell(SwView &rView) :
    SwOleShell(rView)

{
    SetName(String::CreateFromAscii("Object"));
    SetHelpId(SW_OLESHELL);
}

__EXPORT SwWebOleShell::~SwWebOleShell()
{
}

/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.8  2000/09/18 16:06:20  willem.vandorp
    OpenOffice header added.

    Revision 1.7  2000/05/10 11:54:44  os
    Basic API removed

    Revision 1.6  2000/04/19 11:21:44  os
    UNICODE

    Revision 1.5  1999/01/04 14:02:18  OS
    #59918# Kein Vorlagencontroller fuer Rahmen+Grafiken im HTML


      Rev 1.4   04 Jan 1999 15:02:18   OS
   #59918# Kein Vorlagencontroller fuer Rahmen+Grafiken im HTML

      Rev 1.3   21 Nov 1997 11:33:20   MA
   includes

      Rev 1.2   03 Nov 1997 14:00:16   MA
   precomp entfernt

      Rev 1.1   05 Sep 1997 12:36:00   MH
   chg: header

      Rev 1.0   03 Sep 1997 14:51:06   MBA
   Initial revision.

      Rev 1.21   01 Aug 1997 11:45:44   MH
   chg: header

      Rev 1.20   11 Nov 1996 13:37:34   MA
   ResMgr

      Rev 1.19   28 Aug 1996 15:55:14   OS
   includes

      Rev 1.18   13 Aug 1996 12:38:40   OS
   neue Shellnamen im IDL-Interface

      Rev 1.17   25 Jun 1996 19:51:50   HJS
   includes

      Rev 1.16   20 Mar 1996 12:41:14   HJS
   funcdefs muessen unique sein!

      Rev 1.15   06 Feb 1996 15:16:22   OS
   neu: Activate/Deactivate fuer Objekte

      Rev 1.14   26 Jan 1996 10:54:12   OS
   neu: GetState - Ole-Objekt dem Basic herausreichen

      Rev 1.13   03 Dec 1995 11:22:08   OS
   +include itemdef.hxx

      Rev 1.12   29 Nov 1995 13:47:54   OS
   -slotadd.hxx

      Rev 1.11   27 Nov 1995 19:40:06   OM
   swslots->303a

      Rev 1.10   24 Nov 1995 16:59:36   OM
   PCH->PRECOMPILED

      Rev 1.9   17 Nov 1995 13:03:40   MA
   Segmentierung

------------------------------------------------------------------------*/

diff --git a/sw/source/ui/web/wtabsh.cxx b/sw/source/ui/web/wtabsh.cxx
new file mode 100644
index 0000000..b17c2f9
--- /dev/null
+++ b/sw/source/ui/web/wtabsh.cxx
@@ -0,0 +1,154 @@
/*************************************************************************
 *
 *  $RCSfile: wtabsh.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:51 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "uiparam.hxx"
#include "hintids.hxx"

#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif
#ifndef _GLOBNAME_HXX //autogen
#include <tools/globname.hxx>
#endif
#ifndef _SFXOBJFACE_HXX //autogen
#include <sfx2/objface.hxx>
#endif
#ifndef _SVX_SRCHITEM_HXX //autogen
#include <svx/srchitem.hxx>
#endif


#include "cmdid.h"
#include "globals.hrc"
#include "uitool.hxx"
#include "helpid.h"
#include "popup.hrc"
#include "shells.hrc"
#include "table.hrc"
#include "wrtsh.hxx"
#include "wtabsh.hxx"

#define SwWebTableShell
#include "itemdef.hxx"
#include "swslots.hxx"

SFX_IMPL_INTERFACE(SwWebTableShell, SwTableShell, SW_RES(STR_SHELLNAME_TABLE))
{
    SFX_POPUPMENU_REGISTRATION(SW_RES(MN_TAB_POPUPMENU));
    SFX_OBJECTBAR_REGISTRATION(SFX_OBJECTBAR_OBJECT, SW_RES(RID_TABLE_TOOLBOX));
    SFX_OBJECTMENU_REGISTRATION(SID_OBJECTMENU0, SW_RES(MN_OBJECTMENU_TABLE));
}

TYPEINIT1(SwWebTableShell,SwTableShell)

SwWebTableShell::SwWebTableShell(SwView &rView) :
    SwTableShell(rView)
{
    GetShell().UpdateTable();
    SetName(String::CreateFromAscii("Table"));
    SetHelpId(SW_TABSHELL);
}

__EXPORT SwWebTableShell::~SwWebTableShell()
{
}


/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.8  2000/09/18 16:06:20  willem.vandorp
    OpenOffice header added.

    Revision 1.7  2000/05/10 11:54:44  os
    Basic API removed

    Revision 1.6  2000/04/19 11:21:44  os
    UNICODE

    Revision 1.5  1997/11/21 10:33:20  MA
    includes


      Rev 1.4   21 Nov 1997 11:33:20   MA
   includes

      Rev 1.3   13 Nov 1997 11:38:44   TRI
   includes wegen Internal Compiler Error umgestellt

      Rev 1.2   03 Nov 1997 14:00:16   MA
   precomp entfernt

      Rev 1.1   05 Sep 1997 12:36:00   MH
   chg: header

      Rev 1.0   03 Sep 1997 14:51:20   MBA
   Initial revision.

------------------------------------------------------------------------*/


diff --git a/sw/source/ui/web/wtextsh.cxx b/sw/source/ui/web/wtextsh.cxx
new file mode 100644
index 0000000..258a6c6
--- /dev/null
+++ b/sw/source/ui/web/wtextsh.cxx
@@ -0,0 +1,207 @@
/*************************************************************************
 *
 *  $RCSfile: wtextsh.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:51 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "hintids.hxx"

#ifndef _SFXOBJFACE_HXX //autogen
#include <sfx2/objface.hxx>
#endif
#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif
#ifndef _SVX_SRCHITEM_HXX
#include <svx/srchitem.hxx> //***
#endif
#ifndef __SBX_SBXVARIABLE_HXX //autogen
#include <svtools/sbxvar.hxx>
#endif
#ifndef _SBASLTID_HRC //autogen
#include <offmgr/sbasltid.hrc>
#endif
#ifndef _SVX_SVXIDS_HRC //autogen
#include <svx/svxids.hrc>
#endif

#include "swtypes.hxx"
#include "cmdid.h"
#include "view.hxx"
#include "wtextsh.hxx"
#include "basesh.hxx"
#include "globals.hrc"
#include "popup.hrc"
#include "shells.hrc"
#include "web.hrc"

#define C2S(cChar) UniString::CreateFromAscii(cChar)

// STATIC DATA -----------------------------------------------------------
#define SwWebTextShell
#define Paragraph
#define HyphenZone
#define TextFont
#define DropCap
#include "itemdef.hxx"
#include "swslots.hxx"


/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SFX_IMPL_INTERFACE(SwWebTextShell, SwBaseShell, SW_RES(STR_SHELLNAME_WEBTEXT))
{
    SFX_POPUPMENU_REGISTRATION(SW_RES(MN_WEB_TEXT_POPUPMENU));
    SFX_OBJECTBAR_REGISTRATION(SFX_OBJECTBAR_OBJECT, SW_RES(RID_WEBTEXT_TOOLBOX));
    SFX_OBJECTMENU_REGISTRATION(SID_OBJECTMENU0, SW_RES(MN_OBJECTMENU_WEBTEXT));
    SFX_CHILDWINDOW_REGISTRATION(FN_EDIT_FORMULA);
    SFX_CHILDWINDOW_REGISTRATION(SID_INSERT_DIAGRAM);
    SFX_CHILDWINDOW_REGISTRATION(FN_INSERT_FIELD);
}

TYPEINIT1(SwWebTextShell, SwTextShell)

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/

SwWebTextShell::SwWebTextShell(SwView &rView) :
    SwTextShell(rView)
{
    SetHelpId(SW_WEBTEXTSHELL);
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/


SwWebTextShell::~SwWebTextShell()
{
}


/*------------------------------------------------------------------------

    $Log: not supported by cvs2svn $
    Revision 1.17  2000/09/18 16:06:20  willem.vandorp
    OpenOffice header added.

    Revision 1.16  2000/05/10 11:54:44  os
    Basic API removed

    Revision 1.15  2000/05/09 14:43:32  os
    BASIC interface partially removed

    Revision 1.14  2000/04/19 11:21:44  os
    UNICODE

    Revision 1.13  2000/02/01 10:00:38  os
    #72282# SwWebBaseShell removed

    Revision 1.12  2000/02/01 09:50:54  os
    #72282# SwWebBaseShell removed

    Revision 1.11  2000/01/31 20:19:38  jp
    Bug #72455#,#72456# Text-PopupMenue moved into swmn.hrc, Web-Textshell with own PopupMenu

    Revision 1.10  2000/01/18 11:57:17  os
    #71740# interface inheritance corrected

    Revision 1.9  1997/11/21 10:33:20  MA
    includes


      Rev 1.8   21 Nov 1997 11:33:20   MA
   includes

      Rev 1.7   03 Nov 1997 14:00:14   MA
   precomp entfernt

      Rev 1.6   03 Sep 1997 10:50:40   MBA
   swslots.hxx statt wswslots.hxx

      Rev 1.5   29 Aug 1997 12:05:54   MH
   chg: header

      Rev 1.4   05 Aug 1997 16:41:48   TJ
   include svx/srchitem.hxx

      Rev 1.3   31 Jul 1997 14:19:20   MH
   chg: header

      Rev 1.2   28 Jan 1997 16:33:40   OS
   Name der Shell geaendert

      Rev 1.1   24 Jan 1997 14:55:54   OS
   eigene TextToolBox

      Rev 1.0   23 Jan 1997 16:18:08   OS
   Initial revision.


------------------------------------------------------------------------*/

diff --git a/sw/source/ui/web/wview.cxx b/sw/source/ui/web/wview.cxx
new file mode 100644
index 0000000..a4c1639
--- /dev/null
+++ b/sw/source/ui/web/wview.cxx
@@ -0,0 +1,523 @@
/*************************************************************************
 *
 *  $RCSfile: wview.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:51 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "itemdef.hxx"

#ifndef _SVX_SRCHITEM_HXX
#include <svx/srchitem.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SFX_TEMPLDLG_HXX //autogen
#include <sfx2/templdlg.hxx>
#endif
#ifndef _SVX_SRCHDLG_HXX //autogen
#include <svx/srchdlg.hxx>
#endif
#ifndef _IDETEMP_HXX //autogen
#include <basctl/idetemp.hxx>
#endif
#ifndef _SBX_SBXOBJECT_HXX //autogen
#include <svtools/sbxobj.hxx>
#endif
#ifndef _UIVWIMP_HXX
#include <uivwimp.hxx>
#endif
#ifndef _SVX_FMSHELL_HXX //autogen
#include <svx/fmshell.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif


#ifndef _SWMODULE_HXX //autogen
#include <swmodule.hxx>
#endif
#ifndef _UNOTXVW_HXX //autogen
#include <unotxvw.hxx>
#endif
#include "swtypes.hxx"
#include "cmdid.h"
#include "globals.hrc"
#include "wrtsh.hxx"
#include "edtwin.hxx"
#include "wgrfsh.hxx"
#include "wfrmsh.hxx"
#include "wolesh.hxx"
#include "wtabsh.hxx"
#include "wlistsh.hxx"
#include "wformsh.hxx"
#include "wtextsh.hxx"
#include "barcfg.hxx"
#include "doc.hxx"

// EIGENTLICH nicht moeglich !!
#include "beziersh.hxx"
#include "drawsh.hxx"
#include "drwtxtsh.hxx"

#include "wview.hxx"
#include "wdocsh.hxx"
#include "web.hrc"
#include "shells.hrc"

#define SwWebView
#define SearchAttributes
#define ReplaceAttributes
#define SearchSettings
#define _ExecSearch ExecSearch
#define _StateSearch StateSearch
#define Frames
#define Graphics
#define OLEObjects
#define Controls
#define Text
#define Frame
#define Graphic
#define Object
#define Draw
#define DrawText
#define TextInTable
#define ListInText
#define ListInTable
#define Page
#include <svx/svxslots.hxx>
#include "swslots.hxx"


SFX_IMPL_VIEWFACTORY(SwWebView, SW_RES(STR_NONAME))
{
    SFX_VIEW_REGISTRATION(SwWebDocShell);
}


SFX_IMPL_INTERFACE( SwWebView, SwView, SW_RES(RID_WEBTOOLS_TOOLBOX) )
{
    SFX_CHILDWINDOW_REGISTRATION(SfxTemplateDialogWrapper::GetChildWindowId());
    SFX_CHILDWINDOW_REGISTRATION(SvxSearchDialogWrapper::GetChildWindowId());
    SFX_OBJECTBAR_REGISTRATION( SFX_OBJECTBAR_TOOLS|
                                SFX_VISIBILITY_STANDARD|SFX_VISIBILITY_SERVER,
                                SW_RES(RID_WEBTOOLS_TOOLBOX) );
}

TYPEINIT1(SwWebView,SwView)

/*-----------------22.01.97 14.27-------------------

--------------------------------------------------*/


SwWebView::SwWebView(SfxViewFrame* pFrame, SfxViewShell* pShell) :
    SwView(pFrame, pShell)
{
}

/*-----------------22.01.97 14.27-------------------

--------------------------------------------------*/


SwWebView::~SwWebView()
{
}

/*-----------------23.01.97 09.01-------------------

--------------------------------------------------*/


void SwWebView::SelectShell()
{
    // Entscheidung, ob UpdateTable gerufen werden muss
    BOOL bUpdateTable = FALSE;
    const SwFrmFmt* pCurTableFmt = GetWrtShell().GetTableFmt();
    if(pCurTableFmt && pCurTableFmt != GetLastTblFrmFmt())
    {
        bUpdateTable = TRUE; // kann erst spaeter ausgefuehrt werden
    }
    SetLastTblFrmFmt(pCurTableFmt);
    //SEL_TBL und SEL_TBL_CELLS koennen verodert sein!
    int nNewSelectionType = (GetWrtShell().GetSelectionType()
                                & ~SwWrtShell::SEL_TBL_CELLS);

    int nSelectionType = GetSelectionType();
    if ( nNewSelectionType == nSelectionType )
    {
        GetViewFrame()->GetBindings().InvalidateAll( FALSE );
        if ( nSelectionType & SwWrtShell::SEL_OLE ||
             nSelectionType & SwWrtShell::SEL_GRF )
            //Fuer Grafiken und OLE kann sich natuerlich das Verb aendern!
            ImpSetVerb( nNewSelectionType );
    }
    else
    {

    //  DELETEZ(pxSelectionObj); //Selektionsobjekt loeschen
        SfxDispatcher &rDispatcher = *GetViewFrame()->GetDispatcher();
        SwToolbarConfigItem *pBarCfg = SW_MOD()->GetWebToolbarConfig();

        if( GetCurShell() )
        {
            rDispatcher.Flush();        // alle gecachten Shells wirklich loeschen

            //Zur alten Selektion merken welche Toolbar sichtbar war
            USHORT nId = rDispatcher.GetObjectBarId( SFX_OBJECTBAR_OBJECT );
            if ( nId )
                pBarCfg->SetTopToolbar( nSelectionType, nId );

            SfxShell *pSfxShell;
            USHORT i;
            for ( i = 0; TRUE; ++i )
            {
                pSfxShell = rDispatcher.GetShell( i );
                if ( !(pSfxShell->ISA( SwBaseShell ) ||
                    pSfxShell->ISA( SwDrawTextShell )) )
                    break;
            }
            pSfxShell = rDispatcher.GetShell( --i );
            ASSERT( pSfxShell, "My Shell ist lost in space" );
            rDispatcher.Pop( *pSfxShell, SFX_SHELL_POP_UNTIL | SFX_SHELL_POP_DELETE);
        }

        FASTBOOL bInitFormShell = FALSE;
        if( !GetFormShell() )
        {
            bInitFormShell = TRUE;
            SetFormShell( new FmFormShell( this ) );
            rDispatcher.Push( *GetFormShell() );
        }

        FASTBOOL bSetExtInpCntxt = FALSE;
        nSelectionType = nNewSelectionType;
        SetSelectionType( nSelectionType );
        ShellModes eShellMode;

        if ( nSelectionType & SwWrtShell::SEL_OLE )
        {
            eShellMode = SEL_OBJECT;
            SetShell( new SwWebOleShell( *this ));
            rDispatcher.Push( *GetCurShell() );
        }
        else if ( nSelectionType & SwWrtShell::SEL_FRM
            || nSelectionType & SwWrtShell::SEL_GRF)
        {
            eShellMode = SEL_FRAME;
            SetShell( new SwWebFrameShell( *this ));
            rDispatcher.Push( *GetCurShell() );
            if(nSelectionType & SwWrtShell::SEL_GRF )
            {
                eShellMode = SEL_GRAPHIC;
                SetShell( new SwWebGrfShell( *this ));
                rDispatcher.Push( *GetCurShell() );
            }
        }
        else if ( nSelectionType & SwWrtShell::SEL_FRM )
        {
            eShellMode = SEL_FRAME;
            SetShell( new SwWebFrameShell( *this ));
            rDispatcher.Push( *GetCurShell() );
        }
        else if ( nSelectionType & SwWrtShell::SEL_DRW )
        {
            eShellMode = SEL_DRAW;
            SetShell( new SwDrawShell( *this ));
            rDispatcher.Push( *GetCurShell() );
            if ( nSelectionType & SwWrtShell::SEL_BEZ )
            {
                eShellMode = SEL_BEZIER;
                SetShell( new SwBezierShell( *this ));
                rDispatcher.Push( *GetCurShell() );
            }

        }
        else if ( nSelectionType & SwWrtShell::SEL_DRW_FORM )
        {
            eShellMode = SEL_DRAW_FORM;
            SetShell( new SwWebDrawFormShell( *this ));

            rDispatcher.Push( *GetCurShell() );
        }
        else if ( nSelectionType & SwWrtShell::SEL_DRW_TXT )
        {
            eShellMode = SEL_DRAWTEXT;
            rDispatcher.Push( *(new SwBaseShell( *this )) );
            SetShell( new SwDrawTextShell( *this ));
            rDispatcher.Push( *GetCurShell() );
        }
        else
        {
            bSetExtInpCntxt = TRUE;
            eShellMode = SEL_TEXT;
            if ( nSelectionType & SwWrtShell::SEL_NUM )
            {
                eShellMode = SEL_LIST_TEXT;
                SetShell( new SwWebListShell( *this ));
                rDispatcher.Push( *GetCurShell() );
            }
            SetShell( new SwWebTextShell(*this));
            rDispatcher.Push( *GetCurShell() );
            if ( nSelectionType & SwWrtShell::SEL_TBL )
            {
                eShellMode = eShellMode == SEL_LIST_TEXT ? SEL_TABLE_LIST_TEXT
                                                        : SEL_TABLE_TEXT;
                SetShell( new SwWebTableShell( *this ));
                rDispatcher.Push( *GetCurShell() );
            }
        }
        ImpSetVerb( nSelectionType );
        GetViewImpl()->SetShellMode(eShellMode);

        if( !GetDocShell()->IsReadOnly() )
        {
            if( bSetExtInpCntxt && GetWrtShell().HasReadonlySel() )
                bSetExtInpCntxt = FALSE;

            InputContext aCntxt( GetEditWin().GetInputContext() );
            aCntxt.SetOptions( bSetExtInpCntxt
                                ? (aCntxt.GetOptions() |
                                        ( INPUTCONTEXT_TEXT |
                                            INPUTCONTEXT_EXTTEXTINPUT ))
                                : (aCntxt.GetOptions() & ~
                                        ( INPUTCONTEXT_TEXT |
                                            INPUTCONTEXT_EXTTEXTINPUT )) );
            GetEditWin().SetInputContext( aCntxt );
        }

        //Zur neuen Selektion die Toolbar aktivieren, die auch beim letzten Mal
        //aktiviert war
        //Vorher muss ein Flush() sein, betrifft aber lt. MBA nicht das UI und ist
        //kein Performance-Problem
        rDispatcher.Flush();
        USHORT nId = pBarCfg->GetTopToolbar( nSelectionType );
        if ( USHRT_MAX != nId )
            rDispatcher.ShowObjectBar( nId );

        Point aPnt = GetEditWin().GetPointerPosPixel();
        aPnt = GetEditWin().PixelToLogic(aPnt);
        GetEditWin().UpdatePointer(aPnt);

        if ( bInitFormShell && GetWrtShell().GetDrawView() )
            GetFormShell()->SetView( PTR_CAST( FmFormView,
                                                GetWrtShell().GetDrawView()));


    }
    GetViewImpl()->GetUNOObject_Impl()->NotifySelChanged();

    //Guenstiger Zeitpunkt fuer die Kommunikation mit OLE-Objekten?
    if ( GetDocShell()->GetDoc()->IsOLEPrtNotifyPending() )
        GetDocShell()->GetDoc()->PrtOLENotify( FALSE );

    //jetzt das Tabellen-Update
    if(bUpdateTable)
        GetWrtShell().UpdateTable();
}

/*------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.45  2000/09/18 16:06:20  willem.vandorp
    OpenOffice header added.

    Revision 1.44  2000/09/07 15:59:35  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.43  2000/09/04 11:46:58  tbe
    basicide, isetbrw, si, vcdlged moved from svx to basctl

    Revision 1.42  2000/08/08 13:47:37  os
    #77423# separate graphic shell

    Revision 1.41  2000/05/10 11:54:44  os
    Basic API removed

    Revision 1.40  1999/09/10 13:19:16  os
    Chg: resource types removed

    Revision 1.39  1999/08/05 17:25:16  JP
    have to change: FmFormShell


      Rev 1.38   05 Aug 1999 19:25:16   JP
   have to change: FmFormShell

      Rev 1.37   05 May 1999 11:23:30   OS
   #63790# Tabellen-Update nur bei Bedarf rufen

      Rev 1.36   08 Mar 1999 13:39:02   MA
   #62792# OLE-Printer-Benachrichtigung vervollstaendigt

      Rev 1.35   08 Feb 1999 12:51:58   OS
   #61377# falsche DBG_ERRORs entsorgt

      Rev 1.34   02 Feb 1999 13:16:28   JP
   Bug #61335#: Schnistelle zu SwView geaendert

      Rev 1.33   21 Oct 1998 11:40:00   OS
   #58243# Objectbar aus der richtigen Konfiguration lesen

      Rev 1.32   30 Jun 1998 13:02:08   MA
   das war wohl grad etwas zu gruendlich

      Rev 1.30   09 Jun 1998 15:33:32   OM
   VC-Controls entfernt

      Rev 1.29   08 Jun 1998 18:09:42   OM
   Forms im HTML-Mode

      Rev 1.28   12 May 1998 19:00:54   MA
   schon mal Praeventiv die FormShell pushen

      Rev 1.27   02 Apr 1998 10:07:18   MA
   new: ToolbarCfg

      Rev 1.26   11 Feb 1998 10:34:04   MA
   #47035# und CopyCtor entfernt

      Rev 1.25   16 Dec 1997 12:11:26   OS
   Impl-Pointer fuer UNO

      Rev 1.24   28 Nov 1997 14:46:38   MA
   includes

      Rev 1.23   21 Nov 1997 11:33:20   MA
   includes

      Rev 1.22   03 Nov 1997 14:00:14   MA
   precomp entfernt

      Rev 1.21   18 Sep 1997 14:02:04   OS
   Pointer::GetPosPixel fuer VCL ersetzt

      Rev 1.20   05 Sep 1997 12:36:00   MH
   chg: header

      Rev 1.19   03 Sep 1997 14:52:36   MBA
   Neue WebShells

      Rev 1.18   03 Sep 1997 10:51:30   MBA
   swslots.hxx statt wswslots.hxx

      Rev 1.17   05 Aug 1997 16:41:48   TJ
   include svx/srchitem.hxx

      Rev 1.16   08 Jul 1997 12:08:06   OM
   Draw-Selektionsmodi aufgeraeumt

      Rev 1.15   25 Jun 1997 13:35:52   OM
   #40966# DrawBaseShell-Ptr wieder eingefuehrt

      Rev 1.14   19 Jun 1997 16:39:24   MA
   fix: reste vom DrawText-Umbau

      Rev 1.13   18 Jun 1997 17:27:36   HJS
   alte segmentierung raus

      Rev 1.12   17 Jun 1997 15:43:12   MA
   DrawTxtShell nicht von BaseShell ableiten + Opts

      Rev 1.11   14 Apr 1997 16:18:00   OS
   Search/ReplaceAttributes

      Rev 1.10   10 Apr 1997 10:18:58   TRI
   includes

      Rev 1.9   09 Apr 1997 08:15:38   MA
   includes

      Rev 1.8   23 Feb 1997 15:06:26   OS
   GetIcon ueberladen

      Rev 1.7   03 Feb 1997 15:03:36   MA
   chg: ListShell nach unten

      Rev 1.6   31 Jan 1997 13:35:16   OS
   neu: SwWebFrameShell

      Rev 1.5   30 Jan 1997 11:07:24   OS
   erweiterter View-Ctor

      Rev 1.4   29 Jan 1997 12:52:18   OS
   SelectShell: DrawCtrlShell nachgetragen

      Rev 1.3   24 Jan 1997 14:54:28   OS
   RID_WEBTOOLS_TOOLBOX

      Rev 1.2   23 Jan 1997 17:37:24   OS
   GetDispatcher nicht an der SwView aufrufen

      Rev 1.1   23 Jan 1997 17:25:20   OS
   Cast fuer SetDrawBaseShell

      Rev 1.0   23 Jan 1997 16:17:26   OS
   Initial revision.

------------------------------------------------------------------------*/



diff --git a/sw/source/ui/wrtsh/delete.cxx b/sw/source/ui/wrtsh/delete.cxx
new file mode 100644
index 0000000..c3cdd33
--- /dev/null
+++ b/sw/source/ui/wrtsh/delete.cxx
@@ -0,0 +1,504 @@
/*************************************************************************
 *
 *  $RCSfile: delete.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:53 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif


inline void SwWrtShell::OpenMark()
{
    StartAllAction();
    ResetCursorStack();
    KillPams();
    SetMark();
}

inline void SwWrtShell::CloseMark( BOOL bOkFlag )
{
    if( bOkFlag )
        UpdateAttr();
    else
        SwapPam();

    ClearMark();
    EndAllAction();
}


/*------------------------------------------------------------------------
 Beschreibung:  Zeile loeschen
------------------------------------------------------------------------*/



long SwWrtShell::DelLine()
{
    ACT_KONTEXT(this);
    ResetCursorStack();
        // alten Cursor merken
    Push();
    ClearMark();
    SwCrsrShell::LeftMargin();
    SetMark();
    SwCrsrShell::RightMargin();
//Warum soll hier noch ein Zeichen in der naechsten Zeile geloescht werden?
//  if(!IsEndOfPara())
//      SwCrsrShell::Right();
    long nRet = Delete();
    Pop(FALSE);
    if( nRet )
        UpdateAttr();
    return nRet;
}



long SwWrtShell::DelToStartOfLine()
{
    OpenMark();
    SwCrsrShell::LeftMargin();
    long nRet = Delete();
    CloseMark( 0 != nRet );
    return nRet;
}



long SwWrtShell::DelToEndOfLine()
{
    OpenMark();
    SwCrsrShell::RightMargin();
    long nRet = Delete();
    CloseMark( 0 != nRet );
    return 1;
}



long SwWrtShell::DelLeft()
{
    // wenns denn ein Fly ist, wech damit
    int nSelType = GetSelectionType();
    const int nCmp = SEL_FRM | SEL_GRF | SEL_OLE | SEL_DRW;
    if( nCmp & nSelType )
    {
        DelSelectedObj();
        LeaveSelFrmMode();
        UnSelectFrm();
        nSelType = GetSelectionType();
        if ( nCmp & nSelType )
        {
            EnterSelFrmMode();
            GotoNextFly();
        }
        return 1L;
    }

    // wenn eine Selektion existiert, diese loeschen.
    if ( IsSelection() )
    {
         //OS: wieder einmal Basic: ACT_KONTEXT muss vor
        //EnterStdMode verlassen werden!
        {
            ACT_KONTEXT(this);
            ResetCursorStack();
            Delete();
            UpdateAttr();
        }
        EnterStdMode();
        return 1L;
    }

    // JP 29.06.95: nie eine davor stehende Tabelle loeschen.
    BOOL bSwap = FALSE;
    if( SwCrsrShell::IsSttPara() && !SwCrsrShell::IsCrsrInTbl() )
    {
        if( !SwCrsrShell::Left() )
            return 0;
        if( SwCrsrShell::IsCrsrInTbl() )
        {
            SwCrsrShell::Right();
            return 0;
        }
        OpenMark();
        SwCrsrShell::Right();
        SwCrsrShell::SwapPam();
        bSwap = TRUE;
    }
    else
    {
        OpenMark();
        SwCrsrShell::Left();
    }
    long nRet = Delete();
    if( !nRet && bSwap )
        SwCrsrShell::SwapPam();
    CloseMark( 0 != nRet );
    return nRet;
}



long SwWrtShell::DelRight(BOOL bDelFrm)
{
        // werden verodert, wenn Tabellenselektion vorliegt;
        // wird hier auf SEL_TBL umgesetzt.
    long nRet = 0;
    int nSelection = GetSelectionType();
    if(nSelection & SwWrtShell::SEL_TBL_CELLS)
        nSelection = SwWrtShell::SEL_TBL;
    if(nSelection & SwWrtShell::SEL_TXT)
        nSelection = SwWrtShell::SEL_TXT;
    switch( nSelection & ~(SEL_BEZ) )
    {
    case SEL_TXT:
    case SEL_TBL:
    case SEL_NUM:
            //  wenn eine Selektion existiert, diese loeschen.
        if( IsSelection() )
        {
            //OS: wieder einmal Basic: ACT_KONTEXT muss vor
            //EnterStdMode verlassen werden!
            {
                ACT_KONTEXT(this);
                ResetCursorStack();
                Delete();
                UpdateAttr();
            }
            EnterStdMode();
            nRet = 1L;
            break;
        }

        if( SEL_TXT & nSelection && SwCrsrShell::IsSttPara() &&
            SwCrsrShell::IsEndPara() && !IsCrsrInTbl() &&
            SwCrsrShell::Right() )
        {
            BOOL bDelFull = 0 != IsCrsrInTbl();
            SwCrsrShell::Left();

            if( bDelFull )
            {
                DelFullPara();
                UpdateAttr();
                break;
            }
        }

        OpenMark();
        SwCrsrShell::Right();
        nRet = Delete();
        CloseMark( 0 != nRet );
        break;

    case SEL_FRM:
    case SEL_GRF:
    case SEL_OLE:
    case SEL_DRW:
    case SEL_DRW_TXT:
    case SEL_DRW_FORM:
        DelSelectedObj();
        LeaveSelFrmMode();
        UnSelectFrm();

        if( IsFrmSelected() )
        {
            nSelection = GetSelectionType();
            if ( SEL_FRM & nSelection || SEL_GRF & nSelection ||
                SEL_OLE & nSelection || SEL_DRW & nSelection )
            {
                EnterSelFrmMode();
                GotoNextFly();
            }
        }
        nRet = 1;
        break;
    }
    return nRet;
}



long SwWrtShell::DelToEndOfPara()
{
    ACT_KONTEXT(this);
    ResetCursorStack();
    Push();
    SetMark();
    if( !MovePara(fnParaCurr,fnParaEnd))
    {
        Pop(FALSE);
        return 0;
    }
    long nRet = Delete();
    Pop(FALSE);
    if( nRet )
        UpdateAttr();
    return nRet;
}



long SwWrtShell::DelToStartOfPara()
{
    ACT_KONTEXT(this);
    ResetCursorStack();
    Push();
    SetMark();
    if( !MovePara(fnParaCurr,fnParaStart))
    {
        Pop(FALSE);
        return 0;
    }
    long nRet = Delete();
    Pop(FALSE);
    if( nRet )
        UpdateAttr();
    return nRet;
}
/*
 * alle Loeschoperationen sollten mit Find statt mit
 * Nxt-/PrvDelim arbeiten, da letzteren mit Wrap Around arbeiten
 * -- das ist wohl nicht gewuenscht.
 */



long SwWrtShell::DelToStartOfSentence()
{
    if(IsStartOfDoc())
        return 0;
    OpenMark();
    long nRet = _BwdSentence() ? Delete() : 0;
    CloseMark( 0 != nRet );
    return nRet;
}



long SwWrtShell::DelToEndOfSentence()
{
    if(IsEndOfDoc())
        return 0;
    OpenMark();
    long nRet = _FwdSentence() ? Delete() : 0;
    CloseMark( 0 != nRet );
    return nRet;
}



long SwWrtShell::DelNxtWord()
{
    if(IsEndOfDoc())
        return 0;
    ACT_KONTEXT(this);
    ResetCursorStack();
    EnterStdMode();
    SetMark();
    if(IsEndWrd())
        _NxtWrd();
    if(IsSttWrd() || IsEndPara())
        _NxtWrd();
    else
        _EndWrd();

    long nRet = Delete();
    if( nRet )
        UpdateAttr();
    else
        SwapPam();
    ClearMark();
    return nRet;
}



long SwWrtShell::DelPrvWord()
{
    if(IsStartOfDoc())
        return 0;
    ACT_KONTEXT(this);
    ResetCursorStack();
    EnterStdMode();
    SetMark();
    if( !IsSttWrd() || !_PrvWrd() )
    {
        if( IsEndWrd() )
        {
            if( _PrvWrd() )
            {
                // skip over all-1 spaces
                short n = -1;
                while( ' ' == GetChar( FALSE, n ))
                    --n;

                if( ++n )
                    ExtendSelection( FALSE, -n );
            }
        }
        else if( IsSttPara())
            _PrvWrd();
        else
            _SttWrd();
    }
    long nRet = Delete();
    if( nRet )
        UpdateAttr();
    else
        SwapPam();
    ClearMark();
    return nRet;
}

/*************************************************************************

      $Log: not supported by cvs2svn $
      Revision 1.70  2000/09/18 16:06:26  willem.vandorp
      OpenOffice header added.

      Revision 1.69  2000/04/10 08:39:49  jp
      Bug #74881#: DelPrvWord

      Revision 1.68  1999/04/01 13:21:50  JP
      Bug #64298#: DelRight - auch Controls usw. entfernen


      Rev 1.67   01 Apr 1999 15:21:50   JP
   Bug #64298#: DelRight - auch Controls usw. entfernen

      Rev 1.66   05 Feb 1999 15:07:54   JP
   Bug #61386#: DelRight unnoetigen Befehl entfernt

      Rev 1.65   19 Jan 1999 22:53:46   JP
   Task #58677#: Crsr in Readonly Bereichen zulassen

      Rev 1.64   15 Jan 1999 15:43:28   JP
   Bug #60917#: DelPrevWord korrigiert

      Rev 1.63   09 Jun 1998 15:34:32   OM
   VC-Controls entfernt

      Rev 1.62   21 Apr 1998 17:36:28   OM
   #49630 Keine Rahmenselektion nach Loeschung von Zeichenobjekten

      Rev 1.61   24 Nov 1997 14:35:06   MA
   includes

      Rev 1.60   03 Nov 1997 14:02:54   MA
   precomp entfernt

      Rev 1.59   06 Mar 1997 09:22:58   OM
   sel_drw_ctrl ergaenzt

      Rev 1.58   05 Feb 1997 17:01:04   JP
   Bug #35638#: DelRight in Zellen

      Rev 1.57   03 Feb 1997 20:41:30   JP
   DelRight: leeren TextNode vor Tabellen loeschen

      Rev 1.56   22 Jan 1997 11:55:56   MA
   opt: bSelection entfernt

      Rev 1.55   29 Aug 1996 09:26:04   OS
   includes

      Rev 1.54   22 Jan 1996 16:28:50   OS
   DelRight/Left: ACT_KONTEXT muss vor EnterStdMode enden wg. Shellumschaltung aus Basic Bug #24529#

      Rev 1.53   24 Nov 1995 16:59:04   OM
   PCH->PRECOMPILED

      Rev 1.52   22 Sep 1995 11:45:48   JP
   DelLeft: & und nicht | abfragen

      Rev 1.51   10 Aug 1995 13:04:44   OS
   DelLine: nur bis zum Zeilenende markieren und loeschen

      Rev 1.50   05 Jul 1995 19:14:52   JP
   Delete: mit Backspace keine Tabelle loeschen

      Rev 1.49   29 Jun 1995 20:10:12   JP
   DelLeft: keine Tabellen loeschen mit BACKSPACE

      Rev 1.48   19 Jun 1995 09:53:44   MA
   fix(13180): Del fuer Zeichenobjekte.

      Rev 1.47   05 Apr 1995 19:47:38   OM
   Bug in NumShell mit Delete gefixt

      Rev 1.46   20 Dec 1994 11:53:44   MA
   SS Drawing.

      Rev 1.45   15 Dec 1994 20:32:04   SWG
   *ARR* Ersetzungen, svmem, __far_data etc.

*************************************************************************/



diff --git a/sw/source/ui/wrtsh/makefile.mk b/sw/source/ui/wrtsh/makefile.mk
new file mode 100644
index 0000000..18ebddc
--- /dev/null
+++ b/sw/source/ui/wrtsh/makefile.mk
@@ -0,0 +1,111 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:14:53 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=..$/..$/..

PRJNAME=sw
TARGET=wrtsh

AUTOSEG=true

PROJECTPCH=ui_pch
PDBTARGET=ui_pch
PROJECTPCHSOURCE=..\ui_1st\ui_pch

# --- Settings -----------------------------------------------------

.INCLUDE :  $(PRJ)$/inc$/swpre.mk
.INCLUDE :  settings.mk
.INCLUDE :  $(PRJ)$/inc$/sw.mk

# --- Files --------------------------------------------------------

CXXFILES = \
        move.cxx \
        select.cxx \
        wrtsh1.cxx \
        wrtsh2.cxx \
        wrtsh3.cxx \
        wrtsh4.cxx \
        delete.cxx \
        wrtundo.cxx

SRCFILES =  \
        wrtsh.src

SLOFILES =  \
        $(SLO)$/move.obj \
        $(SLO)$/select.obj \
        $(SLO)$/wrtsh1.obj \
        $(SLO)$/wrtsh2.obj \
        $(SLO)$/wrtsh3.obj \
        $(SLO)$/wrtsh4.obj \
        $(SLO)$/delete.obj \
        $(SLO)$/wrtundo.obj

EXCEPTIONSFILES= \
        $(SLO)$/wrtsh1.obj \

# --- Tagets -------------------------------------------------------

.INCLUDE :  target.mk

diff --git a/sw/source/ui/wrtsh/move.cxx b/sw/source/ui/wrtsh/move.cxx
new file mode 100644
index 0000000..b84034f
--- /dev/null
+++ b/sw/source/ui/wrtsh/move.cxx
@@ -0,0 +1,823 @@
/*************************************************************************
 *
 *  $RCSfile: move.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:53 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SFX_BINDINGS_HXX //autogen
#include <sfx2/bindings.hxx>
#endif

#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _VIEWOPT_HXX
#include <viewopt.hxx>
#endif
#ifndef _SFXVIEWFRM_HXX
#include <sfx2/viewfrm.hxx>
#endif

/*  Immer:
    -   Zuruecksetzen des Cursorstacks
    -   Timer nachtriggern
    -   gfs. GCAttr

    bei Selektion
    -   SttSelect()

    sonst
    -   EndSelect()
 */

const long nReadOnlyScrollOfst = 10;

class ShellMoveCrsr
{
    SwWrtShell* pSh;
    BOOL bAct;
public:
    inline ShellMoveCrsr( SwWrtShell* pWrtSh, FASTBOOL bSel )
    {
        bAct = !pWrtSh->ActionPend() && (pWrtSh->GetFrmType(0,FALSE) & FRMTYPE_FLY_ANY);
        ( pSh = pWrtSh )->MoveCrsr( BOOL(bSel) );
        pWrtSh->GetView().GetViewFrame()->GetBindings().Invalidate(SID_HYPERLINK_GETLINK);
    }
    inline ~ShellMoveCrsr()
    {
        if( bAct )
        {
            //Die Action wird fuer das Scrollen in "einabsaetzigen" Rahmen mit
            //fester Hoehe gebraucht.
            pSh->StartAllAction();
            pSh->EndAllAction();
        }
    }
};

void SwWrtShell::MoveCrsr( FASTBOOL bWithSelect )
{
    ResetCursorStack();
    if ( IsGCAttr() )
    {
        GCAttr();
        ClearGCAttr();
    }
    if ( bWithSelect )
        SttSelect();
    else
    {
        EndSelect();
        (this->*fnKillSel)( 0, FALSE );
    }
}

FASTBOOL SwWrtShell::SimpleMove( FNSimpleMove FnSimpleMove, FASTBOOL bSelect )
{
    FASTBOOL nRet;
    if( bSelect )
    {
        SttCrsrMove();
        MoveCrsr( TRUE );
        nRet = (this->*FnSimpleMove)();
        EndCrsrMove();
    }
    else if( 0 != ( nRet = (this->*FnSimpleMove)() ) )
        MoveCrsr( FALSE );
    return nRet;
}


FASTBOOL SwWrtShell::Left( FASTBOOL bSelect, USHORT nCount, BOOL bBasicCall )
{
    if ( !bSelect && !bBasicCall && IsCrsrReadonly() )
    {
        Point aTmp( VisArea().Pos() );
        aTmp.X() -= VisArea().Width() * nReadOnlyScrollOfst / 100;
        rView.SetVisArea( aTmp );
        return TRUE;
    }
    else
    {
        ShellMoveCrsr aTmp( this, bSelect );
        return SwCrsrShell::Left( nCount );
    }
}



FASTBOOL SwWrtShell::Right( FASTBOOL bSelect, USHORT nCount, BOOL bBasicCall )
{
    if ( !bSelect && !bBasicCall && IsCrsrReadonly() )
    {
        Point aTmp( VisArea().Pos() );
        aTmp.X() += VisArea().Width() * nReadOnlyScrollOfst / 100;
        aTmp.X() = rView.SetHScrollMax( aTmp.X() );
        rView.SetVisArea( aTmp );
        return TRUE;
    }
    else
    {
        ShellMoveCrsr aTmp( this, bSelect );
        return SwCrsrShell::Right( nCount );
    }
}



FASTBOOL SwWrtShell::Up( FASTBOOL bSelect, USHORT nCount, BOOL bBasicCall )
{
    if ( !bSelect && !bBasicCall && IsCrsrReadonly() )
    {
        Point aTmp( VisArea().Pos() );
        aTmp.Y() -= VisArea().Height() * nReadOnlyScrollOfst / 100;
        rView.SetVisArea( aTmp );
        return TRUE;
    }
    else
    {
        ShellMoveCrsr aTmp( this, bSelect );
        return SwCrsrShell::Up( nCount );
    }
}



FASTBOOL SwWrtShell::Down( FASTBOOL bSelect, USHORT nCount, BOOL bBasicCall )
{
    if ( !bSelect && !bBasicCall && IsCrsrReadonly() )
    {
        Point aTmp( VisArea().Pos() );
        aTmp.Y() += VisArea().Height() * nReadOnlyScrollOfst / 100;
        aTmp.Y() = rView.SetVScrollMax( aTmp.Y() );
        rView.SetVisArea( aTmp );
        return TRUE;
    }
    else
    {
        ShellMoveCrsr aTmp( this, bSelect );
        return SwCrsrShell::Down( nCount );
    }
}



FASTBOOL SwWrtShell::LeftMargin( FASTBOOL bSelect, FASTBOOL bBasicCall )
{
    if ( !bSelect && !bBasicCall && IsCrsrReadonly() )
    {
        Point aTmp( VisArea().Pos() );
        aTmp.X() = DOCUMENTBORDER;
        rView.SetVisArea( aTmp );
        return TRUE;
    }
    else
    {
        ShellMoveCrsr aTmp( this, bSelect );
        return SwCrsrShell::LeftMargin();
    }
}



FASTBOOL SwWrtShell::RightMargin( FASTBOOL bSelect, FASTBOOL bBasicCall  )
{
    if ( !bSelect && !bBasicCall && IsCrsrReadonly() )
    {
        Point aTmp( VisArea().Pos() );
        aTmp.X() = GetDocSize().Width() - VisArea().Width() + DOCUMENTBORDER;
        if( DOCUMENTBORDER > aTmp.X() )
            aTmp.X() = DOCUMENTBORDER;
        rView.SetVisArea( aTmp );
        return TRUE;
    }
    else
    {
        ShellMoveCrsr aTmp( this, bSelect );
        return SwCrsrShell::RightMargin(bBasicCall);
    }
}



BOOL SwWrtShell::GoStart( BOOL bKeepArea, BOOL *pMoveTable,
                            BOOL bSelect, BOOL bDontMoveRegion )
{
    if ( IsCrsrInTbl() )
    {
        const BOOL bBoxSelection = HasBoxSelection();
        if ( !bSelect )
            EnterStdMode();
        else
            SttSelect();
            // Tabellenzelle?
        if ( !bBoxSelection && (MoveSection( fnSectionCurr, fnSectionStart)
                || bDontMoveRegion))
        {
            if ( pMoveTable )
                *pMoveTable = FALSE;
            return TRUE;
        }
        if( MoveTable( fnTableCurr, fnTableStart ) || bDontMoveRegion )
        {
            if ( pMoveTable )
                *pMoveTable = TRUE;
            return TRUE;
        }
        else if( bBoxSelection && pMoveTable )
        {
            // JP 09.01.96: wir haben eine Boxselektion (oder leere Zelle)
            //              und wollen selektieren (pMoveTable wird im
            //              SelAll gesetzt). Dann darf die Tabelle nicht
            //              verlassen werden; sonst ist keine Selektion der
            //              gesamten Tabelle moeglich!
            *pMoveTable = TRUE;
            return TRUE;
        }
    }

    if ( !bSelect )
        EnterStdMode();
    else
        SttSelect();
    const USHORT nFrmType = GetFrmType(0,FALSE);
    if ( FRMTYPE_FLY_ANY & nFrmType )
    {
        if( MoveSection( fnSectionCurr, fnSectionStart ) )
            return TRUE;
        else if ( FRMTYPE_FLY_FREE & nFrmType || bDontMoveRegion )
            return FALSE;
    }
    if(( FRMTYPE_HEADER | FRMTYPE_FOOTER | FRMTYPE_FOOTNOTE ) & nFrmType )
    {
        if ( MoveSection( fnSectionCurr, fnSectionStart ) )
            return TRUE;
        else if ( bKeepArea )
            return TRUE;
    }
    // Bereiche ???
    return SwCrsrShell::MoveRegion( fnRegionCurrAndSkip, fnRegionStart ) ||
           SwCrsrShell::SttDoc();
}



BOOL SwWrtShell::GoEnd(BOOL bKeepArea, BOOL *pMoveTable)
{
    if ( pMoveTable && *pMoveTable )
        return MoveTable( fnTableCurr, fnTableEnd );

    if ( IsCrsrInTbl() )
    {
        if ( MoveSection( fnSectionCurr, fnSectionEnd ) ||
             MoveTable( fnTableCurr, fnTableEnd ) )
            return TRUE;
    }
    else
    {
        const USHORT nFrmType = GetFrmType(0,FALSE);
        if ( FRMTYPE_FLY_ANY & nFrmType )
        {
            if ( MoveSection( fnSectionCurr, fnSectionEnd ) )
                return TRUE;
            else if ( FRMTYPE_FLY_FREE & nFrmType )
                return FALSE;
        }
        if(( FRMTYPE_HEADER | FRMTYPE_FOOTER | FRMTYPE_FOOTNOTE ) & nFrmType )
        {
            if ( MoveSection( fnSectionCurr, fnSectionEnd) )
                return TRUE;
            else if ( bKeepArea )
                return TRUE;
        }
    }
    // Bereiche ???
    return SwCrsrShell::MoveRegion( fnRegionCurrAndSkip, fnRegionEnd ) ||
           SwCrsrShell::EndDoc();
}



FASTBOOL SwWrtShell::SttDoc( FASTBOOL bSelect )
{
    ShellMoveCrsr aTmp( this, bSelect );
    return GoStart(FALSE, 0, bSelect );
}



FASTBOOL SwWrtShell::EndDoc( FASTBOOL bSelect)
{
    ShellMoveCrsr aTmp( this, bSelect );
    return GoEnd();
}


FASTBOOL SwWrtShell::SttNxtPg( FASTBOOL bSelect )
{
    ShellMoveCrsr aTmp( this, bSelect );
    return MovePage( fnPageNext, fnPageStart );
}



FASTBOOL SwWrtShell::SttPrvPg( FASTBOOL bSelect )
{
    ShellMoveCrsr aTmp( this, bSelect );
    return MovePage( fnPagePrev, fnPageStart );
}



FASTBOOL SwWrtShell::EndNxtPg( FASTBOOL bSelect )
{
    ShellMoveCrsr aTmp( this, bSelect );
    return MovePage( fnPageNext, fnPageEnd );
}



FASTBOOL SwWrtShell::EndPrvPg( FASTBOOL bSelect )
{
    ShellMoveCrsr aTmp( this, bSelect );
    return MovePage( fnPagePrev, fnPageEnd );
}



FASTBOOL SwWrtShell::SttPg( FASTBOOL bSelect )
{
    ShellMoveCrsr aTmp( this, bSelect );
    return MovePage( fnPageCurr, fnPageStart );
}



FASTBOOL SwWrtShell::EndPg( FASTBOOL bSelect )
{
    ShellMoveCrsr aTmp( this, bSelect );
    return MovePage( fnPageCurr, fnPageEnd );
}



FASTBOOL SwWrtShell::SttPara( FASTBOOL bSelect )
{
    ShellMoveCrsr aTmp( this, bSelect );
    return MovePara( fnParaCurr, fnParaStart );
}



FASTBOOL SwWrtShell::EndPara( FASTBOOL bSelect )
{
    ShellMoveCrsr aTmp( this, bSelect );
    return MovePara(fnParaCurr,fnParaEnd);
}


/*------------------------------------------------------------------------
 Beschreibung:  Spaltenweises Springen
 Parameter:     mit oder ohne SSelection
 Return:        Erfolg oder Misserfolg
------------------------------------------------------------------------*/



FASTBOOL SwWrtShell::StartOfColumn( FASTBOOL bSelect )
{
    ShellMoveCrsr aTmp( this, bSelect);
    return MoveColumn(fnColumnCurr, fnColumnStart);
}



FASTBOOL SwWrtShell::EndOfColumn( FASTBOOL bSelect )
{
    ShellMoveCrsr aTmp( this, bSelect);
    return MoveColumn(fnColumnCurr, fnColumnEnd);
}



FASTBOOL SwWrtShell::StartOfNextColumn( FASTBOOL bSelect )
{
    ShellMoveCrsr aTmp( this, bSelect);
    return MoveColumn( fnColumnNext, fnColumnStart);
}



FASTBOOL SwWrtShell::EndOfNextColumn( FASTBOOL bSelect )
{
    ShellMoveCrsr aTmp( this, bSelect);
    return MoveColumn(fnColumnNext, fnColumnEnd);
}



FASTBOOL SwWrtShell::StartOfPrevColumn( FASTBOOL bSelect )
{
    ShellMoveCrsr aTmp( this, bSelect);
    return MoveColumn(fnColumnPrev, fnColumnStart);
}



FASTBOOL SwWrtShell::EndOfPrevColumn( FASTBOOL bSelect )
{
    ShellMoveCrsr aTmp( this, bSelect);
    return MoveColumn(fnColumnPrev, fnColumnEnd);
}



BOOL SwWrtShell::PushCrsr(SwTwips lOffset, BOOL bSelect)
{
    BOOL bDiff = FALSE;
    SwRect aOldRect( GetCharRect() ), aTmpArea( VisArea() );

    //bDestOnStack besagt, ob ich den Cursor nicht an die aktuelle Position
    //setzen konnte, da in diesem Bereich kein Inhalt vorhanden ist.
    if( !bDestOnStack )
    {
        Point aPt( aOldRect.Center() );

        if( !IsCrsrVisible() )
            // set CrsrPos to top-/bottom left pos. So the pagescroll is not
            // be dependent on the current cursor, but on the visarea.
            aPt.Y() = aTmpArea.Top() + aTmpArea.Height() / 2;

        aPt.Y() += lOffset;
        aDest = GetCntntPos(aPt,lOffset > 0);
        aDest.X() = aPt.X();
        bDestOnStack = TRUE;
    }

    //falls wir eine Rahmenselektion hatten, muss diese nach dem
    //fnSetCrsr entfernt werden und damit wir da wieder hinkommen
    //auf dem Stack gemerkt werden.
    BOOL bIsFrmSel = FALSE;

    BOOL bIsObjSel = FALSE;

    //Zielposition liegt jetzt innerhalb des sichtbaren Bereiches -->
    //Cursor an die Zielposition setzen; merken, dass keine Ziel-
    //position mehr auf dem Stack steht.
    //Der neue sichtbare Bereich wird zuvor ermittelt.
    aTmpArea.Pos().Y() += lOffset;
    if( aTmpArea.IsInside(aDest) )
    {
        if( bSelect )
            SttSelect();
        else
            EndSelect();

        bIsFrmSel = IsFrmSelected();
        bIsObjSel = 0 != IsObjSelected();

        // Rahmenselektion aufheben
        if( bIsFrmSel || bIsObjSel )
        {
            UnSelectFrm();
            LeaveSelFrmMode();
            if ( bIsObjSel )
            {
                GetView().SetDrawFuncPtr( NULL );
                GetView().LeaveDrawCreate();
            }

            CallChgLnk();
        }

        (this->*fnSetCrsr)( &aDest, TRUE );

        bDiff = aOldRect != GetCharRect();

        if( bIsFrmSel )
        {
//          CallChgLnk();
            // bei Frames immer nur die obere Ecke nehmen, damit dieser
            // wieder selektiert werden kann
            aOldRect.SSize( 5, 5 );
        }

            // Zuruecksetzen des Dest. SPoint Flags
        bDestOnStack = FALSE;
    }

    // Position auf den Stack; bDiff besagt, ob ein Unterschied zwischen
    // der alten und der neuen Cursorposition besteht.
    pCrsrStack = new CrsrStack( bDiff, bIsFrmSel, aOldRect.Center(),
                                lOffset, pCrsrStack );
    return !bDestOnStack && bDiff;
}



BOOL SwWrtShell::PopCrsr(BOOL bUpdate, BOOL bSelect)
{
    if( 0 == pCrsrStack)
        return FALSE;

    const BOOL bValidPos = pCrsrStack->bValidCurPos;
    if( bUpdate && bValidPos )
    {
            // falls ein Vorgaenger auf dem Stack steht, dessen Flag fuer eine
            // gueltige Position verwenden.
        SwRect aTmpArea(VisArea());
        aTmpArea.Pos().Y() -= pCrsrStack->lOffset;
        if( aTmpArea.IsInside( pCrsrStack->aDocPos ) )
        {
            if( bSelect )
                SttSelect();
            else
                EndSelect();

            (this->*fnSetCrsr)(&pCrsrStack->aDocPos, !pCrsrStack->bIsFrmSel);
            if( pCrsrStack->bIsFrmSel && IsObjSelectable(pCrsrStack->aDocPos))
            {
                HideCrsr();
                SelectObj( pCrsrStack->aDocPos );
                EnterSelFrmMode( &pCrsrStack->aDocPos );
            }
        }
            // Falls eine Verschiebung zwischen dem sichtbaren Bereich
            // und der gemerkten Cursorpositionen auftritt, werden
            // alle gemerkten Positionen weggeschmissen
        else
        {
            _ResetCursorStack();
            return FALSE;
        }
    }
    CrsrStack *pTmp = pCrsrStack;
    pCrsrStack = pCrsrStack->pNext;
    delete pTmp;
    if( 0 == pCrsrStack )
    {
        ePageMove = MV_NO;
        bDestOnStack = FALSE;
    }
    return bValidPos;
}

/*
 * Zuruecksetzen aller gepushten Cursorpositionen; dieser werden nicht
 * zur Anzeige gebracht ( --> Kein Start-/EndAction!!)
 */



void SwWrtShell::_ResetCursorStack()
{
    CrsrStack *pTmp = pCrsrStack;
    while(pCrsrStack)
    {
        pTmp = pCrsrStack->pNext;
        delete pCrsrStack;
        pCrsrStack = pTmp;
    }
    ePageMove = MV_NO;
    bDestOnStack = FALSE;
}
/**************

    falls kein Stack existiert --> Selektionen aufheben
    falls Stack && Richtungswechsel
        --> Cursor poppen und return
    sonst
        --> Cursor pushen
             Cursor umsetzen

***************/



BOOL SwWrtShell::PageCrsr(SwTwips lOffset, BOOL bSelect)
{
    // nichts tun, wenn ein Offset von 0 angegeben wurde
    if(!lOffset) return FALSE;
        // Diente mal dazu, eine Neuformatierung fuer das Layout
        // zu erzwingen.
        // Hat so nicht funktioniert, da der Cursor nicht gesetzt
        // wurde, da dies innerhalb einer Start- / EndActionklammerung
        // nicht geschieht.
        // Da am Ende nur ViewShell::EndAction() gerufen wird,
        // findet auch hier keine Aktualisierung der Anzeige
        // der Cursorposition statt.
        // Die CrsrShell- Actionklammerung kann nicht verwendet werden,
        // da sie immer zu einer Anzeige des Cursors fuehrt, also auch,
        // wenn nach dem Blaettern in einen Bereich ohne gueltige Position
        // geblaettert wurde.
        //  ViewShell::StartAction();
    PageMove eDir = lOffset > 0? MV_PAGE_DOWN: MV_PAGE_UP;
        // Richtungswechsel und Stack vorhanden
    if( eDir != ePageMove && ePageMove != MV_NO && PopCrsr( TRUE, bSelect ))
        return TRUE;

    const BOOL bRet = PushCrsr(lOffset, bSelect);
    ePageMove = eDir;
    return bRet;
}



BOOL SwWrtShell::GotoPage(USHORT nPage, BOOL bRecord)
{
    ShellMoveCrsr aTmp( this, FALSE);
    if( SwCrsrShell::GotoPage(nPage) && bRecord)
    {
        if(IsSelFrmMode())
        {
            UnSelectFrm();
            LeaveSelFrmMode();
        }
        return TRUE;
    }
    return FALSE;
}



FASTBOOL SwWrtShell::GotoBookmark( USHORT nPos, BOOL bSelect, BOOL bStart )
{
    ShellMoveCrsr aTmp( this, bSelect );
    return SwCrsrShell::GotoBookmark( nPos, bStart );
}



FASTBOOL SwWrtShell::SelectTxtAttr( USHORT nWhich, const SwTxtAttr* pAttr )
{
    ShellMoveCrsr aTmp( this, TRUE );
    return SwCrsrShell::SelectTxtAttr( nWhich, FALSE, pAttr );
}

/*************************************************************************

      $Log: not supported by cvs2svn $
      Revision 1.100  2000/09/18 16:06:26  willem.vandorp
      OpenOffice header added.

      Revision 1.99  2000/09/07 15:59:35  os
      change: SFX_DISPATCHER/SFX_BINDINGS removed

      Revision 1.98  2000/06/27 19:42:49  jp
      Bug #70447#: select the current TOXMark if the EditDialog is open

      Revision 1.97  1999/10/12 07:24:36  os
      #69115# API parameter in GotoLeftRight/LRMargin

      Revision 1.96  1999/10/06 12:58:10  jp
      PushCrsr: if cursor not in visarea, thne use the visarea for new position

      Revision 1.95  1998/11/27 13:59:32  AMA
      Fix #59951#59825#: Unterscheiden zwischen Rahmen-,Seiten- und Bereichsspalten


      Rev 1.94   27 Nov 1998 14:59:32   AMA
   Fix #59951#59825#: Unterscheiden zwischen Rahmen-,Seiten- und Bereichsspalten

      Rev 1.93   14 Jun 1998 13:46:24   MA
   ein paar inlines mittels function pointer

      Rev 1.92   04 May 1998 18:00:20   JP
   Bug #49993#: IsSelOver darf nicht immer den Cursor verschieben; GotoBookmark mit ReturntWert

      Rev 1.91   12 Feb 1998 20:12:22   JP
   Left-/RightMargin: zus. Flag fuer BasicCall, im ReadOnlyCall an Anfang/Ende des Randes scrollen

      Rev 1.90   24 Nov 1997 14:35:06   MA
   includes

      Rev 1.89   03 Nov 1997 14:02:54   MA
   precomp entfernt

      Rev 1.88   29 Jul 1997 09:24:26   OM
   Hyperlink Statusmethode

      Rev 1.87   12 Jun 1997 11:20:20   MA
   chg: CursorTimer vorlaeufig entfernt

      Rev 1.86   29 Apr 1997 16:30:56   AMA
   New: Scrolling bei abgeschnittenen Absaetzen in Rahmen mit fester Hoehe.

      Rev 1.85   06 Mar 1997 12:27:28   JP
   Left/Right/Up/Down: bei API-Calls in ReadOnly Docs normale verhalten

      Rev 1.84   18 Feb 1997 13:40:44   MA
   new: Rahmen im Readonly  editierbar

      Rev 1.83   21 Nov 1996 16:48:52   AMA
   Fix #33452#: Das GCAttr-Flag wandert von der WriterShell in die CrsrShell

      Rev 1.82   30 Oct 1996 10:14:50   JP
   Bug #32859#: PushCrsr - Rahmenselektin aufheben; PopCrsr: Rahmenselektion wieder erzeugen

      Rev 1.81   01 Oct 1996 16:55:32   OM
   Hyperlinks editieren

      Rev 1.80   24 Sep 1996 12:33:38   MA
   chg: Travelling fuer ReadOnly

      Rev 1.79   29 Aug 1996 09:26:02   OS
   includes

      Rev 1.78   16 Aug 1996 10:26:08   OS
   richtiges Verhalten bei SelAll

      Rev 1.77   08 Aug 1996 15:51:50   JP
   neu: SelectTextAttr - vom Attribut umspannten Bereich Selectieren

      Rev 1.76   15 Jul 1996 16:31:54   OM
   Bei Selektionsaenderung Slot invalidieren

      Rev 1.75   10 May 1996 15:55:22   OS
   GotoBookmark markiert jetzt immer bug #27690#

      Rev 1.74   08 May 1996 12:58:44   OS
   neu: GotoBookmark mit Select- und Start Flag

      Rev 1.73   09 Jan 1996 09:46:58   JP
   GoStart: an Dok-Anfang springen, wenn die 1. Box leer ist!

      Rev 1.72   22 Dec 1995 20:17:38   JP
   Bug 22611: Rahmenselecktion wird verlassen/wiederhergestellt - dadurch die richtigen Shells!

      Rev 1.71   24 Nov 1995 16:59:08   OM
   PCH->PRECOMPILED

      Rev 1.70   23 Nov 1995 19:50:54   OS
   +Fwd/BwdPara

      Rev 1.69   30 Oct 1995 18:43:08   OS
   Select-Param im EndPg auch auswerten

*************************************************************************/


diff --git a/sw/source/ui/wrtsh/select.cxx b/sw/source/ui/wrtsh/select.cxx
new file mode 100644
index 0000000..7630687
--- /dev/null
+++ b/sw/source/ui/wrtsh/select.cxx
@@ -0,0 +1,1010 @@
/*************************************************************************
 *
 *  $RCSfile: select.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:53 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include <limits.h>

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _SFX_BINDINGS_HXX //autogen
#include <sfx2/bindings.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SFXMACITEM_HXX //autogen
#include <svtools/macitem.hxx>
#endif
#ifndef _WORDSEL_HXX
#include <svtools/wordsel.hxx>
#endif
#ifndef _SFXVIEWFRM_HXX
#include <sfx2/viewfrm.hxx>
#endif


#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _BASESH_HXX
#include <basesh.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _FRMATR_HXX
#include <frmatr.hxx>
#endif
#ifndef _INITUI_HXX
#include <initui.hxx>
#endif
#ifndef _MDIEXP_HXX
#include <mdiexp.hxx>
#endif
#ifndef _FMTCOL_HXX
#include <fmtcol.hxx>
#endif
#ifndef _FRMFMT_HXX
#include <frmfmt.hxx>
#endif
#ifndef _SWUNDO_HXX
#include <swundo.hxx>                   // fuer Undo-Ids
#endif
#ifndef _SWEVENT_HXX
#include <swevent.hxx>
#endif

#ifdef DEBUG
#ifndef _PAM_HXX
#include <pam.hxx>
#endif
#endif

static long nStartDragX = 0, nStartDragY = 0;
static BOOL  bStartDrag = FALSE;

BOOL SwWrtShell::SelNearestWrd()
{
    MV_KONTEXT(this);
    if( !IsInWrd() && !IsEndWrd() && !IsSttWrd() )
        PrvWrd();
    if( IsEndWrd() )
        Left();
    return SelWrd();
}



BOOL SwWrtShell::SelWrd(const Point *pPt, BOOL )
{
    BOOL bRet;
    {
        MV_KONTEXT(this);
        SttSelect();
        bRet = SwCrsrShell::SelectWord( pPt );
    }
    EndSelect();
    if( bRet )
    {
        bSelWrd = TRUE;
        if(pPt)
            aStart = *pPt;
    }
    return bRet;
}

/*
BOOL SwWrtShell::SelSentence(const Point *pPt, BOOL )
{
    {
        MV_KONTEXT(this);
        ClearMark();
        if(!_BwdSentence()) {
            return FALSE;
        }
        SttSelect();
        if(!_FwdSentence()) {
            EndSelect();
            return FALSE;
        }
    }
    EndSelect();
    return TRUE;
}

*/



void SwWrtShell::SelLine(const Point *pPt, BOOL )
{
    {
        MV_KONTEXT(this);
        ClearMark();
        SwCrsrShell::LeftMargin();
        SttSelect();
        SwCrsrShell::RightMargin();
    }
    EndSelect();
    if(pPt)
        aStart = *pPt;
    bSelLn = TRUE;
    bSelWrd = FALSE;    // SelWord abschalten, sonst geht kein SelLine weiter
}



long SwWrtShell::SelAll()
{
    {
        MV_KONTEXT(this);
        BOOL bMoveTable = FALSE;
        if( !HasWholeTabSelection() )
        {
            if ( IsSelection() && IsCrsrPtAtEnd() )
                SwapPam();
            Push();
            BOOL bIsFullSel = !MoveSection( fnSectionCurr, fnSectionStart);
            SwapPam();
            bIsFullSel &= !MoveSection( fnSectionCurr, fnSectionEnd);
            Pop(FALSE);
            GoStart(TRUE, &bMoveTable, FALSE, !bIsFullSel);
        }
        else
        {
            EnterStdMode();
            SwCrsrShell::SttDoc();
        }
        SttSelect();
        GoEnd(TRUE, &bMoveTable);
    }
    EndSelect();
    return 1;
}

/*------------------------------------------------------------------------
 Beschreibung:  Textsuche
------------------------------------------------------------------------*/


ULONG SwWrtShell::SearchPattern( const SearchParam& rParam,
                                SwDocPositions eStt, SwDocPositions eEnd,
                                FindRanges eFlags, int bReplace )
{
        // keine Erweiterung bestehender Selektionen
    if(!(eFlags & FND_IN_SEL))
        ClearMark();
    return Find( rParam, eStt, eEnd, eFlags, bReplace );
}
/*------------------------------------------------------------------------
 Beschreibung:  Suche nach Vorlagen
------------------------------------------------------------------------*/



ULONG SwWrtShell::SearchTempl( const String &rTempl,
                               SwDocPositions eStt, SwDocPositions eEnd,
                               FindRanges eFlags, const String* pReplTempl )
{
        // keine Erweiterung bestehender Selektionen
    if(!(eFlags & FND_IN_SEL))
        ClearMark();
    SwTxtFmtColl *pColl = GetParaStyle(rTempl, SwWrtShell::GETSTYLE_CREATESOME);
    SwTxtFmtColl *pReplaceColl = 0;
    if( pReplTempl )
        pReplaceColl = GetParaStyle(*pReplTempl, SwWrtShell::GETSTYLE_CREATESOME );

    return Find(pColl? *pColl: GetDfltTxtFmtColl(),
                               eStt,eEnd,eFlags, pReplaceColl);
}

// Suche nach Attributen ----------------------------------------------------



ULONG SwWrtShell::SearchAttr( const SfxItemSet& rFindSet, BOOL bNoColls,
                                SwDocPositions eStart, SwDocPositions eEnde,
                                FindRanges eFlags, const SearchParam* pParam,
                                const SfxItemSet* pReplaceSet )
{
    // Keine Erweiterung bestehender Selektionen
    if (!(eFlags & FND_IN_SEL))
        ClearMark();

    // Suchen
    return Find( rFindSet, bNoColls, eStart, eEnde, eFlags, pParam, pReplaceSet);
}

// ---------- Selektionsmodi ----------



void SwWrtShell::PushMode()
{
    pModeStack = new ModeStack( pModeStack, bIns, bExtMode, bAddMode );
}



void SwWrtShell::PopMode()
{
    if ( 0 == pModeStack )
        return;

    if ( bExtMode && !pModeStack->bExt )
        LeaveExtMode();
    if ( bAddMode && !pModeStack->bAdd )
        LeaveAddMode();
    bIns = pModeStack->bIns;

    ModeStack *pTmp = pModeStack->pNext;
    delete pModeStack;
    pModeStack = pTmp;
}

/*
 * Zwei Methoden fuer das Cursorsetzen; die erste mappt auf die
 * gleichnamige Methoden an der CursorShell, die zweite hebt
 * zuerst alle Selektionen auf.
 */



long SwWrtShell::SetCrsr(const Point *pPt, BOOL bTextOnly)
{
        /*
        * eine gfs.  bestehende Selektion an der Position des
        * Mausklicks aufheben
        */
    if(!IsInSelect() && ChgCurrPam(*pPt)) {
        ClearMark();
    }
    return SwCrsrShell::SetCrsr(*pPt, bTextOnly);
}


long SwWrtShell::SetCrsrKillSel(const Point *pPt, BOOL bTextOnly )
{
    ACT_KONTEXT(this);
    ResetSelect(pPt,FALSE);
    return SwCrsrShell::SetCrsr(*pPt, bTextOnly);
}



void SwWrtShell::UnSelectFrm()
{
        // Rahmenselektion aufheben mit garantiert ungueltiger Position
    Point aPt(LONG_MIN, LONG_MIN);
    SelectObj(aPt);
}

/*
 * Aufheben aller Selektionen
 */



long SwWrtShell::ResetSelect(const Point *,BOOL)
{
    if(IsSelFrmMode())
    {
        UnSelectFrm();
        LeaveSelFrmMode();
    }
    else
    {
        /*  ACT_KONTEXT() macht eine Action auf -
            um im Basicablauf keine Probleme mit der
            Shellumschaltung zu bekommen, darf
            GetChgLnk().Call() erst nach
            EndAction() gerufen werden.
        */
        {
            ACT_KONTEXT(this);
            bSelWrd = bSelLn = FALSE;
            KillPams();
            ClearMark();
            fnKillSel = &SwWrtShell::Ignore;
            fnSetCrsr = &SwWrtShell::SetCrsr;
        }
        /*
            * nach dem Aufheben aller Selektionen koennte ein Update der
            * Attr-Controls notwendig sein.
        */
        GetChgLnk().Call(this);
    }
    return 1;
}



/*
 * tue nichts
 */
long SwWrtShell::Ignore(const Point *, BOOL ) {
    return 1;
}

/*
 * Start eines Selektionsvorganges.
 */



void SwWrtShell::SttSelect()
{
    if(bInSelect)
        return;
    if(!HasMark())
        SetMark();
    fnKillSel = &SwWrtShell::Ignore;
    fnSetCrsr = &SwWrtShell::SetCrsr;
    bInSelect = TRUE;
}
/*
 * Ende eines Selektionsvorganges.
 */



void SwWrtShell::EndSelect()
{
    if(!bInSelect || bExtMode)
        return;
    bInSelect = FALSE;
    (this->*fnLeaveSelect)(0,FALSE);
    if(!bAddMode) {
        fnSetCrsr = &SwWrtShell::SetCrsrKillSel;
        fnKillSel = &SwWrtShell::ResetSelect;
    }
}
/* Methode, um eine bestehende wortweise oder zeilenweise Selektion
 * zu erweitern.
 */

inline BOOL operator<(const Point &rP1,const Point &rP2)
{
    return rP1.Y() < rP2.Y() || (rP1.Y() == rP2.Y() && rP1.X() < rP2.X());
}



long SwWrtShell::ExtSelWrd(const Point *pPt, BOOL )
{
    MV_KONTEXT(this);
    if( IsTableMode() )
        return 1;

    // Bug 66823: actual crsr has in additional mode no selection?
    // Then destroy the actual an go to prev, this will be expand
    if( !HasMark() && GoPrevCrsr() )
    {
        BOOL bHasMark = HasMark(); // thats wrong!
        GoNextCrsr();
        if( bHasMark )
        {
            DestroyCrsr();
            GoPrevCrsr();
        }
    }

    // check the direction of the selection with the new point
    BOOL bRet = FALSE, bMoveCrsr = TRUE, bToTop;
    SwCrsrShell::SelectWord( &aStart );     // select the startword
    SwCrsrShell::Push();                    // save the cursor
    SwCrsrShell::SetCrsr( *pPt );           // and check the direction

    switch( SwCrsrShell::CompareCursor( StackMkCurrPt ))
    {
    case -1:    bToTop = FALSE;     break;
    case 1:     bToTop = TRUE;      break;
    default:    bMoveCrsr = FALSE;  break;
    }

    SwCrsrShell::Pop( FALSE );              // retore the saved cursor

    if( bMoveCrsr )
    {
        // select to Top but cursor select to Bottom? or
        // select to Bottom but cursor select to Top?       --> swap the cursor
        if( bToTop )
            SwapPam();

        SwCrsrShell::Push();                // save cur cursor
        if( SwCrsrShell::SelectWord( pPt )) // select the current word
        {
            if( bToTop )
                SwapPam();
            Combine();
            bRet = TRUE;
        }
        else
        {
            SwCrsrShell::Pop( FALSE );
            if( bToTop )
                SwapPam();
        }
    }
    else
        bRet = TRUE;
    return bRet;
}


long SwWrtShell::ExtSelLn(const Point *pPt, BOOL )
{
    MV_KONTEXT(this);
    SwCrsrShell::SetCrsr(*pPt);
    if( IsTableMode() )
        return 1;

    // Bug 66823: actual crsr has in additional mode no selection?
    // Then destroy the actual an go to prev, this will be expand
    if( !HasMark() && GoPrevCrsr() )
    {
        BOOL bHasMark = HasMark(); // thats wrong!
        GoNextCrsr();
        if( bHasMark )
        {
            DestroyCrsr();
            GoPrevCrsr();
        }
    }

    // ggfs. den Mark der Selektion anpassen
    BOOL bToTop = !IsCrsrPtAtEnd();
    SwapPam();

    // der "Mark" muss am Zeilenende/-anfang stehen
    if( bToTop ? !IsAtRightMargin() : !IsAtLeftMargin() )
    {
        if( bToTop )
        {
            if( !IsEndPara() )
                SwCrsrShell::Right();
            SwCrsrShell::RightMargin();
        }
        else
            SwCrsrShell::LeftMargin();
    }
    SwapPam();

    return bToTop ? SwCrsrShell::LeftMargin() : SwCrsrShell::RightMargin();
}


/*
 * zurueck in den Standard Mode: kein Mode, keine Selektionen.
 */

void SwWrtShell::EnterStdMode()
{
    if(bAddMode)
        LeaveAddMode();
    bExtMode = FALSE;
    bInSelect = FALSE;
    ResetSelect(0,FALSE);
}

/*
 * Extended Mode
 */



void SwWrtShell::EnterExtMode()
{
    bExtMode = TRUE;
    bAddMode = FALSE;
    SttSelect();
}



void SwWrtShell::LeaveExtMode()
{
    bExtMode = FALSE;
    EndSelect();
}
/*
 * Ende einer Selektion; falls die Selektion leer ist,
 * ClearMark().
 */



long SwWrtShell::SttLeaveSelect(const Point *, BOOL )
{
    if(SwCrsrShell::HasSelection() && !IsSelTblCells() && bClearMark) {
        return 0;
    }
//  if( IsSelTblCells() ) aSelTblLink.Call(this);
    ClearMark();
    return 1;
}
/*
 * Verlassen des Selektionsmodus in Additional Mode
 */



long SwWrtShell::AddLeaveSelect(const Point *, BOOL )
{
    if(IsTableMode()) LeaveAddMode();
    else if(SwCrsrShell::HasSelection())
        CreateCrsr();
    return 1;
}
/*
 * Additional Mode
 */



void SwWrtShell::EnterAddMode()
{
    if(IsTableMode()) return;
    fnLeaveSelect = &SwWrtShell::AddLeaveSelect;
    fnKillSel = &SwWrtShell::Ignore;
    fnSetCrsr = &SwWrtShell::SetCrsr;
    bAddMode = TRUE;
    bExtMode = FALSE;
    if(SwCrsrShell::HasSelection())
        CreateCrsr();
}



void SwWrtShell::LeaveAddMode()
{
    fnLeaveSelect = &SwWrtShell::SttLeaveSelect;
    fnKillSel = &SwWrtShell::ResetSelect;
    fnSetCrsr = &SwWrtShell::SetCrsrKillSel;
    bAddMode = FALSE;
}

// Einfuegemodus



void SwWrtShell::SetInsMode( BOOL bOn )
{
    bIns = bOn;
    const SfxBoolItem aTmp( SID_ATTR_INSERT, bIns );
    GetView().GetViewFrame()->GetBindings().SetState( aTmp );
}

/*
 * Rahmen bearbeiten
 */


long SwWrtShell::BeginFrmDrag(const Point *pPt, BOOL)
{
    fnDrag = &SwFEShell::Drag;
    if(bStartDrag)
    {
        Point aTmp( nStartDragX, nStartDragY );
        SwFEShell::BeginDrag( &aTmp, FALSE );
    }
    else
        SwFEShell::BeginDrag( pPt, FALSE );
    return 1;
}



void SwWrtShell::EnterSelFrmMode(const Point *pPos)
{
    if(pPos)
    {
        nStartDragX = pPos->X();
        nStartDragY = pPos->Y();
        bStartDrag = TRUE;
    }
    bNoEdit = bLayoutMode = TRUE;
    HideCrsr();

        // gleicher Aufruf von BeginDrag an der SwFEShell
    fnDrag          = &SwWrtShell::BeginFrmDrag;
    fnEndDrag       = &SwWrtShell::UpdateLayoutFrm;
    SwBaseShell::SetFrmMode( FLY_DRAG_START, this );
}



void SwWrtShell::LeaveSelFrmMode()
{
    fnDrag          = &SwWrtShell::BeginDrag;
    fnEndDrag       = &SwWrtShell::EndDrag;
    bLayoutMode = FALSE;
    bStartDrag = FALSE;
    Edit();
    SwBaseShell::SetFrmMode( FLY_DRAG_END, this );
}
/*------------------------------------------------------------------------
 Beschreibung:  Rahmengebundenes Macro ausfuehren
------------------------------------------------------------------------*/



IMPL_LINK( SwWrtShell, ExecFlyMac, void *, pFlyFmt )
{
    const SwFrmFmt *pFmt = pFlyFmt ? (SwFrmFmt*)pFlyFmt : GetFlyFrmFmt();
    ASSERT(pFmt, kein FrameFormat.);
    const SvxMacroItem &rFmtMac = pFmt->GetMacro();

    if(rFmtMac.HasMacro(SW_EVENT_OBJECT_SELECT))
    {
        const SvxMacro &rMac = rFmtMac.GetMacro(SW_EVENT_OBJECT_SELECT);
        if( IsFrmSelected() )
            bLayoutMode = TRUE;
        CallChgLnk();
        ExecMacro( rMac );
    }
    return 0;
}



long SwWrtShell::UpdateLayoutFrm(const Point *pPt, BOOL )
{
        // voerst Dummy
    SwFEShell::EndDrag( pPt, FALSE );
    fnDrag = &SwWrtShell::BeginFrmDrag;
    return 1;
}

/*
 * Handler fuer das Togglen der Modi. Liefern alten Mode zurueck.
 */



long SwWrtShell::ToggleAddMode()
{
    bAddMode ? LeaveAddMode(): EnterAddMode();
    return !bAddMode;
}



long SwWrtShell::ToggleExtMode()
{
    bExtMode ? LeaveExtMode() : EnterExtMode();
    return !bExtMode;
}
/*
 * Draggen im Standard Modus (Selektieren von Inhalt)
 */



long SwWrtShell::BeginDrag(const Point *pPt, BOOL )
{
    if(bSelWrd)
    {
        bInSelect = TRUE;
        if( !IsCrsrPtAtEnd() )
            SwapPam();

        fnDrag = &SwWrtShell::ExtSelWrd;
        fnSetCrsr = &SwWrtShell::Ignore;
    }
    else if(bSelLn)
    {
        bInSelect = TRUE;
        fnDrag = &SwWrtShell::ExtSelLn;
        fnSetCrsr = &SwWrtShell::Ignore;
    }
    else
    {
        fnDrag = &SwWrtShell::Drag;
        SttSelect();
    }

    return 1;
}



long SwWrtShell::Drag(const Point *, BOOL )
{
    if( IsSelTblCells() )
        aSelTblLink.Call(this);

    return 1;
}



long SwWrtShell::EndDrag(const Point *pPt, BOOL )
{
    fnDrag = &SwWrtShell::BeginDrag;
    if( IsExtSel() )
        LeaveExtSel();

    if( IsSelTblCells() )
        aSelTblLink.Call(this);
    EndSelect();
    return 1;
}
/*------------------------------------------------------------------------
 Beschreibung:  Selektion einer Tabellenzeile / Spalte
------------------------------------------------------------------------*/



FASTBOOL SwWrtShell::SelectTableRow()
{
    if ( SelTblRow() )
    {
        fnSetCrsr = &SwWrtShell::SetCrsrKillSel;
        fnKillSel = &SwWrtShell::ResetSelect;
        return TRUE;
    }
    return FALSE;
}



FASTBOOL SwWrtShell::SelectTableCol()
{
    if ( SelTblCol() )
    {
        fnSetCrsr = &SwWrtShell::SetCrsrKillSel;
        fnKillSel = &SwWrtShell::ResetSelect;
        return TRUE;
    }
    return FALSE;
}

/*------------------------------------------------------------------------
 Beschreibung:    Prueft, ob eine Wortselektion vorliegt.
                  Gemaess den Regeln fuer intelligentes Cut / Paste
                  werden umgebende Spaces rausgeschnitten.
 Return:          Liefert Art der Wortselektion zurueck.
------------------------------------------------------------------------*/



int SwWrtShell::IntelligentCut(int nSelection, BOOL bCut)
{
        // kein intelligentes Drag and Drop bei Mehrfachselektion
        // es existieren mehrere Cursor, da ein zweiter bereits
        // an die Zielposition gesetzt wurde
    if( IsAddMode() || !(nSelection & SEL_TXT) )
        return FALSE;

    const sal_Unicode cFirst = GetChar(FALSE);
    const sal_Unicode cLast = GetChar(TRUE, -1);
        // wenn das erste und das letzte Zeichen kein Wortzeichen ist,
        // ist kein Wort selektiert.
    if( !WordSelection::IsNormalChar( cFirst ) ||
        !WordSelection::IsNormalChar( cLast ) )
        return NO_WORD;
    const sal_Unicode cPrev = GetChar(FALSE, -1);
    const sal_Unicode cNext = GetChar(TRUE);

    int cWord = NO_WORD;
        // ist ein Wort selektiert?
    if(!cWord && cPrev && cNext &&
        CH_TXTATR_BREAKWORD != cPrev && CH_TXTATR_INWORD != cPrev &&
        CH_TXTATR_BREAKWORD != cNext && CH_TXTATR_INWORD != cNext &&
       !WordSelection::IsNormalChar(cPrev) && !WordSelection::IsNormalChar(cNext))
       cWord = WORD_NO_SPACE;
    if(cWord == WORD_NO_SPACE && cPrev == ' ')
    {
        cWord = WORD_SPACE_BEFORE;
            // Space davor loeschen
        if(bCut)
        {
            Push();
            if(IsCrsrPtAtEnd())
                SwapPam();
            ClearMark();
            SetMark();
            SwCrsrShell::Left();
            SwFEShell::Delete();
            Pop( FALSE );
        }
    }
    else if(cWord == WORD_NO_SPACE && cNext == ' ')
    {
        cWord = WORD_SPACE_AFTER;
            // Space dahinter loeschen
        if(bCut) {
            Push();
            if(!IsCrsrPtAtEnd()) SwapPam();
            ClearMark();
            SetMark();
            SwCrsrShell::Right();
            SwFEShell::Delete();
            Pop( FALSE );
        }
    }
    return cWord;
}
/* fuer den Erhalt der Selektion wird nach SetMark() der Cursor
 * nach links bewegt, damit er durch das Einfuegen von Text nicht
 * verschoben wird.  Da auf der CORE-Seite am aktuellen Cursor
 * eine bestehende Selektion aufgehoben wird, wird der Cursor auf
 * den Stack gepushed. Nach dem Verschieben werden sie wieder
 * zusammengefasst. */



#if 0
long SwWrtShell::MoveText(const Point *pPt,BOOL)
{
        // ueber einer bestehenden Selektion kein D&D
    if(ChgCurrPam(*pPt)) {
        LeaveDDMode();
        bTStart = bDD = FALSE;
        return 0;
    }
        // Create-Crsr muss nicht immer sein !!
        // im Add-Mode benutze den letzen, sonst erzeuge einen neuen
    if(!IsAddMode()) SwCrsrShell::CreateCrsr();
    SwCrsrShell::SetCrsr(*pPt);
        // kein D&D auf andere Inhaltsformen als Text
    const int nSelection = GetSelectionType();
    if(SEL_TXT != GetCntType()) {
        if(!IsAddMode()) {
            SwCrsrShell::DestroyCrsr();
            GoPrevCrsr();
        }
        LeaveDDMode();
        bTStart = bDD = FALSE;
        return 0;
    }
        // SSelection vor Start/ EndAction erfragen
    StartUndo(UNDO_INSERT);
    StartAllAction();
    GoPrevCrsr();
    const int cWord = IntelligentCut(nSelection);
    GoNextCrsr();
    const BOOL bInWrd = IsInWrd() || IsEndWrd();
    const BOOL bSttWrd = IsSttWrd();
    SwEditShell::Move();

    // nach dem Move sind alle Crsr geloescht und eine SSelection
    // umschliesst den verschobenen Bereich

    if(bInWrd && ( cWord == WORD_SPACE_AFTER || cWord == WORD_SPACE_BEFORE)) {
        if(!bSttWrd) SwapPam();
        SwEditShell::Insert(' ');
        if(!bSttWrd) SwapPam();
    }
    LeaveDDMode();
    bTStart = bDD = FALSE;
    EndAllAction();
    EndUndo(UNDO_INSERT);
    return 1;
}
#endif

/*************************************************************************

          Source Code Control System - Header

          $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/sw/source/ui/wrtsh/select.cxx,v 1.1.1.1 2000-09-18 17:14:53 hr Exp $

          Source Code Control System - Update

          $Log: not supported by cvs2svn $
          Revision 1.173  2000/09/18 16:06:26  willem.vandorp
          OpenOffice header added.

          Revision 1.172  2000/09/07 15:59:36  os
          change: SFX_DISPATCHER/SFX_BINDINGS removed

          Revision 1.171  2000/07/20 13:17:22  jp
          change old txtatr-character to the two new characters

          Revision 1.170  2000/07/03 17:45:46  jp
          ExtSelWrd - use SelWord

          Revision 1.169  2000/06/30 16:31:43  jp
          new: SelectWord - use the new UNO Api to select one Word

          Revision 1.168  2000/05/19 12:58:31  jp
          use WordSelection class for check chars

          Revision 1.167  2000/05/19 11:00:20  jp
          Changes for Unicode

          Revision 1.166  2000/03/14 13:37:25  jp
          remove unused code

          Revision 1.165  1999/06/11 08:28:04  JP
          Bug #66823#: ExtSelWord/ExtSelLn - destroy current not expanded cursor


      Rev 1.164   11 Jun 1999 10:28:04   JP
   Bug #66823#: ExtSelWord/ExtSelLn - destroy current not expanded cursor

      Rev 1.163   27 Apr 1999 15:29:18   JP
   ExtSelWrd/-Ln: im TableMode nur den Cursor setzen

      Rev 1.162   23 Mar 1999 14:13:22   JP
   Bug #63817#: ExtSelWord/Line - Anfangsselektion beibehalten

      Rev 1.161   25 Nov 1998 16:25:56   OS
   #59467# EnterStdMode: Funktionspointer zuruecksetzen

      Rev 1.160   24 Feb 1998 15:28:14   JP
   Search..: SWPOSDOC entfernt, auf enums umgestellt
*************************************************************************/



diff --git a/sw/source/ui/wrtsh/wrtsh.hrc b/sw/source/ui/wrtsh/wrtsh.hrc
new file mode 100644
index 0000000..7c841b4
--- /dev/null
+++ b/sw/source/ui/wrtsh/wrtsh.hrc
@@ -0,0 +1,206 @@
/*************************************************************************
 *
 *  $RCSfile: wrtsh.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:53 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef _WRTSH_HRC
#define _WRTSH_HRC

#include "rcid.hrc"

#define DLG_GOTO                (RC_WRTSH_BEGIN +  1)


#define STR_DDEERROR_APP1       (RC_WRTSH_BEGIN +  2)
#define STR_DDEERROR_APP2       (RC_WRTSH_BEGIN +  3)
#define STR_DDEERROR_DATA1      (RC_WRTSH_BEGIN +  4)
#define STR_DDEERROR_DATA2      (RC_WRTSH_BEGIN +  5)
#define STR_DDEERROR_LINK1      (RC_WRTSH_BEGIN +  6)
#define STR_DDEERROR_LINK2      (RC_WRTSH_BEGIN +  7)


// Undo
#define UNDO_BASE               (RC_WRTSH_BEGIN +  8)
#define STR_CANT_UNDO           (UNDO_BASE      +  0)

// im enun folgen hier START & END fuer die Klammerungen,

// Id's fuer die Undo/Redo/Repeat faehigen "Funktionen"
#define STR_DELETE_UNDO         (UNDO_BASE      + 3)
#define STR_INSERT_UNDO         (UNDO_BASE      + 4)
#define STR_OVR_UNDO            (UNDO_BASE      + 5)
#define STR_SPLITNODE_UNDO      (UNDO_BASE      + 6)
#define STR_INSATTR_UNDO        (UNDO_BASE      + 7)
#define STR_SETFMTCOLL_UNDO     (UNDO_BASE      + 8)
#define STR_RESET_ATTR_UNDO     (UNDO_BASE      + 9)
#define STR_APPLY_ATTR_UNDO     (UNDO_BASE      +10)
#define STR_INSERT_DOC_UNDO     (UNDO_BASE      +11)
#define STR_COPY_UNDO           (UNDO_BASE      +12)
#define STR_INSTABLE_UNDO       (UNDO_BASE      +13)
#define STR_TABLETOTEXT_UNDO    (UNDO_BASE      +14)
#define STR_TEXTTOTABLE_UNDO    (UNDO_BASE      +15)
#define STR_SORT_TXT            (UNDO_BASE      +16)
#define STR_INSERTFLY           (UNDO_BASE      +17)
#define STR_TABLEHEADLINE       (UNDO_BASE      +18)
#define STR_INSERTSECTION       (UNDO_BASE      +19)
#define STR_OUTLINE_LR          (UNDO_BASE      +20)
#define STR_OUTLINE_UD          (UNDO_BASE      +21)
#define STR_INSNUM              (UNDO_BASE      +22)
#define STR_NUMUPDOWN           (UNDO_BASE      +23)
#define STR_MOVENUM             (UNDO_BASE      +24)
#define STR_INSERTDRAW          (UNDO_BASE      +25)
#define STR_NUMORNONUM          (UNDO_BASE      +26)
#define STR_INC_LEFTMARGIN      (UNDO_BASE      +27)
#define STR_DEC_LEFTMARGIN      (UNDO_BASE      +28)
#define STR_INSERTLABEL         (UNDO_BASE      +29)
#define STR_SETNUMRULESTART     (UNDO_BASE      +30)
#define STR_CHANGEFTN           (UNDO_BASE      +31)
#define STR_REDLINE             (UNDO_BASE      +32)
#define STR_ACCEPT_REDLINE      (UNDO_BASE      +33)
#define STR_REJECT_REDLINE      (UNDO_BASE      +34)
#define STR_SPLIT_TABLE         (UNDO_BASE      +35)
#define STR_DONTEXPAND          (UNDO_BASE      +36)
#define STR_AUTOCORRECT         (UNDO_BASE      +37)
#define STR_MERGE_TABLE         (UNDO_BASE      +38)

#define STR_REPEAT_DUMMY_3      (UNDO_BASE      +39)
#define STR_REPEAT_DUMMY_4      (UNDO_BASE      +40)
#define STR_REPEAT_DUMMY_5      (UNDO_BASE      +41)
#define STR_REPEAT_DUMMY_6      (UNDO_BASE      +42)
#define STR_REPEAT_DUMMY_7      (UNDO_BASE      +43)
#define STR_REPEAT_DUMMY_8      (UNDO_BASE      +44)
#define STR_REPEAT_DUMMY_9      (UNDO_BASE      +45)
// !!!!!! umsetzen !!!!!!!!!!! umsetzen !!!!!!!!!!! umsetzen !!!!
#define CORE_REPEAT_END          STR_REPEAT_DUMMY_9// !!!! umsetzen !!!


// Id's nur fuer die Undo/Redo faehigen "Funktionen"
#define STR_MOVE_UNDO           (CORE_REPEAT_END      + 1)
#define STR_INSERT_GLOSSARY     (CORE_REPEAT_END      + 2)
#define STR_DELBOOKMARK         (CORE_REPEAT_END      + 3)
#define STR_INSBOOKMARK         (CORE_REPEAT_END      + 4)
#define STR_SORT_TBL            (CORE_REPEAT_END      + 5)
#define STR_DELETEFLY           (CORE_REPEAT_END      + 6)
#define STR_AUTOFORMAT          (CORE_REPEAT_END      + 7)
#define STR_REPLACE             (CORE_REPEAT_END      + 8)
#define STR_DELETESECTION       (CORE_REPEAT_END      + 9)
#define STR_CHANGESECTION       (CORE_REPEAT_END      +10)
#define STR_CHANGESECTPASSWD    (CORE_REPEAT_END      +11)
#define STR_CHANGEDEFATTR       (CORE_REPEAT_END      +12)
#define STR_DELNUM              (CORE_REPEAT_END      +13)
#define STR_DRAWUNDO            (CORE_REPEAT_END      +14)
#define STR_DRAWGROUP           (CORE_REPEAT_END      +15)
#define STR_DRAWUNGROUP         (CORE_REPEAT_END      +16)
#define STR_DRAWDELETE          (CORE_REPEAT_END      +17)
#define STR_REREAD              (CORE_REPEAT_END      +18)
#define STR_DELGRF              (CORE_REPEAT_END      +19)
#define STR_DELOLE              (CORE_REPEAT_END      +20)
#define STR_TABLE_ATTR          (CORE_REPEAT_END      +21)
#define STR_TABLE_AUTOFMT       (CORE_REPEAT_END      +22)
#define STR_TABLE_INSCOL        (CORE_REPEAT_END      +23)
#define STR_TABLE_INSROW        (CORE_REPEAT_END      +24)
#define STR_TABLE_DELBOX        (CORE_REPEAT_END      +25)
#define STR_TABLE_SPLIT         (CORE_REPEAT_END      +26)
#define STR_TABLE_MERGE         (CORE_REPEAT_END      +27)
#define STR_TABLE_NUMFORMAT     (CORE_REPEAT_END      +28)
#define STR_INSERT_TOX          (CORE_REPEAT_END      +29)
#define STR_CLEAR_TOX_RANGE     (CORE_REPEAT_END      +30)
#define STR_TABLE_TBLCPYTBL     (CORE_REPEAT_END      +31)
#define STR_TABLE_CPYTBL        (CORE_REPEAT_END      +32)
#define STR_INS_FROM_SHADOWCRSR (CORE_REPEAT_END      +33)
#define STR_UNDO_CHAIN          (CORE_REPEAT_END      +34)
#define STR_UNDO_UNCHAIN        (CORE_REPEAT_END      +35)
#define STR_UNDO_FTNINFO        (CORE_REPEAT_END      +36)
#define STR_UNDO_ENDNOTEINFO    (CORE_REPEAT_END      +37)
#define STR_UNDO_COMPAREDOC     (CORE_REPEAT_END      +38)
#define STR_UNDO_SETFLYFRMFMT   (CORE_REPEAT_END      +39)

#define STR_UNDO_DUMMY_1        (CORE_REPEAT_END      +40)
#define STR_UNDO_DUMMY_2        (CORE_REPEAT_END      +41)
#define STR_UNDO_DUMMY_3        (CORE_REPEAT_END      +42)
#define STR_UNDO_DUMMY_4        (CORE_REPEAT_END      +43)
#define STR_UNDO_DUMMY_5        (CORE_REPEAT_END      +44)
#define STR_UNDO_DUMMY_6        (CORE_REPEAT_END      +45)
#define STR_UNDO_DUMMY_7        (CORE_REPEAT_END      +46)
#define STR_UNDO_DUMMY_8        (CORE_REPEAT_END      +47)
#define STR_UNDO_DUMMY_9        (CORE_REPEAT_END      +48)
// !!!!!! umsetzen !!!!!!!!!!! umsetzen !!!!!!!!!!! umsetzen !!!!
#define CORE_UNDO_END           STR_UNDO_DUMMY_9// !!!! umsetzen !!!

// UI-Undo Klammerungen
#define UI_UNDO_BEGIN                   (CORE_UNDO_END + 1)
#define STR_REPLACE_UNDO                (UI_UNDO_BEGIN)
#define STR_INSERT_PAGE_BREAK_UNDO      (UI_UNDO_BEGIN + 1)
#define STR_INSERT_COLUMN_BREAK_UNDO    (UI_UNDO_BEGIN + 2)
#define STR_PLAY_MACRO_UNDO             (UI_UNDO_BEGIN + 3)
#define STR_INSERT_ENV_UNDO             (UI_UNDO_BEGIN + 4)
#define STR_DRAG_AND_COPY               (UI_UNDO_BEGIN + 5)
#define STR_DRAG_AND_MOVE               (UI_UNDO_BEGIN + 6)
#define STR_INSERT_RULER                (UI_UNDO_BEGIN + 7)
#define STR_INSERT_CHART                (UI_UNDO_BEGIN + 8)
#define STR_INSERT_FOOTNOTE             (UI_UNDO_BEGIN + 9)
#define STR_INSERT_URLBTN               (UI_UNDO_BEGIN + 10)
#define STR_INSERT_URLTXT               (UI_UNDO_BEGIN + 11)
#define STR_DELETE_INVISIBLECNTNT       (UI_UNDO_BEGIN + 12)
#define UNDO_ACT_END            STR_DELETE_INVISIBLECNTNT

#if WRTSH_ACT_END > RC_WRTSH_END
#error Resource-Id Ueberlauf
#endif

#endif
diff --git a/sw/source/ui/wrtsh/wrtsh.src b/sw/source/ui/wrtsh/wrtsh.src
new file mode 100644
index 0000000..b86cb66f
--- /dev/null
+++ b/sw/source/ui/wrtsh/wrtsh.src
@@ -0,0 +1,2601 @@
/*************************************************************************
 *
 *  $RCSfile: wrtsh.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:53 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#include "wrtsh.hrc"

 // Undo
String STR_CANT_UNDO
{
    TEXT = "unmöglich" ;
    TEXT [ English ] = "not possible" ;
    TEXT [ norwegian ] = "ikke mulig" ;
    TEXT [ italian ] = "Impossibile" ;
    TEXT [ portuguese_brazilian ] = "não possível" ;
    TEXT [ portuguese ] = "Impossível" ;
    TEXT [ finnish ] = "ei mahdollinen" ;
    TEXT [ danish ] = "ikke mulig" ;
    TEXT [ french ] = "impossible" ;
    TEXT [ swedish ] = "inte möjlig" ;
    TEXT [ dutch ] = "Onmogelijk" ;
    TEXT [ spanish ] = "imposible" ;
    TEXT [ english_us ] = "not possible" ;
    TEXT[ chinese_simplified ] = "²»¿ÉÄÜ";
    TEXT[ russian ] = "íåâîçìîæíî";
    TEXT[ polish ] = "niemo¿liwy";
    TEXT[ japanese ] = "•s‰Â”\\";
    TEXT[ chinese_traditional ] = "¤£¥i¯à";
    TEXT[ arabic ] = "ÛíÑ ããßä";
    TEXT[ dutch ] = "Onmogelijk";
    TEXT[ chinese_simplified ] = "²»¿ÉÄÜ";
    TEXT[ greek ] = "áäýíáôïí";
    TEXT[ korean ] = "ºÒ°¡´ÉÇÕ´Ï´Ù.";
    TEXT[ turkish ] = "olanaksýz";
    TEXT[ language_user1 ] = " ";
};
String STR_DELETE_UNDO
{
    TEXT = "Löschen" ;
    TEXT [ English ] = "Delete" ;
    TEXT [ norwegian ] = "Slett" ;
    TEXT [ italian ] = "Elimina" ;
    TEXT [ portuguese_brazilian ] = "Apagar" ;
    TEXT [ portuguese ] = "Eliminar" ;
    TEXT [ finnish ] = "Poista" ;
    TEXT [ danish ] = "Slet" ;
    TEXT [ french ] = "Supprimer" ;
    TEXT [ swedish ] = "Radera" ;
    TEXT [ dutch ] = "Wissen" ;
    TEXT [ spanish ] = "Eliminar" ;
    TEXT [ english_us ] = "Delete" ;
    TEXT[ chinese_simplified ] = "ɾ³ý";
    TEXT[ russian ] = "Óäàëèòü";
    TEXT[ polish ] = "Usuñ";
    TEXT[ japanese ] = "íœ";
    TEXT[ chinese_traditional ] = "§R°£";
    TEXT[ arabic ] = "ÍÐÝ";
    TEXT[ dutch ] = "Wissen";
    TEXT[ chinese_simplified ] = "ɾ³ý";
    TEXT[ greek ] = "ÄéáãñáöÞ";
    TEXT[ korean ] = "»èÁ¦";
    TEXT[ turkish ] = "Sil";
    TEXT[ language_user1 ] = " ";
};
String STR_INSERT_UNDO
{
    TEXT = "Einfügen" ;
    TEXT [ English ] = "Insert" ;
    TEXT [ norwegian ] = "Sett inn" ;
    TEXT [ italian ] = "Inserisci" ;
    TEXT [ portuguese_brazilian ] = "Inserir" ;
    TEXT [ portuguese ] = "Inserir" ;
    TEXT [ finnish ] = "Lisää" ;
    TEXT [ danish ] = "Indsæt" ;
    TEXT [ french ] = "Insérer" ;
    TEXT [ swedish ] = "Infoga" ;
    TEXT [ dutch ] = "Invoegen" ;
    TEXT [ spanish ] = "Insertar" ;
    TEXT [ english_us ] = "Insert" ;
    TEXT[ chinese_simplified ] = "²åÈë";
    TEXT[ russian ] = "Âñòàâêà";
    TEXT[ polish ] = "Wstaw";
    TEXT[ japanese ] = "‘}“ü";
    TEXT[ chinese_traditional ] = "´¡¤J";
    TEXT[ arabic ] = "ÅÏÑÇÌ";
    TEXT[ dutch ] = "Invoegen";
    TEXT[ chinese_simplified ] = "²åÈë";
    TEXT[ greek ] = "ÅéóáãùãÞ";
    TEXT[ korean ] = "»ðÀÔ";
    TEXT[ turkish ] = "Ekle";
    TEXT[ language_user1 ] = " ";
};
String STR_OVR_UNDO
{
    TEXT = "Überschreiben" ;
    TEXT [ English ] = "Overwrite" ;
    TEXT [ norwegian ] = "Skriv over" ;
    TEXT [ italian ] = "Sovrascrivi" ;
    TEXT [ portuguese_brazilian ] = "Gravar sobre" ;
    TEXT [ portuguese ] = "Sobregravar" ;
    TEXT [ finnish ] = "Korvaa" ;
    TEXT [ danish ] = "Overskriv" ;
    TEXT [ french ] = "Écraser" ;
    TEXT [ swedish ] = "Skriv över" ;
    TEXT [ dutch ] = "Overschrijven" ;
    TEXT [ spanish ] = "Sobrescribir" ;
    TEXT [ english_us ] = "Overwrite" ;
    TEXT[ chinese_simplified ] = "¸²Ð´";
    TEXT[ russian ] = "Çàìåíèòü";
    TEXT[ polish ] = "Skasuj przez zapisanie";
    TEXT[ japanese ] = "ã‘‚«";
    TEXT[ chinese_traditional ] = "Âмg";
    TEXT[ arabic ] = "ÇáßÊÇÈÉ ÝæÞ";
    TEXT[ dutch ] = "Overschrijven";
    TEXT[ chinese_simplified ] = "¸²Ð´";
    TEXT[ greek ] = "ÁíôéêáôÜóôáóç";
    TEXT[ korean ] = "µ¤¾î¾²±â";
    TEXT[ turkish ] = "Üzerine yaz";
    TEXT[ language_user1 ] = " ";
};
String STR_SPLITNODE_UNDO
{
    TEXT = "neuer Absatz" ;
    TEXT [ English ] = "new Paragraph" ;
    TEXT [ norwegian ] = "nytt Avsnitt" ;
    TEXT [ italian ] = "Nuovo paragrafo" ;
    TEXT [ portuguese_brazilian ] = "novo Parágrafo" ;
    TEXT [ portuguese ] = "Novo parágrafo" ;
    TEXT [ finnish ] = "uusi kappale" ;
    TEXT [ danish ] = "nyt afsnit" ;
    TEXT [ french ] = "Nouveau paragraphe" ;
    TEXT [ swedish ] = "nytt stycke" ;
    TEXT [ dutch ] = "Nieuwe alinea" ;
    TEXT [ spanish ] = "Párrafo nuevo" ;
    TEXT [ english_us ] = "New Paragraph" ;
    TEXT[ chinese_simplified ] = "н¨¶ÎÂä";
    TEXT[ russian ] = "Íîâûé àáçàö";
    TEXT[ polish ] = "Nowy akapit";
    TEXT[ japanese ] = "V‚µ‚¢’i—Ž";
    TEXT[ chinese_traditional ] = "·s«Ø¬q¸¨";
    TEXT[ arabic ] = "ÝÞÑÉ ÌÏíÏÉ";
    TEXT[ dutch ] = "Nieuwe alinea";
    TEXT[ chinese_simplified ] = "н¨¶ÎÂä";
    TEXT[ greek ] = "Äçìéïõñãßá ðáñáãñÜöïõ";
    TEXT[ korean ] = "»õ ´Ü¶ô";
    TEXT[ turkish ] = "Yeni paragraf";
    TEXT[ language_user1 ] = " ";
};
String STR_MOVE_UNDO
{
    TEXT = "Verschieben" ;
    TEXT [ English ] = "Move" ;
    TEXT [ norwegian ] = "Flytt" ;
    TEXT [ italian ] = "Sposta" ;
    TEXT [ portuguese_brazilian ] = "Mover" ;
    TEXT [ portuguese ] = "Mover" ;
    TEXT [ finnish ] = "Lisää" ;
    TEXT [ danish ] = "Flyt" ;
    TEXT [ french ] = "Déplacer" ;
    TEXT [ swedish ] = "Flytta" ;
    TEXT [ dutch ] = "Verplaatsen" ;
    TEXT [ spanish ] = "Desplazar" ;
    TEXT [ english_us ] = "Move" ;
    TEXT[ chinese_simplified ] = "ÒÆ¶¯";
    TEXT[ russian ] = "Ïåðåìåñòèòü";
    TEXT[ polish ] = "Przesuñ";
    TEXT[ japanese ] = "ˆÚ“®";
    TEXT[ chinese_traditional ] = "²¾°Ê";
    TEXT[ arabic ] = "ÅÒÇÍÉ";
    TEXT[ dutch ] = "Verplaatsen";
    TEXT[ chinese_simplified ] = "ÒÆ¶¯";
    TEXT[ greek ] = "Ìåôáêßíçóç";
    TEXT[ korean ] = "À̵¿";
    TEXT[ turkish ] = "Taþý";
    TEXT[ language_user1 ] = " ";
};
String STR_INSATTR_UNDO
{
    TEXT = "Attribute anwenden" ;
    TEXT [ English ] = "Apply attributes" ;
    TEXT [ norwegian ] = "Bruk attributter" ;
    TEXT [ italian ] = "Applica attributi" ;
    TEXT [ portuguese_brazilian ] = "Aplicar atributos" ;
    TEXT [ portuguese ] = "Aplicar atributos" ;
    TEXT [ finnish ] = "Käytä määritteitä" ;
    TEXT [ danish ] = "Anvend attributter" ;
    TEXT [ french ] = "Appliquer les attributs" ;
    TEXT [ swedish ] = "Använd attribut" ;
    TEXT [ dutch ] = "Attributen toepassen" ;
    TEXT [ spanish ] = "Aplicar atributos" ;
    TEXT [ english_us ] = "Apply attributes" ;
    TEXT[ chinese_simplified ] = "ʹÓÃÊôÐÔ";
    TEXT[ russian ] = "Ïðèìåíèòü àòðèáóòû";
    TEXT[ polish ] = "Zastosuj atrybuty";
    TEXT[ japanese ] = "‘®«‚Ì“K—p";
    TEXT[ chinese_traditional ] = "¨Ï¥ÎÄÝ©Ê";
    TEXT[ arabic ] = "ÇÓÊÎÏÇã ÇáÓãÇÊ";
    TEXT[ dutch ] = "Attributen toepassen";
    TEXT[ chinese_simplified ] = "ʹÓÃÊôÐÔ";
    TEXT[ greek ] = "ÅöáñìïãÞ éäéïôÞôùí";
    TEXT[ korean ] = "¼Ó¼º Àû¿ë";
    TEXT[ turkish ] = "Öznitelikleri deðiþtir";
    TEXT[ language_user1 ] = " ";
};
String STR_SETFMTCOLL_UNDO
{
    TEXT = "Vorlagen anwenden" ;
    TEXT [ English ] = "Apply styles" ;
    TEXT [ norwegian ] = "Bruk maler" ;
    TEXT [ italian ] = "Applica stili" ;
    TEXT [ portuguese_brazilian ] = "Apicar estilos" ;
    TEXT [ portuguese ] = "Aplicar estilos" ;
    TEXT [ finnish ] = "Käytä tyylejä" ;
    TEXT [ danish ] = "Anvend typografi" ;
    TEXT [ french ] = "Appliquer les styles" ;
    TEXT [ swedish ] = "Använd formatmallar" ;
    TEXT [ dutch ] = "Opmaakprofielen toepassen" ;
    TEXT [ spanish ] = "Aplicar estilos" ;
    TEXT [ english_us ] = "Apply Styles" ;
    TEXT[ chinese_simplified ] = "ʹÓÃÑùʽ";
    TEXT[ russian ] = "Ïðèìåíèòü ñòèëè";
    TEXT[ polish ] = "Zastosuj szablony";
    TEXT[ japanese ] = "½À²Ù‚Ì“K—p";
    TEXT[ chinese_traditional ] = "¨Ï¥Î¼Ë¦¡";
    TEXT[ arabic ] = "ÇÓÊÎÏÇã ÇáäãÇÐÌ";
    TEXT[ dutch ] = "Opmaakprofielen toepassen";
    TEXT[ chinese_simplified ] = "ʹÓÃÑùʽ";
    TEXT[ greek ] = "ÅöáñìïãÞ ðñïôýðùí";
    TEXT[ korean ] = "À¯Çü Àû¿ë";
    TEXT[ turkish ] = "Biçim uygula";
    TEXT[ language_user1 ] = "All \"Vorlage\"/Styles are always written with capital S. 10.5.00EM";
};
String STR_RESET_ATTR_UNDO
{
    TEXT = "Attribute zurücksetzen" ;
    TEXT [ English ] = "Reset attributes" ;
    TEXT [ norwegian ] = "Sett attributter på nytt" ;
    TEXT [ italian ] = "Reimposta attributi" ;
    TEXT [ portuguese_brazilian ] = "Redefinir atributos" ;
    TEXT [ portuguese ] = "Restaurar atributos" ;
    TEXT [ finnish ] = "Palauta määritteet" ;
    TEXT [ danish ] = "Nulstil attributter" ;
    TEXT [ french ] = "Restaurer les attributs" ;
    TEXT [ swedish ] = "Återställ attribut" ;
    TEXT [ dutch ] = "Attributen terugzetten" ;
    TEXT [ spanish ] = "Restablecer atributos" ;
    TEXT [ english_us ] = "Reset attributes" ;
    TEXT[ chinese_simplified ] = "ÖØÉèÊôÐÔ";
    TEXT[ russian ] = "Âîññòàíîâèòü àòðèáóòû";
    TEXT[ polish ] = "Zresetuj atrybuty";
    TEXT[ japanese ] = "‘®«‚Ìؾ¯Ä";
    TEXT[ chinese_traditional ] = "­«³]ÄÝ©Ê";
    TEXT[ arabic ] = "ÅÚÇÏÉ ÊÚííä ÇáÓãÇÊ";
    TEXT[ dutch ] = "Attributen terugzetten";
    TEXT[ chinese_simplified ] = "ÖØÉèÊôÐÔ";
    TEXT[ greek ] = "ÅðáíáöïñÜ éäéïôÞôùí";
    TEXT[ korean ] = "¼Ó¼º ¿ø·¡´ë·Î";
    TEXT[ turkish ] = "Öznitelikleri baþa al";
    TEXT[ language_user1 ] = " ";
};
String STR_APPLY_ATTR_UNDO
{
    TEXT = "Attribute anwenden" ;
    TEXT [ English ] = "Apply attributes" ;
    TEXT [ norwegian ] = "Bruk attributter" ;
    TEXT [ italian ] = "Applica attributi" ;
    TEXT [ portuguese_brazilian ] = "Aplicar atributos" ;
    TEXT [ portuguese ] = "Aplicar atributos" ;
    TEXT [ finnish ] = "Käytä määritteitä" ;
    TEXT [ danish ] = "Anvend attributter" ;
    TEXT [ french ] = "Appliquer les attributs" ;
    TEXT [ swedish ] = "Använd attribut" ;
    TEXT [ dutch ] = "Attributen toepassen" ;
    TEXT [ spanish ] = "Aplicar atributos" ;
    TEXT [ english_us ] = "Apply attributes" ;
    TEXT[ chinese_simplified ] = "ʹÓÃÊôÐÔ";
    TEXT[ russian ] = "Ïðèìåíèòü àòðèáóòû";
    TEXT[ polish ] = "Zastosuj atrybuty";
    TEXT[ japanese ] = "‘®«‚Ì“K—p";
    TEXT[ chinese_traditional ] = "¨Ï¥ÎÄÝ©Ê";
    TEXT[ arabic ] = "ÇÓÊÎÏÇã ÇáÓãÇÊ";
    TEXT[ dutch ] = "Attributen toepassen";
    TEXT[ chinese_simplified ] = "ʹÓÃÊôÐÔ";
    TEXT[ greek ] = "ÅöáñìïãÞ éäéïôÞôùí";
    TEXT[ korean ] = "¼Ó¼º Àû¿ë";
    TEXT[ turkish ] = "Öznitelikleri kullan";
    TEXT[ language_user1 ] = " ";
};
String STR_INSERT_DOC_UNDO
{
    TEXT = "Dokument einfügen" ;
    TEXT [ English ] = "Insert document" ;
    TEXT [ norwegian ] = "Insert document" ;
    TEXT [ italian ] = "Inserisci documento" ;
    TEXT [ portuguese_brazilian ] = "Insere um documento" ;
    TEXT [ portuguese ] = "Inserir documento" ;
    TEXT [ finnish ] = "Lisää asiakirja" ;
    TEXT [ danish ] = "Indsæt dokument" ;
    TEXT [ french ] = "Insérer un document" ;
    TEXT [ swedish ] = "Infoga dokument" ;
    TEXT [ dutch ] = "Document invoegen" ;
    TEXT [ spanish ] = "Insertar documento" ;
    TEXT [ english_us ] = "Insert Document" ;
    TEXT[ chinese_simplified ] = "²åÈëÎĵµ";
    TEXT[ russian ] = "Âñòàâèòü äîêóìåíò";
    TEXT[ polish ] = "Wstaw dokument";
    TEXT[ japanese ] = "ÄÞ·­ÒÝĂ̑}“ü";
    TEXT[ chinese_traditional ] = "´¡¤J¤å¥ó";
    TEXT[ arabic ] = "ÅÏÑÇÌ ãÓÊäÏ";
    TEXT[ dutch ] = "Document invoegen";
    TEXT[ chinese_simplified ] = "²åÈëÎĵµ";
    TEXT[ greek ] = "ÐñïóèÞêç åããñÜöïõ";
    TEXT[ korean ] = "¹®¼­ »ðÀÔ";
    TEXT[ turkish ] = "Belge ekle";
    TEXT[ language_user1 ] = " ";
};
String STR_INSERT_GLOSSARY
{
    TEXT = "AutoText einfügen" ;
    TEXT [ English ] = "Insert AutoText" ;
    TEXT [ norwegian ] = "Insert AutoText" ;
    TEXT [ italian ] = "Inserisci testo automatico" ;
    TEXT [ portuguese_brazilian ] = "Inserir Texto Automático" ;
    TEXT [ portuguese ] = "Inserir AutoTexto" ;
    TEXT [ finnish ] = "Lisää automaattiteksti" ;
    TEXT [ danish ] = "Indsæt AutoTekst" ;
    TEXT [ french ] = "Insérer un AutoTexte" ;
    TEXT [ swedish ] = "Infoga AutoText" ;
    TEXT [ dutch ] = "AutoTekst invoegen" ;
    TEXT [ spanish ] = "Insertar AutoTexto" ;
    TEXT [ english_us ] = "Insert AutoText" ;
    TEXT[ chinese_simplified ] = "²åÈë×Ô¶¯Í¼Îļ¯";
    TEXT[ russian ] = "Âñòàâèòü àâòîòåêñò";
    TEXT[ polish ] = "Wstaw Autotekst";
    TEXT[ japanese ] = "“ü—ÍŽx‰‡‚Ì‘}“ü";
    TEXT[ chinese_traditional ] = "´¡¤J¦Û°Ê¹Ï¤å¶°";
    TEXT[ arabic ] = "ÅÏÑÇÌ äÕ ÊáÞÇÆí";
    TEXT[ dutch ] = "AutoTekst invoegen";
    TEXT[ chinese_simplified ] = "²åÈë×Ô¶¯Í¼Îļ¯";
    TEXT[ greek ] = "ÐñïóèÞêç ÁõôïÊåéìÝíïõ";
    TEXT[ korean ] = "ÀÚµ¿ ÅØ½ºÆ® »ðÀÔ";
    TEXT[ turkish ] = "Otomatik metin ekle";
    TEXT[ language_user1 ] = " ";
};
String STR_DELBOOKMARK
{
    TEXT = "Textmarke löschen" ;
    TEXT [ English ] = "Delete bookmark" ;
    TEXT [ norwegian ] = "Slett bokmerke" ;
    TEXT [ italian ] = "Elimina segnalibro" ;
    TEXT [ portuguese_brazilian ] = "Apagar marca" ;
    TEXT [ portuguese ] = "Eliminar marcador de texto" ;
    TEXT [ finnish ] = "Poista kirjanmerkki" ;
    TEXT [ danish ] = "Slet tekstmarkering" ;
    TEXT [ french ] = "Supprimer le repère de texte" ;
    TEXT [ swedish ] = "Radera bokmärke" ;
    TEXT [ dutch ] = "Tekstmarkering verwijderen" ;
    TEXT [ spanish ] = "Eliminar marcador" ;
    TEXT [ english_us ] = "Delete bookmark" ;
    TEXT[ chinese_simplified ] = "ɾ³ýÊéÇ©";
    TEXT[ russian ] = "Óäàëèòü çàêëàäêó";
    TEXT[ polish ] = "Usuñ zak³adkê";
    TEXT[ japanese ] = "÷½Äϰ¸‚̍폜";
    TEXT[ chinese_traditional ] = "§R°£¤º¤å¼ÐÅÒ";
    TEXT[ arabic ] = "ÍÐÝ ÅÔÇÑÉ ãÑÌÚíÉ";
    TEXT[ dutch ] = "Tekstmarkering verwijderen";
    TEXT[ chinese_simplified ] = "ɾ³ýÊéÇ©";
    TEXT[ greek ] = "ÄéáãñáöÞ óåëéäïäåßêôç";
    TEXT[ korean ] = "Ã¥ °¥ÇÇ »èÁ¦";
    TEXT[ turkish ] = "Metin iþaretini sil";
    TEXT[ language_user1 ] = " ";
};
String STR_INSBOOKMARK
{
    TEXT = "Textmarke einfügen" ;
    TEXT [ English ] = "Insert bookmark" ;
    TEXT [ norwegian ] = "Sett inn bokmerke" ;
    TEXT [ italian ] = "Inserisci segnalibro" ;
    TEXT [ portuguese_brazilian ] = "Inserir marca" ;
    TEXT [ portuguese ] = "Inserir marcador de texto" ;
    TEXT [ finnish ] = "Lisää kirjanmerkki" ;
    TEXT [ danish ] = "Indsæt tekstmarkering" ;
    TEXT [ french ] = "Insérer un repère de texte" ;
    TEXT [ swedish ] = "Infoga bokmärke" ;
    TEXT [ dutch ] = "Tekstmarkering invoegen" ;
    TEXT [ spanish ] = "Insertar marca" ;
    TEXT [ english_us ] = "Insert bookmark" ;
    TEXT[ chinese_simplified ] = "²åÈëÊéÇ©";
    TEXT[ russian ] = "Âñòàâèòü çàêëàäêó";
    TEXT[ polish ] = "Wstaw zak³adkê";
    TEXT[ japanese ] = "÷½Äϰ¸‚Ì‘}“ü";
    TEXT[ chinese_traditional ] = "´¡¤J¤º¤å¼ÐÅÒ";
    TEXT[ arabic ] = "ÅÏÑÇÌ ÅÔÇÑÉ ãÑÌÚíÉ";
    TEXT[ dutch ] = "Tekstmarkering invoegen";
    TEXT[ chinese_simplified ] = "²åÈëÊéÇ©";
    TEXT[ greek ] = "ÅéóáãùãÞ óåëéäïäåßêôç";
    TEXT[ korean ] = "Ã¥ °¥ÇÇ »ðÀÔ";
    TEXT[ turkish ] = "Metin iþareti ekle";
    TEXT[ language_user1 ] = " ";
};
String STR_SORT_TBL
{
    TEXT = "Tabelle sortieren" ;
    TEXT [ English ] = "Sort table" ;
    TEXT [ norwegian ] = "Sorter tabell" ;
    TEXT [ italian ] = "Ordina tabella" ;
    TEXT [ portuguese_brazilian ] = "Ordenar tabela" ;
    TEXT [ portuguese ] = "Ordenar tabela" ;
    TEXT [ finnish ] = "Lajittele taulukko" ;
    TEXT [ danish ] = "Sorter tabel" ;
    TEXT [ french ] = "Trier tableau" ;
    TEXT [ swedish ] = "Sortera tabell" ;
    TEXT [ dutch ] = "Tabel sorteren" ;
    TEXT [ spanish ] = "Ordenar tabla" ;
    TEXT [ english_us ] = "Sort table" ;
    TEXT[ chinese_simplified ] = "ÅÅÐò±í¸ñ";
    TEXT[ russian ] = "Ñîðòèðîâêà òàáëèöû";
    TEXT[ polish ] = "Sortuj tabelê";
    TEXT[ japanese ] = "•\\‚Ì•À‚בւ¦";
    TEXT[ chinese_traditional ] = "±Æ§Çªí®æ";
    TEXT[ arabic ] = "ÝÑÒ ÇáÌÏæá";
    TEXT[ dutch ] = "Tabel sorteren";
    TEXT[ chinese_simplified ] = "ÅÅÐò±í¸ñ";
    TEXT[ greek ] = "Ôáîéíüìçóç ðßíáêá";
    TEXT[ korean ] = "Ç¥Á¤·Ä";
    TEXT[ turkish ] = "Tabloyu sýrala";
    TEXT[ language_user1 ] = " ";
};
String STR_SORT_TXT
{
    TEXT = "Text sortieren" ;
    TEXT [ English ] = "Sort text" ;
    TEXT [ norwegian ] = "Sorter tekst" ;
    TEXT [ italian ] = "Ordina testo" ;
    TEXT [ portuguese_brazilian ] = "Ordenar texto" ;
    TEXT [ portuguese ] = "Ordenar texto" ;
    TEXT [ finnish ] = "Lajittele teksti" ;
    TEXT [ danish ] = "Sorter tekst" ;
    TEXT [ french ] = "Trier texte" ;
    TEXT [ swedish ] = "Sortera text" ;
    TEXT [ dutch ] = "Tekst sorteren" ;
    TEXT [ spanish ] = "Ordenar texto" ;
    TEXT [ english_us ] = "Sort text" ;
    TEXT[ chinese_simplified ] = "ÅÅÐòÎÄ×Ö";
    TEXT[ russian ] = "Ñîðòèðîâêà òåêñòà";
    TEXT[ polish ] = "Sortuj tekst";
    TEXT[ japanese ] = "÷½Ä‚Ì•À‚בւ¦";
    TEXT[ chinese_traditional ] = "±Æ§Ç¤å¦r";
    TEXT[ arabic ] = "ÝÑÒ ÇáäÕ";
    TEXT[ dutch ] = "Tekst sorteren";
    TEXT[ chinese_simplified ] = "ÅÅÐòÎÄ×Ö";
    TEXT[ greek ] = "Ôáîéíüìçóç êåéìÝíïõ";
    TEXT[ korean ] = "ÅØ½ºÆ® Á¤·Ä";
    TEXT[ turkish ] = "Metni sýrala";
    TEXT[ language_user1 ] = " ";
};
String STR_INSTABLE_UNDO
{
    TEXT = "Tabelle einfügen" ;
    TEXT [ English ] = "Insert table" ;
    TEXT [ norwegian ] = "Insert table" ;
    TEXT [ italian ] = "Inserisci tabella" ;
    TEXT [ portuguese_brazilian ] = "Insere uma tabela" ;
    TEXT [ portuguese ] = "Inserir tabela" ;
    TEXT [ finnish ] = "Lisää taulukon" ;
    TEXT [ danish ] = "Indsæt tabel" ;
    TEXT [ french ] = "Insérer un tableau" ;
    TEXT [ swedish ] = "Infoga tabell" ;
    TEXT [ dutch ] = "Tabel invoegen" ;
    TEXT [ spanish ] = "Insertar tabla" ;
    TEXT [ english_us ] = "Insert Table" ;
    TEXT[ chinese_simplified ] = "²åÈë±í¸ñ";
    TEXT[ russian ] = "Âñòàâèòü òàáëèöó";
    TEXT[ polish ] = "Wstaw tabelê";
    TEXT[ japanese ] = "•\\‚Ì‘}“ü";
    TEXT[ chinese_traditional ] = "´¡¤Jªí®æ";
    TEXT[ arabic ] = "ÅÏÑÇÌ ÌÏæá";
    TEXT[ dutch ] = "Tabel invoegen";
    TEXT[ chinese_simplified ] = "²åÈë±í¸ñ";
    TEXT[ greek ] = "ÅéóáãùãÞ ðßíáêá";
    TEXT[ korean ] = "Ç¥»ðÀÔ";
    TEXT[ turkish ] = "Tablo ekle";
    TEXT[ language_user1 ] = " ";
};
String STR_TEXTTOTABLE_UNDO
{
    TEXT = "Konvertierung Text -> Tabelle" ;
    TEXT [ English ] = "Convert text to table" ;
    TEXT [ norwegian ] = "Omdann tekst til tabell" ;
    TEXT [ italian ] = "Converti testo in tabella." ;
    TEXT [ portuguese_brazilian ] = "Converter texto em tabela" ;
    TEXT [ portuguese ] = "Converter texto -> tabela" ;
    TEXT [ finnish ] = "Muunna teksti taulukoksi" ;
    TEXT [ danish ] = "Konverter tekst til tabel" ;
    TEXT [ french ] = "Convertir texte en tableau" ;
    TEXT [ swedish ] = "Konvertera text till tabell" ;
    TEXT [ dutch ] = "Tekst naar tabel converteren" ;
    TEXT [ spanish ] = "Convertir texto en tabla" ;
    TEXT [ english_us ] = "Convert text -> table" ;
    TEXT[ chinese_simplified ] = "ÎÄ×Öת»»³É±í¸ñ";
    TEXT[ russian ] = "Ïðåîáðàçîâàòü Òåêñò -> Òàáëèöà";
    TEXT[ polish ] = "Konwertuj tekst na tabelê";
    TEXT[ japanese ] = "÷½Ä->•\\‚ւ̕ϊ·";
    TEXT[ chinese_traditional ] = "¤å¦rÂà´«¦¨ªí®æ";
    TEXT[ arabic ] = "ÊÍæíá äÕ -> ÌÏæá";
    TEXT[ dutch ] = "Tekst naar tabel converteren";
    TEXT[ chinese_simplified ] = "ÎÄ×Öת»»³É±í¸ñ";
    TEXT[ greek ] = "ÌåôáôñïðÞ Êåßìåíï -> Ðßíáêáò";
    TEXT[ korean ] = "º¯È¯ ÅØ½ºÆ® -> Ç¥";
    TEXT[ turkish ] = "Metni tabloya dönüþtür";
    TEXT[ language_user1 ] = " ";
};
String STR_TABLETOTEXT_UNDO
{
    TEXT = "Konvertierung Tabelle -> Text" ;
    TEXT [ English ] = "Convert table to text" ;
    TEXT [ norwegian ] = "Omdann tabell til tekst" ;
    TEXT [ italian ] = "Converti tabella in testo" ;
    TEXT [ portuguese_brazilian ] = "Converter tabela em texto" ;
    TEXT [ portuguese ] = "Converter tabela -> texto" ;
    TEXT [ finnish ] = "Muunna taulukko tekstiksi" ;
    TEXT [ danish ] = "Konverter tabel til tekst" ;
    TEXT [ french ] = "Convertir tableau en texte" ;
    TEXT [ swedish ] = "Konvertera tabell till text" ;
    TEXT [ dutch ] = "Tabel naar tekst converteren" ;
    TEXT [ spanish ] = "Convertir tabla en texto" ;
    TEXT [ english_us ] = "Convert table to text" ;
    TEXT[ chinese_simplified ] = "±í¸ñת»»³ÉÎÄ×Ö";
    TEXT[ russian ] = "Ïðåîáðàçîâàòü Òàáëèöà -> Òåêñò";
    TEXT[ polish ] = "Konwertuj tabelê na tekst";
    TEXT[ japanese ] = "•\\->÷½Ä‚ւ̕ϊ·";
    TEXT[ chinese_traditional ] = "ªí®æÂà´«¦¨¤å¦r";
    TEXT[ arabic ] = "ÊÍæíá ÇáÌÏæá Åáì äÕ";
    TEXT[ dutch ] = "Tabel naar tekst converteren";
    TEXT[ chinese_simplified ] = "±í¸ñת»»³ÉÎÄ×Ö";
    TEXT[ greek ] = "ÌåôáôñïðÞ Ðßíáêáò -> Êåßìåíï";
    TEXT[ korean ] = "Ç¥¸¦ ÅØ½ºÆ®·Î º¯È¯";
    TEXT[ turkish ] = "Tabloyu metne dönüþtür";
    TEXT[ language_user1 ] = " ";
};
String STR_COPY_UNDO
{
    TEXT = "Kopieren" ;
    TEXT [ English ] = "Copy" ;
    TEXT [ norwegian ] = "Kopi" ;
    TEXT [ italian ] = "Copia" ;
    TEXT [ portuguese_brazilian ] = "Copiar" ;
    TEXT [ portuguese ] = "Copiar" ;
    TEXT [ finnish ] = "Kopioi" ;
    TEXT [ danish ] = "Kopier" ;
    TEXT [ french ] = "Copier" ;
    TEXT [ swedish ] = "Kopiera" ;
    TEXT [ dutch ] = "Kopiëren" ;
    TEXT [ spanish ] = "Copiar" ;
    TEXT [ english_us ] = "Copy" ;
    TEXT[ chinese_simplified ] = "¸´ÖÆ";
    TEXT[ russian ] = "Êîïèðîâàòü";
    TEXT[ polish ] = "Kopiuj";
    TEXT[ japanese ] = "ºËß°‚·‚é";
    TEXT[ chinese_traditional ] = "½Æ»s";
    TEXT[ arabic ] = "äÓÎ";
    TEXT[ dutch ] = "Kopiëren";
    TEXT[ chinese_simplified ] = "¸´ÖÆ";
    TEXT[ greek ] = "ÁíôéãñáöÞ";
    TEXT[ korean ] = "º¹»ç";
    TEXT[ turkish ] = "Kopyala";
    TEXT[ language_user1 ] = " ";
};
String STR_REPLACE_UNDO
{
    TEXT = "Ersetzen" ;
    TEXT [ English ] = "Replace" ;
    TEXT [ norwegian ] = "Replace" ;
    TEXT [ italian ] = "Sostituisci" ;
    TEXT [ portuguese_brazilian ] = "Substituir" ;
    TEXT [ portuguese ] = "Substituir" ;
    TEXT [ finnish ] = "Korvaa" ;
    TEXT [ danish ] = "Erstat" ;
    TEXT [ french ] = "Remplacer" ;
    TEXT [ swedish ] = "Ersätt" ;
    TEXT [ dutch ] = "Vervangen" ;
    TEXT [ spanish ] = "Reemplazar" ;
    TEXT [ english_us ] = "Replace" ;
    TEXT[ chinese_simplified ] = "¸üÌæ";
    TEXT[ russian ] = "Çàìåíèòü";
    TEXT[ polish ] = "Zamieñ";
    TEXT[ japanese ] = "’uŠ·";
    TEXT[ chinese_traditional ] = "¥N´À";
    TEXT[ arabic ] = "ÇÓÊÈÏÇá";
    TEXT[ dutch ] = "Vervangen";
    TEXT[ chinese_simplified ] = "¸üÌæ";
    TEXT[ greek ] = "ÁíôéêáôÜóôáóç";
    TEXT[ korean ] = "¹Ù²Ù±â";
    TEXT[ turkish ] = "Deðiþtir";
    TEXT[ language_user1 ] = " ";
};
String STR_INSERT_PAGE_BREAK_UNDO
{
    TEXT = "Harter Seitenumbruch" ;
    TEXT [ English ] = "Hard page break" ;
    TEXT [ norwegian ] = "Fast sideskift" ;
    TEXT [ italian ] = "Interruzione di pagina fissa" ;
    TEXT [ portuguese_brazilian ] = "Quebra forçada de página" ;
    TEXT [ portuguese ] = "Quebra de página fixa" ;
    TEXT [ finnish ] = "Pysyvä sivunvaihto" ;
    TEXT [ danish ] = "Hårdt sideskift" ;
    TEXT [ french ] = "Saut de page forcé" ;
    TEXT [ swedish ] = "Hård sidbrytning" ;
    TEXT [ dutch ] = "Vast pagina-einde" ;
    TEXT [ spanish ] = "Salto fijo de página" ;
    TEXT [ english_us ] = "Hard page break" ;
    TEXT[ chinese_simplified ] = "ÊÖ¹¤»»Ò³";
    TEXT[ russian ] = "Æåñòêèé ðàçðûâ ñòðàíèö";
    TEXT[ polish ] = "Twarde ³amanie strony";
    TEXT[ japanese ] = "”CˆÓŽw’è‚̉üÍß°¼Þ";
    TEXT[ chinese_traditional ] = "¤â¤u´«­¶";
    TEXT[ arabic ] = "ÝÇÕá ÕÝÍÇÊ íÏæí";
    TEXT[ dutch ] = "Vast pagina-einde";
    TEXT[ chinese_simplified ] = "ÊÖ¹¤»»Ò³";
    TEXT[ greek ] = "¸íôïíç áëëáãÞ óåëßäáò";
    TEXT[ korean ] = "°íÁ¤ ÆäÀÌÁö¹Ù²Ù±â";
    TEXT[ turkish ] = "Sabit sayfa sonu";
    TEXT[ language_user1 ] = " ";
};
String STR_INSERT_COLUMN_BREAK_UNDO
{
    TEXT = "Harter Spaltenumbruch" ;
    TEXT [ English ] = "Hard column break" ;
    TEXT [ norwegian ] = "Fast kolonneskift" ;
    TEXT [ italian ] = "Interruzione di colonna fissa" ;
    TEXT [ portuguese_brazilian ] = "Quebra forçada de coluna" ;
    TEXT [ portuguese ] = "Quebra de coluna fixa" ;
    TEXT [ finnish ] = "Pysyvä sarakkeenvaihto" ;
    TEXT [ danish ] = "Hårdt spalteskift" ;
    TEXT [ french ] = "Saut de colonne forcé" ;
    TEXT [ swedish ] = "Hård kolumnbrytning" ;
    TEXT [ dutch ] = "Vast kolomeinde" ;
    TEXT [ spanish ] = "Salto de columna fijo" ;
    TEXT [ english_us ] = "Hard column break" ;
    TEXT[ chinese_simplified ] = "ÊÖ¹¤»»ÁÐ";
    TEXT[ russian ] = "Æåñòêèé ðàçðûâ êîëîíîê";
    TEXT[ polish ] = "Twardy podzia³ kolumny";
    TEXT[ japanese ] = "”CˆÓŽw’è‚̉ü—ñ";
    TEXT[ chinese_traditional ] = "¤â¤u´«Äæ";
    TEXT[ arabic ] = "ÝÇÕá ÃÚãÏÉ íÏæí";
    TEXT[ dutch ] = "Vast kolomeinde";
    TEXT[ chinese_simplified ] = "ÊÖ¹¤»»ÁÐ";
    TEXT[ greek ] = "¸íôïíç áëëáãÞ óôÞëçò";
    TEXT[ korean ] = "°íÁ¤ ¿­¹Ù²Ù±â";
    TEXT[ turkish ] = "Sabit sütun sonu";
    TEXT[ language_user1 ] = " ";
};
String STR_PLAY_MACRO_UNDO
{
    TEXT = "Makro abspielen" ;
    TEXT [ English ] = "Play macro" ;
    TEXT [ norwegian ] = "Kjør makro" ;
    TEXT [ italian ] = "Esegui macro" ;
    TEXT [ portuguese_brazilian ] = "Reproduzir macro" ;
    TEXT [ portuguese ] = "Executar macro" ;
    TEXT [ finnish ] = "Suorita makro" ;
    TEXT [ danish ] = "Spil makro" ;
    TEXT [ french ] = "Exécuter la macro" ;
    TEXT [ swedish ] = "Spela upp makro" ;
    TEXT [ dutch ] = "Macro starten" ;
    TEXT [ spanish ] = "Reproducir macro" ;
    TEXT [ english_us ] = "Run macro" ;
    TEXT[ chinese_simplified ] = "Ö´Ðкê";
    TEXT[ russian ] = "Ïðîãîí ìàêðîñà";
    TEXT[ polish ] = "Wykonaj makro";
    TEXT[ japanese ] = "ϸۂ̎Às";
    TEXT[ chinese_traditional ] = "°õ¦æ¥¨¶°";
    TEXT[ arabic ] = "ÊäÝíÐ ÇáãÇßÑæ";
    TEXT[ dutch ] = "Macro starten";
    TEXT[ chinese_simplified ] = "Ö´Ðкê";
    TEXT[ greek ] = "ÅêôÝëåóç ìáêñïåíôïëÞò";
    TEXT[ korean ] = "¸ÅÅ©·Î ½ÇÇà";
    TEXT[ turkish ] = "Makroyu çalýþtýr";
    TEXT[ language_user1 ] = " ";
};
String STR_INSERT_ENV_UNDO
{
    Text = "Briefumschlag einfügen" ;
    Text [ English ] = "Insert envelope" ;
    Text [ norwegian ] = "Sett inn konvolutt" ;
    Text [ italian ] = "Inserisci busta" ;
    Text [ portuguese_brazilian ] = "Inserir envelope" ;
    Text [ portuguese ] = "Inserir envelope" ;
    Text [ finnish ] = "Lisää kirjekuori" ;
    Text [ danish ] = "Indsæt konvolut" ;
    Text [ french ] = "Insérer une enveloppe" ;
    Text [ swedish ] = "Infoga kuvert" ;
    Text [ dutch ] = "Envelop invoegen" ;
    Text [ spanish ] = "Insertar sobre" ;
    Text [ english_us ] = "Insert Envelope" ;
    Text[ chinese_simplified ] = "²åÈëÐÅ·â";
    Text[ russian ] = "Âñòàâèòü êîíâåðò";
    Text[ polish ] = "Wstaw kopertê";
    Text[ japanese ] = "••“›‚Ì‘}“ü";
    Text[ chinese_traditional ] = "´¡¤J«H«Ê";
    Text[ arabic ] = "ÅÏÑÇÌ ÙÑÝ";
    Text[ dutch ] = "Envelop invoegen";
    Text[ chinese_simplified ] = "²åÈëÐÅ·â";
    Text[ greek ] = "ÐñïóèÞêç öáêÝëïõ åðéóôïëÞò";
    Text[ korean ] = "ºÀÅõ »ðÀÔ";
    Text[ turkish ] = "Zarf ekle";
    Text[ language_user1 ] = " ";
};
String STR_DRAG_AND_COPY
{
    Text = "Kopieren" ;
    Text [ English ] = "Copy" ;
    Text [ dutch ] = "Kopiëren" ;
    Text [ english_us ] = "Copy" ;
    Text [ italian ] = "Copia" ;
    Text [ spanish ] = "Copiar" ;
    Text [ french ] = "Copier" ;
    Text [ swedish ] = "Kopiera" ;
    Text [ danish ] = "Kopier" ;
    Text [ portuguese ] = "Copiar" ;
    Text [ portuguese_brazilian ] = "Kopieren" ;
    Text[ chinese_simplified ] = "¸´ÖÆ";
    Text[ russian ] = "Êîïèðîâàòü";
    Text[ polish ] = "Kopiuj";
    Text[ japanese ] = "ºËß°‚·‚é";
    Text[ chinese_traditional ] = "½Æ»s";
    Text[ arabic ] = "äÓÎ";
    Text[ dutch ] = "Kopiëren";
    Text[ chinese_simplified ] = "¸´ÖÆ";
    Text[ greek ] = "ÁíôéãñáöÞ";
    Text[ korean ] = "º¹»ç";
    Text[ turkish ] = "Kopyala";
    Text[ language_user1 ] = " ";
};
String STR_DRAG_AND_MOVE
{
    Text = "Verschieben" ;
    Text [ English ] = "Move" ;
    Text [ english_us ] = "Move" ;
    Text [ italian ] = "Spostare" ;
    Text [ spanish ] = "Desplazar" ;
    Text [ french ] = "Déplacer" ;
    Text [ dutch ] = "Verplaatsen" ;
    Text [ swedish ] = "Flytta" ;
    Text [ danish ] = "Flyt" ;
    Text [ portuguese ] = "Mover" ;
    Text [ portuguese_brazilian ] = "Verschieben" ;
    Text[ chinese_simplified ] = "ÒÆ¶¯";
    Text[ russian ] = "Ïåðåìåñòèòü";
    Text[ polish ] = "Przesuñ";
    Text[ japanese ] = "ˆÚ“®‚·‚é";
    Text[ chinese_traditional ] = "²¾°Ê";
    Text[ arabic ] = "ÅÒÇÍÉ";
    Text[ dutch ] = "Verplaatsen";
    Text[ chinese_simplified ] = "ÒÆ¶¯";
    Text[ greek ] = "Ìåôáêßíçóç";
    Text[ korean ] = "À̵¿";
    Text[ turkish ] = "Taþý";
    Text[ language_user1 ] = " ";
};
String STR_INSERT_RULER
{
    Text = "Ruler einfügen" ;
    Text [ English ] = "Insert Ruler" ;
    Text [ portuguese ] = "Inserir régua" ;
    Text [ english_us ] = "Insert ruler" ;
    Text [ portuguese_brazilian ] = "Ruler einfügen" ;
    Text [ swedish ] = "Infoga Ruler" ;
    Text [ danish ] = "Indsæt lineal" ;
    Text [ italian ] = "Inserisci ruler" ;
    Text [ spanish ] = "Insertar regla" ;
    Text [ french ] = "Insérer une règle" ;
    Text [ dutch ] = "Ruler invoegen" ;
    Text[ chinese_simplified ] = "²åÈë±ê³ß";
    Text[ russian ] = "Âñòàâèòü ëèíåéêó ðàçìåòêè";
    Text[ polish ] = "Wstaw linijkê";
    Text[ japanese ] = "ׂٰ̑}“ü";
    Text[ chinese_traditional ] = "´¡¤J¼Ð¤Ø";
    Text[ arabic ] = "ÅÏÑÇÌ ãÓØÑÉ";
    Text[ dutch ] = "Ruler invoegen";
    Text[ chinese_simplified ] = "²åÈë±ê³ß";
    Text[ greek ] = "ÅéóáãùãÞ ÷Üñáêá";
    Text[ korean ] = "´«±ÝÀÚ »ðÀÔ";
    Text[ turkish ] = "Cetvel ekle";
    Text[ language_user1 ] = " ";
};
String STR_INSERT_CHART
{
    Text = "StarChart einfügen" ;
    Text [ English ] = "Insert StartChart" ;
    Text [ portuguese ] = "Inserir StarOffice Chart" ;
    Text [ english_us ] = "Insert StarOffice Chart" ;
    Text [ portuguese_brazilian ] = "StarOffice Chart einfügen" ;
    Text [ swedish ] = "Infoga StarOffice Chart" ;
    Text [ danish ] = "Indsæt StarOffice Chart" ;
    Text [ italian ] = "Inserisci StarOffice Chart " ;
    Text [ spanish ] = "Insertar StarOffice Chart" ;
    Text [ french ] = "Insérer un diagramme StarOffice Chart" ;
    Text [ dutch ] = "StarOffice Chart invoegen" ;
    Text[ chinese_simplified ] = "²åÈë StarOffice Chart";
    Text[ russian ] = "Âñòàâèòü StarOffice Chart";
    Text[ polish ] = "Wstaw StarOffice Chart";
    Text[ japanese ] = "StarOffice Chart‚Ì‘}“ü";
    Text[ chinese_traditional ] = "´¡¤J StarOffice Chart";
    Text[ arabic ] = "ÅÏÑÇÌ StarOffice Chart";
    Text[ dutch ] = "StarOffice Chart invoegen";
    Text[ chinese_simplified ] = "²åÈë StarOffice Chart";
    Text[ greek ] = "ÐñïóèÞêç StarOffice Chart";
    Text[ korean ] = "StarOffice Â÷Æ® »ðÀÔ";
    Text[ turkish ] = "StarOffice Chart ekle";
    Text[ language_user1 ] = " ";
};
String STR_INSERTFLY
{
    TEXT = "Rahmen einfügen" ;
    TEXT [ English ] = "Insert frame" ;
    TEXT [ norwegian ] = "Sett inn ramme" ;
    TEXT [ italian ] = "Inserisci cornice" ;
    TEXT [ portuguese_brazilian ] = "Inserir moldura" ;
    TEXT [ portuguese ] = "Inserir moldura" ;
    TEXT [ finnish ] = "Lisää kehyksen" ;
    TEXT [ danish ] = "Indsæt ramme" ;
    TEXT [ french ] = "Insérer un cadre" ;
    TEXT [ swedish ] = "Infoga ram" ;
    TEXT [ dutch ] = "Kader invoegen" ;
    TEXT [ spanish ] = "Insertar marco" ;
    TEXT [ english_us ] = "Insert frame" ;
    TEXT[ chinese_simplified ] = "²åÈë¿ò¶ÔÏó";
    TEXT[ russian ] = "Âñòàâèòü ðàìêó";
    TEXT[ polish ] = "Wstaw ramkê";
    TEXT[ japanese ] = "˜g‚Ì‘}“ü";
    TEXT[ chinese_traditional ] = "´¡¤J®Øª«¥ó";
    TEXT[ arabic ] = "ÅÏÑÇÌ ÅØÇÑ";
    TEXT[ dutch ] = "Kader invoegen";
    TEXT[ chinese_simplified ] = "²åÈë¿ò¶ÔÏó";
    TEXT[ greek ] = "ÐñïóèÞêç ðëáéóßïõ";
    TEXT[ korean ] = "ÇÁ·¹ÀÓ »ðÀÔ";
    TEXT[ turkish ] = "Çerçeve ekle";
    TEXT[ language_user1 ] = " ";
};
String STR_DELETEFLY
{
    TEXT = "Rahmen löschen" ;
    TEXT [ English ] = "Delete frame" ;
    TEXT [ norwegian ] = "Slett ramme" ;
    TEXT [ italian ] = "Elimina cornice" ;
    TEXT [ portuguese_brazilian ] = "Apagar moldura" ;
    TEXT [ portuguese ] = "Eliminar moldura" ;
    TEXT [ finnish ] = "Poista kehys" ;
    TEXT [ danish ] = "Slet ramme" ;
    TEXT [ french ] = "Supprimer le cadre" ;
    TEXT [ swedish ] = "Radera ram" ;
    TEXT [ dutch ] = "Kader wissen" ;
    TEXT [ spanish ] = "Eliminar marco" ;
    TEXT [ english_us ] = "Delete frame" ;
    TEXT[ chinese_simplified ] = "ɾ³ý¿ò¶ÔÏó";
    TEXT[ russian ] = "Óäàëèòü ðàìêó";
    TEXT[ polish ] = "Usuñ ramkê";
    TEXT[ japanese ] = "˜g‚̍폜";
    TEXT[ chinese_traditional ] = "§R°£®Øª«¥ó";
    TEXT[ arabic ] = "ÍÐÝ ÅØÇÑ";
    TEXT[ dutch ] = "Kader wissen";
    TEXT[ chinese_simplified ] = "ɾ³ý¿ò¶ÔÏó";
    TEXT[ greek ] = "ÄéáãñáöÞ ðëáéóßïõ";
    TEXT[ korean ] = "ÇÁ·¹ÀÓ »èÁ¦";
    TEXT[ turkish ] = "Çerçeveyi düzelt";
    TEXT[ language_user1 ] = " ";
};
String STR_AUTOFORMAT
{
    TEXT = "AutoFormat" ;
    TEXT [ English ] = "AutoFormat" ;
    TEXT [ norwegian ] = "AutoFormat" ;
    TEXT [ italian ] = "Formattazione automatica" ;
    TEXT [ portuguese_brazilian ] = "Auto Formatação" ;
    TEXT [ portuguese ] = "AutoFormato" ;
    TEXT [ finnish ] = "Automaattimuoto" ;
    TEXT [ danish ] = "AutoFormat" ;
    TEXT [ french ] = "AutoFormat" ;
    TEXT [ swedish ] = "AutoFormat" ;
    TEXT [ dutch ] = "AutoOpmaak" ;
    TEXT [ spanish ] = "AutoFormato" ;
    TEXT [ english_us ] = "AutoFormat" ;
    TEXT[ chinese_simplified ] = "×Ô¶¯¸ñʽ";
    TEXT[ russian ] = "Àâòîôîðìàò";
    TEXT[ polish ] = "Autoformatowanie";
    TEXT[ japanese ] = "µ°ÄÌ«°Ï¯Ä";
    TEXT[ chinese_traditional ] = "¦Û°Ê®æ¦¡";
    TEXT[ arabic ] = "ÊäÓíÞ ÊáÞÇÆí";
    TEXT[ dutch ] = "AutoOpmaak";
    TEXT[ chinese_simplified ] = "×Ô¶¯¸ñʽ";
    TEXT[ greek ] = "ÁõôïÌïñöïðïßçóç";
    TEXT[ korean ] = "ÀÚµ¿ ¼­½Ä";
    TEXT[ turkish ] = "Otomatik formatlama";
    TEXT[ language_user1 ] = " ";
};
String STR_TABLEHEADLINE
{
    TEXT = "Tabellenüberschrift" ;
    TEXT [ English ] = "Table headline" ;
    TEXT [ norwegian ] = "Tabelloverskrift" ;
    TEXT [ italian ] = "Intestazione tabella" ;
    TEXT [ portuguese_brazilian ] = "Cabeçalho da tabela" ;
    TEXT [ portuguese ] = "Título da tabela" ;
    TEXT [ finnish ] = "Taulukon otsikko" ;
    TEXT [ danish ] = "Tabeloverskrift" ;
    TEXT [ french ] = "Titre de la table" ;
    TEXT [ swedish ] = "Tabellöverskrift" ;
    TEXT [ dutch ] = "Tabelkop" ;
    TEXT [ spanish ] = "Encabezado de la tabla" ;
    TEXT [ english_us ] = "Table heading" ;
    TEXT[ chinese_simplified ] = "±í¸ñ±êÌâ";
    TEXT[ russian ] = "Çàãîëîâîê òàáëèöû";
    TEXT[ polish ] = "Nag³ówek tabeli";
    TEXT[ japanese ] = "•\\‚ÌŒ©o‚µ";
    TEXT[ chinese_traditional ] = "ªí®æ¼ÐÃD";
    TEXT[ arabic ] = "ÚäæÇä ÇáÌÏæá";
    TEXT[ dutch ] = "Tabelkop";
    TEXT[ chinese_simplified ] = "±í¸ñ±êÌâ";
    TEXT[ greek ] = "Åðéêåöáëßäá ðßíáêá";
    TEXT[ korean ] = "Ç¥ Á¦¸ñ";
    TEXT[ turkish ] = "Tablo baþlýðý";
    TEXT[ language_user1 ] = " ";
};
String STR_REPLACE
{
    TEXT = "Ersetzen" ;
    TEXT [ English ] = "Replace" ;
    TEXT [ norwegian ] = "Replace" ;
    TEXT [ italian ] = "Sostituisci" ;
    TEXT [ portuguese_brazilian ] = "Substituir" ;
    TEXT [ portuguese ] = "Substituir" ;
    TEXT [ finnish ] = "Korvaa" ;
    TEXT [ danish ] = "Erstat" ;
    TEXT [ french ] = "Remplacer" ;
    TEXT [ swedish ] = "Ersätt" ;
    TEXT [ dutch ] = "Vervangen" ;
    TEXT [ spanish ] = "Reemplazar" ;
    TEXT [ english_us ] = "Replace" ;
    TEXT[ chinese_simplified ] = "¸üÌæ";
    TEXT[ russian ] = "Çàìåíèòü";
    TEXT[ polish ] = "Zamieñ";
    TEXT[ japanese ] = "’uŠ·";
    TEXT[ chinese_traditional ] = "¥N´À";
    TEXT[ arabic ] = "ÇÓÊÈÏÇá";
    TEXT[ dutch ] = "Vervangen";
    TEXT[ chinese_simplified ] = "¸üÌæ";
    TEXT[ greek ] = "ÁíôéêáôÜóôáóç";
    TEXT[ korean ] = "¹Ù²Ù±â";
    TEXT[ turkish ] = "Deðiþtir";
    TEXT[ language_user1 ] = " ";
};
String STR_INSERTSECTION
{
    TEXT = "Bereich einfügen" ;
    TEXT [ English ] = "Section insert" ;
    TEXT [ norwegian ] = "Sett inn område" ;
    TEXT [ italian ] = "Inserisci area" ;
    TEXT [ portuguese_brazilian ] = "Inserir seção" ;
    TEXT [ portuguese ] = "Inserir secção" ;
    TEXT [ finnish ] = "Lisää osa" ;
    TEXT [ danish ] = "Indsæt område" ;
    TEXT [ french ] = "Insérer une section" ;
    TEXT [ swedish ] = "Infoga område" ;
    TEXT [ dutch ] = "Bereik invoegen" ;
    TEXT [ spanish ] = "Insertar área" ;
    TEXT [ english_us ] = "Insert section" ;
    TEXT[ chinese_simplified ] = "²åÈëÇøÓò";
    TEXT[ russian ] = "Âñòàâèòü îáëàñòü";
    TEXT[ polish ] = "Wstaw sekcjê";
    TEXT[ japanese ] = "—̈æ‚Ì‘}“ü";
    TEXT[ chinese_traditional ] = "´¡¤J°Ï°ì";
    TEXT[ arabic ] = "ÅÏÑÇÌ äØÇÞ";
    TEXT[ dutch ] = "Bereik invoegen";
    TEXT[ chinese_simplified ] = "²åÈëÇøÓò";
    TEXT[ greek ] = "ÐñïóèÞêç ðåñéï÷Þò";
    TEXT[ korean ] = "±¸¿ª »ðÀÔ";
    TEXT[ turkish ] = "Bölüm ekle";
    TEXT[ language_user1 ] = " ";
};
String STR_DELETESECTION
{
    TEXT = "Bereich löschen" ;
    TEXT [ English ] = "Section delete" ;
    TEXT [ norwegian ] = "Slett område" ;
    TEXT [ italian ] = "Elimina area" ;
    TEXT [ portuguese_brazilian ] = "Apagar seção" ;
    TEXT [ portuguese ] = "Eliminar categoria" ;
    TEXT [ finnish ] = "Poista osa" ;
    TEXT [ danish ] = "Slet område" ;
    TEXT [ french ] = "Supprimer la section" ;
    TEXT [ swedish ] = "Radera kategori" ;
    TEXT [ dutch ] = "Bereik wissen" ;
    TEXT [ spanish ] = "Eliminar área" ;
    TEXT [ english_us ] = "Delete section" ;
    TEXT[ chinese_simplified ] = "ɾ³ýÇøÓò";
    TEXT[ russian ] = "Óäàëèòü êàòåãîðèþ";
    TEXT[ polish ] = "Usuñ obszar";
    TEXT[ japanese ] = "—̈æ‚̍폜";
    TEXT[ chinese_traditional ] = "§R°£°Ï°ì";
    TEXT[ arabic ] = "ÍÐÝ ÇáÝÆÉ";
    TEXT[ dutch ] = "Bereik wissen";
    TEXT[ chinese_simplified ] = "ɾ³ýÇøÓò";
    TEXT[ greek ] = "ÄéáãñáöÞ êáôçãïñßáò";
    TEXT[ korean ] = "ºÐ·ùÇ׸ñ »èÁ¦";
    TEXT[ turkish ] = "Bölümü sil";
    TEXT[ language_user1 ] = " ";
};
String STR_CHANGESECTION
{
    TEXT = "Bereich ändern" ;
    TEXT [ English ] = "Section change" ;
    TEXT [ norwegian ] = "Endre område" ;
    TEXT [ italian ] = "Cambia area" ;
    TEXT [ portuguese_brazilian ] = "Mudar seção" ;
    TEXT [ portuguese ] = "Alterar secção" ;
    TEXT [ finnish ] = "Vaihda osa" ;
    TEXT [ danish ] = "Modificer område" ;
    TEXT [ french ] = "Modifier section" ;
    TEXT [ swedish ] = "Ändra område" ;
    TEXT [ dutch ] = "Bereik wijzigen" ;
    TEXT [ spanish ] = "Modificar área" ;
    TEXT [ english_us ] = "Modify section" ;
    TEXT[ chinese_simplified ] = "¸ü¸ÄÇøÓò";
    TEXT[ russian ] = "Èçìåíèòü îáëàñòü";
    TEXT[ polish ] = "Zmodyfikuj sekcjê";
    TEXT[ japanese ] = "¾¸¼®Ý‚̕ύX";
    TEXT[ chinese_traditional ] = "Åܧó°Ï°ì";
    TEXT[ arabic ] = "ÊÚÏíá ÇáäØÇÞ";
    TEXT[ dutch ] = "Bereik wijzigen";
    TEXT[ chinese_simplified ] = "¸ü¸ÄÇøÓò";
    TEXT[ greek ] = "Ôñïðïðïßçóç ðåñéï÷Þò";
    TEXT[ korean ] = "±¸¿ª ¼öÁ¤";
    TEXT[ turkish ] = "Bölümü deðiþtir";
    TEXT[ language_user1 ] = " ";
};
String STR_CHANGESECTPASSWD
{
    TEXT = "Passwortschutz ändern" ;
    TEXT [ English ] = "password protected change" ;
    Text [ english_us ] = "Change password protection" ;
    Text [ italian ] = "Cambia protezione password" ;
    Text [ spanish ] = "Modificar contraseña" ;
    Text [ french ] = "Modification du mot de passe" ;
    Text [ dutch ] = "Wachtwoordbeveiliging wijzigen" ;
    Text [ swedish ] = "Ändra lösenordsskydd" ;
    Text [ danish ] = "Modificer adgangskodebeskyttelse" ;
    Text [ portuguese ] = "Alterar protecção da senha" ;
    Text [ portuguese_brazilian ] = "Paßwortschutz ändern" ;
    Text[ chinese_simplified ] = "¸ü¸Ä±£»¤¿ÚÁî";
    Text[ russian ] = "Èçìåíèòü çàùèòó ïàðîëåì";
    Text[ polish ] = "Zmieñ ochronê has³a";
    Text[ japanese ] = "Ê߽ܰÄޕیì‚̕ύX";
    Text[ chinese_traditional ] = "Åܧó«OÅ@±K½X";
    Text[ arabic ] = "ÊÛííÑ ÍãÇíÉ ßáãÉ ÇáÓÑ";
    Text[ dutch ] = "Wachtwoordbeveiliging wijzigen";
    Text[ chinese_simplified ] = "¸ü¸Ä±£»¤¿ÚÁî";
    Text[ greek ] = "ÁëëáãÞ ðñïóôáóßáò êùäéêïý ðñüóâáóçò";
    Text[ korean ] = "ÆÐ½º¿öµå º¸È£ º¯°æ";
    Text[ turkish ] = "Þifre korumasýný deðiþtir";
    Text[ language_user1 ] = " ";
};
String STR_CHANGEDEFATTR
{
    TEXT = "Standardwerte ändern" ;
    TEXT [ English ] = "Defaults change" ;
    TEXT [ norwegian ] = "Endre standard" ;
    TEXT [ italian ] = "Cambia valori predefiniti" ;
    TEXT [ portuguese_brazilian ] = "Mudar padrões" ;
    TEXT [ portuguese ] = "Alterar valores padrão" ;
    TEXT [ finnish ] = "Muuta oletuksia" ;
    TEXT [ danish ] = "Modificer standardværdier" ;
    TEXT [ french ] = "Changement des valeurs standard" ;
    TEXT [ swedish ] = "Ändra de standardvärdena" ;
    TEXT [ dutch ] = "Standaardwaarden wijzigen" ;
    TEXT [ spanish ] = "Modificar valores estándar" ;
    TEXT [ english_us ] = "Modify default values" ;
    TEXT[ chinese_simplified ] = "¸ü¸Ä±ê×¼Öµ";
    TEXT[ russian ] = "Èçìåíèòü ñòàíäàðòíûå çíà÷åíèÿ";
    TEXT[ polish ] = "Zmieñ wartoœci domyœlne";
    TEXT[ japanese ] = "•W€’l‚̕ύX";
    TEXT[ chinese_traditional ] = "Åܧó¼Ð·Ç­È";
    TEXT[ arabic ] = "ÊÚÏíá ÇáÞíã ÇáÇÝÊÑÇÖíÉ";
    TEXT[ dutch ] = "Standaardwaarden wijzigen";
    TEXT[ chinese_simplified ] = "¸ü¸Ä±ê×¼Öµ";
    TEXT[ greek ] = "Ôñïðïðïßçóç ðñïåðéëåãìÝíùí ôéìþí";
    TEXT[ korean ] = "±âº»°ª ¼öÁ¤";
    TEXT[ turkish ] = "Standart deðerleri deðiþtir";
    TEXT[ language_user1 ] = " ";
};
String STR_OUTLINE_LR
{
    TEXT = "Gliederung stufen" ;
    TEXT [ English ] = "Outline promote" ;
    TEXT [ norwegian ] = "Framhev Omriss" ;
    TEXT [ italian ] = "Graduare struttura" ;
    TEXT [ portuguese_brazilian ] = "Promover vazado" ;
    TEXT [ portuguese ] = "Subir esquema" ;
    TEXT [ finnish ] = "Korota jäsennys" ;
    TEXT [ danish ] = "Inddel disposition" ;
    TEXT [ french ] = "Échelonner la structure" ;
    TEXT [ swedish ] = "Höja dispositionsnivån" ;
    TEXT [ dutch ] = "Overzichtsniveaus bepalen" ;
    TEXT [ spanish ] = "Escalonar Esquema" ;
    TEXT [ english_us ] = "Promote Outline" ;
    TEXT[ chinese_simplified ] = "·Ö¼¶´ó¸Ù";
    TEXT[ russian ] = "Óðîâíè ñòðóêòóðû";
    TEXT[ polish ] = "Poziomy konspektu";
    TEXT[ japanese ] = "±³Äײ݂ÌÚÍÞÙ";
    TEXT[ chinese_traditional ] = "¤À¯Å¤jºõ";
    TEXT[ arabic ] = "ÊÏÑíÌ ÇáÊÞÓíã";
    TEXT[ dutch ] = "Overzichtsniveaus bepalen";
    TEXT[ chinese_simplified ] = "·Ö¼¶´ó¸Ù";
    TEXT[ greek ] = "ÄéÜñèñùóç ìå åóï÷Ýò";
    TEXT[ korean ] = "°³¿ä ¼öÁØ ¿Ã¸®±â";
    TEXT[ turkish ] = "Anahatý deðiþtir";
    TEXT[ language_user1 ] = " ";
};
String STR_OUTLINE_UD
{
    TEXT = "Gliederung verschieben" ;
    TEXT [ English ] = "Outline move" ;
    TEXT [ norwegian ] = "Flytt omriss" ;
    TEXT [ italian ] = "Sposta struttura" ;
    TEXT [ portuguese_brazilian ] = "Mover vazado" ;
    TEXT [ portuguese ] = "Mover esquema" ;
    TEXT [ finnish ] = "Siirrä jäsennys" ;
    TEXT [ danish ] = "Flyt disposition" ;
    TEXT [ french ] = "Déplacer le plan" ;
    TEXT [ swedish ] = "Flytta disposition" ;
    TEXT [ dutch ] = "Overzicht verplaatsen" ;
    TEXT [ spanish ] = "Desplazar esquema" ;
    TEXT [ english_us ] = "Move outline" ;
    TEXT[ chinese_simplified ] = "ÒÆ¶¯´ó¸Ù";
    TEXT[ russian ] = "Ïåðåìåñòèòü ñòðóêòóðó";
    TEXT[ polish ] = "Przesuñ konspekt";
    TEXT[ japanese ] = "±³Äײ݂̈ړ®";
    TEXT[ chinese_traditional ] = "²¾°Ê¤jºõ";
    TEXT[ arabic ] = "äÞá ÇáÊÞÓíã";
    TEXT[ dutch ] = "Overzicht verplaatsen";
    TEXT[ chinese_simplified ] = "ÒÆ¶¯´ó¸Ù";
    TEXT[ greek ] = "Ìåôáêßíçóç äéÜñèñùóçò";
    TEXT[ korean ] = "°³¿ä À̵¿";
    TEXT[ turkish ] = "Anahatý taþý";
    TEXT[ language_user1 ] = " ";
};
String STR_INSNUM
{
    TEXT = "Nummerierung einfügen" ;
    TEXT [ English ] = "Numbering insert" ;
    TEXT [ norwegian ] = "Sett inn nummerering" ;
    TEXT [ italian ] = "Inserisci numerazione" ;
    TEXT [ portuguese_brazilian ] = "Inserir Numeração" ;
    TEXT [ portuguese ] = "Inserir numeração" ;
    TEXT [ finnish ] = "Lisää numerointi" ;
    TEXT [ danish ] = "Indsæt nummerering" ;
    TEXT [ french ] = "Insérer une numérotation" ;
    TEXT [ swedish ] = "Infoga numrering" ;
    TEXT [ dutch ] = "Nummering invoegen" ;
    TEXT [ spanish ] = "Insertar numeración" ;
    TEXT [ english_us ] = "Insert numbering" ;
    TEXT[ chinese_simplified ] = "²åÈë±àºÅ";
    TEXT[ russian ] = "Âñòàâèòü íóìåðàöèþ";
    TEXT[ polish ] = "Wstaw numeracjê";
    TEXT[ japanese ] = "”ԍ†•t‚¯‚Ì‘}“ü";
    TEXT[ chinese_traditional ] = "´¡¤J½s¸¹";
    TEXT[ arabic ] = "ÅÏÑÇÌ ÊÑÞíã";
    TEXT[ dutch ] = "Nummering invoegen";
    TEXT[ chinese_simplified ] = "²åÈë±àºÅ";
    TEXT[ greek ] = "ÐñïóèÞêç áñßèìçóçò";
    TEXT[ korean ] = "¹øÈ£ »ðÀÔ";
    TEXT[ turkish ] = "Numaralama ekle";
    TEXT[ language_user1 ] = " ";
};
String STR_NUMUPDOWN
{
    TEXT = "Nummerierung stufen" ;
    TEXT [ English ] = "Numbering promote" ;
    TEXT [ norwegian ] = "Framhev Nummerering" ;
    TEXT [ italian ] = "Sposta numerazione" ;
    TEXT [ portuguese_brazilian ] = "Mover Numeração" ;
    TEXT [ portuguese ] = "Escalonar numeração" ;
    TEXT [ finnish ] = "Korota numerointi" ;
    TEXT [ danish ] = "Inddel nummerering" ;
    TEXT [ french ] = "Échelonner la numérotation" ;
    TEXT [ swedish ] = "Flernivånumrering" ;
    TEXT [ dutch ] = "Nummering indelen" ;
    TEXT [ spanish ] = "Graduar numeración" ;
    TEXT [ english_us ] = "Shift numbering" ;
    TEXT[ chinese_simplified ] = "·Ö¼¶±àºÅ";
    TEXT[ russian ] = "Óðîâíè íóìåðàöèè";
    TEXT[ polish ] = "Poziomy numeracji";
    TEXT[ japanese ] = "”ԍ†•t‚¯‚Ì’iŠK•t‚¯";
    TEXT[ language_user1 ] = " ";
    TEXT[ chinese_traditional ] = "¤À¯Å½s¸¹";
    TEXT[ arabic ] = "ÊÏÑíÌ ÇáÊÑÞíã";
    TEXT[ dutch ] = "Nummering indelen";
    TEXT[ chinese_simplified ] = "·Ö¼¶±àºÅ";
    TEXT[ greek ] = "Áñßèìçóç ìå åóï÷Ýò";
    TEXT[ korean ] = "¹øÈ£ ¹Ð±â";
    TEXT[ turkish ] = "Numaralamayý deðiþtir";
};
String STR_MOVENUM
{
    TEXT = "Absätze verschieben" ;
    TEXT [ English ] = "Paragraph move" ;
    Text [ portuguese ] = "Mover parágrafos" ;
    Text [ english_us ] = "Move paragraphs" ;
    Text [ portuguese_brazilian ] = "Promover Numeração" ;
    Text [ swedish ] = "Flytta stycken" ;
    Text [ danish ] = "Flyt afsnit" ;
    Text [ italian ] = "Sposta paragrafi" ;
    Text [ spanish ] = "Desplazar párrafos" ;
    Text [ french ] = "Déplacer paragraphes" ;
    Text [ dutch ] = "Alinea´s verplaatsen" ;
    Text[ chinese_simplified ] = "ÒÆ¶¯¶ÎÂä";
    Text[ russian ] = "Ïåðåìåñòèòü àáçàöû";
    Text[ polish ] = "Przesuñ akapity";
    Text[ japanese ] = "’i—Ž‚ÌˆÚ“®";
    Text[ chinese_traditional ] = "²¾°Ê¬q¸¨";
    Text[ arabic ] = "ÅÒÇÍÉ ÇáÝÞÑÇÊ";
    Text[ dutch ] = "Alinea´s verplaatsen";
    Text[ chinese_simplified ] = "ÒÆ¶¯¶ÎÂä";
    Text[ greek ] = "ÌåôáöïñÜ ðáñáãñÜöùí";
    Text[ korean ] = "´Ü¶ô À̵¿";
    Text[ turkish ] = "Paragraflarý taþý";
    Text[ language_user1 ] = " ";
};
String STR_INSERTDRAW
{
    TEXT = "Zeichenobjekt einfügen" ;
    TEXT [ English ] = "Insert draw object" ;
    Text [ dutch ] = "Tekenobject invoegen" ;
    Text [ english_us ] = "Insert Draw Object" ;
    Text [ italian ] = "Inserisci oggetti di disegno" ;
    Text [ spanish ] = "Insertar objeto de dibujo" ;
    Text [ french ] = "Insérer un objet de dessin" ;
    Text [ swedish ] = "Infoga ritobjekt" ;
    Text [ danish ] = "Indsæt tegneobjekt" ;
    Text [ portuguese ] = "Inserir objecto de desenho" ;
    Text [ portuguese_brazilian ] = "Zeichenobjekt einfügen" ;
    Text[ chinese_simplified ] = "²åÈë»æÍ¼¶ÔÏó";
    Text[ russian ] = "Âñòàâèòü ãðàôè÷åñêèé îáúåêò";
    Text[ polish ] = "Wstaw obiekty rysunkowe";
    Text[ japanese ] = "•`‰æµÌÞ¼Þª¸Ä‚Ì‘}“ü";
    Text[ chinese_traditional ] = "´¡¤Jø¹Ïª«¥ó";
    Text[ arabic ] = "ÅÏÑÇÌ ßÇÆä ÑÓæãí";
    Text[ dutch ] = "Tekenobject invoegen";
    Text[ chinese_simplified ] = "²åÈë»æÍ¼¶ÔÏó";
    Text[ greek ] = "ÐñïóèÞêç áíôéêåéìÝíïõ ó÷åäßáóçò";
    Text[ korean ] = "±×¸®±â °³Ã¼ »ðÀÔ";
    Text[ turkish ] = "Çizim nesnesi ekle";
    Text[ language_user1 ] = " ";
};
String STR_NUMORNONUM
{
    TEXT = "Nummer an/aus" ;
    TEXT [ English ] = "Number on/off" ;
    Text [ english_us ] = "Number On/Off" ;
    Text [ italian ] = "Numero on/off" ;
    Text [ spanish ] = "Número activado/desactivado" ;
    Text [ french ] = "Numéro act./désact." ;
    Text [ dutch ] = "Nummer aan/uit" ;
    Text [ swedish ] = "Nummer på/av" ;
    Text [ danish ] = "Aktiver/deaktiver nummer" ;
    Text [ portuguese ] = "Número activado/des." ;
    Text [ portuguese_brazilian ] = "Nummer an/aus" ;
    Text[ chinese_simplified ] = "ÏÔʾ/ÒþÈë±àºÅ";
    Text[ russian ] = "Âêë./Îòêë. íîìåðà";
    Text[ polish ] = "W³¹cz/Wy³¹cz numer";
    Text[ japanese ] = "”ԍ† µÝ/µÌ";
    Text[ chinese_traditional ] = "Åã¥Ü/Áô¤J½s¸¹";
    Text[ arabic ] = "ÅÙåÇÑ/ÅÎÝÇÁ ÇáÑÞã";
    Text[ dutch ] = "Nummer aan/uit";
    Text[ chinese_simplified ] = "ÏÔʾ/ÒþÈë±àºÅ";
    Text[ greek ] = "Áñéèìüò Íáé/¼÷é";
    Text[ korean ] = "¹øÈ£ ÀÛµ¿/ÇØÁ¦";
    Text[ turkish ] = "Numara açýk/kapalý";
    Text[ language_user1 ] = " ";
};
String STR_INC_LEFTMARGIN
{
    TEXT = "Einzug vergrößern" ;
    TEXT [ English ] = "Increase Indent" ;
    Text [ dutch ] = "Inspringing vergroten" ;
    Text [ english_us ] = "Increase Indent" ;
    Text [ swedish ] = "Öka indrag" ;
    Text [ danish ] = "Forstør indrykning" ;
    Text [ italian ] = "Aumenta rientro" ;
    Text [ spanish ] = "Aumentar sangría" ;
    Text [ french ] = "Augmenter le retrait" ;
    Text [ portuguese ] = "Aumentar avanço" ;
    Text [ portuguese_brazilian ] = "Einzug vergrößern" ;
    Text[ chinese_simplified ] = "Ôö´óËõ½ø";
    Text[ russian ] = "Óâåëè÷èòü îòñòóï";
    Text[ polish ] = "Zwiêksz wciêcie";
    Text[ japanese ] = "²ÝÃÞÝĂ̊Ԋu‚ÌŠg‘å";
    Text[ chinese_traditional ] = "¼W¤jÁY±Æ";
    Text[ arabic ] = "ÒíÇÏÉ ÇáÅÒÇÍÉ";
    Text[ dutch ] = "Inspringing vergroten";
    Text[ chinese_simplified ] = "Ôö´óËõ½ø";
    Text[ greek ] = "Áýîçóç åóï÷Þò";
    Text[ korean ] = "µé¿©¾²±â";
    Text[ turkish ] = "Girintiyi büyüt";
    Text[ language_user1 ] = " ";
};
String STR_DEC_LEFTMARGIN
{
    TEXT = "Einzug verringern" ;
    TEXT [ English ] = "Decrease Indent" ;
    Text [ dutch ] = "Inspringing verkleinen" ;
    Text [ english_us ] = "Decrease indent" ;
    Text [ swedish ] = "Minska indrag" ;
    Text [ danish ] = "Formindsk indrykning" ;
    Text [ italian ] = "Riduci rientro" ;
    Text [ spanish ] = "Disminuir sangría" ;
    Text [ french ] = "Diminuer le retrait" ;
    Text [ portuguese ] = "Reduzir avanço de parágrafo" ;
    Text [ portuguese_brazilian ] = "Einzug verringern" ;
    Text[ chinese_simplified ] = "¼õÉÙËõ½ø";
    Text[ russian ] = "Óìåíüøèòü îòñòóï";
    Text[ polish ] = "Zmiejsz wciêcie";
    Text[ japanese ] = "²ÝÃÞÝĊԊu‚̏k¬";
    Text[ chinese_traditional ] = "´î¤ÖÁY±Æ";
    Text[ arabic ] = "ÅäÞÇÕ ÇáÅÒÇÍÉ";
    Text[ dutch ] = "Inspringing verkleinen";
    Text[ chinese_simplified ] = "¼õÉÙËõ½ø";
    Text[ greek ] = "Ìåßùóç åóï÷Þò";
    Text[ korean ] = "³»¾î¾²±â";
    Text[ turkish ] = "Girintiyi küçült";
    Text[ language_user1 ] = " ";
};
String STR_INSERTLABEL
{
    Text = "Beschriftung einfügen" ;
    Text [ English ] = "Insert caption" ;
    Text [ english_us ] = "Insert caption" ;
    Text [ portuguese_brazilian ] = "Beschriftung einfügen" ;
    Text [ swedish ] = "Infoga bildtext" ;
    Text [ danish ] = "Indsæt billedtekst" ;
    Text [ italian ] = "Inserisci dicitura" ;
    Text [ spanish ] = "Insertar etiqueta" ;
    Text [ french ] = "Insérer une légende" ;
    Text [ dutch ] = "Bijschrift invoegen" ;
    Text [ portuguese ] = "Inserir legenda" ;
    Text[ chinese_simplified ] = "²åÈë±êÇ©";
    Text[ russian ] = "Âñòàâèòü íàçâàíèå";
    Text[ polish ] = "Wstaw legendê";
    Text[ japanese ] = "×ÍÞق̑}“ü";
    Text[ chinese_traditional ] = "´¡¤J¼ÐÅÒ";
    Text[ arabic ] = "ÅÏÑÇÌ ÊÓãíÉ ÊæÖíÍíÉ";
    Text[ dutch ] = "Bijschrift invoegen";
    Text[ chinese_simplified ] = "²åÈë±êÇ©";
    Text[ greek ] = "ÐñïóèÞêç åðéãñáöÞò";
    Text[ korean ] = "ĸ¼Ç »ðÀÔ";
    Text[ turkish ] = "Etiket ekle";
    Text[ language_user1 ] = " ";
};
String STR_SETNUMRULESTART
{
    Text = "Nummerierung neu starten" ;
    Text [ English ] = "Start numbering" ;
    Text [ portuguese ] = "Reiniciar numeração" ;
    Text [ english_us ] = "Restart numbering" ;
    Text [ portuguese_brazilian ] = "Numerierung neu starten" ;
    Text [ swedish ] = "Starta numrering på nytt" ;
    Text [ danish ] = "Genstart nummerering" ;
    Text [ italian ] = "Riavvia la numerazione" ;
    Text [ spanish ] = "Reiniciar numeración" ;
    Text [ french ] = "Reprendre la numérotation" ;
    Text [ dutch ] = "Nieuwe nummering" ;
    Text[ chinese_simplified ] = "ÖØÐ¿ªÊ¼±àºÅ";
    Text[ russian ] = "Ïåðåçàïóñê íóìåðàöèè";
    Text[ polish ] = "W³¹cz ponownie numeracjê";
    Text[ japanese ] = "”ԍ†•t‚¯‚ðV‚µ‚­ŠJŽn";
    Text[ chinese_traditional ] = "­«·s½s¸¹";
    Text[ arabic ] = "ÅÚÇÏÉ ÈÏÁ ÇáÊÑÞíã";
    Text[ dutch ] = "Nieuwe nummering";
    Text[ chinese_simplified ] = "ÖØÐ¿ªÊ¼±àºÅ";
    Text[ greek ] = "Åðáíåêêßíçóç áñßèìçóçò";
    Text[ korean ] = "¹øÈ£ ´Ù½Ã ½ÃÀÛ";
    Text[ turkish ] = "Numaralamayý yeniden baþlat";
    Text[ language_user1 ] = " ";
};
String STR_CHANGEFTN
{
    Text = "Fußnote ändern" ;
    Text [ English ] = "Change footnote" ;
    Text [ portuguese ] = "Modificar nota de rodapé" ;
    Text [ english_us ] = "Modify footnote" ;
    Text [ portuguese_brazilian ] = "Fußnote ändern" ;
    Text [ swedish ] = "Ändra fotnot" ;
    Text [ danish ] = "Modificer fodnote" ;
    Text [ italian ] = "Modifica nota a piè pagina" ;
    Text [ spanish ] = "Modificar nota al pie" ;
    Text [ french ] = "Modifier note de bas de page" ;
    Text [ dutch ] = "Voetnoot wijzigingen" ;
    Text[ chinese_simplified ] = "¸ü¸Ä×¢½Å";
    Text[ russian ] = "Èçìåíèòü ñíîñêó";
    Text[ polish ] = "Zmodyfikuj przypis dolny";
    Text[ japanese ] = "‹r’‚̕ύX";
    Text[ chinese_traditional ] = "Åܧóµù¸}";
    Text[ arabic ] = "ÊÚÏíá ÇáÍÇÔíÉ ÇáÓÝáíÉ";
    Text[ dutch ] = "Voetnoot wijzigingen";
    Text[ chinese_simplified ] = "¸ü¸Ä×¢½Å";
    Text[ greek ] = "Ôñïðïðïßçóç õðïóçìåßùóçò";
    Text[ korean ] = "°¢ÁÖ ¼öÁ¤";
    Text[ turkish ] = "Dipnotu deðiþtir";
    Text[ language_user1 ] = " ";
};
String STR_REDLINE
{
    /* !! sollte NIE gebraucht/uebersetzt werden !! */
    Text = "Redline" ;
};
String STR_ACCEPT_REDLINE
{
    Text = "Änderung akzeptieren" ;
    Text [ English ] = "Accept redline" ;
    Text [ english_us ] = "Accept changes" ;
    Text [ portuguese_brazilian ] = "Änderung akzeptieren" ;
    Text [ swedish ] = "Acceptera ändring" ;
    Text [ danish ] = "Accepter ændring" ;
    Text [ italian ] = "Accetta le modifiche" ;
    Text [ spanish ] = "Aceptar modificación" ;
    Text [ french ] = "Accepter la modification" ;
    Text [ dutch ] = "Wijziging accepteren" ;
    Text [ portuguese ] = "Aceitar modificações" ;
    Text[ chinese_simplified ] = "½ÓÊܸü¸Ä";
    Text[ russian ] = "Ïðèíÿòü èçìåíåíèÿ";
    Text[ polish ] = "Zaakceptuj zmiany";
    Text[ japanese ] = "•ύX‚ðŽó‚¯“ü‚ê‚é";
    Text[ chinese_traditional ] = "±µ¨üÅܧó";
    Text[ arabic ] = "ÞÈæá ÇáÊÛííÑÇÊ";
    Text[ dutch ] = "Wijziging accepteren";
    Text[ chinese_simplified ] = "½ÓÊܸü¸Ä";
    Text[ greek ] = "Áðïäï÷Þ áëëáãþí";
    Text[ korean ] = "º¯°æ Àû¿ë";
    Text[ turkish ] = "Deðiþiklikleri kaydet";
    Text[ language_user1 ] = " ";
};
String STR_REJECT_REDLINE
{
    Text = "Änderung ablehnen" ;
    Text [ English ] = "Reject redline" ;
    Text [ portuguese ] = "Rejeitar alteração" ;
    Text [ english_us ] = "Reject change" ;
    Text [ portuguese_brazilian ] = "Änderung ablehnen" ;
    Text [ swedish ] = "Ignorera ändring" ;
    Text [ danish ] = "Forkast ændring" ;
    Text [ italian ] = "Rifiuta modifica" ;
    Text [ spanish ] = "Rechazar modificación" ;
    Text [ french ] = "Rejeter la modification" ;
    Text [ dutch ] = "Wijziging verwerpen" ;
    Text[ chinese_simplified ] = "¾Ü¾ø¸ü¸Ä";
    Text[ russian ] = "Îòêëîíèòü èçìåíåíèÿ";
    Text[ polish ] = "Odrzuæ zmiany";
    Text[ japanese ] = "•ύX‚ðŽó‚¯“ü‚ê‚È‚¢";
    Text[ chinese_traditional ] = "©Úµ´Åܧó";
    Text[ arabic ] = "ÑÝÖ ÇáÊÛííÑ";
    Text[ dutch ] = "Wijziging verwerpen";
    Text[ chinese_simplified ] = "¾Ü¾ø¸ü¸Ä";
    Text[ greek ] = "Áðüññéøç áëëáãþí";
    Text[ korean ] = "º¯°æ °ÅºÎ";
    Text[ turkish ] = "Deðiþikliði reddet";
    Text[ language_user1 ] = " ";
};
String STR_SPLIT_TABLE
{
    Text = "Tabelle auftrennen" ;
    Text [ English ] = "Split table" ;
    Text [ portuguese ] = "Dividir tabela" ;
    Text [ english_us ] = "Split Table" ;
    Text [ portuguese_brazilian ] = "Tabelle teilen" ;
    Text [ swedish ] = "Dela tabell" ;
    Text [ danish ] = "Opdel tabel" ;
    Text [ italian ] = "Dividi tabella" ;
    Text [ spanish ] = "Dividir tabla" ;
    Text [ french ] = "Scinder le tableau" ;
    Text [ dutch ] = "Tabel splitsen" ;
    Text[ chinese_simplified ] = "·Ö¸ô±í¸ñ";
    Text[ russian ] = "Ðàçáèòü òàáëèöó";
    Text[ polish ] = "Rozdziel tabelê";
    Text[ japanese ] = "•\\‚Ì•ªŠ„";
    Text[ chinese_traditional ] = "¤À¶}ªí®æ";
    Text[ arabic ] = "ÝÕá ÇáÌÏæá";
    Text[ dutch ] = "Tabel splitsen";
    Text[ chinese_simplified ] = "·Ö¸ô±í¸ñ";
    Text[ greek ] = "Äéáßñåóç ðßíáêá";
    Text[ korean ] = "Ç¥ ³ª´©±â";
    Text[ turkish ] = "Tabloyu böl";
    Text[ language_user1 ] = " ";
};
String STR_DONTEXPAND
{
    Text = "Attribut stoppen" ;
    Text [ English ] = "Stop attribute" ;
    Text [ portuguese ] = "Parar atributo" ;
    Text [ english_us ] = "Stop attribute" ;
    Text [ portuguese_brazilian ] = "Attribut stoppen" ;
    Text [ swedish ] = "Stoppa attribut" ;
    Text [ danish ] = "Stop attribut" ;
    Text [ italian ] = "Interrompi attributo" ;
    Text [ spanish ] = "Detener atributo" ;
    Text [ french ] = "Arrêter" ;
    Text [ dutch ] = "Attribuut stoppen" ;
    Text[ chinese_simplified ] = "Í£Ö¹ÏÔʾÊôÐÔ";
    Text[ russian ] = "Îñòàíîâèòü àòðèáóò";
    Text[ polish ] = "Zatrzymaj atrybuty";
    Text[ japanese ] = "‘®«‚Ì’†Ž~";
    Text[ chinese_traditional ] = "°±¤îÅã¥ÜÄÝ©Ê";
    Text[ arabic ] = "æÞÝ ÇáÓãÇÊ";
    Text[ dutch ] = "Attribuut stoppen";
    Text[ chinese_simplified ] = "Í£Ö¹ÏÔʾÊôÐÔ";
    Text[ greek ] = "ÄéáêïðÞ éäéüôçôáò";
    Text[ korean ] = "¼Ó¼º ÁßÁö";
    Text[ turkish ] = "Özniteliði durdur";
    Text[ language_user1 ] = " ";
};
String STR_AUTOCORRECT
{
    Text = "AutoKorrektur" ;
    Text [ English ] = "AutoCorrect" ;
    Text [ portuguese ] = "AutoCorrecção" ;
    Text [ english_us ] = "AutoCorrect" ;
    Text [ portuguese_brazilian ] = "AutoKorrektur" ;
    Text [ swedish ] = "AutoKorrigering" ;
    Text [ danish ] = "AutoKorrektur" ;
    Text [ italian ] = "Correzione automatica" ;
    Text [ spanish ] = "AutoCorrección" ;
    Text [ french ] = "AutoCorrection" ;
    Text [ dutch ] = "AutoCorrectie" ;
    Text[ chinese_simplified ] = "×Ô¶¯¸üÕý";
    Text[ russian ] = "Àâòîçàìåíà";
    Text[ polish ] = "Autokorekta";
    Text[ japanese ] = "µ°ÄºÚ¸Ä";
    Text[ chinese_traditional ] = "¦Û°Ê®Õ¥¿";
    Text[ arabic ] = "ÊÕÍíÍ ÊáÞÇÆí";
    Text[ dutch ] = "AutoCorrectie";
    Text[ chinese_simplified ] = "×Ô¶¯¸üÕý";
    Text[ greek ] = "ÁõôïÄéüñèùóç";
    Text[ korean ] = "ÀÚµ¿ °íħ";
    Text[ turkish ] = "Otomatik düzeltme";
    Text[ language_user1 ] = " ";
};
String STR_MERGE_TABLE
{
    Text = "Tabelle verbinden" ;
    Text [ English ] = "Merge table" ;
    Text[ english_us ] = "Merge table";
    Text[ portuguese ] = "Unir tabela";
    Text[ russian ] = "Îáúåäèíèòü òàáëèöó";
    Text[ dutch ] = "Tabel verbinden";
    Text[ french ] = "Fusionner des tableaux";
    Text[ spanish ] = "unir tablas";
    Text[ italian ] = "Collega tabella";
    Text[ danish ] = "Flet tabeller";
    Text[ swedish ] = "Förbind tabeller";
    Text[ polish ] = "Scal tabelê";
    Text[ portuguese_brazilian ] = "Merge table";
    Text[ japanese ] = "•\\‚ÌŒ‹‡";
    Text[ chinese_simplified ] = "ºÏ²¢±í¸ñ";
    Text[ chinese_traditional ] = "¦X¦}ªí®æ";
    Text[ arabic ] = "æÕá ÇáÌÏæá";
    Text[ dutch ] = "Tabel verbinden";
    Text[ chinese_simplified ] = "ºÏ²¢±í¸ñ";
    Text[ greek ] = "Óýíäåóç ðéíÜêùí";
    Text[ korean ] = "Ç¥ º´ÇÕ";
    Text[ turkish ] = "Tabloyu birleþtir";
    Text[ language_user1 ] = " ";
};

String STR_DELNUM
{
    TEXT = "Nummerierung löschen" ;
    TEXT [ English ] = "Numbering delete" ;
    TEXT [ norwegian ] = "Slett nummerering" ;
    TEXT [ italian ] = "Elimina numerazione" ;
    TEXT [ portuguese_brazilian ] = "Apagar Numeração" ;
    TEXT [ portuguese ] = "Eliminar numeração" ;
    TEXT [ finnish ] = "Poista numerointi" ;
    TEXT [ danish ] = "Slet nummerering" ;
    TEXT [ french ] = "Supprimer la numérotation" ;
    TEXT [ swedish ] = "Radera numrering" ;
    TEXT [ dutch ] = "Nummering wissen" ;
    TEXT [ spanish ] = "Eliminar numeración" ;
    TEXT [ english_us ] = "Delete numbering" ;
    TEXT[ chinese_simplified ] = "ɾ³ý±àºÅ";
    TEXT[ russian ] = "Óäàëèòü íóìåðàöèþ";
    TEXT[ polish ] = "Usuñ numeracjê";
    TEXT[ japanese ] = "”ԍ†•t‚¯‚̍폜";
    TEXT[ chinese_traditional ] = "§R°£½s¸¹";
    TEXT[ arabic ] = "ÍÐÝ ÇáÊÑÞíã";
    TEXT[ dutch ] = "Nummering wissen";
    TEXT[ chinese_simplified ] = "ɾ³ý±àºÅ";
    TEXT[ greek ] = "ÄéáãñáöÞ áñßèìçóçò";
    TEXT[ korean ] = "¹øÈ£ Á¦°Å";
    TEXT[ turkish ] = "Numaralamayý sil";
    TEXT[ language_user1 ] = " ";
};
String STR_DRAWUNDO
{
    TEXT = "Zeichenobjekte" ;
    TEXT [ English ] = "Drawobjects" ;
    Text [ english_us ] = "Draw objects" ;
    Text [ italian ] = "Oggetti di disegno" ;
    Text [ spanish ] = "Objetos de dibujo" ;
    Text [ french ] = "Objets de dessin" ;
    Text [ dutch ] = "Tekenobjecten" ;
    Text [ swedish ] = "Ritobjekt" ;
    Text [ danish ] = "Tegneobjekter" ;
    Text [ portuguese ] = "Objectos de desenho" ;
    Text [ portuguese_brazilian ] = "Zeichenobjekte" ;
    Text[ chinese_simplified ] = "»æÍ¼¶ÔÏó";
    Text[ russian ] = "Ãðàôè÷åñêèé îáúåêò";
    Text[ polish ] = "Obiekty rysunkowe";
    Text[ japanese ] = "}Œ`•`‰æµÌÞ¼Þª¸Ä";
    Text[ chinese_traditional ] = "ø¹Ïª«¥ó";
    Text[ arabic ] = "ßÇÆäÇÊ ÑÓæãíÉ";
    Text[ dutch ] = "Tekenobjecten";
    Text[ chinese_simplified ] = "»æÍ¼¶ÔÏó";
    Text[ greek ] = "Áíôéêåßìåíá ó÷åäßáóçò";
    Text[ korean ] = "±×¸®±â °³Ã¼";
    Text[ turkish ] = "Çizim nesneleri";
    Text[ language_user1 ] = " ";
};
String STR_DRAWGROUP
{
    TEXT = "Zeichenobjekte gruppieren" ;
    TEXT [ English ] = "Group Drawobjects" ;
    Text [ dutch ] = "Tekenobjecten groeperen" ;
    Text [ english_us ] = "Group draw objects" ;
    Text [ italian ] = "Raggruppa oggetti di disegno" ;
    Text [ spanish ] = "Agrupar objetos de dibujo" ;
    Text [ french ] = "Grouper des objets de dessin" ;
    Text [ swedish ] = "Gruppera ritobjekt" ;
    Text [ danish ] = "Grupper tegneobjekter" ;
    Text [ portuguese ] = "Agrupar objectos de desenho" ;
    Text [ portuguese_brazilian ] = "Zeichenobjekte gruppieren" ;
    Text[ chinese_simplified ] = "·Ö×é»æÍ¼¶ÔÏó";
    Text[ russian ] = "Ãðóïïèðîâàòü ãðàôè÷åñêèå îáúåêòû";
    Text[ polish ] = "Grupuj obiekty rysunkowe";
    Text[ japanese ] = "}Œ`•`‰æ‚ð¸ÞÙ°Ì߉»‚·‚é";
    Text[ chinese_traditional ] = "ø¹Ïª«¥ó¸s²Õ";
    Text[ arabic ] = "ÊÌãíÚ ßÇÆäÇÊ ÑÓæãíÉ";
    Text[ dutch ] = "Tekenobjecten groeperen";
    Text[ chinese_simplified ] = "·Ö×é»æÍ¼¶ÔÏó";
    Text[ greek ] = "Ïìáäïðïßçóç áíôéêåéìÝíùí ó÷åäßáóçò";
    Text[ korean ] = "±×¸®±â °³Ã¼ ±×·ì";
    Text[ turkish ] = "Çizim nesnelerini grupla";
    Text[ language_user1 ] = " ";
};
String STR_DRAWUNGROUP
{
    TEXT = "Gruppenobjekt auflösen" ;
    TEXT [ English ] = "Ungroup Drawobjects" ;
    Text [ english_us ] = "Ungroup drawing objects" ;
    Text [ italian ] = "Sciogli gruppo oggetti" ;
    Text [ spanish ] = "Resolver objeto de grupo" ;
    Text [ french ] = "Dissocier objets de dessin" ;
    Text [ dutch ] = "Groepsobject opheffen" ;
    Text [ swedish ] = "Upplös gruppobjekt" ;
    Text [ danish ] = "Ophæv gruppeobjekter" ;
    Text [ portuguese ] = "Desagrupar objectos" ;
    Text [ portuguese_brazilian ] = "Gruppenobjekt auflösen" ;
    Text[ chinese_simplified ] = "È¡Ïû·Ö×é¶ÔÏó";
    Text[ russian ] = "Ðàçãðóïïèðîâàòü ãðàôè÷åñêèé îáúåêò";
    Text[ polish ] = "Rozgrupuj obiekty rysunkowe";
    Text[ japanese ] = "¸ÞÙ°Ì߉»‚³‚ꂽµÌÞ¼Þ­¸Ä‚̉ðœ";
    Text[ chinese_traditional ] = "¨ú®ø¸s²Õª«¥ó";
    Text[ arabic ] = "Ýß ÊÌãíÚ ÇáßÇÆäÇÊ";
    Text[ dutch ] = "Groepsobject opheffen";
    Text[ chinese_simplified ] = "È¡Ïû·Ö×é¶ÔÏó";
    Text[ greek ] = "ÊáôÜñãçóç ïìáäïðïßçóçò áíôéêåéìÝíùí";
    Text[ korean ] = "±×¸®±â °³Ã¼ ±×·ìÇØÁ¦";
    Text[ turkish ] = "Nesne grubunu çöz";
    Text[ language_user1 ] = " ";
};
String STR_DRAWDELETE
{
    TEXT = "Zeichenobjekte löschen" ;
    TEXT [ English ] = "Delete DrawObjects" ;
    Text [ dutch ] = "Tekenobjecten wissen" ;
    Text [ english_us ] = "Delete drawing objects" ;
    Text [ italian ] = "Elimina oggetti di disegno" ;
    Text [ spanish ] = "Eliminar objetos de dibujo" ;
    Text [ french ] = "Supprimer des objets de dessin" ;
    Text [ swedish ] = "Radera ritobjekt" ;
    Text [ danish ] = "Slet tegneobjekter" ;
    Text [ portuguese ] = "Eliminar objectos de desenho" ;
    Text [ portuguese_brazilian ] = "Zeichenobjekte löschen" ;
    Text[ chinese_simplified ] = "ɾ³ý»æÍ¼¶ÔÏó";
    Text[ russian ] = "Óäàëèòü ãðàôè÷åñêèå îáúåêòû";
    Text[ polish ] = "Usuñ obiekty rysunkowe";
    Text[ japanese ] = "}Œ`•`‰æµÌÞ¼Þª¸Ä‚ð‰ðœ";
    Text[ chinese_traditional ] = "§R°£Ã¸¹Ïª«¥ó";
    Text[ arabic ] = "ÍÐÝ ßÇÆäÇÊ ÑÓæãíÉ";
    Text[ dutch ] = "Tekenobjecten wissen";
    Text[ chinese_simplified ] = "ɾ³ý»æÍ¼¶ÔÏó";
    Text[ greek ] = "ÄéáãñáöÞ áíôéêåéìÝíùí ó÷åäßáóçò";
    Text[ korean ] = "±×¸®±â °³Ã¼ »èÁ¦";
    Text[ turkish ] = "Çizim nesnelerini sil";
    Text[ language_user1 ] = " ";
};
String STR_REREAD
{
    TEXT = "Grafik ersetzen" ;
    TEXT [ English ] = "Replace Picture" ;
    Text [ english_us ] = "Replace graphics" ;
    Text [ italian ] = "Sostituisci l'immagine" ;
    Text [ spanish ] = "Reemplazar imagen" ;
    Text [ french ] = "Remplacer l'image" ;
    Text [ dutch ] = "Afbeelding vervangen" ;
    Text [ swedish ] = "Ersätt grafik" ;
    Text [ danish ] = "Erstat grafik" ;
    Text [ portuguese ] = "Substituir imagem" ;
    Text [ portuguese_brazilian ] = "Grafik ersetzen" ;
    Text[ chinese_simplified ] = "¸üÌæÍ¼ÐÎ";
    Text[ russian ] = "Çàìåíèòü ãðàôèêó";
    Text[ polish ] = "Zamieñ grafikê";
    Text[ japanese ] = "¸Þ×̨¯¸‚Ì’uŠ·";
    Text[ chinese_traditional ] = "¥N´À¹Ï¤ù";
    Text[ arabic ] = "ÇÓÊÈÏÇá ÇáÑÓæãÇÊ";
    Text[ dutch ] = "Afbeelding vervangen";
    Text[ chinese_simplified ] = "¸üÌæÍ¼ÐÎ";
    Text[ greek ] = "ÁíôéêáôÜóôáóç ãñáöéêþí";
    Text[ korean ] = "±×·¡ÇÈ ¹Ù²Ù±â";
    Text[ turkish ] = "Grafiði deðiþtirmek";
    Text[ language_user1 ] = " ";
};
String STR_DELGRF
{
    TEXT = "Grafik löschen" ;
    TEXT [ English ] = "Delete Picture" ;
    Text [ dutch ] = "Afbeelding wissen" ;
    Text [ english_us ] = "Delete graphics" ;
    Text [ italian ] = "Elimina immagine" ;
    Text [ spanish ] = "Eliminar imagen" ;
    Text [ french ] = "Supprimer l'image" ;
    Text [ swedish ] = "Radera grafik" ;
    Text [ danish ] = "Slet billede" ;
    Text [ portuguese ] = "Eliminar imagem" ;
    Text [ portuguese_brazilian ] = "Grafik löschen" ;
    Text[ chinese_simplified ] = "ɾ³ýͼÐÎ";
    Text[ russian ] = "Óäàëèòü";
    Text[ polish ] = "Usuñ grafikê";
    Text[ japanese ] = "¸Þ×̨¯¸‚̍폜";
    Text[ chinese_traditional ] = "§R°£¹Ï¤ù";
    Text[ arabic ] = "ÍÐÝ ÕæÑÉ";
    Text[ dutch ] = "Afbeelding wissen";
    Text[ chinese_simplified ] = "ɾ³ýͼÐÎ";
    Text[ greek ] = "ÄéáãñáöÞ ãñáöéêïý";
    Text[ korean ] = "±×·¡ÇÈ »èÁ¦";
    Text[ turkish ] = "Grafiði sil";
    Text[ language_user1 ] = " ";
};
String STR_DELOLE
{
    TEXT = "Objekt löschen" ;
    TEXT [ English ] = "Delete Object" ;
    Text [ english_us ] = "Delete object" ;
    Text [ italian ] = "Elimina oggetto" ;
    Text [ spanish ] = "Eliminar objeto" ;
    Text [ french ] = "Supprimer l'objet" ;
    Text [ dutch ] = "Object wissen" ;
    Text [ swedish ] = "Radera objekt" ;
    Text [ danish ] = "Slet objekt" ;
    Text [ portuguese ] = "Eliminar objecto" ;
    Text [ portuguese_brazilian ] = "Objekt löschen" ;
    Text[ chinese_simplified ] = "ɾ³ý¶ÔÏó";
    Text[ russian ] = "Óäàëèòü îáúåêò";
    Text[ polish ] = "Usuñ obiekt";
    Text[ japanese ] = "µÌÞ¼Þª¸Ä‚̍폜";
    Text[ chinese_traditional ] = "§R°£ª«¥ó";
    Text[ arabic ] = "ÍÐÝ ßÇÆä";
    Text[ dutch ] = "Object wissen";
    Text[ chinese_simplified ] = "ɾ³ý¶ÔÏó";
    Text[ greek ] = "ÄéáãñáöÞ áíôéêåéìÝíïõ";
    Text[ korean ] = "°³Ã¼ »èÁ¦";
    Text[ turkish ] = "Nesneyi sil";
    Text[ language_user1 ] = " ";
};
String STR_TABLE_ATTR
{
    TEXT = "Tabellenattribute anwenden" ;
    TEXT [ English ] = "Apply table attributes" ;
    Text [ english_us ] = "Apply table attributes" ;
    Text [ italian ] = "Utilizza gli attributi della tabella" ;
    Text [ spanish ] = "Aplicar atributos de la tabla" ;
    Text [ french ] = "Appliquer les attributs de tableau" ;
    Text [ dutch ] = "Tabelattributen toepassen" ;
    Text [ swedish ] = "Använd tabellattribut" ;
    Text [ danish ] = "Anvend tabelattributter" ;
    Text [ portuguese ] = "Aplicar atributos da tabela" ;
    Text [ portuguese_brazilian ] = "Tabellenattribute anwenden" ;
    Text[ chinese_simplified ] = "ʹÓñí¸ñÊôÐÔ";
    Text[ russian ] = "Ïðèìåíèòü àòðèáóòû òàáëèöû";
    Text[ polish ] = "Zastosuj atrybuty tabeli";
    Text[ japanese ] = "•\\‚Ì‘®«‚Ì“K—p";
    Text[ chinese_traditional ] = "¨Ï¥Îªí®æÄÝ©Ê";
    Text[ arabic ] = "ÇÓÊÎÏÇã ÓãÇÊ ÇáÌÏæá";
    Text[ dutch ] = "Tabelattributen toepassen";
    Text[ chinese_simplified ] = "ʹÓñí¸ñÊôÐÔ";
    Text[ greek ] = "ÅöáñìïãÞ éäéïôÞôùí ðßíáêá";
    Text[ korean ] = "Ç¥ ¼Ó¼º Àû¿ë";
    Text[ turkish ] = "Tablo özniteliklerini kullan";
    Text[ language_user1 ] = " ";
};
String STR_TABLE_AUTOFMT
{
    TEXT = "Autoformat Tabelle" ;
    TEXT [ English ] = "Autoformat Table" ;
    Text [ english_us ] = "AutoFormat Table" ;
    Text [ italian ] = "Formattazione automatica tabella" ;
    Text [ spanish ] = "AutoFormato tabla" ;
    Text [ french ] = "AutoFormat de tableau" ;
    Text [ dutch ] = "AutoOpmaak tabel" ;
    Text [ swedish ] = "AutoFormat Tabell" ;
    Text [ danish ] = "AutoFormat tabel" ;
    Text [ portuguese ] = "AutoFormato tabela" ;
    Text [ portuguese_brazilian ] = "Autoformat Tabelle" ;
    Text[ chinese_simplified ] = "×Ô¶¯¸ñʽ ±í¸ñ";
    Text[ russian ] = "Àâòîôîðìàò òàáëèöû";
    Text[ polish ] = "Autoformatowanie Tabela";
    Text[ japanese ] = "µ°ÄÌ«°Ï¯Ä •\\";
    Text[ chinese_traditional ] = "¦Û°Ê®æ¦¡ ªí®æ";
    Text[ arabic ] = "ÊäÓíÞ ÊáÞÇÆí ááÌÏæá";
    Text[ dutch ] = "AutoOpmaak tabel";
    Text[ chinese_simplified ] = "×Ô¶¯¸ñʽ ±í¸ñ";
    Text[ greek ] = "ÁõôïÌïñöïðïßçóç ðßíáêá";
    Text[ korean ] = "ÀÚµ¿ ¼­½Ä Ç¥";
    Text[ turkish ] = "Otomatik formatlama Tablo";
    Text[ language_user1 ] = " ";
};
String STR_TABLE_INSCOL
{
    Text = "Spalte einfügen" ;
    Text [ ENGLISH ] = "Insert column" ;
    Text [ norwegian ] = "Sett inn kolonne" ;
    Text [ italian ] = "Inserisci colonna" ;
    Text [ portuguese_brazilian ] = "Inserir coluna" ;
    Text [ portuguese ] = "Inserir coluna" ;
    Text [ finnish ] = "Lisää sarake" ;
    Text [ danish ] = "Indsæt kolonne" ;
    Text [ french ] = "Insérer une colonne" ;
    Text [ swedish ] = "Infoga kolumn" ;
    Text [ dutch ] = "Kolom invoegen" ;
    Text [ spanish ] = "Insertar columna" ;
    Text [ english_us ] = "Insert Column" ;
    Text[ chinese_simplified ] = "²åÈëÁÐ";
    Text[ russian ] = "Âñòàâèòü ñòîëáåö";
    Text[ polish ] = "Wstaw kolumnê";
    Text[ japanese ] = "—ñ‚Ì‘}“ü";
    Text[ chinese_traditional ] = "´¡¤JÄæ";
    Text[ arabic ] = "ÅÏÑÇÌ ÚãæÏ";
    Text[ dutch ] = "Kolom invoegen";
    Text[ chinese_simplified ] = "²åÈëÁÐ";
    Text[ greek ] = "ÅéóáãùãÞ óôÞëçò";
    Text[ korean ] = "¿­ »ðÀÔ";
    Text[ turkish ] = "Sütunu ekle";
    Text[ language_user1 ] = " ";
};
String STR_TABLE_INSROW
{
    Text = "Zeile einfügen" ;
    Text [ ENGLISH ] = "Insert row" ;
    Text [ norwegian ] = "Sett inn rad" ;
    Text [ italian ] = "Inserisci riga" ;
    Text [ portuguese_brazilian ] = "Inserir fileira" ;
    Text [ portuguese ] = "Inserir linha" ;
    Text [ finnish ] = "Lisää rivi" ;
    Text [ danish ] = "Indsæt række" ;
    Text [ french ] = "Insérer une ligne" ;
    Text [ swedish ] = "Infoga rad" ;
    Text [ dutch ] = "Rij invoegen" ;
    Text [ spanish ] = "Insertar fila" ;
    Text [ english_us ] = "Insert Row" ;
    Text[ chinese_simplified ] = "²åÈëÐÐ";
    Text[ russian ] = "Âñòàâèòü ñòðîêó";
    Text[ polish ] = "Wstaw wiersz";
    Text[ japanese ] = "s‚Ì‘}“ü";
    Text[ chinese_traditional ] = "´¡¤J¦æ";
    Text[ arabic ] = "ÅÏÑÇÌ ÕÝ";
    Text[ dutch ] = "Rij invoegen";
    Text[ chinese_simplified ] = "²åÈëÐÐ";
    Text[ greek ] = "ÅéóáãùãÞ ãñáììÞò";
    Text[ korean ] = "Çà »ðÀÔ";
    Text[ turkish ] = "Satýr ekle";
    Text[ language_user1 ] = " ";
};
String STR_TABLE_DELBOX
{
    Text = "Zeile/Spalte löschen" ;
    Text [ ENGLISH ] = "Delete row/column" ;
    Text [ norwegian ] = "Slett rad/kolonne" ;
    Text [ italian ] = "Elimina riga/colonna" ;
    Text [ portuguese_brazilian ] = "Apagar fileira/coluna" ;
    Text [ portuguese ] = "Eliminar linha/coluna" ;
    Text [ finnish ] = "Poista rivi/sarake" ;
    Text [ danish ] = "Slet række/kolonne" ;
    Text [ french ] = "Supprimer la ligne/colonne" ;
    Text [ swedish ] = "Radera rad/kolumn" ;
    Text [ dutch ] = "Rij/Kolom wissen" ;
    Text [ spanish ] = "Eliminar fila/columna" ;
    Text [ english_us ] = "Delete row/column" ;
    Text[ chinese_simplified ] = "ɾ³ýÐÐ/ÁÐ";
    Text[ russian ] = "Óäàëèòü ñòðîêó/ñòîëáåö";
    Text[ polish ] = "Usuñ wiersz/kolumnê";
    Text[ japanese ] = "s/—ñ‚̍폜";
    Text[ chinese_traditional ] = "§R°£¦C/Äæ";
    Text[ arabic ] = "ÍÐÝ ÕÝ/ÚãæÏ";
    Text[ dutch ] = "Rij/Kolom wissen";
    Text[ chinese_simplified ] = "ɾ³ýÐÐ/ÁÐ";
    Text[ greek ] = "ÄéáãñáöÞ ãñáììÞò/óôÞëçò";
    Text[ korean ] = "Çà/¿­ »èÁ¦";
    Text[ turkish ] = "Satýrý/sütunu sil";
    Text[ language_user1 ] = " ";
};
String STR_TABLE_SPLIT
{
    Text = "Zellen teilen" ;
    Text [ ENGLISH ] = "Split cells" ;
    Text [ norwegian ] = "Del celler" ;
    Text [ italian ] = "Dividi celle" ;
    Text [ portuguese_brazilian ] = "Partir células" ;
    Text [ portuguese ] = "Dividir células" ;
    Text [ finnish ] = "Jaa solut" ;
    Text [ danish ] = "Opdel celler" ;
    Text [ french ] = "Scinder les cellules" ;
    Text [ swedish ] = "Dela celler" ;
    Text [ dutch ] = "Cellen splitsen" ;
    Text [ spanish ] = "Dividir celdas" ;
    Text [ english_us ] = "Split Cells" ;
    Text[ chinese_simplified ] = "·Ö¸ôµ¥Ôª¸ñ";
    Text[ russian ] = "Ðàçáèòü ÿ÷åéêè";
    Text[ polish ] = "Podziel komórki";
    Text[ japanese ] = "¾Ù‚Ì•ªŠ„";
    Text[ chinese_traditional ] = "¤À¶}Àx¦s®æ";
    Text[ arabic ] = "ÊÞÓíã ÇáÎáÇíÇ";
    Text[ dutch ] = "Cellen splitsen";
    Text[ chinese_simplified ] = "·Ö¸ôµ¥Ôª¸ñ";
    Text[ greek ] = "Äéáßñåóç êåëéþí";
    Text[ korean ] = "¼¿ ³ª´©±â";
    Text[ turkish ] = "Hücreyi ayýr";
    Text[ language_user1 ] = " ";
};
String STR_TABLE_MERGE
{
    Text = "Zelle verbinden" ;
    Text [ ENGLISH ] = "Merge cell" ;
    Text [ english_us ] = "Merge Cells" ;
    Text [ italian ] = "Collega celle" ;
    Text [ spanish ] = "Unir celdas" ;
    Text [ french ] = "Fusionner la cellule" ;
    Text [ dutch ] = "Cel koppelen" ;
    Text [ swedish ] = "Förbind cell" ;
    Text [ danish ] = "Flet celler" ;
    Text [ portuguese ] = "Unir células" ;
    Text [ portuguese_brazilian ] = "Zelle verbinden" ;
    Text[ chinese_simplified ] = "ºÏ²¢µ¥Ôª¸ñ";
    Text[ russian ] = "Îáúåäèíèòü ÿ÷åéêè";
    Text[ polish ] = "Scal komórki";
    Text[ japanese ] = "¾Ù‚ÌŒ‹‡";
    Text[ chinese_traditional ] = "¦X¦}Àx¦s®æ";
    Text[ arabic ] = "æÕá ÇáÎáíÉ";
    Text[ dutch ] = "Cel koppelen";
    Text[ chinese_simplified ] = "ºÏ²¢µ¥Ôª¸ñ";
    Text[ greek ] = "¸íùóç êåëéþí";
    Text[ korean ] = "¼¿ º´ÇÕ";
    Text[ turkish ] = "Hücreyi birleþtir";
    Text[ language_user1 ] = " ";
};
String STR_TABLE_NUMFORMAT
{
    Text = "Zelle formatieren" ;
    Text [ ENGLISH ] = "Format cell" ;
    Text [ portuguese ] = "Formatar célula" ;
    Text [ english_us ] = "Format cell" ;
    Text [ portuguese_brazilian ] = "Zelle formatieren" ;
    Text [ swedish ] = "Formatera cell" ;
    Text [ danish ] = "Formater celler" ;
    Text [ italian ] = "Formatta cella" ;
    Text [ spanish ] = "Formatear celda" ;
    Text [ french ] = "Format de cellules" ;
    Text [ dutch ] = "Cel opmaken" ;
    Text[ chinese_simplified ] = "¸ñʽ»¯µ¥Ôª¸ñ";
    Text[ russian ] = "Ôîðìàò ÿ÷ååê";
    Text[ polish ] = "Formatuj komórkê";
    Text[ japanese ] = "¾Ù‚̏‘Ž®Ý’è";
    Text[ chinese_traditional ] = "®æ¦¡¤ÆÀx¦s®æ";
    Text[ arabic ] = "ÊäÓíÞ ÇáÎáíÉ";
    Text[ dutch ] = "Cel opmaken";
    Text[ chinese_simplified ] = "¸ñʽ»¯µ¥Ôª¸ñ";
    Text[ greek ] = "Ìïñöïðïßçóç êåëéïý";
    Text[ korean ] = "¼¿ ¼­½Ä";
    Text[ turkish ] = "Hücreyi formatla";
    Text[ language_user1 ] = " ";
};
String STR_INSERT_TOX
{
    Text = "Einfügen Verzeichnis" ;
    Text [ ENGLISH ] = "Insert index" ;
    Text [ portuguese ] = "Inserir índice" ;
    Text [ english_us ] = "Insert index" ;
    Text [ portuguese_brazilian ] = "Einfügen Verzeichnis" ;
    Text [ swedish ] = "Infoga förteckning" ;
    Text [ danish ] = "Indsæt indeks" ;
    Text [ italian ] = "Inserisci indice" ;
    Text [ spanish ] = "Insertar índice" ;
    Text [ french ] = "Insérer un index" ;
    Text [ dutch ] = "Index invoegen" ;
    Text[ chinese_simplified ] = "²åÈëË÷Òý";
    Text[ russian ] = "Âñòàâèòü óêàçàòåëü";
    Text[ polish ] = "Wstaw indeks";
    Text[ japanese ] = "õˆø‚Ì‘}“ü";
    Text[ chinese_traditional ] = "´¡¤J¥Ø¿ý";
    Text[ arabic ] = "ÅÏÑÇÌ ÝåÑÓ";
    Text[ dutch ] = "Index invoegen";
    Text[ chinese_simplified ] = "²åÈëË÷Òý";
    Text[ greek ] = "ÅéóáãùãÞ åõñåôçñßïõ";
    Text[ korean ] = "»öÀÎ »ðÀÔ";
    Text[ turkish ] = "Dizin ekle";
    Text[ language_user1 ] = " ";
};
String STR_CLEAR_TOX_RANGE
{
    Text = "Verzeichnis aufheben" ;
    Text [ ENGLISH ] = "Dismiss index" ;
    Text [ portuguese ] = "Remover índice" ;
    Text [ english_us ] = "Remove index" ;
    Text [ portuguese_brazilian ] = "Verzeichnis aufheben" ;
    Text [ swedish ] = "Upphäv förteckning" ;
    Text [ danish ] = "Ophæv indeks" ;
    Text [ italian ] = "Rimuovi indice" ;
    Text [ spanish ] = "Eliminar directorio" ;
    Text [ french ] = "Supprimer l'index" ;
    Text [ dutch ] = "Index verwijderen" ;
    Text[ chinese_simplified ] = "È¡ÏûË÷Òý";
    Text[ russian ] = "Óáðàòü óêàçàòåëü";
    Text[ polish ] = "Usuñ indeks";
    Text[ japanese ] = "õˆø‚̉ðœ";
    Text[ chinese_traditional ] = "¨ú®ø¥Ø¿ý";
    Text[ arabic ] = "ÅÒÇáÉ ÇáÝåÑÓ";
    Text[ dutch ] = "Index verwijderen";
    Text[ chinese_simplified ] = "È¡ÏûË÷Òý";
    Text[ greek ] = "ÊáôÜñãçóç åõñåôçñßïõ";
    Text[ korean ] = "»öÀÎ Á¦°Å";
    Text[ turkish ] = "Dizini kaldýr";
    Text[ language_user1 ] = " ";
};
String STR_TABLE_TBLCPYTBL
{
    Text = "Tabelle kopieren" ;
    Text [ ENGLISH ] = "Copy table" ;
    Text [ portuguese ] = "Copiar tabela" ;
    Text [ english_us ] = "Copy table" ;
    Text [ portuguese_brazilian ] = "Tabelle kopieren" ;
    Text [ swedish ] = "Kopiera tabell" ;
    Text [ danish ] = "Kopier tabel" ;
    Text [ italian ] = "Copia tabella" ;
    Text [ spanish ] = "Copiar tabla" ;
    Text [ french ] = "Copier le tableau" ;
    Text [ dutch ] = "Tabel kopiëren" ;
    Text[ chinese_simplified ] = "¸´ÖƱí¸ñ";
    Text[ russian ] = "Êîïèðîâàòü òàáëèöó";
    Text[ polish ] = "Kopiuj tabelê";
    Text[ japanese ] = "•\\‚̺Ëß°";
    Text[ chinese_traditional ] = "½Æ»sªí®æ";
    Text[ arabic ] = "äÓÎ ÇáÌÏæá";
    Text[ dutch ] = "Tabel kopiëren";
    Text[ chinese_simplified ] = "¸´ÖƱí¸ñ";
    Text[ greek ] = "ÁíôéãñáöÞ ðßíáêá";
    Text[ korean ] = "Ç¥ ¼­½Ä";
    Text[ turkish ] = "Tabloyu kopyala";
    Text[ language_user1 ] = " ";
};
String STR_TABLE_CPYTBL
{
    Text = "Tabelle kopieren" ;
    Text [ ENGLISH ] = "Copy table" ;
    Text [ portuguese ] = "Copiar tabela" ;
    Text [ english_us ] = "Copy table" ;
    Text [ portuguese_brazilian ] = "Tabelle kopieren" ;
    Text [ swedish ] = "Kopiera tabell" ;
    Text [ danish ] = "Kopier tabel" ;
    Text [ italian ] = "Copia tabella" ;
    Text [ spanish ] = "Copiar tabla" ;
    Text [ french ] = "Copier le tableau" ;
    Text [ dutch ] = "Tabel kopiëren" ;
    Text[ chinese_simplified ] = "¸´ÖƱí¸ñ";
    Text[ russian ] = "Êîïèðîâàòü òàáëèöó";
    Text[ polish ] = "Kopiuj tabelê";
    Text[ japanese ] = "•\\‚̺Ëß°";
    Text[ chinese_traditional ] = "½Æ»sªí®æ";
    Text[ arabic ] = "äÓÎ ÇáÌÏæá";
    Text[ dutch ] = "Tabel kopiëren";
    Text[ chinese_simplified ] = "¸´ÖƱí¸ñ";
    Text[ greek ] = "ÁíôéãñáöÞ ðßíáêá";
    Text[ korean ] = "Ç¥ º¹»ç";
    Text[ turkish ] = "Tabloyu kopyala";
    Text[ language_user1 ] = " ";
};
String STR_INS_FROM_SHADOWCRSR
{
    Text = "Cursor setzen" ;
    Text [ ENGLISH ] = "Set cursor" ;
    Text [ portuguese ] = "Configurar cursor" ;
    Text [ english_us ] = "Set cursor" ;
    Text [ portuguese_brazilian ] = "Cursor setzen" ;
    Text [ swedish ] = "Sätt markör" ;
    Text [ danish ] = "Konfigurer markør" ;
    Text [ italian ] = "Imposta cursore" ;
    Text [ spanish ] = "Poner cursor" ;
    Text [ french ] = "Mettre le curseur" ;
    Text [ dutch ] = "Cursor configureren" ;
    Text[ chinese_simplified ] = "¶¨Î»¹â±ê";
    Text[ russian ] = "Óñòàíîâèòü êóðñîð";
    Text[ polish ] = "Ustaw kursor";
    Text[ japanese ] = "¶°¿Ù‚̐ݒè";
    Text[ chinese_traditional ] = "©w¦ì¥ú¼Ð";
    Text[ arabic ] = "ÊÚííä ÇáãÄÔÑ";
    Text[ dutch ] = "Cursor configureren";
    Text[ chinese_simplified ] = "¶¨Î»¹â±ê";
    Text[ greek ] = "Ïñéóìüò äåßêôç";
    Text[ korean ] = "Ä¿¼­ ¼³Á¤";
    Text[ turkish ] = "Ýmleci ayarla";
    Text[ language_user1 ] = " ";
};
String STR_UNDO_CHAIN
{
    Text = "Textrahmen verbinden" ;
    Text [ ENGLISH ] = "chaine Textframes" ;
    Text [ portuguese ] = "Ligar molduras de texto" ;
    Text [ english_us ] = "Link text frames" ;
    Text [ portuguese_brazilian ] = "Textrahmen verbinden" ;
    Text [ swedish ] = "Förbind textram" ;
    Text [ danish ] = "Kæd tekstbokse" ;
    Text [ italian ] = "Collega la cornice di testo." ;
    Text [ spanish ] = "Conectar marcos de texto" ;
    Text [ french ] = "Enchaîner les cadres texte" ;
    Text [ dutch ] = "Tekstkader verbinden" ;
    Text[ chinese_simplified ] = "Á´½ÓÎı¾¿ò";
    Text[ russian ] = "Îáúåäèíèòü òåêñòîâûå ðàìêè";
    Text[ polish ] = "Po³¹cz ramkê tekstow¹";
    Text[ japanese ] = "÷½Ä˜g‚ÌŒ‹‡";
    Text[ chinese_traditional ] = "³sµ²¤å¦r¤è¶ô";
    Text[ arabic ] = "ÊÑÇÈØ ÅØÇÑÇÊ ÇáäÕ";
    Text[ dutch ] = "Tekstkader verbinden";
    Text[ chinese_simplified ] = "Á´½ÓÎı¾¿ò";
    Text[ greek ] = "Óýíäåóç ðëáéóßïõ êåéìÝíïõ";
    Text[ korean ] = "ÅØ½ºÆ® ÇÁ·¹ÀÓ ¿¬°á";
    Text[ turkish ] = "Metin kutularýný baðla";
    Text[ language_user1 ] = " ";
};
String STR_UNDO_UNCHAIN
{
    Text = "Textrahmenverbindung lösen" ;
    Text [ ENGLISH ] = "unchain Textframes" ;
    Text [ portuguese ] = "Desligar molduras de texto" ;
    Text [ english_us ] = "Unlink text frames" ;
    Text [ portuguese_brazilian ] = "Textrahmenverbindung loesen" ;
    Text [ swedish ] = "Upplös textramförbindelse" ;
    Text [ danish ] = "Ophæv tekstbokskædning" ;
    Text [ italian ] = "Staccare il collegamento della cornice di testo" ;
    Text [ spanish ] = "Deshacer el vínculo de los marcos de texto." ;
    Text [ french ] = "Détacher les cadres texte" ;
    Text [ dutch ] = "Tekstkaderverbinding verwijderen" ;
    Text[ chinese_simplified ] = "È¡ÏûÎı¾¿òµÄÁ´½Ó";
    Text[ russian ] = "Ðàçúåäèíèòü òåêñòîâóþ ðàìêó";
    Text[ polish ] = "Roz³¹cz ramki tekstu";
    Text[ japanese ] = "÷½Ä˜g‚ÌŒ‹‡‰ðœ";
    Text[ chinese_traditional ] = "¨ú®ø¤å¦r¤è¶ôªº³sµ²";
    Text[ arabic ] = "Ýß ÊÑÇÈØ ÅØÇÑÇÊ ÇáäÕ";
    Text[ dutch ] = "Tekstkaderverbinding verwijderen";
    Text[ chinese_simplified ] = "È¡ÏûÎı¾¿òµÄÁ´½Ó";
    Text[ greek ] = "Áðïóýíäåóç ðëáßóéá êåéìÝíïõ";
    Text[ korean ] = "ÅØ½ºÆ® ÇÁ·¹ÀÓ ¿¬°á Á¦°Å";
    Text[ turkish ] = "Metin kutusu baðlantýlarýný çöz";
    Text[ language_user1 ] = " ";
};
String STR_UNDO_FTNINFO
{
    Text = "Fußnoteneinstellungen ändern" ;
    Text [ ENGLISH ] = "change footnote properties" ;
    Text [ portuguese ] = "Modificar definições de nota final" ;
    Text [ english_us ] = "Modify footnote options" ;
    Text [ portuguese_brazilian ] = "Fußnoteneinstellungen ändern" ;
    Text [ swedish ] = "Ändra fotnotsinställningar" ;
    Text [ danish ] = "Modificer fodnoteindstillinger" ;
    Text [ italian ] = "Modifica impostazioni note a piè pagina" ;
    Text [ spanish ] = "Modificar opciones de nota al pie" ;
    Text [ french ] = "Modifier les paramètres des notes de bas de page" ;
    Text [ dutch ] = "Voetnoteninstellingen wijzigen" ;
    Text[ chinese_simplified ] = "¸ü¸Ä×¢½ÅÉ趨";
    Text[ russian ] = "Èçìåíèòü óñòàíîâêè ñíîñîê";
    Text[ polish ] = "Zmodyfikuj ustawienia przypisów dolnych";
    Text[ japanese ] = "‹r’‚̐ݒè•ύX";
    Text[ chinese_traditional ] = "Åܧóµù¸}³]©w";
    Text[ arabic ] = "ÊÚÏíá ÎíÇÑÇÊ ÇáÍÇÔíÉ ÇáÓÝáíÉ";
    Text[ dutch ] = "Voetnoteninstellingen wijzigen";
    Text[ chinese_simplified ] = "¸ü¸Ä×¢½ÅÉ趨";
    Text[ greek ] = "Ôñïðïðïßçóç åðéëïãþí õðïóçìåéþóåùí";
    Text[ korean ] = "°¢ÁÖ ¿É¼Ç ¼öÁ¤";
    Text[ turkish ] = "Dipnot ayarlarýný deðiþtir";
    Text[ language_user1 ] = " ";
};
String STR_UNDO_ENDNOTEINFO
{
    Text = "Endnoteneinstellungen ändern" ;
    Text [ ENGLISH ] = "change endnote properties" ;
    Text [ portuguese ] = "Modificar definições de nota final" ;
    Text [ english_us ] = "Modify endnote settings" ;
    Text [ portuguese_brazilian ] = "Endnoteneinstellungen ändern" ;
    Text [ swedish ] = "Ändra slutnotsinställningar" ;
    Text [ danish ] = "Modificer slutnoteindstillinger" ;
    Text [ italian ] = "Modifica impostazione note di chiusura" ;
    Text [ spanish ] = "Modificar configuración de notas finales" ;
    Text [ french ] = "Modifier les paramètres des notes de fin" ;
    Text [ dutch ] = "Eindnootinstellingen wijzigen" ;
    Text[ chinese_simplified ] = "¸ü¸ÄβעÉ趨";
    Text[ russian ] = "Èçìåíèòü óñòàíîâêè êîíöåâûõ ñíîñîê";
    Text[ polish ] = "Zmodyfikuj ustawienia przypisów dolnych";
    Text[ japanese ] = "•¶––‹r’‚̐ݒè•ύX";
    Text[ chinese_traditional ] = "Åܧó§Àª`³]©w";
    Text[ arabic ] = "ÊÚÏíá ÅÚÏÇÏÇÊ ÇáÊÚáíÞÇÊ ÇáÎÊÇãíÉ";
    Text[ dutch ] = "Eindnootinstellingen wijzigen";
    Text[ chinese_simplified ] = "¸ü¸ÄβעÉ趨";
    Text[ greek ] = "Ôñïðïðïßçóç åðéëïãþí óçìåéþóåùí ôÝëïõò";
    Text[ korean ] = "¹ÌÁÖ ¼³Á¤ ¼öÁ¤";
    Text[ turkish ] = "Sonnot ayarlarýný deðiþtir";
    Text[ language_user1 ] = " ";
};
String STR_UNDO_COMPAREDOC
{
    Text = "Dokument vergleich" ;
    Text [ ENGLISH ] = "compare document" ;
    Text [ portuguese ] = "Comparar documento" ;
    Text [ english_us ] = "Compare Document" ;
    Text [ portuguese_brazilian ] = "Dokument vergleich" ;
    Text [ swedish ] = "Jämföra dokument" ;
    Text [ danish ] = "Sammenlign dokument" ;
    Text [ italian ] = "Confronto documento" ;
    Text [ spanish ] = "Comparar documento" ;
    Text [ french ] = "Comparaison de documents" ;
    Text [ dutch ] = "Vergelijking van documenten" ;
    Text[ chinese_simplified ] = "±È½ÏÎĵµ";
    Text[ russian ] = "Ñðàâíèòü âåðñèè äîêóìåíòà";
    Text[ polish ] = "Porównaj dokument";
    Text[ japanese ] = "ÄÞ·­ÒÝĂ̔äŠr";
    Text[ chinese_traditional ] = "¤ñ¸û¤å¥ó";
    Text[ arabic ] = "ãÞÇÑäÉ ÇáãÓÊäÏ";
    Text[ dutch ] = "Vergelijking van documenten";
    Text[ chinese_simplified ] = "±È½ÏÎĵµ";
    Text[ greek ] = "Óýãêñéóç åããñÜöïõ";
    Text[ korean ] = "¹®¼­ºñ±³";
    Text[ turkish ] = "Belgeyi karþýlaþtýr";
    Text[ language_user1 ] = " ";
};
String STR_UNDO_SETFLYFRMFMT
{
    Text = "Rahmenvorlage anwenden" ;
    Text [ ENGLISH ] = "Apply framestyle" ;
    Text [ portuguese ] = "Aplicar estilo de moldura" ;
    Text [ english_us ] = "Apply frame style" ;
    Text [ portuguese_brazilian ] = "Rahmenvorlage anwenden" ;
    Text [ swedish ] = "Använd ramformatmall" ;
    Text [ danish ] = "Anvend rammetypografi" ;
    Text [ italian ] = "Applica modello di cornice" ;
    Text [ spanish ] = "Aplicar estilo de marco" ;
    Text [ french ] = "Utiliser un style de cadre" ;
    Text [ dutch ] = "Kaderopmaakprofiel toepassen" ;
    Text[ chinese_simplified ] = "ʹÓÿòÑùʽ";
    Text[ russian ] = "Ïðèìåíèòü ñòèëü ðàìîê";
    Text[ polish ] = "Zastosuj styl ramki";
    Text[ japanese ] = "˜g½À²Ù‚Ì“K—p";
    Text[ chinese_traditional ] = "¨Ï¥Î¤è¶ô¼Ë¦¡";
    Text[ arabic ] = "ÇÓÊÎÏÇã äãØ ÅØÇÑ";
    Text[ dutch ] = "Kaderopmaakprofiel toepassen";
    Text[ chinese_simplified ] = "ʹÓÿòÑùʽ";
    Text[ greek ] = "ÅöáñìïãÞ óôõë ðëáéóßïõ";
    Text[ korean ] = "ÇÁ·¹ÀÓ ½ºÅ¸ÀÏ Àû¿ë";
    Text[ turkish ] = "Çerçeve biçimi uygula";
    Text[ language_user1 ] = " ";
};
String STR_INSERT_FOOTNOTE
{
    Text = "Fußnote einfügen" ;
    Text [ ENGLISH ] = "insert footnote" ;
    Text [ english_us ] = "Insert footnote" ;
    Text [ portuguese_brazilian ] = "Fußnote einfügen" ;
    Text [ swedish ] = "Infoga fotnot" ;
    Text [ danish ] = "Indsæt fodnote" ;
    Text [ italian ] = "Inserisci nota a piè pagina" ;
    Text [ spanish ] = "Insertar nota al pie" ;
    Text [ french ] = "Insérer une note de bas de page" ;
    Text [ dutch ] = "Voetnoot invoegen" ;
    Text [ portuguese ] = "Inserir nota de rodapé" ;
    Text[ chinese_simplified ] = "²åÈë×¢½Å";
    Text[ russian ] = "Âñòàâèòü ñíîñêó";
    Text[ polish ] = "Wstaw przypis dolny";
    Text[ japanese ] = "‹r’‚Ì‘}“ü";
    Text[ chinese_traditional ] = "´¡¤Jµù¸}";
    Text[ arabic ] = "ÅÏÑÇÌ ÍÇÔíÉ ÓÝáíÉ";
    Text[ dutch ] = "Voetnoot invoegen";
    Text[ chinese_simplified ] = "²åÈë×¢½Å";
    Text[ greek ] = "ÐñïóèÞêç õðïóçìåßùóçò";
    Text[ korean ] = "°¢ÁÖ »ðÀÔ";
    Text[ turkish ] = "Dipnot ekle";
    Text[ language_user1 ] = " ";
};
String STR_INSERT_URLBTN
{
    Text = "URL Button einfügen" ;
    Text [ ENGLISH ] = "insert URL button" ;
    Text[ english_us ] = "insert URL button";
    Text[ portuguese ] = "Inserir botão URL";
    Text[ russian ] = "Âñòàâèòü êíîïêó URL";
    Text[ dutch ] = "URL button invoegen";
    Text[ french ] = "Insérer un bouton d'URL";
    Text[ spanish ] = "Insertar botón URL";
    Text[ italian ] = "Inserisci pulsante URL";
    Text[ danish ] = "Indsæt URL-knap";
    Text[ swedish ] = "Infoga URL-knapp";
    Text[ polish ] = "Wstaw przycisk URL";
    Text[ portuguese_brazilian ] = "insert URL button";
    Text[ japanese ] = "URLÎÞÀ݂̑}“ü";
    Text[ chinese_simplified ] = "²åÈë URL °´Å¥";
    Text[ chinese_traditional ] = "´¡¤J URL «ö¶s";
    Text[ arabic ] = "ÅÏÑÇÌ ãÝÊÇÍ URL";
    Text[ dutch ] = "URL button invoegen";
    Text[ chinese_simplified ] = "²åÈë URL °´Å¥";
    Text[ greek ] = "Ðñüóèåóç êïõìðéïý URL";
    Text[ korean ] = "URL ¹öư »ðÀÔ";
    Text[ turkish ] = "URL düðmesi ekle";
    Text[ language_user1 ] = " ";
};
String STR_INSERT_URLTXT
{
    Text = "Hyperlink einfügen" ;
    Text [ ENGLISH ] = "insert Hyperlink" ;
    Text[ english_us ] = "insert Hyperlink";
    Text[ portuguese ] = "Inserir hiperligação";
    Text[ russian ] = "Âñòàâèòü ãèïåðññûëêó";
    Text[ dutch ] = "Hyperlink invoegen";
    Text[ french ] = "Insérer un hyperlien";
    Text[ spanish ] = "Insertar hiperenlace";
    Text[ italian ] = "Inserisci hyperlink";
    Text[ danish ] = "Indsæt hyperlink";
    Text[ swedish ] = "Infoga hyperlänk";
    Text[ polish ] = "Wstaw hiper³¹cze";
    Text[ portuguese_brazilian ] = "insert Hyperlink";
    Text[ japanese ] = "ʲÊß°ØÝ¸‚Ì‘}“ü";
    Text[ chinese_simplified ] = "²åÈ볬Á´½Ó";
    Text[ chinese_traditional ] = "´¡¤J¶W³sµ²";
    Text[ arabic ] = "ÅÏÑÇÌ ÇÑÊÈÇØ ÊÔÚÈí";
    Text[ dutch ] = "Hyperlink invoegen";
    Text[ chinese_simplified ] = "²åÈ볬Á´½Ó";
    Text[ greek ] = "ÐñïóèÞêç õðåñ-óýíäåóçò";
    Text[ korean ] = "ÇÏÀÌÆÛ¸µÅ© »ðÀÔ";
    Text[ turkish ] = "Hyperlink ekle";
    Text[ language_user1 ] = " ";
};
String STR_DELETE_INVISIBLECNTNT
{
    Text = "unischtbaren Inhalt enfernen" ;
    Text [ ENGLISH ] = "remove invisible content" ;
    Text[ english_us ] = "remove invisible content";
    Text[ portuguese ] = "eliminar conteúdo invisível";
    Text[ greek ] = "êáôÜñãçóç ìç ïñáôþí ðåñéå÷ïìÝíùí";
    Text[ dutch ] = "Ônzichtbare inhoud verwijderen";
    Text[ french ] = "supprimer le contenu invisible";
    Text[ spanish ] = "eliminar contenido invisible";
    Text[ swedish ] = "ta bort osynligt innehåll";
    Text[ russian ] = "óäàëèòü íåâèäèìîå ñîäåðæèìîå";
    Text[ italian ] = "Rimuovi contenuto nascosto";
    Text[ danish ] = "fjern usynlige indhold";
    Text[ polish ] = "usuñ niewidoczn¹ zawartoœæ";
    Text[ portuguese_brazilian ] = "remove invisible content";
    Text[ japanese ] = "•\\ަ‚Å‚«‚È‚¢“à—e‚ðíœ‚·‚é";
    Text[ korean ] = "º¸ÀÌÁö ¾Ê´Â ³»¿ë Á¦°Å";
    Text[ chinese_simplified ] = "ɾ³ýÒþÈëµÄÄÚÈÝ";
    Text[ chinese_traditional ] = "²M°£Áô¤Jªº¤º®e";
    Text[ arabic ] = "ÅÒÇáÉ ÇáãÍÊæíÇÊ ÇáÛíÑ ãÑÆíÉ";
    Text[ turkish ] = "Görünmez içeriði kaldýr";
    Text[ language_user1 ] = " ";
};

String STR_DDEERROR_APP1
{
    TEXT = "Die Applikation [" ;
    TEXT [ ENGLISH ] = "Application [" ;
    TEXT [ norwegian ] = "Applikasjon[" ;
    TEXT [ italian ] = "L'applicazione [" ;
    TEXT [ portuguese_brazilian ] = "Aplicativo [" ;
    TEXT [ portuguese ] = "A aplicação [" ;
    TEXT [ finnish ] = "Sovellus [" ;
    TEXT [ danish ] = "Applikationen [" ;
    TEXT [ french ] = "L'application [" ;
    TEXT [ swedish ] = "Programmet [" ;
    TEXT [ dutch ] = "Applicatie [" ;
    TEXT [ spanish ] = "La aplicación [" ;
    TEXT [ english_us ] = "Application [" ;
    TEXT[ chinese_simplified ] = "Ó¦ÓóÌÐò [";
    TEXT[ russian ] = "Ê ïðèëîæåíèþ [";
    TEXT[ polish ] = "Aplikacja [";
    TEXT[ japanese ] = "±Ìߨ¹°¼®Ý [";
    TEXT[ greek ] = "Ç åöáñìïãÞ [";
    TEXT[ korean ] = "ÀÀ¿ëÇÁ·Î±×·¥ [";
    TEXT[ chinese_traditional ] = "µ{¦¡ [";
    TEXT[ arabic ] = "ÇáÊØÈíÞ  ]";
    TEXT[ turkish ] = "Uygulama [";
};
String STR_DDEERROR_APP2
{
    TEXT = "] kann nicht angesprochen werden" ;
    TEXT [ ENGLISH ] = "] does not respond" ;
    TEXT [ norwegian ] = "] korresponderer ikke" ;
    TEXT [ italian ] = "] non risponde" ;
    TEXT [ portuguese_brazilian ] = "] não responde" ;
    TEXT [ portuguese ] = "] não responde." ;
    TEXT [ finnish ] = "] ei vastaa" ;
    TEXT [ danish ] = "] svarer ikke" ;
    TEXT [ french ] = "] ne répond pas" ;
    TEXT [ swedish ] = "]  svarar inte" ;
    TEXT [ dutch ] = "] reageert niet" ;
    TEXT [ spanish ] = "] no responde" ;
    TEXT [ english_us ] = "] is not responding." ;
    TEXT[ chinese_simplified ] = "] ûÓлØÓ¦¡£";
    TEXT[ russian ] = "] îáðàòèòüñÿ íåâîçìîæíî";
    TEXT[ polish ] = "] nie reaguje";
    TEXT[ japanese ] = "] ‚©‚ç‚̉ž“š‚ª‚ ‚è‚Ü‚¹‚ñ";
    TEXT[ chinese_traditional ] = "] ¨S¦³¦^À³¡C";
    TEXT[ arabic ] = "[ áÇ íÓÊÌíÈ";
    TEXT[ dutch ] = "] reageert niet";
    TEXT[ chinese_simplified ] = "] ûÓлØÓ¦¡£";
    TEXT[ greek ] = "] äåí áíôáðïêñßíåôáé.";
    TEXT[ korean ] = "]ÀÌ  ÀÀ´äÇÏÁö ¾Ê½À´Ï´Ù.";
    TEXT[ turkish ] = "] cevap vermiyor";
    TEXT[ language_user1 ] = " ";
};
String STR_DDEERROR_DATA1
{
    TEXT = "Die Daten zu [" ;
    TEXT [ ENGLISH ] = "Data for [" ;
    TEXT [ norwegian ] = "Data for [" ;
    TEXT [ italian ] = "Dati per [" ;
    TEXT [ portuguese_brazilian ] = "Dados para [" ;
    TEXT [ portuguese ] = "Os dados para [" ;
    TEXT [ finnish ] = "Tietoja kohteeseen [" ;
    TEXT [ danish ] = "Dataene til [" ;
    TEXT [ french ] = "Les données pour [" ;
    TEXT [ swedish ] = "Data till [" ;
    TEXT [ dutch ] = "Gegevens voor [" ;
    TEXT [ spanish ] = "Los datos para [" ;
    TEXT [ english_us ] = "Data for [" ;
    TEXT[ chinese_simplified ] = "ÓÃÓÚ [";
    TEXT[ russian ] = "Äàííûå äëÿ [";
    TEXT[ polish ] = "Danych dla [";
    TEXT[ japanese ] = "[";
    TEXT[ greek ] = "Ôá äåäïìÝíá ãéá [";
    TEXT[ korean ] = "µ¥ÀÌÅÍ [";
    TEXT[ chinese_traditional ] = "¥Î©ó[";
    TEXT[ arabic ] = "ÈíÇäÇÊ  ] ";
    TEXT[ turkish ] = "[";
};
String STR_DDEERROR_DATA2
{
    TEXT = "] können nicht ermittelt werden" ;
    TEXT [ ENGLISH ] = "] cannot be obtained" ;
    TEXT [ norwegian ] = "] kan ikke oppnåes" ;
    TEXT [ italian ] = "]" ;
    TEXT [ portuguese_brazilian ] = "] não podem ser obtidos" ;
    TEXT [ portuguese ] = "] não podem ser determinados." ;
    TEXT [ finnish ] = "] ei saatu" ;
    TEXT [ danish ] = "] kan ikke bestemmes" ;
    TEXT [ french ] = "] ne peuvent pas être obtenues" ;
    TEXT [ swedish ] = "] kan inte erhållas" ;
    TEXT [ dutch ] = "] onmogelijk" ;
    TEXT [ spanish ] = "] no pueden ser determinados" ;
    TEXT [ english_us ] = "] cannot be obtained" ;
    TEXT[ chinese_simplified ] = "] µÄÊý¾ÝÎÞ·¨±»¶ÁÈ¡¡£";
    TEXT[ russian ] = "] îïðåäåëèòü íåâîçìîæíî";
    TEXT[ polish ] = "] nie mo¿na uzyskaæ";
    TEXT[ japanese ] = "] ‚ÌÃÞ°À‚ÍŠm”F‚Å‚«‚Ü‚¹‚ñ";
    TEXT[ chinese_traditional ] = "] ªº¸ê®ÆµLªk³QŪ¨ú¡C";
    TEXT[ arabic ] = "[ ÛíÑ ãÊæÝÑÉ";
    TEXT[ dutch ] = "] onmogelijk";
    TEXT[ chinese_simplified ] = "] µÄÊý¾ÝÎÞ·¨±»¶ÁÈ¡¡£";
    TEXT[ greek ] = "] äåí åßíáé äõíáôüí íá åîáêñéâùèïýí.";
    TEXT[ korean ] = "] À» ¾òÀ» ¼ö ¾øÀ½";
    TEXT[ turkish ] = "] ile ilgili veriler alýnamýyor";
    TEXT[ language_user1 ] = " ";
};
String STR_DDEERROR_LINK1
{
    TEXT = "Die Verknüpfung zu [" ;
    TEXT [ ENGLISH ] = "Link to [" ;
    TEXT [ norwegian ] = "Koble til [" ;
    TEXT [ italian ] = "Collegamento con [" ;
    TEXT [ portuguese_brazilian ] = "Ligação para [" ;
    TEXT [ portuguese ] = "A ligação a [" ;
    TEXT [ finnish ] = "Linkkiä kohteeseen [" ;
    TEXT [ danish ] = "Kæden til [" ;
    TEXT [ french ] = "Le lien à [" ;
    TEXT [ swedish ] = "Länk till [" ;
    TEXT [ dutch ] = "Koppeling naar [" ;
    TEXT [ spanish ] = "El vínculo con [" ;
    TEXT [ english_us ] = "Link to [" ;
    TEXT[ chinese_simplified ] = "ÎÞ·¨½¨Á¢Óë [";
    TEXT[ russian ] = "Ññûëêó íà [";
    TEXT[ polish ] = "£¹cza do [";
    TEXT[ japanese ] = "[";
    TEXT[ greek ] = "Ç óýíäåóç ìå [";
    TEXT[ korean ] = "¿¬°á ´ë»ó [";
    TEXT[ chinese_traditional ] = "³sµ² [";
    TEXT[ arabic ] = "ÇáÇÑÊÈÇØ Åáì  ]";
    TEXT[ turkish ] = "[";
};
String STR_DDEERROR_LINK2
{
    TEXT = "] kann nicht eingerichtet werden" ;
    TEXT [ ENGLISH ] = "] cannot be established" ;
    TEXT [ norwegian ] = "] kan ikke etableres" ;
    TEXT [ italian ] = "]" ;
    TEXT [ portuguese_brazilian ] = "] não pode ser estabelecido" ;
    TEXT [ portuguese ] = "] não pode ser estabelecido." ;
    TEXT [ finnish ] = "] ei voi muodostaa" ;
    TEXT [ danish ] = "] kan ikke oprettes" ;
    TEXT [ french ] = "] ne peut pas être établi" ;
    TEXT [ swedish ] = "] kan inte etableras" ;
    TEXT [ dutch ] = "] onmogelijk" ;
    TEXT [ spanish ] = "] no se puede establecer" ;
    TEXT [ english_us ] = "] cannot be established" ;
    TEXT[ chinese_simplified ] = "]µÄÁ´½Ó";
    TEXT[ russian ] = "] ñîçäàòü íåâîçìîæíî";
    TEXT[ polish ] = "] nie mo¿na ustanowiæ";
    TEXT[ japanese ] = "] ‚Ö‚ÌØÝ¸‚͂‚­‚ê‚Ü‚¹‚ñ";
    TEXT[ chinese_traditional ] = "] µLªk«Ø¥ß¡C";
    TEXT[ arabic ] = "[ ÛíÑ ÞÇÈá ááÅÚÏÇÏ";
    TEXT[ dutch ] = "] onmogelijk";
    TEXT[ chinese_simplified ] = "]µÄÁ´½Ó";
    TEXT[ greek ] = "] äåí åßíáé äõíáôüí íá ðñáãìáôïðïéçèåß.";
    TEXT[ korean ] = "] ¼º¸³µÉ ¼ö ¾ø½À´Ï´Ù.";
    TEXT[ turkish ] = "] ile ilgili baðlantý oluþturulamýyor";
    TEXT[ language_user1 ] = " ";
};
diff --git a/sw/source/ui/wrtsh/wrtsh1.cxx b/sw/source/ui/wrtsh/wrtsh1.cxx
new file mode 100644
index 0000000..cd5702f
--- /dev/null
+++ b/sw/source/ui/wrtsh/wrtsh1.cxx
@@ -0,0 +1,1630 @@
/*************************************************************************
 *
 *  $RCSfile: wrtsh1.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:53 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#if STLPORT_VERSION>=321
#include <math.h>   // prevent conflict between exception and std::exception
#endif

#ifndef _HINTIDS_HXX
#include <hintids.hxx>
#endif

#ifndef _SVDVIEW_HXX //autogen
#include <svx/svdview.hxx>
#endif
#ifndef _SOT_FACTORY_HXX
#include <sot/factory.hxx>
#endif
#ifndef _SFXITEMITER_HXX //autogen
#include <svtools/itemiter.hxx>
#endif
#ifndef _SOUND_HXX //autogen
#include <vcl/sound.hxx>
#endif
#ifndef _BIGINT_HXX //autogen
#include <tools/bigint.hxx>
#endif
#ifndef _SVSTOR_HXX //autogen
#include <so3/svstor.hxx>
#endif
#ifndef _INSDLG_HXX //autogen
#include <so3/insdlg.hxx>
#endif
#ifndef _FRAMEOBJ_HXX //autogen
#include <sfx2/frameobj.hxx>
#endif
#ifndef _EHDL_HXX //autogen
#include <svtools/ehdl.hxx>
#endif
#ifndef _IPENV_HXX //autogen
#include <so3/ipenv.hxx>
#endif
#ifndef _SOERR_HXX //autogen
#include <so3/soerr.hxx>
#endif
#ifndef _CACHESTR_HXX //autogen
#include <tools/cachestr.hxx>
#endif
#ifndef _SVX_BRKITEM_HXX //autogen
#include <svx/brkitem.hxx>
#endif
#ifndef SMDLL0_HXX //autogen
#include <starmath/smdll0.hxx>
#endif
#ifndef _SCHDLL0_HXX
#include <sch/schdll0.hxx>
#endif
#ifndef _SCH_DLL_HXX
#include <sch/schdll.hxx>
#endif
#ifndef _SCH_MEMCHRT_HXX
#include <sch/memchrt.hxx>
#endif
#ifndef _OFF_APP_HXX //autogen
#include <offmgr/app.hxx>
#endif
#ifndef _SBAITEMS_HRC //autogen
#include <offmgr/sbaitems.hrc>
#endif
#ifndef _SV_GRAPH_HXX //autogen
#include <vcl/graph.hxx>
#endif
#ifndef _SVX_IMPGRF_HXX
#include <svx/impgrf.hxx>
#endif
#ifndef _SFX_PRINTER_HXX //autogen
#include <sfx2/printer.hxx>
#endif

// MONIKER-SS
#ifndef PRODUCT
// fuer den neuen SvBaseLink!
#ifndef _URLOBJ_HXX //autogen
#include <tools/urlobj.hxx>
#endif
#ifndef _FINDER_HXX
#include <finder.hxx>
#endif
#endif
// MONIKER-SS


#ifndef _FMTFTN_HXX //autogen
#include <fmtftn.hxx>
#endif
#ifndef _FMTHBSH_HXX //autogen
#include <fmthbsh.hxx>
#endif
#ifndef _FMTPDSC_HXX //autogen
#include <fmtpdsc.hxx>
#endif
#ifndef _WDOCSH_HXX
#include <wdocsh.hxx>
#endif
#ifndef _BASESH_HXX
#include <basesh.hxx>
#endif
#ifndef _SWMODULE_HXX
#include <swmodule.hxx>
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _UITOOL_HXX
#include <uitool.hxx>
#endif
#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _PAGEDESC_HXX
#include <pagedesc.hxx>
#endif
#ifndef _FRMMGR_HXX
#include <frmmgr.hxx>
#endif
#ifndef _SHELLIO_HXX
#include <shellio.hxx>
#endif
#ifndef _UINUMS_HXX
#include <uinums.hxx>  // fuer Anwenden einer
#endif
#ifndef _SWUNDO_HXX
#include <swundo.hxx>  // fuer Undo-Ids
#endif
#ifndef _SWCLI_HXX
#include <swcli.hxx>
#endif
#ifndef _POOLFMT_HXX
#include <poolfmt.hxx>
#endif
#ifndef _WVIEW_HXX
#include <wview.hxx>
#endif
#ifndef _EDTWIN_HXX
#include <edtwin.hxx>
#endif
#ifndef _FMTCOL_HXX
#include <fmtcol.hxx>
#endif
#ifndef _SWTABLE_HXX
#include <swtable.hxx>
#endif
#ifndef _CAPTION_HXX
#include <caption.hxx>
#endif
#ifndef _VISCRS_HXX //autogen wg. SwSelPaintRects
#include <viscrs.hxx>
#endif

#ifndef _SWERROR_H
#include <swerror.h>
#endif
#ifndef _WRTSH_HRC
#include <wrtsh.hrc>
#endif

using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;

#define COMMON_INI_LIST \
        rView(rShell),\
        ePageMove(MV_NO),\
        pCrsrStack(0),  \
        fnLeaveSelect(&SwWrtShell::SttLeaveSelect),\
        fnDrag(&SwWrtShell::BeginDrag),\
        fnEndDrag(&SwWrtShell::EndDrag),\
        fnSetCrsr(&SwWrtShell::SetCrsr),\
        fnKillSel(&SwWrtShell::Ignore),\
        bDestOnStack(FALSE),\
        pModeStack(0)

#define BITFLD_INI_LIST \
        bClearMark = \
        bIns = TRUE;\
        bAddMode = \
        bExtMode = \
        bInSelect = \
        bCopy = \
        bLayoutMode = \
        bNoEdit = \
        bSelWrd = \
        bSelLn = \
        bIsInClickToEdit = FALSE;


void SwWrtShell::NoEdit(BOOL bHideCrsr)
{
    if(bHideCrsr)
        HideCrsr();
    bNoEdit = TRUE;
}



void SwWrtShell::Edit()
{
    if (CanInsert())
    {
        ShowCrsr();
        bNoEdit = FALSE;
    }
}



BOOL SwWrtShell::IsEndWrd()
{
    MV_KONTEXT(this);
    if(IsEndPara() && !IsSttPara())
        return TRUE;

    return IsEndWord();
}


/*------------------------------------------------------------------------
 Beschreibung:  Abfrage, ob Einfuegen moeglich ist; gfs. Beep
------------------------------------------------------------------------*/



BOOL SwWrtShell::_CanInsert()
{
    if(!CanInsert())
    {
        Sound::Beep();
        return FALSE;
    }
    return TRUE;
}
/*------------------------------------------------------------------------
 Beschreibung:  String einfuegen
------------------------------------------------------------------------*/

void SwWrtShell::InsertByWord( const String & rStr)
{
    if( rStr.Len() )
    {
        BOOL bDelim = WordSelection::IsNormalChar( rStr.GetChar(0) );
        xub_StrLen nPos = 0, nStt = 0;
        for( ; nPos < rStr.Len(); nPos++ )
           {
            BOOL bTmpDelim = WordSelection::IsNormalChar( rStr.GetChar( nPos ) );
            if( bTmpDelim != bDelim )
            {
                Insert( rStr.Copy( nStt, nPos - nStt ));
                nStt = nPos;
            }
        }
        if( nStt != nPos )
            Insert( rStr.Copy( nStt, nPos - nStt ));
    }
}


void SwWrtShell::Insert( const String &rStr )
{
    ResetCursorStack();
    if( !_CanInsert() )
        return;

    BOOL bStarted = FALSE, bHasSel = HasSelection(),
        bCallIns = bIns /*|| bHasSel*/;

    // Notify abschalten
    SwChgLinkFlag *pChgFlg = bCallIns ? new SwChgLinkFlag( *this ) : 0;

    if( bHasSel )
    {
            // nur hier klammern, da das normale Insert schon an der
            // Editshell geklammert ist
        StartAllAction();
        StartUndo(UNDO_INSERT);
        bStarted = TRUE;
        DelRight();
    }
/*
JP 21.01.98: Ueberschreiben ueberschreibt nur die Selektion, nicht das
            naechste Zeichen.
    if( bHasSel && !bIns && 1 < rStr.Len() )
    {
        // falls mehrere Zeichen anstehen, nur das erste einfuegen,
        // der Rest muss dann aber Ueberschrieben werden.
        SwEditShell::Insert( rStr.GetChar( 0 ) );
        SwEditShell::Overwrite( rStr.Copy( 1 ) );
    }
    else
*/
        bCallIns ? SwEditShell::Insert( rStr ) : SwEditShell::Overwrite( rStr );


    if( bStarted )
    {
        EndAllAction();
        EndUndo(UNDO_INSERT);
    }
    delete pChgFlg;
}

/* Begrenzung auf maximale Hoehe geht nicht, da die maximale Hoehe
 * des aktuellen Frames nicht erfragt werden kann. */



void SwWrtShell::Insert( const String &rPath, const String &rFilter,
                         const Graphic &rGrf, SwFlyFrmAttrMgr *pFrmMgr,
                         BOOL bRule )
{
    ResetCursorStack();
    if ( !_CanInsert() )
        return;

    StartAllAction();
    StartUndo(UNDO_INSERT);

    if ( HasSelection() )
        DelRight();
        // eingefuegte Grafik in eigenen Absatz, falls am Ende
        // eines nichtleeren Absatzes
    if ( IsEndPara() && !IsSttPara() )
        SwFEShell::SplitNode();

    EnterSelFrmMode();

    BOOL bSetGrfSize = TRUE;
    BOOL bOwnMgr     = FALSE;

    if ( !pFrmMgr )
    {
        bOwnMgr = TRUE;
        pFrmMgr = new SwFlyFrmAttrMgr( TRUE, this, FRMMGR_TYPE_GRF );

        // VORSICHT
        // GetAttrSet nimmt einen Abgleich vor
        // Beim Einfuegen ist eine SwFrmSize vorhanden wegen der
        // DEF-Rahmengroesse
        // Diese muss fuer die optimale Groesse explizit entfernt werden
        pFrmMgr->DelAttr(RES_FRM_SIZE);
    }
    else
    {
        Size aSz( pFrmMgr->GetSize() );
        if ( !aSz.Width() || !aSz.Height() )
        {
            aSz.Width() = aSz.Height() = 567;
            pFrmMgr->SetSize( aSz );
        }
        else if ( aSz.Width() != DFLT_WIDTH && aSz.Height() != DFLT_HEIGHT )
            bSetGrfSize = FALSE;

        pFrmMgr->SetSizeType(ATT_FIX_SIZE);

    }

    // Einfuegen der Grafik
    SwFEShell::Insert(rPath, rFilter, &rGrf, &pFrmMgr->GetAttrSet());
    if ( bOwnMgr )
        pFrmMgr->UpdateAttrMgr();

    if( bSetGrfSize && !bRule )
    {
        Size aGrfSize, aBound = GetGraphicDefaultSize();
        GetGrfSize( aGrfSize );

        //Die GrafikSize noch um die Randattribute vergroessern, denn die
        //Zaehlen beim Rahmen mit.
        aGrfSize.Width() += pFrmMgr->CalcWidthBorder();
        aGrfSize.Height()+= pFrmMgr->CalcHeightBorder();

        const BigInt aTempWidth( aGrfSize.Width() );
        const BigInt aTempHeight( aGrfSize.Height());

        // ggf. Breite anpassen, Hoehe dann proportional verkleinern
        if( aGrfSize.Width() > aBound.Width() )
        {
            aGrfSize.Width()  = aBound.Width();
            aGrfSize.Height() = ((BigInt)aBound.Width()) * aTempHeight / aTempWidth;
        }
        // ggf. Hoehe anpassen, Breite dann proportional verkleinern
        if( aGrfSize.Height() > aBound.Height() )
        {
            aGrfSize.Height() = aBound.Height();
            aGrfSize.Width() =  ((BigInt)aBound.Height()) * aTempWidth / aTempHeight;
        }
        pFrmMgr->SetSize( aGrfSize );
        pFrmMgr->UpdateFlyFrm();
    }
    if ( bOwnMgr )
        delete pFrmMgr;

    EndUndo(UNDO_INSERT);
    EndAllAction();
}


/*------------------------------------------------------------------------
   Beschreibung: Fuegt ein OLE-Objekt in die CORE ein.
                 Wenn kein Object uebergeben wird, so wird eins erzeugt.
------------------------------------------------------------------------*/


void SwWrtShell::Insert( SvInPlaceObjectRef *pRef, SvGlobalName *pName, BOOL bActivate, USHORT nSlotId)
{
    ResetCursorStack();
    if( !_CanInsert() )
    {
        delete pRef;
        return;
    }

    if( !pRef )
    {
        //Wir bauen uns ein neues OLE-Objekt, entweder per Dialog oder direkt
        //ueber den Namen.
        SvInPlaceObjectRef xIPObj;
        BOOL bDoVerb = TRUE;
        if ( pName )
        {
            SvStorageRef aStor = new SvStorage( aEmptyStr );
            xIPObj = &((SvFactory*)SvInPlaceObject::ClassFactory())->CreateAndInit(
                                                                *pName,aStor );
        }
        else
        {
            SvStorageRef aStor = new SvStorage( aEmptyStr, STREAM_STD_READWRITE);

            switch (nSlotId)
            {
                case SID_INSERT_OBJECT:
                {
                    SvInsertOleObjectDialog aDlg;
                    aDlg.SetHelpId(nSlotId);

                    //Wir wollen uns nicht selbst servieren.
                    SvObjectServerList aServerList;
                    aDlg.FillObjectServerList( &aServerList );
                    aServerList.Remove( *SwDocShell::ClassFactory() );

                    xIPObj = aDlg.Execute( GetWin(), aStor, &aServerList);
                    bDoVerb = aDlg.IsCreateNew();
                }
                break;

                case SID_INSERT_PLUGIN:
                {
                    SvInsertPlugInDialog aDlg;
                    aDlg.SetHelpId(nSlotId);

                    xIPObj = aDlg.Execute( GetWin(), aStor);
                    bDoVerb = FALSE;
                }
                break;

                case SID_INSERT_APPLET:
                {
                    SvInsertAppletDialog aDlg;
                    aDlg.SetHelpId(nSlotId);

                    xIPObj = aDlg.Execute( GetWin(), aStor);
                    bDoVerb = FALSE;
                }
                break;

                case SID_INSERT_FLOATINGFRAME:
                {
                    SfxInsertFloatingFrameDialog aDlg( GetWin() );
                    xIPObj = aDlg.Execute( aStor );
                    bDoVerb = FALSE;
                }

                default:
                    break;
            }
        }

        if ( xIPObj.Is() )
        {
            if( SVOBJ_MISCSTATUS_RESIZEONPRINTERCHANGE &
                xIPObj->GetMiscStatus() && GetPrt() )
                xIPObj->OnDocumentPrinterChanged( GetPrt() );

            if( InsertOle( xIPObj ) && bActivate && bDoVerb )
            {
                ASSERT( !xIPObj->IsLink(), "Link nicht aus Datei?" );
                SfxInPlaceClientRef xCli = GetView().FindIPClient( xIPObj,
                                                    &GetView().GetEditWin());
                if ( !xCli.Is() )
                    xCli = new SwOleClient( &GetView(), &GetView().GetEditWin());
                ErrCode nErr = xIPObj->DoConnect( xCli );
                ErrorHandler::HandleError( nErr );
                if ( !ERRCODE_TOERROR(nErr) )
                {
                    SvEmbeddedObjectRef xObj = &xIPObj;
                    CalcAndSetScale( xObj );
                    //#50270# Error brauchen wir nicht handeln, das erledigt das
                    //DoVerb in der SfxViewShell
                    nErr = GetView().SfxViewShell::DoVerb( xCli, SVVERB_SHOW );
                    if ( !ERRCODE_TOERROR( nErr ) )
                        xIPObj->SetDocumentName( GetView().GetDocShell()->GetTitle() );
                }
            }
        }
    }
    else
    {
        if( HasSelection() )
            DelRight();
        InsertOle( *pRef );
    }
}

/*------------------------------------------------------------------------
 Beschreibung:   Object in die Core einfuegen.
                 Vom ClipBoard oder Insert
------------------------------------------------------------------------*/

BOOL SwWrtShell::InsertOle( SvInPlaceObjectRef aRef )
{
    if ( aRef.Is() )
    {
        ResetCursorStack();
        StartAllAction();
        StartUndo(UNDO_INSERT);

        //Some differences between StarMath and any other objects:
        //1. Selections should be deleted. For StarMath the Text should be
        //   passed to the Object
        //2. If the cursor is at the end of an non empty paragraph a paragraph
        //   break should be insertet. StarMath objects are character bound and
        //   no break should be inserted.
        //3. If an selektion is passed to a StarMath object, this object should
        //   not be activated. FALSE should be returned then.
        BOOL bStarMath,
             bActivate = TRUE;

        SvGlobalName aCLSID;
        ULONG lDummy;
        String aDummy;
        // determine source CLSID
        aRef->SvPseudoObject::FillClass( &aCLSID, &lDummy, &aDummy, &aDummy, &aDummy);
        bStarMath = SmModuleDummy::HasID( *aRef->GetSvFactory() );
        if ( !bStarMath && aRef->IsLink() && SmModuleDummy::HasID( aCLSID ) )
        {
            //StarMath was the server which did the last recent work on
            //this object.
            bStarMath = TRUE;
        }

        if ( IsSelection() )
        {
            if ( bStarMath )
            {
                String aMathData;
                GetSelectedText( aMathData, GETSELTXT_PARABRK_TO_ONLYCR );
                if ( aMathData.Len() )
                {
                    SvData aData( FORMAT_STRING );
                    aData.SetData( aMathData );
                    if ( aRef->SetData( &aData ) )
                    {
                        bActivate = FALSE;
                        //StarMath size depends on the Printer, which is
                        //passed here direct for avoiding time consuming
                        //connections between StarWriter and StarMath
                        aRef->OnDocumentPrinterChanged( GetPrt() );
                    }
                    else
                        bActivate = TRUE;
                }
            }
            DelRight();
        }

        if ( !bStarMath )
            SwFEShell::SplitNode( FALSE, FALSE );

        EnterSelFrmMode();

        SwFlyFrmAttrMgr aFrmMgr( TRUE, this, FRMMGR_TYPE_OLE );
        aFrmMgr.SetSizeType(ATT_FIX_SIZE);

        SwRect aBound;
        CalcBoundRect( aBound, aFrmMgr.GetAnchor() );

        //The Size should be suggested by the OLE server
        MapMode aRefMap( aRef->GetMapUnit() );
        Size aSz( aRef->GetVisArea().GetSize() );
        if ( !aSz.Width() || !aSz.Height() )
        {
            aSz.Width() = aSz.Height() = 5000;
            aSz = OutputDevice::LogicToLogic
                                    ( aSz, MapMode( MAP_100TH_MM ), aRefMap );
        }
        MapMode aMyMap( MAP_TWIP );
        aSz = OutputDevice::LogicToLogic( aSz, aRefMap, aMyMap );
        //Object size can be limited
        if ( aSz.Width() > aBound.Width() )
        {
            //Immer proportional begrenzen.
            aSz.Height() = aSz.Height() * aBound.Width() / aSz.Width();
            aSz.Width() = aBound.Width();
        }
        aFrmMgr.SetSize( aSz );
        SwFEShell::Insert( &aRef, &aFrmMgr.GetAttrSet() );

        EndAllAction();
        GetView().AutoCaption(OLE_CAP, &aCLSID);
        EndUndo(UNDO_INSERT);

        return bActivate;
    }
    return FALSE;
}

/*------------------------------------------------------------------------
    Beschreibung: Das aktuelle selektierte OLE-Objekt wird mit dem
                  Verb in den Server geladen.
------------------------------------------------------------------------*/



void SwWrtShell::LaunchOLEObj( long nVerb )
{
    if ( GetCntType() == CNT_OLE &&
         !GetView().GetDocShell()->GetProtocol().IsInPlaceActive() )
    {
        SvInPlaceObjectRef xRef = GetOLEObj();
        ASSERT( xRef.Is(), "OLE not found" );
        SfxInPlaceClientRef xCli;
        if ( !xRef->IsLink() )
        {
            //  Link fuer Daten-Highlighting im Chart zuruecksetzen
            if( SFX_APP()->HasFeature( SFX_FEATURE_SCHART ) )
            {
                SvGlobalName aObjClsId( *xRef->GetSvFactory() );
                SchMemChart* pMemChart;
                if( SchModuleDummy::HasID( aObjClsId ) &&
                    0 != (pMemChart = SchDLL::GetChartData( xRef ) ))
                {
                    pMemChart->SetSelectionHdl( LINK( this, SwWrtShell,
                                                ChartSelectionHdl ) );
                    //#60043# Damit die DataBrowseBox nicht erscheint wird das
                    //Chart auf Readonly gesetzt wenn es eine Verbindung
                    //zu einer Tabelle hat.
                    if ( GetChartName( xRef ).Len() )
                        pMemChart->SetReadOnly( TRUE );
                }
            }

            xCli = GetView().FindIPClient( xRef, &GetView().GetEditWin() );
            if ( !xCli.Is() )
                xCli = new SwOleClient( &GetView(), &GetView().GetEditWin() );

            ((SwOleClient*)&xCli)->SetInDoVerb( TRUE );

            xRef->DoConnect( xCli );
            SvEmbeddedObjectRef xObj = &xRef;
            CalcAndSetScale( xObj );
            //#50270# Error brauchen wir nicht handeln, das erledigt das
            //DoVerb in der SfxViewShell
            GetView().SfxViewShell::DoVerb( xCli, nVerb );

            ((SwOleClient*)&xCli)->SetInDoVerb( FALSE );
            CalcAndSetScale( xObj );
        }
        else
        {
            ErrCode nErr;
            SfxErrorContext aEc( ERRCTX_SO_DOVERB, &GetView().GetEditWin(),
                                 RID_SO_ERRCTX );
            nErr = xRef->DoVerb( nVerb );
            if ( nErr )
                ErrorHandler::HandleError( nErr );
        }

    }
}

BOOL SwWrtShell::FinishOLEObj()                     // Server wird beendet
{
    SfxInPlaceClient* pIPClient = GetView().GetIPClient();
    BOOL bRet = pIPClient && pIPClient->IsInPlaceActive();
    if( bRet )
    {
        //  Link fuer Daten-Highlighting im Chart zuruecksetzen
        if( SFX_APP()->HasFeature(SFX_FEATURE_SCHART) )
        {
            SvInPlaceObject* pObj = pIPClient->GetIPObj();
            SvGlobalName aObjClsId( *pObj->GetSvFactory() );
            SchMemChart* pMemChart;
            if( SchModuleDummy::HasID( aObjClsId ) &&
                0 != (pMemChart = SchDLL::GetChartData( pObj ) ))
            {
                pMemChart->SetSelectionHdl( Link() );

//ggfs. auch die Selektion restaurieren
                LockView( TRUE );   //Scrollen im EndAction verhindern
                ClearMark();
                LockView( FALSE );
            }
        }

        //InPlace beenden.
        pIPClient->GetProtocol().Reset2Open();
        SFX_APP()->SetViewFrame( GetView().GetViewFrame() );
    }
    return bRet;
}


void SwWrtShell::CalcAndSetScale( SvEmbeddedObjectRef xObj,
                             const SwRect *pFlyPrtRect,
                             const SwRect *pFlyFrmRect )
{
    //Einstellen der Skalierung am Client. Diese ergibt sich aus der Differenz
    //zwischen der VisArea des Objektes und der ObjArea.
    ASSERT( xObj.Is(), "ObjectRef not  valid" );

    SfxInPlaceClientRef xCli = GetView().FindIPClient( xObj, &GetView().GetEditWin() );
    if ( !xCli.Is() || !xCli->GetEnv() )
    {
        //Das kann ja wohl nur ein nicht aktives Objekt sein. Diese bekommen
        //auf Wunsch die neue Groesse als VisArea gesetzt (StarChart)
        if( SVOBJ_MISCSTATUS_SERVERRESIZE & xObj->GetMiscStatus() )
        {
            SwRect aRect( pFlyPrtRect ? *pFlyPrtRect
                        : GetAnyCurRect( RECT_FLY_PRT_EMBEDDED, 0, &xObj ));
            if( !aRect.IsEmpty() )
                xObj->SetVisArea( OutputDevice::LogicToLogic(
                            aRect.SVRect(), MAP_TWIP, xObj->GetMapUnit() ));
            return;
        }
        if ( SVOBJ_MISCSTATUS_ALWAYSACTIVATE & xObj->GetMiscStatus() ||
             SVOBJ_MISCSTATUS_RESIZEONPRINTERCHANGE & xObj->GetMiscStatus() )
        {
            xCli = new SwOleClient( &GetView(), &GetView().GetEditWin() );
        }
        else
            return;
    }

    Size aVisArea( xObj->GetVisArea().GetSize() );
    BOOL bSetScale100 = TRUE;
    SvContainerEnvironment *pEnv = xCli->GetEnv();

    // solange keine vernuenftige Size vom Object kommt, kann nichts
    // skaliert werden
    if( aVisArea.Width() && aVisArea.Height() )
    {
        const MapMode aTmp( MAP_TWIP );
        aVisArea = OutputDevice::LogicToLogic( aVisArea, xObj->GetMapUnit(), aTmp);
        Size aObjArea;
        if ( pFlyPrtRect )
            aObjArea = pFlyPrtRect->SSize();
        else
            aObjArea = GetAnyCurRect( RECT_FLY_PRT_EMBEDDED, 0, &xObj ).SSize();

        // differ the aObjArea and aVisArea by 1 Pixel then set new VisArea
        long nX, nY;
        SwSelPaintRects::Get1PixelInLogic( *this, &nX, &nY );
        if( !( aVisArea.Width() - nX <= aObjArea.Width() &&
               aVisArea.Width() + nX >= aObjArea.Width() &&
               aVisArea.Height()- nY <= aObjArea.Height()&&
               aVisArea.Height()+ nY >= aObjArea.Height() ))
        {
            if( SVOBJ_MISCSTATUS_RESIZEONPRINTERCHANGE & xObj->GetMiscStatus() )
            {
                //This type of objects should never be resized.
                //If this request comes from the Writer core (inaktive Object
                //ist resized), the Object should be resized too.
                //If this request comes from the Object itself, the Frame
                //in the Writer core should be resized.
                if ( pFlyPrtRect )      //Request from core?
                {
                    xObj->SetVisArea( OutputDevice::LogicToLogic(
                        pFlyPrtRect->SVRect(), MAP_TWIP, xObj->GetMapUnit() ));
                }
                else
                {
                    SwRect aTmp( Point( LONG_MIN, LONG_MIN ), aVisArea );
                    RequestObjectResize( aTmp, xObj );
                }
                //Der Rest erledigt sich, weil wir eh wiederkommen sollten, evtl.
                //sogar rekursiv.
                return;
            }
            else
            {
                const Fraction aScaleWidth ( aObjArea.Width(),  aVisArea.Width() );
                const Fraction aScaleHeight( aObjArea.Height(), aVisArea.Height());
                pEnv->SetSizeScale( aScaleWidth, aScaleHeight );
                bSetScale100 = FALSE;
            }
        }
    }

    if( bSetScale100 )
    {
        const Fraction aScale( 1, 1 );
        pEnv->SetSizeScale( aScale, aScale );
    }

    //Jetzt ist auch der guenstige Zeitpunkt die ObjArea einzustellen.
    //Die Scalierung muss beruecksichtigt werden.
    SwRect aArea;
    if ( pFlyPrtRect )
    {
        aArea = *pFlyPrtRect;
        aArea += pFlyFrmRect->Pos();
    }
    else
    {
        aArea = GetAnyCurRect( RECT_FLY_PRT_EMBEDDED, 0, &xObj );
        aArea.Pos() += GetAnyCurRect( RECT_FLY_EMBEDDED, 0, &xObj ).Pos();
    }
    aArea.Width ( Fraction( aArea.Width()  ) / pEnv->GetScaleWidth() );
    aArea.Height( Fraction( aArea.Height() ) / pEnv->GetScaleHeight());
    pEnv->SetObjArea( aArea.SVRect() );

    if ( SVOBJ_MISCSTATUS_ALWAYSACTIVATE & xObj->GetMiscStatus() )
    {
        xObj->DoConnect( xCli );
        xObj->DoVerb();
    }
}



void SwWrtShell::ConnectObj( SvInPlaceObjectRef xIPObj, const SwRect &rPrt,
                            const SwRect &rFrm )
{
    if ( !xIPObj->IsLink() )
    {
        SfxInPlaceClientRef xCli = GetView().FindIPClient( xIPObj,
                                                           &GetView().GetEditWin());
        if ( !xCli.Is() )
            xCli = new SwOleClient( &GetView(), &GetView().GetEditWin() );
        xIPObj->DoConnect( xCli );
        SvEmbeddedObjectRef xObj = &xIPObj;
        CalcAndSetScale( xObj, &rPrt, &rFrm );
    }
}

IMPL_LINK( SwWrtShell, ChartSelectionHdl, ChartSelectionInfo *, pInfo )
{
    long nRet = 0;

#ifdef USED
// JP 03.11.98: mit der Selektion kann es nicht gehen, da dann der Cursor
//              immer sichtbar gemacht wird. Das fuehrt dann aber zu
//              unbeabsichtigten scrollen. Ausserdem sind 2 Selektionen
//              vorhanden - TabellenSelektion und die OLE-Rahmenselektion.

    if( pInfo )
    {
        if( CHART_SEL_QUERYSUPPORT & pInfo->nSelection )
            nRet = CHART_SEL_NONE | CHART_SEL_ALL | CHART_SEL_ROW |
                    CHART_SEL_COL | CHART_SEL_POINT;
        else
        {
            // dann suche mal die Tabelle zu diesem StarChart-Object
            SfxInPlaceClient* pIPClient = GetView().GetIPClient();
            SvInPlaceObject* pObj = pIPClient &&
                                    pIPClient->IsInPlaceActive()
                                    ? pIPClient->GetIPObj() : 0;
            String sTable;
            if( pObj )
                sTable = GetChartName( pObj );

            if( sTable.Len() )
            {
                LockView( TRUE );   //Scrollen im EndAction verhindern
                StartAction();

                ClearMark();
                if( GotoTable( sTable ) )
                {
                    // !!!!!!!!!!!!!!!
                    //      im nSelection sind Flags gesetzt, koennen also
                    //      auch gemischt auftauchen, darum das nICol, nIRow
                    // !!!!!!!!!!!!!!!!
                    USHORT nIRow = pInfo->nRow, nICol = pInfo->nCol,
                            nRow = 0, nCol = 0;

                    SchMemChart* pMemChart = SchDLL::GetChartData( pObj );
                    if( pMemChart && 2 == pMemChart->SomeData2().Len() )
                    {
                        if( '1' == pMemChart->SomeData2().GetChar( 0 ) )
                            ++nIRow;
                        if( '1' == pMemChart->SomeData2().GetChar( 1 ))
                            ++nICol;
                    }

// ist das default  if( (CHART_SEL_NONE | CHART_SEL_ALL) & pInfo->nSelection )
                    if( CHART_SEL_ROW & pInfo->nSelection )
                        nRow = nIRow, nCol = 0;
                    if( CHART_SEL_COL & pInfo->nSelection )
                        nCol = nICol, nRow = 0;
                    if( CHART_SEL_POINT & pInfo->nSelection )
                        nCol = nICol, nRow = nIRow;

                    if( GotoTblBox( SwTable::GetBoxName( nRow, nCol ) ) )
                    {
                        nRet = pInfo->nSelection;
                        if( ( CHART_SEL_ROW & pInfo->nSelection && !SelTblRow() ) ||
                            ( CHART_SEL_COL & pInfo->nSelection && !SelTblCol() ) ||
                            ( CHART_SEL_ALL & pInfo->nSelection &&
                                ( SetMark(),
                                    !MoveTable( fnTableCurr, fnTableEnd ))) )
                                nRet = 0;
                        else if( CHART_SEL_POINT & pInfo->nSelection )
                        {
                            // Selektion der einen Box
                            SetMark();
                            if( GoPrevCell() )
                                GoNextCell( FALSE );
                            else if( GoNextCell( FALSE ) )
                                GoPrevCell();
                            else
                                ClearMark();
                        }
                    }
                }

                EndAction();
                LockView( FALSE );
            }
        }
    }
#endif
    return nRet;
}

/*------------------------------------------------------------------------
 Beschreibung:  Einfuegen harter Seitenumbruch;
                Selektionen werden ueberschrieben
------------------------------------------------------------------------*/



void SwWrtShell::InsertPageBreak(const String *pPageDesc, USHORT nPgNum )
{
    ACT_KONTEXT(this);
    ResetCursorStack();
    if(!_CanInsert())
        return;

    StartUndo(UIUNDO_INSERT_PAGE_BREAK);

    if ( !IsCrsrInTbl() )
    {
        if(HasSelection())
            DelRight();
        SwFEShell::SplitNode();
    }

    const SwPageDesc *pDesc = pPageDesc
                            ? FindPageDescByName( *pPageDesc, TRUE ) : 0;
    if( pDesc )
    {
        SwFmtPageDesc aDesc( pDesc );
        aDesc.SetNumOffset( nPgNum );
        SetAttr( aDesc );
    }
    else
        SetAttr( SvxFmtBreakItem(SVX_BREAK_PAGE_BEFORE) );
    EndUndo(UIUNDO_INSERT_PAGE_BREAK);
}
/*------------------------------------------------------------------------
 Beschreibung:  Einfuegen harter Zeilenumbruch;
                Selektionen werden ueberschrieben
------------------------------------------------------------------------*/


void SwWrtShell::InsertLineBreak()
{
    ResetCursorStack();

    if(!_CanInsert())
        return;

    if(HasSelection())
        DelRight();

    SwWrtShell::Insert(String((char)0x0A));
}
/*------------------------------------------------------------------------
 Beschreibung:  Einfuegen harter Spaltenumbruch;
                Selektionen werden ueberschrieben
------------------------------------------------------------------------*/


void SwWrtShell::InsertColumnBreak()
{
    ACT_KONTEXT(this);
    ResetCursorStack();
    if(!_CanInsert())
        return;
    StartUndo(UIUNDO_INSERT_COLUMN_BREAK);

    if ( !IsCrsrInTbl() )
    {
        if(HasSelection())
            DelRight();
        SwFEShell::SplitNode();
    }
    SetAttr(SvxFmtBreakItem(SVX_BREAK_COLUMN_BEFORE));

    EndUndo(UIUNDO_INSERT_COLUMN_BREAK);
}

/*------------------------------------------------------------------------
 Beschreibung:  Einfuegen Fussnote
 Parameter:     rStr -- optionales Fussnotenzeichen
------------------------------------------------------------------------*/


void SwWrtShell::InsertFootnote(const String &rStr, BOOL bEndNote, BOOL bEdit )
{
    ResetCursorStack();
    if(!_CanInsert())
        return;

    if(HasSelection())
        DelRight();

    SwFmtFtn aFootNote( bEndNote );
    if(rStr.Len())
        aFootNote.SetNumStr( rStr );

    SetAttr(aFootNote);

    if ( bEdit )
    {
        // zur Bearbeiung des Fussnotentextes
        Left();
        GotoFtnTxt();
    }
}
/*------------------------------------------------------------------------
 Beschreibung:  SplitNode; hier auch, da
                    - selektierter Inhalt geloescht wird;
                    - der Cursorstack gfs. zurueckgesetzt wird.
------------------------------------------------------------------------*/


void SwWrtShell::SplitNode( BOOL bAutoFmt, BOOL bCheckTableStart )
{
    ResetCursorStack();
    if(!_CanInsert())
        return;

    ACT_KONTEXT(this);

    rView.GetEditWin().FlushInBuffer( this );
    BOOL bHasSel = HasSelection();
    if( bHasSel )
    {
        StartUndo( UNDO_INSERT );
        DelRight();
    }

    SwFEShell::SplitNode( bAutoFmt, bCheckTableStart );
    if( bHasSel )
        EndUndo( UNDO_INSERT );
}

/*------------------------------------------------------------------------
 Beschreibung:  Numerierung anschalten
 Parameter:     Optionale Angabe eines Namens fuer die benannte Liste;
                dieser bezeichnet eine Position, wenn er in eine
                Zahl konvertierbar ist und kleiner ist als nMaxRules.
-------------------------------------------------------------------------*/


// zum Testen der CharFormate an der Numerierung
// extern void SetNumChrFmt( SwWrtShell*, SwNumRules& );

void SwWrtShell::NumOn()
{
    SwNumRule aNumRule( GetUniqueNumRuleName() );

    const SwNumRule* pCurRule = GetCurNumRule();
    if( !pCurRule )
    {
        // Zeichenvorlage an die Numerierung haengen
        SwCharFmt* pChrFmt = GetCharFmtFromPool( RES_POOLCHR_NUM_LEVEL );
        SwDocShell* pDocSh = GetView().GetDocShell();
        BOOL bHtml = 0 != PTR_CAST(SwWebDocShell, pDocSh);
        for( BYTE nLvl = 0; nLvl < MAXLEVEL; ++nLvl )
        {
            SwNumFmt aFmt( aNumRule.Get( nLvl ) );
            aFmt.SetCharFmt( pChrFmt );
            if(bHtml && nLvl)
            {
                // 1/2" fuer HTML
                aFmt.SetLSpace(720);
                aFmt.SetAbsLSpace(nLvl * 720);
            }
            aNumRule.Set( nLvl, aFmt );
        }
        SetCurNumRule( aNumRule );
    }
}

/*------------------------------------------------------------------------
 Beschreibung:  Default-Bulletliste erfragen
------------------------------------------------------------------------*/

void SwWrtShell::BulletOn()
{
    SwNumRule aRule( GetUniqueNumRuleName() );

    SwCharFmt* pChrFmt = GetCharFmtFromPool( RES_POOLCHR_BUL_LEVEL );
    const Font* pFnt = &SwNumRule::GetDefBulletFont();

    SwDocShell* pDocSh = GetView().GetDocShell();
    BOOL bHtml = 0 != PTR_CAST(SwWebDocShell, pDocSh);
    for( BYTE n = 0; n < MAXLEVEL; ++n )
    {
        SwNumFmt aFmt( aRule.Get( n ) );
        aFmt.SetBulletFont( pFnt );
        aFmt.SetBulletChar( cBulletChar );
        aFmt.eType = SVX_NUM_CHAR_SPECIAL;
        aFmt.SetCharFmt( pChrFmt );
        if(bHtml && n)
        {
            // 1/2" fuer HTML
            aFmt.SetLSpace(720);
            aFmt.SetAbsLSpace(n * 720);
        }
        aRule.Set( n, aFmt );
    }
    SetCurNumRule( aRule );
}

/*--------------------------------------------------

--------------------------------------------------*/
int SwWrtShell::GetSelectionType() const
{
    // ContentType kann nicht ermittelt werden innerhalb einer
    // Start-/Endactionklammerung.
    // Da es keinen ungueltigen Wert gibt, wird TEXT geliefert.
    // Der Wert ist egal, da in EndAction ohnehin aktualisiert wird.

    if ( BasicActionPend() )
        return IsSelFrmMode() ? SEL_FRM : SEL_TXT;

//  if ( IsTableMode() )
//      return SEL_TBL | SEL_TBL_CELLS;

    SwView &rView = ((SwView&)GetView());
    USHORT nCnt;

    // Rahmen einfuegen ist kein DrawMode
    if ( !rView.GetEditWin().IsFrmAction() &&
            (IsObjSelected() || (rView.IsDrawMode() && !IsFrmSelected()) ))
    {
        if (GetDrawView()->IsTextEdit())
            nCnt = SEL_DRW_TXT;
        else
        {
            if (GetView().IsFormMode()) // Nur Forms selektiert
                nCnt = SEL_DRW_FORM;
            else
                nCnt = SEL_DRW;         // Irgendein Draw-Objekt

            if (rView.IsBezierEditMode())
                nCnt |= SEL_BEZ;
        }

        return nCnt;
    }

    nCnt = GetCntType();

    if ( IsFrmSelected() )
    {
        if (rView.IsDrawMode())
            rView.LeaveDrawCreate();    // Aufraeumen (Bug #45639)
        if ( !(nCnt & (CNT_GRF | CNT_OLE)) )
            return SEL_FRM;
    }

    if ( IsCrsrInTbl() )
        nCnt |= SEL_TBL;

    if ( IsTableMode() )
        nCnt |= (SEL_TBL | SEL_TBL_CELLS);

    if ( GetCurNumRule() )
        nCnt |= SEL_NUM;

    return nCnt;
}

/*------------------------------------------------------------------------
 Beschreibung:  Finden der TextCollection mit dem Name rCollname
 Return:                Pointer auf die Collection oder 0, wenn keine
                                TextCollection mit diesem Namen existiert oder
                                diese eine Defaultvorlage ist.
------------------------------------------------------------------------*/


SwTxtFmtColl *SwWrtShell::GetParaStyle(const String &rCollName, GetStyle eCreate )
{
    SwTxtFmtColl* pColl = FindTxtFmtCollByName( rCollName );
    if( !pColl && GETSTYLE_NOCREATE != eCreate )
    {
        USHORT nId = GetPoolId( rCollName, GET_POOLID_TXTCOLL );
        if( USHRT_MAX != nId || GETSTYLE_CREATEANY == eCreate )
            pColl = GetTxtCollFromPool( nId );
    }
    return pColl;
}
/*------------------------------------------------------------------------
 Beschreibung:  Finden der Zeichenvorlage mit dem Name rCollname
 Return:                Pointer auf die Collection oder 0, wenn keine
                                Zeichenvorlage mit diesem Namen existiert oder
                                diese eine Defaultvorlage oder automatische Vorlage ist.
------------------------------------------------------------------------*/



SwCharFmt *SwWrtShell::GetCharStyle(const String &rFmtName, GetStyle eCreate )
{
    SwCharFmt* pFmt = FindCharFmtByName( rFmtName );
    if( !pFmt && GETSTYLE_NOCREATE != eCreate )
    {
        USHORT nId = GetPoolId( rFmtName, GET_POOLID_CHRFMT );
        if( USHRT_MAX != nId || GETSTYLE_CREATEANY == eCreate )
            pFmt = (SwCharFmt*)GetFmtFromPool( nId );
    }
    return pFmt;
}

/*------------------------------------------------------------------------
 Beschreibung:  Finden des Tabellenformates mit dem Name rFmtname
 Return:                Pointer auf das Format oder 0, wenn kein
                                Rahmenformat mit diesem Namen existiert oder
                                dieses eine Defaultformat oder automatisches Format ist.
------------------------------------------------------------------------*/



SwFrmFmt *SwWrtShell::GetTblStyle(const String &rFmtName)
{
    SwFrmFmt *pFmt = 0;
    for( USHORT i = GetTblFrmFmtCount(); i; )
        if( !( pFmt = &GetTblFrmFmt( --i ) )->IsDefault() &&
            pFmt->GetName() == rFmtName && IsUsed( *pFmt ) )
            return pFmt;
    return 0;
}


/*------------------------------------------------------------------------
 Beschreibung:  Anwenden der Vorlagen
------------------------------------------------------------------------*/



void SwWrtShell::SetPageStyle(const String &rCollName)
{
    if( !SwCrsrShell::HasSelection() && !IsSelFrmMode() && !IsObjSelected() )
    {
        SwPageDesc* pDesc = FindPageDescByName( rCollName, TRUE );
        if( pDesc )
            ChgCurPageDesc( *pDesc );
    }
}

/*------------------------------------------------------------------------
 Beschreibung:  Zugriff Vorlagen
------------------------------------------------------------------------*/



String SwWrtShell::GetCurPageStyle( const BOOL bCalcFrm ) const
{
    return GetPageDesc(GetCurPageDesc( bCalcFrm )).GetName();
}

/*------------------------------------------------------------------------
 Beschreibung:  Aktuelle Vorlage anhand der geltenden Attribute aendern
------------------------------------------------------------------------*/


void SwWrtShell::QuickUpdateStyle()
{
    SwTxtFmtColl *pColl = GetCurTxtFmtColl();

    // Standard kann nicht geaendert werden
    if(pColl && !pColl->IsDefault())
    {
        FillByEx(pColl);
            // Vorlage auch anwenden, um harte Attributierung
            // zu entfernen
        SetTxtFmtColl(pColl);
    }
}


void SwWrtShell::AutoUpdatePara(SwTxtFmtColl* pColl, const SfxItemSet& rStyleSet)
{
    SfxItemSet aCoreSet( GetAttrPool(),
            RES_CHRATR_BEGIN,           RES_CHRATR_END - 1,
            RES_PARATR_BEGIN,           RES_PARATR_END - 1,
            RES_FRMATR_BEGIN,           RES_FRMATR_END - 1,
            SID_ATTR_TABSTOP_POS,       SID_ATTR_TABSTOP_POS,
            SID_ATTR_TABSTOP_DEFAULTS,  SID_ATTR_TABSTOP_DEFAULTS,
            SID_ATTR_TABSTOP_OFFSET,    SID_ATTR_TABSTOP_OFFSET,
            SID_ATTR_BORDER_INNER,      SID_ATTR_BORDER_INNER,
            SID_ATTR_PARA_MODEL,        SID_ATTR_PARA_KEEP,
            SID_ATTR_PARA_PAGENUM,      SID_ATTR_PARA_PAGENUM,
            0   );
    GetAttr( aCoreSet );
    BOOL bReset = FALSE;
    SfxItemIter aParaIter( aCoreSet );
    const SfxPoolItem* pParaItem = aParaIter.FirstItem();
    while( pParaItem )
    {
        if(!IsInvalidItem(pParaItem))
        {
            USHORT nWhich = pParaItem->Which();
            if(SFX_ITEM_SET == aCoreSet.GetItemState(nWhich) &&
               SFX_ITEM_SET == rStyleSet.GetItemState(nWhich))
            {
                aCoreSet.ClearItem(nWhich);
                bReset = TRUE;
            }
        }
        pParaItem = aParaIter.NextItem();
    }
    StartAction();
    if(bReset)
    {
        ResetAttr();
        SetAttr(aCoreSet);
    }
    pColl->SetAttr( rStyleSet );
    EndAction();
}

/*-----------------12.03.97 12.24-------------------

--------------------------------------------------*/

void SwWrtShell::AutoUpdateFrame( SwFrmFmt* pFmt, const SfxItemSet& rStyleSet )
{
    StartAction();

    ResetFlyFrmAttr( 0, &rStyleSet );
    pFmt->SetAttr( rStyleSet );

    EndAction();
}


void SwWrtShell::AutoCorrect( SvxAutoCorrect& rACorr, sal_Unicode cChar )
{
    ResetCursorStack();
    if(_CanInsert())
    {
        BOOL bStarted = FALSE;
        if(HasSelection())
        {
                // nur hier klammern, da das normale Insert schon an der
                // Editshell geklammert ist
            StartAllAction();
            StartUndo(UNDO_INSERT);
            bStarted = TRUE;
            DelRight();
        }
        SwEditShell::AutoCorrect( rACorr, IsInsMode(), cChar );

        if(bStarted)
        {
            EndAllAction();
            EndUndo(UNDO_INSERT);
        }
    }
}


/*
 * eine Art kontrollierter copy ctor
 */

SwWrtShell::SwWrtShell(SwWrtShell *pSh, Window *pWin, SwView &rShell) :
     SwFEShell( pSh,pWin ),
     COMMON_INI_LIST
{
    BITFLD_INI_LIST
    SET_CURR_SHELL( this );
    SetSfxViewShell( (SfxViewShell *)&rShell );
    SetFlyMacroLnk( LINK(this, SwWrtShell, ExecFlyMac) );
}


SwWrtShell::SwWrtShell(SwDoc *pDoc,
                       uno::Reference< linguistic::XSpellChecker1 > &xSpell,
                       uno::Reference< linguistic::XHyphenator > &xHyph,
                       Window *pWin, SwView &rShell, SwRootFrm *pRoot,
                       const SwViewOption *pViewOpt )
    : SwFEShell(pDoc, xSpell, xHyph, pWin, pRoot, pViewOpt),
      COMMON_INI_LIST
{
    BITFLD_INI_LIST
    SET_CURR_SHELL( this );
    SetSfxViewShell( (SfxViewShell *)&rShell );
    SetFlyMacroLnk( LINK(this, SwWrtShell, ExecFlyMac) );
}

/*
 * ctor
 */



SwWrtShell::~SwWrtShell()
{
    SET_CURR_SHELL( this );
    while(IsModePushed())
        PopMode();
    while(PopCrsr(FALSE))
        ;
}




void SwWrtShell::StartBasicAction()
{
    IncBasicAction();
    StartAllAction();
}



void SwWrtShell::SetBasicActionCount(USHORT nSet)
{
    DBG_ASSERT(!GetBasicActionCnt(), "Es sind schon Actions offen!")
    while( nSet )
    {
        IncBasicAction();
        StartAllAction();
        nSet--;
    }
}



void SwWrtShell::EndBasicAction()
{
    if(GetBasicActionCnt())
    {
        DecBasicAction();
        EndAllAction();
    }
}



USHORT SwWrtShell::EndAllBasicActions()
{
    USHORT nRet = GetBasicActionCnt();
    while( GetBasicActionCnt() )
    {
        DecBasicAction();
        EndAllAction();
    }
    return nRet;
}



FASTBOOL SwWrtShell::Pop( BOOL bOldCrsr )
{
    FASTBOOL bRet = SwCrsrShell::Pop( bOldCrsr );
    if( bRet && IsSelection() )
    {
        fnSetCrsr = &SwWrtShell::SetCrsrKillSel;
        fnKillSel = &SwWrtShell::ResetSelect;
    }
    return bRet;
}

/*--------------------------------------------------------------------
    Beschreibung:
 --------------------------------------------------------------------*/



BOOL SwWrtShell::CanInsert()
{
    return (!(IsSelFrmMode() | IsObjSelected() | (GetView().GetDrawFuncPtr() != NULL)));
}



    // die Core erzeugt eine Selektion, das SttSelect muss gerufen werden
void SwWrtShell::NewCoreSelection()
{
    SttSelect();
}

// --------------


/*************************************************************************

   $Log: not supported by cvs2svn $
   Revision 1.342  2000/09/18 16:06:27  willem.vandorp
   OpenOffice header added.

   Revision 1.341  2000/08/17 11:36:19  jp
   remove the SW graphicmanager

   Revision 1.340  2000/08/04 10:54:03  jp
   Soft-/HardHyphens & HardBlanks changed from attribute to unicode character; remove unused methods

   Revision 1.339  2000/07/04 15:19:25  tl
   XHyphenator1 => XHyphenator

   Revision 1.338  2000/06/27 17:42:38  jp
   Bug #76332#: internal SplitNode don't insert a new node before a table

   Revision 1.337  2000/06/26 13:28:29  os
   InsertDBColumnCntnt removed

   Revision 1.336  2000/05/19 12:58:39  jp
   use WordSelection class for check chars

   Revision 1.335  2000/05/19 11:00:26  jp
   Changes for Unicode

   Revision 1.334  2000/04/20 12:51:14  os
   GetName() returns String&

   Revision 1.333  2000/04/19 11:18:25  os
   UNICODE

   Revision 1.332  2000/03/30 13:26:18  os
   UNO III

   Revision 1.331  2000/03/23 07:51:11  os
   UNO III

*************************************************************************/



diff --git a/sw/source/ui/wrtsh/wrtsh2.cxx b/sw/source/ui/wrtsh/wrtsh2.cxx
new file mode 100644
index 0000000..9b55eb3
--- /dev/null
+++ b/sw/source/ui/wrtsh/wrtsh2.cxx
@@ -0,0 +1,805 @@
/*************************************************************************
 *
 *  $RCSfile: wrtsh2.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:53 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _HINTIDS_HXX
#include <hintids.hxx>      // define ITEMIDs
#endif

#ifndef _SFXMACITEM_HXX //autogen
#include <svtools/macitem.hxx>
#endif
#ifndef _SFXFRAME_HXX //autogen
#include <sfx2/frame.hxx>
#endif
#ifndef _SFXDOCINF_HXX //autogen
#include <sfx2/docinf.hxx>
#endif
#ifndef _SFXINIMGR_HXX //autogen
#include <svtools/iniman.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef SVTOOLS_URIHELPER_HXX
#include <svtools/urihelper.hxx>
#endif
#ifndef _SFXENUMITEM_HXX //autogen
#include <svtools/eitem.hxx>
#endif
#ifndef _SFXSTRITEM_HXX
#include <svtools/stritem.hxx>
#endif
#ifndef _SFXDOCFILE_HXX //autogen
#include <sfx2/docfile.hxx>
#endif
#ifndef _SFX_FCONTNR_HXX //autogen
#include <sfx2/fcontnr.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _LINKMGR_HXX //autogen
#include <so3/linkmgr.hxx>
#endif

#ifndef _FMTINFMT_HXX //autogen
#include <fmtinfmt.hxx>
#endif
#ifndef _FRMATR_HXX
#include <frmatr.hxx>
#endif
#ifndef _SWTYPES_HXX
#include <swtypes.hxx>      // SET_CURR_SHELL
#endif
#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef _FLDBAS_HXX
#include <fldbas.hxx>       // Felder
#endif
#ifndef _EXPFLD_HXX
#include <expfld.hxx>
#endif
#ifndef _DDEFLD_HXX
#include <ddefld.hxx>
#endif
#ifndef _DOCUFLD_HXX
#include <docufld.hxx>
#endif
#ifndef _REFFLD_HXX
#include <reffld.hxx>
#endif
#ifndef _SWUNDO_HXX
#include <swundo.hxx>
#endif
#ifndef _NUMRULE_HXX
#include <numrule.hxx>      // Numerierung
#endif
#ifndef _DOC_HXX
#include <doc.hxx>
#endif
#ifndef _INPDLG_HXX
#include <inpdlg.hxx>       // Eingabefelder
#endif
#ifndef _VIEWOPT_HXX
#include <viewopt.hxx>      // SwViewOptions
#endif
#ifndef _FRMFMT_HXX
#include <frmfmt.hxx>       // fuer UpdateTable
#endif
#ifndef _SWTABLE_HXX
#include <swtable.hxx>      // fuer UpdateTable
#endif
#ifndef _HINTS_HXX
#include <hints.hxx>        // fuer UpdateTable
#endif
#ifndef _MDIEXP_HXX
#include <mdiexp.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _SWEVENT_HXX
#include <swevent.hxx>
#endif
#ifndef _POOLFMT_HXX
#include <poolfmt.hxx>
#endif
#ifndef _SECTION_HXX
#include <section.hxx>
#endif
#ifndef _NAVICONT_HXX
#include <navicont.hxx>
#endif
#ifndef _NAVIPI_HXX
#include <navipi.hxx>
#endif

#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _WRTSH_HRC
#include <wrtsh.hrc>
#endif


void lcl_LoadUrl( const String& rURL, const String& rTargetFrameName,
                const String& rReferer, USHORT nFilter, SfxFrameItem& );


/*------------------------------------------------------------------------
        Beschreibung:
------------------------------------------------------------------------*/

void SwWrtShell::Insert(SwField &rFld)
{
    ResetCursorStack();
    if(!_CanInsert())
        return;
    StartAllAction();
    StartUndo(UNDO_INSERT);

//JP 09.06.97: Wozu die Abpruefung des FeldTypen??
//          Wobei das SETREFFLD kein Feld ist und hier garnicht durchkommt!
//  USHORT nType = rFld.GetTyp()->Which();
//  if(HasSelection() && nType != RES_HIDDENTXTFLD && nType != RES_SETREFFLD)
    if( HasSelection() )
        DelRight();

    SwEditShell::Insert(rFld);
    EndUndo(UNDO_INSERT);
    EndAllAction();
}

/*--------------------------------------------------------------------
    Beschreibung: Felder Update anschmeissen
 --------------------------------------------------------------------*/



void SwWrtShell::UpdateInputFlds( SwInputFieldList* pLst, BOOL bOnlyInSel )
{
    // ueber die Liste der Eingabefelder gehen und Updaten
    SwInputFieldList* pTmp = pLst;
    if( !pTmp )
        pTmp = new SwInputFieldList( this );

    if (bOnlyInSel)
        pTmp->RemoveUnselectedFlds();

    pTmp->PushCrsr();

    const USHORT nCnt = pTmp->Count();
    BOOL bCancel = FALSE;
    for( USHORT i = 0; i < nCnt && !bCancel; ++i )
    {
        pTmp->GotoFieldPos( i );
        bCancel = StartInputFldDlg( pTmp->GetField( i ), TRUE );

        // Sonst Updatefehler bei Multiselektion:
        pTmp->GetField( i )->GetTyp()->UpdateFlds();
    }
    pTmp->PopCrsr();

    if( !pLst )
        delete pTmp;
}


/*--------------------------------------------------------------------
    Beschreibung: EingabeDialog fuer ein bestimmtes Feld starten
 --------------------------------------------------------------------*/



BOOL SwWrtShell::StartInputFldDlg( SwField* pFld, BOOL bNextButton )
{
//JP 14.08.96: Bug 30332 - nach Umbau der modularietaet im SFX, muss jetzt
//              das TopWindow der Application benutzt werden.
//  SwFldInputDlg* pDlg = new SwFldInputDlg( GetWin(), *this, pFld );

    SwFldInputDlg* pDlg = new SwFldInputDlg( NULL, *this, pFld, bNextButton );
    BOOL bRet = RET_CANCEL == pDlg->Execute();

    delete pDlg;
    GetWin()->Update();
    return bRet;
}



/*--------------------------------------------------------------------
    Beschreibung: Verzeichnis einfuegen Selektion loeschen
 --------------------------------------------------------------------*/



void SwWrtShell::InsertTableOf(const SwTOXBase& rTOX, const SfxItemSet* pSet)
{
    if(!_CanInsert())
        return;

    if(HasSelection())
        DelRight();

    SwEditShell::InsertTableOf(rTOX, pSet);
}


/*--------------------------------------------------------------------
    Beschreibung: Verzeichnis Updaten Selektion loeschen
 --------------------------------------------------------------------*/

BOOL SwWrtShell::UpdateTableOf(const SwTOXBase& rTOX, const SfxItemSet* pSet)
{
    if(!_CanInsert())
        return FALSE;

    return SwEditShell::UpdateTableOf(rTOX, pSet);
}

    // ein Klick aus das angegebene Feld. Der Cursor steht auf diesem.
    // Fuehre die vor definierten Aktionen aus.


void SwWrtShell::ClickToField( const SwField& rFld, USHORT nFilter )
{
    bIsInClickToEdit = TRUE;
    switch( rFld.GetTyp()->Which() )
    {
    case RES_JUMPEDITFLD:
        {
            USHORT nSlotId = 0;
            switch( rFld.GetFormat() )
            {
            case JE_FMT_TABLE:
                nSlotId = FN_INSERT_TABLE;
                break;

            case JE_FMT_FRAME:
                nSlotId = FN_INSERT_FRAME;
                break;

            case JE_FMT_GRAPHIC:    nSlotId = SID_INSERT_GRAPHIC;       break;
            case JE_FMT_OLE:        nSlotId = SID_INSERT_OBJECT;        break;

//          case JE_FMT_TEXT:
            }

            Right( TRUE );      // Feld selektieren

            if( nSlotId )
            {
                StartUndo( UNDO_START );
                GetView().GetViewFrame()->GetDispatcher()->Execute( nSlotId,
                            SFX_CALLMODE_SYNCHRON|SFX_CALLMODE_RECORD );
                EndUndo( UNDO_END );
            }
        }
        break;

    case RES_MACROFLD:
        {
            const SwMacroField *pFld = (const SwMacroField*)&rFld;
            String sLibName(pFld->GetLibName());
            String sMacroName(pFld->GetMacroName());

            if( sLibName.Len() && sMacroName.Len() )
            {
                String sText( rFld.GetPar2() );
                String sRet( sText );
                SvxMacro aMacro( sMacroName, sLibName, STARBASIC );
                ExecMacro( aMacro, &sRet );

                // return Wert veraendert?
                if( sRet != sText )
                {
                    StartAllAction();
                    ((SwField&)rFld).SetPar2( sRet );
                    ((SwField&)rFld).GetTyp()->UpdateFlds();
                    EndAllAction();
                }
            }
        }
        break;

    case RES_GETREFFLD:
        StartAllAction();
        SwCrsrShell::GotoRefMark( ((SwGetRefField&)rFld).GetSetRefName(),
                                    ((SwGetRefField&)rFld).GetSubType(),
                                    ((SwGetRefField&)rFld).GetSeqNo() );
        EndAllAction();
        break;

    case RES_INPUTFLD:
        StartInputFldDlg( (SwField*)&rFld, FALSE );
        break;

    case RES_SETEXPFLD:
        if( ((SwSetExpField&)rFld).GetInputFlag() )
            StartInputFldDlg( (SwField*)&rFld, FALSE );
        break;
    }

    bIsInClickToEdit = FALSE;
}



void SwWrtShell::ClickToINetAttr( const SwFmtINetFmt& rItem, USHORT nFilter )
{
    if( !rItem.GetValue().Len() )
        return ;

    bIsInClickToEdit = TRUE;

    // erstmal das evt. gesetzte ObjectSelect Macro ausfuehren
    const SvxMacro* pMac = rItem.GetMacro( SFX_EVENT_MOUSECLICK_OBJECT );
    if( pMac )
    {
        SwCallMouseEvent aCallEvent;
        aCallEvent.Set( &rItem );
        GetDoc()->CallEvent( SFX_EVENT_MOUSECLICK_OBJECT, aCallEvent, FALSE );
    }

    // damit die Vorlagenumsetzung sofort angezeigt wird
    ::LoadURL( rItem.GetValue(), this, nFilter, &rItem.GetTargetFrame() );
    bIsInClickToEdit = FALSE;
}



BOOL SwWrtShell::ClickToINetGrf( const Point& rDocPt, USHORT nFilter )
{
    BOOL bRet = FALSE;
    String sURL;
    String sTargetFrameName;
    const SwFrmFmt* pFnd = IsURLGrfAtPos( rDocPt, &sURL, &sTargetFrameName );
    if( pFnd && sURL.Len() )
    {
        bRet = TRUE;
        // erstmal das evt. gesetzte ObjectSelect Macro ausfuehren
        const SvxMacro* pMac = &pFnd->GetMacro().GetMacro( SFX_EVENT_MOUSECLICK_OBJECT );
        if( pMac )
        {
            SwCallMouseEvent aCallEvent;
            aCallEvent.Set( EVENT_OBJECT_URLITEM, pFnd );
            GetDoc()->CallEvent( SFX_EVENT_MOUSECLICK_OBJECT, aCallEvent, FALSE );
        }

        ::LoadURL( sURL, this, nFilter, &sTargetFrameName);
    }
    return bRet;
}


void LoadURL( const String& rURL, ViewShell* pVSh, USHORT nFilter,
              const String *pTargetFrameName )
{
    ASSERT( rURL.Len(), "was soll hier geladen werden?" );
    if( !rURL.Len() )
        return ;

    // die Shell kann auch 0 sein !!!!!
    SwWrtShell *pSh = 0;
    if ( pVSh && pVSh->ISA(SwCrsrShell) )
    {
        //Eine CrsrShell ist auch immer eine WrtShell
        pSh = (SwWrtShell*)pVSh;
    }

    String sTargetFrame;
    if( pTargetFrameName && pTargetFrameName->Len() )
        sTargetFrame = *pTargetFrameName;
    else if( pSh )
        sTargetFrame = pSh->GetDoc()->GetInfo()->GetDefaultTarget();

    String sReferer;
    SfxFrame* pViewFrm = 0;
    if( pSh )
    {
        SwDocShell* pDShell = pSh->GetView().GetDocShell();
        if( pDShell && pDShell->GetMedium() )
            sReferer = pDShell->GetMedium()->GetName();
        pViewFrm = pSh->GetView().GetViewFrame()->GetFrame();
    }

    SfxFrameItem aView( SID_DOCFRAME, pViewFrm );
    ::lcl_LoadUrl( rURL, sTargetFrame, sReferer, nFilter,
                    aView );
}

void lcl_LoadUrl( const String& rURL, const String& rTargetFrameName,
                    const String& rReferer, USHORT nFilter,
                    SfxFrameItem& rView )
{
    SfxStringItem aName( SID_FILE_NAME, rURL );
    SfxStringItem aTargetFrameName( SID_TARGETNAME, rTargetFrameName );
    SfxStringItem aReferer( SID_REFERER, rReferer );

    SfxBoolItem aNewView( SID_OPEN_NEW_VIEW, FALSE );
    //#39076# Silent kann lt. SFX entfernt werden.
//  SfxBoolItem aSilent( SID_SILENT, TRUE );
    SfxBoolItem aReadOnly( SID_BROWSING, TRUE );

    SfxStringItem aFilter( SID_FILTER_NAME, aEmptyStr );
    switch( nFilter & ~URLLOAD_NEWVIEW )
    {
    case URLLOAD_CHOOSEFILTER:
        aFilter.SetValue( SfxExecutableFilterContainer::GetChooserFilter()
                            ->GetName() );
        break;
    case URLLOAD_DOWNLOADFILTER:
        aFilter.SetValue( SfxExecutableFilterContainer::GetDownloadFilter()
                            ->GetName() );
        break;
    }

    if( nFilter & URLLOAD_NEWVIEW )
        aTargetFrameName.SetValue( String::CreateFromAscii("_blank") );

    ((SfxViewFrame*)rView.GetFrame())->GetDispatcher()->Execute( SID_OPENDOC,
            SFX_CALLMODE_ASYNCHRON|SFX_CALLMODE_RECORD,
                            &aName,
                            &aFilter,
                            &aNewView, /*&aSilent,*/ &aReadOnly,
                            &aReferer,
                            &rView, &aTargetFrameName,
                            0L );
}

void SwWrtShell::NavigatorPaste( const NaviContentBookmark& rBkmk, const DropEvent* pEvt )
{
    USHORT nRegionMode;
    if(pEvt->IsDefaultAction())
        nRegionMode = rBkmk.GetDefaultDragType();
    else
        switch(pEvt->GetAction())
        {
            case DROP_COPY: nRegionMode = REGION_MODE_NONE; break;
            case DROP_MOVE: nRegionMode = REGION_MODE_EMBEDDED; break;
            default: nRegionMode = REGION_MODE_LINK;
        }
    if(nRegionMode == REGION_MODE_NONE)
    {
        // Einfuegen
        String sURL = rBkmk.GetURL();
        //handelt es sich um ein Sprung innerhalb des akt. Docs?
        const SwDocShell* pDocShell = GetView().GetDocShell();
        if(pDocShell->HasName())
        {
            USHORT nPos = 0;
            const String rName = URIHelper::SmartRelToAbs(
                                    pDocShell->GetMedium()->GetURLObject().GetURLNoMark());

            if(COMPARE_EQUAL == sURL.CompareTo(rName, rName.Len()))
                sURL.Erase(0, rName.Len());
        }
        SwFmtINetFmt aFmt( sURL, aEmptyStr );
        InsertURL( aFmt, rBkmk.GetDescription() );
    }
    else
    {
        SwSection aSection( FILE_LINK_SECTION, GetUniqueSectionName( 0 ) );
        String aLinkFile( rBkmk.GetURL().GetToken(0, '#') );
        aLinkFile += cTokenSeperator;
        aLinkFile += cTokenSeperator;
        aLinkFile += rBkmk.GetURL().GetToken(1, '#');
        aSection.SetLinkFileName( aLinkFile );
        aSection.SetProtect( TRUE );
        const SwSection* pIns = InsertSection( aSection );
        if( REGION_MODE_EMBEDDED == nRegionMode && pIns )
        {
            aSection = *pIns;
            aSection.SetLinkFileName( aEmptyStr );
            aSection.SetType( CONTENT_SECTION );
            aSection.SetProtect( FALSE );

            // the update of content from linked section at time delete
            // the undostack. Then the change of the section dont create
            // any undoobject. -  BUG 69145
            BOOL bDoesUndo = DoesUndo();
            if( UNDO_INSSECTION != GetUndoIds() )
                DoUndo( FALSE );
            ChgSection( GetSectionFmtPos( *pIns->GetFmt() ), aSection );
            DoUndo( bDoesUndo );
        }
    }
}

/*************************************************************************

      $Log: not supported by cvs2svn $
      Revision 1.137  2000/09/18 16:06:27  willem.vandorp
      OpenOffice header added.

      Revision 1.136  2000/09/07 15:59:36  os
      change: SFX_DISPATCHER/SFX_BINDINGS removed

      Revision 1.135  2000/08/31 11:31:37  jp
      add missing include

      Revision 1.134  2000/06/26 13:04:50  os
      INetURLObject::SmartRelToAbs removed

      Revision 1.133  2000/04/19 11:18:25  os
      UNICODE

      Revision 1.132  2000/03/03 12:29:37  mib
      Removed JavaScript

      Revision 1.131  2000/02/11 15:03:35  hr
      #70473# changes for unicode ( patched by automated patchtool )

      Revision 1.130  1999/10/15 09:58:25  jp
      Bug #69145#: NavigatorPaste: copy embedded Section without undo

      Revision 1.129  1999/08/17 11:59:18  OS
      extended indexes: get/set section attributes


      Rev 1.128   17 Aug 1999 13:59:18   OS
   extended indexes: get/set section attributes

      Rev 1.127   27 Apr 1999 16:50:36   JP
   Bug #65314#: neu: IsJavaScriptEnabled

      Rev 1.126   19 Apr 1999 13:00:42   OS
   #64960# GetURLObject()->GetURLNoMark statt GetPhysicalName

      Rev 1.125   15 Apr 1999 16:48:32   JP
   Bug #64841#: LoadURL: URL-Attrs ohne URL ignorieren

      Rev 1.124   12 Oct 1998 10:01:38   OM
   #57790# Dialog nicht mehr AppModal

      Rev 1.123   01 Jul 1998 16:37:48   JP
   Bug #51378#: Return String von JavaScript auswerten

      Rev 1.122   19 Jun 1998 18:57:48   JP
   Bug #51378#: LoadURL CallbackHdl - JavaReturnWert auswerten

      Rev 1.121   19 May 1998 12:45:06   OM
   SvxMacro-Umstellung

      Rev 1.120   13 Feb 1998 17:46:50   HJS
   falsche ifdef SOLAR_JAVE aufgeloest

      Rev 1.119   02 Feb 1998 15:04:18   OM
   #46781# Macrofelder auch ausfuehren, wenn Dateiname mehr als 1 Punkt enthaelt

      Rev 1.118   02 Dec 1997 14:21:40   MA
   includes

      Rev 1.117   24 Nov 1997 14:35:08   MA
   includes

      Rev 1.116   03 Nov 1997 14:02:56   MA
   precomp entfernt

      Rev 1.115   24 Oct 1997 18:30:08   JP
   ClickToINetGrf: BOOL returnen - ob wirklich eine Grafik getroffen wurde

      Rev 1.114   01 Sep 1997 13:22:00   OS
   DLL-Umstellung

      Rev 1.113   15 Aug 1997 12:15:42   OS
   chartar/frmatr/txtatr aufgeteilt

      Rev 1.112   11 Aug 1997 10:54:18   OS
   paraitem/frmitems/textitem aufgeteilt

      Rev 1.111   08 Aug 1997 17:28:40   OM
   Headerfile-Umstellung

      Rev 1.110   07 Aug 1997 14:59:36   OM
   Headerfile-Umstellung

      Rev 1.109   05 Aug 1997 13:40:10   MH
   chg: header

      Rev 1.108   23 Jul 1997 21:46:28   HJS
   includes

      Rev 1.107   23 Jul 1997 10:19:04   OM
   Inputfields in Selektion updaten

      Rev 1.106   27 Jun 1997 17:27:06   JP
   Bug #38115#: nicht nur Top sondern auch den akt. Frame merken

      Rev 1.105   26 Jun 1997 15:59:24   OS
   BulletOn jetzt in wrtsh1.cxx

      Rev 1.104   09 Jun 1997 16:21:08   JP
   ClickINetURL/ClickToINetGrf: falls JavaScript abgeschaltet ist LoadURL trotzdem rufen

      Rev 1.103   09 Jun 1997 15:28:04   NF
   Define raus, da SfxModalDialog unbekannt

      Rev 1.102   09 Jun 1997 11:47:46   JP
   InsertFld: Abpruefung auf den FeldTypen entfernt - ueberflussig

      Rev 1.101   23 Apr 1997 14:44:36   OS
   FrameItem anlegen fuer VA3.0

      Rev 1.100   21 Apr 1997 18:22:12   MA
   #39076# kein Silent

      Rev 1.99   19 Apr 1997 09:39:32   OS
   NavigatorPaste: GetPhysicalName am Medium!

      Rev 1.98   15 Apr 1997 15:12:38   JP
   Bug #37980#: LoadURL - bei Events mit JavaScript immer asynchron callen

      Rev 1.97   11 Apr 1997 08:48:52   MA
   includes

      Rev 1.96   09 Apr 1997 15:34:40   JP
   ClickToINetGrf/ClickToINetAttr - handelt das asynchron JavaScript und Laden einer URL

      Rev 1.95   07 Apr 1997 13:47:12   MH
   chg: header

      Rev 1.94   20 Mar 1997 08:02:40   OS
   Bookmark nicht mit GetToken(#), sondern mit Compare behandeln

      Rev 1.93   18 Feb 1997 23:29:30   NF
   SID_FILE_CONVERT wech...

      Rev 1.92   18 Feb 1997 23:26:56   NF
   SID_FILE_CONVERT wech...

      Rev 1.91   12 Feb 1997 18:22:32   MA
   chg: LoadURL, Historie auch bei newview erhalten (kopieren)

      Rev 1.90   07 Feb 1997 12:04:18   OS
   Navigator benutzt eigenes Drag-Format

      Rev 1.89   28 Jan 1997 14:11:10   JP
   ClickToINet: CallEvent statt ExecMac rufen

      Rev 1.88   16 Jan 1997 09:59:46   MA
   Umstellung Frame

      Rev 1.87   15 Jan 1997 16:09:00   OM
   Neue OLE-Dialoge

      Rev 1.86   04 Dec 1996 15:11:22   JP
   SW_EVENT -> SVX_EVENT/SFX_EVENT

      Rev 1.85   28 Nov 1996 17:15:40   OS
   ChildWindow testen

      Rev 1.84   19 Nov 1996 16:15:26   OS
   Navigatorumstellung

      Rev 1.83   06 Nov 1996 10:54:20   MA
   chg: URL per Dokument; Draw+Calc eingebunden (ifdef)

      Rev 1.82   05 Nov 1996 15:34:12   JP
   GotoRefMark: Parameter erweitert fuer erweiterte RefMarks

      Rev 1.81   17 Oct 1996 14:45:42   MH
   Syntax

      Rev 1.80   17 Oct 1996 14:37:08   MH
   add: include

      Rev 1.79   11 Oct 1996 14:52:58   NF
   clooks

      Rev 1.78   25 Sep 1996 10:36:46   PL
   IRIX

      Rev 1.77   05 Sep 1996 16:53:20   OS
   Tasten fuer NavigatorPaste auswerten

      Rev 1.76   02 Sep 1996 18:43:22   JP
   INetFeld entfernt

      Rev 1.75   30 Aug 1996 12:40:20   OS
   InputFldDlg mit Next-Button

      Rev 1.74   29 Aug 1996 09:26:02   OS
   includes

      Rev 1.73   19 Aug 1996 22:22:24   JP
   LoadURL: neue View darf auch keinen TargetNamen haben

      Rev 1.72   14 Aug 1996 16:54:54   JP
   Bug #30332#: am FieldInputWin das TopWindow der Applikation setzen

      Rev 1.71   14 Aug 1996 09:35:02   JP
   neu: NavigatorPaste - Paste aus dem Navigator ins Doc (Code aus dataex hierher verschoben)

      Rev 1.70   12 Aug 1996 18:10:46   JP
   LoadURL: das ViewItem darf nicht uebergeben werden

      Rev 1.69   12 Aug 1996 16:56:36   JP
   neues FilterFlag: neue Ansicht beim LoadURL oeffnen

      Rev 1.68   08 Aug 1996 10:04:02   JP
   neu: ClickToINetAttr - entspricht dem ClickToFld

      Rev 1.67   29 Jul 1996 11:06:10   JP
   ueberfluessige Methode entfernt

      Rev 1.66   23 Jul 1996 19:45:24   MIB
   Default-Target-Frame aus Dokinfo holen

      Rev 1.65   19 Jul 1996 15:38:12   JP
   Umstellung Numerierung

      Rev 1.64   26 Jun 1996 15:22:58   OS
   Aufruf von Dispatcher.Execute an 324 angepasst

*************************************************************************/


diff --git a/sw/source/ui/wrtsh/wrtsh3.cxx b/sw/source/ui/wrtsh/wrtsh3.cxx
new file mode 100644
index 0000000..ec93e1c
--- /dev/null
+++ b/sw/source/ui/wrtsh/wrtsh3.cxx
@@ -0,0 +1,468 @@
/*************************************************************************
 *
 *  $RCSfile: wrtsh3.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:53 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _SVX_SVXIDS_HRC //autogen
#include <svx/svxids.hrc>
#endif
#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif
#ifndef _SFX_CHILDWIN_HXX //autogen
#include <sfx2/childwin.hxx>
#endif
#ifndef _SFX_BINDINGS_HXX //autogen
#include <sfx2/bindings.hxx>
#endif
#ifndef _SVDMARK_HXX //autogen
#include <svx/svdmark.hxx>
#endif
#ifndef _SVDVIEW_HXX //autogen
#include <svx/svdview.hxx>
#endif
#ifndef _SVX_FMGLOB_HXX
#include <svx/fmglob.hxx>
#endif
#ifndef _SVDOUNO_HXX //autogen
#include <svx/svdouno.hxx>
#endif
#ifndef _COM_SUN_STAR_FORM_FORMBUTTONTYPE_HPP_
#include <com/sun/star/form/FormButtonType.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
#include <com/sun/star/beans/XPropertySet.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSETINFO_HPP_
#include <com/sun/star/beans/XPropertySetInfo.hpp>
#endif
#ifndef _SVX_HTMLMODE_HXX
#include <svx/htmlmode.hxx>
#endif
#ifndef _URLOBJ_HXX //autogen
#include <tools/urlobj.hxx>
#endif
#ifndef _SFXVIEWFRM_HXX
#include <sfx2/viewfrm.hxx>
#endif


#include "wrtsh.hxx"
#include "view.hxx"
#include "bookmrk.hxx"
#include "doc.hxx"
#include "wrtsh.hrc"

#define C2U(cChar) rtl::OUString::createFromAscii(cChar)

using namespace ::com::sun::star;
using namespace ::rtl;

extern sal_Bool bNoInterrupt;       // in mainwn.cxx

FASTBOOL SwWrtShell::MoveBookMark(  BookMarkMove eFuncId,
                                    sal_uInt16 nPos,
                                    sal_Bool bStart )
{
//JP 08.03.96: die Wizards brauchen die Selektion !!
//  EndSelect();
    (this->*fnKillSel)( 0, sal_False );

    FASTBOOL bRet = sal_True;
    switch(eFuncId)
    {
        case BOOKMARK_INDEX:bRet = SwCrsrShell::GotoBookmark( nPos );break;
        case BOOKMARK_NEXT: bRet = SwCrsrShell::GoNextBookmark();break;
        case BOOKMARK_PREV: bRet = SwCrsrShell::GoPrevBookmark();break;
    }

    if( bRet && IsSelFrmMode() )
    {
        UnSelectFrm();
        LeaveSelFrmMode();
    }
    if( IsSelection() )
    {
        fnKillSel = &SwWrtShell::ResetSelect;
        fnSetCrsr = &SwWrtShell::SetCrsrKillSel;
    }
    return bRet;
}


/*--------------------------------------------------------------------
    Beschreibung: FontWork-Slots invalidieren
 --------------------------------------------------------------------*/


void SwWrtShell::DrawSelChanged(SdrView* pView)
{
    static sal_uInt16 __READONLY_DATA aInval[] =
    {
        SID_ATTR_FILL_STYLE, SID_ATTR_FILL_COLOR, SID_ATTR_LINE_STYLE,
        SID_ATTR_LINE_WIDTH, SID_ATTR_LINE_COLOR, 0
    };

    GetView().GetViewFrame()->GetBindings().Invalidate(aInval);

    sal_Bool bOldVal = bNoInterrupt;
    bNoInterrupt = sal_True;    // Trick, um AttrChangedNotify ueber Timer auszufuehren
    GetView().AttrChangedNotify(this);
    bNoInterrupt = bOldVal;
}

FASTBOOL SwWrtShell::GotoBookmark( const String& rName )
{
    sal_uInt16 nPos = FindBookmark( rName );
    if( USHRT_MAX == nPos )
        return sal_False;

    return MoveBookMark( BOOKMARK_INDEX, nPos );
}


FASTBOOL SwWrtShell::GotoBookmark( sal_uInt16 nPos )
{
    return MoveBookMark( BOOKMARK_INDEX, nPos );
}


FASTBOOL SwWrtShell::GoNextBookmark()
{
    return MoveBookMark( BOOKMARK_NEXT );
}


FASTBOOL SwWrtShell::GoPrevBookmark()
{
    return MoveBookMark( BOOKMARK_PREV );
}


void SwWrtShell::ExecMacro( const SvxMacro& rMacro, String* pRet, SbxArray* pArgs )
{
    GetDoc()->ExecMacro( rMacro, pRet, pArgs );
}


sal_uInt16 SwWrtShell::CallEvent( sal_uInt16 nEvent, const SwCallMouseEvent& rCallEvent,
                                sal_Bool bChkPtr, SbxArray* pArgs,
                                const Link* pCallBack )
{
    return GetDoc()->CallEvent( nEvent, rCallEvent, bChkPtr, pArgs, pCallBack );
}


    // fall ein util::URL-Button selektiert ist, dessen util::URL returnen, ansonsten
    // einen LeerString
sal_Bool SwWrtShell::GetURLFromButton( String& rURL, String& rDescr ) const
{
    sal_Bool bRet = sal_False;
    const SdrView *pDView = GetDrawView();
    if( pDView )
    {
        // Ein Fly ist genau dann erreichbar, wenn er selektiert ist.
        const SdrMarkList &rMarkList = pDView->GetMarkList();

        if (rMarkList.GetMark(0))
        {
            SdrUnoObj* pUnoCtrl = PTR_CAST(SdrUnoObj, rMarkList.GetMark(0)->GetObj());
            if (pUnoCtrl && FmFormInventor == pUnoCtrl->GetObjInventor())
            {
                uno::Reference< awt::XControlModel >  xControlModel = pUnoCtrl->GetUnoControlModel();

                ASSERT( xControlModel.is(), "UNO-Control ohne Model" );
                if( !xControlModel.is() )
                    return bRet;

                uno::Reference< beans::XPropertySet >  xPropSet(xControlModel, uno::UNO_QUERY);

                uno::Any aTmp;

                form::FormButtonType eButtonType = form::FormButtonType_URL;
                uno::Reference< beans::XPropertySetInfo >   xInfo = xPropSet->getPropertySetInfo();
                if(xInfo->hasPropertyByName( C2U("ButtonType") ))
                {
                    aTmp = xPropSet->getPropertyValue( C2U("ButtonType") );
                    if( eButtonType == *((form::FormButtonType*)aTmp.getValue()))
                    {
                        // Label
                        aTmp = xPropSet->getPropertyValue( C2U("Label") );

                        if( aTmp.getValueType() == ::getCppuType((OUString*)0))
                        {
                            OUString uTmp(*(OUString*)aTmp.getValue());
                            if(uTmp.getLength())
                                rDescr = String(uTmp);
                        }

                        // util::URL
                        aTmp = xPropSet->getPropertyValue( C2U("TargetURL") );
                        if( aTmp.getValueType() == ::getCppuType((const OUString*)0))
                        {
                            OUString uTmp(*(OUString*)aTmp.getValue());
                            if(uTmp.getLength())
                                rURL = String(uTmp);
                        }
                        bRet = sal_True;
                    }
                }
            }
        }
    }

    return bRet;
}


    // falls ein util::URL-Button selektiert ist, dessen util::URL returnen, ansonsten
    // einen LeerString
sal_Bool SwWrtShell::SetURLToButton( const String& rURL, const String& rDescr )
{
    sal_Bool bRet = sal_False;
    const SdrView *pDView = GetDrawView();
    if( pDView )
    {
        // Ein Fly ist genau dann erreichbar, wenn er selektiert ist.
        const SdrMarkList &rMarkList = pDView->GetMarkList();
        if (rMarkList.GetMark(0))
        {
            SdrUnoObj* pUnoCtrl = PTR_CAST(SdrUnoObj, rMarkList.GetMark(0)->GetObj());
            if (pUnoCtrl && FmFormInventor == pUnoCtrl->GetObjInventor())
            {
                uno::Reference< awt::XControlModel >  xControlModel = pUnoCtrl->GetUnoControlModel();

                ASSERT( xControlModel.is(), "UNO-Control ohne Model" );
                if( !xControlModel.is() )
                    return bRet;

                uno::Reference< beans::XPropertySet >  xPropSet(xControlModel, uno::UNO_QUERY);

                uno::Any aTmp;

                // Darf man eine util::URL an dem Objekt setzen?
                uno::Reference< beans::XPropertySetInfo >  xPropInfoSet = xPropSet->getPropertySetInfo();
                beans::Property aProp = xPropInfoSet->getPropertyByName( C2U("TargetURL") );
                if (aProp.Name.len())
                {
                    // Ja!
                    aTmp <<= OUString(rDescr);
                    xPropSet->setPropertyValue( C2U("Label"), aTmp );

                    aTmp <<= OUString(rURL);
                    xPropSet->setPropertyValue( C2U("TargetURL"), aTmp );


                    form::FormButtonType eButtonType = form::FormButtonType_URL;
                    aTmp.setValue( &eButtonType, ::getCppuType((form::FormButtonType*)0));
                    xPropSet->setPropertyValue( C2U("ButtonType"), aTmp );
                }
            }
        }
    }

    return bRet;
}


/*-------------------------------------------------------------------------
    $Log: not supported by cvs2svn $
    Revision 1.65  2000/09/18 16:06:27  willem.vandorp
    OpenOffice header added.

    Revision 1.64  2000/09/07 15:59:36  os
    change: SFX_DISPATCHER/SFX_BINDINGS removed

    Revision 1.63  2000/05/16 09:15:15  os
    project usr removed

    Revision 1.62  2000/04/19 11:18:25  os
    UNICODE

    Revision 1.61  2000/03/23 07:51:11  os
    UNO III

    Revision 1.60  2000/02/11 15:03:40  hr
    #70473# changes for unicode ( patched by automated patchtool )

    Revision 1.59  1999/11/19 16:40:25  os
    modules renamed

    Revision 1.58  1999/02/17 06:46:48  OS
    #61990# Property vor dem Aufruf auf Existenz pruefen


      Rev 1.57   17 Feb 1999 07:46:48   OS
   #61990# Property vor dem Aufruf auf Existenz pruefen

      Rev 1.56   27 Jan 1999 09:59:54   OS
   #56371# TF_ONE51

      Rev 1.55   24 Nov 1998 17:01:30   OM
   #59654# GPF durch Assertion behoben

      Rev 1.54   18 Nov 1998 16:43:22   OM
   #58898# Kein Statusupdate im SFX-Update

      Rev 1.53   02 Oct 1998 16:17:12   OM
   #57349# Shellwechsel nach Controlselektion durch Formularnavigator

      Rev 1.52   10 Jul 1998 15:31:28   OM
   Clipboard-Anbindung fuer util::URL-Button

      Rev 1.51   09 Jun 1998 15:34:36   OM
   VC-Controls entfernt

      Rev 1.50   04 May 1998 18:00:18   JP
   Bug #49993#: IsSelOver darf nicht immer den Cursor verschieben; GotoBookmark mit ReturntWert

      Rev 1.49   29 Nov 1997 15:15:06   MA
   includes

      Rev 1.48   24 Nov 1997 14:35:08   MA
   includes

      Rev 1.47   01 Sep 1997 13:22:00   OS
   DLL-Umstellung

      Rev 1.46   29 Jul 1997 17:09:48   TJ
   include VCURLButton

      Rev 1.45   02 May 1997 20:45:48   NF
   includes...

      Rev 1.44   09 Apr 1997 08:30:52   NF
   includes...

      Rev 1.43   07 Apr 1997 17:02:30   JP
   CallEvent: Callback als weiteren Parameter

      Rev 1.42   04 Apr 1997 16:51:34   HJS
   includes

      Rev 1.41   18 Feb 1997 17:08:08   JP
   CallEvent/ExecMacro: zusaetzlich Parameter fuers Basic

      Rev 1.40   22 Jan 1997 11:55:56   MA
   opt: bSelection entfernt

      Rev 1.39   09 Dec 1996 15:05:18   JP
   CallEvent: Parameter geaendert

      Rev 1.38   28 Nov 1996 20:28:44   JP
   Bug #33859#: CallEvent - Object muss ggfs. ueberprueft werden

      Rev 1.37   23 Nov 1996 16:44:38   JP
   neu: CallEvent - Event ans Basic oder script::JavaScript weitergeben

      Rev 1.36   21 Nov 1996 18:22:08   JP
   ExecMacro aus der WrtShell ins SwDoc verschoben

      Rev 1.35   19 Nov 1996 16:06:00   NF
   defines...

      Rev 1.34   08 Nov 1996 12:29:38   HJS
   include w.g. positivdefine

      Rev 1.33   10 Oct 1996 15:17:42   HJS
   clooks

      Rev 1.32   13 Sep 1996 18:10:48   JP
   neu: SetURLToButton - util::URL am util::URL-Button setzen

      Rev 1.31   29 Aug 1996 09:25:54   OS
   includes

      Rev 1.30   07 Aug 1996 18:24:20   HJS
   clooks

      Rev 1.29   27 Jun 1996 11:14:10   NF
   CLOOKS

      Rev 1.28   17 Jun 1996 13:34:00   TRI
   CLOOKS

      Rev 1.27   13 Jun 1996 15:43:34   MA
   split sihxx

      Rev 1.26   06 Jun 1996 15:40:14   HJS
   alte defs raus, neue rein...

      Rev 1.25   05 Jun 1996 15:33:00   JP
   ExecMacro: optional einen ErgebnisString erfragen

      Rev 1.24   05 Jun 1996 15:24:46   OS
   clook-defines hinter hdrstop

      Rev 1.23   05 Jun 1996 12:01:44   OV
   VCBrowser Umstellung

      Rev 1.22   10 May 1996 15:55:32   OS
   GotoBookmark markiert jetzt immer bug #27690#

      Rev 1.21   08 May 1996 12:59:40   OS
   MoveBookmark mit Start-Flag

 -------------------------------------------------------------------------*/
diff --git a/sw/source/ui/wrtsh/wrtsh4.cxx b/sw/source/ui/wrtsh/wrtsh4.cxx
new file mode 100644
index 0000000..a151640
--- /dev/null
+++ b/sw/source/ui/wrtsh/wrtsh4.cxx
@@ -0,0 +1,289 @@
/*************************************************************************
 *
 *  $RCSfile: wrtsh4.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:53 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#include "wrtsh.hxx"


/*
* private Methoden, die den Cursor ueber Suchen bewegen. Das
* Aufheben der Selektion muss auf der Ebene darueber erfolgen.
*/

/*
* Der Anfang eines Wortes ist das Folgen eines nicht-
* Trennzeichens auf Trennzeichen. Ferner das Folgen von
* nicht-Satztrennern auf Satztrenner. Der Absatzanfang ist
* ebenfalls Wortanfang.
*/


FASTBOOL SwWrtShell::_SttWrd()
{
    if ( IsSttPara() )
        return 1;
        /*
            * temporaeren Cursor ohne Selektion erzeugen
            */
    Push();
    ClearMark();
    if( !GoStartWord() )
            // nicht gefunden --> an den Absatzanfang
        SwCrsrShell::MovePara( fnParaCurr, fnParaStart );
    ClearMark();
        // falls vorher Mark gesetzt war, zusammenfassen
    Combine();
    return 1;
}
/*
 * Das Ende eines Wortes ist das Folgen von Trennzeichen auf
 * nicht-Trennzeichen.  Unter dem Ende eines Wortes wird
 * ebenfalls die Folge von Worttrennzeichen auf Interpunktions-
 * zeichen verstanden. Das Absatzende ist ebenfalls Wortende.
 */



FASTBOOL SwWrtShell::_EndWrd()
{
    if ( IsEndWrd() )
        return 1;
        // temporaeren Cursor ohne Selektion erzeugen
    Push();
    ClearMark();
    if( !GoEndWord() )
            // nicht gefunden --> an das Absatz Ende
        SwCrsrShell::MovePara(fnParaCurr, fnParaEnd);
    ClearMark();
        // falls vorher Mark gesetzt war, zusammenfassen
    Combine();
    return 1;
}



FASTBOOL SwWrtShell::_NxtWrd()
{
    if( IsEndPara() )               // wenn schon am Ende, dann naechsten ???
    {
        if(!SwCrsrShell::Right())   // Document - Ende ??
        {
            Pop( FALSE );
            return 0L;
        }
        return 1;
    }
    Push();
    ClearMark();
    if( !GoNextWord() )
            // nicht gefunden --> das AbsatzEnde ist Ende vom Wort
        SwCrsrShell::MovePara( fnParaCurr, fnParaEnd );
    ClearMark();
    Combine();
    return 1;
}



FASTBOOL SwWrtShell::_PrvWrd()
{
    if(IsSttPara())
    {                               // wenn schon am Anfang, dann naechsten ???
        if(!SwCrsrShell::Left())
        {                           // Document - Anfang ??
            Pop( FALSE );
            return 0;
        }
        return 1;
    }
    Push();
    ClearMark();
    if( !GoPrevWord() )
            // nicht gefunden --> an den Absatz Anfang
        SwCrsrShell::MovePara( fnParaCurr, fnParaStart );
    ClearMark();
    Combine();
    return 1;
}



FASTBOOL SwWrtShell::_FwdSentence()
{
    Push();
    ClearMark();
    if(!SwCrsrShell::Right())
    {
        Pop(FALSE);
        return 0;
    }
    if( !GoNextSentence() && !IsEndPara() )
        SwCrsrShell::MovePara(fnParaCurr, fnParaEnd);

    ClearMark();
    Combine();
    return 1;
}



FASTBOOL SwWrtShell::_BwdSentence()
{
    Push();
    ClearMark();
    if(!SwCrsrShell::Left())
    {
        Pop(FALSE);
        return 0;
    }
    if(IsSttPara())
    {
        Pop();
        return 1;
    }
    if( !GoPrevSentence()  && !IsSttPara() )
            // nicht gefunden --> an den Absatz Anfang
        SwCrsrShell::MovePara( fnParaCurr, fnParaStart );
    ClearMark();
    Combine();
    return 1;
}


FASTBOOL SwWrtShell::_FwdPara()
{
    Push();
    ClearMark();
    if(!SwCrsrShell::Right())
    {
        Pop(FALSE);
        return 0;
    }
    SwCrsrShell::Left();
    SwCrsrShell::MovePara(fnParaNext, fnParaStart);

    ClearMark();
    Combine();
    return 1;
}


FASTBOOL SwWrtShell::_BwdPara()
{
    Push();
    ClearMark();
    if(!SwCrsrShell::Left())
    {
        Pop(FALSE);
        return 0;
    }
    SwCrsrShell::Right();
    if(!IsSttOfPara())
        SttPara();
    SwCrsrShell::MovePara(fnParaPrev, fnParaStart);

    ClearMark();
    Combine();
    return 1;
}
/*************************************************************************

   $Log: not supported by cvs2svn $
   Revision 1.8  2000/09/18 16:06:27  willem.vandorp
   OpenOffice header added.

   Revision 1.7  1998/07/13 08:58:02  JP
   Bug #52635#: _Fwd/_BwdSentence: End-/SttPara beachten


      Rev 1.6   13 Jul 1998 10:58:02   JP
   Bug #52635#: _Fwd/_BwdSentence: End-/SttPara beachten

      Rev 1.5   24 Nov 1997 14:35:04   MA
   includes

      Rev 1.4   03 Nov 1997 14:02:54   MA
   precomp entfernt

      Rev 1.3   29 Aug 1996 09:25:56   OS
   includes

      Rev 1.2   07 Jun 1996 09:14:06   OS
   Spruenge zum vorherigen/folgenden Absatz: auch bei leerem Absatz richtig springen Bug #28382#

      Rev 1.1   14 May 1996 13:35:32   HJS
   wer braucht schon includes...

      Rev 1.0   14 May 1996 13:29:20   HJS
   aus wrtsh1 w.g. clooks

      Rev 1.0   12 May 1996 12:41:56   HJS
   clooks

*************************************************************************/



diff --git a/sw/source/ui/wrtsh/wrtundo.cxx b/sw/source/ui/wrtsh/wrtundo.cxx
new file mode 100644
index 0000000..4de9cbf
--- /dev/null
+++ b/sw/source/ui/wrtsh/wrtundo.cxx
@@ -0,0 +1,246 @@
/*************************************************************************
 *
 *  $RCSfile: wrtundo.cxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:14:53 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifdef PRECOMPILED
#include "ui_pch.hxx"
#endif

#pragma hdrstop

#ifndef _TOOLS_RESID_HXX
#include <tools/resid.hxx>
#endif
#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif

#ifndef _WRTSH_HXX
#include <wrtsh.hxx>
#endif
#ifndef _SWUNDO_HXX
#include <swundo.hxx>                   // fuer Undo-Ids
#endif

#ifndef _WRTSH_HRC
#include <wrtsh.hrc>
#endif
#include <sfx2/sfx.hrc>


// Undo beendet alle Modi. Falls eine Selektion durch das Undo entstanden
// ist, muss die fuer die weiteren Aktionen beruecksichtigt werden.


void SwWrtShell::Do( DoType eDoType )
{
    StartAllAction();
    switch( eDoType )
    {
        case UNDO:
            // Modi zuruecksetzen
            EnterStdMode();
            SwEditShell::Undo(0);
            break;
        case REDO:
            // Modi zuruecksetzen
            EnterStdMode();
            SwEditShell::Redo();
            break;
        case REPEAT:
            SwEditShell::Repeat( 1 /*Anzahl!*/ );
            break;
    }
    EndAllAction();

    const FASTBOOL bFrmSelected = IsFrmSelected() || IsObjSelected();
    if ( IsSelection() )
    {
        if ( bFrmSelected )
            UnSelectFrm();

        // Funktionspointer fuer das Aufheben der Selektion setzen
        // bei Cursor setzen
        fnKillSel = &SwWrtShell::ResetSelect;
        fnSetCrsr = &SwWrtShell::SetCrsrKillSel;
    }
    else if ( bFrmSelected )
        EnterSelFrmMode();
    else if( (CNT_GRF | CNT_OLE ) & GetCntType() )
    {
        SelectObj( GetCharRect().Pos() );
        EnterSelFrmMode();
    }

    // Bug 32918: nach loeschen der Numerierung bleibt die Obj. Leiste stehen
    //          Warum wird hier nicht immer ein CallChgLink gerufen?
    CallChgLnk();
}


String SwWrtShell::GetDoString( DoType eDoType ) const
{
    String aStr;
    USHORT nId = 0, nResStr;
    switch( eDoType )
    {
    case UNDO:
        nResStr = STR_UNDO;
        nId = GetUndoIds( &aStr );
        break;
    case REDO:
        nResStr = STR_REDO;
        nId = GetRedoIds( &aStr );
        break;
    }

    if( UNDO_END < nId )
    {
        aStr.Insert( String(ResId( nResStr, SFX_APP()->GetSfxResManager() )), 0 );
        if( UNDO_DRAWUNDO != nId )
            aStr += SW_RESSTR( UNDO_BASE + nId );
    }
    return aStr;
}


String SwWrtShell::GetRepeatString() const
{
    String aStr;
    USHORT nId = GetRepeatIds( &aStr );
    if( UNDO_END < nId )
    {
        aStr.Insert( ResId( STR_REPEAT, SFX_APP()->GetSfxResManager()), 0 );
        if( UNDO_DRAWUNDO != nId )
            aStr += SW_RESSTR( UNDO_BASE + nId );
    }
    return aStr;
}

/*************************************************************************

      $Log: not supported by cvs2svn $
      Revision 1.53  2000/09/18 16:06:27  willem.vandorp
      OpenOffice header added.

      Revision 1.52  2000/07/27 21:01:41  jp
      Bug #76923#: Do - clamp the enterstdmode and Undo/Redo/Repeat call

      Revision 1.51  2000/03/03 15:17:06  os
      StarView remainders removed

      Revision 1.50  1998/04/15 14:35:34  OS
      STR_UNDO/REDO/REPEAT aus dem Sfx


      Rev 1.49   15 Apr 1998 16:35:34   OS
   STR_UNDO/REDO/REPEAT aus dem Sfx

      Rev 1.48   24 Nov 1997 14:35:02   MA
   includes

      Rev 1.47   03 Nov 1997 14:02:56   MA
   precomp entfernt

      Rev 1.46   22 Jan 1997 11:55:56   MA
   opt: bSelection entfernt

      Rev 1.45   11 Nov 1996 10:18:48   MA
   ResMgr

      Rev 1.44   31 Oct 1996 18:32:30   JP
   Bug #32918#: nach Undo der View sagen, das sich was getan hat

      Rev 1.43   29 Aug 1996 09:25:56   OS
   includes

      Rev 1.42   24 Nov 1995 16:59:06   OM
   PCH->PRECOMPILED

      Rev 1.41   19 Sep 1995 19:11:52   JP
   Bug 19431: Repeat funkt. wieder

      Rev 1.40   12 Sep 1995 17:59:32   JP
   Bug19137: vor Undo den Cursor in den StandardMode setzen

      Rev 1.39   28 Aug 1995 15:59:40   MA
   Renovierung: IDL, Shells, Textshell-Doktrin aufgegeben

      Rev 1.38   22 Aug 1995 17:30:04   JP
   GetUndo-/-Redo-/-RepeatIds: optional mit String-Ptr - DrawUndo-Objecte erzeuge die Strings selbst

      Rev 1.37   15 Aug 1995 19:52:20   JP
   Nach Undo/Redo kann der Cursor in OLE oder GRF stehen, selektieren dann den Frame

      Rev 1.36   27 Apr 1995 13:14:16   AMA
   Fix (JP): ResId-Ueberpruef. bei Undo

      Rev 1.35   23 Feb 1995 17:51:58   MA
   Rudimentaer Undo/Redo fuer Zeichenobjekte.

      Rev 1.34   08 Feb 1995 23:36:12   ER
   undo.hxx -> swundo.hxx wegen solar undo.hxx

      Rev 1.33   08 Feb 1995 19:01:30   JP
   UI-UndoIds ins undo.hxx verschoben

*************************************************************************/


diff --git a/sw/util/hidother.hrc b/sw/util/hidother.hrc
new file mode 100644
index 0000000..2924cad
--- /dev/null
+++ b/sw/util/hidother.hrc
@@ -0,0 +1,65 @@
/*************************************************************************
 *
 *  $RCSfile: hidother.hrc,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:15:01 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#define _SFX_SHELL_HXX
#define SFX_INTERFACE_SW_START  250

#include <../inc/shellid.hxx>

diff --git a/sw/util/hidother.src b/sw/util/hidother.src
new file mode 100644
index 0000000..4a9ab66
--- /dev/null
+++ b/sw/util/hidother.src
@@ -0,0 +1,335 @@
/*************************************************************************
 *
 *  $RCSfile: hidother.src,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000-09-18 17:15:01 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#include "..\inc\helpid.h"          // HID_FUNC_XXX
//#include "shellid.hxx"            // HID_FUNC_XXX da kommen sie eigentlich her
#include "hidother.hrc"

//  Help-IDs fuer Dokument-Fenster
hidspecial HID_EDIT_WIN         { HelpID = HID_EDIT_WIN; };

// drei fuer den Formedtdialog
hidspecial HID_FORMEDT_CONTENT  { HelpID = HID_FORMEDT_CONTENT; };
hidspecial HID_FORMEDT_USER     { HelpID = HID_FORMEDT_USER; };
hidspecial HID_FORMEDT_INDEX    { HelpID = HID_FORMEDT_INDEX; };

// Wizards
hidspecial HID_FAX_PAGE1        { HelpId = HID_FAX_PAGE1; };
hidspecial HID_FAX_PAGE2        { HelpId = HID_FAX_PAGE2; };
hidspecial HID_FAX_PAGE3        { HelpId = HID_FAX_PAGE3; };
hidspecial HID_FAX_PAGE4        { HelpId = HID_FAX_PAGE4; };
hidspecial HID_FAX_PAGE5        { HelpId = HID_FAX_PAGE5; };
hidspecial HID_FAX_PAGE6        { HelpId = HID_FAX_PAGE6; };
hidspecial HID_FAX_PAGE7        { HelpId = HID_FAX_PAGE7; };
hidspecial HID_FAX_PAGE8        { HelpId = HID_FAX_PAGE8; };
hidspecial HID_LETTER_PAGE1     { HelpId = HID_LETTER_PAGE1; };
hidspecial HID_LETTER_PAGE2     { HelpId = HID_LETTER_PAGE2; };
hidspecial HID_LETTER_PAGE3     { HelpId = HID_LETTER_PAGE3; };
hidspecial HID_LETTER_PAGE4     { HelpId = HID_LETTER_PAGE4; };
hidspecial HID_LETTER_PAGE5     { HelpId = HID_LETTER_PAGE5; };
hidspecial HID_LETTER_PAGE6     { HelpId = HID_LETTER_PAGE6; };
hidspecial HID_LETTER_PAGE7     { HelpId = HID_LETTER_PAGE7; };
hidspecial HID_LETTER_PAGE8     { HelpId = HID_LETTER_PAGE8; };
hidspecial HID_LETTER_PAGE9     { HelpId = HID_LETTER_PAGE9; };
hidspecial HID_AGENDA_PAGE1     { HelpId = HID_AGENDA_PAGE1; };
hidspecial HID_AGENDA_PAGE2     { HelpId = HID_AGENDA_PAGE2; };
hidspecial HID_AGENDA_PAGE3     { HelpId = HID_AGENDA_PAGE3; };
hidspecial HID_AGENDA_PAGE4     { HelpId = HID_AGENDA_PAGE4; };
hidspecial HID_AGENDA_PAGE5     { HelpId = HID_AGENDA_PAGE5; };
hidspecial HID_AGENDA_PAGE6     { HelpId = HID_AGENDA_PAGE6; };
hidspecial HID_MEMO_PAGE1       { HelpId = HID_MEMO_PAGE1; };
hidspecial HID_MEMO_PAGE2       { HelpId = HID_MEMO_PAGE2; };
hidspecial HID_MEMO_PAGE3       { HelpId = HID_MEMO_PAGE3; };
hidspecial HID_MEMO_PAGE4       { HelpId = HID_MEMO_PAGE4; };
hidspecial HID_MEMO_PAGE5       { HelpId = HID_MEMO_PAGE5; };

// Numerierungsdialog
hidspecial HID_VS_SINGLENUM   { HelpId = HID_VS_SINGLENUM;};
hidspecial HID_VS_NUM         { HelpId = HID_VS_NUM      ;};
hidspecial HID_VS_BULLET      { HelpId = HID_VS_BULLET   ;};
hidspecial HID_VS_NUMBMP      { HelpId = HID_VS_NUMBMP   ;};

//Wegen Helferlein jetzt auch die ShellIds hier
hidspecial SW_TEXTSHELL             { HelpId = SW_TEXTSHELL         ;};
hidspecial SW_LISTSHELL             { HelpId = SW_LISTSHELL         ;};
hidspecial SW_TABSHELL              { HelpId = SW_TABSHELL          ;};
hidspecial SW_FRAMESHELL            { HelpId = SW_FRAMESHELL        ;};
hidspecial SW_GRFSHELL              { HelpId = SW_GRFSHELL          ;};
hidspecial SW_OLESHELL              { HelpId = SW_OLESHELL          ;};
hidspecial SW_DRAWSHELL             { HelpId = SW_DRAWSHELL         ;};
hidspecial SW_DRWTXTSHELL           { HelpId = SW_DRWTXTSHELL       ;};
hidspecial SW_PAGEPREVIEW           { HelpId = SW_PAGEPREVIEW       ;};
hidspecial SW_SRC_VIEWSHELL         { HelpId = SW_SRC_VIEWSHELL     ;};
hidspecial SW_BEZIERSHELL           { HelpId = SW_BEZIERSHELL       ;};
hidspecial SW_DRAWFORMSHELL         { HelpId = SW_DRAWFORMSHELL     ;};
hidspecial SW_WEBTEXTSHELL          { HelpId = SW_WEBTEXTSHELL      ;};
hidspecial SW_WEBFRAMESHELL         { HelpId = SW_WEBFRAMESHELL     ;};

// Navigator
hidspecial  HID_NAVIGATOR_TOOLBOX   { HelpId = HID_NAVIGATOR_TOOLBOX;};
hidspecial  HID_NAVI_TBX16          { HelpId = HID_NAVI_TBX16;};
hidspecial HID_NAVIGATOR_GLOBAL_TOOLBOX { HelpId = HID_NAVIGATOR_GLOBAL_TOOLBOX;};
hidspecial HID_NAVIGATOR_LISTBOX    { HelpId = HID_NAVIGATOR_LISTBOX;};
hidspecial HID_NAVIGATOR_GLOB_TREELIST  { HelpId = HID_NAVIGATOR_GLOB_TREELIST;};
hidspecial HID_NAVIGATOR_TREELIST   { HelpId = HID_NAVIGATOR_TREELIST;};
hidspecial HID_NAVI_DRAG_HYP        { HelpId = HID_NAVI_DRAG_HYP   ;};
hidspecial HID_NAVI_DRAG_LINK       { HelpId = HID_NAVI_DRAG_LINK  ;};
hidspecial HID_NAVI_DRAG_COPY       { HelpId = HID_NAVI_DRAG_COPY  ;};
hidspecial HID_NAVI_OUTLINES        { HelpId = HID_NAVI_OUTLINES   ;};
hidspecial HID_NAVI_TBX1            { HelpId = HID_NAVI_TBX1   ;};
hidspecial HID_NAVI_TBX2            { HelpId = HID_NAVI_TBX2   ;};
hidspecial HID_NAVI_TBX3            { HelpId = HID_NAVI_TBX3   ;};
hidspecial HID_NAVI_TBX4            { HelpId = HID_NAVI_TBX4   ;};
hidspecial HID_NAVI_TBX5            { HelpId = HID_NAVI_TBX5   ;};
hidspecial HID_NAVI_TBX6            { HelpId = HID_NAVI_TBX6   ;};
hidspecial HID_NAVI_TBX7            { HelpId = HID_NAVI_TBX7   ;};
hidspecial HID_NAVI_TBX8            { HelpId = HID_NAVI_TBX8   ;};
hidspecial HID_NAVI_TBX9            { HelpId = HID_NAVI_TBX9   ;};
hidspecial HID_NAVI_TBX10           { HelpId = HID_NAVI_TBX10   ;};
hidspecial HID_NAVI_TBX11           { HelpId = HID_NAVI_TBX11   ;};
hidspecial HID_NAVI_TBX12           { HelpId = HID_NAVI_TBX12   ;};
hidspecial HID_NAVI_TBX13           { HelpId = HID_NAVI_TBX13   ;};
hidspecial HID_NAVI_TBX14           { HelpId = HID_NAVI_TBX14   ;};
hidspecial HID_NAVI_TBX15           { HelpId = HID_NAVI_TBX15   ;};
hidspecial HID_GLBLTREE_UPDATE      { HelpId = HID_GLBLTREE_UPDATE          ;};
hidspecial HID_GLBLTREE_INSERT      { HelpId = HID_GLBLTREE_INSERT        ;};
hidspecial HID_GLBLTREE_EDIT        { HelpId = HID_GLBLTREE_EDIT            ;};
hidspecial HID_GLBLTREE_DEL         { HelpId = HID_GLBLTREE_DEL             ;};
hidspecial HID_GLBLTREE_INS_IDX     { HelpId = HID_GLBLTREE_INS_IDX         ;};
hidspecial HID_GLBLTREE_INS_CNTIDX    { HelpId = HID_GLBLTREE_INS_CNTIDX    ;};
hidspecial HID_GLBLTREE_INS_USRIDX    { HelpId = HID_GLBLTREE_INS_USRIDX    ;};
hidspecial HID_GLBLTREE_INS_FILE      { HelpId = HID_GLBLTREE_INS_FILE      ;};
hidspecial HID_GLBLTREE_INS_NEW_FILE  { HelpId = HID_GLBLTREE_INS_NEW_FILE  ;};
hidspecial HID_GLBLTREE_INS_TEXT      { HelpId = HID_GLBLTREE_INS_TEXT      ;};
hidspecial HID_GLBLTREE_UPD_SEL       { HelpId = HID_GLBLTREE_UPD_SEL       ;};
hidspecial HID_GLBLTREE_UPD_IDX       { HelpId = HID_GLBLTREE_UPD_IDX       ;};
hidspecial HID_GLBLTREE_UPD_LINK      { HelpId = HID_GLBLTREE_UPD_LINK      ;};
hidspecial HID_GLBLTREEUPD_ALL          { HelpId = HID_GLBLTREEUPD_ALL          ;};

// Ruler einfuegen
hidspecial  HID_VS_RULER            { HelpId = HID_VS_RULER;};

// Briefumschlaege/Etiketten
hidspecial  HID_ENVELOP_PRINT       { HelpId = HID_ENVELOP_PRINT;};
hidspecial  HID_ENVELOP_INSERT      { HelpId = HID_ENVELOP_INSERT;};
hidspecial  HID_LABEL_INSERT        { HelpId = HID_LABEL_INSERT;};

// Vorlage laden
hidspecial HID_LTEMPL_TEXT      { HelpId = HID_LTEMPL_TEXT     ; };
hidspecial HID_LTEMPL_FRAME     { HelpId = HID_LTEMPL_FRAME    ; };
hidspecial HID_LTEMPL_PAGE      { HelpId = HID_LTEMPL_PAGE     ; };
hidspecial HID_LTEMPL_OVERRIDE  { HelpId = HID_LTEMPL_OVERRIDE ; };
hidspecial HID_LTEMPL_NUMBERING  { HelpId = HID_LTEMPL_NUMBERING ;};

// Numerierung/Optionen-Button
hidspecial HID_NUM_FORMAT_BTN       { HelpId = HID_NUM_FORMAT_BTN;  };

// AutoText Bereiche
hidspecial HID_GLOS_GROUP_TREE  { HelpId = HID_GLOS_GROUP_TREE; };
hidspecial HID_MD_GLOS_CATEGORY { HelpId = HID_MD_GLOS_CATEGORY;    };

// AutoFormat
hidspecial HID_AUTOFORMAT_CLB   { HelpId = HID_AUTOFORMAT_CLB; };

//OnlineSpelling
hidspecial HID_LINGU_REPLACE        { HelpId = HID_LINGU_REPLACE; };


// Navigationsbutton im Scrollbar
hidspecial HID_SCRL_NAVI        { HelpId = HID_SCRL_NAVI; };

//PushButtons Autoformat
hidspecial HID_AUTOFORMAT_EXEC  { HelpId =  HID_AUTOFORMAT_EXEC ; };
hidspecial HID_AUTOFORMAT_CLOSE { HelpId =  HID_AUTOFORMAT_CLOSE; };

// Bereiche
hidspecial HID_REGION_TREE { HelpId =  HID_REGION_TREE; };
hidspecial HID_DLG_PASSWD_SECTION { HelpId = HID_DLG_PASSWD_SECTION; };

//Rechenleiste
hidspecial HID_EDIT_FORMULA { HelpId =  HID_EDIT_FORMULA; };

// bedingte Vorlagen
hidspecial HID_COND_COLL_TABLIST { HelpId = HID_COND_COLL_TABLIST; };

// Seitenvorschau
hidspecial HID_PAGEPREVIEW      { HelpId = HID_PAGEPREVIEW ;};

// Feldbefehl-Dlg
hidspecial HID_DB_SELECTION_TLB { HelpId = HID_DB_SELECTION_TLB ;};
hidspecial HID_FIELD_DINF_TYPE  { HelpId = HID_FIELD_DINF_TYPE  ;};
hidspecial HID_FIELD_INSERT     { HelpId = HID_FIELD_INSERT ;};
hidspecial HID_FIELD_CLOSE      { HelpId = HID_FIELD_CLOSE  ;};
hidspecial HID_FLDEDT_ADDRESS   { HelpId = HID_FLDEDT_ADDRESS ;};
hidspecial HID_EDIT_FLD_DB      { HelpId = HID_EDIT_FLD_DB  ;};
hidspecial HID_EDIT_FLD_DOKINF  { HelpId = HID_EDIT_FLD_DOKINF  ;};
hidspecial HID_EDIT_FLD_VAR     { HelpId = HID_EDIT_FLD_VAR ;};
hidspecial HID_EDIT_FLD_DOK     { HelpId = HID_EDIT_FLD_DOK ;};
hidspecial HID_EDIT_FLD_FUNC    { HelpId = HID_EDIT_FLD_FUNC;};
hidspecial HID_EDIT_FLD_REF     { HelpId = HID_EDIT_FLD_REF ;};

// HTML-Source-Editwin
hidspecial HID_SOURCE_EDITWIN   { HelpId = HID_SOURCE_EDITWIN   ;};

// Redlining
hidspecial HID_REDLINE_CTRL     { HelpId = HID_REDLINE_CTRL ;};

// File-Dialoge
hidspecial HID_FILEDLG_CHARDLG  { HelpId = HID_FILEDLG_CHARDLG  ;};
hidspecial HID_FILEDLG_LOADTEMPLATE { HelpId = HID_FILEDLG_LOADTEMPLATE ;};
hidspecial HID_FILEDLG_MAILMRGE1    { HelpId = HID_FILEDLG_MAILMRGE1    ;};
hidspecial HID_FILEDLG_MAILMRGE2    { HelpId = HID_FILEDLG_MAILMRGE2    ;};
hidspecial HID_FILEDLG_FRMPAGE  { HelpId = HID_FILEDLG_FRMPAGE  ;};
hidspecial HID_FILEDLG_SRCVIEW  { HelpId = HID_FILEDLG_SRCVIEW  ;};
hidspecial HID_FILEDLG_WIZDOKU  { HelpId = HID_FILEDLG_WIZDOKU  ;};
hidspecial HID_SELECT_TEMPLATE  { HelpId = HID_SELECT_TEMPLATE  ;};

//Kapitelnumerierung - Form
hidspecial HID_OUTLINE_FORM       { HelpId = HID_OUTLINE_FORM ;};

//Numerierungsdialog - Numerierung entfernen
hidspecial HID_NUM_RESET            { HelpId = HID_NUM_RESET    ;};

//AutoFormat QueryBox Aenderungen akzeptieren/verwerfen/bearbeiten
hidspecial HID_AUTOFORMAT_REJECT    { HelpId = HID_AUTOFORMAT_REJECT   ;};
hidspecial HID_AUTOFORMAT_ACCEPT       { HelpId = HID_AUTOFORMAT_ACCEPT   ;};
hidspecial HID_AUTOFORMAT_EDIT_CHG     { HelpId = HID_AUTOFORMAT_EDIT_CHG ;};

hidspecial HID_NAVI_VS                  { HelpId = HID_NAVI_VS;};

//index dialog
hidspecial HID_ADD_STYLES_TLB           { HelpId = HID_ADD_STYLES_TLB;};
hidspecial HID_OLE_CHECKLB          { HelpId = HID_OLE_CHECKLB;};

//ScrollBar buttons
hidspecial HID_SCRL_PAGEUP          { HelpId = HID_SCRL_PAGEUP   ;};
hidspecial HID_SCRL_PAGEDOWN        { HelpId = HID_SCRL_PAGEDOWN;};

//index dialog
hidspecial HID_TOX_ENTRY_BUTTON     { HelpId = HID_TOX_ENTRY_BUTTON;};
hidspecial HID_TOX_ENTRY_EDIT       { HelpId = HID_TOX_ENTRY_EDIT  ;};
hidspecial HID_TOKEN_WINDOW         { HelpId = HID_TOKEN_WINDOW ;};
hidspecial HID_INSERT_IDX_MRK_OK    { HelpId = HID_INSERT_IDX_MRK_OK     ;};
hidspecial HID_INSERT_IDX_MRK_CLOSE { HelpId = HID_INSERT_IDX_MRK_CLOSE  ;};
hidspecial HID_INSERT_AUTH_MRK_OK   { HelpId = HID_INSERT_AUTH_MRK_OK    ;};
hidspecial HID_INSERT_AUTH_MRK_CLOSE{ HelpId = HID_INSERT_AUTH_MRK_CLOSE ;};
hidspecial HID_INSERT_IDX_MRK_DELETE     { HelpId =  HID_INSERT_IDX_MRK_DELETE   ;};
hidspecial HID_INSERT_IDX_MRK_NEW        { HelpId =  HID_INSERT_IDX_MRK_NEW      ;};
hidspecial HID_INSERT_IDX_MRK_PREV       { HelpId =  HID_INSERT_IDX_MRK_PREV         ;};
hidspecial HID_INSERT_IDX_MRK_PREV_SAME { HelpId =  HID_INSERT_IDX_MRK_PREV_SAME ;};
hidspecial HID_INSERT_IDX_MRK_NEXT       { HelpId =  HID_INSERT_IDX_MRK_NEXT         ;};
hidspecial HID_INSERT_IDX_MRK_NEXT_SAME { HelpId =  HID_INSERT_IDX_MRK_NEXT_SAME ;};
hidspecial HID_INSERT_IDX_MRK_TYPE       { HelpId =  HID_INSERT_IDX_MRK_TYPE         ;};
hidspecial HID_INSERT_IDX_MRK_ENTRY     { HelpId =  HID_INSERT_IDX_MRK_ENTRY        ;};
hidspecial HID_INSERT_IDX_MRK_PRIM_KEY   { HelpId =  HID_INSERT_IDX_MRK_PRIM_KEY     ;};
hidspecial HID_INSERT_IDX_MRK_SEC_KEY    { HelpId =  HID_INSERT_IDX_MRK_SEC_KEY  ;};
hidspecial HID_INSERT_IDX_MRK_LEVEL     { HelpId =  HID_INSERT_IDX_MRK_LEVEL        ;};
hidspecial HID_INSERT_IDX_MRK_MAIN_ENTRY { HelpId =  HID_INSERT_IDX_MRK_MAIN_ENTRY;};
hidspecial HID_INSERT_IDX_MRK_APPLY_ALL { HelpId =  HID_INSERT_IDX_MRK_APPLY_ALL ;};

hidspecial HID_INSERT_AUTH_MRK_ENTRY        { HelpId = HID_INSERT_AUTH_MRK_ENTRY            ;};
hidspecial HID_INSERT_AUTH_MRK_CREATE_ENTRY { HelpId = HID_INSERT_AUTH_MRK_CREATE_ENTRY ;};
hidspecial HID_INSERT_AUTH_MRK_EDIT_ENTRY   { HelpId = HID_INSERT_AUTH_MRK_EDIT_ENTRY ;};

hidspecial HID_AUTH_FIELD_IDENTIFIER        { HelpId = HID_AUTH_FIELD_IDENTIFIER     ;};
hidspecial HID_AUTH_FIELD_AUTHORITY_TYPE    { HelpId = HID_AUTH_FIELD_AUTHORITY_TYPE ;};
hidspecial HID_AUTH_FIELD_ADDRESS           { HelpId = HID_AUTH_FIELD_ADDRESS        ;};
hidspecial HID_AUTH_FIELD_ANNOTE            { HelpId = HID_AUTH_FIELD_ANNOTE         ;};
hidspecial HID_AUTH_FIELD_AUTHOR            { HelpId = HID_AUTH_FIELD_AUTHOR         ;};
hidspecial HID_AUTH_FIELD_BOOKTITLE         { HelpId = HID_AUTH_FIELD_BOOKTITLE      ;};
hidspecial HID_AUTH_FIELD_CHAPTER           { HelpId = HID_AUTH_FIELD_CHAPTER        ;};
hidspecial HID_AUTH_FIELD_EDITION           { HelpId = HID_AUTH_FIELD_EDITION        ;};
hidspecial HID_AUTH_FIELD_EDITOR            { HelpId = HID_AUTH_FIELD_EDITOR         ;};
hidspecial HID_AUTH_FIELD_HOWPUBLISHED      { HelpId = HID_AUTH_FIELD_HOWPUBLISHED   ;};
hidspecial HID_AUTH_FIELD_INSTITUTION       { HelpId = HID_AUTH_FIELD_INSTITUTION    ;};
hidspecial HID_AUTH_FIELD_JOURNAL           { HelpId = HID_AUTH_FIELD_JOURNAL        ;};
hidspecial HID_AUTH_FIELD_MONTH             { HelpId = HID_AUTH_FIELD_MONTH          ;};
hidspecial HID_AUTH_FIELD_NOTE              { HelpId = HID_AUTH_FIELD_NOTE           ;};
hidspecial HID_AUTH_FIELD_NUMBER            { HelpId = HID_AUTH_FIELD_NUMBER         ;};
hidspecial HID_AUTH_FIELD_ORGANIZATIONS     { HelpId = HID_AUTH_FIELD_ORGANIZATIONS  ;};
hidspecial HID_AUTH_FIELD_PAGES             { HelpId = HID_AUTH_FIELD_PAGES          ;};
hidspecial HID_AUTH_FIELD_PUBLISHER         { HelpId = HID_AUTH_FIELD_PUBLISHER      ;};
hidspecial HID_AUTH_FIELD_SCHOOL            { HelpId = HID_AUTH_FIELD_SCHOOL         ;};
hidspecial HID_AUTH_FIELD_SERIES            { HelpId = HID_AUTH_FIELD_SERIES         ;};
hidspecial HID_AUTH_FIELD_TITLE             { HelpId = HID_AUTH_FIELD_TITLE          ;};
hidspecial HID_AUTH_FIELD_REPORT_TYPE       { HelpId = HID_AUTH_FIELD_REPORT_TYPE    ;};
hidspecial HID_AUTH_FIELD_VOLUME            { HelpId = HID_AUTH_FIELD_VOLUME         ;};
hidspecial HID_AUTH_FIELD_YEAR              { HelpId = HID_AUTH_FIELD_YEAR           ;};
hidspecial HID_AUTH_FIELD_URL               { HelpId = HID_AUTH_FIELD_URL            ;};
hidspecial HID_AUTH_FIELD_CUSTOM1           { HelpId = HID_AUTH_FIELD_CUSTOM1        ;};
hidspecial HID_AUTH_FIELD_CUSTOM2           { HelpId = HID_AUTH_FIELD_CUSTOM2        ;};
hidspecial HID_AUTH_FIELD_CUSTOM3           { HelpId = HID_AUTH_FIELD_CUSTOM3        ;};
hidspecial HID_AUTH_FIELD_CUSTOM4           { HelpId = HID_AUTH_FIELD_CUSTOM4        ;};
hidspecial HID_AUTH_FIELD_CUSTOM5           { HelpId = HID_AUTH_FIELD_CUSTOM5        ;};
hidspecial HID_AUTH_FIELD_ISBN              { HelpId = HID_AUTH_FIELD_ISBN           ;};

hidspecial HID_AUTH_MARK_DLG_FROM_COMP_RB  { HelpId = HID_AUTH_MARK_DLG_FROM_COMP_RB ;};
hidspecial HID_AUTH_MARK_DLG_FROM_DOC_RB   { HelpId = HID_AUTH_MARK_DLG_FROM_DOC_RB  ;};
hidspecial HID_AUTH_MARK_DLG_ID_LISTBOX    { HelpId = HID_AUTH_MARK_DLG_ID_LISTBOX   ;};

hidspecial HID_INSERT_INDEX_ENTRY_LEVEL_LB { HelpId = HID_INSERT_INDEX_ENTRY_LEVEL_LB ;};
hidspecial HID_INSERT_IDX_MRK_SRCH_CASESENSITIVE { HelpId = HID_INSERT_IDX_MRK_SRCH_CASESENSITIVE ;};
hidspecial HID_INSERT_IDX_MRK_SRCH_WORDONLY      { HelpId = HID_INSERT_IDX_MRK_SRCH_WORDONLY ;};

hidspecial HID_LINGU_WORD_LANGUAGE { HelpId = HID_LINGU_WORD_LANGUAGE ;};
hidspecial HID_LINGU_PARA_LANGUAGE { HelpId = HID_LINGU_PARA_LANGUAGE ;};
hidspecial HID_BUSINESS_CARD_CONTENT { HelpId = HID_BUSINESS_CARD_CONTENT ;};

hidspecial HID_OPTCAPTION_CLB { HelpId = HID_OPTCAPTION_CLB ;};
diff --git a/sw/util/makefile.mk b/sw/util/makefile.mk
new file mode 100644
index 0000000..6cd3697
--- /dev/null
+++ b/sw/util/makefile.mk
@@ -0,0 +1,468 @@
#*************************************************************************
#
#   $RCSfile: makefile.mk,v $
#
#   $Revision: 1.1.1.1 $
#
#   last change: $Author: hr $ $Date: 2000-09-18 17:15:01 $
#
#   The Contents of this file are made available subject to the terms of
#   either of the following licenses
#
#          - GNU Lesser General Public License Version 2.1
#          - Sun Industry Standards Source License Version 1.1
#
#   Sun Microsystems Inc., October, 2000
#
#   GNU Lesser General Public License Version 2.1
#   =============================================
#   Copyright 2000 by Sun Microsystems, Inc.
#   901 San Antonio Road, Palo Alto, CA 94303, USA
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Lesser General Public
#   License version 2.1, as published by the Free Software Foundation.
#
#   This library is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   Lesser General Public License for more details.
#
#   You should have received a copy of the GNU Lesser General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
#   MA  02111-1307  USA
#
#
#   Sun Industry Standards Source License Version 1.1
#   =================================================
#   The contents of this file are subject to the Sun Industry Standards
#   Source License Version 1.1 (the "License"); You may not use this file
#   except in compliance with the License. You may obtain a copy of the
#   License at http://www.openoffice.org/license.html.
#
#   Software provided under this License is provided on an "AS IS" basis,
#   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
#   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
#   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
#   See the License for the specific provisions governing your rights and
#   obligations concerning the Software.
#
#   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
#
#   Copyright: 2000 by Sun Microsystems, Inc.
#
#   All Rights Reserved.
#
#   Contributor(s): _______________________________________
#
#
#
#*************************************************************************

PRJ=..

PRJNAME=sw
TARGET=sw
GEN_HID=TRUE
.IF "$(CPU)"=="i386"
USE_LDUMP2=TRUE
.ENDIF


# --- Settings ------------------------------------------------------------

.INCLUDE :  svpre.mk
.INCLUDE :  settings.mk
.INCLUDE :  sv.mk

#	nmake		 	-	swdll

DESK=T

.IF "$(prjpch)" != ""
CDEFS=$(CDEFS) -DPRECOMPILED
.ENDIF

.IF "$(GUI)" == "WIN"
RESLIBSPLIT1NAME=sw
.ELSE
RESLIB1NAME=sw
.ENDIF
MYRESLIBNAME=sw

#RSCLOCINC=$(RSCLOCINC);$(PRJ)$/RES

# --- Allgemein -----------------------------------------------------------
.IF "$(GUI)"=="WIN"
LIBFLAGS=/PAGE:128 /NOE /NOI
#OPTLINKS=YES
MAPSYM=tmapsym
.IF "$(debug)" != ""
LINKFLAGS= /F /PACKCODE:65520 /PACKDATA /NOD /NOE /MAP /COD /NOCV
.ELSE
LINKFLAGS= /F /PACKCODE:65520 /PACKDATA /NOD /NOE /MAP
.ENDIF
.ENDIF

.IF "$(COM)"=="ICC"
LINKFLAGS+=/SEGMENTS:1024 /PACKD:32768
.ENDIF

.IF "$(header)" == ""

sw_res_files= \
    $(SRS)$/app.srs          \
    $(SRS)$/dialog.srs       \
    $(SRS)$/chrdlg.srs       \
    $(SRS)$/config.srs       \
    $(SRS)$/dbui.srs	    \
    $(SRS)$/dochdl.srs       \
    $(SRS)$/docvw.srs        \
    $(SRS)$/envelp.srs       \
    $(SRS)$/fldui.srs        \
    $(SRS)$/fmtui.srs        \
    $(SRS)$/frmdlg.srs       \
    $(SRS)$/globdoc.srs      \
    $(SRS)$/index.srs        \
    $(SRS)$/lingu.srs        \
    $(SRS)$/misc.srs         \
    $(SRS)$/ribbar.srs       \
    $(SRS)$/shells.srs       \
    $(SRS)$/swslots.srs     \
    $(SRS)$/table.srs        \
    $(SRS)$/uiview.srs       \
    $(SRS)$/utlui.srs        \
    $(SRS)$/web.srs          \
    $(SRS)$/wizard.srs       \
    $(SRS)$/wrtsh.srs        \
    $(SOLARRESDIR)$/sfx.srs

.IF "$(GUI)" == "WIN"
RESLIBSPLIT1SRSFILES= \
    $(sw_res_files)
.ELSE
RESLIB1SRSFILES= \
    $(sw_res_files)
.ENDIF

LIB1TARGET=$(LB)$/swlib.lib
LIB1ARCHIV=$(LB)$/libswlib.a
LIB1OBJFILES= \
        $(OUT)$/obj$/swlib.obj \
        $(OUT)$/obj$/swcomlib.obj \
        $(OUT)$/obj$/w4wflt.obj

.IF "$(OS)"=="SOLARIS"
.IF "$(CPU)"=="S"
LIB1OBJFILES += $(OUT)$/obj$/autorec.obj
.ENDIF
.ENDIF



SHL2TARGET= $(TARGET)$(UPD)$(DLLPOSTFIX)
SHL2VERSIONMAP= $(TARGET).map
SHL2IMPLIB= _$(TARGET)
SHL2LIBS= \
    $(SLB)$/core1.lib\
    $(SLB)$/core2.lib\
    $(SLB)$/filter.lib\
    $(SLB)$/ui1.lib\
    $(SLB)$/ui2.lib


SHL2STDLIBS= \
    $(SALLIB) \
    $(SFXLIB) \
    $(OFALIB) \
    $(SFXDEBUGLIB) \
    $(BASICLIB) \
    $(SVXLIB) \
    $(GOODIESLIB) \
    $(CHANNELLIB) \
    $(INETLIBSH) \
    $(SVMEMLIB) \
    $(SO2LIB) \
    $(SVTOOLLIB) \
    $(SVLLIB)	\
    $(SVLIB) \
    $(SOTLIB) \
    $(TOOLSLIB) \
    $(UNOLIB) \
    $(ONELIB) \
    $(CPPULIB) \
    $(CPPUHELPERLIB) \
    $(UNOTOOLSLIB) \
    $(VOSLIB) \
    $(TKLIB) \
    $(SDLIB) \
    $(SCLIB) \
    $(UCBHELPERLIB) \
    $(XMLOFFLIB) \
    $(BASCTLLIB)


.IF "$(GUI)" ==	"UNX"
SHL2STDLIBS += \
    $(SIMLIB) \
    $(SCHLIB) \
    $(SMLIB)
.ENDIF

.IF "$(SOLAR_JAVA)" != ""
SHL2STDLIBS+= \
        $(SJLIB)
.ENDIF

.IF "$(GUI)"=="WNT"
SHL2STDLIBS+= \
            advapi32.lib
.ELSE
#SHL2STDLIBS+= \
#			$(MAILLIB)
.ENDIF

#			uno.lib usr.lib sj.lib aofa.lib
#			ysch.lib  ysim.lib ysm.lib basic.lib ich.lib

SHL2DEPN=   \
    $(SLB)$/core1.lib\
    $(SLB)$/core2.lib\
    $(SLB)$/filter.lib\
    $(SLB)$/ui1.lib\
    $(SLB)$/ui2.lib


SHL2OBJS= \
    $(OUT)$/slo$/swmodule.obj \
    $(OUT)$/slo$/swdll.obj
#	$(SLO)$/.obj		  ^ \ nicht vergessen!


SHL2DEF=    $(MISC)$/$(SHL2TARGET).def
SHL2BASE=	0x1e000000


# rem ===== hier wird die Mega Dll gebaut ==========================
.IF "$(make_xl)" != ""

.IF "$(GUI)"=="WNT"
LINKFLAGS=$(LINKFLAGS) /FORCE:MULTIPLE /ENTRY:DLLEntryPoint@12
.ENDIF

.IF "$(GUI)"=="OS2"
LIBFLAGS=$(LIBFLAGS) /P4096
.ENDIF

LIB5TARGET= $(SLB)$/xl.lib
LIB5FILES=	$(SLB)$/$(TARGET).lib		\
            $(SOLARLIBDIR)$/xtools.lib	\
            $(SOLARLIBDIR)$/xsv.lib		\
            $(SOLARLIBDIR)$/xsvtool.lib	\
            $(SOLARLIBDIR)$/xsb.lib		\
            $(SOLARLIBDIR)$/xso2.lib		\
            $(SOLARLIBDIR)$/xgo.lib		\
            $(SOLARLIBDIR)$/xsj.lib		\
            $(SOLARLIBDIR)$/xsfx.lib		\
            $(SOLARLIBDIR)$/xdg.lib		\
            $(SOLARLIBDIR)$/xsvx.lib

LIB6TARGET=	$(LB)$/xapp.lib
LIB6FILES=	$(SOLARLIBDIR)$/xsfxapp.obj	\
            $(SOLARLIBDIR)$/xsvapp.obj	\
            $(SOLARLIBDIR)$/xsvmain.obj	\
            $(SOLARLIBDIR)$/xword2.obj	\
            $(SOLARLIBDIR)$/xplugapp.obj	\
            $(OBJ)$/appctor.obj

SHL3TARGET= xl$(UPD)$(DLLPOSTFIX)
SHL3IMPLIB= _xl
SHL3LIBS=   $(SLB)$/xl.lib

.IF "$(GUI)"=="WNT"
SHL3STDLIBS=svmem.lib\
            comdlg32.lib advapi32.lib shell32.lib gdi32.lib \
            ole32.lib uuid.lib oleaut32.lib comctl32.lib winspool.lib
.ELSE
SHL3STDLIBS=svmem.lib\
            $(L)$/mail.lib
.ENDIF

SHL3STDLIBS+= \
            go.lib \
            docmgr.lib sj.lib thread.lib inetdll.lib ipc.lib

SHL3DEPN=   \
    $(SLB)$/core1.lib\
    $(SLB)$/core2.lib\
    $(SLB)$/filter.lib\
    $(SLB)$/ui1.lib\
    $(SLB)$/ui2.lib

.IF "$(GUI)"!="WNT"
SHL3DEPN+=   \
    $(L)$/mail.lib
.ENDIF

SHL3OBJS=\
            $(SOLARLIBDIR)$/xsvdll.obj $(SLO)$/app.obj

SHL3RES=    $(SOLARRESDIR)$/svsrc.res
SHL3DEF=    $(MISC)$/$(SHL3TARGET).def
SHL3BASE=	0x1c000000

DEF3NAME=   $(SHL3TARGET)
DEF3DEPN=   $(MISC)$/$(SHL3TARGET).flt
DEFLIB3NAME =xl
DEF3DES     =offmgr app-interface

.ENDIF
# rem ===== hier wird die Mega Dll gebaut  (ENDE) ===================

.IF "$(GUI)"=="WNT"
do_build+= \
    $(MISC)$/linkinc.ls
.ENDIF

do_build+= \
    $(SHL2TARGETN)

.IF "$(depend)"==""
ALL:\
    $(do_build) \
    $(SRS)$/hidother.hid\
    $(INC)$/sw.lst	\
    ALLTAR
.ENDIF
.ENDIF

.INCLUDE :  target.mk

$(MISCX)$/$(SHL2TARGET).flt:
    @echo ------------------------------
    @echo Making: $@
    @echo WEP>$@
    @echo LIBMAIN>>$@
    @echo LibMain>>$@


# ------------------------------------------------------------------
# Windows
# ------------------------------------------------------------------




# ------------------------------------------------------------------
# OS/2
# ------------------------------------------------------------------


.IF "$(GUI)" == "OS2"

$(MISC)$/$(SHL2TARGET).def:  makefile.mk
    @echo ================================================================
    @echo building $@
    @echo ----------------------------------------------------------------
.IF "$(COM)"!="WTC"
    echo  LIBRARY		INITINSTANCE TERMINSTANCE			>$@
    echo  DESCRIPTION   'SwDLL'                            >>$@
    echo  PROTMODE										   >>$@
        @echo CODE        LOADONCALL 			              >>$@
    @echo DATA		  PRELOAD MULTIPLE NONSHARED					  >>$@
        @echo EXPORTS                                              >>$@
.IF "$(COM)"!="ICC"
    @echo _CreateSdDrawDocShellDll @2                              >>$@
    @echo _CreateSdGraphicDocShellDll @3                           >>$@
    @echo _CreateObjSdDrawDocShellDll @4                           >>$@
    @echo _CreateObjSdGraphicDocShellDll @5                        >>$@
    @echo _InitSdDll @6                                            >>$@
    @echo _DeInitSdDll @7                                          >>$@
.ELSE
    @echo   CreateSwDocShellDll @2 	                           >>$@
    @echo   CreateSwWebDocShellDll @3                            >>$@
    @echo   CreateSwGlobalDocShellDll @4                            >>$@
    @echo   CreateObjSwDocShellDll @5                         >>$@
    @echo   CreateObjSwWebDocShellDll @6                         >>$@
    @echo   CreateObjSwGlobalDocShellDll @7                         >>$@
    @echo   InitSwDll @8                                          >>$@
    @echo   DeInitSwDll @9                                        >>$@
.ENDIF
.ELSE
        @echo option DESCRIPTION 'SwDLL'                            >$@
        @echo name $(BIN)$/$(SHL2TARGET).dll                         >>$@
    @echo CreateSwDocShellDll_ @2      >>temp.def
    @echo CreateSwGlobalDocShellDll_ @2      >>temp.def
    @echo CreateSwWebDocShellDll_ @3   >>temp.def
    @echo CreateObjSwDocShellDll_ @4   >>temp.def
    @echo CreateObjSwGlobalDocShellDll_ @4   >>temp.def
    @echo CreateObjSwWebDocShellDll_ @5   >>temp.def
    @echo InitSwDll_ @6                    >>temp.def
    @echo DeInitSwDll_ @7                  >>temp.def
    @gawk -f s:\util\exp.awk temp.def				>>$@
    del temp.def
.ENDIF
.ENDIF

# ------------------------------------------------------------------
# Windows NT
# ------------------------------------------------------------------

.IF "$(GUI)" == "WNT"

$(MISC)$/$(SHL2TARGET).def:  makefile.mk
    @echo ------------------------------
    @echo Making: $@
    @echo LIBRARY     $(SHL2TARGET)                                  >$@
    @echo DESCRIPTION 'SWriter4 DLL'                                 >>$@
    @echo DATA        READ WRITE NONSHARED                          >>$@
    @echo EXPORTS                                                   >>$@
    @echo   CreateSwDocShellDll @20                            >>$@
    @echo   CreateSwWebDocShellDll @30                            >>$@
    @echo   CreateSwGlobalDocShellDll @40                            >>$@
    @echo   CreateObjSwDocShellDll @21                         >>$@
    @echo   CreateObjSwWebDocShellDll @22                         >>$@
    @echo   CreateObjSwGlobalDocShellDll @23                         >>$@
    @echo   InitSwDll @24                                          >>$@
    @echo   DeInitSwDll @25                                        >>$@

.ENDIF

.IF "$(GUI)" == "MAC"

$(MISC)$/$(SHL2TARGET).def:  makefile.mk
    @echo ------------------------------
    @echo Making: $@
    @echo   CreateSwDocShellDll                             > $@
    @echo   CreateSwWebDocShellDll                            >> $@
    @echo   CreateSwGlobalDocShellDll                             >> $@
    @echo   CreateObjSwDocShellDll                          >> $@
    @echo   CreateObjSwWebDocShellDll                          >> $@
    @echo   CreateObjSwGlobalDocShellDll                        >> $@
    @echo   InitSwDll                                         >> $@
    @echo   DeInitSwDll                                       >> $@


.ENDIF

$(SRS)$/hidother.hid: hidother.src
.IF "$(GUI)" =="WNT"
    @+echo
    @+echo 	NO HIDS!
    @+echo
    +copy ..\inc\helpid.h .
    +mhids hidother.src ..$/$(INPATH)$/srs sw hidother
    +del helpid.h
.ELSE
    @echo wnt only
.ENDIF

$(INC)$/sw.lst:
.IF "$(GUI)" =="WNT"
    +-@echo clook missed!!!!
#clook -o $@ -p 1 -i ..\inc;..\source\ui\inc;..\source\core\inc;..\source\filter\inc;. dummy.cxx
.ELSE
    @echo wnt only
.ENDIF

diff --git a/sw/util/sw.map b/sw/util/sw.map
new file mode 100644
index 0000000..9171c3b
--- /dev/null
+++ b/sw/util/sw.map
@@ -0,0 +1,13 @@
SW_1_0 {
    global:
        CreateSwDocShellDll;
        CreateSwWebDocShellDll;
        CreateSwGlobalDocShellDll;
        CreateObjSwDocShellDll;
        CreateObjSwWebDocShellDll;
        CreateObjSwGlobalDocShellDll;
        InitSwDll;
        DeInitSwDll;
    local:
        *;
};